Projects
Extra
gtk-gnutella
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 4
View file
gtk-gnutella.changes
Changed
@@ -1,4 +1,14 @@ ------------------------------------------------------------------- +Sun May 8 15:15:13 UTC 2016 - aloisio@gmx.com + +- Update to 1.1.9 + * Changelog at + https://github.com/gtk-gnutella/gtk-gnutella/blob/v1.1.9/ChangeLog +- Replaced gtk-gnutella-remove_DATE_from_entropy.patch with + a sed line +- Spec cleanup + +------------------------------------------------------------------- Sat May 5 21:29:10 UTC 2012 - seife+obs@b1-systems.com - update to 0.98.2, see ChangeLog for details
View file
gtk-gnutella.spec
Changed
@@ -1,25 +1,42 @@ -# vim: set sw=4 ts=4 et nu: +# +# spec file for package gtk-gnutella +# +# Copyright (c) 2016 Packman Team <packman@links2linux.de> +# +# All modifications and additions to the file contributed by third parties +# remain the property of their copyright owners, unless otherwise agreed +# upon. The license for this file, and modifications and additions to the +# file, is the same license as for the pristine package itself (unless the +# license for the pristine package is not an Open Source License, in which +# case the license is the MIT License). An "Open Source License" is a +# license that conforms to the Open Source Definition (Version 1.9) +# published by the Open Source Initiative. -Name: gtk-gnutella -Version: 0.98.2 -Release: 0.pm.1 -Summary: Gnutella Peer to Peer Client -Source: http://prdownloads.sourceforge.net/gtk-gnutella/gtk-gnutella-%{version}.tar.bz2 -Patch1: gtk-gnutella-remove_DATE_from_entropy.patch -URL: http://gtk-gnutella.sourceforge.net/ -Group: Productivity/Networking/Other -License: GNU General Public License version 2 or later (GPL v2 or later) -BuildRoot: %{_tmppath}/build-%{name}-%{version} -BuildRequires: gtk2-devel -BuildRequires: zlib-devel -BuildRequires: libgnutls-devel -BuildRequires: dbus-1-devel -BuildRequires: dbus-1-glib-devel -BuildRequires: gcc make glibc-devel pkgconfig -BuildRequires: update-desktop-files -%if 0%{?suse_version} >= 1030 -BuildRequires: fdupes -%endif +# Please submit bugfixes or comments via http://bugs.links2linux.org/ +# + + +Name: gtk-gnutella +Version: 1.1.9 +Release: 0.pm.1 +Summary: Gnutella Peer to Peer Client +License: GPL-2.0+ (GPL-2.0+) +Group: Productivity/Networking/Other +Url: http://gtk-gnutella.sourceforge.net/ +Source: http://prdownloads.sourceforge.net/gtk-gnutella/gtk-gnutella-%{version}.tar.bz2 +Source1: %{name}.changes +BuildRequires: dbus-1-devel +BuildRequires: dbus-1-glib-devel +BuildRequires: gcc +BuildRequires: glibc-devel +BuildRequires: gtk2-devel +BuildRequires: libgnutls-devel >= 3.2.4 +BuildRequires: make +BuildRequires: pkgconfig +BuildRequires: update-desktop-files +BuildRequires: zlib-devel +BuildRoot: %{_tmppath}/%{name}-%{version}-build +BuildRequires: fdupes %description Gtk-Gnutella is a full-featured Gnutella client using GTK+. It contains all @@ -30,7 +47,12 @@ %prep %setup -q -%patch1 +# fix builddate info +# Remove build time references so build-compare can do its work +FAKE_BUILDTIME=$(LC_ALL=C date -u -r %{SOURCE1} '+%%H:%%M') +FAKE_BUILDDATE=$(LC_ALL=C date -u -r %{SOURCE1} '+%%b %%e %%Y') +sed -e "s/__TIME__/\"$FAKE_BUILDTIME\"/" -i src/lib/entropy.c +sed -e "s/__DATE__/\"$FAKE_BUILDDATE\"/" -i src/lib/entropy.c %build ./build.sh \ @@ -41,35 +63,34 @@ --libdir="%{_libdir}" \ --localedir="%{_datadir}/locale" \ --mandir="%{_mandir}" \ - --cc="%__cc" \ + --cc="gcc" \ --cflags="%{optflags}" \ --cppflags="%{optflags}" \ - --make="%__make" \ + --make="make" \ --configure-only \ --verbose -%__make %{?_smp_flags} +make %{?_smp_mflags} %install -%__make INSTALL_PREFIX="%{buildroot}" install -%__rm "%{buildroot}%{_libdir}"/*.nm +make INSTALL_PREFIX=%{buildroot} install +rm "%{buildroot}%{_libdir}"/*.nm -%if 0%{?suse_version} >= 1030 %fdupes -s "%{buildroot}%{_datadir}/%{name}/" -%endif %suse_update_desktop_file -r "%{name}" Network FileTransfer %find_lang "%{name}" -%clean -%{?buildroot:%__rm -rf "%{buildroot}"} - %files -f "%{name}.lang" %defattr(-,root,root) %doc AUTHORS ChangeLog GEO_LICENSE LICENSE README TODO +%dir %{_datadir}/appdata %{_bindir}/gtk-gnutella %{_datadir}/%{name} %{_datadir}/applications/%{name}.desktop +%{_datadir}/appdata/%{name}.appdata.xml %{_datadir}/pixmaps/%{name}.* +%changelog +
View file
gtk-gnutella-remove_DATE_from_entropy.patch
Deleted
@@ -1,11 +0,0 @@ ---- src/lib/entropy.c.orig 2011-09-25 00:35:10.568000277 +0200 -+++ src/lib/entropy.c 2011-09-25 00:35:15.468000277 +0200 -@@ -211,8 +211,6 @@ - sha1_feed_ulong(&ctx, getpid()); - sha1_feed_ulong(&ctx, getdtablesize()); - -- sha1_feed_string(&ctx, __DATE__); -- sha1_feed_string(&ctx, __TIME__); - sha1_feed_string(&ctx, - "$Id$"); -
View file
gtk-gnutella-0.98.2.tar.bz2/pixmaps/icon.32x32.xpm
Deleted
@@ -1,71 +0,0 @@ -/* XPM */ -static char *icon = { -/* width height ncolors chars_per_pixel */ -"32 32 32 1", -/* colors */ -" c #7979B2", -". c #070D81", -"X c #5356A7", -"o c #050A61", -"O c #5E5E8A", -"+ c #393B80", -"@ c #383B7F", -"# c #6C6C9E", -"$ c #1E2058", -"% c #050850", -"& c #6C6DAE", -"* c #2E329C", -"= c #525287", -"- c #080F91", -"; c #060C71", -": c #212698", -"> c #5E5E8B", -", c #434363", -"< c #1D2058", -"1 c #515177", -"2 c #131775", -"3 c #202588", -"4 c #1E2268", -"5 c #525387", -"6 c #525497", -"7 c #383970", -"8 c #37396F", -"9 c #6062AB", -"0 c #474AA3", -"q c #212798", -"w c #2A2C5B", -"e c None", -/* pixels */ -"eeeeeeeeeeeeeeee%-* eeeeeeeeeeee", -"eeeeeeeeeeooo.----* #11eeeeeee", -"eeeeee-------:**--* eeee", -"oo;-----XXX$e= ,--* eeee #1", -"-:3711+-eeeee1ee--* eeeeee wXX9 ", -"-<eeeee-eeee1eee--* --oo-- *--* ", -"-eeeeee-eeeeee --* o..oee eeee ", -"-eeeeee-eeeeee, --* eooeee eeee ", -"-eeeeee-eeeeeee --* eooeee eeee ", -"-eeeeee-eeeeeee --* eooeee eeee ", -"-eeeeee-eeeeeee --* eooeee eeee ", -"-eeeeee-eeeeeee --* eooeee eeee ", -"-<eeeee-eeeeeee --* eooeee eeew ", -"-:oooo;-11eeee> --* o..o11 >119 ", -"-;;---------qXXX--* 99 ", -"-eeeee%-----------* ,eew ", -"-eeeeee-eeee1422--* 168eee eeee ", -"-eeeeee-eeeeeee>--* eooeee eeee ", -"-eeeeee-eeeeeee --* eooeee eeee ", -"-eeeeee-eeeeeee --* eooeee eeee ", -"-eeeeee-eeeeee, --* eooeee eeee ", -"-eeeeee-eeee11ee--* o.oeee eeee ", -"-%eeee%-ee>,eeee--* .oo.-- wee, ", -"--oo1e%-eeeee1ee--* eeeeee *qX ", -"eo;--%%-eeeeeee1--* eeeeee 0 #1", -"eeee----eee1,eee--* ooeeee ,ee", -"eeeeee;---@eeeee--* eeeX #1eeee", -"eeeeeeee%---o7ee--* ee5& eeeeee", -"eeeeeeeeeeo.------* 0 >eeeeeeee", -"eeeeeeeeeeee%-----* Oeeeeeeeee", -"eeeeeeeeeeeeeeeo--* 1eeeeeeeeeee", -"eeeeeeeeeeeeeeeeee*,eeeeeeeeeeee" -};
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/bitzi.c
Deleted
@@ -1,1410 +0,0 @@ -/* - * Copyright (c) 2004, Alex Bennee <alex@bennee.com> - * Copyright (c) 2011, Raphael Manfredi - * - *---------------------------------------------------------------------- - * This file is part of gtk-gnutella. - * - * gtk-gnutella 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 2 of the License, or - * (at your option) any later version. - * - * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software - * Foundation, Inc.: - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - *---------------------------------------------------------------------- - */ - -/** - * @ingroup core - * @file - * - * Bitzi Core search code. - * - * This code makes searches to the Bitzi (bitzi.com) meta-data - * service. It is independent from any GUI functions and part of the - * core of GTKG. - * - * @author Alex Bennee <alex@bennee.com> - * @date 2004 - * - * Removed dependency on libxml2 and switched to a DBMW-based cache with - * an SDBM back-end to avoid keeping all the known tickets into memory. - * - * @author Raphael Manfredi - * @date 2011 - */ - -#include "common.h" - -#include "bitzi.h" /* bitzi metadata */ -#include "gnet_stats.h" -#include "http.h" /* http async stuff */ -#include "settings.h" /* settings_config_dir() */ - -#include "xml/vxml.h" -#include "xml/xnode.h" -#include "xml/xfmt.h" - -#include "if/bridge/c2ui.h" -#include "if/gnet_property_priv.h" - -#include "lib/ascii.h" -#include "lib/atoms.h" -#include "lib/cq.h" -#include "lib/dbmw.h" -#include "lib/dbstore.h" -#include "lib/getdate.h" /* date2time() */ -#include "lib/glib-missing.h" -#include "lib/halloc.h" -#include "lib/header.h" -#include "lib/parse.h" -#include "lib/path.h" -#include "lib/slist.h" -#include "lib/str.h" -#include "lib/stringify.h" -#include "lib/strtok.h" -#include "lib/timestamp.h" -#include "lib/tm.h" -#include "lib/urn.h" -#include "lib/walloc.h" -#include "lib/override.h" /* This file MUST be the last one included */ - -#define BITZI_XML_MAXLEN 16384 -#define BITZI_DB_CACHE_SIZE 32 -#define BITZI_SYNC_PERIOD (60 * 1000) /**< ms: 1 minute */ -#define BITZI_PRUNE_PERIOD (24 * 3600 * 1000) /**< ms: 1 day */ -#define BITZI_HEARTBEAT_PERIOD (5 * 1000) /**< ms: 5 secs */ -#define BITZI_UNKNOWN_TIMEOUT (60 * 60) /**< s: 1 hour */ - -static const char bitzi_url_fmt = - "http://ticket.bitzi.com/rdf/urn:sha1:%s?ref=gtk-gnutella"; - -static const char BITZI_RDF = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; -static const char BITZI_BZ = "http://bitzi.com/xmlns/2002/01/bz-core#"; -static const char BITZI_DC = "http://purl.org/dc/elements/1.1/"; -static const char BITZI_MM = "http://musicbrainz.org/mm/mm-2.0#"; - -/** - * For XML tree formating, indicate prefixes to use for namespaces we parse. - */ -const struct xfmt_prefix bitzi_prefixes = { - { BITZI_RDF, "rdf" }, - { BITZI_BZ, "bz" }, - { BITZI_DC, "dc" }, - { BITZI_MM, "mm" }, -}; - -/** - * @struct bitzi_request_t - * - * The bitzi_request_t structure ties together each Bitzi request - * which are stored in the request queue. - * - */ -typedef struct { - const struct sha1 *sha1; /**< binary SHA-1, atom */ - filesize_t filesize; - char bitzi_urlSHA1_BASE32_SIZE + sizeof bitzi_url_fmt; /**< request URL */ - http_async_t *ha; -} bitzi_request_t; - -/** - * The request queue, the searches to the Bitzi data service are queued - */ -static slist_t *bitzi_rq; - -static bitzi_request_t *current_bitzi_request; -static cperiodic_t *bitzi_heartbeat_ev; -static cperiodic_t *bitzi_sync_ev; -static cperiodic_t *bitzi_prune_ev; - -/** - * DBM wrapper to associate a SHA1 with its Bitzi ticket. - */ -static dbmw_t *db_bzdata; -static char db_bzdata_base = "bitzi_tickets"; -static char db_bzdata_what = "Bitzi tickets"; - -/** - * Ticket information stored in the database. - * The structure is serialized first, not written as-is - */ -struct bzdata { - const char *mime_type; /**< MIME type (atom) */ - const char *mime_desc; /**< MIME details (atom) */ - char *ticket; /**< Raw XML ticket text */ - filesize_t size; /**< File size */ - bitzi_fj_t judgment; - float goodness; - time_t duration; /**< Duration (audio/video), in seconds */ - time_t ctime; /**< Creation time (local insertion) */ - time_t etime; /**< Expiration date, from ticket */ -}; - -#define BITZI_BZ_VERSION 1 /**< Serialization version number */ - -/** - * Serialization flags. - */ -#define BITZI_HAS_MIME_TYPE (1 << 0) -#define BITZI_HAS_MIME_DESC (1 << 1) -#define BITZI_HAS_TICKET (1 << 2) -#define BITZI_HAS_DURATION (1 << 3) - -/* - * Function declarations - */ - -/* cache functions */ -static gboolean bitzi_cache_add(bitzi_data_t * data, const xnode_t *root); - -/******************************************************************** - ** Bitzi serialization & deserialization routines for DBMW - ********************************************************************/ - -/** - * Serialization routine for bzdata. - */ -static void -serialize_bzdata(pmsg_t *mb, const void *data) -{ - const struct bzdata *bz = data; - guint8 flags; - - pmsg_write_u8(mb, BITZI_BZ_VERSION); - - flags = 0; - if (bz->mime_type != NULL) - flags |= BITZI_HAS_MIME_TYPE; - if (bz->mime_desc != NULL) - flags |= BITZI_HAS_MIME_DESC; - if (bz->ticket != NULL) - flags |= BITZI_HAS_TICKET; - if (bz->duration != 0) - flags |= BITZI_HAS_DURATION; - pmsg_write_u8(mb, flags); - - if (bz->mime_type != NULL) - pmsg_write_string(mb, bz->mime_type, (size_t) -1); - if (bz->mime_desc != NULL) - pmsg_write_string(mb, bz->mime_desc, (size_t) -1); - if (bz->ticket != NULL) - pmsg_write_string(mb, bz->ticket, (size_t) -1); - - pmsg_write_be64(mb, bz->size); - pmsg_write_be32(mb, bz->judgment); - pmsg_write_float_be(mb, bz->goodness); - pmsg_write_time(mb, bz->ctime); - pmsg_write_time(mb, bz->etime); - - /* Introduced at version 1 */ - if (bz->duration != 0) { - pmsg_write_time(mb, bz->duration); - } -} - -/** - * Deserialization routing for bzdata. - */ -static void -deserialize_bzdata(bstr_t *bs, void *valptr, size_t len) -{ - struct bzdata *bz = valptr; - guint8 version; - guint8 flags; - guint64 val; - - g_assert(sizeof *bz == len); - - bstr_read_u8(bs, &version); - bstr_read_u8(bs, &flags); - - if (flags & BITZI_HAS_MIME_TYPE) { - char *string; - if (bstr_read_string(bs, NULL, &string)) { - bz->mime_type = atom_str_get(string); - hfree(string); - } - } else { - bz->mime_type = NULL; - } - - if (flags & BITZI_HAS_MIME_DESC) { - char *string; - if (bstr_read_string(bs, NULL, &string)) { - bz->mime_desc = atom_str_get(string); - hfree(string); - } - } else { - bz->mime_desc = NULL; - } - - if (flags & BITZI_HAS_TICKET) { - bstr_read_string(bs, NULL, &bz->ticket); - } else { - bz->ticket = NULL; - } - - bz->size = bstr_read_be64(bs, &val) ? val : 0; - bstr_read_be32(bs, &bz->judgment); - bstr_read_float_be(bs, &bz->goodness); - bstr_read_time(bs, &bz->ctime); - bstr_read_time(bs, &bz->etime); - - /* - * Duration was introduced at version 1. - */ - - if (version < 1) { - /* - * Although we can parse the XML ticket to extract the missing duration, - * there's no way currently (2011-06-02) to flag the deserialized - * value as dirty, so that we would not lose the result. - * That means we would have to reparse the XML ticket each time we - * access the value from the database without being able to "upgrade" - * the sotred value. - * - * TODO: This ability to "upgrade" stored data could be useful to add, - * but it's tricky as it means changing the contract of all the - * deserialization routines to flag the value as dirty for the DBMW - * layer. --RAM, 2011-06-02 - */ - - bz->duration = 0; /* Sorry */ - } else { - if (flags & BITZI_HAS_DURATION) { - bstr_read_time(bs, &bz->duration); - } else { - bz->duration = 0; - } - } -} - -/** - * Free routine for bzdata, to release internally allocated memory at - * deserialization time (not the structure itself). - */ -static void -free_bzdata(void *valptr, size_t len) -{ - struct bzdata *bz = valptr; - - g_assert(sizeof *bz == len); - - atom_str_free_null(&bz->mime_type); - atom_str_free_null(&bz->mime_desc); - HFREE_NULL(bz->ticket); -} - -/******************************************************************** - ** Bitzi Create and Destroy data structures - ********************************************************************/ - -static bitzi_data_t * -bitzi_create(void) -{ - bitzi_data_t *data; - - /* - * defaults - */ - - WALLOC0(data); - data->judgment = BITZI_FJ_UNKNOWN; - data->expiry = (time_t) -1; - - return data; -} - -static void -bitzi_destroy(bitzi_data_t *data) -{ - g_assert(data != NULL); - - if (GNET_PROPERTY(bitzi_debug)) { - g_debug("BITZI %s: ticket for %s", - G_STRFUNC, sha1_to_string(data->sha1)); - } - - /* - * NOTE: data->ticket is NOT freed because it is pointing to the cached - * value we insert in the database, to avoid duplicating the string since - * the call to notify the GUI is synchronous. - */ - - atom_sha1_free_null(&data->sha1); - atom_str_free_null(&data->mime_type); - atom_str_free_null(&data->mime_desc); - WFREE(data); -} - -static bitzi_request_t * -bitzi_request_create(const sha1_t *sha1, filesize_t filesize) -{ - bitzi_request_t *breq; - - WALLOC0(breq); - - /* - * build the bitzi URL - */ - - breq->sha1 = atom_sha1_get(sha1); - breq->filesize = filesize; - gm_snprintf(breq->bitzi_url, sizeof breq->bitzi_url, - bitzi_url_fmt, sha1_base32(sha1)); - - return breq; -} - -static void -bitzi_request_free(bitzi_request_t *req) -{ - atom_sha1_free_null(&req->sha1); - http_async_cancel_null(&req->ha); - WFREE(req); -} - -static void -bitzi_request_free_null(bitzi_request_t **ptr) -{ - if (*ptr) { - bitzi_request_t *req = *ptr; - bitzi_request_free(req); - *ptr = NULL; - } -} - -/********************************************************************* - ** Bitzi Query and Result Parsing - ********************************************************************/ - -/* - * These XML parsing routines are hacked up versions of these from the - * libxml2 examples. - */ - -/** - * Parse (and eventually fill in) the bitzi specific data. - * - * The fields are defined at: - * schema: http://bitzi.com/developer/bitzi-ticket.rng - * notes: http://bitzi.com/openbits/datadump - * - * The ones we have most interest in are: - * - * bz:fileGoodness="2.1" - * bz:fileJudgement="Complete" - * - * Although the other could be used to verify size data and such. - */ - -struct efj_t { - const char *string; - bitzi_fj_t judgment; -}; - -static const struct efj_t enum_fj_table = { - { "Unknown", BITZI_FJ_UNKNOWN }, - { "Unrated", BITZI_FJ_UNRATED }, - { "Bitzi lookup failure", BITZI_FJ_FAILURE }, - { "Filesize mismatch", BITZI_FJ_WRONG_FILESIZE }, - { "Dangerous/Misleading", BITZI_FJ_DANGEROUS_MISLEADING }, - { "Incomplete/Damaged", BITZI_FJ_INCOMPLETE_DAMAGED }, - { "Substandard", BITZI_FJ_SUBSTANDARD }, - { "Overrated", BITZI_FJ_OVERRATED }, - { "Normal", BITZI_FJ_NORMAL }, - { "Underrated", BITZI_FJ_UNDERRATED }, - { "Complete", BITZI_FJ_COMPLETE }, - { "Recommended", BITZI_FJ_RECOMMENDED }, - { "Best Version", BITZI_FJ_BEST_VERSION } -}; - -static const char * -bitzi_judgment_to_string(bitzi_fj_t fj) -{ - if (UNSIGNED(fj) < G_N_ELEMENTS(enum_fj_table)) - return enum_fj_tablefj.string; - else - return str_smsg("Invalid Judgment %d", fj); -} - -/** - * xnode_prop_foreach() callback to log the attributes of the node. - */ -static void -bitzi_description_attr_log(const char *uri, - const char *local, const char *value, void *unused_data) -{ - (void) unused_data; - - if (uri != NULL) { - g_debug("BITZI %s = \"%s\" %s", local, value, uri); - } else { - g_debug("BITZI %s = \"%s\"", local, value); - } -} - -/** - * Read all the attributes we may want from the rdf ticket, some - * attributes will not be there in which case xmlGetProp will return a null. - */ -static void -bitzi_process_rdf_description(const xnode_t *xn, bitzi_data_t *data) -{ - const char *value; - - /* - * We extract the urn:sha1 from the ticket as we may be processing - * cached tickets not associated with any actual request. The - * bitprint itself will be at offset 9 into the string. - */ - value = xnode_prop_ns_get(xn, BITZI_RDF, "about"); - if (value) { - sha1_t sha1; - - if (urn_get_sha1(value, &sha1)) { - data->sha1 = atom_sha1_get(&sha1); - } else { - g_warning("%s: bad 'rdf:about' string: \"%s\"", G_STRFUNC, value); - } - } else { - if (GNET_PROPERTY(bitzi_debug)) { - g_warning("%s: No SHA-1!", G_STRFUNC); - } - } - - /* - * All tickets have a bz:ticketExpires tag which we need for cache - * managment. - */ - value = xnode_prop_ns_get(xn, BITZI_BZ, "ticketExpires"); - if (value) { - data->expiry = date2time(value, tm_time()); - if ((time_t) -1 == data->expiry) { - if (GNET_PROPERTY(bitzi_debug)) { - g_warning("%s: Bad expiration date \"%s\"", G_STRFUNC, value); - } - } - } else { - g_warning("%s: No ticketExpires!", G_STRFUNC); - } - - /* - * fileGoodness amd fileJudgement are the two most immediatly - * useful values. - */ - value = xnode_prop_ns_get(xn, BITZI_BZ, "fileGoodness"); - if (value) { - data->goodness = g_strtod(value, NULL); - if (GNET_PROPERTY(bitzi_debug)) { - g_debug("BITZI %s: fileGoodness is %s/%g", - G_STRFUNC, value, data->goodness); - } - } else { - data->goodness = 0.0; - } - - value = xnode_prop_ns_get(xn, BITZI_BZ, "fileJudgement"); - if (value) { - size_t i; - - STATIC_ASSERT(NUM_BITZI_FJ == G_N_ELEMENTS(enum_fj_table)); - - for (i = 0; i < G_N_ELEMENTS(enum_fj_table); i++) { - if (0 == strcmp(value, enum_fj_tablei.string)) { - data->judgment = enum_fj_tablei.judgment; - break; - } - } - } else { - data->judgment = BITZI_FJ_UNRATED; - } - - /* - * fileLength, useful for comparing to result - */ - - value = xnode_prop_ns_get(xn, BITZI_BZ, "fileLength"); - if (value) { - int error; - data->size = parse_uint64(value, NULL, 10, &error); - if (error) { - if (GNET_PROPERTY(bitzi_debug)) { - g_warning("%s: fileLength '%s' is invalid: %s", - G_STRFUNC, value, g_strerror(error)); - } - } - } - - /* - * The multimedia type, bitrate etc is all built into one - * descriptive string. It is dependant on format - * - * Currently we handle video and audio - */ - - value = xnode_prop_ns_get(xn, BITZI_DC, "format"); - if (value) { - /* - * copy the mime type - */ - atom_str_change(&data->mime_type, value); - - if (is_strcaseprefix(value, "video/")) { - const char *bitrate = - xnode_prop_ns_get(xn, BITZI_BZ, "videoBitrate"); - const char *fps = xnode_prop_ns_get(xn, BITZI_BZ, "videoFPS"); - const char *height = xnode_prop_ns_get(xn, BITZI_BZ, "videoHeight"); - const char *width = xnode_prop_ns_get(xn, BITZI_BZ, "videoWidth"); - const char *duration = xnode_prop_ns_get(xn, BITZI_MM, "duration"); - gboolean has_res = width && height; - guint32 seconds; - char desc256; - size_t len; - - if (duration != NULL) { - int error; - /* Bitzi stores it in ms */ - seconds = parse_uint32(duration, NULL, 10, &error) / 1000; - } else { - seconds = 0; - } - - /* - * We don't include the duration in the string because the - * output of short_time() is localized and we don't want to - * freeze that description in the database. - * Keep it separate so that the GUI can format it properly - * when the description is displayed, using the right locale. - */ - - data->duration = seconds; - - /* - * format the mime details - */ - - /** - * TRANSLATORS: This describes video parameters; - * The first part is used as <width>x<height> (resolution). - * fps stands for "frames per second". - * kbps stands for "kilobit per second" (metric kilo). - */ - len = gm_snprintf(desc, sizeof desc, _("%s%s%s%s%s fps, %s kbps"), - has_res ? width : "", - has_res ? Q_("times|x") : "", - has_res ? height : "", - has_res ? ", " : "", - (fps != NULL) ? fps : "?", - (bitrate != NULL) ? bitrate : "?"); - - ascii_chomp_trailing_spaces(desc, len); - atom_str_change(&data->mime_desc, desc); - - } else if (is_strcaseprefix(value, "audio/")) { - const char *channels = - xnode_prop_ns_get(xn, BITZI_BZ, "audioChannels"); - const char *kbps = xnode_prop_ns_get(xn, BITZI_BZ, "audioBitrate"); - const char *srate = - xnode_prop_ns_get(xn, BITZI_BZ, "audioSamplerate"); - const char *duration = xnode_prop_ns_get(xn, BITZI_MM, "duration"); - guint32 seconds; - char desc256; - size_t len; - - if (duration) { - int error; - /* Bitzi stores it in ms */ - seconds = parse_uint32(duration, NULL, 10, &error) / 1000; - } else { - seconds = 0; - } - - data->duration = seconds; - - /* - * We don't include the duration in the string because the - * output of short_time() is localized and we don't want to - * freeze that description in the database. Units like Hz - * or acronyms like kbps are OK because they're "international". - */ - - len = gm_snprintf(desc, sizeof desc, "%s%s%s%s%s%s", - kbps ? kbps : "", kbps ? "kbps " : "", - srate ? srate : "", srate ? "Hz " : "", - channels ? channels : "", channels ? "ch" : ""); - - ascii_chomp_trailing_spaces(desc, len); - atom_str_change(&data->mime_desc, desc); - } - } - - /* - * For debugging/development - dump all the attributes - */ - - if (GNET_PROPERTY(bitzi_debug) > 3) { - g_debug("BITZI %s: attributes of %s:", G_STRFUNC, xnode_to_string(xn)); - xnode_prop_foreach(xn, bitzi_description_attr_log, NULL); - } -} - -/** - * Iterates through the XML/RDF ticket calling various process - * functions to read the data into the bitzi_data_t. - * - * This function is recursive, if the element is not explicity known we - * just recurse down a level. - */ -static void -bitzi_process_xml(const xnode_t *xn, bitzi_data_t *data) -{ - const xnode_t *xl; - - for (xl = xn; xl != NULL; xl = xnode_next_sibling(xl)) { - if (!xnode_is_element(xl)) - continue; - - if (GNET_PROPERTY(bitzi_debug) > 3) - g_debug("BITZI at element %s", xnode_to_string(xl)); - - if (xnode_is_element_named(xl, BITZI_RDF, "Description")) { - bitzi_process_rdf_description(xl, data); - } else { - bitzi_process_xml(xnode_first_child(xl), data); - } - } -} - -/** - * Report failure to the GUI for a SHA1/filesize request. - */ -static void -bitzi_failure(const struct sha1 *sha1, filesize_t filesize, bitzi_fj_t error) -{ - if (sha1 != NULL) { - bitzi_data_t dummy; - - ZERO(&dummy); - dummy.sha1 = sha1; - dummy.size = filesize; - dummy.judgment = error; - gcu_bitzi_result(&dummy); - } -} - -/** - * Fill data from database entry. - */ -static void -bitzi_fill_data(bitzi_data_t *data, - const struct sha1 *sha1, const struct bzdata *bz) -{ - ZERO(data); - data->sha1 = sha1; - data->mime_type = bz->mime_type; - data->mime_desc = bz->mime_desc; - data->ticket = bz->ticket; - data->size = bz->size; - data->duration = bz->duration; - data->judgment = bz->judgment; - data->goodness = bz->goodness; - data->expiry = bz->etime; - data->first_seen = bz->ctime; -} - -/** - * Process the XML ticket and notify GUI. - */ -static void -bitzi_process_ticket(bitzi_request_t *breq, char *ticket, size_t length) -{ - bitzi_data_t *data; - xnode_t *root; - vxml_parser_t *vp; - vxml_error_t e; - - g_assert(breq != NULL); - - if (GNET_PROPERTY(bitzi_debug)) { - g_debug("BITZI %s: processing ticket data for %s", - G_STRFUNC, sha1_to_string(breq->sha1)); - } - - /* - * Parse the XML ticket. - */ - - vp = vxml_parser_make("BITZI ticket", VXML_O_STRIP_BLANKS); - vxml_parser_add_data(vp, ticket, length); - e = vxml_parse_tree(vp, &root); - vxml_parser_free(vp); - - if (VXML_E_OK != e) { - if (GNET_PROPERTY(bitzi_debug)) { - g_warning("BITZI cannot parse XML ticket: %s", vxml_strerror(e)); - dump_hex(stderr, "BITZI ticket", ticket, length); - } - bitzi_failure(breq->sha1, breq->filesize, BITZI_FJ_FAILURE); - return; - } - - /* - * Now we can have a look at the data - */ - - data = bitzi_create(); - - /* - * This just dumps the data - */ - - bitzi_process_xml(root, data); - - if (NULL == data->sha1) { - if (GNET_PROPERTY(bitzi_debug)) { - g_warning("process_meta_data: missing SHA-1"); - } - bitzi_failure(breq->sha1, breq->filesize, BITZI_FJ_FAILURE); - goto finish; - } - - if (breq->sha1 && !sha1_eq(data->sha1, breq->sha1)) { - if (GNET_PROPERTY(bitzi_debug)) { - g_warning("process_meta_data: SHA-1 mismatch"); - } - bitzi_failure(breq->sha1, breq->filesize, BITZI_FJ_FAILURE); - goto finish; - } - - /* - * If the data has a valid date then we can cache the result. - */ - - if ( - (time_t) -1 == data->expiry || - delta_time(data->expiry, tm_time()) <= 0 - ) { - if (GNET_PROPERTY(bitzi_debug)) { - g_debug("BITZI %s: stale bitzi data", G_STRFUNC); - } - bitzi_failure(breq->sha1, breq->filesize, BITZI_FJ_FAILURE); - goto finish; - } - - if (!bitzi_cache_add(data, root)) { - if (GNET_PROPERTY(bitzi_debug)) { - g_debug("BITZI %s: uncached bitzi data", G_STRFUNC); - } - bitzi_failure(breq->sha1, breq->filesize, BITZI_FJ_FAILURE); - goto finish; - } - - if (breq->filesize && breq->filesize != data->size) { - if (GNET_PROPERTY(bitzi_debug)) { - g_debug("BITZI %s: filesize mismatch", G_STRFUNC); - } - /* We keep the ticket anyway because there's only one per SHA-1 */ - bitzi_failure(breq->sha1, breq->filesize, - data->size ? BITZI_FJ_WRONG_FILESIZE : BITZI_FJ_UNKNOWN); - goto finish; - } - - gcu_bitzi_result(data); - - /* FALL THROUGH */ - -finish: - xnode_tree_free_null(&root); - bitzi_destroy(data); -} - -/** - * Answer to our ticket request. - * - * This is an http_async_wget() completion callback. - */ -static void -bitzi_ticket_requested(char *data, size_t len, int code, - header_t *header, void *arg) -{ - bitzi_request_t *breq = arg; - const char *buf; - - breq->ha = NULL; /* Request ending with this callback */ - - if (NULL == data) { - if (GNET_PROPERTY(bitzi_debug)) { - g_warning("BITZI requested ticket for %s failed (HTTP %d)", - sha1_to_string(breq->sha1), code); - } - bitzi_failure(breq->sha1, breq->filesize, BITZI_FJ_FAILURE); - goto done; - } - - if (GNET_PROPERTY(bitzi_debug) > 1) { - g_debug("BITZI request for %s returned %zu byte%s", - sha1_to_string(breq->sha1), - len, 1 == len ? "" : "s"); - if (GNET_PROPERTY(bitzi_debug) > 5) { - g_debug("BITZI got HTTP %u:", code); - header_dump(stderr, header, "----"); - } - if (GNET_PROPERTY(bitzi_debug) > 9) { - dump_hex(stderr, "BITZI ticket", data, len); - } - } - - /* - * Make sure we got "text/xml" output. - */ - - buf = header_get(header, "Content-Type"); - if (NULL == buf || !strtok_case_has(buf, ";", "text/xml")) { - g_warning("BITZI ticket for %s does not contain any XML", - sha1_to_string(breq->sha1)); - bitzi_failure(breq->sha1, breq->filesize, BITZI_FJ_FAILURE); - goto done; - } - - /* - * Parse the XML ticket. - */ - - bitzi_process_ticket(breq, data, len); - hfree(data); - - /* FALL THROUGH */ - -done: - current_bitzi_request = NULL; - bitzi_request_free(breq); -} - -/** - * Send a meta-data query - * - * Called directly when a request launched or via the bitzi_heartbeat tick. - * - * @return TRUE if an HTTP request was launched. - */ -static gboolean -bitzi_launch_query(bitzi_request_t *breq) -{ - if (GNET_PROPERTY(bitzi_debug)) - g_debug("BITZI dequeuing query for %s", sha1_to_string(breq->sha1)); - - /* - * check we haven't already got a response from a previous query - */ - if (bitzi_has_cached_ticket(breq->sha1)) { - bitzi_data_t data; - - - if (bitzi_data_by_sha1(&data, breq->sha1, breq->filesize)) { - gboolean ignore = FALSE; - - /* - * If the cached entry indicates that the SHA1 was not in the - * Bitzi database, re-query Bitzi if the indication was inserted - * more than BITZI_UNKNOWN_TIMEOUT seconds ago, thereby ignoring - * the default Bitzi expiration time of about 2 weeks. - * - * The reason for ignoring this timeout is that we're facing an - * explicit user request here, not an automatic lookup. Imposing - * the BITZI_UNKNOWN_TIMEOUT interval between requests avoids - * hammering Bitzi and protects against broad user selections - * for updates. - * --RAM, 2011-09-18 - */ - - if ( - BITZI_FJ_UNKNOWN == data.judgment && - delta_time(tm_time(), data.first_seen) > BITZI_UNKNOWN_TIMEOUT - ) { - ignore = TRUE; - } - - if (GNET_PROPERTY(bitzi_debug)) { - g_debug("BITZI has cached ticket for %s: \"%s\", inserted %s%s", - sha1_to_string(breq->sha1), - bitzi_judgment_to_string(data.judgment), - timestamp_to_string(data.first_seen), - ignore ? " (ignoring and re-fetching)" : ""); - } - - if (ignore) - goto fetch; - - gcu_bitzi_result(&data); - } else { - /* - * We have a ticket for this SHA1, but no suitable data is filled - * which indicates a filesize mismatch. - */ - bitzi_failure(breq->sha1, breq->filesize, BITZI_FJ_WRONG_FILESIZE); - } - goto failed; - } - - /* - * Launch the HTTP asynchronous request. - */ - -fetch: - - if (GNET_PROPERTY(bitzi_debug)) - g_debug("BITZI launching query for %s", sha1_to_string(breq->sha1)); - - breq->ha = http_async_wget(breq->bitzi_url, BITZI_XML_MAXLEN, - bitzi_ticket_requested, breq); - - if (NULL == breq->ha) { - g_warning("could not launch a \"GET %s\" request: %s", - breq->bitzi_url, http_async_strerror(http_async_errno)); - goto failed; - } - - current_bitzi_request = breq; - return TRUE; - -failed: - bitzi_request_free(breq); - return FALSE; -} - -/************************************************************** - ** Bitzi Results Cache - *************************************************************/ - -/** - * Get bzdata from database, returning NULL if not found. - */ -static struct bzdata * -get_bzdata(const sha1_t *sha1) -{ - struct bzdata *bz; - - bz = dbmw_read(db_bzdata, sha1, NULL); - - return bz; -} - -/** - * Add parsed ticket data to the cache. - * - * @return TRUE if we added the ticket, FALSE if it was already present (in - * which case the information is simply updated). - */ -static gboolean -bitzi_cache_add(bitzi_data_t *data, const xnode_t *root) -{ - struct bzdata bz; - struct bzdata *bzo; - - g_assert(data != NULL); - g_assert(data->sha1 != NULL); - g_assert(NULL == data->ticket); - - bzo = get_bzdata(data->sha1); - - /* - * For proper memory management of the pointers allocated at - * deserialization time we have two options (when the value was - * already present in the database): - * - * - Either we explicitly manage freeing of previous pointers in the - * supplied value (in effect updating the value that was allocated - * by the DBMW layer. In that case, we may supply back the same - * value pointer. - * - * - Or we supply a totally different structure, and the DBMW layer - * will invoke the freeing callback on the previous value. In that - * case, all the values dynamically allocated in the original must be - * cloned. - * - * In any case, memory allocation must be consistent with the one - * performed at deserialization time since it is the freeing callback - * which will ultimately release the memory when the value leaves - * the cache. - * - * We choose option #1: we explicitly manage memory in the cached structure. - */ - - if (NULL == bzo) { - bzo = &bz; - ZERO(&bz); - bzo->ctime = tm_time(); - gnet_stats_count_general(GNR_BITZI_TICKETS_HELD, +1); - } else { - if (data->expiry < bzo->etime) { - g_message("%s: entry for %s already present and expires later", - G_STRFUNC, sha1_to_string(data->sha1)); - return FALSE; - } - - if (bzo->size != 0 && bzo->size != data->size) { - g_warning("%s: entry for %s already present with filesize %s but " - "new entry says %s, keeping old ticket", - G_STRFUNC, sha1_to_string(data->sha1), - filesize_to_string(bzo->size), - filesize_to_string2(data->size)); - return FALSE; - } - } - - if (NULL == bzo->mime_type) { - atom_str_change(&bzo->mime_type, data->mime_type); - } - if (NULL == bzo->mime_desc) { - atom_str_change(&bzo->mime_desc, data->mime_desc); - } else if ( - data->mime_desc != NULL && - strlen(bzo->mime_desc) < strlen(data->mime_desc) - ) { - /* Keep longest string, assuming it will be more complete */ - atom_str_change(&bzo->mime_desc, data->mime_desc); - } - - /* - * We keep the full XML ticket around, just in case we later wish to - * parse more data from the ticket and want to upgrade the database. - * - * It's not worth compressing the XML data to save space, this will just - * slow things down for little space benefits. - */ - - HFREE_NULL(bzo->ticket); - if (data->size != 0) { - bzo->ticket = xfmt_tree_to_string_extended(root, XFMT_O_SINGLE_LINE, - bitzi_prefixes, G_N_ELEMENTS(bitzi_prefixes), BITZI_RDF); - } - bzo->size = data->size; - bzo->duration = data->duration; - bzo->judgment = data->judgment; - bzo->goodness = data->goodness; - bzo->etime = data->expiry; - - dbmw_write(db_bzdata, data->sha1, bzo, sizeof *bzo); - - if (GNET_PROPERTY(bitzi_debug)) { - g_debug("BITZI %s: %s %s ticket, filesize=%s, type=%s, desc=\"%s\", " - "judgment=\"%s\", goodness=%g, duration=%s, expire=%s", - G_STRFUNC, bzo->ctime == tm_time() ? "added" : "updated", - sha1_to_string(data->sha1), - filesize_to_string(bzo->size), bzo->mime_type, - bzo->mime_desc, bitzi_judgment_to_string(bzo->judgment), - bzo->goodness, short_time_ascii(bzo->duration), - timestamp_to_string(bzo->etime)); - if (GNET_PROPERTY(bitzi_debug) > 5 && bzo->ticket != NULL) { - g_debug("BITZI XML ticket:"); - dump_string(stderr, bzo->ticket, strlen(bzo->ticket), ""); - } - } - - return TRUE; -} - -/** - * DBMW foreach iterator to remove old entries. - * @return TRUE if entry must be deleted. - */ -static gboolean -bitzi_entry_prune(gpointer key, gpointer value, size_t u_len, gpointer u_data) -{ - const sha1_t *sha1 = key; - const struct bzdata *bz = value; - gboolean expired; - - (void) u_len; - (void) u_data; - - expired = tm_time() >= bz->etime; - - if (GNET_PROPERTY(bitzi_debug) > 4) { - g_debug("BITZI ticket %s expire=%s%s", - sha1_to_string(sha1), - timestamp_to_string(bz->etime), expired ? " EXPIRED" : ""); - if (GNET_PROPERTY(bitzi_debug) > 5 && expired && bz->ticket != NULL) { - g_debug("BITZI Expired XML ticket:"); - dump_string(stderr, bz->ticket, strlen(bz->ticket), "----"); - } - } - - return expired; -} - -/** - * Prune the database, removing expired entries. - */ -static void -bitzi_prune_old(void) -{ - if (GNET_PROPERTY(bitzi_debug)) { - g_debug("BITZI pruning expired tickets (%zu)", dbmw_count(db_bzdata)); - } - - dbmw_foreach_remove(db_bzdata, bitzi_entry_prune, NULL); - gnet_stats_set_general(GNR_BITZI_TICKETS_HELD, dbmw_count(db_bzdata)); - - if (GNET_PROPERTY(bitzi_debug)) { - g_debug("BITZI pruned expired tickets (%zu remaining)", - dbmw_count(db_bzdata)); - } - - dbstore_shrink(db_bzdata); -} - -/** - * Callout queue periodic event to expire old entries. - */ -static gboolean -bitzi_prune(gpointer unused_obj) -{ - (void) unused_obj; - - bitzi_prune_old(); - return TRUE; /* Keep calling */ -} - -/** - * Callout queue periodic event to synchronize persistent DB. - */ -static gboolean -bitzi_sync(gpointer unused_obj) -{ - (void) unused_obj; - - dbstore_sync_flush(db_bzdata); - return TRUE; /* Keep calling */ -} - -/************************************************************* - ** Bitzi Heartbeat - ************************************************************/ - -/** - * The heartbeat function is a repeating glib timeout that is used to - * pace queries to the bitzi metadata service. - */ -static gboolean -bitzi_heartbeat(gpointer unused_data) -{ - (void) unused_data; - - /* - * launch first pending queries if none is active. - */ - - while (current_bitzi_request == NULL && slist_length(bitzi_rq) != 0) { - bitzi_request_t *breq = slist_shift(bitzi_rq); - - if (bitzi_launch_query(breq)) - break; - } - - return TRUE; /* Always requeue */ -} - -/************************************************************** - ** Bitzi API - *************************************************************/ - -/** - * Query the bitzi cache for this given SHA-1. - */ -gboolean -bitzi_has_cached_ticket(const struct sha1 *sha1) -{ - return NULL != get_bzdata(sha1); -} - -/** - * A GUI/Bitzi API passes a pointer to the search type (currently only - * urn:sha1), a pointer to a callback function and a user data - * pointer. - * - * @param sha1 The SHA-1 of the file. - * @param filesize The expected filesize. - * @param refresh If TRUE a fresh ticket is requested, otherwise a - * cached ticket is used. - * - * If no query succeds then the call back is never made, however we - * should always get some sort of data back from the service. - */ -void -bitzi_query_by_sha1(const struct sha1 *sha1, - filesize_t filesize, gboolean refresh) -{ - struct bzdata *bz; - - g_return_if_fail(NULL != sha1); - - bz = get_bzdata(sha1); - - if (bz != NULL) { - if (GNET_PROPERTY(bitzi_debug)) { - g_debug("BITZI %s: result for %s already in cache, " - "size=%s, refresh=%s, expires %s", - G_STRFUNC, sha1_to_string(sha1), filesize_to_string(bz->size), - refresh ? "y" : "n", - timestamp_to_string(bz->etime)); - } - if (refresh) { - bz = NULL; - } - } - - if (bz != NULL) { - if (filesize != 0 && bz->size != filesize) { - bitzi_failure(sha1, filesize, - bz->size ? BITZI_FJ_WRONG_FILESIZE : BITZI_FJ_UNKNOWN); - bz = NULL; - } else { - bitzi_data_t data; - - bitzi_fill_data(&data, sha1, bz); - gcu_bitzi_result(&data); - } - } else { - bitzi_request_t *breq; - - breq = bitzi_request_create(sha1, filesize); - - /* - * When no request is running, immediately process the incoming - * request if nothing else is pending. - */ - - if (NULL == current_bitzi_request && 0 == slist_length(bitzi_rq)) { - bitzi_launch_query(breq); - } else { - slist_append(bitzi_rq, breq); - - if (GNET_PROPERTY(bitzi_debug)) { - g_debug("BITZI %s: queued query for %s at position #%u", - G_STRFUNC, sha1_base32(sha1), slist_length(bitzi_rq)); - } - - /* The heartbeat will pick up the request */ - } - } -} - -/** - * Fill supplied data by SHA1. - * - * @return TRUE if found, FALSE if ticket does not exist. - */ -gboolean -bitzi_data_by_sha1(bitzi_data_t *data, - const struct sha1 *sha1, filesize_t filesize) -{ - struct bzdata *bz; - - bz = get_bzdata(sha1); - if (NULL == bz) - return FALSE; - - bitzi_fill_data(data, sha1, bz); - - if (0 == bz->size) { - data->judgment = BITZI_FJ_UNKNOWN; - } else if (filesize != 0 && bz->size != filesize) { - data->judgment = BITZI_FJ_WRONG_FILESIZE; - } - - return TRUE; -} - -/** - * Return XML ticket by SHA1. - */ -const char * -bitzi_ticket_by_sha1(const struct sha1 *sha1, filesize_t filesize) -{ - struct bzdata *bz; - - bz = get_bzdata(sha1); - - if (GNET_PROPERTY(bitzi_debug > 9)) { - if (bz != NULL) { - gboolean matches = 0 == filesize || bz->size == filesize; - g_debug("BITZI %s: %s bz->ticket = %p, filesize %s", - G_STRFUNC, sha1_to_string(sha1), bz->ticket, - matches ? "matches": "MISMATCH"); - if (!matches) { - g_debug("BITZI %s: %s filesize %s, ticket says: %s", - G_STRFUNC, sha1_to_string(sha1), - filesize_to_string(filesize), - filesize_to_string2(bz->size)); - } - } else { - g_debug("BITZI %s: %s NOT FOUND", G_STRFUNC, sha1_to_string(sha1)); - } - } - - return bz != NULL && (0 == filesize || bz->size == filesize) ? - bz->ticket : NULL; -} - -/** - * Initialise any bitzi specific stuff we want to here. - */ -G_GNUC_COLD void -bitzi_init(void) -{ - dbstore_kv_t kv = { SHA1_RAW_SIZE, NULL, sizeof(struct bzdata), - sizeof(struct bzdata) + BITZI_XML_MAXLEN + 1024 }; - dbstore_packing_t packing = - { serialize_bzdata, deserialize_bzdata, free_bzdata }; - char *oldpath; - - /* Legacy cleanup */ - oldpath = make_pathname(settings_config_dir(), "bitzi.xml"); - (void) unlink(oldpath); - HFREE_NULL(oldpath); - - db_bzdata = dbstore_open(db_bzdata_what, settings_gnet_db_dir(), - db_bzdata_base, kv, packing, BITZI_DB_CACHE_SIZE, sha1_hash, sha1_eq, - FALSE); - - bitzi_rq = slist_new(); - bitzi_prune_old(); - - bitzi_sync_ev = cq_periodic_main_add(BITZI_SYNC_PERIOD, bitzi_sync, NULL); - bitzi_prune_ev = cq_periodic_main_add(BITZI_PRUNE_PERIOD, - bitzi_prune, NULL); - - /* - * Finally start the bitzi heart beat that will send requests when - * we set them up. - */ - - bitzi_heartbeat_ev = cq_periodic_main_add( - BITZI_HEARTBEAT_PERIOD, bitzi_heartbeat, NULL); -} - -G_GNUC_COLD void -bitzi_close(void) -{ - g_return_if_fail(bitzi_rq); - - dbstore_close(db_bzdata, settings_gnet_db_dir(), db_bzdata_base); - db_bzdata = NULL; - slist_free_all(&bitzi_rq, cast_to_slist_destroy(bitzi_request_free)); - bitzi_request_free_null(¤t_bitzi_request); - cq_periodic_remove(&bitzi_heartbeat_ev); -} - -/* vi: set ts=4 sw=4 cindent: */ -/* -*- mode: cc-mode; tab-width:4; -*- */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/bitzi.h
Deleted
@@ -1,44 +0,0 @@ -/* - * Copyright (c) 2004, Alex Bennee <alex@bennee.com> - * - *---------------------------------------------------------------------- - * This file is part of gtk-gnutella. - * - * gtk-gnutella 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 2 of the License, or - * (at your option) any later version. - * - * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software - * Foundation, Inc.: - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - *---------------------------------------------------------------------- - */ - -/** - * @ingroup core - * @file - * - * Bitzi Core search code. - * - * @author Alex Bennee <alex@bennee.com> - * @date 2004 - */ - -#ifndef _core_bitzi_h_ -#define _core_bitzi_h_ - -#include "common.h" - -#include "if/core/bitzi.h" - -void bitzi_init(void); -void bitzi_close(void); - -#endif /* _core_bitzi_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/file_object.c
Deleted
@@ -1,878 +0,0 @@ -/* - * Copyright (c) 2006, Christian Biere - * - *---------------------------------------------------------------------- - * This file is part of gtk-gnutella. - * - * gtk-gnutella 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 2 of the License, or - * (at your option) any later version. - * - * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software - * Foundation, Inc.: - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - *---------------------------------------------------------------------- - */ - -/** - * @ingroup core - * @file - * - * Sharing of file descriptors through file objects. - * - * @author Christian Biere - * @date 2006 - */ - -/** - * @note NOTE: - * It is the callers responsibility to ensure consistency between the file - * descriptor and the pathname. Thus, this must not be used with arbitrary - * paths but only for directories under our control. For example, the file - * could be removed by another process and file_object_open() would return the - * file descriptor of the already removed file. When the last file object for - * this pathname is released, the file contents would be lost. - * - * Likewise, you can open a file that has already been deleted or moved when - * using file_object_open(). Whether the file still exists can be checked with - * fstat(). However this is not necessarily the same file referenced by the - * file object. - * - * The current offset is shared that means, you should always use pread() - * instead of read(), pwrite() instead of write() etc. The replacement - * functions do not restore the original file offset and they are NOT - * thread-safe. As gtk-gnutella is mono-threaded this should never be a - * problem. - * - * The file objects created with O_RDWR are returned for all - * file_object_open() requests. That means the caller must take care to not - * accidently write to a file object acquired with O_RDONLY. - * - * Normally, file objects should be acquired as follows: - * - * // Try to reuse an existing file object - * file = file_object_open(pathname, mode); - * if (!file) { - * int fd; - * - * // If none exists, create a new file object - * fd = open_the_file(pathname, mode); - * if (fd >= 0) { - * file = file_object_new(fd, pathname, mode); - * } - * } - * if (!file) { - * // Error handling - * } - * - * If a file object is created and released in the same function i.e., reuse - * unlikely, the strictest access mode should be used (O_RDONLY or O_WRONLY). - * Otherwise, it is best to use O_RDWR so that the same object can be reused - * by further calls to file_object_open() whilst the object exists. - * - * This API does not allow opening the same file twice for compatible access - * modes. You can create one file object for O_RDONLY and another with - * O_WRONLY for the same path though, if none with O_RDWR exists. - */ - -#include "common.h" - -#include "file_object.h" - -#include "lib/atoms.h" -#include "lib/compat_pio.h" -#include "lib/fd.h" -#include "lib/file.h" -#include "lib/glib-missing.h" -#include "lib/iovec.h" -#include "lib/path.h" -#include "lib/walloc.h" - -#include "lib/override.h" /* Must be the last header included */ - -static GHashTable *ht_file_objects_rdonly; /* read-only file objects */ -static GHashTable *ht_file_objects_wronly; /* write-only file objects */ -static GHashTable *ht_file_objects_rdwr; /* read+write-able file objects */ - -enum file_object_magic { FILE_OBJECT_MAGIC = 0x6b084325 }; /**< Magic number */ - -struct file_object { - enum file_object_magic magic; - const char *pathname; /* atom */ - int ref_count; - int fd; - int accmode; /* O_RDONLY, O_WRONLY, O_RDWR */ - int removed; -}; - -/** - * @todo - * TODO: fd_is_*() and accmode_is_valid() are generic functions which should - * be moved elsewhere. - */ - -/** - * Checks whether the given file descriptor is opened for write operations. - * - * @param fd A valid file descriptor. - * @return TRUE if the file descriptor is opened with O_WRONLY or O_RDWR. - */ -static inline gboolean -fd_is_writable(const int fd) -{ - int flags; - - g_return_val_if_fail(fd >= 0, FALSE); - - flags = fcntl(fd, F_GETFL); - g_return_val_if_fail(-1 != flags, FALSE); - - flags &= O_ACCMODE; - return O_WRONLY == flags || O_RDWR == flags; -} - -/** - * Checks whether the given file descriptor is opened for read operations. - * - * @param fd A valid file descriptor. - * @return TRUE if the file descriptor is opened with O_RDONLY or O_RDWR. - */ -static inline gboolean -fd_is_readable(const int fd) -{ - int flags; - - g_return_val_if_fail(fd >= 0, FALSE); - - flags = fcntl(fd, F_GETFL); - g_return_val_if_fail(-1 != flags, FALSE); - - flags &= O_ACCMODE; - return O_RDONLY == flags || O_RDWR == flags; -} - -/** - * Checks whether the given file descriptor is opened for read and write - * operations. - * - * @param fd A valid file descriptor. - * @return TRUE if the file descriptor is opened with O_RDWR. - */ -static inline gboolean -fd_is_readable_and_writable(const int fd) -{ - int flags; - - g_return_val_if_fail(fd >= 0, FALSE); - - flags = fcntl(fd, F_GETFL); - g_return_val_if_fail(-1 != flags, FALSE); - - flags &= O_ACCMODE; - return O_RDWR == flags; -} - -/** - * Checks whether the given file descriptor is compatible with given - * access mode. For example, if fd has access mode O_RDONLY but - * accmode is O_WRONLY or O_RDWR FALSE is returned, because the - * file descriptor is not writable. - * - * @param fd A valid file descriptor. - * @return TRUE if the file descriptor is compatible with the access mode. - */ -static inline gboolean -accmode_is_valid(const int fd, const int accmode) -{ - g_return_val_if_fail(fd >= 0, FALSE); - - switch (accmode) { - case O_RDONLY: return fd_is_readable(fd); - case O_WRONLY: return fd_is_writable(fd); - case O_RDWR: return fd_is_readable_and_writable(fd); - } - return FALSE; -} - -/** - * Applies some basic and fast consistency checks to a file object and - * causes an assertion failure if a check fails. - */ -static inline void -file_object_check(const struct file_object * const fo) -{ - g_assert(fo); - g_assert(FILE_OBJECT_MAGIC == fo->magic); - g_assert(fo->ref_count > 0); - g_assert(fo->ref_count < INT_MAX); - g_assert(fo->pathname); -} - -/** - * Get the hash table for a given access mode. - * - * @return The hash table holding file object for the access mode. - */ -static inline GHashTable * -file_object_mode_get_table(const int accmode) -{ - switch (accmode) { - case O_RDONLY: return ht_file_objects_rdonly; - case O_WRONLY: return ht_file_objects_wronly; - case O_RDWR: return ht_file_objects_rdwr; - } - return NULL; -} - -/** - * Find an existing file object associated with the given pathname - * for the given access mode. - * - * @return If no file object with the given pathname is found NULL - * is returned. - */ -static struct file_object * -file_object_find(const char * const pathname, int accmode) -{ - struct file_object *fo; - - g_return_val_if_fail(ht_file_objects_rdonly, NULL); - g_return_val_if_fail(ht_file_objects_wronly, NULL); - g_return_val_if_fail(ht_file_objects_rdwr, NULL); - g_return_val_if_fail(pathname, NULL); - g_return_val_if_fail(is_absolute_path(pathname), NULL); - - fo = g_hash_table_lookup(file_object_mode_get_table(O_RDWR), pathname); - - /* - * We need to find a more specific file object if looking for O_WRONLY - * or O_RDONLY ones. - */ - - if (O_RDWR != accmode) { - struct file_object *xfo; - xfo = g_hash_table_lookup(file_object_mode_get_table(accmode), pathname); - if (xfo != NULL) { - g_assert(xfo->accmode == accmode); - fo = xfo; - } - } - - if (fo) { - file_object_check(fo); - g_assert(is_valid_fd(fo->fd)); - g_assert(0 == strcmp(pathname, fo->pathname)); - g_assert(accmode_is_valid(fo->fd, accmode)); - g_assert(!fo->removed); - } - - return fo; -} - -static struct file_object * -file_object_alloc(const int fd, const char * const pathname, int accmode) -{ - static const struct file_object zero_fo; - struct file_object *fo; - GHashTable *ht; - - g_return_val_if_fail(fd >= 0, NULL); - g_return_val_if_fail(pathname, NULL); - g_return_val_if_fail(is_absolute_path(pathname), NULL); - g_return_val_if_fail(!file_object_find(pathname, accmode), NULL); - - ht = file_object_mode_get_table(accmode); - g_return_val_if_fail(ht, NULL); - - WALLOC(fo); - *fo = zero_fo; - fo->magic = FILE_OBJECT_MAGIC; - fo->ref_count = 1; - fo->fd = fd; - fo->accmode = accmode; - fo->pathname = atom_str_get(pathname); - - file_object_check(fo); - g_assert(is_valid_fd(fo->fd)); - gm_hash_table_insert_const(file_object_mode_get_table(fo->accmode), - fo->pathname, fo); - - return fo; -} - -static void -file_object_remove(struct file_object * const fo) -{ - const struct file_object *xfo; - - file_object_check(fo); - g_return_if_fail(!fo->removed); - - xfo = file_object_find(fo->pathname, fo->accmode); - g_assert(xfo == fo); - - g_hash_table_remove(file_object_mode_get_table(fo->accmode), fo->pathname); - fo->removed = TRUE; -} - -static void -file_object_free(struct file_object * const fo) -{ - g_return_if_fail(fo); - file_object_check(fo); - g_return_if_fail(1 == fo->ref_count); - - if (fo->removed) { - const struct file_object *xfo; - - xfo = g_hash_table_lookup(file_object_mode_get_table(fo->accmode), - fo->pathname); - g_assert(xfo != fo); - } else { - file_object_remove(fo); - } - - fd_close(&fo->fd); - atom_str_free_null(&fo->pathname); - fo->magic = 0; - WFREE(fo); -} - -/** - * Acquires a file object for a given pathname and access mode. If - * no matching file object exists, NULL is returned. - * - * @param pathname An absolute pathname. - * @return On failure NULL is returned. On success a file object is - * returned. - */ -struct file_object * -file_object_open(const char * const pathname, int accmode) -{ - struct file_object *fo; - - g_return_val_if_fail(pathname, NULL); - g_return_val_if_fail(is_absolute_path(pathname), NULL); - - fo = file_object_find(pathname, accmode); - if (fo) { - fo->ref_count++; - g_assert(is_valid_fd(fo->fd)); - } - return fo; -} - -/** - * Acquires a new file object for a given pathname. There must not be any - * file object registered for this pathname already. - * - * @param pathname An absolute pathname. - * @return On failure NULL is returned. On success a file object is - * returned. - */ -struct file_object * -file_object_new(const int fd, const char * const pathname, int accmode) -{ - g_return_val_if_fail(fd >= 0, NULL); - g_return_val_if_fail(accmode_is_valid(fd, accmode), NULL); - g_return_val_if_fail(pathname, NULL); - g_return_val_if_fail(is_absolute_path(pathname), NULL); - g_return_val_if_fail(!file_object_find(pathname, accmode), NULL); - - return file_object_alloc(fd, pathname, accmode); -} - -/** - * Releases a file object and frees its memory. The underlying file - * descriptor however is not closed unless no other file object references - * it. The pointer is nullified. - * - * @param fo_ptr If pointing to NULL, nothing happens. Otherwise, it must - * point to an initialized file_object. - */ -void -file_object_release(struct file_object **fo_ptr) -{ - g_assert(fo_ptr); - - if (*fo_ptr) { - struct file_object *fo = *fo_ptr; - - file_object_check(fo); - - if (1 == fo->ref_count) { - file_object_free(fo); - } else { - fo->ref_count--; - } - - *fo_ptr = NULL; - } -} - -/** - * Special operations that we can perform on file objects. - * - * These require special treatment because Windows frowns upon renaming - * and unlinking of opened files and will not, unlike UNIX, keep an already - * opened file accessible after it has been removed from the filesystem. - * - * Special operations provide uniform semantics on every platform: - * - * - FO_OP_UNLINK unlinks the file, denying further access to the file - * even if it was already opened. - * - * - FO_OP_RENAME renames the file, making it transparent for users whith - * current accesses on the file being renamed. - * - * - FO_OP_MOVED notifies that the file was moved around (accross file - * systems possibly) and that current users of the old path should be - * transparently remapped to the new file with the same access levels, - * the old location being unlinked afterwards. - */ -enum file_object_op { - FO_OP_UNLINK = 0, /**< Unlink file, further access denied */ - FO_OP_RENAME, /**< Rename file (on same filesystem) */ - FO_OP_MOVED /**< Moving notification */ -}; - -/** - * Convert special operation to string. - */ -static const char * -file_object_op_to_string(enum file_object_op op) -{ - switch (op) { - case FO_OP_UNLINK: return "unlink()"; - case FO_OP_RENAME: return "rename()"; - case FO_OP_MOVED: return "unlink()"; /* "unlink()" is NOT a typo */ - } - - g_assert_not_reached(); - return NULL; -} - -/** - * Execute special operation. - * - * @param old_name An absolute pathname, the old file name. - * @param new_name An absolute pathname, the new file name. - * - * @return TRUE if operation was successful, FALSE otherwise, with errno set. - */ -static gboolean -file_object_special_op(enum file_object_op op, - const char * const old_name, const char * const new_name) -{ - const int accmodes = { O_RDONLY, O_WRONLY, O_RDWR }; - unsigned i; - GSList *objects = NULL; - gboolean ok = TRUE; - int saved_errno = 0; - - errno = EINVAL; /* In case one of the soft assertions fails */ - - g_return_val_if_fail(old_name, FALSE); - g_return_val_if_fail(is_absolute_path(old_name), FALSE); - if (op != FO_OP_UNLINK) { - g_return_val_if_fail(new_name, FALSE); - g_return_val_if_fail(is_absolute_path(new_name), FALSE); - } - - /* - * Identify all the file objects currently active for the old name. - */ - - for (i = 0; i < G_N_ELEMENTS(accmodes); i++) { - struct file_object *fo; - - fo = file_object_find(old_name, accmodesi); - if (fo != NULL) { - if (NULL == g_slist_find(objects, fo)) { - objects = g_slist_prepend(objects, fo); - } - } - } - - /* - * On Windows, close all the files prior renaming / unlinking. - * - * On UNIX, only close all the files on unlink and moving. There is - * no need to do anything for a rename() operation. - */ - - if (op != FO_OP_RENAME || is_running_on_mingw()) { - GSList *sl; - - GM_SLIST_FOREACH(objects, sl) { - struct file_object *fo = sl->data; - - fd_forget_and_close(&fo->fd); - } - } - - /* - * Perform the operation. - */ - - switch (op) { - case FO_OP_UNLINK: - case FO_OP_MOVED: - ok = unlink(old_name) != -1; - break; - case FO_OP_RENAME: - ok = rename(old_name, new_name) != -1; - break; - } - - if (!ok) { - saved_errno = errno; - goto reopen; - } - - if (op != FO_OP_UNLINK) { - GSList *sl; - - /* - * Re-index the file objects with their new name. - */ - - GM_SLIST_FOREACH(objects, sl) { - struct file_object *fo = sl->data; - - g_hash_table_remove(file_object_mode_get_table(fo->accmode), - fo->pathname); - atom_str_change(&fo->pathname, new_name); - gm_hash_table_insert_const(file_object_mode_get_table(fo->accmode), - fo->pathname, fo); - } - } else { - GSList *sl; - - /* - * Revoke the file objects on successful unlinking. - * - * This will prevent further file_object_open() pointing to the (now - * removed) path from returning an existing file object. - * It will also invalidate all current file objects: further read/write - * attempts on these will return EBADF. - */ - - GM_SLIST_FOREACH(objects, sl) { - struct file_object *fo = sl->data; - - file_object_remove(fo); - } - - goto done; /* No re-opening required with unlink */ - } - - /* FALL THROUGH */ - -reopen: - - /* - * On Windows, reopen all the files. - * - * On UNIX, reopen the files after a move operation. There is nothing - * to be done on a rename() since we did not close the files before the - * operation and the kernel will do the right thing. - */ - - if (FO_OP_MOVED == op || is_running_on_mingw()) { - GSList *sl; - - GM_SLIST_FOREACH(objects, sl) { - struct file_object *fo = sl->data; - - fo->fd = file_absolute_open(fo->pathname, fo->accmode, 0); - - if (!is_valid_fd(fo->fd)) { - g_warning("cannot reopen \"%s\" mode 0%o " - "after %s %s of \"%s\": %m", - fo->pathname, fo->accmode, - ok ? "successful" : "failed", file_object_op_to_string(op), - old_name); - } - } - } - - /* FALL THROUGH */ - -done: - - gm_slist_free_null(&objects); - - if (!ok) - errno = saved_errno; - - return ok; -} - -/** - * Renames a file and transparently re-opens all the file objets pointing to - * the old name, re-inserting the file objects with the new names, assuming - * renaming was successful. - * - * @param old_name An absolute pathname, the old file name. - * @param new_name An absolute pathname, the new file name. - * - * @return TRUE if renaming was successful, FALSE otherwise, with errno set. - */ -gboolean -file_object_rename(const char * const old_name, const char * const new_name) -{ - return file_object_special_op(FO_OP_RENAME, old_name, new_name); -} - -/** - * Notification that a file was successfully copied. Access by file objects - * to the old path are transferred to the new one and the old file is unlinked. - * - * @param old_name An absolute pathname, the old file name. - * @param new_name An absolute pathname, the new file name. - * - * @return TRUE if renaming was successful, FALSE otherwise, with errno set. - */ -gboolean -file_object_moved(const char * const old_name, const char * const new_name) -{ - return file_object_special_op(FO_OP_MOVED, old_name, new_name); -} - -/** - * Deletes a file. - * - * @param path An absolute pathname, the file to unkink() - * - * @return TRUE if unlinking was successful, FALSE otherwise, with errno set. - */ -gboolean -file_object_unlink(const char * const path) -{ - return file_object_special_op(FO_OP_UNLINK, path, NULL); -} - -static ssize_t -file_object_ebadf(void) -{ - errno = EBADF; - return (ssize_t) -1; -} - -/** - * Write the given data to a file object at the given offset. - * - * @param fo An initialized file object. - * @param data An initialized buffer holding the data to write. - * @param size The amount of bytes to write (i.e., the size of data). - * @param offset The file offset at which to start writing the data. - * - * @return On failure -1 is returned and errno is set. On success the - * amount of bytes written is returned. - */ -ssize_t -file_object_pwrite(const struct file_object * const fo, - const void * const data, const size_t size, const filesize_t offset) -{ - file_object_check(fo); - - if (!is_valid_fd(fo->fd)) - return file_object_ebadf(); - - return compat_pwrite(fo->fd, data, size, offset); -} - -/** - * Write the given data to a file object at the given offset. - * - * @param fo An initialized file object. - * @param iov An initialized I/O vector buffer. - * @param iov_cnt The number of initialized buffer in iov (i.e., its size). - * @param offset The file offset at which to start writing the data. - * - * @return On failure -1 is returned and errno is set. On success the amount - * of data bytes written is returned. - */ -ssize_t -file_object_pwritev(const struct file_object * const fo, - const iovec_t * iov, const int iov_cnt, const filesize_t offset) -{ - file_object_check(fo); - g_assert(iov); - g_assert(iov_cnt > 0); - - if (!is_valid_fd(fo->fd)) - return file_object_ebadf(); - - return compat_pwritev(fo->fd, iov, iov_cnt, offset); -} - -/** - * Read data from the file object from the given offset. - * - * @param fo An initialized file object. - * @param data A buffer for holding the data to be read. - * @param size The amount of bytes to read (i.e., the size of data). - * @param offset The file offset from which to start reading data. - * - * @return On failure -1 is returned and errno is set. On success the - * amount of bytes read is returned. - */ -ssize_t -file_object_pread(const struct file_object * const fo, - void * const data, const size_t size, const filesize_t offset) -{ - file_object_check(fo); - - if (!is_valid_fd(fo->fd)) - return file_object_ebadf(); - - return compat_pread(fo->fd, data, size, offset); -} - -/** - * Read data from a file object from the given offset. - * - * @param fo An initialized file object. - * @param iov An initialized I/O vector buffer. - * @param iov_cnt The number of initialized buffer in iov (i.e., its size). - * @param offset The file offset at which to start reading data. - * - * @return On failure -1 is returned and errno is set. On success the amount - * of data bytes read is returned. - */ -ssize_t -file_object_preadv(const struct file_object * const fo, - iovec_t * const iov, const int iov_cnt, const filesize_t offset) -{ - file_object_check(fo); - g_assert(iov); - g_assert(iov_cnt > 0); - - if (!is_valid_fd(fo->fd)) - return file_object_ebadf(); - - return compat_preadv(fo->fd, iov, MIN(iov_cnt, MAX_IOV_COUNT), offset); -} - -/** - * Get opened file status. - * - * @return 0 if OK, -1 on failure with errno set. - */ -int -file_object_fstat(const struct file_object * const fo, filestat_t *buf) -{ - file_object_check(fo); - g_assert(is_valid_fd(fo->fd)); - - return fstat(fo->fd, buf); -} - -/** - * Get the file descriptor associated with a file object. This should - * not be used lightly and the returned file descriptor should not be - * cached. Future versions might open/close the file descriptor on - * demand or dynamically. - * - * @param An initialized file object. - * @return The file descriptor of the file object. - */ -int -file_object_get_fd(const struct file_object * const fo) -{ - file_object_check(fo); - return fo->fd; -} - -/** - * Get the pathname associated with a file object. - * - * @param An initialized file object. - * @return The pathname of the file object. - */ -const char * -file_object_get_pathname(const struct file_object * const fo) -{ - file_object_check(fo); - return fo->pathname; -} - -/** - * Initializes this module and must be called before using any other function - * of this module. - */ -void -file_object_init(void) -{ - g_return_if_fail(!ht_file_objects_rdonly); - g_return_if_fail(!ht_file_objects_wronly); - g_return_if_fail(!ht_file_objects_rdwr); - - ht_file_objects_rdonly = g_hash_table_new(g_str_hash, g_str_equal); - ht_file_objects_wronly = g_hash_table_new(g_str_hash, g_str_equal); - ht_file_objects_rdwr = g_hash_table_new(g_str_hash, g_str_equal); -} - -static void -file_object_show_item(gpointer key, gpointer value, gpointer unused_udata) -{ - const struct file_object * const fo = value; - - g_assert(key); - g_assert(value); - (void) unused_udata; - - file_object_check(fo); - g_assert(fo->pathname == key); - - g_warning("leaked file object: ref.count=%d fd=%d pathname=\"%s\"", - fo->ref_count, fo->fd, fo->pathname); -} - -static inline void -file_object_destroy_table(GHashTable **ht_ptr, const char * const name) -{ - GHashTable *ht; - guint n; - - g_assert(ht_ptr); - ht = *ht_ptr; - g_return_if_fail(ht); - - n = g_hash_table_size(ht); - if (n > 0) { - g_warning("file_object_destroy_table(): %s still contains %u items", - name, n); - g_hash_table_foreach(ht, file_object_show_item, NULL); - } - g_return_if_fail(0 == n); - g_hash_table_destroy(ht); - *ht_ptr = NULL; -} - -/** - * Releases all used resources and should be called on shutdown. - * @note Still existing file objects are not destroyed. - */ -void -file_object_close(void) -{ -#define D(x) &x, #x - - file_object_destroy_table(D(ht_file_objects_rdonly)); - file_object_destroy_table(D(ht_file_objects_wronly)); - file_object_destroy_table(D(ht_file_objects_rdwr)); - -#undef D -} - -/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/file_object.h
Deleted
@@ -1,54 +0,0 @@ -/* - * Copyright (c) 2006, Christian Biere - * - *---------------------------------------------------------------------- - * This file is part of gtk-gnutella. - * - * gtk-gnutella 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 2 of the License, or - * (at your option) any later version. - * - * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software - * Foundation, Inc.: - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - *---------------------------------------------------------------------- - */ - -#ifndef _core_file_object_h_ -#define _core_file_object_h_ - -#include "common.h" - -void file_object_init(void); -void file_object_close(void); - -struct file_object *file_object_new(int fd, const char *pathname, int accmode); -struct file_object *file_object_open(const char *pathname, int accmode); - -ssize_t file_object_pwrite(const struct file_object *fo, - const void *data, size_t buf, filesize_t offset); -ssize_t file_object_pwritev(const struct file_object *fo, - const iovec_t *iov, int iov_cnt, filesize_t offset); -ssize_t file_object_pread(const struct file_object *fo, - void *data, size_t size, filesize_t pos); -ssize_t file_object_preadv(const struct file_object *fo, - iovec_t *iov, int iov_cnt, filesize_t offset); - -int file_object_get_fd(const struct file_object *fo); -const char *file_object_get_pathname(const struct file_object *fo); - -void file_object_release(struct file_object **fo_ptr); -gboolean file_object_rename(const char * const o, const char * const n); -gboolean file_object_unlink(const char * const path); -gboolean file_object_moved(const char * const o, const char * const n); -int file_object_fstat(const struct file_object * const fo, filestat_t *b); - -#endif /* _core_file_object_h_ */ -/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/core/bitzi.h
Deleted
@@ -1,92 +0,0 @@ -/* - * Copyright (c) 2004, Alex Bennee <alex@bennee.com> - * - *---------------------------------------------------------------------- - * This file is part of gtk-gnutella. - * - * gtk-gnutella 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 2 of the License, or - * (at your option) any later version. - * - * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software - * Foundation, Inc.: - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - *---------------------------------------------------------------------- - */ - -#ifndef _if_core_bitzi_h_ -#define _if_core_bitzi_h_ - -#include "common.h" - -/** - * Bitzi Meta-data structure - * - * Both Core and GUI have visibility of this data structure - */ - -typedef enum { - BITZI_FJ_UNKNOWN, - BITZI_FJ_UNRATED, - BITZI_FJ_FAILURE, - BITZI_FJ_WRONG_FILESIZE, - BITZI_FJ_DANGEROUS_MISLEADING, - BITZI_FJ_INCOMPLETE_DAMAGED, - BITZI_FJ_SUBSTANDARD, - BITZI_FJ_OVERRATED, - BITZI_FJ_NORMAL, - BITZI_FJ_UNDERRATED, - BITZI_FJ_COMPLETE, - BITZI_FJ_RECOMMENDED, - BITZI_FJ_BEST_VERSION, - - NUM_BITZI_FJ -} bitzi_fj_t; - -struct sha1; - -/** - * bitzi_data_t - */ -typedef struct bitzi_data { - const struct sha1 *sha1; /**< pointer to SHA-1 atom */ - const char *mime_type; /**< mime type (string atom) */ - const char *mime_desc; /**< mime details (fps, bitrate etc) (atom) */ - const char *ticket; /**< The XML ticket as a single string */ - filesize_t size; /**< size of file */ - time_t duration; /**< duration in seconds of audio & video */ - bitzi_fj_t judgment; - float goodness; - time_t expiry; /**< expiry date of meta-data */ - time_t first_seen; /**< local creation time in database */ -} bitzi_data_t; - -#ifdef CORE_SOURCES - -/* - * Bitzi Core API declarations - * - * bitzi_query_* are initiated via the gui and will generate - * notification events - * - * bitzi_query_cache_* are used internally for gui querys as well as - * from within the core. They do not generate notification events - */ - -gboolean bitzi_has_cached_ticket(const struct sha1 *); -void bitzi_query_by_sha1(const struct sha1 *, filesize_t, gboolean); -gboolean bitzi_data_by_sha1(bitzi_data_t *, const struct sha1 *, filesize_t); -const char *bitzi_ticket_by_sha1(const struct sha1 *, filesize_t); - -#endif /* CORE_SOURCES */ - -#endif /* _core_bitzi_h_ */ -/* -*- mode: cc-mode; tab-width:4; -*- */ -/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/ui/gtk/bitzi.h
Deleted
@@ -1,40 +0,0 @@ -/* - * Copyright (c) 2004, Alex Bennee <alex@bennee.com> - * - *---------------------------------------------------------------------- - * This file is part of gtk-gnutella. - * - * gtk-gnutella 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 2 of the License, or - * (at your option) any later version. - * - * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software - * Foundation, Inc.: - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - *---------------------------------------------------------------------- - */ - -#ifndef _if_ui_gtk_bitzi_h_ -#define _if_ui_gtk_bitzi_h_ - -#include "if/core/bitzi.h" /* For bitzi types */ - -/* - * Public interface, visible from the bridge. - */ - -#ifdef GUI_SOURCES - -void bitzi_gui_update(bitzi_data_t *bitzi_data); - -#endif /* GUI_SOURCES */ -#endif /* _gtk_bitzi_h_ */ - -/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/fifo.c
Deleted
@@ -1,157 +0,0 @@ -/* - * Copyright (c) 2004, Raphael Manfredi - * - *---------------------------------------------------------------------- - * This file is part of gtk-gnutella. - * - * gtk-gnutella 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 2 of the License, or - * (at your option) any later version. - * - * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software - * Foundation, Inc.: - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - *---------------------------------------------------------------------- - */ - -/** - * @ingroup lib - * @file - * - * A FIFO. - * - * Items are put on one end and retrieved on the other, in the order - * they were put. - * - * @author Raphael Manfredi - * @date 2004 - */ - -#include "common.h" - -#include "fifo.h" -#include "glib-missing.h" -#include "walloc.h" -#include "override.h" /* Must be the last header included */ - -/** - * The real FIFO structure (the advertised fifo_t is just a facade). - */ -struct fifo { - GList *head; /**< Head of FIFO, where data is prepended */ - GList *tail; /**< Tail of FIFO, where data is removed from */ - int count; /**< Amount of entries in FIFO */ -}; - -/** - * Create new FIFO. - */ -fifo_t * -fifo_make(void) -{ - fifo_t *f; - - WALLOC0(f); - return f; -} - -/** - * Destroy FIFO. - */ -void -fifo_free(fifo_t *f) -{ - gm_list_free_null(&f->head); - WFREE(f); -} - -/** - * Destroy FIFO, invoking freeing callback on all items still held. - * - * @param f the FIFO to free - * @param cb the freeing callback to invoke on all items. - * @param udata the extra user data passed as-is to the freeing callback. - */ -void -fifo_free_all(fifo_t *f, fifo_free_t cb, gpointer udata) -{ - GList *l; - - for (l = f->head; l; l = g_list_next(l)) - (*cb)(l->data, udata); - - fifo_free(f); -} - -/** - * Returns amount of items queued in FIFO. - */ -int -fifo_count(fifo_t *f) -{ - return f->count; -} - -/** - * Add entry to FIFO. - */ -void -fifo_put(fifo_t *f, gconstpointer data) -{ - g_assert(f->count == 0 || f->head != NULL); - g_assert(f->count == 0 || f->tail != NULL); - g_assert(f->head == NULL || f->count != 0); - g_assert(f->tail == NULL || f->count != 0); - - f->head = g_list_prepend(f->head, (gpointer) data); - if (f->tail == NULL) - f->tail = f->head; - f->count++; -} - -/** - * Remove entry from FIFO. - * - * @return the oldest item still held in FIFO, NULL if no item remains. - */ -gpointer -fifo_remove(fifo_t *f) -{ - GList *prev; - gpointer data; - - if (f->count == 0) - return NULL; - - g_assert(f->tail != NULL); - - data = f->tail->data; - prev = g_list_previous(f->tail); - - if (prev == NULL) { - g_assert(f->tail == f->head); - g_assert(f->count == 1); - f->head = f->tail = g_list_remove(f->head, data); - } else { - IGNORE_RESULT(g_list_remove_link(prev, f->tail)); - g_list_free_1(f->tail); - f->tail = prev; - } - - f->count--; - - g_assert(f->count == 0 || f->head != NULL); - g_assert(f->count == 0 || f->tail != NULL); - g_assert(f->head == NULL || f->count != 0); - g_assert(f->tail == NULL || f->count != 0); - - return data; -} -
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/url_factory.c
Deleted
@@ -1,64 +0,0 @@ -/* - * Copyright (c) 2007, Raphael Manfredi - * - *---------------------------------------------------------------------- - * This file is part of gtk-gnutella. - * - * gtk-gnutella 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 2 of the License, or - * (at your option) any later version. - * - * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software - * Foundation, Inc.: - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - *---------------------------------------------------------------------- - */ - -/** - * @ingroup lib - * @file - * - * URL factory utils. - * - * @author Raphael Manfredi - * @date 2007 - */ - -#include "common.h" - -#include "url_factory.h" -#include "concat.h" -#include "halloc.h" -#include "misc.h" -#include "path.h" -#include "stringify.h" -#include "url.h" - -#include "override.h" /* Must be the last header included */ - -/** - * Create a Bitzi lookup URL based on the SHA1. - * - * @return pointer to static data containing the bitzi URL, NULL on error. - */ -const char * -url_for_bitzi_lookup(const struct sha1 *sha1) -{ - static const char base_url = "http://bitzi.com/lookup/"; - static char bufsizeof base_url + SHA1_BASE32_SIZE; - - g_return_val_if_fail(sha1, NULL); - - concat_strings(buf, sizeof buf, base_url, sha1_base32(sha1), (void *) 0); - - return buf; -} - -/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/url_factory.h
Deleted
@@ -1,46 +0,0 @@ -/* - * Copyright (c) 2007, Raphael Manfredi - * - *---------------------------------------------------------------------- - * This file is part of gtk-gnutella. - * - * gtk-gnutella 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 2 of the License, or - * (at your option) any later version. - * - * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software - * Foundation, Inc.: - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - *---------------------------------------------------------------------- - */ - -/** - * @ingroup lib - * @file - * - * URL factory utilities. - * - * @author Raphael Manfredi - * @date 2007 - */ - -#ifndef _url_factory_h_ -#define _url_factory_h_ - -#include "common.h" - -struct sha1; - -const char * url_for_bitzi_lookup(const struct sha1 *sha1); - -#endif /* _url_factory_h_ */ - -/* vi: set ts=4 sw=4 cindent: */ -
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/bitzi.c
Deleted
@@ -1,142 +0,0 @@ -/* - * Copyright (c) 2004, Alex Bennee <alex@bennee.com> - * - *---------------------------------------------------------------------- - * This file is part of gtk-gnutella. - * - * gtk-gnutella 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 2 of the License, or - * (at your option) any later version. - * - * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software - * Foundation, Inc.: - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - *---------------------------------------------------------------------- - */ - -/** - * @ingroup gtk - * @file - * - * Bitzi GTK+ interface code. - * - * @author Alex Bennee <alex@bennee.com> - * @date 2004 - */ - -#include "gtk/gui.h" - -#include "gtk/search.h" -#include "gtk/misc.h" /* gui_record_sha1_eq() */ - -#include "if/gnet_property.h" -#include "if/bridge/ui2c.h" -#include "if/core/bitzi.h" /* bitzi_data_t */ - -#include "lib/halloc.h" -#include "lib/stringify.h" -#include "lib/override.h" /* Must be the last header included */ - -/** - * This table should match the encoding one in 'core/bitzi.c'. - * - * It assumes the enum's are in order. - */ - -static const char * const bitzi_fj_table = { - N_("Bitzi|Unknown"), /**< UNKNOWN */ - N_("Bitzi|Unrated"), /**< UNRATED */ - N_("Bitzi|Bitzi lookup failure"), /**< FAILURE */ - N_("Bitzi|Filesize mismatch"), /**< WRONG_FILESIZE */ - N_("Bitzi|Dangerous/Misleading"), /**< DANGEROUS_MISLEADING */ - N_("Bitzi|Incomplete/Damaged"), /**< INCOMPLETE_DAMAGED */ - N_("Bitzi|Substandard"), /**< SUBSTANDARD */ - N_("Bitzi|Overrated"), /**< OVERRATED */ - N_("Bitzi|Normal"), /**< NORMAL */ - N_("Bitzi|Underrated"), /**< UNDERRATED */ - N_("Bitzi|Complete"), /**< COMPLETE */ - N_("Bitzi|Recommended"), /**< RECOMMENDED */ - N_("Bitzi|Best Version"), /**< BEST_VERSION*/ -}; - -const char * -bitzi_fj_to_string(bitzi_fj_t fj) -{ - STATIC_ASSERT(NUM_BITZI_FJ == G_N_ELEMENTS(bitzi_fj_table)); - g_assert(UNSIGNED(fj) < G_N_ELEMENTS(bitzi_fj_table)); - return Q_(bitzi_fj_tableUNSIGNED(fj)); -} - -void -bitzi_gui_update(const bitzi_data_t *bitzi_data) -{ - guint32 bitzi_debug; - - g_assert(bitzi_data != NULL); - - gnet_prop_get_guint32_val(PROP_BITZI_DEBUG, &bitzi_debug); - if (bitzi_debug > 10) - g_debug("bitzi_gui_update: data %p, size %s, " - "goodness %f, judgment %d, type %s, details %s", - cast_to_gconstpointer(bitzi_data), - uint64_to_string(bitzi_data->size), - bitzi_data->goodness, - bitzi_data->judgment, - NULL_STRING(bitzi_data->mime_type), - NULL_STRING(bitzi_data->mime_desc)); - - /* Update the various GUI elements */ - - search_gui_metadata_update(bitzi_data); -} - -char * -bitzi_gui_get_metadata(const bitzi_data_t *data) -{ - g_assert(data != NULL); - - /* - * Build string - */ - - if ( - data->judgment == BITZI_FJ_FAILURE || - data->judgment == BITZI_FJ_WRONG_FILESIZE - ) { - return h_strdup(bitzi_fj_to_string(data->judgment)); - } else if (data->mime_type) { - if (data->mime_desc) { - return h_strdup_printf("%s (%1.1f): %s (%s)%s%s", - bitzi_fj_to_string(data->judgment), - data->goodness, - data->mime_type, - data->mime_desc, - data->duration != 0 ? "; " : "", - data->duration != 0 ? short_time(data->duration) : ""); - } else { - return h_strdup_printf("%s (%1.1f): %s%s%s", - bitzi_fj_to_string(data->judgment), - data->goodness, - data->mime_type, - data->duration != 0 ? "; " : "", - data->duration != 0 ? short_time(data->duration) : ""); - } - } else if (data->judgment != BITZI_FJ_UNKNOWN) { - return h_strdup_printf("%s (%1.1f): %s", - bitzi_fj_to_string(data->judgment), - data->goodness, - _("No other data")); - } - - return NULL; -} - -/* -*- mode: cc-mode; tab-width:4; -*- */ -/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/bitzi.h
Deleted
@@ -1,45 +0,0 @@ -/* - * Copyright (c) 2004, Alex Bennee <alex@bennee.com> - * - *---------------------------------------------------------------------- - * This file is part of gtk-gnutella. - * - * gtk-gnutella 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 2 of the License, or - * (at your option) any later version. - * - * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software - * Foundation, Inc.: - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - *---------------------------------------------------------------------- - */ - -/** - * @ingroup gtk - * @file - * - * Bitzi GTK+ Headers. - * - * @author Alex Bennee <alex@bennee.com> - * @date 2004 - */ - -#ifndef _gtk_bitzi_h_ -#define _gtk_bitzi_h_ - -#include "if/ui/gtk/bitzi.h" - -const gchar *bitzi_fj_to_string(bitzi_fj_t fj); -gchar *bitzi_gui_get_metadata(const bitzi_data_t *bitzi_data); - -#endif /* _gtk_bitzi_h_ */ - -/* -*- mode: cc-mode; tab-width:4; -*- */ -/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/AUTHORS -> gtk-gnutella-1.1.9.tar.bz2/AUTHORS
Changed
@@ -84,6 +84,7 @@ fr - T'aZ <tazdev@altern.org> hu - Sulyok Péter <sp@elte.hu> it - Lorenzo Gaifas <lorenzo@artiemestieri.tn.it> + it - Lucio Marinelli <luciombox-1@yahoo.it> ja - Daichi Kawahata <daichik@users.sourceforge.net> nb - Alexander N. Sørnes <alex@thehandofagony.com> nl - Jeroen Asselman <jeroen@asselman.com>
View file
gtk-gnutella-0.98.2.tar.bz2/ChangeLog -> gtk-gnutella-1.1.9.tar.bz2/ChangeLog
Changed
@@ -1,3 +1,1103 @@ +# v 1.1.9 2016-03-06 stable + +This is mostly a bug-fixing release. + +It fixes an important bug in the UPnP discovery path that led to a crash when +it found more than one UPnP device on the network. + +It also introduces a new Glossary that can be displayed to explain some terms +that may be hard to understand for newcomers, so that they may in turn benefit +from the tooltips and the information in the FAQ. + +On Windows, one important change is that we now force all memory allocations +from the external DLLs to use our own malloc() implementation. This proves +that one of the DLLs is exhibiting a memory leak. Plugging that leak will +unfortunately require that a garbage collector be implemented. Measurements +indicate that 4K leak every second on average, which eventually leads to an +out-of-memory crash after a few days (2 to 3), preventing high uptimes on +Windows. The leak is not originating from gtk-gnutella's code. + +Improvements: +- GTK2 Added menu to display the new glossary window. + +Bug Fixes: +- Define PTHREAD_STACK_MIN to 0 in case it is not supplied by <pthread.h>. +- can_become_ultra(): don't account for upload fds if no upload will take place. +- compat_sleep_ms(): fixed the fallback implementation using compat_poll(). +- dht_route_parse(): ensure we never use uninitialized variables. +- entropy_collect_host(): no longer attempt to get the host IP addresses. +- file_locate_from_path(): if pathname is qualified, duplicate argument! +- ftw_foreach(): prevent memory leak on error path. +- thread_lock_deadlock(): avoid de-referencing NULL if possible. +- upnp_discovered(): avoid segfault when we have to pick the first device. + +Under the Hood: +- Disable warnings about the mem vtable being deprecated in recent glib. +- Suspend threads created after a global suspension is in effect. +- Warn when we cannot find a thread to record / release a lock. +- Added a new crash-level for deadlocks. +- Added optional debugging code to track reading threads on a read-write lock. +- Added spinlock_in_crash_mode_raw() for raw spinlocks to avoid deadly recursion. +- Additional debugging code to track read spots per thread on a read-write lock. +- Added backtrace capture when threads are contending for a lock. +- On deadlocks, suspend the other threads and log origin quickly before handling. +- New strategy in lock "deadlock" routines: ignore when in pass-through mode. +- Do not perturb the lock waiting state of the crashing thread on a deadlock. +- Revisited thread_lock_deadlock(). +- Check for stack overflowing each time a lock is grabbed and recorded. +- Added thread diversion support. +- Added thread_halt() to forcefully halt concurrently crashing threads. +- Refactored memory checks to avoid systematic locking in mem_is_valid_ptr(). +- Try to divert crash processing to main thread when triggered in a sub-thread. +- On deadlock condition, attempt to collect stacktraces of other threads. +- Add the current process PID and the last crash level to the crash log. +- Use raw logging routines in spinlock / mutex deadlock tracing. +- Added crash_getpid() for safe original PID computation, even across a fork(). +- Add dump of all the thread stacks to the crash log if we can't fork(). +- Moved equiv() and implies() definitions to "casts.h". +- Added xxx_to_string_grp() to optionally format xxx with thousand groupping. +- Adding win32 dynamic library patcher to trap malloc() in all required DLLs. +- Windows: with win32dlp, no need for monitoring committed memory. +- Renaming of legacy G_GNUC_XXX into G_XXX for concision. +- Renamed G_N_ELEMENTS as N_ITEMS. +- Moved gcc-specific macros to a dedicated file. +- Added pragmas to shut up spurious warnings with the clang 3.4.1 compiler. +- On the lock recording path, we can now use thread_get_element() safely. +- Made sure symbols are thread-safe and properly locked. +- If stacktrace dumps could intertwine, prefix the second with the thread ID. +- Allow for nested lock waiting sequences. +- Added SIGSYS to the list of harmful signals we want to catch. +- Added THREAD_F_WAIT to let thread_create() wait for the new thread to start. +- Windows: was not reconstructing correct stack frame pointer for WINAPI calls. +- Windows: improved backtracing through routines using a large amount of stack. +- Made signal_enter_critical() and signal_leave_critical() thread-safe. +- Made signal_in_handler() thread-safe. +- No longer block signals when waiting for a read-write lock. +- Prevent signals during logging, to avoid recursion if logging from handler. +- rwlock: when waiting for too long, deadlock only when no activity is seen. +- Added hash_table_is_locked(). +- Added compat_gettid() and use it to record the system thread ID. +- Added support for thread_interrupt() and thread_os_kill(). +- Windows: make sure s_read() can return EINTR and handle it properly. +- Windows: added support for sigprocmask(), sigsuspend() and friends. +- xmalloc: count and loudly trace allocation attempts made from signal handler. +- omalloc: loudly warn when invoked from signal handler. +- VMM: warn when memory allocation / freeing attempted from signal handler. +- VMM: use groupped formatting for region sizes or large numbers. +- Make sure we do not dispatch thread signals when running in an interrupt. +- Added s_minicarp_once() and a circular buffer to avoid memory allocation. +- Monitor when we issue blocking syscalls to flag signal handlers as safe/unsafe. +- Added plumbing to allow longjmp() or siglongjmp() in a signal handler. +- booleanize(): use version not causing any jump, for speed. +- clamp_strlen(): use same optimization as utf8_strlen() to compute length. +- mingw_analyze_prologue(): fixed MOVL immediate offset parsing. +- mingw_exception_log(): simplify processing on stack overflows. +- mingw_getdtablesize(): don't call _getmaxstdio(), hardwire 2048 instead. +- mingw_signal(): only call signal() for SIGSEGV. +- mingw_sigraise(): only log sent signal when asked to. +- mingw_waitpid(): fixed compilation warning given that WAIT_OBJECT_0 is 0. +- mingw_win2posix(): added mapping for ERROR_INVALID_USER_BUFFER. +- mingw_win2posix(): added mapping of ERROR_NO_SYSTEM_RESOURCES to ENOMEM. +- mingw_write(): for Windows 7 and maybe later, do not call write(). +- mutex_is_owned(): optimized by avoiding thread_self() call if mutex not locked. +- prop_save_to_file(): use file's timestamp, not the current time. +- rwlock_not_owned(): ignore errors when the rwlock layer is in pass-through. +- s_logv(): made recursion detection thread-safe. +- s_logv(): use raw time computation when running in signal handler. +- s_minierror(): enhanced to enter crash mode immediately and show thread ID. +- s_rawlogv(): force "raw" mode when running in a signal handler. +- s_stacktrace(): downgrade from decorated to plain stack before skipping traces. +- signal_name(): added more items to signals, so cache linear lookup result. +- spinlock_grab_try_from(): no crashing mode, don't say we locked if we couldn't. +- stacktrace_get_symbols(): make sure we're running this only once. +- stacktrace_unwind(): detect recursion in a thread-safe way. +- stacktrace_unwind(): use gcc-style unwinding if recursing or within malloc. +- str_vncatf(): added verbose assertion to ensure string is not overflowing. +- symbols_name_only(): simplified code. +- symbols_name_only(): simplify processing if we don't have to format an offset. +- thread_check_suspended(): account for thread_find() returning NULL. +- thread_cond_waiting_element(): don't create the cond stack until necessary. +- thread_exiting(): do not reset the QID range on Windows for an exiting thread. +- thread_id_name(): be robust if called during crashes. +- thread_launch_trampoline(): do not harvest entropy, this slows down creation. +- thread_lock_got_swap(): missed accounting of new lock in discovered thread. +- thread_lock_waiting_element(): warn when we detect recursive lock waiting. +- thread_preallocate_element(): also pre-allocate the lock stack. +- thread_sig_handle(): don't handle signals if thread is supposed to be blocked. +- thread_small_id(): bet on the QID lookup success. +- thread_sp(): simpler version defeating compiler optimizations. +- tm_localtime_raw(): use exact time, as this is used during logging. +- xmalloc_thread_alloc(): refuse to allocate if within a signal handler. + +# v 1.1.8 2015-12-18 stable + +This is an emergency bug-fixing release. + +It addresses systematic crashes on some platforms, right at startup time, +and prevents random deadlocks on OS/X. + +The systematic crash was due to an innocent change, which actually perturbed +the order of the initialization routines and, depending on the conditions, +caused an assertion failure during one of the thread startup. Curiously, the +error manifests randomly and does not seem to depend on the OS but rather on +other subtle environment issues: one Linux distribution could be fine whilst +another was hit by the bug. + +# v 1.1.7 2015-12-13 stable + +This release adds support for new features: + + - TLS upgrade of existing connections. + - Inbound HTTPS connections + - Use of a supervisor process to relaunch gtk-gnutella on crashes + +The TLS upgrade allows connections that have started without TLS to negotiate +TLS on the fly without having to reconnect. They are flagged as "e" to show +that encryption was dynamically added, as opposed to "E" which indicates an +initial TLS connection. + +Certificates are now automatically generated and this allows HTTPS connections +from browsers. For now this is of limited use, but it will come handy in the +near future when building a web-enabled GUI. + +To be more resilient against crashes, gtk-gnutella now automatically launches +a supervisor process that will launch the real gtk-gnutella as a child process +and monitor its fate, restarting a new process when the old one failed. This +is far more robust than having the process re-exec() itself at crash time since +there are some crashing conditions that do not even allow the process to go +that far in the crash handling... + +On Windows, provided you have installed Cygwin's gdb, crash logs will now +contain a gdb backtrace of the failing process, making analysis of what went +wrong easier than with a simple stack trace. + +Your previous GUID and KUID will be regenerated the next time you restart due +to a new algorithm used to detect that a configuration file is not accidentally +reused on another machine: the host name is now included, instead of just the +physical file information. So when moving a disk to another machine, or simply +cloning an existing virtual machine, we are no longer going to reuse these +IDs which are supposed to be unique by properly detecting that the information +was copied over. + +A bug in open_read() caused the Geo IP database to not be loaded on Windows. + +Finally, all the options given to gtk-gnutella can now be abbreviated as long +as they are not ambiguous (i.e. enough is given to make them non-ambiguous). +For instance, given the current set of options, --p would be ambiguous but --s +will always mean --shell. However, --pi is not ambiguous and refers to --ping. + +Improvements: +- By default, gtk-gnutella now supervises its children to restart them. +- Now allows incoming HTTPS connections. +- Added support for Gnutella connection upgrade to TLS. +- Added support of RFC-2817 for upgrading to TLS within HTTP/1.1. +- Dump symbolic stack when crashing in supervised mode with our parent. +- VMM: added new flag to signal OOM condition and be aggressive with the cache. +- Options can now be abbreviated as long as they are not ambiguous. +- Added support for Virtual Memory Emergency Allocation (VMEA). +- Pulled latest translations from Transifex. + +Bug Fixes: +- Make sure node_by_guid() cannot return a G2 node! +- VMM: fixed memory allocation logic during crashes. +- open_read(): fixed logic on Windows when no renaming is requested. +- Make sure we don't restart nor pause a failing process on --shell or --ping. + +Under the Hood: +- Added spopen(), a simple popen() bypassing the shell. +- Added Windows-specific PROT_GUARD protection type for mprotect(). +- Added log_show_pid() to direct the logging layer to show or hide the PID. +- Added library support for file locks. +- Added compat_process_exists() and compat_kill_zero(). +- Added ability to dynamically limit walloc() usage, remapping to xmalloc(). +- Added ability to disable halloc() at runtime, remapping it to xmalloc(). +- Added specific PID file for locking out the supervisor process. +- Do not install periodic xgc() and zgc() unless running in a long-term process. +- Refactored main() initializations to limit memory usage in the supervisor. +- Windows: stop fatal recursion when the VMM layer extends the pmap. +- Windows: revisited exception logging to give more details and simplify code. +- Windows: reworked stack overflow detection logic. +- Windows: added launch() and spopen() support. +- Windows: added support for wait() and waitpid() on launched processes. +- Windows: launch gdb in a separate thread to get symbols when crashing. +- Windows: re-worked early init code to allow memory allocation. +- Windows: will now be building with gnutls-3.4.5. +- Windows: added getppid() support. +- Windows: added getuid(), geteuid(), getgid() and getegid() emulations. +- Windows: try to have SymInitialize() done as soon as possible. +- Windows: added support for getrusage(RUSAGE_CHILDREN). +- Make sure the logic used to construct fallback path is consistent. +- Refactored Windows socket initialization. +- Refactored setproctitle(), adding getprogname() and setprogname() as well. +- Revisited crash_mode() to include the notion of criticity level. +- Switched rand31() to the Park and Miller algorithm. +- SDBM: added fadvise() hint for page accesses, with a "random" access mode. +- Use short_time_ascii() instead of short_time() in log messages. +- TLS: use our own random number generators. +- TLS: use new types, with the _t trailing prefix. +- TLS: added support for a global audit log, available since gnutls 3.0. +- TLS: added vectorized push routine. +- TLS: added generation of private server key at startup if missing. +- TLS: don't need anonymous server credentials if we have a certificate. +- TLS: added generation of self-signed certificate at startup if missing +- TLS: removed ARCFOUR-40 from the list of overrides for GnuTLS 3.4.5. +- TLS: enhanced to support GnuTLS 3.x and allow HTTPS connections. +- TLS: the "custom I/O" push/pull routines are now the norm. +- TLS: normalized logging to always use G_STRFUNC for non-informative messages. +- mingw_fcntl(): return ENOSYS for unimplemented parts, not EINVAL! +- mingw_fcntl(): added F_RDLCK (read-lock) support for F_SETLK operations. +- mingw_sigraise(): trace signal, since it could be the prelude to a crash. +- cq_init(): loudly warn if the callout queue was created automatically before. +- cq_init(): always warn if callout queue exists, regardless of its thread. +- pncs_convert(): avoid using the stack, prefer a thread-private buffer. +- sdbm_set_volatile(): forgot to grab lock on entry. +- sdbm_thread_datum(): avoid too many re-allocation overhead, sacrificing memory. +- thread_launch(): warn once if pthread_attr_setstacksize() returns an error. +- gwc_parse_dispatch_lines(): avoid using "eof", it shadows a global on Windows. +- thread_launch_register(): force new PROT_GUARD protection on red-zone page. +- shell_exec_thread_list(): use configured stack size if available. +- spinlock_crash_mode(): dump PID as well in case process forked. +- crash_invoke_inspector(): also attempt to launch gdb on Windows. +- crash_invoke_inspector(): force emission of decorated stacks. +- crash_generate_crashlog(): dump thread locks before current stack. +- settings_random_save(): now merge randomness instead of just superseding it. +- crash_init(): now calls stacktrace_init() with immediate symbol loading. +- mingw_exception(): maintain exception recursive depth per thread. +- signal_perform_cleanup(): trace signals we get during cleanup. +- mingw_signal(): be thread-safe, in case of concurrent updates. +- tm_init(): now controls whether to start the time thread. +- vxml_parser_remove_buffer(): application logic was done only when debugging! +- crash_try_reexec(): do not exec() ourselves when we have a supervising parent. +- node_can_accept_connection(): even when "offline", accept nearby hosts. +- tls_handshake(): log IP:port and whether remote is client or server. +- SHA1_process_message_block(): make sure SHA1 is correct on big-endian systems. +- node_is_now_connected(): watch out for disconnected nodes after RX injection. +- download_get_server_name(): when name changes, reset some internal attributes. +- entropy_seed(): make sure we're correctly seeding our KISS RNG. +- gtk_gnutella_atexit(): do nothing if we're already crashing. +- unique_file_token(): include the hostname into the unique file ID. +- kuid_random_fill(): use random_key_bytes() to generate unique KUID. +- file_locate_from_path(): tweaked for Windows to add implicit "." in PATH. +- xallocate(): when crashing, use omalloc() for small blocks, instead of sbrk(). +- hash_table_replace(): fixed logic when inserting into a fix-sized table. +- stack_print_decorated_to(): switch to lighter tracing if we hit an OOM. +- mingw_execve(): redesigned to avoid using external resources. + +# v 1.1.6 2015-11-08 stable + +This is a bug-fixing release. + +This time it focues on Windows, which apparently exercised some bugs in +common code with other platforms -- so some fixes are going to benefit to +everyone even though the bugs did not manifest themselves as often. + +Improvements: +- Increased default and max for "max_leaves" to account for modern systems. +- Pulled latest translations from transifex. +- Updated GeoIP databases. + +Bug Fixes: +- Fixed memory leak on the error path of OOB / G2 query hit sending. +- Fixed memory leak on the file upload path. +- aging_insert(): was not properly handling freeing of keys, causing leaks. +- Fixed property description message for "max_leaves". +- Windows: no HEAP_NO_SERIALIZE flag on HeapAlloc() since we're multi-threaded. +- mingw_valloc(): fixed monitoring of unreserved VM space. +- Windows: optimized the inital VM space reservation. +- rpc_delay(): avoid int overflowing, which would make delay negative! +- node_udp_sr_data_ind(): do not crash if UDP was disabled or port was 0. +- Fixed crashes in the omalloc() layer. + +Under the Hood: +- Make sure an initial GMT offset is computed before the time thread starts. +- Compact the aging structure on 64-bit platforms. +- Fixed possible race between evq_trampoline() and evq_event_discard(). +- Added safety assertions: a removed item must belong to the list. +- Fixed typos in safety assertions. +- EVQ: closed race condition betweeen queues recreated in same thread ID. +- Use getrlimit(RLIMIT_AS) to get the available space, not RLIMIT_DATA. +- Windows: try harder to compute a relevant break value with sbrk(0). +- Windows: added cpp trap for dup(). +- Windows: fixed fcntl(F_DUPFD) implementation which was not thread-safe. +- Windows: dump symbolic PC on stack overflows, after basic information. +- elist_remove(): assert that removed item must be part of some list. +- evq_event_discard(): be quiet when removing event for the event queue thread. +- evq_event_discard(): correctly handle cancelable events. +- evq_trampoline(): factorize removal of triggered item from queue list. +- evq_trampoline(): fixed logging message to use copied value. +- getgateway(): on Linux, cache previously computed value in case netlink fails. +- getgateway(): on Linux, the netlink socket can return EAGAIN on recv(). +- main_command_line(): optimized and simplified! +- malloc_init_vtable(): be sure to set G_SLICE=always-malloc on Windows. +- mingw_exception(): skip printing of stacktrace if we got a stack overflow. +- mingw_getrlimit(): implement a better RLIMIT_DATA query. +- mingw_getrlimit(): return different max / current values to account for usage. +- mingw_signal(): always record signal handler in our internal list of handlers. +- mingw_valloc(): don't complain about non-hinted allocations when crashing! +- mingw_valloc(): use s_minicarp() to limit resource consumption. +- mingw_valloc(): when nearing out-of-memory, take data segment into account. +- mingw_vmm_init(): accelerate initialization, reducing amount of system calls. +- mingw_win2posix(): handle 0 to avoid warnings when called with no error. +- mingw_win2posix(): mapped ERROR_BAD_EXE_FORMAT to ENOEXEC. +- mingw_win2posix(): mapped ERROR_NETNAME_DELETED to EHOSTUNREACH. +- mingw_win2posix(): use s_minicarp() instead of s_warning() to see "culprit". +- omalloc_allocate(): was releasing spinlock too soon in read-only mode. +- omalloc_chunk_allocate_from(): fixed bug when header dissolution was required. +- publisher_handle(): simplified code by factorizing shared_file_unref() call. +- s_minicarp() and s_minicrit(): carefully avoid stdio when dumping stack. +- sdbm_close(): ensure we sync pending dirty data when database is not volatile. +- sdbm_name(): return path to the .pag file if no name was explicitly given. +- settings_init(): when computing max VM space, use max from RLIMIT_AS, not cur. +- socket_create_and_bind(): on Linux systems, force SO_REUSEADDR before bind(). +- sort-test: reduce verbosity by default. +- thread_suspend_others(): silently suspends itself if concurrently asked to. +- udp_sched_write_error(): don't dump a stack trace on send errors we expect. + +# v 1.1.5 2015-10-08 stable + +This is a bug-fixing release. + +Most of these bugs were discovered by investigating why gtk-gnutella was +frequently crashing on OS/X platforms. Why other platforms were not having +the same problems remains a mystery, since all these bugs were not specific +to OS/X, apart from the vmm_munmap() bug -- since mmap() is only used on +OS/X due to its lack of the sendfile() system call. + +One of the fixed bugs could lead to a crash when the network connection was +broken (e.g. a cable unplugged or a WiFi connection terminated). + +Improvements: +- UHC: re-engineered the random choice of UHCs in the pre-established list. + +Bug Fixes: +- qrt_patch_compress_done(): fixed race with qrp_comp_done(). +- xmalloc: prevent deadlock when freeing deferred blocks on the allocation path. +- pmap_remove_from(): protect from exceptional corner case to avoid crash. +- ut_frag_pmsg_free(): don't requeue an unsent message synchronously. +- VMM: fixed race condition in vmm_munmap() that could lead to failures. +- omalloc: fixed chunk management when memory alignment is required. + +Under the Hood: +- well_state_discard(): fixed missing indexing of array pointer. +- thread-test: avoid mixed output by using atomic I/Os to stderr for messages. +- thread-test: main testing entry points now clearly flagged in output. +- signal_trampoline(): be verbose and lenient when our pre-condition fails. +- evq_event_discard(): fixed message to log the name of the registering thread. +- hash_list_lookup(): was mistakenly returning a const value. +- thread_private_set_extended(): ensure a NULL free routine clears any old one. +- crash_mode(): removed redundant call to thread_suspend_others(). +- rand31_random_seed(): avoid popcount(), prefer modulo with a prime number. +- hash_offset_init_once(): avoid entropy_minirand(), causes dealocks on Windows. +- uhc_send_ping(): if we cannot contact selected UHC, try with another one. +- omalloc_chunk_*protect(): ensure chunk is consistent with page boundaries. +- More assertions in omalloc() to ensure we're not corrupting memory. +- Use global mutex to protect symbols_xxx() calls, simplified stacktrace code. +- Reduced UHC retry time from 1 hour down to 3 minutes. +- Revised UHC list. +- More thread-safe refactoring for other stringification routines. + +# v 1.1.4 2015-09-09 stable + +This release is mostly a bug-fixing release. + +One major bug (leading to crash) was found in the G2 frame parsing layer: a +carefully crafted G2 packet sent to GTKG could crash it, leading to a Denial +of Service. For that reason, an upgrade to 1.1.4 is strongly recommended. + +The only major new feature is the added cleanups of the TTH cache and the +crash log directory, to make sure we do not keep useless files on the disk +forever. + +Because the Phex servent is no longer maintained, there is now a workaround +for that particular servent to ensure it can correctly download from GTKG. + +Improvements: +- GTK2 Added tri-state column sorting in "property editor" preference pane. +- GTK2 Show icon + warning message when we have no TCP listening socket. +- Added an "install-strip" target to all Makefiles to install with stripping. +- Can no longer edit properties flagged as "internal" through shell or GUI. +- Added new "session_start_stamp" property to hold the true starting time. +- Added support for TTH cache cleanup. +- Added automatic cleanup of the crash log directory. +- New shell command "random stats" to display the statistics on random layer. +- Workaround for Phex: always send X-Gnutella-Content-URN in upload replies. +- Updated GeoIP database. + +Bug Fixes: +- upnp_natpmp_discovered(): detect when UPnP layer was shutdown and abort. +- Fixed bad definition of XXTEA key, which led us to use only its first 4 bytes. +- node_g2_read(): need to only read 3 bytes usually to determine frame length. +- thread_sp(): tweaked to defeat gcc 5.x optimization leading to a NULL return. +- File moving: notify main thread as soon as file is completely copied. +- update_available_ranges(): lack of X-Available means file is full on server. + +Under the Hood: +- Windows: added getppid() and statvfs() emulation, plus rmdir() support. +- Improved the unpredictability of our random numbers. +- Loudly warn if attempting a file-descriptor operation on a revoked descriptor. +- Added compat_sendfile() with fallback to emulated version when necessary. +- Added compat_statvfs() for portability and code simplification. +- File moving operations now use sendfile() if available. +- XFMT: made it loudly clear that comment nodes are ignored for now. +- VMM: when debugging, trace large allocation spots. +- VMM: raised maximum page cache lifetime from 3 to 15 minutes. +- page_cache_find_pages(): treat user memory as if under short-term strategy. +- filepath_basename(): optimize code when G_DIR_SEPARATOR is '/'. +- Optimized CMP() to avoid branching regardless of the arguments. +- Added ftw_foreach() to traverse a file system and process each entry. +- mingw_readdir(): do not change errno if it was left untouched by _wreaddir(). +- Let mingw_{opendir,readdir,closedir} use normal types, not generic ones. +- mingw_stat(): added workaround for trailing "/" or "/." in paths. +- etree_traverse_internal(): minor optimization to avoid trailing +1 each time. +- Added etree_sort() and etree_sort_with_data() to sort children of all nodes. +- Changed signature of decoding base16 and base32 routines. +- Regenerated Configure to fix the fdopendir() compile test. +- Make sure pointer hashing distributes its trailing bits evenly. +- elist_merge_sort(): don't update tail, just do one single pass at the end. +- vmm_dump_pmap_log(): copy pmap data, then process dumping without locks. + +# v 1.1.3 2015-04-08 stable + +This is mainly a critical bug-fixing release, addressing a huge shortcoming +in 1.1.2: all Shareaza leaves are incorrectly flagged as being fakes and are +being removed quicktly from ultrapeers, creating network churn and instability. +Everyone running gtk-gnutella as Ultrapeer must upgrade to 1.1.3 quickly. + +Releasing quickly after 1.1.3 is also a pretext for improving stability on +Windows platforms, especially after restarts: because Windows does not support +the "close on exec" flag on file descriptors, restarted processes were left +with several instances of a listening socket bound to the same port, causing +havoc as behaviour is totally undefined and was most probably leading to the +inability for the process to get any incoming connections. + +On Windows, we now also monitor the memory usage more closely, in order to +avoid the C runtime from issuing a (blocking) popup signalling a fatal memory +allocation error should it run out of space. + +More generally, the VMM layer is now capable of trapping fatal memory +allocation errors and handling them more efficiently. In particular, when +everything has failed, the layer can request a brutal restart of the process. +Under less dire circumstances, a graceful restart will be requested. + +This was also an occasion to revisit the long-term allocation strategy in +the VMM layer and optimize it in order to further limit fragmentation of +the VM space. Even though avoiding fragmentation matters mostly for 32-bit +applications, this also limits the amount of individual memory region mappings +the kernel has to maintain and gtk-gnutella has to keep track of. + +Finally, a last-minute bug fix where a user reported a deadlock in the QRP +processing code. After investigation, it turned out that there was indeed +a recursive locking on a spinlock that had escaped all real-life testing out +there so far! + +Improvements: +- GTK2 Added popup menu icon in front of "force push mode" for sources. +- GTK2 Added warning icon in status bar when kernel runs short of net buffers. +- Increased default node connection timeout and size of the quick connect pool. +- Updated the shell "status" command to display "!IP" on net buffer shortage. +- Updated FAQ along with French and Turkish translations. +- Updated GeoIP databases. + +Bug Fixes: +- Fixed invalid test for "fake" Shareaza that led to network instabilities. +- Made QRP lock a mutex to allow for recursive locking through qrp_comp_done(). + +Under the Hood: +- On out-of-memory conditions, attempt to auto-restart if possible. +- Windows: monitor committed memory, crashing before the kernel would kill us. +- Added crash_restart() and controlling routines to request smooth restart. +- On network buffer shortage (ENOBUFS), stop TCP connections for a while. +- UPnP: protect upnp_mapping objects given to callbacks with reference counts. +- Adjusted lock tracking when locks are disabled, fixing lock swapping. +- Windows: remember socket descriptors so that we can close them on exec(). +- Refactored code for listening sockets to warn when bound port is already used. +- When shutdowning in "crash mode", skip most of the memory cleanup. +- rwlock_destroy(): make sure to write-unlock the lock if it was owned. +- waiter_ack(): don't panic if waiter was not notified, but loudly complain. +- upnp_map_natpmp_publish_reply(): trace given port on NAT-PMP mapping errors. +- upnp_discover(): force selection of IPv4 interface for UPnP discovery. +- thread_unsuspend_others(): relaxed hard assertion into a soft one. +- alloc_pages(): try harder on OOM conditions to allocate from the page cache. +- socket_connect_finalize(): fixed wrong errno processing for connect(). +- socket_connect_prepare(): no need for SO_REUSEADDR for connecting sockets. + +# v 1.1.2 2015-03-21 stable + +This is mainly a bug-fixing release, addressing rare crashes that have been +happening in production. It also contains several improvements. + +It fixes a user-reported bug whreby it was not possible to properly configure +the download paths using the GUI -- that led to application crashes due to +the incomplete support for discovered threads (which GTK is using underneath +to manage the dialog box). + +Another bug was caused by the HTTP header parsing logic which did not allow +"." in header names. That made it refuse to parse headers sent by some UPnP +devices, such as "BOOTID.UPNP.ORG" or "CONFIGID.UPNP.ORG", prevening UPnP +mappings from being installed. + +Hapening rarely but still annoying, there was a bug on the error handling path +of write errors to the TX network stack, leading to assertion failures in +the mq_tcp_putq() routine. That was because the qrt_compressed() routine +was not handling task cancellation properly. The likelyhood of hitting that +bug when running as a leaf node was very low. + +On the improvement side, the search list is now highlighting searches for +which we have associated downloads by displaying the text in green. Further +tweaks were made to our GTK2 code to make sure the changes are reported "real +time" when the state changes, which was not always the case before (one needed +to go over a search by explicitly clicking on it to update the display in +the search list). + +The SHA1 computation code was also further optimized to be as fast as possible, +reducing file hashing time by two! Since SHA1 hashing happens regularily +in gtk-gnutella to collect entropy, optimizing the SHA1 computation affects +more than just file verification. + +Improvements: +- GTK2 Added translation URL in the "About" GUI dialog. +- GTK2 Highlight searches with registered downloads by using green text. +- GTK2 Added tri-state column sorting to the "upload history" panel. +- FAQ: added new entry explaining how to get the magnet of a shared file. +- Map the "collection" G2 query tag to the Windows / Linux "archive" file set. +- Map the "torrent" G2 query tag to the "torrent" file set. +- Added support for "rom", "wordprocessing" and "subtitle" G2 query media types. +- Further optimized SHA1 computation, now going about twice faster for files. + +Bug Fixes: +- page_cache_insert_pages(): fixed incorrect write-lock upgrade logic. +- pmap_insert_region(): must recompute insertion index if we extend the pmap! +- tmalloc: fixed thread magazine accounting in the depots. +- Did not commit back to database after updating the DHT key request count. +- routing_chunk_move(): must check messages carefully when chunk was moved. +- route_message(): beware of check_duplicate() which can remove the node. +- thread_element_matches(): pay more attention to discovered threads. +- thread_find_tid(): skip thread elements not marked as being valid! +- node_shutdown_mode(): must correctly account for shutdowning G2 nodes! +- bogons_changed(): forgot to close opened file descriptor +- upload_stats_load_history(): added missing break in switch. +- qrt_compressed(): was not handling QRP compression task cancellation properly. + +Under the Hood: +- Added hostile ranges. +- Updated GeoIP databases for IPv4 and IPv6. +- Throttle the amount of PUSH messages we can send for a given remote server. +- Legitimate Shareaza nodes cannot be flagging themselves as ultrapeers. +- Windows: stack unwinding made safer with more memory checks to avoid faults. +- UPNP: attempt rediscovery of port mapping devices every hour, if missing one. +- UPNP: attempt rediscovery of port mapping devices every hour, if missing one. +- Added new TSIG_OVFLOW signal sent when a thread overflows its stack. +- Fixed race condition between concurrent waiter_refcnt_dec() calls. +- Added logging of layer which reports a TX error in case of assert failure. +- Track the last seen time (activity) of discovered threads other than main. +- Prevent glade-2 from outputting support files now, since we patched them. +- Added tracing of funny X-Falt lines we are seeing when demsh_debug is set. +- Added tracing of funny X-Alt lines we are seeing when dmesh_debug is set. +- Added tracing of funny X-Nalt lines we are seeing when dmesh_debug is set. +- Added crash hook for the thread layer. +- Added TX layer write-fault mechansim to help detect user error handling bugs. +- Syntaxic adjustments to make the latest guile happy with definitions. +- The GUI will now display current bandwidth by default, instead of the average. +- mingw_exception(): write shorter messages in case of stack overflows. +- thread_element_reset(): forgot to reset te->stack_base to NULL. +- header_append(): allow "." in header names. +- thread_join_internal(): no thread_cancel_test_element() on foreign thread! +- thread_find_element(): avoid leaving routine without unlocking mutex! +- cond_wait_until(): now correctly handle underlying cond variable mutation. +- thread_block_timeout(): don't panic if main thread already unblocked. +- dir_entry_filename(): made the Windows version thread-safe. +- hfield_dump(): fixed formatting of continuation lines. +- dmesh_collect_locations(): only parse the last timestamp when many given. +- xmalloc_thread_free(): always handle blocks in the cross-thread free list. +- Hide strtok_free(), forcing clients to use new strtok_free_null(). + +# v 1.1.1 2014-09-02 stable + +This is mostly a bug-fixing release. + +Improvements: +- Share Opus files by default, added opus and webm to search filters. +- No longer automagically unshare directories that do exist currently. +- Revamped peek/poke functions because GCC generated unoptimized code for these. + +Bug Fixes: +- Avoid crash when we cannot parse the remotely supplied push-proxy URL. +- Fixed crash when entering "local:" as search term. +- Fixed crash when gtk-gnutella was stopped from terminal and put to background. +- Fixed crash on "Reverse DNS lookup" queries from the GUI node pane. +- Fixed GtkSpinButton "adjustment with non-zero page size" deprecation message. +- Handle G_SEARCHPATH_SEPARATOR in shared base directory correctly. + +Under the Hood: +- shared_file_get_index(): fixed lower boundary of assertion. +- fi_find_aggressive_candidate(): prevent division by 0 if no starving download. +- Fixed possible race condition between bg_task_wakeup() and bg_sched_sleep(). +- Regenerated Configure to allow BFD library detection for newest versions. +- teq_post_rpc(): use linearily increasing timeouts to limit logging. +- str_vncatf(): made recursion checks before calling s_minicarp() thread-safe. +- ut_frag_pmsg_free(): avoid SIGSEGV when fragment was already acknowledged. +- deflate_add(): refuse further data when the TX deflate layer had an error. +- search_dequeue_all_nodes(): must also iterate on G2 nodes. +- cq_heartbeat(): only log delay adjustements when running with cq_debug > 0. +- g2_node_handle(): silence warnings when not debugging. +- Allow xfl_find_freelist_index() to work with gcc 4.9 and optimizations. +- keys_offload(): do not process if the key layer was shutdown. + +# v 1.1.0 2014-07-02 stable + +This is a major release introducing new features and making gtk-gnutella +a multi-threaded application with drastic performance boosts for background +tasks like file hashing or library rescanning. + +Another major feature is the added support for the G2 search protcol: we are +connecting to G2 hubs as a leaf, answer to search / browse requests from G2 +hosts. We also use G2 to issue our own searches. Finally, we freely exchange +files with G2 hosts (downloading and uploading). + +The G2 protocol was further extended to make sure G2 query hits convey as +much information as Gnutella query hits, in particular for alt-loc propagation +and TLS support. The G2 semi-reliable UDP layer is also leveraging the new +features designed for the corresponding Gnutella layer (cumulative and extended +acknowledgments), gracefully falling back to legacy features if the remote host +is not able to understand the new features. + +A critical bug was fixed: reception of carefully crafted invalid DHT messages +would lead to an immediate crash, an open door for Denial of Service (DoS) +attacks. That bug has been present since 0.97 (release of August 2011). + +Last but not least, the code base has now been checked by Coverity. There was +a very low defect rate of 0.26 (amount of true defects per thousand lines +of code) and all problems were fixed. + +New Features: +- Multi-threading support (file hashing, library rescan, DNS, etc...) +- Added support for the G2 search protocol, connecting as leaf mode to G2. +- Turned gtk-gnutella into a random number server through the "random" command. +- Removed Bitzi support since the service has shutdown. +- Added the --no-dbus command-line option to prevent D-BUS notifications. +- GTK Added GUI enabling of the G2 protocol for searches. +- GTK Added spin-button to set the amount of G2 hub connections to maintain. +- GTK Report amount of G2 hubs to which we are connected. +- GTK Show amount of G2 host browsing served, in the upload stats pane. + +Improvements: +- GTK2 Added tri-state column sorting to "Downloads" and "Uploads" panes. +- Better entropy collection to initialize the pseudo random number generators. +- Externally visible randomness (e.g. GUIDs) is now cryptographically strong. +- We now pick random DHT nodes to send back from the whole routing table +- Some entropy collected is persisted, for better reseeding in next session. +- Added time change detection when switching from/to Daylight Saving Time. +- QRP query routing now uses LimeWire's logic, less strict than the GTKG one. +- The shell "status" command now reports the amount of G2 hub connections. +- Detect OOB proxy MUID conflicts for leaf queries. +- Added the "stats drop" shell command to show dropped message statistics. +- Improved random selection of files being matched in the library (local hits). +- When a PUSH request fails to connect back, ban target IP:port for 5 minutes. +- Configure: correctly detect the BFD library even if no -liberty. +- Crash handler now records and logs the ID and name of crashing thread. +- Updated gtk-gnutella.appdata.xml to the latest specifications. +- Updated the FAQ, along with translations to French and Turkish. + +Bug Fixes: +- DHT bucket merging was incorrectly handling removal of nodes from table. +- Reception of improper DHT messages could lead to an immediate crash (DoS). +- ut_frag_pmsg_free(): rescheduling of expire event was in wrong block. +- base16_encode(): would cause buffer overflow when destination too small. +- Rotate OOB token keys less often, to avoid expiration whilst in transit. +- socket_udp_event(): ignore empty datagrams. +- Fixed host cache updates to avoid setting "out of bounds" property values. +- hcache_find_nearby(): was missing a "break" in the case for HOST_GUESS. +- Scheduled static checking by Coverity, found 81 problems requring a fix. +- Fixed TCP message size computing bug, which could corrupt the TCP stream. +- Configure: fixed endianess detection of IEEE-754 floats on Solaris. +- Was never configuring TCP quick ACKs due to a missing "break" statement. +- omalloc() could crash when configuring read-only objects. +- Ensure we never insert any "unusable host" in the push-proxy set. +- keys_update_value(): forgot to persist back updated expiration timestamp. +- Properly flag UDP route as deflatable when GGEP "Z" is seen in queries. +- Flag UDP route as supporting semi-reliable UDP when query flags are parsed. + +Under the Hood: +- GUESS now avoids querying hosts to which we are connected via TCP +- GUESS: count the amount of hosts reached by query, since G2 queries a cluster. +- GUESS: increased cached lifetime of query keys to a little less than 1 day. +- GUESS: defer hosts we cannot requery to avoid constantly looping over them. +- GUESS: fixed host atom leak when message is synchronously dropped. +- GUESS: invalidate cached query keys on IP or listening port change. +- Added a thread management layer on top of the POSIX thread layer. +- Added support for safe inter-thread signals, handled by our thread layer. +- Expanded the set of atomic operations we can perform. +- Added read-write locks, now used by the VMM layer. +- Addded multi-threaded goodies: barriers, dams, event queues, cond variables. +- VMM: closed race condition during allocations. +- Added support for permanent thread-private data. +- Added primitive fork() handling in a multi-threaded environment. +- Made float formatting code thread-safe, removing need for funnelling. +- The ADNS now always runs in a separate thread. +- Provide both thread-private (hashtable) and thread-local (array) variables. +- Added new "thread list" shell command to monitor running threads. +- Added "task list" shell command to list currently defined background tasks. +- Added the "thread stats" shell command to dump thread statistics. +- Added "lib show callout" shell command to display callout queue information. +- Added "lib show files" to show opened files via file_object_xxx(). +- Made sure PROTECT_ATOMS and ATOMS_HAVE_MAGIC are orthogonal settings. +- Moved the reference count of atoms to the tracking hash table. +- Callout queue runs the idle callbacks if not scheduled in the last 30 secs. +- Logging timestamps are now emitted with a millisecond accuracy. +- Improved g_assert_not_reached() to propagate the routine name as well. +- Re-architected file_objects to allow permission checking on opened files. +- Introducing tqsort(), a multi-threaded quicksort for sorting large arrays. +- Do not mark SIGPROF as harmful to allow profiling. +- Added a thread-magazine allocator, used by walloc() and vmm_alloc(). +- Allow execution of some shell commands in a separate thread. +- Added our own plain one-way and two-way list implementation. +- Added optimized item freeing for embedded lists holding walloc()'ed objects. +- Added thread-local ARC4 random streams for increased throughput. +- Added global and per-thread WELL and CMWC random number generators. +- Added Fortuna-like algorithm (AJE -- Alea Jacta Est) for gathering entropy. +- Added support for fixed-size hash tables, entirely held in a static buffer. +- hash_table_replace(): optimized to avoid two hash_table_find() calls. +- Protect query hit generation against concurrent library rescans. +- No longer close all file descriptors in main, since threads use them. +- Semi-reliable UDP: only send last fragment of large message to unknown hosts. +- Semi-reliable UDP: make sure remote side is ACK-ing sent fragments only. +- Semi-reliable UDP: avoid endless loops if unsent ACK message is dropped. +- Semi-reliable UDP: added TX accounting for dropped and physically sent ACKs. +- Semi-reliable UDP: was not releasing data structure for dropped ACKs. +- QRP support for generation of 1-bit patches, and optimized 1-bit handling. +- make_room_internal(): removed bug catcher from 2006, which never triggered. +- Cleaned up Gnutella handshaking to emit an Accept if the remote sent one. +- search_results_process(): do not record last hop as hostile on relayed hits. +- Do not attempt to OOB-proxy queries in search_request()! +- host_timer(): fixed wrong cut-off by "quick connect pool". +- Added script to auto-generate enums along with symbolic and English text. +- options_parse(): fixed parsing of values immediately following the option. +- Shuffling of large arrays now performed using PRNGs with greater period. +- Renamed "struct mutex" as "struct lmutex" to avoid conflicts on Solaris. +- st_search(): randomly shuffle results only when we have more than we can send. +- Windows: added emulated clock_gettime() and clock_getres(). +- Dispatch entropy to PRNGs only once every 30 seconds at most. +- Simplified rand31(), restoring its full period, and redesigned rand31_u32(). +- sdbm_rebuild(): was not properly catching errors during copy. +- prop_get_def(): switched to HCOPY_ARRAY() to avoid any size problems +- kmsg_handle(): avoid dereferencing a potentially NULL pointer. +- route_max_forward_ttl(): take a reference instead of a by-value parameter. +- parq_upload_remove(): fixed assertion, which was always evaluating to TRUE. +- Report errors if we cannot set a file non-blocking or request close on exec(). +- Base32 decoding could fail spotting bad input due to short base32_map array. +- search_matched(): was not counting the amount of skipped results in a search. +- getgateway(): properly fallback to netstat parsing when socket() fails. +- roots_fill_closest(): avoid memory leak on the error path. +- Fixed UDP TX schedulers to allow both IPv4 and IPv6 message sending. +- Make sure only developers will use autogen to regenerate the property files. +- dh_route(): only compress UDP query hits when GUESS queryier supports them. +- dh_route(): do not attempt UDP compression if message sent via reliable UDP. +- Count UDP compression attempts and failures, including in semi-reliable UDP. + +# v 1.0.1 2013-12-31 stable + +This is a minor release correcting a grave bug causing gtk-gnutella to think +all other gtk-gnutella out there are hostile. + +Other minor improvements are present, as well as low-level bug fixes. The +most visible change is that filenames with parentheses are now mangled to +have the parentheses turned into brackets, instead of being left as-is. This +allows filename cut-n-paste into shell commands, without having to use the +shell auto-completion to escape the parentheses. + +Improvements: +- Generate a NM/1.0 HTTP-like header at the top of the pre-computed nm list. +- GTK Avoid GUI flickering when widget sensitivity is changing quickly. +- Replace "()" with "" in filenames for easier cut-n-paste in shell commands. +- Windows: improved stack unwinding. + +Bug Fixes: +- Fixed grave bug, making all GTKGs appear hostile. +- qrp_close(): must disable periodic monitoring during shutdown. +- filename_to_utf8_normalized(): fixed broken if/else logic in loop. + +Under the Hood: +- Updated the GeoIP databases. +- Added a Keywords entry for lintian in the gtk-gnutella.desktop file. +- Fixed license link to point to GPL-2 on Debian systems. +- Added gtk-gnutella.appdata.xml for distributions that need such a file. +- Renamed icon.xpm as icon.48x48.xpm and icon.32x32.xpm as icon.xpm. +- TLS: disabled SVN signature verification code, since we no longer use SVN. +- Define our own G_STRFUNC, do not use the version from GLib. +- vmm_resize(): fixed wrong implementation when vmm_crashing is true. +- Semi-reliable UDP: drop traffic to host temporarily if we can't send messages. +- Use a 5-minute TLS ban to avoid reconnecting to host with TLS when it failed. +- download_mark_active(): do not reset fi->recv_last_rate on HTTP follow-ups +- bsched_heartbeat(): fixed wrong delay computatation, use tm_elapsed_ms(). +- gtk_gnutella_exit(): always emit final "cleanly exited" info. +- zalloc_stack_accounting_ctrl(): used wrong lookup key, leading to crashes. +- mingw_valloc(): handle initial non-hinted allocations larger than page. +- signal_trap_with(): fixed improper return value computation for sigaction(). + +# v 1.0.0 2013-09-01 stable + +This is a major release correcting a few bugs and adding small but interesting +features such as the ability to limit dropping of received UDP messages, +making the DHT keys and values persistent across sessions, SDBM file +auto-compaction at startup, and last but not least, rarest-chunk downloading +to optimize download efficiency when facing partial sources. + +New Features: +- Let users define a maximum lease time for UPnP and NAT-PMP mappings. +- Made DHT keys and values persistent across sessions. +- When there are partial sources for a file, download the rarest chunks first. + +Improvements: +- GTK1 Optimize massive updating of the download source list. +- GTK Dynamically update the list of available chunks in the file (blue line). +- Files used to persist information across sessions are now auto-compacted. +- The UPnP layer can now monitor more types of Internet Gateway Devices. +- After unclean shutdown, rename existing core file in crash directory. +- Detect servers that choke when receiving pipelined HTTP requests. +- Added the Mersenne Twister Pseudo-Random Number Generator. +- Remember when user requests an auto-restart, to keep the same session going. +- Increased maximum download buffer size to 1 MiB and default to 128 KiB. + +Bug Fixes: +- GTK2 Set height of the pref/upload window (paths to files) to 100 pixels. +- GTK1 Fixed wrong enum value usage (c_fi_sources instead of c_src_num). +- GTK Download source details were incorrect sometimes for queued downloads. +- GTK Reserve display of partial file indication (PFS) to partial sources. +- DHT traffic accounting was broken when semi-reliable UDP was introduced. +- Was wrongly keeping orphan DHT contacts and removing alive ones! +- Fixed wrong restarting DB key computation for DHT values (preventing crashes). +- Fixed improper "good" alt-loc flagging from uploaders, leading to wrong mesh. +- Fixed English typos in comments and user-visible messages. +- Avoid selecting the magic fw-fw file index for partial files in query hits. +- Fixed wrong propagation of duplicate messages with higher TTL. + +Under the Hood: +- Fixed posix_memalign() so that we can now run with glib 2.36 and upwards. +- GTK Update available ranges when the core sends a "range changed" event. +- Added UDP datagram read-ahead to minimize local kernel drops (RX queue full). +- Added UDP read-ahead statistics. +- Ensure "DHT values" and "DHT raw data" SDBM files are consistently reloaded. +- Fixed omalloc() memory usage accounting. +- str_at(): fixed harmful typo causing it to seg-fault with negative offsets. +- Do not send X-Features / X-Token on follow-up HTTP requests. +- upnp_dscv_probed(): plugged memory leak. +- UPNP: extract the Service Control Protocol Definition (SCPD) URL. +- UPNP: monitor gateway with GetStatusInfo() if no GetTotalPacketsReceived(). +- Some UPnP devices can advertize an API and yet return 401 (action invalid). +- bigkey_hash(): more robust in case we encounter a big key and support is off. +- udp_sched_write_error(): don't panic if we get an unexpected UDP write error. +- Jumbo patch: replaced most gm_vsnprintf() with str_vbprintf() calls. +- Count truncated incoming UDP messages. +- http_got_header(): fixed harmful typo causing mishandling of chunked output. +- After 3 X-Nalt reports, move source from download mesh to the banned mesh. +- Leave banned entries in the bad mesh for at least 5 minutes. +- cq_free(): release mutex to prevent loud warning a shutdown time. +- When the the crash handler child fails, append decorated stack from parent. +- download_data_received(): extend fileinfo when file size is unknown. +- Moved HTTP range parsing / handling from core to library (re-architectured). +- Benchmark sorting routines at startup and select the most efficient. +- socket_udp_flush_timer(): do not process queued datagrams during shutdown. +- Make rand31() more random, especially on the low-order bits. +- Added computation of chi-squared cumulative distributions. +- Made entropy_random() 5 times faster on average. +- Prefer random_value() over random_u32() followed by bit masking. +- The random layer now uses the Mersenne Twister, excepted for random_bytes(). +- hash_keyset_lookup(): was not always spotting first tomb correctly. +- Let small hash tables be denser than larger ones. +- Tweaked hash tables and derivatives for smaller memory footprint. +- guess_pmsg_free(): make sure pool does not contain host before adding it back. +- http_send_status(): was not properly detecting too large HTTP headers. +- Semi-reliable RX UDP: re-ack everything well before the whole message expires. +- Adjust maximum DHT value count per IP/network dynamically with DHT size. +- Be careful when truncating body on an HTTP kept-alive connection. +- ensure_unicity(): assume pidfile is locked when lock owner bears our PID. +- Added protection when writing important files on filesystems like "ext4". +- PARQ: accept to move an upload to the "dead" queue even if we wait for QUEUE. +- Made GTK2 the default GTK version since GTK1 is not 64-bit safe. + +# v 0.98.4 2012-11-04 stable + +This is an important release correcting severe bugs affecting the overall +wealth of the system: the PARQ upload queue was not properly restored, the +DHT was not always sending correct values back (resulting in failed lookups), +and SDBM (our hash-on-disk database) had two well-hidden bugs that could cause +crashes at startup or that compromised regular runtime operations. + +This release also introduces an interesting improvement: we are now using a +reliable UDP layer to transfer out-of-band query hits, ensuring that these +important messages are properly sent and received and never lost. + +The SPAM-detection on query hits received via UDP was too eager to discard +results from perfectly valid sources, causing improper loss of results from +your queries. + +We were also wrongly sending out more queries than necessary: a long-standing +bug caused locally-issued OOB-proxied queries to be re-emitted a second time, +and we were re-forwarding duplicate queries (received with higher TTL than +before) to all the leaves. Although not harmful, these two bugs were wasting +some of the outgoing bandwidth when running as a ultra node. + +New Features: +- Plugged support for "OOB Proxy Veto". +- Added a Semi-Reliable UDP layer for Gnutella for safe OOB hit delivery. +- Report and display available file size when handling hits for partial files. + +Internationalization: +- Added French and Turkish translations of the FAQ. +- Updated French and Turkish translations. +- Fixed typo in a German translation. +- Cleanup of the English FAQ, updating obsolete answers. + +Improvements: +- GTK Show different icon and tooltip when port mapping done through NAT-PMP. +- GTK Flag results from servents with a banned GUID in the "Info" column. +- GTK Windows version now compiled with GTK 2.24.10. +- Non-sharing servents can now be promoted to ultra peers (in automatic mode). +- Be stricter about vendor messages origin: ignore them if from wrong protocol. +- Strip GGEP "NP" key from relayed queries. +- Use higher-priority UDP messages for important or time-sensitive data. +- Use semi-reliable UDP to transfer critical data (query hits). +- Make sure the queries we OOB-proxy have a GGEP "SO" key for secure OOB hits. +- Ignore unsecure OOB hit promises from hosts known to support secure OOB. +- Use some of our connected ultra nodes when filling UHC pongs. +- Updated GeoIP databases. +- When resuming from crashes, do not stop session-only searches. +- Persist selected search media types from session to session. +- Report last modification time + available size of partial files in hits. +- Added "webm" and "zoo" to the list of file extensions that can be shared. +- Display unexpected command-line argument before usage output. +- The shell "status" command now shows how port mapping was done, if any. +- Do not forward "What's New?" queries to leaf nodes with empty routing tables. + +Bug Fixes: +- Avoid segmentation fault if GUESS 0.2 cache is empty. +- Avoid SDBM crash when clearing database which had big keys/values present. +- Use signed arithmetic to compute compression ratios. +- Consider x.x.x.0 as a possibly valid IPv4 address. +- Was not correctly parsing the saved PARQ queue, causing undue forgetting. +- Fixed key accounting in DBMW. +- SDBM was sometimes not iterating over unflushed dirty LRU pages. +- Fixed wrong DHT value response message format. +- Fixed crash when attempting to browse host on a queued source. +- Do not route duplicate queries with higher TTL to leaves. +- Prevent sending of duplicate (locally issued) OOB-proxied queries. +- Fixed startup crash bug on Ubuntu machines. +- Changed the Debian menu icon to use the one which is 32x32, as lintian wants. +- Fixed auto-restart function on 64-bit Windows. + +Under the Hood: +- GTK Darken the color used to display partial results (yellow -> dark gold). +- Various PARQ cleanup to smooth QUEUE callback operations. +- Fallback to pre-computed symbol file when loaded symbols are garbage. +- Relax file_path_set() and open_read() to gracefully handle relative paths. +- get_folder_basepath(): protect against unsuitable environment variables. +- Recompute the amount of banned fds dynamically as config parameters change. +- Detect series of unclaimed OOB hits from a host to ignore further queries. +- Changed MUID marking strategy in queries to better accomodate OOB proxying. +- Added a UDP TX scheduler to optimize datagram sending by priority. +- Enhanced the incremental zlib operations, reusing objects across operations. +- Added new official ISO 3166 country codes. +- node_read(): was wrongly resizing the message buffer for each message! +- Refactored aging table to lower memory footprint (by 6 pointers per entry). +- On Windows, keep last 3 stdout/stderr logs, created when launched from GUI. +- Send important UDP messages with a "control" priority. +- Count TCP push-proxy requests aimed at firewalled-to-firewalled connections. +- Patch UDP PUSH messages aimed at initiating firewall-to-firewall transfers. +- Count received PUSHes requesting FW-FW transfers, plus those targeting us. +- dht_init(): do not reset the KUID if DHT disabled at startup. +- Detect whether we are restarting after a clean shutdown or after a crash. +- bg_task_terminate(): don't panic at shutdown when handling unaccounted tasks. +- Reserve only about 40% of the available virtual memory space on Windows. +- Always discover port-mapping devices, even if they won't be used. +- Ensure reasonable TTL and hops for PUSH messages from UDP we will route. +- The shell "nodes" command now displays the gnet port along with the address. +- Added metaconfig check for malloc() superseding. +- New switch --disable-malloc added to build.sh to prevent superseding malloc(). +- When launching gdb during crash, ask for threads and thread stacks as well. +- External IP changes were not waiting for 3 hosts in 3 different CIDR ranges. +- Removed too restrive permissions in the man page (COPYRIGHT section). +- Shell meta-chars in executable path do not prevent loading symbols via BFD. +- Added more DHT statistics. + +# v 0.98.3 2012-06-04 stable + +New Features: +- GTK Added per-search GUESS statistics line, which can be hidden by users. +- GTK Display amount of downloads associated with search in the search label. +- Added property to control usage of unused Gnutella bandwidth by GUESS. +- Added "memory check xmalloc" shell command to monitor the xmalloc freelists. +- On Windows, generate a gdb-like stack trace in the crash log file. + +Improvements: +- GTK Optimized rendering of main statistics page. +- GTK Show more accurate message for queued downloads on completed files. +- Shell now displays properties with appropriate surrounding type markers. +- Limit pongs sent to transient nodes in order to save some bandwidth. +- Avoid sending too many pongs on uncompressed connections. +- Added README.Windows to document compile instructions for Windows. +- Avoid "write() failed: EPIPE" messages from the shell for local client writes. +- Added GUESS link cache size to the general statistics pane. +- GUESS now uses a dynamically computed outgoing bandwidth limit. +- Allow failed TLS connections to be retried without TLS, transparently. +- Added "-a" switch to the shell "version" command to display glib/GTK/TLS info. +- Added -p switch to the "stats" shell command to pretty-print numbers. +- Memory optimization of commonly used data structures to reduce footprint. +- Always generate a crashlog file, even when dumping a core. +- PARQ: switch actively queued download to another when file has been completed. +- Attempt to immediately restart download after failed SHA1 + TTH verification. +- At startup, compute TTH if available and SHA1 checking failed. +- When switching PARQ 1.0 downloads, switch IDs if queue position is favorable. +- Updated translation strings, and fixed French translation. + +Bug Fixes: +- bug #3286824 "Crash at startup / 0.96.9 / FreeBSD AMD64" +- Fixed %G formatting bug whereby a zero following a dot would be missed. +- Prevent auto-restart when they explicitly request a shutdown. +- Fixed grave bugs in the virtual memory layer, some being Windows-specific. +- PARQ was not properly computing amortized per-slot time. +- Avoid random shell connection failures on Windows. +- An un-parseable token in a shell command led to an assertion failure. +- Fixed the "alignment optimized" code branch of msort_with_tmp(). +- Fixed bad copy-n-paste that could lead to malloc() freelist corruption. +- Fixed GUESS corner-case crash when handling an RPC timeout. +- GTK Avoid crash when user clears the upload statistics (bug #3501181). +- On Windows, be smarter when reserving the initial amount of virtual space. +- GUESS: always wakeup sleeping queries if we have bandwidth. + +Under the Hood: +- Improved thread-safety of the VMM layer. +- Removed perl4-ism in Perl scripts. +- Updated IPv4 and IPv6 geo databases. +- Attempt to drive a deadlock crash as far as possible to collect debug info. +- When logging from another thread (not main), include the small thread ID. +- Switched halloc() to xpmalloc() instead of walloc(). +- Added thread-private zones for blocks <= 512 bytes for faster allocations. +- Optimized access to thread-private information, via a lock-free fast path. +- Exit with a zero status when terminating through a regular signal or request. +- Some UTF-8 optimizations and low-level fixes. +- Also log the faulting PC when we get a harmful signal. +- Use the BFD library, if available, to extract symbols from the executable. +- Restored ability to have usable stack unwinding on Windows. +- Extended crash log information to include full OS name and CPU architecture. +- Sort SHA1s in the search.xml file. +- Clear whole routing table when switching between Ultra and Leaf modes. +- Protect xfree() from algorithmic complexity when handling bursts. +- Added xmalloc garbage collector to reclaim fragments from freelist. +- Allow the "TLS handshake failed" string to be translated. +- Consider IPv4 addresses x.x.x.0 as non-routable. +- Now uses own hash table and hash set implementations. +- Strengthened entropy collection and ARC4 initial seeding. +- Randomly propagate GUESS 0.2 hosts among GUESS 0.2 servents. +- Assume we're not firewalled right after initial UPnP or NAT-PMP configuration. +- Avoid compiler warnings on Windows. +- Make sure random_value() returns uniformly distributed random numbers. +- Added ability to filter dumped traffic by IP address. +- Changed %F to display whole mantissa before switching to scientific notation. +- Ensure memory allocated from the heap is aligned properly. +- Show amount of detected CPUs at startup. +- Added version numbers to the crash log file name. +- Avoid complexity attacks on the hash table. + # v 0.98.2 2011-12-30 stable This is a minor patch to support systems running latest Ubuntu systems,
View file
gtk-gnutella-0.98.2.tar.bz2/Configure -> gtk-gnutella-1.1.9.tar.bz2/Configure
Changed
@@ -14,11 +14,11 @@ # Note: this Configure script was generated automatically. Rather than # working with this copy of Configure, you may wish to get metaconfig. # The dist package (which contains metaconfig) is available via SVN: -# svn co https://svn.sourceforge.net/svnroot/dist/trunk/dist +# svn co https://svn.code.sf.net/p/dist/code/trunk/dist -# $Id: Head.U 41 2010-11-28 00:21:26Z rmanfredi $ +# $Id: Head.U 167 2013-05-08 17:58:00Z rmanfredi $ # -# Generated on Fri Dec 30 11:48:34 CET 2011 metaconfig 3.5-110 +# Generated on Sat Jan 23 12:12:15 CET 2016 metaconfig 3.5-200 cat >c1$$ <<EOF ARGGGHHHH!!!!! @@ -250,6 +250,7 @@ uniq='' uuname='' vi='' +wc='' xgettext='' zcat='' zip='' @@ -286,6 +287,7 @@ bin='' binexp='' installbin='' +byteorder='' cc='' ccflags='' cppflags='' @@ -293,8 +295,10 @@ lkflags='' locincpth='' optimize='' +pthread='' cf_by='' cf_time='' +charsize='' contains='' cpp_quote='' cpp_stuff='' @@ -312,19 +316,40 @@ d_backtrace='' d_bcmp='' d_bcopy='' +d_bfd_lib='' d_bindtxtcode='' +d_bsearch='' +d_built_bswap32='' +d_built_bswap64='' +d_built_clz='' +d_built_ctz='' d_built_popcount='' d_bzero='' +d_clearenv='' +d_clock_getres='' +d_clock_gettime='' d_closefrom='' d_const='' d_deflate='' d_dev_poll='' +d_difftime='' +use_difftime='' +d_dirent_d_namlen='' d_dirent_d_type='' +d_dirfd='' +d_dladdr='' d_end_symbol='' d_epoll='' d_etext_symbol='' d_fast_assert='' +d_fchdir='' +d_fdatasync='' +d_fdopendir='' d_fork='' +d_fstatat='' +d_fsync='' +d_ftime='' +d_gettimeod='' d_getaddrinfo='' d_geteuid='' aphostname='' @@ -334,7 +359,12 @@ d_getifaddrs='' d_getinvent='' d_getlogin='' +d_getnameinfo='' d_getppid='' +d_getprogname='' +d_getpwnam='' +d_getpwuid='' +d_getrlimit='' d_gettext='' d_getuid='' d_gnulibc='' @@ -343,6 +373,8 @@ d_herror='' d_hstrerror='' d_iconv='' +d_ieee754='' +ieee754_byteorder='' d_inflate='' d_iptos='' d_ipv6='' @@ -355,12 +387,15 @@ d_memalign='' d_memcpy='' d_memmove='' +d_mempcpy='' d_mmap='' d_msghdr_msg_flags='' d_nanosleep='' d_nls='' d_open3='' +d_openat='' d_pause='' +d_pipe2='' d_poll='' d_popen='' d_portable='' @@ -368,6 +403,8 @@ d_posix_memalign='' d_pread='' d_preadv='' +d_proginvocname='' +d_ptattr_setstack='' d_pwrite='' d_pwritev='' d_recvmsg='' @@ -375,11 +412,19 @@ d_regparm='' d_rusage='' d_sbrk='' +d_sched_yield='' d_select='' +d_semctl='' +d_semget='' +d_semop='' +d_semtimedop='' d_sendfile='' +d_setenv='' d_setproctitle='' +d_setprogname='' d_setsid='' d_sigaction='' +d_sigaltstack='' d_sigprocmask='' d_sigsetjmp='' d_sockaddr_in_sin_len='' @@ -387,6 +432,11 @@ d_socker_get='' sockercflags='' sockerldflags='' +d_oldsock='' +d_socket='' +d_sockpair='' +sockethdr='' +socketlib='' d_statfs='' d_statvfs='' d_index='' @@ -394,12 +444,17 @@ d_strlcat='' d_strlcpy='' d_sync_atomic='' +d_syscall='' d_sysctl='' d_system='' clocktype='' d_times='' d_ttyname='' +d_uctx_mctx='' +d_uctx_mctx_gregs='' d_usleep='' +d_vfork='' +usevfork='' d_voidsig='' signal_t='' d_volatile='' @@ -445,6 +500,7 @@ d_dirnamlen='' direntrytype='' i_dirent='' +i_dlfcn='' i_execinfo='' i_fcntl='' i_iconv='' @@ -476,21 +532,25 @@ d_pwquota='' i_pwd='' i_regex='' +i_sched='' i_stdlib='' i_string='' strings='' i_sysfile='' +i_sysipc='' i_sysmman='' i_sysmount='' i_sysparam='' i_syspoll='' i_sysresrc='' i_sysselct='' +i_syssem='' i_syssendfile='' i_syssock='' i_sysstat='' i_sysstatvfs='' i_syssysctl='' +i_systimeb='' i_systimes='' i_systypes='' i_sysun='' @@ -501,6 +561,8 @@ i_systimek='' i_time='' timeincl='' +i_sys_ucontext='' +i_ucontext='' i_unistd='' i_stdarg='' i_varargs='' @@ -508,8 +570,16 @@ i_winsock2='' i_ws2tcpip='' i_zlib='' +d_can64='' +d_ilp32='' +d_ilp64='' +d_lp64='' +ilp='' install='' installdir='' +intsize='' +longsize='' +shortsize='' issymlink='' libc='' libnames='' @@ -528,6 +598,12 @@ locale='' localeexp='' make_set_make='' +d_mymalloc='' +freetype='' +mallocobj='' +mallocsrc='' +malloctype='' +usemymalloc='' installmansrc='' manext='' mansrc='' @@ -565,6 +641,7 @@ privlib='' privlibexp='' prototype='' +ptrsize='' d_remotectrl='' remotectrl='' sh='' @@ -664,7 +741,7 @@ defvoidused=15 : private initializations -libswanted="sendfile z resolv iconv m intl" +libswanted="bfd iberty sendfile z resolv iconv m intl dl" : Find the basic shell for Bourne shell scripts case "$sh" in @@ -974,7 +1051,7 @@ esac shift ;; - -V) echo "$me generated by metaconfig 3.5-110." >&2 + -V) echo "$me generated by metaconfig 3.5-200." >&2 exit 0;; --) break;; -*) echo "$me: unknown option $1" >&2; shift; error=true;; @@ -1040,8 +1117,13 @@ true) exec 1>/dev/null;; esac -: run the defines and the undefines, if any, but leave the file out there... touch optdef.sh +if grep -q '\\' optdef.sh >/dev/null 2>&1; then + echo "Configure does not support \\ in -D or -U arguments" >&2 + exit 1 +fi + +: run the defines and the undefines, if any, but leave the file out there... . ./optdef.sh : create the posthint manipulation script and leave the file out there... touch posthint.sh @@ -1151,6 +1233,7 @@ cat >extract <<EOS CONFIG=true SRC="$src" +TOP=`cd ..; pwd 2>/dev/null` EOS cat >>extract <<'EOS' echo "Doing variable substitutions on .SH files..." @@ -1624,6 +1707,7 @@ nroff test uname +wc xgettext " pth=`echo $PATH | sed -e "s/$p_/ /g"` @@ -1642,7 +1726,7 @@ '') xxx=`./loc $file $file $pth`;; *) xxx=`./loc $xxx $xxx $pth`;; esac - eval $file=$xxx$_exe + eval $file=$xxx eval _$file=$xxx case "$xxx" in /*) @@ -1675,7 +1759,7 @@ '') xxx=`./loc $file $file $pth`;; *) xxx=`./loc $xxx $xxx $pth`;; esac - eval $file=$xxx$_exe + eval $file=$xxx eval _$file=$xxx case "$xxx" in /*) @@ -1691,21 +1775,21 @@ esac done case "$egrep" in -egrep$_exe) +egrep$_exe|egrep) echo "Substituting grep for egrep." egrep=$grep _egrep=$_grep ;; esac case "$ln" in -ln$_exe) +ln$_exe|ln) echo "Substituting cp for ln." ln=$cp _ln=$_cp ;; esac case "$make" in -make$_exe) +make$_exe|make) case "$gmake" in gmake) echo "I can't find make or gmake, and my life depends on it." >&4 @@ -1716,7 +1800,7 @@ ;; esac case "$gmake" in -gmake$_exe) ;; +gmake$_exe|gmake) ;; *) if test -f "/system/gnu_library/bin/ar.pm"; then : Stratus VOS @@ -1727,7 +1811,7 @@ ;; esac case "$gmsgfmt" in -gmsgfmt$_exe) +gmsgfmt$_exe|gmsgfmt) echo "Substituting msgfmt for gmsgfmt." gmsgfmt=$msgfmt _gmsgfmt=$_msgfmt @@ -1744,7 +1828,7 @@ ;; esac case "$xgettext" in -xgettext$_exe) +xgettext$_exe|xgettext) xgettext=":" _xgettext=":" ;; @@ -1909,6 +1993,7 @@ : determine whether symbolic links are supported echo " " $rm -f blurfl sym +$touch blurfl if $ln -s blurfl sym > /dev/null 2>&1 && $test -f sym; then echo "Symbolic links are supported." >&4 lns="$ln -s" @@ -2425,6 +2510,7 @@ saved_osname="$osname" saved_osvers="$osvers" +saved_libswanted="$libswanted" tmp_n="$n" tmp_c="$c" tmp_sh="$sh" @@ -2477,7 +2563,7 @@ : Restore computed paths for file in $loclist $trylist; do - eval $file="\$_$file"$_exe + eval $file="\$_$file" done osname="$saved_osname" @@ -2485,6 +2571,12 @@ n="$tmp_n" c="$tmp_c" +case "$libswanted" in +"$saved_libswanted") ;; +*) libs='';; +esac +libswanted="$saved_libswanted" + . ./checkcc case "$targetarch" in '') ;; @@ -3072,296 +3164,6 @@ d_archlib="$define" fi -: set up the script used to warn in case of inconsistency -cat <<EOS >whoa -$startsh -EOS -cat <<'EOSC' >>whoa -dflt=y -echo " " -echo "*** WHOA THERE!!! ***" >&4 -echo " The $hint value for \$$var on this machine was \"$was\"!" >&4 -rp=" Keep the $hint value?" -. ./myread -case "$ans" in -y) td=$was; tu=$was;; -esac -EOSC - -: function used to set '$1' to '$val' -setvar='var=$1; eval "was=\$$1"; td=$define; tu=$undef; -case "$val$was" in -$define$undef) . ./whoa; eval "$var=\$td";; -$undef$define) . ./whoa; eval "$var=\$tu";; -*) eval "$var=$val";; -esac' - -: determine whether this is an official build -case "$official" in -false) - official=false - val="$undef" - - ./warn 'This build will not be suitable for distribution.' 4>&4 - -;; -*) - val="$define" - official=true - ;; -esac -set d_official -eval $setvar - -: ask them whether they want remote control support -$cat <<EOM - -$spackage has a raw remote control service. - -Currently you can create searches, connect to nodes, and print and -set the values of properties as well as read the 'tooltips'. It is -not completely functional, but you may choose to enable it here at -compile time. The feature will need activation from the GUI. - -For more information, see doc/other/shell.txt - -EOM -case "$remotectrl" in -true) dflt=y;; -*) dflt=n;; -esac -rp="Enable remote control service" -. ./myread -val="$ans" -case "$ans" in -y) val="$define";; -*) val="$undef";; -esac -set d_remotectrl -eval $setvar -case "$d_remotectrl" in -$define) remotectrl=true;; -*) remotectrl=false;; -esac - -: look whether they wish to run headless -$cat <<EOM - -$spackage can run without any GUI interface in so-called "headless" mode. -Therefore, monitoring of operations for $package will have to be done -without relying on any GUI, and the configuration is done via files only. - -EOM -case "$d_headless" in -"$define") dflt=y;; -*) dflt=n;; -esac -rp="Run without any GUI interface" -. ./myread -case "$ans" in -y) val="$define";; -*) val="$undef";; -esac -set d_headless -eval $setvar - -: ask them wich GTK+ version they want -echo " " -case "$d_headless" in -"$define") - echo "Turning off GTK+ since you want to run without any GUI" >&4 - d_usegtk1="$undef"; - d_usegtk2="$undef"; - ;; -*) - $cat <<'EOM' -I can compile for the GTK+ 1.x version or for the GTK+ 2.x version. -The GTK1 frontend will use much less CPU than the GTK2 one, so if you -have a slow CPU, you are encouraged to choose GTK1. - -EOM - case "$gtkversion" in - '') dflt=1;; - 2) dflt=2;; - *) dflt=1;; - esac - rp="Use which GTK toolkit (1 or 2)" - . ./myread - case "$ans" in - 2) - gtkversion=2; gtkpackage=gtk+-2.0 - d_usegtk2="$define"; d_usegtk1="$undef";; - *) - gtkversion=1; gtkpackage=gtk+ - d_usegtk1="$define"; d_usegtk2="$undef";; - esac - ;; -esac - -: decide which version of GLib to use -- tied to the choice of GTK -case "$gtkversion" in -1) ver=1;; -*) ver=2;; -esac -case "$ver" in -2) - glibversion=2; glibpackage="glib-2.0 gobject-2.0" - d_useglib2="$define"; d_useglib1="$undef";; -*) - glibversion=1; glibpackage=glib - d_useglib1="$define"; d_useglib2="$undef";; -esac - -: determine where public executables go -echo " " -set dflt bin bin -eval $prefixit -fn=d~ -rp='Pathname where the public executables will reside?' -. ./getfile -if $test "X$ansexp" != "X$binexp"; then - installbin='' -fi -bin="$ans" -binexp="$ansexp" -if $afs; then - $cat <<EOM - -Since you are running AFS, I need to distinguish the directory in which -executables reside from the directory in which they are installed (and from -which they are presumably copied to the former directory by occult means). - -EOM - case "$installbin" in - '') dflt=`echo $binexp | sed 's#^/afs/#/afs/.#'`;; - *) dflt="$installbin";; - esac - fn=de~ - rp='Where will public executables be installed?' - . ./getfile - installbin="$ans" -else - installbin="$binexp" -fi - -: determine where manual pages are on this system -echo " " -case "$sysman" in -'') - syspath='/usr/share/man/man1 /usr/man/man1' - syspath="$syspath /usr/man/mann /usr/man/manl /usr/man/local/man1" - syspath="$syspath /usr/man/u_man/man1 /usr/share/man/man1" - syspath="$syspath /usr/catman/u_man/man1 /usr/man/l_man/man1" - syspath="$syspath /usr/local/man/u_man/man1 /usr/local/man/l_man/man1" - syspath="$syspath /usr/man/man.L /local/man/man1 /usr/local/man/man1" - sysman=`./loc . /usr/man/man1 $syspath` - ;; -esac -if $test -d "$sysman"; then - echo "System manual is in $sysman." >&4 -else - echo "Could not find manual pages in source form." >&4 -fi - -: determine where manual pages go -set mansrc mansrc none -eval $prefixit -$cat <<EOM - -$spackage has manual pages available in source form. -EOM -case "$nroff" in -nroff) - echo "However, you don't have nroff, so they're probably useless to you." - case "$mansrc" in - '') mansrc="none";; - esac;; -esac -echo "If you don't want the manual sources installed, answer 'none'." -case "$mansrc" in -'') - lookpath="$prefixexp/share/man/man1 $prefixexp/man/man1" - lookpath="$lookpath $prefixexp/man/u_man/man1 $prefixexp/man/l_man/man1" - lookpath="$lookpath /usr/local/man/man1 /opt/man/man1 /usr/man/manl" - lookpath="$lookpath /usr/share/man/man1 /usr/local/share/man/man1" - lookpath="$lookpath /usr/man/local/man1 /usr/man/l_man/man1" - lookpath="$lookpath /usr/local/man/u_man/man1 /usr/local/man/l_man/man1" - lookpath="$lookpath /usr/man/man.L" - mansrc=`./loc . $prefixexp/man/man1 $lookpath` - if $test -d "$mansrc"; then - dflt="$mansrc" - else - dflt="$sysman" - fi - set dflt - eval $prefixup - ;; -' ') dflt=none;; -*) dflt="$mansrc" - ;; -esac -echo " " -fn=dn~ -rp='Where do the manual pages (source) go?' -. ./getfile -if test "X$mansrcexp" != "X$ansexp"; then - installmansrc='' -fi -mansrc="$ans" -mansrcexp="$ansexp" -case "$mansrc" in -'') mansrc=' ' - installmansrc='';; -esac -if $afs && $test "$mansrc"; then - $cat <<EOM - -Since you are running AFS, I need to distinguish the directory in which -manual pages reside from the directory in which they are installed (and from -which they are presumably copied to the former directory by occult means). - -EOM - case "$installmansrc" in - '') dflt=`echo $mansrcexp | sed 's#^/afs/#/afs/.#'`;; - *) dflt="$installmansrc";; - esac - fn=de~ - rp='Where will man pages be installed?' - . ./getfile - installmansrc="$ans" -else - installmansrc="$mansrcexp" -fi - -case "$mansrc" in -' ') manext='0';; -*l) manext=l;; -*n) manext=n;; -*o) manext=l;; -*p) manext=n;; -*C) manext=C;; -*L) manext=L;; -*L1) manext=L1;; -*) manext=1;; -esac - -: Determine the C compiler to be used -echo " " -case "$cc" in -'') dflt=cc;; -*) dflt="$cc";; -esac -rp="Use which C compiler?" -. ./myread -cc="$ans" - -: See whether they have no cc but they do have gcc -. ./trygcc -if $test -f cc.cbu; then - . ./cc.cbu -fi -. ./checkcc - : make some quick guesses about what we are up against echo " " $echo $n "Hmm... $c" @@ -3492,6 +3294,47 @@ $eunicefix bsd usg v7 osf1 eunice xenix venix dos os2 gnu linux windows $rm -f foo +: set up the script used to warn in case of inconsistency +cat <<EOS >whoa +$startsh +EOS +cat <<'EOSC' >>whoa +dflt=y +echo " " +echo "*** WHOA THERE!!! ***" >&4 +echo " The $hint value for \$$var on this machine was \"$was\"!" >&4 +rp=" Keep the $hint value?" +. ./myread +case "$ans" in +y) td=$was; tu=$was;; +esac +EOSC + +: function used to set '$1' to '$val' +setvar='var=$1; eval "was=\$$1"; td=$define; tu=$undef; +case "$val$was" in +$define$undef) . ./whoa; eval "$var=\$td";; +$undef$define) . ./whoa; eval "$var=\$tu";; +*) eval "$var=$val";; +esac' + +: Determine the C compiler to be used +echo " " +case "$cc" in +'') dflt=cc;; +*) dflt="$cc";; +esac +rp="Use which C compiler?" +. ./myread +cc="$ans" + +: See whether they have no cc but they do have gcc +. ./trygcc +if $test -f cc.cbu; then + . ./cc.cbu +fi +. ./checkcc + : Check whether they have gcc in any guise. echo " " echo "Checking for GNU cc in disguise and/or its version number..." >&4 @@ -3849,6 +3692,34 @@ 'none') optimize=" ";; esac +: see whether we need -pthread at the compile/link stage +case "$pthread" in +''|$undef) + $cat > try.c <<'EOF' +int main() { return 0; } +EOF + if $cc -pthread -c try.c >/dev/null 2>&1; then + dflt='-pthread' + else + dflt='none' + fi + ;; +*) dflt="$pthread";; +esac +$cat <<EOH + +Some C compilers need to have special flags supplied at compile and link time +to be able to generate code that will work correctly with POSIX threads. +When no specific flags are required, specify the word "none". + +EOH +rp="What thread-support compiler/linker flag should be used?" +. ./myread +pthread="$ans" +case "$pthread" in +'none') pthread="";; +esac + dflt='' : We will not override a previous value, but we might want to : augment a hint file @@ -4042,7 +3913,7 @@ : coherency check echo " " echo "Checking your choice of C compiler and flags for coherency..." >&4 -set X $cc $optimize $ccflags $ldflags -o try try.c +set X $cc $optimize $pthread $ccflags $ldflags -o try try.c shift $cat >try.msg <<EOM I've tried to compile and run a simple program with: @@ -4092,73 +3963,6 @@ esac $rm -f try try.* core -: see whether the try.c file compiles and links -trylink=' -var=$1; -shift; -val=$undef; -file=trylink.log; -nparams=$#; -case "$cyn" in -"") msg="";; -*" "*) msg="$cyn"; yes=yes; no=no;; -*) - case "$var" in - d_*) msg="for $cyn()"; yes=found; no=missing;; - i_*) msg="for <$cyn>"; yes=found; no=missing;; - *) msg="$cyn"; yes=yes; no=no;; - esac - ;; -esac; -case "$cyn" in -"") echo "--- $var ---" >> "$file";; -*) - echo " "; $echo $n "Checking $msg...$c" >&4; - echo "--- $var --- ($msg)" >>"$file" - ;; -esac; -$cat try.c >> "$file"; -while :; do - if $cc $ccflags -o try try.c $ldflags $1 >> "$file" 2>&1; then - case "$nparams" in 0) ;; *) echo "==> OK with \"$1\"" >> "$file";; esac; - val=$define; - break; - fi; - if $test $# -lt 1; then - break; - fi; - echo "==> FAILED with \"$1\"" >> "$file"; - shift; -done; -$rm -rf try try.*; -echo "==> $var=$val" >> "$file"; -case "$cyn" in -"") ;; -*) - case "$val" in - "$define") echo " $yes." >&4;; - *) echo " $no." >&4;; - esac - ;; -esac; -set $var; eval $setvar; -cyn="" -' - -: see if gettext exists -$cat >try.c <<EOC -#include <libintl.h> -int main(void) -{ - static char ret; - ret |= *gettext("msgid"); - return ret ? 0 : 1; -} -EOC -cyn=gettext -set d_gettext -lintl -eval $trylink - : determine filename position in cpp output echo " " echo "Computing filename position in cpp output for #include directives..." >&4 @@ -4265,6 +4069,536 @@ set $yyy; shift; shift; yyy=$@; done' +: see if this is a malloc.h system +set malloc.h i_malloc +eval $inhdr + +: see if stdlib is available +set stdlib.h i_stdlib +eval $inhdr + +: compute shared library extension +case "$so" in +'') + if xxx=`./loc libc.sl X $libpth`; $test -f "$xxx"; then + dflt='sl' + else + dflt='so' + fi + ;; +*) dflt="$so";; +esac +$cat <<EOM + +On some systems, shared libraries may be available. Answer 'none' if +you want to suppress searching of shared libraries for the remainder +of this configuration. + +EOM +rp='What is the file extension used for shared libraries?' +. ./myread +so="$ans" + +: Define several unixisms. +: Hints files or command line option can be used to override them. +case "$_a" in +'') _a='.a';; +esac +case "$_o" in +'') _o='.o';; +esac + +: Looking for optional libraries +echo " " +echo "Checking for optional libraries..." >&4 +case "$libs" in +' '|'') dflt='';; +*) dflt="$libs";; +esac +case "$libswanted" in +'') libswanted='c_s';; +esac +case "$usesocks" in +"$define") libswanted="$libswanted socks5 socks5_sh" ;; +esac +echo "extern void abort(void); int main(void) { abort(); return 0; }" > lt.c +libsfound='' +libsfiles='' +libsdirs='' +libspath='' +for thisdir in $libpth $xlibpth; do + test -d $thisdir && libspath="$libspath $thisdir" +done +for thislib in $libswanted; do + for thisdir in $libspath; do + xxx='' + if $test ! -f "$xxx" ; then + xxx=`ls $thisdir/lib$thislib.$so.0-9* 2>/dev/null | $sed -n '1p'` + $test -f "$xxx" && eval $libscheck + $test -f "$xxx" && libstyle=shared + fi + if test ! -f "$xxx"; then + xxx=$thisdir/lib$thislib.$so + $test -f "$xxx" && eval $libscheck + $test -f "$xxx" && libstyle=shared + fi + if test ! -f "$xxx"; then + xxx=$thisdir/lib$thislib$_a + $test -f "$xxx" && eval $libscheck + $test -f "$xxx" && libstyle=static + fi + if test ! -f "$xxx"; then + xxx=$thisdir/$thislib$_a + $test -f "$xxx" && eval $libscheck + $test -f "$xxx" && libstyle=static + fi + if test ! -f "$xxx"; then + xxx=$thisdir/lib${thislib}_s$_a + $test -f "$xxx" && eval $libscheck + $test -f "$xxx" && libstyle=static + $test -f "$xxx" && thislib=${thislib}_s + fi + if test ! -f "$xxx"; then + xxx=$thisdir/Slib$thislib$_a + $test -f "$xxx" && eval $libscheck + $test -f "$xxx" && libstyle=static + fi + if $test -f "$xxx"; then + if $cc -o lt $ccflags $ldflags lt.c -l$thislib >/dev/null 2>&1; + then + linkmsg="" + else + linkmsg=" but I can't link against it" + fi + case "$libstyle" in + shared) echo "Found -l$thislib (shared)$linkmsg." ;; + static) echo "Found -l$thislib$linkmsg." ;; + *) echo "Found -l$thislib ($libstyle)$linkmsg." ;; + esac + case " $dflt " in + *"-l$thislib "*) ;; + *) + case "$linkmsg" in + '') + dflt="$dflt -l$thislib" + libsfound="$libsfound $xxx" + yyy=`basename $xxx` + libsfiles="$libsfiles $yyy" + yyy=`echo $xxx|$sed -e "s%/$yyy\\$%%"` + case " $libsdirs " in + *" $yyy "*) ;; + *) libsdirs="$libsdirs $yyy" ;; + esac + ;; + esac + ;; + esac + break + fi + done + if $test ! -f "$xxx"; then + if $cc -o lt $ccflags $ldflags lt.c -l$thislib >/dev/null 2>&1 + then + echo "Found -l$thislib (via $cc)." + case " $dflt " in + *"-l$thislib "*) ;; + *) dflt="$dflt -l$thislib";; + esac + else + echo "No -l$thislib." + fi + fi +done +set X $dflt +shift +dflt="$*" +case "$libs" in +'') dflt="$dflt";; +*) dflt="$libs";; +esac +case "$dflt" in +' '|'') dflt='none';; +esac +$rm -f lt.c lt + +$cat <<EOM + +In order to compile $package on your machine, a number of libraries +are usually needed. Include any other special libraries here as well. +Say "none" for none. The default list is almost always right. +EOM + +echo " " +rp="Which libraries to use?" +. ./myread +case "$ans" in +none) libs=' ';; +*) libs="$ans";; +esac + +: determine which malloc to compile in +echo " " +case "$usemymalloc" in +yY*|true|$define) dflt='y' ;; +nN*|false|$undef) dflt='n' ;; +*) dflt=y ;; +esac +$cat <<EOM +$spackage comes with its own malloc() implementation that will supersede +the version included in your C library. Since proper memory allocation is +critical, you may choose to opt out from this specific implementation and +rely on the (hopefully) more thoroughly tested version in the C library. + +If you change your mind later, you can always re-run this configuration +script and recompile $package from scratch. + +EOM +rp="Do you wish to attempt to use the malloc() that comes with $package?" +. ./myread +usemymalloc="$ans" +case "$ans" in +y*|true) + usemymalloc='y' + mallocsrc='malloc.c' + mallocobj="malloc$_o" + d_mymalloc="$define" + case "$libs" in + *-lmalloc*) + : Remove malloc from list of libraries to use + echo "Removing unneeded -lmalloc from library list" >&4 + set `echo X $libs | $sed -e 's/-lmalloc / /' -e 's/-lmalloc$//'` + shift + libs="$*" + echo "libs = $libs" >&4 + ;; + esac + ;; +*) + usemymalloc='n' + mallocsrc='' + mallocobj='' + d_mymalloc="$undef" + ;; +esac + +: determine whether this is an official build +case "$official" in +false) + official=false + val="$undef" + echo " " + ./warn 'This build will not be suitable for distribution.' 4>&4 + +;; +*) + val="$define" + official=true + ;; +esac +set d_official +eval $setvar + +: ask them whether they want remote control support +$cat <<EOM + +$spackage has a raw remote control service. + +Currently you can create searches, connect to nodes, and print and +set the values of properties as well as read the 'tooltips'. It is +not completely functional, but you may choose to enable it here at +compile time. The feature will need activation from the GUI. + +For more information, see doc/other/shell.txt + +EOM +case "$remotectrl" in +true) dflt=y;; +*) dflt=n;; +esac +rp="Enable remote control service" +. ./myread +val="$ans" +case "$ans" in +y) val="$define";; +*) val="$undef";; +esac +set d_remotectrl +eval $setvar +case "$d_remotectrl" in +$define) remotectrl=true;; +*) remotectrl=false;; +esac + +: look whether they wish to run headless +$cat <<EOM + +$spackage can run without any GUI interface in so-called "headless" mode. +Therefore, monitoring of operations for $package will have to be done +without relying on any GUI, and the configuration is done via files only. + +EOM +case "$d_headless" in +"$define") dflt=y;; +*) dflt=n;; +esac +rp="Run without any GUI interface" +. ./myread +case "$ans" in +y) val="$define";; +*) val="$undef";; +esac +set d_headless +eval $setvar + +: ask them wich GTK+ version they want +echo " " +case "$d_headless" in +"$define") + echo "Turning off GTK+ since you want to run without any GUI" >&4 + d_usegtk1="$undef"; + d_usegtk2="$undef"; + ;; +*) + $cat <<'EOM' +I can compile for the GTK+ 1.x version or for the GTK+ 2.x version. +The GTK1 frontend will use much less CPU than the GTK2 one, so if you +have a slow 32-bit CPU, you are encouraged to choose GTK1. +On 64-bit platforms, you need to choose GTK2 since GTK1 is not 64-bit safe. + +EOM + case "$gtkversion" in + '') dflt=2;; + 2) dflt=2;; + *) dflt=1;; + esac + rp="Use which GTK toolkit (1 or 2)" + . ./myread + case "$ans" in + 2) + gtkversion=2; gtkpackage=gtk+-2.0 + d_usegtk2="$define"; d_usegtk1="$undef";; + *) + gtkversion=1; gtkpackage=gtk+ + d_usegtk1="$define"; d_usegtk2="$undef";; + esac + ;; +esac + +: decide which version of GLib to use -- tied to the choice of GTK +case "$gtkversion" in +1) ver=1;; +*) ver=2;; +esac +case "$ver" in +2) + glibversion=2; glibpackage="glib-2.0 gobject-2.0 gthread-2.0" + d_useglib2="$define"; d_useglib1="$undef";; +*) + glibversion=1; glibpackage="glib gthread" + d_useglib1="$define"; d_useglib2="$undef";; +esac + +: determine where public executables go +echo " " +set dflt bin bin +eval $prefixit +fn=d~ +rp='Pathname where the public executables will reside?' +. ./getfile +if $test "X$ansexp" != "X$binexp"; then + installbin='' +fi +bin="$ans" +binexp="$ansexp" +if $afs; then + $cat <<EOM + +Since you are running AFS, I need to distinguish the directory in which +executables reside from the directory in which they are installed (and from +which they are presumably copied to the former directory by occult means). + +EOM + case "$installbin" in + '') dflt=`echo $binexp | sed 's#^/afs/#/afs/.#'`;; + *) dflt="$installbin";; + esac + fn=de~ + rp='Where will public executables be installed?' + . ./getfile + installbin="$ans" +else + installbin="$binexp" +fi + +: determine where manual pages are on this system +echo " " +case "$sysman" in +'') + syspath='/usr/share/man/man1 /usr/man/man1' + syspath="$syspath /usr/man/mann /usr/man/manl /usr/man/local/man1" + syspath="$syspath /usr/man/u_man/man1 /usr/share/man/man1" + syspath="$syspath /usr/catman/u_man/man1 /usr/man/l_man/man1" + syspath="$syspath /usr/local/man/u_man/man1 /usr/local/man/l_man/man1" + syspath="$syspath /usr/man/man.L /local/man/man1 /usr/local/man/man1" + sysman=`./loc . /usr/man/man1 $syspath` + ;; +esac +if $test -d "$sysman"; then + echo "System manual is in $sysman." >&4 +else + echo "Could not find manual pages in source form." >&4 +fi + +: determine where manual pages go +set mansrc mansrc none +eval $prefixit +$cat <<EOM + +$spackage has manual pages available in source form. +EOM +case "$nroff" in +nroff) + echo "However, you don't have nroff, so they're probably useless to you." + case "$mansrc" in + '') mansrc="none";; + esac;; +esac +echo "If you don't want the manual sources installed, answer 'none'." +case "$mansrc" in +'') + lookpath="$prefixexp/share/man/man1 $prefixexp/man/man1" + lookpath="$lookpath $prefixexp/man/u_man/man1 $prefixexp/man/l_man/man1" + lookpath="$lookpath /usr/local/man/man1 /opt/man/man1 /usr/man/manl" + lookpath="$lookpath /usr/share/man/man1 /usr/local/share/man/man1" + lookpath="$lookpath /usr/man/local/man1 /usr/man/l_man/man1" + lookpath="$lookpath /usr/local/man/u_man/man1 /usr/local/man/l_man/man1" + lookpath="$lookpath /usr/man/man.L" + mansrc=`./loc . $prefixexp/man/man1 $lookpath` + if $test -d "$mansrc"; then + dflt="$mansrc" + else + dflt="$sysman" + fi + set dflt + eval $prefixup + ;; +' ') dflt=none;; +*) dflt="$mansrc" + ;; +esac +echo " " +fn=dn~ +rp='Where do the manual pages (source) go?' +. ./getfile +if test "X$mansrcexp" != "X$ansexp"; then + installmansrc='' +fi +mansrc="$ans" +mansrcexp="$ansexp" +case "$mansrc" in +'') mansrc=' ' + installmansrc='';; +esac +if $afs && $test "$mansrc"; then + $cat <<EOM + +Since you are running AFS, I need to distinguish the directory in which +manual pages reside from the directory in which they are installed (and from +which they are presumably copied to the former directory by occult means). + +EOM + case "$installmansrc" in + '') dflt=`echo $mansrcexp | sed 's#^/afs/#/afs/.#'`;; + *) dflt="$installmansrc";; + esac + fn=de~ + rp='Where will man pages be installed?' + . ./getfile + installmansrc="$ans" +else + installmansrc="$mansrcexp" +fi + +case "$mansrc" in +' ') manext='0';; +*l) manext=l;; +*n) manext=n;; +*o) manext=l;; +*p) manext=n;; +*C) manext=C;; +*L) manext=L;; +*L1) manext=L1;; +*) manext=1;; +esac + +: see whether the try.c file compiles and links +trylink=' +var=$1; +shift; +val=$undef; +file=trylink.log; +nparams=$#; +case "$cyn" in +"") msg="";; +*" "*) msg="$cyn"; yes=yes; no=no;; +*) + case "$var" in + d_*) msg="for $cyn()"; yes=found; no=missing;; + i_*) msg="for <$cyn>"; yes=found; no=missing;; + *) msg="$cyn"; yes=yes; no=no;; + esac + ;; +esac; +case "$cyn" in +"") echo "--- $var ---" >> "$file";; +*) + echo " "; $echo $n "Checking $msg...$c" >&4; + echo "--- $var --- ($msg)" >>"$file" + ;; +esac; +$cat try.c >> "$file"; +while :; do + $rm -f try$_exe; + if $cc $ccflags -o try try.c $ldflags $1 >> "$file" 2>&1; then + case "$nparams" in 0) ;; *) echo "==> OK with \"$1\"" >> "$file";; esac; + val=$define; + break; + fi; + if $test $# -lt 1; then + break; + fi; + echo "==> FAILED with \"$1\"" >> "$file"; + shift; +done; +$rm -rf try try.*; +echo "==> $var=$val" >> "$file"; +case "$cyn" in +"") ;; +*) + case "$val" in + "$define") echo " $yes." >&4;; + *) echo " $no." >&4;; + esac + ;; +esac; +set $var; eval $setvar; +cyn="" +' + +: see if gettext exists +$cat >try.c <<EOC +#include <libintl.h> +int main(void) +{ + static char ret; + ret |= *gettext("msgid"); + return ret ? 0 : 1; +} +EOC +cyn=gettext +set d_gettext -lintl +eval $trylink + : see if this is a libintl system set libintl.h i_libintl eval $inhdr @@ -4442,10 +4776,6 @@ set d_alarm eval $trylink -: see if stdlib is available -set stdlib.h i_stdlib -eval $inhdr - : see if arc4random exists $cat >try.c <<EOC #$i_stdlib I_STDLIB @@ -4536,6 +4866,24 @@ set d_bcopy eval $trylink +: see whether the bfd library is available +$cat >try.c <<EOC +#define PACKAGE +#define PACKAGE_VERSION +#include <bfd.h> +int main(void) +{ + bfd *b; + b = bfd_openr("file", 0); + return b ? 0 : 1; +} +EOC +cyn="whether the BFD library is available" +set d_bfd_lib '-lbfd -lintl -liberty' '-lbfd -liberty' '-lbfd -liberty -lz' \ + '-lbfd -lintl -liberty -lz' '-lbfd -lz' '-lbfd -lintl -lz' \ + '-lbfd -lz -ldl' +eval $trylink + : see if bind_textdomain_codeset exists $cat >try.c <<EOC #include <libintl.h> @@ -4550,6 +4898,74 @@ set d_bindtxtcode '-lintl' eval $trylink +: see if there is a bsearch +$cat >try.c <<EOC +#include <stdlib.h> +int mycmp(const void *a, const void *b) +{ + return (char *) a - (char *) b; +} +int main(int argc, char **argv) +{ + return NULL == bsearch("foo", argv, argc, sizeof argv0, mycmp); +} +EOC +cyn=bsearch +set d_bsearch +eval $trylink + +: check for __builtin_bswap32 +$cat >try.c <<EOC +int main(void) +{ + static int ret; + ret |= __builtin_bswap32(127); + return ret ? 0 : 1; +} +EOC +cyn=__builtin_bswap32 +set d_built_bswap32 +eval $trylink + +: check for __builtin_bswap64 +$cat >try.c <<EOC +int main(void) +{ + static int ret; + ret |= __builtin_bswap64(127); + return ret ? 0 : 1; +} +EOC +cyn=__builtin_bswap64 +set d_built_bswap64 +eval $trylink + +: check for __builtin_clz +$cat >try.c <<EOC +int main(void) +{ + static int ret; + ret |= __builtin_clz(127); + return ret ? 0 : 1; +} +EOC +cyn=__builtin_clz +set d_built_clz +eval $trylink + +: check for __builtin_ctz +$cat >try.c <<EOC +int main(void) +{ + static int ret; + ret |= __builtin_ctz(127); + return ret ? 0 : 1; +} +EOC +cyn=__builtin_ctz +set d_built_ctz +eval $trylink + : check for __builtin_popcount $cat >try.c <<EOC int main(void) @@ -4577,6 +4993,185 @@ set d_bzero eval $trylink +: static assertion checking include file +$cat >static_assert.h <<'EOC' +#define STATIC_ASSERT(expr) \ + do { switch (0) { case ((expr) ? 1 : 0): case 0: break; } } while(0) +EOC + +: check for lengths of integral types +echo " " +types='' +types="$types short" +types="$types int" +types="$types long" +for t in $types; do + $echo $n "Checking to see how big your ${t}s are...$c" >&4 + for size in 2 4 8 16 error; do + $cat >try.c <<EOCP +#include "static_assert.h" +$t foo; +int main() +{ + STATIC_ASSERT($size == sizeof(foo)); + return 0; +} +EOCP + if $cc -c $ccflags try.c >/dev/null 2>&1; then break; fi + done + var=${t}size + case "$size" in + error) + echo " cannot compute it." >&4 + case $t in + short) dflt=2;; + int) dflt=4;; + long) dflt=4;; + esac + rp="What is the size of the \"$t\" type (in bytes)?" + . ./myread + eval $var="$ans" + ;; + *) + echo " $size bytes." >&4 + eval $var=$size + ;; + esac +done +$rm -f try.* + +: check for length of pointer +echo " " +$echo $n "Checking to see how big your pointers are...$c" >&4 +for size in 2 4 8 16 error; do + $cat >try.c <<EOCP +#include "static_assert.h" +char *foo; +int main() +{ + STATIC_ASSERT($size == sizeof(foo)); + return 0; +} +EOCP + if $cc -c $ccflags try.c >/dev/null 2>&1; then break; fi +done +case "$size" in +error) + echo " cannot compute it." >&4 + dflt=4 + rp="What is the size of a pointer type (in bytes)?" + . ./myread + ptrsize="$ans" + ;; +*) + echo " $size bytes." >&4 + ptrsize=$size + ;; +esac +$rm -f try.* + +: check for architecture type +echo " " +$echo $n "Computing CPU architecture type...$c" >&4 +ilp=`expr $longsize \* 8` +case "$ptrsize" in +8) + val=$undef; set d_ilp32; eval $setvar + case "$intsize" in + 8) + echo " ILP64." >&4 + val=$define; set d_ilp64; eval $setvar + val=$undef; set d_lp64; eval $setvar + ;; + *) + echo " LP64." >&4 + val=$define; set d_lp64; eval $setvar + val=$undef; set d_ilp64; eval $setvar + ;; + esac + ;; +*) + echo " ILP${ilp}." >&4 + case "$ilp" in + 32) val=$define;; + *) val=$undef;; + esac + set d_ilp32; eval $setvar + val=$undef; set d_ilp64; eval $setvar + val=$undef; set d_lp64; eval $setvar + ;; +esac + +: see whether compiler supports 64-bit emulation +val=$undef +case "$ilp" in +64) val=$define;; +*) + $cat >try.c <<EOCP +#include "static_assert.h" +long long foo; +int main() +{ + STATIC_ASSERT(8 == sizeof(foo)); + return 0; +} +EOCP + if $cc -c $ccflags try.c >/dev/null 2>&1; then + echo " " + echo "Your compiler also supports 64-bit emulation." >&4 + val=$define + fi + $rm -f try.* + ;; +esac +set d_can64 +eval $setvar + +: do we have clearenv? +$cat >try.c <<EOC +#$i_stdlib I_STDLIB +#ifdef I_STDLIB +#include <stdlib.h> +#endif +int main(void) +{ + return clearenv(); +} +EOC +cyn=clearenv +set d_clearenv +eval $trylink + +: see whether clock_getres exists +$cat >try.c <<EOC +#include <time.h> +int main(void) +{ + int ret; + struct timespec res; + ret = clock_getres(CLOCK_REALTIME, &res); + return ret ? 0 : 1; +} +EOC +cyn=clock_getres +set d_clock_getres +eval $trylink + +: see whether clock_gettime exists +$cat >try.c <<EOC +#include <time.h> +int main(void) +{ + int ret; + struct timespec tp; + ret = clock_gettime(CLOCK_REALTIME, &tp); + return ret ? 0 : 1; +} +EOC +cyn=clock_gettime +set d_clock_gettime +eval $trylink + : can we use closefrom? $cat >try.c <<EOC #include <sys/types.h> @@ -4735,6 +5330,24 @@ eval $setvar +: check whether struct dirent has a member d_namlen. +$cat >try.c <<EOC +#include <sys/types.h> +#$i_dirent I_DIRENT +#ifdef I_DIRENT +#include <dirent.h> +#endif +int main(void) +{ + static struct dirent dir_entry; + dir_entry.d_namlen |= 1; + return 0; +} +EOC +cyn="whether struct dirent has a d_namlen member" +set d_dirent_d_namlen +eval $trylink + : check whether struct dirent has a member d_type. $cat >try.c <<EOC #include <sys/types.h> @@ -4753,8 +5366,7 @@ | DT_BLK | DT_REG | DT_LNK - | DT_SOCK - | DT_WHT; + | DT_SOCK; return 0; } EOC @@ -4762,6 +5374,48 @@ set d_dirent_d_type eval $trylink +: see if dirfd exists +$cat >try.c <<EOC +#include <sys/types.h> +#$i_dirent I_DIRENT +#ifdef I_DIRENT +#include <dirent.h> +#endif +int main(void) +{ + static DIR *dir; + static int ret; + ret = dirfd(dir); + return ret ? 0 : 1; +} +EOC +cyn=dirfd +set d_dirfd +eval $trylink + +: see if dlfcn is available +set dlfcn.h i_dlfcn +eval $inhdr + +: see if dladdr exists +$cat >try.c <<EOC +#$i_dlfcn I_DLFCN +#define _GNU_SOURCE +#ifdef I_DLFCN +#include <dlfcn.h> +#endif +int main(void) +{ + Dl_info info; + + dladdr(main, &info); + return info.dli_fbase != 0; +} +EOC +cyn=dladdr +set d_dladdr '-ldl' +eval $trylink + : see if the end symbol exists $cat >try.c <<EOC int main(void) @@ -4871,6 +5525,59 @@ ;; esac +: see if fchdir exists +$cat >try.c <<EOC +#$i_unistd I_UNISTD +#ifdef I_UNISTD +#include <unistd.h> +#endif +int main(void) +{ + static int fd, ret; + ret |= fchdir(fd); + return ret ? 0 : 1; +} +EOC +cyn=fchdir +set d_fchdir +eval $trylink + +: see if fdatasync exists +$cat >try.c <<EOC +#include <sys/types.h> +#$i_unistd I_UNISTD +#ifdef I_UNISTD +#include <unistd.h> +#endif +int main(void) +{ + static int ret, fd; + ret |= fdatasync(fd); + return ret ? 0 : 1; +} +EOC +cyn=fdatasync +set d_fdatasync +eval $trylink + +: see if fdopendir exists +$cat >try.c <<EOC +#$i_dirent I_DIRENT +#include <sys/types.h> +#ifdef I_DIRENT +#include <dirent.h> +#endif +int main(void) +{ + static DIR *d; + d = fdopendir(0); + return (DIR *) 0 == d; +} +EOC +cyn=fdopendir +set d_fdopendir +eval $trylink + : see if fork exists $cat >try.c <<EOC #include <sys/types.h> @@ -4889,6 +5596,47 @@ set d_fork eval $trylink +: see if sys/stat.h is available +set sys/stat.h i_sysstat +eval $inhdr + +: see if fstatat exists +$cat >try.c <<EOC +#$i_sysstat I_SYS_STAT +#include <fcntl.h> /* AT_* constants */ +#ifdef I_SYS_STAT +#include <sys/stat.h> +#endif +int main(void) +{ + static int ret; + struct stat sb; + ret |= fstatat(AT_FDCWD, "path", &sb, 0); + return ret ? 0 : 1; +} +EOC +cyn=fstatat +set d_fstatat +eval $trylink + +: see if fsync exists +$cat >try.c <<EOC +#include <sys/types.h> +#$i_unistd I_UNISTD +#ifdef I_UNISTD +#include <unistd.h> +#endif +int main(void) +{ + static int ret, fd; + ret |= fsync(fd); + return ret ? 0 : 1; +} +EOC +cyn=fsync +set d_fsync +eval $trylink + : see if arpa/inet.h has to be included set arpa/inet.h i_arpainet eval $inhdr @@ -4922,6 +5670,9 @@ #$i_arpainet I_ARPA_INET #$i_netdb I_NETDB #$d_windows WINDOWS_SYSTEM +#ifdef WINDOWS_SYSTEM +#define WINVER 0x0501 +#endif #include <sys/types.h> #ifdef I_SYS_SOCKET #include <sys/socket.h> @@ -4935,9 +5686,6 @@ #ifdef I_NETDB #include <netdb.h> #endif -#ifdef WINDOWS_SYSTEM -#define WINVER 0x0501 -#endif #ifdef I_WINSOCK2 #include <Winsock2.h> #endif @@ -5057,6 +5805,56 @@ set d_getlogin eval $trylink +: can we use getnameinfo? +$cat >try.c <<EOC +#$i_syssock I_SYS_SOCKET +#$i_winsock2 I_WINSOCK2 +#$i_ws2tcpip I_WS2TCPIP +#$i_niin I_NETINET_IN +#$i_arpainet I_ARPA_INET +#$i_netdb I_NETDB +#$d_windows WINDOWS_SYSTEM +#ifdef WINDOWS_SYSTEM +#define WINVER 0x0501 +#endif +#include <sys/types.h> +#ifdef I_SYS_SOCKET +#include <sys/socket.h> +#endif +#ifdef I_NETINET_IN +#include <netinet/in.h> +#endif +#ifdef I_ARPA_INET +#include <arpa/inet.h> +#endif +#ifdef I_NETDB +#include <netdb.h> +#endif +#ifdef I_WINSOCK2 +#include <Winsock2.h> +#endif +#ifdef I_WS2TCPIP +#include <Ws2tcpip.h> +#endif +int main(void) +{ + int ret; + static struct sockaddr sa; + socklen_t salen; + char hostNI_MAXHOST; + char servNI_MAXSERV; + + salen = sizeof(sa); + ret = getnameinfo(&sa, salen, + host, sizeof host, serv, sizeof serv, + NI_NAMEREQD | NI_DGRAM | NI_NOFQDN | NI_NUMERICHOST | NI_NUMERICSERV); + return 0 == ret; +} +EOC +cyn=getnameinfo +set d_getnameinfo '-lWs2_32' +eval $trylink + : see if getppid exists $cat >try.c <<EOC #include <sys/types.h> @@ -5075,155 +5873,157 @@ set d_getppid eval $trylink -: compute shared library extension -case "$so" in -'') - if xxx=`./loc libc.sl X $libpth`; $test -f "$xxx"; then - dflt='sl' - else - dflt='so' - fi - ;; -*) dflt="$so";; -esac -$cat <<EOM +: can we use getprogname? +$cat >try.c <<EOC +#include <stdio.h> +#$i_stdlib I_STDLIB +#ifdef I_STDLIB +#include <stdlib.h> +#endif +int main(void) +{ + printf("%s\n", getprogname()); + return 0; +} +EOC +cyn=getprogname +set d_getprogname +eval $trylink -On some systems, shared libraries may be available. Answer 'none' if -you want to suppress searching of shared libraries for the remainder -of this configuration. +: see if there is a getpwnam +$cat >try.c <<EOC +#include <pwd.h> +int main(void) +{ + struct passwd pw; + pw = *getpwnam("foo"); + return pw.pw_name ? 0 : 1; +} +EOC +cyn=getpwnam +set d_getpwnam +eval $trylink -EOM -rp='What is the file extension used for shared libraries?' -. ./myread -so="$ans" +: see if there is a getpwuid +$cat >try.c <<EOC +#include <pwd.h> +int main(void) +{ + struct passwd pw; + pw = *getpwuid(0); + return pw.pw_name ? 0 : 1; +} +EOC +cyn=getpwuid +set d_getpwuid +eval $trylink -: Define several unixisms. -: Hints files or command line option can be used to override them. -case "$_a" in -'') _a='.a';; -esac -case "$_o" in -'') _o='.o';; -esac +: see if sys/select.h has to be included +set sys/select.h i_sysselct +eval $inhdr -: Looking for optional libraries +: see if we should include time.h, sys/time.h, or both echo " " -echo "Checking for optional libraries..." >&4 -case "$libs" in -' '|'') dflt='';; -*) dflt="$libs";; -esac -case "$libswanted" in -'') libswanted='c_s';; -esac -case "$usesocks" in -"$define") libswanted="$libswanted socks5 socks5_sh" ;; -esac -echo "extern void abort(void); int main(void) { abort(); return 0; }" > lt.c -libsfound='' -libsfiles='' -libsdirs='' -libspath='' -for thisdir in $libpth $xlibpth; do - test -d $thisdir && libspath="$libspath $thisdir" +echo "Testing to see if we should include <time.h>, <sys/time.h> or both." >&4 +$echo $n "I'm now running the test program...$c" +$cat >try.c <<'EOCP' +#include <sys/types.h> +#ifdef I_TIME +#include <time.h> +#endif +#ifdef I_SYSTIME +#ifdef SYSTIMEKERNEL +#define KERNEL +#endif +#include <sys/time.h> +#endif +#ifdef I_SYSSELECT +#include <sys/select.h> +#endif +int main(void) +{ + struct tm foo; +#ifdef S_TIMEVAL + struct timeval bar; +#endif +#ifdef S_TIMEZONE + struct timezone tzp; +#endif + if (foo.tm_sec == foo.tm_sec) + return 0; +#ifdef S_TIMEVAL + if (bar.tv_sec == bar.tv_sec) + return 0; +#endif + return 1; +} +EOCP +flags='' +for s_timezone in '-DS_TIMEZONE' ''; do +sysselect='' +for s_timeval in '-DS_TIMEVAL' ''; do +for i_systimek in '' '-DSYSTIMEKERNEL'; do +for i_time in '' '-DI_TIME'; do +for i_systime in '-DI_SYSTIME' ''; do + case "$flags" in + '') $echo $n ".$c" + if $cc $ccflags \ + $i_time $i_systime $i_systimek $sysselect $s_timeval $s_timezone \ + -o try try.c >/dev/null 2>&1 ; then + set X $i_time $i_systime $i_systimek $sysselect $s_timeval + shift + flags="$*" + echo " " + $echo $n "Succeeded with $flags$c" + fi + ;; + esac done -for thislib in $libswanted; do - for thisdir in $libspath; do - xxx='' - if $test ! -f "$xxx" ; then - xxx=`ls $thisdir/lib$thislib.$so.0-9* 2>/dev/null | $sed -n '1p'` - $test -f "$xxx" && eval $libscheck - $test -f "$xxx" && libstyle=shared - fi - if test ! -f "$xxx"; then - xxx=$thisdir/lib$thislib.$so - $test -f "$xxx" && eval $libscheck - $test -f "$xxx" && libstyle=shared - fi - if test ! -f "$xxx"; then - xxx=$thisdir/lib$thislib$_a - $test -f "$xxx" && eval $libscheck - $test -f "$xxx" && libstyle=static - fi - if test ! -f "$xxx"; then - xxx=$thisdir/$thislib$_a - $test -f "$xxx" && eval $libscheck - $test -f "$xxx" && libstyle=static - fi - if test ! -f "$xxx"; then - xxx=$thisdir/lib${thislib}_s$_a - $test -f "$xxx" && eval $libscheck - $test -f "$xxx" && libstyle=static - $test -f "$xxx" && thislib=${thislib}_s - fi - if test ! -f "$xxx"; then - xxx=$thisdir/Slib$thislib$_a - $test -f "$xxx" && eval $libscheck - $test -f "$xxx" && libstyle=static - fi - if $test -f "$xxx"; then - if $cc -o lt $ccflags $ldflags lt.c -l$thislib >/dev/null 2>&1; - then - linkmsg="" - else - linkmsg=" but I can't link against it" - fi - case "$libstyle" in - shared) echo "Found -l$thislib (shared)$linkmsg." ;; - static) echo "Found -l$thislib$linkmsg." ;; - *) echo "Found -l$thislib ($libstyle)$linkmsg." ;; - esac - case " $dflt " in - *"-l$thislib "*) ;; - *) - case "$linkmsg" in - '') - dflt="$dflt -l$thislib" - libsfound="$libsfound $xxx" - yyy=`basename $xxx` - libsfiles="$libsfiles $yyy" - yyy=`echo $xxx|$sed -e "s%/$yyy\\$%%"` - case " $libsdirs " in - *" $yyy "*) ;; - *) libsdirs="$libsdirs $yyy" ;; - esac - ;; - esac - ;; - esac - break - fi - done - if $test ! -f "$xxx"; then - echo "No -l$thislib." - fi done -set X $dflt -shift -dflt="$*" -case "$libs" in -'') dflt="$dflt";; -*) dflt="$libs";; +done +done +done +timeincl='' +echo " " +case "$flags" in +*SYSTIMEKERNEL*) i_systimek="$define" + timeincl=`./findhdr sys/time.h` + echo "We'll include <sys/time.h> with KERNEL defined." >&4;; +*) i_systimek="$undef";; esac -case "$dflt" in -' '|'') dflt='none';; +case "$flags" in +*I_TIME*) i_time="$define" + timeincl=`./findhdr time.h`" $timeincl" + echo "We'll include <time.h>." >&4;; +*) i_time="$undef";; esac -$rm -f lt.c lt - -$cat <<EOM - -In order to compile $package on your machine, a number of libraries -are usually needed. Include any other special libraries here as well. -Say "none" for none. The default list is almost always right. -EOM - -echo " " -rp="Which libraries to use?" -. ./myread -case "$ans" in -none) libs=' ';; -*) libs="$ans";; +case "$flags" in +*I_SYSTIME*) i_systime="$define" + timeincl=`./findhdr sys/time.h`" $timeincl" + echo "We'll include <sys/time.h>." >&4;; +*) i_systime="$undef";; esac +$rm -f try.c try + +: see if getrlimit exists +$cat >try.c <<EOC +#$i_systime I_SYS_TIME +#ifdef I_SYS_TIME +#include <sys/time.h> +#endif +#include <sys/resource.h> +int main(void) +{ + static struct rlimit lim; + int ret; + ret |= getrlimit(RLIMIT_CORE, &lim); + ret += lim.rlim_cur > lim.rlim_max ? 1 : 0; + return ret ? 0 : 1; +} +EOC +cyn=getrlimit +set d_getrlimit +eval $trylink : define a shorthand compile call compile=' @@ -5779,6 +6579,65 @@ fi $rm -f nofile* +: see where struct timeb is defined +echo " " +xxx=`./findhdr sys/timeb.h` +if $test "$xxx"; then + if $contains 'struct timeb' $xxx >/dev/null 2>&1; then + val="$define" + echo "You have struct timeb defined in <sys/timeb.h>." >&4 + else + val="$undef" + echo "Assuming struct timeb is defined in <sys/time.h>." >&4 + fi +else + val="$undef" +echo "No <sys/timeb.h> -- Assuming struct timeb is defined in <sys/time.h>." >&4 +fi +set i_systimeb +eval $setvar + +: see if gettimeofday or ftime exists +$cat >try.c <<EOC +#include <sys/time.h> +int main(void) +{ + static struct timeval tv; + static void *tz; + static int ret; + ret |= gettimeofday(&tv, tz); + return ret ? 0 : 1; +} +EOC +cyn=gettimeofday +set d_gettimeod +eval $trylink + +$cat >try.c <<EOC +#include <sys/types.h> +#$i_systimeb I_SYS_TIMEB +#ifdef I_SYS_TIMEB +#include <sys/timeb.h> +#endif +int main(void) +{ + static struct timeb t; + static int ret; + ret |= ftime(&t); + return ret ? 0 : 1; +} +EOC +cyn=ftime +set d_ftime +eval $trylink + +case "$d_gettimeod$d_ftime" in +"$undef$undef") + echo " " + echo 'No ftime() nor gettimeofday() -- timing may be less accurate.' >&4 + ;; +esac + : can we use getuid? $cat >try.c <<EOC #include <sys/types.h> @@ -5887,6 +6746,48 @@ set d_hstrerror eval $trylink +: check for ieee754 float and their endianness +echo " " +$echo $n "Checking IEEE-754 float byte-ordering...$c" >&4 +$cat >try.c <<'EOCP' +float ascii_le = { + 3223.213134765625, 6.8273612896518898e-07, 1.9753562586009612e+31, 0 }; +float ascii_be = { + 865942.3125, 6.7652519659605424e+22, 1.9695089292781631e-07, 0 }; +EOCP +order=0 +val='' +if $cc -c $ccflags try.c >/dev/null 2>&1; then + if $contains ISieee754Sys try$_o >/dev/null 2>&1; then + val=$define + order=4321 + elif $contains isIEEE754Sys try$_o >/dev/null 2>&1; then + val=$define + order=1234 + else + strings try$_o >str 2>/dev/null + if $contains ISieee754Sys str >/dev/null 2>&1; then + val=$define + order=4321 + elif $contains isIEEE754Sys str >/dev/null 2>&1; then + val=$define + order=1234 + else + val=$undef + fi + $rm -f str + fi +fi +set d_ieee754 +eval $setvar +case "$order" in +0) echo " not using IEEE-754 here." >&4;; +1234) echo " little-endian." >&4;; +4321) echo " big-endian." >&4;; +esac +ieee754_byteorder=$order +$rm -f try.c try$_o + : index or strchr $cat >try.c <<EOC #include <string.h> @@ -5940,12 +6841,12 @@ #$i_syssock I_SYS_SOCKET #$i_winsock2 I_WINSOCK2 #$d_windows WINDOWS_SYSTEM -#ifdef I_SYS_SOCKET -#include <sys/socket.h> -#endif #ifdef WINDOWS_SYSTEM #define WINVER 0x0501 #endif +#ifdef I_SYS_SOCKET +#include <sys/socket.h> +#endif #ifdef I_WINSOCK2 #include <Winsock2.h> #endif @@ -6012,13 +6913,12 @@ #include <netdb.h> #endif #ifdef I_WINSOCK2 -#include "Winsock2.h" +#include <Winsock2.h> #endif #ifdef I_WS2TCPIP -#include "Ws2tcpip.h" +#include <Ws2tcpip.h> #endif -#define STATIC_ASSERT(x) \ - do { switch (0) { case ((x) ? 1 : 0): case 0: break; } } while(0) +#include "static_assert.h" int main(void) { @@ -6150,10 +7050,6 @@ set d_locale_charset eval $trylink -: see if sys/stat.h is available -set sys/stat.h i_sysstat -eval $inhdr - : see if lstat exists $cat >try.c <<EOC #$i_sysstat I_SYS_STAT @@ -6196,10 +7092,6 @@ set d_madvise eval $trylink -: see if this is a malloc.h system -set malloc.h i_malloc -eval $inhdr - : see if memalign exists $cat >try.c <<EOC #define _GNU_SOURCE @@ -6253,6 +7145,29 @@ set d_memmove eval $trylink +: see if mempcpy exists +$cat >try.c <<EOC +#include <string.h> + +void *copy(void *d, const void *s, unsigned n) +{ + char *q = d; + const char *r = s; + return mempcpy(q + 4, r + 2, n - 1); +} + +int main(void) +{ + static char src, dst; + void *p; + p = copy(&dst, &src, sizeof(dst)); + return p ? 0 : 1; +} +EOC +cyn=mempcpy +set d_mempcpy +eval $trylink + : see if mmap exists $cat >try.c <<EOC #include <sys/types.h> @@ -6283,10 +7198,6 @@ set sys/types.h i_systypes eval $inhdr -: see if sys/select.h has to be included -set sys/select.h i_sysselct -eval $inhdr - : see if this is a mswsock.h system set mswsock.h i_mswsock eval $inhdr @@ -6299,15 +7210,15 @@ #$i_winsock2 I_WINSOCK2 #$i_mswsock I_MSWSOCK #$d_windows WINDOWS_SYSTEM +#ifdef WINDOWS_SYSTEM +#define WINVER 0x0501 +#endif #ifdef I_SYS_TYPES #include <sys/types.h> #endif #ifdef I_SYS_SOCKET #include <sys/socket.h> #endif -#ifdef WINDOWS_SYSTEM -#define WINVER 0x0501 -#endif #ifdef I_WINSOCK2 #include <Winsock2.h> #endif @@ -6390,6 +7301,20 @@ eval $setvar $rm -f open3* +: see if openat exists +$cat >try.c <<EOC +#include <fcntl.h> /* AT_* constants */ +int main(void) +{ + static int ret; + ret |= openat(AT_FDCWD, "path", /* flags */ 0, /* mode */ 0); + return ret ? 0 : 1; +} +EOC +cyn=openat +set d_openat +eval $trylink + : see if pause exists $cat >try.c <<EOC #$i_unistd I_UNISTD @@ -6407,6 +7332,52 @@ set d_pause eval $trylink +: see if this is a sys/file.h system +val='' +set sys/file.h val +eval $inhdr + +: do we need to include sys/file.h ? +case "$val" in +"$define") + echo " " + if $h_sysfile; then + val="$define" + echo "We'll be including <sys/file.h>." >&4 + else + val="$undef" + echo "We won't be including <sys/file.h>." >&4 + fi + ;; +*) + h_sysfile=false + ;; +esac +set i_sysfile +eval $setvar + +: see if pipe2 exists +$cat >try.c <<EOC +#$i_unistd I_UNISTD +#$i_sysfile I_SYS_FILE +#ifdef I_UNISTD +#include <unistd.h> +#endif +#ifdef I_SYS_FILE +#include <sys/file.h> /* For O_* constants */ +#endif +#include <fcntl.h> /* For O_* constants */ +int main(void) +{ + static int fds2, ret; + ret |= pipe2(fds, O_CLOEXEC | O_NONBLOCK); + return ret ? 0 : 1; +} +EOC +cyn=pipe2 +set d_pipe2 +eval $trylink + : see if there is a poll.h file set poll.h i_poll eval $inhdr @@ -6551,6 +7522,38 @@ set d_preadv eval $trylink +: do we have the program_invocation_name variable? +$cat >try.c <<EOC +#include <stdio.h> +#define __USE_GNU +#include <errno.h> +int main(void) +{ + printf("%s\n%s\n", program_invocation_name, program_invocation_short_name); + return 0; +} +EOC +cyn="whether C startup sets program_invocation_name" +set d_proginvocname +eval $trylink + +: can we use pthread_attr_setstack +$cat >try.c <<'EOC' +#include <pthread.h> +int main(void) +{ + pthread_attr_t attr; + void *p = NULL; + static int ret; + + ret |= pthread_attr_setstack(&attr, p, 4096); + return ret ? 0 : 1; +} +EOC +cyn=pthread_attr_setstack +set d_ptattr_setstack '-lpthread' +eval $trylink + : see if pwrite exists $cat >try.c <<EOC #define _GNU_SOURCE @@ -6604,15 +7607,15 @@ #$i_winsock2 I_WINSOCK2 #$i_mswsock I_MSWSOCK #$d_windows WINDOWS_SYSTEM +#ifdef WINDOWS_SYSTEM +#define WINVER 0x0501 +#endif #ifdef I_SYS_TYPES #include <sys/types.h> #endif #ifdef I_SYS_SOCKET #include <sys/socket.h> #endif -#ifdef WINDOWS_SYSTEM -#define WINVER 0x0501 -#endif #ifdef I_WINSOCK2 #include <Winsock2.h> #endif @@ -6725,6 +7728,20 @@ set d_sbrk eval $trylink +: see if sched_yield exists +$cat >try.c <<EOC +#include <sched.h> +int main(void) +{ + static int ret; + ret |= sched_yield(); + return ret ? 0 : 1; +} +EOC +cyn=sched_yield +set d_sched_yield +eval $trylink + : see if select exists $cat >try.c <<EOC #$i_unistd I_UNISTD @@ -6756,6 +7773,96 @@ set d_select '-lWs2_32' eval $trylink +: see if semctl exists +$cat >try.c <<EOC +#include <sys/sem.h> +int main(void) +{ + static int ret, id, num; + static union semun { + int val; + struct semid_ds *buf; + unsigned short *array; + } arg; + ret |= semctl(id, num, GETVAL, &arg); + ret |= semctl(id, num, SETVAL, &arg); + ret |= semctl(id, num, GETPID, &arg); + ret |= semctl(id, num, GETNCNT, &arg); + ret |= semctl(id, num, GETZCNT, &arg); + ret |= semctl(id, num, GETALL, &arg); + ret |= semctl(id, num, SETALL, &arg); + return ret ? 0 : 1; +} +EOC +cyn=semctl +set d_semctl +eval $trylink + +: see if semget exists +$cat >try.c <<EOC +#include <sys/ipc.h> +#include <sys/sem.h> +int main(void) +{ + static int ret, n, flags; + static key_t key; + key = IPC_PRIVATE; + flags |= IPC_CREAT; + flags |= IPC_EXCL; + ret |= semget(key, n, flags); + return ret ? 0 : 1; +} +EOC +cyn=semget +set d_semget +eval $trylink + +: see if semop exists +$cat >try.c <<EOC +#include <sys/ipc.h> +#include <sys/sem.h> +int main(void) +{ + static int ret, id; + static size_t n; + static struct sembuf buf; + + buf.sem_num |= 1; + buf.sem_op |= 1; + buf.sem_flg |= SEM_UNDO; + buf.sem_flg |= IPC_NOWAIT; + ret |= semop(id, &buf, n); + return ret ? 0 : 1; +} +EOC +cyn=semop +set d_semop +eval $trylink + +: see if semtimedop exists +$cat >try.c <<EOC +#include <sys/types.h> +#include <sys/ipc.h> +#include <sys/sem.h> +int main(void) +{ + static int ret, id; + static size_t n; + static struct sembuf buf; + + + buf.sem_num |= 1; + buf.sem_op |= 1; + buf.sem_flg |= SEM_UNDO; + buf.sem_flg |= IPC_NOWAIT; + ret |= semtimedop(id, &buf, n, (struct timespec *) 0); + return ret ? 0 : 1; +} +EOC +cyn=semtimedop +set d_semtimedop +eval $trylink + : see if sendfile exists $cat >try.c <<EOC #include <sys/types.h> @@ -6774,6 +7881,21 @@ set d_sendfile '-lsendfile' eval $trylink +: do we have setenv? +$cat >try.c <<EOC +#$i_stdlib I_STDLIB +#ifdef I_STDLIB +#include <stdlib.h> +#endif +int main(void) +{ + return setenv("foo", "bar", 1); +} +EOC +cyn=setenv +set d_setenv +eval $trylink + : can we use setproctitle? $cat >try.c <<EOC #include <sys/types.h> @@ -6795,6 +7917,23 @@ set d_setproctitle eval $trylink +: can we use setprogname? +$cat >try.c <<EOC +#include <sys/types.h> +#$i_stdlib I_STDLIB +#ifdef I_STDLIB +#include <stdlib.h> +#endif +int main(void) +{ + setprogname("test"); + return 0; +} +EOC +cyn=setprogname +set d_setprogname +eval $trylink + : see if setsid exists $cat >try.c <<EOC #include <sys/types.h> @@ -6830,6 +7969,25 @@ set d_sigaction eval $trylink +: see if we have sigaltstack +$cat >try.c <<EOC +#include <stdio.h> +#include <signal.h> +int main(void) +{ + stack_t ss; + static int ret; + ss.ss_sp = NULL; + ss.ss_flags |= SS_ONSTACK | SS_DISABLE; + ss.ss_size = SIGSTKSZ + MINSIGSTKSZ; + ret |= sigaltstack(&ss, NULL); + return ret ? 0 : 1; +} +EOC +cyn=sigaltstack +set d_sigaltstack +eval $trylink + : see if sigprocmask exists $cat >try.c <<EOC #include <signal.h> @@ -6995,6 +8153,76 @@ ;; esac +: see whether socket exists +socketlib='' +sockethdr='' +echo " " +$echo $n "Hmm... $c" >&4 +if set socket val -f d_socket; eval $csym; $val; then + echo "Looks like you have Berkeley networking support." >&4 + d_socket="$define" + if set setsockopt val -f; eval $csym; $val; then + d_oldsock="$undef" + else + echo "...but it uses the old 4.1c interface, rather than 4.2" >&4 + d_oldsock="$define" + fi +else + if $contains socklib libc.list >/dev/null 2>&1; then + echo "Looks like you have Berkeley networking support." >&4 + d_socket="$define" + : we will have to assume that it supports the 4.2 BSD interface + d_oldsock="$undef" + else + echo "You don't have Berkeley networking in libc$_a..." >&4 + if test -f /usr/lib/libnet$_a; then + ( (nm $nm_opt /usr/lib/libnet$_a | eval $nm_extract) || \ + ar t /usr/lib/libnet$_a) 2>/dev/null >> libc.list + if $contains socket libc.list >/dev/null 2>&1; then + echo "...but the Wollongong group seems to have hacked it in." >&4 + socketlib="-lnet" + sockethdr="-I/usr/netinclude" + d_socket="$define" + if $contains setsockopt libc.list >/dev/null 2>&1; then + d_oldsock="$undef" + else + echo "...using the old 4.1c interface, rather than 4.2" >&4 + d_oldsock="$define" + fi + else + echo "or even in libnet$_a, which is peculiar." >&4 + d_socket="$undef" + d_oldsock="$undef" + fi + else + echo "or anywhere else I see." >&4 + d_socket="$undef" + d_oldsock="$undef" + fi + fi +fi + +: see if socketpair exists +$cat >try.c <<EOC +#$i_syssock I_SYS_SOCKET +#$i_winsock2 I_WINSOCK2 +#ifdef I_SYS_SOCKET +#include <sys/socket.h> +#endif +#ifdef I_WINSOCK2 +#include <Winsock2.h> +#endif +int main(void) +{ + static int ret, domain, type, protocol, sv2; + ret |= socketpair(domain, type, protocol, sv); + return ret ? 0 : 1; +} +EOC +cyn=socketpair +set d_sockpair +eval $trylink + : see if this is a sys/mount system set sys/mount.h i_sysmount eval $inhdr @@ -7096,6 +8324,24 @@ set d_sync_atomic eval $trylink +: see if syscall exists +$cat >try.c <<EOC +#include <sys/syscall.h> +#$i_unistd I_UNISTD +#ifdef I_UNISTD +#include <unistd.h> +#endif +int main(void) +{ + static int ret, number; + ret |= syscall(number, 0); + return ret ? 0 : 1; +} +EOC +cyn=syscall +set d_syscall +eval $trylink + : see if sysctl exists $cat >try.c <<EOC #include <sys/param.h> @@ -7196,6 +8442,105 @@ set d_ttyname eval $trylink +: see if this is a ucontext.h system +set ucontext.h i_ucontext +eval $inhdr + +: see if this is a sys/ucontext.h system +set sys/ucontext.h i_sys_ucontext +eval $inhdr + +: when both ucontext.h and sys/ucontext.h are available, check which one works +case "$i_ucontext$i_sys_ucontext" in +"$define$define") + echo " " + $cat >try.c <<'EOC' +#ifdef I_UCONTEXT +#include <ucontext.h> +#endif +#ifdef I_SYS_UCONTEXT +#include <sys/ucontext.h> +#endif + +int main(void) +{ + static ucontext_t u; + return (int) sizeof(u) & 0xff; +} +EOC + $echo $n "Checking whether including <ucontext.h> alone works...$c" >&4 + working= + if $cc $ccflags -DI_UCONTEXT -o try try.c $ldflags >/dev/null 2>&1; then + working="$define" + fi + case "$working" in + "$define") + echo " yes." >&4 + i_sys_ucontext="$undef" + ;; + *) + echo "no." >&4 + echo " " + $echo $n "Checking whether including <sys/ucontext.h> works...$c" >&4 + working= + if $cc $ccflags -DI_SYS_UCONTEXT \ + -o try try.c $ldflags >/dev/null 2>&1 + then + working="$define" + fi + case "$working" in + "$define") + echo " yes, ignoring <ucontext.h>." >&4 + i_ucontext="$undef" + ;; + *) echo " no, we'll include both then." >&4;; + esac + ;; + esac + ;; +esac +$rm -f try.* + +: check for machine context field in the ucontext structure +$cat >try.c <<EOC +#$i_ucontext I_UCONTEXT +#$i_sys_ucontext I_SYS_UCONTEXT +#ifdef I_UCONTEXT +#include <ucontext.h> +#endif +#ifdef I_SYS_UCONTEXT +#include <sys/ucontext.h> +#endif +int main(void) +{ + static ucontext_t *uc = 0; + return (int) &uc->uc_mcontext; +} +EOC +cyn="whether 'struct ucontext' has a 'uc_mcontext' member" +set d_uctx_mctx +eval $trylink + +: check for general register access through the ucontext structure +$cat >try.c <<EOC +#$i_ucontext I_UCONTEXT +#$i_sys_ucontext I_SYS_UCONTEXT +#ifdef I_UCONTEXT +#include <ucontext.h> +#endif +#ifdef I_SYS_UCONTEXT +#include <sys/ucontext.h> +#endif +int main(void) +{ + static ucontext_t uc; + return uc.uc_mcontext.gregs0; +} +EOC +cyn="whether 'struct ucontext' has a 'mcontext.gregs' member" +set d_uctx_mctx_gregs +eval $trylink + : see if we have to deal with yellow pages, now NIS. if $test -d /usr/etc/yp || $test -d /etc/yp || $test -d /usr/lib/yp; then if $test -f /usr/etc/nibindd; then @@ -7415,6 +8760,52 @@ set d_usleep eval $trylink +: see if there is a vfork +$cat >try.c <<EOC +#include <sys/types.h> +#$i_unistd I_UNISTD +#ifdef I_UNISTD +#include <unistd.h> +#endif +int main(void) +{ + static pid_t ret; + ret |= vfork(); + return ret ? 0 : 1; +} +EOC +cyn=vfork +set val +eval $trylink + + +: Ok, but do we want to use it. vfork is reportedly unreliable in +: perl on Solaris 2.x, and probably elsewhere. +case "$val" in +$define) + echo " " + case "$usevfork" in + false) dflt='n';; + *) dflt='y';; + esac + rp="Some systems have problems with vfork(). Do you want to use it?" + . ./myread + case "$ans" in + y|Y) ;; + *) + echo "Ok, we won't use vfork()." + val="$undef" + ;; + esac + ;; +esac +set d_vfork +eval $setvar +case "$d_vfork" in +$define) usevfork='true';; +*) usevfork='false';; +esac + : check for volatile keyword echo " " echo 'Checking to see if your C compiler knows about "volatile"...' >&4 @@ -7623,16 +9014,6 @@ long l; float f; double d; -#ifdef LLONG_MAX - long long ll; -#else -#warning "LLONG_MAX undefined" -#endif -#if defined(HUGE_VALL) - long double ld; -#else -#warning "HUGE_VALL undefined" -#endif #ifdef UINT32_MAX uint32_t u32; #else @@ -7665,8 +9046,7 @@ union u b; }; -#define STATIC_ASSERT(expr) \ - do { switch (0) { case ((expr) ? 1 : 0): case 0: break; } } while(0) +#include "static_assert.h" int main(void) @@ -7699,6 +9079,80 @@ . ./myread alignbytes="$ans" +: check for ordering of bytes in a word +echo " " +$echo $n "Checking integer byte-ordering...$c" >&4 +$cat >try.c <<'EOCP' +short ascii_be = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; +short ascii_le = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; +short ebcdic_be = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; +short ebcdic_le = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; +EOCP +order='' +if $cc -c $ccflags try.c >/dev/null 2>&1; then + if $contains BIGenDianSyS try$_o >/dev/null 2>&1; then + order=4321 + elif $contains LiTTleEnDian try$_o >/dev/null 2>&1; then + order=1234 + else + $echo $n " wild guessing$c" >&4 + order=4321 + fi +fi +case "$order" in +'') + echo " cannot compute it." >&4 + rp="Are integers stored in big-endian format?" + case "$byteorder" in + 1234) dflt=n;; + *) dflt=y;; + esac + . ./myread + case "$ans" in + y*) order=4321;; + *) order=1234;; + esac + ;; +1234) echo " little-endian." >&4;; +4321) echo " big-endian." >&4;; +esac +byteorder=$order +$rm -f try.c try$_o + +: check for length of character +echo " " +$echo $n "Checking to see how big your characters are...$c" >&4 +for size in 1 2 4 8 error; do + $cat >try.c <<EOCP +#include "static_assert.h" +char foo; +int main() +{ + STATIC_ASSERT($size == sizeof(foo)); + return 0; +} +EOCP + if $cc -c $ccflags try.c >/dev/null 2>&1; then break; fi +done +case "$size" in +error) + echo " cannot compute it." >&4 + dflt=1 + rp="What is the size of a character (in bytes)?" + . ./myread + charsize="$ans" + ;; +*) + case "$size" in + 1) s='';; + *) s='s';; + esac + echo " $size byte$s." >&4 + charsize=$size + ;; +esac +$rm -f try.* + : how do we catenate cpp tokens here? echo " " echo "Checking to see how your cpp does stuff like catenate tokens..." >&4 @@ -8193,7 +9647,7 @@ echo " " echo "Figuring out my version number..." >&4 $cat > ver <<'EOC' -/^#define GTA_VERSION/ { major=$3 } +/^#define GTA_VERSION / { major=$3 } /^#define GTA_SUBVERSION/ { minor=$3 } /^#define GTA_PATCHLEVEL/ { tiny=$3 } /^#define GTA_REVCHAR/ { rev=$3; gsub("^a-zA-Z", "", rev); } @@ -8259,7 +9713,12 @@ creatdir="$prog -d" fi (ls -l d/try >try.ls; ls -l d/try.ns >tryno.ls) 2>/dev/null - if (cmp -s d/try try && cmp -s d/try.ns try.ns && \ + try_wc=`($wc -c try | $awk '{ print $1}') 2>/dev/null` + tryns_wc=`($wc -c try.ns | $awk '{ print $1}') 2>/dev/null` + d_try_wc=`($wc -c d/try | $awk '{ print $1}') 2>/dev/null` + d_tryns_wc=`($wc -c d/try.ns | $awk '{ print $1}') 2>/dev/null` + if ($test "X$try_wc" = "X$d_try_wc" && \ + $test "X$tryns_wc" = "X$d_tryns_wc" && \ $contains 'rwxrw-r--' tryno.ls && \ $contains 'rw-r---w-' try.ls) >/dev/null 2>&1 then @@ -8598,7 +10057,7 @@ chmod +x $mkdep $eunicefix $mkdep if $mkdep dep.c >dep.out 2>/dev/null && - $contains "dep$_o: dep.h" dep.out >/dev/null 2>&1 + $contains "dep$_o:.*dep\.h" dep.out >/dev/null 2>&1 then echo "Looks like we can use $cc -MM." else @@ -9053,6 +10512,46 @@ sig_size=`echo $sig_name | awk '{print NF}'` $rm -f signal signal.c signal.awk signal.lst signal_cmd +: see if difftime exists +$cat >try.c <<EOC +#include <time.h> +int main(void) +{ + static double ret; + static time_t t0, t1; + ret = difftime(t1, t0) * 1.0; + return ret ? 0 : 1; +} +EOC +cyn=difftime +set d_difftime +eval $trylink + +: see whether difftime should be used +case "$d_difftime" in +"$define") + $cat >try.c <<EOC +#include "static_assert.h" +#include <time.h> +int main(void) +{ + STATIC_ASSERT((time_t) -1 < 0); + return 0; +} +EOC + cyn="whether difftime() can be avoided" + set avoid_difftime + eval $trylink + ;; +*) avoid_difftime="$define";; +esac +case "$avoid_difftime" in +"$define") val="$undef";; +*) val="$define";; +esac +set use_difftime +eval $setvar + : check for void type echo " " echo "Checking to see how well your C compiler groks the void type..." >&4 @@ -9237,30 +10736,6 @@ set i_alloca eval $trylink -: see if this is a sys/file.h system -val='' -set sys/file.h val -eval $inhdr - -: do we need to include sys/file.h ? -case "$val" in -"$define") - echo " " - if $h_sysfile; then - val="$define" - echo "We'll be including <sys/file.h>." >&4 - else - val="$undef" - echo "We won't be including <sys/file.h>." >&4 - fi - ;; -*) - h_sysfile=false - ;; -esac -set i_sysfile -eval $setvar - : see if fcntl.h is there val='' set fcntl.h val @@ -9392,6 +10867,10 @@ set regex.h i_regex eval $inhdr +: see if this is a sched.h system +set sched.h i_sched +eval $inhdr + : see if stdarg is available echo " " if $test `./findhdr stdarg.h`; then @@ -9513,6 +10992,14 @@ *) strings=`./findhdr string.h`;; esac +: see if this is a sys/ipc system +set sys/ipc.h i_sysipc +eval $inhdr + +: see if this is a sys/sem system +set sys/sem.h i_syssem +eval $inhdr + : see if this is a sys/sendfile system set sys/sendfile.h i_syssendfile eval $inhdr @@ -9525,89 +11012,6 @@ set sys/sysctl.h i_syssysctl eval $inhdr -: see if we should include time.h, sys/time.h, or both -echo " " -echo "Testing to see if we should include <time.h>, <sys/time.h> or both." >&4 -$echo $n "I'm now running the test program...$c" -$cat >try.c <<'EOCP' -#include <sys/types.h> -#ifdef I_TIME -#include <time.h> -#endif -#ifdef I_SYSTIME -#ifdef SYSTIMEKERNEL -#define KERNEL -#endif -#include <sys/time.h> -#endif -#ifdef I_SYSSELECT -#include <sys/select.h> -#endif -int main(void) -{ - struct tm foo; -#ifdef S_TIMEVAL - struct timeval bar; -#endif -#ifdef S_TIMEZONE - struct timezone tzp; -#endif - if (foo.tm_sec == foo.tm_sec) - return 0; -#ifdef S_TIMEVAL - if (bar.tv_sec == bar.tv_sec) - return 0; -#endif - return 1; -} -EOCP -flags='' -for s_timezone in '-DS_TIMEZONE' ''; do -sysselect='' -for s_timeval in '-DS_TIMEVAL' ''; do -for i_systimek in '' '-DSYSTIMEKERNEL'; do -for i_time in '' '-DI_TIME'; do -for i_systime in '-DI_SYSTIME' ''; do - case "$flags" in - '') $echo $n ".$c" - if $cc $ccflags \ - $i_time $i_systime $i_systimek $sysselect $s_timeval $s_timezone \ - -o try try.c >/dev/null 2>&1 ; then - set X $i_time $i_systime $i_systimek $sysselect $s_timeval - shift - flags="$*" - echo " " - $echo $n "Succeeded with $flags$c" - fi - ;; - esac -done -done -done -done -done -timeincl='' -echo " " -case "$flags" in -*SYSTIMEKERNEL*) i_systimek="$define" - timeincl=`./findhdr sys/time.h` - echo "We'll include <sys/time.h> with KERNEL defined." >&4;; -*) i_systimek="$undef";; -esac -case "$flags" in -*I_TIME*) i_time="$define" - timeincl=`./findhdr time.h`" $timeincl" - echo "We'll include <time.h>." >&4;; -*) i_time="$undef";; -esac -case "$flags" in -*I_SYSTIME*) i_systime="$define" - timeincl=`./findhdr sys/time.h`" $timeincl" - echo "We'll include <sys/time.h>." >&4;; -*) i_systime="$undef";; -esac -$rm -f try.c try - : see if this is a sys/utsname system set sys/utsname.h i_sysutsname eval $inhdr @@ -9995,6 +11399,7 @@ binexp='$binexp' bison='$bison' byacc='$byacc' +byteorder='$byteorder' c='$c' cat='$cat' cc='$cc' @@ -10003,6 +11408,7 @@ ccversion='$ccversion' cf_by='$cf_by' cf_time='$cf_time' +charsize='$charsize' chgrp='$chgrp' chmod='$chmod' chown='$chown' @@ -10030,17 +11436,31 @@ d_backtrace='$d_backtrace' d_bcmp='$d_bcmp' d_bcopy='$d_bcopy' +d_bfd_lib='$d_bfd_lib' d_bindtxtcode='$d_bindtxtcode' d_bsd='$d_bsd' +d_bsearch='$d_bsearch' +d_built_bswap32='$d_built_bswap32' +d_built_bswap64='$d_built_bswap64' +d_built_clz='$d_built_clz' +d_built_ctz='$d_built_ctz' d_built_popcount='$d_built_popcount' d_bzero='$d_bzero' +d_can64='$d_can64' +d_clearenv='$d_clearenv' +d_clock_getres='$d_clock_getres' +d_clock_gettime='$d_clock_gettime' d_closefrom='$d_closefrom' d_const='$d_const' d_dbus='$d_dbus' d_deflate='$d_deflate' d_dev_poll='$d_dev_poll' +d_difftime='$d_difftime' +d_dirent_d_namlen='$d_dirent_d_namlen' d_dirent_d_type='$d_dirent_d_type' +d_dirfd='$d_dirfd' d_dirnamlen='$d_dirnamlen' +d_dladdr='$d_dladdr' d_dos='$d_dos' d_enablenls='$d_enablenls' d_end_symbol='$d_end_symbol' @@ -10049,16 +11469,28 @@ d_etext_symbol='$d_etext_symbol' d_eunice='$d_eunice' d_fast_assert='$d_fast_assert' +d_fchdir='$d_fchdir' +d_fdatasync='$d_fdatasync' +d_fdopendir='$d_fdopendir' d_fork='$d_fork' +d_fstatat='$d_fstatat' +d_fsync='$d_fsync' +d_ftime='$d_ftime' d_getaddrinfo='$d_getaddrinfo' d_geteuid='$d_geteuid' d_gethname='$d_gethname' d_getifaddrs='$d_getifaddrs' d_getinvent='$d_getinvent' d_getlogin='$d_getlogin' +d_getnameinfo='$d_getnameinfo' d_getppid='$d_getppid' +d_getprogname='$d_getprogname' +d_getpwnam='$d_getpwnam' +d_getpwuid='$d_getpwuid' +d_getrlimit='$d_getrlimit' d_gettblsz='$d_gettblsz' d_gettext='$d_gettext' +d_gettimeod='$d_gettimeod' d_getuid='$d_getuid' d_glib='$d_glib' d_gnulibc='$d_gnulibc' @@ -10068,6 +11500,9 @@ d_herror='$d_herror' d_hstrerror='$d_hstrerror' d_iconv='$d_iconv' +d_ieee754='$d_ieee754' +d_ilp32='$d_ilp32' +d_ilp64='$d_ilp64' d_index='$d_index' d_inflate='$d_inflate' d_iptos='$d_iptos' @@ -10077,20 +11512,26 @@ d_kqueue='$d_kqueue' d_linux='$d_linux' d_locale_charset='$d_locale_charset' +d_lp64='$d_lp64' d_lstat='$d_lstat' d_madvise='$d_madvise' d_memalign='$d_memalign' d_memcpy='$d_memcpy' d_memmove='$d_memmove' +d_mempcpy='$d_mempcpy' d_mmap='$d_mmap' d_msghdr_msg_flags='$d_msghdr_msg_flags' +d_mymalloc='$d_mymalloc' d_nanosleep='$d_nanosleep' d_nls='$d_nls' d_official='$d_official' +d_oldsock='$d_oldsock' d_open3='$d_open3' +d_openat='$d_openat' d_os2='$d_os2' d_pause='$d_pause' d_phostname='$d_phostname' +d_pipe2='$d_pipe2' d_poll='$d_poll' d_popen='$d_popen' d_portable='$d_portable' @@ -10098,6 +11539,8 @@ d_posix_memalign='$d_posix_memalign' d_pread='$d_pread' d_preadv='$d_preadv' +d_proginvocname='$d_proginvocname' +d_ptattr_setstack='$d_ptattr_setstack' d_pwage='$d_pwage' d_pwchange='$d_pwchange' d_pwclass='$d_pwclass' @@ -10112,32 +11555,46 @@ d_remotectrl='$d_remotectrl' d_rusage='$d_rusage' d_sbrk='$d_sbrk' +d_sched_yield='$d_sched_yield' d_select='$d_select' +d_semctl='$d_semctl' +d_semget='$d_semget' +d_semop='$d_semop' +d_semtimedop='$d_semtimedop' d_sendfile='$d_sendfile' +d_setenv='$d_setenv' d_setproctitle='$d_setproctitle' +d_setprogname='$d_setprogname' d_setsid='$d_setsid' d_sigaction='$d_sigaction' +d_sigaltstack='$d_sigaltstack' d_sigprocmask='$d_sigprocmask' d_sigsetjmp='$d_sigsetjmp' d_sockaddr_in_sin_len='$d_sockaddr_in_sin_len' d_sockaddr_un='$d_sockaddr_un' d_socker_get='$d_socker_get' +d_socket='$d_socket' +d_sockpair='$d_sockpair' d_statfs='$d_statfs' d_statvfs='$d_statvfs' d_strchr='$d_strchr' d_strlcat='$d_strlcat' d_strlcpy='$d_strlcpy' d_sync_atomic='$d_sync_atomic' +d_syscall='$d_syscall' d_sysctl='$d_sysctl' d_system='$d_system' d_times='$d_times' d_ttyname='$d_ttyname' +d_uctx_mctx='$d_uctx_mctx' +d_uctx_mctx_gregs='$d_uctx_mctx_gregs' d_uname='$d_uname' d_useglib1='$d_useglib1' d_useglib2='$d_useglib2' d_usegtk1='$d_usegtk1' d_usegtk2='$d_usegtk2' d_usleep='$d_usleep' +d_vfork='$d_vfork' d_voidsig='$d_voidsig' d_volatile='$d_volatile' d_vsnprintf='$d_vsnprintf' @@ -10162,6 +11619,7 @@ find='$find' firstmakefile='$firstmakefile' flex='$flex' +freetype='$freetype' from='$from' gcc='$gcc' gccosandvers='$gccosandvers' @@ -10196,6 +11654,7 @@ i_alloca='$i_alloca' i_arpainet='$i_arpainet' i_dirent='$i_dirent' +i_dlfcn='$i_dlfcn' i_execinfo='$i_execinfo' i_fcntl='$i_fcntl' i_iconv='$i_iconv' @@ -10220,23 +11679,28 @@ i_pthread='$i_pthread' i_pwd='$i_pwd' i_regex='$i_regex' +i_sched='$i_sched' i_stdarg='$i_stdarg' i_stdlib='$i_stdlib' i_string='$i_string' +i_sys_ucontext='$i_sys_ucontext' i_sysfile='$i_sysfile' i_sysin='$i_sysin' +i_sysipc='$i_sysipc' i_sysmman='$i_sysmman' i_sysmount='$i_sysmount' i_sysparam='$i_sysparam' i_syspoll='$i_syspoll' i_sysresrc='$i_sysresrc' i_sysselct='$i_sysselct' +i_syssem='$i_syssem' i_syssendfile='$i_syssendfile' i_syssock='$i_syssock' i_sysstat='$i_sysstat' i_sysstatvfs='$i_sysstatvfs' i_syssysctl='$i_syssysctl' i_systime='$i_systime' +i_systimeb='$i_systimeb' i_systimek='$i_systimek' i_systimes='$i_systimes' i_systypes='$i_systypes' @@ -10245,12 +11709,15 @@ i_sysvfs='$i_sysvfs' i_syswait='$i_syswait' i_time='$i_time' +i_ucontext='$i_ucontext' i_unistd='$i_unistd' i_varargs='$i_varargs' i_varhdr='$i_varhdr' i_winsock2='$i_winsock2' i_ws2tcpip='$i_ws2tcpip' i_zlib='$i_zlib' +ieee754_byteorder='$ieee754_byteorder' +ilp='$ilp' incpath='$incpath' inews='$inews' install='$install' @@ -10259,6 +11726,7 @@ installdir='$installdir' installmansrc='$installmansrc' installprivlib='$installprivlib' +intsize='$intsize' issymlink='$issymlink' ksh='$ksh' large='$large' @@ -10283,6 +11751,7 @@ localeexp='$localeexp' locincpth='$locincpth' loclibpth='$loclibpth' +longsize='$longsize' lp='$lp' lpr='$lpr' ls='$ls' @@ -10290,6 +11759,9 @@ mailx='$mailx' make='$make' make_set_make='$make_set_make' +mallocobj='$mallocobj' +mallocsrc='$mallocsrc' +malloctype='$malloctype' manext='$manext' mansrc='$mansrc' mansrcexp='$mansrcexp' @@ -10334,6 +11806,8 @@ privlib='$privlib' privlibexp='$privlibexp' prototype='$prototype' +pthread='$pthread' +ptrsize='$ptrsize' ranlib='$ranlib' rd_nodata='$rd_nodata' remotectrl='$remotectrl' @@ -10346,6 +11820,7 @@ sh='$sh' shar='$shar' sharpbang='$sharpbang' +shortsize='$shortsize' shsharp='$shsharp' sig_count='$sig_count' sig_name='$sig_name' @@ -10360,6 +11835,8 @@ so='$so' sockercflags='$sockercflags' sockerldflags='$sockerldflags' +sockethdr='$sockethdr' +socketlib='$socketlib' sort='$sort' spackage='$spackage' spitshell='$spitshell' @@ -10384,12 +11861,16 @@ troff='$troff' uname='$uname' uniq='$uniq' +use_difftime='$use_difftime' usecrosscompile='$usecrosscompile' +usemymalloc='$usemymalloc' usenm='$usenm' +usevfork='$usevfork' usrinc='$usrinc' uuname='$uuname' vi='$vi' voidflags='$voidflags' +wc='$wc' xgettext='$xgettext' xlibpth='$xlibpth' yacc='$yacc' @@ -10434,8 +11915,7 @@ : Finish up by extracting the .SH files case "$alldone" in exit) - $rm -rf UU - echo "Extraction done." + echo "Stopping at your request, leaving temporary files around." exit 0 ;; cont)
View file
gtk-gnutella-0.98.2.tar.bz2/Jmakefile -> gtk-gnutella-1.1.9.tar.bz2/Jmakefile
Changed
@@ -1,6 +1,4 @@ /* - * $Id$ - * * Copyright (c) 2003, Raphael Manfredi * * Main Jmakefile for gtk-gnutella. @@ -25,8 +23,6 @@ *---------------------------------------------------------------------- */ -;# $Id$ - all:: /* So that default target is not clobber! */ SetSubdirs(src pixmaps po extra_files)
View file
gtk-gnutella-0.98.2.tar.bz2/MANIFEST -> gtk-gnutella-1.1.9.tar.bz2/MANIFEST
Changed
@@ -8,10 +8,13 @@ Makefile.SH README README.Debian +README.Windows README.xmingw TODO U/modified/End.U U/modified/Myinit.U +U/modified/alignbytes.U +U/modified/mallocsrc.U U/modified/prototype.U U/packages/dbusconfig.U U/packages/glade.U @@ -40,6 +43,7 @@ doc/api/gtkg-apidoc.cfg doc/api/gtkg-apidoc.main doc/devguide/Announce-template.txt +doc/devguide/Coverity doc/devguide/DEBUGGING doc/devguide/GUI-hacking doc/devguide/HOMEPAGE @@ -68,6 +72,7 @@ doc/gnutella/crawler doc/gnutella/deflated_udp doc/gnutella/dynamic_query +doc/gnutella/gnet-TLS-upgrade doc/gnutella/gwcache doc/gnutella/handshaking_0.6 doc/gnutella/hostname @@ -83,11 +88,14 @@ doc/gnutella/msg/proxy_cancel doc/gnutella/msg/route_lost doc/gnutella/msg/time_sync +doc/gnutella/oob-shortcut doc/gnutella/out-of-band +doc/gnutella/out-of-band-v3 doc/gnutella/ping-pong doc/gnutella/push_proxy doc/gnutella/push_url doc/gnutella/query_keys +doc/gnutella/udp_transceiver doc/gnutella/ultra-peers doc/gnutella/ultrapeer_qrp doc/gnutella/vendor_msg @@ -123,6 +131,7 @@ doc/public/GGEP/HNAME doc/public/GGEP/LF doc/public/GGEP/M +doc/public/GGEP/PRU doc/public/GGEP/T doc/public/GGEP/Z doc/public/GGEP/bin_format @@ -138,7 +147,11 @@ extra_files/en/FAQ extra_files/en/Jmakefile extra_files/en/Makefile.SH +extra_files/en/glossary extra_files/favicon.png GTKG's favorite web icon +extra_files/fr/FAQ +extra_files/fr/Jmakefile +extra_files/fr/Makefile.SH extra_files/geo-ip.txt extra_files/geo-ipv6.txt extra_files/gtk-gnutella.128.png @@ -146,9 +159,11 @@ extra_files/gtk-gnutella.256.png extra_files/gtk-gnutella.32.png extra_files/gtk-gnutella.512.png +extra_files/gtk-gnutella.appdata.xml extra_files/gtk-gnutella.desktop extra_files/gtk-gnutella.png extra_files/gtk-gnutella.svg +extra_files/gwcache.boot extra_files/hostiles.txt extra_files/ja/FAQ extra_files/ja/Jmakefile @@ -157,6 +172,9 @@ extra_files/robots.txt Default hints for web crawlers extra_files/spam.txt extra_files/spam_sha1.txt +extra_files/tr/FAQ +extra_files/tr/Jmakefile +extra_files/tr/Makefile.SH gtk-gnutella.nsi Windows packaging gtk-gnutella_spec.SH Produces gtk-gnutella.spec install.SH BSD-compatible install program @@ -187,8 +205,10 @@ pixmaps/firewall_udp.xpm pixmaps/firewall_udp_punchable.xpm pixmaps/freeze.xpm +pixmaps/go_back.xpm +pixmaps/hungup.xpm pixmaps/icon.16x16.xpm -pixmaps/icon.32x32.xpm +pixmaps/icon.48x48.xpm pixmaps/icon.ico pixmaps/icon.xpm pixmaps/leaf.xpm @@ -196,7 +216,9 @@ pixmaps/magnet.16x16.png pixmaps/magnet.32x32.png pixmaps/magnet.64x64.png +pixmaps/natpmp.xpm pixmaps/no_firewall.xpm +pixmaps/no_listening.xpm pixmaps/offline.xpm pixmaps/online.xpm pixmaps/pause.xpm @@ -238,19 +260,26 @@ po/tr.po po/uk.po po/zh_CN.po +scripts/enum-msg.pl scripts/fix_copyright.pl scripts/generic-cat +scripts/generic-pp scripts/geo-to-db.pl scripts/geo6-to-db.pl scripts/git-revision scripts/git-version.sh scripts/gtkg-dbus-listener.py scripts/gtkg-version +scripts/lntool.sh scripts/magnet-handler.sh +scripts/nm-list scripts/sha1_cache.pl scripts/sha1_cache.sh src/Jmakefile src/Makefile.SH +src/bin/Jmakefile +src/bin/Makefile.SH +src/bin/sha1sum.c src/casts.h src/common.h src/core/Jmakefile @@ -263,8 +292,6 @@ src/core/bh_download.h src/core/bh_upload.c src/core/bh_upload.h -src/core/bitzi.c -src/core/bitzi.h src/core/bogons.c src/core/bogons.h src/core/bsched.c @@ -289,10 +316,26 @@ src/core/extensions.h src/core/features.c src/core/features.h -src/core/file_object.c -src/core/file_object.h src/core/fileinfo.c src/core/fileinfo.h +src/core/g2/Jmakefile +src/core/g2/Makefile.SH +src/core/g2/build.c +src/core/g2/build.h +src/core/g2/frame.c +src/core/g2/frame.h +src/core/g2/gwc.c +src/core/g2/gwc.h +src/core/g2/msg.c +src/core/g2/msg.h +src/core/g2/node.c +src/core/g2/node.h +src/core/g2/rpc.c +src/core/g2/rpc.h +src/core/g2/tfmt.c +src/core/g2/tfmt.h +src/core/g2/tree.c +src/core/g2/tree.h src/core/gdht.c src/core/gdht.h src/core/geo_ip.c @@ -382,6 +425,8 @@ src/core/rx_inflate.h src/core/rx_link.c src/core/rx_link.h +src/core/rx_ut.c +src/core/rx_ut.h src/core/rxbuf.c src/core/rxbuf.h src/core/search.c @@ -426,8 +471,13 @@ src/core/tx_dgram.h src/core/tx_link.c src/core/tx_link.h +src/core/tx_ut.c +src/core/tx_ut.h src/core/udp.c src/core/udp.h +src/core/udp_reliable.h +src/core/udp_sched.c +src/core/udp_sched.h src/core/uhc.c src/core/uhc.h src/core/upload_stats.c @@ -448,6 +498,7 @@ src/core/vmsg.h src/core/whitelist.c src/core/whitelist.h +src/coverity.c src/dht/Jmakefile src/dht/Makefile.SH src/dht/acct.c @@ -482,6 +533,7 @@ src/dht/ulq.h src/dht/values.c src/dht/values.h +src/gcc.h src/gtk-gnutella.h src/gtk-gnutella.man src/if/Jmakefile @@ -492,12 +544,12 @@ src/if/bridge/c2ui.h src/if/bridge/ui2c.c src/if/bridge/ui2c.h -src/if/core/bitzi.h src/if/core/bsched.h src/if/core/downloads.h src/if/core/fileinfo.h src/if/core/filter.h src/if/core/gnutella.h +src/if/core/guess.h src/if/core/guid.h src/if/core/hcache.h src/if/core/hsep.h @@ -526,6 +578,35 @@ src/if/dht/routing.h src/if/dht/stable.h src/if/dht/value.h +src/if/gen/Jmakefile +src/if/gen/Makefile.SH +src/if/gen/dmesh_url.c +src/if/gen/dmesh_url.h +src/if/gen/dmesh_url.lst +src/if/gen/drop.lst +src/if/gen/gnr_stats.c +src/if/gen/gnr_stats.h +src/if/gen/http_async.c +src/if/gen/http_async.h +src/if/gen/http_async.lst +src/if/gen/http_url.c +src/if/gen/http_url.h +src/if/gen/http_url.lst +src/if/gen/ignore.c +src/if/gen/ignore.h +src/if/gen/ignore.lst +src/if/gen/iprange.c +src/if/gen/iprange.h +src/if/gen/iprange.lst +src/if/gen/msg.c +src/if/gen/msg.h +src/if/gen/msg.lst +src/if/gen/msg_drop.c +src/if/gen/msg_drop.h +src/if/gen/stats.lst +src/if/gen/vxml.c +src/if/gen/vxml.h +src/if/gen/vxml.lst src/if/gnet_property.c src/if/gnet_property.h src/if/gnet_property_priv.h @@ -535,7 +616,6 @@ src/if/gui_property_priv.h src/if/gui_props.ag src/if/props.tpl -src/if/ui/gtk/bitzi.h src/if/ui/gtk/downloads.h src/if/ui/gtk/gnet_stats.h src/if/ui/gtk/misc.h @@ -549,43 +629,83 @@ src/lib/adns.h src/lib/aging.c src/lib/aging.h +src/lib/aje.c +src/lib/aje.h +src/lib/alloca.c +src/lib/alloca.h +src/lib/aq.c +src/lib/aq.h src/lib/arc4random.c src/lib/arc4random.h +src/lib/argv.c +src/lib/argv.h src/lib/array.h +src/lib/array_util.h src/lib/ascii.c src/lib/ascii.h +src/lib/atio.c +src/lib/atio.h src/lib/atomic.h src/lib/atoms.c src/lib/atoms.h +src/lib/barrier.c +src/lib/barrier.h src/lib/base16.c src/lib/base16.h src/lib/base32.c src/lib/base32.h src/lib/base64.c src/lib/base64.h +src/lib/bfd_util.c +src/lib/bfd_util.h src/lib/bg.c src/lib/bg.h +src/lib/bigint.c +src/lib/bigint.h src/lib/bit_array.ht src/lib/bit_field.ht src/lib/bit_generic.t +src/lib/bsearch.h src/lib/bstr.c src/lib/bstr.h +src/lib/buf.c +src/lib/buf.h +src/lib/chi2.c +src/lib/chi2.h src/lib/ckalloc.c src/lib/ckalloc.h +src/lib/cmwc.c +src/lib/cmwc.h src/lib/cobs.c src/lib/cobs.h +src/lib/compat_gettid.c +src/lib/compat_gettid.h src/lib/compat_misc.c src/lib/compat_misc.h +src/lib/compat_pause.c +src/lib/compat_pause.h src/lib/compat_pio.c src/lib/compat_pio.h src/lib/compat_poll.c src/lib/compat_poll.h +src/lib/compat_sendfile.c +src/lib/compat_sendfile.h +src/lib/compat_setjmp.c +src/lib/compat_setjmp.h src/lib/compat_sleep_ms.c src/lib/compat_sleep_ms.h +src/lib/compat_statvfs.c +src/lib/compat_statvfs.h src/lib/compat_un.c src/lib/compat_un.h +src/lib/compat_usleep.c +src/lib/compat_usleep.h src/lib/concat.c src/lib/concat.h +src/lib/cond.c +src/lib/cond.h +src/lib/constants.c +src/lib/constants.h src/lib/cpufreq.c src/lib/cpufreq.h src/lib/cq.c @@ -594,6 +714,8 @@ src/lib/crash.h src/lib/crc.c src/lib/crc.h +src/lib/dam.c +src/lib/dam.h src/lib/dbmap.c src/lib/dbmap.h src/lib/dbmw.c @@ -604,28 +726,47 @@ src/lib/dbus_util.h src/lib/debug.c src/lib/debug.h +src/lib/dl_util.c +src/lib/dl_util.h src/lib/dualhash.c src/lib/dualhash.h src/lib/dump_options.h +src/lib/eclist.h +src/lib/elist.c +src/lib/elist.h src/lib/endian.h src/lib/entropy.c src/lib/entropy.h +src/lib/erbtree.c +src/lib/erbtree.h +src/lib/eslist.c +src/lib/eslist.h +src/lib/etree.c +src/lib/etree.h src/lib/eval.c src/lib/eval.h src/lib/event.c src/lib/event.h +src/lib/evq.c +src/lib/evq.h src/lib/exit.c src/lib/exit.h +src/lib/exit2str.c +src/lib/exit2str.h src/lib/fast_assert.c src/lib/fast_assert.h src/lib/fd.c src/lib/fd.h -src/lib/fifo.c src/lib/fifo.h src/lib/file.c src/lib/file.h +src/lib/file_object.c +src/lib/file_object.h src/lib/filehead.c src/lib/filehead.h +src/lib/filelock-test.c +src/lib/filelock.c +src/lib/filelock.h src/lib/filename.c src/lib/filename.h src/lib/float-dragon_out.bz2 @@ -635,13 +776,26 @@ src/lib/floats.bz2 src/lib/fragcheck.c src/lib/fragcheck.h +src/lib/frand.c +src/lib/frand.h src/lib/fs_free_space.c src/lib/fs_free_space.h +src/lib/ftw-mktree +src/lib/ftw-root.out +src/lib/ftw-test.c +src/lib/ftw.c +src/lib/ftw.h +src/lib/gentime.c +src/lib/gentime.h +src/lib/getcpucount.c +src/lib/getcpucount.h src/lib/getdate.c src/lib/getdate.h src/lib/getdate.y src/lib/getgateway.c src/lib/getgateway.h +src/lib/gethomedir.c +src/lib/gethomedir.h src/lib/getline.c src/lib/getline.h src/lib/getphysmemsize.c @@ -654,17 +808,29 @@ src/lib/gnet_host.h src/lib/halloc.c src/lib/halloc.h +src/lib/hash.c +src/lib/hash.h +src/lib/hashing.c +src/lib/hashing.h src/lib/hashlist.c src/lib/hashlist.h src/lib/hashtable.c src/lib/hashtable.h src/lib/header.c src/lib/header.h +src/lib/hevset.c +src/lib/hevset.h +src/lib/hgeneric.ct +src/lib/hgeneric.ht +src/lib/hikset.c +src/lib/hikset.h src/lib/host_addr.c src/lib/host_addr.h src/lib/html.c src/lib/html.h src/lib/html_entities.h +src/lib/http_range.c +src/lib/http_range.h src/lib/idtable.c src/lib/idtable.h src/lib/inputevt.c @@ -672,10 +838,18 @@ src/lib/iovec.h src/lib/iprange.c src/lib/iprange.h +src/lib/ipset.c +src/lib/ipset.h src/lib/iso3166.c src/lib/iso3166.h +src/lib/launch-test.c +src/lib/launch.c +src/lib/launch.h +src/lib/leak.c +src/lib/leak.h src/lib/list.c src/lib/list.h +src/lib/listener.c src/lib/listener.h src/lib/log.c src/lib/log.h @@ -685,6 +859,10 @@ src/lib/malloc.h src/lib/map.c src/lib/map.h +src/lib/mem.c +src/lib/mem.h +src/lib/mempcpy.c +src/lib/mempcpy.h src/lib/memusage.c src/lib/memusage.h src/lib/mime_type.c @@ -694,6 +872,8 @@ src/lib/mingw32.h src/lib/misc.c src/lib/misc.h +src/lib/mtwist.c +src/lib/mtwist.h src/lib/mutex.c src/lib/mutex.h src/lib/nid.c @@ -706,11 +886,15 @@ src/lib/ohash_table.h src/lib/omalloc.c src/lib/omalloc.h +src/lib/once.c +src/lib/once.h +src/lib/op.h src/lib/options.c src/lib/options.h src/lib/ostream.c src/lib/ostream.h src/lib/override.h +src/lib/owlist-gen.c src/lib/pagetable.c src/lib/pagetable.h src/lib/palloc.c @@ -723,33 +907,61 @@ src/lib/patricia.h src/lib/pattern.c src/lib/pattern.h +src/lib/plist.c +src/lib/plist.h src/lib/pmsg.c src/lib/pmsg.h src/lib/pow2.c src/lib/pow2.h src/lib/product.c src/lib/product.h +src/lib/progname.c +src/lib/progname.h src/lib/prop.c src/lib/prop.h +src/lib/pslist.c +src/lib/pslist.h +src/lib/rand31.c +src/lib/rand31.h +src/lib/random-test.c src/lib/random.c src/lib/random.h +src/lib/rbtree.c +src/lib/rbtree.h src/lib/regex.c src/lib/regex.h +src/lib/registers.h +src/lib/ripening.c +src/lib/ripening.h +src/lib/rwlock.c +src/lib/rwlock.h src/lib/sbool.h src/lib/sectoken.c src/lib/sectoken.h +src/lib/semaphore.c +src/lib/semaphore.h src/lib/sequence.c src/lib/sequence.h +src/lib/setproctitle.c +src/lib/setproctitle.h src/lib/sha1.c src/lib/sha1.h +src/lib/shuffle.c +src/lib/shuffle.h src/lib/signal.c src/lib/signal.h src/lib/slist.c src/lib/slist.h +src/lib/smsort.c +src/lib/smsort.h +src/lib/sort-test.c src/lib/sorted_array.c src/lib/sorted_array.h src/lib/spinlock.c src/lib/spinlock.h +src/lib/spopen-test.c +src/lib/spopen.c +src/lib/spopen.h src/lib/stacktrace.c src/lib/stacktrace.h src/lib/stats.c @@ -760,10 +972,17 @@ src/lib/stringify.h src/lib/strtok.c src/lib/strtok.h +src/lib/strvec.c +src/lib/strvec.h +src/lib/symbols.c +src/lib/symbols.h src/lib/symtab.c src/lib/symtab.h src/lib/tea.c src/lib/tea.h +src/lib/teq.c +src/lib/teq.h +src/lib/thread-test.c src/lib/thread.c src/lib/thread.h src/lib/tiger.c @@ -775,11 +994,17 @@ src/lib/timestamp.h src/lib/tm.c src/lib/tm.h +src/lib/tmalloc.c +src/lib/tmalloc.h +src/lib/tokenizer.c +src/lib/tokenizer.h +src/lib/tqsort.c +src/lib/tqsort.h +src/lib/tsig.c +src/lib/tsig.h src/lib/unsigned.h src/lib/url.c src/lib/url.h -src/lib/url_factory.c -src/lib/url_factory.h src/lib/urn.c src/lib/urn.h src/lib/utf8.c @@ -789,20 +1014,39 @@ src/lib/vector.h src/lib/vendors.c src/lib/vendors.h +src/lib/vmea.c +src/lib/vmea.h src/lib/vmm.c src/lib/vmm.h +src/lib/vsort.c +src/lib/vsort.h +src/lib/waiter.c +src/lib/waiter.h src/lib/walloc.c src/lib/walloc.h src/lib/watcher.c src/lib/watcher.h src/lib/wd.c src/lib/wd.h +src/lib/well.c +src/lib/well.h +src/lib/win32dlp.c +src/lib/win32dlp.h src/lib/wordvec.c src/lib/wordvec.h src/lib/wq.c src/lib/wq.h src/lib/xmalloc.c src/lib/xmalloc.h +src/lib/xslist.c +src/lib/xslist.h +src/lib/xsort-gen.c +src/lib/xsort.c +src/lib/xsort.h +src/lib/xsort_data.c +src/lib/xsort_data.h +src/lib/xxtea.c +src/lib/xxtea.h src/lib/zalloc.c src/lib/zalloc.h src/lib/zlib_util.c @@ -847,6 +1091,7 @@ src/shell/help.c src/shell/horizon.c src/shell/intr.c +src/shell/lib.c src/shell/log.c src/shell/memory.c src/shell/node.c @@ -857,6 +1102,7 @@ src/shell/print.c src/shell/props.c src/shell/quit.c +src/shell/random.c src/shell/rescan.c src/shell/search.c src/shell/set.c @@ -865,15 +1111,16 @@ src/shell/shutdown.c src/shell/stats.c src/shell/status.c +src/shell/task.c +src/shell/thread.c src/shell/uploads.c src/shell/version.c src/shell/whatis.c +src/types.h src/ui/Jmakefile src/ui/Makefile.SH src/ui/gtk/Jmakefile src/ui/gtk/Makefile.SH -src/ui/gtk/bitzi.c -src/ui/gtk/bitzi.h src/ui/gtk/clipboard.c src/ui/gtk/clipboard.h src/ui/gtk/columns.h @@ -922,6 +1169,8 @@ src/ui/gtk/gtk1/uploads.c src/ui/gtk/gtk2/Jmakefile src/ui/gtk/gtk2/Makefile.SH +src/ui/gtk/gtk2/column_sort.c +src/ui/gtk/gtk2/column_sort.h src/ui/gtk/gtk2/fileinfo.c src/ui/gtk/gtk2/gnet_stats.c src/ui/gtk/gtk2/gtk-gnutella.glade
View file
gtk-gnutella-0.98.2.tar.bz2/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-105 -: $X-Id: Jmake.tmpl 69 2011-01-09 13:57:07Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -50,13 +50,11 @@ $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 106 2011-11-25 20:36:12Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Start of Jmakefile -# $X-Id$ - all:: depend:: sub_depend @@ -96,6 +94,9 @@ install:: local_install sub_install @exit 0 +install-strip:: local_install-strip sub_install-strip + @exit 0 + install.man:: maybe_install.man sub_install.man deinstall:: sub_deinstall local_deinstall deinstall.man:: sub_deinstall.man maybe_deinstall.man @@ -135,13 +136,16 @@ @case '${MFLAGS}' in *ik*) set +e;; esac; \ for i in $(SUBDIRS) ;\ do \ - (cd $$i ; echo $(VERB) "in $(DIR)$$i..."; \ + (cd $$i ; echo "$(VERB) in $(DIR)$$i..."; \ $(MAKE) $(MFLAGS) $(FLAGS) $(TARGET)) || exit 1; \ done sub_install:: @$(MAKE) subdirs TARGET=install VERB="Installing" FLAGS= +sub_install-strip:: + @$(MAKE) subdirs TARGET=install-strip VERB="Installing (strip)" FLAGS= + sub_deinstall:: @$(MAKE) subdirs TARGET=deinstall VERB="Deinstalling" FLAGS= @echo "Back to $(CURRENT) for "deinstall... @@ -210,6 +214,7 @@ @$(MAKE) subdirs TARGET=all VERB="Making all" FLAGS= local_install:: +local_install-strip:: local_deinstall:: local_install.man:: local_deinstall.man::
View file
gtk-gnutella-0.98.2.tar.bz2/README -> gtk-gnutella-1.1.9.tar.bz2/README
Changed
@@ -1,7 +1,7 @@ gtk-gnutella Copyright (c) 2000-2001, Yann Grossel - Copyright (c) 2001-2011, Raphael Manfredi + Copyright (c) 2001-2016, Raphael Manfredi ------------------------------------------------------------------------ This program is free software; you can redistribute it and/or modify
View file
gtk-gnutella-1.1.9.tar.bz2/README.Windows
Added
@@ -0,0 +1,120 @@ + Supplementary Compile Instructions for Windows Systems + ====================================================== + +Here are the steps necessary to build gtk-gnutella on Windows. + +Even if you are on 64-bit Windows, these instructions will provide you with +a 32-bit executable. And it's fine: there is very little to be gained and +much more to lose by running a 64-bit gtk-gnutella program: pointers are +larger so structures and memory usage will be larger, whilst gtk-gnutella has +no need for a 64-bit virtual address space. + + +1. Dependencies: +================ + +The following steps are normally done once, to setup the appropriate +compilation environment. + +You'll have to install the following packages: + +* MinGW, with "development" and "MSYS" options (scroll down in the installer). + MinGW installation works by fetching the installer package and + launching it: + + https://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/ + +* GTK 2.0: grab the bundle from: + + http://www.gtk.org/download/win32.php + + At the time of this writing, the latest bundle is under: + + http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/ + + The file is called: gtk+-bundle_2.24.10-20120208_win32.zip + Unzip that file into /mingw/lib/gtk, where "/mingw" represents the + directory where MinGW is installed (e.g. C:\MinGW). + +* Zlib: grab the source package from: + + http://www.zlib.net/ + + Decompress the sources and then compile the sources within the MinGW + environment by launching an msys shell, which will give you a UNIX-like + terminal. + + Compile using: + + make -f win32/makefile.gcc + + Then install as follows: + + mkdir -p /mingw/lib/zlib/include /mingw/lib/zlib/lib + cp zconf.h zlib.h /mingw/lib/zlib/include + cp libz.a /mingw/lib/zlib/lib + +* Patch the GTK bundle to make sure GTK's zlib is not used: + + cd /mingw/lib/gtk/include + mv zlib.h zlib-gtk.h + +* Optionally: install TLS: grab the gnutls-2.10.2-x86.zip file from: + + http://mirrors.ibiblio.org/gnu/ftp/gnu/gnutls/ + + Do not grab other versions, they have not been tested and may not + blend well with the other packages (e.g. 2.10.5 is known to fail to + be recognized, pgk-config complaining that the zlib package is missing). + + Unpack the file under /mingw/lib/gtk, so that we can benefit from GTK's + pgk-config.exe configuration tool for TLS as well. + +To be able to create the installer package, you'll need two extra packages: + +* NSIS, which you can get from: + + http://nsis.sourceforge.net/Download + +* The GTK runtime file, which you can fetch from: + + https://sourceforge.net/projects/gtk-win/ + + Grab the file gtk2-runtime-2.24.10-2012-10-10-ash.exe and leave it at the + root of the gtk-gnutella source tree. It will be expected there by the + package installer. + +2. Build: +========= + +Run from the top of the source tree, from an msys shell: + + ./build.sh + +and it will build everything for you. + +If you wish to be able to use gtk-gnutella without installing it, use: + + ./build.sh --unofficial + +instead, but the resulting binary will not be packageable. + + +3. Finish: +========== + +You can then run gtk-gnutella without installing provided you used the +"--unofficial" switch above: + + export PATH=$PATH:/mingw/lib/:/mingw/lib/gtk/bin:/mingw/bin + src/gtk-gnutella --log-stdout gtkg.out --log-stderr gtkg.err + +To install gtk-gnutella just run: + + make install + ./makensis.sh + +You will be left with a .exe installer file that you can then launch to +install gtk-gnutella on your machine. +-- +Raphael Manfredi
View file
gtk-gnutella-0.98.2.tar.bz2/TODO -> gtk-gnutella-1.1.9.tar.bz2/TODO
Changed
@@ -1,7 +1,8 @@ This documents describes briefly the things we want to have in gtk-gnutella and which are not already implemented, by loose order of decreasing priority. -0.99 +0.100 + * Bandwidth configuration scheduling by time + day. * DOVE extension for the DHT, adding IPv6 support and smarter publishing * Firewalled to firewalled transfers (reverse engineer LimeWire specs) * Configurable SOCKS usage: Gnutella connections, downloads and/or uploads. @@ -12,7 +13,7 @@ * PARQ: 'Rotating' queue by filename? * Meta data support (locally) -0.100 +0.101 * Optional gtk-gnutella clustering * Optional locale preferencing support * XML: Extraction of metadata for results sorting
View file
gtk-gnutella-0.98.2.tar.bz2/U/modified/Myinit.U -> gtk-gnutella-1.1.9.tar.bz2/U/modified/Myinit.U
Changed
@@ -15,5 +15,5 @@ ?S:. ?LINT:nocomment : private initializations -libswanted="sendfile z resolv iconv m intl" +libswanted="bfd iberty sendfile z resolv iconv m intl dl"
View file
gtk-gnutella-1.1.9.tar.bz2/U/modified/alignbytes.U
Added
@@ -0,0 +1,138 @@ +?X: +?X: Removed the "long long" and "long double" from alignment constraints +?X: since gtk-gnutella does not use these types and it is highly unlikely +?X: that the C library routines we are calling would need to allocate +?X: structures with these types. +?X: --RAM, 2013-12-04 +?X: +?RCS: $Id: alignbytes.U 167 2013-05-08 17:58:00Z rmanfredi $ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic License, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic License; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: alignbytes.U,v $ +?RCS: Revision 3.0.1.2 1994/10/29 16:02:28 ram +?RCS: patch36: added ?F: line for metalint file checking +?RCS: +?RCS: Revision 3.0.1.1 1994/05/06 14:25:20 ram +?RCS: patch23: avoid ALIGNBYTES, since it conflicts on NetBSD +?RCS: +?RCS: Revision 3.0 1993/08/18 12:05:23 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:alignbytes: Assert Myread Trylink cat i_inttypes i_limits i_math +?MAKE: -pick add $@ %< +?S:alignbytes: +?S: This variable holds the number of bytes required to align an +?S: arbitrary standard type. Usual values are 2, 4 and 8. +?S:. +?X: This used to be called ALIGNBYTES, but that conflicts with +?X: <machines/param.h> in NetBSD. +?C:MEM_ALIGNBYTES (ALIGNBYTES): +?C: This symbol contains the number of bytes required to align a +?C: double. Usual values are 2, 4 and 8. +?C:. +?H:#define MEM_ALIGNBYTES $alignbytes /**/ +?H:. +?T:alignment result +: check for alignment requirements +echo " " +case "$alignbytes" in +'') + echo "Checking alignment constraints..." >&4 + + for alignment in 8 4 2 1 16 32 error + do + $cat >try.c <<EOCP +#$i_inttypes I_INTTYPES +#ifdef I_INTTYPES +#include <inttypes.h> +#endif +#$i_limits I_LIMITS +#ifdef I_LIMITS +#include <limits.h> +#endif +#$i_math I_MATH +#ifdef I_MATH +#include <math.h> +#endif + +union u { + void *void_ptr; + void (*func_ptr)(void); + char c; + short s; + int i; + long l; + float f; + double d; +#ifdef UINT32_MAX + uint32_t u32; +#else +#warning "UINT32_MAX undefined" +#endif +#ifdef UINT16_MAX + uint16_t u16; +#else +#warning "UINT32_MAX undefined" +#endif +#ifdef UINT64_MAX + uint64_t u64; +#else +#warning "UINT64_MAX undefined" +#endif +#ifdef UINTMAX_MAX + uintmax_t m; +#else +#warning "UINTMAX_MAX undefined" +#endif +#ifdef UINTPTR_MAX + uintptr_t up; +#else +#warning "UINTPTR_MAX undefined" +#endif +}; + +struct s { + char a; + union u b; +}; + +#include "static_assert.h" + +int +main(void) +{ + STATIC_ASSERT($alignment == ((sizeof (struct s) - (sizeof (union u))))); + return 0; +} +EOCP + + result='' + set result + eval $trylink + case "$result" in + "$define") break;; + esac + done + + case "$alignment" in + error) dflt='8' + echo "(I can't seem to compile the test program...)" >&4 + ;; + *) dflt=$alignment + ;; + esac +;; +*) dflt="$alignbytes" + ;; +esac +rp="What is the maximum alignment in bytes required for a standard type?" +. ./myread +alignbytes="$ans" +
View file
gtk-gnutella-1.1.9.tar.bz2/U/modified/mallocsrc.U
Added
@@ -0,0 +1,176 @@ +?RCS: $Id: mallocsrc.U 167 2013-05-08 17:58:00Z rmanfredi $ +?RCS: +?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi +?RCS: +?RCS: You may redistribute only under the terms of the Artistic License, +?RCS: as specified in the README file that comes with the distribution. +?RCS: You may reuse parts of this distribution only within the terms of +?RCS: that same Artistic License; a copy of which may be found at the root +?RCS: of the source tree for dist 4.0. +?RCS: +?RCS: $Log: mallocsrc.U,v $ +?RCS: Revision 3.0.1.2 1997/02/28 16:10:26 ram +?RCS: patch61: added support for Free_t, the type of free() +?RCS: patch61: replaced .o with $_o all over the place +?RCS: +?RCS: Revision 3.0.1.1 1994/05/06 15:10:46 ram +?RCS: patch23: added support for MYMALLOC, mainly for perl5 (ADO) +?RCS: +?RCS: Revision 3.0 1993/08/18 12:09:12 ram +?RCS: Baseline for dist 3.0 netwide release. +?RCS: +?MAKE:mallocsrc mallocobj usemymalloc malloctype d_mymalloc \ + freetype: Myread \ + Oldconfig package spackage Guess Setvar rm cat +cc +ccflags Findhdr \ + i_malloc i_stdlib sed libs _o +?MAKE: -pick add $@ %< +?X: Put near top so that other tests don't erroneously include +?X: -lmalloc. --AD 22 June 1998 +?Y:TOP +?S:usemymalloc: +?S: This variable contains y if the malloc that comes with this package +?S: is desired over the system's version of malloc. People often include +?S: special versions of malloc for efficiency, but such versions are often +?S: less portable. See also mallocsrc and mallocobj. +?S: If this is 'y', then -lmalloc is removed from $libs. +?S:. +?S:mallocsrc: +?S: This variable contains the name of the malloc.c that comes with +?S: the package, if that malloc.c is preferred over the system malloc. +?S: Otherwise the value is null. This variable is intended for generating +?S: Makefiles. +?S:. +?S:d_mymalloc: +?S: This variable conditionally defines MYMALLOC in case other parts +?S: of the source want to take special action if MYMALLOC is used. +?S: This may include different sorts of profiling or error detection. +?S:. +?S:mallocobj: +?S: This variable contains the name of the malloc.o that this package +?S: generates, if that malloc.o is preferred over the system malloc. +?S: Otherwise the value is null. This variable is intended for generating +?S: Makefiles. See mallocsrc. +?S:. +?S:freetype: +?S: This variable contains the return type of free(). It is usually +?S: void, but occasionally int. +?S:. +?S:malloctype: +?S: This variable contains the kind of ptr returned by malloc and realloc. +?S:. +?C:Free_t: +?C: This variable contains the return type of free(). It is usually +?C: void, but occasionally int. +?C:. +?C:Malloc_t (MALLOCPTRTYPE): +?C: This symbol is the type of pointer returned by malloc and realloc. +?C:. +?H:#define Malloc_t $malloctype /**/ +?H:#define Free_t $freetype /**/ +?H:. +?C:USE_MY_MALLOC (MYMALLOC): +?C: This symbol, if defined, indicates that we're using our own malloc. +?C:. +?H:#$d_mymalloc USE_MY_MALLOC /**/ +?H:. +?LINT:change libs +?X: Cannot test for mallocsrc; it is the unit's name and there is a bug in +?X: the interpreter which defines all the names, even though they are not used. +@if mallocobj || USE_MY_MALLOC +: determine which malloc to compile in +echo " " +case "$usemymalloc" in +yY*|true|$define) dflt='y' ;; +nN*|false|$undef) dflt='n' ;; +*) dflt=y ;; +esac +$cat <<EOM +$spackage comes with its own malloc() implementation that will supersede +the version included in your C library. Since proper memory allocation is +critical, you may choose to opt out from this specific implementation and +rely on the (hopefully) more thoroughly tested version in the C library. + +If you change your mind later, you can always re-run this configuration +script and recompile $package from scratch. + +EOM +rp="Do you wish to attempt to use the malloc() that comes with $package?" +. ./myread +usemymalloc="$ans" +case "$ans" in +y*|true) + usemymalloc='y' + mallocsrc='malloc.c' + mallocobj="malloc$_o" + d_mymalloc="$define" +?X: Maybe libs.U should be dependent on mallocsrc.U, but then +?X: most packages that use dist probably don't supply their own +?X: malloc, so this is probably an o.k. compromise + case "$libs" in + *-lmalloc*) + : Remove malloc from list of libraries to use + echo "Removing unneeded -lmalloc from library list" >&4 + set `echo X $libs | $sed -e 's/-lmalloc / /' -e 's/-lmalloc$//'` + shift + libs="$*" + echo "libs = $libs" >&4 + ;; + esac + ;; +*) + usemymalloc='n' + mallocsrc='' + mallocobj='' + d_mymalloc="$undef" + ;; +esac + +@end +@if MALLOCPTRTYPE || Malloc_t || Free_t +: compute the return types of malloc and free +echo " " +$cat >malloc.c <<END +#$i_malloc I_MALLOC +#$i_stdlib I_STDLIB +#include <stdio.h> +#include <sys/types.h> +#ifdef I_MALLOC +#include <malloc.h> +#endif +#ifdef I_STDLIB +#include <stdlib.h> +#endif +#ifdef TRY_MALLOC +void *malloc(); +#endif +#ifdef TRY_FREE +void free(); +#endif +END +@if MALLOCPTRTYPE || Malloc_t +case "$malloctype" in +'') + if $cc $ccflags -c -DTRY_MALLOC malloc.c >/dev/null 2>&1; then + malloctype='void *' + else + malloctype='char *' + fi + ;; +esac +echo "Your system wants malloc to return '$malloctype', it would seem." >&4 +@end + +@if Free_t +case "$freetype" in +'') + if $cc $ccflags -c -DTRY_FREE malloc.c >/dev/null 2>&1; then + freetype='void' + else + freetype='int' + fi + ;; +esac +echo "Your system uses $freetype free(), it would seem." >&4 +@end +$rm -f malloc.co +@end
View file
gtk-gnutella-0.98.2.tar.bz2/U/packages/glibversion.U -> gtk-gnutella-1.1.9.tar.bz2/U/packages/glibversion.U
Changed
@@ -36,10 +36,10 @@ esac case "$ver" in 2) - glibversion=2; glibpackage="glib-2.0 gobject-2.0" + glibversion=2; glibpackage="glib-2.0 gobject-2.0 gthread-2.0" d_useglib2="$define"; d_useglib1="$undef";; *) - glibversion=1; glibpackage=glib + glibversion=1; glibpackage="glib gthread" d_useglib1="$define"; d_useglib2="$undef";; esac
View file
gtk-gnutella-0.98.2.tar.bz2/U/packages/gtkversion.U -> gtk-gnutella-1.1.9.tar.bz2/U/packages/gtkversion.U
Changed
@@ -41,11 +41,12 @@ $cat <<'EOM' I can compile for the GTK+ 1.x version or for the GTK+ 2.x version. The GTK1 frontend will use much less CPU than the GTK2 one, so if you -have a slow CPU, you are encouraged to choose GTK1. +have a slow 32-bit CPU, you are encouraged to choose GTK1. +On 64-bit platforms, you need to choose GTK2 since GTK1 is not 64-bit safe. EOM case "$gtkversion" in - '') dflt=1;; + '') dflt=2;; 2) dflt=2;; *) dflt=1;; esac
View file
gtk-gnutella-0.98.2.tar.bz2/U/specific/gtkgversion.U -> gtk-gnutella-1.1.9.tar.bz2/U/specific/gtkgversion.U
Changed
@@ -14,7 +14,7 @@ echo " " echo "Figuring out my version number..." >&4 $cat > ver <<'EOC' -/^#define GTA_VERSION/ { major=$3 } +/^#define GTA_VERSION / { major=$3 } /^#define GTA_SUBVERSION/ { minor=$3 } /^#define GTA_PATCHLEVEL/ { tiny=$3 } /^#define GTA_REVCHAR/ { rev=$3; gsub("^a-zA-Z", "", rev); }
View file
gtk-gnutella-0.98.2.tar.bz2/build.sh -> gtk-gnutella-1.1.9.tar.bz2/build.sh
Changed
@@ -37,6 +37,7 @@ build_halloc= build_libdir= build_localedir= +build_malloc=y build_nls= build_official= build_so_suffix= @@ -59,7 +60,7 @@ build_osxbundle='true' CPPFLAGS="$CPPFLAGS -DHAVE_GTKOSXAPPLICATION " CPPFLAG="${CPPFLAGS# *}" # strip leading spaces - LIBS="$LIBS -lgtkmacintegration -liconv -lz" + LIBS="$LIBS `pkg-config gtk-mac-integration-gtk2 --libs` -liconv -lz" LIBS="${LIBS# *}" # strip leading spaces PREFIX=`dirname ${PWD}/$0`/osx/bundle echo $PREFIX @@ -107,8 +108,8 @@ CPPFLAG="${CPPFLAGS# *}" # strip leading spaces LDFLAGS="${LDFLAGS# *}" # strip leading spaces - LIBS="$LIBS -lpthread -lwsock32 -lws2_32 -liconv -limagehlp -liphlpapi" - LIBS="$LIBS -lws2_32 -lpowrprof -lpsapi -lkernel32" + LIBS="$LIBS -lbfd -liberty -lintl -lpthread -lwsock32 -lws2_32 -liconv" + LIBS="$LIBS -limagehlp -liphlpapi -lws2_32 -lpowrprof -lpsapi -lkernel32" LIBS="${LIBS# *}" # strip leading spaces ;; esac @@ -123,6 +124,7 @@ --datadir=*) build_datadir="${1#--*=}";; --disable-dbus) build_dbus='d_dbus';; --disable-gnutls) build_gnutls='d_gnutls';; + --disable-malloc) build_malloc='n';; --disable-nls) build_nls='d_enablenls';; --disable-socker) build_socker='d_socker_get';; --enable-halloc) build_halloc='true';; @@ -152,6 +154,7 @@ --topless Compile for topless use (no graphical user interface). --disable-dbus Do not use D-Bus even if available. --disable-gnutls Do not use GnuTLS even if available. + --disable-malloc Do not supersede the system's malloc() implementation. --disable-nls Disable NLS (native language support). --disable-socker Disable support for Socker. --prefix=PATH Path prefix used for installing files. $PREFIX @@ -274,6 +277,7 @@ /bin/sh ./Configure -Oder \ $build_verbose \ -U usenm \ + -D usemymalloc="$build_malloc" \ ${CC:+-D "cc=$CC"} \ ${CFLAGS:+-D "ccflags=$CFLAGS"} \ ${LDFLAGS:+-D "ldflags=$LDFLAGS"} \ @@ -300,7 +304,8 @@ exit fi -${MAKE} depend || { echo; echo 'ERROR: make depend failed.'; exit 1; } +# No need to run "make depend" as Configure already runs it for us + ${MAKE} || { echo; echo 'ERROR: Compiling failed.'; exit 1; } if "X$build_osxbundle" = Xtrue @@ -316,7 +321,7 @@ gtk-mac-bundler osx/gtk-gnutella.bundle && rm -rf osx/bundle && ln -s /Applications osx/image/Applications && - dmg="${HOME}/Desktop/Gtk-Gnutella-${VN}.dmg" && + dmg="${HOME}/Desktop/gtk-gnutella-${VN}.dmg" && hdiutil create -srcfolder osx/image -volname Gtk-Gnutella "${dmg}" && hdiutil internet-enable -yes "${dmg}" rm -rf osx/image
View file
gtk-gnutella-0.98.2.tar.bz2/config_h.SH -> gtk-gnutella-1.1.9.tar.bz2/config_h.SH
Changed
@@ -31,7 +31,7 @@ * that running config_h.SH again will wipe out any changes you've made. * For a more permanent change edit $CONFIG_SH and rerun config_h.SH. * - * \$Id: Config_h.U 1 2006-08-24 12:32:52Z rmanfredi $ + * \$Id: Config_h.U 167 2013-05-08 17:58:00Z rmanfredi $ */ /* @@ -56,12 +56,6 @@ #$d_eunice VMS_SYSTEM /**/ #$d_linux LINUX_SYSTEM /**/ -/* MEM_ALIGNBYTES: - * This symbol contains the number of bytes required to align a - * double. Usual values are 2, 4 and 8. - */ -#define MEM_ALIGNBYTES $alignbytes /**/ - /* ARCHLIB_EXP: * This symbol contains the ~name expanded version of ARCHLIB, to be used * in programs that are not prepared to deal with ~ expansion at run-time. @@ -74,6 +68,18 @@ */ #define BIN "$bin" /**/ +/* BYTEORDER: + * This symbol holds the hexadecimal constant defined in byteorder, + * i.e. 1234 for little-endian or 4321 for big-ending. + */ +#define BYTEORDER 0x$byteorder /* large digits for MSB */ + +/* CHARSIZE: + * This symbol contains the size of a char, so that the C preprocessor + * can make decisions based on it. + */ +#define CHARSIZE $charsize + /* CAT2: * This macro catenates 2 tokens together. */ @@ -147,12 +153,51 @@ */ #$d_bcopy HAS_BCOPY /**/ +/* HAS_BFD_LIBRARY: + * This symbol, if defined, indicates that the BFD library is available + * to inspect symbols and debugging information. You can safely include + * the <bfd.h> file when this symbol is defined, making sure to define + * the PACKAGE and PACKAGE_VERSION symbols, just in case we're facing + * binutils 2.23 or higher. + */ +#$d_bfd_lib HAS_BFD_LIBRARY /**/ + /* HAS_BIND_TEXTDOMAIN_CODESET: * This symbol, if defined, indicates that the bind_textdomain_codeset routine * is available. */ #$d_bindtxtcode HAS_BIND_TEXTDOMAIN_CODESET /**/ +/* HAS_BSEARCH: + * This symbol, if defined, indicates that the bsearch() routine + * is available to perform a binary search on a sorted array. + */ +#$d_bsearch HAS_BSEARCH /**/ + +/* HAS_BUILTIN_BSWAP32: + * This symbol, if defined, indicates that __builtin_bswap32 routine is + * available to byte-swap a 32-bit value (little <-> big endian). + */ +#$d_built_bswap32 HAS_BUILTIN_BSWAP32 /**/ + +/* HAS_BUILTIN_BSWAP64: + * This symbol, if defined, indicates that __builtin_bswap64 routine is + * available to byte-swap a 64-bit value (little <-> big endian). + */ +#$d_built_bswap64 HAS_BUILTIN_BSWAP64 /**/ + +/* HAS_BUILTIN_CLZ: + * This symbol, if defined, indicates that the __builtin_clz routine is + * available to count leading zeroes in a word. + */ +#$d_built_clz HAS_BUILTIN_CLZ /**/ + +/* HAS_BUILTIN_CTZ: + * This symbol, if defined, indicates that __builtin_ctz routine is + * available to count trailing zeroes in a word. + */ +#$d_built_ctz HAS_BUILTIN_CTZ /**/ + /* HAS_BUILTIN_POPCOUNT: * This symbol, if defined, indicates that __builtin_popcount routine is * available to compute the amount of '1' bits in a word. @@ -165,6 +210,26 @@ */ #$d_bzero HAS_BZERO /**/ +/* HAS_CLEARENV: + * This symbol is defined when clearenv() is there to clear the + * environment. + */ +#$d_clearenv HAS_CLEARENV + +/* HAS_CLOCK_GETRES: + * This symbol, if defined, indicates that the clock_getres() system call is + * available to fetch the granularity of available clock (CLOCK_REALTIME is + * a valid clock when the symbol is defined). + */ +#$d_clock_getres HAS_CLOCK_GETRES /**/ + +/* HAS_CLOCK_GETTIME: + * This symbol, if defined, indicates that the clock_gettime() system call is + * available to fetch the clock (CLOCK_REALTIME is a valid clock when the + * symbol is defined). + */ +#$d_clock_gettime HAS_CLOCK_GETTIME /**/ + /* HAS_CLOSEFROM: * This symbol is defined when closefrom() can be used. */ @@ -186,12 +251,39 @@ */ #$d_dev_poll HAS_DEV_POLL +/* USE_DIFFTIME: + * This symbol, if defined, indicates that the difftime routine should + * really be used to compare times. + */ +#$use_difftime USE_DIFFTIME /**/ + +/* HAS_DIRENT_D_NAMLEN: + * This symbol, if defined, indicates that struct dirent has an + * integer member d_namlen to hold the actual string length of d_name. + */ +#$d_dirent_d_namlen HAS_DIRENT_D_NAMLEN /**/ + /* HAS_DIRENT_D_TYPE: * This symbol, if defined, indicates that struct dirent has an - * integer member d_type. + * integer member d_type. Note that DT_WHT is BSD-specific and may + * not be available. If DT_UNKNOWN is returned, the filesystem does + * not fill d_type even though it is present in the dir entry. */ #$d_dirent_d_type HAS_DIRENT_D_TYPE /**/ +/* HAS_DIRFD: + * This symbol, if defined, indicates that the dirfd() routine is + * available to get the underlying file descriptor from a DIR * + * opened by opendir(). + */ +#$d_dirfd HAS_DIRFD /**/ + +/* HAS_DLADDR: + * This symbol, if defined, indicates that the dladdr() routine is + * available to query the dynamic linker about a specified address. + */ +#$d_dladdr HAS_DLADDR /**/ + /* HAS_END_SYMBOL: * This symbol, if defined, indicates that the C program can declare * extern const int end; @@ -218,12 +310,56 @@ */ #$d_fast_assert FAST_ASSERTIONS /**/ +/* HAS_FCHDIR: + * This symbol, if defined, indicates that the fchdir routine is + * available to change the working directory to that of the opened + * directory whose file descriptor is given. + */ +#$d_fchdir HAS_FCHDIR /**/ + +/* HAS_FDATASYNC: + * This symbol, if defined, indicates that the fdatasync routine is available + * to synchronize a file's in-core data with the storage device. + */ +#$d_fdatasync HAS_FDATASYNC /**/ + +/* HAS_FDOPENDIR: + * This symbol, if defined, indicates that the fdopendir() routine is + * available to open directories using an opened file descriptor already + * referring to that directory. + */ +#$d_fdopendir HAS_FDOPENDIR /**/ + /* HAS_FORK: * This symbol, if defined, indicates that the fork routine is * available. */ #$d_fork HAS_FORK /**/ +/* HAS_FSTATAT: + * This symbol, if defined, indicates that the fstatat() routine is + * available to do file stats with a relative path interepreted in + * the context of an opened directory. + */ +#$d_fstatat HAS_FSTATAT /**/ + +/* HAS_FSYNC: + * This symbol, if defined, indicates that the fsync routine is available + * to synchronize a file's in-core state with the storage device. + */ +#$d_fsync HAS_FSYNC /**/ + +/* HAS_GETTIMEOFDAY: + * This symbol, if defined, indicates that the gettimeofday() system + * call is available for a sub-second accuracy clock. Usually, the file + * <sys/resource.h> needs to be included (see I_SYS_RESOURCE). + * The type "Timeval" should be used to refer to "struct timeval". + */ +#$d_gettimeod HAS_GETTIMEOFDAY /**/ +#ifdef HAS_GETTIMEOFDAY +#define Timeval struct timeval /* Structure used by gettimeofday() */ +#endif + /* HAS_GETADDRINFO: * This symbol is defined when getaddrinfo() can be used. */ @@ -258,12 +394,43 @@ */ #$d_getlogin HAS_GETLOGIN /**/ +/* HAS_GETNAMEINFO: + * This symbol is defined when getnameinfo() can be used. + */ +#$d_getnameinfo HAS_GETNAMEINFO + /* HAS_GETPPID: * This symbol, if defined, indicates that the getppid routine is * available to get the parent process ID. */ #$d_getppid HAS_GETPPID /**/ +/* HAS_GETPROGNAME: + * This symbol is defined when getprogname() is there to get the + * program name. + */ +#$d_getprogname HAS_GETPROGNAME + +/* HAS_GETPWNAM: + * This symbol, if defined, indicates that the getpwnam() routine + * is available to get the /etc/passwd structure entries for given + * user name. + */ +#$d_getpwnam HAS_GETPWNAM /**/ + +/* HAS_GETPWUID: + * This symbol, if defined, indicates that the getpwuid() routine + * is available to get the /etc/passwd structure entries for given + * user ID. + */ +#$d_getpwuid HAS_GETPWUID /**/ + +/* HAS_GETRLIMIT: + * This symbol, if defined, indicates that the getrlimit() routine is + * available to get process resource limits. + */ +#$d_getrlimit HAS_GETRLIMIT /**/ + /* HAS_GETUID: * This symbol is defined when getuid() can be used. */ @@ -291,6 +458,19 @@ */ #$d_hstrerror HAS_HSTRERROR /**/ +/* USE_IEEE754_FLOAT: + * When defined, this symbol indicates that float and double values are + * stored using the IEEE-754 floating point format. See IEEE754_BYTEORDER + * to determine the endianness in case these values need to be serialized. + */ +/* IEEE754_BYTEORDER: + * This symbol holds the hexadecimal constant defined in ieee754_byteorder, + * i.e. 1234 for little-endian or 4321 for big-ending floats. It is 0 when + * floats are not stored in IEEE-754 format. + */ +#$d_ieee754 USE_IEEE754_FLOAT +#define IEEE754_BYTEORDER 0x$ieee754_byteorder /* large digits for MSB */ + /* USE_IP_TOS: * This symbol, if defined, indicates that the IP TOS services are * available and can be used. Be prepared to include <sys/socket.h>, @@ -358,6 +538,12 @@ */ #$d_memmove HAS_MEMMOVE /**/ +/* HAS_MEMPCPY: + * This symbol, if defined, indicates that the mempcpy routine is available + * to copy blocks of memory, returning a pointer past the last written byte. + */ +#$d_mempcpy HAS_MEMPCPY /**/ + /* HAS_MMAP: * This symbol, if defined, indicates that the mmap system call is * available to map a file into memory. @@ -376,12 +562,26 @@ */ #$d_nanosleep HAS_NANOSLEEP /**/ +/* HAS_OPENAT: + * This symbol, if defined, indicates that the openat() routine is + * available to open files with a relative path interepreted in + * the context of an opened directory. + */ +#$d_openat HAS_OPENAT /**/ + /* HAS_PAUSE: * This symbol, if defined, indicates that the pause routine is * available to suspend a process until a signal is received. */ #$d_pause HAS_PAUSE /**/ +/* HAS_PIPE2: + * This symbol, if defined, indicates that the pipe routine is + * available to create an inter-process channel with O_CLOEXEC or + * O_NONBLOCK flags. + */ +#$d_pipe2 HAS_PIPE2 /**/ + /* HAS_POLL: * This symbol, if defined, indicates that the poll routine is * available to poll active file descriptors. Please check I_POLL and @@ -418,6 +618,19 @@ */ #$d_preadv HAS_PREADV /**/ +/* HAS_PROGRAM_INVOCATION_NAME: + * This symbol is defined when the C startup sets the two variables + * program_invocation_name and program_invocation_short_name. To get + * these definitions, <errno.h> must be included with __USE_GNU defined. + */ +#$d_proginvocname HAS_PROGRAM_INVOCATION_NAME + +/* HAS_PTHREAD_ATTR_SETSTACK: + * This symbol is defined when pthread_attr_setstack() can be used to set + * the thread stack. Otherwise, use obsoleted pthread_attr_setstackaddr(). + */ +#$d_ptattr_setstack HAS_PTHREAD_ATTR_SETSTACK + /* HAS_PWRITE: * This symbol, if defined, indicates that the pwrite routine is * available to perform writes on a file descriptor at a given offset. @@ -464,6 +677,12 @@ */ #$d_sbrk HAS_SBRK /**/ +/* HAS_SCHED_YIELD: + * This symbol, if defined, indicates that the sched_yield() routine is + * available to yield the CPU. + */ +#$d_sched_yield HAS_SCHED_YIELD /**/ + /* HAS_SELECT: * This symbol, if defined, indicates that the select routine is * available to select active file descriptors. If the timeout field @@ -471,18 +690,53 @@ */ #$d_select HAS_SELECT /**/ +/* HAS_SEMCTL: + * This symbol, if defined, indicates that the semctl() routine is + * available to perform semaphore control operations. + */ +#$d_semctl HAS_SEMCTL /**/ + +/* HAS_SEMGET: + * This symbol, if defined, indicates that the semget() routine is + * available to get a set of semaphores. + */ +#$d_semget HAS_SEMGET /**/ + +/* HAS_SEMOP: + * This symbol, if defined, indicates that the semop() routine is + * available to execute semaphore operations. + */ +/* HAS_SEMTIMEDOP: + * This symbol, if defined, indicates that the semtimedop() routine is + * available to execute semaphore operations with a timeout. + */ +#$d_semop HAS_SEMOP /**/ +#$d_semtimedop HAS_SEMTIMEDOP /**/ + /* HAS_SENDFILE: * This symbol, if defined, indicates that the sendfile routine is * available. */ #$d_sendfile HAS_SENDFILE /**/ +/* HAS_SETENV: + * This symbol is defined when setenv() is available to change or + * add an environment variable. + */ +#$d_setenv HAS_SETENV + /* HAS_SETPROCTITLE: * This symbol is defined when setproctitle() can be used and takes a * format string. */ #$d_setproctitle HAS_SETPROCTITLE +/* HAS_SETPROGNAME: + * This symbol is defined when setprogname() is there to set the + * program name. + */ +#$d_setprogname HAS_SETPROGNAME + /* HAS_SETSID: * This symbol, if defined, indicates that the setsid routine is * available to set the process group ID. @@ -495,6 +749,12 @@ */ #$d_sigaction HAS_SIGACTION /**/ +/* HAS_SIGALTSTACK: + * This symbol, if defined, indicates that the sigaltstack() routine + * is available to define an alternate signal stack. + */ +#$d_sigaltstack HAS_SIGALTSTACK /**/ + /* HAS_SIGPROCMASK: * This symbol, if defined, indicates that the sigprocmask() routine is * available to examine and change blocked signals. @@ -542,6 +802,12 @@ */ #$d_socker_get HAS_SOCKER_GET +/* HAS_SOCKETPAIR: + * This symbol, if defined, indicates that the BSD socketpair() call is + * supported. + */ +#$d_sockpair HAS_SOCKETPAIR /**/ + /* HAS_STATFS: * This symbol, if defined, indicates that the Linux statfs() system call * is available to get filesystem statistics. @@ -580,6 +846,12 @@ */ #$d_sync_atomic HAS_SYNC_ATOMIC /**/ +/* HAS_SYSCALL: + * This symbol, if defined, indicates that the syscall routine is + * available to call arbitrary system calls. If undefined, that's tough. + */ +#$d_syscall HAS_SYSCALL /**/ + /* HAS_SYSCTL: * This symbol, if defined, indicates that the sysctl routine is * available. @@ -607,12 +879,31 @@ */ #$d_ttyname HAS_TTYNAME /**/ +/* HAS_UCONTEXT_MCONTEXT: + * This symbol, if defined, indicates that the C program can access the + * processor's general registers through some field in the uc_mcontext + * machine context field from the ucontext_t structure. + */ +#$d_uctx_mctx HAS_UCONTEXT_MCONTEXT /**/ + +/* HAS_UCONTEXT_MCONTEXT_GREGS: + * This symbol, if defined, indicates that the C program can access the + * processor's general registers through the gregs array in the uc_mcontext + * machine context field from the ucontext_t structure. + */ +#$d_uctx_mctx_gregs HAS_UCONTEXT_MCONTEXT_GREGS /**/ + /* HAS_USLEEP: * This symbol, if defined, indicates that the usleep routine is * available to let the process sleep on a sub-second accuracy. */ #$d_usleep HAS_USLEEP /**/ +/* HAS_VFORK: + * This symbol, if defined, indicates that vfork() exists. + */ +#$d_vfork HAS_VFORK /**/ + /* HASVOLATILE: * This symbol, if defined, indicates that this C compiler knows about * the volatile declaration. @@ -666,6 +957,12 @@ */ #$i_dirent I_DIRENT /**/ +/* I_DLFCN: + * This symbol, if defined, indicates that <dlfcn.h> exists and should + * be included. + */ +#$i_dlfcn I_DLFCN /**/ + /* I_EXECINFO: * This symbol, if defined, indicates to the C program that it should * include <execinfo.h> for backtrace() support. @@ -788,6 +1085,12 @@ */ #$i_regex I_REGEX /**/ +/* I_SCHED: + * This symbol, if defined, indicates to the C program that it should + * include <sched.h> to get the definition of sched_yield(). + */ +#$i_sched I_SCHED /**/ + /* I_STDLIB: * This symbol, if defined, indicates that <stdlib.h> exists and should * be included. @@ -806,6 +1109,12 @@ */ #$i_sysfile I_SYS_FILE /**/ +/* I_SYS_IPC: + * This symbol, if defined, indicates to the C program that it should + * include <sys/ipc.h> to get the defines for SysV IPCs. + */ +#$i_sysipc I_SYS_IPC /**/ + /* I_SYS_MMAN: * This symbol, if defined, indicates to the C program that it should * include <sys/mman.h>. @@ -844,6 +1153,12 @@ */ #$i_sysselct I_SYS_SELECT /**/ +/* I_SYS_SEM: + * This symbol, if defined, indicates to the C program that it should + * include <sys/sem.h> to use SysV semaphores. + */ +#$i_syssem I_SYS_SEM /**/ + /* I_SYS_SENDFILE: * This symbol, if defined, indicates to the C program that it should * include <sys/sendfile.h>. @@ -906,6 +1221,12 @@ */ #$i_sysvfs I_SYS_VFS /**/ +/* I_SYS_WAIT: + * This symbol, if defined, indicates to the C program that it should + * include <sys/wait.h>. + */ +#$i_syswait I_SYS_WAIT /**/ + /* I_TIME: * This symbol, if defined, indicates to the C program that it should * include <time.h>. @@ -922,6 +1243,20 @@ #$i_systime I_SYS_TIME /**/ #$i_systimek I_SYS_TIME_KERNEL /**/ +/* I_UCONTEXT: + * This symbol, if defined, indicates to the C program that it should + * include <ucontext.h> to get at the user thread context. A portable + * program must also check I_SYS_UCONTEXT for <sys/ucontex.h> inclusion, + * especially on OSX. + */ +/* I_SYS_UCONTEXT: + * This symbol, if defined, indicates to the C program that it should + * include <sys/ucontext.h> to get at the user thread context. A portable + * program must also check I_UCONTEXT for <ucontex.h> inclusion. + */ +#$i_ucontext I_UCONTEXT /**/ +#$i_sys_ucontext I_SYS_UCONTEXT /**/ + /* I_UNISTD: * This symbol, if defined, indicates to the C program that it should * include <unistd.h>. @@ -940,6 +1275,30 @@ */ #$i_winsock2 I_WINSOCK2 /**/ +/* CAN_HANDLE_64BITS: + * When defined, this indicates that the compiler can handle 64-bit values + * despite the CPU having only 32-bit registers. These are available using + * the "long long" C type. It is only defined for ILP32 machines, since + * 64-bit support is naturally available on ILP64 and LP64 machines. + */ +#$d_can64 CAN_HANDLE_64BITS /**/ + +/* INTSIZE: + * This symbol contains the value of sizeof(int) so that the C + * preprocessor can make decisions based on it. + */ +/* LONGSIZE: + * This symbol contains the value of sizeof(long) so that the C + * preprocessor can make decisions based on it. + */ +/* SHORTSIZE: + * This symbol contains the value of sizeof(short) so that the C + * preprocessor can make decisions based on it. + */ +#define INTSIZE $intsize +#define LONGSIZE $longsize +#define SHORTSIZE $shortsize + /* LOCALE_EXP: * This symbol holds the possibly ~name expanded place where localization * files for the package are expected to be found. @@ -990,6 +1349,12 @@ */ #define PRIVLIB_EXP "$privlibexp" /**/ +/* PTRSIZE: + * This symbol contains the size of a pointer, so that the C preprocessor + * can make decisions based on it. + */ +#define PTRSIZE $ptrsize + /* SIG_NAME: * This symbol contains a list of signal names in order of * signal number. This is intended @@ -1036,6 +1401,17 @@ #define M_VOID /* Xenix strikes again */ #endif +/* MEM_ALIGNBYTES: + * This symbol contains the number of bytes required to align a + * double. Usual values are 2, 4 and 8. + */ +#define MEM_ALIGNBYTES $alignbytes /**/ + +/* USE_MY_MALLOC: + * This symbol, if defined, indicates that we're using our own malloc. + */ +#$d_mymalloc USE_MY_MALLOC /**/ + /* CAN_PROTOTYPE: * If defined, this macro indicates that the C compiler can handle * function prototypes.
View file
gtk-gnutella-0.98.2.tar.bz2/debian/changelog -> gtk-gnutella-1.1.9.tar.bz2/debian/changelog
Changed
@@ -1,3 +1,92 @@ +gtk-gnutella (1.1.9-1) unstable; urgency=medium + + * Bug-fixing release from upstream. + + -- Raphael Manfredi <Raphael_Manfredi@pobox.com> Sun, 6 Mar 2016 08:19:06 +0000 + +gtk-gnutella (1.1.8-1) unstable; urgency=critical + + * Bug-fixing release from upstream. + + -- Raphael Manfredi <Raphael_Manfredi@pobox.com> Fri, 18 Dec 2015 18:15:22 +0000 + +gtk-gnutella (1.1.7-1) unstable; urgency=high + + * Bug-fixing release from upstream. + + -- Raphael Manfredi <Raphael_Manfredi@pobox.com> Sun, 13 Dec 2015 15:08:59 +0000 + +gtk-gnutella (1.1.6-1) unstable; urgency=high + + * Bug-fixing release from upstream. + + -- Raphael Manfredi <Raphael_Manfredi@pobox.com> Sun, 8 Nov 2015 11:53:54 +0000 + +gtk-gnutella (1.1.5-1) unstable; urgency=high + + * Bug-fixing release from upstream. + + -- Raphael Manfredi <Raphael_Manfredi@pobox.com> Thu, 8 Oct 2015 16:00:10 +0000 + +gtk-gnutella (1.1-4) unstable; urgency=high + + * Bug-fixing release from upstream. + + -- Raphael Manfredi <Raphael_Manfredi@pobox.com> Wed, 9 Sep 2015 16:04:01 +0000 + +gtk-gnutella (1.1-3) unstable; urgency=high + + * Bug-fixing release from upstream. + + -- Raphael Manfredi <Raphael_Manfredi@pobox.com> Wed, 8 Apr 2015 17:35:21 +0000 + +gtk-gnutella (1.1-2) unstable; urgency=high + + * Bug-fixing release from upstream. + + -- Raphael Manfredi <Raphael_Manfredi@pobox.com> Sat, 21 Mar 2015 17:30:14 +0000 + + +gtk-gnutella (1.1-1) unstable; urgency=high + + * Bug-fixing release from upstream. + + -- Raphael Manfredi <Raphael_Manfredi@pobox.com> Tue, 2 Sep 2014 06:39:05 +0000 + +gtk-gnutella (1.1-0) unstable; urgency=high + + * Fixed possible Denial of Service. + * Made application multi-threaded. + * Added full support of the G2 protocol for searches. + + -- Raphael Manfredi <Raphael_Manfredi@pobox.com> Wed, 2 Jul 2014 18:47:53 +0000 + +gtk-gnutella (1.0-1) unstable; urgency=high + + * Fixed grave bug making all other gtk-gnutella to appear hostile. + + -- Raphael Manfredi <Raphael_Manfredi@pobox.com> Tue, 31 Dec 2013 11:19:09 +0000 + +gtk-gnutella (1.0-0) unstable; urgency=high + + * New upstream major release! + + -- Raphael Manfredi <Raphael_Manfredi@pobox.com> Sun, 1 Sep 2013 16:01:37 +0000 + +gtk-gnutella (0.98-4) unstable; urgency=medium + + * New upstream release + important bug fixes. + * Updated menu icon, now uses a 32x32 format. + * COPYRIGHT section of the manual page now states pure GPL rights. + + -- Raphael Manfredi <Raphael_Manfredi@pobox.com> Sun, 11 Nov 2012 17:34:21 +0000 + +gtk-gnutella (0.98-3) unstable; urgency=medium + + * New upstream minor release + important bug fixes. + + -- Raphael Manfredi <Raphael_Manfredi@pobox.com> Mon, 4 Jun 2012 17:56:23 +0000 + gtk-gnutella (0.98-2) unstable; urgency=critical * Avoid crashes when X programs run multi-threaded (as on recent Ubuntu).
View file
gtk-gnutella-0.98.2.tar.bz2/debian/control -> gtk-gnutella-1.1.9.tar.bz2/debian/control
Changed
@@ -1,5 +1,5 @@ Source: gtk-gnutella -Build-Depends: debhelper (>= 4.0.0), libglib2.0-dev, libgtk2.0-dev, zlib1g-dev (>= 1:1.1.4), libxml2-dev (>= 2.6.0), gettext, libgnutls-dev, libdbus-1-dev +Build-Depends: debhelper (>= 4.0.0), libglib2.0-dev, libgtk2.0-dev, zlib1g-dev (>= 1:1.1.4), gettext, libgnutls-dev, libdbus-1-dev, binutils-dev Section: net Priority: optional Maintainer: Luca Bruno <luca.br@uno.it>
View file
gtk-gnutella-0.98.2.tar.bz2/debian/copyright -> gtk-gnutella-1.1.9.tar.bz2/debian/copyright
Changed
@@ -23,7 +23,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA On Debian systems, the complete text of the GNU General -Public License can be found in `/usr/share/common-licenses/GPL'. +Public License can be found in `/usr/share/common-licenses/GPL-2'. This package also included geographic information on IP addresses which is under the following licence:
View file
gtk-gnutella-0.98.2.tar.bz2/debian/rules -> gtk-gnutella-1.1.9.tar.bz2/debian/rules
Changed
@@ -20,6 +20,7 @@ # from having to guess our platform (since we know it already) DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) +DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) CFLAGS = -Wall -g
View file
gtk-gnutella-1.1.9.tar.bz2/doc/devguide/Coverity
Added
@@ -0,0 +1,36 @@ +Coverity is a static code checker. + +The gtk-gnutella project is at: + + https://scan.coverity.com/projects/2178 + +To build gtk-gnutella for analysis, one needs to first download the +necessary binaries for the platform, and install them say in /usr/local. +As of this writing, this is: + + /usr/local/cov-analysis-linux64-7.0.2 + +here on my machine. Let's call this COV. + +Add COV/bin to your PATH. + +Configure your C compiler, for instance: + + cov-configure --compiler /usr/bin/cc --comptype gcc + +In the src/ directory run: + + make coverity.tgz + +Upload the generated coverity.tgz file to the Coverity scanner, which is +available through the URL of the project mentionned above (one has to login +first). + +The file src/coverity.c is a model for the Converity scanner which teaches +it basic things about some key functions, for the runtime analyzing the code +paths. The scanner may be able to automatically derive some of the properties +from gcc attribute hints, but maybe not, so we're helping it. + +The src/coverity.c file has to be manually uploaded to the Coverity scanner, +it is not automatically picked from the source tree. +
View file
gtk-gnutella-0.98.2.tar.bz2/doc/devguide/RELEASE -> gtk-gnutella-1.1.9.tar.bz2/doc/devguide/RELEASE
Changed
@@ -27,6 +27,15 @@ cd extra_files make update # updates geo-ip.txt + cd "top directory" + tx pull # Pull translations from Transifex + + # If the above "tx pull" did not work, then do: + + tx pull -f + cd po + make update + 1. Write user summary of changes since last release in ChangeLog. 2. Mark toplevel entry in ChangeLog as being the release: @@ -49,18 +58,14 @@ #define GTA_REVCHAR "" #define GTA_RELEASE "2002-10-19" -4. Commit ChangeLog and src/gtk-gnutella.h with comment: - - "Release 0.91 stable." - -5. Update and commit debian/changelog. Generate the timestamp as follows: +4. Update debian/changelog. Generate the timestamp as follows: TZ=UTC LC_ALL=C date +'%a, %e %b %Y %H:%M:%S %z' -6. Make sure MANIFEST doesn't list any files considered unfree by Debian, +5. Make sure MANIFEST doesn't list any files considered unfree by Debian, for example, RFCs and other copyrighted documentation. -7. From the "top directory", run: +6. From the "top directory", run: git diff > ~/tmp/xxx @@ -68,10 +73,15 @@ changes that require to be checked-in before the release is made. Commit them if needed. -8. Tag project with a PGP signature: +7. Commit pending changes with comment such as "Release 0.91 stable." - cd "top directory" - git tag -s v0.97.1 + git commit -a -m "Release 0.91 stable." + +8. Merge back to the master branch and tag project with a PGP signature: + + git checkout master + git merge --no-ff -m "Release 0.98.3 stable." devel + git tag -s -m "Release 0.98.3 stable." v0.98.3 9. Make a clean distribution package: @@ -99,18 +109,17 @@ This will generate file ../gtk-gnutella_0.92.1-0_i386.deb -13. Convert the file to an RPM package, keeping the same version number: +13. When everything builds fine, publish the new release: - cd .. - fakeroot alien --to-rpm --keep-version gtk-gnutella_0.91.0-0_i386.deb - - This will generate file gtk-gnutella-0.91.0-0.i386.rpm + git push origin + git push --tags origin 14. Go to https://sourceforge.net/projects/gtk-gnutella/files/ and create a new directory gtk-gnutella/0.96.9 (say) to host the released files. -15. Upload the files to sourceforge using scp. +15. Upload the files to sourceforge using scp, or use the web interface + to upload the files through HTTP. scp gtk-gnutella-0.96.9.tar.bz2 gtk-gnutella-0.96.9.tar.bz2.asc \ USER@frs.sourceforge.net:\ @@ -120,24 +129,27 @@ default download. 17. Go back to the Summary page and check if the project details are - still up-to-date. In particular check the set of languages - available in the distribution against the listing with: + still up-to-date. In particular check the set of languages + available in the distribution against the listing with: cat po/*.po|grep 'Language-Team:'|sort 18. Update sourceforge's website: Create a news entry in htdocs/files/en using - news_template as a guide and submit it. + news_template as a guide and submit it. The scripts/changelog2html + script can automate most of this process: + + scripts/changelog2html ChangeLog > htdocs/files/en/news_NUM 19. Change the VERSION file in htdocs/files to update the version number. VERSION=0.96.9 -20. Manually update the web site by logging in to projects.sourceforge.net via - SSH: +20. Manually update the web site by running the update_homepage.sh script + from the htdocs directory: + + ./update_homepage.sh USER - ssh -t USER,gtk-gnutella@shell.sourceforge.net create - $ cd /home/project-web/gtk-gnutella - $ ./update_homepage.sh + where USER is your sourceforge login name. 21. Send a message to gtk-gnutella-announce telling about the release using Announce-template.txt
View file
gtk-gnutella-0.98.2.tar.bz2/doc/gnutella/GGEP -> gtk-gnutella-1.1.9.tar.bz2/doc/gnutella/GGEP
Changed
@@ -141,9 +141,8 @@ the Gnutella 0.6 connection handshake indicating this support. This will allow other servents to know what types of packets this servent can accept. The format of this header is -GGEP : majorversion'.'minorversion -Format + GGEP : majorversion'.'minorversion Length Encoding @@ -154,13 +153,9 @@ chunks. The format of each length chunk (which contains 6 bits of length info) is described in bit level below: -Format - - 76543210 MLxxxxxx - M = 1 if there is another length chunk in the sequence, else 0 L = 1 if this is the last length chunk in the sequence, else 0 xxxxxx = 6 bits of data. @@ -232,7 +227,7 @@ _____________________________________________________________________________ |Byte_Positions|Name_|Comments________________________________________________| -| | |This is a magic number is used to help distinguish GGEP | +| | |This is a magic number used to help distinguish GGEP | |0 |Magic|extensions from legacy data which may exist. It must be| |______________|_____|set_to_the_value_0xC3.__________________________________|
View file
gtk-gnutella-0.98.2.tar.bz2/doc/gnutella/GUESS -> gtk-gnutella-1.1.9.tar.bz2/doc/gnutella/GUESS
Changed
@@ -885,8 +885,14 @@ Compressed query hits are transmitted normally, with the bit 7 from the TTL set to flag compression, as explained in 16. - A GUESS 0.2 server SHOULD strip the "Z" GGEP extensions from the - Query before forwarding the message to the leaves. + With the coming of the Semi-Reliable UDP layer 17 in Gnutella (which + can natively compress payloads), the "Z" extension should be deprecated. + Servents should implement the Semi-Reliable UDP layer instead, to more + reliably transmit hits back. Support for this new feature is advertised + in the Query flags (in the old "speed" field), as explained in 17. + + A GUESS 0.2 server SHOULD strip the "Z" extension from the Query before + forwarding the message to the leaves. References @@ -956,6 +962,8 @@ 16 Raphael Manfredi, "Gnutella UDP Traffic Compression", August 2006, <http://groups.yahoo.com/group/the_gdf/message/22739> + 17 Raphael Manfredi, "Gnutella Semi-Reliable UDP", October + 2012, <http://groups.yahoo.com/group/the_gdf/message/23806> Daswani & Fisk Page 15
View file
gtk-gnutella-0.98.2.tar.bz2/doc/gnutella/RUDP -> gtk-gnutella-1.1.9.tar.bz2/doc/gnutella/RUDP
Changed
@@ -169,3 +169,181 @@ before. Uncontrolled test Try to download and upload from Limewire 4.2.6, which supports firewall to firewall transfer. + +LimeWire's Internal Documentation +================================= + +Requirements for FW-FW Transfer: +-------------------------------- +* You must be firewalled (no successful incoming connections). +* You must know your external address (snooped from Sockets for outgoing + connections). +* You must be able to handle solicited UDP traffic (easy test: send out + a UDP Ping with a certain GUID, see if you get a UDP Pong with that GUID + back) -- use GGEP "IP" to get your external IP and port. +* You must have valid PushProxy connections (really only true for + uploaders, but for sake of simplicity apply to everyone). + +In the next few sections, some information may be repeated. + +Client Side (Downloader) behavior: +---------------------------------- + +* If you meet the requirements above, nodes should mark bit 9 of their + queries MinSpeed field. NOTE: If you set bit 9, you must set bit 14 ("I + am firewalled" bit). Nodes that are also firewalled would usually + ignore your query, but if they meet the requirements above and see bit 9 + marked they can now return a hit. +* Nodes (from firewalled hosts) that support firewalled transfers will + send a GGEP header and value in their reply. The GGEP header is "FW" + and the value is the FW-FW Transfer version (currently 1). Replies from + firewalled hosts should be ignored unless this GGEP header is present in + the reply. +* If a reply from a firewalled node is downloaded by the user, the node + should send a PushProxy request to the node's (uploader's) PushProxy (as + many as needed up to as many provided). The PushProxy HTTP request + should be amended to include a file parameter with value (2^31 - 3), + i.e. "&file=2147483645". Also, the HTTP exchange should have a "X-Node" + header value of the downloader's external address and firewalled port. +* Assuming the PushProxy process was successful, the downloader should + start sending UDP Syns (as described further below) to the uploader's + address (which is taken from the reply). If everything is kosher, it will + get a UDP Ack in reply (and the transfer can start). + +Client Side (Uploader) behavior: +-------------------------------- + +* If a node that satisifes all the FW-FW Transfer conditions receives a + query with MinSpeed bits 14 and 9 marked, it may send a reply to this node. +* Any reply should satisfy the following constraints: + - It must have a GGEP header "FW" with value 1. + - The reply must have address and port info as follows: address is + external address as reported by symmetric TCP connections, port must be + your (firewalled) listening port. +* When the node receives a Push with index 2147483645 it should start + sending UDP Syns to the address and port described by the Push. If + everything is kosher, it will get a UDP Ack in reply (and the transfer + can start). + +PushProxy behavior: +------------------- + +* Proxies should not need to do anything different, assuming their + initial implementation was sane (i.e. it should note the file param and + should fill out the Push's address, port, and file index correctly). + +Notes from RAM + +The above specifications could not work correctly when initiating FW-FW +transfers behind a NAT firewall, unless there was way for the sender to know +in advance the port that will be opened by the firewall to perform NAT +and be able to route traffic back to the sender in the internal network.. + +The solution is to use the GGEP "IP" extension in a ping: the remote host +will send back another "IP" in the pong echoing the source address and port +of the ping. That lets the firewalled servent know its external port. + +Therefore, when using an HTTP push-proxy to send the request, the X-Node +header can advertise the discovered external IP:port used by the servent. + +When a push-proxy is getting a PUSH via UDP, it can recognize that the +file-index refers to a FW-FW transfer. The push-proxy can then patch the +message in-place using the port in the incoming UDP message -- that is the +port used by the NAT firewall, and only that port will get traffic back to +the downloader behind the NAT firewall! + +That on-the-fly patching by the UDP push-proxy is useful and can help if +the NAT firewall changed the port without the user knowing (it was rebooted, +reset, etc...). It nicely complements the discovery through GGEP "IP" but +only works for UDP pushes. + +/Notes from RAM + +Connection Negotiation and lifetime for UDP Connections: +-------------------------------------------------------- + +This is a brief description of the UDP connection setup at a low level with +some minor updates. Note that this presupposes that the connections have +been kicked off on both ends via pushes/push-proxies and by the downloader +locally. + +Each end of the connection starts out sending a SYN message to setup a +connectionID, identify itself and open up the firewall in the process. +There are dedicated ACK messages in response to every SYN, DATA or FIN +message. FIN messages are for shutdown. There is also a KEEPALIVE message +that shares some of the internal state of ACK messages (windowStart, +windowSpace but not the sequenceNumber of what they are Acking). + +Everything is somewhat intellegently packed into a Gnutella message with +parts of the GUID used for data as well. Everything has a sequenceNumber +which is physically sent on the wire as 2 bytes but logically and internally +mapped to 8 bytes. + +The Data messages try to pack 512 bytes of data into a Gnutella message (12 +in GUID and 500 in payload). That seems to be enough to avoid +super-inefficiency. + +The data transfer algorithm is sort of a combination of SFTP with some TCP +concepts added on. For better throughput, a window is used to rate control +the data messages. The current implementation works with a data window of 20 +data messages. The general idea is to try to send data at *intervals* so as +to ensure that you don't overload the other ends receiving window. The +other end will ack these data packets with the sequenceNumber, windowStart +and windowSpace. The windowStart tells you the lowest sequenceNumber that +the other side has not emptied out of its window. Roughly speaking, as the +windowSpace starts to approach zero on the other end, you should slow down +and stop sending Data. + +Example: The windowStart value is the value of the highest sequenceNumber +where every lower number has been received. So, if I received: 44, 45, 47, +48, 49. My ACK on 49 would have a windowStart of 46 until 46 was received. +If 46 did come in either via a resend or the original message then its +ack would have a windowStart of 50. I use these values to ACK any lower +packets if necessary (without taking into account the timing of them). + +SYN messages start off connections and communicate the desired identifier +(ID) for a UDP connection. They use ID=0 until they have received +the ID desired by the other end of the connection. It is important to the +LimeWire implementation that they start using the ID once received. +They also communicate the protocol version number. IDs for established +connections are from 1 through 255. They cycle so that an ID will not be +reused for a while to avoid ID collision problems from old connections. + + SYN ID=0 SEQ=0 myID=1 V=1 -> + SYN ID=0 SEQ=0 myID=1 V=1 -> + SYN ID=3 SEQ=0 myID=1 V=1 -> Repeated for up to 20 seconds + until an ACK is received +<- SYN ID=0 SEQ=0 myID=3 V=1 +<- SYN ID=0 SEQ=0 myID=3 V=1 +<- SYN ID=1 SEQ=0 myID=3 V=1 Repeated for up to 20 seconds + until an ACK is received + +The connection is not officially set up until acks are returned from both +ends. + + ACK ID=3 SEQ=0 -> +<- ACK ID=1 SEQ=0 + +Once acks have been exchanged, data can be sent. Note that with messages +sent, we use the other end of the connections desired connection ID. This +can be true on some of the final SYN messages as well (after a SYN from the +other side is received but before an ACK is received). + + DATA ID=3 SEQ=1 -> +<- DATA ID=1 SEQ=1 + +<- ACK ID=1 SEQ=1 + ACK ID=3 SEQ=1 -> + +.... + +<- FIN ID=1 SEQ=702 R=0 + FIN ID=3 SEQ=204 R=1 -> + ACK ID=3 SEQ=702 -> +<- ACK ID=1 SEQ=204 + +FIN messages signal a connection shutdown. They carry a reason code. Zero +signals a normal close on the local socket. One signals that the other end +closed the connection. Note that each end maintains its own sequenceNumber +count. +
View file
gtk-gnutella-1.1.9.tar.bz2/doc/gnutella/gnet-TLS-upgrade
Added
@@ -0,0 +1,113 @@ + Gnutella TLS Connection Upgrade + + Raphael Manfredi + <Raphael_Manfredi@pobox.com> + November, 21st 2015 + +1. OVERVIEW + +This specification applies to a Gnutella connection being initiated over +a plain TCP/IP connection, i.e. not over a TLS layer already. + +The purpose of this document is to explain how a Gnutella servent that +supports TLS can advertise that it can switch to TLS if the other end +supports such switching, and how the remote host can acknowledge the +request or not. + +Indeed, intiating a TLS connection directly to a Gnutella host means +that there is beforehand knowledge that the remote host will indeed support +that protocol, or the connection would fail after being established, the +other end reading TLS protocol handshaking data where it otherwise expects +plain Gnutella handshaking. + +So, more often than not, two servents that support TLS will end-up +performing the Gnutella handshake and remain communicating in "plain" +(unencrypted) form. Whereas they are both equipped to use TLS... + +This documents therefore specifies the additional Gnutella handshaking +headers that be can used to negotiate switching to TLS. + + +2. HANDSHAKING NEGOTIATION + +To negotiate TLS connection upgrades, we're leveraging the 3-way +handshaking. The idea is that even though the remote host supports TLS, +it may not be equipped with the necessary logic to upgrade the connection. +Both sides must therefore advertise their willingness to switch to TLS +dynamically. + +Here is how it works: + +The connecting servent sends the following header when it wishes to +dynamically upgrade the plain connection to TLS. This header will be +simply ignored if it is received over an already established TLS +connection: + + Upgrade: TLS/1.0<cr><lf> + +The servent which receives the handshake and is willing to upgrade will +send back the following headers: + + Upgrade: TLS/1.0<cr><lf> + Connection: Upgrade<cr><lf> + +Strictly speaking, the second header would not be necessary but it is +there to acknowledge the upgrade request, whilst the first specifies +to which protocol it will upgrade exactly. + +NOTE: the "Upgrade" string must be interpreted case-insensitively. + +At this point of the exchange (which happened in clear text), the +receipient (i.e. the servent receiving the connection) is going to wait +for the final handshake reply. It does not switch to TLS yet. + +The first sevent (i.e. the one initiating the connection) needs to +acknowledge that the protocol listed in the Upgrade header in the reply +is satisfactory and that it will switch by sending back the following +header: + + Connection: Upgrade<cr><lf> + +At the end of its header reply, it will switch the protocol to TLS. + +Here is an example where both nodes support TLS connection upgrading, +comments starting with "--", and ending <cr><lf> removed for clarity: + + GNUTELLA CONNECT/0.6 + Upgrade: TLS/1.0 -- If you can, I propose we switch to TLS + + GNUTELLA/0.6 200 OK + Upgrade: TLS/1.0 -- I selected TLS/1.0 among your proposal + Connection: Upgrade -- And I am ready to switch at your command + + GNUTELLA/0.6 200 OK + Connection: Upgrade -- OK, let's switch to TLS + + <TLS handshaking data will follow> + <normal Gnutella messages will follow, on top of the TLS transport> + +If the TLS handshake cannot proceed correctly, both servents must close the +connection. + +Here is an exmaple where the recipient does not support TLS upgrading: + + GNUTELLA CONNECT/0.6 + Upgrade: TLS/1.0 -- If you can, I propose we switch to TLS + + GNUTELLA/0.6 200 OK + -- I cannot upgrade or do not know Upgrade + + GNUTELLA/0.6 200 OK + -- OK, we'll stick to plain connection + + <normal Gnutella messages will follow> + +Because the proposed TLS upgrade is at the initiative of the connecting +servent, the servent being connected to will not send the + + Upgrade: TLS/1.0<cr><lf> + +header line, even if it can perform a TLS upgrade, if it did not see +that being offered in the initial handshaking request. + +Raphael
View file
gtk-gnutella-1.1.9.tar.bz2/doc/gnutella/oob-shortcut
Added
@@ -0,0 +1,178 @@ + Out-of-band Shortcut for Query Hits + + Raphael Manfredi + <Raphael_Manfredi@pobox.com> + December 31st, 2011 + + +1. INTRODUCTION + +Looking at the TCP traffic of a moderately well-connected ultra node (40 ultra +peers, 200 leaves) reveals that the size of relayed Gnutella messages splits +as follows: + + 4.86% for Pong, 44.34% Queries and 50.79% for Query Hits + +Seven years after the introduction of Out-of-band query hits, there are still +a number of Gnutella clients out there that do not honor the OOB flag in +queries and send their query hits through TCP. + +This is a cause of concern because the relaying of query hits through Gnutella +creates traffic bottlenecks and flow-control, resulting in the dropping of +less important messages such as queries, and messes up the dynamic querying +algorithms which monitor the amount of hits received to measure the popularity +of the query, due to the delayed receiving of the query hits. + +This OOB Shortcut for Query Hits ("OSQH" for short) proposal aims at fixing +some of the problem at the cost of more intensive processing and resource +consumption within ultra peers. However, ultra peers are the backbone of +the Gnutella network, and these nodes can trade off some computing resources +to save TCP bandwidth. + + +2. OVERVIEW + +The OSQH feature works thusly: + +Ultra nodes already track all the queries that pass through them to avoid +duplicates. For all the queries that are stored in their routing table, +they know need to track a few extra information: + +- Whether the query requested OOB query hit delivery. +- The IPv4:port or IPv6:port where query hits should be delivered via OOB. +- For secure OOB, the query security token. + +For IPv6 address information in queries, please refer to the IPv6-Ready +specifications which all modern servents should implement. + +When query hits come back via TCP and they have more than one hop to go +before reaching their destination (TTL > 1 after local decrement), ultra nodes +look at whether the corresponding query was flagged with OOB by consulting +their routing table. + +If no, then the query hit is normally routed via TCP as currently done. + +If yes however, the query hit is buffered locally and after some time (to +accumulate more hits), an OOB Reply Indication is sent to the OOB destination +(as remembered in the routing table) via a LIME/12v2 or LIME/12v3 message. + +The "flag" byte of the OOB Reply Indication message is extended and 0x2 is +OR-ed to the already defined "firewalled-flag" (0x1). The 0x2 bit indicates +that the hits come from a relaying ultrapeer, and were not generated by that +ultrapeer. This additional information can be ignored by the receiving party +or be used to activate special logic to claim all the reported hits and not +just a few. + +Upon reception of the OOB Reply Indication message, the querying party will +then proceed with claiming the hits, in which case the ultra peer unbuffers +the requested amount of hits. If more hits were buffered since the indication, +another OOB Reply Indication is sent after all the initial hits have been +claimed. + +Note that the amount of hits advertised in LIME/12 is NOT the amount of +query hit messages but the sum of all the individual entries held in each +query hit. + +If the servent claims 255 hits (the maximum that can be possibly requested), +the ultra peer delivers entire query hit messages until the limit of 255 hits +is reached, after which if there is additional information left, it will send +another OOB Reply Indication message. This avoids flooding the receiving +end by controlling the amount of traffic that can be received. + +If the servent claims less than 255 hits, it means the querying party is no +longer interested and the query can be flagged as "done" in the routing table. +Any further hits received for that query can be safely discarded after the +requested hits have been sent back. + +The limit of 255 hits is naturally adjusted down if there were less hits +advertised initially (the ultra peer must remember how many hits it indicated). + +Because UDP traffic can be lost and because this can result in the querying +party being shadowed from a potentially large amount of hits, the ultra peer +resends the OOB Reply Indication message two more times if it does not receive +any claim after some time, doubling the period each time. There is no way for +the receiver to know that this is a re-emission, and it could be confused with +an indication that there are more hits to claim. + +Therefore, the ultra node will send a new GTKG/11v1 message to indicate that +there are no more hits to claim for that query, which will also serve as an +acknowledgement to the querying party if it attempts to resend a claiming +request because it thinks the previous one got lost: lack of reception of any +query hit back for the query or lack of reception of a GTKG/11v1 after some +time will indeed indicate the likelihood that some messages were dropped. + +The GTKG/11v1 is specific to this OSQH proposal and is not sent back during +the regular OOB query hit delivery that would happen between a node having +results to send back and a querying party. + +If the querying party does not claim the buffered hits after some reasonable +time (and after 3 notifications), the hits are dropped and the query is marked +as "done". + + +3. SPECIFICATION DETAILS + +3.1 Gnutella Connections + +An ultrapeer supporting OSQH will advertise this in its "features supported" +vendor message to let its peers know about it ("OSQH", version 1). Optionally +it can also be included in the Gnutella handshaking headers, in the X-Features +line, as version 0.1, such as: + + X-Features: OSQH/0.1 + +in case Gnutella ultra peers want to favor connections to other OSQH-supporting +peers to reduce their query hit routing. + + +3.2 GTKG/11v1 -- OOB Hit Exhaustion + +This vendor message is specified thusly: + + Name: "OOB Hit Exhaustion" + Vendor: GTKG + ID: 11 + Version: 1 + TTL: 1 + Payload: None + +The MUID of the vendor message matches the query's MUID. + +Upon reception of this message, the querying party knows that there will be +no more hits returned by the remote ultra peer for this query, so it can +stop asking. + + +3.3 UDP Traffic Compression + +The exchanges made via OSQH are naturally suitable for UDP traffic compression, +as specified on August 13th, 2006. This is a negotiated feature so it is not +a pre-requisite for OSQH, although its support is strongly advised. + + +3.4 Push-Proxy Concerns + +It might be argued that OOB-shortcutting will prevent PUSH routes to be +established. + +Although it is true that PUSH routes will not be established along the +full query hit return path (since it will be taking a shortcut), a PUSH +route is still possible if one realizes that the relaying ultra node is +actually an additional push-proxy: it has seen the query hit route so +far, so it can relay a PUSH if contacted about the servent ID. + +This is actually no less fragile than what the original PUSH route would +have been since the loss of one ultrapeer in the chain would break the whole +route. + +Naturally, this is less of an issue for legacy servents which support the +original push-proxy specifications and the later extensions, since the query +hit will contain a few of these push-proxies. But the querying servent +receiving the hit through the shortcut can add that relaying hop as well. + +The net conclusion is that OOB-shortcutting is not preventing PUSH routes +nor makes them more fragile. It just requires the servents to use more +modern ways to issue PUSHes: via UDP for contacting push-proxies, and +through DHT lookups for refreshing the list of push-proxies. + +Raphael
View file
gtk-gnutella-1.1.9.tar.bz2/doc/gnutella/out-of-band-v3
Added
@@ -0,0 +1,120 @@ +Out of Band Query Reply Delivery Protocol Version 3 + +V1 - obsolete +V2 + +A bit is set in the QueryRequest indicating OOB support. QueryRequest +is routed through Gnutella as usual. The servent wishing to send back a +response through UDP sends a LIME/12v2 message with the number of results +available as a payload. The original client responds with a LIME/11v2 +with the number of responses it wishes to receive. The responder sends +the desired number of QueryReply messages over UDP. + + Querying servent Responding Servent +QueryRequest with minspeed -> + <-- LIME/12v2 + LIME/11v2 --> + <-- QueryReply(ies) + +Problem + +There is no way to guarantee that the QueryReply arrives from the address +it claims. A malicious party may send a LIME/12v2 with fake datagram +source address, wait a short period of time and send the QueryReply with +the same fake datagram address. + + Querying servent Malicious servent + QueryRequest ---> + <--- LIME/12v2 with fake address X + LIME/11v2 -->X + ... wait a short period of time ... + <--- QueryReply with fake address X + +V3 +Security Token + +We introduce the concept of a Security Token. A security token is a +sequence of bytes of any size greater than 0. The token is sent in +the LIME/11v3 message and must be echoed in any QueryReplies. This +ensures that the the internet address that sends the QueryReply has +previously received the LIME/11v3 message. Vendors are free to choose +how to generate their security tokens, but in order for this proposal to +make sense SecurityTokens should be unique across OOB sessions. Also, +since these tokens will be transfered in UDP datagrams its recommended +that their size be kept to a minimimum. + +QueryRequest + +The QueryRequest message indicates support for OOB v3 by including the +"SO" key in a GGEP block. Support for v2 may still be indicated as before. + +LIME/12v3 + +Servents reply with LIME/12v3 to indicate support for OOBv3. If the +QueryRequest indicates support for both v2 and v3, the servent is free to +respond with LIME/12v2. Response with LIME/12v3 does not imply support +for OOB v2. The payload format is the same, but its recommended that +implementors do not discard messages with extra payload after the 2 bytes. + +LIME/11v3 + +This message is sent in response to LIME/12v3. Its payload is modified to +contain a GGEP block after the original two bytes of v2. That GGEP block +MUST contain an entry with the "SO" key whose value will be the security +token. The security token must be at least 1 bytes long. Implementors +are of course free to include other entries in the GGEP block. + +QueryReply + +Any QueryReply messages sent as a result of receiving a LIME/11v3 MUST +contain a GGEP block with the SO field. The value of that field must be +the same as the value of the SO field of the triggering LIME/11v3. + +Example of a valid exchange: + + Querying Servent Replying Servent + QueryRequest with empty GGEP SO --> + <--- LIME/12v3 + LIME/11v3 with SO entry (token) --> + <--- QueryReplies with SO entry + with the same payload as the LIME/11v3 +..verifies that tokens match + + +Example of an invalid exchange: + + Querying Servent Malicious Party + QueryRequest with empty GGEP SO --> + <--- LIME/12v3 with fake address X + LIME/11v3 with SO entry -->X + ... waits a little bit... + <--- QueryReply w/o the token since + it was sent to a fake address + ... discards reply as + tokens don't match. + +Ultrapeer Proxying +V2 + +The presence of the "NP" entry in the QueryRequest is means the ultrapeer +should not OOB proxy that request. + +V3 + +We introduce a complementary protocol, known as OOB Proxy Veto +Protocol. The purpose is twofold: + + Decouple the OOB protocol version from the ability to veto proxying + + Avoid adding GGEP keys in the Query message which would increase + network load + +Support for the new protocol is communicated through a new vendor message +LIME/13v1. That message is sent by a leaf to its ultrapeers. The payload +of the message is an optional single byte, indicating the highest version +of the OOB protocol that should not be proxied. If that byte is missing, +it is to be interpreted that all proxying is vetoed. If the value of the +byte is 0, then all OOB proxying is allowed. The message can be issued +repeatedly if the leaf wants to change the value. + +Written by Zab
View file
gtk-gnutella-1.1.9.tar.bz2/doc/gnutella/udp_transceiver
Added
@@ -0,0 +1,479 @@ + Gnutella Semi-Reliable UDP + + Raphael Manfredi + <Raphael_Manfredi@pobox.com> + October, 23rd, 2012 + + +1. OVERVIEW + +The following specifications document a semi-reliable protocol over UDP to +allow Gnutella servents to exchange "important" information that would be +wasteful if lost along the way. + +The architecture fully follows the so-called "G2 UDP Transceiver" proposal, +with two important changes: + +- The tag is "GTA" to stand for Gnutella. +- The architecture of acknowledgments was improved for efficiency. + +This document fully specifies the protocol but reuses most of the existing +G2 specifications, because they are good and need not be amended. It however +only targets Gnutella. + +The usage of the semi-reliable UDP layer in Gnutella will be for the delivery +of query hits over UDP, provided the querying party indicated support for +this semi-reliable UDP layer, of course (otherwise the reply would not be +properly understood). + +Section 2 is a mere cut-and-paste of the original G2 specifications, slighly +adapted for Gnutella. My additions have been clearly flagged out. + +2. ARCHITECTURE + +2.1 Header + +A small signature identifies the packet as a Gnutella semi-reliable UDP +datagram. This allows the same port to be used for receiving UDP traffic +for other protocols if desired, and offers some simple protection against +random, unexpected traffic. + +A content code identifies the payload as a Gnutella packet message, +allowing future protocols to be added within the same reliability layer if +desired. Flags allow additional attributes to be specified, such as inline +stateless compression of the payload (which is a required feature). + +The header has a fixed size of 8 bytes, and is architected as follows: + + 0 1 2 3 + 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7| Byte + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | idTag | nFlags | 0-3 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | nSequence | nPart | nCount | 4-7 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +The members of the structure are detailed below: + +idTag - contains a three byte encoding protocol identifier, in this case +"GTA" for "GnuTellA". If this signature is not present the packet should +not be interpreted as a Gnutella reliability layer message. + +nFlags - contains flags which modify the content of the packet. The low-order +nibble is reserved for critical flags: if one of these bits is set but +the decoding software does not understand the meaning, the packet must +be discarded. The high-order nibble is reserved for non-critical flags: +when set these bits may be interpreted, but an inability to interpret a +bit does not cause the packet to be discarded. + + Currently defined flags are: + + 0x01 - Deflate + + When the deflate bit is set, the entire payload is compressed with + the deflate algorithm. The compression method used is the Deflate + Compression Data Format (RFC 1951). On top of this compression a ZLIB + `wrapper' is applied (RFC 1950, ZLIB Compressed Data Format). The + ZLIB wrapper ensures packet integrity, among other things. + + Note that the entire payload must be reassembled in the correct order + before it can be deflated if the packet was fragmented. Fragments are + not compressed separately! + + 0x02 - Acknowledge Me + + When the acknowledge-me bit is set, the sender is expecting an + acknowledgement for this packet. + +nSequence - contains the sequence number of the packet. This sequence +number is unique to the sending host only. It is not unique to the pair +of the sending host and receiving host as in TCP, as there is no concept +of connection state. Sequence numbers on consecutive packets need not be +increasing (although that is convenient), they must only be different. If +a packet is fragmented, all of its fragments will have the same sequence +number. Byte order is unimportant here since this is an opaque ID. + +nPart - contains the fragment part number (1 <= nPart <= nCount) + +nCount - contains the number of fragment parts in this packet. On a +transmission, this value will be non-zero (all packets must have at least +one fragment). If nCount is zero, this is an acknowledgement (see below). + + +2.2 Fragmentation + +Large packets must be fragmented before they can be sent through most network +interfaces. Different network media have different MTUs, and it is difficult +to predict what the lowest common size will be. Fragmentation and reassembly +is performed by the existing Internet protocols, however, there are two +important reasons why the reliability layer performs its own fragmentation: + + Sockets implementations specify a maximum datagram size. This is adequate + for the vast majority of transmissions, but it is desirable to have + the transparent ability to send larger packets without worrying about + the host implementation. + + When the Internet protocols fragment, a packet and one or more fragments + are lost, it may decide to discard the whole packet in an unreliable + datagram protocol. The Gnutella reliability layer can compensate by + retransmitting the whole packet, which would then be re-fragmented and + each fragment resent - however, this wastes the fragments that were + successfully received before. Managing fragmentation natively allows + this optimisation. + +Each node determines its own MTU, often based on a best guess combined with +information from the host's sockets implementation. Packets exceeding this +size are fragmented into multiple datagrams of the appropriate size. Each +datagram has the same sequence number and the same fragment count (nCount), +but a different fragment number (nPart). + + +2.3 Transmission Process + +When a packet is to be transmitted, the network layer must: + + - Cache the payload + + - Allocate a new locally and temporally unique sequence number + + - Derive the appropriate number of fragments + + - Queue the fragments for dispatch + + - If the fragments do not need to be acknowledged, the packet can be + flushed now + +The payload will generally be cached for an appropriate timeout period, +or until the data cache becomes full, at which time older payloads can be +discarded. Fragments are dispatched according to the dispatch algorithm of +choice, and the sender listens for acknowledgements. + +When an acknowledgement is received: + + - Lookup the sent packet by sequence number + + - Mark the nPart fragment as received and cancel any retransmissions + of this part + + - If all fragments have been acknowledged, flush this packet from + the cache + +If a fragment has been transmitted but has not been acknowledged within the +timeout, it should be retransmitted. A finite number of retransmissions are +allowed before the packet as a whole expires, at which time it is assumed +that the packet was not received. + + +2.4 Reception Process + +When a new datagram is received, the network layer must: + + - If the acknowledge bit was set, send an acknowledge packet for this + sequence number and part number, with nCount set to zero (ACK) + + - Lookup any existing packet by the sending IP and sequence number + + - If there is no existing packet, create a new packet entry with the IP, + sequence number, fragment count and flags + + - If there was an existing packet, make sure it is not marked as done - + if so, abort + + - Add the transmitted fragment to the (new or old) packet entry + + - If the packet now has all fragments, mark it as done, decode it + and pass it up to the application layer (who will not know it was + received via semi-reliable UDP). + + - Leave the packet on the cache even if it was finished, in case any + parts are retransmitted + + - Expire old packets from the receive buffer after a timeout, or if + the buffer is full + + +2.5 Dispatch Algorithm + +Fragment datagrams need to be dispatched intelligently, to spread the load +on network resources and maximise the chance that the receiver will get +the message. To do this, the dispatch algorithm should take into account +several points: + + - Prioritize acknowledgements. + + - If fragments are waiting to be sent to a number of hosts, do not send + to the same host twice in a row. Alternating, or looping through the + target hosts achieves the same data rate locally, but spreads out the + load over downstream links. + + - Do not exceed or approach the capacity of the local network + connection. If a host has a 128 kb/s outbound bandwidth, dispatching + 32 KB of data in one second will likely cause massive packet loss, + leading to a retransmission. + + - After considering the above points, prefer fragments that were queued + recently to older packets. A LIFO or stack type approach means that + even if a transmitter is becoming backed up, some fragments will get + there on time, while others will be delayed. A FIFO approach would mean + that a backed up host delivers every fragment late. + + +2.6 Parameters + +Settings have been changed for gkt-gnutella --RAM + +The recommended parameters for the reliability layer are as follows: + + - Payload maximum size = 476 bytes (MTU for THIS layer) + + - The fragment transmission timeout (ACK not received) is set to + 5 secs for the first transmission, 7.5 secs for the second and 11.25 + secs for the third and last attempt (exponential retry delay). + + - The overall packet transmission timeout is set to 60 secs. + +The UDP/IP header being typically 28 bytes, it is best to limit the payload +of the messages to 476 bytes. That way, with the 8-byte header we're topping +plus the UDP/IP header, the whole message will not be greater than 512 bytes. + + +2.7 Performance Considerations + +Relatively low-level network implementations such as this are reasonably +complicated, but must operate fast. It is desirable to avoid runtime +memory allocations in network code as much as possible, and particularly +at this level. + +It should be noted that in almost all cases, transmissions to "untested" +nodes are single fragment. Replies on the other hand are often larger, and +may be deflated in many fragments. This is optimal, because attempting to +contact a node which may be unavailable, involves a retransmission of only +a single fragment. + +Flow control is an important topic, however, it is handled at a higher layer. +The UDP reliability layer is only responsible for guaranteeing delivery of +selected datagrams. + +Only critical transmissions whose reception cannot otherwise be inferred, +should have the acknowledge request bit set. + + +2.8 Extended Acknowledgments + +2.8 and beyond are my additions to the original G2 specifications --RAM + +Because acknowledgment messages can be lost in the way or arrive out of +order, it is best to include as much of the reception state as possible so +that the sending party can optimize retransmissions. + +In order to do that, the following extensions to the original specifications +have been added by gtk-gnutella: + + - Cumulative Acknowledgements: when the flag 0x10 is set, it tells the + other party that all the fragments up to nPart have been received. + + - Extended Acknowledgments: when the flag 0x20 is set, it tells the + other party that an acknowledgment payload is present. It immediately + follows the header and is architected thusly: + + + 0 1 2 3 + 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7| Byte + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | nReceived | missingBits | 0-3 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +nReceived is the total amount of parts successfully received so far. + +missingBits is a bitfield that is read as a big-endian number and which +contains set bits (i.e. "1") for the parts still missing. The base part +number is normally 0, unless flag 0x10 was set, in which case the nPart +value indicates the base. The rule is then that if bit b is set, then the +fragment number b + base + 1 is still missing. + +In the unlikely case where missingBits is too small to hold all the missing +parts, only the ones that can be represented are included, the nReceived +field being there to provide additional information. + +Proper generation and parsing of the missingBits field is crucial, so to +remove any ambiguity, it is best to interpret missingBits as a number. Then +bit 0 is the bit corresponding to 2^0, bit n is the bit corresponding to 2^n. +In the above pictogram, bit 0 of missingBits is the 7th bit of the 3rd byte. + +Bit 0 corresponds to fragment #1, unless the 0x10 flag was set. In that +case, if for instance nPart is 3, then it means fragments #1, #2 and #3 +were already received. The base is therefore 3, and if bit 0 is set in +missingBits, it means fragment #4 (0 + 3 + 1) is still missing. + +This extended acknowledgment lets the sending party optimize its +retransmissions even when some acknowledgments are lost. + +Extended Acknowlegments are only useful when the total amount of fragments +is 3 or above. Indeed, with only 2 fragments, the Cumulative Acknowledgment +lets the receiving party know about the whole reception state. + +When the amount of fragments is 3 or more and only a Cumulative Acknowledgment +is sent out, it implicitly denies reception of any other fragments. This +optimizes bandwidth since the 4 extra bytes sent out will only be required +for large messages (more than 2 fragments) in case fragments are received +out-of-order. + + +2.9 Delayed Acknowledgments + +To maximize the usefulness of Cumulative Acknowledgments, the receiver can +delay its acknowledgments for a small period of time (100 ms, say) in the +hope that more fragments of the message will arrive meanwhile, provided the +message has more than 1 fragment naturally. When the 100 ms delay is expired, +it can then acknowledge everything it got so far. Performance will not be +impacted by this small delaying, but it can save a few acknowledgments for +larger messages. + +This means a sender must use a transmission policy whereby it first sends +all the fragments of each message at once, then waits for acknowledgments or +timeouts before retransmitting the missing fragments. In other words, the +sender should not send a fragment, wait for its acknowledge before sending +the next one, a least initially: this delays the reception of the entire +message and it prevents using the optimizations that extended acknowledgments +bring! + +In case fragments are not acknowledged within the prescribed delay, they are +enqueued for re-transmission. This time, the sender can send a few fragments, +waiting for them to be acknowledged before continuing with the next batch of +un-acknowledged fragments. It can also use a window, whereby it sends one +fragment, and if it gets acknowledged, then it sends the next 2 fragments +that need resending, then the next 3, etc... On timeout, it could decrease +that window. + +That strategy allows for less retransmissions when acknowledgments are lost: +thanks to cumulative or extended acknowledgments, the sender can quickly +realize it did not get them and therefore stop retransmission with less data +transferred than if fragments were systematically resent on timeout. + + +2.10 Extra Acknowledgment Requests + +An Extra Acknowledgment Request (EAR) is a special message that can be sent +by the transmission side (TX side, for short) to request an acknowledgment +(ACK) from the receiving side (RX side) for everything that was successfully +received so far for a particular sequence ID. + +After sending all the fragments initially, and before resending a fragment +upon not getting any ACK back, the TX side can send an EAR, which will be +hopefully answered to by the RX side. This serves two purposes: + +1. It cheaply requests that another ACK be sent by the RX side, in case the + previous one was lost on its way back. + +2. It avoid resending fragments uselessly if there is nobody listening on the + other end. + +An EAR is kind of an ACK message, albeit it has nPart = 0 and nCount = 0. +Moreover, the 0x02 bit in nFlags is set (ACK requested) to indicate that this +message must somehow be replied to. The 0x01 bit MUST be cleared as well: its +payload is never deflated (there is none). + +It is easy to recognize the EAR for what it is because no valid ACK will have +a nPart field set to zero. + +When the RX side gets an EAR, it looks at its nSequence field: + + - If it knows the sequence ID, it has already started to receive fragments + for this message. In that case, it immediately acknowledges the EAR + by sending back an ACK for the sequence ID, describing what has been + received so far. It can be a cumulative or an extended ACK. + + - If it does not know the sequence ID, it means no fragments were received + so far. In that case, it immediately negatively acknowledges the EAR + by sending back another EAR but with the 0x02 bit in nFlags cleared! + This indicates to the TX side receiving the EAR that it is actually an + ACK for the EAR it sent, not an EAR that it must respond to. + +The TX side then either gets an ACK or an EAR back, and it knows that the +remote host is up, as well as how many fragments it has received so far. +It can then proceed with re-transmission. + +If the TX side gets nothing back after sending an EAR and waiting 5 seconds, +it resends another EAR, waiting for 7.5 seconds before sending a final EAR +and waiting 11 seconds for a reply (same parameters as for a regular fragment). + +After 3 EARs sent and no reply received, the TX side can assume the other end +is not listening and it can drop the message. Fragments will only have been +sent once. + + +3. SEMI-RELIABLE NEGOCIATION + +Because legacy servents do not know about this new semi-reliable UDP layer, +it is important to negotiate its usage. This is done by stealing a bit in +the query flags. + +Recall that the old "speed" field in queries (the first 2 bytes of the +Gnutella payload) have been re-architected circa 2003 as query flags: +the field is now read as a big-endian number, with bit 15 being set to +mark the field as being a "modern" one. Bits 0-8 were reserved during this +re-architecture to specify the maximum amount of hits desired. + +So we're stealing bit 8 from this reserved set to flag support for the +semi-reliable UDP layer. If intepreted by legacy code, this will appear +to request at least 256 hits (I say "at least" because maybe we can steal +more bits in the future, but this bit will now always be set by gtk-gnutella +and hopefully other modern Gnutella servents). Therefore, since 256 hits +constitutes a lot of hits, it should not become a problem for anyone. + +Here are the specs for this new bit: + + #define QUERY_F_SR_UDP 0x0100 /* Accepts semi-reliable UDP */ + +To avoid ambiguity, here are the other existing flags for queries: + + #define QUERY_F_MARK 0x8000 /* Field is special: not a speed */ + #define QUERY_F_FIREWALLED 0x4000 /* Issuing servent is firewalled */ + #define QUERY_F_XML 0x2000 /* Supports XML in result set */ + #define QUERY_F_LEAF_GUIDED 0x1000 /* Leaf-guided query */ + #define QUERY_F_GGEP_H 0x0800 /* Recipient understands GGEP "H" */ + #define QUERY_F_OOB_REPLY 0x0400 /* Out-of-band reply possible */ + #define QUERY_F_FW_TO_FW 0x0200 /* Can do fw to fw transfers */ + +GUESS servers and replying hosts can then peruse this information to send +hits and "OOB Reply Indication" messages (LIME/12) through the semi-reliable +layer instead of plain UDP, requesting acknowledgments. This helps ensure +the notification is not lost and that hits are subsequently reliably sent, +and possibly better compressed. + + +4. GNUTELLA VERSUS SEMI-RELIABLE TRAFFIC DISCRIMINATION + +Because semi-reliable UDP traffic and regular Gnutella UDP traffic all happen +on the same socket, it is necessary to implement logic that will sort out +which is which. + +When the GUID of messages is not starting with the "GTA" bytes, we know we +are not facing semi-reliable UDP traffic. When it starts with "GTA", it +could be valid Gnutella or semi-reliable UDP traffic, creating an ambiguity... + +It is relatively easy to discriminate the traffic using simple logic. For +instance: + +- Check the "size" field of the Gnutella header for consistency. If it is not + consistent with the length of the message, then the traffic is not Gnutella + and is therefore a semi-reliable UDP traffic. + +- If the semi-reliable header is inconsistent (fragment part and count being + off, critical flags that we do not know about being set, sequence ID unknown + by the receiving side -- for followup fragments, of course), then we can + rule out semi-reliable UDP traffic. + +The discriminating logic implemented by gtk-gnutella is more complex than that +and involves deeper inspection, but the above logic should be able to only +mis-classify 1 message out of 1 billion, which in practice should not create +problems. + + +5. HISTORY + +2012-09-23: first version. +2012-10-07: added Delayed Acknowledgments. +2012-10-23: added Extra Acknowledgment Requests. + +Raphael
View file
gtk-gnutella-1.1.9.tar.bz2/doc/public/GGEP/PRU
Added
@@ -0,0 +1,25 @@ +The 'PRU' GGEP Extension +======================== + +Name: PRU (Partial Result Unverified) +Where: Query Hit +Status: Production +Date: Sat Nov 3 11:19:10 CET 2012 +Format: <UNIX timestamp> <variable-length 64-bit LE integer> +COBS-Encoding: If neccessary +Deflate: No + +The "PRU' extension is used in query hits to indicate that the result entry +is only partially available. This is in response to queries holding the "PR" +GGEP extension to indicate that they are ready to accept partial results. + +The payload of the PRU extension can be empty (legacy servents only) or +will contain a binary concatenation of two values: + +- A 4-byte timestamp, big-endian encoding. This is the amount of seconds + since the UNIX Epoch, indicating the last time data was received for this + file by the servent. + +- A variable file size encoded like the GGEP "LF" extension and giving the + amount of bytes available for the file. This will be between 0 and 8-byte + long and is simply a little-endian encoding with trailing zeroes stripped.
View file
gtk-gnutella-0.98.2.tar.bz2/extra_files/Jmakefile -> gtk-gnutella-1.1.9.tar.bz2/extra_files/Jmakefile
Changed
@@ -34,6 +34,7 @@ favicon.png \ geo-ip.txt \ geo-ipv6.txt \ + gwcache.boot \ hostiles.txt \ robots.txt \ spam.txt \ @@ -46,14 +47,18 @@ DESKTOP_FILES = \ gtk-gnutella.desktop +APPDATA_FILES = \ + gtk-gnutella.appdata.xml + INSTALLFLAGS = -m 444 MakeInstallDirectories($(PRIVLIB)) InstallMultiple($(EXTRA_FILES), $(PRIVLIB)) InstallMultiple($(DESKTOP_FILES), $(INSTALLPREFIX)/share/applications) +InstallMultiple($(APPDATA_FILES), $(INSTALLPREFIX)/share/appdata) InstallMultiple($(PIXMAP_FILES), $(INSTALLPREFIX)/share/pixmaps) -SetSubdirs(el en ja) +SetSubdirs(el en fr ja tr) ;# ;# Update the bogons and GeoIp databases
View file
gtk-gnutella-0.98.2.tar.bz2/extra_files/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/extra_files/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-107 -: $X-Id: Jmake.tmpl 69 2011-01-09 13:57:07Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -50,13 +50,13 @@ ######################################################################## # Automatically generated parameters -- do not edit -SUBDIRS = el en ja +SUBDIRS = el en fr ja tr !GROK!THIS! $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 106 2011-11-25 20:36:12Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Start of Jmakefile @@ -70,6 +70,7 @@ favicon.png \ geo-ip.txt \ geo-ipv6.txt \ + gwcache.boot \ hostiles.txt \ robots.txt \ spam.txt \ @@ -82,9 +83,12 @@ DESKTOP_FILES = \ gtk-gnutella.desktop +APPDATA_FILES = \ + gtk-gnutella.appdata.xml + INSTALLFLAGS = -m 444 -local_install:: +local_install local_install-strip:: @case '${MFLAGS}' in *i*) set +e;; esac; \ for dir in $(PRIVLIB); do \ (set -x; test -d $(INSTALL_PREFIX)$$dir || \ @@ -127,6 +131,21 @@ (set -x; $(RM) $(INSTALL_PREFIX)$(INSTALLPREFIX)/share/applications/$$i); \ done +local_install:: $(APPDATA_FILES) + @case '${MFLAGS}' in *i*) set +e;; esac; \ + (set -x; test -d $(INSTALL_PREFIX)$(INSTALLPREFIX)/share/appdata || \ + $(INSTALLDIR) $(INSTALL_PREFIX)$(INSTALLPREFIX)/share/appdata); \ + for i in $(APPDATA_FILES); do \ + (set -x; $(INSTALL) -c $(INSTALLFLAGS) \ + $$i $(INSTALL_PREFIX)$(INSTALLPREFIX)/share/appdata) || exit 1;\ + done + +local_deinstall:: + @case '${MFLAGS}' in *i*) set +e;; esac; \ + for i in $(APPDATA_FILES); do \ + (set -x; $(RM) $(INSTALL_PREFIX)$(INSTALLPREFIX)/share/appdata/$$i); \ + done + local_install:: $(PIXMAP_FILES) @case '${MFLAGS}' in *i*) set +e;; esac; \ (set -x; test -d $(INSTALL_PREFIX)$(INSTALLPREFIX)/share/pixmaps || \ @@ -188,6 +207,9 @@ install:: local_install sub_install @exit 0 +install-strip:: local_install-strip sub_install-strip + @exit 0 + install.man:: maybe_install.man sub_install.man deinstall:: sub_deinstall local_deinstall deinstall.man:: sub_deinstall.man maybe_deinstall.man @@ -227,13 +249,16 @@ @case '${MFLAGS}' in *ik*) set +e;; esac; \ for i in $(SUBDIRS) ;\ do \ - (cd $$i ; echo $(VERB) "in $(DIR)$$i..."; \ + (cd $$i ; echo "$(VERB) in $(DIR)$$i..."; \ $(MAKE) $(MFLAGS) $(FLAGS) $(TARGET)) || exit 1; \ done sub_install:: @$(MAKE) subdirs TARGET=install VERB="Installing" FLAGS= +sub_install-strip:: + @$(MAKE) subdirs TARGET=install-strip VERB="Installing (strip)" FLAGS= + sub_deinstall:: @$(MAKE) subdirs TARGET=deinstall VERB="Deinstalling" FLAGS= @echo "Back to $(CURRENT) for "deinstall... @@ -302,6 +327,7 @@ @$(MAKE) subdirs TARGET=all VERB="Making all" FLAGS= local_install:: +local_install-strip:: local_deinstall:: local_install.man:: local_deinstall.man::
View file
gtk-gnutella-0.98.2.tar.bz2/extra_files/el/FAQ -> gtk-gnutella-1.1.9.tar.bz2/extra_files/el/FAQ
Changed
@@ -301,8 +301,8 @@ </p> <pre> 012345678AB (offset) - NIrwqxZPFhT - ||||||||||+ indicates a <strong>T</strong>LS-tunneled connection + NIrwqxZPFhE + ||||||||||+ indicates a TLS <strong>E</strong>ncrypted connection |||||||||+- hops flow triggered (<strong>h</strong>), or total query flow control (<strong>f</strong>) ||||||||+-- flow control (<strong>F</strong>), or pending data in queue (<strong>d</strong>) |||||||+--- we are push-proxy for node (<strong>P</strong>) or node is our push-proxy (<strong>p</strong>) @@ -416,7 +416,7 @@ επιπλέον κυκλοφορία gnet. Για παράδειγμα, στον κόμβο μου με 200 <a href="#general-ultrapeer">δικτυακούς κόμβους</a>, άνοιξα μια παθητική αναζήτηση και φιλτράρισα τα αποτελέσματα για να εμφανίσω μόνο τα χτυπήματα με την ονομασία - <q><em>eminem</em></q>. Μέσα σε μια ώρα περίπου είχα 1500 αποτελέσματα. + <q><em>linux</em></q>. Μέσα σε μια ώρα περίπου είχα 1500 αποτελέσματα. Προφανώς, όσο πιο γνωστή η αναζήτηση, και όσο μεγαλύτερη υπομονή έχετε, τόσο πιο χρήσιμη είναι αυτή η τεχνική. </p>
View file
gtk-gnutella-0.98.2.tar.bz2/extra_files/el/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/extra_files/el/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-30 -: $X-Id: Jmake.tmpl 30 2009-10-28 07:45:28Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -50,18 +50,18 @@ $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 18 2006-12-27 10:35:09Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Start of Jmakefile -# $X-Id: Jmakefile 10280 2005-11-22 19:07:19Z rmanfredi $ +# $X-Id$ all:: FAQDIR = $(PRIVLIB)/el -local_install:: FAQ +local_install local_install-strip:: FAQ @case '${MFLAGS}' in *i*) set +e;; esac; \ (set -x; test -d $(INSTALL_PREFIX)$(FAQDIR) || \ $(INSTALLDIR) $(INSTALL_PREFIX)$(FAQDIR)); \ @@ -89,6 +89,11 @@ $(RM) Makefile config.sh install:: local_install + @exit 0 + +install-strip:: local_install-strip + @exit 0 + install.man:: maybe_install.man deinstall:: local_deinstall deinstall.man:: maybe_deinstall.man @@ -119,12 +124,17 @@ local_clobber:: $(RM) tags +depend:: + ######################################################################## # Empty rules for directories with no sub-directories -- do not edit local_install:: @echo "install in $(CURRENT) done." +local_install-strip:: + @echo "install (strip) in $(CURRENT) done." + local_deinstall:: @echo "deinstall in $(CURRENT) done."
View file
gtk-gnutella-0.98.2.tar.bz2/extra_files/en/FAQ -> gtk-gnutella-1.1.9.tar.bz2/extra_files/en/FAQ
Changed
@@ -1,312 +1,243 @@ -<!-- $Id$ --> -<h1>FAQ</h1> - -<!-- - ** - ** TOC - ** - --> - -<h2>General</h2> -<ul> - <li><a href="#general0">What is gnutella anyway?</a></li> - <li><a href="#general-gtkg">What is GTKG?</a></li> - <li><a href="#general1">This eats up too much bandwidth!</a></li> - <li><a href="#general-ultrapeer">What are Ultrapeers and Leaf nodes?</a></li> - <li><a href="#general-firewall">Why does gtk-gnutella claim it's firewalled - when it's not?</a> - </li> -</ul> - -<h2>Building from source</h2> -<ul> - <li><a href="#build1"> - How do I make Configure stop asking me all those questions?</a> - </li> -</ul> - -<h2>Gnutella connections</h2> -<ul> - <li><a href="#gnet0">What is a good number of connections?</a></li> - <li><a href="#gnet1">Do I need to forward a port on my firewall?</a></li> - <li><a href="#gnet-forward-howto">How do I configure port forwarding?</a></li> - <li><a href="#gnet-udp">Does gtk-gnutella use UDP?</a></li> - <li><a href="#gnet2">What does "FC" mean?</a></li> - <li><a href="#gnet3">Why do I lose gnet connections when i have an upload?</a></li> - <li><a href="#gnet4">What does this stuff in the Flags column mean?</a></li> - <li><a href="#gnet-user-agent">What's the meaning of a leading "!" in the User-Agent name?</a></li> - <li><a href="#gnet5">What does "Harmful version banned, upgrade required" mean?</a></li> - <li><a href="#gnet6">What does "Outdated version, please upgrade" mean?</a></li> - <li><a href="#gnet7">Why doesn't my HTTP proxy work?</a></li> - <li><a href="#gnet8">How can I increase the timeouts?</a></li> - <li><a href="#gnet-auto">How does auto mode decide between ultra and leaf?</a></li> -</ul> - -<h2>Searches</h2> -<ul> - <li><a href="#search0">How can I get more results?</a></li> - <li><a href="#search3">How can I ignore files with no SHA1?</a></li> - <li><a href="#search-entry">Where did the search entry box go?</a></li> - <li><a href="#search-passive">What are "Passive" searches?</a></li> -</ul> - -<h2>Downloads</h2> -<ul> - <li><a href="#down0">What does the status "Ignoring requested SHA1|name & size" mean?</a></li> - <li><a href="#down1">What does the status "No URN on server" mean?</a></li> - <li><a href="#down2">Why is the same file downloaded X times?</a></li> - <li><a href="#down3">What is "swarming"?</a></li> - <li><a href="#down4">What is a "chunk"?</a></li> - <li><a href="#down5">What is the "download mesh"?</a></li> - <li><a href="#down_push">What is a "push request"?</a></li> - <li><a href="#down7">Why does gtk-gnutella append a .OK to my filenames?</a></li> - <li><a href="#down8">I got a file that just won't download!</a></li> - <li><a href="#down9">In the downloads pane, what does it mean if the color - of the text is grey instead of black?</a></li> -</ul> - -<h2>Uploads</h2> -<ul> - <li><a href="#up0">What does "Normalized" mean?</a></li> -</ul> - -<h2>GTK+ 2.x</h2> -<ul> - <li><a href="#gtk2_slow">Gtk2 is way sloooow.</a></li> - <li><a href="#gtk2_ctype">Non-ASCII characters show up as _ (underscore).</a></li> -</ul> - -<!-- - ** - ** Questions and anwers below - ** - --> - -<hr> +<html> +<head> +<meta content="text/html; charset=windows-1252" http-equiv="content-type"> +<title>gtk-gnutella FAQ</title> +</head> +<body> + <h1>FAQ</h1> + + <!-- ** ** TOC ** --> + <h2>General</h2> + <ul> + <li><a href="#general0">What is gnutella anyway?</a></li> + <li><a href="#general-G2">And what about G2?</a></li> + <li><a href="#general-gtkg">What is GTKG?</a></li> + <li><a href="#general1">This eats up too much bandwidth!</a></li> + <li><a href="#general-ultrapeer">What are Ultrapeers and Leaf nodes?</a></li> + <li><a href="#general-firewall">Why does gtk-gnutella claim it's firewalled when it's not?</a></li> + </ul> + + <h2>Building from source</h2> + <ul> + <li><a href="#build1"> How do I make Configure stop asking me all those questions?</a></li> + </ul> + + <h2>Gnutella connections</h2> + <ul> + <li><a href="#gnet0">What is a good number of connections?</a></li> + <li><a href="#gnet1">Do I need to forward a port on my firewall?</a></li> + <li><a href="#gnet-forward-howto">How do I configure port forwarding?</a></li> + <li><a href="#gnet-udp">Does gtk-gnutella use UDP?</a></li> + <li><a href="#gnet2">What does "FC" mean?</a></li> + <li><a href="#gnet3">Why do I lose gnet connections when i have an upload?</a></li> + <li><a href="#gnet4">What does this stuff in the Flags column mean?</a></li> + <li><a href="#gnet-user-agent">What's the meaning of a leading "!" in the User-Agent name?</a></li> + <li><a href="#gnet5">What does "Harmful version banned, upgrade required" mean?</a></li> + <li><a href="#gnet6">What does "Outdated version, please upgrade" mean?</a></li> + <li><a href="#gnet7">Why doesn't my HTTP proxy work?</a></li> + <li><a href="#gnet8">How can I increase the timeouts?</a></li> + <li><a href="#gnet-auto">How does auto mode decide between ultra and leaf?</a></li> + </ul> + + <h2>Searches</h2> + <ul> + <li><a href="#search0">How can I get more results?</a></li> + <li><a href="#search3">How can I ignore files with no SHA1?</a></li> + <li><a href="#search-entry">Where did the search entry box go?</a></li> + <li><a href="#search-passive">What are "Passive" searches?</a></li> + <li><a href="#search-local">How can I copy the magnet link of a file I'm sharing?</a></li> + </ul> + + <h2>Downloads</h2> + <ul> + <li><a href="#down0">What does the status "Ignoring requested SHA1|name & size" mean?</a></li> + <li><a href="#down1">What does the status "No URN on server" mean?</a></li> + <li><a href="#down2">Why is the same file downloaded X times?</a></li> + <li><a href="#down3">What is "swarming"?</a></li> + <li><a href="#down4">What is a "chunk"?</a></li> + <li><a href="#down5">What is the "download mesh"?</a></li> + <li><a href="#down_push">What is a "push request"?</a></li> + <li><a href="#down7">Why does gtk-gnutella append a .OK to my filenames?</a></li> + <li><a href="#down8">I got a file that just won't download!</a></li> + <li><a href="#down9">In the downloads pane, what does it mean if the color of the text is grey instead of black?</a></li> + </ul> + + <h2>Uploads</h2> + <ul> + <li><a href="#up0">What does "Normalized" mean?</a></li> + </ul> + + <h2>GTK+ 2.x</h2> + <ul> + <li><a href="#gtk2_slow">Gtk2 is way sloooow.</a></li> + <li><a href="#gtk2_ctype">Non-ASCII characters show up as _ (underscore).</a></li> + </ul> + + +<!-- ** ** Questions and answers below ** --><hr> <h2>General</h2> - -<h3><a name="general0">What is gnutella anyway?</a></h3> -<p> - Gnutella is a decentralized Peer to Peer information exchanging network. At - the moment you can publish and download files of any kind using the Gnutella - network. For more information, visit the - <a href="http://www.wikipedia.org/wiki/Gnutella" - >Wikipedia definition of Gnutella</a> - or the <a href="http://www.infoanarchy.org/wiki/wiki.pl?Gnutella">definition - of gnutella</a> on the infoAnarchy wiki. -</p> - -<h3><a name="general-gtkg">What is "GTKG?"</a></h3> -<p> - We often refer to gtk-gnutella as GTKG or gtkg (because it's shorter). GTK - comes from GTK+ which is the graphical toolkit used by gtk-gnutella. -</p> - -<h3><a name="general1">This eats up too much bandwidth!</a></h3> -<p> - At the moment you can try one or more of the following things if you are a user - on a slow line (modem): -</p> -<ul> - <li> - Run as a leaf node. You change the peermode setting in the configuration - panel under GnutellaNet. An icon in the statusbar indicates in which mode - you are running. - </li> - <li> - Limit the number of gnet connections you have. - </li> - <li> - If you are able to receive incoming connections, enable <em>Prefer - compressed connections</em> in the <em>Bandwidth control</em> - options. - </li> - <li> - Even if you are on a slow connection, it's still important to share - files. With <a href="#down3">swarming</a>, people can upload small chunks - of files from you, so even a slow connection, multiplied by many sources on - the gnet, makes a tremendous contribution. If you have a 56K modem, you - can set <em>Bandwidth limits for HTTP traffic</em> - <em>Cumulative upload - rate</em> to 1K/s so you still have the majority of your bandwidth for - downloading. - </li> - <li> - Depress the lower-left button in the GUI after your downloads have started. - This will disconnect from the Gnutella network. We strongly advise you to NOT - do that. You won't be able to get more alternate locations from the net and - people won't be able to search your files. - </li> -</ul> - -<h3><a name="general-ultrapeer">What are Ultrapeers and Leaf nodes?</a></h3> -<p> - Since version 0.92, gtk-gnutella has implemented - <a href="?page=features"><em>ultrapeers</em></a> and - <em>leaf nodes</em>. - This divides servents on the gnet into leaf nodes, which connect only to - ultrapeers, and ultrapeers, which connect to many leaf nodes and a small - number of other ultrapeers (see - <a href="#gnet0">What is a good number of connections?</a>). -</p> -<p> - Ultrapeers must not be not firewalled, are expected to have long uptimes - (more than two hours), and have sufficient surplus bandwidth to donate to - the gnet. Ultrapeers forward queries from their leaf nodes and leaf nodes - upload to their ultrapeers - <a href="?page=features">QRP</a> - tables which contain hashes of keywords that will match files shared by the - leaf. When an ultrapeer gets a hit on a query routing table, it relays the - query to the corresponding leaf node. The result is very low gnet traffic - for each leaf node, freeing bandwidth for sharing and downloading (which - still occur directly p2p.) Ultrapeers can also act as - <a href="?page=features">push-proxies</a> for - firewalled leaf nodes. -</p> - -<h3><a name="general-firewall">Why does gtk-gnutella claim it's firewalled - when it's not?</a> -</h3> - -<p> -gtk-gnutella needs to receive an incoming connection to determine if you -can be reached from the outside. Until then, it's assumed that there's -a firewall which blocks the configured listening TCP port. -If you want to speed up the detection, use a web browser, telnet or similar -and connect to the listening port from the outside. If the connection is -refused or dropped, then you are very probably really unreachable due to a -firewall which blocks the port, a misconfigured NAT or similar. You might -want to try a different listening TCP port because some ISPs block the -default Gnutella port (6346). -See also, -<a href="#gnet1"><q>Do I need to forward a port on my firewall?</q></a>. -</p> - -<h2>Building from source</h2> - -<h3><a name="build1">How do I make Configure stop asking me all those questions?</a></h3> -<p> - You can run the <code>Configure</code> script in the following way to make it - use the default settings. It then behaves as calling the old - <code>configure</code> script from autoconf did back in the old days. -</p> -<p> - <code>$ ./Configure -ders</code> -</p> -<p> - You can set compile options on the command line too. Here is an example - that will configure gtk-gnutella to -</p> -<ul> - <li> - accept custom settings (<code>-O</code>). Without this all the - parameters below won't have an effect. - </li> - <li> - use the Gtk1 frontend, activate the remote shell - (<code>-D gtkversion=1 -D remotectrl=y</code>) - </li> - <li> - compile for a pentium with MMX support - (<code>-Dccflags="-march=pentium -mmmx"</code>). - </li> - <li> - compile in debugging information while turning off all compiler - optimizations (<code>-Doptimize="-g -O0"</code>). - </li> -</ul> -<p> - <code>$ ./Configure -ders -O -D gtkversion=1 -D remotectrl=y -Dccflags="-march=pentium -mmmx" -Doptimize="-g -O0"</code> -</p> - -<h2>Gnutella connections</h2> - -<h3><a name="gnet0">What is a good number of connections?</a></h3> -<p> - In <a href="#general-ultrapeer">leaf</a> mode 3 ultrapeers, in - <a href="#general-ultrapeer">ultrapeer</a> mode 32/40 (minimum/maximum) - ultrapeers and around 100 leaf nodes. The actual number should depend on the - available bandwidth. If you have set "Prefer compressed connections," bandwidth - used will be much lower. You should never use up all your bandwidth with - gnet connections. Especially on an asymmetric cable/DSL connection you can - easily starve your incoming traffic by producing too much outgoing traffic - (TCP/IP issue). Use at most half of your outgoing bandwidth for gnet - connections. -</p> -<p> - Since the adoption of "high outdegree" in version 0.95 you should have - 32/40 connections to other ultrapeers. The number - of leaf connections to use depends on your bandwidth and the speed of your - cpu. As an absolute minimum an ultrapeer should connect to 20 leaf nodes - and it's much better to connect to 100 or more. Watch the bandwidth - odometers on the lower left of the gui and use the top command to keep track - of cpu usage. Increase the number of leaf connections until you reach the - maximum amount of bandwidth and system resources you wish to devote to this - purpose. -</p> -<p> - The bandwidth control settings will help you further fine-tune - gtk-gnutella's bandwidth usage. -</p> - -<h3><a name="gnet1">Do I need to forward a port on my firewall?</a></h3> -<p> - You don't need to forward any ports for gtk-gnutella to work, but it - will perform much better if you do. If gtk-gnutella thinks you are - firewalled, it will not show any <a href="#down_push">"push"</a> results since - you wouldn't be able to download those anyway.<br> - Even when people cannot connect directly to you, they can still download - files from your node using a <a href="#down_push">push request</a>.<br> - You can configure the port gtk-gnutella listens on. The setting - <em>Listen port</em> is located in the <em>Settings->Preferences->Network</em>. -</p> - -<h3><a name="gnet-forward-howto">How do I configure port forwarding?</a></h3> -<p> - You can find instructions for most popular routers at - <a href="http://www.portforward.com/routers.htm">http://www.portforward.com/routers.htm</a>. Try - <a href="http://www.canyouseeme.org/">http://www.canyouseeme.org/</a> - to check your port forwarding. -</p> - -<h3><a name="gnet-udp">Does gtk-gnutella use UDP?</a></h3> -<p> - Yes, starting with version 0.95 gtk-gnutella can also use - <a href="http://www.faqs.org/rfcs/rfc768.html">UDP</a> in addition - to <a href="http://www.faqs.org/rfcs/rfc793.html">TCP</a>. -</p> - -<h3><a name="gnet2">What does "FC" mean?</a></h3> -<p> - The <em>FC</em> means "flow control".<br> - In general, you should make sure that servents to which you are connected do - not flow control. Watch for the trailing <em>FC</em> indication at - the end of the <em>Info</em> string (you may need to drag the right - edge past the window to trigger the underlying scroll bar), or look at the - FC state in the <a href="#gnet4">Flags</a> column. As a rule of thumb, if - you have more than one node flow-controlling at a given time, you don't have - enough outgoing bandwidth dedicated to gnet, and therefore you are harming - the network: either decrease the amount of connections, enable the - <em>Prefer compressed connections</em> option or raise the outgoing - bandwidth limit. -</p> - -<h3><a name="gnet3">Why do I lose gnet connections when I have an upload?</a></h3> -<p> - Try to do bandwidth limiting. If that doesn't help, maybe your provider throttles - gnutella traffic. Try changing your gnutella port in the network settings of - gtk-gnutella. -</p> - -<h3><a name="gnet4">What does the stuff in the Flags column mean?</a></h3> -<p> - You can see the type and some of the settings of a connection here. Note - push-proxies are implemented in 0.92.1c and later. -</p> -<pre> - 012345678AB (offset) - NIrwqxZPFhT - ||||||||||+ indicates a <strong>T</strong>LS-tunneled connection + <h3><a name="general0">What is gnutella anyway?</a></h3> + <p>Gnutella is a decentralized Peer to Peer information exchanging network. + At the moment you can publish and download files of any kind using the + Gnutella network. For more information, visit the <a href="http://www.wikipedia.org/wiki/Gnutella">Wikipedia + definition of Gnutella</a>.</p> + + <h3><a name="general-G2">And what about G2?</a></h3> + <p><a href="http://www.wikipedia.org/wiki/Gnutella2">G2</a> is a + peer-to-peer protocol inspired by Gnutella, developed mainly by Michael + Stokes and released in 2002 in the <a href="http://shareaza.sourceforge.net/">Shareaza</a> + client for the Windows operating system. Starting with version 1.1, gtkg + can connect to that network as a leaf and so search and share files on G2 + in addition to Gnutella. The equivalents of <a href="#general-ultrapeer">ultrapeers</a> + are called <em>hubs</em> on the G2 network.</p> + + <h3><a name="general-gtkg">What is GTKG?</a></h3> + <p>We often refer to gtk-gnutella as GTKG or gtkg (because it's shorter). + GTK comes from GTK+ which is the graphical toolkit used by gtk-gnutella.</p> + + <h3><a name="general1">This eats up too much bandwidth!</a></h3> + <p>At the moment you can try one or more of the following things if you are + a user on a slow line:</p> + <ul> + <li>Run as a leaf node. You change the peermode setting in the + configuration panel under GnutellaNet. An icon in the statusbar + indicates in which mode you are running.</li> + <li>Limit the number of gnet connections you have.</li> + <li>If you are able to receive incoming connections, enable <em>Prefer + compressed connections</em> in the <em>Bandwidth</em> options.</li> + <li>Even if you are on a slow connection, it's still important to share + files. With <a href="#down3">swarming</a>, people can upload small + chunks of files from you, so even a slow connection, multiplied by many + sources on the gnet, makes a tremendous contribution. + Setting <em>Bandwidth limits for HTTP traffic</em> - <em>Cumulative + upload rate</em> up to 50% of your available outboing bandwidth should not affect + your web experience.</li> + <li>If you are behind an ADSL router consider configuring <em>Quality of Service</em> (QoS) in order + to optimally distribute the available bandwidth following customizable rules.</li> + <li>Depress the lower-left button in the GUI after your downloads have + started. This will disconnect from the Gnutella network. We strongly + advise you to NOT do that. You won't be able to get more alternate + locations from the net and people won't be able to search your files.</li> + </ul> + + <h3><a name="general-ultrapeer">What are Ultrapeers and Leaf nodes?</a></h3> + <p>Since version 0.92, gtk-gnutella has implemented <em>ultrapeers</em> + and <em>leaf nodes</em>. This divides servents on the gnet into leaf + nodes, which connect only to ultrapeers, and ultrapeers, which connect to + many leaf nodes and a small number of other ultrapeers (see <a href="#gnet0">What + is a good number of connections?</a>).</p> + <p>Ultrapeers must not be not firewalled, are expected to have long uptimes + (more than two hours), and have sufficient surplus bandwidth to donate to + the gnet. Ultrapeers forward queries from their leaf nodes and leaf nodes + upload to their ultrapeers QRP tables which contain hashes of keywords + that will match files shared by the leaf. When an ultrapeer gets a hit on + a query routing table, it relays the query to the corresponding leaf node. + The result is very low gnet traffic for each leaf node, freeing bandwidth + for sharing and downloading (which still occur directly p2p.) Ultrapeers + can also act as <a href="#down_push">push-proxies</a> for firewalled leaf + nodes.</p> + + <h3><a name="general-firewall">Why does gtk-gnutella claim it's firewalled + when it's not?</a></h3> + <p>gtk-gnutella needs to receive an incoming connection to determine if you + can be reached from the outside. Until then, it's assumed that there's a + firewall which blocks the configured listening TCP port. If you want to + speed up the detection, use a web browser, telnet or similar and connect + to the listening port from the outside. If the connection is refused or + dropped, then you are very probably really unreachable due to a firewall + which blocks the port, a misconfigured NAT or similar. You might want to + try a different listening TCP port because some ISPs block the default + Gnutella port (6346). See also, <a href="#gnet1"><q>Do I need to forward + a port on my firewall?</q></a>.</p> + + + <h2>Building from source</h2> + + <h3><a name="build1">How do I make Configure stop asking me all those + questions?</a></h3> + <p>You can run the <code>Configure</code> script in the following way to + make it use the default settings. It then behaves as calling the old <code>configure</code> + script from autoconf did back in the old days.</p> + <p><code>$ ./Configure -ders</code></p> + <p>You can set compile options on the command line too. Here is an example + that will configure gtk-gnutella to</p> + <ul> + <li>accept custom settings (<code>-O</code>). Without this all the + parameters below won't have an effect.</li> + <li>use the Gtk1 frontend, activate the remote shell (<code>-D + gtkversion=1 -D remotectrl=y</code>)</li> + <li>compile for a pentium with MMX support (<code>-Dccflags="-march=pentium + -mmmx"</code>).</li> + <li>compile in debugging information while turning off all compiler + optimizations (<code>-Doptimize="-g -O0"</code>).</li> + </ul> + <p><code>$ ./Configure -ders -O -D gtkversion=1 -D remotectrl=y + -Dccflags="-march=pentium -mmmx" -Doptimize="-g -O0"</code></p> + + + <h2>Gnutella connections</h2> + + <h3><a name="gnet0">What is a good number of connections?</a></h3> + <p>In <a href="#general-ultrapeer">leaf</a> mode 4 ultrapeers, in <a href="#general-ultrapeer">ultrapeer</a> + mode 32/50 (minimum/maximum) ultrapeers and at least 100 leaf nodes. The + actual number should depend on the available bandwidth. If you have set + "Prefer compressed connections," bandwidth used will be much lower. You + should never use up all your bandwidth with gnet connections. Especially + on an asymmetric cable/DSL connection you can easily starve your incoming + traffic by producing too much outgoing traffic (TCP/IP issue). Use at most + half of your outgoing bandwidth for gnet connections.</p> + <p>Since the adoption of "high outdegree" in version 0.95 you should have + 32/50 connections to other ultrapeers. The number of leaf connections to + use depends on your bandwidth and the speed of your cpu. As an absolute + minimum an ultrapeer should connect to 20 leaf nodes and it's much better + to connect to 100 or more. Watch the bandwidth odometers on the lower left + of the gui and use the top command to keep track of cpu usage. Increase + the number of leaf connections until you reach the maximum amount of + bandwidth and system resources you wish to devote to this purpose.</p> + <p>The bandwidth control settings will help you further fine-tune + gtk-gnutella's bandwidth usage.</p> + + <h3><a name="gnet1">Do I need to forward a port on my firewall?</a></h3> + <p>You don't need to forward any ports for gtk-gnutella to work, but it + will perform much better if you do. If gtk-gnutella thinks you are + firewalled, it will not show any <a href="#down_push">"push"</a> results + since you wouldn't be able to download those anyway.<br>Even when people cannot connect directly to you, they can still download + files from your node using a <a href="#down_push">push request</a>.<br>You can configure the port gtk-gnutella listens on. The setting <em>Listen + port</em> is located in the <em>File->Preferences->Network</em>.</p> + + <h3><a name="gnet-forward-howto">How do I configure port forwarding?</a></h3> + <p>You can find instructions for most popular routers at <a href="http://www.portforward.com/routers.htm">http://www.portforward.com/routers.htm</a>. + Try <a href="http://www.canyouseeme.org/">http://www.canyouseeme.org/</a> + to check your port forwarding.</p> + + <h3><a name="gnet-udp">Does gtk-gnutella use UDP?</a></h3> + <p>Yes, starting with version 0.95 gtk-gnutella can also use <a href="http://www.faqs.org/rfcs/rfc768.html">UDP</a> + in addition to <a href="http://www.faqs.org/rfcs/rfc793.html">TCP</a>.</p> + + <h3><a name="gnet2">What does "FC" mean?</a></h3> + <p>The <em>FC</em> means "flow control".<br>In general, you should make sure that servents to which you are connected + do not flow control. Watch for the trailing <em>FC</em> indication at + the end of the <em>Info</em> string (you may need to drag the right edge + past the window to trigger the underlying scroll bar), or look at the FC + state in the <a href="#gnet4">Flags</a> column. As a rule of thumb, if + you have more than one node flow-controlling at a given time, you don't + have enough outgoing bandwidth dedicated to gnet, and therefore you are + harming the network: either decrease the amount of connections, enable the + <em>Prefer compressed connections</em> option or raise the outgoing + bandwidth limit.</p> + + <h3><a name="gnet3">Why do I lose gnet connections when I have an upload?</a></h3> + <p>Try to do bandwidth limiting. If that doesn't help, maybe your provider + throttles gnutella traffic. Try changing your gnutella port in the network + settings of gtk-gnutella.</p> + + <h3><a name="gnet4">What does the stuff in the Flags column mean?</a></h3> + <p>You can see the type and some of the settings of a connection here. Note + push-proxies are implemented in 0.92.1c and later.</p> + <pre>012345678AB (offset) + NIrwqxZPFhE + ||||||||||+ indicates a TLS <strong>E</strong>ncrypted connection |||||||||+- hops flow triggered (<strong>h</strong>), or total query flow control (<strong>f</strong>) ||||||||+-- flow control (<strong>F</strong>), or pending data in queue (<strong>d</strong>) |||||||+--- we are push-proxy for node (<strong>P</strong>) or node is our push-proxy (<strong>p</strong>) @@ -316,267 +247,210 @@ |||+------- indicates whether node is <strong>w</strong>ritable ||+-------- indicates whether node is <strong>r</strong>eadable |+--------- connection type: (<strong>I</strong>ncoming, <strong>O</strong>utgoing, <strong>P</strong>onging) - +---------- peer mode: <strong>U</strong>ltra, <strong>L</strong>eaf, or Legacy (a.k.a. <strong>N</strong>ormal) -</pre> - -<h3><a name="gnet-user-agent">What's the meaning of a leading "!" in the User-Agent name?</a></h3> -<p> - This indicates that the User-Agent name is <em>possibly</em> faked but - it could be a false-positive caused by a bad clock on either side. -</p> - -<h3><a name="gnet5">What does "Harmful version banned, upgrade required" mean?</a></h3> -<p> - Sometimes, servents are discovered to have a bug or behaviour that is harmful - to the gnet. For example, gtk-gnutella-0.92b had a bug that generated excessive - queries which hammered on the <a href="?page=gwebcache">GWebCache system</a>. - Such banning is exceptional, usually restricted to specific versions, and the - servent's author is informed about the banning. -</p> - -<h3><a name="gnet6">What does "Outdated version, please upgrade" mean?</a></h3> -<p> - Versions of gtk-gnutella more than one year old are banned, since they - lack features that are important to the rapidly evolving gnet's health and - scalability. In addition, unstable versions are banned after 90 days. -</p> - -<h3><a name="gnet7">Why doesn't my HTTP proxy work?</a></h3> -<p> - Your HTTP proxy must support the method <code>CONNECT</code> because a normal <code>GET</code> - doesn't work with Gnutella connections. This is an extension to the HTTP - protocol and mainly supported by SQUID proxies. It's also often deactivated - because it might be considered a security problem by your provider. At the - moment, the proxy support - also for SOCKS - isn't very good. The developers - don't use proxies but if you think you can fix it, we would appreciate - your patches. -</p> - -<h3><a name="gnet8">How can I increase the timeouts?</a></h3> -<p> - If your internet connection suffers from high latency it might help to - increase the timeouts. Go to <em>Settings->Preferences->User Interface</em> - and tick <em>Expert mode</em>. - Now, you'll find a lot more settings to change when you go to - <em>Settings->Preferences->GnutellaNet</em>. -</p> - -<h3><a name="gnet-auto">How does auto mode decide between ultra and leaf?</a></h3> -<p> - In order to be promoted to <a href="#general-ultrapeer">ultra mode</a> the - following conditions must be met: -</p> -<ol> - <li> - There must be more than 8192 bytes/s outgoing bandwidth available. - </li> - <li> - If bandwidth schedulers are enabled, leaf nodes must not be configured to - steal all the HTTP outgoing bandwidth. - </li> - <li> - If Gnet out scheduler is enabled, there must be at least 256 bytes/s per - gnet connection (ultrapeer or normal aka legacy). - </li> - <li> - Overall, there must be 32 bytes/s per configured leaf plus 256 bytes/s per - gnet connection available. - </li> -</ol> - + +---------- peer mode: G2 <strong>H</strong>ub, <strong>U</strong>ltra, <strong>L</strong>eaf, or Legacy (a.k.a. <strong>N</strong>ormal)</pre> + + <h3><a name="gnet-user-agent">What's the meaning of a leading "!" in the + User-Agent name?</a></h3> + <p>This indicates that the User-Agent name is <em>possibly</em> faked but + it could be a false-positive caused by a bad clock on either side.</p> + + <h3><a name="gnet5">What does "Harmful version banned, upgrade required" + mean?</a></h3> + <p>Sometimes, servents are discovered to have a bug or behaviour that is + harmful to the gnet. For example, gtk-gnutella-0.92b had a bug that + generated excessive queries which hammered on the GWebCache system. Such + banning is exceptional, usually restricted to specific versions, and the + servent's author is informed about the banning.</p> + + <h3><a name="gnet6">What does "Outdated version, please upgrade" mean?</a></h3> + <p>It is important to upgrade versions of gtk-gnutella which are older than + one year since they lack features that are important to the rapidly + evolving gnet's health and scalability.</p> + + <h3><a name="gnet7">Why doesn't my HTTP proxy work?</a></h3> + <p>Your HTTP proxy must support the method <code>CONNECT</code> because a + normal <code>GET</code> doesn't work with Gnutella connections. This is + an extension to the HTTP protocol and mainly supported by SQUID proxies. + It's also often deactivated because it might be considered a security + problem by your provider. At the moment, the proxy support - also for + SOCKS - isn't very good. The developers don't use proxies but if you think + you can fix it, we would appreciate your patches.</p> + + <h3><a name="gnet8">How can I increase the timeouts?</a></h3> + <p>If your internet connection suffers from high latency it might help to + increase the timeouts. Go to <em>File->Preferences->User Interface</em> + and tick <em>Expert mode</em>. Now, you'll find a lot more settings to + change when you go to <em>File->Preferences->Gnutella</em>.</p> + + <h3><a name="gnet-auto">How does auto mode decide between ultra and leaf?</a></h3> + <p>In order to be promoted to <a href="#general-ultrapeer">ultra mode</a> + the following conditions must be met:</p> + <ol> + <li>There must be more than 8192 bytes/s outgoing bandwidth available.</li> + <li>If bandwidth schedulers are enabled, leaf nodes must not be + configured to steal all the HTTP outgoing bandwidth.</li> + <li>If Gnet out scheduler is enabled, there must be at least 256 bytes/s + per gnet connection (ultrapeer or normal aka legacy).</li> + <li>Overall, there must be 32 bytes/s per configured leaf plus 256 + bytes/s per gnet connection available.</li> + </ol> + + <h2>Searches</h2> -<h3><a name="search0">How can I get more results?</a></h3> -<p> - The number of results you get depends heavily on whether people are able to - connect to you (see <a href="#gnet1">port forwarding</a>) - and on the <a href="#gnet0">number of connections</a> to other hosts. -</p> - -<h3><a name="search3">How can I ignore files with no SHA1?</a></h3> -<p> - Click with right mouse button on a search result without a SHA1 and - select "Drop results...->with the same urn:sha1" from the popup menu. - That will drop all results with this SHA1 - in this case none - from your - results. You'll miss a lot of spam. -</p> - -<h3><a name="search-entry">Where did the search entry box go?</a></h3> -<p> - Searches are now entered in the <q><em>Search:</em></q> box in the sidebar. -</p> - -<h3><a name="search-passive">What are "Passive" searches?</a></h3> -<p> - A <q><em>passive</em></q> search will return all the search results that - pass through gtk-gnutella. By - <a href="?page=filtering_howto">filtering</a> these results, - passive searches can be useful. -</p> -<p> - If you are in <a href="#general-ultrapeer">ultra</a> mode, many search - results are already passing through your node besides the ones for your own - searches. You can take advantage of this to make searches without generating - any extra gnet traffic. For example, on my ultrapeer with 200 - <a href="#general-ultrapeer">leaf nodes</a>, I opened a passive search and - filtered the results to display only hits with the name - <q><em>eminem</em></q>. Within an hour or so I had about 1500 results. - Obviously, the more popular the search, and the more patient you are, the - more useful this technique is. -</p> -<p> - If you are in leaf mode, then the only search results that will pass through - gtk-gnutella will be those from your own searches, so the above technique - won't be useful. But there is another way to use passive searches that is - only useful in leaf mode. For example, if you start a passive search and - filter it to display only mp3 files, then all mp3 files from all your open - searches will be conveniently aggregated in one search window. By opening - more passive searches with different filters, you can display different - file types in each. -</p> - -<h2>Downloads</h2> - -<h3><a name="down0">What does the status "Ignoring requested SHA1|name & size" mean?</a></h3> -<p> - This means that gtk-gnutella has that file recorded as complete in its - database. This database is usually located in - <code>~/.gtk-gnutella/done.sha1</code> and <code>~/.gtk-gnutella/done.namesize</code>. - At the moment, there is no way to remove or modify - an entry of that database from the gui, but you can edit the file with any - text editor while gtk-gnutella is not running. If you add or remove something - from one of the files, do the same to the other. -</p> - -<h3><a name="down1">What does the status "No URN on server" mean?</a></h3> -<p> - This means that gtk-gnutella wants to download a new file from a host, but - that host does not provide a SHA1 hash for the file. Since the file is new - (not yet partially downloaded), gtk-gnutella cannot do an overlap check to - verify that the file on the host is really the file you want. In such a case - it relies on the SHA1 provided by the remote host, but if no SHA1 is - supplied, then gtk-gnutella has no way of assuring that the file it wants to - download and the file on the remote server are really the same.<br> - If you get annoyed by those messages you can activate the <em>Optimistic - first chunk</em> option in the <em>Settings->Preferences->Download</em>. -</p> - -<h3><a name="down2">Why is the same file downloaded X times?</a></h3> -<p> - Check the <em>Range</em> column. This is called - <a href="#down3">swarming</a>. gtk-gnutella tries to get the file in - <a href="#down4">chunks</a> and will get it from multiple hosts in parallel, - if possible. -</p> - -<h3><a name="down3">What is "swarming"?</a></h3> -<p> - Swarming describes the ability to download a single file from multiple hosts - in parallel. gtk-gnutella will automatically try to find additional sources - for any queued file using the <a href="#down5">download mesh</a> and by - monitoring routed results. -</p> - -<h3><a name="down4">What is a "chunk"?</a></h3> -<p> - A <em>chunk</em> is another word for <em>part of a file</em>. When gtk-gnutella runs in - <a href="#down3">swarming mode</a> it will retrieve multiple chunks of a - downloading file until it has downloaded the complete file. The - <em>Range</em> column shows you which chunk you are currently - downloading. -</p> - -<h3><a name="down5">What is the "download mesh"?</a></h3> -<p> - When you download a file from a host that supports the download mesh, - it will tell you about additional sources for the requested file - (provided it knows of any). Those will then be used for - <a href="#down3">swarming</a> -</p> - -<h3><a name="down_push">What is a "push request"?</a></h3> -<p> - The <em>push request</em> is a facility to download files from hosts you cannot - connect to directly (because they are firewalled). Well, you cannot - connect to those hosts, but they probably can connect to you. To - tell a remote host to connect to your host so that you can download - a file from the remote host you send a push request to it.<br> - If you download a file using a push request and you loose contact to - the host which originally returned the result for that file to you, - then the <em>push route</em> is lost and you can no longer download this - file. - Therefore push routes are quite fragile. - You can't make use of push requests when you are behind a firewall - (see <a href="#gnet1">port forwarding</a>). -</p> - -<h3><a name="down7">Why does gtk-gnutella append a .OK to my file names?</a></h3> -<p> - You probably haven't set up different directories for downloaded files, - temporary files and bad files. -</p> - -<h3><a name="down8">I got a file that just won't download!</a></h3> -<p> - If you don't see a smiling yellow icon with sunglasses in the statusbar, you - should try to change that. See the section about - <a href="#gnet1">firewalls</a>. -</p> -<p> - Otherwise if gtk-gnutella says it has only a few sources for the file - (best seen in the fileinfo subtab in the downloads pane) then this can have - two reasons: -</p> -<ul> - <li>the file is a rare one</li> - <li> - You selected a version of the file that is unique. Chances are that there - may be a more common version. A file can become unique e.g. when somebody - changes the mp3info on an mp3 file or otherwise does some custom - modification to the file. - </li> -</ul> -<p> - You can try to search for the file again and see if you find another version - which is more common. It's usually a good indication if the "#" shows a - number for a file. The larger the number, the better are the chances that - you can get it quickly. -</p> - -<h3><a name="down9">In the downloads pane, what does it mean if the color of - the text is grey instead of black?</a></h3> -<p> - It means that the file is received over a <a href="#down_push">push route</a>. -</p> - -<h2>Uploads</h2> - -<h3><a name="up0">What does "Normalized" mean?</a></h3> -<p> - This shows the total amount of bytes uploaded for the file divided by the - file size. -</p> - -<h2>GTK+ 2.x</h2> - -<h3><a name="gtk2_slow">Gtk2 is way sloooow.</a></h3> -<p> - Set the environment variable <code>GDK_USE_XFT</code> to 0 and see whether - this helps. This turns off anti aliasing in Gtk2 which can use a lot of cpu. - The Gtk2 frontend is much slower than the Gtk1 frontend. So on a slow machine, - you should consider using the Gtk1 frontend. -</p> - - -<h3><a name="gtk2_ctype">Non-ASCII characters show up as _ (underscore).</a></h3> -<p> - Set the environment variable <code>LC_CTYPE</code> or <code>LC_ALL</code> to - an appropriate value for the encoding you use. For example, if you use - special German characters in your filenames, set it to - <code>de_DE.ISO8859-1</code>. The valid values depend on your operating - system; see the manpage setlocale(3) for details. Ideally, everyone would - use UTF-8 encoding which covers nearly all languages. -</p> - -<!-- end faq --> -<!-- vi: set et ts=2 sw=2: --> + <h3><a name="search0">How can I get more results?</a></h3> + <p>The number of results you get depends heavily on whether people are able + to connect to you (see <a href="#gnet1">port forwarding</a>) and on the + <a href="#gnet0">number of connections</a> to other hosts.</p> + + <h3><a name="search3">How can I ignore files with no SHA1?</a></h3> + <p>Click with right mouse button on a search result without a SHA1 and + select "Drop results...->with the same urn:sha1" from the popup menu. + That will drop all results with this SHA1 - in this case none - from your + results. You'll miss a lot of spam.</p> + + <h3><a name="search-entry">Where did the search entry box go?</a></h3> + <p>Searches are now entered in the <q><em>Search:</em></q> box in the + sidebar.</p> + + <h3><a name="search-passive">What are "Passive" searches?</a></h3> + <p>A <q><em>passive</em></q> search will return all the search results + that pass through gtk-gnutella. By filtering these results, passive + searches can be useful.</p> + + <p>If you are in <a href="#general-ultrapeer">ultra</a> mode, many search + results are already passing through your node besides the ones for your + own searches. You can take advantage of this to make searches without + generating any extra gnet traffic. For example, on my ultrapeer with 200 + <a href="#general-ultrapeer">leaf nodes</a>, I opened a passive search and + filtered the results to display only hits with the name <q><em>linux</em></q>. + Within an hour or so I had about 1500 results. Obviously, the more popular + the search, and the more patient you are, the more useful this technique + is.</p> + <p>If you are in leaf mode, then the only search results that will pass + through gtk-gnutella will be those from your own searches, so the above + technique won't be useful. But there is another way to use passive + searches that is only useful in leaf mode. For example, if you start a + passive search and filter it to display only mp3 files, then all mp3 files + from all your open searches will be conveniently aggregated in one search + window. By opening more passive searches with different filters, you can + display different file types in each.</p> + + <h3><a name="search-local">How can I copy the magnet link of a file I'm + sharing?</a></h3> + <p>Do a search with the <code>local:.</code> keyword. The "." is a regular + expression, which here matches any file -- this will give an exhaustive + listing of your library. Then select an entry, right click and copy the + magnet to the clipboard.</p> + + <h3>Downloads</h3> + <h3><a name="down0">What does the status "Ignoring requested SHA1|name + & size" mean?</a></h3> + <p>This means that gtk-gnutella has that file recorded as complete in its + database. This database is usually located in <code>~/.gtk-gnutella/done.sha1</code> + and <code>~/.gtk-gnutella/done.namesize</code>. At the moment, there is + no way to remove or modify an entry of that database from the gui, but you + can edit the file with any text editor while gtk-gnutella is not running. + If you add or remove something from one of the files, do the same to the + other.</p> + + <h3><a name="down1">What does the status "No URN on server" mean?</a></h3> + <p>This means that gtk-gnutella wants to download a new file from a host, + but that host does not provide a SHA1 hash for the file. Since the file is + new (not yet partially downloaded), gtk-gnutella cannot do an overlap + check to verify that the file on the host is really the file you want. In + such a case it relies on the SHA1 provided by the remote host, but if no + SHA1 is supplied, then gtk-gnutella has no way of assuring that the file + it wants to download and the file on the remote server are really the + same.<br>If you get annoyed by those messages you can activate the <em>Optimistic + first chunk</em> option in <em>File->Preferences->Downloads</em> + (first you'll need to go to <em>Settings->Preferences->User + Interface</em> and tick <em>Expert mode</em>).</p> + + <h3><a name="down2">Why is the same file downloaded X times?</a></h3> + <p>Check the <em>Range</em> column. This is called <a href="#down3">swarming</a>. + gtk-gnutella tries to get the file in <a href="#down4">chunks</a> and + will get it from multiple hosts in parallel, if possible.</p> + + <h3><a name="down3">What is "swarming"?</a></h3> + <p>Swarming describes the ability to download a single file from multiple + hosts in parallel. gtk-gnutella will automatically try to find additional + sources for any queued file using the <a href="#down5">download mesh</a> + and by monitoring routed results.</p> + + <h3><a name="down4">What is a "chunk"?</a></h3> + <p>A <em>chunk</em> is another word for <em>part of a file</em>. When + gtk-gnutella runs in <a href="#down3">swarming mode</a> it will retrieve + multiple chunks of a downloading file until it has downloaded the complete + file. The <em>Range</em> column shows you which chunk you are currently + downloading.</p> + + <h3><a name="down5">What is the "download mesh"?</a></h3> + <p>When you download a file from a host that supports the download mesh, it + will tell you about additional sources for the requested file (provided it + knows of any). Those will then be used for <a href="#down3">swarming</a>.</p> + + <h3><a name="down_push">What is a "push request"?</a></h3> + <p>The <em>push request</em> is a facility to download files from hosts + you cannot connect to directly (because they are firewalled). Well, you + cannot connect to those hosts, but they probably can connect to you. To + tell a remote host to connect to your host so that you can download a file + from the remote host you send a push request to it.<br>If you download a file using a push request and you loose contact to the + host which originally returned the result for that file to you, then the <em>push + route</em> is lost and you can no longer download this file. Therefore + push routes are quite fragile. You can't make use of push requests when + you are behind a firewall (see <a href="#gnet1">port forwarding</a>).</p> + + <h3><a name="down7">Why does gtk-gnutella append a .OK to my file names?</a></h3> + <p>You probably haven't set up different directories for downloaded files, + temporary files and bad files.</p> + + <h3><a name="down8">I got a file that just won't download!</a></h3> + <p>If you don't see a smiling yellow icon with sunglasses in the statusbar, + you should try to change that. See the section about <a href="#gnet1">firewalls</a>.</p> + <p>Otherwise if gtk-gnutella says it has only a few sources for the file + (best seen in the fileinfo subtab in the downloads pane) then this can + have two reasons:</p> + <ul> + <li>the file is a rare one</li> + <li>You selected a version of the file that is unique. Chances are that + there may be a more common version. A file can become unique e.g. when + somebody changes the mp3info on an mp3 file or otherwise does some + custom modification to the file.</li> + </ul> +<p>You can try to search for the file again and see if you find another + version which is more common. It's usually a good indication if the "#" + shows a number for a file. The larger the number, the better are the + chances that you can get it quickly.</p> + + <h3><a name="down9">In the downloads pane, what does it mean if the color of + the text is grey instead of black?</a></h3> + <p>It means that the file is received over a <a href="#down_push">push + route</a>.</p> + + + <h2>Uploads</h2> + + <h3><a name="up0">What does "Normalized" mean?</a></h3> + <p>This shows the total amount of bytes uploaded for the file divided by + the file size.</p> + + + <h2>GTK+ 2.x</h2> + <h3><a name="gtk2_slow">Gtk2 is way sloooow.</a></h3> + <p>Set the environment variable <code>GDK_USE_XFT</code> to 0 and see + whether this helps. This turns off anti aliasing in Gtk2 which can use a + lot of cpu. The Gtk2 frontend is much slower than the Gtk1 frontend. So on + a slow machine, you should consider using the Gtk1 frontend.</p> + + <h3><a name="gtk2_ctype">Non-ASCII characters show up as _ (underscore).</a></h3> + <p>Set the environment variable <code>LC_CTYPE</code> or <code>LC_ALL</code> + to an appropriate value for the encoding you use. For example, if you use + special German characters in your filenames, set it to <code>de_DE.ISO8859-1</code>. + The valid values depend on your operating system, see the manpage + setlocale(3) for details. Ideally, everyone would use UTF-8 encoding which + covers nearly all languages.</p> + <!-- end faq --> + <!-- vi: set et ts=2 sw=2: --> + </body> +</html>
View file
gtk-gnutella-0.98.2.tar.bz2/extra_files/en/Jmakefile -> gtk-gnutella-1.1.9.tar.bz2/extra_files/en/Jmakefile
Changed
@@ -32,4 +32,5 @@ FAQDIR = $(PRIVLIB)/en InstallNonExec(FAQ, $(FAQDIR)) +InstallNonExec(glossary, $(FAQDIR))
View file
gtk-gnutella-0.98.2.tar.bz2/extra_files/en/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/extra_files/en/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-30 -: $X-Id: Jmake.tmpl 30 2009-10-28 07:45:28Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-200 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -50,18 +50,18 @@ $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 18 2006-12-27 10:35:09Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Start of Jmakefile -# $X-Id: Jmakefile 10280 2005-11-22 19:07:19Z rmanfredi $ +# $X-Id$ all:: FAQDIR = $(PRIVLIB)/en -local_install:: FAQ +local_install local_install-strip:: FAQ @case '${MFLAGS}' in *i*) set +e;; esac; \ (set -x; test -d $(INSTALL_PREFIX)$(FAQDIR) || \ $(INSTALLDIR) $(INSTALL_PREFIX)$(FAQDIR)); \ @@ -70,6 +70,15 @@ local_deinstall:: $(RM) $(INSTALL_PREFIX)$(FAQDIR)/FAQ +local_install local_install-strip:: glossary + @case '${MFLAGS}' in *i*) set +e;; esac; \ + (set -x; test -d $(INSTALL_PREFIX)$(FAQDIR) || \ + $(INSTALLDIR) $(INSTALL_PREFIX)$(FAQDIR)); \ + $(INSTALL) -c -m 444 glossary $(INSTALL_PREFIX)$(FAQDIR) + +local_deinstall:: + $(RM) $(INSTALL_PREFIX)$(FAQDIR)/glossary + ######################################################################## # Common rules for all Makefiles -- do not edit @@ -89,6 +98,11 @@ $(RM) Makefile config.sh install:: local_install + @exit 0 + +install-strip:: local_install-strip + @exit 0 + install.man:: maybe_install.man deinstall:: local_deinstall deinstall.man:: maybe_deinstall.man @@ -119,12 +133,17 @@ local_clobber:: $(RM) tags +depend:: + ######################################################################## # Empty rules for directories with no sub-directories -- do not edit local_install:: @echo "install in $(CURRENT) done." +local_install-strip:: + @echo "install (strip) in $(CURRENT) done." + local_deinstall:: @echo "deinstall in $(CURRENT) done."
View file
gtk-gnutella-1.1.9.tar.bz2/extra_files/en/glossary
Added
@@ -0,0 +1,345 @@ +<html> +<head> +<meta content="text/html; charset=windows-1252" http-equiv="content-type"> +<title>gtk-gnutella Glossary</title> +</head> +<body> + +<h1>Glossary</h1> + +<h2>B</h2> + +<h3>Bandwidth <em>hint</em> for GUESS querying</h3> + +<p> + This is termes <em>bandwidth hint</em> because GUESS uses UDP and cannot fraction large messages to emit just a few bytes. Therefore, the bandwidth is just a hint because it can be exceeded if a set of queries need to be made and their total amount exceeds the allocated bandwidth. Lower values means we can send less queries, and therefore the overall querying is slowed down (meaning the total querying will take longer) because each query is sent to <em>one</em> GUESS ultrapeer. +</p> + + +<h3>Bootstrap</h3> + +<p> + The process of joining the Gnutella network by discovering peers is called bootstrapping. More informations <a href="?page=bootstrap">here</a>. +</p> + + +<h3>Bucket (of a routing table)</h3> + +<p> + A <em>bucket</em> is a portion of the node ID space covered by the routing table. Each bucket can only hold K nodes, currently eight, before becoming "full". When a bucket is full of known good nodes, no more nodes may be added unless our own node ID falls within the range of the bucket. In that case, the bucket is replaced by two new buckets each with half the range of the old bucket and the nodes from the old bucket are distributed among the two new ones. This is called "bucket SPLIT". The opposite operation involving buckets is called MERGE.<br /> Every node maintains a routing table of known good nodes. The nodes in the routing table are used as starting points for queries in the DHT. Nodes from the routing table are returned in response to queries from other nodes. It is important that each node's routing table must contain only known good nodes. A good node is a node has responded to one of our queries within the last 15 minutes. A node is also good if it has ever responded to one of our queries and has sent us a query within the last 15 minutes. After 15 minutes of inactivity, a node becomes questionable. Nodes become bad when they fail to respond to multiple queries in a row. Nodes that we know are good are given priority over nodes with unknown status.<br /> + + The above informations have been readapted from <a href="http://www.bittorrent.org/beps/bep_0005.html" target="_blank">BitTorrent DHT protocol</a> where more details can be found. +</p> + + +<h3>Bye</h3> + +<p> + This is an optional message used to inform the remote host that the connection is being closed + and the reason for doing so. +</p> + + +<h2>D</h2> + +<h3>Descriptor</h3> + +<p> + The entity in which information is transmitted over the network. Same as <em>message</em>. +</p> + +<h3>DHT</h3> + +<p> + Distributed Hash Table (DHT) is a <em>hash table</em> distributed among Gnutella network nodes. Gtk-Gnutella uses an implementation of Kademlia for its DHT. Kademlia is also used for other p2p networks (such as eDonkey) but storing different keys and values, therere preventing inter-operability between DHT of different p2p networks. In Gnutella, DHT is used for exact lookups, alternate locations, push-proxies, etc. but not for keywords search. Operations such as <em>lookup, publish, store, etc.</em> are typically performed in a DHT whose nodes can be either active or passive. +</p> + + +<h2>E</h2> + +<h3>EAR</h3> + +<p> + <em>EAR</em> stands for "Extra Acknowledgement Request". +</p> + + +<h2>F</h2> + +<h3>Flooding</h3> + +<p> + <em>Flooding</em> is a simple but inefficient P2P routing algorithm which sends messages to all the connected nodes in order + to reach destination. The flooding algorithm have been replaced by the more efficient <em>GUESS</em> algorithm. +</p> + + +<h2>G</h2> + +<h3>G2 Hub</h3> + +<p> + G2 Hubs in Gnutella2 network are equivalent to Ultrapeers in GnutellaNet. + GTK-Gnutella usually connects to 2 G2 Hubs behaving as a leaf node on Gnutella2 network. +</p> + +<h3>GGEP</h3> + +<p> + Gnutella Generic Extension Protocol (GGEP) includes new functions added to the original Gnutella 0.4 protocol: more informations <a href="http://rfc-gnutella.sourceforge.net/src/GnutellaGenericExtensionProtocol.0.51.html" target="_blank">here</a>. +</p> + + +<h3>GIV</h3> + +<p> + <em>GIV</em> is the message sent by the servent that is going to send a file in response to a request. +</p> + +<h3>GnutellaNet</h3> + +<p> + The GnutellaNet (or "Gnutella" in short) is an <em>overlay</em> network. This means it is a network that sits on top of the normal internet. + GnutellaNet is <em>unstructured</em>. This just means that no particular computer or group of computers controls + GnutellaNet; it is probably more democratic than most governments. +</p> +<p> + As the GnutellaNet is an overlay network, it doesn't have to pay + attention to geography. It is likely that you will connect to + computers in other countries. Things might be faster if this was not + the case. However, they may also be more resilient in the current form. +</p> + +<h3>GUESS (Gnutella UDP Extension for Scalable Searches)</h3> + +<p> + As opposed to <em>flooding</em> algorithm, with GUESS routing nodes are queried one at a time. Each node must keep a + cache of known and trusted peers able to accept queries and the nodes are picked up randomly. This routing method is + considered more efficient and safe compared to flooding. +</p> + +<h3>GUID (Global Unique IDentifier)</h3> + +<p> + This is a 16-byte long value made of random bytes, whose purpose it is to identify servents and messages. This identification is not a signature, just a way to identify network entities in a unique manner. +</p> + + +<h2>H</h2> + +<h3>HSEP</h3> + +<p> + The Horizon Size Estimation Protocol (HSEP) refers to the estimation of the number of reachable resources within the Gnutella network, e.g. the number of reachable Gnutella nodes, shared files and shared kibibytes. More informations <a href="http://www.schuerger.com/gnutella/hsep.html" target="_blank">here</a>. +</p> + + +<h2>L</h2> + +<h3>Leaf node</h3> + +<p> + A leaf is the basic connection to the GnutellaNet. A leaf typically connects to three or four ultrapeers. + The ultrapeers route searches and keep their leaves connected to the GnutellaNet. +</p> + + +<h2>M</h2> + +<h3>Message</h3> + +<p> + <em>Messages</em> are the entity in which information is transmitted over the network. Synonyms are <em>packet</em> and + <em>descriptor</em>. +</p> + +<h3>MUID (Messages Unique IDentifier)</h3> + +<p> + A <em>GUID</em> for network messages. +</p> + + +<h2>P</h2> + +<h3>PARQ (Passive/Active Remote Queuing)</h3> +<p> + When a servent asks for a file hosted by a servent having no free upload slots, the request enters a remote queue on the + hosting sevent. This remote queue is handled by <em>PARQ</em>. +</p> + +<h3>Ping</h3> + +<p> + A <em>Ping</em> is a message sent by a servent trying to actively discover hosts on the network. + A servent receiving a Ping message is expected to respond with one or more Pong messages. +</p> + +<h3>Pong</h3> + +<p> + A <em>Pong</em> is the response message to a Ping. It includes the address of a connected Gnutella servent, the listening port of + that servent, and information regarding the amount of data it is making available to the network. +</p> + +<h3>Push</h3> + +<p> + This is a mechanism that allows a firewalled servent to contribute file-based data to the network. For example a servent may send + a Push message if it receives a QueryHit message from a servent that doesn't support incoming connections. This might occur when + the servent sending the QueryHit message is behind a firewall. +</p> + +<h3>Push-proxy</h3> + +<p> + A <em>push-proxy</em> is a relaying node. If an ultrapeer is connected to the firewalled leaf, in order to send a <em>push</em> + to that firewalled leaf, a servent can send an UDP message to the ultrapper who will then relay it to the leaf. So the ultrapeer + acts as the push-proxy: it is the relaying target to reach the leaf. +</p> + + +<h2>Q</h2> + +<h3>Query</h3> + +<p> + Sending a <em>Query</em> is the primary mechanism for searching the distributed network. + A servent receiving a Query message will respond with a QueryHit if a match is found against its local data set. +</p> + +<h3>QueryHit</h3> + +<p> + A <em>QueryHit</em> is the response to a Query. This message provides the recipient with enough information to acquire the data + matching the corresponding Query. +</p> + + +<h2>R</h2> + +<h3>RUDP</h3> + +<p> + The Reliable UDP (RUDP) protocol provides NAT-to-NAT transfers, sometimes called Firewall-to-Firewall or "hole-punching", in those cases where port-forwarding is not or cannot be done by the user. +</p> + + +<h3>RX</h3> + +<p> + RX stands for <em>Reception</em>, opposite of <em>Transmission</em>. +</p> + + +<h2>S</h2> + +<h3>search literals</h3> + +<p> + Double and single quotes can be used so that an entire search term + will be matched instead of individual words. Quoting maybe necessary + if you wish to search for a phrase with special characters such as the + plus and minus signs (see "search requireds"). +</p> + +<h3>search prefixes</h3> + +<ol> +<li> + browse: List shared files on the specified host. The format is "browse:<em>ip_address:port</em>". + Many portions of the GUI have a menu option, available from a right + click, that will browser the specified computer. +</li> +<li> + http: Download the specified web page. This could be a zip file, a movie, large JPEG, etc. +</li> +<li> + local: Search results from the local host. Ie, your computer. A + regular expression may follow to filter the results. For + example, "local:manual" will show all files you share with + manual in the file name. +</li> +<li> + magnet: Search and download the magnet target. +</li> +<li> + push: The format of this search is "push:<em>guid:ip_address:port/path_to_file</em>". + The <em>guid</em> is the Gnutella ID of the computer that has the file of interest. + The <em>ip:port</em> is the push proxy that the <em>guid</em> is connected to. + Typically this would be an ultrapeer that will allow a proxy download. + The <em>guid</em> is a 32 hexadecimal characters. +</li> +<li> + sha1: A base64 SHA value to search for. It is not automatically downloaded. +</li> +<li> + urn: Similar to a sha1 search, but the hash value is specified. Ie, urn:sha1:<em>hash value</em> +</li> +</ol> + +<h3>search requireds</h3> + +<p> + Mini filters are created with the '+' and '-' signs. The plus sign + requires that a word is part of the results. The minus sign doesn't + display any results with the given phrase. The plus and minus signs + can be used to select ambigious terms. +</p> +<p> + Suppose you wish to find information about apples. You might use a search like <em>apples -computers</em>. + You may get even more relevant results by using <em>apples +fruit</em>. +</p> + +<h3>Servent</h3> + +<p> + "Servent" word derives from the fusion of server+client. A node in a P2P network is called <em>servent</em> because of the dual nature of both server and client. +</p> + + +<h3>SOAP</h3> + +<p> + Simple Object Access Protocol (SOAP) is a lightweight XML-based protocol for exchange of information in a decentralized, distributed environment like P2P networks. More informations <a href="https://www.w3.org/TR/2000/NOTE-SOAP-20000508/" target="_blank">here</a>. +</p> + + +<h2>T</h2> + +<h3>THEX</h3> + +<p> + The Tree Hash EXchange (THEX) format is used for exchanging Merkle Hash Trees built up from the subrange hashes of discrete digital files. More informations <a href="http://adc.sourceforge.net/draft-jchapweske-thex-02.html" target="_blank">here</a>. +</p> + + +<h3>Time-To-Live (TTL)</h3> + +<p> + TTL is the number of times a message will be forwarded by Gnutella servents before it is removed from the network. + Each servent will decrement the TTL value before passing it on to another servent. + When the TTL value reaches 0, the message will no longer be forwarded to avoid eccessive network traffic. +</p> + + +<h3>TX</h3> + +<p> + TX stands for <em>Transmission</em>. +</p> + + +<h2>U</h2> + +<h3>Ultrapeer (UP)</h3> + +<p> + An ultrapeer is well connected to the GnutellaNet. + As ultrapeers must have many connections and route search queries, + they require more resources than a leaf node. Ultrapeers will + typically be connected to 30+ other ultrapeers and connected to 70+ leaf nodes. +</p> + +</body> +</html>
View file
gtk-gnutella-1.1.9.tar.bz2/extra_files/fr
Added
+(directory)
View file
gtk-gnutella-1.1.9.tar.bz2/extra_files/fr/FAQ
Added
@@ -0,0 +1,443 @@ +<html> +<head> +<meta content="text/html; charset=windows-1252" http-equiv="content-type"> +<title>FAQ de gtk-gnutella</title> +</head> +<body> + <h1>FAQ</h1> + <!-- + ** ** TOC ** --> + <h2>Généralités</h2> + <ul> +<li><a href="#general0">Qu'est-ce que Gnutella ?</a></li> + <li><a href="#general-G2">Et quid du réseau G2 ?</a></li> + <li><a href="#general-gtkg">Qu'est-ce que GTKG ?</a></li> + <li><a href="#general1">Cette application utilise trop de bande passante !</a></li> + <li><a href="#general-ultrapeer">Que sont les Ultrapeers et les noeuds feuilles ?</a></li> + <li><a href="#general-firewall">Pourquoi gtk-gnutella dit-il qu'il est + bloqué par un pare-feu alors qu'il ne l'est pas ?</a></li> + </ul> +<h2>Compiler depuis le code source</h2> + <ul> +<li><a href="#build1">Comment faire pour que Configure cesse de +me poser toutes ces questions ?</a></li> + </ul> +<h2>Les connexions Gnutella</h2> + <ul> +<li><a href="#gnet0">Quel est le bon nombre de connexions ?</a></li> + <li><a href="#gnet1">Dois-je rediriger un port sur mon pare-feu ?</a></li> + <li><a href="#gnet-forward-howto">Comment puis-je configurer + la redirection de ports ?</a></li> + <li><a href="#gnet-udp">Est-ce que gtk-gnutella utilise l'UDP ?</a></li> + <li><a href="#gnet2">Que signifie « FC » ?</a></li> + <li><a href="#gnet3">Pourquoi je perds des connexions gnet lorsqu'un + envoi est en cours ?</a></li> + <li><a href="#gnet4">Que signifient toutes ces choses dans la + colonne Drapeaux ?</a></li> + <li><a href="#gnet-user-agent">Quel est le sens du « ! » lorsqu'il +précède un nom de logiciel ?</a></li> + <li><a href="#gnet5">Que veut dire « Version néfaste bannie, mise à + jour requise » ?</a></li> + <li><a href="#gnet6">Que veut dire « Version obsolète, veuillez + mettre à jour ?</a></li> + <li><a href="#gnet7">Pourquoi mon proxy HTTP ne marche-t-il pas ?</a></li> + <li><a href="#gnet8">Comment puis-je augmenter le délai de déconnexion ?</a></li> + <li><a href="#gnet-auto">Comment le mode automatique choisit-il entre + le fait d'être ultrapeer ou noeud feuille ?</a></li> + </ul> +<h2>Les recherches</h2> + <ul> +<li><a href="#search0">Comment puis-je obtenir plus de résultats ?</a></li> + <li><a href="#search3">Comment puis-je ignorer les fichiers qui n'ont pas de hachage SHA1 ?</a></li> + <li><a href="#search-entry">Où est donc passé la boîte de recherche ?</a></li> + <li><a href="#search-passive">Que sont les recherches « passives » ?</a></li> + <li><a href="#search-local">Comment puis-je copier le lien magnet d'un +fichier que je suis en train de partager ?</a></li> + </ul> +<h2>Les téléchargements</h2> + <ul> +<li><a href="#down0">Que veut dire l'état « Ignore la requête +SHA1|nom & taille » ?</a></li> + <li><a href="#down1">Que signifie « Pas d'URN sur le serveur » ?</a></li> + <li><a href="#down2">Pourquoi le même fichier est-il téléchargé X fois ?</a></li> + <li><a href="#down3">Qu'est-ce que le « swarming » ?</a></li> + <li><a href="#down4">Qu'est-ce qu'un « chunk » ou « bloc » ?</a></li> + <li><a href="#down5">Qu'est-ce que le « maillage du téléchargement » ?</a></li> + <li><a href="#down_push">Qu'est-ce qu'une « requête push » ?</a></li> + <li><a href="#down7">Pourquoi est-ce que gtk-gnutella rajoute .OK +à la fin des noms de fichier ?</a></li> + <li><a href="#down8">Je n'arrive pas à télécharger ce fichier !</a></li> + <li><a href="#down9">Dans l'onglet des téléchargements, quelle est +la différence si le texte est gris au lieu de noir ?</a></li> + </ul> +<h2>Les envois</h2> + <ul> +<li><a href="#up0">Que veut dire « Normalisé » ?</a></li> + </ul> +<h2>GTK+ 2.x</h2> + <ul> +<li><a href="#gtk2_slow">Gtk2 est troooop lent.</a></li> + <li><a href="#gtk2_ctype">Les caractères non ASCII s'affichent +en tant que _ (tiret bas).</a></li> + </ul> +<!-- + ** ** Questions and answers below ** --><hr> +<h2>Généralités</h2> + <h3><a name="general0">Qu'est-ce que Gnutella ?</a></h3> + <p>Gnutella est un réseau décentralisé d'échange d'informations pair à pair. À l'heure actuelle vous pouvez publier et télécharger des fichiers de tout type via le réseau Gnutella. Pour plus d'informations, voyez la +<a href="http://fr.wikipedia.org/wiki/Gnutella">définition de Gnutella sur Wikipédia</a>.</p> + <h3><a name="general-G2">Et quid du réseau G2 ?</a></h3> + <p><a href="http://www.wikipedia.org/wiki/Gnutella2">G2</a> est un protocole pair à pair inspiré de Gnutella, développé principalement par Michael Stokes et publié en 2002 au sein du client <a href="http://shareaza.sourceforge.net/">Shareaza</a> pour le système d'exploitation Windows. À partir de la version 1.1, gtkg peut se connecter à ce réseau en tant que noeud feuille et ainsi rechercher et partager des fichiers sur G2 en plus de Gnutella. Les équivalents des <a href="#general-ultrapeer">ultrapeers</a> sont appelés des <em>hubs</em> sur le réseau G2.</p> + <h3><a name="general-gtkg">Qu'est-ce que « GTKG » ?</a></h3> + <p>Nous utilisons souvent les contractions GTKG ou gtkg pour nous +référer à gtk-gnutella (parce que c'est plus court). GTK vient de +GTK+ qui est la bibliothèque logicielle utilisée pour l'interface graphique +de gtk-gnutella. </p> + <h3><a name="general1">Cette application utilise trop de bande passante !</a></h3> + <p>À l'heure actuelle vous pouvez essayer une ou plusieurs des +solutions suivantes si vous utilisez une ligne lente (modem 56K) : </p> + <ul> +<li>Utiliser le mode noeud feuille. Vous pouvez changer le mode de +pair dans le panneau de configuration sous l'onglet Gnutella. +Une icône dans la barre d'état indique dans quel mode gtkg s'exécute. </li> + <li> Limiter le nombre de connexions Gnutella que vous avez.</li> + <li>Si vous acceptez les connexions entrantes, activez <em>Préférer les connexions compressées</em> dans <em>Fichier>Préférences>Bande passante</em>. </li> + <li>Même si vous avez une connexion lente, il est important de partager des fichiers. Avec le <a href="#down3">swarming</a>, les autres peuvent télécharger des petits blocs de chez vous, de sorte que même une connexion lente, multipliée par de nombreuses sources sur gnet (réseau Gnutella), apporte une formidable contribution. Si vous avez un modem 56K, vous pouvez régler <em>Limites de bande passante pour le trafic HTTP</em> - <em>Vitesse d'envoi cumulé</em> sur 1K/s de façon à avoir la majorité de votre bande passante pour le téléchargement. </li> + <li>Désactivez le bouton sur le coin gauche en bas de l'interface +graphique une fois que vos téléchargements auront démarré. +Cela vous déconnectera du réseau Gnutella. Nous recommandons +de ne PAS faire cela. Vous ne pourrez pas trouver des sources +alternatives additionnelles depuis le réseau et les autres utilisateurs +ne pourront pas effectuer des recherches sur vos fichiers.</li> + </ul> +<h3><a name="general-ultrapeer">Que sont les Ultrapeers et les noeuds feuilles ?</a></h3> + <p>Depuis la version 0.92, gtk-gnutella a implémenté les <em>ultrapeers</em> + et les <em>noeuds feuilles</em>. Cela divise les clients sur gnet en noeuds + feuilles qui ne se connectent qu'aux ultrapeers, et en ultrapeers qui se +connectent à de nombreux noeuds feuilles et à un nombre réduit d'autres +ultrapeers. (cf. <a href="#gnet0">Quel est le bon nombre de +connexions ?</a>). </p> + <p>Les ultrapeers ne doivent pas être bloqués par un pare-feu et on +attend d'eux des durées de fonctionnement longues (plus de deux +heures), ils doivent également avoir assez de bande passante en +surplus à donner au réseau gnet. Les ultrapeers routent les requêtes +depuis leurs noeuds feuilles et les les noeuds feuilles envoient à leurs +ultrapeers des tables QRP qui contiennent les hachages des +mots-clefs qui correspondent aux fichiers qu'ils partagent. Lorsqu'un +ultrapeer reçoit une correspondance sur une table de routage de +requêtes, il relaie la requête au noeud feuille correspondant. Le +résultat est un trafic gnet très réduit pour chaque noeud feuille, +libérant de la bande passante pour le partage et les téléchargements +(qui ont toujours lieu directement en p2p). Les ultrapeers peuvent aussi +agir en tant que <a href="#down_push">push-proxies</a> (mandataires +pour les requêtes push) pour les noeuds feuilles se trouvant derrière +un pare-feu. </p> + <h3><a name="general-firewall">Pourquoi gtk-gnutella dit qu'il est +bloqué par un pare-feu alors qu'il ne l'est pas ?</a></h3> + <p>gtk-gnutella a besoin de recevoir une connexion entrante pour +déterminer si vous pouvez être joint depuis l'extérieur. Jusqu'à +ce moment-là, il part du principe qu'il y a un pare-feu qui bloque +le port TCP configuré pour écouter les connexions. Si vous voulez +accélérer la détection, utilisez un navigateur web, telnet ou un outil +similaire et connectez-vous depuis l'extérieur au port qui écoute les +connexions. Si la connexion est refusée ou ignorée, alors il est très +probablement impossible de vous joindre depuis l'extérieur à cause +d'un pare-feu, un NAT mal configuré ou un élément similaire qui +bloque le port. Vous pouvez essayer un port d'écoute TCP différent +car certains FAI (fournisseur d'accès Internet) bloquent le port par +défaut de Gnutella (6346). Voyez aussi <a href="#gnet1"><q>Dois-je +rediriger un port sur mon pare-feu ?</q></a></p> + <h2>Compiler depuis le code source</h2> + <h3><a name="build1">Comment faire pour que Configure cesse de +me poser toutes ces questions ?</a></h3> + <p>Vous pouvez lancer le script <code>Configure</code> de la façon +décrite ci-dessous pour qu'il utilise les réglages par défaut. Il se +comporte alors comme si l'ancien script <code>Configure</code> +était appelé depuis autoconf aux débuts du développement. </p> + <p><code>$ ./Configure -ders</code></p> + <p>Vous pouvez aussi définir les options de compilation depuis la ligne +de commande. Voici un exemple qui va configurer gtk-gnutella pour qu'il :</p> + <ul> +<li>accepte les réglages personnalisés (-<code>-O</code>). Sans cela, +tous les paramètres ci-dessous seront sans effet. </li> + <li>utilise GTK1 et qu'il active le shell distant (<code>-D +gtkversion=1 -D remotectrl=y</code>) </li> + <li>compile pour un microprocesseur Pentium disposant du jeu d'instructions MMX +(<code>-Dccflags="-march=pentium -mmmx"</code>). </li> + <li>compile les informations de débogage tout en désactivant +toutes les optimisations du compilateur (<code>-Doptimize="-g -O0"</code>). </li> + </ul> +<p><code>$ ./Configure -ders -O -D gtkversion=1 -D remotectrl=y + -Dccflags="-march=pentium -mmmx" -Doptimize="-g -O0"</code></p> + <h2>Les connexions Gnutella</h2> + <h3><a name="gnet0">Quel est le bon nombre de connexions ?</a></h3> + <p>En mode <a href="#general-ultrapeer">feuille</a>, 3 ultrapeers, en +mode <a href="#general-ultrapeer">ultrapeer</a>, 32/40 (minimum/maximum) +ultrapeers et autour de 100 noeuds feuilles. Le nombre réel doit dépendre de +la bande passante disponible. Si vous avez activé « Préférer les connexions +compressées », la quantité de bande passante utilisée sera nettement +inférieure. Vous ne devriez jamais utiliser toute votre bande passante pour les +connexions gnet. Particulièrement avec une connexion asymétrique +câble/DSL, vous pouvez facilement saturer votre trafic entrant en produisant +trop de trafic sortant (souci de TCP/IP). Utilisez au plus la moitié de votre +bande passante sortante pour les connexions gnet.</p> + <p>Depuis l'adoption de « high outdegree » (nombre élevé de connexions) +dans la version 0.95 vous devriez avoir 32/40 connexions aux autres +ultrapeers. Le nombre de connexions aux noeuds feuilles dépend de +votre bande passante et de la vitesse de votre microprocesseur. En tant +que minimum absolu, un ultrapeer devrait se connecter à 20 noeuds +feuilles et il est nettement préférable de se connecter à 100 ou davantage +de ces noeuds. Observez les odomètres de bande passante dans le coin +en bas à gauche de l'interface graphique et utilisez la commande top pour +prendre connaissance des détails de l'utilisation du microprocesseur. +Augmentez le nombre de connexions aux noeuds feuilles jusqu'à atteindre +la quantité maximale de bande passante et les ressources systèmes que +vous voulez attribuer au partage de fichiers. </p> + <p>Les réglages de bande passante vous aideront à régler encore +plus finement l'utilisation de bande passante par gtk-gnutella. </p> + <h3><a name="gnet1">Dois-je rediriger un port sur mon pare-feu ?</a></h3> + <p> Vous n'avez pas besoin de rediriger un port pour que +gtk-gnutella puisse fonctionner, mais sa performance sera +décuplée si vous le faites. Si gtk-gnutella pense que vous êtes +bloqué par un pare-feu, il ne montera aucun résultat +<a href="#down_push">« push »</a> puisque vous ne pourrez pas +les télécharger de toute façon.<br>Même quand les autres ne peuvent pas se connecter directement +chez vous, ils peuvent quand-même télécharger des fichiers depuis +votre noeud en utilisant une <a href="#down_push">requête push</a>.<br>Vous pouvez configurer le port que gtk-gnutella utilise pour écouter les +connexions. Le réglage <em>Port d'écoute</em> est situé dans +<em>Fichier->Préférences->Réseau</em>. </p> + <h3><a name="gnet-forward-howto">Comment puis-je configurer la redirection de ports ?</a></h3> + <p>Vous pouvez trouver les réglages des routeurs les plus populaires sur <a href="http://www.portforward.com/routers.htm">http://www.portforward.com/routers.htm</a>. +Essayez <a href="http://www.canyouseeme.org/">http://www.canyouseeme.org/</a> +pour vérifier la redirection de votre port.</p> + <h3><a name="gnet-udp">Est-ce que gtk-gnutella utilise l'UDP ?</a></h3> + <p>Oui, à partir de la version 0.95, gtk-gnutella peut aussi utiliser l'<a href="http://fr.wikipedia.org/wiki/User_Datagram_Protocol">UDP</a> +en plus du <a href="http://fr.wikipedia.org/wiki/Transmission_Control_Protocol">TCP</a>.</p> + <h3><a name="gnet2">Que signifie « FC » ?</a></h3> + <p><em>FC</em> signifie « flow control », c'est-à-dire contrôle de flux.<br>En général, vous devriez vous assurer que les clients auxquels vous êtes +connecté ne font pas du contrôle de flux : regardez l'état <em>FC</em> +dans la colonne <a href="#gnet4">Drapeaux</a>. En règle générale, si vous +avez plus d'un noeud qui fait du contrôle de flux à un moment donné, c'est +que vous n'avez pas assez de bande passante dédiée à gnet, donc vous +avez un effet néfaste sur le réseau : il faut soit que vous baissiez le nombre +de connexions, soit que vous activiez l'option <em>Préférer les connexions compressées</em>, soit encore que vous augmentiez la limite de la bande +passante sortante. </p> + <h3><a name="gnet3">Pourquoi je perds des connexions gnet lorsque que j'ai un envoi en cours ?</a></h3> + <p>Essayez de limiter la bande passante. Si cela n'aide pas à +résoudre le problème, il se peut que votre FAI filtre ou limite +le trafic Gnutella. Essayez de modifier le port de Gnutella +dans les réglages de gtk-gnutella relatifs au réseau. </p> + <h3><a name="gnet4">Que signifient toutes ces choses dans la colonne Drapeaux ?</a></h3> + <p>Ici, pour chaque connexion vous pouvez voir son type et certains +de ses réglages. Notez que les push-proxies sont implémentés +dans la version 0.92.1c et celles qui sont plus récentes.</p> + <pre> 012345678AB (offset) + NIrwqxZPFhE + ||||||||||+ indique une connexion cryptée avec TLS (<strong>E</strong>ncrypted) + |||||||||+- limitation partielle (<strong>h</strong>) ou totale (<strong>f</strong>) des recherches + ||||||||+-- contrôle de flux (<strong>F</strong>), ou données sur le fil d'attente (<strong>d</strong>) + |||||||+--- nous somme un push-proxy pour le noeud (<strong>P</strong>) ou bien le noeud est notre push-proxy (<strong>p</strong>) + ||||||+---- indique si <strong>R</strong>x, <strong>T</strong>x ou les deux (<strong>Z</strong>) sont compressés + |||||+----- nous avons envoyé notre QRT de dernier hop à un UP (<strong>X</strong>), ou sommes en train de le faire (<strong>X</strong>) + ||||+------ nous avons envoyé/reçu une <strong>Q</strong>RT, ou sommes en train d'en envoyer/recevoir une (<strong>q</strong>) + |||+------- indique si le noeud peut être écrit (<strong>w</strong>ritable) + ||+-------- indique si le noeud peut être lu (<strong>r</strong>eadable) + |+--------- type de connexion : (<strong>I</strong>ncoming (entrante), <strong>O</strong>utgoing (sortante), <strong>P</strong>onging (envoi de pong)) + +---------- mode de pair : <strong>H</strong>ub G2, <strong>U</strong>ltra, feui<strong>L</strong>le, ou ancien (c'est-à-dire <strong>N</strong>ormal)</pre> + <h3><a name="gnet-user-agent">Quel est le sens du « ! » lorsqu'il +précède un nom de logiciel ?</a></h3> + <p>Cela indique que le nom de logiciel (User-Agent) <em>pourrait</em> +être faux mais cela peut aussi être dû à un faux-positif causé par une +horloge qui ne serait pas à l'heure d'un côté ou de l'autre. </p> + <h3><a name="gnet5">Que veut dire « Version néfaste bannie, mise à +jour requise » ?</a></h3> + <p>Parfois, on découvre que des clients ont un bogue ou un comportement +qui est nuisible au réseau gnet. Par exemple, gtk-gnutella-0.92b avait +un bogue qui générait une quantité de requêtes excessives mettant la +pression sur le système de GWebCache. De tels bannissements sont +exceptionnels, normalement restreints à des versions spécifiques, et +l'auteur du logiciel est informé du bannissement ainsi que de ses raisons. </p> + <h3><a name="gnet6">Que veut dire « Version obsolète, veuillez mettre +à jour » ?</a></h3> + <p>Il est important de mettre à jour les versions de gtk-gnutella qui ont +plus d'un an parce qu'il leur manquera des fonctionnalités importantes +pour la santé et la capacité de montée en charge du réseau gnet.</p> + <h3><a name="gnet7">Pourquoi mon proxy HTTP ne marche-t-il pas ?</a></h3> + <p>Votre proxy HTTP doit supporter la méthode <code>CONNECT</code> +parce qu'un <code>GET</code> normal ne marche pas avec les +connexions Gnutella. C'est une extension du protocole HTTP et +principalement supportée par les proxies SQUID. Elle est aussi souvent +désactivée parce qu'elle pourrait être considérée comme un problème +de sécurité par votre FAI. À l'heure actuelle, le support des proxies - de +même que pour SOCKS - n'est pas très bon. Les développeurs n'utilisent +pas de proxies mais si vous pensez que vous pouvez corriger ce problème, +nous apprécierions votre contribution. </p> + <h3><a name="gnet8">Comment puis-je augmenter le délai +de déconnexion ?</a></h3> + <p>Si votre connexion Internet souffre d'une latence élevée, augmenter +les délais de déconnexion (timeout) pourraient se révéler utile. Allez +sur <em>Fichier->Préférences->Interface utilisateur</em> et activez +le <em>mode expert</em>. À présent, vous aurez bien plus de +réglages à modifier lorsque vous irez sur +<em>Fichier->Préférences->Gnutella</em>. </p> + <h3><a name="gnet-auto">Comment le mode automatique choisit-il entre +le fait d'être ultrapeer ou noeud feuille ?</a></h3> + <p>Pour être promu au <a href="#general-ultrapeer">mode ultra</a>, +les conditions suivantes doivent être remplies : </p> + <ol> +<li>Il doit y avoir plus que 8192 octets/s de bande passante sortante +disponible.</li> + <li>Si les ordonnanceurs de bande passante sont activés, les noeuds +feuille ne doivent pas être configurés pour voler toute la bande +passante HTTP sortante. </li> + <li>Si l'ordonnanceur Gnet sortant est activé, il doit y avoir au moins +256 octets/s par connexion gnet (ultrapeer ou normal c'est-à-dire +ancien (legacy)). </li> + <li>Globalement, il doit y avoir 32 octets/s par feuille configurée +plus 256 octets/s par connexion gnet. </li> + </ol> +<h2>Les recherches</h2> + <h3><a name="search0">Comment puis-je obtenir plus de résultats ?</a></h3> + <p>Le nombre de résultats que vous recevez dépend en grande partie de +la possibilité des autres à se connecter directement à vous (cf. <a href="#gnet1">redirection de port</a>) et du <a href="#gnet0">nombre +de connexions</a> aux autres hôtes. </p> + <h3><a name="search3">Comment puis-je ignorer les fichiers qui +n'ont pas de hachage SHA1 ?</a></h3> + <p>Sans objet de nos jours : tous les noeuds supportent SHA1.</p> + <h3><a name="search-entry">Où est donc passée la boîte de recherche ?</a></h3> + <p>Les recherches doivent maintenant être entrées dans la boîte +<q><em>Recherche</em></q> qui se trouve tout en haut.</p> + <h3><a name="search-passive">Que sont les recherches « passives » ?</a></h3> + <p>Une recherche <q><em>passive</em></q> retournera tous les +résultats qui passent à travers gtk-gnutella. En filtrant ces résultats, +les recherches passives peuvent être utiles. </p> + <p>Si vous êtes en mode <a href="#general-ultrapeer">ultra</a>, c'est +que beaucoup de résultats de recherches passent déjà à travers votre +noeud en plus des résultats de vos recherches. Vous pouvez tirer +avantage de cela pour effectuer des recherches sans générer de trafic +gnet supplémentaire. Par exemple, sur mon ultrapeer avec 200 +<a href="#general-ultrapeer">noeuds feuilles</a>, j'ai ouvert une +recherche passive et filtré les résultats pour que seuls ceux qui +contiennent le nom <q><em>linux</em></q> soient affichés. Au bout +d'environ une heure j'avais approximativement 1500 résultats. +Évidemment, plus la recherche est populaire, et plus vous êtes patient, +plus cette technique devient utile. </p> + <p>Si vous êtes en mode feuille, alors les seuls résultats de recherche +qui passeront à travers gtk-gnutella seront ceux de vos propres +recherches, donc la technique décrite ci-dessus ne sera pas utile. +Mais il existe un autre moyen d'utiliser les recherches passives qui +n'est utile que dans le mode feuille. Par exemple, si vous démarrez +une recherche passive et la filtrez pour n'afficher que les fichiers mp3, +alors tous les fichiers mp3 de toutes vos recherches actives seront +commodément agrégés dans un onglet de recherche. En ouvrant +plusieurs recherches passives avec des filtres différents, vous pouvez +afficher des types de fichiers différents dans chacune de ces recherches. </p> + <h3><a name="search-local">Comment puis-je copier le lien magnet d'un +fichier que je suis en train de partager ?</a></h3> + <p>Effectuez une recherche avec le mot-clef <code>local:.</code> ; dans ce +cas le « . » est une expression régulière qui, ici, correspond à tout type de +fichier -- cela donnera une liste exhaustive de votre bibliothèque. Puis, +sélectionnez un élément, faites un clic droit et copiez le lien magnet dans +le presse-papier.</p> + <h3>Les téléchargements</h3> + <h3><a name="down0">Que veut dire l'état « Ignore la requête +SHA1|name & size » ?</a></h3> + <p>Cela signifie que gtk-gnutella a ce fichier enregistré en tant que terminé +(complet) dans sa base de données. Cette base de données se trouve +habituellement dans <code>~/.gtk-gnutella/done.sha1</code> et +<code>~/.gtk-gnutella/done.namesize</code>. À l'heure actuelle, il n'existe +aucun moyen d'enlever ou de modifier une entrée dans cette base de +données depuis l'interface graphique, mais vous pouvez éditer le fichier +avec n'importe quel éditeur de texte lorsque gtk-gnutella n'est pas en +cours de fonctionnement. Si vous ajoutez ou enlevez quelque chose de +l'un des deux fichiers, faites la même chose avec l'autre. </p> + <h3><a name="down1">Que veut dire « Pas d'URN sur le serveur » ?</a></h3> + <p>Cela signifie que gtk-gnutella veut télécharger un nouveau fichier +depuis un hôte, mais que cet hôte ne fournit pas la valeur SHA1 +pour le fichier en question. Comme le fichier est nouveau (pas +encore téléchargé partiellement), gtk-gnutella ne peut pas vérifier +le recouvrement pour s'assurer que le fichier chez l'hôte est bien +celui que vous désirez. Dans un tel cas gtkg se base sur la valeur +SHA1 fournie par l'hôte distant, mais vu qu'aucune valeur SHA1 +n'est fournie, gtk-gnutella n'a aucun moyen de s'assurer que le +fichier qu'il veut télécharger et le fichier présent sur l'hôte distant +sont vraiment les mêmes.<br>Si ces messages vous ennuient, vous pouvez activer l'option +<em>Premier bloc optimiste</em> depuis <em>Fichier->Préférences->Téléchargements</em> +(n'oubliez pas d'activer le <em>mode expert</em> depuis +l'onglet interface utilisateur pour visualiser cette option). </p> + <h3><a name="down2">Pourquoi le même fichier est-il téléchargé X fois ?</a></h3> + <p>Vérifiez la colonne <em>Intervalle</em>. Cela s'appelle le <a href="#down3">swarming</a>. gtk-gnutella essaye de télécharger le fichier en plusieurs <a href="#down4">blocs</a> et le prendra de plusieurs sources en parallèle si c'est possible. </p> + <h3><a name="down3">Qu'est-ce que le « swarming » ?</a></h3> + <p>Le swarming décrit la capacité à télécharger un fichier donné depuis de multiples hôtes en parallèle. gtk-gnutella essayera automatiquement de trouver des sources additionnelles pour tout fichier sur fil d'attente en utilisant le <a href="#down5">maillage de téléchargement</a> et en surveillant les résultats routés.</p> + <h3><a name="down4">Qu'est-ce qu'un « chunk » ou « bloc » ?</a></h3> + <p>Un <em>bloc</em> est synonyme d'<em>une partie d'un fichier</em>. +Lorsque gtk-gnutella est exécuté en +<a href="#down3">mode swarming</a>, il essayera de télécharger +plusieurs blocs d'un fichier jusqu'à ce qu'il ait téléchargé le fichier en +entier. La colonne <em>Intervalle</em> montre les blocs qui sont +téléchargés à un moment donné. </p> + <h3><a name="down5">Qu'est-ce que le « le maillage de téléchargement » ?</a></h3> + <p>Quand vous téléchargez un fichier depuis un hôte qui supporte le maillage de téléchargement, il vous communiquera les sources additionnelles pour le fichier demandé (s'il en connaît). Celles-ci seront alors utilisées pour le <a href="#down3">swarming</a>.</p> + <h3><a name="down_push">Qu'est-ce qu'une « requête push » ?</a></h3> + <p>Les <em>requêtes push</em> permettent de télécharger des fichiers +depuis des hôtes auxquels vous ne pouvez pas vous connecter +directement (parce qu'ils sont bloqués par un pare-feu). Eh bien, +vous ne pouvez pas vous connecter à ces hôtes mais eux peuvent +probablement se connecter à vous. Pour dire à un hôte distant de se +connecter à votre hôte pour que vous puissiez télécharger un fichier +depuis l'hôte distant, vous lui envoyez une requête push.<br>Si vous téléchargez un fichier en utilisant une requête push et que +vous perdez le contact avec l'hôte qui, originellement, vous avait +retourné le résultat au sujet de ce fichier, alors la <em>route push</em> +est perdue et vous ne pouvez plus télécharger ce fichier. Les routes +push sont donc assez fragiles. Vous ne pouvez pas utiliser les requêtes +push lorsque vous êtes bloqué par un pare-feu ou routeur (cf. <a href="#gnet1">redirection de port</a>). </p> + <h3><a name="down7">Pourquoi est-ce que gtk-gnutella ajoute .OK à la +fin des noms de fichier ?</a></h3> + <p>Vous n'avez probablement pas choisi des répertoires différents pour +les fichiers téléchargés, les fichiers partiels et les fichiers corrompus. </p> + <h3><a name="down8">Je n'arrive pas à télécharger ce fichier !</a></h3> + <p>Si vous ne voyez pas une icône jaune souriante avec des lunettes de soleil dans la barre d'état, vous devriez essayer de l'obtenir. Voyez la section sur les <a href="#gnet1">pare-feu</a>.</p> + <p>Autrement, si gtk-gnutella dit qu'il n'a que quelques sources pour +le fichier (plus visible dans le sous-panneau informations de fichier +dans l'onglet des téléchargements), alors cela peut avoir deux +raisons : </p> + <ul> +<li>le fichier est rare</li> + <li>Vous avez choisi une version unique du fichier. Il est possible qu'il +y ait une autre version plus répandue. Un fichier peut devenir +unique par exemple lorsque quelqu'un change les métadonnées d'un +fichier mp3 ou s'il apporte d'autres modifications particulières au fichier. </li> + </ul> +<p>Vous pouvez essayer de rechercher à nouveau le fichier et voir +si vous ne trouvez pas une autre version plus répandue. Si le « # » +affiche un nombre pour un fichier, c'est généralement bon signe. +Plus le chiffre sera grand, plus les chances de pouvoir l'obtenir +rapidement augmenteront. </p> + <h3><a name="down9">Dans l'onglet des téléchargements, quelle est la +différence si le texte est gris plutôt que noir ?</a></h3> + <p>Cela signifie que le fichier est réceptionné depuis une +<a href="#down_push">route push</a>.</p> + <h2>Les envois</h2> + <h3><a name="up0">Que veut dire « Normalisé » ?</a></h3> + <p>Cela montre la quantité totale d'octets envoyés pour un fichier +donné divisée par la taille de ce fichier. </p> + <h2>GTK+ 2.x</h2> + <h3><a name="gtk2_slow">Gtk2 est troooop lent.</a></h3> + <p>Réglez la variable d'environnement <code>GDK_USE_XFT</code> sur 0 + et voyez si cela est utile. Cela désactive l'anticrénelage dans GTK2 qui +utilise beaucoup le microprocesseur. La bibliothèque GTK2 est bien plus +lente que la bibliothèque GTK1. Donc sur une machine lente, vous devriez +considérer l'utilisation de la bibliothèque GTK1. </p> + <h3><a name="gtk2_ctype">Les caractères non ASCII s'affichent +en tant que _ (tiret bas).</a></h3> + <p>Réglez la variable d'environnement <code>LC_CTYPE</code> ou <code>LC_ALL</code> sur une valeur appropriée à l'encodage que +vous utilisez. Par exemple, si vous utilisez des caractères spéciaux +allemands dans les noms de vos fichiers, réglez la sur +<code>de_DE.ISO8859-1</code>. Les valeurs valides dépendent de +votre système d'exploitation, voyez la page man setlocale(3) pour les +détails. Idéalement, tout le monde devrait utiliser l'encodage UTF-8 +qui couvre pratiquement toutes les langues. </p> + <!-- end faq --> + <!-- vi: set et ts=2 sw=2: --> + </body> +</html>
View file
gtk-gnutella-1.1.9.tar.bz2/extra_files/fr/Jmakefile
Added
@@ -0,0 +1,35 @@ +/* + * $Id$ + * + * Copyright (c) 2003, Raphael Manfredi + * + * FAQ installation in language-specific directory. + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +;# $Id$ + +all:: /* So that default target is not clobber! */ + +FAQDIR = $(PRIVLIB)/fr + +InstallNonExec(FAQ, $(FAQDIR)) +
View file
gtk-gnutella-1.1.9.tar.bz2/extra_files/fr/Makefile.SH
Added
@@ -0,0 +1,154 @@ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ + +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +CURRENT=extra_files/fr +DIR=`echo $CURRENT/ | sed -e 's/\.\///g'` +echo "Extracting ${DIR}Makefile (with variable substitutions)" + +INSTALL=`echo $install | sed -e 's,\./i,\$(TOP)/i,'` +INSTALLDIR=`echo $installdir | sed -e 's,\./i,\$(TOP)/i,'` +DATE=`date` + +$spitshell >Makefile <<!GROK!THIS! +######################################################################## +# Makefile generated from Makefile.SH on $DATE + +SHELL = /bin/sh +JMAKE = jmake +TOP = ../.. +CURRENT = $CURRENT +DIR = $DIR +INSTALL = $INSTALL +INSTALLDIR = $INSTALLDIR + +######################################################################## +# Parameters set by Configure -- edit config.sh if changes are needed + +CTAGS = ctags +JCPPFLAGS = $cppflags +MV = $mv +PRIVLIB = $installprivlib +RM = $rm -f + +!GROK!THIS! +$spitshell >>Makefile <<'!NO!SUBS!' +######################################################################## +# Jmake rules for building libraries, programs, scripts, and data files +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ + +######################################################################## +# Start of Jmakefile + +# $X-Id$ + +all:: + +FAQDIR = $(PRIVLIB)/fr + +local_install local_install-strip:: FAQ + @case '${MFLAGS}' in *i*) set +e;; esac; \ + (set -x; test -d $(INSTALL_PREFIX)$(FAQDIR) || \ + $(INSTALLDIR) $(INSTALL_PREFIX)$(FAQDIR)); \ + $(INSTALL) -c -m 444 FAQ $(INSTALL_PREFIX)$(FAQDIR) + +local_deinstall:: + $(RM) $(INSTALL_PREFIX)$(FAQDIR)/FAQ + +######################################################################## +# Common rules for all Makefiles -- do not edit + +all:: + +clean: local_clean +realclean: local_realclean +clobber: local_clobber + +local_clean:: + if test -f core; then $(RM) core; fi + $(RM) *~ *.o + +local_realclean:: local_clean + +local_clobber:: local_realclean + $(RM) Makefile config.sh + +install:: local_install + @exit 0 + +install-strip:: local_install-strip + @exit 0 + +install.man:: maybe_install.man +deinstall:: local_deinstall +deinstall.man:: maybe_deinstall.man + +install.man-no: +deinstall.man-no: + +maybe_install.man: install.man-no +maybe_deinstall.man: deinstall.man-no + +Makefile.SH: Jmakefile + -@if test -f $(TOP)/.package; then \ + if test -f Makefile.SH; then \ + echo " $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~"; \ + $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~; \ + fi; \ + echo " $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT)" ; \ + $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT) ; \ + else touch $@; fi + +Makefile: Makefile.SH + /bin/sh Makefile.SH + +tags:: + $(CTAGS) -w *.ch + $(CTAGS) -xw *.ch > tags + +local_clobber:: + $(RM) tags + +depend:: + +######################################################################## +# Empty rules for directories with no sub-directories -- do not edit + +local_install:: + @echo "install in $(CURRENT) done." + +local_install-strip:: + @echo "install (strip) in $(CURRENT) done." + +local_deinstall:: + @echo "deinstall in $(CURRENT) done." + +local_install.man:: + @echo "install.man in $(CURRENT) done." + +local_deinstall.man:: + @echo "deinstall.man in $(CURRENT) done." + +Makefiles:: + +Makefiles.SH:: + +!NO!SUBS! +chmod 644 Makefile +$eunicefix Makefile +
View file
gtk-gnutella-0.98.2.tar.bz2/extra_files/geo-ip.txt -> gtk-gnutella-1.1.9.tar.bz2/extra_files/geo-ip.txt
Changed
@@ -1,6 +1,6 @@ # From http://www.maxmind.com/app/geoip_country # Redistributed under the OPEN DATA LICENSE (see GEO_LICENCE) -# Conversion for GTKG generated on Tue Dec 27 12:24:16 2011 GMT +# Conversion for GTKG generated on Sun Mar 6 07:47:57 2016 GMT 1.0.0.0 - 1.0.0.255 au 1.0.1.0 - 1.0.3.255 cn 1.0.4.0 - 1.0.7.255 au @@ -15,7 +15,7 @@ 1.1.64.0 - 1.1.127.255 jp 1.1.128.0 - 1.1.255.255 th 1.2.0.0 - 1.2.2.255 cn -1.2.3.0 - 1.2.3.255 au +1.2.3.0 - 1.2.3.255 us 1.2.4.0 - 1.2.127.255 cn 1.2.128.0 - 1.2.255.255 th 1.3.0.0 - 1.3.255.255 cn @@ -37,9 +37,11 @@ 1.21.0.0 - 1.21.255.255 jp 1.22.0.0 - 1.23.255.255 in 1.24.0.0 - 1.31.255.255 cn -1.32.0.0 - 1.32.255.255 hk +1.32.0.0 - 1.32.127.255 my +1.32.128.0 - 1.32.255.255 sg 1.33.0.0 - 1.33.255.255 jp -1.34.0.0 - 1.35.255.255 tw +1.34.0.0 - 1.34.0.0 cn +1.34.0.1 - 1.35.255.255 tw 1.36.0.0 - 1.36.255.255 hk 1.37.0.0 - 1.37.255.255 ph 1.38.0.0 - 1.39.255.255 in @@ -68,15 +70,19 @@ 1.200.0.0 - 1.200.255.255 tw 1.201.0.0 - 1.201.255.255 kr 1.202.0.0 - 1.207.255.255 cn -1.208.0.0 - 1.254.255.255 kr -1.255.0.0 - 1.255.255.255 au -2.0.0.0 - 2.15.255.255 fr +1.208.0.0 - 1.255.255.255 kr +2.0.0.0 - 2.0.0.0 gb +2.0.0.1 - 2.15.255.255 fr 2.16.0.0 - 2.16.5.255 eu 2.16.6.0 - 2.16.7.255 de -2.16.8.0 - 2.16.67.255 eu +2.16.8.0 - 2.16.35.255 eu +2.16.36.0 - 2.16.37.255 il +2.16.38.0 - 2.16.67.255 eu 2.16.68.0 - 2.16.69.255 se 2.16.70.0 - 2.16.71.255 it -2.16.72.0 - 2.16.131.255 eu +2.16.72.0 - 2.16.73.255 eu +2.16.74.0 - 2.16.75.255 nl +2.16.76.0 - 2.16.131.255 eu 2.16.132.0 - 2.16.133.255 de 2.16.134.0 - 2.16.169.255 eu 2.16.170.0 - 2.16.173.255 de @@ -92,7 +98,9 @@ 2.17.252.0 - 2.17.255.255 de 2.18.0.0 - 2.18.79.255 eu 2.18.80.0 - 2.18.95.255 gr -2.18.96.0 - 2.19.15.255 eu +2.18.96.0 - 2.18.241.255 eu +2.18.242.0 - 2.18.243.255 nl +2.18.244.0 - 2.19.15.255 eu 2.19.16.0 - 2.19.31.255 it 2.19.32.0 - 2.19.239.255 eu 2.19.240.0 - 2.19.255.255 de @@ -134,14 +142,14 @@ 2.22.50.0 - 2.22.54.255 eu 2.22.55.0 - 2.22.55.255 be 2.22.56.0 - 2.22.59.255 fr -2.22.60.0 - 2.22.95.255 eu +2.22.60.0 - 2.22.60.255 se +2.22.61.0 - 2.22.95.255 eu 2.22.96.0 - 2.22.159.255 gb -2.22.160.0 - 2.22.225.255 fr -2.22.226.0 - 2.22.227.255 se +2.22.160.0 - 2.22.226.255 fr +2.22.227.0 - 2.22.227.255 gb 2.22.228.0 - 2.22.229.255 eu 2.22.230.0 - 2.22.230.255 es -2.22.231.0 - 2.22.231.255 eu -2.22.232.0 - 2.22.232.255 gb +2.22.231.0 - 2.22.232.255 eu 2.22.233.0 - 2.22.233.255 nl 2.22.234.0 - 2.22.245.255 eu 2.22.246.0 - 2.22.247.255 gb @@ -155,11 +163,6 @@ 2.32.0.0 - 2.47.255.255 it 2.48.0.0 - 2.51.255.255 ae 2.52.0.0 - 2.55.255.255 il -2.56.0.0 - 2.56.159.255 ua -2.56.160.0 - 2.56.171.255 cz -2.56.172.0 - 2.56.255.255 ua -2.57.0.0 - 2.57.31.255 ru -2.57.32.0 - 2.59.255.255 ua 2.60.0.0 - 2.63.255.255 ru 2.64.0.0 - 2.71.255.255 se 2.72.0.0 - 2.79.255.255 kz @@ -186,537 +189,1943 @@ 2.224.0.0 - 2.239.255.255 it 2.240.0.0 - 2.247.255.255 de 2.248.0.0 - 2.255.255.255 se -3.0.0.0 - 4.17.135.31 us -4.17.135.32 - 4.17.135.63 ca -4.17.135.64 - 4.17.142.255 us -4.17.143.0 - 4.17.143.15 ca -4.17.143.16 - 4.18.32.71 us -4.18.32.72 - 4.18.32.79 mx -4.18.32.80 - 4.18.40.135 us -4.18.40.136 - 4.18.40.143 ca -4.18.40.144 - 4.18.65.255 us +3.0.0.0 - 4.18.65.255 us 4.18.66.0 - 4.18.67.255 mx -4.18.68.0 - 4.18.100.31 us -4.18.100.32 - 4.18.100.39 ca -4.18.100.40 - 4.19.162.143 us -4.19.162.144 - 4.19.162.151 ca -4.19.162.152 - 4.20.73.15 us -4.20.73.16 - 4.20.73.31 ca -4.20.73.32 - 4.23.128.183 us -4.23.128.184 - 4.23.128.191 ca -4.23.128.192 - 4.37.0.255 us -4.37.1.0 - 4.37.1.255 ca -4.37.2.0 - 4.42.209.231 us -4.42.209.232 - 4.42.209.239 ca -4.42.209.240 - 4.43.114.7 us -4.43.114.8 - 4.43.114.15 bm -4.43.114.16 - 4.79.65.159 us -4.79.65.160 - 4.79.65.191 ca -4.79.65.192 - 4.79.244.223 us -4.79.244.224 - 4.79.244.255 ca -4.79.245.0 - 4.79.245.127 us -4.79.245.128 - 4.79.245.191 bm -4.79.245.192 - 4.255.255.255 us -5.0.0.0 - 5.63.255.255 eu -6.0.0.0 - 7.57.75.31 us -7.57.75.32 - 7.57.75.63 it -7.57.75.64 - 8.7.64.255 us -8.7.65.0 - 8.7.65.255 ca -8.7.66.0 - 8.7.209.255 us -8.7.210.0 - 8.7.210.255 ca -8.7.211.0 - 8.14.223.255 us +4.18.68.0 - 4.28.141.255 us +4.28.142.0 - 4.28.142.255 ca +4.28.143.0 - 4.69.153.192 us +4.69.153.193 - 4.69.153.193 nl +4.69.153.194 - 5.0.0.0 us +5.0.0.1 - 5.0.255.255 sy +5.1.0.0 - 5.1.31.255 ua +5.1.32.0 - 5.1.39.255 es +5.1.40.0 - 5.1.47.255 cy +5.1.48.0 - 5.1.55.255 ru +5.1.56.0 - 5.1.63.255 cz +5.1.64.0 - 5.1.82.255 de +5.1.83.0 - 5.1.83.255 gb +5.1.84.0 - 5.1.87.255 de +5.1.88.0 - 5.1.88.255 gb +5.1.89.0 - 5.1.95.255 de +5.1.96.0 - 5.1.103.255 ch +5.1.104.0 - 5.1.111.255 iq +5.1.112.0 - 5.1.119.255 ch +5.1.120.0 - 5.1.255.255 de +5.2.0.0 - 5.2.15.255 it +5.2.16.0 - 5.2.23.255 gb +5.2.24.0 - 5.2.31.255 es +5.2.32.0 - 5.2.63.255 ru +5.2.64.0 - 5.2.79.255 nl +5.2.80.0 - 5.2.87.255 tr +5.2.88.0 - 5.2.95.255 es +5.2.96.0 - 5.2.127.255 gb +5.2.128.0 - 5.2.255.255 ro +5.3.0.0 - 5.3.255.255 ru +5.4.0.0 - 5.7.255.255 de +5.8.0.0 - 5.8.31.255 ru +5.8.32.0 - 5.8.35.255 bz +5.8.36.0 - 5.8.39.255 ru +5.8.40.0 - 5.8.43.255 nl +5.8.44.0 - 5.8.44.127 mx +5.8.44.128 - 5.8.44.255 pa +5.8.45.0 - 5.8.45.127 br +5.8.45.128 - 5.8.45.255 cl +5.8.46.0 - 5.8.46.127 ar +5.8.46.128 - 5.8.46.255 co +5.8.47.0 - 5.8.47.127 pl +5.8.47.128 - 5.8.47.255 it +5.8.48.0 - 5.8.95.255 ru +5.8.96.0 - 5.8.127.255 it +5.8.128.0 - 5.8.159.255 lb +5.8.160.0 - 5.8.183.255 ru +5.8.184.0 - 5.8.191.255 es +5.8.192.0 - 5.8.239.255 ru +5.8.240.0 - 5.8.247.255 iq +5.9.0.0 - 5.9.88.249 de +5.9.88.250 - 5.9.88.250 nl +5.9.88.251 - 5.9.164.109 de +5.9.164.110 - 5.9.164.110 nl +5.9.164.111 - 5.10.15.255 de +5.10.16.0 - 5.10.31.255 gb +5.10.32.0 - 5.10.39.255 ge +5.10.40.0 - 5.10.63.255 de +5.10.64.0 - 5.10.95.255 nl +5.10.96.0 - 5.10.127.255 gb +5.10.128.0 - 5.10.135.255 fr +5.10.136.0 - 5.10.159.255 gb +5.10.160.0 - 5.10.191.255 de +5.10.192.0 - 5.10.199.255 br +5.10.200.0 - 5.10.207.255 es +5.10.208.0 - 5.10.223.255 de +5.10.224.0 - 5.10.231.255 iq +5.10.232.0 - 5.10.239.255 gb +5.10.240.0 - 5.10.255.255 az +5.11.0.0 - 5.11.7.255 at +5.11.8.0 - 5.11.15.255 gb +5.11.16.0 - 5.11.31.255 a2 +5.11.32.0 - 5.11.39.255 it +5.11.40.0 - 5.11.47.255 ps +5.11.48.0 - 5.11.55.255 de +5.11.56.0 - 5.11.63.255 gr +5.11.64.0 - 5.11.79.255 ru +5.11.80.0 - 5.11.95.255 gb +5.11.96.0 - 5.11.127.255 it +5.11.128.0 - 5.11.255.255 tr +5.12.0.0 - 5.15.255.255 ro +5.16.0.0 - 5.19.255.255 ru +5.20.0.0 - 5.20.255.255 lt +5.21.0.0 - 5.21.255.255 om +5.22.0.0 - 5.22.127.255 ir +5.22.128.0 - 5.22.135.255 il +5.22.136.0 - 5.22.143.255 gb +5.22.144.0 - 5.22.151.255 de +5.22.152.0 - 5.22.152.255 cz +5.22.153.0 - 5.22.153.255 ru +5.22.154.0 - 5.22.154.255 sk +5.22.155.0 - 5.22.155.255 ru +5.22.156.0 - 5.22.159.255 ua +5.22.160.0 - 5.22.191.255 rs +5.22.192.0 - 5.22.223.255 ir +5.22.224.0 - 5.22.231.255 gb +5.22.232.0 - 5.22.232.255 se +5.22.233.0 - 5.22.233.255 dk +5.22.234.0 - 5.22.239.255 se +5.22.240.0 - 5.22.247.255 de +5.22.248.0 - 5.22.255.255 nl +5.23.0.0 - 5.23.3.255 eu +5.23.4.0 - 5.23.4.7 it +5.23.4.8 - 5.23.7.255 eu +5.23.8.0 - 5.23.8.255 tr +5.23.9.0 - 5.23.9.255 eu +5.23.10.0 - 5.23.10.255 be +5.23.11.0 - 5.23.11.255 eu +5.23.12.0 - 5.23.15.255 es +5.23.16.0 - 5.23.19.255 eu +5.23.20.0 - 5.23.20.255 sa +5.23.21.0 - 5.23.23.255 eu +5.23.24.0 - 5.23.25.255 fr +5.23.26.0 - 5.23.27.255 eu +5.23.28.0 - 5.23.28.7 es +5.23.28.8 - 5.23.31.255 eu +5.23.32.0 - 5.23.39.255 it +5.23.40.0 - 5.23.47.255 fr +5.23.48.0 - 5.23.55.255 ru +5.23.56.0 - 5.23.63.255 fi +5.23.64.0 - 5.23.95.255 is +5.23.96.0 - 5.23.111.255 ru +5.23.112.0 - 5.23.119.255 ir +5.23.120.0 - 5.23.127.255 tr +5.23.128.0 - 5.23.255.255 be +5.24.0.0 - 5.27.255.255 tr +5.28.0.0 - 5.28.7.255 hu +5.28.8.0 - 5.28.15.255 it +5.28.16.0 - 5.28.31.255 ru +5.28.32.0 - 5.28.39.255 ir +5.28.40.0 - 5.28.47.255 de +5.28.48.0 - 5.28.63.255 gb +5.28.64.0 - 5.28.127.255 de +5.28.128.0 - 5.28.191.255 il +5.28.192.0 - 5.28.255.255 de +5.29.0.0 - 5.29.255.255 il +5.30.0.0 - 5.32.127.255 ae +5.32.128.0 - 5.32.135.255 bg +5.32.136.0 - 5.32.143.255 si +5.32.144.0 - 5.32.151.255 ru +5.32.152.0 - 5.32.159.255 gb +5.32.160.0 - 5.32.167.255 de +5.32.168.0 - 5.32.175.255 md +5.32.176.0 - 5.32.183.255 mk +5.32.184.0 - 5.32.191.255 de +5.32.192.0 - 5.32.255.255 om +5.33.0.0 - 5.33.255.255 dk +5.34.0.0 - 5.34.127.255 kz +5.34.128.0 - 5.34.159.255 es +5.34.160.0 - 5.34.167.255 ps +5.34.168.0 - 5.34.175.255 il +5.34.176.0 - 5.34.183.255 ua +5.34.184.0 - 5.34.191.255 it +5.34.192.0 - 5.34.223.255 ir +5.34.224.0 - 5.34.231.255 de +5.34.232.0 - 5.34.239.255 nl +5.34.240.0 - 5.34.245.255 se +5.34.246.0 - 5.34.247.255 us +5.34.248.0 - 5.34.255.255 li +5.35.0.0 - 5.35.159.255 ru +5.35.160.0 - 5.35.167.255 je +5.35.168.0 - 5.35.183.255 nl +5.35.184.0 - 5.35.191.255 se +5.35.192.0 - 5.35.199.255 be +5.35.200.0 - 5.35.207.255 es +5.35.208.0 - 5.35.215.255 ro +5.35.216.0 - 5.35.223.255 es +5.35.224.0 - 5.35.255.255 de +5.36.0.0 - 5.37.255.255 om +5.38.0.0 - 5.38.127.255 ae +5.38.128.0 - 5.38.255.255 hu +5.39.0.0 - 5.39.1.255 fr +5.39.2.0 - 5.39.2.3 es +5.39.2.4 - 5.39.2.11 fr +5.39.2.12 - 5.39.2.15 es +5.39.2.16 - 5.39.2.55 fr +5.39.2.56 - 5.39.2.63 pl +5.39.2.64 - 5.39.2.95 fr +5.39.2.96 - 5.39.2.103 it +5.39.2.104 - 5.39.2.191 fr +5.39.2.192 - 5.39.2.195 es +5.39.2.196 - 5.39.2.203 fr +5.39.2.204 - 5.39.2.204 es +5.39.2.205 - 5.39.2.206 ch +5.39.2.207 - 5.39.2.207 es +5.39.2.208 - 5.39.2.227 fr +5.39.2.228 - 5.39.2.228 pl +5.39.2.229 - 5.39.2.243 fr +5.39.2.244 - 5.39.2.247 es +5.39.2.248 - 5.39.2.255 fr +5.39.3.0 - 5.39.3.255 gb +5.39.4.0 - 5.39.4.39 fr +5.39.4.40 - 5.39.4.43 es +5.39.4.44 - 5.39.5.187 fr +5.39.5.188 - 5.39.5.191 es +5.39.5.192 - 5.39.6.15 fr +5.39.6.16 - 5.39.6.19 es +5.39.6.20 - 5.39.8.87 fr +5.39.8.88 - 5.39.8.91 es +5.39.8.92 - 5.39.8.255 fr +5.39.9.0 - 5.39.9.3 nl +5.39.9.4 - 5.39.9.27 fr +5.39.9.28 - 5.39.9.35 es +5.39.9.36 - 5.39.9.99 fr +5.39.9.100 - 5.39.9.103 nl +5.39.9.104 - 5.39.9.231 fr +5.39.9.232 - 5.39.9.235 es +5.39.9.236 - 5.39.10.19 fr +5.39.10.20 - 5.39.10.23 nl +5.39.10.24 - 5.39.10.31 fr +5.39.10.32 - 5.39.10.35 es +5.39.10.36 - 5.39.10.143 fr +5.39.10.144 - 5.39.10.147 es +5.39.10.148 - 5.39.11.35 fr +5.39.11.36 - 5.39.11.39 nl +5.39.11.40 - 5.39.11.43 es +5.39.11.44 - 5.39.11.79 fr +5.39.11.80 - 5.39.11.83 nl +5.39.11.84 - 5.39.11.95 fr +5.39.11.96 - 5.39.11.103 nl +5.39.11.104 - 5.39.12.3 fr +5.39.12.4 - 5.39.12.7 nl +5.39.12.8 - 5.39.12.55 fr +5.39.12.56 - 5.39.12.59 nl +5.39.12.60 - 5.39.12.195 fr +5.39.12.196 - 5.39.12.199 nl +5.39.12.200 - 5.39.13.247 fr +5.39.13.248 - 5.39.13.251 nl +5.39.13.252 - 5.39.17.71 fr +5.39.17.72 - 5.39.17.72 de +5.39.17.73 - 5.39.17.75 fr +5.39.17.76 - 5.39.17.76 de +5.39.17.77 - 5.39.17.91 fr +5.39.17.92 - 5.39.17.95 de +5.39.17.96 - 5.39.18.27 fr +5.39.18.28 - 5.39.18.28 de +5.39.18.29 - 5.39.18.63 fr +5.39.18.64 - 5.39.18.71 es +5.39.18.72 - 5.39.18.87 fr +5.39.18.88 - 5.39.18.91 es +5.39.18.92 - 5.39.18.127 fr +5.39.18.128 - 5.39.18.135 nl +5.39.18.136 - 5.39.18.139 de +5.39.18.140 - 5.39.19.83 fr +5.39.19.84 - 5.39.19.87 cz +5.39.19.88 - 5.39.19.135 fr +5.39.19.136 - 5.39.19.143 it +5.39.19.144 - 5.39.19.223 fr +5.39.19.224 - 5.39.19.239 de +5.39.19.240 - 5.39.19.247 fr +5.39.19.248 - 5.39.19.255 es +5.39.20.0 - 5.39.20.151 fr +5.39.20.152 - 5.39.20.159 pl +5.39.20.160 - 5.39.20.175 fr +5.39.20.176 - 5.39.20.176 de +5.39.20.177 - 5.39.20.183 fr +5.39.20.184 - 5.39.20.184 de +5.39.20.185 - 5.39.25.175 fr +5.39.25.176 - 5.39.25.191 gb +5.39.25.192 - 5.39.26.163 fr +5.39.26.164 - 5.39.26.167 fi +5.39.26.168 - 5.39.26.211 fr +5.39.26.212 - 5.39.26.215 it +5.39.26.216 - 5.39.26.219 pt +5.39.26.220 - 5.39.27.55 fr +5.39.27.56 - 5.39.27.59 de +5.39.27.60 - 5.39.28.159 fr +5.39.28.160 - 5.39.28.191 es +5.39.28.192 - 5.39.28.211 fr +5.39.28.212 - 5.39.28.215 de +5.39.28.216 - 5.39.29.91 fr +5.39.29.92 - 5.39.29.95 es +5.39.29.96 - 5.39.30.219 fr +5.39.30.220 - 5.39.30.220 de +5.39.30.221 - 5.39.35.223 fr +5.39.35.224 - 5.39.35.231 nl +5.39.35.232 - 5.39.39.99 fr +5.39.39.100 - 5.39.39.103 es +5.39.39.104 - 5.39.40.75 fr +5.39.40.76 - 5.39.40.79 it +5.39.40.80 - 5.39.40.143 fr +5.39.40.144 - 5.39.40.159 gb +5.39.40.160 - 5.39.41.135 fr +5.39.41.136 - 5.39.41.143 es +5.39.41.144 - 5.39.41.191 fr +5.39.41.192 - 5.39.41.255 gb +5.39.42.0 - 5.39.43.207 fr +5.39.43.208 - 5.39.43.211 es +5.39.43.212 - 5.39.44.63 fr +5.39.44.64 - 5.39.44.67 es +5.39.44.68 - 5.39.46.76 fr +5.39.46.77 - 5.39.46.78 pt +5.39.46.79 - 5.39.46.187 fr +5.39.46.188 - 5.39.46.191 ie +5.39.46.192 - 5.39.47.171 fr +5.39.47.172 - 5.39.47.175 it +5.39.47.176 - 5.39.48.7 fr +5.39.48.8 - 5.39.48.15 es +5.39.48.16 - 5.39.48.23 it +5.39.48.24 - 5.39.48.27 fr +5.39.48.28 - 5.39.48.31 de +5.39.48.32 - 5.39.48.63 fr +5.39.48.64 - 5.39.48.71 de +5.39.48.72 - 5.39.49.87 fr +5.39.49.88 - 5.39.49.91 es +5.39.49.92 - 5.39.50.39 fr +5.39.50.40 - 5.39.50.47 es +5.39.50.48 - 5.39.53.39 fr +5.39.53.40 - 5.39.53.43 nl +5.39.53.44 - 5.39.53.71 fr +5.39.53.72 - 5.39.53.72 de +5.39.53.73 - 5.39.55.131 fr +5.39.55.132 - 5.39.55.147 de +5.39.55.148 - 5.39.56.31 fr +5.39.56.32 - 5.39.56.47 ch +5.39.56.48 - 5.39.56.51 fr +5.39.56.52 - 5.39.56.55 es +5.39.56.56 - 5.39.57.79 fr +5.39.57.80 - 5.39.57.95 ie +5.39.57.96 - 5.39.58.111 fr +5.39.58.112 - 5.39.58.115 gr +5.39.58.116 - 5.39.58.227 fr +5.39.58.228 - 5.39.58.228 de +5.39.58.229 - 5.39.58.255 fr +5.39.59.0 - 5.39.59.3 de +5.39.59.4 - 5.39.59.23 fr +5.39.59.24 - 5.39.59.24 de +5.39.59.25 - 5.39.59.99 fr +5.39.59.100 - 5.39.59.103 es +5.39.59.104 - 5.39.60.59 fr +5.39.60.60 - 5.39.60.63 es +5.39.60.64 - 5.39.60.111 fr +5.39.60.112 - 5.39.60.112 de +5.39.60.113 - 5.39.61.199 fr +5.39.61.200 - 5.39.61.203 es +5.39.61.204 - 5.39.63.191 fr +5.39.63.192 - 5.39.63.223 de +5.39.63.224 - 5.39.97.23 fr +5.39.97.24 - 5.39.97.31 nl +5.39.97.32 - 5.39.97.127 fr +5.39.97.128 - 5.39.97.143 de +5.39.97.144 - 5.39.98.248 fr +5.39.98.249 - 5.39.98.249 fi +5.39.98.250 - 5.39.101.159 fr +5.39.101.160 - 5.39.101.163 pl +5.39.101.164 - 5.39.101.215 fr +5.39.101.216 - 5.39.101.216 de +5.39.101.217 - 5.39.102.103 fr +5.39.102.104 - 5.39.102.104 es +5.39.102.105 - 5.39.103.95 fr +5.39.103.96 - 5.39.103.127 cz +5.39.103.128 - 5.39.103.235 fr +5.39.103.236 - 5.39.103.239 es +5.39.103.240 - 5.39.106.63 fr +5.39.106.64 - 5.39.106.127 gb +5.39.106.128 - 5.39.108.59 fr +5.39.108.60 - 5.39.108.63 de +5.39.108.64 - 5.39.108.147 fr +5.39.108.148 - 5.39.108.151 it +5.39.108.152 - 5.39.109.86 fr +5.39.109.87 - 5.39.109.94 es +5.39.109.95 - 5.39.109.95 fr +5.39.109.96 - 5.39.109.98 es +5.39.109.99 - 5.39.109.100 fr +5.39.109.101 - 5.39.109.103 es +5.39.109.104 - 5.39.109.105 fr +5.39.109.106 - 5.39.109.107 es +5.39.109.108 - 5.39.109.114 fr +5.39.109.115 - 5.39.109.120 es +5.39.109.121 - 5.39.109.124 fr +5.39.109.125 - 5.39.109.125 es +5.39.109.126 - 5.39.109.127 fr +5.39.109.128 - 5.39.109.159 es +5.39.109.160 - 5.39.112.75 fr +5.39.112.76 - 5.39.112.79 be +5.39.112.80 - 5.39.113.171 fr +5.39.113.172 - 5.39.113.175 de +5.39.113.176 - 5.39.113.211 fr +5.39.113.212 - 5.39.113.215 gb +5.39.113.216 - 5.39.114.11 fr +5.39.114.12 - 5.39.114.12 de +5.39.114.13 - 5.39.121.127 fr +5.39.121.128 - 5.39.121.191 pt +5.39.121.192 - 5.39.122.143 fr +5.39.122.144 - 5.39.122.147 it +5.39.122.148 - 5.39.122.207 fr +5.39.122.208 - 5.39.122.211 nl +5.39.122.212 - 5.39.126.67 fr +5.39.126.68 - 5.39.126.71 de +5.39.126.72 - 5.39.126.235 fr +5.39.126.236 - 5.39.126.239 de +5.39.126.240 - 5.39.127.31 fr +5.39.127.32 - 5.39.127.35 de +5.39.127.36 - 5.39.127.247 fr +5.39.127.248 - 5.39.127.251 lt +5.39.127.252 - 5.39.127.255 fr +5.39.128.0 - 5.39.159.255 hr +5.39.160.0 - 5.39.167.255 ru +5.39.168.0 - 5.39.175.255 nl +5.39.176.0 - 5.39.183.255 gb +5.39.184.0 - 5.39.191.255 nl +5.39.192.0 - 5.39.199.255 pl +5.39.200.0 - 5.39.207.255 ru +5.39.208.0 - 5.39.215.255 es +5.39.216.0 - 5.39.223.255 nl +5.39.224.0 - 5.39.239.255 fr +5.39.240.0 - 5.39.247.255 de +5.39.248.0 - 5.39.255.255 gb +5.40.0.0 - 5.40.255.255 es +5.41.0.0 - 5.41.255.255 sa +5.42.0.0 - 5.42.127.255 ru +5.42.128.0 - 5.42.135.255 je +5.42.136.0 - 5.42.143.255 de +5.42.144.0 - 5.42.151.255 it +5.42.152.0 - 5.42.191.255 fr +5.42.192.0 - 5.42.223.255 iq +5.42.224.0 - 5.42.255.255 sa +5.43.0.0 - 5.43.63.255 pt +5.43.64.0 - 5.43.127.255 ba +5.43.128.0 - 5.43.159.255 ru +5.43.160.0 - 5.43.191.255 hr +5.43.192.0 - 5.43.223.255 ps +5.43.224.0 - 5.43.231.255 cz +5.43.232.0 - 5.43.239.255 it +5.43.240.0 - 5.43.247.255 ru +5.43.248.0 - 5.43.255.255 it +5.44.0.0 - 5.44.15.255 ru +5.44.16.0 - 5.44.31.255 gb +5.44.32.0 - 5.44.39.255 az +5.44.40.0 - 5.44.63.255 ru +5.44.64.0 - 5.44.71.255 no +5.44.72.0 - 5.44.79.255 nl +5.44.80.0 - 5.44.95.255 tr +5.44.96.0 - 5.44.99.255 de +5.44.100.0 - 5.44.103.255 nl +5.44.104.0 - 5.44.107.255 us +5.44.108.0 - 5.44.108.31 py +5.44.108.32 - 5.44.111.255 de +5.44.112.0 - 5.44.127.255 ch +5.44.128.0 - 5.44.135.255 ge +5.44.136.0 - 5.44.143.255 dk +5.44.144.0 - 5.44.159.255 tr +5.44.160.0 - 5.44.167.255 fr +5.44.168.0 - 5.44.175.255 ru +5.44.176.0 - 5.44.183.255 se +5.44.184.0 - 5.44.191.255 ee +5.44.192.0 - 5.44.207.255 se +5.44.208.0 - 5.44.215.255 at +5.44.216.0 - 5.44.223.255 lv +5.44.224.0 - 5.44.239.255 gb +5.44.240.0 - 5.44.247.255 fi +5.44.248.0 - 5.44.255.255 gb +5.45.0.0 - 5.45.7.255 de +5.45.8.0 - 5.45.15.255 es +5.45.16.0 - 5.45.31.255 gb +5.45.48.0 - 5.45.55.255 gb +5.45.56.0 - 5.45.59.255 cz +5.45.60.0 - 5.45.62.255 nl +5.45.63.0 - 5.45.63.255 cz +5.45.64.0 - 5.45.79.255 nl +5.45.80.0 - 5.45.95.255 ru +5.45.96.0 - 5.45.111.255 de +5.45.112.0 - 5.45.127.255 ee +5.45.128.0 - 5.45.143.255 jo +5.45.144.0 - 5.45.151.255 gb +5.45.152.0 - 5.45.159.255 no +5.45.160.0 - 5.45.175.255 es +5.45.176.0 - 5.45.183.255 de +5.45.184.0 - 5.45.191.255 lb +5.45.192.0 - 5.45.255.255 ru +5.46.0.0 - 5.47.255.255 tr +5.48.0.0 - 5.51.255.255 fr +5.52.0.0 - 5.52.255.255 ir +5.53.0.0 - 5.53.7.255 es +5.53.8.0 - 5.53.15.255 cz +5.53.16.0 - 5.53.31.255 ru +5.53.32.0 - 5.53.63.255 ir +5.53.64.0 - 5.53.95.255 gb +5.53.96.0 - 5.53.103.255 ae +5.53.104.0 - 5.53.111.255 ch +5.53.112.0 - 5.53.119.255 ua +5.53.120.0 - 5.53.127.255 ru +5.53.128.0 - 5.53.255.255 bg +5.54.0.0 - 5.55.255.255 gr +5.56.0.0 - 5.56.7.255 es +5.56.8.0 - 5.56.15.255 it +5.56.16.0 - 5.56.16.255 a1 +5.56.17.0 - 5.56.23.255 de +5.56.24.0 - 5.56.31.255 ua +5.56.32.0 - 5.56.39.255 hu +5.56.40.0 - 5.56.47.255 fr +5.56.48.0 - 5.56.55.255 gb +5.56.56.0 - 5.56.63.255 es +5.56.64.0 - 5.56.127.255 md +5.56.128.0 - 5.56.132.255 ir +5.56.133.0 - 5.56.133.255 us +5.56.134.0 - 5.56.135.255 gb +5.56.136.0 - 5.56.143.255 ru +5.56.144.0 - 5.56.159.255 dk +5.56.160.0 - 5.56.167.255 es +5.56.168.0 - 5.56.175.255 gb +5.56.176.0 - 5.56.255.255 de +5.57.0.0 - 5.57.7.255 lb +5.57.8.0 - 5.57.15.255 kg +5.57.16.0 - 5.57.20.128 nl +5.57.20.129 - 5.57.20.129 gb +5.57.20.130 - 5.57.23.255 nl +5.57.24.0 - 5.57.31.255 es +5.57.32.0 - 5.57.39.255 ir +5.57.40.0 - 5.57.47.255 de +5.57.48.0 - 5.57.55.255 dk +5.57.56.0 - 5.57.63.255 gb +5.57.64.0 - 5.57.71.255 ua +5.57.72.0 - 5.57.79.255 rs +5.57.80.0 - 5.57.95.255 gb +5.57.96.0 - 5.57.96.255 re +5.57.97.0 - 5.57.97.255 fr +5.57.98.0 - 5.57.98.255 re +5.57.99.0 - 5.57.100.255 fr +5.57.101.0 - 5.57.101.255 re +5.57.102.0 - 5.57.102.255 fr +5.57.103.0 - 5.57.103.255 re +5.57.104.0 - 5.57.105.255 fr +5.57.106.0 - 5.57.106.255 re +5.57.107.0 - 5.57.112.255 fr +5.57.113.0 - 5.57.113.255 re +5.57.114.0 - 5.57.127.255 fr +5.57.128.0 - 5.57.191.255 pl +5.57.192.0 - 5.57.199.255 de +5.57.200.0 - 5.57.207.255 ch +5.57.208.0 - 5.57.215.255 ae +5.57.216.0 - 5.57.223.255 ru +5.57.224.0 - 5.57.227.255 es +5.57.228.0 - 5.57.231.255 nl +5.57.232.0 - 5.57.239.255 ru +5.57.240.0 - 5.57.247.255 se +5.57.248.0 - 5.57.255.255 nl +5.58.0.0 - 5.58.255.255 ua +5.59.0.0 - 5.59.255.255 cz +5.60.0.0 - 5.60.255.255 pl +5.61.0.0 - 5.61.7.255 it +5.61.8.0 - 5.61.23.255 ru +5.61.24.0 - 5.61.25.255 ir +5.61.26.0 - 5.61.27.255 us +5.61.28.0 - 5.61.28.255 nl +5.61.29.0 - 5.61.31.255 us +5.61.32.0 - 5.61.71.255 de +5.61.72.0 - 5.61.79.255 ir +5.61.80.0 - 5.61.87.255 de +5.61.88.0 - 5.61.95.255 fi +5.61.96.0 - 5.61.111.255 bg +5.61.112.0 - 5.61.119.255 ie +5.61.120.0 - 5.61.127.255 gb +5.61.128.0 - 5.61.191.255 de +5.61.192.0 - 5.61.199.255 gb +5.61.200.0 - 5.61.215.255 es +5.61.216.0 - 5.61.223.255 it +5.61.224.0 - 5.61.231.255 ch +5.61.232.0 - 5.61.239.255 ru +5.61.240.0 - 5.61.247.255 hu +5.61.248.0 - 5.61.255.255 nl +5.62.0.0 - 5.62.5.255 gb +5.62.6.0 - 5.62.6.144 a1 +5.62.6.145 - 5.62.6.145 gb +5.62.6.146 - 5.62.6.168 a1 +5.62.6.169 - 5.62.6.169 gb +5.62.6.170 - 5.62.6.211 a1 +5.62.6.212 - 5.62.6.212 gb +5.62.6.213 - 5.62.7.255 a1 +5.62.8.0 - 5.62.8.255 gb +5.62.9.0 - 5.62.11.255 a1 +5.62.12.0 - 5.62.19.255 gb +5.62.20.0 - 5.62.21.135 a1 +5.62.21.136 - 5.62.21.136 gb +5.62.21.137 - 5.62.23.255 a1 +5.62.24.0 - 5.62.31.255 gb +5.62.32.0 - 5.62.63.255 a1 +5.62.64.0 - 5.62.71.255 de +5.62.72.0 - 5.62.79.255 it +5.62.80.0 - 5.62.91.255 im +5.62.92.0 - 5.62.93.255 gi +5.62.94.0 - 5.62.95.255 im +5.62.96.0 - 5.62.125.255 de +5.62.126.0 - 5.62.127.255 tr +5.62.128.0 - 5.62.152.255 ru +5.62.153.0 - 5.62.153.255 us +5.62.154.0 - 5.62.154.127 lv +5.62.154.128 - 5.62.154.255 lt +5.62.155.0 - 5.62.155.255 ru +5.62.156.0 - 5.62.156.255 us +5.62.157.0 - 5.62.157.255 fr +5.62.158.0 - 5.62.158.255 us +5.62.159.0 - 5.62.159.255 de +5.62.160.0 - 5.62.255.255 ru +5.63.0.0 - 5.63.7.255 ly +5.63.8.0 - 5.63.15.255 ir +5.63.16.0 - 5.63.23.255 gb +5.63.24.0 - 5.63.31.255 fr +5.63.32.0 - 5.63.63.255 tr +5.63.64.0 - 5.63.127.255 kz +5.63.128.0 - 5.63.131.255 us +5.63.132.0 - 5.63.135.255 lu +5.63.136.0 - 5.63.143.255 it +5.63.144.0 - 5.63.151.255 gb +5.63.152.0 - 5.63.159.255 ru +5.63.160.0 - 5.63.167.255 am +5.63.168.0 - 5.63.175.255 it +5.63.176.0 - 5.63.183.255 de +5.63.184.0 - 5.63.191.255 pl +5.63.192.0 - 5.63.255.255 hu +5.64.0.0 - 5.71.255.255 gb +5.72.0.0 - 5.72.255.255 ru +5.73.0.0 - 5.73.0.0 ir +5.73.0.1 - 5.73.255.255 ru +5.74.0.0 - 5.75.127.255 ir +5.75.128.0 - 5.75.255.255 ru +5.76.0.0 - 5.76.255.255 kz +5.77.0.0 - 5.77.31.255 ru +5.77.32.0 - 5.77.63.255 gb +5.77.64.0 - 5.77.127.255 it +5.77.128.0 - 5.77.255.255 am +5.78.0.0 - 5.78.255.255 ir +5.79.0.0 - 5.79.63.255 gb +5.79.64.0 - 5.79.127.255 nl +5.79.128.0 - 5.79.255.255 ru +5.80.0.0 - 5.81.255.255 gb +5.82.0.0 - 5.82.255.255 sa +5.83.0.0 - 5.83.7.255 nl +5.83.8.0 - 5.83.15.255 gb +5.83.16.0 - 5.83.23.255 ua +5.83.24.0 - 5.83.31.255 dk +5.83.32.0 - 5.83.47.255 ro +5.83.48.0 - 5.83.55.255 es +5.83.56.0 - 5.83.63.255 fi +5.83.64.0 - 5.83.95.255 es +5.83.96.0 - 5.83.103.255 gb +5.83.104.0 - 5.83.111.255 it +5.83.112.0 - 5.83.119.255 ae +5.83.120.0 - 5.83.127.255 it +5.83.128.0 - 5.83.191.255 de +5.83.192.0 - 5.83.223.255 gb +5.83.224.0 - 5.83.231.255 no +5.83.232.0 - 5.83.239.255 fr +5.83.240.0 - 5.83.255.255 ie +5.84.0.0 - 5.99.255.255 it +5.100.0.0 - 5.100.63.255 de +5.100.64.0 - 5.100.127.255 ru +5.100.128.0 - 5.100.143.255 de +5.100.144.0 - 5.100.151.255 fr +5.100.152.0 - 5.100.159.255 vg +5.100.160.0 - 5.100.167.255 ye +5.100.168.0 - 5.100.175.255 gb +5.100.176.0 - 5.100.191.255 no +5.100.192.0 - 5.100.223.255 by +5.100.224.0 - 5.100.231.255 nl +5.100.232.0 - 5.100.239.255 it +5.100.248.0 - 5.100.255.255 il +5.101.0.0 - 5.101.95.255 ru +5.101.96.0 - 5.101.108.255 nl +5.101.109.0 - 5.101.109.255 de +5.101.110.0 - 5.101.110.255 nl +5.101.111.0 - 5.101.111.255 gb +5.101.112.0 - 5.101.127.255 ee +5.101.128.0 - 5.101.135.255 ru +5.101.136.0 - 5.101.151.255 gb +5.101.152.0 - 5.101.159.255 ru +5.101.160.0 - 5.101.167.255 de +5.101.168.0 - 5.101.175.255 gb +5.101.176.0 - 5.101.191.255 ee +5.101.192.0 - 5.101.216.255 ru +5.101.217.0 - 5.101.217.127 uz +5.101.217.128 - 5.101.217.255 bg +5.101.218.0 - 5.101.218.127 ru +5.101.218.128 - 5.101.218.255 ni +5.101.219.0 - 5.101.219.127 th +5.101.219.128 - 5.101.219.255 gr +5.101.220.0 - 5.101.220.127 ge +5.101.220.128 - 5.101.220.255 lv +5.101.221.0 - 5.101.221.127 cy +5.101.221.128 - 5.101.221.255 cu +5.101.222.0 - 5.101.222.127 am +5.101.222.128 - 5.101.222.255 qa +5.101.223.0 - 5.101.255.255 ru +5.102.0.0 - 5.102.31.255 it +5.102.32.0 - 5.102.47.255 ir +5.102.48.0 - 5.102.63.255 cz +5.102.64.0 - 5.102.71.255 pl +5.102.72.0 - 5.102.75.255 fr +5.102.76.0 - 5.102.76.255 gp +5.102.77.0 - 5.102.79.255 fr +5.102.80.0 - 5.102.95.255 gb +5.102.96.0 - 5.102.127.255 ps +5.102.128.0 - 5.102.135.255 es +5.102.136.0 - 5.102.143.255 nl +5.102.144.0 - 5.102.151.255 ch +5.102.152.0 - 5.102.159.255 ru +5.102.160.0 - 5.102.167.255 de +5.102.168.0 - 5.102.169.255 gb +5.102.170.0 - 5.102.170.255 a1 +5.102.171.0 - 5.102.175.255 gb +5.102.176.0 - 5.102.183.255 ba +5.102.184.0 - 5.102.191.255 gb +5.102.192.0 - 5.102.255.255 il +5.103.0.0 - 5.103.255.255 dk +5.104.0.0 - 5.104.15.255 tr +5.104.16.0 - 5.104.23.255 cz +5.104.24.0 - 5.104.31.255 it +5.104.32.0 - 5.104.63.255 ua +5.104.64.0 - 5.104.65.255 de +5.104.66.0 - 5.104.67.255 fr +5.104.68.0 - 5.104.68.255 at +5.104.69.0 - 5.104.70.255 se +5.104.71.0 - 5.104.71.255 gb +5.104.72.0 - 5.104.79.255 iq +5.104.80.0 - 5.104.87.255 fi +5.104.88.0 - 5.104.95.255 ch +5.104.96.0 - 5.104.103.255 fr +5.104.104.0 - 5.104.111.255 de +5.104.112.0 - 5.104.127.255 nl +5.104.128.0 - 5.104.135.255 sy +5.104.136.0 - 5.104.143.255 nl +5.104.144.0 - 5.104.151.255 de +5.104.152.0 - 5.104.158.255 nl +5.104.159.0 - 5.104.159.255 ro +5.104.160.0 - 5.104.191.255 bg +5.104.192.0 - 5.104.199.255 fr +5.104.200.0 - 5.104.207.255 ru +5.104.208.0 - 5.104.215.255 pl +5.104.216.0 - 5.104.223.255 at +5.104.224.0 - 5.104.231.255 nl +5.104.232.0 - 5.104.239.255 kz +5.104.240.0 - 5.104.240.255 il +5.104.241.0 - 5.104.241.255 us +5.104.242.0 - 5.104.243.255 il +5.104.244.0 - 5.104.245.255 us +5.104.246.0 - 5.104.247.255 il +5.104.248.0 - 5.104.255.255 pl +5.105.0.0 - 5.105.255.255 ua +5.106.0.0 - 5.106.255.255 ir +5.107.0.0 - 5.107.255.255 ae +5.108.0.0 - 5.111.255.255 sa +5.112.0.0 - 5.127.255.255 ir +5.128.0.0 - 5.131.255.255 ru +5.132.0.0 - 5.132.127.255 nl +5.132.128.0 - 5.132.191.255 at +5.132.192.0 - 5.132.255.255 sa +5.133.0.0 - 5.133.7.255 ba +5.133.8.0 - 5.133.15.255 pl +5.133.16.0 - 5.133.23.255 gb +5.133.24.0 - 5.133.31.255 ps +5.133.32.0 - 5.133.39.255 ch +5.133.40.0 - 5.133.47.255 gb +5.133.48.0 - 5.133.63.255 it +5.133.128.0 - 5.133.159.255 ba +5.133.160.0 - 5.133.167.255 ge +5.133.168.0 - 5.133.191.255 gb +5.133.192.0 - 5.133.203.255 se +5.133.204.0 - 5.133.204.31 us +5.133.204.32 - 5.133.204.255 se +5.133.205.0 - 5.133.205.31 us +5.133.205.32 - 5.133.205.191 se +5.133.205.192 - 5.133.205.223 nl +5.133.205.224 - 5.133.205.255 se +5.133.206.0 - 5.133.206.31 us +5.133.206.32 - 5.133.206.191 se +5.133.206.192 - 5.133.206.223 nl +5.133.206.224 - 5.133.206.255 se +5.133.207.0 - 5.133.207.31 us +5.133.207.32 - 5.133.207.255 se +5.133.208.0 - 5.133.208.31 us +5.133.208.32 - 5.133.208.111 se +5.133.208.112 - 5.133.208.127 nl +5.133.208.128 - 5.133.208.255 se +5.133.209.0 - 5.133.209.31 us +5.133.209.32 - 5.133.209.127 se +5.133.209.128 - 5.133.209.143 nl +5.133.209.144 - 5.133.209.255 se +5.133.210.0 - 5.133.210.31 us +5.133.210.32 - 5.133.210.95 se +5.133.210.96 - 5.133.210.111 nl +5.133.210.112 - 5.133.210.255 se +5.133.211.0 - 5.133.211.31 us +5.133.211.32 - 5.133.211.207 se +5.133.211.208 - 5.133.211.223 nl +5.133.211.224 - 5.133.211.255 se +5.133.212.0 - 5.133.212.31 us +5.133.212.32 - 5.133.212.143 se +5.133.212.144 - 5.133.212.159 nl +5.133.212.160 - 5.133.212.255 se +5.133.213.0 - 5.133.213.31 us +5.133.213.32 - 5.133.213.207 se +5.133.213.208 - 5.133.213.223 nl +5.133.213.224 - 5.133.213.255 se +5.133.214.0 - 5.133.214.31 us +5.133.214.32 - 5.133.214.127 se +5.133.214.128 - 5.133.214.143 nl +5.133.214.144 - 5.133.214.255 se +5.133.215.0 - 5.133.215.31 us +5.133.215.32 - 5.133.215.223 se +5.133.215.224 - 5.133.215.255 nl +5.133.216.0 - 5.133.216.31 us +5.133.216.32 - 5.133.216.111 se +5.133.216.112 - 5.133.216.159 nl +5.133.216.160 - 5.133.216.255 se +5.133.217.0 - 5.133.217.31 us +5.133.217.32 - 5.133.217.191 se +5.133.217.192 - 5.133.217.207 nl +5.133.217.208 - 5.133.217.255 se +5.133.218.0 - 5.133.218.31 us +5.133.218.32 - 5.133.218.127 se +5.133.218.128 - 5.133.218.143 nl +5.133.218.144 - 5.133.218.255 se +5.133.219.0 - 5.133.219.31 us +5.133.219.32 - 5.133.219.143 se +5.133.219.144 - 5.133.219.159 nl +5.133.219.160 - 5.133.219.255 se +5.133.220.0 - 5.133.220.31 us +5.133.220.32 - 5.133.220.159 se +5.133.220.160 - 5.133.220.191 nl +5.133.220.192 - 5.133.220.255 se +5.133.221.0 - 5.133.221.31 us +5.133.221.32 - 5.133.221.111 se +5.133.221.112 - 5.133.221.159 nl +5.133.221.160 - 5.133.221.255 se +5.133.222.0 - 5.133.222.31 us +5.133.222.32 - 5.133.222.95 se +5.133.222.96 - 5.133.222.111 nl +5.133.222.112 - 5.133.222.255 se +5.133.223.0 - 5.133.223.15 us +5.133.223.16 - 5.133.223.175 se +5.133.223.176 - 5.133.223.191 nl +5.133.223.192 - 5.133.223.255 se +5.133.224.0 - 5.133.239.255 az +5.133.240.0 - 5.133.247.255 gb +5.133.248.0 - 5.133.255.255 pl +5.134.0.0 - 5.134.7.255 be +5.134.8.0 - 5.134.15.255 gb +5.134.16.0 - 5.134.23.255 de +5.134.24.0 - 5.134.31.255 ch +5.134.32.0 - 5.134.47.255 es +5.134.48.0 - 5.134.63.255 az +5.134.64.0 - 5.134.79.255 pl +5.134.80.0 - 5.134.87.255 am +5.134.88.0 - 5.134.95.255 ie +5.134.96.0 - 5.134.103.255 fr +5.134.104.0 - 5.134.111.255 rs +5.134.112.0 - 5.134.119.255 es +5.134.120.0 - 5.134.127.255 it +5.134.128.0 - 5.134.191.255 ir +5.134.192.0 - 5.134.199.255 se +5.134.200.0 - 5.134.207.255 sy +5.134.208.0 - 5.134.215.255 pl +5.134.216.0 - 5.134.223.255 ru +5.134.224.0 - 5.134.255.255 sy +5.135.0.0 - 5.135.4.51 fr +5.135.4.52 - 5.135.4.55 it +5.135.4.56 - 5.135.5.15 fr +5.135.5.16 - 5.135.5.19 de +5.135.5.20 - 5.135.6.127 fr +5.135.6.128 - 5.135.6.143 gb +5.135.6.144 - 5.135.8.127 fr +5.135.8.128 - 5.135.8.128 de +5.135.8.129 - 5.135.8.131 fr +5.135.8.132 - 5.135.8.135 es +5.135.8.136 - 5.135.9.79 fr +5.135.9.80 - 5.135.9.83 es +5.135.9.84 - 5.135.9.131 fr +5.135.9.132 - 5.135.9.132 de +5.135.9.133 - 5.135.9.255 fr +5.135.10.0 - 5.135.10.255 gb +5.135.11.0 - 5.135.11.223 fr +5.135.11.224 - 5.135.11.224 de +5.135.11.225 - 5.135.12.59 fr +5.135.12.60 - 5.135.12.63 nl +5.135.12.64 - 5.135.16.215 fr +5.135.16.216 - 5.135.16.223 nl +5.135.16.224 - 5.135.18.23 fr +5.135.18.24 - 5.135.18.27 de +5.135.18.28 - 5.135.18.223 fr +5.135.18.224 - 5.135.18.255 nl +5.135.19.0 - 5.135.20.103 fr +5.135.20.104 - 5.135.20.119 es +5.135.20.120 - 5.135.22.127 fr +5.135.22.128 - 5.135.22.143 de +5.135.22.144 - 5.135.27.95 fr +5.135.27.96 - 5.135.27.103 it +5.135.27.104 - 5.135.28.3 fr +5.135.28.4 - 5.135.28.7 cz +5.135.28.8 - 5.135.29.51 fr +5.135.29.52 - 5.135.29.59 de +5.135.29.60 - 5.135.30.83 fr +5.135.30.84 - 5.135.30.87 it +5.135.30.88 - 5.135.31.11 fr +5.135.31.12 - 5.135.31.19 it +5.135.31.20 - 5.135.34.203 fr +5.135.34.204 - 5.135.34.207 it +5.135.34.208 - 5.135.35.15 fr +5.135.35.16 - 5.135.35.19 it +5.135.35.20 - 5.135.35.87 fr +5.135.35.88 - 5.135.35.91 it +5.135.35.92 - 5.135.35.239 fr +5.135.35.240 - 5.135.35.243 es +5.135.35.244 - 5.135.36.35 fr +5.135.36.36 - 5.135.36.39 it +5.135.36.40 - 5.135.36.159 fr +5.135.36.160 - 5.135.36.163 es +5.135.36.164 - 5.135.37.135 fr +5.135.37.136 - 5.135.37.143 nl +5.135.37.144 - 5.135.38.75 fr +5.135.38.76 - 5.135.38.79 it +5.135.38.80 - 5.135.38.127 fr +5.135.38.128 - 5.135.38.139 it +5.135.38.140 - 5.135.38.143 fr +5.135.38.144 - 5.135.38.147 it +5.135.38.148 - 5.135.38.187 fr +5.135.38.188 - 5.135.38.191 it +5.135.38.192 - 5.135.39.187 fr +5.135.39.188 - 5.135.39.191 it +5.135.39.192 - 5.135.41.19 fr +5.135.41.20 - 5.135.41.23 it +5.135.41.24 - 5.135.42.51 fr +5.135.42.52 - 5.135.42.55 nl +5.135.42.56 - 5.135.42.71 fr +5.135.42.72 - 5.135.42.75 nl +5.135.42.76 - 5.135.42.91 fr +5.135.42.92 - 5.135.42.99 nl +5.135.42.100 - 5.135.43.107 fr +5.135.43.108 - 5.135.43.111 it +5.135.43.112 - 5.135.43.127 nl +5.135.43.128 - 5.135.45.247 fr +5.135.45.248 - 5.135.45.255 es +5.135.46.0 - 5.135.50.175 fr +5.135.50.176 - 5.135.50.191 es +5.135.50.192 - 5.135.55.191 fr +5.135.55.192 - 5.135.55.255 gb +5.135.56.0 - 5.135.59.207 fr +5.135.59.208 - 5.135.59.208 pt +5.135.59.209 - 5.135.59.229 fr +5.135.59.230 - 5.135.59.230 pt +5.135.59.231 - 5.135.61.11 fr +5.135.61.12 - 5.135.61.15 gb +5.135.61.16 - 5.135.63.179 fr +5.135.63.180 - 5.135.63.183 es +5.135.63.184 - 5.135.71.95 fr +5.135.71.96 - 5.135.71.96 de +5.135.71.97 - 5.135.76.183 fr +5.135.76.184 - 5.135.76.191 es +5.135.76.192 - 5.135.78.139 fr +5.135.78.140 - 5.135.78.143 it +5.135.78.144 - 5.135.82.147 fr +5.135.82.148 - 5.135.82.151 es +5.135.82.152 - 5.135.93.63 fr +5.135.93.64 - 5.135.93.127 es +5.135.93.128 - 5.135.104.95 fr +5.135.104.96 - 5.135.104.127 de +5.135.104.128 - 5.135.105.3 fr +5.135.105.4 - 5.135.105.7 de +5.135.105.8 - 5.135.108.127 fr +5.135.108.128 - 5.135.108.255 de +5.135.109.0 - 5.135.109.46 fr +5.135.109.47 - 5.135.109.47 fi +5.135.109.48 - 5.135.112.15 fr +5.135.112.16 - 5.135.112.23 es +5.135.112.24 - 5.135.113.15 fr +5.135.113.16 - 5.135.113.23 es +5.135.113.24 - 5.135.120.63 fr +5.135.120.64 - 5.135.120.127 es +5.135.120.128 - 5.135.192.95 fr +5.135.192.96 - 5.135.192.127 es +5.135.192.128 - 5.135.194.187 fr +5.135.194.188 - 5.135.194.191 de +5.135.194.192 - 5.135.195.183 fr +5.135.195.184 - 5.135.195.187 es +5.135.195.188 - 5.135.198.31 fr +5.135.198.32 - 5.135.198.63 it +5.135.198.64 - 5.135.198.111 fr +5.135.198.112 - 5.135.198.115 de +5.135.198.116 - 5.135.198.127 fr +5.135.198.128 - 5.135.198.135 nl +5.135.198.136 - 5.135.202.211 fr +5.135.202.212 - 5.135.202.215 pt +5.135.202.216 - 5.135.204.71 fr +5.135.204.72 - 5.135.204.75 de +5.135.204.76 - 5.135.208.139 fr +5.135.208.140 - 5.135.208.143 it +5.135.208.144 - 5.135.218.251 fr +5.135.218.252 - 5.135.218.255 it +5.135.219.0 - 5.135.219.199 fr +5.135.219.200 - 5.135.219.203 de +5.135.219.204 - 5.135.221.255 fr +5.135.222.0 - 5.135.222.3 de +5.135.222.4 - 5.135.223.143 fr +5.135.223.144 - 5.135.223.151 es +5.135.223.152 - 5.135.229.43 fr +5.135.229.44 - 5.135.229.47 it +5.135.229.48 - 5.135.229.55 fr +5.135.229.56 - 5.135.229.63 nl +5.135.229.64 - 5.135.230.95 fr +5.135.230.96 - 5.135.230.111 es +5.135.230.112 - 5.135.232.223 fr +5.135.232.224 - 5.135.232.255 es +5.135.233.0 - 5.135.240.243 fr +5.135.240.244 - 5.135.240.247 it +5.135.240.248 - 5.135.242.239 fr +5.135.242.240 - 5.135.242.247 cz +5.135.242.248 - 5.135.247.15 fr +5.135.247.16 - 5.135.247.19 de +5.135.247.20 - 5.135.249.171 fr +5.135.249.172 - 5.135.249.175 de +5.135.249.176 - 5.135.253.23 fr +5.135.253.24 - 5.135.253.31 nl +5.135.253.32 - 5.135.255.255 fr +5.136.0.0 - 5.143.255.255 ru +5.144.0.0 - 5.144.47.255 ch +5.144.48.0 - 5.144.63.255 il +5.144.64.0 - 5.144.79.255 ru +5.144.80.0 - 5.144.95.255 gb +5.144.96.0 - 5.144.127.255 ru +5.144.128.0 - 5.144.135.255 ir +5.144.136.0 - 5.144.143.255 fr +5.144.144.0 - 5.144.151.255 es +5.144.152.0 - 5.144.159.255 gb +5.144.160.0 - 5.144.175.255 it +5.144.176.0 - 5.144.183.255 gb +5.144.184.0 - 5.144.191.255 it +5.144.192.0 - 5.144.255.255 gr +5.145.0.0 - 5.145.103.255 ch +5.145.104.0 - 5.145.111.255 cz +5.145.112.0 - 5.145.119.255 ir +5.145.120.0 - 5.145.127.255 it +5.145.128.0 - 5.145.143.255 de +5.145.144.0 - 5.145.147.255 gi +5.145.148.0 - 5.145.149.141 de +5.145.149.142 - 5.145.149.142 a2 +5.145.149.143 - 5.145.151.255 de +5.145.152.0 - 5.145.159.255 no +5.145.160.0 - 5.145.167.255 ru +5.145.168.0 - 5.145.175.255 es +5.145.176.0 - 5.145.191.255 de +5.145.192.0 - 5.145.255.255 ru +5.146.0.0 - 5.147.255.255 de +5.148.0.0 - 5.148.159.255 gb +5.148.160.0 - 5.148.191.255 ch +5.148.192.0 - 5.148.255.255 hu +5.149.0.0 - 5.149.7.255 ch +5.149.8.0 - 5.149.15.255 gb +5.149.16.0 - 5.149.63.255 ch +5.149.64.0 - 5.149.95.255 ba +5.149.96.0 - 5.149.111.255 iq +5.149.112.0 - 5.149.119.255 lu +5.149.120.0 - 5.149.127.255 ua +5.149.128.0 - 5.149.135.255 at +5.149.136.0 - 5.149.143.255 be +5.149.144.0 - 5.149.159.255 ru +5.149.160.0 - 5.149.167.255 pl +5.149.168.0 - 5.149.175.255 ie +5.149.176.0 - 5.149.191.255 fr +5.149.192.0 - 5.149.199.255 pl +5.149.200.0 - 5.149.207.255 ru +5.149.208.0 - 5.149.223.255 ua +5.149.224.0 - 5.149.239.255 de +5.149.240.0 - 5.149.247.255 hu +5.149.248.0 - 5.149.249.255 nl +5.149.250.0 - 5.149.251.255 gb +5.149.252.0 - 5.149.253.255 ca +5.149.254.0 - 5.149.255.255 nl +5.150.0.0 - 5.150.127.255 gb +5.150.128.0 - 5.150.143.255 it +5.150.144.0 - 5.150.191.255 gb +5.150.192.0 - 5.150.227.255 se +5.150.228.0 - 5.150.232.255 no +5.150.233.0 - 5.150.255.255 se +5.151.0.0 - 5.151.211.255 gb +5.151.212.0 - 5.151.213.255 nl +5.151.214.0 - 5.151.235.175 gb +5.151.235.176 - 5.151.235.183 nl +5.151.235.184 - 5.151.255.255 gb +5.152.0.0 - 5.152.127.255 ge +5.152.128.0 - 5.152.159.255 it +5.152.160.0 - 5.152.167.255 pl +5.152.168.0 - 5.152.175.255 es +5.152.176.0 - 5.152.176.255 gb +5.152.177.0 - 5.152.177.255 hk +5.152.178.0 - 5.152.178.255 nl +5.152.179.0 - 5.152.179.255 us +5.152.180.0 - 5.152.180.255 au +5.152.181.0 - 5.152.191.255 us +5.152.192.0 - 5.152.223.255 gb +5.152.224.0 - 5.152.231.255 lv +5.152.232.0 - 5.152.239.255 ba +5.152.240.0 - 5.152.247.255 it +5.152.248.0 - 5.152.255.255 ae +5.153.0.0 - 5.153.63.255 nl +5.153.64.0 - 5.153.103.255 gb +5.153.104.0 - 5.153.111.255 no +5.153.112.0 - 5.153.127.255 ch +5.153.128.0 - 5.153.191.255 ua +5.153.192.0 - 5.153.231.255 gb +5.153.232.0 - 5.153.239.255 se +5.153.240.0 - 5.153.247.255 ch +5.153.248.0 - 5.153.255.255 gb +5.154.0.0 - 5.154.127.255 es +5.154.128.0 - 5.154.159.255 gb +5.154.160.0 - 5.154.167.255 de +5.154.168.0 - 5.154.189.255 ro +5.154.190.0 - 5.154.191.255 md +5.154.192.0 - 5.154.223.255 it +5.154.224.0 - 5.154.255.255 ro +5.155.0.0 - 5.155.255.255 sy +5.156.0.0 - 5.156.255.255 sa +5.157.0.0 - 5.157.14.255 se +5.157.15.0 - 5.157.15.255 nl +5.157.16.0 - 5.157.16.255 se +5.157.17.0 - 5.157.17.255 nl +5.157.18.0 - 5.157.19.255 dk +5.157.20.0 - 5.157.20.255 tr +5.157.21.0 - 5.157.21.255 dk +5.157.22.0 - 5.157.25.255 fi +5.157.26.0 - 5.157.29.255 be +5.157.30.0 - 5.157.30.255 fr +5.157.31.0 - 5.157.31.255 se +5.157.32.0 - 5.157.33.255 ru +5.157.34.0 - 5.157.37.255 ch +5.157.38.0 - 5.157.39.255 it +5.157.40.0 - 5.157.43.255 lu +5.157.44.0 - 5.157.46.255 de +5.157.47.0 - 5.157.47.255 at +5.157.48.0 - 5.157.48.255 se +5.157.49.0 - 5.157.50.255 at +5.157.51.0 - 5.157.54.255 se +5.157.55.0 - 5.157.55.255 li +5.157.56.0 - 5.157.63.255 se +5.157.64.0 - 5.157.71.255 gb +5.157.72.0 - 5.157.79.255 si +5.157.80.0 - 5.157.95.255 nl +5.157.96.0 - 5.157.127.255 it +5.157.128.0 - 5.157.255.255 ro +5.158.0.0 - 5.158.63.255 pt +5.158.64.0 - 5.158.79.255 it +5.158.80.0 - 5.158.87.255 es +5.158.88.0 - 5.158.95.255 gb +5.158.96.0 - 5.158.127.255 ru +5.158.128.0 - 5.158.191.255 de +5.158.192.0 - 5.158.199.255 no +5.158.200.0 - 5.158.207.255 fr +5.158.208.0 - 5.158.215.255 gb +5.158.216.0 - 5.158.223.255 es +5.158.224.0 - 5.158.231.255 gb +5.158.232.0 - 5.158.239.255 ru +5.158.240.0 - 5.158.255.255 fr +5.159.0.0 - 5.159.7.255 at +5.159.8.0 - 5.159.15.255 es +5.159.16.0 - 5.159.23.255 ge +5.159.24.0 - 5.159.31.255 de +5.159.32.0 - 5.159.39.255 nl +5.159.40.0 - 5.159.47.255 ie +5.159.48.0 - 5.159.55.255 ir +5.159.56.0 - 5.159.95.255 de +5.159.96.0 - 5.159.119.255 ru +5.159.120.0 - 5.159.127.255 gb +5.159.128.0 - 5.159.191.255 es +5.159.192.0 - 5.159.199.255 nl +5.159.200.0 - 5.159.215.255 gb +5.159.216.0 - 5.159.223.255 lu +5.159.224.0 - 5.159.231.255 gb +5.159.232.0 - 5.159.239.255 hu +5.159.240.0 - 5.159.247.255 es +5.159.248.0 - 5.159.255.255 tr +5.160.0.0 - 5.161.255.255 ir +5.162.0.0 - 5.162.255.255 om +5.163.0.0 - 5.163.255.255 sa +5.164.0.0 - 5.167.255.255 ru +5.168.0.0 - 5.171.255.255 it +5.172.0.0 - 5.172.31.255 ru +5.172.32.0 - 5.172.39.255 rs +5.172.40.0 - 5.172.47.255 nl +5.172.48.0 - 5.172.63.255 gb +5.172.64.0 - 5.172.127.255 it +5.172.128.0 - 5.172.143.255 ch +5.172.144.0 - 5.172.151.255 se +5.172.152.0 - 5.172.175.255 gb +5.172.176.0 - 5.172.183.255 fr +5.172.184.0 - 5.172.191.255 pl +5.172.192.0 - 5.172.207.255 gr +5.172.208.0 - 5.172.215.255 it +5.172.216.0 - 5.172.223.255 nl +5.172.224.0 - 5.174.255.255 pl +5.175.0.0 - 5.175.31.255 de +5.175.32.0 - 5.175.39.255 it +5.175.40.0 - 5.175.47.255 es +5.175.48.0 - 5.175.55.255 it +5.175.56.0 - 5.175.63.255 gb +5.175.64.0 - 5.175.76.255 it +5.175.77.0 - 5.175.79.255 eu +5.175.80.0 - 5.175.87.255 nl +5.175.88.0 - 5.175.127.255 ru +5.175.128.0 - 5.175.128.255 gb +5.175.129.0 - 5.175.132.255 de +5.175.133.0 - 5.175.133.255 au +5.175.134.0 - 5.175.135.255 de +5.175.136.0 - 5.175.136.255 gb +5.175.137.0 - 5.175.137.255 us +5.175.138.0 - 5.175.141.255 de +5.175.142.0 - 5.175.142.255 ae +5.175.143.0 - 5.175.144.255 ru +5.175.145.0 - 5.175.148.255 de +5.175.149.0 - 5.175.149.127 gb +5.175.149.128 - 5.175.149.255 rs +5.175.150.0 - 5.175.150.127 gb +5.175.150.128 - 5.175.150.255 ae +5.175.151.0 - 5.175.151.127 de +5.175.151.128 - 5.175.151.255 qa +5.175.152.0 - 5.175.152.255 gb +5.175.153.0 - 5.175.153.127 au +5.175.153.128 - 5.175.153.255 de +5.175.154.0 - 5.175.157.255 au +5.175.158.0 - 5.175.158.127 gb +5.175.158.128 - 5.175.158.255 de +5.175.159.0 - 5.175.159.255 gb +5.175.160.0 - 5.175.169.255 de +5.175.170.0 - 5.175.170.255 gb +5.175.171.0 - 5.175.171.255 us +5.175.172.0 - 5.175.173.255 de +5.175.174.0 - 5.175.174.255 us +5.175.175.0 - 5.175.175.15 de +5.175.175.16 - 5.175.175.127 us +5.175.175.128 - 5.175.176.15 de +5.175.176.16 - 5.175.176.127 ca +5.175.176.128 - 5.175.177.15 de +5.175.177.16 - 5.175.177.127 us +5.175.177.128 - 5.175.177.255 de +5.175.178.0 - 5.175.178.255 gb +5.175.179.0 - 5.175.179.15 de +5.175.179.16 - 5.175.179.127 us +5.175.179.128 - 5.175.180.15 de +5.175.180.16 - 5.175.180.127 us +5.175.180.128 - 5.175.181.255 de +5.175.182.0 - 5.175.182.255 gb +5.175.183.0 - 5.175.183.127 us +5.175.183.128 - 5.175.183.175 de +5.175.183.176 - 5.175.183.183 at +5.175.183.184 - 5.175.183.255 de +5.175.184.0 - 5.175.184.127 gb +5.175.184.128 - 5.175.184.255 kw +5.175.185.0 - 5.175.185.255 de +5.175.186.0 - 5.175.186.127 gb +5.175.186.128 - 5.175.186.199 us +5.175.186.200 - 5.175.186.207 hr +5.175.186.208 - 5.175.186.223 de +5.175.186.224 - 5.175.186.255 us +5.175.187.0 - 5.175.187.255 de +5.175.188.0 - 5.175.188.127 us +5.175.188.128 - 5.175.188.175 de +5.175.188.176 - 5.175.188.183 be +5.175.188.184 - 5.175.188.255 de +5.175.189.0 - 5.175.189.127 us +5.175.189.128 - 5.175.189.255 de +5.175.190.0 - 5.175.190.255 gb +5.175.191.0 - 5.175.191.255 us +5.175.192.0 - 5.175.194.255 de +5.175.195.0 - 5.175.195.255 gb +5.175.196.0 - 5.175.196.255 de +5.175.197.0 - 5.175.197.127 us +5.175.197.128 - 5.175.197.255 de +5.175.198.0 - 5.175.198.255 gb +5.175.199.0 - 5.175.199.127 us +5.175.199.128 - 5.175.200.255 de +5.175.201.0 - 5.175.203.255 gb +5.175.204.0 - 5.175.204.255 de +5.175.205.0 - 5.175.206.255 us +5.175.207.0 - 5.175.207.127 de +5.175.207.128 - 5.175.207.255 us +5.175.208.0 - 5.175.208.127 de +5.175.208.128 - 5.175.208.255 us +5.175.209.0 - 5.175.209.127 de +5.175.209.128 - 5.175.209.255 us +5.175.210.0 - 5.175.211.255 gb +5.175.212.0 - 5.175.212.127 de +5.175.212.128 - 5.175.212.255 us +5.175.213.0 - 5.175.215.255 de +5.175.216.0 - 5.175.216.255 us +5.175.217.0 - 5.175.217.15 ch +5.175.217.16 - 5.175.217.127 de +5.175.217.128 - 5.175.218.255 gb +5.175.219.0 - 5.175.219.255 de +5.175.220.0 - 5.175.220.15 nl +5.175.220.16 - 5.175.241.255 de +5.175.242.0 - 5.175.242.255 gb +5.175.243.0 - 5.175.255.13 de +5.175.255.14 - 5.175.255.14 us +5.175.255.15 - 5.175.255.255 de +5.176.0.0 - 5.177.255.255 tr +5.178.0.0 - 5.178.15.255 az +5.178.16.0 - 5.178.23.255 gb +5.178.24.0 - 5.178.31.255 ru +5.178.32.0 - 5.178.39.255 nl +5.178.40.0 - 5.178.44.255 it +5.178.45.0 - 5.178.45.255 gb +5.178.46.0 - 5.178.47.255 it +5.178.48.0 - 5.178.63.255 sk +5.178.64.0 - 5.178.71.255 nl +5.178.72.0 - 5.178.79.255 se +5.178.80.0 - 5.178.87.255 ru +5.178.88.0 - 5.178.95.255 it +5.178.96.0 - 5.178.111.255 gb +5.178.112.0 - 5.178.119.255 nl +5.178.120.0 - 5.178.127.255 it +5.178.128.0 - 5.178.255.255 ge +5.179.0.0 - 5.179.31.255 lv +5.179.32.0 - 5.179.71.255 ie +5.179.72.0 - 5.179.79.255 gb +5.179.80.0 - 5.179.95.255 dk +5.179.96.0 - 5.179.111.255 gb +5.179.112.0 - 5.179.119.255 se +5.179.120.0 - 5.179.127.255 fr +5.179.128.0 - 5.179.191.255 it +5.179.192.0 - 5.179.199.255 fr +5.179.200.0 - 5.179.255.255 de +5.184.0.0 - 5.185.255.255 pl +5.186.0.0 - 5.186.255.255 dk +5.187.0.0 - 5.187.7.255 de +5.187.8.0 - 5.187.15.255 ge +5.187.16.0 - 5.187.31.255 gb +5.187.32.0 - 5.187.39.255 es +5.187.40.0 - 5.187.47.255 ru +5.187.48.0 - 5.187.55.255 pl +5.187.56.0 - 5.187.63.255 ch +5.187.64.0 - 5.187.95.255 ru +5.187.96.0 - 5.187.127.255 gp +5.187.128.0 - 5.187.255.255 hu +5.188.0.0 - 5.189.127.255 ru +5.189.128.0 - 5.189.191.255 de +5.189.192.0 - 5.189.199.255 ru +5.189.200.0 - 5.189.200.127 za +5.189.200.128 - 5.189.200.255 kr +5.189.201.0 - 5.189.201.127 eg +5.189.201.128 - 5.189.201.255 id +5.189.202.0 - 5.189.202.127 pk +5.189.202.128 - 5.189.202.255 vn +5.189.203.0 - 5.189.203.127 sg +5.189.203.128 - 5.189.203.255 us +5.189.204.0 - 5.189.204.127 ir +5.189.204.128 - 5.189.204.255 us +5.189.205.0 - 5.189.205.127 ca +5.189.205.128 - 5.189.205.255 fr +5.189.206.0 - 5.189.206.127 us +5.189.206.128 - 5.189.206.255 fi +5.189.207.0 - 5.189.207.127 us +5.189.207.128 - 5.189.207.255 se +5.189.208.0 - 5.189.255.255 ru +5.190.0.0 - 5.190.255.255 ir +5.191.0.0 - 5.191.255.255 az +5.192.0.0 - 5.195.255.255 ae +5.196.0.0 - 5.196.20.143 fr +5.196.20.144 - 5.196.20.144 es +5.196.20.145 - 5.196.32.151 fr +5.196.32.152 - 5.196.32.155 de +5.196.32.156 - 5.196.32.255 fr +5.196.33.0 - 5.196.33.3 pt +5.196.33.4 - 5.196.34.47 fr +5.196.34.48 - 5.196.34.63 it +5.196.34.64 - 5.196.35.15 fr +5.196.35.16 - 5.196.35.31 it +5.196.35.32 - 5.196.35.127 fr +5.196.35.128 - 5.196.35.255 it +5.196.36.0 - 5.196.38.175 fr +5.196.38.176 - 5.196.38.179 pt +5.196.38.180 - 5.196.44.7 fr +5.196.44.8 - 5.196.44.15 nl +5.196.44.16 - 5.196.44.27 fr +5.196.44.28 - 5.196.44.31 nl +5.196.44.32 - 5.196.45.23 fr +5.196.45.24 - 5.196.45.31 de +5.196.45.32 - 5.196.52.159 fr +5.196.52.160 - 5.196.52.163 it +5.196.52.164 - 5.196.53.127 fr +5.196.53.128 - 5.196.53.135 gb +5.196.53.136 - 5.196.61.127 fr +5.196.61.128 - 5.196.61.255 it +5.196.62.0 - 5.196.62.95 fr +5.196.62.96 - 5.196.62.127 de +5.196.62.128 - 5.196.63.27 fr +5.196.63.28 - 5.196.63.31 pt +5.196.63.32 - 5.196.63.79 fr +5.196.63.80 - 5.196.63.95 de +5.196.63.96 - 5.196.63.143 fr +5.196.63.144 - 5.196.63.159 de +5.196.63.160 - 5.196.96.103 fr +5.196.96.104 - 5.196.96.107 pt +5.196.96.108 - 5.196.98.203 fr +5.196.98.204 - 5.196.98.207 es +5.196.98.208 - 5.196.98.223 de +5.196.98.224 - 5.196.100.7 fr +5.196.100.8 - 5.196.100.15 nl +5.196.100.16 - 5.196.103.135 fr +5.196.103.136 - 5.196.103.139 ch +5.196.103.140 - 5.196.103.143 se +5.196.103.144 - 5.196.103.159 fr +5.196.103.160 - 5.196.103.163 se +5.196.103.164 - 5.196.104.123 fr +5.196.104.124 - 5.196.104.127 es +5.196.104.128 - 5.196.105.231 fr +5.196.105.232 - 5.196.105.235 de +5.196.105.236 - 5.196.111.183 fr +5.196.111.184 - 5.196.111.187 es +5.196.111.188 - 5.196.111.215 fr +5.196.111.216 - 5.196.111.223 it +5.196.111.224 - 5.196.114.83 fr +5.196.114.84 - 5.196.114.87 it +5.196.114.88 - 5.196.119.255 fr +5.196.120.0 - 5.196.120.15 be +5.196.120.16 - 5.196.123.175 fr +5.196.123.176 - 5.196.123.191 be +5.196.123.192 - 5.196.123.239 fr +5.196.123.240 - 5.196.123.255 nl +5.196.124.0 - 5.196.124.63 fr +5.196.124.64 - 5.196.124.127 es +5.196.124.128 - 5.196.125.27 fr +5.196.125.28 - 5.196.125.31 pt +5.196.125.32 - 5.196.125.63 de +5.196.125.64 - 5.196.126.159 fr +5.196.126.160 - 5.196.126.163 gb +5.196.126.164 - 5.196.129.79 fr +5.196.129.80 - 5.196.129.95 de +5.196.129.96 - 5.196.129.215 fr +5.196.129.216 - 5.196.129.223 it +5.196.129.224 - 5.196.130.143 fr +5.196.130.144 - 5.196.130.159 nl +5.196.130.160 - 5.196.139.223 fr +5.196.139.224 - 5.196.139.255 be +5.196.140.0 - 5.196.140.55 fr +5.196.140.56 - 5.196.140.59 gb +5.196.140.60 - 5.196.143.79 fr +5.196.143.80 - 5.196.143.95 be +5.196.143.96 - 5.196.144.151 fr +5.196.144.152 - 5.196.144.155 fi +5.196.144.156 - 5.196.146.91 fr +5.196.146.92 - 5.196.146.95 de +5.196.146.96 - 5.196.148.255 fr +5.196.149.0 - 5.196.149.15 es +5.196.149.16 - 5.196.152.111 fr +5.196.152.112 - 5.196.152.127 es +5.196.152.128 - 5.196.154.91 fr +5.196.154.92 - 5.196.154.95 pl +5.196.154.96 - 5.196.160.119 fr +5.196.160.120 - 5.196.160.127 pt +5.196.160.128 - 5.196.161.55 fr +5.196.161.56 - 5.196.161.56 gb +5.196.161.57 - 5.196.163.79 fr +5.196.163.80 - 5.196.163.95 de +5.196.163.96 - 5.196.163.255 fr +5.196.164.0 - 5.196.164.255 es +5.196.165.0 - 5.196.170.63 fr +5.196.170.64 - 5.196.170.95 es +5.196.170.96 - 5.196.173.175 fr +5.196.173.176 - 5.196.173.191 de +5.196.173.192 - 5.196.176.127 fr +5.196.176.128 - 5.196.176.131 es +5.196.176.132 - 5.196.177.63 fr +5.196.177.64 - 5.196.177.95 es +5.196.177.96 - 5.196.179.63 fr +5.196.179.64 - 5.196.179.127 es +5.196.179.128 - 5.196.183.31 fr +5.196.183.32 - 5.196.183.47 es +5.196.183.48 - 5.196.183.183 fr +5.196.183.184 - 5.196.183.187 lu +5.196.183.188 - 5.196.183.191 pt +5.196.183.192 - 5.196.183.255 fr +5.196.184.0 - 5.196.184.3 nl +5.196.184.4 - 5.196.184.7 fr +5.196.184.8 - 5.196.184.15 it +5.196.184.16 - 5.196.184.19 nl +5.196.184.20 - 5.196.186.107 fr +5.196.186.108 - 5.196.186.111 nl +5.196.186.112 - 5.196.186.115 cz +5.196.186.116 - 5.196.186.119 be +5.196.186.120 - 5.196.186.239 fr +5.196.186.240 - 5.196.186.255 de +5.196.187.0 - 5.196.187.3 pt +5.196.187.4 - 5.196.187.159 fr +5.196.187.160 - 5.196.187.191 pt +5.196.187.192 - 5.196.187.239 fr +5.196.187.240 - 5.196.187.247 cz +5.196.187.248 - 5.196.188.255 fr +5.196.189.0 - 5.196.189.3 nl +5.196.189.4 - 5.196.190.63 fr +5.196.190.64 - 5.196.190.127 nl +5.196.190.128 - 5.196.192.67 fr +5.196.192.68 - 5.196.192.71 be +5.196.192.72 - 5.196.199.119 fr +5.196.199.120 - 5.196.199.127 cz +5.196.199.128 - 5.196.202.63 fr +5.196.202.64 - 5.196.202.67 lt +5.196.202.68 - 5.196.203.195 fr +5.196.203.196 - 5.196.203.199 es +5.196.203.200 - 5.196.203.207 be +5.196.203.208 - 5.196.203.223 de +5.196.203.224 - 5.196.204.159 fr +5.196.204.160 - 5.196.204.191 es +5.196.204.192 - 5.196.205.155 fr +5.196.205.156 - 5.196.205.159 de +5.196.205.160 - 5.196.206.15 fr +5.196.206.16 - 5.196.206.31 de +5.196.206.32 - 5.196.210.239 fr +5.196.210.240 - 5.196.210.255 nl +5.196.211.0 - 5.196.211.255 fr +5.196.212.0 - 5.196.212.3 nl +5.196.212.4 - 5.196.212.7 fr +5.196.212.8 - 5.196.212.15 nl +5.196.212.16 - 5.196.215.255 fr +5.196.216.0 - 5.196.216.63 gb +5.196.216.64 - 5.196.222.175 fr +5.196.222.176 - 5.196.222.191 es +5.196.222.192 - 5.196.238.255 fr +5.196.239.0 - 5.196.239.63 es +5.196.239.64 - 5.196.240.175 fr +5.196.240.176 - 5.196.240.191 de +5.196.240.192 - 5.196.243.239 fr +5.196.243.240 - 5.196.243.255 de +5.196.244.0 - 5.196.244.87 fr +5.196.244.88 - 5.196.244.88 es +5.196.244.89 - 5.196.244.115 fr +5.196.244.116 - 5.196.244.116 es +5.196.244.117 - 5.196.247.103 fr +5.196.247.104 - 5.196.247.111 es +5.196.247.112 - 5.196.248.83 fr +5.196.248.84 - 5.196.248.87 it +5.196.248.88 - 5.196.255.255 fr +5.197.0.0 - 5.197.255.255 az +5.198.0.0 - 5.198.127.255 gb +5.198.128.0 - 5.198.135.255 cz +5.198.136.0 - 5.198.143.255 gb +5.198.144.0 - 5.198.159.255 at +5.198.160.0 - 5.198.191.255 ir +5.198.192.0 - 5.198.223.255 fr +5.198.224.0 - 5.198.239.255 it +5.198.240.0 - 5.198.247.255 jo +5.198.248.0 - 5.199.127.255 gb +5.199.128.0 - 5.199.143.255 de +5.199.144.0 - 5.199.159.255 nl +5.199.160.0 - 5.199.175.255 lt +5.199.176.0 - 5.199.183.255 de +5.199.192.0 - 5.199.223.255 ru +5.199.224.0 - 5.199.231.255 es +5.199.232.0 - 5.199.239.255 ua +5.199.240.0 - 5.199.255.255 de +5.200.0.0 - 5.200.31.255 nl +5.200.32.0 - 5.200.63.255 ru +5.200.64.0 - 5.200.255.255 ir +5.201.0.0 - 5.201.127.255 pl +5.201.128.0 - 5.202.255.255 ir +5.203.0.0 - 5.203.255.255 gr +5.204.0.0 - 5.204.255.255 hu +5.205.0.0 - 5.205.255.255 es +5.206.0.0 - 5.206.127.255 ru +5.206.128.0 - 5.206.191.255 hu +5.206.192.0 - 5.206.199.255 dk +5.206.200.0 - 5.206.207.255 at +5.206.208.0 - 5.206.223.255 nl +5.206.224.0 - 5.206.231.255 pt +5.206.232.0 - 5.206.239.255 rs +5.206.240.0 - 5.206.255.255 pl +5.207.0.0 - 5.207.255.255 ua +5.208.0.0 - 5.223.255.255 ir +5.224.0.0 - 5.225.255.255 es +5.226.0.0 - 5.226.15.255 fr +5.226.16.0 - 5.226.31.255 es +5.226.32.0 - 5.226.39.255 se +5.226.40.0 - 5.226.47.255 nl +5.226.48.0 - 5.226.55.255 ir +5.226.56.0 - 5.226.63.255 gb +5.226.64.0 - 5.226.135.255 pl +5.226.136.0 - 5.226.143.255 gb +5.226.144.0 - 5.226.151.255 ch +5.226.152.0 - 5.226.159.255 ru +5.226.160.0 - 5.226.167.255 no +5.226.168.0 - 5.226.168.255 es +5.226.169.0 - 5.226.169.255 us +5.226.170.0 - 5.226.171.255 de +5.226.172.0 - 5.226.172.255 es +5.226.173.0 - 5.226.173.255 us +5.226.174.0 - 5.226.175.255 de +5.226.176.0 - 5.226.183.255 gb +5.226.184.0 - 5.226.191.255 es +5.226.192.0 - 5.226.255.255 tr +5.227.0.0 - 5.228.255.255 ru +5.229.0.0 - 5.229.255.255 tr +5.230.0.0 - 5.230.0.255 de +5.230.1.0 - 5.230.1.63 us +5.230.1.64 - 5.230.4.255 de +5.230.5.0 - 5.230.5.159 us +5.230.5.160 - 5.230.7.255 de +5.230.8.0 - 5.230.9.255 fr +5.230.10.0 - 5.230.128.255 de +5.230.129.0 - 5.230.129.39 us +5.230.129.40 - 5.230.129.47 de +5.230.129.48 - 5.230.129.255 us +5.230.130.0 - 5.230.131.255 de +5.230.132.0 - 5.230.132.23 us +5.230.132.24 - 5.230.132.255 de +5.230.133.0 - 5.230.133.255 gb +5.230.134.0 - 5.230.149.255 de +5.230.150.0 - 5.230.151.255 fr +5.230.152.0 - 5.230.152.255 de +5.230.153.0 - 5.230.153.255 gb +5.230.154.0 - 5.230.156.255 de +5.230.157.0 - 5.230.159.255 gb +5.230.160.0 - 5.230.255.255 de +5.231.0.0 - 5.231.1.15 gb +5.231.1.16 - 5.231.1.127 de +5.231.1.128 - 5.231.1.255 us +5.231.2.0 - 5.231.3.255 de +5.231.4.0 - 5.231.4.15 fi +5.231.4.16 - 5.231.4.127 de +5.231.4.128 - 5.231.4.255 us +5.231.5.0 - 5.231.5.127 de +5.231.5.128 - 5.231.5.255 us +5.231.6.0 - 5.231.6.127 de +5.231.6.128 - 5.231.6.255 us +5.231.7.0 - 5.231.7.255 de +5.231.8.0 - 5.231.8.255 gb +5.231.9.0 - 5.231.9.15 hr +5.231.9.16 - 5.231.9.255 ca +5.231.10.0 - 5.231.10.255 pl +5.231.11.0 - 5.231.11.255 de +5.231.12.0 - 5.231.12.15 es +5.231.12.16 - 5.231.12.127 de +5.231.12.128 - 5.231.12.255 us +5.231.13.0 - 5.231.13.15 gb +5.231.13.16 - 5.231.13.127 de +5.231.13.128 - 5.231.14.255 us +5.231.15.0 - 5.231.15.15 se +5.231.15.16 - 5.231.15.127 de +5.231.15.128 - 5.231.15.255 us +5.231.16.0 - 5.231.17.255 gb +5.231.18.0 - 5.231.18.15 ie +5.231.18.16 - 5.231.19.127 de +5.231.19.128 - 5.231.19.255 us +5.231.20.0 - 5.231.20.127 de +5.231.20.128 - 5.231.20.255 us +5.231.21.0 - 5.231.21.127 de +5.231.21.128 - 5.231.21.255 us +5.231.22.0 - 5.231.22.255 de +5.231.23.0 - 5.231.23.111 us +5.231.23.112 - 5.231.23.127 de +5.231.23.128 - 5.231.23.255 us +5.231.24.0 - 5.231.24.255 de +5.231.25.0 - 5.231.25.255 gb +5.231.26.0 - 5.231.26.127 de +5.231.26.128 - 5.231.26.255 us +5.231.27.0 - 5.231.27.15 gb +5.231.27.16 - 5.231.27.127 de +5.231.27.128 - 5.231.27.255 us +5.231.28.0 - 5.231.28.255 de +5.231.29.0 - 5.231.29.255 es +5.231.30.0 - 5.231.32.255 de +5.231.33.0 - 5.231.33.255 it +5.231.34.0 - 5.231.73.255 de +5.231.74.0 - 5.231.74.7 at +5.231.74.8 - 5.231.75.15 de +5.231.75.16 - 5.231.75.127 us +5.231.75.128 - 5.231.75.255 de +5.231.76.0 - 5.231.76.7 be +5.231.76.8 - 5.231.76.255 de +5.231.77.0 - 5.231.77.7 hr +5.231.77.8 - 5.231.77.255 de +5.231.78.0 - 5.231.78.255 gb +5.231.79.0 - 5.231.79.255 nl +5.231.80.0 - 5.231.95.255 de +5.231.96.0 - 5.231.97.255 gb +5.231.98.0 - 5.231.109.255 de +5.231.110.0 - 5.231.111.255 gb +5.231.112.0 - 5.231.236.255 de +5.231.237.0 - 5.231.237.255 gb +5.231.238.0 - 5.231.255.255 de +5.232.0.0 - 5.239.255.255 ir +5.240.0.0 - 5.243.255.255 se +5.244.0.0 - 5.247.255.255 sa +5.248.0.0 - 5.248.255.255 ua +5.249.0.0 - 5.249.127.255 pt +5.249.128.0 - 5.249.159.255 it +5.249.160.0 - 5.249.161.255 se +5.249.162.0 - 5.249.162.255 gb +5.249.163.0 - 5.249.163.255 nl +5.249.164.0 - 5.249.164.255 de +5.249.165.0 - 5.249.165.255 fr +5.249.166.0 - 5.249.167.255 se +5.249.168.0 - 5.249.175.255 ch +5.249.176.0 - 5.249.191.255 si +5.249.192.0 - 5.249.223.255 ru +5.249.224.0 - 5.249.255.255 no +5.250.0.0 - 5.250.127.255 ir +5.250.128.0 - 5.250.159.255 kz +5.250.160.0 - 5.250.167.255 fi +5.250.168.0 - 5.250.175.255 ru +5.250.176.0 - 5.250.191.255 gb +5.250.192.0 - 5.250.223.255 az +5.250.224.0 - 5.250.231.255 se +5.250.232.0 - 5.250.239.255 ru +5.250.240.0 - 5.250.255.255 tr +5.251.0.0 - 5.251.255.255 kz +5.254.0.0 - 5.254.64.255 ro +5.254.65.0 - 5.254.65.11 tr +5.254.65.12 - 5.254.65.12 ro +5.254.65.13 - 5.254.65.174 tr +5.254.65.175 - 5.254.65.175 ro +5.254.65.176 - 5.254.65.255 tr +5.254.66.0 - 5.254.88.247 ro +5.254.88.248 - 5.254.88.248 de +5.254.88.249 - 5.254.88.255 ro +5.254.89.0 - 5.254.89.255 de +5.254.90.0 - 5.254.105.151 ro +5.254.105.152 - 5.254.105.159 eg +5.254.105.160 - 5.254.106.191 ro +5.254.106.192 - 5.254.106.255 gb +5.254.107.0 - 5.254.107.127 ro +5.254.107.128 - 5.254.107.255 gb +5.254.108.0 - 5.254.108.63 us +5.254.108.64 - 5.254.108.255 ro +5.254.109.0 - 5.254.109.255 us +5.254.110.0 - 5.254.111.255 ro +5.254.112.0 - 5.254.112.255 gb +5.254.113.0 - 5.254.114.191 ro +5.254.114.192 - 5.254.114.255 us +5.254.115.0 - 5.254.127.63 ro +5.254.127.64 - 5.254.127.127 us +5.254.127.128 - 5.254.127.255 ro +5.254.128.0 - 5.254.159.255 se +5.254.160.0 - 5.254.167.255 gb +5.254.168.0 - 5.254.175.255 dk +5.254.176.0 - 5.254.183.255 ru +5.254.184.0 - 5.254.191.255 at +5.254.192.0 - 5.254.223.255 se +5.254.224.0 - 5.254.255.255 ru +5.255.0.0 - 5.255.3.255 tr +5.255.4.0 - 5.255.63.255 us +5.255.64.0 - 5.255.127.255 nl +5.255.128.0 - 5.255.135.255 be +5.255.136.0 - 5.255.143.255 gb +5.255.144.0 - 5.255.151.255 es +5.255.152.0 - 5.255.159.255 nl +5.255.160.0 - 5.255.191.255 ua +5.255.192.0 - 5.255.194.255 ru +5.255.195.0 - 5.255.195.31 tr +5.255.195.32 - 5.255.255.255 ru +6.0.0.0 - 8.0.15.255 us +8.0.16.0 - 8.0.16.0 de +8.0.16.1 - 8.0.17.255 us +8.0.18.0 - 8.0.18.0 de +8.0.18.1 - 8.0.23.255 us +8.0.24.0 - 8.0.24.0 gb +8.0.24.1 - 8.0.25.255 us +8.0.26.0 - 8.0.26.0 gb +8.0.26.1 - 8.0.115.255 us +8.0.116.0 - 8.0.116.0 de +8.0.116.1 - 8.7.243.255 us +8.7.244.0 - 8.7.244.255 ca +8.7.245.0 - 8.14.223.255 us 8.14.224.0 - 8.14.255.255 mx -8.15.0.0 - 8.21.35.255 us +8.15.0.0 - 8.18.127.255 us +8.18.128.0 - 8.18.128.255 ca +8.18.129.0 - 8.18.135.255 us +8.18.136.0 - 8.18.143.255 ca +8.18.144.0 - 8.18.171.255 us +8.18.172.0 - 8.18.172.255 ca +8.18.173.0 - 8.20.109.255 us +8.20.110.0 - 8.20.110.255 ca +8.20.111.0 - 8.20.116.255 us +8.20.117.0 - 8.20.117.255 nl +8.20.118.0 - 8.21.35.255 us 8.21.36.0 - 8.21.39.255 ca -8.21.40.0 - 8.21.49.255 us -8.21.50.0 - 8.21.50.255 ca -8.21.51.0 - 8.24.223.255 us -8.24.224.0 - 8.24.236.255 ca -8.24.237.0 - 9.19.255.255 us +8.21.40.0 - 8.21.40.255 us +8.21.41.0 - 8.21.41.255 ca +8.21.42.0 - 8.21.50.255 us +8.21.51.0 - 8.21.51.255 ca +8.21.52.0 - 8.23.199.255 us +8.23.200.0 - 8.23.200.255 gu +8.23.201.0 - 8.24.2.255 us +8.24.3.0 - 8.24.3.255 ca +8.24.4.0 - 8.24.6.255 us +8.24.7.0 - 8.24.15.255 ca +8.24.16.0 - 8.26.17.255 us +8.26.18.0 - 8.26.19.255 vi +8.26.20.0 - 8.26.93.255 us +8.26.94.0 - 8.26.94.255 ca +8.26.95.0 - 8.28.4.255 us +8.28.5.0 - 8.28.5.255 gb +8.28.6.0 - 8.29.223.255 us +8.29.224.0 - 8.29.225.255 ca +8.29.226.0 - 8.30.207.255 us +8.30.208.0 - 8.30.215.255 ca +8.30.216.0 - 8.33.95.255 us +8.33.96.0 - 8.33.103.255 ca +8.33.104.0 - 8.33.127.255 us +8.33.128.0 - 8.33.137.177 ca +8.33.137.178 - 8.33.137.178 fr +8.33.137.179 - 8.33.137.255 ca +8.33.138.0 - 8.87.136.65 us +8.87.136.66 - 8.87.136.66 es +8.87.136.67 - 9.19.255.255 us 9.20.0.0 - 9.20.127.255 gb 9.20.128.0 - 9.255.255.255 us -11.0.0.0 - 12.1.52.63 us -12.1.52.64 - 12.1.52.71 pr -12.1.52.72 - 12.4.123.79 us -12.4.123.80 - 12.4.123.87 ca -12.4.123.88 - 12.4.186.151 us -12.4.186.152 - 12.4.186.159 pr -12.4.186.160 - 12.5.76.39 us -12.5.76.40 - 12.5.76.47 ca -12.5.76.48 - 12.5.77.111 us -12.5.77.112 - 12.5.77.127 ca -12.5.77.128 - 12.6.100.255 us -12.6.101.0 - 12.6.101.7 pr -12.6.101.8 - 12.8.31.255 us -12.8.32.0 - 12.8.32.15 vi -12.8.32.16 - 12.8.183.255 us +11.0.0.0 - 12.8.183.255 us 12.8.184.0 - 12.8.184.255 pr -12.8.185.0 - 12.14.128.135 us -12.14.128.136 - 12.14.128.151 pr -12.14.128.152 - 12.14.206.15 us -12.14.206.16 - 12.14.206.23 pr -12.14.206.24 - 12.16.39.255 us +12.8.185.0 - 12.16.39.255 us 12.16.40.0 - 12.16.41.255 pr -12.16.42.0 - 12.18.45.223 us -12.18.45.224 - 12.18.45.231 pr -12.18.45.232 - 12.19.193.247 us -12.19.193.248 - 12.19.193.255 pr -12.19.194.0 - 12.19.194.39 us -12.19.194.40 - 12.19.194.47 pr -12.19.194.48 - 12.19.194.55 us -12.19.194.56 - 12.19.194.63 pr -12.19.194.64 - 12.19.195.7 us -12.19.195.8 - 12.19.195.15 pr -12.19.195.16 - 12.19.209.7 us -12.19.209.8 - 12.19.209.15 pr -12.19.209.16 - 12.20.232.79 us -12.20.232.80 - 12.20.232.87 pr -12.20.232.88 - 12.21.13.255 us +12.16.42.0 - 12.21.13.255 us 12.21.14.0 - 12.21.15.255 pr -12.21.16.0 - 12.21.40.255 us -12.21.41.0 - 12.21.41.7 pr -12.21.41.8 - 12.21.179.63 us -12.21.179.64 - 12.21.179.71 pr -12.21.179.72 - 12.22.57.183 us -12.22.57.184 - 12.22.57.191 pr -12.22.57.192 - 12.24.137.143 us -12.24.137.144 - 12.24.137.159 vi -12.24.137.160 - 12.24.140.255 us +12.21.16.0 - 12.24.140.255 us 12.24.141.0 - 12.24.141.255 pr -12.24.142.0 - 12.24.152.111 us -12.24.152.112 - 12.24.152.127 vi -12.24.152.128 - 12.24.236.207 us -12.24.236.208 - 12.24.236.223 pr -12.24.236.224 - 12.25.129.47 us -12.25.129.48 - 12.25.129.55 pr -12.25.129.56 - 12.28.138.135 us -12.28.138.136 - 12.28.138.143 ca -12.28.138.144 - 12.31.210.119 us -12.31.210.120 - 12.31.210.127 pr -12.31.210.128 - 12.33.42.87 us -12.33.42.88 - 12.33.42.95 pr -12.33.42.96 - 12.35.19.175 us -12.35.19.176 - 12.35.19.183 pr -12.35.19.184 - 12.35.134.87 us -12.35.134.88 - 12.35.134.95 pr -12.35.134.96 - 12.35.148.31 us -12.35.148.32 - 12.35.148.47 pr -12.35.148.48 - 12.35.148.63 vi -12.35.148.64 - 12.35.148.143 pr -12.35.148.144 - 12.35.148.159 us -12.35.148.160 - 12.35.148.175 pr -12.35.148.176 - 12.35.148.183 vi -12.35.148.184 - 12.35.148.191 us -12.35.148.192 - 12.35.148.239 vi -12.35.148.240 - 12.35.149.255 pr -12.35.150.0 - 12.35.150.79 vi -12.35.150.80 - 12.35.150.111 us -12.35.150.112 - 12.35.150.127 pr -12.35.150.128 - 12.35.150.183 vi -12.35.150.184 - 12.35.150.199 pr -12.35.150.200 - 12.35.150.215 us -12.35.150.216 - 12.35.150.239 vi -12.35.150.240 - 12.35.150.255 pr -12.35.151.0 - 12.35.151.31 us -12.35.151.32 - 12.35.151.87 vi -12.35.151.88 - 12.35.151.95 us -12.35.151.96 - 12.35.151.255 pr -12.35.152.0 - 12.36.41.103 us -12.36.41.104 - 12.36.41.111 pr -12.36.41.112 - 12.36.241.239 us -12.36.241.240 - 12.36.241.247 pr -12.36.241.248 - 12.37.188.55 us -12.37.188.56 - 12.37.188.63 pr -12.37.188.64 - 12.37.209.159 us -12.37.209.160 - 12.37.209.167 pr -12.37.209.168 - 12.38.131.183 us -12.38.131.184 - 12.38.131.191 ca -12.38.131.192 - 12.41.127.255 us -12.41.128.0 - 12.41.130.255 pr -12.41.131.0 - 12.41.131.15 vi -12.41.131.16 - 12.41.131.127 pr -12.41.131.128 - 12.41.131.143 vi -12.41.131.144 - 12.41.131.151 us -12.41.131.152 - 12.41.131.159 vi -12.41.131.160 - 12.41.131.175 us -12.41.131.176 - 12.41.131.191 pr -12.41.131.192 - 12.41.131.199 us -12.41.131.200 - 12.41.131.207 pr -12.41.131.208 - 12.41.131.231 vi -12.41.131.232 - 12.41.131.255 us -12.41.132.0 - 12.41.132.15 pr -12.41.132.16 - 12.41.132.31 us -12.41.132.32 - 12.41.132.63 pr -12.41.132.64 - 12.41.132.71 us -12.41.132.72 - 12.41.132.95 vi -12.41.132.96 - 12.41.132.103 pr -12.41.132.104 - 12.41.132.119 vi -12.41.132.120 - 12.41.132.127 pr -12.41.132.128 - 12.41.132.175 vi -12.41.132.176 - 12.41.132.191 pr -12.41.132.192 - 12.41.132.199 vi -12.41.132.200 - 12.41.132.207 pr -12.41.132.208 - 12.41.132.231 vi -12.41.132.232 - 12.41.134.135 pr -12.41.134.136 - 12.41.134.143 us -12.41.134.144 - 12.41.134.159 vi +12.24.142.0 - 12.35.150.223 us +12.35.150.224 - 12.35.150.239 vi +12.35.150.240 - 12.35.150.255 us +12.35.151.0 - 12.35.151.255 vi +12.35.152.0 - 12.41.133.255 us +12.41.134.0 - 12.41.134.127 pr +12.41.134.128 - 12.41.134.159 us 12.41.134.160 - 12.41.134.175 pr -12.41.134.176 - 12.41.134.183 vi -12.41.134.184 - 12.41.134.191 us -12.41.134.192 - 12.41.134.255 vi -12.41.135.0 - 12.41.135.255 pr -12.41.136.0 - 12.42.39.239 us -12.42.39.240 - 12.42.39.247 pr -12.42.39.248 - 12.42.183.199 us -12.42.183.200 - 12.42.183.207 pr -12.42.183.208 - 12.43.31.255 us -12.43.32.0 - 12.43.35.255 pr -12.43.36.0 - 12.47.12.87 us -12.47.12.88 - 12.47.12.95 pr -12.47.12.96 - 12.47.144.55 us -12.47.144.56 - 12.47.144.63 pr -12.47.144.64 - 12.47.144.87 us -12.47.144.88 - 12.47.144.95 pr -12.47.144.96 - 12.48.144.191 us -12.48.144.192 - 12.48.144.199 pr -12.48.144.200 - 12.63.178.59 us -12.63.178.60 - 12.63.178.63 ca -12.63.178.64 - 12.68.117.71 us -12.68.117.72 - 12.68.117.79 pr -12.68.117.80 - 12.70.153.31 us -12.70.153.32 - 12.70.153.39 pr -12.70.153.40 - 12.70.153.47 us -12.70.153.48 - 12.70.153.71 pr -12.70.153.72 - 12.106.65.79 us -12.106.65.80 - 12.106.65.87 pr -12.106.65.88 - 12.109.8.111 us -12.109.8.112 - 12.109.8.119 pr -12.109.8.120 - 12.129.198.255 us -12.129.199.0 - 12.129.199.31 de -12.129.199.32 - 12.129.251.151 us -12.129.251.152 - 12.129.251.159 de -12.129.251.160 - 12.130.81.95 us -12.130.81.96 - 12.130.81.103 ca -12.130.81.104 - 12.132.43.175 us -12.132.43.176 - 12.132.43.183 vi -12.132.43.184 - 12.132.176.79 us -12.132.176.80 - 12.132.176.87 pr -12.132.176.88 - 12.139.13.135 us -12.139.13.136 - 12.139.13.143 pr -12.139.13.144 - 12.139.87.255 us -12.139.88.0 - 12.139.88.7 pr -12.139.88.8 - 12.144.82.255 us -12.144.83.0 - 12.144.85.39 bo -12.144.85.40 - 12.144.85.47 us -12.144.85.48 - 12.144.85.63 bo -12.144.85.64 - 12.144.85.127 us -12.144.85.128 - 12.144.87.255 bo -12.144.88.0 - 12.147.40.223 us -12.147.40.224 - 12.147.40.231 pr -12.147.40.232 - 12.148.98.191 us -12.148.98.192 - 12.148.98.199 pr -12.148.98.200 - 12.149.137.255 us -12.149.138.0 - 12.149.138.127 pr -12.149.138.128 - 12.149.149.7 us -12.149.149.8 - 12.149.149.15 pr -12.149.149.16 - 12.153.39.167 us -12.153.39.168 - 12.153.39.175 pr -12.153.39.176 - 12.153.58.207 us -12.153.58.208 - 12.153.58.215 pr -12.153.58.216 - 12.153.220.111 us -12.153.220.112 - 12.153.220.119 pr -12.153.220.120 - 12.153.220.199 us -12.153.220.200 - 12.153.220.215 pr -12.153.220.216 - 12.155.201.239 us -12.155.201.240 - 12.155.201.247 pr -12.155.201.248 - 12.156.182.23 us -12.156.182.24 - 12.156.182.31 vi -12.156.182.32 - 12.156.182.255 us -12.156.183.0 - 12.156.183.15 vi -12.156.183.16 - 12.156.184.63 us -12.156.184.64 - 12.156.184.127 vi -12.156.184.128 - 12.156.185.159 us -12.156.185.160 - 12.156.185.175 pr -12.156.185.176 - 12.156.185.191 us -12.156.185.192 - 12.156.185.207 pr -12.156.185.208 - 12.156.185.223 vi -12.156.185.224 - 12.156.188.63 us -12.156.188.64 - 12.156.188.127 vi -12.156.188.128 - 12.156.189.47 us -12.156.189.48 - 12.156.189.63 vi -12.156.189.64 - 12.157.149.239 us -12.157.149.240 - 12.157.149.247 pr -12.157.149.248 - 12.158.15.31 us -12.158.15.32 - 12.158.15.39 pr -12.158.15.40 - 12.158.226.39 us -12.158.226.40 - 12.158.226.47 pr -12.158.226.48 - 12.159.5.111 us -12.159.5.112 - 12.159.5.127 pr -12.159.5.128 - 12.159.182.15 us -12.159.182.16 - 12.159.182.23 pr -12.159.182.24 - 12.160.14.151 us -12.160.14.152 - 12.160.14.159 pr -12.160.14.160 - 12.162.38.135 us -12.162.38.136 - 12.162.38.143 pr -12.162.38.144 - 12.164.121.23 us -12.164.121.24 - 12.164.121.31 vi -12.164.121.32 - 12.164.129.55 us -12.164.129.56 - 12.164.129.63 pr -12.164.129.64 - 12.164.176.215 us -12.164.176.216 - 12.164.176.223 pr -12.164.176.224 - 12.164.185.183 us -12.164.185.184 - 12.164.185.191 pr -12.164.185.192 - 12.165.83.207 us -12.165.83.208 - 12.165.83.231 vi -12.165.83.232 - 12.165.84.23 us -12.165.84.24 - 12.165.84.31 vi -12.165.84.32 - 12.165.84.39 us -12.165.84.40 - 12.165.84.47 vi -12.165.84.48 - 12.169.60.255 us -12.169.61.0 - 12.169.61.7 pr -12.169.61.8 - 12.170.193.79 us -12.170.193.80 - 12.170.193.95 vi -12.170.193.96 - 12.170.207.111 us -12.170.207.112 - 12.170.207.127 vi -12.170.207.128 - 12.174.14.87 us -12.174.14.88 - 12.174.14.95 pr -12.174.14.96 - 12.174.223.255 us +12.41.134.176 - 12.69.139.255 us +12.69.140.0 - 12.69.140.255 mx +12.69.141.0 - 12.148.60.255 us +12.148.61.0 - 12.148.61.255 ca +12.148.62.0 - 12.156.185.151 us +12.156.185.152 - 12.156.185.159 vi +12.156.185.160 - 12.174.223.255 us 12.174.224.0 - 12.174.227.255 pr -12.174.228.0 - 12.174.228.255 us -12.174.229.0 - 12.174.229.127 vi -12.174.229.128 - 12.174.229.135 us -12.174.229.136 - 12.174.229.143 vi -12.174.229.144 - 12.174.229.151 us -12.174.229.152 - 12.174.229.167 vi -12.174.229.168 - 12.174.229.175 pr -12.174.229.176 - 12.174.229.183 vi -12.174.229.184 - 12.174.229.191 us -12.174.229.192 - 12.174.230.63 pr -12.174.230.64 - 12.174.230.71 us -12.174.230.72 - 12.174.230.79 vi -12.174.230.80 - 12.174.230.87 pr -12.174.230.88 - 12.174.230.111 us -12.174.230.112 - 12.174.230.127 vi -12.174.230.128 - 12.174.231.15 pr -12.174.231.16 - 12.174.231.47 us -12.174.231.48 - 12.174.231.63 vi -12.174.231.64 - 12.174.231.71 us -12.174.231.72 - 12.174.231.87 vi -12.174.231.88 - 12.174.231.95 us -12.174.231.96 - 12.174.231.103 vi -12.174.231.104 - 12.174.231.127 us -12.174.231.128 - 12.174.231.135 vi -12.174.231.136 - 12.174.231.143 us -12.174.231.144 - 12.174.231.151 pr -12.174.231.152 - 12.174.231.159 vi -12.174.231.160 - 12.174.231.167 pr -12.174.231.168 - 12.174.231.175 us -12.174.231.176 - 12.174.231.191 vi -12.174.231.192 - 12.174.231.199 pr -12.174.231.200 - 12.174.231.207 us -12.174.231.208 - 12.174.231.231 vi -12.174.231.232 - 12.174.231.239 us -12.174.231.240 - 12.174.231.255 vi -12.174.232.0 - 12.174.239.255 us -12.174.240.0 - 12.174.240.151 vi -12.174.240.152 - 12.174.240.159 us -12.174.240.160 - 12.174.240.183 vi -12.174.240.184 - 12.174.241.255 pr -12.174.242.0 - 12.174.242.7 us -12.174.242.8 - 12.174.242.255 vi -12.174.243.0 - 12.174.243.127 us -12.174.243.128 - 12.174.243.135 pr -12.174.243.136 - 12.174.243.167 vi -12.174.243.168 - 12.174.243.175 us -12.174.243.176 - 12.174.243.183 pr -12.174.243.184 - 12.174.243.207 us -12.174.243.208 - 12.174.243.215 vi -12.174.243.216 - 12.174.243.223 us -12.174.243.224 - 12.174.243.255 pr -12.174.244.0 - 12.174.247.15 us -12.174.247.16 - 12.174.247.23 pr -12.174.247.24 - 12.174.247.31 us -12.174.247.32 - 12.174.247.39 vi -12.174.247.40 - 12.174.247.55 pr -12.174.247.56 - 12.174.247.111 us -12.174.247.112 - 12.174.247.119 vi -12.174.247.120 - 12.174.247.127 pr -12.174.247.128 - 12.174.247.223 us -12.174.247.224 - 12.174.247.239 pr -12.174.247.240 - 12.174.247.255 us -12.174.248.0 - 12.174.251.255 vi -12.174.252.0 - 12.174.252.191 pr -12.174.252.192 - 12.174.252.199 us -12.174.252.200 - 12.174.252.215 vi -12.174.252.216 - 12.174.252.231 us -12.174.252.232 - 12.174.253.159 pr -12.174.253.160 - 12.174.253.167 vi -12.174.253.168 - 12.174.253.175 us -12.174.253.176 - 12.174.253.207 vi -12.174.253.208 - 12.174.253.255 us -12.174.254.0 - 12.174.254.7 vi -12.174.254.8 - 12.174.254.15 us -12.174.254.16 - 12.174.254.31 vi -12.174.254.32 - 12.174.254.63 pr -12.174.254.64 - 12.174.254.79 us -12.174.254.80 - 12.174.254.103 vi -12.174.254.104 - 12.174.254.111 us -12.174.254.112 - 12.174.254.127 vi -12.174.254.128 - 12.174.254.255 pr -12.174.255.0 - 12.175.104.183 us -12.175.104.184 - 12.175.104.199 pr -12.175.104.200 - 12.175.168.127 us -12.175.168.128 - 12.175.168.135 pr -12.175.168.136 - 12.176.116.151 us -12.176.116.152 - 12.176.116.159 pr -12.176.116.160 - 12.176.154.231 us -12.176.154.232 - 12.176.154.239 pr -12.176.154.240 - 12.177.111.47 us -12.177.111.48 - 12.177.111.55 pr -12.177.111.56 - 12.177.111.207 us -12.177.111.208 - 12.177.111.215 pr -12.177.111.216 - 12.177.197.167 us -12.177.197.168 - 12.177.197.175 pr -12.177.197.176 - 12.179.166.151 us -12.179.166.152 - 12.179.166.159 pr -12.179.166.160 - 12.180.47.247 us -12.180.47.248 - 12.180.47.255 pr -12.180.48.0 - 12.180.154.111 us -12.180.154.112 - 12.180.154.119 pr -12.180.154.120 - 12.182.55.207 us -12.182.55.208 - 12.182.55.215 pr -12.182.55.216 - 12.185.184.175 us -12.185.184.176 - 12.185.184.183 pr -12.185.184.184 - 12.186.232.167 us -12.186.232.168 - 12.186.232.175 pr -12.186.232.176 - 12.186.246.207 us -12.186.246.208 - 12.186.246.215 pr -12.186.246.216 - 12.187.105.207 us -12.187.105.208 - 12.187.105.215 pr -12.187.105.216 - 12.187.105.223 us -12.187.105.224 - 12.187.105.247 pr -12.187.105.248 - 12.190.5.135 us -12.190.5.136 - 12.190.5.143 pr -12.190.5.144 - 12.190.120.7 us -12.190.120.8 - 12.190.120.15 pr -12.190.120.16 - 12.191.201.255 us -12.191.202.0 - 12.191.202.63 vi -12.191.202.64 - 12.191.206.95 us -12.191.206.96 - 12.191.206.127 vi -12.191.206.128 - 12.192.55.255 us -12.192.56.0 - 12.192.59.255 pr -12.192.60.0 - 12.192.60.143 us -12.192.60.144 - 12.192.60.159 pr -12.192.60.160 - 12.192.60.191 vi -12.192.60.192 - 12.192.62.255 us -12.192.63.0 - 12.192.63.255 pr -12.192.64.0 - 12.192.106.151 us -12.192.106.152 - 12.192.106.159 pr -12.192.106.160 - 12.192.106.231 us -12.192.106.232 - 12.192.106.239 pr -12.192.106.240 - 12.192.106.255 us -12.192.107.0 - 12.192.107.7 pr -12.192.107.8 - 12.196.51.255 us -12.196.52.0 - 12.196.52.191 pr -12.196.52.192 - 12.196.52.223 vi -12.196.52.224 - 12.196.52.239 us -12.196.52.240 - 12.196.53.255 pr -12.196.54.0 - 12.196.55.255 us -12.196.56.0 - 12.196.59.255 pr -12.196.60.0 - 12.196.62.255 vi -12.196.63.0 - 12.196.63.31 us -12.196.63.32 - 12.196.63.39 pr -12.196.63.40 - 12.196.63.47 us -12.196.63.48 - 12.196.63.55 pr -12.196.63.56 - 12.196.63.63 us -12.196.63.64 - 12.196.63.87 pr -12.196.63.88 - 12.196.63.95 vi -12.196.63.96 - 12.196.63.111 us -12.196.63.112 - 12.196.63.127 pr -12.196.63.128 - 12.196.63.255 vi -12.196.64.0 - 12.197.0.63 us -12.197.0.64 - 12.197.0.127 pr -12.197.0.128 - 12.197.47.255 us -12.197.48.0 - 12.197.63.255 vi -12.197.64.0 - 12.200.56.207 us -12.200.56.208 - 12.200.56.215 pr -12.200.56.216 - 12.204.7.255 us -12.204.8.0 - 12.204.8.23 vi -12.204.8.24 - 12.204.8.31 pr -12.204.8.32 - 12.204.8.39 us -12.204.8.40 - 12.204.8.47 pr -12.204.8.48 - 12.204.8.103 vi -12.204.8.104 - 12.204.8.119 pr -12.204.8.120 - 12.204.8.151 vi -12.204.8.152 - 12.204.8.159 pr -12.204.8.160 - 12.204.8.175 vi -12.204.8.176 - 12.204.8.183 pr -12.204.8.184 - 12.204.8.191 vi -12.204.8.192 - 12.204.8.255 pr -12.204.9.0 - 12.204.9.31 vi -12.204.9.32 - 12.204.9.39 us -12.204.9.40 - 12.204.9.79 vi -12.204.9.80 - 12.204.9.95 pr -12.204.9.96 - 12.204.9.111 us -12.204.9.112 - 12.204.9.119 vi -12.204.9.120 - 12.204.9.127 pr -12.204.9.128 - 12.204.9.143 us -12.204.9.144 - 12.204.10.143 pr -12.204.10.144 - 12.204.10.159 vi -12.204.10.160 - 12.204.11.167 pr -12.204.11.168 - 12.204.11.175 vi -12.204.11.176 - 12.204.12.223 pr -12.204.12.224 - 12.204.12.255 us -12.204.13.0 - 12.204.13.31 vi -12.204.13.32 - 12.204.13.39 us -12.204.13.40 - 12.204.13.47 vi -12.204.13.48 - 12.204.13.71 pr -12.204.13.72 - 12.204.13.103 vi -12.204.13.104 - 12.204.13.119 us -12.204.13.120 - 12.204.13.191 vi -12.204.13.192 - 12.204.13.207 us -12.204.13.208 - 12.204.13.223 vi -12.204.13.224 - 12.204.13.255 us -12.204.14.0 - 12.204.14.127 pr -12.204.14.128 - 12.204.15.231 us -12.204.15.232 - 12.204.15.239 pr -12.204.15.240 - 12.206.123.159 us -12.206.123.160 - 12.206.123.175 nl -12.206.123.176 - 12.208.168.7 us -12.208.168.8 - 12.208.168.15 vi -12.208.168.16 - 12.230.69.127 us -12.230.69.128 - 12.230.69.191 pr -12.230.69.192 - 12.233.120.87 us -12.233.120.88 - 12.233.120.95 pr -12.233.120.96 - 12.233.160.199 us -12.233.160.200 - 12.233.160.207 pr -12.233.160.208 - 12.236.106.255 us -12.236.107.0 - 12.236.107.7 pr -12.236.107.8 - 12.236.166.31 us -12.236.166.32 - 12.236.166.39 pr -12.236.166.40 - 12.237.88.39 us -12.237.88.40 - 12.237.88.47 pr -12.237.88.48 - 12.239.26.55 us -12.239.26.56 - 12.239.26.63 pr -12.239.26.64 - 12.239.26.191 us -12.239.26.192 - 12.239.26.207 pr -12.239.26.208 - 12.239.149.159 us -12.239.149.160 - 12.239.149.167 pr -12.239.149.168 - 12.239.222.247 us -12.239.222.248 - 12.239.222.255 pr -12.239.223.0 - 13.255.255.255 us +12.174.228.0 - 12.174.242.23 us +12.174.242.24 - 12.174.242.31 vi +12.174.242.32 - 12.174.252.255 us +12.174.253.0 - 12.174.253.255 pr +12.174.254.0 - 12.204.8.255 us +12.204.9.0 - 12.204.9.15 vi +12.204.9.16 - 12.204.9.63 us +12.204.9.64 - 12.204.9.71 vi +12.204.9.72 - 12.205.85.255 us +12.205.86.0 - 12.205.86.255 pr +12.205.87.0 - 12.205.95.255 us +12.205.96.0 - 12.205.96.255 pr +12.205.97.0 - 12.205.101.255 us +12.205.102.0 - 12.205.102.255 pr +12.205.103.0 - 13.16.137.9 us +13.16.137.10 - 13.16.137.11 eu +13.16.137.12 - 13.17.124.255 us +13.17.125.0 - 13.17.125.255 gb +13.17.126.0 - 13.21.124.255 us +13.21.125.0 - 13.21.125.255 gb +13.21.126.0 - 13.66.255.255 us +13.67.0.0 - 13.67.127.255 sg +13.67.128.0 - 13.68.255.255 us +13.69.0.0 - 13.69.127.255 nl +13.69.128.0 - 13.69.255.255 ie +13.70.0.0 - 13.70.63.255 hk +13.70.64.0 - 13.70.191.255 au +13.70.192.0 - 13.70.255.255 ie +13.71.0.0 - 13.71.127.255 in +13.71.128.0 - 13.71.191.255 jp +13.71.192.0 - 13.72.191.255 us +13.72.192.0 - 13.72.223.255 hk +13.72.224.0 - 13.72.255.255 au +13.73.0.0 - 13.73.31.255 jp +13.73.32.0 - 13.73.95.255 us +13.73.96.0 - 13.73.127.255 au +13.73.128.0 - 13.73.191.255 nl +13.73.192.0 - 13.73.207.255 au +13.73.208.0 - 13.73.223.255 us +13.73.224.0 - 13.73.231.255 nl +13.73.232.0 - 13.73.239.255 jp +13.73.240.0 - 13.73.255.255 us +13.74.0.0 - 13.74.255.255 ie +13.75.0.0 - 13.75.127.255 hk +13.75.128.0 - 13.75.255.255 au +13.76.0.0 - 13.76.255.255 sg +13.77.0.0 - 13.77.63.255 au +13.77.64.0 - 13.77.255.255 us +13.78.0.0 - 13.78.127.255 jp +13.78.128.0 - 13.78.255.255 us +13.79.0.0 - 13.79.255.255 ie +13.80.0.0 - 13.81.255.255 nl +13.82.0.0 - 13.86.255.255 us +13.87.0.0 - 13.87.127.255 gb +13.87.128.0 - 13.88.199.255 us +13.88.200.0 - 13.88.207.255 nl +13.88.208.0 - 13.88.223.255 hk +13.88.224.0 - 13.88.255.255 ca +13.89.0.0 - 13.92.255.255 us +13.93.0.0 - 13.93.127.255 nl +13.93.128.0 - 13.93.255.255 us +13.94.0.0 - 13.94.63.255 hk +13.94.64.0 - 13.94.127.255 ie +13.94.128.0 - 13.95.255.255 nl +13.96.0.0 - 13.105.255.255 us +13.106.0.0 - 13.106.3.255 in +13.106.4.0 - 13.106.5.255 sg +13.106.6.0 - 13.106.7.255 jp +13.106.8.0 - 13.106.9.255 ca +13.106.10.0 - 13.106.17.255 gb +13.106.18.0 - 13.106.19.255 jp +13.106.20.0 - 13.106.39.255 us +13.106.40.0 - 13.106.41.255 jp +13.106.42.0 - 13.106.43.255 ca +13.106.44.0 - 13.106.45.255 hk +13.106.46.0 - 13.106.47.255 us +13.106.48.0 - 13.106.49.255 ca +13.106.50.0 - 13.106.57.255 us +13.106.58.0 - 13.106.61.255 au +13.106.62.0 - 13.255.255.255 us 14.0.0.0 - 14.0.7.255 cn 14.0.8.0 - 14.0.11.255 jp 14.0.12.0 - 14.0.15.255 cn 14.0.16.0 - 14.0.31.255 vn -14.0.32.0 - 14.0.127.255 kr +14.0.32.0 - 14.0.47.255 jp +14.0.48.0 - 14.0.55.255 kr +14.0.56.0 - 14.0.56.255 tw +14.0.57.0 - 14.0.57.255 my +14.0.58.0 - 14.0.58.255 th +14.0.59.0 - 14.0.59.255 mn +14.0.60.0 - 14.0.60.255 in +14.0.61.0 - 14.0.61.255 ae +14.0.62.0 - 14.0.62.255 ph +14.0.63.0 - 14.0.63.255 tw +14.0.64.0 - 14.0.127.255 kr 14.0.128.0 - 14.0.255.255 hk 14.1.0.0 - 14.1.3.255 cn 14.1.4.0 - 14.1.15.255 jp 14.1.16.0 - 14.1.19.255 au 14.1.20.0 - 14.1.23.255 hk -14.1.24.0 - 14.1.31.255 jp +14.1.24.0 - 14.1.27.255 cn +14.1.28.0 - 14.1.31.255 sg 14.1.32.0 - 14.1.95.255 nz +14.1.96.0 - 14.1.99.255 cn +14.1.100.0 - 14.1.103.255 bd +14.1.104.0 - 14.1.107.255 pk +14.1.108.0 - 14.1.111.255 cn +14.1.112.0 - 14.1.115.255 sg +14.1.116.0 - 14.1.127.255 in 14.1.128.0 - 14.1.255.255 my 14.2.0.0 - 14.2.255.255 au 14.3.0.0 - 14.3.255.255 jp @@ -734,6 +2143,14 @@ 14.102.144.0 - 14.102.151.255 my 14.102.152.0 - 14.102.155.255 id 14.102.156.0 - 14.102.159.255 cn +14.102.160.0 - 14.102.163.255 in +14.102.164.0 - 14.102.167.255 jp +14.102.168.0 - 14.102.171.255 ph +14.102.172.0 - 14.102.175.255 pk +14.102.176.0 - 14.102.179.255 jp +14.102.180.0 - 14.102.183.255 cn +14.102.184.0 - 14.102.187.255 hk +14.102.188.0 - 14.102.191.255 in 14.102.192.0 - 14.102.223.255 jp 14.102.224.0 - 14.102.239.255 in 14.102.240.0 - 14.102.255.255 hk @@ -756,8 +2173,13 @@ 14.139.0.0 - 14.143.255.255 in 14.144.0.0 - 14.159.255.255 cn 14.160.0.0 - 14.191.255.255 vn -14.192.0.0 - 14.192.31.255 ph -14.192.32.0 - 14.192.59.255 jp +14.192.0.0 - 14.192.3.255 in +14.192.4.0 - 14.192.7.255 cn +14.192.8.0 - 14.192.11.255 hk +14.192.12.0 - 14.192.19.255 in +14.192.20.0 - 14.192.23.255 hk +14.192.24.0 - 14.192.31.255 in +14.192.32.0 - 14.192.47.255 jp 14.192.60.0 - 14.192.63.255 cn 14.192.64.0 - 14.192.71.255 my 14.192.72.0 - 14.192.75.255 pg @@ -765,7 +2187,8 @@ 14.192.80.0 - 14.192.95.255 kr 14.192.96.0 - 14.192.127.255 jp 14.192.128.0 - 14.192.159.255 pk -14.192.160.0 - 14.192.191.255 au +14.192.160.0 - 14.192.175.255 au +14.192.176.0 - 14.192.191.255 us 14.192.192.0 - 14.192.255.255 my 14.193.0.0 - 14.193.255.255 jp 14.194.0.0 - 14.195.255.255 in @@ -777,28 +2200,1080 @@ 14.207.0.0 - 14.207.255.255 th 14.208.0.0 - 14.223.255.255 cn 14.224.0.0 - 14.255.255.255 vn -15.0.0.0 - 17.57.247.79 us -17.57.247.80 - 17.57.247.87 it -17.57.247.88 - 19.68.79.119 us -19.68.79.120 - 19.68.79.127 fr -19.68.79.128 - 19.203.239.23 us -19.203.239.24 - 19.203.239.31 il -19.203.239.32 - 21.56.9.31 us -21.56.9.32 - 21.56.9.39 it -21.56.9.40 - 21.249.132.255 us -21.249.133.0 - 21.249.133.255 es -21.249.134.0 - 23.15.255.255 us +15.0.0.0 - 15.142.47.255 us +15.142.48.0 - 15.142.63.255 gb +15.142.64.0 - 15.195.175.255 us +15.195.176.0 - 15.195.184.255 de +15.195.185.0 - 15.195.185.255 eu +15.195.186.0 - 15.195.191.255 de +15.195.192.0 - 15.195.223.255 us +15.195.224.0 - 15.195.255.255 ch +15.196.0.0 - 15.197.255.255 us +15.198.0.0 - 15.198.127.255 de +15.198.128.0 - 15.198.255.255 us +15.199.0.0 - 15.199.63.255 ch +15.199.64.0 - 15.200.127.255 us +15.200.128.0 - 15.200.143.255 gb +15.200.144.0 - 15.203.127.255 us +15.203.128.0 - 15.203.136.255 fr +15.203.137.0 - 15.203.137.255 eu +15.203.138.0 - 15.203.168.255 fr +15.203.169.0 - 15.203.169.255 eu +15.203.170.0 - 15.203.177.255 fr +15.203.178.0 - 15.203.178.255 gb +15.203.179.0 - 15.203.191.255 fr +15.203.192.0 - 15.203.239.255 us +15.203.240.0 - 15.203.255.255 gb +15.204.0.0 - 15.204.127.255 us +15.204.128.0 - 15.204.255.255 fr +15.205.0.0 - 15.211.152.255 us +15.211.153.0 - 15.211.153.255 ap +15.211.154.0 - 15.211.168.255 us +15.211.169.0 - 15.211.169.255 ap +15.211.170.0 - 15.211.177.255 us +15.211.178.0 - 15.211.178.255 jp +15.211.179.0 - 15.211.184.255 us +15.211.185.0 - 15.211.185.255 ph +15.211.186.0 - 15.219.200.255 us +15.219.201.0 - 15.219.201.255 in +15.219.202.0 - 15.219.232.255 us +15.219.233.0 - 15.219.233.255 au +15.219.234.0 - 15.227.248.255 us +15.227.249.0 - 15.227.249.255 br +15.227.250.0 - 17.44.223.255 us +17.44.224.0 - 17.44.239.255 ca +17.44.240.0 - 17.45.21.255 us +17.45.22.0 - 17.45.23.255 ca +17.45.24.0 - 17.45.29.255 us +17.45.30.0 - 17.45.31.255 ca +17.45.32.0 - 17.45.55.255 us +17.45.56.0 - 17.45.63.255 mx +17.45.64.0 - 17.45.135.255 us +17.45.136.0 - 17.45.137.255 ca +17.45.138.0 - 17.45.139.255 us +17.45.140.0 - 17.45.141.255 ca +17.45.142.0 - 17.45.143.255 cl +17.45.144.0 - 17.45.147.255 us +17.45.148.0 - 17.45.151.255 co +17.45.152.0 - 17.45.170.110 us +17.45.170.111 - 17.45.170.111 co +17.45.170.112 - 17.45.170.112 br +17.45.170.113 - 17.45.170.113 mx +17.45.170.114 - 17.45.170.114 cl +17.45.170.115 - 17.45.199.255 us +17.45.200.0 - 17.45.207.255 ca +17.45.208.0 - 17.45.239.255 us +17.45.240.0 - 17.45.255.255 ca +17.46.0.0 - 17.67.151.255 us +17.67.152.0 - 17.67.153.255 gb +17.67.154.0 - 17.67.191.255 us +17.67.192.0 - 17.67.195.255 nl +17.67.196.0 - 17.67.197.255 de +17.67.198.0 - 17.67.199.255 us +17.67.200.0 - 17.67.203.255 cz +17.67.204.0 - 17.67.207.255 de +17.67.208.0 - 17.67.211.255 be +17.67.212.0 - 17.67.215.255 ae +17.67.216.0 - 17.67.219.255 gb +17.67.220.0 - 17.67.223.255 us +17.67.224.0 - 17.67.239.255 es +17.67.240.0 - 17.67.247.255 us +17.67.248.0 - 17.67.255.255 gb +17.68.0.0 - 17.69.191.255 us +17.69.192.0 - 17.69.207.255 gb +17.69.208.0 - 17.69.223.255 us +17.69.224.0 - 17.69.231.255 ae +17.69.232.0 - 17.69.235.255 us +17.69.236.0 - 17.69.239.255 gb +17.69.240.0 - 17.69.247.255 tr +17.69.248.0 - 17.69.255.255 sa +17.70.0.0 - 17.72.68.255 us +17.72.69.0 - 17.72.69.127 at +17.72.69.128 - 17.72.69.255 us +17.72.70.0 - 17.72.71.255 ru +17.72.72.0 - 17.72.73.255 nl +17.72.74.0 - 17.72.74.255 pl +17.72.75.0 - 17.72.75.255 pt +17.72.76.0 - 17.72.76.255 cz +17.72.77.0 - 17.72.77.255 us +17.72.78.0 - 17.72.78.255 ru +17.72.79.0 - 17.72.79.255 us +17.72.80.0 - 17.72.81.255 de +17.72.82.0 - 17.72.87.255 gb +17.72.88.0 - 17.72.89.255 us +17.72.90.0 - 17.72.90.255 es +17.72.91.0 - 17.72.95.255 us +17.72.96.0 - 17.72.96.127 nl +17.72.96.128 - 17.72.96.255 us +17.72.97.0 - 17.72.97.127 no +17.72.97.128 - 17.72.97.255 us +17.72.98.0 - 17.72.98.127 dk +17.72.98.128 - 17.72.98.255 us +17.72.99.0 - 17.72.99.127 nl +17.72.99.128 - 17.72.99.255 in +17.72.100.0 - 17.72.100.255 es +17.72.101.0 - 17.72.101.255 us +17.72.102.0 - 17.72.102.255 se +17.72.103.0 - 17.72.103.255 us +17.72.104.0 - 17.72.104.255 lu +17.72.105.0 - 17.72.105.255 us +17.72.106.0 - 17.72.106.255 in +17.72.107.0 - 17.72.107.255 us +17.72.108.0 - 17.72.109.255 it +17.72.110.0 - 17.72.111.255 dk +17.72.112.0 - 17.72.113.255 de +17.72.114.0 - 17.72.115.255 in +17.72.116.0 - 17.72.117.255 be +17.72.118.0 - 17.72.123.255 us +17.72.124.0 - 17.72.127.255 fr +17.72.128.0 - 17.77.23.255 us +17.77.24.0 - 17.77.31.255 ru +17.77.32.0 - 17.77.39.255 us +17.77.40.0 - 17.77.43.255 pl +17.77.44.0 - 17.77.47.255 pt +17.77.48.0 - 17.77.71.255 us +17.77.72.0 - 17.77.79.255 gb +17.77.80.0 - 17.77.141.255 us +17.77.142.0 - 17.77.143.255 in +17.77.144.0 - 17.77.159.255 us +17.77.160.0 - 17.77.163.255 lu +17.77.164.0 - 17.77.167.255 tr +17.77.168.0 - 17.77.169.255 in +17.77.170.0 - 17.77.171.255 us +17.77.172.0 - 17.77.175.255 in +17.77.176.0 - 17.77.183.255 us +17.77.184.0 - 17.77.191.255 dk +17.77.192.0 - 17.77.199.255 us +17.77.200.0 - 17.77.207.255 in +17.77.208.0 - 17.78.127.255 us +17.78.128.0 - 17.78.159.255 il +17.78.160.0 - 17.78.207.255 us +17.78.208.0 - 17.78.215.255 gb +17.78.216.0 - 17.79.131.255 us +17.79.132.0 - 17.79.135.255 se +17.79.136.0 - 17.235.127.255 us +17.235.128.0 - 17.235.143.255 jp +17.235.144.0 - 17.235.159.255 sg +17.235.160.0 - 17.235.175.255 us +17.235.176.0 - 17.235.191.255 au +17.235.192.0 - 17.235.207.255 gb +17.235.208.0 - 17.235.223.255 nl +17.235.224.0 - 17.235.239.255 ie +17.235.240.0 - 17.235.255.255 il +17.236.0.0 - 17.255.252.255 us +17.255.253.0 - 17.255.253.255 au +17.255.254.0 - 20.132.255.255 us +20.133.0.0 - 20.133.0.255 gb +20.133.1.0 - 20.133.1.255 eu +20.133.2.0 - 20.133.4.146 us +20.133.4.147 - 20.133.4.147 eu +20.133.4.148 - 20.133.7.255 us +20.133.8.0 - 20.133.8.255 gb +20.133.9.0 - 20.133.32.17 us +20.133.32.18 - 20.133.32.18 eu +20.133.32.19 - 20.133.39.255 us +20.133.40.0 - 20.133.40.255 gb +20.133.41.0 - 20.138.1.255 us +20.138.2.0 - 20.138.2.255 gb +20.138.3.0 - 20.138.17.255 us +20.138.18.0 - 20.138.18.49 gb +20.138.18.50 - 20.138.18.50 eu +20.138.18.51 - 20.138.18.255 gb +20.138.19.0 - 20.139.34.255 us +20.139.35.0 - 20.139.35.255 my +20.139.36.0 - 20.139.65.255 us +20.139.66.0 - 20.139.67.255 in +20.139.68.0 - 20.139.81.255 us +20.139.82.0 - 20.139.82.255 in +20.139.83.0 - 20.139.228.255 us +20.139.229.0 - 20.139.229.255 au +20.139.230.0 - 20.142.115.255 us +20.142.116.0 - 20.142.116.255 eu +20.142.117.0 - 20.142.119.255 us +20.142.120.0 - 20.142.120.255 in +20.142.121.0 - 20.143.239.255 us +20.143.240.0 - 20.143.240.255 in +20.143.241.0 - 22.50.88.191 us +22.50.88.192 - 22.50.88.223 au +22.50.88.224 - 23.0.31.255 us +23.0.32.0 - 23.0.47.255 nl +23.0.48.0 - 23.0.160.255 us +23.0.161.0 - 23.0.161.255 nl +23.0.162.0 - 23.0.173.255 us +23.0.174.0 - 23.0.174.255 nl +23.0.175.0 - 23.0.211.255 us +23.0.212.0 - 23.0.215.255 nl +23.0.216.0 - 23.0.227.255 us +23.0.228.0 - 23.0.229.255 nl +23.0.230.0 - 23.0.249.255 us +23.0.250.0 - 23.0.251.255 nl +23.0.252.0 - 23.1.3.255 us +23.1.4.0 - 23.1.7.255 nl +23.1.8.0 - 23.1.35.255 us +23.1.36.0 - 23.1.39.255 nl +23.1.40.0 - 23.1.63.255 us +23.1.64.0 - 23.1.79.255 nl +23.1.80.0 - 23.1.237.255 us +23.1.238.0 - 23.1.239.255 nl +23.1.240.0 - 23.1.251.255 us +23.1.252.0 - 23.1.255.255 nl +23.2.0.0 - 23.2.13.255 us +23.2.14.0 - 23.2.15.255 nl +23.2.16.0 - 23.2.19.255 us +23.2.20.0 - 23.2.21.255 nl +23.2.22.0 - 23.2.23.255 us +23.2.24.0 - 23.2.25.255 nl +23.2.26.0 - 23.2.31.255 us +23.2.32.0 - 23.2.32.255 nl +23.2.33.0 - 23.2.51.255 us +23.2.52.0 - 23.2.55.255 nl +23.2.56.0 - 23.2.71.255 us +23.2.72.0 - 23.2.75.255 nl +23.2.76.0 - 23.2.111.255 us +23.2.112.0 - 23.2.127.255 nl +23.2.128.0 - 23.2.207.255 us +23.2.208.0 - 23.2.239.255 nl +23.2.240.0 - 23.3.2.255 us +23.3.3.0 - 23.3.3.255 nl +23.3.4.0 - 23.3.5.255 us +23.3.6.0 - 23.3.7.255 nl +23.3.8.0 - 23.3.14.255 us +23.3.15.0 - 23.3.15.255 nl +23.3.16.0 - 23.3.63.255 us +23.3.64.0 - 23.3.67.255 nl +23.3.68.0 - 23.3.89.255 us +23.3.90.0 - 23.3.91.255 nl +23.3.92.0 - 23.3.109.255 us +23.3.110.0 - 23.3.111.255 nl +23.3.112.0 - 23.3.143.255 us +23.3.144.0 - 23.3.159.255 nl +23.3.160.0 - 23.3.207.255 us +23.3.208.0 - 23.3.239.255 nl +23.3.240.0 - 23.5.95.255 us +23.5.96.0 - 23.5.111.255 nl +23.5.112.0 - 23.5.159.255 us +23.5.160.0 - 23.5.160.255 nl +23.5.161.0 - 23.5.161.255 us +23.5.162.0 - 23.5.163.255 nl +23.5.164.0 - 23.6.111.255 us +23.6.112.0 - 23.6.159.255 nl +23.6.160.0 - 23.7.191.255 us +23.7.192.0 - 23.7.207.255 nl +23.7.208.0 - 23.8.31.255 us +23.8.32.0 - 23.8.47.255 nl +23.8.48.0 - 23.8.207.255 us +23.8.208.0 - 23.8.223.255 nl +23.8.224.0 - 23.8.255.255 us +23.9.0.0 - 23.9.15.255 nl +23.9.16.0 - 23.9.63.255 us +23.9.64.0 - 23.9.79.255 nl +23.9.80.0 - 23.9.207.255 us +23.9.208.0 - 23.9.223.255 nl +23.9.224.0 - 23.10.241.255 us +23.10.242.0 - 23.10.247.255 nl +23.10.248.0 - 23.10.249.255 us +23.10.250.0 - 23.10.252.255 nl +23.10.253.0 - 23.11.63.255 us +23.11.64.0 - 23.11.79.255 nl +23.11.80.0 - 23.11.231.255 us +23.11.232.0 - 23.11.232.255 nl +23.11.233.0 - 23.11.255.255 us +23.12.0.0 - 23.12.31.255 nl +23.12.32.0 - 23.12.79.255 us +23.12.80.0 - 23.12.111.255 nl +23.12.112.0 - 23.13.31.255 us +23.13.32.0 - 23.13.47.255 nl +23.13.48.0 - 23.13.181.255 us +23.13.182.0 - 23.13.183.255 nl +23.13.184.0 - 23.14.89.255 us +23.14.90.0 - 23.14.95.255 nl +23.14.96.0 - 23.14.129.255 us +23.14.130.0 - 23.14.131.255 nl +23.14.132.0 - 23.14.135.255 us +23.14.136.0 - 23.14.139.255 nl +23.14.140.0 - 23.14.191.255 us +23.14.192.0 - 23.14.207.255 nl +23.14.208.0 - 23.15.11.255 us +23.15.12.0 - 23.15.12.255 jp +23.15.13.0 - 23.15.13.255 kr +23.15.14.0 - 23.15.14.255 us +23.15.15.0 - 23.15.15.255 nl +23.15.16.0 - 23.15.63.255 us +23.15.64.0 - 23.15.79.255 nl +23.15.80.0 - 23.15.111.255 us +23.15.112.0 - 23.15.127.255 nl +23.15.128.0 - 23.15.131.255 us +23.15.132.0 - 23.15.133.255 nl +23.15.134.0 - 23.15.175.255 us +23.15.176.0 - 23.15.179.255 nl +23.15.180.0 - 23.15.255.255 us 23.16.0.0 - 23.17.255.255 ca 23.18.0.0 - 23.18.255.255 pr -23.19.0.0 - 23.19.168.255 us -23.19.169.0 - 23.19.169.255 ca -23.19.170.0 - 23.23.255.255 us -23.32.0.0 - 23.67.255.255 us -24.0.0.0 - 24.35.255.255 us +23.19.0.0 - 23.29.191.255 us +23.29.192.0 - 23.29.223.255 ca +23.29.224.0 - 23.32.7.255 us +23.32.8.0 - 23.32.11.255 nl +23.32.12.0 - 23.32.13.255 us +23.32.14.0 - 23.32.21.255 nl +23.32.22.0 - 23.32.27.255 us +23.32.28.0 - 23.32.29.255 nl +23.32.30.0 - 23.32.47.255 us +23.32.48.0 - 23.32.89.255 nl +23.32.90.0 - 23.32.95.255 us +23.32.96.0 - 23.32.111.255 nl +23.32.112.0 - 23.32.219.255 us +23.32.220.0 - 23.32.223.255 nl +23.32.224.0 - 23.32.241.255 us +23.32.242.0 - 23.32.247.255 nl +23.32.248.0 - 23.32.255.255 us +23.33.0.0 - 23.33.15.255 nl +23.33.16.0 - 23.33.47.255 us +23.33.48.0 - 23.33.51.255 nl +23.33.52.0 - 23.33.63.255 us +23.33.64.0 - 23.33.79.255 nl +23.33.80.0 - 23.33.179.255 us +23.33.180.0 - 23.33.183.255 nl +23.33.184.0 - 23.33.187.255 us +23.33.188.0 - 23.33.191.255 nl +23.33.192.0 - 23.33.207.255 us +23.33.208.0 - 23.33.243.255 nl +23.33.244.0 - 23.34.175.255 us +23.34.176.0 - 23.34.191.255 nl +23.34.192.0 - 23.35.111.255 us +23.35.112.0 - 23.35.127.255 nl +23.35.128.0 - 23.35.207.255 us +23.35.208.0 - 23.35.223.255 nl +23.35.224.0 - 23.36.143.255 us +23.36.144.0 - 23.36.191.255 nl +23.36.192.0 - 23.36.207.255 us +23.36.208.0 - 23.36.255.255 nl +23.37.0.0 - 23.37.31.255 us +23.37.32.0 - 23.37.63.255 nl +23.37.64.0 - 23.37.95.255 us +23.37.96.0 - 23.37.111.255 nl +23.37.112.0 - 23.37.159.255 us +23.37.160.0 - 23.37.175.255 nl +23.37.176.0 - 23.37.207.255 us +23.37.208.0 - 23.37.223.255 nl +23.37.224.0 - 23.37.239.255 us +23.37.240.0 - 23.38.101.255 nl +23.38.102.0 - 23.38.119.255 us +23.38.120.0 - 23.38.127.255 nl +23.38.128.0 - 23.38.207.255 us +23.38.208.0 - 23.38.223.255 nl +23.38.224.0 - 23.39.63.255 us +23.39.64.0 - 23.39.127.255 nl +23.39.128.0 - 23.39.159.255 us +23.39.160.0 - 23.39.175.255 nl +23.39.176.0 - 23.39.191.255 us +23.39.192.0 - 23.39.207.255 nl +23.39.208.0 - 23.39.239.255 us +23.39.240.0 - 23.40.15.255 nl +23.40.16.0 - 23.40.63.255 us +23.40.64.0 - 23.40.79.255 nl +23.40.80.0 - 23.40.111.255 us +23.40.112.0 - 23.40.127.255 nl +23.40.128.0 - 23.40.159.255 us +23.40.160.0 - 23.40.175.255 nl +23.40.176.0 - 23.40.207.255 us +23.40.208.0 - 23.40.223.255 nl +23.40.224.0 - 23.41.15.255 us +23.41.16.0 - 23.41.31.255 nl +23.41.32.0 - 23.42.15.255 us +23.42.16.0 - 23.42.31.255 nl +23.42.32.0 - 23.42.191.255 us +23.42.192.0 - 23.42.207.255 nl +23.42.208.0 - 23.43.15.255 us +23.43.16.0 - 23.43.31.255 nl +23.43.32.0 - 23.43.47.255 us +23.43.48.0 - 23.43.79.255 nl +23.43.80.0 - 23.43.127.255 us +23.43.128.0 - 23.43.143.255 nl +23.43.144.0 - 23.44.207.255 us +23.44.208.0 - 23.44.223.255 nl +23.44.224.0 - 23.45.66.255 us +23.45.67.0 - 23.45.67.255 nl +23.45.68.0 - 23.45.71.255 us +23.45.72.0 - 23.45.75.255 nl +23.45.76.0 - 23.45.95.255 us +23.45.96.0 - 23.45.111.255 nl +23.45.112.0 - 23.45.127.255 us +23.45.128.0 - 23.45.207.255 nl +23.45.208.0 - 23.45.235.255 us +23.45.236.0 - 23.45.239.255 nl +23.45.240.0 - 23.46.13.255 us +23.46.14.0 - 23.46.15.255 nl +23.46.16.0 - 23.46.23.255 us +23.46.24.0 - 23.46.25.255 nl +23.46.26.0 - 23.46.27.255 us +23.46.28.0 - 23.46.31.255 nl +23.46.32.0 - 23.46.111.255 us +23.46.112.0 - 23.46.127.255 nl +23.46.128.0 - 23.48.87.255 us +23.48.88.0 - 23.48.91.255 nl +23.48.92.0 - 23.48.191.255 us +23.48.192.0 - 23.48.219.255 nl +23.48.220.0 - 23.48.223.255 us +23.48.224.0 - 23.48.239.255 nl +23.48.240.0 - 23.49.11.255 us +23.49.12.0 - 23.49.15.255 nl +23.49.16.0 - 23.49.191.255 us +23.49.192.0 - 23.49.207.255 nl +23.49.208.0 - 23.50.95.255 us +23.50.96.0 - 23.50.111.255 nl +23.50.112.0 - 23.50.127.255 us +23.50.128.0 - 23.50.191.255 nl +23.50.192.0 - 23.50.207.255 us +23.50.208.0 - 23.50.223.255 nl +23.50.224.0 - 23.51.95.255 us +23.51.96.0 - 23.51.127.255 nl +23.51.128.0 - 23.51.159.255 us +23.51.160.0 - 23.52.31.255 nl +23.52.32.0 - 23.52.47.255 us +23.52.48.0 - 23.52.63.255 nl +23.52.64.0 - 23.52.175.255 us +23.52.176.0 - 23.52.223.255 nl +23.52.224.0 - 23.52.255.255 us +23.53.0.0 - 23.53.63.255 nl +23.53.64.0 - 23.53.159.255 us +23.53.160.0 - 23.53.191.255 nl +23.53.192.0 - 23.53.207.255 us +23.53.208.0 - 23.54.31.255 nl +23.54.32.0 - 23.54.79.255 us +23.54.80.0 - 23.54.143.255 nl +23.54.144.0 - 23.54.255.255 us +23.55.0.0 - 23.55.15.255 nl +23.55.16.0 - 23.55.111.255 us +23.55.112.0 - 23.55.127.255 nl +23.55.128.0 - 23.55.135.255 us +23.55.136.0 - 23.55.159.255 nl +23.55.160.0 - 23.55.223.255 us +23.55.224.0 - 23.55.239.255 nl +23.55.240.0 - 23.56.209.255 us +23.56.210.0 - 23.56.213.255 nl +23.56.214.0 - 23.56.219.255 us +23.56.220.0 - 23.56.223.255 nl +23.56.224.0 - 23.56.255.255 us +23.57.0.0 - 23.57.15.255 nl +23.57.16.0 - 23.57.31.255 us +23.57.32.0 - 23.57.67.255 nl +23.57.68.0 - 23.57.79.255 us +23.57.80.0 - 23.57.115.255 nl +23.57.116.0 - 23.58.93.255 us +23.58.94.0 - 23.58.95.255 nl +23.58.96.0 - 23.58.207.255 us +23.58.208.0 - 23.58.223.255 nl +23.58.224.0 - 23.59.47.255 us +23.59.48.0 - 23.59.89.255 nl +23.59.90.0 - 23.59.95.255 us +23.59.96.0 - 23.59.127.255 nl +23.59.128.0 - 23.60.15.255 us +23.60.16.0 - 23.60.67.255 nl +23.60.68.0 - 23.60.68.255 us +23.60.69.0 - 23.60.71.255 nl +23.60.72.0 - 23.60.207.255 us +23.60.208.0 - 23.60.223.255 nl +23.60.224.0 - 23.61.111.255 us +23.61.112.0 - 23.61.115.255 nl +23.61.116.0 - 23.61.195.255 us +23.61.196.0 - 23.61.197.255 nl +23.61.198.0 - 23.61.198.255 us +23.61.199.0 - 23.61.201.255 nl +23.61.202.0 - 23.61.207.255 us +23.61.208.0 - 23.61.243.255 nl +23.61.244.0 - 23.61.247.255 us +23.61.248.0 - 23.61.248.255 nl +23.61.249.0 - 23.61.250.255 us +23.61.251.0 - 23.61.251.255 nl +23.61.252.0 - 23.61.253.255 us +23.61.254.0 - 23.62.3.255 nl +23.62.4.0 - 23.62.7.255 us +23.62.8.0 - 23.62.8.255 au +23.62.9.0 - 23.62.9.255 nl +23.62.10.0 - 23.62.11.255 us +23.62.12.0 - 23.62.13.255 nl +23.62.14.0 - 23.62.52.255 us +23.62.53.0 - 23.62.53.255 nl +23.62.54.0 - 23.62.60.255 us +23.62.61.0 - 23.62.61.255 nl +23.62.62.0 - 23.62.97.255 us +23.62.98.0 - 23.62.100.255 nl +23.62.101.0 - 23.62.101.255 us +23.62.102.0 - 23.62.105.255 nl +23.62.106.0 - 23.62.111.255 us +23.62.112.0 - 23.62.147.255 nl +23.62.148.0 - 23.62.149.255 us +23.62.150.0 - 23.62.151.255 nl +23.62.152.0 - 23.62.155.255 us +23.62.156.0 - 23.62.156.255 au +23.62.157.0 - 23.62.191.255 us +23.62.192.0 - 23.62.207.255 nl +23.62.208.0 - 23.62.236.255 us +23.62.237.0 - 23.62.237.255 nl +23.62.238.0 - 23.63.27.255 us +23.63.28.0 - 23.63.31.255 nl +23.63.32.0 - 23.63.63.255 us +23.63.64.0 - 23.63.101.255 nl +23.63.102.0 - 23.63.111.255 us +23.63.112.0 - 23.63.149.255 nl +23.63.150.0 - 23.63.229.255 us +23.63.230.0 - 23.63.239.255 nl +23.63.240.0 - 23.64.14.255 us +23.64.15.0 - 23.64.15.255 nl +23.64.16.0 - 23.64.59.255 us +23.64.60.0 - 23.64.63.255 nl +23.64.64.0 - 23.64.141.255 us +23.64.142.0 - 23.64.143.255 nl +23.64.144.0 - 23.64.207.255 us +23.64.208.0 - 23.64.239.255 nl +23.64.240.0 - 23.65.21.255 us +23.65.22.0 - 23.65.22.255 nl +23.65.23.0 - 23.65.28.255 us +23.65.29.0 - 23.65.47.255 nl +23.65.48.0 - 23.65.115.255 us +23.65.116.0 - 23.65.119.255 nl +23.65.120.0 - 23.65.179.255 us +23.65.180.0 - 23.65.181.255 nl +23.65.182.0 - 23.65.191.255 us +23.65.192.0 - 23.65.223.255 nl +23.65.224.0 - 23.66.15.255 us +23.66.16.0 - 23.66.31.255 nl +23.66.32.0 - 23.66.233.255 us +23.66.234.0 - 23.67.15.255 nl +23.67.16.0 - 23.67.38.255 us +23.67.39.0 - 23.67.40.255 nl +23.67.41.0 - 23.67.41.255 us +23.67.42.0 - 23.67.43.255 nl +23.67.44.0 - 23.67.46.255 us +23.67.47.0 - 23.67.47.255 nl +23.67.48.0 - 23.67.57.255 us +23.67.58.0 - 23.67.58.255 nl +23.67.59.0 - 23.67.69.255 us +23.67.70.0 - 23.67.71.255 nl +23.67.72.0 - 23.67.77.255 us +23.67.78.0 - 23.67.111.255 nl +23.67.112.0 - 23.67.127.255 us +23.67.128.0 - 23.67.147.255 nl +23.67.148.0 - 23.67.254.255 us +23.67.255.0 - 23.67.255.255 nl +23.68.0.0 - 23.73.134.255 us +23.73.135.0 - 23.73.135.255 nl +23.73.136.0 - 23.74.23.255 us +23.74.24.0 - 23.74.24.255 nl +23.74.25.0 - 23.74.25.255 us +23.74.26.0 - 23.74.27.255 nl +23.74.28.0 - 23.74.31.255 us +23.74.32.0 - 23.74.47.255 nl +23.74.48.0 - 23.74.79.255 us +23.74.80.0 - 23.74.127.255 nl +23.74.128.0 - 23.74.163.255 us +23.74.164.0 - 23.74.167.255 nl +23.74.168.0 - 23.74.175.255 us +23.74.176.0 - 23.74.207.255 nl +23.74.208.0 - 23.76.155.255 us +23.76.156.0 - 23.76.157.255 nl +23.76.158.0 - 23.77.83.255 us +23.77.84.0 - 23.77.87.255 nl +23.77.88.0 - 23.77.95.255 us +23.77.96.0 - 23.77.127.255 nl +23.77.128.0 - 23.77.194.255 us +23.77.195.0 - 23.77.195.255 nl +23.77.196.0 - 23.77.197.255 us +23.77.198.0 - 23.77.201.255 nl +23.77.202.0 - 23.77.247.255 us +23.77.248.0 - 23.77.255.255 nl +23.78.0.0 - 23.78.31.255 us +23.78.32.0 - 23.78.127.255 nl +23.78.128.0 - 23.79.111.255 us +23.79.112.0 - 23.79.127.255 nl +23.79.128.0 - 23.79.223.255 us +23.79.224.0 - 23.79.224.255 il +23.79.225.0 - 23.79.225.255 gb +23.79.226.0 - 23.79.227.255 nl +23.79.228.0 - 23.79.228.255 us +23.79.229.0 - 23.79.229.255 au +23.79.230.0 - 23.79.230.255 nl +23.79.231.0 - 23.79.231.255 us +23.79.232.0 - 23.79.234.255 nl +23.79.235.0 - 23.79.236.255 us +23.79.237.0 - 23.79.239.255 nl +23.79.240.0 - 23.79.246.255 us +23.79.247.0 - 23.79.247.255 nl +23.79.248.0 - 23.91.127.255 us +23.91.128.0 - 23.91.191.255 ca +23.91.192.0 - 23.91.223.255 us +23.91.224.0 - 23.91.255.255 ca +23.92.0.0 - 23.92.127.255 us +23.92.128.0 - 23.92.159.255 ca +23.92.160.0 - 23.92.220.111 us +23.92.220.112 - 23.92.220.119 ro +23.92.220.120 - 23.97.47.255 us +23.97.48.0 - 23.97.63.255 sg +23.97.64.0 - 23.97.95.255 hk +23.97.96.0 - 23.97.127.255 br +23.97.128.0 - 23.97.255.255 nl +23.98.0.0 - 23.98.31.255 us +23.98.32.0 - 23.98.44.255 hk +23.98.45.0 - 23.98.45.255 us +23.98.46.0 - 23.98.46.255 nl +23.98.47.0 - 23.98.55.255 us +23.98.56.0 - 23.98.57.255 jp +23.98.58.0 - 23.98.63.255 us +23.98.64.0 - 23.98.127.255 sg +23.98.128.0 - 23.99.95.255 us +23.99.96.0 - 23.99.127.255 hk +23.99.128.0 - 23.99.255.255 us +23.100.0.0 - 23.100.15.255 nl +23.100.16.0 - 23.100.47.255 us +23.100.48.0 - 23.100.63.255 ie +23.100.64.0 - 23.100.87.255 us +23.100.88.0 - 23.100.95.255 hk +23.100.96.0 - 23.100.111.255 jp +23.100.112.0 - 23.100.119.255 sg +23.100.120.0 - 23.100.127.255 us +23.100.128.0 - 23.100.191.255 ie +23.100.192.0 - 23.100.255.255 us +23.101.0.0 - 23.101.15.255 hk +23.101.16.0 - 23.101.31.255 sg +23.101.32.0 - 23.101.47.255 us +23.101.48.0 - 23.101.63.255 ie +23.101.64.0 - 23.101.79.255 nl +23.101.80.0 - 23.101.207.255 us +23.101.208.0 - 23.101.255.255 au +23.102.0.0 - 23.102.63.255 ie +23.102.64.0 - 23.102.95.255 jp +23.102.96.0 - 23.102.199.255 us +23.102.200.0 - 23.102.201.255 hk +23.102.202.0 - 23.102.223.255 us +23.102.224.0 - 23.102.255.255 hk +23.103.0.0 - 23.103.127.255 us +23.103.128.0 - 23.103.128.255 jp +23.103.129.0 - 23.103.129.127 us +23.103.129.128 - 23.103.129.255 au +23.103.130.0 - 23.103.130.127 jp +23.103.130.128 - 23.103.130.255 au +23.103.131.0 - 23.103.131.111 us +23.103.131.112 - 23.103.131.143 sg +23.103.131.144 - 23.103.159.255 us +23.103.160.0 - 23.103.175.255 jp +23.103.176.0 - 23.103.182.127 us +23.103.182.128 - 23.103.182.191 nl +23.103.182.192 - 23.103.183.63 sg +23.103.183.64 - 23.103.189.31 us +23.103.189.32 - 23.103.189.63 hk +23.103.189.64 - 23.103.189.191 us +23.103.189.192 - 23.103.189.255 hk +23.103.190.0 - 23.103.190.63 sg +23.103.190.64 - 23.103.190.95 us +23.103.190.96 - 23.103.190.127 sg +23.103.190.128 - 23.103.190.191 us +23.103.190.192 - 23.103.190.207 ie +23.103.190.208 - 23.103.227.191 us +23.103.227.192 - 23.103.227.207 nl +23.103.227.208 - 23.103.227.223 ie +23.103.227.224 - 23.103.228.15 nl +23.103.228.16 - 23.103.228.31 ie +23.103.228.32 - 23.103.228.79 nl +23.103.228.80 - 23.103.228.95 ie +23.103.228.96 - 23.103.228.143 nl +23.103.228.144 - 23.103.228.159 ie +23.103.228.160 - 23.103.228.207 nl +23.103.228.208 - 23.103.228.223 ie +23.103.228.224 - 23.103.229.15 nl +23.103.229.16 - 23.103.229.31 ie +23.103.229.32 - 23.103.229.143 nl +23.103.229.144 - 23.103.229.159 ie +23.103.229.160 - 23.103.229.207 nl +23.103.229.208 - 23.103.229.223 ie +23.103.229.224 - 23.103.230.15 nl +23.103.230.16 - 23.103.230.31 ie +23.103.230.32 - 23.103.230.79 nl +23.103.230.80 - 23.103.230.95 ie +23.103.230.96 - 23.103.230.127 nl +23.103.230.128 - 23.103.236.15 us +23.103.236.16 - 23.103.236.31 at +23.103.236.32 - 23.103.236.47 fi +23.103.236.48 - 23.103.236.63 ie +23.103.236.64 - 23.103.236.79 us +23.103.236.80 - 23.103.236.95 at +23.103.236.96 - 23.103.236.111 fi +23.103.236.112 - 23.103.236.127 ie +23.103.236.128 - 23.103.236.143 us +23.103.236.144 - 23.103.236.159 at +23.103.236.160 - 23.103.236.175 fi +23.103.236.176 - 23.103.236.191 ie +23.103.236.192 - 23.103.236.207 us +23.103.236.208 - 23.103.236.223 at +23.103.236.224 - 23.103.236.239 fi +23.103.236.240 - 23.103.236.255 ie +23.103.237.0 - 23.103.237.15 us +23.103.237.16 - 23.103.237.31 at +23.103.237.32 - 23.103.237.47 fi +23.103.237.48 - 23.103.237.63 ie +23.103.237.64 - 23.103.237.79 us +23.103.237.80 - 23.103.237.95 ie +23.103.237.96 - 23.103.237.111 fi +23.103.237.112 - 23.103.237.127 at +23.103.237.128 - 23.103.237.143 us +23.103.237.144 - 23.103.237.159 ie +23.103.237.160 - 23.103.237.175 fi +23.103.237.176 - 23.103.237.191 at +23.103.237.192 - 23.103.237.207 us +23.103.237.208 - 23.103.237.223 ie +23.103.237.224 - 23.103.237.239 fi +23.103.237.240 - 23.103.237.255 at +23.103.238.0 - 23.103.238.15 us +23.103.238.16 - 23.103.238.31 ie +23.103.238.32 - 23.103.238.47 fi +23.103.238.48 - 23.103.238.63 at +23.103.238.64 - 23.103.238.79 us +23.103.238.80 - 23.103.238.95 ie +23.103.238.96 - 23.103.238.111 fi +23.103.238.112 - 23.103.238.127 at +23.103.238.128 - 23.103.240.15 us +23.103.240.16 - 23.103.240.31 nl +23.103.240.32 - 23.103.240.79 us +23.103.240.80 - 23.103.240.95 nl +23.103.240.96 - 23.103.240.143 us +23.103.240.144 - 23.103.240.159 nl +23.103.240.160 - 23.103.240.207 us +23.103.240.208 - 23.103.240.223 nl +23.103.240.224 - 23.103.241.15 us +23.103.241.16 - 23.103.241.31 nl +23.103.241.32 - 23.103.246.143 us +23.103.246.144 - 23.103.246.159 nl +23.103.246.160 - 23.103.246.175 at +23.103.246.176 - 23.103.246.191 ie +23.103.246.192 - 23.103.246.207 us +23.103.246.208 - 23.103.246.223 nl +23.103.246.224 - 23.103.246.239 at +23.103.246.240 - 23.103.246.255 ie +23.103.247.0 - 23.103.247.15 us +23.103.247.16 - 23.103.247.31 nl +23.103.247.32 - 23.103.247.47 at +23.103.247.48 - 23.103.247.63 ie +23.103.247.64 - 23.103.247.79 us +23.103.247.80 - 23.103.247.95 nl +23.103.247.96 - 23.103.247.111 at +23.103.247.112 - 23.103.247.127 ie +23.103.247.128 - 23.103.247.143 us +23.103.247.144 - 23.103.247.159 nl +23.103.247.160 - 23.103.247.175 at +23.103.247.176 - 23.103.247.191 ie +23.103.247.192 - 23.103.247.207 us +23.103.247.208 - 23.103.247.223 nl +23.103.247.224 - 23.103.247.239 at +23.103.247.240 - 23.103.247.255 ie +23.103.248.0 - 23.103.248.15 us +23.103.248.16 - 23.103.248.31 nl +23.103.248.32 - 23.103.248.47 at +23.103.248.48 - 23.103.248.63 ie +23.103.248.64 - 23.103.248.79 us +23.103.248.80 - 23.103.248.95 nl +23.103.248.96 - 23.103.248.111 at +23.103.248.112 - 23.103.248.127 ie +23.103.248.128 - 23.103.248.143 us +23.103.248.144 - 23.103.248.159 nl +23.103.248.160 - 23.103.248.175 at +23.103.248.176 - 23.103.248.191 ie +23.103.248.192 - 23.103.248.207 us +23.103.248.208 - 23.103.248.223 nl +23.103.248.224 - 23.103.248.239 at +23.103.248.240 - 23.103.248.255 ie +23.103.249.0 - 23.103.249.63 us +23.103.249.64 - 23.103.249.95 sg +23.103.249.96 - 23.103.249.111 kr +23.103.249.112 - 23.103.249.127 my +23.103.249.128 - 23.103.249.159 us +23.103.249.160 - 23.103.249.175 kr +23.103.249.176 - 23.103.249.191 my +23.103.249.192 - 23.103.250.255 us +23.103.251.0 - 23.103.251.255 nl +23.103.252.0 - 23.103.252.15 sg +23.103.252.16 - 23.103.252.31 hk +23.103.252.32 - 23.103.252.191 nl +23.103.252.192 - 23.103.252.255 us +23.103.253.0 - 23.103.253.31 hk +23.103.253.32 - 23.103.253.63 sg +23.103.253.64 - 23.103.253.79 hk +23.103.253.80 - 23.103.253.95 sg +23.103.253.96 - 23.103.253.111 kr +23.103.253.112 - 23.103.253.127 my +23.103.253.128 - 23.103.254.127 us +23.103.254.128 - 23.103.254.143 nl +23.103.254.144 - 23.103.254.159 ie +23.103.254.160 - 23.103.254.175 fi +23.103.254.176 - 23.103.254.191 at +23.103.254.192 - 23.103.254.207 nl +23.103.254.208 - 23.103.254.223 ie +23.103.254.224 - 23.103.254.239 fi +23.103.254.240 - 23.103.254.255 at +23.103.255.0 - 23.105.31.255 us +23.105.32.0 - 23.105.32.255 gb +23.105.33.0 - 23.127.255.255 us +23.128.0.0 - 23.128.0.255 ca +23.128.24.0 - 23.128.25.255 nl +23.128.124.0 - 23.128.125.255 nl +23.130.0.0 - 23.130.0.255 us +23.132.0.0 - 23.139.255.255 us +23.140.0.0 - 23.143.255.255 ca +23.144.0.0 - 23.175.255.255 us +23.176.0.0 - 23.176.0.255 ca +23.180.0.0 - 23.180.0.255 us +23.184.0.0 - 23.184.0.255 us +23.188.0.0 - 23.188.0.255 ky +23.192.0.0 - 23.192.161.255 us +23.192.162.0 - 23.192.163.255 nl +23.192.164.0 - 23.194.107.255 us +23.194.108.0 - 23.194.111.255 nl +23.194.112.0 - 23.194.175.255 us +23.194.176.0 - 23.194.211.255 nl +23.194.212.0 - 23.194.213.255 us +23.194.214.0 - 23.194.215.255 nl +23.194.216.0 - 23.194.223.255 us +23.194.224.0 - 23.195.3.255 nl +23.195.4.0 - 23.195.7.255 us +23.195.8.0 - 23.195.11.255 nl +23.195.12.0 - 23.195.47.255 us +23.195.48.0 - 23.195.79.255 nl +23.195.80.0 - 23.195.111.255 us +23.195.112.0 - 23.195.143.255 nl +23.195.144.0 - 23.196.229.255 us +23.196.230.0 - 23.196.235.255 nl +23.196.236.0 - 23.196.239.255 us +23.196.240.0 - 23.197.15.255 nl +23.197.16.0 - 23.197.61.255 us +23.197.62.0 - 23.197.63.255 nl +23.197.64.0 - 23.197.247.255 us +23.197.248.0 - 23.197.255.255 nl +23.198.0.0 - 23.198.15.255 us +23.198.16.0 - 23.198.97.255 nl +23.198.98.0 - 23.199.207.255 us +23.199.208.0 - 23.199.223.255 nl +23.199.224.0 - 23.200.83.255 us +23.200.84.0 - 23.200.89.255 fr +23.200.90.0 - 23.200.95.255 us +23.200.96.0 - 23.200.111.255 nl +23.200.112.0 - 23.200.131.255 us +23.200.132.0 - 23.200.135.255 nl +23.200.136.0 - 23.200.143.255 us +23.200.144.0 - 23.200.175.255 nl +23.200.176.0 - 23.200.191.255 us +23.200.192.0 - 23.200.207.255 nl +23.200.208.0 - 23.201.107.255 us +23.201.108.0 - 23.201.109.255 nl +23.201.110.0 - 23.201.151.255 us +23.201.152.0 - 23.201.155.255 nl +23.201.156.0 - 23.201.191.255 us +23.201.192.0 - 23.201.223.255 nl +23.201.224.0 - 23.202.44.255 us +23.202.45.0 - 23.202.45.255 nl +23.202.46.0 - 23.202.115.255 us +23.202.116.0 - 23.202.121.255 nl +23.202.122.0 - 23.202.127.255 us +23.202.128.0 - 23.202.175.255 nl +23.202.176.0 - 23.205.79.255 us +23.205.80.0 - 23.205.111.255 nl +23.205.112.0 - 23.205.115.255 us +23.205.116.0 - 23.205.117.255 au +23.205.118.0 - 23.205.167.255 us +23.205.168.0 - 23.205.171.255 nl +23.205.172.0 - 23.205.173.255 us +23.205.174.0 - 23.205.175.255 nl +23.205.176.0 - 23.205.211.255 us +23.205.212.0 - 23.205.215.255 nl +23.205.216.0 - 23.205.219.255 us +23.205.220.0 - 23.206.117.255 nl +23.206.118.0 - 23.207.63.255 us +23.207.64.0 - 23.207.95.255 nl +23.207.96.0 - 23.209.73.255 us +23.209.74.0 - 23.209.79.255 nl +23.209.80.0 - 23.209.111.255 us +23.209.112.0 - 23.209.181.255 nl +23.209.182.0 - 23.209.182.255 us +23.209.183.0 - 23.209.183.255 au +23.209.184.0 - 23.209.189.255 us +23.209.190.0 - 23.210.3.255 nl +23.210.4.0 - 23.211.60.255 us +23.211.61.0 - 23.211.61.255 nl +23.211.62.0 - 23.211.131.255 us +23.211.132.0 - 23.211.133.255 nl +23.211.134.0 - 23.212.107.255 us +23.212.108.0 - 23.212.109.255 nl +23.212.110.0 - 23.212.179.255 us +23.212.180.0 - 23.212.185.255 nl +23.212.186.0 - 23.212.191.255 us +23.212.192.0 - 23.212.239.255 nl +23.212.240.0 - 23.213.139.255 us +23.213.140.0 - 23.213.143.255 nl +23.213.144.0 - 23.214.31.255 us +23.214.32.0 - 23.214.73.255 nl +23.214.74.0 - 23.214.79.255 us +23.214.80.0 - 23.214.223.255 nl +23.214.224.0 - 23.215.15.255 us +23.215.16.0 - 23.215.53.255 nl +23.215.54.0 - 23.215.59.255 us +23.215.60.0 - 23.215.61.255 nl +23.215.62.0 - 23.215.95.255 us +23.215.96.0 - 23.215.133.255 nl +23.215.134.0 - 23.215.214.255 us +23.215.215.0 - 23.215.215.255 nl +23.215.216.0 - 23.216.5.255 us +23.216.6.0 - 23.216.7.255 nl +23.216.8.0 - 23.216.11.255 us +23.216.12.0 - 23.216.13.255 nl +23.216.14.0 - 23.216.95.255 us +23.216.96.0 - 23.216.127.255 nl +23.216.128.0 - 23.217.129.255 us +23.217.130.0 - 23.217.131.255 nl +23.217.132.0 - 23.217.133.255 us +23.217.134.0 - 23.217.135.255 nl +23.217.136.0 - 23.217.143.255 us +23.217.144.0 - 23.217.179.255 nl +23.217.180.0 - 23.217.183.255 us +23.217.184.0 - 23.217.187.255 nl +23.217.188.0 - 23.217.223.255 us +23.217.224.0 - 23.217.255.255 nl +23.218.0.0 - 23.218.149.255 us +23.218.150.0 - 23.218.155.255 nl +23.218.156.0 - 23.218.159.255 us +23.218.160.0 - 23.218.191.255 nl +23.218.192.0 - 23.219.47.255 us +23.219.48.0 - 23.219.85.255 nl +23.219.86.0 - 23.219.165.255 us +23.219.166.0 - 23.219.167.255 nl +23.219.168.0 - 23.219.215.255 us +23.219.216.0 - 23.219.219.255 nl +23.219.220.0 - 23.219.255.255 us +23.220.0.0 - 23.220.31.255 nl +23.220.32.0 - 23.221.159.255 us +23.221.160.0 - 23.222.19.255 nl +23.222.20.0 - 23.222.23.255 us +23.222.24.0 - 23.222.67.255 nl +23.222.68.0 - 23.222.223.255 us +23.222.224.0 - 23.223.143.255 nl +23.223.144.0 - 23.223.207.255 us +23.223.208.0 - 23.223.239.255 nl +23.223.240.0 - 23.227.31.255 us +23.227.32.0 - 23.227.63.255 ca +23.227.64.0 - 23.227.207.255 us +23.227.208.0 - 23.227.223.255 ca +23.227.224.0 - 23.229.2.255 us +23.229.3.0 - 23.229.3.255 tr +23.229.4.0 - 23.229.4.255 gb +23.229.5.0 - 23.229.14.255 us +23.229.15.0 - 23.229.15.255 gb +23.229.16.0 - 23.229.18.255 us +23.229.19.0 - 23.229.19.255 gb +23.229.20.0 - 23.229.106.255 us +23.229.107.0 - 23.229.107.255 pa +23.229.108.0 - 23.229.108.255 au +23.229.109.0 - 23.229.109.255 cr +23.229.110.0 - 23.229.110.255 us +23.229.111.0 - 23.229.111.255 sg +23.229.112.0 - 23.232.132.255 us +23.232.133.0 - 23.232.133.255 de +23.232.134.0 - 23.232.138.255 us +23.232.139.0 - 23.232.139.255 gb +23.232.140.0 - 23.232.174.255 us +23.232.175.0 - 23.232.175.255 de +23.232.176.0 - 23.232.192.255 us +23.232.193.0 - 23.232.193.255 fr +23.232.194.0 - 23.232.195.255 us +23.232.196.0 - 23.232.196.255 de +23.232.197.0 - 23.232.221.255 us +23.232.222.0 - 23.232.223.255 gb +23.232.224.0 - 23.232.243.255 us +23.232.244.0 - 23.232.244.255 pe +23.232.245.0 - 23.232.245.255 bz +23.232.246.0 - 23.232.246.255 ng +23.232.247.0 - 23.232.247.255 im +23.232.248.0 - 23.232.248.255 sa +23.232.249.0 - 23.232.249.255 ve +23.232.250.0 - 23.232.250.255 bs +23.232.251.0 - 23.232.251.255 ma +23.232.252.0 - 23.232.252.255 om +23.232.253.0 - 23.232.253.255 co +23.232.254.0 - 23.232.254.255 gb +23.232.255.0 - 23.232.255.255 ye +23.233.0.0 - 23.233.255.255 ca +23.234.0.0 - 23.234.81.247 us +23.234.81.248 - 23.234.81.255 gb +23.234.82.0 - 23.234.97.223 us +23.234.97.224 - 23.234.97.255 gb +23.234.98.0 - 23.235.63.255 us +23.235.64.0 - 23.235.79.255 ca +23.235.80.0 - 23.235.255.255 us +23.236.0.0 - 23.236.15.255 bb +23.236.16.0 - 23.236.139.255 us +23.236.140.0 - 23.236.140.255 eg +23.236.141.0 - 23.236.171.255 us +23.236.172.0 - 23.236.173.255 se +23.236.174.0 - 23.236.174.255 ru +23.236.175.0 - 23.239.31.255 us +23.239.32.0 - 23.239.63.255 ca +23.239.64.0 - 23.247.129.255 us +23.247.130.0 - 23.247.130.255 fr +23.247.131.0 - 23.247.132.255 us +23.247.133.0 - 23.247.133.255 ke +23.247.134.0 - 23.247.134.255 sy +23.247.135.0 - 23.247.135.255 mx +23.247.136.0 - 23.247.136.255 bn +23.247.137.0 - 23.247.137.255 bh +23.247.138.0 - 23.247.138.255 aw +23.247.139.0 - 23.247.141.255 us +23.247.142.0 - 23.247.142.255 gb +23.247.143.0 - 23.247.162.255 us +23.247.163.0 - 23.247.163.255 gb +23.247.164.0 - 23.247.171.255 us +23.247.172.0 - 23.247.172.255 it +23.247.173.0 - 23.247.231.255 us +23.247.232.0 - 23.247.232.255 se +23.247.233.0 - 23.247.237.255 us +23.247.238.0 - 23.247.238.255 tr +23.247.239.0 - 23.247.255.255 us +23.248.0.0 - 23.248.159.255 ca +23.248.160.0 - 23.249.111.255 us +23.249.112.0 - 23.249.127.255 ca +23.249.128.0 - 23.249.128.255 pr +23.249.129.0 - 23.249.129.255 us +23.249.130.0 - 23.249.130.255 pr +23.249.131.0 - 23.249.143.255 us +23.249.160.0 - 23.249.175.69 us +23.249.175.70 - 23.249.175.70 ca +23.249.175.71 - 23.249.175.241 us +23.249.175.242 - 23.249.175.242 ca +23.249.175.243 - 23.249.191.255 us +23.249.192.0 - 23.249.207.255 ca +23.249.208.0 - 23.250.77.255 us +23.250.78.0 - 23.250.78.255 ca +23.250.79.0 - 23.251.159.255 us +23.251.160.0 - 23.251.191.255 ca +23.251.192.0 - 23.252.31.255 us +23.252.32.0 - 23.252.47.255 ca +23.252.48.0 - 23.252.95.255 us +23.252.96.0 - 23.252.99.255 ca +23.252.100.0 - 23.252.101.255 us +23.252.102.0 - 23.252.103.255 ca +23.252.104.0 - 23.254.108.255 us +23.254.109.0 - 23.254.109.255 ca +23.254.110.0 - 23.254.111.255 gb +23.254.112.0 - 23.255.103.71 us +23.255.103.72 - 23.255.103.79 gb +23.255.103.80 - 23.255.104.31 us +23.255.104.32 - 23.255.104.39 au +23.255.104.40 - 23.255.107.15 us +23.255.107.16 - 23.255.107.23 gb +23.255.107.24 - 23.255.108.119 us +23.255.108.120 - 23.255.108.127 au +23.255.108.128 - 23.255.255.255 us +24.0.0.0 - 24.0.0.0 mx +24.0.0.1 - 24.35.255.255 us 24.36.0.0 - 24.37.255.255 ca 24.38.0.0 - 24.38.143.255 us 24.38.144.0 - 24.38.159.255 ca -24.38.160.0 - 24.41.127.255 us +24.38.160.0 - 24.41.95.255 us +24.41.96.0 - 24.41.127.255 ca 24.41.128.0 - 24.42.63.255 pr 24.42.64.0 - 24.47.255.255 us 24.48.0.0 - 24.48.127.255 ca @@ -808,25 +3283,41 @@ 24.49.0.0 - 24.49.223.255 us 24.49.224.0 - 24.49.255.255 ca 24.50.0.0 - 24.50.31.255 us -24.50.64.0 - 24.50.127.255 ca +24.50.32.0 - 24.50.127.255 ca 24.50.128.0 - 24.50.159.255 us +24.50.160.0 - 24.50.191.255 ca 24.50.192.0 - 24.50.255.255 pr +24.51.0.0 - 24.51.31.255 ca 24.51.32.0 - 24.51.63.255 us 24.51.64.0 - 24.51.127.255 bs -24.51.128.0 - 24.52.191.255 us +24.51.128.0 - 24.51.223.255 us +24.51.224.0 - 24.51.255.255 ca +24.52.0.0 - 24.52.191.255 us 24.52.192.0 - 24.53.63.255 ca 24.53.64.0 - 24.53.79.255 us -24.53.80.0 - 24.53.95.255 ca +24.53.80.0 - 24.53.127.255 ca 24.53.128.0 - 24.53.191.255 us -24.53.224.0 - 24.53.239.255 ca -24.54.0.0 - 24.54.63.255 ca +24.53.192.0 - 24.54.95.255 ca 24.54.96.0 - 24.54.191.255 us -24.54.192.0 - 24.55.255.255 pr +24.54.192.0 - 24.54.255.255 pr +24.55.0.0 - 24.55.63.255 us +24.55.64.0 - 24.55.119.255 pr +24.55.120.0 - 24.55.120.255 us +24.55.121.0 - 24.55.122.63 pr +24.55.122.64 - 24.55.122.255 us +24.55.123.0 - 24.55.123.63 pr +24.55.123.64 - 24.55.123.127 us +24.55.123.128 - 24.55.127.255 pr +24.55.128.0 - 24.55.159.255 us +24.55.160.0 - 24.55.191.255 pr +24.55.192.0 - 24.55.255.255 ca 24.56.0.0 - 24.56.255.255 us 24.57.0.0 - 24.57.255.255 ca 24.58.0.0 - 24.63.255.255 us 24.64.0.0 - 24.72.143.255 ca -24.72.144.0 - 24.75.255.255 us +24.72.144.0 - 24.75.175.255 us +24.75.176.0 - 24.75.191.255 ca +24.75.192.0 - 24.75.255.255 us 24.76.0.0 - 24.87.255.255 ca 24.88.0.0 - 24.89.63.255 us 24.89.64.0 - 24.89.127.255 ca @@ -834,78 +3325,53 @@ 24.89.192.0 - 24.89.255.255 ca 24.90.0.0 - 24.92.143.255 us 24.92.144.0 - 24.92.159.255 lc -24.92.160.0 - 24.101.255.255 us +24.92.160.0 - 24.100.191.255 us +24.100.192.0 - 24.100.255.255 ca +24.101.0.0 - 24.101.255.255 us 24.102.0.0 - 24.102.63.255 ca -24.102.128.0 - 24.107.255.255 us +24.102.64.0 - 24.104.159.255 us +24.104.160.0 - 24.104.191.255 ca +24.104.192.0 - 24.105.63.255 us +24.105.64.0 - 24.105.127.255 ca +24.105.128.0 - 24.107.255.255 us 24.108.0.0 - 24.109.255.255 ca 24.110.0.0 - 24.113.255.255 us -24.114.0.0 - 24.114.197.59 ca -24.114.197.60 - 24.114.197.67 us -24.114.197.68 - 24.114.211.39 ca -24.114.211.40 - 24.114.211.43 us -24.114.211.44 - 24.114.211.159 ca -24.114.211.160 - 24.114.211.163 us -24.114.211.164 - 24.114.220.35 ca -24.114.220.36 - 24.114.220.39 us -24.114.220.40 - 24.114.220.87 ca -24.114.220.88 - 24.114.220.95 us -24.114.220.96 - 24.114.220.103 ca -24.114.220.104 - 24.114.220.107 us -24.114.220.108 - 24.114.220.151 ca -24.114.220.152 - 24.114.220.155 us -24.114.220.156 - 24.114.220.163 ca -24.114.220.164 - 24.114.220.167 us -24.114.220.168 - 24.114.238.191 ca -24.114.238.192 - 24.114.238.195 us -24.114.238.196 - 24.114.239.67 ca -24.114.239.68 - 24.114.239.71 us -24.114.239.72 - 24.114.239.79 ca -24.114.239.80 - 24.114.239.87 us -24.114.239.88 - 24.114.243.223 ca -24.114.243.224 - 24.114.243.227 us -24.114.243.228 - 24.114.244.219 ca -24.114.244.220 - 24.114.244.227 us -24.114.244.228 - 24.114.244.231 ca -24.114.244.232 - 24.114.244.247 us -24.114.244.248 - 24.114.244.251 ca -24.114.244.252 - 24.114.244.255 us -24.114.245.0 - 24.114.245.7 ca -24.114.245.8 - 24.114.245.11 us -24.114.245.12 - 24.114.245.39 ca -24.114.245.40 - 24.114.245.47 us -24.114.245.48 - 24.114.245.167 ca -24.114.245.168 - 24.114.245.175 us -24.114.245.176 - 24.114.245.223 ca -24.114.245.224 - 24.114.245.231 us -24.114.245.232 - 24.114.247.183 ca -24.114.247.184 - 24.114.247.187 us -24.114.247.188 - 24.114.255.255 ca +24.114.0.0 - 24.114.255.255 ca 24.115.0.0 - 24.121.255.255 us 24.122.0.0 - 24.122.255.255 ca -24.123.0.0 - 24.129.223.255 us +24.123.0.0 - 24.129.191.255 us +24.129.192.0 - 24.129.207.255 ca +24.129.208.0 - 24.129.223.255 us 24.129.224.0 - 24.129.239.255 ca -24.130.0.0 - 24.131.255.255 us +24.129.240.0 - 24.131.255.255 us 24.132.0.0 - 24.132.255.255 nl +24.133.0.0 - 24.133.255.255 tr +24.134.0.0 - 24.134.255.255 de +24.135.0.0 - 24.135.255.255 rs 24.136.0.0 - 24.137.31.255 us -24.137.32.0 - 24.137.47.255 ca -24.137.64.0 - 24.137.127.255 ca +24.137.32.0 - 24.137.127.255 ca 24.137.128.0 - 24.137.191.255 us 24.137.192.0 - 24.137.223.255 ca +24.137.224.0 - 24.137.255.255 pr 24.138.0.0 - 24.138.191.255 ca 24.138.192.0 - 24.138.255.255 pr 24.139.0.0 - 24.139.31.255 ca 24.139.32.0 - 24.139.63.255 us 24.139.64.0 - 24.139.255.255 pr -24.140.0.0 - 24.140.255.255 us -24.141.0.0 - 24.142.63.255 ca +24.140.0.0 - 24.140.223.255 us +24.140.224.0 - 24.142.63.255 ca 24.142.64.0 - 24.142.79.255 us 24.142.80.0 - 24.142.95.255 ca -24.142.96.0 - 24.145.255.255 us -24.146.0.0 - 24.146.31.255 ca +24.142.96.0 - 24.142.114.255 us +24.142.115.0 - 24.142.115.255 eu +24.142.116.0 - 24.142.116.255 gb +24.142.117.0 - 24.143.127.255 us +24.143.128.0 - 24.143.191.255 ca +24.143.192.0 - 24.145.255.255 us +24.146.0.0 - 24.146.127.255 ca 24.146.128.0 - 24.149.255.255 us 24.150.0.0 - 24.150.255.255 ca 24.151.0.0 - 24.151.255.255 us -24.152.0.0 - 24.152.127.255 cl 24.152.128.0 - 24.152.255.255 us 24.153.0.0 - 24.153.31.255 ca 24.153.32.0 - 24.153.95.255 us @@ -913,38 +3379,45 @@ 24.153.112.0 - 24.156.127.255 us 24.156.128.0 - 24.156.255.255 ca 24.157.0.0 - 24.157.15.255 us -24.157.128.0 - 24.157.255.255 ca +24.157.16.0 - 24.157.24.63 pr +24.157.24.64 - 24.157.24.255 us +24.157.25.0 - 24.157.31.255 pr +24.157.32.0 - 24.157.63.255 us +24.157.64.0 - 24.157.255.255 ca 24.158.0.0 - 24.171.191.255 us 24.171.192.0 - 24.171.255.255 pr 24.172.0.0 - 24.199.255.255 us 24.200.0.0 - 24.203.255.255 ca -24.204.0.0 - 24.205.255.255 us +24.204.0.0 - 24.204.143.255 us +24.204.144.0 - 24.204.255.255 ca +24.205.0.0 - 24.205.255.255 us 24.206.0.0 - 24.206.31.255 bs 24.206.32.0 - 24.206.255.255 us 24.207.0.0 - 24.207.127.255 ca 24.207.128.0 - 24.211.255.255 us -24.212.0.0 - 24.212.127.255 ca +24.212.0.0 - 24.212.255.255 ca 24.213.0.0 - 24.213.63.255 us 24.213.64.0 - 24.213.95.255 ca 24.213.96.0 - 24.214.255.255 us 24.215.0.0 - 24.215.127.255 ca 24.215.128.0 - 24.221.255.255 us 24.222.0.0 - 24.222.255.255 ca -24.223.0.0 - 24.224.124.159 us -24.224.124.160 - 24.224.124.167 nc -24.224.124.168 - 24.224.127.255 us +24.223.0.0 - 24.224.127.255 us 24.224.128.0 - 24.224.255.255 ca 24.225.0.0 - 24.225.127.255 us -24.226.0.0 - 24.226.255.255 ca +24.225.128.0 - 24.226.255.255 ca 24.227.0.0 - 24.227.31.255 pr -24.227.32.0 - 24.230.191.255 us +24.227.32.0 - 24.229.255.255 us +24.230.0.0 - 24.230.31.255 hk +24.230.32.0 - 24.230.191.255 us 24.230.192.0 - 24.231.15.255 ca 24.231.16.0 - 24.231.31.255 us 24.231.32.0 - 24.231.63.255 bs -24.231.64.0 - 24.231.111.255 ca +24.231.64.0 - 24.231.95.255 ca 24.231.112.0 - 24.231.255.255 us 24.232.0.0 - 24.232.255.255 ar -24.233.0.0 - 24.235.31.255 us +24.233.0.0 - 24.235.23.255 us +24.235.24.0 - 24.235.31.255 hk 24.235.32.0 - 24.235.63.255 ca 24.235.64.0 - 24.235.95.255 us 24.235.96.0 - 24.235.255.255 ca @@ -954,25 +3427,50 @@ 24.244.0.0 - 24.244.95.255 ca 24.244.96.0 - 24.244.111.255 us 24.244.112.0 - 24.244.127.255 ca -24.244.128.0 - 24.244.170.255 bs -24.244.171.0 - 24.244.171.254 dm -24.244.171.255 - 24.244.191.255 bs +24.244.128.0 - 24.244.191.255 bs 24.244.192.0 - 24.244.255.255 ca 24.245.0.0 - 24.245.223.255 us 24.245.224.0 - 24.245.239.255 ca 24.245.240.0 - 24.245.255.255 us 24.246.0.0 - 24.246.95.255 ca -24.246.96.0 - 24.255.255.255 us -25.0.0.0 - 25.255.255.255 gb +24.246.96.0 - 24.249.249.127 us +24.249.249.128 - 24.249.249.255 vi +24.249.250.0 - 24.255.255.255 us +25.0.0.0 - 25.66.7.255 gb +25.66.8.0 - 25.66.15.255 us +25.66.16.0 - 25.255.255.255 gb 26.0.0.0 - 26.255.255.255 us 27.0.0.0 - 27.0.3.255 jp 27.0.4.0 - 27.0.7.255 my 27.0.8.0 - 27.0.11.255 sg 27.0.12.0 - 27.0.15.255 vn -27.0.16.0 - 27.0.47.255 jp +27.0.16.0 - 27.0.16.255 us +27.0.17.0 - 27.0.18.255 jp +27.0.19.0 - 27.0.19.255 us +27.0.20.0 - 27.0.21.255 jp +27.0.22.0 - 27.0.23.255 us +27.0.24.0 - 27.0.28.255 jp +27.0.29.0 - 27.0.31.255 us +27.0.32.0 - 27.0.47.255 jp 27.0.48.0 - 27.0.63.255 in 27.0.64.0 - 27.0.95.255 au 27.0.96.0 - 27.0.127.255 bd +27.0.128.0 - 27.0.135.255 cn +27.0.136.0 - 27.0.151.255 in +27.0.152.0 - 27.0.155.255 tw +27.0.156.0 - 27.0.159.255 hk +27.0.160.0 - 27.0.167.255 cn +27.0.168.0 - 27.0.183.255 in +27.0.184.0 - 27.0.187.255 pk +27.0.188.0 - 27.0.191.255 cn +27.0.192.0 - 27.0.195.255 hk +27.0.196.0 - 27.0.199.255 id +27.0.200.0 - 27.0.203.255 in +27.0.204.0 - 27.0.215.255 cn +27.0.216.0 - 27.0.235.255 in +27.0.236.0 - 27.0.239.255 kr +27.0.240.0 - 27.0.243.255 vn +27.0.244.0 - 27.0.255.255 in 27.1.0.0 - 27.1.255.255 kr 27.2.0.0 - 27.3.255.255 vn 27.4.0.0 - 27.7.255.255 in @@ -980,7 +3478,11 @@ 27.32.0.0 - 27.33.255.255 au 27.34.0.0 - 27.34.127.255 np 27.34.128.0 - 27.34.175.255 jp -27.34.176.0 - 27.34.191.255 sg +27.34.176.0 - 27.34.177.255 sg +27.34.178.0 - 27.34.178.64 kh +27.34.178.65 - 27.34.186.0 sg +27.34.186.1 - 27.34.186.64 kh +27.34.186.65 - 27.34.191.255 sg 27.34.192.0 - 27.34.223.255 jp 27.34.224.0 - 27.34.231.255 au 27.34.232.0 - 27.34.239.255 cn @@ -990,7 +3492,6 @@ 27.48.0.0 - 27.49.255.255 in 27.50.0.0 - 27.50.3.255 ph 27.50.4.0 - 27.50.7.255 in -27.50.8.0 - 27.50.11.255 np 27.50.12.0 - 27.50.15.255 jp 27.50.16.0 - 27.50.31.255 id 27.50.32.0 - 27.50.39.255 hk @@ -1004,11 +3505,11 @@ 27.54.72.0 - 27.54.79.255 cn 27.54.80.0 - 27.54.95.255 au 27.54.96.0 - 27.54.115.255 jp -27.54.116.0 - 27.54.119.255 my +27.54.116.0 - 27.54.119.255 id 27.54.120.0 - 27.54.123.255 pk 27.54.124.0 - 27.54.127.255 jp 27.54.128.0 - 27.54.143.255 au -27.54.144.0 - 27.54.151.255 in +27.54.144.0 - 27.54.151.255 bd 27.54.152.0 - 27.54.159.255 cn 27.54.160.0 - 27.54.191.255 in 27.54.192.0 - 27.54.255.255 cn @@ -1020,7 +3521,8 @@ 27.96.32.0 - 27.96.63.255 jp 27.96.64.0 - 27.96.67.255 nz 27.96.68.0 - 27.96.83.255 jp -27.96.84.0 - 27.96.87.255 in +27.96.84.0 - 27.96.91.255 in +27.96.92.0 - 27.96.95.255 pk 27.96.96.0 - 27.96.127.255 sg 27.96.128.0 - 27.96.191.255 kr 27.96.192.0 - 27.96.223.255 au @@ -1032,12 +3534,14 @@ 27.99.0.0 - 27.99.127.255 au 27.99.128.0 - 27.99.255.255 cn 27.100.0.0 - 27.100.3.255 au -27.100.4.0 - 27.100.7.255 th 27.100.8.0 - 27.100.11.255 jp 27.100.12.0 - 27.100.15.255 in -27.100.16.0 - 27.100.23.255 hk -27.100.24.0 - 27.100.27.255 au +27.100.16.0 - 27.100.18.255 hk +27.100.19.0 - 27.100.19.255 tw +27.100.20.0 - 27.100.23.255 hk +27.100.24.0 - 27.100.27.255 in 27.100.28.0 - 27.100.35.255 jp +27.100.36.0 - 27.100.39.255 au 27.100.40.0 - 27.100.47.255 th 27.100.48.0 - 27.100.63.255 jp 27.100.64.0 - 27.100.127.255 tw @@ -1062,6 +3566,7 @@ 27.109.108.0 - 27.109.111.255 au 27.109.112.0 - 27.109.119.255 kh 27.109.120.0 - 27.109.123.255 jp +27.109.124.0 - 27.109.127.255 cn 27.109.128.0 - 27.109.255.255 mo 27.110.0.0 - 27.110.63.255 jp 27.110.64.0 - 27.110.79.255 hk @@ -1071,10 +3576,14 @@ 27.110.128.0 - 27.110.255.255 ph 27.111.0.0 - 27.111.7.255 au 27.111.8.0 - 27.111.11.255 kh -27.111.12.0 - 27.111.15.255 nz +27.111.12.0 - 27.111.12.255 us +27.111.13.0 - 27.111.13.255 au +27.111.14.0 - 27.111.14.255 nz +27.111.15.0 - 27.111.15.255 gb 27.111.16.0 - 27.111.31.255 np 27.111.32.0 - 27.111.63.255 id 27.111.64.0 - 27.111.71.255 au +27.111.72.0 - 27.111.75.255 in 27.111.76.0 - 27.111.79.255 jp 27.111.80.0 - 27.111.95.255 au 27.111.96.0 - 27.111.127.255 kr @@ -1089,7 +3598,7 @@ 27.112.80.0 - 27.112.95.255 cn 27.112.96.0 - 27.112.103.255 au 27.112.104.0 - 27.112.111.255 jp -27.112.112.0 - 27.112.119.255 th +27.112.112.0 - 27.112.119.255 cn 27.112.120.0 - 27.112.123.255 in 27.112.124.0 - 27.112.127.255 jp 27.112.128.0 - 27.113.127.255 kr @@ -1106,9 +3615,10 @@ 27.116.0.0 - 27.116.15.255 jp 27.116.16.0 - 27.116.23.255 in 27.116.24.0 - 27.116.31.255 jp -27.116.32.0 - 27.116.35.255 in +27.116.32.0 - 27.116.33.255 sg +27.116.34.0 - 27.116.35.255 jp 27.116.36.0 - 27.116.39.255 au -27.116.40.0 - 27.116.43.255 jp +27.116.40.0 - 27.116.43.255 in 27.116.44.0 - 27.116.47.255 cn 27.116.48.0 - 27.116.55.255 in 27.116.56.0 - 27.116.59.255 af @@ -1122,7 +3632,7 @@ 27.121.64.0 - 27.121.71.255 au 27.121.72.0 - 27.121.79.255 cn 27.121.80.0 - 27.121.87.255 id -27.121.88.0 - 27.121.91.255 nz +27.121.88.0 - 27.121.91.255 au 27.121.92.0 - 27.121.95.255 jp 27.121.96.0 - 27.121.99.255 nz 27.121.100.0 - 27.121.103.255 in @@ -1136,8 +3646,9 @@ 27.122.12.0 - 27.122.15.255 hk 27.122.16.0 - 27.122.31.255 pg 27.122.32.0 - 27.122.55.255 jp -27.122.56.0 - 27.122.59.255 my -27.122.60.0 - 27.122.63.255 sg +27.122.56.0 - 27.122.57.255 my +27.122.58.0 - 27.122.59.255 sg +27.122.60.0 - 27.122.63.255 in 27.122.64.0 - 27.122.111.255 jp 27.122.112.0 - 27.122.127.255 au 27.122.128.0 - 27.122.255.255 kr @@ -1145,16 +3656,20 @@ 27.123.8.0 - 27.123.15.255 jp 27.123.16.0 - 27.123.19.255 th 27.123.20.0 - 27.123.23.255 nz -27.123.24.0 - 27.123.31.255 au -27.123.32.0 - 27.123.63.255 hk +27.123.24.0 - 27.123.35.255 au +27.123.36.0 - 27.123.39.255 hk +27.123.40.0 - 27.123.47.255 au +27.123.48.0 - 27.123.63.255 hk 27.123.64.0 - 27.123.127.255 in 27.123.128.0 - 27.123.191.255 fj -27.123.192.0 - 27.123.207.255 hk +27.123.192.0 - 27.123.193.255 hk +27.123.194.0 - 27.123.195.255 sg +27.123.196.0 - 27.123.199.255 hk +27.123.200.0 - 27.123.207.255 tw 27.123.208.0 - 27.123.211.255 jp 27.123.212.0 - 27.123.215.255 mn 27.123.216.0 - 27.123.219.255 in 27.123.220.0 - 27.123.223.255 id -27.123.224.0 - 27.123.255.255 ph 27.124.0.0 - 27.124.63.255 in 27.124.64.0 - 27.124.79.255 ph 27.124.80.0 - 27.124.95.255 id @@ -1173,7 +3688,11 @@ 27.126.152.0 - 27.126.155.255 ph 27.126.156.0 - 27.126.159.255 my 27.126.160.0 - 27.126.175.255 jp -27.126.176.0 - 27.126.255.255 hk +27.126.176.0 - 27.126.203.255 hk +27.126.204.0 - 27.126.219.255 us +27.126.220.0 - 27.126.231.255 hk +27.126.232.0 - 27.126.234.255 us +27.126.235.0 - 27.126.255.255 hk 27.127.0.0 - 27.127.191.255 jp 27.127.192.0 - 27.127.239.255 au 27.127.240.0 - 27.127.255.255 jp @@ -1215,7 +3734,7 @@ 27.255.128.0 - 27.255.255.255 in 28.0.0.0 - 30.255.255.255 us 31.0.0.0 - 31.2.127.255 pl -31.2.128.0 - 31.2.255.255 ro +31.2.128.0 - 31.2.255.255 ir 31.3.0.0 - 31.3.7.255 tr 31.3.8.0 - 31.3.15.255 nl 31.3.16.0 - 31.3.23.255 ru @@ -1230,36 +3749,70 @@ 31.3.128.0 - 31.3.135.255 ch 31.3.136.0 - 31.3.143.255 fr 31.3.144.0 - 31.3.151.255 de -31.3.152.0 - 31.3.159.255 se +31.3.152.0 - 31.3.155.255 se +31.3.156.0 - 31.3.156.255 nl +31.3.157.0 - 31.3.157.255 us +31.3.158.0 - 31.3.159.255 se 31.3.160.0 - 31.3.191.255 it 31.3.192.0 - 31.3.207.255 ua 31.3.208.0 - 31.3.255.255 gb 31.4.0.0 - 31.4.255.255 es -31.5.0.0 - 31.5.255.255 at +31.5.0.0 - 31.5.127.255 ro +31.5.128.0 - 31.5.255.255 be 31.6.0.0 - 31.6.7.255 nl 31.6.8.0 - 31.6.11.255 it -31.6.12.0 - 31.6.15.255 ru -31.6.16.0 - 31.6.25.255 gb -31.6.26.0 - 31.6.28.255 fr -31.6.29.0 - 31.6.29.255 tr -31.6.30.0 - 31.6.31.255 ch -31.6.32.0 - 31.6.36.255 de -31.6.37.0 - 31.6.38.255 tr +31.6.12.0 - 31.6.13.255 ru +31.6.14.0 - 31.6.14.255 ro +31.6.15.0 - 31.6.15.255 ru +31.6.16.0 - 31.6.16.255 gb +31.6.17.0 - 31.6.17.127 is +31.6.17.128 - 31.6.18.127 it +31.6.18.128 - 31.6.18.255 is +31.6.19.0 - 31.6.19.255 ie +31.6.20.0 - 31.6.22.255 it +31.6.23.0 - 31.6.23.255 gb +31.6.24.0 - 31.6.24.255 be +31.6.25.0 - 31.6.25.255 gb +31.6.26.0 - 31.6.26.127 de +31.6.26.128 - 31.6.26.255 pt +31.6.27.0 - 31.6.27.255 fi +31.6.28.0 - 31.6.28.255 it +31.6.29.0 - 31.6.29.255 cz +31.6.30.0 - 31.6.30.255 ch +31.6.31.0 - 31.6.31.255 dk +31.6.32.0 - 31.6.32.255 se +31.6.33.0 - 31.6.33.255 be +31.6.34.0 - 31.6.34.255 se +31.6.35.0 - 31.6.36.255 de +31.6.37.0 - 31.6.37.255 tr +31.6.38.0 - 31.6.38.127 cz +31.6.38.128 - 31.6.38.255 tr 31.6.39.0 - 31.6.39.255 es 31.6.40.0 - 31.6.40.255 fr -31.6.41.0 - 31.6.41.255 es -31.6.42.0 - 31.6.43.255 fr -31.6.44.0 - 31.6.45.255 ch -31.6.46.0 - 31.6.49.255 fr -31.6.50.0 - 31.6.55.255 de -31.6.56.0 - 31.6.56.255 il -31.6.57.0 - 31.6.57.255 ae -31.6.58.0 - 31.6.63.255 gb +31.6.41.0 - 31.6.42.255 ch +31.6.43.0 - 31.6.43.255 fr +31.6.44.0 - 31.6.44.255 ch +31.6.45.0 - 31.6.45.255 se +31.6.46.0 - 31.6.46.255 it +31.6.47.0 - 31.6.49.255 fr +31.6.50.0 - 31.6.51.255 dk +31.6.52.0 - 31.6.52.255 lu +31.6.53.0 - 31.6.53.255 de +31.6.54.0 - 31.6.54.255 lt +31.6.55.0 - 31.6.55.255 at +31.6.56.0 - 31.6.56.255 lu +31.6.57.0 - 31.6.57.255 no +31.6.58.0 - 31.6.59.255 gb +31.6.60.0 - 31.6.60.255 ie +31.6.61.0 - 31.6.61.255 it +31.6.62.0 - 31.6.63.255 gb 31.6.64.0 - 31.6.71.255 pl 31.6.72.0 - 31.6.79.255 gb 31.6.80.0 - 31.6.95.255 tr 31.6.96.0 - 31.6.127.255 ua -31.6.128.0 - 31.6.255.255 pl +31.6.128.0 - 31.6.145.255 pl +31.6.146.0 - 31.6.146.255 gb +31.6.147.0 - 31.6.255.255 pl 31.7.0.0 - 31.7.7.255 nl 31.7.8.0 - 31.7.15.255 gb 31.7.16.0 - 31.7.31.255 fi @@ -1271,16 +3824,7 @@ 31.7.144.0 - 31.7.159.255 it 31.7.160.0 - 31.7.167.255 am 31.7.168.0 - 31.7.175.255 mk -31.7.176.0 - 31.7.176.31 it -31.7.176.32 - 31.7.176.63 de -31.7.176.64 - 31.7.176.95 it -31.7.176.96 - 31.7.176.127 de -31.7.176.128 - 31.7.176.159 it -31.7.176.160 - 31.7.177.255 de -31.7.178.0 - 31.7.178.31 it -31.7.178.32 - 31.7.178.63 fr -31.7.178.64 - 31.7.178.95 it -31.7.178.96 - 31.7.191.255 de +31.7.176.0 - 31.7.191.255 de 31.7.192.0 - 31.7.223.255 si 31.7.224.0 - 31.7.239.255 ru 31.7.240.0 - 31.7.247.255 cz @@ -1293,9 +3837,7 @@ 31.10.48.0 - 31.10.55.255 it 31.10.56.0 - 31.10.63.255 cz 31.10.64.0 - 31.10.127.255 ru -31.10.128.0 - 31.11.29.255 ch -31.11.30.0 - 31.11.30.255 de -31.11.31.0 - 31.11.31.255 ch +31.10.128.0 - 31.11.31.255 ch 31.11.32.0 - 31.11.39.255 it 31.11.40.0 - 31.11.47.255 ro 31.11.48.0 - 31.11.55.255 qa @@ -1306,34 +3848,70 @@ 31.12.8.0 - 31.12.15.255 it 31.12.16.0 - 31.12.31.255 mk 31.12.32.0 - 31.12.63.255 de -31.12.64.0 - 31.12.65.255 be -31.12.66.0 - 31.12.66.127 lu -31.12.66.128 - 31.12.68.255 be -31.12.69.0 - 31.12.69.15 lu -31.12.69.16 - 31.12.71.255 be -31.12.72.0 - 31.12.87.255 gb -31.12.88.0 - 31.12.88.128 nl -31.12.88.129 - 31.12.127.255 gb +31.12.64.0 - 31.12.71.255 be +31.12.72.0 - 31.12.127.255 gb 31.12.128.0 - 31.12.255.255 ua 31.13.0.0 - 31.13.7.255 gb 31.13.8.0 - 31.13.15.255 se 31.13.16.0 - 31.13.23.255 ru 31.13.24.0 - 31.13.31.255 ie 31.13.32.0 - 31.13.63.255 ru -31.13.64.0 - 31.13.127.255 ie +31.13.64.0 - 31.13.69.79 ie +31.13.69.80 - 31.13.69.80 us +31.13.69.81 - 31.13.69.255 ie +31.13.70.0 - 31.13.70.255 us +31.13.71.0 - 31.13.75.255 ie +31.13.76.0 - 31.13.77.255 us +31.13.78.0 - 31.13.127.255 ie 31.13.128.0 - 31.13.135.255 ru 31.13.136.0 - 31.13.143.255 it 31.13.144.0 - 31.13.151.255 ru -31.13.152.0 - 31.13.152.255 ng -31.13.153.0 - 31.13.159.255 gb +31.13.152.0 - 31.13.159.255 gb 31.13.160.0 - 31.13.167.255 ps 31.13.168.0 - 31.13.175.255 de 31.13.176.0 - 31.13.183.255 ru -31.13.184.0 - 31.13.191.255 es 31.13.192.0 - 31.13.255.255 bg -31.14.0.0 - 31.14.179.255 ro +31.14.0.0 - 31.14.10.255 ro +31.14.11.0 - 31.14.11.255 nl +31.14.12.0 - 31.14.31.255 ro +31.14.32.0 - 31.14.32.255 nl +31.14.33.0 - 31.14.43.255 ro +31.14.44.0 - 31.14.44.255 nl +31.14.45.0 - 31.14.45.255 ro +31.14.46.0 - 31.14.47.255 de +31.14.48.0 - 31.14.48.255 nl +31.14.49.0 - 31.14.59.255 ro +31.14.60.0 - 31.14.63.255 es +31.14.64.0 - 31.14.64.255 ro +31.14.65.0 - 31.14.67.255 gb +31.14.68.0 - 31.14.68.255 ru +31.14.69.0 - 31.14.69.255 ro +31.14.70.0 - 31.14.70.255 es +31.14.71.0 - 31.14.71.255 us +31.14.72.0 - 31.14.79.255 ro +31.14.80.0 - 31.14.95.255 ir +31.14.96.0 - 31.14.102.255 ro +31.14.103.0 - 31.14.103.255 th +31.14.104.0 - 31.14.111.255 ro +31.14.112.0 - 31.14.127.255 ir +31.14.128.0 - 31.14.133.38 it +31.14.133.39 - 31.14.133.39 a1 +31.14.133.40 - 31.14.143.255 it +31.14.144.0 - 31.14.159.255 ir +31.14.160.0 - 31.14.175.255 ro +31.14.176.0 - 31.14.179.255 lt 31.14.180.0 - 31.14.183.255 md -31.14.184.0 - 31.14.255.255 ro +31.14.184.0 - 31.14.191.255 it +31.14.192.0 - 31.14.206.127 ro +31.14.206.128 - 31.14.206.255 es +31.14.207.0 - 31.14.247.255 ro +31.14.248.0 - 31.14.248.255 eg +31.14.249.0 - 31.14.249.255 ro +31.14.250.0 - 31.14.250.127 fr +31.14.250.128 - 31.14.250.255 ro +31.14.251.0 - 31.14.251.255 eg +31.14.252.0 - 31.14.254.255 ro +31.14.255.0 - 31.14.255.255 in 31.15.0.0 - 31.15.7.255 es 31.15.8.0 - 31.15.15.255 cz 31.15.16.0 - 31.15.23.255 ru @@ -1350,7 +3928,6 @@ 31.16.0.0 - 31.19.255.255 de 31.20.0.0 - 31.21.255.255 nl 31.22.0.0 - 31.22.7.255 gb -31.22.8.0 - 31.22.15.255 ru 31.22.16.0 - 31.22.23.255 be 31.22.24.0 - 31.22.31.255 de 31.22.32.0 - 31.22.39.255 ru @@ -1358,25 +3935,31 @@ 31.22.48.0 - 31.22.63.255 al 31.22.64.0 - 31.22.71.255 de 31.22.72.0 - 31.22.79.255 gb -31.22.80.0 - 31.22.80.63 us -31.22.80.64 - 31.22.87.255 nl +31.22.80.0 - 31.22.87.255 nl 31.22.88.0 - 31.22.95.255 cy 31.22.96.0 - 31.22.103.255 pl -31.22.104.0 - 31.22.107.255 de -31.22.108.0 - 31.22.111.255 gb -31.22.112.0 - 31.22.119.255 gr +31.22.104.0 - 31.22.107.255 gb +31.22.108.0 - 31.22.111.255 nl +31.22.112.0 - 31.22.115.255 gr +31.22.116.0 - 31.22.116.255 gb +31.22.117.0 - 31.22.119.255 gr 31.22.120.0 - 31.22.127.255 lu 31.22.128.0 - 31.22.255.255 pt 31.23.0.0 - 31.23.255.255 ru 31.24.0.0 - 31.24.7.255 gb 31.24.8.0 - 31.24.15.255 ch -31.24.16.0 - 31.24.23.255 hu +31.24.16.0 - 31.24.16.255 hu +31.24.17.0 - 31.24.20.255 de +31.24.21.0 - 31.24.23.255 hu 31.24.24.0 - 31.24.31.255 ru 31.24.32.0 - 31.24.39.255 gb 31.24.40.0 - 31.24.47.255 es 31.24.48.0 - 31.24.55.255 nl 31.24.56.0 - 31.24.63.255 ee -31.24.64.0 - 31.24.79.255 se +31.24.64.0 - 31.24.66.223 se +31.24.66.224 - 31.24.66.239 fi +31.24.66.240 - 31.24.66.255 no +31.24.67.0 - 31.24.79.255 se 31.24.80.0 - 31.24.87.255 gb 31.24.88.0 - 31.24.95.255 by 31.24.96.0 - 31.24.103.255 de @@ -1392,10 +3975,12 @@ 31.24.176.0 - 31.24.183.255 sk 31.24.184.0 - 31.24.191.255 hu 31.24.192.0 - 31.24.199.255 lv -31.24.200.0 - 31.24.207.255 ir +31.24.200.0 - 31.24.203.255 iq +31.24.204.0 - 31.24.207.255 ir 31.24.208.0 - 31.24.215.255 ua -31.24.216.0 - 31.24.223.255 gb -31.24.224.0 - 31.24.231.255 sa +31.24.216.0 - 31.24.224.255 gb +31.24.225.0 - 31.24.225.255 au +31.24.226.0 - 31.24.231.255 gb 31.24.232.0 - 31.24.239.255 ir 31.24.240.0 - 31.24.255.255 fr 31.25.0.0 - 31.25.15.255 gb @@ -1406,9 +3991,7 @@ 31.25.56.0 - 31.25.63.255 nl 31.25.64.0 - 31.25.71.255 se 31.25.72.0 - 31.25.79.255 ps -31.25.80.0 - 31.25.86.255 fr -31.25.87.0 - 31.25.87.15 us -31.25.87.16 - 31.25.87.255 fr +31.25.80.0 - 31.25.87.255 fr 31.25.88.0 - 31.25.95.255 ir 31.25.96.0 - 31.25.103.255 nl 31.25.104.0 - 31.25.111.255 ir @@ -1444,9 +4027,7 @@ 31.29.128.0 - 31.29.255.255 ru 31.30.0.0 - 31.30.255.255 cz 31.31.0.0 - 31.31.31.255 md -31.31.32.0 - 31.31.36.255 nl -31.31.37.0 - 31.31.37.127 us -31.31.37.128 - 31.31.39.255 nl +31.31.32.0 - 31.31.39.255 nl 31.31.40.0 - 31.31.47.255 it 31.31.48.0 - 31.31.63.255 ch 31.31.64.0 - 31.31.71.255 ru @@ -1469,7 +4050,7 @@ 31.40.24.0 - 31.40.103.255 ru 31.40.104.0 - 31.40.111.255 ua 31.40.112.0 - 31.40.127.255 ru -31.40.128.0 - 31.40.255.255 ua +31.40.128.0 - 31.40.191.255 ua 31.41.0.0 - 31.41.7.255 ru 31.41.8.0 - 31.41.15.255 ua 31.41.16.0 - 31.41.23.255 bg @@ -1513,24 +4094,31 @@ 31.44.48.0 - 31.44.63.255 ru 31.44.64.0 - 31.44.79.255 al 31.44.80.0 - 31.44.95.255 ru -31.44.96.0 - 31.44.111.255 lt +31.44.96.0 - 31.44.103.255 lt +31.44.104.0 - 31.44.104.255 il +31.44.105.0 - 31.44.105.255 ae +31.44.106.0 - 31.44.106.255 tr +31.44.107.0 - 31.44.107.255 es +31.44.108.0 - 31.44.108.255 be +31.44.109.0 - 31.44.111.255 ch 31.44.112.0 - 31.44.127.255 it 31.44.128.0 - 31.44.143.255 il 31.44.144.0 - 31.44.159.255 es 31.44.160.0 - 31.44.175.255 it -31.44.176.0 - 31.44.184.255 ru -31.44.185.0 - 31.44.185.255 gb -31.44.186.0 - 31.44.187.255 bz +31.44.176.0 - 31.44.185.255 ru +31.44.186.0 - 31.44.187.255 de 31.44.188.0 - 31.44.188.255 ua 31.44.189.0 - 31.44.189.255 ch -31.44.190.0 - 31.44.191.255 nl +31.44.190.0 - 31.44.191.255 ru 31.44.192.0 - 31.44.207.255 tr 31.44.208.0 - 31.44.223.255 fr 31.44.224.0 - 31.44.239.255 se 31.44.240.0 - 31.44.255.255 ru 31.45.0.0 - 31.45.127.255 no 31.45.128.0 - 31.45.255.255 hr -31.46.0.0 - 31.46.255.255 hu +31.46.0.0 - 31.46.43.255 hu +31.46.44.0 - 31.46.47.255 ro +31.46.48.0 - 31.46.255.255 hu 31.47.0.0 - 31.47.31.255 ba 31.47.32.0 - 31.47.63.255 ir 31.47.64.0 - 31.47.71.255 fi @@ -1571,16 +4159,19 @@ 31.130.200.0 - 31.130.207.255 by 31.130.208.0 - 31.130.215.255 ru 31.130.216.0 - 31.130.223.255 pl -31.130.224.0 - 31.130.239.255 ch -31.130.240.0 - 31.130.247.255 ro +31.130.224.0 - 31.130.239.255 us +31.130.240.0 - 31.130.247.255 gb 31.130.248.0 - 31.130.255.255 ru 31.131.0.0 - 31.131.7.255 md 31.131.8.0 - 31.131.15.255 ro -31.131.16.0 - 31.131.39.255 ua +31.131.16.0 - 31.131.19.255 ua +31.131.20.0 - 31.131.21.255 nl +31.131.22.0 - 31.131.26.255 ua +31.131.27.0 - 31.131.31.255 us +31.131.32.0 - 31.131.39.255 ua 31.131.40.0 - 31.131.47.255 ro 31.131.48.0 - 31.131.63.255 pl -31.131.64.0 - 31.131.79.255 ua -31.131.80.0 - 31.131.95.255 ru +31.131.64.0 - 31.131.95.255 ru 31.131.96.0 - 31.131.143.255 ua 31.131.144.0 - 31.131.159.255 ru 31.131.160.0 - 31.131.167.255 ro @@ -1591,27 +4182,23 @@ 31.131.240.0 - 31.131.247.255 it 31.131.248.0 - 31.131.255.255 ru 31.132.0.0 - 31.132.7.255 gb -31.132.8.0 - 31.132.15.255 ro 31.132.16.0 - 31.132.31.255 cz -31.132.32.0 - 31.132.63.255 ro 31.132.64.0 - 31.132.71.255 pl 31.132.72.0 - 31.132.79.255 am 31.132.80.0 - 31.132.95.255 ro 31.132.96.0 - 31.132.191.255 ru 31.132.192.0 - 31.132.199.255 ro 31.132.200.0 - 31.132.207.255 nl -31.132.208.0 - 31.132.239.255 ru -31.132.240.0 - 31.132.255.255 ro +31.132.208.0 - 31.132.255.255 ru 31.133.0.0 - 31.133.7.255 pl 31.133.8.0 - 31.133.15.255 cz 31.133.16.0 - 31.133.23.255 pl 31.133.24.0 - 31.133.31.255 ro 31.133.32.0 - 31.133.95.255 ua -31.133.96.0 - 31.133.103.255 ro 31.133.104.0 - 31.133.111.255 ru 31.133.112.0 - 31.133.119.255 ua 31.133.120.0 - 31.133.127.255 ru -31.133.128.0 - 31.133.191.255 ch +31.133.128.0 - 31.133.191.255 us 31.133.192.0 - 31.133.199.255 ro 31.133.200.0 - 31.133.207.255 ru 31.133.208.0 - 31.133.223.255 kz @@ -1630,10 +4217,9 @@ 31.135.16.0 - 31.135.31.255 pl 31.135.32.0 - 31.135.95.255 ru 31.135.96.0 - 31.135.159.255 ua -31.135.160.0 - 31.135.167.255 pl -31.135.168.0 - 31.135.175.255 ro +31.135.160.0 - 31.135.175.255 pl 31.135.176.0 - 31.135.183.255 ua -31.135.184.0 - 31.135.191.255 ro +31.135.184.0 - 31.135.191.255 ru 31.135.192.0 - 31.135.207.255 pl 31.135.208.0 - 31.135.215.255 uz 31.135.216.0 - 31.135.223.255 lt @@ -1644,36 +4230,57 @@ 31.145.0.0 - 31.145.255.255 tr 31.146.0.0 - 31.146.255.255 ge 31.147.0.0 - 31.147.255.255 hr -31.148.0.0 - 31.148.127.255 ru -31.148.128.0 - 31.148.129.255 ua -31.148.130.0 - 31.148.131.255 ru -31.148.132.0 - 31.148.135.255 de +31.148.0.0 - 31.148.0.255 cz +31.148.1.0 - 31.148.4.255 ru +31.148.5.0 - 31.148.5.255 cz +31.148.6.0 - 31.148.11.255 ru +31.148.12.0 - 31.148.15.255 ua +31.148.16.0 - 31.148.19.255 ru +31.148.20.0 - 31.148.20.255 cz +31.148.21.0 - 31.148.21.255 ru +31.148.22.0 - 31.148.22.255 kz +31.148.23.0 - 31.148.23.255 ua +31.148.24.0 - 31.148.24.255 ru +31.148.25.0 - 31.148.25.255 ua +31.148.26.0 - 31.148.27.255 ru +31.148.28.0 - 31.148.29.255 ua +31.148.30.0 - 31.148.30.255 cz +31.148.31.0 - 31.148.31.255 by +31.148.32.0 - 31.148.95.255 ru +31.148.96.0 - 31.148.99.255 cz +31.148.100.0 - 31.148.129.255 ru +31.148.130.0 - 31.148.131.255 cz +31.148.132.0 - 31.148.135.255 ru 31.148.136.0 - 31.148.139.255 cz 31.148.140.0 - 31.148.143.255 ru -31.148.144.0 - 31.148.151.255 nl -31.148.152.0 - 31.148.155.255 ua -31.148.156.0 - 31.148.163.255 ru -31.148.164.0 - 31.148.167.255 kg -31.148.168.0 - 31.148.169.255 ua -31.148.170.0 - 31.148.171.255 il -31.148.172.0 - 31.148.179.255 ru -31.148.180.0 - 31.148.181.255 ua -31.148.182.0 - 31.148.183.255 cy -31.148.184.0 - 31.148.191.255 ua +31.148.144.0 - 31.148.147.255 cz +31.148.148.0 - 31.148.175.255 ru +31.148.176.0 - 31.148.191.255 ua 31.148.192.0 - 31.148.195.255 in -31.148.196.0 - 31.148.201.255 ru -31.148.202.0 - 31.148.203.255 ua +31.148.196.0 - 31.148.199.255 ru +31.148.200.0 - 31.148.203.255 cz 31.148.204.0 - 31.148.207.255 uz -31.148.208.0 - 31.148.215.255 ru -31.148.216.0 - 31.148.243.255 cz -31.148.244.0 - 31.148.247.255 ru +31.148.208.0 - 31.148.211.255 cz +31.148.212.0 - 31.148.215.255 gb +31.148.216.0 - 31.148.216.255 nl +31.148.217.0 - 31.148.217.255 cz +31.148.218.0 - 31.148.218.255 ua +31.148.219.0 - 31.148.220.255 nl +31.148.221.0 - 31.148.222.255 cz +31.148.223.0 - 31.148.223.255 ru +31.148.224.0 - 31.148.235.255 cz +31.148.236.0 - 31.148.247.255 ru 31.148.248.0 - 31.148.251.255 kz 31.148.252.0 - 31.148.255.255 ua 31.149.0.0 - 31.149.255.255 nl 31.150.0.0 - 31.150.255.255 de 31.151.0.0 - 31.151.255.255 nl 31.152.0.0 - 31.152.255.255 gr -31.153.0.0 - 31.153.255.255 cy +31.153.0.0 - 31.153.127.255 cy +31.153.128.0 - 31.153.207.255 gr +31.153.208.0 - 31.153.208.255 cy +31.153.209.0 - 31.153.231.255 gr +31.153.232.0 - 31.153.255.255 cy 31.154.0.0 - 31.154.255.255 il 31.155.0.0 - 31.155.255.255 tr 31.156.0.0 - 31.159.255.255 it @@ -1685,12 +4292,10 @@ 31.169.0.0 - 31.169.31.255 kz 31.169.32.0 - 31.169.39.255 gb 31.169.40.0 - 31.169.47.255 fr -31.169.48.0 - 31.169.55.255 gb +31.169.48.0 - 31.169.55.255 no 31.169.56.0 - 31.169.63.255 nl 31.169.64.0 - 31.169.95.255 tr -31.169.96.0 - 31.169.97.191 ie -31.169.97.192 - 31.169.97.223 ir -31.169.97.224 - 31.169.103.255 ie +31.169.96.0 - 31.169.103.255 ie 31.169.104.0 - 31.169.111.255 it 31.169.112.0 - 31.169.119.255 gb 31.169.120.0 - 31.169.127.255 ru @@ -1698,8 +4303,7 @@ 31.170.0.0 - 31.170.7.255 ie 31.170.8.0 - 31.170.15.255 fr 31.170.16.0 - 31.170.23.255 lv -31.170.24.0 - 31.170.30.255 se -31.170.31.0 - 31.170.31.255 de +31.170.24.0 - 31.170.31.255 se 31.170.32.0 - 31.170.39.255 ru 31.170.40.0 - 31.170.47.255 it 31.170.48.0 - 31.170.63.255 ir @@ -1717,14 +4321,8 @@ 31.170.184.0 - 31.170.191.255 ru 31.170.192.0 - 31.170.223.255 de 31.170.224.0 - 31.171.127.255 az -31.171.128.0 - 31.171.129.223 nl -31.171.129.224 - 31.171.129.255 ru -31.171.130.0 - 31.171.131.255 nl -31.171.132.0 - 31.171.132.127 us -31.171.132.128 - 31.171.132.255 nl -31.171.133.0 - 31.171.133.63 us -31.171.133.64 - 31.171.133.127 nl -31.171.133.128 - 31.171.135.255 us +31.171.128.0 - 31.171.133.255 nl +31.171.134.0 - 31.171.135.255 us 31.171.136.0 - 31.171.143.255 it 31.171.144.0 - 31.171.151.255 ch 31.171.152.0 - 31.171.159.255 al @@ -1733,31 +4331,74 @@ 31.171.200.0 - 31.171.215.255 nl 31.171.216.0 - 31.171.223.255 ir 31.171.224.0 - 31.171.239.255 hu -31.171.240.0 - 31.171.255.255 ch -31.172.0.0 - 31.172.1.255 de -31.172.2.0 - 31.172.7.255 ch +31.171.240.0 - 31.172.7.255 ch 31.172.8.0 - 31.172.15.255 de -31.172.16.0 - 31.172.19.255 ch -31.172.20.0 - 31.172.21.255 us -31.172.22.0 - 31.172.23.255 jp -31.172.24.0 - 31.172.55.255 ch -31.172.56.0 - 31.172.127.255 de +31.172.16.0 - 31.172.23.255 ch +31.172.24.0 - 31.172.24.255 de +31.172.25.0 - 31.172.25.255 ch +31.172.26.0 - 31.172.26.255 de +31.172.27.0 - 31.172.55.255 ch +31.172.56.0 - 31.172.95.255 de +31.172.96.0 - 31.172.103.255 ch +31.172.104.0 - 31.172.127.255 de 31.172.128.0 - 31.172.135.255 ru 31.172.136.0 - 31.172.143.255 ua 31.172.144.0 - 31.172.151.255 lu 31.172.152.0 - 31.172.159.255 fi +31.172.160.0 - 31.172.167.255 fr +31.172.176.0 - 31.172.191.255 pl 31.172.192.0 - 31.172.223.255 ru -31.172.224.0 - 31.172.224.255 gb -31.172.225.0 - 31.172.231.255 no -31.172.232.0 - 31.172.232.45 fr -31.172.232.46 - 31.172.232.47 gb -31.172.232.48 - 31.172.232.111 fr -31.172.232.112 - 31.172.235.255 gb -31.172.236.0 - 31.172.236.127 fr -31.172.236.128 - 31.172.236.255 gb -31.172.237.0 - 31.172.237.63 fr -31.172.237.64 - 31.172.255.255 gb -31.173.0.0 - 31.173.255.255 ro +31.172.232.0 - 31.172.239.255 fr +31.172.240.0 - 31.172.240.175 gb +31.172.240.176 - 31.172.240.183 it +31.172.240.184 - 31.172.240.231 gb +31.172.240.232 - 31.172.240.239 it +31.172.240.240 - 31.172.241.119 gb +31.172.241.120 - 31.172.241.127 it +31.172.241.128 - 31.172.243.95 gb +31.172.243.96 - 31.172.243.103 it +31.172.243.104 - 31.172.243.111 gb +31.172.243.112 - 31.172.243.119 it +31.172.243.120 - 31.172.243.255 gb +31.172.244.0 - 31.172.244.7 it +31.172.244.8 - 31.172.244.143 gb +31.172.244.144 - 31.172.244.151 it +31.172.244.152 - 31.172.247.15 gb +31.172.247.16 - 31.172.247.23 it +31.172.247.24 - 31.172.247.47 gb +31.172.247.48 - 31.172.247.55 it +31.172.247.56 - 31.172.247.87 gb +31.172.247.88 - 31.172.247.95 it +31.172.247.96 - 31.172.247.119 gb +31.172.247.120 - 31.172.247.127 it +31.172.247.128 - 31.172.247.199 gb +31.172.247.200 - 31.172.247.207 it +31.172.247.208 - 31.172.248.15 gb +31.172.248.16 - 31.172.248.23 it +31.172.248.24 - 31.172.248.31 gb +31.172.248.32 - 31.172.248.39 it +31.172.248.40 - 31.172.248.223 gb +31.172.248.224 - 31.172.248.231 it +31.172.248.232 - 31.172.251.47 gb +31.172.251.48 - 31.172.251.55 it +31.172.251.56 - 31.172.251.175 gb +31.172.251.176 - 31.172.251.183 it +31.172.251.184 - 31.172.252.7 gb +31.172.252.8 - 31.172.252.15 it +31.172.252.16 - 31.172.252.183 gb +31.172.252.184 - 31.172.252.191 it +31.172.252.192 - 31.172.253.135 gb +31.172.253.136 - 31.172.253.143 it +31.172.253.144 - 31.172.253.167 gb +31.172.253.168 - 31.172.253.175 it +31.172.253.176 - 31.172.253.191 gb +31.172.253.192 - 31.172.253.199 it +31.172.253.200 - 31.172.253.215 gb +31.172.253.216 - 31.172.253.223 it +31.172.253.224 - 31.172.253.247 gb +31.172.253.248 - 31.172.253.255 it +31.172.254.0 - 31.172.255.255 gb +31.173.0.0 - 31.173.255.255 ru 31.174.0.0 - 31.175.255.255 pl 31.176.0.0 - 31.176.127.255 tr 31.176.128.0 - 31.176.255.255 ba @@ -1765,7 +4406,8 @@ 31.177.8.0 - 31.177.15.255 lt 31.177.16.0 - 31.177.23.255 gb 31.177.24.0 - 31.177.31.255 cz -31.177.32.0 - 31.177.39.255 nl +31.177.32.0 - 31.177.38.255 nl +31.177.39.0 - 31.177.39.255 iq 31.177.40.0 - 31.177.47.255 it 31.177.48.0 - 31.177.55.255 es 31.177.56.0 - 31.177.63.255 gr @@ -1781,12 +4423,14 @@ 31.184.0.0 - 31.184.63.255 de 31.184.64.0 - 31.184.127.255 nl 31.184.128.0 - 31.184.191.255 ir -31.184.192.0 - 31.184.231.255 ru -31.184.232.0 - 31.184.233.255 lu -31.184.234.0 - 31.184.234.255 ru -31.184.235.0 - 31.184.236.255 ua -31.184.237.0 - 31.184.237.255 gb -31.184.238.0 - 31.185.15.255 ru +31.184.192.0 - 31.184.223.255 ru +31.184.224.0 - 31.184.227.255 de +31.184.228.0 - 31.184.233.255 ru +31.184.234.0 - 31.184.234.255 me +31.184.235.0 - 31.184.235.255 nl +31.184.236.0 - 31.184.239.255 ru +31.184.240.0 - 31.184.240.255 gb +31.184.241.0 - 31.185.15.255 ru 31.185.16.0 - 31.185.23.255 it 31.185.24.0 - 31.185.31.255 no 31.185.32.0 - 31.185.63.255 gb @@ -1804,34 +4448,64 @@ 31.186.88.0 - 31.186.95.255 no 31.186.96.0 - 31.186.103.255 ru 31.186.104.0 - 31.186.111.255 gr -31.186.112.0 - 31.186.114.255 je -31.186.115.0 - 31.186.115.15 gb -31.186.115.16 - 31.186.115.23 je -31.186.115.24 - 31.186.115.63 gb -31.186.115.64 - 31.186.119.255 je +31.186.112.0 - 31.186.115.151 je +31.186.115.152 - 31.186.115.159 gb +31.186.115.160 - 31.186.119.255 je 31.186.120.0 - 31.186.127.255 de 31.186.128.0 - 31.186.159.255 ru 31.186.160.0 - 31.186.175.255 nl 31.186.176.0 - 31.186.183.255 ps 31.186.184.0 - 31.186.191.255 cz 31.186.192.0 - 31.186.223.255 pl -31.186.224.0 - 31.186.225.255 us -31.186.226.0 - 31.186.255.255 gb -31.187.0.0 - 31.187.63.255 pl -31.187.64.0 - 31.187.95.255 de +31.186.224.0 - 31.186.226.255 gb +31.186.227.0 - 31.186.227.255 de +31.186.228.0 - 31.186.236.159 gb +31.186.236.160 - 31.186.236.175 us +31.186.236.176 - 31.186.237.255 gb +31.186.238.0 - 31.186.238.51 fr +31.186.238.52 - 31.186.238.52 gb +31.186.238.53 - 31.186.238.255 fr +31.186.239.0 - 31.186.249.255 gb +31.186.250.0 - 31.186.251.255 de +31.186.252.0 - 31.186.254.255 gb +31.186.255.0 - 31.186.255.255 nl +31.187.0.0 - 31.187.63.255 ie +31.187.64.0 - 31.187.65.255 nl +31.187.66.0 - 31.187.66.255 de +31.187.67.0 - 31.187.67.127 nl +31.187.67.128 - 31.187.67.159 ar +31.187.67.160 - 31.187.67.191 pa +31.187.67.192 - 31.187.70.45 de +31.187.70.46 - 31.187.70.46 gb +31.187.70.47 - 31.187.71.255 de +31.187.72.0 - 31.187.75.255 us +31.187.76.0 - 31.187.76.255 nl +31.187.77.0 - 31.187.87.255 de +31.187.88.0 - 31.187.91.255 nl +31.187.92.0 - 31.187.92.255 lu +31.187.93.0 - 31.187.93.31 gb +31.187.93.32 - 31.187.93.47 ca +31.187.93.48 - 31.187.93.63 br +31.187.93.64 - 31.187.93.79 mx +31.187.93.80 - 31.187.93.95 pl +31.187.93.96 - 31.187.93.127 fr +31.187.93.128 - 31.187.93.159 it +31.187.93.160 - 31.187.93.223 se +31.187.93.224 - 31.187.93.255 ru +31.187.94.0 - 31.187.94.255 nl +31.187.95.0 - 31.187.95.95 de +31.187.95.96 - 31.187.95.255 nl 31.187.96.0 - 31.187.103.255 ru 31.187.104.0 - 31.187.111.255 it 31.187.112.0 - 31.187.127.255 de 31.187.128.0 - 31.187.255.255 nl 31.188.0.0 - 31.191.255.255 it 31.192.0.0 - 31.192.63.255 ge -31.192.64.0 - 31.192.95.255 cz +31.192.64.0 - 31.192.95.225 cz +31.192.95.226 - 31.192.95.226 sk +31.192.95.227 - 31.192.95.255 cz 31.192.96.0 - 31.192.103.255 gb -31.192.104.0 - 31.192.105.191 ru -31.192.105.192 - 31.192.105.255 in -31.192.106.0 - 31.192.108.255 ru -31.192.109.0 - 31.192.109.255 in -31.192.110.0 - 31.192.111.255 ru +31.192.104.0 - 31.192.111.255 ru 31.192.112.0 - 31.192.127.255 nl 31.192.128.0 - 31.192.191.255 ru 31.192.192.0 - 31.192.207.255 se @@ -1839,13 +4513,10 @@ 31.192.216.0 - 31.192.223.255 pl 31.192.224.0 - 31.192.231.255 se 31.192.232.0 - 31.192.239.255 ru -31.192.240.0 - 31.192.240.255 gb -31.192.241.0 - 31.192.241.255 in -31.192.242.0 - 31.192.247.255 gb +31.192.240.0 - 31.192.247.255 gb 31.192.248.0 - 31.192.255.255 kg 31.193.0.0 - 31.193.15.255 gb -31.193.16.0 - 31.193.31.255 it -31.193.32.0 - 31.193.39.255 sm +31.193.16.0 - 31.193.39.255 it 31.193.40.0 - 31.193.47.255 be 31.193.48.0 - 31.193.55.255 fr 31.193.56.0 - 31.193.63.255 it @@ -1864,7 +4535,8 @@ 31.193.192.0 - 31.193.199.255 lt 31.193.200.0 - 31.193.207.255 se 31.193.208.0 - 31.193.215.255 ch -31.193.216.0 - 31.193.223.255 ie +31.193.216.0 - 31.193.222.255 ie +31.193.223.0 - 31.193.223.255 gb 31.193.224.0 - 31.193.231.255 es 31.193.232.0 - 31.193.239.255 dk 31.193.240.0 - 31.193.247.255 fr @@ -1877,446 +4549,25 @@ 31.200.216.0 - 31.200.239.255 ru 31.200.240.0 - 31.200.247.255 es 31.200.248.0 - 31.200.255.255 ru -31.201.0.0 - 31.201.0.3 us -31.201.0.4 - 31.201.0.7 cn -31.201.0.8 - 31.201.0.11 jp -31.201.0.12 - 31.201.0.15 de -31.201.0.16 - 31.201.0.19 fr -31.201.0.20 - 31.201.0.23 gb -31.201.0.24 - 31.201.0.27 br -31.201.0.28 - 31.201.0.31 it -31.201.0.32 - 31.201.0.35 ca -31.201.0.36 - 31.201.0.39 in -31.201.0.40 - 31.201.0.43 ru -31.201.0.44 - 31.201.0.47 es -31.201.0.48 - 31.201.0.51 au -31.201.0.52 - 31.201.0.55 mx -31.201.0.56 - 31.201.0.59 kr -31.201.0.60 - 31.201.0.63 nl -31.201.0.64 - 31.201.0.67 tr -31.201.0.68 - 31.201.0.71 id -31.201.0.72 - 31.201.0.75 ch -31.201.0.76 - 31.201.0.79 pl -31.201.0.80 - 31.201.0.83 be -31.201.0.84 - 31.201.0.87 se -31.201.0.88 - 31.201.0.91 sa -31.201.0.92 - 31.201.0.95 tw -31.201.0.96 - 31.201.0.99 sj -31.201.0.100 - 31.201.0.103 at -31.201.0.104 - 31.201.0.107 ar -31.201.0.108 - 31.201.0.111 za -31.201.0.112 - 31.201.0.115 ir -31.201.0.116 - 31.201.0.119 th -31.201.0.120 - 31.201.0.123 dk -31.201.0.124 - 31.201.0.127 gr -31.201.0.128 - 31.201.0.131 ae -31.201.0.132 - 31.201.0.135 ve -31.201.0.136 - 31.201.0.139 co -31.201.0.140 - 31.201.0.143 fi -31.201.0.144 - 31.201.0.147 mv -31.201.0.148 - 31.201.0.151 pt -31.201.0.152 - 31.201.0.155 hk -31.201.0.156 - 31.201.0.159 sg -31.201.0.160 - 31.201.0.163 eg -31.201.0.164 - 31.201.0.167 ng -31.201.0.168 - 31.201.0.171 il -31.201.0.172 - 31.201.0.175 ie -31.201.0.176 - 31.201.0.179 cl -31.201.0.180 - 31.201.0.183 cz -31.201.0.184 - 31.201.0.187 ph -31.201.0.188 - 31.201.0.191 pk -31.201.0.192 - 31.201.0.195 ro -31.201.0.196 - 31.201.0.199 dz -31.201.0.200 - 31.201.0.203 pe -31.201.0.204 - 31.201.0.207 nz -31.201.0.208 - 31.201.0.211 kz -31.201.0.212 - 31.201.0.215 ua -31.201.0.216 - 31.201.0.219 kw -31.201.0.220 - 31.201.0.223 qa -31.201.0.224 - 31.201.0.255 de -31.201.1.0 - 31.201.1.3 hu -31.201.1.4 - 31.201.1.7 bd -31.201.1.8 - 31.201.1.11 vn -31.201.1.12 - 31.201.1.15 ma -31.201.1.16 - 31.201.1.19 sk -31.201.1.20 - 31.201.1.23 ao -31.201.1.24 - 31.201.1.27 iq -31.201.1.28 - 31.201.1.31 ly -31.201.1.32 - 31.201.1.35 sd -31.201.1.36 - 31.201.1.39 ec -31.201.1.40 - 31.201.1.43 hr -31.201.1.44 - 31.201.1.47 sy -31.201.1.48 - 31.201.1.51 om -31.201.1.52 - 31.201.1.55 by -31.201.1.56 - 31.201.1.59 lu -31.201.1.60 - 31.201.1.63 az -31.201.1.64 - 31.201.1.67 do -31.201.1.68 - 31.201.1.71 lk -31.201.1.72 - 31.201.1.75 si -31.201.1.76 - 31.201.1.79 fr -31.201.1.80 - 31.201.1.83 bg -31.201.1.84 - 31.201.1.87 tn -31.201.1.88 - 31.201.1.91 gt -31.201.1.92 - 31.201.1.95 uy -31.201.1.96 - 31.201.1.99 lb -31.201.1.100 - 31.201.1.103 uz -31.201.1.104 - 31.201.1.107 rs -31.201.1.108 - 31.201.1.111 lt -31.201.1.112 - 31.201.1.115 mm -31.201.1.116 - 31.201.1.119 cr -31.201.1.120 - 31.201.1.123 ke -31.201.1.124 - 31.201.1.127 et -31.201.1.128 - 31.201.1.131 ye -31.201.1.132 - 31.201.1.135 pa -31.201.1.136 - 31.201.1.139 jo -31.201.1.140 - 31.201.1.143 lv -31.201.1.144 - 31.201.1.147 cy -31.201.1.148 - 31.201.1.151 tz -31.201.1.152 - 31.201.1.155 ci -31.201.1.156 - 31.201.1.159 cm -31.201.1.160 - 31.201.1.163 sv -31.201.1.164 - 31.201.1.167 bh -31.201.1.168 - 31.201.1.171 tt -31.201.1.172 - 31.201.1.175 ee -31.201.1.176 - 31.201.1.179 bo -31.201.1.180 - 31.201.1.183 gh -31.201.1.184 - 31.201.1.187 py -31.201.1.188 - 31.201.1.191 ug -31.201.1.192 - 31.201.1.195 af -31.201.1.196 - 31.201.1.199 ba -31.201.1.200 - 31.201.1.203 zm -31.201.1.204 - 31.201.1.207 hn -31.201.1.208 - 31.201.1.211 np -31.201.1.212 - 31.201.1.215 gq -31.201.1.216 - 31.201.1.219 jm -31.201.1.220 - 31.201.1.223 is -31.201.1.224 - 31.201.1.255 de -31.201.2.0 - 31.201.2.3 sn -31.201.2.4 - 31.201.2.7 cd -31.201.2.8 - 31.201.2.11 ga -31.201.2.12 - 31.201.2.15 us -31.201.2.16 - 31.201.2.19 bn -31.201.2.20 - 31.201.2.23 cg -31.201.2.24 - 31.201.2.27 al -31.201.2.28 - 31.201.2.31 na -31.201.2.32 - 31.201.2.35 kh -31.201.2.36 - 31.201.2.39 ge -31.201.2.40 - 31.201.2.43 mk -31.201.2.44 - 31.201.2.47 mu -31.201.2.48 - 31.201.2.51 ml -31.201.2.52 - 31.201.2.55 am -31.201.2.56 - 31.201.2.59 pg -31.201.2.60 - 31.201.2.63 bf -31.201.2.64 - 31.201.2.67 mg -31.201.2.68 - 31.201.2.71 mt -31.201.2.72 - 31.201.2.75 td -31.201.2.76 - 31.201.2.79 bs -31.201.2.80 - 31.201.2.83 ht -31.201.2.84 - 31.201.2.87 bj -31.201.2.88 - 31.201.2.91 ni -31.201.2.92 - 31.201.2.95 ls -31.201.2.96 - 31.201.2.99 mn -31.201.2.100 - 31.201.2.103 rw -31.201.2.104 - 31.201.2.107 ne -31.201.2.108 - 31.201.2.111 tj -31.201.2.112 - 31.201.2.115 zw -31.201.2.116 - 31.201.2.119 md -31.201.2.120 - 31.201.2.123 mw -31.201.2.124 - 31.201.2.127 kg -31.201.2.128 - 31.201.2.131 gn -31.201.2.132 - 31.201.2.135 bb -31.201.2.136 - 31.201.2.139 me -31.201.2.140 - 31.201.2.143 mr -31.201.2.144 - 31.201.2.147 sr -31.201.2.148 - 31.201.2.151 sz -31.201.2.152 - 31.201.2.155 fj -31.201.2.156 - 31.201.2.159 tg -31.201.2.160 - 31.201.2.163 er -31.201.2.164 - 31.201.2.167 gy -31.201.2.168 - 31.201.2.171 cf -31.201.2.172 - 31.201.2.175 sl -31.201.2.176 - 31.201.2.179 ls -31.201.2.180 - 31.201.2.183 cv -31.201.2.184 - 31.201.2.187 bi -31.201.2.188 - 31.201.2.191 mv -31.201.2.192 - 31.201.2.195 bz -31.201.2.196 - 31.201.2.199 bt -31.201.2.200 - 31.201.2.203 dj -31.201.2.204 - 31.201.2.207 ag -31.201.2.208 - 31.201.2.211 gm -31.201.2.212 - 31.201.2.215 lc -31.201.2.216 - 31.201.2.219 lr -31.201.2.220 - 31.201.2.223 sc -31.201.2.224 - 31.201.2.255 de -31.201.3.0 - 31.201.3.223 us -31.201.3.224 - 31.201.3.255 de -31.201.4.0 - 31.201.4.223 cn -31.201.4.224 - 31.201.4.255 de -31.201.5.0 - 31.201.5.223 jp -31.201.5.224 - 31.201.6.255 de -31.201.7.0 - 31.201.7.223 fr -31.201.7.224 - 31.201.7.255 de -31.201.8.0 - 31.201.8.223 gb -31.201.8.224 - 31.201.8.255 de -31.201.9.0 - 31.201.9.223 br -31.201.9.224 - 31.201.9.255 de -31.201.10.0 - 31.201.10.223 it -31.201.10.224 - 31.201.10.255 de -31.201.11.0 - 31.201.11.223 ca -31.201.11.224 - 31.201.11.255 de -31.201.12.0 - 31.201.12.223 in -31.201.12.224 - 31.201.12.255 de -31.201.13.0 - 31.201.13.223 es -31.201.13.224 - 31.201.13.255 de -31.201.14.0 - 31.201.14.223 au -31.201.14.224 - 31.201.14.255 de -31.201.15.0 - 31.201.15.223 kr -31.201.15.224 - 31.201.15.255 de -31.201.16.0 - 31.201.16.223 nl -31.201.16.224 - 31.201.16.255 de -31.201.17.0 - 31.201.17.255 dk -31.201.18.0 - 31.201.18.255 ee -31.201.19.0 - 31.201.19.255 fo -31.201.20.0 - 31.201.20.255 ge -31.201.21.0 - 31.201.21.255 fr -31.201.22.0 - 31.201.22.255 de -31.201.23.0 - 31.201.23.255 gi -31.201.24.0 - 31.201.24.255 gr -31.201.25.0 - 31.201.25.255 gl -31.201.26.0 - 31.201.26.255 gg -31.201.27.0 - 31.201.27.255 va -31.201.28.0 - 31.201.28.255 hu -31.201.29.0 - 31.201.29.255 is -31.201.30.0 - 31.201.30.255 ir -31.201.31.0 - 31.201.31.255 iq -31.201.32.0 - 31.201.32.255 ie -31.201.33.0 - 31.201.33.255 im -31.201.34.0 - 31.201.34.255 il -31.201.35.0 - 31.201.35.255 it -31.201.36.0 - 31.201.36.255 je -31.201.37.0 - 31.201.37.255 jo -31.201.38.0 - 31.201.38.255 kz -31.201.39.0 - 31.201.39.255 kw -31.201.40.0 - 31.201.40.255 kg -31.201.41.0 - 31.201.41.255 lv -31.201.42.0 - 31.201.42.255 lb -31.201.43.0 - 31.201.43.255 li -31.201.44.0 - 31.201.44.255 lt -31.201.45.0 - 31.201.45.255 lu -31.201.46.0 - 31.201.46.255 mt -31.201.47.0 - 31.201.47.255 mc -31.201.48.0 - 31.201.48.255 me -31.201.49.0 - 31.201.49.255 nl -31.201.50.0 - 31.201.50.255 no -31.201.51.0 - 31.201.51.255 om -31.201.52.0 - 31.201.52.255 ps -31.201.53.0 - 31.201.53.255 pl -31.201.54.0 - 31.201.54.255 pt -31.201.55.0 - 31.201.55.255 ro -31.201.56.0 - 31.201.56.255 ru -31.201.57.0 - 31.201.57.255 sm -31.201.58.0 - 31.201.58.255 sa -31.201.59.0 - 31.201.59.255 rs -31.201.60.0 - 31.201.60.255 sk -31.201.61.0 - 31.201.61.255 si -31.201.62.0 - 31.201.62.255 es -31.201.63.0 - 31.201.63.255 se -31.201.64.0 - 31.201.64.255 ch -31.201.65.0 - 31.201.65.255 sy -31.201.66.0 - 31.201.66.255 tj -31.201.67.0 - 31.201.67.255 tr -31.201.68.0 - 31.201.68.255 tm -31.201.69.0 - 31.201.69.255 ua -31.201.70.0 - 31.201.70.255 ae -31.201.71.0 - 31.201.71.255 gb -31.201.72.0 - 31.201.72.255 uz -31.201.73.0 - 31.201.73.255 ye -31.201.74.0 - 31.201.74.255 ax -31.201.75.0 - 31.201.75.255 al -31.201.76.0 - 31.201.76.255 ad -31.201.77.0 - 31.201.77.255 am -31.201.78.0 - 31.201.78.255 at -31.201.79.0 - 31.201.79.255 az -31.201.80.0 - 31.201.80.255 bh -31.201.81.0 - 31.201.81.255 by -31.201.82.0 - 31.201.82.255 be -31.201.83.0 - 31.201.83.255 ba -31.201.84.0 - 31.201.84.255 bg -31.201.85.0 - 31.201.85.255 hr -31.201.86.0 - 31.201.86.255 cy -31.201.87.0 - 31.201.87.255 cz -31.201.88.0 - 31.201.88.255 dk -31.201.89.0 - 31.201.89.255 ee -31.201.90.0 - 31.201.90.255 fo -31.201.91.0 - 31.201.91.255 ge -31.201.92.0 - 31.201.92.255 fr -31.201.93.0 - 31.201.93.255 de -31.201.94.0 - 31.201.94.255 gi -31.201.95.0 - 31.201.95.255 gr -31.201.96.0 - 31.201.96.255 gl -31.201.97.0 - 31.201.97.255 gg -31.201.98.0 - 31.201.98.255 va -31.201.99.0 - 31.201.99.255 hu -31.201.100.0 - 31.201.100.255 is -31.201.101.0 - 31.201.101.255 ir -31.201.102.0 - 31.201.102.255 iq -31.201.103.0 - 31.201.103.255 ie -31.201.104.0 - 31.201.104.255 im -31.201.105.0 - 31.201.105.255 il -31.201.106.0 - 31.201.106.255 it -31.201.107.0 - 31.201.107.255 je -31.201.108.0 - 31.201.108.255 jo -31.201.109.0 - 31.201.109.255 kz -31.201.110.0 - 31.201.110.255 kw -31.201.111.0 - 31.201.111.255 kg -31.201.112.0 - 31.201.112.255 lv -31.201.113.0 - 31.201.113.255 lb -31.201.114.0 - 31.201.114.255 li -31.201.115.0 - 31.201.115.255 lt -31.201.116.0 - 31.201.116.255 lu -31.201.117.0 - 31.201.117.255 mt -31.201.118.0 - 31.201.118.255 mc -31.201.119.0 - 31.201.119.255 me -31.201.120.0 - 31.201.120.255 nl -31.201.121.0 - 31.201.121.255 no -31.201.122.0 - 31.201.122.255 om -31.201.123.0 - 31.201.123.255 pt -31.201.124.0 - 31.201.124.255 ro -31.201.125.0 - 31.201.125.255 ru -31.201.126.0 - 31.201.126.255 sm -31.201.127.0 - 31.201.127.255 sa -31.201.128.0 - 31.201.128.255 rs -31.201.129.0 - 31.201.129.255 sk -31.201.130.0 - 31.201.130.255 si -31.201.131.0 - 31.201.131.255 es -31.201.132.0 - 31.201.132.255 se -31.201.133.0 - 31.201.133.255 ch -31.201.134.0 - 31.201.134.255 sy -31.201.135.0 - 31.201.135.255 tj -31.201.136.0 - 31.201.136.255 tm -31.201.137.0 - 31.201.137.255 ua -31.201.138.0 - 31.201.138.255 ae -31.201.139.0 - 31.201.139.255 gb -31.201.140.0 - 31.201.140.255 uz -31.201.141.0 - 31.201.141.255 ax -31.201.142.0 - 31.201.142.255 al -31.201.143.0 - 31.201.143.255 ad -31.201.144.0 - 31.201.144.255 am -31.201.145.0 - 31.201.145.255 at -31.201.146.0 - 31.201.146.255 az -31.201.147.0 - 31.201.147.255 bh -31.201.148.0 - 31.201.148.255 by -31.201.149.0 - 31.201.149.255 be -31.201.150.0 - 31.201.150.255 ba -31.201.151.0 - 31.201.151.255 bg -31.201.152.0 - 31.201.152.255 hr -31.201.153.0 - 31.201.153.255 fr -31.201.154.0 - 31.201.154.255 cz -31.201.155.0 - 31.201.155.255 fr -31.201.156.0 - 31.201.156.255 ee -31.201.157.0 - 31.201.157.255 fo -31.201.158.0 - 31.201.158.255 ge -31.201.159.0 - 31.201.159.255 fr -31.201.160.0 - 31.201.160.255 de -31.201.161.0 - 31.201.161.255 gi -31.201.162.0 - 31.201.162.255 gr -31.201.163.0 - 31.201.163.255 gl -31.201.164.0 - 31.201.164.255 gg -31.201.165.0 - 31.201.165.255 va -31.201.166.0 - 31.201.166.255 hu -31.201.167.0 - 31.201.167.255 is -31.201.168.0 - 31.201.168.255 ir -31.201.169.0 - 31.201.169.255 iq -31.201.170.0 - 31.201.170.255 ie -31.201.171.0 - 31.201.171.255 im -31.201.172.0 - 31.201.172.255 il -31.201.173.0 - 31.201.173.255 it -31.201.174.0 - 31.201.174.255 je -31.201.175.0 - 31.201.175.255 jo -31.201.176.0 - 31.201.176.255 kz -31.201.177.0 - 31.201.177.255 kw -31.201.178.0 - 31.201.178.255 kg -31.201.179.0 - 31.201.179.255 lv -31.201.180.0 - 31.201.180.255 lb -31.201.181.0 - 31.201.181.255 li -31.201.182.0 - 31.201.182.255 lt -31.201.183.0 - 31.201.183.255 lu -31.201.184.0 - 31.201.184.255 mt -31.201.185.0 - 31.201.185.255 mc -31.201.186.0 - 31.201.186.255 me -31.201.187.0 - 31.201.187.255 nl -31.201.188.0 - 31.201.188.255 no -31.201.189.0 - 31.201.189.255 om -31.201.190.0 - 31.201.190.255 pt -31.201.191.0 - 31.201.191.255 ro -31.201.192.0 - 31.201.192.255 ru -31.201.193.0 - 31.201.193.255 sm -31.201.194.0 - 31.201.194.255 sa -31.201.195.0 - 31.201.195.255 rs -31.201.196.0 - 31.201.196.255 sk -31.201.197.0 - 31.201.197.255 si -31.201.198.0 - 31.201.198.255 es -31.201.199.0 - 31.201.199.255 se -31.201.200.0 - 31.201.200.255 ch -31.201.201.0 - 31.201.201.255 sy -31.201.202.0 - 31.201.202.255 tj -31.201.203.0 - 31.201.203.255 tr -31.201.204.0 - 31.201.204.255 tm -31.201.205.0 - 31.201.205.255 ua -31.201.206.0 - 31.201.206.255 ae -31.201.207.0 - 31.201.207.255 gb -31.201.208.0 - 31.201.208.255 uz -31.201.209.0 - 31.201.209.255 ye -31.201.210.0 - 31.201.210.255 ax -31.201.211.0 - 31.201.211.255 al -31.201.212.0 - 31.201.212.255 ad -31.201.213.0 - 31.201.213.255 am -31.201.214.0 - 31.201.214.255 at -31.201.215.0 - 31.201.215.255 az -31.201.216.0 - 31.201.216.255 bh -31.201.217.0 - 31.201.218.255 be -31.201.219.0 - 31.201.255.255 fr +31.201.0.0 - 31.201.255.255 nl 31.202.0.0 - 31.202.255.255 ua 31.203.0.0 - 31.203.255.255 kw 31.204.0.0 - 31.204.63.255 ru -31.204.64.0 - 31.204.64.63 de -31.204.64.64 - 31.204.64.95 se +31.204.64.0 - 31.204.64.95 de 31.204.64.96 - 31.204.64.127 fi -31.204.64.128 - 31.204.65.31 de -31.204.65.32 - 31.204.65.63 se +31.204.64.128 - 31.204.65.63 de 31.204.65.64 - 31.204.65.95 fi -31.204.65.96 - 31.204.65.127 dk -31.204.65.128 - 31.204.66.63 de -31.204.66.64 - 31.204.66.95 dk +31.204.65.96 - 31.204.66.95 de 31.204.66.96 - 31.204.66.127 fi -31.204.66.128 - 31.204.66.159 de -31.204.66.160 - 31.204.66.191 se -31.204.66.192 - 31.204.67.31 de -31.204.67.32 - 31.204.67.63 dk -31.204.67.64 - 31.204.67.95 fi -31.204.67.96 - 31.204.67.127 se -31.204.67.128 - 31.204.68.31 de -31.204.68.32 - 31.204.68.63 no -31.204.68.64 - 31.204.68.95 de -31.204.68.96 - 31.204.68.127 dk -31.204.68.128 - 31.204.68.159 se -31.204.68.160 - 31.204.69.31 de -31.204.69.32 - 31.204.69.63 se -31.204.69.64 - 31.204.69.95 no -31.204.69.96 - 31.204.70.31 de -31.204.70.32 - 31.204.70.63 no -31.204.70.64 - 31.204.70.95 se -31.204.70.96 - 31.204.71.63 de -31.204.71.64 - 31.204.71.95 no -31.204.71.96 - 31.204.71.127 de -31.204.71.128 - 31.204.71.159 se -31.204.71.160 - 31.204.71.255 de +31.204.66.128 - 31.204.71.255 de 31.204.72.0 - 31.204.79.255 no 31.204.80.0 - 31.204.87.255 fr 31.204.88.0 - 31.204.95.255 lu 31.204.96.0 - 31.204.111.255 ru 31.204.112.0 - 31.204.127.255 de -31.204.128.0 - 31.204.159.255 nl +31.204.128.0 - 31.204.144.255 nl +31.204.145.0 - 31.204.145.255 jp +31.204.146.0 - 31.204.159.255 nl 31.204.160.0 - 31.204.191.255 ru 31.204.192.0 - 31.204.255.255 me 31.205.0.0 - 31.205.255.255 gb @@ -2327,7 +4578,9 @@ 31.207.88.0 - 31.207.95.255 es 31.207.96.0 - 31.207.127.255 it 31.207.128.0 - 31.207.255.255 ru -31.208.0.0 - 31.209.63.255 se +31.208.0.0 - 31.208.35.249 se +31.208.35.250 - 31.208.35.250 dk +31.208.35.251 - 31.209.63.255 se 31.209.64.0 - 31.209.79.255 lt 31.209.80.0 - 31.209.95.255 de 31.209.96.0 - 31.209.96.0 tr @@ -2337,38 +4590,24 @@ 31.209.104.0 - 31.209.104.0 tr 31.209.104.1 - 31.209.111.255 cy 31.209.112.0 - 31.209.127.255 de -31.209.128.0 - 31.209.128.63 cd -31.209.128.64 - 31.209.128.64 be -31.209.128.65 - 31.209.128.124 cd -31.209.128.125 - 31.209.128.128 be -31.209.128.129 - 31.209.128.156 cd -31.209.128.157 - 31.209.128.160 be -31.209.128.161 - 31.209.128.172 cd -31.209.128.173 - 31.209.128.176 be -31.209.128.177 - 31.209.128.188 cd -31.209.128.189 - 31.209.128.192 be -31.209.128.193 - 31.209.128.204 cd -31.209.128.205 - 31.209.128.208 be -31.209.128.209 - 31.209.128.220 cd -31.209.128.221 - 31.209.128.224 be -31.209.128.225 - 31.209.128.236 cd -31.209.128.237 - 31.209.135.255 be +31.209.128.0 - 31.209.135.255 be 31.209.136.0 - 31.209.159.255 is 31.209.160.0 - 31.209.175.255 de 31.209.176.0 - 31.209.183.255 se 31.209.184.0 - 31.209.191.255 de 31.209.192.0 - 31.209.255.255 is 31.210.0.0 - 31.210.7.255 fr -31.210.8.0 - 31.210.12.15 hu -31.210.12.16 - 31.210.12.23 sk -31.210.12.24 - 31.210.14.255 hu -31.210.15.0 - 31.210.19.255 de -31.210.20.0 - 31.210.23.255 nl +31.210.8.0 - 31.210.9.191 tr +31.210.9.192 - 31.210.9.255 at +31.210.10.0 - 31.210.10.79 tr +31.210.10.80 - 31.210.10.87 at +31.210.10.88 - 31.210.10.255 tr +31.210.11.0 - 31.210.11.15 at +31.210.11.16 - 31.210.13.63 tr +31.210.13.64 - 31.210.13.79 at +31.210.13.80 - 31.210.15.255 tr 31.210.24.0 - 31.210.31.255 gb -31.210.32.0 - 31.210.124.255 tr -31.210.125.0 - 31.210.125.255 no -31.210.126.0 - 31.210.126.255 tr -31.210.127.0 - 31.210.127.255 ro +31.210.32.0 - 31.210.127.255 tr 31.210.128.0 - 31.210.135.255 gb 31.210.136.0 - 31.210.143.255 ru 31.210.144.0 - 31.210.151.255 es @@ -2388,21 +4627,18 @@ 31.211.184.0 - 31.211.191.255 es 31.211.192.0 - 31.211.255.255 se 31.212.0.0 - 31.213.255.255 de -31.214.0.0 - 31.214.127.255 kw -31.214.128.0 - 31.214.153.191 de -31.214.153.192 - 31.214.153.255 us -31.214.154.0 - 31.214.187.255 de -31.214.188.0 - 31.214.188.255 au -31.214.189.0 - 31.214.189.255 pl -31.214.190.0 - 31.214.190.255 tr -31.214.191.0 - 31.214.223.255 de -31.214.224.0 - 31.214.239.255 nl -31.214.240.0 - 31.214.247.255 us -31.214.248.0 - 31.214.255.255 de -31.215.0.0 - 31.215.255.255 ro +31.214.0.0 - 31.214.77.255 kw +31.214.78.0 - 31.214.78.255 us +31.214.79.0 - 31.214.127.255 kw +31.214.128.0 - 31.214.156.255 de +31.214.157.0 - 31.214.157.255 nl +31.214.158.0 - 31.214.175.255 de +31.214.176.0 - 31.214.191.255 es +31.214.192.0 - 31.214.247.255 de +31.214.248.0 - 31.214.255.255 ir +31.215.0.0 - 31.215.255.255 ae 31.216.0.0 - 31.216.15.255 gb -31.216.16.0 - 31.216.30.255 fr -31.216.31.0 - 31.216.31.255 pl +31.216.16.0 - 31.216.31.255 fr 31.216.32.0 - 31.216.39.255 se 31.216.40.0 - 31.216.47.255 ch 31.216.48.0 - 31.216.55.255 gb @@ -2416,9 +4652,7 @@ 31.216.184.0 - 31.216.191.255 ba 31.216.192.0 - 31.216.223.255 hr 31.216.224.0 - 31.216.231.255 se -31.216.232.0 - 31.216.236.55 ie -31.216.236.56 - 31.216.236.95 gb -31.216.236.96 - 31.216.239.255 ie +31.216.232.0 - 31.216.239.255 ie 31.216.240.0 - 31.216.255.255 it 31.217.0.0 - 31.217.127.255 hr 31.217.128.0 - 31.217.159.255 gb @@ -2430,27 +4664,70 @@ 31.217.224.0 - 31.217.231.255 kw 31.217.232.0 - 31.217.239.255 fr 31.217.240.0 - 31.217.247.255 ie -31.217.248.0 - 31.217.255.255 fr 31.218.0.0 - 31.219.255.255 ae -31.220.0.0 - 31.220.127.255 de +31.220.0.0 - 31.220.0.255 nl +31.220.1.0 - 31.220.3.255 bz +31.220.4.0 - 31.220.4.255 nl +31.220.5.0 - 31.220.5.255 se +31.220.6.0 - 31.220.6.63 bs +31.220.6.64 - 31.220.6.127 vg +31.220.6.128 - 31.220.6.255 nl +31.220.7.0 - 31.220.7.255 se +31.220.8.0 - 31.220.11.255 us +31.220.12.0 - 31.220.14.255 de +31.220.15.0 - 31.220.15.255 se +31.220.16.0 - 31.220.16.255 gb +31.220.17.0 - 31.220.19.255 us +31.220.20.0 - 31.220.20.255 gb +31.220.21.0 - 31.220.23.255 us +31.220.24.0 - 31.220.27.255 nl +31.220.28.0 - 31.220.28.255 de +31.220.29.0 - 31.220.29.127 nl +31.220.29.128 - 31.220.29.159 kp +31.220.29.160 - 31.220.29.191 va +31.220.29.192 - 31.220.29.223 aq +31.220.29.224 - 31.220.29.255 it +31.220.30.0 - 31.220.30.31 nl +31.220.30.32 - 31.220.30.63 pk +31.220.30.64 - 31.220.30.95 pe +31.220.30.96 - 31.220.30.127 pk +31.220.30.128 - 31.220.30.159 fj +31.220.30.160 - 31.220.30.191 br +31.220.30.192 - 31.220.30.223 mx +31.220.30.224 - 31.220.30.255 cn +31.220.31.0 - 31.220.31.255 nl +31.220.32.0 - 31.220.39.255 us +31.220.40.0 - 31.220.41.255 de +31.220.42.0 - 31.220.45.255 nl +31.220.46.0 - 31.220.47.255 de +31.220.48.0 - 31.220.71.255 us +31.220.72.0 - 31.220.103.255 es +31.220.104.0 - 31.220.105.255 us +31.220.106.0 - 31.220.106.255 gb +31.220.107.0 - 31.220.111.255 us +31.220.112.0 - 31.220.119.255 nl +31.220.120.0 - 31.220.127.255 de 31.220.128.0 - 31.220.135.255 ro 31.220.136.0 - 31.220.143.255 de 31.220.144.0 - 31.220.151.255 pl 31.220.152.0 - 31.220.191.255 ru -31.220.192.0 - 31.221.127.255 gb +31.220.192.0 - 31.220.242.255 gb +31.220.243.0 - 31.220.243.255 nl +31.220.244.0 - 31.221.127.255 gb 31.221.128.0 - 31.221.255.255 es -31.222.0.0 - 31.222.15.255 cz +31.222.0.0 - 31.222.11.255 cz +31.222.12.0 - 31.222.13.255 pl +31.222.14.0 - 31.222.15.255 cz 31.222.16.0 - 31.222.23.255 pl 31.222.24.0 - 31.222.31.255 ch 31.222.32.0 - 31.222.39.255 ru 31.222.40.0 - 31.222.47.255 al -31.222.48.0 - 31.222.65.255 gb -31.222.66.0 - 31.222.71.255 cz -31.222.72.0 - 31.222.79.255 us +31.222.48.0 - 31.222.79.255 gb 31.222.80.0 - 31.222.127.255 es 31.222.128.0 - 31.222.191.255 gb 31.222.192.0 - 31.222.199.255 fr -31.222.200.0 - 31.222.223.255 gb +31.222.200.0 - 31.222.207.255 nl +31.222.208.0 - 31.222.223.255 gb 31.222.224.0 - 31.222.255.255 jo 31.223.0.0 - 31.223.127.255 tr 31.223.128.0 - 31.223.159.255 ba @@ -2462,152 +4739,101 @@ 31.223.232.0 - 31.223.239.255 hu 31.223.240.0 - 31.223.255.255 it 31.224.0.0 - 31.255.255.255 de -32.0.0.0 - 32.42.2.63 us -32.42.2.64 - 32.42.2.95 nl -32.42.2.96 - 32.42.4.119 us -32.42.4.120 - 32.42.4.127 ie -32.42.4.128 - 32.42.4.255 us -32.42.5.0 - 32.42.5.31 gb -32.42.5.32 - 32.42.5.39 nl -32.42.5.40 - 32.42.5.47 gb -32.42.5.48 - 32.42.5.63 nl -32.42.5.64 - 32.42.5.71 us -32.42.5.72 - 32.42.5.95 gb -32.42.5.96 - 32.42.5.127 us -32.42.5.128 - 32.42.5.255 ie -32.42.6.0 - 32.42.6.127 us -32.42.6.128 - 32.42.6.159 gb -32.42.6.160 - 32.42.6.175 us -32.42.6.176 - 32.42.6.191 nl -32.42.6.192 - 32.42.7.175 us -32.42.7.176 - 32.42.7.191 gb -32.42.7.192 - 32.42.11.255 us -32.42.12.0 - 32.42.12.47 gb -32.42.12.48 - 32.42.14.119 us -32.42.14.120 - 32.42.14.127 se -32.42.14.128 - 32.42.14.223 us -32.42.14.224 - 32.42.14.239 jp -32.42.14.240 - 32.42.14.255 an -32.42.15.0 - 32.42.15.127 us -32.42.15.128 - 32.42.15.135 jp -32.42.15.136 - 32.42.15.143 ie -32.42.15.144 - 32.42.15.159 jp -32.42.15.160 - 32.42.15.239 us -32.42.15.240 - 32.42.15.255 nl -32.42.16.0 - 32.58.34.191 us -32.58.34.192 - 32.58.34.255 be -32.58.35.0 - 32.58.45.255 us -32.58.46.0 - 32.58.46.7 de -32.58.46.8 - 32.58.52.255 us -32.58.53.0 - 32.58.53.63 fr -32.58.53.64 - 32.58.56.255 us -32.58.57.0 - 32.58.57.7 gb -32.58.57.8 - 32.58.57.255 us -32.58.58.0 - 32.58.58.15 gb -32.58.58.16 - 32.58.58.255 us -32.58.59.0 - 32.58.59.7 gb -32.58.59.8 - 32.58.59.127 us -32.58.59.128 - 32.58.59.255 ca -32.58.60.0 - 32.58.87.255 us -32.58.88.0 - 32.58.88.63 it -32.58.88.64 - 32.58.128.255 us -32.58.129.0 - 32.58.129.7 ie -32.58.129.8 - 32.58.130.255 us -32.58.131.0 - 32.58.131.63 ie -32.58.131.64 - 32.58.155.255 us -32.58.156.0 - 32.58.157.255 nl -32.58.158.0 - 32.58.255.255 us -32.59.0.0 - 32.59.0.255 bz -32.59.1.0 - 32.59.1.127 br -32.59.1.128 - 32.59.49.95 bz -32.59.49.96 - 32.59.49.127 mx -32.59.49.128 - 32.59.49.159 bz -32.59.49.160 - 32.59.49.175 mx -32.59.49.176 - 32.59.255.255 bz -32.60.0.0 - 32.60.34.15 us -32.60.34.16 - 32.60.34.23 jp -32.60.34.24 - 32.60.34.95 us -32.60.34.96 - 32.60.34.127 gb -32.60.34.128 - 32.60.34.159 us -32.60.34.160 - 32.60.34.191 de -32.60.34.192 - 32.60.34.207 jp -32.60.34.208 - 32.60.34.215 us -32.60.34.216 - 32.60.34.223 de -32.60.34.224 - 32.60.36.7 us -32.60.36.8 - 32.60.36.15 sg -32.60.36.16 - 32.60.36.31 de -32.60.36.32 - 32.60.36.215 us -32.60.36.216 - 32.60.36.223 sg -32.60.36.224 - 32.60.37.175 us -32.60.37.176 - 32.60.37.183 sg -32.60.37.184 - 32.60.37.191 us -32.60.37.192 - 32.60.37.199 sg -32.60.37.200 - 32.60.37.207 nl -32.60.37.208 - 32.60.37.223 sg -32.60.37.224 - 32.60.37.231 us -32.60.37.232 - 32.60.37.239 nl -32.60.37.240 - 32.60.38.255 us -32.60.39.0 - 32.60.39.7 sg -32.60.39.8 - 32.60.39.15 us -32.60.39.16 - 32.60.39.47 nl -32.60.39.48 - 32.60.39.63 us -32.60.39.64 - 32.60.39.127 sg -32.60.39.128 - 32.60.39.191 nl -32.60.39.192 - 32.60.39.231 us -32.60.39.232 - 32.60.39.239 de -32.60.39.240 - 32.60.39.247 sg -32.60.39.248 - 32.60.39.255 us -32.60.40.0 - 32.60.40.255 nl -32.60.41.0 - 32.60.41.71 de -32.60.41.72 - 32.60.41.103 tw -32.60.41.104 - 32.60.41.127 us -32.60.41.128 - 32.60.42.191 tw -32.60.42.192 - 32.60.42.255 us -32.60.43.0 - 32.60.43.191 tw -32.60.43.192 - 32.60.43.199 de -32.60.43.200 - 32.60.43.247 us -32.60.43.248 - 32.60.43.255 in -32.60.44.0 - 32.60.44.175 us -32.60.44.176 - 32.60.44.183 sg -32.60.44.184 - 32.60.45.127 us -32.60.45.128 - 32.60.45.143 sg -32.60.45.144 - 32.60.47.64 us -32.60.47.65 - 32.60.47.78 sg -32.60.47.79 - 32.60.63.255 us -32.60.64.0 - 32.60.79.255 ca -32.60.80.0 - 32.60.92.47 us -32.60.92.48 - 32.60.92.95 ca -32.60.92.96 - 32.60.93.255 us -32.60.94.0 - 32.60.94.127 ca -32.60.94.128 - 32.60.94.159 us -32.60.94.160 - 32.60.94.175 ca -32.60.94.176 - 32.60.94.223 us -32.60.94.224 - 32.60.94.239 ca -32.60.94.240 - 32.60.94.255 us -32.60.95.0 - 32.60.95.31 ca -32.60.95.32 - 32.60.95.79 us -32.60.95.80 - 32.60.95.95 ca -32.60.95.96 - 32.60.95.127 us -32.60.95.128 - 32.60.95.159 ca -32.60.95.160 - 32.60.95.191 us -32.60.95.192 - 32.60.95.255 ca -32.60.96.0 - 32.60.103.255 us -32.60.104.0 - 32.60.104.255 ca -32.60.105.0 - 32.60.107.47 us -32.60.107.48 - 32.60.107.63 ca -32.60.107.64 - 32.60.107.95 us -32.60.107.96 - 32.60.107.111 ca -32.60.107.112 - 32.60.107.159 us -32.60.107.160 - 32.60.108.15 ca -32.60.108.16 - 32.60.108.95 us -32.60.108.96 - 32.60.108.111 ca -32.60.108.112 - 32.60.108.127 us -32.60.108.128 - 32.60.108.175 ca -32.60.108.176 - 32.104.15.255 us +32.0.0.0 - 32.41.255.255 us +32.42.0.0 - 32.42.4.129 nl +32.42.4.130 - 32.42.4.130 eu +32.42.4.131 - 32.42.15.255 nl +32.42.16.0 - 32.42.23.143 gb +32.42.23.144 - 32.42.23.151 be +32.42.23.152 - 32.42.25.151 gb +32.42.25.152 - 32.42.25.159 de +32.42.25.160 - 32.42.29.127 gb +32.42.29.128 - 32.42.29.135 pt +32.42.29.136 - 32.42.29.143 fi +32.42.29.144 - 32.42.29.151 no +32.42.29.152 - 32.42.29.159 cz +32.42.29.160 - 32.42.29.167 dk +32.42.29.168 - 32.42.29.175 fr +32.42.29.176 - 32.42.29.183 es +32.42.29.184 - 32.42.29.191 ie +32.42.29.192 - 32.42.29.199 it +32.42.29.200 - 32.42.31.255 gb +32.42.32.0 - 32.42.47.255 nl +32.42.48.0 - 32.42.127.255 us +32.42.128.0 - 32.42.143.255 in +32.42.144.0 - 32.42.167.255 hk +32.42.168.0 - 32.42.175.255 jp +32.42.176.0 - 32.42.176.255 au +32.42.177.0 - 32.42.177.155 nz +32.42.177.156 - 32.42.177.156 au +32.42.177.157 - 32.42.177.255 nz +32.42.178.0 - 32.42.183.255 au +32.42.184.0 - 32.42.191.255 jp +32.42.192.0 - 32.58.207.255 us +32.58.208.0 - 32.58.215.255 fr +32.58.216.0 - 32.58.223.255 de +32.58.224.0 - 32.58.231.255 us +32.58.232.0 - 32.58.239.255 gb +32.58.240.0 - 32.58.255.255 nl +32.59.0.0 - 32.59.0.221 bz +32.59.0.222 - 32.59.0.222 br +32.59.0.223 - 32.59.63.255 bz +32.59.64.0 - 32.59.64.255 ar +32.59.65.0 - 32.59.181.64 bz +32.59.181.65 - 32.59.181.65 br +32.59.181.66 - 32.59.255.255 bz +32.60.0.0 - 32.60.31.255 us +32.60.32.0 - 32.60.43.4 sg +32.60.43.5 - 32.60.43.6 th +32.60.43.7 - 32.60.43.247 sg +32.60.43.248 - 32.60.43.248 in +32.60.43.249 - 32.60.43.255 sg +32.60.44.0 - 32.60.44.255 ap +32.60.45.0 - 32.60.63.255 sg +32.60.64.0 - 32.60.69.223 us +32.60.69.224 - 32.60.69.239 ca +32.60.69.240 - 32.60.87.3 us +32.60.87.4 - 32.60.87.4 ca +32.60.87.5 - 32.60.91.15 us +32.60.91.16 - 32.60.91.31 ca +32.60.91.32 - 32.104.15.255 us 32.104.16.0 - 32.104.16.255 ar -32.104.17.0 - 32.106.103.255 us -32.106.104.0 - 32.106.104.255 ch -32.106.105.0 - 35.255.255.255 us +32.104.17.0 - 32.106.14.255 us +32.106.15.0 - 32.106.15.255 nl +32.106.16.0 - 32.106.49.255 us +32.106.50.0 - 32.106.50.255 nl +32.106.51.0 - 32.106.105.255 us +32.106.106.0 - 32.106.106.255 ch +32.106.107.0 - 32.106.125.255 us +32.106.126.0 - 32.106.126.255 es +32.106.127.0 - 32.106.127.255 us +32.106.128.0 - 32.106.128.255 es +32.106.129.0 - 32.106.130.255 tr +32.106.131.0 - 32.106.147.255 us +32.106.148.0 - 32.106.148.255 fi +32.106.149.0 - 32.106.155.255 us +32.106.156.0 - 32.106.156.255 no +32.106.157.0 - 32.106.164.255 us +32.106.165.0 - 32.106.165.255 dk +32.106.166.0 - 32.106.166.255 gr +32.106.167.0 - 32.106.181.255 us +32.106.182.0 - 32.106.182.255 ie +32.106.183.0 - 32.106.185.255 us +32.106.186.0 - 32.106.186.255 cz +32.106.187.0 - 32.106.190.255 us +32.106.191.0 - 32.106.191.255 nl +32.106.192.0 - 32.106.213.255 us +32.106.214.0 - 32.106.214.255 be +32.106.215.0 - 32.106.215.255 nl +32.106.216.0 - 32.115.114.35 us +32.115.114.36 - 32.115.114.39 ca +32.115.114.40 - 32.176.140.255 us +32.176.141.0 - 32.176.141.255 pr +32.176.142.0 - 34.252.138.255 us +34.252.139.0 - 34.252.139.255 ap +34.252.140.0 - 34.253.2.255 us +34.253.3.0 - 34.253.3.255 gb +34.253.4.0 - 35.255.255.255 us 36.0.0.0 - 36.0.3.255 cn 36.0.4.0 - 36.0.7.255 np 36.0.8.0 - 36.1.255.255 cn @@ -2632,15 +4858,1612 @@ 36.248.0.0 - 36.251.255.255 cn 36.252.0.0 - 36.253.255.255 np 36.254.0.0 - 36.254.255.255 cn -38.0.0.0 - 38.99.176.63 us -38.99.176.64 - 38.99.176.127 ca -38.99.176.128 - 38.111.102.255 us +36.255.0.0 - 36.255.31.255 in +36.255.32.0 - 36.255.35.255 pk +36.255.36.0 - 36.255.39.255 sg +36.255.40.0 - 36.255.47.255 pk +36.255.48.0 - 36.255.51.255 nz +36.255.52.0 - 36.255.55.255 bd +36.255.56.0 - 36.255.59.255 hk +36.255.60.0 - 36.255.63.255 pk +36.255.64.0 - 36.255.67.255 in +36.255.68.0 - 36.255.71.255 hk +36.255.72.0 - 36.255.79.255 au +36.255.80.0 - 36.255.83.255 hk +36.255.84.0 - 36.255.91.255 in +36.255.92.0 - 36.255.95.255 au +36.255.96.0 - 36.255.103.255 pk +36.255.104.0 - 36.255.111.255 in +36.255.112.0 - 36.255.115.255 au +36.255.116.0 - 36.255.119.255 cn +36.255.120.0 - 36.255.123.255 jp +36.255.124.0 - 36.255.127.255 sg +36.255.128.0 - 36.255.131.255 cn +36.255.132.0 - 36.255.135.255 in +36.255.136.0 - 36.255.139.255 th +36.255.140.0 - 36.255.143.255 my +36.255.144.0 - 36.255.147.255 kh +36.255.148.0 - 36.255.155.255 sg +36.255.156.0 - 36.255.159.255 in +36.255.160.0 - 36.255.163.255 jp +36.255.164.0 - 36.255.167.255 cn +36.255.168.0 - 36.255.171.255 in +36.255.172.0 - 36.255.179.255 cn +36.255.180.0 - 36.255.187.255 in +36.255.188.0 - 36.255.191.255 bd +36.255.192.0 - 36.255.195.255 cn +36.255.196.0 - 36.255.203.255 in +36.255.204.0 - 36.255.207.255 hk +36.255.208.0 - 36.255.211.255 in +36.255.212.0 - 36.255.215.255 pk +36.255.216.0 - 36.255.219.255 jp +36.255.220.0 - 36.255.223.255 ph +36.255.224.0 - 36.255.235.255 in +36.255.236.0 - 36.255.239.255 jp +36.255.240.0 - 36.255.243.255 in +36.255.244.0 - 36.255.247.255 ph +36.255.248.0 - 36.255.251.255 bd +36.255.252.0 - 36.255.255.255 in +37.0.0.0 - 37.0.7.255 ie +37.0.8.0 - 37.0.23.255 nl +37.0.24.0 - 37.0.31.255 ee +37.0.32.0 - 37.0.63.255 ch +37.0.64.0 - 37.0.71.255 me +37.0.72.0 - 37.0.79.255 fr +37.0.80.0 - 37.0.95.255 nl +37.0.96.0 - 37.0.103.255 gb +37.0.104.0 - 37.0.111.255 es +37.0.112.0 - 37.0.112.255 de +37.0.113.0 - 37.0.115.255 us +37.0.116.0 - 37.0.119.255 de +37.0.120.0 - 37.0.126.255 ru +37.0.127.0 - 37.0.127.127 kz +37.0.127.128 - 37.0.127.255 ru +37.0.128.0 - 37.0.207.255 hr +37.0.208.0 - 37.0.255.255 lt +37.1.0.0 - 37.1.87.255 ru +37.1.88.0 - 37.1.88.135 gb +37.1.88.136 - 37.1.88.143 de +37.1.88.144 - 37.1.89.191 gb +37.1.89.192 - 37.1.89.255 si +37.1.90.0 - 37.1.103.255 gb +37.1.104.0 - 37.1.111.255 nl +37.1.112.0 - 37.1.127.255 de +37.1.128.0 - 37.1.143.255 ru +37.1.144.0 - 37.1.151.255 nl +37.1.152.0 - 37.1.159.255 gb +37.1.160.0 - 37.1.167.255 de +37.1.168.0 - 37.1.175.255 fr +37.1.176.0 - 37.1.183.255 es +37.1.184.0 - 37.1.191.255 fi +37.1.192.0 - 37.1.199.255 de +37.1.200.0 - 37.1.207.255 nl +37.1.208.0 - 37.1.215.255 us +37.1.216.0 - 37.1.223.255 de +37.1.224.0 - 37.1.231.255 gb +37.1.232.0 - 37.1.255.255 fr +37.2.0.0 - 37.3.255.255 se +37.4.0.0 - 37.5.255.255 de +37.6.0.0 - 37.6.255.255 gr +37.7.0.0 - 37.7.255.255 pl +37.8.0.0 - 37.8.127.255 ps +37.8.128.0 - 37.8.143.255 ba +37.8.144.0 - 37.8.159.255 ru +37.8.160.0 - 37.8.191.255 fr +37.8.192.0 - 37.8.255.255 pl +37.9.0.0 - 37.9.31.255 ru +37.9.32.0 - 37.9.39.255 ua +37.9.40.0 - 37.9.43.255 ru +37.9.44.0 - 37.9.45.255 us +37.9.46.0 - 37.9.55.255 ru +37.9.56.0 - 37.9.63.255 gb +37.9.64.0 - 37.9.135.255 ru +37.9.136.0 - 37.9.143.255 fr +37.9.144.0 - 37.9.159.255 ru +37.9.160.0 - 37.9.167.255 nl +37.9.168.0 - 37.9.175.255 sk +37.9.176.0 - 37.9.176.255 it +37.9.177.0 - 37.9.177.255 cy +37.9.178.0 - 37.9.178.255 ge +37.9.179.0 - 37.9.179.255 cy +37.9.180.0 - 37.9.180.255 it +37.9.181.0 - 37.9.183.255 cy +37.9.184.0 - 37.9.191.255 de +37.9.192.0 - 37.9.199.255 cz +37.9.200.0 - 37.9.207.255 tr +37.9.208.0 - 37.9.215.255 hu +37.9.216.0 - 37.9.223.255 nl +37.9.224.0 - 37.9.239.255 it +37.9.240.0 - 37.9.247.255 ru +37.9.248.0 - 37.9.255.255 ir +37.10.0.0 - 37.10.63.255 nl +37.10.64.0 - 37.10.67.255 ir +37.10.68.0 - 37.10.70.255 de +37.10.71.0 - 37.10.71.255 gb +37.10.72.0 - 37.10.79.255 es +37.10.80.0 - 37.10.95.255 it +37.10.96.0 - 37.10.127.255 de +37.10.128.0 - 37.15.255.255 es +37.16.0.0 - 37.16.31.255 nl +37.16.32.0 - 37.16.63.255 sa +37.16.64.0 - 37.16.70.79 de +37.16.70.80 - 37.16.70.95 us +37.16.70.96 - 37.16.71.255 de +37.16.72.0 - 37.16.79.255 fr +37.16.80.0 - 37.16.87.255 ru +37.16.96.0 - 37.16.127.255 fi +37.16.128.0 - 37.16.255.255 sa +37.17.0.0 - 37.17.127.255 by +37.17.128.0 - 37.17.159.255 iq +37.17.160.0 - 37.17.175.255 hu +37.17.176.0 - 37.17.183.255 kz +37.17.184.0 - 37.17.191.255 gb +37.17.192.0 - 37.17.207.255 jo +37.17.208.0 - 37.17.223.255 nl +37.17.224.0 - 37.17.239.255 de +37.17.240.0 - 37.17.247.255 ua +37.17.248.0 - 37.17.255.255 se +37.18.0.0 - 37.18.7.255 ru +37.18.8.0 - 37.18.11.2 ge +37.18.11.3 - 37.18.11.3 ru +37.18.11.4 - 37.18.11.255 ge +37.18.12.0 - 37.18.14.255 ru +37.18.15.0 - 37.18.22.255 gb +37.18.23.0 - 37.18.127.255 ru +37.18.136.0 - 37.18.143.255 im +37.18.144.0 - 37.18.151.255 ie +37.18.152.0 - 37.18.159.255 ru +37.18.160.0 - 37.18.175.255 fr +37.18.176.0 - 37.18.183.255 us +37.18.184.0 - 37.18.191.255 gb +37.18.192.0 - 37.18.199.255 us +37.18.200.0 - 37.18.207.255 dk +37.18.208.0 - 37.18.219.255 se +37.18.220.0 - 37.18.223.255 dk +37.18.224.0 - 37.18.239.255 si +37.18.240.0 - 37.18.247.255 es +37.18.248.0 - 37.19.7.255 ru +37.19.8.0 - 37.19.15.255 be +37.19.16.0 - 37.19.23.255 fi +37.19.24.0 - 37.19.31.255 gb +37.19.32.0 - 37.19.63.255 ru +37.19.64.0 - 37.19.71.255 si +37.19.72.0 - 37.19.79.255 ru +37.19.80.0 - 37.19.95.255 ir +37.19.96.0 - 37.19.103.255 ie +37.19.104.0 - 37.19.111.255 rs +37.19.112.0 - 37.19.127.255 il +37.19.128.0 - 37.19.255.255 ua +37.20.0.0 - 37.23.255.255 ru +37.24.0.0 - 37.24.255.255 de +37.25.0.0 - 37.25.39.255 ua +37.25.40.0 - 37.25.43.255 es +37.25.44.0 - 37.25.47.255 gb +37.25.48.0 - 37.25.55.255 de +37.25.56.0 - 37.25.63.255 fr +37.25.64.0 - 37.25.71.255 de +37.25.72.0 - 37.25.79.255 fr +37.25.80.0 - 37.25.87.255 mk +37.25.88.0 - 37.25.95.255 im +37.25.96.0 - 37.25.127.255 ua +37.25.128.0 - 37.25.255.255 gb +37.26.0.0 - 37.26.63.255 az +37.26.64.0 - 37.26.71.255 al +37.26.72.0 - 37.26.79.255 gb +37.26.80.0 - 37.26.87.255 al +37.26.88.0 - 37.26.95.255 gb +37.26.96.0 - 37.26.103.255 mk +37.26.104.0 - 37.26.111.255 gb +37.26.112.0 - 37.26.127.255 il +37.26.128.0 - 37.26.143.255 md +37.26.144.0 - 37.26.151.255 il +37.26.152.0 - 37.26.159.255 se +37.26.160.0 - 37.26.167.255 pl +37.26.168.0 - 37.26.175.255 am +37.26.176.0 - 37.26.191.255 fr +37.26.192.0 - 37.26.199.255 pl +37.26.200.0 - 37.26.207.255 de +37.26.208.0 - 37.26.223.255 no +37.26.224.0 - 37.26.224.255 gb +37.26.225.0 - 37.26.227.241 nl +37.26.227.242 - 37.26.227.242 gb +37.26.227.243 - 37.26.228.55 nl +37.26.228.56 - 37.26.228.63 fr +37.26.228.64 - 37.26.231.255 nl +37.26.232.0 - 37.26.239.255 ru +37.26.240.0 - 37.26.247.255 fr +37.26.248.0 - 37.26.255.255 es +37.27.0.0 - 37.27.255.255 ir +37.28.0.0 - 37.28.127.255 om +37.28.128.0 - 37.28.135.255 no +37.28.136.0 - 37.28.151.255 dk +37.28.152.0 - 37.28.159.255 pl +37.28.160.0 - 37.28.191.255 ru +37.28.192.0 - 37.28.255.255 pt +37.29.0.0 - 37.29.127.255 ru +37.29.128.0 - 37.29.255.255 es +37.30.0.0 - 37.31.255.255 pl +37.32.0.0 - 37.32.47.255 ir +37.32.48.0 - 37.32.55.255 no +37.32.56.0 - 37.32.63.255 fr +37.32.64.0 - 37.32.79.255 az +37.32.80.0 - 37.32.95.255 it +37.32.104.0 - 37.32.111.255 it +37.32.112.0 - 37.32.127.255 ir +37.32.128.0 - 37.32.255.255 gr +37.33.0.0 - 37.33.255.255 fi +37.34.0.0 - 37.34.31.255 tr +37.34.32.0 - 37.34.47.255 it +37.34.48.0 - 37.34.63.255 nl +37.34.64.0 - 37.34.71.255 es +37.34.72.0 - 37.34.79.255 it +37.34.80.0 - 37.34.95.255 ps +37.34.96.0 - 37.34.127.255 md +37.34.128.0 - 37.34.255.255 kw +37.35.0.0 - 37.35.7.255 fr +37.35.8.0 - 37.35.15.255 rs +37.35.16.0 - 37.35.31.255 fi +37.35.32.0 - 37.35.63.255 ro +37.35.64.0 - 37.35.71.255 al +37.35.72.0 - 37.35.79.255 gb +37.35.80.0 - 37.35.87.255 fi +37.35.88.0 - 37.35.95.255 gb +37.35.96.0 - 37.35.103.255 dk +37.35.104.0 - 37.35.105.151 ch +37.35.105.152 - 37.35.105.159 nl +37.35.105.160 - 37.35.105.175 ch +37.35.105.176 - 37.35.105.183 be +37.35.105.184 - 37.35.105.187 se +37.35.105.188 - 37.35.105.195 ch +37.35.105.196 - 37.35.105.199 us +37.35.105.200 - 37.35.105.201 pt +37.35.105.202 - 37.35.105.203 es +37.35.105.204 - 37.35.105.205 cr +37.35.105.206 - 37.35.105.207 kn +37.35.105.208 - 37.35.105.211 br +37.35.105.212 - 37.35.105.217 hk +37.35.105.218 - 37.35.105.219 za +37.35.105.220 - 37.35.105.223 sg +37.35.105.224 - 37.35.105.225 ws +37.35.105.226 - 37.35.105.229 nz +37.35.105.230 - 37.35.127.255 ch +37.35.128.0 - 37.35.255.255 es +37.36.0.0 - 37.39.43.255 kw +37.39.44.0 - 37.39.44.255 us +37.39.45.0 - 37.39.255.255 kw +37.40.0.0 - 37.41.255.255 om +37.42.0.0 - 37.43.2.255 sa +37.43.3.0 - 37.43.3.255 ro +37.43.4.0 - 37.43.255.255 sa +37.44.0.0 - 37.44.7.255 de +37.44.8.0 - 37.44.15.255 nl +37.44.16.0 - 37.44.31.255 cz +37.44.32.0 - 37.44.39.255 jo +37.44.40.0 - 37.44.47.255 ru +37.44.48.0 - 37.44.55.255 fi +37.44.56.0 - 37.44.63.255 ir +37.44.64.0 - 37.44.127.255 by +37.44.128.0 - 37.44.191.255 no +37.44.192.0 - 37.44.255.255 ru +37.45.0.0 - 37.45.255.255 by +37.46.0.0 - 37.46.15.255 gb +37.46.16.0 - 37.46.23.255 ie +37.46.24.0 - 37.46.31.255 gb +37.46.32.0 - 37.46.47.255 il +37.46.48.0 - 37.46.63.255 ru +37.46.64.0 - 37.46.71.255 hu +37.46.72.0 - 37.46.79.255 es +37.46.80.0 - 37.46.87.255 cz +37.46.88.0 - 37.46.95.255 es +37.46.96.0 - 37.46.103.255 gb +37.46.104.0 - 37.46.111.255 ge +37.46.112.0 - 37.46.113.255 se +37.46.114.0 - 37.46.114.255 nl +37.46.115.0 - 37.46.117.255 us +37.46.118.0 - 37.46.119.255 nl +37.46.120.0 - 37.46.121.255 se +37.46.122.0 - 37.46.127.255 nl +37.46.128.0 - 37.46.135.255 ru +37.46.136.0 - 37.46.143.255 nl +37.46.152.0 - 37.46.159.255 es +37.46.160.0 - 37.46.191.255 se +37.46.192.0 - 37.46.195.255 nl +37.46.196.0 - 37.46.197.255 us +37.46.198.0 - 37.46.199.255 nl +37.46.200.0 - 37.46.207.255 gb +37.46.208.0 - 37.46.215.255 cz +37.46.216.0 - 37.46.219.255 ua +37.46.220.0 - 37.46.223.255 bg +37.46.224.0 - 37.46.255.255 ua +37.47.0.0 - 37.47.255.255 pl +37.48.0.0 - 37.48.63.255 cz +37.48.64.0 - 37.48.127.255 nl +37.48.128.0 - 37.48.223.255 sy +37.48.224.0 - 37.48.231.255 gb +37.48.232.0 - 37.48.239.255 hr +37.48.240.0 - 37.48.247.255 gb +37.48.248.0 - 37.48.255.255 ru +37.49.0.0 - 37.49.127.255 de +37.49.128.0 - 37.49.143.255 dk +37.49.144.0 - 37.49.151.255 ir +37.49.152.0 - 37.49.159.255 de +37.49.160.0 - 37.49.223.255 ru +37.49.224.0 - 37.49.231.255 nl +37.49.232.0 - 37.49.239.255 fr +37.49.240.0 - 37.49.255.255 se +37.50.0.0 - 37.51.255.255 de +37.52.0.0 - 37.55.255.255 ua +37.56.0.0 - 37.56.255.255 sa +37.57.0.0 - 37.57.255.255 ua +37.58.0.0 - 37.58.15.255 sk +37.58.16.0 - 37.58.23.255 tr +37.58.24.0 - 37.58.31.255 gb +37.58.32.0 - 37.58.39.255 ru +37.58.40.0 - 37.58.47.255 be +37.58.48.0 - 37.58.63.255 de +37.58.64.0 - 37.58.127.255 nl +37.58.128.0 - 37.59.8.184 fr +37.59.8.185 - 37.59.8.185 ca +37.59.8.186 - 37.59.64.255 fr +37.59.65.0 - 37.59.65.3 gb +37.59.65.4 - 37.59.66.15 fr +37.59.66.16 - 37.59.66.31 gb +37.59.66.32 - 37.59.66.247 fr +37.59.66.248 - 37.59.66.255 nl +37.59.67.0 - 37.59.67.183 fr +37.59.67.184 - 37.59.67.191 pt +37.59.67.192 - 37.59.70.207 fr +37.59.70.208 - 37.59.70.223 nl +37.59.70.224 - 37.59.70.255 it +37.59.71.0 - 37.59.75.203 fr +37.59.75.204 - 37.59.75.207 it +37.59.75.208 - 37.59.76.159 fr +37.59.76.160 - 37.59.76.163 de +37.59.76.164 - 37.59.76.239 fr +37.59.76.240 - 37.59.76.243 it +37.59.76.244 - 37.59.82.59 fr +37.59.82.60 - 37.59.82.63 dk +37.59.82.64 - 37.59.84.27 fr +37.59.84.28 - 37.59.84.31 it +37.59.84.32 - 37.59.85.103 fr +37.59.85.104 - 37.59.85.111 cz +37.59.85.112 - 37.59.88.91 fr +37.59.88.92 - 37.59.88.95 it +37.59.88.96 - 37.59.88.111 de +37.59.88.112 - 37.59.88.199 fr +37.59.88.200 - 37.59.88.203 nl +37.59.88.204 - 37.59.88.255 fr +37.59.89.0 - 37.59.89.31 be +37.59.89.32 - 37.59.89.183 fr +37.59.89.184 - 37.59.89.191 nl +37.59.89.192 - 37.59.89.251 fr +37.59.89.252 - 37.59.89.255 pt +37.59.90.0 - 37.59.92.3 fr +37.59.92.4 - 37.59.92.15 es +37.59.92.16 - 37.59.93.35 fr +37.59.93.36 - 37.59.93.39 gb +37.59.93.40 - 37.59.95.203 fr +37.59.95.204 - 37.59.95.207 es +37.59.95.208 - 37.59.115.255 fr +37.59.116.0 - 37.59.117.255 gb +37.59.118.0 - 37.59.130.79 fr +37.59.130.80 - 37.59.130.83 pt +37.59.130.84 - 37.59.132.135 fr +37.59.132.136 - 37.59.132.139 es +37.59.132.140 - 37.59.132.199 fr +37.59.132.200 - 37.59.132.207 be +37.59.132.208 - 37.59.133.47 fr +37.59.133.48 - 37.59.133.51 es +37.59.133.52 - 37.59.133.219 fr +37.59.133.220 - 37.59.133.223 es +37.59.133.224 - 37.59.134.3 fr +37.59.134.4 - 37.59.134.7 de +37.59.134.8 - 37.59.135.147 fr +37.59.135.148 - 37.59.135.151 ie +37.59.135.152 - 37.59.136.47 fr +37.59.136.48 - 37.59.136.51 de +37.59.136.52 - 37.59.136.63 fr +37.59.136.64 - 37.59.136.95 it +37.59.136.96 - 37.59.138.87 fr +37.59.138.88 - 37.59.138.95 it +37.59.138.96 - 37.59.138.127 fr +37.59.138.128 - 37.59.138.191 es +37.59.138.192 - 37.59.142.135 fr +37.59.142.136 - 37.59.142.139 pt +37.59.142.140 - 37.59.145.91 fr +37.59.145.92 - 37.59.145.95 es +37.59.145.96 - 37.59.146.255 fr +37.59.147.0 - 37.59.147.3 es +37.59.147.4 - 37.59.149.27 fr +37.59.149.28 - 37.59.149.28 ro +37.59.149.29 - 37.59.149.195 fr +37.59.149.196 - 37.59.149.199 pl +37.59.149.200 - 37.59.157.55 fr +37.59.157.56 - 37.59.157.59 de +37.59.157.60 - 37.59.157.143 fr +37.59.157.144 - 37.59.157.147 es +37.59.157.148 - 37.59.159.207 fr +37.59.159.208 - 37.59.159.211 es +37.59.159.212 - 37.59.160.39 fr +37.59.160.40 - 37.59.160.43 it +37.59.160.44 - 37.59.160.100 fr +37.59.160.101 - 37.59.160.101 ie +37.59.160.102 - 37.59.163.243 fr +37.59.163.244 - 37.59.163.247 de +37.59.163.248 - 37.59.164.203 fr +37.59.164.204 - 37.59.164.207 nl +37.59.164.208 - 37.59.165.95 fr +37.59.165.96 - 37.59.165.99 nl +37.59.165.100 - 37.59.166.55 fr +37.59.166.56 - 37.59.166.56 gb +37.59.166.57 - 37.59.166.60 fr +37.59.166.61 - 37.59.166.61 gb +37.59.166.62 - 37.59.166.107 fr +37.59.166.108 - 37.59.166.111 de +37.59.166.112 - 37.59.168.71 fr +37.59.168.72 - 37.59.168.79 de +37.59.168.80 - 37.59.171.79 fr +37.59.171.80 - 37.59.171.83 it +37.59.171.84 - 37.59.171.207 fr +37.59.171.208 - 37.59.171.211 it +37.59.171.212 - 37.59.173.159 fr +37.59.173.160 - 37.59.173.175 be +37.59.173.176 - 37.59.175.223 fr +37.59.175.224 - 37.59.175.227 nl +37.59.175.228 - 37.59.177.83 fr +37.59.177.84 - 37.59.177.87 de +37.59.177.88 - 37.59.180.99 fr +37.59.180.100 - 37.59.180.103 es +37.59.180.104 - 37.59.184.195 fr +37.59.184.196 - 37.59.184.199 es +37.59.184.200 - 37.59.186.223 fr +37.59.186.224 - 37.59.186.239 es +37.59.186.240 - 37.59.188.111 fr +37.59.188.112 - 37.59.188.127 de +37.59.188.128 - 37.59.191.35 fr +37.59.191.36 - 37.59.191.39 es +37.59.191.40 - 37.59.191.47 fr +37.59.191.48 - 37.59.191.51 it +37.59.191.52 - 37.59.194.7 fr +37.59.194.8 - 37.59.194.15 de +37.59.194.16 - 37.59.194.171 fr +37.59.194.172 - 37.59.194.175 es +37.59.194.176 - 37.59.194.255 fr +37.59.195.0 - 37.59.195.255 es +37.59.196.0 - 37.59.196.11 fr +37.59.196.12 - 37.59.196.15 nl +37.59.196.16 - 37.59.196.111 fr +37.59.196.112 - 37.59.196.127 es +37.59.196.128 - 37.59.203.107 fr +37.59.203.108 - 37.59.203.111 es +37.59.203.112 - 37.59.203.191 fr +37.59.203.192 - 37.59.203.195 es +37.59.203.196 - 37.59.204.163 fr +37.59.204.164 - 37.59.204.167 de +37.59.204.168 - 37.59.204.247 fr +37.59.204.248 - 37.59.204.251 de +37.59.204.252 - 37.59.207.107 fr +37.59.207.108 - 37.59.207.111 es +37.59.207.112 - 37.59.210.87 fr +37.59.210.88 - 37.59.210.91 es +37.59.210.92 - 37.59.211.51 fr +37.59.211.52 - 37.59.211.55 nl +37.59.211.56 - 37.59.211.135 fr +37.59.211.136 - 37.59.211.143 nl +37.59.211.144 - 37.59.213.247 fr +37.59.213.248 - 37.59.213.255 nl +37.59.214.0 - 37.59.214.87 fr +37.59.214.88 - 37.59.214.95 nl +37.59.214.96 - 37.59.217.7 fr +37.59.217.8 - 37.59.217.15 nl +37.59.217.16 - 37.59.217.31 fr +37.59.217.32 - 37.59.217.35 es +37.59.217.36 - 37.59.218.255 fr +37.59.219.0 - 37.59.219.7 nl +37.59.219.8 - 37.59.219.163 fr +37.59.219.164 - 37.59.219.167 es +37.59.219.168 - 37.59.223.135 fr +37.59.223.136 - 37.59.223.143 nl +37.59.223.144 - 37.59.223.227 fr +37.59.223.228 - 37.59.223.231 nl +37.59.223.232 - 37.59.225.135 fr +37.59.225.136 - 37.59.225.143 nl +37.59.225.144 - 37.59.227.79 fr +37.59.227.80 - 37.59.227.95 be +37.59.227.96 - 37.59.229.255 fr +37.59.230.0 - 37.59.230.31 es +37.59.230.32 - 37.59.233.31 fr +37.59.233.32 - 37.59.233.47 de +37.59.233.48 - 37.59.234.255 fr +37.59.235.0 - 37.59.235.3 de +37.59.235.4 - 37.59.235.7 fr +37.59.235.8 - 37.59.235.11 de +37.59.235.12 - 37.59.235.199 fr +37.59.235.200 - 37.59.235.207 gb +37.59.235.208 - 37.59.236.11 fr +37.59.236.12 - 37.59.236.15 pt +37.59.236.16 - 37.59.236.151 fr +37.59.236.152 - 37.59.236.159 it +37.59.236.160 - 37.59.236.167 fr +37.59.236.168 - 37.59.236.171 it +37.59.236.172 - 37.59.236.175 fr +37.59.236.176 - 37.59.236.179 es +37.59.236.180 - 37.59.238.255 fr +37.59.239.0 - 37.59.239.3 de +37.59.239.4 - 37.59.241.223 fr +37.59.241.224 - 37.59.241.227 pt +37.59.241.228 - 37.59.242.143 fr +37.59.242.144 - 37.59.242.147 es +37.59.242.148 - 37.59.242.231 fr +37.59.242.232 - 37.59.242.235 es +37.59.242.236 - 37.59.243.95 fr +37.59.243.96 - 37.59.243.99 es +37.59.243.100 - 37.59.243.119 fr +37.59.243.120 - 37.59.243.123 it +37.59.243.124 - 37.59.246.35 fr +37.59.246.36 - 37.59.246.39 es +37.59.246.40 - 37.59.246.75 fr +37.59.246.76 - 37.59.246.79 es +37.59.246.80 - 37.59.246.119 fr +37.59.246.120 - 37.59.246.123 es +37.59.246.124 - 37.59.246.191 fr +37.59.246.192 - 37.59.246.223 es +37.59.246.224 - 37.59.248.239 fr +37.59.248.240 - 37.59.248.242 cz +37.59.248.243 - 37.59.248.243 es +37.59.248.244 - 37.59.250.211 fr +37.59.250.212 - 37.59.250.215 es +37.59.250.216 - 37.59.251.135 fr +37.59.251.136 - 37.59.251.143 es +37.59.251.144 - 37.59.252.179 fr +37.59.252.180 - 37.59.252.183 es +37.59.252.184 - 37.59.253.103 fr +37.59.253.104 - 37.59.253.107 es +37.59.253.108 - 37.59.253.255 fr +37.59.254.0 - 37.59.254.3 es +37.59.254.4 - 37.59.254.51 fr +37.59.254.52 - 37.59.254.55 es +37.59.254.56 - 37.59.254.139 fr +37.59.254.140 - 37.59.254.143 es +37.59.254.144 - 37.59.254.151 fr +37.59.254.152 - 37.59.254.155 es +37.59.254.156 - 37.59.254.191 fr +37.59.254.192 - 37.59.254.195 es +37.59.254.196 - 37.59.255.180 fr +37.59.255.181 - 37.59.255.182 be +37.59.255.183 - 37.59.255.255 fr +37.60.0.0 - 37.60.7.255 de +37.60.8.0 - 37.60.15.255 fr +37.60.16.0 - 37.60.23.255 ru +37.60.24.0 - 37.60.31.255 pl +37.60.32.0 - 37.60.39.255 it +37.60.40.0 - 37.60.47.255 il +37.60.48.0 - 37.60.63.255 fr +37.60.64.0 - 37.60.127.255 gb +37.60.128.0 - 37.60.135.255 hr +37.60.136.0 - 37.60.143.255 bg +37.60.144.0 - 37.60.151.255 ps +37.60.152.0 - 37.60.159.255 fr +37.60.160.0 - 37.60.167.255 a2 +37.60.168.0 - 37.60.175.255 de +37.60.176.0 - 37.60.183.255 ru +37.60.184.0 - 37.60.191.255 fr +37.60.192.0 - 37.60.199.255 nl +37.60.200.0 - 37.60.207.255 de +37.60.208.0 - 37.60.223.255 ru +37.60.224.0 - 37.60.230.150 us +37.60.230.151 - 37.60.230.151 nl +37.60.230.152 - 37.60.238.156 us +37.60.238.157 - 37.60.238.157 nl +37.60.238.158 - 37.60.238.161 us +37.60.238.162 - 37.60.238.162 nl +37.60.238.163 - 37.60.255.255 us +37.61.0.0 - 37.61.127.255 az +37.61.128.0 - 37.61.143.255 de +37.61.144.0 - 37.61.159.255 es +37.61.160.0 - 37.61.175.255 sk +37.61.176.0 - 37.61.183.255 ru +37.61.184.0 - 37.61.191.255 at +37.61.192.0 - 37.61.223.255 de +37.61.224.0 - 37.61.227.255 us +37.61.228.0 - 37.61.231.255 il +37.61.232.0 - 37.61.239.255 gb +37.61.240.0 - 37.61.247.255 fr +37.61.248.0 - 37.61.255.255 es +37.62.0.0 - 37.62.255.255 be +37.63.0.0 - 37.63.127.255 bg +37.63.128.0 - 37.63.255.255 ir +37.64.0.0 - 37.71.255.255 fr +37.72.0.0 - 37.72.31.255 es +37.72.32.0 - 37.72.39.255 it +37.72.40.0 - 37.72.47.255 ua +37.72.48.0 - 37.72.63.255 tr +37.72.64.0 - 37.72.95.255 ru +37.72.96.0 - 37.72.111.255 nl +37.72.112.0 - 37.72.119.255 gb +37.72.120.0 - 37.72.127.255 pl +37.72.128.0 - 37.72.143.255 az +37.72.144.0 - 37.72.151.255 de +37.72.152.0 - 37.72.152.255 gg +37.72.153.0 - 37.72.154.255 gb +37.72.155.0 - 37.72.156.255 gg +37.72.157.0 - 37.72.157.255 gb +37.72.158.0 - 37.72.158.255 gg +37.72.159.0 - 37.72.159.255 gb +37.72.160.0 - 37.72.167.255 be +37.72.168.0 - 37.72.168.255 nl +37.72.169.0 - 37.72.169.255 us +37.72.170.0 - 37.72.175.255 nl +37.72.176.0 - 37.72.183.255 ru +37.72.184.0 - 37.72.188.255 se +37.72.189.0 - 37.72.190.255 us +37.72.191.0 - 37.72.191.255 se +37.72.192.0 - 37.72.255.255 fr +37.73.0.0 - 37.73.255.255 ua +37.74.0.0 - 37.74.255.255 nl +37.75.0.0 - 37.75.7.255 ru +37.75.8.0 - 37.75.15.255 tr +37.75.16.0 - 37.75.31.255 md +37.75.32.0 - 37.75.63.255 mt +37.75.64.0 - 37.75.127.255 md +37.75.128.0 - 37.75.135.255 ge +37.75.136.0 - 37.75.143.255 at +37.75.144.0 - 37.75.151.255 jo +37.75.152.0 - 37.75.159.255 nl +37.75.160.0 - 37.75.191.255 dk +37.75.192.0 - 37.75.207.255 ru +37.75.208.0 - 37.75.215.255 ps +37.75.216.0 - 37.75.223.255 ua +37.75.224.0 - 37.75.231.255 nl +37.75.232.0 - 37.75.239.255 gb +37.75.240.0 - 37.75.247.255 ir +37.75.248.0 - 37.75.255.255 ru +37.76.0.0 - 37.76.127.255 hu +37.76.128.0 - 37.76.191.255 ru +37.76.192.0 - 37.76.223.255 ps +37.76.224.0 - 37.76.255.255 sa +37.77.0.0 - 37.77.31.255 tr +37.77.32.0 - 37.77.47.255 fr +37.77.48.0 - 37.77.55.255 iq +37.77.56.0 - 37.77.57.55 nl +37.77.57.56 - 37.77.57.59 gb +37.77.57.60 - 37.77.63.255 nl +37.77.64.0 - 37.77.79.255 iq +37.77.80.0 - 37.77.95.255 nl +37.77.96.0 - 37.77.103.255 it +37.77.104.0 - 37.77.111.255 ru +37.77.112.0 - 37.77.127.255 it +37.77.128.0 - 37.77.135.255 ru +37.77.136.0 - 37.77.143.255 it +37.77.144.0 - 37.77.151.255 gb +37.77.152.0 - 37.77.159.255 pl +37.77.160.0 - 37.77.167.255 it +37.77.168.0 - 37.77.175.255 rs +37.77.176.0 - 37.77.199.255 gb +37.77.200.0 - 37.77.207.255 de +37.77.208.0 - 37.77.223.255 it +37.77.224.0 - 37.77.255.255 cz +37.78.0.0 - 37.79.255.255 ru +37.80.0.0 - 37.95.255.255 de +37.96.0.0 - 37.97.63.255 dk +37.97.64.0 - 37.97.111.255 fr +37.97.112.0 - 37.97.123.255 ro +37.97.124.0 - 37.97.127.255 es +37.97.128.0 - 37.97.255.255 nl +37.98.0.0 - 37.98.127.255 ir +37.98.128.0 - 37.98.143.255 fi +37.98.144.0 - 37.98.151.255 gb +37.98.152.0 - 37.98.159.255 tj +37.98.160.0 - 37.98.191.255 ru +37.98.192.0 - 37.98.199.255 gr +37.98.200.0 - 37.98.207.255 ir +37.98.208.0 - 37.98.223.255 pl +37.98.224.0 - 37.98.231.255 iq +37.98.232.0 - 37.98.239.99 eu +37.98.239.100 - 37.98.239.100 us +37.98.239.101 - 37.98.239.255 eu +37.98.240.0 - 37.98.255.255 ru +37.99.0.0 - 37.99.127.255 kz +37.99.128.0 - 37.99.191.255 sa +37.99.192.0 - 37.99.199.255 gr +37.99.200.0 - 37.99.207.255 de +37.99.208.0 - 37.99.215.255 it +37.99.216.0 - 37.99.223.255 ru +37.99.224.0 - 37.103.255.255 it +37.104.0.0 - 37.107.255.255 sa +37.108.0.0 - 37.109.255.255 pl +37.110.0.0 - 37.110.159.255 ru +37.110.160.0 - 37.110.191.255 ge +37.110.192.0 - 37.110.199.255 fr +37.110.200.0 - 37.110.207.255 ch +37.110.208.0 - 37.110.215.255 uz +37.110.216.0 - 37.110.223.255 gb +37.110.224.0 - 37.110.247.255 ru +37.110.248.0 - 37.110.255.255 gb +37.111.0.0 - 37.111.255.255 hu +37.112.0.0 - 37.114.7.255 ru +37.114.8.0 - 37.114.15.255 it +37.114.16.0 - 37.114.31.255 ru +37.114.32.0 - 37.114.63.255 de +37.114.64.0 - 37.114.71.255 fr +37.114.72.0 - 37.114.79.255 mt +37.114.80.0 - 37.114.87.255 fi +37.114.88.0 - 37.114.95.255 nl +37.114.96.0 - 37.114.127.255 de +37.114.128.0 - 37.114.191.255 az +37.114.192.0 - 37.114.255.255 ir +37.115.0.0 - 37.115.255.255 ua +37.116.0.0 - 37.119.255.255 it +37.120.0.0 - 37.120.127.255 de +37.120.128.0 - 37.120.159.255 ro +37.120.160.0 - 37.120.191.255 de +37.120.192.0 - 37.120.255.255 ro +37.121.0.0 - 37.121.255.255 sa +37.122.0.0 - 37.122.127.255 ru +37.122.128.0 - 37.122.135.255 ch +37.122.136.0 - 37.122.143.255 tr +37.122.144.0 - 37.122.151.255 se +37.122.152.0 - 37.122.159.255 il +37.122.160.0 - 37.122.191.255 me +37.122.192.0 - 37.122.199.255 gb +37.122.200.0 - 37.122.207.255 fr +37.122.208.0 - 37.122.215.255 gb +37.122.224.0 - 37.122.239.255 tr +37.122.240.0 - 37.122.247.255 dk +37.122.248.0 - 37.122.255.255 gb +37.123.0.0 - 37.123.63.255 tr +37.123.64.0 - 37.123.95.255 jo +37.123.96.0 - 37.123.103.255 tr +37.123.104.0 - 37.123.112.255 de +37.123.113.0 - 37.123.114.255 gb +37.123.115.0 - 37.123.115.255 fr +37.123.116.0 - 37.123.119.255 gb +37.123.120.0 - 37.123.127.255 de +37.123.128.0 - 37.123.130.255 se +37.123.131.0 - 37.123.131.255 no +37.123.132.0 - 37.123.133.255 se +37.123.134.0 - 37.123.135.243 no +37.123.135.244 - 37.123.135.247 se +37.123.135.248 - 37.123.135.255 no +37.123.136.0 - 37.123.191.255 se +37.123.192.0 - 37.123.199.255 ir +37.123.200.0 - 37.123.207.255 pl +37.123.208.0 - 37.123.215.255 us +37.123.216.0 - 37.123.223.255 ru +37.123.224.0 - 37.123.231.255 se +37.123.232.0 - 37.123.239.255 be +37.123.240.0 - 37.123.247.255 it +37.123.248.0 - 37.123.255.255 gb +37.124.0.0 - 37.127.255.255 sa +37.128.0.0 - 37.128.127.255 pl +37.128.128.0 - 37.128.135.255 gb +37.128.136.0 - 37.128.143.255 it +37.128.144.0 - 37.128.151.255 nl +37.128.152.0 - 37.128.167.255 pl +37.128.168.0 - 37.128.175.255 es +37.128.176.0 - 37.128.183.255 ch +37.128.184.0 - 37.128.191.255 gb +37.128.192.0 - 37.128.199.255 ie +37.128.200.0 - 37.128.207.255 az +37.128.208.0 - 37.128.223.255 dk +37.128.224.0 - 37.128.239.255 ro +37.128.240.0 - 37.129.255.255 ir +37.130.0.0 - 37.130.63.255 pl +37.130.64.0 - 37.130.127.255 tr +37.130.128.0 - 37.130.143.255 de +37.130.144.0 - 37.130.151.255 es +37.130.152.0 - 37.130.159.255 it +37.130.160.0 - 37.130.191.255 fi +37.130.192.0 - 37.130.199.255 ru +37.130.200.0 - 37.130.207.255 ir +37.130.208.0 - 37.130.215.255 es +37.130.216.0 - 37.130.223.255 it +37.130.224.0 - 37.130.224.255 nl +37.130.225.0 - 37.130.239.255 gb +37.130.240.0 - 37.130.247.255 bg +37.130.248.0 - 37.130.255.255 gb +37.131.0.0 - 37.131.127.255 bh +37.131.128.0 - 37.131.175.255 pl +37.131.176.0 - 37.131.183.255 de +37.131.184.0 - 37.131.191.255 ch +37.131.192.0 - 37.131.223.255 ru +37.131.224.0 - 37.131.231.255 ge +37.131.232.0 - 37.131.247.255 de +37.131.248.0 - 37.131.255.255 tr +37.132.0.0 - 37.135.255.255 es +37.136.0.0 - 37.136.255.255 fi +37.137.0.0 - 37.137.255.255 ir +37.138.0.0 - 37.138.255.255 de +37.139.0.0 - 37.139.31.255 nl +37.139.32.0 - 37.139.51.255 ru +37.139.52.0 - 37.139.52.255 de +37.139.53.0 - 37.139.63.255 ru +37.139.64.0 - 37.139.64.255 gb +37.139.65.0 - 37.139.65.255 au +37.139.66.0 - 37.139.67.255 eu +37.139.68.0 - 37.139.68.255 au +37.139.69.0 - 37.139.69.255 eu +37.139.70.0 - 37.139.70.255 cl +37.139.71.0 - 37.139.71.255 au +37.139.72.0 - 37.139.79.255 pl +37.139.80.0 - 37.139.87.255 ru +37.139.88.0 - 37.139.95.255 it +37.139.96.0 - 37.139.111.255 ua +37.139.112.0 - 37.139.119.255 al +37.139.120.0 - 37.139.127.255 es +37.139.136.0 - 37.139.143.255 nl +37.139.144.0 - 37.139.151.255 pl +37.139.152.0 - 37.139.159.255 se +37.139.160.0 - 37.139.191.255 ua +37.139.192.0 - 37.140.199.255 ru +37.140.200.0 - 37.140.207.255 fr +37.140.208.0 - 37.140.215.255 tr +37.140.216.0 - 37.140.223.255 se +37.140.224.0 - 37.140.231.255 fr +37.140.232.0 - 37.140.233.255 us +37.140.234.0 - 37.140.235.255 nl +37.140.236.0 - 37.140.238.255 us +37.140.239.0 - 37.140.239.15 nl +37.140.239.16 - 37.140.239.255 us +37.140.240.0 - 37.140.255.255 jo +37.141.0.0 - 37.141.255.255 sa +37.142.0.0 - 37.142.255.255 il +37.143.0.0 - 37.143.7.255 be +37.143.8.0 - 37.143.31.255 ru +37.143.32.0 - 37.143.39.255 nl +37.143.40.0 - 37.143.63.255 de +37.143.64.0 - 37.143.71.255 ee +37.143.72.0 - 37.143.79.255 hu +37.143.80.0 - 37.143.87.255 nl +37.143.88.0 - 37.143.95.255 ua +37.143.96.0 - 37.143.111.255 ru +37.143.112.0 - 37.143.119.255 cz +37.143.120.0 - 37.143.127.255 es +37.143.128.0 - 37.143.135.255 kg +37.143.136.0 - 37.143.143.255 gb +37.143.144.0 - 37.143.151.255 ir +37.143.152.0 - 37.143.159.255 ge +37.143.160.0 - 37.143.175.255 ro +37.143.176.0 - 37.143.191.255 at +37.143.192.0 - 37.143.255.255 bg +37.144.0.0 - 37.147.255.255 ru +37.148.0.0 - 37.148.127.255 ro +37.148.128.0 - 37.148.135.255 nl +37.148.136.0 - 37.148.143.255 de +37.148.144.0 - 37.148.151.255 no +37.148.152.0 - 37.148.159.255 de +37.148.160.0 - 37.148.167.255 nl +37.148.168.0 - 37.148.175.255 lv +37.148.176.0 - 37.148.184.255 nl +37.148.185.0 - 37.148.187.255 it +37.148.188.0 - 37.148.207.255 nl +37.148.208.0 - 37.148.215.255 tr +37.148.216.0 - 37.148.223.255 gb +37.148.224.0 - 37.148.231.255 it +37.148.232.0 - 37.148.239.255 de +37.148.240.0 - 37.148.247.255 gb +37.149.0.0 - 37.149.63.255 gr +37.149.64.0 - 37.149.67.255 cy +37.149.68.0 - 37.149.127.255 gr +37.149.128.0 - 37.149.135.255 cy +37.149.136.0 - 37.149.191.255 gr +37.149.192.0 - 37.149.255.255 cy +37.150.0.0 - 37.151.255.255 kz +37.152.0.0 - 37.152.7.255 jo +37.152.8.0 - 37.152.15.255 nl +37.152.16.0 - 37.152.31.255 pl +37.152.32.0 - 37.152.55.255 gb +37.152.56.0 - 37.152.60.255 se +37.152.61.0 - 37.152.63.255 us +37.152.64.0 - 37.152.71.255 is +37.152.72.0 - 37.152.79.255 tr +37.152.80.0 - 37.152.95.255 es +37.152.96.0 - 37.152.127.255 sk +37.152.128.0 - 37.152.159.255 es +37.152.160.0 - 37.152.191.255 ir +37.152.192.0 - 37.152.255.255 gb +37.153.0.0 - 37.153.71.255 ru +37.153.72.0 - 37.153.79.255 gb +37.153.80.0 - 37.153.87.255 ch +37.153.88.0 - 37.153.95.255 es +37.153.96.0 - 37.153.103.255 nl +37.153.104.0 - 37.153.127.255 ch +37.153.128.0 - 37.153.133.255 ro +37.153.134.0 - 37.153.134.127 cn +37.153.134.128 - 37.153.134.255 kr +37.153.135.0 - 37.153.137.255 ro +37.153.138.0 - 37.153.139.255 se +37.153.140.0 - 37.153.140.255 gr +37.153.141.0 - 37.153.141.255 ro +37.153.142.0 - 37.153.142.255 es +37.153.143.0 - 37.153.143.255 us +37.153.144.0 - 37.153.171.255 ro +37.153.172.0 - 37.153.173.255 se +37.153.174.0 - 37.153.175.255 ro +37.153.176.0 - 37.153.191.255 ir +37.153.192.0 - 37.153.255.255 nl +37.154.0.0 - 37.155.255.255 tr +37.156.0.0 - 37.156.3.255 md +37.156.4.0 - 37.156.5.255 ro +37.156.6.0 - 37.156.6.127 cn +37.156.6.128 - 37.156.6.255 kr +37.156.7.0 - 37.156.7.255 ro +37.156.8.0 - 37.156.15.255 md +37.156.16.0 - 37.156.31.255 ir +37.156.32.0 - 37.156.37.255 ro +37.156.38.0 - 37.156.39.255 je +37.156.40.0 - 37.156.47.255 ro +37.156.48.0 - 37.156.63.255 ir +37.156.64.0 - 37.156.65.255 gb +37.156.66.0 - 37.156.66.255 md +37.156.67.0 - 37.156.68.255 ro +37.156.69.0 - 37.156.70.255 md +37.156.71.0 - 37.156.71.255 ro +37.156.72.0 - 37.156.72.255 cn +37.156.73.0 - 37.156.73.255 ro +37.156.74.0 - 37.156.74.127 gb +37.156.74.128 - 37.156.79.255 ro +37.156.80.0 - 37.156.95.255 md +37.156.96.0 - 37.156.99.255 it +37.156.100.0 - 37.156.103.255 ir +37.156.104.0 - 37.156.104.255 kr +37.156.105.0 - 37.156.105.255 ro +37.156.106.0 - 37.156.106.127 gb +37.156.106.128 - 37.156.111.255 ro +37.156.112.0 - 37.156.143.255 ir +37.156.144.0 - 37.156.147.255 md +37.156.148.0 - 37.156.151.255 it +37.156.152.0 - 37.156.167.255 ir +37.156.168.0 - 37.156.171.255 it +37.156.172.0 - 37.156.172.255 ro +37.156.173.0 - 37.156.173.255 gb +37.156.174.0 - 37.156.183.255 ro +37.156.184.0 - 37.156.184.255 kr +37.156.185.0 - 37.156.185.255 ro +37.156.186.0 - 37.156.186.127 gb +37.156.186.128 - 37.156.191.255 ro +37.156.192.0 - 37.156.207.255 se +37.156.208.0 - 37.156.211.255 it +37.156.212.0 - 37.156.215.255 ro +37.156.216.0 - 37.156.216.255 jp +37.156.217.0 - 37.156.217.255 ro +37.156.218.0 - 37.156.218.127 gb +37.156.218.128 - 37.156.231.255 ro +37.156.232.0 - 37.156.239.255 ir +37.156.240.0 - 37.156.243.255 md +37.156.244.0 - 37.156.246.255 ro +37.156.247.0 - 37.156.251.255 md +37.156.252.0 - 37.156.255.255 ro +37.157.0.0 - 37.157.7.255 dk +37.157.8.0 - 37.157.15.255 fr +37.157.16.0 - 37.157.31.255 ru +37.157.32.0 - 37.157.39.255 gb +37.157.40.0 - 37.157.47.255 de +37.157.48.0 - 37.157.55.255 gb +37.157.56.0 - 37.157.63.255 fr +37.157.64.0 - 37.157.127.255 ee +37.157.128.0 - 37.157.135.255 fr +37.157.136.0 - 37.157.143.255 bg +37.157.144.0 - 37.157.151.255 lt +37.157.152.0 - 37.157.159.255 lu +37.157.160.0 - 37.157.191.255 bg +37.157.192.0 - 37.157.199.255 cz +37.157.200.0 - 37.157.207.255 pl +37.157.208.0 - 37.157.223.255 am +37.157.224.0 - 37.157.231.255 fr +37.157.232.0 - 37.157.239.255 ru +37.157.240.0 - 37.157.247.255 gb +37.157.248.0 - 37.157.255.255 de +37.158.0.0 - 37.158.255.255 es +37.159.0.0 - 37.159.255.255 it +37.160.0.0 - 37.175.255.255 fr +37.176.0.0 - 37.183.255.255 it +37.184.0.0 - 37.185.255.255 be +37.186.0.0 - 37.186.63.255 at +37.186.64.0 - 37.186.127.255 am +37.186.128.0 - 37.186.255.255 it +37.187.0.0 - 37.187.186.143 fr +37.187.186.144 - 37.187.186.147 gb +37.187.186.148 - 37.187.200.255 fr +37.187.201.0 - 37.187.201.255 pl +37.187.202.0 - 37.187.202.255 fr +37.187.203.0 - 37.187.203.255 gb +37.187.204.0 - 37.187.207.255 fr +37.187.208.0 - 37.187.208.255 gb +37.187.209.0 - 37.187.209.255 de +37.187.210.0 - 37.187.210.255 fr +37.187.211.0 - 37.187.211.255 es +37.187.212.0 - 37.187.212.255 fr +37.187.213.0 - 37.187.213.255 it +37.187.214.0 - 37.187.244.72 fr +37.187.244.73 - 37.187.244.73 es +37.187.244.74 - 37.187.255.255 fr +37.188.0.0 - 37.188.63.255 ru +37.188.64.0 - 37.188.79.255 nl +37.188.80.0 - 37.188.87.255 hu +37.188.88.0 - 37.188.95.255 fr +37.188.96.0 - 37.188.127.255 gb +37.188.128.0 - 37.188.255.255 cz +37.189.0.0 - 37.189.255.255 pt +37.190.0.0 - 37.190.127.255 ru +37.190.128.0 - 37.190.255.255 pl +37.191.0.0 - 37.191.63.255 hu +37.191.64.0 - 37.191.95.255 ir +37.191.96.0 - 37.191.127.255 gb +37.191.128.0 - 37.191.255.255 no +37.192.0.0 - 37.195.246.255 ru +37.195.247.0 - 37.195.247.255 de +37.195.248.0 - 37.195.255.255 ru +37.196.0.0 - 37.199.255.255 se +37.200.0.0 - 37.200.63.255 no +37.200.64.0 - 37.200.79.255 ru +37.200.80.0 - 37.200.87.255 it +37.200.88.0 - 37.200.95.255 ru +37.200.96.0 - 37.200.103.255 de +37.200.104.0 - 37.200.111.255 fr +37.200.112.0 - 37.200.119.255 gb +37.200.120.0 - 37.200.127.255 ru +37.200.128.0 - 37.200.255.255 om +37.201.0.0 - 37.202.7.255 de +37.202.8.0 - 37.202.15.255 ru +37.202.16.0 - 37.202.23.255 it +37.202.24.0 - 37.202.31.255 no +37.202.32.0 - 37.202.47.255 pl +37.202.48.0 - 37.202.55.255 tr +37.202.56.0 - 37.202.63.255 no +37.202.64.0 - 37.202.127.255 jo +37.202.128.0 - 37.202.255.255 ro +37.203.0.0 - 37.203.31.255 ua +37.203.32.0 - 37.203.39.255 lv +37.203.40.0 - 37.203.47.255 gb +37.203.48.0 - 37.203.55.255 ie +37.203.56.0 - 37.203.63.255 nl +37.203.64.0 - 37.203.127.255 ba +37.203.128.0 - 37.203.191.255 gb +37.203.192.0 - 37.203.199.255 ie +37.203.200.0 - 37.203.207.255 ru +37.203.208.0 - 37.203.215.255 se +37.203.216.0 - 37.203.223.255 nl +37.203.224.0 - 37.203.239.255 it +37.203.240.0 - 37.203.247.255 ru +37.203.248.0 - 37.203.255.255 ch +37.204.0.0 - 37.204.255.255 ru +37.205.0.0 - 37.205.7.255 tr +37.205.8.0 - 37.205.15.255 cz +37.205.16.0 - 37.205.23.255 ru +37.205.24.0 - 37.205.31.255 ba +37.205.32.0 - 37.205.39.255 is +37.205.40.0 - 37.205.47.255 fr +37.205.48.0 - 37.205.55.255 ru +37.205.56.0 - 37.205.63.255 gb +37.205.64.0 - 37.205.95.255 ru +37.205.96.0 - 37.205.111.255 hr +37.205.112.0 - 37.205.119.255 iq +37.205.120.0 - 37.205.127.255 dk +37.205.128.0 - 37.207.102.65 it +37.207.102.66 - 37.207.102.66 us +37.207.102.67 - 37.207.102.70 it +37.207.102.71 - 37.207.102.71 us +37.207.102.72 - 37.207.255.255 it +37.208.0.0 - 37.208.31.255 se +37.208.32.0 - 37.208.39.255 ba +37.208.40.0 - 37.208.47.255 kz +37.208.48.0 - 37.208.55.255 fr +37.208.56.0 - 37.208.63.255 be +37.208.64.0 - 37.208.79.255 ru +37.208.80.0 - 37.208.87.255 gb +37.208.88.0 - 37.208.95.255 be +37.208.96.0 - 37.208.103.255 ru +37.208.104.0 - 37.208.111.255 de +37.208.112.0 - 37.208.119.255 nl +37.208.120.0 - 37.208.127.255 ru +37.208.128.0 - 37.208.255.255 qa +37.209.0.0 - 37.209.127.255 de +37.209.128.0 - 37.209.159.255 pl +37.209.160.0 - 37.209.167.255 lv +37.209.168.0 - 37.209.175.255 bg +37.209.176.0 - 37.209.191.255 ch +37.209.192.0 - 37.209.199.255 gb +37.209.200.0 - 37.209.207.255 it +37.209.208.0 - 37.209.223.255 gb +37.209.224.0 - 37.209.247.255 ru +37.209.248.0 - 37.209.255.255 lb +37.210.0.0 - 37.211.255.255 qa +37.212.0.0 - 37.215.255.255 by +37.216.0.0 - 37.217.255.255 sa +37.218.0.0 - 37.218.127.255 es +37.218.128.0 - 37.218.191.255 kg +37.218.192.0 - 37.218.207.255 cy +37.218.208.0 - 37.218.223.255 ps +37.218.224.0 - 37.218.231.255 ae +37.218.232.0 - 37.218.239.255 hu +37.218.240.0 - 37.218.243.255 is +37.218.244.0 - 37.218.247.255 nl +37.218.248.0 - 37.218.255.255 de +37.219.0.0 - 37.219.255.255 fi +37.220.0.0 - 37.220.31.255 gb +37.220.32.0 - 37.220.39.255 nl +37.220.40.0 - 37.220.47.255 it +37.220.48.0 - 37.220.63.255 fr +37.220.64.0 - 37.220.79.255 rs +37.220.80.0 - 37.220.87.255 ru +37.220.88.0 - 37.220.96.103 gb +37.220.96.104 - 37.220.96.111 it +37.220.96.112 - 37.220.97.31 gb +37.220.97.32 - 37.220.97.39 it +37.220.97.40 - 37.220.98.167 gb +37.220.98.168 - 37.220.98.175 it +37.220.98.176 - 37.220.99.7 gb +37.220.99.8 - 37.220.99.15 it +37.220.99.16 - 37.220.99.79 gb +37.220.99.80 - 37.220.99.87 it +37.220.99.88 - 37.220.99.175 gb +37.220.99.176 - 37.220.99.183 it +37.220.99.184 - 37.220.100.119 gb +37.220.100.120 - 37.220.100.127 it +37.220.100.128 - 37.220.100.215 gb +37.220.100.216 - 37.220.100.223 it +37.220.100.224 - 37.220.101.223 gb +37.220.101.224 - 37.220.101.231 it +37.220.101.232 - 37.220.102.135 gb +37.220.102.136 - 37.220.102.143 it +37.220.102.144 - 37.220.103.175 gb +37.220.103.176 - 37.220.103.183 it +37.220.103.184 - 37.220.111.255 gb +37.220.112.0 - 37.220.127.255 jo +37.220.128.0 - 37.220.143.255 hu +37.220.144.0 - 37.220.151.255 nl +37.220.152.0 - 37.220.167.255 ru +37.220.168.0 - 37.220.175.255 nl +37.220.176.0 - 37.220.191.255 ru +37.220.192.0 - 37.220.255.255 hu +37.221.0.0 - 37.221.63.255 ir +37.221.128.0 - 37.221.159.255 ua +37.221.160.0 - 37.221.160.255 tr +37.221.161.0 - 37.221.167.255 ro +37.221.168.0 - 37.221.169.255 de +37.221.170.0 - 37.221.170.255 ro +37.221.171.0 - 37.221.171.194 de +37.221.171.195 - 37.221.171.195 ro +37.221.171.196 - 37.221.171.255 de +37.221.172.0 - 37.221.173.255 a1 +37.221.174.0 - 37.221.175.255 us +37.221.176.0 - 37.221.183.255 me +37.221.184.0 - 37.221.191.255 ru +37.221.192.0 - 37.221.199.255 de +37.221.200.0 - 37.221.207.255 ru +37.221.208.0 - 37.221.215.255 hu +37.221.216.0 - 37.221.223.255 gb +37.221.224.0 - 37.221.231.255 se +37.221.232.0 - 37.221.239.255 es +37.221.240.0 - 37.221.255.255 cz +37.222.0.0 - 37.223.255.255 es +37.224.0.0 - 37.224.255.255 sa +37.225.0.0 - 37.225.255.255 pl +37.226.0.0 - 37.227.255.255 it +37.228.0.0 - 37.228.63.255 pl +37.228.64.0 - 37.228.71.255 kz +37.228.72.0 - 37.228.79.255 nl +37.228.80.0 - 37.228.95.255 ru +37.228.96.0 - 37.228.103.255 es +37.228.104.0 - 37.228.111.255 us +37.228.112.0 - 37.228.119.255 ru +37.228.120.0 - 37.228.132.217 de +37.228.132.218 - 37.228.132.218 pt +37.228.132.219 - 37.228.191.255 de +37.228.192.0 - 37.228.255.255 ie +37.229.0.0 - 37.229.255.255 ua +37.230.0.0 - 37.230.47.255 de +37.230.48.0 - 37.230.63.255 gb +37.230.64.0 - 37.230.95.255 es +37.230.96.0 - 37.230.103.255 nl +37.230.104.0 - 37.230.111.255 tr +37.230.112.0 - 37.230.119.255 ru +37.230.120.0 - 37.230.127.255 be +37.230.128.0 - 37.230.134.255 ru +37.230.135.0 - 37.230.135.255 nl +37.230.136.0 - 37.230.246.255 ru +37.230.247.0 - 37.230.247.255 az +37.230.248.0 - 37.230.250.255 ru +37.230.251.0 - 37.230.251.255 kz +37.230.252.0 - 37.230.255.255 ru +37.231.0.0 - 37.231.255.255 kw +37.232.0.0 - 37.232.127.255 ge +37.232.128.0 - 37.232.255.255 ru +37.233.0.0 - 37.233.63.255 md +37.233.64.0 - 37.233.79.255 se +37.233.80.0 - 37.233.87.255 ru +37.233.88.0 - 37.233.95.255 fi +37.233.96.0 - 37.233.111.255 pl +37.233.112.0 - 37.233.119.255 ru +37.233.120.0 - 37.233.127.255 ch +37.233.128.0 - 37.233.255.255 ge +37.234.0.0 - 37.234.255.255 hu +37.235.0.0 - 37.235.7.255 at +37.235.8.0 - 37.235.15.255 nl +37.235.16.0 - 37.235.31.255 ir +37.235.32.0 - 37.235.39.255 es +37.235.40.0 - 37.235.47.255 gb +37.235.48.0 - 37.235.48.255 pl +37.235.49.0 - 37.235.49.255 is +37.235.50.0 - 37.235.51.255 ch +37.235.52.0 - 37.235.52.255 cl +37.235.53.0 - 37.235.53.255 es +37.235.54.0 - 37.235.54.255 gb +37.235.55.0 - 37.235.55.255 im +37.235.56.0 - 37.235.63.255 at +37.235.64.0 - 37.235.71.255 ru +37.235.72.0 - 37.235.79.255 tr +37.235.80.0 - 37.235.87.255 nl +37.235.88.0 - 37.235.95.255 fr +37.235.96.0 - 37.235.105.255 cz +37.235.106.0 - 37.235.106.255 se +37.235.107.0 - 37.235.109.255 us +37.235.110.0 - 37.235.110.255 fr +37.235.111.0 - 37.235.111.255 es +37.235.112.0 - 37.235.119.255 nl +37.235.120.0 - 37.235.127.255 gb +37.235.128.0 - 37.235.255.255 ru +37.236.0.0 - 37.239.255.255 iq +37.240.0.0 - 37.243.255.255 sa +37.244.0.0 - 37.244.127.255 de +37.244.128.0 - 37.244.255.255 hr +37.245.0.0 - 37.245.255.255 ae +37.246.0.0 - 37.246.255.255 md +37.247.0.0 - 37.247.31.255 se +37.247.32.0 - 37.247.47.255 nl +37.247.48.0 - 37.247.55.255 it +37.247.56.0 - 37.247.63.255 pl +37.247.64.0 - 37.247.82.255 de +37.247.83.0 - 37.247.83.255 be +37.247.84.0 - 37.247.86.255 de +37.247.87.0 - 37.247.87.255 it +37.247.88.0 - 37.247.88.255 de +37.247.89.0 - 37.247.91.255 fr +37.247.92.0 - 37.247.92.255 de +37.247.93.0 - 37.247.93.255 es +37.247.94.0 - 37.247.95.255 de +37.247.96.0 - 37.247.115.255 tr +37.247.116.0 - 37.247.117.255 gb +37.247.118.0 - 37.247.118.255 nl +37.247.119.0 - 37.247.119.255 tr +37.247.120.0 - 37.247.127.255 es +37.247.128.0 - 37.249.255.255 pl +37.250.0.0 - 37.250.255.255 se +37.251.0.0 - 37.251.127.255 nl +37.251.128.0 - 37.251.255.255 ro +37.252.0.0 - 37.252.2.255 ru +37.252.3.0 - 37.252.11.255 de +37.252.12.0 - 37.252.12.255 ru +37.252.13.0 - 37.252.15.255 de +37.252.16.0 - 37.252.23.255 ru +37.252.24.0 - 37.252.63.255 gb +37.252.64.0 - 37.252.95.255 am +37.252.96.0 - 37.252.103.255 es +37.252.104.0 - 37.252.111.255 de +37.252.112.0 - 37.252.119.255 no +37.252.120.0 - 37.252.127.255 nl +37.252.128.0 - 37.252.159.255 ch +37.252.160.0 - 37.252.175.255 eu +37.252.176.0 - 37.252.183.255 es +37.252.184.0 - 37.252.191.255 at +37.252.192.0 - 37.252.199.255 gb +37.252.200.0 - 37.252.207.255 fr +37.252.208.0 - 37.252.209.255 us +37.252.210.0 - 37.252.210.255 gb +37.252.211.0 - 37.252.211.255 de +37.252.212.0 - 37.252.212.255 hk +37.252.213.0 - 37.252.213.255 au +37.252.214.0 - 37.252.215.255 no +37.252.224.0 - 37.252.224.255 si +37.252.225.0 - 37.252.226.255 fr +37.252.227.0 - 37.252.227.255 de +37.252.228.0 - 37.252.229.255 jp +37.252.230.0 - 37.252.230.255 gb +37.252.231.0 - 37.252.231.255 ie +37.252.232.0 - 37.252.232.255 gb +37.252.233.0 - 37.252.233.255 at +37.252.234.0 - 37.252.234.255 de +37.252.235.0 - 37.252.237.255 at +37.252.238.0 - 37.252.239.255 br +37.252.240.0 - 37.252.240.255 au +37.252.241.0 - 37.252.242.255 at +37.252.243.0 - 37.252.243.255 tw +37.252.244.0 - 37.252.244.255 kr +37.252.245.0 - 37.252.245.255 ae +37.252.246.0 - 37.252.246.255 sk +37.252.247.0 - 37.252.247.255 bg +37.252.248.0 - 37.252.248.255 de +37.252.249.0 - 37.252.249.255 hk +37.252.250.0 - 37.252.250.255 at +37.252.251.0 - 37.252.251.255 cl +37.252.252.0 - 37.252.252.255 at +37.252.253.0 - 37.252.253.255 it +37.252.254.0 - 37.252.255.255 ru +37.253.0.0 - 37.253.255.255 no +37.254.0.0 - 37.255.255.255 ir +38.0.0.0 - 38.64.37.255 us +38.64.38.0 - 38.64.38.255 ca +38.64.39.0 - 38.64.128.255 us +38.64.129.0 - 38.64.129.255 ca +38.64.130.0 - 38.64.135.255 us +38.64.136.0 - 38.64.137.255 ca +38.64.138.0 - 38.64.143.255 us +38.64.144.0 - 38.64.145.255 ca +38.64.146.0 - 38.64.147.255 us +38.64.148.0 - 38.64.148.255 ca +38.64.149.0 - 38.64.149.255 us +38.64.150.0 - 38.64.150.255 ca +38.64.151.0 - 38.64.156.255 us +38.64.157.0 - 38.64.157.255 ca +38.64.158.0 - 38.64.167.255 us +38.64.168.0 - 38.64.171.255 ca +38.64.172.0 - 38.64.173.255 us +38.64.174.0 - 38.64.175.255 ca +38.64.176.0 - 38.64.177.255 us +38.64.178.0 - 38.64.178.255 ca +38.64.179.0 - 38.64.183.255 us +38.64.184.0 - 38.64.184.255 ca +38.64.185.0 - 38.64.187.255 us +38.64.188.0 - 38.64.190.255 ca +38.64.191.0 - 38.64.191.255 us +38.64.192.0 - 38.64.192.255 ca +38.64.193.0 - 38.64.193.255 us +38.64.194.0 - 38.64.194.255 ca +38.64.195.0 - 38.64.197.255 us +38.64.198.0 - 38.64.198.127 ca +38.64.198.128 - 38.64.203.255 us +38.64.204.0 - 38.64.204.255 ca +38.64.205.0 - 38.65.135.255 us +38.65.136.0 - 38.65.137.255 mx +38.65.138.0 - 38.65.140.255 us +38.65.141.0 - 38.65.141.255 mx +38.65.142.0 - 38.69.129.255 us +38.69.130.0 - 38.69.130.255 ca +38.69.131.0 - 38.69.141.255 us +38.69.142.0 - 38.69.142.255 ca +38.69.143.0 - 38.69.144.255 us +38.69.145.0 - 38.69.145.255 ca +38.69.146.0 - 38.69.147.255 us +38.69.148.0 - 38.69.149.255 ca +38.69.150.0 - 38.69.162.255 us +38.69.163.0 - 38.69.163.255 ca +38.69.164.0 - 38.69.223.255 us +38.69.224.0 - 38.69.231.255 au +38.69.232.0 - 38.74.43.255 us +38.74.44.0 - 38.74.44.255 ca +38.74.45.0 - 38.80.63.255 us +38.80.64.0 - 38.80.65.255 ca +38.80.66.0 - 38.86.192.63 us +38.86.192.64 - 38.86.192.67 ca +38.86.192.68 - 38.86.192.70 us +38.86.192.71 - 38.86.192.71 ca +38.86.192.72 - 38.87.231.255 us +38.87.232.0 - 38.87.232.255 pr +38.87.233.0 - 38.87.237.255 us +38.87.238.0 - 38.87.239.255 pr +38.87.240.0 - 38.88.5.255 us +38.88.6.0 - 38.88.6.127 ca +38.88.6.128 - 38.88.6.255 us +38.88.7.0 - 38.88.7.255 ca +38.88.8.0 - 38.88.63.255 us +38.88.64.0 - 38.88.64.255 ca +38.88.65.0 - 38.88.65.255 us +38.88.66.0 - 38.88.68.255 ca +38.88.69.0 - 38.88.175.255 us +38.88.176.0 - 38.88.177.255 ca +38.88.178.0 - 38.99.128.255 us +38.99.129.0 - 38.99.130.255 ca +38.99.131.0 - 38.99.131.255 us +38.99.132.0 - 38.99.134.255 ca +38.99.135.0 - 38.99.135.255 us +38.99.136.0 - 38.99.137.255 ca +38.99.138.0 - 38.99.139.255 us +38.99.140.0 - 38.99.142.255 ca +38.99.143.0 - 38.99.143.255 us +38.99.144.0 - 38.99.145.255 ca +38.99.146.0 - 38.99.149.255 us +38.99.150.0 - 38.99.153.191 ca +38.99.153.192 - 38.99.153.223 us +38.99.153.224 - 38.99.153.255 ca +38.99.154.0 - 38.99.159.255 us +38.99.160.0 - 38.99.161.255 ca +38.99.162.0 - 38.99.162.255 us +38.99.163.0 - 38.99.165.255 ca +38.99.166.0 - 38.99.167.31 us +38.99.167.32 - 38.99.167.255 ca +38.99.168.0 - 38.99.171.255 us +38.99.172.0 - 38.99.173.255 ca +38.99.174.0 - 38.99.175.255 us +38.99.176.0 - 38.99.177.255 ca +38.99.178.0 - 38.99.184.255 us +38.99.185.0 - 38.99.187.255 ca +38.99.188.0 - 38.99.188.255 us +38.99.189.0 - 38.99.191.255 ca +38.99.192.0 - 38.99.242.255 us +38.99.243.0 - 38.99.243.255 gu +38.99.244.0 - 38.102.80.255 us +38.102.81.0 - 38.102.81.255 ca +38.102.82.0 - 38.102.193.255 us +38.102.194.0 - 38.102.194.25 ca +38.102.194.26 - 38.102.194.26 us +38.102.194.27 - 38.102.194.69 ca +38.102.194.70 - 38.102.194.70 us +38.102.194.71 - 38.102.194.255 ca +38.102.195.0 - 38.103.151.255 us +38.103.152.0 - 38.103.152.255 ca +38.103.153.0 - 38.103.154.255 us +38.103.155.0 - 38.103.156.255 ca +38.103.157.0 - 38.104.154.255 us +38.104.155.0 - 38.104.159.255 ca +38.104.160.0 - 38.104.191.255 us +38.104.192.0 - 38.104.192.255 ca +38.104.193.0 - 38.104.207.255 us +38.104.208.0 - 38.104.209.255 ca +38.104.210.0 - 38.104.226.255 us +38.104.227.0 - 38.104.227.255 ca +38.104.228.0 - 38.104.247.255 us +38.104.248.0 - 38.104.248.255 mx +38.104.249.0 - 38.104.250.255 us +38.104.251.0 - 38.104.251.255 ca +38.104.252.0 - 38.105.28.255 us +38.105.29.0 - 38.105.30.255 jp +38.105.31.0 - 38.105.35.255 us +38.105.36.0 - 38.105.36.255 ca +38.105.37.0 - 38.106.170.63 us +38.106.170.64 - 38.106.170.127 ca +38.106.170.128 - 38.107.87.255 us +38.107.88.0 - 38.107.89.255 pr +38.107.90.0 - 38.107.90.255 us +38.107.91.0 - 38.107.91.255 pr +38.107.92.0 - 38.107.94.255 us +38.107.95.0 - 38.107.95.255 pr +38.107.96.0 - 38.108.64.255 us +38.108.65.0 - 38.108.65.255 ca +38.108.66.0 - 38.108.73.255 us +38.108.74.0 - 38.108.74.255 ca +38.108.75.0 - 38.108.82.255 us +38.108.83.0 - 38.108.83.255 ca +38.108.84.0 - 38.108.86.255 us +38.108.87.0 - 38.108.87.255 ca +38.108.88.0 - 38.109.160.255 us +38.109.161.0 - 38.109.161.63 ca +38.109.161.64 - 38.109.161.255 ru +38.109.162.0 - 38.109.164.255 us +38.109.165.0 - 38.109.165.255 ca +38.109.166.0 - 38.110.63.255 us +38.110.64.0 - 38.110.64.255 ca +38.110.65.0 - 38.110.67.255 us +38.110.68.0 - 38.110.68.255 ca +38.110.69.0 - 38.110.70.255 us +38.110.71.0 - 38.110.71.255 ca +38.110.72.0 - 38.110.79.255 us +38.110.80.0 - 38.110.81.255 ca +38.110.82.0 - 38.110.86.255 us +38.110.87.0 - 38.110.87.255 ca +38.110.88.0 - 38.110.92.255 us +38.110.93.0 - 38.110.93.255 ca +38.110.94.0 - 38.110.96.134 us +38.110.96.135 - 38.110.96.135 ca +38.110.96.136 - 38.110.126.255 us +38.110.127.0 - 38.110.127.255 ca +38.110.128.0 - 38.111.102.255 us 38.111.103.0 - 38.111.103.255 ca -38.111.104.0 - 38.111.119.255 us -38.111.120.0 - 38.111.123.255 ca -38.111.124.0 - 38.117.91.255 us -38.117.92.0 - 38.117.92.31 ca -38.117.92.32 - 38.255.255.255 us +38.111.104.0 - 38.111.116.255 us +38.111.117.0 - 38.111.119.255 ca +38.111.120.0 - 38.111.123.255 us +38.111.124.0 - 38.111.125.255 ca +38.111.126.0 - 38.111.144.255 us +38.111.145.0 - 38.111.145.255 ru +38.111.146.0 - 38.112.0.255 us +38.112.1.0 - 38.112.1.255 ca +38.112.2.0 - 38.112.2.255 us +38.112.3.0 - 38.112.3.255 ca +38.112.4.0 - 38.112.7.191 us +38.112.7.192 - 38.112.7.223 ca +38.112.7.224 - 38.112.88.255 us +38.112.89.0 - 38.112.89.255 ca +38.112.90.0 - 38.112.91.255 us +38.112.92.0 - 38.112.92.255 ca +38.112.93.0 - 38.112.99.255 us +38.112.100.0 - 38.112.100.255 ca +38.112.101.0 - 38.112.105.255 us +38.112.106.0 - 38.112.107.255 ca +38.112.108.0 - 38.112.114.255 us +38.112.115.0 - 38.112.115.255 ca +38.112.116.0 - 38.112.124.255 us +38.112.125.0 - 38.112.125.255 ca +38.112.126.0 - 38.113.163.255 us +38.113.164.0 - 38.113.164.255 ca +38.113.165.0 - 38.113.184.255 us +38.113.185.0 - 38.113.185.255 ca +38.113.186.0 - 38.113.186.255 us +38.113.187.0 - 38.113.187.255 ca +38.113.188.0 - 38.116.191.255 us +38.116.192.0 - 38.116.192.255 ca +38.116.193.0 - 38.116.195.255 us +38.116.196.0 - 38.116.196.255 ca +38.116.197.0 - 38.116.197.255 us +38.116.198.0 - 38.116.199.255 ca +38.116.200.0 - 38.117.75.255 us +38.117.76.0 - 38.117.79.255 ca +38.117.80.0 - 38.117.83.255 us +38.117.84.0 - 38.117.84.255 ca +38.117.85.0 - 38.117.91.255 us +38.117.92.0 - 38.117.92.255 ca +38.117.93.0 - 38.117.99.255 us +38.117.100.0 - 38.117.100.255 ca +38.117.101.0 - 38.117.105.255 us +38.117.106.0 - 38.117.109.255 ca +38.117.110.0 - 38.121.67.189 us +38.121.67.190 - 38.121.67.190 ca +38.121.67.191 - 38.121.67.255 us +38.121.68.0 - 38.121.68.255 ca +38.121.69.0 - 38.121.74.255 us +38.121.75.0 - 38.121.75.255 ca +38.121.76.0 - 38.121.241.255 us +38.121.242.0 - 38.121.242.255 ca +38.121.243.0 - 38.121.243.255 us +38.121.244.0 - 38.121.244.255 ca +38.121.245.0 - 38.121.246.255 us +38.121.247.0 - 38.121.247.255 ca +38.121.248.0 - 38.121.250.127 us +38.121.250.128 - 38.121.251.255 ca +38.121.252.0 - 38.122.41.255 us +38.122.42.0 - 38.122.42.255 ca +38.122.43.0 - 38.122.67.255 us +38.122.68.0 - 38.122.68.255 ca +38.122.69.0 - 38.122.183.255 us +38.122.184.0 - 38.122.185.37 ca +38.122.185.38 - 38.122.185.38 us +38.122.185.39 - 38.122.185.255 ca +38.122.186.0 - 38.123.65.255 us +38.123.66.0 - 38.123.67.255 mx +38.123.68.0 - 38.123.192.63 us +38.123.192.64 - 38.123.192.127 mx +38.123.192.128 - 38.123.194.127 us +38.123.194.128 - 38.123.194.255 mx +38.123.195.0 - 38.123.202.255 us +38.123.203.0 - 38.123.203.255 mx +38.123.204.0 - 38.123.204.255 us +38.123.205.0 - 38.123.205.255 mx +38.123.206.0 - 38.124.170.255 us +38.124.171.0 - 38.124.171.255 mx +38.124.172.0 - 38.124.173.255 us +38.124.174.0 - 38.124.174.255 mx +38.124.175.0 - 38.124.192.255 us +38.124.193.0 - 38.124.193.255 mx +38.124.194.0 - 38.124.199.255 us +38.124.200.0 - 38.124.200.255 mx +38.124.201.0 - 38.125.45.255 us +38.125.46.0 - 38.125.46.255 pr +38.125.47.0 - 38.127.63.255 us +38.127.64.0 - 38.127.64.255 ca +38.127.65.0 - 38.127.65.255 us +38.127.66.0 - 38.127.66.255 ca +38.127.67.0 - 38.127.75.255 us +38.127.76.0 - 38.127.76.255 ca +38.127.77.0 - 38.128.239.255 us +38.128.240.0 - 38.128.255.255 ca +38.129.0.0 - 38.129.4.74 us +38.129.4.75 - 38.129.4.75 ca +38.129.4.76 - 38.130.112.255 us +38.130.113.0 - 38.130.114.255 ca +38.130.115.0 - 38.130.117.255 us +38.130.118.0 - 38.130.118.255 ca +38.130.119.0 - 38.130.123.255 us +38.130.124.0 - 38.130.124.255 ca +38.130.125.0 - 38.131.159.255 us +38.131.160.0 - 38.131.175.255 ca +38.131.176.0 - 38.132.35.255 us +38.132.36.0 - 38.132.37.255 ca +38.132.38.0 - 38.132.41.104 us +38.132.41.105 - 38.132.41.105 ca +38.132.41.106 - 38.140.9.255 us +38.140.10.0 - 38.140.10.255 ca +38.140.11.0 - 38.140.99.255 us +38.140.100.0 - 38.140.101.255 ca +38.140.102.0 - 38.255.255.255 us 39.0.0.0 - 39.0.0.255 cn 39.0.1.0 - 39.0.1.255 au 39.0.2.0 - 39.0.255.255 cn @@ -2650,20 +6473,327 @@ 39.8.0.0 - 39.15.255.255 tw 39.16.0.0 - 39.31.255.255 kr 39.32.0.0 - 39.63.255.255 pk -39.64.0.0 - 39.95.255.255 cn -39.96.0.0 - 39.111.255.255 hk +39.64.0.0 - 39.108.255.255 cn +39.109.0.0 - 39.109.127.255 hk +39.109.128.0 - 39.109.255.255 sg +39.110.0.0 - 39.111.255.255 jp 39.112.0.0 - 39.127.255.255 kr 39.128.0.0 - 39.191.255.255 cn 39.192.0.0 - 39.255.255.255 id -40.0.0.0 - 40.255.255.255 us +40.0.0.0 - 40.0.95.255 us +40.0.96.0 - 40.0.96.255 eu +40.0.97.0 - 40.67.255.255 us +40.68.0.0 - 40.68.255.255 nl +40.69.0.0 - 40.69.95.255 ie +40.69.96.0 - 40.69.127.255 ca +40.69.128.0 - 40.69.191.255 us +40.69.192.0 - 40.69.223.255 ie +40.69.224.0 - 40.71.255.255 us +40.72.0.0 - 40.73.255.255 cn +40.74.0.0 - 40.74.63.255 nl +40.74.64.0 - 40.74.143.255 jp +40.74.144.0 - 40.74.159.255 ie +40.74.160.0 - 40.77.167.92 us +40.77.167.93 - 40.77.167.93 re +40.77.167.94 - 40.78.191.255 us +40.78.192.0 - 40.78.255.255 au +40.79.0.0 - 40.79.127.255 us +40.79.128.0 - 40.79.255.255 ie +40.80.0.0 - 40.80.63.255 nl +40.80.64.0 - 40.80.143.255 jp +40.80.144.0 - 40.81.255.255 us +40.82.0.0 - 40.82.255.255 nl +40.83.0.0 - 40.83.63.255 us +40.83.64.0 - 40.83.127.255 hk +40.83.128.0 - 40.84.255.255 us +40.85.0.0 - 40.85.143.255 ie +40.85.144.0 - 40.85.191.255 us +40.85.192.0 - 40.85.255.255 ca +40.86.0.0 - 40.86.191.255 us +40.86.192.0 - 40.86.255.255 ca +40.87.0.0 - 40.87.127.255 us +40.87.128.0 - 40.87.159.255 ie +40.87.160.0 - 40.87.183.255 us +40.87.184.0 - 40.87.187.255 nl +40.87.188.0 - 40.87.191.255 ie +40.87.192.0 - 40.87.195.255 hk +40.87.196.0 - 40.87.199.255 sg +40.87.200.0 - 40.87.207.255 jp +40.87.208.0 - 40.87.215.255 au +40.87.216.0 - 40.87.223.255 in +40.87.224.0 - 40.96.0.31 us +40.96.0.32 - 40.96.0.63 ie +40.96.0.64 - 40.96.3.31 us +40.96.3.32 - 40.96.3.63 de +40.96.3.64 - 40.96.3.79 in +40.96.3.80 - 40.96.3.111 de +40.96.3.112 - 40.96.4.255 us +40.96.5.0 - 40.96.5.31 at +40.96.5.32 - 40.96.5.47 nl +40.96.5.48 - 40.96.7.127 us +40.96.7.128 - 40.96.7.143 nl +40.96.7.144 - 40.96.7.159 us +40.96.7.160 - 40.96.7.175 kr +40.96.7.176 - 40.96.9.127 us +40.96.9.128 - 40.96.9.143 ca +40.96.9.144 - 40.96.9.159 ie +40.96.9.160 - 40.96.9.175 us +40.96.9.176 - 40.96.9.191 au +40.96.9.192 - 40.96.9.223 ie +40.96.9.224 - 40.96.9.239 ca +40.96.9.240 - 40.96.10.63 us +40.96.10.64 - 40.96.10.71 ie +40.96.10.72 - 40.96.16.207 us +40.96.16.208 - 40.96.16.239 at +40.96.16.240 - 40.96.17.15 us +40.96.17.16 - 40.96.17.47 fi +40.96.17.48 - 40.96.17.223 us +40.96.17.224 - 40.96.18.15 nl +40.96.18.16 - 40.96.22.191 us +40.96.22.192 - 40.96.22.207 ca +40.96.22.208 - 40.96.22.239 us +40.96.22.240 - 40.96.22.255 sg +40.96.23.0 - 40.96.23.63 us +40.96.23.64 - 40.96.23.79 ca +40.96.23.80 - 40.96.23.111 us +40.96.23.112 - 40.96.23.127 br +40.96.23.128 - 40.96.23.143 ca +40.96.23.144 - 40.96.23.175 us +40.96.23.176 - 40.96.23.191 br +40.96.23.192 - 40.96.23.223 ca +40.96.23.224 - 40.96.24.159 us +40.96.24.160 - 40.96.24.175 cl +40.96.24.176 - 40.96.24.255 us +40.96.25.0 - 40.96.25.31 ie +40.96.25.32 - 40.96.25.47 at +40.96.25.48 - 40.96.25.63 hk +40.96.25.64 - 40.96.25.79 fi +40.96.25.80 - 40.96.25.95 us +40.96.25.96 - 40.96.25.111 my +40.96.25.112 - 40.96.25.127 us +40.96.25.128 - 40.96.25.143 jp +40.96.25.144 - 40.96.25.159 us +40.96.25.160 - 40.96.25.175 au +40.96.25.176 - 40.96.25.191 de +40.96.25.192 - 40.96.25.207 us +40.96.25.208 - 40.96.25.223 de +40.96.25.224 - 40.96.25.239 us +40.96.25.240 - 40.96.25.255 hk +40.96.26.0 - 40.96.26.15 us +40.96.26.16 - 40.96.26.47 ca +40.96.26.48 - 40.96.35.175 us +40.96.35.176 - 40.96.35.207 de +40.96.35.208 - 40.96.37.223 us +40.96.37.224 - 40.96.37.255 ca +40.96.38.0 - 40.96.38.175 us +40.96.38.176 - 40.96.38.239 ca +40.96.38.240 - 40.96.43.63 us +40.96.43.64 - 40.96.43.95 gb +40.96.43.96 - 40.96.45.143 us +40.96.45.144 - 40.96.45.175 gb +40.96.45.176 - 40.96.47.15 us +40.96.47.16 - 40.96.47.31 de +40.96.47.32 - 40.96.56.31 us +40.96.56.32 - 40.96.56.95 jp +40.96.56.96 - 40.96.56.127 cl +40.96.56.128 - 40.96.57.79 us +40.96.57.80 - 40.96.57.111 jp +40.96.57.112 - 40.96.60.223 us +40.96.60.224 - 40.96.60.239 jp +40.96.60.240 - 40.96.61.159 us +40.96.61.160 - 40.96.61.191 ie +40.96.61.192 - 40.96.64.143 us +40.96.64.144 - 40.96.64.159 ie +40.96.64.160 - 40.97.255.255 us +40.98.0.0 - 40.98.255.255 nl +40.99.0.0 - 40.99.255.255 us +40.100.0.0 - 40.100.15.255 hk +40.100.16.0 - 40.100.19.255 my +40.100.20.0 - 40.100.23.255 kr +40.100.24.0 - 40.100.35.255 sg +40.100.36.0 - 40.100.39.255 jp +40.100.40.0 - 40.100.143.255 us +40.100.144.0 - 40.100.144.15 au +40.100.144.16 - 40.100.151.255 us +40.100.152.0 - 40.100.152.143 jp +40.100.152.144 - 40.100.153.255 us +40.100.154.0 - 40.100.154.255 jp +40.100.155.0 - 40.100.155.255 us +40.100.156.0 - 40.100.156.255 jp +40.100.157.0 - 40.100.159.255 us +40.100.160.0 - 40.100.160.111 ca +40.100.160.112 - 40.100.167.255 us +40.100.168.0 - 40.100.171.255 gb +40.100.172.0 - 40.100.255.255 us +40.101.0.0 - 40.101.3.255 nl +40.101.4.0 - 40.101.7.255 at +40.101.8.0 - 40.101.23.255 nl +40.101.24.0 - 40.101.27.255 ie +40.101.28.0 - 40.101.31.255 fi +40.101.32.0 - 40.101.43.255 ie +40.101.44.0 - 40.101.51.255 de +40.101.52.0 - 40.101.55.255 gb +40.101.56.0 - 40.101.59.255 nl +40.101.60.0 - 40.101.255.255 us +40.102.0.0 - 40.102.3.255 nl +40.102.4.0 - 40.102.4.143 br +40.102.4.144 - 40.102.7.255 nl +40.102.8.0 - 40.102.8.47 br +40.102.8.48 - 40.102.31.255 nl +40.102.32.0 - 40.102.39.255 cl +40.102.40.0 - 40.102.43.255 za +40.102.44.0 - 40.102.47.255 us +40.102.48.0 - 40.102.127.255 nl +40.102.128.0 - 40.102.255.255 us +40.103.0.0 - 40.103.0.15 nl +40.103.0.16 - 40.103.0.31 ie +40.103.0.32 - 40.103.0.47 fi +40.103.0.48 - 40.103.0.63 at +40.103.0.64 - 40.103.0.79 nl +40.103.0.80 - 40.103.0.95 ie +40.103.0.96 - 40.103.0.111 fi +40.103.0.112 - 40.103.0.127 at +40.103.0.128 - 40.103.0.143 nl +40.103.0.144 - 40.103.0.159 ie +40.103.0.160 - 40.103.0.175 fi +40.103.0.176 - 40.103.0.191 at +40.103.0.192 - 40.103.0.207 nl +40.103.0.208 - 40.103.0.223 ie +40.103.0.224 - 40.103.0.239 fi +40.103.0.240 - 40.103.0.255 at +40.103.1.0 - 40.103.1.15 nl +40.103.1.16 - 40.103.1.31 ie +40.103.1.32 - 40.103.1.47 fi +40.103.1.48 - 40.103.1.63 at +40.103.1.64 - 40.103.1.79 nl +40.103.1.80 - 40.103.1.95 ie +40.103.1.96 - 40.103.1.111 fi +40.103.1.112 - 40.103.1.127 at +40.103.1.128 - 40.103.1.143 nl +40.103.1.144 - 40.103.1.159 ie +40.103.1.160 - 40.103.1.175 fi +40.103.1.176 - 40.103.1.191 at +40.103.1.192 - 40.103.1.207 nl +40.103.1.208 - 40.103.1.223 ie +40.103.1.224 - 40.103.1.239 fi +40.103.1.240 - 40.103.1.255 at +40.103.2.0 - 40.103.5.191 us +40.103.5.192 - 40.103.6.255 nl +40.103.7.0 - 40.103.11.255 us +40.103.12.0 - 40.103.12.15 fi +40.103.12.16 - 40.103.12.31 ie +40.103.12.32 - 40.103.12.47 at +40.103.12.48 - 40.103.12.79 fi +40.103.12.80 - 40.103.12.95 ie +40.103.12.96 - 40.103.12.111 at +40.103.12.112 - 40.103.12.127 nl +40.103.12.128 - 40.103.12.143 fi +40.103.12.144 - 40.103.12.159 ie +40.103.12.160 - 40.103.12.175 at +40.103.12.176 - 40.103.12.191 nl +40.103.12.192 - 40.103.12.207 fi +40.103.12.208 - 40.103.12.223 ie +40.103.12.224 - 40.103.12.239 at +40.103.12.240 - 40.103.12.255 nl +40.103.13.0 - 40.103.13.15 fi +40.103.13.16 - 40.103.13.31 ie +40.103.13.32 - 40.103.13.47 at +40.103.13.48 - 40.103.13.63 nl +40.103.13.64 - 40.103.13.79 fi +40.103.13.80 - 40.103.13.95 ie +40.103.13.96 - 40.103.13.111 at +40.103.13.112 - 40.103.13.127 nl +40.103.13.128 - 40.103.13.159 fi +40.103.13.160 - 40.103.13.175 at +40.103.13.176 - 40.103.13.191 nl +40.103.13.192 - 40.103.13.207 fi +40.103.13.208 - 40.103.13.223 ie +40.103.13.224 - 40.103.13.239 at +40.103.13.240 - 40.103.13.255 nl +40.103.14.0 - 40.103.14.15 fi +40.103.14.16 - 40.103.14.31 ie +40.103.14.32 - 40.103.14.47 at +40.103.14.48 - 40.103.14.63 nl +40.103.14.64 - 40.103.14.79 fi +40.103.14.80 - 40.103.14.95 ie +40.103.14.96 - 40.103.14.111 at +40.103.14.112 - 40.103.14.127 nl +40.103.14.128 - 40.111.255.255 us +40.112.0.0 - 40.112.31.255 ie +40.112.32.0 - 40.112.35.255 us +40.112.36.0 - 40.112.36.127 ie +40.112.36.128 - 40.112.36.191 nl +40.112.36.192 - 40.112.36.255 us +40.112.37.0 - 40.112.37.63 nl +40.112.37.64 - 40.112.37.127 us +40.112.37.128 - 40.112.37.255 au +40.112.38.0 - 40.112.63.255 us +40.112.64.0 - 40.112.95.255 ie +40.112.96.0 - 40.112.127.255 nl +40.112.128.0 - 40.112.255.255 us +40.113.0.0 - 40.113.95.255 ie +40.113.96.0 - 40.113.191.255 nl +40.113.192.0 - 40.114.127.255 us +40.114.128.0 - 40.114.247.217 nl +40.114.247.218 - 40.114.247.218 us +40.114.247.219 - 40.115.63.255 nl +40.115.64.0 - 40.115.95.255 au +40.115.96.0 - 40.115.127.255 ie +40.115.128.0 - 40.115.255.255 jp +40.116.0.0 - 40.116.255.255 us +40.117.0.0 - 40.117.31.255 ie +40.117.32.0 - 40.117.255.255 us +40.118.0.0 - 40.118.127.255 nl +40.118.128.0 - 40.118.255.255 us +40.119.0.0 - 40.119.255.255 nl +40.120.0.0 - 40.120.255.255 ie +40.121.0.0 - 40.123.127.255 us +40.123.128.0 - 40.123.255.255 au +40.124.0.0 - 40.125.127.255 us +40.125.128.0 - 40.125.255.255 cn +40.126.0.0 - 40.126.63.255 jp +40.126.64.0 - 40.126.127.255 cn +40.126.128.0 - 40.126.191.255 kr +40.126.192.0 - 40.126.223.255 in +40.126.224.0 - 40.126.255.255 au +40.127.0.0 - 40.127.63.255 sg +40.127.64.0 - 40.127.95.255 au +40.127.96.0 - 40.127.111.255 ie +40.127.112.0 - 40.127.127.255 us +40.127.128.0 - 40.127.255.255 ie +40.128.0.0 - 40.252.56.99 us +40.252.56.100 - 40.252.56.103 eu +40.252.56.104 - 40.255.255.255 us 41.0.0.0 - 41.31.255.255 za 41.32.0.0 - 41.47.255.255 eg -41.48.0.0 - 41.57.255.255 za +41.48.0.0 - 41.57.63.255 za +41.57.64.0 - 41.57.79.255 zw +41.57.80.0 - 41.57.95.255 lr +41.57.96.0 - 41.57.111.255 ke +41.57.112.0 - 41.57.115.255 za +41.57.116.0 - 41.57.119.255 gh +41.57.120.0 - 41.57.123.255 ng +41.57.124.0 - 41.57.127.255 zw +41.57.128.0 - 41.57.191.255 za +41.57.192.0 - 41.57.255.255 gh 41.58.0.0 - 41.58.255.255 ng 41.59.0.0 - 41.59.255.255 tz -41.60.0.0 - 41.60.255.255 zm +41.60.0.0 - 41.60.63.255 zm +41.60.64.0 - 41.60.64.255 zw +41.60.65.0 - 41.60.66.255 zm +41.60.67.0 - 41.60.72.255 zw +41.60.73.0 - 41.60.73.255 zm +41.60.74.0 - 41.60.76.255 zw +41.60.77.0 - 41.60.80.255 zm +41.60.81.0 - 41.60.81.255 zw +41.60.82.0 - 41.60.84.255 zm +41.60.85.0 - 41.60.85.255 zw +41.60.86.0 - 41.60.86.255 zm +41.60.87.0 - 41.60.90.255 zw +41.60.91.0 - 41.60.93.255 zm +41.60.94.0 - 41.60.94.255 zw +41.60.95.0 - 41.60.255.255 zm 41.61.0.0 - 41.61.255.255 za -41.62.0.0 - 41.62.255.255 sn 41.63.0.0 - 41.63.63.255 zm 41.63.64.0 - 41.63.127.255 za 41.63.128.0 - 41.63.159.255 mg @@ -2683,10 +6813,22 @@ 41.71.0.0 - 41.71.127.255 za 41.71.128.0 - 41.71.255.255 ng 41.72.0.0 - 41.72.63.255 ao -41.72.64.0 - 41.72.95.255 eg +41.72.64.0 - 41.72.92.255 eg +41.72.93.0 - 41.72.94.255 ao +41.72.95.0 - 41.72.95.255 eg 41.72.96.0 - 41.72.127.255 zm 41.72.128.0 - 41.72.159.255 za -41.72.160.0 - 41.72.223.255 ke +41.72.160.0 - 41.72.164.255 ke +41.72.165.0 - 41.72.165.255 ao +41.72.166.0 - 41.72.167.255 ke +41.72.168.0 - 41.72.191.255 a2 +41.72.192.0 - 41.72.195.255 mu +41.72.196.0 - 41.72.196.255 ke +41.72.197.0 - 41.72.200.255 mu +41.72.201.0 - 41.72.201.255 ke +41.72.202.0 - 41.72.220.255 mu +41.72.221.0 - 41.72.221.255 ke +41.72.222.0 - 41.72.223.255 mu 41.72.224.0 - 41.72.255.255 ga 41.73.0.0 - 41.73.31.255 ng 41.73.32.0 - 41.73.63.255 za @@ -2748,7 +6890,6 @@ 41.76.184.0 - 41.76.191.255 ke 41.76.192.0 - 41.76.199.255 ng 41.76.200.0 - 41.76.231.255 za -41.76.232.0 - 41.76.239.255 zw 41.76.240.0 - 41.76.247.255 bw 41.76.248.0 - 41.76.255.255 ng 41.77.0.0 - 41.77.7.255 zm @@ -2769,9 +6910,17 @@ 41.77.136.0 - 41.77.143.255 eg 41.77.144.0 - 41.77.151.255 zm 41.77.152.0 - 41.77.159.255 za -41.77.160.0 - 41.77.167.255 rw +41.77.160.0 - 41.77.163.255 rw 41.77.168.0 - 41.77.175.255 ng +41.77.176.0 - 41.77.183.255 dz +41.77.184.0 - 41.77.191.255 gn +41.77.192.0 - 41.77.199.255 tz +41.77.200.0 - 41.77.207.255 za +41.77.208.0 - 41.77.215.255 cm +41.77.216.0 - 41.77.219.255 ke +41.77.220.0 - 41.77.223.255 cd 41.77.224.0 - 41.77.231.255 tz +41.77.232.0 - 41.77.239.255 sz 41.77.240.0 - 41.77.247.255 mz 41.77.248.0 - 41.77.255.255 eg 41.78.0.0 - 41.78.3.255 tz @@ -2794,7 +6943,9 @@ 41.78.84.0 - 41.78.87.255 sl 41.78.88.0 - 41.78.91.255 ng 41.78.92.0 - 41.78.95.255 bw -41.78.96.0 - 41.78.99.255 ga +41.78.96.0 - 41.78.97.9 ga +41.78.97.10 - 41.78.97.10 cm +41.78.97.11 - 41.78.99.255 ga 41.78.100.0 - 41.78.103.255 ng 41.78.104.0 - 41.78.107.255 cd 41.78.108.0 - 41.78.111.255 sd @@ -2816,7 +6967,7 @@ 41.78.172.0 - 41.78.175.255 ng 41.78.176.0 - 41.78.179.255 ke 41.78.180.0 - 41.78.191.255 za -41.78.196.0 - 41.78.199.255 cd +41.78.192.0 - 41.78.199.255 cd 41.78.200.0 - 41.78.203.255 za 41.78.204.0 - 41.78.207.255 cm 41.78.208.0 - 41.78.211.255 ng @@ -2830,11 +6981,11 @@ 41.78.244.0 - 41.78.247.255 za 41.78.248.0 - 41.78.251.255 mw 41.78.252.0 - 41.78.255.255 ng -41.79.0.0 - 41.79.3.255 zw 41.79.4.0 - 41.79.7.255 ng 41.79.8.0 - 41.79.11.255 ke 41.79.12.0 - 41.79.15.255 zw 41.79.16.0 - 41.79.23.255 za +41.79.24.0 - 41.79.27.255 ke 41.79.28.0 - 41.79.31.255 zw 41.79.32.0 - 41.79.35.255 bw 41.79.36.0 - 41.79.43.255 za @@ -2854,25 +7005,46 @@ 41.79.104.0 - 41.79.111.255 za 41.79.112.0 - 41.79.115.255 zw 41.79.116.0 - 41.79.119.255 ng +41.79.120.0 - 41.79.123.255 ss 41.79.124.0 - 41.79.127.255 cv 41.79.128.0 - 41.79.131.255 cm 41.79.132.0 - 41.79.135.255 zw 41.79.136.0 - 41.79.139.255 bw 41.79.140.0 - 41.79.143.255 ke 41.79.144.0 - 41.79.147.255 ng -41.79.160.0 - 41.79.163.255 mu +41.79.148.0 - 41.79.151.255 za +41.79.152.0 - 41.79.155.255 ng +41.79.156.0 - 41.79.167.255 za +41.79.168.0 - 41.79.171.255 ke +41.79.172.0 - 41.79.175.255 za +41.79.176.0 - 41.79.179.255 ng +41.79.180.0 - 41.79.183.255 za +41.79.184.0 - 41.79.187.255 tz +41.79.188.0 - 41.79.191.255 zw +41.79.192.0 - 41.79.195.255 za +41.79.196.0 - 41.79.199.255 so +41.79.200.0 - 41.79.203.255 gn +41.79.204.0 - 41.79.207.255 ng +41.79.208.0 - 41.79.211.255 eg +41.79.212.0 - 41.79.215.255 za +41.79.216.0 - 41.79.219.255 bj +41.79.220.0 - 41.79.223.255 za +41.79.224.0 - 41.79.227.255 bi 41.79.228.0 - 41.79.231.255 ke 41.79.232.0 - 41.79.235.255 cd 41.79.236.0 - 41.79.239.255 gn 41.79.240.0 - 41.79.243.255 za 41.79.244.0 - 41.79.247.255 mz -41.79.248.0 - 41.79.251.255 tz +41.79.248.0 - 41.79.251.255 za 41.79.252.0 - 41.81.255.255 ke 41.82.0.0 - 41.83.255.255 sn 41.84.0.0 - 41.84.127.255 za -41.84.128.0 - 41.84.159.255 ke +41.84.128.0 - 41.84.158.255 ke +41.84.159.0 - 41.84.159.255 mu 41.84.160.0 - 41.84.191.255 ng -41.84.192.0 - 41.84.223.255 ug +41.84.192.0 - 41.84.203.255 ug +41.84.204.0 - 41.84.207.255 ke +41.84.208.0 - 41.84.223.255 ug 41.84.224.0 - 41.84.255.255 sz 41.85.0.0 - 41.85.159.255 za 41.85.160.0 - 41.85.191.255 bj @@ -2913,17 +7085,22 @@ 41.138.72.0 - 41.138.79.255 bw 41.138.80.0 - 41.138.87.255 rw 41.138.88.0 - 41.138.91.255 bj -41.138.92.0 - 41.138.95.255 tz +41.138.92.0 - 41.138.95.255 za 41.138.96.0 - 41.138.127.255 bf 41.138.128.0 - 41.138.159.255 mr 41.138.160.0 - 41.138.191.255 ng 41.138.192.0 - 41.138.207.255 tz -41.138.208.0 - 41.138.223.255 ug +41.138.208.0 - 41.138.215.255 ug +41.138.216.0 - 41.138.219.255 ng +41.138.220.0 - 41.138.223.255 tz 41.138.224.0 - 41.138.239.255 mz -41.138.240.0 - 41.138.255.255 ke +41.138.240.0 - 41.138.251.255 ke +41.138.252.0 - 41.138.255.255 lu 41.139.0.0 - 41.139.63.255 gh 41.139.64.0 - 41.139.127.255 ng -41.139.128.0 - 41.139.255.255 ke +41.139.128.0 - 41.139.155.255 ke +41.139.156.0 - 41.139.156.255 us +41.139.157.0 - 41.139.255.255 ke 41.140.0.0 - 41.143.255.255 ma 41.144.0.0 - 41.151.255.255 za 41.152.0.0 - 41.153.255.255 eg @@ -2951,26 +7128,33 @@ 41.189.32.0 - 41.189.63.255 ci 41.189.64.0 - 41.189.95.255 za 41.189.96.0 - 41.189.127.255 ci -41.189.128.0 - 41.189.159.255 gh -41.189.160.0 - 41.189.191.255 eg +41.189.128.0 - 41.189.191.255 gh 41.189.192.0 - 41.189.223.255 cd -41.189.224.0 - 41.189.255.255 dj +41.189.224.0 - 41.189.239.255 dj +41.189.240.0 - 41.189.247.192 us +41.189.247.193 - 41.189.247.193 dj +41.189.247.194 - 41.189.255.38 us +41.189.255.39 - 41.189.255.39 dj +41.189.255.40 - 41.189.255.255 us 41.190.0.0 - 41.190.31.255 ng 41.190.32.0 - 41.190.63.255 zw 41.190.64.0 - 41.190.67.255 bj 41.190.68.0 - 41.190.71.255 gh 41.190.72.0 - 41.190.75.255 cg +41.190.76.0 - 41.190.79.255 ug 41.190.80.0 - 41.190.83.255 cd 41.190.84.0 - 41.190.87.255 na 41.190.88.0 - 41.190.91.255 gh 41.190.92.0 - 41.190.95.255 mw 41.190.96.0 - 41.190.127.255 na -41.190.128.0 - 41.190.159.255 ug +41.190.128.0 - 41.190.131.255 mu +41.190.132.0 - 41.190.135.255 ug +41.190.136.0 - 41.190.159.255 mu 41.190.160.0 - 41.190.191.255 mz -41.190.192.0 - 41.190.223.255 mw +41.190.192.0 - 41.190.223.255 ug 41.190.224.0 - 41.190.227.255 cm 41.190.228.0 - 41.190.231.255 ne -41.190.232.0 - 41.190.235.255 ke +41.190.232.0 - 41.190.235.255 cd 41.190.236.0 - 41.190.239.255 mg 41.190.240.0 - 41.190.243.255 ng 41.190.244.0 - 41.190.247.255 bw @@ -2988,40 +7172,55 @@ 41.191.96.0 - 41.191.99.255 gh 41.191.100.0 - 41.191.103.255 cm 41.191.104.0 - 41.191.107.255 lr -41.191.108.0 - 41.191.111.255 ng -41.191.112.0 - 41.191.115.255 za +41.191.110.0 - 41.191.110.255 ng 41.191.116.0 - 41.191.119.255 zm 41.191.120.0 - 41.191.123.255 sc 41.191.124.0 - 41.191.191.255 za 41.191.192.0 - 41.191.199.255 ke 41.191.200.0 - 41.191.207.255 ls -41.191.208.0 - 41.191.215.255 ug -41.191.216.0 - 41.191.231.255 ke +41.191.208.0 - 41.191.211.255 ng +41.191.212.0 - 41.191.215.255 mu +41.191.216.0 - 41.191.219.255 bw +41.191.220.0 - 41.191.223.255 gn +41.191.224.0 - 41.191.224.255 mu +41.191.225.0 - 41.191.226.255 ke +41.191.227.0 - 41.191.230.135 mu +41.191.230.136 - 41.191.230.139 ke +41.191.230.140 - 41.191.231.255 mu 41.191.232.0 - 41.191.239.255 zw 41.191.240.0 - 41.191.247.255 gh 41.191.248.0 - 41.191.251.255 sl 41.191.252.0 - 41.191.255.255 dz 41.192.0.0 - 41.193.255.255 za -41.194.0.0 - 41.194.3.255 sc -41.194.4.0 - 41.194.22.255 a2 -41.194.23.0 - 41.194.26.7 tz -41.194.26.8 - 41.194.31.255 a2 -41.194.32.0 - 41.194.32.254 km -41.194.32.255 - 41.194.37.255 a2 -41.194.38.0 - 41.194.38.127 tz -41.194.38.128 - 41.194.40.255 a2 -41.194.41.0 - 41.194.41.255 ne -41.194.42.0 - 41.194.48.255 a2 -41.194.49.0 - 41.194.49.255 ke -41.194.50.0 - 41.194.51.255 a2 +41.194.0.0 - 41.194.27.255 a2 +41.194.28.0 - 41.194.28.255 zm +41.194.29.0 - 41.194.32.255 a2 +41.194.33.0 - 41.194.33.255 km +41.194.34.0 - 41.194.51.255 a2 41.194.52.0 - 41.194.55.255 ng -41.194.56.0 - 41.194.255.255 a2 +41.194.56.0 - 41.194.59.255 a2 +41.194.60.0 - 41.194.63.255 cd +41.194.64.0 - 41.194.73.255 a2 +41.194.74.0 - 41.194.74.255 cg +41.194.75.0 - 41.194.76.255 a2 +41.194.77.0 - 41.194.77.255 us +41.194.78.0 - 41.194.255.255 a2 41.195.0.0 - 41.195.255.255 za 41.196.0.0 - 41.196.255.255 eg 41.197.0.0 - 41.197.255.255 rw -41.198.0.0 - 41.198.207.255 za +41.198.0.0 - 41.198.15.255 mu +41.198.16.0 - 41.198.31.255 na +41.198.32.0 - 41.198.47.255 mu +41.198.48.0 - 41.198.51.255 na +41.198.52.0 - 41.198.95.255 mu +41.198.96.0 - 41.198.96.255 ng +41.198.97.0 - 41.198.98.255 mu +41.198.99.0 - 41.198.99.255 ng +41.198.100.0 - 41.198.201.255 mu +41.198.202.0 - 41.198.202.255 ng +41.198.203.0 - 41.198.207.255 mu 41.198.208.0 - 41.198.223.255 ng -41.198.224.0 - 41.198.255.255 za +41.198.224.0 - 41.198.255.255 mu 41.199.0.0 - 41.199.255.255 eg 41.200.0.0 - 41.201.255.255 dz 41.202.0.0 - 41.202.31.255 gh @@ -3031,10 +7230,14 @@ 41.202.192.0 - 41.202.223.255 cm 41.202.224.0 - 41.202.255.255 ug 41.203.0.0 - 41.203.63.255 za -41.203.64.0 - 41.203.127.255 ng +41.203.64.0 - 41.203.78.255 ng +41.203.79.0 - 41.203.79.255 bj +41.203.80.0 - 41.203.127.255 ng 41.203.128.0 - 41.203.159.255 ne 41.203.160.0 - 41.203.175.255 za -41.203.176.0 - 41.203.191.255 ls +41.203.176.0 - 41.203.178.255 ls +41.203.179.0 - 41.203.179.255 za +41.203.180.0 - 41.203.191.255 ls 41.203.192.0 - 41.203.207.255 ml 41.203.208.0 - 41.203.223.255 ke 41.203.224.0 - 41.203.239.255 bf @@ -3058,26 +7261,37 @@ 41.206.0.0 - 41.206.31.255 ng 41.206.32.0 - 41.206.63.255 ke 41.206.64.0 - 41.206.95.255 ci -41.206.96.0 - 41.206.127.255 ga +41.206.96.0 - 41.206.100.255 mu +41.206.101.0 - 41.206.101.255 tz +41.206.102.0 - 41.206.102.255 za +41.206.103.0 - 41.206.127.255 mu 41.206.128.0 - 41.206.159.255 eg -41.206.160.0 - 41.206.164.255 ca -41.206.165.0 - 41.206.165.255 za -41.206.166.0 - 41.206.191.255 ca -41.206.192.0 - 41.206.223.255 za +41.206.160.0 - 41.206.223.255 za 41.206.224.0 - 41.206.255.255 ng 41.207.0.0 - 41.207.31.255 ci 41.207.32.0 - 41.207.63.255 mg -41.207.64.0 - 41.207.127.255 ke +41.207.64.0 - 41.207.120.255 ke +41.207.121.0 - 41.207.121.255 cg +41.207.122.0 - 41.207.124.255 ke +41.207.125.0 - 41.207.125.255 cg +41.207.126.0 - 41.207.127.255 ke 41.207.128.0 - 41.207.159.255 mu 41.207.160.0 - 41.207.191.255 tg 41.207.192.0 - 41.207.223.255 ci -41.207.224.0 - 41.208.63.255 za +41.207.224.0 - 41.207.227.255 ng +41.207.228.0 - 41.207.231.255 ao +41.207.232.0 - 41.207.235.255 mu +41.207.236.0 - 41.207.239.255 za +41.207.240.0 - 41.207.247.255 tz +41.207.248.0 - 41.207.251.255 ng +41.207.252.0 - 41.207.255.255 gh +41.208.0.0 - 41.208.63.255 za 41.208.64.0 - 41.208.127.255 ly 41.208.128.0 - 41.208.191.255 sn 41.208.192.0 - 41.208.255.255 za 41.209.0.0 - 41.209.63.255 ke 41.209.64.0 - 41.209.127.255 sd -41.209.128.0 - 41.209.191.255 dz +41.209.128.0 - 41.209.159.255 dz 41.209.192.0 - 41.209.255.255 eg 41.210.0.0 - 41.210.63.255 gh 41.210.64.0 - 41.210.127.255 dz @@ -3110,7 +7324,8 @@ 41.216.0.0 - 41.216.31.255 zm 41.216.32.0 - 41.216.63.255 bj 41.216.64.0 - 41.216.95.255 zm -41.216.96.0 - 41.216.127.255 rw +41.216.96.0 - 41.216.123.255 rw +41.216.124.0 - 41.216.127.255 zw 41.216.128.0 - 41.216.143.255 za 41.216.144.0 - 41.216.159.255 bf 41.216.160.0 - 41.216.175.255 ng @@ -3120,7 +7335,7 @@ 41.216.216.0 - 41.216.223.255 tz 41.216.224.0 - 41.216.227.255 ma 41.216.228.0 - 41.216.231.255 mw -41.216.232.0 - 41.216.235.255 ng +41.216.232.0 - 41.216.235.255 cm 41.216.236.0 - 41.216.239.255 ao 41.217.0.0 - 41.217.127.255 ng 41.217.128.0 - 41.217.159.255 cm @@ -3136,9 +7351,11 @@ 41.217.224.0 - 41.217.231.255 eg 41.217.232.0 - 41.217.239.255 ug 41.217.240.0 - 41.217.247.255 za -41.217.248.0 - 41.217.255.255 zm 41.218.0.0 - 41.218.63.255 sd -41.218.64.0 - 41.218.127.255 na +41.218.64.0 - 41.218.79.255 na +41.218.80.0 - 41.218.87.255 zm +41.218.88.0 - 41.218.111.255 na +41.218.112.0 - 41.218.127.255 ao 41.218.128.0 - 41.218.191.255 eg 41.218.192.0 - 41.218.255.255 gh 41.219.0.0 - 41.219.63.255 sn @@ -3148,8 +7365,7 @@ 41.220.16.0 - 41.220.31.255 zw 41.220.32.0 - 41.220.47.255 mz 41.220.48.0 - 41.220.63.255 gh -41.220.64.0 - 41.220.79.255 ng -41.220.80.0 - 41.220.95.255 sl +41.220.64.0 - 41.220.95.255 ng 41.220.96.0 - 41.220.111.255 sc 41.220.112.0 - 41.220.127.255 ke 41.220.128.0 - 41.220.143.255 tz @@ -3158,8 +7374,13 @@ 41.220.176.0 - 41.220.191.255 tz 41.220.192.0 - 41.220.207.255 mz 41.220.208.0 - 41.220.223.255 ug -41.220.224.0 - 41.220.239.255 ke -41.220.240.0 - 41.220.255.255 tz +41.220.224.0 - 41.220.228.115 mu +41.220.228.116 - 41.220.228.119 ke +41.220.228.120 - 41.220.236.7 mu +41.220.236.8 - 41.220.239.11 ke +41.220.239.12 - 41.220.239.255 mu +41.220.240.0 - 41.220.240.255 ke +41.220.241.0 - 41.220.255.255 mu 41.221.0.0 - 41.221.15.255 za 41.221.16.0 - 41.221.31.255 dz 41.221.32.0 - 41.221.63.255 tz @@ -3172,8 +7393,7 @@ 41.221.160.0 - 41.221.175.255 ng 41.221.176.0 - 41.221.191.255 ml 41.221.192.0 - 41.221.207.255 cv -41.221.208.0 - 41.221.223.255 gh -41.221.224.0 - 41.221.239.255 za +41.221.208.0 - 41.221.239.255 za 41.221.240.0 - 41.221.255.255 ao 41.222.0.0 - 41.222.7.255 ug 41.222.8.0 - 41.222.15.255 ke @@ -3183,23 +7403,26 @@ 41.222.40.0 - 41.222.47.255 ng 41.222.48.0 - 41.222.55.255 za 41.222.56.0 - 41.222.63.255 tz -41.222.64.0 - 41.222.79.255 ng -41.222.80.0 - 41.222.87.255 mz +41.222.64.0 - 41.222.71.255 ng +41.222.72.0 - 41.222.75.255 ss +41.222.76.0 - 41.222.79.255 ng +41.222.80.0 - 41.222.87.255 sl 41.222.88.0 - 41.222.95.255 tz 41.222.96.0 - 41.222.103.255 mu 41.222.104.0 - 41.222.111.255 za 41.222.112.0 - 41.222.119.255 gq -41.222.120.0 - 41.222.127.255 ke +41.222.120.0 - 41.222.127.255 za 41.222.128.0 - 41.222.135.255 eg 41.222.136.0 - 41.222.143.255 za 41.222.144.0 - 41.222.151.255 ng -41.222.152.0 - 41.222.159.255 tz +41.222.152.0 - 41.222.159.255 za 41.222.160.0 - 41.222.167.255 ke 41.222.168.0 - 41.222.175.255 eg 41.222.176.0 - 41.222.183.255 tz 41.222.184.0 - 41.222.191.255 mw 41.222.192.0 - 41.222.195.255 bj 41.222.196.0 - 41.222.199.255 cd +41.222.200.0 - 41.222.203.255 ao 41.222.204.0 - 41.222.207.255 sc 41.222.208.0 - 41.222.211.255 ng 41.222.212.0 - 41.222.215.255 za @@ -3209,18 +7432,18 @@ 41.222.236.0 - 41.222.239.255 ao 41.222.240.0 - 41.222.243.255 zm 41.222.244.0 - 41.222.247.255 rw -41.222.248.0 - 41.223.3.255 ao +41.222.248.0 - 41.222.255.255 ao 41.223.4.0 - 41.223.7.255 tz 41.223.8.0 - 41.223.11.255 za -41.223.12.0 - 41.223.15.255 bw +41.223.12.0 - 41.223.15.255 bi 41.223.16.0 - 41.223.19.255 tz 41.223.20.0 - 41.223.23.255 eg -41.223.24.0 - 41.223.27.255 ng +41.223.24.0 - 41.223.27.255 za 41.223.28.0 - 41.223.31.255 cm 41.223.32.0 - 41.223.39.255 za 41.223.40.0 - 41.223.43.255 ao -41.223.44.0 - 41.223.47.255 lr -41.223.48.0 - 41.223.51.255 ke +41.223.44.0 - 41.223.47.255 ng +41.223.48.0 - 41.223.51.255 gn 41.223.52.0 - 41.223.55.255 eg 41.223.56.0 - 41.223.59.255 ke 41.223.60.0 - 41.223.63.255 za @@ -3230,12 +7453,13 @@ 41.223.76.0 - 41.223.79.255 mu 41.223.80.0 - 41.223.83.255 na 41.223.84.0 - 41.223.87.255 ug -41.223.88.0 - 41.223.91.255 sl -41.223.92.0 - 41.223.99.255 ga +41.223.88.0 - 41.223.91.255 cg +41.223.92.0 - 41.223.95.255 cm +41.223.96.0 - 41.223.99.255 mr 41.223.100.0 - 41.223.103.255 ao 41.223.104.0 - 41.223.107.255 cd -41.223.108.0 - 41.223.111.255 ke -41.223.112.0 - 41.223.115.255 za +41.223.108.0 - 41.223.111.255 so +41.223.112.0 - 41.223.115.255 ke 41.223.116.0 - 41.223.119.255 zm 41.223.120.0 - 41.223.123.255 za 41.223.124.0 - 41.223.127.255 mz @@ -3249,29 +7473,61 @@ 41.223.156.0 - 41.223.159.255 ao 41.223.160.0 - 41.223.163.255 sd 41.223.164.0 - 41.223.167.255 ao -41.223.168.0 - 41.223.171.255 ng +41.223.168.0 - 41.223.171.255 ga 41.223.172.0 - 41.223.175.255 za 41.223.176.0 - 41.223.179.255 dz 41.223.180.0 - 41.223.183.255 tz 41.223.184.0 - 41.223.187.255 cf 41.223.188.0 - 41.223.191.255 cg -41.223.192.0 - 41.223.195.255 ng +41.223.192.0 - 41.223.195.255 bw 41.223.196.0 - 41.223.199.255 eg 41.223.200.0 - 41.223.203.255 sd 41.223.204.0 - 41.223.207.255 sc 41.223.208.0 - 41.223.211.255 ci 41.223.212.0 - 41.223.215.255 gm 41.223.216.0 - 41.223.219.255 sc -41.223.220.0 - 41.223.223.255 mu -41.223.224.0 - 41.223.227.255 rw +41.223.220.0 - 41.223.227.255 mu 41.223.228.0 - 41.223.231.255 tz 41.223.232.0 - 41.223.235.255 bf +41.223.236.0 - 41.223.239.255 dz 41.223.240.0 - 41.223.243.255 eg 41.223.244.0 - 41.223.247.255 za 41.223.248.0 - 41.223.251.255 bj +41.223.252.0 - 41.223.255.255 za 41.224.0.0 - 41.231.255.255 tn 41.232.0.0 - 41.239.255.255 eg -41.240.0.0 - 41.247.255.255 za +41.240.0.0 - 41.241.255.255 sd +41.242.0.0 - 41.242.7.255 ke +41.242.8.0 - 41.242.11.255 tz +41.242.12.0 - 41.242.31.255 ly +41.242.32.0 - 41.242.39.255 ci +41.242.40.0 - 41.242.47.255 za +41.242.48.0 - 41.242.79.255 ng +41.242.80.0 - 41.242.83.255 za +41.242.84.0 - 41.242.87.255 cd +41.242.88.0 - 41.242.91.255 gn +41.242.92.0 - 41.242.95.255 ng +41.242.96.0 - 41.242.111.255 mg +41.242.112.0 - 41.242.115.255 gh +41.242.116.0 - 41.242.119.255 yt +41.242.120.0 - 41.242.123.255 za +41.242.124.0 - 41.242.127.255 re +41.242.128.0 - 41.242.131.255 cd +41.242.132.0 - 41.242.135.255 za +41.242.136.0 - 41.242.139.255 gh +41.242.140.0 - 41.242.143.255 rw +41.242.144.0 - 41.242.150.127 mu +41.242.150.128 - 41.242.150.255 za +41.242.151.0 - 41.242.151.255 mu +41.242.152.0 - 41.242.159.255 ly +41.242.160.0 - 41.242.175.255 za +41.242.176.0 - 41.242.191.255 bj +41.242.192.0 - 41.242.255.255 za +41.243.0.0 - 41.243.1.255 cd +41.243.2.0 - 41.243.2.255 za +41.243.3.0 - 41.243.255.255 cd +41.244.0.0 - 41.244.255.255 cm +41.245.0.0 - 41.247.255.255 za 41.248.0.0 - 41.251.255.255 ma 41.252.0.0 - 41.255.255.255 ly 42.0.0.0 - 42.0.3.255 cn @@ -3288,7 +7544,9 @@ 42.4.0.0 - 42.7.255.255 cn 42.8.0.0 - 42.47.255.255 kr 42.48.0.0 - 42.59.255.255 cn -42.60.0.0 - 42.61.255.255 sg +42.60.0.0 - 42.61.7.245 sg +42.61.7.246 - 42.61.7.246 ap +42.61.7.247 - 42.61.255.255 sg 42.62.0.0 - 42.62.175.255 cn 42.62.176.0 - 42.62.179.255 id 42.62.180.0 - 42.62.191.255 cn @@ -3309,7 +7567,17 @@ 42.99.0.0 - 42.99.115.255 cn 42.99.116.0 - 42.99.119.255 bd 42.99.120.0 - 42.99.127.255 cn -42.99.128.0 - 42.99.255.255 jp +42.99.128.0 - 42.99.131.55 jp +42.99.131.56 - 42.99.131.63 hk +42.99.131.64 - 42.99.137.255 jp +42.99.138.0 - 42.99.138.127 hk +42.99.138.128 - 42.99.149.31 jp +42.99.149.32 - 42.99.149.47 in +42.99.149.48 - 42.99.163.255 jp +42.99.164.0 - 42.99.164.90 sg +42.99.164.91 - 42.99.164.91 id +42.99.164.92 - 42.99.164.255 sg +42.99.165.0 - 42.99.255.255 jp 42.100.0.0 - 42.103.255.255 cn 42.104.0.0 - 42.111.255.255 in 42.112.0.0 - 42.119.255.255 vn @@ -3333,27 +7601,1981 @@ 42.202.0.0 - 42.240.255.255 cn 42.241.0.0 - 42.241.255.255 au 42.242.0.0 - 42.255.255.255 cn -43.0.0.0 - 43.255.255.255 jp -44.0.0.0 - 45.255.255.255 us +43.0.0.0 - 43.223.255.255 jp +43.224.0.0 - 43.224.3.255 in +43.224.4.0 - 43.224.7.255 hk +43.224.8.0 - 43.224.11.255 in +43.224.12.0 - 43.224.15.255 cn +43.224.16.0 - 43.224.19.255 id +43.224.20.0 - 43.224.23.255 tw +43.224.24.0 - 43.224.27.255 cn +43.224.28.0 - 43.224.31.255 hk +43.224.32.0 - 43.224.35.255 jp +43.224.36.0 - 43.224.39.255 la +43.224.40.0 - 43.224.43.255 mm +43.224.44.0 - 43.224.47.255 cn +43.224.48.0 - 43.224.51.255 hk +43.224.52.0 - 43.224.59.255 cn +43.224.60.0 - 43.224.63.255 au +43.224.64.0 - 43.224.75.255 cn +43.224.76.0 - 43.224.79.255 au +43.224.80.0 - 43.224.83.255 cn +43.224.84.0 - 43.224.87.255 mm +43.224.88.0 - 43.224.91.255 mo +43.224.92.0 - 43.224.95.255 hk +43.224.96.0 - 43.224.99.255 in +43.224.100.0 - 43.224.103.255 cn +43.224.104.0 - 43.224.107.255 kr +43.224.108.0 - 43.224.119.255 bd +43.224.120.0 - 43.224.123.255 nz +43.224.124.0 - 43.224.127.255 lk +43.224.128.0 - 43.224.143.255 in +43.224.144.0 - 43.224.147.255 cn +43.224.148.0 - 43.224.151.255 hk +43.224.152.0 - 43.224.155.255 sg +43.224.156.0 - 43.224.159.255 in +43.224.160.0 - 43.224.163.255 cn +43.224.164.0 - 43.224.167.255 in +43.224.168.0 - 43.224.171.255 id +43.224.172.0 - 43.224.175.255 in +43.224.176.0 - 43.224.179.255 cn +43.224.180.0 - 43.224.183.255 in +43.224.184.0 - 43.224.187.255 cn +43.224.188.0 - 43.224.191.255 nz +43.224.192.0 - 43.224.195.255 nc +43.224.196.0 - 43.224.199.255 hk +43.224.200.0 - 43.224.219.255 cn +43.224.220.0 - 43.224.223.255 in +43.224.224.0 - 43.224.227.255 cn +43.224.228.0 - 43.224.235.255 hk +43.224.236.0 - 43.224.239.255 pk +43.224.240.0 - 43.224.243.255 cn +43.224.244.0 - 43.224.247.255 hk +43.224.248.0 - 43.224.249.255 tw +43.224.250.0 - 43.224.251.255 nz +43.224.252.0 - 43.225.3.255 in +43.225.4.0 - 43.225.7.255 sg +43.225.8.0 - 43.225.11.255 hk +43.225.12.0 - 43.225.15.255 au +43.225.16.0 - 43.225.27.255 in +43.225.28.0 - 43.225.31.255 hk +43.225.32.0 - 43.225.35.255 au +43.225.36.0 - 43.225.39.255 my +43.225.40.0 - 43.225.43.255 bn +43.225.44.0 - 43.225.47.255 hk +43.225.48.0 - 43.225.48.255 au +43.225.49.0 - 43.225.49.0 nz +43.225.49.1 - 43.225.51.255 au +43.225.52.0 - 43.225.55.255 in +43.225.56.0 - 43.225.59.255 hk +43.225.60.0 - 43.225.63.255 au +43.225.64.0 - 43.225.67.255 id +43.225.68.0 - 43.225.75.255 in +43.225.76.0 - 43.225.79.255 cn +43.225.80.0 - 43.225.83.255 in +43.225.84.0 - 43.225.87.255 cn +43.225.88.0 - 43.225.91.255 jp +43.225.92.0 - 43.225.95.255 in +43.225.96.0 - 43.225.99.255 pk +43.225.100.0 - 43.225.107.255 hk +43.225.108.0 - 43.225.111.255 my +43.225.112.0 - 43.225.115.255 au +43.225.116.0 - 43.225.119.255 in +43.225.120.0 - 43.225.127.255 cn +43.225.128.0 - 43.225.131.255 au +43.225.132.0 - 43.225.135.255 hk +43.225.136.0 - 43.225.139.255 bn +43.225.140.0 - 43.225.143.255 cn +43.225.144.0 - 43.225.147.255 au +43.225.148.0 - 43.225.151.255 bd +43.225.152.0 - 43.225.155.255 sg +43.225.160.0 - 43.225.171.255 in +43.225.172.0 - 43.225.175.255 cn +43.225.176.0 - 43.225.179.255 au +43.225.180.0 - 43.225.187.255 cn +43.225.188.0 - 43.225.195.255 in +43.225.196.0 - 43.225.199.255 hk +43.225.200.0 - 43.225.203.255 nz +43.225.204.0 - 43.225.207.255 bd +43.225.208.0 - 43.225.211.255 cn +43.225.212.0 - 43.225.215.255 in +43.225.216.0 - 43.225.247.255 cn +43.225.248.0 - 43.225.251.255 in +43.225.252.0 - 43.225.255.255 cn +43.226.0.0 - 43.226.1.255 au +43.226.2.0 - 43.226.3.255 in +43.226.4.0 - 43.226.7.255 ph +43.226.8.0 - 43.226.11.255 nz +43.226.12.0 - 43.226.15.255 kh +43.226.16.0 - 43.226.23.255 hk +43.226.24.0 - 43.226.31.255 in +43.226.32.0 - 43.226.123.255 cn +43.226.124.0 - 43.226.127.255 hk +43.226.128.0 - 43.226.215.255 cn +43.226.216.0 - 43.226.219.255 nz +43.226.220.0 - 43.226.223.255 mv +43.226.224.0 - 43.226.227.255 my +43.226.228.0 - 43.226.228.127 kr +43.226.228.128 - 43.226.228.255 jp +43.226.229.0 - 43.226.229.255 au +43.226.230.0 - 43.226.231.255 us +43.226.236.0 - 43.227.11.255 cn +43.227.12.0 - 43.227.15.255 hk +43.227.16.0 - 43.227.23.255 in +43.227.24.0 - 43.227.27.255 tw +43.227.28.0 - 43.227.107.255 cn +43.227.108.0 - 43.227.111.255 au +43.227.112.0 - 43.227.115.255 hk +43.227.116.0 - 43.227.123.255 kr +43.227.124.0 - 43.227.127.255 au +43.227.128.0 - 43.227.135.255 in +43.227.136.0 - 43.227.147.255 cn +43.227.148.0 - 43.227.151.255 id +43.227.152.0 - 43.227.183.255 cn +43.227.184.0 - 43.227.187.255 in +43.227.188.0 - 43.227.223.255 cn +43.227.224.0 - 43.227.227.255 in +43.227.228.0 - 43.227.231.255 sg +43.227.232.0 - 43.227.235.255 cn +43.227.236.0 - 43.227.239.255 hk +43.227.240.0 - 43.227.243.255 sg +43.227.244.0 - 43.227.247.255 in +43.227.248.0 - 43.228.71.255 cn +43.228.72.0 - 43.228.75.255 in +43.228.76.0 - 43.228.79.255 cn +43.228.80.0 - 43.228.83.255 th +43.228.84.0 - 43.228.87.255 la +43.228.88.0 - 43.228.91.255 hk +43.228.92.0 - 43.228.99.255 in +43.228.100.0 - 43.228.103.255 cn +43.228.104.0 - 43.228.107.255 jp +43.228.108.0 - 43.228.111.255 lk +43.228.112.0 - 43.228.115.255 in +43.228.116.0 - 43.228.123.255 cn +43.228.124.0 - 43.228.127.255 hk +43.228.128.0 - 43.228.131.255 mn +43.228.132.0 - 43.228.139.255 cn +43.228.140.0 - 43.228.147.255 in +43.228.148.0 - 43.228.155.255 cn +43.228.156.0 - 43.228.156.127 nz +43.228.156.128 - 43.228.156.255 pk +43.228.157.0 - 43.228.157.255 sg +43.228.158.0 - 43.228.158.127 my +43.228.158.128 - 43.228.158.255 bn +43.228.159.0 - 43.228.159.127 au +43.228.159.128 - 43.228.159.255 pk +43.228.160.0 - 43.228.163.255 kr +43.228.168.0 - 43.228.179.255 in +43.228.180.0 - 43.228.183.255 cn +43.228.184.0 - 43.228.187.255 us +43.228.188.0 - 43.228.191.255 cn +43.228.192.0 - 43.228.195.255 np +43.228.196.0 - 43.228.199.255 th +43.228.200.0 - 43.228.203.255 hk +43.228.204.0 - 43.228.207.255 cn +43.228.208.0 - 43.228.211.255 bd +43.228.212.0 - 43.228.215.255 sg +43.228.216.0 - 43.228.219.255 hk +43.228.220.0 - 43.228.231.255 in +43.228.232.0 - 43.228.235.255 sg +43.228.236.0 - 43.228.239.255 in +43.228.240.0 - 43.228.243.255 cn +43.228.248.0 - 43.228.255.255 my +43.229.0.0 - 43.229.3.255 in +43.229.4.0 - 43.229.7.255 hk +43.229.8.0 - 43.229.11.255 in +43.229.12.0 - 43.229.15.255 bd +43.229.16.0 - 43.229.19.255 cn +43.229.20.0 - 43.229.23.255 id +43.229.24.0 - 43.229.27.255 in +43.229.28.0 - 43.229.31.255 hk +43.229.32.0 - 43.229.35.255 jp +43.229.36.0 - 43.229.39.255 hk +43.229.40.0 - 43.229.43.255 cn +43.229.44.0 - 43.229.47.255 th +43.229.48.0 - 43.229.51.255 cn +43.229.52.0 - 43.229.55.255 hk +43.229.56.0 - 43.229.59.255 cn +43.229.60.0 - 43.229.67.255 au +43.229.72.0 - 43.229.75.255 in +43.229.76.0 - 43.229.79.255 th +43.229.80.0 - 43.229.83.255 in +43.229.84.0 - 43.229.87.255 sg +43.229.88.0 - 43.229.95.255 in +43.229.96.0 - 43.229.99.255 cn +43.229.100.0 - 43.229.107.255 in +43.229.108.0 - 43.229.111.255 cn +43.229.112.0 - 43.229.119.255 hk +43.229.120.0 - 43.229.123.255 cn +43.229.124.0 - 43.229.127.255 jp +43.229.128.0 - 43.229.131.255 sg +43.229.132.0 - 43.229.135.255 th +43.229.136.0 - 43.229.147.255 cn +43.229.148.0 - 43.229.151.255 th +43.229.152.0 - 43.229.155.255 hk +43.229.156.0 - 43.229.159.255 sg +43.229.160.0 - 43.229.163.255 in +43.229.168.0 - 43.229.199.255 cn +43.229.200.0 - 43.229.203.255 in +43.229.204.0 - 43.229.207.255 id +43.229.208.0 - 43.229.211.255 bd +43.229.212.0 - 43.229.215.255 hk +43.229.216.0 - 43.229.223.255 cn +43.229.224.0 - 43.229.227.255 in +43.229.228.0 - 43.229.231.255 np +43.229.232.0 - 43.229.239.255 cn +43.229.240.0 - 43.229.247.255 jp +43.229.248.0 - 43.229.255.255 id +43.230.0.0 - 43.230.3.255 kr +43.230.4.0 - 43.230.5.255 id +43.230.6.0 - 43.230.6.255 nr +43.230.7.0 - 43.230.7.255 id +43.230.8.0 - 43.230.8.255 hk +43.230.9.0 - 43.230.9.255 kr +43.230.10.0 - 43.230.10.255 jp +43.230.11.0 - 43.230.11.255 ph +43.230.12.0 - 43.230.19.255 hk +43.230.20.0 - 43.230.23.255 cn +43.230.24.0 - 43.230.26.255 sg +43.230.27.0 - 43.230.27.255 th +43.230.28.0 - 43.230.31.255 jp +43.230.32.0 - 43.230.35.255 cn +43.230.36.0 - 43.230.47.255 in +43.230.48.0 - 43.230.51.255 au +43.230.52.0 - 43.230.59.255 jp +43.230.60.0 - 43.230.63.255 bd +43.230.64.0 - 43.230.67.255 au +43.230.68.0 - 43.230.75.255 cn +43.230.76.0 - 43.230.83.255 kr +43.230.84.0 - 43.230.87.255 cn +43.230.88.0 - 43.230.91.255 hk +43.230.92.0 - 43.230.95.255 pk +43.230.96.0 - 43.230.99.255 hk +43.230.100.0 - 43.230.103.255 au +43.230.104.0 - 43.230.107.255 in +43.230.108.0 - 43.230.111.255 au +43.230.112.0 - 43.230.119.255 hk +43.230.120.0 - 43.230.123.255 bd +43.230.124.0 - 43.230.127.255 cn +43.230.128.0 - 43.230.131.255 id +43.230.132.0 - 43.230.135.255 in +43.230.136.0 - 43.230.139.255 cn +43.230.140.0 - 43.230.147.255 hk +43.230.148.0 - 43.230.151.255 in +43.230.152.0 - 43.230.155.255 id +43.230.156.0 - 43.230.163.255 in +43.230.164.0 - 43.230.167.255 hk +43.230.172.0 - 43.230.175.255 in +43.230.176.0 - 43.230.179.255 au +43.230.180.0 - 43.230.183.255 sg +43.230.184.0 - 43.230.187.255 in +43.230.188.0 - 43.230.191.255 hk +43.230.192.0 - 43.230.195.255 kh +43.230.196.0 - 43.230.203.255 in +43.230.204.0 - 43.230.207.255 hk +43.230.208.0 - 43.230.211.255 jp +43.230.212.0 - 43.230.215.255 in +43.230.216.0 - 43.230.219.255 kr +43.230.220.0 - 43.230.255.255 cn +43.231.0.0 - 43.231.3.255 hk +43.231.4.0 - 43.231.7.255 my +43.231.8.0 - 43.231.11.255 hk +43.231.12.0 - 43.231.15.255 sg +43.231.16.0 - 43.231.19.255 hk +43.231.20.0 - 43.231.23.255 bd +43.231.24.0 - 43.231.27.255 au +43.231.28.0 - 43.231.31.255 mv +43.231.32.0 - 43.231.47.255 cn +43.231.48.0 - 43.231.59.255 in +43.231.60.0 - 43.231.63.255 pk +43.231.64.0 - 43.231.67.255 kh +43.231.68.0 - 43.231.71.255 au +43.231.72.0 - 43.231.75.255 my +43.231.76.0 - 43.231.79.255 bd +43.231.80.0 - 43.231.111.255 cn +43.231.112.0 - 43.231.115.255 mn +43.231.116.0 - 43.231.127.255 in +43.231.128.0 - 43.231.129.255 id +43.231.130.0 - 43.231.130.255 sg +43.231.131.0 - 43.231.131.255 af +43.231.132.0 - 43.231.135.255 in +43.231.136.0 - 43.231.183.255 cn +43.231.184.0 - 43.231.187.255 hk +43.231.188.0 - 43.231.191.255 jp +43.231.192.0 - 43.231.195.255 nz +43.231.196.0 - 43.231.199.255 hk +43.231.200.0 - 43.231.203.255 au +43.231.208.0 - 43.231.211.255 np +43.231.212.0 - 43.231.219.255 in +43.231.220.0 - 43.231.223.255 jp +43.231.224.0 - 43.231.227.255 my +43.231.228.0 - 43.231.231.255 ph +43.231.232.0 - 43.231.243.255 in +43.231.244.0 - 43.231.247.255 jp +43.231.248.0 - 43.231.255.255 in +43.232.0.0 - 43.235.255.255 jp +43.236.0.0 - 43.239.51.255 cn +43.239.52.0 - 43.239.63.255 in +43.239.64.0 - 43.239.67.255 hk +43.239.68.0 - 43.239.71.255 in +43.239.72.0 - 43.239.75.255 bd +43.239.76.0 - 43.239.83.255 in +43.239.84.0 - 43.239.87.255 hk +43.239.88.0 - 43.239.88.255 in +43.239.89.0 - 43.239.89.255 hk +43.239.90.0 - 43.239.91.255 in +43.239.92.0 - 43.239.99.255 nz +43.239.100.0 - 43.239.103.255 sg +43.239.104.0 - 43.239.107.255 jp +43.239.108.0 - 43.239.115.255 in +43.239.116.0 - 43.239.123.255 cn +43.239.124.0 - 43.239.135.255 in +43.239.136.0 - 43.239.139.255 au +43.239.140.0 - 43.239.140.255 nl +43.239.141.0 - 43.239.141.255 fr +43.239.142.0 - 43.239.142.255 nl +43.239.143.0 - 43.239.143.255 fr +43.239.144.0 - 43.239.147.255 in +43.239.148.0 - 43.239.151.255 vn +43.239.152.0 - 43.239.155.255 in +43.239.156.0 - 43.239.167.255 hk +43.239.168.0 - 43.239.171.255 in +43.239.172.0 - 43.239.179.255 cn +43.239.180.0 - 43.239.183.255 nz +43.239.184.0 - 43.239.191.255 vn +43.239.192.0 - 43.239.219.255 in +43.239.220.0 - 43.239.227.255 vn +43.239.228.0 - 43.239.231.255 in +43.239.232.0 - 43.239.232.255 hk +43.239.233.0 - 43.239.235.255 my +43.239.236.0 - 43.239.247.255 in +43.239.248.0 - 43.239.250.255 us +43.239.251.0 - 43.239.251.255 nz +43.239.252.0 - 43.239.255.255 my +43.240.0.0 - 43.240.3.255 cn +43.240.4.0 - 43.240.11.255 in +43.240.12.0 - 43.240.19.255 hk +43.240.20.0 - 43.240.23.255 my +43.240.24.0 - 43.240.27.255 tw +43.240.28.0 - 43.240.31.255 hk +43.240.32.0 - 43.240.35.255 nz +43.240.36.0 - 43.240.39.255 hk +43.240.40.0 - 43.240.43.255 au +43.240.44.0 - 43.240.47.255 tw +43.240.48.0 - 43.240.51.255 cn +43.240.52.0 - 43.240.55.255 bd +43.240.56.0 - 43.240.63.255 cn +43.240.64.0 - 43.240.67.255 in +43.240.68.0 - 43.240.79.255 cn +43.240.80.0 - 43.240.83.255 id +43.240.84.0 - 43.240.87.255 cn +43.240.88.0 - 43.240.91.255 gu +43.240.92.0 - 43.240.95.255 hk +43.240.96.0 - 43.240.99.255 au +43.240.100.0 - 43.240.103.255 bd +43.240.104.0 - 43.240.111.255 tw +43.240.112.0 - 43.240.115.255 in +43.240.116.0 - 43.240.119.255 hk +43.240.120.0 - 43.240.123.255 au +43.240.124.0 - 43.240.139.255 cn +43.240.140.0 - 43.240.143.255 vu +43.240.144.0 - 43.240.147.255 au +43.240.148.0 - 43.240.151.255 id +43.240.152.0 - 43.240.155.255 tw +43.240.156.0 - 43.240.223.255 cn +43.240.224.0 - 43.240.231.255 id +43.240.232.0 - 43.240.235.255 au +43.240.236.0 - 43.241.23.255 cn +43.241.24.0 - 43.241.31.255 in +43.241.32.0 - 43.241.35.255 tw +43.241.36.0 - 43.241.39.255 in +43.241.40.0 - 43.241.40.255 my +43.241.41.0 - 43.241.43.255 in +43.241.44.0 - 43.241.44.255 kr +43.241.45.0 - 43.241.47.255 hk +43.241.48.0 - 43.241.51.255 cn +43.241.52.0 - 43.241.55.255 au +43.241.56.0 - 43.241.59.255 th +43.241.60.0 - 43.241.71.255 in +43.241.72.0 - 43.241.75.255 hk +43.241.76.0 - 43.241.95.255 cn +43.241.96.0 - 43.241.99.255 my +43.241.100.0 - 43.241.103.255 hk +43.241.104.0 - 43.241.111.255 kr +43.241.112.0 - 43.241.115.255 cn +43.241.116.0 - 43.241.135.255 in +43.241.136.0 - 43.241.139.255 bt +43.241.140.0 - 43.241.151.255 in +43.241.152.0 - 43.241.159.255 hk +43.241.160.0 - 43.241.163.255 tw +43.241.164.0 - 43.241.167.255 ws +43.241.168.0 - 43.241.187.255 cn +43.241.188.0 - 43.241.191.255 au +43.241.192.0 - 43.241.195.255 in +43.241.196.0 - 43.241.199.255 hk +43.241.200.0 - 43.241.203.255 au +43.241.204.0 - 43.241.207.255 hk +43.241.208.0 - 43.241.243.255 cn +43.241.244.0 - 43.241.247.255 in +43.241.248.0 - 43.241.255.255 cn +43.242.4.0 - 43.242.7.255 sg +43.242.8.0 - 43.242.31.255 cn +43.242.32.0 - 43.242.35.255 hk +43.242.36.0 - 43.242.39.255 in +43.242.40.0 - 43.242.43.255 au +43.242.44.0 - 43.242.67.255 cn +43.242.68.0 - 43.242.71.255 au +43.242.72.0 - 43.242.99.255 cn +43.242.100.0 - 43.242.103.255 pk +43.242.104.0 - 43.242.107.255 in +43.242.108.0 - 43.242.111.255 hk +43.242.112.0 - 43.242.115.255 kr +43.242.116.0 - 43.242.127.255 in +43.242.128.0 - 43.242.131.255 hk +43.242.136.0 - 43.242.139.255 jp +43.242.140.0 - 43.242.143.255 hk +43.242.144.0 - 43.242.171.255 cn +43.242.172.0 - 43.242.175.255 hk +43.242.176.0 - 43.242.179.255 pk +43.242.180.0 - 43.242.183.255 cn +43.242.184.0 - 43.242.187.255 sg +43.242.188.0 - 43.242.199.255 cn +43.242.200.0 - 43.242.203.255 hk +43.242.204.0 - 43.242.207.255 cn +43.242.208.0 - 43.242.215.255 in +43.242.216.0 - 43.242.223.255 cn +43.242.224.0 - 43.242.231.255 in +43.242.232.0 - 43.242.239.255 hk +43.242.240.0 - 43.242.243.255 mn +43.242.244.0 - 43.242.247.255 in +43.242.252.0 - 43.242.255.255 cn +43.243.0.0 - 43.243.3.255 au +43.243.4.0 - 43.243.19.255 cn +43.243.20.0 - 43.243.20.255 au +43.243.21.0 - 43.243.23.255 nz +43.243.24.0 - 43.243.27.255 cn +43.243.28.0 - 43.243.35.255 hk +43.243.36.0 - 43.243.39.255 in +43.243.40.0 - 43.243.41.255 hk +43.243.42.0 - 43.243.43.255 gb +43.243.44.0 - 43.243.55.255 hk +43.243.56.0 - 43.243.63.255 nz +43.243.64.0 - 43.243.75.255 hk +43.243.76.0 - 43.243.87.255 in +43.243.88.0 - 43.243.91.255 cn +43.243.92.0 - 43.243.95.255 hk +43.243.96.0 - 43.243.99.255 np +43.243.100.0 - 43.243.115.255 hk +43.243.116.0 - 43.243.119.255 au +43.243.120.0 - 43.243.123.255 hk +43.243.124.0 - 43.243.127.255 ph +43.243.128.0 - 43.243.131.255 cn +43.243.132.0 - 43.243.135.255 bd +43.243.136.0 - 43.243.139.255 cn +43.243.140.0 - 43.243.143.255 id +43.243.144.0 - 43.243.151.255 cn +43.243.152.0 - 43.243.155.255 id +43.243.156.0 - 43.243.159.255 cn +43.243.160.0 - 43.243.163.255 mn +43.243.164.0 - 43.243.167.255 hk +43.243.168.0 - 43.243.171.255 cn +43.243.172.0 - 43.243.175.255 in +43.243.176.0 - 43.243.179.255 hk +43.243.180.0 - 43.243.183.255 cn +43.243.184.0 - 43.243.187.255 id +43.243.188.0 - 43.243.191.255 cn +43.243.192.0 - 43.243.195.255 hk +43.243.196.0 - 43.243.199.255 nz +43.243.200.0 - 43.243.203.255 au +43.243.204.0 - 43.243.207.255 bd +43.243.208.0 - 43.243.211.255 hk +43.243.212.0 - 43.243.215.255 in +43.243.216.0 - 43.243.219.255 kr +43.243.220.0 - 43.243.227.255 hk +43.243.228.0 - 43.243.235.255 cn +43.243.236.0 - 43.243.239.255 au +43.243.240.0 - 43.243.243.255 hk +43.243.244.0 - 43.243.247.255 cn +43.243.248.0 - 43.243.251.255 hk +43.243.252.0 - 43.243.255.255 tw +43.244.0.0 - 43.244.255.255 jp +43.245.0.0 - 43.245.7.255 in +43.245.8.0 - 43.245.11.255 pk +43.245.12.0 - 43.245.15.255 in +43.245.16.0 - 43.245.19.255 sg +43.245.20.0 - 43.245.23.255 in +43.245.24.0 - 43.245.31.255 au +43.245.32.0 - 43.245.35.255 kh +43.245.36.0 - 43.245.43.255 au +43.245.44.0 - 43.245.47.255 mm +43.245.48.0 - 43.245.48.255 au +43.245.49.0 - 43.245.49.255 sg +43.245.50.0 - 43.245.51.255 hk +43.245.52.0 - 43.245.55.255 nz +43.245.56.0 - 43.245.59.255 fj +43.245.60.0 - 43.245.61.223 sg +43.245.61.224 - 43.245.61.255 my +43.245.62.0 - 43.245.62.255 sg +43.245.63.0 - 43.245.63.255 hk +43.245.64.0 - 43.245.79.255 au +43.245.80.0 - 43.245.83.255 nz +43.245.84.0 - 43.245.87.255 np +43.245.88.0 - 43.245.91.255 in +43.245.92.0 - 43.245.95.255 np +43.245.96.0 - 43.245.99.255 sg +43.245.100.0 - 43.245.103.255 in +43.245.104.0 - 43.245.111.255 sg +43.245.112.0 - 43.245.115.255 au +43.245.116.0 - 43.245.119.255 bd +43.245.120.0 - 43.245.123.255 au +43.245.124.0 - 43.245.127.255 my +43.245.128.0 - 43.245.131.255 pk +43.245.132.0 - 43.245.135.255 au +43.245.136.0 - 43.245.139.255 in +43.245.140.0 - 43.245.143.255 bd +43.245.144.0 - 43.245.147.255 th +43.245.148.0 - 43.245.151.255 in +43.245.152.0 - 43.245.155.255 au +43.245.156.0 - 43.245.159.255 in +43.245.160.0 - 43.245.168.255 au +43.245.169.0 - 43.245.169.255 sg +43.245.170.0 - 43.245.171.255 au +43.245.172.0 - 43.245.175.255 nz +43.245.176.0 - 43.245.179.255 au +43.245.180.0 - 43.245.191.255 id +43.245.192.0 - 43.245.195.255 bd +43.245.196.0 - 43.245.197.255 us +43.245.198.0 - 43.245.198.255 sg +43.245.199.0 - 43.245.199.255 id +43.245.200.0 - 43.245.203.255 kh +43.245.204.0 - 43.245.207.255 pk +43.245.208.0 - 43.245.211.255 in +43.245.212.0 - 43.245.215.255 nc +43.245.216.0 - 43.245.219.255 kh +43.245.220.0 - 43.245.223.255 my +43.245.224.0 - 43.245.227.255 au +43.245.228.0 - 43.245.231.255 sg +43.245.232.0 - 43.245.235.255 bd +43.245.236.0 - 43.245.239.255 np +43.245.240.0 - 43.245.243.255 nz +43.245.244.0 - 43.245.247.255 bd +43.245.248.0 - 43.245.251.255 id +43.245.252.0 - 43.245.255.255 sg +43.246.0.0 - 43.246.99.255 cn +43.246.100.0 - 43.246.111.255 in +43.246.112.0 - 43.246.115.255 sg +43.246.116.0 - 43.246.119.255 hk +43.246.120.0 - 43.246.127.255 in +43.246.128.0 - 43.246.131.255 jp +43.246.132.0 - 43.246.135.255 hk +43.246.136.0 - 43.246.151.255 in +43.246.152.0 - 43.246.155.255 kr +43.246.156.0 - 43.246.163.255 in +43.246.164.0 - 43.246.167.255 my +43.246.168.0 - 43.246.175.255 hk +43.246.176.0 - 43.246.179.255 my +43.246.180.0 - 43.246.183.255 kr +43.246.184.0 - 43.246.187.255 th +43.246.188.0 - 43.246.191.255 tw +43.246.192.0 - 43.246.199.255 jp +43.246.200.0 - 43.246.203.255 bd +43.246.204.0 - 43.246.211.255 hk +43.246.212.0 - 43.246.215.255 cn +43.246.216.0 - 43.246.219.255 tw +43.246.220.0 - 43.246.227.255 pk +43.246.228.0 - 43.246.231.255 cn +43.246.232.0 - 43.246.235.255 au +43.246.236.0 - 43.246.255.255 in +43.247.0.0 - 43.247.3.255 hk +43.247.4.0 - 43.247.11.255 cn +43.247.12.0 - 43.247.15.255 id +43.247.16.0 - 43.247.19.255 ph +43.247.20.0 - 43.247.23.255 id +43.247.24.0 - 43.247.27.255 mo +43.247.28.0 - 43.247.31.255 in +43.247.32.0 - 43.247.39.255 id +43.247.40.0 - 43.247.43.255 in +43.247.44.0 - 43.247.51.255 cn +43.247.52.0 - 43.247.55.255 in +43.247.56.0 - 43.247.59.255 th +43.247.60.0 - 43.247.63.255 gu +43.247.64.0 - 43.247.67.255 au +43.247.68.0 - 43.247.71.255 cn +43.247.72.0 - 43.247.75.255 jp +43.247.76.0 - 43.247.79.255 cn +43.247.80.0 - 43.247.83.255 au +43.247.84.0 - 43.247.103.255 cn +43.247.104.0 - 43.247.107.255 kr +43.247.108.0 - 43.247.115.255 cn +43.247.116.0 - 43.247.119.255 au +43.247.120.0 - 43.247.123.255 pk +43.247.124.0 - 43.247.131.255 au +43.247.132.0 - 43.247.135.255 hk +43.247.136.0 - 43.247.147.255 in +43.247.148.0 - 43.247.155.255 cn +43.247.156.0 - 43.247.163.255 in +43.247.164.0 - 43.247.167.255 hk +43.247.168.0 - 43.247.171.255 jp +43.247.172.0 - 43.247.175.255 nz +43.247.176.0 - 43.247.191.255 cn +43.247.192.0 - 43.247.195.255 kr +43.247.196.0 - 43.248.7.255 cn +43.248.8.0 - 43.248.11.255 hk +43.248.12.0 - 43.248.15.255 pk +43.248.16.0 - 43.248.19.255 tw +43.248.20.0 - 43.248.23.255 cn +43.248.24.0 - 43.248.27.255 id +43.248.28.0 - 43.248.31.255 cn +43.248.32.0 - 43.248.39.255 in +43.248.40.0 - 43.248.43.255 jp +43.248.48.0 - 43.248.51.255 cn +43.248.52.0 - 43.248.55.255 au +43.248.60.0 - 43.248.67.255 hk +43.248.68.0 - 43.248.75.255 in +43.248.76.0 - 43.248.151.255 cn +43.248.152.0 - 43.248.155.255 in +43.248.156.0 - 43.248.159.255 fm +43.248.160.0 - 43.248.163.255 jp +43.248.164.0 - 43.248.175.255 hk +43.248.176.0 - 43.248.211.255 cn +43.248.212.0 - 43.248.215.255 au +43.248.216.0 - 43.248.219.255 jp +43.248.220.0 - 43.248.223.255 in +43.248.224.0 - 43.248.227.255 hk +43.248.228.0 - 43.248.235.255 cn +43.248.236.0 - 43.248.243.255 in +43.248.244.0 - 43.248.247.255 cn +43.248.248.0 - 43.248.251.255 hk +43.248.252.0 - 43.248.255.255 in +43.249.0.0 - 43.249.11.255 cn +43.249.12.0 - 43.249.15.255 sg +43.249.16.0 - 43.249.23.255 hk +43.249.24.0 - 43.249.27.255 cn +43.249.28.0 - 43.249.31.255 hk +43.249.32.0 - 43.249.35.255 th +43.249.36.0 - 43.249.37.255 hk +43.249.38.0 - 43.249.39.255 sg +43.249.40.0 - 43.249.43.255 af +43.249.44.0 - 43.249.47.255 jp +43.249.48.0 - 43.249.55.255 in +43.249.56.0 - 43.249.71.255 th +43.249.72.0 - 43.249.75.255 nz +43.249.76.0 - 43.249.83.255 hk +43.249.84.0 - 43.249.87.255 in +43.249.88.0 - 43.249.91.255 hk +43.249.96.0 - 43.249.103.255 hk +43.249.104.0 - 43.249.115.255 th +43.249.116.0 - 43.249.119.255 au +43.249.120.0 - 43.249.123.255 cn +43.249.124.0 - 43.249.127.255 hk +43.249.128.0 - 43.249.128.127 kr +43.249.128.128 - 43.249.128.255 jp +43.249.129.0 - 43.249.129.127 kr +43.249.129.128 - 43.249.130.127 jp +43.249.130.128 - 43.249.130.255 kr +43.249.131.0 - 43.249.131.127 jp +43.249.131.128 - 43.249.131.255 kr +43.249.132.0 - 43.249.139.255 cn +43.249.140.0 - 43.249.143.255 id +43.249.144.0 - 43.249.171.255 cn +43.249.172.0 - 43.249.175.255 hk +43.249.176.0 - 43.249.179.255 pf +43.249.180.0 - 43.249.191.255 in +43.249.192.0 - 43.249.195.255 cn +43.249.196.0 - 43.249.203.255 nz +43.249.204.0 - 43.249.207.255 hk +43.249.208.0 - 43.249.211.255 id +43.249.212.0 - 43.249.215.255 sg +43.249.216.0 - 43.249.219.255 in +43.249.220.0 - 43.249.223.255 hk +43.249.224.0 - 43.249.235.255 in +43.249.236.0 - 43.249.239.255 cn +43.249.240.0 - 43.249.247.255 jp +43.249.248.0 - 43.249.251.255 sg +43.249.252.0 - 43.249.255.255 hk +43.250.0.0 - 43.250.3.255 sg +43.250.4.0 - 43.250.7.255 cn +43.250.8.0 - 43.250.11.255 hk +43.250.12.0 - 43.250.23.255 cn +43.250.24.0 - 43.250.27.255 au +43.250.28.0 - 43.250.39.255 cn +43.250.40.0 - 43.250.43.255 in +43.250.44.0 - 43.250.47.255 tw +43.250.48.0 - 43.250.51.255 hk +43.250.52.0 - 43.250.55.255 au +43.250.56.0 - 43.250.67.255 hk +43.250.68.0 - 43.250.71.255 au +43.250.72.0 - 43.250.75.255 cn +43.250.80.0 - 43.250.83.255 bd +43.250.84.0 - 43.250.87.255 pk +43.250.88.0 - 43.250.91.255 jp +43.250.92.0 - 43.250.95.255 au +43.250.96.0 - 43.250.119.255 cn +43.250.120.0 - 43.250.123.255 in +43.250.124.0 - 43.250.127.255 mn +43.250.128.0 - 43.250.131.255 cn +43.250.132.0 - 43.250.135.255 in +43.250.136.0 - 43.250.139.255 af +43.250.140.0 - 43.250.143.255 au +43.250.144.0 - 43.250.151.255 cn +43.250.152.0 - 43.250.155.255 kr +43.250.156.0 - 43.250.159.255 in +43.250.160.0 - 43.250.163.255 cn +43.250.164.0 - 43.250.167.255 in +43.250.168.0 - 43.250.179.255 cn +43.250.180.0 - 43.250.183.255 in +43.250.184.0 - 43.250.191.255 hk +43.250.192.0 - 43.250.195.255 sg +43.250.196.0 - 43.250.199.255 jp +43.250.200.0 - 43.250.203.255 cn +43.250.204.0 - 43.250.207.255 au +43.250.208.0 - 43.250.211.255 in +43.250.212.0 - 43.250.223.255 cn +43.250.224.0 - 43.250.227.255 ph +43.250.228.0 - 43.250.231.255 jp +43.250.232.0 - 43.250.234.255 au +43.250.235.0 - 43.250.235.255 hk +43.250.236.0 - 43.250.239.255 cn +43.250.240.0 - 43.250.243.255 lk +43.250.244.0 - 43.250.247.255 cn +43.250.248.0 - 43.250.251.255 au +43.250.252.0 - 43.251.3.255 in +43.251.4.0 - 43.251.15.255 cn +43.251.16.0 - 43.251.17.255 hk +43.251.18.0 - 43.251.19.255 in +43.251.20.0 - 43.251.27.255 hk +43.251.28.0 - 43.251.31.255 kr +43.251.32.0 - 43.251.35.255 hk +43.251.36.0 - 43.251.39.255 cn +43.251.40.0 - 43.251.43.255 au +43.251.44.0 - 43.251.47.255 hk +43.251.48.0 - 43.251.51.255 jp +43.251.52.0 - 43.251.55.255 au +43.251.56.0 - 43.251.63.255 tw +43.251.64.0 - 43.251.67.255 sg +43.251.68.0 - 43.251.71.255 kr +43.251.72.0 - 43.251.75.255 in +43.251.76.0 - 43.251.79.255 hk +43.251.80.0 - 43.251.95.255 in +43.251.96.0 - 43.251.99.255 id +43.251.100.0 - 43.251.103.255 in +43.251.104.0 - 43.251.107.255 hk +43.251.108.0 - 43.251.111.255 au +43.251.112.0 - 43.251.115.255 my +43.251.116.0 - 43.251.119.255 cn +43.251.120.0 - 43.251.123.255 kr +43.251.124.0 - 43.251.127.255 in +43.251.128.0 - 43.251.131.255 bn +43.251.132.0 - 43.251.135.255 hk +43.251.136.0 - 43.251.139.255 my +43.251.140.0 - 43.251.143.255 hk +43.251.144.0 - 43.251.151.255 in +43.251.152.0 - 43.251.155.255 au +43.251.156.0 - 43.251.163.255 hk +43.251.164.0 - 43.251.167.127 sg +43.251.167.128 - 43.251.167.255 my +43.251.168.0 - 43.251.179.255 in +43.251.184.0 - 43.251.187.255 jp +43.251.188.0 - 43.251.191.255 in +43.251.192.0 - 43.251.195.255 cn +43.251.196.0 - 43.251.199.255 hk +43.251.200.0 - 43.251.203.255 au +43.251.208.0 - 43.251.211.255 my +43.251.212.0 - 43.251.223.255 in +43.251.224.0 - 43.251.231.255 hk +43.251.232.0 - 43.251.239.255 cn +43.251.240.0 - 43.251.243.255 au +43.251.244.0 - 43.251.247.255 cn +43.251.248.0 - 43.251.251.255 hk +43.251.252.0 - 43.251.255.255 th +43.252.0.0 - 43.252.3.255 au +43.252.4.0 - 43.252.7.255 in +43.252.8.0 - 43.252.11.255 id +43.252.12.0 - 43.252.15.255 lk +43.252.16.0 - 43.252.19.255 kh +43.252.20.0 - 43.252.23.255 au +43.252.24.0 - 43.252.35.255 in +43.252.36.0 - 43.252.39.255 my +43.252.40.0 - 43.252.43.255 hk +43.252.44.0 - 43.252.47.255 my +43.252.48.0 - 43.252.51.255 cn +43.252.52.0 - 43.252.55.255 hk +43.252.56.0 - 43.252.59.255 cn +43.252.60.0 - 43.252.63.255 in +43.252.64.0 - 43.252.71.255 nz +43.252.72.0 - 43.252.75.255 id +43.252.76.0 - 43.252.79.255 au +43.252.80.0 - 43.252.83.255 in +43.252.84.0 - 43.252.87.255 hk +43.252.88.0 - 43.252.95.255 in +43.252.96.0 - 43.252.99.255 au +43.252.100.0 - 43.252.103.255 in +43.252.104.0 - 43.252.107.255 id +43.252.108.0 - 43.252.115.255 au +43.252.116.0 - 43.252.119.255 in +43.252.120.0 - 43.252.123.255 th +43.252.124.0 - 43.252.131.255 au +43.252.132.0 - 43.252.135.255 hk +43.252.136.0 - 43.252.139.255 id +43.252.140.0 - 43.252.143.255 in +43.252.144.0 - 43.252.147.255 id +43.252.148.0 - 43.252.151.255 hk +43.252.152.0 - 43.252.155.255 in +43.252.156.0 - 43.252.159.255 id +43.252.160.0 - 43.252.179.255 hk +43.252.180.0 - 43.252.183.255 in +43.252.184.0 - 43.252.187.255 id +43.252.188.0 - 43.252.199.255 in +43.252.200.0 - 43.252.203.255 hk +43.252.204.0 - 43.252.207.255 in +43.252.208.0 - 43.252.211.255 hk +43.252.212.0 - 43.252.219.255 my +43.252.220.0 - 43.252.221.255 in +43.252.222.0 - 43.252.223.255 id +43.252.224.0 - 43.252.227.255 cn +43.252.228.0 - 43.252.231.255 hk +43.252.232.0 - 43.252.235.255 my +43.252.236.0 - 43.252.239.255 id +43.252.240.0 - 43.252.243.255 in +43.252.244.0 - 43.252.247.255 la +43.252.248.0 - 43.252.251.255 in +43.252.252.0 - 43.252.255.255 au +43.253.0.0 - 43.253.255.255 jp +43.254.0.0 - 43.254.11.255 cn +43.254.12.0 - 43.254.15.255 pk +43.254.16.0 - 43.254.19.255 tw +43.254.20.0 - 43.254.23.255 nz +43.254.24.0 - 43.254.27.255 cn +43.254.28.0 - 43.254.35.255 in +43.254.36.0 - 43.254.39.255 cn +43.254.40.0 - 43.254.43.255 in +43.254.44.0 - 43.254.47.255 cn +43.254.48.0 - 43.254.51.255 in +43.254.52.0 - 43.254.55.255 cn +43.254.56.0 - 43.254.59.255 tl +43.254.60.0 - 43.254.63.255 tw +43.254.64.0 - 43.254.67.255 cn +43.254.68.0 - 43.254.71.255 id +43.254.72.0 - 43.254.75.255 cn +43.254.76.0 - 43.254.79.255 my +43.254.80.0 - 43.254.83.255 id +43.254.84.0 - 43.254.95.255 cn +43.254.96.0 - 43.254.99.255 bd +43.254.100.0 - 43.254.107.255 cn +43.254.108.0 - 43.254.111.255 in +43.254.112.0 - 43.254.119.255 cn +43.254.120.0 - 43.254.123.255 my +43.254.124.0 - 43.254.127.255 id +43.254.128.0 - 43.254.131.255 cn +43.254.132.0 - 43.254.135.255 th +43.254.136.0 - 43.254.159.255 cn +43.254.160.0 - 43.254.163.255 in +43.254.164.0 - 43.254.167.255 hk +43.254.168.0 - 43.254.175.255 cn +43.254.176.0 - 43.254.179.255 in +43.254.180.0 - 43.254.203.255 cn +43.254.204.0 - 43.254.207.255 in +43.254.208.0 - 43.254.211.255 cn +43.254.212.0 - 43.254.215.255 in +43.254.216.0 - 43.254.219.255 hk +43.254.220.0 - 43.254.243.255 cn +43.254.244.0 - 43.254.247.255 kr +43.254.248.0 - 43.255.11.255 cn +43.255.12.0 - 43.255.15.255 tw +43.255.16.0 - 43.255.19.255 cn +43.255.20.0 - 43.255.23.255 bd +43.255.24.0 - 43.255.24.255 us +43.255.25.0 - 43.255.27.255 nz +43.255.32.0 - 43.255.35.255 au +43.255.36.0 - 43.255.39.255 hk +43.255.40.0 - 43.255.43.255 jp +43.255.44.0 - 43.255.47.255 au +43.255.48.0 - 43.255.51.255 cn +43.255.52.0 - 43.255.55.255 hk +43.255.56.0 - 43.255.59.255 in +43.255.60.0 - 43.255.62.255 cn +43.255.63.0 - 43.255.63.255 au +43.255.64.0 - 43.255.79.255 cn +43.255.80.0 - 43.255.80.255 jp +43.255.81.0 - 43.255.81.255 au +43.255.82.0 - 43.255.82.255 jp +43.255.83.0 - 43.255.83.255 au +43.255.84.0 - 43.255.87.255 cn +43.255.88.0 - 43.255.95.255 tw +43.255.96.0 - 43.255.99.255 cn +43.255.100.0 - 43.255.103.255 sg +43.255.104.0 - 43.255.107.255 hk +43.255.108.0 - 43.255.111.255 cn +43.255.112.0 - 43.255.115.255 kh +43.255.116.0 - 43.255.123.255 hk +43.255.124.0 - 43.255.127.255 sg +43.255.128.0 - 43.255.131.255 au +43.255.132.0 - 43.255.135.255 in +43.255.136.0 - 43.255.139.255 au +43.255.140.0 - 43.255.143.255 in +43.255.144.0 - 43.255.147.255 cn +43.255.148.0 - 43.255.151.255 to +43.255.152.0 - 43.255.155.255 sg +43.255.156.0 - 43.255.159.255 hk +43.255.160.0 - 43.255.163.255 nz +43.255.164.0 - 43.255.167.255 in +43.255.168.0 - 43.255.171.255 cn +43.255.172.0 - 43.255.175.255 my +43.255.176.0 - 43.255.179.255 cn +43.255.180.0 - 43.255.183.255 tw +43.255.184.0 - 43.255.187.255 cn +43.255.188.0 - 43.255.191.255 hk +43.255.192.0 - 43.255.195.255 cn +43.255.196.0 - 43.255.199.255 id +43.255.200.0 - 43.255.215.255 cn +43.255.216.0 - 43.255.219.255 ph +43.255.220.0 - 43.255.223.255 in +43.255.224.0 - 43.255.235.255 cn +43.255.236.0 - 43.255.239.255 nc +43.255.240.0 - 43.255.243.255 th +43.255.244.0 - 43.255.247.255 cn +43.255.248.0 - 43.255.255.255 kr +44.0.0.0 - 44.136.255.255 us +44.137.0.0 - 44.137.255.255 nl +44.138.0.0 - 45.1.255.255 us +45.2.0.0 - 45.3.31.255 ca +45.3.32.0 - 45.3.255.255 us +45.16.0.0 - 45.31.255.255 us +45.32.0.0 - 45.32.7.255 nl +45.32.8.0 - 45.32.8.0 jp +45.32.8.1 - 45.32.63.255 nl +45.32.64.0 - 45.32.71.255 us +45.32.72.0 - 45.32.127.255 nl +45.32.128.0 - 45.32.135.255 us +45.32.136.0 - 45.32.183.76 nl +45.32.183.77 - 45.32.183.77 gb +45.32.183.78 - 45.32.193.255 nl +45.32.194.0 - 45.32.194.255 us +45.32.195.0 - 45.32.195.255 nl +45.32.196.0 - 45.32.196.255 us +45.32.197.0 - 45.32.209.255 nl +45.32.210.0 - 45.32.213.255 us +45.32.214.0 - 45.32.239.255 nl +45.32.240.0 - 45.32.247.255 au +45.32.248.0 - 45.32.255.255 jp +45.33.0.0 - 45.33.191.255 us +45.33.192.0 - 45.33.207.255 ca +45.33.208.0 - 45.40.15.255 us +45.40.16.0 - 45.40.31.255 ca +45.40.32.0 - 45.40.63.255 us +45.40.64.0 - 45.40.79.255 ca +45.40.80.0 - 45.40.191.255 us +45.40.192.0 - 45.40.192.255 nz +45.40.193.0 - 45.40.255.255 us +45.41.0.0 - 45.41.0.255 nz +45.41.1.0 - 45.41.3.255 us +45.41.4.0 - 45.41.4.255 in +45.41.5.0 - 45.41.95.255 us +45.41.96.0 - 45.41.127.255 ca +45.41.128.0 - 45.41.134.255 us +45.41.135.0 - 45.41.135.255 jp +45.41.136.0 - 45.41.139.255 de +45.41.140.0 - 45.41.195.255 us +45.41.196.0 - 45.41.196.255 au +45.41.197.0 - 45.41.204.255 us +45.41.205.0 - 45.41.205.255 jp +45.41.206.0 - 45.41.214.255 us +45.41.215.0 - 45.41.215.255 nz +45.41.216.0 - 45.41.233.255 us +45.41.234.0 - 45.41.234.255 ph +45.41.235.0 - 45.41.255.255 us +45.42.0.0 - 45.42.1.255 vi +45.42.2.0 - 45.42.7.255 us +45.42.8.0 - 45.42.15.255 ca +45.42.16.0 - 45.42.23.255 us +45.42.24.0 - 45.42.27.255 ca +45.42.28.0 - 45.42.35.255 us +45.42.36.0 - 45.42.39.255 ca +45.42.40.0 - 45.42.71.255 us +45.42.72.0 - 45.42.79.255 ca +45.42.80.0 - 45.42.95.255 us +45.42.96.0 - 45.42.127.255 ca +45.42.128.0 - 45.42.128.255 us +45.42.129.0 - 45.42.129.255 ml +45.42.130.0 - 45.42.133.255 us +45.42.134.0 - 45.42.134.255 mw +45.42.135.0 - 45.42.135.255 us +45.42.136.0 - 45.42.136.255 mv +45.42.137.0 - 45.42.137.255 jp +45.42.138.0 - 45.42.138.255 ph +45.42.139.0 - 45.42.139.255 cd +45.42.140.0 - 45.42.140.255 us +45.42.141.0 - 45.42.141.255 pa +45.42.142.0 - 45.42.142.255 mn +45.42.143.0 - 45.42.143.255 va +45.42.144.0 - 45.42.144.255 zw +45.42.145.0 - 45.42.148.255 us +45.42.149.0 - 45.42.149.255 sd +45.42.150.0 - 45.42.150.255 us +45.42.151.0 - 45.42.151.255 kp +45.42.152.0 - 45.42.153.255 us +45.42.154.0 - 45.42.154.255 bi +45.42.155.0 - 45.42.155.255 us +45.42.156.0 - 45.42.156.255 cc +45.42.157.0 - 45.42.158.255 us +45.42.159.0 - 45.42.159.255 mu +45.42.160.0 - 45.42.160.255 us +45.42.161.0 - 45.42.161.255 ad +45.42.162.0 - 45.42.163.255 us +45.42.164.0 - 45.42.164.255 sl +45.42.165.0 - 45.42.165.255 us +45.42.166.0 - 45.42.166.255 nz +45.42.167.0 - 45.42.167.255 gu +45.42.168.0 - 45.42.168.255 us +45.42.169.0 - 45.42.169.255 tg +45.42.170.0 - 45.42.170.255 us +45.42.171.0 - 45.42.171.255 fj +45.42.172.0 - 45.42.172.255 cw +45.42.173.0 - 45.42.173.255 sb +45.42.174.0 - 45.42.174.255 er +45.42.175.0 - 45.42.175.255 us +45.42.176.0 - 45.42.176.255 nr +45.42.177.0 - 45.42.178.255 us +45.42.179.0 - 45.42.179.255 mr +45.42.180.0 - 45.42.183.255 us +45.42.184.0 - 45.42.184.255 lr +45.42.185.0 - 45.42.185.255 us +45.42.186.0 - 45.42.186.255 mc +45.42.187.0 - 45.42.192.255 us +45.42.193.0 - 45.42.193.127 gq +45.42.193.128 - 45.42.197.255 us +45.42.198.0 - 45.42.198.127 ls +45.42.198.128 - 45.42.202.255 us +45.42.203.0 - 45.42.203.127 cv +45.42.203.128 - 45.42.207.255 us +45.42.208.0 - 45.42.208.127 cf +45.42.208.128 - 45.42.209.255 us +45.42.210.0 - 45.42.210.255 sm +45.42.211.0 - 45.42.211.255 us +45.42.212.0 - 45.42.212.255 to +45.42.213.0 - 45.42.213.127 gw +45.42.213.128 - 45.42.217.255 us +45.42.218.0 - 45.42.218.127 gm +45.42.218.128 - 45.42.219.255 us +45.42.220.0 - 45.42.220.255 tv +45.42.221.0 - 45.42.222.255 us +45.42.223.0 - 45.42.223.127 km +45.42.223.128 - 45.42.224.255 us +45.42.225.0 - 45.42.225.255 cg +45.42.226.0 - 45.42.227.255 us +45.42.228.0 - 45.42.228.127 st +45.42.228.128 - 45.42.229.255 us +45.42.230.0 - 45.42.230.255 ar +45.42.231.0 - 45.42.232.255 us +45.42.233.0 - 45.42.233.127 so +45.42.233.128 - 45.42.237.255 us +45.42.238.0 - 45.42.238.127 lk +45.42.238.128 - 45.42.242.255 us +45.42.243.0 - 45.42.243.127 np +45.42.243.128 - 45.42.248.255 us +45.42.249.0 - 45.42.249.255 ws +45.42.250.0 - 45.43.255.255 us +45.44.0.0 - 45.45.127.255 ca +45.45.128.0 - 45.45.128.255 hk +45.45.129.0 - 45.45.129.255 de +45.45.130.0 - 45.45.131.255 us +45.45.132.0 - 45.45.132.255 jp +45.45.133.0 - 45.45.133.255 gb +45.45.134.0 - 45.45.134.255 us +45.45.135.0 - 45.45.135.255 de +45.45.136.0 - 45.45.139.255 us +45.45.140.0 - 45.45.140.255 it +45.45.141.0 - 45.45.141.255 gb +45.45.142.0 - 45.45.146.255 us +45.45.147.0 - 45.45.147.255 hk +45.45.148.0 - 45.45.149.255 us +45.45.150.0 - 45.45.150.255 gb +45.45.151.0 - 45.45.156.255 us +45.45.157.0 - 45.45.157.255 gb +45.45.158.0 - 45.45.161.255 us +45.45.162.0 - 45.45.162.255 in +45.45.163.0 - 45.45.168.255 us +45.45.169.0 - 45.45.169.255 fr +45.45.170.0 - 45.45.172.255 us +45.45.173.0 - 45.45.173.255 fr +45.45.174.0 - 45.45.176.255 us +45.45.177.0 - 45.45.177.255 fr +45.45.178.0 - 45.45.184.255 us +45.45.185.0 - 45.45.185.255 fr +45.45.186.0 - 45.56.145.255 us +45.56.146.0 - 45.56.146.255 ph +45.56.147.0 - 45.56.151.255 us +45.56.152.0 - 45.56.152.255 hk +45.56.153.0 - 45.56.153.255 sg +45.56.154.0 - 45.56.155.255 us +45.56.156.0 - 45.56.156.255 br +45.56.157.0 - 45.56.157.255 in +45.56.158.0 - 45.56.158.255 au +45.56.159.0 - 45.56.159.255 jp +45.56.160.0 - 45.56.183.255 us +45.56.184.0 - 45.56.191.255 de +45.56.192.0 - 45.58.15.255 us +45.58.16.0 - 45.58.31.255 ca +45.58.32.0 - 45.58.35.255 us +45.58.36.0 - 45.58.37.255 ca +45.58.38.0 - 45.58.79.255 us +45.58.80.0 - 45.58.111.255 ca +45.58.112.0 - 45.58.191.255 us +45.58.192.0 - 45.58.255.255 ca +45.59.0.0 - 45.59.23.255 us +45.59.24.0 - 45.59.24.255 nl +45.59.25.0 - 45.59.25.255 us +45.59.26.0 - 45.59.26.255 ca +45.59.27.0 - 45.59.128.255 us +45.59.129.0 - 45.59.129.255 am +45.59.130.0 - 45.59.132.255 us +45.59.133.0 - 45.59.133.255 ao +45.59.134.0 - 45.59.134.255 bt +45.59.135.0 - 45.59.135.255 az +45.59.136.0 - 45.59.136.255 au +45.59.137.0 - 45.59.137.255 us +45.59.138.0 - 45.59.138.255 sd +45.59.139.0 - 45.59.139.255 mh +45.59.140.0 - 45.59.140.255 us +45.59.141.0 - 45.59.141.255 kz +45.59.142.0 - 45.59.142.255 ir +45.59.143.0 - 45.59.143.255 pg +45.59.144.0 - 45.59.144.255 et +45.59.145.0 - 45.59.145.255 to +45.59.146.0 - 45.59.146.255 kh +45.59.147.0 - 45.59.147.255 kg +45.59.148.0 - 45.59.148.255 us +45.59.149.0 - 45.59.149.255 gg +45.59.150.0 - 45.59.150.255 cd +45.59.151.0 - 45.59.151.255 sj +45.59.152.0 - 45.59.152.255 as +45.59.153.0 - 45.59.153.255 uz +45.59.154.0 - 45.59.154.255 gn +45.59.155.0 - 45.59.156.255 us +45.59.157.0 - 45.59.157.255 ph +45.59.158.0 - 45.59.158.255 cg +45.59.159.0 - 45.59.159.255 tm +45.59.160.0 - 45.59.160.255 us +45.59.161.0 - 45.59.161.255 cv +45.59.162.0 - 45.59.162.255 zm +45.59.163.0 - 45.59.164.255 us +45.59.165.0 - 45.59.165.255 tj +45.59.166.0 - 45.59.166.255 li +45.59.167.0 - 45.59.167.255 mq +45.59.168.0 - 45.59.168.255 mz +45.59.169.0 - 45.59.169.255 gp +45.59.170.0 - 45.59.170.255 re +45.59.171.0 - 45.59.171.255 cn +45.59.172.0 - 45.59.172.255 wf +45.59.173.0 - 45.59.173.255 km +45.59.174.0 - 45.59.174.255 sn +45.59.175.0 - 45.59.175.255 tf +45.59.176.0 - 45.59.176.255 pa +45.59.177.0 - 45.59.177.255 dz +45.59.178.0 - 45.59.178.255 ne +45.59.179.0 - 45.59.179.255 gi +45.59.180.0 - 45.59.180.255 td +45.59.181.0 - 45.59.182.255 us +45.59.183.0 - 45.59.183.255 ly +45.59.184.0 - 45.59.184.255 us +45.59.185.0 - 45.59.185.255 tz +45.59.186.0 - 45.59.186.255 us +45.59.187.0 - 45.59.187.255 mg +45.59.188.0 - 45.59.188.255 la +45.59.189.0 - 45.59.189.255 tn +45.59.190.0 - 45.60.255.255 us +45.61.0.0 - 45.61.15.255 ca +45.61.16.0 - 45.61.47.255 us +45.61.48.0 - 45.61.63.255 ca +45.61.64.0 - 45.61.87.255 us +45.61.88.0 - 45.61.95.255 in +45.61.96.0 - 45.61.99.255 de +45.61.100.0 - 45.61.111.255 us +45.61.112.0 - 45.61.127.255 cn +45.61.128.0 - 45.62.36.255 us +45.62.37.0 - 45.62.37.255 in +45.62.38.0 - 45.62.39.255 us +45.62.40.0 - 45.62.40.255 pk +45.62.41.0 - 45.62.48.255 us +45.62.49.0 - 45.62.49.255 in +45.62.50.0 - 45.62.52.255 us +45.62.53.0 - 45.62.53.255 pk +45.62.54.0 - 45.62.58.255 us +45.62.59.0 - 45.62.59.255 in +45.62.60.0 - 45.62.61.255 us +45.62.62.0 - 45.62.62.255 pk +45.62.63.0 - 45.62.63.255 us +45.62.64.0 - 45.62.95.255 ca +45.62.96.0 - 45.62.119.255 us +45.62.120.0 - 45.62.123.255 nl +45.62.124.0 - 45.62.191.255 us +45.62.192.0 - 45.62.255.255 ca +45.63.0.0 - 45.63.95.255 us +45.63.96.0 - 45.63.103.255 gb +45.63.104.0 - 45.63.111.255 us +45.63.112.0 - 45.63.115.255 fr +45.63.116.0 - 45.63.119.255 de +45.63.120.0 - 45.63.127.255 jp +45.63.128.0 - 45.63.255.255 us +45.64.0.0 - 45.64.7.255 id +45.64.8.0 - 45.64.19.255 in +45.64.20.0 - 45.64.23.255 mo +45.64.24.0 - 45.64.27.255 pk +45.64.28.0 - 45.64.35.255 tw +45.64.36.0 - 45.64.39.255 au +45.64.40.0 - 45.64.43.255 sg +45.64.44.0 - 45.64.47.255 id +45.64.48.0 - 45.64.51.255 nz +45.64.52.0 - 45.64.55.255 hk +45.64.56.0 - 45.64.59.255 au +45.64.60.0 - 45.64.63.255 nz +45.64.64.0 - 45.64.67.255 hk +45.64.68.0 - 45.64.71.255 au +45.64.72.0 - 45.64.73.255 sg +45.64.74.0 - 45.64.75.255 tw +45.64.76.0 - 45.64.79.255 th +45.64.80.0 - 45.64.83.255 ph +45.64.84.0 - 45.64.95.255 in +45.64.96.0 - 45.64.96.255 id +45.64.97.0 - 45.64.97.255 sg +45.64.98.0 - 45.64.103.255 id +45.64.104.0 - 45.64.107.255 in +45.64.108.0 - 45.64.113.255 hk +45.64.114.0 - 45.64.115.255 in +45.64.116.0 - 45.64.119.255 nz +45.64.120.0 - 45.64.123.255 ph +45.64.124.0 - 45.64.127.255 kh +45.64.128.0 - 45.64.131.255 sg +45.64.132.0 - 45.64.139.255 bd +45.64.140.0 - 45.64.147.255 kr +45.64.148.0 - 45.64.151.255 au +45.64.152.0 - 45.64.155.255 kr +45.64.156.0 - 45.64.159.255 in +45.64.160.0 - 45.64.163.255 np +45.64.164.0 - 45.64.167.255 bd +45.64.168.0 - 45.64.171.255 my +45.64.172.0 - 45.64.175.255 kr +45.64.176.0 - 45.64.179.255 in +45.64.180.0 - 45.64.183.255 pk +45.64.184.0 - 45.64.187.255 th +45.64.188.0 - 45.64.199.255 in +45.64.200.0 - 45.64.203.255 nz +45.64.204.0 - 45.64.227.255 in +45.64.228.0 - 45.64.235.255 tw +45.64.236.0 - 45.64.239.255 in +45.64.240.0 - 45.64.247.255 hk +45.64.248.0 - 45.64.251.255 bt +45.64.252.0 - 45.64.255.255 id +45.65.0.0 - 45.65.3.255 sg +45.65.4.0 - 45.65.7.255 nz +45.65.8.0 - 45.65.11.255 in +45.65.12.0 - 45.65.15.255 au +45.72.0.0 - 45.72.127.255 us +45.72.128.0 - 45.73.127.255 ca +45.73.128.0 - 45.74.0.255 us +45.74.1.0 - 45.74.1.255 sa +45.74.2.0 - 45.74.2.255 cr +45.74.3.0 - 45.74.3.255 no +45.74.4.0 - 45.74.4.255 be +45.74.5.0 - 45.74.16.255 us +45.74.17.0 - 45.74.17.127 gt +45.74.17.128 - 45.74.17.255 sv +45.74.18.0 - 45.74.18.127 hn +45.74.18.128 - 45.74.18.255 ni +45.74.19.0 - 45.74.19.127 bo +45.74.19.128 - 45.74.19.255 py +45.74.20.0 - 45.74.20.127 sr +45.74.20.128 - 45.74.20.255 gy +45.74.21.0 - 45.74.21.127 tt +45.74.21.128 - 45.74.21.255 gd +45.74.22.0 - 45.74.22.127 dm +45.74.22.128 - 45.74.22.255 bb +45.74.23.0 - 45.74.23.127 lc +45.74.23.128 - 45.74.23.255 do +45.74.24.0 - 45.74.24.127 ht +45.74.24.128 - 45.74.24.255 tc +45.74.25.0 - 45.74.25.127 cv +45.74.25.128 - 45.74.25.255 ky +45.74.26.0 - 45.74.26.127 bm +45.74.26.128 - 45.74.26.255 ms +45.74.27.0 - 45.74.27.127 ag +45.74.27.128 - 45.74.27.255 by +45.74.28.0 - 45.74.28.127 cm +45.74.28.128 - 45.74.28.255 cf +45.74.29.0 - 45.74.29.127 us +45.74.29.128 - 45.74.29.255 zw +45.74.30.0 - 45.74.30.127 zm +45.74.30.128 - 45.74.30.255 ga +45.74.31.0 - 45.74.31.127 rw +45.74.31.128 - 45.74.31.255 bw +45.74.32.0 - 45.74.32.127 mz +45.74.32.128 - 45.74.32.255 sz +45.74.33.0 - 45.74.33.127 mw +45.74.33.128 - 45.74.33.255 bi +45.74.34.0 - 45.74.34.127 er +45.74.34.128 - 45.74.34.255 ls +45.74.35.0 - 45.74.63.255 us +45.74.64.0 - 45.74.79.255 ca +45.74.80.0 - 45.74.95.255 us +45.74.96.0 - 45.74.239.255 ca +45.74.240.0 - 45.74.255.255 us +45.75.0.0 - 45.75.255.255 ca +45.76.0.0 - 45.78.95.255 us +45.78.96.0 - 45.78.127.255 ca +45.78.128.0 - 45.78.159.255 us +45.78.160.0 - 45.78.255.255 ca +45.79.0.0 - 45.79.255.255 us +45.96.0.0 - 45.111.255.255 eg +45.112.0.0 - 45.112.23.255 in +45.112.24.0 - 45.112.27.255 hk +45.112.28.0 - 45.112.35.255 in +45.112.36.0 - 45.112.39.255 sg +45.112.40.0 - 45.112.63.255 in +45.112.64.0 - 45.112.67.255 th +45.112.68.0 - 45.112.71.255 in +45.112.72.0 - 45.112.75.255 bd +45.112.76.0 - 45.112.81.255 sg +45.112.82.0 - 45.112.83.255 ph +45.112.84.0 - 45.112.87.255 id +45.112.88.0 - 45.112.119.255 kr +45.112.124.0 - 45.112.127.255 id +45.112.128.0 - 45.112.131.255 jp +45.112.132.0 - 45.112.135.255 cn +45.112.136.0 - 45.112.139.255 in +45.112.140.0 - 45.112.143.255 th +45.112.144.0 - 45.112.151.255 in +45.112.152.0 - 45.112.171.255 kr +45.112.172.0 - 45.112.175.255 in +45.112.176.0 - 45.112.179.255 mm +45.112.180.0 - 45.112.183.255 np +45.112.184.0 - 45.112.187.255 in +45.112.188.0 - 45.112.191.255 cn +45.112.192.0 - 45.112.195.255 in +45.112.196.0 - 45.112.199.255 my +45.112.200.0 - 45.112.203.255 in +45.112.204.0 - 45.112.207.255 hk +45.112.208.0 - 45.112.223.255 cn +45.112.224.0 - 45.112.227.255 fj +45.112.228.0 - 45.112.239.255 cn +45.112.240.0 - 45.112.243.255 hk +45.112.244.0 - 45.112.247.255 au +45.112.248.0 - 45.112.255.255 in +45.113.0.0 - 45.113.3.255 hk +45.113.4.0 - 45.113.7.255 jp +45.113.8.0 - 45.113.11.255 nz +45.113.12.0 - 45.113.31.255 cn +45.113.32.0 - 45.113.35.255 hk +45.113.36.0 - 45.113.39.255 au +45.113.40.0 - 45.113.43.255 cn +45.113.44.0 - 45.113.51.255 kr +45.113.52.0 - 45.113.59.255 cn +45.113.60.0 - 45.113.61.255 th +45.113.62.0 - 45.113.67.255 in +45.113.68.0 - 45.113.71.255 hk +45.113.72.0 - 45.113.75.255 cn +45.113.76.0 - 45.113.79.255 in +45.113.80.0 - 45.113.80.255 hk +45.113.81.0 - 45.113.83.255 us +45.113.84.0 - 45.113.87.255 th +45.113.88.0 - 45.113.91.255 in +45.113.92.0 - 45.113.95.255 au +45.113.96.0 - 45.113.107.255 in +45.113.108.0 - 45.113.111.255 cn +45.113.112.0 - 45.113.115.255 hk +45.113.116.0 - 45.113.119.255 jp +45.113.120.0 - 45.113.121.255 hk +45.113.122.0 - 45.113.122.255 in +45.113.123.0 - 45.113.123.255 hk +45.113.124.0 - 45.113.127.255 pk +45.113.128.0 - 45.113.131.255 hk +45.113.136.0 - 45.113.139.255 in +45.113.140.0 - 45.113.143.255 hk +45.113.144.0 - 45.113.151.255 cn +45.113.152.0 - 45.113.155.255 in +45.113.156.0 - 45.113.159.255 tw +45.113.160.0 - 45.113.163.255 hk +45.113.168.0 - 45.113.171.255 cn +45.113.172.0 - 45.113.175.255 jp +45.113.176.0 - 45.113.179.255 cn +45.113.180.0 - 45.113.183.255 in +45.113.184.0 - 45.113.187.255 cn +45.113.188.0 - 45.113.191.255 in +45.113.192.0 - 45.113.195.255 hk +45.113.196.0 - 45.113.199.255 au +45.113.200.0 - 45.113.223.255 cn +45.113.224.0 - 45.113.227.255 in +45.113.228.0 - 45.113.231.255 cn +45.113.232.0 - 45.113.235.255 au +45.113.236.0 - 45.113.239.255 bd +45.113.240.0 - 45.113.243.255 cn +45.113.244.0 - 45.113.247.255 au +45.113.248.0 - 45.113.251.255 in +45.113.252.0 - 45.114.3.255 cn +45.114.8.0 - 45.114.11.255 hk +45.114.12.0 - 45.114.15.255 cn +45.114.16.0 - 45.114.19.255 jp +45.114.20.0 - 45.114.23.255 ph +45.114.24.0 - 45.114.27.255 hk +45.114.28.0 - 45.114.31.255 my +45.114.32.0 - 45.114.35.255 cn +45.114.36.0 - 45.114.39.255 in +45.114.40.0 - 45.114.43.255 cn +45.114.44.0 - 45.114.47.255 hk +45.114.48.0 - 45.114.51.255 in +45.114.52.0 - 45.114.55.255 cn +45.114.56.0 - 45.114.83.255 in +45.114.84.0 - 45.114.91.255 bd +45.114.92.0 - 45.114.95.255 hk +45.114.96.0 - 45.114.99.255 cn +45.114.100.0 - 45.114.103.255 my +45.114.104.0 - 45.114.107.255 cn +45.114.112.0 - 45.114.115.255 jp +45.114.116.0 - 45.114.116.255 au +45.114.117.0 - 45.114.117.255 sg +45.114.118.0 - 45.114.118.255 id +45.114.119.0 - 45.114.119.255 sg +45.114.120.0 - 45.114.127.255 pk +45.114.128.0 - 45.114.131.255 kr +45.114.132.0 - 45.114.135.255 pk +45.114.136.0 - 45.114.139.255 cn +45.114.140.0 - 45.114.159.255 in +45.114.160.0 - 45.114.163.255 kh +45.114.164.0 - 45.114.175.255 hk +45.114.176.0 - 45.114.179.255 in +45.114.180.0 - 45.114.183.255 bd +45.114.184.0 - 45.114.187.255 jp +45.114.188.0 - 45.114.191.255 au +45.114.192.0 - 45.114.195.255 in +45.114.196.0 - 45.114.203.255 cn +45.114.204.0 - 45.114.207.255 hk +45.114.208.0 - 45.114.211.255 jp +45.114.212.0 - 45.114.219.255 in +45.114.220.0 - 45.114.223.255 au +45.114.224.0 - 45.114.227.255 in +45.114.228.0 - 45.114.231.255 cn +45.114.232.0 - 45.114.235.255 bd +45.114.236.0 - 45.114.239.255 cn +45.114.240.0 - 45.114.251.255 in +45.114.252.0 - 45.114.255.255 cn +45.115.0.0 - 45.115.11.255 in +45.115.12.0 - 45.115.15.255 bd +45.115.16.0 - 45.115.19.255 in +45.115.20.0 - 45.115.23.255 au +45.115.24.0 - 45.115.24.255 us +45.115.25.0 - 45.115.25.255 kr +45.115.26.0 - 45.115.26.63 vn +45.115.26.64 - 45.115.26.95 id +45.115.26.96 - 45.115.31.255 hk +45.115.32.0 - 45.115.35.255 jp +45.115.36.0 - 45.115.43.255 hk +45.115.44.0 - 45.115.47.255 cn +45.115.48.0 - 45.115.48.255 au +45.115.49.0 - 45.115.49.255 pk +45.115.50.0 - 45.115.51.255 th +45.115.52.0 - 45.115.63.255 in +45.115.64.0 - 45.115.67.255 id +45.115.68.0 - 45.115.71.255 au +45.115.72.0 - 45.115.75.255 tl +45.115.76.0 - 45.115.83.255 in +45.115.84.0 - 45.115.87.255 pk +45.115.88.0 - 45.115.99.255 in +45.115.100.0 - 45.115.103.255 cn +45.115.104.0 - 45.115.111.255 in +45.115.112.0 - 45.115.115.255 bd +45.115.116.0 - 45.115.117.255 au +45.115.118.0 - 45.115.118.255 th +45.115.119.0 - 45.115.119.255 in +45.115.120.0 - 45.115.123.255 cn +45.115.124.0 - 45.115.127.255 hk +45.115.128.0 - 45.115.131.255 au +45.115.132.0 - 45.115.135.255 cn +45.115.136.0 - 45.115.139.255 id +45.115.140.0 - 45.115.143.255 in +45.115.144.0 - 45.115.147.255 cn +45.115.148.0 - 45.115.151.255 in +45.115.152.0 - 45.115.155.255 kr +45.115.156.0 - 45.115.159.255 cn +45.115.160.0 - 45.115.163.255 hk +45.115.164.0 - 45.115.167.255 cn +45.115.168.0 - 45.115.191.255 in +45.115.192.0 - 45.115.195.255 jp +45.115.196.0 - 45.115.199.255 au +45.115.200.0 - 45.115.203.255 cn +45.115.204.0 - 45.115.207.255 au +45.115.208.0 - 45.115.211.255 in +45.115.212.0 - 45.115.219.255 cn +45.115.220.0 - 45.115.223.255 in +45.115.224.0 - 45.115.227.255 bd +45.115.228.0 - 45.115.231.255 cn +45.115.232.0 - 45.115.235.255 au +45.115.236.0 - 45.115.239.255 cn +45.115.240.0 - 45.115.243.255 hk +45.115.244.0 - 45.115.251.255 cn +45.115.252.0 - 45.116.7.255 in +45.116.8.0 - 45.116.13.255 hk +45.116.14.0 - 45.116.15.255 jp +45.116.16.0 - 45.116.27.255 cn +45.116.28.0 - 45.116.31.255 in +45.116.32.0 - 45.116.39.255 cn +45.116.40.0 - 45.116.43.255 hk +45.116.44.0 - 45.116.47.255 in +45.116.48.0 - 45.116.51.255 jp +45.116.52.0 - 45.116.55.255 cn +45.116.56.0 - 45.116.59.255 in +45.116.60.0 - 45.116.67.255 cn +45.116.68.0 - 45.116.71.255 in +45.116.72.0 - 45.116.75.255 jp +45.116.76.0 - 45.116.83.255 hk +45.116.84.0 - 45.116.87.255 in +45.116.88.0 - 45.116.91.255 sg +45.116.92.0 - 45.116.95.255 jp +45.116.96.0 - 45.116.103.255 cn +45.116.104.0 - 45.116.107.255 in +45.116.108.0 - 45.116.111.255 au +45.116.112.0 - 45.116.127.255 in +45.116.128.0 - 45.116.129.255 af +45.116.130.0 - 45.116.130.255 hk +45.116.131.0 - 45.116.131.255 au +45.116.132.0 - 45.116.135.255 jp +45.116.136.0 - 45.116.139.255 sg +45.116.140.0 - 45.116.143.255 cn +45.116.144.0 - 45.116.147.255 hk +45.116.148.0 - 45.116.151.255 in +45.116.152.0 - 45.116.155.255 cn +45.116.156.0 - 45.116.159.255 id +45.116.160.0 - 45.116.167.255 in +45.116.168.0 - 45.116.171.255 hk +45.116.172.0 - 45.116.179.255 my +45.116.180.0 - 45.116.207.255 in +45.116.208.0 - 45.116.211.255 cn +45.116.212.0 - 45.116.215.255 hk +45.116.216.0 - 45.116.219.255 th +45.116.220.0 - 45.116.223.255 au +45.116.224.0 - 45.116.227.255 jp +45.116.228.0 - 45.116.231.255 in +45.116.232.0 - 45.116.235.255 pk +45.116.236.0 - 45.116.247.255 my +45.116.248.0 - 45.116.251.255 bd +45.116.252.0 - 45.117.7.255 in +45.117.8.0 - 45.117.11.255 cn +45.117.12.0 - 45.117.15.255 kr +45.117.16.0 - 45.117.19.255 jp +45.117.20.0 - 45.117.23.255 cn +45.117.24.0 - 45.117.27.255 au +45.117.28.0 - 45.117.31.255 in +45.117.32.0 - 45.117.35.255 mn +45.117.36.0 - 45.117.39.255 nz +45.117.40.0 - 45.117.43.255 cn +45.117.44.0 - 45.117.55.255 in +45.117.56.0 - 45.117.63.255 bd +45.117.64.0 - 45.117.67.255 in +45.117.68.0 - 45.117.71.255 cn +45.117.72.0 - 45.117.75.255 in +45.117.76.0 - 45.117.83.255 vn +45.117.84.0 - 45.117.87.255 au +45.117.88.0 - 45.117.91.255 pk +45.117.92.0 - 45.117.95.255 in +45.117.96.0 - 45.117.103.255 hk +45.117.104.0 - 45.117.107.255 pk +45.117.108.0 - 45.117.119.255 in +45.117.120.0 - 45.117.123.255 my +45.117.124.0 - 45.117.127.255 cn +45.117.128.0 - 45.117.139.255 in +45.117.140.0 - 45.117.143.255 jp +45.117.144.0 - 45.117.147.255 hk +45.117.148.0 - 45.117.151.255 in +45.117.152.0 - 45.117.155.255 np +45.117.156.0 - 45.117.179.255 vn +45.117.180.0 - 45.117.187.255 in +45.117.188.0 - 45.117.191.255 sg +45.117.192.0 - 45.117.195.255 hk +45.117.196.0 - 45.117.199.255 mp +45.117.200.0 - 45.117.227.255 in +45.117.228.0 - 45.117.231.255 my +45.117.232.0 - 45.117.235.255 in +45.117.236.0 - 45.117.239.255 my +45.117.240.0 - 45.117.247.255 fj +45.117.248.0 - 45.117.251.255 in +45.117.252.0 - 45.117.255.255 cn +45.118.0.0 - 45.118.35.255 in +45.118.36.0 - 45.118.39.255 ph +45.118.40.0 - 45.118.43.255 jp +45.118.44.0 - 45.118.59.255 in +45.118.60.0 - 45.118.63.255 bd +45.118.64.0 - 45.118.67.255 au +45.118.68.0 - 45.118.71.255 bd +45.118.72.0 - 45.118.111.255 in +45.118.112.0 - 45.118.115.255 id +45.118.116.0 - 45.118.123.255 in +45.118.124.0 - 45.118.127.255 hk +45.118.128.0 - 45.118.131.255 in +45.118.132.0 - 45.118.135.255 jp +45.118.136.0 - 45.118.151.255 vn +45.118.152.0 - 45.118.179.255 in +45.118.180.0 - 45.118.183.255 sg +45.118.184.0 - 45.118.187.255 au +45.118.188.0 - 45.118.191.255 nz +45.118.192.0 - 45.118.243.255 in +45.118.244.0 - 45.118.247.255 bd +45.118.248.0 - 45.119.7.255 hk +45.119.8.0 - 45.119.39.255 in +45.119.40.0 - 45.119.43.255 kr +45.119.44.0 - 45.119.51.255 in +45.119.52.0 - 45.119.55.255 cn +45.119.56.0 - 45.119.59.255 in +45.119.60.0 - 45.119.75.255 cn +45.119.76.0 - 45.119.87.255 vn +45.119.88.0 - 45.119.91.255 in +45.119.92.0 - 45.119.99.255 hk +45.119.100.0 - 45.119.103.255 nz +45.119.104.0 - 45.119.107.255 cn +45.119.108.0 - 45.119.111.255 vn +45.119.112.0 - 45.119.115.255 in +45.119.116.0 - 45.119.119.255 cn +45.119.120.0 - 45.119.123.255 bd +45.119.124.0 - 45.119.127.255 hk +45.119.128.0 - 45.119.143.255 in +45.119.144.0 - 45.119.147.255 kr +45.119.148.0 - 45.119.151.255 in +45.119.152.0 - 45.119.159.255 sg +45.119.160.0 - 45.119.163.255 cn +45.119.164.0 - 45.119.167.255 jp +45.119.168.0 - 45.119.199.255 in +45.119.200.0 - 45.119.203.255 sg +45.119.204.0 - 45.119.211.255 jp +45.119.212.0 - 45.119.219.255 vn +45.119.220.0 - 45.119.223.255 au +45.119.224.0 - 45.119.231.255 in +45.119.232.0 - 45.119.235.255 cn +45.119.236.0 - 45.119.239.255 in +45.119.240.0 - 45.119.243.255 vn +45.119.244.0 - 45.119.251.255 in +45.119.252.0 - 45.120.7.255 hk +45.120.8.0 - 45.120.27.255 in +45.120.28.0 - 45.120.31.255 hk +45.120.32.0 - 45.120.35.255 in +45.120.36.0 - 45.120.36.255 au +45.120.37.0 - 45.120.37.255 in +45.120.38.0 - 45.120.39.255 bd +45.120.40.0 - 45.120.43.255 in +45.120.48.0 - 45.120.51.255 in +45.120.52.0 - 45.120.55.255 hk +45.120.56.0 - 45.120.63.255 in +45.120.64.0 - 45.120.71.255 kr +45.120.72.0 - 45.120.75.255 in +45.120.76.0 - 45.120.83.255 hk +45.120.84.0 - 45.120.87.255 mm +45.120.88.0 - 45.120.95.255 in +45.120.96.0 - 45.120.99.255 bd +45.120.100.0 - 45.120.103.255 cn +45.120.104.0 - 45.120.107.255 au +45.120.108.0 - 45.120.111.255 ph +45.120.112.0 - 45.120.115.255 bd +45.120.116.0 - 45.120.119.255 nz +45.120.120.0 - 45.120.127.255 in +45.120.128.0 - 45.120.131.255 my +45.120.132.0 - 45.120.135.255 jp +45.120.136.0 - 45.120.139.255 nz +45.120.140.0 - 45.120.143.255 cn +45.120.144.0 - 45.120.147.255 in +45.120.148.0 - 45.120.151.255 sg +45.120.152.0 - 45.120.156.255 hk +45.120.157.0 - 45.120.157.255 jp +45.120.158.0 - 45.120.158.255 hk +45.120.159.0 - 45.120.159.255 jp +45.120.160.0 - 45.120.163.255 in +45.120.164.0 - 45.120.167.255 cn +45.120.168.0 - 45.120.171.255 hk +45.120.172.0 - 45.120.175.255 in +45.120.176.0 - 45.120.179.255 jp +45.120.180.0 - 45.120.187.255 hk +45.120.188.0 - 45.120.191.255 in +45.120.192.0 - 45.120.199.255 jp +45.120.200.0 - 45.120.200.255 kr +45.120.201.0 - 45.120.201.255 tw +45.120.202.0 - 45.120.202.255 hk +45.120.203.0 - 45.120.203.255 my +45.120.204.0 - 45.120.211.255 hk +45.120.212.0 - 45.120.215.255 in +45.120.216.0 - 45.120.219.255 hk +45.120.220.0 - 45.120.223.255 cn +45.120.224.0 - 45.120.231.255 vn +45.120.232.0 - 45.120.239.255 in +45.120.240.0 - 45.120.243.255 cn +45.120.244.0 - 45.120.247.255 id +45.120.248.0 - 45.121.19.255 in +45.121.20.0 - 45.121.23.255 hk +45.121.24.0 - 45.121.27.255 vn +45.121.28.0 - 45.121.31.255 in +45.121.32.0 - 45.121.35.255 hk +45.121.36.0 - 45.121.39.255 my +45.121.40.0 - 45.121.43.255 id +45.121.44.0 - 45.121.47.255 in +45.121.48.0 - 45.121.51.255 tw +45.121.52.0 - 45.121.55.255 cn +45.121.56.0 - 45.121.59.255 hk +45.121.60.0 - 45.121.63.255 th +45.121.64.0 - 45.121.75.255 cn +45.121.76.0 - 45.121.79.255 in +45.121.80.0 - 45.121.87.255 hk +45.121.88.0 - 45.121.91.255 lk +45.121.92.0 - 45.121.99.255 cn +45.121.100.0 - 45.121.103.255 in +45.121.104.0 - 45.121.107.255 cn +45.121.108.0 - 45.121.131.255 in +45.121.132.0 - 45.121.135.255 au +45.121.136.0 - 45.121.143.255 hk +45.121.144.0 - 45.121.147.255 my +45.121.148.0 - 45.121.151.255 jp +45.121.152.0 - 45.121.155.255 vn +45.121.156.0 - 45.121.159.255 in +45.121.160.0 - 45.121.163.255 vn +45.121.164.0 - 45.121.167.255 kr +45.121.168.0 - 45.121.171.255 in +45.121.172.0 - 45.121.179.255 cn +45.121.180.0 - 45.121.183.255 au +45.121.184.0 - 45.121.187.255 jp +45.121.188.0 - 45.121.191.255 in +45.121.192.0 - 45.121.207.255 hk +45.121.208.0 - 45.121.211.255 au +45.121.212.0 - 45.121.215.255 cn +45.121.216.0 - 45.121.219.255 id +45.121.220.0 - 45.121.235.255 in +45.121.236.0 - 45.121.239.255 kh +45.121.240.0 - 45.122.43.255 cn +45.122.44.0 - 45.122.47.255 in +45.122.48.0 - 45.122.51.255 th +45.122.52.0 - 45.122.55.255 hk +45.122.56.0 - 45.122.59.255 id +45.122.60.0 - 45.122.119.255 cn +45.122.120.0 - 45.122.131.255 in +45.122.132.0 - 45.122.139.255 hk +45.122.140.0 - 45.122.155.255 in +45.122.156.0 - 45.122.159.255 hk +45.122.160.0 - 45.122.219.255 cn +45.122.220.0 - 45.122.223.255 vn +45.122.224.0 - 45.122.227.255 jp +45.122.228.0 - 45.122.231.255 au +45.122.232.0 - 45.122.255.255 vn +45.123.0.0 - 45.123.19.255 in +45.123.20.0 - 45.123.23.255 hk +45.123.24.0 - 45.123.27.255 in +45.123.28.0 - 45.123.39.255 cn +45.123.40.0 - 45.123.43.255 bd +45.123.44.0 - 45.123.91.255 cn +45.123.92.0 - 45.123.95.255 in +45.123.96.0 - 45.123.99.255 vn +45.123.100.0 - 45.123.103.255 my +45.123.104.0 - 45.123.107.255 au +45.123.108.0 - 45.123.111.255 in +45.123.112.0 - 45.123.115.255 hk +45.123.116.0 - 45.123.119.255 tr +45.123.120.0 - 45.123.123.255 cn +45.123.124.0 - 45.123.127.255 my +45.123.128.0 - 45.123.139.255 cn +45.123.140.0 - 45.123.147.255 in +45.123.148.0 - 45.123.159.255 cn +45.123.160.0 - 45.123.163.255 in +45.123.164.0 - 45.123.187.255 cn +45.123.188.0 - 45.123.199.255 hk +45.123.200.0 - 45.123.203.255 mo +45.123.204.0 - 45.123.207.255 cn +45.123.208.0 - 45.123.211.255 jp +45.123.212.0 - 45.123.215.255 cn +45.123.216.0 - 45.123.219.255 in +45.123.220.0 - 45.123.223.255 np +45.123.224.0 - 45.124.3.255 cn +45.124.4.0 - 45.124.7.255 in +45.124.8.0 - 45.124.11.255 hk +45.124.12.0 - 45.124.15.255 bd +45.124.16.0 - 45.124.19.255 ph +45.124.20.0 - 45.124.23.255 cn +45.124.24.0 - 45.124.27.255 hk +45.124.28.0 - 45.124.39.255 cn +45.124.40.0 - 45.124.43.255 au +45.124.44.0 - 45.124.47.255 cn +45.124.48.0 - 45.124.51.255 in +45.124.52.0 - 45.124.55.255 au +45.124.56.0 - 45.124.59.255 ph +45.124.60.0 - 45.124.63.255 jp +45.124.64.0 - 45.124.67.255 hk +45.124.68.0 - 45.124.71.255 cn +45.124.72.0 - 45.124.75.255 hk +45.124.76.0 - 45.124.83.255 cn +45.124.84.0 - 45.124.95.255 vn +45.124.96.0 - 45.124.99.255 in +45.124.100.0 - 45.124.103.255 cn +45.124.104.0 - 45.124.109.255 in +45.124.110.0 - 45.124.111.255 au +45.124.112.0 - 45.124.115.255 hk +45.124.116.0 - 45.124.123.255 in +45.124.124.0 - 45.124.127.255 cn +45.124.128.0 - 45.124.131.255 in +45.124.132.0 - 45.124.135.255 hk +45.124.136.0 - 45.124.139.255 jp +45.124.140.0 - 45.124.159.255 in +45.124.160.0 - 45.124.163.255 hk +45.124.164.0 - 45.124.167.255 au +45.124.168.0 - 45.124.171.255 bd +45.124.172.0 - 45.124.179.255 cn +45.124.180.0 - 45.124.199.255 in +45.124.200.0 - 45.124.203.255 au +45.124.204.0 - 45.124.207.255 jp +45.124.208.0 - 45.124.211.255 cn +45.124.212.0 - 45.124.215.255 au +45.124.216.0 - 45.124.223.255 jp +45.124.224.0 - 45.124.247.255 in +45.124.248.0 - 45.124.255.255 cn +45.125.0.0 - 45.125.11.255 hk +45.125.12.0 - 45.125.19.255 cn +45.125.20.0 - 45.125.23.255 sg +45.125.24.0 - 45.125.35.255 cn +45.125.36.0 - 45.125.43.255 in +45.125.44.0 - 45.125.47.255 cn +45.125.48.0 - 45.125.51.255 hk +45.125.52.0 - 45.125.59.255 cn +45.125.60.0 - 45.125.63.255 in +45.125.64.0 - 45.125.64.255 jp +45.125.65.0 - 45.125.67.255 hk +45.125.68.0 - 45.125.71.255 in +45.125.76.0 - 45.125.107.255 cn +45.125.108.0 - 45.125.115.255 hk +45.125.116.0 - 45.125.119.255 in +45.125.120.0 - 45.125.127.255 au +45.125.128.0 - 45.125.135.255 in +45.125.136.0 - 45.125.139.255 cn +45.125.140.0 - 45.125.159.255 in +45.125.160.0 - 45.125.167.255 hk +45.125.168.0 - 45.125.171.255 nz +45.125.172.0 - 45.125.187.255 in +45.125.188.0 - 45.125.191.255 jp +45.125.192.0 - 45.125.199.255 sg +45.125.200.0 - 45.125.211.255 vn +45.125.212.0 - 45.125.215.255 in +45.125.216.0 - 45.125.219.255 hk +45.125.220.0 - 45.125.223.255 bd +45.125.224.0 - 45.125.227.255 af +45.125.228.0 - 45.125.231.255 th +45.125.232.0 - 45.125.235.255 kr +45.125.236.0 - 45.125.239.255 vn +45.125.240.0 - 45.125.243.255 jp +45.125.244.0 - 45.125.244.255 nz +45.125.245.0 - 45.125.245.255 au +45.125.246.0 - 45.125.246.255 in +45.125.247.0 - 45.125.247.255 au +45.125.248.0 - 45.125.251.255 ph +45.125.252.0 - 45.125.255.255 in +45.126.0.0 - 45.126.7.255 hk +45.126.8.0 - 45.126.11.255 in +45.126.12.0 - 45.126.15.255 hk +45.126.16.0 - 45.126.23.255 in +45.126.24.0 - 45.126.27.255 au +45.126.28.0 - 45.126.43.255 in +45.126.44.0 - 45.126.47.255 au +45.126.48.0 - 45.126.55.255 cn +45.126.56.0 - 45.126.59.255 id +45.126.60.0 - 45.126.63.255 sg +45.126.64.0 - 45.126.71.255 in +45.126.72.0 - 45.126.75.255 us +45.126.76.0 - 45.126.79.255 hk +45.126.80.0 - 45.126.83.255 id +45.126.84.0 - 45.126.87.255 jp +45.126.88.0 - 45.126.91.255 my +45.126.92.0 - 45.126.99.255 vn +45.126.100.0 - 45.126.103.255 cn +45.126.104.0 - 45.126.107.255 in +45.126.108.0 - 45.126.123.255 cn +45.126.124.0 - 45.126.127.255 au +45.126.128.0 - 45.126.131.255 nz +45.126.132.0 - 45.126.135.255 id +45.126.136.0 - 45.126.139.255 in +45.126.140.0 - 45.126.143.255 bn +45.126.144.0 - 45.126.147.255 in +45.126.148.0 - 45.126.151.255 kr +45.126.152.0 - 45.126.155.255 id +45.126.156.0 - 45.126.159.255 jp +45.126.160.0 - 45.126.163.255 in +45.126.164.0 - 45.126.167.255 sg +45.126.168.0 - 45.126.179.255 in +45.126.180.0 - 45.126.183.255 hk +45.126.184.0 - 45.126.187.255 id +45.126.188.0 - 45.126.191.255 in +45.126.192.0 - 45.126.195.255 au +45.126.196.0 - 45.126.207.255 in +45.126.208.0 - 45.126.211.255 sg +45.126.212.0 - 45.126.215.255 cn +45.126.216.0 - 45.126.219.255 hk +45.126.220.0 - 45.126.223.255 cn +45.126.224.0 - 45.126.227.255 th +45.126.228.0 - 45.126.231.255 hk +45.126.232.0 - 45.126.239.255 in +45.126.240.0 - 45.126.243.255 hk +45.126.244.0 - 45.126.252.255 in +45.126.253.0 - 45.126.253.255 af +45.126.254.0 - 45.126.255.255 in +45.127.0.0 - 45.127.3.255 hk +45.127.4.0 - 45.127.7.255 my +45.127.8.0 - 45.127.15.255 cn +45.127.16.0 - 45.127.27.255 in +45.127.28.0 - 45.127.31.255 jp +45.127.32.0 - 45.127.35.255 sg +45.127.36.0 - 45.127.39.255 cn +45.127.40.0 - 45.127.47.255 in +45.127.48.0 - 45.127.51.255 bd +45.127.52.0 - 45.127.91.255 in +45.127.92.0 - 45.127.95.255 hk +45.127.96.0 - 45.127.99.255 cn +45.127.100.0 - 45.127.111.255 in +45.127.112.0 - 45.127.115.255 us +45.127.116.0 - 45.127.119.255 cn +45.127.120.0 - 45.127.123.255 in +45.127.124.0 - 45.127.131.255 cn +45.127.132.0 - 45.127.135.255 id +45.127.136.0 - 45.127.139.255 in +45.127.140.0 - 45.127.143.255 au +45.127.144.0 - 45.127.151.255 cn +45.127.152.0 - 45.127.155.255 kh +45.127.156.0 - 45.127.159.255 cn +45.127.160.0 - 45.127.163.255 hk +45.127.164.0 - 45.127.167.255 ph +45.127.168.0 - 45.127.171.255 sg +45.127.172.0 - 45.127.175.255 au +45.127.176.0 - 45.127.179.255 hk +45.127.180.0 - 45.127.183.255 au +45.127.184.0 - 45.127.187.255 hk +45.127.188.0 - 45.127.203.255 in +45.127.204.0 - 45.127.207.255 hk +45.127.208.0 - 45.127.215.255 in +45.127.216.0 - 45.127.219.255 cn +45.127.220.0 - 45.127.243.255 in +45.127.244.0 - 45.127.251.255 bd +45.127.252.0 - 45.127.255.255 vn +45.192.0.0 - 45.207.255.255 za +45.208.0.0 - 45.211.255.255 gh +45.212.0.0 - 45.215.255.255 zm +45.216.0.0 - 45.219.255.255 ma +45.240.0.0 - 45.247.255.255 eg 46.0.0.0 - 46.0.255.255 ru 46.1.0.0 - 46.2.255.255 tr 46.3.0.0 - 46.3.255.255 ru -46.4.0.0 - 46.4.131.31 de -46.4.131.32 - 46.4.131.47 it -46.4.131.48 - 46.4.142.143 de -46.4.142.144 - 46.4.142.151 tr -46.4.142.152 - 46.4.159.31 de -46.4.159.32 - 46.4.159.63 es -46.4.159.64 - 46.4.170.127 de -46.4.170.128 - 46.4.170.135 it -46.4.170.136 - 46.4.242.63 de -46.4.242.64 - 46.4.242.71 it -46.4.242.72 - 46.4.242.95 de -46.4.242.96 - 46.4.242.127 eg -46.4.242.128 - 46.5.255.255 de +46.4.0.0 - 46.5.255.255 de 46.6.0.0 - 46.6.255.255 es 46.7.0.0 - 46.7.255.255 ie -46.8.0.0 - 46.8.255.255 ru +46.8.0.0 - 46.8.31.255 gb +46.8.32.0 - 46.8.33.255 ru +46.8.34.0 - 46.8.34.255 ua +46.8.35.0 - 46.8.35.255 uz +46.8.36.0 - 46.8.36.255 ru +46.8.37.0 - 46.8.37.255 gr +46.8.38.0 - 46.8.40.255 ru +46.8.41.0 - 46.8.41.255 lb +46.8.42.0 - 46.8.79.255 ru +46.8.80.0 - 46.8.95.255 ua +46.8.96.0 - 46.8.248.255 ru +46.8.249.0 - 46.8.249.255 nl +46.8.250.0 - 46.8.253.255 ru +46.8.254.0 - 46.8.254.255 us +46.8.255.0 - 46.8.255.255 ru 46.9.0.0 - 46.9.255.255 no 46.10.0.0 - 46.10.255.255 bg 46.11.0.0 - 46.11.255.255 mt @@ -3363,13 +9585,9 @@ 46.15.0.0 - 46.15.255.255 no 46.16.0.0 - 46.16.7.255 gb 46.16.8.0 - 46.16.15.255 ru -46.16.16.0 - 46.16.22.63 bz -46.16.22.64 - 46.16.22.127 ni -46.16.22.128 - 46.16.23.63 bz -46.16.23.64 - 46.16.23.127 ni -46.16.23.128 - 46.16.23.255 bz +46.16.16.0 - 46.16.23.255 gl 46.16.24.0 - 46.16.31.255 ru -46.16.32.0 - 46.16.39.255 gb +46.16.32.0 - 46.16.39.255 a1 46.16.40.0 - 46.16.47.255 fr 46.16.48.0 - 46.16.55.255 no 46.16.56.0 - 46.16.63.255 es @@ -3386,20 +9604,17 @@ 46.16.144.0 - 46.16.151.255 kz 46.16.152.0 - 46.16.159.255 ch 46.16.160.0 - 46.16.167.255 gb -46.16.168.0 - 46.16.172.255 it -46.16.173.0 - 46.16.174.255 us -46.16.175.0 - 46.16.175.255 it +46.16.168.0 - 46.16.175.255 it 46.16.176.0 - 46.16.183.255 ru -46.16.184.0 - 46.16.186.0 gb -46.16.186.1 - 46.16.186.63 jo -46.16.186.64 - 46.16.191.255 gb +46.16.184.0 - 46.16.191.255 nl 46.16.192.0 - 46.16.199.255 bg 46.16.200.0 - 46.16.207.255 ch 46.16.208.0 - 46.16.215.255 gb 46.16.216.0 - 46.16.223.255 de 46.16.224.0 - 46.16.231.255 ru 46.16.232.0 - 46.16.239.255 se -46.16.240.0 - 46.16.247.255 ua +46.16.240.0 - 46.16.246.255 be +46.16.247.0 - 46.16.247.255 es 46.16.248.0 - 46.17.15.255 nl 46.17.16.0 - 46.17.23.255 no 46.17.24.0 - 46.17.31.255 nl @@ -3407,22 +9622,11 @@ 46.17.40.0 - 46.17.55.255 ru 46.17.56.0 - 46.17.63.255 gb 46.17.64.0 - 46.17.71.255 fr -46.17.72.0 - 46.17.72.63 gb -46.17.72.64 - 46.17.72.255 lb -46.17.73.0 - 46.17.73.63 gb -46.17.73.64 - 46.17.75.255 lb -46.17.76.0 - 46.17.76.63 gb -46.17.76.64 - 46.17.76.255 lb -46.17.77.0 - 46.17.77.63 gb -46.17.77.64 - 46.17.79.255 lb +46.17.72.0 - 46.17.79.255 lb 46.17.80.0 - 46.17.87.255 fr 46.17.88.0 - 46.17.95.255 gb -46.17.96.0 - 46.17.103.255 ru -46.17.104.0 - 46.17.104.127 de -46.17.104.128 - 46.17.104.221 gb -46.17.104.222 - 46.17.104.255 de -46.17.105.0 - 46.17.105.31 gb -46.17.105.32 - 46.17.111.255 de +46.17.96.0 - 46.17.103.255 nl +46.17.104.0 - 46.17.111.255 gb 46.17.112.0 - 46.17.119.255 pl 46.17.120.0 - 46.17.127.255 rs 46.17.128.0 - 46.17.135.255 tr @@ -3441,9 +9645,7 @@ 46.17.240.0 - 46.17.247.255 ua 46.17.248.0 - 46.17.255.255 ru 46.18.0.0 - 46.18.7.255 ua -46.18.8.0 - 46.18.9.32 gb -46.18.9.33 - 46.18.9.40 ie -46.18.9.41 - 46.18.15.255 gb +46.18.8.0 - 46.18.15.255 gb 46.18.16.0 - 46.18.23.255 ps 46.18.24.0 - 46.18.31.255 it 46.18.32.0 - 46.18.39.255 be @@ -3452,7 +9654,8 @@ 46.18.56.0 - 46.18.63.255 de 46.18.64.0 - 46.18.71.255 az 46.18.72.0 - 46.18.79.255 es -46.18.80.0 - 46.18.87.255 gb +46.18.80.0 - 46.18.80.255 us +46.18.81.0 - 46.18.87.255 gb 46.18.88.0 - 46.18.103.255 fr 46.18.104.0 - 46.18.119.255 gb 46.18.120.0 - 46.18.135.255 fr @@ -3468,10 +9671,7 @@ 46.18.216.0 - 46.18.223.255 gb 46.18.224.0 - 46.18.231.255 fr 46.18.232.0 - 46.18.239.255 it -46.18.240.0 - 46.18.245.255 de -46.18.246.0 - 46.18.246.255 nl -46.18.247.0 - 46.18.247.127 us -46.18.247.128 - 46.18.247.255 de +46.18.240.0 - 46.18.247.255 de 46.18.248.0 - 46.18.255.255 ir 46.19.0.0 - 46.19.7.255 be 46.19.8.0 - 46.19.15.255 si @@ -3489,7 +9689,10 @@ 46.19.104.0 - 46.19.111.255 ro 46.19.112.0 - 46.19.119.255 ru 46.19.120.0 - 46.19.135.255 fr -46.19.136.0 - 46.19.143.255 ch +46.19.136.0 - 46.19.136.255 ch +46.19.137.0 - 46.19.137.255 a1 +46.19.138.0 - 46.19.142.255 ch +46.19.143.0 - 46.19.143.255 a1 46.19.144.0 - 46.19.151.255 lv 46.19.152.0 - 46.19.159.255 de 46.19.160.0 - 46.19.167.255 gb @@ -3500,31 +9703,15 @@ 46.19.200.0 - 46.19.207.255 lv 46.19.208.0 - 46.19.215.255 ie 46.19.216.0 - 46.19.223.255 nl -46.19.224.0 - 46.19.224.191 al -46.19.224.192 - 46.19.224.255 rs -46.19.225.0 - 46.19.227.255 al -46.19.228.0 - 46.19.230.255 rs -46.19.231.0 - 46.19.231.255 al +46.19.224.0 - 46.19.229.127 al +46.19.229.128 - 46.19.229.255 rs +46.19.230.0 - 46.19.231.255 al 46.19.232.0 - 46.19.239.255 it 46.19.240.0 - 46.19.247.255 be 46.19.248.0 - 46.19.255.255 dk -46.20.0.0 - 46.20.0.255 tr -46.20.1.0 - 46.20.1.255 us -46.20.2.0 - 46.20.3.0 tr -46.20.3.1 - 46.20.3.12 us -46.20.3.13 - 46.20.9.104 tr -46.20.9.105 - 46.20.9.110 us -46.20.9.111 - 46.20.9.128 tr -46.20.9.129 - 46.20.9.255 us -46.20.10.0 - 46.20.11.112 tr -46.20.11.113 - 46.20.11.118 gb -46.20.11.119 - 46.20.15.255 tr +46.20.0.0 - 46.20.15.255 tr 46.20.16.0 - 46.20.31.255 at -46.20.32.0 - 46.20.33.127 de -46.20.33.128 - 46.20.33.159 na -46.20.33.160 - 46.20.41.127 de -46.20.41.128 - 46.20.41.191 es -46.20.41.192 - 46.20.47.255 de +46.20.32.0 - 46.20.47.255 de 46.20.48.0 - 46.20.63.255 pl 46.20.64.0 - 46.20.79.255 ru 46.20.80.0 - 46.20.95.255 it @@ -3537,46 +9724,36 @@ 46.20.192.0 - 46.20.207.255 tj 46.20.208.0 - 46.20.223.255 ps 46.20.224.0 - 46.20.239.255 gb -46.20.240.0 - 46.20.255.255 ch +46.20.240.0 - 46.20.244.127 ch +46.20.244.128 - 46.20.244.255 gb +46.20.245.0 - 46.20.245.127 ch +46.20.245.128 - 46.20.245.191 gb +46.20.245.192 - 46.20.246.223 ch +46.20.246.224 - 46.20.246.255 ru +46.20.247.0 - 46.20.247.255 fr +46.20.248.0 - 46.20.255.255 ch 46.21.0.0 - 46.21.15.255 de 46.21.16.0 - 46.21.23.255 it -46.21.24.0 - 46.21.25.255 ch -46.21.26.0 - 46.21.31.255 it +46.21.24.0 - 46.21.27.255 ch +46.21.28.0 - 46.21.31.255 it 46.21.32.0 - 46.21.47.255 dk 46.21.48.0 - 46.21.63.255 cy 46.21.64.0 - 46.21.79.255 ru 46.21.80.0 - 46.21.95.255 ir -46.21.96.0 - 46.21.99.255 se -46.21.100.0 - 46.21.103.255 us -46.21.104.0 - 46.21.106.255 se -46.21.107.0 - 46.21.107.255 us -46.21.108.0 - 46.21.111.255 se -46.21.112.0 - 46.21.116.255 fr -46.21.117.0 - 46.21.119.255 de -46.21.120.0 - 46.21.125.255 fr -46.21.126.0 - 46.21.127.255 es -46.21.128.0 - 46.21.143.255 fr -46.21.144.0 - 46.21.149.255 nl -46.21.150.0 - 46.21.152.103 us -46.21.152.104 - 46.21.152.111 nl -46.21.152.112 - 46.21.152.255 us -46.21.153.0 - 46.21.153.255 nl -46.21.154.0 - 46.21.157.255 us -46.21.158.0 - 46.21.158.31 nl -46.21.158.32 - 46.21.159.255 us -46.21.160.0 - 46.21.168.143 nl -46.21.168.144 - 46.21.168.159 be -46.21.168.160 - 46.21.169.143 nl -46.21.169.144 - 46.21.169.151 be -46.21.169.152 - 46.21.169.159 nl -46.21.169.160 - 46.21.169.191 be -46.21.169.192 - 46.21.171.255 nl -46.21.172.0 - 46.21.172.63 be -46.21.172.64 - 46.21.172.127 gb -46.21.172.128 - 46.21.172.255 nl -46.21.173.0 - 46.21.173.127 gb -46.21.173.128 - 46.21.173.255 be -46.21.174.0 - 46.21.175.255 nl +46.21.96.0 - 46.21.111.255 se +46.21.112.0 - 46.21.143.255 fr +46.21.144.0 - 46.21.149.127 nl +46.21.149.128 - 46.21.149.255 pl +46.21.150.0 - 46.21.152.95 us +46.21.152.96 - 46.21.152.103 nl +46.21.152.104 - 46.21.154.39 us +46.21.154.40 - 46.21.154.47 nl +46.21.154.48 - 46.21.155.255 us +46.21.156.0 - 46.21.157.31 nl +46.21.157.32 - 46.21.157.255 us +46.21.158.0 - 46.21.158.255 nl +46.21.159.0 - 46.21.159.255 us +46.21.160.0 - 46.21.175.255 nl 46.21.176.0 - 46.21.191.255 it 46.21.192.0 - 46.21.207.255 fr 46.21.208.0 - 46.21.223.255 pl @@ -3585,7 +9762,15 @@ 46.22.16.0 - 46.22.31.255 ch 46.22.32.0 - 46.22.47.255 de 46.22.48.0 - 46.22.63.255 ru -46.22.64.0 - 46.22.79.255 us +46.22.64.0 - 46.22.65.255 us +46.22.66.0 - 46.22.67.255 es +46.22.68.0 - 46.22.68.255 fr +46.22.69.0 - 46.22.69.255 us +46.22.70.0 - 46.22.70.255 nl +46.22.71.0 - 46.22.71.255 sg +46.22.72.0 - 46.22.73.255 nl +46.22.74.0 - 46.22.75.255 gb +46.22.76.0 - 46.22.79.255 us 46.22.80.0 - 46.22.95.255 fr 46.22.96.0 - 46.22.111.255 is 46.22.112.0 - 46.22.127.255 se @@ -3611,7 +9796,8 @@ 46.23.176.0 - 46.23.191.255 ru 46.23.192.0 - 46.23.207.255 it 46.23.208.0 - 46.23.223.255 de -46.23.224.0 - 46.23.239.255 ru +46.23.224.0 - 46.23.231.255 gb +46.23.232.0 - 46.23.239.255 de 46.23.240.0 - 46.23.255.255 fr 46.24.0.0 - 46.27.255.255 es 46.28.0.0 - 46.28.7.255 it @@ -3622,9 +9808,7 @@ 46.28.40.0 - 46.28.47.255 be 46.28.48.0 - 46.28.55.255 gb 46.28.56.0 - 46.28.63.255 lv -46.28.64.0 - 46.28.65.255 ua -46.28.66.0 - 46.28.66.15 hk -46.28.66.16 - 46.28.71.255 ua +46.28.64.0 - 46.28.71.255 ua 46.28.72.0 - 46.28.79.255 ir 46.28.80.0 - 46.28.87.255 de 46.28.88.0 - 46.28.95.255 ru @@ -3648,15 +9832,11 @@ 46.28.232.0 - 46.28.239.255 tr 46.28.240.0 - 46.28.247.255 pl 46.28.248.0 - 46.28.255.255 gb -46.29.0.0 - 46.29.4.255 sk -46.29.5.0 - 46.29.5.15 cz -46.29.5.16 - 46.29.7.255 sk +46.29.0.0 - 46.29.3.255 sk +46.29.4.0 - 46.29.7.255 tr 46.29.8.0 - 46.29.15.255 ru 46.29.16.0 - 46.29.23.255 pl -46.29.24.0 - 46.29.31.255 de -46.29.32.0 - 46.29.33.7 at -46.29.33.8 - 46.29.33.15 it -46.29.33.16 - 46.29.39.255 at +46.29.32.0 - 46.29.39.255 at 46.29.40.0 - 46.29.47.255 de 46.29.48.0 - 46.29.55.255 es 46.29.56.0 - 46.29.63.255 gb @@ -3665,21 +9845,13 @@ 46.29.80.0 - 46.29.87.255 sa 46.29.88.0 - 46.29.95.255 gb 46.29.96.0 - 46.29.103.255 de -46.29.104.0 - 46.29.104.255 it -46.29.105.0 - 46.29.105.63 gb -46.29.105.64 - 46.29.108.255 it -46.29.109.0 - 46.29.109.255 a2 -46.29.110.0 - 46.29.111.255 it +46.29.104.0 - 46.29.111.255 it 46.29.112.0 - 46.29.119.255 ru -46.29.120.0 - 46.29.123.255 fr -46.29.124.0 - 46.29.124.15 gb -46.29.124.16 - 46.29.124.31 be -46.29.124.32 - 46.29.124.47 nl -46.29.124.48 - 46.29.127.255 fr +46.29.120.0 - 46.29.127.255 fr 46.29.128.0 - 46.29.135.255 ua 46.29.136.0 - 46.29.143.255 hu 46.29.144.0 - 46.29.151.255 pl -46.29.152.0 - 46.29.159.255 ru +46.29.152.0 - 46.29.167.255 ru 46.29.168.0 - 46.29.175.255 mk 46.29.176.0 - 46.29.183.255 lu 46.29.184.0 - 46.29.191.255 cz @@ -3700,9 +9872,7 @@ 46.30.48.0 - 46.30.55.255 gb 46.30.56.0 - 46.30.63.255 de 46.30.64.0 - 46.30.71.255 cz -46.30.72.0 - 46.30.82.63 de -46.30.82.64 - 46.30.82.71 at -46.30.82.72 - 46.30.87.255 de +46.30.72.0 - 46.30.87.255 de 46.30.88.0 - 46.30.95.255 cz 46.30.96.0 - 46.30.103.255 gb 46.30.104.0 - 46.30.111.255 es @@ -3715,7 +9885,6 @@ 46.30.160.0 - 46.30.167.255 ua 46.30.168.0 - 46.30.175.255 it 46.30.176.0 - 46.30.183.255 tr -46.30.184.0 - 46.30.191.255 nl 46.30.192.0 - 46.30.199.255 gb 46.30.200.0 - 46.30.207.255 fr 46.30.208.0 - 46.30.215.255 dk @@ -3728,20 +9897,10 @@ 46.31.16.0 - 46.31.23.255 dk 46.31.24.0 - 46.31.31.255 ru 46.31.32.0 - 46.31.39.255 pl -46.31.40.0 - 46.31.42.223 fr -46.31.42.224 - 46.31.42.231 gb -46.31.42.232 - 46.31.42.239 it -46.31.42.240 - 46.31.42.247 es -46.31.42.248 - 46.31.42.255 de -46.31.43.0 - 46.31.47.255 fr +46.31.40.0 - 46.31.47.255 fr 46.31.48.0 - 46.31.55.255 nl 46.31.56.0 - 46.31.63.255 es -46.31.64.0 - 46.31.65.255 gb -46.31.66.0 - 46.31.66.255 cy -46.31.67.0 - 46.31.67.255 gb -46.31.68.0 - 46.31.68.255 sg -46.31.69.0 - 46.31.70.255 us -46.31.71.0 - 46.31.71.255 gb +46.31.64.0 - 46.31.71.255 cy 46.31.72.0 - 46.31.79.255 iq 46.31.80.0 - 46.31.87.255 gb 46.31.88.0 - 46.31.95.255 be @@ -3758,10 +9917,18 @@ 46.31.176.0 - 46.31.183.255 hu 46.31.184.0 - 46.31.191.255 no 46.31.192.0 - 46.31.199.255 fr -46.31.200.0 - 46.31.207.255 gb +46.31.200.0 - 46.31.202.255 gb +46.31.203.0 - 46.31.204.255 im +46.31.205.0 - 46.31.207.255 gb 46.31.208.0 - 46.31.215.255 fr 46.31.216.0 - 46.31.223.255 de -46.31.224.0 - 46.31.247.255 gb +46.31.224.0 - 46.31.231.255 gb +46.31.232.0 - 46.31.239.255 eu +46.31.240.0 - 46.31.242.255 gb +46.31.243.0 - 46.31.243.255 je +46.31.244.0 - 46.31.244.255 gb +46.31.245.0 - 46.31.245.255 gg +46.31.246.0 - 46.31.247.255 gb 46.31.248.0 - 46.31.255.255 it 46.32.0.0 - 46.32.31.255 ir 46.32.32.0 - 46.32.63.255 dk @@ -3773,49 +9940,45 @@ 46.32.224.0 - 46.33.31.255 gb 46.33.32.0 - 46.33.63.255 ua 46.33.64.0 - 46.33.77.255 de -46.33.78.0 - 46.33.95.255 fr +46.33.78.0 - 46.33.80.248 fr +46.33.80.249 - 46.33.80.249 us +46.33.80.250 - 46.33.82.112 fr +46.33.82.113 - 46.33.82.113 gb +46.33.82.114 - 46.33.84.17 fr +46.33.84.18 - 46.33.84.18 us +46.33.84.19 - 46.33.89.255 fr +46.33.90.0 - 46.33.90.0 de +46.33.90.1 - 46.33.90.9 fr +46.33.90.10 - 46.33.90.10 ie +46.33.90.11 - 46.33.92.55 fr +46.33.92.56 - 46.33.92.63 gb +46.33.92.64 - 46.33.95.255 fr 46.33.96.0 - 46.33.127.255 cz 46.33.128.0 - 46.33.159.255 gb 46.33.160.0 - 46.33.191.255 fr 46.33.192.0 - 46.33.223.255 me 46.33.224.0 - 46.33.255.255 ua 46.34.0.0 - 46.34.31.255 gb -46.34.32.0 - 46.34.80.255 es -46.34.81.0 - 46.34.81.255 nl -46.34.82.0 - 46.34.83.255 es +46.34.32.0 - 46.34.79.255 es +46.34.80.0 - 46.34.80.183 nl +46.34.80.184 - 46.34.80.184 gb +46.34.80.185 - 46.34.80.255 nl +46.34.81.0 - 46.34.83.255 es 46.34.84.0 - 46.34.87.255 nl -46.34.88.0 - 46.34.89.255 es -46.34.90.0 - 46.34.90.63 tr -46.34.90.64 - 46.34.90.111 es -46.34.90.112 - 46.34.90.191 tr -46.34.90.192 - 46.34.90.239 es -46.34.90.240 - 46.34.90.255 tr -46.34.91.0 - 46.34.91.255 es -46.34.92.0 - 46.34.93.255 be -46.34.94.0 - 46.34.94.255 es -46.34.95.0 - 46.34.95.31 be -46.34.95.32 - 46.34.95.255 es +46.34.88.0 - 46.34.88.127 es +46.34.88.128 - 46.34.88.154 nl +46.34.88.155 - 46.34.88.155 eu +46.34.88.156 - 46.34.88.255 nl +46.34.89.0 - 46.34.95.255 es 46.34.96.0 - 46.34.127.255 ir 46.34.128.0 - 46.34.159.255 ru 46.34.160.0 - 46.34.191.255 ir -46.34.192.0 - 46.34.223.255 ro +46.34.192.0 - 46.34.223.255 kz 46.34.224.0 - 46.34.255.255 sk 46.35.0.0 - 46.35.31.255 fr -46.35.32.0 - 46.35.38.127 de -46.35.38.128 - 46.35.38.255 us -46.35.39.0 - 46.35.39.255 de -46.35.40.0 - 46.35.47.255 us -46.35.48.0 - 46.35.49.119 de -46.35.49.120 - 46.35.49.127 hr -46.35.49.128 - 46.35.52.207 de -46.35.52.208 - 46.35.52.215 za -46.35.52.216 - 46.35.55.255 de -46.35.56.0 - 46.35.56.15 es -46.35.56.16 - 46.35.59.207 de -46.35.59.208 - 46.35.59.223 cz -46.35.59.224 - 46.35.60.47 de -46.35.60.48 - 46.35.60.55 gi -46.35.60.56 - 46.35.63.255 de +46.35.32.0 - 46.35.39.255 de +46.35.40.0 - 46.35.46.255 us +46.35.47.0 - 46.35.63.255 de 46.35.64.0 - 46.35.95.255 ye 46.35.96.0 - 46.35.127.255 es 46.35.128.0 - 46.35.159.255 ba @@ -3828,251 +9991,130 @@ 46.36.96.0 - 46.36.127.255 ir 46.36.128.0 - 46.36.159.255 kz 46.36.160.0 - 46.36.191.255 ba -46.36.192.0 - 46.36.192.31 va -46.36.192.32 - 46.36.192.64 li -46.36.192.65 - 46.36.192.96 im -46.36.192.97 - 46.36.192.130 is -46.36.192.131 - 46.36.192.163 ru -46.36.192.164 - 46.36.192.196 ae -46.36.192.197 - 46.36.192.228 dk -46.36.192.229 - 46.36.192.255 at -46.36.193.0 - 46.36.193.31 gi -46.36.193.32 - 46.36.193.62 cy -46.36.193.63 - 46.36.193.95 ch -46.36.193.96 - 46.36.193.128 gr -46.36.193.129 - 46.36.193.161 il -46.36.193.162 - 46.36.193.192 bg -46.36.193.193 - 46.36.193.224 no -46.36.193.225 - 46.36.193.229 br -46.36.193.230 - 46.36.193.233 ca -46.36.193.234 - 46.36.193.255 cr -46.36.194.0 - 46.36.194.31 pa -46.36.194.32 - 46.36.194.39 cu -46.36.194.40 - 46.36.194.50 bs -46.36.194.51 - 46.36.194.60 ky -46.36.194.61 - 46.36.194.70 jm -46.36.194.71 - 46.36.194.80 pr -46.36.194.81 - 46.36.194.90 vg -46.36.194.91 - 46.36.194.100 co -46.36.194.101 - 46.36.194.110 gt -46.36.194.111 - 46.36.194.120 cn -46.36.194.121 - 46.36.194.130 eg -46.36.194.131 - 46.36.194.140 fj -46.36.194.141 - 46.36.194.150 in -46.36.194.151 - 46.36.194.160 mh -46.36.194.161 - 46.36.194.170 jp -46.36.194.171 - 46.36.194.180 mx -46.36.194.181 - 46.36.194.190 nz -46.36.194.191 - 46.36.194.200 my -46.36.194.201 - 46.36.194.210 pe -46.36.194.211 - 46.36.194.220 ph -46.36.194.221 - 46.36.194.230 sa -46.36.194.231 - 46.36.194.240 sc -46.36.194.241 - 46.36.194.250 sg -46.36.194.251 - 46.36.194.253 by -46.36.194.254 - 46.36.194.255 va -46.36.195.0 - 46.36.195.10 aq -46.36.195.11 - 46.36.195.20 kr -46.36.195.21 - 46.36.195.30 th -46.36.195.31 - 46.36.195.40 qa -46.36.195.41 - 46.36.195.50 vi -46.36.195.51 - 46.36.195.60 bm -46.36.195.61 - 46.36.195.70 bb -46.36.195.71 - 46.36.195.80 aw -46.36.195.81 - 46.36.195.90 bz -46.36.195.91 - 46.36.195.100 mc -46.36.195.101 - 46.36.195.110 gb -46.36.195.111 - 46.36.195.120 tr -46.36.195.121 - 46.36.195.130 mt -46.36.195.131 - 46.36.195.140 se -46.36.195.141 - 46.36.195.150 us -46.36.195.151 - 46.36.195.160 hk -46.36.195.161 - 46.36.195.170 ie -46.36.195.171 - 46.36.195.180 pk -46.36.195.181 - 46.36.195.185 kw -46.36.195.186 - 46.36.195.190 jo -46.36.195.191 - 46.36.195.195 om -46.36.195.196 - 46.36.195.200 id -46.36.195.201 - 46.36.195.205 tw -46.36.195.206 - 46.36.195.210 ai -46.36.195.211 - 46.36.195.215 kn -46.36.195.216 - 46.36.195.220 gd -46.36.195.221 - 46.36.195.225 do -46.36.195.226 - 46.36.195.230 py -46.36.195.231 - 46.36.195.235 ee -46.36.195.236 - 46.36.195.240 lu -46.36.195.241 - 46.36.195.245 sk -46.36.195.246 - 46.36.195.250 si -46.36.195.251 - 46.36.195.253 lc -46.36.195.254 - 46.36.196.0 va -46.36.196.1 - 46.36.196.10 au -46.36.196.11 - 46.36.196.20 gl -46.36.196.21 - 46.36.196.30 hu -46.36.196.31 - 46.36.196.40 mk -46.36.196.41 - 46.36.196.50 ps -46.36.196.51 - 46.36.196.60 uz -46.36.196.61 - 46.36.196.70 ms -46.36.196.71 - 46.36.196.80 us -46.36.196.81 - 46.36.196.90 mn -46.36.196.91 - 46.36.196.110 us -46.36.196.111 - 46.36.196.120 tw -46.36.196.121 - 46.36.196.130 do -46.36.196.131 - 46.36.196.140 py -46.36.196.141 - 46.36.196.150 ee -46.36.196.151 - 46.36.196.160 sk -46.36.196.161 - 46.36.196.170 lc -46.36.196.171 - 46.36.196.180 ve -46.36.196.181 - 46.36.196.190 tc -46.36.196.191 - 46.36.196.220 us -46.36.196.221 - 46.36.196.230 pa -46.36.196.231 - 46.36.196.240 ru -46.36.196.241 - 46.36.196.250 hk -46.36.196.251 - 46.36.197.0 va -46.36.197.1 - 46.36.197.10 us -46.36.197.11 - 46.36.197.20 cl -46.36.197.21 - 46.36.197.30 gr -46.36.197.31 - 46.36.197.40 ag -46.36.197.41 - 46.36.197.50 am -46.36.197.51 - 46.36.197.60 gb -46.36.197.61 - 46.36.197.70 ro -46.36.197.71 - 46.36.197.80 ua -46.36.197.81 - 46.36.197.90 au -46.36.197.91 - 46.36.197.100 pg -46.36.197.101 - 46.36.197.110 za -46.36.197.111 - 46.36.197.120 sn -46.36.197.121 - 46.36.197.130 ma -46.36.197.131 - 46.36.197.140 bh -46.36.197.141 - 46.36.197.150 je -46.36.197.151 - 46.36.197.160 tv -46.36.197.161 - 46.36.197.170 pf -46.36.197.171 - 46.36.197.180 sb -46.36.197.181 - 46.36.197.190 vu -46.36.197.191 - 46.36.197.200 an -46.36.197.201 - 46.36.197.205 ar -46.36.197.206 - 46.36.197.210 es -46.36.197.211 - 46.36.197.215 ge -46.36.197.216 - 46.36.197.220 rs -46.36.197.221 - 46.36.197.225 de -46.36.197.226 - 46.36.197.230 it -46.36.197.231 - 46.36.197.235 be -46.36.197.236 - 46.36.197.240 fr -46.36.197.241 - 46.36.197.245 cz -46.36.197.246 - 46.36.197.250 lt -46.36.197.251 - 46.36.197.253 pl -46.36.197.254 - 46.36.198.0 va -46.36.198.1 - 46.36.198.20 gb -46.36.198.21 - 46.36.198.30 au -46.36.198.31 - 46.36.198.35 it -46.36.198.36 - 46.36.198.40 nz -46.36.198.41 - 46.36.198.45 pl -46.36.198.46 - 46.36.198.50 nl -46.36.198.51 - 46.36.198.55 ca -46.36.198.56 - 46.36.198.60 us -46.36.198.61 - 46.36.198.65 gb -46.36.198.66 - 46.36.198.70 iq -46.36.198.71 - 46.36.198.75 lt -46.36.198.76 - 46.36.198.80 er -46.36.198.81 - 46.36.198.85 ke -46.36.198.86 - 46.36.198.90 de -46.36.198.91 - 46.36.198.95 tn -46.36.198.96 - 46.36.198.100 tt -46.36.198.101 - 46.36.198.105 bo -46.36.198.106 - 46.36.198.110 ch -46.36.198.111 - 46.36.198.115 au -46.36.198.116 - 46.36.198.120 al -46.36.198.121 - 46.36.198.125 ad -46.36.198.126 - 46.36.198.130 hr -46.36.198.131 - 46.36.198.135 me -46.36.198.136 - 46.36.198.140 sy -46.36.198.141 - 46.36.198.145 us -46.36.198.146 - 46.36.198.150 ht -46.36.198.151 - 46.36.198.155 ec -46.36.198.156 - 46.36.198.160 sh -46.36.198.161 - 46.36.198.165 zm -46.36.198.166 - 46.36.198.170 kh -46.36.198.171 - 46.36.198.175 vn -46.36.198.176 - 46.36.198.180 fm -46.36.198.181 - 46.36.198.185 us -46.36.198.186 - 46.36.198.190 gb -46.36.198.191 - 46.36.198.195 so -46.36.198.196 - 46.36.198.200 fi -46.36.198.201 - 46.36.198.205 dz -46.36.198.206 - 46.36.198.210 mo -46.36.198.211 - 46.36.198.215 mr -46.36.198.216 - 46.36.198.220 cm -46.36.198.221 - 46.36.198.225 sv -46.36.198.226 - 46.36.198.230 hn -46.36.198.231 - 46.36.198.235 us -46.36.198.236 - 46.36.198.240 uy -46.36.198.241 - 46.36.198.245 lv -46.36.198.246 - 46.36.198.250 md -46.36.198.251 - 46.36.198.253 gb -46.36.198.254 - 46.36.199.0 va -46.36.199.1 - 46.36.199.5 lk -46.36.199.6 - 46.36.199.10 ie -46.36.199.11 - 46.36.199.20 eh -46.36.199.21 - 46.36.199.30 na -46.36.199.31 - 46.36.199.40 cx -46.36.199.41 - 46.36.199.60 gb -46.36.199.61 - 46.36.199.70 ch -46.36.199.71 - 46.36.199.90 us -46.36.199.91 - 46.36.199.100 pt -46.36.199.101 - 46.36.199.110 ae -46.36.199.111 - 46.36.199.120 io -46.36.199.121 - 46.36.199.130 gb -46.36.199.131 - 46.36.199.140 re -46.36.199.141 - 46.36.199.150 tk -46.36.199.151 - 46.36.199.160 cv -46.36.199.161 - 46.36.199.170 az -46.36.199.171 - 46.36.199.190 us -46.36.199.191 - 46.36.199.200 mx -46.36.199.201 - 46.36.199.210 gb -46.36.199.211 - 46.36.199.220 zw -46.36.199.221 - 46.36.199.230 sz -46.36.199.231 - 46.36.199.240 sd -46.36.199.241 - 46.36.199.250 bf -46.36.199.251 - 46.36.200.0 va +46.36.192.0 - 46.36.199.255 gb +46.36.200.0 - 46.36.200.0 a1 46.36.200.1 - 46.36.200.10 gb 46.36.200.11 - 46.36.200.20 ba -46.36.200.21 - 46.36.200.30 ws +46.36.200.21 - 46.36.200.30 bo 46.36.200.31 - 46.36.200.40 sr -46.36.200.41 - 46.36.200.51 pt -46.36.200.52 - 46.36.200.60 ck -46.36.200.61 - 46.36.200.70 ki +46.36.200.41 - 46.36.200.50 it +46.36.200.51 - 46.36.200.60 ck +46.36.200.61 - 46.36.200.70 it 46.36.200.71 - 46.36.200.80 nu -46.36.200.81 - 46.36.200.90 to -46.36.200.91 - 46.36.200.100 cl +46.36.200.81 - 46.36.200.90 bo +46.36.200.91 - 46.36.200.100 de 46.36.200.101 - 46.36.200.110 tf 46.36.200.111 - 46.36.200.120 gg -46.36.200.121 - 46.36.200.130 lr +46.36.200.121 - 46.36.200.130 mx 46.36.200.131 - 46.36.200.140 mq 46.36.200.141 - 46.36.200.150 yt 46.36.200.151 - 46.36.200.160 nc -46.36.200.161 - 46.36.200.170 ng -46.36.200.171 - 46.36.200.195 us +46.36.200.161 - 46.36.200.170 ca +46.36.200.171 - 46.36.200.190 us +46.36.200.191 - 46.36.200.195 mx 46.36.200.196 - 46.36.200.205 gb 46.36.200.206 - 46.36.200.210 nf -46.36.200.211 - 46.36.200.255 us -46.36.201.0 - 46.36.201.0 va -46.36.201.1 - 46.36.201.60 us -46.36.201.61 - 46.36.201.65 pr -46.36.201.66 - 46.36.201.90 us -46.36.201.91 - 46.36.201.110 ca +46.36.200.211 - 46.36.200.215 vn +46.36.200.216 - 46.36.200.220 ao +46.36.200.221 - 46.36.200.225 gm +46.36.200.226 - 46.36.200.230 us +46.36.200.231 - 46.36.200.235 bw +46.36.200.236 - 46.36.200.240 us +46.36.200.241 - 46.36.200.245 kg +46.36.200.246 - 46.36.200.250 mg +46.36.200.251 - 46.36.200.255 us +46.36.201.0 - 46.36.201.0 a1 +46.36.201.1 - 46.36.201.5 us +46.36.201.6 - 46.36.201.10 mz +46.36.201.11 - 46.36.201.15 np +46.36.201.16 - 46.36.201.50 us +46.36.201.51 - 46.36.201.55 a1 +46.36.201.56 - 46.36.201.90 us +46.36.201.91 - 46.36.201.96 ca +46.36.201.97 - 46.36.201.99 ua +46.36.201.100 - 46.36.201.100 a1 +46.36.201.101 - 46.36.201.110 ca 46.36.201.111 - 46.36.201.115 bn 46.36.201.116 - 46.36.201.120 tm 46.36.201.121 - 46.36.201.125 us 46.36.201.126 - 46.36.201.130 it 46.36.201.131 - 46.36.201.135 kz -46.36.201.136 - 46.36.201.140 mv +46.36.201.136 - 46.36.201.140 us 46.36.201.141 - 46.36.201.145 pn 46.36.201.146 - 46.36.201.150 sm 46.36.201.151 - 46.36.201.160 gb 46.36.201.161 - 46.36.201.165 au 46.36.201.166 - 46.36.201.170 nl 46.36.201.171 - 46.36.201.175 ie -46.36.201.176 - 46.36.201.255 va -46.36.202.0 - 46.36.202.255 ch -46.36.203.0 - 46.36.223.255 va +46.36.201.176 - 46.36.201.200 us +46.36.201.201 - 46.36.201.205 ca +46.36.201.206 - 46.36.201.215 mx +46.36.201.216 - 46.36.201.220 gb +46.36.201.221 - 46.36.201.225 ax +46.36.201.226 - 46.36.201.229 fo +46.36.201.230 - 46.36.201.235 sj +46.36.201.236 - 46.36.201.240 cc +46.36.201.241 - 46.36.201.245 nr +46.36.201.246 - 46.36.201.250 gs +46.36.201.251 - 46.36.201.254 um +46.36.201.255 - 46.36.202.0 a1 +46.36.202.1 - 46.36.202.20 it +46.36.202.21 - 46.36.202.22 mx +46.36.202.23 - 46.36.202.23 li +46.36.202.24 - 46.36.202.25 mx +46.36.202.26 - 46.36.202.26 by +46.36.202.27 - 46.36.202.27 mx +46.36.202.28 - 46.36.202.30 a1 +46.36.202.31 - 46.36.202.31 my +46.36.202.32 - 46.36.202.35 a1 +46.36.202.36 - 46.36.202.36 in +46.36.202.37 - 46.36.202.39 bo +46.36.202.40 - 46.36.202.43 sx +46.36.202.44 - 46.36.202.47 mx +46.36.202.48 - 46.36.202.55 a1 +46.36.202.56 - 46.36.202.56 pk +46.36.202.57 - 46.36.202.65 bo +46.36.202.66 - 46.36.202.66 ve +46.36.202.67 - 46.36.202.70 bo +46.36.202.71 - 46.36.202.127 a1 +46.36.202.128 - 46.36.202.130 gw +46.36.202.131 - 46.36.202.180 it +46.36.202.181 - 46.36.202.183 tj +46.36.202.184 - 46.36.203.3 a1 +46.36.203.4 - 46.36.203.10 au +46.36.203.11 - 46.36.203.15 td +46.36.203.16 - 46.36.203.20 cd +46.36.203.21 - 46.36.203.25 dj +46.36.203.26 - 46.36.203.30 cf +46.36.203.31 - 46.36.203.35 a1 +46.36.203.36 - 46.36.203.40 mf +46.36.203.41 - 46.36.203.45 vc +46.36.203.46 - 46.36.203.50 pm +46.36.203.51 - 46.36.203.55 bl +46.36.203.56 - 46.36.203.60 dm +46.36.203.61 - 46.36.203.65 km +46.36.203.66 - 46.36.203.70 tz +46.36.203.71 - 46.36.203.75 st +46.36.203.76 - 46.36.203.80 gb +46.36.203.81 - 46.36.203.83 kp +46.36.203.84 - 46.36.203.90 fk +46.36.203.91 - 46.36.203.130 it +46.36.203.131 - 46.36.203.131 ug +46.36.203.132 - 46.36.203.135 a1 +46.36.203.136 - 46.36.203.139 mp +46.36.203.140 - 46.36.203.143 tl +46.36.203.144 - 46.36.203.147 wf +46.36.203.148 - 46.36.203.151 sd +46.36.203.152 - 46.36.203.159 a1 +46.36.203.160 - 46.36.203.167 bq +46.36.203.168 - 46.36.203.175 cw +46.36.203.176 - 46.36.203.183 it +46.36.203.184 - 46.36.203.191 ge +46.36.203.192 - 46.36.203.199 a1 +46.36.203.200 - 46.36.203.211 us +46.36.203.212 - 46.36.203.255 a1 +46.36.204.0 - 46.36.215.255 dk +46.36.216.0 - 46.36.223.255 ee 46.36.224.0 - 46.36.255.255 pl 46.37.0.0 - 46.37.31.255 it 46.37.32.0 - 46.37.63.255 gb @@ -4084,8 +10126,8 @@ 46.38.0.0 - 46.38.63.255 ru 46.38.64.0 - 46.38.95.255 sa 46.38.96.0 - 46.38.127.255 ru -46.38.128.0 - 46.38.158.255 ir -46.38.159.0 - 46.38.191.255 gb +46.38.128.0 - 46.38.159.255 ir +46.38.160.0 - 46.38.191.255 gb 46.38.192.0 - 46.38.223.255 nl 46.38.224.0 - 46.38.255.255 de 46.39.0.0 - 46.39.63.255 ru @@ -4102,11 +10144,11 @@ 46.41.0.0 - 46.41.63.255 de 46.41.64.0 - 46.41.127.255 ru 46.41.128.0 - 46.41.191.255 pl -46.41.192.0 - 46.41.255.255 ro +46.41.192.0 - 46.41.255.255 ir 46.42.0.0 - 46.42.63.255 ru 46.42.64.0 - 46.42.127.255 bh 46.42.128.0 - 46.42.191.255 ru -46.42.192.0 - 46.42.255.255 ro +46.42.192.0 - 46.42.255.255 kz 46.43.0.0 - 46.43.63.255 gb 46.43.64.0 - 46.43.127.255 ps 46.43.128.0 - 46.43.191.255 gb @@ -4126,11 +10168,14 @@ 46.47.128.0 - 46.47.191.255 cz 46.47.192.0 - 46.48.255.255 ru 46.49.0.0 - 46.49.127.255 ge -46.49.128.0 - 46.49.255.255 ro +46.49.128.0 - 46.49.255.255 sa 46.50.0.0 - 46.50.127.255 pt 46.50.128.0 - 46.50.255.255 ru 46.51.0.0 - 46.51.127.255 ro -46.51.128.0 - 46.51.255.255 ie +46.51.128.0 - 46.51.215.254 ie +46.51.215.255 - 46.51.215.255 nl +46.51.216.0 - 46.51.223.255 sg +46.51.224.0 - 46.51.255.255 jp 46.52.0.0 - 46.52.127.255 sa 46.52.128.0 - 46.52.255.255 ru 46.53.0.0 - 46.53.127.255 sy @@ -4144,47 +10189,16 @@ 46.57.128.0 - 46.57.255.255 sy 46.58.0.0 - 46.58.127.255 eu 46.58.128.0 - 46.58.255.255 sy -46.59.0.0 - 46.59.87.255 se -46.59.88.0 - 46.59.88.31 fi -46.59.88.32 - 46.59.88.127 se -46.59.88.128 - 46.59.88.191 gb -46.59.88.192 - 46.59.88.255 de -46.59.89.0 - 46.59.89.31 fi -46.59.89.32 - 46.59.89.127 se -46.59.89.128 - 46.59.89.191 gb -46.59.89.192 - 46.59.89.255 de -46.59.90.0 - 46.59.90.31 fi -46.59.90.32 - 46.59.90.127 se -46.59.90.128 - 46.59.90.191 gb -46.59.90.192 - 46.59.90.255 de -46.59.91.0 - 46.59.91.31 fi -46.59.91.32 - 46.59.91.127 se -46.59.91.128 - 46.59.91.191 gb -46.59.91.192 - 46.59.91.255 de -46.59.92.0 - 46.59.92.31 fi -46.59.92.32 - 46.59.92.127 se -46.59.92.128 - 46.59.92.191 gb -46.59.92.192 - 46.59.92.255 de -46.59.93.0 - 46.59.93.31 fi -46.59.93.32 - 46.59.93.127 se -46.59.93.128 - 46.59.93.191 gb -46.59.93.192 - 46.59.93.255 de -46.59.94.0 - 46.59.94.31 fi -46.59.94.32 - 46.59.94.127 se -46.59.94.128 - 46.59.94.191 gb -46.59.94.192 - 46.59.94.255 de -46.59.95.0 - 46.59.95.31 fi -46.59.95.32 - 46.59.95.127 se -46.59.95.128 - 46.59.95.191 gb -46.59.95.192 - 46.59.95.255 de -46.59.96.0 - 46.59.106.255 se +46.59.0.0 - 46.59.106.255 se 46.59.107.0 - 46.59.107.255 no 46.59.108.0 - 46.59.127.255 se 46.59.128.0 - 46.59.255.255 de -46.60.0.0 - 46.60.127.255 ps +46.60.0.0 - 46.60.95.255 ps +46.60.96.0 - 46.60.103.255 il +46.60.104.0 - 46.60.127.255 ps 46.60.128.0 - 46.60.255.255 gb 46.61.0.0 - 46.62.127.255 ru -46.62.128.0 - 46.62.255.255 ro +46.62.128.0 - 46.62.255.255 ir 46.63.0.0 - 46.63.127.255 ua 46.63.128.0 - 46.63.255.255 ru 46.64.0.0 - 46.65.255.255 gb @@ -4195,1350 +10209,184 @@ 46.74.0.0 - 46.75.255.255 at 46.76.0.0 - 46.77.255.255 pl 46.78.0.0 - 46.95.255.255 de -46.96.0.0 - 46.96.255.255 ru +46.96.0.0 - 46.96.255.255 ua 46.97.0.0 - 46.97.255.255 ro 46.98.0.0 - 46.98.255.255 ua -46.99.0.0 - 46.99.255.255 al +46.99.0.0 - 46.99.251.49 al +46.99.251.50 - 46.99.251.50 si +46.99.251.51 - 46.99.255.255 al 46.100.0.0 - 46.100.255.255 ir -46.101.0.0 - 46.101.255.255 ru -46.102.0.0 - 46.102.239.255 ro -46.102.240.0 - 46.102.247.255 nl -46.102.248.0 - 46.102.255.255 ro +46.101.0.0 - 46.101.95.255 gb +46.101.96.0 - 46.101.255.255 de +46.102.0.0 - 46.102.95.255 ro +46.102.96.0 - 46.102.96.255 tr +46.102.97.0 - 46.102.99.255 ee +46.102.100.0 - 46.102.100.255 tr +46.102.101.0 - 46.102.103.255 ee +46.102.104.0 - 46.102.119.255 ro +46.102.120.0 - 46.102.143.255 ir +46.102.144.0 - 46.102.151.255 ro +46.102.152.0 - 46.102.152.255 ch +46.102.153.0 - 46.102.153.255 ro +46.102.154.0 - 46.102.154.255 md +46.102.155.0 - 46.102.159.255 ro +46.102.160.0 - 46.102.160.127 nl +46.102.160.128 - 46.102.171.255 ro +46.102.172.0 - 46.102.172.255 md +46.102.173.0 - 46.102.175.255 ro +46.102.176.0 - 46.102.176.255 md +46.102.177.0 - 46.102.180.255 gb +46.102.181.0 - 46.102.181.255 md +46.102.182.0 - 46.102.187.255 ro +46.102.188.0 - 46.102.189.255 it +46.102.190.0 - 46.102.191.255 ro +46.102.192.0 - 46.102.223.255 gb +46.102.224.0 - 46.102.231.255 nl +46.102.232.0 - 46.102.238.255 ro +46.102.239.0 - 46.102.239.255 nl +46.102.240.0 - 46.102.250.255 ro +46.102.251.0 - 46.102.251.127 cn +46.102.251.128 - 46.102.251.255 hk +46.102.252.0 - 46.102.255.255 ro 46.103.0.0 - 46.103.255.255 gr 46.104.0.0 - 46.104.255.255 tr -46.105.0.0 - 46.105.18.255 fr -46.105.19.0 - 46.105.19.255 it -46.105.20.0 - 46.105.20.255 es -46.105.21.0 - 46.105.22.127 fr -46.105.22.128 - 46.105.22.255 cz -46.105.23.0 - 46.105.23.127 lt -46.105.23.128 - 46.105.23.255 fi -46.105.24.0 - 46.105.24.255 es -46.105.25.0 - 46.105.25.255 pl -46.105.26.0 - 46.105.26.255 de +46.105.0.0 - 46.105.26.255 fr 46.105.27.0 - 46.105.27.255 gb -46.105.28.0 - 46.105.28.255 it -46.105.29.0 - 46.105.29.255 pt -46.105.30.0 - 46.105.30.255 nl -46.105.31.0 - 46.105.31.255 ie -46.105.32.0 - 46.105.127.255 fr -46.105.128.0 - 46.105.128.31 be -46.105.128.32 - 46.105.128.47 fr -46.105.128.48 - 46.105.128.63 pl -46.105.128.64 - 46.105.128.79 fr -46.105.128.80 - 46.105.128.95 ie -46.105.128.96 - 46.105.128.111 fr -46.105.128.112 - 46.105.128.115 pl -46.105.128.116 - 46.105.128.119 lt -46.105.128.120 - 46.105.128.123 gb -46.105.128.124 - 46.105.128.127 ie -46.105.128.128 - 46.105.128.135 fr -46.105.128.136 - 46.105.128.139 gb -46.105.128.140 - 46.105.128.143 fr -46.105.128.144 - 46.105.128.159 pl -46.105.128.160 - 46.105.128.167 fr -46.105.128.168 - 46.105.128.171 gb -46.105.128.172 - 46.105.128.175 es -46.105.128.176 - 46.105.128.207 fr -46.105.128.208 - 46.105.128.255 pl -46.105.129.0 - 46.105.129.3 gb -46.105.129.4 - 46.105.129.19 fr -46.105.129.20 - 46.105.129.23 pl -46.105.129.24 - 46.105.129.31 ch -46.105.129.32 - 46.105.129.55 fr -46.105.129.56 - 46.105.129.59 es -46.105.129.60 - 46.105.129.63 gb -46.105.129.64 - 46.105.129.127 fr -46.105.129.128 - 46.105.129.131 pl -46.105.129.132 - 46.105.129.135 gb -46.105.129.136 - 46.105.129.143 fr -46.105.129.144 - 46.105.129.151 de -46.105.129.152 - 46.105.129.159 pl -46.105.129.160 - 46.105.129.239 fr +46.105.28.0 - 46.105.94.119 fr +46.105.94.120 - 46.105.94.123 pt +46.105.94.124 - 46.105.129.19 fr +46.105.129.20 - 46.105.129.23 es +46.105.129.24 - 46.105.129.239 fr 46.105.129.240 - 46.105.129.255 de -46.105.130.0 - 46.105.130.255 be -46.105.131.0 - 46.105.131.31 cz -46.105.131.32 - 46.105.131.63 fr -46.105.131.64 - 46.105.131.95 gb -46.105.131.96 - 46.105.131.111 pt -46.105.131.112 - 46.105.131.119 gb -46.105.131.120 - 46.105.131.127 ie -46.105.131.128 - 46.105.131.215 fr -46.105.131.216 - 46.105.131.223 pl -46.105.131.224 - 46.105.131.255 fr -46.105.132.0 - 46.105.132.255 gb -46.105.133.0 - 46.105.133.15 fr -46.105.133.16 - 46.105.133.19 ie -46.105.133.20 - 46.105.133.23 pl -46.105.133.24 - 46.105.133.27 it -46.105.133.28 - 46.105.133.31 ch -46.105.133.32 - 46.105.133.63 be -46.105.133.64 - 46.105.133.67 gb -46.105.133.68 - 46.105.133.71 fr -46.105.133.72 - 46.105.133.79 es -46.105.133.80 - 46.105.133.83 fr -46.105.133.84 - 46.105.133.87 gb -46.105.133.88 - 46.105.133.127 pl -46.105.133.128 - 46.105.133.143 fr -46.105.133.144 - 46.105.133.151 pl -46.105.133.152 - 46.105.133.159 fr -46.105.133.160 - 46.105.133.191 lt -46.105.133.192 - 46.105.133.207 de -46.105.133.208 - 46.105.133.211 pl -46.105.133.212 - 46.105.133.215 de -46.105.133.216 - 46.105.133.219 gb -46.105.133.220 - 46.105.133.223 nl -46.105.133.224 - 46.105.133.227 lt -46.105.133.228 - 46.105.133.231 ch -46.105.133.232 - 46.105.133.235 de -46.105.133.236 - 46.105.133.239 gb -46.105.133.240 - 46.105.135.63 fr -46.105.135.64 - 46.105.135.79 pl -46.105.135.80 - 46.105.135.95 fr -46.105.135.96 - 46.105.135.99 es -46.105.135.100 - 46.105.135.103 lt -46.105.135.104 - 46.105.135.111 fi -46.105.135.112 - 46.105.135.119 it -46.105.135.120 - 46.105.135.127 ie -46.105.135.128 - 46.105.135.135 gb -46.105.135.136 - 46.105.135.139 pl -46.105.135.140 - 46.105.135.143 pt -46.105.135.144 - 46.105.135.151 nl -46.105.135.152 - 46.105.135.155 gb -46.105.135.156 - 46.105.135.159 cz -46.105.135.160 - 46.105.135.167 fr -46.105.135.168 - 46.105.135.171 de -46.105.135.172 - 46.105.135.175 ie -46.105.135.176 - 46.105.135.191 gb -46.105.135.192 - 46.105.135.223 fr -46.105.135.224 - 46.105.135.243 de -46.105.135.244 - 46.105.135.247 es -46.105.135.248 - 46.105.135.251 pt -46.105.135.252 - 46.105.137.31 fr -46.105.137.32 - 46.105.137.63 gb -46.105.137.64 - 46.105.137.71 fr -46.105.137.72 - 46.105.137.79 pl -46.105.137.80 - 46.105.137.83 de -46.105.137.84 - 46.105.137.87 es -46.105.137.88 - 46.105.137.91 gb -46.105.137.92 - 46.105.137.103 fr -46.105.137.104 - 46.105.137.107 pt -46.105.137.108 - 46.105.137.111 es -46.105.137.112 - 46.105.137.127 fr -46.105.137.128 - 46.105.137.207 es -46.105.137.208 - 46.105.137.211 pl -46.105.137.212 - 46.105.137.215 fr -46.105.137.216 - 46.105.137.219 es -46.105.137.220 - 46.105.137.223 pt -46.105.137.224 - 46.105.137.239 pl -46.105.137.240 - 46.105.137.247 it -46.105.137.248 - 46.105.137.251 de -46.105.137.252 - 46.105.137.255 fr -46.105.138.0 - 46.105.138.15 gb -46.105.138.16 - 46.105.138.23 it -46.105.138.24 - 46.105.138.31 pl -46.105.138.32 - 46.105.138.63 fr -46.105.138.64 - 46.105.138.71 ie -46.105.138.72 - 46.105.138.75 pl -46.105.138.76 - 46.105.138.95 fr -46.105.138.96 - 46.105.138.127 pl -46.105.138.128 - 46.105.138.159 nl -46.105.138.160 - 46.105.138.163 pl -46.105.138.164 - 46.105.138.167 es -46.105.138.168 - 46.105.138.171 fr -46.105.138.172 - 46.105.138.175 pl -46.105.138.176 - 46.105.138.179 pt -46.105.138.180 - 46.105.138.183 pl -46.105.138.184 - 46.105.138.187 ie -46.105.138.188 - 46.105.138.191 de -46.105.138.192 - 46.105.138.255 it -46.105.139.0 - 46.105.139.255 fr -46.105.140.0 - 46.105.140.31 es -46.105.140.32 - 46.105.140.47 fr -46.105.140.48 - 46.105.140.51 pl -46.105.140.52 - 46.105.140.55 gb -46.105.140.56 - 46.105.140.63 nl -46.105.140.64 - 46.105.140.95 fi -46.105.140.96 - 46.105.140.127 pt -46.105.140.128 - 46.105.140.143 fr -46.105.140.144 - 46.105.140.151 pl -46.105.140.152 - 46.105.140.155 ch -46.105.140.156 - 46.105.140.159 es -46.105.140.160 - 46.105.140.163 ch -46.105.140.164 - 46.105.140.167 fi -46.105.140.168 - 46.105.140.175 nl -46.105.140.176 - 46.105.140.191 pl -46.105.140.192 - 46.105.140.239 fr -46.105.140.240 - 46.105.140.247 pl -46.105.140.248 - 46.105.141.127 fr -46.105.141.128 - 46.105.141.135 gb -46.105.141.136 - 46.105.141.139 pl -46.105.141.140 - 46.105.141.143 es -46.105.141.144 - 46.105.141.159 fr -46.105.141.160 - 46.105.141.191 cz -46.105.141.192 - 46.105.141.223 es -46.105.141.224 - 46.105.141.227 pl -46.105.141.228 - 46.105.141.231 gb -46.105.141.232 - 46.105.141.235 fr -46.105.141.236 - 46.105.141.239 it -46.105.141.240 - 46.105.141.255 pl -46.105.142.0 - 46.105.142.3 de -46.105.142.4 - 46.105.142.7 cz -46.105.142.8 - 46.105.142.11 nl -46.105.142.12 - 46.105.142.15 de -46.105.142.16 - 46.105.142.19 es -46.105.142.20 - 46.105.142.23 fr -46.105.142.24 - 46.105.142.31 be -46.105.142.32 - 46.105.142.47 fr -46.105.142.48 - 46.105.142.55 gb -46.105.142.56 - 46.105.142.63 pl -46.105.142.64 - 46.105.142.95 fr -46.105.142.96 - 46.105.142.127 gb -46.105.142.128 - 46.105.142.159 pt -46.105.142.160 - 46.105.142.191 nl -46.105.142.192 - 46.105.142.199 de -46.105.142.200 - 46.105.142.203 gb -46.105.142.204 - 46.105.142.207 pl -46.105.142.208 - 46.105.142.215 de -46.105.142.216 - 46.105.142.219 ie -46.105.142.220 - 46.105.142.223 pl -46.105.142.224 - 46.105.142.239 de -46.105.142.240 - 46.105.142.255 fr -46.105.143.0 - 46.105.143.31 es -46.105.143.32 - 46.105.143.63 fr -46.105.143.64 - 46.105.143.79 pl -46.105.143.80 - 46.105.143.111 fr -46.105.143.112 - 46.105.143.119 de -46.105.143.120 - 46.105.143.127 ch -46.105.143.128 - 46.105.143.135 nl -46.105.143.136 - 46.105.143.143 gb +46.105.130.0 - 46.105.131.127 fr +46.105.131.128 - 46.105.131.191 gb +46.105.131.192 - 46.105.133.63 fr +46.105.133.64 - 46.105.133.67 de +46.105.133.68 - 46.105.133.127 fr +46.105.133.128 - 46.105.133.131 it +46.105.133.132 - 46.105.138.79 fr +46.105.138.80 - 46.105.138.83 nl +46.105.138.84 - 46.105.138.87 es +46.105.138.88 - 46.105.139.63 fr +46.105.139.64 - 46.105.139.95 de +46.105.139.96 - 46.105.143.111 fr +46.105.143.112 - 46.105.143.127 es +46.105.143.128 - 46.105.143.143 fr 46.105.143.144 - 46.105.143.159 ie -46.105.143.160 - 46.105.143.175 it -46.105.143.176 - 46.105.143.183 pl -46.105.143.184 - 46.105.143.187 cz -46.105.143.188 - 46.105.143.191 lt -46.105.143.192 - 46.105.143.195 nl -46.105.143.196 - 46.105.143.211 it -46.105.143.212 - 46.105.143.215 gb -46.105.143.216 - 46.105.143.219 es -46.105.143.220 - 46.105.143.255 gb -46.105.144.0 - 46.105.144.71 fr -46.105.144.72 - 46.105.144.79 ch -46.105.144.80 - 46.105.144.83 fr -46.105.144.84 - 46.105.144.91 gb -46.105.144.92 - 46.105.144.95 nl -46.105.144.96 - 46.105.144.127 gb -46.105.144.128 - 46.105.144.131 de -46.105.144.132 - 46.105.144.135 it -46.105.144.136 - 46.105.144.143 fr -46.105.144.144 - 46.105.144.159 pl -46.105.144.160 - 46.105.144.163 pt -46.105.144.164 - 46.105.144.167 de -46.105.144.168 - 46.105.144.175 cz -46.105.144.176 - 46.105.144.211 fr -46.105.144.212 - 46.105.144.215 nl -46.105.144.216 - 46.105.144.223 de -46.105.144.224 - 46.105.144.255 fr -46.105.145.0 - 46.105.145.7 de -46.105.145.8 - 46.105.145.11 cz -46.105.145.12 - 46.105.145.15 pl -46.105.145.16 - 46.105.145.19 de -46.105.145.20 - 46.105.145.23 fr -46.105.145.24 - 46.105.145.47 de -46.105.145.48 - 46.105.145.51 pl -46.105.145.52 - 46.105.145.55 nl -46.105.145.56 - 46.105.145.59 cz -46.105.145.60 - 46.105.145.63 gb -46.105.145.64 - 46.105.145.71 pl -46.105.145.72 - 46.105.145.75 de -46.105.145.76 - 46.105.145.79 nl -46.105.145.80 - 46.105.145.95 fr -46.105.145.96 - 46.105.145.99 nl -46.105.145.100 - 46.105.145.103 es -46.105.145.104 - 46.105.145.111 pl -46.105.145.112 - 46.105.145.119 ch -46.105.145.120 - 46.105.145.159 cz -46.105.145.160 - 46.105.145.167 fr -46.105.145.168 - 46.105.145.175 es -46.105.145.176 - 46.105.145.183 nl -46.105.145.184 - 46.105.145.187 fr -46.105.145.188 - 46.105.145.191 pt -46.105.145.192 - 46.105.145.223 fr -46.105.145.224 - 46.105.145.227 pl -46.105.145.228 - 46.105.145.231 fi -46.105.145.232 - 46.105.145.235 ch -46.105.145.236 - 46.105.145.239 fr -46.105.145.240 - 46.105.145.255 it -46.105.146.0 - 46.105.147.255 es -46.105.148.0 - 46.105.148.15 gb -46.105.148.16 - 46.105.148.23 it -46.105.148.24 - 46.105.148.31 pt -46.105.148.32 - 46.105.148.63 be -46.105.148.64 - 46.105.148.79 fi -46.105.148.80 - 46.105.148.99 fr -46.105.148.100 - 46.105.148.107 pl -46.105.148.108 - 46.105.148.127 fr -46.105.148.128 - 46.105.148.135 gb -46.105.148.136 - 46.105.148.139 pl -46.105.148.140 - 46.105.148.143 es -46.105.148.144 - 46.105.148.159 pl -46.105.148.160 - 46.105.148.175 gb -46.105.148.176 - 46.105.148.207 fr -46.105.148.208 - 46.105.148.223 pt -46.105.148.224 - 46.105.148.227 es -46.105.148.228 - 46.105.148.231 de -46.105.148.232 - 46.105.150.15 fr -46.105.150.16 - 46.105.150.31 pl -46.105.150.32 - 46.105.150.191 fr -46.105.150.192 - 46.105.150.223 es -46.105.150.224 - 46.105.150.251 fr -46.105.150.252 - 46.105.150.255 gb -46.105.151.0 - 46.105.151.3 pl -46.105.151.4 - 46.105.151.7 es -46.105.151.8 - 46.105.151.11 nl -46.105.151.12 - 46.105.151.15 es -46.105.151.16 - 46.105.151.31 gb -46.105.151.32 - 46.105.151.35 nl -46.105.151.36 - 46.105.151.43 fr -46.105.151.44 - 46.105.151.47 gb -46.105.151.48 - 46.105.151.63 pt -46.105.151.64 - 46.105.151.95 fr -46.105.151.96 - 46.105.151.143 es -46.105.151.144 - 46.105.151.183 fr -46.105.151.184 - 46.105.151.191 pl -46.105.151.192 - 46.105.151.195 gb -46.105.151.196 - 46.105.151.199 fr -46.105.151.200 - 46.105.151.207 gb -46.105.151.208 - 46.105.151.223 be -46.105.151.224 - 46.105.151.231 ch -46.105.151.232 - 46.105.151.239 nl -46.105.151.240 - 46.105.151.243 gb -46.105.151.244 - 46.105.151.247 it -46.105.151.248 - 46.105.151.251 es -46.105.151.252 - 46.105.151.255 ch -46.105.152.0 - 46.105.152.127 fr -46.105.152.128 - 46.105.152.191 be -46.105.152.192 - 46.105.152.255 fr -46.105.153.0 - 46.105.153.63 pl -46.105.153.64 - 46.105.153.95 de -46.105.153.96 - 46.105.153.127 es -46.105.153.128 - 46.105.153.159 fr -46.105.153.160 - 46.105.153.167 es -46.105.153.168 - 46.105.153.175 ch -46.105.153.176 - 46.105.153.179 gb -46.105.153.180 - 46.105.153.183 it -46.105.153.184 - 46.105.153.255 fr -46.105.154.0 - 46.105.154.63 de -46.105.154.64 - 46.105.154.127 ch -46.105.154.128 - 46.105.154.159 pl -46.105.154.160 - 46.105.154.163 fr -46.105.154.164 - 46.105.154.167 de -46.105.154.168 - 46.105.154.171 pl -46.105.154.172 - 46.105.154.175 es -46.105.154.176 - 46.105.154.179 lt -46.105.154.180 - 46.105.154.183 pl -46.105.154.184 - 46.105.154.191 de -46.105.154.192 - 46.105.154.211 fr -46.105.154.212 - 46.105.154.251 pl -46.105.154.252 - 46.105.155.15 fr -46.105.155.16 - 46.105.155.23 pl -46.105.155.24 - 46.105.155.27 fr -46.105.155.28 - 46.105.155.31 es -46.105.155.32 - 46.105.155.63 de -46.105.155.64 - 46.105.155.175 fr -46.105.155.176 - 46.105.155.183 de -46.105.155.184 - 46.105.155.187 es -46.105.155.188 - 46.105.155.191 pt -46.105.155.192 - 46.105.155.223 fr -46.105.155.224 - 46.105.155.255 es -46.105.156.0 - 46.105.156.31 fr -46.105.156.32 - 46.105.156.43 es -46.105.156.44 - 46.105.156.47 gb -46.105.156.48 - 46.105.156.51 cz -46.105.156.52 - 46.105.156.55 ie -46.105.156.56 - 46.105.156.59 de -46.105.156.60 - 46.105.156.63 es -46.105.156.64 - 46.105.156.95 fi -46.105.156.96 - 46.105.156.111 fr -46.105.156.112 - 46.105.156.127 it -46.105.156.128 - 46.105.156.191 fr -46.105.156.192 - 46.105.156.207 pl -46.105.156.208 - 46.105.156.239 gb -46.105.156.240 - 46.105.156.255 fr -46.105.157.0 - 46.105.157.255 pl -46.105.158.0 - 46.105.158.47 fr -46.105.158.48 - 46.105.158.51 ch -46.105.158.52 - 46.105.158.55 nl -46.105.158.56 - 46.105.158.59 pt -46.105.158.60 - 46.105.158.63 pl -46.105.158.64 - 46.105.158.159 fr -46.105.158.160 - 46.105.158.175 es -46.105.158.176 - 46.105.158.179 fr -46.105.158.180 - 46.105.158.191 de -46.105.158.192 - 46.105.158.215 fr -46.105.158.216 - 46.105.158.219 cz -46.105.158.220 - 46.105.158.223 fi -46.105.158.224 - 46.105.158.239 fr -46.105.158.240 - 46.105.158.243 de -46.105.158.244 - 46.105.158.247 ch -46.105.158.248 - 46.105.158.251 fr -46.105.158.252 - 46.105.158.255 es -46.105.159.0 - 46.105.159.255 nl -46.105.160.0 - 46.105.160.191 fr -46.105.160.192 - 46.105.160.211 de -46.105.160.212 - 46.105.160.215 be -46.105.160.216 - 46.105.160.219 ch -46.105.160.220 - 46.105.160.223 pt -46.105.160.224 - 46.105.160.255 fr -46.105.161.0 - 46.105.161.3 pl -46.105.161.4 - 46.105.161.7 es -46.105.161.8 - 46.105.161.15 pl -46.105.161.16 - 46.105.161.19 it -46.105.161.20 - 46.105.161.23 pl -46.105.161.24 - 46.105.161.27 it -46.105.161.28 - 46.105.161.31 fi -46.105.161.32 - 46.105.161.39 ch -46.105.161.40 - 46.105.161.43 be -46.105.161.44 - 46.105.161.47 ch -46.105.161.48 - 46.105.161.55 fr -46.105.161.56 - 46.105.161.59 cz -46.105.161.60 - 46.105.161.63 pl -46.105.161.64 - 46.105.161.67 cz -46.105.161.68 - 46.105.161.71 de -46.105.161.72 - 46.105.161.75 pl -46.105.161.76 - 46.105.161.79 nl -46.105.161.80 - 46.105.161.95 fr -46.105.161.96 - 46.105.161.99 de -46.105.161.100 - 46.105.161.103 es -46.105.161.104 - 46.105.161.107 pt -46.105.161.108 - 46.105.161.111 pl -46.105.161.112 - 46.105.161.191 de -46.105.161.192 - 46.105.161.203 pl -46.105.161.204 - 46.105.161.207 es -46.105.161.208 - 46.105.163.31 fr -46.105.163.32 - 46.105.163.35 be -46.105.163.36 - 46.105.163.39 de -46.105.163.40 - 46.105.163.55 fr -46.105.163.56 - 46.105.163.59 fi -46.105.163.60 - 46.105.163.63 gb -46.105.163.64 - 46.105.163.95 es -46.105.163.96 - 46.105.163.127 fr -46.105.163.128 - 46.105.163.131 de -46.105.163.132 - 46.105.163.135 it -46.105.163.136 - 46.105.163.143 es -46.105.163.144 - 46.105.163.191 fr -46.105.163.192 - 46.105.163.207 gb -46.105.163.208 - 46.105.163.215 fr -46.105.163.216 - 46.105.163.219 pl -46.105.163.220 - 46.105.163.255 fr -46.105.164.0 - 46.105.164.7 es -46.105.164.8 - 46.105.164.15 pl -46.105.164.16 - 46.105.164.19 pt -46.105.164.20 - 46.105.164.27 fr -46.105.164.28 - 46.105.164.31 nl -46.105.164.32 - 46.105.164.35 gb -46.105.164.36 - 46.105.164.43 pl -46.105.164.44 - 46.105.164.47 de -46.105.164.48 - 46.105.164.159 fr -46.105.164.160 - 46.105.164.163 de -46.105.164.164 - 46.105.164.167 be -46.105.164.168 - 46.105.164.171 ch -46.105.164.172 - 46.105.164.175 cz -46.105.164.176 - 46.105.164.239 fr -46.105.164.240 - 46.105.164.243 de -46.105.164.244 - 46.105.164.247 fr -46.105.164.248 - 46.105.164.251 pl -46.105.164.252 - 46.105.164.255 de -46.105.165.0 - 46.105.165.3 pl -46.105.165.4 - 46.105.165.7 fr -46.105.165.8 - 46.105.165.15 es -46.105.165.16 - 46.105.165.19 be -46.105.165.20 - 46.105.165.23 es -46.105.165.24 - 46.105.165.27 ch -46.105.165.28 - 46.105.165.31 pt -46.105.165.32 - 46.105.165.39 pl -46.105.165.40 - 46.105.165.43 de -46.105.165.44 - 46.105.165.47 pl -46.105.165.48 - 46.105.165.51 de -46.105.165.52 - 46.105.165.55 gb -46.105.165.56 - 46.105.165.63 pl -46.105.165.64 - 46.105.165.95 es -46.105.165.96 - 46.105.165.143 fr -46.105.165.144 - 46.105.165.159 gb -46.105.165.160 - 46.105.165.163 pl -46.105.165.164 - 46.105.165.167 es -46.105.165.168 - 46.105.165.171 fr -46.105.165.172 - 46.105.165.175 pl -46.105.165.176 - 46.105.165.183 es -46.105.165.184 - 46.105.165.191 de -46.105.165.192 - 46.105.165.231 fr -46.105.165.232 - 46.105.165.235 es -46.105.165.236 - 46.105.165.239 fr -46.105.165.240 - 46.105.165.255 nl -46.105.166.0 - 46.105.166.23 fr -46.105.166.24 - 46.105.166.31 gb -46.105.166.32 - 46.105.166.63 fr -46.105.166.64 - 46.105.166.67 gb -46.105.166.68 - 46.105.166.71 pl -46.105.166.72 - 46.105.166.79 lt -46.105.166.80 - 46.105.166.95 fr -46.105.166.96 - 46.105.166.99 pl -46.105.166.100 - 46.105.166.103 gb -46.105.166.104 - 46.105.166.107 pl -46.105.166.108 - 46.105.166.111 gb -46.105.166.112 - 46.105.166.119 it -46.105.166.120 - 46.105.166.127 fr -46.105.166.128 - 46.105.166.131 fi -46.105.166.132 - 46.105.166.135 fr -46.105.166.136 - 46.105.166.143 ie -46.105.166.144 - 46.105.166.147 gb -46.105.166.148 - 46.105.166.151 ie -46.105.166.152 - 46.105.166.155 de -46.105.166.156 - 46.105.166.159 fi -46.105.166.160 - 46.105.166.175 fr -46.105.166.176 - 46.105.166.179 es -46.105.166.180 - 46.105.166.183 fr -46.105.166.184 - 46.105.166.191 pl -46.105.166.192 - 46.105.166.195 ch -46.105.166.196 - 46.105.166.199 cz -46.105.166.200 - 46.105.166.203 nl -46.105.166.204 - 46.105.166.223 de -46.105.166.224 - 46.105.166.231 es -46.105.166.232 - 46.105.167.127 fr -46.105.167.128 - 46.105.167.131 de -46.105.167.132 - 46.105.167.135 cz -46.105.167.136 - 46.105.167.143 gb -46.105.167.144 - 46.105.167.159 it -46.105.167.160 - 46.105.167.163 es -46.105.167.164 - 46.105.167.167 cz -46.105.167.168 - 46.105.167.171 de -46.105.167.172 - 46.105.167.175 pl -46.105.167.176 - 46.105.167.191 de -46.105.167.192 - 46.105.167.219 fr -46.105.167.220 - 46.105.167.223 be -46.105.167.224 - 46.105.167.239 it -46.105.167.240 - 46.105.167.243 gb -46.105.167.244 - 46.105.167.247 es -46.105.167.248 - 46.105.167.251 fr -46.105.167.252 - 46.105.167.255 gb -46.105.168.0 - 46.105.168.191 fr -46.105.168.192 - 46.105.168.199 es -46.105.168.200 - 46.105.168.203 pl -46.105.168.204 - 46.105.168.215 fr -46.105.168.216 - 46.105.168.219 pl -46.105.168.220 - 46.105.168.223 ch -46.105.168.224 - 46.105.168.239 fr -46.105.168.240 - 46.105.168.255 pl -46.105.169.0 - 46.105.169.63 nl -46.105.169.64 - 46.105.169.95 pt -46.105.169.96 - 46.105.169.99 fr -46.105.169.100 - 46.105.169.103 de -46.105.169.104 - 46.105.169.107 be -46.105.169.108 - 46.105.169.111 de -46.105.169.112 - 46.105.169.127 fr -46.105.169.128 - 46.105.169.131 pl -46.105.169.132 - 46.105.169.135 pt -46.105.169.136 - 46.105.169.139 be -46.105.169.140 - 46.105.169.143 fr -46.105.169.144 - 46.105.169.147 gb -46.105.169.148 - 46.105.169.151 lt -46.105.169.152 - 46.105.169.155 fr -46.105.169.156 - 46.105.169.159 de -46.105.169.160 - 46.105.169.175 es -46.105.169.176 - 46.105.169.207 fr -46.105.169.208 - 46.105.169.211 es -46.105.169.212 - 46.105.169.223 pl -46.105.169.224 - 46.105.169.239 fr -46.105.169.240 - 46.105.169.243 gb -46.105.169.244 - 46.105.169.247 pt -46.105.169.248 - 46.105.169.251 pl -46.105.169.252 - 46.105.169.255 it -46.105.170.0 - 46.105.170.7 pl -46.105.170.8 - 46.105.170.11 ch -46.105.170.12 - 46.105.170.15 cz -46.105.170.16 - 46.105.170.31 es -46.105.170.32 - 46.105.170.35 pl -46.105.170.36 - 46.105.170.39 es -46.105.170.40 - 46.105.170.43 pl -46.105.170.44 - 46.105.170.63 fr -46.105.170.64 - 46.105.170.67 gb -46.105.170.68 - 46.105.170.71 it -46.105.170.72 - 46.105.170.75 fi -46.105.170.76 - 46.105.170.79 ie -46.105.170.80 - 46.105.170.87 lt -46.105.170.88 - 46.105.170.91 gb -46.105.170.92 - 46.105.170.111 fr -46.105.170.112 - 46.105.170.115 nl -46.105.170.116 - 46.105.170.119 lt -46.105.170.120 - 46.105.170.123 ie -46.105.170.124 - 46.105.170.127 de -46.105.170.128 - 46.105.170.255 pl -46.105.171.0 - 46.105.171.7 fr -46.105.171.8 - 46.105.171.15 pl -46.105.171.16 - 46.105.171.31 fr -46.105.171.32 - 46.105.171.63 de -46.105.171.64 - 46.105.171.83 fr -46.105.171.84 - 46.105.171.87 de -46.105.171.88 - 46.105.171.91 it -46.105.171.92 - 46.105.171.131 de -46.105.171.132 - 46.105.171.135 gb -46.105.171.136 - 46.105.171.139 fr -46.105.171.140 - 46.105.171.143 be -46.105.171.144 - 46.105.171.159 fr -46.105.171.160 - 46.105.171.175 de -46.105.171.176 - 46.105.171.183 cz -46.105.171.184 - 46.105.171.191 nl -46.105.171.192 - 46.105.171.223 gb -46.105.171.224 - 46.105.171.255 pl -46.105.172.0 - 46.105.172.255 fr -46.105.173.0 - 46.105.173.3 ie -46.105.173.4 - 46.105.173.7 fr -46.105.173.8 - 46.105.173.11 it -46.105.173.12 - 46.105.173.15 gb -46.105.173.16 - 46.105.173.19 fr -46.105.173.20 - 46.105.173.23 de -46.105.173.24 - 46.105.173.27 be -46.105.173.28 - 46.105.173.31 pt -46.105.173.32 - 46.105.173.39 fi -46.105.173.40 - 46.105.173.43 es -46.105.173.44 - 46.105.173.47 fr -46.105.173.48 - 46.105.173.55 pl -46.105.173.56 - 46.105.173.63 es -46.105.173.64 - 46.105.173.191 fr -46.105.173.192 - 46.105.173.223 pt -46.105.173.224 - 46.105.174.63 fr -46.105.174.64 - 46.105.174.79 nl -46.105.174.80 - 46.105.174.95 pl -46.105.174.96 - 46.105.174.99 es -46.105.174.100 - 46.105.174.103 lt -46.105.174.104 - 46.105.174.111 it -46.105.174.112 - 46.105.174.115 pl -46.105.174.116 - 46.105.174.119 gb -46.105.174.120 - 46.105.174.123 lt -46.105.174.124 - 46.105.174.127 be -46.105.174.128 - 46.105.174.143 es -46.105.174.144 - 46.105.174.159 fr -46.105.174.160 - 46.105.174.163 ch -46.105.174.164 - 46.105.174.167 pt -46.105.174.168 - 46.105.174.175 pl -46.105.174.176 - 46.105.174.179 fr -46.105.174.180 - 46.105.174.187 be -46.105.174.188 - 46.105.174.191 de -46.105.174.192 - 46.105.174.207 fr -46.105.174.208 - 46.105.174.223 gb -46.105.174.224 - 46.105.174.239 fr -46.105.174.240 - 46.105.174.243 be -46.105.174.244 - 46.105.174.247 pl -46.105.174.248 - 46.105.174.251 gb -46.105.174.252 - 46.105.174.255 fr -46.105.175.0 - 46.105.175.3 pl -46.105.175.4 - 46.105.175.7 de -46.105.175.8 - 46.105.175.11 es -46.105.175.12 - 46.105.175.15 fr -46.105.175.16 - 46.105.175.23 nl -46.105.175.24 - 46.105.175.31 pl -46.105.175.32 - 46.105.175.99 fr -46.105.175.100 - 46.105.175.103 es -46.105.175.104 - 46.105.175.111 it -46.105.175.112 - 46.105.175.127 fr -46.105.175.128 - 46.105.175.143 gb -46.105.175.144 - 46.105.175.147 pl -46.105.175.148 - 46.105.175.151 be -46.105.175.152 - 46.105.175.175 pl -46.105.175.176 - 46.105.175.191 fr -46.105.175.192 - 46.105.175.255 pl -46.105.176.0 - 46.105.177.255 de -46.105.178.0 - 46.105.178.15 fr -46.105.178.16 - 46.105.178.19 pl -46.105.178.20 - 46.105.178.23 de -46.105.178.24 - 46.105.178.31 fr -46.105.178.32 - 46.105.178.47 pl -46.105.178.48 - 46.105.178.51 fr -46.105.178.52 - 46.105.178.55 be -46.105.178.56 - 46.105.178.63 it -46.105.178.64 - 46.105.178.67 fr -46.105.178.68 - 46.105.178.71 es -46.105.178.72 - 46.105.178.75 cz -46.105.178.76 - 46.105.178.79 gb -46.105.178.80 - 46.105.178.87 pl -46.105.178.88 - 46.105.178.91 es -46.105.178.92 - 46.105.178.95 nl -46.105.178.96 - 46.105.178.111 fr -46.105.178.112 - 46.105.178.119 gb -46.105.178.120 - 46.105.178.127 pl -46.105.178.128 - 46.105.178.135 fr -46.105.178.136 - 46.105.178.143 es -46.105.178.144 - 46.105.178.159 be -46.105.178.160 - 46.105.178.175 pl -46.105.178.176 - 46.105.178.183 fr -46.105.178.184 - 46.105.178.191 gb -46.105.178.192 - 46.105.178.223 fr -46.105.178.224 - 46.105.178.239 pl -46.105.178.240 - 46.105.178.247 gb -46.105.178.248 - 46.105.178.251 fr -46.105.178.252 - 46.105.179.15 pl -46.105.179.16 - 46.105.179.31 be -46.105.179.32 - 46.105.179.39 gb -46.105.179.40 - 46.105.179.47 fr -46.105.179.48 - 46.105.179.55 be -46.105.179.56 - 46.105.179.59 ch -46.105.179.60 - 46.105.179.63 it -46.105.179.64 - 46.105.179.83 pl -46.105.179.84 - 46.105.179.87 fr -46.105.179.88 - 46.105.179.111 de -46.105.179.112 - 46.105.179.127 fr -46.105.179.128 - 46.105.179.159 es -46.105.179.160 - 46.105.179.175 fr -46.105.179.176 - 46.105.179.191 pt -46.105.179.192 - 46.105.179.223 es -46.105.179.224 - 46.105.179.227 it -46.105.179.228 - 46.105.179.231 fr -46.105.179.232 - 46.105.179.239 pl -46.105.179.240 - 46.105.179.255 pt -46.105.180.0 - 46.105.180.199 fr -46.105.180.200 - 46.105.180.223 pl -46.105.180.224 - 46.105.180.227 lt -46.105.180.228 - 46.105.180.231 pl -46.105.180.232 - 46.105.180.235 de -46.105.180.236 - 46.105.180.239 gb -46.105.180.240 - 46.105.180.255 es -46.105.181.0 - 46.105.181.63 fr -46.105.181.64 - 46.105.181.127 es -46.105.181.128 - 46.105.181.143 pt -46.105.181.144 - 46.105.181.159 gb -46.105.181.160 - 46.105.181.255 fr -46.105.182.0 - 46.105.182.15 it -46.105.182.16 - 46.105.182.31 pl -46.105.182.32 - 46.105.182.35 ch -46.105.182.36 - 46.105.182.39 de -46.105.182.40 - 46.105.182.47 fr -46.105.182.48 - 46.105.182.63 de -46.105.182.64 - 46.105.182.95 pl -46.105.182.96 - 46.105.182.99 es -46.105.182.100 - 46.105.182.103 fr -46.105.182.104 - 46.105.182.107 es -46.105.182.108 - 46.105.182.111 fr -46.105.182.112 - 46.105.182.127 gb -46.105.182.128 - 46.105.183.15 fr -46.105.183.16 - 46.105.183.23 gb -46.105.183.24 - 46.105.183.27 it -46.105.183.28 - 46.105.183.31 pl -46.105.183.32 - 46.105.183.47 fr -46.105.183.48 - 46.105.183.63 es -46.105.183.64 - 46.105.183.79 pl -46.105.183.80 - 46.105.183.83 fr -46.105.183.84 - 46.105.183.87 gb -46.105.183.88 - 46.105.183.91 es -46.105.183.92 - 46.105.183.95 be -46.105.183.96 - 46.105.183.111 pt -46.105.183.112 - 46.105.183.119 es -46.105.183.120 - 46.105.183.127 it -46.105.183.128 - 46.105.183.131 fr -46.105.183.132 - 46.105.183.135 de -46.105.183.136 - 46.105.183.139 nl -46.105.183.140 - 46.105.183.143 pl -46.105.183.144 - 46.105.183.163 fr +46.105.143.160 - 46.105.146.159 fr +46.105.146.160 - 46.105.146.163 de +46.105.146.164 - 46.105.147.127 fr +46.105.147.128 - 46.105.147.128 de +46.105.147.129 - 46.105.148.97 fr +46.105.148.98 - 46.105.148.98 es +46.105.148.99 - 46.105.156.35 fr +46.105.156.36 - 46.105.156.39 es +46.105.156.40 - 46.105.156.55 fr +46.105.156.56 - 46.105.156.59 es +46.105.156.60 - 46.105.156.231 fr +46.105.156.232 - 46.105.156.235 it +46.105.156.236 - 46.105.157.223 fr +46.105.157.224 - 46.105.157.239 de +46.105.157.240 - 46.105.158.87 fr +46.105.158.88 - 46.105.158.95 de +46.105.158.96 - 46.105.158.219 fr +46.105.158.220 - 46.105.158.223 es +46.105.158.224 - 46.105.162.79 fr +46.105.162.80 - 46.105.162.95 be +46.105.162.96 - 46.105.165.239 fr +46.105.165.240 - 46.105.165.255 be +46.105.166.0 - 46.105.166.83 fr +46.105.166.84 - 46.105.166.87 es +46.105.166.88 - 46.105.166.179 fr +46.105.166.180 - 46.105.166.183 es +46.105.166.184 - 46.105.171.79 fr +46.105.171.80 - 46.105.171.83 nl +46.105.171.84 - 46.105.172.223 fr +46.105.172.224 - 46.105.172.227 de +46.105.172.228 - 46.105.172.255 fr +46.105.173.0 - 46.105.173.1 gb +46.105.173.2 - 46.105.173.2 es +46.105.173.3 - 46.105.173.3 gb +46.105.173.4 - 46.105.173.255 es +46.105.174.0 - 46.105.179.172 fr +46.105.179.173 - 46.105.179.174 fi +46.105.179.175 - 46.105.180.195 fr +46.105.180.196 - 46.105.180.199 es +46.105.180.200 - 46.105.183.163 fr 46.105.183.164 - 46.105.183.167 ie -46.105.183.168 - 46.105.183.175 gb -46.105.183.176 - 46.105.183.191 fr -46.105.183.192 - 46.105.183.207 it -46.105.183.208 - 46.105.183.215 be -46.105.183.216 - 46.105.183.223 pl -46.105.183.224 - 46.105.183.255 de -46.105.184.0 - 46.105.184.127 gb -46.105.184.128 - 46.105.184.131 pt -46.105.184.132 - 46.105.184.135 ie -46.105.184.136 - 46.105.184.151 fr -46.105.184.152 - 46.105.184.155 es -46.105.184.156 - 46.105.184.159 ie -46.105.184.160 - 46.105.184.239 fr -46.105.184.240 - 46.105.184.255 es -46.105.185.0 - 46.105.185.63 nl -46.105.185.64 - 46.105.185.71 de -46.105.185.72 - 46.105.185.79 es -46.105.185.80 - 46.105.185.103 fr -46.105.185.104 - 46.105.185.107 pl -46.105.185.108 - 46.105.185.111 de -46.105.185.112 - 46.105.185.191 fr -46.105.185.192 - 46.105.185.255 be -46.105.186.0 - 46.105.186.63 it -46.105.186.64 - 46.105.186.127 ch -46.105.186.128 - 46.105.186.191 de -46.105.186.192 - 46.105.186.255 fi -46.105.187.0 - 46.105.187.63 gb -46.105.187.64 - 46.105.187.127 pl -46.105.187.128 - 46.105.187.147 fr -46.105.187.148 - 46.105.187.151 es -46.105.187.152 - 46.105.187.155 fr -46.105.187.156 - 46.105.187.159 gb -46.105.187.160 - 46.105.187.163 fr -46.105.187.164 - 46.105.187.167 de -46.105.187.168 - 46.105.187.179 fr -46.105.187.180 - 46.105.187.183 pl -46.105.187.184 - 46.105.187.191 fr -46.105.187.192 - 46.105.187.207 de -46.105.187.208 - 46.105.187.223 ie -46.105.187.224 - 46.105.187.227 nl -46.105.187.228 - 46.105.187.231 fr -46.105.187.232 - 46.105.187.239 es -46.105.187.240 - 46.105.188.15 gb -46.105.188.16 - 46.105.188.23 es -46.105.188.24 - 46.105.188.27 nl -46.105.188.28 - 46.105.188.31 ch -46.105.188.32 - 46.105.188.39 fr -46.105.188.40 - 46.105.188.47 de -46.105.188.48 - 46.105.188.55 fr -46.105.188.56 - 46.105.188.59 de -46.105.188.60 - 46.105.188.63 es -46.105.188.64 - 46.105.188.75 gb -46.105.188.76 - 46.105.188.79 be -46.105.188.80 - 46.105.188.87 fr -46.105.188.88 - 46.105.188.91 de -46.105.188.92 - 46.105.188.95 es -46.105.188.96 - 46.105.188.111 gb -46.105.188.112 - 46.105.188.115 nl -46.105.188.116 - 46.105.188.119 pl -46.105.188.120 - 46.105.188.127 es -46.105.188.128 - 46.105.188.131 de -46.105.188.132 - 46.105.188.135 pt -46.105.188.136 - 46.105.188.159 fr -46.105.188.160 - 46.105.188.163 gb -46.105.188.164 - 46.105.188.167 it -46.105.188.168 - 46.105.188.171 pl -46.105.188.172 - 46.105.188.179 es -46.105.188.180 - 46.105.188.183 fr -46.105.188.184 - 46.105.188.187 pl -46.105.188.188 - 46.105.188.191 it -46.105.188.192 - 46.105.188.199 fr -46.105.188.200 - 46.105.188.203 gb -46.105.188.204 - 46.105.188.207 pt -46.105.188.208 - 46.105.188.239 fr -46.105.188.240 - 46.105.188.243 pl -46.105.188.244 - 46.105.188.247 fr -46.105.188.248 - 46.105.188.251 lt -46.105.188.252 - 46.105.188.255 gb -46.105.189.0 - 46.105.189.23 de -46.105.189.24 - 46.105.189.31 fr -46.105.189.32 - 46.105.189.39 it -46.105.189.40 - 46.105.189.43 pl -46.105.189.44 - 46.105.189.47 de -46.105.189.48 - 46.105.189.51 fr -46.105.189.52 - 46.105.189.55 es -46.105.189.56 - 46.105.189.67 de -46.105.189.68 - 46.105.189.71 fr -46.105.189.72 - 46.105.189.75 gb -46.105.189.76 - 46.105.189.103 fr -46.105.189.104 - 46.105.189.107 ie -46.105.189.108 - 46.105.189.111 es -46.105.189.112 - 46.105.189.127 fr -46.105.189.128 - 46.105.190.255 gb -46.105.191.0 - 46.105.191.3 fr -46.105.191.4 - 46.105.191.7 pl -46.105.191.8 - 46.105.191.11 ch -46.105.191.12 - 46.105.191.15 fr -46.105.191.16 - 46.105.191.31 ie -46.105.191.32 - 46.105.191.63 ch -46.105.191.64 - 46.105.191.83 it -46.105.191.84 - 46.105.191.87 nl -46.105.191.88 - 46.105.191.91 pl -46.105.191.92 - 46.105.191.95 pt -46.105.191.96 - 46.105.191.127 fr -46.105.191.128 - 46.105.191.131 be -46.105.191.132 - 46.105.191.135 de -46.105.191.136 - 46.105.191.183 fr -46.105.191.184 - 46.105.191.191 pl -46.105.191.192 - 46.105.191.219 fr -46.105.191.220 - 46.105.191.223 nl -46.105.191.224 - 46.105.191.239 it -46.105.191.240 - 46.105.191.255 gb -46.105.192.0 - 46.105.223.255 fr -46.105.224.0 - 46.105.224.31 de -46.105.224.32 - 46.105.224.63 fr -46.105.224.64 - 46.105.224.79 pl -46.105.224.80 - 46.105.224.95 it -46.105.224.96 - 46.105.224.127 pt -46.105.224.128 - 46.105.224.143 ie -46.105.224.144 - 46.105.224.163 fr -46.105.224.164 - 46.105.224.167 gb -46.105.224.168 - 46.105.224.191 fr -46.105.224.192 - 46.105.224.223 de -46.105.224.224 - 46.105.224.255 fr -46.105.225.0 - 46.105.225.63 es -46.105.225.64 - 46.105.225.111 fr -46.105.225.112 - 46.105.225.115 pl -46.105.225.116 - 46.105.225.119 es -46.105.225.120 - 46.105.225.127 it -46.105.225.128 - 46.105.225.143 gb -46.105.225.144 - 46.105.225.159 pl -46.105.225.160 - 46.105.225.167 pt -46.105.225.168 - 46.105.225.175 be -46.105.225.176 - 46.105.225.183 it -46.105.225.184 - 46.105.225.187 pt -46.105.225.188 - 46.105.225.191 gb -46.105.225.192 - 46.105.225.223 fr -46.105.225.224 - 46.105.225.227 pl -46.105.225.228 - 46.105.225.231 es -46.105.225.232 - 46.105.225.235 pl -46.105.225.236 - 46.105.225.239 pt -46.105.225.240 - 46.105.225.247 nl -46.105.225.248 - 46.105.225.251 lt -46.105.225.252 - 46.105.227.31 fr -46.105.227.32 - 46.105.227.255 pt -46.105.228.0 - 46.105.228.31 fr -46.105.228.32 - 46.105.228.35 de -46.105.228.36 - 46.105.228.43 nl -46.105.228.44 - 46.105.228.47 pl -46.105.228.48 - 46.105.228.159 fr -46.105.228.160 - 46.105.228.163 pl -46.105.228.164 - 46.105.228.167 es -46.105.228.168 - 46.105.228.171 fi -46.105.228.172 - 46.105.228.175 fr -46.105.228.176 - 46.105.228.207 gb -46.105.228.208 - 46.105.228.211 de -46.105.228.212 - 46.105.228.215 pl -46.105.228.216 - 46.105.228.219 es -46.105.228.220 - 46.105.228.223 pl -46.105.228.224 - 46.105.228.255 es -46.105.229.0 - 46.105.229.15 ch -46.105.229.16 - 46.105.229.135 fr -46.105.229.136 - 46.105.229.143 es -46.105.229.144 - 46.105.229.147 be -46.105.229.148 - 46.105.229.151 it -46.105.229.152 - 46.105.229.159 fr -46.105.229.160 - 46.105.229.175 pl -46.105.229.176 - 46.105.229.191 ie -46.105.229.192 - 46.105.229.199 de -46.105.229.200 - 46.105.229.223 pl -46.105.229.224 - 46.105.229.255 ch -46.105.230.0 - 46.105.230.3 pl -46.105.230.4 - 46.105.230.7 de -46.105.230.8 - 46.105.230.11 ch -46.105.230.12 - 46.105.230.19 pl -46.105.230.20 - 46.105.230.31 fr -46.105.230.32 - 46.105.230.47 nl -46.105.230.48 - 46.105.230.95 fr -46.105.230.96 - 46.105.230.99 es -46.105.230.100 - 46.105.230.103 cz -46.105.230.104 - 46.105.230.111 es -46.105.230.112 - 46.105.230.127 fr -46.105.230.128 - 46.105.230.159 de -46.105.230.160 - 46.105.230.223 fr -46.105.230.224 - 46.105.230.255 ie -46.105.231.0 - 46.105.232.7 fr -46.105.232.8 - 46.105.232.11 pl -46.105.232.12 - 46.105.232.15 ie -46.105.232.16 - 46.105.232.31 nl -46.105.232.32 - 46.105.232.39 fr -46.105.232.40 - 46.105.232.43 cz -46.105.232.44 - 46.105.232.63 pl -46.105.232.64 - 46.105.232.71 de -46.105.232.72 - 46.105.232.75 es -46.105.232.76 - 46.105.232.95 fr -46.105.232.96 - 46.105.232.111 ie -46.105.232.112 - 46.105.232.115 pl -46.105.232.116 - 46.105.232.127 fr -46.105.232.128 - 46.105.232.131 es -46.105.232.132 - 46.105.232.135 pl -46.105.232.136 - 46.105.232.139 pt -46.105.232.140 - 46.105.232.143 es -46.105.232.144 - 46.105.232.159 fr -46.105.232.160 - 46.105.232.175 es -46.105.232.176 - 46.105.232.179 gb -46.105.232.180 - 46.105.232.183 de -46.105.232.184 - 46.105.232.191 fr -46.105.232.192 - 46.105.232.199 ie -46.105.232.200 - 46.105.232.203 ch -46.105.232.204 - 46.105.232.207 de -46.105.232.208 - 46.105.232.215 nl -46.105.232.216 - 46.105.232.223 fr -46.105.232.224 - 46.105.232.227 be -46.105.232.228 - 46.105.232.231 pt -46.105.232.232 - 46.105.232.235 es -46.105.232.236 - 46.105.232.239 pl -46.105.232.240 - 46.105.232.255 es -46.105.233.0 - 46.105.233.15 ie -46.105.233.16 - 46.105.233.19 pl -46.105.233.20 - 46.105.233.23 fr -46.105.233.24 - 46.105.233.27 pl -46.105.233.28 - 46.105.233.31 gb -46.105.233.32 - 46.105.233.47 fr -46.105.233.48 - 46.105.233.63 nl -46.105.233.64 - 46.105.233.95 de -46.105.233.96 - 46.105.233.103 fr -46.105.233.104 - 46.105.233.107 lt -46.105.233.108 - 46.105.233.111 pt -46.105.233.112 - 46.105.233.119 de -46.105.233.120 - 46.105.233.127 fr -46.105.233.128 - 46.105.233.159 gb -46.105.233.160 - 46.105.233.163 pl -46.105.233.164 - 46.105.233.167 es -46.105.233.168 - 46.105.233.171 fr -46.105.233.172 - 46.105.233.175 de -46.105.233.176 - 46.105.233.191 pt -46.105.233.192 - 46.105.233.195 ch -46.105.233.196 - 46.105.233.199 pl -46.105.233.200 - 46.105.233.203 cz -46.105.233.204 - 46.105.233.207 it -46.105.233.208 - 46.105.233.211 gb -46.105.233.212 - 46.105.233.215 pl -46.105.233.216 - 46.105.233.223 fr -46.105.233.224 - 46.105.233.227 ie -46.105.233.228 - 46.105.233.231 fr -46.105.233.232 - 46.105.233.235 gb -46.105.233.236 - 46.105.233.239 es -46.105.233.240 - 46.105.233.255 fr -46.105.234.0 - 46.105.234.15 gb -46.105.234.16 - 46.105.234.19 fr -46.105.234.20 - 46.105.234.23 pl -46.105.234.24 - 46.105.234.31 fr -46.105.234.32 - 46.105.234.35 gb -46.105.234.36 - 46.105.234.39 fr -46.105.234.40 - 46.105.234.43 be -46.105.234.44 - 46.105.234.47 de -46.105.234.48 - 46.105.234.51 cz -46.105.234.52 - 46.105.234.63 fr -46.105.234.64 - 46.105.234.103 pl -46.105.234.104 - 46.105.234.107 fr -46.105.234.108 - 46.105.234.111 it -46.105.234.112 - 46.105.234.115 de -46.105.234.116 - 46.105.234.119 pl -46.105.234.120 - 46.105.234.123 es -46.105.234.124 - 46.105.234.127 pl -46.105.234.128 - 46.105.234.159 fr -46.105.234.160 - 46.105.234.175 de -46.105.234.176 - 46.105.234.207 fr -46.105.234.208 - 46.105.235.15 gb -46.105.235.16 - 46.105.235.51 fr -46.105.235.52 - 46.105.235.55 gb -46.105.235.56 - 46.105.235.79 fr -46.105.235.80 - 46.105.235.83 de -46.105.235.84 - 46.105.235.135 fr -46.105.235.136 - 46.105.235.139 cz -46.105.235.140 - 46.105.235.191 fr -46.105.235.192 - 46.105.235.223 be -46.105.235.224 - 46.105.235.231 de -46.105.235.232 - 46.105.235.235 pl -46.105.235.236 - 46.105.235.239 gb -46.105.235.240 - 46.105.235.243 fr -46.105.235.244 - 46.105.235.247 nl -46.105.235.248 - 46.105.235.255 be -46.105.236.0 - 46.105.236.31 fr -46.105.236.32 - 46.105.236.47 nl -46.105.236.48 - 46.105.236.63 de -46.105.236.64 - 46.105.236.127 ie -46.105.236.128 - 46.105.236.131 nl -46.105.236.132 - 46.105.236.135 es -46.105.236.136 - 46.105.236.139 pl -46.105.236.140 - 46.105.236.143 fr -46.105.236.144 - 46.105.236.159 it -46.105.236.160 - 46.105.236.175 fr -46.105.236.176 - 46.105.236.191 pl -46.105.236.192 - 46.105.236.207 pt -46.105.236.208 - 46.105.236.223 fr -46.105.236.224 - 46.105.236.255 de -46.105.237.0 - 46.105.237.31 pt -46.105.237.32 - 46.105.237.39 ch -46.105.237.40 - 46.105.237.43 pl -46.105.237.44 - 46.105.237.47 de -46.105.237.48 - 46.105.237.63 gb -46.105.237.64 - 46.105.237.79 fr -46.105.237.80 - 46.105.237.83 es -46.105.237.84 - 46.105.237.87 pl -46.105.237.88 - 46.105.237.95 gb -46.105.237.96 - 46.105.237.127 ie -46.105.237.128 - 46.105.237.255 fr -46.105.238.0 - 46.105.238.3 de -46.105.238.4 - 46.105.238.15 pl -46.105.238.16 - 46.105.238.19 gb -46.105.238.20 - 46.105.238.27 pl -46.105.238.28 - 46.105.238.39 fr -46.105.238.40 - 46.105.238.43 pl -46.105.238.44 - 46.105.238.47 es -46.105.238.48 - 46.105.238.51 be -46.105.238.52 - 46.105.238.55 pl -46.105.238.56 - 46.105.238.59 it -46.105.238.60 - 46.105.238.147 fr -46.105.238.148 - 46.105.238.151 de -46.105.238.152 - 46.105.238.155 fr -46.105.238.156 - 46.105.238.191 pl -46.105.238.192 - 46.105.238.207 it -46.105.238.208 - 46.105.239.15 fr -46.105.239.16 - 46.105.239.63 it -46.105.239.64 - 46.105.239.79 fr -46.105.239.80 - 46.105.239.111 it -46.105.239.112 - 46.105.239.115 lt -46.105.239.116 - 46.105.239.127 es -46.105.239.128 - 46.105.239.143 pl -46.105.239.144 - 46.105.239.155 de -46.105.239.156 - 46.105.239.159 fr -46.105.239.160 - 46.105.239.163 pl -46.105.239.164 - 46.105.239.167 de -46.105.239.168 - 46.105.239.171 pt -46.105.239.172 - 46.105.239.175 be -46.105.239.176 - 46.105.239.191 pt -46.105.239.192 - 46.105.239.223 fr -46.105.239.224 - 46.105.239.227 de -46.105.239.228 - 46.105.239.239 fr -46.105.239.240 - 46.105.239.243 pl -46.105.239.244 - 46.105.239.247 pt -46.105.239.248 - 46.105.239.255 fr -46.105.240.0 - 46.105.240.7 de -46.105.240.8 - 46.105.240.15 pt -46.105.240.16 - 46.105.240.23 fr -46.105.240.24 - 46.105.240.31 pl -46.105.240.32 - 46.105.240.47 gb -46.105.240.48 - 46.105.240.63 fr -46.105.240.64 - 46.105.240.127 it -46.105.240.128 - 46.105.240.159 fr -46.105.240.160 - 46.105.240.167 be -46.105.240.168 - 46.105.240.171 fi -46.105.240.172 - 46.105.240.175 pl -46.105.240.176 - 46.105.240.183 it -46.105.240.184 - 46.105.240.191 pl -46.105.240.192 - 46.105.240.255 fr -46.105.241.0 - 46.105.241.31 gb -46.105.241.32 - 46.105.241.47 fr -46.105.241.48 - 46.105.241.63 es -46.105.241.64 - 46.105.241.95 gb -46.105.241.96 - 46.105.241.191 es -46.105.241.192 - 46.105.241.255 pl -46.105.242.0 - 46.105.242.15 fr -46.105.242.16 - 46.105.242.23 gb -46.105.242.24 - 46.105.242.35 pl -46.105.242.36 - 46.105.242.39 es -46.105.242.40 - 46.105.242.47 fr -46.105.242.48 - 46.105.242.63 de -46.105.242.64 - 46.105.242.127 nl -46.105.242.128 - 46.105.242.159 pt -46.105.242.160 - 46.105.242.163 ie -46.105.242.164 - 46.105.242.167 gb -46.105.242.168 - 46.105.242.171 pl -46.105.242.172 - 46.105.242.175 fr -46.105.242.176 - 46.105.242.179 pl -46.105.242.180 - 46.105.242.183 es -46.105.242.184 - 46.105.242.215 fr -46.105.242.216 - 46.105.242.231 de -46.105.242.232 - 46.105.242.247 gb -46.105.242.248 - 46.105.242.255 it -46.105.243.0 - 46.105.243.7 pt -46.105.243.8 - 46.105.243.15 es -46.105.243.16 - 46.105.243.23 fi -46.105.243.24 - 46.105.243.31 nl -46.105.243.32 - 46.105.243.47 fr -46.105.243.48 - 46.105.243.51 pl -46.105.243.52 - 46.105.243.55 nl -46.105.243.56 - 46.105.243.63 fr -46.105.243.64 - 46.105.243.79 be -46.105.243.80 - 46.105.243.95 fr -46.105.243.96 - 46.105.243.111 gb -46.105.243.112 - 46.105.243.127 fr -46.105.243.128 - 46.105.243.131 be -46.105.243.132 - 46.105.243.135 ch -46.105.243.136 - 46.105.243.139 de -46.105.243.140 - 46.105.243.151 pl -46.105.243.152 - 46.105.243.155 es -46.105.243.156 - 46.105.243.159 fi -46.105.243.160 - 46.105.243.191 pl -46.105.243.192 - 46.105.243.199 de -46.105.243.200 - 46.105.243.203 cz -46.105.243.204 - 46.105.243.239 fr -46.105.243.240 - 46.105.243.255 nl -46.105.244.0 - 46.105.244.31 pt -46.105.244.32 - 46.105.244.83 fr -46.105.244.84 - 46.105.244.87 pl -46.105.244.88 - 46.105.244.95 es -46.105.244.96 - 46.105.244.115 fr -46.105.244.116 - 46.105.244.119 es -46.105.244.120 - 46.105.244.127 fr -46.105.244.128 - 46.105.244.143 de -46.105.244.144 - 46.105.244.159 fr -46.105.244.160 - 46.105.244.223 de -46.105.244.224 - 46.105.244.231 fi -46.105.244.232 - 46.105.244.239 fr -46.105.244.240 - 46.105.244.243 pl -46.105.244.244 - 46.105.244.247 cz -46.105.244.248 - 46.105.244.251 fi -46.105.244.252 - 46.105.245.7 es -46.105.245.8 - 46.105.245.15 fi -46.105.245.16 - 46.105.245.31 de -46.105.245.32 - 46.105.245.35 es -46.105.245.36 - 46.105.245.39 pl -46.105.245.40 - 46.105.245.47 fr -46.105.245.48 - 46.105.245.51 pl -46.105.245.52 - 46.105.245.55 fr -46.105.245.56 - 46.105.245.59 gb -46.105.245.60 - 46.105.245.63 be -46.105.245.64 - 46.105.245.79 fr -46.105.245.80 - 46.105.245.83 pl -46.105.245.84 - 46.105.245.87 es -46.105.245.88 - 46.105.245.91 de -46.105.245.92 - 46.105.245.95 gb -46.105.245.96 - 46.105.245.111 fr -46.105.245.112 - 46.105.245.127 es -46.105.245.128 - 46.105.245.163 fr -46.105.245.164 - 46.105.245.167 gb -46.105.245.168 - 46.105.245.171 fr -46.105.245.172 - 46.105.245.175 de -46.105.245.176 - 46.105.245.191 fr -46.105.245.192 - 46.105.245.223 de -46.105.245.224 - 46.105.245.239 gb -46.105.245.240 - 46.105.245.247 de -46.105.245.248 - 46.105.245.251 nl -46.105.245.252 - 46.105.246.7 fr -46.105.246.8 - 46.105.246.11 it -46.105.246.12 - 46.105.246.15 es -46.105.246.16 - 46.105.246.19 ie -46.105.246.20 - 46.105.246.23 de -46.105.246.24 - 46.105.246.27 it -46.105.246.28 - 46.105.246.63 gb -46.105.246.64 - 46.105.246.71 it -46.105.246.72 - 46.105.246.95 es -46.105.246.96 - 46.105.246.143 de -46.105.246.144 - 46.105.246.147 pl -46.105.246.148 - 46.105.246.151 it -46.105.246.152 - 46.105.246.155 ch -46.105.246.156 - 46.105.246.159 pl -46.105.246.160 - 46.105.246.191 es -46.105.246.192 - 46.105.246.223 ie -46.105.246.224 - 46.105.246.227 fr -46.105.246.228 - 46.105.246.231 nl -46.105.246.232 - 46.105.247.31 fr -46.105.247.32 - 46.105.247.47 it +46.105.183.168 - 46.105.185.107 fr +46.105.185.108 - 46.105.185.111 es +46.105.185.112 - 46.105.188.143 fr +46.105.188.144 - 46.105.188.151 nl +46.105.188.152 - 46.105.188.159 fr +46.105.188.160 - 46.105.188.163 de +46.105.188.164 - 46.105.188.175 fr +46.105.188.176 - 46.105.188.179 es +46.105.188.180 - 46.105.188.191 fr +46.105.188.192 - 46.105.188.199 nl +46.105.188.200 - 46.105.189.223 fr +46.105.189.224 - 46.105.189.227 it +46.105.189.228 - 46.105.190.247 fr +46.105.190.248 - 46.105.190.255 de +46.105.191.0 - 46.105.215.191 fr +46.105.215.192 - 46.105.215.195 cz +46.105.215.196 - 46.105.216.115 fr +46.105.216.116 - 46.105.216.119 nl +46.105.216.120 - 46.105.221.131 fr +46.105.221.132 - 46.105.221.135 de +46.105.221.136 - 46.105.228.35 fr +46.105.228.36 - 46.105.228.39 it +46.105.228.40 - 46.105.228.127 fr +46.105.228.128 - 46.105.228.143 gb +46.105.228.144 - 46.105.230.47 fr +46.105.230.48 - 46.105.230.63 de +46.105.230.64 - 46.105.231.147 fr +46.105.231.148 - 46.105.231.151 es +46.105.231.152 - 46.105.231.167 fr +46.105.231.168 - 46.105.231.175 nl +46.105.231.176 - 46.105.231.183 be +46.105.231.184 - 46.105.231.187 it +46.105.231.188 - 46.105.232.11 fr +46.105.232.12 - 46.105.232.15 es +46.105.232.16 - 46.105.232.135 fr +46.105.232.136 - 46.105.232.139 es +46.105.232.140 - 46.105.233.231 fr +46.105.233.232 - 46.105.233.235 es +46.105.233.236 - 46.105.235.51 fr +46.105.235.52 - 46.105.235.55 es +46.105.235.56 - 46.105.236.127 fr +46.105.236.128 - 46.105.236.131 es +46.105.236.132 - 46.105.241.223 fr +46.105.241.224 - 46.105.241.255 de +46.105.242.0 - 46.105.243.47 fr +46.105.243.48 - 46.105.243.51 es +46.105.243.52 - 46.105.244.159 fr +46.105.244.160 - 46.105.244.191 de +46.105.244.192 - 46.105.246.247 fr +46.105.246.248 - 46.105.246.255 it +46.105.247.0 - 46.105.247.47 fr 46.105.247.48 - 46.105.247.51 es -46.105.247.52 - 46.105.247.55 fr -46.105.247.56 - 46.105.247.63 it -46.105.247.64 - 46.105.247.95 de -46.105.247.96 - 46.105.247.111 fr -46.105.247.112 - 46.105.247.119 de -46.105.247.120 - 46.105.247.127 es -46.105.247.128 - 46.105.247.143 gb -46.105.247.144 - 46.105.247.191 ie -46.105.247.192 - 46.105.247.195 es -46.105.247.196 - 46.105.247.199 nl -46.105.247.200 - 46.105.247.207 fr -46.105.247.208 - 46.105.247.211 nl -46.105.247.212 - 46.105.247.215 ch -46.105.247.216 - 46.105.247.219 fi -46.105.247.220 - 46.105.247.223 ie -46.105.247.224 - 46.105.247.239 fr -46.105.247.240 - 46.105.247.243 be -46.105.247.244 - 46.105.247.247 fi -46.105.247.248 - 46.105.247.251 fr -46.105.247.252 - 46.105.247.255 gb -46.105.248.0 - 46.105.248.255 fr -46.105.249.0 - 46.105.249.15 it -46.105.249.16 - 46.105.249.19 gb -46.105.249.20 - 46.105.249.23 fr -46.105.249.24 - 46.105.249.27 es -46.105.249.28 - 46.105.249.31 fr -46.105.249.32 - 46.105.249.35 nl -46.105.249.36 - 46.105.249.39 es -46.105.249.40 - 46.105.249.55 fr -46.105.249.56 - 46.105.249.59 pl -46.105.249.60 - 46.105.249.63 es -46.105.249.64 - 46.105.249.95 de -46.105.249.96 - 46.105.249.99 gb -46.105.249.100 - 46.105.249.103 fr -46.105.249.104 - 46.105.249.107 pl -46.105.249.108 - 46.105.249.111 fr -46.105.249.112 - 46.105.249.127 it -46.105.249.128 - 46.105.249.135 ie -46.105.249.136 - 46.105.249.139 fr -46.105.249.140 - 46.105.249.143 pl -46.105.249.144 - 46.105.249.191 ie -46.105.249.192 - 46.105.249.207 es -46.105.249.208 - 46.105.249.211 fr -46.105.249.212 - 46.105.249.215 de -46.105.249.216 - 46.105.249.219 pl -46.105.249.220 - 46.105.249.223 gb -46.105.249.224 - 46.105.249.255 fr -46.105.250.0 - 46.105.250.31 pt -46.105.250.32 - 46.105.250.43 fr -46.105.250.44 - 46.105.250.47 gb -46.105.250.48 - 46.105.250.55 fr -46.105.250.56 - 46.105.250.63 gb -46.105.250.64 - 46.105.250.71 ie -46.105.250.72 - 46.105.250.75 fr -46.105.250.76 - 46.105.250.79 ie -46.105.250.80 - 46.105.250.91 nl -46.105.250.92 - 46.105.250.95 gb -46.105.250.96 - 46.105.250.127 pl -46.105.250.128 - 46.105.250.159 de -46.105.250.160 - 46.105.250.171 fr -46.105.250.172 - 46.105.250.175 es -46.105.250.176 - 46.105.250.191 fr -46.105.250.192 - 46.105.250.199 pt -46.105.250.200 - 46.105.250.207 be -46.105.250.208 - 46.105.250.219 fr -46.105.250.220 - 46.105.250.223 gb -46.105.250.224 - 46.105.250.239 fr -46.105.250.240 - 46.105.250.243 it -46.105.250.244 - 46.105.250.247 cz -46.105.250.248 - 46.105.250.251 nl -46.105.250.252 - 46.105.250.255 pl -46.105.251.0 - 46.105.251.207 fr -46.105.251.208 - 46.105.251.211 pl -46.105.251.212 - 46.105.251.215 fr -46.105.251.216 - 46.105.251.223 es -46.105.251.224 - 46.105.251.255 fr -46.105.252.0 - 46.105.252.63 fi -46.105.252.64 - 46.105.252.79 es -46.105.252.80 - 46.105.252.83 de -46.105.252.84 - 46.105.252.87 pl -46.105.252.88 - 46.105.252.91 fr -46.105.252.92 - 46.105.252.95 it -46.105.252.96 - 46.105.252.223 pt -46.105.252.224 - 46.105.252.227 de -46.105.252.228 - 46.105.252.231 ie -46.105.252.232 - 46.105.252.239 es -46.105.252.240 - 46.105.252.247 fr -46.105.252.248 - 46.105.252.251 be -46.105.252.252 - 46.105.252.255 fi -46.105.253.0 - 46.105.253.255 nl -46.105.254.0 - 46.105.254.7 gb -46.105.254.8 - 46.105.254.11 es -46.105.254.12 - 46.105.254.15 pl -46.105.254.16 - 46.105.254.47 fr -46.105.254.48 - 46.105.254.55 fi -46.105.254.56 - 46.105.254.63 ie -46.105.254.64 - 46.105.254.159 fr -46.105.254.160 - 46.105.254.207 ie -46.105.254.208 - 46.105.254.211 nl -46.105.254.212 - 46.105.254.215 pl -46.105.254.216 - 46.105.254.219 cz -46.105.254.220 - 46.105.254.223 pl -46.105.254.224 - 46.105.254.227 nl -46.105.254.228 - 46.105.254.231 pl -46.105.254.232 - 46.105.254.239 it -46.105.254.240 - 46.105.254.255 fr -46.105.255.0 - 46.105.255.3 ie -46.105.255.4 - 46.105.255.7 fr -46.105.255.8 - 46.105.255.15 ch -46.105.255.16 - 46.105.255.23 fi -46.105.255.24 - 46.105.255.31 fr -46.105.255.32 - 46.105.255.35 it -46.105.255.36 - 46.105.255.39 ch -46.105.255.40 - 46.105.255.43 pl -46.105.255.44 - 46.105.255.47 fr -46.105.255.48 - 46.105.255.55 de -46.105.255.56 - 46.105.255.63 pl -46.105.255.64 - 46.105.255.131 fr -46.105.255.132 - 46.105.255.135 ie -46.105.255.136 - 46.105.255.139 pl -46.105.255.140 - 46.105.255.143 de -46.105.255.144 - 46.105.255.147 nl -46.105.255.148 - 46.105.255.151 pl -46.105.255.152 - 46.105.255.159 es -46.105.255.160 - 46.105.255.171 fr -46.105.255.172 - 46.105.255.175 es -46.105.255.176 - 46.105.255.191 ie -46.105.255.192 - 46.105.255.199 lt -46.105.255.200 - 46.105.255.207 fr -46.105.255.208 - 46.105.255.211 de -46.105.255.212 - 46.105.255.215 es -46.105.255.216 - 46.105.255.219 ie -46.105.255.220 - 46.105.255.223 es -46.105.255.224 - 46.105.255.255 fr +46.105.247.52 - 46.105.248.107 fr +46.105.248.108 - 46.105.248.111 de +46.105.248.112 - 46.105.249.31 fr +46.105.249.32 - 46.105.249.35 es +46.105.249.36 - 46.105.249.107 fr +46.105.249.108 - 46.105.249.111 es +46.105.249.112 - 46.105.249.215 fr +46.105.249.216 - 46.105.249.219 es +46.105.249.220 - 46.105.250.255 fr +46.105.251.0 - 46.105.251.7 cz +46.105.251.8 - 46.105.252.87 fr +46.105.252.88 - 46.105.252.91 es +46.105.252.92 - 46.105.252.227 fr +46.105.252.228 - 46.105.252.231 es +46.105.252.232 - 46.105.254.207 fr +46.105.254.208 - 46.105.254.211 es +46.105.254.212 - 46.105.255.147 fr +46.105.255.148 - 46.105.255.151 es +46.105.255.152 - 46.105.255.207 fr +46.105.255.208 - 46.105.255.211 es +46.105.255.212 - 46.105.255.255 fr 46.106.0.0 - 46.106.255.255 tr 46.107.0.0 - 46.107.255.255 hu 46.108.0.0 - 46.108.255.255 ro @@ -5561,266 +10409,13 @@ 46.133.0.0 - 46.133.255.255 ua 46.134.0.0 - 46.134.255.255 pl 46.135.0.0 - 46.135.255.255 cz -46.136.0.0 - 46.136.0.255 nl -46.136.1.0 - 46.136.1.255 de -46.136.2.0 - 46.136.2.255 fr -46.136.3.0 - 46.136.3.255 gb -46.136.4.0 - 46.136.4.255 sa -46.136.5.0 - 46.136.5.255 it -46.136.6.0 - 46.136.6.255 ax -46.136.7.0 - 46.136.7.255 af -46.136.8.0 - 46.136.8.255 al -46.136.9.0 - 46.136.9.255 dz -46.136.10.0 - 46.136.10.255 as -46.136.11.0 - 46.136.11.255 ad -46.136.12.0 - 46.136.12.255 am -46.136.13.0 - 46.136.13.255 at -46.136.14.0 - 46.136.14.255 az -46.136.15.0 - 46.136.15.255 bh -46.136.16.0 - 46.136.16.255 by -46.136.17.0 - 46.136.17.255 be -46.136.18.0 - 46.136.18.255 ba -46.136.19.0 - 46.136.19.255 bg -46.136.20.0 - 46.136.20.255 hr -46.136.21.0 - 46.136.21.255 cy -46.136.22.0 - 46.136.22.255 cz -46.136.23.0 - 46.136.23.255 dk -46.136.24.0 - 46.136.24.255 ee -46.136.25.0 - 46.136.25.255 fo -46.136.26.0 - 46.136.26.255 fi -46.136.27.0 - 46.136.27.255 fr -46.136.28.0 - 46.136.28.255 ge -46.136.29.0 - 46.136.29.255 de -46.136.30.0 - 46.136.30.255 gi -46.136.31.0 - 46.136.31.255 gr -46.136.32.0 - 46.136.32.255 gl -46.136.33.0 - 46.136.33.255 gg -46.136.34.0 - 46.136.34.255 va -46.136.35.0 - 46.136.35.255 hu -46.136.36.0 - 46.136.36.255 is -46.136.37.0 - 46.136.37.255 ir -46.136.38.0 - 46.136.38.255 iq -46.136.39.0 - 46.136.39.255 ie -46.136.40.0 - 46.136.40.255 im -46.136.41.0 - 46.136.41.255 il -46.136.42.0 - 46.136.42.255 it -46.136.43.0 - 46.136.43.255 je -46.136.44.0 - 46.136.44.255 jo -46.136.45.0 - 46.136.45.255 kz -46.136.46.0 - 46.136.46.255 kw -46.136.47.0 - 46.136.47.255 kg -46.136.48.0 - 46.136.48.255 lv -46.136.49.0 - 46.136.49.255 lb -46.136.50.0 - 46.136.50.255 li -46.136.51.0 - 46.136.51.255 lt -46.136.52.0 - 46.136.52.255 lu -46.136.53.0 - 46.136.53.255 mk -46.136.54.0 - 46.136.54.255 mt -46.136.55.0 - 46.136.55.255 md -46.136.56.0 - 46.136.56.255 mc -46.136.57.0 - 46.136.57.255 me -46.136.58.0 - 46.136.58.255 nl -46.136.59.0 - 46.136.60.255 no -46.136.61.0 - 46.136.61.255 ps -46.136.62.0 - 46.136.62.255 pl -46.136.63.0 - 46.136.63.255 pt -46.136.64.0 - 46.136.64.255 qa -46.136.65.0 - 46.136.65.255 ro -46.136.66.0 - 46.136.66.255 ru -46.136.67.0 - 46.136.67.255 sm -46.136.68.0 - 46.136.68.255 sa -46.136.69.0 - 46.136.69.255 rs -46.136.70.0 - 46.136.70.255 sk -46.136.71.0 - 46.136.71.255 si -46.136.72.0 - 46.136.72.255 es -46.136.73.0 - 46.136.73.255 sj -46.136.74.0 - 46.136.74.255 se -46.136.75.0 - 46.136.75.255 ch -46.136.76.0 - 46.136.76.255 sy -46.136.77.0 - 46.136.77.255 tj -46.136.78.0 - 46.136.78.255 tr -46.136.79.0 - 46.136.79.255 tm -46.136.80.0 - 46.136.80.255 ua -46.136.81.0 - 46.136.81.255 ae -46.136.82.0 - 46.136.82.255 gb -46.136.83.0 - 46.136.83.255 uz -46.136.84.0 - 46.136.84.255 ye -46.136.85.0 - 46.136.85.255 ax -46.136.86.0 - 46.136.86.255 al -46.136.87.0 - 46.136.87.255 ad -46.136.88.0 - 46.136.88.255 am -46.136.89.0 - 46.136.89.255 at -46.136.90.0 - 46.136.90.255 az -46.136.91.0 - 46.136.91.255 bh -46.136.92.0 - 46.136.92.255 by -46.136.93.0 - 46.136.93.255 be -46.136.94.0 - 46.136.94.255 ba -46.136.95.0 - 46.136.95.255 bg -46.136.96.0 - 46.136.96.255 hr -46.136.97.0 - 46.136.97.255 cy -46.136.98.0 - 46.136.98.255 cz -46.136.99.0 - 46.136.99.255 dk -46.136.100.0 - 46.136.100.255 ee -46.136.101.0 - 46.136.101.255 fo -46.136.102.0 - 46.136.102.255 fi -46.136.103.0 - 46.136.103.255 fr -46.136.104.0 - 46.136.104.255 ge -46.136.105.0 - 46.136.105.255 de -46.136.106.0 - 46.136.106.255 gi -46.136.107.0 - 46.136.107.255 gr -46.136.108.0 - 46.136.108.255 gl -46.136.109.0 - 46.136.109.255 gg -46.136.110.0 - 46.136.110.255 va -46.136.111.0 - 46.136.111.255 hu -46.136.112.0 - 46.136.112.255 is -46.136.113.0 - 46.136.113.255 ir -46.136.114.0 - 46.136.114.255 iq -46.136.115.0 - 46.136.115.255 ie -46.136.116.0 - 46.136.116.255 il -46.136.117.0 - 46.136.117.255 it -46.136.118.0 - 46.136.118.255 je -46.136.119.0 - 46.136.119.255 jo -46.136.120.0 - 46.136.120.255 kz -46.136.121.0 - 46.136.121.255 kw -46.136.122.0 - 46.136.122.255 lb -46.136.123.0 - 46.136.123.255 li -46.136.124.0 - 46.136.124.255 lt -46.136.125.0 - 46.136.125.255 lu -46.136.126.0 - 46.136.126.255 mk -46.136.127.0 - 46.136.127.255 mt -46.136.128.0 - 46.136.128.255 nl -46.136.129.0 - 46.136.129.255 it -46.136.130.0 - 46.136.130.255 es -46.136.131.0 - 46.136.131.255 de -46.136.132.0 - 46.136.132.255 fr -46.136.133.0 - 46.136.133.255 ru -46.136.134.0 - 46.136.134.255 ro -46.136.135.0 - 46.136.135.255 bg -46.136.136.0 - 46.136.136.255 dk -46.136.137.0 - 46.136.137.255 at -46.136.138.0 - 46.136.138.255 fi -46.136.139.0 - 46.136.139.255 gr -46.136.140.0 - 46.136.140.255 pl -46.136.141.0 - 46.136.141.255 pt -46.136.142.0 - 46.136.142.255 se -46.136.143.0 - 46.136.143.255 ch -46.136.144.0 - 46.136.144.255 sa -46.136.145.0 - 46.136.145.255 ad -46.136.146.0 - 46.136.146.255 ae -46.136.147.0 - 46.136.147.255 af -46.136.148.0 - 46.136.148.255 ag -46.136.149.0 - 46.136.149.255 ai -46.136.150.0 - 46.136.150.255 al -46.136.151.0 - 46.136.151.255 am -46.136.152.0 - 46.136.152.255 ao -46.136.153.0 - 46.136.153.255 aq -46.136.154.0 - 46.136.154.255 ar -46.136.155.0 - 46.136.155.255 as -46.136.156.0 - 46.136.156.255 at -46.136.157.0 - 46.136.157.255 au -46.136.158.0 - 46.136.158.255 aw -46.136.159.0 - 46.136.159.255 ax -46.136.160.0 - 46.136.160.255 az -46.136.161.0 - 46.136.161.255 ba -46.136.162.0 - 46.136.162.255 bb -46.136.163.0 - 46.136.163.255 bd -46.136.164.0 - 46.136.164.255 be -46.136.165.0 - 46.136.165.255 bf -46.136.166.0 - 46.136.166.255 bg -46.136.167.0 - 46.136.167.255 bh -46.136.168.0 - 46.136.168.255 bi -46.136.169.0 - 46.136.169.255 bj -46.136.170.0 - 46.136.170.255 bm -46.136.171.0 - 46.136.171.255 bn -46.136.172.0 - 46.136.172.255 bo -46.136.173.0 - 46.136.173.255 br -46.136.174.0 - 46.136.174.255 bs -46.136.175.0 - 46.136.175.255 bt -46.136.176.0 - 46.136.176.255 bv -46.136.177.0 - 46.136.177.255 bw -46.136.178.0 - 46.136.178.255 by -46.136.179.0 - 46.136.179.255 bz -46.136.180.0 - 46.136.180.255 ca -46.136.181.0 - 46.136.181.255 cc -46.136.182.0 - 46.136.182.255 cd -46.136.183.0 - 46.136.183.255 cf -46.136.184.0 - 46.136.184.255 cg -46.136.185.0 - 46.136.185.255 ch -46.136.186.0 - 46.136.186.255 ci -46.136.187.0 - 46.136.187.255 ck -46.136.188.0 - 46.136.188.255 cl -46.136.189.0 - 46.136.189.255 cm -46.136.190.0 - 46.136.190.255 cn -46.136.191.0 - 46.136.191.255 co -46.136.192.0 - 46.136.192.255 cr -46.136.193.0 - 46.136.193.255 cu -46.136.194.0 - 46.136.194.255 cv -46.136.195.0 - 46.136.196.255 cy -46.136.197.0 - 46.136.197.255 cz -46.136.198.0 - 46.136.198.255 de -46.136.199.0 - 46.136.199.255 dj -46.136.200.0 - 46.136.200.255 dk -46.136.201.0 - 46.136.201.255 dm -46.136.202.0 - 46.136.202.255 do -46.136.203.0 - 46.136.203.255 dz -46.136.204.0 - 46.136.204.255 ec -46.136.205.0 - 46.136.205.255 ee -46.136.206.0 - 46.136.206.255 eg -46.136.207.0 - 46.136.207.255 eh -46.136.208.0 - 46.136.208.255 er -46.136.209.0 - 46.136.209.255 es -46.136.210.0 - 46.136.210.255 et -46.136.211.0 - 46.136.211.255 fi -46.136.212.0 - 46.136.212.255 fj -46.136.213.0 - 46.136.213.255 fk -46.136.214.0 - 46.136.214.255 fm -46.136.215.0 - 46.136.215.255 fo -46.136.216.0 - 46.136.216.255 fr -46.136.217.0 - 46.136.217.255 ga -46.136.218.0 - 46.136.218.255 gb -46.136.219.0 - 46.136.219.255 gd -46.136.220.0 - 46.136.220.255 ge -46.136.221.0 - 46.136.221.255 gf -46.136.222.0 - 46.136.222.255 gg -46.136.223.0 - 46.136.223.255 gh -46.136.224.0 - 46.136.224.255 gi -46.136.225.0 - 46.136.225.255 gl -46.136.226.0 - 46.136.226.255 gm -46.136.227.0 - 46.136.227.255 gn -46.136.228.0 - 46.136.228.255 gp -46.136.229.0 - 46.136.229.255 gq -46.136.230.0 - 46.136.230.255 gr -46.136.231.0 - 46.136.231.255 gs -46.136.232.0 - 46.136.232.255 gt -46.136.233.0 - 46.136.233.255 gu -46.136.234.0 - 46.136.234.255 gw -46.136.235.0 - 46.136.235.255 gy -46.136.236.0 - 46.136.237.255 hk -46.136.238.0 - 46.136.238.255 hn -46.136.239.0 - 46.136.239.255 hr -46.136.240.0 - 46.136.240.255 ht -46.136.241.0 - 46.136.241.255 hu -46.136.242.0 - 46.136.242.255 id -46.136.243.0 - 46.136.243.255 ie -46.136.244.0 - 46.136.244.255 il -46.136.245.0 - 46.136.245.255 im -46.136.246.0 - 46.136.246.255 in -46.136.247.0 - 46.136.247.255 io -46.136.248.0 - 46.136.248.255 iq -46.136.249.0 - 46.136.249.255 ir -46.136.250.0 - 46.136.250.255 is -46.136.251.0 - 46.136.251.255 it -46.136.252.0 - 46.136.252.255 je -46.136.253.0 - 46.136.253.255 jm -46.136.254.0 - 46.136.254.255 jo -46.136.255.0 - 46.136.255.255 jp -46.137.0.0 - 46.137.191.255 ie -46.137.192.0 - 46.137.207.255 nl -46.137.208.0 - 46.137.215.255 gb -46.137.216.0 - 46.137.223.255 de -46.137.224.0 - 46.137.239.255 fr -46.137.240.0 - 46.137.247.255 se -46.137.248.0 - 46.137.255.255 de +46.136.0.0 - 46.136.255.255 es +46.137.0.0 - 46.137.100.202 ie +46.137.100.203 - 46.137.100.203 eu +46.137.100.204 - 46.137.102.244 ie +46.137.102.245 - 46.137.102.245 eu +46.137.102.246 - 46.137.191.255 ie +46.137.192.0 - 46.137.255.255 sg 46.138.0.0 - 46.138.255.255 ru 46.139.0.0 - 46.139.255.255 hu 46.140.0.0 - 46.140.255.255 ch @@ -5838,8 +10433,9 @@ 46.148.112.0 - 46.148.127.255 ua 46.148.128.0 - 46.148.143.255 ru 46.148.144.0 - 46.148.175.255 pl -46.148.176.0 - 46.148.255.255 ru -46.149.0.0 - 46.149.15.255 ro +46.148.176.0 - 46.148.191.255 ua +46.148.192.0 - 46.148.255.255 ru +46.149.0.0 - 46.149.15.255 sa 46.149.16.0 - 46.149.31.255 is 46.149.32.0 - 46.149.47.255 ru 46.149.48.0 - 46.149.63.255 ua @@ -5864,7 +10460,9 @@ 46.151.32.0 - 46.151.39.255 ro 46.151.40.0 - 46.151.55.255 ua 46.151.56.0 - 46.151.63.255 sk -46.151.64.0 - 46.151.71.255 ua +46.151.64.0 - 46.151.64.255 ua +46.151.65.0 - 46.151.65.255 ru +46.151.66.0 - 46.151.71.255 ua 46.151.72.0 - 46.151.79.255 pl 46.151.80.0 - 46.151.87.255 ua 46.151.88.0 - 46.151.95.255 ru @@ -5873,8 +10471,9 @@ 46.151.112.0 - 46.151.119.255 pl 46.151.120.0 - 46.151.135.255 rs 46.151.136.0 - 46.151.143.255 pl -46.151.144.0 - 46.151.151.255 ua -46.151.152.0 - 46.151.159.255 ru +46.151.144.0 - 46.151.146.255 ru +46.151.147.0 - 46.151.147.255 ua +46.151.148.0 - 46.151.159.255 ru 46.151.160.0 - 46.151.167.255 ro 46.151.168.0 - 46.151.175.255 ru 46.151.176.0 - 46.151.183.255 ua @@ -5892,7 +10491,25 @@ 46.156.0.0 - 46.157.255.255 no 46.158.0.0 - 46.160.63.255 ru 46.160.64.0 - 46.160.127.255 ua -46.160.128.0 - 46.161.63.255 ru +46.160.128.0 - 46.161.11.255 ru +46.161.12.0 - 46.161.15.255 nl +46.161.16.0 - 46.161.55.255 ru +46.161.56.0 - 46.161.56.127 in +46.161.56.128 - 46.161.56.255 cn +46.161.57.0 - 46.161.57.127 tr +46.161.57.128 - 46.161.57.255 jp +46.161.58.0 - 46.161.58.127 sa +46.161.58.128 - 46.161.58.255 il +46.161.59.0 - 46.161.59.127 au +46.161.59.128 - 46.161.59.255 ru +46.161.60.0 - 46.161.60.127 es +46.161.60.128 - 46.161.60.255 ru +46.161.61.0 - 46.161.61.127 is +46.161.61.128 - 46.161.61.255 be +46.161.62.0 - 46.161.62.127 kz +46.161.62.128 - 46.161.62.255 ru +46.161.63.0 - 46.161.63.127 md +46.161.63.128 - 46.161.63.255 ru 46.161.64.0 - 46.161.127.255 me 46.161.128.0 - 46.161.191.255 ru 46.161.192.0 - 46.161.255.255 sy @@ -5900,12 +10517,11 @@ 46.162.64.0 - 46.162.127.255 se 46.162.128.0 - 46.162.191.255 fr 46.162.192.0 - 46.162.255.255 am -46.163.0.0 - 46.163.57.255 si -46.163.58.0 - 46.163.58.255 hr -46.163.59.0 - 46.163.59.255 si -46.163.60.0 - 46.163.60.31 ba -46.163.60.32 - 46.163.60.223 si -46.163.60.224 - 46.163.63.255 ba +46.163.0.0 - 46.163.47.255 si +46.163.48.0 - 46.163.50.255 ba +46.163.51.0 - 46.163.51.255 hr +46.163.52.0 - 46.163.59.255 si +46.163.60.0 - 46.163.63.255 ba 46.163.64.0 - 46.163.127.255 de 46.163.128.0 - 46.163.191.255 ru 46.163.192.0 - 46.163.255.255 fi @@ -5914,37 +10530,36 @@ 46.164.128.0 - 46.164.191.255 ua 46.164.192.0 - 46.165.63.255 ru 46.165.64.0 - 46.165.127.255 fr -46.165.128.0 - 46.165.255.255 de +46.165.128.0 - 46.165.200.67 de +46.165.200.68 - 46.165.200.68 ru +46.165.200.69 - 46.165.255.255 de 46.166.0.0 - 46.166.63.255 md 46.166.64.0 - 46.166.127.255 ru -46.166.128.0 - 46.166.130.255 gb -46.166.131.0 - 46.166.131.255 lu -46.166.132.0 - 46.166.132.0 gb -46.166.132.1 - 46.166.134.255 nl -46.166.135.0 - 46.166.138.255 us -46.166.139.0 - 46.166.139.255 ca -46.166.140.0 - 46.166.140.255 us -46.166.141.0 - 46.166.142.255 ru +46.166.128.0 - 46.166.142.255 nl 46.166.143.0 - 46.166.143.255 lu -46.166.144.0 - 46.166.145.255 fr -46.166.146.0 - 46.166.147.255 ru -46.166.148.0 - 46.166.150.255 nl -46.166.151.0 - 46.166.159.255 de -46.166.160.0 - 46.166.191.255 gb +46.166.144.0 - 46.166.159.255 nl +46.166.160.0 - 46.166.163.143 lt +46.166.163.144 - 46.166.163.151 ch +46.166.163.152 - 46.166.163.231 lt +46.166.163.232 - 46.166.163.239 il +46.166.163.240 - 46.166.164.95 lt +46.166.164.96 - 46.166.164.127 cr +46.166.164.128 - 46.166.168.7 lt +46.166.168.8 - 46.166.168.15 ru +46.166.168.16 - 46.166.175.255 lt +46.166.176.0 - 46.166.191.255 nl 46.166.192.0 - 46.166.255.255 ru 46.167.0.0 - 46.167.63.255 de 46.167.64.0 - 46.167.127.255 ru -46.167.128.0 - 46.167.151.255 de -46.167.152.0 - 46.167.153.255 ch -46.167.154.0 - 46.167.191.255 de +46.167.128.0 - 46.167.191.255 de 46.167.192.0 - 46.167.255.255 cz 46.168.0.0 - 46.171.255.255 pl 46.172.0.0 - 46.172.63.255 ru 46.172.64.0 - 46.172.95.255 ua 46.172.96.0 - 46.172.127.255 ru 46.172.128.0 - 46.172.159.255 ua -46.172.160.0 - 46.172.191.255 ru -46.172.192.0 - 46.172.255.255 ua +46.172.160.0 - 46.172.223.255 ru +46.172.224.0 - 46.172.255.255 ua 46.173.0.0 - 46.173.63.255 ru 46.173.64.0 - 46.173.175.255 ua 46.173.176.0 - 46.173.191.255 ru @@ -5980,7 +10595,11 @@ 46.174.240.0 - 46.174.247.255 ua 46.174.248.0 - 46.174.255.255 ru 46.175.0.0 - 46.175.7.255 sk -46.175.8.0 - 46.175.23.255 ua +46.175.8.0 - 46.175.11.255 ch +46.175.12.0 - 46.175.12.255 ru +46.175.13.0 - 46.175.13.255 gb +46.175.14.0 - 46.175.15.255 pl +46.175.16.0 - 46.175.23.255 ua 46.175.24.0 - 46.175.39.255 ru 46.175.40.0 - 46.175.47.255 pl 46.175.48.0 - 46.175.55.255 gb @@ -6004,15 +10623,16 @@ 46.180.0.0 - 46.181.255.255 ru 46.182.0.0 - 46.182.7.255 fr 46.182.8.0 - 46.182.15.255 ie -46.182.16.0 - 46.182.22.255 de -46.182.23.0 - 46.182.23.255 us +46.182.16.0 - 46.182.23.255 de 46.182.24.0 - 46.182.31.255 ru -46.182.32.0 - 46.182.39.255 pt +46.182.32.0 - 46.182.34.255 pt +46.182.35.0 - 46.182.35.255 es +46.182.36.0 - 46.182.39.255 pt 46.182.40.0 - 46.182.47.255 fr 46.182.48.0 - 46.182.55.255 by -46.182.56.0 - 46.182.59.31 gb -46.182.59.32 - 46.182.59.95 fr -46.182.59.96 - 46.182.63.255 gb +46.182.56.0 - 46.182.58.31 gb +46.182.58.32 - 46.182.58.63 de +46.182.58.64 - 46.182.63.255 gb 46.182.64.0 - 46.182.71.255 tr 46.182.72.0 - 46.182.79.255 fr 46.182.80.0 - 46.182.87.255 ua @@ -6030,8 +10650,7 @@ 46.182.168.0 - 46.182.175.255 am 46.182.176.0 - 46.182.183.255 nl 46.182.184.0 - 46.182.191.255 is -46.182.192.0 - 46.182.199.223 be -46.182.199.224 - 46.182.199.255 nl +46.182.192.0 - 46.182.199.255 be 46.182.200.0 - 46.182.207.255 se 46.182.208.0 - 46.182.215.255 fr 46.182.216.0 - 46.182.223.255 nl @@ -6050,24 +10669,22 @@ 46.183.80.0 - 46.183.87.255 ru 46.183.88.0 - 46.183.95.255 il 46.183.96.0 - 46.183.103.255 de -46.183.104.0 - 46.183.111.255 gb +46.183.104.0 - 46.183.111.255 ch 46.183.112.0 - 46.183.119.255 es 46.183.120.0 - 46.183.127.255 al 46.183.128.0 - 46.183.135.255 ru 46.183.136.0 - 46.183.143.255 dk -46.183.144.0 - 46.183.151.255 fr +46.183.144.0 - 46.183.151.255 nl 46.183.152.0 - 46.183.159.255 de 46.183.160.0 - 46.183.167.255 ru 46.183.168.0 - 46.183.175.255 no 46.183.176.0 - 46.183.183.255 ru -46.183.184.0 - 46.183.191.255 ir 46.183.192.0 - 46.183.207.255 gb 46.183.208.0 - 46.183.215.255 pl 46.183.216.0 - 46.183.223.255 lv 46.183.224.0 - 46.183.231.255 fr 46.183.232.0 - 46.183.239.255 it -46.183.240.0 - 46.183.254.255 nl -46.183.255.0 - 46.183.255.255 be +46.183.240.0 - 46.183.255.255 nl 46.184.0.0 - 46.184.127.255 sa 46.184.128.0 - 46.184.255.255 bh 46.185.0.0 - 46.185.127.255 ua @@ -6078,31 +10695,45 @@ 46.187.128.0 - 46.187.255.255 pl 46.188.0.0 - 46.188.127.255 ru 46.188.128.0 - 46.188.255.255 hr -46.189.0.0 - 46.189.127.255 de +46.189.0.0 - 46.189.120.255 de +46.189.121.0 - 46.189.121.15 al +46.189.121.16 - 46.189.121.31 bg +46.189.121.32 - 46.189.121.47 cz +46.189.121.48 - 46.189.121.63 mk +46.189.121.64 - 46.189.121.127 at +46.189.121.128 - 46.189.121.191 hu +46.189.121.192 - 46.189.121.255 se +46.189.122.0 - 46.189.127.255 de 46.189.128.0 - 46.189.255.255 pt 46.190.0.0 - 46.190.127.255 gr -46.190.128.0 - 46.190.255.255 ro +46.190.128.0 - 46.190.255.255 gb 46.191.0.0 - 46.191.127.255 by 46.191.128.0 - 46.191.255.255 ru 46.192.0.0 - 46.193.255.255 fr 46.194.0.0 - 46.195.255.255 se 46.196.0.0 - 46.197.255.255 tr -46.198.0.0 - 46.198.139.255 gr -46.198.140.0 - 46.199.255.255 cy +46.198.0.0 - 46.198.255.255 gr +46.199.0.0 - 46.199.255.255 cy 46.200.0.0 - 46.203.255.255 ua 46.204.0.0 - 46.205.255.255 pl 46.206.0.0 - 46.207.255.255 at 46.208.0.0 - 46.208.255.255 gb 46.209.0.0 - 46.209.255.255 ir 46.210.0.0 - 46.210.255.255 il -46.211.0.0 - 46.211.255.255 ua +46.211.0.0 - 46.211.113.60 ua +46.211.113.61 - 46.211.113.61 us +46.211.113.62 - 46.211.255.255 ua 46.212.0.0 - 46.212.255.255 no 46.213.0.0 - 46.213.255.255 sy 46.214.0.0 - 46.214.255.255 ro 46.215.0.0 - 46.215.255.255 pl 46.216.0.0 - 46.216.255.255 by 46.217.0.0 - 46.217.255.255 mk -46.218.0.0 - 46.218.255.255 fr +46.218.0.0 - 46.218.180.255 fr +46.218.181.0 - 46.218.181.113 us +46.218.181.114 - 46.218.181.114 fr +46.218.181.115 - 46.218.181.255 us +46.218.182.0 - 46.218.255.255 fr 46.219.0.0 - 46.219.255.255 ua 46.220.0.0 - 46.220.255.255 at 46.221.0.0 - 46.221.255.255 tr @@ -6114,14 +10745,17 @@ 46.226.16.0 - 46.226.23.255 cz 46.226.24.0 - 46.226.31.255 no 46.226.32.0 - 46.226.47.255 es -46.226.48.0 - 46.226.55.255 gb +46.226.48.0 - 46.226.50.226 gb +46.226.50.227 - 46.226.50.227 se +46.226.50.228 - 46.226.55.255 gb 46.226.56.0 - 46.226.63.255 nl 46.226.64.0 - 46.226.71.255 ru 46.226.72.0 - 46.226.79.255 gb 46.226.80.0 - 46.226.87.255 de 46.226.88.0 - 46.226.95.255 nl 46.226.96.0 - 46.226.103.255 ru -46.226.104.0 - 46.226.111.255 fr +46.226.104.0 - 46.226.107.255 fr +46.226.108.0 - 46.226.111.255 lu 46.226.112.0 - 46.226.119.255 de 46.226.120.0 - 46.226.127.255 gb 46.226.128.0 - 46.226.135.255 fr @@ -6145,12 +10779,9 @@ 46.227.16.0 - 46.227.23.255 fr 46.227.24.0 - 46.227.31.255 ru 46.227.32.0 - 46.227.39.255 pl -46.227.40.0 - 46.227.47.255 es -46.227.48.0 - 46.227.55.255 gb +46.227.40.0 - 46.227.55.255 gb 46.227.56.0 - 46.227.63.255 gr -46.227.64.0 - 46.227.66.255 se -46.227.67.0 - 46.227.67.255 mt -46.227.68.0 - 46.227.79.255 se +46.227.64.0 - 46.227.79.255 se 46.227.80.0 - 46.227.87.255 fr 46.227.88.0 - 46.227.103.255 de 46.227.104.0 - 46.227.111.255 pl @@ -6187,9 +10818,7 @@ 46.228.208.0 - 46.228.223.255 sk 46.228.224.0 - 46.228.239.255 pl 46.228.240.0 - 46.228.255.255 it -46.229.0.0 - 46.229.46.255 de -46.229.47.0 - 46.229.47.63 at -46.229.47.64 - 46.229.47.255 de +46.229.0.0 - 46.229.47.255 de 46.229.48.0 - 46.229.63.255 ua 46.229.64.0 - 46.229.79.255 ru 46.229.80.0 - 46.229.95.255 it @@ -6197,17 +10826,15 @@ 46.229.112.0 - 46.229.127.255 cz 46.229.128.0 - 46.229.143.255 ru 46.229.144.0 - 46.229.159.255 pl -46.229.160.0 - 46.229.161.127 us -46.229.161.128 - 46.229.161.255 ua -46.229.162.0 - 46.229.163.255 us -46.229.164.0 - 46.229.175.255 ua +46.229.160.0 - 46.229.175.255 us 46.229.176.0 - 46.229.191.255 ru 46.229.192.0 - 46.229.207.255 bg 46.229.208.0 - 46.229.223.255 ru 46.229.224.0 - 46.229.239.255 sk 46.229.240.0 - 46.229.255.255 hr 46.230.0.0 - 46.230.127.255 sa -46.230.128.0 - 46.230.255.255 se +46.230.128.0 - 46.230.167.255 no +46.230.168.0 - 46.230.255.255 se 46.231.0.0 - 46.231.7.255 es 46.231.8.0 - 46.231.15.255 gb 46.231.16.0 - 46.231.23.255 nl @@ -6220,7 +10847,26 @@ 46.231.88.0 - 46.231.95.255 de 46.231.96.0 - 46.231.103.255 sk 46.231.104.0 - 46.231.111.255 ro -46.231.112.0 - 46.231.119.255 gb +46.231.112.0 - 46.231.112.7 it +46.231.112.8 - 46.231.112.215 gb +46.231.112.216 - 46.231.112.223 it +46.231.112.224 - 46.231.113.119 gb +46.231.113.120 - 46.231.113.127 it +46.231.113.128 - 46.231.113.199 gb +46.231.113.200 - 46.231.113.207 it +46.231.113.208 - 46.231.114.255 gb +46.231.115.0 - 46.231.115.7 it +46.231.115.8 - 46.231.115.151 gb +46.231.115.152 - 46.231.115.159 it +46.231.115.160 - 46.231.117.135 gb +46.231.117.136 - 46.231.117.143 it +46.231.117.144 - 46.231.117.151 gb +46.231.117.152 - 46.231.117.159 it +46.231.117.160 - 46.231.119.87 gb +46.231.119.88 - 46.231.119.95 it +46.231.119.96 - 46.231.119.239 gb +46.231.119.240 - 46.231.119.247 it +46.231.119.248 - 46.231.119.255 gb 46.231.120.0 - 46.231.127.255 es 46.231.128.0 - 46.231.135.255 fr 46.231.136.0 - 46.231.143.255 de @@ -6236,10 +10882,7 @@ 46.231.216.0 - 46.231.223.255 fr 46.231.224.0 - 46.231.231.255 ua 46.231.232.0 - 46.231.239.255 de -46.231.240.0 - 46.231.241.255 ne -46.231.242.0 - 46.231.242.255 us -46.231.243.0 - 46.231.243.255 ne -46.231.244.0 - 46.231.247.255 us +46.231.240.0 - 46.231.247.255 us 46.231.248.0 - 46.231.255.255 nl 46.232.0.0 - 46.232.127.255 ru 46.232.128.0 - 46.232.135.255 pl @@ -6256,48 +10899,62 @@ 46.232.224.0 - 46.232.231.255 de 46.232.232.0 - 46.232.239.255 ua 46.232.240.0 - 46.232.247.255 ru -46.232.248.0 - 46.232.255.255 nl 46.233.0.0 - 46.233.63.255 bg -46.233.64.0 - 46.233.127.255 gb +46.233.64.0 - 46.233.64.255 gb +46.233.65.0 - 46.233.65.255 ie +46.233.66.0 - 46.233.66.255 de +46.233.67.0 - 46.233.67.255 fr +46.233.68.0 - 46.233.68.15 ar +46.233.68.16 - 46.233.68.31 pe +46.233.68.32 - 46.233.68.47 ve +46.233.68.48 - 46.233.127.255 gb 46.233.128.0 - 46.233.191.255 it 46.233.192.0 - 46.233.255.255 ru 46.234.0.0 - 46.234.31.255 tr -46.234.32.0 - 46.234.32.15 eu -46.234.32.16 - 46.234.32.47 ch -46.234.32.48 - 46.234.32.255 eu -46.234.33.0 - 46.234.33.255 ch -46.234.34.0 - 46.234.35.255 eu -46.234.36.0 - 46.234.42.255 ch -46.234.43.0 - 46.234.47.255 eu -46.234.48.0 - 46.234.60.255 ch -46.234.61.0 - 46.234.63.255 eu +46.234.32.0 - 46.234.32.127 eu +46.234.32.128 - 46.234.32.159 ch +46.234.32.160 - 46.234.35.255 eu +46.234.36.0 - 46.234.40.255 ch +46.234.41.0 - 46.234.41.255 eu +46.234.42.0 - 46.234.44.255 ch +46.234.45.0 - 46.234.46.255 eu +46.234.47.0 - 46.234.51.255 ch +46.234.52.0 - 46.234.55.255 eu +46.234.56.0 - 46.234.59.255 ch +46.234.60.0 - 46.234.63.255 eu 46.234.64.0 - 46.234.95.255 hr -46.234.96.0 - 46.234.127.255 cz +46.234.96.0 - 46.234.112.255 cz +46.234.113.0 - 46.234.113.255 us +46.234.114.0 - 46.234.127.255 cz 46.234.128.0 - 46.234.159.255 es 46.234.160.0 - 46.234.191.255 cz 46.234.192.0 - 46.234.255.255 it -46.235.0.0 - 46.235.7.255 bg +46.235.0.0 - 46.235.7.255 gb 46.235.8.0 - 46.235.15.255 tr 46.235.16.0 - 46.235.23.255 fr 46.235.24.0 - 46.235.31.255 de 46.235.32.0 - 46.235.39.255 se 46.235.40.0 - 46.235.47.255 nl -46.235.48.0 - 46.235.55.255 rs +46.235.48.0 - 46.235.55.255 ru 46.235.56.0 - 46.235.63.255 ch 46.235.64.0 - 46.235.71.255 ru 46.235.72.0 - 46.235.79.255 kg 46.235.80.0 - 46.235.87.255 kz 46.235.88.0 - 46.235.95.255 sa 46.235.96.0 - 46.235.103.255 rs -46.235.104.0 - 46.235.104.255 ch -46.235.105.0 - 46.235.119.255 de +46.235.104.0 - 46.235.119.255 de 46.235.120.0 - 46.235.127.255 pl 46.235.128.0 - 46.235.135.255 gg 46.235.136.0 - 46.235.143.255 it 46.235.144.0 - 46.235.151.255 ch -46.235.152.0 - 46.235.153.255 gb -46.235.154.0 - 46.235.155.255 de -46.235.156.0 - 46.235.159.255 eu +46.235.152.0 - 46.235.152.255 gb +46.235.153.0 - 46.235.153.255 fr +46.235.154.0 - 46.235.154.255 de +46.235.155.0 - 46.235.155.255 se +46.235.156.0 - 46.235.156.255 ae +46.235.157.0 - 46.235.157.255 fi +46.235.158.0 - 46.235.158.255 de +46.235.159.0 - 46.235.159.255 eu 46.235.160.0 - 46.235.167.255 ru 46.235.168.0 - 46.235.175.255 gb 46.235.176.0 - 46.235.183.255 fr @@ -6310,7 +10967,9 @@ 46.235.240.0 - 46.235.247.255 de 46.235.248.0 - 46.235.255.255 ru 46.236.0.0 - 46.236.63.255 gb -46.236.64.0 - 46.236.127.255 se +46.236.64.0 - 46.236.70.207 se +46.236.70.208 - 46.236.70.223 no +46.236.70.224 - 46.236.127.255 se 46.236.128.0 - 46.236.191.255 ru 46.236.192.0 - 46.236.255.255 de 46.237.0.0 - 46.237.63.255 ru @@ -6319,22 +10978,7 @@ 46.237.192.0 - 46.237.255.255 de 46.238.0.0 - 46.238.63.255 bg 46.238.64.0 - 46.238.127.255 pl -46.238.128.0 - 46.238.128.255 gp -46.238.129.0 - 46.238.129.255 fr -46.238.130.0 - 46.238.130.255 gp -46.238.131.0 - 46.238.131.255 fr -46.238.132.0 - 46.238.132.255 gp -46.238.133.0 - 46.238.134.255 fr -46.238.135.0 - 46.238.135.255 gp -46.238.136.0 - 46.238.144.255 fr -46.238.145.0 - 46.238.147.255 mq -46.238.148.0 - 46.238.148.255 fr -46.238.149.0 - 46.238.152.255 mq -46.238.153.0 - 46.238.159.255 fr -46.238.160.0 - 46.238.160.255 mq -46.238.161.0 - 46.238.175.255 fr -46.238.176.0 - 46.238.177.255 gf -46.238.178.0 - 46.238.191.255 fr +46.238.128.0 - 46.238.191.255 gp 46.238.192.0 - 46.238.255.255 pl 46.239.0.0 - 46.239.63.255 ba 46.239.64.0 - 46.239.127.255 se @@ -6347,12 +10991,12 @@ 46.242.0.0 - 46.242.127.255 ru 46.242.128.0 - 46.242.255.255 pl 46.243.0.0 - 46.243.7.255 gb +46.243.8.0 - 46.243.15.255 ru 46.243.16.0 - 46.243.23.255 iq 46.243.24.0 - 46.243.31.255 nl 46.243.32.0 - 46.243.39.255 it 46.243.40.0 - 46.243.47.255 nl 46.243.48.0 - 46.243.55.255 cz -46.243.56.0 - 46.243.63.255 it 46.243.64.0 - 46.243.71.255 sk 46.243.72.0 - 46.243.79.255 ru 46.243.80.0 - 46.243.95.255 de @@ -6360,25 +11004,40 @@ 46.243.104.0 - 46.243.111.255 at 46.243.112.0 - 46.243.119.255 ro 46.243.120.0 - 46.243.127.255 de -46.243.128.0 - 46.243.183.255 ru -46.243.184.0 - 46.243.191.255 ua -46.243.192.0 - 46.243.255.255 ru -46.244.0.0 - 46.244.62.255 nl -46.244.63.0 - 46.244.66.255 gb -46.244.67.0 - 46.244.70.255 nl -46.244.71.0 - 46.244.74.255 de -46.244.75.0 - 46.244.78.255 nl -46.244.79.0 - 46.244.82.255 es -46.244.83.0 - 46.244.127.255 nl +46.243.128.0 - 46.243.133.255 ie +46.243.134.0 - 46.243.135.255 gb +46.243.136.0 - 46.243.136.255 mt +46.243.137.0 - 46.243.137.255 ma +46.243.138.0 - 46.243.138.255 de +46.243.139.0 - 46.243.139.255 it +46.243.140.0 - 46.243.140.255 lv +46.243.141.0 - 46.243.141.255 se +46.243.142.0 - 46.243.142.255 bg +46.243.143.0 - 46.243.143.255 gr +46.243.144.0 - 46.243.144.255 im +46.243.145.0 - 46.243.145.255 sy +46.243.146.0 - 46.243.146.255 lb +46.243.147.0 - 46.243.147.255 qa +46.243.148.0 - 46.243.148.255 om +46.243.149.0 - 46.243.149.255 ye +46.243.150.0 - 46.243.150.255 bh +46.243.151.0 - 46.243.159.255 nl +46.243.160.0 - 46.243.255.255 ru +46.244.0.0 - 46.244.31.255 nl +46.244.32.0 - 46.244.47.255 gb +46.244.48.0 - 46.244.63.255 nl +46.244.64.0 - 46.244.95.255 ps +46.244.96.0 - 46.244.99.255 it +46.244.100.0 - 46.244.110.255 nl +46.244.111.0 - 46.244.111.255 it +46.244.112.0 - 46.244.127.255 nl 46.244.128.0 - 46.244.255.255 de 46.245.0.0 - 46.245.127.255 ir 46.245.128.0 - 46.245.135.255 ru 46.245.136.0 - 46.245.143.255 gr 46.245.144.0 - 46.245.151.255 ch 46.245.152.0 - 46.245.159.255 se -46.245.160.0 - 46.245.165.0 tr -46.245.165.1 - 46.245.165.255 nl -46.245.166.0 - 46.245.167.255 tr +46.245.160.0 - 46.245.167.255 tr 46.245.168.0 - 46.245.175.255 ru 46.245.176.0 - 46.245.183.255 de 46.245.184.0 - 46.245.191.255 ch @@ -6388,27 +11047,15 @@ 46.245.216.0 - 46.245.223.255 de 46.245.224.0 - 46.245.239.255 fr 46.245.240.0 - 46.245.255.255 gb -46.246.0.0 - 46.246.79.255 se -46.246.80.0 - 46.246.87.255 us -46.246.88.0 - 46.246.127.255 se +46.246.0.0 - 46.246.31.17 se +46.246.31.18 - 46.246.31.19 fr +46.246.31.20 - 46.246.31.255 se +46.246.32.0 - 46.246.63.255 a1 +46.246.64.0 - 46.246.127.255 se 46.246.128.0 - 46.246.255.255 gr 46.247.0.0 - 46.247.127.255 gb 46.247.128.0 - 46.247.255.255 ua -46.248.0.0 - 46.248.1.255 gb -46.248.2.0 - 46.248.5.255 be -46.248.6.0 - 46.248.7.255 it -46.248.8.0 - 46.248.9.255 fr -46.248.10.0 - 46.248.11.255 de -46.248.12.0 - 46.248.13.255 us -46.248.14.0 - 46.248.15.255 sg -46.248.16.0 - 46.248.17.255 in -46.248.18.0 - 46.248.19.255 es -46.248.20.0 - 46.248.21.255 hk -46.248.22.0 - 46.248.23.255 au -46.248.24.0 - 46.248.25.255 cn -46.248.26.0 - 46.248.27.255 ar -46.248.28.0 - 46.248.29.255 ca -46.248.30.0 - 46.248.31.255 ru +46.248.0.0 - 46.248.31.255 gb 46.248.32.0 - 46.248.63.255 ir 46.248.64.0 - 46.248.95.255 si 46.248.96.0 - 46.248.159.255 gb @@ -6418,7 +11065,9 @@ 46.249.0.0 - 46.249.31.255 ru 46.249.32.0 - 46.249.63.255 nl 46.249.64.0 - 46.249.95.255 bg -46.249.96.0 - 46.249.127.255 ir +46.249.96.0 - 46.249.96.255 ir +46.249.97.0 - 46.249.97.255 de +46.249.98.0 - 46.249.127.255 ir 46.249.128.0 - 46.249.159.255 hu 46.249.160.0 - 46.249.191.255 lt 46.249.192.0 - 46.249.223.255 gb @@ -6437,12 +11086,9 @@ 46.251.128.0 - 46.251.159.255 sa 46.251.160.0 - 46.251.191.255 ir 46.251.192.0 - 46.251.223.255 kg -46.251.224.0 - 46.251.226.255 de -46.251.227.0 - 46.251.228.255 nl -46.251.229.0 - 46.251.229.255 de -46.251.230.0 - 46.251.231.255 nl -46.251.232.0 - 46.251.253.255 de -46.251.254.0 - 46.251.255.255 in +46.251.224.0 - 46.251.233.255 de +46.251.234.0 - 46.251.234.255 gb +46.251.235.0 - 46.251.255.255 de 46.252.0.0 - 46.252.15.255 se 46.252.16.0 - 46.252.31.255 de 46.252.32.0 - 46.252.47.255 al @@ -6450,6 +11096,7 @@ 46.252.64.0 - 46.252.95.255 gb 46.252.96.0 - 46.252.111.255 tr 46.252.112.0 - 46.252.127.255 ru +46.252.128.0 - 46.252.143.255 de 46.252.144.0 - 46.252.159.255 it 46.252.160.0 - 46.252.175.255 ru 46.252.176.0 - 46.252.191.255 fr @@ -6458,9 +11105,7 @@ 46.252.224.0 - 46.252.239.255 cz 46.252.240.0 - 46.252.255.255 ru 46.253.0.0 - 46.253.15.255 bg -46.253.16.0 - 46.253.17.255 de -46.253.18.0 - 46.253.19.255 gb -46.253.20.0 - 46.253.31.255 de +46.253.16.0 - 46.253.31.255 de 46.253.32.0 - 46.253.47.255 es 46.253.48.0 - 46.253.79.255 de 46.253.80.0 - 46.253.95.255 ps @@ -6500,12 +11145,18 @@ 46.254.224.0 - 46.254.231.255 fr 46.254.232.0 - 46.254.239.255 it 46.254.240.0 - 46.254.247.255 ru -46.254.248.0 - 46.255.7.255 gb +46.254.248.0 - 46.254.250.255 je +46.254.251.0 - 46.254.252.255 gb +46.254.253.0 - 46.254.253.255 je +46.254.254.0 - 46.254.254.255 gb +46.254.255.0 - 46.254.255.255 je +46.255.0.0 - 46.255.7.255 gb 46.255.8.0 - 46.255.15.255 cz 46.255.16.0 - 46.255.23.255 no 46.255.24.0 - 46.255.31.255 nl 46.255.32.0 - 46.255.39.255 ua -46.255.40.0 - 46.255.47.255 gb +46.255.40.0 - 46.255.43.255 de +46.255.44.0 - 46.255.47.255 gb 46.255.48.0 - 46.255.55.255 fr 46.255.56.0 - 46.255.63.255 om 46.255.64.0 - 46.255.71.255 uz @@ -6515,35 +11166,60 @@ 46.255.96.0 - 46.255.103.255 ru 46.255.104.0 - 46.255.111.255 nl 46.255.112.0 - 46.255.119.255 gb -46.255.120.0 - 46.255.127.255 se +46.255.120.0 - 46.255.120.255 us +46.255.121.0 - 46.255.122.255 cy +46.255.123.0 - 46.255.124.255 us +46.255.125.0 - 46.255.125.255 gb +46.255.126.0 - 46.255.127.255 cy 46.255.128.0 - 46.255.135.255 fr 46.255.136.0 - 46.255.143.255 ru 46.255.144.0 - 46.255.151.255 al 46.255.152.0 - 46.255.159.255 ie 46.255.160.0 - 46.255.167.255 fr 46.255.168.0 - 46.255.175.255 ch -46.255.176.0 - 46.255.178.31 fr -46.255.178.32 - 46.255.178.47 at -46.255.178.48 - 46.255.178.63 fr -46.255.178.64 - 46.255.178.95 at -46.255.178.96 - 46.255.179.191 fr -46.255.179.192 - 46.255.179.255 at -46.255.180.0 - 46.255.181.81 fr -46.255.181.82 - 46.255.183.255 at +46.255.176.0 - 46.255.178.255 at +46.255.179.0 - 46.255.179.255 fr +46.255.180.0 - 46.255.183.255 at 46.255.184.0 - 46.255.191.255 es 46.255.192.0 - 46.255.199.255 fi 46.255.200.0 - 46.255.207.255 fr 46.255.208.0 - 46.255.215.255 lt 46.255.216.0 - 46.255.223.255 ir -46.255.224.0 - 46.255.230.127 cz -46.255.230.128 - 46.255.230.159 pl -46.255.230.160 - 46.255.231.255 cz +46.255.224.0 - 46.255.231.255 cz 46.255.232.0 - 46.255.239.255 kz 46.255.240.0 - 46.255.247.255 it 46.255.248.0 - 46.255.255.255 gb -47.0.0.0 - 47.255.255.255 ca +47.0.0.0 - 47.7.255.255 ca +47.8.0.0 - 47.9.255.255 sg +47.10.0.0 - 47.10.255.255 ca +47.11.0.0 - 47.11.255.255 sg +47.12.0.0 - 47.14.255.255 ca +47.15.0.0 - 47.15.255.255 sg +47.16.0.0 - 47.23.255.255 us +47.24.0.0 - 47.28.255.255 ca +47.29.0.0 - 47.31.255.255 sg +47.32.0.0 - 47.51.255.255 us +47.52.0.0 - 47.52.255.255 ca +47.53.0.0 - 47.53.255.255 it +47.54.0.0 - 47.57.255.255 ca +47.58.0.0 - 47.63.255.255 es +47.64.0.0 - 47.71.255.255 de +47.72.0.0 - 47.72.255.255 nz +47.73.0.0 - 47.73.255.255 de +47.74.0.0 - 47.89.23.255 ca +47.89.24.0 - 47.89.27.255 hk +47.89.28.0 - 47.91.255.255 ca +47.92.0.0 - 47.127.255.255 cn +47.128.0.0 - 47.142.149.255 ca +47.142.150.0 - 47.142.150.255 us +47.142.151.0 - 47.207.255.255 ca +47.208.0.0 - 47.223.255.255 us +47.224.0.0 - 47.246.255.255 ca +47.247.0.0 - 47.247.255.255 sg +47.248.0.0 - 47.255.255.255 ca 48.0.0.0 - 48.255.255.255 us -49.0.0.0 - 49.0.7.255 id +49.0.0.0 - 49.0.3.255 id +49.0.4.0 - 49.0.7.255 bd 49.0.8.0 - 49.0.15.255 au 49.0.16.0 - 49.0.23.255 jp 49.0.24.0 - 49.0.27.255 id @@ -6579,13 +11255,12 @@ 49.127.0.0 - 49.127.255.255 au 49.128.0.0 - 49.128.0.255 cn 49.128.1.0 - 49.128.1.255 au -49.128.2.0 - 49.128.3.255 cn -49.128.4.0 - 49.128.7.255 au +49.128.2.0 - 49.128.7.255 cn 49.128.8.0 - 49.128.11.255 sg 49.128.12.0 - 49.128.15.255 au 49.128.16.0 - 49.128.31.255 jp 49.128.32.0 - 49.128.63.255 sg -49.128.64.0 - 49.128.95.255 tw +49.128.64.0 - 49.128.95.255 hk 49.128.96.0 - 49.128.103.255 jp 49.128.104.0 - 49.128.107.255 gu 49.128.108.0 - 49.128.111.255 in @@ -6603,16 +11278,16 @@ 49.142.0.0 - 49.143.223.255 kr 49.143.224.0 - 49.143.227.255 au 49.143.228.0 - 49.143.231.255 nz -49.143.232.0 - 49.143.233.7 hk -49.143.233.8 - 49.143.233.15 au -49.143.233.16 - 49.143.235.255 hk +49.143.232.0 - 49.143.233.95 hk +49.143.233.96 - 49.143.233.127 au +49.143.233.128 - 49.143.235.255 hk 49.143.236.0 - 49.143.239.255 au 49.143.240.0 - 49.143.247.255 jp 49.143.248.0 - 49.143.251.255 au 49.143.252.0 - 49.143.255.255 in 49.144.0.0 - 49.151.255.255 ph 49.152.0.0 - 49.155.255.255 cn -49.156.0.0 - 49.156.3.255 mn +49.156.0.0 - 49.156.3.255 pk 49.156.4.0 - 49.156.15.255 jp 49.156.16.0 - 49.156.19.255 au 49.156.20.0 - 49.156.23.255 id @@ -6631,7 +11306,7 @@ 49.208.0.0 - 49.211.255.255 cn 49.212.0.0 - 49.212.255.255 jp 49.213.0.0 - 49.213.15.255 hk -49.213.16.0 - 49.213.31.255 au +49.213.16.0 - 49.213.31.255 sg 49.213.32.0 - 49.213.63.255 in 49.213.64.0 - 49.213.127.255 vn 49.213.128.0 - 49.219.255.255 tw @@ -6666,103 +11341,757 @@ 49.250.0.0 - 49.253.255.255 jp 49.254.0.0 - 49.254.255.255 kr 49.255.0.0 - 49.255.255.255 au -50.0.0.0 - 50.2.27.255 us -50.2.28.0 - 50.2.28.255 ca -50.2.29.0 - 50.2.71.127 us -50.2.71.128 - 50.2.71.159 ca -50.2.71.160 - 50.2.72.255 us -50.2.73.0 - 50.2.73.255 ca -50.2.74.0 - 50.2.101.255 us -50.2.102.0 - 50.2.102.255 ca -50.2.103.0 - 50.2.122.255 us -50.2.123.0 - 50.2.123.255 ca -50.2.124.0 - 50.2.131.255 us -50.2.132.0 - 50.2.133.255 ca -50.2.134.0 - 50.3.15.255 us -50.3.16.0 - 50.3.16.255 ca -50.3.17.0 - 50.3.18.255 us -50.3.19.0 - 50.3.25.255 ca -50.3.26.0 - 50.3.45.255 us -50.3.46.0 - 50.3.65.255 ca -50.3.66.0 - 50.3.149.255 us -50.3.150.0 - 50.3.150.255 ca -50.3.151.0 - 50.3.172.255 us -50.3.173.0 - 50.3.174.255 ca -50.3.175.0 - 50.3.178.255 us -50.3.179.0 - 50.3.179.255 ca -50.3.180.0 - 50.3.182.255 us -50.3.183.0 - 50.3.183.255 ca -50.3.184.0 - 50.3.213.255 us -50.3.214.0 - 50.3.215.255 ca -50.3.216.0 - 50.3.217.255 us -50.3.218.0 - 50.3.218.255 ca -50.3.219.0 - 50.21.127.255 us +50.0.0.0 - 50.2.19.255 us +50.2.20.0 - 50.2.20.255 ca +50.2.21.0 - 50.2.94.255 us +50.2.95.0 - 50.2.95.255 ca +50.2.96.0 - 50.2.252.63 us +50.2.252.64 - 50.2.252.71 cn +50.2.252.72 - 50.3.213.255 us +50.3.214.0 - 50.3.214.255 ca +50.3.215.0 - 50.7.78.87 us +50.7.78.88 - 50.7.78.89 a1 +50.7.78.90 - 50.7.79.255 us +50.7.80.0 - 50.7.83.255 es +50.7.84.0 - 50.7.84.255 us +50.7.85.0 - 50.7.85.255 de +50.7.86.0 - 50.7.86.255 us +50.7.87.0 - 50.7.91.255 de +50.7.92.0 - 50.7.95.255 nl +50.7.96.0 - 50.7.111.255 us +50.7.112.0 - 50.7.112.255 de +50.7.113.0 - 50.7.113.255 at +50.7.114.0 - 50.7.114.255 gb +50.7.115.0 - 50.7.115.255 at +50.7.116.0 - 50.7.119.255 de +50.7.120.0 - 50.7.123.255 nl +50.7.124.0 - 50.7.126.255 de +50.7.127.0 - 50.7.147.255 nl +50.7.148.0 - 50.7.151.255 fr +50.7.152.0 - 50.7.155.255 gb +50.7.156.0 - 50.7.159.255 de +50.7.160.0 - 50.7.183.255 nl +50.7.184.0 - 50.7.184.255 at +50.7.185.0 - 50.7.185.255 cz +50.7.186.0 - 50.7.191.255 nl +50.7.192.0 - 50.7.255.255 cz +50.8.0.0 - 50.21.127.255 us 50.21.128.0 - 50.21.143.255 ca 50.21.144.0 - 50.21.159.255 us 50.21.160.0 - 50.21.175.255 ca 50.21.176.0 - 50.21.223.255 us 50.21.224.0 - 50.21.239.255 ca -50.21.240.0 - 50.56.0.79 us -50.56.0.80 - 50.56.0.87 il -50.56.0.88 - 50.56.2.115 us -50.56.2.116 - 50.56.2.119 gb -50.56.2.120 - 50.56.2.191 us -50.56.2.192 - 50.56.2.195 mx -50.56.2.196 - 50.56.3.19 us -50.56.3.20 - 50.56.3.21 es -50.56.3.22 - 50.56.3.75 us -50.56.3.76 - 50.56.3.77 in -50.56.3.78 - 50.56.11.47 us -50.56.11.48 - 50.56.11.51 br -50.56.11.52 - 50.56.13.107 us -50.56.13.108 - 50.56.13.111 no -50.56.13.112 - 50.56.13.191 us -50.56.13.192 - 50.56.13.195 es -50.56.13.196 - 50.56.16.247 us -50.56.16.248 - 50.56.16.255 is -50.56.17.0 - 50.56.19.159 us -50.56.19.160 - 50.56.19.167 mx -50.56.19.168 - 50.56.42.125 us -50.56.42.126 - 50.56.42.127 za -50.56.42.128 - 50.56.42.155 us -50.56.42.156 - 50.56.42.157 ca -50.56.42.158 - 50.56.45.63 us -50.56.45.64 - 50.56.45.71 nz -50.56.45.72 - 50.56.45.79 us -50.56.45.80 - 50.56.45.87 nz -50.56.45.88 - 50.56.45.95 jo -50.56.45.96 - 50.56.137.87 us -50.56.137.88 - 50.56.137.91 au -50.56.137.92 - 50.56.137.127 us -50.56.137.128 - 50.56.137.131 br -50.56.137.132 - 50.57.5.7 us -50.57.5.8 - 50.57.5.15 gt -50.57.5.16 - 50.57.9.47 us -50.57.9.48 - 50.57.9.63 cz -50.57.9.64 - 50.57.14.143 us -50.57.14.144 - 50.57.14.151 gb -50.57.14.152 - 50.57.20.135 us -50.57.20.136 - 50.57.20.143 ar -50.57.20.144 - 50.57.23.183 us -50.57.23.184 - 50.57.23.191 in -50.57.23.192 - 50.63.255.255 us +50.21.240.0 - 50.30.36.25 us +50.30.36.26 - 50.30.36.28 bz +50.30.36.29 - 50.30.45.28 us +50.30.45.29 - 50.30.45.29 ua +50.30.45.30 - 50.30.45.53 us +50.30.45.54 - 50.30.45.54 ua +50.30.45.55 - 50.30.45.108 us +50.30.45.109 - 50.30.45.109 ua +50.30.45.110 - 50.30.45.110 us +50.30.45.111 - 50.30.45.112 ua +50.30.45.113 - 50.30.151.255 us +50.30.152.0 - 50.30.152.255 ca +50.30.153.0 - 50.31.239.255 us +50.31.240.0 - 50.31.241.255 jp +50.31.242.0 - 50.31.251.255 us +50.31.252.0 - 50.31.255.255 jp +50.32.0.0 - 50.63.255.255 us 50.64.0.0 - 50.72.255.255 ca 50.73.0.0 - 50.91.255.255 us 50.92.0.0 - 50.93.127.255 ca -50.93.128.0 - 50.95.10.127 us -50.95.10.128 - 50.95.10.255 pr -50.95.11.0 - 50.97.255.255 us +50.93.128.0 - 50.97.19.33 us +50.97.19.34 - 50.97.19.34 hk +50.97.19.35 - 50.97.255.255 us 50.98.0.0 - 50.101.255.255 ca 50.102.0.0 - 50.115.175.255 us 50.115.176.0 - 50.115.191.255 ca -50.115.192.0 - 50.117.127.255 us +50.115.192.0 - 50.117.35.255 us +50.117.36.0 - 50.117.36.255 a1 +50.117.37.0 - 50.117.127.255 us 50.117.128.0 - 50.117.255.255 ca -50.118.0.0 - 50.255.255.255 us -51.0.0.0 - 51.255.255.255 gb -52.0.0.0 - 52.255.255.255 us -53.0.0.0 - 53.255.255.255 de -54.0.0.0 - 56.255.255.255 us -57.0.0.0 - 57.255.255.255 eu +50.118.0.0 - 50.118.127.255 us +50.118.128.0 - 50.118.128.255 cn +50.118.129.0 - 50.118.198.19 us +50.118.198.20 - 50.118.198.20 pt +50.118.198.21 - 50.255.255.255 us +51.0.0.0 - 51.3.255.255 gb +51.4.0.0 - 51.5.255.255 de +51.6.0.0 - 51.36.0.255 gb +51.36.1.0 - 51.36.3.255 sa +51.36.4.0 - 51.36.5.255 gb +51.36.6.0 - 51.36.6.255 sa +51.36.7.0 - 51.36.9.127 gb +51.36.9.128 - 51.36.9.255 sa +51.36.10.0 - 51.36.17.255 gb +51.36.18.0 - 51.36.18.255 sa +51.36.19.0 - 51.36.22.255 gb +51.36.23.0 - 51.36.23.255 sa +51.36.24.0 - 51.36.24.255 gb +51.36.25.0 - 51.36.26.255 sa +51.36.27.0 - 51.36.29.255 gb +51.36.30.0 - 51.36.31.255 sa +51.36.32.0 - 51.36.32.255 gb +51.36.33.0 - 51.36.33.255 sa +51.36.34.0 - 51.36.34.255 gb +51.36.35.0 - 51.36.35.255 sa +51.36.36.0 - 51.36.36.255 gb +51.36.37.0 - 51.36.37.255 sa +51.36.38.0 - 51.36.41.255 gb +51.36.42.0 - 51.36.42.255 sa +51.36.43.0 - 51.36.43.255 gb +51.36.44.0 - 51.36.45.255 sa +51.36.46.0 - 51.36.48.255 gb +51.36.49.0 - 51.36.49.255 sa +51.36.50.0 - 51.36.51.255 gb +51.36.52.0 - 51.36.53.255 sa +51.36.54.0 - 51.36.55.255 gb +51.36.56.0 - 51.36.58.255 sa +51.36.59.0 - 51.36.62.255 gb +51.36.63.0 - 51.36.63.255 sa +51.36.64.0 - 51.36.67.255 gb +51.36.68.0 - 51.36.68.255 sa +51.36.69.0 - 51.36.89.255 gb +51.36.90.0 - 51.36.91.255 sa +51.36.92.0 - 51.36.93.255 gb +51.36.94.0 - 51.36.94.255 sa +51.36.95.0 - 51.36.99.255 gb +51.36.100.0 - 51.36.101.255 sa +51.36.102.0 - 51.36.109.255 gb +51.36.110.0 - 51.36.110.255 sa +51.36.111.0 - 51.36.120.255 gb +51.36.121.0 - 51.36.121.255 sa +51.36.122.0 - 51.36.141.255 gb +51.36.142.0 - 51.36.142.255 sa +51.36.143.0 - 51.36.147.255 gb +51.36.148.0 - 51.36.148.255 sa +51.36.149.0 - 51.36.150.255 gb +51.36.151.0 - 51.36.151.255 sa +51.36.152.0 - 51.36.179.255 gb +51.36.180.0 - 51.36.181.255 sa +51.36.182.0 - 51.36.185.255 gb +51.36.186.0 - 51.36.186.255 sa +51.36.187.0 - 51.39.1.255 gb +51.39.2.0 - 51.39.4.255 sa +51.39.5.0 - 51.39.6.255 gb +51.39.7.0 - 51.39.7.255 sa +51.39.8.0 - 51.39.8.255 gb +51.39.9.0 - 51.39.10.255 sa +51.39.11.0 - 51.39.12.255 gb +51.39.13.0 - 51.39.16.255 sa +51.39.17.0 - 51.39.21.255 gb +51.39.22.0 - 51.39.22.255 sa +51.39.23.0 - 51.39.30.255 gb +51.39.31.0 - 51.39.31.255 sa +51.39.32.0 - 51.39.33.255 gb +51.39.34.0 - 51.39.34.255 sa +51.39.35.0 - 51.39.41.255 gb +51.39.42.0 - 51.39.42.255 sa +51.39.43.0 - 51.39.47.255 gb +51.39.48.0 - 51.39.48.255 sa +51.39.49.0 - 51.39.52.255 gb +51.39.53.0 - 51.39.53.255 sa +51.39.54.0 - 51.39.55.255 gb +51.39.56.0 - 51.39.57.255 sa +51.39.58.0 - 51.39.59.255 gb +51.39.60.0 - 51.39.60.255 sa +51.39.61.0 - 51.39.61.255 gb +51.39.62.0 - 51.39.64.255 sa +51.39.65.0 - 51.39.65.255 gb +51.39.66.0 - 51.39.66.255 sa +51.39.67.0 - 51.39.83.127 gb +51.39.83.128 - 51.39.84.255 sa +51.39.85.0 - 51.39.88.255 gb +51.39.89.0 - 51.39.89.255 sa +51.39.90.0 - 51.39.94.255 gb +51.39.95.0 - 51.39.95.255 sa +51.39.96.0 - 51.39.99.255 gb +51.39.100.0 - 51.39.100.255 sa +51.39.101.0 - 51.39.106.255 gb +51.39.107.0 - 51.39.107.255 sa +51.39.108.0 - 51.39.112.255 gb +51.39.113.0 - 51.39.113.255 sa +51.39.114.0 - 51.39.115.255 gb +51.39.116.0 - 51.39.116.255 sa +51.39.117.0 - 51.39.121.255 gb +51.39.122.0 - 51.39.124.255 sa +51.39.125.0 - 51.39.131.255 gb +51.39.132.0 - 51.39.132.255 sa +51.39.133.0 - 51.39.134.255 gb +51.39.135.0 - 51.39.135.255 sa +51.39.136.0 - 51.39.138.255 gb +51.39.139.0 - 51.39.139.255 sa +51.39.140.0 - 51.39.141.255 gb +51.39.142.0 - 51.39.142.255 sa +51.39.143.0 - 51.39.143.218 gb +51.39.143.219 - 51.39.143.219 sa +51.39.143.220 - 51.39.143.255 gb +51.39.144.0 - 51.39.144.255 sa +51.39.145.0 - 51.39.147.255 gb +51.39.148.0 - 51.39.148.255 sa +51.39.149.0 - 51.39.151.255 gb +51.39.152.0 - 51.39.153.255 sa +51.39.154.0 - 51.39.155.255 gb +51.39.156.0 - 51.39.157.255 sa +51.39.158.0 - 51.39.174.255 gb +51.39.175.0 - 51.39.175.255 sa +51.39.176.0 - 51.80.94.207 gb +51.80.94.208 - 51.80.94.211 fr +51.80.94.212 - 51.171.32.255 gb +51.171.33.0 - 51.171.33.255 ie +51.171.34.0 - 51.171.41.255 gb +51.171.42.0 - 51.171.42.255 ie +51.171.43.0 - 51.171.53.255 gb +51.171.54.0 - 51.171.55.255 ie +51.171.56.0 - 51.173.255.255 gb +51.174.0.0 - 51.175.255.255 no +51.176.0.0 - 51.178.255.255 gb +51.179.0.0 - 51.179.127.255 it +51.179.128.0 - 51.210.255.255 gb +51.211.0.0 - 51.211.255.255 sa +51.212.0.0 - 51.217.255.255 gb +51.218.0.0 - 51.218.255.255 sa +51.219.0.0 - 51.222.255.255 gb +51.223.0.0 - 51.223.255.255 sa +51.224.0.0 - 51.234.255.255 gb +51.235.0.0 - 51.235.255.255 sa +51.236.0.0 - 51.251.255.255 gb +51.252.0.0 - 51.253.255.255 sa +51.254.0.0 - 51.254.10.151 fr +51.254.10.152 - 51.254.10.155 cz +51.254.10.156 - 51.254.18.103 fr +51.254.18.104 - 51.254.18.107 de +51.254.18.108 - 51.254.23.63 fr +51.254.23.64 - 51.254.23.95 es +51.254.23.96 - 51.254.27.79 fr +51.254.27.80 - 51.254.27.95 fi +51.254.27.96 - 51.254.50.255 fr +51.254.51.0 - 51.254.51.15 gb +51.254.51.16 - 51.254.61.255 fr +51.254.62.0 - 51.254.62.31 es +51.254.62.32 - 51.254.64.105 fr +51.254.64.106 - 51.254.64.106 pt +51.254.64.107 - 51.254.86.7 fr +51.254.86.8 - 51.254.86.15 gb +51.254.86.16 - 51.254.100.123 fr +51.254.100.124 - 51.254.100.124 pt +51.254.100.125 - 51.254.127.125 fr +51.254.127.126 - 51.254.127.126 pt +51.254.127.127 - 51.254.164.7 fr +51.254.164.8 - 51.254.164.11 cz +51.254.164.12 - 51.254.164.32 fr +51.254.164.33 - 51.254.164.35 pt +51.254.164.36 - 51.254.170.127 fr +51.254.170.128 - 51.254.170.131 fi +51.254.170.132 - 51.254.170.135 ie +51.254.170.136 - 51.254.170.151 fr +51.254.170.152 - 51.254.170.155 it +51.254.170.156 - 51.254.180.39 fr +51.254.180.40 - 51.254.180.43 gb +51.254.180.44 - 51.254.227.63 fr +51.254.227.64 - 51.254.227.95 es +51.254.227.96 - 51.254.236.27 fr +51.254.236.28 - 51.254.236.31 gb +51.254.236.32 - 51.254.245.98 fr +51.254.245.99 - 51.254.245.99 de +51.254.245.100 - 51.254.245.183 fr +51.254.245.184 - 51.254.245.187 pt +51.254.245.188 - 51.255.30.47 fr +51.255.30.48 - 51.255.30.51 pt +51.255.30.52 - 51.255.30.53 fr +51.255.30.54 - 51.255.30.57 pt +51.255.30.58 - 51.255.59.63 fr +51.255.59.64 - 51.255.59.127 nl +51.255.59.128 - 51.255.97.80 fr +51.255.97.81 - 51.255.97.90 es +51.255.97.91 - 51.255.99.255 fr +51.255.100.0 - 51.255.100.127 nl +51.255.100.128 - 51.255.107.209 fr +51.255.107.210 - 51.255.107.211 es +51.255.107.212 - 51.255.119.87 fr +51.255.119.88 - 51.255.119.88 es +51.255.119.89 - 51.255.120.191 fr +51.255.120.192 - 51.255.120.255 es +51.255.121.0 - 51.255.134.95 fr +51.255.134.96 - 51.255.134.127 es +51.255.134.128 - 51.255.151.63 fr +51.255.151.64 - 51.255.151.95 es +51.255.151.96 - 51.255.210.150 fr +51.255.210.151 - 51.255.210.151 pt +51.255.210.152 - 51.255.255.255 fr +52.0.0.0 - 52.15.255.255 us +52.16.0.0 - 52.18.201.130 ie +52.18.201.131 - 52.18.201.131 us +52.18.201.132 - 52.19.255.255 ie +52.20.0.0 - 52.27.255.255 us +52.28.0.0 - 52.29.255.255 de +52.30.0.0 - 52.31.255.255 ie +52.32.0.0 - 52.47.255.255 us +52.48.0.0 - 52.51.255.255 ie +52.52.0.0 - 52.57.255.255 us +52.58.0.0 - 52.59.255.255 de +52.60.0.0 - 52.61.255.255 us +52.62.0.0 - 52.65.255.255 au +52.66.0.0 - 52.66.255.255 us +52.67.0.0 - 52.67.255.255 br +52.68.0.0 - 52.69.255.255 jp +52.70.0.0 - 52.73.255.255 us +52.74.0.0 - 52.74.255.255 sg +52.75.0.0 - 52.75.255.255 us +52.76.0.0 - 52.77.255.255 sg +52.78.0.0 - 52.78.255.255 us +52.79.0.0 - 52.79.255.255 kr +52.80.0.0 - 52.83.255.255 cn +52.84.0.0 - 52.91.255.255 us +52.92.0.0 - 52.92.15.255 kr +52.92.16.0 - 52.92.38.255 us +52.92.39.0 - 52.92.39.255 br +52.92.40.0 - 52.92.47.255 ie +52.92.48.0 - 52.92.51.255 us +52.92.52.0 - 52.92.55.255 au +52.92.56.0 - 52.92.59.255 sg +52.92.60.0 - 52.92.63.255 jp +52.92.64.0 - 52.92.67.255 br +52.92.68.0 - 52.92.71.255 de +52.92.72.0 - 52.92.75.255 br +52.92.76.0 - 52.93.7.255 us +52.93.8.0 - 52.93.11.255 sg +52.93.12.0 - 52.94.4.255 us +52.94.5.0 - 52.94.5.255 ie +52.94.6.0 - 52.94.6.255 kr +52.94.7.0 - 52.94.7.255 br +52.94.8.0 - 52.94.8.255 jp +52.94.9.0 - 52.94.10.255 us +52.94.11.0 - 52.94.11.255 sg +52.94.12.0 - 52.94.12.255 us +52.94.13.0 - 52.94.13.255 au +52.94.14.0 - 52.95.29.255 us +52.95.30.0 - 52.95.31.255 jp +52.95.32.0 - 52.95.33.255 us +52.95.34.0 - 52.95.34.255 jp +52.95.35.0 - 52.95.35.255 sg +52.95.36.0 - 52.95.39.255 au +52.95.40.0 - 52.95.55.255 us +52.95.56.0 - 52.95.59.255 jp +52.95.60.0 - 52.95.61.255 ie +52.95.62.0 - 52.95.191.255 us +52.95.192.0 - 52.95.207.255 kr +52.95.208.0 - 52.95.211.255 us +52.95.212.0 - 52.95.215.255 sg +52.95.216.0 - 52.95.239.255 us +52.95.240.0 - 52.95.240.255 br +52.95.241.0 - 52.95.241.255 au +52.95.242.0 - 52.95.242.255 sg +52.95.243.0 - 52.95.243.255 jp +52.95.244.0 - 52.95.244.255 ie +52.95.245.0 - 52.95.247.255 us +52.95.248.0 - 52.95.248.255 de +52.95.249.0 - 52.95.249.255 cn +52.95.250.0 - 52.95.251.255 us +52.95.252.0 - 52.95.252.255 kr +52.95.253.0 - 52.95.254.255 us +52.95.255.0 - 52.95.255.15 br +52.95.255.16 - 52.95.255.31 au +52.95.255.32 - 52.95.255.47 sg +52.95.255.48 - 52.95.255.63 jp +52.95.255.64 - 52.95.255.79 ie +52.95.255.80 - 52.95.255.127 us +52.95.255.128 - 52.95.255.143 de +52.95.255.144 - 52.95.255.159 cn +52.95.255.160 - 52.129.31.255 us +52.129.32.0 - 52.129.33.255 eu +52.129.34.0 - 52.159.30.201 us +52.159.30.202 - 52.159.30.203 eu +52.159.30.204 - 52.159.32.103 us +52.159.32.104 - 52.159.32.105 eu +52.159.32.106 - 52.159.64.102 us +52.159.64.103 - 52.159.64.103 eu +52.159.64.104 - 52.162.255.255 us +52.163.0.0 - 52.163.95.255 sg +52.163.96.0 - 52.163.127.255 us +52.163.128.0 - 52.163.191.255 sg +52.163.192.0 - 52.163.255.255 us +52.164.0.0 - 52.164.255.255 ie +52.165.0.0 - 52.165.255.255 us +52.166.0.0 - 52.166.255.255 nl +52.167.0.0 - 52.168.255.255 us +52.169.0.0 - 52.169.255.255 ie +52.170.0.0 - 52.171.255.255 us +52.172.0.0 - 52.172.63.255 in +52.172.64.0 - 52.173.255.255 us +52.174.0.0 - 52.174.255.255 nl +52.175.0.0 - 52.175.127.255 hk +52.175.128.0 - 52.175.159.255 jp +52.175.160.0 - 52.177.255.255 us +52.178.0.0 - 52.178.63.255 nl +52.178.64.0 - 52.178.127.255 us +52.178.128.0 - 52.178.191.255 ie +52.178.192.0 - 52.191.255.255 us +52.192.0.0 - 52.193.255.255 jp +52.194.0.0 - 52.195.255.255 us +52.196.0.0 - 52.199.255.255 jp +52.200.0.0 - 52.207.255.255 us +52.208.0.0 - 52.215.255.255 ie +52.216.0.0 - 52.219.255.255 us +52.220.0.0 - 52.221.255.255 sg +52.222.0.0 - 52.255.255.255 us +53.0.0.0 - 53.122.196.38 de +53.122.196.39 - 53.122.196.39 eu +53.122.196.40 - 53.255.255.255 de +54.0.0.0 - 54.63.255.255 us +54.64.0.0 - 54.64.129.245 jp +54.64.129.246 - 54.64.129.246 us +54.64.129.247 - 54.65.255.255 jp +54.66.0.0 - 54.66.255.255 au +54.67.0.0 - 54.71.255.255 us +54.72.0.0 - 54.78.255.255 ie +54.79.0.0 - 54.79.255.255 au +54.80.0.0 - 54.91.255.255 us +54.92.0.0 - 54.92.127.255 jp +54.92.128.0 - 54.92.255.255 us +54.93.0.0 - 54.93.255.255 de +54.94.0.0 - 54.94.255.255 br +54.95.0.0 - 54.95.255.255 jp +54.96.0.0 - 54.149.255.255 us +54.150.0.0 - 54.150.255.255 jp +54.151.0.0 - 54.151.127.255 us +54.151.128.0 - 54.151.255.255 sg +54.152.0.0 - 54.153.127.255 us +54.153.128.0 - 54.153.255.255 au +54.154.0.0 - 54.155.247.33 ie +54.155.247.34 - 54.155.247.34 gb +54.155.247.35 - 54.155.255.255 ie +54.156.0.0 - 54.167.255.255 us +54.168.0.0 - 54.168.255.255 jp +54.169.0.0 - 54.169.255.255 sg +54.170.0.0 - 54.171.255.255 ie +54.172.0.0 - 54.177.255.255 us +54.178.0.0 - 54.178.255.255 jp +54.179.0.0 - 54.179.255.255 sg +54.180.0.0 - 54.193.255.255 us +54.194.0.0 - 54.195.255.255 ie +54.196.0.0 - 54.198.255.255 us +54.199.0.0 - 54.199.255.255 jp +54.200.0.0 - 54.205.255.255 us +54.206.0.0 - 54.206.255.255 au +54.207.0.0 - 54.207.255.255 br +54.208.0.0 - 54.215.255.255 us +54.216.0.0 - 54.217.255.255 ie +54.218.0.0 - 54.219.255.255 us +54.220.0.0 - 54.220.255.255 ie +54.221.0.0 - 54.221.255.255 us +54.222.0.0 - 54.223.255.255 cn +54.224.0.0 - 54.227.255.255 us +54.228.0.0 - 54.229.255.255 ie +54.230.0.0 - 54.231.127.255 us +54.231.128.0 - 54.231.159.255 ie +54.231.160.0 - 54.231.191.255 us +54.231.192.0 - 54.231.207.255 de +54.231.208.0 - 54.231.223.255 cn +54.231.224.0 - 54.231.231.255 jp +54.231.232.0 - 54.231.239.255 us +54.231.240.0 - 54.231.243.255 sg +54.231.244.0 - 54.231.247.255 us +54.231.248.0 - 54.231.252.255 au +54.231.253.0 - 54.231.253.255 br +54.231.254.0 - 54.231.255.255 us +54.232.0.0 - 54.233.255.255 br +54.234.0.0 - 54.237.255.255 us +54.238.0.0 - 54.238.255.255 jp +54.239.0.0 - 54.239.3.255 us +54.239.4.0 - 54.239.7.255 de +54.239.8.0 - 54.239.31.255 us +54.239.32.0 - 54.239.39.255 ie +54.239.40.0 - 54.239.51.255 us +54.239.52.0 - 54.239.53.255 jp +54.239.54.0 - 54.239.63.255 de +54.239.64.0 - 54.239.95.255 us +54.239.96.0 - 54.239.96.255 jp +54.239.97.0 - 54.239.98.255 us +54.239.99.0 - 54.239.101.255 ie +54.239.102.0 - 54.239.113.255 us +54.239.114.0 - 54.239.114.255 ie +54.239.115.0 - 54.239.115.255 us +54.239.116.0 - 54.239.127.255 kr +54.239.128.0 - 54.240.191.255 us +54.240.192.0 - 54.240.195.255 au +54.240.196.0 - 54.240.196.255 us +54.240.197.0 - 54.240.197.255 ie +54.240.198.0 - 54.240.198.255 us +54.240.199.0 - 54.240.199.255 sg +54.240.200.0 - 54.240.200.255 jp +54.240.201.0 - 54.240.202.255 us +54.240.203.0 - 54.240.207.255 au +54.240.208.0 - 54.240.219.255 us +54.240.220.0 - 54.240.223.255 ie +54.240.224.0 - 54.240.224.255 us +54.240.225.0 - 54.240.225.255 jp +54.240.226.0 - 54.240.227.255 sg +54.240.228.0 - 54.240.235.255 us +54.240.236.0 - 54.240.239.255 kr +54.240.240.0 - 54.240.240.255 de +54.240.241.0 - 54.240.243.255 us +54.240.244.0 - 54.240.247.255 br +54.240.248.0 - 54.245.255.255 us +54.246.0.0 - 54.247.125.255 ie +54.247.126.0 - 54.247.126.255 eu +54.247.127.0 - 54.247.190.79 ie +54.247.190.80 - 54.247.190.80 de +54.247.190.81 - 54.247.255.255 ie +54.248.0.0 - 54.250.255.255 jp +54.251.0.0 - 54.251.32.241 sg +54.251.32.242 - 54.251.32.242 us +54.251.32.243 - 54.251.33.55 sg +54.251.33.56 - 54.251.33.56 us +54.251.33.57 - 54.251.255.255 sg +54.252.0.0 - 54.253.255.255 au +54.254.0.0 - 54.255.255.255 sg +55.0.0.0 - 56.255.255.255 us +57.0.0.0 - 57.47.255.255 be +57.48.0.0 - 57.48.255.255 us +57.49.0.0 - 57.65.255.255 be +57.66.0.0 - 57.66.55.255 gb +57.66.56.0 - 57.66.56.255 eu +57.66.57.0 - 57.66.65.2 gb +57.66.65.3 - 57.66.65.3 eu +57.66.65.4 - 57.66.68.255 gb +57.66.69.0 - 57.66.70.255 eu +57.66.71.0 - 57.66.76.255 gb +57.66.77.0 - 57.66.78.255 eu +57.66.79.0 - 57.66.107.255 gb +57.66.108.0 - 57.66.108.38 eu +57.66.108.39 - 57.66.108.39 gb +57.66.108.40 - 57.66.108.255 eu +57.66.109.0 - 57.66.127.255 gb +57.66.128.0 - 57.66.137.255 de +57.66.138.0 - 57.66.138.255 eu +57.66.139.0 - 57.66.140.255 de +57.66.141.0 - 57.66.141.255 eu +57.66.142.0 - 57.66.174.255 de +57.66.175.0 - 57.66.175.255 eu +57.66.176.0 - 57.66.194.255 de +57.66.195.0 - 57.66.195.255 pl +57.66.196.0 - 57.66.255.255 de +57.67.0.0 - 57.67.30.36 fr +57.67.30.37 - 57.67.30.37 it +57.67.30.38 - 57.67.127.255 fr +57.67.128.0 - 57.67.134.255 nl +57.67.135.0 - 57.67.135.255 za +57.67.136.0 - 57.67.136.255 us +57.67.137.0 - 57.67.140.255 nl +57.67.141.0 - 57.67.141.255 eu +57.67.142.0 - 57.67.144.255 nl +57.67.145.0 - 57.67.145.255 za +57.67.146.0 - 57.67.146.255 eu +57.67.147.0 - 57.67.159.255 nl +57.67.160.0 - 57.67.160.255 be +57.67.161.0 - 57.67.161.255 eu +57.67.162.0 - 57.67.162.255 be +57.67.163.0 - 57.67.164.255 eu +57.67.165.0 - 57.67.176.255 be +57.67.177.0 - 57.67.177.255 eu +57.67.178.0 - 57.67.191.255 be +57.67.192.0 - 57.67.223.255 nl +57.67.224.0 - 57.67.255.255 lu +57.68.0.0 - 57.69.255.255 us +57.70.0.0 - 57.70.127.255 au +57.70.128.0 - 57.70.159.255 nz +57.70.160.0 - 57.70.175.255 ki +57.70.176.0 - 57.70.191.255 mh +57.70.192.0 - 57.70.207.255 fm +57.70.208.0 - 57.70.223.255 nr +57.70.224.0 - 57.70.239.255 fj +57.70.240.0 - 57.70.255.255 pw +57.71.0.0 - 57.71.15.255 pg +57.71.16.0 - 57.71.31.255 ws +57.71.32.0 - 57.71.47.255 sb +57.71.48.0 - 57.71.63.255 to +57.71.64.0 - 57.71.79.255 tv +57.71.80.0 - 57.71.95.255 vu +57.71.96.0 - 57.71.111.255 nc +57.71.112.0 - 57.71.255.255 be +57.72.0.0 - 57.72.5.255 hk +57.72.6.0 - 57.72.6.255 a2 +57.72.7.0 - 57.72.7.255 hk +57.72.8.0 - 57.72.8.127 ap +57.72.8.128 - 57.72.8.143 sg +57.72.8.144 - 57.72.8.255 ap +57.72.9.0 - 57.72.10.255 hk +57.72.11.0 - 57.72.11.255 ap +57.72.12.0 - 57.72.21.255 hk +57.72.22.0 - 57.72.22.255 ap +57.72.23.0 - 57.72.65.255 hk +57.72.66.0 - 57.72.66.255 ap +57.72.67.0 - 57.72.127.255 hk +57.72.128.0 - 57.72.255.255 jp +57.73.0.0 - 57.73.6.255 sg +57.73.7.0 - 57.73.7.255 ap +57.73.8.0 - 57.73.13.255 sg +57.73.14.0 - 57.73.15.255 ap +57.73.16.0 - 57.73.17.255 sg +57.73.18.0 - 57.73.18.255 ap +57.73.19.0 - 57.73.24.255 sg +57.73.25.0 - 57.73.25.255 ap +57.73.26.0 - 57.73.26.255 in +57.73.27.0 - 57.73.27.255 ap +57.73.28.0 - 57.73.32.255 sg +57.73.33.0 - 57.73.33.255 ap +57.73.34.0 - 57.73.127.255 sg +57.73.128.0 - 57.73.132.255 my +57.73.133.0 - 57.73.133.20 ap +57.73.133.21 - 57.73.133.21 my +57.73.133.22 - 57.73.133.255 ap +57.73.134.0 - 57.73.159.255 my +57.73.160.0 - 57.73.191.255 tw +57.73.192.0 - 57.73.223.255 kr +57.73.224.0 - 57.73.255.255 kp +57.74.0.0 - 57.74.127.255 br +57.74.128.0 - 57.74.159.255 ar +57.74.160.0 - 57.74.191.255 cl +57.74.192.0 - 57.74.223.255 co +57.74.224.0 - 57.74.255.255 ve +57.75.0.0 - 57.75.31.255 pe +57.75.32.0 - 57.75.47.255 ec +57.75.48.0 - 57.75.63.255 bo +57.75.64.0 - 57.75.79.255 py +57.75.80.0 - 57.75.95.255 be +57.75.96.0 - 57.75.111.255 gf +57.75.112.0 - 57.75.119.255 gy +57.75.120.0 - 57.75.127.255 sr +57.75.128.0 - 57.75.143.255 gt +57.75.144.0 - 57.75.159.255 bz +57.75.160.0 - 57.75.175.255 hn +57.75.176.0 - 57.75.191.255 ni +57.75.192.0 - 57.75.207.255 sv +57.75.208.0 - 57.75.223.255 pa +57.75.224.0 - 57.75.239.255 cr +57.75.240.0 - 57.75.255.255 be +57.76.0.0 - 57.76.127.255 mx +57.76.128.0 - 57.77.127.255 us +57.77.128.0 - 57.77.255.255 ca +57.78.0.0 - 57.78.127.255 it +57.78.128.0 - 57.78.255.255 es +57.79.0.0 - 57.79.127.255 ch +57.79.128.0 - 57.79.159.255 pt +57.79.160.0 - 57.79.175.255 se +57.79.176.0 - 57.79.191.255 li +57.79.192.0 - 57.79.207.255 ie +57.79.208.0 - 57.79.215.255 sm +57.79.216.0 - 57.79.223.255 va +57.79.224.0 - 57.79.239.255 be +57.79.240.0 - 57.79.247.255 ad +57.79.248.0 - 57.79.255.255 mc +57.80.0.0 - 57.81.255.255 us +57.82.0.0 - 57.82.31.255 za +57.82.32.0 - 57.82.47.255 dz +57.82.48.0 - 57.82.63.255 ao +57.82.64.0 - 57.82.79.255 bj +57.82.80.0 - 57.82.95.255 bw +57.82.96.0 - 57.82.111.255 bf +57.82.112.0 - 57.82.127.255 bi +57.82.128.0 - 57.82.143.255 cm +57.82.144.0 - 57.82.159.255 cv +57.82.160.0 - 57.82.175.255 cf +57.82.176.0 - 57.82.191.255 td +57.82.192.0 - 57.82.255.255 za +57.83.0.0 - 57.83.159.255 be +57.83.160.0 - 57.83.175.255 ls +57.83.176.0 - 57.83.255.255 be +57.84.0.0 - 57.84.15.255 mr +57.84.16.0 - 57.84.47.255 be +57.84.48.0 - 57.84.63.255 mz +57.84.64.0 - 57.84.79.255 na +57.84.80.0 - 57.84.95.255 ne +57.84.96.0 - 57.84.111.255 ng +57.84.112.0 - 57.84.239.255 be +57.84.240.0 - 57.84.255.255 tz +57.85.0.0 - 57.85.79.255 be +57.85.80.0 - 57.85.95.255 zw +57.85.96.0 - 57.85.111.255 ng +57.85.112.0 - 57.85.255.255 be +57.86.0.0 - 57.86.31.255 is +57.86.32.0 - 57.86.50.255 fi +57.86.51.0 - 57.86.51.255 eu +57.86.52.0 - 57.86.63.255 fi +57.86.64.0 - 57.86.95.255 dk +57.86.96.0 - 57.86.127.255 no +57.86.128.0 - 57.86.132.255 se +57.86.133.0 - 57.86.133.255 eu +57.86.134.0 - 57.86.255.255 se +57.87.0.0 - 57.87.127.255 ru +57.87.128.0 - 57.87.143.255 ee +57.87.144.0 - 57.87.159.255 lv +57.87.160.0 - 57.87.175.255 lt +57.87.176.0 - 57.88.31.255 be +57.88.32.0 - 57.88.47.255 bh +57.88.48.0 - 57.88.63.255 be +57.88.64.0 - 57.88.79.255 ge +57.88.80.0 - 57.88.111.255 be +57.88.112.0 - 57.88.127.255 il +57.88.128.0 - 57.88.191.255 be +57.88.192.0 - 57.88.207.255 qa +57.88.208.0 - 57.88.255.255 be +57.89.0.0 - 57.89.15.255 ae +57.89.16.0 - 57.90.15.255 be +57.90.16.0 - 57.90.32.255 at +57.90.33.0 - 57.90.33.195 eu +57.90.33.196 - 57.90.33.196 at +57.90.33.197 - 57.90.33.255 eu +57.90.34.0 - 57.90.47.255 at +57.90.48.0 - 57.90.63.255 bg +57.90.64.0 - 57.90.71.255 hr +57.90.72.0 - 57.90.79.255 ba +57.90.80.0 - 57.90.95.255 cz +57.90.96.0 - 57.90.111.255 gr +57.90.112.0 - 57.90.127.255 hu +57.90.128.0 - 57.90.175.255 be +57.90.176.0 - 57.90.191.255 ro +57.90.192.0 - 57.90.207.255 be +57.90.208.0 - 57.90.223.255 sk +57.90.224.0 - 57.90.239.255 si +57.90.240.0 - 57.90.255.255 tr +57.91.0.0 - 57.91.63.255 be +57.91.64.0 - 57.91.79.255 do +57.91.80.0 - 57.92.111.255 be +57.92.112.0 - 57.92.127.255 in +57.92.128.0 - 57.92.143.255 id +57.92.144.0 - 57.92.239.255 be +57.92.240.0 - 57.92.255.255 pk +57.93.0.0 - 57.93.15.255 ph +57.93.16.0 - 57.93.47.255 be +57.93.48.0 - 57.93.63.255 th +57.93.64.0 - 57.93.79.255 uz +57.93.80.0 - 57.93.255.255 be +57.94.0.0 - 57.94.31.255 ie +57.94.32.0 - 57.94.255.255 tr +57.95.0.0 - 57.95.255.255 be +57.96.0.0 - 57.96.7.255 in +57.96.8.0 - 57.96.15.255 be +57.96.16.0 - 57.96.23.255 sg +57.96.24.0 - 57.96.31.255 be +57.96.32.0 - 57.96.63.255 hk +57.96.64.0 - 57.96.79.255 jp +57.96.80.0 - 57.96.95.255 be +57.96.96.0 - 57.96.111.255 au +57.96.112.0 - 57.97.63.255 be +57.97.64.0 - 57.97.71.255 br +57.97.72.0 - 57.97.87.255 be +57.97.88.0 - 57.97.119.255 us +57.97.120.0 - 57.97.255.255 be +57.98.0.0 - 57.98.31.255 gb +57.98.32.0 - 57.98.63.255 de +57.98.64.0 - 57.98.79.255 se +57.98.80.0 - 57.98.95.255 be +57.98.96.0 - 57.98.111.255 bh +57.98.112.0 - 57.98.127.255 za +57.98.128.0 - 57.190.255.255 be +57.191.0.0 - 57.191.3.255 de +57.191.4.0 - 57.191.127.255 be +57.191.128.0 - 57.191.131.255 us +57.191.132.0 - 57.250.244.255 be +57.250.245.0 - 57.250.245.255 eu +57.250.246.0 - 57.255.255.255 be 58.0.0.0 - 58.1.255.255 jp 58.2.0.0 - 58.2.255.255 in 58.3.0.0 - 58.5.255.255 jp @@ -6782,7 +12111,7 @@ 58.65.64.0 - 58.65.127.255 kr 58.65.128.0 - 58.65.223.255 pk 58.65.224.0 - 58.65.231.255 bd -58.65.232.0 - 58.65.239.255 hk +58.65.232.0 - 58.65.239.255 cn 58.65.240.0 - 58.65.247.255 id 58.65.248.0 - 58.65.255.255 au 58.66.0.0 - 58.67.255.255 cn @@ -6794,7 +12123,26 @@ 58.71.128.0 - 58.71.255.255 my 58.72.0.0 - 58.79.255.255 kr 58.80.0.0 - 58.81.255.255 jp -58.82.0.0 - 58.83.255.255 cn +58.82.0.0 - 58.82.127.255 cn +58.82.128.0 - 58.82.191.255 th +58.82.192.0 - 58.82.255.255 hk +58.83.0.0 - 58.83.255.255 cn +58.84.0.0 - 58.84.3.255 vn +58.84.4.0 - 58.84.7.255 hk +58.84.8.0 - 58.84.15.255 in +58.84.16.0 - 58.84.19.255 my +58.84.20.0 - 58.84.27.255 in +58.84.28.0 - 58.84.31.255 pk +58.84.32.0 - 58.84.35.255 bd +58.84.36.0 - 58.84.36.255 us +58.84.37.0 - 58.84.37.255 nz +58.84.38.0 - 58.84.38.255 au +58.84.39.0 - 58.84.39.255 ae +58.84.40.0 - 58.84.43.255 my +58.84.44.0 - 58.84.47.255 kr +58.84.48.0 - 58.84.51.255 nz +58.84.52.0 - 58.84.55.255 hk +58.84.56.0 - 58.84.63.255 in 58.84.64.0 - 58.84.223.255 au 58.84.224.0 - 58.84.239.255 nz 58.84.240.0 - 58.85.255.255 jp @@ -6831,8 +12179,13 @@ 58.145.168.0 - 58.145.175.255 id 58.145.176.0 - 58.145.183.255 jp 58.145.184.0 - 58.145.191.255 bd -58.145.192.0 - 58.145.255.255 sg -58.146.0.0 - 58.146.95.255 jp +58.145.192.0 - 58.145.225.255 jp +58.145.226.0 - 58.145.227.255 sg +58.145.228.0 - 58.145.228.255 jp +58.145.229.0 - 58.145.233.255 sg +58.145.234.0 - 58.145.235.255 jp +58.145.236.0 - 58.145.239.255 sg +58.145.240.0 - 58.146.95.255 jp 58.146.96.0 - 58.146.127.255 in 58.146.128.0 - 58.146.191.255 sg 58.146.192.0 - 58.146.255.255 kr @@ -6857,7 +12210,11 @@ 58.182.0.0 - 58.182.255.255 sg 58.183.0.0 - 58.183.255.255 jp 58.184.0.0 - 58.184.255.255 kr -58.185.0.0 - 58.185.255.255 sg +58.185.0.0 - 58.185.86.255 sg +58.185.87.0 - 58.185.87.255 ap +58.185.88.0 - 58.185.160.255 sg +58.185.161.0 - 58.185.161.255 ap +58.185.162.0 - 58.185.255.255 sg 58.186.0.0 - 58.187.255.255 vn 58.188.0.0 - 58.191.255.255 jp 58.192.0.0 - 58.223.255.255 cn @@ -6876,7 +12233,9 @@ 59.104.0.0 - 59.105.255.255 tw 59.106.0.0 - 59.106.255.255 jp 59.107.0.0 - 59.111.255.255 cn -59.112.0.0 - 59.127.255.255 tw +59.112.0.0 - 59.120.177.255 tw +59.120.178.0 - 59.120.178.255 jp +59.120.179.0 - 59.127.255.255 tw 59.128.0.0 - 59.143.255.255 jp 59.144.0.0 - 59.145.255.255 in 59.146.0.0 - 59.147.255.255 jp @@ -6885,9 +12244,67 @@ 59.151.0.0 - 59.151.127.255 cn 59.151.128.0 - 59.151.191.255 ap 59.151.192.0 - 59.151.255.255 kr -59.152.0.0 - 59.152.127.255 bd +59.152.0.0 - 59.152.15.255 bd +59.152.16.0 - 59.152.39.255 cn +59.152.40.0 - 59.152.43.255 in +59.152.44.0 - 59.152.44.255 hk +59.152.45.0 - 59.152.45.255 ph +59.152.46.0 - 59.152.47.255 my +59.152.48.0 - 59.152.51.255 hk +59.152.52.0 - 59.152.59.255 in +59.152.60.0 - 59.152.63.255 bd +59.152.64.0 - 59.152.79.255 cn +59.152.80.0 - 59.152.83.255 in +59.152.88.0 - 59.152.111.255 bd +59.152.112.0 - 59.152.119.255 cn +59.152.120.0 - 59.152.123.255 in +59.152.124.0 - 59.152.127.255 us 59.152.128.0 - 59.152.191.255 kr -59.152.192.0 - 59.152.255.255 hk +59.152.192.0 - 59.152.220.255 hk +59.152.221.0 - 59.152.221.149 au +59.152.221.150 - 59.152.221.151 ap +59.152.221.152 - 59.152.221.255 au +59.152.222.0 - 59.152.255.255 hk +59.153.0.0 - 59.153.3.255 in +59.153.4.0 - 59.153.7.255 cn +59.153.8.0 - 59.153.11.255 au +59.153.12.0 - 59.153.15.255 in +59.153.16.0 - 59.153.19.255 bd +59.153.20.0 - 59.153.23.255 nz +59.153.24.0 - 59.153.25.255 id +59.153.26.0 - 59.153.27.255 my +59.153.28.0 - 59.153.31.255 bd +59.153.32.0 - 59.153.35.255 cn +59.153.36.0 - 59.153.39.255 in +59.153.40.0 - 59.153.47.255 jp +59.153.48.0 - 59.153.59.255 hk +59.153.60.0 - 59.153.75.255 cn +59.153.76.0 - 59.153.79.255 sg +59.153.80.0 - 59.153.83.255 id +59.153.84.0 - 59.153.87.255 mn +59.153.88.0 - 59.153.91.255 mm +59.153.92.0 - 59.153.95.255 cn +59.153.96.0 - 59.153.99.255 in +59.153.100.0 - 59.153.103.255 bd +59.153.104.0 - 59.153.107.255 sg +59.153.108.0 - 59.153.111.255 mm +59.153.112.0 - 59.153.115.255 mn +59.153.116.0 - 59.153.119.255 cn +59.153.120.0 - 59.153.123.255 in +59.153.124.0 - 59.153.127.255 af +59.153.128.0 - 59.153.131.255 id +59.153.132.0 - 59.153.135.255 tl +59.153.136.0 - 59.153.139.255 cn +59.153.140.0 - 59.153.143.255 jp +59.153.144.0 - 59.153.151.255 hk +59.153.152.0 - 59.153.159.255 cn +59.153.160.0 - 59.153.163.255 hk +59.153.164.0 - 59.153.195.255 cn +59.153.196.0 - 59.153.199.255 hk +59.153.200.0 - 59.153.203.255 bd +59.153.204.0 - 59.153.207.255 jp +59.153.208.0 - 59.153.211.255 th +59.153.212.0 - 59.153.255.255 vn 59.154.0.0 - 59.154.255.255 au 59.155.0.0 - 59.155.255.255 cn 59.156.0.0 - 59.159.255.255 jp @@ -6904,7 +12321,9 @@ 59.191.0.0 - 59.191.127.255 cn 59.191.128.0 - 59.191.191.255 jp 59.191.192.0 - 59.191.239.255 au -59.191.240.0 - 60.31.255.255 cn +59.191.240.0 - 59.191.254.255 cn +59.191.255.0 - 59.191.255.255 hk +59.192.0.0 - 60.31.255.255 cn 60.32.0.0 - 60.47.255.255 jp 60.48.0.0 - 60.54.255.255 my 60.55.0.0 - 60.55.255.255 cn @@ -6919,15 +12338,7 @@ 60.200.0.0 - 60.223.255.255 cn 60.224.0.0 - 60.231.255.255 au 60.232.0.0 - 60.233.255.255 cn -60.234.0.0 - 60.234.49.79 nz -60.234.49.80 - 60.234.49.95 au -60.234.49.96 - 60.234.66.23 nz -60.234.66.24 - 60.234.66.31 au -60.234.66.32 - 60.234.70.191 nz -60.234.70.192 - 60.234.70.255 pa -60.234.71.0 - 60.234.122.127 nz -60.234.122.128 - 60.234.122.159 au -60.234.122.160 - 60.234.255.255 nz +60.234.0.0 - 60.234.255.255 nz 60.235.0.0 - 60.235.255.255 cn 60.236.0.0 - 60.239.255.255 jp 60.240.0.0 - 60.242.255.255 au @@ -6942,7 +12353,11 @@ 60.253.96.0 - 60.253.127.255 id 60.253.128.0 - 60.253.255.255 cn 60.254.0.0 - 60.254.127.255 in -60.254.128.0 - 60.254.191.255 us +60.254.128.0 - 60.254.142.255 us +60.254.143.0 - 60.254.143.255 au +60.254.144.0 - 60.254.149.255 us +60.254.150.0 - 60.254.151.255 in +60.254.152.0 - 60.254.191.255 us 60.254.192.0 - 60.254.255.255 jp 60.255.0.0 - 60.255.255.255 cn 61.0.0.0 - 61.3.255.255 in @@ -6963,80 +12378,66 @@ 61.6.192.0 - 61.6.255.255 bn 61.7.0.0 - 61.7.127.255 jp 61.7.128.0 - 61.7.255.255 th -61.8.0.0 - 61.8.63.255 au +61.8.0.0 - 61.8.32.63 au +61.8.32.64 - 61.8.32.95 my +61.8.32.96 - 61.8.48.127 au +61.8.48.128 - 61.8.48.159 sg +61.8.48.160 - 61.8.63.255 au 61.8.64.0 - 61.8.79.255 id 61.8.80.0 - 61.8.95.255 jp 61.8.96.0 - 61.8.127.255 au 61.8.128.0 - 61.8.159.255 in 61.8.160.0 - 61.8.175.255 cn 61.8.176.0 - 61.8.191.255 au -61.8.192.0 - 61.8.255.255 sg +61.8.192.0 - 61.8.222.255 sg +61.8.223.0 - 61.8.223.255 ap +61.8.224.0 - 61.8.255.255 sg 61.9.0.0 - 61.9.127.255 ph 61.9.128.0 - 61.9.255.255 au 61.10.0.0 - 61.10.255.255 hk 61.11.0.0 - 61.11.127.255 in 61.11.128.0 - 61.11.207.255 jp 61.11.208.0 - 61.11.223.255 my -61.11.224.0 - 61.11.255.255 th +61.11.224.0 - 61.11.255.255 vn 61.12.0.0 - 61.12.127.255 in 61.12.128.0 - 61.12.255.255 jp 61.13.0.0 - 61.13.255.255 sg -61.14.0.0 - 61.14.3.255 us -61.14.4.0 - 61.14.6.63 in -61.14.6.64 - 61.14.6.127 us -61.14.6.128 - 61.14.6.255 in -61.14.7.0 - 61.14.11.255 us -61.14.12.0 - 61.14.12.7 in -61.14.12.8 - 61.14.14.63 us -61.14.14.64 - 61.14.14.255 in -61.14.15.0 - 61.14.15.31 us -61.14.15.32 - 61.14.15.63 in -61.14.15.64 - 61.14.17.255 us -61.14.18.0 - 61.14.18.127 in -61.14.18.128 - 61.14.18.199 us -61.14.18.200 - 61.14.18.207 in -61.14.18.208 - 61.14.20.127 us -61.14.20.128 - 61.14.20.255 in -61.14.21.0 - 61.14.21.191 us -61.14.21.192 - 61.14.21.255 hk -61.14.22.0 - 61.14.22.55 us -61.14.22.56 - 61.14.22.63 in -61.14.22.64 - 61.14.23.223 us -61.14.23.224 - 61.14.23.255 id -61.14.24.0 - 61.14.24.127 us -61.14.24.128 - 61.14.24.255 in -61.14.25.0 - 61.14.27.135 us -61.14.27.136 - 61.14.27.143 sg -61.14.27.144 - 61.14.27.255 us -61.14.28.0 - 61.14.28.63 ph -61.14.28.64 - 61.14.29.7 us -61.14.29.8 - 61.14.29.15 cn -61.14.29.16 - 61.14.29.39 us -61.14.29.40 - 61.14.29.47 id -61.14.29.48 - 61.14.29.63 jp -61.14.29.64 - 61.14.29.79 us -61.14.29.80 - 61.14.29.95 cn -61.14.29.96 - 61.14.31.63 us -61.14.31.64 - 61.14.31.127 in -61.14.31.128 - 61.14.31.135 us -61.14.31.136 - 61.14.31.143 au -61.14.31.144 - 61.14.31.191 us -61.14.31.192 - 61.14.31.255 in -61.14.32.0 - 61.14.41.135 us -61.14.41.136 - 61.14.41.143 ph -61.14.41.144 - 61.14.42.199 us -61.14.42.200 - 61.14.42.207 my -61.14.42.208 - 61.14.46.127 us -61.14.46.128 - 61.14.46.255 hk -61.14.47.0 - 61.14.47.255 id -61.14.48.0 - 61.14.50.31 us -61.14.50.32 - 61.14.50.39 th -61.14.50.40 - 61.14.63.255 us +61.14.0.0 - 61.14.0.255 us +61.14.1.0 - 61.14.1.7 au +61.14.1.8 - 61.14.47.255 us +61.14.48.0 - 61.14.51.255 za +61.14.52.0 - 61.14.63.255 us 61.14.64.0 - 61.14.95.255 sg 61.14.96.0 - 61.14.127.255 au -61.14.128.0 - 61.14.191.255 jp -61.14.192.0 - 61.14.255.255 ph -61.15.0.0 - 61.15.255.255 hk +61.14.128.0 - 61.14.130.207 jp +61.14.130.208 - 61.14.130.223 hk +61.14.130.224 - 61.14.139.255 jp +61.14.140.0 - 61.14.140.255 au +61.14.141.0 - 61.14.142.31 jp +61.14.142.32 - 61.14.142.47 au +61.14.142.48 - 61.14.145.255 jp +61.14.146.0 - 61.14.146.255 ap +61.14.147.0 - 61.14.147.255 jp +61.14.148.0 - 61.14.148.255 sg +61.14.149.0 - 61.14.169.255 jp +61.14.170.0 - 61.14.170.255 ph +61.14.171.0 - 61.14.175.63 jp +61.14.175.64 - 61.14.175.159 hk +61.14.175.160 - 61.14.178.15 jp +61.14.178.16 - 61.14.178.31 hk +61.14.178.32 - 61.14.185.255 jp +61.14.186.0 - 61.14.186.255 au +61.14.187.0 - 61.14.191.255 jp +61.14.192.0 - 61.14.199.255 ph +61.14.200.0 - 61.14.207.255 in +61.14.208.0 - 61.14.211.255 kr +61.14.212.0 - 61.14.223.255 cn +61.14.224.0 - 61.14.227.255 jp +61.14.228.0 - 61.14.231.255 in +61.14.232.0 - 61.14.239.255 vn +61.14.240.0 - 61.14.247.255 cn +61.14.248.0 - 61.14.251.255 id +61.14.252.0 - 61.15.255.255 hk 61.16.0.0 - 61.16.127.255 sg 61.16.128.0 - 61.17.255.255 in 61.18.0.0 - 61.18.255.255 hk @@ -7045,20 +12446,77 @@ 61.21.0.0 - 61.27.255.255 jp 61.28.0.0 - 61.28.127.255 cn 61.28.128.0 - 61.28.191.255 ph -61.28.192.0 - 61.28.223.255 au +61.28.192.0 - 61.28.192.255 jp +61.28.193.0 - 61.28.193.255 sg +61.28.194.0 - 61.28.194.255 th +61.28.195.0 - 61.28.196.255 cn +61.28.197.0 - 61.28.197.255 ph +61.28.198.0 - 61.28.198.255 gb +61.28.199.0 - 61.28.200.255 fr +61.28.201.0 - 61.28.201.255 my +61.28.202.0 - 61.28.203.255 sg +61.28.204.0 - 61.28.205.255 au +61.28.206.0 - 61.28.206.255 nz +61.28.207.0 - 61.28.209.255 au +61.28.210.0 - 61.28.210.255 ae +61.28.211.0 - 61.28.211.255 au +61.28.212.0 - 61.28.212.255 cn +61.28.213.0 - 61.28.214.255 au +61.28.215.0 - 61.28.215.255 sa +61.28.216.0 - 61.28.216.255 ae +61.28.217.0 - 61.28.218.255 us +61.28.219.0 - 61.28.219.255 gb +61.28.220.0 - 61.28.223.255 au 61.28.224.0 - 61.28.255.255 vn 61.29.0.0 - 61.29.127.255 au 61.29.128.0 - 61.29.255.255 cn 61.30.0.0 - 61.31.255.255 tw 61.32.0.0 - 61.43.255.255 kr -61.44.0.0 - 61.45.127.255 jp +61.44.0.0 - 61.44.68.255 jp +61.44.69.0 - 61.44.69.106 us +61.44.69.107 - 61.44.69.107 jp +61.44.69.108 - 61.44.69.255 us +61.44.70.0 - 61.45.127.255 jp 61.45.128.0 - 61.45.191.255 cn 61.45.192.0 - 61.45.223.255 jp -61.45.224.0 - 61.45.239.255 id +61.45.224.0 - 61.45.239.255 cn 61.45.240.0 - 61.45.247.255 jp 61.45.248.0 - 61.45.255.255 au -61.46.0.0 - 61.46.255.255 jp -61.47.0.0 - 61.47.127.255 th +61.46.0.0 - 61.47.0.255 jp +61.47.1.0 - 61.47.2.255 sg +61.47.3.0 - 61.47.5.255 jp +61.47.6.0 - 61.47.14.255 sg +61.47.15.0 - 61.47.15.255 jp +61.47.16.0 - 61.47.16.255 sg +61.47.17.0 - 61.47.17.255 jp +61.47.18.0 - 61.47.20.255 sg +61.47.21.0 - 61.47.22.255 jp +61.47.23.0 - 61.47.23.255 sg +61.47.24.0 - 61.47.24.255 jp +61.47.25.0 - 61.47.25.255 sg +61.47.26.0 - 61.47.26.255 th +61.47.27.0 - 61.47.27.255 jp +61.47.28.0 - 61.47.28.255 sg +61.47.29.0 - 61.47.29.255 jp +61.47.30.0 - 61.47.43.255 sg +61.47.44.0 - 61.47.46.255 jp +61.47.47.0 - 61.47.48.255 sg +61.47.49.0 - 61.47.51.255 jp +61.47.52.0 - 61.47.52.255 sg +61.47.53.0 - 61.47.56.255 jp +61.47.57.0 - 61.47.63.255 sg +61.47.64.0 - 61.47.66.255 jp +61.47.67.0 - 61.47.71.255 sg +61.47.72.0 - 61.47.79.255 jp +61.47.80.0 - 61.47.87.255 sg +61.47.88.0 - 61.47.95.255 jp +61.47.96.0 - 61.47.97.255 sg +61.47.98.0 - 61.47.99.255 jp +61.47.100.0 - 61.47.101.255 sg +61.47.102.0 - 61.47.103.255 jp +61.47.104.0 - 61.47.107.255 sg +61.47.108.0 - 61.47.111.255 jp +61.47.112.0 - 61.47.127.255 sg 61.47.128.0 - 61.47.191.255 cn 61.47.192.0 - 61.47.255.255 kr 61.48.0.0 - 61.55.255.255 cn @@ -7066,8 +12524,10 @@ 61.68.0.0 - 61.69.255.255 au 61.70.0.0 - 61.71.255.255 tw 61.72.0.0 - 61.85.255.255 kr -61.86.0.0 - 61.87.127.255 jp -61.87.128.0 - 61.87.191.255 sg +61.86.0.0 - 61.87.143.255 jp +61.87.144.0 - 61.87.159.255 hk +61.87.160.0 - 61.87.175.255 sg +61.87.176.0 - 61.87.191.255 au 61.87.192.0 - 61.87.255.255 cn 61.88.0.0 - 61.88.255.255 au 61.89.0.0 - 61.89.255.255 jp @@ -7076,17 +12536,23 @@ 61.94.0.0 - 61.94.255.255 id 61.95.0.0 - 61.95.127.255 au 61.95.128.0 - 61.95.255.255 in -61.96.0.0 - 61.111.255.255 kr -61.112.0.0 - 61.127.255.255 jp +61.96.0.0 - 61.110.215.255 kr +61.110.216.0 - 61.110.223.255 jp +61.110.224.0 - 61.111.255.255 kr +61.112.0.0 - 61.114.253.255 jp +61.114.254.0 - 61.114.254.255 ap +61.114.255.0 - 61.127.255.255 jp 61.128.0.0 - 61.191.255.255 cn -61.192.0.0 - 61.215.255.255 jp +61.192.0.0 - 61.213.180.255 jp +61.213.181.0 - 61.213.181.255 ap +61.213.182.0 - 61.215.255.255 jp 61.216.0.0 - 61.231.255.255 tw 61.232.0.0 - 61.237.255.255 cn 61.238.0.0 - 61.239.255.255 hk 61.240.0.0 - 61.243.255.255 cn 61.244.0.0 - 61.244.255.255 hk 61.245.0.0 - 61.245.127.255 jp -61.245.128.0 - 61.245.159.255 ap +61.245.128.0 - 61.245.159.255 au 61.245.160.0 - 61.245.175.255 lk 61.245.176.0 - 61.245.191.255 kr 61.245.192.0 - 61.245.223.255 jp @@ -7104,73 +12570,16 @@ 62.2.0.0 - 62.2.255.255 ch 62.3.0.0 - 62.3.31.255 sa 62.3.32.0 - 62.3.32.255 gb -62.3.33.0 - 62.3.53.255 sa -62.3.54.0 - 62.3.56.255 gb -62.3.57.0 - 62.3.61.255 sa -62.3.62.0 - 62.3.62.255 gb -62.3.63.0 - 62.3.63.255 sa +62.3.33.0 - 62.3.63.255 sa 62.3.64.0 - 62.3.127.255 gb 62.3.128.0 - 62.3.159.255 se 62.3.160.0 - 62.3.191.255 pl 62.3.192.0 - 62.3.255.255 gb -62.4.0.0 - 62.4.0.255 fr -62.4.1.0 - 62.4.1.255 de -62.4.2.0 - 62.4.31.255 fr +62.4.0.0 - 62.4.31.255 fr 62.4.32.0 - 62.4.63.255 me -62.4.64.0 - 62.4.66.255 de -62.4.67.0 - 62.4.68.31 eu -62.4.68.32 - 62.4.68.63 de -62.4.68.64 - 62.4.68.127 eu -62.4.68.128 - 62.4.68.143 fr -62.4.68.144 - 62.4.68.159 de -62.4.68.160 - 62.4.68.191 fr -62.4.68.192 - 62.4.68.207 de -62.4.68.208 - 62.4.71.47 eu -62.4.71.48 - 62.4.71.55 fr -62.4.71.56 - 62.4.71.63 eu -62.4.71.64 - 62.4.71.111 fr -62.4.71.112 - 62.4.71.223 eu -62.4.71.224 - 62.4.71.239 fr -62.4.71.240 - 62.4.71.255 eu -62.4.72.0 - 62.4.72.127 fr -62.4.72.128 - 62.4.73.7 eu -62.4.73.8 - 62.4.73.31 fr -62.4.73.32 - 62.4.73.191 eu -62.4.73.192 - 62.4.73.255 fr -62.4.74.0 - 62.4.74.127 eu -62.4.74.128 - 62.4.74.255 de -62.4.75.0 - 62.4.75.31 nl -62.4.75.32 - 62.4.76.63 eu -62.4.76.64 - 62.4.76.79 fr -62.4.76.80 - 62.4.76.127 eu -62.4.76.128 - 62.4.76.191 fr -62.4.76.192 - 62.4.76.255 eu -62.4.77.0 - 62.4.77.31 fr -62.4.77.32 - 62.4.77.63 eu -62.4.77.64 - 62.4.77.95 fr -62.4.77.96 - 62.4.77.191 eu -62.4.77.192 - 62.4.77.223 fr -62.4.77.224 - 62.4.77.255 eu -62.4.78.0 - 62.4.78.63 fr -62.4.78.64 - 62.4.78.127 eu -62.4.78.128 - 62.4.78.191 fr -62.4.78.192 - 62.4.78.223 eu -62.4.78.224 - 62.4.78.255 fr -62.4.79.0 - 62.4.79.143 eu -62.4.79.144 - 62.4.79.159 fr -62.4.79.160 - 62.4.79.223 eu -62.4.79.224 - 62.4.79.239 fr -62.4.79.240 - 62.4.80.255 eu -62.4.81.0 - 62.4.81.63 de -62.4.81.64 - 62.4.81.127 eu -62.4.81.128 - 62.4.81.159 de -62.4.81.160 - 62.4.85.191 eu -62.4.85.192 - 62.4.85.223 nl -62.4.85.224 - 62.4.89.255 eu -62.4.90.0 - 62.4.90.255 de -62.4.91.0 - 62.4.91.239 eu -62.4.91.240 - 62.4.91.255 de -62.4.92.0 - 62.4.95.255 eu +62.4.64.0 - 62.4.92.255 eu +62.4.93.0 - 62.4.93.255 de +62.4.94.0 - 62.4.95.255 eu 62.4.96.0 - 62.4.127.255 cz 62.4.128.0 - 62.4.255.255 be 62.5.0.0 - 62.5.127.255 gb @@ -7184,1143 +12593,67 @@ 62.9.0.0 - 62.9.255.255 ie 62.10.0.0 - 62.11.255.255 it 62.12.0.0 - 62.12.31.255 nl -62.12.32.0 - 62.12.33.7 a2 -62.12.33.8 - 62.12.33.15 ng -62.12.33.16 - 62.12.34.55 a2 -62.12.34.56 - 62.12.34.63 dk -62.12.34.64 - 62.12.34.71 a2 -62.12.34.72 - 62.12.34.79 dk -62.12.34.80 - 62.12.34.103 a2 -62.12.34.104 - 62.12.34.111 de -62.12.34.112 - 62.12.35.159 a2 -62.12.35.160 - 62.12.35.167 dk -62.12.35.168 - 62.12.40.135 a2 -62.12.40.136 - 62.12.40.139 tz -62.12.40.140 - 62.12.40.151 a2 -62.12.40.152 - 62.12.40.155 tz -62.12.40.156 - 62.12.63.255 a2 -62.12.64.0 - 62.12.79.255 cy -62.12.80.0 - 62.12.80.255 ru -62.12.81.0 - 62.12.95.255 cy -62.12.96.0 - 62.12.127.255 eg +62.12.32.0 - 62.12.33.255 a2 +62.12.34.0 - 62.12.34.255 fi +62.12.35.0 - 62.12.37.255 a2 +62.12.38.0 - 62.12.38.255 eu +62.12.39.0 - 62.12.63.255 a2 +62.12.64.0 - 62.12.95.255 cy +62.12.96.0 - 62.12.117.33 eg +62.12.117.34 - 62.12.117.34 ke +62.12.117.35 - 62.12.127.255 eg 62.12.128.0 - 62.12.255.255 ch -62.13.0.0 - 62.13.47.255 se -62.13.48.0 - 62.13.48.191 no -62.13.48.192 - 62.13.49.255 se -62.13.50.0 - 62.13.50.15 no -62.13.50.16 - 62.13.127.255 se +62.13.0.0 - 62.13.127.255 se 62.13.128.0 - 62.13.159.255 gb 62.13.160.0 - 62.13.191.255 it 62.13.192.0 - 62.13.223.255 at 62.13.224.0 - 62.15.255.255 es 62.16.0.0 - 62.16.31.255 ua -62.16.32.0 - 62.16.66.255 ru -62.16.67.0 - 62.16.67.255 tj -62.16.68.0 - 62.16.127.255 ru +62.16.32.0 - 62.16.127.255 ru 62.16.128.0 - 62.16.255.255 no -62.17.0.0 - 62.17.255.255 ie +62.17.0.0 - 62.17.36.255 ie +62.17.37.0 - 62.17.37.255 gb +62.17.38.0 - 62.17.135.255 ie +62.17.136.0 - 62.17.136.255 eu +62.17.137.0 - 62.17.145.255 ie +62.17.146.0 - 62.17.146.255 gb +62.17.147.0 - 62.17.255.255 ie 62.18.0.0 - 62.19.255.255 it 62.20.0.0 - 62.20.255.255 se 62.21.0.0 - 62.21.127.255 pl 62.21.128.0 - 62.21.255.255 nl -62.22.0.0 - 62.22.15.79 es -62.22.15.80 - 62.22.15.95 gb -62.22.15.96 - 62.22.255.255 es -62.23.0.0 - 62.23.1.175 fr -62.23.1.176 - 62.23.1.191 gb -62.23.1.192 - 62.23.2.127 fr -62.23.2.128 - 62.23.2.159 gb -62.23.2.160 - 62.23.3.159 fr -62.23.3.160 - 62.23.3.191 gb -62.23.3.192 - 62.23.3.207 ch -62.23.3.208 - 62.23.3.223 fr -62.23.3.224 - 62.23.3.231 gb -62.23.3.232 - 62.23.4.23 fr -62.23.4.24 - 62.23.4.31 gb -62.23.4.32 - 62.23.4.111 fr -62.23.4.112 - 62.23.4.143 gb -62.23.4.144 - 62.23.4.159 fr -62.23.4.160 - 62.23.4.255 gb -62.23.5.0 - 62.23.8.103 fr -62.23.8.104 - 62.23.8.111 gb -62.23.8.112 - 62.23.11.163 fr -62.23.11.164 - 62.23.11.167 gb -62.23.11.168 - 62.23.12.255 fr -62.23.13.0 - 62.23.13.29 gb -62.23.13.30 - 62.23.13.159 fr -62.23.13.160 - 62.23.13.175 gb -62.23.13.176 - 62.23.13.199 fr -62.23.13.200 - 62.23.13.207 gb -62.23.13.208 - 62.23.13.215 fr -62.23.13.216 - 62.23.13.223 gb -62.23.13.224 - 62.23.15.151 fr -62.23.15.152 - 62.23.15.159 gb -62.23.15.160 - 62.23.17.215 fr -62.23.17.216 - 62.23.17.223 gb -62.23.17.224 - 62.23.18.255 fr -62.23.19.0 - 62.23.19.7 it -62.23.19.8 - 62.23.19.15 fr -62.23.19.16 - 62.23.19.31 gb -62.23.19.32 - 62.23.19.39 fr -62.23.19.40 - 62.23.19.47 gb -62.23.19.48 - 62.23.19.95 fr -62.23.19.96 - 62.23.19.111 gb -62.23.19.112 - 62.23.19.183 fr -62.23.19.184 - 62.23.19.223 gb -62.23.19.224 - 62.23.22.71 fr -62.23.22.72 - 62.23.22.183 gb -62.23.22.184 - 62.23.22.239 fr -62.23.22.240 - 62.23.22.255 gb -62.23.23.0 - 62.23.24.119 fr -62.23.24.120 - 62.23.24.127 gb -62.23.24.128 - 62.23.25.23 fr -62.23.25.24 - 62.23.25.31 gb -62.23.25.32 - 62.23.25.55 fr -62.23.25.56 - 62.23.25.63 gb -62.23.25.64 - 62.23.25.87 fr -62.23.25.88 - 62.23.25.102 gb -62.23.25.103 - 62.23.25.191 fr -62.23.25.192 - 62.23.26.175 gb -62.23.26.176 - 62.23.26.191 fr -62.23.26.192 - 62.23.26.255 gb -62.23.27.0 - 62.23.27.15 fr -62.23.27.16 - 62.23.27.31 gb -62.23.27.32 - 62.23.27.87 fr -62.23.27.88 - 62.23.27.95 gb -62.23.27.96 - 62.23.27.231 fr -62.23.27.232 - 62.23.27.239 gb -62.23.27.240 - 62.23.29.23 fr -62.23.29.24 - 62.23.29.31 gb -62.23.29.32 - 62.23.29.162 fr -62.23.29.163 - 62.23.29.167 gb -62.23.29.168 - 62.23.29.175 fr -62.23.29.176 - 62.23.29.191 gb -62.23.29.192 - 62.23.29.207 fr -62.23.29.208 - 62.23.29.255 gb -62.23.30.0 - 62.23.31.95 fr -62.23.31.96 - 62.23.31.103 gb -62.23.31.104 - 62.23.34.215 fr -62.23.34.216 - 62.23.34.223 gb -62.23.34.224 - 62.23.36.183 fr -62.23.36.184 - 62.23.36.191 gb -62.23.36.192 - 62.23.36.223 fr -62.23.36.224 - 62.23.36.239 gb -62.23.36.240 - 62.23.37.55 fr -62.23.37.56 - 62.23.37.71 gb -62.23.37.72 - 62.23.37.127 fr -62.23.37.128 - 62.23.37.143 gb -62.23.37.144 - 62.23.37.159 fr -62.23.37.160 - 62.23.37.191 gb -62.23.37.192 - 62.23.37.215 fr -62.23.37.216 - 62.23.37.239 gb -62.23.37.240 - 62.23.37.247 fr -62.23.37.248 - 62.23.37.255 gb -62.23.38.0 - 62.23.38.103 fr -62.23.38.104 - 62.23.38.127 gb -62.23.38.128 - 62.23.39.71 fr -62.23.39.72 - 62.23.39.79 gb -62.23.39.80 - 62.23.39.111 fr -62.23.39.112 - 62.23.39.119 gb -62.23.39.120 - 62.23.39.143 fr -62.23.39.144 - 62.23.39.159 gb -62.23.39.160 - 62.23.39.175 fr -62.23.39.176 - 62.23.39.183 gb -62.23.39.184 - 62.23.39.223 fr -62.23.39.224 - 62.23.39.255 gb -62.23.40.0 - 62.23.41.15 fr -62.23.41.16 - 62.23.41.23 gb -62.23.41.24 - 62.23.41.39 fr -62.23.41.40 - 62.23.41.63 gb -62.23.41.64 - 62.23.41.79 fr -62.23.41.80 - 62.23.41.95 gb -62.23.41.96 - 62.23.41.127 fr -62.23.41.128 - 62.23.41.151 gb -62.23.41.152 - 62.23.41.175 fr -62.23.41.176 - 62.23.41.223 gb -62.23.41.224 - 62.23.41.231 fr -62.23.41.232 - 62.23.41.239 gb -62.23.41.240 - 62.23.41.247 fr -62.23.41.248 - 62.23.42.7 gb -62.23.42.8 - 62.23.42.15 fr -62.23.42.16 - 62.23.42.47 gb -62.23.42.48 - 62.23.42.159 fr -62.23.42.160 - 62.23.42.191 gb -62.23.42.192 - 62.23.42.223 fr -62.23.42.224 - 62.23.42.231 gb -62.23.42.232 - 62.23.43.15 fr -62.23.43.16 - 62.23.43.23 gb -62.23.43.24 - 62.23.43.39 fr -62.23.43.40 - 62.23.43.87 gb -62.23.43.88 - 62.23.43.103 fr -62.23.43.104 - 62.23.43.127 gb -62.23.43.128 - 62.23.43.143 fr -62.23.43.144 - 62.23.43.151 gb -62.23.43.152 - 62.23.43.159 fr -62.23.43.160 - 62.23.43.167 gb -62.23.43.168 - 62.23.43.175 fr -62.23.43.176 - 62.23.43.183 gb -62.23.43.184 - 62.23.43.207 fr -62.23.43.208 - 62.23.43.223 gb -62.23.43.224 - 62.23.44.127 fr -62.23.44.128 - 62.23.44.159 gb -62.23.44.160 - 62.23.44.207 fr -62.23.44.208 - 62.23.44.255 gb -62.23.45.0 - 62.23.45.239 fr -62.23.45.240 - 62.23.45.247 gb -62.23.45.248 - 62.23.47.39 fr -62.23.47.40 - 62.23.47.47 gb -62.23.47.48 - 62.23.47.111 fr -62.23.47.112 - 62.23.47.119 gb -62.23.47.120 - 62.23.47.199 fr -62.23.47.200 - 62.23.47.223 gb -62.23.47.224 - 62.23.47.247 fr -62.23.47.248 - 62.23.47.255 gb -62.23.48.0 - 62.23.49.39 fr -62.23.49.40 - 62.23.49.55 gb -62.23.49.56 - 62.23.49.143 fr -62.23.49.144 - 62.23.49.151 gb -62.23.49.152 - 62.23.49.191 fr -62.23.49.192 - 62.23.49.199 gb -62.23.49.200 - 62.23.49.215 fr -62.23.49.216 - 62.23.49.231 gb -62.23.49.232 - 62.23.49.239 fr -62.23.49.240 - 62.23.49.255 gb -62.23.50.0 - 62.23.50.39 fr -62.23.50.40 - 62.23.50.63 gb -62.23.50.64 - 62.23.50.111 fr -62.23.50.112 - 62.23.50.127 gb -62.23.50.128 - 62.23.50.159 fr -62.23.50.160 - 62.23.50.167 gb -62.23.50.168 - 62.23.51.31 fr -62.23.51.32 - 62.23.51.39 gb -62.23.51.40 - 62.23.51.95 fr -62.23.51.96 - 62.23.51.111 gb -62.23.51.112 - 62.23.51.119 fr -62.23.51.120 - 62.23.51.127 gb -62.23.51.128 - 62.23.51.223 fr -62.23.51.224 - 62.23.51.231 gb -62.23.51.232 - 62.23.51.247 fr -62.23.51.248 - 62.23.51.255 gb -62.23.52.0 - 62.23.53.127 fr -62.23.53.128 - 62.23.53.143 gb -62.23.53.144 - 62.23.53.159 fr -62.23.53.160 - 62.23.53.199 gb -62.23.53.200 - 62.23.53.207 fr -62.23.53.208 - 62.23.53.223 gb -62.23.53.224 - 62.23.54.143 fr -62.23.54.144 - 62.23.54.151 gb -62.23.54.152 - 62.23.54.159 fr -62.23.54.160 - 62.23.54.191 gb -62.23.54.192 - 62.23.55.7 fr -62.23.55.8 - 62.23.55.15 gb -62.23.55.16 - 62.23.55.47 fr -62.23.55.48 - 62.23.55.55 gb -62.23.55.56 - 62.23.55.79 fr -62.23.55.80 - 62.23.55.95 gb -62.23.55.96 - 62.23.55.103 fr -62.23.55.104 - 62.23.55.111 gb -62.23.55.112 - 62.23.55.127 fr -62.23.55.128 - 62.23.55.143 gb -62.23.55.144 - 62.23.55.191 fr -62.23.55.192 - 62.23.55.199 gb -62.23.55.200 - 62.23.55.223 fr -62.23.55.224 - 62.23.55.255 gb -62.23.56.0 - 62.23.57.31 fr -62.23.57.32 - 62.23.57.63 gb -62.23.57.64 - 62.23.57.151 fr -62.23.57.152 - 62.23.57.159 gb -62.23.57.160 - 62.23.57.167 fr -62.23.57.168 - 62.23.57.175 gb -62.23.57.176 - 62.23.58.79 fr -62.23.58.80 - 62.23.58.127 gb -62.23.58.128 - 62.23.58.199 fr -62.23.58.200 - 62.23.58.207 gb -62.23.58.208 - 62.23.58.215 fr -62.23.58.216 - 62.23.58.223 gb -62.23.58.224 - 62.23.59.79 fr -62.23.59.80 - 62.23.59.87 gb -62.23.59.88 - 62.23.59.95 fr -62.23.59.96 - 62.23.59.103 gb -62.23.59.104 - 62.23.59.111 fr -62.23.59.112 - 62.23.59.119 gb -62.23.59.120 - 62.23.59.167 fr -62.23.59.168 - 62.23.59.175 gb -62.23.59.176 - 62.23.59.183 fr -62.23.59.184 - 62.23.59.191 gb -62.23.59.192 - 62.23.59.223 fr -62.23.59.224 - 62.23.59.231 gb -62.23.59.232 - 62.23.61.55 fr -62.23.61.56 - 62.23.61.71 gb -62.23.61.72 - 62.23.61.95 fr -62.23.61.96 - 62.23.61.119 gb -62.23.61.120 - 62.23.61.135 fr -62.23.61.136 - 62.23.61.151 gb -62.23.61.152 - 62.23.61.159 fr -62.23.61.160 - 62.23.61.175 gb -62.23.61.176 - 62.23.61.199 fr -62.23.61.200 - 62.23.61.207 gb -62.23.61.208 - 62.23.61.215 fr -62.23.61.216 - 62.23.61.247 gb -62.23.61.248 - 62.23.62.127 fr -62.23.62.128 - 62.23.62.135 gb -62.23.62.136 - 62.23.62.143 fr -62.23.62.144 - 62.23.62.159 gb -62.23.62.160 - 62.23.62.183 fr -62.23.62.184 - 62.23.62.191 gb -62.23.62.192 - 62.23.65.71 fr -62.23.65.72 - 62.23.65.79 gb -62.23.65.80 - 62.23.65.95 fr -62.23.65.96 - 62.23.65.159 gb -62.23.65.160 - 62.23.65.191 fr -62.23.65.192 - 62.23.65.207 gb -62.23.65.208 - 62.23.65.223 fr -62.23.65.224 - 62.23.65.239 gb -62.23.65.240 - 62.23.67.71 fr -62.23.67.72 - 62.23.67.79 gb -62.23.67.80 - 62.23.69.31 fr -62.23.69.32 - 62.23.69.39 gb -62.23.69.40 - 62.23.71.79 fr -62.23.71.80 - 62.23.71.87 gb -62.23.71.88 - 62.23.71.199 fr -62.23.71.200 - 62.23.71.207 gb -62.23.71.208 - 62.23.71.231 fr -62.23.71.232 - 62.23.71.239 gb -62.23.71.240 - 62.23.75.23 fr -62.23.75.24 - 62.23.75.31 gb -62.23.75.32 - 62.23.75.55 fr -62.23.75.56 - 62.23.75.63 gb -62.23.75.64 - 62.23.75.71 fr -62.23.75.72 - 62.23.75.87 gb -62.23.75.88 - 62.23.75.127 fr -62.23.75.128 - 62.23.75.135 gb -62.23.75.136 - 62.23.75.151 fr -62.23.75.152 - 62.23.75.159 gb -62.23.75.160 - 62.23.75.175 fr -62.23.75.176 - 62.23.75.183 gb -62.23.75.184 - 62.23.75.191 fr -62.23.75.192 - 62.23.75.255 gb -62.23.76.0 - 62.23.77.79 fr -62.23.77.80 - 62.23.77.87 gb -62.23.77.88 - 62.23.77.231 fr -62.23.77.232 - 62.23.77.255 gb -62.23.78.0 - 62.23.78.127 fr -62.23.78.128 - 62.23.78.159 gb -62.23.78.160 - 62.23.78.167 fr -62.23.78.168 - 62.23.78.191 gb -62.23.78.192 - 62.23.78.223 fr -62.23.78.224 - 62.23.78.231 gb -62.23.78.232 - 62.23.79.63 fr -62.23.79.64 - 62.23.79.71 gb -62.23.79.72 - 62.23.79.135 fr -62.23.79.136 - 62.23.79.143 gb -62.23.79.144 - 62.23.79.151 fr -62.23.79.152 - 62.23.79.159 gb -62.23.79.160 - 62.23.79.175 fr -62.23.79.176 - 62.23.79.191 gb -62.23.79.192 - 62.23.79.215 fr -62.23.79.216 - 62.23.79.223 gb -62.23.79.224 - 62.23.81.71 fr -62.23.81.72 - 62.23.81.79 gb -62.23.81.80 - 62.23.81.127 fr -62.23.81.128 - 62.23.81.159 gb -62.23.81.160 - 62.23.81.175 fr -62.23.81.176 - 62.23.81.191 gb -62.23.81.192 - 62.23.82.15 fr -62.23.82.16 - 62.23.82.23 gb -62.23.82.24 - 62.23.82.55 fr -62.23.82.56 - 62.23.82.79 gb -62.23.82.80 - 62.23.82.95 fr -62.23.82.96 - 62.23.82.111 gb -62.23.82.112 - 62.23.82.151 fr -62.23.82.152 - 62.23.82.158 gb -62.23.82.159 - 62.23.82.191 fr -62.23.82.192 - 62.23.82.199 gb -62.23.82.200 - 62.23.82.231 fr -62.23.82.232 - 62.23.82.239 gb -62.23.82.240 - 62.23.83.31 fr -62.23.83.32 - 62.23.83.47 gb -62.23.83.48 - 62.23.83.79 fr -62.23.83.80 - 62.23.83.127 gb -62.23.83.128 - 62.23.83.143 fr -62.23.83.144 - 62.23.83.255 gb -62.23.84.0 - 62.23.84.215 fr -62.23.84.216 - 62.23.84.223 gb -62.23.84.224 - 62.23.85.23 fr -62.23.85.24 - 62.23.85.31 gb -62.23.85.32 - 62.23.85.39 fr -62.23.85.40 - 62.23.85.47 gb -62.23.85.48 - 62.23.85.79 fr -62.23.85.80 - 62.23.85.95 gb -62.23.85.96 - 62.23.85.191 fr -62.23.85.192 - 62.23.85.223 gb -62.23.85.224 - 62.23.87.79 fr -62.23.87.80 - 62.23.87.87 gb -62.23.87.88 - 62.23.87.95 fr -62.23.87.96 - 62.23.87.111 gb -62.23.87.112 - 62.23.87.119 fr -62.23.87.120 - 62.23.87.127 gb -62.23.87.128 - 62.23.87.175 fr -62.23.87.176 - 62.23.87.191 gb -62.23.87.192 - 62.23.87.207 fr -62.23.87.208 - 62.23.87.255 gb -62.23.88.0 - 62.23.88.255 fr -62.23.89.0 - 62.23.89.7 it -62.23.89.8 - 62.23.89.127 fr -62.23.89.128 - 62.23.89.135 gb -62.23.89.136 - 62.23.89.183 fr -62.23.89.184 - 62.23.89.191 gb -62.23.89.192 - 62.23.89.207 fr -62.23.89.208 - 62.23.89.215 gb -62.23.89.216 - 62.23.91.55 fr -62.23.91.56 - 62.23.91.63 gb -62.23.91.64 - 62.23.91.96 fr -62.23.91.97 - 62.23.91.103 gb -62.23.91.104 - 62.23.91.111 fr -62.23.91.112 - 62.23.91.119 gb -62.23.91.120 - 62.23.91.135 fr -62.23.91.136 - 62.23.91.143 gb -62.23.91.144 - 62.23.91.175 fr -62.23.91.176 - 62.23.91.207 gb -62.23.91.208 - 62.23.91.215 fr -62.23.91.216 - 62.23.91.239 gb -62.23.91.240 - 62.23.92.71 fr -62.23.92.72 - 62.23.92.79 gb -62.23.92.80 - 62.23.92.175 fr -62.23.92.176 - 62.23.92.183 gb -62.23.92.184 - 62.23.92.191 fr -62.23.92.192 - 62.23.92.207 gb -62.23.92.208 - 62.23.92.223 fr -62.23.92.224 - 62.23.92.231 gb -62.23.92.232 - 62.23.93.71 fr -62.23.93.72 - 62.23.93.79 gb -62.23.93.80 - 62.23.93.95 fr -62.23.93.96 - 62.23.93.111 gb -62.23.93.112 - 62.23.93.135 fr -62.23.93.136 - 62.23.93.143 gb -62.23.93.144 - 62.23.94.111 fr -62.23.94.112 - 62.23.94.127 gb -62.23.94.128 - 62.23.94.151 fr -62.23.94.152 - 62.23.94.159 gb -62.23.94.160 - 62.23.94.191 fr -62.23.94.192 - 62.23.94.207 gb -62.23.94.208 - 62.23.94.215 fr -62.23.94.216 - 62.23.94.223 gb -62.23.94.224 - 62.23.95.127 fr -62.23.95.128 - 62.23.95.135 gb -62.23.95.136 - 62.23.95.163 fr -62.23.95.164 - 62.23.95.167 gb -62.23.95.168 - 62.23.95.175 fr -62.23.95.176 - 62.23.95.183 gb -62.23.95.184 - 62.23.95.184 fr -62.23.95.185 - 62.23.95.187 gb -62.23.95.188 - 62.23.95.188 fr -62.23.95.189 - 62.23.95.191 gb -62.23.95.192 - 62.23.95.207 fr -62.23.95.208 - 62.23.95.223 gb -62.23.95.224 - 62.23.97.15 fr -62.23.97.16 - 62.23.97.31 gb -62.23.97.32 - 62.23.97.79 fr -62.23.97.80 - 62.23.97.87 gb -62.23.97.88 - 62.23.97.191 fr -62.23.97.192 - 62.23.97.207 gb -62.23.97.208 - 62.23.98.79 fr -62.23.98.80 - 62.23.98.95 gb -62.23.98.96 - 62.23.98.111 fr -62.23.98.112 - 62.23.98.127 gb -62.23.98.128 - 62.23.98.207 fr -62.23.98.208 - 62.23.98.223 gb -62.23.98.224 - 62.23.100.127 fr -62.23.100.128 - 62.23.100.159 gb -62.23.100.160 - 62.23.100.167 fr -62.23.100.168 - 62.23.100.191 gb -62.23.100.192 - 62.23.100.207 fr -62.23.100.208 - 62.23.100.215 gb -62.23.100.216 - 62.23.100.231 fr -62.23.100.232 - 62.23.100.239 gb -62.23.100.240 - 62.23.100.247 fr -62.23.100.248 - 62.23.101.31 gb -62.23.101.32 - 62.23.101.55 fr -62.23.101.56 - 62.23.101.63 gb -62.23.101.64 - 62.23.101.111 fr -62.23.101.112 - 62.23.101.127 gb -62.23.101.128 - 62.23.101.255 fr -62.23.102.0 - 62.23.102.7 gb -62.23.102.8 - 62.23.102.71 fr -62.23.102.72 - 62.23.102.95 gb -62.23.102.96 - 62.23.102.207 fr -62.23.102.208 - 62.23.102.223 gb -62.23.102.224 - 62.23.103.255 fr -62.23.104.0 - 62.23.104.15 gb -62.23.104.16 - 62.23.104.47 fr -62.23.104.48 - 62.23.104.63 gb -62.23.104.64 - 62.23.104.175 fr -62.23.104.176 - 62.23.104.191 gb -62.23.104.192 - 62.23.105.175 fr -62.23.105.176 - 62.23.105.191 gb -62.23.105.192 - 62.23.105.215 fr -62.23.105.216 - 62.23.105.223 gb -62.23.105.224 - 62.23.107.63 fr -62.23.107.64 - 62.23.107.79 gb -62.23.107.80 - 62.23.107.95 fr -62.23.107.96 - 62.23.107.103 gb -62.23.107.104 - 62.23.107.111 fr -62.23.107.112 - 62.23.107.127 gb -62.23.107.128 - 62.23.107.167 fr -62.23.107.168 - 62.23.108.15 gb -62.23.108.16 - 62.23.108.23 fr -62.23.108.24 - 62.23.108.31 gb -62.23.108.32 - 62.23.108.55 fr -62.23.108.56 - 62.23.108.95 gb -62.23.108.96 - 62.23.108.111 fr -62.23.108.112 - 62.23.108.135 gb -62.23.108.136 - 62.23.108.167 fr -62.23.108.168 - 62.23.108.191 gb -62.23.108.192 - 62.23.108.199 fr -62.23.108.200 - 62.23.108.255 gb -62.23.109.0 - 62.23.109.15 fr -62.23.109.16 - 62.23.109.31 gb -62.23.109.32 - 62.23.109.79 fr -62.23.109.80 - 62.23.109.87 gb -62.23.109.88 - 62.23.109.119 fr -62.23.109.120 - 62.23.109.127 gb -62.23.109.128 - 62.23.110.103 fr -62.23.110.104 - 62.23.110.127 gb -62.23.110.128 - 62.23.110.167 fr -62.23.110.168 - 62.23.110.255 gb -62.23.111.0 - 62.23.111.223 fr -62.23.111.224 - 62.23.111.255 gb -62.23.112.0 - 62.23.113.7 fr -62.23.113.8 - 62.23.113.127 gb -62.23.113.128 - 62.23.113.191 fr -62.23.113.192 - 62.23.113.223 gb -62.23.113.224 - 62.23.113.239 fr -62.23.113.240 - 62.23.113.255 gb -62.23.114.0 - 62.23.116.39 fr -62.23.116.40 - 62.23.116.55 gb -62.23.116.56 - 62.23.116.95 fr -62.23.116.96 - 62.23.116.103 gb -62.23.116.104 - 62.23.116.255 fr -62.23.117.0 - 62.23.117.255 gb -62.23.118.0 - 62.23.118.87 fr -62.23.118.88 - 62.23.118.95 gb -62.23.118.96 - 62.23.118.191 fr -62.23.118.192 - 62.23.118.239 gb -62.23.118.240 - 62.23.118.247 fr -62.23.118.248 - 62.23.118.255 gb -62.23.119.0 - 62.23.119.7 fr -62.23.119.8 - 62.23.119.15 gb -62.23.119.16 - 62.23.119.23 fr -62.23.119.24 - 62.23.119.47 gb -62.23.119.48 - 62.23.119.71 fr -62.23.119.72 - 62.23.119.95 gb -62.23.119.96 - 62.23.119.191 fr -62.23.119.192 - 62.23.119.223 gb -62.23.119.224 - 62.23.121.53 fr -62.23.121.54 - 62.23.121.55 gb -62.23.121.56 - 62.23.121.167 fr -62.23.121.168 - 62.23.121.175 gb -62.23.121.176 - 62.23.122.111 fr -62.23.122.112 - 62.23.122.127 gb -62.23.122.128 - 62.23.122.175 fr -62.23.122.176 - 62.23.122.199 gb -62.23.122.200 - 62.23.122.207 fr -62.23.122.208 - 62.23.122.215 gb -62.23.122.216 - 62.23.124.39 fr -62.23.124.40 - 62.23.124.79 gb -62.23.124.80 - 62.23.124.175 fr -62.23.124.176 - 62.23.124.191 gb -62.23.124.192 - 62.23.124.207 fr -62.23.124.208 - 62.23.124.223 gb -62.23.124.224 - 62.23.124.255 fr -62.23.125.0 - 62.23.125.7 gb -62.23.125.8 - 62.23.125.15 fr -62.23.125.16 - 62.23.125.31 gb -62.23.125.32 - 62.23.125.127 fr -62.23.125.128 - 62.23.125.135 gb -62.23.125.136 - 62.23.125.159 fr -62.23.125.160 - 62.23.125.183 gb -62.23.125.184 - 62.23.125.231 fr -62.23.125.232 - 62.23.125.239 gb -62.23.125.240 - 62.23.125.255 fr -62.23.126.0 - 62.23.126.3 gb -62.23.126.4 - 62.23.126.7 fr -62.23.126.8 - 62.23.126.11 gb -62.23.126.12 - 62.23.126.15 fr -62.23.126.16 - 62.23.126.16 gb -62.23.126.17 - 62.23.126.18 fr -62.23.126.19 - 62.23.126.19 gb -62.23.126.20 - 62.23.126.31 fr -62.23.126.32 - 62.23.126.52 gb -62.23.126.53 - 62.23.126.53 fr -62.23.126.54 - 62.23.126.60 gb -62.23.126.61 - 62.23.126.62 fr -62.23.126.63 - 62.23.126.66 gb -62.23.126.67 - 62.23.126.67 fr -62.23.126.68 - 62.23.126.73 gb -62.23.126.74 - 62.23.126.74 fr -62.23.126.75 - 62.23.126.79 gb -62.23.126.80 - 62.23.126.87 fr -62.23.126.88 - 62.23.126.94 gb -62.23.126.95 - 62.23.126.111 fr -62.23.126.112 - 62.23.126.113 gb -62.23.126.114 - 62.23.126.114 fr -62.23.126.115 - 62.23.126.115 gb -62.23.126.116 - 62.23.126.191 fr -62.23.126.192 - 62.23.126.255 gb -62.23.127.0 - 62.23.127.71 fr -62.23.127.72 - 62.23.127.79 gb -62.23.127.80 - 62.23.129.255 fr -62.23.130.0 - 62.23.130.47 gb -62.23.130.48 - 62.23.130.63 fr -62.23.130.64 - 62.23.130.95 gb -62.23.130.96 - 62.23.130.111 fr -62.23.130.112 - 62.23.130.127 gb -62.23.130.128 - 62.23.133.119 fr -62.23.133.120 - 62.23.133.127 gb -62.23.133.128 - 62.23.135.103 fr -62.23.135.104 - 62.23.135.111 gb -62.23.135.112 - 62.23.135.167 fr -62.23.135.168 - 62.23.135.175 gb -62.23.135.176 - 62.23.135.223 fr -62.23.135.224 - 62.23.135.239 gb -62.23.135.240 - 62.23.135.247 fr -62.23.135.248 - 62.23.135.255 gb -62.23.136.0 - 62.23.136.25 fr -62.23.136.26 - 62.23.136.28 gb -62.23.136.29 - 62.23.136.30 fr -62.23.136.31 - 62.23.136.31 gb -62.23.136.32 - 62.23.136.79 fr -62.23.136.80 - 62.23.136.87 gb -62.23.136.88 - 62.23.136.127 fr -62.23.136.128 - 62.23.137.143 gb -62.23.137.144 - 62.23.137.159 fr -62.23.137.160 - 62.23.137.255 gb -62.23.138.0 - 62.23.138.191 fr -62.23.138.192 - 62.23.138.199 gb -62.23.138.200 - 62.23.140.79 fr -62.23.140.80 - 62.23.140.95 gb -62.23.140.96 - 62.23.145.135 fr -62.23.145.136 - 62.23.145.191 gb -62.23.145.192 - 62.23.145.215 fr -62.23.145.216 - 62.23.145.223 gb -62.23.145.224 - 62.23.146.7 fr -62.23.146.8 - 62.23.146.15 gb -62.23.146.16 - 62.23.146.31 fr -62.23.146.32 - 62.23.146.95 gb -62.23.146.96 - 62.23.146.159 fr -62.23.146.160 - 62.23.146.199 gb -62.23.146.200 - 62.23.146.207 fr -62.23.146.208 - 62.23.146.215 gb -62.23.146.216 - 62.23.147.119 fr -62.23.147.120 - 62.23.147.127 gb -62.23.147.128 - 62.23.147.167 fr -62.23.147.168 - 62.23.147.175 gb -62.23.147.176 - 62.23.148.255 fr -62.23.149.0 - 62.23.149.7 gb -62.23.149.8 - 62.23.149.15 fr -62.23.149.16 - 62.23.149.63 gb -62.23.149.64 - 62.23.149.95 fr -62.23.149.96 - 62.23.149.103 gb -62.23.149.104 - 62.23.149.127 fr -62.23.149.128 - 62.23.149.239 gb -62.23.149.240 - 62.23.151.143 fr -62.23.151.144 - 62.23.151.159 gb -62.23.151.160 - 62.23.151.191 fr -62.23.151.192 - 62.23.151.255 gb -62.23.152.0 - 62.23.157.15 fr -62.23.157.16 - 62.23.157.31 gb -62.23.157.32 - 62.23.157.63 fr -62.23.157.64 - 62.23.157.79 gb -62.23.157.80 - 62.23.157.87 fr -62.23.157.88 - 62.23.157.127 gb -62.23.157.128 - 62.23.157.143 fr -62.23.157.144 - 62.23.157.175 gb -62.23.157.176 - 62.23.157.183 fr -62.23.157.184 - 62.23.157.191 gb -62.23.157.192 - 62.23.157.207 fr -62.23.157.208 - 62.23.157.255 gb -62.23.158.0 - 62.23.159.7 fr -62.23.159.8 - 62.23.159.71 gb -62.23.159.72 - 62.23.159.87 fr -62.23.159.88 - 62.23.159.127 gb -62.23.159.128 - 62.23.159.143 fr -62.23.159.144 - 62.23.159.159 gb -62.23.159.160 - 62.23.159.191 fr -62.23.159.192 - 62.23.159.239 gb -62.23.159.240 - 62.23.162.183 fr -62.23.162.184 - 62.23.162.191 gb -62.23.162.192 - 62.23.162.231 fr -62.23.162.232 - 62.23.163.7 gb -62.23.163.8 - 62.23.163.79 fr -62.23.163.80 - 62.23.163.87 gb -62.23.163.88 - 62.23.163.95 fr -62.23.163.96 - 62.23.163.103 gb -62.23.163.104 - 62.23.163.143 fr -62.23.163.144 - 62.23.163.151 gb -62.23.163.152 - 62.23.163.159 fr -62.23.163.160 - 62.23.163.183 gb -62.23.163.184 - 62.23.163.239 fr -62.23.163.240 - 62.23.163.247 gb -62.23.163.248 - 62.23.165.55 fr -62.23.165.56 - 62.23.165.71 gb -62.23.165.72 - 62.23.165.79 fr -62.23.165.80 - 62.23.165.95 gb -62.23.165.96 - 62.23.165.111 fr -62.23.165.112 - 62.23.165.159 gb -62.23.165.160 - 62.23.165.167 fr -62.23.165.168 - 62.23.165.191 gb -62.23.165.192 - 62.23.165.207 fr -62.23.165.208 - 62.23.165.223 gb -62.23.165.224 - 62.23.165.255 fr -62.23.166.0 - 62.23.166.63 gb -62.23.166.64 - 62.23.166.79 fr -62.23.166.80 - 62.23.166.87 gb -62.23.166.88 - 62.23.166.159 fr -62.23.166.160 - 62.23.166.175 gb -62.23.166.176 - 62.23.166.183 fr -62.23.166.184 - 62.23.166.207 gb -62.23.166.208 - 62.23.166.239 fr -62.23.166.240 - 62.23.166.247 gb -62.23.166.248 - 62.23.167.15 fr -62.23.167.16 - 62.23.167.23 gb -62.23.167.24 - 62.23.167.31 fr -62.23.167.32 - 62.23.167.39 gb -62.23.167.40 - 62.23.167.63 fr -62.23.167.64 - 62.23.167.95 gb -62.23.167.96 - 62.23.167.119 fr -62.23.167.120 - 62.23.167.127 gb -62.23.167.128 - 62.23.167.135 fr -62.23.167.136 - 62.23.167.143 gb -62.23.167.144 - 62.23.167.175 fr -62.23.167.176 - 62.23.167.191 gb -62.23.167.192 - 62.23.167.199 fr -62.23.167.200 - 62.23.167.223 gb -62.23.167.224 - 62.23.167.255 fr -62.23.168.0 - 62.23.168.15 gb -62.23.168.16 - 62.23.168.47 fr -62.23.168.48 - 62.23.168.95 gb -62.23.168.96 - 62.23.168.119 fr -62.23.168.120 - 62.23.168.127 gb -62.23.168.128 - 62.23.168.143 fr -62.23.168.144 - 62.23.168.151 gb -62.23.168.152 - 62.23.168.175 fr -62.23.168.176 - 62.23.168.183 gb -62.23.168.184 - 62.23.168.191 fr -62.23.168.192 - 62.23.168.207 gb -62.23.168.208 - 62.23.169.175 fr -62.23.169.176 - 62.23.169.183 gb -62.23.169.184 - 62.23.169.231 fr -62.23.169.232 - 62.23.169.239 gb -62.23.169.240 - 62.23.171.23 fr -62.23.171.24 - 62.23.171.47 gb -62.23.171.48 - 62.23.171.55 fr -62.23.171.56 - 62.23.171.63 gb -62.23.171.64 - 62.23.171.71 fr -62.23.171.72 - 62.23.171.79 gb -62.23.171.80 - 62.23.171.87 fr -62.23.171.88 - 62.23.171.95 gb -62.23.171.96 - 62.23.171.103 fr -62.23.171.104 - 62.23.171.119 gb -62.23.171.120 - 62.23.171.167 fr -62.23.171.168 - 62.23.171.175 gb -62.23.171.176 - 62.23.171.207 fr -62.23.171.208 - 62.23.171.223 gb -62.23.171.224 - 62.23.171.239 fr -62.23.171.240 - 62.23.171.255 gb -62.23.172.0 - 62.23.173.71 fr -62.23.173.72 - 62.23.173.79 gb -62.23.173.80 - 62.23.173.159 fr -62.23.173.160 - 62.23.173.223 gb -62.23.173.224 - 62.23.174.31 fr -62.23.174.32 - 62.23.174.35 be -62.23.174.36 - 62.23.174.39 gb -62.23.174.40 - 62.23.174.111 fr -62.23.174.112 - 62.23.174.119 be -62.23.174.120 - 62.23.174.143 fr -62.23.174.144 - 62.23.174.159 gb -62.23.174.160 - 62.23.174.199 fr -62.23.174.200 - 62.23.174.207 gb -62.23.174.208 - 62.23.174.223 fr -62.23.174.224 - 62.23.174.239 gb -62.23.174.240 - 62.23.174.255 fr -62.23.175.0 - 62.23.175.15 gb -62.23.175.16 - 62.23.175.223 fr -62.23.175.224 - 62.23.175.231 gb -62.23.175.232 - 62.23.176.255 fr -62.23.177.0 - 62.23.177.7 gb -62.23.177.8 - 62.23.177.71 fr -62.23.177.72 - 62.23.177.87 gb -62.23.177.88 - 62.23.177.103 fr -62.23.177.104 - 62.23.177.111 gb -62.23.177.112 - 62.23.177.135 fr -62.23.177.136 - 62.23.177.143 gb -62.23.177.144 - 62.23.177.231 fr -62.23.177.232 - 62.23.177.239 gb -62.23.177.240 - 62.23.179.23 fr -62.23.179.24 - 62.23.179.31 gb -62.23.179.32 - 62.23.179.47 fr -62.23.179.48 - 62.23.179.63 gb -62.23.179.64 - 62.23.179.103 fr -62.23.179.104 - 62.23.179.111 gb -62.23.179.112 - 62.23.179.127 fr -62.23.179.128 - 62.23.179.143 gb -62.23.179.144 - 62.23.179.159 fr -62.23.179.160 - 62.23.179.175 gb -62.23.179.176 - 62.23.180.7 fr -62.23.180.8 - 62.23.180.31 gb -62.23.180.32 - 62.23.181.7 fr -62.23.181.8 - 62.23.181.31 gb -62.23.181.32 - 62.23.181.79 fr -62.23.181.80 - 62.23.181.95 gb -62.23.181.96 - 62.23.181.175 fr -62.23.181.176 - 62.23.181.207 gb -62.23.181.208 - 62.23.181.223 fr -62.23.181.224 - 62.23.181.239 gb -62.23.181.240 - 62.23.182.255 fr -62.23.183.0 - 62.23.183.15 gb -62.23.183.16 - 62.23.183.39 fr -62.23.183.40 - 62.23.183.47 gb -62.23.183.48 - 62.23.183.63 fr -62.23.183.64 - 62.23.183.79 gb -62.23.183.80 - 62.23.183.95 de -62.23.183.96 - 62.23.183.111 gb -62.23.183.112 - 62.23.183.119 fr -62.23.183.120 - 62.23.183.255 gb -62.23.184.0 - 62.23.185.7 fr -62.23.185.8 - 62.23.185.15 gb -62.23.185.16 - 62.23.185.103 fr -62.23.185.104 - 62.23.185.111 gb -62.23.185.112 - 62.23.185.143 fr -62.23.185.144 - 62.23.185.159 gb -62.23.185.160 - 62.23.185.183 fr -62.23.185.184 - 62.23.185.191 gb -62.23.185.192 - 62.23.185.199 fr -62.23.185.200 - 62.23.185.207 gb -62.23.185.208 - 62.23.185.223 fr -62.23.185.224 - 62.23.185.255 gb -62.23.186.0 - 62.23.186.23 fr -62.23.186.24 - 62.23.186.31 gb -62.23.186.32 - 62.23.186.47 fr -62.23.186.48 - 62.23.186.55 gb -62.23.186.56 - 62.23.186.71 fr -62.23.186.72 - 62.23.186.79 gb -62.23.186.80 - 62.23.186.119 fr -62.23.186.120 - 62.23.186.127 gb -62.23.186.128 - 62.23.186.135 fr -62.23.186.136 - 62.23.186.143 gb -62.23.186.144 - 62.23.186.175 fr -62.23.186.176 - 62.23.186.191 gb -62.23.186.192 - 62.23.189.31 fr -62.23.189.32 - 62.23.189.39 gb -62.23.189.40 - 62.23.189.71 fr -62.23.189.72 - 62.23.189.111 gb -62.23.189.112 - 62.23.189.199 fr -62.23.189.200 - 62.23.189.207 gb -62.23.189.208 - 62.23.190.255 fr -62.23.191.0 - 62.23.191.7 gb -62.23.191.8 - 62.23.191.23 fr -62.23.191.24 - 62.23.191.31 gb -62.23.191.32 - 62.23.191.55 fr -62.23.191.56 - 62.23.191.63 gb -62.23.191.64 - 62.23.191.127 fr -62.23.191.128 - 62.23.191.143 gb -62.23.191.144 - 62.23.191.151 fr -62.23.191.152 - 62.23.191.159 gb -62.23.191.160 - 62.23.191.167 fr -62.23.191.168 - 62.23.191.183 gb -62.23.191.184 - 62.23.191.191 fr -62.23.191.192 - 62.23.191.207 gb -62.23.191.208 - 62.23.191.215 fr -62.23.191.216 - 62.23.191.231 gb -62.23.191.232 - 62.23.191.247 fr -62.23.191.248 - 62.23.191.255 gb -62.23.192.0 - 62.23.193.135 fr -62.23.193.136 - 62.23.193.143 gb -62.23.193.144 - 62.23.193.159 fr -62.23.193.160 - 62.23.193.167 gb -62.23.193.168 - 62.23.193.183 fr -62.23.193.184 - 62.23.193.199 gb -62.23.193.200 - 62.23.193.231 fr -62.23.193.232 - 62.23.193.239 gb -62.23.193.240 - 62.23.194.15 fr -62.23.194.16 - 62.23.194.23 gb -62.23.194.24 - 62.23.194.31 fr -62.23.194.32 - 62.23.194.63 gb -62.23.194.64 - 62.23.194.95 fr -62.23.194.96 - 62.23.194.159 gb -62.23.194.160 - 62.23.194.191 fr -62.23.194.192 - 62.23.194.199 gb -62.23.194.200 - 62.23.194.215 fr -62.23.194.216 - 62.23.194.223 gb -62.23.194.224 - 62.23.194.239 fr -62.23.194.240 - 62.23.194.255 gb -62.23.195.0 - 62.23.195.255 fr -62.23.196.0 - 62.23.196.15 gb -62.23.196.16 - 62.23.196.23 fr -62.23.196.24 - 62.23.196.31 gb -62.23.196.32 - 62.23.196.47 fr -62.23.196.48 - 62.23.196.55 gb -62.23.196.56 - 62.23.196.79 fr -62.23.196.80 - 62.23.196.87 gb -62.23.196.88 - 62.23.196.111 fr -62.23.196.112 - 62.23.196.135 gb -62.23.196.136 - 62.23.196.167 fr -62.23.196.168 - 62.23.196.175 gb -62.23.196.176 - 62.23.196.231 fr -62.23.196.232 - 62.23.196.255 gb -62.23.197.0 - 62.23.197.15 fr -62.23.197.16 - 62.23.197.39 gb -62.23.197.40 - 62.23.197.95 fr -62.23.197.96 - 62.23.197.127 gb -62.23.197.128 - 62.23.197.175 fr -62.23.197.176 - 62.23.197.191 gb -62.23.197.192 - 62.23.197.207 fr -62.23.197.208 - 62.23.197.223 gb -62.23.197.224 - 62.23.197.247 fr -62.23.197.248 - 62.23.197.255 gb -62.23.198.0 - 62.23.198.39 fr -62.23.198.40 - 62.23.198.63 gb -62.23.198.64 - 62.23.198.71 fr -62.23.198.72 - 62.23.198.79 gb -62.23.198.80 - 62.23.198.87 fr -62.23.198.88 - 62.23.198.95 gb -62.23.198.96 - 62.23.198.135 fr -62.23.198.136 - 62.23.198.143 gb -62.23.198.144 - 62.23.198.159 fr -62.23.198.160 - 62.23.198.167 gb -62.23.198.168 - 62.23.198.191 fr -62.23.198.192 - 62.23.198.207 gb -62.23.198.208 - 62.23.198.231 fr -62.23.198.232 - 62.23.198.239 gb -62.23.198.240 - 62.23.198.247 fr -62.23.198.248 - 62.23.198.255 gb -62.23.199.0 - 62.23.199.87 fr -62.23.199.88 - 62.23.199.103 gb -62.23.199.104 - 62.23.199.127 fr -62.23.199.128 - 62.23.199.135 gb -62.23.199.136 - 62.23.199.191 fr -62.23.199.192 - 62.23.199.207 gb -62.23.199.208 - 62.23.199.223 fr -62.23.199.224 - 62.23.200.39 gb -62.23.200.40 - 62.23.200.79 fr -62.23.200.80 - 62.23.200.95 gb -62.23.200.96 - 62.23.200.103 fr -62.23.200.104 - 62.23.200.111 gb -62.23.200.112 - 62.23.200.119 fr -62.23.200.120 - 62.23.200.127 gb -62.23.200.128 - 62.23.200.143 fr -62.23.200.144 - 62.23.200.159 gb -62.23.200.160 - 62.23.200.191 fr -62.23.200.192 - 62.23.200.215 gb -62.23.200.216 - 62.23.203.23 fr -62.23.203.24 - 62.23.203.47 gb -62.23.203.48 - 62.23.203.55 fr -62.23.203.56 - 62.23.203.63 gb -62.23.203.64 - 62.23.203.111 fr -62.23.203.112 - 62.23.203.135 gb -62.23.203.136 - 62.23.203.143 fr -62.23.203.144 - 62.23.203.159 gb -62.23.203.160 - 62.23.203.175 fr -62.23.203.176 - 62.23.203.207 gb -62.23.203.208 - 62.23.206.7 fr -62.23.206.8 - 62.23.206.31 gb -62.23.206.32 - 62.23.215.15 fr -62.23.215.16 - 62.23.215.23 gb -62.23.215.24 - 62.23.215.47 fr -62.23.215.48 - 62.23.215.55 gb -62.23.215.56 - 62.23.215.79 fr -62.23.215.80 - 62.23.215.95 gb -62.23.215.96 - 62.23.215.199 fr -62.23.215.200 - 62.23.215.223 gb -62.23.215.224 - 62.23.215.239 fr -62.23.215.240 - 62.23.215.247 gb -62.23.215.248 - 62.23.217.255 fr -62.23.218.0 - 62.23.218.15 gb -62.23.218.16 - 62.23.218.135 fr -62.23.218.136 - 62.23.218.143 gb -62.23.218.144 - 62.23.218.215 fr -62.23.218.216 - 62.23.218.223 gb -62.23.218.224 - 62.23.218.247 fr -62.23.218.248 - 62.23.218.255 gb -62.23.219.0 - 62.23.219.47 fr -62.23.219.48 - 62.23.219.55 gb -62.23.219.56 - 62.23.221.7 fr -62.23.221.8 - 62.23.221.15 gb -62.23.221.16 - 62.23.221.55 fr -62.23.221.56 - 62.23.221.63 gb -62.23.221.64 - 62.23.222.15 fr -62.23.222.16 - 62.23.222.23 gb -62.23.222.24 - 62.23.222.143 fr -62.23.222.144 - 62.23.222.167 gb -62.23.222.168 - 62.23.222.207 fr -62.23.222.208 - 62.23.222.215 gb -62.23.222.216 - 62.23.222.223 fr -62.23.222.224 - 62.23.222.255 gb -62.23.223.0 - 62.23.228.231 fr -62.23.228.232 - 62.23.228.239 gb -62.23.228.240 - 62.23.229.63 fr -62.23.229.64 - 62.23.229.159 gb -62.23.229.160 - 62.23.229.255 fr -62.23.230.0 - 62.23.230.175 gb -62.23.230.176 - 62.23.230.231 fr -62.23.230.232 - 62.23.230.239 gb -62.23.230.240 - 62.23.231.127 fr -62.23.231.128 - 62.23.231.159 gb -62.23.231.160 - 62.23.232.31 fr -62.23.232.32 - 62.23.232.39 gb -62.23.232.40 - 62.23.232.63 fr -62.23.232.64 - 62.23.232.79 gb -62.23.232.80 - 62.23.232.127 fr -62.23.232.128 - 62.23.232.135 gb -62.23.232.136 - 62.23.233.87 fr -62.23.233.88 - 62.23.233.95 gb -62.23.233.96 - 62.23.233.111 fr -62.23.233.112 - 62.23.233.127 gb -62.23.233.128 - 62.23.236.95 fr -62.23.236.96 - 62.23.236.103 gb -62.23.236.104 - 62.23.236.199 fr -62.23.236.200 - 62.23.236.207 gb -62.23.236.208 - 62.23.236.239 fr -62.23.236.240 - 62.23.236.255 gb -62.23.237.0 - 62.23.237.111 fr -62.23.237.112 - 62.23.237.127 gb -62.23.237.128 - 62.23.237.239 fr -62.23.237.240 - 62.23.237.255 gb -62.23.238.0 - 62.23.241.47 fr -62.23.241.48 - 62.23.241.55 gb -62.23.241.56 - 62.23.241.127 fr -62.23.241.128 - 62.23.241.151 gb -62.23.241.152 - 62.23.241.175 fr -62.23.241.176 - 62.23.241.191 gb -62.23.241.192 - 62.23.241.239 fr -62.23.241.240 - 62.23.241.247 gb -62.23.241.248 - 62.23.242.23 fr -62.23.242.24 - 62.23.242.31 de -62.23.242.32 - 62.23.242.247 fr -62.23.242.248 - 62.23.242.255 gb -62.23.243.0 - 62.23.243.95 fr -62.23.243.96 - 62.23.243.111 gb -62.23.243.112 - 62.23.243.159 fr -62.23.243.160 - 62.23.243.167 gb -62.23.243.168 - 62.23.243.183 fr -62.23.243.184 - 62.23.243.199 gb -62.23.243.200 - 62.23.243.247 fr -62.23.243.248 - 62.23.243.251 gb -62.23.243.252 - 62.23.245.63 fr -62.23.245.64 - 62.23.245.79 gb -62.23.245.80 - 62.23.245.143 fr -62.23.245.144 - 62.23.245.151 gb -62.23.245.152 - 62.23.245.167 fr -62.23.245.168 - 62.23.245.175 gb -62.23.245.176 - 62.23.245.191 fr -62.23.245.192 - 62.23.245.207 gb -62.23.245.208 - 62.23.245.223 fr -62.23.245.224 - 62.23.245.231 gb -62.23.245.232 - 62.23.245.247 fr -62.23.245.248 - 62.23.245.255 gb -62.23.246.0 - 62.23.247.79 fr -62.23.247.80 - 62.23.247.87 gb -62.23.247.88 - 62.23.247.143 fr -62.23.247.144 - 62.23.247.159 gb -62.23.247.160 - 62.23.247.207 fr -62.23.247.208 - 62.23.247.215 gb -62.23.247.216 - 62.23.248.47 fr -62.23.248.48 - 62.23.248.63 gb -62.23.248.64 - 62.23.248.111 fr -62.23.248.112 - 62.23.248.135 gb -62.23.248.136 - 62.23.248.143 fr -62.23.248.144 - 62.23.248.159 gb -62.23.248.160 - 62.23.248.183 fr -62.23.248.184 - 62.23.248.191 gb -62.23.248.192 - 62.23.248.199 fr -62.23.248.200 - 62.23.248.207 gb -62.23.248.208 - 62.23.248.215 fr -62.23.248.216 - 62.23.248.223 gb -62.23.248.224 - 62.23.249.215 fr -62.23.249.216 - 62.23.249.223 gb -62.23.249.224 - 62.23.251.255 fr -62.23.252.0 - 62.23.255.255 gb +62.22.0.0 - 62.22.36.255 es +62.22.37.0 - 62.22.37.255 eu +62.22.38.0 - 62.22.52.255 es +62.22.53.0 - 62.22.53.255 eu +62.22.54.0 - 62.22.255.255 es +62.23.0.0 - 62.23.211.255 fr +62.23.212.0 - 62.23.212.255 eu +62.23.213.0 - 62.23.255.255 fr 62.24.0.0 - 62.24.31.255 de 62.24.32.0 - 62.24.63.255 no 62.24.64.0 - 62.24.95.255 cz 62.24.96.0 - 62.24.127.255 ke 62.24.128.0 - 62.24.255.255 gb 62.25.0.0 - 62.25.63.255 nl -62.25.64.0 - 62.25.255.255 gb -62.26.0.0 - 62.26.117.255 de -62.26.118.0 - 62.26.118.191 us -62.26.118.192 - 62.26.191.213 de -62.26.191.214 - 62.26.191.214 a2 -62.26.191.215 - 62.26.209.255 de -62.26.210.0 - 62.26.210.63 at -62.26.210.64 - 62.27.6.63 de -62.27.6.64 - 62.27.6.127 dk -62.27.6.128 - 62.27.9.255 de -62.27.10.0 - 62.27.10.255 us -62.27.11.0 - 62.27.255.255 de -62.28.0.0 - 62.28.91.195 pt -62.28.91.196 - 62.28.91.199 a2 -62.28.91.200 - 62.28.251.83 pt -62.28.251.84 - 62.28.251.87 a2 -62.28.251.88 - 62.28.255.255 pt +62.25.64.0 - 62.25.127.255 gb +62.25.128.0 - 62.25.143.255 hk +62.25.144.0 - 62.25.159.255 sg +62.25.160.0 - 62.25.175.255 jp +62.25.176.0 - 62.25.255.255 gb +62.26.0.0 - 62.27.255.255 de +62.28.0.0 - 62.28.255.255 pt 62.29.0.0 - 62.29.127.255 tr 62.29.128.0 - 62.29.255.255 pl 62.30.0.0 - 62.31.255.255 gb -62.32.0.0 - 62.32.15.15 ch -62.32.15.16 - 62.32.15.31 gb -62.32.15.32 - 62.32.31.255 ch -62.32.32.0 - 62.32.33.255 nl -62.32.34.0 - 62.32.34.255 gb -62.32.35.0 - 62.32.35.31 it -62.32.35.32 - 62.32.35.127 ir -62.32.35.128 - 62.32.35.255 ge -62.32.36.0 - 62.32.36.225 it -62.32.36.226 - 62.32.39.255 nl -62.32.40.0 - 62.32.44.255 ge -62.32.45.0 - 62.32.45.127 cy -62.32.45.128 - 62.32.46.255 ge -62.32.47.0 - 62.32.47.255 by -62.32.48.0 - 62.32.49.127 nl -62.32.49.128 - 62.32.49.231 ir -62.32.49.232 - 62.32.49.239 ge -62.32.49.240 - 62.32.50.255 ir -62.32.51.0 - 62.32.51.255 gb -62.32.52.0 - 62.32.52.255 nl -62.32.53.0 - 62.32.53.31 us -62.32.53.32 - 62.32.53.63 nl -62.32.53.64 - 62.32.53.127 ir -62.32.53.128 - 62.32.53.167 iq -62.32.53.168 - 62.32.53.175 ir -62.32.53.176 - 62.32.53.191 gb -62.32.53.192 - 62.32.53.223 iq -62.32.53.224 - 62.32.53.239 ir -62.32.53.240 - 62.32.53.255 nl -62.32.54.0 - 62.32.54.255 gb -62.32.55.0 - 62.32.55.255 nl -62.32.56.0 - 62.32.56.255 gb -62.32.57.0 - 62.32.57.255 iq -62.32.58.0 - 62.32.60.255 nl -62.32.61.0 - 62.32.61.15 by -62.32.61.16 - 62.32.61.63 iq -62.32.61.64 - 62.32.61.95 am -62.32.61.96 - 62.32.61.127 ir -62.32.61.128 - 62.32.61.191 it -62.32.61.192 - 62.32.61.223 iq -62.32.61.224 - 62.32.61.255 ir -62.32.62.0 - 62.32.62.63 nl -62.32.62.64 - 62.32.62.79 iq -62.32.62.80 - 62.32.62.127 gb -62.32.62.128 - 62.32.62.223 iq -62.32.62.224 - 62.32.62.231 nl -62.32.62.232 - 62.32.62.239 iq -62.32.62.240 - 62.32.62.255 lb -62.32.63.0 - 62.32.63.127 iq -62.32.63.128 - 62.32.63.191 ir -62.32.63.192 - 62.32.63.223 lb -62.32.63.224 - 62.32.63.231 md +62.32.0.0 - 62.32.31.255 ch +62.32.32.0 - 62.32.38.255 nl +62.32.39.0 - 62.32.39.255 gb +62.32.40.0 - 62.32.42.255 nl +62.32.43.0 - 62.32.46.255 ge +62.32.47.0 - 62.32.63.231 nl 62.32.63.232 - 62.32.63.239 ua -62.32.63.240 - 62.32.63.247 nl -62.32.63.248 - 62.32.63.255 ua +62.32.63.240 - 62.32.63.255 nl 62.32.64.0 - 62.32.95.255 ru 62.32.96.0 - 62.32.127.255 gb 62.32.128.0 - 62.32.255.255 es @@ -8332,97 +12665,23 @@ 62.40.0.0 - 62.40.31.255 de 62.40.32.0 - 62.40.63.255 ie 62.40.64.0 - 62.40.95.255 cz -62.40.96.0 - 62.40.127.255 gb +62.40.96.0 - 62.40.98.105 gb +62.40.98.106 - 62.40.98.106 pt +62.40.98.107 - 62.40.124.97 gb +62.40.124.98 - 62.40.124.98 pt +62.40.124.99 - 62.40.127.255 gb 62.40.128.0 - 62.40.255.255 at -62.41.0.0 - 62.41.3.255 nl -62.41.4.0 - 62.41.4.7 gb -62.41.4.8 - 62.41.4.15 de -62.41.4.16 - 62.41.4.31 nl -62.41.4.32 - 62.41.4.63 gb -62.41.4.64 - 62.41.5.255 nl -62.41.6.0 - 62.41.7.127 gb -62.41.7.128 - 62.41.7.255 nl -62.41.8.0 - 62.41.8.63 gb -62.41.8.64 - 62.41.8.231 nl -62.41.8.232 - 62.41.8.247 gb -62.41.8.248 - 62.41.8.255 nl -62.41.9.0 - 62.41.9.255 de -62.41.10.0 - 62.41.10.255 gb -62.41.11.0 - 62.41.13.255 de -62.41.14.0 - 62.41.14.255 nl -62.41.15.0 - 62.41.15.255 gb -62.41.16.0 - 62.41.24.127 nl -62.41.24.128 - 62.41.24.255 gb -62.41.25.0 - 62.41.31.255 nl -62.41.32.0 - 62.41.32.255 de -62.41.33.0 - 62.41.55.255 nl -62.41.56.0 - 62.41.56.255 gb -62.41.57.0 - 62.41.57.255 nl -62.41.58.0 - 62.41.58.255 de -62.41.59.0 - 62.41.60.255 nl -62.41.61.0 - 62.41.61.135 gb -62.41.61.136 - 62.41.61.143 nl -62.41.61.144 - 62.41.61.159 gb -62.41.61.160 - 62.41.61.255 nl -62.41.62.0 - 62.41.62.255 gb -62.41.63.0 - 62.41.63.255 fr -62.41.64.0 - 62.41.64.63 gb -62.41.64.64 - 62.41.64.67 fr -62.41.64.68 - 62.41.64.192 nl -62.41.64.193 - 62.41.64.198 gb -62.41.64.199 - 62.41.64.207 nl -62.41.64.208 - 62.41.64.239 gb -62.41.64.240 - 62.41.67.255 nl -62.41.68.0 - 62.41.68.63 gb -62.41.68.64 - 62.41.68.95 be -62.41.68.96 - 62.41.68.239 nl -62.41.68.240 - 62.41.68.255 de -62.41.69.0 - 62.41.69.255 nl -62.41.70.0 - 62.41.70.255 fr -62.41.71.0 - 62.41.72.63 nl -62.41.72.64 - 62.41.72.95 be -62.41.72.96 - 62.41.72.159 nl -62.41.72.160 - 62.41.72.167 de -62.41.72.168 - 62.41.72.175 pl -62.41.72.176 - 62.41.72.183 ch -62.41.72.184 - 62.41.72.191 nl -62.41.72.192 - 62.41.72.207 fr -62.41.72.208 - 62.41.72.239 nl -62.41.72.240 - 62.41.72.255 de -62.41.73.0 - 62.41.73.31 gb -62.41.73.32 - 62.41.73.79 nl -62.41.73.80 - 62.41.73.87 de -62.41.73.88 - 62.41.73.95 nl -62.41.73.96 - 62.41.73.111 pl -62.41.73.112 - 62.41.73.127 nl -62.41.73.128 - 62.41.73.255 gb -62.41.74.0 - 62.41.76.255 nl -62.41.77.0 - 62.41.77.63 de -62.41.77.64 - 62.41.77.95 se -62.41.77.96 - 62.41.77.255 nl -62.41.78.0 - 62.41.78.19 fr -62.41.78.20 - 62.41.78.23 nl -62.41.78.24 - 62.41.78.31 gb -62.41.78.32 - 62.41.78.63 nl -62.41.78.64 - 62.41.78.79 gb -62.41.78.80 - 62.41.78.95 nl -62.41.78.96 - 62.41.78.127 pt -62.41.78.128 - 62.41.78.223 nl -62.41.78.224 - 62.41.78.255 de -62.41.79.0 - 62.41.79.191 nl -62.41.79.192 - 62.41.79.255 de -62.41.80.0 - 62.41.80.255 nl -62.41.81.0 - 62.41.81.127 gb -62.41.81.128 - 62.41.81.255 de -62.41.82.0 - 62.41.82.255 nl -62.41.83.0 - 62.41.83.255 gb -62.41.84.0 - 62.41.84.255 nl -62.41.85.0 - 62.41.85.127 gb -62.41.85.128 - 62.41.101.255 nl -62.41.102.0 - 62.41.102.255 gb -62.41.103.0 - 62.41.160.47 nl -62.41.160.48 - 62.41.160.63 de -62.41.160.64 - 62.41.255.255 nl +62.41.0.0 - 62.41.2.255 nl +62.41.3.0 - 62.41.3.255 fr +62.41.4.0 - 62.41.19.255 nl +62.41.20.0 - 62.41.20.255 us +62.41.21.0 - 62.41.21.255 nl +62.41.22.0 - 62.41.22.255 gb +62.41.23.0 - 62.41.25.255 nl +62.41.26.0 - 62.41.27.255 de +62.41.28.0 - 62.41.72.63 nl +62.41.72.64 - 62.41.72.255 eu +62.41.73.0 - 62.41.255.255 nl 62.42.0.0 - 62.43.255.255 es 62.44.0.0 - 62.44.31.255 cz 62.44.32.0 - 62.44.63.255 de @@ -8434,2000 +12693,45 @@ 62.46.0.0 - 62.47.255.255 at 62.48.0.0 - 62.48.31.255 ch 62.48.32.0 - 62.48.63.255 it -62.48.64.0 - 62.48.69.67 de -62.48.69.68 - 62.48.69.71 ch -62.48.69.72 - 62.48.89.119 de -62.48.89.120 - 62.48.89.127 ch -62.48.89.128 - 62.48.95.255 de +62.48.64.0 - 62.48.95.255 de 62.48.96.0 - 62.48.127.255 ch 62.48.128.0 - 62.48.255.255 pt -62.49.0.0 - 62.49.255.255 gb -62.50.0.0 - 62.50.0.95 nl -62.50.0.96 - 62.50.0.119 gb -62.50.0.120 - 62.50.0.159 nl -62.50.0.160 - 62.50.0.191 gb -62.50.0.192 - 62.50.2.95 nl -62.50.2.96 - 62.50.2.103 gb -62.50.2.104 - 62.50.2.119 nl -62.50.2.120 - 62.50.2.127 gb -62.50.2.128 - 62.50.2.223 nl -62.50.2.224 - 62.50.3.95 gb -62.50.3.96 - 62.50.3.111 nl -62.50.3.112 - 62.50.3.127 gb -62.50.3.128 - 62.50.6.47 nl -62.50.6.48 - 62.50.6.55 gb -62.50.6.56 - 62.50.6.111 nl -62.50.6.112 - 62.50.6.127 gb -62.50.6.128 - 62.50.6.143 nl -62.50.6.144 - 62.50.6.191 gb -62.50.6.192 - 62.50.6.255 nl -62.50.7.0 - 62.50.8.7 gb -62.50.8.8 - 62.50.8.79 nl -62.50.8.80 - 62.50.8.87 gb -62.50.8.88 - 62.50.8.95 nl -62.50.8.96 - 62.50.8.111 gb -62.50.8.112 - 62.50.8.191 nl -62.50.8.192 - 62.50.8.207 gb -62.50.8.208 - 62.50.8.215 nl -62.50.8.216 - 62.50.8.223 gb -62.50.8.224 - 62.50.8.255 nl -62.50.9.0 - 62.50.9.7 gb -62.50.9.8 - 62.50.9.15 nl -62.50.9.16 - 62.50.9.23 gb -62.50.9.24 - 62.50.9.63 nl -62.50.9.64 - 62.50.9.79 gb -62.50.9.80 - 62.50.9.87 nl -62.50.9.88 - 62.50.9.111 gb -62.50.9.112 - 62.50.10.135 nl -62.50.10.136 - 62.50.10.175 gb -62.50.10.176 - 62.50.10.191 nl -62.50.10.192 - 62.50.10.239 gb -62.50.10.240 - 62.50.10.255 nl -62.50.11.0 - 62.50.11.31 gb -62.50.11.32 - 62.50.11.63 nl -62.50.11.64 - 62.50.11.79 gb -62.50.11.80 - 62.50.11.95 nl -62.50.11.96 - 62.50.11.191 gb -62.50.11.192 - 62.50.11.223 nl -62.50.11.224 - 62.50.12.255 gb -62.50.13.0 - 62.50.13.15 nl -62.50.13.16 - 62.50.13.63 gb -62.50.13.64 - 62.50.13.79 nl -62.50.13.80 - 62.50.13.95 gb -62.50.13.96 - 62.50.13.143 nl -62.50.13.144 - 62.50.13.159 gb -62.50.13.160 - 62.50.13.175 nl -62.50.13.176 - 62.50.13.239 gb -62.50.13.240 - 62.50.13.255 nl -62.50.14.0 - 62.50.14.39 gb -62.50.14.40 - 62.50.14.63 nl -62.50.14.64 - 62.50.14.95 gb -62.50.14.96 - 62.50.14.191 nl -62.50.14.192 - 62.50.14.207 gb -62.50.14.208 - 62.50.14.223 nl -62.50.14.224 - 62.50.15.31 gb -62.50.15.32 - 62.50.15.95 nl -62.50.15.96 - 62.50.15.127 gb -62.50.15.128 - 62.50.15.159 nl -62.50.15.160 - 62.50.16.127 gb -62.50.16.128 - 62.50.17.31 nl -62.50.17.32 - 62.50.17.111 gb -62.50.17.112 - 62.50.17.119 nl -62.50.17.120 - 62.50.17.127 gb -62.50.17.128 - 62.50.17.207 nl -62.50.17.208 - 62.50.17.223 gb -62.50.17.224 - 62.50.17.239 nl -62.50.17.240 - 62.50.17.247 gb -62.50.17.248 - 62.50.17.255 nl -62.50.18.0 - 62.50.18.31 gb -62.50.18.32 - 62.50.18.63 nl -62.50.18.64 - 62.50.18.95 gb -62.50.18.96 - 62.50.18.103 nl -62.50.18.104 - 62.50.18.111 gb -62.50.18.112 - 62.50.18.127 nl -62.50.18.128 - 62.50.18.135 gb -62.50.18.136 - 62.50.18.159 nl -62.50.18.160 - 62.50.18.167 gb -62.50.18.168 - 62.50.18.223 nl -62.50.18.224 - 62.50.18.255 gb -62.50.19.0 - 62.50.19.31 nl -62.50.19.32 - 62.50.19.95 gb -62.50.19.96 - 62.50.19.103 nl -62.50.19.104 - 62.50.19.127 gb -62.50.19.128 - 62.50.19.143 nl -62.50.19.144 - 62.50.19.151 gb -62.50.19.152 - 62.50.19.167 nl -62.50.19.168 - 62.50.19.175 gb -62.50.19.176 - 62.50.19.183 nl -62.50.19.184 - 62.50.19.191 gb -62.50.19.192 - 62.50.20.47 nl -62.50.20.48 - 62.50.20.63 gb -62.50.20.64 - 62.50.20.87 nl -62.50.20.88 - 62.50.20.127 gb -62.50.20.128 - 62.50.20.247 nl -62.50.20.248 - 62.50.20.255 gb -62.50.21.0 - 62.50.22.19 nl -62.50.22.20 - 62.50.22.23 gb -62.50.22.24 - 62.50.22.95 nl -62.50.22.96 - 62.50.22.115 gb -62.50.22.116 - 62.50.22.119 nl -62.50.22.120 - 62.50.23.47 gb +62.49.0.0 - 62.50.6.111 gb +62.50.6.112 - 62.50.6.119 nl +62.50.6.120 - 62.50.23.47 gb 62.50.23.48 - 62.50.23.143 nl -62.50.23.144 - 62.50.23.191 gb -62.50.23.192 - 62.50.23.223 nl -62.50.23.224 - 62.50.23.255 gb -62.50.24.0 - 62.50.25.255 nl -62.50.26.0 - 62.50.31.255 gb -62.50.32.0 - 62.50.32.11 de -62.50.32.12 - 62.50.32.15 gb -62.50.32.16 - 62.50.32.39 de -62.50.32.40 - 62.50.32.47 gb -62.50.32.48 - 62.50.32.59 de -62.50.32.60 - 62.50.32.83 gb -62.50.32.84 - 62.50.32.91 de -62.50.32.92 - 62.50.32.103 gb -62.50.32.104 - 62.50.32.111 de -62.50.32.112 - 62.50.32.119 gb -62.50.32.120 - 62.50.33.103 de -62.50.33.104 - 62.50.33.111 gb -62.50.33.112 - 62.50.33.255 de -62.50.34.0 - 62.50.34.255 gb -62.50.35.0 - 62.50.35.95 de -62.50.35.96 - 62.50.35.103 gb -62.50.35.104 - 62.50.36.3 de -62.50.36.4 - 62.50.36.7 gb -62.50.36.8 - 62.50.36.171 de -62.50.36.172 - 62.50.36.175 gb -62.50.36.176 - 62.50.38.63 de -62.50.38.64 - 62.50.38.95 gb -62.50.38.96 - 62.50.38.111 de -62.50.38.112 - 62.50.38.127 gb -62.50.38.128 - 62.50.40.23 de -62.50.40.24 - 62.50.40.31 gb -62.50.40.32 - 62.50.40.55 de -62.50.40.56 - 62.50.40.63 gb -62.50.40.64 - 62.50.40.67 de -62.50.40.68 - 62.50.40.71 gb -62.50.40.72 - 62.50.44.135 de -62.50.44.136 - 62.50.44.255 gb -62.50.45.0 - 62.50.45.175 de -62.50.45.176 - 62.50.45.207 gb -62.50.45.208 - 62.50.46.15 de -62.50.46.16 - 62.50.46.23 gb -62.50.46.24 - 62.50.47.95 de -62.50.47.96 - 62.50.47.127 gb -62.50.47.128 - 62.50.48.63 de -62.50.48.64 - 62.50.48.79 gb -62.50.48.80 - 62.50.48.95 de -62.50.48.96 - 62.50.48.127 gb -62.50.48.128 - 62.50.48.255 de -62.50.49.0 - 62.50.49.31 gb -62.50.49.32 - 62.50.49.79 de -62.50.49.80 - 62.50.49.255 gb -62.50.50.0 - 62.50.51.255 de -62.50.52.0 - 62.50.52.255 gb -62.50.53.0 - 62.50.54.163 de -62.50.54.164 - 62.50.54.255 gb -62.50.55.0 - 62.50.55.15 de -62.50.55.16 - 62.50.58.255 gb -62.50.59.0 - 62.50.59.255 de -62.50.60.0 - 62.50.61.255 gb -62.50.62.0 - 62.50.63.31 de -62.50.63.32 - 62.50.63.39 gb -62.50.63.40 - 62.50.63.43 de -62.50.63.44 - 62.50.63.255 gb -62.50.64.0 - 62.50.64.111 ch -62.50.64.112 - 62.50.64.119 gb -62.50.64.120 - 62.50.64.255 ch -62.50.65.0 - 62.50.68.255 gb -62.50.69.0 - 62.50.69.151 ch -62.50.69.152 - 62.50.69.159 gb -62.50.69.160 - 62.50.69.223 ch -62.50.69.224 - 62.50.71.255 gb -62.50.72.0 - 62.50.72.23 ch -62.50.72.24 - 62.50.72.43 gb -62.50.72.44 - 62.50.72.47 ch -62.50.72.48 - 62.50.72.63 gb -62.50.72.64 - 62.50.72.95 ch -62.50.72.96 - 62.50.72.111 gb -62.50.72.112 - 62.50.72.135 ch -62.50.72.136 - 62.50.72.159 gb -62.50.72.160 - 62.50.72.167 ch -62.50.72.168 - 62.50.72.183 gb -62.50.72.184 - 62.50.73.15 ch -62.50.73.16 - 62.50.73.31 gb -62.50.73.32 - 62.50.73.71 ch -62.50.73.72 - 62.50.73.79 gb -62.50.73.80 - 62.50.73.95 ch -62.50.73.96 - 62.50.73.115 gb -62.50.73.116 - 62.50.73.159 ch -62.50.73.160 - 62.50.73.167 gb -62.50.73.168 - 62.50.73.179 ch -62.50.73.180 - 62.50.73.183 gb -62.50.73.184 - 62.50.73.223 ch -62.50.73.224 - 62.50.73.231 gb -62.50.73.232 - 62.50.74.95 ch -62.50.74.96 - 62.50.74.99 gb -62.50.74.100 - 62.50.74.143 ch -62.50.74.144 - 62.50.74.159 gb -62.50.74.160 - 62.50.74.175 ch -62.50.74.176 - 62.50.74.183 gb -62.50.74.184 - 62.50.74.191 ch -62.50.74.192 - 62.50.74.199 gb -62.50.74.200 - 62.50.74.207 ch -62.50.74.208 - 62.50.74.223 gb -62.50.74.224 - 62.50.74.255 ch -62.50.75.0 - 62.50.76.7 gb -62.50.76.8 - 62.50.76.31 ch -62.50.76.32 - 62.50.76.39 gb -62.50.76.40 - 62.50.76.111 ch -62.50.76.112 - 62.50.76.127 gb -62.50.76.128 - 62.50.76.191 ch -62.50.76.192 - 62.50.76.223 gb -62.50.76.224 - 62.50.77.7 ch -62.50.77.8 - 62.50.77.255 gb -62.50.78.0 - 62.50.78.31 ch -62.50.78.32 - 62.50.78.39 gb -62.50.78.40 - 62.50.78.55 ch -62.50.78.56 - 62.50.78.63 gb -62.50.78.64 - 62.50.78.191 ch -62.50.78.192 - 62.50.78.223 gb -62.50.78.224 - 62.50.79.15 ch -62.50.79.16 - 62.50.79.47 gb -62.50.79.48 - 62.50.79.135 ch -62.50.79.136 - 62.50.79.143 gb -62.50.79.144 - 62.50.79.159 ch -62.50.79.160 - 62.50.79.167 gb -62.50.79.168 - 62.50.79.207 ch -62.50.79.208 - 62.50.79.215 gb -62.50.79.216 - 62.50.79.255 ch -62.50.80.0 - 62.50.80.7 gb -62.50.80.8 - 62.50.80.79 ch -62.50.80.80 - 62.50.80.95 gb -62.50.80.96 - 62.50.80.127 ch -62.50.80.128 - 62.50.80.255 gb -62.50.81.0 - 62.50.81.7 ch -62.50.81.8 - 62.50.81.15 gb -62.50.81.16 - 62.50.81.31 ch -62.50.81.32 - 62.50.81.63 gb -62.50.81.64 - 62.50.81.127 ch -62.50.81.128 - 62.50.82.7 gb -62.50.82.8 - 62.50.82.11 ch -62.50.82.12 - 62.50.82.255 gb -62.50.83.0 - 62.50.83.127 ch -62.50.83.128 - 62.50.83.255 gb -62.50.84.0 - 62.50.86.31 ch -62.50.86.32 - 62.50.86.255 gb -62.50.87.0 - 62.50.87.23 ch -62.50.87.24 - 62.50.87.255 gb -62.50.88.0 - 62.50.88.3 ch -62.50.88.4 - 62.50.88.255 gb -62.50.89.0 - 62.50.89.63 ch -62.50.89.64 - 62.50.89.79 gb -62.50.89.80 - 62.50.89.127 ch -62.50.89.128 - 62.50.89.255 gb -62.50.90.0 - 62.50.90.211 ch -62.50.90.212 - 62.50.90.215 gb -62.50.90.216 - 62.50.90.223 ch -62.50.90.224 - 62.50.90.255 gb -62.50.91.0 - 62.50.91.135 ch -62.50.91.136 - 62.50.91.143 gb -62.50.91.144 - 62.50.91.191 ch -62.50.91.192 - 62.50.91.255 gb -62.50.92.0 - 62.50.92.7 ch -62.50.92.8 - 62.50.95.255 gb +62.50.23.144 - 62.50.45.159 gb +62.50.45.160 - 62.50.45.175 de +62.50.45.176 - 62.50.46.143 gb +62.50.46.144 - 62.50.46.159 de +62.50.46.160 - 62.50.47.159 gb +62.50.47.160 - 62.50.47.175 de +62.50.47.176 - 62.50.47.207 gb +62.50.47.208 - 62.50.47.223 de +62.50.47.224 - 62.50.95.255 gb 62.50.96.0 - 62.50.127.255 de -62.50.128.0 - 62.50.128.95 fr -62.50.128.96 - 62.50.128.119 gb -62.50.128.120 - 62.50.128.255 fr -62.50.129.0 - 62.50.131.31 gb -62.50.131.32 - 62.50.131.39 fr -62.50.131.40 - 62.50.131.135 gb -62.50.131.136 - 62.50.131.143 fr -62.50.131.144 - 62.50.131.175 gb -62.50.131.176 - 62.50.131.183 fr -62.50.131.184 - 62.50.131.199 gb -62.50.131.200 - 62.50.131.207 fr -62.50.131.208 - 62.50.131.255 gb -62.50.132.0 - 62.50.132.31 fr -62.50.132.32 - 62.50.132.39 gb -62.50.132.40 - 62.50.132.47 fr -62.50.132.48 - 62.50.132.55 gb -62.50.132.56 - 62.50.132.87 fr -62.50.132.88 - 62.50.132.111 gb -62.50.132.112 - 62.50.132.127 fr -62.50.132.128 - 62.50.132.167 gb -62.50.132.168 - 62.50.132.199 fr -62.50.132.200 - 62.50.132.211 gb -62.50.132.212 - 62.50.132.223 fr -62.50.132.224 - 62.50.132.239 gb -62.50.132.240 - 62.50.132.255 fr -62.50.133.0 - 62.50.133.3 gb -62.50.133.4 - 62.50.133.7 fr -62.50.133.8 - 62.50.133.255 gb -62.50.134.0 - 62.50.134.39 fr -62.50.134.40 - 62.50.134.47 gb -62.50.134.48 - 62.50.134.143 fr -62.50.134.144 - 62.50.134.159 gb -62.50.134.160 - 62.50.134.175 fr -62.50.134.176 - 62.50.135.63 gb -62.50.135.64 - 62.50.135.159 fr -62.50.135.160 - 62.50.137.3 gb -62.50.137.4 - 62.50.137.255 fr -62.50.138.0 - 62.50.159.255 gb +62.50.128.0 - 62.50.159.255 gb 62.50.160.0 - 62.50.191.255 no 62.50.192.0 - 62.50.255.255 gb 62.51.0.0 - 62.51.255.255 nl -62.52.0.0 - 62.52.20.255 de -62.52.21.0 - 62.52.21.255 fr -62.52.22.0 - 62.52.42.239 de -62.52.42.240 - 62.52.42.255 gb -62.52.43.0 - 62.52.48.127 de -62.52.48.128 - 62.52.48.159 fr -62.52.48.160 - 62.52.54.191 de -62.52.54.192 - 62.52.54.255 at -62.52.55.0 - 62.52.55.119 de -62.52.55.120 - 62.52.55.127 ie -62.52.55.128 - 62.52.95.255 de -62.52.96.0 - 62.52.96.255 ie -62.52.97.0 - 62.52.102.127 de -62.52.102.128 - 62.52.102.191 gb -62.52.102.192 - 62.52.109.47 de -62.52.109.48 - 62.52.109.63 gb -62.52.109.64 - 62.52.149.255 de -62.52.150.0 - 62.52.150.255 fr -62.52.151.0 - 62.53.125.255 de -62.53.126.0 - 62.53.126.71 gb -62.53.126.72 - 62.53.126.127 de -62.53.126.128 - 62.53.127.255 gb -62.53.128.0 - 62.53.226.127 de -62.53.226.128 - 62.53.226.159 fr -62.53.226.160 - 62.53.229.231 de -62.53.229.232 - 62.53.229.255 ch -62.53.230.0 - 62.55.255.255 de +62.52.0.0 - 62.53.2.255 de +62.53.3.0 - 62.53.3.255 gb +62.53.4.0 - 62.55.255.255 de 62.56.0.0 - 62.56.127.255 gb -62.56.128.0 - 62.56.128.7 a2 -62.56.128.8 - 62.56.128.15 ng -62.56.128.16 - 62.56.128.31 a2 -62.56.128.32 - 62.56.128.63 ng -62.56.128.64 - 62.56.129.63 a2 -62.56.129.64 - 62.56.129.159 ng -62.56.129.160 - 62.56.134.63 a2 -62.56.134.64 - 62.56.134.127 ng -62.56.134.128 - 62.56.135.255 a2 -62.56.136.0 - 62.56.136.15 mz -62.56.136.16 - 62.56.136.31 a2 -62.56.136.32 - 62.56.136.63 mz -62.56.136.64 - 62.56.136.255 a2 -62.56.137.0 - 62.56.137.255 cd -62.56.138.0 - 62.56.138.255 mz -62.56.139.0 - 62.56.141.63 a2 -62.56.141.64 - 62.56.141.79 ng -62.56.141.80 - 62.56.145.31 a2 -62.56.145.32 - 62.56.145.63 ng -62.56.145.64 - 62.56.145.223 a2 -62.56.145.224 - 62.56.145.255 ng -62.56.146.0 - 62.56.146.63 a2 -62.56.146.64 - 62.56.146.95 ng -62.56.146.96 - 62.56.146.255 a2 -62.56.147.0 - 62.56.147.127 ng -62.56.147.128 - 62.56.150.175 a2 -62.56.150.176 - 62.56.150.191 ao -62.56.150.192 - 62.56.150.255 a2 -62.56.151.0 - 62.56.151.255 ng -62.56.152.0 - 62.56.155.255 a2 -62.56.156.0 - 62.56.157.255 ke -62.56.158.0 - 62.56.160.255 a2 -62.56.161.0 - 62.56.161.127 tz -62.56.161.128 - 62.56.163.255 a2 -62.56.164.0 - 62.56.164.255 cg -62.56.165.0 - 62.56.193.255 a2 -62.56.194.0 - 62.56.194.255 ng -62.56.195.0 - 62.56.205.255 a2 -62.56.206.0 - 62.56.206.255 tz -62.56.207.0 - 62.56.215.255 a2 -62.56.216.0 - 62.56.217.255 zm -62.56.218.0 - 62.56.223.255 a2 -62.56.224.0 - 62.56.224.127 ng -62.56.224.128 - 62.56.231.255 a2 -62.56.232.0 - 62.56.232.255 ng -62.56.233.0 - 62.56.251.255 a2 +62.56.128.0 - 62.56.155.255 a2 +62.56.156.0 - 62.56.157.255 ng +62.56.158.0 - 62.56.242.82 a2 +62.56.242.83 - 62.56.242.83 ss +62.56.242.84 - 62.56.251.255 a2 62.56.252.0 - 62.56.255.255 il 62.57.0.0 - 62.57.255.255 es -62.58.0.0 - 62.58.0.15 be -62.58.0.16 - 62.58.0.31 nl -62.58.0.32 - 62.58.0.39 be -62.58.0.40 - 62.58.0.47 nl -62.58.0.48 - 62.58.0.71 be -62.58.0.72 - 62.58.0.79 nl -62.58.0.80 - 62.58.0.95 be -62.58.0.96 - 62.58.0.127 nl -62.58.0.128 - 62.58.0.199 be -62.58.0.200 - 62.58.0.231 nl -62.58.0.232 - 62.58.0.239 be -62.58.0.240 - 62.58.0.247 nl -62.58.0.248 - 62.58.0.255 be -62.58.1.0 - 62.58.1.31 nl -62.58.1.32 - 62.58.1.39 be -62.58.1.40 - 62.58.1.63 nl -62.58.1.64 - 62.58.1.159 be -62.58.1.160 - 62.58.1.191 nl -62.58.1.192 - 62.58.2.127 be -62.58.2.128 - 62.58.3.255 nl -62.58.4.0 - 62.58.4.31 be -62.58.4.32 - 62.58.4.39 nl -62.58.4.40 - 62.58.4.63 be -62.58.4.64 - 62.58.4.79 nl -62.58.4.80 - 62.58.4.87 be -62.58.4.88 - 62.58.4.95 nl -62.58.4.96 - 62.58.4.135 be -62.58.4.136 - 62.58.4.151 nl -62.58.4.152 - 62.58.4.159 be -62.58.4.160 - 62.58.4.191 nl -62.58.4.192 - 62.58.4.247 be -62.58.4.248 - 62.58.6.127 nl -62.58.6.128 - 62.58.6.255 be -62.58.7.0 - 62.58.7.95 nl -62.58.7.96 - 62.58.8.7 be -62.58.8.8 - 62.58.8.15 nl -62.58.8.16 - 62.58.8.39 be -62.58.8.40 - 62.58.8.63 nl -62.58.8.64 - 62.58.8.87 be -62.58.8.88 - 62.58.8.95 nl -62.58.8.96 - 62.58.8.103 be -62.58.8.104 - 62.58.8.255 nl -62.58.9.0 - 62.58.10.15 be -62.58.10.16 - 62.58.10.23 nl -62.58.10.24 - 62.58.10.63 be -62.58.10.64 - 62.58.10.191 nl -62.58.10.192 - 62.58.13.255 be -62.58.14.0 - 62.58.14.255 nl -62.58.15.0 - 62.58.15.255 be -62.58.16.0 - 62.58.16.159 nl -62.58.16.160 - 62.58.19.255 be -62.58.20.0 - 62.58.20.255 nl -62.58.21.0 - 62.58.24.19 be -62.58.24.20 - 62.58.24.27 nl -62.58.24.28 - 62.58.24.31 be -62.58.24.32 - 62.58.24.43 nl -62.58.24.44 - 62.58.24.47 be -62.58.24.48 - 62.58.24.51 nl -62.58.24.52 - 62.58.24.55 be -62.58.24.56 - 62.58.24.75 nl -62.58.24.76 - 62.58.24.79 be -62.58.24.80 - 62.58.24.83 nl -62.58.24.84 - 62.58.24.87 be -62.58.24.88 - 62.58.24.99 nl -62.58.24.100 - 62.58.24.103 be -62.58.24.104 - 62.58.24.123 nl -62.58.24.124 - 62.58.24.131 be -62.58.24.132 - 62.58.24.135 nl -62.58.24.136 - 62.58.24.167 be -62.58.24.168 - 62.58.24.171 nl -62.58.24.172 - 62.58.24.187 be -62.58.24.188 - 62.58.24.191 nl -62.58.24.192 - 62.58.24.227 be -62.58.24.228 - 62.58.24.231 nl -62.58.24.232 - 62.58.24.239 be -62.58.24.240 - 62.58.24.243 nl -62.58.24.244 - 62.58.24.247 be -62.58.24.248 - 62.58.24.251 nl -62.58.24.252 - 62.58.24.255 be -62.58.25.0 - 62.58.25.7 nl -62.58.25.8 - 62.58.25.27 be -62.58.25.28 - 62.58.25.31 nl -62.58.25.32 - 62.58.25.51 be -62.58.25.52 - 62.58.25.55 nl -62.58.25.56 - 62.58.25.95 be -62.58.25.96 - 62.58.25.99 nl -62.58.25.100 - 62.58.25.115 be -62.58.25.116 - 62.58.25.123 nl -62.58.25.124 - 62.58.25.143 be -62.58.25.144 - 62.58.25.147 nl -62.58.25.148 - 62.58.25.163 be -62.58.25.164 - 62.58.25.171 nl -62.58.25.172 - 62.58.25.179 be -62.58.25.180 - 62.58.25.183 nl -62.58.25.184 - 62.58.25.223 be -62.58.25.224 - 62.58.25.231 nl -62.58.25.232 - 62.58.25.247 be -62.58.25.248 - 62.58.25.251 nl -62.58.25.252 - 62.58.25.255 be -62.58.26.0 - 62.58.26.3 nl -62.58.26.4 - 62.58.26.15 be -62.58.26.16 - 62.58.26.19 nl -62.58.26.20 - 62.58.26.47 be -62.58.26.48 - 62.58.26.51 nl -62.58.26.52 - 62.58.26.83 be -62.58.26.84 - 62.58.26.87 nl -62.58.26.88 - 62.58.26.143 be -62.58.26.144 - 62.58.26.147 nl -62.58.26.148 - 62.58.26.155 be -62.58.26.156 - 62.58.26.159 nl -62.58.26.160 - 62.58.26.167 be -62.58.26.168 - 62.58.26.175 nl -62.58.26.176 - 62.58.28.15 be -62.58.28.16 - 62.58.28.39 nl -62.58.28.40 - 62.58.28.47 be -62.58.28.48 - 62.58.28.55 nl -62.58.28.56 - 62.58.28.71 be -62.58.28.72 - 62.58.28.87 nl -62.58.28.88 - 62.58.28.119 be -62.58.28.120 - 62.58.28.135 nl -62.58.28.136 - 62.58.28.159 be -62.58.28.160 - 62.58.28.183 nl -62.58.28.184 - 62.58.28.215 be -62.58.28.216 - 62.58.28.239 nl -62.58.28.240 - 62.58.28.255 be -62.58.29.0 - 62.58.29.31 nl -62.58.29.32 - 62.58.29.39 be -62.58.29.40 - 62.58.29.47 nl -62.58.29.48 - 62.58.29.71 be -62.58.29.72 - 62.58.29.95 nl -62.58.29.96 - 62.58.29.111 be -62.58.29.112 - 62.58.29.119 nl -62.58.29.120 - 62.58.29.191 be -62.58.29.192 - 62.58.29.199 nl -62.58.29.200 - 62.58.29.207 be -62.58.29.208 - 62.58.29.215 nl -62.58.29.216 - 62.58.29.239 be -62.58.29.240 - 62.58.29.247 nl -62.58.29.248 - 62.58.29.255 be -62.58.30.0 - 62.58.32.7 nl -62.58.32.8 - 62.58.32.15 be -62.58.32.16 - 62.58.32.23 nl -62.58.32.24 - 62.58.32.31 be -62.58.32.32 - 62.58.32.39 nl -62.58.32.40 - 62.58.32.63 be -62.58.32.64 - 62.58.32.103 nl -62.58.32.104 - 62.58.32.119 be -62.58.32.120 - 62.58.32.127 nl -62.58.32.128 - 62.58.32.143 be -62.58.32.144 - 62.58.32.223 nl -62.58.32.224 - 62.58.32.255 be -62.58.33.0 - 62.58.34.191 nl -62.58.34.192 - 62.58.35.23 be -62.58.35.24 - 62.58.35.31 nl -62.58.35.32 - 62.58.35.79 be -62.58.35.80 - 62.58.35.111 nl -62.58.35.112 - 62.58.35.119 be -62.58.35.120 - 62.58.35.143 nl -62.58.35.144 - 62.58.35.175 be -62.58.35.176 - 62.58.35.191 nl -62.58.35.192 - 62.58.35.199 be -62.58.35.200 - 62.58.35.223 nl -62.58.35.224 - 62.58.35.247 be -62.58.35.248 - 62.58.36.127 nl -62.58.36.128 - 62.58.36.191 be -62.58.36.192 - 62.58.36.207 nl -62.58.36.208 - 62.58.36.223 be -62.58.36.224 - 62.58.36.231 nl -62.58.36.232 - 62.58.37.127 be -62.58.37.128 - 62.58.37.191 nl -62.58.37.192 - 62.58.37.199 be -62.58.37.200 - 62.58.37.207 nl -62.58.37.208 - 62.58.37.215 be -62.58.37.216 - 62.58.37.239 nl -62.58.37.240 - 62.58.37.243 be -62.58.37.244 - 62.58.37.246 nl -62.58.37.247 - 62.58.37.247 be -62.58.37.248 - 62.58.37.255 nl -62.58.38.0 - 62.58.38.255 be -62.58.39.0 - 62.58.39.255 nl -62.58.40.0 - 62.58.40.39 be -62.58.40.40 - 62.58.40.63 nl -62.58.40.64 - 62.58.40.79 be -62.58.40.80 - 62.58.40.135 nl -62.58.40.136 - 62.58.40.143 be -62.58.40.144 - 62.58.40.159 nl -62.58.40.160 - 62.58.40.167 be -62.58.40.168 - 62.58.40.191 nl -62.58.40.192 - 62.58.40.255 be -62.58.41.0 - 62.58.41.7 nl -62.58.41.8 - 62.58.41.63 be -62.58.41.64 - 62.58.41.79 nl -62.58.41.80 - 62.58.41.95 be -62.58.41.96 - 62.58.41.135 nl -62.58.41.136 - 62.58.41.143 be -62.58.41.144 - 62.58.41.167 nl -62.58.41.168 - 62.58.41.175 be -62.58.41.176 - 62.58.41.183 nl -62.58.41.184 - 62.58.41.231 be -62.58.41.232 - 62.58.41.239 nl -62.58.41.240 - 62.58.41.255 be -62.58.42.0 - 62.58.42.255 nl -62.58.43.0 - 62.58.44.7 be -62.58.44.8 - 62.58.44.15 nl -62.58.44.16 - 62.58.44.31 be -62.58.44.32 - 62.58.44.39 nl -62.58.44.40 - 62.58.44.47 be -62.58.44.48 - 62.58.44.79 nl -62.58.44.80 - 62.58.44.87 be -62.58.44.88 - 62.58.44.207 nl -62.58.44.208 - 62.58.45.31 be -62.58.45.32 - 62.58.45.63 nl -62.58.45.64 - 62.58.45.95 be -62.58.45.96 - 62.58.47.255 nl -62.58.48.0 - 62.58.48.63 be -62.58.48.64 - 62.58.48.127 nl -62.58.48.128 - 62.58.48.231 be -62.58.48.232 - 62.58.48.247 nl -62.58.48.248 - 62.58.49.247 be -62.58.49.248 - 62.58.51.127 nl -62.58.51.128 - 62.58.51.255 be -62.58.52.0 - 62.58.52.31 nl -62.58.52.32 - 62.58.52.47 be -62.58.52.48 - 62.58.52.55 nl -62.58.52.56 - 62.58.52.103 be -62.58.52.104 - 62.58.52.135 nl -62.58.52.136 - 62.58.52.143 be -62.58.52.144 - 62.58.52.191 nl -62.58.52.192 - 62.58.52.231 be -62.58.52.232 - 62.58.52.247 nl -62.58.52.248 - 62.58.53.15 be -62.58.53.16 - 62.58.53.39 nl -62.58.53.40 - 62.58.53.47 be -62.58.53.48 - 62.58.53.55 nl -62.58.53.56 - 62.58.53.87 be -62.58.53.88 - 62.58.53.95 nl -62.58.53.96 - 62.58.53.255 be -62.58.54.0 - 62.58.56.15 nl -62.58.56.16 - 62.58.56.39 be -62.58.56.40 - 62.58.56.43 nl -62.58.56.44 - 62.58.56.63 be -62.58.56.64 - 62.58.56.67 nl -62.58.56.68 - 62.58.56.75 be -62.58.56.76 - 62.58.56.83 nl -62.58.56.84 - 62.58.56.95 be -62.58.56.96 - 62.58.56.103 nl -62.58.56.104 - 62.58.56.115 be -62.58.56.116 - 62.58.56.131 nl -62.58.56.132 - 62.58.56.143 be -62.58.56.144 - 62.58.56.159 nl -62.58.56.160 - 62.58.56.167 be -62.58.56.168 - 62.58.56.171 nl -62.58.56.172 - 62.58.56.183 be -62.58.56.184 - 62.58.56.187 nl -62.58.56.188 - 62.58.56.203 be -62.58.56.204 - 62.58.56.207 nl -62.58.56.208 - 62.58.56.211 be -62.58.56.212 - 62.58.56.215 nl -62.58.56.216 - 62.58.56.255 be -62.58.57.0 - 62.58.57.7 nl -62.58.57.8 - 62.58.57.27 be -62.58.57.28 - 62.58.57.31 nl -62.58.57.32 - 62.58.57.43 be -62.58.57.44 - 62.58.57.47 nl -62.58.57.48 - 62.58.57.51 be -62.58.57.52 - 62.58.57.59 nl -62.58.57.60 - 62.58.57.75 be -62.58.57.76 - 62.58.57.79 nl -62.58.57.80 - 62.58.57.83 be -62.58.57.84 - 62.58.57.87 nl -62.58.57.88 - 62.58.57.95 be -62.58.57.96 - 62.58.57.99 nl -62.58.57.100 - 62.58.57.111 be -62.58.57.112 - 62.58.57.115 nl -62.58.57.116 - 62.58.57.139 be -62.58.57.140 - 62.58.57.143 nl -62.58.57.144 - 62.58.57.151 be -62.58.57.152 - 62.58.57.155 nl -62.58.57.156 - 62.58.57.163 be -62.58.57.164 - 62.58.57.179 nl -62.58.57.180 - 62.58.57.207 be -62.58.57.208 - 62.58.57.211 nl -62.58.57.212 - 62.58.57.219 be -62.58.57.220 - 62.58.57.223 nl -62.58.57.224 - 62.58.57.227 be -62.58.57.228 - 62.58.57.231 nl -62.58.57.232 - 62.58.57.239 be -62.58.57.240 - 62.58.57.243 nl -62.58.57.244 - 62.58.58.3 be -62.58.58.4 - 62.58.58.15 nl -62.58.58.16 - 62.58.58.31 be -62.58.58.32 - 62.58.58.34 nl -62.58.58.35 - 62.58.58.35 be -62.58.58.36 - 62.58.58.43 nl -62.58.58.44 - 62.58.58.51 be -62.58.58.52 - 62.58.58.55 nl -62.58.58.56 - 62.58.58.95 be -62.58.58.96 - 62.58.58.99 nl -62.58.58.100 - 62.58.58.131 be -62.58.58.132 - 62.58.58.135 nl -62.58.58.136 - 62.58.58.139 be -62.58.58.140 - 62.58.58.143 nl -62.58.58.144 - 62.58.58.155 be -62.58.58.156 - 62.58.58.159 nl -62.58.58.160 - 62.58.58.183 be -62.58.58.184 - 62.58.58.199 nl -62.58.58.200 - 62.58.58.211 be -62.58.58.212 - 62.58.58.215 nl -62.58.58.216 - 62.58.58.223 be -62.58.58.224 - 62.58.58.235 nl -62.58.58.236 - 62.58.58.251 be -62.58.58.252 - 62.58.59.7 nl -62.58.59.8 - 62.58.59.11 be -62.58.59.12 - 62.58.59.15 nl -62.58.59.16 - 62.58.59.35 be -62.58.59.36 - 62.58.59.47 nl -62.58.59.48 - 62.58.59.51 be -62.58.59.52 - 62.58.59.55 nl -62.58.59.56 - 62.58.59.63 be -62.58.59.64 - 62.58.59.67 nl -62.58.59.68 - 62.58.59.71 be -62.58.59.72 - 62.58.59.75 nl -62.58.59.76 - 62.58.59.79 be -62.58.59.80 - 62.58.59.83 nl -62.58.59.84 - 62.58.59.91 be -62.58.59.92 - 62.58.59.99 nl -62.58.59.100 - 62.58.59.103 be -62.58.59.104 - 62.58.59.107 nl -62.58.59.108 - 62.58.59.111 be -62.58.59.112 - 62.58.59.115 nl -62.58.59.116 - 62.58.59.139 be -62.58.59.140 - 62.58.59.143 nl -62.58.59.144 - 62.58.59.147 be -62.58.59.148 - 62.58.59.167 nl -62.58.59.168 - 62.58.59.171 be -62.58.59.172 - 62.58.59.191 nl -62.58.59.192 - 62.58.59.199 be -62.58.59.200 - 62.58.59.203 nl -62.58.59.204 - 62.58.59.223 be -62.58.59.224 - 62.58.59.227 nl -62.58.59.228 - 62.58.59.231 be -62.58.59.232 - 62.58.59.235 nl -62.58.59.236 - 62.58.59.239 be -62.58.59.240 - 62.58.59.247 nl -62.58.59.248 - 62.58.60.15 be -62.58.60.16 - 62.58.60.31 nl -62.58.60.32 - 62.58.60.39 be -62.58.60.40 - 62.58.60.55 nl -62.58.60.56 - 62.58.60.71 be -62.58.60.72 - 62.58.60.79 nl -62.58.60.80 - 62.58.60.87 be -62.58.60.88 - 62.58.60.119 nl -62.58.60.120 - 62.58.60.127 be -62.58.60.128 - 62.58.60.135 nl -62.58.60.136 - 62.58.60.143 be -62.58.60.144 - 62.58.60.151 nl -62.58.60.152 - 62.58.60.175 be -62.58.60.176 - 62.58.60.239 nl -62.58.60.240 - 62.58.60.255 be -62.58.61.0 - 62.58.61.207 nl -62.58.61.208 - 62.58.61.255 be -62.58.62.0 - 62.58.64.15 nl -62.58.64.16 - 62.58.64.39 be -62.58.64.40 - 62.58.64.47 nl -62.58.64.48 - 62.58.64.63 be -62.58.64.64 - 62.58.66.127 nl -62.58.66.128 - 62.58.67.7 be -62.58.67.8 - 62.58.67.15 nl -62.58.67.16 - 62.58.67.31 be -62.58.67.32 - 62.58.67.39 nl -62.58.67.40 - 62.58.67.47 be -62.58.67.48 - 62.58.67.55 nl -62.58.67.56 - 62.58.67.167 be -62.58.67.168 - 62.58.67.175 nl -62.58.67.176 - 62.58.67.191 be -62.58.67.192 - 62.58.67.215 nl -62.58.67.216 - 62.58.67.255 be -62.58.68.0 - 62.58.68.255 nl -62.58.69.0 - 62.58.71.255 be -62.58.72.0 - 62.58.72.15 nl -62.58.72.16 - 62.58.72.23 be -62.58.72.24 - 62.58.72.31 nl -62.58.72.32 - 62.58.72.95 be -62.58.72.96 - 62.58.72.111 nl -62.58.72.112 - 62.58.72.119 be -62.58.72.120 - 62.58.72.127 nl -62.58.72.128 - 62.58.72.135 be -62.58.72.136 - 62.58.72.143 nl -62.58.72.144 - 62.58.72.151 be -62.58.72.152 - 62.58.72.175 nl -62.58.72.176 - 62.58.72.207 be -62.58.72.208 - 62.58.72.223 nl -62.58.72.224 - 62.58.72.255 be -62.58.73.0 - 62.58.76.31 nl -62.58.76.32 - 62.58.76.47 be -62.58.76.48 - 62.58.76.55 nl -62.58.76.56 - 62.58.76.71 be -62.58.76.72 - 62.58.76.87 nl -62.58.76.88 - 62.58.76.95 be -62.58.76.96 - 62.58.76.103 nl -62.58.76.104 - 62.58.76.111 be -62.58.76.112 - 62.58.76.127 nl -62.58.76.128 - 62.58.76.159 be -62.58.76.160 - 62.58.76.191 nl -62.58.76.192 - 62.58.76.247 be -62.58.76.248 - 62.58.77.31 nl -62.58.77.32 - 62.58.77.47 be -62.58.77.48 - 62.58.77.63 nl -62.58.77.64 - 62.58.77.87 be -62.58.77.88 - 62.58.77.95 nl -62.58.77.96 - 62.58.77.127 be -62.58.77.128 - 62.58.79.31 nl -62.58.79.32 - 62.58.80.95 be -62.58.80.96 - 62.58.80.127 nl -62.58.80.128 - 62.58.80.223 be -62.58.80.224 - 62.58.80.239 nl -62.58.80.240 - 62.58.80.255 be -62.58.81.0 - 62.58.81.255 nl -62.58.82.0 - 62.58.82.15 be -62.58.82.16 - 62.58.82.31 nl -62.58.82.32 - 62.58.82.63 be -62.58.82.64 - 62.58.82.111 nl -62.58.82.112 - 62.58.82.127 be -62.58.82.128 - 62.58.83.255 nl -62.58.84.0 - 62.58.87.255 be -62.58.88.0 - 62.58.88.11 nl -62.58.88.12 - 62.58.88.15 be -62.58.88.16 - 62.58.88.31 nl -62.58.88.32 - 62.58.88.35 be -62.58.88.36 - 62.58.88.47 nl -62.58.88.48 - 62.58.88.51 be -62.58.88.52 - 62.58.88.215 nl -62.58.88.216 - 62.58.88.219 be -62.58.88.220 - 62.58.89.103 nl -62.58.89.104 - 62.58.89.107 be -62.58.89.108 - 62.58.89.163 nl -62.58.89.164 - 62.58.89.167 be -62.58.89.168 - 62.58.90.115 nl -62.58.90.116 - 62.58.90.119 be -62.58.90.120 - 62.58.90.183 nl -62.58.90.184 - 62.58.90.187 be -62.58.90.188 - 62.58.90.211 nl -62.58.90.212 - 62.58.90.215 be -62.58.90.216 - 62.58.90.243 nl -62.58.90.244 - 62.58.90.247 be -62.58.90.248 - 62.58.90.251 nl -62.58.90.252 - 62.58.90.255 be -62.58.91.0 - 62.58.91.15 nl -62.58.91.16 - 62.58.91.19 be -62.58.91.20 - 62.58.91.195 nl -62.58.91.196 - 62.58.91.255 be -62.58.92.0 - 62.58.92.7 nl -62.58.92.8 - 62.58.92.31 be -62.58.92.32 - 62.58.92.55 nl -62.58.92.56 - 62.58.92.63 be -62.58.92.64 - 62.58.92.71 nl -62.58.92.72 - 62.58.92.79 be -62.58.92.80 - 62.58.92.87 nl -62.58.92.88 - 62.58.92.103 be -62.58.92.104 - 62.58.92.111 nl -62.58.92.112 - 62.58.92.119 be -62.58.92.120 - 62.58.92.127 nl -62.58.92.128 - 62.58.92.135 be -62.58.92.136 - 62.58.92.159 nl -62.58.92.160 - 62.58.92.191 be -62.58.92.192 - 62.58.92.207 nl -62.58.92.208 - 62.58.92.223 be -62.58.92.224 - 62.58.96.3 nl -62.58.96.4 - 62.58.96.55 be -62.58.96.56 - 62.58.96.63 nl -62.58.96.64 - 62.58.96.79 be -62.58.96.80 - 62.58.96.87 nl -62.58.96.88 - 62.58.96.191 be -62.58.96.192 - 62.58.96.207 nl -62.58.96.208 - 62.58.96.215 be -62.58.96.216 - 62.58.96.223 nl -62.58.96.224 - 62.58.97.63 be -62.58.97.64 - 62.58.97.127 nl -62.58.97.128 - 62.58.98.7 be -62.58.98.8 - 62.58.98.15 nl -62.58.98.16 - 62.58.98.47 be -62.58.98.48 - 62.58.98.55 nl -62.58.98.56 - 62.58.100.31 be -62.58.100.32 - 62.58.100.39 nl -62.58.100.40 - 62.58.112.15 be -62.58.112.16 - 62.58.112.35 nl -62.58.112.36 - 62.58.112.39 be -62.58.112.40 - 62.58.112.47 nl -62.58.112.48 - 62.58.112.63 be -62.58.112.64 - 62.58.112.95 nl -62.58.112.96 - 62.58.112.207 be -62.58.112.208 - 62.58.112.231 nl -62.58.112.232 - 62.58.112.247 be -62.58.112.248 - 62.58.112.255 nl -62.58.113.0 - 62.58.113.255 be -62.58.114.0 - 62.58.115.63 nl -62.58.115.64 - 62.58.115.119 be -62.58.115.120 - 62.58.115.127 nl -62.58.115.128 - 62.58.120.79 be -62.58.120.80 - 62.58.120.83 nl -62.58.120.84 - 62.58.120.91 be -62.58.120.92 - 62.58.120.95 nl -62.58.120.96 - 62.58.120.115 be -62.58.120.116 - 62.58.120.123 nl -62.58.120.124 - 62.58.120.147 be -62.58.120.148 - 62.58.120.151 nl -62.58.120.152 - 62.58.120.183 be -62.58.120.184 - 62.58.120.199 nl -62.58.120.200 - 62.58.120.203 be -62.58.120.204 - 62.58.120.207 nl -62.58.120.208 - 62.58.120.215 be -62.58.120.216 - 62.58.120.239 nl -62.58.120.240 - 62.58.120.243 be -62.58.120.244 - 62.58.121.15 nl -62.58.121.16 - 62.58.121.35 be -62.58.121.36 - 62.58.121.39 nl -62.58.121.40 - 62.58.121.47 be -62.58.121.48 - 62.58.121.51 nl -62.58.121.52 - 62.58.121.239 be -62.58.121.240 - 62.58.121.243 nl -62.58.121.244 - 62.58.122.107 be -62.58.122.108 - 62.58.122.111 nl -62.58.122.112 - 62.58.123.27 be -62.58.123.28 - 62.58.123.31 nl -62.58.123.32 - 62.58.123.179 be -62.58.123.180 - 62.58.123.183 nl -62.58.123.184 - 62.58.123.247 be -62.58.123.248 - 62.58.123.251 nl -62.58.123.252 - 62.58.124.31 be -62.58.124.32 - 62.58.124.39 nl -62.58.124.40 - 62.58.124.79 be -62.58.124.80 - 62.58.124.95 nl -62.58.124.96 - 62.58.125.31 be -62.58.125.32 - 62.58.125.71 nl -62.58.125.72 - 62.58.125.87 be -62.58.125.88 - 62.58.125.111 nl -62.58.125.112 - 62.58.125.127 be -62.58.125.128 - 62.58.125.191 nl -62.58.125.192 - 62.58.125.255 be -62.58.126.0 - 62.58.129.255 nl -62.58.130.0 - 62.58.130.127 be -62.58.130.128 - 62.58.132.47 nl -62.58.132.48 - 62.58.132.63 be -62.58.132.64 - 62.58.132.79 nl -62.58.132.80 - 62.58.132.143 be -62.58.132.144 - 62.58.135.255 nl -62.58.136.0 - 62.58.136.47 be -62.58.136.48 - 62.58.136.63 nl -62.58.136.64 - 62.58.136.111 be -62.58.136.112 - 62.58.136.143 nl -62.58.136.144 - 62.58.139.255 be -62.58.140.0 - 62.58.140.127 nl -62.58.140.128 - 62.58.140.255 be -62.58.141.0 - 62.58.142.3 nl -62.58.142.4 - 62.58.142.11 be -62.58.142.12 - 62.58.142.15 nl -62.58.142.16 - 62.58.142.19 be -62.58.142.20 - 62.58.142.23 nl -62.58.142.24 - 62.58.142.31 be -62.58.142.32 - 62.58.142.35 nl -62.58.142.36 - 62.58.142.43 be -62.58.142.44 - 62.58.142.51 nl -62.58.142.52 - 62.58.142.55 be -62.58.142.56 - 62.58.142.59 nl -62.58.142.60 - 62.58.142.127 be -62.58.142.128 - 62.58.144.7 nl -62.58.144.8 - 62.58.144.255 be -62.58.145.0 - 62.58.145.255 nl -62.58.146.0 - 62.58.146.7 be -62.58.146.8 - 62.58.146.71 nl -62.58.146.72 - 62.58.146.79 be -62.58.146.80 - 62.58.146.111 nl -62.58.146.112 - 62.58.146.127 be -62.58.146.128 - 62.58.146.143 nl -62.58.146.144 - 62.58.146.151 be -62.58.146.152 - 62.58.146.167 nl -62.58.146.168 - 62.58.146.175 be -62.58.146.176 - 62.58.146.191 nl -62.58.146.192 - 62.58.146.199 be -62.58.146.200 - 62.58.146.223 nl -62.58.146.224 - 62.58.146.231 be -62.58.146.232 - 62.58.146.255 nl -62.58.147.0 - 62.58.147.7 be -62.58.147.8 - 62.58.147.39 nl -62.58.147.40 - 62.58.147.47 be -62.58.147.48 - 62.58.147.55 nl -62.58.147.56 - 62.58.147.63 be -62.58.147.64 - 62.58.147.71 nl -62.58.147.72 - 62.58.147.87 be -62.58.147.88 - 62.58.147.95 nl -62.58.147.96 - 62.58.147.103 be -62.58.147.104 - 62.58.147.135 nl -62.58.147.136 - 62.58.147.143 be -62.58.147.144 - 62.58.147.151 nl -62.58.147.152 - 62.58.147.167 be -62.58.147.168 - 62.58.147.215 nl -62.58.147.216 - 62.58.147.223 be -62.58.147.224 - 62.58.148.15 nl -62.58.148.16 - 62.58.148.23 be -62.58.148.24 - 62.58.148.31 nl -62.58.148.32 - 62.58.148.39 be -62.58.148.40 - 62.58.148.47 nl -62.58.148.48 - 62.58.148.63 be -62.58.148.64 - 62.58.148.79 nl -62.58.148.80 - 62.58.148.87 be -62.58.148.88 - 62.58.148.111 nl -62.58.148.112 - 62.58.148.119 be -62.58.148.120 - 62.58.148.151 nl -62.58.148.152 - 62.58.148.159 be -62.58.148.160 - 62.58.149.7 nl -62.58.149.8 - 62.58.149.15 be -62.58.149.16 - 62.58.149.23 nl -62.58.149.24 - 62.58.149.31 be -62.58.149.32 - 62.58.149.39 nl -62.58.149.40 - 62.58.149.47 be -62.58.149.48 - 62.58.149.55 nl -62.58.149.56 - 62.58.149.63 be -62.58.149.64 - 62.58.149.71 nl -62.58.149.72 - 62.58.149.79 be -62.58.149.80 - 62.58.149.103 nl -62.58.149.104 - 62.58.149.143 be -62.58.149.144 - 62.58.149.167 nl -62.58.149.168 - 62.58.149.175 be -62.58.149.176 - 62.58.149.191 nl -62.58.149.192 - 62.58.149.215 be -62.58.149.216 - 62.58.149.231 nl -62.58.149.232 - 62.58.149.239 be -62.58.149.240 - 62.58.150.15 nl -62.58.150.16 - 62.58.151.127 be -62.58.151.128 - 62.58.152.15 nl -62.58.152.16 - 62.58.152.23 be -62.58.152.24 - 62.58.152.31 nl -62.58.152.32 - 62.58.152.39 be -62.58.152.40 - 62.58.152.55 nl -62.58.152.56 - 62.58.152.63 be -62.58.152.64 - 62.58.152.79 nl -62.58.152.80 - 62.58.152.95 be -62.58.152.96 - 62.58.152.127 nl -62.58.152.128 - 62.58.152.135 be -62.58.152.136 - 62.58.152.143 nl -62.58.152.144 - 62.58.152.183 be -62.58.152.184 - 62.58.152.191 nl -62.58.152.192 - 62.58.152.199 be -62.58.152.200 - 62.58.152.247 nl -62.58.152.248 - 62.58.152.255 be -62.58.153.0 - 62.58.153.7 nl -62.58.153.8 - 62.58.153.23 be -62.58.153.24 - 62.58.153.39 nl -62.58.153.40 - 62.58.153.63 be -62.58.153.64 - 62.58.153.79 nl -62.58.153.80 - 62.58.153.127 be -62.58.153.128 - 62.58.153.191 nl -62.58.153.192 - 62.58.153.255 be -62.58.154.0 - 62.58.154.255 nl -62.58.155.0 - 62.58.155.255 be -62.58.156.0 - 62.58.156.255 nl -62.58.157.0 - 62.58.157.127 be -62.58.157.128 - 62.58.157.255 nl -62.58.158.0 - 62.58.158.7 be -62.58.158.8 - 62.58.158.15 nl -62.58.158.16 - 62.58.158.27 be -62.58.158.28 - 62.58.158.31 nl -62.58.158.32 - 62.58.158.83 be -62.58.158.84 - 62.58.158.87 nl -62.58.158.88 - 62.58.158.91 be -62.58.158.92 - 62.58.158.95 nl -62.58.158.96 - 62.58.158.99 be -62.58.158.100 - 62.58.158.103 nl -62.58.158.104 - 62.58.158.111 be -62.58.158.112 - 62.58.158.115 nl -62.58.158.116 - 62.58.159.127 be -62.58.159.128 - 62.58.160.1 nl -62.58.160.2 - 62.58.160.2 be -62.58.160.3 - 62.58.160.5 nl -62.58.160.6 - 62.58.160.8 be -62.58.160.9 - 62.58.160.11 nl -62.58.160.12 - 62.58.160.12 be -62.58.160.13 - 62.58.160.13 nl -62.58.160.14 - 62.58.160.15 be -62.58.160.16 - 62.58.160.23 nl -62.58.160.24 - 62.58.160.26 be -62.58.160.27 - 62.58.160.27 nl -62.58.160.28 - 62.58.160.30 be -62.58.160.31 - 62.58.160.39 nl -62.58.160.40 - 62.58.160.43 be -62.58.160.44 - 62.58.160.45 nl -62.58.160.46 - 62.58.160.47 be -62.58.160.48 - 62.58.160.48 nl -62.58.160.49 - 62.58.160.49 be -62.58.160.50 - 62.58.160.52 nl -62.58.160.53 - 62.58.160.53 be -62.58.160.54 - 62.58.160.54 nl -62.58.160.55 - 62.58.160.57 be -62.58.160.58 - 62.58.160.58 nl -62.58.160.59 - 62.58.160.61 be -62.58.160.62 - 62.58.160.62 nl -62.58.160.63 - 62.58.160.65 be -62.58.160.66 - 62.58.160.69 nl -62.58.160.70 - 62.58.160.70 be -62.58.160.71 - 62.58.160.71 nl -62.58.160.72 - 62.58.160.95 be -62.58.160.96 - 62.58.160.96 nl -62.58.160.97 - 62.58.160.97 be -62.58.160.98 - 62.58.160.98 nl -62.58.160.99 - 62.58.160.105 be -62.58.160.106 - 62.58.160.106 nl -62.58.160.107 - 62.58.160.108 be -62.58.160.109 - 62.58.160.109 nl -62.58.160.110 - 62.58.160.112 be -62.58.160.113 - 62.58.160.113 nl -62.58.160.114 - 62.58.160.114 be -62.58.160.115 - 62.58.160.116 nl -62.58.160.117 - 62.58.160.117 be -62.58.160.118 - 62.58.160.118 nl -62.58.160.119 - 62.58.160.121 be -62.58.160.122 - 62.58.160.127 nl -62.58.160.128 - 62.58.160.128 be -62.58.160.129 - 62.58.160.129 nl -62.58.160.130 - 62.58.160.132 be -62.58.160.133 - 62.58.160.135 nl -62.58.160.136 - 62.58.160.140 be -62.58.160.141 - 62.58.160.141 nl -62.58.160.142 - 62.58.160.144 be -62.58.160.145 - 62.58.160.145 nl -62.58.160.146 - 62.58.160.146 be -62.58.160.147 - 62.58.160.147 nl -62.58.160.148 - 62.58.160.150 be -62.58.160.151 - 62.58.160.155 nl -62.58.160.156 - 62.58.160.156 be -62.58.160.157 - 62.58.160.158 nl -62.58.160.159 - 62.58.160.159 be -62.58.160.160 - 62.58.160.160 nl -62.58.160.161 - 62.58.160.161 be -62.58.160.162 - 62.58.160.163 nl -62.58.160.164 - 62.58.160.166 be -62.58.160.167 - 62.58.160.168 nl -62.58.160.169 - 62.58.160.169 be -62.58.160.170 - 62.58.160.170 nl -62.58.160.171 - 62.58.160.171 be -62.58.160.172 - 62.58.160.172 nl -62.58.160.173 - 62.58.160.176 be -62.58.160.177 - 62.58.160.178 nl -62.58.160.179 - 62.58.160.180 be -62.58.160.181 - 62.58.160.182 nl -62.58.160.183 - 62.58.160.185 be -62.58.160.186 - 62.58.160.188 nl -62.58.160.189 - 62.58.160.190 be -62.58.160.191 - 62.58.160.191 nl -62.58.160.192 - 62.58.160.194 be -62.58.160.195 - 62.58.160.195 nl -62.58.160.196 - 62.58.160.196 be -62.58.160.197 - 62.58.160.198 nl -62.58.160.199 - 62.58.160.200 be -62.58.160.201 - 62.58.160.201 nl -62.58.160.202 - 62.58.160.202 be -62.58.160.203 - 62.58.160.207 nl -62.58.160.208 - 62.58.160.208 be -62.58.160.209 - 62.58.160.211 nl -62.58.160.212 - 62.58.160.212 be -62.58.160.213 - 62.58.160.219 nl -62.58.160.220 - 62.58.160.220 be -62.58.160.221 - 62.58.160.223 nl -62.58.160.224 - 62.58.160.225 be -62.58.160.226 - 62.58.160.227 nl -62.58.160.228 - 62.58.160.228 be -62.58.160.229 - 62.58.160.229 nl -62.58.160.230 - 62.58.160.232 be -62.58.160.233 - 62.58.160.236 nl -62.58.160.237 - 62.58.160.238 be -62.58.160.239 - 62.58.160.240 nl -62.58.160.241 - 62.58.160.241 be -62.58.160.242 - 62.58.160.242 nl -62.58.160.243 - 62.58.160.244 be -62.58.160.245 - 62.58.160.246 nl -62.58.160.247 - 62.58.160.247 be -62.58.160.248 - 62.58.160.253 nl -62.58.160.254 - 62.58.160.254 be -62.58.160.255 - 62.58.160.255 nl -62.58.161.0 - 62.58.161.15 be -62.58.161.16 - 62.58.161.23 nl -62.58.161.24 - 62.58.161.31 be -62.58.161.32 - 62.58.161.47 nl -62.58.161.48 - 62.58.161.71 be -62.58.161.72 - 62.58.161.79 nl -62.58.161.80 - 62.58.161.87 be -62.58.161.88 - 62.58.161.127 nl -62.58.161.128 - 62.58.161.143 be -62.58.161.144 - 62.58.161.175 nl -62.58.161.176 - 62.58.161.183 be -62.58.161.184 - 62.58.161.191 nl -62.58.161.192 - 62.58.161.223 be -62.58.161.224 - 62.58.161.255 nl -62.58.162.0 - 62.58.162.7 be -62.58.162.8 - 62.58.162.15 nl -62.58.162.16 - 62.58.162.31 be -62.58.162.32 - 62.58.162.63 nl -62.58.162.64 - 62.58.162.79 be -62.58.162.80 - 62.58.162.95 nl -62.58.162.96 - 62.58.162.103 be -62.58.162.104 - 62.58.162.111 nl -62.58.162.112 - 62.58.162.119 be -62.58.162.120 - 62.58.162.159 nl -62.58.162.160 - 62.58.162.167 be -62.58.162.168 - 62.58.162.175 nl -62.58.162.176 - 62.58.162.183 be -62.58.162.184 - 62.58.162.239 nl -62.58.162.240 - 62.58.163.15 be -62.58.163.16 - 62.58.163.23 nl -62.58.163.24 - 62.58.163.31 be -62.58.163.32 - 62.58.163.39 nl -62.58.163.40 - 62.58.163.55 be -62.58.163.56 - 62.58.163.71 nl -62.58.163.72 - 62.58.163.87 be -62.58.163.88 - 62.58.163.95 nl -62.58.163.96 - 62.58.163.103 be -62.58.163.104 - 62.58.163.127 nl -62.58.163.128 - 62.58.163.135 be -62.58.163.136 - 62.58.163.143 nl -62.58.163.144 - 62.58.163.151 be -62.58.163.152 - 62.58.163.167 nl -62.58.163.168 - 62.58.163.183 be -62.58.163.184 - 62.58.163.191 nl -62.58.163.192 - 62.58.163.207 be -62.58.163.208 - 62.58.163.231 nl -62.58.163.232 - 62.58.163.239 be -62.58.163.240 - 62.58.163.255 nl -62.58.164.0 - 62.58.164.7 be -62.58.164.8 - 62.58.164.23 nl -62.58.164.24 - 62.58.164.31 be -62.58.164.32 - 62.58.164.63 nl -62.58.164.64 - 62.58.164.71 be -62.58.164.72 - 62.58.164.119 nl -62.58.164.120 - 62.58.164.127 be -62.58.164.128 - 62.58.164.143 nl -62.58.164.144 - 62.58.164.159 be -62.58.164.160 - 62.58.164.175 nl -62.58.164.176 - 62.58.164.191 be -62.58.164.192 - 62.58.164.207 nl -62.58.164.208 - 62.58.164.223 be -62.58.164.224 - 62.58.164.239 nl -62.58.164.240 - 62.58.165.15 be -62.58.165.16 - 62.58.165.39 nl -62.58.165.40 - 62.58.165.55 be -62.58.165.56 - 62.58.165.79 nl -62.58.165.80 - 62.58.165.87 be -62.58.165.88 - 62.58.165.95 nl -62.58.165.96 - 62.58.165.103 be -62.58.165.104 - 62.58.165.111 nl -62.58.165.112 - 62.58.165.127 be -62.58.165.128 - 62.58.165.159 nl -62.58.165.160 - 62.58.165.167 be -62.58.165.168 - 62.58.165.175 nl -62.58.165.176 - 62.58.165.183 be -62.58.165.184 - 62.58.165.191 nl -62.58.165.192 - 62.58.165.199 be -62.58.165.200 - 62.58.165.207 nl -62.58.165.208 - 62.58.165.215 be -62.58.165.216 - 62.58.165.239 nl -62.58.165.240 - 62.58.165.247 be -62.58.165.248 - 62.58.165.255 nl -62.58.166.0 - 62.58.166.15 be -62.58.166.16 - 62.58.166.23 nl -62.58.166.24 - 62.58.166.31 be -62.58.166.32 - 62.58.166.63 nl -62.58.166.64 - 62.58.166.127 be -62.58.166.128 - 62.58.166.143 nl -62.58.166.144 - 62.58.166.151 be -62.58.166.152 - 62.58.166.175 nl -62.58.166.176 - 62.58.166.191 be -62.58.166.192 - 62.58.167.39 nl -62.58.167.40 - 62.58.167.63 be -62.58.167.64 - 62.58.167.87 nl -62.58.167.88 - 62.58.167.103 be -62.58.167.104 - 62.58.167.111 nl -62.58.167.112 - 62.58.167.119 be -62.58.167.120 - 62.58.167.127 nl -62.58.167.128 - 62.58.167.128 be -62.58.167.129 - 62.58.167.131 nl -62.58.167.132 - 62.58.167.132 be -62.58.167.133 - 62.58.167.135 nl -62.58.167.136 - 62.58.167.143 be -62.58.167.144 - 62.58.167.167 nl -62.58.167.168 - 62.58.167.199 be -62.58.167.200 - 62.58.167.207 nl -62.58.167.208 - 62.58.167.223 be -62.58.167.224 - 62.58.167.247 nl -62.58.167.248 - 62.58.167.255 be -62.58.168.0 - 62.58.168.1 nl -62.58.168.2 - 62.58.168.2 be -62.58.168.3 - 62.58.168.6 nl -62.58.168.7 - 62.58.168.7 be -62.58.168.8 - 62.58.168.8 nl -62.58.168.9 - 62.58.168.9 be -62.58.168.10 - 62.58.168.19 nl -62.58.168.20 - 62.58.168.20 be -62.58.168.21 - 62.58.168.21 nl -62.58.168.22 - 62.58.168.22 be -62.58.168.23 - 62.58.168.31 nl -62.58.168.32 - 62.58.168.32 be -62.58.168.33 - 62.58.168.35 nl -62.58.168.36 - 62.58.168.36 be -62.58.168.37 - 62.58.168.43 nl -62.58.168.44 - 62.58.168.44 be -62.58.168.45 - 62.58.168.45 nl -62.58.168.46 - 62.58.168.48 be -62.58.168.49 - 62.58.168.62 nl -62.58.168.63 - 62.58.168.63 be -62.58.168.64 - 62.58.168.64 nl -62.58.168.65 - 62.58.168.65 be -62.58.168.66 - 62.58.168.68 nl -62.58.168.69 - 62.58.168.69 be -62.58.168.70 - 62.58.168.70 nl -62.58.168.71 - 62.58.168.71 be -62.58.168.72 - 62.58.168.74 nl -62.58.168.75 - 62.58.168.75 be -62.58.168.76 - 62.58.168.78 nl -62.58.168.79 - 62.58.168.79 be -62.58.168.80 - 62.58.168.80 nl -62.58.168.81 - 62.58.168.81 be -62.58.168.82 - 62.58.168.83 nl -62.58.168.84 - 62.58.168.84 be -62.58.168.85 - 62.58.168.85 nl -62.58.168.86 - 62.58.168.86 be -62.58.168.87 - 62.58.168.91 nl -62.58.168.92 - 62.58.168.93 be -62.58.168.94 - 62.58.168.94 nl -62.58.168.95 - 62.58.168.96 be -62.58.168.97 - 62.58.168.104 nl -62.58.168.105 - 62.58.168.105 be -62.58.168.106 - 62.58.168.109 nl -62.58.168.110 - 62.58.168.110 be -62.58.168.111 - 62.58.168.111 nl -62.58.168.112 - 62.58.168.112 be -62.58.168.113 - 62.58.168.139 nl -62.58.168.140 - 62.58.168.140 be -62.58.168.141 - 62.58.168.141 nl -62.58.168.142 - 62.58.168.142 be -62.58.168.143 - 62.58.168.147 nl -62.58.168.148 - 62.58.168.148 be -62.58.168.149 - 62.58.168.152 nl -62.58.168.153 - 62.58.168.153 be -62.58.168.154 - 62.58.168.155 nl -62.58.168.156 - 62.58.168.156 be -62.58.168.157 - 62.58.168.163 nl -62.58.168.164 - 62.58.168.164 be -62.58.168.165 - 62.58.168.166 nl -62.58.168.167 - 62.58.168.167 be -62.58.168.168 - 62.58.168.168 nl -62.58.168.169 - 62.58.168.170 be -62.58.168.171 - 62.58.168.178 nl -62.58.168.179 - 62.58.168.179 be -62.58.168.180 - 62.58.168.180 nl -62.58.168.181 - 62.58.168.182 be -62.58.168.183 - 62.58.168.185 nl -62.58.168.186 - 62.58.168.186 be -62.58.168.187 - 62.58.168.187 nl -62.58.168.188 - 62.58.168.189 be -62.58.168.190 - 62.58.168.195 nl -62.58.168.196 - 62.58.168.196 be -62.58.168.197 - 62.58.168.199 nl -62.58.168.200 - 62.58.168.200 be -62.58.168.201 - 62.58.168.202 nl -62.58.168.203 - 62.58.168.204 be -62.58.168.205 - 62.58.168.210 nl -62.58.168.211 - 62.58.168.211 be -62.58.168.212 - 62.58.168.214 nl -62.58.168.215 - 62.58.168.216 be -62.58.168.217 - 62.58.168.221 nl -62.58.168.222 - 62.58.168.222 be -62.58.168.223 - 62.58.168.223 nl -62.58.168.224 - 62.58.168.224 be -62.58.168.225 - 62.58.168.226 nl -62.58.168.227 - 62.58.168.227 be -62.58.168.228 - 62.58.168.229 nl -62.58.168.230 - 62.58.168.231 be -62.58.168.232 - 62.58.168.233 nl -62.58.168.234 - 62.58.168.235 be -62.58.168.236 - 62.58.168.238 nl -62.58.168.239 - 62.58.168.239 be -62.58.168.240 - 62.58.169.7 nl -62.58.169.8 - 62.58.169.15 be -62.58.169.16 - 62.58.169.55 nl -62.58.169.56 - 62.58.169.63 be -62.58.169.64 - 62.58.169.71 nl -62.58.169.72 - 62.58.169.127 be -62.58.169.128 - 62.58.169.135 nl -62.58.169.136 - 62.58.169.151 be -62.58.169.152 - 62.58.169.183 nl -62.58.169.184 - 62.58.169.199 be -62.58.169.200 - 62.58.169.207 nl -62.58.169.208 - 62.58.169.247 be -62.58.169.248 - 62.58.169.255 nl -62.58.170.0 - 62.58.170.31 be -62.58.170.32 - 62.58.170.47 nl -62.58.170.48 - 62.58.170.55 be -62.58.170.56 - 62.58.170.71 nl -62.58.170.72 - 62.58.170.79 be -62.58.170.80 - 62.58.170.103 nl -62.58.170.104 - 62.58.170.127 be -62.58.170.128 - 62.58.170.143 nl -62.58.170.144 - 62.58.170.167 be -62.58.170.168 - 62.58.170.175 nl -62.58.170.176 - 62.58.170.183 be -62.58.170.184 - 62.58.170.191 nl -62.58.170.192 - 62.58.170.199 be -62.58.170.200 - 62.58.170.223 nl -62.58.170.224 - 62.58.170.239 be -62.58.170.240 - 62.58.171.7 nl -62.58.171.8 - 62.58.171.31 be -62.58.171.32 - 62.58.171.47 nl -62.58.171.48 - 62.58.171.71 be -62.58.171.72 - 62.58.171.119 nl -62.58.171.120 - 62.58.171.151 be -62.58.171.152 - 62.58.171.215 nl -62.58.171.216 - 62.58.171.223 be -62.58.171.224 - 62.58.172.15 nl -62.58.172.16 - 62.58.172.47 be -62.58.172.48 - 62.58.172.71 nl -62.58.172.72 - 62.58.172.103 be -62.58.172.104 - 62.58.172.127 nl -62.58.172.128 - 62.58.172.135 be -62.58.172.136 - 62.58.172.183 nl -62.58.172.184 - 62.58.172.191 be -62.58.172.192 - 62.58.172.207 nl -62.58.172.208 - 62.58.172.215 be -62.58.172.216 - 62.58.172.223 nl -62.58.172.224 - 62.58.172.231 be -62.58.172.232 - 62.58.173.7 nl -62.58.173.8 - 62.58.173.15 be -62.58.173.16 - 62.58.173.23 nl -62.58.173.24 - 62.58.173.31 be -62.58.173.32 - 62.58.173.47 nl -62.58.173.48 - 62.58.173.63 be -62.58.173.64 - 62.58.173.87 nl -62.58.173.88 - 62.58.173.95 be -62.58.173.96 - 62.58.173.119 nl -62.58.173.120 - 62.58.173.135 be -62.58.173.136 - 62.58.173.159 nl -62.58.173.160 - 62.58.173.167 be -62.58.173.168 - 62.58.173.175 nl -62.58.173.176 - 62.58.173.191 be -62.58.173.192 - 62.58.173.199 nl -62.58.173.200 - 62.58.173.207 be -62.58.173.208 - 62.58.173.223 nl -62.58.173.224 - 62.58.173.231 be -62.58.173.232 - 62.58.174.7 nl -62.58.174.8 - 62.58.174.31 be -62.58.174.32 - 62.58.174.47 nl -62.58.174.48 - 62.58.174.55 be -62.58.174.56 - 62.58.174.63 nl -62.58.174.64 - 62.58.174.71 be -62.58.174.72 - 62.58.174.87 nl -62.58.174.88 - 62.58.174.95 be -62.58.174.96 - 62.58.174.111 nl -62.58.174.112 - 62.58.174.135 be -62.58.174.136 - 62.58.174.183 nl -62.58.174.184 - 62.58.174.191 be -62.58.174.192 - 62.58.174.199 nl -62.58.174.200 - 62.58.174.207 be -62.58.174.208 - 62.58.175.55 nl -62.58.175.56 - 62.58.175.63 be -62.58.175.64 - 62.58.175.71 nl -62.58.175.72 - 62.58.175.79 be -62.58.175.80 - 62.58.175.95 nl -62.58.175.96 - 62.58.175.127 be -62.58.175.128 - 62.58.175.151 nl -62.58.175.152 - 62.58.175.167 be -62.58.175.168 - 62.58.175.247 nl -62.58.175.248 - 62.58.175.255 be -62.58.176.0 - 62.58.176.7 nl -62.58.176.8 - 62.58.176.15 be -62.58.176.16 - 62.58.176.39 nl -62.58.176.40 - 62.58.176.47 be -62.58.176.48 - 62.58.176.87 nl -62.58.176.88 - 62.58.176.95 be -62.58.176.96 - 62.58.176.119 nl -62.58.176.120 - 62.58.176.127 be -62.58.176.128 - 62.58.176.135 nl -62.58.176.136 - 62.58.176.151 be -62.58.176.152 - 62.58.176.183 nl -62.58.176.184 - 62.58.176.191 be -62.58.176.192 - 62.58.177.55 nl -62.58.177.56 - 62.58.177.63 be -62.58.177.64 - 62.58.177.103 nl -62.58.177.104 - 62.58.177.111 be -62.58.177.112 - 62.58.177.135 nl -62.58.177.136 - 62.58.177.143 be -62.58.177.144 - 62.58.177.199 nl -62.58.177.200 - 62.58.177.207 be -62.58.177.208 - 62.58.177.223 nl -62.58.177.224 - 62.58.177.231 be -62.58.177.232 - 62.58.177.239 nl -62.58.177.240 - 62.58.177.247 be -62.58.177.248 - 62.58.178.7 nl -62.58.178.8 - 62.58.178.15 be -62.58.178.16 - 62.58.178.47 nl -62.58.178.48 - 62.58.178.71 be -62.58.178.72 - 62.58.178.79 nl -62.58.178.80 - 62.58.178.95 be -62.58.178.96 - 62.58.178.159 nl -62.58.178.160 - 62.58.178.167 be -62.58.178.168 - 62.58.178.183 nl -62.58.178.184 - 62.58.178.199 be -62.58.178.200 - 62.58.178.215 nl -62.58.178.216 - 62.58.178.223 be -62.58.178.224 - 62.58.178.231 nl -62.58.178.232 - 62.58.178.247 be -62.58.178.248 - 62.58.178.255 nl -62.58.179.0 - 62.58.179.7 be -62.58.179.8 - 62.58.179.23 nl -62.58.179.24 - 62.58.179.31 be -62.58.179.32 - 62.58.179.71 nl -62.58.179.72 - 62.58.179.79 be -62.58.179.80 - 62.58.179.183 nl -62.58.179.184 - 62.58.179.191 be -62.58.179.192 - 62.58.179.207 nl -62.58.179.208 - 62.58.179.215 be -62.58.179.216 - 62.58.180.55 nl -62.58.180.56 - 62.58.180.63 be -62.58.180.64 - 62.58.180.103 nl -62.58.180.104 - 62.58.180.111 be -62.58.180.112 - 62.58.180.175 nl -62.58.180.176 - 62.58.180.183 be -62.58.180.184 - 62.58.180.191 nl -62.58.180.192 - 62.58.180.199 be -62.58.180.200 - 62.58.180.223 nl -62.58.180.224 - 62.58.180.231 be -62.58.180.232 - 62.58.181.31 nl -62.58.181.32 - 62.58.181.39 be -62.58.181.40 - 62.58.181.103 nl -62.58.181.104 - 62.58.181.111 be -62.58.181.112 - 62.58.181.159 nl -62.58.181.160 - 62.58.181.167 be -62.58.181.168 - 62.58.181.183 nl -62.58.181.184 - 62.58.181.191 be -62.58.181.192 - 62.58.181.215 nl -62.58.181.216 - 62.58.181.223 be -62.58.181.224 - 62.58.181.231 nl -62.58.181.232 - 62.58.181.239 be -62.58.181.240 - 62.58.181.247 nl -62.58.181.248 - 62.58.181.255 be -62.58.182.0 - 62.58.182.15 nl -62.58.182.16 - 62.58.182.23 be -62.58.182.24 - 62.58.182.71 nl -62.58.182.72 - 62.58.182.79 be -62.58.182.80 - 62.58.182.119 nl -62.58.182.120 - 62.58.182.127 be -62.58.182.128 - 62.58.182.151 nl -62.58.182.152 - 62.58.182.159 be -62.58.182.160 - 62.58.182.183 nl -62.58.182.184 - 62.58.182.191 be -62.58.182.192 - 62.58.182.215 nl -62.58.182.216 - 62.58.182.239 be -62.58.182.240 - 62.58.182.255 nl -62.58.183.0 - 62.58.183.23 be -62.58.183.24 - 62.58.183.39 nl -62.58.183.40 - 62.58.183.47 be -62.58.183.48 - 62.58.183.79 nl -62.58.183.80 - 62.58.183.95 be -62.58.183.96 - 62.58.183.119 nl -62.58.183.120 - 62.58.183.143 be -62.58.183.144 - 62.58.183.151 nl -62.58.183.152 - 62.58.183.159 be -62.58.183.160 - 62.58.183.167 nl -62.58.183.168 - 62.58.183.175 be -62.58.183.176 - 62.58.183.183 nl -62.58.183.184 - 62.58.183.199 be -62.58.183.200 - 62.58.183.207 nl -62.58.183.208 - 62.58.183.215 be -62.58.183.216 - 62.58.183.231 nl -62.58.183.232 - 62.58.184.7 be -62.58.184.8 - 62.58.184.23 nl -62.58.184.24 - 62.58.184.39 be -62.58.184.40 - 62.58.184.71 nl -62.58.184.72 - 62.58.184.79 be -62.58.184.80 - 62.58.184.87 nl -62.58.184.88 - 62.58.184.95 be -62.58.184.96 - 62.58.184.127 nl -62.58.184.128 - 62.58.184.143 be -62.58.184.144 - 62.58.184.167 nl -62.58.184.168 - 62.58.184.175 be -62.58.184.176 - 62.58.184.207 nl -62.58.184.208 - 62.58.184.223 be -62.58.184.224 - 62.58.184.247 nl -62.58.184.248 - 62.58.184.255 be -62.58.185.0 - 62.58.185.7 nl -62.58.185.8 - 62.58.185.31 be -62.58.185.32 - 62.58.185.47 nl -62.58.185.48 - 62.58.185.55 be -62.58.185.56 - 62.58.185.63 nl -62.58.185.64 - 62.58.185.79 be -62.58.185.80 - 62.58.185.95 nl -62.58.185.96 - 62.58.185.127 be -62.58.185.128 - 62.58.185.135 nl -62.58.185.136 - 62.58.185.151 be -62.58.185.152 - 62.58.185.159 nl -62.58.185.160 - 62.58.185.167 be -62.58.185.168 - 62.58.185.199 nl -62.58.185.200 - 62.58.185.207 be -62.58.185.208 - 62.58.185.239 nl -62.58.185.240 - 62.58.185.247 be -62.58.185.248 - 62.58.185.255 nl -62.58.186.0 - 62.58.186.7 be -62.58.186.8 - 62.58.186.15 nl -62.58.186.16 - 62.58.186.23 be -62.58.186.24 - 62.58.186.31 nl -62.58.186.32 - 62.58.186.39 be -62.58.186.40 - 62.58.186.47 nl -62.58.186.48 - 62.58.186.63 be -62.58.186.64 - 62.58.186.71 nl -62.58.186.72 - 62.58.186.103 be -62.58.186.104 - 62.58.186.127 nl -62.58.186.128 - 62.58.186.143 be -62.58.186.144 - 62.58.186.159 nl -62.58.186.160 - 62.58.186.175 be -62.58.186.176 - 62.58.186.199 nl -62.58.186.200 - 62.58.186.215 be -62.58.186.216 - 62.58.186.231 nl -62.58.186.232 - 62.58.186.239 be -62.58.186.240 - 62.58.187.47 nl -62.58.187.48 - 62.58.187.55 be -62.58.187.56 - 62.58.187.63 nl -62.58.187.64 - 62.58.187.71 be -62.58.187.72 - 62.58.187.87 nl -62.58.187.88 - 62.58.187.95 be -62.58.187.96 - 62.58.187.119 nl -62.58.187.120 - 62.58.187.127 be -62.58.187.128 - 62.58.187.151 nl -62.58.187.152 - 62.58.187.159 be -62.58.187.160 - 62.58.187.175 nl -62.58.187.176 - 62.58.187.191 be -62.58.187.192 - 62.58.187.207 nl -62.58.187.208 - 62.58.187.215 be -62.58.187.216 - 62.58.187.223 nl -62.58.187.224 - 62.58.188.15 be -62.58.188.16 - 62.58.188.39 nl -62.58.188.40 - 62.58.188.47 be -62.58.188.48 - 62.58.188.63 nl -62.58.188.64 - 62.58.188.79 be -62.58.188.80 - 62.58.188.151 nl -62.58.188.152 - 62.58.188.159 be -62.58.188.160 - 62.58.188.167 nl -62.58.188.168 - 62.58.188.175 be -62.58.188.176 - 62.58.188.183 nl -62.58.188.184 - 62.58.188.191 be -62.58.188.192 - 62.58.188.199 nl -62.58.188.200 - 62.58.188.207 be -62.58.188.208 - 62.58.188.255 nl -62.58.189.0 - 62.58.189.0 be -62.58.189.1 - 62.58.189.1 nl -62.58.189.2 - 62.58.189.2 be -62.58.189.3 - 62.58.189.26 nl -62.58.189.27 - 62.58.189.27 be -62.58.189.28 - 62.58.189.35 nl -62.58.189.36 - 62.58.189.36 be -62.58.189.37 - 62.58.189.43 nl -62.58.189.44 - 62.58.189.44 be -62.58.189.45 - 62.58.189.45 nl -62.58.189.46 - 62.58.189.46 be -62.58.189.47 - 62.58.189.63 nl -62.58.189.64 - 62.58.189.64 be -62.58.189.65 - 62.58.189.78 nl -62.58.189.79 - 62.58.189.79 be -62.58.189.80 - 62.58.189.84 nl -62.58.189.85 - 62.58.189.87 be -62.58.189.88 - 62.58.189.93 nl -62.58.189.94 - 62.58.189.94 be -62.58.189.95 - 62.58.189.103 nl -62.58.189.104 - 62.58.189.104 be -62.58.189.105 - 62.58.189.106 nl -62.58.189.107 - 62.58.189.107 be -62.58.189.108 - 62.58.189.112 nl -62.58.189.113 - 62.58.189.113 be -62.58.189.114 - 62.58.189.120 nl -62.58.189.121 - 62.58.189.121 be -62.58.189.122 - 62.58.189.126 nl -62.58.189.127 - 62.58.189.127 be -62.58.189.128 - 62.58.189.143 nl -62.58.189.144 - 62.58.189.146 be -62.58.189.147 - 62.58.189.150 nl -62.58.189.151 - 62.58.189.151 be -62.58.189.152 - 62.58.189.157 nl -62.58.189.158 - 62.58.189.158 be -62.58.189.159 - 62.58.189.159 nl -62.58.189.160 - 62.58.189.161 be -62.58.189.162 - 62.58.189.162 nl -62.58.189.163 - 62.58.189.163 be -62.58.189.164 - 62.58.189.173 nl -62.58.189.174 - 62.58.189.174 be -62.58.189.175 - 62.58.189.178 nl -62.58.189.179 - 62.58.189.179 be -62.58.189.180 - 62.58.189.183 nl -62.58.189.184 - 62.58.189.184 be -62.58.189.185 - 62.58.189.185 nl -62.58.189.186 - 62.58.189.187 be -62.58.189.188 - 62.58.189.192 nl -62.58.189.193 - 62.58.189.193 be -62.58.189.194 - 62.58.189.197 nl -62.58.189.198 - 62.58.189.199 be -62.58.189.200 - 62.58.189.201 nl -62.58.189.202 - 62.58.189.202 be -62.58.189.203 - 62.58.189.206 nl -62.58.189.207 - 62.58.189.207 be -62.58.189.208 - 62.58.189.210 nl -62.58.189.211 - 62.58.189.211 be -62.58.189.212 - 62.58.189.227 nl -62.58.189.228 - 62.58.189.228 be -62.58.189.229 - 62.58.189.234 nl -62.58.189.235 - 62.58.189.236 be -62.58.189.237 - 62.58.189.237 nl -62.58.189.238 - 62.58.189.238 be -62.58.189.239 - 62.58.189.242 nl -62.58.189.243 - 62.58.189.243 be -62.58.189.244 - 62.58.189.245 nl -62.58.189.246 - 62.58.189.246 be -62.58.189.247 - 62.58.190.23 nl -62.58.190.24 - 62.58.190.31 be -62.58.190.32 - 62.58.190.39 nl -62.58.190.40 - 62.58.190.47 be -62.58.190.48 - 62.58.190.71 nl -62.58.190.72 - 62.58.190.103 be -62.58.190.104 - 62.58.190.151 nl -62.58.190.152 - 62.58.190.159 be -62.58.190.160 - 62.58.190.167 nl -62.58.190.168 - 62.58.190.175 be -62.58.190.176 - 62.58.190.199 nl -62.58.190.200 - 62.58.190.207 be -62.58.190.208 - 62.58.192.35 nl -62.58.192.36 - 62.58.192.39 be -62.58.192.40 - 62.58.192.71 nl -62.58.192.72 - 62.58.192.79 be -62.58.192.80 - 62.58.192.103 nl -62.58.192.104 - 62.58.192.111 be -62.58.192.112 - 62.58.192.127 nl -62.58.192.128 - 62.58.192.131 be -62.58.192.132 - 62.58.192.143 nl -62.58.192.144 - 62.58.192.151 be -62.58.192.152 - 62.58.192.159 nl -62.58.192.160 - 62.58.192.191 be -62.58.192.192 - 62.58.192.199 nl -62.58.192.200 - 62.58.192.207 be -62.58.192.208 - 62.58.192.223 nl -62.58.192.224 - 62.58.192.255 be -62.58.193.0 - 62.58.193.255 nl -62.58.194.0 - 62.58.195.127 be -62.58.195.128 - 62.58.195.135 nl -62.58.195.136 - 62.58.195.143 be -62.58.195.144 - 62.58.195.159 nl -62.58.195.160 - 62.58.195.167 be -62.58.195.168 - 62.58.195.191 nl -62.58.195.192 - 62.58.195.199 be -62.58.195.200 - 62.58.195.207 nl -62.58.195.208 - 62.58.195.223 be -62.58.195.224 - 62.58.195.239 nl -62.58.195.240 - 62.58.195.247 be -62.58.195.248 - 62.58.196.15 nl -62.58.196.16 - 62.58.196.23 be -62.58.196.24 - 62.58.196.31 nl -62.58.196.32 - 62.58.196.47 be -62.58.196.48 - 62.58.196.127 nl -62.58.196.128 - 62.58.196.255 be -62.58.197.0 - 62.58.197.7 nl -62.58.197.8 - 62.58.197.15 be -62.58.197.16 - 62.58.197.23 nl -62.58.197.24 - 62.58.197.31 be -62.58.197.32 - 62.58.198.127 nl -62.58.198.128 - 62.58.198.135 be -62.58.198.136 - 62.58.198.143 nl -62.58.198.144 - 62.58.198.191 be -62.58.198.192 - 62.58.200.7 nl -62.58.200.8 - 62.58.200.15 be -62.58.200.16 - 62.58.200.71 nl -62.58.200.72 - 62.58.200.79 be -62.58.200.80 - 62.58.200.95 nl -62.58.200.96 - 62.58.200.175 be -62.58.200.176 - 62.58.201.15 nl -62.58.201.16 - 62.58.201.23 be -62.58.201.24 - 62.58.201.63 nl -62.58.201.64 - 62.58.201.79 be -62.58.201.80 - 62.58.201.127 nl -62.58.201.128 - 62.58.201.175 be -62.58.201.176 - 62.58.201.207 nl -62.58.201.208 - 62.58.201.223 be -62.58.201.224 - 62.58.201.255 nl -62.58.202.0 - 62.58.202.31 be -62.58.202.32 - 62.58.202.39 nl -62.58.202.40 - 62.58.202.47 be -62.58.202.48 - 62.58.202.63 nl -62.58.202.64 - 62.58.203.255 be -62.58.204.0 - 62.58.207.255 nl -62.58.208.0 - 62.58.215.255 be -62.58.216.0 - 62.58.216.7 nl -62.58.216.8 - 62.58.216.11 be -62.58.216.12 - 62.58.216.15 nl -62.58.216.16 - 62.58.216.19 be -62.58.216.20 - 62.58.216.23 nl -62.58.216.24 - 62.58.216.27 be -62.58.216.28 - 62.58.216.31 nl -62.58.216.32 - 62.58.216.35 be -62.58.216.36 - 62.58.216.47 nl -62.58.216.48 - 62.58.216.51 be -62.58.216.52 - 62.58.216.59 nl -62.58.216.60 - 62.58.216.71 be -62.58.216.72 - 62.58.216.75 nl -62.58.216.76 - 62.58.216.103 be -62.58.216.104 - 62.58.216.107 nl -62.58.216.108 - 62.58.216.119 be -62.58.216.120 - 62.58.216.127 nl -62.58.216.128 - 62.58.216.131 be -62.58.216.132 - 62.58.216.143 nl -62.58.216.144 - 62.58.216.151 be -62.58.216.152 - 62.58.216.155 nl -62.58.216.156 - 62.58.216.159 be -62.58.216.160 - 62.58.216.167 nl -62.58.216.168 - 62.58.216.179 be -62.58.216.180 - 62.58.216.195 nl -62.58.216.196 - 62.58.216.199 be -62.58.216.200 - 62.58.216.211 nl -62.58.216.212 - 62.58.216.223 be -62.58.216.224 - 62.58.216.227 nl -62.58.216.228 - 62.58.216.231 be -62.58.216.232 - 62.58.216.235 nl -62.58.216.236 - 62.58.216.239 be -62.58.216.240 - 62.58.216.243 nl -62.58.216.244 - 62.58.216.251 be -62.58.216.252 - 62.58.217.3 nl -62.58.217.4 - 62.58.217.11 be -62.58.217.12 - 62.58.217.19 nl -62.58.217.20 - 62.58.217.23 be -62.58.217.24 - 62.58.217.27 nl -62.58.217.28 - 62.58.217.39 be -62.58.217.40 - 62.58.217.51 nl -62.58.217.52 - 62.58.217.67 be -62.58.217.68 - 62.58.217.87 nl -62.58.217.88 - 62.58.217.99 be -62.58.217.100 - 62.58.217.103 nl -62.58.217.104 - 62.58.217.111 be -62.58.217.112 - 62.58.217.131 nl -62.58.217.132 - 62.58.217.135 be -62.58.217.136 - 62.58.217.139 nl -62.58.217.140 - 62.58.217.155 be -62.58.217.156 - 62.58.217.183 nl -62.58.217.184 - 62.58.217.195 be -62.58.217.196 - 62.58.217.211 nl -62.58.217.212 - 62.58.217.215 be -62.58.217.216 - 62.58.217.219 nl -62.58.217.220 - 62.58.221.255 be -62.58.222.0 - 62.58.223.127 nl -62.58.223.128 - 62.58.224.87 be -62.58.224.88 - 62.58.224.95 nl -62.58.224.96 - 62.58.224.255 be -62.58.225.0 - 62.58.225.143 nl -62.58.225.144 - 62.58.225.151 be -62.58.225.152 - 62.58.225.159 nl -62.58.225.160 - 62.58.225.239 be -62.58.225.240 - 62.58.225.247 nl -62.58.225.248 - 62.58.248.19 be -62.58.248.20 - 62.58.248.23 nl -62.58.248.24 - 62.58.248.43 be -62.58.248.44 - 62.58.248.47 nl -62.58.248.48 - 62.58.248.63 be -62.58.248.64 - 62.58.248.71 nl -62.58.248.72 - 62.58.248.95 be -62.58.248.96 - 62.58.248.99 nl -62.58.248.100 - 62.58.248.139 be -62.58.248.140 - 62.58.248.143 nl -62.58.248.144 - 62.58.248.163 be -62.58.248.164 - 62.58.248.167 nl -62.58.248.168 - 62.58.248.255 be -62.58.249.0 - 62.58.249.3 nl -62.58.249.4 - 62.58.249.31 be -62.58.249.32 - 62.58.249.35 nl -62.58.249.36 - 62.58.249.123 be -62.58.249.124 - 62.58.249.135 nl -62.58.249.136 - 62.58.249.139 be -62.58.249.140 - 62.58.249.151 nl -62.58.249.152 - 62.58.249.255 be -62.58.250.0 - 62.58.250.3 nl -62.58.250.4 - 62.58.251.231 be -62.58.251.232 - 62.58.251.235 nl -62.58.251.236 - 62.58.251.247 be -62.58.251.248 - 62.58.251.251 nl -62.58.251.252 - 62.58.252.63 be -62.58.252.64 - 62.58.252.71 nl -62.58.252.72 - 62.58.253.7 be -62.58.253.8 - 62.58.253.15 nl -62.58.253.16 - 62.58.253.207 be -62.58.253.208 - 62.58.253.215 nl -62.58.253.216 - 62.58.253.255 be -62.58.254.0 - 62.59.20.127 nl -62.59.20.128 - 62.59.23.31 be -62.59.23.32 - 62.59.23.127 nl -62.59.23.128 - 62.59.23.159 be -62.59.23.160 - 62.59.27.255 nl -62.59.28.0 - 62.59.28.39 be -62.59.28.40 - 62.59.28.79 nl -62.59.28.80 - 62.59.28.87 be -62.59.28.88 - 62.59.28.159 nl -62.59.28.160 - 62.59.28.191 be -62.59.28.192 - 62.59.28.207 nl -62.59.28.208 - 62.59.28.215 be -62.59.28.216 - 62.59.28.247 nl -62.59.28.248 - 62.59.28.255 be -62.59.29.0 - 62.59.29.255 nl -62.59.30.0 - 62.59.30.7 be -62.59.30.8 - 62.59.30.63 nl -62.59.30.64 - 62.59.30.79 be -62.59.30.80 - 62.59.30.87 nl -62.59.30.88 - 62.59.30.103 be -62.59.30.104 - 62.59.30.135 nl -62.59.30.136 - 62.59.30.143 be -62.59.30.144 - 62.59.30.183 nl -62.59.30.184 - 62.59.30.199 be -62.59.30.200 - 62.59.30.223 nl -62.59.30.224 - 62.59.30.255 be -62.59.31.0 - 62.59.31.63 nl -62.59.31.64 - 62.59.31.95 be -62.59.31.96 - 62.59.31.127 nl -62.59.31.128 - 62.59.31.143 be -62.59.31.144 - 62.59.31.151 nl -62.59.31.152 - 62.59.31.183 be -62.59.31.184 - 62.59.31.223 nl -62.59.31.224 - 62.59.31.247 be -62.59.31.248 - 62.59.32.15 nl -62.59.32.16 - 62.59.32.31 be -62.59.32.32 - 62.59.32.167 nl -62.59.32.168 - 62.59.32.175 be -62.59.32.176 - 62.59.32.191 nl -62.59.32.192 - 62.59.32.207 be -62.59.32.208 - 62.59.32.247 nl -62.59.32.248 - 62.59.33.7 be -62.59.33.8 - 62.59.33.39 nl -62.59.33.40 - 62.59.33.63 be -62.59.33.64 - 62.59.33.71 nl -62.59.33.72 - 62.59.33.79 be -62.59.33.80 - 62.59.33.111 nl -62.59.33.112 - 62.59.33.119 be -62.59.33.120 - 62.59.33.127 nl -62.59.33.128 - 62.59.33.135 be -62.59.33.136 - 62.59.33.143 nl -62.59.33.144 - 62.59.33.159 be -62.59.33.160 - 62.59.33.183 nl -62.59.33.184 - 62.59.33.191 be -62.59.33.192 - 62.59.33.199 nl -62.59.33.200 - 62.59.33.207 be -62.59.33.208 - 62.59.35.255 nl -62.59.36.0 - 62.59.36.123 be -62.59.36.124 - 62.59.36.131 nl -62.59.36.132 - 62.59.51.255 be -62.59.52.0 - 62.59.55.255 nl -62.59.56.0 - 62.59.58.127 be -62.59.58.128 - 62.59.60.255 nl -62.59.61.0 - 62.59.63.255 be -62.59.64.0 - 62.59.88.63 nl -62.59.88.64 - 62.59.88.255 be -62.59.89.0 - 62.59.151.255 nl -62.59.152.0 - 62.59.152.255 be -62.59.153.0 - 62.59.159.255 nl -62.59.160.0 - 62.59.175.255 be -62.59.176.0 - 62.59.192.95 nl -62.59.192.96 - 62.59.192.255 be -62.59.193.0 - 62.59.195.63 nl -62.59.195.64 - 62.59.195.95 be -62.59.195.96 - 62.59.195.159 nl -62.59.195.160 - 62.59.195.223 be -62.59.195.224 - 62.59.196.95 nl -62.59.196.96 - 62.59.196.127 be -62.59.196.128 - 62.59.196.175 nl -62.59.196.176 - 62.59.196.191 be -62.59.196.192 - 62.59.197.95 nl -62.59.197.96 - 62.59.197.111 be -62.59.197.112 - 62.59.198.127 nl -62.59.198.128 - 62.59.199.63 be -62.59.199.64 - 62.59.199.95 nl -62.59.199.96 - 62.59.199.127 be -62.59.199.128 - 62.59.199.191 nl -62.59.199.192 - 62.59.206.19 be -62.59.206.20 - 62.59.206.23 nl -62.59.206.24 - 62.59.206.35 be -62.59.206.36 - 62.59.206.43 nl -62.59.206.44 - 62.59.206.55 be -62.59.206.56 - 62.59.206.63 nl -62.59.206.64 - 62.59.207.255 be -62.59.208.0 - 62.59.223.255 nl -62.59.224.0 - 62.59.239.255 be -62.59.240.0 - 62.59.247.255 nl -62.59.248.0 - 62.59.248.47 be -62.59.248.48 - 62.59.248.63 nl -62.59.248.64 - 62.59.251.255 be -62.59.252.0 - 62.59.252.255 nl -62.59.253.0 - 62.59.253.63 be -62.59.253.64 - 62.59.253.111 nl -62.59.253.112 - 62.59.253.119 be -62.59.253.120 - 62.59.255.255 nl +62.58.0.0 - 62.59.251.23 nl +62.59.251.24 - 62.59.251.31 be +62.59.251.32 - 62.59.251.151 nl +62.59.251.152 - 62.59.251.159 be +62.59.251.160 - 62.59.251.167 nl +62.59.251.168 - 62.59.251.175 be +62.59.251.176 - 62.59.255.255 nl 62.60.0.0 - 62.60.127.255 gb 62.60.128.0 - 62.60.255.255 ir 62.61.0.0 - 62.61.31.255 ru @@ -10435,47 +12739,12 @@ 62.61.64.0 - 62.61.127.255 fi 62.61.128.0 - 62.61.159.255 dk 62.61.160.0 - 62.61.191.255 om -62.61.192.0 - 62.61.255.255 dz -62.62.0.0 - 62.62.2.255 be -62.62.3.0 - 62.62.3.255 eu -62.62.4.0 - 62.62.6.255 be -62.62.7.0 - 62.62.8.255 eu -62.62.9.0 - 62.62.10.255 be -62.62.11.0 - 62.62.11.255 eu -62.62.12.0 - 62.62.14.255 be -62.62.15.0 - 62.62.16.255 eu -62.62.17.0 - 62.62.18.255 be -62.62.19.0 - 62.62.20.255 eu -62.62.21.0 - 62.62.22.255 be -62.62.23.0 - 62.62.23.255 eu -62.62.24.0 - 62.62.26.255 be -62.62.27.0 - 62.62.27.255 eu -62.62.28.0 - 62.62.30.255 be -62.62.31.0 - 62.62.32.255 eu -62.62.33.0 - 62.62.34.255 be -62.62.35.0 - 62.62.36.255 eu -62.62.37.0 - 62.62.42.255 be -62.62.43.0 - 62.62.44.255 eu -62.62.45.0 - 62.62.45.255 be -62.62.46.0 - 62.62.48.255 eu -62.62.49.0 - 62.62.49.255 be -62.62.50.0 - 62.62.52.255 eu -62.62.53.0 - 62.62.53.255 be -62.62.54.0 - 62.62.56.255 eu -62.62.57.0 - 62.62.57.255 be -62.62.58.0 - 62.62.59.255 eu -62.62.60.0 - 62.62.62.255 be -62.62.63.0 - 62.62.65.255 eu -62.62.66.0 - 62.62.73.255 be -62.62.74.0 - 62.62.75.255 eu -62.62.76.0 - 62.62.81.255 be -62.62.82.0 - 62.62.83.255 eu -62.62.84.0 - 62.62.84.255 be -62.62.85.0 - 62.62.86.255 eu -62.62.87.0 - 62.62.87.255 be -62.62.88.0 - 62.62.127.255 eu +62.61.192.0 - 62.61.255.255 re +62.62.0.0 - 62.62.127.255 eu 62.62.128.0 - 62.62.255.255 fr -62.63.0.0 - 62.63.63.255 no +62.63.0.0 - 62.63.10.255 no +62.63.11.0 - 62.63.11.255 gb +62.63.12.0 - 62.63.63.255 no 62.63.64.0 - 62.63.127.255 ru 62.63.128.0 - 62.63.191.255 lv 62.63.192.0 - 62.63.255.255 se @@ -10483,518 +12752,136 @@ 62.64.32.0 - 62.64.63.255 fr 62.64.64.0 - 62.64.127.255 ua 62.64.128.0 - 62.64.255.255 gb -62.65.0.0 - 62.65.16.255 se -62.65.17.0 - 62.65.17.255 no -62.65.18.0 - 62.65.23.63 se -62.65.23.64 - 62.65.23.143 no -62.65.23.144 - 62.65.27.255 se -62.65.28.0 - 62.65.28.15 no -62.65.28.16 - 62.65.28.23 se -62.65.28.24 - 62.65.28.27 no -62.65.28.28 - 62.65.28.63 se -62.65.28.64 - 62.65.28.95 no -62.65.28.96 - 62.65.28.111 se -62.65.28.112 - 62.65.28.159 no -62.65.28.160 - 62.65.28.183 se -62.65.28.184 - 62.65.28.255 no -62.65.29.0 - 62.65.29.255 se -62.65.30.0 - 62.65.31.255 no +62.65.0.0 - 62.65.23.113 se +62.65.23.114 - 62.65.23.114 no +62.65.23.115 - 62.65.31.0 se +62.65.31.1 - 62.65.31.1 no +62.65.31.2 - 62.65.31.255 se 62.65.32.0 - 62.65.63.255 ee 62.65.64.0 - 62.65.127.255 se 62.65.128.0 - 62.65.159.255 ch -62.65.160.0 - 62.65.186.63 sk -62.65.186.64 - 62.65.186.95 sr -62.65.186.96 - 62.65.191.255 sk +62.65.160.0 - 62.65.191.255 sk 62.65.192.0 - 62.65.255.255 ee 62.66.0.0 - 62.66.255.255 dk -62.67.0.0 - 62.67.8.255 de -62.67.9.0 - 62.67.9.127 gb -62.67.9.128 - 62.67.9.159 de -62.67.9.160 - 62.67.9.255 gb -62.67.10.0 - 62.67.10.255 de -62.67.11.0 - 62.67.31.255 gb -62.67.32.0 - 62.67.33.255 de -62.67.34.0 - 62.67.35.255 gb -62.67.36.0 - 62.67.36.255 de -62.67.37.0 - 62.67.37.255 gb -62.67.38.0 - 62.67.38.255 de -62.67.39.0 - 62.67.40.31 gb -62.67.40.32 - 62.67.40.63 de -62.67.40.64 - 62.67.40.255 gb -62.67.41.0 - 62.67.43.255 de -62.67.44.0 - 62.67.45.255 gb -62.67.46.0 - 62.67.46.255 de -62.67.47.0 - 62.67.47.255 gb -62.67.48.0 - 62.67.48.79 de -62.67.48.80 - 62.67.48.127 gb -62.67.48.128 - 62.67.48.191 de -62.67.48.192 - 62.67.48.255 gb -62.67.49.0 - 62.67.51.255 de -62.67.52.0 - 62.67.52.255 gb -62.67.53.0 - 62.67.53.255 de -62.67.54.0 - 62.67.54.15 gb -62.67.54.16 - 62.67.54.31 de -62.67.54.32 - 62.67.54.63 gb -62.67.54.64 - 62.67.54.127 de -62.67.54.128 - 62.67.55.255 gb -62.67.56.0 - 62.67.56.15 de -62.67.56.16 - 62.67.56.31 gb -62.67.56.32 - 62.67.56.63 de -62.67.56.64 - 62.67.56.191 gb -62.67.56.192 - 62.67.57.255 de -62.67.58.0 - 62.67.59.255 gb -62.67.60.0 - 62.67.62.255 de -62.67.63.0 - 62.67.183.255 gb -62.67.184.0 - 62.67.184.55 de -62.67.184.56 - 62.67.184.63 gb -62.67.184.64 - 62.67.184.127 de -62.67.184.128 - 62.67.184.255 gb -62.67.185.0 - 62.67.185.15 de -62.67.185.16 - 62.67.191.255 gb -62.67.192.0 - 62.67.194.255 de -62.67.195.0 - 62.67.199.255 gb -62.67.200.0 - 62.67.200.255 de -62.67.201.0 - 62.67.207.255 gb -62.67.208.0 - 62.67.209.95 de -62.67.209.96 - 62.67.209.143 gb -62.67.209.144 - 62.67.209.159 de -62.67.209.160 - 62.67.209.255 gb -62.67.210.0 - 62.67.213.255 de -62.67.214.0 - 62.67.214.255 gb -62.67.215.0 - 62.67.216.255 de -62.67.217.0 - 62.67.219.255 gb -62.67.220.0 - 62.67.220.255 de -62.67.221.0 - 62.67.223.255 gb -62.67.224.0 - 62.67.225.255 us -62.67.226.0 - 62.67.233.255 de -62.67.234.0 - 62.67.234.15 gb -62.67.234.16 - 62.67.234.31 de -62.67.234.32 - 62.67.234.255 gb +62.67.0.0 - 62.67.1.63 gb +62.67.1.64 - 62.67.1.79 de +62.67.1.80 - 62.67.41.255 gb +62.67.42.0 - 62.67.42.255 de +62.67.43.0 - 62.67.56.255 gb +62.67.57.0 - 62.67.57.255 de +62.67.58.0 - 62.67.184.223 gb +62.67.184.224 - 62.67.184.239 rs +62.67.184.240 - 62.67.227.255 gb +62.67.228.0 - 62.67.231.255 de +62.67.232.0 - 62.67.234.255 gb 62.67.235.0 - 62.67.235.255 de -62.67.236.0 - 62.67.236.255 gb -62.67.237.0 - 62.67.237.255 de -62.67.238.0 - 62.67.239.255 gb -62.67.240.0 - 62.67.249.255 de -62.67.250.0 - 62.67.251.255 gb -62.67.252.0 - 62.67.253.255 de -62.67.254.0 - 62.67.255.255 gb +62.67.236.0 - 62.67.243.255 gb +62.67.244.0 - 62.67.251.255 de +62.67.252.0 - 62.67.255.255 gb 62.68.0.0 - 62.68.31.255 de 62.68.32.0 - 62.68.63.255 ly -62.68.64.0 - 62.68.82.63 gr -62.68.82.64 - 62.68.82.127 ir -62.68.82.128 - 62.68.84.191 gr -62.68.84.192 - 62.68.84.207 iq -62.68.84.208 - 62.68.95.255 gr +62.68.64.0 - 62.68.95.255 gr 62.68.96.0 - 62.68.127.255 ba 62.68.128.0 - 62.68.159.255 ru 62.68.160.0 - 62.68.191.255 hu -62.68.192.0 - 62.68.203.127 at -62.68.203.128 - 62.68.203.254 de -62.68.203.255 - 62.68.207.255 at +62.68.192.0 - 62.68.207.255 at 62.68.208.0 - 62.68.208.255 de -62.68.209.0 - 62.68.210.255 at -62.68.211.0 - 62.68.211.254 de -62.68.211.255 - 62.68.211.255 at +62.68.209.0 - 62.68.211.255 at 62.68.212.0 - 62.68.212.255 de 62.68.213.0 - 62.68.213.255 at -62.68.214.0 - 62.68.215.254 de -62.68.215.255 - 62.68.223.255 at +62.68.214.0 - 62.68.215.255 de +62.68.216.0 - 62.68.223.255 at 62.68.224.0 - 62.68.255.255 eg 62.69.0.0 - 62.69.31.255 ru 62.69.32.0 - 62.69.127.255 gb -62.69.128.0 - 62.69.159.255 kw -62.69.160.0 - 62.69.160.15 us -62.69.160.16 - 62.69.160.19 hu -62.69.160.20 - 62.69.160.23 be -62.69.160.24 - 62.69.160.27 gb -62.69.160.28 - 62.69.160.31 fi -62.69.160.32 - 62.69.170.255 nl -62.69.171.0 - 62.69.171.31 de -62.69.171.32 - 62.69.171.63 hu -62.69.171.64 - 62.69.191.255 nl +62.69.128.0 - 62.69.135.255 it +62.69.136.0 - 62.69.143.255 gb +62.69.144.0 - 62.69.151.255 de +62.69.152.0 - 62.69.159.255 dk +62.69.160.0 - 62.69.191.255 nl 62.69.192.0 - 62.69.255.255 pl -62.70.0.0 - 62.70.99.127 no -62.70.99.128 - 62.70.99.255 it -62.70.100.0 - 62.70.255.255 no +62.70.0.0 - 62.70.27.255 no +62.70.28.0 - 62.70.28.255 eu +62.70.29.0 - 62.70.255.255 no 62.71.0.0 - 62.71.255.255 fi 62.72.0.0 - 62.72.7.255 gb 62.72.8.0 - 62.72.11.255 us -62.72.12.0 - 62.72.18.255 gb -62.72.19.0 - 62.72.19.255 de -62.72.20.0 - 62.72.31.31 gb -62.72.31.32 - 62.72.31.47 de -62.72.31.48 - 62.72.31.63 gb -62.72.31.64 - 62.72.31.95 de -62.72.31.96 - 62.72.31.127 gb -62.72.31.128 - 62.72.31.191 de -62.72.31.192 - 62.72.41.255 gb -62.72.42.0 - 62.72.43.255 de -62.72.44.0 - 62.72.44.31 gb -62.72.44.32 - 62.72.44.47 us -62.72.44.48 - 62.72.44.63 de -62.72.44.64 - 62.72.44.95 gb -62.72.44.96 - 62.72.44.111 de -62.72.44.112 - 62.72.44.255 gb -62.72.45.0 - 62.72.45.255 de -62.72.46.0 - 62.72.46.63 gb -62.72.46.64 - 62.72.47.255 de -62.72.48.0 - 62.72.48.15 gb -62.72.48.16 - 62.72.51.255 de -62.72.52.0 - 62.72.55.127 gb -62.72.55.128 - 62.72.55.255 de +62.72.12.0 - 62.72.41.255 gb +62.72.42.0 - 62.72.44.15 de +62.72.44.16 - 62.72.44.31 gb +62.72.44.32 - 62.72.55.255 de 62.72.56.0 - 62.72.59.255 gb 62.72.60.0 - 62.72.63.255 us 62.72.64.0 - 62.72.95.255 de -62.72.96.0 - 62.72.96.135 be -62.72.96.136 - 62.72.96.143 gb -62.72.96.144 - 62.72.96.215 be -62.72.96.216 - 62.72.96.223 gb -62.72.96.224 - 62.72.96.231 be -62.72.96.232 - 62.72.96.235 gb -62.72.96.236 - 62.72.96.239 be -62.72.96.240 - 62.72.96.247 gb -62.72.96.248 - 62.72.97.7 be -62.72.97.8 - 62.72.97.15 gb -62.72.97.16 - 62.72.97.31 be -62.72.97.32 - 62.72.97.63 fr -62.72.97.64 - 62.72.97.95 be -62.72.97.96 - 62.72.97.111 de -62.72.97.112 - 62.72.97.151 be -62.72.97.152 - 62.72.97.159 fr -62.72.97.160 - 62.72.97.163 gb -62.72.97.164 - 62.72.99.15 be -62.72.99.16 - 62.72.99.31 gb -62.72.99.32 - 62.72.99.47 be -62.72.99.48 - 62.72.99.63 gb -62.72.99.64 - 62.72.99.79 be -62.72.99.80 - 62.72.99.111 gb -62.72.99.112 - 62.72.99.159 be -62.72.99.160 - 62.72.99.167 gb -62.72.99.168 - 62.72.99.207 be -62.72.99.208 - 62.72.99.215 gb -62.72.99.216 - 62.72.99.223 be -62.72.99.224 - 62.72.99.239 gb -62.72.99.240 - 62.72.99.255 be -62.72.100.0 - 62.72.100.39 gb -62.72.100.40 - 62.72.100.47 be -62.72.100.48 - 62.72.100.55 gb -62.72.100.56 - 62.72.100.79 be -62.72.100.80 - 62.72.100.87 gb -62.72.100.88 - 62.72.100.175 be -62.72.100.176 - 62.72.100.191 gb -62.72.100.192 - 62.72.100.247 be -62.72.100.248 - 62.72.100.251 gb -62.72.100.252 - 62.72.101.15 be -62.72.101.16 - 62.72.101.31 gb -62.72.101.32 - 62.72.101.63 be -62.72.101.64 - 62.72.101.71 gb -62.72.101.72 - 62.72.101.75 be -62.72.101.76 - 62.72.101.79 gb -62.72.101.80 - 62.72.101.83 be -62.72.101.84 - 62.72.101.87 gb -62.72.101.88 - 62.72.101.95 be -62.72.101.96 - 62.72.101.111 gb -62.72.101.112 - 62.72.101.135 be -62.72.101.136 - 62.72.101.143 gb -62.72.101.144 - 62.72.101.207 be -62.72.101.208 - 62.72.101.247 gb -62.72.101.248 - 62.72.103.31 be -62.72.103.32 - 62.72.103.39 gb -62.72.103.40 - 62.72.103.47 be -62.72.103.48 - 62.72.103.55 gb -62.72.103.56 - 62.72.103.151 be -62.72.103.152 - 62.72.103.191 gb -62.72.103.192 - 62.72.103.255 be -62.72.104.0 - 62.72.104.63 lu -62.72.104.64 - 62.72.104.67 be -62.72.104.68 - 62.72.104.79 gb -62.72.104.80 - 62.72.104.95 be -62.72.104.96 - 62.72.104.99 gb -62.72.104.100 - 62.72.104.111 be -62.72.104.112 - 62.72.104.119 gb -62.72.104.120 - 62.72.104.127 be -62.72.104.128 - 62.72.104.191 gb -62.72.104.192 - 62.72.104.223 be -62.72.104.224 - 62.72.104.255 gb -62.72.105.0 - 62.72.105.71 be -62.72.105.72 - 62.72.105.83 gb -62.72.105.84 - 62.72.105.87 be -62.72.105.88 - 62.72.105.95 gb -62.72.105.96 - 62.72.105.143 be -62.72.105.144 - 62.72.105.151 gb -62.72.105.152 - 62.72.105.155 be -62.72.105.156 - 62.72.105.175 gb -62.72.105.176 - 62.72.105.191 be -62.72.105.192 - 62.72.105.207 gb -62.72.105.208 - 62.72.105.239 be -62.72.105.240 - 62.72.105.243 gb -62.72.105.244 - 62.72.106.95 be -62.72.106.96 - 62.72.106.107 gb -62.72.106.108 - 62.72.106.183 be -62.72.106.184 - 62.72.106.191 gb -62.72.106.192 - 62.72.106.239 be -62.72.106.240 - 62.72.106.255 gb -62.72.107.0 - 62.72.107.31 be -62.72.107.32 - 62.72.107.35 gb -62.72.107.36 - 62.72.107.39 be -62.72.107.40 - 62.72.107.63 gb -62.72.107.64 - 62.72.107.127 be -62.72.107.128 - 62.72.107.143 gb -62.72.107.144 - 62.72.107.175 be -62.72.107.176 - 62.72.107.179 gb -62.72.107.180 - 62.72.107.207 be -62.72.107.208 - 62.72.107.223 gb -62.72.107.224 - 62.72.107.239 be -62.72.107.240 - 62.72.107.247 gb -62.72.107.248 - 62.72.108.79 be -62.72.108.80 - 62.72.108.87 gb -62.72.108.88 - 62.72.108.95 be -62.72.108.96 - 62.72.108.103 gb -62.72.108.104 - 62.72.108.111 be -62.72.108.112 - 62.72.108.127 gb -62.72.108.128 - 62.72.108.191 be -62.72.108.192 - 62.72.108.199 gb -62.72.108.200 - 62.72.108.211 be -62.72.108.212 - 62.72.108.215 gb -62.72.108.216 - 62.72.108.231 be -62.72.108.232 - 62.72.108.239 gb -62.72.108.240 - 62.72.109.31 be -62.72.109.32 - 62.72.109.47 gb -62.72.109.48 - 62.72.109.223 be -62.72.109.224 - 62.72.109.231 gb -62.72.109.232 - 62.72.110.7 be -62.72.110.8 - 62.72.110.15 gb -62.72.110.16 - 62.72.110.47 be -62.72.110.48 - 62.72.110.55 gb -62.72.110.56 - 62.72.110.95 be -62.72.110.96 - 62.72.110.103 gb -62.72.110.104 - 62.72.110.143 be -62.72.110.144 - 62.72.110.151 gb -62.72.110.152 - 62.72.110.215 be -62.72.110.216 - 62.72.111.103 gb -62.72.111.104 - 62.72.111.175 be -62.72.111.176 - 62.72.111.183 gb -62.72.111.184 - 62.72.111.191 be -62.72.111.192 - 62.72.111.199 gb -62.72.111.200 - 62.72.111.207 be -62.72.111.208 - 62.72.111.215 gb -62.72.111.216 - 62.72.112.63 be -62.72.112.64 - 62.72.112.127 gb -62.72.112.128 - 62.72.112.159 be -62.72.112.160 - 62.72.112.163 gb -62.72.112.164 - 62.72.112.167 be -62.72.112.168 - 62.72.112.255 gb -62.72.113.0 - 62.72.113.115 be -62.72.113.116 - 62.72.113.119 gb -62.72.113.120 - 62.72.113.123 be -62.72.113.124 - 62.72.113.127 gb -62.72.113.128 - 62.72.114.15 be -62.72.114.16 - 62.72.114.31 gb -62.72.114.32 - 62.72.114.63 be -62.72.114.64 - 62.72.114.79 gb -62.72.114.80 - 62.72.114.95 be -62.72.114.96 - 62.72.114.127 gb -62.72.114.128 - 62.72.114.163 be -62.72.114.164 - 62.72.114.175 gb -62.72.114.176 - 62.72.114.187 be -62.72.114.188 - 62.72.114.223 gb -62.72.114.224 - 62.72.114.239 be -62.72.114.240 - 62.72.114.255 gb -62.72.115.0 - 62.72.115.7 be -62.72.115.8 - 62.72.115.15 lu -62.72.115.16 - 62.72.115.171 be -62.72.115.172 - 62.72.115.175 gb -62.72.115.176 - 62.72.115.199 be -62.72.115.200 - 62.72.115.207 gb -62.72.115.208 - 62.72.116.63 be -62.72.116.64 - 62.72.116.71 gb -62.72.116.72 - 62.72.116.159 be -62.72.116.160 - 62.72.116.167 gb -62.72.116.168 - 62.72.116.171 be -62.72.116.172 - 62.72.116.191 gb -62.72.116.192 - 62.72.116.199 be -62.72.116.200 - 62.72.116.207 gb -62.72.116.208 - 62.72.116.215 be -62.72.116.216 - 62.72.117.159 gb -62.72.117.160 - 62.72.117.167 be -62.72.117.168 - 62.72.117.175 gb -62.72.117.176 - 62.72.117.187 be -62.72.117.188 - 62.72.117.215 gb -62.72.117.216 - 62.72.118.15 be -62.72.118.16 - 62.72.118.23 gb -62.72.118.24 - 62.72.118.39 be -62.72.118.40 - 62.72.118.47 gb -62.72.118.48 - 62.72.118.79 be -62.72.118.80 - 62.72.118.95 gb -62.72.118.96 - 62.72.118.111 be -62.72.118.112 - 62.72.118.119 gb -62.72.118.120 - 62.72.118.143 be -62.72.118.144 - 62.72.118.159 gb -62.72.118.160 - 62.72.118.247 be -62.72.118.248 - 62.72.119.15 gb -62.72.119.16 - 62.72.119.47 be -62.72.119.48 - 62.72.119.55 gb -62.72.119.56 - 62.72.120.7 be -62.72.120.8 - 62.72.120.15 gb -62.72.120.16 - 62.72.120.143 be -62.72.120.144 - 62.72.120.159 gb -62.72.120.160 - 62.72.121.223 be -62.72.121.224 - 62.72.121.227 gb -62.72.121.228 - 62.72.122.71 be -62.72.122.72 - 62.72.122.95 gb -62.72.122.96 - 62.72.122.175 be -62.72.122.176 - 62.72.122.183 gb -62.72.122.184 - 62.72.123.15 be -62.72.123.16 - 62.72.123.31 gb -62.72.123.32 - 62.72.123.43 be -62.72.123.44 - 62.72.123.59 gb -62.72.123.60 - 62.72.123.63 be -62.72.123.64 - 62.72.123.79 gb -62.72.123.80 - 62.72.123.95 be -62.72.123.96 - 62.72.123.111 gb -62.72.123.112 - 62.72.123.119 be -62.72.123.120 - 62.72.123.127 gb -62.72.123.128 - 62.72.123.143 be -62.72.123.144 - 62.72.123.159 gb -62.72.123.160 - 62.72.123.207 be -62.72.123.208 - 62.72.123.223 gb -62.72.123.224 - 62.72.123.231 be -62.72.123.232 - 62.72.123.239 gb -62.72.123.240 - 62.72.124.19 be -62.72.124.20 - 62.72.124.39 gb -62.72.124.40 - 62.72.124.119 be -62.72.124.120 - 62.72.124.159 gb -62.72.124.160 - 62.72.124.175 be -62.72.124.176 - 62.72.124.187 gb -62.72.124.188 - 62.72.124.243 be -62.72.124.244 - 62.72.124.247 gb -62.72.124.248 - 62.72.125.63 be -62.72.125.64 - 62.72.125.95 gb -62.72.125.96 - 62.72.125.119 be -62.72.125.120 - 62.72.125.123 gb -62.72.125.124 - 62.72.125.127 be -62.72.125.128 - 62.72.125.159 gb -62.72.125.160 - 62.72.125.191 be -62.72.125.192 - 62.72.125.223 gb -62.72.125.224 - 62.72.125.251 be -62.72.125.252 - 62.72.126.31 gb -62.72.126.32 - 62.72.126.95 be -62.72.126.96 - 62.72.126.103 gb -62.72.126.104 - 62.72.126.127 be -62.72.126.128 - 62.72.126.159 gb -62.72.126.160 - 62.72.126.167 be -62.72.126.168 - 62.72.126.175 gb -62.72.126.176 - 62.72.126.183 be -62.72.126.184 - 62.72.126.191 gb -62.72.126.192 - 62.72.126.239 be -62.72.126.240 - 62.72.127.15 gb -62.72.127.16 - 62.72.127.23 be -62.72.127.24 - 62.72.127.27 gb -62.72.127.28 - 62.72.127.63 be -62.72.127.64 - 62.72.127.127 lu -62.72.127.128 - 62.72.127.135 be -62.72.127.136 - 62.72.127.143 gb -62.72.127.144 - 62.72.127.159 be -62.72.127.160 - 62.72.127.199 gb -62.72.127.200 - 62.72.127.207 be -62.72.127.208 - 62.72.127.223 gb -62.72.127.224 - 62.72.127.255 lu -62.72.128.0 - 62.72.159.255 gb +62.72.96.0 - 62.72.98.159 gb +62.72.98.160 - 62.72.98.167 be +62.72.98.168 - 62.72.107.123 gb +62.72.107.124 - 62.72.107.127 be +62.72.107.128 - 62.72.115.15 gb +62.72.115.16 - 62.72.115.31 be +62.72.115.32 - 62.72.115.239 gb +62.72.115.240 - 62.72.115.247 be +62.72.115.248 - 62.72.116.79 gb +62.72.116.80 - 62.72.116.95 be +62.72.116.96 - 62.72.117.179 gb +62.72.117.180 - 62.72.117.183 be +62.72.117.184 - 62.72.119.39 gb +62.72.119.40 - 62.72.119.47 be +62.72.119.48 - 62.72.120.31 gb +62.72.120.32 - 62.72.120.39 be +62.72.120.40 - 62.72.122.31 gb +62.72.122.32 - 62.72.122.39 be +62.72.122.40 - 62.72.127.7 gb +62.72.127.8 - 62.72.127.15 lu +62.72.127.16 - 62.72.159.255 gb 62.72.160.0 - 62.72.191.255 ua 62.72.192.0 - 62.72.223.255 nl 62.72.224.0 - 62.72.255.255 fi -62.73.0.0 - 62.73.31.255 fr +62.73.0.0 - 62.73.7.255 fr +62.73.8.0 - 62.73.9.255 a1 +62.73.10.0 - 62.73.31.255 fr 62.73.32.0 - 62.73.63.255 fi 62.73.64.0 - 62.73.127.255 bg -62.73.128.0 - 62.73.162.239 gb -62.73.162.240 - 62.73.162.255 ie -62.73.163.0 - 62.73.163.207 gb -62.73.163.208 - 62.73.163.223 ie -62.73.163.224 - 62.73.182.31 gb -62.73.182.32 - 62.73.182.39 ae -62.73.182.40 - 62.73.182.95 gb -62.73.182.96 - 62.73.182.119 fi -62.73.182.120 - 62.73.182.255 gb -62.73.183.0 - 62.73.183.191 es -62.73.183.192 - 62.73.183.255 gb +62.73.128.0 - 62.73.183.255 gb 62.73.184.0 - 62.73.184.127 es -62.73.184.128 - 62.73.189.255 gb -62.73.190.0 - 62.73.191.255 es +62.73.184.128 - 62.73.184.163 gb +62.73.184.164 - 62.73.184.175 es +62.73.184.176 - 62.73.191.255 gb 62.73.192.0 - 62.73.255.255 no -62.74.0.0 - 62.75.64.255 gr -62.75.65.0 - 62.75.66.255 al -62.75.67.0 - 62.75.127.255 gr -62.75.128.0 - 62.75.152.255 de -62.75.153.0 - 62.75.153.255 pl -62.75.154.0 - 62.75.202.255 de -62.75.203.0 - 62.75.203.31 nl -62.75.203.32 - 62.75.203.63 de -62.75.203.64 - 62.75.203.95 gb -62.75.203.96 - 62.75.203.127 ma -62.75.203.128 - 62.75.203.159 us -62.75.203.160 - 62.75.203.191 ru -62.75.203.192 - 62.75.203.223 se -62.75.203.224 - 62.75.203.255 br -62.75.204.0 - 62.75.204.255 de -62.75.205.0 - 62.75.205.255 ch -62.75.206.0 - 62.75.227.255 de -62.75.228.0 - 62.75.228.31 tr -62.75.228.32 - 62.75.228.63 ma -62.75.228.64 - 62.75.228.95 at -62.75.228.96 - 62.75.228.127 au -62.75.228.128 - 62.75.228.159 in -62.75.228.160 - 62.75.228.191 sc -62.75.228.192 - 62.75.255.255 de -62.76.0.0 - 62.76.255.255 ru +62.74.0.0 - 62.74.4.191 gr +62.74.4.192 - 62.74.4.255 au +62.74.5.0 - 62.75.63.255 gr +62.75.64.0 - 62.75.64.255 us +62.75.65.0 - 62.75.127.255 gr +62.75.128.0 - 62.75.195.91 de +62.75.195.92 - 62.75.195.94 sg +62.75.195.95 - 62.75.203.69 de +62.75.203.70 - 62.75.203.70 sg +62.75.203.71 - 62.75.217.162 de +62.75.217.163 - 62.75.217.163 sg +62.75.217.164 - 62.75.255.255 de +62.76.0.0 - 62.76.11.255 ru +62.76.12.0 - 62.76.12.255 ua +62.76.13.0 - 62.76.255.255 ru 62.77.0.0 - 62.77.31.255 gb 62.77.32.0 - 62.77.63.255 it 62.77.64.0 - 62.77.127.255 cz 62.77.128.0 - 62.77.159.255 hu 62.77.160.0 - 62.77.191.255 ie 62.77.192.0 - 62.77.255.255 hu -62.78.0.0 - 62.78.11.255 gb -62.78.12.0 - 62.78.15.255 eu -62.78.16.0 - 62.78.25.255 de -62.78.26.0 - 62.78.31.255 eu +62.78.0.0 - 62.78.31.255 us 62.78.32.0 - 62.78.63.255 ru 62.78.64.0 - 62.78.79.255 de 62.78.80.0 - 62.78.95.255 ru 62.78.96.0 - 62.78.255.255 fi 62.79.0.0 - 62.79.255.255 dk -62.80.0.0 - 62.80.25.239 de -62.80.25.240 - 62.80.25.247 gb -62.80.25.248 - 62.80.63.255 de -62.80.64.0 - 62.80.64.255 hu -62.80.65.0 - 62.80.65.255 sk -62.80.66.0 - 62.80.66.63 hu -62.80.66.64 - 62.80.66.127 sk -62.80.66.128 - 62.80.66.143 hu -62.80.66.144 - 62.80.67.95 sk -62.80.67.96 - 62.80.67.127 hu -62.80.67.128 - 62.80.70.63 sk -62.80.70.64 - 62.80.70.71 hu -62.80.70.72 - 62.80.71.255 sk -62.80.72.0 - 62.80.72.63 hu -62.80.72.64 - 62.80.79.255 sk -62.80.80.0 - 62.80.81.255 cz -62.80.82.0 - 62.80.83.255 sk -62.80.84.0 - 62.80.85.47 cz -62.80.85.48 - 62.80.85.127 sk -62.80.85.128 - 62.80.85.255 cz -62.80.86.0 - 62.80.87.255 sk -62.80.88.0 - 62.80.88.255 cz -62.80.89.0 - 62.80.95.255 sk +62.80.0.0 - 62.80.63.255 de +62.80.64.0 - 62.80.95.255 sk 62.80.96.0 - 62.80.119.255 de 62.80.120.0 - 62.80.121.255 fr 62.80.122.0 - 62.80.122.127 de 62.80.122.128 - 62.80.122.191 fr -62.80.122.192 - 62.80.122.199 de -62.80.122.200 - 62.80.122.207 gb -62.80.122.208 - 62.80.122.215 fr -62.80.122.216 - 62.80.122.223 it -62.80.122.224 - 62.80.122.231 es -62.80.122.232 - 62.80.122.239 nl -62.80.122.240 - 62.80.127.255 de +62.80.122.192 - 62.80.127.255 de 62.80.128.0 - 62.80.159.255 fi 62.80.160.0 - 62.80.191.255 ua 62.80.192.0 - 62.80.223.255 se @@ -11005,92 +12892,14 @@ 62.84.64.0 - 62.84.95.255 lb 62.84.96.0 - 62.84.127.255 ru 62.84.128.0 - 62.84.159.255 cz -62.84.160.0 - 62.84.191.255 gb -62.84.192.0 - 62.84.192.255 se -62.84.193.0 - 62.84.193.7 gb -62.84.193.8 - 62.84.193.15 be -62.84.193.16 - 62.84.193.63 se -62.84.193.64 - 62.84.193.215 gb -62.84.193.216 - 62.84.193.223 se -62.84.193.224 - 62.84.194.31 gb -62.84.194.32 - 62.84.194.35 se -62.84.194.36 - 62.84.194.95 gb -62.84.194.96 - 62.84.194.111 se -62.84.194.112 - 62.84.194.255 gb -62.84.195.0 - 62.84.195.15 se -62.84.195.16 - 62.84.195.31 gb -62.84.195.32 - 62.84.195.47 se -62.84.195.48 - 62.84.195.59 gb -62.84.195.60 - 62.84.195.135 se -62.84.195.136 - 62.84.195.143 gb -62.84.195.144 - 62.84.195.151 se -62.84.195.152 - 62.84.195.239 gb -62.84.195.240 - 62.84.196.31 se -62.84.196.32 - 62.84.196.159 gb -62.84.196.160 - 62.84.196.167 se -62.84.196.168 - 62.84.196.239 gb -62.84.196.240 - 62.84.196.247 se -62.84.196.248 - 62.84.196.255 gb -62.84.197.0 - 62.84.197.135 se -62.84.197.136 - 62.84.197.143 gb -62.84.197.144 - 62.84.197.159 se -62.84.197.160 - 62.84.197.167 fi -62.84.197.168 - 62.84.197.183 gb -62.84.197.184 - 62.84.197.191 se -62.84.197.192 - 62.84.197.215 gb -62.84.197.216 - 62.84.197.247 se -62.84.197.248 - 62.84.197.255 gb -62.84.198.0 - 62.84.198.127 se -62.84.198.128 - 62.84.198.147 gb -62.84.198.148 - 62.84.198.159 se -62.84.198.160 - 62.84.198.195 gb -62.84.198.196 - 62.84.200.7 se -62.84.200.8 - 62.84.200.255 gb -62.84.201.0 - 62.84.201.135 se -62.84.201.136 - 62.84.201.143 gb -62.84.201.144 - 62.84.201.159 se -62.84.201.160 - 62.84.201.255 gb -62.84.202.0 - 62.84.203.255 se -62.84.204.0 - 62.84.204.31 be -62.84.204.32 - 62.84.206.255 gb -62.84.207.0 - 62.84.207.199 se -62.84.207.200 - 62.84.207.207 fi -62.84.207.208 - 62.84.207.219 se -62.84.207.220 - 62.84.207.223 gb -62.84.207.224 - 62.84.207.239 se -62.84.207.240 - 62.84.207.255 fi -62.84.208.0 - 62.84.208.31 se -62.84.208.32 - 62.84.208.95 gb -62.84.208.96 - 62.84.208.104 se -62.84.208.105 - 62.84.208.127 gb -62.84.208.128 - 62.84.208.191 se -62.84.208.192 - 62.84.208.255 gb -62.84.209.0 - 62.84.209.31 se -62.84.209.32 - 62.84.209.255 gb -62.84.210.0 - 62.84.210.255 se -62.84.211.0 - 62.84.211.63 gb -62.84.211.64 - 62.84.211.95 se -62.84.211.96 - 62.84.211.239 gb -62.84.211.240 - 62.84.213.127 se -62.84.213.128 - 62.84.213.255 gb -62.84.214.0 - 62.84.214.255 se -62.84.215.0 - 62.84.216.47 gb -62.84.216.48 - 62.84.216.63 se -62.84.216.64 - 62.84.216.127 gb -62.84.216.128 - 62.84.216.159 se -62.84.216.160 - 62.84.216.207 gb -62.84.216.208 - 62.84.216.223 se -62.84.216.224 - 62.84.216.255 gb -62.84.217.0 - 62.84.217.255 se -62.84.218.0 - 62.84.218.95 gb +62.84.160.0 - 62.84.206.255 gb +62.84.207.0 - 62.84.207.255 se +62.84.208.0 - 62.84.218.95 gb 62.84.218.96 - 62.84.218.127 se -62.84.218.128 - 62.84.218.239 gb -62.84.218.240 - 62.84.218.247 se -62.84.218.248 - 62.84.218.255 gb -62.84.219.0 - 62.84.219.255 se -62.84.220.0 - 62.84.222.255 gb -62.84.223.0 - 62.84.223.255 se -62.84.224.0 - 62.84.255.255 gb +62.84.218.128 - 62.84.223.255 gb +62.84.224.0 - 62.84.239.255 si +62.84.240.0 - 62.84.247.255 nl +62.84.248.0 - 62.84.255.255 ua 62.85.0.0 - 62.85.127.255 lv 62.85.128.0 - 62.85.159.255 fr 62.85.160.0 - 62.86.255.255 it @@ -11104,457 +12913,142 @@ 62.89.128.0 - 62.89.159.255 gb 62.89.160.0 - 62.89.191.255 de 62.89.192.0 - 62.89.255.255 ru -62.90.0.0 - 62.90.251.255 il -62.90.252.0 - 62.90.252.255 lr -62.90.253.0 - 62.90.255.255 il +62.90.0.0 - 62.90.255.255 il 62.91.0.0 - 62.91.255.255 de 62.92.0.0 - 62.92.34.239 no 62.92.34.240 - 62.92.34.247 se -62.92.34.248 - 62.92.48.119 no -62.92.48.120 - 62.92.48.127 se -62.92.48.128 - 62.92.255.255 no -62.93.0.0 - 62.93.1.127 de -62.93.1.128 - 62.93.1.255 us -62.93.2.0 - 62.93.2.255 de -62.93.3.0 - 62.93.3.127 bz -62.93.3.128 - 62.93.3.255 de -62.93.4.0 - 62.93.4.63 lu -62.93.4.64 - 62.93.10.255 de -62.93.11.0 - 62.93.11.63 hr -62.93.11.64 - 62.93.11.127 mt -62.93.11.128 - 62.93.11.191 bz -62.93.11.192 - 62.93.11.255 ba -62.93.12.0 - 62.93.17.71 de -62.93.17.72 - 62.93.17.79 bz -62.93.17.80 - 62.93.18.87 de -62.93.18.88 - 62.93.18.95 es -62.93.18.96 - 62.93.23.255 de -62.93.24.0 - 62.93.25.23 cz -62.93.25.24 - 62.93.25.127 de -62.93.25.128 - 62.93.25.135 ag -62.93.25.136 - 62.93.25.255 de -62.93.26.0 - 62.93.31.255 ag +62.92.34.248 - 62.92.255.255 no +62.93.0.0 - 62.93.27.255 de +62.93.28.0 - 62.93.31.255 ag 62.93.32.0 - 62.93.63.255 pl -62.93.64.0 - 62.93.68.255 at -62.93.69.0 - 62.93.69.255 mk -62.93.70.0 - 62.93.72.127 at -62.93.72.128 - 62.93.72.255 mk -62.93.73.0 - 62.93.77.191 at -62.93.77.192 - 62.93.77.255 mk -62.93.78.0 - 62.93.80.191 at -62.93.80.192 - 62.93.80.255 mk -62.93.81.0 - 62.93.89.255 at -62.93.90.0 - 62.93.90.127 mk -62.93.90.128 - 62.93.90.255 at -62.93.91.0 - 62.93.91.127 mk -62.93.91.128 - 62.93.91.255 at -62.93.92.0 - 62.93.95.255 mk -62.93.96.0 - 62.93.104.63 at -62.93.104.64 - 62.93.106.127 mk -62.93.106.128 - 62.93.107.255 at -62.93.108.0 - 62.93.108.255 mk -62.93.109.0 - 62.93.109.255 at -62.93.110.0 - 62.93.115.255 mk -62.93.116.0 - 62.93.127.255 at -62.93.128.0 - 62.93.129.255 fr -62.93.130.0 - 62.93.131.255 it -62.93.132.0 - 62.93.133.255 fr -62.93.134.0 - 62.93.135.255 dk -62.93.136.0 - 62.93.137.255 es -62.93.138.0 - 62.93.140.255 nl -62.93.141.0 - 62.93.141.255 gb -62.93.142.0 - 62.93.159.255 nl -62.93.160.0 - 62.93.175.111 es -62.93.175.112 - 62.93.175.115 fr -62.93.175.116 - 62.93.191.255 es -62.93.192.0 - 62.93.192.127 de -62.93.192.128 - 62.93.192.255 eu -62.93.193.0 - 62.93.193.31 de -62.93.193.32 - 62.93.193.95 eu -62.93.193.96 - 62.93.193.127 de -62.93.193.128 - 62.93.193.191 eu -62.93.193.192 - 62.93.193.223 de -62.93.193.224 - 62.93.194.255 eu -62.93.195.0 - 62.93.195.255 fr -62.93.196.0 - 62.93.196.31 de -62.93.196.32 - 62.93.199.255 eu -62.93.200.0 - 62.93.200.255 de -62.93.201.0 - 62.93.204.255 eu -62.93.205.0 - 62.93.205.255 de -62.93.206.0 - 62.93.210.223 eu -62.93.210.224 - 62.93.210.255 de -62.93.211.0 - 62.93.211.255 eu -62.93.212.0 - 62.93.213.255 de -62.93.214.0 - 62.93.215.255 eu -62.93.216.0 - 62.93.217.255 de -62.93.218.0 - 62.93.224.255 eu -62.93.225.0 - 62.93.225.255 fr -62.93.226.0 - 62.93.238.255 eu -62.93.239.0 - 62.93.239.255 nl -62.93.240.0 - 62.93.244.255 eu -62.93.245.0 - 62.93.245.255 de -62.93.246.0 - 62.93.246.111 eu -62.93.246.112 - 62.93.247.255 de -62.93.248.0 - 62.93.249.127 eu -62.93.249.128 - 62.93.249.255 de -62.93.250.0 - 62.93.250.63 eu -62.93.250.64 - 62.93.250.127 de -62.93.250.128 - 62.93.251.15 eu -62.93.251.16 - 62.93.251.63 de -62.93.251.64 - 62.93.255.255 eu -62.94.0.0 - 62.94.8.15 it -62.94.8.16 - 62.94.8.23 fr -62.94.8.24 - 62.94.19.191 it -62.94.19.192 - 62.94.19.207 sm -62.94.19.208 - 62.94.74.87 it -62.94.74.88 - 62.94.74.95 pl -62.94.74.96 - 62.94.145.207 it -62.94.145.208 - 62.94.145.215 a2 -62.94.145.216 - 62.94.255.255 it +62.93.64.0 - 62.93.127.255 at +62.93.128.0 - 62.93.131.255 fr +62.93.132.0 - 62.93.143.255 gb +62.93.144.0 - 62.93.147.255 nl +62.93.148.0 - 62.93.151.255 gb +62.93.152.0 - 62.93.159.255 nl +62.93.160.0 - 62.93.191.255 es +62.93.192.0 - 62.93.255.255 eu +62.94.0.0 - 62.94.255.255 it 62.95.0.0 - 62.95.127.255 se -62.95.128.0 - 62.96.2.175 de -62.96.2.176 - 62.96.2.191 gb -62.96.2.192 - 62.96.2.223 de -62.96.2.224 - 62.96.2.255 gb -62.96.3.0 - 62.96.3.71 de -62.96.3.72 - 62.96.3.79 gb -62.96.3.80 - 62.96.4.175 de -62.96.4.176 - 62.96.4.183 gb -62.96.4.184 - 62.96.6.87 de -62.96.6.88 - 62.96.6.95 gb -62.96.6.96 - 62.96.7.79 de -62.96.7.80 - 62.96.7.95 gb -62.96.7.96 - 62.96.9.175 de -62.96.9.176 - 62.96.9.223 gb -62.96.9.224 - 62.96.10.127 de -62.96.10.128 - 62.96.11.255 gb -62.96.12.0 - 62.96.12.39 de -62.96.12.40 - 62.96.12.47 gb -62.96.12.48 - 62.96.15.63 de -62.96.15.64 - 62.96.15.255 gb -62.96.16.0 - 62.96.17.31 de -62.96.17.32 - 62.96.18.15 gb -62.96.18.16 - 62.96.18.127 de -62.96.18.128 - 62.96.19.255 gb -62.96.20.0 - 62.96.21.127 de -62.96.21.128 - 62.96.21.255 gb +62.95.128.0 - 62.96.0.31 de +62.96.0.32 - 62.96.3.223 gb +62.96.3.224 - 62.96.3.255 de +62.96.4.0 - 62.96.6.127 gb +62.96.6.128 - 62.96.6.159 de +62.96.6.160 - 62.96.11.255 gb +62.96.12.0 - 62.96.12.7 de +62.96.12.8 - 62.96.16.255 gb +62.96.17.0 - 62.96.17.31 de +62.96.17.32 - 62.96.21.255 gb 62.96.22.0 - 62.96.22.31 de -62.96.22.32 - 62.96.22.127 gb -62.96.22.128 - 62.96.22.143 de -62.96.22.144 - 62.96.23.255 gb -62.96.24.0 - 62.96.24.31 de -62.96.24.32 - 62.96.24.39 gb -62.96.24.40 - 62.96.24.135 de -62.96.24.136 - 62.96.24.143 gb -62.96.24.144 - 62.96.24.167 de -62.96.24.168 - 62.96.24.175 gb -62.96.24.176 - 62.96.25.31 de -62.96.25.32 - 62.96.25.39 gb -62.96.25.40 - 62.96.25.119 de -62.96.25.120 - 62.96.25.127 gb -62.96.25.128 - 62.96.25.247 de -62.96.25.248 - 62.96.25.255 gb -62.96.26.0 - 62.96.28.39 de -62.96.28.40 - 62.96.28.47 gb -62.96.28.48 - 62.96.28.135 de -62.96.28.136 - 62.96.28.159 gb -62.96.28.160 - 62.96.28.167 de -62.96.28.168 - 62.96.28.175 gb -62.96.28.176 - 62.96.29.103 de -62.96.29.104 - 62.96.29.111 gb -62.96.29.112 - 62.96.48.255 de -62.96.49.0 - 62.96.49.7 gb -62.96.49.8 - 62.96.49.31 de -62.96.49.32 - 62.96.49.39 gb -62.96.49.40 - 62.96.50.95 de -62.96.50.96 - 62.96.50.127 gb -62.96.50.128 - 62.96.50.191 de -62.96.50.192 - 62.96.51.255 gb -62.96.52.0 - 62.96.52.159 de -62.96.52.160 - 62.96.52.167 gb -62.96.52.168 - 62.96.52.255 de -62.96.53.0 - 62.96.53.31 gb -62.96.53.32 - 62.96.53.87 de -62.96.53.88 - 62.96.53.95 gb -62.96.53.96 - 62.96.53.127 de -62.96.53.128 - 62.96.53.135 gb -62.96.53.136 - 62.96.53.239 de -62.96.53.240 - 62.96.53.247 gb -62.96.53.248 - 62.96.54.239 de -62.96.54.240 - 62.96.55.39 gb -62.96.55.40 - 62.96.55.143 de -62.96.55.144 - 62.96.55.159 gb -62.96.55.160 - 62.96.55.167 de -62.96.55.168 - 62.96.55.175 gb -62.96.55.176 - 62.96.56.207 de -62.96.56.208 - 62.96.56.215 gb -62.96.56.216 - 62.96.56.223 de -62.96.56.224 - 62.96.57.31 gb -62.96.57.32 - 62.96.57.47 de -62.96.57.48 - 62.96.57.71 gb -62.96.57.72 - 62.96.57.79 de -62.96.57.80 - 62.96.57.95 gb -62.96.57.96 - 62.96.57.111 de -62.96.57.112 - 62.96.57.135 gb -62.96.57.136 - 62.96.57.143 de -62.96.57.144 - 62.96.57.151 gb -62.96.57.152 - 62.96.57.159 de -62.96.57.160 - 62.96.57.191 gb -62.96.57.192 - 62.96.57.199 de -62.96.57.200 - 62.96.57.255 gb -62.96.58.0 - 62.96.58.255 de -62.96.59.0 - 62.96.59.31 gb -62.96.59.32 - 62.96.59.79 de -62.96.59.80 - 62.96.59.87 gb -62.96.59.88 - 62.96.59.135 de -62.96.59.136 - 62.96.59.143 gb -62.96.59.144 - 62.96.60.95 de -62.96.60.96 - 62.96.60.103 gb -62.96.60.104 - 62.96.60.119 de -62.96.60.120 - 62.96.60.127 gb -62.96.60.128 - 62.96.61.143 de -62.96.61.144 - 62.96.61.151 gb -62.96.61.152 - 62.96.61.159 de -62.96.61.160 - 62.96.61.255 gb -62.96.62.0 - 62.96.64.119 de -62.96.64.120 - 62.96.64.127 gb -62.96.64.128 - 62.96.64.175 de -62.96.64.176 - 62.96.64.183 gb -62.96.64.184 - 62.96.64.207 de -62.96.64.208 - 62.96.64.215 gb -62.96.64.216 - 62.96.64.255 de -62.96.65.0 - 62.96.65.31 gb -62.96.65.32 - 62.96.65.39 de -62.96.65.40 - 62.96.65.47 gb -62.96.65.48 - 62.96.65.55 de -62.96.65.56 - 62.96.65.63 gb -62.96.65.64 - 62.96.65.79 de -62.96.65.80 - 62.96.65.87 gb -62.96.65.88 - 62.96.65.111 de -62.96.65.112 - 62.96.65.119 gb -62.96.65.120 - 62.96.65.143 de -62.96.65.144 - 62.96.65.151 gb -62.96.65.152 - 62.96.65.159 de -62.96.65.160 - 62.96.65.175 gb -62.96.65.176 - 62.96.65.215 de -62.96.65.216 - 62.96.65.231 gb -62.96.65.232 - 62.96.66.135 de -62.96.66.136 - 62.96.66.151 gb -62.96.66.152 - 62.96.66.255 de -62.96.67.0 - 62.96.67.47 gb -62.96.67.48 - 62.96.67.127 de -62.96.67.128 - 62.96.67.135 gb -62.96.67.136 - 62.96.67.191 de -62.96.67.192 - 62.96.67.215 gb -62.96.67.216 - 62.96.67.231 de -62.96.67.232 - 62.96.67.239 gb -62.96.67.240 - 62.96.68.47 de -62.96.68.48 - 62.96.68.255 gb -62.96.69.0 - 62.96.72.183 de -62.96.72.184 - 62.96.72.191 gb -62.96.72.192 - 62.96.72.199 de -62.96.72.200 - 62.96.73.31 gb -62.96.73.32 - 62.96.73.103 de -62.96.73.104 - 62.96.73.111 gb -62.96.73.112 - 62.96.73.127 de -62.96.73.128 - 62.96.73.135 gb -62.96.73.136 - 62.96.73.183 de -62.96.73.184 - 62.96.73.191 gb -62.96.73.192 - 62.96.73.223 de -62.96.73.224 - 62.96.73.239 gb -62.96.73.240 - 62.96.74.183 de -62.96.74.184 - 62.96.74.191 gb -62.96.74.192 - 62.96.74.255 de -62.96.75.0 - 62.96.75.31 gb -62.96.75.32 - 62.96.75.55 de -62.96.75.56 - 62.96.75.63 gb -62.96.75.64 - 62.96.75.111 de -62.96.75.112 - 62.96.75.119 gb -62.96.75.120 - 62.96.75.127 de -62.96.75.128 - 62.96.75.135 gb -62.96.75.136 - 62.96.75.159 de -62.96.75.160 - 62.96.75.167 gb -62.96.75.168 - 62.96.75.191 de -62.96.75.192 - 62.96.75.207 gb -62.96.75.208 - 62.96.75.215 de -62.96.75.216 - 62.96.75.223 gb -62.96.75.224 - 62.96.75.231 de -62.96.75.232 - 62.96.75.247 gb -62.96.75.248 - 62.96.76.55 de -62.96.76.56 - 62.96.76.63 gb -62.96.76.64 - 62.96.76.151 de -62.96.76.152 - 62.96.77.31 gb -62.96.77.32 - 62.96.77.71 de -62.96.77.72 - 62.96.77.79 gb -62.96.77.80 - 62.96.77.95 de -62.96.77.96 - 62.96.77.103 gb -62.96.77.104 - 62.96.77.119 de -62.96.77.120 - 62.96.77.127 gb -62.96.77.128 - 62.96.77.159 de -62.96.77.160 - 62.96.77.167 gb -62.96.77.168 - 62.96.78.3 de -62.96.78.4 - 62.96.79.255 gb -62.96.80.0 - 62.96.92.255 de -62.96.93.0 - 62.96.93.63 gb -62.96.93.64 - 62.96.93.207 de -62.96.93.208 - 62.96.93.255 gb -62.96.94.0 - 62.96.99.223 de -62.96.99.224 - 62.96.99.255 gb +62.96.22.32 - 62.96.25.55 gb +62.96.25.56 - 62.96.25.63 de +62.96.25.64 - 62.96.27.143 gb +62.96.27.144 - 62.96.27.151 de +62.96.27.152 - 62.96.32.249 gb +62.96.32.250 - 62.96.32.250 de +62.96.32.251 - 62.96.36.255 gb +62.96.37.0 - 62.96.37.255 de +62.96.38.0 - 62.96.39.255 gb +62.96.40.0 - 62.96.40.31 de +62.96.40.32 - 62.96.40.223 gb +62.96.40.224 - 62.96.40.239 es +62.96.40.240 - 62.96.41.47 gb +62.96.41.48 - 62.96.41.63 it +62.96.41.64 - 62.96.41.127 gb +62.96.41.128 - 62.96.41.143 es +62.96.41.144 - 62.96.41.159 gb +62.96.41.160 - 62.96.41.175 de +62.96.41.176 - 62.96.53.55 gb +62.96.53.56 - 62.96.53.63 de +62.96.53.64 - 62.96.54.47 gb +62.96.54.48 - 62.96.54.55 de +62.96.54.56 - 62.96.55.87 gb +62.96.55.88 - 62.96.55.95 de +62.96.55.96 - 62.96.55.111 gb +62.96.55.112 - 62.96.55.119 de +62.96.55.120 - 62.96.55.135 gb +62.96.55.136 - 62.96.55.143 de +62.96.55.144 - 62.96.59.31 gb +62.96.59.32 - 62.96.59.47 de +62.96.59.48 - 62.96.59.239 gb +62.96.59.240 - 62.96.59.247 de +62.96.59.248 - 62.96.63.151 gb +62.96.63.152 - 62.96.63.159 de +62.96.63.160 - 62.96.64.183 gb +62.96.64.184 - 62.96.64.191 de +62.96.64.192 - 62.96.65.119 gb +62.96.65.120 - 62.96.65.127 de +62.96.65.128 - 62.96.65.231 gb +62.96.65.232 - 62.96.65.239 de +62.96.65.240 - 62.96.66.23 gb +62.96.66.24 - 62.96.66.31 de +62.96.66.32 - 62.96.66.167 gb +62.96.66.168 - 62.96.66.175 de +62.96.66.176 - 62.96.66.239 gb +62.96.66.240 - 62.96.66.247 de +62.96.66.248 - 62.96.74.15 gb +62.96.74.16 - 62.96.74.23 de +62.96.74.24 - 62.96.75.87 gb +62.96.75.88 - 62.96.75.95 de +62.96.75.96 - 62.96.75.167 gb +62.96.75.168 - 62.96.75.175 de +62.96.75.176 - 62.96.75.255 gb +62.96.76.0 - 62.96.76.15 de +62.96.76.16 - 62.96.77.127 gb +62.96.77.128 - 62.96.77.135 de +62.96.77.136 - 62.96.77.239 gb +62.96.77.240 - 62.96.77.247 de +62.96.77.248 - 62.96.90.218 gb +62.96.90.219 - 62.96.90.219 de +62.96.90.220 - 62.96.94.183 gb +62.96.94.184 - 62.96.94.191 de +62.96.94.192 - 62.96.99.255 gb 62.96.100.0 - 62.96.115.255 de -62.96.116.0 - 62.96.127.255 gb -62.96.128.0 - 62.96.146.63 de -62.96.146.64 - 62.96.147.255 gb -62.96.148.0 - 62.96.148.15 de -62.96.148.16 - 62.96.148.255 gb -62.96.149.0 - 62.96.149.39 de -62.96.149.40 - 62.96.149.47 gb -62.96.149.48 - 62.96.149.95 de -62.96.149.96 - 62.96.151.255 gb -62.96.152.0 - 62.96.153.255 de -62.96.154.0 - 62.96.157.127 gb -62.96.157.128 - 62.96.157.151 de -62.96.157.152 - 62.96.157.159 gb -62.96.157.160 - 62.96.157.191 de -62.96.157.192 - 62.96.176.255 gb -62.96.177.0 - 62.96.177.31 de -62.96.177.32 - 62.96.177.47 gb -62.96.177.48 - 62.96.177.55 de -62.96.177.56 - 62.96.177.127 gb -62.96.177.128 - 62.96.177.195 de -62.96.177.196 - 62.96.177.255 gb -62.96.178.0 - 62.96.180.255 de -62.96.181.0 - 62.96.181.31 gb -62.96.181.32 - 62.96.181.63 de -62.96.181.64 - 62.96.181.127 gb -62.96.181.128 - 62.96.181.159 de -62.96.181.160 - 62.96.181.255 gb +62.96.116.0 - 62.96.128.199 gb +62.96.128.200 - 62.96.128.207 de +62.96.128.208 - 62.96.131.199 gb +62.96.131.200 - 62.96.131.215 de +62.96.131.216 - 62.96.139.255 gb +62.96.140.0 - 62.96.143.255 de +62.96.144.0 - 62.96.155.255 gb +62.96.156.0 - 62.96.159.255 de +62.96.160.0 - 62.96.177.55 gb +62.96.177.56 - 62.96.177.63 de +62.96.177.64 - 62.96.178.199 gb +62.96.178.200 - 62.96.178.207 de +62.96.178.208 - 62.96.181.167 gb +62.96.181.168 - 62.96.181.175 de +62.96.181.176 - 62.96.181.255 gb 62.96.182.0 - 62.96.182.255 de -62.96.183.0 - 62.96.186.127 gb -62.96.186.128 - 62.96.186.135 de -62.96.186.136 - 62.96.186.167 gb -62.96.186.168 - 62.96.186.171 de -62.96.186.172 - 62.96.186.255 gb -62.96.187.0 - 62.96.189.255 de -62.96.190.0 - 62.96.190.255 gb -62.96.191.0 - 62.96.191.255 de -62.96.192.0 - 62.96.192.255 gb -62.96.193.0 - 62.96.193.31 de -62.96.193.32 - 62.96.193.63 gb -62.96.193.64 - 62.96.193.79 de -62.96.193.80 - 62.96.193.135 gb -62.96.193.136 - 62.96.193.143 de -62.96.193.144 - 62.96.193.203 gb -62.96.193.204 - 62.96.193.207 de -62.96.193.208 - 62.96.193.215 gb -62.96.193.216 - 62.96.193.223 de -62.96.193.224 - 62.96.193.231 gb -62.96.193.232 - 62.96.193.239 de -62.96.193.240 - 62.96.194.7 gb -62.96.194.8 - 62.96.194.15 de -62.96.194.16 - 62.96.194.31 gb -62.96.194.32 - 62.96.194.47 de -62.96.194.48 - 62.96.194.63 gb -62.96.194.64 - 62.96.194.75 de -62.96.194.76 - 62.96.194.87 gb -62.96.194.88 - 62.96.194.91 de -62.96.194.92 - 62.96.194.95 gb -62.96.194.96 - 62.96.194.127 de -62.96.194.128 - 62.96.194.191 gb -62.96.194.192 - 62.96.194.255 de -62.96.195.0 - 62.96.199.255 gb -62.96.200.0 - 62.96.202.127 de -62.96.202.128 - 62.96.202.255 gb -62.96.203.0 - 62.96.203.63 de -62.96.203.64 - 62.96.203.127 gb -62.96.203.128 - 62.96.203.131 de -62.96.203.132 - 62.96.203.151 gb -62.96.203.152 - 62.96.203.159 de -62.96.203.160 - 62.96.203.191 gb -62.96.203.192 - 62.96.204.55 de -62.96.204.56 - 62.96.206.255 gb +62.96.183.0 - 62.96.195.255 gb +62.96.196.0 - 62.96.199.255 de +62.96.200.0 - 62.96.203.157 gb +62.96.203.158 - 62.96.203.158 de +62.96.203.159 - 62.96.206.255 gb 62.96.207.0 - 62.96.207.255 de -62.96.208.0 - 62.96.215.127 gb -62.96.215.128 - 62.96.215.159 de -62.96.215.160 - 62.96.215.175 gb -62.96.215.176 - 62.96.215.183 de -62.96.215.184 - 62.96.215.255 gb -62.96.216.0 - 62.96.218.87 de -62.96.218.88 - 62.96.218.191 gb -62.96.218.192 - 62.96.218.239 de -62.96.218.240 - 62.96.218.255 gb -62.96.219.0 - 62.96.220.143 de -62.96.220.144 - 62.96.220.191 gb -62.96.220.192 - 62.96.220.255 de -62.96.221.0 - 62.96.221.63 gb -62.96.221.64 - 62.96.221.127 de -62.96.221.128 - 62.96.221.195 gb -62.96.221.196 - 62.96.221.199 de -62.96.221.200 - 62.96.221.255 gb -62.96.222.0 - 62.96.222.255 de -62.96.223.0 - 62.96.223.87 gb -62.96.223.88 - 62.96.223.103 de -62.96.223.104 - 62.96.223.127 gb -62.96.223.128 - 62.96.223.215 de -62.96.223.216 - 62.96.223.223 gb -62.96.223.224 - 62.96.223.231 de -62.96.223.232 - 62.96.223.251 gb -62.96.223.252 - 62.96.224.7 de -62.96.224.8 - 62.96.224.19 gb -62.96.224.20 - 62.96.224.23 de -62.96.224.24 - 62.96.224.63 gb -62.96.224.64 - 62.96.224.79 de -62.96.224.80 - 62.96.224.87 gb -62.96.224.88 - 62.96.224.91 de -62.96.224.92 - 62.96.224.95 gb -62.96.224.96 - 62.96.224.103 de -62.96.224.104 - 62.96.224.127 gb -62.96.224.128 - 62.96.224.159 de -62.96.224.160 - 62.96.224.163 gb -62.96.224.164 - 62.96.224.167 de -62.96.224.168 - 62.96.225.159 gb -62.96.225.160 - 62.96.225.219 de -62.96.225.220 - 62.96.225.255 gb -62.96.226.0 - 62.96.227.63 de -62.96.227.64 - 62.96.227.95 gb -62.96.227.96 - 62.96.227.111 de -62.96.227.112 - 62.96.227.127 gb -62.96.227.128 - 62.96.227.191 de -62.96.227.192 - 62.96.227.255 gb -62.96.228.0 - 62.96.231.255 de -62.96.232.0 - 62.96.232.191 gb -62.96.232.192 - 62.96.232.207 de -62.96.232.208 - 62.96.232.223 gb -62.96.232.224 - 62.96.232.255 de -62.96.233.0 - 62.96.233.255 gb -62.96.234.0 - 62.96.237.255 de -62.96.238.0 - 62.96.238.255 gb -62.96.239.0 - 62.96.239.255 de -62.96.240.0 - 62.96.240.255 gb -62.96.241.0 - 62.96.244.127 de -62.96.244.128 - 62.96.244.191 gb -62.96.244.192 - 62.96.244.255 de -62.96.245.0 - 62.96.245.63 gb -62.96.245.64 - 62.96.245.127 de -62.96.245.128 - 62.96.245.159 gb -62.96.245.160 - 62.96.245.191 de -62.96.245.192 - 62.96.245.199 gb -62.96.245.200 - 62.96.245.207 de -62.96.245.208 - 62.96.245.239 gb -62.96.245.240 - 62.96.250.255 de -62.96.251.0 - 62.96.251.159 gb -62.96.251.160 - 62.96.251.191 de -62.96.251.192 - 62.96.251.223 gb -62.96.251.224 - 62.96.251.239 de -62.96.251.240 - 62.96.251.255 gb -62.96.252.0 - 62.96.252.255 de -62.96.253.0 - 62.96.254.255 gb -62.96.255.0 - 62.96.255.255 de +62.96.208.0 - 62.96.212.255 gb +62.96.213.0 - 62.96.213.7 de +62.96.213.8 - 62.96.213.161 gb +62.96.213.162 - 62.96.213.162 de +62.96.213.163 - 62.96.213.239 gb +62.96.213.240 - 62.96.213.255 de +62.96.214.0 - 62.96.214.255 gb +62.96.215.0 - 62.96.215.255 de +62.96.216.0 - 62.96.220.127 gb +62.96.220.128 - 62.96.220.143 de +62.96.220.144 - 62.96.220.255 gb +62.96.221.0 - 62.96.221.255 de +62.96.222.0 - 62.96.227.63 gb +62.96.227.64 - 62.96.227.79 de +62.96.227.80 - 62.96.251.105 gb +62.96.251.106 - 62.96.251.106 de +62.96.251.107 - 62.96.251.239 gb +62.96.251.240 - 62.96.251.255 de +62.96.252.0 - 62.96.255.255 gb 62.97.0.0 - 62.97.63.255 it -62.97.64.0 - 62.97.102.95 es -62.97.102.96 - 62.97.102.111 ch -62.97.102.112 - 62.97.107.231 es -62.97.107.232 - 62.97.107.239 dk -62.97.107.240 - 62.97.159.255 es +62.97.64.0 - 62.97.159.255 es 62.97.160.0 - 62.97.255.255 no 62.98.0.0 - 62.98.255.255 it 62.99.0.0 - 62.99.127.255 es @@ -11564,8 +13058,8 @@ 62.100.96.0 - 62.100.127.255 es 62.100.128.0 - 62.100.159.255 fr 62.100.160.0 - 62.100.191.255 gb -62.100.192.0 - 62.100.195.255 us -62.100.196.0 - 62.100.223.255 gb +62.100.192.0 - 62.100.199.255 cn +62.100.200.0 - 62.100.223.255 gb 62.100.224.0 - 62.100.255.255 hu 62.101.0.0 - 62.101.31.255 it 62.101.32.0 - 62.101.63.255 se @@ -11573,91 +13067,10 @@ 62.101.128.0 - 62.101.159.255 ba 62.101.160.0 - 62.101.191.255 es 62.101.192.0 - 62.101.255.255 no -62.102.0.0 - 62.102.2.7 be -62.102.2.8 - 62.102.2.31 eu -62.102.2.32 - 62.102.2.39 be -62.102.2.40 - 62.102.3.143 eu -62.102.3.144 - 62.102.3.167 be -62.102.3.168 - 62.102.3.255 eu -62.102.4.0 - 62.102.4.191 be -62.102.4.192 - 62.102.5.255 eu -62.102.6.0 - 62.102.24.255 be -62.102.25.0 - 62.102.28.23 eu -62.102.28.24 - 62.102.28.31 be -62.102.28.32 - 62.102.28.39 eu -62.102.28.40 - 62.102.28.79 be -62.102.28.80 - 62.102.28.95 eu -62.102.28.96 - 62.102.29.7 be -62.102.29.8 - 62.102.29.15 eu -62.102.29.16 - 62.102.29.23 be -62.102.29.24 - 62.102.29.55 eu -62.102.29.56 - 62.102.29.63 be -62.102.29.64 - 62.102.29.103 eu -62.102.29.104 - 62.102.29.135 be -62.102.29.136 - 62.102.29.159 eu -62.102.29.160 - 62.102.29.167 be -62.102.29.168 - 62.102.29.199 eu -62.102.29.200 - 62.102.29.223 be -62.102.29.224 - 62.102.29.231 eu -62.102.29.232 - 62.102.29.247 be -62.102.29.248 - 62.102.30.31 eu -62.102.30.32 - 62.102.30.47 be -62.102.30.48 - 62.102.30.63 eu -62.102.30.64 - 62.102.30.87 be -62.102.30.88 - 62.102.30.95 eu -62.102.30.96 - 62.102.30.103 be -62.102.30.104 - 62.102.30.151 eu -62.102.30.152 - 62.102.30.167 be -62.102.30.168 - 62.102.30.199 eu -62.102.30.200 - 62.102.30.215 be -62.102.30.216 - 62.102.30.223 eu -62.102.30.224 - 62.102.31.127 be -62.102.31.128 - 62.102.31.135 eu -62.102.31.136 - 62.102.31.143 be -62.102.31.144 - 62.102.31.151 eu -62.102.31.152 - 62.102.31.191 be -62.102.31.192 - 62.102.31.255 eu -62.102.32.0 - 62.102.32.255 be -62.102.33.0 - 62.102.33.7 eu -62.102.33.8 - 62.102.33.15 be -62.102.33.16 - 62.102.33.47 eu -62.102.33.48 - 62.102.33.55 ro -62.102.33.56 - 62.102.33.79 eu -62.102.33.80 - 62.102.33.103 be -62.102.33.104 - 62.102.33.127 eu -62.102.33.128 - 62.102.33.159 be -62.102.33.160 - 62.102.33.223 eu -62.102.33.224 - 62.102.33.247 be -62.102.33.248 - 62.102.34.135 eu -62.102.34.136 - 62.102.34.143 be -62.102.34.144 - 62.102.34.151 eu -62.102.34.152 - 62.102.34.167 be -62.102.34.168 - 62.102.34.215 eu -62.102.34.216 - 62.102.35.15 be -62.102.35.16 - 62.102.35.31 eu -62.102.35.32 - 62.102.35.47 be -62.102.35.48 - 62.102.35.55 eu -62.102.35.56 - 62.102.35.63 be -62.102.35.64 - 62.102.35.87 eu -62.102.35.88 - 62.102.35.103 be -62.102.35.104 - 62.102.35.111 eu -62.102.35.112 - 62.102.35.215 be -62.102.35.216 - 62.102.35.255 eu -62.102.36.0 - 62.102.38.255 be -62.102.39.0 - 62.102.39.255 eu -62.102.40.0 - 62.102.48.31 be -62.102.48.32 - 62.102.51.255 eu -62.102.52.0 - 62.102.63.255 be -62.102.64.0 - 62.102.90.255 gb -62.102.91.0 - 62.102.94.255 eu -62.102.95.0 - 62.102.99.255 gb -62.102.100.0 - 62.102.102.255 be -62.102.103.0 - 62.102.103.255 eu -62.102.104.0 - 62.102.104.255 be -62.102.105.0 - 62.102.105.223 eu -62.102.105.224 - 62.102.127.255 be -62.102.128.0 - 62.102.135.255 sk -62.102.136.0 - 62.102.143.255 ir +62.102.0.0 - 62.102.104.255 eu +62.102.105.0 - 62.102.105.255 gb +62.102.106.0 - 62.102.127.255 eu +62.102.128.0 - 62.102.143.255 ir 62.102.144.0 - 62.102.151.255 se 62.102.152.0 - 62.102.159.255 it 62.102.160.0 - 62.102.191.255 no @@ -11678,211 +13091,35 @@ 62.108.0.0 - 62.108.31.255 nl 62.108.32.0 - 62.108.63.255 de 62.108.64.0 - 62.108.95.255 tr -62.108.96.0 - 62.108.117.119 rs -62.108.117.120 - 62.108.117.127 hu -62.108.117.128 - 62.108.127.255 rs -62.108.128.0 - 62.108.135.255 ch -62.108.136.0 - 62.108.137.63 gb -62.108.137.64 - 62.108.137.127 ch -62.108.137.128 - 62.108.137.143 fr -62.108.137.144 - 62.108.137.255 ch -62.108.138.0 - 62.108.138.31 gb -62.108.138.32 - 62.108.143.255 ch -62.108.144.0 - 62.108.144.15 us -62.108.144.16 - 62.108.144.31 gb -62.108.144.32 - 62.108.144.47 au -62.108.144.48 - 62.108.159.255 ch +62.108.96.0 - 62.108.127.255 rs +62.108.128.0 - 62.108.159.255 ch 62.108.160.0 - 62.108.191.255 pl 62.108.192.0 - 62.108.223.255 se 62.108.224.0 - 62.108.255.255 it 62.109.0.0 - 62.109.31.255 ru -62.109.32.0 - 62.109.36.247 se -62.109.36.248 - 62.109.36.255 dk -62.109.37.0 - 62.109.37.143 se -62.109.37.144 - 62.109.37.151 no -62.109.37.152 - 62.109.38.255 se -62.109.39.0 - 62.109.39.255 no -62.109.40.0 - 62.109.50.255 se -62.109.51.0 - 62.109.51.255 no -62.109.52.0 - 62.109.60.175 se -62.109.60.176 - 62.109.60.183 fi -62.109.60.184 - 62.109.60.255 se -62.109.61.0 - 62.109.61.255 fi -62.109.62.0 - 62.109.63.255 se +62.109.32.0 - 62.109.39.63 se +62.109.39.64 - 62.109.39.127 no +62.109.39.128 - 62.109.47.31 se +62.109.47.32 - 62.109.47.39 fi +62.109.47.40 - 62.109.63.255 se 62.109.64.0 - 62.109.127.255 de 62.109.128.0 - 62.109.159.255 cz -62.109.160.0 - 62.109.191.255 ru +62.109.160.0 - 62.109.166.247 ru +62.109.166.248 - 62.109.166.255 fi +62.109.167.0 - 62.109.191.255 ru 62.109.192.0 - 62.109.255.255 nl 62.110.0.0 - 62.110.255.255 it 62.111.0.0 - 62.111.127.255 de 62.111.128.0 - 62.111.255.255 pl 62.112.0.0 - 62.112.31.255 be -62.112.32.0 - 62.112.95.255 de +62.112.32.0 - 62.112.36.255 de +62.112.37.0 - 62.112.37.255 se +62.112.38.0 - 62.112.95.255 de 62.112.96.0 - 62.112.127.255 ru -62.112.128.0 - 62.112.131.191 de -62.112.131.192 - 62.112.131.199 at -62.112.131.200 - 62.112.134.159 de -62.112.134.160 - 62.112.134.163 us -62.112.134.164 - 62.112.140.23 de -62.112.140.24 - 62.112.140.31 ch -62.112.140.32 - 62.112.140.39 de -62.112.140.40 - 62.112.140.47 ch -62.112.140.48 - 62.112.140.55 de -62.112.140.56 - 62.112.140.59 ch -62.112.140.60 - 62.112.140.87 de -62.112.140.88 - 62.112.140.91 ch -62.112.140.92 - 62.112.140.99 de -62.112.140.100 - 62.112.140.103 es -62.112.140.104 - 62.112.140.139 de -62.112.140.140 - 62.112.140.143 nl -62.112.140.144 - 62.112.140.147 ch -62.112.140.148 - 62.112.140.151 de -62.112.140.152 - 62.112.140.155 be -62.112.140.156 - 62.112.140.167 de -62.112.140.168 - 62.112.140.171 ch -62.112.140.172 - 62.112.140.179 de -62.112.140.180 - 62.112.140.183 ch -62.112.140.184 - 62.112.140.187 de -62.112.140.188 - 62.112.140.191 nl -62.112.140.192 - 62.112.140.203 de -62.112.140.204 - 62.112.140.207 ch -62.112.140.208 - 62.112.147.75 de -62.112.147.76 - 62.112.147.79 gb -62.112.147.80 - 62.112.148.31 de -62.112.148.32 - 62.112.148.47 ch -62.112.148.48 - 62.112.148.191 de -62.112.148.192 - 62.112.148.195 cz -62.112.148.196 - 62.112.150.15 de -62.112.150.16 - 62.112.150.63 ch -62.112.150.64 - 62.112.150.191 de -62.112.150.192 - 62.112.150.255 cz -62.112.151.0 - 62.112.152.27 de -62.112.152.28 - 62.112.152.31 ch -62.112.152.32 - 62.112.152.67 de -62.112.152.68 - 62.112.152.79 ch -62.112.152.80 - 62.112.152.99 de -62.112.152.100 - 62.112.152.103 ch -62.112.152.104 - 62.112.152.107 de -62.112.152.108 - 62.112.152.111 at -62.112.152.112 - 62.112.152.115 de -62.112.152.116 - 62.112.152.123 ch -62.112.152.124 - 62.112.152.139 de -62.112.152.140 - 62.112.152.143 ch -62.112.152.144 - 62.112.152.159 de -62.112.152.160 - 62.112.152.163 ch -62.112.152.164 - 62.112.152.171 de -62.112.152.172 - 62.112.152.175 ch -62.112.152.176 - 62.112.152.183 de -62.112.152.184 - 62.112.152.203 ch -62.112.152.204 - 62.112.152.207 de -62.112.152.208 - 62.112.152.211 ch -62.112.152.212 - 62.112.152.223 de -62.112.152.224 - 62.112.152.227 ch -62.112.152.228 - 62.112.153.255 de -62.112.154.0 - 62.112.154.3 at -62.112.154.4 - 62.112.154.23 de -62.112.154.24 - 62.112.154.31 ch -62.112.154.32 - 62.112.154.43 de -62.112.154.44 - 62.112.154.55 ch -62.112.154.56 - 62.112.154.99 de -62.112.154.100 - 62.112.154.103 at -62.112.154.104 - 62.112.154.115 de -62.112.154.116 - 62.112.154.119 at -62.112.154.120 - 62.112.154.123 ch -62.112.154.124 - 62.112.154.147 de -62.112.154.148 - 62.112.154.151 ch -62.112.154.152 - 62.112.154.167 de -62.112.154.168 - 62.112.154.171 ch -62.112.154.172 - 62.112.154.179 de -62.112.154.180 - 62.112.154.183 ch -62.112.154.184 - 62.112.154.191 de -62.112.154.192 - 62.112.154.195 at -62.112.154.196 - 62.112.154.199 ch -62.112.154.200 - 62.112.154.215 de -62.112.154.216 - 62.112.154.219 ch -62.112.154.220 - 62.112.154.223 be -62.112.154.224 - 62.112.154.227 nl -62.112.154.228 - 62.112.154.231 de -62.112.154.232 - 62.112.154.235 nl -62.112.154.236 - 62.112.155.15 de -62.112.155.16 - 62.112.155.23 ch -62.112.155.24 - 62.112.155.39 de -62.112.155.40 - 62.112.155.43 ch -62.112.155.44 - 62.112.155.47 be -62.112.155.48 - 62.112.155.55 ch -62.112.155.56 - 62.112.155.59 de -62.112.155.60 - 62.112.155.63 at -62.112.155.64 - 62.112.155.71 ch -62.112.155.72 - 62.112.155.107 de -62.112.155.108 - 62.112.155.123 ch -62.112.155.124 - 62.112.155.135 de -62.112.155.136 - 62.112.155.139 ch -62.112.155.140 - 62.112.155.143 de -62.112.155.144 - 62.112.155.151 ch -62.112.155.152 - 62.112.155.175 de -62.112.155.176 - 62.112.155.183 ch -62.112.155.184 - 62.112.155.203 de -62.112.155.204 - 62.112.155.207 ch -62.112.155.208 - 62.112.155.211 de -62.112.155.212 - 62.112.155.215 at -62.112.155.216 - 62.112.155.223 ch -62.112.155.224 - 62.112.156.87 de -62.112.156.88 - 62.112.156.91 ch -62.112.156.92 - 62.112.156.95 at -62.112.156.96 - 62.112.156.99 ch -62.112.156.100 - 62.112.156.103 de -62.112.156.104 - 62.112.156.111 ch -62.112.156.112 - 62.112.156.115 de -62.112.156.116 - 62.112.156.123 ch -62.112.156.124 - 62.112.156.135 de -62.112.156.136 - 62.112.156.139 ch -62.112.156.140 - 62.112.156.175 de -62.112.156.176 - 62.112.156.179 ch -62.112.156.180 - 62.112.156.191 de -62.112.156.192 - 62.112.156.195 ch -62.112.156.196 - 62.112.157.31 de -62.112.157.32 - 62.112.157.35 ch -62.112.157.36 - 62.112.157.39 de -62.112.157.40 - 62.112.157.43 ch -62.112.157.44 - 62.112.157.111 de -62.112.157.112 - 62.112.157.115 be -62.112.157.116 - 62.112.157.119 de -62.112.157.120 - 62.112.157.127 ch -62.112.157.128 - 62.112.157.131 de -62.112.157.132 - 62.112.157.135 ch -62.112.157.136 - 62.112.157.139 lu -62.112.157.140 - 62.112.157.143 ch -62.112.157.144 - 62.112.157.207 de -62.112.157.208 - 62.112.157.223 ch -62.112.157.224 - 62.112.157.231 de -62.112.157.232 - 62.112.157.235 ch -62.112.157.236 - 62.112.157.239 be -62.112.157.240 - 62.112.157.255 de -62.112.158.0 - 62.112.158.3 ch -62.112.158.4 - 62.112.158.7 at -62.112.158.8 - 62.112.158.11 ch -62.112.158.12 - 62.112.158.31 de -62.112.158.32 - 62.112.158.67 ch -62.112.158.68 - 62.112.158.175 de -62.112.158.176 - 62.112.158.179 ch -62.112.158.180 - 62.112.158.183 de -62.112.158.184 - 62.112.158.187 ch -62.112.158.188 - 62.112.159.31 de -62.112.159.32 - 62.112.159.35 ch -62.112.159.36 - 62.112.159.59 de -62.112.159.60 - 62.112.159.63 ch -62.112.159.64 - 62.112.159.87 de -62.112.159.88 - 62.112.159.91 ch -62.112.159.92 - 62.112.159.119 de -62.112.159.120 - 62.112.159.123 ch -62.112.159.124 - 62.112.159.235 de -62.112.159.236 - 62.112.159.239 ch -62.112.159.240 - 62.112.159.255 de +62.112.128.0 - 62.112.159.255 de 62.112.160.0 - 62.112.191.255 nl 62.112.192.0 - 62.112.223.255 hu -62.112.224.0 - 62.112.255.31 nl -62.112.255.32 - 62.112.255.39 fr -62.112.255.40 - 62.112.255.255 nl +62.112.224.0 - 62.112.255.255 nl 62.113.0.0 - 62.113.31.255 ba 62.113.32.0 - 62.113.127.255 ru 62.113.128.0 - 62.113.159.255 no @@ -11891,33 +13128,29 @@ 62.114.0.0 - 62.114.255.255 eg 62.115.0.0 - 62.115.15.255 eu 62.115.16.0 - 62.115.31.255 se -62.115.32.0 - 62.115.63.255 eu -62.115.64.0 - 62.115.64.15 us -62.115.64.16 - 62.115.64.31 de -62.115.64.32 - 62.115.64.47 it -62.115.64.48 - 62.115.64.63 se -62.115.64.64 - 62.115.64.127 eu +62.115.32.0 - 62.115.45.217 eu +62.115.45.218 - 62.115.45.218 de +62.115.45.219 - 62.115.64.127 eu 62.115.64.128 - 62.115.64.255 de -62.115.65.0 - 62.115.65.255 a2 -62.115.66.0 - 62.115.229.39 eu -62.115.229.40 - 62.115.229.47 gb -62.115.229.48 - 62.115.229.63 eu -62.115.229.64 - 62.115.229.95 se -62.115.229.96 - 62.115.229.127 no -62.115.229.128 - 62.115.229.159 fi -62.115.229.160 - 62.115.239.255 eu -62.115.240.0 - 62.115.249.255 de -62.115.250.0 - 62.115.255.63 eu -62.115.255.64 - 62.115.255.71 gb -62.115.255.72 - 62.115.255.95 eu -62.115.255.96 - 62.115.255.111 de -62.115.255.112 - 62.115.255.127 eu -62.115.255.128 - 62.115.255.159 se -62.115.255.160 - 62.115.255.223 eu -62.115.255.224 - 62.115.255.255 de -62.116.0.0 - 62.116.64.79 at -62.116.64.80 - 62.116.64.95 it -62.116.64.96 - 62.116.127.255 at +62.115.65.0 - 62.115.136.62 eu +62.115.136.63 - 62.115.136.63 cz +62.115.136.64 - 62.115.137.14 eu +62.115.137.15 - 62.115.137.15 at +62.115.137.16 - 62.115.137.20 eu +62.115.137.21 - 62.115.137.21 at +62.115.137.22 - 62.115.139.217 eu +62.115.139.218 - 62.115.139.218 cz +62.115.139.219 - 62.115.225.223 eu +62.115.225.224 - 62.115.225.239 de +62.115.225.240 - 62.115.229.33 eu +62.115.229.34 - 62.115.229.34 gb +62.115.229.35 - 62.115.247.255 eu +62.115.248.0 - 62.115.248.255 es +62.115.249.0 - 62.115.250.255 eu +62.115.251.0 - 62.115.251.255 nl +62.115.252.0 - 62.115.253.255 gb +62.115.254.0 - 62.115.255.255 eu +62.116.0.0 - 62.116.127.255 at 62.116.128.0 - 62.116.191.255 de 62.116.192.0 - 62.116.223.255 dk 62.116.224.0 - 62.116.255.255 se @@ -11925,31 +13158,23 @@ 62.117.32.0 - 62.117.63.255 eg 62.117.64.0 - 62.117.127.255 ru 62.117.128.0 - 62.117.255.255 es -62.118.0.0 - 62.118.79.255 ru -62.118.80.0 - 62.118.80.255 gb -62.118.81.0 - 62.118.255.255 ru -62.119.0.0 - 62.119.43.255 se -62.119.44.0 - 62.119.44.63 no -62.119.44.64 - 62.119.67.175 se -62.119.67.176 - 62.119.67.183 no -62.119.67.184 - 62.119.102.95 se -62.119.102.96 - 62.119.102.103 de -62.119.102.104 - 62.119.255.255 se +62.118.0.0 - 62.118.255.255 ru +62.119.0.0 - 62.119.99.255 se +62.119.100.0 - 62.119.100.255 eu +62.119.101.0 - 62.119.255.255 se 62.120.0.0 - 62.120.255.255 sa 62.121.0.0 - 62.121.31.255 gb 62.121.32.0 - 62.121.63.255 fi -62.121.64.0 - 62.121.159.255 pl +62.121.64.0 - 62.121.127.255 ro +62.121.128.0 - 62.121.159.255 pl 62.121.160.0 - 62.121.191.255 dk 62.121.192.0 - 62.121.255.255 ch 62.122.0.0 - 62.122.7.255 ua 62.122.8.0 - 62.122.15.255 fr 62.122.16.0 - 62.122.23.255 lv -62.122.24.0 - 62.122.31.255 be -62.122.32.0 - 62.122.39.255 ua 62.122.40.0 - 62.122.47.255 ro 62.122.48.0 - 62.122.55.255 ru 62.122.56.0 - 62.122.71.255 ua -62.122.72.0 - 62.122.79.255 eu 62.122.80.0 - 62.122.87.255 de 62.122.88.0 - 62.122.103.255 ru 62.122.104.0 - 62.122.111.255 ua @@ -11960,8 +13185,7 @@ 62.122.168.0 - 62.122.175.255 cz 62.122.176.0 - 62.122.199.255 ru 62.122.200.0 - 62.122.207.255 ua -62.122.208.0 - 62.122.223.255 ru -62.122.224.0 - 62.122.231.255 il +62.122.208.0 - 62.122.215.255 ru 62.122.232.0 - 62.122.239.255 pl 62.122.240.0 - 62.122.247.255 ru 62.122.248.0 - 62.122.255.255 no @@ -11971,41 +13195,20 @@ 62.128.0.0 - 62.128.31.255 de 62.128.32.0 - 62.128.63.255 il 62.128.64.0 - 62.128.95.255 it -62.128.96.0 - 62.128.111.255 ua -62.128.112.0 - 62.128.112.15 ee -62.128.112.16 - 62.128.112.79 ua -62.128.112.80 - 62.128.112.87 ee -62.128.112.88 - 62.128.112.255 ua -62.128.113.0 - 62.128.113.17 lt -62.128.113.18 - 62.128.113.19 ua -62.128.113.20 - 62.128.113.63 lt -62.128.113.64 - 62.128.113.127 ua -62.128.113.128 - 62.128.113.151 lt -62.128.113.152 - 62.128.113.159 ua -62.128.113.160 - 62.128.113.167 lt -62.128.113.168 - 62.128.113.175 ua -62.128.113.176 - 62.128.113.191 lt -62.128.113.192 - 62.128.121.255 ua -62.128.122.0 - 62.128.123.31 ee -62.128.123.32 - 62.128.123.255 ua -62.128.124.0 - 62.128.124.15 ee -62.128.124.16 - 62.128.124.31 ua -62.128.124.32 - 62.128.124.95 ee -62.128.124.96 - 62.128.125.255 ua -62.128.126.0 - 62.128.126.31 ru -62.128.126.32 - 62.128.127.159 ua -62.128.127.160 - 62.128.127.191 ee -62.128.127.192 - 62.128.127.199 ua -62.128.127.200 - 62.128.127.215 ee -62.128.127.216 - 62.128.127.219 ua -62.128.127.220 - 62.128.127.255 ee -62.128.128.0 - 62.128.138.255 gb -62.128.139.0 - 62.128.139.255 fr -62.128.140.0 - 62.128.153.255 gb -62.128.154.0 - 62.128.154.63 us -62.128.154.64 - 62.128.159.255 gb -62.128.160.0 - 62.128.175.255 ke -62.128.176.0 - 62.128.191.255 us +62.128.96.0 - 62.128.99.255 ua +62.128.100.0 - 62.128.101.255 ru +62.128.102.0 - 62.128.103.255 pl +62.128.104.0 - 62.128.105.255 ru +62.128.106.0 - 62.128.106.255 ua +62.128.107.0 - 62.128.107.255 lv +62.128.108.0 - 62.128.127.255 ua +62.128.128.0 - 62.128.159.255 gb +62.128.160.0 - 62.128.160.255 a2 +62.128.161.0 - 62.128.166.255 ke +62.128.167.0 - 62.128.167.255 a2 +62.128.168.0 - 62.128.175.255 ke +62.128.176.0 - 62.128.176.0 de +62.128.176.1 - 62.128.191.255 us 62.128.192.0 - 62.128.223.255 gb 62.128.224.0 - 62.128.255.255 no 62.129.0.0 - 62.129.31.255 fr @@ -12015,935 +13218,76 @@ 62.129.160.0 - 62.129.191.255 fr 62.129.192.0 - 62.129.255.255 pl 62.130.0.0 - 62.130.255.255 gb -62.131.0.0 - 62.131.255.255 nl -62.132.0.0 - 62.132.0.31 de -62.132.0.32 - 62.132.0.63 pl -62.132.0.64 - 62.132.0.95 nl -62.132.0.96 - 62.132.6.255 de -62.132.7.0 - 62.132.9.255 nl -62.132.10.0 - 62.132.19.255 de -62.132.20.0 - 62.132.20.47 nl -62.132.20.48 - 62.132.20.55 de -62.132.20.56 - 62.132.21.79 nl -62.132.21.80 - 62.132.21.87 de -62.132.21.88 - 62.132.22.175 nl -62.132.22.176 - 62.132.22.183 de -62.132.22.184 - 62.132.22.207 nl -62.132.22.208 - 62.132.22.215 de -62.132.22.216 - 62.132.23.231 nl -62.132.23.232 - 62.132.23.239 de -62.132.23.240 - 62.132.23.255 nl -62.132.24.0 - 62.132.24.31 de -62.132.24.32 - 62.132.24.63 nl -62.132.24.64 - 62.132.28.255 de -62.132.29.0 - 62.132.29.135 nl -62.132.29.136 - 62.132.29.143 de -62.132.29.144 - 62.132.29.191 nl -62.132.29.192 - 62.132.29.199 de -62.132.29.200 - 62.132.30.31 nl -62.132.30.32 - 62.132.30.39 de -62.132.30.40 - 62.132.32.239 nl -62.132.32.240 - 62.132.32.247 de -62.132.32.248 - 62.132.33.55 nl -62.132.33.56 - 62.132.33.71 de -62.132.33.72 - 62.132.33.95 nl -62.132.33.96 - 62.132.33.103 de -62.132.33.104 - 62.132.33.255 nl -62.132.34.0 - 62.132.35.255 de -62.132.36.0 - 62.132.36.63 nl -62.132.36.64 - 62.132.36.71 de -62.132.36.72 - 62.132.36.95 nl -62.132.36.96 - 62.132.36.103 de -62.132.36.104 - 62.132.38.247 nl -62.132.38.248 - 62.132.38.255 de -62.132.39.0 - 62.132.39.7 nl -62.132.39.8 - 62.132.39.15 de -62.132.39.16 - 62.132.40.95 nl -62.132.40.96 - 62.132.40.103 de -62.132.40.104 - 62.132.40.167 nl -62.132.40.168 - 62.132.40.175 de -62.132.40.176 - 62.132.41.63 nl -62.132.41.64 - 62.132.41.71 de -62.132.41.72 - 62.132.41.95 nl -62.132.41.96 - 62.132.41.103 de -62.132.41.104 - 62.132.41.255 nl -62.132.42.0 - 62.132.43.255 de -62.132.44.0 - 62.132.44.151 nl -62.132.44.152 - 62.132.44.159 de -62.132.44.160 - 62.132.44.191 nl -62.132.44.192 - 62.132.44.199 de -62.132.44.200 - 62.132.45.199 nl -62.132.45.200 - 62.132.45.207 de -62.132.45.208 - 62.132.50.15 nl -62.132.50.16 - 62.132.50.23 de -62.132.50.24 - 62.132.50.87 nl -62.132.50.88 - 62.132.50.95 de -62.132.50.96 - 62.132.50.207 nl -62.132.50.208 - 62.132.50.215 de -62.132.50.216 - 62.132.51.23 nl -62.132.51.24 - 62.132.51.31 de -62.132.51.32 - 62.132.52.135 nl -62.132.52.136 - 62.132.52.151 de -62.132.52.152 - 62.132.52.199 nl -62.132.52.200 - 62.132.52.207 de -62.132.52.208 - 62.132.52.223 nl -62.132.52.224 - 62.132.52.231 de -62.132.52.232 - 62.132.52.247 nl -62.132.52.248 - 62.132.52.255 de -62.132.53.0 - 62.132.53.31 nl -62.132.53.32 - 62.132.53.39 de -62.132.53.40 - 62.132.54.71 nl -62.132.54.72 - 62.132.54.79 de -62.132.54.80 - 62.132.55.111 nl -62.132.55.112 - 62.132.55.119 de -62.132.55.120 - 62.132.57.135 nl -62.132.57.136 - 62.132.57.143 de -62.132.57.144 - 62.132.58.135 nl -62.132.58.136 - 62.132.58.143 de -62.132.58.144 - 62.132.58.151 nl -62.132.58.152 - 62.132.58.159 de -62.132.58.160 - 62.132.58.199 nl -62.132.58.200 - 62.132.58.207 de -62.132.58.208 - 62.132.59.79 nl -62.132.59.80 - 62.132.59.87 de -62.132.59.88 - 62.132.60.71 nl -62.132.60.72 - 62.132.60.79 de -62.132.60.80 - 62.132.60.151 nl -62.132.60.152 - 62.132.60.159 de -62.132.60.160 - 62.132.61.103 nl -62.132.61.104 - 62.132.61.111 de -62.132.61.112 - 62.132.62.39 nl -62.132.62.40 - 62.132.62.47 de -62.132.62.48 - 62.132.63.119 nl -62.132.63.120 - 62.132.63.135 de -62.132.63.136 - 62.132.63.255 nl -62.132.64.0 - 62.132.65.255 de -62.132.66.0 - 62.132.66.7 nl -62.132.66.8 - 62.132.66.15 de -62.132.66.16 - 62.132.66.175 nl -62.132.66.176 - 62.132.66.183 de -62.132.66.184 - 62.132.66.231 nl -62.132.66.232 - 62.132.66.239 de -62.132.66.240 - 62.132.69.87 nl -62.132.69.88 - 62.132.69.95 de -62.132.69.96 - 62.132.69.207 nl -62.132.69.208 - 62.132.69.223 de -62.132.69.224 - 62.132.70.31 nl -62.132.70.32 - 62.132.70.39 de -62.132.70.40 - 62.132.71.39 nl -62.132.71.40 - 62.132.71.47 de -62.132.71.48 - 62.132.71.55 nl -62.132.71.56 - 62.132.71.63 de -62.132.71.64 - 62.132.71.239 nl -62.132.71.240 - 62.132.71.247 de -62.132.71.248 - 62.132.72.111 nl -62.132.72.112 - 62.132.72.119 de -62.132.72.120 - 62.132.73.7 nl -62.132.73.8 - 62.132.73.15 de -62.132.73.16 - 62.132.73.87 nl -62.132.73.88 - 62.132.73.95 de -62.132.73.96 - 62.132.73.167 nl -62.132.73.168 - 62.132.73.175 de -62.132.73.176 - 62.132.74.119 nl -62.132.74.120 - 62.132.74.127 de -62.132.74.128 - 62.132.76.167 nl -62.132.76.168 - 62.132.76.175 de -62.132.76.176 - 62.132.77.255 nl -62.132.78.0 - 62.132.79.255 de -62.132.80.0 - 62.132.81.215 nl -62.132.81.216 - 62.132.81.223 de -62.132.81.224 - 62.132.84.255 nl -62.132.85.0 - 62.132.85.7 de -62.132.85.8 - 62.132.86.151 nl -62.132.86.152 - 62.132.86.159 de -62.132.86.160 - 62.132.86.247 nl -62.132.86.248 - 62.132.86.255 de -62.132.87.0 - 62.132.87.39 nl -62.132.87.40 - 62.132.87.47 de -62.132.87.48 - 62.132.87.95 nl -62.132.87.96 - 62.132.87.103 de -62.132.87.104 - 62.132.87.191 nl -62.132.87.192 - 62.132.87.199 de -62.132.87.200 - 62.132.90.199 nl -62.132.90.200 - 62.132.90.207 de -62.132.90.208 - 62.132.90.247 nl -62.132.90.248 - 62.132.90.255 de -62.132.91.0 - 62.132.94.39 nl -62.132.94.40 - 62.132.94.47 de -62.132.94.48 - 62.132.94.79 nl -62.132.94.80 - 62.132.94.87 de -62.132.94.88 - 62.132.95.47 nl -62.132.95.48 - 62.132.95.55 de -62.132.95.56 - 62.132.95.159 nl -62.132.95.160 - 62.132.95.175 de -62.132.95.176 - 62.132.95.207 nl -62.132.95.208 - 62.132.95.215 de -62.132.95.216 - 62.132.95.247 nl -62.132.95.248 - 62.132.95.255 de -62.132.96.0 - 62.132.96.199 nl -62.132.96.200 - 62.132.96.207 de -62.132.96.208 - 62.132.97.135 nl -62.132.97.136 - 62.132.97.143 de -62.132.97.144 - 62.132.98.39 nl -62.132.98.40 - 62.132.98.47 de -62.132.98.48 - 62.132.98.87 nl -62.132.98.88 - 62.132.98.95 de -62.132.98.96 - 62.132.98.111 nl -62.132.98.112 - 62.132.98.119 de -62.132.98.120 - 62.132.98.159 nl -62.132.98.160 - 62.132.98.167 de -62.132.98.168 - 62.132.99.87 nl -62.132.99.88 - 62.132.99.103 de -62.132.99.104 - 62.132.99.143 nl -62.132.99.144 - 62.132.99.151 de -62.132.99.152 - 62.132.99.255 nl -62.132.100.0 - 62.132.100.7 de -62.132.100.8 - 62.132.100.47 nl -62.132.100.48 - 62.132.100.55 de -62.132.100.56 - 62.132.101.71 nl -62.132.101.72 - 62.132.101.79 de -62.132.101.80 - 62.132.101.167 nl -62.132.101.168 - 62.132.101.175 de -62.132.101.176 - 62.132.102.215 nl -62.132.102.216 - 62.132.102.223 de -62.132.102.224 - 62.132.104.7 nl -62.132.104.8 - 62.132.104.15 de -62.132.104.16 - 62.132.105.255 nl -62.132.106.0 - 62.132.107.255 de -62.132.108.0 - 62.132.108.111 nl -62.132.108.112 - 62.132.108.119 de -62.132.108.120 - 62.132.108.143 nl -62.132.108.144 - 62.132.108.151 de -62.132.108.152 - 62.132.109.47 nl -62.132.109.48 - 62.132.109.55 de -62.132.109.56 - 62.132.112.215 nl -62.132.112.216 - 62.132.112.223 de -62.132.112.224 - 62.132.113.135 nl -62.132.113.136 - 62.132.113.143 de -62.132.113.144 - 62.132.113.223 nl -62.132.113.224 - 62.132.113.231 de -62.132.113.232 - 62.132.113.255 nl -62.132.114.0 - 62.132.117.255 de -62.132.118.0 - 62.132.119.47 nl -62.132.119.48 - 62.132.119.55 de -62.132.119.56 - 62.132.121.63 nl -62.132.121.64 - 62.132.121.71 de -62.132.121.72 - 62.132.121.143 nl -62.132.121.144 - 62.132.121.159 de -62.132.121.160 - 62.132.121.247 nl -62.132.121.248 - 62.132.121.255 de -62.132.122.0 - 62.132.122.103 nl -62.132.122.104 - 62.132.122.111 de -62.132.122.112 - 62.132.122.167 nl -62.132.122.168 - 62.132.122.175 de -62.132.122.176 - 62.132.122.239 nl -62.132.122.240 - 62.132.122.247 de -62.132.122.248 - 62.132.123.55 nl -62.132.123.56 - 62.132.123.63 de -62.132.123.64 - 62.132.123.127 nl -62.132.123.128 - 62.132.123.135 de -62.132.123.136 - 62.132.123.215 nl -62.132.123.216 - 62.132.123.231 de -62.132.123.232 - 62.132.124.63 nl -62.132.124.64 - 62.132.124.79 de -62.132.124.80 - 62.132.124.87 nl -62.132.124.88 - 62.132.124.95 de -62.132.124.96 - 62.132.124.127 nl -62.132.124.128 - 62.132.124.135 de -62.132.124.136 - 62.132.124.199 nl -62.132.124.200 - 62.132.124.207 de -62.132.124.208 - 62.132.124.215 nl -62.132.124.216 - 62.132.124.223 de -62.132.124.224 - 62.132.124.239 nl -62.132.124.240 - 62.132.124.247 de -62.132.124.248 - 62.132.125.135 nl -62.132.125.136 - 62.132.125.143 de -62.132.125.144 - 62.132.125.255 nl -62.132.126.0 - 62.132.127.255 de -62.132.128.0 - 62.132.128.183 nl -62.132.128.184 - 62.132.128.191 de -62.132.128.192 - 62.132.129.55 nl -62.132.129.56 - 62.132.129.63 de -62.132.129.64 - 62.132.131.255 nl -62.132.132.0 - 62.132.134.255 de -62.132.135.0 - 62.132.135.31 nl -62.132.135.32 - 62.132.135.39 de -62.132.135.40 - 62.132.137.47 nl -62.132.137.48 - 62.132.137.55 de -62.132.137.56 - 62.132.139.15 nl -62.132.139.16 - 62.132.139.23 de -62.132.139.24 - 62.132.139.63 nl -62.132.139.64 - 62.132.139.71 de -62.132.139.72 - 62.132.139.207 nl -62.132.139.208 - 62.132.139.223 de -62.132.139.224 - 62.132.140.31 nl -62.132.140.32 - 62.132.140.39 de -62.132.140.40 - 62.132.140.167 nl -62.132.140.168 - 62.132.140.175 de -62.132.140.176 - 62.132.141.55 nl -62.132.141.56 - 62.132.141.63 de -62.132.141.64 - 62.132.141.87 nl -62.132.141.88 - 62.132.141.95 de -62.132.141.96 - 62.132.141.119 nl -62.132.141.120 - 62.132.141.127 de -62.132.141.128 - 62.132.141.175 nl -62.132.141.176 - 62.132.141.183 de -62.132.141.184 - 62.132.141.207 nl -62.132.141.208 - 62.132.141.215 de -62.132.141.216 - 62.132.141.231 nl -62.132.141.232 - 62.132.141.239 de -62.132.141.240 - 62.132.142.39 nl -62.132.142.40 - 62.132.142.47 de -62.132.142.48 - 62.132.142.207 nl -62.132.142.208 - 62.132.142.215 de -62.132.142.216 - 62.132.144.7 nl -62.132.144.8 - 62.132.144.15 de -62.132.144.16 - 62.132.144.183 nl -62.132.144.184 - 62.132.144.191 de -62.132.144.192 - 62.132.145.127 nl -62.132.145.128 - 62.132.145.135 de -62.132.145.136 - 62.132.146.151 nl -62.132.146.152 - 62.132.146.159 de -62.132.146.160 - 62.132.146.167 nl -62.132.146.168 - 62.132.146.175 de -62.132.146.176 - 62.132.146.183 nl -62.132.146.184 - 62.132.146.191 de -62.132.146.192 - 62.132.147.47 nl -62.132.147.48 - 62.132.147.63 de -62.132.147.64 - 62.132.148.223 nl -62.132.148.224 - 62.132.148.231 de -62.132.148.232 - 62.132.149.39 nl -62.132.149.40 - 62.132.149.47 de -62.132.149.48 - 62.132.151.7 nl -62.132.151.8 - 62.132.151.15 de -62.132.151.16 - 62.132.151.23 nl -62.132.151.24 - 62.132.151.31 de -62.132.151.32 - 62.132.151.191 nl -62.132.151.192 - 62.132.151.199 de -62.132.151.200 - 62.132.151.223 nl -62.132.151.224 - 62.132.151.231 de -62.132.151.232 - 62.132.151.239 nl -62.132.151.240 - 62.132.151.255 de -62.132.152.0 - 62.132.152.15 nl -62.132.152.16 - 62.132.152.23 de -62.132.152.24 - 62.132.152.47 nl -62.132.152.48 - 62.132.152.55 de -62.132.152.56 - 62.132.152.135 nl -62.132.152.136 - 62.132.152.143 de -62.132.152.144 - 62.132.152.191 nl -62.132.152.192 - 62.132.152.207 de -62.132.152.208 - 62.132.152.231 nl -62.132.152.232 - 62.132.152.239 de -62.132.152.240 - 62.132.152.255 nl -62.132.153.0 - 62.132.156.7 de -62.132.156.8 - 62.132.156.23 nl -62.132.156.24 - 62.132.156.31 de -62.132.156.32 - 62.132.156.255 nl -62.132.157.0 - 62.132.157.7 de -62.132.157.8 - 62.132.157.111 nl -62.132.157.112 - 62.132.157.119 de -62.132.157.120 - 62.132.157.151 nl -62.132.157.152 - 62.132.157.159 de -62.132.157.160 - 62.132.157.207 nl -62.132.157.208 - 62.132.157.215 de -62.132.157.216 - 62.132.158.71 nl -62.132.158.72 - 62.132.158.79 de -62.132.158.80 - 62.132.158.159 nl -62.132.158.160 - 62.132.158.167 de -62.132.158.168 - 62.132.158.223 nl -62.132.158.224 - 62.132.158.231 de -62.132.158.232 - 62.132.158.239 nl -62.132.158.240 - 62.132.158.247 de -62.132.158.248 - 62.132.159.135 nl -62.132.159.136 - 62.132.159.143 de -62.132.159.144 - 62.132.159.199 nl -62.132.159.200 - 62.132.159.207 de -62.132.159.208 - 62.132.160.95 nl -62.132.160.96 - 62.132.160.103 de -62.132.160.104 - 62.132.160.159 nl -62.132.160.160 - 62.132.160.167 de -62.132.160.168 - 62.132.160.231 nl -62.132.160.232 - 62.132.160.239 de -62.132.160.240 - 62.132.161.95 nl -62.132.161.96 - 62.132.161.103 de -62.132.161.104 - 62.132.162.71 nl -62.132.162.72 - 62.132.162.79 de -62.132.162.80 - 62.132.164.183 nl -62.132.164.184 - 62.132.164.199 de -62.132.164.200 - 62.132.165.255 nl -62.132.166.0 - 62.132.168.7 de -62.132.168.8 - 62.132.169.207 nl -62.132.169.208 - 62.132.169.223 de -62.132.169.224 - 62.132.171.151 nl -62.132.171.152 - 62.132.171.159 de -62.132.171.160 - 62.132.171.223 nl -62.132.171.224 - 62.132.171.231 de -62.132.171.232 - 62.132.172.135 nl -62.132.172.136 - 62.132.172.143 de -62.132.172.144 - 62.132.173.63 nl -62.132.173.64 - 62.132.173.71 de -62.132.173.72 - 62.132.174.15 nl -62.132.174.16 - 62.132.174.23 de -62.132.174.24 - 62.132.174.55 nl -62.132.174.56 - 62.132.174.63 de -62.132.174.64 - 62.132.174.135 nl -62.132.174.136 - 62.132.174.143 de -62.132.174.144 - 62.132.174.167 nl -62.132.174.168 - 62.132.174.175 de -62.132.174.176 - 62.132.175.7 nl -62.132.175.8 - 62.132.175.15 de -62.132.175.16 - 62.132.175.223 nl -62.132.175.224 - 62.132.175.231 de -62.132.175.232 - 62.132.176.119 nl -62.132.176.120 - 62.132.176.127 de -62.132.176.128 - 62.132.176.151 nl -62.132.176.152 - 62.132.176.159 de -62.132.176.160 - 62.132.178.159 nl -62.132.178.160 - 62.132.178.167 de -62.132.178.168 - 62.132.180.55 nl -62.132.180.56 - 62.132.180.71 de -62.132.180.72 - 62.132.182.239 nl -62.132.182.240 - 62.132.182.247 de -62.132.182.248 - 62.132.182.255 nl -62.132.183.0 - 62.132.183.7 de -62.132.183.8 - 62.132.183.119 nl -62.132.183.120 - 62.132.183.127 de -62.132.183.128 - 62.132.184.223 nl -62.132.184.224 - 62.132.184.231 de -62.132.184.232 - 62.132.185.71 nl -62.132.185.72 - 62.132.185.79 de -62.132.185.80 - 62.132.185.199 nl -62.132.185.200 - 62.132.185.207 de -62.132.185.208 - 62.132.186.7 nl -62.132.186.8 - 62.132.186.15 de -62.132.186.16 - 62.132.186.55 nl -62.132.186.56 - 62.132.186.63 de -62.132.186.64 - 62.132.186.79 nl -62.132.186.80 - 62.132.186.87 de -62.132.186.88 - 62.132.187.223 nl -62.132.187.224 - 62.132.187.231 de -62.132.187.232 - 62.132.188.71 nl -62.132.188.72 - 62.132.188.79 de -62.132.188.80 - 62.132.188.159 nl -62.132.188.160 - 62.132.188.167 de -62.132.188.168 - 62.132.188.191 nl -62.132.188.192 - 62.132.188.199 de -62.132.188.200 - 62.132.189.87 nl -62.132.189.88 - 62.132.189.95 de -62.132.189.96 - 62.132.190.87 nl -62.132.190.88 - 62.132.190.95 de -62.132.190.96 - 62.132.190.119 nl -62.132.190.120 - 62.132.190.127 de -62.132.190.128 - 62.132.190.255 nl -62.132.191.0 - 62.132.191.7 de -62.132.191.8 - 62.132.194.127 nl -62.132.194.128 - 62.132.194.191 de -62.132.194.192 - 62.132.202.127 nl -62.132.202.128 - 62.132.202.159 de -62.132.202.160 - 62.132.207.255 nl -62.132.208.0 - 62.132.208.7 de -62.132.208.8 - 62.132.209.175 nl -62.132.209.176 - 62.132.209.183 de -62.132.209.184 - 62.132.210.7 nl -62.132.210.8 - 62.132.210.15 de -62.132.210.16 - 62.132.211.151 nl -62.132.211.152 - 62.132.211.159 de -62.132.211.160 - 62.132.211.183 nl -62.132.211.184 - 62.132.211.191 de -62.132.211.192 - 62.132.211.207 nl -62.132.211.208 - 62.132.211.215 de -62.132.211.216 - 62.132.213.143 nl -62.132.213.144 - 62.132.213.151 de -62.132.213.152 - 62.132.213.191 nl -62.132.213.192 - 62.132.213.199 de -62.132.213.200 - 62.132.213.223 nl -62.132.213.224 - 62.132.213.231 de -62.132.213.232 - 62.132.215.95 nl -62.132.215.96 - 62.132.215.103 de -62.132.215.104 - 62.132.215.119 nl -62.132.215.120 - 62.132.215.127 de -62.132.215.128 - 62.132.216.151 nl -62.132.216.152 - 62.132.216.159 de -62.132.216.160 - 62.132.217.7 nl -62.132.217.8 - 62.132.217.15 de -62.132.217.16 - 62.132.217.23 nl -62.132.217.24 - 62.132.217.31 de -62.132.217.32 - 62.132.217.223 nl -62.132.217.224 - 62.132.217.231 de -62.132.217.232 - 62.132.218.31 nl -62.132.218.32 - 62.132.218.39 de -62.132.218.40 - 62.132.218.87 nl -62.132.218.88 - 62.132.218.95 de -62.132.218.96 - 62.132.218.119 nl -62.132.218.120 - 62.132.218.127 de -62.132.218.128 - 62.132.219.7 nl -62.132.219.8 - 62.132.219.15 de -62.132.219.16 - 62.132.220.7 nl -62.132.220.8 - 62.132.220.15 de -62.132.220.16 - 62.132.220.23 nl -62.132.220.24 - 62.132.220.31 de -62.132.220.32 - 62.132.220.143 nl -62.132.220.144 - 62.132.220.151 de -62.132.220.152 - 62.132.220.207 nl -62.132.220.208 - 62.132.220.215 de -62.132.220.216 - 62.132.221.15 nl -62.132.221.16 - 62.132.221.23 de -62.132.221.24 - 62.132.221.175 nl -62.132.221.176 - 62.132.221.183 de -62.132.221.184 - 62.132.222.55 nl -62.132.222.56 - 62.132.222.63 de -62.132.222.64 - 62.132.222.103 nl -62.132.222.104 - 62.132.222.111 de -62.132.222.112 - 62.132.223.39 nl -62.132.223.40 - 62.132.223.47 de -62.132.223.48 - 62.132.223.207 nl -62.132.223.208 - 62.132.223.215 de -62.132.223.216 - 62.132.224.63 nl -62.132.224.64 - 62.132.224.71 de -62.132.224.72 - 62.132.224.159 nl -62.132.224.160 - 62.132.224.167 de -62.132.224.168 - 62.132.225.223 nl -62.132.225.224 - 62.132.225.231 de -62.132.225.232 - 62.132.226.231 nl -62.132.226.232 - 62.132.226.239 de -62.132.226.240 - 62.132.227.15 nl -62.132.227.16 - 62.132.227.23 de -62.132.227.24 - 62.132.227.63 nl -62.132.227.64 - 62.132.227.71 de -62.132.227.72 - 62.132.227.223 nl -62.132.227.224 - 62.132.227.231 de -62.132.227.232 - 62.132.228.7 nl -62.132.228.8 - 62.132.228.23 de -62.132.228.24 - 62.132.228.159 nl -62.132.228.160 - 62.132.228.167 de -62.132.228.168 - 62.132.228.175 nl -62.132.228.176 - 62.132.228.183 de -62.132.228.184 - 62.132.228.223 nl -62.132.228.224 - 62.132.228.231 de -62.132.228.232 - 62.132.229.103 nl -62.132.229.104 - 62.132.229.111 de -62.132.229.112 - 62.132.229.199 nl -62.132.229.200 - 62.132.229.207 de -62.132.229.208 - 62.132.230.95 nl -62.132.230.96 - 62.132.230.111 de -62.132.230.112 - 62.132.230.215 nl -62.132.230.216 - 62.132.230.223 de -62.132.230.224 - 62.132.230.247 nl -62.132.230.248 - 62.132.230.255 de -62.132.231.0 - 62.132.231.15 nl -62.132.231.16 - 62.132.231.31 de -62.132.231.32 - 62.132.231.39 nl -62.132.231.40 - 62.132.231.47 de -62.132.231.48 - 62.132.231.87 nl -62.132.231.88 - 62.132.231.95 de -62.132.231.96 - 62.132.231.183 nl -62.132.231.184 - 62.132.231.191 de -62.132.231.192 - 62.132.231.215 nl -62.132.231.216 - 62.132.231.223 de -62.132.231.224 - 62.132.232.199 nl -62.132.232.200 - 62.132.232.207 de -62.132.232.208 - 62.132.236.159 nl -62.132.236.160 - 62.132.236.167 de -62.132.236.168 - 62.132.237.175 nl -62.132.237.176 - 62.132.237.183 de -62.132.237.184 - 62.132.237.231 nl -62.132.237.232 - 62.132.237.239 de -62.132.237.240 - 62.132.238.199 nl -62.132.238.200 - 62.132.238.207 de -62.132.238.208 - 62.132.238.215 nl -62.132.238.216 - 62.132.238.223 de -62.132.238.224 - 62.132.238.231 nl -62.132.238.232 - 62.132.238.239 de -62.132.238.240 - 62.132.240.7 nl -62.132.240.8 - 62.132.240.15 de -62.132.240.16 - 62.132.241.231 nl -62.132.241.232 - 62.132.241.239 de -62.132.241.240 - 62.132.242.31 nl -62.132.242.32 - 62.132.242.39 de -62.132.242.40 - 62.132.242.215 nl -62.132.242.216 - 62.132.242.223 de -62.132.242.224 - 62.132.242.247 nl -62.132.242.248 - 62.132.242.255 de -62.132.243.0 - 62.132.243.15 nl -62.132.243.16 - 62.132.243.23 de -62.132.243.24 - 62.132.243.39 nl -62.132.243.40 - 62.132.243.47 de -62.132.243.48 - 62.132.244.95 nl -62.132.244.96 - 62.132.244.103 de -62.132.244.104 - 62.132.245.71 nl -62.132.245.72 - 62.132.245.87 de -62.132.245.88 - 62.132.246.47 nl -62.132.246.48 - 62.132.246.55 de -62.132.246.56 - 62.132.246.79 nl -62.132.246.80 - 62.132.246.87 de -62.132.246.88 - 62.132.246.191 nl -62.132.246.192 - 62.132.246.199 de -62.132.246.200 - 62.132.246.207 nl -62.132.246.208 - 62.132.246.215 de -62.132.246.216 - 62.132.247.239 nl -62.132.247.240 - 62.132.247.247 de -62.132.247.248 - 62.132.248.199 nl -62.132.248.200 - 62.132.248.207 de -62.132.248.208 - 62.132.248.215 nl -62.132.248.216 - 62.132.248.231 de -62.132.248.232 - 62.132.250.191 nl -62.132.250.192 - 62.132.250.199 de -62.132.250.200 - 62.132.250.215 nl -62.132.250.216 - 62.132.250.223 de -62.132.250.224 - 62.132.250.247 nl -62.132.250.248 - 62.132.250.255 de -62.132.251.0 - 62.132.251.47 nl -62.132.251.48 - 62.132.251.55 de -62.132.251.56 - 62.132.251.127 nl -62.132.251.128 - 62.132.251.135 de -62.132.251.136 - 62.132.251.183 nl -62.132.251.184 - 62.132.251.191 de -62.132.251.192 - 62.132.252.15 nl -62.132.252.16 - 62.132.252.23 de -62.132.252.24 - 62.132.253.159 nl -62.132.253.160 - 62.132.253.167 de -62.132.253.168 - 62.132.253.183 nl -62.132.253.184 - 62.132.253.191 de -62.132.253.192 - 62.132.255.255 nl +62.131.0.0 - 62.132.255.255 nl 62.133.0.0 - 62.133.31.255 gb -62.133.32.0 - 62.133.63.255 it 62.133.64.0 - 62.133.127.255 nl 62.133.128.0 - 62.133.159.255 pl 62.133.160.0 - 62.133.191.255 ru -62.133.192.0 - 62.133.194.63 nl -62.133.194.64 - 62.133.194.95 be -62.133.194.96 - 62.133.200.87 nl -62.133.200.88 - 62.133.200.95 be -62.133.200.96 - 62.133.255.255 nl -62.134.0.0 - 62.134.2.127 eu -62.134.2.128 - 62.134.2.159 de -62.134.2.160 - 62.134.7.55 eu -62.134.7.56 - 62.134.7.60 de -62.134.7.61 - 62.134.8.63 eu -62.134.8.64 - 62.134.8.127 de -62.134.8.128 - 62.134.13.175 eu -62.134.13.176 - 62.134.13.183 de -62.134.13.184 - 62.134.16.127 eu -62.134.16.128 - 62.134.16.255 de -62.134.17.0 - 62.134.19.255 eu -62.134.20.0 - 62.134.23.79 de -62.134.23.80 - 62.134.27.159 eu -62.134.27.160 - 62.134.27.167 de -62.134.27.168 - 62.134.27.168 eu -62.134.27.169 - 62.134.27.174 de -62.134.27.175 - 62.134.27.175 eu -62.134.27.176 - 62.134.27.191 de -62.134.27.192 - 62.134.27.255 eu -62.134.28.0 - 62.134.28.63 de -62.134.28.64 - 62.134.28.127 eu -62.134.28.128 - 62.134.31.255 de -62.134.32.0 - 62.134.35.255 eu -62.134.36.0 - 62.134.37.255 de -62.134.38.0 - 62.134.38.191 eu -62.134.38.192 - 62.134.39.95 de -62.134.39.96 - 62.134.39.255 eu -62.134.40.0 - 62.134.44.15 de -62.134.44.16 - 62.134.44.31 eu -62.134.44.32 - 62.134.44.47 de -62.134.44.48 - 62.134.44.79 eu -62.134.44.80 - 62.134.44.251 de -62.134.44.252 - 62.134.44.255 eu -62.134.45.0 - 62.134.45.55 de -62.134.45.56 - 62.134.45.67 eu -62.134.45.68 - 62.134.45.71 de -62.134.45.72 - 62.134.45.79 eu -62.134.45.80 - 62.134.45.87 de -62.134.45.88 - 62.134.45.95 eu -62.134.45.96 - 62.134.45.223 de -62.134.45.224 - 62.134.45.231 eu -62.134.45.232 - 62.134.45.239 de -62.134.45.240 - 62.134.47.255 eu -62.134.48.0 - 62.134.48.255 de -62.134.49.0 - 62.134.49.31 eu -62.134.49.32 - 62.134.49.63 de -62.134.49.64 - 62.134.49.255 eu -62.134.50.0 - 62.134.52.79 de -62.134.52.80 - 62.134.52.96 eu -62.134.52.97 - 62.134.52.135 de -62.134.52.136 - 62.134.52.159 eu -62.134.52.160 - 62.134.52.167 de -62.134.52.168 - 62.134.52.192 eu -62.134.52.193 - 62.134.52.254 de -62.134.52.255 - 62.134.53.39 eu -62.134.53.40 - 62.134.53.159 de -62.134.53.160 - 62.134.53.175 eu -62.134.53.176 - 62.134.53.239 de -62.134.53.240 - 62.134.54.127 eu -62.134.54.128 - 62.134.55.127 de -62.134.55.128 - 62.134.55.191 eu -62.134.55.192 - 62.134.56.127 de -62.134.56.128 - 62.134.61.255 eu -62.134.62.0 - 62.134.62.79 de -62.134.62.80 - 62.134.62.95 eu -62.134.62.96 - 62.134.62.111 de -62.134.62.112 - 62.134.62.127 eu -62.134.62.128 - 62.134.63.31 de -62.134.63.32 - 62.134.68.255 eu -62.134.69.0 - 62.134.69.255 de -62.134.70.0 - 62.134.127.255 eu -62.134.128.0 - 62.134.128.31 de -62.134.128.32 - 62.134.128.191 eu -62.134.128.192 - 62.134.128.255 de -62.134.129.0 - 62.134.132.255 eu -62.134.133.0 - 62.134.136.255 de -62.134.137.0 - 62.134.137.63 eu -62.134.137.64 - 62.134.137.127 de -62.134.137.128 - 62.134.137.255 eu -62.134.138.0 - 62.134.143.255 de -62.134.144.0 - 62.134.147.255 eu -62.134.148.0 - 62.134.148.7 de -62.134.148.8 - 62.134.148.255 eu -62.134.149.0 - 62.134.157.127 de -62.134.157.128 - 62.134.157.151 eu -62.134.157.152 - 62.134.157.159 de -62.134.157.160 - 62.134.157.175 eu -62.134.157.176 - 62.134.157.207 de -62.134.157.208 - 62.134.157.239 eu -62.134.157.240 - 62.134.157.254 de -62.134.157.255 - 62.134.157.255 eu -62.134.158.0 - 62.134.167.255 de -62.134.168.0 - 62.134.168.0 eu -62.134.168.1 - 62.134.168.2 de -62.134.168.3 - 62.134.169.255 eu -62.134.170.0 - 62.134.185.127 de -62.134.185.128 - 62.134.185.135 fr -62.134.185.136 - 62.134.185.139 ru -62.134.185.140 - 62.134.185.167 de -62.134.185.168 - 62.134.185.175 ma -62.134.185.176 - 62.134.185.183 de -62.134.185.184 - 62.134.185.191 fr -62.134.185.192 - 62.134.185.239 de -62.134.185.240 - 62.134.185.255 nl -62.134.186.0 - 62.134.186.15 de -62.134.186.16 - 62.134.186.31 fr -62.134.186.32 - 62.134.190.127 de -62.134.190.128 - 62.134.190.191 ge -62.134.190.192 - 62.134.198.223 de -62.134.198.224 - 62.134.198.231 fr -62.134.198.232 - 62.134.203.159 de -62.134.203.160 - 62.134.203.191 us -62.134.203.192 - 62.134.223.255 de -62.134.224.0 - 62.134.224.255 eu -62.134.225.0 - 62.134.244.191 de -62.134.244.192 - 62.134.244.223 eu -62.134.244.224 - 62.134.245.207 de -62.134.245.208 - 62.134.245.231 eu -62.134.245.232 - 62.134.245.235 de -62.134.245.236 - 62.134.245.255 eu -62.134.246.0 - 62.134.246.99 de -62.134.246.100 - 62.134.246.103 eu -62.134.246.104 - 62.134.246.191 de -62.134.246.192 - 62.134.246.207 eu -62.134.246.208 - 62.134.247.175 de -62.134.247.176 - 62.134.247.183 eu -62.134.247.184 - 62.134.247.191 de -62.134.247.192 - 62.134.247.199 eu -62.134.247.200 - 62.134.247.251 de -62.134.247.252 - 62.134.247.255 eu -62.134.248.0 - 62.134.255.255 de +62.133.192.0 - 62.133.255.255 nl +62.134.0.0 - 62.134.40.255 eu +62.134.41.0 - 62.134.42.255 de +62.134.43.0 - 62.134.143.255 eu +62.134.144.0 - 62.134.144.255 de +62.134.145.0 - 62.134.151.255 eu +62.134.152.0 - 62.134.155.255 de +62.134.156.0 - 62.134.183.255 eu +62.134.184.0 - 62.134.191.255 de +62.134.192.0 - 62.134.192.255 eu +62.134.193.0 - 62.134.207.255 de +62.134.208.0 - 62.134.224.255 eu +62.134.225.0 - 62.134.234.255 de +62.134.235.0 - 62.134.239.255 eu +62.134.240.0 - 62.134.243.255 de +62.134.244.0 - 62.134.244.63 eu +62.134.244.64 - 62.134.244.191 de +62.134.244.192 - 62.134.245.157 eu +62.134.245.158 - 62.134.245.158 de +62.134.245.159 - 62.134.255.255 eu 62.135.0.0 - 62.135.127.255 eg 62.135.128.0 - 62.135.255.255 dk 62.136.0.0 - 62.137.255.255 gb 62.138.0.0 - 62.138.255.255 de 62.139.0.0 - 62.139.255.255 eg -62.140.0.0 - 62.140.0.191 de -62.140.0.192 - 62.140.0.255 gb -62.140.1.0 - 62.140.1.127 de -62.140.1.128 - 62.140.1.255 gb -62.140.2.0 - 62.140.2.15 de -62.140.2.16 - 62.140.2.127 gb -62.140.2.128 - 62.140.2.191 de -62.140.2.192 - 62.140.5.255 gb -62.140.6.0 - 62.140.6.255 de -62.140.7.0 - 62.140.9.255 gb -62.140.10.0 - 62.140.10.255 de -62.140.11.0 - 62.140.12.207 gb -62.140.12.208 - 62.140.12.215 de -62.140.12.216 - 62.140.12.223 gb -62.140.12.224 - 62.140.12.247 de -62.140.12.248 - 62.140.13.127 gb -62.140.13.128 - 62.140.13.191 de -62.140.13.192 - 62.140.13.255 gb -62.140.14.0 - 62.140.14.255 de -62.140.15.0 - 62.140.15.63 gb -62.140.15.64 - 62.140.15.127 de -62.140.15.128 - 62.140.15.255 gb +62.140.0.0 - 62.140.15.255 gb 62.140.16.0 - 62.140.23.255 de -62.140.24.0 - 62.140.24.95 gb -62.140.24.96 - 62.140.24.111 de -62.140.24.112 - 62.140.27.255 gb -62.140.28.0 - 62.140.29.79 de -62.140.29.80 - 62.140.29.127 gb +62.140.24.0 - 62.140.24.80 gb +62.140.24.81 - 62.140.24.81 de +62.140.24.82 - 62.140.29.127 gb 62.140.29.128 - 62.140.29.191 de -62.140.29.192 - 62.140.29.255 gb -62.140.30.0 - 62.140.30.31 de -62.140.30.32 - 62.140.30.63 gb -62.140.30.64 - 62.140.30.143 de -62.140.30.144 - 62.140.30.255 gb -62.140.31.0 - 62.140.31.255 de +62.140.29.192 - 62.140.31.255 gb 62.140.32.0 - 62.140.63.255 at 62.140.64.0 - 62.140.127.255 eg -62.140.128.0 - 62.140.166.127 nl -62.140.166.128 - 62.140.166.255 gb -62.140.167.0 - 62.140.167.63 lu -62.140.167.64 - 62.140.167.127 nl -62.140.167.128 - 62.140.167.191 be -62.140.167.192 - 62.140.167.255 nl -62.140.168.0 - 62.140.168.127 de -62.140.168.128 - 62.140.168.191 be -62.140.168.192 - 62.140.168.255 at -62.140.169.0 - 62.140.169.63 ch -62.140.169.64 - 62.140.169.127 es -62.140.169.128 - 62.140.169.191 fr -62.140.169.192 - 62.140.169.255 gb -62.140.170.0 - 62.140.176.127 nl -62.140.176.128 - 62.140.177.255 ch -62.140.178.0 - 62.140.181.255 nl -62.140.182.0 - 62.140.182.255 de -62.140.183.0 - 62.140.191.255 nl +62.140.128.0 - 62.140.191.255 nl 62.140.192.0 - 62.140.223.255 gb -62.140.224.0 - 62.140.255.255 ru +62.140.224.0 - 62.140.238.255 ru +62.140.239.0 - 62.140.239.240 ua +62.140.239.241 - 62.140.239.241 ru +62.140.239.242 - 62.140.239.255 ua +62.140.240.0 - 62.140.255.255 ru 62.141.0.0 - 62.141.31.255 cz 62.141.32.0 - 62.141.63.255 de 62.141.64.0 - 62.141.127.255 ru 62.141.128.0 - 62.141.159.255 no 62.141.160.0 - 62.141.191.255 de 62.141.192.0 - 62.141.255.255 pl -62.142.0.0 - 62.142.72.111 fi -62.142.72.112 - 62.142.72.119 ax -62.142.72.120 - 62.142.95.255 fi -62.142.96.0 - 62.142.96.15 gb -62.142.96.16 - 62.142.255.255 fi -62.143.0.0 - 62.144.111.103 de -62.144.111.104 - 62.144.111.111 us -62.144.111.112 - 62.145.31.255 de -62.145.32.0 - 62.145.63.255 nl -62.145.64.0 - 62.145.65.255 gb -62.145.66.0 - 62.145.67.255 nl -62.145.68.0 - 62.145.68.255 lb -62.145.69.0 - 62.145.69.255 dz -62.145.70.0 - 62.145.73.255 gb -62.145.74.0 - 62.145.74.255 nl -62.145.75.0 - 62.145.75.255 gb -62.145.76.0 - 62.145.76.255 a2 -62.145.77.0 - 62.145.77.255 us -62.145.78.0 - 62.145.78.255 gb -62.145.79.0 - 62.145.79.255 nl -62.145.80.0 - 62.145.88.255 gb -62.145.89.0 - 62.145.89.159 ir -62.145.89.160 - 62.145.89.191 ma -62.145.89.192 - 62.145.89.255 ir -62.145.90.0 - 62.145.91.255 nl -62.145.92.0 - 62.145.92.127 lb -62.145.92.128 - 62.145.92.255 ir -62.145.93.0 - 62.145.93.255 gb -62.145.94.0 - 62.145.95.255 nl -62.145.96.0 - 62.145.99.255 ir -62.145.100.0 - 62.145.103.255 nl +62.142.0.0 - 62.142.255.255 fi +62.143.0.0 - 62.145.31.255 de +62.145.32.0 - 62.145.34.255 nl +62.145.35.0 - 62.145.35.255 a2 +62.145.36.0 - 62.145.36.255 nl +62.145.37.0 - 62.145.37.255 bw +62.145.38.0 - 62.145.39.255 nl +62.145.40.0 - 62.145.47.255 de +62.145.48.0 - 62.145.63.255 nl +62.145.64.0 - 62.145.103.255 gb 62.145.104.0 - 62.145.107.255 iq -62.145.108.0 - 62.145.108.255 gb -62.145.109.0 - 62.145.109.255 ir -62.145.110.0 - 62.145.127.255 nl +62.145.108.0 - 62.145.127.255 gb 62.145.128.0 - 62.145.159.255 is 62.145.160.0 - 62.145.191.255 fi 62.145.192.0 - 62.145.255.255 nl -62.146.0.0 - 62.146.6.199 de -62.146.6.200 - 62.146.6.207 it -62.146.6.208 - 62.146.7.207 de -62.146.7.208 - 62.146.7.223 ca -62.146.7.224 - 62.146.9.111 de -62.146.9.112 - 62.146.9.119 pl -62.146.9.120 - 62.146.9.143 de -62.146.9.144 - 62.146.9.151 es -62.146.9.152 - 62.146.11.63 de -62.146.11.64 - 62.146.11.95 dk -62.146.11.96 - 62.146.16.239 de -62.146.16.240 - 62.146.16.255 ae -62.146.17.0 - 62.146.19.127 de -62.146.19.128 - 62.146.19.191 it -62.146.19.192 - 62.146.19.255 de -62.146.20.0 - 62.146.20.7 es -62.146.20.8 - 62.146.20.159 de -62.146.20.160 - 62.146.20.191 dk -62.146.20.192 - 62.146.20.255 pl -62.146.21.0 - 62.146.23.255 de -62.146.24.0 - 62.146.24.255 pl -62.146.25.0 - 62.146.25.223 de -62.146.25.224 - 62.146.25.255 dk -62.146.26.0 - 62.146.28.223 de -62.146.28.224 - 62.146.28.239 ch -62.146.28.240 - 62.146.34.95 de -62.146.34.96 - 62.146.34.111 ae -62.146.34.112 - 62.146.39.63 de -62.146.39.64 - 62.146.39.159 pl -62.146.39.160 - 62.146.42.15 de -62.146.42.16 - 62.146.42.31 es -62.146.42.32 - 62.146.42.111 de -62.146.42.112 - 62.146.42.127 ae -62.146.42.128 - 62.146.47.255 de -62.146.48.0 - 62.146.48.15 ae -62.146.48.16 - 62.146.48.127 de -62.146.48.128 - 62.146.48.159 dk -62.146.48.160 - 62.146.49.175 de -62.146.49.176 - 62.146.49.183 nl -62.146.49.184 - 62.146.49.191 gb -62.146.49.192 - 62.146.51.63 de -62.146.51.64 - 62.146.51.95 ae -62.146.51.96 - 62.146.52.159 de -62.146.52.160 - 62.146.52.191 ae -62.146.52.192 - 62.146.56.127 de -62.146.56.128 - 62.146.56.143 ae -62.146.56.144 - 62.146.61.127 de -62.146.61.128 - 62.146.61.255 it -62.146.62.0 - 62.146.67.95 de -62.146.67.96 - 62.146.67.127 ae -62.146.67.128 - 62.146.67.255 es -62.146.68.0 - 62.146.68.255 pl -62.146.69.0 - 62.146.73.31 de -62.146.73.32 - 62.146.73.63 it -62.146.73.64 - 62.146.75.239 de -62.146.75.240 - 62.146.75.255 ae -62.146.76.0 - 62.146.76.15 ch -62.146.76.16 - 62.146.81.63 de -62.146.81.64 - 62.146.81.95 ae -62.146.81.96 - 62.146.83.127 de -62.146.83.128 - 62.146.83.143 ch -62.146.83.144 - 62.146.87.191 de -62.146.87.192 - 62.146.87.223 es -62.146.87.224 - 62.146.88.159 de -62.146.88.160 - 62.146.88.175 ae -62.146.88.176 - 62.146.89.103 de -62.146.89.104 - 62.146.89.111 at -62.146.89.112 - 62.146.91.191 de -62.146.91.192 - 62.146.91.223 ae -62.146.91.224 - 62.146.104.31 de -62.146.104.32 - 62.146.104.63 ae -62.146.104.64 - 62.146.105.95 de -62.146.105.96 - 62.146.105.111 es -62.146.105.112 - 62.146.105.215 de -62.146.105.216 - 62.146.105.223 it -62.146.105.224 - 62.146.107.31 de -62.146.107.32 - 62.146.107.63 dk -62.146.107.64 - 62.146.109.191 de -62.146.109.192 - 62.146.109.207 ae -62.146.109.208 - 62.146.112.255 de -62.146.113.0 - 62.146.113.255 pl -62.146.114.0 - 62.146.114.167 de -62.146.114.168 - 62.146.114.175 at -62.146.114.176 - 62.146.122.255 de -62.146.123.0 - 62.146.123.255 pl -62.146.124.0 - 62.146.151.255 de +62.146.0.0 - 62.146.151.255 de 62.146.152.0 - 62.146.155.255 ch -62.146.156.0 - 62.146.240.63 de -62.146.240.64 - 62.146.240.71 pl -62.146.240.72 - 62.146.240.199 de -62.146.240.200 - 62.146.240.207 ae -62.146.240.208 - 62.146.255.255 de +62.146.156.0 - 62.146.255.255 de 62.147.0.0 - 62.147.255.255 fr 62.148.0.0 - 62.148.31.255 ru 62.148.32.0 - 62.148.63.255 no @@ -12951,470 +13295,54 @@ 62.148.96.0 - 62.148.127.255 fi 62.148.128.0 - 62.148.159.255 ru 62.148.160.0 - 62.148.191.255 nl -62.148.192.0 - 62.148.197.239 fi -62.148.197.240 - 62.148.197.247 ax -62.148.197.248 - 62.148.223.255 fi +62.148.192.0 - 62.148.223.255 fi 62.148.224.0 - 62.148.255.255 ru 62.149.0.0 - 62.149.31.255 ua 62.149.32.0 - 62.149.63.255 gb 62.149.64.0 - 62.149.127.255 sa 62.149.128.0 - 62.149.255.255 it -62.150.0.0 - 62.150.255.255 kw +62.150.0.0 - 62.150.90.255 kw +62.150.91.0 - 62.150.92.255 us +62.150.93.0 - 62.150.117.250 kw +62.150.117.251 - 62.150.117.251 us +62.150.117.252 - 62.150.120.255 kw +62.150.121.0 - 62.150.121.255 us +62.150.122.0 - 62.150.255.255 kw 62.151.0.0 - 62.151.255.255 es 62.152.0.0 - 62.152.31.255 cy 62.152.32.0 - 62.152.95.255 ru -62.152.96.0 - 62.152.115.183 it -62.152.115.184 - 62.152.115.191 es -62.152.115.192 - 62.152.127.255 it +62.152.96.0 - 62.152.127.255 it 62.152.128.0 - 62.152.159.255 pl 62.152.160.0 - 62.152.191.255 de 62.152.192.0 - 62.152.223.255 ru -62.152.224.0 - 62.152.227.23 sk -62.152.227.24 - 62.152.227.31 sr -62.152.227.32 - 62.152.255.255 sk -62.153.0.0 - 62.153.119.71 de -62.153.119.72 - 62.153.119.79 pl -62.153.119.80 - 62.153.126.63 de -62.153.126.64 - 62.153.126.79 be -62.153.126.80 - 62.154.157.103 de -62.154.157.104 - 62.154.157.111 gb -62.154.157.112 - 62.154.236.255 de -62.154.237.0 - 62.154.237.31 us -62.154.237.32 - 62.156.155.23 de -62.156.155.24 - 62.156.155.31 nl -62.156.155.32 - 62.156.235.223 de -62.156.235.224 - 62.156.235.231 it -62.156.235.232 - 62.157.101.159 de -62.157.101.160 - 62.157.101.167 us -62.157.101.168 - 62.157.112.31 de -62.157.112.32 - 62.157.112.63 ca -62.157.112.64 - 62.157.120.239 de -62.157.120.240 - 62.157.120.255 a2 -62.157.121.0 - 62.157.179.39 de -62.157.179.40 - 62.157.179.47 ch -62.157.179.48 - 62.159.46.111 de -62.159.46.112 - 62.159.46.119 ch -62.159.46.120 - 62.159.53.223 de -62.159.53.224 - 62.159.53.255 be -62.159.54.0 - 62.159.73.255 de -62.159.74.0 - 62.159.74.255 gb -62.159.75.0 - 62.159.155.135 de -62.159.155.136 - 62.159.155.143 nl -62.159.155.144 - 62.159.223.207 de -62.159.223.208 - 62.159.223.215 it -62.159.223.216 - 62.159.233.255 de -62.159.234.0 - 62.159.234.255 fr -62.159.235.0 - 62.159.253.95 de -62.159.253.96 - 62.159.253.103 sg -62.159.253.104 - 62.159.255.255 de -62.160.0.0 - 62.160.12.246 fr -62.160.12.247 - 62.160.12.247 be -62.160.12.248 - 62.160.16.87 fr -62.160.16.88 - 62.160.16.95 de -62.160.16.96 - 62.160.17.1 fr -62.160.17.2 - 62.160.17.2 be -62.160.17.3 - 62.160.17.198 fr -62.160.17.199 - 62.160.17.199 be -62.160.17.200 - 62.160.41.63 fr -62.160.41.64 - 62.160.41.71 dk -62.160.41.72 - 62.160.42.191 fr -62.160.42.192 - 62.160.42.199 gb -62.160.42.200 - 62.160.44.193 fr -62.160.44.194 - 62.160.44.194 lu -62.160.44.195 - 62.160.115.31 fr -62.160.115.32 - 62.160.115.39 de -62.160.115.40 - 62.160.120.210 fr -62.160.120.211 - 62.160.120.211 be -62.160.120.212 - 62.160.123.21 fr -62.160.123.22 - 62.160.123.22 gb -62.160.123.23 - 62.160.194.15 fr -62.160.194.16 - 62.160.194.23 de -62.160.194.24 - 62.160.204.87 fr -62.160.204.88 - 62.160.204.95 gb -62.160.204.96 - 62.160.207.191 fr -62.160.207.192 - 62.160.207.199 de -62.160.207.200 - 62.160.226.138 fr -62.160.226.139 - 62.160.226.139 gb -62.160.226.140 - 62.161.96.212 fr -62.161.96.213 - 62.161.96.213 gb -62.161.96.214 - 62.161.106.29 fr -62.161.106.30 - 62.161.106.30 be -62.161.106.31 - 62.161.109.73 fr -62.161.109.74 - 62.161.109.74 be -62.161.109.75 - 62.161.109.137 fr -62.161.109.138 - 62.161.109.138 be -62.161.109.139 - 62.161.116.167 fr -62.161.116.168 - 62.161.116.174 ch -62.161.116.175 - 62.161.255.255 fr +62.152.224.0 - 62.152.255.255 sk +62.153.0.0 - 62.153.226.255 de +62.153.227.0 - 62.153.227.255 eu +62.153.228.0 - 62.156.233.255 de +62.156.234.0 - 62.156.234.119 gb +62.156.234.120 - 62.156.234.127 de +62.156.234.128 - 62.156.234.255 gb +62.156.235.0 - 62.159.76.255 de +62.159.77.0 - 62.159.77.73 eu +62.159.77.74 - 62.159.77.74 de +62.159.77.75 - 62.159.77.255 eu +62.159.78.0 - 62.159.255.255 de +62.160.0.0 - 62.161.255.255 fr 62.162.0.0 - 62.162.255.255 mk 62.163.0.0 - 62.163.255.255 nl -62.164.0.0 - 62.164.21.255 eu -62.164.22.0 - 62.164.22.255 es -62.164.23.0 - 62.164.30.255 eu -62.164.31.0 - 62.164.31.255 es -62.164.32.0 - 62.164.39.255 eu -62.164.40.0 - 62.164.40.255 es -62.164.41.0 - 62.164.51.255 eu -62.164.52.0 - 62.164.52.255 es -62.164.53.0 - 62.164.127.255 eu +62.164.0.0 - 62.164.127.255 eu 62.164.128.0 - 62.164.255.255 gb 62.165.0.0 - 62.165.63.255 ru 62.165.64.0 - 62.165.127.255 nl 62.165.128.0 - 62.165.191.255 fi 62.165.192.0 - 62.165.255.255 hu -62.166.0.0 - 62.166.69.255 nl -62.166.70.0 - 62.166.71.255 be -62.166.72.0 - 62.166.118.255 nl -62.166.119.0 - 62.166.119.255 be -62.166.120.0 - 62.166.123.255 nl -62.166.124.0 - 62.166.127.255 be -62.166.128.0 - 62.166.129.255 nl -62.166.130.0 - 62.166.130.15 be -62.166.130.16 - 62.166.130.23 nl -62.166.130.24 - 62.166.130.39 be -62.166.130.40 - 62.166.130.47 nl -62.166.130.48 - 62.166.130.63 be -62.166.130.64 - 62.166.130.79 nl -62.166.130.80 - 62.166.130.127 be -62.166.130.128 - 62.166.130.143 nl -62.166.130.144 - 62.166.130.167 be -62.166.130.168 - 62.166.130.175 nl -62.166.130.176 - 62.166.130.207 be -62.166.130.208 - 62.166.130.215 nl -62.166.130.216 - 62.166.130.231 be -62.166.130.232 - 62.166.130.239 nl -62.166.130.240 - 62.166.131.23 be -62.166.131.24 - 62.166.131.63 nl -62.166.131.64 - 62.166.131.71 be -62.166.131.72 - 62.166.131.79 nl -62.166.131.80 - 62.166.131.111 be -62.166.131.112 - 62.166.131.119 nl -62.166.131.120 - 62.166.131.175 be -62.166.131.176 - 62.166.131.191 nl -62.166.131.192 - 62.166.131.247 be -62.166.131.248 - 62.166.131.255 nl -62.166.132.0 - 62.166.133.39 be -62.166.133.40 - 62.166.133.47 nl -62.166.133.48 - 62.166.133.71 be -62.166.133.72 - 62.166.133.83 nl -62.166.133.84 - 62.166.133.175 be -62.166.133.176 - 62.166.133.191 nl -62.166.133.192 - 62.166.133.215 be -62.166.133.216 - 62.166.133.247 nl -62.166.133.248 - 62.166.134.23 be -62.166.134.24 - 62.166.134.31 nl -62.166.134.32 - 62.166.134.39 be -62.166.134.40 - 62.166.134.63 nl -62.166.134.64 - 62.166.134.159 be -62.166.134.160 - 62.166.134.167 nl -62.166.134.168 - 62.166.134.207 be -62.166.134.208 - 62.166.134.239 nl -62.166.134.240 - 62.166.135.23 be -62.166.135.24 - 62.166.135.39 nl -62.166.135.40 - 62.166.135.119 be -62.166.135.120 - 62.166.135.127 nl -62.166.135.128 - 62.166.135.199 be -62.166.135.200 - 62.166.135.223 nl -62.166.135.224 - 62.166.136.23 be -62.166.136.24 - 62.166.136.47 nl -62.166.136.48 - 62.166.136.63 be -62.166.136.64 - 62.166.136.95 nl -62.166.136.96 - 62.166.136.103 be -62.166.136.104 - 62.166.136.223 nl -62.166.136.224 - 62.166.136.231 be -62.166.136.232 - 62.166.136.247 nl -62.166.136.248 - 62.166.137.7 be -62.166.137.8 - 62.166.137.23 nl -62.166.137.24 - 62.166.137.31 be -62.166.137.32 - 62.166.137.151 nl -62.166.137.152 - 62.166.137.167 be -62.166.137.168 - 62.166.137.175 nl -62.166.137.176 - 62.166.137.183 be -62.166.137.184 - 62.166.137.191 nl -62.166.137.192 - 62.166.137.215 be -62.166.137.216 - 62.166.137.231 nl -62.166.137.232 - 62.166.137.247 be -62.166.137.248 - 62.166.138.23 nl -62.166.138.24 - 62.166.138.39 be -62.166.138.40 - 62.166.138.87 nl -62.166.138.88 - 62.166.138.111 be -62.166.138.112 - 62.166.138.127 nl -62.166.138.128 - 62.166.138.159 be -62.166.138.160 - 62.166.138.223 nl -62.166.138.224 - 62.166.138.231 be -62.166.138.232 - 62.166.139.7 nl -62.166.139.8 - 62.166.139.15 be -62.166.139.16 - 62.166.139.31 nl -62.166.139.32 - 62.166.139.55 be -62.166.139.56 - 62.166.139.103 nl -62.166.139.104 - 62.166.139.119 be -62.166.139.120 - 62.166.139.127 nl -62.166.139.128 - 62.166.139.135 be -62.166.139.136 - 62.166.139.143 nl -62.166.139.144 - 62.166.139.151 be -62.166.139.152 - 62.166.139.167 nl -62.166.139.168 - 62.166.139.207 be -62.166.139.208 - 62.166.139.255 nl -62.166.140.0 - 62.166.142.159 be -62.166.142.160 - 62.166.142.167 nl -62.166.142.168 - 62.166.143.31 be -62.166.143.32 - 62.166.143.39 nl -62.166.143.40 - 62.166.143.135 be -62.166.143.136 - 62.166.143.143 nl -62.166.143.144 - 62.166.143.231 be -62.166.143.232 - 62.166.143.239 nl -62.166.143.240 - 62.166.143.255 be -62.166.144.0 - 62.166.144.1 nl -62.166.144.2 - 62.166.144.15 be -62.166.144.16 - 62.166.144.55 nl -62.166.144.56 - 62.166.144.63 be -62.166.144.64 - 62.166.144.127 nl -62.166.144.128 - 62.166.144.135 be -62.166.144.136 - 62.166.144.199 nl -62.166.144.200 - 62.166.144.215 be -62.166.144.216 - 62.166.145.15 nl -62.166.145.16 - 62.166.145.31 be -62.166.145.32 - 62.166.145.39 nl -62.166.145.40 - 62.166.145.47 be -62.166.145.48 - 62.166.145.55 nl -62.166.145.56 - 62.166.145.79 be -62.166.145.80 - 62.166.145.95 nl -62.166.145.96 - 62.166.145.119 be -62.166.145.120 - 62.166.145.151 nl -62.166.145.152 - 62.166.145.159 be -62.166.145.160 - 62.166.145.175 nl -62.166.145.176 - 62.166.145.191 be -62.166.145.192 - 62.166.145.199 nl -62.166.145.200 - 62.166.145.215 be -62.166.145.216 - 62.166.146.23 nl -62.166.146.24 - 62.166.146.31 be -62.166.146.32 - 62.166.146.55 nl -62.166.146.56 - 62.166.146.71 be -62.166.146.72 - 62.166.146.79 nl -62.166.146.80 - 62.166.146.87 be -62.166.146.88 - 62.166.146.119 nl -62.166.146.120 - 62.166.146.127 be -62.166.146.128 - 62.166.146.135 nl -62.166.146.136 - 62.166.146.143 be -62.166.146.144 - 62.166.146.167 nl -62.166.146.168 - 62.166.146.183 be -62.166.146.184 - 62.166.146.215 nl -62.166.146.216 - 62.166.146.231 be -62.166.146.232 - 62.166.146.247 nl -62.166.146.248 - 62.166.146.255 be -62.166.147.0 - 62.166.147.15 nl -62.166.147.16 - 62.166.147.39 be -62.166.147.40 - 62.166.147.71 nl -62.166.147.72 - 62.166.147.79 be -62.166.147.80 - 62.166.147.111 nl -62.166.147.112 - 62.166.147.143 be -62.166.147.144 - 62.166.147.167 nl -62.166.147.168 - 62.166.147.183 be -62.166.147.184 - 62.166.147.191 nl -62.166.147.192 - 62.166.147.199 be -62.166.147.200 - 62.166.147.231 nl -62.166.147.232 - 62.166.147.255 be -62.166.148.0 - 62.166.148.55 nl -62.166.148.56 - 62.166.148.63 be -62.166.148.64 - 62.166.148.71 nl -62.166.148.72 - 62.166.148.79 be -62.166.148.80 - 62.166.148.103 nl -62.166.148.104 - 62.166.148.111 be -62.166.148.112 - 62.166.148.127 nl -62.166.148.128 - 62.166.148.143 be -62.166.148.144 - 62.166.148.247 nl -62.166.148.248 - 62.166.149.15 be -62.166.149.16 - 62.166.149.47 nl -62.166.149.48 - 62.166.149.55 be -62.166.149.56 - 62.166.149.71 nl -62.166.149.72 - 62.166.149.87 be -62.166.149.88 - 62.166.149.95 nl -62.166.149.96 - 62.166.149.119 be -62.166.149.120 - 62.166.149.167 nl -62.166.149.168 - 62.166.149.183 be -62.166.149.184 - 62.166.149.207 nl -62.166.149.208 - 62.166.149.215 be -62.166.149.216 - 62.166.149.239 nl -62.166.149.240 - 62.166.149.247 be -62.166.149.248 - 62.166.150.23 nl -62.166.150.24 - 62.166.150.31 be -62.166.150.32 - 62.166.150.55 nl -62.166.150.56 - 62.166.150.63 be -62.166.150.64 - 62.166.150.71 nl -62.166.150.72 - 62.166.150.95 be -62.166.150.96 - 62.166.150.135 nl -62.166.150.136 - 62.166.150.143 be -62.166.150.144 - 62.166.150.167 nl -62.166.150.168 - 62.166.150.175 be -62.166.150.176 - 62.166.150.183 nl -62.166.150.184 - 62.166.150.199 be -62.166.150.200 - 62.166.150.207 nl -62.166.150.208 - 62.166.150.215 be -62.166.150.216 - 62.166.150.223 nl -62.166.150.224 - 62.166.150.231 be -62.166.150.232 - 62.166.151.23 nl -62.166.151.24 - 62.166.151.31 be -62.166.151.32 - 62.166.151.39 nl -62.166.151.40 - 62.166.151.55 be -62.166.151.56 - 62.166.151.79 nl -62.166.151.80 - 62.166.151.95 be -62.166.151.96 - 62.166.151.103 nl -62.166.151.104 - 62.166.151.111 be -62.166.151.112 - 62.166.151.119 nl -62.166.151.120 - 62.166.151.127 be -62.166.151.128 - 62.166.151.159 nl -62.166.151.160 - 62.166.151.175 be -62.166.151.176 - 62.166.151.183 nl -62.166.151.184 - 62.166.151.199 be -62.166.151.200 - 62.166.151.231 nl -62.166.151.232 - 62.166.151.239 be -62.166.151.240 - 62.166.151.247 nl -62.166.151.248 - 62.166.151.255 be -62.166.152.0 - 62.166.152.39 nl -62.166.152.40 - 62.166.152.47 be -62.166.152.48 - 62.166.152.79 nl -62.166.152.80 - 62.166.152.103 be -62.166.152.104 - 62.166.152.159 nl -62.166.152.160 - 62.166.152.175 be -62.166.152.176 - 62.166.152.223 nl -62.166.152.224 - 62.166.152.231 be -62.166.152.232 - 62.166.152.239 nl -62.166.152.240 - 62.166.153.15 be -62.166.153.16 - 62.166.153.63 nl -62.166.153.64 - 62.166.153.71 be -62.166.153.72 - 62.166.153.167 nl -62.166.153.168 - 62.166.153.175 be -62.166.153.176 - 62.166.153.255 nl -62.166.154.0 - 62.166.154.7 be -62.166.154.8 - 62.166.154.15 nl -62.166.154.16 - 62.166.154.23 be -62.166.154.24 - 62.166.154.39 nl -62.166.154.40 - 62.166.154.47 be -62.166.154.48 - 62.166.154.71 nl -62.166.154.72 - 62.166.154.79 be -62.166.154.80 - 62.166.154.103 nl -62.166.154.104 - 62.166.154.111 be -62.166.154.112 - 62.166.154.119 nl -62.166.154.120 - 62.166.154.143 be -62.166.154.144 - 62.166.154.175 nl -62.166.154.176 - 62.166.154.191 be -62.166.154.192 - 62.166.154.207 nl -62.166.154.208 - 62.166.154.231 be -62.166.154.232 - 62.166.154.239 nl -62.166.154.240 - 62.166.154.247 be -62.166.154.248 - 62.166.154.255 nl -62.166.155.0 - 62.166.155.7 be -62.166.155.8 - 62.166.155.23 nl -62.166.155.24 - 62.166.155.31 be -62.166.155.32 - 62.166.155.39 nl -62.166.155.40 - 62.166.155.55 be -62.166.155.56 - 62.166.155.63 nl -62.166.155.64 - 62.166.155.71 be -62.166.155.72 - 62.166.155.79 nl -62.166.155.80 - 62.166.155.95 be -62.166.155.96 - 62.166.155.119 nl -62.166.155.120 - 62.166.155.127 be -62.166.155.128 - 62.166.155.135 nl -62.166.155.136 - 62.166.155.143 be -62.166.155.144 - 62.166.155.199 nl -62.166.155.200 - 62.166.155.223 be -62.166.155.224 - 62.166.155.255 nl -62.166.156.0 - 62.166.156.7 be -62.166.156.8 - 62.166.156.15 nl -62.166.156.16 - 62.166.156.23 be -62.166.156.24 - 62.166.156.31 nl -62.166.156.32 - 62.166.156.47 be -62.166.156.48 - 62.166.156.79 nl -62.166.156.80 - 62.166.156.95 be -62.166.156.96 - 62.166.156.119 nl -62.166.156.120 - 62.166.156.127 be -62.166.156.128 - 62.166.156.159 nl -62.166.156.160 - 62.166.156.167 be -62.166.156.168 - 62.166.156.199 nl -62.166.156.200 - 62.166.156.215 be -62.166.156.216 - 62.166.156.223 nl -62.166.156.224 - 62.166.156.231 be -62.166.156.232 - 62.166.156.239 nl -62.166.156.240 - 62.166.156.247 be -62.166.156.248 - 62.166.157.31 nl -62.166.157.32 - 62.166.157.39 be -62.166.157.40 - 62.166.157.47 nl -62.166.157.48 - 62.166.157.55 be -62.166.157.56 - 62.166.157.79 nl -62.166.157.80 - 62.166.157.95 be -62.166.157.96 - 62.166.157.103 nl -62.166.157.104 - 62.166.157.111 be -62.166.157.112 - 62.166.157.151 nl -62.166.157.152 - 62.166.157.159 be -62.166.157.160 - 62.166.157.199 nl -62.166.157.200 - 62.166.157.207 be -62.166.157.208 - 62.166.157.215 nl -62.166.157.216 - 62.166.157.223 be -62.166.157.224 - 62.166.157.239 nl -62.166.157.240 - 62.166.157.247 be -62.166.157.248 - 62.166.158.7 nl -62.166.158.8 - 62.166.158.15 be -62.166.158.16 - 62.166.158.31 nl -62.166.158.32 - 62.166.158.47 be -62.166.158.48 - 62.166.158.79 nl -62.166.158.80 - 62.166.158.95 be -62.166.158.96 - 62.166.158.127 nl -62.166.158.128 - 62.166.158.135 be -62.166.158.136 - 62.166.158.143 nl -62.166.158.144 - 62.166.158.151 be -62.166.158.152 - 62.166.158.159 nl -62.166.158.160 - 62.166.158.191 be -62.166.158.192 - 62.166.158.199 nl -62.166.158.200 - 62.166.158.223 be -62.166.158.224 - 62.166.158.239 nl -62.166.158.240 - 62.166.158.247 be -62.166.158.248 - 62.166.158.255 nl -62.166.159.0 - 62.166.159.23 be -62.166.159.24 - 62.166.159.31 nl -62.166.159.32 - 62.166.159.47 be -62.166.159.48 - 62.166.159.55 nl -62.166.159.56 - 62.166.159.63 be -62.166.159.64 - 62.166.159.71 nl -62.166.159.72 - 62.166.159.95 be -62.166.159.96 - 62.166.159.111 nl -62.166.159.112 - 62.166.159.143 be -62.166.159.144 - 62.166.159.151 nl -62.166.159.152 - 62.166.159.159 be -62.166.159.160 - 62.166.159.167 nl -62.166.159.168 - 62.166.159.175 be -62.166.159.176 - 62.166.159.207 nl -62.166.159.208 - 62.166.159.215 be -62.166.159.216 - 62.166.159.223 nl -62.166.159.224 - 62.166.159.231 be -62.166.159.232 - 62.166.159.239 nl -62.166.159.240 - 62.166.159.255 be -62.166.160.0 - 62.166.160.1 nl -62.166.160.2 - 62.166.160.31 be -62.166.160.32 - 62.166.160.47 nl -62.166.160.48 - 62.166.160.55 be -62.166.160.56 - 62.166.160.63 nl -62.166.160.64 - 62.166.160.79 be -62.166.160.80 - 62.166.160.95 nl -62.166.160.96 - 62.166.160.127 be -62.166.160.128 - 62.166.160.191 nl -62.166.160.192 - 62.166.161.255 be -62.166.162.0 - 62.166.191.255 nl -62.166.192.0 - 62.166.214.135 be -62.166.214.136 - 62.166.214.143 nl -62.166.214.144 - 62.166.223.255 be -62.166.224.0 - 62.166.224.127 nl -62.166.224.128 - 62.166.224.143 be -62.166.224.144 - 62.166.224.199 nl -62.166.224.200 - 62.166.224.223 be -62.166.224.224 - 62.166.226.255 nl -62.166.227.0 - 62.166.227.127 be -62.166.227.128 - 62.166.228.31 nl -62.166.228.32 - 62.166.228.79 be -62.166.228.80 - 62.166.228.159 nl -62.166.228.160 - 62.166.228.175 be -62.166.228.176 - 62.166.229.255 nl -62.166.230.0 - 62.166.231.255 be -62.166.232.0 - 62.166.255.255 nl +62.166.0.0 - 62.166.191.255 nl +62.166.192.0 - 62.166.197.255 be +62.166.198.0 - 62.166.199.255 nl +62.166.200.0 - 62.166.223.255 be +62.166.224.0 - 62.166.230.223 nl +62.166.230.224 - 62.166.230.231 be +62.166.230.232 - 62.166.255.255 nl 62.167.0.0 - 62.167.255.255 ch 62.168.0.0 - 62.168.63.255 cz 62.168.64.0 - 62.168.127.255 sk @@ -13428,34 +13356,16 @@ 62.169.128.0 - 62.169.159.255 gb 62.169.160.0 - 62.169.191.255 sk 62.169.192.0 - 62.169.255.255 gr -62.170.0.0 - 62.172.1.255 gb -62.172.2.0 - 62.172.2.255 es -62.172.3.0 - 62.172.255.255 gb +62.170.0.0 - 62.172.255.255 gb 62.173.0.0 - 62.173.31.255 mt 62.173.32.0 - 62.173.63.255 ng -62.173.64.0 - 62.173.127.255 gb +62.173.64.0 - 62.173.94.161 gb +62.173.94.162 - 62.173.94.162 eu +62.173.94.163 - 62.173.127.255 gb 62.173.128.0 - 62.173.159.255 ru 62.173.160.0 - 62.173.191.255 it -62.173.192.0 - 62.173.193.95 gb -62.173.193.96 - 62.173.193.127 gm -62.173.193.128 - 62.173.204.191 gb -62.173.204.192 - 62.173.204.223 nl -62.173.204.224 - 62.173.205.255 gb -62.173.206.0 - 62.173.206.255 nl -62.173.207.0 - 62.173.207.31 gb -62.173.207.32 - 62.173.207.63 nl -62.173.207.64 - 62.173.207.135 gb -62.173.207.136 - 62.173.207.143 fr -62.173.207.144 - 62.173.207.191 gb -62.173.207.192 - 62.173.207.223 nl -62.173.207.224 - 62.173.216.119 gb -62.173.216.120 - 62.173.216.127 sz -62.173.216.128 - 62.173.230.207 gb -62.173.230.208 - 62.173.230.223 be -62.173.230.224 - 62.173.255.255 gb -62.174.0.0 - 62.175.180.255 es -62.175.181.0 - 62.175.181.255 us -62.175.182.0 - 62.175.255.255 es +62.173.192.0 - 62.173.255.255 gb +62.174.0.0 - 62.175.255.255 es 62.176.0.0 - 62.176.31.255 ru 62.176.32.0 - 62.176.63.255 fi 62.176.64.0 - 62.176.127.255 bg @@ -13468,316 +13378,46 @@ 62.177.64.0 - 62.177.127.255 cz 62.177.128.0 - 62.177.255.255 nl 62.178.0.0 - 62.178.255.255 at -62.179.0.0 - 62.179.3.255 pl -62.179.4.0 - 62.179.7.255 at -62.179.8.0 - 62.179.9.255 pl -62.179.10.0 - 62.179.122.255 at -62.179.123.0 - 62.179.123.127 nl -62.179.123.128 - 62.179.255.255 at -62.180.0.0 - 62.180.10.255 eu -62.180.11.0 - 62.180.11.255 de -62.180.12.0 - 62.180.23.255 eu +62.179.0.0 - 62.179.15.255 pl +62.179.16.0 - 62.179.23.255 ch +62.179.24.0 - 62.179.115.255 at +62.179.116.0 - 62.179.119.255 ch +62.179.120.0 - 62.179.122.255 at +62.179.123.0 - 62.179.123.255 nl +62.179.124.0 - 62.179.127.255 at +62.179.128.0 - 62.179.255.255 nl +62.180.0.0 - 62.180.23.255 eu 62.180.24.0 - 62.180.27.255 de -62.180.28.0 - 62.180.30.255 eu -62.180.31.0 - 62.180.31.127 de -62.180.31.128 - 62.180.31.255 eu -62.180.32.0 - 62.180.42.15 de -62.180.42.16 - 62.180.42.23 eu -62.180.42.24 - 62.180.42.47 de -62.180.42.48 - 62.180.42.75 eu -62.180.42.76 - 62.180.42.79 be -62.180.42.80 - 62.180.42.91 eu -62.180.42.92 - 62.180.42.95 de -62.180.42.96 - 62.180.42.127 be -62.180.42.128 - 62.180.42.167 eu -62.180.42.168 - 62.180.42.175 nl -62.180.42.176 - 62.180.42.207 de -62.180.42.208 - 62.180.42.239 eu -62.180.42.240 - 62.180.42.247 de -62.180.42.248 - 62.180.43.63 eu -62.180.43.64 - 62.180.43.159 de -62.180.43.160 - 62.180.44.255 eu -62.180.45.0 - 62.180.47.255 de -62.180.48.0 - 62.180.48.175 eu -62.180.48.176 - 62.180.48.191 de -62.180.48.192 - 62.180.50.207 eu -62.180.50.208 - 62.180.50.255 de -62.180.51.0 - 62.180.52.255 eu -62.180.53.0 - 62.180.53.255 de -62.180.54.0 - 62.180.54.15 eu -62.180.54.16 - 62.180.54.31 de -62.180.54.32 - 62.180.54.255 eu -62.180.55.0 - 62.180.55.31 de -62.180.55.32 - 62.180.56.39 eu -62.180.56.40 - 62.180.56.47 de -62.180.56.48 - 62.180.57.223 eu -62.180.57.224 - 62.180.57.231 de -62.180.57.232 - 62.180.59.63 eu -62.180.59.64 - 62.180.59.67 de -62.180.59.68 - 62.180.59.159 eu -62.180.59.160 - 62.180.59.175 de -62.180.59.176 - 62.180.59.191 eu -62.180.59.192 - 62.180.60.127 de -62.180.60.128 - 62.180.60.255 eu -62.180.61.0 - 62.180.61.255 de -62.180.62.0 - 62.180.62.255 eu -62.180.63.0 - 62.180.63.63 de -62.180.63.64 - 62.180.63.127 eu -62.180.63.128 - 62.180.63.143 de -62.180.63.144 - 62.180.63.191 eu -62.180.63.192 - 62.180.64.255 de -62.180.65.0 - 62.180.65.7 eu -62.180.65.8 - 62.180.65.15 de -62.180.65.16 - 62.180.65.23 eu -62.180.65.24 - 62.180.65.27 de -62.180.65.28 - 62.180.65.71 eu -62.180.65.72 - 62.180.65.111 de -62.180.65.112 - 62.180.65.119 eu -62.180.65.120 - 62.180.71.255 de -62.180.72.0 - 62.180.72.15 eu -62.180.72.16 - 62.180.72.31 de -62.180.72.32 - 62.180.72.63 eu -62.180.72.64 - 62.180.72.127 de -62.180.72.128 - 62.180.72.135 eu -62.180.72.136 - 62.180.72.143 de -62.180.72.144 - 62.180.72.159 eu -62.180.72.160 - 62.180.72.207 de -62.180.72.208 - 62.180.72.215 eu -62.180.72.216 - 62.180.72.219 de -62.180.72.220 - 62.180.72.223 eu -62.180.72.224 - 62.180.72.231 de -62.180.72.232 - 62.180.75.255 eu -62.180.76.0 - 62.180.76.31 de -62.180.76.32 - 62.180.76.71 eu -62.180.76.72 - 62.180.76.127 de -62.180.76.128 - 62.180.76.151 eu -62.180.76.152 - 62.180.76.159 de -62.180.76.160 - 62.180.76.223 eu -62.180.76.224 - 62.180.77.255 de -62.180.78.0 - 62.180.78.127 eu -62.180.78.128 - 62.180.78.159 de -62.180.78.160 - 62.180.81.63 eu -62.180.81.64 - 62.180.81.79 de -62.180.81.80 - 62.180.81.95 eu -62.180.81.96 - 62.180.81.127 de -62.180.81.128 - 62.180.81.143 eu -62.180.81.144 - 62.180.81.151 de -62.180.81.152 - 62.180.81.159 eu -62.180.81.160 - 62.180.81.175 de -62.180.81.176 - 62.180.81.207 eu -62.180.81.208 - 62.180.81.223 de -62.180.81.224 - 62.180.82.31 eu -62.180.82.32 - 62.180.82.95 de -62.180.82.96 - 62.180.82.255 eu -62.180.83.0 - 62.180.83.31 de -62.180.83.32 - 62.180.83.127 eu -62.180.83.128 - 62.180.84.255 de -62.180.85.0 - 62.180.85.255 eu -62.180.86.0 - 62.180.86.23 de -62.180.86.24 - 62.180.88.143 eu -62.180.88.144 - 62.180.88.159 de -62.180.88.160 - 62.180.90.127 eu -62.180.90.128 - 62.180.90.191 de -62.180.90.192 - 62.180.92.7 eu -62.180.92.8 - 62.180.92.11 de -62.180.92.12 - 62.180.92.31 eu -62.180.92.32 - 62.180.92.47 de -62.180.92.48 - 62.180.92.95 eu -62.180.92.96 - 62.180.92.111 de -62.180.92.112 - 62.180.93.95 eu -62.180.93.96 - 62.180.93.111 de -62.180.93.112 - 62.180.93.255 eu -62.180.94.0 - 62.180.95.31 de -62.180.95.32 - 62.180.96.67 eu -62.180.96.68 - 62.180.96.79 de -62.180.96.80 - 62.180.96.95 eu -62.180.96.96 - 62.180.96.135 de -62.180.96.136 - 62.180.96.159 eu -62.180.96.160 - 62.180.96.175 de -62.180.96.176 - 62.180.96.223 eu -62.180.96.224 - 62.180.96.239 de -62.180.96.240 - 62.180.96.255 eu -62.180.97.0 - 62.180.98.127 de -62.180.98.128 - 62.180.99.255 eu -62.180.100.0 - 62.180.100.15 de -62.180.100.16 - 62.180.100.31 eu -62.180.100.32 - 62.180.100.63 de -62.180.100.64 - 62.180.103.223 eu -62.180.103.224 - 62.180.104.23 de -62.180.104.24 - 62.180.104.127 eu -62.180.104.128 - 62.180.104.159 de -62.180.104.160 - 62.180.104.255 eu -62.180.105.0 - 62.180.106.127 de -62.180.106.128 - 62.180.106.255 eu -62.180.107.0 - 62.180.110.255 de -62.180.111.0 - 62.180.111.15 eu -62.180.111.16 - 62.180.111.47 de -62.180.111.48 - 62.180.111.95 eu -62.180.111.96 - 62.180.111.111 de -62.180.111.112 - 62.180.111.255 eu -62.180.112.0 - 62.180.113.255 de -62.180.114.0 - 62.180.114.15 eu -62.180.114.16 - 62.180.114.31 de -62.180.114.32 - 62.180.114.63 eu -62.180.114.64 - 62.180.114.71 de -62.180.114.72 - 62.180.114.87 eu -62.180.114.88 - 62.180.114.95 de -62.180.114.96 - 62.180.114.159 eu -62.180.114.160 - 62.180.114.207 de -62.180.114.208 - 62.180.114.255 eu -62.180.115.0 - 62.180.115.255 de -62.180.116.0 - 62.180.116.127 eu -62.180.116.128 - 62.180.116.255 de -62.180.117.0 - 62.180.117.23 eu -62.180.117.24 - 62.180.117.31 de -62.180.117.32 - 62.180.117.63 eu -62.180.117.64 - 62.180.117.127 de -62.180.117.128 - 62.180.117.135 eu -62.180.117.136 - 62.180.117.139 de -62.180.117.140 - 62.180.117.191 eu -62.180.117.192 - 62.180.117.255 de -62.180.118.0 - 62.180.118.31 eu -62.180.118.32 - 62.180.118.159 de -62.180.118.160 - 62.180.118.191 eu -62.180.118.192 - 62.180.118.223 de -62.180.118.224 - 62.180.123.7 eu -62.180.123.8 - 62.180.123.15 de -62.180.123.16 - 62.180.123.63 eu -62.180.123.64 - 62.180.123.159 de -62.180.123.160 - 62.180.123.191 eu -62.180.123.192 - 62.180.123.223 de -62.180.123.224 - 62.180.124.15 eu -62.180.124.16 - 62.180.124.31 de -62.180.124.32 - 62.180.124.79 eu -62.180.124.80 - 62.180.124.111 de -62.180.124.112 - 62.180.125.127 eu -62.180.125.128 - 62.180.125.255 de -62.180.126.0 - 62.180.126.79 eu -62.180.126.80 - 62.180.126.95 de -62.180.126.96 - 62.180.126.111 eu -62.180.126.112 - 62.180.126.119 de -62.180.126.120 - 62.180.126.127 eu -62.180.126.128 - 62.180.126.195 de -62.180.126.196 - 62.180.127.63 eu -62.180.127.64 - 62.180.127.79 de -62.180.127.80 - 62.180.127.95 eu -62.180.127.96 - 62.180.127.127 de -62.180.127.128 - 62.180.128.39 eu -62.180.128.40 - 62.180.128.47 de -62.180.128.48 - 62.180.128.255 eu -62.180.129.0 - 62.180.129.255 de -62.180.130.0 - 62.180.130.79 eu -62.180.130.80 - 62.180.130.95 de -62.180.130.96 - 62.180.131.63 eu -62.180.131.64 - 62.180.131.95 de -62.180.131.96 - 62.180.131.127 eu +62.180.28.0 - 62.180.67.255 eu +62.180.68.0 - 62.180.71.255 de +62.180.72.0 - 62.180.76.255 eu +62.180.77.0 - 62.180.77.255 de +62.180.78.0 - 62.180.106.255 eu +62.180.107.0 - 62.180.109.255 de +62.180.110.0 - 62.180.131.127 eu 62.180.131.128 - 62.180.131.159 de -62.180.131.160 - 62.180.131.191 eu -62.180.131.192 - 62.180.131.255 de -62.180.132.0 - 62.180.133.247 eu -62.180.133.248 - 62.180.134.255 de -62.180.135.0 - 62.180.136.31 eu -62.180.136.32 - 62.180.136.79 de -62.180.136.80 - 62.180.137.255 eu -62.180.138.0 - 62.180.138.255 de -62.180.139.0 - 62.180.140.23 eu -62.180.140.24 - 62.180.140.63 de -62.180.140.64 - 62.180.140.191 eu -62.180.140.192 - 62.180.141.79 de -62.180.141.80 - 62.180.143.192 eu -62.180.143.193 - 62.180.143.222 de -62.180.143.223 - 62.180.143.223 eu -62.180.143.224 - 62.180.143.255 de -62.180.144.0 - 62.180.150.255 eu -62.180.151.0 - 62.180.151.255 de -62.180.152.0 - 62.180.159.255 eu -62.180.160.0 - 62.180.224.31 de -62.180.224.32 - 62.180.224.39 eu -62.180.224.40 - 62.180.224.63 de -62.180.224.64 - 62.180.224.79 eu -62.180.224.80 - 62.180.224.111 de -62.180.224.112 - 62.180.224.119 eu -62.180.224.120 - 62.180.224.143 de -62.180.224.144 - 62.180.224.159 eu -62.180.224.160 - 62.180.225.127 de -62.180.225.128 - 62.180.225.255 eu -62.180.226.0 - 62.180.226.135 de -62.180.226.136 - 62.180.226.255 eu -62.180.227.0 - 62.180.227.111 de -62.180.227.112 - 62.180.227.159 eu -62.180.227.160 - 62.180.227.199 de -62.180.227.200 - 62.180.227.239 eu -62.180.227.240 - 62.180.227.255 de -62.180.228.0 - 62.180.228.63 eu -62.180.228.64 - 62.180.228.71 de -62.180.228.72 - 62.180.228.127 eu -62.180.228.128 - 62.180.228.191 de -62.180.228.192 - 62.180.228.239 eu -62.180.228.240 - 62.180.229.23 de -62.180.229.24 - 62.180.229.63 eu -62.180.229.64 - 62.180.229.79 de -62.180.229.80 - 62.180.229.87 eu -62.180.229.88 - 62.180.229.191 de -62.180.229.192 - 62.180.229.207 eu -62.180.229.208 - 62.180.229.255 de -62.180.230.0 - 62.180.230.63 eu -62.180.230.64 - 62.180.230.111 de -62.180.230.112 - 62.180.230.255 eu -62.180.231.0 - 62.180.231.95 de -62.180.231.96 - 62.180.231.103 eu -62.180.231.104 - 62.180.231.119 de -62.180.231.120 - 62.180.231.159 eu -62.180.231.160 - 62.180.231.255 de -62.180.232.0 - 62.180.233.7 eu -62.180.233.8 - 62.180.233.15 de -62.180.233.16 - 62.180.233.31 eu -62.180.233.32 - 62.180.233.55 de -62.180.233.56 - 62.180.233.63 eu -62.180.233.64 - 62.180.233.131 de -62.180.233.132 - 62.180.233.143 eu -62.180.233.144 - 62.180.233.159 de -62.180.233.160 - 62.180.233.239 eu -62.180.233.240 - 62.180.233.255 de -62.180.234.0 - 62.180.235.255 eu -62.180.236.0 - 62.180.236.63 de -62.180.236.64 - 62.180.236.95 eu -62.180.236.96 - 62.180.236.111 de -62.180.236.112 - 62.180.236.127 eu -62.180.236.128 - 62.180.236.159 de -62.180.236.160 - 62.180.236.223 eu -62.180.236.224 - 62.180.236.239 de -62.180.236.240 - 62.180.236.255 eu -62.180.237.0 - 62.180.238.127 de -62.180.238.128 - 62.180.238.223 eu -62.180.238.224 - 62.180.238.255 de -62.180.239.0 - 62.180.239.255 eu -62.180.240.0 - 62.180.243.55 de -62.180.243.56 - 62.180.243.255 eu -62.180.244.0 - 62.180.244.255 de -62.180.245.0 - 62.180.245.255 eu -62.180.246.0 - 62.180.247.35 de -62.180.247.36 - 62.180.254.255 eu -62.180.255.0 - 62.180.255.31 de -62.180.255.32 - 62.180.255.255 eu +62.180.131.160 - 62.180.239.255 eu +62.180.240.0 - 62.180.242.255 de +62.180.243.0 - 62.180.255.255 eu 62.181.0.0 - 62.181.31.255 pl 62.181.32.0 - 62.181.63.255 ru -62.181.64.0 - 62.181.127.255 se +62.181.64.0 - 62.181.103.255 se +62.181.104.0 - 62.181.107.255 nl +62.181.108.0 - 62.181.123.255 se +62.181.124.0 - 62.181.127.255 nl 62.181.128.0 - 62.181.159.255 de 62.181.160.0 - 62.181.191.255 pl -62.181.192.0 - 62.181.195.143 se -62.181.195.144 - 62.181.195.151 no -62.181.195.152 - 62.181.213.159 se -62.181.213.160 - 62.181.213.191 dk -62.181.213.192 - 62.182.7.255 se +62.181.192.0 - 62.182.7.255 se 62.182.8.0 - 62.182.15.255 ru -62.182.16.0 - 62.182.23.255 ro -62.182.24.0 - 62.182.55.255 ru +62.182.16.0 - 62.182.23.255 gb +62.182.24.0 - 62.182.39.255 ru +62.182.48.0 - 62.182.55.255 ru 62.182.56.0 - 62.182.63.255 be 62.182.64.0 - 62.182.71.255 ua 62.182.72.0 - 62.182.79.255 ru 62.182.80.0 - 62.182.87.255 ua 62.182.88.0 - 62.182.95.255 ru -62.182.96.0 - 62.182.103.255 de +62.182.102.0 - 62.182.103.255 de 62.182.104.0 - 62.182.111.255 pl 62.182.112.0 - 62.182.119.255 bg 62.182.120.0 - 62.182.127.255 ua @@ -13785,852 +13425,109 @@ 62.182.144.0 - 62.182.151.255 pl 62.182.152.0 - 62.182.167.255 ua 62.182.168.0 - 62.182.175.255 dk -62.182.176.0 - 62.182.183.255 lu +62.182.176.0 - 62.182.178.191 lu +62.182.178.192 - 62.182.180.191 be +62.182.180.192 - 62.182.183.255 lu 62.182.184.0 - 62.182.191.255 ch 62.182.192.0 - 62.182.207.255 ru 62.182.208.0 - 62.182.215.255 pl 62.182.216.0 - 62.182.223.255 se 62.182.224.0 - 62.182.231.255 pl 62.182.232.0 - 62.182.239.255 cz -62.182.240.0 - 62.182.247.255 nl +62.182.240.0 - 62.182.247.255 gb 62.182.248.0 - 62.182.255.255 dk 62.183.0.0 - 62.183.127.255 ru -62.183.128.0 - 62.183.204.103 fi -62.183.204.104 - 62.183.204.119 ax -62.183.204.120 - 62.183.255.255 fi -62.184.0.0 - 62.184.3.255 de -62.184.4.0 - 62.184.4.255 fr -62.184.5.0 - 62.184.5.63 de -62.184.5.64 - 62.184.5.95 fr -62.184.5.96 - 62.184.5.111 de -62.184.5.112 - 62.184.5.119 gb -62.184.5.120 - 62.184.5.127 nl -62.184.5.128 - 62.184.5.255 gb -62.184.6.0 - 62.184.8.31 de -62.184.8.32 - 62.184.8.63 za -62.184.8.64 - 62.184.8.71 fr -62.184.8.72 - 62.184.8.79 de -62.184.8.80 - 62.184.8.95 be -62.184.8.96 - 62.184.13.31 de -62.184.13.32 - 62.184.13.63 it -62.184.13.64 - 62.184.13.127 de -62.184.13.128 - 62.184.13.159 za -62.184.13.160 - 62.184.18.31 de -62.184.18.32 - 62.184.18.63 gb -62.184.18.64 - 62.184.18.95 il -62.184.18.96 - 62.184.18.111 it -62.184.18.112 - 62.184.18.127 nl -62.184.18.128 - 62.184.26.191 de -62.184.26.192 - 62.184.26.207 gb -62.184.26.208 - 62.184.26.223 za -62.184.26.224 - 62.184.26.255 it -62.184.27.0 - 62.184.31.255 de -62.184.32.0 - 62.184.36.23 nl -62.184.36.24 - 62.184.36.31 gb -62.184.36.32 - 62.184.38.127 nl -62.184.38.128 - 62.184.38.191 gb -62.184.38.192 - 62.184.43.255 nl -62.184.44.0 - 62.184.45.255 fr -62.184.46.0 - 62.184.47.255 at -62.184.48.0 - 62.184.57.15 fr -62.184.57.16 - 62.184.57.23 za -62.184.57.24 - 62.184.57.31 at -62.184.57.32 - 62.184.57.127 fr -62.184.57.128 - 62.184.57.255 nl -62.184.58.0 - 62.184.58.31 tr -62.184.58.32 - 62.184.58.191 fr -62.184.58.192 - 62.184.58.255 nl -62.184.59.0 - 62.184.63.255 fr -62.184.64.0 - 62.184.67.255 dk -62.184.68.0 - 62.184.69.255 de -62.184.70.0 - 62.184.71.255 dk -62.184.72.0 - 62.184.72.191 se -62.184.72.192 - 62.184.72.255 it -62.184.73.0 - 62.184.75.255 se -62.184.76.0 - 62.184.76.47 it -62.184.76.48 - 62.184.76.63 gb -62.184.76.64 - 62.184.76.127 de -62.184.76.128 - 62.184.77.255 it -62.184.78.0 - 62.184.78.255 de -62.184.79.0 - 62.184.79.255 gb -62.184.80.0 - 62.184.87.255 be -62.184.88.0 - 62.184.88.63 za -62.184.88.64 - 62.184.88.127 be -62.184.88.128 - 62.184.88.159 it -62.184.88.160 - 62.184.88.175 za -62.184.88.176 - 62.184.88.191 nl -62.184.88.192 - 62.184.88.255 de -62.184.89.0 - 62.184.95.255 za -62.184.96.0 - 62.184.100.255 fr -62.184.101.0 - 62.184.101.255 be -62.184.102.0 - 62.184.103.159 fr -62.184.103.160 - 62.184.103.191 at -62.184.103.192 - 62.184.103.255 se -62.184.104.0 - 62.184.109.255 fr -62.184.110.0 - 62.184.111.255 za -62.184.112.0 - 62.184.112.255 es -62.184.113.0 - 62.184.113.255 it -62.184.114.0 - 62.184.115.255 at -62.184.116.0 - 62.184.119.255 gb -62.184.120.0 - 62.184.125.191 it -62.184.125.192 - 62.184.125.255 gb -62.184.126.0 - 62.184.127.255 it -62.184.128.0 - 62.184.128.39 ch -62.184.128.40 - 62.184.128.47 gb -62.184.128.48 - 62.184.128.63 at -62.184.128.64 - 62.184.128.79 za -62.184.128.80 - 62.184.128.95 nl -62.184.128.96 - 62.184.150.191 gb -62.184.150.192 - 62.184.150.255 eu -62.184.151.0 - 62.184.159.255 gb -62.184.160.0 - 62.184.161.255 ch -62.184.162.0 - 62.184.164.255 se -62.184.165.0 - 62.184.165.31 eu -62.184.165.32 - 62.184.165.39 il -62.184.165.40 - 62.184.165.47 be -62.184.165.48 - 62.184.165.63 at -62.184.165.64 - 62.184.165.127 eu -62.184.165.128 - 62.184.165.255 fr -62.184.166.0 - 62.184.167.255 at -62.184.168.0 - 62.184.168.127 gb -62.184.168.128 - 62.184.168.159 ch -62.184.168.160 - 62.184.168.191 de -62.184.168.192 - 62.184.168.255 gb -62.184.169.0 - 62.184.169.255 eu -62.184.170.0 - 62.184.171.255 gb -62.184.172.0 - 62.184.172.15 ch -62.184.172.16 - 62.184.172.255 gb -62.184.173.0 - 62.184.173.63 eu -62.184.173.64 - 62.184.173.95 ch -62.184.173.96 - 62.184.173.127 za -62.184.173.128 - 62.184.173.255 fr -62.184.174.0 - 62.184.174.15 gb -62.184.174.16 - 62.184.174.31 be -62.184.174.32 - 62.184.174.79 gb -62.184.174.80 - 62.184.174.95 za -62.184.174.96 - 62.184.174.127 de -62.184.174.128 - 62.184.174.255 gb -62.184.175.0 - 62.184.175.15 ch -62.184.175.16 - 62.184.176.255 gb -62.184.177.0 - 62.184.177.255 ch -62.184.178.0 - 62.184.178.95 fi -62.184.178.96 - 62.184.178.103 tr -62.184.178.104 - 62.184.178.111 gb -62.184.178.112 - 62.184.178.127 ch -62.184.178.128 - 62.184.179.255 fr -62.184.180.0 - 62.184.207.255 gb -62.184.208.0 - 62.184.209.255 eu -62.184.210.0 - 62.184.223.255 gb -62.184.224.0 - 62.184.239.255 de -62.184.240.0 - 62.184.246.255 ch -62.184.247.0 - 62.184.247.255 no +62.183.128.0 - 62.183.255.255 fi +62.184.0.0 - 62.184.51.255 eu +62.184.52.0 - 62.184.55.255 fr +62.184.56.0 - 62.184.131.255 eu +62.184.132.0 - 62.184.143.255 gb +62.184.144.0 - 62.184.151.255 eu +62.184.152.0 - 62.184.159.255 gb +62.184.160.0 - 62.184.183.255 eu +62.184.184.0 - 62.184.203.255 gb +62.184.204.0 - 62.184.223.255 eu +62.184.224.0 - 62.184.231.255 de +62.184.232.0 - 62.184.235.255 eu +62.184.236.0 - 62.184.239.255 de +62.184.240.0 - 62.184.247.255 eu 62.184.248.0 - 62.184.251.255 ch -62.184.252.0 - 62.184.252.255 fr -62.184.253.0 - 62.184.253.255 at -62.184.254.0 - 62.184.255.255 gb -62.185.0.0 - 62.185.0.63 de -62.185.0.64 - 62.185.0.127 be -62.185.0.128 - 62.185.1.63 de -62.185.1.64 - 62.185.1.87 be -62.185.1.88 - 62.185.1.95 nl -62.185.1.96 - 62.185.1.127 it -62.185.1.128 - 62.185.1.159 gb -62.185.1.160 - 62.185.1.191 de -62.185.1.192 - 62.185.1.255 ch -62.185.2.0 - 62.185.4.191 de -62.185.4.192 - 62.185.4.255 eu -62.185.5.0 - 62.185.5.63 de -62.185.5.64 - 62.185.5.71 ch -62.185.5.72 - 62.185.5.79 es -62.185.5.80 - 62.185.5.95 ch -62.185.5.96 - 62.185.5.255 gb -62.185.6.0 - 62.185.12.127 de -62.185.12.128 - 62.185.12.191 es -62.185.12.192 - 62.185.12.199 de -62.185.12.200 - 62.185.12.207 es -62.185.12.208 - 62.185.12.223 it -62.185.12.224 - 62.185.13.191 de -62.185.13.192 - 62.185.13.223 it -62.185.13.224 - 62.185.13.255 at -62.185.14.0 - 62.185.15.159 de -62.185.15.160 - 62.185.15.191 es -62.185.15.192 - 62.185.15.255 gb -62.185.16.0 - 62.185.18.159 de -62.185.18.160 - 62.185.18.175 nl -62.185.18.176 - 62.185.20.95 de -62.185.20.96 - 62.185.20.127 it -62.185.20.128 - 62.185.20.255 de -62.185.21.0 - 62.185.21.255 eu -62.185.22.0 - 62.185.23.159 de -62.185.23.160 - 62.185.23.167 be -62.185.23.168 - 62.185.23.175 de -62.185.23.176 - 62.185.23.191 gb -62.185.23.192 - 62.185.23.223 it -62.185.23.224 - 62.185.25.95 de -62.185.25.96 - 62.185.25.127 es -62.185.25.128 - 62.185.25.255 se -62.185.26.0 - 62.185.27.255 de -62.185.28.0 - 62.185.29.255 eu -62.185.30.0 - 62.185.31.255 de -62.185.32.0 - 62.185.32.255 eu -62.185.33.0 - 62.185.33.79 gb -62.185.33.80 - 62.185.33.87 cz -62.185.33.88 - 62.185.33.95 gb -62.185.33.96 - 62.185.33.127 za -62.185.33.128 - 62.185.33.255 be -62.185.34.0 - 62.185.41.191 gb -62.185.41.192 - 62.185.41.255 ch -62.185.42.0 - 62.185.48.31 gb -62.185.48.32 - 62.185.48.63 ch -62.185.48.64 - 62.185.52.63 gb -62.185.52.64 - 62.185.52.79 za -62.185.52.80 - 62.185.52.95 nl -62.185.52.96 - 62.185.52.127 es -62.185.52.128 - 62.185.53.71 gb -62.185.53.72 - 62.185.53.79 de -62.185.53.80 - 62.185.53.95 at -62.185.53.96 - 62.185.53.127 za -62.185.53.128 - 62.185.53.191 gb -62.185.53.192 - 62.185.53.255 nl -62.185.54.0 - 62.185.54.191 gb -62.185.54.192 - 62.185.54.255 za -62.185.55.0 - 62.185.63.255 gb -62.185.64.0 - 62.185.65.31 ch -62.185.65.32 - 62.185.65.63 it -62.185.65.64 - 62.185.65.127 es -62.185.65.128 - 62.185.65.255 de -62.185.66.0 - 62.185.66.191 ch -62.185.66.192 - 62.185.66.223 za -62.185.66.224 - 62.185.66.255 es -62.185.67.0 - 62.185.71.255 ch -62.185.72.0 - 62.185.72.255 de -62.185.73.0 - 62.185.76.159 ch -62.185.76.160 - 62.185.76.175 gb -62.185.76.176 - 62.185.76.191 ch -62.185.76.192 - 62.185.76.255 gb -62.185.77.0 - 62.185.78.95 ch -62.185.78.96 - 62.185.78.127 at -62.185.78.128 - 62.185.78.191 ch -62.185.78.192 - 62.185.78.223 gb -62.185.78.224 - 62.185.79.255 ch -62.185.80.0 - 62.185.84.47 it -62.185.84.48 - 62.185.84.63 ch -62.185.84.64 - 62.185.84.127 fr -62.185.84.128 - 62.185.84.255 za -62.185.85.0 - 62.185.85.255 eu -62.185.86.0 - 62.185.90.159 it -62.185.90.160 - 62.185.90.167 nl -62.185.90.168 - 62.185.90.175 za -62.185.90.176 - 62.185.90.223 gb -62.185.90.224 - 62.185.90.255 za -62.185.91.0 - 62.185.93.63 it -62.185.93.64 - 62.185.93.95 nl -62.185.93.96 - 62.185.93.159 es -62.185.93.160 - 62.185.93.175 za -62.185.93.176 - 62.185.93.191 de -62.185.93.192 - 62.185.93.255 at -62.185.94.0 - 62.185.95.255 be -62.185.96.0 - 62.185.96.127 fr -62.185.96.128 - 62.185.96.255 gb -62.185.97.0 - 62.185.100.191 fr -62.185.100.192 - 62.185.100.223 de -62.185.100.224 - 62.185.102.95 fr -62.185.102.96 - 62.185.102.223 gb -62.185.102.224 - 62.185.102.239 za -62.185.102.240 - 62.185.102.247 nl -62.185.102.248 - 62.185.102.255 za -62.185.103.0 - 62.185.111.143 fr -62.185.111.144 - 62.185.111.159 es -62.185.111.160 - 62.185.111.167 nl -62.185.111.168 - 62.185.111.255 fr -62.185.112.0 - 62.185.113.47 at -62.185.113.48 - 62.185.113.63 be -62.185.113.64 - 62.185.113.95 it -62.185.113.96 - 62.185.113.127 nl +62.184.252.0 - 62.185.7.255 eu +62.185.8.0 - 62.185.11.255 de +62.185.12.0 - 62.185.22.127 eu +62.185.22.128 - 62.185.22.159 de +62.185.22.160 - 62.185.55.255 eu +62.185.56.0 - 62.185.63.255 gb +62.185.64.0 - 62.185.67.255 eu +62.185.68.0 - 62.185.71.255 ch +62.185.72.0 - 62.185.103.255 eu +62.185.104.0 - 62.185.107.255 fr +62.185.108.0 - 62.185.113.127 eu 62.185.113.128 - 62.185.113.191 hu -62.185.113.192 - 62.185.113.223 gb -62.185.113.224 - 62.185.113.239 za -62.185.113.240 - 62.185.113.255 gb -62.185.114.0 - 62.185.114.31 at -62.185.114.32 - 62.185.114.63 de -62.185.114.64 - 62.185.114.127 gb -62.185.114.128 - 62.185.115.255 at -62.185.116.0 - 62.185.116.255 de -62.185.117.0 - 62.185.119.255 at -62.185.120.0 - 62.185.120.31 se -62.185.120.32 - 62.185.120.63 ch -62.185.120.64 - 62.185.120.191 se -62.185.120.192 - 62.185.120.199 za -62.185.120.200 - 62.185.120.207 gb -62.185.120.208 - 62.185.120.223 za -62.185.120.224 - 62.185.120.255 fr -62.185.121.0 - 62.185.125.95 ch -62.185.125.96 - 62.185.125.103 nl -62.185.125.104 - 62.185.125.111 gb -62.185.125.112 - 62.185.125.127 de -62.185.125.128 - 62.185.127.255 ch -62.185.128.0 - 62.185.130.31 nl -62.185.130.32 - 62.185.130.63 es -62.185.130.64 - 62.185.130.127 it -62.185.130.128 - 62.185.130.255 ch -62.185.131.0 - 62.185.131.47 nl -62.185.131.48 - 62.185.131.63 gb -62.185.131.64 - 62.185.131.159 fr -62.185.131.160 - 62.185.131.191 it -62.185.131.192 - 62.185.131.255 de -62.185.132.0 - 62.185.132.127 nl -62.185.132.128 - 62.185.132.143 eu -62.185.132.144 - 62.185.132.159 nl -62.185.132.160 - 62.185.132.191 za -62.185.132.192 - 62.185.132.207 at -62.185.132.208 - 62.185.132.223 gb -62.185.132.224 - 62.185.133.31 nl -62.185.133.32 - 62.185.133.63 it -62.185.133.64 - 62.185.133.95 hu -62.185.133.96 - 62.185.133.127 pt -62.185.133.128 - 62.185.133.255 at -62.185.134.0 - 62.185.138.23 nl -62.185.138.24 - 62.185.138.31 be -62.185.138.32 - 62.185.138.63 za -62.185.138.64 - 62.185.138.127 es -62.185.138.128 - 62.185.138.255 de -62.185.139.0 - 62.185.139.255 nl +62.185.113.192 - 62.185.139.255 eu 62.185.140.0 - 62.185.143.255 ch -62.185.144.0 - 62.185.145.127 gb -62.185.145.128 - 62.185.145.159 de -62.185.145.160 - 62.185.145.191 ch -62.185.145.192 - 62.185.145.207 de -62.185.145.208 - 62.185.145.223 gb -62.185.145.224 - 62.185.145.255 de -62.185.146.0 - 62.185.146.191 gb -62.185.146.192 - 62.185.146.223 be -62.185.146.224 - 62.185.147.159 gb -62.185.147.160 - 62.185.147.191 de -62.185.147.192 - 62.185.147.223 gb -62.185.147.224 - 62.185.147.255 za -62.185.148.0 - 62.185.160.47 gb -62.185.160.48 - 62.185.160.79 za -62.185.160.80 - 62.185.160.95 gb -62.185.160.96 - 62.185.160.127 eu -62.185.160.128 - 62.185.160.191 gb -62.185.160.192 - 62.185.160.255 de -62.185.161.0 - 62.185.161.159 gb -62.185.161.160 - 62.185.161.191 it -62.185.161.192 - 62.185.161.223 es -62.185.161.224 - 62.185.161.255 be -62.185.162.0 - 62.185.162.255 it -62.185.163.0 - 62.185.163.127 de -62.185.163.128 - 62.185.163.255 eu -62.185.164.0 - 62.185.166.63 de -62.185.166.64 - 62.185.166.127 tr -62.185.166.128 - 62.185.167.255 de +62.185.144.0 - 62.185.151.255 eu +62.185.152.0 - 62.185.159.255 gb +62.185.160.0 - 62.185.167.255 eu 62.185.168.0 - 62.185.175.255 gb -62.185.176.0 - 62.185.176.95 za -62.185.176.96 - 62.185.176.127 es -62.185.176.128 - 62.185.176.191 ru -62.185.176.192 - 62.185.176.255 ie -62.185.177.0 - 62.185.183.79 za -62.185.183.80 - 62.185.183.95 gb -62.185.183.96 - 62.185.183.111 at -62.185.183.112 - 62.185.183.127 za -62.185.183.128 - 62.185.183.255 de -62.185.184.0 - 62.185.188.159 za -62.185.188.160 - 62.185.188.191 ie -62.185.188.192 - 62.185.188.255 it -62.185.189.0 - 62.185.192.31 za -62.185.192.32 - 62.185.192.39 gb -62.185.192.40 - 62.185.192.63 za -62.185.192.64 - 62.185.192.79 de -62.185.192.80 - 62.185.192.127 it -62.185.192.128 - 62.185.192.255 gb -62.185.193.0 - 62.185.193.31 fr -62.185.193.32 - 62.185.193.63 be -62.185.193.64 - 62.185.193.79 za -62.185.193.80 - 62.185.193.95 nl -62.185.193.96 - 62.185.193.127 de -62.185.193.128 - 62.185.193.191 es -62.185.193.192 - 62.185.193.255 gb -62.185.194.0 - 62.185.194.255 za -62.185.195.0 - 62.185.195.175 be -62.185.195.176 - 62.185.195.183 gb -62.185.195.184 - 62.185.195.191 de -62.185.195.192 - 62.185.195.223 be -62.185.195.224 - 62.185.195.255 ch -62.185.196.0 - 62.185.196.191 it -62.185.196.192 - 62.185.196.223 za -62.185.196.224 - 62.185.196.239 it -62.185.196.240 - 62.185.196.255 za -62.185.197.0 - 62.185.197.255 it -62.185.198.0 - 62.185.199.255 dk -62.185.200.0 - 62.185.200.31 es -62.185.200.32 - 62.185.200.63 gb -62.185.200.64 - 62.185.200.127 ch -62.185.200.128 - 62.185.201.31 es -62.185.201.32 - 62.185.201.63 eu -62.185.201.64 - 62.185.201.127 gb -62.185.201.128 - 62.185.201.255 es -62.185.202.0 - 62.185.206.255 de -62.185.207.0 - 62.185.207.127 be -62.185.207.128 - 62.185.207.143 de -62.185.207.144 - 62.185.207.151 gb -62.185.207.152 - 62.185.207.159 nl -62.185.207.160 - 62.185.207.255 gb -62.185.208.0 - 62.185.213.127 be -62.185.213.128 - 62.185.213.191 ie -62.185.213.192 - 62.185.213.255 gb -62.185.214.0 - 62.185.215.63 be -62.185.215.64 - 62.185.215.127 de -62.185.215.128 - 62.185.219.255 be -62.185.220.0 - 62.185.223.255 dk -62.185.224.0 - 62.185.224.127 ie -62.185.224.128 - 62.185.224.143 it -62.185.224.144 - 62.185.224.159 de -62.185.224.160 - 62.185.224.191 za -62.185.224.192 - 62.185.224.255 it -62.185.225.0 - 62.185.225.255 ie -62.185.226.0 - 62.185.226.255 hu -62.185.227.0 - 62.185.227.191 cz -62.185.227.192 - 62.185.227.223 eu +62.185.176.0 - 62.185.183.31 eu +62.185.183.32 - 62.185.183.63 za +62.185.183.64 - 62.185.215.255 eu +62.185.216.0 - 62.185.219.255 be +62.185.220.0 - 62.185.227.223 eu 62.185.227.224 - 62.185.227.255 cz -62.185.228.0 - 62.185.228.255 no -62.185.229.0 - 62.185.229.255 dk -62.185.230.0 - 62.185.230.127 se -62.185.230.128 - 62.185.230.191 de -62.185.230.192 - 62.185.230.255 it -62.185.231.0 - 62.185.231.255 dk -62.185.232.0 - 62.185.237.31 gb -62.185.237.32 - 62.185.237.63 za -62.185.237.64 - 62.185.237.127 fi -62.185.237.128 - 62.185.243.255 gb +62.185.228.0 - 62.185.243.255 eu 62.185.244.0 - 62.185.247.255 ch -62.185.248.0 - 62.185.249.255 de -62.185.250.0 - 62.185.250.127 eu -62.185.250.128 - 62.185.250.159 de -62.185.250.160 - 62.185.250.255 fr -62.185.251.0 - 62.185.251.255 de -62.185.252.0 - 62.185.252.255 eu -62.185.253.0 - 62.185.254.255 de -62.185.255.0 - 62.185.255.255 es -62.186.0.0 - 62.186.1.191 de -62.186.1.192 - 62.186.1.255 no -62.186.2.0 - 62.186.2.143 fr -62.186.2.144 - 62.186.2.159 nl -62.186.2.160 - 62.186.2.191 za -62.186.2.192 - 62.186.2.255 gb -62.186.3.0 - 62.186.3.15 de -62.186.3.16 - 62.186.3.31 ch -62.186.3.32 - 62.186.3.63 eu -62.186.3.64 - 62.186.3.95 de -62.186.3.96 - 62.186.3.127 fr -62.186.3.128 - 62.186.3.191 gb -62.186.3.192 - 62.186.3.223 fr -62.186.3.224 - 62.186.3.255 nl -62.186.4.0 - 62.186.7.103 de -62.186.7.104 - 62.186.7.111 no -62.186.7.112 - 62.186.7.151 gb -62.186.7.152 - 62.186.7.159 de -62.186.7.160 - 62.186.7.223 gb -62.186.7.224 - 62.186.7.255 se -62.186.8.0 - 62.186.8.255 eu -62.186.9.0 - 62.186.10.143 de -62.186.10.144 - 62.186.10.151 gb -62.186.10.152 - 62.186.10.159 nl -62.186.10.160 - 62.186.10.191 de -62.186.10.192 - 62.186.10.255 za -62.186.11.0 - 62.186.11.159 gb -62.186.11.160 - 62.186.11.223 de -62.186.11.224 - 62.186.11.255 nl -62.186.12.0 - 62.186.15.255 de -62.186.16.0 - 62.186.16.255 eu -62.186.17.0 - 62.186.21.159 de -62.186.21.160 - 62.186.21.191 eu -62.186.21.192 - 62.186.21.255 es -62.186.22.0 - 62.186.22.255 de -62.186.23.0 - 62.186.26.255 gb -62.186.27.0 - 62.186.27.255 nl -62.186.28.0 - 62.186.31.255 gb -62.186.32.0 - 62.186.32.255 de -62.186.33.0 - 62.186.33.79 gb -62.186.33.80 - 62.186.33.95 za -62.186.33.96 - 62.186.33.159 gb -62.186.33.160 - 62.186.33.255 fr -62.186.34.0 - 62.186.45.255 gb -62.186.46.0 - 62.186.46.255 nl -62.186.47.0 - 62.186.52.31 gb -62.186.52.32 - 62.186.52.47 za -62.186.52.48 - 62.186.52.55 gb -62.186.52.56 - 62.186.52.63 it -62.186.52.64 - 62.186.63.255 gb -62.186.64.0 - 62.186.64.127 ch -62.186.64.128 - 62.186.64.223 fr -62.186.64.224 - 62.186.67.31 ch -62.186.67.32 - 62.186.67.63 za -62.186.67.64 - 62.186.67.127 gb -62.186.67.128 - 62.186.70.255 ch -62.186.71.0 - 62.186.72.159 gb -62.186.72.160 - 62.186.72.223 de -62.186.72.224 - 62.186.72.255 es -62.186.73.0 - 62.186.73.255 nl -62.186.74.0 - 62.186.75.255 ch -62.186.76.0 - 62.186.76.63 se -62.186.76.64 - 62.186.76.127 be -62.186.76.128 - 62.186.76.255 se -62.186.77.0 - 62.186.77.63 tr -62.186.77.64 - 62.186.77.127 ro -62.186.77.128 - 62.186.79.127 hu -62.186.79.128 - 62.186.79.255 eu -62.186.80.0 - 62.186.85.191 it -62.186.85.192 - 62.186.85.255 no -62.186.86.0 - 62.186.89.31 it -62.186.89.32 - 62.186.89.47 de -62.186.89.48 - 62.186.89.55 nl -62.186.89.56 - 62.186.89.63 fr -62.186.89.64 - 62.186.89.127 it -62.186.89.128 - 62.186.89.255 be -62.186.90.0 - 62.186.93.255 it -62.186.94.0 - 62.186.94.127 be -62.186.94.128 - 62.186.94.159 it -62.186.94.160 - 62.186.94.191 at -62.186.94.192 - 62.186.94.255 za -62.186.95.0 - 62.186.95.191 be -62.186.95.192 - 62.186.95.223 gb -62.186.95.224 - 62.186.95.255 ru -62.186.96.0 - 62.186.97.127 fr -62.186.97.128 - 62.186.97.255 nl -62.186.98.0 - 62.186.98.95 fr -62.186.98.96 - 62.186.98.127 it -62.186.98.128 - 62.186.98.191 gb -62.186.98.192 - 62.186.102.159 fr -62.186.102.160 - 62.186.102.191 de -62.186.102.192 - 62.186.102.207 it -62.186.102.208 - 62.186.102.215 gb -62.186.102.216 - 62.186.102.223 nl -62.186.102.224 - 62.186.102.255 ro -62.186.103.0 - 62.186.104.15 fr -62.186.104.16 - 62.186.104.31 nl -62.186.104.32 - 62.186.104.63 fr -62.186.104.64 - 62.186.104.95 za -62.186.104.96 - 62.186.104.127 eu -62.186.104.128 - 62.186.104.255 ch -62.186.105.0 - 62.186.106.159 fr -62.186.106.160 - 62.186.106.175 za -62.186.106.176 - 62.186.106.223 fr -62.186.106.224 - 62.186.106.255 gb -62.186.107.0 - 62.186.108.31 fr -62.186.108.32 - 62.186.108.47 za -62.186.108.48 - 62.186.108.63 gb -62.186.108.64 - 62.186.108.127 fr -62.186.108.128 - 62.186.108.255 gb -62.186.109.0 - 62.186.111.255 fr -62.186.112.0 - 62.186.118.223 at -62.186.118.224 - 62.186.118.239 fr -62.186.118.240 - 62.186.118.255 se -62.186.119.0 - 62.186.120.31 at -62.186.120.32 - 62.186.120.63 za -62.186.120.64 - 62.186.120.79 de -62.186.120.80 - 62.186.120.95 za -62.186.120.96 - 62.186.120.127 de -62.186.120.128 - 62.186.121.95 at -62.186.121.96 - 62.186.122.63 gb -62.186.122.64 - 62.186.122.127 be -62.186.122.128 - 62.186.122.191 fr -62.186.122.192 - 62.186.122.255 gb -62.186.123.0 - 62.186.123.255 at -62.186.124.0 - 62.186.127.255 gb -62.186.128.0 - 62.186.128.7 nl -62.186.128.8 - 62.186.128.15 de -62.186.128.16 - 62.186.128.95 nl -62.186.128.96 - 62.186.128.127 be -62.186.128.128 - 62.186.128.191 gb -62.186.128.192 - 62.186.128.255 be -62.186.129.0 - 62.186.132.255 eu -62.186.133.0 - 62.186.137.167 nl -62.186.137.168 - 62.186.137.175 eu -62.186.137.176 - 62.186.137.183 nl -62.186.137.184 - 62.186.137.191 gb -62.186.137.192 - 62.186.137.255 ch -62.186.138.0 - 62.186.138.255 eu -62.186.139.0 - 62.186.139.159 nl -62.186.139.160 - 62.186.139.191 de -62.186.139.192 - 62.186.143.255 nl -62.186.144.0 - 62.186.145.127 cz -62.186.145.128 - 62.186.145.255 eu -62.186.146.0 - 62.186.147.255 ie -62.186.148.0 - 62.186.151.255 be -62.186.152.0 - 62.186.154.63 de -62.186.154.64 - 62.186.154.127 za -62.186.154.128 - 62.186.154.159 gb -62.186.154.160 - 62.186.154.191 de -62.186.154.192 - 62.186.154.223 it -62.186.154.224 - 62.186.154.255 de -62.186.155.0 - 62.186.156.47 no -62.186.156.48 - 62.186.156.63 de -62.186.156.64 - 62.186.156.95 at -62.186.156.96 - 62.186.156.127 it -62.186.156.128 - 62.186.156.255 gb -62.186.157.0 - 62.186.157.79 no -62.186.157.80 - 62.186.157.87 eu -62.186.157.88 - 62.186.157.255 no -62.186.158.0 - 62.186.159.255 za -62.186.160.0 - 62.186.165.255 be -62.186.166.0 - 62.186.167.191 it -62.186.167.192 - 62.186.167.223 eu -62.186.167.224 - 62.186.167.255 it -62.186.168.0 - 62.186.170.127 gb -62.186.170.128 - 62.186.170.159 de -62.186.170.160 - 62.186.170.175 gb -62.186.170.176 - 62.186.170.191 za -62.186.170.192 - 62.186.170.255 de -62.186.171.0 - 62.186.175.255 gb -62.186.176.0 - 62.186.178.191 za -62.186.178.192 - 62.186.178.207 se -62.186.178.208 - 62.186.178.223 fr -62.186.178.224 - 62.186.180.31 za -62.186.180.32 - 62.186.180.63 ch -62.186.180.64 - 62.186.180.127 za -62.186.180.128 - 62.186.180.135 eu -62.186.180.136 - 62.186.180.143 ch -62.186.180.144 - 62.186.180.191 eu -62.186.180.192 - 62.186.180.255 nl -62.186.181.0 - 62.186.183.31 za -62.186.183.32 - 62.186.183.63 eu -62.186.183.64 - 62.186.186.95 za -62.186.186.96 - 62.186.186.111 gb -62.186.186.112 - 62.186.186.119 es -62.186.186.120 - 62.186.186.127 be -62.186.186.128 - 62.186.186.255 gb -62.186.187.0 - 62.186.187.191 za -62.186.187.192 - 62.186.187.255 be +62.185.248.0 - 62.186.7.63 eu +62.186.7.64 - 62.186.7.79 de +62.186.7.80 - 62.186.39.255 eu +62.186.40.0 - 62.186.43.255 gb +62.186.44.0 - 62.186.78.255 eu +62.186.79.0 - 62.186.79.127 hu +62.186.79.128 - 62.186.109.255 eu +62.186.110.0 - 62.186.110.255 fr +62.186.111.0 - 62.186.111.255 eu +62.186.112.0 - 62.186.115.255 at +62.186.116.0 - 62.186.120.47 eu +62.186.120.48 - 62.186.120.63 za +62.186.120.64 - 62.186.171.255 eu +62.186.172.0 - 62.186.175.255 gb +62.186.176.0 - 62.186.187.255 eu 62.186.188.0 - 62.186.191.255 za -62.186.192.0 - 62.186.192.79 pt -62.186.192.80 - 62.186.192.87 eu -62.186.192.88 - 62.186.192.255 pt -62.186.193.0 - 62.186.193.15 eu -62.186.193.16 - 62.186.193.31 fr -62.186.193.32 - 62.186.193.255 eu -62.186.194.0 - 62.186.195.255 nl -62.186.196.0 - 62.186.198.63 ch -62.186.198.64 - 62.186.198.79 gb -62.186.198.80 - 62.186.198.95 it -62.186.198.96 - 62.186.198.127 at -62.186.198.128 - 62.186.198.191 de -62.186.198.192 - 62.186.198.255 gb -62.186.199.0 - 62.186.199.255 ch -62.186.200.0 - 62.186.200.191 es -62.186.200.192 - 62.186.200.255 be -62.186.201.0 - 62.186.204.95 es -62.186.204.96 - 62.186.204.127 fr -62.186.204.128 - 62.186.204.255 be -62.186.205.0 - 62.186.205.191 es -62.186.205.192 - 62.186.205.255 de -62.186.206.0 - 62.186.207.255 es -62.186.208.0 - 62.186.208.71 be -62.186.208.72 - 62.186.208.79 za -62.186.208.80 - 62.186.208.95 fr -62.186.208.96 - 62.186.208.127 de -62.186.208.128 - 62.186.208.191 be -62.186.208.192 - 62.186.208.255 de -62.186.209.0 - 62.186.219.255 be -62.186.220.0 - 62.186.221.55 dk -62.186.221.56 - 62.186.221.63 fr -62.186.221.64 - 62.186.221.255 dk -62.186.222.0 - 62.186.223.255 za -62.186.224.0 - 62.186.225.63 gb -62.186.225.64 - 62.186.225.95 no -62.186.225.96 - 62.186.227.255 gb -62.186.228.0 - 62.186.228.191 nl -62.186.228.192 - 62.186.228.223 eu -62.186.228.224 - 62.186.231.255 nl -62.186.232.0 - 62.186.234.31 de -62.186.234.32 - 62.186.234.63 za -62.186.234.64 - 62.186.234.127 de -62.186.234.128 - 62.186.234.143 za -62.186.234.144 - 62.186.234.159 de -62.186.234.160 - 62.186.234.191 gb -62.186.234.192 - 62.186.234.255 za -62.186.235.0 - 62.186.236.255 de -62.186.237.0 - 62.186.237.255 ch -62.186.238.0 - 62.186.239.127 be -62.186.239.128 - 62.186.239.255 eu -62.186.240.0 - 62.186.243.207 at -62.186.243.208 - 62.186.243.223 eu -62.186.243.224 - 62.186.243.255 at -62.186.244.0 - 62.186.247.255 fr -62.186.248.0 - 62.186.250.255 de -62.186.251.0 - 62.186.251.255 eu -62.186.252.0 - 62.186.255.255 gb -62.187.0.0 - 62.187.3.255 de -62.187.4.0 - 62.187.13.255 eu -62.187.14.0 - 62.187.15.255 de -62.187.16.0 - 62.187.19.255 cz -62.187.20.0 - 62.187.20.127 pl -62.187.20.128 - 62.187.20.255 eu -62.187.21.0 - 62.187.21.127 pl -62.187.21.128 - 62.187.21.255 eu -62.187.22.0 - 62.187.31.255 za -62.187.32.0 - 62.187.35.255 de -62.187.36.0 - 62.187.37.63 no -62.187.37.64 - 62.187.37.127 eu -62.187.37.128 - 62.187.37.255 no -62.187.38.0 - 62.187.39.223 es -62.187.39.224 - 62.187.39.239 gb -62.187.39.240 - 62.187.39.255 fr -62.187.40.0 - 62.187.40.127 eu -62.187.40.128 - 62.187.40.135 sk -62.187.40.136 - 62.187.40.255 eu -62.187.41.0 - 62.187.41.255 fr -62.187.42.0 - 62.187.43.255 at -62.187.44.0 - 62.187.47.255 gb -62.187.48.0 - 62.187.48.31 fr -62.187.48.32 - 62.187.48.47 nl -62.187.48.48 - 62.187.48.63 eu -62.187.48.64 - 62.187.49.191 nl -62.187.49.192 - 62.187.49.255 eu -62.187.50.0 - 62.187.51.255 gb -62.187.52.0 - 62.187.53.255 nl -62.187.54.0 - 62.187.55.255 ch -62.187.56.0 - 62.187.59.255 nl -62.187.60.0 - 62.187.61.127 at -62.187.61.128 - 62.187.61.191 eu -62.187.61.192 - 62.187.61.255 at -62.187.62.0 - 62.187.63.95 nl -62.187.63.96 - 62.187.63.111 fr -62.187.63.112 - 62.187.63.119 nl -62.187.63.120 - 62.187.63.127 fr -62.187.63.128 - 62.187.67.255 gb -62.187.68.0 - 62.187.68.95 no -62.187.68.96 - 62.187.68.191 eu -62.187.68.192 - 62.187.68.255 fr -62.187.69.0 - 62.187.69.255 eu -62.187.70.0 - 62.187.70.255 no -62.187.71.0 - 62.187.71.255 de -62.187.72.0 - 62.187.72.239 fr -62.187.72.240 - 62.187.72.255 be -62.187.73.0 - 62.187.75.127 fr -62.187.75.128 - 62.187.75.143 eu -62.187.75.144 - 62.187.79.255 fr -62.187.80.0 - 62.187.81.255 es -62.187.82.0 - 62.187.85.255 gb -62.187.86.0 - 62.187.87.31 es -62.187.87.32 - 62.187.87.63 eu -62.187.87.64 - 62.187.87.191 es -62.187.87.192 - 62.187.87.255 eu -62.187.88.0 - 62.187.88.223 za -62.187.88.224 - 62.187.88.255 eu -62.187.89.0 - 62.187.89.255 za -62.187.90.0 - 62.187.92.255 eu -62.187.93.0 - 62.187.99.255 fr -62.187.100.0 - 62.187.103.255 gb -62.187.104.0 - 62.187.107.255 fr -62.187.108.0 - 62.187.109.255 za -62.187.110.0 - 62.187.110.223 fr -62.187.110.224 - 62.187.110.255 eu -62.187.111.0 - 62.187.111.255 be -62.187.112.0 - 62.187.116.191 gb -62.187.116.192 - 62.187.116.255 eu -62.187.117.0 - 62.187.127.95 gb -62.187.127.96 - 62.187.127.103 eu -62.187.127.104 - 62.187.127.119 gb -62.187.127.120 - 62.187.127.127 eu -62.187.127.128 - 62.187.127.255 gb -62.187.128.0 - 62.187.131.223 fr -62.187.131.224 - 62.187.131.255 eu -62.187.132.0 - 62.187.143.255 fr -62.187.144.0 - 62.187.144.255 nl -62.187.145.0 - 62.187.145.255 de -62.187.146.0 - 62.187.159.255 nl -62.187.160.0 - 62.187.161.159 it -62.187.161.160 - 62.187.161.191 eu -62.187.161.192 - 62.187.166.159 it -62.187.166.160 - 62.187.166.191 eu -62.187.166.192 - 62.187.167.255 it -62.187.168.0 - 62.187.171.255 gb -62.187.172.0 - 62.187.172.255 ch -62.187.173.0 - 62.187.173.63 de -62.187.173.64 - 62.187.173.127 fr -62.187.173.128 - 62.187.173.255 de -62.187.174.0 - 62.187.174.255 gb -62.187.175.0 - 62.187.175.255 at +62.186.192.0 - 62.186.210.255 eu +62.186.211.0 - 62.186.214.255 be +62.186.215.0 - 62.186.221.47 eu +62.186.221.48 - 62.186.221.55 dk +62.186.221.56 - 62.187.26.79 eu +62.187.26.80 - 62.187.26.95 za +62.187.26.96 - 62.187.31.207 eu +62.187.31.208 - 62.187.31.223 za +62.187.31.224 - 62.187.151.255 eu +62.187.152.0 - 62.187.155.255 nl +62.187.156.0 - 62.187.166.255 eu +62.187.167.0 - 62.187.167.255 it +62.187.168.0 - 62.187.175.255 eu 62.187.176.0 - 62.187.179.255 ch 62.187.180.0 - 62.187.183.255 gb -62.187.184.0 - 62.187.185.255 ie -62.187.186.0 - 62.187.187.255 se -62.187.188.0 - 62.187.191.159 at -62.187.191.160 - 62.187.191.167 eu -62.187.191.168 - 62.187.191.255 at -62.187.192.0 - 62.187.198.255 be -62.187.199.0 - 62.187.199.127 eu -62.187.199.128 - 62.187.201.255 be +62.187.184.0 - 62.187.201.255 eu 62.187.202.0 - 62.187.202.255 nl -62.187.203.0 - 62.187.206.79 be -62.187.206.80 - 62.187.206.127 fr -62.187.206.128 - 62.187.206.191 be -62.187.206.192 - 62.187.206.223 gb -62.187.206.224 - 62.187.207.255 be -62.187.208.0 - 62.187.208.7 ua -62.187.208.8 - 62.187.208.255 eu -62.187.209.0 - 62.187.213.255 de -62.187.214.0 - 62.187.214.255 eu -62.187.215.0 - 62.187.215.255 de -62.187.216.0 - 62.187.217.255 es -62.187.218.0 - 62.187.218.63 ro -62.187.218.64 - 62.187.219.255 eu -62.187.220.0 - 62.187.221.255 gb -62.187.222.0 - 62.187.223.255 eu -62.187.224.0 - 62.187.224.223 dk -62.187.224.224 - 62.187.224.239 eu -62.187.224.240 - 62.187.225.95 dk -62.187.225.96 - 62.187.225.255 eu -62.187.226.0 - 62.187.227.255 gb -62.187.228.0 - 62.187.228.31 fi -62.187.228.32 - 62.187.228.39 eu -62.187.228.40 - 62.187.228.47 fi -62.187.228.48 - 62.187.228.127 eu -62.187.228.128 - 62.187.228.255 fi -62.187.229.0 - 62.187.229.255 eu -62.187.230.0 - 62.187.231.255 ch -62.187.232.0 - 62.187.234.255 ie -62.187.235.0 - 62.187.235.31 eu -62.187.235.32 - 62.187.235.63 ie -62.187.235.64 - 62.187.235.255 eu -62.187.236.0 - 62.187.240.255 gb -62.187.241.0 - 62.187.241.31 by -62.187.241.32 - 62.187.241.63 eu -62.187.241.64 - 62.187.253.191 gb -62.187.253.192 - 62.187.253.255 eu -62.187.254.0 - 62.187.254.127 gb -62.187.254.128 - 62.187.254.255 eu -62.187.255.0 - 62.189.28.223 gb -62.189.28.224 - 62.189.28.239 ge -62.189.28.240 - 62.189.88.223 gb -62.189.88.224 - 62.189.88.239 it -62.189.88.240 - 62.189.188.127 gb -62.189.188.128 - 62.189.188.191 ie -62.189.188.192 - 62.189.227.127 gb -62.189.227.128 - 62.189.227.191 fr -62.189.227.192 - 62.189.239.63 gb -62.189.239.64 - 62.189.239.71 ie -62.189.239.72 - 62.190.18.255 gb -62.190.19.0 - 62.190.19.255 se -62.190.20.0 - 62.190.30.255 gb -62.190.31.0 - 62.190.31.255 se -62.190.32.0 - 62.190.87.255 gb -62.190.88.0 - 62.190.89.255 se -62.190.90.0 - 62.190.101.255 gb -62.190.102.0 - 62.190.102.255 se -62.190.103.0 - 62.190.177.31 gb -62.190.177.32 - 62.190.177.63 it -62.190.177.64 - 62.191.255.255 gb -62.192.0.0 - 62.192.21.31 ch -62.192.21.32 - 62.192.21.47 de -62.192.21.48 - 62.192.28.31 ch -62.192.28.32 - 62.192.28.63 it -62.192.28.64 - 62.192.31.255 ch +62.187.203.0 - 62.187.217.255 eu +62.187.218.0 - 62.187.218.31 ro +62.187.218.32 - 62.187.255.255 eu +62.188.0.0 - 62.190.10.138 gb +62.190.10.139 - 62.190.10.139 eu +62.190.10.140 - 62.190.255.255 gb +62.191.0.0 - 62.191.31.255 nl +62.191.32.0 - 62.191.255.255 gb +62.192.0.0 - 62.192.31.255 ch 62.192.32.0 - 62.192.63.255 ru -62.192.64.0 - 62.192.127.255 nl -62.192.128.0 - 62.192.141.255 a2 -62.192.142.0 - 62.192.143.255 mw -62.192.144.0 - 62.192.159.255 a2 +62.192.64.0 - 62.192.75.255 gr +62.192.76.0 - 62.192.127.255 nl +62.192.128.0 - 62.192.128.255 de +62.192.129.0 - 62.192.129.255 eu +62.192.130.0 - 62.192.156.255 de +62.192.157.0 - 62.192.157.255 us +62.192.158.0 - 62.192.159.255 de 62.192.160.0 - 62.192.191.255 ru 62.192.192.0 - 62.192.223.255 de 62.192.224.0 - 62.192.255.255 ru @@ -14641,270 +13538,57 @@ 62.193.160.0 - 62.193.191.255 ng 62.193.192.0 - 62.193.255.255 fr 62.194.0.0 - 62.195.255.255 nl -62.196.0.0 - 62.196.58.71 it -62.196.58.72 - 62.196.58.79 tr -62.196.58.80 - 62.196.255.255 it +62.196.0.0 - 62.196.255.255 it 62.197.0.0 - 62.197.31.255 de 62.197.32.0 - 62.197.63.255 gb 62.197.64.0 - 62.197.127.255 be 62.197.128.0 - 62.197.159.255 nl 62.197.160.0 - 62.197.191.255 fi -62.197.192.0 - 62.197.222.255 sk -62.197.223.0 - 62.197.225.15 sr -62.197.225.16 - 62.197.255.255 sk +62.197.192.0 - 62.197.255.255 sk 62.198.0.0 - 62.199.255.255 dk -62.200.0.0 - 62.200.0.255 eu -62.200.1.0 - 62.200.1.255 at -62.200.2.0 - 62.200.3.31 eu -62.200.3.32 - 62.200.3.63 at -62.200.3.64 - 62.200.3.95 eu -62.200.3.96 - 62.200.3.111 at -62.200.3.112 - 62.200.3.255 eu -62.200.4.0 - 62.200.7.255 at -62.200.8.0 - 62.200.9.31 it -62.200.9.32 - 62.200.9.95 eu -62.200.9.96 - 62.200.9.131 it -62.200.9.132 - 62.200.9.143 eu -62.200.9.144 - 62.200.9.159 it -62.200.9.160 - 62.200.9.175 eu -62.200.9.176 - 62.200.9.239 it -62.200.9.240 - 62.200.13.255 eu -62.200.14.0 - 62.200.17.255 ch -62.200.18.0 - 62.200.19.255 eu -62.200.20.0 - 62.200.21.63 gb -62.200.21.64 - 62.200.21.127 eu -62.200.21.128 - 62.200.21.135 gb -62.200.21.136 - 62.200.21.143 eu -62.200.21.144 - 62.200.21.191 gb -62.200.21.192 - 62.200.21.255 eu -62.200.22.0 - 62.200.23.255 gb -62.200.24.0 - 62.200.24.255 ch -62.200.25.0 - 62.200.25.31 fr -62.200.25.32 - 62.200.25.47 eu -62.200.25.48 - 62.200.25.63 fr -62.200.25.64 - 62.200.25.79 eu -62.200.25.80 - 62.200.25.143 fr -62.200.25.144 - 62.200.25.175 eu -62.200.25.176 - 62.200.26.31 fr -62.200.26.32 - 62.200.26.39 eu -62.200.26.40 - 62.200.26.47 fr -62.200.26.48 - 62.200.26.55 eu -62.200.26.56 - 62.200.26.111 fr -62.200.26.112 - 62.200.26.119 eu -62.200.26.120 - 62.200.26.255 fr -62.200.27.0 - 62.200.29.15 eu -62.200.29.16 - 62.200.29.39 fr -62.200.29.40 - 62.200.29.47 de -62.200.29.48 - 62.200.29.143 fr -62.200.29.144 - 62.200.29.159 eu -62.200.29.160 - 62.200.29.175 fr -62.200.29.176 - 62.200.30.31 eu -62.200.30.32 - 62.200.30.63 fr -62.200.30.64 - 62.200.30.95 eu -62.200.30.96 - 62.200.30.103 fr -62.200.30.104 - 62.200.30.111 eu -62.200.30.112 - 62.200.31.159 fr -62.200.31.160 - 62.200.31.175 eu -62.200.31.176 - 62.200.31.183 gb -62.200.31.184 - 62.200.31.191 fr -62.200.31.192 - 62.200.31.199 eu -62.200.31.200 - 62.200.31.255 fr -62.200.32.0 - 62.200.40.255 eu -62.200.41.0 - 62.200.44.95 gr -62.200.44.96 - 62.200.44.255 eu -62.200.45.0 - 62.200.47.255 gr -62.200.48.0 - 62.200.51.255 eu -62.200.52.0 - 62.200.52.39 gb -62.200.52.40 - 62.200.52.55 eu -62.200.52.56 - 62.200.54.127 gb -62.200.54.128 - 62.200.54.255 eu -62.200.55.0 - 62.200.55.31 gb -62.200.55.32 - 62.200.55.95 eu -62.200.55.96 - 62.200.55.159 gb -62.200.55.160 - 62.200.55.167 eu -62.200.55.168 - 62.200.55.191 gb -62.200.55.192 - 62.200.55.255 eu -62.200.56.0 - 62.200.56.63 za -62.200.56.64 - 62.200.56.255 eu -62.200.57.0 - 62.200.59.255 za -62.200.60.0 - 62.200.64.255 eu -62.200.65.0 - 62.200.65.127 cz -62.200.65.128 - 62.200.68.255 eu -62.200.69.0 - 62.200.69.255 dk -62.200.70.0 - 62.200.70.255 eu -62.200.71.0 - 62.200.71.47 dk -62.200.71.48 - 62.200.71.79 eu -62.200.71.80 - 62.200.71.103 dk -62.200.71.104 - 62.200.71.111 eu -62.200.71.112 - 62.200.71.143 dk -62.200.71.144 - 62.200.71.159 eu -62.200.71.160 - 62.200.71.191 dk -62.200.71.192 - 62.200.71.255 eu -62.200.72.0 - 62.200.73.191 gb -62.200.73.192 - 62.200.73.199 eu -62.200.73.200 - 62.200.74.255 gb -62.200.75.0 - 62.200.75.127 eu -62.200.75.128 - 62.200.75.255 gb -62.200.76.0 - 62.200.76.15 eu -62.200.76.16 - 62.200.76.31 cz -62.200.76.32 - 62.200.79.255 eu -62.200.80.0 - 62.200.86.111 gb -62.200.86.112 - 62.200.86.119 eu -62.200.86.120 - 62.200.87.255 gb -62.200.88.0 - 62.200.88.175 za -62.200.88.176 - 62.200.88.255 eu -62.200.89.0 - 62.200.89.255 gb -62.200.90.0 - 62.200.91.255 eu -62.200.92.0 - 62.200.93.255 gb -62.200.94.0 - 62.200.94.255 fi -62.200.95.0 - 62.200.95.15 eu -62.200.95.16 - 62.200.95.23 fi -62.200.95.24 - 62.200.95.31 eu -62.200.95.32 - 62.200.95.39 fi -62.200.95.40 - 62.200.95.63 eu -62.200.95.64 - 62.200.95.95 fi -62.200.95.96 - 62.200.95.255 eu -62.200.96.0 - 62.200.99.255 de -62.200.100.0 - 62.200.100.31 eu -62.200.100.32 - 62.200.100.127 de -62.200.100.128 - 62.200.100.255 eu -62.200.101.0 - 62.200.101.255 de -62.200.102.0 - 62.200.123.255 eu -62.200.124.0 - 62.200.124.63 be -62.200.124.64 - 62.200.124.95 eu -62.200.124.96 - 62.200.124.111 gb -62.200.124.112 - 62.200.124.119 eu -62.200.124.120 - 62.200.124.127 be -62.200.124.128 - 62.200.124.191 eu -62.200.124.192 - 62.200.124.207 be -62.200.124.208 - 62.200.124.223 eu -62.200.124.224 - 62.200.125.255 be -62.200.126.0 - 62.200.126.255 fi -62.200.127.0 - 62.200.127.255 dk -62.200.128.0 - 62.200.129.255 eu -62.200.130.0 - 62.200.131.255 za -62.200.132.0 - 62.200.132.255 eu -62.200.133.0 - 62.200.133.223 za -62.200.133.224 - 62.200.133.255 eu -62.200.134.0 - 62.200.134.191 za -62.200.134.192 - 62.200.134.223 eu -62.200.134.224 - 62.200.134.239 za -62.200.134.240 - 62.200.134.247 eu -62.200.134.248 - 62.200.134.255 za -62.200.135.0 - 62.200.135.31 eu -62.200.135.32 - 62.200.135.127 za -62.200.135.128 - 62.200.135.255 eu -62.200.136.0 - 62.200.136.63 es -62.200.136.64 - 62.200.136.95 eu -62.200.136.96 - 62.200.136.119 es -62.200.136.120 - 62.200.136.223 eu -62.200.136.224 - 62.200.136.255 es -62.200.137.0 - 62.200.139.255 eu -62.200.140.0 - 62.200.140.255 es -62.200.141.0 - 62.200.143.255 eu -62.200.144.0 - 62.200.144.31 nl -62.200.144.32 - 62.200.144.127 eu -62.200.144.128 - 62.200.144.207 nl -62.200.144.208 - 62.200.144.223 eu -62.200.144.224 - 62.200.144.247 nl -62.200.144.248 - 62.200.144.255 eu -62.200.145.0 - 62.200.145.175 nl -62.200.145.176 - 62.200.145.191 eu -62.200.145.192 - 62.200.145.215 nl -62.200.145.216 - 62.200.145.255 eu -62.200.146.0 - 62.200.147.47 nl -62.200.147.48 - 62.200.147.95 eu -62.200.147.96 - 62.200.147.127 nl -62.200.147.128 - 62.200.147.223 eu -62.200.147.224 - 62.200.147.255 nl -62.200.148.0 - 62.200.149.255 eu +62.200.0.0 - 62.200.0.23 eu +62.200.0.24 - 62.200.0.31 at +62.200.0.32 - 62.200.0.63 eu +62.200.0.64 - 62.200.0.87 at +62.200.0.88 - 62.200.1.255 eu +62.200.2.0 - 62.200.7.255 at +62.200.8.0 - 62.200.9.255 eu +62.200.10.0 - 62.200.11.255 it +62.200.12.0 - 62.200.25.63 eu +62.200.25.64 - 62.200.25.79 fr +62.200.25.80 - 62.200.71.103 eu +62.200.71.104 - 62.200.71.119 dk +62.200.71.120 - 62.200.71.143 eu +62.200.71.144 - 62.200.71.159 dk +62.200.71.160 - 62.200.94.255 eu +62.200.95.0 - 62.200.95.31 fi +62.200.95.32 - 62.200.100.31 eu +62.200.100.32 - 62.200.100.47 de +62.200.100.48 - 62.200.121.255 eu +62.200.122.0 - 62.200.123.255 de +62.200.124.0 - 62.200.124.167 eu +62.200.124.168 - 62.200.124.191 be +62.200.124.192 - 62.200.124.207 eu +62.200.124.208 - 62.200.124.215 be +62.200.124.216 - 62.200.136.31 eu +62.200.136.32 - 62.200.136.63 es +62.200.136.64 - 62.200.136.107 eu +62.200.136.108 - 62.200.136.127 es +62.200.136.128 - 62.200.149.255 eu 62.200.150.0 - 62.200.153.255 be -62.200.154.0 - 62.200.154.63 eu -62.200.154.64 - 62.200.154.175 dk -62.200.154.176 - 62.200.154.183 eu -62.200.154.184 - 62.200.154.207 dk -62.200.154.208 - 62.200.154.223 eu -62.200.154.224 - 62.200.155.255 dk -62.200.156.0 - 62.200.156.255 se -62.200.157.0 - 62.200.159.255 eu -62.200.160.0 - 62.200.164.255 za -62.200.165.0 - 62.200.165.255 eu -62.200.166.0 - 62.200.166.31 za -62.200.166.32 - 62.200.166.39 eu -62.200.166.40 - 62.200.166.95 za -62.200.166.96 - 62.200.168.7 eu -62.200.168.8 - 62.200.168.31 ch -62.200.168.32 - 62.200.168.255 eu -62.200.169.0 - 62.200.169.255 za -62.200.170.0 - 62.200.171.255 fi -62.200.172.0 - 62.200.173.63 no -62.200.173.64 - 62.200.173.95 eu -62.200.173.96 - 62.200.173.103 no -62.200.173.104 - 62.200.173.255 eu -62.200.174.0 - 62.200.175.31 no -62.200.175.32 - 62.200.175.63 eu -62.200.175.64 - 62.200.175.127 no -62.200.175.128 - 62.200.175.199 eu -62.200.175.200 - 62.200.175.207 no -62.200.175.208 - 62.200.175.223 eu -62.200.175.224 - 62.200.175.231 no -62.200.175.232 - 62.200.175.239 eu -62.200.175.240 - 62.200.175.255 no -62.200.176.0 - 62.200.177.255 at -62.200.178.0 - 62.200.178.255 za -62.200.179.0 - 62.200.179.63 eu -62.200.179.64 - 62.200.179.95 nl -62.200.179.96 - 62.200.179.255 eu -62.200.180.0 - 62.200.183.127 gb -62.200.183.128 - 62.200.183.135 eu -62.200.183.136 - 62.200.183.255 gb -62.200.184.0 - 62.200.191.255 eu -62.200.192.0 - 62.200.193.255 fi -62.200.194.0 - 62.200.197.255 eu -62.200.198.0 - 62.200.198.95 pk -62.200.198.96 - 62.200.198.127 eu -62.200.198.128 - 62.200.198.191 pk -62.200.198.192 - 62.200.207.255 eu -62.200.208.0 - 62.200.209.255 nl -62.200.210.0 - 62.200.211.31 eu -62.200.211.32 - 62.200.211.47 pt -62.200.211.48 - 62.200.212.255 eu -62.200.213.0 - 62.200.214.255 nl -62.200.215.0 - 62.200.215.255 eu -62.200.216.0 - 62.200.216.63 ie -62.200.216.64 - 62.200.216.255 eu -62.200.217.0 - 62.200.217.191 ie -62.200.217.192 - 62.200.217.207 eu -62.200.217.208 - 62.200.217.215 ie -62.200.217.216 - 62.200.217.231 eu -62.200.217.232 - 62.200.217.247 ie -62.200.217.248 - 62.200.217.255 eu -62.200.218.0 - 62.200.218.87 be -62.200.218.88 - 62.200.218.255 eu -62.200.219.0 - 62.200.219.255 be -62.200.220.0 - 62.200.223.255 eu -62.200.224.0 - 62.200.224.255 il -62.200.225.0 - 62.200.228.143 eu -62.200.228.144 - 62.200.228.159 ie -62.200.228.160 - 62.200.228.175 eu -62.200.228.176 - 62.200.228.255 ie -62.200.229.0 - 62.200.229.7 gb -62.200.229.8 - 62.200.229.31 ie -62.200.229.32 - 62.200.229.47 eu -62.200.229.48 - 62.200.229.63 ie -62.200.229.64 - 62.200.231.255 eu +62.200.154.0 - 62.200.159.255 eu +62.200.160.0 - 62.200.163.255 za +62.200.164.0 - 62.200.176.255 eu +62.200.177.0 - 62.200.177.255 at +62.200.178.0 - 62.200.213.255 eu +62.200.214.0 - 62.200.214.255 nl +62.200.215.0 - 62.200.216.63 eu +62.200.216.64 - 62.200.216.79 ie +62.200.216.80 - 62.200.229.191 eu +62.200.229.192 - 62.200.229.207 gb +62.200.229.208 - 62.200.231.255 eu 62.200.232.0 - 62.200.232.255 il -62.200.233.0 - 62.200.233.255 eu -62.200.234.0 - 62.200.234.159 il -62.200.234.160 - 62.200.234.191 eu -62.200.234.192 - 62.200.234.223 il -62.200.234.224 - 62.200.234.255 eu -62.200.235.0 - 62.200.235.79 il -62.200.235.80 - 62.200.235.103 eu -62.200.235.104 - 62.200.235.111 il -62.200.235.112 - 62.200.235.119 eu -62.200.235.120 - 62.200.235.127 il -62.200.235.128 - 62.200.235.159 eu +62.200.233.0 - 62.200.235.159 eu 62.200.235.160 - 62.200.235.255 il 62.200.236.0 - 62.200.255.255 eu 62.201.0.0 - 62.201.15.255 es @@ -14929,9 +13613,7 @@ 62.205.128.0 - 62.205.159.255 ua 62.205.160.0 - 62.205.191.255 ru 62.205.192.0 - 62.205.255.255 lv -62.206.0.0 - 62.206.57.235 de -62.206.57.236 - 62.206.57.239 gb -62.206.57.240 - 62.206.255.255 de +62.206.0.0 - 62.206.255.255 de 62.207.0.0 - 62.207.255.255 nl 62.208.0.0 - 62.208.1.255 de 62.208.2.0 - 62.208.2.31 eu @@ -14946,9 +13628,13 @@ 62.208.10.0 - 62.208.10.7 gb 62.208.10.8 - 62.208.10.127 eu 62.208.10.128 - 62.208.10.255 gb -62.208.11.0 - 62.208.20.15 eu +62.208.11.0 - 62.208.19.255 eu +62.208.20.0 - 62.208.20.7 de +62.208.20.8 - 62.208.20.15 eu 62.208.20.16 - 62.208.20.23 de -62.208.20.24 - 62.208.20.127 eu +62.208.20.24 - 62.208.20.63 eu +62.208.20.64 - 62.208.20.95 de +62.208.20.96 - 62.208.20.127 eu 62.208.20.128 - 62.208.20.255 nl 62.208.21.0 - 62.208.23.255 eu 62.208.24.0 - 62.208.26.255 es @@ -14957,7 +13643,9 @@ 62.208.28.0 - 62.208.30.255 eu 62.208.31.0 - 62.208.32.255 de 62.208.33.0 - 62.208.33.255 be -62.208.34.0 - 62.208.42.255 eu +62.208.34.0 - 62.208.35.255 eu +62.208.36.0 - 62.208.39.255 gb +62.208.40.0 - 62.208.42.255 eu 62.208.43.0 - 62.208.43.255 de 62.208.44.0 - 62.208.47.255 eu 62.208.48.0 - 62.208.48.255 de @@ -14972,14 +13660,16 @@ 62.208.73.0 - 62.208.73.255 gb 62.208.74.0 - 62.208.75.255 fk 62.208.76.0 - 62.208.76.255 de -62.208.77.0 - 62.208.84.15 eu +62.208.77.0 - 62.208.79.255 eu +62.208.80.0 - 62.208.83.255 de +62.208.84.0 - 62.208.84.15 eu 62.208.84.16 - 62.208.84.31 de 62.208.84.32 - 62.208.84.63 eu 62.208.84.64 - 62.208.84.127 de 62.208.84.128 - 62.208.94.255 eu 62.208.95.0 - 62.208.95.31 dk -62.208.95.32 - 62.208.95.47 gb -62.208.95.48 - 62.208.96.255 eu +62.208.95.32 - 62.208.95.255 gb +62.208.96.0 - 62.208.96.255 eu 62.208.97.0 - 62.208.97.255 de 62.208.98.0 - 62.208.98.255 gb 62.208.99.0 - 62.208.99.255 de @@ -15017,9 +13707,7 @@ 62.208.183.32 - 62.208.183.255 eu 62.208.184.0 - 62.208.184.255 de 62.208.185.0 - 62.208.185.255 es -62.208.186.0 - 62.208.187.47 de -62.208.187.48 - 62.208.187.55 eu -62.208.187.56 - 62.208.187.71 de +62.208.186.0 - 62.208.187.71 de 62.208.187.72 - 62.208.187.79 eu 62.208.187.80 - 62.208.187.95 de 62.208.187.96 - 62.208.189.255 eu @@ -15031,9 +13719,14 @@ 62.208.191.224 - 62.208.191.231 eu 62.208.191.232 - 62.208.191.239 de 62.208.191.240 - 62.208.191.255 eu -62.208.192.0 - 62.208.193.159 es +62.208.192.0 - 62.208.193.63 es +62.208.193.64 - 62.208.193.127 eu +62.208.193.128 - 62.208.193.159 es 62.208.193.160 - 62.208.193.167 gb -62.208.193.168 - 62.208.194.255 eu +62.208.193.168 - 62.208.193.175 es +62.208.193.176 - 62.208.193.191 eu +62.208.193.192 - 62.208.193.255 fr +62.208.194.0 - 62.208.194.255 eu 62.208.195.0 - 62.208.197.255 de 62.208.198.0 - 62.208.199.255 eu 62.208.200.0 - 62.208.200.255 de @@ -15044,17 +13737,22 @@ 62.208.206.0 - 62.208.206.255 de 62.208.207.0 - 62.208.208.255 eu 62.208.209.0 - 62.208.209.63 de -62.208.209.64 - 62.208.210.255 eu +62.208.209.64 - 62.208.209.127 eu +62.208.209.128 - 62.208.209.255 fr +62.208.210.0 - 62.208.210.255 eu 62.208.211.0 - 62.208.213.255 de 62.208.214.0 - 62.208.223.255 eu -62.208.224.0 - 62.208.226.255 de +62.208.224.0 - 62.208.224.255 de +62.208.225.0 - 62.208.225.255 gb +62.208.226.0 - 62.208.226.255 de 62.208.227.0 - 62.208.227.255 eu 62.208.228.0 - 62.208.231.255 de 62.208.232.0 - 62.208.233.255 gb 62.208.234.0 - 62.208.235.7 de 62.208.235.8 - 62.208.235.15 eu 62.208.235.16 - 62.208.235.31 de -62.208.235.32 - 62.208.235.127 gb +62.208.235.32 - 62.208.235.63 eu +62.208.235.64 - 62.208.235.127 gb 62.208.235.128 - 62.208.235.255 eu 62.208.236.0 - 62.208.246.255 de 62.208.247.0 - 62.208.247.255 eu @@ -15062,41 +13760,16 @@ 62.208.250.0 - 62.208.251.255 gb 62.208.252.0 - 62.208.255.255 de 62.209.0.0 - 62.209.31.255 bh -62.209.32.0 - 62.209.32.11 de -62.209.32.12 - 62.209.32.15 gb -62.209.32.16 - 62.209.33.79 de -62.209.33.80 - 62.209.33.95 gb -62.209.33.96 - 62.209.39.95 de -62.209.39.96 - 62.209.39.127 gb -62.209.39.128 - 62.209.40.63 de -62.209.40.64 - 62.209.40.79 fr -62.209.40.80 - 62.209.40.87 gb -62.209.40.88 - 62.209.40.95 ge -62.209.40.96 - 62.209.40.127 de -62.209.40.128 - 62.209.40.159 il -62.209.40.160 - 62.209.40.175 de -62.209.40.176 - 62.209.40.191 us -62.209.40.192 - 62.209.42.255 de -62.209.43.0 - 62.209.43.255 gb -62.209.44.0 - 62.209.45.151 de -62.209.45.152 - 62.209.45.159 us -62.209.45.160 - 62.209.45.191 gb -62.209.45.192 - 62.209.45.223 de -62.209.45.224 - 62.209.45.239 us -62.209.45.240 - 62.209.46.255 de -62.209.47.0 - 62.209.47.255 us -62.209.48.0 - 62.209.63.255 de +62.209.32.0 - 62.209.63.255 de 62.209.64.0 - 62.209.127.255 no 62.209.128.0 - 62.209.159.255 uz 62.209.160.0 - 62.209.166.247 se -62.209.166.248 - 62.209.166.255 fi -62.209.167.0 - 62.209.191.255 se +62.209.166.248 - 62.209.167.31 fi +62.209.167.32 - 62.209.191.255 se 62.209.192.0 - 62.209.255.255 cz -62.210.0.0 - 62.210.134.159 fr -62.210.134.160 - 62.210.134.191 us -62.210.134.192 - 62.210.136.127 fr -62.210.136.128 - 62.210.136.255 us -62.210.137.0 - 62.210.255.255 fr +62.210.0.0 - 62.210.71.60 fr +62.210.71.61 - 62.210.71.61 pt +62.210.71.62 - 62.210.255.255 fr 62.211.0.0 - 62.212.31.255 it 62.212.32.0 - 62.212.63.255 ge 62.212.64.0 - 62.212.95.255 nl @@ -15109,31 +13782,29 @@ 62.213.128.0 - 62.213.131.255 gb 62.213.132.0 - 62.213.135.0 de 62.213.135.1 - 62.213.135.255 gb -62.213.136.0 - 62.213.143.0 de -62.213.143.1 - 62.213.143.255 gb +62.213.136.0 - 62.213.139.255 de +62.213.140.0 - 62.213.143.255 gb 62.213.144.0 - 62.213.151.0 de 62.213.151.1 - 62.213.151.255 gb 62.213.152.0 - 62.213.155.0 de 62.213.155.1 - 62.213.155.255 gb 62.213.156.0 - 62.213.159.0 de 62.213.159.1 - 62.213.159.255 gb -62.213.160.0 - 62.213.191.255 bg +62.213.160.0 - 62.213.191.255 fr 62.213.192.0 - 62.213.255.255 be -62.214.0.0 - 62.214.1.167 de -62.214.1.168 - 62.214.1.175 nl -62.214.1.176 - 62.214.255.255 de +62.214.0.0 - 62.214.255.255 de 62.215.0.0 - 62.215.255.255 kw 62.216.0.0 - 62.216.31.255 nl 62.216.32.0 - 62.216.63.255 ua 62.216.64.0 - 62.216.95.255 ro 62.216.96.0 - 62.216.127.255 fi -62.216.128.0 - 62.216.147.255 gb -62.216.148.0 - 62.216.149.255 eg -62.216.150.0 - 62.216.150.15 sg -62.216.150.16 - 62.216.150.31 hk -62.216.150.32 - 62.216.150.47 gb -62.216.150.48 - 62.216.150.63 us -62.216.150.64 - 62.216.159.255 gb +62.216.128.0 - 62.216.150.3 gb +62.216.150.4 - 62.216.150.4 sg +62.216.150.5 - 62.216.150.19 gb +62.216.150.20 - 62.216.150.20 hk +62.216.150.21 - 62.216.150.51 gb +62.216.150.52 - 62.216.150.52 us +62.216.150.53 - 62.216.159.255 gb 62.216.160.0 - 62.216.223.255 de 62.216.224.0 - 62.216.255.255 gb 62.217.0.0 - 62.217.31.255 fr @@ -15206,140 +13877,25 @@ 62.221.128.0 - 62.221.159.255 bg 62.221.160.0 - 62.221.191.255 it 62.221.192.0 - 62.223.255.255 nl -62.224.0.0 - 62.225.39.255 de -62.225.40.0 - 62.225.40.255 pl -62.225.41.0 - 62.225.65.175 de -62.225.65.176 - 62.225.65.183 es -62.225.65.184 - 62.225.140.199 de -62.225.140.200 - 62.225.140.207 at -62.225.140.208 - 62.225.178.255 de -62.225.179.0 - 62.225.179.255 fr -62.225.180.0 - 62.227.255.255 de -62.228.0.0 - 62.228.224.83 cy -62.228.224.84 - 62.228.253.255 gr -62.228.254.0 - 62.228.255.255 cy -62.229.0.0 - 62.229.3.255 eu -62.229.4.0 - 62.229.10.127 ch -62.229.10.128 - 62.229.10.223 eu -62.229.10.224 - 62.229.12.255 ch -62.229.13.0 - 62.229.14.255 eu -62.229.15.0 - 62.229.15.127 ch -62.229.15.128 - 62.229.16.127 eu -62.229.16.128 - 62.229.16.143 ch -62.229.16.144 - 62.229.16.231 eu -62.229.16.232 - 62.229.16.255 ch -62.229.17.0 - 62.229.20.159 eu -62.229.20.160 - 62.229.20.167 pt -62.229.20.168 - 62.229.22.255 eu -62.229.23.0 - 62.229.23.255 us -62.229.24.0 - 62.229.31.255 eu -62.229.32.0 - 62.229.32.15 cz -62.229.32.16 - 62.229.33.255 eu -62.229.34.0 - 62.229.34.255 cz -62.229.35.0 - 62.229.37.255 eu -62.229.38.0 - 62.229.38.255 cz -62.229.39.0 - 62.229.40.255 eu -62.229.41.0 - 62.229.41.255 cz -62.229.42.0 - 62.229.44.255 eu -62.229.45.0 - 62.229.45.255 cz -62.229.46.0 - 62.229.46.255 eu -62.229.47.0 - 62.229.47.255 cz -62.229.48.0 - 62.229.48.255 eu -62.229.49.0 - 62.229.54.255 cz -62.229.55.0 - 62.229.56.255 eu -62.229.57.0 - 62.229.58.255 cz -62.229.59.0 - 62.229.62.255 eu -62.229.63.0 - 62.229.63.255 cz -62.229.64.0 - 62.229.66.11 eu -62.229.66.12 - 62.229.66.99 pt -62.229.66.100 - 62.229.66.143 eu -62.229.66.144 - 62.229.66.147 pt -62.229.66.148 - 62.229.66.151 eu -62.229.66.152 - 62.229.66.215 pt -62.229.66.216 - 62.229.67.63 eu -62.229.67.64 - 62.229.67.127 pt -62.229.67.128 - 62.229.70.207 eu -62.229.70.208 - 62.229.70.251 pt -62.229.70.252 - 62.229.70.255 eu -62.229.71.0 - 62.229.71.7 pt -62.229.71.8 - 62.229.71.15 eu -62.229.71.16 - 62.229.71.47 pt -62.229.71.48 - 62.229.71.55 eu -62.229.71.56 - 62.229.71.143 pt -62.229.71.144 - 62.229.71.159 eu -62.229.71.160 - 62.229.71.255 pt -62.229.72.0 - 62.229.73.255 eu -62.229.74.0 - 62.229.74.159 pt -62.229.74.160 - 62.229.74.191 eu -62.229.74.192 - 62.229.76.255 pt -62.229.77.0 - 62.229.78.255 eu -62.229.79.0 - 62.229.81.127 pt -62.229.81.128 - 62.229.81.159 eu -62.229.81.160 - 62.229.82.255 pt -62.229.83.0 - 62.229.84.255 eu -62.229.85.0 - 62.229.87.255 pt -62.229.88.0 - 62.229.90.31 eu -62.229.90.32 - 62.229.90.63 pt -62.229.90.64 - 62.229.90.95 eu -62.229.90.96 - 62.229.90.123 pt -62.229.90.124 - 62.229.90.175 eu -62.229.90.176 - 62.229.90.207 pt -62.229.90.208 - 62.229.90.215 eu -62.229.90.216 - 62.229.90.223 pt -62.229.90.224 - 62.229.90.255 eu -62.229.91.0 - 62.229.91.15 pt -62.229.91.16 - 62.229.91.31 eu -62.229.91.32 - 62.229.91.39 pt -62.229.91.40 - 62.229.91.47 eu -62.229.91.48 - 62.229.91.255 pt -62.229.92.0 - 62.229.97.255 eu -62.229.98.0 - 62.229.98.63 nl -62.229.98.64 - 62.229.98.127 eu -62.229.98.128 - 62.229.98.175 nl -62.229.98.176 - 62.229.102.255 eu -62.229.103.0 - 62.229.103.127 be -62.229.103.128 - 62.229.110.255 eu -62.229.111.0 - 62.229.111.255 nl -62.229.112.0 - 62.229.112.95 eu -62.229.112.96 - 62.229.112.191 lu -62.229.112.192 - 62.229.112.255 eu -62.229.113.0 - 62.229.114.143 lu -62.229.114.144 - 62.229.114.255 eu -62.229.115.0 - 62.229.115.31 lu -62.229.115.32 - 62.229.115.255 eu -62.229.116.0 - 62.229.116.79 lu -62.229.116.80 - 62.229.120.255 eu -62.229.121.0 - 62.229.121.63 es -62.229.121.64 - 62.229.121.79 eu -62.229.121.80 - 62.229.121.95 es -62.229.121.96 - 62.229.121.127 eu -62.229.121.128 - 62.229.121.143 es -62.229.121.144 - 62.229.121.151 eu -62.229.121.152 - 62.229.121.159 es -62.229.121.160 - 62.229.121.255 eu -62.229.122.0 - 62.229.122.31 es -62.229.122.32 - 62.229.126.247 eu -62.229.126.248 - 62.229.126.255 pt -62.229.127.0 - 62.229.127.255 eu -62.229.128.0 - 62.229.128.255 tr -62.229.129.0 - 62.229.131.255 eu -62.229.132.0 - 62.229.132.255 tr -62.229.133.0 - 62.229.143.255 eu -62.229.144.0 - 62.229.144.255 nl -62.229.145.0 - 62.229.145.255 eu -62.229.146.0 - 62.229.147.255 nl -62.229.148.0 - 62.229.152.15 eu -62.229.152.16 - 62.229.152.31 nl -62.229.152.32 - 62.229.152.79 us -62.229.152.80 - 62.229.182.255 eu -62.229.183.0 - 62.229.183.255 gr -62.229.184.0 - 62.229.224.255 eu -62.229.225.0 - 62.229.225.255 es -62.229.226.0 - 62.229.226.63 eu -62.229.226.64 - 62.229.226.95 es -62.229.226.96 - 62.229.239.127 eu -62.229.239.128 - 62.229.239.143 es -62.229.239.144 - 62.230.255.255 eu +62.224.0.0 - 62.225.59.157 de +62.225.59.158 - 62.225.59.158 eu +62.225.59.159 - 62.225.159.255 de +62.225.160.0 - 62.225.160.255 eu +62.225.161.0 - 62.227.255.255 de +62.228.0.0 - 62.228.255.255 cy +62.229.0.0 - 62.229.31.255 ch +62.229.32.0 - 62.229.63.255 eu +62.229.64.0 - 62.229.95.255 pt +62.229.96.0 - 62.229.111.255 nl +62.229.112.0 - 62.229.119.255 lu +62.229.120.0 - 62.229.127.255 es +62.229.128.0 - 62.229.143.255 eu +62.229.144.0 - 62.229.159.255 nl +62.229.160.0 - 62.229.223.255 eu +62.229.224.0 - 62.229.239.255 es +62.229.240.0 - 62.229.255.255 eu +62.230.0.0 - 62.230.15.255 se +62.230.16.0 - 62.230.255.255 eu 62.231.0.0 - 62.231.31.255 ru 62.231.32.0 - 62.231.63.255 ie 62.231.64.0 - 62.231.127.255 ro @@ -15365,9 +13921,7 @@ 62.240.192.0 - 62.240.223.255 ch 62.240.224.0 - 62.240.255.255 fr 62.241.0.0 - 62.241.31.255 it -62.241.32.0 - 62.241.41.246 de -62.241.41.247 - 62.241.41.254 ch -62.241.41.255 - 62.241.63.255 de +62.241.32.0 - 62.241.63.255 de 62.241.64.0 - 62.241.127.255 fr 62.241.128.0 - 62.241.159.255 eg 62.241.160.0 - 62.241.191.255 gb @@ -15378,32 +13932,16 @@ 62.244.128.0 - 62.244.159.255 pl 62.244.160.0 - 62.244.191.255 gb 62.244.192.0 - 62.244.255.255 tr -62.245.0.0 - 62.245.2.31 ch -62.245.2.32 - 62.245.2.63 fr -62.245.2.64 - 62.245.2.111 mc -62.245.2.112 - 62.245.2.127 fr -62.245.2.128 - 62.245.2.191 ch -62.245.2.192 - 62.245.2.255 mc -62.245.3.0 - 62.245.31.255 ch +62.245.0.0 - 62.245.31.255 ch 62.245.32.0 - 62.245.63.255 ru 62.245.64.0 - 62.245.127.255 cz -62.245.128.0 - 62.245.167.47 de -62.245.167.48 - 62.245.167.55 a2 -62.245.167.56 - 62.245.167.127 de -62.245.167.128 - 62.245.167.191 a2 -62.245.167.192 - 62.246.255.255 de +62.245.128.0 - 62.245.233.255 de +62.245.234.0 - 62.245.234.255 fr +62.245.235.0 - 62.246.255.255 de 62.247.0.0 - 62.247.255.255 se 62.248.0.0 - 62.248.127.255 tr -62.248.128.0 - 62.248.252.255 fi -62.248.253.0 - 62.248.253.19 se -62.248.253.20 - 62.248.253.27 fi -62.248.253.28 - 62.248.253.31 se -62.248.253.32 - 62.248.253.255 fi -62.248.254.0 - 62.248.254.255 se -62.248.255.0 - 62.248.255.255 fi -62.249.0.0 - 62.249.4.135 pt -62.249.4.136 - 62.249.4.143 es -62.249.4.144 - 62.249.31.255 pt +62.248.128.0 - 62.248.255.255 fi +62.249.0.0 - 62.249.31.255 pt 62.249.32.0 - 62.249.63.255 it 62.249.64.0 - 62.249.127.255 at 62.249.128.0 - 62.249.159.255 ru @@ -15411,141 +13949,71 @@ 62.249.192.0 - 62.249.255.255 gb 62.250.0.0 - 62.251.127.255 nl 62.251.128.0 - 62.251.255.255 ma -62.252.0.0 - 62.254.160.63 gb -62.254.160.64 - 62.254.160.71 ie -62.254.160.72 - 62.254.160.103 gb -62.254.160.104 - 62.254.160.111 ie -62.254.160.112 - 62.254.160.143 gb -62.254.160.144 - 62.254.160.151 ie -62.254.160.152 - 62.254.160.159 gb -62.254.160.160 - 62.254.160.183 ie -62.254.160.184 - 62.254.160.255 gb -62.254.161.0 - 62.254.161.31 ie -62.254.161.32 - 62.254.161.167 gb -62.254.161.168 - 62.254.161.175 ie -62.254.161.176 - 62.254.161.239 gb -62.254.161.240 - 62.254.161.255 ie -62.254.162.0 - 62.254.162.63 gb -62.254.162.64 - 62.254.162.95 ie -62.254.162.96 - 62.254.162.103 gb -62.254.162.104 - 62.254.162.127 ie -62.254.162.128 - 62.254.162.143 gb -62.254.162.144 - 62.254.162.159 ie -62.254.162.160 - 62.254.162.255 gb -62.254.163.0 - 62.254.163.47 ie -62.254.163.48 - 62.254.164.95 gb -62.254.164.96 - 62.254.164.103 ie -62.254.164.104 - 62.254.164.119 gb -62.254.164.120 - 62.254.164.151 ie -62.254.164.152 - 62.254.165.255 gb -62.254.166.0 - 62.254.166.15 ie -62.254.166.16 - 62.255.255.255 gb -63.0.0.0 - 63.65.9.255 us -63.65.10.0 - 63.65.10.255 ht -63.65.11.0 - 63.65.12.254 bo -63.65.12.255 - 63.69.122.191 us -63.69.122.192 - 63.69.122.223 a2 -63.69.122.224 - 63.70.23.255 us +62.252.0.0 - 62.254.160.255 gb +62.254.161.0 - 62.254.161.191 ie +62.254.161.192 - 62.254.161.223 gb +62.254.161.224 - 62.254.161.255 ie +62.254.162.0 - 62.254.164.143 gb +62.254.164.144 - 62.254.164.151 ie +62.254.164.152 - 62.255.255.255 gb +63.0.0.0 - 63.65.10.255 us +63.65.11.0 - 63.65.11.255 bo +63.65.12.0 - 63.70.23.255 us 63.70.24.0 - 63.70.27.255 pk 63.70.28.0 - 63.70.142.255 us 63.70.143.0 - 63.70.143.255 gu -63.70.144.0 - 63.71.62.31 us -63.71.62.32 - 63.71.62.39 ca -63.71.62.40 - 63.73.51.255 us -63.73.52.0 - 63.73.52.255 fr -63.73.53.0 - 63.73.108.95 us -63.73.108.96 - 63.73.108.255 ca -63.73.109.0 - 63.74.76.127 us -63.74.76.128 - 63.74.76.255 pr -63.74.77.0 - 63.74.130.159 us -63.74.130.160 - 63.74.130.191 fr -63.74.130.192 - 63.74.153.255 us +63.70.144.0 - 63.74.153.255 us 63.74.154.0 - 63.74.155.255 gb 63.74.156.0 - 63.75.233.255 us 63.75.234.0 - 63.75.235.255 jm -63.75.236.0 - 63.76.214.191 us -63.76.214.192 - 63.76.214.255 pr -63.76.215.0 - 63.77.227.255 us +63.75.236.0 - 63.77.227.255 us 63.77.228.0 - 63.77.231.255 pr 63.77.232.0 - 63.80.46.255 us 63.80.47.0 - 63.80.47.255 in -63.80.48.0 - 63.80.60.127 us -63.80.60.128 - 63.80.60.191 ph -63.80.60.192 - 63.80.143.215 us -63.80.143.216 - 63.80.143.223 ph -63.80.143.224 - 63.80.167.255 us -63.80.168.0 - 63.80.171.255 um -63.80.172.0 - 63.80.215.255 us +63.80.48.0 - 63.80.215.255 us 63.80.216.0 - 63.80.216.255 ph -63.80.217.0 - 63.82.157.15 us -63.82.157.16 - 63.82.157.31 ca -63.82.157.32 - 63.83.99.255 us -63.83.100.0 - 63.83.101.255 pr -63.83.102.0 - 63.84.24.159 us -63.84.24.160 - 63.84.24.175 gb -63.84.24.176 - 63.84.64.255 us +63.80.217.0 - 63.84.64.255 us 63.84.65.0 - 63.84.65.255 mx -63.84.66.0 - 63.84.109.255 us -63.84.110.0 - 63.84.111.255 fm -63.84.112.0 - 63.84.235.255 us +63.84.66.0 - 63.84.235.255 us 63.84.236.0 - 63.84.239.255 ec 63.84.240.0 - 63.85.41.255 us 63.85.42.0 - 63.85.43.255 bm 63.85.44.0 - 63.85.242.255 us 63.85.243.0 - 63.85.243.255 pr -63.85.244.0 - 63.86.138.255 us -63.86.139.0 - 63.86.139.63 gb -63.86.139.64 - 63.87.229.239 us -63.87.229.240 - 63.87.229.247 il -63.87.229.248 - 63.90.33.255 us -63.90.34.0 - 63.90.36.255 pr -63.90.37.0 - 63.97.53.254 us -63.97.53.255 - 63.97.53.255 co -63.97.54.0 - 63.98.11.255 us +63.85.244.0 - 63.90.33.255 us +63.90.34.0 - 63.90.35.255 pr +63.90.36.0 - 63.92.232.255 us +63.92.233.0 - 63.92.233.79 ca +63.92.233.80 - 63.92.233.95 us +63.92.233.96 - 63.92.233.175 ca +63.92.233.176 - 63.92.233.191 us +63.92.233.192 - 63.92.233.255 ca +63.92.234.0 - 63.92.248.24 us +63.92.248.25 - 63.92.248.25 ca +63.92.248.26 - 63.96.193.255 us +63.96.194.0 - 63.96.194.255 ca +63.96.195.0 - 63.97.154.255 us +63.97.155.0 - 63.97.155.255 se +63.97.156.0 - 63.98.11.255 us 63.98.12.0 - 63.98.12.255 pr -63.98.13.0 - 63.99.176.135 us -63.99.176.136 - 63.99.176.143 ca -63.99.176.144 - 63.99.201.63 us -63.99.201.64 - 63.99.201.127 mx -63.99.201.128 - 63.100.165.239 us -63.100.165.240 - 63.100.165.255 ca -63.100.166.0 - 63.100.168.15 us -63.100.168.16 - 63.100.168.31 ca -63.100.168.32 - 63.100.191.255 us -63.100.192.0 - 63.100.223.255 a2 -63.100.224.0 - 63.100.241.95 us -63.100.241.96 - 63.100.241.111 ca -63.100.241.112 - 63.101.15.47 us -63.101.15.48 - 63.101.15.63 ca -63.101.15.64 - 63.101.58.255 us -63.101.59.0 - 63.101.59.15 ca -63.101.59.16 - 63.102.159.255 us -63.102.160.0 - 63.102.160.255 pr -63.102.161.0 - 63.103.49.255 us -63.103.50.0 - 63.103.51.255 gu -63.103.52.0 - 63.103.127.255 us -63.103.128.0 - 63.103.128.255 a2 -63.103.129.0 - 63.103.129.255 ug -63.103.130.0 - 63.103.131.255 a2 +63.98.13.0 - 63.100.191.255 us +63.100.192.0 - 63.100.197.255 a2 +63.100.198.0 - 63.100.198.255 tz +63.100.199.0 - 63.100.223.255 a2 +63.100.224.0 - 63.103.127.255 us +63.103.128.0 - 63.103.131.255 a2 63.103.132.0 - 63.103.133.255 gh -63.103.134.0 - 63.103.134.255 a2 -63.103.135.0 - 63.103.135.255 us +63.103.134.0 - 63.103.135.255 us 63.103.136.0 - 63.103.136.255 lr 63.103.137.0 - 63.103.137.255 sa 63.103.138.0 - 63.103.138.255 ng -63.103.139.0 - 63.103.139.63 sa -63.103.139.64 - 63.103.139.127 ng -63.103.139.128 - 63.103.139.143 us -63.103.139.144 - 63.103.139.159 a2 -63.103.139.160 - 63.103.139.255 us +63.103.139.0 - 63.103.139.255 a2 63.103.140.0 - 63.103.143.255 ng 63.103.144.0 - 63.103.148.255 us 63.103.149.0 - 63.103.149.255 a2 63.103.150.0 - 63.105.191.255 us 63.105.192.0 - 63.105.207.255 kr -63.105.208.0 - 63.108.84.127 us -63.108.84.128 - 63.108.84.191 ca -63.108.84.192 - 63.109.65.255 us +63.105.208.0 - 63.109.65.255 us 63.109.66.0 - 63.109.68.255 ec 63.109.69.0 - 63.109.69.255 us 63.109.70.0 - 63.109.70.255 pe @@ -15554,79 +14022,30 @@ 63.109.74.0 - 63.109.75.255 us 63.109.76.0 - 63.109.77.255 ec 63.109.78.0 - 63.109.244.255 us -63.109.245.0 - 63.109.245.47 a2 -63.109.245.48 - 63.109.245.55 ng -63.109.245.56 - 63.109.245.71 in -63.109.245.72 - 63.109.245.79 a2 -63.109.245.80 - 63.109.245.119 in -63.109.245.120 - 63.109.245.127 a2 -63.109.245.128 - 63.109.245.159 de -63.109.245.160 - 63.109.245.167 a2 -63.109.245.168 - 63.109.245.175 ng -63.109.245.176 - 63.109.245.191 de -63.109.245.192 - 63.109.245.239 a2 -63.109.245.240 - 63.109.245.247 ng -63.109.245.248 - 63.109.245.255 a2 -63.109.246.0 - 63.109.246.127 ng -63.109.246.128 - 63.109.246.255 in -63.109.247.0 - 63.109.248.31 ng -63.109.248.32 - 63.109.248.39 tz -63.109.248.40 - 63.109.248.55 a2 -63.109.248.56 - 63.109.248.63 pk -63.109.248.64 - 63.109.248.87 a2 -63.109.248.88 - 63.109.248.95 pk -63.109.248.96 - 63.109.248.111 gh -63.109.248.112 - 63.109.248.127 a2 -63.109.248.128 - 63.109.248.255 ng -63.109.249.0 - 63.109.249.23 a2 -63.109.249.24 - 63.109.249.39 in -63.109.249.40 - 63.109.249.47 a2 -63.109.249.48 - 63.109.249.63 in -63.109.249.64 - 63.109.249.79 a2 -63.109.249.80 - 63.109.249.95 tz -63.109.249.96 - 63.109.249.127 a2 -63.109.249.128 - 63.109.249.135 ng -63.109.249.136 - 63.109.249.143 a2 -63.109.249.144 - 63.109.249.151 pk -63.109.249.152 - 63.109.249.159 a2 -63.109.249.160 - 63.109.249.191 ng -63.109.249.192 - 63.109.249.255 a2 +63.109.245.0 - 63.109.246.255 a2 +63.109.247.0 - 63.109.247.255 ng +63.109.248.0 - 63.109.249.255 a2 63.109.250.0 - 63.110.119.255 us 63.110.120.0 - 63.110.123.255 mx 63.110.124.0 - 63.110.188.255 us 63.110.189.0 - 63.110.189.255 mx -63.110.190.0 - 63.110.224.111 us -63.110.224.112 - 63.110.224.127 ca -63.110.224.128 - 63.112.5.167 us -63.112.5.168 - 63.112.5.175 au -63.112.5.176 - 63.113.126.255 us -63.113.127.0 - 63.113.127.63 ca -63.113.127.64 - 63.114.36.255 us +63.110.190.0 - 63.114.36.255 us 63.114.37.0 - 63.114.37.255 pk -63.114.38.0 - 63.117.71.255 us -63.117.72.0 - 63.117.75.255 ec -63.117.76.0 - 63.119.21.255 us -63.119.22.0 - 63.119.23.255 a2 -63.119.24.0 - 63.122.50.255 us -63.122.51.0 - 63.122.51.127 au -63.122.51.128 - 63.123.93.127 us -63.123.93.128 - 63.123.93.191 ca -63.123.93.192 - 63.128.141.127 us -63.128.141.128 - 63.128.141.143 my -63.128.141.144 - 63.128.145.255 us -63.128.146.0 - 63.128.146.7 my -63.128.146.8 - 63.128.146.63 us -63.128.146.64 - 63.128.146.95 mx -63.128.146.96 - 63.130.128.31 us -63.130.128.32 - 63.130.128.63 a2 -63.130.128.64 - 63.130.136.255 us -63.130.137.0 - 63.130.137.127 ca -63.130.137.128 - 63.130.142.255 us -63.130.143.0 - 63.130.143.15 ca -63.130.143.16 - 63.130.143.31 it -63.130.143.32 - 63.131.131.63 us -63.131.131.64 - 63.131.131.79 hk -63.131.131.80 - 63.131.239.255 us +63.114.38.0 - 63.130.136.143 us +63.130.136.144 - 63.130.136.159 in +63.130.136.160 - 63.130.136.199 us +63.130.136.200 - 63.130.136.207 in +63.130.136.208 - 63.130.138.255 us +63.130.139.0 - 63.130.139.255 gb +63.130.140.0 - 63.130.144.255 us +63.130.145.0 - 63.130.159.255 gb +63.130.160.0 - 63.130.162.31 us +63.130.162.32 - 63.130.162.47 in +63.130.162.48 - 63.130.191.255 us +63.130.192.0 - 63.130.207.255 gb +63.130.208.0 - 63.130.215.255 us +63.130.216.0 - 63.130.216.255 gb +63.130.217.0 - 63.131.239.255 us 63.131.240.0 - 63.131.255.255 pr 63.132.0.0 - 63.134.255.255 us 63.135.0.0 - 63.135.31.255 ca @@ -15634,108 +14053,53 @@ 63.135.240.0 - 63.135.255.255 pr 63.136.0.0 - 63.136.111.255 us 63.136.112.0 - 63.136.119.255 ky -63.136.120.0 - 63.136.192.159 us -63.136.192.160 - 63.136.192.175 ca -63.136.192.176 - 63.142.159.255 us -63.142.160.0 - 63.142.175.255 ca -63.142.176.0 - 63.142.239.255 us -63.142.240.0 - 63.142.255.255 ca -63.143.0.0 - 63.143.63.255 us +63.136.120.0 - 63.141.194.127 us +63.141.194.128 - 63.141.194.255 gb +63.141.195.0 - 63.142.159.255 us +63.142.160.0 - 63.142.161.18 ca +63.142.161.19 - 63.142.161.19 us +63.142.161.20 - 63.142.175.255 ca +63.142.176.0 - 63.143.63.255 us 63.143.64.0 - 63.143.75.255 jm 63.143.76.0 - 63.143.76.255 bb -63.143.77.0 - 63.143.127.255 jm -63.143.128.0 - 63.146.199.255 us -63.146.200.0 - 63.146.207.255 pe -63.146.208.0 - 63.147.25.127 us -63.147.25.128 - 63.147.25.159 ca -63.147.25.160 - 63.147.30.215 us -63.147.30.216 - 63.147.30.223 gb -63.147.30.224 - 63.150.140.223 us -63.150.140.224 - 63.150.140.239 jp -63.150.140.240 - 63.160.90.63 us -63.160.90.64 - 63.160.90.127 ca -63.160.90.128 - 63.160.95.63 us -63.160.95.64 - 63.160.95.79 nl -63.160.95.80 - 63.160.122.255 us +63.143.77.0 - 63.143.78.255 jm +63.143.79.0 - 63.143.79.255 vg +63.143.80.0 - 63.143.86.223 jm +63.143.86.224 - 63.143.86.255 ag +63.143.87.0 - 63.143.127.255 jm +63.143.128.0 - 63.150.137.223 us +63.150.137.224 - 63.150.137.231 sg +63.150.137.232 - 63.150.140.223 us +63.150.140.224 - 63.150.140.231 jp +63.150.140.232 - 63.150.141.79 us +63.150.141.80 - 63.150.141.87 jp +63.150.141.88 - 63.150.141.231 us +63.150.141.232 - 63.150.141.239 jp +63.150.141.240 - 63.156.193.255 us +63.156.194.0 - 63.156.195.255 jp +63.156.196.0 - 63.157.159.255 us +63.157.160.0 - 63.157.160.255 ca +63.157.161.0 - 63.160.122.255 us 63.160.123.0 - 63.160.123.255 ca -63.160.124.0 - 63.160.173.191 us -63.160.173.192 - 63.160.173.223 ca -63.160.173.224 - 63.160.207.255 us -63.160.208.0 - 63.160.208.127 ca -63.160.208.128 - 63.161.63.255 us +63.160.124.0 - 63.161.63.255 us 63.161.64.0 - 63.161.65.255 hn -63.161.66.0 - 63.161.86.39 us -63.161.86.40 - 63.161.86.47 gb -63.161.86.48 - 63.161.142.255 us -63.161.143.0 - 63.161.143.255 pr -63.161.144.0 - 63.161.181.255 us -63.161.182.0 - 63.161.182.255 sl -63.161.183.0 - 63.161.223.255 us -63.161.224.0 - 63.161.224.7 sg -63.161.224.8 - 63.161.231.255 us +63.161.66.0 - 63.161.231.255 us 63.161.232.0 - 63.161.239.255 hn -63.161.240.0 - 63.162.33.223 us -63.162.33.224 - 63.162.33.255 ca -63.162.34.0 - 63.162.48.255 us -63.162.49.0 - 63.162.49.255 pr -63.162.50.0 - 63.162.141.255 us +63.161.240.0 - 63.162.141.255 us 63.162.142.0 - 63.162.142.255 cn -63.162.143.0 - 63.162.143.63 us -63.162.143.64 - 63.162.143.95 pr -63.162.143.96 - 63.162.155.255 us -63.162.156.0 - 63.162.156.255 pr -63.162.157.0 - 63.162.173.239 us -63.162.173.240 - 63.162.173.255 ch -63.162.174.0 - 63.163.24.135 us -63.163.24.136 - 63.163.24.143 pr -63.163.24.144 - 63.163.179.255 us +63.162.143.0 - 63.163.179.255 us 63.163.180.0 - 63.163.181.255 co -63.163.182.0 - 63.163.209.255 us -63.163.210.0 - 63.163.211.255 an -63.163.212.0 - 63.164.55.255 us +63.163.182.0 - 63.164.55.255 us 63.164.56.0 - 63.164.57.255 ec 63.164.58.0 - 63.164.94.255 us 63.164.95.0 - 63.164.95.255 pr 63.164.96.0 - 63.164.107.255 us 63.164.108.0 - 63.164.111.255 hn -63.164.112.0 - 63.164.153.191 us -63.164.153.192 - 63.164.153.207 pr -63.164.153.208 - 63.164.196.127 us -63.164.196.128 - 63.164.196.143 ca -63.164.196.144 - 63.165.9.255 us +63.164.112.0 - 63.165.9.255 us 63.165.10.0 - 63.165.10.255 gb -63.165.11.0 - 63.165.120.15 us -63.165.120.16 - 63.165.120.31 gb -63.165.120.32 - 63.165.175.15 us -63.165.175.16 - 63.165.175.23 ca -63.165.175.24 - 63.165.182.255 us +63.165.11.0 - 63.165.182.255 us 63.165.183.0 - 63.165.183.255 pr -63.165.184.0 - 63.165.235.255 us -63.165.236.0 - 63.165.236.127 it -63.165.236.128 - 63.166.50.191 us -63.166.50.192 - 63.166.50.223 co -63.166.50.224 - 63.166.78.255 us -63.166.79.0 - 63.166.79.127 ca -63.166.79.128 - 63.166.197.55 us -63.166.197.56 - 63.166.197.63 pr -63.166.197.64 - 63.166.252.199 us -63.166.252.200 - 63.166.252.207 ch -63.166.252.208 - 63.166.255.159 us -63.166.255.160 - 63.166.255.175 sg -63.166.255.176 - 63.167.21.159 us -63.167.21.160 - 63.167.21.255 ca -63.167.22.0 - 63.167.38.31 us -63.167.38.32 - 63.167.38.39 nl -63.167.38.40 - 63.167.55.31 us -63.167.55.32 - 63.167.55.39 ca -63.167.55.40 - 63.167.100.191 us -63.167.100.192 - 63.167.100.207 cn -63.167.100.208 - 63.167.100.215 pr -63.167.100.216 - 63.168.12.167 us -63.168.12.168 - 63.168.12.175 ca -63.168.12.176 - 63.168.15.255 us -63.168.16.0 - 63.168.16.255 pr -63.168.17.0 - 63.168.56.255 us +63.165.184.0 - 63.168.56.255 us 63.168.57.0 - 63.168.57.255 ec 63.168.58.0 - 63.168.92.255 us 63.168.93.0 - 63.168.93.255 co @@ -15743,211 +14107,136 @@ 63.168.116.0 - 63.168.116.255 ca 63.168.117.0 - 63.168.167.255 us 63.168.168.0 - 63.168.169.255 ye -63.168.170.0 - 63.169.119.231 us -63.169.119.232 - 63.169.119.239 ca -63.169.119.240 - 63.169.168.255 us -63.169.169.0 - 63.169.169.255 pr -63.169.170.0 - 63.169.219.159 us -63.169.219.160 - 63.169.219.191 ca -63.169.219.192 - 63.170.53.111 us -63.170.53.112 - 63.170.53.127 de -63.170.53.128 - 63.171.2.175 us -63.171.2.176 - 63.171.2.191 pr -63.171.2.192 - 63.171.17.255 us +63.168.170.0 - 63.170.67.255 us +63.170.68.0 - 63.170.69.255 bb +63.170.70.0 - 63.171.17.255 us 63.171.18.0 - 63.171.19.255 ye -63.171.20.0 - 63.171.32.31 us -63.171.32.32 - 63.171.32.47 pr -63.171.32.48 - 63.171.107.223 us -63.171.107.224 - 63.171.107.255 in -63.171.108.0 - 63.171.111.255 us +63.171.20.0 - 63.171.111.255 us 63.171.112.0 - 63.171.127.255 ca 63.171.128.0 - 63.171.231.255 us 63.171.232.0 - 63.171.232.255 co -63.171.233.0 - 63.172.12.63 us -63.172.12.64 - 63.172.12.127 pr -63.172.12.128 - 63.172.187.63 us -63.172.187.64 - 63.172.187.71 ca -63.172.187.72 - 63.172.187.79 us -63.172.187.80 - 63.172.187.87 dk -63.172.187.88 - 63.173.95.255 us +63.171.233.0 - 63.173.95.255 us 63.173.96.0 - 63.173.96.255 ec 63.173.97.0 - 63.173.171.255 us 63.173.172.0 - 63.173.173.255 ye -63.173.174.0 - 63.173.236.111 us -63.173.236.112 - 63.173.236.127 gb -63.173.236.128 - 63.174.199.255 us +63.173.174.0 - 63.174.199.255 us 63.174.200.0 - 63.174.207.255 co 63.174.208.0 - 63.174.226.255 us 63.174.227.0 - 63.174.227.255 ec -63.174.228.0 - 63.175.111.255 us -63.175.112.0 - 63.175.112.255 pr -63.175.113.0 - 63.175.176.127 us -63.175.176.128 - 63.175.176.143 pr -63.175.176.144 - 63.175.182.159 us -63.175.182.160 - 63.175.182.191 in -63.175.182.192 - 63.175.183.175 us -63.175.183.176 - 63.175.183.191 se -63.175.183.192 - 63.175.185.255 us +63.174.228.0 - 63.175.155.255 us +63.175.156.0 - 63.175.159.255 bb +63.175.160.0 - 63.175.185.255 us 63.175.186.0 - 63.175.187.255 pr 63.175.188.0 - 63.175.225.255 us 63.175.226.0 - 63.175.226.255 hn -63.175.227.0 - 63.206.134.231 us -63.206.134.232 - 63.206.134.239 pr -63.206.134.240 - 63.210.8.255 us +63.175.227.0 - 63.210.8.255 us 63.210.9.0 - 63.210.9.255 ca -63.210.10.0 - 63.211.50.55 us -63.211.50.56 - 63.211.50.63 vg -63.211.50.64 - 63.215.176.255 us -63.215.177.0 - 63.215.177.255 pr -63.215.178.0 - 63.215.179.255 us +63.210.10.0 - 63.215.179.255 us 63.215.180.0 - 63.215.183.255 pr -63.215.184.0 - 63.216.196.255 us +63.215.184.0 - 63.215.201.255 us +63.215.202.0 - 63.215.202.255 nl +63.215.203.0 - 63.216.95.255 us +63.216.96.0 - 63.216.127.255 lb +63.216.128.0 - 63.216.196.255 us 63.216.197.0 - 63.216.197.255 ph -63.216.198.0 - 63.217.80.127 us -63.217.80.128 - 63.217.80.159 hk -63.217.80.160 - 63.217.81.255 us +63.216.198.0 - 63.217.81.255 us 63.217.82.0 - 63.217.82.255 hk -63.217.83.0 - 63.218.173.127 us -63.218.173.128 - 63.218.173.143 gr -63.218.173.144 - 63.218.226.95 us -63.218.226.96 - 63.218.226.127 hk -63.218.226.128 - 63.218.226.159 us -63.218.226.160 - 63.218.226.191 hk -63.218.226.192 - 63.218.227.127 us -63.218.227.128 - 63.218.227.159 hk -63.218.227.160 - 63.219.6.255 us +63.217.83.0 - 63.218.15.229 us +63.218.15.230 - 63.218.15.230 de +63.218.15.231 - 63.218.17.31 us +63.218.17.32 - 63.218.17.39 tw +63.218.17.40 - 63.218.74.255 us +63.218.75.0 - 63.218.75.255 ap +63.218.76.0 - 63.218.76.255 us +63.218.77.0 - 63.218.77.95 ap +63.218.77.96 - 63.218.77.111 us +63.218.77.112 - 63.218.77.191 ap +63.218.77.192 - 63.218.107.111 us +63.218.107.112 - 63.218.107.115 sg +63.218.107.116 - 63.218.156.255 us +63.218.157.0 - 63.218.157.255 au +63.218.158.0 - 63.219.6.255 us 63.219.7.0 - 63.219.7.255 in -63.219.8.0 - 63.219.17.143 us -63.219.17.144 - 63.219.17.159 hk -63.219.17.160 - 63.219.176.31 us -63.219.176.32 - 63.219.176.63 hk -63.219.176.64 - 63.219.176.159 us -63.219.176.160 - 63.219.176.191 hk -63.219.176.192 - 63.221.95.255 us +63.219.8.0 - 63.221.95.255 us 63.221.96.0 - 63.221.111.255 ca 63.221.112.0 - 63.221.113.255 us 63.221.114.0 - 63.221.127.255 ca -63.221.128.0 - 63.221.157.191 us -63.221.157.192 - 63.221.157.223 hk -63.221.157.224 - 63.223.78.1 us -63.223.78.2 - 63.223.78.30 ph -63.223.78.31 - 63.223.78.196 us -63.223.78.197 - 63.223.78.209 ph -63.223.78.210 - 63.223.79.32 us -63.223.79.33 - 63.223.79.55 ph -63.223.79.56 - 63.223.79.117 us -63.223.79.118 - 63.223.79.130 ph -63.223.79.131 - 63.229.51.223 us -63.229.51.224 - 63.229.51.255 ml -63.229.52.0 - 63.237.63.183 us -63.237.63.184 - 63.237.63.191 ca -63.237.63.192 - 63.238.222.15 us -63.238.222.16 - 63.238.222.31 ca -63.238.222.32 - 63.239.206.175 us -63.239.206.176 - 63.239.206.183 ca -63.239.206.184 - 63.240.17.39 us -63.240.17.40 - 63.240.17.47 il -63.240.17.48 - 63.240.54.255 us +63.221.128.0 - 63.222.36.1 us +63.222.36.2 - 63.222.36.2 mw +63.222.36.3 - 63.225.65.103 us +63.225.65.104 - 63.225.65.107 ie +63.225.65.108 - 63.225.65.175 us +63.225.65.176 - 63.225.65.179 gb +63.225.65.180 - 63.228.185.47 us +63.228.185.48 - 63.228.185.55 gb +63.228.185.56 - 63.228.185.127 us +63.228.185.128 - 63.228.185.143 gb +63.228.185.144 - 63.228.185.151 us +63.228.185.152 - 63.228.185.159 es +63.228.185.160 - 63.228.185.215 us +63.228.185.216 - 63.228.185.223 gb +63.228.185.224 - 63.229.104.23 us +63.229.104.24 - 63.229.104.27 gb +63.229.104.28 - 63.230.239.255 us +63.230.240.0 - 63.230.240.255 de +63.230.241.0 - 63.231.211.63 us +63.231.211.64 - 63.231.211.71 gr +63.231.211.72 - 63.231.211.191 us +63.231.211.192 - 63.231.211.223 de +63.231.211.224 - 63.232.233.255 us +63.232.234.0 - 63.232.235.255 ca +63.232.236.0 - 63.234.239.255 us +63.234.240.0 - 63.234.240.255 gb +63.234.241.0 - 63.235.155.209 us +63.235.155.210 - 63.235.155.210 a1 +63.235.155.211 - 63.240.54.255 us 63.240.55.0 - 63.240.55.255 in -63.240.56.0 - 63.240.66.183 us -63.240.66.184 - 63.240.66.191 de -63.240.66.192 - 63.240.71.55 us -63.240.71.56 - 63.240.71.63 de -63.240.71.64 - 63.240.71.95 us -63.240.71.96 - 63.240.71.111 de -63.240.71.112 - 63.240.73.255 us -63.240.74.0 - 63.240.74.31 de -63.240.74.32 - 63.240.75.31 us -63.240.75.32 - 63.240.75.47 il -63.240.75.48 - 63.240.83.23 us -63.240.83.24 - 63.240.83.31 de -63.240.83.32 - 63.240.88.167 us -63.240.88.168 - 63.240.88.175 il -63.240.88.176 - 63.240.91.127 us -63.240.91.128 - 63.240.91.159 il -63.240.91.160 - 63.240.96.207 us -63.240.96.208 - 63.240.96.215 de -63.240.96.216 - 63.240.125.63 us -63.240.125.64 - 63.240.125.95 de -63.240.125.96 - 63.240.131.255 us -63.240.132.0 - 63.240.132.7 jm -63.240.132.8 - 63.240.132.175 us -63.240.132.176 - 63.240.132.183 jm -63.240.132.184 - 63.240.133.255 us -63.240.134.0 - 63.240.134.15 de -63.240.134.16 - 63.241.73.159 us -63.241.73.160 - 63.241.73.175 tw -63.241.73.176 - 63.241.104.7 us -63.241.104.8 - 63.241.104.15 dk -63.241.104.16 - 63.241.104.31 us -63.241.104.32 - 63.241.104.63 dk -63.241.104.64 - 63.241.121.255 us -63.241.122.0 - 63.241.122.15 jp -63.241.122.16 - 63.243.127.255 us -63.243.128.0 - 63.243.128.255 ca -63.243.129.0 - 63.243.129.255 us +63.240.56.0 - 63.243.129.255 us 63.243.130.0 - 63.243.130.255 ca -63.243.131.0 - 63.243.132.255 us -63.243.133.0 - 63.243.133.255 ca +63.243.131.0 - 63.243.133.255 us 63.243.134.0 - 63.243.135.255 ht 63.243.136.0 - 63.243.137.255 us 63.243.138.0 - 63.243.139.255 gb 63.243.140.0 - 63.243.141.255 ca -63.243.142.0 - 63.243.143.7 us -63.243.143.8 - 63.243.143.63 ca -63.243.143.64 - 63.243.143.127 us -63.243.143.128 - 63.243.143.255 ca +63.243.142.0 - 63.243.143.255 us 63.243.144.0 - 63.243.144.255 ph 63.243.145.0 - 63.243.146.255 ca -63.243.147.0 - 63.243.147.255 us -63.243.148.0 - 63.243.149.47 ca -63.243.149.48 - 63.243.149.63 ie -63.243.149.64 - 63.243.149.95 us -63.243.149.96 - 63.243.149.127 ca -63.243.149.128 - 63.243.149.255 us -63.243.150.0 - 63.243.150.7 ca -63.243.150.8 - 63.243.150.31 us -63.243.150.32 - 63.243.150.63 ca -63.243.150.64 - 63.243.150.127 ga -63.243.150.128 - 63.243.150.191 us -63.243.150.192 - 63.243.154.255 ca -63.243.155.0 - 63.243.155.255 us -63.243.156.0 - 63.243.156.255 ca -63.243.157.0 - 63.243.157.255 us +63.243.147.0 - 63.243.150.255 us +63.243.151.0 - 63.243.151.255 ca +63.243.152.0 - 63.243.152.255 us +63.243.153.0 - 63.243.154.255 ca +63.243.155.0 - 63.243.157.255 us 63.243.158.0 - 63.243.160.255 ca -63.243.161.0 - 63.243.161.127 us -63.243.161.128 - 63.243.162.255 ca +63.243.161.0 - 63.243.161.255 us +63.243.162.0 - 63.243.162.255 ca 63.243.163.0 - 63.243.163.255 sy -63.243.164.0 - 63.243.166.255 ca +63.243.164.0 - 63.243.164.255 ca +63.243.165.0 - 63.243.165.255 us +63.243.166.0 - 63.243.166.255 ca 63.243.167.0 - 63.243.167.255 ng 63.243.168.0 - 63.243.171.255 us 63.243.172.0 - 63.243.173.255 ca -63.243.174.0 - 63.243.174.255 us -63.243.175.0 - 63.243.175.127 ca -63.243.175.128 - 63.243.175.191 au -63.243.175.192 - 63.243.175.223 ca -63.243.175.224 - 63.243.175.255 tw -63.243.176.0 - 63.243.176.31 ca -63.243.176.32 - 63.243.176.63 ph -63.243.176.64 - 63.243.176.127 ca -63.243.176.128 - 63.243.176.223 us -63.243.176.224 - 63.243.176.247 ca -63.243.176.248 - 63.243.176.255 us -63.243.177.0 - 63.243.178.255 ca -63.243.179.0 - 63.243.179.127 ph -63.243.179.128 - 63.243.181.255 ca +63.243.174.0 - 63.243.175.119 us +63.243.175.120 - 63.243.175.127 fr +63.243.175.128 - 63.243.177.255 us +63.243.178.0 - 63.243.178.255 ca +63.243.179.0 - 63.243.180.255 us +63.243.181.0 - 63.243.181.255 ca 63.243.182.0 - 63.243.182.255 ph 63.243.183.0 - 63.243.184.255 us 63.243.185.0 - 63.243.185.255 ir 63.243.186.0 - 63.243.186.255 us 63.243.187.0 - 63.243.188.255 ca 63.243.189.0 - 63.243.189.255 vg -63.243.190.0 - 63.243.190.255 ca -63.243.191.0 - 63.243.191.255 us -63.243.192.0 - 63.243.193.255 ca -63.243.194.0 - 63.243.195.255 us -63.243.196.0 - 63.243.255.255 ca -63.244.0.0 - 63.245.7.255 us +63.243.190.0 - 63.243.191.255 us +63.243.192.0 - 63.243.192.255 ca +63.243.193.0 - 63.243.199.255 us +63.243.200.0 - 63.243.203.255 ca +63.243.204.0 - 63.243.207.255 us +63.243.208.0 - 63.243.215.255 ca +63.243.216.0 - 63.243.248.255 us +63.243.249.0 - 63.243.249.7 ie +63.243.249.8 - 63.245.7.255 us 63.245.8.0 - 63.245.18.255 hn 63.245.19.0 - 63.245.19.255 ni 63.245.20.0 - 63.245.20.255 us @@ -15956,15 +14245,13 @@ 63.245.24.0 - 63.245.28.255 ni 63.245.29.0 - 63.245.29.255 us 63.245.30.0 - 63.245.31.255 gd -63.245.32.0 - 63.245.39.255 pr -63.245.40.0 - 63.245.40.255 us -63.245.41.0 - 63.245.42.255 an -63.245.43.0 - 63.245.47.255 us -63.245.48.0 - 63.245.55.255 an +63.245.32.0 - 63.245.40.255 us +63.245.41.0 - 63.245.42.255 cw +63.245.43.0 - 63.245.55.255 us 63.245.56.0 - 63.245.59.0 gd 63.245.59.1 - 63.245.60.255 us 63.245.61.0 - 63.245.62.255 mx -63.245.63.0 - 63.245.63.255 an +63.245.63.0 - 63.245.63.255 cw 63.245.64.0 - 63.245.65.255 co 63.245.66.0 - 63.245.67.255 gd 63.245.68.0 - 63.245.71.255 us @@ -15976,405 +14263,166 @@ 63.245.94.0 - 63.245.94.255 us 63.245.95.0 - 63.245.95.255 pr 63.245.96.0 - 63.245.103.255 co -63.245.104.0 - 63.245.111.255 pr +63.245.104.0 - 63.245.111.255 us 63.245.112.0 - 63.245.123.255 bs -63.245.124.0 - 63.246.19.69 us -63.246.19.70 - 63.246.19.79 ch -63.246.19.80 - 63.246.28.14 us -63.246.28.15 - 63.246.28.22 pe -63.246.28.23 - 63.246.31.157 us -63.246.31.158 - 63.246.31.170 it -63.246.31.171 - 63.250.95.255 us +63.245.124.0 - 63.250.95.255 us 63.250.96.0 - 63.250.127.255 ca -63.250.128.0 - 63.250.128.23 us -63.250.128.24 - 63.250.128.87 nl -63.250.128.88 - 63.250.128.95 us -63.250.128.96 - 63.250.129.255 nl -63.250.130.0 - 63.250.133.31 us -63.250.133.32 - 63.250.133.39 ca -63.250.133.40 - 63.250.133.159 us -63.250.133.160 - 63.250.133.191 cr -63.250.133.192 - 63.250.133.199 us -63.250.133.200 - 63.250.133.207 br -63.250.133.208 - 63.250.133.223 us -63.250.133.224 - 63.250.133.255 ar -63.250.134.0 - 63.250.134.47 us -63.250.134.48 - 63.250.134.63 ca -63.250.134.64 - 63.250.136.95 us -63.250.136.96 - 63.250.136.127 sv -63.250.136.128 - 63.250.137.47 us -63.250.137.48 - 63.250.137.55 ca -63.250.137.56 - 63.250.137.159 us -63.250.137.160 - 63.250.137.191 ve -63.250.137.192 - 63.250.138.255 us -63.250.139.0 - 63.250.139.31 br -63.250.139.32 - 63.250.139.63 us -63.250.139.64 - 63.250.139.95 ca -63.250.139.96 - 63.250.139.103 br -63.250.139.104 - 63.250.140.63 us -63.250.140.64 - 63.250.140.127 ca -63.250.140.128 - 63.250.140.159 us -63.250.140.160 - 63.250.140.191 br -63.250.140.192 - 63.250.141.7 us -63.250.141.8 - 63.250.141.15 cl -63.250.141.16 - 63.250.141.71 us -63.250.141.72 - 63.250.141.79 ca -63.250.141.80 - 63.250.141.175 us -63.250.141.176 - 63.250.141.183 ca -63.250.141.184 - 63.250.142.127 us -63.250.142.128 - 63.250.142.135 ca -63.250.142.136 - 63.250.142.191 us -63.250.142.192 - 63.250.142.223 br -63.250.142.224 - 63.250.143.63 us -63.250.143.64 - 63.250.143.95 br -63.250.143.96 - 63.250.160.7 us -63.250.160.8 - 63.250.160.15 ca -63.250.160.16 - 63.250.160.31 us -63.250.160.32 - 63.250.160.63 gb -63.250.160.64 - 63.250.160.215 us -63.250.160.216 - 63.250.160.223 cl -63.250.160.224 - 63.250.162.127 us -63.250.162.128 - 63.250.162.135 ca -63.250.162.136 - 63.250.162.191 us -63.250.162.192 - 63.250.162.223 ca -63.250.162.224 - 63.250.176.223 us -63.250.176.224 - 63.250.176.231 co -63.250.176.232 - 63.250.176.247 us -63.250.176.248 - 63.250.176.255 co -63.250.177.0 - 63.250.178.15 us -63.250.178.16 - 63.250.178.31 mx -63.250.178.32 - 63.250.178.63 ca -63.250.178.64 - 63.250.178.71 mx -63.250.178.72 - 63.250.178.87 us -63.250.178.88 - 63.250.178.95 mx -63.250.178.96 - 63.250.178.103 us -63.250.178.104 - 63.250.178.111 mx -63.250.178.112 - 63.250.178.119 us -63.250.178.120 - 63.250.178.127 mx -63.250.178.128 - 63.250.178.135 ar -63.250.178.136 - 63.250.179.7 us -63.250.179.8 - 63.250.179.31 mx -63.250.179.32 - 63.250.179.63 us -63.250.179.64 - 63.250.179.71 mx -63.250.179.72 - 63.250.179.111 us -63.250.179.112 - 63.250.179.127 mx -63.250.179.128 - 63.250.179.159 us -63.250.179.160 - 63.250.179.191 af -63.250.179.192 - 63.250.180.31 us -63.250.180.32 - 63.250.180.63 br -63.250.180.64 - 63.250.180.79 ar -63.250.180.80 - 63.250.180.111 us -63.250.180.112 - 63.250.180.119 ca -63.250.180.120 - 63.250.181.23 us -63.250.181.24 - 63.250.181.31 ar -63.250.181.32 - 63.250.181.223 us -63.250.181.224 - 63.250.181.231 ar -63.250.181.232 - 63.250.181.239 us -63.250.181.240 - 63.250.181.247 ar -63.250.181.248 - 63.250.182.39 us -63.250.182.40 - 63.250.182.47 br -63.250.182.48 - 63.250.182.191 us -63.250.182.192 - 63.250.182.199 af -63.250.182.200 - 63.250.182.207 ca -63.250.182.208 - 63.250.182.223 pr -63.250.182.224 - 63.250.184.255 us -63.250.185.0 - 63.250.185.31 br -63.250.185.32 - 63.250.185.223 us -63.250.185.224 - 63.250.185.239 ca -63.250.185.240 - 63.250.185.247 br -63.250.185.248 - 63.250.188.15 us -63.250.188.16 - 63.250.188.95 br -63.250.188.96 - 63.250.188.127 us -63.250.188.128 - 63.250.188.159 ca -63.250.188.160 - 63.250.188.175 us -63.250.188.176 - 63.250.188.183 ca -63.250.188.184 - 63.250.188.191 br -63.250.188.192 - 63.250.188.199 ve -63.250.188.200 - 63.250.188.223 us -63.250.188.224 - 63.250.188.255 ca -63.250.189.0 - 63.250.189.71 us -63.250.189.72 - 63.250.189.79 br -63.250.189.80 - 63.251.44.151 us -63.251.44.152 - 63.251.44.159 ca -63.251.44.160 - 63.251.48.127 us -63.251.48.128 - 63.251.48.191 au -63.251.48.192 - 63.251.80.175 us -63.251.80.176 - 63.251.80.183 gb -63.251.80.184 - 63.251.83.191 us -63.251.83.192 - 63.251.83.255 ca -63.251.84.0 - 63.251.93.255 us +63.250.128.0 - 63.250.128.255 us +63.250.129.0 - 63.250.129.255 eu +63.250.130.0 - 63.251.93.255 us 63.251.94.0 - 63.251.94.255 a2 -63.251.95.0 - 63.251.112.47 us -63.251.112.48 - 63.251.112.63 gb -63.251.112.64 - 63.251.135.223 us -63.251.135.224 - 63.251.135.255 il -63.251.136.0 - 63.251.141.159 us -63.251.141.160 - 63.251.141.191 gb -63.251.141.192 - 64.4.63.255 us +63.251.95.0 - 63.251.157.255 us +63.251.158.0 - 63.251.158.255 ky +63.251.159.0 - 64.4.18.63 us +64.4.18.64 - 64.4.18.127 sg +64.4.18.128 - 64.4.33.255 us +64.4.34.0 - 64.4.35.255 fi +64.4.36.0 - 64.4.63.255 us 64.4.64.0 - 64.4.95.255 ca 64.4.96.0 - 64.5.191.255 us -64.5.192.0 - 64.5.199.255 ca -64.5.200.0 - 64.5.200.15 us -64.5.200.16 - 64.5.200.255 ca +64.5.192.0 - 64.5.200.255 ca 64.5.201.0 - 64.5.201.255 us -64.5.202.0 - 64.5.206.175 ca -64.5.206.176 - 64.5.206.191 us -64.5.206.192 - 64.5.216.255 ca +64.5.202.0 - 64.5.216.255 ca 64.5.217.0 - 64.5.217.255 us 64.5.218.0 - 64.5.223.255 ca 64.5.224.0 - 64.5.225.255 us -64.5.226.0 - 64.5.230.127 ca -64.5.230.128 - 64.5.230.191 us -64.5.230.192 - 64.5.239.255 ca +64.5.226.0 - 64.5.239.255 ca 64.5.240.0 - 64.5.240.255 us 64.5.241.0 - 64.5.255.255 ca 64.6.0.0 - 64.6.191.255 us 64.6.192.0 - 64.6.207.255 ca -64.6.208.0 - 64.7.111.255 us -64.7.112.0 - 64.7.159.255 ca -64.7.160.0 - 64.7.192.63 us -64.7.192.64 - 64.7.192.79 bb -64.7.192.80 - 64.9.172.255 us -64.9.173.0 - 64.9.173.255 a1 -64.9.174.0 - 64.10.0.255 us -64.10.1.0 - 64.10.7.63 ca -64.10.7.64 - 64.10.7.255 us -64.10.8.0 - 64.10.43.127 ca -64.10.43.128 - 64.10.43.255 us -64.10.44.0 - 64.10.254.255 ca -64.10.255.0 - 64.11.3.255 us -64.11.4.0 - 64.11.120.255 ca -64.11.121.0 - 64.11.121.127 us -64.11.121.128 - 64.11.124.255 ca +64.6.208.0 - 64.7.127.255 us +64.7.128.0 - 64.7.159.255 ca +64.7.160.0 - 64.10.0.255 us +64.10.1.0 - 64.10.6.255 ca +64.10.7.0 - 64.10.7.255 us +64.10.8.0 - 64.10.36.255 ca +64.10.37.0 - 64.10.38.255 us +64.10.39.0 - 64.10.42.255 ca +64.10.43.0 - 64.10.43.255 us +64.10.44.0 - 64.10.47.255 ca +64.10.48.0 - 64.10.48.255 us +64.10.49.0 - 64.10.51.255 ca +64.10.52.0 - 64.10.53.255 us +64.10.54.0 - 64.10.63.255 ca +64.10.64.0 - 64.10.64.255 us +64.10.65.0 - 64.10.78.255 ca +64.10.79.0 - 64.10.82.255 us +64.10.83.0 - 64.10.88.255 ca +64.10.89.0 - 64.10.89.255 us +64.10.90.0 - 64.10.93.255 ca +64.10.94.0 - 64.10.94.255 us +64.10.95.0 - 64.10.114.255 ca +64.10.115.0 - 64.10.116.255 us +64.10.117.0 - 64.10.122.255 ca +64.10.123.0 - 64.10.123.255 us +64.10.124.0 - 64.10.128.255 ca +64.10.129.0 - 64.10.129.255 us +64.10.130.0 - 64.10.141.255 ca +64.10.142.0 - 64.10.142.255 us +64.10.143.0 - 64.10.155.255 ca +64.10.156.0 - 64.10.156.255 us +64.10.157.0 - 64.10.162.255 ca +64.10.163.0 - 64.10.163.255 us +64.10.164.0 - 64.10.173.255 ca +64.10.174.0 - 64.10.174.255 us +64.10.175.0 - 64.10.182.255 ca +64.10.183.0 - 64.10.183.255 us +64.10.184.0 - 64.10.187.255 ca +64.10.188.0 - 64.10.188.255 us +64.10.189.0 - 64.10.190.255 ca +64.10.191.0 - 64.10.191.255 us +64.10.192.0 - 64.10.218.255 ca +64.10.219.0 - 64.10.219.255 us +64.10.220.0 - 64.10.225.255 ca +64.10.226.0 - 64.10.226.255 us +64.10.227.0 - 64.10.230.255 ca +64.10.231.0 - 64.10.231.255 us +64.10.232.0 - 64.10.241.255 ca +64.10.242.0 - 64.10.242.255 us +64.10.243.0 - 64.10.253.255 ca +64.10.254.0 - 64.11.3.255 us +64.11.4.0 - 64.11.10.255 ca +64.11.11.0 - 64.11.11.255 us +64.11.12.0 - 64.11.15.255 ca +64.11.16.0 - 64.11.16.255 us +64.11.17.0 - 64.11.27.255 ca +64.11.28.0 - 64.11.28.255 us +64.11.29.0 - 64.11.36.255 ca +64.11.37.0 - 64.11.37.255 us +64.11.38.0 - 64.11.46.255 ca +64.11.47.0 - 64.11.48.255 us +64.11.49.0 - 64.11.66.255 ca +64.11.67.0 - 64.11.67.255 us +64.11.68.0 - 64.11.75.255 ca +64.11.76.0 - 64.11.76.255 us +64.11.77.0 - 64.11.84.255 ca +64.11.85.0 - 64.11.85.255 us +64.11.86.0 - 64.11.99.255 ca +64.11.100.0 - 64.11.101.255 us +64.11.102.0 - 64.11.120.255 ca +64.11.121.0 - 64.11.122.255 us +64.11.123.0 - 64.11.124.255 ca 64.11.125.0 - 64.11.128.255 us -64.11.129.0 - 64.11.197.255 ca -64.11.198.0 - 64.14.52.31 us -64.14.52.32 - 64.14.52.63 in -64.14.52.64 - 64.14.53.47 us -64.14.53.48 - 64.14.53.63 dk -64.14.53.64 - 64.14.55.255 us -64.14.56.0 - 64.14.56.15 cy -64.14.56.16 - 64.14.62.111 us -64.14.62.112 - 64.14.62.127 no -64.14.62.128 - 64.14.63.223 us -64.14.63.224 - 64.14.63.231 gb -64.14.63.232 - 64.14.83.47 us -64.14.83.48 - 64.14.83.63 ca -64.14.83.64 - 64.14.83.127 us -64.14.83.128 - 64.14.83.143 il -64.14.83.144 - 64.14.85.175 us -64.14.85.176 - 64.14.85.191 ca -64.14.85.192 - 64.14.85.255 us -64.14.86.0 - 64.14.86.15 ca -64.14.86.16 - 64.14.91.63 us -64.14.91.64 - 64.14.91.127 ca -64.14.91.128 - 64.14.92.143 us -64.14.92.144 - 64.14.92.159 ca -64.14.92.160 - 64.14.95.159 us -64.14.95.160 - 64.14.95.191 ca -64.14.95.192 - 64.14.123.79 us -64.14.123.80 - 64.14.123.95 ar -64.14.123.96 - 64.14.123.127 us -64.14.123.128 - 64.14.123.191 ar -64.14.123.192 - 64.14.124.63 us -64.14.124.64 - 64.14.124.127 ar -64.14.124.128 - 64.14.165.15 us -64.14.165.16 - 64.14.165.23 ca -64.14.165.24 - 64.14.165.31 us -64.14.165.32 - 64.14.165.63 ca -64.14.165.64 - 64.14.169.191 us -64.14.169.192 - 64.14.169.255 ca -64.14.170.0 - 64.14.172.255 us +64.11.129.0 - 64.11.133.255 ca +64.11.134.0 - 64.11.134.255 us +64.11.135.0 - 64.11.140.255 ca +64.11.141.0 - 64.11.141.255 us +64.11.142.0 - 64.11.150.255 ca +64.11.151.0 - 64.11.151.255 us +64.11.152.0 - 64.11.160.255 ca +64.11.161.0 - 64.11.161.255 us +64.11.162.0 - 64.11.165.255 ca +64.11.166.0 - 64.11.166.255 us +64.11.167.0 - 64.11.176.255 ca +64.11.177.0 - 64.11.177.255 us +64.11.178.0 - 64.11.183.255 ca +64.11.184.0 - 64.11.184.255 us +64.11.185.0 - 64.11.196.255 ca +64.11.197.0 - 64.14.172.255 us 64.14.173.0 - 64.14.173.255 gb 64.14.174.0 - 64.14.175.255 us 64.14.176.0 - 64.14.176.255 gb -64.14.177.0 - 64.14.177.63 us -64.14.177.64 - 64.14.177.71 ch -64.14.177.72 - 64.14.177.127 us -64.14.177.128 - 64.14.177.191 ch -64.14.177.192 - 64.14.181.63 us -64.14.181.64 - 64.14.181.79 gb -64.14.181.80 - 64.14.181.127 us -64.14.181.128 - 64.14.181.135 il -64.14.181.136 - 64.14.181.223 us -64.14.181.224 - 64.14.181.239 il -64.14.181.240 - 64.14.182.255 us -64.14.183.0 - 64.14.183.127 il -64.14.183.128 - 64.14.183.191 us -64.14.183.192 - 64.14.183.255 gb -64.14.184.0 - 64.14.184.247 us -64.14.184.248 - 64.14.184.255 gb -64.14.185.0 - 64.14.189.63 us -64.14.189.64 - 64.14.189.127 gb -64.14.189.128 - 64.14.189.255 us +64.14.177.0 - 64.14.189.255 us 64.14.190.0 - 64.14.190.255 gb 64.14.191.0 - 64.14.193.255 us 64.14.194.0 - 64.14.194.255 ph -64.14.195.0 - 64.14.201.255 us -64.14.202.0 - 64.14.202.15 in -64.14.202.16 - 64.14.224.7 us -64.14.224.8 - 64.14.224.15 gb -64.14.224.16 - 64.14.224.47 us -64.14.224.48 - 64.14.224.63 gb -64.14.224.64 - 64.15.31.255 us +64.14.195.0 - 64.15.31.255 us 64.15.32.0 - 64.15.47.255 au 64.15.48.0 - 64.15.79.255 ca 64.15.80.0 - 64.15.127.255 us 64.15.128.0 - 64.15.159.255 ca 64.15.160.0 - 64.15.204.255 us 64.15.205.0 - 64.15.205.255 au -64.15.206.0 - 64.15.227.191 us -64.15.227.192 - 64.15.227.223 ca -64.15.227.224 - 64.15.227.255 bm -64.15.228.0 - 64.15.238.31 us -64.15.238.32 - 64.15.238.63 au -64.15.238.64 - 64.17.61.31 us -64.17.61.32 - 64.17.61.55 ca -64.17.61.56 - 64.18.63.255 us +64.15.206.0 - 64.17.61.39 us +64.17.61.40 - 64.17.61.47 ca +64.17.61.48 - 64.17.61.255 us +64.17.62.0 - 64.17.63.255 ca +64.17.64.0 - 64.18.63.255 us 64.18.64.0 - 64.18.95.255 ca 64.18.96.0 - 64.18.159.255 us 64.18.160.0 - 64.18.191.255 ca -64.18.192.0 - 64.20.252.231 us -64.20.252.232 - 64.20.252.255 in -64.20.253.0 - 64.23.63.255 us +64.18.192.0 - 64.23.63.255 us 64.23.64.0 - 64.23.79.255 kr 64.23.80.0 - 64.25.159.255 us 64.25.160.0 - 64.25.191.255 ca 64.25.192.0 - 64.26.127.255 us -64.26.128.0 - 64.26.130.63 ca -64.26.130.64 - 64.26.130.71 gb -64.26.130.72 - 64.26.130.95 ca -64.26.130.96 - 64.26.130.111 us -64.26.130.112 - 64.26.132.55 ca -64.26.132.56 - 64.26.132.63 us -64.26.132.64 - 64.26.135.95 ca -64.26.135.96 - 64.26.135.103 us -64.26.135.104 - 64.26.150.103 ca -64.26.150.104 - 64.26.150.111 us -64.26.150.112 - 64.26.191.255 ca -64.26.192.0 - 64.27.7.63 us -64.27.7.64 - 64.27.7.95 kw -64.27.7.96 - 64.27.83.119 us -64.27.83.120 - 64.27.83.129 it -64.27.83.130 - 64.27.182.255 us -64.27.183.0 - 64.27.185.255 vi +64.26.128.0 - 64.26.191.255 ca +64.26.192.0 - 64.27.183.255 us +64.27.184.0 - 64.27.185.255 vi 64.27.186.0 - 64.27.255.255 us -64.28.0.0 - 64.28.0.39 no -64.28.0.40 - 64.28.0.47 gb -64.28.0.48 - 64.28.0.119 no -64.28.0.120 - 64.28.0.127 gb -64.28.0.128 - 64.28.0.135 no -64.28.0.136 - 64.28.0.143 gb -64.28.0.144 - 64.28.0.159 no -64.28.0.160 - 64.28.0.191 gb -64.28.0.192 - 64.28.0.235 no -64.28.0.236 - 64.28.0.239 gb -64.28.0.240 - 64.28.0.255 no -64.28.1.0 - 64.28.1.15 gb -64.28.1.16 - 64.28.1.183 no -64.28.1.184 - 64.28.1.191 gb -64.28.1.192 - 64.28.1.223 no -64.28.1.224 - 64.28.2.255 gb -64.28.3.0 - 64.28.3.15 no -64.28.3.16 - 64.28.3.23 gb -64.28.3.24 - 64.28.3.175 no -64.28.3.176 - 64.28.3.191 gb -64.28.3.192 - 64.28.3.255 no -64.28.4.0 - 64.28.4.255 gb -64.28.5.0 - 64.28.6.255 no -64.28.7.0 - 64.28.7.255 gb -64.28.8.0 - 64.28.8.47 no -64.28.8.48 - 64.28.8.63 gb -64.28.8.64 - 64.28.8.127 no -64.28.8.128 - 64.28.8.159 gb -64.28.8.160 - 64.28.8.167 no -64.28.8.168 - 64.28.8.179 gb -64.28.8.180 - 64.28.11.99 no -64.28.11.100 - 64.28.11.103 gb -64.28.11.104 - 64.28.12.31 no -64.28.12.32 - 64.28.12.39 gb -64.28.12.40 - 64.28.12.63 no -64.28.12.64 - 64.28.12.71 gb -64.28.12.72 - 64.28.12.79 no -64.28.12.80 - 64.28.12.95 gb -64.28.12.96 - 64.28.12.151 no -64.28.12.152 - 64.28.12.159 gb -64.28.12.160 - 64.28.17.87 no -64.28.17.88 - 64.28.17.95 nl -64.28.17.96 - 64.28.17.111 no -64.28.17.112 - 64.28.17.127 nl -64.28.17.128 - 64.28.18.7 no -64.28.18.8 - 64.28.18.15 nl -64.28.18.16 - 64.28.18.31 no -64.28.18.32 - 64.28.18.39 nl -64.28.18.40 - 64.28.18.55 no -64.28.18.56 - 64.28.18.59 nl -64.28.18.60 - 64.28.18.255 no -64.28.19.0 - 64.28.19.127 nl -64.28.19.128 - 64.28.22.39 no -64.28.22.40 - 64.28.22.47 nl -64.28.22.48 - 64.28.22.151 no -64.28.22.152 - 64.28.22.159 nl -64.28.22.160 - 64.28.23.255 no -64.28.24.0 - 64.28.24.31 nl -64.28.24.32 - 64.28.24.143 no -64.28.24.144 - 64.28.24.147 nl -64.28.24.148 - 64.28.24.151 no -64.28.24.152 - 64.28.24.159 nl -64.28.24.160 - 64.28.24.171 no -64.28.24.172 - 64.28.24.175 nl -64.28.24.176 - 64.28.26.15 no -64.28.26.16 - 64.28.26.31 nl -64.28.26.32 - 64.28.26.63 no -64.28.26.64 - 64.28.26.79 nl -64.28.26.80 - 64.28.26.95 no -64.28.26.96 - 64.28.26.103 nl -64.28.26.104 - 64.28.26.255 no -64.28.27.0 - 64.28.27.15 nl -64.28.27.16 - 64.28.27.39 no -64.28.27.40 - 64.28.27.47 nl -64.28.27.48 - 64.28.27.159 no -64.28.27.160 - 64.28.27.167 nl -64.28.27.168 - 64.28.28.71 no -64.28.28.72 - 64.28.28.95 nl -64.28.28.96 - 64.28.29.99 no -64.28.29.100 - 64.28.29.111 nl -64.28.29.112 - 64.28.30.183 no -64.28.30.184 - 64.28.30.199 nl -64.28.30.200 - 64.28.31.255 no -64.28.32.0 - 64.28.66.239 us -64.28.66.240 - 64.28.66.255 ca -64.28.67.0 - 64.28.70.223 us -64.28.70.224 - 64.28.70.239 ca -64.28.70.240 - 64.28.72.79 us -64.28.72.80 - 64.28.72.95 ca -64.28.72.96 - 64.28.74.255 us -64.28.75.0 - 64.28.75.15 ca -64.28.75.16 - 64.28.78.31 us -64.28.78.32 - 64.28.78.47 ca -64.28.78.48 - 64.28.78.223 us -64.28.78.224 - 64.28.78.239 ca -64.28.78.240 - 64.28.79.111 us -64.28.79.112 - 64.28.79.127 ca -64.28.79.128 - 64.28.80.63 us -64.28.80.64 - 64.28.80.95 ca -64.28.80.96 - 64.28.80.111 us -64.28.80.112 - 64.28.80.127 il -64.28.80.128 - 64.28.80.239 us -64.28.80.240 - 64.28.81.31 ca -64.28.81.32 - 64.28.84.31 us -64.28.84.32 - 64.28.84.47 ca -64.28.84.48 - 64.28.86.95 us -64.28.86.96 - 64.28.86.143 ca -64.28.86.144 - 64.28.86.159 us -64.28.86.160 - 64.28.86.191 ca -64.28.86.192 - 64.28.88.111 us -64.28.88.112 - 64.28.88.127 il -64.28.88.128 - 64.28.90.95 us -64.28.90.96 - 64.28.90.111 ie -64.28.90.112 - 64.28.95.127 us -64.28.95.128 - 64.28.95.143 ca -64.28.95.144 - 64.28.127.255 us +64.28.0.0 - 64.28.0.63 gb +64.28.0.64 - 64.28.0.64 se +64.28.0.65 - 64.28.0.255 gb +64.28.1.0 - 64.28.9.255 no +64.28.10.0 - 64.28.11.255 gb +64.28.12.0 - 64.28.16.255 no +64.28.17.0 - 64.28.19.255 nl +64.28.20.0 - 64.28.24.255 no +64.28.25.0 - 64.28.29.255 nl +64.28.30.0 - 64.28.30.255 no +64.28.31.0 - 64.28.31.255 nl +64.28.32.0 - 64.28.127.255 us 64.28.128.0 - 64.28.143.255 tt 64.28.144.0 - 64.30.143.255 us 64.30.144.0 - 64.30.159.255 a2 @@ -16383,2059 +14431,171 @@ 64.32.128.0 - 64.33.255.255 us 64.34.0.0 - 64.34.7.255 ca 64.34.8.0 - 64.34.8.255 gb -64.34.9.0 - 64.34.14.255 us -64.34.15.0 - 64.34.15.255 ca -64.34.16.0 - 64.34.19.255 us +64.34.9.0 - 64.34.19.255 us 64.34.20.0 - 64.34.21.255 ca -64.34.22.0 - 64.34.22.135 us -64.34.22.136 - 64.34.23.239 ca -64.34.23.240 - 64.34.23.255 us +64.34.22.0 - 64.34.23.255 us 64.34.24.0 - 64.34.24.255 ca -64.34.25.0 - 64.34.25.31 us -64.34.25.32 - 64.34.25.63 ca -64.34.25.64 - 64.34.25.95 us -64.34.25.96 - 64.34.25.199 ca -64.34.25.200 - 64.34.25.207 us -64.34.25.208 - 64.34.25.239 ca -64.34.25.240 - 64.34.25.247 us -64.34.25.248 - 64.34.25.255 ca -64.34.26.0 - 64.34.26.255 us -64.34.27.0 - 64.34.27.63 ca -64.34.27.64 - 64.34.27.79 us -64.34.27.80 - 64.34.27.111 ca -64.34.27.112 - 64.34.27.127 us -64.34.27.128 - 64.34.27.239 ca -64.34.27.240 - 64.34.27.255 us -64.34.28.0 - 64.34.31.255 ca -64.34.32.0 - 64.34.33.191 us -64.34.33.192 - 64.34.33.223 ca -64.34.33.224 - 64.34.37.31 us -64.34.37.32 - 64.34.37.63 ca -64.34.37.64 - 64.34.41.31 us -64.34.41.32 - 64.34.41.47 gb -64.34.41.48 - 64.34.47.255 us +64.34.25.0 - 64.34.27.95 us +64.34.27.96 - 64.34.27.111 ca +64.34.27.112 - 64.34.47.255 us 64.34.48.0 - 64.34.48.255 ca -64.34.49.0 - 64.34.49.7 us -64.34.49.8 - 64.34.49.15 nz -64.34.49.16 - 64.34.49.63 ca -64.34.49.64 - 64.34.49.79 mx -64.34.49.80 - 64.34.49.103 ca -64.34.49.104 - 64.34.49.111 us -64.34.49.112 - 64.34.49.159 ca -64.34.49.160 - 64.34.49.191 mx -64.34.49.192 - 64.34.49.223 us -64.34.49.224 - 64.34.49.239 ca -64.34.49.240 - 64.34.49.255 us -64.34.50.0 - 64.34.51.79 ca -64.34.51.80 - 64.34.51.87 us -64.34.51.88 - 64.34.51.95 ca -64.34.51.96 - 64.34.51.127 us -64.34.51.128 - 64.34.55.255 ca -64.34.56.0 - 64.34.57.183 us -64.34.57.184 - 64.34.57.191 ca -64.34.57.192 - 64.34.61.255 us -64.34.62.0 - 64.34.74.63 ca -64.34.74.64 - 64.34.74.127 us -64.34.74.128 - 64.34.74.255 ca -64.34.75.0 - 64.34.75.63 fi -64.34.75.64 - 64.34.75.79 ca -64.34.75.80 - 64.34.75.87 us -64.34.75.88 - 64.34.75.111 ca -64.34.75.112 - 64.34.75.127 us -64.34.75.128 - 64.34.75.207 ca -64.34.75.208 - 64.34.75.223 us -64.34.75.224 - 64.34.77.31 ca -64.34.77.32 - 64.34.77.63 us -64.34.77.64 - 64.34.79.255 ca -64.34.80.0 - 64.34.80.199 us -64.34.80.200 - 64.34.80.207 ca -64.34.80.208 - 64.34.83.255 us -64.34.84.0 - 64.34.84.31 ca -64.34.84.32 - 64.34.84.119 us -64.34.84.120 - 64.34.84.127 ca -64.34.84.128 - 64.34.86.255 us -64.34.87.0 - 64.34.87.127 gb -64.34.87.128 - 64.34.95.239 us -64.34.95.240 - 64.34.95.255 be +64.34.49.0 - 64.34.49.255 us +64.34.50.0 - 64.34.50.255 ca +64.34.51.0 - 64.34.51.255 us +64.34.52.0 - 64.34.54.255 ca +64.34.55.0 - 64.34.61.255 us +64.34.62.0 - 64.34.64.255 ca +64.34.65.0 - 64.34.65.255 us +64.34.66.0 - 64.34.66.255 ca +64.34.67.0 - 64.34.69.255 us +64.34.70.0 - 64.34.70.255 ca +64.34.71.0 - 64.34.71.95 us +64.34.71.96 - 64.34.71.127 ca +64.34.71.128 - 64.34.71.255 us +64.34.72.0 - 64.34.73.255 ca +64.34.74.0 - 64.34.74.239 us +64.34.74.240 - 64.34.74.247 ca +64.34.74.248 - 64.34.75.255 us +64.34.76.0 - 64.34.76.255 ca +64.34.77.0 - 64.34.77.255 us +64.34.78.0 - 64.34.79.255 ca +64.34.80.0 - 64.34.95.255 us 64.34.96.0 - 64.34.97.127 ca -64.34.97.128 - 64.34.97.143 vg -64.34.97.144 - 64.34.97.159 us -64.34.97.160 - 64.34.97.175 ca -64.34.97.176 - 64.34.97.191 us -64.34.97.192 - 64.34.97.199 mx -64.34.97.200 - 64.34.97.207 ca -64.34.97.208 - 64.34.97.223 us -64.34.97.224 - 64.34.98.127 ca -64.34.98.128 - 64.34.98.159 us -64.34.98.160 - 64.34.98.190 ca -64.34.98.191 - 64.34.98.207 us -64.34.98.208 - 64.34.99.87 ca -64.34.99.88 - 64.34.99.95 us -64.34.99.96 - 64.34.99.111 ca -64.34.99.112 - 64.34.99.127 mx -64.34.99.128 - 64.34.99.175 ca -64.34.99.176 - 64.34.99.191 cn -64.34.99.192 - 64.34.103.255 ca -64.34.104.0 - 64.34.104.79 us -64.34.104.80 - 64.34.104.95 ca -64.34.104.96 - 64.34.104.127 bv -64.34.104.128 - 64.34.105.191 ca -64.34.105.192 - 64.34.105.255 mx -64.34.106.0 - 64.34.107.79 ca -64.34.107.80 - 64.34.107.95 us -64.34.107.96 - 64.34.107.255 ca -64.34.108.0 - 64.34.108.127 cr -64.34.108.128 - 64.34.108.223 us -64.34.108.224 - 64.34.108.239 ca -64.34.108.240 - 64.34.108.255 us -64.34.109.0 - 64.34.110.143 ca -64.34.110.144 - 64.34.110.223 us -64.34.110.224 - 64.34.113.255 ca +64.34.97.128 - 64.34.97.223 us +64.34.97.224 - 64.34.97.255 ca +64.34.98.0 - 64.34.99.255 us +64.34.100.0 - 64.34.103.255 ca +64.34.104.0 - 64.34.105.255 us +64.34.106.0 - 64.34.106.255 ca +64.34.107.0 - 64.34.109.167 us +64.34.109.168 - 64.34.109.175 ca +64.34.109.176 - 64.34.109.255 us +64.34.110.0 - 64.34.110.63 ca +64.34.110.64 - 64.34.110.255 us +64.34.111.0 - 64.34.113.255 ca 64.34.114.0 - 64.34.116.255 us 64.34.117.0 - 64.34.117.255 ca 64.34.118.0 - 64.34.119.255 us 64.34.120.0 - 64.34.124.255 ca -64.34.125.0 - 64.34.128.7 us -64.34.128.8 - 64.34.128.15 ca -64.34.128.16 - 64.34.128.63 us -64.34.128.64 - 64.34.128.159 ca -64.34.128.160 - 64.34.128.207 us -64.34.128.208 - 64.34.128.215 ca -64.34.128.216 - 64.34.128.223 us -64.34.128.224 - 64.34.128.239 ca -64.34.128.240 - 64.34.128.255 us +64.34.125.0 - 64.34.128.255 us 64.34.129.0 - 64.34.129.255 ca -64.34.130.0 - 64.34.130.31 us -64.34.130.32 - 64.34.130.47 ca -64.34.130.48 - 64.34.130.63 us -64.34.130.64 - 64.34.130.79 ca -64.34.130.80 - 64.34.130.191 us -64.34.130.192 - 64.34.134.31 ca -64.34.134.32 - 64.34.134.71 us -64.34.134.72 - 64.34.134.79 ca -64.34.134.80 - 64.34.134.119 us -64.34.134.120 - 64.34.134.127 ca -64.34.134.128 - 64.34.134.143 us -64.34.134.144 - 64.34.134.159 ca -64.34.134.160 - 64.34.134.191 us -64.34.134.192 - 64.34.134.239 ca -64.34.134.240 - 64.34.134.255 us -64.34.135.0 - 64.34.135.31 ca -64.34.135.32 - 64.34.135.95 us -64.34.135.96 - 64.34.136.255 ca -64.34.137.0 - 64.34.137.31 nz -64.34.137.32 - 64.34.137.39 ca -64.34.137.40 - 64.34.137.47 us -64.34.137.48 - 64.34.137.71 ca -64.34.137.72 - 64.34.137.87 us -64.34.137.88 - 64.34.137.103 ca -64.34.137.104 - 64.34.137.119 us -64.34.137.120 - 64.34.137.127 ca -64.34.137.128 - 64.34.137.143 us -64.34.137.144 - 64.34.137.159 ca -64.34.137.160 - 64.34.137.191 us -64.34.137.192 - 64.34.137.223 ca -64.34.137.224 - 64.34.137.255 us -64.34.138.0 - 64.34.139.255 ca -64.34.140.0 - 64.34.140.127 us -64.34.140.128 - 64.34.140.159 ca -64.34.140.160 - 64.34.140.191 us -64.34.140.192 - 64.34.140.223 ca -64.34.140.224 - 64.34.141.127 us -64.34.141.128 - 64.34.141.159 ca -64.34.141.160 - 64.34.141.223 us -64.34.141.224 - 64.34.143.63 ca -64.34.143.64 - 64.34.143.95 us -64.34.143.96 - 64.34.143.127 ca -64.34.143.128 - 64.34.143.255 us +64.34.130.0 - 64.34.130.255 us +64.34.131.0 - 64.34.133.255 ca +64.34.134.0 - 64.34.135.255 us +64.34.136.0 - 64.34.136.255 ca +64.34.137.0 - 64.34.137.191 us +64.34.137.192 - 64.34.137.199 ca +64.34.137.200 - 64.34.137.255 us +64.34.138.0 - 64.34.138.255 ca +64.34.139.0 - 64.34.141.255 us +64.34.142.0 - 64.34.142.255 ca +64.34.143.0 - 64.34.143.255 us 64.34.144.0 - 64.34.144.255 ca -64.34.145.0 - 64.34.145.15 us -64.34.145.16 - 64.34.145.79 ca -64.34.145.80 - 64.34.145.95 us -64.34.145.96 - 64.34.148.11 ca -64.34.148.12 - 64.34.148.15 us -64.34.148.16 - 64.34.148.127 ca -64.34.148.128 - 64.34.148.255 us -64.34.149.0 - 64.34.154.159 ca -64.34.154.160 - 64.34.154.167 us -64.34.154.168 - 64.34.154.171 ca -64.34.154.172 - 64.34.154.191 us -64.34.154.192 - 64.34.154.223 ca -64.34.154.224 - 64.34.154.239 us -64.34.154.240 - 64.34.155.159 ca -64.34.155.160 - 64.34.155.191 us -64.34.155.192 - 64.34.159.255 ca -64.34.160.0 - 64.34.164.204 us -64.34.164.205 - 64.34.164.205 in -64.34.164.206 - 64.34.168.38 us -64.34.168.39 - 64.34.168.39 in -64.34.168.40 - 64.34.188.127 us -64.34.188.128 - 64.34.188.191 br -64.34.188.192 - 64.34.211.243 us -64.34.211.244 - 64.34.211.251 ca -64.34.211.252 - 64.34.218.167 us -64.34.218.168 - 64.34.218.175 ca -64.34.218.176 - 64.34.219.255 us -64.34.220.0 - 64.34.220.127 ca -64.34.220.128 - 64.34.220.191 us -64.34.220.192 - 64.34.220.239 ca -64.34.220.240 - 64.34.220.255 sg -64.34.221.0 - 64.34.222.95 ca -64.34.222.96 - 64.34.222.151 us -64.34.222.152 - 64.34.223.63 ca -64.34.223.64 - 64.34.223.159 us -64.34.223.160 - 64.34.224.15 ca -64.34.224.16 - 64.34.224.31 us -64.34.224.32 - 64.34.225.63 ca -64.34.225.64 - 64.34.225.79 us -64.34.225.80 - 64.34.225.127 ca -64.34.225.128 - 64.34.225.143 us -64.34.225.144 - 64.34.226.7 ca -64.34.226.8 - 64.34.226.15 us -64.34.226.16 - 64.34.226.239 ca -64.34.226.240 - 64.34.226.247 us -64.34.226.248 - 64.34.228.63 ca -64.34.228.64 - 64.34.228.127 gb -64.34.228.128 - 64.34.228.255 ca -64.34.229.0 - 64.34.229.255 us +64.34.145.0 - 64.34.145.255 us +64.34.146.0 - 64.34.147.255 ca +64.34.148.0 - 64.34.149.255 us +64.34.150.0 - 64.34.152.255 ca +64.34.153.0 - 64.34.154.255 us +64.34.155.0 - 64.34.155.255 ca +64.34.156.0 - 64.34.220.255 us +64.34.221.0 - 64.34.221.255 ca +64.34.222.0 - 64.34.222.139 us +64.34.222.140 - 64.34.222.143 ca +64.34.222.144 - 64.34.226.255 us +64.34.227.0 - 64.34.227.255 ca +64.34.228.0 - 64.34.229.255 us 64.34.230.0 - 64.34.230.255 bz -64.34.231.0 - 64.34.231.31 ca -64.34.231.32 - 64.34.231.39 us -64.34.231.40 - 64.34.231.47 dm -64.34.231.48 - 64.34.231.55 ca -64.34.231.56 - 64.34.231.63 us -64.34.231.64 - 64.34.231.71 ca -64.34.231.72 - 64.34.231.79 us -64.34.231.80 - 64.34.231.127 ca -64.34.231.128 - 64.34.231.135 gb -64.34.231.136 - 64.34.231.231 ca -64.34.231.232 - 64.34.231.238 us -64.34.231.239 - 64.34.231.246 ca -64.34.231.247 - 64.34.231.255 us -64.34.232.0 - 64.34.235.15 ca -64.34.235.16 - 64.34.235.23 us -64.34.235.24 - 64.34.235.111 ca -64.34.235.112 - 64.34.235.127 us -64.34.235.128 - 64.34.235.191 ca -64.34.235.192 - 64.34.235.255 us -64.34.236.0 - 64.34.236.159 ca -64.34.236.160 - 64.34.236.167 us -64.34.236.168 - 64.34.239.255 ca -64.34.240.0 - 64.34.240.255 us +64.34.231.0 - 64.34.231.255 us +64.34.232.0 - 64.34.234.255 ca +64.34.235.0 - 64.34.240.255 us 64.34.241.0 - 64.34.241.255 ca 64.34.242.0 - 64.34.242.255 us 64.34.243.0 - 64.34.243.255 ca -64.34.244.0 - 64.34.248.111 us -64.34.248.112 - 64.34.248.127 eg -64.34.248.128 - 64.34.248.135 us -64.34.248.136 - 64.34.248.151 ca -64.34.248.152 - 64.34.249.63 us -64.34.249.64 - 64.34.249.79 ca -64.34.249.80 - 64.34.249.111 us -64.34.249.112 - 64.34.249.159 ca -64.34.249.160 - 64.34.249.255 us -64.34.250.0 - 64.34.250.15 cn -64.34.250.16 - 64.34.251.63 us -64.34.251.64 - 64.34.251.79 ca -64.34.251.80 - 64.34.251.119 us -64.34.251.120 - 64.34.251.127 au -64.34.251.128 - 64.34.251.175 us -64.34.251.176 - 64.34.251.191 ca -64.34.251.192 - 64.34.254.223 us -64.34.254.224 - 64.34.254.255 eg -64.34.255.0 - 64.34.255.87 us -64.34.255.88 - 64.34.255.95 eg -64.34.255.96 - 64.34.255.191 us +64.34.244.0 - 64.34.255.191 us 64.34.255.192 - 64.34.255.255 in -64.35.0.0 - 64.35.2.151 us -64.35.2.152 - 64.35.2.159 il -64.35.2.160 - 64.35.2.255 us -64.35.3.0 - 64.35.3.253 es -64.35.3.254 - 64.35.4.127 us -64.35.4.128 - 64.35.4.143 ca -64.35.4.144 - 64.35.4.183 us -64.35.4.184 - 64.35.4.191 za -64.35.4.192 - 64.35.7.63 us -64.35.7.64 - 64.35.7.71 mx -64.35.7.72 - 64.35.31.255 us -64.35.32.0 - 64.35.32.63 ca -64.35.32.64 - 64.35.32.95 mx -64.35.32.96 - 64.35.33.63 us -64.35.33.64 - 64.35.33.95 in -64.35.33.96 - 64.35.33.143 us -64.35.33.144 - 64.35.33.151 ie -64.35.33.152 - 64.35.33.159 fr -64.35.33.160 - 64.35.35.7 us -64.35.35.8 - 64.35.35.23 de -64.35.35.24 - 64.35.35.159 us -64.35.35.160 - 64.35.35.191 ar -64.35.35.192 - 64.35.46.167 us -64.35.46.168 - 64.35.46.175 jp -64.35.46.176 - 64.35.46.191 us -64.35.46.192 - 64.35.46.223 ch -64.35.46.224 - 64.35.48.95 us -64.35.48.96 - 64.35.48.103 ve -64.35.48.104 - 64.35.50.255 us -64.35.51.0 - 64.35.51.31 mx -64.35.51.32 - 64.35.51.63 ar -64.35.51.64 - 64.35.51.95 us -64.35.51.96 - 64.35.51.127 ca -64.35.51.128 - 64.35.51.191 us -64.35.51.192 - 64.35.51.223 il -64.35.51.224 - 64.35.52.255 us +64.35.0.0 - 64.35.52.255 us 64.35.53.0 - 64.35.53.255 de -64.35.54.0 - 64.35.54.31 ca -64.35.54.32 - 64.35.54.63 us -64.35.54.64 - 64.35.54.95 pr -64.35.54.96 - 64.35.55.255 us +64.35.54.0 - 64.35.55.255 us 64.35.56.0 - 64.35.56.255 il 64.35.57.0 - 64.37.31.255 us 64.37.32.0 - 64.37.47.255 bm -64.37.48.0 - 64.37.48.217 us -64.37.48.218 - 64.37.48.219 in -64.37.48.220 - 64.37.48.252 us -64.37.48.253 - 64.37.48.254 in -64.37.48.255 - 64.37.52.233 us -64.37.52.234 - 64.37.52.254 pk -64.37.52.255 - 64.37.55.59 us -64.37.55.60 - 64.37.55.63 in -64.37.55.64 - 64.37.56.244 us -64.37.56.245 - 64.37.56.245 ca -64.37.56.246 - 64.37.63.255 us -64.37.64.0 - 64.37.64.31 in -64.37.64.32 - 64.37.64.191 us -64.37.64.192 - 64.37.64.255 ca -64.37.65.0 - 64.37.65.127 us -64.37.65.128 - 64.37.65.191 in -64.37.65.192 - 64.37.66.255 us +64.37.48.0 - 64.37.66.255 us 64.37.67.0 - 64.37.67.255 ca -64.37.68.0 - 64.37.68.31 ve -64.37.68.32 - 64.37.68.95 us -64.37.68.96 - 64.37.68.127 pk -64.37.68.128 - 64.37.68.159 in -64.37.68.160 - 64.37.68.191 us -64.37.68.192 - 64.37.68.223 be -64.37.68.224 - 64.37.68.255 ca -64.37.69.0 - 64.37.69.255 us -64.37.70.0 - 64.37.70.255 ca -64.37.71.0 - 64.37.71.63 us -64.37.71.64 - 64.37.71.95 fr -64.37.71.96 - 64.37.72.127 us -64.37.72.128 - 64.37.72.255 ca -64.37.73.0 - 64.37.73.95 us -64.37.73.96 - 64.37.73.127 it -64.37.73.128 - 64.37.73.159 us -64.37.73.160 - 64.37.73.191 do -64.37.73.192 - 64.37.75.63 us -64.37.75.64 - 64.37.75.95 ca -64.37.75.96 - 64.37.75.127 us -64.37.75.128 - 64.37.75.159 pk -64.37.75.160 - 64.37.75.191 us -64.37.75.192 - 64.37.75.223 in -64.37.75.224 - 64.37.76.191 us -64.37.76.192 - 64.37.76.223 ca -64.37.76.224 - 64.37.76.255 it -64.37.77.0 - 64.37.77.255 ca -64.37.78.0 - 64.37.78.127 us -64.37.78.128 - 64.37.78.159 ca -64.37.78.160 - 64.37.78.191 tw -64.37.78.192 - 64.37.80.255 us -64.37.81.0 - 64.37.81.255 ca -64.37.82.0 - 64.37.82.31 be -64.37.82.32 - 64.37.82.95 us -64.37.82.96 - 64.37.82.127 ca -64.37.82.128 - 64.37.82.159 au -64.37.82.160 - 64.37.82.255 us -64.37.83.0 - 64.37.83.255 ca -64.37.84.0 - 64.37.84.127 us -64.37.84.128 - 64.37.84.255 be -64.37.85.0 - 64.37.86.127 us -64.37.86.128 - 64.37.86.255 ca -64.37.87.0 - 64.37.87.255 us -64.37.88.0 - 64.37.88.31 ve -64.37.88.32 - 64.37.88.95 ca -64.37.88.96 - 64.37.88.127 us -64.37.88.128 - 64.37.88.159 ca -64.37.88.160 - 64.37.88.223 us -64.37.88.224 - 64.37.88.255 in -64.37.89.0 - 64.37.89.255 us -64.37.90.0 - 64.37.90.63 in -64.37.90.64 - 64.37.90.127 ca -64.37.90.128 - 64.37.90.191 us -64.37.90.192 - 64.37.90.255 ca -64.37.91.0 - 64.37.91.127 us -64.37.91.128 - 64.37.91.191 in -64.37.91.192 - 64.37.91.223 be -64.37.91.224 - 64.37.91.255 in -64.37.92.0 - 64.37.92.255 ca -64.37.93.0 - 64.37.94.63 us -64.37.94.64 - 64.37.94.95 ca -64.37.94.96 - 64.37.94.127 in -64.37.94.128 - 64.37.94.193 us -64.37.94.194 - 64.37.94.225 in -64.37.94.226 - 64.37.95.255 us -64.37.96.0 - 64.37.96.255 ca -64.37.97.0 - 64.37.99.63 us -64.37.99.64 - 64.37.99.127 in -64.37.99.128 - 64.37.99.191 ca -64.37.99.192 - 64.37.99.255 us -64.37.100.0 - 64.37.100.127 be -64.37.100.128 - 64.37.101.255 us -64.37.102.0 - 64.37.102.127 in -64.37.102.128 - 64.37.103.31 us -64.37.103.32 - 64.37.103.63 au -64.37.103.64 - 64.37.103.127 us -64.37.103.128 - 64.37.103.159 tr -64.37.103.160 - 64.37.103.223 us -64.37.103.224 - 64.37.103.255 ca -64.37.104.0 - 64.37.104.255 pk -64.37.105.0 - 64.37.108.63 us -64.37.108.64 - 64.37.108.95 in -64.37.108.96 - 64.37.108.127 il -64.37.108.128 - 64.37.108.159 in -64.37.108.160 - 64.37.108.223 be -64.37.108.224 - 64.37.108.255 us +64.37.68.0 - 64.37.108.255 us 64.37.109.0 - 64.37.109.255 ca 64.37.110.0 - 64.37.110.255 us 64.37.111.0 - 64.37.111.255 in -64.37.112.0 - 64.37.112.223 us -64.37.112.224 - 64.37.112.255 in -64.37.113.0 - 64.37.114.31 us -64.37.114.32 - 64.37.114.63 be -64.37.114.64 - 64.37.114.95 ca -64.37.114.96 - 64.37.114.159 us -64.37.114.160 - 64.37.114.191 cn -64.37.114.192 - 64.37.114.223 ca -64.37.114.224 - 64.37.114.255 us -64.37.115.0 - 64.37.116.63 ca -64.37.116.64 - 64.37.116.127 us -64.37.116.128 - 64.37.116.159 fr -64.37.116.160 - 64.37.116.223 at -64.37.116.224 - 64.37.117.33 us -64.37.117.34 - 64.37.117.63 be -64.37.117.64 - 64.37.117.95 us -64.37.117.96 - 64.37.117.127 fr -64.37.117.128 - 64.37.117.255 us -64.37.118.0 - 64.37.118.127 in -64.37.118.128 - 64.37.118.255 us +64.37.112.0 - 64.37.114.255 us +64.37.115.0 - 64.37.115.255 ca +64.37.116.0 - 64.37.118.255 us 64.37.119.0 - 64.37.119.255 ca -64.37.120.0 - 64.37.120.255 us -64.37.121.0 - 64.37.121.31 be -64.37.121.32 - 64.37.123.255 us -64.37.124.0 - 64.37.124.255 ca +64.37.120.0 - 64.37.124.255 us 64.37.125.0 - 64.37.125.255 ae -64.37.126.0 - 64.37.200.159 us -64.37.200.160 - 64.37.200.167 gb -64.37.200.168 - 64.37.206.15 us -64.37.206.16 - 64.37.206.23 gb -64.37.206.24 - 64.38.193.95 us -64.38.193.96 - 64.38.193.127 th -64.38.193.128 - 64.38.194.255 us -64.38.195.0 - 64.38.195.31 au -64.38.195.32 - 64.38.195.239 us -64.38.195.240 - 64.38.195.255 ca -64.38.196.0 - 64.38.201.255 us +64.37.126.0 - 64.38.201.255 us 64.38.202.0 - 64.38.202.255 no -64.38.203.0 - 64.38.205.7 us -64.38.205.8 - 64.38.205.15 hu -64.38.205.16 - 64.38.207.255 us -64.38.208.0 - 64.38.208.15 dk -64.38.208.16 - 64.38.233.63 us -64.38.233.64 - 64.38.233.79 ua -64.38.233.80 - 64.38.235.207 us -64.38.235.208 - 64.38.235.215 nl -64.38.235.216 - 64.38.243.255 us -64.38.244.0 - 64.38.244.31 cy -64.38.244.32 - 64.38.244.47 us -64.38.244.48 - 64.38.244.63 no -64.38.244.64 - 64.38.245.159 us -64.38.245.160 - 64.38.245.175 nl -64.38.245.176 - 64.38.245.255 us -64.38.246.0 - 64.38.246.31 cy -64.38.246.32 - 64.39.3.7 us -64.39.3.8 - 64.39.3.15 gb -64.39.3.16 - 64.39.3.95 us -64.39.3.96 - 64.39.3.111 bd -64.39.3.112 - 64.39.3.135 us -64.39.3.136 - 64.39.3.159 bd -64.39.3.160 - 64.39.3.199 us -64.39.3.200 - 64.39.3.207 mh -64.39.3.208 - 64.39.4.167 us -64.39.4.168 - 64.39.4.175 gb -64.39.4.176 - 64.39.4.223 us -64.39.4.224 - 64.39.4.231 il -64.39.4.232 - 64.39.4.239 mx -64.39.4.240 - 64.39.4.247 us -64.39.4.248 - 64.39.4.255 mx -64.39.5.0 - 64.39.5.15 in -64.39.5.16 - 64.39.5.87 us -64.39.5.88 - 64.39.5.95 au -64.39.5.96 - 64.39.5.119 us -64.39.5.120 - 64.39.5.127 fr -64.39.5.128 - 64.39.5.151 us -64.39.5.152 - 64.39.5.159 ca -64.39.5.160 - 64.39.5.167 us -64.39.5.168 - 64.39.5.175 de -64.39.5.176 - 64.39.6.7 us -64.39.6.8 - 64.39.6.15 au -64.39.6.16 - 64.39.6.23 us -64.39.6.24 - 64.39.6.31 gb -64.39.6.32 - 64.39.6.39 us -64.39.6.40 - 64.39.6.47 in -64.39.6.48 - 64.39.6.135 us -64.39.6.136 - 64.39.6.143 dk -64.39.6.144 - 64.39.6.151 pe -64.39.6.152 - 64.39.6.167 us -64.39.6.168 - 64.39.6.175 gb -64.39.6.176 - 64.39.6.207 us -64.39.6.208 - 64.39.6.215 id -64.39.6.216 - 64.39.6.223 gb -64.39.6.224 - 64.39.6.239 in -64.39.6.240 - 64.39.6.255 bh -64.39.7.0 - 64.39.7.31 us -64.39.7.32 - 64.39.7.63 in -64.39.7.64 - 64.39.7.127 us -64.39.7.128 - 64.39.7.143 bd -64.39.7.144 - 64.39.7.159 us -64.39.7.160 - 64.39.7.167 vi -64.39.7.168 - 64.39.7.183 us -64.39.7.184 - 64.39.7.191 gb -64.39.7.192 - 64.39.7.207 us -64.39.7.208 - 64.39.7.215 au -64.39.7.216 - 64.39.7.247 us -64.39.7.248 - 64.39.7.255 mx -64.39.8.0 - 64.39.8.47 us -64.39.8.48 - 64.39.8.55 gb -64.39.8.56 - 64.39.8.71 us -64.39.8.72 - 64.39.8.79 vi -64.39.8.80 - 64.39.8.87 gb -64.39.8.88 - 64.39.8.95 ca -64.39.8.96 - 64.39.8.167 us -64.39.8.168 - 64.39.8.175 it -64.39.8.176 - 64.39.8.183 us -64.39.8.184 - 64.39.8.199 fr -64.39.8.200 - 64.39.8.207 au -64.39.8.208 - 64.39.8.239 us -64.39.8.240 - 64.39.8.255 gb -64.39.9.0 - 64.39.9.15 us -64.39.9.16 - 64.39.9.23 bd -64.39.9.24 - 64.39.9.39 gb -64.39.9.40 - 64.39.9.47 ck -64.39.9.48 - 64.39.9.63 il -64.39.9.64 - 64.39.9.79 bd -64.39.9.80 - 64.39.9.87 in -64.39.9.88 - 64.39.9.175 us -64.39.9.176 - 64.39.9.191 ru -64.39.9.192 - 64.39.9.199 mx -64.39.9.200 - 64.39.9.223 us -64.39.9.224 - 64.39.9.239 se -64.39.9.240 - 64.39.9.247 id -64.39.9.248 - 64.39.9.255 au -64.39.10.0 - 64.39.10.7 us -64.39.10.8 - 64.39.10.15 in -64.39.10.16 - 64.39.10.23 us -64.39.10.24 - 64.39.10.31 gb -64.39.10.32 - 64.39.10.47 us -64.39.10.48 - 64.39.10.55 in -64.39.10.56 - 64.39.10.95 us -64.39.10.96 - 64.39.10.103 gb -64.39.10.104 - 64.39.10.111 in -64.39.10.112 - 64.39.10.159 us -64.39.10.160 - 64.39.10.167 my -64.39.10.168 - 64.39.10.175 us -64.39.10.176 - 64.39.10.183 in -64.39.10.184 - 64.39.10.191 us -64.39.10.192 - 64.39.10.199 in -64.39.10.200 - 64.39.10.223 us -64.39.10.224 - 64.39.10.231 in -64.39.10.232 - 64.39.10.239 gb -64.39.10.240 - 64.39.11.119 us -64.39.11.120 - 64.39.11.127 au -64.39.11.128 - 64.39.11.255 us -64.39.12.0 - 64.39.12.7 in -64.39.12.8 - 64.39.12.47 us -64.39.12.48 - 64.39.12.55 au -64.39.12.56 - 64.39.12.103 us -64.39.12.104 - 64.39.12.111 in -64.39.12.112 - 64.39.12.119 us -64.39.12.120 - 64.39.12.127 in -64.39.12.128 - 64.39.12.191 us -64.39.12.192 - 64.39.12.207 nz -64.39.12.208 - 64.39.12.215 us -64.39.12.216 - 64.39.12.223 gr -64.39.12.224 - 64.39.12.247 us -64.39.12.248 - 64.39.12.255 au -64.39.13.0 - 64.39.13.31 us -64.39.13.32 - 64.39.13.39 ca -64.39.13.40 - 64.39.13.87 us -64.39.13.88 - 64.39.13.95 nl -64.39.13.96 - 64.39.13.103 us -64.39.13.104 - 64.39.13.111 gb -64.39.13.112 - 64.39.13.127 us -64.39.13.128 - 64.39.13.135 au -64.39.13.136 - 64.39.13.143 us -64.39.13.144 - 64.39.13.151 au -64.39.13.152 - 64.39.13.207 us -64.39.13.208 - 64.39.13.215 ca -64.39.13.216 - 64.39.13.223 in -64.39.13.224 - 64.39.15.255 us -64.39.16.0 - 64.39.16.7 in -64.39.16.8 - 64.39.16.47 us -64.39.16.48 - 64.39.16.55 se -64.39.16.56 - 64.39.16.71 us -64.39.16.72 - 64.39.16.79 il -64.39.16.80 - 64.39.16.103 us -64.39.16.104 - 64.39.16.111 au -64.39.16.112 - 64.39.16.127 us -64.39.16.128 - 64.39.16.191 at -64.39.16.192 - 64.39.18.23 us -64.39.18.24 - 64.39.18.31 gb -64.39.18.32 - 64.39.18.71 us -64.39.18.72 - 64.39.18.79 in -64.39.18.80 - 64.39.18.103 us -64.39.18.104 - 64.39.18.111 ca -64.39.18.112 - 64.39.18.159 us -64.39.18.160 - 64.39.18.167 bd -64.39.18.168 - 64.39.18.175 gb -64.39.18.176 - 64.39.18.183 us -64.39.18.184 - 64.39.18.191 de -64.39.18.192 - 64.39.19.47 us -64.39.19.48 - 64.39.19.63 fr -64.39.19.64 - 64.39.19.127 us -64.39.19.128 - 64.39.19.143 nz -64.39.19.144 - 64.39.19.159 us -64.39.19.160 - 64.39.19.167 dk -64.39.19.168 - 64.39.19.191 us -64.39.19.192 - 64.39.19.207 in -64.39.19.208 - 64.39.19.215 us -64.39.19.216 - 64.39.19.223 au -64.39.19.224 - 64.39.19.247 us -64.39.19.248 - 64.39.19.255 gb -64.39.20.0 - 64.39.20.7 nz -64.39.20.8 - 64.39.20.31 us -64.39.20.32 - 64.39.20.39 in -64.39.20.40 - 64.39.20.63 us -64.39.20.64 - 64.39.20.71 in -64.39.20.72 - 64.39.20.111 us -64.39.20.112 - 64.39.20.127 gb -64.39.20.128 - 64.39.20.135 us -64.39.20.136 - 64.39.20.143 ar -64.39.20.144 - 64.39.20.183 us -64.39.20.184 - 64.39.20.191 ca -64.39.20.192 - 64.39.20.231 us -64.39.20.232 - 64.39.20.239 ru -64.39.20.240 - 64.39.21.63 us -64.39.21.64 - 64.39.21.79 ca -64.39.21.80 - 64.39.21.111 us -64.39.21.112 - 64.39.21.119 in -64.39.21.120 - 64.39.21.127 mx -64.39.21.128 - 64.39.21.167 us -64.39.21.168 - 64.39.21.183 au -64.39.21.184 - 64.39.21.215 us -64.39.21.216 - 64.39.21.223 eg -64.39.21.224 - 64.39.21.231 au -64.39.21.232 - 64.39.21.255 us -64.39.22.0 - 64.39.22.31 bh -64.39.22.32 - 64.39.22.79 us -64.39.22.80 - 64.39.22.95 kw -64.39.22.96 - 64.39.22.135 us -64.39.22.136 - 64.39.22.151 au -64.39.22.152 - 64.39.22.159 ca -64.39.22.160 - 64.39.22.167 us -64.39.22.168 - 64.39.22.175 au -64.39.22.176 - 64.39.22.191 us -64.39.22.192 - 64.39.22.199 au -64.39.22.200 - 64.39.22.207 de -64.39.22.208 - 64.39.22.239 us -64.39.22.240 - 64.39.22.255 au -64.39.23.0 - 64.39.23.15 us -64.39.23.16 - 64.39.23.23 ch -64.39.23.24 - 64.39.23.31 us -64.39.23.32 - 64.39.23.39 au -64.39.23.40 - 64.39.23.47 us -64.39.23.48 - 64.39.23.63 gi -64.39.23.64 - 64.39.23.79 us -64.39.23.80 - 64.39.23.87 gb -64.39.23.88 - 64.39.23.95 us -64.39.23.96 - 64.39.23.103 ca -64.39.23.104 - 64.39.23.111 us -64.39.23.112 - 64.39.23.119 sa -64.39.23.120 - 64.39.23.151 us -64.39.23.152 - 64.39.23.159 py -64.39.23.160 - 64.39.23.175 au -64.39.23.176 - 64.39.23.215 us -64.39.23.216 - 64.39.23.223 se -64.39.23.224 - 64.39.24.111 us -64.39.24.112 - 64.39.24.119 au -64.39.24.120 - 64.39.24.127 de -64.39.24.128 - 64.39.24.159 us -64.39.24.160 - 64.39.24.167 ca -64.39.24.168 - 64.39.24.175 mx -64.39.24.176 - 64.39.24.207 us -64.39.24.208 - 64.39.24.215 ca -64.39.24.216 - 64.39.24.255 us -64.39.25.0 - 64.39.25.7 ca -64.39.25.8 - 64.39.25.23 us -64.39.25.24 - 64.39.25.31 ca -64.39.25.32 - 64.39.25.63 bh -64.39.25.64 - 64.39.25.87 us -64.39.25.88 - 64.39.25.95 gi -64.39.25.96 - 64.39.25.127 us -64.39.25.128 - 64.39.25.255 it -64.39.26.0 - 64.39.26.7 ca -64.39.26.8 - 64.39.26.23 us -64.39.26.24 - 64.39.26.31 ca -64.39.26.32 - 64.39.26.55 us -64.39.26.56 - 64.39.26.63 ca -64.39.26.64 - 64.39.26.103 us -64.39.26.104 - 64.39.26.111 eg -64.39.26.112 - 64.39.26.183 us -64.39.26.184 - 64.39.26.191 in -64.39.26.192 - 64.39.26.199 bm -64.39.26.200 - 64.39.26.207 ca -64.39.26.208 - 64.39.26.223 us -64.39.26.224 - 64.39.26.231 gb -64.39.26.232 - 64.39.26.239 us -64.39.26.240 - 64.39.26.247 gb -64.39.26.248 - 64.39.26.255 us -64.39.27.0 - 64.39.27.7 gb -64.39.27.8 - 64.39.27.15 jp -64.39.27.16 - 64.39.27.23 se -64.39.27.24 - 64.39.27.47 us -64.39.27.48 - 64.39.27.55 in -64.39.27.56 - 64.39.27.111 us -64.39.27.112 - 64.39.27.119 ru -64.39.27.120 - 64.39.27.183 us -64.39.27.184 - 64.39.27.191 se -64.39.27.192 - 64.39.27.199 ve -64.39.27.200 - 64.39.27.255 us -64.39.28.0 - 64.39.28.15 au -64.39.28.16 - 64.39.28.23 us -64.39.28.24 - 64.39.28.31 es -64.39.28.32 - 64.39.28.47 us -64.39.28.48 - 64.39.28.55 mx -64.39.28.56 - 64.39.28.63 nz -64.39.28.64 - 64.39.28.95 us -64.39.28.96 - 64.39.28.103 id -64.39.28.104 - 64.39.28.111 us -64.39.28.112 - 64.39.28.119 au -64.39.28.120 - 64.39.28.127 us -64.39.28.128 - 64.39.28.143 ca -64.39.28.144 - 64.39.28.159 ru -64.39.28.160 - 64.39.28.183 us -64.39.28.184 - 64.39.28.191 at -64.39.28.192 - 64.39.28.215 gb -64.39.28.216 - 64.39.29.15 us -64.39.29.16 - 64.39.29.23 fr -64.39.29.24 - 64.39.29.39 us -64.39.29.40 - 64.39.29.55 ca -64.39.29.56 - 64.39.29.63 ar -64.39.29.64 - 64.39.29.79 de -64.39.29.80 - 64.39.29.87 us -64.39.29.88 - 64.39.29.95 gb -64.39.29.96 - 64.39.29.103 ve -64.39.29.104 - 64.39.29.111 us -64.39.29.112 - 64.39.29.119 ca -64.39.29.120 - 64.39.29.151 us -64.39.29.152 - 64.39.29.159 ru -64.39.29.160 - 64.39.34.31 us -64.39.34.32 - 64.39.34.47 gb -64.39.34.48 - 64.39.34.79 us -64.39.34.80 - 64.39.34.95 ae -64.39.34.96 - 64.39.38.39 us -64.39.38.40 - 64.39.38.47 de -64.39.38.48 - 64.39.38.63 us -64.39.38.64 - 64.39.38.79 de -64.39.38.80 - 64.39.39.31 us -64.39.39.32 - 64.39.39.95 de -64.39.39.96 - 64.39.39.255 us +64.38.203.0 - 64.39.39.255 us 64.39.40.0 - 64.39.40.255 de -64.39.41.0 - 64.39.42.15 us -64.39.42.16 - 64.39.42.31 ae -64.39.42.32 - 64.39.42.95 us -64.39.42.96 - 64.39.42.111 il -64.39.42.112 - 64.39.42.191 us -64.39.42.192 - 64.39.42.207 de -64.39.42.208 - 64.39.43.255 us -64.39.44.0 - 64.39.44.15 ie -64.39.44.16 - 64.39.44.127 us -64.39.44.128 - 64.39.44.143 ie -64.39.44.144 - 64.39.44.159 us -64.39.44.160 - 64.39.44.191 de -64.39.44.192 - 64.39.47.207 us -64.39.47.208 - 64.39.47.223 de -64.39.47.224 - 64.39.47.255 us +64.39.41.0 - 64.39.47.255 us 64.39.48.0 - 64.39.48.255 de -64.39.49.0 - 64.39.49.31 ae -64.39.49.32 - 64.39.49.95 us -64.39.49.96 - 64.39.49.111 ie -64.39.49.112 - 64.39.49.127 us -64.39.49.128 - 64.39.49.159 ae -64.39.49.160 - 64.39.49.191 au -64.39.49.192 - 64.39.49.255 il -64.39.50.0 - 64.39.159.255 us +64.39.49.0 - 64.39.159.255 us 64.39.160.0 - 64.39.191.255 ca 64.39.192.0 - 64.40.95.255 us 64.40.96.0 - 64.40.118.255 ca 64.40.119.0 - 64.40.120.255 us 64.40.121.0 - 64.40.127.255 ca 64.40.128.0 - 64.40.159.255 us -64.40.160.0 - 64.40.166.255 a2 -64.40.167.0 - 64.40.167.255 us -64.40.168.0 - 64.40.174.255 a2 +64.40.160.0 - 64.40.172.255 a2 +64.40.173.0 - 64.40.173.255 us +64.40.174.0 - 64.40.174.255 a2 64.40.175.0 - 64.40.175.255 us 64.40.176.0 - 64.40.191.255 ca -64.40.192.0 - 64.40.239.255 us +64.40.192.0 - 64.40.229.255 us +64.40.230.0 - 64.40.230.48 gb +64.40.230.49 - 64.40.230.49 eu +64.40.230.50 - 64.40.230.255 gb +64.40.231.0 - 64.40.239.255 us 64.40.240.0 - 64.40.255.255 ca -64.41.0.0 - 64.41.251.255 us -64.41.252.0 - 64.41.252.63 in -64.41.252.64 - 64.42.191.255 us +64.41.0.0 - 64.42.191.255 us 64.42.192.0 - 64.42.255.255 ca -64.43.0.0 - 64.44.13.255 us -64.44.14.0 - 64.44.14.255 vi -64.44.15.0 - 64.45.22.79 us -64.45.22.80 - 64.45.22.87 ca -64.45.22.88 - 64.45.25.159 us -64.45.25.160 - 64.45.25.175 nz -64.45.25.176 - 64.45.25.223 us -64.45.25.224 - 64.45.25.239 pe -64.45.25.240 - 64.45.29.197 us -64.45.29.198 - 64.45.29.212 au -64.45.29.213 - 64.45.52.120 us -64.45.52.121 - 64.45.52.149 co -64.45.52.150 - 64.45.53.231 us -64.45.53.232 - 64.45.53.239 gb -64.45.53.240 - 64.45.55.167 us -64.45.55.168 - 64.45.55.175 ae -64.45.55.176 - 64.45.55.191 us -64.45.55.192 - 64.45.55.223 ca -64.45.55.224 - 64.45.57.183 us -64.45.57.184 - 64.45.57.193 au -64.45.57.194 - 64.45.63.15 us -64.45.63.16 - 64.45.63.31 at -64.45.63.32 - 64.45.63.47 gb -64.45.63.48 - 64.45.63.239 us -64.45.63.240 - 64.45.63.247 ar -64.45.63.248 - 64.45.255.255 us -64.46.0.0 - 64.46.31.255 ca -64.46.32.0 - 64.46.33.255 a1 -64.46.34.0 - 64.46.34.255 ca -64.46.35.0 - 64.46.35.255 a1 -64.46.36.0 - 64.46.41.255 ca -64.46.42.0 - 64.46.43.255 a1 -64.46.44.0 - 64.46.46.255 ca -64.46.47.0 - 64.46.47.255 a1 -64.46.48.0 - 64.46.63.255 ca +64.43.0.0 - 64.43.255.255 us +64.45.0.0 - 64.45.255.255 us +64.46.0.0 - 64.46.63.255 ca 64.46.64.0 - 64.47.111.255 us 64.47.112.0 - 64.47.112.255 ca -64.47.113.0 - 64.49.127.255 us -64.49.128.0 - 64.49.191.255 a2 -64.49.192.0 - 64.49.192.15 us -64.49.192.16 - 64.49.192.31 gb -64.49.192.32 - 64.49.192.103 us -64.49.192.104 - 64.49.192.111 ve -64.49.192.112 - 64.49.192.119 us -64.49.192.120 - 64.49.192.127 ag -64.49.192.128 - 64.49.192.159 us -64.49.192.160 - 64.49.192.167 ca -64.49.192.168 - 64.49.192.255 us -64.49.193.0 - 64.49.193.7 ca -64.49.193.8 - 64.49.193.47 us -64.49.193.48 - 64.49.193.55 cy -64.49.193.56 - 64.49.193.63 ca -64.49.193.64 - 64.49.193.79 us -64.49.193.80 - 64.49.193.87 ca -64.49.193.88 - 64.49.193.95 au -64.49.193.96 - 64.49.193.103 us -64.49.193.104 - 64.49.193.111 bh -64.49.193.112 - 64.49.194.71 us -64.49.194.72 - 64.49.194.79 in -64.49.194.80 - 64.49.194.95 fr -64.49.194.96 - 64.49.194.103 nz -64.49.194.104 - 64.49.194.111 au -64.49.194.112 - 64.49.194.159 us -64.49.194.160 - 64.49.194.175 mx -64.49.194.176 - 64.49.194.183 in -64.49.194.184 - 64.49.194.191 ca -64.49.194.192 - 64.49.194.239 us -64.49.194.240 - 64.49.194.247 bh -64.49.194.248 - 64.49.195.15 us -64.49.195.16 - 64.49.195.31 ru -64.49.195.32 - 64.49.195.39 au -64.49.195.40 - 64.49.195.71 us -64.49.195.72 - 64.49.195.79 in -64.49.195.80 - 64.49.195.111 us -64.49.195.112 - 64.49.195.119 gb -64.49.195.120 - 64.49.195.191 us -64.49.195.192 - 64.49.195.223 in -64.49.195.224 - 64.49.196.167 us -64.49.196.168 - 64.49.196.175 ie -64.49.196.176 - 64.49.196.247 us -64.49.196.248 - 64.49.196.255 ca -64.49.197.0 - 64.49.197.167 us -64.49.197.168 - 64.49.197.175 ph -64.49.197.176 - 64.49.197.191 us -64.49.197.192 - 64.49.197.207 au -64.49.197.208 - 64.49.197.215 de -64.49.197.216 - 64.49.198.7 us -64.49.198.8 - 64.49.198.15 ca -64.49.198.16 - 64.49.198.31 us -64.49.198.32 - 64.49.198.39 au -64.49.198.40 - 64.49.198.119 us -64.49.198.120 - 64.49.198.127 in -64.49.198.128 - 64.49.198.143 us -64.49.198.144 - 64.49.198.151 jp -64.49.198.152 - 64.49.198.183 us -64.49.198.184 - 64.49.198.191 bh -64.49.198.192 - 64.49.198.215 us -64.49.198.216 - 64.49.198.223 at -64.49.198.224 - 64.49.199.87 us -64.49.199.88 - 64.49.199.95 gb -64.49.199.96 - 64.49.199.111 us -64.49.199.112 - 64.49.199.127 fr -64.49.199.128 - 64.49.199.167 us -64.49.199.168 - 64.49.199.175 nz -64.49.199.176 - 64.49.199.207 us -64.49.199.208 - 64.49.199.215 gb -64.49.199.216 - 64.49.199.223 us -64.49.199.224 - 64.49.199.231 au -64.49.199.232 - 64.49.200.15 us -64.49.200.16 - 64.49.200.31 fr -64.49.200.32 - 64.49.200.39 au -64.49.200.40 - 64.49.200.47 gb -64.49.200.48 - 64.49.200.55 tr -64.49.200.56 - 64.49.200.63 at -64.49.200.64 - 64.49.200.79 us -64.49.200.80 - 64.49.200.87 za -64.49.200.88 - 64.49.200.143 us -64.49.200.144 - 64.49.200.151 ca -64.49.200.152 - 64.49.200.223 us -64.49.200.224 - 64.49.200.239 fr -64.49.200.240 - 64.49.200.255 us -64.49.201.0 - 64.49.201.15 ca -64.49.201.16 - 64.49.201.39 us -64.49.201.40 - 64.49.201.47 ca -64.49.201.48 - 64.49.201.143 us -64.49.201.144 - 64.49.201.151 gb -64.49.201.152 - 64.49.201.159 ae -64.49.201.160 - 64.49.201.191 fr -64.49.201.192 - 64.49.201.199 us -64.49.201.200 - 64.49.201.207 ca -64.49.201.208 - 64.49.201.215 be -64.49.201.216 - 64.49.201.223 nz -64.49.201.224 - 64.49.201.239 us -64.49.201.240 - 64.49.201.247 ca -64.49.201.248 - 64.49.201.255 gb -64.49.202.0 - 64.49.202.15 ca -64.49.202.16 - 64.49.202.47 us -64.49.202.48 - 64.49.202.63 ca -64.49.202.64 - 64.49.202.71 us -64.49.202.72 - 64.49.202.79 gb -64.49.202.80 - 64.49.203.63 us -64.49.203.64 - 64.49.203.95 au -64.49.203.96 - 64.49.203.239 us -64.49.203.240 - 64.49.203.247 cn -64.49.203.248 - 64.49.204.175 us -64.49.204.176 - 64.49.204.191 ca -64.49.204.192 - 64.49.204.223 us -64.49.204.224 - 64.49.204.231 au -64.49.204.232 - 64.49.204.239 us -64.49.204.240 - 64.49.204.247 ca -64.49.204.248 - 64.49.205.63 us -64.49.205.64 - 64.49.205.127 au -64.49.205.128 - 64.49.205.255 us -64.49.206.0 - 64.49.206.15 au -64.49.206.16 - 64.49.206.71 us -64.49.206.72 - 64.49.206.79 ru -64.49.206.80 - 64.49.206.87 ve -64.49.206.88 - 64.49.206.119 us -64.49.206.120 - 64.49.206.127 tr -64.49.206.128 - 64.49.206.199 us -64.49.206.200 - 64.49.206.207 in -64.49.206.208 - 64.49.206.215 us -64.49.206.216 - 64.49.206.223 nz -64.49.206.224 - 64.49.206.247 us -64.49.206.248 - 64.49.206.255 in -64.49.207.0 - 64.49.207.79 us -64.49.207.80 - 64.49.207.87 ae -64.49.207.88 - 64.49.208.71 us -64.49.208.72 - 64.49.208.79 ca -64.49.208.80 - 64.49.208.127 us -64.49.208.128 - 64.49.208.135 au -64.49.208.136 - 64.49.209.31 us -64.49.209.32 - 64.49.209.39 gb -64.49.209.40 - 64.49.209.47 es -64.49.209.48 - 64.49.209.55 ie -64.49.209.56 - 64.49.209.127 us -64.49.209.128 - 64.49.209.143 au -64.49.209.144 - 64.49.209.151 us -64.49.209.152 - 64.49.209.159 il -64.49.209.160 - 64.49.209.255 us -64.49.210.0 - 64.49.210.15 ca -64.49.210.16 - 64.49.210.31 cr -64.49.210.32 - 64.49.210.39 us -64.49.210.40 - 64.49.210.47 in -64.49.210.48 - 64.49.210.63 us -64.49.210.64 - 64.49.210.79 gb -64.49.210.80 - 64.49.210.87 ca -64.49.210.88 - 64.49.210.95 ar -64.49.210.96 - 64.49.210.111 us -64.49.210.112 - 64.49.210.119 mx -64.49.210.120 - 64.49.210.143 us -64.49.210.144 - 64.49.210.151 ca -64.49.210.152 - 64.49.210.159 hk -64.49.210.160 - 64.49.210.215 ca -64.49.210.216 - 64.49.210.223 us -64.49.210.224 - 64.49.210.239 ca -64.49.210.240 - 64.49.210.255 us -64.49.211.0 - 64.49.211.7 nl -64.49.211.8 - 64.49.211.15 ca -64.49.211.16 - 64.49.211.63 us -64.49.211.64 - 64.49.211.87 ca -64.49.211.88 - 64.49.211.95 kr -64.49.211.96 - 64.49.211.111 gb -64.49.211.112 - 64.49.211.143 us -64.49.211.144 - 64.49.211.151 bz -64.49.211.152 - 64.49.211.183 us -64.49.211.184 - 64.49.211.191 ca -64.49.211.192 - 64.49.211.199 au -64.49.211.200 - 64.49.211.207 in -64.49.211.208 - 64.49.214.63 us -64.49.214.64 - 64.49.214.71 au -64.49.214.72 - 64.49.214.95 us -64.49.214.96 - 64.49.214.111 nl -64.49.214.112 - 64.49.214.175 us -64.49.214.176 - 64.49.214.191 fr -64.49.214.192 - 64.49.214.255 us -64.49.215.0 - 64.49.215.95 ca -64.49.215.96 - 64.49.215.111 us -64.49.215.112 - 64.49.215.143 ca -64.49.215.144 - 64.49.215.167 us -64.49.215.168 - 64.49.215.207 ca -64.49.215.208 - 64.49.215.215 us -64.49.215.216 - 64.49.215.255 ca -64.49.216.0 - 64.49.217.95 us -64.49.217.96 - 64.49.217.111 bm -64.49.217.112 - 64.49.217.239 us -64.49.217.240 - 64.49.217.255 gb -64.49.218.0 - 64.49.223.255 us -64.49.224.0 - 64.49.224.7 hk -64.49.224.8 - 64.49.224.135 us -64.49.224.136 - 64.49.224.143 ca -64.49.224.144 - 64.49.227.47 us -64.49.227.48 - 64.49.227.55 ca -64.49.227.56 - 64.49.227.63 us -64.49.227.64 - 64.49.227.71 ar -64.49.227.72 - 64.49.227.87 us -64.49.227.88 - 64.49.227.95 au -64.49.227.96 - 64.49.227.111 us -64.49.227.112 - 64.49.227.119 in -64.49.227.120 - 64.49.227.127 tr -64.49.227.128 - 64.49.228.143 us -64.49.228.144 - 64.49.228.151 eg -64.49.228.152 - 64.49.228.159 nz -64.49.228.160 - 64.49.229.55 us -64.49.229.56 - 64.49.229.63 mx -64.49.229.64 - 64.49.229.95 us -64.49.229.96 - 64.49.229.111 gr -64.49.229.112 - 64.49.229.119 at -64.49.229.120 - 64.49.230.63 us -64.49.230.64 - 64.49.230.71 co -64.49.230.72 - 64.49.230.95 us -64.49.230.96 - 64.49.230.111 au -64.49.230.112 - 64.49.230.143 us -64.49.230.144 - 64.49.230.159 gb -64.49.230.160 - 64.49.230.175 us -64.49.230.176 - 64.49.230.191 eg -64.49.230.192 - 64.49.230.199 gb -64.49.230.200 - 64.49.231.71 us -64.49.231.72 - 64.49.231.79 hk -64.49.231.80 - 64.49.231.87 in -64.49.231.88 - 64.49.231.159 us -64.49.231.160 - 64.49.231.191 pa -64.49.231.192 - 64.49.231.231 us -64.49.231.232 - 64.49.231.239 in -64.49.231.240 - 64.49.232.15 us -64.49.232.16 - 64.49.232.31 it -64.49.232.32 - 64.49.232.79 us -64.49.232.80 - 64.49.232.87 ca -64.49.232.88 - 64.49.232.95 us -64.49.232.96 - 64.49.232.103 es -64.49.232.104 - 64.49.234.255 us -64.49.235.0 - 64.49.235.7 hk -64.49.235.8 - 64.49.235.15 us -64.49.235.16 - 64.49.235.31 mx -64.49.235.32 - 64.49.235.95 us -64.49.235.96 - 64.49.235.103 au -64.49.235.104 - 64.49.235.111 us -64.49.235.112 - 64.49.235.127 nl -64.49.235.128 - 64.49.235.143 us -64.49.235.144 - 64.49.235.151 hk -64.49.235.152 - 64.49.235.159 us -64.49.235.160 - 64.49.235.167 nz -64.49.235.168 - 64.49.235.183 us -64.49.235.184 - 64.49.235.191 nz -64.49.235.192 - 64.49.236.7 us -64.49.236.8 - 64.49.236.15 nz -64.49.236.16 - 64.49.236.47 us -64.49.236.48 - 64.49.236.55 in -64.49.236.56 - 64.49.236.63 ru -64.49.236.64 - 64.49.236.143 us -64.49.236.144 - 64.49.236.159 dk -64.49.236.160 - 64.49.236.167 us -64.49.236.168 - 64.49.236.175 ca -64.49.236.176 - 64.49.236.191 us -64.49.236.192 - 64.49.236.199 ca -64.49.236.200 - 64.49.236.231 us -64.49.236.232 - 64.49.236.239 cr -64.49.236.240 - 64.49.236.255 in -64.49.237.0 - 64.49.238.95 us -64.49.238.96 - 64.49.238.111 mx -64.49.238.112 - 64.49.238.135 us -64.49.238.136 - 64.49.238.143 au -64.49.238.144 - 64.49.238.151 us -64.49.238.152 - 64.49.238.159 in -64.49.238.160 - 64.49.239.31 us -64.49.239.32 - 64.49.239.39 by -64.49.239.40 - 64.49.239.135 us -64.49.239.136 - 64.49.239.143 gb -64.49.239.144 - 64.49.239.255 us -64.49.240.0 - 64.49.240.7 ca -64.49.240.8 - 64.49.240.39 us -64.49.240.40 - 64.49.240.47 fr -64.49.240.48 - 64.49.240.79 us -64.49.240.80 - 64.49.240.95 by -64.49.240.96 - 64.49.240.103 us -64.49.240.104 - 64.49.240.111 in -64.49.240.112 - 64.49.240.119 us -64.49.240.120 - 64.49.240.175 hk -64.49.240.176 - 64.49.240.183 za -64.49.240.184 - 64.49.240.215 us -64.49.240.216 - 64.49.240.239 ae -64.49.240.240 - 64.49.243.255 us -64.49.244.0 - 64.49.244.7 gb -64.49.244.8 - 64.49.244.71 us -64.49.244.72 - 64.49.244.79 in -64.49.244.80 - 64.49.244.95 us -64.49.244.96 - 64.49.244.127 pk -64.49.244.128 - 64.49.244.135 us -64.49.244.136 - 64.49.244.143 gb -64.49.244.144 - 64.49.244.207 us -64.49.244.208 - 64.49.244.223 ru -64.49.244.224 - 64.49.245.23 us -64.49.245.24 - 64.49.245.39 za -64.49.245.40 - 64.49.245.63 us -64.49.245.64 - 64.49.245.71 ca -64.49.245.72 - 64.49.245.111 us -64.49.245.112 - 64.49.245.127 gb -64.49.245.128 - 64.49.250.239 us -64.49.250.240 - 64.49.250.247 in -64.49.250.248 - 64.49.250.255 us -64.49.251.0 - 64.49.251.7 za -64.49.251.8 - 64.49.251.15 gb -64.49.251.16 - 64.49.251.95 us -64.49.251.96 - 64.49.251.111 fr -64.49.251.112 - 64.49.252.31 us -64.49.252.32 - 64.49.252.47 vg -64.49.252.48 - 64.49.253.167 us -64.49.253.168 - 64.49.253.175 gb -64.49.253.176 - 64.49.253.223 us -64.49.253.224 - 64.49.253.255 bd -64.49.254.0 - 64.50.143.255 us +64.47.113.0 - 64.47.227.255 us +64.47.228.0 - 64.47.228.255 ch +64.47.229.0 - 64.47.229.255 gb +64.47.230.0 - 64.50.143.255 us 64.50.144.0 - 64.50.159.255 ca -64.50.160.0 - 64.55.143.255 us -64.55.144.0 - 64.55.147.255 a1 -64.55.148.0 - 64.56.127.255 us +64.50.160.0 - 64.56.127.255 us 64.56.128.0 - 64.56.159.255 ca 64.56.160.0 - 64.56.191.255 jp 64.56.192.0 - 64.56.223.255 us 64.56.224.0 - 64.56.255.255 ca 64.57.0.0 - 64.57.111.255 us 64.57.112.0 - 64.57.127.255 ls -64.57.128.0 - 64.58.71.239 us -64.58.71.240 - 64.58.71.255 ar -64.58.72.0 - 64.58.88.63 us -64.58.88.64 - 64.58.88.127 ar -64.58.88.128 - 64.58.95.255 us -64.58.96.0 - 64.58.111.255 a2 -64.58.112.0 - 64.59.69.127 us -64.59.69.128 - 64.59.69.159 ws -64.59.69.160 - 64.59.73.31 us -64.59.73.32 - 64.59.73.63 ec -64.59.73.64 - 64.59.80.143 us -64.59.80.144 - 64.59.80.159 cr -64.59.80.160 - 64.59.80.223 us -64.59.80.224 - 64.59.80.255 ca -64.59.81.0 - 64.59.82.95 us -64.59.82.96 - 64.59.82.127 ca -64.59.82.128 - 64.59.83.207 us -64.59.83.208 - 64.59.83.223 an -64.59.83.224 - 64.59.88.191 us -64.59.88.192 - 64.59.88.255 nl -64.59.89.0 - 64.59.92.159 us -64.59.92.160 - 64.59.92.191 gb -64.59.92.192 - 64.59.99.31 us -64.59.99.32 - 64.59.99.63 an -64.59.99.64 - 64.59.126.95 us -64.59.126.96 - 64.59.126.127 ec -64.59.126.128 - 64.59.127.255 us +64.57.128.0 - 64.57.135.255 us +64.57.136.0 - 64.57.143.255 se +64.57.144.0 - 64.59.127.255 us 64.59.128.0 - 64.59.191.255 ca -64.59.192.0 - 64.62.132.255 us -64.62.133.0 - 64.62.133.15 es -64.62.133.16 - 64.62.134.183 us -64.62.134.184 - 64.62.134.191 es -64.62.134.192 - 64.62.137.255 us -64.62.138.0 - 64.62.138.127 a1 -64.62.138.128 - 64.62.140.255 us +64.59.192.0 - 64.62.140.255 us 64.62.141.0 - 64.62.141.255 gb -64.62.142.0 - 64.62.143.7 us -64.62.143.8 - 64.62.143.15 es -64.62.143.16 - 64.62.151.7 us -64.62.151.8 - 64.62.151.15 cn -64.62.151.16 - 64.62.153.159 us -64.62.153.160 - 64.62.153.167 a1 -64.62.153.168 - 64.62.160.255 us -64.62.161.0 - 64.62.161.255 jp -64.62.162.0 - 64.62.169.255 us +64.62.142.0 - 64.62.169.255 us 64.62.170.0 - 64.62.170.255 gr -64.62.171.0 - 64.62.180.239 us -64.62.180.240 - 64.62.180.247 fr -64.62.180.248 - 64.62.181.79 us -64.62.181.80 - 64.62.181.95 hk -64.62.181.96 - 64.62.185.255 us -64.62.186.0 - 64.62.186.255 ca -64.62.187.0 - 64.62.199.15 us -64.62.199.16 - 64.62.199.31 it -64.62.199.32 - 64.62.199.127 us -64.62.199.128 - 64.62.199.191 au -64.62.199.192 - 64.62.199.223 it -64.62.199.224 - 64.62.203.255 us -64.62.204.0 - 64.62.204.255 ca -64.62.205.0 - 64.62.205.31 us -64.62.205.32 - 64.62.205.39 it -64.62.205.40 - 64.62.206.223 us -64.62.206.224 - 64.62.206.255 cn -64.62.207.0 - 64.62.210.95 us -64.62.210.96 - 64.62.210.127 lv -64.62.210.128 - 64.62.210.159 za -64.62.210.160 - 64.62.214.95 us -64.62.214.96 - 64.62.214.111 it -64.62.214.112 - 64.62.214.127 us -64.62.214.128 - 64.62.214.255 it -64.62.215.0 - 64.62.218.255 us -64.62.219.0 - 64.62.219.255 it -64.62.220.0 - 64.62.227.39 us -64.62.227.40 - 64.62.227.47 ng -64.62.227.48 - 64.62.232.255 us -64.62.233.0 - 64.62.233.15 it -64.62.233.16 - 64.62.237.255 us +64.62.171.0 - 64.62.203.255 us +64.62.204.0 - 64.62.204.255 fr +64.62.205.0 - 64.62.237.255 us 64.62.238.0 - 64.62.238.255 ca -64.62.239.0 - 64.62.244.135 us -64.62.244.136 - 64.62.244.143 ck -64.62.244.144 - 64.62.244.255 us -64.62.245.0 - 64.62.246.127 it -64.62.246.128 - 64.62.249.31 us -64.62.249.32 - 64.62.249.47 ae -64.62.249.48 - 64.62.252.95 us -64.62.252.96 - 64.62.252.103 lv -64.62.252.104 - 64.62.252.191 us -64.62.252.192 - 64.62.252.255 gr -64.62.253.0 - 64.62.254.255 us -64.62.255.0 - 64.62.255.255 cn -64.63.0.0 - 64.64.0.9 us -64.64.0.10 - 64.64.0.13 cn -64.64.0.14 - 64.64.0.21 us -64.64.0.22 - 64.64.0.22 nl -64.64.0.23 - 64.64.0.23 gb -64.64.0.24 - 64.64.0.41 us -64.64.0.42 - 64.64.0.45 ca -64.64.0.46 - 64.64.0.49 gb -64.64.0.50 - 64.64.0.61 us -64.64.0.62 - 64.64.0.65 ca -64.64.0.66 - 64.64.0.73 us -64.64.0.74 - 64.64.0.77 gb -64.64.0.78 - 64.64.0.81 us -64.64.0.82 - 64.64.0.85 gr -64.64.0.86 - 64.64.0.97 us -64.64.0.98 - 64.64.0.101 in -64.64.0.102 - 64.64.0.105 us -64.64.0.106 - 64.64.0.109 es -64.64.0.110 - 64.64.0.129 us -64.64.0.130 - 64.64.0.133 au -64.64.0.134 - 64.64.0.137 in -64.64.0.138 - 64.64.0.145 us -64.64.0.146 - 64.64.0.149 es -64.64.0.150 - 64.64.0.167 us -64.64.0.168 - 64.64.0.168 ca -64.64.0.169 - 64.64.0.169 us -64.64.0.170 - 64.64.0.173 ng -64.64.0.174 - 64.64.0.177 us -64.64.0.178 - 64.64.0.181 za -64.64.0.182 - 64.64.0.185 us -64.64.0.186 - 64.64.0.189 br -64.64.0.190 - 64.64.0.193 us -64.64.0.194 - 64.64.0.197 gb -64.64.0.198 - 64.64.0.201 mx -64.64.0.202 - 64.64.0.217 us -64.64.0.218 - 64.64.0.221 do -64.64.0.222 - 64.64.0.223 in -64.64.0.224 - 64.64.0.237 us -64.64.0.238 - 64.64.0.241 no -64.64.0.242 - 64.64.0.245 gb -64.64.0.246 - 64.64.0.249 us -64.64.0.250 - 64.64.0.253 ie -64.64.0.254 - 64.64.1.17 us -64.64.1.18 - 64.64.1.25 gb -64.64.1.26 - 64.64.1.29 co -64.64.1.30 - 64.64.1.33 au -64.64.1.34 - 64.64.1.37 us -64.64.1.38 - 64.64.1.38 ca -64.64.1.39 - 64.64.1.42 us -64.64.1.43 - 64.64.1.45 th -64.64.1.46 - 64.64.1.49 us -64.64.1.50 - 64.64.1.53 cz -64.64.1.54 - 64.64.1.57 no -64.64.1.58 - 64.64.1.61 us -64.64.1.62 - 64.64.1.65 tw -64.64.1.66 - 64.64.1.69 us -64.64.1.70 - 64.64.1.73 pt -64.64.1.74 - 64.64.1.77 us -64.64.1.78 - 64.64.1.79 gb -64.64.1.80 - 64.64.1.81 us -64.64.1.82 - 64.64.1.85 in -64.64.1.86 - 64.64.1.89 us -64.64.1.90 - 64.64.1.90 ca -64.64.1.91 - 64.64.1.91 us -64.64.1.92 - 64.64.1.93 gb -64.64.1.94 - 64.64.1.101 us -64.64.1.102 - 64.64.1.105 tr -64.64.1.106 - 64.64.1.109 fr -64.64.1.110 - 64.64.1.117 us -64.64.1.118 - 64.64.1.121 ar -64.64.1.122 - 64.64.1.129 us -64.64.1.130 - 64.64.1.133 br -64.64.1.134 - 64.64.1.137 us -64.64.1.138 - 64.64.1.141 in -64.64.1.142 - 64.64.1.145 us -64.64.1.146 - 64.64.1.149 ph -64.64.1.150 - 64.64.1.161 us -64.64.1.162 - 64.64.1.165 my -64.64.1.166 - 64.64.1.189 us -64.64.1.190 - 64.64.1.193 ar -64.64.1.194 - 64.64.1.201 us -64.64.1.202 - 64.64.1.205 gb -64.64.1.206 - 64.64.1.209 ph -64.64.1.210 - 64.64.1.213 gr -64.64.1.214 - 64.64.1.217 ca -64.64.1.218 - 64.64.1.221 th -64.64.1.222 - 64.64.1.225 jo -64.64.1.226 - 64.64.1.229 us -64.64.1.230 - 64.64.1.233 uy -64.64.1.234 - 64.64.1.237 us -64.64.1.238 - 64.64.1.238 au -64.64.1.239 - 64.64.1.246 us -64.64.1.247 - 64.64.1.250 pe -64.64.1.251 - 64.64.1.254 ca -64.64.1.255 - 64.64.2.5 us -64.64.2.6 - 64.64.2.9 hk -64.64.2.10 - 64.64.2.13 ca -64.64.2.14 - 64.64.2.27 us -64.64.2.28 - 64.64.2.31 ca -64.64.2.32 - 64.64.2.43 us -64.64.2.44 - 64.64.2.44 hu -64.64.2.45 - 64.64.2.51 us -64.64.2.52 - 64.64.2.55 it -64.64.2.56 - 64.64.2.59 om -64.64.2.60 - 64.64.2.63 th -64.64.2.64 - 64.64.2.67 rs -64.64.2.68 - 64.64.2.102 us -64.64.2.103 - 64.64.2.103 be -64.64.2.104 - 64.64.2.119 us -64.64.2.120 - 64.64.2.123 gb -64.64.2.124 - 64.64.2.127 ua -64.64.2.128 - 64.64.2.131 us -64.64.2.132 - 64.64.2.135 it -64.64.2.136 - 64.64.2.149 us -64.64.2.150 - 64.64.2.153 ng -64.64.2.154 - 64.64.2.157 au -64.64.2.158 - 64.64.2.161 si -64.64.2.162 - 64.64.2.165 it -64.64.2.166 - 64.64.2.178 us -64.64.2.179 - 64.64.2.182 rs -64.64.2.183 - 64.64.2.186 th -64.64.2.187 - 64.64.2.194 us -64.64.2.195 - 64.64.2.198 ve -64.64.2.199 - 64.64.2.206 us -64.64.2.207 - 64.64.2.210 pk -64.64.2.211 - 64.64.2.214 gb -64.64.2.215 - 64.64.2.219 in -64.64.2.220 - 64.64.2.231 us -64.64.2.232 - 64.64.2.235 lv -64.64.2.236 - 64.64.2.239 ca -64.64.2.240 - 64.64.2.243 it -64.64.2.244 - 64.64.2.247 co -64.64.2.248 - 64.64.2.251 us -64.64.2.252 - 64.64.2.252 om -64.64.2.253 - 64.64.3.17 us -64.64.3.18 - 64.64.3.21 es -64.64.3.22 - 64.64.3.25 id -64.64.3.26 - 64.64.3.49 us -64.64.3.50 - 64.64.3.53 gb -64.64.3.54 - 64.64.3.61 us -64.64.3.62 - 64.64.3.65 ma -64.64.3.66 - 64.64.3.69 tr -64.64.3.70 - 64.64.3.73 se -64.64.3.74 - 64.64.3.85 us -64.64.3.86 - 64.64.3.89 ar -64.64.3.90 - 64.64.3.93 es -64.64.3.94 - 64.64.3.109 us -64.64.3.110 - 64.64.3.111 ca -64.64.3.112 - 64.64.3.119 us -64.64.3.120 - 64.64.3.123 ca -64.64.3.124 - 64.64.3.127 gb -64.64.3.128 - 64.64.3.131 de -64.64.3.132 - 64.64.3.151 us -64.64.3.152 - 64.64.3.155 bz -64.64.3.156 - 64.64.3.171 us -64.64.3.172 - 64.64.3.175 gb -64.64.3.176 - 64.64.3.183 us -64.64.3.184 - 64.64.3.187 se -64.64.3.188 - 64.64.3.191 us -64.64.3.192 - 64.64.3.192 be -64.64.3.193 - 64.64.3.193 ca -64.64.3.194 - 64.64.3.197 it -64.64.3.198 - 64.64.3.209 us -64.64.3.210 - 64.64.3.213 ca -64.64.3.214 - 64.64.3.233 us -64.64.3.234 - 64.64.3.237 ca -64.64.3.238 - 64.64.3.241 ng -64.64.3.242 - 64.64.3.249 us -64.64.3.250 - 64.64.3.253 ca -64.64.3.254 - 64.64.4.5 us -64.64.4.6 - 64.64.4.9 tr -64.64.4.10 - 64.64.4.13 ni -64.64.4.14 - 64.64.4.28 us -64.64.4.29 - 64.64.4.32 sa -64.64.4.33 - 64.64.4.44 us -64.64.4.45 - 64.64.4.48 lk -64.64.4.49 - 64.64.4.52 gb -64.64.4.53 - 64.64.4.56 at -64.64.4.57 - 64.64.4.60 us -64.64.4.61 - 64.64.4.62 ca -64.64.4.63 - 64.64.4.70 us -64.64.4.71 - 64.64.4.74 ca -64.64.4.75 - 64.64.4.78 jm -64.64.4.79 - 64.64.4.83 us -64.64.4.84 - 64.64.4.87 jo -64.64.4.88 - 64.64.4.108 us -64.64.4.109 - 64.64.4.117 ee -64.64.4.118 - 64.64.4.121 lv -64.64.4.122 - 64.64.4.137 us -64.64.4.138 - 64.64.4.141 gf -64.64.4.142 - 64.64.4.145 us -64.64.4.146 - 64.64.4.149 gb -64.64.4.150 - 64.64.4.153 us -64.64.4.154 - 64.64.4.157 es -64.64.4.158 - 64.64.4.183 us -64.64.4.184 - 64.64.4.197 gb -64.64.4.198 - 64.64.4.201 ca -64.64.4.202 - 64.64.4.205 us -64.64.4.206 - 64.64.4.209 ca -64.64.4.210 - 64.64.4.213 us -64.64.4.214 - 64.64.4.217 ar -64.64.4.218 - 64.64.4.242 ca -64.64.4.243 - 64.64.4.246 cn -64.64.4.247 - 64.64.4.250 mx -64.64.4.251 - 64.64.5.9 us -64.64.5.10 - 64.64.5.13 in -64.64.5.14 - 64.64.5.21 us -64.64.5.22 - 64.64.5.25 th -64.64.5.26 - 64.64.5.29 gb -64.64.5.30 - 64.64.5.33 ca -64.64.5.34 - 64.64.5.37 us -64.64.5.38 - 64.64.5.39 es -64.64.5.40 - 64.64.5.41 us -64.64.5.42 - 64.64.5.45 gr -64.64.5.46 - 64.64.5.49 sa -64.64.5.50 - 64.64.5.53 gb -64.64.5.54 - 64.64.5.66 us -64.64.5.67 - 64.64.5.70 dk -64.64.5.71 - 64.64.5.74 mx -64.64.5.75 - 64.64.5.76 gb -64.64.5.77 - 64.64.5.77 lk -64.64.5.78 - 64.64.5.94 us -64.64.5.95 - 64.64.5.98 gb -64.64.5.99 - 64.64.5.102 ch -64.64.5.103 - 64.64.5.106 cr -64.64.5.107 - 64.64.5.123 us -64.64.5.124 - 64.64.5.127 in -64.64.5.128 - 64.64.5.131 es -64.64.5.132 - 64.64.5.139 at -64.64.5.140 - 64.64.5.163 us -64.64.5.164 - 64.64.5.167 cy -64.64.5.168 - 64.64.5.169 gb -64.64.5.170 - 64.64.5.189 us -64.64.5.190 - 64.64.5.193 in -64.64.5.194 - 64.64.5.201 us -64.64.5.202 - 64.64.5.205 nz -64.64.5.206 - 64.64.5.209 us -64.64.5.210 - 64.64.5.213 in -64.64.5.214 - 64.64.5.217 gb -64.64.5.218 - 64.64.5.221 it -64.64.5.222 - 64.64.6.14 us -64.64.6.15 - 64.64.6.18 za -64.64.6.19 - 64.64.6.22 us -64.64.6.23 - 64.64.6.26 in -64.64.6.27 - 64.64.6.38 us -64.64.6.39 - 64.64.6.42 pk -64.64.6.43 - 64.64.6.46 rs -64.64.6.47 - 64.64.6.50 an -64.64.6.51 - 64.64.6.54 us -64.64.6.55 - 64.64.6.58 in -64.64.6.59 - 64.64.6.62 au -64.64.6.63 - 64.64.6.66 sg -64.64.6.67 - 64.64.6.70 us -64.64.6.71 - 64.64.6.74 ba -64.64.6.75 - 64.64.6.78 il -64.64.6.79 - 64.64.6.86 us -64.64.6.87 - 64.64.6.90 au -64.64.6.91 - 64.64.6.94 us -64.64.6.95 - 64.64.6.98 nl -64.64.6.99 - 64.64.6.102 us -64.64.6.103 - 64.64.6.106 ru -64.64.6.107 - 64.64.6.118 us -64.64.6.119 - 64.64.6.122 gr -64.64.6.123 - 64.64.6.126 gb -64.64.6.127 - 64.64.6.138 us -64.64.6.139 - 64.64.6.142 be -64.64.6.143 - 64.64.6.158 us -64.64.6.159 - 64.64.6.162 gb -64.64.6.163 - 64.64.6.182 us -64.64.6.183 - 64.64.6.186 th -64.64.6.187 - 64.64.6.190 us -64.64.6.191 - 64.64.6.198 th -64.64.6.199 - 64.64.6.202 sa -64.64.6.203 - 64.64.6.206 gb -64.64.6.207 - 64.64.6.214 us -64.64.6.215 - 64.64.6.218 gb -64.64.6.219 - 64.64.6.222 us -64.64.6.223 - 64.64.6.226 gr -64.64.6.227 - 64.64.6.238 us -64.64.6.239 - 64.64.6.242 in -64.64.6.243 - 64.64.7.13 us -64.64.7.14 - 64.64.7.17 it -64.64.7.18 - 64.64.7.21 us -64.64.7.22 - 64.64.7.25 no -64.64.7.26 - 64.64.7.29 my -64.64.7.30 - 64.64.7.33 cl -64.64.7.34 - 64.64.7.43 us -64.64.7.44 - 64.64.7.47 no -64.64.7.48 - 64.64.7.55 us -64.64.7.56 - 64.64.7.59 th -64.64.7.60 - 64.64.7.63 cn -64.64.7.64 - 64.64.7.83 us -64.64.7.84 - 64.64.7.87 th -64.64.7.88 - 64.64.7.91 us -64.64.7.92 - 64.64.7.101 gb -64.64.7.102 - 64.64.7.105 us -64.64.7.106 - 64.64.7.109 fr -64.64.7.110 - 64.64.7.113 us -64.64.7.114 - 64.64.7.117 sa -64.64.7.118 - 64.64.7.121 au -64.64.7.122 - 64.64.7.125 us -64.64.7.126 - 64.64.7.129 ru -64.64.7.130 - 64.64.7.133 us -64.64.7.134 - 64.64.7.137 au -64.64.7.138 - 64.64.7.153 us -64.64.7.154 - 64.64.7.157 cn -64.64.7.158 - 64.64.7.161 us -64.64.7.162 - 64.64.7.165 in -64.64.7.166 - 64.64.7.169 us -64.64.7.170 - 64.64.7.173 ca -64.64.7.174 - 64.64.7.201 us -64.64.7.202 - 64.64.7.205 dz -64.64.7.206 - 64.64.7.209 in -64.64.7.210 - 64.64.7.213 id -64.64.7.214 - 64.64.7.217 ca -64.64.7.218 - 64.64.7.221 gb -64.64.7.222 - 64.64.7.225 ca -64.64.7.226 - 64.64.7.229 us -64.64.7.230 - 64.64.7.233 in -64.64.7.234 - 64.64.7.237 ar -64.64.7.238 - 64.64.8.9 us -64.64.8.10 - 64.64.8.13 ph -64.64.8.14 - 64.64.8.25 us -64.64.8.26 - 64.64.8.29 ca -64.64.8.30 - 64.64.8.33 ar -64.64.8.34 - 64.64.8.45 us -64.64.8.46 - 64.64.8.49 in -64.64.8.50 - 64.64.8.82 us -64.64.8.83 - 64.64.8.86 pe -64.64.8.87 - 64.64.8.90 ca -64.64.8.91 - 64.64.8.93 gb -64.64.8.94 - 64.64.8.101 us -64.64.8.102 - 64.64.8.105 gb -64.64.8.106 - 64.64.8.107 de -64.64.8.108 - 64.64.8.108 ch -64.64.8.109 - 64.64.8.112 ca -64.64.8.113 - 64.64.8.120 gb -64.64.8.121 - 64.64.8.125 us -64.64.8.126 - 64.64.8.129 gb -64.64.8.130 - 64.64.8.133 us -64.64.8.134 - 64.64.8.137 th -64.64.8.138 - 64.64.8.145 us -64.64.8.146 - 64.64.8.149 gb -64.64.8.150 - 64.64.8.153 pk -64.64.8.154 - 64.64.8.157 us -64.64.8.158 - 64.64.8.161 mx -64.64.8.162 - 64.64.8.169 us -64.64.8.170 - 64.64.8.173 sa -64.64.8.174 - 64.64.8.181 us -64.64.8.182 - 64.64.8.185 id -64.64.8.186 - 64.64.8.189 us -64.64.8.190 - 64.64.8.196 in -64.64.8.197 - 64.64.8.200 dk -64.64.8.201 - 64.64.8.204 il -64.64.8.205 - 64.64.8.208 lt -64.64.8.209 - 64.64.8.220 us -64.64.8.221 - 64.64.8.224 ca -64.64.8.225 - 64.64.8.228 us -64.64.8.229 - 64.64.8.232 it -64.64.8.233 - 64.64.8.236 us -64.64.8.237 - 64.64.8.240 pt -64.64.8.241 - 64.64.8.250 us -64.64.8.251 - 64.64.8.254 se -64.64.8.255 - 64.64.9.5 us -64.64.9.6 - 64.64.9.9 pe -64.64.9.10 - 64.64.9.13 us -64.64.9.14 - 64.64.9.14 be -64.64.9.15 - 64.64.9.58 us -64.64.9.59 - 64.64.9.62 mt -64.64.9.63 - 64.64.9.70 us -64.64.9.71 - 64.64.9.74 es -64.64.9.75 - 64.64.9.78 dk -64.64.9.79 - 64.64.9.97 us -64.64.9.98 - 64.64.9.101 nz -64.64.9.102 - 64.64.9.105 ca -64.64.9.106 - 64.64.9.109 es -64.64.9.110 - 64.64.9.113 cy -64.64.9.114 - 64.64.9.119 us -64.64.9.120 - 64.64.9.120 es -64.64.9.121 - 64.64.9.138 us -64.64.9.139 - 64.64.9.139 nl -64.64.9.140 - 64.64.9.140 us -64.64.9.141 - 64.64.9.144 co -64.64.9.145 - 64.64.9.148 us -64.64.9.149 - 64.64.9.152 ca -64.64.9.153 - 64.64.9.156 us -64.64.9.157 - 64.64.9.160 mx -64.64.9.161 - 64.64.9.164 us -64.64.9.165 - 64.64.9.168 do -64.64.9.169 - 64.64.9.198 us -64.64.9.199 - 64.64.9.212 in -64.64.9.213 - 64.64.9.216 us -64.64.9.217 - 64.64.9.220 ca -64.64.9.221 - 64.64.9.224 cn -64.64.9.225 - 64.64.9.228 ro -64.64.9.229 - 64.64.9.232 tr -64.64.9.233 - 64.64.9.236 ca -64.64.9.237 - 64.64.9.240 us -64.64.9.241 - 64.64.9.244 gb -64.64.9.245 - 64.64.9.248 in -64.64.9.249 - 64.64.10.14 us -64.64.10.15 - 64.64.10.18 id -64.64.10.19 - 64.64.10.46 gb -64.64.10.47 - 64.64.10.47 pk -64.64.10.48 - 64.64.10.51 eg -64.64.10.52 - 64.64.10.61 no -64.64.10.62 - 64.64.10.62 nl -64.64.10.63 - 64.64.10.77 us -64.64.10.78 - 64.64.10.81 cn -64.64.10.82 - 64.64.10.89 us -64.64.10.90 - 64.64.10.93 ro -64.64.10.94 - 64.64.10.97 us -64.64.10.98 - 64.64.10.101 gr -64.64.10.102 - 64.64.10.105 ca -64.64.10.106 - 64.64.10.109 ie -64.64.10.110 - 64.64.10.113 sg -64.64.10.114 - 64.64.10.117 us -64.64.10.118 - 64.64.10.121 dk -64.64.10.122 - 64.64.10.125 hk -64.64.10.126 - 64.64.10.141 us -64.64.10.142 - 64.64.10.143 es -64.64.10.144 - 64.64.10.147 ca -64.64.10.148 - 64.64.10.160 us -64.64.10.161 - 64.64.10.164 it -64.64.10.165 - 64.64.10.168 es -64.64.10.169 - 64.64.10.172 ee -64.64.10.173 - 64.64.10.179 in -64.64.10.180 - 64.64.10.183 ca -64.64.10.184 - 64.64.10.199 us -64.64.10.200 - 64.64.10.203 vi -64.64.10.204 - 64.64.10.207 sa -64.64.10.208 - 64.64.10.239 ca -64.64.10.240 - 64.64.10.243 us -64.64.10.244 - 64.64.10.247 my -64.64.10.248 - 64.64.11.5 us -64.64.11.6 - 64.64.11.25 ca -64.64.11.26 - 64.64.11.37 us -64.64.11.38 - 64.64.11.38 nl -64.64.11.39 - 64.64.11.39 us -64.64.11.40 - 64.64.11.44 ca -64.64.11.45 - 64.64.11.48 za -64.64.11.49 - 64.64.11.61 us -64.64.11.62 - 64.64.11.65 be -64.64.11.66 - 64.64.11.69 id -64.64.11.70 - 64.64.11.73 gb -64.64.11.74 - 64.64.11.77 th -64.64.11.78 - 64.64.11.81 gb -64.64.11.82 - 64.64.11.84 th -64.64.11.85 - 64.64.11.88 us -64.64.11.89 - 64.64.11.92 ie -64.64.11.93 - 64.64.11.100 us -64.64.11.101 - 64.64.11.104 in -64.64.11.105 - 64.64.11.116 us -64.64.11.117 - 64.64.11.120 ie -64.64.11.121 - 64.64.11.121 th -64.64.11.122 - 64.64.11.125 ca -64.64.11.126 - 64.64.11.134 us -64.64.11.135 - 64.64.11.138 in -64.64.11.139 - 64.64.11.142 ca -64.64.11.143 - 64.64.11.146 es -64.64.11.147 - 64.64.11.155 us -64.64.11.156 - 64.64.11.159 id -64.64.11.160 - 64.64.11.163 ps -64.64.11.164 - 64.64.11.167 gb -64.64.11.168 - 64.64.11.183 us -64.64.11.184 - 64.64.11.187 ca -64.64.11.188 - 64.64.11.191 us -64.64.11.192 - 64.64.11.195 in -64.64.11.196 - 64.64.11.245 us -64.64.11.246 - 64.64.11.249 ca -64.64.11.250 - 64.64.12.9 us -64.64.12.10 - 64.64.12.10 be -64.64.12.11 - 64.64.12.18 us -64.64.12.19 - 64.64.12.19 nl -64.64.12.20 - 64.64.12.23 ca -64.64.12.24 - 64.64.12.28 br -64.64.12.29 - 64.64.12.40 us -64.64.12.41 - 64.64.12.44 nl -64.64.12.45 - 64.64.12.51 us -64.64.12.52 - 64.64.12.55 br -64.64.12.56 - 64.64.12.59 fr -64.64.12.60 - 64.64.12.63 us -64.64.12.64 - 64.64.12.67 my -64.64.12.68 - 64.64.12.84 us -64.64.12.85 - 64.64.12.88 es -64.64.12.89 - 64.64.12.92 us -64.64.12.93 - 64.64.12.96 it -64.64.12.97 - 64.64.12.100 ca -64.64.12.101 - 64.64.12.104 us -64.64.12.105 - 64.64.12.108 gb -64.64.12.109 - 64.64.12.121 us -64.64.12.122 - 64.64.12.129 ca -64.64.12.130 - 64.64.12.142 us -64.64.12.143 - 64.64.12.146 id -64.64.12.147 - 64.64.12.150 us -64.64.12.151 - 64.64.12.154 in -64.64.12.155 - 64.64.12.158 gb -64.64.12.159 - 64.64.12.162 in -64.64.12.163 - 64.64.12.175 us -64.64.12.176 - 64.64.12.179 ae -64.64.12.180 - 64.64.12.183 us -64.64.12.184 - 64.64.12.187 au -64.64.12.188 - 64.64.12.191 pk -64.64.12.192 - 64.64.12.195 us -64.64.12.196 - 64.64.12.199 se -64.64.12.200 - 64.64.12.210 us -64.64.12.211 - 64.64.12.214 cn -64.64.12.215 - 64.64.12.215 us -64.64.12.216 - 64.64.12.223 be -64.64.12.224 - 64.64.12.239 us -64.64.12.240 - 64.64.12.243 is -64.64.12.244 - 64.64.12.247 us -64.64.12.248 - 64.64.12.251 in -64.64.12.252 - 64.64.13.35 us -64.64.13.36 - 64.64.13.39 gb -64.64.13.40 - 64.64.13.67 us -64.64.13.68 - 64.64.13.77 ca -64.64.13.78 - 64.64.13.101 us -64.64.13.102 - 64.64.13.105 mu -64.64.13.106 - 64.64.13.113 us -64.64.13.114 - 64.64.13.118 om -64.64.13.119 - 64.64.13.126 us -64.64.13.127 - 64.64.13.130 gh -64.64.13.131 - 64.64.13.169 us -64.64.13.170 - 64.64.13.174 uy -64.64.13.175 - 64.64.13.178 gb -64.64.13.179 - 64.64.13.188 us -64.64.13.189 - 64.64.13.192 gr -64.64.13.193 - 64.64.13.196 ie -64.64.13.197 - 64.64.14.13 us -64.64.14.14 - 64.64.14.15 de -64.64.14.16 - 64.64.14.78 us -64.64.14.79 - 64.64.14.82 pe -64.64.14.83 - 64.64.14.111 us -64.64.14.112 - 64.64.14.115 br -64.64.14.116 - 64.64.14.125 pt -64.64.14.126 - 64.64.14.183 us -64.64.14.184 - 64.64.14.187 gb -64.64.14.188 - 64.64.14.247 us -64.64.14.248 - 64.64.14.251 ca -64.64.14.252 - 64.64.15.5 us -64.64.15.6 - 64.64.15.9 cl -64.64.15.10 - 64.64.15.13 us -64.64.15.14 - 64.64.15.17 mu -64.64.15.18 - 64.64.15.29 us -64.64.15.30 - 64.64.15.33 gb -64.64.15.34 - 64.64.15.37 eg -64.64.15.38 - 64.64.15.96 us -64.64.15.97 - 64.64.15.100 gb -64.64.15.101 - 64.64.15.104 us -64.64.15.105 - 64.64.15.108 be -64.64.15.109 - 64.64.15.165 us -64.64.15.166 - 64.64.15.169 in -64.64.15.170 - 64.64.16.61 us -64.64.16.62 - 64.64.16.65 au -64.64.16.66 - 64.64.16.154 us -64.64.16.155 - 64.64.16.158 pk -64.64.16.159 - 64.64.24.17 us -64.64.24.18 - 64.64.24.18 cn -64.64.24.19 - 64.64.24.38 us -64.64.24.39 - 64.64.24.42 au -64.64.24.43 - 64.64.24.70 us -64.64.24.71 - 64.64.24.74 cn -64.64.24.75 - 64.64.24.91 us -64.64.24.92 - 64.64.24.95 au -64.64.24.96 - 64.64.24.118 us -64.64.24.119 - 64.64.24.126 ca -64.64.24.127 - 64.64.24.139 us -64.64.24.140 - 64.64.24.143 ca -64.64.24.144 - 64.64.24.155 us -64.64.24.156 - 64.64.24.159 ca -64.64.24.160 - 64.64.24.163 sg -64.64.24.164 - 64.64.24.171 us -64.64.24.172 - 64.64.24.175 in -64.64.24.176 - 64.64.24.184 us -64.64.24.185 - 64.64.24.189 cn -64.64.24.190 - 64.64.24.213 us -64.64.24.214 - 64.64.24.217 sg -64.64.24.218 - 64.64.24.221 us -64.64.24.222 - 64.64.24.225 mx -64.64.24.226 - 64.64.24.229 vn -64.64.24.230 - 64.64.24.233 in -64.64.24.234 - 64.64.24.237 gb -64.64.24.238 - 64.64.24.241 ae -64.64.24.242 - 64.64.25.7 us -64.64.25.8 - 64.64.25.11 au -64.64.25.12 - 64.64.25.15 in -64.64.25.16 - 64.64.25.16 us -64.64.25.17 - 64.64.25.31 cn -64.64.25.32 - 64.64.25.44 us -64.64.25.45 - 64.64.25.48 ca -64.64.25.49 - 64.64.25.52 cn -64.64.25.53 - 64.64.25.72 us -64.64.25.73 - 64.64.25.76 pe -64.64.25.77 - 64.64.25.80 co -64.64.25.81 - 64.64.25.84 jp -64.64.25.85 - 64.64.25.88 us -64.64.25.89 - 64.64.25.92 mx -64.64.25.93 - 64.64.25.96 bd -64.64.25.97 - 64.64.25.108 us -64.64.25.109 - 64.64.25.112 au -64.64.25.113 - 64.64.25.128 us -64.64.25.129 - 64.64.25.132 ca -64.64.25.133 - 64.64.25.144 us -64.64.25.145 - 64.64.25.148 au -64.64.25.149 - 64.64.25.190 us -64.64.25.191 - 64.64.25.194 ca -64.64.25.195 - 64.64.25.218 us -64.64.25.219 - 64.64.25.222 gb -64.64.25.223 - 64.64.25.226 my -64.64.25.227 - 64.64.25.230 ua -64.64.25.231 - 64.64.25.234 us -64.64.25.235 - 64.64.25.238 au -64.64.25.239 - 64.64.25.242 sg -64.64.25.243 - 64.64.26.29 us -64.64.26.30 - 64.64.26.33 om -64.64.26.34 - 64.64.26.66 us -64.64.26.67 - 64.64.26.70 cn -64.64.26.71 - 64.64.26.74 id -64.64.26.75 - 64.64.26.83 us -64.64.26.84 - 64.64.26.87 ca -64.64.26.88 - 64.64.26.105 us -64.64.26.106 - 64.64.26.109 es -64.64.26.110 - 64.64.26.138 us -64.64.26.139 - 64.64.26.142 za -64.64.26.143 - 64.64.26.146 ca -64.64.26.147 - 64.64.26.159 us -64.64.26.160 - 64.64.26.163 ca -64.64.26.164 - 64.64.26.176 us -64.64.26.177 - 64.64.26.180 om -64.64.26.181 - 64.64.26.188 us -64.64.26.189 - 64.64.26.192 ca -64.64.26.193 - 64.64.26.200 us -64.64.26.201 - 64.64.26.204 in -64.64.26.205 - 64.64.26.208 nz -64.64.26.209 - 64.64.26.240 us -64.64.26.241 - 64.64.26.244 au -64.64.26.245 - 64.64.26.254 th -64.64.26.255 - 64.64.27.5 us -64.64.27.6 - 64.64.27.13 fi -64.64.27.14 - 64.64.27.56 us -64.64.27.57 - 64.64.27.60 au -64.64.27.61 - 64.64.27.64 us -64.64.27.65 - 64.64.27.68 cn -64.64.27.69 - 64.64.27.69 us -64.64.27.70 - 64.64.27.70 cn -64.64.27.71 - 64.64.27.99 us -64.64.27.100 - 64.64.27.103 in -64.64.27.104 - 64.64.27.135 us -64.64.27.136 - 64.64.27.139 do -64.64.27.140 - 64.64.27.143 au -64.64.27.144 - 64.64.27.151 ca -64.64.27.152 - 64.64.27.184 us -64.64.27.185 - 64.64.27.188 my -64.64.27.189 - 64.64.27.202 us -64.64.27.203 - 64.64.27.206 in -64.64.27.207 - 64.64.27.207 us -64.64.27.208 - 64.64.27.211 pk -64.64.27.212 - 64.64.27.230 us -64.64.27.231 - 64.64.27.234 bd -64.64.27.235 - 64.64.27.239 us -64.64.27.240 - 64.64.27.243 cn -64.64.27.244 - 64.64.27.247 sg -64.64.27.248 - 64.64.27.251 th -64.64.27.252 - 64.64.28.17 us -64.64.28.18 - 64.64.28.18 be -64.64.28.19 - 64.64.28.22 cn -64.64.28.23 - 64.64.28.82 us -64.64.28.83 - 64.64.28.83 cz -64.64.28.84 - 64.64.28.110 us -64.64.28.111 - 64.64.28.114 au -64.64.28.115 - 64.64.28.124 us -64.64.28.125 - 64.64.28.125 cn -64.64.28.126 - 64.64.28.129 us -64.64.28.130 - 64.64.28.130 cn -64.64.28.131 - 64.64.28.134 my -64.64.28.135 - 64.64.28.207 us -64.64.28.208 - 64.64.28.211 ca -64.64.28.212 - 64.64.28.227 us -64.64.28.228 - 64.64.28.231 au -64.64.28.232 - 64.64.28.235 us -64.64.28.236 - 64.64.28.239 au -64.64.28.240 - 64.64.28.243 id -64.64.28.244 - 64.64.28.244 us -64.64.28.245 - 64.64.28.248 ca -64.64.28.249 - 64.64.29.22 us -64.64.29.23 - 64.64.29.23 be -64.64.29.24 - 64.64.29.24 cz -64.64.29.25 - 64.64.29.82 us -64.64.29.83 - 64.64.29.86 za -64.64.29.87 - 64.64.29.122 us -64.64.29.123 - 64.64.29.123 cn -64.64.29.124 - 64.64.29.237 us -64.64.29.238 - 64.64.29.238 au -64.64.29.239 - 64.64.29.242 us -64.64.29.243 - 64.64.29.244 sg -64.64.29.245 - 64.64.30.17 us -64.64.30.18 - 64.64.30.21 hk -64.64.30.22 - 64.64.30.37 us -64.64.30.38 - 64.64.30.41 au -64.64.30.42 - 64.64.30.45 ua -64.64.30.46 - 64.64.30.59 us -64.64.30.60 - 64.64.30.60 cn -64.64.30.61 - 64.64.30.68 us -64.64.30.69 - 64.64.30.72 ca -64.64.30.73 - 64.64.30.88 us -64.64.30.89 - 64.64.30.89 cn -64.64.30.90 - 64.64.30.93 us -64.64.30.94 - 64.64.30.97 au -64.64.30.98 - 64.64.30.113 us -64.64.30.114 - 64.64.30.117 au -64.64.30.118 - 64.64.30.131 us -64.64.30.132 - 64.64.30.132 be -64.64.30.133 - 64.64.30.136 us -64.64.30.137 - 64.64.30.140 kh -64.64.30.141 - 64.64.30.156 us -64.64.30.157 - 64.64.30.160 in -64.64.30.161 - 64.64.30.162 us -64.64.30.163 - 64.64.30.164 cn -64.64.30.165 - 64.64.30.168 pk -64.64.30.169 - 64.64.30.176 au -64.64.30.177 - 64.64.30.184 us -64.64.30.185 - 64.64.30.188 ca -64.64.30.189 - 64.64.30.192 ar -64.64.30.193 - 64.64.30.205 us -64.64.30.206 - 64.64.30.209 in -64.64.30.210 - 64.64.30.217 us -64.64.30.218 - 64.64.30.220 cn -64.64.30.221 - 64.64.30.250 us -64.64.30.251 - 64.64.30.254 ca -64.64.30.255 - 64.64.31.17 us -64.64.31.18 - 64.64.31.21 ca -64.64.31.22 - 64.64.31.33 us -64.64.31.34 - 64.64.31.37 au -64.64.31.38 - 64.64.31.63 us -64.64.31.64 - 64.64.31.64 be -64.64.31.65 - 64.64.31.72 us -64.64.31.73 - 64.64.31.73 be -64.64.31.74 - 64.64.31.77 pl -64.64.31.78 - 64.64.31.109 us -64.64.31.110 - 64.64.31.113 ca -64.64.31.114 - 64.64.31.117 us -64.64.31.118 - 64.64.31.118 cn -64.64.31.119 - 64.64.31.122 us -64.64.31.123 - 64.64.31.126 ph -64.64.31.127 - 64.64.31.134 us -64.64.31.135 - 64.64.31.138 ca -64.64.31.139 - 64.64.31.146 cn -64.64.31.147 - 64.64.31.154 us -64.64.31.155 - 64.64.31.155 be -64.64.31.156 - 64.64.31.159 us -64.64.31.160 - 64.64.31.163 ca -64.64.31.164 - 64.64.31.167 us -64.64.31.168 - 64.64.31.171 jp -64.64.31.172 - 64.64.31.179 us -64.64.31.180 - 64.64.31.183 au -64.64.31.184 - 64.64.31.191 us -64.64.31.192 - 64.64.31.195 th -64.64.31.196 - 64.64.31.199 py -64.64.31.200 - 64.64.31.207 us -64.64.31.208 - 64.64.31.211 ca -64.64.31.212 - 64.64.31.215 us -64.64.31.216 - 64.64.31.219 th -64.64.31.220 - 64.64.31.220 us -64.64.31.221 - 64.64.31.222 ro -64.64.31.223 - 64.64.31.231 us -64.64.31.232 - 64.64.31.235 cz -64.64.31.236 - 64.64.31.244 us -64.64.31.245 - 64.64.31.248 cn -64.64.31.249 - 64.64.31.252 us -64.64.31.253 - 64.64.31.253 cz -64.64.31.254 - 64.64.95.255 us -64.64.96.0 - 64.64.96.7 ca -64.64.96.8 - 64.64.96.23 us -64.64.96.24 - 64.64.96.31 se -64.64.96.32 - 64.64.96.47 us -64.64.96.48 - 64.64.96.55 ca -64.64.96.56 - 64.64.96.71 us -64.64.96.72 - 64.64.96.79 fr -64.64.96.80 - 64.64.116.31 us -64.64.116.32 - 64.64.116.63 ba -64.64.116.64 - 64.64.116.87 us -64.64.116.88 - 64.64.116.95 ca -64.64.116.96 - 64.64.127.191 us -64.64.127.192 - 64.64.127.199 ca -64.64.127.200 - 64.64.159.255 us +64.62.239.0 - 64.64.107.255 us +64.64.108.0 - 64.64.108.255 jp +64.64.109.0 - 64.64.120.255 us +64.64.121.0 - 64.64.121.255 ca +64.64.122.0 - 64.64.122.255 us +64.64.123.0 - 64.64.123.255 gb +64.64.124.0 - 64.64.159.255 us 64.64.160.0 - 64.64.191.255 ca 64.64.192.0 - 64.64.223.255 us -64.64.224.0 - 64.64.224.255 ca -64.64.225.0 - 64.64.225.255 gb -64.64.226.0 - 64.64.228.255 us -64.64.229.0 - 64.64.229.255 ca -64.64.230.0 - 64.64.237.255 us -64.64.238.0 - 64.64.255.255 ca +64.64.224.0 - 64.64.255.255 ca 64.65.0.0 - 64.65.255.255 us 64.66.0.0 - 64.66.15.255 bs 64.66.16.0 - 64.66.31.255 ca @@ -18443,304 +14603,93 @@ 64.66.224.0 - 64.66.239.255 ca 64.66.240.0 - 64.68.191.255 us 64.68.192.0 - 64.68.207.255 ca -64.68.208.0 - 64.68.212.15 us -64.68.212.16 - 64.68.212.47 mx -64.68.212.48 - 64.68.212.95 us -64.68.212.96 - 64.68.212.111 mx -64.68.212.112 - 64.68.216.255 us -64.68.217.0 - 64.68.217.63 mx -64.68.217.64 - 64.68.220.255 us -64.68.221.0 - 64.68.222.255 mx -64.68.223.0 - 64.69.63.255 us -64.69.64.0 - 64.69.65.127 ca -64.69.65.128 - 64.69.65.143 us -64.69.65.144 - 64.69.65.191 ca -64.69.65.192 - 64.69.65.207 us -64.69.65.208 - 64.69.65.223 ca -64.69.65.224 - 64.69.65.247 us -64.69.65.248 - 64.69.66.191 ca -64.69.66.192 - 64.69.67.127 us -64.69.67.128 - 64.69.68.63 ca -64.69.68.64 - 64.69.68.79 us -64.69.68.80 - 64.69.69.239 ca -64.69.69.240 - 64.69.69.247 us -64.69.69.248 - 64.69.70.7 ca -64.69.70.8 - 64.69.70.15 us -64.69.70.16 - 64.69.70.31 ca -64.69.70.32 - 64.69.70.63 kn -64.69.70.64 - 64.69.71.135 ca -64.69.71.136 - 64.69.71.239 us -64.69.71.240 - 64.69.71.254 ca -64.69.71.255 - 64.69.71.255 us +64.68.208.0 - 64.69.63.255 us +64.69.64.0 - 64.69.64.255 ca +64.69.65.0 - 64.69.65.127 us +64.69.65.128 - 64.69.65.135 ca +64.69.65.136 - 64.69.67.111 us +64.69.67.112 - 64.69.67.119 ca +64.69.67.120 - 64.69.68.84 us +64.69.68.85 - 64.69.68.85 ca +64.69.68.86 - 64.69.69.39 us +64.69.69.40 - 64.69.69.47 ca +64.69.69.48 - 64.69.69.127 us +64.69.69.128 - 64.69.69.191 ca +64.69.69.192 - 64.69.69.255 us +64.69.70.0 - 64.69.70.7 ca +64.69.70.8 - 64.69.71.255 us 64.69.72.0 - 64.69.75.7 ca -64.69.75.8 - 64.69.75.15 vg -64.69.75.16 - 64.69.75.95 ca -64.69.75.96 - 64.69.75.103 mx -64.69.75.104 - 64.69.75.111 ca -64.69.75.112 - 64.69.75.127 us -64.69.75.128 - 64.69.75.255 ca -64.69.76.0 - 64.69.76.0 us -64.69.76.1 - 64.69.76.111 ca -64.69.76.112 - 64.69.76.127 mx -64.69.76.128 - 64.69.76.135 us -64.69.76.136 - 64.69.76.143 mx -64.69.76.144 - 64.69.76.159 us -64.69.76.160 - 64.69.76.223 ca -64.69.76.224 - 64.69.76.239 us -64.69.76.240 - 64.69.77.31 ca -64.69.77.32 - 64.69.77.63 us -64.69.77.64 - 64.69.77.127 ca -64.69.77.128 - 64.69.77.159 us -64.69.77.160 - 64.69.77.167 ca -64.69.77.168 - 64.69.77.175 us -64.69.77.176 - 64.69.77.215 ca -64.69.77.216 - 64.69.77.223 us -64.69.77.224 - 64.69.77.231 ca -64.69.77.232 - 64.69.77.255 us -64.69.78.0 - 64.69.78.223 ca -64.69.78.224 - 64.69.78.231 us -64.69.78.232 - 64.69.78.239 ca -64.69.78.240 - 64.69.78.255 us -64.69.79.0 - 64.69.79.127 bs -64.69.79.128 - 64.69.79.223 ca -64.69.79.224 - 64.69.80.63 us -64.69.80.64 - 64.69.80.79 ca -64.69.80.80 - 64.69.80.95 bv -64.69.80.96 - 64.69.80.111 us -64.69.80.112 - 64.69.81.143 ca -64.69.81.144 - 64.69.81.151 us -64.69.81.152 - 64.69.81.159 mx +64.69.75.8 - 64.69.78.55 us +64.69.78.56 - 64.69.78.63 ca +64.69.78.64 - 64.69.78.255 us +64.69.79.0 - 64.69.79.255 ca +64.69.80.0 - 64.69.80.191 us +64.69.80.192 - 64.69.80.255 ca +64.69.81.0 - 64.69.81.159 us 64.69.81.160 - 64.69.81.175 ca 64.69.81.176 - 64.69.81.191 us -64.69.81.192 - 64.69.82.191 ca -64.69.82.192 - 64.69.82.207 us -64.69.82.208 - 64.69.82.215 ca -64.69.82.216 - 64.69.82.239 us -64.69.82.240 - 64.69.83.135 ca -64.69.83.136 - 64.69.83.159 us -64.69.83.160 - 64.69.83.175 ca -64.69.83.176 - 64.69.83.191 us -64.69.83.192 - 64.69.83.199 ca -64.69.83.200 - 64.69.83.207 us -64.69.83.208 - 64.69.83.223 ca -64.69.83.224 - 64.69.83.231 mx -64.69.83.232 - 64.69.83.239 us -64.69.83.240 - 64.69.83.247 ca -64.69.83.248 - 64.69.83.255 us -64.69.84.0 - 64.69.85.71 ca -64.69.85.72 - 64.69.85.79 us -64.69.85.80 - 64.69.85.87 ca -64.69.85.88 - 64.69.85.95 us -64.69.85.96 - 64.69.85.127 ca -64.69.85.128 - 64.69.85.135 mx -64.69.85.136 - 64.69.85.143 us -64.69.85.144 - 64.69.86.111 ca -64.69.86.112 - 64.69.86.119 us -64.69.86.120 - 64.69.86.127 ca -64.69.86.128 - 64.69.86.191 us -64.69.86.192 - 64.69.86.223 ca -64.69.86.224 - 64.69.86.255 us -64.69.87.0 - 64.69.87.31 ca -64.69.87.32 - 64.69.87.35 us -64.69.87.36 - 64.69.87.63 ca -64.69.87.64 - 64.69.87.127 us -64.69.87.128 - 64.69.87.255 ca -64.69.88.0 - 64.69.88.15 us +64.69.81.192 - 64.69.81.207 ca +64.69.81.208 - 64.69.82.63 us +64.69.82.64 - 64.69.82.191 ca +64.69.82.192 - 64.69.83.95 us +64.69.83.96 - 64.69.83.111 ca +64.69.83.112 - 64.69.83.199 us +64.69.83.200 - 64.69.83.203 ca +64.69.83.204 - 64.69.83.255 us +64.69.84.0 - 64.69.84.255 ca +64.69.85.0 - 64.69.88.15 us 64.69.88.16 - 64.69.88.31 ca -64.69.88.32 - 64.69.88.63 us -64.69.88.64 - 64.69.88.95 ca -64.69.88.96 - 64.69.88.127 us -64.69.88.128 - 64.69.88.223 ca -64.69.88.224 - 64.69.88.239 tw -64.69.88.240 - 64.69.88.255 ca -64.69.89.0 - 64.69.89.63 us -64.69.89.64 - 64.69.89.95 ca -64.69.89.96 - 64.69.89.159 us -64.69.89.160 - 64.69.89.167 ca -64.69.89.168 - 64.69.89.191 us -64.69.89.192 - 64.69.89.199 mx -64.69.89.200 - 64.69.89.255 us -64.69.90.0 - 64.69.90.127 ca -64.69.90.128 - 64.69.90.143 us -64.69.90.144 - 64.69.90.183 ca -64.69.90.184 - 64.69.90.191 us -64.69.90.192 - 64.69.90.223 ca -64.69.90.224 - 64.69.90.255 us -64.69.91.0 - 64.69.91.79 ca -64.69.91.80 - 64.69.91.95 us -64.69.91.96 - 64.69.91.127 ca -64.69.91.128 - 64.69.91.143 us -64.69.91.144 - 64.69.91.175 ca -64.69.91.176 - 64.69.91.207 us -64.69.91.208 - 64.69.91.223 ca -64.69.91.224 - 64.69.91.239 us -64.69.91.240 - 64.69.93.143 ca -64.69.93.144 - 64.69.93.151 us -64.69.93.152 - 64.69.93.223 ca -64.69.93.224 - 64.69.93.247 us -64.69.93.248 - 64.69.95.255 ca -64.69.96.0 - 64.69.179.63 us -64.69.179.64 - 64.69.179.79 gb -64.69.179.80 - 64.69.180.79 us -64.69.180.80 - 64.69.180.111 gb -64.69.180.112 - 64.69.189.63 us -64.69.189.64 - 64.69.189.79 gb -64.69.189.80 - 64.70.27.191 us -64.70.27.192 - 64.70.27.199 hk -64.70.27.200 - 64.70.27.207 us -64.70.27.208 - 64.70.27.223 hk -64.70.27.224 - 64.70.48.175 us -64.70.48.176 - 64.70.48.191 ph -64.70.48.192 - 64.70.77.255 us +64.69.88.32 - 64.69.91.127 us +64.69.91.128 - 64.69.91.135 ca +64.69.91.136 - 64.69.91.255 us +64.69.92.0 - 64.69.92.255 ca +64.69.93.0 - 64.69.93.191 us +64.69.93.192 - 64.69.93.223 ca +64.69.93.224 - 64.69.93.255 us +64.69.94.0 - 64.69.95.255 ca +64.69.96.0 - 64.70.77.255 us 64.70.78.0 - 64.70.79.255 ph -64.70.80.0 - 64.71.129.127 us -64.71.129.128 - 64.71.129.255 au -64.71.130.0 - 64.71.130.95 us -64.71.130.96 - 64.71.130.103 ph -64.71.130.104 - 64.71.133.71 us -64.71.133.72 - 64.71.133.79 mx -64.71.133.80 - 64.71.135.183 us -64.71.135.184 - 64.71.135.191 au -64.71.135.192 - 64.71.135.255 us +64.70.80.0 - 64.71.135.255 us 64.71.136.0 - 64.71.136.255 gr -64.71.137.0 - 64.71.137.143 us -64.71.137.144 - 64.71.137.159 ae -64.71.137.160 - 64.71.137.207 us -64.71.137.208 - 64.71.137.215 fj -64.71.137.216 - 64.71.140.127 us -64.71.140.128 - 64.71.140.135 jp -64.71.140.136 - 64.71.140.191 us -64.71.140.192 - 64.71.140.255 au -64.71.141.0 - 64.71.145.95 us -64.71.145.96 - 64.71.145.103 jp -64.71.145.104 - 64.71.145.151 us -64.71.145.152 - 64.71.145.159 jp -64.71.145.160 - 64.71.145.223 us -64.71.145.224 - 64.71.145.239 ae -64.71.145.240 - 64.71.147.255 us -64.71.148.0 - 64.71.148.7 gb -64.71.148.8 - 64.71.148.111 us -64.71.148.112 - 64.71.148.119 gb -64.71.148.120 - 64.71.150.31 us -64.71.150.32 - 64.71.150.63 it -64.71.150.64 - 64.71.151.95 us -64.71.151.96 - 64.71.151.127 cn -64.71.151.128 - 64.71.153.31 us -64.71.153.32 - 64.71.153.39 lv -64.71.153.40 - 64.71.153.223 us -64.71.153.224 - 64.71.153.255 gr -64.71.154.0 - 64.71.155.199 us -64.71.155.200 - 64.71.155.207 be -64.71.155.208 - 64.71.155.215 us -64.71.155.216 - 64.71.155.223 jp -64.71.155.224 - 64.71.156.111 us -64.71.156.112 - 64.71.156.127 de -64.71.156.128 - 64.71.158.95 us -64.71.158.96 - 64.71.158.127 hk -64.71.158.128 - 64.71.158.143 us -64.71.158.144 - 64.71.158.151 bm -64.71.158.152 - 64.71.160.31 us -64.71.160.32 - 64.71.160.39 a1 -64.71.160.40 - 64.71.163.111 us -64.71.163.112 - 64.71.163.119 jp -64.71.163.120 - 64.71.163.159 us -64.71.163.160 - 64.71.163.191 gb -64.71.163.192 - 64.71.165.143 us -64.71.165.144 - 64.71.165.151 ca -64.71.165.152 - 64.71.166.95 us -64.71.166.96 - 64.71.166.103 jp -64.71.166.104 - 64.71.166.127 us -64.71.166.128 - 64.71.166.191 it -64.71.166.192 - 64.71.166.223 hk -64.71.166.224 - 64.71.169.255 us +64.71.137.0 - 64.71.169.255 us 64.71.170.0 - 64.71.170.255 ca 64.71.171.0 - 64.71.171.255 us -64.71.172.0 - 64.71.172.255 cn +64.71.172.0 - 64.71.172.17 cn +64.71.172.18 - 64.71.172.18 us +64.71.172.19 - 64.71.172.255 cn 64.71.173.0 - 64.71.174.255 us 64.71.175.0 - 64.71.175.255 nl -64.71.176.0 - 64.71.176.191 us -64.71.176.192 - 64.71.176.223 mx -64.71.176.224 - 64.71.191.23 us -64.71.191.24 - 64.71.191.31 a1 -64.71.191.32 - 64.71.226.255 us -64.71.227.0 - 64.71.227.255 az -64.71.228.0 - 64.71.230.127 us -64.71.230.128 - 64.71.230.143 af -64.71.230.144 - 64.71.230.175 us +64.71.176.0 - 64.71.230.175 us 64.71.230.176 - 64.71.230.191 at -64.71.230.192 - 64.71.233.31 us -64.71.233.32 - 64.71.233.39 gb -64.71.233.40 - 64.71.233.127 us -64.71.233.128 - 64.71.233.135 uy -64.71.233.136 - 64.71.233.175 us +64.71.230.192 - 64.71.233.175 us 64.71.233.176 - 64.71.233.191 at 64.71.233.192 - 64.71.236.47 us 64.71.236.48 - 64.71.236.63 at -64.71.236.64 - 64.71.239.255 us +64.71.236.64 - 64.71.236.255 us +64.71.237.0 - 64.71.237.255 nl +64.71.238.0 - 64.71.239.255 us 64.71.240.0 - 64.71.255.255 ca 64.72.0.0 - 64.72.223.255 us 64.72.224.0 - 64.72.255.255 ca -64.73.0.0 - 64.73.194.63 us -64.73.194.64 - 64.73.194.127 au -64.73.194.128 - 64.73.194.191 us -64.73.194.192 - 64.73.194.255 in -64.73.195.0 - 64.73.197.255 us -64.73.198.0 - 64.73.198.255 ca -64.73.199.0 - 64.73.199.15 us -64.73.199.16 - 64.73.199.47 in -64.73.199.48 - 64.73.202.47 us -64.73.202.48 - 64.73.202.63 in -64.73.202.64 - 64.73.206.63 us -64.73.206.64 - 64.73.206.127 ca -64.73.206.128 - 64.73.206.191 us -64.73.206.192 - 64.73.206.255 in -64.73.207.0 - 64.73.213.31 us -64.73.213.32 - 64.73.213.63 ca -64.73.213.64 - 64.73.213.223 us -64.73.213.224 - 64.73.213.255 ca -64.73.214.0 - 64.73.216.15 us -64.73.216.16 - 64.73.216.31 in -64.73.216.32 - 64.73.216.63 us -64.73.216.64 - 64.73.216.79 cr -64.73.216.80 - 64.73.216.111 us -64.73.216.112 - 64.73.216.143 in -64.73.216.144 - 64.73.216.255 us -64.73.217.0 - 64.73.217.255 ca -64.73.218.0 - 64.74.35.191 us -64.74.35.192 - 64.74.35.199 gb -64.74.35.200 - 64.74.94.127 us -64.74.94.128 - 64.74.94.159 gb -64.74.94.160 - 64.74.117.255 us -64.74.118.0 - 64.74.118.255 in -64.74.119.0 - 64.74.232.175 us -64.74.232.176 - 64.74.232.191 ca -64.74.232.192 - 64.74.245.223 us -64.74.245.224 - 64.74.245.231 au -64.74.245.232 - 64.75.14.191 us -64.75.14.192 - 64.75.14.223 cn -64.75.14.224 - 64.75.18.175 us -64.75.18.176 - 64.75.18.191 in -64.75.18.192 - 64.75.255.255 us -64.76.0.0 - 64.76.29.143 ar -64.76.29.144 - 64.76.29.151 ch -64.76.29.152 - 64.76.47.255 ar +64.73.0.0 - 64.73.192.255 us +64.73.193.0 - 64.73.193.255 ca +64.73.194.0 - 64.75.255.255 us +64.76.0.0 - 64.76.47.255 ar 64.76.48.0 - 64.76.59.255 co 64.76.60.0 - 64.76.63.255 ec 64.76.64.0 - 64.76.65.255 ve 64.76.66.0 - 64.76.67.255 us 64.76.68.0 - 64.76.79.255 pe -64.76.80.0 - 64.76.91.255 co +64.76.80.0 - 64.76.81.255 co +64.76.82.0 - 64.76.82.255 us +64.76.83.0 - 64.76.91.255 co 64.76.92.0 - 64.76.95.255 pe 64.76.96.0 - 64.76.103.255 cl -64.76.104.0 - 64.76.108.23 pe -64.76.108.24 - 64.76.108.31 ca -64.76.108.32 - 64.76.111.255 pe +64.76.104.0 - 64.76.111.255 pe 64.76.112.0 - 64.76.119.255 co 64.76.120.0 - 64.76.127.255 ar 64.76.128.0 - 64.76.135.255 pe -64.76.136.0 - 64.76.136.47 cl -64.76.136.48 - 64.76.136.63 ec -64.76.136.64 - 64.76.175.255 cl +64.76.136.0 - 64.76.175.255 cl 64.76.176.0 - 64.76.179.255 co 64.76.180.0 - 64.76.183.255 cl 64.76.184.0 - 64.76.191.255 co @@ -18750,504 +14699,142 @@ 64.76.216.0 - 64.76.227.255 ec 64.76.228.0 - 64.76.233.255 us 64.76.234.0 - 64.76.234.255 pa -64.76.235.0 - 64.77.12.47 us -64.77.12.48 - 64.77.12.55 au -64.77.12.56 - 64.77.12.87 us -64.77.12.88 - 64.77.12.95 co -64.77.12.96 - 64.77.12.135 us -64.77.12.136 - 64.77.12.143 ca -64.77.12.144 - 64.77.12.151 us -64.77.12.152 - 64.77.12.175 au -64.77.12.176 - 64.77.12.223 us -64.77.12.224 - 64.77.12.239 mx -64.77.12.240 - 64.77.13.15 us -64.77.13.16 - 64.77.13.23 pk -64.77.13.24 - 64.77.13.47 us -64.77.13.48 - 64.77.13.63 il -64.77.13.64 - 64.77.13.79 us -64.77.13.80 - 64.77.13.95 mx -64.77.13.96 - 64.77.14.31 us -64.77.14.32 - 64.77.14.47 au -64.77.14.48 - 64.77.15.79 us -64.77.15.80 - 64.77.15.95 au -64.77.15.96 - 64.77.15.159 us -64.77.15.160 - 64.77.15.175 au -64.77.15.176 - 64.77.15.191 in -64.77.15.192 - 64.77.15.239 us -64.77.15.240 - 64.77.15.255 au -64.77.16.0 - 64.77.17.63 us -64.77.17.64 - 64.77.17.95 sg -64.77.17.96 - 64.77.19.159 us -64.77.19.160 - 64.77.19.191 ca -64.77.19.192 - 64.77.21.63 us -64.77.21.64 - 64.77.21.127 za -64.77.21.128 - 64.77.21.191 us -64.77.21.192 - 64.77.21.255 za -64.77.22.0 - 64.77.24.255 us -64.77.25.0 - 64.77.25.63 za -64.77.25.64 - 64.77.25.95 us -64.77.25.96 - 64.77.25.127 au -64.77.25.128 - 64.77.27.151 us -64.77.27.152 - 64.77.27.159 ae -64.77.27.160 - 64.77.27.247 us -64.77.27.248 - 64.77.27.255 mx -64.77.28.0 - 64.77.29.247 us -64.77.29.248 - 64.77.29.255 in -64.77.30.0 - 64.77.30.7 ca -64.77.30.8 - 64.77.30.31 us -64.77.30.32 - 64.77.30.39 au -64.77.30.40 - 64.77.30.47 us -64.77.30.48 - 64.77.30.55 ca -64.77.30.56 - 64.77.30.111 us -64.77.30.112 - 64.77.30.119 ca -64.77.30.120 - 64.77.30.127 us -64.77.30.128 - 64.77.30.135 es -64.77.30.136 - 64.77.36.87 us -64.77.36.88 - 64.77.36.95 ca -64.77.36.96 - 64.77.37.23 us -64.77.37.24 - 64.77.37.31 in -64.77.37.32 - 64.77.37.135 us -64.77.37.136 - 64.77.37.143 jp -64.77.37.144 - 64.77.37.223 us -64.77.37.224 - 64.77.37.247 in -64.77.37.248 - 64.77.37.255 mx -64.77.38.0 - 64.77.38.167 us -64.77.38.168 - 64.77.38.175 ca -64.77.38.176 - 64.77.38.247 us -64.77.38.248 - 64.77.38.255 gb -64.77.39.0 - 64.77.39.31 us -64.77.39.32 - 64.77.39.39 ca -64.77.39.40 - 64.77.39.71 us -64.77.39.72 - 64.77.39.79 au -64.77.39.80 - 64.77.39.103 us -64.77.39.104 - 64.77.39.111 fr -64.77.39.112 - 64.77.39.119 in -64.77.39.120 - 64.77.39.127 us -64.77.39.128 - 64.77.39.135 in -64.77.39.136 - 64.77.39.143 gb -64.77.39.144 - 64.77.39.151 gr -64.77.39.152 - 64.77.39.199 us -64.77.39.200 - 64.77.39.207 pk -64.77.39.208 - 64.77.40.111 us -64.77.40.112 - 64.77.40.119 at -64.77.40.120 - 64.77.40.239 us -64.77.40.240 - 64.77.40.255 ar -64.77.41.0 - 64.77.41.95 us -64.77.41.96 - 64.77.41.111 au -64.77.41.112 - 64.77.42.63 us -64.77.42.64 - 64.77.42.79 it -64.77.42.80 - 64.77.42.223 us -64.77.42.224 - 64.77.42.239 ca -64.77.42.240 - 64.77.43.159 us -64.77.43.160 - 64.77.43.191 mx -64.77.43.192 - 64.77.44.63 us -64.77.44.64 - 64.77.44.95 mx -64.77.44.96 - 64.77.44.191 us -64.77.44.192 - 64.77.44.223 id -64.77.44.224 - 64.77.45.63 us -64.77.45.64 - 64.77.45.127 br -64.77.45.128 - 64.77.46.127 us -64.77.46.128 - 64.77.46.159 au -64.77.46.160 - 64.77.47.63 us -64.77.47.64 - 64.77.47.95 in -64.77.47.96 - 64.77.47.159 us -64.77.47.160 - 64.77.47.191 mx -64.77.47.192 - 64.77.49.159 us -64.77.49.160 - 64.77.49.191 fr -64.77.49.192 - 64.77.51.175 us -64.77.51.176 - 64.77.51.191 cl -64.77.51.192 - 64.77.81.159 us -64.77.81.160 - 64.77.81.191 au -64.77.81.192 - 64.77.84.47 us -64.77.84.48 - 64.77.84.63 ca -64.77.84.64 - 64.77.101.183 us -64.77.101.184 - 64.77.101.191 hk -64.77.101.192 - 64.77.102.191 us -64.77.102.192 - 64.77.102.207 ca -64.77.102.208 - 64.78.161.255 us +64.76.235.0 - 64.78.161.255 us 64.78.162.0 - 64.78.162.255 cn -64.78.163.0 - 64.78.165.95 us -64.78.165.96 - 64.78.165.111 cn -64.78.165.112 - 64.79.100.255 us +64.78.163.0 - 64.79.100.255 us 64.79.101.0 - 64.79.101.255 gb 64.79.102.0 - 64.79.146.255 us 64.79.147.0 - 64.79.147.255 gb 64.79.148.0 - 64.85.31.255 us -64.85.32.0 - 64.85.32.95 ca -64.85.32.96 - 64.85.32.127 us -64.85.32.128 - 64.85.38.79 ca -64.85.38.80 - 64.85.38.87 us -64.85.38.88 - 64.85.40.79 ca -64.85.40.80 - 64.85.40.95 us -64.85.40.96 - 64.85.40.191 ca -64.85.40.192 - 64.85.40.215 us -64.85.40.216 - 64.85.40.223 ca -64.85.40.224 - 64.85.40.239 us -64.85.40.240 - 64.85.42.95 ca -64.85.42.96 - 64.85.42.111 us -64.85.42.112 - 64.85.42.127 ca -64.85.42.128 - 64.85.42.143 us -64.85.42.144 - 64.85.42.175 ca -64.85.42.176 - 64.85.42.191 us -64.85.42.192 - 64.85.43.23 ca -64.85.43.24 - 64.85.43.31 us -64.85.43.32 - 64.85.43.55 ca -64.85.43.56 - 64.85.43.63 us -64.85.43.64 - 64.85.43.191 ca -64.85.43.192 - 64.85.43.207 us -64.85.43.208 - 64.85.43.223 ca -64.85.43.224 - 64.85.43.255 us -64.85.44.0 - 64.85.47.39 ca -64.85.47.40 - 64.85.47.47 us -64.85.47.48 - 64.85.48.127 ca -64.85.48.128 - 64.85.48.159 us -64.85.48.160 - 64.85.51.15 ca -64.85.51.16 - 64.85.51.43 us -64.85.51.44 - 64.85.51.87 ca -64.85.51.88 - 64.85.51.95 us -64.85.51.96 - 64.85.51.107 ca -64.85.51.108 - 64.85.51.119 us -64.85.51.120 - 64.85.51.159 ca -64.85.51.160 - 64.85.51.167 us -64.85.51.168 - 64.85.51.255 ca -64.85.52.0 - 64.85.52.31 us -64.85.52.32 - 64.85.52.175 ca -64.85.52.176 - 64.85.52.191 us -64.85.52.192 - 64.85.53.39 ca -64.85.53.40 - 64.85.53.47 us -64.85.53.48 - 64.85.62.247 ca -64.85.62.248 - 64.85.62.255 us -64.85.63.0 - 64.85.63.255 ca -64.85.64.0 - 64.85.68.127 us -64.85.68.128 - 64.85.68.159 ca -64.85.68.160 - 64.85.163.15 us -64.85.163.16 - 64.85.163.31 tr -64.85.163.32 - 64.85.163.127 us -64.85.163.128 - 64.85.163.159 ca -64.85.163.160 - 64.85.165.79 us -64.85.165.80 - 64.85.165.87 ca -64.85.165.88 - 64.85.167.223 us -64.85.167.224 - 64.85.167.231 ca -64.85.167.232 - 64.85.170.63 us -64.85.170.64 - 64.85.170.87 ca -64.85.170.88 - 64.85.255.255 us +64.85.32.0 - 64.85.40.207 ca +64.85.40.208 - 64.85.40.215 us +64.85.40.216 - 64.85.63.255 ca +64.85.64.0 - 64.85.255.255 us 64.86.0.0 - 64.86.3.255 ca 64.86.4.0 - 64.86.4.255 us 64.86.5.0 - 64.86.5.255 ca -64.86.6.0 - 64.86.6.255 us -64.86.7.0 - 64.86.11.191 ca -64.86.11.192 - 64.86.11.255 us -64.86.12.0 - 64.86.14.63 ca -64.86.14.64 - 64.86.14.95 us -64.86.14.96 - 64.86.14.127 ws -64.86.14.128 - 64.86.14.255 ca -64.86.15.0 - 64.86.19.255 us +64.86.6.0 - 64.86.19.255 us 64.86.20.0 - 64.86.20.255 vg 64.86.21.0 - 64.86.22.255 us 64.86.23.0 - 64.86.23.255 mh 64.86.24.0 - 64.86.24.255 lr 64.86.25.0 - 64.86.25.255 ca 64.86.26.0 - 64.86.27.255 zw -64.86.28.0 - 64.86.28.255 us -64.86.29.0 - 64.86.29.127 ca -64.86.29.128 - 64.86.29.255 us +64.86.28.0 - 64.86.29.255 us 64.86.30.0 - 64.86.33.255 ca 64.86.34.0 - 64.86.34.255 sg 64.86.35.0 - 64.86.35.255 eg 64.86.36.0 - 64.86.38.255 us 64.86.39.0 - 64.86.39.255 ph -64.86.40.0 - 64.86.44.255 ca -64.86.45.0 - 64.86.45.127 us -64.86.45.128 - 64.86.45.255 ca -64.86.46.0 - 64.86.46.255 us -64.86.47.0 - 64.86.49.255 ca -64.86.50.0 - 64.86.52.255 us -64.86.53.0 - 64.86.53.127 ca -64.86.53.128 - 64.86.53.191 us -64.86.53.192 - 64.86.53.255 ca +64.86.40.0 - 64.86.43.255 ca +64.86.44.0 - 64.86.46.255 us +64.86.47.0 - 64.86.47.255 ca +64.86.48.0 - 64.86.53.255 us 64.86.54.0 - 64.86.55.255 ht 64.86.56.0 - 64.86.61.255 ca -64.86.62.0 - 64.86.62.255 us -64.86.63.0 - 64.86.63.15 ca -64.86.63.16 - 64.86.63.23 sg -64.86.63.24 - 64.86.63.31 ca -64.86.63.32 - 64.86.63.63 us -64.86.63.64 - 64.86.63.95 af -64.86.63.96 - 64.86.63.127 ca -64.86.63.128 - 64.86.63.159 us -64.86.63.160 - 64.86.63.191 ca -64.86.63.192 - 64.86.63.255 us +64.86.62.0 - 64.86.63.255 us 64.86.64.0 - 64.86.67.255 ec -64.86.68.0 - 64.86.69.255 ca -64.86.70.0 - 64.86.70.255 us +64.86.68.0 - 64.86.70.255 us 64.86.71.0 - 64.86.71.255 ca 64.86.72.0 - 64.86.75.255 mp 64.86.76.0 - 64.86.76.255 mh -64.86.77.0 - 64.86.77.255 ca -64.86.78.0 - 64.86.79.255 us -64.86.80.0 - 64.86.84.159 ca -64.86.84.160 - 64.86.84.175 us -64.86.84.176 - 64.86.87.255 ca -64.86.88.0 - 64.86.88.63 fr -64.86.88.64 - 64.86.88.127 ca -64.86.88.128 - 64.86.88.191 us -64.86.88.192 - 64.86.89.63 ca -64.86.89.64 - 64.86.89.127 us -64.86.89.128 - 64.86.90.255 ca -64.86.91.0 - 64.86.91.255 us -64.86.92.0 - 64.86.98.255 ca +64.86.77.0 - 64.86.89.255 us +64.86.90.0 - 64.86.90.255 ca +64.86.91.0 - 64.86.95.255 us +64.86.96.0 - 64.86.98.255 ca 64.86.99.0 - 64.86.99.255 us 64.86.100.0 - 64.86.100.255 ca -64.86.101.0 - 64.86.101.31 us -64.86.101.32 - 64.86.101.127 ca -64.86.101.128 - 64.86.101.159 us -64.86.101.160 - 64.86.101.223 ca -64.86.101.224 - 64.86.101.255 us -64.86.102.0 - 64.86.103.255 ca -64.86.104.0 - 64.86.105.127 us -64.86.105.128 - 64.86.105.223 ca -64.86.105.224 - 64.86.106.63 us -64.86.106.64 - 64.86.107.95 ca -64.86.107.96 - 64.86.107.127 bd -64.86.107.128 - 64.86.107.255 us -64.86.108.0 - 64.86.113.255 ca -64.86.114.0 - 64.86.114.255 us -64.86.115.0 - 64.86.115.255 ca -64.86.116.0 - 64.86.117.255 us -64.86.118.0 - 64.86.118.255 ca -64.86.119.0 - 64.86.119.31 za -64.86.119.32 - 64.86.119.63 us -64.86.119.64 - 64.86.119.255 ca -64.86.120.0 - 64.86.120.255 us +64.86.101.0 - 64.86.107.255 us +64.86.108.0 - 64.86.110.31 ca +64.86.110.32 - 64.86.120.255 us 64.86.121.0 - 64.86.122.255 pk 64.86.123.0 - 64.86.124.255 us -64.86.125.0 - 64.86.127.255 ca -64.86.128.0 - 64.86.128.255 us -64.86.129.0 - 64.86.129.255 ca -64.86.130.0 - 64.86.130.255 us +64.86.125.0 - 64.86.125.255 ca +64.86.126.0 - 64.86.130.255 us 64.86.131.0 - 64.86.131.255 pk -64.86.132.0 - 64.86.135.255 ca -64.86.136.0 - 64.86.137.255 us -64.86.138.0 - 64.86.138.63 ca -64.86.138.64 - 64.86.138.95 us -64.86.138.96 - 64.86.139.31 ca -64.86.139.32 - 64.86.139.63 us -64.86.139.64 - 64.86.141.255 ca +64.86.132.0 - 64.86.139.255 us +64.86.140.0 - 64.86.141.255 ca 64.86.142.0 - 64.86.144.255 us 64.86.145.0 - 64.86.145.255 hn -64.86.146.0 - 64.86.147.255 ca -64.86.148.0 - 64.86.149.255 us -64.86.150.0 - 64.86.171.255 ca -64.86.172.0 - 64.86.172.255 us -64.86.173.0 - 64.86.173.31 ca -64.86.173.32 - 64.86.173.63 us -64.86.173.64 - 64.86.183.255 ca -64.86.184.0 - 64.86.184.255 us -64.86.185.0 - 64.86.185.255 ca -64.86.186.0 - 64.86.186.15 us -64.86.186.16 - 64.86.191.255 ca -64.86.192.0 - 64.86.192.255 us +64.86.146.0 - 64.86.152.255 us +64.86.153.0 - 64.86.159.255 ca +64.86.160.0 - 64.86.175.255 us +64.86.176.0 - 64.86.179.255 ca +64.86.180.0 - 64.86.186.255 us +64.86.187.0 - 64.86.187.255 ca +64.86.188.0 - 64.86.192.255 us 64.86.193.0 - 64.86.193.255 ca 64.86.194.0 - 64.86.195.255 pw -64.86.196.0 - 64.86.209.255 ca +64.86.196.0 - 64.86.200.175 us +64.86.200.176 - 64.86.200.191 fr +64.86.200.192 - 64.86.209.255 us 64.86.210.0 - 64.86.211.255 zm -64.86.212.0 - 64.86.213.255 ca -64.86.214.0 - 64.86.214.255 us +64.86.212.0 - 64.86.214.255 us 64.86.215.0 - 64.86.215.255 ca 64.86.216.0 - 64.86.223.255 cr 64.86.224.0 - 64.86.225.255 co -64.86.226.0 - 64.86.231.255 ca -64.86.232.0 - 64.86.239.255 us -64.86.240.0 - 64.86.251.255 ca -64.86.252.0 - 64.86.252.255 us -64.86.253.0 - 64.86.254.255 ca -64.86.255.0 - 64.86.255.31 pw -64.86.255.32 - 64.86.255.127 ca -64.86.255.128 - 64.86.255.255 au -64.87.0.0 - 64.87.63.255 us +64.86.226.0 - 64.86.226.255 ca +64.86.227.0 - 64.86.243.63 us +64.86.243.64 - 64.86.243.79 ca +64.86.243.80 - 64.87.63.255 us 64.87.64.0 - 64.87.255.255 ca 64.88.0.0 - 64.88.225.255 us 64.88.226.0 - 64.88.226.255 gb 64.88.227.0 - 64.88.227.255 us 64.88.228.0 - 64.88.228.255 au 64.88.229.0 - 64.88.255.255 us -64.89.0.0 - 64.89.7.167 pr -64.89.7.168 - 64.89.7.175 us -64.89.7.176 - 64.89.15.255 pr -64.89.16.0 - 64.89.42.111 us -64.89.42.112 - 64.89.42.127 in -64.89.42.128 - 64.89.191.255 us +64.89.0.0 - 64.89.15.255 pr +64.89.16.0 - 64.89.191.255 us 64.89.192.0 - 64.89.207.255 pr 64.89.208.0 - 64.90.95.255 us 64.90.96.0 - 64.90.111.255 ca -64.90.112.0 - 64.92.221.159 us -64.92.221.160 - 64.92.221.175 ru -64.92.221.176 - 64.93.82.223 us -64.93.82.224 - 64.93.82.239 nz -64.93.82.240 - 64.93.95.255 us +64.90.112.0 - 64.90.113.255 us +64.90.114.0 - 64.90.115.255 nl +64.90.116.0 - 64.93.95.255 us 64.93.96.0 - 64.93.111.255 ca -64.93.112.0 - 64.94.163.63 us -64.94.163.64 - 64.94.163.95 au -64.94.163.96 - 64.94.164.103 us -64.94.164.104 - 64.94.164.111 il -64.94.164.112 - 64.94.172.31 us -64.94.172.32 - 64.94.172.63 ie -64.94.172.64 - 64.94.172.191 us -64.94.172.192 - 64.94.172.223 ca -64.94.172.224 - 64.94.200.159 us -64.94.200.160 - 64.94.200.191 gb -64.94.200.192 - 64.94.236.255 us +64.93.112.0 - 64.94.236.255 us 64.94.237.0 - 64.94.237.255 gb -64.94.238.0 - 64.95.103.255 us -64.95.104.0 - 64.95.111.255 ca -64.95.112.0 - 64.95.211.239 us -64.95.211.240 - 64.95.211.247 gt -64.95.211.248 - 64.95.245.63 us -64.95.245.64 - 64.95.245.127 ar -64.95.245.128 - 64.95.255.255 us -64.96.0.0 - 64.99.255.255 ca -64.100.0.0 - 64.106.133.139 us -64.106.133.140 - 64.106.133.149 it -64.106.133.150 - 64.106.134.49 us -64.106.134.50 - 64.106.134.59 ca -64.106.134.60 - 64.106.134.169 us -64.106.134.170 - 64.106.134.179 br -64.106.134.180 - 64.106.135.29 us -64.106.135.30 - 64.106.135.39 gb -64.106.135.40 - 64.106.135.59 us -64.106.135.60 - 64.106.135.69 gb -64.106.135.70 - 64.106.135.159 us -64.106.135.160 - 64.106.135.169 br -64.106.135.170 - 64.106.136.109 us -64.106.136.110 - 64.106.136.119 ae -64.106.136.120 - 64.106.140.39 us -64.106.140.40 - 64.106.140.59 ca -64.106.140.60 - 64.106.141.139 us -64.106.141.140 - 64.106.141.149 sy -64.106.141.150 - 64.106.142.49 us -64.106.142.50 - 64.106.142.59 qa -64.106.142.60 - 64.106.142.89 us -64.106.142.90 - 64.106.142.99 qa -64.106.142.100 - 64.106.142.179 us -64.106.142.180 - 64.106.142.189 qa -64.106.142.190 - 64.106.143.29 us -64.106.143.30 - 64.106.143.39 ca -64.106.143.40 - 64.106.143.49 nz -64.106.143.50 - 64.106.143.219 us -64.106.143.220 - 64.106.143.229 lb -64.106.143.230 - 64.106.144.59 us -64.106.144.60 - 64.106.144.69 it -64.106.144.70 - 64.106.144.209 us -64.106.144.210 - 64.106.144.219 be -64.106.144.220 - 64.106.145.169 us -64.106.145.170 - 64.106.145.179 be -64.106.145.180 - 64.106.146.169 us -64.106.146.170 - 64.106.146.179 jo -64.106.146.180 - 64.106.148.79 us -64.106.148.80 - 64.106.148.89 ca -64.106.148.90 - 64.106.150.89 us -64.106.150.90 - 64.106.150.99 au -64.106.150.100 - 64.106.150.119 us -64.106.150.120 - 64.106.150.129 ca -64.106.150.130 - 64.106.150.149 us -64.106.150.150 - 64.106.150.159 au -64.106.150.160 - 64.106.152.189 us -64.106.152.190 - 64.106.152.209 br -64.106.152.210 - 64.106.152.229 us -64.106.152.230 - 64.106.152.249 gb -64.106.152.250 - 64.106.156.49 us -64.106.156.50 - 64.106.156.79 nz -64.106.156.80 - 64.106.156.199 us -64.106.156.200 - 64.106.156.229 se -64.106.156.230 - 64.106.157.49 us -64.106.157.50 - 64.106.157.59 in -64.106.157.60 - 64.106.158.39 us -64.106.158.40 - 64.106.158.49 ua -64.106.158.50 - 64.106.158.59 us -64.106.158.60 - 64.106.158.69 ca -64.106.158.70 - 64.106.158.89 us -64.106.158.90 - 64.106.158.99 kh -64.106.158.100 - 64.106.158.129 us -64.106.158.130 - 64.106.158.149 kh -64.106.158.150 - 64.106.158.199 us -64.106.158.200 - 64.106.158.209 it -64.106.158.210 - 64.106.160.29 us -64.106.160.30 - 64.106.160.39 jp -64.106.160.40 - 64.106.160.49 ca -64.106.160.50 - 64.106.170.159 us -64.106.170.160 - 64.106.170.191 qa -64.106.170.192 - 64.106.174.9 us -64.106.174.10 - 64.106.174.19 nz -64.106.174.20 - 64.106.174.29 lb -64.106.174.30 - 64.106.174.49 us -64.106.174.50 - 64.106.174.59 dk -64.106.174.60 - 64.106.196.191 us -64.106.196.192 - 64.106.196.207 jo -64.106.196.208 - 64.106.200.59 us -64.106.200.60 - 64.106.200.69 in -64.106.200.70 - 64.106.201.139 us -64.106.201.140 - 64.106.201.159 ua -64.106.201.160 - 64.106.201.169 ga -64.106.201.170 - 64.106.201.209 us -64.106.201.210 - 64.106.201.219 lb -64.106.201.220 - 64.106.202.199 us -64.106.202.200 - 64.106.202.209 ua -64.106.202.210 - 64.106.205.69 us -64.106.205.70 - 64.106.205.79 gr -64.106.205.80 - 64.106.205.149 us -64.106.205.150 - 64.106.205.159 gr -64.106.205.160 - 64.106.205.169 gb -64.106.205.170 - 64.106.206.119 us -64.106.206.120 - 64.106.206.129 ca -64.106.206.130 - 64.106.206.229 us -64.106.206.230 - 64.106.206.239 se -64.106.206.240 - 64.106.207.39 us -64.106.207.40 - 64.106.207.49 ca -64.106.207.50 - 64.106.217.19 us -64.106.217.20 - 64.106.217.29 ca -64.106.217.30 - 64.106.218.63 us -64.106.218.64 - 64.106.218.127 no -64.106.218.128 - 64.106.226.195 us -64.106.226.196 - 64.106.226.227 qa -64.106.226.228 - 64.106.229.69 us -64.106.229.70 - 64.106.229.79 nz -64.106.229.80 - 64.106.229.89 ca -64.106.229.90 - 64.106.229.239 us -64.106.229.240 - 64.106.229.249 ca -64.106.229.250 - 64.106.230.19 us -64.106.230.20 - 64.106.230.39 ca -64.106.230.40 - 64.106.231.99 us -64.106.231.100 - 64.106.231.109 es -64.106.231.110 - 64.106.231.139 us -64.106.231.140 - 64.106.231.149 il -64.106.231.150 - 64.106.231.179 us -64.106.231.180 - 64.106.231.189 es -64.106.231.190 - 64.106.231.199 us -64.106.231.200 - 64.106.231.229 ca -64.106.231.230 - 64.106.232.31 us -64.106.232.32 - 64.106.232.63 qa -64.106.232.64 - 64.106.238.255 us -64.106.239.0 - 64.106.239.127 ca -64.106.239.128 - 64.106.242.9 us -64.106.242.10 - 64.106.242.19 gb -64.106.242.20 - 64.108.4.135 us -64.108.4.136 - 64.108.4.143 pr -64.108.4.144 - 64.110.15.255 us -64.110.28.0 - 64.110.28.255 a2 +64.94.238.0 - 64.95.187.255 us +64.95.188.0 - 64.95.189.255 gb +64.95.190.0 - 64.95.220.255 us +64.95.221.0 - 64.95.221.255 ca +64.95.222.0 - 64.95.255.255 us +64.96.0.0 - 64.97.255.255 ky +64.98.0.0 - 64.98.239.255 ca +64.98.240.0 - 64.98.255.255 us +64.99.0.0 - 64.99.255.255 ca +64.100.0.0 - 64.103.25.232 us +64.103.25.233 - 64.103.25.233 eu +64.103.25.234 - 64.103.36.255 us +64.103.37.0 - 64.103.37.255 eu +64.103.38.0 - 64.103.79.255 us +64.103.80.0 - 64.103.80.255 gb +64.103.81.0 - 64.103.87.255 us +64.103.88.0 - 64.103.88.255 gb +64.103.89.0 - 64.104.43.255 us +64.104.44.0 - 64.104.44.255 jp +64.104.45.0 - 64.104.94.255 us +64.104.95.0 - 64.104.95.255 ap +64.104.96.0 - 64.104.124.255 us +64.104.125.0 - 64.104.125.255 cn +64.104.126.0 - 64.104.206.255 us +64.104.207.0 - 64.104.207.255 au +64.104.208.0 - 64.104.247.255 us +64.104.248.0 - 64.104.249.255 au +64.104.250.0 - 64.110.27.255 us +64.110.28.0 - 64.110.28.255 de 64.110.29.0 - 64.110.29.255 bh -64.110.30.0 - 64.110.30.255 a2 +64.110.30.0 - 64.110.30.255 de 64.110.31.0 - 64.110.31.255 bh -64.110.32.0 - 64.110.36.255 a2 +64.110.32.0 - 64.110.36.255 de 64.110.37.0 - 64.110.37.255 bh -64.110.38.0 - 64.110.50.255 a2 +64.110.38.0 - 64.110.50.255 de 64.110.51.0 - 64.110.63.255 us -64.110.64.0 - 64.110.67.255 a2 +64.110.64.0 - 64.110.67.255 de 64.110.68.0 - 64.110.68.255 bh -64.110.69.0 - 64.110.72.255 a2 +64.110.69.0 - 64.110.72.255 de 64.110.73.0 - 64.110.73.255 bh -64.110.74.0 - 64.110.85.31 a2 -64.110.85.32 - 64.110.85.63 id -64.110.85.64 - 64.110.127.255 a2 +64.110.74.0 - 64.110.127.255 de 64.110.128.0 - 64.110.143.255 us 64.110.144.0 - 64.110.147.255 a2 64.110.148.0 - 64.110.152.255 us @@ -19258,478 +14845,90 @@ 64.111.82.0 - 64.111.82.255 ca 64.111.83.0 - 64.111.85.255 us 64.111.86.0 - 64.111.95.255 ca -64.111.96.0 - 64.112.158.255 us -64.112.159.0 - 64.112.159.255 vi -64.112.160.0 - 64.113.255.255 us +64.111.96.0 - 64.113.255.255 us 64.114.0.0 - 64.114.255.255 ca -64.115.0.0 - 64.116.96.31 us -64.116.96.32 - 64.116.96.39 co -64.116.96.40 - 64.116.96.47 us -64.116.96.48 - 64.116.96.55 co -64.116.96.56 - 64.116.96.167 us -64.116.96.168 - 64.116.96.191 co -64.116.96.192 - 64.116.98.31 us -64.116.98.32 - 64.116.98.63 co -64.116.98.64 - 64.116.98.95 us -64.116.98.96 - 64.116.98.127 co -64.116.98.128 - 64.116.99.255 us +64.115.0.0 - 64.116.99.255 us 64.116.100.0 - 64.116.101.255 co -64.116.102.0 - 64.116.129.55 us -64.116.129.56 - 64.116.129.63 ve -64.116.129.64 - 64.116.129.95 us -64.116.129.96 - 64.116.129.111 ve -64.116.129.112 - 64.116.129.159 us -64.116.129.160 - 64.116.129.175 ve -64.116.129.176 - 64.116.129.223 us -64.116.129.224 - 64.116.129.255 ve -64.116.130.0 - 64.116.131.127 us +64.116.102.0 - 64.116.131.127 us 64.116.131.128 - 64.116.131.255 ve -64.116.132.0 - 64.116.132.23 us -64.116.132.24 - 64.116.132.31 ve -64.116.132.32 - 64.116.132.95 us -64.116.132.96 - 64.116.132.127 ve -64.116.132.128 - 64.116.132.143 us -64.116.132.144 - 64.116.132.191 ve -64.116.132.192 - 64.116.132.223 us -64.116.132.224 - 64.116.132.255 ve -64.116.133.0 - 64.116.134.71 us -64.116.134.72 - 64.116.134.95 ve -64.116.134.96 - 64.116.134.191 us -64.116.134.192 - 64.116.135.15 ve -64.116.135.16 - 64.116.135.47 us -64.116.135.48 - 64.116.135.95 ve -64.116.135.96 - 64.116.137.255 us +64.116.132.0 - 64.116.134.191 us +64.116.134.192 - 64.116.134.255 ve +64.116.135.0 - 64.116.137.255 us 64.116.138.0 - 64.116.139.255 ve 64.116.140.0 - 64.116.160.255 us -64.116.161.0 - 64.116.162.63 pa -64.116.162.64 - 64.116.163.255 us -64.116.164.0 - 64.116.164.7 pa -64.116.164.8 - 64.116.164.15 us -64.116.164.16 - 64.116.164.31 pa -64.116.164.32 - 64.116.164.63 ve -64.116.164.64 - 64.116.169.255 us -64.116.170.0 - 64.116.171.255 pa -64.116.172.0 - 64.116.172.95 us -64.116.172.96 - 64.116.172.111 pa -64.116.172.112 - 64.116.172.119 pr -64.116.172.120 - 64.116.183.255 us +64.116.161.0 - 64.116.161.255 pa +64.116.162.0 - 64.116.169.255 us +64.116.170.0 - 64.116.170.255 pa +64.116.171.0 - 64.116.183.255 us 64.116.184.0 - 64.116.191.255 pa 64.116.192.0 - 64.116.192.255 us -64.116.193.0 - 64.116.194.87 cl -64.116.194.88 - 64.116.194.95 us -64.116.194.96 - 64.116.194.119 cl -64.116.194.120 - 64.116.194.167 us -64.116.194.168 - 64.116.194.175 cl -64.116.194.176 - 64.116.194.223 us -64.116.194.224 - 64.116.194.239 cl -64.116.194.240 - 64.116.194.255 us +64.116.193.0 - 64.116.193.255 cl +64.116.194.0 - 64.116.194.255 us 64.116.195.0 - 64.116.207.255 cl 64.116.208.0 - 64.116.209.255 us 64.116.210.0 - 64.116.213.255 cl 64.116.214.0 - 64.116.215.255 us 64.116.216.0 - 64.116.223.255 cl -64.116.224.0 - 64.116.224.47 ar -64.116.224.48 - 64.116.224.71 us -64.116.224.72 - 64.116.224.127 ar -64.116.224.128 - 64.116.224.223 us -64.116.224.224 - 64.116.224.255 ar -64.116.225.0 - 64.116.225.15 us -64.116.225.16 - 64.116.225.135 ar -64.116.225.136 - 64.116.225.143 us -64.116.225.144 - 64.116.225.175 ar -64.116.225.176 - 64.116.225.191 us -64.116.225.192 - 64.116.225.207 ar -64.116.225.208 - 64.116.225.215 us -64.116.225.216 - 64.116.225.223 ar -64.116.225.224 - 64.116.225.255 us +64.116.224.0 - 64.116.225.255 us 64.116.226.0 - 64.116.227.255 ar -64.116.228.0 - 64.116.230.15 us -64.116.230.16 - 64.116.230.127 ar -64.116.230.128 - 64.116.230.175 us -64.116.230.176 - 64.116.230.223 ar -64.116.230.224 - 64.116.230.239 us -64.116.230.240 - 64.116.232.95 ar -64.116.232.96 - 64.116.232.127 us -64.116.232.128 - 64.116.232.159 ar -64.116.232.160 - 64.116.232.223 us -64.116.232.224 - 64.116.232.239 ar -64.116.232.240 - 64.116.233.63 us -64.116.233.64 - 64.116.233.127 ar -64.116.233.128 - 64.116.233.199 us -64.116.233.200 - 64.116.233.223 ar -64.116.233.224 - 64.116.233.255 us -64.116.234.0 - 64.116.234.63 ar -64.116.234.64 - 64.116.234.127 us -64.116.234.128 - 64.116.234.191 ar -64.116.234.192 - 64.116.238.127 us -64.116.238.128 - 64.116.238.191 ar -64.116.238.192 - 64.117.0.255 us +64.116.228.0 - 64.116.230.255 us +64.116.231.0 - 64.116.231.255 ar +64.116.232.0 - 64.117.0.255 us 64.117.1.0 - 64.117.1.255 pr 64.117.2.0 - 64.117.3.255 us 64.117.4.0 - 64.117.7.255 pr -64.117.8.0 - 64.117.13.255 us -64.117.14.0 - 64.117.14.255 pr -64.117.15.0 - 64.117.15.47 us -64.117.15.48 - 64.117.15.71 pr -64.117.15.72 - 64.117.15.151 us -64.117.15.152 - 64.117.15.159 ca -64.117.15.160 - 64.117.15.191 us -64.117.15.192 - 64.117.15.199 ca -64.117.15.200 - 64.117.15.207 us -64.117.15.208 - 64.117.15.255 pr -64.117.16.0 - 64.117.25.255 us +64.117.8.0 - 64.117.25.255 us 64.117.26.0 - 64.117.26.255 pr -64.117.27.0 - 64.117.38.63 us -64.117.38.64 - 64.117.38.127 pr -64.117.38.128 - 64.117.38.159 us -64.117.38.160 - 64.117.38.167 pr -64.117.38.168 - 64.117.38.183 us -64.117.38.184 - 64.117.38.191 pr -64.117.38.192 - 64.117.39.255 us +64.117.27.0 - 64.117.39.255 us 64.117.40.0 - 64.117.41.255 pr -64.117.42.0 - 64.117.42.31 us -64.117.42.32 - 64.117.42.63 pr -64.117.42.64 - 64.117.128.63 us -64.117.128.64 - 64.117.128.95 cl -64.117.128.96 - 64.117.130.95 us -64.117.130.96 - 64.117.130.111 cl -64.117.130.112 - 64.117.130.143 us -64.117.130.144 - 64.117.130.151 cl -64.117.130.152 - 64.117.131.255 us +64.117.42.0 - 64.117.45.255 us +64.117.46.0 - 64.117.46.255 mf +64.117.47.0 - 64.117.131.255 us 64.117.132.0 - 64.117.135.255 cl 64.117.136.0 - 64.117.139.255 us 64.117.140.0 - 64.117.143.255 cl 64.117.144.0 - 64.117.199.255 us 64.117.200.0 - 64.117.207.255 pa -64.117.208.0 - 64.117.208.31 co -64.117.208.32 - 64.117.208.63 br -64.117.208.64 - 64.117.208.135 us -64.117.208.136 - 64.117.208.143 br -64.117.208.144 - 64.117.209.191 us -64.117.209.192 - 64.117.209.207 br -64.117.209.208 - 64.117.209.215 us -64.117.209.216 - 64.117.209.223 br -64.117.209.224 - 64.117.209.231 us -64.117.209.232 - 64.117.209.247 br -64.117.209.248 - 64.117.209.255 us -64.117.210.0 - 64.117.210.95 br -64.117.210.96 - 64.117.210.127 us -64.117.210.128 - 64.117.210.191 br -64.117.210.192 - 64.118.15.255 us -64.118.16.0 - 64.118.31.239 ca -64.118.31.240 - 64.118.31.247 us -64.118.31.248 - 64.118.31.255 ca -64.118.32.0 - 64.118.48.7 us -64.118.48.8 - 64.118.48.15 a2 -64.118.48.16 - 64.118.48.47 us -64.118.48.48 - 64.118.48.159 a2 -64.118.48.160 - 64.118.48.223 us -64.118.48.224 - 64.118.49.255 a2 -64.118.50.0 - 64.118.50.107 us -64.118.50.108 - 64.118.50.119 a2 -64.118.50.120 - 64.118.50.239 us -64.118.50.240 - 64.118.50.247 a2 -64.118.50.248 - 64.118.50.251 us -64.118.50.252 - 64.118.51.7 a2 -64.118.51.8 - 64.118.51.31 us -64.118.51.32 - 64.118.51.39 a2 -64.118.51.40 - 64.118.51.167 us -64.118.51.168 - 64.118.51.175 a2 -64.118.51.176 - 64.118.51.207 us -64.118.51.208 - 64.118.51.215 a2 -64.118.51.216 - 64.118.51.223 us -64.118.51.224 - 64.118.51.255 a2 -64.118.52.0 - 64.118.57.7 us -64.118.57.8 - 64.118.57.15 a2 -64.118.57.16 - 64.118.57.23 us -64.118.57.24 - 64.118.57.255 a2 +64.117.208.0 - 64.117.208.72 us +64.117.208.73 - 64.117.208.73 br +64.117.208.74 - 64.118.15.255 us +64.118.16.0 - 64.118.31.255 ca +64.118.32.0 - 64.118.47.255 us +64.118.48.0 - 64.118.51.255 a2 +64.118.52.0 - 64.118.56.255 us +64.118.57.0 - 64.118.57.255 a2 64.118.58.0 - 64.119.95.255 us 64.119.96.0 - 64.119.127.255 ca -64.119.128.0 - 64.119.160.47 us -64.119.160.48 - 64.119.160.55 jp -64.119.160.56 - 64.119.160.103 us -64.119.160.104 - 64.119.160.119 gb -64.119.160.120 - 64.119.160.127 us -64.119.160.128 - 64.119.160.135 ae -64.119.160.136 - 64.119.160.175 us -64.119.160.176 - 64.119.160.191 mx -64.119.160.192 - 64.119.160.199 us -64.119.160.200 - 64.119.160.207 ar -64.119.160.208 - 64.119.160.255 us -64.119.161.0 - 64.119.161.151 gb -64.119.161.152 - 64.119.161.159 us -64.119.161.160 - 64.119.161.191 ar -64.119.161.192 - 64.119.161.255 gb -64.119.162.0 - 64.119.162.7 ph -64.119.162.8 - 64.119.162.71 us -64.119.162.72 - 64.119.162.79 ar -64.119.162.80 - 64.119.162.87 us -64.119.162.88 - 64.119.162.95 ae -64.119.162.96 - 64.119.162.103 us -64.119.162.104 - 64.119.162.119 id -64.119.162.120 - 64.119.162.143 us -64.119.162.144 - 64.119.162.151 jp -64.119.162.152 - 64.119.162.255 us -64.119.163.0 - 64.119.163.7 my -64.119.163.8 - 64.119.163.199 us -64.119.163.200 - 64.119.163.223 ar -64.119.163.224 - 64.119.163.231 us -64.119.163.232 - 64.119.163.255 my -64.119.164.0 - 64.119.164.7 ar -64.119.164.8 - 64.119.164.87 us -64.119.164.88 - 64.119.164.95 ar -64.119.164.96 - 64.119.164.103 us -64.119.164.104 - 64.119.164.111 my -64.119.164.112 - 64.119.164.119 us -64.119.164.120 - 64.119.164.127 ar -64.119.164.128 - 64.119.164.183 us -64.119.164.184 - 64.119.164.191 ar -64.119.164.192 - 64.119.165.55 us -64.119.165.56 - 64.119.165.63 ar -64.119.165.64 - 64.119.165.143 us -64.119.165.144 - 64.119.165.151 hk -64.119.165.152 - 64.119.165.159 ar -64.119.165.160 - 64.119.165.207 us -64.119.165.208 - 64.119.165.223 ar -64.119.165.224 - 64.119.165.255 my -64.119.166.0 - 64.119.166.111 us -64.119.166.112 - 64.119.166.127 ph -64.119.166.128 - 64.119.167.191 us -64.119.167.192 - 64.119.167.207 my -64.119.167.208 - 64.119.168.127 us -64.119.168.128 - 64.119.168.151 ca -64.119.168.152 - 64.119.168.191 us -64.119.168.192 - 64.119.168.199 au -64.119.168.200 - 64.119.169.15 us -64.119.169.16 - 64.119.169.39 my -64.119.169.40 - 64.119.169.47 jp -64.119.169.48 - 64.119.169.127 us -64.119.169.128 - 64.119.169.135 my -64.119.169.136 - 64.119.169.207 us -64.119.169.208 - 64.119.169.215 my -64.119.169.216 - 64.119.169.255 us -64.119.170.0 - 64.119.170.23 de -64.119.170.24 - 64.119.170.39 us -64.119.170.40 - 64.119.170.63 ph -64.119.170.64 - 64.119.170.71 us -64.119.170.72 - 64.119.170.95 my -64.119.170.96 - 64.119.170.143 ar -64.119.170.144 - 64.119.171.79 us -64.119.171.80 - 64.119.171.103 my -64.119.171.104 - 64.119.171.127 us -64.119.171.128 - 64.119.171.135 ar -64.119.171.136 - 64.119.171.159 us -64.119.171.160 - 64.119.171.191 my -64.119.171.192 - 64.119.171.215 us -64.119.171.216 - 64.119.171.255 ar -64.119.172.0 - 64.119.175.31 us -64.119.175.32 - 64.119.175.47 ae -64.119.175.48 - 64.119.175.95 us -64.119.175.96 - 64.119.175.111 lb -64.119.175.112 - 64.119.178.55 us -64.119.178.56 - 64.119.178.63 it -64.119.178.64 - 64.119.178.71 au -64.119.178.72 - 64.119.184.47 us -64.119.184.48 - 64.119.184.55 au -64.119.184.56 - 64.119.186.127 us -64.119.186.128 - 64.119.186.135 gb -64.119.186.136 - 64.119.187.63 us -64.119.187.64 - 64.119.187.71 kh -64.119.187.72 - 64.119.188.15 us -64.119.188.16 - 64.119.188.31 au -64.119.188.32 - 64.119.189.111 us -64.119.189.112 - 64.119.189.119 ph -64.119.189.120 - 64.119.191.255 us +64.119.128.0 - 64.119.191.255 us 64.119.192.0 - 64.119.207.255 bb 64.119.208.0 - 64.119.223.255 ca -64.119.224.0 - 64.120.7.255 us -64.120.8.0 - 64.120.8.15 ca -64.120.8.16 - 64.120.8.31 us -64.120.8.32 - 64.120.8.39 ca -64.120.8.40 - 64.120.8.127 us -64.120.8.128 - 64.120.8.135 ca -64.120.8.136 - 64.120.8.143 us -64.120.8.144 - 64.120.8.151 ca -64.120.8.152 - 64.120.9.55 us -64.120.9.56 - 64.120.9.63 ca -64.120.9.64 - 64.120.9.127 us -64.120.9.128 - 64.120.9.135 ca -64.120.9.136 - 64.120.14.95 us -64.120.14.96 - 64.120.14.103 lk -64.120.14.104 - 64.120.14.159 us -64.120.14.160 - 64.120.14.191 in -64.120.14.192 - 64.120.20.151 us -64.120.20.152 - 64.120.20.159 in -64.120.20.160 - 64.120.20.247 us -64.120.20.248 - 64.120.20.255 in -64.120.21.0 - 64.120.22.39 us -64.120.22.40 - 64.120.22.47 in -64.120.22.48 - 64.120.22.55 us -64.120.22.56 - 64.120.22.63 in -64.120.22.64 - 64.120.22.71 us -64.120.22.72 - 64.120.22.79 in -64.120.22.80 - 64.120.22.127 us -64.120.22.128 - 64.120.22.135 in -64.120.22.136 - 64.120.22.143 us -64.120.22.144 - 64.120.22.151 in -64.120.22.152 - 64.120.22.159 lk -64.120.22.160 - 64.120.22.167 in -64.120.22.168 - 64.120.22.239 us -64.120.22.240 - 64.120.22.247 in -64.120.22.248 - 64.120.23.127 us -64.120.23.128 - 64.120.23.159 in -64.120.23.160 - 64.120.25.111 us -64.120.25.112 - 64.120.25.119 ca -64.120.25.120 - 64.120.25.127 in -64.120.25.128 - 64.120.28.39 us -64.120.28.40 - 64.120.28.47 ca -64.120.28.48 - 64.120.28.87 us -64.120.28.88 - 64.120.28.95 ca -64.120.28.96 - 64.120.28.135 us -64.120.28.136 - 64.120.28.143 ca -64.120.28.144 - 64.120.28.231 us -64.120.28.232 - 64.120.28.239 ca -64.120.28.240 - 64.120.41.191 us -64.120.41.192 - 64.120.41.199 gb -64.120.41.200 - 64.120.50.7 us -64.120.50.8 - 64.120.50.15 gb -64.120.50.16 - 64.120.53.63 us -64.120.53.64 - 64.120.53.79 ca -64.120.53.80 - 64.120.76.175 us -64.120.76.176 - 64.120.76.183 ca -64.120.76.184 - 64.123.2.23 us -64.123.2.24 - 64.123.2.31 pr -64.123.2.32 - 64.123.4.119 us -64.123.4.120 - 64.123.4.127 pr -64.123.4.128 - 64.123.233.239 us -64.123.233.240 - 64.123.233.247 pr -64.123.233.248 - 64.124.17.23 us -64.124.17.24 - 64.124.17.31 fi -64.124.17.32 - 64.124.150.63 us -64.124.150.64 - 64.124.150.127 il -64.124.150.128 - 64.124.170.15 us -64.124.170.16 - 64.124.170.23 gb -64.124.170.24 - 64.124.170.127 us -64.124.170.128 - 64.124.170.143 gb -64.124.170.144 - 64.124.172.255 us -64.124.173.0 - 64.124.173.63 de -64.124.173.64 - 64.124.229.223 us -64.124.229.224 - 64.124.229.231 gb -64.124.229.232 - 64.125.129.23 us -64.125.129.24 - 64.125.129.31 as -64.125.129.32 - 64.127.102.255 us -64.127.103.0 - 64.127.103.7 cn -64.127.103.8 - 64.127.105.223 us -64.127.105.224 - 64.127.105.231 ca -64.127.105.232 - 64.127.112.111 us -64.127.112.112 - 64.127.112.127 au -64.127.112.128 - 64.127.125.159 us -64.127.125.160 - 64.127.125.175 ca -64.127.125.176 - 64.128.31.255 us +64.119.224.0 - 64.120.129.255 us +64.120.130.0 - 64.120.130.255 de +64.120.131.0 - 64.128.31.255 us 64.128.32.0 - 64.128.39.255 a2 64.128.40.0 - 64.130.207.255 us -64.130.208.0 - 64.130.209.255 ca -64.130.210.0 - 64.130.210.207 us -64.130.210.208 - 64.130.223.255 ca -64.130.224.0 - 64.131.66.144 us -64.131.66.145 - 64.131.66.148 gb -64.131.66.149 - 64.131.69.80 us -64.131.69.81 - 64.131.69.82 hn -64.131.69.83 - 64.131.73.5 us -64.131.73.6 - 64.131.73.9 ca -64.131.73.10 - 64.131.76.14 us -64.131.76.15 - 64.131.76.18 in -64.131.76.19 - 64.131.80.220 us -64.131.80.221 - 64.131.80.224 in -64.131.80.225 - 64.131.80.240 us -64.131.80.241 - 64.131.80.243 mx -64.131.80.244 - 64.131.81.106 us -64.131.81.107 - 64.131.81.110 in -64.131.81.111 - 64.131.81.116 us -64.131.81.117 - 64.131.81.120 in -64.131.81.121 - 64.131.81.229 us -64.131.81.230 - 64.131.81.233 in -64.131.81.234 - 64.131.82.83 us -64.131.82.84 - 64.131.82.91 ca -64.131.82.92 - 64.131.83.31 us -64.131.83.32 - 64.131.83.39 gb -64.131.83.40 - 64.131.83.47 us -64.131.83.48 - 64.131.83.63 gb -64.131.83.64 - 64.131.83.111 us -64.131.83.112 - 64.131.83.119 be -64.131.83.120 - 64.131.83.127 us -64.131.83.128 - 64.131.83.135 gb -64.131.83.136 - 64.131.83.183 us -64.131.83.184 - 64.131.83.191 gb -64.131.83.192 - 64.131.84.191 us -64.131.84.192 - 64.131.84.255 nl -64.131.85.0 - 64.131.85.31 ca -64.131.85.32 - 64.131.88.7 us -64.131.88.8 - 64.131.88.15 sa -64.131.88.16 - 64.131.88.23 ca -64.131.88.24 - 64.131.88.31 gb -64.131.88.32 - 64.131.88.47 us -64.131.88.48 - 64.131.88.55 it -64.131.88.56 - 64.131.88.71 us -64.131.88.72 - 64.131.88.79 gb -64.131.88.80 - 64.131.88.167 us -64.131.88.168 - 64.131.88.175 my -64.131.88.176 - 64.131.88.199 us -64.131.88.200 - 64.131.88.207 gr -64.131.88.208 - 64.131.88.215 it -64.131.88.216 - 64.131.88.239 us -64.131.88.240 - 64.131.88.247 gb -64.131.88.248 - 64.131.92.63 us -64.131.92.64 - 64.131.92.79 it -64.131.92.80 - 64.131.93.63 us -64.131.93.64 - 64.131.93.95 ru -64.131.93.96 - 64.132.104.255 us +64.130.208.0 - 64.130.223.255 ca +64.130.224.0 - 64.132.104.255 us 64.132.105.0 - 64.132.105.255 a2 -64.132.106.0 - 64.132.162.191 us -64.132.162.192 - 64.132.162.207 in -64.132.162.208 - 64.135.128.35 us -64.135.128.36 - 64.135.128.39 me -64.135.128.40 - 64.136.97.255 us +64.132.106.0 - 64.136.111.255 us 64.136.112.0 - 64.136.127.255 ca -64.136.128.0 - 64.138.10.95 us -64.138.10.96 - 64.138.10.103 sg -64.138.10.104 - 64.138.11.159 us -64.138.11.160 - 64.138.11.191 sg -64.138.11.192 - 64.139.132.191 us -64.139.132.192 - 64.139.132.223 ca -64.139.132.224 - 64.139.134.223 us -64.139.134.224 - 64.139.134.255 ca -64.139.135.0 - 64.140.111.255 us -64.140.112.0 - 64.140.125.79 ca -64.140.125.80 - 64.140.125.95 us -64.140.125.96 - 64.140.127.255 ca -64.140.128.0 - 64.140.139.255 us -64.140.140.0 - 64.140.140.255 ca -64.140.141.0 - 64.140.255.255 us +64.136.128.0 - 64.137.127.255 us +64.137.128.0 - 64.137.255.255 ca +64.138.0.0 - 64.138.10.255 us +64.138.11.0 - 64.138.11.255 sg +64.138.12.0 - 64.138.20.255 us +64.138.21.0 - 64.138.21.255 in +64.138.22.0 - 64.140.111.255 us +64.140.112.0 - 64.140.127.255 ca +64.140.128.0 - 64.140.255.255 us 64.141.0.0 - 64.141.127.255 ca -64.141.128.0 - 64.145.66.223 us -64.145.66.224 - 64.145.66.239 gb -64.145.66.240 - 64.145.74.255 us -64.145.75.0 - 64.145.75.255 gb -64.145.76.0 - 64.145.77.191 us -64.145.77.192 - 64.145.77.207 gb -64.145.77.208 - 64.145.79.255 us -64.145.80.0 - 64.145.80.255 ca -64.145.81.0 - 64.147.79.255 us +64.141.128.0 - 64.145.89.255 us +64.145.90.0 - 64.145.91.255 jp +64.145.92.0 - 64.147.79.255 us 64.147.80.0 - 64.147.95.255 bm -64.147.96.0 - 64.147.164.127 us -64.147.164.128 - 64.147.164.191 ca -64.147.164.192 - 64.147.239.255 us +64.147.96.0 - 64.147.239.255 us 64.147.240.0 - 64.147.255.255 ca -64.148.0.0 - 64.148.178.191 us -64.148.178.192 - 64.148.178.223 is -64.148.178.224 - 64.150.181.42 us -64.150.181.43 - 64.150.181.51 de -64.150.181.52 - 64.150.181.154 us -64.150.181.155 - 64.150.181.165 br -64.150.181.166 - 64.150.186.114 us -64.150.186.115 - 64.150.186.146 cy -64.150.186.147 - 64.150.191.255 us +64.148.0.0 - 64.150.191.255 us 64.150.192.0 - 64.150.255.255 bs 64.151.0.0 - 64.151.191.255 us 64.151.192.0 - 64.151.255.255 ca @@ -19737,9 +14936,9 @@ 64.152.136.0 - 64.152.143.255 pr 64.152.144.0 - 64.157.142.255 us 64.157.143.0 - 64.157.143.255 ca -64.157.144.0 - 64.161.209.247 us -64.161.209.248 - 64.161.209.255 pr -64.161.210.0 - 64.178.127.255 us +64.157.144.0 - 64.158.222.255 us +64.158.223.0 - 64.158.223.255 nl +64.158.224.0 - 64.178.127.255 us 64.178.128.0 - 64.178.159.255 ca 64.178.160.0 - 64.178.191.255 us 64.178.192.0 - 64.178.197.255 pr @@ -19749,386 +14948,139 @@ 64.179.208.0 - 64.179.223.255 ca 64.179.224.0 - 64.179.255.255 us 64.180.0.0 - 64.180.255.255 ca -64.181.0.0 - 64.182.1.24 us -64.182.1.25 - 64.182.1.32 bz -64.182.1.33 - 64.182.1.162 us -64.182.1.163 - 64.182.1.171 is -64.182.1.172 - 64.182.1.206 us -64.182.1.207 - 64.182.1.215 fr -64.182.1.216 - 64.182.3.72 us -64.182.3.73 - 64.182.3.81 hk -64.182.3.82 - 64.182.3.135 us -64.182.3.136 - 64.182.3.144 ca -64.182.3.145 - 64.182.3.153 nl -64.182.3.154 - 64.182.3.198 us -64.182.3.199 - 64.182.3.207 is -64.182.3.208 - 64.182.3.242 us -64.182.3.243 - 64.182.3.251 cz -64.182.3.252 - 64.182.4.55 us -64.182.4.56 - 64.182.4.63 nl -64.182.4.64 - 64.182.4.228 us -64.182.4.229 - 64.182.4.236 gr -64.182.4.237 - 64.182.4.244 ge -64.182.4.245 - 64.182.7.160 us -64.182.7.161 - 64.182.7.168 ir -64.182.7.169 - 64.182.7.186 us -64.182.7.187 - 64.182.7.195 mx -64.182.7.196 - 64.182.7.212 us -64.182.7.213 - 64.182.7.221 it -64.182.7.222 - 64.182.9.8 us -64.182.9.9 - 64.182.9.16 lb -64.182.9.17 - 64.182.9.32 us -64.182.9.33 - 64.182.9.40 as -64.182.9.41 - 64.182.11.159 us -64.182.11.160 - 64.182.11.167 ws -64.182.11.168 - 64.182.11.199 us -64.182.11.200 - 64.182.11.207 ws -64.182.11.208 - 64.182.13.119 us -64.182.13.120 - 64.182.13.127 ci -64.182.13.128 - 64.182.13.136 us -64.182.13.137 - 64.182.13.144 cz -64.182.13.145 - 64.182.13.169 us -64.182.13.170 - 64.182.13.177 nl -64.182.13.178 - 64.182.14.0 us -64.182.14.1 - 64.182.14.9 ws -64.182.14.10 - 64.182.14.18 ca -64.182.14.19 - 64.182.33.81 us -64.182.33.82 - 64.182.33.89 fr -64.182.33.90 - 64.182.33.97 cz -64.182.33.98 - 64.182.33.115 us -64.182.33.116 - 64.182.33.123 it -64.182.33.124 - 64.182.35.72 us -64.182.35.73 - 64.182.35.81 ca -64.182.35.82 - 64.182.37.17 us -64.182.37.18 - 64.182.37.146 gr -64.182.37.147 - 64.182.37.179 us -64.182.37.180 - 64.182.37.197 fr -64.182.37.198 - 64.182.48.31 us -64.182.48.32 - 64.182.48.47 as -64.182.48.48 - 64.182.48.56 us -64.182.48.57 - 64.182.48.64 ws -64.182.48.65 - 64.182.48.74 us -64.182.48.75 - 64.182.48.92 mx -64.182.48.93 - 64.182.48.101 eg -64.182.48.102 - 64.182.48.242 us -64.182.48.243 - 64.182.48.251 ca -64.182.48.252 - 64.182.49.0 us -64.182.49.1 - 64.182.49.254 ca -64.182.49.255 - 64.182.50.82 us -64.182.50.83 - 64.182.50.91 fr -64.182.50.92 - 64.182.50.108 us -64.182.50.109 - 64.182.50.117 it -64.182.50.118 - 64.182.50.155 us -64.182.50.156 - 64.182.50.163 ca -64.182.50.164 - 64.182.50.198 us -64.182.50.199 - 64.182.50.206 hk -64.182.50.207 - 64.182.52.175 us -64.182.52.176 - 64.182.52.184 as -64.182.52.185 - 64.182.52.192 it -64.182.52.193 - 64.182.52.218 us -64.182.52.219 - 64.182.52.234 ws -64.182.52.235 - 64.182.56.16 us -64.182.56.17 - 64.182.56.24 ca -64.182.56.25 - 64.182.56.32 ws -64.182.56.33 - 64.182.56.193 us -64.182.56.194 - 64.182.56.202 tc -64.182.56.203 - 64.182.59.0 us -64.182.59.1 - 64.182.59.254 as -64.182.59.255 - 64.182.61.233 us -64.182.61.234 - 64.182.61.241 ca -64.182.61.242 - 64.182.62.56 us -64.182.62.57 - 64.182.62.64 sa -64.182.62.65 - 64.182.62.97 us -64.182.62.98 - 64.182.62.105 ca -64.182.62.106 - 64.182.63.70 us -64.182.63.71 - 64.182.63.80 eg -64.182.63.81 - 64.182.63.106 us -64.182.63.107 - 64.182.63.114 it -64.182.63.115 - 64.182.63.123 au -64.182.63.124 - 64.182.63.132 us -64.182.63.133 - 64.182.63.141 sn -64.182.63.142 - 64.182.63.157 us -64.182.63.158 - 64.182.63.165 fr -64.182.63.166 - 64.182.63.181 ca -64.182.63.182 - 64.182.112.151 us -64.182.112.152 - 64.182.112.159 as -64.182.112.160 - 64.184.191.255 us +64.181.0.0 - 64.184.191.255 us 64.184.192.0 - 64.184.223.255 ca 64.184.224.0 - 64.185.191.255 us 64.185.192.0 - 64.185.223.255 pr 64.185.224.0 - 64.186.255.255 us 64.187.0.0 - 64.187.63.255 ca -64.187.64.0 - 64.187.97.191 us -64.187.97.192 - 64.187.97.223 ca -64.187.97.224 - 64.187.98.31 us -64.187.98.32 - 64.187.98.63 ca -64.187.98.64 - 64.187.98.159 us -64.187.98.160 - 64.187.98.223 ca -64.187.98.224 - 64.187.99.191 us -64.187.99.192 - 64.187.99.223 ca -64.187.99.224 - 64.187.102.7 us -64.187.102.8 - 64.187.102.15 gb -64.187.102.16 - 64.187.102.47 us -64.187.102.48 - 64.187.102.55 ca -64.187.102.56 - 64.187.102.119 us -64.187.102.120 - 64.187.102.127 nz -64.187.102.128 - 64.187.102.167 us -64.187.102.168 - 64.187.102.175 ro -64.187.102.176 - 64.187.110.231 us -64.187.110.232 - 64.187.110.239 ca -64.187.110.240 - 64.187.118.127 us -64.187.118.128 - 64.187.118.143 it -64.187.118.144 - 64.187.123.119 us -64.187.123.120 - 64.187.123.127 br -64.187.123.128 - 64.187.123.207 us -64.187.123.208 - 64.187.123.215 br -64.187.123.216 - 64.187.127.159 us -64.187.127.160 - 64.187.127.175 ca -64.187.127.176 - 64.191.197.255 us -64.191.198.0 - 64.191.198.255 au -64.191.199.0 - 64.191.228.255 us -64.191.229.0 - 64.191.229.255 ca -64.191.230.0 - 64.192.130.127 us -64.192.130.128 - 64.192.130.255 pa -64.192.131.0 - 64.192.134.191 us -64.192.134.192 - 64.192.134.255 il -64.192.135.0 - 64.192.136.63 us -64.192.136.64 - 64.192.136.95 lb -64.192.136.96 - 64.193.121.255 us +64.187.64.0 - 64.187.175.255 us +64.187.176.0 - 64.187.191.255 ca +64.187.192.0 - 64.187.209.255 us +64.187.210.0 - 64.187.211.255 ca +64.187.212.0 - 64.191.31.255 us +64.191.32.0 - 64.191.47.255 ca +64.191.48.0 - 64.193.121.255 us 64.193.122.0 - 64.193.123.255 mp -64.193.124.0 - 64.194.80.255 us -64.194.81.0 - 64.194.81.63 bm -64.194.81.64 - 64.200.239.127 us -64.200.239.128 - 64.200.239.255 lb -64.200.240.0 - 64.201.31.255 us -64.201.32.0 - 64.201.34.79 ca -64.201.34.80 - 64.201.34.87 us -64.201.34.88 - 64.201.63.255 ca -64.201.64.0 - 64.201.106.135 us -64.201.106.136 - 64.201.106.139 ca -64.201.106.140 - 64.201.107.127 us -64.201.107.128 - 64.201.107.135 ca -64.201.107.136 - 64.201.110.255 us +64.193.124.0 - 64.201.31.255 us +64.201.32.0 - 64.201.63.255 ca +64.201.64.0 - 64.201.110.255 us 64.201.111.0 - 64.201.111.255 ca 64.201.112.0 - 64.201.159.255 us 64.201.160.0 - 64.201.223.255 ca -64.201.224.0 - 64.202.111.255 us -64.202.112.0 - 64.202.113.255 cy -64.202.114.0 - 64.202.121.255 us -64.202.122.0 - 64.202.122.255 gb -64.202.123.0 - 64.202.143.255 us +64.201.224.0 - 64.202.143.255 us 64.202.144.0 - 64.202.159.255 ca -64.202.160.0 - 64.208.181.255 us +64.202.160.0 - 64.208.48.255 us +64.208.49.0 - 64.208.49.255 eu +64.208.50.0 - 64.208.125.95 us +64.208.125.96 - 64.208.125.111 mx +64.208.125.112 - 64.208.158.135 us +64.208.158.136 - 64.208.158.143 de +64.208.158.144 - 64.208.161.255 us +64.208.162.0 - 64.208.162.255 ca +64.208.163.0 - 64.208.178.255 us +64.208.179.0 - 64.208.179.255 gb +64.208.180.0 - 64.208.181.255 us 64.208.182.0 - 64.208.182.255 ca -64.208.183.0 - 64.209.7.255 us +64.208.183.0 - 64.208.222.47 us +64.208.222.48 - 64.208.222.51 fr +64.208.222.52 - 64.209.7.255 us 64.209.8.0 - 64.209.15.255 pr 64.209.16.0 - 64.209.20.255 us 64.209.21.0 - 64.209.21.255 gb -64.209.22.0 - 64.209.221.95 us -64.209.221.96 - 64.209.221.111 tw -64.209.221.112 - 64.209.225.255 us +64.209.22.0 - 64.209.37.255 us +64.209.38.0 - 64.209.38.255 gb +64.209.39.0 - 64.209.109.131 us +64.209.109.132 - 64.209.109.135 gb +64.209.109.136 - 64.209.225.255 us 64.209.226.0 - 64.209.226.255 ca -64.209.227.0 - 64.209.230.127 us -64.209.230.128 - 64.209.230.159 ca -64.209.230.160 - 64.210.196.191 us -64.210.196.192 - 64.210.196.199 il -64.210.196.200 - 64.210.207.255 us -64.210.208.0 - 64.210.208.255 no -64.210.209.0 - 64.212.199.255 us +64.209.227.0 - 64.209.244.159 us +64.209.244.160 - 64.209.244.167 gb +64.209.244.168 - 64.209.244.223 us +64.209.244.224 - 64.209.245.127 hk +64.209.245.128 - 64.209.245.255 sg +64.209.246.0 - 64.210.14.193 us +64.210.14.194 - 64.210.14.194 jp +64.210.14.195 - 64.210.39.255 us +64.210.40.0 - 64.210.47.255 bb +64.210.48.0 - 64.211.75.31 us +64.211.75.32 - 64.211.75.63 gb +64.211.75.64 - 64.211.83.69 us +64.211.83.70 - 64.211.83.70 fr +64.211.83.71 - 64.211.93.255 us +64.211.94.0 - 64.211.94.255 mx +64.211.95.0 - 64.211.149.255 us +64.211.150.0 - 64.211.150.255 gb +64.211.151.0 - 64.211.219.127 us +64.211.219.128 - 64.211.219.255 vi +64.211.220.0 - 64.212.76.255 us +64.212.77.0 - 64.212.77.127 ve +64.212.77.128 - 64.212.199.255 us 64.212.200.0 - 64.212.200.255 pr -64.212.201.0 - 64.213.55.255 us +64.212.201.0 - 64.213.29.255 us +64.213.30.0 - 64.213.30.255 au +64.213.31.0 - 64.213.52.31 us +64.213.52.32 - 64.213.52.63 nl +64.213.52.64 - 64.213.55.255 us 64.213.56.0 - 64.213.63.255 pa -64.213.64.0 - 64.213.223.255 us +64.213.64.0 - 64.213.78.255 us +64.213.79.0 - 64.213.79.255 mx +64.213.80.0 - 64.213.97.191 us +64.213.97.192 - 64.213.97.223 fr +64.213.97.224 - 64.213.135.191 us +64.213.135.192 - 64.213.135.255 ca +64.213.136.0 - 64.213.166.81 us +64.213.166.82 - 64.213.166.82 gb +64.213.166.83 - 64.213.223.255 us 64.213.224.0 - 64.213.255.255 pr -64.214.0.0 - 64.215.119.255 us +64.214.0.0 - 64.214.65.255 us +64.214.66.0 - 64.214.66.255 za +64.214.67.0 - 64.214.126.159 us +64.214.126.160 - 64.214.126.191 ca +64.214.126.192 - 64.214.127.255 us +64.214.128.0 - 64.214.128.76 be +64.214.128.77 - 64.214.128.78 us +64.214.128.79 - 64.214.128.255 be +64.214.129.0 - 64.214.146.255 us +64.214.147.0 - 64.214.147.255 gb +64.214.148.0 - 64.215.20.175 us +64.215.20.176 - 64.215.20.183 br +64.215.20.184 - 64.215.21.255 us +64.215.22.0 - 64.215.22.255 br +64.215.23.0 - 64.215.27.255 us +64.215.28.0 - 64.215.28.255 gb +64.215.29.0 - 64.215.119.255 us 64.215.120.0 - 64.215.127.255 pa -64.215.128.0 - 64.216.4.255 us -64.216.5.0 - 64.216.5.7 pr -64.216.5.8 - 64.216.6.255 us -64.216.7.0 - 64.216.7.7 pr -64.216.7.8 - 64.216.50.47 us -64.216.50.48 - 64.216.50.55 pr -64.216.50.56 - 64.216.68.71 us -64.216.68.72 - 64.216.68.79 pr -64.216.68.80 - 64.216.69.255 us -64.216.70.0 - 64.216.70.15 pr -64.216.70.16 - 64.216.70.63 us -64.216.70.64 - 64.216.70.71 pr -64.216.70.72 - 64.216.70.79 us -64.216.70.80 - 64.216.70.87 pr -64.216.70.88 - 64.216.81.87 us -64.216.81.88 - 64.216.81.95 pr -64.216.81.96 - 64.216.81.167 us -64.216.81.168 - 64.216.81.183 pr -64.216.81.184 - 64.216.88.167 us -64.216.88.168 - 64.216.88.199 pr -64.216.88.200 - 64.216.88.207 us -64.216.88.208 - 64.216.88.215 pr -64.216.88.216 - 64.216.89.47 us -64.216.89.48 - 64.216.89.55 pr -64.216.89.56 - 64.216.138.175 us -64.216.138.176 - 64.216.138.183 pr -64.216.138.184 - 64.216.146.127 us -64.216.146.128 - 64.216.146.135 pr -64.216.146.136 - 64.216.146.239 us -64.216.146.240 - 64.216.146.247 pr -64.216.146.248 - 64.216.198.103 us -64.216.198.104 - 64.216.198.111 pr -64.216.198.112 - 64.216.199.95 us -64.216.199.96 - 64.216.199.103 pr -64.216.199.104 - 64.216.200.39 us -64.216.200.40 - 64.216.200.47 pr -64.216.200.48 - 64.216.203.167 us -64.216.203.168 - 64.216.203.175 pr -64.216.203.176 - 64.216.204.239 us -64.216.204.240 - 64.216.204.247 pr -64.216.204.248 - 64.216.205.31 us +64.215.128.0 - 64.215.160.255 us +64.215.161.0 - 64.215.161.255 ca +64.215.162.0 - 64.215.199.255 us +64.215.200.0 - 64.215.200.255 ar +64.215.201.0 - 64.216.81.175 us +64.216.81.176 - 64.216.81.183 pr +64.216.81.184 - 64.216.205.31 us 64.216.205.32 - 64.216.205.39 pr -64.216.205.40 - 64.216.227.55 us -64.216.227.56 - 64.216.227.63 pr -64.216.227.64 - 64.217.5.15 us -64.217.5.16 - 64.217.5.39 pr -64.217.5.40 - 64.217.5.47 us -64.217.5.48 - 64.217.5.55 pr -64.217.5.56 - 64.217.5.159 us -64.217.5.160 - 64.217.5.167 pr -64.217.5.168 - 64.217.5.183 us -64.217.5.184 - 64.217.5.199 pr -64.217.5.200 - 64.217.68.215 us -64.217.68.216 - 64.217.68.239 pr -64.217.68.240 - 64.217.109.135 us -64.217.109.136 - 64.217.109.143 pr -64.217.109.144 - 64.217.109.167 us -64.217.109.168 - 64.217.109.175 pr -64.217.109.176 - 64.217.192.159 us -64.217.192.160 - 64.217.192.167 pr -64.217.192.168 - 64.217.193.183 us -64.217.193.184 - 64.217.193.191 pr -64.217.193.192 - 64.217.193.215 us -64.217.193.216 - 64.217.193.231 pr -64.217.193.232 - 64.217.200.247 us -64.217.200.248 - 64.217.200.255 pr -64.217.201.0 - 64.217.222.63 us -64.217.222.64 - 64.217.222.71 pr -64.217.222.72 - 64.217.223.135 us -64.217.223.136 - 64.217.223.143 pr -64.217.223.144 - 64.218.7.199 us -64.218.7.200 - 64.218.7.207 pr -64.218.7.208 - 64.218.12.199 us -64.218.12.200 - 64.218.12.207 pr -64.218.12.208 - 64.218.245.191 us -64.218.245.192 - 64.218.245.199 pr -64.218.245.200 - 64.218.254.31 us -64.218.254.32 - 64.218.254.39 pr -64.218.254.40 - 64.219.26.103 us -64.219.26.104 - 64.219.26.111 pr -64.219.26.112 - 64.219.26.159 us -64.219.26.160 - 64.219.26.167 pr -64.219.26.168 - 64.219.55.63 us -64.219.55.64 - 64.219.55.71 pr -64.219.55.72 - 64.219.102.207 us -64.219.102.208 - 64.219.102.215 pr -64.219.102.216 - 64.219.202.231 us -64.219.202.232 - 64.219.202.239 pr -64.219.202.240 - 64.219.209.103 us -64.219.209.104 - 64.219.209.111 pr -64.219.209.112 - 64.219.226.151 us -64.219.226.152 - 64.219.226.159 pr -64.219.226.160 - 64.224.10.16 us -64.224.10.17 - 64.224.10.30 au -64.224.10.31 - 64.224.112.144 us -64.224.112.145 - 64.224.112.158 es -64.224.112.159 - 64.224.116.176 us -64.224.116.177 - 64.224.116.190 ca -64.224.116.191 - 64.224.118.16 us -64.224.118.17 - 64.224.118.30 ca -64.224.118.31 - 64.224.119.48 us -64.224.119.49 - 64.224.119.62 ve -64.224.119.63 - 64.224.121.160 us -64.224.121.161 - 64.224.121.174 jp -64.224.121.175 - 64.224.121.240 us -64.224.121.241 - 64.224.121.254 cl -64.224.121.255 - 64.224.123.112 us -64.224.123.113 - 64.224.123.126 ie -64.224.123.127 - 64.224.123.160 us -64.224.123.161 - 64.224.123.174 cl -64.224.123.175 - 64.224.124.176 us -64.224.124.177 - 64.224.124.190 ar -64.224.124.191 - 64.224.124.208 us -64.224.124.209 - 64.224.124.222 lb -64.224.124.223 - 64.224.124.224 us -64.224.124.225 - 64.224.124.238 cn -64.224.124.239 - 64.224.127.48 us -64.224.127.49 - 64.224.127.62 lb -64.224.127.63 - 64.224.201.31 us -64.224.201.32 - 64.224.201.47 es -64.224.201.48 - 64.224.202.95 us -64.224.202.96 - 64.224.202.111 ie -64.224.202.112 - 64.225.121.15 us -64.225.121.16 - 64.225.121.31 hk -64.225.121.32 - 64.225.121.79 us -64.225.121.80 - 64.225.121.95 th -64.225.121.96 - 64.225.123.15 us -64.225.123.16 - 64.225.123.95 ua -64.225.123.96 - 64.225.137.175 us -64.225.137.176 - 64.225.137.191 ca -64.225.137.192 - 64.225.137.239 us -64.225.137.240 - 64.225.137.255 th -64.225.138.0 - 64.225.139.191 us -64.225.139.192 - 64.225.139.207 th -64.225.139.208 - 64.225.140.175 us -64.225.140.176 - 64.225.140.223 jp -64.225.140.224 - 64.225.142.31 us -64.225.142.32 - 64.225.142.47 pr -64.225.142.48 - 64.225.143.239 us -64.225.143.240 - 64.225.143.254 in -64.225.143.255 - 64.227.255.255 us +64.216.205.40 - 64.217.193.223 us +64.217.193.224 - 64.217.193.231 pr +64.217.193.232 - 64.227.255.255 us 64.228.0.0 - 64.231.255.255 ca -64.232.0.0 - 64.232.14.159 us -64.232.14.160 - 64.232.14.175 ca -64.232.14.176 - 64.235.47.31 us -64.235.47.32 - 64.235.47.39 ve -64.235.47.40 - 64.235.47.60 us -64.235.47.61 - 64.235.47.68 au -64.235.47.69 - 64.235.47.99 us -64.235.47.100 - 64.235.47.116 au -64.235.47.117 - 64.235.47.152 us -64.235.47.153 - 64.235.47.161 in -64.235.47.162 - 64.235.47.195 us -64.235.47.196 - 64.235.47.215 tr -64.235.47.216 - 64.235.95.255 us +64.232.0.0 - 64.233.172.255 us +64.233.173.0 - 64.233.173.255 ap +64.233.174.0 - 64.233.177.255 us +64.233.178.0 - 64.233.178.255 eu +64.233.179.0 - 64.235.32.255 us +64.235.33.0 - 64.235.33.255 nl +64.235.34.0 - 64.235.95.255 us 64.235.96.0 - 64.235.111.255 ca 64.235.112.0 - 64.235.113.255 a2 64.235.114.0 - 64.235.116.255 us -64.235.117.0 - 64.235.117.103 a2 -64.235.117.104 - 64.235.117.127 us -64.235.117.128 - 64.235.117.159 a2 -64.235.117.160 - 64.235.117.191 us -64.235.117.192 - 64.235.117.247 a2 -64.235.117.248 - 64.235.117.255 us -64.235.118.0 - 64.235.118.127 nl -64.235.118.128 - 64.235.118.255 a2 +64.235.117.0 - 64.235.118.255 a2 64.235.119.0 - 64.235.121.255 us -64.235.122.0 - 64.235.122.143 a2 -64.235.122.144 - 64.235.122.151 us -64.235.122.152 - 64.235.122.159 a2 -64.235.122.160 - 64.235.122.183 us -64.235.122.184 - 64.235.122.191 a2 -64.235.122.192 - 64.235.122.199 us -64.235.122.200 - 64.235.127.255 a2 -64.235.128.0 - 64.235.191.255 us -64.235.192.0 - 64.235.194.143 ca -64.235.194.144 - 64.235.194.151 it -64.235.194.152 - 64.235.210.79 ca -64.235.210.80 - 64.235.210.95 us -64.235.210.96 - 64.235.223.255 ca -64.235.224.0 - 64.235.226.111 us -64.235.226.112 - 64.235.226.143 ca -64.235.226.144 - 64.235.236.239 us -64.235.236.240 - 64.235.236.247 au -64.235.236.248 - 64.235.241.95 us -64.235.241.96 - 64.235.241.127 ca -64.235.241.128 - 64.236.8.255 us +64.235.122.0 - 64.235.127.255 a2 +64.235.128.0 - 64.235.157.255 us +64.235.158.0 - 64.235.158.255 gb +64.235.159.0 - 64.235.191.255 us +64.235.192.0 - 64.235.223.255 ca +64.235.224.0 - 64.236.8.255 us 64.236.9.0 - 64.236.9.255 gb 64.236.10.0 - 64.236.11.255 br 64.236.12.0 - 64.236.44.255 us @@ -20139,100 +15091,33 @@ 64.236.106.0 - 64.236.107.255 gb 64.236.108.0 - 64.236.159.255 us 64.236.160.0 - 64.236.160.255 ie -64.236.161.0 - 64.236.215.255 us +64.236.161.0 - 64.236.163.22 us +64.236.163.23 - 64.236.163.23 eu +64.236.163.24 - 64.236.215.255 us 64.236.216.0 - 64.236.216.255 gb -64.236.217.0 - 64.236.217.255 us +64.236.217.0 - 64.236.217.255 eu 64.236.218.0 - 64.236.219.255 fr 64.236.220.0 - 64.236.223.255 us 64.236.224.0 - 64.236.224.255 gb 64.236.225.0 - 64.236.226.255 us 64.236.227.0 - 64.236.228.255 gb -64.236.229.0 - 64.237.32.11 us -64.237.32.12 - 64.237.32.15 ca -64.237.32.16 - 64.237.32.27 us -64.237.32.28 - 64.237.32.31 ca -64.237.32.32 - 64.237.32.47 us -64.237.32.48 - 64.237.32.51 ca -64.237.32.52 - 64.237.34.127 us +64.236.229.0 - 64.237.34.127 us 64.237.34.128 - 64.237.34.143 a1 -64.237.34.144 - 64.237.34.151 ca -64.237.34.152 - 64.237.45.63 us +64.237.34.144 - 64.237.45.63 us 64.237.45.64 - 64.237.45.79 a1 64.237.45.80 - 64.237.127.255 us 64.237.128.0 - 64.237.255.255 pr -64.238.0.0 - 64.238.210.143 us -64.238.210.144 - 64.238.210.255 ca -64.238.211.0 - 64.239.242.95 us -64.239.242.96 - 64.239.242.111 ca -64.239.242.112 - 64.240.48.175 us -64.240.48.176 - 64.240.48.183 ca -64.240.48.184 - 64.240.62.255 us -64.240.63.0 - 64.240.63.15 ca -64.240.63.16 - 64.240.70.79 us -64.240.70.80 - 64.240.70.95 jp -64.240.70.96 - 64.240.85.127 us -64.240.85.128 - 64.240.85.191 ca -64.240.85.192 - 64.240.90.127 us -64.240.90.128 - 64.240.90.143 ca -64.240.90.144 - 64.240.130.127 us -64.240.130.128 - 64.240.130.135 ca -64.240.130.136 - 64.240.143.87 us -64.240.143.88 - 64.240.143.95 ca -64.240.143.96 - 64.240.219.255 us +64.238.0.0 - 64.238.210.71 us +64.238.210.72 - 64.238.210.79 ca +64.238.210.80 - 64.238.210.191 us +64.238.210.192 - 64.238.210.207 ca +64.238.210.208 - 64.239.247.255 us +64.239.248.0 - 64.239.248.255 a2 +64.239.249.0 - 64.240.219.255 us 64.240.220.0 - 64.240.220.255 ve -64.240.221.0 - 64.241.63.255 us -64.241.64.0 - 64.241.64.7 au -64.241.64.8 - 64.241.84.47 us -64.241.84.48 - 64.241.84.55 ca -64.241.84.56 - 64.241.126.95 us -64.241.126.96 - 64.241.126.103 ca -64.241.126.104 - 64.241.149.175 us -64.241.149.176 - 64.241.149.183 ca -64.241.149.184 - 64.241.158.175 us -64.241.158.176 - 64.241.158.183 ca -64.241.158.184 - 64.241.168.207 us -64.241.168.208 - 64.241.168.215 vi -64.241.168.216 - 64.241.169.255 us +64.240.221.0 - 64.241.169.255 us 64.241.170.0 - 64.241.171.255 ve -64.241.172.0 - 64.241.176.231 us -64.241.176.232 - 64.241.176.239 ca -64.241.176.240 - 64.241.194.255 us -64.241.195.0 - 64.241.195.31 ca -64.241.195.32 - 64.241.203.31 us -64.241.203.32 - 64.241.203.47 in -64.241.203.48 - 64.241.225.15 us -64.241.225.16 - 64.241.225.23 ca -64.241.225.24 - 64.241.231.143 us -64.241.231.144 - 64.241.231.151 ca -64.241.231.152 - 64.241.236.127 us -64.241.236.128 - 64.241.236.159 ca -64.241.236.160 - 64.241.245.255 us -64.241.246.0 - 64.241.246.255 hk -64.241.247.0 - 64.242.97.31 us -64.242.97.32 - 64.242.97.39 ca -64.242.97.40 - 64.242.97.47 us -64.242.97.48 - 64.242.97.63 ca -64.242.97.64 - 64.242.115.79 us -64.242.115.80 - 64.242.115.95 ca -64.242.115.96 - 64.242.169.15 us -64.242.169.16 - 64.242.169.31 gb -64.242.169.32 - 64.243.113.63 us -64.243.113.64 - 64.243.113.71 gb -64.243.113.72 - 64.243.142.31 us -64.243.142.32 - 64.243.142.63 ca -64.243.142.64 - 64.243.210.127 us -64.243.210.128 - 64.243.210.135 ca -64.243.210.136 - 64.243.210.191 us -64.243.210.192 - 64.243.210.255 ca -64.243.211.0 - 64.243.212.159 us -64.243.212.160 - 64.243.212.175 ca -64.243.212.176 - 64.243.213.127 us -64.243.213.128 - 64.243.213.191 ca -64.243.213.192 - 64.243.221.175 us -64.243.221.176 - 64.243.221.183 ca -64.243.221.184 - 64.244.56.55 us -64.244.56.56 - 64.244.56.63 mu -64.244.56.64 - 64.246.69.255 us +64.241.172.0 - 64.246.69.255 us 64.246.70.0 - 64.246.71.255 gb 64.246.72.0 - 64.246.73.255 us 64.246.74.0 - 64.246.75.255 gb @@ -20243,468 +15128,114 @@ 64.247.160.0 - 64.247.175.255 pr 64.247.176.0 - 64.250.79.255 us 64.250.80.0 - 64.250.95.255 ca -64.250.96.0 - 64.250.182.79 us -64.250.182.80 - 64.250.182.95 gb -64.250.182.96 - 64.251.63.255 us +64.250.96.0 - 64.251.63.255 us 64.251.64.0 - 64.251.95.255 ca 64.251.96.0 - 64.253.127.255 us -64.253.128.0 - 64.253.132.103 ca -64.253.132.104 - 64.253.132.111 us -64.253.132.112 - 64.253.132.175 ca -64.253.132.176 - 64.253.132.191 us -64.253.132.192 - 64.253.137.31 ca -64.253.137.32 - 64.253.137.63 us -64.253.137.64 - 64.253.137.159 ca -64.253.137.160 - 64.253.137.175 us -64.253.137.176 - 64.253.137.199 ca -64.253.137.200 - 64.253.137.207 us -64.253.137.208 - 64.253.137.223 ca -64.253.137.224 - 64.253.137.231 us -64.253.137.232 - 64.253.159.255 ca +64.253.128.0 - 64.253.159.255 ca 64.253.160.0 - 64.253.255.255 us -64.254.0.0 - 64.254.13.4 ca -64.254.13.5 - 64.254.13.6 us -64.254.13.7 - 64.254.13.63 ca -64.254.13.64 - 64.254.13.64 us -64.254.13.65 - 64.254.31.255 ca -64.254.32.0 - 64.254.139.207 us -64.254.139.208 - 64.254.139.231 fi -64.254.139.232 - 64.254.141.31 us -64.254.141.32 - 64.254.141.63 fi -64.254.141.64 - 64.254.141.223 us -64.254.141.224 - 64.254.141.255 fi -64.254.142.0 - 64.254.143.255 us -64.254.144.0 - 64.254.159.255 ca -64.254.160.0 - 64.254.223.255 us -64.254.224.0 - 64.254.231.255 ca -64.254.232.0 - 64.254.232.127 us -64.254.232.128 - 64.254.234.255 ca -64.254.235.0 - 64.254.235.127 us -64.254.235.128 - 64.254.255.255 ca -64.255.0.0 - 64.255.173.111 us -64.255.173.112 - 64.255.173.127 au -64.255.173.128 - 65.17.196.29 us -65.17.196.30 - 65.17.196.39 gb -65.17.196.40 - 65.17.196.59 us -65.17.196.60 - 65.17.196.69 lb -65.17.196.70 - 65.17.196.79 us -65.17.196.80 - 65.17.196.89 be -65.17.196.90 - 65.17.196.109 us -65.17.196.110 - 65.17.196.119 qa -65.17.196.120 - 65.17.197.9 us -65.17.197.10 - 65.17.197.19 ca -65.17.197.20 - 65.17.197.29 us -65.17.197.30 - 65.17.197.69 ca -65.17.197.70 - 65.17.198.29 us -65.17.198.30 - 65.17.198.49 au -65.17.198.50 - 65.17.198.69 us -65.17.198.70 - 65.17.198.79 cr -65.17.198.80 - 65.17.202.15 us -65.17.202.16 - 65.17.202.31 ca -65.17.202.32 - 65.17.205.63 us -65.17.205.64 - 65.17.205.79 qa -65.17.205.80 - 65.17.205.127 us -65.17.205.128 - 65.17.205.255 qa -65.17.206.0 - 65.17.210.255 us -65.17.211.0 - 65.17.211.15 ca -65.17.211.16 - 65.17.211.191 us -65.17.211.192 - 65.17.211.223 ca -65.17.211.224 - 65.17.213.31 us -65.17.213.32 - 65.17.213.47 es -65.17.213.48 - 65.17.213.63 co -65.17.213.64 - 65.17.213.127 us -65.17.213.128 - 65.17.213.159 cr -65.17.213.160 - 65.17.213.191 es -65.17.213.192 - 65.17.219.39 us -65.17.219.40 - 65.17.219.49 gb -65.17.219.50 - 65.17.219.79 us -65.17.219.80 - 65.17.219.89 nz -65.17.219.90 - 65.17.219.119 us -65.17.219.120 - 65.17.219.129 si -65.17.219.130 - 65.17.223.255 us -65.17.224.0 - 65.17.224.15 ca -65.17.224.16 - 65.17.224.31 gb -65.17.224.32 - 65.17.224.255 us -65.17.225.0 - 65.17.225.63 gb -65.17.225.64 - 65.17.227.63 us -65.17.227.64 - 65.17.227.95 sa -65.17.227.96 - 65.17.231.59 us -65.17.231.60 - 65.17.231.69 sy -65.17.231.70 - 65.17.231.99 us -65.17.231.100 - 65.17.231.109 gb -65.17.231.110 - 65.17.231.119 nl -65.17.231.120 - 65.17.231.159 us -65.17.231.160 - 65.17.231.169 gb -65.17.231.170 - 65.17.232.29 us -65.17.232.30 - 65.17.232.39 be -65.17.232.40 - 65.17.232.99 us -65.17.232.100 - 65.17.232.109 ph -65.17.232.110 - 65.17.232.159 us -65.17.232.160 - 65.17.232.169 si -65.17.232.170 - 65.17.232.179 us -65.17.232.180 - 65.17.232.189 ca -65.17.232.190 - 65.17.234.39 us -65.17.234.40 - 65.17.234.79 nz -65.17.234.80 - 65.17.239.111 us -65.17.239.112 - 65.17.239.127 bg -65.17.239.128 - 65.17.241.29 us -65.17.241.30 - 65.17.241.39 de -65.17.241.40 - 65.17.241.149 us -65.17.241.150 - 65.17.241.159 cr -65.17.241.160 - 65.17.241.169 ca -65.17.241.170 - 65.17.241.209 us -65.17.241.210 - 65.17.241.219 cr -65.17.241.220 - 65.17.242.19 us -65.17.242.20 - 65.17.242.59 ca -65.17.242.60 - 65.17.242.109 us -65.17.242.110 - 65.17.242.119 ca -65.17.242.120 - 65.17.242.179 us -65.17.242.180 - 65.17.242.189 ca -65.17.242.190 - 65.19.131.95 us -65.19.131.96 - 65.19.131.111 it -65.19.131.112 - 65.19.134.111 us -65.19.134.112 - 65.19.134.119 cn -65.19.134.120 - 65.19.134.255 us -65.19.135.0 - 65.19.135.255 cn -65.19.136.0 - 65.19.138.167 us -65.19.138.168 - 65.19.138.175 sg -65.19.138.176 - 65.19.140.255 us -65.19.141.0 - 65.19.141.7 jp -65.19.141.8 - 65.19.147.255 us -65.19.148.0 - 65.19.148.255 ca -65.19.149.0 - 65.19.151.255 us +64.254.0.0 - 64.254.31.255 ca +64.254.32.0 - 64.254.153.255 us +64.254.154.0 - 64.254.154.255 ca +64.254.155.0 - 64.254.223.255 us +64.254.224.0 - 64.254.255.255 ca +64.255.0.0 - 65.19.151.255 us 65.19.152.0 - 65.19.152.255 cn -65.19.153.0 - 65.19.154.63 us -65.19.154.64 - 65.19.154.127 th -65.19.154.128 - 65.19.154.223 us -65.19.154.224 - 65.19.154.255 nl -65.19.155.0 - 65.19.165.255 us -65.19.166.0 - 65.19.166.127 it -65.19.166.128 - 65.19.167.255 us +65.19.153.0 - 65.19.167.255 us 65.19.168.0 - 65.19.168.255 ca 65.19.169.0 - 65.19.170.255 us -65.19.171.0 - 65.19.172.255 ca -65.19.173.0 - 65.19.176.95 us -65.19.176.96 - 65.19.176.111 gb -65.19.176.112 - 65.19.176.127 us -65.19.176.128 - 65.19.176.191 jp -65.19.176.192 - 65.19.185.255 us -65.19.186.0 - 65.19.186.255 it -65.19.187.0 - 65.19.187.255 us +65.19.171.0 - 65.19.171.255 ca +65.19.172.0 - 65.19.187.255 us 65.19.188.0 - 65.19.188.255 cn 65.19.189.0 - 65.21.255.255 us 65.22.0.0 - 65.22.255.255 ca -65.23.0.0 - 65.23.129.32 us -65.23.129.33 - 65.23.129.64 do -65.23.129.65 - 65.23.157.29 us -65.23.157.30 - 65.23.157.37 kn -65.23.157.38 - 65.23.158.226 us -65.23.158.227 - 65.23.158.234 kn -65.23.158.235 - 65.23.191.255 us +65.23.0.0 - 65.23.191.255 us 65.23.192.0 - 65.23.255.255 pr -65.24.0.0 - 65.36.243.63 us -65.36.243.64 - 65.36.243.95 au -65.36.243.96 - 65.38.31.255 us +65.24.0.0 - 65.38.31.255 us 65.38.32.0 - 65.38.47.255 ca 65.38.48.0 - 65.38.63.255 us 65.38.64.0 - 65.38.95.255 ca -65.38.96.0 - 65.38.166.111 us -65.38.166.112 - 65.38.166.119 ca -65.38.166.120 - 65.38.166.207 us -65.38.166.208 - 65.38.166.223 ar -65.38.166.224 - 65.38.168.31 us -65.38.168.32 - 65.38.168.47 sa -65.38.168.48 - 65.38.168.63 gb -65.38.168.64 - 65.38.169.223 us -65.38.169.224 - 65.38.169.239 ar -65.38.169.240 - 65.38.174.127 us -65.38.174.128 - 65.38.174.143 gb -65.38.174.144 - 65.38.174.175 us -65.38.174.176 - 65.38.174.191 fr -65.38.174.192 - 65.38.175.79 us -65.38.175.80 - 65.38.175.95 gb -65.38.175.96 - 65.38.179.255 us -65.38.180.0 - 65.38.181.127 ar -65.38.181.128 - 65.38.182.95 us -65.38.182.96 - 65.38.182.127 sy -65.38.182.128 - 65.38.182.143 us -65.38.182.144 - 65.38.182.159 sy -65.38.182.160 - 65.38.182.167 us -65.38.182.168 - 65.38.182.175 ro -65.38.182.176 - 65.38.183.191 us -65.38.183.192 - 65.38.183.207 fr -65.38.183.208 - 65.38.183.223 ca -65.38.183.224 - 65.38.183.255 us -65.38.184.0 - 65.38.184.7 gb -65.38.184.8 - 65.38.184.79 us -65.38.184.80 - 65.38.184.87 ca -65.38.184.88 - 65.38.185.191 us -65.38.185.192 - 65.38.185.207 sa -65.38.185.208 - 65.38.186.79 us -65.38.186.80 - 65.38.186.95 jp -65.38.186.96 - 65.38.186.239 us -65.38.186.240 - 65.38.186.255 it -65.38.187.0 - 65.38.187.31 us -65.38.187.32 - 65.38.187.63 cy -65.38.187.64 - 65.38.187.111 us -65.38.187.112 - 65.38.187.127 ro -65.38.187.128 - 65.38.187.143 ph -65.38.187.144 - 65.38.187.207 us -65.38.187.208 - 65.38.187.223 cy -65.38.187.224 - 65.38.190.47 us -65.38.190.48 - 65.38.190.63 sy -65.38.190.64 - 65.38.190.223 us -65.38.190.224 - 65.38.190.239 sy -65.38.190.240 - 65.38.191.255 us -65.38.192.0 - 65.38.209.255 pr -65.38.210.0 - 65.38.211.255 do -65.38.212.0 - 65.38.223.255 pr +65.38.96.0 - 65.38.179.255 us +65.38.180.0 - 65.38.180.255 ar +65.38.181.0 - 65.38.191.255 us +65.38.192.0 - 65.38.223.255 pr 65.38.224.0 - 65.38.255.255 us 65.39.0.0 - 65.39.63.255 ca -65.39.64.0 - 65.39.127.255 us -65.39.128.0 - 65.39.128.111 ca -65.39.128.112 - 65.39.128.127 us -65.39.128.128 - 65.39.129.255 ca -65.39.130.0 - 65.39.130.255 us -65.39.131.0 - 65.39.134.119 ca -65.39.134.120 - 65.39.134.127 us -65.39.134.128 - 65.39.136.119 ca -65.39.136.120 - 65.39.136.127 us -65.39.136.128 - 65.39.136.207 ca -65.39.136.208 - 65.39.136.223 us -65.39.136.224 - 65.39.137.255 ca +65.39.64.0 - 65.39.128.255 us +65.39.129.0 - 65.39.129.255 ca +65.39.130.0 - 65.39.132.255 us +65.39.133.0 - 65.39.133.255 ca +65.39.134.0 - 65.39.134.255 us +65.39.135.0 - 65.39.135.255 ca +65.39.136.0 - 65.39.136.111 us +65.39.136.112 - 65.39.136.119 ca +65.39.136.120 - 65.39.136.255 us +65.39.137.0 - 65.39.137.255 ca 65.39.138.0 - 65.39.138.255 us 65.39.139.0 - 65.39.139.255 ca -65.39.140.0 - 65.39.140.31 us -65.39.140.32 - 65.39.140.63 ca -65.39.140.64 - 65.39.140.127 us -65.39.140.128 - 65.39.140.143 ca -65.39.140.144 - 65.39.140.151 us -65.39.140.152 - 65.39.140.255 ca -65.39.141.0 - 65.39.141.255 us -65.39.142.0 - 65.39.143.159 ca -65.39.143.160 - 65.39.143.175 us +65.39.140.0 - 65.39.140.143 us +65.39.140.144 - 65.39.140.151 ca +65.39.140.152 - 65.39.140.255 us +65.39.141.0 - 65.39.142.255 ca +65.39.143.0 - 65.39.143.175 us 65.39.143.176 - 65.39.143.191 ca -65.39.143.192 - 65.39.143.207 us -65.39.143.208 - 65.39.144.63 ca -65.39.144.64 - 65.39.144.95 us +65.39.143.192 - 65.39.144.95 us 65.39.144.96 - 65.39.144.127 ca -65.39.144.128 - 65.39.144.143 us -65.39.144.144 - 65.39.144.151 ca -65.39.144.152 - 65.39.144.159 bv -65.39.144.160 - 65.39.146.63 ca -65.39.146.64 - 65.39.146.95 us -65.39.146.96 - 65.39.146.111 ca -65.39.146.112 - 65.39.146.159 us -65.39.146.160 - 65.39.146.207 ca -65.39.146.208 - 65.39.148.23 us -65.39.148.24 - 65.39.148.31 ca -65.39.148.32 - 65.39.148.63 us -65.39.148.64 - 65.39.148.79 ca -65.39.148.80 - 65.39.148.255 us -65.39.149.0 - 65.39.149.31 ca -65.39.149.32 - 65.39.149.39 us -65.39.149.40 - 65.39.149.47 ca -65.39.149.48 - 65.39.149.63 us -65.39.149.64 - 65.39.149.95 ca -65.39.149.96 - 65.39.150.31 us -65.39.150.32 - 65.39.150.35 ca -65.39.150.36 - 65.39.150.63 us -65.39.150.64 - 65.39.150.79 ca -65.39.150.80 - 65.39.150.135 us -65.39.150.136 - 65.39.150.143 ca -65.39.150.144 - 65.39.150.159 us -65.39.150.160 - 65.39.150.191 ca -65.39.150.192 - 65.39.151.39 us -65.39.151.40 - 65.39.151.47 ca -65.39.151.48 - 65.39.151.127 us -65.39.151.128 - 65.39.151.143 ca -65.39.151.144 - 65.39.151.159 us -65.39.151.160 - 65.39.151.183 ca -65.39.151.184 - 65.39.151.191 us -65.39.151.192 - 65.39.151.223 ca -65.39.151.224 - 65.39.154.255 us -65.39.155.0 - 65.39.155.55 ca -65.39.155.56 - 65.39.155.79 us -65.39.155.80 - 65.39.155.87 ca -65.39.155.88 - 65.39.155.95 vg -65.39.155.96 - 65.39.155.199 ca -65.39.155.200 - 65.39.155.219 us +65.39.144.128 - 65.39.151.255 us +65.39.152.0 - 65.39.152.255 ca +65.39.153.0 - 65.39.155.219 us 65.39.155.220 - 65.39.155.223 ca -65.39.155.224 - 65.39.155.239 us -65.39.155.240 - 65.39.159.191 ca -65.39.159.192 - 65.39.159.255 us -65.39.160.0 - 65.39.163.255 ca +65.39.155.224 - 65.39.155.255 us +65.39.156.0 - 65.39.158.255 ca +65.39.159.0 - 65.39.159.255 us +65.39.160.0 - 65.39.161.255 ca +65.39.162.0 - 65.39.163.255 us 65.39.164.0 - 65.39.164.255 hk -65.39.165.0 - 65.39.165.255 us -65.39.166.0 - 65.39.166.15 ca -65.39.166.16 - 65.39.166.63 us -65.39.166.64 - 65.39.166.79 ca -65.39.166.80 - 65.39.166.87 us -65.39.166.88 - 65.39.166.127 ca -65.39.166.128 - 65.39.166.159 us -65.39.166.160 - 65.39.166.167 ca -65.39.166.168 - 65.39.166.175 us -65.39.166.176 - 65.39.166.191 ca -65.39.166.192 - 65.39.166.207 vg -65.39.166.208 - 65.39.168.255 ca +65.39.165.0 - 65.39.167.255 us +65.39.168.0 - 65.39.168.255 ca 65.39.169.0 - 65.39.169.255 hk -65.39.170.0 - 65.39.170.15 us -65.39.170.16 - 65.39.170.31 ca -65.39.170.32 - 65.39.170.63 us -65.39.170.64 - 65.39.170.67 ca -65.39.170.68 - 65.39.170.127 us -65.39.170.128 - 65.39.170.223 ca -65.39.170.224 - 65.39.172.7 us -65.39.172.8 - 65.39.172.15 ca -65.39.172.16 - 65.39.172.17 us -65.39.172.18 - 65.39.172.30 ca -65.39.172.31 - 65.39.172.39 us -65.39.172.40 - 65.39.172.47 ca -65.39.172.48 - 65.39.172.63 us -65.39.172.64 - 65.39.172.159 ca -65.39.172.160 - 65.39.172.191 us -65.39.172.192 - 65.39.173.79 ca -65.39.173.80 - 65.39.173.127 us -65.39.173.128 - 65.39.174.175 ca -65.39.174.176 - 65.39.174.191 us -65.39.174.192 - 65.39.174.207 ca -65.39.174.208 - 65.39.174.255 us -65.39.175.0 - 65.39.175.63 ca -65.39.175.64 - 65.39.175.79 us -65.39.175.80 - 65.39.175.87 ca -65.39.175.88 - 65.39.175.95 us -65.39.175.96 - 65.39.175.191 ca -65.39.175.192 - 65.39.175.255 us -65.39.176.0 - 65.39.177.127 ca -65.39.177.128 - 65.39.177.143 us -65.39.177.144 - 65.39.177.159 bv -65.39.177.160 - 65.39.177.255 ca +65.39.170.0 - 65.39.175.255 us +65.39.176.0 - 65.39.176.255 ca +65.39.177.0 - 65.39.177.159 us +65.39.177.160 - 65.39.177.175 ca +65.39.177.176 - 65.39.177.255 us 65.39.178.0 - 65.39.178.255 gb -65.39.179.0 - 65.39.179.143 us -65.39.179.144 - 65.39.179.175 ca -65.39.179.176 - 65.39.179.191 us -65.39.179.192 - 65.39.183.255 ca -65.39.184.0 - 65.39.184.255 us -65.39.185.0 - 65.39.185.143 ca -65.39.185.144 - 65.39.185.159 us -65.39.185.160 - 65.39.185.191 ca -65.39.185.192 - 65.39.185.231 us -65.39.185.232 - 65.39.185.239 ca -65.39.185.240 - 65.39.185.247 us -65.39.185.248 - 65.39.185.255 ca -65.39.186.0 - 65.39.186.31 us -65.39.186.32 - 65.39.186.95 ca -65.39.186.96 - 65.39.186.111 us -65.39.186.112 - 65.39.186.127 ca -65.39.186.128 - 65.39.186.159 us -65.39.186.160 - 65.39.186.207 ca -65.39.186.208 - 65.39.186.223 us -65.39.186.224 - 65.39.186.231 ca -65.39.186.232 - 65.39.186.239 us -65.39.186.240 - 65.39.186.247 ca -65.39.186.248 - 65.39.187.255 us -65.39.188.0 - 65.39.190.255 ca -65.39.191.0 - 65.39.191.63 us -65.39.191.64 - 65.39.191.95 an -65.39.191.96 - 65.39.191.103 us -65.39.191.104 - 65.39.191.127 ca -65.39.191.128 - 65.39.191.143 us -65.39.191.144 - 65.39.191.159 vg -65.39.191.160 - 65.39.191.255 us -65.39.192.0 - 65.39.192.191 ca -65.39.192.192 - 65.39.192.255 us -65.39.193.0 - 65.39.193.207 ca -65.39.193.208 - 65.39.193.223 us -65.39.193.224 - 65.39.198.63 ca -65.39.198.64 - 65.39.198.87 us -65.39.198.88 - 65.39.198.103 ca -65.39.198.104 - 65.39.198.111 us -65.39.198.112 - 65.39.198.143 ca -65.39.198.144 - 65.39.198.239 us -65.39.198.240 - 65.39.199.127 ca -65.39.199.128 - 65.39.199.159 us -65.39.199.160 - 65.39.199.175 ca -65.39.199.176 - 65.39.199.191 us -65.39.199.192 - 65.39.199.223 ca -65.39.199.224 - 65.39.199.246 us -65.39.199.247 - 65.39.199.254 ca -65.39.199.255 - 65.39.199.255 us +65.39.179.0 - 65.39.179.255 us +65.39.180.0 - 65.39.183.255 ca +65.39.184.0 - 65.39.184.127 us +65.39.184.128 - 65.39.184.255 ca +65.39.185.0 - 65.39.186.191 us +65.39.186.192 - 65.39.186.207 ca +65.39.186.208 - 65.39.186.255 us +65.39.187.0 - 65.39.190.255 ca +65.39.191.0 - 65.39.191.111 us +65.39.191.112 - 65.39.191.127 ca +65.39.191.128 - 65.39.199.255 us 65.39.200.0 - 65.39.200.255 ca -65.39.201.0 - 65.39.201.31 vg -65.39.201.32 - 65.39.201.127 ca -65.39.201.128 - 65.39.201.143 us -65.39.201.144 - 65.39.201.191 ca -65.39.201.192 - 65.39.201.207 us -65.39.201.208 - 65.39.201.239 ca -65.39.201.240 - 65.39.202.111 us -65.39.202.112 - 65.39.202.127 ca -65.39.202.128 - 65.39.202.145 us -65.39.202.146 - 65.39.202.153 ca -65.39.202.154 - 65.39.202.167 us -65.39.202.168 - 65.39.202.175 ca -65.39.202.176 - 65.39.202.255 us +65.39.201.0 - 65.39.202.255 us 65.39.203.0 - 65.39.203.255 ca -65.39.204.0 - 65.39.204.23 us -65.39.204.24 - 65.39.204.31 ca -65.39.204.32 - 65.39.204.255 us -65.39.205.0 - 65.39.205.31 ca -65.39.205.32 - 65.39.205.127 us -65.39.205.128 - 65.39.205.191 ca -65.39.205.192 - 65.39.205.223 us -65.39.205.224 - 65.39.205.239 ca -65.39.205.240 - 65.39.206.95 us -65.39.206.96 - 65.39.206.111 ca -65.39.206.112 - 65.39.207.255 us -65.39.208.0 - 65.39.208.223 ca -65.39.208.224 - 65.39.208.255 us +65.39.204.0 - 65.39.208.255 us 65.39.209.0 - 65.39.211.255 ca -65.39.212.0 - 65.39.216.127 us -65.39.216.128 - 65.39.216.175 ca -65.39.216.176 - 65.39.216.255 us -65.39.217.0 - 65.39.217.127 ca -65.39.217.128 - 65.39.217.191 us -65.39.217.192 - 65.39.219.207 ca -65.39.219.208 - 65.39.219.223 us -65.39.219.224 - 65.39.219.239 vg -65.39.219.240 - 65.39.219.255 ca -65.39.220.0 - 65.39.220.127 us -65.39.220.128 - 65.39.220.223 ca -65.39.220.224 - 65.39.224.63 us -65.39.224.64 - 65.39.225.255 ca -65.39.226.0 - 65.39.226.255 us -65.39.227.0 - 65.39.227.255 ca -65.39.228.0 - 65.39.228.95 us -65.39.228.96 - 65.39.228.127 ca -65.39.228.128 - 65.39.228.255 us -65.39.229.0 - 65.39.231.159 ca -65.39.231.160 - 65.39.231.175 us -65.39.231.176 - 65.39.231.183 ca -65.39.231.184 - 65.39.231.191 us -65.39.231.192 - 65.39.231.255 ca -65.39.232.0 - 65.39.235.255 us +65.39.212.0 - 65.39.217.255 us +65.39.218.0 - 65.39.219.255 ca +65.39.220.0 - 65.39.224.255 us +65.39.225.0 - 65.39.226.255 ca +65.39.227.0 - 65.39.235.255 us 65.39.236.0 - 65.39.236.255 ca 65.39.237.0 - 65.39.237.15 us 65.39.237.16 - 65.39.237.23 ca -65.39.237.24 - 65.39.237.31 us -65.39.237.32 - 65.39.237.255 ca -65.39.238.0 - 65.39.238.255 us -65.39.239.0 - 65.39.239.255 ca -65.39.240.0 - 65.39.241.255 us -65.39.242.0 - 65.39.247.255 ca -65.39.248.0 - 65.39.248.127 us -65.39.248.128 - 65.39.248.191 ca -65.39.248.192 - 65.39.251.255 us -65.39.252.0 - 65.39.252.127 ca -65.39.252.128 - 65.39.252.191 us -65.39.252.192 - 65.39.252.223 ca -65.39.252.224 - 65.39.252.239 us -65.39.252.240 - 65.39.254.255 ca -65.39.255.0 - 65.43.7.15 us -65.43.7.16 - 65.43.7.23 pr -65.43.7.24 - 65.48.26.167 us -65.48.26.168 - 65.48.26.175 uy -65.48.26.176 - 65.48.127.255 us +65.39.237.24 - 65.39.237.255 us +65.39.238.0 - 65.39.240.255 ca +65.39.241.0 - 65.39.241.255 us +65.39.242.0 - 65.39.242.255 ca +65.39.243.0 - 65.39.243.255 us +65.39.244.0 - 65.39.245.127 ca +65.39.245.128 - 65.39.245.255 us +65.39.246.0 - 65.39.246.255 ca +65.39.247.0 - 65.39.247.127 us +65.39.247.128 - 65.39.247.143 ca +65.39.247.144 - 65.39.252.255 us +65.39.253.0 - 65.39.254.255 ca +65.39.255.0 - 65.48.127.255 us 65.48.128.0 - 65.48.133.255 bb 65.48.134.0 - 65.48.139.255 gd 65.48.140.0 - 65.48.143.255 vc @@ -20720,537 +15251,63 @@ 65.48.230.0 - 65.48.232.255 bb 65.48.233.0 - 65.48.235.255 vc 65.48.236.0 - 65.48.255.255 bb -65.49.0.0 - 65.49.1.255 us -65.49.2.0 - 65.49.2.255 a1 -65.49.3.0 - 65.49.13.255 us -65.49.14.0 - 65.49.14.255 a1 -65.49.15.0 - 65.49.27.31 us -65.49.27.32 - 65.49.27.47 ae -65.49.27.48 - 65.49.27.207 us -65.49.27.208 - 65.49.27.215 gb -65.49.27.216 - 65.49.38.63 us -65.49.38.64 - 65.49.38.127 jp -65.49.38.128 - 65.49.38.151 us -65.49.38.152 - 65.49.38.159 cn -65.49.38.160 - 65.49.38.199 us -65.49.38.200 - 65.49.38.207 cn -65.49.38.208 - 65.49.38.215 us -65.49.38.216 - 65.49.38.223 hk -65.49.38.224 - 65.49.38.239 us -65.49.38.240 - 65.49.38.247 cn -65.49.38.248 - 65.49.39.47 us -65.49.39.48 - 65.49.39.63 sg -65.49.39.64 - 65.49.39.127 jp -65.49.39.128 - 65.49.44.31 us -65.49.44.32 - 65.49.44.39 es -65.49.44.40 - 65.49.49.255 us -65.49.50.0 - 65.49.50.255 hk -65.49.51.0 - 65.49.51.63 us -65.49.51.64 - 65.49.51.127 jp -65.49.51.128 - 65.49.52.127 us -65.49.52.128 - 65.49.52.191 ca -65.49.52.192 - 65.49.55.255 us -65.49.56.0 - 65.49.56.255 ca -65.49.57.0 - 65.49.64.191 us -65.49.64.192 - 65.49.64.255 de -65.49.65.0 - 65.49.72.63 us -65.49.72.64 - 65.49.72.127 cn -65.49.72.128 - 65.61.128.183 us -65.61.128.184 - 65.61.128.191 ca -65.61.128.192 - 65.61.129.23 us -65.61.129.24 - 65.61.129.31 au -65.61.129.32 - 65.61.129.39 us -65.61.129.40 - 65.61.129.47 ca -65.61.129.48 - 65.61.129.55 uz -65.61.129.56 - 65.61.129.103 us -65.61.129.104 - 65.61.129.111 bd -65.61.129.112 - 65.61.129.175 us -65.61.129.176 - 65.61.129.183 ca -65.61.129.184 - 65.61.129.191 cy -65.61.129.192 - 65.61.130.199 us -65.61.130.200 - 65.61.130.207 mx -65.61.130.208 - 65.61.130.223 au -65.61.130.224 - 65.61.130.231 bd -65.61.130.232 - 65.61.131.215 us -65.61.131.216 - 65.61.131.223 ro -65.61.131.224 - 65.61.132.79 us -65.61.132.80 - 65.61.132.87 bd -65.61.132.88 - 65.61.132.151 us -65.61.132.152 - 65.61.132.167 ve -65.61.132.168 - 65.61.133.15 us -65.61.133.16 - 65.61.133.23 nl -65.61.133.24 - 65.61.133.39 us -65.61.133.40 - 65.61.133.47 ca -65.61.133.48 - 65.61.133.63 us -65.61.133.64 - 65.61.133.71 in -65.61.133.72 - 65.61.133.95 us -65.61.133.96 - 65.61.133.103 nz -65.61.133.104 - 65.61.133.111 jp -65.61.133.112 - 65.61.133.127 ua -65.61.133.128 - 65.61.133.135 jm -65.61.133.136 - 65.61.133.183 us -65.61.133.184 - 65.61.133.191 jm -65.61.133.192 - 65.61.133.207 us -65.61.133.208 - 65.61.133.215 nl -65.61.133.216 - 65.61.134.167 us -65.61.134.168 - 65.61.134.175 gb -65.61.134.176 - 65.61.134.191 au -65.61.134.192 - 65.61.135.159 us -65.61.135.160 - 65.61.135.175 se -65.61.135.176 - 65.61.135.191 us -65.61.135.192 - 65.61.135.199 gb -65.61.135.200 - 65.61.135.239 us -65.61.135.240 - 65.61.135.255 au -65.61.136.0 - 65.61.137.31 us -65.61.137.32 - 65.61.137.47 gb -65.61.137.48 - 65.61.138.127 us -65.61.138.128 - 65.61.138.135 gb -65.61.138.136 - 65.61.138.175 us -65.61.138.176 - 65.61.138.183 in -65.61.138.184 - 65.61.138.223 us -65.61.138.224 - 65.61.138.247 nz -65.61.138.248 - 65.61.138.255 us -65.61.139.0 - 65.61.139.15 in -65.61.139.16 - 65.61.139.55 us -65.61.139.56 - 65.61.139.63 ae -65.61.139.64 - 65.61.139.207 us -65.61.139.208 - 65.61.139.223 cy -65.61.139.224 - 65.61.139.231 us -65.61.139.232 - 65.61.139.239 nl -65.61.139.240 - 65.61.144.255 us -65.61.145.0 - 65.61.145.7 gb -65.61.145.8 - 65.61.145.71 us -65.61.145.72 - 65.61.145.79 in -65.61.145.80 - 65.61.145.119 us -65.61.145.120 - 65.61.145.127 nz -65.61.145.128 - 65.61.148.255 us -65.61.149.0 - 65.61.149.7 lk -65.61.149.8 - 65.61.149.87 us -65.61.149.88 - 65.61.149.95 uz -65.61.149.96 - 65.61.154.31 us -65.61.154.32 - 65.61.154.47 in -65.61.154.48 - 65.61.156.31 us -65.61.156.32 - 65.61.156.47 ca -65.61.156.48 - 65.61.156.111 us -65.61.156.112 - 65.61.156.127 nz -65.61.156.128 - 65.61.157.255 us -65.61.158.0 - 65.61.158.15 au -65.61.158.16 - 65.61.158.87 us -65.61.158.88 - 65.61.158.95 ca -65.61.158.96 - 65.61.160.55 us -65.61.160.56 - 65.61.160.63 gb -65.61.160.64 - 65.61.162.255 us -65.61.163.0 - 65.61.163.7 jp -65.61.163.8 - 65.61.164.31 us -65.61.164.32 - 65.61.164.63 ca -65.61.164.64 - 65.61.164.255 us -65.61.165.0 - 65.61.165.15 bd -65.61.165.16 - 65.61.167.47 us -65.61.167.48 - 65.61.167.63 gb -65.61.167.64 - 65.61.167.135 us -65.61.167.136 - 65.61.167.143 ca -65.61.167.144 - 65.61.167.255 us -65.61.168.0 - 65.61.168.31 au -65.61.168.32 - 65.61.168.63 us -65.61.168.64 - 65.61.168.159 au -65.61.168.160 - 65.61.168.175 us -65.61.168.176 - 65.61.168.191 au -65.61.168.192 - 65.61.169.63 us -65.61.169.64 - 65.61.169.103 fr -65.61.169.104 - 65.61.169.255 us -65.61.170.0 - 65.61.170.7 in -65.61.170.8 - 65.61.170.23 us -65.61.170.24 - 65.61.170.31 gb -65.61.170.32 - 65.61.170.63 us -65.61.170.64 - 65.61.170.79 in -65.61.170.80 - 65.61.170.191 us -65.61.170.192 - 65.61.170.199 au -65.61.170.200 - 65.61.172.63 us -65.61.172.64 - 65.61.172.95 bd -65.61.172.96 - 65.61.172.127 us -65.61.172.128 - 65.61.172.255 ca -65.61.173.0 - 65.61.173.23 us -65.61.173.24 - 65.61.173.31 ca -65.61.173.32 - 65.61.174.31 us -65.61.174.32 - 65.61.174.39 es -65.61.174.40 - 65.61.174.47 ca -65.61.174.48 - 65.61.174.119 us -65.61.174.120 - 65.61.174.127 il -65.61.174.128 - 65.61.174.255 us -65.61.175.0 - 65.61.175.103 hk -65.61.175.104 - 65.61.176.39 us -65.61.176.40 - 65.61.176.47 au -65.61.176.48 - 65.61.176.63 us -65.61.176.64 - 65.61.176.127 au -65.61.176.128 - 65.61.178.127 us -65.61.178.128 - 65.61.178.151 th -65.61.178.152 - 65.61.179.127 us -65.61.179.128 - 65.61.179.159 cr -65.61.179.160 - 65.61.179.239 us -65.61.179.240 - 65.61.179.247 ca -65.61.179.248 - 65.61.180.63 us -65.61.180.64 - 65.61.180.79 mx -65.61.180.80 - 65.61.180.95 us -65.61.180.96 - 65.61.180.111 dk -65.61.180.112 - 65.61.183.159 us -65.61.183.160 - 65.61.183.191 bd -65.61.183.192 - 65.61.184.47 us -65.61.184.48 - 65.61.184.55 mx -65.61.184.56 - 65.61.187.63 us -65.61.187.64 - 65.61.187.95 bd -65.61.187.96 - 65.61.188.255 us -65.61.189.0 - 65.61.189.255 ca -65.61.190.0 - 65.61.191.63 us -65.61.191.64 - 65.61.191.95 bd -65.61.191.96 - 65.61.191.111 us -65.61.191.112 - 65.61.191.127 cy -65.61.191.128 - 65.61.191.175 us -65.61.191.176 - 65.61.191.183 ru -65.61.191.184 - 65.61.191.255 us -65.61.192.0 - 65.61.200.110 ca -65.61.200.111 - 65.61.200.125 mo -65.61.200.126 - 65.61.255.255 ca -65.62.0.0 - 65.64.38.31 us -65.64.38.32 - 65.64.38.39 pr -65.64.38.40 - 65.64.55.7 us -65.64.55.8 - 65.64.55.15 pr -65.64.55.16 - 65.64.55.215 us -65.64.55.216 - 65.64.55.223 pr -65.64.55.224 - 65.64.141.63 us -65.64.141.64 - 65.64.141.71 pr -65.64.141.72 - 65.64.180.183 us -65.64.180.184 - 65.64.180.191 pr -65.64.180.192 - 65.64.199.231 us -65.64.199.232 - 65.64.199.239 pr -65.64.199.240 - 65.65.73.175 us -65.65.73.176 - 65.65.73.183 pr -65.65.73.184 - 65.65.73.247 us -65.65.73.248 - 65.65.73.255 pr -65.65.74.0 - 65.65.90.55 us -65.65.90.56 - 65.65.90.63 pr -65.65.90.64 - 65.65.90.207 us -65.65.90.208 - 65.65.90.215 pr -65.65.90.216 - 65.65.111.191 us -65.65.111.192 - 65.65.111.199 pr -65.65.111.200 - 65.65.122.23 us -65.65.122.24 - 65.65.122.31 pr -65.65.122.32 - 65.65.125.143 us -65.65.125.144 - 65.65.125.151 pr -65.65.125.152 - 65.65.125.191 us -65.65.125.192 - 65.65.125.199 pr -65.65.125.200 - 65.65.169.103 us -65.65.169.104 - 65.65.169.111 pr -65.65.169.112 - 65.65.169.183 us -65.65.169.184 - 65.65.169.191 pr -65.65.169.192 - 65.65.170.159 us -65.65.170.160 - 65.65.170.167 pr -65.65.170.168 - 65.65.205.119 us -65.65.205.120 - 65.65.205.127 pr -65.65.205.128 - 65.65.215.55 us -65.65.215.56 - 65.65.215.63 pr -65.65.215.64 - 65.65.237.231 us -65.65.237.232 - 65.65.237.239 pr -65.65.237.240 - 65.65.238.55 us -65.65.238.56 - 65.65.238.63 pr -65.65.238.64 - 65.65.243.23 us -65.65.243.24 - 65.65.243.31 pr -65.65.243.32 - 65.65.243.103 us -65.65.243.104 - 65.65.243.111 pr -65.65.243.112 - 65.65.251.135 us -65.65.251.136 - 65.65.251.143 pr -65.65.251.144 - 65.66.6.111 us -65.66.6.112 - 65.66.6.119 pr -65.66.6.120 - 65.66.24.175 us -65.66.24.176 - 65.66.24.183 pr -65.66.24.184 - 65.66.49.135 us -65.66.49.136 - 65.66.49.143 pr -65.66.49.144 - 65.66.65.127 us -65.66.65.128 - 65.66.65.135 pr -65.66.65.136 - 65.66.67.223 us -65.66.67.224 - 65.66.67.231 pr -65.66.67.232 - 65.66.96.103 us -65.66.96.104 - 65.66.96.111 pr -65.66.96.112 - 65.66.116.103 us -65.66.116.104 - 65.66.116.111 pr -65.66.116.112 - 65.66.133.175 us -65.66.133.176 - 65.66.133.183 pr -65.66.133.184 - 65.66.138.215 us -65.66.138.216 - 65.66.138.223 pr -65.66.138.224 - 65.66.140.199 us -65.66.140.200 - 65.66.140.207 pr -65.66.140.208 - 65.66.144.7 us -65.66.144.8 - 65.66.144.15 pr -65.66.144.16 - 65.66.144.23 us -65.66.144.24 - 65.66.144.31 pr -65.66.144.32 - 65.66.163.47 us -65.66.163.48 - 65.66.163.55 pr -65.66.163.56 - 65.66.163.159 us -65.66.163.160 - 65.66.163.167 pr -65.66.163.168 - 65.66.174.127 us -65.66.174.128 - 65.66.174.135 pr -65.66.174.136 - 65.66.186.223 us -65.66.186.224 - 65.66.186.231 pr -65.66.186.232 - 65.66.190.71 us -65.66.190.72 - 65.66.190.79 pr -65.66.190.80 - 65.66.190.231 us -65.66.190.232 - 65.66.190.239 pr -65.66.190.240 - 65.66.212.159 us -65.66.212.160 - 65.66.212.167 pr -65.66.212.168 - 65.66.224.223 us -65.66.224.224 - 65.66.224.239 pr -65.66.224.240 - 65.66.224.247 us -65.66.224.248 - 65.66.224.255 pr -65.66.225.0 - 65.66.235.103 us -65.66.235.104 - 65.66.235.111 pr -65.66.235.112 - 65.66.255.175 us -65.66.255.176 - 65.66.255.183 pr -65.66.255.184 - 65.67.0.31 us -65.67.0.32 - 65.67.0.39 pr -65.67.0.40 - 65.67.4.47 us -65.67.4.48 - 65.67.4.55 pr -65.67.4.56 - 65.67.8.143 us -65.67.8.144 - 65.67.8.151 pr -65.67.8.152 - 65.67.8.239 us -65.67.8.240 - 65.67.8.247 pr -65.67.8.248 - 65.67.11.7 us -65.67.11.8 - 65.67.11.15 pr -65.67.11.16 - 65.67.12.15 us -65.67.12.16 - 65.67.12.23 pr -65.67.12.24 - 65.67.12.135 us -65.67.12.136 - 65.67.12.143 pr -65.67.12.144 - 65.67.29.63 us -65.67.29.64 - 65.67.29.71 pr -65.67.29.72 - 65.67.30.39 us -65.67.30.40 - 65.67.30.55 pr -65.67.30.56 - 65.67.32.183 us -65.67.32.184 - 65.67.32.191 pr -65.67.32.192 - 65.67.38.103 us -65.67.38.104 - 65.67.38.111 pr -65.67.38.112 - 65.67.38.151 us -65.67.38.152 - 65.67.38.159 pr -65.67.38.160 - 65.67.46.23 us -65.67.46.24 - 65.67.46.31 pr -65.67.46.32 - 65.67.46.71 us -65.67.46.72 - 65.67.46.79 pr -65.67.46.80 - 65.67.55.151 us -65.67.55.152 - 65.67.55.159 pr -65.67.55.160 - 65.67.64.63 us -65.67.64.64 - 65.67.64.71 pr -65.67.64.72 - 65.67.64.191 us -65.67.64.192 - 65.67.64.199 pr -65.67.64.200 - 65.67.65.151 us -65.67.65.152 - 65.67.65.159 pr -65.67.65.160 - 65.67.73.87 us -65.67.73.88 - 65.67.73.95 pr -65.67.73.96 - 65.67.90.207 us -65.67.90.208 - 65.67.90.215 pr -65.67.90.216 - 65.67.91.199 us -65.67.91.200 - 65.67.91.207 pr -65.67.91.208 - 65.67.96.111 us -65.67.96.112 - 65.67.96.119 pr -65.67.96.120 - 65.67.96.175 us -65.67.96.176 - 65.67.96.183 pr -65.67.96.184 - 65.67.97.191 us -65.67.97.192 - 65.67.97.207 pr -65.67.97.208 - 65.67.98.23 us -65.67.98.24 - 65.67.98.31 pr -65.67.98.32 - 65.67.98.87 us -65.67.98.88 - 65.67.98.95 pr -65.67.98.96 - 65.67.99.63 us -65.67.99.64 - 65.67.99.71 pr -65.67.99.72 - 65.67.99.199 us -65.67.99.200 - 65.67.99.207 pr -65.67.99.208 - 65.67.104.159 us -65.67.104.160 - 65.67.104.167 pr -65.67.104.168 - 65.67.105.15 us -65.67.105.16 - 65.67.105.23 pr -65.67.105.24 - 65.67.154.111 us -65.67.154.112 - 65.67.154.119 pr -65.67.154.120 - 65.67.160.15 us -65.67.160.16 - 65.67.160.23 pr -65.67.160.24 - 65.67.160.47 us -65.67.160.48 - 65.67.160.55 pr -65.67.160.56 - 65.67.160.63 us -65.67.160.64 - 65.67.160.71 pr -65.67.160.72 - 65.67.160.239 us -65.67.160.240 - 65.67.160.247 pr -65.67.160.248 - 65.67.196.111 us -65.67.196.112 - 65.67.196.119 pr -65.67.196.120 - 65.68.10.111 us -65.68.10.112 - 65.68.10.119 pr -65.68.10.120 - 65.68.34.79 us -65.68.34.80 - 65.68.34.87 pr -65.68.34.88 - 65.68.34.167 us -65.68.34.168 - 65.68.34.175 pr -65.68.34.176 - 65.68.35.39 us -65.68.35.40 - 65.68.35.55 pr -65.68.35.56 - 65.68.37.207 us -65.68.37.208 - 65.68.37.215 pr -65.68.37.216 - 65.68.38.207 us -65.68.38.208 - 65.68.38.215 pr -65.68.38.216 - 65.68.39.183 us -65.68.39.184 - 65.68.39.191 pr -65.68.39.192 - 65.68.40.199 us -65.68.40.200 - 65.68.40.207 pr -65.68.40.208 - 65.68.124.31 us -65.68.124.32 - 65.68.124.63 pr -65.68.124.64 - 65.68.164.63 us -65.68.164.64 - 65.68.164.71 pr -65.68.164.72 - 65.68.165.79 us -65.68.165.80 - 65.68.165.87 pr -65.68.165.88 - 65.68.167.71 us -65.68.167.72 - 65.68.167.79 pr -65.68.167.80 - 65.68.167.223 us -65.68.167.224 - 65.68.167.231 pr -65.68.167.232 - 65.68.233.135 us -65.68.233.136 - 65.68.233.143 pr -65.68.233.144 - 65.68.244.119 us -65.68.244.120 - 65.68.244.127 pr -65.68.244.128 - 65.68.244.247 us -65.68.244.248 - 65.68.244.255 pr -65.68.245.0 - 65.68.246.31 us -65.68.246.32 - 65.68.246.39 pr -65.68.246.40 - 65.69.15.135 us -65.69.15.136 - 65.69.15.143 pr -65.69.15.144 - 65.69.18.95 us -65.69.18.96 - 65.69.18.103 pr -65.69.18.104 - 65.69.19.47 us -65.69.19.48 - 65.69.19.55 pr -65.69.19.56 - 65.69.19.63 us -65.69.19.64 - 65.69.19.71 pr -65.69.19.72 - 65.69.22.231 us -65.69.22.232 - 65.69.22.239 pr -65.69.22.240 - 65.69.29.15 us -65.69.29.16 - 65.69.29.23 pr -65.69.29.24 - 65.69.61.15 us -65.69.61.16 - 65.69.61.23 pr -65.69.61.24 - 65.69.63.223 us -65.69.63.224 - 65.69.63.231 pr -65.69.63.232 - 65.69.104.47 us -65.69.104.48 - 65.69.104.55 pr -65.69.104.56 - 65.69.106.191 us -65.69.106.192 - 65.69.106.199 pr -65.69.106.200 - 65.69.107.23 us -65.69.107.24 - 65.69.107.31 pr -65.69.107.32 - 65.69.107.39 us -65.69.107.40 - 65.69.107.47 pr -65.69.107.48 - 65.69.110.127 us -65.69.110.128 - 65.69.110.135 pr -65.69.110.136 - 65.69.111.151 us -65.69.111.152 - 65.69.111.159 pr -65.69.111.160 - 65.69.123.255 us -65.69.124.0 - 65.69.124.7 pr -65.69.124.8 - 65.69.125.23 us -65.69.125.24 - 65.69.125.31 pr -65.69.125.32 - 65.69.134.223 us -65.69.134.224 - 65.69.134.231 pr -65.69.134.232 - 65.69.147.47 us -65.69.147.48 - 65.69.147.55 pr -65.69.147.56 - 65.69.156.15 us -65.69.156.16 - 65.69.156.23 pr -65.69.156.24 - 65.69.157.79 us -65.69.157.80 - 65.69.157.87 pr -65.69.157.88 - 65.69.157.223 us -65.69.157.224 - 65.69.157.231 pr -65.69.157.232 - 65.69.169.247 us -65.69.169.248 - 65.69.169.255 pr -65.69.170.0 - 65.69.171.247 us -65.69.171.248 - 65.69.171.255 pr -65.69.172.0 - 65.69.180.111 us -65.69.180.112 - 65.69.180.119 pr -65.69.180.120 - 65.69.180.183 us -65.69.180.184 - 65.69.180.191 pr -65.69.180.192 - 65.69.182.87 us -65.69.182.88 - 65.69.182.95 pr -65.69.182.96 - 65.69.182.127 us -65.69.182.128 - 65.69.182.135 pr -65.69.182.136 - 65.69.184.239 us -65.69.184.240 - 65.69.184.247 pr -65.69.184.248 - 65.69.185.15 us -65.69.185.16 - 65.69.185.23 pr -65.69.185.24 - 65.69.189.207 us -65.69.189.208 - 65.69.189.215 pr -65.69.189.216 - 65.69.190.175 us -65.69.190.176 - 65.69.190.183 pr -65.69.190.184 - 65.69.192.231 us -65.69.192.232 - 65.69.192.239 pr -65.69.192.240 - 65.69.202.143 us -65.69.202.144 - 65.69.202.151 pr -65.69.202.152 - 65.69.203.159 us -65.69.203.160 - 65.69.203.167 pr -65.69.203.168 - 65.69.241.159 us -65.69.241.160 - 65.69.241.167 pr -65.69.241.168 - 65.69.242.231 us -65.69.242.232 - 65.69.242.239 pr -65.69.242.240 - 65.69.243.95 us -65.69.243.96 - 65.69.243.103 pr -65.69.243.104 - 65.69.253.31 us -65.69.253.32 - 65.69.253.39 pr -65.69.253.40 - 65.69.254.135 us -65.69.254.136 - 65.69.254.143 pr -65.69.254.144 - 65.69.254.151 us -65.69.254.152 - 65.69.254.159 pr -65.69.254.160 - 65.70.0.15 us -65.70.0.16 - 65.70.0.23 pr -65.70.0.24 - 65.70.2.7 us -65.70.2.8 - 65.70.2.15 pr -65.70.2.16 - 65.70.42.223 us -65.70.42.224 - 65.70.42.231 pr -65.70.42.232 - 65.70.61.255 us -65.70.62.0 - 65.70.62.7 pr -65.70.62.8 - 65.70.62.95 us -65.70.62.96 - 65.70.62.103 pr -65.70.62.104 - 65.70.72.79 us -65.70.72.80 - 65.70.72.87 pr -65.70.72.88 - 65.70.73.135 us -65.70.73.136 - 65.70.73.143 pr -65.70.73.144 - 65.70.81.151 us -65.70.81.152 - 65.70.81.159 pr -65.70.81.160 - 65.70.83.159 us -65.70.83.160 - 65.70.83.175 pr -65.70.83.176 - 65.70.90.207 us -65.70.90.208 - 65.70.90.215 pr -65.70.90.216 - 65.70.125.47 us -65.70.125.48 - 65.70.125.55 pr -65.70.125.56 - 65.70.130.87 us -65.70.130.88 - 65.70.130.95 pr -65.70.130.96 - 65.70.138.255 us -65.70.139.0 - 65.70.139.7 pr -65.70.139.8 - 65.70.195.127 us -65.70.195.128 - 65.70.195.135 pr -65.70.195.136 - 65.70.209.175 us -65.70.209.176 - 65.70.209.183 pr -65.70.209.184 - 65.70.212.95 us -65.70.212.96 - 65.70.212.103 pr -65.70.212.104 - 65.71.61.207 us -65.71.61.208 - 65.71.61.215 pr -65.71.61.216 - 65.71.63.135 us -65.71.63.136 - 65.71.63.143 pr -65.71.63.144 - 65.71.73.39 us -65.71.73.40 - 65.71.73.47 pr -65.71.73.48 - 65.71.99.55 us -65.71.99.56 - 65.71.99.63 pr -65.71.99.64 - 65.71.139.255 us -65.71.140.0 - 65.71.140.15 pr -65.71.140.16 - 65.71.192.207 us -65.71.192.208 - 65.71.192.215 pr -65.71.192.216 - 65.71.195.207 us -65.71.195.208 - 65.71.195.215 pr -65.71.195.216 - 65.71.251.199 us -65.71.251.200 - 65.71.251.207 pr -65.71.251.208 - 65.74.156.247 us -65.74.156.248 - 65.74.156.255 se -65.74.157.0 - 65.75.63.255 us +65.49.0.0 - 65.49.14.165 us +65.49.14.166 - 65.49.14.166 ph +65.49.14.167 - 65.52.63.255 us +65.52.64.0 - 65.52.79.255 ie +65.52.80.0 - 65.52.127.255 us +65.52.128.0 - 65.52.159.255 nl +65.52.160.0 - 65.52.191.255 hk +65.52.192.0 - 65.52.223.255 us +65.52.224.0 - 65.52.231.255 ie +65.52.232.0 - 65.52.247.255 us +65.52.248.0 - 65.52.255.255 ie +65.53.0.0 - 65.54.23.255 us +65.54.24.0 - 65.54.25.191 ie +65.54.25.192 - 65.54.25.255 us +65.54.26.0 - 65.54.26.159 ie +65.54.26.160 - 65.54.26.191 us +65.54.26.192 - 65.54.26.223 ie +65.54.26.224 - 65.54.26.231 us +65.54.26.232 - 65.54.26.239 ie +65.54.26.240 - 65.54.27.191 us +65.54.27.192 - 65.54.27.223 ie +65.54.27.224 - 65.54.27.255 us +65.54.28.0 - 65.54.31.255 nl +65.54.32.0 - 65.54.32.231 ie +65.54.32.232 - 65.54.34.223 us +65.54.34.224 - 65.54.35.31 ie +65.54.35.32 - 65.54.35.255 us +65.54.36.0 - 65.54.36.223 ie +65.54.36.224 - 65.54.39.255 nl +65.54.40.0 - 65.54.40.255 sg +65.54.41.0 - 65.54.65.255 us +65.54.66.0 - 65.54.67.31 br +65.54.67.32 - 65.54.75.255 us +65.54.76.0 - 65.54.76.255 fr +65.54.77.0 - 65.54.81.255 us +65.54.82.0 - 65.54.82.255 sg +65.54.83.0 - 65.54.84.255 us +65.54.85.0 - 65.54.85.255 br +65.54.86.0 - 65.54.87.255 us +65.54.88.0 - 65.54.89.255 nl +65.54.90.0 - 65.54.119.255 us +65.54.120.0 - 65.54.127.255 fr +65.54.128.0 - 65.54.162.15 us +65.54.162.16 - 65.54.162.31 nl +65.54.162.32 - 65.54.162.95 us +65.54.162.96 - 65.54.162.111 ie +65.54.162.112 - 65.55.94.47 us +65.55.94.48 - 65.55.94.63 sg +65.55.94.64 - 65.61.191.255 us +65.61.192.0 - 65.61.255.255 ca +65.62.0.0 - 65.75.63.255 us 65.75.64.0 - 65.75.127.255 bs 65.75.128.0 - 65.77.243.255 us 65.77.244.0 - 65.77.245.255 ca -65.77.246.0 - 65.87.16.151 us -65.87.16.152 - 65.87.16.159 co -65.87.16.160 - 65.87.223.255 us +65.77.246.0 - 65.87.223.255 us 65.87.224.0 - 65.87.255.255 ca -65.88.0.0 - 65.88.18.63 us -65.88.18.64 - 65.88.18.127 a2 -65.88.18.128 - 65.88.253.255 us +65.88.0.0 - 65.88.253.255 us 65.88.254.0 - 65.88.255.255 a2 65.89.0.0 - 65.91.255.255 us 65.92.0.0 - 65.95.255.255 ca @@ -21260,315 +15317,120 @@ 65.97.58.0 - 65.97.58.255 gb 65.97.59.0 - 65.97.191.255 us 65.97.192.0 - 65.97.255.255 ca -65.98.0.0 - 65.98.23.15 us -65.98.23.16 - 65.98.23.23 my -65.98.23.24 - 65.98.35.23 us -65.98.35.24 - 65.98.35.31 ca -65.98.35.32 - 65.98.42.135 us -65.98.42.136 - 65.98.42.143 gb -65.98.42.144 - 65.98.42.199 us -65.98.42.200 - 65.98.42.207 gb -65.98.42.208 - 65.98.58.47 us -65.98.58.48 - 65.98.58.55 gb -65.98.58.56 - 65.98.58.215 us -65.98.58.216 - 65.98.58.223 gb -65.98.58.224 - 65.98.61.63 us -65.98.61.64 - 65.98.61.71 ca -65.98.61.72 - 65.98.63.79 us -65.98.63.80 - 65.98.63.95 ie -65.98.63.96 - 65.98.67.71 us -65.98.67.72 - 65.98.67.79 in -65.98.67.80 - 65.98.70.111 us -65.98.70.112 - 65.98.70.119 gb -65.98.70.120 - 65.98.74.255 us -65.98.75.0 - 65.98.75.127 gb -65.98.75.128 - 65.98.88.167 us -65.98.88.168 - 65.98.88.175 in -65.98.88.176 - 65.98.96.159 us -65.98.96.160 - 65.98.96.167 in -65.98.96.168 - 65.98.103.191 us -65.98.103.192 - 65.98.103.223 ca -65.98.103.224 - 65.98.103.255 us -65.98.104.0 - 65.98.104.127 gb -65.98.104.128 - 65.98.107.111 us -65.98.107.112 - 65.98.107.119 ca -65.98.107.120 - 65.98.108.255 us -65.98.109.0 - 65.98.109.7 in -65.98.109.8 - 65.99.193.47 us -65.99.193.48 - 65.99.193.63 se -65.99.193.64 - 65.99.197.87 us -65.99.197.88 - 65.99.197.95 it -65.99.197.96 - 65.99.197.119 us -65.99.197.120 - 65.99.197.127 nz -65.99.197.128 - 65.99.197.191 us -65.99.197.192 - 65.99.197.199 nz -65.99.197.200 - 65.99.197.207 it -65.99.197.208 - 65.99.199.255 us -65.99.200.0 - 65.99.200.63 it -65.99.200.64 - 65.99.204.63 us -65.99.204.64 - 65.99.204.71 pr -65.99.204.72 - 65.99.207.255 us -65.99.208.0 - 65.99.208.7 it -65.99.208.8 - 65.99.208.15 au -65.99.208.16 - 65.99.208.31 us -65.99.208.32 - 65.99.208.47 it -65.99.208.48 - 65.99.208.111 us -65.99.208.112 - 65.99.208.119 it -65.99.208.120 - 65.99.220.239 us -65.99.220.240 - 65.99.220.255 it -65.99.221.0 - 65.99.226.191 us -65.99.226.192 - 65.99.226.207 ca -65.99.226.208 - 65.99.235.255 us -65.99.236.0 - 65.99.237.255 gb -65.99.238.0 - 65.99.241.255 us -65.99.242.0 - 65.99.242.255 ca -65.99.243.0 - 65.100.229.175 us -65.100.229.176 - 65.100.229.183 hk -65.100.229.184 - 65.109.255.255 us -65.110.0.0 - 65.110.4.127 ca -65.110.4.128 - 65.110.4.143 us -65.110.4.144 - 65.110.11.31 ca -65.110.11.32 - 65.110.11.39 us -65.110.11.40 - 65.110.13.119 ca -65.110.13.120 - 65.110.13.127 gb -65.110.13.128 - 65.110.31.255 ca +65.98.0.0 - 65.100.13.155 us +65.100.13.156 - 65.100.13.159 de +65.100.13.160 - 65.109.255.255 us +65.110.0.0 - 65.110.31.255 ca 65.110.32.0 - 65.110.159.255 us -65.110.160.0 - 65.110.191.255 ca -65.110.192.0 - 65.111.15.255 us -65.111.16.0 - 65.111.16.255 de -65.111.17.0 - 65.111.143.255 us +65.110.160.0 - 65.110.223.255 ca +65.110.224.0 - 65.111.143.255 us 65.111.144.0 - 65.111.159.255 ca 65.111.160.0 - 65.112.144.255 us -65.112.145.0 - 65.112.147.7 vi -65.112.147.8 - 65.112.147.15 us -65.112.147.16 - 65.112.148.255 vi +65.112.145.0 - 65.112.146.71 vi +65.112.146.72 - 65.112.146.79 us +65.112.146.80 - 65.112.148.255 vi 65.112.149.0 - 65.113.87.255 us -65.113.88.0 - 65.113.89.223 vi -65.113.89.224 - 65.113.89.231 us -65.113.89.232 - 65.113.92.119 vi -65.113.92.120 - 65.113.92.127 us -65.113.92.128 - 65.113.95.255 vi +65.113.88.0 - 65.113.88.15 vi +65.113.88.16 - 65.113.88.31 us +65.113.88.32 - 65.113.88.71 vi +65.113.88.72 - 65.113.88.79 us +65.113.88.80 - 65.113.88.191 vi +65.113.88.192 - 65.113.88.255 us +65.113.89.0 - 65.113.90.87 vi +65.113.90.88 - 65.113.90.95 us +65.113.90.96 - 65.113.92.167 vi +65.113.92.168 - 65.113.92.175 us +65.113.92.176 - 65.113.95.255 vi 65.113.96.0 - 65.113.103.255 us 65.113.104.0 - 65.113.111.255 vi -65.113.112.0 - 65.115.6.159 us -65.115.6.160 - 65.115.6.191 ca -65.115.6.192 - 65.117.5.15 us -65.117.5.16 - 65.117.5.23 ca -65.117.5.24 - 65.119.141.47 us -65.119.141.48 - 65.119.141.63 ca -65.119.141.64 - 65.119.251.63 us -65.119.251.64 - 65.119.251.95 ca -65.119.251.96 - 65.120.55.255 us -65.120.56.0 - 65.120.63.255 a2 -65.120.64.0 - 65.127.193.55 us -65.127.193.56 - 65.127.193.87 au -65.127.193.88 - 65.127.193.103 us +65.113.112.0 - 65.115.56.255 us +65.115.57.0 - 65.115.57.7 gr +65.115.57.8 - 65.115.57.23 us +65.115.57.24 - 65.115.57.31 be +65.115.57.32 - 65.127.193.103 us 65.127.193.104 - 65.127.193.111 au -65.127.193.112 - 65.127.193.127 us -65.127.193.128 - 65.127.193.159 au -65.127.193.160 - 65.127.193.175 us -65.127.193.176 - 65.127.193.191 au -65.127.193.192 - 65.127.193.223 us -65.127.193.224 - 65.127.193.255 au -65.127.194.0 - 65.127.194.95 us -65.127.194.96 - 65.127.194.111 au -65.127.194.112 - 65.127.194.127 us -65.127.194.128 - 65.127.194.159 au -65.127.194.160 - 65.127.194.175 us -65.127.194.176 - 65.127.194.223 au -65.127.194.224 - 65.127.194.239 us -65.127.194.240 - 65.127.194.255 au -65.127.195.0 - 65.160.142.127 us -65.160.142.128 - 65.160.142.255 in -65.160.143.0 - 65.161.31.183 us -65.161.31.184 - 65.161.31.191 ca -65.161.31.192 - 65.161.167.47 us -65.161.167.48 - 65.161.167.55 ca -65.161.167.56 - 65.161.187.31 us -65.161.187.32 - 65.161.187.63 gb -65.161.187.64 - 65.161.199.255 us +65.127.193.112 - 65.161.199.255 us 65.161.200.0 - 65.161.200.255 ec -65.161.201.0 - 65.162.15.255 us -65.162.16.0 - 65.162.16.255 pr -65.162.17.0 - 65.162.162.135 us -65.162.162.136 - 65.162.162.143 fr -65.162.162.144 - 65.162.183.255 us +65.161.201.0 - 65.162.183.255 us 65.162.184.0 - 65.162.185.255 ye 65.162.186.0 - 65.162.213.255 us 65.162.214.0 - 65.162.215.255 ec 65.162.216.0 - 65.163.91.255 us 65.163.92.0 - 65.163.92.255 ec 65.163.93.0 - 65.163.240.255 us -65.163.241.0 - 65.163.241.255 an +65.163.241.0 - 65.163.241.255 cw 65.163.242.0 - 65.164.2.255 us 65.164.3.0 - 65.164.3.255 ca -65.164.4.0 - 65.164.89.255 us -65.164.90.0 - 65.164.90.255 an -65.164.91.0 - 65.164.144.255 us +65.164.4.0 - 65.164.144.255 us 65.164.145.0 - 65.164.145.255 ec 65.164.146.0 - 65.164.147.255 us 65.164.148.0 - 65.164.151.255 hn -65.164.152.0 - 65.164.152.191 us -65.164.152.192 - 65.164.152.223 pr -65.164.152.224 - 65.165.28.239 us -65.165.28.240 - 65.165.28.255 ca -65.165.29.0 - 65.165.79.255 us +65.164.152.0 - 65.165.79.255 us 65.165.80.0 - 65.165.87.255 hn -65.165.88.0 - 65.165.96.159 us -65.165.96.160 - 65.165.96.167 se -65.165.96.168 - 65.165.208.127 us -65.165.208.128 - 65.165.208.191 dk -65.165.208.192 - 65.166.15.175 us +65.165.88.0 - 65.166.15.175 us 65.166.15.176 - 65.166.15.191 pr 65.166.15.192 - 65.166.108.255 us 65.166.109.0 - 65.166.109.255 ec -65.166.110.0 - 65.166.165.39 us -65.166.165.40 - 65.166.165.47 ca -65.166.165.48 - 65.166.186.143 us -65.166.186.144 - 65.166.186.159 ca -65.166.186.160 - 65.166.248.255 us -65.166.249.0 - 65.166.249.255 an +65.166.110.0 - 65.166.239.255 us +65.166.240.0 - 65.166.247.255 bb +65.166.248.0 - 65.166.248.255 us +65.166.249.0 - 65.166.249.255 cw 65.166.250.0 - 65.167.23.255 us 65.167.24.0 - 65.167.31.255 hn 65.167.32.0 - 65.167.47.255 us 65.167.48.0 - 65.167.63.255 co 65.167.64.0 - 65.167.79.255 us 65.167.80.0 - 65.167.95.255 co -65.167.96.0 - 65.167.113.143 us -65.167.113.144 - 65.167.113.159 be -65.167.113.160 - 65.167.225.255 us -65.167.226.0 - 65.167.227.255 as -65.167.228.0 - 65.167.232.95 us -65.167.232.96 - 65.167.232.127 gb -65.167.232.128 - 65.168.51.255 us +65.167.96.0 - 65.167.226.255 us +65.167.227.0 - 65.167.227.255 as +65.167.228.0 - 65.168.51.255 us 65.168.52.0 - 65.168.53.255 co 65.168.54.0 - 65.168.177.255 us 65.168.178.0 - 65.168.179.255 ec -65.168.180.0 - 65.169.90.15 us -65.169.90.16 - 65.169.90.23 ca -65.169.90.24 - 65.169.96.47 us -65.169.96.48 - 65.169.96.55 nl -65.169.96.56 - 65.169.119.255 us -65.169.120.0 - 65.169.120.63 vi -65.169.120.64 - 65.169.154.143 us -65.169.154.144 - 65.169.154.159 vi -65.169.154.160 - 65.169.158.255 us +65.168.180.0 - 65.169.158.255 us 65.169.159.0 - 65.169.159.255 hn 65.169.160.0 - 65.169.217.255 us 65.169.218.0 - 65.169.219.255 hn -65.169.220.0 - 65.170.10.231 us -65.170.10.232 - 65.170.10.239 pr -65.170.10.240 - 65.170.30.255 us +65.169.220.0 - 65.170.30.255 us 65.170.31.0 - 65.170.31.255 ec -65.170.32.0 - 65.170.62.103 us -65.170.62.104 - 65.170.62.111 ca -65.170.62.112 - 65.170.63.255 us +65.170.32.0 - 65.170.63.255 us 65.170.64.0 - 65.170.71.255 ec 65.170.72.0 - 65.170.82.255 us 65.170.83.0 - 65.170.83.255 nl -65.170.84.0 - 65.170.98.135 us -65.170.98.136 - 65.170.98.143 nl -65.170.98.144 - 65.170.178.15 us -65.170.178.16 - 65.170.178.31 pr -65.170.178.32 - 65.171.25.103 us -65.171.25.104 - 65.171.25.111 ch -65.171.25.112 - 65.171.97.255 us +65.170.84.0 - 65.171.97.255 us 65.171.98.0 - 65.171.99.255 bm 65.171.100.0 - 65.171.163.255 us -65.171.164.0 - 65.171.165.255 an +65.171.164.0 - 65.171.165.255 cw 65.171.166.0 - 65.172.1.255 us 65.172.2.0 - 65.172.2.255 a2 65.172.3.0 - 65.172.3.255 us 65.172.4.0 - 65.172.5.255 a2 -65.172.6.0 - 65.172.179.255 us +65.172.6.0 - 65.172.23.255 us +65.172.24.0 - 65.172.27.255 bb +65.172.28.0 - 65.172.47.255 us +65.172.48.0 - 65.172.51.255 hn +65.172.52.0 - 65.172.179.255 us 65.172.180.0 - 65.172.180.255 ec -65.172.181.0 - 65.172.255.255 us -65.173.0.0 - 65.173.0.7 dk -65.173.0.8 - 65.173.29.31 us -65.173.29.32 - 65.173.29.63 be -65.173.29.64 - 65.173.47.255 us +65.172.181.0 - 65.173.47.255 us 65.173.48.0 - 65.173.49.255 gh 65.173.50.0 - 65.173.55.255 us 65.173.56.0 - 65.173.63.255 bo -65.173.64.0 - 65.173.98.79 us -65.173.98.80 - 65.173.98.95 gb -65.173.98.96 - 65.173.189.255 us +65.173.64.0 - 65.173.189.255 us 65.173.190.0 - 65.173.190.255 gh -65.173.191.0 - 65.173.252.127 us -65.173.252.128 - 65.173.252.191 ba -65.173.252.192 - 65.174.117.183 us -65.174.117.184 - 65.174.117.191 ca -65.174.117.192 - 65.174.190.127 us -65.174.190.128 - 65.174.190.135 vi -65.174.190.136 - 65.174.198.31 us -65.174.198.32 - 65.174.198.47 pr -65.174.198.48 - 65.174.231.223 us -65.174.231.224 - 65.174.231.255 a2 -65.174.232.0 - 65.174.237.255 us -65.174.238.0 - 65.174.239.255 an -65.174.240.0 - 65.175.63.255 us -65.175.64.0 - 65.175.64.255 in -65.175.65.0 - 65.175.65.255 us +65.173.191.0 - 65.175.16.127 us +65.175.16.128 - 65.175.16.255 nl +65.175.17.0 - 65.175.65.255 us 65.175.66.0 - 65.175.66.255 in 65.175.67.0 - 65.175.67.255 us 65.175.68.0 - 65.175.68.255 ca 65.175.69.0 - 65.175.69.255 pk -65.175.70.0 - 65.175.70.63 be -65.175.70.64 - 65.175.70.127 us -65.175.70.128 - 65.175.70.191 in -65.175.70.192 - 65.175.71.255 us +65.175.70.0 - 65.175.71.255 us 65.175.72.0 - 65.175.72.255 ca 65.175.73.0 - 65.175.75.255 us 65.175.76.0 - 65.175.76.255 pk -65.175.77.0 - 65.175.77.47 us -65.175.77.48 - 65.175.77.63 ar -65.175.77.64 - 65.175.77.127 us -65.175.77.128 - 65.175.77.143 in -65.175.77.144 - 65.175.77.239 us -65.175.77.240 - 65.175.77.255 ve -65.175.78.0 - 65.175.79.15 us -65.175.79.16 - 65.175.79.23 do -65.175.79.24 - 65.175.79.31 us -65.175.79.32 - 65.175.79.39 ca -65.175.79.40 - 65.175.79.95 us -65.175.79.96 - 65.175.79.103 gb -65.175.79.104 - 65.175.79.159 us -65.175.79.160 - 65.175.79.167 ca -65.175.79.168 - 65.175.81.31 us -65.175.81.32 - 65.175.81.63 ca -65.175.81.64 - 65.175.81.95 be -65.175.81.96 - 65.175.81.159 us -65.175.81.160 - 65.175.81.191 be -65.175.81.192 - 65.175.81.255 us -65.175.82.0 - 65.175.82.31 be -65.175.82.32 - 65.175.88.255 us +65.175.77.0 - 65.175.88.255 us 65.175.89.0 - 65.175.89.255 pk -65.175.90.0 - 65.175.92.255 us -65.175.93.0 - 65.175.93.15 ve -65.175.93.16 - 65.175.93.95 us -65.175.93.96 - 65.175.93.111 tr -65.175.93.112 - 65.175.93.207 us -65.175.93.208 - 65.175.93.223 cr -65.175.93.224 - 65.175.93.239 us -65.175.93.240 - 65.175.93.255 au -65.175.94.0 - 65.175.97.127 us -65.175.97.128 - 65.175.97.255 in -65.175.98.0 - 65.175.98.239 us -65.175.98.240 - 65.175.98.255 ve -65.175.99.0 - 65.175.102.255 us -65.175.103.0 - 65.175.103.127 in -65.175.103.128 - 65.175.103.191 ca -65.175.103.192 - 65.175.110.255 us -65.175.111.0 - 65.175.111.31 ar -65.175.111.32 - 65.175.111.95 us -65.175.111.96 - 65.175.111.127 my -65.175.111.128 - 65.175.114.63 us -65.175.114.64 - 65.175.114.95 dm -65.175.114.96 - 65.175.119.127 us -65.175.119.128 - 65.175.119.191 tz -65.175.119.192 - 65.175.123.255 us -65.175.124.0 - 65.175.124.127 in -65.175.124.128 - 65.181.31.255 us +65.175.90.0 - 65.181.31.255 us 65.181.32.0 - 65.181.47.255 ca 65.181.48.0 - 65.181.255.255 us 65.182.0.0 - 65.182.6.255 hn @@ -21576,62 +15438,17 @@ 65.182.10.0 - 65.182.10.255 sv 65.182.11.0 - 65.182.30.255 cr 65.182.31.0 - 65.182.31.255 hn -65.182.32.0 - 65.182.162.59 us -65.182.162.60 - 65.182.162.99 in -65.182.162.100 - 65.182.162.220 us -65.182.162.221 - 65.182.162.251 in -65.182.162.252 - 65.182.186.15 us -65.182.186.16 - 65.182.186.19 au -65.182.186.20 - 65.182.186.54 us -65.182.186.55 - 65.182.186.71 au -65.182.186.72 - 65.182.186.84 us -65.182.186.85 - 65.182.186.89 gb -65.182.186.90 - 65.182.186.93 ca -65.182.186.94 - 65.182.186.124 us -65.182.186.125 - 65.182.186.170 au -65.182.186.171 - 65.182.191.31 us -65.182.191.32 - 65.182.191.39 au -65.182.191.40 - 65.182.255.255 us +65.182.32.0 - 65.182.255.255 us 65.183.0.0 - 65.183.15.255 jm 65.183.16.0 - 65.194.45.255 us 65.194.46.0 - 65.194.46.255 ec -65.194.47.0 - 65.197.176.255 us -65.197.177.0 - 65.197.177.255 mh -65.197.178.0 - 65.197.181.255 us -65.197.182.0 - 65.197.182.31 ca -65.197.182.32 - 65.198.207.255 us +65.194.47.0 - 65.198.207.255 us 65.198.208.0 - 65.198.215.255 bs -65.198.216.0 - 65.199.100.31 us -65.199.100.32 - 65.199.100.47 de -65.199.100.48 - 65.199.167.255 us +65.198.216.0 - 65.199.167.255 us 65.199.168.0 - 65.199.175.255 ec 65.199.176.0 - 65.199.243.255 us 65.199.244.0 - 65.199.245.255 co -65.199.246.0 - 65.200.52.127 us -65.200.52.128 - 65.200.52.159 pr -65.200.52.160 - 65.200.60.87 us -65.200.60.88 - 65.200.60.95 pr -65.200.60.96 - 65.200.171.191 us -65.200.171.192 - 65.200.171.255 gb -65.200.172.0 - 65.200.192.255 us -65.200.193.0 - 65.200.193.63 au -65.200.193.64 - 65.200.193.127 us -65.200.193.128 - 65.200.193.255 au -65.200.194.0 - 65.200.194.255 us -65.200.195.0 - 65.200.195.15 au -65.200.195.16 - 65.200.204.79 us -65.200.204.80 - 65.200.204.87 ph -65.200.204.88 - 65.200.204.191 us -65.200.204.192 - 65.200.204.255 ph -65.200.205.0 - 65.200.205.111 us -65.200.205.112 - 65.200.205.127 au -65.200.205.128 - 65.202.34.255 us -65.202.35.0 - 65.202.35.255 pr -65.202.36.0 - 65.202.47.23 us -65.202.47.24 - 65.202.47.31 lu -65.202.47.32 - 65.204.158.223 us -65.204.158.224 - 65.204.158.231 mx -65.204.158.232 - 65.204.165.255 us +65.199.246.0 - 65.204.165.255 us 65.204.166.0 - 65.204.166.255 mx 65.204.167.0 - 65.205.132.255 us 65.205.133.0 - 65.205.133.255 br @@ -21639,130 +15456,38 @@ 65.205.150.0 - 65.205.150.255 fi 65.205.151.0 - 65.205.167.255 us 65.205.168.0 - 65.205.169.255 ec -65.205.170.0 - 65.205.193.127 us -65.205.193.128 - 65.205.193.255 ph -65.205.194.0 - 65.206.8.255 us -65.206.9.0 - 65.206.9.255 pk -65.206.10.0 - 65.206.42.95 us -65.206.42.96 - 65.206.42.127 pr -65.206.42.128 - 65.206.54.159 us -65.206.54.160 - 65.206.54.191 gb -65.206.54.192 - 65.206.241.239 us -65.206.241.240 - 65.206.241.247 pr -65.206.241.248 - 65.206.245.247 us -65.206.245.248 - 65.206.245.255 um -65.206.246.0 - 65.207.4.159 us -65.207.4.160 - 65.207.4.167 vi -65.207.4.168 - 65.207.44.151 us -65.207.44.152 - 65.207.44.159 de -65.207.44.160 - 65.208.63.255 us +65.205.170.0 - 65.208.63.255 us 65.208.64.0 - 65.208.71.255 co -65.208.72.0 - 65.208.173.7 us -65.208.173.8 - 65.208.173.15 pr -65.208.173.16 - 65.209.65.39 us -65.209.65.40 - 65.209.65.47 ca -65.209.65.48 - 65.209.191.255 us +65.208.72.0 - 65.209.191.255 us 65.209.192.0 - 65.209.193.255 ph -65.209.194.0 - 65.211.202.223 us -65.211.202.224 - 65.211.202.231 ca -65.211.202.232 - 65.212.3.255 us -65.212.4.0 - 65.212.4.15 ca -65.212.4.16 - 65.212.6.79 us -65.212.6.80 - 65.212.6.95 ca -65.212.6.96 - 65.213.54.255 us +65.209.194.0 - 65.213.54.255 us 65.213.55.0 - 65.213.55.255 ph -65.213.56.0 - 65.213.127.255 us -65.213.128.0 - 65.213.130.255 ec -65.213.131.0 - 65.214.61.31 us -65.214.61.32 - 65.214.61.39 ca -65.214.61.40 - 65.214.61.127 us -65.214.61.128 - 65.214.61.143 ca -65.214.61.144 - 65.215.27.63 us -65.215.27.64 - 65.215.27.79 de -65.215.27.80 - 65.215.35.31 us -65.215.35.32 - 65.215.35.63 ca -65.215.35.64 - 65.215.84.191 us -65.215.84.192 - 65.215.84.255 ca -65.215.85.0 - 65.215.224.127 us -65.215.224.128 - 65.215.224.143 ca -65.215.224.144 - 65.216.132.79 us -65.216.132.80 - 65.216.132.95 de -65.216.132.96 - 65.217.184.31 us -65.217.184.32 - 65.217.184.63 gb -65.217.184.64 - 65.218.130.151 us -65.218.130.152 - 65.218.130.159 gb -65.218.130.160 - 65.218.143.255 us +65.213.56.0 - 65.218.143.255 us 65.218.144.0 - 65.218.151.255 pr -65.218.152.0 - 65.218.254.7 us -65.218.254.8 - 65.218.254.15 mx -65.218.254.16 - 65.219.37.191 us -65.219.37.192 - 65.219.37.255 ph -65.219.38.0 - 65.221.124.255 us -65.221.125.0 - 65.221.125.255 it -65.221.126.0 - 65.222.122.255 us +65.218.152.0 - 65.219.110.255 us +65.219.111.0 - 65.219.111.255 ca +65.219.112.0 - 65.222.122.255 us 65.222.123.0 - 65.222.123.255 ec -65.222.124.0 - 65.223.27.39 us -65.223.27.40 - 65.223.27.47 mx -65.223.27.48 - 65.223.34.191 us -65.223.34.192 - 65.223.34.199 mn -65.223.34.200 - 65.223.36.255 us -65.223.37.0 - 65.223.37.7 mn -65.223.37.8 - 65.223.76.191 us -65.223.76.192 - 65.223.76.255 ph -65.223.77.0 - 65.223.214.111 us -65.223.214.112 - 65.223.214.119 ca -65.223.214.120 - 65.240.226.127 us -65.240.226.128 - 65.240.226.135 ca -65.240.226.136 - 65.240.227.255 us -65.240.228.0 - 65.240.228.31 ca -65.240.228.32 - 65.240.235.127 us -65.240.235.128 - 65.240.235.191 ca -65.240.235.192 - 65.241.27.47 us -65.241.27.48 - 65.241.27.55 ca -65.241.27.56 - 65.241.142.31 us -65.241.142.32 - 65.241.142.39 um -65.241.142.40 - 65.242.196.31 us -65.242.196.32 - 65.242.196.47 um -65.242.196.48 - 65.242.245.143 us -65.242.245.144 - 65.242.245.151 a2 -65.242.245.152 - 65.242.253.103 us -65.242.253.104 - 65.242.253.111 ca -65.242.253.112 - 65.243.99.63 us -65.243.99.64 - 65.243.99.127 co -65.243.99.128 - 65.243.99.255 us +65.222.124.0 - 65.231.239.255 us +65.231.240.0 - 65.231.255.255 in +65.232.0.0 - 65.242.9.143 us +65.242.9.144 - 65.242.9.151 um +65.242.9.152 - 65.243.99.255 us 65.243.100.0 - 65.243.103.255 bs 65.243.104.0 - 65.243.119.255 us 65.243.120.0 - 65.243.121.255 co -65.243.122.0 - 65.243.156.127 us -65.243.156.128 - 65.243.156.191 ph -65.243.156.192 - 65.243.199.71 us -65.243.199.72 - 65.243.199.87 gb -65.243.199.88 - 65.244.90.23 us -65.244.90.24 - 65.244.90.31 tw -65.244.90.32 - 65.244.148.31 us -65.244.148.32 - 65.244.148.47 dk -65.244.148.48 - 65.244.224.255 us -65.244.225.0 - 65.244.225.31 nz -65.244.225.32 - 65.245.118.127 us -65.245.118.128 - 65.245.118.135 de -65.245.118.136 - 65.246.172.119 us -65.246.172.120 - 65.246.172.127 ca -65.246.172.128 - 65.247.203.255 us +65.243.122.0 - 65.247.134.255 us +65.247.135.0 - 65.247.135.255 cr +65.247.136.0 - 65.247.203.255 us 65.247.204.0 - 65.247.205.255 ec 65.247.206.0 - 65.247.207.255 co 65.247.208.0 - 65.247.239.255 us 65.247.240.0 - 65.247.241.255 co 65.247.242.0 - 65.247.243.255 ec 65.247.244.0 - 65.247.247.255 co -65.247.248.0 - 65.248.166.255 us -65.248.167.0 - 65.248.167.255 ec -65.248.168.0 - 65.254.214.255 us -65.254.215.0 - 65.254.215.15 ax -65.254.215.16 - 65.255.40.255 us -65.255.41.0 - 65.255.41.127 cn -65.255.41.128 - 65.255.41.255 us -65.255.42.0 - 65.255.42.127 cn -65.255.42.128 - 65.255.47.255 us +65.247.248.0 - 65.255.35.255 us +65.255.36.0 - 65.255.39.255 cn +65.255.40.0 - 65.255.47.255 us 65.255.48.0 - 65.255.63.255 tc 65.255.64.0 - 65.255.175.255 us 65.255.176.0 - 65.255.191.255 ca @@ -21770,15 +15495,7 @@ 65.255.224.0 - 65.255.239.255 ca 65.255.240.0 - 66.6.47.255 us 66.6.48.0 - 66.6.63.255 ca -66.6.64.0 - 66.7.181.23 us -66.7.181.24 - 66.7.181.31 ca -66.7.181.32 - 66.7.210.74 us -66.7.210.75 - 66.7.210.78 pe -66.7.210.79 - 66.7.210.109 us -66.7.210.110 - 66.7.210.113 pe -66.7.210.114 - 66.7.214.58 us -66.7.214.59 - 66.7.214.59 ca -66.7.214.60 - 66.7.255.255 us +66.6.64.0 - 66.7.255.255 us 66.8.0.0 - 66.8.127.255 za 66.8.128.0 - 66.9.34.255 us 66.9.35.0 - 66.9.37.255 gb @@ -21787,8 +15504,8 @@ 66.9.54.0 - 66.9.56.255 us 66.9.57.0 - 66.9.57.255 gb 66.9.58.0 - 66.9.79.255 us -66.9.80.0 - 66.9.80.255 gb -66.9.81.0 - 66.9.84.255 us +66.9.80.0 - 66.9.81.255 gb +66.9.82.0 - 66.9.84.255 us 66.9.85.0 - 66.9.85.255 gb 66.9.86.0 - 66.9.90.255 us 66.9.91.0 - 66.9.91.255 gb @@ -21809,398 +15526,135 @@ 66.11.48.0 - 66.11.63.255 us 66.11.64.0 - 66.11.95.255 ca 66.11.96.0 - 66.11.143.255 us -66.11.144.0 - 66.11.145.31 ca -66.11.145.32 - 66.11.145.47 us -66.11.145.48 - 66.11.145.255 ca -66.11.146.0 - 66.11.146.15 us -66.11.146.16 - 66.11.146.159 ca -66.11.146.160 - 66.11.146.167 us -66.11.146.168 - 66.11.146.223 ca -66.11.146.224 - 66.11.146.239 us -66.11.146.240 - 66.11.147.255 ca -66.11.148.0 - 66.11.148.63 us -66.11.148.64 - 66.11.149.103 ca -66.11.149.104 - 66.11.149.111 us -66.11.149.112 - 66.11.149.127 ca -66.11.149.128 - 66.11.149.143 us -66.11.149.144 - 66.11.149.159 ca -66.11.149.160 - 66.11.149.175 us -66.11.149.176 - 66.11.149.223 ca -66.11.149.224 - 66.11.149.255 us -66.11.150.0 - 66.11.151.95 ca -66.11.151.96 - 66.11.151.111 us -66.11.151.112 - 66.11.151.159 ca -66.11.151.160 - 66.11.151.175 us -66.11.151.176 - 66.11.152.63 pa -66.11.152.64 - 66.11.152.127 us -66.11.152.128 - 66.11.152.143 ca -66.11.152.144 - 66.11.152.151 gb -66.11.152.152 - 66.11.152.159 ca -66.11.152.160 - 66.11.152.191 us -66.11.152.192 - 66.11.152.223 ca -66.11.152.224 - 66.11.152.255 cr -66.11.153.0 - 66.11.153.31 ca -66.11.153.32 - 66.11.153.63 us -66.11.153.64 - 66.11.153.87 ca -66.11.153.88 - 66.11.153.95 us -66.11.153.96 - 66.11.153.207 ca -66.11.153.208 - 66.11.153.215 us -66.11.153.216 - 66.11.154.3 ca -66.11.154.4 - 66.11.154.5 us -66.11.154.6 - 66.11.154.95 ca -66.11.154.96 - 66.11.154.127 us -66.11.154.128 - 66.11.154.151 ca -66.11.154.152 - 66.11.154.159 us -66.11.154.160 - 66.11.154.207 ca -66.11.154.208 - 66.11.154.215 cr -66.11.154.216 - 66.11.154.223 gb -66.11.154.224 - 66.11.155.239 ca -66.11.155.240 - 66.11.155.247 nl -66.11.155.248 - 66.11.155.255 us -66.11.156.0 - 66.11.156.47 ca -66.11.156.48 - 66.11.156.63 us -66.11.156.64 - 66.11.156.127 ca -66.11.156.128 - 66.11.156.151 us -66.11.156.152 - 66.11.156.247 ca -66.11.156.248 - 66.11.156.255 gb -66.11.157.0 - 66.11.157.39 ca -66.11.157.40 - 66.11.157.47 us -66.11.157.48 - 66.11.157.159 ca -66.11.157.160 - 66.11.157.175 bs -66.11.157.176 - 66.11.157.191 us -66.11.157.192 - 66.11.158.175 ca -66.11.158.176 - 66.11.158.183 us -66.11.158.184 - 66.11.191.255 ca +66.11.144.0 - 66.11.191.255 ca 66.11.192.0 - 66.18.63.255 us 66.18.64.0 - 66.18.95.255 za 66.18.96.0 - 66.18.191.255 us 66.18.192.0 - 66.18.255.255 ca -66.19.0.0 - 66.23.229.63 us -66.23.229.64 - 66.23.229.127 lt -66.23.229.128 - 66.29.192.29 us -66.29.192.30 - 66.29.192.41 gb -66.29.192.42 - 66.29.192.69 us -66.29.192.70 - 66.29.192.77 au -66.29.192.78 - 66.29.192.175 us -66.29.192.176 - 66.29.192.183 ie -66.29.192.184 - 66.29.193.28 us -66.29.193.29 - 66.29.193.37 ie -66.29.193.38 - 66.29.195.1 us -66.29.195.2 - 66.29.195.10 ca -66.29.195.11 - 66.29.197.118 us -66.29.197.119 - 66.29.197.138 ca -66.29.197.139 - 66.29.197.144 us -66.29.197.145 - 66.29.197.156 nz -66.29.197.157 - 66.29.197.171 us -66.29.197.172 - 66.29.197.181 ca -66.29.197.182 - 66.29.198.40 us -66.29.198.41 - 66.29.198.48 au -66.29.198.49 - 66.29.198.224 us -66.29.198.225 - 66.29.198.244 ph -66.29.198.245 - 66.29.199.48 us -66.29.199.49 - 66.29.199.56 ca -66.29.199.57 - 66.29.204.129 us -66.29.204.130 - 66.29.204.137 ph -66.29.204.138 - 66.29.211.44 us -66.29.211.45 - 66.29.211.52 ph -66.29.211.53 - 66.29.217.103 us -66.29.217.104 - 66.29.217.111 au -66.29.217.112 - 66.29.218.170 us -66.29.218.171 - 66.29.218.178 ca -66.29.218.179 - 66.29.218.195 us -66.29.218.196 - 66.29.218.205 ca -66.29.218.206 - 66.29.221.40 us -66.29.221.41 - 66.29.221.56 ch -66.29.221.57 - 66.29.221.124 us -66.29.221.125 - 66.29.221.132 ch -66.29.221.133 - 66.35.192.31 us -66.35.192.32 - 66.35.192.47 in -66.35.192.48 - 66.35.201.191 us -66.35.201.192 - 66.35.201.207 jp -66.35.201.208 - 66.35.204.127 us -66.35.204.128 - 66.35.204.143 il -66.35.204.144 - 66.35.204.175 us -66.35.204.176 - 66.35.204.191 il -66.35.204.192 - 66.35.205.87 us -66.35.205.88 - 66.35.205.95 de -66.35.205.96 - 66.35.208.39 us -66.35.208.40 - 66.35.208.47 de -66.35.208.48 - 66.35.208.255 us -66.35.209.0 - 66.35.209.31 ca -66.35.209.32 - 66.35.223.127 us -66.35.223.128 - 66.35.223.143 au -66.35.223.144 - 66.35.227.191 us -66.35.227.192 - 66.35.227.207 jp -66.35.227.208 - 66.35.230.31 us -66.35.230.32 - 66.35.230.47 au -66.35.230.48 - 66.35.236.207 us -66.35.236.208 - 66.35.236.223 au -66.35.236.224 - 66.36.127.255 us +66.19.0.0 - 66.36.127.255 us 66.36.128.0 - 66.36.159.255 ca 66.36.160.0 - 66.36.195.255 us -66.36.196.0 - 66.36.196.15 cg -66.36.196.16 - 66.36.196.31 us -66.36.196.32 - 66.36.196.63 cd -66.36.196.64 - 66.36.196.95 us -66.36.196.96 - 66.36.196.111 cd -66.36.196.112 - 66.36.196.127 us -66.36.196.128 - 66.36.196.255 cd +66.36.196.0 - 66.36.196.255 cg 66.36.197.0 - 66.36.200.255 us 66.36.201.0 - 66.36.201.255 jm 66.36.202.0 - 66.36.202.255 us 66.36.203.0 - 66.36.203.255 mw -66.36.204.0 - 66.36.207.95 us -66.36.207.96 - 66.36.207.127 ht -66.36.207.128 - 66.36.211.255 us +66.36.204.0 - 66.36.211.255 us 66.36.212.0 - 66.36.215.255 zm -66.36.216.0 - 66.36.217.71 us -66.36.217.72 - 66.36.217.79 ht -66.36.217.80 - 66.37.67.255 us -66.37.68.0 - 66.37.68.127 va -66.37.68.128 - 66.37.207.95 us -66.37.207.96 - 66.37.207.103 ca -66.37.207.104 - 66.37.216.191 us -66.37.216.192 - 66.37.216.223 cn -66.37.216.224 - 66.37.216.231 ca -66.37.216.232 - 66.38.127.255 us +66.36.216.0 - 66.38.127.255 us 66.38.128.0 - 66.38.242.255 ca 66.38.243.0 - 66.38.243.255 a1 66.38.244.0 - 66.38.255.255 ca -66.39.0.0 - 66.39.196.79 us -66.39.196.80 - 66.39.196.95 cy -66.39.196.96 - 66.39.196.175 us -66.39.196.176 - 66.39.196.191 cy -66.39.196.192 - 66.40.2.255 us +66.39.0.0 - 66.40.2.255 us 66.40.3.0 - 66.40.3.255 gb 66.40.4.0 - 66.40.7.255 us 66.40.8.0 - 66.40.8.255 gb -66.40.9.0 - 66.40.21.63 us -66.40.21.64 - 66.40.21.79 bg -66.40.21.80 - 66.40.21.111 us -66.40.21.112 - 66.40.21.127 sk -66.40.21.128 - 66.40.21.207 us -66.40.21.208 - 66.40.21.223 gb -66.40.21.224 - 66.40.23.63 us -66.40.23.64 - 66.40.23.127 ca -66.40.23.128 - 66.40.30.127 us -66.40.30.128 - 66.40.30.191 gb -66.40.30.192 - 66.40.35.255 us -66.40.36.0 - 66.40.36.255 ca +66.40.9.0 - 66.40.36.255 us 66.40.37.0 - 66.40.37.255 au 66.40.38.0 - 66.40.65.255 us 66.40.66.0 - 66.40.66.255 gb -66.40.67.0 - 66.40.136.87 us -66.40.136.88 - 66.40.136.95 jp -66.40.136.96 - 66.40.136.111 us -66.40.136.112 - 66.40.136.119 gb -66.40.136.120 - 66.40.142.119 us -66.40.142.120 - 66.40.142.127 ve -66.40.142.128 - 66.40.143.47 us -66.40.143.48 - 66.40.143.63 es -66.40.143.64 - 66.43.47.255 us +66.40.67.0 - 66.43.47.255 us 66.43.48.0 - 66.43.63.255 ca -66.43.64.0 - 66.45.244.63 us -66.45.244.64 - 66.45.244.127 au -66.45.244.128 - 66.45.255.255 us +66.43.64.0 - 66.45.96.255 us +66.45.97.0 - 66.45.97.127 ca +66.45.97.128 - 66.45.97.191 us +66.45.97.192 - 66.45.97.223 ca +66.45.97.224 - 66.45.255.255 us 66.46.0.0 - 66.46.255.255 ca -66.47.0.0 - 66.47.255.255 us -66.48.0.0 - 66.48.0.255 ca -66.48.1.0 - 66.48.1.63 us -66.48.1.64 - 66.48.1.127 ca -66.48.1.128 - 66.48.1.191 us -66.48.1.192 - 66.48.2.223 ca -66.48.2.224 - 66.48.2.255 us -66.48.3.0 - 66.48.3.111 ca -66.48.3.112 - 66.48.3.255 us -66.48.4.0 - 66.48.5.31 ca -66.48.5.32 - 66.48.5.63 us -66.48.5.64 - 66.48.6.31 ca -66.48.6.32 - 66.48.6.191 us -66.48.6.192 - 66.48.6.199 ca -66.48.6.200 - 66.48.7.127 us -66.48.7.128 - 66.48.7.255 ca -66.48.8.0 - 66.48.8.255 us +66.47.0.0 - 66.48.6.15 us +66.48.6.16 - 66.48.6.23 ca +66.48.6.24 - 66.48.8.255 us 66.48.9.0 - 66.48.10.255 ca 66.48.11.0 - 66.48.11.255 us -66.48.12.0 - 66.48.18.63 ca -66.48.18.64 - 66.48.18.127 il -66.48.18.128 - 66.48.18.255 ca -66.48.19.0 - 66.48.19.127 us -66.48.19.128 - 66.48.19.191 ca -66.48.19.192 - 66.48.19.255 us -66.48.20.0 - 66.48.24.255 ca +66.48.12.0 - 66.48.17.255 ca +66.48.18.0 - 66.48.20.255 us +66.48.21.0 - 66.48.24.255 ca 66.48.25.0 - 66.48.25.255 us -66.48.26.0 - 66.48.27.159 ca -66.48.27.160 - 66.48.27.255 us -66.48.28.0 - 66.48.30.39 ca -66.48.30.40 - 66.48.30.55 us -66.48.30.56 - 66.48.30.71 ca -66.48.30.72 - 66.48.30.87 us -66.48.30.88 - 66.48.30.119 ca -66.48.30.120 - 66.48.30.127 us -66.48.30.128 - 66.48.30.135 ca -66.48.30.136 - 66.48.30.143 us -66.48.30.144 - 66.48.30.215 ca -66.48.30.216 - 66.48.30.231 us -66.48.30.232 - 66.48.31.23 ca -66.48.31.24 - 66.48.31.47 us -66.48.31.48 - 66.48.31.55 ca -66.48.31.56 - 66.48.31.103 us -66.48.31.104 - 66.48.31.151 ca -66.48.31.152 - 66.48.31.255 us -66.48.32.0 - 66.48.36.127 ca -66.48.36.128 - 66.48.36.255 us +66.48.26.0 - 66.48.26.255 ca +66.48.27.0 - 66.48.27.255 us +66.48.28.0 - 66.48.29.255 ca +66.48.30.0 - 66.48.30.255 us +66.48.31.0 - 66.48.31.255 ca +66.48.32.0 - 66.48.32.255 us +66.48.33.0 - 66.48.34.255 ca +66.48.35.0 - 66.48.36.255 us 66.48.37.0 - 66.48.37.255 ca 66.48.38.0 - 66.48.38.255 us 66.48.39.0 - 66.48.43.255 ca -66.48.44.0 - 66.48.47.255 us -66.48.48.0 - 66.48.51.255 ca -66.48.52.0 - 66.48.63.255 us -66.48.64.0 - 66.48.64.47 ca -66.48.64.48 - 66.48.64.63 us -66.48.64.64 - 66.48.64.111 ca -66.48.64.112 - 66.48.64.127 us -66.48.64.128 - 66.48.64.207 ca -66.48.64.208 - 66.48.65.15 us -66.48.65.16 - 66.48.65.63 ca -66.48.65.64 - 66.48.65.79 us -66.48.65.80 - 66.48.65.111 ca -66.48.65.112 - 66.48.65.143 us -66.48.65.144 - 66.48.65.159 ca -66.48.65.160 - 66.48.65.207 us -66.48.65.208 - 66.48.65.223 ca -66.48.65.224 - 66.48.65.255 us -66.48.66.0 - 66.48.66.47 ca -66.48.66.48 - 66.48.66.63 us -66.48.66.64 - 66.48.66.127 ca -66.48.66.128 - 66.48.66.143 us -66.48.66.144 - 66.48.66.191 ca -66.48.66.192 - 66.48.66.207 us -66.48.66.208 - 66.48.67.15 ca -66.48.67.16 - 66.48.67.31 us -66.48.67.32 - 66.48.67.47 ca -66.48.67.48 - 66.48.67.63 us -66.48.67.64 - 66.48.67.79 ca -66.48.67.80 - 66.48.67.175 us -66.48.67.176 - 66.48.67.207 ca -66.48.67.208 - 66.48.67.255 us -66.48.68.0 - 66.48.68.31 ca -66.48.68.32 - 66.48.68.63 us -66.48.68.64 - 66.48.69.95 ca -66.48.69.96 - 66.48.69.255 us -66.48.70.0 - 66.48.70.63 ca -66.48.70.64 - 66.48.71.63 us -66.48.71.64 - 66.48.71.159 ca -66.48.71.160 - 66.48.71.223 us -66.48.71.224 - 66.48.72.31 ca -66.48.72.32 - 66.48.72.63 us -66.48.72.64 - 66.48.72.223 ca -66.48.72.224 - 66.48.72.255 us -66.48.73.0 - 66.48.73.47 ca -66.48.73.48 - 66.48.73.71 us -66.48.73.72 - 66.48.73.103 ca -66.48.73.104 - 66.48.73.111 us -66.48.73.112 - 66.48.73.159 ca -66.48.73.160 - 66.48.73.191 us -66.48.73.192 - 66.48.73.215 ca -66.48.73.216 - 66.48.73.231 us -66.48.73.232 - 66.48.73.239 ca -66.48.73.240 - 66.48.74.7 us -66.48.74.8 - 66.48.74.71 ca -66.48.74.72 - 66.48.74.255 us -66.48.75.0 - 66.48.75.191 ca -66.48.75.192 - 66.48.75.255 us -66.48.76.0 - 66.48.77.127 ca -66.48.77.128 - 66.48.78.127 us -66.48.78.128 - 66.48.79.63 ca -66.48.79.64 - 66.48.79.127 us -66.48.79.128 - 66.48.80.255 ca -66.48.81.0 - 66.48.81.127 us -66.48.81.128 - 66.48.82.127 ca -66.48.82.128 - 66.48.82.255 us -66.48.83.0 - 66.48.83.255 ca -66.48.84.0 - 66.48.85.255 us +66.48.44.0 - 66.48.85.255 us 66.48.86.0 - 66.48.88.255 ca -66.48.89.0 - 66.48.89.127 us -66.48.89.128 - 66.48.89.191 ca -66.48.89.192 - 66.48.89.255 us +66.48.89.0 - 66.48.89.255 us 66.48.90.0 - 66.48.91.255 ca 66.48.92.0 - 66.48.93.255 us 66.48.94.0 - 66.48.94.255 ca -66.48.95.0 - 66.48.95.255 us -66.48.96.0 - 66.48.96.7 ca -66.48.96.8 - 66.48.96.255 us -66.48.97.0 - 66.48.97.31 ca -66.48.97.32 - 66.48.99.255 us -66.48.100.0 - 66.48.100.127 ca -66.48.100.128 - 66.48.118.255 us +66.48.95.0 - 66.48.118.255 us 66.48.119.0 - 66.48.123.255 ca 66.48.124.0 - 66.48.124.255 us -66.48.125.0 - 66.48.126.63 ca -66.48.126.64 - 66.48.126.255 us -66.48.127.0 - 66.48.127.255 ca -66.48.128.0 - 66.49.127.255 us +66.48.125.0 - 66.48.125.255 ca +66.48.126.0 - 66.49.127.255 us 66.49.128.0 - 66.49.255.255 ca -66.50.0.0 - 66.50.255.255 pr -66.51.0.0 - 66.51.95.255 us +66.50.0.0 - 66.50.55.255 pr +66.50.56.0 - 66.50.56.255 us +66.50.57.0 - 66.50.58.255 pr +66.50.59.0 - 66.50.65.255 us +66.50.66.0 - 66.50.66.255 pr +66.50.67.0 - 66.50.76.255 us +66.50.77.0 - 66.50.77.255 pr +66.50.78.0 - 66.50.84.255 us +66.50.85.0 - 66.50.85.255 pr +66.50.86.0 - 66.50.88.192 us +66.50.88.193 - 66.50.99.255 pr +66.50.100.0 - 66.50.101.255 us +66.50.102.0 - 66.50.255.255 pr +66.51.0.0 - 66.51.61.255 us +66.51.62.0 - 66.51.62.255 ht +66.51.63.0 - 66.51.95.255 us 66.51.96.0 - 66.51.143.255 ca 66.51.144.0 - 66.51.159.255 us -66.51.160.0 - 66.51.175.31 ca -66.51.175.32 - 66.51.175.39 us -66.51.175.40 - 66.51.175.255 ca +66.51.160.0 - 66.51.175.255 ca 66.51.176.0 - 66.51.239.255 us 66.51.240.0 - 66.51.255.255 ca -66.52.0.0 - 66.54.111.255 us +66.52.0.0 - 66.54.71.255 us +66.54.72.0 - 66.54.75.255 gb +66.54.76.0 - 66.54.85.255 us +66.54.86.0 - 66.54.86.255 de +66.54.87.0 - 66.54.92.255 us +66.54.93.0 - 66.54.93.255 au +66.54.94.0 - 66.54.111.255 us 66.54.112.0 - 66.54.119.255 jm 66.54.120.0 - 66.54.125.255 ky 66.54.126.0 - 66.54.127.255 jm -66.54.128.0 - 66.54.139.7 us -66.54.139.8 - 66.54.139.15 hk -66.54.139.16 - 66.54.139.31 us -66.54.139.32 - 66.54.139.63 hk -66.54.139.64 - 66.54.139.135 us -66.54.139.136 - 66.54.139.143 jp -66.54.139.144 - 66.54.203.255 us +66.54.128.0 - 66.54.203.255 us 66.54.204.0 - 66.54.204.255 ie 66.54.205.0 - 66.55.111.255 us 66.55.112.0 - 66.55.127.255 bm -66.55.128.0 - 66.55.156.79 us -66.55.156.80 - 66.55.156.95 a1 -66.55.156.96 - 66.59.127.255 us +66.55.128.0 - 66.59.127.255 us 66.59.128.0 - 66.59.191.255 ca 66.59.192.0 - 66.59.255.255 us 66.60.0.0 - 66.60.63.255 ar -66.60.64.0 - 66.70.20.9 us -66.70.20.10 - 66.70.20.19 in -66.70.20.20 - 66.70.64.63 us -66.70.64.64 - 66.70.64.127 nl -66.70.64.128 - 66.70.70.109 us -66.70.70.110 - 66.70.70.119 gb -66.70.70.120 - 66.77.57.255 us -66.77.58.0 - 66.77.58.127 ca -66.77.58.128 - 66.77.71.255 us -66.77.72.0 - 66.77.72.63 ca -66.77.72.64 - 66.78.95.255 us -66.78.96.0 - 66.78.97.251 ca -66.78.97.252 - 66.78.97.255 us -66.78.98.0 - 66.78.127.255 ca +66.60.64.0 - 66.71.127.255 us +66.71.128.0 - 66.71.191.255 it +66.71.192.0 - 66.78.63.255 us +66.78.96.0 - 66.78.127.255 ca 66.78.128.0 - 66.79.223.255 us 66.79.224.0 - 66.79.255.255 ca -66.80.0.0 - 66.85.132.103 us -66.85.132.104 - 66.85.132.111 mv -66.85.132.112 - 66.85.135.247 us -66.85.135.248 - 66.85.135.255 eg -66.85.136.0 - 66.85.136.127 us -66.85.136.128 - 66.85.136.135 eg -66.85.136.136 - 66.85.144.31 us -66.85.144.32 - 66.85.144.39 tr -66.85.144.40 - 66.85.154.191 us -66.85.154.192 - 66.85.154.199 gb -66.85.154.200 - 66.85.160.143 us -66.85.160.144 - 66.85.160.159 eg -66.85.160.160 - 66.90.70.63 us -66.90.70.64 - 66.90.70.79 ca -66.90.70.80 - 66.96.15.255 us +66.80.0.0 - 66.85.11.255 us +66.85.12.0 - 66.85.12.255 ca +66.85.14.0 - 66.85.15.255 us +66.85.20.0 - 66.85.27.255 us +66.85.28.0 - 66.85.31.255 ca +66.85.32.0 - 66.85.33.255 us +66.85.34.0 - 66.85.34.255 ca +66.85.35.0 - 66.85.89.255 us +66.85.91.0 - 66.85.91.255 ca +66.85.92.0 - 66.85.159.255 us +66.85.160.0 - 66.85.160.7 ca +66.85.160.8 - 66.85.251.255 us +66.85.252.0 - 66.85.253.255 ca +66.85.254.0 - 66.85.254.255 us +66.86.0.0 - 66.94.175.255 us +66.94.176.0 - 66.94.176.255 vi +66.94.177.0 - 66.96.15.255 us 66.96.16.0 - 66.96.31.255 ca 66.96.32.0 - 66.96.33.255 cl 66.96.34.0 - 66.96.35.255 gt @@ -22213,141 +15667,67 @@ 66.96.48.0 - 66.96.48.255 us 66.96.49.0 - 66.96.59.255 ve 66.96.60.0 - 66.96.60.255 cl -66.96.61.0 - 66.96.61.255 sv +66.96.61.0 - 66.96.61.255 gt 66.96.62.0 - 66.96.62.255 us 66.96.63.0 - 66.96.63.255 ca -66.96.64.0 - 66.97.15.255 us +66.96.64.0 - 66.96.191.255 us +66.96.192.0 - 66.96.223.255 sg +66.96.224.0 - 66.96.255.255 id +66.97.0.0 - 66.97.15.255 us 66.97.16.0 - 66.97.31.255 ca -66.97.32.0 - 66.97.169.63 us -66.97.169.64 - 66.97.169.127 ca -66.97.169.128 - 66.97.170.63 us -66.97.170.64 - 66.97.170.127 ca -66.97.170.128 - 66.97.255.255 us +66.97.32.0 - 66.97.63.255 us +66.97.64.0 - 66.97.95.255 ca +66.97.96.0 - 66.97.255.255 us 66.98.0.0 - 66.98.95.255 do -66.98.96.0 - 66.100.16.55 us -66.100.16.56 - 66.100.16.63 ca -66.100.16.64 - 66.100.16.255 us +66.98.96.0 - 66.100.16.255 us 66.100.17.0 - 66.100.17.255 ca 66.100.18.0 - 66.100.19.255 us 66.100.20.0 - 66.100.21.255 ca -66.100.22.0 - 66.100.27.255 us -66.100.28.0 - 66.100.28.7 ca -66.100.28.8 - 66.100.28.63 us -66.100.28.64 - 66.100.28.127 ca -66.100.28.128 - 66.100.48.103 us -66.100.48.104 - 66.100.48.111 mx -66.100.48.112 - 66.100.58.31 us -66.100.58.32 - 66.100.58.39 br -66.100.58.40 - 66.100.58.63 us -66.100.58.64 - 66.100.58.79 vi -66.100.58.80 - 66.100.125.15 us -66.100.125.16 - 66.100.125.23 gb -66.100.125.24 - 66.100.126.239 us -66.100.126.240 - 66.100.126.247 ca -66.100.126.248 - 66.100.151.87 us -66.100.151.88 - 66.100.151.95 ca -66.100.151.96 - 66.100.208.191 us -66.100.208.192 - 66.100.208.255 ca -66.100.209.0 - 66.100.218.127 us -66.100.218.128 - 66.100.218.143 ca -66.100.218.144 - 66.101.5.159 us -66.101.5.160 - 66.101.5.167 gb -66.101.5.168 - 66.101.15.151 us -66.101.15.152 - 66.101.15.159 ca -66.101.15.160 - 66.101.32.255 us -66.101.33.0 - 66.101.33.63 br -66.101.33.64 - 66.102.63.255 us +66.100.22.0 - 66.102.14.131 us +66.102.14.132 - 66.102.14.133 de +66.102.14.134 - 66.102.63.255 us 66.102.64.0 - 66.102.95.255 ca 66.102.96.0 - 66.103.31.255 us 66.103.32.0 - 66.103.63.255 ca 66.103.64.0 - 66.103.191.255 us 66.103.192.0 - 66.103.223.255 ca -66.103.224.0 - 66.104.226.239 us -66.104.226.240 - 66.104.226.255 ca -66.104.227.0 - 66.109.255.255 us -66.110.0.0 - 66.110.7.255 ca -66.110.8.0 - 66.110.8.31 us -66.110.8.32 - 66.110.8.63 ca -66.110.8.64 - 66.110.8.127 us -66.110.8.128 - 66.110.8.159 ca -66.110.8.160 - 66.110.8.167 gb -66.110.8.168 - 66.110.11.255 ca -66.110.12.0 - 66.110.13.255 us -66.110.14.0 - 66.110.23.255 ca -66.110.24.0 - 66.110.25.255 us -66.110.26.0 - 66.110.31.255 ca -66.110.32.0 - 66.110.39.255 sa -66.110.40.0 - 66.110.47.255 us -66.110.48.0 - 66.110.55.255 ca -66.110.56.0 - 66.110.57.255 us +66.103.224.0 - 66.109.255.255 us +66.110.0.0 - 66.110.3.255 ca +66.110.4.0 - 66.110.5.255 us +66.110.6.0 - 66.110.7.255 ca +66.110.8.0 - 66.110.25.255 us +66.110.26.0 - 66.110.26.255 ca +66.110.27.0 - 66.110.31.255 us +66.110.32.0 - 66.110.32.63 sa +66.110.32.64 - 66.110.32.147 us +66.110.32.148 - 66.110.32.151 sa +66.110.32.152 - 66.110.32.159 us +66.110.32.160 - 66.110.32.191 sa +66.110.32.192 - 66.110.36.255 us +66.110.37.0 - 66.110.39.255 sa +66.110.40.0 - 66.110.40.7 us +66.110.40.8 - 66.110.40.15 ca +66.110.40.16 - 66.110.47.255 us +66.110.48.0 - 66.110.49.255 ca +66.110.50.0 - 66.110.57.255 us 66.110.58.0 - 66.110.58.255 ph 66.110.59.0 - 66.110.59.255 us 66.110.60.0 - 66.110.60.255 ph -66.110.61.0 - 66.110.64.255 ca -66.110.65.0 - 66.110.65.255 us -66.110.66.0 - 66.110.73.255 ca +66.110.61.0 - 66.110.73.255 us 66.110.74.0 - 66.110.75.255 za -66.110.76.0 - 66.110.109.255 ca +66.110.76.0 - 66.110.109.255 us 66.110.110.0 - 66.110.111.255 za 66.110.112.0 - 66.110.127.255 ao 66.110.128.0 - 66.110.175.255 ca -66.110.176.0 - 66.112.68.255 us -66.112.69.0 - 66.112.69.31 mo -66.112.69.32 - 66.112.84.135 us -66.112.84.136 - 66.112.84.143 la -66.112.84.144 - 66.112.175.255 us +66.110.176.0 - 66.112.175.255 us 66.112.176.0 - 66.112.191.255 ca 66.112.192.0 - 66.113.111.255 us 66.113.112.0 - 66.113.127.255 ca -66.113.128.0 - 66.115.128.47 us -66.115.128.48 - 66.115.128.63 ca -66.115.128.64 - 66.115.165.255 us -66.115.166.0 - 66.115.168.255 ca -66.115.169.0 - 66.115.170.31 us -66.115.170.32 - 66.115.170.47 ca -66.115.170.48 - 66.115.170.63 ad -66.115.170.64 - 66.115.170.127 ca -66.115.170.128 - 66.115.170.159 gb -66.115.170.160 - 66.115.171.239 us -66.115.171.240 - 66.115.171.255 ad -66.115.172.0 - 66.115.172.255 ca +66.113.128.0 - 66.115.172.255 us 66.115.173.0 - 66.115.173.255 cy -66.115.174.0 - 66.115.174.255 us -66.115.175.0 - 66.115.175.63 sk -66.115.175.64 - 66.115.175.95 us -66.115.175.96 - 66.115.175.111 ca -66.115.175.112 - 66.115.175.255 us +66.115.174.0 - 66.115.175.255 us 66.115.176.0 - 66.115.176.255 pa -66.115.177.0 - 66.115.177.255 us -66.115.178.0 - 66.115.178.255 nl -66.115.179.0 - 66.115.179.129 us -66.115.179.130 - 66.115.180.1 lt -66.115.180.2 - 66.115.184.79 us -66.115.184.80 - 66.115.184.95 cy -66.115.184.96 - 66.115.185.127 us -66.115.185.128 - 66.115.185.143 cy -66.115.185.144 - 66.115.185.151 gb -66.115.185.152 - 66.115.188.255 us -66.115.189.0 - 66.115.189.127 cy -66.115.189.128 - 66.115.189.191 us -66.115.189.192 - 66.115.189.255 cy -66.115.190.0 - 66.116.118.223 us -66.116.118.224 - 66.116.118.231 gb -66.116.118.232 - 66.116.119.175 us -66.116.119.176 - 66.116.119.191 ru -66.116.119.192 - 66.116.123.255 us -66.116.124.0 - 66.116.124.127 gb -66.116.124.128 - 66.117.11.31 us -66.117.11.32 - 66.117.11.47 gb -66.117.11.48 - 66.119.36.255 us -66.119.37.0 - 66.119.37.127 ca -66.119.37.128 - 66.119.65.255 us -66.119.66.0 - 66.119.66.127 pr -66.119.66.128 - 66.119.66.143 us -66.119.66.144 - 66.119.66.151 es -66.119.66.152 - 66.119.68.127 us -66.119.68.128 - 66.119.68.159 in -66.119.68.160 - 66.119.71.255 us +66.115.177.0 - 66.119.71.255 us 66.119.72.0 - 66.119.75.255 hn 66.119.76.0 - 66.119.76.255 mx 66.119.77.0 - 66.119.77.255 gt @@ -22360,77 +15740,23 @@ 66.119.92.0 - 66.119.95.255 sv 66.119.96.0 - 66.119.127.255 us 66.119.128.0 - 66.119.143.255 ca -66.119.144.0 - 66.119.159.255 us -66.119.160.0 - 66.119.170.111 ca -66.119.170.112 - 66.119.170.119 us -66.119.170.120 - 66.119.191.255 ca -66.119.192.0 - 66.121.66.255 us -66.121.67.0 - 66.121.67.7 pr -66.121.67.8 - 66.122.32.31 us -66.122.32.32 - 66.122.32.39 pr -66.122.32.40 - 66.122.230.15 us -66.122.230.16 - 66.122.230.23 pr -66.122.230.24 - 66.123.172.215 us -66.123.172.216 - 66.123.172.223 pr -66.123.172.224 - 66.127.180.223 us -66.127.180.224 - 66.127.180.231 pr -66.127.180.232 - 66.128.31.255 us -66.128.32.0 - 66.128.47.255 co -66.128.48.0 - 66.128.48.7 us -66.128.48.8 - 66.128.48.15 co -66.128.48.16 - 66.128.48.23 us -66.128.48.24 - 66.128.48.31 au -66.128.48.32 - 66.128.48.47 us -66.128.48.48 - 66.128.48.55 id -66.128.48.56 - 66.128.48.63 us -66.128.48.64 - 66.128.48.71 id -66.128.48.72 - 66.128.48.79 ca -66.128.48.80 - 66.128.48.111 us -66.128.48.112 - 66.128.48.127 in -66.128.48.128 - 66.128.48.167 us -66.128.48.168 - 66.128.48.175 gb -66.128.48.176 - 66.128.48.231 us -66.128.48.232 - 66.128.48.239 co -66.128.48.240 - 66.128.49.63 us -66.128.49.64 - 66.128.49.71 co -66.128.49.72 - 66.128.50.135 us -66.128.50.136 - 66.128.50.143 ca -66.128.50.144 - 66.128.50.151 us -66.128.50.152 - 66.128.50.159 do -66.128.50.160 - 66.128.51.23 us -66.128.51.24 - 66.128.51.31 mx -66.128.51.32 - 66.128.51.41 do -66.128.51.42 - 66.128.51.71 us -66.128.51.72 - 66.128.51.79 co -66.128.51.80 - 66.128.51.87 do -66.128.51.88 - 66.128.51.95 us -66.128.51.96 - 66.128.51.127 af -66.128.51.128 - 66.128.51.207 us -66.128.51.208 - 66.128.51.215 do -66.128.51.216 - 66.128.51.239 us -66.128.51.240 - 66.128.51.247 au -66.128.51.248 - 66.128.52.223 us -66.128.52.224 - 66.128.52.231 ca -66.128.52.232 - 66.128.52.255 us -66.128.53.0 - 66.128.53.255 do -66.128.54.0 - 66.128.54.95 us -66.128.54.96 - 66.128.54.103 co -66.128.54.104 - 66.128.58.191 us -66.128.58.192 - 66.128.58.199 ca -66.128.58.200 - 66.128.58.207 us -66.128.58.208 - 66.128.58.215 ca -66.128.58.216 - 66.128.59.255 us -66.128.60.0 - 66.128.60.255 do -66.128.61.0 - 66.128.61.255 us -66.128.62.0 - 66.128.62.7 ca -66.128.62.8 - 66.128.79.255 us +66.119.144.0 - 66.119.148.255 us +66.119.149.0 - 66.119.149.255 cn +66.119.150.0 - 66.119.150.63 us +66.119.150.64 - 66.119.150.127 nl +66.119.150.128 - 66.119.155.255 us +66.119.156.0 - 66.119.157.127 hk +66.119.157.128 - 66.119.157.143 nl +66.119.157.144 - 66.119.158.127 us +66.119.158.128 - 66.119.158.159 sg +66.119.158.160 - 66.119.159.255 us +66.119.160.0 - 66.119.191.255 ca +66.119.192.0 - 66.128.31.255 us +66.128.32.0 - 66.128.47.255 ar +66.128.48.0 - 66.128.79.255 us 66.128.80.0 - 66.128.95.255 ca -66.128.96.0 - 66.129.112.143 us -66.129.112.144 - 66.129.112.151 ca -66.129.112.152 - 66.129.127.255 us -66.129.128.0 - 66.129.133.151 ca -66.129.133.152 - 66.129.133.159 us -66.129.133.160 - 66.129.159.255 ca +66.128.96.0 - 66.129.127.255 us +66.129.128.0 - 66.129.159.255 ca 66.129.160.0 - 66.129.175.255 pr 66.129.176.0 - 66.129.191.255 ca 66.129.192.0 - 66.129.255.255 us @@ -22441,1419 +15767,313 @@ 66.133.8.0 - 66.133.8.255 a2 66.133.9.0 - 66.133.12.255 us 66.133.13.0 - 66.133.13.255 a2 -66.133.14.0 - 66.133.56.255 us +66.133.14.0 - 66.133.44.255 us +66.133.45.0 - 66.133.45.255 pg +66.133.46.0 - 66.133.56.255 us 66.133.57.0 - 66.133.59.255 a2 -66.133.60.0 - 66.133.114.63 us -66.133.114.64 - 66.133.114.79 ca -66.133.114.80 - 66.135.42.207 us -66.135.42.208 - 66.135.42.223 ae -66.135.42.224 - 66.135.57.63 us -66.135.57.64 - 66.135.57.127 ca -66.135.57.128 - 66.135.57.255 us -66.135.58.0 - 66.135.58.31 au -66.135.58.32 - 66.135.58.159 us -66.135.58.160 - 66.135.58.255 ca -66.135.59.0 - 66.135.62.31 us -66.135.62.32 - 66.135.62.47 br -66.135.62.48 - 66.135.95.255 us -66.135.96.0 - 66.135.100.95 ca -66.135.100.96 - 66.135.100.111 us -66.135.100.112 - 66.135.122.255 ca -66.135.123.0 - 66.135.123.31 jm -66.135.123.32 - 66.135.127.255 ca -66.135.128.0 - 66.136.4.71 us -66.136.4.72 - 66.136.4.79 pr -66.136.4.80 - 66.136.4.199 us -66.136.4.200 - 66.136.4.207 pr -66.136.4.208 - 66.136.5.87 us -66.136.5.88 - 66.136.5.95 pr -66.136.5.96 - 66.136.6.15 us -66.136.6.16 - 66.136.6.23 pr -66.136.6.24 - 66.136.9.31 us -66.136.9.32 - 66.136.9.39 pr -66.136.9.40 - 66.136.9.175 us -66.136.9.176 - 66.136.9.183 pr -66.136.9.184 - 66.136.9.191 us -66.136.9.192 - 66.136.9.199 pr -66.136.9.200 - 66.136.16.127 us -66.136.16.128 - 66.136.16.135 pr -66.136.16.136 - 66.136.16.199 us -66.136.16.200 - 66.136.16.215 pr -66.136.16.216 - 66.136.17.135 us -66.136.17.136 - 66.136.17.143 pr -66.136.17.144 - 66.136.18.183 us -66.136.18.184 - 66.136.18.191 pr -66.136.18.192 - 66.136.19.143 us -66.136.19.144 - 66.136.19.151 pr -66.136.19.152 - 66.136.31.63 us -66.136.31.64 - 66.136.31.71 pr -66.136.31.72 - 66.136.36.159 us -66.136.36.160 - 66.136.36.167 pr -66.136.36.168 - 66.136.43.71 us -66.136.43.72 - 66.136.43.79 pr -66.136.43.80 - 66.136.54.223 us -66.136.54.224 - 66.136.54.231 pr -66.136.54.232 - 66.136.58.47 us -66.136.58.48 - 66.136.58.55 pr -66.136.58.56 - 66.136.77.79 us -66.136.77.80 - 66.136.77.87 pr -66.136.77.88 - 66.136.77.199 us -66.136.77.200 - 66.136.77.207 pr -66.136.77.208 - 66.136.96.39 us -66.136.96.40 - 66.136.96.47 pr -66.136.96.48 - 66.136.96.63 us -66.136.96.64 - 66.136.96.71 pr -66.136.96.72 - 66.136.136.183 us -66.136.136.184 - 66.136.136.191 pr -66.136.136.192 - 66.136.139.31 us -66.136.139.32 - 66.136.139.39 pr -66.136.139.40 - 66.136.139.199 us -66.136.139.200 - 66.136.139.207 pr -66.136.139.208 - 66.136.140.255 us -66.136.141.0 - 66.136.141.7 pr -66.136.141.8 - 66.136.141.15 us -66.136.141.16 - 66.136.141.23 pr -66.136.141.24 - 66.136.166.175 us -66.136.166.176 - 66.136.166.183 pr -66.136.166.184 - 66.136.168.159 us -66.136.168.160 - 66.136.168.167 pr -66.136.168.168 - 66.136.172.63 us -66.136.172.64 - 66.136.172.71 pr -66.136.172.72 - 66.136.172.111 us -66.136.172.112 - 66.136.172.119 pr -66.136.172.120 - 66.136.173.15 us -66.136.173.16 - 66.136.173.23 pr -66.136.173.24 - 66.136.204.207 us -66.136.204.208 - 66.136.204.215 pr -66.136.204.216 - 66.136.235.255 us -66.136.236.0 - 66.136.236.7 pr -66.136.236.8 - 66.136.243.143 us -66.136.243.144 - 66.136.243.151 pr -66.136.243.152 - 66.136.248.239 us -66.136.248.240 - 66.136.248.247 pr -66.136.248.248 - 66.137.1.103 us -66.137.1.104 - 66.137.1.111 pr -66.137.1.112 - 66.137.3.55 us -66.137.3.56 - 66.137.3.63 pr -66.137.3.64 - 66.137.11.183 us -66.137.11.184 - 66.137.11.191 pr -66.137.11.192 - 66.137.18.207 us -66.137.18.208 - 66.137.18.215 pr -66.137.18.216 - 66.137.36.95 us -66.137.36.96 - 66.137.36.103 pr -66.137.36.104 - 66.137.39.199 us -66.137.39.200 - 66.137.39.207 pr -66.137.39.208 - 66.137.65.23 us -66.137.65.24 - 66.137.65.31 pr -66.137.65.32 - 66.137.97.31 us -66.137.97.32 - 66.137.97.39 pr -66.137.97.40 - 66.137.97.103 us -66.137.97.104 - 66.137.97.111 pr -66.137.97.112 - 66.137.102.47 us -66.137.102.48 - 66.137.102.55 pr -66.137.102.56 - 66.137.103.87 us -66.137.103.88 - 66.137.103.95 pr -66.137.103.96 - 66.137.108.87 us -66.137.108.88 - 66.137.108.95 pr -66.137.108.96 - 66.137.110.175 us -66.137.110.176 - 66.137.110.183 pr -66.137.110.184 - 66.137.122.47 us -66.137.122.48 - 66.137.122.55 pr -66.137.122.56 - 66.137.139.255 us -66.137.140.0 - 66.137.140.7 pr -66.137.140.8 - 66.137.145.23 us -66.137.145.24 - 66.137.145.31 pr -66.137.145.32 - 66.137.162.239 us -66.137.162.240 - 66.137.162.247 pr -66.137.162.248 - 66.137.183.23 us -66.137.183.24 - 66.137.183.31 pr -66.137.183.32 - 66.137.198.23 us -66.137.198.24 - 66.137.198.31 pr -66.137.198.32 - 66.137.217.167 us -66.137.217.168 - 66.137.217.175 pr -66.137.217.176 - 66.137.234.151 us -66.137.234.152 - 66.137.234.159 pr -66.137.234.160 - 66.137.235.135 us -66.137.235.136 - 66.137.235.143 pr -66.137.235.144 - 66.137.238.119 us -66.137.238.120 - 66.137.238.127 pr -66.137.238.128 - 66.137.242.199 us -66.137.242.200 - 66.137.242.207 pr -66.137.242.208 - 66.137.243.223 us -66.137.243.224 - 66.137.243.231 pr -66.137.243.232 - 66.137.247.15 us -66.137.247.16 - 66.137.247.23 pr -66.137.247.24 - 66.137.253.103 us -66.137.253.104 - 66.137.253.111 pr -66.137.253.112 - 66.137.253.119 us -66.137.253.120 - 66.137.253.127 pr -66.137.253.128 - 66.137.253.143 us -66.137.253.144 - 66.137.253.151 pr -66.137.253.152 - 66.138.76.135 us -66.138.76.136 - 66.138.76.143 pr -66.138.76.144 - 66.138.76.239 us -66.138.76.240 - 66.138.76.247 pr -66.138.76.248 - 66.138.78.23 us -66.138.78.24 - 66.138.78.31 pr -66.138.78.32 - 66.138.204.15 us -66.138.204.16 - 66.138.204.23 pr -66.138.204.24 - 66.138.238.151 us -66.138.238.152 - 66.138.238.159 pr -66.138.238.160 - 66.139.1.159 us -66.139.1.160 - 66.139.1.175 pr -66.139.1.176 - 66.139.13.199 us -66.139.13.200 - 66.139.13.207 pr -66.139.13.208 - 66.139.65.39 us -66.139.65.40 - 66.139.65.47 pr -66.139.65.48 - 66.139.152.111 us -66.139.152.112 - 66.139.152.119 pr -66.139.152.120 - 66.139.210.111 us -66.139.210.112 - 66.139.210.127 pr -66.139.210.128 - 66.140.8.231 us -66.140.8.232 - 66.140.8.239 pr -66.140.8.240 - 66.140.27.191 us -66.140.27.192 - 66.140.27.199 pr -66.140.27.200 - 66.140.41.87 us -66.140.41.88 - 66.140.41.95 pr -66.140.41.96 - 66.140.64.215 us -66.140.64.216 - 66.140.64.223 pr -66.140.64.224 - 66.140.64.231 us -66.140.64.232 - 66.140.64.239 pr -66.140.64.240 - 66.140.78.39 us -66.140.78.40 - 66.140.78.47 pr -66.140.78.48 - 66.140.96.175 us -66.140.96.176 - 66.140.96.183 pr -66.140.96.184 - 66.140.112.15 us -66.140.112.16 - 66.140.112.23 pr -66.140.112.24 - 66.140.135.63 us -66.140.135.64 - 66.140.135.95 pr -66.140.135.96 - 66.140.138.143 us -66.140.138.144 - 66.140.138.151 pr -66.140.138.152 - 66.140.138.239 us -66.140.138.240 - 66.140.138.247 pr -66.140.138.248 - 66.140.149.55 us -66.140.149.56 - 66.140.149.63 pr -66.140.149.64 - 66.140.154.191 us -66.140.154.192 - 66.140.154.207 pr -66.140.154.208 - 66.140.225.127 us -66.140.225.128 - 66.140.225.135 pr -66.140.225.136 - 66.141.7.63 us -66.141.7.64 - 66.141.7.79 ua -66.141.7.80 - 66.141.115.71 us -66.141.115.72 - 66.141.115.79 pr -66.141.115.80 - 66.141.158.135 us -66.141.158.136 - 66.141.158.143 pr -66.141.158.144 - 66.141.244.183 us -66.141.244.184 - 66.141.244.191 pr -66.141.244.192 - 66.146.127.255 us +66.133.60.0 - 66.133.74.255 us +66.133.75.0 - 66.133.75.255 gb +66.133.76.0 - 66.133.76.255 us +66.133.77.0 - 66.133.77.255 nl +66.133.78.0 - 66.133.78.255 us +66.133.79.0 - 66.133.79.255 gb +66.133.80.0 - 66.133.95.255 hk +66.133.96.0 - 66.135.95.255 us +66.135.96.0 - 66.135.127.255 ca +66.135.128.0 - 66.146.127.255 us 66.146.128.0 - 66.146.159.255 ca 66.146.160.0 - 66.150.43.255 us 66.150.44.0 - 66.150.44.255 ca 66.150.45.0 - 66.150.60.255 us 66.150.61.0 - 66.150.61.255 ca -66.150.62.0 - 66.150.142.15 us -66.150.142.16 - 66.150.142.23 ca -66.150.142.24 - 66.150.160.239 us -66.150.160.240 - 66.150.160.255 gb -66.150.161.0 - 66.150.167.95 us -66.150.167.96 - 66.150.167.127 ca -66.150.167.128 - 66.150.173.127 us -66.150.173.128 - 66.150.173.159 ca -66.150.173.160 - 66.150.201.175 us -66.150.201.176 - 66.150.201.191 gb -66.150.201.192 - 66.150.247.63 us -66.150.247.64 - 66.150.247.127 kr -66.150.247.128 - 66.151.14.215 us -66.151.14.216 - 66.151.14.223 a2 -66.151.14.224 - 66.151.24.255 us +66.150.62.0 - 66.151.24.255 us 66.151.25.0 - 66.151.25.255 ca -66.151.26.0 - 66.151.115.191 us -66.151.115.192 - 66.151.115.199 gb -66.151.115.200 - 66.152.63.255 us +66.151.26.0 - 66.152.63.255 us 66.152.64.0 - 66.152.95.255 ca -66.152.96.0 - 66.152.163.159 us -66.152.163.160 - 66.152.163.167 gb -66.152.163.168 - 66.152.177.63 us -66.152.177.64 - 66.152.177.127 ca -66.152.177.128 - 66.152.187.71 us -66.152.187.72 - 66.152.187.79 gb -66.152.187.80 - 66.154.80.63 us -66.154.80.64 - 66.154.80.71 gb -66.154.80.72 - 66.154.81.247 us -66.154.81.248 - 66.154.81.255 gb -66.154.82.0 - 66.154.83.191 us -66.154.83.192 - 66.154.83.255 gb -66.154.84.0 - 66.154.86.255 us -66.154.87.0 - 66.154.87.15 pl -66.154.87.16 - 66.154.93.255 us -66.154.94.0 - 66.154.94.127 ca -66.154.94.128 - 66.154.95.255 us -66.154.96.0 - 66.154.96.255 ca -66.154.97.0 - 66.154.103.255 us -66.154.104.0 - 66.154.106.255 an +66.152.96.0 - 66.154.95.255 us +66.154.96.0 - 66.154.103.255 ca +66.154.104.0 - 66.154.106.255 cw 66.154.107.0 - 66.154.107.255 ca 66.154.108.0 - 66.154.108.255 us -66.154.109.0 - 66.154.110.255 ca -66.154.111.0 - 66.154.111.7 us -66.154.111.8 - 66.154.111.15 ca -66.154.111.16 - 66.154.111.23 us -66.154.111.24 - 66.154.111.31 ca -66.154.111.32 - 66.154.111.47 us -66.154.111.48 - 66.154.111.63 ca -66.154.111.64 - 66.154.111.127 us -66.154.111.128 - 66.154.116.159 ca -66.154.116.160 - 66.154.116.175 us -66.154.116.176 - 66.154.118.255 ca -66.154.119.0 - 66.154.119.255 us -66.154.120.0 - 66.154.120.255 ca -66.154.121.0 - 66.154.123.255 us -66.154.124.0 - 66.154.125.255 ca -66.154.126.0 - 66.154.126.255 us -66.154.127.0 - 66.154.127.255 ca -66.154.128.0 - 66.158.127.255 us +66.154.109.0 - 66.154.123.127 ca +66.154.123.128 - 66.154.123.159 us +66.154.123.160 - 66.154.127.255 ca +66.154.128.0 - 66.155.17.223 us +66.155.17.224 - 66.155.17.255 gb +66.155.18.0 - 66.155.22.255 us +66.155.23.0 - 66.155.23.63 gb +66.155.23.64 - 66.155.25.255 us +66.155.26.0 - 66.155.26.255 gb +66.155.27.0 - 66.155.63.255 us +66.155.64.0 - 66.155.65.255 ca +66.155.66.0 - 66.155.100.255 us +66.155.101.0 - 66.155.101.63 ca +66.155.101.64 - 66.158.127.255 us 66.158.128.0 - 66.158.159.255 ca 66.158.160.0 - 66.159.31.255 us 66.159.32.0 - 66.159.47.255 ca -66.159.48.0 - 66.159.111.255 us -66.159.112.0 - 66.159.127.255 ca -66.159.128.0 - 66.160.56.223 us -66.160.56.224 - 66.160.56.239 ca -66.160.56.240 - 66.160.128.39 us -66.160.128.40 - 66.160.128.47 cn -66.160.128.48 - 66.160.129.255 us +66.159.48.0 - 66.159.107.255 us +66.159.108.0 - 66.159.127.255 ca +66.159.128.0 - 66.160.129.255 us 66.160.130.0 - 66.160.130.255 cn -66.160.131.0 - 66.160.140.63 us -66.160.140.64 - 66.160.140.127 ca -66.160.140.128 - 66.160.142.127 us -66.160.142.128 - 66.160.142.255 it -66.160.143.0 - 66.160.144.95 us -66.160.144.96 - 66.160.144.111 hk -66.160.144.112 - 66.160.146.239 us -66.160.146.240 - 66.160.146.255 ae -66.160.147.0 - 66.160.160.255 us +66.160.131.0 - 66.160.160.255 us 66.160.161.0 - 66.160.161.255 ca 66.160.162.0 - 66.160.162.255 cn 66.160.163.0 - 66.160.163.255 us -66.160.164.0 - 66.160.165.255 gr +66.160.164.0 - 66.160.165.255 ca 66.160.166.0 - 66.160.184.255 us 66.160.185.0 - 66.160.185.255 gr -66.160.186.0 - 66.160.192.191 us -66.160.192.192 - 66.160.192.255 a2 -66.160.193.0 - 66.162.255.255 us -66.163.0.0 - 66.163.3.111 ca -66.163.3.112 - 66.163.3.127 us -66.163.3.128 - 66.163.15.175 ca -66.163.15.176 - 66.163.15.191 us -66.163.15.192 - 66.163.17.23 ca -66.163.17.24 - 66.163.17.31 us -66.163.17.32 - 66.163.17.47 ca -66.163.17.48 - 66.163.17.63 us -66.163.17.64 - 66.163.17.239 ca -66.163.17.240 - 66.163.17.247 us -66.163.17.248 - 66.163.20.87 ca -66.163.20.88 - 66.163.20.95 us -66.163.20.96 - 66.163.21.23 ca -66.163.21.24 - 66.163.21.47 us -66.163.21.48 - 66.163.25.31 ca -66.163.25.32 - 66.163.25.55 us -66.163.25.56 - 66.163.26.143 ca -66.163.26.144 - 66.163.26.167 us -66.163.26.168 - 66.163.26.183 ca -66.163.26.184 - 66.163.26.191 us -66.163.26.192 - 66.163.27.79 ca -66.163.27.80 - 66.163.27.111 us -66.163.27.112 - 66.163.27.231 ca -66.163.27.232 - 66.163.27.239 us -66.163.27.240 - 66.163.31.15 ca -66.163.31.16 - 66.163.31.127 us -66.163.31.128 - 66.163.31.255 ca +66.160.186.0 - 66.162.255.255 us +66.163.0.0 - 66.163.31.255 ca 66.163.32.0 - 66.163.63.255 us 66.163.64.0 - 66.163.79.255 ca -66.163.80.0 - 66.163.192.7 us -66.163.192.8 - 66.163.198.159 ca -66.163.198.160 - 66.163.198.207 us -66.163.198.208 - 66.163.198.239 ca -66.163.198.240 - 66.163.198.255 us -66.163.199.0 - 66.163.204.143 ca -66.163.204.144 - 66.163.204.151 us -66.163.204.152 - 66.163.204.223 ca -66.163.204.224 - 66.163.204.231 us -66.163.204.232 - 66.163.205.159 ca -66.163.205.160 - 66.163.205.191 us -66.163.205.192 - 66.163.205.207 ca -66.163.205.208 - 66.163.205.215 us -66.163.205.216 - 66.163.206.15 ca -66.163.206.16 - 66.163.206.23 cr -66.163.206.24 - 66.163.206.71 ca -66.163.206.72 - 66.163.206.79 us -66.163.206.80 - 66.163.207.143 ca -66.163.207.144 - 66.163.207.183 us -66.163.207.184 - 66.163.207.255 ca -66.163.208.0 - 66.165.63.255 us -66.165.64.0 - 66.165.66.127 ca -66.165.66.128 - 66.165.66.255 us -66.165.67.0 - 66.165.68.127 ca -66.165.68.128 - 66.165.68.255 us -66.165.69.0 - 66.165.69.255 ca -66.165.70.0 - 66.165.72.63 us -66.165.72.64 - 66.165.72.127 in -66.165.72.128 - 66.165.72.191 ca -66.165.72.192 - 66.165.72.255 my -66.165.73.0 - 66.165.73.255 ca -66.165.74.0 - 66.165.75.255 us -66.165.76.0 - 66.165.77.255 ca -66.165.78.0 - 66.165.78.31 br -66.165.78.32 - 66.165.78.159 us -66.165.78.160 - 66.165.78.191 au -66.165.78.192 - 66.165.78.223 us -66.165.78.224 - 66.165.78.255 ca -66.165.79.0 - 66.165.80.255 us -66.165.81.0 - 66.165.84.255 ca -66.165.85.0 - 66.165.85.127 us -66.165.85.128 - 66.165.85.255 in -66.165.86.0 - 66.165.88.255 ca +66.163.80.0 - 66.163.191.255 us +66.163.192.0 - 66.163.207.255 ca +66.163.208.0 - 66.165.64.255 us +66.165.65.0 - 66.165.65.255 ca +66.165.66.0 - 66.165.81.255 us +66.165.82.0 - 66.165.83.255 ca +66.165.84.0 - 66.165.86.255 us +66.165.87.0 - 66.165.88.255 ca 66.165.89.0 - 66.165.90.255 us -66.165.91.0 - 66.165.92.127 ca -66.165.92.128 - 66.165.92.255 us -66.165.93.0 - 66.165.93.127 ca -66.165.93.128 - 66.165.93.191 us -66.165.93.192 - 66.165.93.255 in -66.165.94.0 - 66.165.94.127 ca -66.165.94.128 - 66.165.98.31 us -66.165.98.32 - 66.165.98.95 ca -66.165.98.96 - 66.165.98.127 us -66.165.98.128 - 66.165.98.191 ca -66.165.98.192 - 66.165.98.223 us -66.165.98.224 - 66.165.98.255 in -66.165.99.0 - 66.165.101.15 us -66.165.101.16 - 66.165.101.31 ca -66.165.101.32 - 66.165.101.63 us -66.165.101.64 - 66.165.101.79 tz -66.165.101.80 - 66.165.101.255 us -66.165.102.0 - 66.165.103.127 ca -66.165.103.128 - 66.165.105.255 us -66.165.106.0 - 66.165.106.31 in -66.165.106.32 - 66.165.106.63 be -66.165.106.64 - 66.165.106.95 us -66.165.106.96 - 66.165.106.127 ca -66.165.106.128 - 66.165.107.31 us -66.165.107.32 - 66.165.107.63 il -66.165.107.64 - 66.165.107.127 us -66.165.107.128 - 66.165.107.159 gb -66.165.107.160 - 66.165.107.191 us -66.165.107.192 - 66.165.107.223 fr -66.165.107.224 - 66.165.112.191 us -66.165.112.192 - 66.165.112.223 au -66.165.112.224 - 66.165.112.255 fr -66.165.113.0 - 66.165.113.255 us +66.165.91.0 - 66.165.91.255 ca +66.165.92.0 - 66.165.101.255 us +66.165.102.0 - 66.165.102.255 ca +66.165.103.0 - 66.165.113.255 us 66.165.114.0 - 66.165.114.255 ca 66.165.115.0 - 66.165.117.255 us 66.165.118.0 - 66.165.119.255 ca -66.165.120.0 - 66.165.121.31 us -66.165.121.32 - 66.165.121.63 in -66.165.121.64 - 66.165.121.95 au -66.165.121.96 - 66.165.121.159 us -66.165.121.160 - 66.165.121.223 ve -66.165.121.224 - 66.165.122.255 us +66.165.120.0 - 66.165.122.255 us 66.165.123.0 - 66.165.123.255 ca 66.165.124.0 - 66.165.124.255 us 66.165.125.0 - 66.165.125.255 ca -66.165.126.0 - 66.165.126.15 cn -66.165.126.16 - 66.165.126.111 us -66.165.126.112 - 66.165.126.127 in -66.165.126.128 - 66.165.162.47 us -66.165.162.48 - 66.165.162.63 tt -66.165.162.64 - 66.165.162.223 us -66.165.162.224 - 66.165.162.239 pr -66.165.162.240 - 66.165.162.255 us -66.165.163.0 - 66.165.163.7 es -66.165.163.8 - 66.165.163.39 us -66.165.163.40 - 66.165.163.47 cr -66.165.163.48 - 66.165.163.207 us -66.165.163.208 - 66.165.163.223 mx -66.165.163.224 - 66.165.164.79 us -66.165.164.80 - 66.165.164.95 es -66.165.164.96 - 66.165.164.111 us -66.165.164.112 - 66.165.164.115 br -66.165.164.116 - 66.165.165.79 us -66.165.165.80 - 66.165.165.95 co -66.165.165.96 - 66.165.166.47 us -66.165.166.48 - 66.165.166.63 aw -66.165.166.64 - 66.165.166.79 pr -66.165.166.80 - 66.165.166.95 us -66.165.166.96 - 66.165.166.111 br -66.165.166.112 - 66.165.166.127 fr -66.165.166.128 - 66.165.166.223 us -66.165.166.224 - 66.165.166.239 pr -66.165.166.240 - 66.165.168.175 us -66.165.168.176 - 66.165.168.191 do -66.165.168.192 - 66.165.169.111 us -66.165.169.112 - 66.165.169.127 uy -66.165.169.128 - 66.165.169.191 us -66.165.169.192 - 66.165.169.207 ar -66.165.169.208 - 66.165.170.207 us -66.165.170.208 - 66.165.170.223 br -66.165.170.224 - 66.165.171.71 us -66.165.171.72 - 66.165.171.75 br -66.165.171.76 - 66.165.171.79 us -66.165.171.80 - 66.165.171.95 de -66.165.171.96 - 66.165.171.207 us -66.165.171.208 - 66.165.171.223 ve -66.165.171.224 - 66.165.172.143 us -66.165.172.144 - 66.165.172.159 co -66.165.172.160 - 66.165.172.191 us -66.165.172.192 - 66.165.172.207 pa -66.165.172.208 - 66.165.172.223 tt -66.165.172.224 - 66.165.173.79 us -66.165.173.80 - 66.165.173.95 mx -66.165.173.96 - 66.165.173.223 us -66.165.173.224 - 66.165.173.239 cl -66.165.173.240 - 66.165.175.47 us -66.165.175.48 - 66.165.175.63 bb -66.165.175.64 - 66.165.177.95 us -66.165.177.96 - 66.165.177.111 nl -66.165.177.112 - 66.165.177.175 us -66.165.177.176 - 66.165.177.191 ca -66.165.177.192 - 66.165.177.207 us -66.165.177.208 - 66.165.177.223 pa -66.165.177.224 - 66.165.180.223 us -66.165.180.224 - 66.165.180.239 gt -66.165.180.240 - 66.165.182.31 us -66.165.182.32 - 66.165.182.47 pe -66.165.182.48 - 66.165.182.111 us -66.165.182.112 - 66.165.182.127 ve -66.165.182.128 - 66.165.182.255 us -66.165.183.0 - 66.165.183.15 uy -66.165.183.16 - 66.165.183.63 us -66.165.183.64 - 66.165.183.79 es -66.165.183.80 - 66.165.183.159 us -66.165.183.160 - 66.165.183.175 dk -66.165.183.176 - 66.165.187.127 us -66.165.187.128 - 66.165.187.143 nl -66.165.187.144 - 66.165.187.191 us -66.165.187.192 - 66.165.187.207 gy -66.165.187.208 - 66.165.187.223 ar -66.165.187.224 - 66.165.188.255 us -66.165.189.0 - 66.165.189.7 pa -66.165.189.8 - 66.165.189.239 us -66.165.189.240 - 66.165.189.243 sv -66.165.189.244 - 66.165.189.251 us -66.165.189.252 - 66.165.189.255 sv -66.165.190.0 - 66.165.191.255 us +66.165.126.0 - 66.165.191.255 us 66.165.192.0 - 66.165.223.255 ca 66.165.224.0 - 66.170.143.255 us -66.170.144.0 - 66.170.145.39 ca -66.170.145.40 - 66.170.145.47 us -66.170.145.48 - 66.170.145.95 ca -66.170.145.96 - 66.170.145.103 us -66.170.145.104 - 66.170.145.111 ca -66.170.145.112 - 66.170.145.119 us -66.170.145.120 - 66.170.146.111 ca -66.170.146.112 - 66.170.146.119 us -66.170.146.120 - 66.170.146.127 ca -66.170.146.128 - 66.170.146.159 us -66.170.146.160 - 66.170.147.79 ca -66.170.147.80 - 66.170.147.87 us -66.170.147.88 - 66.170.147.207 ca -66.170.147.208 - 66.170.147.215 us -66.170.147.216 - 66.170.147.223 ca -66.170.147.224 - 66.170.147.239 us -66.170.147.240 - 66.170.154.7 ca -66.170.154.8 - 66.170.154.31 us -66.170.154.32 - 66.170.154.87 ca -66.170.154.88 - 66.170.154.95 us -66.170.154.96 - 66.170.156.223 ca -66.170.156.224 - 66.170.156.231 us -66.170.156.232 - 66.170.159.255 ca -66.170.160.0 - 66.171.31.255 us -66.171.32.0 - 66.171.63.255 ca +66.170.144.0 - 66.170.159.255 ca +66.170.160.0 - 66.170.179.255 us +66.170.180.0 - 66.170.183.255 ca +66.170.184.0 - 66.171.47.255 us +66.171.48.0 - 66.171.63.255 ca 66.171.64.0 - 66.171.95.255 us 66.171.96.0 - 66.171.111.255 ca 66.171.112.0 - 66.171.127.255 us 66.171.128.0 - 66.171.143.255 ca 66.171.144.0 - 66.171.159.255 us 66.171.160.0 - 66.171.175.255 ca -66.171.176.0 - 66.171.237.255 us -66.171.238.0 - 66.171.239.255 bz -66.171.240.0 - 66.171.240.255 us -66.171.241.0 - 66.171.241.31 no -66.171.241.32 - 66.171.241.47 us -66.171.241.48 - 66.171.241.63 in -66.171.241.64 - 66.171.242.31 us -66.171.242.32 - 66.171.242.63 au -66.171.242.64 - 66.175.96.151 us -66.175.96.152 - 66.175.96.159 bb -66.175.96.160 - 66.175.98.207 us -66.175.98.208 - 66.175.98.223 gb -66.175.98.224 - 66.175.103.127 us -66.175.103.128 - 66.175.103.143 lu -66.175.103.144 - 66.175.103.175 us -66.175.103.176 - 66.175.103.191 es -66.175.103.192 - 66.175.108.111 us -66.175.108.112 - 66.175.108.127 do -66.175.108.128 - 66.175.109.15 us -66.175.109.16 - 66.175.109.31 bb -66.175.109.32 - 66.175.110.191 us -66.175.110.192 - 66.175.110.207 bb -66.175.110.208 - 66.175.110.255 us +66.171.176.0 - 66.175.99.255 us +66.175.100.0 - 66.175.100.255 il +66.175.101.0 - 66.175.110.255 us 66.175.111.0 - 66.175.111.255 co -66.175.112.0 - 66.175.112.95 us -66.175.112.96 - 66.175.112.111 ca -66.175.112.112 - 66.175.112.207 us -66.175.112.208 - 66.175.112.223 es -66.175.112.224 - 66.175.112.239 us -66.175.112.240 - 66.175.112.255 ht -66.175.113.0 - 66.175.114.47 us -66.175.114.48 - 66.175.114.63 br -66.175.114.64 - 66.175.116.47 us -66.175.116.48 - 66.175.116.63 pr -66.175.116.64 - 66.175.116.207 us -66.175.116.208 - 66.175.116.223 jm -66.175.116.224 - 66.175.118.143 us -66.175.118.144 - 66.175.118.159 pe -66.175.118.160 - 66.175.120.15 us -66.175.120.16 - 66.175.120.31 ag -66.175.120.32 - 66.175.120.119 us -66.175.120.120 - 66.175.120.127 cy -66.175.120.128 - 66.175.122.255 us +66.175.112.0 - 66.175.122.255 us 66.175.123.0 - 66.175.123.255 gb -66.175.124.0 - 66.175.125.7 us -66.175.125.8 - 66.175.125.15 cr -66.175.125.16 - 66.177.255.255 us -66.178.0.0 - 66.178.4.143 a2 -66.178.4.144 - 66.178.4.151 sa -66.178.4.152 - 66.178.4.159 ng -66.178.4.160 - 66.178.4.255 a2 -66.178.5.0 - 66.178.5.255 tr -66.178.6.0 - 66.178.6.255 a2 -66.178.7.0 - 66.178.7.7 tz -66.178.7.8 - 66.178.7.15 a2 -66.178.7.16 - 66.178.7.23 ng -66.178.7.24 - 66.178.7.31 gb -66.178.7.32 - 66.178.7.39 ao -66.178.7.40 - 66.178.7.127 a2 -66.178.7.128 - 66.178.7.191 ke -66.178.7.192 - 66.178.8.255 a2 -66.178.9.0 - 66.178.9.23 lb -66.178.9.24 - 66.178.12.127 a2 -66.178.12.128 - 66.178.12.143 lb -66.178.12.144 - 66.178.12.255 a2 -66.178.13.0 - 66.178.14.255 an -66.178.15.0 - 66.178.16.79 a2 -66.178.16.80 - 66.178.16.87 ec -66.178.16.88 - 66.178.16.151 a2 -66.178.16.152 - 66.178.16.159 ma -66.178.16.160 - 66.178.16.231 a2 -66.178.16.232 - 66.178.16.247 ng -66.178.16.248 - 66.178.17.7 a2 -66.178.17.8 - 66.178.17.15 us -66.178.17.16 - 66.178.17.23 a2 -66.178.17.24 - 66.178.17.47 ec -66.178.17.48 - 66.178.17.55 a2 -66.178.17.56 - 66.178.17.63 py -66.178.17.64 - 66.178.17.71 ng -66.178.17.72 - 66.178.17.95 a2 -66.178.17.96 - 66.178.17.103 sv -66.178.17.104 - 66.178.17.127 ve -66.178.17.128 - 66.178.17.135 bb -66.178.17.136 - 66.178.17.175 a2 -66.178.17.176 - 66.178.17.191 ni -66.178.17.192 - 66.178.17.199 a2 -66.178.17.200 - 66.178.17.207 ec -66.178.17.208 - 66.178.17.255 a2 -66.178.18.0 - 66.178.18.79 sv -66.178.18.80 - 66.178.18.95 a2 -66.178.18.96 - 66.178.18.127 sv -66.178.18.128 - 66.178.18.135 a2 -66.178.18.136 - 66.178.18.143 sv -66.178.18.144 - 66.178.18.151 ni -66.178.18.152 - 66.178.18.183 a2 -66.178.18.184 - 66.178.18.191 ni -66.178.18.192 - 66.178.18.215 a2 -66.178.18.216 - 66.178.18.223 ni -66.178.18.224 - 66.178.18.231 a2 -66.178.18.232 - 66.178.18.239 ni -66.178.18.240 - 66.178.18.247 a2 -66.178.18.248 - 66.178.18.255 ni -66.178.19.0 - 66.178.19.127 us -66.178.19.128 - 66.178.19.159 sv -66.178.19.160 - 66.178.19.167 ni -66.178.19.168 - 66.178.19.175 a2 -66.178.19.176 - 66.178.19.183 ni -66.178.19.184 - 66.178.19.191 a2 -66.178.19.192 - 66.178.19.255 ec -66.178.20.0 - 66.178.20.7 lb -66.178.20.8 - 66.178.20.23 a2 -66.178.20.24 - 66.178.20.31 lb -66.178.20.32 - 66.178.20.63 a2 -66.178.20.64 - 66.178.20.127 py -66.178.20.128 - 66.178.20.175 a2 -66.178.20.176 - 66.178.20.191 sa -66.178.20.192 - 66.178.20.207 a2 -66.178.20.208 - 66.178.20.215 sa -66.178.20.216 - 66.178.20.231 lb -66.178.20.232 - 66.178.20.255 a2 -66.178.21.0 - 66.178.21.7 lb -66.178.21.8 - 66.178.21.23 a2 -66.178.21.24 - 66.178.21.95 sa -66.178.21.96 - 66.178.21.127 lb -66.178.21.128 - 66.178.21.159 sa -66.178.21.160 - 66.178.21.167 a2 -66.178.21.168 - 66.178.21.207 lb -66.178.21.208 - 66.178.21.215 a2 -66.178.21.216 - 66.178.21.231 lb -66.178.21.232 - 66.178.21.239 a2 -66.178.21.240 - 66.178.21.247 lb -66.178.21.248 - 66.178.21.255 a2 -66.178.22.0 - 66.178.22.31 lb -66.178.22.32 - 66.178.22.39 a2 -66.178.22.40 - 66.178.22.47 lb -66.178.22.48 - 66.178.22.63 a2 -66.178.22.64 - 66.178.22.71 lb -66.178.22.72 - 66.178.22.79 sa -66.178.22.80 - 66.178.22.87 lb -66.178.22.88 - 66.178.22.95 a2 -66.178.22.96 - 66.178.22.103 ma -66.178.22.104 - 66.178.22.127 lb -66.178.22.128 - 66.178.22.191 a2 -66.178.22.192 - 66.178.22.223 sa -66.178.22.224 - 66.178.22.239 a2 -66.178.22.240 - 66.178.22.247 lb -66.178.22.248 - 66.178.22.255 sa -66.178.23.0 - 66.178.23.15 lb -66.178.23.16 - 66.178.23.31 a2 -66.178.23.32 - 66.178.23.63 sa -66.178.23.64 - 66.178.23.79 a2 -66.178.23.80 - 66.178.23.95 sa -66.178.23.96 - 66.178.23.111 lb -66.178.23.112 - 66.178.23.127 sa -66.178.23.128 - 66.178.23.191 lb -66.178.23.192 - 66.178.23.223 sa -66.178.23.224 - 66.178.24.31 a2 -66.178.24.32 - 66.178.24.39 lb -66.178.24.40 - 66.178.24.95 a2 -66.178.24.96 - 66.178.24.207 sa -66.178.24.208 - 66.178.24.231 a2 -66.178.24.232 - 66.178.24.239 lb -66.178.24.240 - 66.178.24.247 a2 -66.178.24.248 - 66.178.25.31 sa -66.178.25.32 - 66.178.25.47 a2 -66.178.25.48 - 66.178.25.63 lb -66.178.25.64 - 66.178.25.95 a2 -66.178.25.96 - 66.178.25.111 lb -66.178.25.112 - 66.178.25.119 ae -66.178.25.120 - 66.178.25.127 a2 -66.178.25.128 - 66.178.25.143 sa -66.178.25.144 - 66.178.25.159 iq -66.178.25.160 - 66.178.25.191 a2 -66.178.25.192 - 66.178.25.223 iq -66.178.25.224 - 66.178.25.231 ae -66.178.25.232 - 66.178.25.239 a2 -66.178.25.240 - 66.178.25.255 ae -66.178.26.0 - 66.178.26.255 sr -66.178.27.0 - 66.178.27.255 a2 -66.178.28.0 - 66.178.28.143 sa -66.178.28.144 - 66.178.28.159 a2 -66.178.28.160 - 66.178.28.175 sa -66.178.28.176 - 66.178.28.191 a2 -66.178.28.192 - 66.178.29.127 sa -66.178.29.128 - 66.178.29.191 a2 -66.178.29.192 - 66.178.29.255 sa -66.178.30.0 - 66.178.30.23 a2 -66.178.30.24 - 66.178.30.31 ni -66.178.30.32 - 66.178.30.127 a2 -66.178.30.128 - 66.178.30.255 tt -66.178.31.0 - 66.178.31.127 gy -66.178.31.128 - 66.178.31.255 a2 +66.175.124.0 - 66.177.255.255 us +66.178.0.0 - 66.178.4.255 a2 +66.178.5.0 - 66.178.5.255 as +66.178.6.0 - 66.178.13.255 a2 +66.178.14.0 - 66.178.14.255 as +66.178.15.0 - 66.178.16.255 a2 +66.178.17.0 - 66.178.17.255 br +66.178.18.0 - 66.178.31.255 a2 66.178.32.0 - 66.178.32.255 lb -66.178.33.0 - 66.178.33.7 ke -66.178.33.8 - 66.178.33.127 a2 -66.178.33.128 - 66.178.33.255 ng +66.178.33.0 - 66.178.33.255 a2 66.178.34.0 - 66.178.34.255 gb -66.178.35.0 - 66.178.35.127 sa -66.178.35.128 - 66.178.35.255 gy -66.178.36.0 - 66.178.38.128 sr -66.178.38.129 - 66.178.38.255 a2 +66.178.35.0 - 66.178.38.255 a2 66.178.39.0 - 66.178.39.255 gy 66.178.40.0 - 66.178.40.255 a2 66.178.41.0 - 66.178.41.255 ve 66.178.42.0 - 66.178.42.255 gb -66.178.43.0 - 66.178.43.255 sa -66.178.44.0 - 66.178.44.15 ni -66.178.44.16 - 66.178.44.31 ve -66.178.44.32 - 66.178.44.39 a2 -66.178.44.40 - 66.178.44.47 ni -66.178.44.48 - 66.178.44.55 a2 -66.178.44.56 - 66.178.44.71 ni -66.178.44.72 - 66.178.44.79 sv -66.178.44.80 - 66.178.44.103 a2 -66.178.44.104 - 66.178.44.111 ni -66.178.44.112 - 66.178.44.119 a2 -66.178.44.120 - 66.178.44.127 ni -66.178.44.128 - 66.178.44.135 a2 -66.178.44.136 - 66.178.44.143 ec -66.178.44.144 - 66.178.44.151 sv -66.178.44.152 - 66.178.44.183 ve -66.178.44.184 - 66.178.44.191 sv -66.178.44.192 - 66.178.44.223 ni -66.178.44.224 - 66.178.44.231 a2 -66.178.44.232 - 66.178.44.239 ni -66.178.44.240 - 66.178.44.255 a2 +66.178.43.0 - 66.178.44.255 a2 66.178.45.0 - 66.178.45.255 ve 66.178.46.0 - 66.178.46.255 us 66.178.47.0 - 66.178.47.255 ng -66.178.48.0 - 66.178.48.63 gy -66.178.48.64 - 66.178.48.95 a2 -66.178.48.96 - 66.178.48.103 sv -66.178.48.104 - 66.178.48.143 a2 -66.178.48.144 - 66.178.48.151 ec -66.178.48.152 - 66.178.48.159 sv -66.178.48.160 - 66.178.48.167 ni -66.178.48.168 - 66.178.48.175 a2 -66.178.48.176 - 66.178.48.183 us -66.178.48.184 - 66.178.48.255 ec -66.178.49.0 - 66.178.49.7 us -66.178.49.8 - 66.178.53.255 a2 +66.178.48.0 - 66.178.53.255 a2 66.178.54.0 - 66.178.54.255 ke 66.178.55.0 - 66.178.55.255 a2 66.178.56.0 - 66.178.56.255 gb -66.178.57.0 - 66.178.57.31 lb -66.178.57.32 - 66.178.57.39 a2 -66.178.57.40 - 66.178.57.55 sa -66.178.57.56 - 66.178.57.63 a2 -66.178.57.64 - 66.178.57.71 sa -66.178.57.72 - 66.178.57.87 a2 -66.178.57.88 - 66.178.57.103 lb -66.178.57.104 - 66.178.57.111 a2 -66.178.57.112 - 66.178.57.119 sa -66.178.57.120 - 66.178.57.127 lb -66.178.57.128 - 66.178.57.135 sa -66.178.57.136 - 66.178.57.143 a2 -66.178.57.144 - 66.178.57.167 sa -66.178.57.168 - 66.178.57.255 a2 -66.178.58.0 - 66.178.58.63 ng -66.178.58.64 - 66.178.58.87 a2 -66.178.58.88 - 66.178.58.95 ng -66.178.58.96 - 66.178.58.103 lb -66.178.58.104 - 66.178.58.175 a2 -66.178.58.176 - 66.178.58.191 ng -66.178.58.192 - 66.178.58.215 a2 -66.178.58.216 - 66.178.58.223 ng -66.178.58.224 - 66.178.58.255 a2 -66.178.59.0 - 66.178.59.23 ng -66.178.59.24 - 66.178.59.63 a2 -66.178.59.64 - 66.178.59.95 ng -66.178.59.96 - 66.178.59.127 a2 -66.178.59.128 - 66.178.59.255 ng -66.178.60.0 - 66.178.60.255 sa -66.178.61.0 - 66.178.61.31 a2 -66.178.61.32 - 66.178.61.63 ng -66.178.61.64 - 66.178.61.71 ke -66.178.61.72 - 66.178.61.255 a2 -66.178.62.0 - 66.178.62.15 us -66.178.62.16 - 66.178.62.39 a2 -66.178.62.40 - 66.178.62.47 sa -66.178.62.48 - 66.178.62.95 a2 -66.178.62.96 - 66.178.62.103 us -66.178.62.104 - 66.178.63.47 a2 -66.178.63.48 - 66.178.63.55 lb -66.178.63.56 - 66.178.63.87 a2 -66.178.63.88 - 66.178.63.95 ni -66.178.63.96 - 66.178.63.255 a2 -66.178.64.0 - 66.178.64.31 sa -66.178.64.32 - 66.178.64.63 a2 -66.178.64.64 - 66.178.65.135 sa -66.178.65.136 - 66.178.65.143 a2 -66.178.65.144 - 66.178.65.159 lb -66.178.65.160 - 66.178.65.191 sa -66.178.65.192 - 66.178.67.255 a2 -66.178.68.0 - 66.178.68.159 sa -66.178.68.160 - 66.178.68.191 a2 -66.178.68.192 - 66.178.68.223 sa -66.178.68.224 - 66.178.68.255 lb -66.178.69.0 - 66.178.69.127 sa -66.178.69.128 - 66.178.69.151 lb -66.178.69.152 - 66.178.69.167 sa -66.178.69.168 - 66.178.69.175 lb -66.178.69.176 - 66.178.69.207 sa -66.178.69.208 - 66.178.69.247 lb -66.178.69.248 - 66.178.69.255 sa -66.178.70.0 - 66.178.70.127 a2 -66.178.70.128 - 66.178.70.191 lb -66.178.70.192 - 66.178.70.255 a2 -66.178.71.0 - 66.178.71.15 ni -66.178.71.16 - 66.178.71.55 a2 -66.178.71.56 - 66.178.71.63 ni -66.178.71.64 - 66.178.71.255 a2 -66.178.72.0 - 66.178.72.255 ng -66.178.73.0 - 66.178.73.255 a2 +66.178.57.0 - 66.178.73.255 a2 66.178.74.0 - 66.178.74.255 tz -66.178.75.0 - 66.178.75.255 an -66.178.76.0 - 66.178.76.255 a2 -66.178.77.0 - 66.178.77.255 iq -66.178.78.0 - 66.178.78.55 ec -66.178.78.56 - 66.178.78.63 a2 -66.178.78.64 - 66.178.78.103 sv -66.178.78.104 - 66.178.78.111 ec -66.178.78.112 - 66.178.78.119 sv -66.178.78.120 - 66.178.78.127 ng -66.178.78.128 - 66.178.78.151 a2 -66.178.78.152 - 66.178.78.159 ni -66.178.78.160 - 66.178.78.191 ng -66.178.78.192 - 66.178.78.199 ec -66.178.78.200 - 66.178.78.223 ni -66.178.78.224 - 66.178.78.231 ec -66.178.78.232 - 66.178.78.239 ni -66.178.78.240 - 66.178.78.247 a2 -66.178.78.248 - 66.178.78.255 ni -66.178.79.0 - 66.178.80.31 a2 -66.178.80.32 - 66.178.80.39 ng -66.178.80.40 - 66.178.80.47 a2 -66.178.80.48 - 66.178.80.55 ke -66.178.80.56 - 66.178.80.63 us -66.178.80.64 - 66.178.80.71 a2 -66.178.80.72 - 66.178.80.135 ng -66.178.80.136 - 66.178.80.143 a2 -66.178.80.144 - 66.178.80.151 ng -66.178.80.152 - 66.178.80.159 a2 -66.178.80.160 - 66.178.80.167 ke -66.178.80.168 - 66.178.80.183 ng -66.178.80.184 - 66.178.80.191 a2 -66.178.80.192 - 66.178.80.223 ng -66.178.80.224 - 66.178.80.239 a2 -66.178.80.240 - 66.178.80.247 ng -66.178.80.248 - 66.178.80.255 a2 -66.178.81.0 - 66.178.81.15 ng -66.178.81.16 - 66.178.81.31 sv -66.178.81.32 - 66.178.81.47 ng -66.178.81.48 - 66.178.81.63 us -66.178.81.64 - 66.178.81.79 ng -66.178.81.80 - 66.178.81.87 a2 -66.178.81.88 - 66.178.81.151 ng -66.178.81.152 - 66.178.81.159 us -66.178.81.160 - 66.178.81.167 ng -66.178.81.168 - 66.178.81.175 us -66.178.81.176 - 66.178.81.183 ng -66.178.81.184 - 66.178.81.191 cm -66.178.81.192 - 66.178.81.199 ng -66.178.81.200 - 66.178.81.207 a2 -66.178.81.208 - 66.178.81.247 ng -66.178.81.248 - 66.178.82.127 a2 -66.178.82.128 - 66.178.82.255 ng -66.178.83.0 - 66.178.83.7 lb -66.178.83.8 - 66.178.83.15 a2 -66.178.83.16 - 66.178.83.23 ng -66.178.83.24 - 66.178.83.167 a2 -66.178.83.168 - 66.178.83.175 ng -66.178.83.176 - 66.178.83.255 a2 -66.178.84.0 - 66.178.84.31 ae -66.178.84.32 - 66.178.84.111 sa -66.178.84.112 - 66.178.84.127 a2 -66.178.84.128 - 66.178.84.191 ae -66.178.84.192 - 66.178.84.255 a2 +66.178.75.0 - 66.178.84.255 a2 66.178.85.0 - 66.178.85.255 ni -66.178.86.0 - 66.178.86.63 tz -66.178.86.64 - 66.178.86.79 ve -66.178.86.80 - 66.178.86.127 a2 -66.178.86.128 - 66.178.86.159 ng -66.178.86.160 - 66.178.86.191 a2 -66.178.86.192 - 66.178.86.199 tz -66.178.86.200 - 66.178.86.239 us -66.178.86.240 - 66.178.88.255 a2 +66.178.86.0 - 66.178.88.255 a2 66.178.89.0 - 66.178.89.255 sa -66.178.90.0 - 66.178.90.71 tz -66.178.90.72 - 66.178.90.79 iq -66.178.90.80 - 66.178.90.87 a2 -66.178.90.88 - 66.178.90.95 ng -66.178.90.96 - 66.178.90.103 a2 -66.178.90.104 - 66.178.90.111 lb -66.178.90.112 - 66.178.90.127 a2 -66.178.90.128 - 66.178.90.135 lb -66.178.90.136 - 66.178.90.143 sa -66.178.90.144 - 66.178.90.151 a2 -66.178.90.152 - 66.178.90.159 iq -66.178.90.160 - 66.178.90.183 tz -66.178.90.184 - 66.178.90.191 lb -66.178.90.192 - 66.178.90.239 sa -66.178.90.240 - 66.178.90.247 lb -66.178.90.248 - 66.178.90.255 sa -66.178.91.0 - 66.178.91.255 lb -66.178.92.0 - 66.178.94.255 a2 -66.178.95.0 - 66.178.95.127 ng -66.178.95.128 - 66.178.95.255 a2 +66.178.90.0 - 66.178.95.255 a2 66.178.96.0 - 66.178.98.255 gb 66.178.99.0 - 66.178.99.255 us -66.178.100.0 - 66.178.103.255 ke -66.178.104.0 - 66.178.104.255 a2 -66.178.105.0 - 66.178.105.31 ng -66.178.105.32 - 66.178.105.71 a2 -66.178.105.72 - 66.178.105.79 gb -66.178.105.80 - 66.178.105.191 a2 -66.178.105.192 - 66.178.105.207 gb -66.178.105.208 - 66.178.105.255 a2 +66.178.100.0 - 66.178.105.255 a2 66.178.106.0 - 66.178.106.255 ve -66.178.107.0 - 66.178.107.127 ke -66.178.107.128 - 66.178.107.255 gb +66.178.107.0 - 66.178.107.255 a2 66.178.108.0 - 66.178.109.255 ke -66.178.110.0 - 66.178.110.127 a2 -66.178.110.128 - 66.178.110.255 fr -66.178.111.0 - 66.178.111.191 a2 -66.178.111.192 - 66.178.111.223 us -66.178.111.224 - 66.178.113.127 a2 -66.178.113.128 - 66.178.113.135 ke -66.178.113.136 - 66.178.116.127 a2 -66.178.116.128 - 66.178.116.255 lr -66.178.117.0 - 66.178.120.255 a2 -66.178.121.0 - 66.178.121.15 ke -66.178.121.16 - 66.178.121.95 a2 -66.178.121.96 - 66.178.121.103 sa -66.178.121.104 - 66.178.121.127 a2 -66.178.121.128 - 66.178.121.199 us -66.178.121.200 - 66.178.126.255 a2 +66.178.110.0 - 66.178.126.255 a2 66.178.127.0 - 66.178.127.255 lr -66.178.128.0 - 66.178.242.119 us -66.178.242.120 - 66.178.242.127 uy -66.178.242.128 - 66.180.63.255 us +66.178.128.0 - 66.180.63.255 us 66.180.64.0 - 66.180.71.255 ca -66.180.80.0 - 66.180.203.223 us -66.180.203.224 - 66.180.203.231 au -66.180.203.232 - 66.180.223.255 us -66.181.0.0 - 66.181.33.135 us -66.181.33.136 - 66.181.33.151 ht -66.181.33.152 - 66.181.34.103 us -66.181.34.104 - 66.181.34.111 ca -66.181.34.112 - 66.181.34.143 us -66.181.34.144 - 66.181.34.151 mx -66.181.34.152 - 66.181.34.255 us -66.181.35.0 - 66.181.35.7 ca -66.181.35.8 - 66.181.35.127 us -66.181.35.128 - 66.181.35.135 ca -66.181.35.136 - 66.181.35.175 us -66.181.35.176 - 66.181.35.183 ca -66.181.35.184 - 66.181.36.7 us -66.181.36.8 - 66.181.36.15 ca -66.181.36.16 - 66.181.37.95 us -66.181.37.96 - 66.181.37.111 ca -66.181.37.112 - 66.181.38.23 us -66.181.38.24 - 66.181.38.31 ca -66.181.38.32 - 66.181.38.183 us -66.181.38.184 - 66.181.38.191 ca -66.181.38.192 - 66.181.39.95 us -66.181.39.96 - 66.181.39.103 af -66.181.39.104 - 66.181.40.175 us -66.181.40.176 - 66.181.40.183 ca -66.181.40.184 - 66.181.41.31 us -66.181.41.32 - 66.181.41.39 mx -66.181.41.40 - 66.181.41.207 us -66.181.41.208 - 66.181.41.215 ca -66.181.41.216 - 66.181.43.79 us -66.181.43.80 - 66.181.43.87 ht -66.181.43.88 - 66.181.43.255 us -66.181.44.0 - 66.181.44.7 ca -66.181.44.8 - 66.181.44.63 us -66.181.44.64 - 66.181.44.79 mx -66.181.44.80 - 66.181.47.135 us -66.181.47.136 - 66.181.47.143 ca -66.181.47.144 - 66.181.48.63 us -66.181.48.64 - 66.181.48.71 ca -66.181.48.72 - 66.181.50.135 us -66.181.50.136 - 66.181.50.143 ca -66.181.50.144 - 66.181.51.55 us -66.181.51.56 - 66.181.51.63 ca -66.181.51.64 - 66.181.54.103 us -66.181.54.104 - 66.181.54.111 ca -66.181.54.112 - 66.181.57.31 us -66.181.57.32 - 66.181.57.127 mx -66.181.57.128 - 66.181.57.143 us -66.181.57.144 - 66.181.57.231 mx -66.181.57.232 - 66.181.57.255 us -66.181.58.0 - 66.181.58.23 mx -66.181.58.24 - 66.181.58.31 us -66.181.58.32 - 66.181.58.143 mx -66.181.58.144 - 66.181.58.151 us -66.181.58.152 - 66.181.58.247 mx -66.181.58.248 - 66.181.58.255 us -66.181.59.0 - 66.181.59.23 mx -66.181.59.24 - 66.181.59.31 us -66.181.59.32 - 66.181.59.95 mx -66.181.59.96 - 66.181.59.119 us -66.181.59.120 - 66.181.59.151 mx -66.181.59.152 - 66.181.59.159 us -66.181.59.160 - 66.181.59.167 mx -66.181.59.168 - 66.181.59.175 us -66.181.59.176 - 66.181.59.199 mx -66.181.59.200 - 66.181.59.207 us -66.181.59.208 - 66.181.60.23 mx -66.181.60.24 - 66.181.60.39 us -66.181.60.40 - 66.181.60.47 mx -66.181.60.48 - 66.181.60.71 us -66.181.60.72 - 66.181.60.127 mx -66.181.60.128 - 66.181.60.135 us -66.181.60.136 - 66.181.60.151 mx -66.181.60.152 - 66.181.60.159 us -66.181.60.160 - 66.181.60.183 mx -66.181.60.184 - 66.181.60.191 us -66.181.60.192 - 66.181.60.215 mx -66.181.60.216 - 66.181.60.231 us -66.181.60.232 - 66.181.60.247 mx -66.181.60.248 - 66.181.61.47 us -66.181.61.48 - 66.181.61.95 mx -66.181.61.96 - 66.181.61.111 us -66.181.61.112 - 66.181.61.127 mx -66.181.61.128 - 66.181.61.135 us -66.181.61.136 - 66.181.61.143 gt -66.181.61.144 - 66.181.61.151 mx -66.181.61.152 - 66.181.61.159 us -66.181.61.160 - 66.181.62.63 mx -66.181.62.64 - 66.181.62.71 us -66.181.62.72 - 66.181.62.103 gt -66.181.62.104 - 66.181.62.143 us -66.181.62.144 - 66.181.62.175 mx -66.181.62.176 - 66.181.62.199 us -66.181.62.200 - 66.181.62.207 gt -66.181.62.208 - 66.181.62.215 mx -66.181.62.216 - 66.181.62.255 us -66.181.63.0 - 66.181.63.7 gt -66.181.63.8 - 66.181.63.71 mx -66.181.63.72 - 66.181.63.79 us -66.181.63.80 - 66.181.63.119 mx -66.181.63.120 - 66.181.63.127 us -66.181.63.128 - 66.181.63.143 mx -66.181.63.144 - 66.181.207.255 us +66.180.72.0 - 66.181.58.15 us +66.181.58.16 - 66.181.58.23 mx +66.181.58.24 - 66.181.58.47 us +66.181.58.48 - 66.181.58.55 mx +66.181.58.56 - 66.181.58.63 us +66.181.58.64 - 66.181.58.79 mx +66.181.58.80 - 66.181.58.127 us +66.181.58.128 - 66.181.58.135 mx +66.181.58.136 - 66.181.58.159 us +66.181.58.160 - 66.181.58.175 mx +66.181.58.176 - 66.181.59.223 us +66.181.59.224 - 66.181.59.231 mx +66.181.59.232 - 66.181.61.175 us +66.181.61.176 - 66.181.61.183 mx +66.181.61.184 - 66.181.61.247 us +66.181.61.248 - 66.181.61.255 mx +66.181.62.0 - 66.181.62.39 us +66.181.62.40 - 66.181.62.47 mx +66.181.62.48 - 66.181.62.79 us +66.181.62.80 - 66.181.62.87 gt +66.181.62.88 - 66.181.63.7 us +66.181.63.8 - 66.181.63.15 mx +66.181.63.16 - 66.181.207.255 us 66.181.208.0 - 66.181.223.255 ca 66.181.224.0 - 66.182.255.255 us 66.183.0.0 - 66.183.255.255 ca -66.184.0.0 - 66.184.56.191 us -66.184.56.192 - 66.184.56.199 um -66.184.56.200 - 66.185.31.255 us -66.185.32.0 - 66.185.47.255 vi +66.184.0.0 - 66.185.31.255 us +66.185.32.0 - 66.185.43.239 vi +66.185.43.240 - 66.185.45.255 us +66.185.46.0 - 66.185.47.255 vi 66.185.48.0 - 66.185.63.255 ca 66.185.64.0 - 66.185.79.255 us 66.185.80.0 - 66.185.95.255 ca -66.185.96.0 - 66.185.102.223 us -66.185.102.224 - 66.185.102.231 co -66.185.102.232 - 66.185.191.255 us +66.185.96.0 - 66.185.191.255 us 66.185.192.0 - 66.185.223.255 ca -66.185.224.0 - 66.186.2.159 us -66.186.2.160 - 66.186.2.167 au -66.186.2.168 - 66.186.17.191 us -66.186.17.192 - 66.186.17.223 gi -66.186.17.224 - 66.186.63.255 us +66.185.224.0 - 66.186.3.63 us +66.186.3.64 - 66.186.3.127 br +66.186.3.128 - 66.186.63.255 us 66.186.64.0 - 66.186.95.255 ca 66.186.96.0 - 66.187.25.255 us 66.187.26.0 - 66.187.27.255 pr -66.187.28.0 - 66.187.111.255 us +66.187.28.0 - 66.187.65.255 us +66.187.66.0 - 66.187.66.255 gb +66.187.67.0 - 66.187.79.255 us +66.187.80.0 - 66.187.95.255 ca +66.187.96.0 - 66.187.111.255 us 66.187.112.0 - 66.187.127.255 ca -66.187.128.0 - 66.193.215.191 us -66.193.215.192 - 66.193.215.223 a2 -66.193.215.224 - 66.194.19.191 us -66.194.19.192 - 66.194.19.223 a2 -66.194.19.224 - 66.194.123.255 us -66.194.124.0 - 66.194.125.255 ar -66.194.126.0 - 66.194.211.255 us -66.194.212.0 - 66.194.212.255 ar -66.194.213.0 - 66.196.31.255 us -66.196.32.0 - 66.196.32.95 ca -66.196.32.96 - 66.196.32.127 us -66.196.32.128 - 66.196.34.15 ca -66.196.34.16 - 66.196.34.23 tw -66.196.34.24 - 66.196.34.31 ca -66.196.34.32 - 66.196.34.39 us -66.196.34.40 - 66.196.40.143 ca -66.196.40.144 - 66.196.40.159 tw -66.196.40.160 - 66.196.42.95 ca -66.196.42.96 - 66.196.42.127 us -66.196.42.128 - 66.196.47.255 ca -66.196.48.0 - 66.197.255.255 us -66.198.0.0 - 66.198.31.255 ca -66.198.32.0 - 66.198.32.255 us -66.198.33.0 - 66.198.33.23 ca -66.198.33.24 - 66.198.33.31 us -66.198.33.32 - 66.198.33.255 ca -66.198.34.0 - 66.198.34.7 pg -66.198.34.8 - 66.198.34.15 us -66.198.34.16 - 66.198.34.23 ca -66.198.34.24 - 66.198.34.31 us -66.198.34.32 - 66.198.34.47 za -66.198.34.48 - 66.198.34.63 us -66.198.34.64 - 66.198.35.31 ca -66.198.35.32 - 66.198.35.39 ar -66.198.35.40 - 66.198.35.47 us -66.198.35.48 - 66.198.35.63 za -66.198.35.64 - 66.198.35.255 ca -66.198.36.0 - 66.198.38.255 us +66.187.128.0 - 66.187.235.255 us +66.187.236.0 - 66.187.236.255 br +66.187.237.0 - 66.187.238.255 us +66.187.239.0 - 66.187.239.255 au +66.188.0.0 - 66.196.31.255 us +66.196.32.0 - 66.196.47.255 ca +66.196.48.0 - 66.196.70.255 us +66.196.71.0 - 66.196.71.255 gb +66.196.72.0 - 66.198.9.255 us +66.198.10.0 - 66.198.10.47 ca +66.198.10.48 - 66.198.38.255 us 66.198.39.0 - 66.198.39.255 sy 66.198.40.0 - 66.198.40.255 us 66.198.41.0 - 66.198.41.255 sy -66.198.42.0 - 66.198.42.255 us -66.198.43.0 - 66.198.43.255 ca +66.198.42.0 - 66.198.43.255 us 66.198.44.0 - 66.198.47.255 ec 66.198.48.0 - 66.198.55.255 ca -66.198.56.0 - 66.198.64.255 us -66.198.65.0 - 66.198.69.255 ca -66.198.70.0 - 66.198.70.255 us -66.198.71.0 - 66.198.80.255 ca -66.198.81.0 - 66.198.82.255 us -66.198.83.0 - 66.198.103.255 ca -66.198.104.0 - 66.198.104.255 pk -66.198.105.0 - 66.198.105.255 us -66.198.106.0 - 66.198.110.255 pk -66.198.111.0 - 66.198.111.255 us -66.198.112.0 - 66.198.126.255 ca -66.198.127.0 - 66.198.127.255 us -66.198.128.0 - 66.198.133.255 ca +66.198.56.0 - 66.198.87.255 us +66.198.88.0 - 66.198.96.255 ca +66.198.97.0 - 66.198.133.255 us 66.198.134.0 - 66.198.134.255 ph 66.198.135.0 - 66.198.135.255 us 66.198.136.0 - 66.198.138.255 ec 66.198.139.0 - 66.198.139.255 ph -66.198.140.0 - 66.198.143.255 ca -66.198.144.0 - 66.198.144.255 us -66.198.145.0 - 66.198.145.255 ca -66.198.146.0 - 66.198.146.255 us +66.198.140.0 - 66.198.146.255 us 66.198.147.0 - 66.198.149.255 ph -66.198.150.0 - 66.198.153.255 ca -66.198.154.0 - 66.198.154.255 us -66.198.155.0 - 66.198.156.127 ph -66.198.156.128 - 66.198.156.255 ca +66.198.150.0 - 66.198.156.255 us 66.198.157.0 - 66.198.157.255 ph -66.198.158.0 - 66.198.159.255 ca -66.198.160.0 - 66.198.160.255 us -66.198.161.0 - 66.198.166.255 ca -66.198.167.0 - 66.198.167.255 us -66.198.168.0 - 66.198.191.255 ca -66.198.192.0 - 66.199.31.255 us -66.199.32.0 - 66.199.35.159 ca -66.199.35.160 - 66.199.35.175 us -66.199.35.176 - 66.199.35.255 ca -66.199.36.0 - 66.199.36.255 us -66.199.37.0 - 66.199.37.135 ca -66.199.37.136 - 66.199.37.143 us -66.199.37.144 - 66.199.37.199 ca -66.199.37.200 - 66.199.37.215 us -66.199.37.216 - 66.199.47.255 ca +66.198.158.0 - 66.198.167.255 us +66.198.168.0 - 66.198.175.255 sg +66.198.176.0 - 66.199.31.255 us +66.199.32.0 - 66.199.47.255 ca 66.199.48.0 - 66.199.127.255 us 66.199.128.0 - 66.199.129.255 ca -66.199.130.0 - 66.199.130.255 us -66.199.131.0 - 66.199.131.55 ca -66.199.131.56 - 66.199.131.63 us -66.199.131.64 - 66.199.131.191 ca -66.199.131.192 - 66.199.131.195 us -66.199.131.196 - 66.199.131.255 ca -66.199.132.0 - 66.199.133.95 us -66.199.133.96 - 66.199.133.111 ca -66.199.133.112 - 66.199.133.255 us +66.199.130.0 - 66.199.131.111 us +66.199.131.112 - 66.199.131.127 ca +66.199.131.128 - 66.199.133.255 us 66.199.134.0 - 66.199.134.255 ca -66.199.135.0 - 66.199.135.255 us -66.199.136.0 - 66.199.138.175 ca -66.199.138.176 - 66.199.138.255 us -66.199.139.0 - 66.199.141.31 ca -66.199.141.32 - 66.199.141.47 us -66.199.141.48 - 66.199.141.255 ca -66.199.142.0 - 66.199.142.31 us -66.199.142.32 - 66.199.142.127 ca -66.199.142.128 - 66.199.142.143 us -66.199.142.144 - 66.199.142.207 ca -66.199.142.208 - 66.199.142.215 us -66.199.142.216 - 66.199.142.239 ca -66.199.142.240 - 66.199.143.255 us -66.199.144.0 - 66.199.145.203 ca -66.199.145.204 - 66.199.145.223 us -66.199.145.224 - 66.199.146.127 ca -66.199.146.128 - 66.199.146.255 us -66.199.147.0 - 66.199.149.31 ca -66.199.149.32 - 66.199.149.63 us -66.199.149.64 - 66.199.149.159 ca -66.199.149.160 - 66.199.149.175 us -66.199.149.176 - 66.199.149.191 mx -66.199.149.192 - 66.199.149.223 ca -66.199.149.224 - 66.199.149.239 us -66.199.149.240 - 66.199.150.7 ca -66.199.150.8 - 66.199.150.63 us -66.199.150.64 - 66.199.150.127 ca -66.199.150.128 - 66.199.150.135 us -66.199.150.136 - 66.199.150.174 ca +66.199.135.0 - 66.199.136.255 us +66.199.137.0 - 66.199.137.255 ca +66.199.138.0 - 66.199.138.255 us +66.199.139.0 - 66.199.140.255 ca +66.199.141.0 - 66.199.142.247 us +66.199.142.248 - 66.199.142.251 ca +66.199.142.252 - 66.199.143.255 us +66.199.144.0 - 66.199.144.255 ca +66.199.145.0 - 66.199.146.255 us +66.199.147.0 - 66.199.148.255 ca +66.199.149.0 - 66.199.149.239 us +66.199.149.240 - 66.199.149.255 ca +66.199.150.0 - 66.199.150.159 us +66.199.150.160 - 66.199.150.174 ca 66.199.150.175 - 66.199.150.239 us -66.199.150.240 - 66.199.151.71 ca -66.199.151.72 - 66.199.151.95 us -66.199.151.96 - 66.199.151.103 mx -66.199.151.104 - 66.199.151.111 ca -66.199.151.112 - 66.199.151.191 us -66.199.151.192 - 66.199.151.239 ca -66.199.151.240 - 66.199.151.255 us -66.199.152.0 - 66.199.153.79 ca -66.199.153.80 - 66.199.153.111 us -66.199.153.112 - 66.199.153.127 ca -66.199.153.128 - 66.199.153.159 us -66.199.153.160 - 66.199.155.191 ca -66.199.155.192 - 66.199.155.223 us -66.199.155.224 - 66.199.157.255 ca +66.199.150.240 - 66.199.150.255 ca +66.199.151.0 - 66.199.151.255 us +66.199.152.0 - 66.199.152.255 ca +66.199.153.0 - 66.199.153.255 us +66.199.154.0 - 66.199.154.255 ca +66.199.155.0 - 66.199.155.255 us +66.199.156.0 - 66.199.157.255 ca 66.199.158.0 - 66.199.158.255 us -66.199.159.0 - 66.199.160.39 ca -66.199.160.40 - 66.199.160.47 us -66.199.160.48 - 66.199.160.159 ca -66.199.160.160 - 66.199.160.191 pa -66.199.160.192 - 66.199.161.31 ca -66.199.161.32 - 66.199.161.47 us -66.199.161.48 - 66.199.164.123 ca -66.199.164.124 - 66.199.164.127 us -66.199.164.128 - 66.199.164.191 ca -66.199.164.192 - 66.199.164.223 us -66.199.164.224 - 66.199.164.227 ca -66.199.164.228 - 66.199.165.63 us -66.199.165.64 - 66.199.165.79 ca -66.199.165.80 - 66.199.165.103 us -66.199.165.104 - 66.199.165.111 ca -66.199.165.112 - 66.199.165.255 us -66.199.166.0 - 66.199.166.15 vg -66.199.166.16 - 66.199.166.31 ca -66.199.166.32 - 66.199.166.63 us -66.199.166.64 - 66.199.166.223 ca -66.199.166.224 - 66.199.166.239 us -66.199.166.240 - 66.199.166.243 ca -66.199.166.244 - 66.199.166.247 us -66.199.166.248 - 66.199.168.127 ca -66.199.168.128 - 66.199.168.143 us -66.199.168.144 - 66.199.168.159 pa -66.199.168.160 - 66.199.168.167 us -66.199.168.168 - 66.199.168.175 ca -66.199.168.176 - 66.199.168.191 us -66.199.168.192 - 66.199.173.23 ca -66.199.173.24 - 66.199.173.31 us -66.199.173.32 - 66.199.173.63 ca -66.199.173.64 - 66.199.173.159 us -66.199.173.160 - 66.199.173.223 ca -66.199.173.224 - 66.199.173.255 us +66.199.159.0 - 66.199.159.255 ca +66.199.160.0 - 66.199.161.63 us +66.199.161.64 - 66.199.161.127 ca +66.199.161.128 - 66.199.161.159 us +66.199.161.160 - 66.199.161.175 ca +66.199.161.176 - 66.199.161.255 us +66.199.162.0 - 66.199.163.255 ca +66.199.164.0 - 66.199.166.37 us +66.199.166.38 - 66.199.166.38 ca +66.199.166.39 - 66.199.166.255 us +66.199.167.0 - 66.199.168.63 ca +66.199.168.64 - 66.199.168.159 us +66.199.168.160 - 66.199.168.167 ca +66.199.168.168 - 66.199.168.255 us +66.199.169.0 - 66.199.172.255 ca +66.199.173.0 - 66.199.173.231 us +66.199.173.232 - 66.199.173.239 ca +66.199.173.240 - 66.199.173.255 us 66.199.174.0 - 66.199.175.255 ca -66.199.176.0 - 66.199.177.31 us -66.199.177.32 - 66.199.177.95 ca -66.199.177.96 - 66.199.177.111 us -66.199.177.112 - 66.199.177.135 ca -66.199.177.136 - 66.199.177.191 us -66.199.177.192 - 66.199.177.207 ca -66.199.177.208 - 66.199.179.31 us -66.199.179.32 - 66.199.179.63 ca -66.199.179.64 - 66.199.179.95 us -66.199.179.96 - 66.199.179.207 ca -66.199.179.208 - 66.199.179.255 us -66.199.180.0 - 66.199.180.95 ca -66.199.180.96 - 66.199.180.127 us -66.199.180.128 - 66.199.183.255 ca -66.199.184.0 - 66.199.184.111 us -66.199.184.112 - 66.199.184.119 ca -66.199.184.120 - 66.199.184.127 us -66.199.184.128 - 66.199.184.159 gb -66.199.184.160 - 66.199.185.255 ca +66.199.176.0 - 66.199.184.255 us +66.199.185.0 - 66.199.185.255 ca 66.199.186.0 - 66.199.189.255 us -66.199.190.0 - 66.199.190.255 ca -66.199.191.0 - 66.201.64.127 us -66.201.64.128 - 66.201.64.255 in -66.201.65.0 - 66.201.66.191 us -66.201.66.192 - 66.201.66.255 in -66.201.67.0 - 66.201.67.255 us -66.201.68.0 - 66.201.69.255 ca -66.201.70.0 - 66.201.70.127 us -66.201.70.128 - 66.201.70.191 in -66.201.70.192 - 66.201.70.255 ca -66.201.71.0 - 66.201.71.31 us -66.201.71.32 - 66.201.71.63 ca -66.201.71.64 - 66.201.71.191 us -66.201.71.192 - 66.201.71.223 ca -66.201.71.224 - 66.201.71.255 be +66.199.190.0 - 66.199.191.255 ca +66.199.192.0 - 66.201.68.255 us +66.201.69.0 - 66.201.69.255 ca +66.201.70.0 - 66.201.71.255 us 66.201.72.0 - 66.201.72.255 ca -66.201.73.0 - 66.201.73.255 us -66.201.74.0 - 66.201.76.255 ca -66.201.77.0 - 66.201.77.63 us -66.201.77.64 - 66.201.77.95 ve -66.201.77.96 - 66.201.77.127 il -66.201.77.128 - 66.201.77.159 ca -66.201.77.160 - 66.201.77.191 be -66.201.77.192 - 66.201.77.223 kn -66.201.77.224 - 66.201.78.255 us -66.201.79.0 - 66.201.79.127 ca -66.201.79.128 - 66.201.79.255 us +66.201.73.0 - 66.201.79.255 us 66.201.80.0 - 66.201.80.255 ca -66.201.81.0 - 66.201.81.255 us -66.201.82.0 - 66.201.84.255 ca -66.201.85.0 - 66.201.85.31 gb -66.201.85.32 - 66.201.85.255 us -66.201.86.0 - 66.201.88.255 ca -66.201.89.0 - 66.201.91.127 us -66.201.91.128 - 66.201.91.255 fr +66.201.81.0 - 66.201.87.255 us +66.201.88.0 - 66.201.88.255 ca +66.201.89.0 - 66.201.91.255 us 66.201.92.0 - 66.201.93.255 ca -66.201.94.0 - 66.201.94.31 in -66.201.94.32 - 66.201.94.127 us -66.201.94.128 - 66.201.94.159 ca -66.201.94.160 - 66.201.94.191 be -66.201.94.192 - 66.201.94.255 us -66.201.95.0 - 66.201.95.255 ca -66.201.96.0 - 66.201.96.255 us +66.201.94.0 - 66.201.96.255 us 66.201.97.0 - 66.201.97.255 ca 66.201.98.0 - 66.201.98.255 us 66.201.99.0 - 66.201.99.255 ca -66.201.100.0 - 66.201.100.255 us -66.201.101.0 - 66.201.101.63 in -66.201.101.64 - 66.201.101.127 us -66.201.101.128 - 66.201.101.191 ca -66.201.101.192 - 66.201.101.255 us -66.201.102.0 - 66.201.102.63 in -66.201.102.64 - 66.201.104.127 us -66.201.104.128 - 66.201.104.255 sg -66.201.105.0 - 66.201.106.95 us -66.201.106.96 - 66.201.106.127 be -66.201.106.128 - 66.201.106.159 ca -66.201.106.160 - 66.201.107.1 us -66.201.107.2 - 66.201.107.254 ca -66.201.107.255 - 66.201.107.255 us -66.201.108.0 - 66.201.109.255 ca -66.201.110.0 - 66.201.110.31 be -66.201.110.32 - 66.201.110.63 us -66.201.110.64 - 66.201.110.95 be -66.201.110.96 - 66.201.110.159 us -66.201.110.160 - 66.201.110.191 in -66.201.110.192 - 66.201.110.223 us -66.201.110.224 - 66.201.111.255 ca -66.201.112.0 - 66.201.112.127 us -66.201.112.128 - 66.201.112.255 au -66.201.113.0 - 66.201.113.63 us -66.201.113.64 - 66.201.113.93 be -66.201.113.94 - 66.201.113.223 us -66.201.113.224 - 66.201.114.127 ca -66.201.114.128 - 66.201.116.255 us +66.201.100.0 - 66.201.107.255 us +66.201.108.0 - 66.201.108.255 ca +66.201.109.0 - 66.201.110.255 us +66.201.111.0 - 66.201.111.255 ca +66.201.112.0 - 66.201.116.255 us 66.201.117.0 - 66.201.117.255 ca -66.201.118.0 - 66.201.119.127 us -66.201.119.128 - 66.201.119.159 fr -66.201.119.160 - 66.201.119.191 in -66.201.119.192 - 66.201.123.159 us -66.201.123.160 - 66.201.123.191 be -66.201.123.192 - 66.201.125.255 us +66.201.118.0 - 66.201.125.255 us 66.201.126.0 - 66.201.126.255 ca 66.201.127.0 - 66.201.159.255 us 66.201.160.0 - 66.201.183.255 sv -66.201.184.0 - 66.201.188.255 us +66.201.184.0 - 66.201.187.255 us +66.201.188.0 - 66.201.188.255 cn 66.201.189.0 - 66.201.189.255 ar 66.201.190.0 - 66.201.190.255 us 66.201.191.0 - 66.201.191.255 cl 66.201.192.0 - 66.201.255.255 ca -66.202.0.0 - 66.202.133.63 us -66.202.133.64 - 66.202.133.95 ca -66.202.133.96 - 66.202.158.191 us -66.202.158.192 - 66.202.158.223 ca -66.202.158.224 - 66.203.159.255 us +66.202.0.0 - 66.203.159.255 us 66.203.160.0 - 66.203.223.255 ca -66.203.224.0 - 66.205.16.255 us -66.205.17.0 - 66.205.17.255 bb -66.205.18.0 - 66.205.19.207 us -66.205.19.208 - 66.205.19.223 py -66.205.19.224 - 66.205.22.223 us -66.205.22.224 - 66.205.22.239 kn -66.205.22.240 - 66.205.22.255 us +66.203.224.0 - 66.205.22.255 us 66.205.23.0 - 66.205.23.255 bs -66.205.24.0 - 66.205.34.111 us -66.205.34.112 - 66.205.34.143 mx -66.205.34.144 - 66.205.34.151 us -66.205.34.152 - 66.205.34.239 mx -66.205.34.240 - 66.205.34.255 us -66.205.35.0 - 66.205.35.255 mx +66.205.24.0 - 66.205.35.255 us 66.205.36.0 - 66.205.39.255 tt 66.205.40.0 - 66.205.40.255 us 66.205.41.0 - 66.205.41.255 mx @@ -23861,629 +16081,51 @@ 66.205.48.0 - 66.205.48.255 kn 66.205.49.0 - 66.205.51.255 us 66.205.52.0 - 66.205.52.255 kn -66.205.53.0 - 66.206.115.255 us -66.206.116.0 - 66.206.116.255 ca -66.206.117.0 - 66.206.194.95 us -66.206.194.96 - 66.206.194.127 ca -66.206.194.128 - 66.206.223.255 us +66.205.53.0 - 66.206.223.255 us 66.206.224.0 - 66.206.255.255 ca -66.207.0.0 - 66.207.31.255 us -66.207.48.0 - 66.207.48.7 a2 -66.207.48.8 - 66.207.48.15 us -66.207.48.16 - 66.207.48.23 a2 -66.207.48.24 - 66.207.48.47 us -66.207.48.48 - 66.207.48.67 a2 -66.207.48.68 - 66.207.48.79 us -66.207.48.80 - 66.207.48.91 a2 -66.207.48.92 - 66.207.48.95 us -66.207.48.96 - 66.207.48.135 a2 -66.207.48.136 - 66.207.48.143 us -66.207.48.144 - 66.207.48.155 a2 -66.207.48.156 - 66.207.48.207 us -66.207.48.208 - 66.207.48.223 ca -66.207.48.224 - 66.207.48.231 a2 -66.207.48.232 - 66.207.49.11 us -66.207.49.12 - 66.207.49.15 a2 -66.207.49.16 - 66.207.49.23 us -66.207.49.24 - 66.207.49.27 a2 -66.207.49.28 - 66.207.49.63 us -66.207.49.64 - 66.207.49.79 a2 -66.207.49.80 - 66.207.49.87 us -66.207.49.88 - 66.207.49.95 a2 -66.207.49.96 - 66.207.49.127 us -66.207.49.128 - 66.207.49.135 a2 -66.207.49.136 - 66.207.49.143 us -66.207.49.144 - 66.207.49.159 a2 -66.207.49.160 - 66.207.49.183 us -66.207.49.184 - 66.207.49.191 a2 -66.207.49.192 - 66.207.49.207 ca -66.207.49.208 - 66.207.49.227 us -66.207.49.228 - 66.207.49.231 a2 -66.207.49.232 - 66.207.54.255 us -66.207.55.0 - 66.207.55.255 a2 -66.207.56.0 - 66.207.56.23 jo -66.207.56.24 - 66.207.56.31 a2 -66.207.56.32 - 66.207.56.47 jo -66.207.56.48 - 66.207.56.55 a2 -66.207.56.56 - 66.207.56.63 jo -66.207.56.64 - 66.207.56.71 a2 -66.207.56.72 - 66.207.56.79 us -66.207.56.80 - 66.207.56.111 a2 -66.207.56.112 - 66.207.56.127 us -66.207.56.128 - 66.207.56.255 a2 -66.207.57.0 - 66.207.63.23 us -66.207.63.24 - 66.207.63.255 a2 +66.207.0.0 - 66.207.48.255 us +66.207.49.0 - 66.207.49.255 a2 +66.207.50.0 - 66.207.50.255 as +66.207.51.0 - 66.207.53.255 us +66.207.54.0 - 66.207.57.255 a2 +66.207.58.0 - 66.207.59.255 us +66.207.60.0 - 66.207.60.255 a2 +66.207.61.0 - 66.207.62.255 us +66.207.63.0 - 66.207.63.255 a2 66.207.64.0 - 66.207.95.255 us -66.207.96.0 - 66.207.101.63 ca -66.207.101.64 - 66.207.101.95 us -66.207.101.96 - 66.207.127.255 ca +66.207.96.0 - 66.207.127.255 ca 66.207.128.0 - 66.207.191.255 us -66.207.192.0 - 66.207.203.239 ca -66.207.203.240 - 66.207.203.255 at -66.207.204.0 - 66.207.220.95 ca -66.207.220.96 - 66.207.220.111 na -66.207.220.112 - 66.207.223.255 ca +66.207.192.0 - 66.207.223.255 ca 66.207.224.0 - 66.209.47.255 us 66.209.48.0 - 66.209.63.255 ca 66.209.64.0 - 66.209.175.255 us 66.209.176.0 - 66.209.191.255 ca 66.209.192.0 - 66.212.159.255 us -66.212.160.0 - 66.212.164.247 ca -66.212.164.248 - 66.212.164.255 us -66.212.165.0 - 66.212.169.127 ca -66.212.169.128 - 66.212.169.159 de -66.212.169.160 - 66.212.170.47 ca -66.212.170.48 - 66.212.170.55 us -66.212.170.56 - 66.212.170.63 de -66.212.170.64 - 66.212.170.167 ca -66.212.170.168 - 66.212.170.175 us -66.212.170.176 - 66.212.170.191 de -66.212.170.192 - 66.212.191.255 ca +66.212.160.0 - 66.212.191.255 ca 66.212.192.0 - 66.212.223.255 us -66.212.224.0 - 66.212.224.7 ca -66.212.224.8 - 66.212.224.23 ag -66.212.224.24 - 66.212.224.31 ca -66.212.224.32 - 66.212.224.39 cr -66.212.224.40 - 66.212.224.47 ca -66.212.224.48 - 66.212.224.55 gi -66.212.224.56 - 66.212.224.63 cy -66.212.224.64 - 66.212.224.255 ca -66.212.225.0 - 66.212.225.7 vg -66.212.225.8 - 66.212.225.15 ca -66.212.225.16 - 66.212.225.23 aw -66.212.225.24 - 66.212.225.31 vg -66.212.225.32 - 66.212.225.39 bz -66.212.225.40 - 66.212.225.47 ca -66.212.225.48 - 66.212.225.55 bz -66.212.225.56 - 66.212.225.63 ca -66.212.225.64 - 66.212.225.71 vg -66.212.225.72 - 66.212.225.79 ca -66.212.225.80 - 66.212.225.95 mt -66.212.225.96 - 66.212.225.103 cy -66.212.225.104 - 66.212.225.127 ca -66.212.225.128 - 66.212.225.143 bz -66.212.225.144 - 66.212.225.151 aw -66.212.225.152 - 66.212.225.159 vg -66.212.225.160 - 66.212.225.175 us -66.212.225.176 - 66.212.225.207 bz -66.212.225.208 - 66.212.225.223 ca -66.212.225.224 - 66.212.225.231 an -66.212.225.232 - 66.212.225.255 ca -66.212.226.0 - 66.212.226.31 bz -66.212.226.32 - 66.212.226.79 ca -66.212.226.80 - 66.212.226.111 ag -66.212.226.112 - 66.212.226.223 ca -66.212.226.224 - 66.212.226.255 cr -66.212.227.0 - 66.212.227.7 ag -66.212.227.8 - 66.212.227.15 bz -66.212.227.16 - 66.212.227.39 ca -66.212.227.40 - 66.212.227.55 ag -66.212.227.56 - 66.212.227.63 aw -66.212.227.64 - 66.212.227.79 ag -66.212.227.80 - 66.212.227.95 ca -66.212.227.96 - 66.212.227.111 ag -66.212.227.112 - 66.212.227.127 an -66.212.227.128 - 66.212.227.135 mt -66.212.227.136 - 66.212.227.159 ca -66.212.227.160 - 66.212.227.255 ag -66.212.228.0 - 66.212.228.31 ca -66.212.228.32 - 66.212.228.47 bz -66.212.228.48 - 66.212.228.55 kn -66.212.228.56 - 66.212.228.63 mt -66.212.228.64 - 66.212.228.79 ca -66.212.228.80 - 66.212.228.87 vg -66.212.228.88 - 66.212.228.95 bz -66.212.228.96 - 66.212.228.111 mt -66.212.228.112 - 66.212.228.127 ca -66.212.228.128 - 66.212.228.143 vg -66.212.228.144 - 66.212.228.151 ca -66.212.228.152 - 66.212.228.175 gb -66.212.228.176 - 66.212.228.191 ca -66.212.228.192 - 66.212.228.239 bz -66.212.228.240 - 66.212.230.15 ca -66.212.230.16 - 66.212.230.31 vg -66.212.230.32 - 66.212.230.95 ca -66.212.230.96 - 66.212.230.111 vg -66.212.230.112 - 66.212.230.143 ca -66.212.230.144 - 66.212.230.151 bz -66.212.230.152 - 66.212.230.191 vg -66.212.230.192 - 66.212.230.215 ca -66.212.230.216 - 66.212.230.223 mt -66.212.230.224 - 66.212.230.255 vg -66.212.231.0 - 66.212.231.255 ca -66.212.232.0 - 66.212.232.63 mt -66.212.232.64 - 66.212.232.95 ca -66.212.232.96 - 66.212.232.103 vg -66.212.232.104 - 66.212.232.127 ca -66.212.232.128 - 66.212.232.159 ag -66.212.232.160 - 66.212.232.255 ca -66.212.233.0 - 66.212.233.7 bz -66.212.233.8 - 66.212.233.15 ag -66.212.233.16 - 66.212.233.63 ca -66.212.233.64 - 66.212.233.79 aw -66.212.233.80 - 66.212.233.95 vg -66.212.233.96 - 66.212.233.207 ca -66.212.233.208 - 66.212.233.215 cr -66.212.233.216 - 66.212.233.223 ca -66.212.233.224 - 66.212.233.239 bz -66.212.233.240 - 66.212.233.255 ca -66.212.234.0 - 66.212.234.255 ag -66.212.235.0 - 66.212.235.31 cr -66.212.235.32 - 66.212.235.47 ag -66.212.235.48 - 66.212.235.63 ca -66.212.235.64 - 66.212.235.79 cr -66.212.235.80 - 66.212.235.95 ca -66.212.235.96 - 66.212.235.127 gb -66.212.235.128 - 66.212.235.135 aw -66.212.235.136 - 66.212.235.159 bz -66.212.235.160 - 66.212.235.191 ca -66.212.235.192 - 66.212.235.255 gb +66.212.224.0 - 66.212.235.255 ca 66.212.236.0 - 66.212.237.255 bz -66.212.238.0 - 66.212.238.15 ag -66.212.238.16 - 66.212.238.23 bz -66.212.238.24 - 66.212.238.63 ag -66.212.238.64 - 66.212.238.111 vg -66.212.238.112 - 66.212.238.119 ca -66.212.238.120 - 66.212.238.191 bz -66.212.238.192 - 66.212.238.199 vg -66.212.238.200 - 66.212.238.223 ca -66.212.238.224 - 66.212.238.231 cr -66.212.238.232 - 66.212.238.239 aw -66.212.238.240 - 66.212.238.255 ca -66.212.239.0 - 66.212.239.7 gb -66.212.239.8 - 66.212.239.15 ca -66.212.239.16 - 66.212.239.23 cy -66.212.239.24 - 66.212.239.31 ca -66.212.239.32 - 66.212.239.47 bz -66.212.239.48 - 66.212.239.63 ca -66.212.239.64 - 66.212.239.95 ag -66.212.239.96 - 66.212.239.127 vg -66.212.239.128 - 66.212.239.191 aw -66.212.239.192 - 66.212.239.207 ca -66.212.239.208 - 66.212.239.215 bz -66.212.239.216 - 66.212.239.239 im -66.212.239.240 - 66.212.239.255 bz -66.212.240.0 - 66.212.240.255 ca -66.212.241.0 - 66.212.241.7 bz -66.212.241.8 - 66.212.241.15 mt -66.212.241.16 - 66.212.241.23 ca -66.212.241.24 - 66.212.241.31 bz -66.212.241.32 - 66.212.241.63 nl -66.212.241.64 - 66.212.241.71 bz -66.212.241.72 - 66.212.241.79 ca -66.212.241.80 - 66.212.241.87 mt -66.212.241.88 - 66.212.241.95 ca -66.212.241.96 - 66.212.241.103 ag -66.212.241.104 - 66.212.241.207 bz -66.212.241.208 - 66.212.241.223 vg -66.212.241.224 - 66.212.241.247 ca -66.212.241.248 - 66.212.241.255 vg -66.212.242.0 - 66.212.242.7 bz -66.212.242.8 - 66.212.242.15 pa -66.212.242.16 - 66.212.242.23 an -66.212.242.24 - 66.212.242.31 bz -66.212.242.32 - 66.212.242.47 vg -66.212.242.48 - 66.212.242.55 cy -66.212.242.56 - 66.212.242.63 ca -66.212.242.64 - 66.212.242.95 ag -66.212.242.96 - 66.212.242.103 cy -66.212.242.104 - 66.212.242.111 mt -66.212.242.112 - 66.212.242.127 gb -66.212.242.128 - 66.212.242.143 mt -66.212.242.144 - 66.212.242.151 ca -66.212.242.152 - 66.212.242.159 ag -66.212.242.160 - 66.212.242.223 ca -66.212.242.224 - 66.212.244.7 ag -66.212.244.8 - 66.212.244.15 za -66.212.244.16 - 66.212.244.23 gg -66.212.244.24 - 66.212.244.31 mt -66.212.244.32 - 66.212.244.39 cr -66.212.244.40 - 66.212.244.47 gg -66.212.244.48 - 66.212.244.63 mt -66.212.244.64 - 66.212.244.127 gi -66.212.244.128 - 66.212.244.255 cr -66.212.245.0 - 66.212.245.63 aw -66.212.245.64 - 66.212.245.127 bz -66.212.245.128 - 66.212.245.255 ca +66.212.238.0 - 66.212.245.255 ca 66.212.246.0 - 66.212.246.255 bz 66.212.247.0 - 66.212.249.255 ca 66.212.250.0 - 66.212.250.255 bz -66.212.251.0 - 66.212.251.7 ca -66.212.251.8 - 66.212.251.15 ag -66.212.251.16 - 66.212.251.23 gi -66.212.251.24 - 66.212.251.47 ca -66.212.251.48 - 66.212.251.55 cr -66.212.251.56 - 66.212.251.63 aw -66.212.251.64 - 66.212.251.71 gi -66.212.251.72 - 66.212.251.79 ca -66.212.251.80 - 66.212.251.87 bz -66.212.251.88 - 66.212.251.111 cr -66.212.251.112 - 66.212.251.127 ag -66.212.251.128 - 66.212.255.255 ca -66.213.0.0 - 66.216.64.47 us -66.216.64.48 - 66.216.64.63 ar -66.216.64.64 - 66.216.64.79 us -66.216.64.80 - 66.216.64.95 pk -66.216.64.96 - 66.216.64.103 au -66.216.64.104 - 66.216.64.111 in -66.216.64.112 - 66.216.64.135 us -66.216.64.136 - 66.216.64.143 ca -66.216.64.144 - 66.216.64.151 us -66.216.64.152 - 66.216.64.159 au -66.216.64.160 - 66.216.64.175 us -66.216.64.176 - 66.216.64.184 au -66.216.64.185 - 66.216.65.239 us -66.216.65.240 - 66.216.65.255 gb -66.216.66.0 - 66.216.66.39 us -66.216.66.40 - 66.216.66.47 ca -66.216.66.48 - 66.216.66.247 us -66.216.66.248 - 66.216.66.255 ca -66.216.67.0 - 66.216.67.183 us -66.216.67.184 - 66.216.67.191 ca -66.216.67.192 - 66.216.69.143 us -66.216.69.144 - 66.216.69.151 au -66.216.69.152 - 66.216.69.175 us -66.216.69.176 - 66.216.69.183 se -66.216.69.184 - 66.216.69.199 us -66.216.69.200 - 66.216.69.207 gb -66.216.69.208 - 66.216.69.215 us -66.216.69.216 - 66.216.69.223 ph -66.216.69.224 - 66.216.70.63 us -66.216.70.64 - 66.216.70.95 au -66.216.70.96 - 66.216.70.223 us -66.216.70.224 - 66.216.70.239 ca -66.216.70.240 - 66.216.71.7 us -66.216.71.8 - 66.216.71.15 ca -66.216.71.16 - 66.216.71.55 us -66.216.71.56 - 66.216.71.63 ca -66.216.71.64 - 66.216.71.103 us -66.216.71.104 - 66.216.71.111 il -66.216.71.112 - 66.216.71.215 us -66.216.71.216 - 66.216.71.255 nl -66.216.72.0 - 66.216.72.87 us -66.216.72.88 - 66.216.72.95 lb -66.216.72.96 - 66.216.72.119 us -66.216.72.120 - 66.216.72.127 au -66.216.72.128 - 66.216.72.239 us -66.216.72.240 - 66.216.72.247 vu -66.216.72.248 - 66.216.73.7 us -66.216.73.8 - 66.216.73.23 ca -66.216.73.24 - 66.216.73.39 us -66.216.73.40 - 66.216.73.47 fr -66.216.73.48 - 66.216.73.95 us -66.216.73.96 - 66.216.73.111 au -66.216.73.112 - 66.216.73.127 us -66.216.73.128 - 66.216.73.143 au -66.216.73.144 - 66.216.73.151 us -66.216.73.152 - 66.216.73.159 au -66.216.73.160 - 66.216.74.87 us -66.216.74.88 - 66.216.74.95 au -66.216.74.96 - 66.216.74.111 us -66.216.74.112 - 66.216.74.119 au -66.216.74.120 - 66.216.74.151 us -66.216.74.152 - 66.216.74.159 au -66.216.74.160 - 66.216.74.175 us -66.216.74.176 - 66.216.74.183 ch -66.216.74.184 - 66.216.74.191 us -66.216.74.192 - 66.216.74.199 ca -66.216.74.200 - 66.216.75.47 us -66.216.75.48 - 66.216.75.63 gb -66.216.75.64 - 66.216.75.143 us -66.216.75.144 - 66.216.75.159 dk -66.216.75.160 - 66.216.75.239 us -66.216.75.240 - 66.216.75.255 ca -66.216.76.0 - 66.216.76.15 my -66.216.76.16 - 66.216.76.23 us -66.216.76.24 - 66.216.76.31 br -66.216.76.32 - 66.216.76.39 us -66.216.76.40 - 66.216.76.47 ec -66.216.76.48 - 66.216.76.71 us -66.216.76.72 - 66.216.76.87 ca -66.216.76.88 - 66.216.76.103 us -66.216.76.104 - 66.216.76.111 ca -66.216.76.112 - 66.216.76.135 us -66.216.76.136 - 66.216.76.143 ca -66.216.76.144 - 66.216.76.167 us -66.216.76.168 - 66.216.76.175 ca -66.216.76.176 - 66.216.76.183 ar -66.216.76.184 - 66.216.76.215 us -66.216.76.216 - 66.216.76.223 jp -66.216.76.224 - 66.216.76.231 ua -66.216.76.232 - 66.216.76.239 it -66.216.76.240 - 66.216.77.191 us -66.216.77.192 - 66.216.77.199 ca -66.216.77.200 - 66.216.77.207 in -66.216.77.208 - 66.216.77.231 us -66.216.77.232 - 66.216.77.239 ca -66.216.77.240 - 66.216.77.255 us -66.216.78.0 - 66.216.78.7 be -66.216.78.8 - 66.216.78.47 us -66.216.78.48 - 66.216.78.55 my -66.216.78.56 - 66.216.79.7 us -66.216.79.8 - 66.216.79.15 lk -66.216.79.16 - 66.216.79.31 us -66.216.79.32 - 66.216.79.47 in -66.216.79.48 - 66.216.79.119 us -66.216.79.120 - 66.216.79.191 au -66.216.79.192 - 66.216.79.207 us -66.216.79.208 - 66.216.79.215 ca -66.216.79.216 - 66.216.79.223 es -66.216.79.224 - 66.216.79.255 us -66.216.80.0 - 66.216.80.7 nz -66.216.80.8 - 66.216.80.23 ca -66.216.80.24 - 66.216.80.47 us -66.216.80.48 - 66.216.80.55 in -66.216.80.56 - 66.216.80.143 us -66.216.80.144 - 66.216.80.151 ua -66.216.80.152 - 66.216.80.215 us -66.216.80.216 - 66.216.80.223 ca -66.216.80.224 - 66.216.80.231 lb -66.216.80.232 - 66.216.80.239 gb -66.216.80.240 - 66.216.81.7 us -66.216.81.8 - 66.216.81.39 ru -66.216.81.40 - 66.216.81.63 us -66.216.81.64 - 66.216.81.71 lb -66.216.81.72 - 66.216.81.79 us -66.216.81.80 - 66.216.81.95 in -66.216.81.96 - 66.216.81.103 us -66.216.81.104 - 66.216.81.111 se -66.216.81.112 - 66.216.81.119 it -66.216.81.120 - 66.216.81.159 us -66.216.81.160 - 66.216.81.167 gb -66.216.81.168 - 66.216.82.151 us -66.216.82.152 - 66.216.82.159 fr -66.216.82.160 - 66.216.82.175 us -66.216.82.176 - 66.216.82.183 gb -66.216.82.184 - 66.216.82.215 us -66.216.82.216 - 66.216.82.223 es -66.216.82.224 - 66.216.82.255 us -66.216.83.0 - 66.216.83.15 au -66.216.83.16 - 66.216.83.23 us -66.216.83.24 - 66.216.83.31 au -66.216.83.32 - 66.216.83.47 us -66.216.83.48 - 66.216.83.55 ag -66.216.83.56 - 66.216.83.159 us -66.216.83.160 - 66.216.83.191 au -66.216.83.192 - 66.216.83.199 us -66.216.83.200 - 66.216.83.207 ca -66.216.83.208 - 66.216.84.63 us -66.216.84.64 - 66.216.84.71 gb -66.216.84.72 - 66.216.84.79 ca -66.216.84.80 - 66.216.85.79 us -66.216.85.80 - 66.216.85.95 nl -66.216.85.96 - 66.216.85.215 us -66.216.85.216 - 66.216.85.223 de -66.216.85.224 - 66.216.85.239 us -66.216.85.240 - 66.216.85.247 ag -66.216.85.248 - 66.216.86.15 us -66.216.86.16 - 66.216.86.23 gb -66.216.86.24 - 66.216.86.31 si -66.216.86.32 - 66.216.86.47 us -66.216.86.48 - 66.216.86.63 ca -66.216.86.64 - 66.216.86.103 us -66.216.86.104 - 66.216.86.111 ca -66.216.86.112 - 66.216.86.255 us -66.216.87.0 - 66.216.87.15 ve -66.216.87.16 - 66.216.87.47 us -66.216.87.48 - 66.216.87.55 nz -66.216.87.56 - 66.216.87.63 us -66.216.87.64 - 66.216.87.71 au -66.216.87.72 - 66.216.87.79 us -66.216.87.80 - 66.216.87.111 au -66.216.87.112 - 66.216.87.143 us -66.216.87.144 - 66.216.87.151 au -66.216.87.152 - 66.216.87.207 us -66.216.87.208 - 66.216.87.223 ua -66.216.87.224 - 66.216.87.231 us -66.216.87.232 - 66.216.87.239 gb -66.216.87.240 - 66.216.88.31 us -66.216.88.32 - 66.216.88.47 ca -66.216.88.48 - 66.216.89.111 us -66.216.89.112 - 66.216.89.119 au -66.216.89.120 - 66.216.90.63 us -66.216.90.64 - 66.216.90.79 fr -66.216.90.80 - 66.216.90.127 us -66.216.90.128 - 66.216.90.143 in -66.216.90.144 - 66.216.90.223 us -66.216.90.224 - 66.216.90.255 bd -66.216.91.0 - 66.216.93.127 us -66.216.93.128 - 66.216.93.191 au -66.216.93.192 - 66.216.94.95 us -66.216.94.96 - 66.216.94.127 bd -66.216.94.128 - 66.216.95.79 us -66.216.95.80 - 66.216.95.87 jp -66.216.95.88 - 66.216.97.63 us -66.216.97.64 - 66.216.97.71 in -66.216.97.72 - 66.216.99.15 us -66.216.99.16 - 66.216.99.23 in -66.216.99.24 - 66.216.99.39 us -66.216.99.40 - 66.216.99.47 nz -66.216.99.48 - 66.216.99.55 us -66.216.99.56 - 66.216.99.63 ie -66.216.99.64 - 66.216.99.71 id -66.216.99.72 - 66.216.99.175 us -66.216.99.176 - 66.216.99.191 ca -66.216.99.192 - 66.216.99.223 us -66.216.99.224 - 66.216.99.231 au -66.216.99.232 - 66.216.101.47 us -66.216.101.48 - 66.216.101.55 ca -66.216.101.56 - 66.216.101.135 us -66.216.101.136 - 66.216.101.143 gb -66.216.101.144 - 66.216.101.191 us -66.216.101.192 - 66.216.101.199 ca -66.216.101.200 - 66.216.101.207 us -66.216.101.208 - 66.216.101.223 ca -66.216.101.224 - 66.216.102.23 us -66.216.102.24 - 66.216.102.31 au -66.216.102.32 - 66.216.102.63 us -66.216.102.64 - 66.216.102.95 gb -66.216.102.96 - 66.216.102.199 us -66.216.102.200 - 66.216.102.223 au -66.216.102.224 - 66.216.103.63 us -66.216.103.64 - 66.216.103.71 gr -66.216.103.72 - 66.216.103.95 us -66.216.103.96 - 66.216.103.103 no -66.216.103.104 - 66.216.103.111 us -66.216.103.112 - 66.216.103.119 ru -66.216.103.120 - 66.216.103.127 ke -66.216.103.128 - 66.216.103.191 us -66.216.103.192 - 66.216.103.255 au -66.216.104.0 - 66.216.104.31 us -66.216.104.32 - 66.216.104.47 nz -66.216.104.48 - 66.216.105.55 us -66.216.105.56 - 66.216.105.63 au -66.216.105.64 - 66.216.105.79 us -66.216.105.80 - 66.216.105.87 in -66.216.105.88 - 66.216.105.111 us -66.216.105.112 - 66.216.105.119 cy -66.216.105.120 - 66.216.105.231 us -66.216.105.232 - 66.216.105.255 eg -66.216.106.0 - 66.216.106.47 us -66.216.106.48 - 66.216.106.63 ca -66.216.106.64 - 66.216.106.127 us -66.216.106.128 - 66.216.106.135 hk -66.216.106.136 - 66.216.106.175 ca -66.216.106.176 - 66.216.106.191 us -66.216.106.192 - 66.216.106.199 nz -66.216.106.200 - 66.216.106.239 us -66.216.106.240 - 66.216.106.247 ca -66.216.106.248 - 66.216.107.255 us -66.216.108.0 - 66.216.108.7 gb -66.216.108.8 - 66.216.108.15 ca -66.216.108.16 - 66.216.108.79 us -66.216.108.80 - 66.216.108.103 au -66.216.108.104 - 66.216.108.151 us -66.216.108.152 - 66.216.108.159 nz -66.216.108.160 - 66.216.108.167 in -66.216.108.168 - 66.216.108.191 us -66.216.108.192 - 66.216.108.207 pk -66.216.108.208 - 66.216.108.239 us -66.216.108.240 - 66.216.108.247 au -66.216.108.248 - 66.216.112.79 us -66.216.112.80 - 66.216.112.87 th -66.216.112.88 - 66.216.112.95 us -66.216.112.96 - 66.216.112.103 ca -66.216.112.104 - 66.216.112.143 us -66.216.112.144 - 66.216.112.151 cy -66.216.112.152 - 66.216.112.199 us -66.216.112.200 - 66.216.112.207 hk -66.216.112.208 - 66.216.112.255 us -66.216.113.0 - 66.216.113.7 au -66.216.113.8 - 66.216.113.31 us -66.216.113.32 - 66.216.113.63 au -66.216.113.64 - 66.216.113.79 us -66.216.113.80 - 66.216.113.87 au -66.216.113.88 - 66.216.113.95 us -66.216.113.96 - 66.216.113.127 au -66.216.113.128 - 66.216.114.23 us -66.216.114.24 - 66.216.114.31 au -66.216.114.32 - 66.216.114.191 us -66.216.114.192 - 66.216.114.199 gb -66.216.114.200 - 66.216.114.223 us -66.216.114.224 - 66.216.114.231 at -66.216.114.232 - 66.216.120.47 us -66.216.120.48 - 66.216.120.55 au -66.216.120.56 - 66.216.123.47 us -66.216.123.48 - 66.216.123.55 pt -66.216.123.56 - 66.216.123.239 us -66.216.123.240 - 66.216.123.255 fr -66.216.124.0 - 66.219.24.79 us -66.219.24.80 - 66.219.24.95 in -66.219.24.96 - 66.219.24.191 us -66.219.24.192 - 66.219.24.207 fr -66.219.24.208 - 66.219.25.191 us -66.219.25.192 - 66.219.25.223 ar -66.219.25.224 - 66.219.26.143 us -66.219.26.144 - 66.219.26.151 in -66.219.26.152 - 66.219.26.159 us -66.219.26.160 - 66.219.26.167 in -66.219.26.168 - 66.219.28.255 us -66.219.29.0 - 66.219.29.31 nz -66.219.29.32 - 66.220.3.31 us -66.220.3.32 - 66.220.3.47 au -66.220.3.48 - 66.220.6.223 us -66.220.6.224 - 66.220.6.231 a1 -66.220.6.232 - 66.220.6.255 us -66.220.7.0 - 66.220.7.127 it -66.220.7.128 - 66.220.12.183 us -66.220.12.184 - 66.220.12.191 jp -66.220.12.192 - 66.220.13.255 us -66.220.14.0 - 66.220.14.255 it -66.220.15.0 - 66.220.29.103 us -66.220.29.104 - 66.220.29.127 cn -66.220.29.128 - 66.222.127.255 us +66.212.251.0 - 66.212.255.255 ca +66.213.0.0 - 66.220.191.255 us +66.220.192.0 - 66.220.207.255 ca +66.220.208.0 - 66.222.127.255 us 66.222.128.0 - 66.222.255.255 ca 66.223.0.0 - 66.225.127.255 us 66.225.128.0 - 66.225.179.255 ca 66.225.180.0 - 66.225.180.255 us 66.225.181.0 - 66.225.191.255 ca -66.225.192.0 - 66.225.198.79 us -66.225.198.80 - 66.225.198.87 ca -66.225.198.88 - 66.225.198.143 us -66.225.198.144 - 66.225.198.151 gb -66.225.198.152 - 66.225.198.255 us +66.225.192.0 - 66.225.198.255 us 66.225.199.0 - 66.225.199.255 ca -66.225.200.0 - 66.225.202.239 us -66.225.202.240 - 66.225.202.247 hk -66.225.202.248 - 66.225.231.135 us -66.225.231.136 - 66.225.231.143 se -66.225.231.144 - 66.225.232.127 us -66.225.232.128 - 66.225.232.135 co -66.225.232.136 - 66.225.232.183 us -66.225.232.184 - 66.225.232.191 sg -66.225.232.192 - 66.225.232.223 us -66.225.232.224 - 66.225.232.231 ve -66.225.232.232 - 66.225.240.175 us -66.225.240.176 - 66.225.240.183 be -66.225.240.184 - 66.226.72.172 us -66.226.72.173 - 66.226.72.180 gb -66.226.72.181 - 66.226.73.159 us -66.226.73.160 - 66.226.73.169 gb -66.226.73.170 - 66.226.75.153 us -66.226.75.154 - 66.226.75.161 ch -66.226.75.162 - 66.226.127.255 us +66.225.200.0 - 66.226.127.255 us 66.226.128.0 - 66.226.159.255 ca -66.226.160.0 - 66.227.25.15 us -66.227.25.16 - 66.227.25.23 ca -66.227.25.24 - 66.227.96.95 us -66.227.96.96 - 66.227.96.103 fr -66.227.96.104 - 66.227.96.119 us -66.227.96.120 - 66.227.96.127 fr -66.227.96.128 - 66.227.96.191 us -66.227.96.192 - 66.227.96.223 gb -66.227.96.224 - 66.227.96.231 us -66.227.96.232 - 66.227.96.255 gb -66.227.97.0 - 66.227.97.7 us -66.227.97.8 - 66.227.97.15 fr -66.227.97.16 - 66.227.97.63 us -66.227.97.64 - 66.227.97.71 gb -66.227.97.72 - 66.227.117.255 us +66.226.160.0 - 66.226.191.255 bs +66.226.192.0 - 66.227.117.255 us 66.227.118.0 - 66.227.118.255 gb -66.227.119.0 - 66.229.66.63 us -66.229.66.64 - 66.229.66.99 pt -66.229.66.100 - 66.230.164.31 us -66.230.164.32 - 66.230.164.63 au -66.230.164.64 - 66.230.166.255 us +66.227.119.0 - 66.230.166.255 us 66.230.167.0 - 66.230.167.255 au 66.230.168.0 - 66.230.174.255 us 66.230.175.0 - 66.230.175.255 au @@ -24491,81 +16133,58 @@ 66.230.183.0 - 66.230.183.255 dm 66.230.184.0 - 66.230.188.255 us 66.230.189.0 - 66.230.189.255 au -66.230.190.0 - 66.231.63.255 us +66.230.190.0 - 66.230.247.255 us +66.230.248.0 - 66.230.251.255 pr +66.230.252.0 - 66.231.63.255 us 66.231.64.0 - 66.231.79.255 co 66.231.80.0 - 66.231.159.255 us 66.231.160.0 - 66.231.175.255 pr -66.231.176.0 - 66.231.176.31 us -66.231.176.32 - 66.231.176.39 ru -66.231.176.40 - 66.231.176.79 us -66.231.176.80 - 66.231.176.95 gb -66.231.176.96 - 66.231.176.103 pl -66.231.176.104 - 66.231.177.31 us -66.231.177.32 - 66.231.177.39 cl -66.231.177.40 - 66.231.177.95 us -66.231.177.96 - 66.231.177.103 ca -66.231.177.104 - 66.231.226.127 us -66.231.226.128 - 66.231.226.255 es -66.231.227.0 - 66.231.227.255 us -66.231.228.0 - 66.231.230.255 pr -66.231.231.0 - 66.231.234.255 us -66.231.235.0 - 66.231.237.255 pr -66.231.238.0 - 66.231.243.255 us -66.231.244.0 - 66.231.245.255 pr -66.231.246.0 - 66.231.247.255 us -66.231.248.0 - 66.231.248.255 pr -66.231.249.0 - 66.231.251.255 us -66.231.252.0 - 66.231.253.255 pr -66.231.254.0 - 66.232.98.159 us -66.232.98.160 - 66.232.98.169 ru -66.232.98.170 - 66.232.99.144 us -66.232.99.145 - 66.232.99.159 ru -66.232.99.160 - 66.232.100.246 us -66.232.100.247 - 66.232.100.254 ru -66.232.100.255 - 66.232.102.156 us -66.232.102.157 - 66.232.102.168 ru -66.232.102.169 - 66.232.107.183 us -66.232.107.184 - 66.232.107.254 ru -66.232.107.255 - 66.232.109.91 us -66.232.109.92 - 66.232.109.101 es -66.232.109.102 - 66.232.110.64 us -66.232.110.65 - 66.232.110.95 gr -66.232.110.96 - 66.232.135.255 us +66.231.176.0 - 66.231.243.47 us +66.231.243.48 - 66.231.243.63 br +66.231.243.64 - 66.231.249.255 us +66.231.250.0 - 66.231.250.255 pr +66.231.251.0 - 66.232.127.255 us +66.232.128.0 - 66.232.135.255 gb 66.232.136.0 - 66.232.147.255 kr 66.232.148.0 - 66.234.15.255 us 66.234.16.0 - 66.234.31.255 ca -66.234.32.0 - 66.234.138.63 us -66.234.138.64 - 66.234.138.127 ch -66.234.138.128 - 66.235.242.79 us -66.235.242.80 - 66.235.242.95 ca -66.235.242.96 - 66.241.127.255 us +66.234.32.0 - 66.241.127.255 us 66.241.128.0 - 66.241.143.255 ca -66.241.144.0 - 66.242.36.63 us -66.242.36.64 - 66.242.36.127 ca -66.242.36.128 - 66.242.95.255 us +66.241.144.0 - 66.242.95.255 us 66.242.96.0 - 66.242.111.255 ca -66.242.112.0 - 66.244.127.255 us -66.244.128.0 - 66.244.143.255 ca -66.244.144.0 - 66.244.191.255 us +66.242.112.0 - 66.244.191.255 us 66.244.192.0 - 66.244.255.255 ca -66.245.0.0 - 66.247.199.255 us +66.245.0.0 - 66.245.163.255 us +66.245.164.0 - 66.245.164.127 ca +66.245.164.128 - 66.245.164.191 us +66.245.164.192 - 66.245.164.255 ca +66.245.165.0 - 66.247.199.255 us 66.247.200.0 - 66.247.207.255 aw -66.247.208.0 - 66.248.129.31 us -66.248.129.32 - 66.248.129.63 cy -66.248.129.64 - 66.248.129.191 us -66.248.129.192 - 66.248.129.223 de -66.248.129.224 - 66.248.129.255 ca -66.248.130.0 - 66.248.133.255 us -66.248.134.0 - 66.248.134.31 cy -66.248.134.32 - 66.248.137.95 us -66.248.137.96 - 66.248.137.127 de -66.248.137.128 - 66.248.151.223 us -66.248.151.224 - 66.248.151.255 cy -66.248.152.0 - 66.248.157.255 us +66.247.208.0 - 66.248.157.255 us 66.248.158.0 - 66.248.158.255 de 66.248.159.0 - 66.248.159.255 us 66.248.160.0 - 66.248.191.255 vi -66.248.192.0 - 66.249.143.255 us +66.248.192.0 - 66.248.192.255 ca +66.248.193.0 - 66.249.80.255 us +66.249.81.0 - 66.249.81.170 eu +66.249.81.171 - 66.249.81.171 pl +66.249.81.172 - 66.249.81.183 eu +66.249.81.184 - 66.249.81.184 ru +66.249.81.185 - 66.249.81.204 eu +66.249.81.205 - 66.249.81.205 ru +66.249.81.206 - 66.249.81.214 eu +66.249.81.215 - 66.249.81.215 ru +66.249.81.216 - 66.249.81.255 eu +66.249.82.0 - 66.249.82.175 ap +66.249.82.176 - 66.249.82.176 au +66.249.82.177 - 66.249.82.255 ap +66.249.83.0 - 66.249.92.255 us +66.249.93.0 - 66.249.93.86 eu +66.249.93.87 - 66.249.93.87 re +66.249.93.88 - 66.249.93.202 eu +66.249.93.203 - 66.249.93.203 re +66.249.93.204 - 66.249.93.255 eu +66.249.94.0 - 66.249.143.255 us 66.249.144.0 - 66.249.144.255 jm 66.249.145.0 - 66.249.145.255 bb 66.249.146.0 - 66.249.149.255 jm @@ -24578,305 +16197,51 @@ 66.249.208.0 - 66.249.215.255 pr 66.249.216.0 - 66.249.219.255 us 66.249.220.0 - 66.249.223.255 py -66.249.224.0 - 66.251.191.255 us +66.249.224.0 - 66.250.55.255 us +66.250.56.0 - 66.250.56.255 ca +66.250.57.0 - 66.251.127.255 us 66.251.192.0 - 66.251.192.255 do 66.251.193.0 - 66.251.215.255 us 66.251.216.0 - 66.251.216.255 ru 66.251.217.0 - 66.252.143.255 us 66.252.144.0 - 66.252.159.255 ca -66.252.160.0 - 66.252.229.111 us -66.252.229.112 - 66.252.229.119 gb -66.252.229.120 - 66.252.230.87 us -66.252.230.88 - 66.252.230.95 hk -66.252.230.96 - 66.252.230.135 us -66.252.230.136 - 66.252.230.143 hk -66.252.230.144 - 66.254.31.255 us +66.252.160.0 - 66.254.31.255 us 66.254.32.0 - 66.254.63.255 ca -66.254.64.0 - 66.255.80.95 us -66.255.80.96 - 66.255.80.127 nc -66.255.80.128 - 67.15.31.255 us +66.254.64.0 - 67.15.31.255 us 67.15.32.0 - 67.15.33.255 gb -67.15.34.0 - 67.15.86.191 us -67.15.86.192 - 67.15.86.223 pr -67.15.86.224 - 67.15.95.255 us -67.15.96.0 - 67.15.96.63 cl -67.15.96.64 - 67.15.96.95 ca -67.15.96.96 - 67.15.96.127 us -67.15.96.128 - 67.15.96.191 gb -67.15.96.192 - 67.15.96.223 pr -67.15.96.224 - 67.15.98.255 us +67.15.34.0 - 67.15.98.255 us 67.15.99.0 - 67.15.99.255 de 67.15.100.0 - 67.15.100.255 us 67.15.101.0 - 67.15.101.255 de -67.15.102.0 - 67.15.102.31 us -67.15.102.32 - 67.15.102.63 uy -67.15.102.64 - 67.15.102.159 us -67.15.102.160 - 67.15.102.175 uy -67.15.102.176 - 67.15.103.127 us -67.15.103.128 - 67.15.103.143 ru -67.15.103.144 - 67.15.107.63 us -67.15.107.64 - 67.15.107.127 uy -67.15.107.128 - 67.15.107.159 us -67.15.107.160 - 67.15.107.191 se -67.15.107.192 - 67.15.111.207 us -67.15.111.208 - 67.15.111.223 de -67.15.111.224 - 67.15.115.127 us -67.15.115.128 - 67.15.115.191 au -67.15.115.192 - 67.15.122.255 us +67.15.102.0 - 67.15.122.255 us 67.15.123.0 - 67.15.123.255 ca -67.15.124.0 - 67.15.131.255 us -67.15.132.0 - 67.15.132.31 au -67.15.132.32 - 67.15.132.63 us -67.15.132.64 - 67.15.132.127 za -67.15.132.128 - 67.15.132.175 us -67.15.132.176 - 67.15.132.191 de -67.15.132.192 - 67.15.135.15 us -67.15.135.16 - 67.15.135.31 ca -67.15.135.32 - 67.15.135.63 us -67.15.135.64 - 67.15.135.95 sk -67.15.135.96 - 67.15.135.111 us -67.15.135.112 - 67.15.135.127 uy -67.15.135.128 - 67.15.136.127 us -67.15.136.128 - 67.15.136.191 es -67.15.136.192 - 67.15.136.255 us -67.15.137.0 - 67.15.137.63 gb -67.15.137.64 - 67.15.137.79 us -67.15.137.80 - 67.15.137.95 hu -67.15.137.96 - 67.15.137.127 se -67.15.137.128 - 67.15.137.159 ca -67.15.137.160 - 67.15.137.175 us -67.15.137.176 - 67.15.137.191 uy -67.15.137.192 - 67.15.137.255 ca -67.15.138.0 - 67.15.144.95 us -67.15.144.96 - 67.15.144.127 il -67.15.144.128 - 67.15.144.191 sk -67.15.144.192 - 67.15.144.255 au -67.15.145.0 - 67.15.148.63 us -67.15.148.64 - 67.15.148.127 br -67.15.148.128 - 67.15.148.255 us -67.15.149.0 - 67.15.149.15 gb -67.15.149.16 - 67.15.149.127 us -67.15.149.128 - 67.15.149.143 gb -67.15.149.144 - 67.15.149.191 ca -67.15.149.192 - 67.15.149.255 br -67.15.150.0 - 67.15.150.127 au -67.15.150.128 - 67.15.150.255 gb -67.15.151.0 - 67.15.151.15 be -67.15.151.16 - 67.15.151.127 us -67.15.151.128 - 67.15.151.159 au -67.15.151.160 - 67.15.157.255 us -67.15.158.0 - 67.15.158.127 ar -67.15.158.128 - 67.15.158.255 us -67.15.159.0 - 67.15.159.63 au -67.15.159.64 - 67.15.159.127 br -67.15.159.128 - 67.15.159.191 us -67.15.159.192 - 67.15.159.223 il -67.15.159.224 - 67.15.159.239 us -67.15.159.240 - 67.15.159.255 gb -67.15.160.0 - 67.15.161.63 us -67.15.161.64 - 67.15.161.95 es -67.15.161.96 - 67.15.161.127 au -67.15.161.128 - 67.15.161.143 jo -67.15.161.144 - 67.15.161.159 uy -67.15.161.160 - 67.15.161.191 us -67.15.161.192 - 67.15.161.255 il -67.15.162.0 - 67.15.168.255 us +67.15.124.0 - 67.15.168.255 us 67.15.169.0 - 67.15.169.255 gb 67.15.170.0 - 67.15.182.255 us 67.15.183.0 - 67.15.183.127 a1 -67.15.183.128 - 67.15.183.159 uy -67.15.183.160 - 67.15.193.143 us -67.15.193.144 - 67.15.193.191 ca -67.15.193.192 - 67.15.193.255 gb -67.15.194.0 - 67.15.194.31 au -67.15.194.32 - 67.15.194.47 tr -67.15.194.48 - 67.15.194.63 fr -67.15.194.64 - 67.15.194.79 uy -67.15.194.80 - 67.15.194.95 fr -67.15.194.96 - 67.15.194.127 us -67.15.194.128 - 67.15.194.191 de -67.15.194.192 - 67.15.209.255 us -67.15.210.0 - 67.15.210.63 gb -67.15.210.64 - 67.15.210.127 us -67.15.210.128 - 67.15.210.191 kw -67.15.210.192 - 67.15.211.255 us -67.15.212.0 - 67.15.212.127 ma -67.15.212.128 - 67.15.212.143 uy -67.15.212.144 - 67.15.212.159 tw -67.15.212.160 - 67.15.212.175 ca -67.15.212.176 - 67.15.212.191 us -67.15.212.192 - 67.15.212.255 ma -67.15.213.0 - 67.15.214.127 us -67.15.214.128 - 67.15.214.143 br -67.15.214.144 - 67.15.214.159 us -67.15.214.160 - 67.15.214.175 ca -67.15.214.176 - 67.15.214.191 us -67.15.214.192 - 67.15.214.223 gb -67.15.214.224 - 67.15.214.239 il -67.15.214.240 - 67.15.215.191 us -67.15.215.192 - 67.15.215.223 de -67.15.215.224 - 67.15.218.127 us -67.15.218.128 - 67.15.218.191 pl -67.15.218.192 - 67.15.219.191 us -67.15.219.192 - 67.15.219.207 gb -67.15.219.208 - 67.15.219.255 us +67.15.183.128 - 67.15.219.255 us 67.15.220.0 - 67.15.220.255 ma -67.15.221.0 - 67.15.230.255 us -67.15.231.0 - 67.15.231.15 es -67.15.231.16 - 67.15.231.79 us -67.15.231.80 - 67.15.231.95 es -67.15.231.96 - 67.15.232.255 us -67.15.233.0 - 67.15.233.31 br -67.15.233.32 - 67.15.233.63 tr -67.15.233.64 - 67.15.233.255 us +67.15.221.0 - 67.15.233.255 us 67.15.234.0 - 67.15.234.255 ma -67.15.235.0 - 67.15.236.31 us -67.15.236.32 - 67.15.236.63 jp -67.15.236.64 - 67.15.236.95 us -67.15.236.96 - 67.15.236.127 br -67.15.236.128 - 67.15.236.223 us -67.15.236.224 - 67.15.236.239 uy -67.15.236.240 - 67.15.236.255 us +67.15.235.0 - 67.15.236.255 us 67.15.237.0 - 67.15.237.255 ma -67.15.238.0 - 67.15.242.31 us -67.15.242.32 - 67.15.242.47 br -67.15.242.48 - 67.15.242.63 us -67.15.242.64 - 67.15.242.95 uy -67.15.242.96 - 67.15.242.127 tr -67.15.242.128 - 67.15.242.191 us -67.15.242.192 - 67.15.242.223 il -67.15.242.224 - 67.15.242.255 br -67.15.243.0 - 67.15.244.223 us -67.15.244.224 - 67.15.244.255 tr -67.15.245.0 - 67.15.246.255 us -67.15.247.0 - 67.15.247.127 ro -67.15.247.128 - 67.15.247.159 us -67.15.247.160 - 67.15.247.191 il -67.15.247.192 - 67.15.247.223 jp -67.15.247.224 - 67.15.248.255 us +67.15.238.0 - 67.15.248.255 us 67.15.249.0 - 67.15.249.255 ma -67.15.250.0 - 67.15.250.255 us -67.15.251.0 - 67.15.251.31 uy -67.15.251.32 - 67.15.251.63 il -67.15.251.64 - 67.15.251.95 us -67.15.251.96 - 67.15.251.127 gb -67.15.251.128 - 67.15.251.255 ro -67.15.252.0 - 67.20.48.3 us -67.20.48.4 - 67.20.48.11 lk -67.20.48.12 - 67.20.50.7 us -67.20.50.8 - 67.20.50.15 es -67.20.50.16 - 67.20.55.194 us -67.20.55.195 - 67.20.55.196 lk -67.20.55.197 - 67.21.16.183 us -67.21.16.184 - 67.21.16.191 gb -67.21.16.192 - 67.21.17.31 us -67.21.17.32 - 67.21.17.39 es -67.21.17.40 - 67.21.17.63 us -67.21.17.64 - 67.21.17.71 gb -67.21.17.72 - 67.21.17.191 us -67.21.17.192 - 67.21.17.199 de -67.21.17.200 - 67.21.17.223 us -67.21.17.224 - 67.21.17.243 no -67.21.17.244 - 67.21.17.247 sg -67.21.17.248 - 67.21.18.7 us -67.21.18.8 - 67.21.18.15 no -67.21.18.16 - 67.21.18.35 us -67.21.18.36 - 67.21.18.39 es -67.21.18.40 - 67.21.18.47 us -67.21.18.48 - 67.21.18.59 no -67.21.18.60 - 67.21.18.75 us -67.21.18.76 - 67.21.18.87 no -67.21.18.88 - 67.21.18.99 es -67.21.18.100 - 67.21.18.103 no -67.21.18.104 - 67.21.18.111 es -67.21.18.112 - 67.21.18.115 no -67.21.18.116 - 67.21.18.123 us -67.21.18.124 - 67.21.18.127 no -67.21.18.128 - 67.21.18.131 es -67.21.18.132 - 67.21.18.135 no -67.21.18.136 - 67.21.18.143 es -67.21.18.144 - 67.21.18.147 no -67.21.18.148 - 67.21.18.151 es -67.21.18.152 - 67.21.18.159 no -67.21.18.160 - 67.21.18.163 ca -67.21.18.164 - 67.21.18.167 es -67.21.18.168 - 67.21.18.171 us -67.21.18.172 - 67.21.18.175 es -67.21.18.176 - 67.21.18.191 no -67.21.18.192 - 67.21.18.207 us -67.21.18.208 - 67.21.18.219 es -67.21.18.220 - 67.21.18.251 us -67.21.18.252 - 67.21.18.255 ca -67.21.19.0 - 67.21.19.255 a2 -67.21.20.0 - 67.21.21.255 us -67.21.22.0 - 67.21.22.3 ca -67.21.22.4 - 67.21.22.7 us -67.21.22.8 - 67.21.22.11 gb -67.21.22.12 - 67.21.22.35 us -67.21.22.36 - 67.21.22.39 no -67.21.22.40 - 67.21.22.63 us -67.21.22.64 - 67.21.22.67 es -67.21.22.68 - 67.21.22.71 gb -67.21.22.72 - 67.21.22.75 us -67.21.22.76 - 67.21.22.79 es -67.21.22.80 - 67.21.22.83 ca -67.21.22.84 - 67.21.22.87 us -67.21.22.88 - 67.21.22.91 no -67.21.22.92 - 67.21.22.115 us -67.21.22.116 - 67.21.22.119 no -67.21.22.120 - 67.21.22.131 us -67.21.22.132 - 67.21.22.135 gb -67.21.22.136 - 67.21.22.139 ca -67.21.22.140 - 67.21.22.147 us -67.21.22.148 - 67.21.22.155 es -67.21.22.156 - 67.21.22.159 ca -67.21.22.160 - 67.21.22.163 es -67.21.22.164 - 67.21.22.167 us -67.21.22.168 - 67.21.22.171 gb -67.21.22.172 - 67.21.22.175 no -67.21.22.176 - 67.21.22.183 us -67.21.22.184 - 67.21.22.187 es -67.21.22.188 - 67.21.22.191 vg -67.21.22.192 - 67.21.22.195 es -67.21.22.196 - 67.21.22.199 us -67.21.22.200 - 67.21.22.203 nz -67.21.22.204 - 67.21.22.207 es -67.21.22.208 - 67.21.22.211 us -67.21.22.212 - 67.21.22.215 no -67.21.22.216 - 67.21.22.219 an -67.21.22.220 - 67.21.22.255 us -67.21.23.0 - 67.21.23.255 a2 -67.21.24.0 - 67.21.25.3 us -67.21.25.4 - 67.21.25.7 no -67.21.25.8 - 67.21.25.11 a2 -67.21.25.12 - 67.21.25.23 us -67.21.25.24 - 67.21.25.27 nl -67.21.25.28 - 67.21.25.35 us -67.21.25.36 - 67.21.25.39 no -67.21.25.40 - 67.21.25.47 us -67.21.25.48 - 67.21.25.51 no -67.21.25.52 - 67.21.25.63 us -67.21.25.64 - 67.21.25.67 gb -67.21.25.68 - 67.21.25.71 no -67.21.25.72 - 67.21.25.75 an -67.21.25.76 - 67.21.25.79 us -67.21.25.80 - 67.21.25.83 sg -67.21.25.84 - 67.21.25.103 us -67.21.25.104 - 67.21.25.111 es -67.21.25.112 - 67.21.25.119 gb -67.21.25.120 - 67.21.25.131 an -67.21.25.132 - 67.21.25.135 es -67.21.25.136 - 67.21.26.23 us -67.21.26.24 - 67.21.26.27 an -67.21.26.28 - 67.21.26.31 us -67.21.26.32 - 67.21.26.35 an -67.21.26.36 - 67.21.95.255 us +67.15.250.0 - 67.16.99.232 us +67.16.99.233 - 67.16.99.233 gb +67.16.99.234 - 67.16.133.208 us +67.16.133.209 - 67.16.133.209 de +67.16.133.210 - 67.17.196.159 us +67.17.196.160 - 67.17.196.163 gb +67.17.196.164 - 67.17.248.255 us +67.17.249.0 - 67.17.249.255 ve +67.17.250.0 - 67.21.95.255 us 67.21.96.0 - 67.21.111.255 ca -67.21.112.0 - 67.21.115.31 us -67.21.115.32 - 67.21.115.87 br -67.21.115.88 - 67.21.169.135 us -67.21.169.136 - 67.21.169.143 ca -67.21.169.144 - 67.21.191.255 us +67.21.112.0 - 67.21.122.255 us +67.21.123.0 - 67.21.124.255 ca +67.21.125.0 - 67.21.143.255 us +67.21.144.0 - 67.21.159.255 ca +67.21.160.0 - 67.21.191.255 us 67.21.192.0 - 67.21.227.255 ca 67.21.228.0 - 67.21.228.255 pa 67.21.229.0 - 67.21.251.255 ca @@ -24884,966 +16249,83 @@ 67.21.253.0 - 67.21.253.255 us 67.21.254.0 - 67.21.255.255 ca 67.22.0.0 - 67.22.63.255 us -67.22.64.0 - 67.22.96.63 ca -67.22.96.64 - 67.22.96.95 us -67.22.96.96 - 67.22.97.55 ca -67.22.97.56 - 67.22.97.63 gb -67.22.97.64 - 67.22.97.111 ca -67.22.97.112 - 67.22.97.127 us -67.22.97.128 - 67.22.98.127 ca -67.22.98.128 - 67.22.98.143 us -67.22.98.144 - 67.22.98.159 ca -67.22.98.160 - 67.22.98.175 us -67.22.98.176 - 67.22.98.191 ie -67.22.98.192 - 67.22.98.223 ca -67.22.98.224 - 67.22.98.239 us -67.22.98.240 - 67.22.99.95 ca -67.22.99.96 - 67.22.99.103 us -67.22.99.104 - 67.22.100.63 ca -67.22.100.64 - 67.22.100.95 us -67.22.100.96 - 67.22.101.31 ca -67.22.101.32 - 67.22.101.39 cn -67.22.101.40 - 67.22.101.63 ca -67.22.101.64 - 67.22.101.95 ky -67.22.101.96 - 67.22.101.103 ca -67.22.101.104 - 67.22.101.111 us -67.22.101.112 - 67.22.102.15 ca -67.22.102.16 - 67.22.102.31 us -67.22.102.32 - 67.22.102.111 ca -67.22.102.112 - 67.22.102.127 us -67.22.102.128 - 67.22.102.167 ca -67.22.102.168 - 67.22.102.175 cn -67.22.102.176 - 67.22.103.175 ca -67.22.103.176 - 67.22.103.183 us -67.22.103.184 - 67.22.104.63 ca -67.22.104.64 - 67.22.104.71 bm -67.22.104.72 - 67.22.110.119 ca -67.22.110.120 - 67.22.110.127 us -67.22.110.128 - 67.22.111.7 ca -67.22.111.8 - 67.22.111.15 us -67.22.111.16 - 67.22.111.207 ca +67.22.64.0 - 67.22.111.207 ca 67.22.111.208 - 67.22.111.223 us -67.22.111.224 - 67.22.111.239 ca -67.22.111.240 - 67.22.119.255 us -67.22.128.0 - 67.22.129.3 ca -67.22.129.4 - 67.22.129.63 us -67.22.129.64 - 67.22.135.255 ca +67.22.111.224 - 67.22.111.255 ca +67.22.112.0 - 67.22.119.255 us +67.22.120.0 - 67.22.135.255 ca 67.22.136.0 - 67.22.136.255 us 67.22.137.0 - 67.22.143.255 ca 67.22.144.0 - 67.22.223.255 us 67.22.224.0 - 67.22.239.255 ca -67.22.240.0 - 67.23.58.47 us -67.23.58.48 - 67.23.58.63 ng -67.23.58.64 - 67.23.60.183 us -67.23.60.184 - 67.23.60.191 no -67.23.60.192 - 67.23.61.63 us -67.23.61.64 - 67.23.61.87 gb -67.23.61.88 - 67.23.127.255 us +67.22.240.0 - 67.23.127.255 us 67.23.128.0 - 67.23.143.255 ca -67.23.144.0 - 67.23.165.255 us -67.23.166.0 - 67.23.166.255 in -67.23.167.0 - 67.23.186.255 us -67.23.187.0 - 67.23.187.31 nz -67.23.187.32 - 67.23.238.62 us -67.23.238.63 - 67.23.238.64 ca -67.23.238.65 - 67.23.239.201 us -67.23.239.202 - 67.23.239.205 ca -67.23.239.206 - 67.23.240.61 us -67.23.240.62 - 67.23.240.63 in -67.23.240.64 - 67.23.241.178 us -67.23.241.179 - 67.23.241.198 bo -67.23.241.199 - 67.23.249.226 us -67.23.249.227 - 67.23.249.227 pk -67.23.249.228 - 67.23.252.137 us -67.23.252.138 - 67.23.252.141 ca -67.23.252.142 - 67.37.23.31 us -67.37.23.32 - 67.37.23.39 pr -67.37.23.40 - 67.37.208.215 us -67.37.208.216 - 67.37.208.223 pr -67.37.208.224 - 67.38.156.239 us -67.38.156.240 - 67.38.156.247 pr -67.38.156.248 - 67.38.197.167 us -67.38.197.168 - 67.38.197.175 pr -67.38.197.176 - 67.39.165.103 us -67.39.165.104 - 67.39.165.111 pr -67.39.165.112 - 67.39.208.95 us -67.39.208.96 - 67.39.208.103 pr -67.39.208.104 - 67.39.208.199 us -67.39.208.200 - 67.39.208.207 pr -67.39.208.208 - 67.43.127.255 us +67.23.144.0 - 67.43.127.255 us 67.43.128.0 - 67.43.143.255 ca -67.43.144.0 - 67.43.223.255 us -67.43.224.0 - 67.43.225.255 ca -67.43.226.0 - 67.43.226.127 gb -67.43.226.128 - 67.43.226.183 ca -67.43.226.184 - 67.43.226.191 bz -67.43.226.192 - 67.43.226.207 ca -67.43.226.208 - 67.43.226.215 lb -67.43.226.216 - 67.43.226.231 ca -67.43.226.232 - 67.43.226.239 cn -67.43.226.240 - 67.43.226.255 lb -67.43.227.0 - 67.43.227.63 ca -67.43.227.64 - 67.43.227.127 pk -67.43.227.128 - 67.43.229.47 ca -67.43.229.48 - 67.43.229.55 es -67.43.229.56 - 67.43.229.63 hr -67.43.229.64 - 67.43.230.15 ca -67.43.230.16 - 67.43.230.23 pk -67.43.230.24 - 67.43.230.31 ru -67.43.230.32 - 67.43.230.63 ca -67.43.230.64 - 67.43.230.95 it -67.43.230.96 - 67.43.230.199 ca -67.43.230.200 - 67.43.230.207 cn -67.43.230.208 - 67.43.230.223 ca -67.43.230.224 - 67.43.230.255 fr -67.43.231.0 - 67.43.231.127 ca -67.43.231.128 - 67.43.231.191 my -67.43.231.192 - 67.43.235.95 ca -67.43.235.96 - 67.43.235.103 ph -67.43.235.104 - 67.43.236.31 ca -67.43.236.32 - 67.43.236.39 kp -67.43.236.40 - 67.43.236.63 ca -67.43.236.64 - 67.43.236.71 lb -67.43.236.72 - 67.43.236.79 ca -67.43.236.80 - 67.43.236.87 lb -67.43.236.88 - 67.43.236.95 ca -67.43.236.96 - 67.43.236.103 lb -67.43.236.104 - 67.43.237.71 ca -67.43.237.72 - 67.43.237.79 ph -67.43.237.80 - 67.43.237.255 ca -67.43.238.0 - 67.43.238.63 ae -67.43.238.64 - 67.43.238.111 ca -67.43.238.112 - 67.43.238.119 th -67.43.238.120 - 67.43.239.191 ca -67.43.239.192 - 67.43.239.255 cy -67.43.240.0 - 67.54.255.255 us +67.43.144.0 - 67.43.155.255 us +67.43.156.0 - 67.43.156.255 a1 +67.43.157.0 - 67.43.223.255 us +67.43.224.0 - 67.43.239.255 ca +67.43.240.0 - 67.46.230.255 us +67.46.231.0 - 67.46.231.255 ca +67.46.232.0 - 67.54.255.255 us 67.55.0.0 - 67.55.63.255 ca 67.55.64.0 - 67.58.191.255 us 67.58.192.0 - 67.58.223.255 ca -67.58.224.0 - 67.59.140.255 us -67.59.141.0 - 67.59.141.31 il -67.59.141.32 - 67.59.152.103 us -67.59.152.104 - 67.59.152.111 ca -67.59.152.112 - 67.59.179.167 us -67.59.179.168 - 67.59.179.175 ro -67.59.179.176 - 67.59.182.247 us -67.59.182.248 - 67.59.182.255 in -67.59.183.0 - 67.59.185.127 us -67.59.185.128 - 67.59.185.143 il -67.59.185.144 - 67.59.189.71 us -67.59.189.72 - 67.59.189.79 au -67.59.189.80 - 67.59.189.207 us -67.59.189.208 - 67.59.189.215 il -67.59.189.216 - 67.64.67.135 us -67.64.67.136 - 67.64.67.143 pr -67.64.67.144 - 67.64.80.15 us -67.64.80.16 - 67.64.80.31 pr -67.64.80.32 - 67.67.255.255 us -67.68.0.0 - 67.69.150.143 ca -67.69.150.144 - 67.69.150.159 us -67.69.150.160 - 67.69.177.255 ca +67.58.224.0 - 67.67.255.255 us +67.68.0.0 - 67.69.177.255 ca 67.69.178.0 - 67.69.179.255 us 67.69.180.0 - 67.71.255.255 ca -67.72.0.0 - 67.72.103.255 us -67.72.104.0 - 67.72.104.31 ca -67.72.104.32 - 67.112.104.7 us -67.112.104.8 - 67.112.104.15 pr -67.112.104.16 - 67.120.44.239 us -67.120.44.240 - 67.120.44.247 pr -67.120.44.248 - 67.121.68.31 us -67.121.68.32 - 67.121.68.39 pr -67.121.68.40 - 67.129.214.63 us -67.129.214.64 - 67.129.214.79 ca -67.129.214.80 - 67.131.214.135 us -67.131.214.136 - 67.131.214.143 ca -67.131.214.144 - 67.132.157.7 us -67.132.157.8 - 67.132.157.15 mx -67.132.157.16 - 67.134.214.31 us -67.134.214.32 - 67.134.214.63 au -67.134.214.64 - 67.135.103.231 us -67.135.103.232 - 67.135.103.239 ca -67.135.103.240 - 67.135.130.207 us -67.135.130.208 - 67.135.130.223 is -67.135.130.224 - 67.148.49.31 us -67.148.49.32 - 67.148.49.39 ne -67.148.49.40 - 67.148.49.47 us -67.148.49.48 - 67.148.49.63 gb -67.148.49.64 - 67.148.49.127 us -67.148.49.128 - 67.148.49.159 gb -67.148.49.160 - 67.148.49.223 us -67.148.49.224 - 67.148.49.255 be -67.148.50.0 - 67.151.233.255 us +67.72.0.0 - 67.72.98.255 us +67.72.99.0 - 67.72.99.255 nl +67.72.100.0 - 67.98.155.255 us +67.98.156.0 - 67.98.156.255 fr +67.98.157.0 - 67.98.161.255 us +67.98.162.0 - 67.98.163.255 gu +67.98.164.0 - 67.98.166.255 us +67.98.167.0 - 67.98.167.255 gu +67.98.168.0 - 67.143.62.255 us +67.143.63.0 - 67.143.63.255 ca +67.143.64.0 - 67.148.49.7 us +67.148.49.8 - 67.148.49.15 ie +67.148.49.16 - 67.148.49.95 us +67.148.49.96 - 67.148.49.127 gb +67.148.49.128 - 67.148.49.143 us +67.148.49.144 - 67.148.49.151 ie +67.148.49.152 - 67.148.65.255 us +67.148.66.0 - 67.148.66.127 gb +67.148.66.128 - 67.148.66.191 us +67.148.66.192 - 67.148.66.199 nl +67.148.66.200 - 67.148.66.207 ie +67.148.66.208 - 67.151.233.255 us 67.151.234.0 - 67.151.234.255 a2 -67.151.235.0 - 67.158.47.255 us -67.158.48.0 - 67.158.60.0 cn -67.158.60.1 - 67.158.63.255 us +67.151.235.0 - 67.158.63.255 us 67.158.64.0 - 67.158.79.255 ca -67.158.80.0 - 67.159.203.255 us -67.159.204.0 - 67.159.204.31 bh -67.159.204.32 - 67.159.204.255 us -67.159.205.0 - 67.159.205.31 bh -67.159.205.32 - 67.159.206.47 us -67.159.206.48 - 67.159.206.63 jp -67.159.206.64 - 67.159.207.255 us +67.158.80.0 - 67.159.207.255 us 67.159.208.0 - 67.159.223.255 ca -67.159.224.0 - 67.189.223.143 us -67.189.223.144 - 67.189.223.159 gb -67.189.223.160 - 67.189.223.175 us -67.189.223.176 - 67.189.223.191 gb -67.189.223.192 - 67.192.0.119 us -67.192.0.120 - 67.192.0.127 ca -67.192.0.128 - 67.192.0.199 us -67.192.0.200 - 67.192.0.207 gb -67.192.0.208 - 67.192.0.231 us -67.192.0.232 - 67.192.0.247 au -67.192.0.248 - 67.192.1.223 us -67.192.1.224 - 67.192.1.255 ca -67.192.2.0 - 67.192.2.143 us -67.192.2.144 - 67.192.2.151 ca -67.192.2.152 - 67.192.4.207 us -67.192.4.208 - 67.192.4.215 gb -67.192.4.216 - 67.192.5.111 us -67.192.5.112 - 67.192.5.119 ca -67.192.5.120 - 67.192.5.151 us -67.192.5.152 - 67.192.5.159 ca -67.192.5.160 - 67.192.5.207 us -67.192.5.208 - 67.192.5.223 gt -67.192.5.224 - 67.192.5.247 us -67.192.5.248 - 67.192.5.255 ca -67.192.6.0 - 67.192.6.167 us -67.192.6.168 - 67.192.6.175 cn -67.192.6.176 - 67.192.6.191 mx -67.192.6.192 - 67.192.6.199 us -67.192.6.200 - 67.192.6.207 jp -67.192.6.208 - 67.192.6.215 us -67.192.6.216 - 67.192.6.223 au -67.192.6.224 - 67.192.6.231 us -67.192.6.232 - 67.192.6.239 au -67.192.6.240 - 67.192.8.7 us -67.192.8.8 - 67.192.8.15 mx -67.192.8.16 - 67.192.9.23 us -67.192.9.24 - 67.192.9.31 in -67.192.9.32 - 67.192.9.39 nz -67.192.9.40 - 67.192.10.47 us -67.192.10.48 - 67.192.10.55 au -67.192.10.56 - 67.192.10.79 us -67.192.10.80 - 67.192.10.87 au -67.192.10.88 - 67.192.10.95 us -67.192.10.96 - 67.192.10.103 au -67.192.10.104 - 67.192.10.207 us -67.192.10.208 - 67.192.10.223 ca -67.192.10.224 - 67.192.12.143 us -67.192.12.144 - 67.192.12.151 mx -67.192.12.152 - 67.192.12.183 us -67.192.12.184 - 67.192.12.191 fr -67.192.12.192 - 67.192.13.55 us -67.192.13.56 - 67.192.13.63 ca -67.192.13.64 - 67.192.13.215 us -67.192.13.216 - 67.192.13.223 ca -67.192.13.224 - 67.192.13.255 us -67.192.14.0 - 67.192.14.7 ca -67.192.14.8 - 67.192.14.79 us -67.192.14.80 - 67.192.14.87 gb -67.192.14.88 - 67.192.14.255 us -67.192.15.0 - 67.192.15.7 ca -67.192.15.8 - 67.192.15.15 us -67.192.15.16 - 67.192.15.23 gb -67.192.15.24 - 67.192.15.247 us -67.192.15.248 - 67.192.15.255 gb -67.192.16.0 - 67.192.16.7 us -67.192.16.8 - 67.192.16.15 no -67.192.16.16 - 67.192.16.31 us -67.192.16.32 - 67.192.16.39 hr -67.192.16.40 - 67.192.17.23 us -67.192.17.24 - 67.192.17.31 ca -67.192.17.32 - 67.192.17.39 us -67.192.17.40 - 67.192.17.55 ca -67.192.17.56 - 67.192.17.87 us -67.192.17.88 - 67.192.17.103 ca -67.192.17.104 - 67.192.17.135 us -67.192.17.136 - 67.192.17.143 au -67.192.17.144 - 67.192.17.207 us -67.192.17.208 - 67.192.17.215 in -67.192.17.216 - 67.192.19.47 us -67.192.19.48 - 67.192.19.55 tw -67.192.19.56 - 67.192.19.79 us -67.192.19.80 - 67.192.19.87 in -67.192.19.88 - 67.192.19.95 us -67.192.19.96 - 67.192.19.103 cn -67.192.19.104 - 67.192.19.119 us -67.192.19.120 - 67.192.19.127 in -67.192.19.128 - 67.192.19.151 us -67.192.19.152 - 67.192.19.159 mx -67.192.19.160 - 67.192.20.127 us -67.192.20.128 - 67.192.20.135 in -67.192.20.136 - 67.192.20.183 us -67.192.20.184 - 67.192.20.191 gb -67.192.20.192 - 67.192.20.223 us -67.192.20.224 - 67.192.20.239 ca -67.192.20.240 - 67.192.21.159 us -67.192.21.160 - 67.192.21.191 ca -67.192.21.192 - 67.192.22.71 us -67.192.22.72 - 67.192.22.79 ca -67.192.22.80 - 67.192.22.135 us -67.192.22.136 - 67.192.22.143 mx -67.192.22.144 - 67.192.24.47 us -67.192.24.48 - 67.192.24.55 ca -67.192.24.56 - 67.192.24.135 us -67.192.24.136 - 67.192.24.143 ca -67.192.24.144 - 67.192.25.31 us -67.192.25.32 - 67.192.25.39 in -67.192.25.40 - 67.192.25.127 us -67.192.25.128 - 67.192.25.135 in -67.192.25.136 - 67.192.26.207 us -67.192.26.208 - 67.192.26.215 cl -67.192.26.216 - 67.192.28.23 us -67.192.28.24 - 67.192.28.31 cn -67.192.28.32 - 67.192.28.127 us -67.192.28.128 - 67.192.28.135 in -67.192.28.136 - 67.192.28.143 jp -67.192.28.144 - 67.192.31.223 us -67.192.31.224 - 67.192.31.231 au -67.192.31.232 - 67.192.32.63 us -67.192.32.64 - 67.192.32.71 ca -67.192.32.72 - 67.192.32.215 us -67.192.32.216 - 67.192.32.223 gb -67.192.32.224 - 67.192.32.239 us -67.192.32.240 - 67.192.32.247 il -67.192.32.248 - 67.192.33.15 us -67.192.33.16 - 67.192.33.31 ca -67.192.33.32 - 67.192.34.15 us -67.192.34.16 - 67.192.34.23 au -67.192.34.24 - 67.192.34.47 us -67.192.34.48 - 67.192.34.55 gb -67.192.34.56 - 67.192.36.55 us -67.192.36.56 - 67.192.36.63 in -67.192.36.64 - 67.192.36.135 us -67.192.36.136 - 67.192.36.143 gb -67.192.36.144 - 67.192.36.159 us -67.192.36.160 - 67.192.36.167 ca -67.192.36.168 - 67.192.36.231 us -67.192.36.232 - 67.192.36.239 ca -67.192.36.240 - 67.192.37.63 us -67.192.37.64 - 67.192.37.71 de -67.192.37.72 - 67.192.38.31 us -67.192.38.32 - 67.192.38.39 ca -67.192.38.40 - 67.192.38.111 us -67.192.38.112 - 67.192.38.119 pt -67.192.38.120 - 67.192.38.239 us -67.192.38.240 - 67.192.38.247 il -67.192.38.248 - 67.192.39.79 us -67.192.39.80 - 67.192.39.95 gb -67.192.39.96 - 67.192.39.191 us -67.192.39.192 - 67.192.39.207 gb -67.192.39.208 - 67.192.40.119 us -67.192.40.120 - 67.192.40.127 ca -67.192.40.128 - 67.192.40.167 us -67.192.40.168 - 67.192.40.175 il -67.192.40.176 - 67.192.40.239 us -67.192.40.240 - 67.192.40.247 gb -67.192.40.248 - 67.192.41.111 us -67.192.41.112 - 67.192.41.127 ca -67.192.41.128 - 67.192.41.207 us -67.192.41.208 - 67.192.41.223 il -67.192.41.224 - 67.192.43.55 us -67.192.43.56 - 67.192.43.63 gb -67.192.43.64 - 67.192.43.159 us -67.192.43.160 - 67.192.43.167 au -67.192.43.168 - 67.192.43.207 us -67.192.43.208 - 67.192.43.223 in -67.192.43.224 - 67.192.44.7 us -67.192.44.8 - 67.192.44.15 ca -67.192.44.16 - 67.192.44.111 us -67.192.44.112 - 67.192.44.119 kw -67.192.44.120 - 67.192.45.119 us -67.192.45.120 - 67.192.45.127 gb -67.192.45.128 - 67.192.45.223 us -67.192.45.224 - 67.192.45.255 au -67.192.46.0 - 67.192.46.31 us -67.192.46.32 - 67.192.46.47 mx -67.192.46.48 - 67.192.46.127 us -67.192.46.128 - 67.192.46.143 in -67.192.46.144 - 67.192.46.159 mx -67.192.46.160 - 67.192.46.175 us -67.192.46.176 - 67.192.46.191 mx -67.192.46.192 - 67.192.46.223 us -67.192.46.224 - 67.192.46.255 in -67.192.47.0 - 67.192.47.31 us -67.192.47.32 - 67.192.47.39 in -67.192.47.40 - 67.192.47.143 us -67.192.47.144 - 67.192.47.151 ca -67.192.47.152 - 67.192.47.255 us -67.192.48.0 - 67.192.48.7 in -67.192.48.8 - 67.192.48.215 us -67.192.48.216 - 67.192.48.223 cl -67.192.48.224 - 67.192.49.215 us -67.192.49.216 - 67.192.49.223 in -67.192.49.224 - 67.192.50.79 us -67.192.50.80 - 67.192.50.95 gb -67.192.50.96 - 67.192.50.159 us -67.192.50.160 - 67.192.50.175 co -67.192.50.176 - 67.192.51.47 us -67.192.51.48 - 67.192.51.55 ca -67.192.51.56 - 67.192.51.71 us -67.192.51.72 - 67.192.51.79 ca -67.192.51.80 - 67.192.51.127 us -67.192.51.128 - 67.192.51.135 ca -67.192.51.136 - 67.192.51.143 mx -67.192.51.144 - 67.192.52.79 us -67.192.52.80 - 67.192.52.87 nl -67.192.52.88 - 67.192.52.215 us -67.192.52.216 - 67.192.52.223 es -67.192.52.224 - 67.192.53.111 us -67.192.53.112 - 67.192.53.119 sg -67.192.53.120 - 67.192.53.159 us -67.192.53.160 - 67.192.53.167 nz -67.192.53.168 - 67.192.53.199 us -67.192.53.200 - 67.192.53.207 sg -67.192.53.208 - 67.192.55.255 us -67.192.56.0 - 67.192.56.255 gb -67.192.57.0 - 67.192.64.231 us -67.192.64.232 - 67.192.64.239 ca -67.192.64.240 - 67.192.65.15 us -67.192.65.16 - 67.192.65.23 in -67.192.65.24 - 67.192.65.207 us -67.192.65.208 - 67.192.65.215 gb -67.192.65.216 - 67.192.65.255 us -67.192.66.0 - 67.192.66.7 ca -67.192.66.8 - 67.192.66.47 us -67.192.66.48 - 67.192.66.55 ca -67.192.66.56 - 67.192.66.143 us -67.192.66.144 - 67.192.66.151 ca -67.192.66.152 - 67.192.67.23 us -67.192.67.24 - 67.192.67.31 ve -67.192.67.32 - 67.192.67.167 us -67.192.67.168 - 67.192.67.175 mx -67.192.67.176 - 67.192.68.63 us -67.192.68.64 - 67.192.68.71 ca -67.192.68.72 - 67.192.68.111 us -67.192.68.112 - 67.192.68.127 ca -67.192.68.128 - 67.192.68.135 gb -67.192.68.136 - 67.192.69.31 us -67.192.69.32 - 67.192.69.47 au -67.192.69.48 - 67.192.70.143 us -67.192.70.144 - 67.192.70.159 au -67.192.70.160 - 67.192.71.23 us -67.192.71.24 - 67.192.71.31 ca -67.192.71.32 - 67.192.71.47 mx -67.192.71.48 - 67.192.71.247 us -67.192.71.248 - 67.192.71.255 gb -67.192.72.0 - 67.192.72.47 us -67.192.72.48 - 67.192.72.55 in -67.192.72.56 - 67.192.72.79 us -67.192.72.80 - 67.192.72.87 il -67.192.72.88 - 67.192.72.95 gb -67.192.72.96 - 67.192.72.151 us -67.192.72.152 - 67.192.72.159 ca -67.192.72.160 - 67.192.72.191 us -67.192.72.192 - 67.192.72.199 au -67.192.72.200 - 67.192.72.207 cl -67.192.72.208 - 67.192.72.239 us -67.192.72.240 - 67.192.72.247 es -67.192.72.248 - 67.192.73.239 us -67.192.73.240 - 67.192.73.247 gb -67.192.73.248 - 67.192.75.167 us -67.192.75.168 - 67.192.75.175 in -67.192.75.176 - 67.192.75.231 us -67.192.75.232 - 67.192.75.239 ae -67.192.75.240 - 67.192.75.255 us -67.192.76.0 - 67.192.76.255 gb -67.192.77.0 - 67.192.77.31 us -67.192.77.32 - 67.192.77.47 ie -67.192.77.48 - 67.192.77.159 us -67.192.77.160 - 67.192.77.175 ca -67.192.77.176 - 67.192.78.199 us -67.192.78.200 - 67.192.78.207 gb -67.192.78.208 - 67.192.78.231 us -67.192.78.232 - 67.192.78.239 au -67.192.78.240 - 67.192.79.63 us -67.192.79.64 - 67.192.79.71 ca -67.192.79.72 - 67.192.79.127 us -67.192.79.128 - 67.192.79.135 au -67.192.79.136 - 67.192.81.255 us -67.192.82.0 - 67.192.82.15 au -67.192.82.16 - 67.192.82.87 us -67.192.82.88 - 67.192.82.95 ca -67.192.82.96 - 67.192.82.239 us -67.192.82.240 - 67.192.82.255 ca -67.192.83.0 - 67.192.84.215 us -67.192.84.216 - 67.192.84.223 in -67.192.84.224 - 67.192.85.159 us -67.192.85.160 - 67.192.85.175 mx -67.192.85.176 - 67.192.86.31 us -67.192.86.32 - 67.192.86.47 gb -67.192.86.48 - 67.192.88.159 us -67.192.88.160 - 67.192.88.175 ca -67.192.88.176 - 67.192.88.223 us -67.192.88.224 - 67.192.88.255 br -67.192.89.0 - 67.192.89.47 us -67.192.89.48 - 67.192.89.55 gb -67.192.89.56 - 67.192.89.63 us -67.192.89.64 - 67.192.89.95 il -67.192.89.96 - 67.192.89.111 us -67.192.89.112 - 67.192.89.127 ca -67.192.89.128 - 67.192.92.119 us -67.192.92.120 - 67.192.92.127 ca -67.192.92.128 - 67.192.92.207 us -67.192.92.208 - 67.192.92.215 no -67.192.92.216 - 67.192.92.223 us -67.192.92.224 - 67.192.92.239 bd -67.192.92.240 - 67.192.93.119 us -67.192.93.120 - 67.192.93.127 in -67.192.93.128 - 67.192.95.39 us -67.192.95.40 - 67.192.95.47 bd -67.192.95.48 - 67.192.95.55 in -67.192.95.56 - 67.192.96.207 us -67.192.96.208 - 67.192.96.215 ca -67.192.96.216 - 67.192.96.231 us -67.192.96.232 - 67.192.96.239 mx -67.192.96.240 - 67.192.96.255 us -67.192.97.0 - 67.192.97.7 hn -67.192.97.8 - 67.192.97.15 us -67.192.97.16 - 67.192.97.23 il -67.192.97.24 - 67.192.97.95 us -67.192.97.96 - 67.192.97.103 br -67.192.97.104 - 67.192.97.223 us -67.192.97.224 - 67.192.97.231 gb -67.192.97.232 - 67.192.97.239 us -67.192.97.240 - 67.192.97.255 il -67.192.98.0 - 67.192.98.15 us -67.192.98.16 - 67.192.98.23 gb -67.192.98.24 - 67.192.98.87 us -67.192.98.88 - 67.192.98.95 ca -67.192.98.96 - 67.192.101.31 us -67.192.101.32 - 67.192.101.63 gb -67.192.101.64 - 67.192.101.255 us -67.192.102.0 - 67.192.102.7 ca -67.192.102.8 - 67.192.102.31 us -67.192.102.32 - 67.192.102.63 ca -67.192.102.64 - 67.192.102.87 us -67.192.102.88 - 67.192.102.95 ca -67.192.102.96 - 67.192.102.199 us -67.192.102.200 - 67.192.102.207 ca -67.192.102.208 - 67.192.103.111 us -67.192.103.112 - 67.192.103.119 ca -67.192.103.120 - 67.192.104.87 us -67.192.104.88 - 67.192.104.95 il -67.192.104.96 - 67.192.104.119 us -67.192.104.120 - 67.192.104.127 mx -67.192.104.128 - 67.192.105.103 us -67.192.105.104 - 67.192.105.111 gb -67.192.105.112 - 67.192.105.119 za -67.192.105.120 - 67.192.106.7 us -67.192.106.8 - 67.192.106.15 au -67.192.106.16 - 67.192.106.23 us -67.192.106.24 - 67.192.106.31 ae -67.192.106.32 - 67.192.108.15 us -67.192.108.16 - 67.192.108.31 ca -67.192.108.32 - 67.192.108.55 us -67.192.108.56 - 67.192.108.63 mx -67.192.108.64 - 67.192.108.71 us -67.192.108.72 - 67.192.108.79 ca -67.192.108.80 - 67.192.108.199 us -67.192.108.200 - 67.192.108.207 ca -67.192.108.208 - 67.192.108.215 in -67.192.108.216 - 67.192.109.175 us -67.192.109.176 - 67.192.109.183 ca -67.192.109.184 - 67.192.110.15 us -67.192.110.16 - 67.192.110.31 ca -67.192.110.32 - 67.192.110.63 us -67.192.110.64 - 67.192.110.71 ca -67.192.110.72 - 67.192.110.79 us -67.192.110.80 - 67.192.110.87 in -67.192.110.88 - 67.192.110.119 us -67.192.110.120 - 67.192.110.127 au -67.192.110.128 - 67.192.110.135 gb -67.192.110.136 - 67.192.110.159 us -67.192.110.160 - 67.192.110.175 mx -67.192.110.176 - 67.192.110.191 us -67.192.110.192 - 67.192.110.207 in -67.192.110.208 - 67.192.111.7 us -67.192.111.8 - 67.192.111.15 it -67.192.111.16 - 67.192.111.95 us -67.192.111.96 - 67.192.111.111 ca -67.192.111.112 - 67.192.111.119 hr -67.192.111.120 - 67.192.111.175 us -67.192.111.176 - 67.192.111.183 ca -67.192.111.184 - 67.192.111.191 us -67.192.111.192 - 67.192.111.199 jp -67.192.111.200 - 67.192.111.255 us -67.192.112.0 - 67.192.112.127 ca -67.192.112.128 - 67.192.112.135 us -67.192.112.136 - 67.192.112.143 bm -67.192.112.144 - 67.192.112.175 us -67.192.112.176 - 67.192.112.183 cn -67.192.112.184 - 67.192.112.191 us -67.192.112.192 - 67.192.112.207 ca -67.192.112.208 - 67.192.114.223 us -67.192.114.224 - 67.192.114.231 il -67.192.114.232 - 67.192.115.47 us -67.192.115.48 - 67.192.115.55 ca -67.192.115.56 - 67.192.115.79 us -67.192.115.80 - 67.192.115.87 hr -67.192.115.88 - 67.192.115.111 us -67.192.115.112 - 67.192.115.119 it -67.192.115.120 - 67.192.115.223 us -67.192.115.224 - 67.192.115.231 ie -67.192.115.232 - 67.192.128.7 us -67.192.128.8 - 67.192.128.15 br -67.192.128.16 - 67.192.128.119 us -67.192.128.120 - 67.192.128.127 mx -67.192.128.128 - 67.192.129.23 us -67.192.129.24 - 67.192.129.31 bm -67.192.129.32 - 67.192.129.95 us -67.192.129.96 - 67.192.129.103 ve -67.192.129.104 - 67.192.129.143 us -67.192.129.144 - 67.192.129.151 in -67.192.129.152 - 67.192.130.71 us -67.192.130.72 - 67.192.130.79 gb -67.192.130.80 - 67.192.130.151 us -67.192.130.152 - 67.192.130.159 gb -67.192.130.160 - 67.192.131.31 us -67.192.131.32 - 67.192.131.39 ca -67.192.131.40 - 67.192.131.55 us -67.192.131.56 - 67.192.131.63 il -67.192.131.64 - 67.192.131.103 us -67.192.131.104 - 67.192.131.111 in -67.192.131.112 - 67.192.131.135 us -67.192.131.136 - 67.192.131.143 ca -67.192.131.144 - 67.192.131.159 us -67.192.131.160 - 67.192.131.167 au -67.192.131.168 - 67.192.132.231 us -67.192.132.232 - 67.192.132.239 bd -67.192.132.240 - 67.192.134.159 us -67.192.134.160 - 67.192.134.175 gb -67.192.134.176 - 67.192.136.215 us -67.192.136.216 - 67.192.136.223 ca -67.192.136.224 - 67.192.138.223 us -67.192.138.224 - 67.192.138.231 ca -67.192.138.232 - 67.192.139.71 us -67.192.139.72 - 67.192.139.79 au -67.192.139.80 - 67.192.139.103 us -67.192.139.104 - 67.192.139.111 ca -67.192.139.112 - 67.192.140.15 us -67.192.140.16 - 67.192.140.23 ar -67.192.140.24 - 67.192.140.95 us -67.192.140.96 - 67.192.140.103 nl -67.192.140.104 - 67.192.141.55 us -67.192.141.56 - 67.192.141.63 gb -67.192.141.64 - 67.192.142.63 us -67.192.142.64 - 67.192.142.71 nz -67.192.142.72 - 67.192.142.183 us -67.192.142.184 - 67.192.142.191 in -67.192.142.192 - 67.192.142.255 us -67.192.143.0 - 67.192.143.63 ir -67.192.143.64 - 67.192.143.71 au -67.192.143.72 - 67.192.144.255 us -67.192.145.0 - 67.192.145.7 gb -67.192.145.8 - 67.192.145.15 ca -67.192.145.16 - 67.192.146.127 us -67.192.146.128 - 67.192.146.143 ca -67.192.146.144 - 67.192.146.191 us -67.192.146.192 - 67.192.146.199 ca -67.192.146.200 - 67.192.146.207 au -67.192.146.208 - 67.192.146.215 us -67.192.146.216 - 67.192.146.223 gb -67.192.146.224 - 67.192.147.63 us -67.192.147.64 - 67.192.147.71 bg -67.192.147.72 - 67.192.147.247 us -67.192.147.248 - 67.192.147.255 gb -67.192.148.0 - 67.192.148.31 us -67.192.148.32 - 67.192.148.39 kr -67.192.148.40 - 67.192.148.47 us -67.192.148.48 - 67.192.148.55 kr -67.192.148.56 - 67.192.148.127 us -67.192.148.128 - 67.192.148.143 ca -67.192.148.144 - 67.192.150.111 us -67.192.150.112 - 67.192.150.119 au -67.192.150.120 - 67.192.150.207 us -67.192.150.208 - 67.192.150.215 gb -67.192.150.216 - 67.192.152.207 us -67.192.152.208 - 67.192.152.215 gb -67.192.152.216 - 67.192.153.151 us -67.192.153.152 - 67.192.153.159 dk -67.192.153.160 - 67.192.153.167 us -67.192.153.168 - 67.192.153.175 il -67.192.153.176 - 67.192.153.191 dk -67.192.153.192 - 67.192.155.23 us -67.192.155.24 - 67.192.155.31 au -67.192.155.32 - 67.192.155.47 us -67.192.155.48 - 67.192.155.63 au -67.192.155.64 - 67.192.155.199 us -67.192.155.200 - 67.192.155.207 ca -67.192.155.208 - 67.192.157.71 us -67.192.157.72 - 67.192.157.79 gb -67.192.157.80 - 67.192.157.95 us -67.192.157.96 - 67.192.157.103 il -67.192.157.104 - 67.192.157.135 us -67.192.157.136 - 67.192.157.143 gt -67.192.157.144 - 67.192.157.191 us -67.192.157.192 - 67.192.157.199 il -67.192.157.200 - 67.192.158.23 us -67.192.158.24 - 67.192.158.31 gb -67.192.158.32 - 67.192.158.215 us -67.192.158.216 - 67.192.158.223 bm -67.192.158.224 - 67.192.160.111 us -67.192.160.112 - 67.192.160.119 ca -67.192.160.120 - 67.192.161.47 us -67.192.161.48 - 67.192.161.55 ca -67.192.161.56 - 67.192.161.167 us -67.192.161.168 - 67.192.161.175 gb -67.192.161.176 - 67.192.162.119 us -67.192.162.120 - 67.192.162.127 ca -67.192.162.128 - 67.192.162.167 us -67.192.162.168 - 67.192.162.175 gb -67.192.162.176 - 67.192.162.183 us -67.192.162.184 - 67.192.162.255 ie -67.192.163.0 - 67.192.165.191 us -67.192.165.192 - 67.192.165.199 gb -67.192.165.200 - 67.192.166.143 us -67.192.166.144 - 67.192.166.159 gb -67.192.166.160 - 67.192.166.207 us -67.192.166.208 - 67.192.166.215 gb -67.192.166.216 - 67.192.168.95 us -67.192.168.96 - 67.192.168.111 ca -67.192.168.112 - 67.192.168.119 us -67.192.168.120 - 67.192.168.127 se -67.192.168.128 - 67.192.168.191 us -67.192.168.192 - 67.192.168.207 ca -67.192.168.208 - 67.192.168.231 us -67.192.168.232 - 67.192.168.239 ca -67.192.168.240 - 67.192.168.255 in -67.192.169.0 - 67.192.169.47 us -67.192.169.48 - 67.192.169.55 au -67.192.169.56 - 67.192.169.191 us -67.192.169.192 - 67.192.169.199 mt -67.192.169.200 - 67.192.170.31 us -67.192.170.32 - 67.192.170.39 au -67.192.170.40 - 67.192.170.95 us -67.192.170.96 - 67.192.170.103 gb -67.192.170.104 - 67.192.170.127 us -67.192.170.128 - 67.192.170.135 ca -67.192.170.136 - 67.192.170.199 us -67.192.170.200 - 67.192.170.207 nz -67.192.170.208 - 67.192.171.103 us -67.192.171.104 - 67.192.171.111 il -67.192.171.112 - 67.192.171.183 us -67.192.171.184 - 67.192.171.191 mx -67.192.171.192 - 67.192.172.63 us -67.192.172.64 - 67.192.172.71 nz -67.192.172.72 - 67.192.172.167 us -67.192.172.168 - 67.192.172.175 au -67.192.172.176 - 67.192.172.247 us -67.192.172.248 - 67.192.172.255 dk -67.192.173.0 - 67.192.173.111 us -67.192.173.112 - 67.192.173.119 ca -67.192.173.120 - 67.192.173.175 us -67.192.173.176 - 67.192.173.183 cl -67.192.173.184 - 67.192.173.239 us -67.192.173.240 - 67.192.173.247 ca -67.192.173.248 - 67.192.174.191 us -67.192.174.192 - 67.192.174.255 au -67.192.175.0 - 67.192.175.95 us -67.192.175.96 - 67.192.175.103 ca -67.192.175.104 - 67.192.175.151 us -67.192.175.152 - 67.192.175.159 gb -67.192.175.160 - 67.192.176.15 us -67.192.176.16 - 67.192.176.23 in -67.192.176.24 - 67.192.176.87 us -67.192.176.88 - 67.192.176.103 ca -67.192.176.104 - 67.192.180.247 us -67.192.180.248 - 67.192.180.255 gb -67.192.181.0 - 67.192.181.7 ca -67.192.181.8 - 67.192.181.79 us -67.192.181.80 - 67.192.181.87 gb -67.192.181.88 - 67.192.181.151 us -67.192.181.152 - 67.192.181.159 at -67.192.181.160 - 67.192.181.191 us -67.192.181.192 - 67.192.181.199 gb -67.192.181.200 - 67.192.182.119 us -67.192.182.120 - 67.192.182.127 ca -67.192.182.128 - 67.192.183.47 us -67.192.183.48 - 67.192.183.55 ca -67.192.183.56 - 67.192.188.127 us -67.192.188.128 - 67.192.188.191 gb -67.192.188.192 - 67.192.192.39 us -67.192.192.40 - 67.192.192.47 ca -67.192.192.48 - 67.192.192.135 us -67.192.192.136 - 67.192.192.143 ca -67.192.192.144 - 67.192.193.15 us -67.192.193.16 - 67.192.193.23 in -67.192.193.24 - 67.192.193.31 ru -67.192.193.32 - 67.192.194.39 us -67.192.194.40 - 67.192.194.47 in -67.192.194.48 - 67.192.194.71 us -67.192.194.72 - 67.192.194.79 ca -67.192.194.80 - 67.192.194.183 us -67.192.194.184 - 67.192.194.191 mx -67.192.194.192 - 67.192.195.55 us -67.192.195.56 - 67.192.195.63 bm -67.192.195.64 - 67.192.195.151 us -67.192.195.152 - 67.192.195.159 gb -67.192.195.160 - 67.192.195.167 ca -67.192.195.168 - 67.192.195.191 us -67.192.195.192 - 67.192.195.255 ie -67.192.196.0 - 67.192.196.31 us -67.192.196.32 - 67.192.196.39 au -67.192.196.40 - 67.192.196.143 us -67.192.196.144 - 67.192.196.151 ca -67.192.196.152 - 67.192.197.119 us -67.192.197.120 - 67.192.197.127 au -67.192.197.128 - 67.192.198.15 us -67.192.198.16 - 67.192.198.23 gb -67.192.198.24 - 67.192.198.103 us -67.192.198.104 - 67.192.198.111 za -67.192.198.112 - 67.192.198.191 us -67.192.198.192 - 67.192.198.199 in -67.192.198.200 - 67.192.200.167 us -67.192.200.168 - 67.192.200.175 gb -67.192.200.176 - 67.192.200.191 us -67.192.200.192 - 67.192.200.199 br -67.192.200.200 - 67.192.201.7 us -67.192.201.8 - 67.192.201.15 sg -67.192.201.16 - 67.192.201.47 us -67.192.201.48 - 67.192.201.55 ca -67.192.201.56 - 67.192.201.199 us -67.192.201.200 - 67.192.201.207 ca -67.192.201.208 - 67.192.204.71 us -67.192.204.72 - 67.192.204.79 gb -67.192.204.80 - 67.192.205.7 us -67.192.205.8 - 67.192.205.15 gb -67.192.205.16 - 67.192.205.159 us -67.192.205.160 - 67.192.205.167 bd -67.192.205.168 - 67.192.208.15 us -67.192.208.16 - 67.192.208.23 ca -67.192.208.24 - 67.192.208.47 us -67.192.208.48 - 67.192.208.63 au -67.192.208.64 - 67.192.208.135 us -67.192.208.136 - 67.192.208.143 gb -67.192.208.144 - 67.192.208.183 us -67.192.208.184 - 67.192.208.191 ca -67.192.208.192 - 67.192.209.39 us -67.192.209.40 - 67.192.209.47 ca -67.192.209.48 - 67.192.210.47 us -67.192.210.48 - 67.192.210.55 gb -67.192.210.56 - 67.192.211.15 us -67.192.211.16 - 67.192.211.31 au -67.192.211.32 - 67.192.215.55 us -67.192.215.56 - 67.192.215.63 za -67.192.215.64 - 67.192.216.247 us -67.192.216.248 - 67.192.216.255 gb -67.192.217.0 - 67.192.217.55 us -67.192.217.56 - 67.192.217.63 au -67.192.217.64 - 67.192.219.159 us -67.192.219.160 - 67.192.219.167 gb -67.192.219.168 - 67.192.219.247 us -67.192.219.248 - 67.192.219.255 ca -67.192.220.0 - 67.192.221.31 us -67.192.221.32 - 67.192.221.39 ca -67.192.221.40 - 67.192.221.127 us -67.192.221.128 - 67.192.221.143 ca -67.192.221.144 - 67.192.221.191 us -67.192.221.192 - 67.192.221.207 ca -67.192.221.208 - 67.192.222.255 us -67.192.223.0 - 67.192.223.7 sg -67.192.223.8 - 67.192.223.111 us -67.192.223.112 - 67.192.223.119 ca -67.192.223.120 - 67.192.224.191 us -67.192.224.192 - 67.192.224.207 no -67.192.224.208 - 67.192.225.47 us -67.192.225.48 - 67.192.225.55 br -67.192.225.56 - 67.192.225.183 us -67.192.225.184 - 67.192.225.191 ie -67.192.225.192 - 67.192.226.15 us -67.192.226.16 - 67.192.226.23 gb -67.192.226.24 - 67.192.226.31 us -67.192.226.32 - 67.192.226.39 gb -67.192.226.40 - 67.192.227.143 us -67.192.227.144 - 67.192.227.151 de -67.192.227.152 - 67.192.227.175 us -67.192.227.176 - 67.192.227.183 cn -67.192.227.184 - 67.192.229.127 us -67.192.229.128 - 67.192.229.143 mx -67.192.229.144 - 67.192.231.103 us -67.192.231.104 - 67.192.231.111 au -67.192.231.112 - 67.192.233.255 us -67.192.234.0 - 67.192.234.7 za -67.192.234.8 - 67.192.234.143 us -67.192.234.144 - 67.192.234.151 in -67.192.234.152 - 67.192.234.159 us -67.192.234.160 - 67.192.234.191 ca -67.192.234.192 - 67.192.235.87 us -67.192.235.88 - 67.192.235.95 au -67.192.235.96 - 67.192.235.159 us -67.192.235.160 - 67.192.235.167 in -67.192.235.168 - 67.192.235.215 us -67.192.235.216 - 67.192.235.223 ca -67.192.235.224 - 67.192.235.231 us -67.192.235.232 - 67.192.235.239 nz -67.192.235.240 - 67.192.235.255 us -67.192.236.0 - 67.192.236.31 vi -67.192.236.32 - 67.192.237.111 us -67.192.237.112 - 67.192.237.127 it -67.192.237.128 - 67.192.238.87 us -67.192.238.88 - 67.192.238.95 gb -67.192.238.96 - 67.192.238.239 us -67.192.238.240 - 67.192.238.247 ca -67.192.238.248 - 67.192.239.15 us -67.192.239.16 - 67.192.239.31 gb -67.192.239.32 - 67.192.240.111 us -67.192.240.112 - 67.192.240.119 ca -67.192.240.120 - 67.192.242.55 us -67.192.242.56 - 67.192.242.63 mx -67.192.242.64 - 67.192.242.103 us -67.192.242.104 - 67.192.242.111 in -67.192.242.112 - 67.192.242.151 us -67.192.242.152 - 67.192.242.159 in -67.192.242.160 - 67.192.243.167 us -67.192.243.168 - 67.192.243.175 au -67.192.243.176 - 67.192.243.199 us -67.192.243.200 - 67.192.243.207 ca -67.192.243.208 - 67.192.244.31 us -67.192.244.32 - 67.192.244.47 au -67.192.244.48 - 67.192.255.255 us +67.159.224.0 - 67.192.255.255 us 67.193.0.0 - 67.193.255.255 ca -67.194.0.0 - 67.198.160.255 us -67.198.161.0 - 67.198.162.255 nz -67.198.163.0 - 67.200.33.15 us -67.200.33.16 - 67.200.33.31 ie -67.200.33.32 - 67.200.33.63 us -67.200.33.64 - 67.200.33.127 ie -67.200.33.128 - 67.200.33.135 gb -67.200.33.136 - 67.200.33.143 us -67.200.33.144 - 67.200.33.151 gb -67.200.33.152 - 67.200.57.255 us +67.194.0.0 - 67.200.57.255 us 67.200.58.0 - 67.200.58.255 jp -67.200.59.0 - 67.201.33.159 us -67.201.33.160 - 67.201.33.175 nz -67.201.33.176 - 67.201.127.255 us +67.200.59.0 - 67.201.127.255 us 67.201.128.0 - 67.201.143.255 ca 67.201.144.0 - 67.201.159.255 us 67.201.160.0 - 67.201.191.255 ca -67.201.192.0 - 67.202.114.135 us -67.202.114.136 - 67.202.114.136 gb -67.202.114.137 - 67.202.223.255 us -67.202.224.0 - 67.202.225.175 ca -67.202.225.176 - 67.202.225.191 us -67.202.225.192 - 67.202.227.255 ca +67.201.192.0 - 67.202.226.127 us +67.202.226.128 - 67.202.226.159 ca +67.202.226.160 - 67.202.226.255 us +67.202.227.0 - 67.202.227.255 ca 67.202.228.0 - 67.202.251.255 us -67.202.252.0 - 67.202.252.79 ca -67.202.252.80 - 67.202.252.95 us -67.202.252.96 - 67.202.252.111 ca -67.202.252.112 - 67.202.252.127 us -67.202.252.128 - 67.202.252.207 ca -67.202.252.208 - 67.202.252.223 us -67.202.252.224 - 67.202.252.255 ca -67.202.253.0 - 67.202.253.127 us -67.202.253.128 - 67.202.253.191 ca -67.202.253.192 - 67.203.0.31 us -67.203.0.32 - 67.203.0.47 de -67.203.0.48 - 67.203.24.31 us -67.203.24.32 - 67.203.24.47 de -67.203.24.48 - 67.203.191.255 us +67.202.252.0 - 67.202.253.31 ca +67.202.253.32 - 67.202.253.63 us +67.202.253.64 - 67.202.253.79 ca +67.202.253.80 - 67.202.253.111 us +67.202.253.112 - 67.202.253.159 ca +67.202.253.160 - 67.202.253.207 us +67.202.253.208 - 67.202.253.231 ca +67.202.253.232 - 67.202.253.239 us +67.202.253.240 - 67.202.253.255 ca +67.202.254.0 - 67.203.191.255 us 67.203.192.0 - 67.203.255.255 pr 67.204.0.0 - 67.204.63.255 ca 67.204.64.0 - 67.204.191.255 us @@ -25852,2185 +16334,366 @@ 67.205.64.0 - 67.205.127.255 ca 67.205.128.0 - 67.206.191.255 us 67.206.192.0 - 67.206.255.255 pr -67.207.0.0 - 67.207.207.255 us -67.207.208.0 - 67.207.223.255 a1 -67.207.224.0 - 67.208.0.7 us -67.208.0.8 - 67.208.1.71 ca -67.208.1.72 - 67.208.1.79 us -67.208.1.80 - 67.208.1.167 ca -67.208.1.168 - 67.208.1.175 nl -67.208.1.176 - 67.208.1.231 ca -67.208.1.232 - 67.208.1.239 us -67.208.1.240 - 67.208.2.255 ca -67.208.3.0 - 67.208.3.7 us -67.208.3.8 - 67.208.3.39 ca -67.208.3.40 - 67.208.3.63 us -67.208.3.64 - 67.208.3.151 ca -67.208.3.152 - 67.208.3.159 us -67.208.3.160 - 67.208.3.175 ca -67.208.3.176 - 67.208.3.183 us -67.208.3.184 - 67.208.3.215 ca -67.208.3.216 - 67.208.3.223 us -67.208.3.224 - 67.208.5.7 ca -67.208.5.8 - 67.208.5.23 us -67.208.5.24 - 67.208.5.79 ca -67.208.5.80 - 67.208.5.119 us -67.208.5.120 - 67.208.5.135 ca -67.208.5.136 - 67.208.5.143 us -67.208.5.144 - 67.208.7.23 ca -67.208.7.24 - 67.208.7.39 us -67.208.7.40 - 67.208.7.55 ca -67.208.7.56 - 67.208.7.71 us -67.208.7.72 - 67.208.7.79 ca -67.208.7.80 - 67.208.7.87 us -67.208.7.88 - 67.208.7.127 ca -67.208.7.128 - 67.208.7.135 us -67.208.7.136 - 67.208.7.151 ca -67.208.7.152 - 67.208.7.191 us -67.208.7.192 - 67.208.7.239 ca -67.208.7.240 - 67.208.7.255 us -67.208.8.0 - 67.208.8.63 ca -67.208.8.64 - 67.208.8.87 us -67.208.8.88 - 67.208.8.119 ca -67.208.8.120 - 67.208.8.135 us -67.208.8.136 - 67.208.8.143 ca -67.208.8.144 - 67.208.8.151 nl -67.208.8.152 - 67.208.8.183 us -67.208.8.184 - 67.208.8.191 ca -67.208.8.192 - 67.208.8.199 nl -67.208.8.200 - 67.208.8.215 us -67.208.8.216 - 67.208.8.247 ca -67.208.8.248 - 67.208.8.255 us -67.208.9.0 - 67.208.9.255 ca -67.208.10.0 - 67.208.10.55 us -67.208.10.56 - 67.208.10.63 nl -67.208.10.64 - 67.208.10.103 ca -67.208.10.104 - 67.208.10.127 us -67.208.10.128 - 67.208.10.143 ca -67.208.10.144 - 67.208.10.159 us -67.208.10.160 - 67.208.10.175 ca -67.208.10.176 - 67.208.10.199 nl -67.208.10.200 - 67.208.10.207 ca -67.208.10.208 - 67.208.10.223 us -67.208.10.224 - 67.208.10.239 ca -67.208.10.240 - 67.208.12.119 us -67.208.12.120 - 67.208.12.135 ca -67.208.12.136 - 67.208.12.143 us -67.208.12.144 - 67.208.12.151 ca -67.208.12.152 - 67.208.12.175 us -67.208.12.176 - 67.208.12.183 ca -67.208.12.184 - 67.208.12.215 us -67.208.12.216 - 67.208.12.223 ca -67.208.12.224 - 67.208.12.247 us -67.208.12.248 - 67.208.12.255 ca -67.208.13.0 - 67.208.14.255 us -67.208.15.0 - 67.208.15.127 ca -67.208.15.128 - 67.208.15.143 us -67.208.15.144 - 67.208.15.151 ca -67.208.15.152 - 67.208.15.159 us -67.208.15.160 - 67.208.15.207 ca -67.208.15.208 - 67.208.15.223 us -67.208.15.224 - 67.208.15.255 ca -67.208.16.0 - 67.208.16.255 us -67.208.17.0 - 67.208.17.39 ca -67.208.17.40 - 67.208.17.47 us -67.208.17.48 - 67.208.17.71 ca -67.208.17.72 - 67.208.17.79 us -67.208.17.80 - 67.208.17.87 ca -67.208.17.88 - 67.208.17.95 us -67.208.17.96 - 67.208.17.111 ca -67.208.17.112 - 67.208.17.119 us -67.208.17.120 - 67.208.17.127 ca -67.208.17.128 - 67.208.17.135 us -67.208.17.136 - 67.208.17.151 ca -67.208.17.152 - 67.208.17.175 us -67.208.17.176 - 67.208.19.7 ca -67.208.19.8 - 67.208.19.15 us -67.208.19.16 - 67.208.19.79 ca -67.208.19.80 - 67.208.19.87 us -67.208.19.88 - 67.208.19.135 ca -67.208.19.136 - 67.208.19.143 nl -67.208.19.144 - 67.208.20.7 ca -67.208.20.8 - 67.208.20.15 us -67.208.20.16 - 67.208.20.71 ca -67.208.20.72 - 67.208.20.79 us -67.208.20.80 - 67.208.20.95 ca -67.208.20.96 - 67.208.20.103 us -67.208.20.104 - 67.208.20.111 ca -67.208.20.112 - 67.208.20.119 nl -67.208.20.120 - 67.208.20.135 ca -67.208.20.136 - 67.208.20.151 us -67.208.20.152 - 67.208.20.159 nl -67.208.20.160 - 67.208.20.167 us -67.208.20.168 - 67.208.20.215 ca -67.208.20.216 - 67.208.20.231 us -67.208.20.232 - 67.208.22.255 ca -67.208.23.0 - 67.208.23.111 us -67.208.23.112 - 67.208.23.119 ca -67.208.23.120 - 67.208.24.31 us -67.208.24.32 - 67.208.24.63 ca -67.208.24.64 - 67.208.24.71 us -67.208.24.72 - 67.208.24.87 ca -67.208.24.88 - 67.208.24.95 nl -67.208.24.96 - 67.208.24.103 ca -67.208.24.104 - 67.208.24.111 nl -67.208.24.112 - 67.208.24.119 us -67.208.24.120 - 67.208.24.127 ca -67.208.24.128 - 67.208.24.135 nl -67.208.24.136 - 67.208.24.143 us -67.208.24.144 - 67.208.24.151 ca -67.208.24.152 - 67.208.24.159 nl -67.208.24.160 - 67.208.24.175 us -67.208.24.176 - 67.208.24.183 nl -67.208.24.184 - 67.208.24.191 us -67.208.24.192 - 67.208.24.199 nl -67.208.24.200 - 67.208.24.231 us -67.208.24.232 - 67.208.25.7 ca -67.208.25.8 - 67.208.25.15 us -67.208.25.16 - 67.208.25.39 ca -67.208.25.40 - 67.208.25.47 us -67.208.25.48 - 67.208.25.79 ca -67.208.25.80 - 67.208.25.95 us -67.208.25.96 - 67.208.25.111 ca -67.208.25.112 - 67.208.25.127 us -67.208.25.128 - 67.208.25.143 ca -67.208.25.144 - 67.208.25.151 us -67.208.25.152 - 67.208.25.199 ca -67.208.25.200 - 67.208.25.207 us -67.208.25.208 - 67.208.25.215 ca -67.208.25.216 - 67.208.26.23 us -67.208.26.24 - 67.208.26.31 ca -67.208.26.32 - 67.208.26.39 us -67.208.26.40 - 67.208.26.71 ca -67.208.26.72 - 67.208.26.87 us -67.208.26.88 - 67.208.26.127 ca -67.208.26.128 - 67.208.26.135 us -67.208.26.136 - 67.208.26.143 ca -67.208.26.144 - 67.208.26.151 us -67.208.26.152 - 67.208.26.175 ca -67.208.26.176 - 67.208.26.191 us -67.208.26.192 - 67.208.26.247 ca -67.208.26.248 - 67.208.26.255 us -67.208.27.0 - 67.208.27.135 ca -67.208.27.136 - 67.208.27.143 us -67.208.27.144 - 67.208.27.183 ca -67.208.27.184 - 67.208.27.247 us -67.208.27.248 - 67.208.27.255 ca -67.208.28.0 - 67.208.28.7 us -67.208.28.8 - 67.208.28.23 ca -67.208.28.24 - 67.208.28.55 us -67.208.28.56 - 67.208.28.63 ca -67.208.28.64 - 67.208.28.87 us -67.208.28.88 - 67.208.28.95 ca -67.208.28.96 - 67.208.28.111 us -67.208.28.112 - 67.208.28.127 ca -67.208.28.128 - 67.208.28.135 us -67.208.28.136 - 67.208.28.151 ca -67.208.28.152 - 67.208.28.159 us -67.208.28.160 - 67.208.28.167 ca -67.208.28.168 - 67.208.28.199 us -67.208.28.200 - 67.208.28.215 ca -67.208.28.216 - 67.208.28.231 us -67.208.28.232 - 67.208.28.255 ca -67.208.29.0 - 67.208.30.31 us -67.208.30.32 - 67.208.30.47 ca -67.208.30.48 - 67.208.30.71 us -67.208.30.72 - 67.208.30.79 ca -67.208.30.80 - 67.208.30.119 us -67.208.30.120 - 67.208.30.127 ca -67.208.30.128 - 67.208.31.23 us -67.208.31.24 - 67.208.31.31 ca -67.208.31.32 - 67.208.31.63 us -67.208.31.64 - 67.208.31.79 ca -67.208.31.80 - 67.208.31.119 us -67.208.31.120 - 67.208.31.127 ca -67.208.31.128 - 67.208.31.175 us -67.208.31.176 - 67.208.31.191 ca -67.208.31.192 - 67.208.31.207 us -67.208.31.208 - 67.208.31.215 ca -67.208.31.216 - 67.208.31.231 us -67.208.31.232 - 67.208.31.239 ca -67.208.31.240 - 67.208.76.79 us -67.208.76.80 - 67.208.76.95 ca -67.208.76.96 - 67.208.76.127 us -67.208.76.128 - 67.208.76.159 ca -67.208.76.160 - 67.208.76.191 us -67.208.76.192 - 67.208.76.207 ca -67.208.76.208 - 67.208.76.239 us -67.208.76.240 - 67.208.77.15 ca -67.208.77.16 - 67.208.77.31 us -67.208.77.32 - 67.208.77.47 ca -67.208.77.48 - 67.208.77.175 us -67.208.77.176 - 67.208.77.191 ca -67.208.77.192 - 67.208.77.239 us -67.208.77.240 - 67.208.77.255 ca -67.208.78.0 - 67.208.207.255 us +67.207.0.0 - 67.207.162.63 us +67.207.162.64 - 67.207.162.79 ua +67.207.162.80 - 67.207.255.255 us +67.208.0.0 - 67.208.28.255 ca +67.208.29.0 - 67.208.29.255 us +67.208.30.0 - 67.208.31.255 ca +67.208.32.0 - 67.208.207.255 us 67.208.208.0 - 67.208.208.255 gb -67.208.209.0 - 67.208.209.31 us -67.208.209.32 - 67.208.209.63 au -67.208.209.64 - 67.208.209.207 us -67.208.209.208 - 67.208.209.223 ch -67.208.209.224 - 67.209.59.255 us -67.209.60.0 - 67.209.60.255 hu -67.209.61.0 - 67.209.95.255 us +67.208.209.0 - 67.209.95.255 us 67.209.96.0 - 67.209.111.255 a2 -67.209.112.0 - 67.209.128.255 us -67.209.129.0 - 67.209.129.255 ca -67.209.130.0 - 67.210.15.255 us +67.209.112.0 - 67.209.255.255 us 67.210.16.0 - 67.210.16.255 ca -67.210.17.0 - 67.210.29.255 us -67.210.30.0 - 67.210.30.63 no -67.210.30.64 - 67.210.127.255 us +67.210.17.0 - 67.210.127.255 us 67.210.128.0 - 67.210.143.255 ca 67.210.144.0 - 67.210.159.255 us 67.210.160.0 - 67.210.175.255 ca 67.210.176.0 - 67.210.207.255 us 67.210.208.0 - 67.210.223.255 ca -67.210.224.0 - 67.210.225.159 us -67.210.225.160 - 67.210.225.167 es -67.210.225.168 - 67.210.225.175 us -67.210.225.176 - 67.210.225.191 ar -67.210.225.192 - 67.210.225.199 co -67.210.225.200 - 67.210.225.239 us -67.210.225.240 - 67.210.225.255 sz -67.210.226.0 - 67.210.227.127 us -67.210.227.128 - 67.210.227.135 co -67.210.227.136 - 67.210.227.143 us -67.210.227.144 - 67.210.227.151 gb -67.210.227.152 - 67.210.227.167 co -67.210.227.168 - 67.210.227.175 us -67.210.227.176 - 67.210.227.183 co -67.210.227.184 - 67.210.228.127 us -67.210.228.128 - 67.210.228.135 co -67.210.228.136 - 67.210.228.207 us -67.210.228.208 - 67.210.228.215 do -67.210.228.216 - 67.210.231.95 us -67.210.231.96 - 67.210.231.127 au -67.210.231.128 - 67.210.231.143 us -67.210.231.144 - 67.210.231.151 au -67.210.231.152 - 67.210.233.63 us -67.210.233.64 - 67.210.233.71 co -67.210.233.72 - 67.210.235.127 us -67.210.235.128 - 67.210.235.135 es -67.210.235.136 - 67.210.235.159 us -67.210.235.160 - 67.210.235.167 in -67.210.235.168 - 67.210.252.15 us -67.210.252.16 - 67.210.252.23 gb -67.210.252.24 - 67.210.255.15 us -67.210.255.16 - 67.210.255.23 gb -67.210.255.24 - 67.211.63.255 us +67.210.224.0 - 67.211.63.255 us 67.211.64.0 - 67.211.79.255 ca 67.211.80.0 - 67.211.95.255 us -67.211.96.0 - 67.211.99.255 ca -67.211.100.0 - 67.211.100.255 aw -67.211.101.0 - 67.211.101.71 ca -67.211.101.72 - 67.211.101.79 ag -67.211.101.80 - 67.211.101.255 ca -67.211.102.0 - 67.211.102.127 cr -67.211.102.128 - 67.211.102.255 ca -67.211.103.0 - 67.211.103.127 vg -67.211.103.128 - 67.211.103.255 pa -67.211.104.0 - 67.211.104.63 ca -67.211.104.64 - 67.211.104.127 bz -67.211.104.128 - 67.211.109.255 ca +67.211.96.0 - 67.211.109.255 ca 67.211.110.0 - 67.211.110.255 ie -67.211.111.0 - 67.211.111.159 ca -67.211.111.160 - 67.211.111.175 mt -67.211.111.176 - 67.211.127.255 ca -67.211.128.0 - 67.211.174.33 us -67.211.174.34 - 67.211.174.41 de -67.211.174.42 - 67.211.175.217 us -67.211.175.218 - 67.211.175.225 no -67.211.175.226 - 67.211.192.255 us -67.211.193.0 - 67.211.193.255 ca -67.211.194.0 - 67.211.200.255 us -67.211.201.0 - 67.211.207.255 ca -67.211.208.0 - 67.211.239.255 us +67.211.111.0 - 67.211.127.255 ca +67.211.128.0 - 67.211.191.255 us +67.211.192.0 - 67.211.197.255 ca +67.211.198.0 - 67.211.199.255 us +67.211.200.0 - 67.211.205.255 ca +67.211.206.0 - 67.211.239.255 us 67.211.240.0 - 67.211.255.255 vi 67.212.0.0 - 67.212.31.255 ca 67.212.32.0 - 67.212.63.255 us 67.212.64.0 - 67.212.95.255 ca -67.212.96.0 - 67.212.128.191 us -67.212.128.192 - 67.212.128.223 ca -67.212.128.224 - 67.212.134.111 us -67.212.134.112 - 67.212.134.127 ca -67.212.134.128 - 67.213.63.255 us +67.212.96.0 - 67.213.63.255 us 67.213.64.0 - 67.213.81.255 ca 67.213.82.0 - 67.213.82.255 us 67.213.83.0 - 67.213.111.255 ca -67.213.112.0 - 67.214.255.255 us -67.215.0.0 - 67.215.0.255 ca -67.215.1.0 - 67.215.1.7 ma -67.215.1.8 - 67.215.1.15 ke -67.215.1.16 - 67.215.1.23 ca -67.215.1.24 - 67.215.1.31 hr -67.215.1.32 - 67.215.1.39 pa -67.215.1.40 - 67.215.1.47 fr -67.215.1.48 - 67.215.1.159 ca -67.215.1.160 - 67.215.1.183 fr -67.215.1.184 - 67.215.1.207 ca -67.215.1.208 - 67.215.1.215 sk -67.215.1.216 - 67.215.1.223 ph -67.215.1.224 - 67.215.1.231 pk -67.215.1.232 - 67.215.1.239 ca -67.215.1.240 - 67.215.1.247 us -67.215.1.248 - 67.215.1.255 es -67.215.2.0 - 67.215.2.31 ca -67.215.2.32 - 67.215.2.39 lb -67.215.2.40 - 67.215.2.47 fr -67.215.2.48 - 67.215.2.55 ph -67.215.2.56 - 67.215.2.103 ca -67.215.2.104 - 67.215.2.111 pa -67.215.2.112 - 67.215.2.143 ca -67.215.2.144 - 67.215.2.151 ph -67.215.2.152 - 67.215.2.175 fr -67.215.2.176 - 67.215.3.31 ca -67.215.3.32 - 67.215.3.63 fr -67.215.3.64 - 67.215.3.103 ca -67.215.3.104 - 67.215.3.111 nz -67.215.3.112 - 67.215.3.175 ca -67.215.3.176 - 67.215.3.183 ma -67.215.3.184 - 67.215.4.79 ca -67.215.4.80 - 67.215.4.87 us -67.215.4.88 - 67.215.4.95 ca -67.215.4.96 - 67.215.4.103 ph -67.215.4.104 - 67.215.4.127 ca -67.215.4.128 - 67.215.4.255 us -67.215.5.0 - 67.215.6.63 ca -67.215.6.64 - 67.215.6.71 us -67.215.6.72 - 67.215.6.183 ca -67.215.6.184 - 67.215.6.191 lb -67.215.6.192 - 67.215.6.239 ca -67.215.6.240 - 67.215.6.255 sk -67.215.7.0 - 67.215.8.47 ca -67.215.8.48 - 67.215.8.55 fr -67.215.8.56 - 67.215.8.63 ch -67.215.8.64 - 67.215.8.135 ca -67.215.8.136 - 67.215.8.143 lb -67.215.8.144 - 67.215.8.175 ca -67.215.8.176 - 67.215.8.183 il -67.215.8.184 - 67.215.8.199 ca -67.215.8.200 - 67.215.8.215 fr -67.215.8.216 - 67.215.8.223 us -67.215.8.224 - 67.215.9.167 ca -67.215.9.168 - 67.215.9.175 fr -67.215.9.176 - 67.215.9.183 ca -67.215.9.184 - 67.215.9.191 fr -67.215.9.192 - 67.215.10.255 ca -67.215.11.0 - 67.215.11.7 tr -67.215.11.8 - 67.215.11.111 ca -67.215.11.112 - 67.215.11.119 fr -67.215.11.120 - 67.215.11.127 ca -67.215.11.128 - 67.215.11.135 fr -67.215.11.136 - 67.215.11.143 lb -67.215.11.144 - 67.215.11.175 ca -67.215.11.176 - 67.215.11.183 fr -67.215.11.184 - 67.215.11.191 ae -67.215.11.192 - 67.215.12.35 ca -67.215.12.36 - 67.215.12.39 pa -67.215.12.40 - 67.215.12.95 ca -67.215.12.96 - 67.215.12.103 ru -67.215.12.104 - 67.215.12.135 ca -67.215.12.136 - 67.215.12.143 ph -67.215.12.144 - 67.215.12.167 ca -67.215.12.168 - 67.215.12.175 lu -67.215.12.176 - 67.215.12.183 ca -67.215.12.184 - 67.215.12.199 fr -67.215.12.200 - 67.215.12.207 se -67.215.12.208 - 67.215.12.215 ph -67.215.12.216 - 67.215.12.223 ca -67.215.12.224 - 67.215.12.231 fr -67.215.12.232 - 67.215.12.247 ca -67.215.12.248 - 67.215.12.255 fr -67.215.13.0 - 67.215.13.159 ma -67.215.13.160 - 67.215.13.167 ua -67.215.13.168 - 67.215.13.175 ae -67.215.13.176 - 67.215.13.179 ph -67.215.13.180 - 67.215.13.183 ca -67.215.13.184 - 67.215.13.199 ke -67.215.13.200 - 67.215.13.207 fr -67.215.13.208 - 67.215.14.247 ca -67.215.14.248 - 67.215.14.255 pa -67.215.15.0 - 67.215.15.223 ca -67.215.15.224 - 67.215.15.231 pa -67.215.15.232 - 67.215.15.239 il -67.215.15.240 - 67.215.15.247 ca -67.215.15.248 - 67.215.15.255 ma +67.213.112.0 - 67.213.143.255 us +67.213.144.0 - 67.213.159.255 jm +67.213.160.0 - 67.214.255.255 us +67.215.0.0 - 67.215.15.255 ca 67.215.16.0 - 67.215.47.255 us 67.215.48.0 - 67.215.63.255 ca -67.215.64.0 - 67.215.95.255 us +67.215.64.0 - 67.215.82.255 us +67.215.83.0 - 67.215.83.255 au +67.215.84.0 - 67.215.85.255 ca +67.215.86.0 - 67.215.86.255 za +67.215.87.0 - 67.215.95.255 us 67.215.96.0 - 67.215.111.255 pr 67.215.112.0 - 67.215.127.255 us 67.215.128.0 - 67.215.159.255 ca 67.215.160.0 - 67.215.191.255 us 67.215.192.0 - 67.215.207.255 ca -67.215.208.0 - 67.216.163.111 us -67.216.163.112 - 67.216.163.127 tn -67.216.163.128 - 67.217.165.143 us -67.217.165.144 - 67.217.165.159 gb -67.217.165.160 - 67.217.165.175 us -67.217.165.176 - 67.217.165.183 sg -67.217.165.184 - 67.218.223.255 us -67.218.224.0 - 67.218.224.31 ca -67.218.224.32 - 67.218.224.63 de -67.218.224.64 - 67.218.231.255 us +67.215.208.0 - 67.218.52.255 us +67.218.53.0 - 67.218.53.255 as +67.218.54.0 - 67.218.54.255 us +67.218.55.0 - 67.218.57.255 as +67.218.58.0 - 67.218.58.255 us +67.218.59.0 - 67.218.59.255 as +67.218.60.0 - 67.218.231.255 us 67.218.232.0 - 67.218.232.255 de -67.218.233.0 - 67.218.239.255 us -67.218.240.0 - 67.218.240.31 de -67.218.240.32 - 67.218.241.255 us -67.218.242.0 - 67.218.242.255 de -67.218.243.0 - 67.219.98.15 us -67.219.98.16 - 67.219.98.23 jm -67.219.98.24 - 67.219.98.47 us -67.219.98.48 - 67.219.98.55 mx -67.219.98.56 - 67.219.98.127 us -67.219.98.128 - 67.219.98.135 gb -67.219.98.136 - 67.219.98.159 us -67.219.98.160 - 67.219.98.167 do -67.219.98.168 - 67.219.98.247 us -67.219.98.248 - 67.219.98.255 be -67.219.99.0 - 67.219.101.47 us -67.219.101.48 - 67.219.101.71 gb -67.219.101.72 - 67.219.101.95 us -67.219.101.96 - 67.219.101.103 au -67.219.101.104 - 67.219.101.111 us -67.219.101.112 - 67.219.101.119 au -67.219.101.120 - 67.219.101.135 us -67.219.101.136 - 67.219.101.143 ru -67.219.101.144 - 67.219.101.167 us -67.219.101.168 - 67.219.101.175 eg -67.219.101.176 - 67.219.101.247 us -67.219.101.248 - 67.219.101.255 ru -67.219.102.0 - 67.219.102.39 us -67.219.102.40 - 67.219.102.47 de -67.219.102.48 - 67.219.102.79 us -67.219.102.80 - 67.219.102.87 au -67.219.102.88 - 67.219.102.95 gb -67.219.102.96 - 67.219.102.255 us -67.219.103.0 - 67.219.103.7 de -67.219.103.8 - 67.219.103.39 us -67.219.103.40 - 67.219.103.47 in -67.219.103.48 - 67.219.103.63 us -67.219.103.64 - 67.219.103.71 gr -67.219.103.72 - 67.219.103.87 us -67.219.103.88 - 67.219.103.95 ca -67.219.103.96 - 67.219.103.111 us -67.219.103.112 - 67.219.103.127 ca -67.219.103.128 - 67.219.103.191 us -67.219.103.192 - 67.219.103.199 ca -67.219.103.200 - 67.219.103.207 fr -67.219.103.208 - 67.219.103.215 cn -67.219.103.216 - 67.219.103.231 us -67.219.103.232 - 67.219.103.255 fr -67.219.104.0 - 67.219.108.63 us -67.219.108.64 - 67.219.108.111 fr -67.219.108.112 - 67.219.111.255 us -67.219.112.0 - 67.219.112.15 br -67.219.112.16 - 67.219.112.63 us -67.219.112.64 - 67.219.112.71 ca -67.219.112.72 - 67.219.126.15 us -67.219.126.16 - 67.219.126.31 au -67.219.126.32 - 67.219.126.47 in -67.219.126.48 - 67.219.126.127 us -67.219.126.128 - 67.219.126.143 pk -67.219.126.144 - 67.219.126.159 ar -67.219.126.160 - 67.219.126.175 ru -67.219.126.176 - 67.219.211.255 us -67.219.212.0 - 67.219.221.255 au -67.219.222.0 - 67.220.31.255 us +67.218.233.0 - 67.220.31.255 us 67.220.32.0 - 67.220.47.255 ca -67.220.48.0 - 67.220.64.255 us -67.220.65.0 - 67.220.65.63 gb -67.220.65.64 - 67.220.66.159 us -67.220.66.160 - 67.220.66.191 it -67.220.66.192 - 67.220.66.223 us -67.220.66.224 - 67.220.66.255 cr -67.220.67.0 - 67.220.67.31 us +67.220.48.0 - 67.220.67.31 us 67.220.67.32 - 67.220.67.47 it -67.220.67.48 - 67.220.67.63 us -67.220.67.64 - 67.220.67.127 id -67.220.67.128 - 67.220.67.191 us -67.220.67.192 - 67.220.67.223 cr -67.220.67.224 - 67.220.71.255 us +67.220.67.48 - 67.220.71.255 us 67.220.72.0 - 67.220.75.255 in -67.220.76.0 - 67.220.76.31 ca -67.220.76.32 - 67.220.76.63 us -67.220.76.64 - 67.220.76.127 in -67.220.76.128 - 67.220.76.255 my -67.220.77.0 - 67.220.77.63 ch -67.220.77.64 - 67.220.77.159 ro -67.220.77.160 - 67.220.81.255 us -67.220.82.0 - 67.220.82.31 id -67.220.82.32 - 67.220.82.255 us -67.220.83.0 - 67.220.83.31 id -67.220.83.32 - 67.220.83.255 us -67.220.84.0 - 67.220.84.31 id -67.220.84.32 - 67.220.208.255 us +67.220.76.0 - 67.220.143.255 us +67.220.144.0 - 67.220.144.255 ca +67.220.145.0 - 67.220.208.255 us 67.220.209.0 - 67.220.209.255 gb -67.220.210.0 - 67.220.224.255 us -67.220.225.0 - 67.220.225.255 ca -67.220.226.0 - 67.220.240.255 us -67.220.241.0 - 67.220.241.255 ca -67.220.242.0 - 67.221.143.255 us +67.220.210.0 - 67.220.253.255 us +67.220.254.0 - 67.220.254.255 nl +67.220.255.0 - 67.221.143.255 us 67.221.144.0 - 67.221.159.255 ca -67.221.160.0 - 67.221.169.255 us -67.221.170.0 - 67.221.170.255 be -67.221.171.0 - 67.221.228.3 us -67.221.228.4 - 67.221.228.27 it -67.221.228.28 - 67.222.128.13 us -67.222.128.14 - 67.222.128.84 ca -67.222.128.85 - 67.222.128.142 us -67.222.128.143 - 67.222.128.150 ca -67.222.128.151 - 67.222.128.214 us -67.222.128.215 - 67.222.128.222 ca -67.222.128.223 - 67.222.128.226 us -67.222.128.227 - 67.222.128.254 ca -67.222.128.255 - 67.222.129.15 us -67.222.129.16 - 67.222.129.33 mx -67.222.129.34 - 67.222.129.93 us -67.222.129.94 - 67.222.129.95 mx -67.222.129.96 - 67.222.129.99 us -67.222.129.100 - 67.222.129.101 mx -67.222.129.102 - 67.222.129.121 us -67.222.129.122 - 67.222.129.129 mx -67.222.129.130 - 67.222.129.141 us -67.222.129.142 - 67.222.129.149 eg -67.222.129.150 - 67.222.129.207 us -67.222.129.208 - 67.222.129.215 mx -67.222.129.216 - 67.222.129.227 us -67.222.129.228 - 67.222.129.235 gb -67.222.129.236 - 67.222.130.73 us -67.222.130.74 - 67.222.130.81 mx -67.222.130.82 - 67.222.130.97 us -67.222.130.98 - 67.222.130.105 cn -67.222.130.106 - 67.222.130.155 us -67.222.130.156 - 67.222.130.167 mx -67.222.130.168 - 67.222.131.25 us -67.222.131.26 - 67.222.131.33 mx -67.222.131.34 - 67.222.131.77 us -67.222.131.78 - 67.222.131.93 mx -67.222.131.94 - 67.222.131.141 us -67.222.131.142 - 67.222.131.173 gb -67.222.131.174 - 67.222.131.190 us -67.222.131.191 - 67.222.131.198 ch -67.222.131.199 - 67.222.131.206 gb -67.222.131.207 - 67.222.131.222 us -67.222.131.223 - 67.222.131.230 eg -67.222.131.231 - 67.222.133.85 us -67.222.133.86 - 67.222.133.101 eg -67.222.133.102 - 67.222.133.149 us -67.222.133.150 - 67.222.133.157 ma -67.222.133.158 - 67.222.133.233 us -67.222.133.234 - 67.222.133.241 ae -67.222.133.242 - 67.222.134.141 us -67.222.134.142 - 67.222.134.149 in -67.222.134.150 - 67.222.135.77 us -67.222.135.78 - 67.222.135.85 in -67.222.135.86 - 67.222.135.99 us -67.222.135.100 - 67.222.135.107 eg -67.222.135.108 - 67.222.135.149 us -67.222.135.150 - 67.222.135.157 eg -67.222.135.158 - 67.222.135.182 us -67.222.135.183 - 67.222.135.190 eg -67.222.135.191 - 67.222.135.198 in -67.222.135.199 - 67.222.135.211 us -67.222.135.212 - 67.222.135.220 ma -67.222.135.221 - 67.222.136.44 us -67.222.136.45 - 67.222.136.52 lk -67.222.136.53 - 67.222.136.121 us -67.222.136.122 - 67.222.136.129 in -67.222.136.130 - 67.222.136.224 us -67.222.136.225 - 67.222.136.240 eg -67.222.136.241 - 67.222.137.212 us -67.222.137.213 - 67.222.137.244 gb -67.222.137.245 - 67.222.139.9 us -67.222.139.10 - 67.222.139.75 gb -67.222.139.76 - 67.222.139.83 us -67.222.139.84 - 67.222.139.115 eg -67.222.139.116 - 67.222.139.119 us -67.222.139.120 - 67.222.139.127 eg -67.222.139.128 - 67.222.139.254 gb -67.222.139.255 - 67.222.140.127 us -67.222.140.128 - 67.222.140.192 pk -67.222.140.193 - 67.222.140.193 us -67.222.140.194 - 67.222.140.221 pk -67.222.140.222 - 67.222.143.9 us -67.222.143.10 - 67.222.143.135 es -67.222.143.136 - 67.222.143.235 us -67.222.143.236 - 67.222.143.243 eg -67.222.143.244 - 67.222.144.41 us -67.222.144.42 - 67.222.144.73 gb -67.222.144.74 - 67.222.144.137 us -67.222.144.138 - 67.222.144.169 gb -67.222.144.170 - 67.222.145.9 us -67.222.145.10 - 67.222.145.25 lk -67.222.145.26 - 67.222.145.58 gb -67.222.145.59 - 67.222.145.66 id -67.222.145.67 - 67.222.145.89 us -67.222.145.90 - 67.222.145.97 ma -67.222.145.98 - 67.222.145.113 us -67.222.145.114 - 67.222.145.121 id -67.222.145.122 - 67.222.145.129 ca -67.222.145.130 - 67.222.145.139 us -67.222.145.140 - 67.222.145.147 id -67.222.145.148 - 67.222.145.197 us -67.222.145.198 - 67.222.145.205 nz -67.222.145.206 - 67.222.145.213 id -67.222.145.214 - 67.222.145.221 us -67.222.145.222 - 67.222.145.229 id -67.222.145.230 - 67.222.145.237 lk -67.222.145.238 - 67.222.145.239 us -67.222.145.240 - 67.222.145.247 id -67.222.145.248 - 67.222.146.9 us -67.222.146.10 - 67.222.146.17 ma -67.222.146.18 - 67.222.146.49 gb -67.222.146.50 - 67.222.146.82 us -67.222.146.83 - 67.222.146.90 lk -67.222.146.91 - 67.222.146.143 us -67.222.146.144 - 67.222.146.159 eg -67.222.146.160 - 67.222.146.195 us -67.222.146.196 - 67.222.146.203 in -67.222.146.204 - 67.222.146.210 us -67.222.146.211 - 67.222.146.218 ph -67.222.146.219 - 67.222.147.9 us -67.222.147.10 - 67.222.147.41 gb -67.222.147.42 - 67.222.147.73 us -67.222.147.74 - 67.222.147.81 ma -67.222.147.82 - 67.222.147.89 id -67.222.147.90 - 67.222.147.97 us -67.222.147.98 - 67.222.147.105 eg -67.222.147.106 - 67.222.147.121 us -67.222.147.122 - 67.222.147.129 in -67.222.147.130 - 67.222.147.137 us -67.222.147.138 - 67.222.147.145 eg -67.222.147.146 - 67.222.147.174 us -67.222.147.175 - 67.222.147.214 gb -67.222.147.215 - 67.222.147.215 us -67.222.147.216 - 67.222.147.237 gb -67.222.147.238 - 67.222.148.9 us -67.222.148.10 - 67.222.148.131 eg -67.222.148.132 - 67.222.148.147 us -67.222.148.148 - 67.222.148.155 ae -67.222.148.156 - 67.222.149.9 us -67.222.149.10 - 67.222.149.17 ae -67.222.149.18 - 67.222.149.25 eg -67.222.149.26 - 67.222.149.57 us -67.222.149.58 - 67.222.149.65 in -67.222.149.66 - 67.222.149.86 us -67.222.149.87 - 67.222.149.118 gb -67.222.149.119 - 67.222.149.126 eg -67.222.149.127 - 67.222.149.197 us -67.222.149.198 - 67.222.149.213 eg -67.222.149.214 - 67.222.150.9 us -67.222.150.10 - 67.222.150.17 eg -67.222.150.18 - 67.222.150.57 us -67.222.150.58 - 67.222.150.65 eg -67.222.150.66 - 67.222.150.94 us -67.222.150.95 - 67.222.150.102 ma -67.222.150.103 - 67.222.150.110 ve -67.222.150.111 - 67.222.150.118 us -67.222.150.119 - 67.222.150.126 eg -67.222.150.127 - 67.222.150.138 us -67.222.150.139 - 67.222.150.146 lk -67.222.150.147 - 67.222.150.154 eg -67.222.150.155 - 67.222.150.182 us -67.222.150.183 - 67.222.150.190 ca -67.222.150.191 - 67.222.150.191 us -67.222.150.192 - 67.222.150.199 eg -67.222.150.200 - 67.222.151.49 us -67.222.151.50 - 67.222.151.57 lk -67.222.151.58 - 67.222.151.81 us -67.222.151.82 - 67.222.151.89 ma -67.222.151.90 - 67.222.151.145 us -67.222.151.146 - 67.222.151.161 eg -67.222.151.162 - 67.222.151.179 us -67.222.151.180 - 67.222.151.187 gb -67.222.151.188 - 67.222.152.41 us -67.222.152.42 - 67.222.152.49 lk -67.222.152.50 - 67.222.152.81 us -67.222.152.82 - 67.222.152.89 eg -67.222.152.90 - 67.222.152.145 us -67.222.152.146 - 67.222.152.153 eg -67.222.152.154 - 67.222.152.177 us -67.222.152.178 - 67.222.152.185 ca -67.222.152.186 - 67.222.152.207 us -67.222.152.208 - 67.222.152.215 lk -67.222.152.216 - 67.222.153.9 us -67.222.153.10 - 67.222.153.17 eg -67.222.153.18 - 67.222.153.37 us -67.222.153.38 - 67.222.153.45 in -67.222.153.46 - 67.222.153.81 us -67.222.153.82 - 67.222.153.89 eg -67.222.153.90 - 67.222.153.97 us -67.222.153.98 - 67.222.153.105 id -67.222.153.106 - 67.222.153.129 us -67.222.153.130 - 67.222.153.137 id -67.222.153.138 - 67.222.153.145 ma -67.222.153.146 - 67.222.153.189 us -67.222.153.190 - 67.222.153.197 ma -67.222.153.198 - 67.222.154.25 us -67.222.154.26 - 67.222.154.66 eg -67.222.154.67 - 67.222.154.169 us -67.222.154.170 - 67.222.154.201 eg -67.222.154.202 - 67.222.154.209 id -67.222.154.210 - 67.222.154.217 us -67.222.154.218 - 67.222.154.219 eg -67.222.154.220 - 67.222.155.25 us -67.222.155.26 - 67.222.155.89 eg -67.222.155.90 - 67.222.155.129 us -67.222.155.130 - 67.222.155.165 eg -67.222.155.166 - 67.222.155.189 us -67.222.155.190 - 67.222.155.209 gb -67.222.155.210 - 67.222.155.225 us -67.222.155.226 - 67.222.155.249 gb -67.222.155.250 - 67.222.156.9 us -67.222.156.10 - 67.222.156.73 eg -67.222.156.74 - 67.222.156.105 gb -67.222.156.106 - 67.222.156.137 us -67.222.156.138 - 67.222.156.145 eg -67.222.156.146 - 67.222.156.175 us -67.222.156.176 - 67.222.156.207 mx -67.222.156.208 - 67.222.156.223 us -67.222.156.224 - 67.222.156.239 gb -67.222.156.240 - 67.222.157.137 us -67.222.157.138 - 67.222.157.145 id -67.222.157.146 - 67.222.157.185 us -67.222.157.186 - 67.222.157.193 gb -67.222.157.194 - 67.222.158.109 us -67.222.158.110 - 67.222.158.254 gb -67.222.158.255 - 67.223.95.255 us -67.223.96.0 - 67.223.99.239 ca -67.223.99.240 - 67.223.99.255 my -67.223.100.0 - 67.223.101.71 ca -67.223.101.72 - 67.223.101.79 us -67.223.101.80 - 67.223.101.183 ca -67.223.101.184 - 67.223.101.191 us -67.223.101.192 - 67.223.101.215 ca -67.223.101.216 - 67.223.101.223 us -67.223.101.224 - 67.223.101.231 es -67.223.101.232 - 67.223.111.255 ca +67.221.160.0 - 67.223.63.255 us +67.223.64.0 - 67.223.111.255 ca 67.223.112.0 - 67.223.127.255 us 67.223.128.0 - 67.223.159.255 ca 67.223.160.0 - 67.224.79.255 us 67.224.80.0 - 67.224.95.255 ca -67.224.96.0 - 67.224.103.255 us -67.224.104.0 - 67.224.104.31 ca -67.224.104.32 - 67.224.104.111 us -67.224.104.112 - 67.224.104.127 ca -67.224.104.128 - 67.224.127.255 us +67.224.96.0 - 67.224.105.255 us +67.224.106.0 - 67.224.106.7 ca +67.224.106.8 - 67.224.107.255 us +67.224.108.0 - 67.224.108.255 ca +67.224.109.0 - 67.224.127.255 us 67.224.128.0 - 67.224.255.255 pr 67.225.0.0 - 67.225.127.255 ca -67.225.128.0 - 67.225.128.7 us -67.225.128.8 - 67.225.128.15 in -67.225.128.16 - 67.225.181.170 us -67.225.181.171 - 67.225.181.178 in -67.225.181.179 - 67.225.215.140 us -67.225.215.141 - 67.225.215.152 uy -67.225.215.153 - 67.225.247.27 us -67.225.247.28 - 67.225.247.35 gb -67.225.247.36 - 67.225.247.141 us -67.225.247.142 - 67.225.247.149 gb -67.225.247.150 - 67.226.127.255 us +67.225.128.0 - 67.226.127.255 us 67.226.128.0 - 67.226.207.255 ca 67.226.208.0 - 67.226.223.255 us 67.226.224.0 - 67.226.255.255 ca 67.227.0.0 - 67.229.255.255 us 67.230.0.0 - 67.230.31.255 gt 67.230.32.0 - 67.230.79.255 jm -67.230.80.0 - 67.230.81.255 us -67.230.82.0 - 67.230.86.127 pr -67.230.86.128 - 67.230.87.255 us -67.230.88.0 - 67.230.90.255 pr -67.230.91.0 - 67.230.95.255 us -67.230.96.0 - 67.230.111.255 gt -67.230.112.0 - 67.230.127.255 us -67.230.128.0 - 67.230.161.255 ca -67.230.162.0 - 67.230.162.255 gb -67.230.163.0 - 67.230.163.255 ca -67.230.164.0 - 67.230.164.255 gb -67.230.165.0 - 67.230.166.255 us -67.230.167.0 - 67.230.167.255 ca -67.230.168.0 - 67.230.168.255 us -67.230.169.0 - 67.230.174.255 ca -67.230.175.0 - 67.230.175.255 gb -67.230.176.0 - 67.230.176.255 ca -67.230.177.0 - 67.230.178.255 us -67.230.179.0 - 67.230.179.255 gb -67.230.180.0 - 67.230.181.127 us -67.230.181.128 - 67.230.182.255 ca -67.230.183.0 - 67.230.188.255 us -67.230.189.0 - 67.230.189.255 gb -67.230.190.0 - 67.230.191.127 us -67.230.191.128 - 67.230.191.255 ca -67.230.192.0 - 67.231.207.255 us +67.230.80.0 - 67.230.80.255 us +67.230.81.0 - 67.230.85.255 pr +67.230.86.0 - 67.230.87.255 us +67.230.88.0 - 67.230.89.255 pr +67.230.90.0 - 67.230.90.255 us +67.230.91.0 - 67.230.91.255 pr +67.230.92.0 - 67.230.127.255 us +67.230.128.0 - 67.230.191.255 ca +67.230.192.0 - 67.231.15.255 us +67.231.16.0 - 67.231.31.255 ca +67.231.32.0 - 67.231.207.255 us 67.231.208.0 - 67.231.223.255 ca -67.231.224.0 - 68.20.102.255 us -68.20.103.0 - 68.20.103.7 pr -68.20.103.8 - 68.20.118.231 us -68.20.118.232 - 68.20.118.239 pr -68.20.118.240 - 68.20.160.255 us -68.20.161.0 - 68.20.161.7 pr -68.20.161.8 - 68.20.166.199 us -68.20.166.200 - 68.20.166.207 pr -68.20.166.208 - 68.20.167.167 us -68.20.167.168 - 68.20.167.175 pr -68.20.167.176 - 68.64.45.191 us -68.64.45.192 - 68.64.45.207 co -68.64.45.208 - 68.66.47.255 us +67.231.224.0 - 68.64.213.13 us +68.64.213.14 - 68.64.213.15 sa +68.64.213.16 - 68.66.47.255 us 68.66.48.0 - 68.66.63.255 ca -68.66.64.0 - 68.67.31.255 us +68.66.64.0 - 68.67.1.255 us +68.67.2.0 - 68.67.2.255 no +68.67.3.0 - 68.67.5.255 us +68.67.6.0 - 68.67.6.255 eu +68.67.7.0 - 68.67.7.255 us +68.67.8.0 - 68.67.9.255 eu +68.67.10.0 - 68.67.10.255 no +68.67.11.0 - 68.67.31.255 us 68.67.32.0 - 68.67.63.255 ca -68.67.64.0 - 68.67.67.255 us -68.67.68.0 - 68.67.68.63 in -68.67.68.64 - 68.67.68.239 us +68.67.64.0 - 68.67.68.239 us 68.67.68.240 - 68.67.68.243 ae -68.67.68.244 - 68.67.68.255 us -68.67.69.0 - 68.67.69.63 in -68.67.69.64 - 68.67.69.159 us -68.67.69.160 - 68.67.69.191 ae -68.67.69.192 - 68.67.71.255 us -68.67.72.0 - 68.67.72.63 in -68.67.72.64 - 68.67.74.79 us -68.67.74.80 - 68.67.74.87 in -68.67.74.88 - 68.67.74.207 us -68.67.74.208 - 68.67.74.223 ae -68.67.74.224 - 68.67.75.255 us -68.67.76.0 - 68.67.76.63 in -68.67.76.64 - 68.67.76.255 us -68.67.77.0 - 68.67.77.63 in -68.67.77.64 - 68.67.77.95 us -68.67.77.96 - 68.67.77.127 ae -68.67.77.128 - 68.67.78.79 us -68.67.78.80 - 68.67.78.95 ae -68.67.78.96 - 68.67.255.255 us +68.67.68.244 - 68.67.175.255 us +68.67.176.0 - 68.67.177.255 sg +68.67.178.0 - 68.67.179.255 us +68.67.180.0 - 68.67.180.255 sg +68.67.181.0 - 68.67.181.255 us +68.67.182.0 - 68.67.182.255 sg +68.67.183.0 - 68.67.255.255 us 68.68.0.0 - 68.68.15.255 ca -68.68.16.0 - 68.68.101.39 us -68.68.101.40 - 68.68.101.47 it -68.68.101.48 - 68.68.101.199 us -68.68.101.200 - 68.68.101.207 cn -68.68.101.208 - 68.68.101.223 us -68.68.101.224 - 68.68.101.231 cn -68.68.101.232 - 68.68.101.247 us -68.68.101.248 - 68.68.101.255 cn -68.68.102.0 - 68.68.102.79 us -68.68.102.80 - 68.68.102.95 cn -68.68.102.96 - 68.68.102.103 us -68.68.102.104 - 68.68.102.111 cn -68.68.102.112 - 68.68.102.119 us -68.68.102.120 - 68.68.102.127 pa -68.68.102.128 - 68.68.102.255 bd -68.68.103.0 - 68.68.104.103 us -68.68.104.104 - 68.68.104.111 eg -68.68.104.112 - 68.68.104.119 us -68.68.104.120 - 68.68.104.143 cn -68.68.104.144 - 68.68.105.135 us -68.68.105.136 - 68.68.105.151 cn -68.68.105.152 - 68.68.105.159 us -68.68.105.160 - 68.68.105.207 cn -68.68.105.208 - 68.68.105.215 us -68.68.105.216 - 68.68.105.223 cn -68.68.105.224 - 68.68.109.63 us -68.68.109.64 - 68.68.109.95 nl -68.68.109.96 - 68.68.109.127 us -68.68.109.128 - 68.68.109.143 cn -68.68.109.144 - 68.68.109.175 us -68.68.109.176 - 68.68.109.183 cn -68.68.109.184 - 68.69.15.255 us +68.68.16.0 - 68.69.15.255 us 68.69.16.0 - 68.69.31.255 ca 68.69.32.0 - 68.69.127.255 us 68.69.128.0 - 68.69.159.255 ca 68.69.160.0 - 68.69.191.255 us 68.69.192.0 - 68.69.223.255 ca 68.69.224.0 - 68.70.143.255 us -68.70.144.0 - 68.70.151.23 ca -68.70.151.24 - 68.70.151.31 us -68.70.151.32 - 68.70.159.255 ca -68.70.160.0 - 68.70.177.63 us -68.70.177.64 - 68.70.177.71 vg -68.70.177.72 - 68.70.178.255 us -68.70.179.0 - 68.70.179.31 vg -68.70.179.32 - 68.70.255.255 us +68.70.144.0 - 68.70.159.255 ca +68.70.160.0 - 68.70.255.255 us 68.71.0.0 - 68.71.63.255 ca -68.71.64.0 - 68.71.191.255 us -68.71.192.0 - 68.71.207.255 ca -68.71.208.0 - 68.71.250.95 us -68.71.250.96 - 68.71.250.127 cn -68.71.250.128 - 68.140.67.255 us +68.71.64.0 - 68.140.67.255 us 68.140.68.0 - 68.140.71.255 va -68.140.72.0 - 68.140.79.255 us -68.140.80.0 - 68.140.95.255 jp -68.140.96.0 - 68.143.255.255 us +68.140.72.0 - 68.143.255.255 us 68.144.0.0 - 68.151.255.255 ca 68.152.0.0 - 68.168.111.255 us -68.168.112.0 - 68.168.112.15 ca -68.168.112.16 - 68.168.112.23 us -68.168.112.24 - 68.168.112.39 ca -68.168.112.40 - 68.168.112.47 fr -68.168.112.48 - 68.168.112.63 ca -68.168.112.64 - 68.168.112.79 ru -68.168.112.80 - 68.168.112.87 ca -68.168.112.88 - 68.168.112.127 ma -68.168.112.128 - 68.168.112.191 cn -68.168.112.192 - 68.168.112.199 ru -68.168.112.200 - 68.168.112.207 ca -68.168.112.208 - 68.168.112.223 ma -68.168.112.224 - 68.168.112.239 ca -68.168.112.240 - 68.168.112.255 ke -68.168.113.0 - 68.168.113.127 ca -68.168.113.128 - 68.168.113.159 ma -68.168.113.160 - 68.168.113.175 ca -68.168.113.176 - 68.168.113.183 ph -68.168.113.184 - 68.168.114.87 ca -68.168.114.88 - 68.168.114.95 gb -68.168.114.96 - 68.168.114.159 ca -68.168.114.160 - 68.168.114.167 gb -68.168.114.168 - 68.168.114.175 ca -68.168.114.176 - 68.168.114.207 gb -68.168.114.208 - 68.168.115.39 ca -68.168.115.40 - 68.168.115.47 gb -68.168.115.48 - 68.168.124.255 ca -68.168.125.0 - 68.168.125.255 ma -68.168.126.0 - 68.168.132.255 ca -68.168.133.0 - 68.168.133.255 us -68.168.134.0 - 68.168.134.255 ca -68.168.135.0 - 68.168.136.255 us -68.168.137.0 - 68.168.137.111 ca -68.168.137.112 - 68.168.137.127 us -68.168.137.128 - 68.168.138.15 ca -68.168.138.16 - 68.168.138.23 us -68.168.138.24 - 68.168.138.63 ca -68.168.138.64 - 68.168.138.127 us -68.168.138.128 - 68.168.138.255 ca -68.168.139.0 - 68.168.139.255 us -68.168.140.0 - 68.168.140.255 ca -68.168.141.0 - 68.169.69.63 us -68.169.69.64 - 68.169.69.127 hk -68.169.69.128 - 68.169.76.31 us -68.169.76.32 - 68.169.76.63 ie -68.169.76.64 - 68.171.63.255 us +68.168.112.0 - 68.168.143.255 ca +68.168.144.0 - 68.171.63.255 us 68.171.64.0 - 68.171.79.255 ca -68.171.80.0 - 68.171.95.255 us -68.171.96.0 - 68.171.96.255 au -68.171.97.0 - 68.171.97.127 in -68.171.97.128 - 68.171.97.255 us -68.171.98.0 - 68.171.98.255 au -68.171.99.0 - 68.171.106.255 us -68.171.107.0 - 68.171.107.255 in -68.171.108.0 - 68.178.255.255 us +68.171.80.0 - 68.171.108.160 us +68.171.108.161 - 68.171.108.176 kn +68.171.108.177 - 68.171.223.255 us +68.171.224.0 - 68.171.235.255 ca +68.171.236.0 - 68.171.236.192 il +68.171.236.193 - 68.171.236.193 ca +68.171.236.194 - 68.171.236.255 il +68.171.237.0 - 68.171.246.255 ca +68.171.247.0 - 68.171.247.255 us +68.171.248.0 - 68.171.255.255 ca +68.172.0.0 - 68.178.255.255 us 68.179.0.0 - 68.179.127.255 ca 68.179.128.0 - 68.181.255.255 us 68.182.0.0 - 68.182.255.255 ca -68.183.0.0 - 68.232.63.255 us +68.183.0.0 - 68.208.23.255 us +68.208.24.0 - 68.208.25.255 a2 +68.208.26.0 - 68.232.63.255 us 68.232.64.0 - 68.232.95.255 ca -68.232.96.0 - 68.233.34.199 us -68.233.34.200 - 68.233.34.207 sg -68.233.34.208 - 68.233.34.215 jp -68.233.34.216 - 68.233.34.223 us -68.233.34.224 - 68.233.35.255 ca -68.233.36.0 - 68.233.36.191 us -68.233.36.192 - 68.233.36.207 cy -68.233.36.208 - 68.233.36.223 us -68.233.36.224 - 68.233.37.255 ca -68.233.38.0 - 68.233.41.255 us -68.233.42.0 - 68.233.42.255 ca -68.233.43.0 - 68.235.47.255 us +68.232.96.0 - 68.234.223.255 us +68.234.224.0 - 68.234.231.255 ca +68.234.232.0 - 68.234.247.255 us +68.234.248.0 - 68.234.251.255 ca +68.234.252.0 - 68.235.47.255 us 68.235.48.0 - 68.235.55.255 ca 68.235.56.0 - 68.235.175.255 us 68.235.176.0 - 68.235.191.255 ca -68.235.192.0 - 69.0.166.31 us -69.0.166.32 - 69.0.166.63 ca -69.0.166.64 - 69.1.78.255 us -69.1.79.0 - 69.1.79.127 ca -69.1.79.128 - 69.1.232.255 us +68.235.192.0 - 69.1.232.255 us 69.1.233.0 - 69.1.233.255 gb -69.1.234.0 - 69.1.241.111 us -69.1.241.112 - 69.1.241.127 gr -69.1.241.128 - 69.1.252.255 us +69.1.234.0 - 69.1.252.255 us 69.1.253.0 - 69.1.253.255 ru -69.1.254.0 - 69.4.159.255 us +69.1.254.0 - 69.4.90.127 us +69.4.90.128 - 69.4.90.191 ca +69.4.90.192 - 69.4.94.82 us +69.4.94.83 - 69.4.94.90 in +69.4.94.91 - 69.4.94.122 us +69.4.94.123 - 69.4.94.130 in +69.4.94.131 - 69.4.94.146 us +69.4.94.147 - 69.4.94.154 in +69.4.94.155 - 69.4.159.255 us 69.4.160.0 - 69.4.175.255 bs 69.4.176.0 - 69.4.207.255 us 69.4.208.0 - 69.4.223.255 ca -69.4.224.0 - 69.4.237.199 us -69.4.237.200 - 69.4.237.255 hk -69.4.238.0 - 69.6.23.255 us +69.4.224.0 - 69.6.23.255 us 69.6.24.0 - 69.6.24.255 ca 69.6.25.0 - 69.6.27.255 us 69.6.28.0 - 69.6.28.255 ca -69.6.29.0 - 69.7.239.255 us +69.6.29.0 - 69.7.133.255 us +69.7.134.0 - 69.7.134.255 gb +69.7.135.0 - 69.7.239.255 us 69.7.240.0 - 69.7.255.255 ca 69.8.0.0 - 69.9.63.255 us 69.9.64.0 - 69.9.94.255 ca 69.9.95.0 - 69.9.95.255 us 69.9.96.0 - 69.9.124.255 ca -69.9.125.0 - 69.10.44.191 us -69.10.44.192 - 69.10.44.223 gb -69.10.44.224 - 69.10.48.255 us +69.9.125.0 - 69.10.48.255 us 69.10.49.0 - 69.10.49.255 gb 69.10.50.0 - 69.10.127.255 us -69.10.128.0 - 69.10.130.127 ca -69.10.130.128 - 69.10.130.191 a1 -69.10.130.192 - 69.10.138.255 ca -69.10.139.0 - 69.10.139.127 a1 -69.10.139.128 - 69.10.140.191 ca -69.10.140.192 - 69.10.140.255 a1 -69.10.141.0 - 69.10.142.255 ca -69.10.143.0 - 69.10.143.63 a1 -69.10.143.64 - 69.10.143.159 ca -69.10.143.160 - 69.10.143.175 sy -69.10.143.176 - 69.10.144.255 ca -69.10.145.0 - 69.10.145.127 a1 -69.10.145.128 - 69.10.145.191 ca -69.10.145.192 - 69.10.145.255 a1 -69.10.146.0 - 69.10.149.255 ca -69.10.150.0 - 69.10.150.127 a1 -69.10.150.128 - 69.10.153.239 ca -69.10.153.240 - 69.10.153.255 sy -69.10.154.0 - 69.10.157.79 ca -69.10.157.80 - 69.10.157.95 sy -69.10.157.96 - 69.10.157.239 ca -69.10.157.240 - 69.10.157.255 sy -69.10.158.0 - 69.10.159.159 ca -69.10.159.160 - 69.10.159.191 a1 -69.10.159.192 - 69.10.159.255 ca +69.10.128.0 - 69.10.138.255 ca +69.10.139.0 - 69.10.139.255 a1 +69.10.140.0 - 69.10.152.66 ca +69.10.152.67 - 69.10.152.67 us +69.10.152.68 - 69.10.159.255 ca 69.10.160.0 - 69.10.223.255 us -69.10.224.0 - 69.10.234.31 ca -69.10.234.32 - 69.10.234.63 us -69.10.234.64 - 69.10.239.255 ca +69.10.224.0 - 69.10.239.255 ca 69.10.240.0 - 69.10.255.255 us 69.11.0.0 - 69.11.127.255 ca -69.11.128.0 - 69.13.6.9 us -69.13.6.10 - 69.13.6.18 ca -69.13.6.19 - 69.13.6.19 us -69.13.6.20 - 69.13.6.28 ca -69.13.6.29 - 69.13.6.99 us -69.13.6.100 - 69.13.6.108 ca -69.13.6.109 - 69.13.6.189 us -69.13.6.190 - 69.13.6.198 ca -69.13.6.199 - 69.13.7.73 us -69.13.7.74 - 69.13.7.81 ca -69.13.7.82 - 69.13.33.209 us -69.13.33.210 - 69.13.33.222 il -69.13.33.223 - 69.13.35.1 us -69.13.35.2 - 69.13.35.14 il -69.13.35.15 - 69.13.53.1 us -69.13.53.2 - 69.13.53.126 ca -69.13.53.127 - 69.13.64.241 us -69.13.64.242 - 69.13.64.250 tc -69.13.64.251 - 69.13.65.18 us -69.13.65.19 - 69.13.65.27 ws -69.13.65.28 - 69.13.66.11 us -69.13.66.12 - 69.13.66.20 fj -69.13.66.21 - 69.13.66.29 be -69.13.66.30 - 69.13.66.38 us -69.13.66.39 - 69.13.66.47 pe -69.13.66.48 - 69.13.69.80 us -69.13.69.81 - 69.13.69.89 ch -69.13.69.90 - 69.13.69.116 us -69.13.69.117 - 69.13.69.125 ca -69.13.69.126 - 69.13.69.134 ge -69.13.69.135 - 69.13.69.234 us -69.13.69.235 - 69.13.69.243 ca -69.13.69.244 - 69.13.70.33 us -69.13.70.34 - 69.13.70.42 ge -69.13.70.43 - 69.13.70.73 ws -69.13.70.74 - 69.13.70.240 us -69.13.70.241 - 69.13.70.249 hk -69.13.70.250 - 69.13.71.234 us -69.13.71.235 - 69.13.71.243 mx -69.13.71.244 - 69.13.72.153 us -69.13.72.154 - 69.13.72.162 gr -69.13.72.163 - 69.13.73.218 us -69.13.73.219 - 69.13.73.227 it -69.13.73.228 - 69.13.75.99 us -69.13.75.100 - 69.13.75.107 vi -69.13.75.108 - 69.13.75.243 us -69.13.75.244 - 69.13.75.254 ca -69.13.75.255 - 69.13.76.54 us -69.13.76.55 - 69.13.76.63 as -69.13.76.64 - 69.13.76.72 nl -69.13.76.73 - 69.13.76.81 fr -69.13.76.82 - 69.13.77.0 us -69.13.77.1 - 69.13.77.254 ca -69.13.77.255 - 69.13.83.0 us -69.13.83.1 - 69.13.83.254 pr -69.13.83.255 - 69.13.97.71 us -69.13.97.72 - 69.13.97.80 ca -69.13.97.81 - 69.13.97.132 us -69.13.97.133 - 69.13.97.141 jm -69.13.97.142 - 69.13.97.159 us -69.13.97.160 - 69.13.97.168 gr -69.13.97.169 - 69.13.97.237 us -69.13.97.238 - 69.13.97.246 ca -69.13.97.247 - 69.13.97.247 us -69.13.97.248 - 69.13.97.255 ke -69.13.98.0 - 69.13.100.18 us -69.13.100.19 - 69.13.100.27 ca -69.13.100.28 - 69.13.100.181 us -69.13.100.182 - 69.13.100.255 au -69.13.101.0 - 69.13.105.41 us -69.13.105.42 - 69.13.105.57 in -69.13.105.58 - 69.13.128.101 us -69.13.128.102 - 69.13.128.110 pk -69.13.128.111 - 69.13.129.127 us -69.13.129.128 - 69.13.129.136 cr -69.13.129.137 - 69.13.129.154 us -69.13.129.155 - 69.13.129.163 as -69.13.129.164 - 69.13.129.174 us -69.13.129.175 - 69.13.129.183 as -69.13.129.184 - 69.13.130.210 us -69.13.130.211 - 69.13.130.219 tc -69.13.130.220 - 69.13.130.246 us -69.13.130.247 - 69.13.130.255 ca -69.13.131.0 - 69.13.131.192 us -69.13.131.193 - 69.13.131.201 ca -69.13.131.202 - 69.13.131.210 us -69.13.131.211 - 69.13.131.219 co -69.13.131.220 - 69.13.132.18 us -69.13.132.19 - 69.13.132.27 ca -69.13.132.28 - 69.13.132.92 us -69.13.132.93 - 69.13.132.101 tc -69.13.132.102 - 69.13.132.186 us -69.13.132.187 - 69.13.132.195 sz -69.13.132.196 - 69.13.132.213 us -69.13.132.214 - 69.13.132.222 bz -69.13.132.223 - 69.13.133.137 us -69.13.133.138 - 69.13.133.146 sn -69.13.133.147 - 69.13.133.155 us -69.13.133.156 - 69.13.133.164 mx -69.13.133.165 - 69.13.133.209 us -69.13.133.210 - 69.13.133.218 tw -69.13.133.219 - 69.13.134.155 us -69.13.134.156 - 69.13.134.164 ca -69.13.134.165 - 69.13.134.173 us -69.13.134.174 - 69.13.134.182 mx -69.13.134.183 - 69.13.134.191 us -69.13.134.192 - 69.13.134.200 ca -69.13.134.201 - 69.13.135.0 us -69.13.135.1 - 69.13.135.128 as -69.13.135.129 - 69.13.135.232 us -69.13.135.233 - 69.13.135.241 fr -69.13.135.242 - 69.13.136.99 us -69.13.136.100 - 69.13.136.108 as -69.13.136.109 - 69.13.138.73 us -69.13.138.74 - 69.13.138.82 bz -69.13.138.83 - 69.13.144.108 us -69.13.144.109 - 69.13.144.117 ca -69.13.144.118 - 69.13.144.123 us -69.13.144.124 - 69.13.144.132 au -69.13.144.133 - 69.13.144.202 us -69.13.144.203 - 69.13.144.211 ca -69.13.144.212 - 69.13.146.36 us -69.13.146.37 - 69.13.146.45 pk -69.13.146.46 - 69.13.146.178 us -69.13.146.179 - 69.13.146.187 bg -69.13.146.188 - 69.13.146.218 us -69.13.146.219 - 69.13.146.227 be -69.13.146.228 - 69.13.149.4 us -69.13.149.5 - 69.13.149.13 ca -69.13.149.14 - 69.13.149.91 us -69.13.149.92 - 69.13.149.100 th -69.13.149.101 - 69.13.149.230 us -69.13.149.231 - 69.13.149.239 ca -69.13.149.240 - 69.13.150.75 us -69.13.150.76 - 69.13.150.84 no -69.13.150.85 - 69.13.151.199 us -69.13.151.200 - 69.13.151.208 sz -69.13.151.209 - 69.13.152.0 us -69.13.152.1 - 69.13.152.254 no -69.13.152.255 - 69.13.153.9 us -69.13.153.10 - 69.13.153.18 ch -69.13.153.19 - 69.13.153.27 nl -69.13.153.28 - 69.13.154.177 us -69.13.154.178 - 69.13.154.187 ca -69.13.154.188 - 69.13.155.64 us -69.13.155.65 - 69.13.155.73 ws -69.13.155.74 - 69.13.155.206 us -69.13.155.207 - 69.13.155.224 ca -69.13.155.225 - 69.13.155.242 us -69.13.155.243 - 69.13.155.251 no -69.13.155.252 - 69.13.156.18 us -69.13.156.19 - 69.13.156.145 ws -69.13.156.146 - 69.13.158.221 us -69.13.158.222 - 69.13.158.230 is -69.13.158.231 - 69.13.177.0 us -69.13.177.1 - 69.13.177.136 be -69.13.177.137 - 69.13.179.45 us -69.13.179.46 - 69.13.179.54 bz -69.13.179.55 - 69.13.179.80 us -69.13.179.81 - 69.13.179.89 fr -69.13.179.90 - 69.13.179.125 us -69.13.179.126 - 69.13.179.134 it -69.13.179.135 - 69.13.181.89 us -69.13.181.90 - 69.13.181.98 it -69.13.181.99 - 69.13.181.127 us -69.13.181.128 - 69.13.181.136 fr -69.13.181.137 - 69.13.181.138 us -69.13.181.139 - 69.13.181.147 pe -69.13.181.148 - 69.13.181.149 us -69.13.181.150 - 69.13.181.158 ca -69.13.181.159 - 69.13.181.160 us -69.13.181.161 - 69.13.181.169 ch -69.13.181.170 - 69.13.183.210 us -69.13.183.211 - 69.13.183.243 as -69.13.183.244 - 69.13.184.11 us -69.13.184.12 - 69.13.184.20 my -69.13.184.21 - 69.13.184.92 us -69.13.184.93 - 69.13.184.101 ws -69.13.184.102 - 69.13.184.110 us -69.13.184.111 - 69.13.184.119 ca -69.13.184.120 - 69.13.184.121 us -69.13.184.122 - 69.13.184.130 ke -69.13.184.131 - 69.13.184.157 us -69.13.184.158 - 69.13.184.166 fr -69.13.184.167 - 69.13.184.240 us -69.13.184.241 - 69.13.184.249 ca -69.13.184.250 - 69.13.185.56 us -69.13.185.57 - 69.13.185.65 ca -69.13.185.66 - 69.13.185.74 us -69.13.185.75 - 69.13.185.83 ba -69.13.185.84 - 69.13.185.222 us -69.13.185.223 - 69.13.185.231 ir -69.13.185.232 - 69.13.187.95 us -69.13.187.96 - 69.13.187.104 as -69.13.187.105 - 69.13.189.0 us -69.13.189.1 - 69.13.189.255 ca -69.13.190.0 - 69.13.190.0 us -69.13.190.1 - 69.13.190.9 as -69.13.190.10 - 69.13.190.63 us -69.13.190.64 - 69.13.190.72 mx -69.13.190.73 - 69.13.190.117 us -69.13.190.118 - 69.13.190.126 ca -69.13.190.127 - 69.13.190.135 vn -69.13.190.136 - 69.13.190.243 us -69.13.190.244 - 69.13.190.252 sn -69.13.190.253 - 69.13.191.9 us -69.13.191.10 - 69.13.191.18 as -69.13.191.19 - 69.13.230.112 us -69.13.230.113 - 69.13.230.120 ws -69.13.230.121 - 69.13.248.127 us -69.13.248.128 - 69.13.248.135 ca -69.13.248.136 - 69.16.150.127 us -69.16.150.128 - 69.16.150.159 ie -69.16.150.160 - 69.16.155.255 us -69.16.156.0 - 69.16.156.7 in -69.16.156.8 - 69.16.156.127 us -69.16.156.128 - 69.16.156.135 ie -69.16.156.136 - 69.16.156.255 us -69.16.157.0 - 69.16.157.31 ie -69.16.157.32 - 69.16.162.15 us -69.16.162.16 - 69.16.162.31 ca -69.16.162.32 - 69.16.162.47 us -69.16.162.48 - 69.16.162.63 cy -69.16.162.64 - 69.16.196.75 us -69.16.196.76 - 69.16.196.83 ca -69.16.196.84 - 69.16.220.76 us -69.16.220.77 - 69.16.220.84 gb -69.16.220.85 - 69.16.233.113 us -69.16.233.114 - 69.16.233.121 in -69.16.233.122 - 69.17.127.255 us -69.17.128.0 - 69.17.136.115 ca -69.17.136.116 - 69.17.136.119 us -69.17.136.120 - 69.17.191.255 ca +69.11.128.0 - 69.12.31.255 us +69.12.32.0 - 69.12.35.255 ca +69.12.36.0 - 69.12.51.255 us +69.12.52.0 - 69.12.53.255 ca +69.12.54.0 - 69.12.103.255 us +69.12.104.0 - 69.12.104.255 ca +69.12.105.0 - 69.12.105.255 us +69.12.106.0 - 69.12.107.255 ca +69.12.108.0 - 69.12.111.255 dm +69.12.112.0 - 69.17.127.255 us +69.17.128.0 - 69.17.191.255 ca 69.17.192.0 - 69.17.203.255 bm 69.17.204.0 - 69.17.204.255 us 69.17.205.0 - 69.17.223.255 bm 69.17.224.0 - 69.17.255.255 ca -69.18.0.0 - 69.20.8.151 us -69.20.8.152 - 69.20.8.159 es -69.20.8.160 - 69.20.8.239 us -69.20.8.240 - 69.20.8.247 ca -69.20.8.248 - 69.20.10.63 us -69.20.10.64 - 69.20.10.71 cy -69.20.10.72 - 69.20.10.167 us -69.20.10.168 - 69.20.10.175 cr -69.20.10.176 - 69.20.10.183 ca -69.20.10.184 - 69.20.10.215 us -69.20.10.216 - 69.20.10.223 ca -69.20.10.224 - 69.20.12.79 us -69.20.12.80 - 69.20.12.95 jm -69.20.12.96 - 69.20.12.103 ie -69.20.12.104 - 69.20.14.63 us -69.20.14.64 - 69.20.14.71 ie -69.20.14.72 - 69.20.14.103 us -69.20.14.104 - 69.20.14.111 ca -69.20.14.112 - 69.20.18.191 us -69.20.18.192 - 69.20.18.199 pk -69.20.18.200 - 69.20.19.47 us -69.20.19.48 - 69.20.19.55 ca -69.20.19.56 - 69.20.19.111 us -69.20.19.112 - 69.20.19.127 gb -69.20.19.128 - 69.20.20.119 us -69.20.20.120 - 69.20.20.127 cr -69.20.20.128 - 69.20.20.143 gb -69.20.20.144 - 69.20.20.151 us -69.20.20.152 - 69.20.20.159 gb -69.20.20.160 - 69.20.20.231 us -69.20.20.232 - 69.20.20.239 ca -69.20.20.240 - 69.20.22.23 us -69.20.22.24 - 69.20.22.31 ae -69.20.22.32 - 69.20.24.95 us -69.20.24.96 - 69.20.24.103 ca -69.20.24.104 - 69.20.24.127 us -69.20.24.128 - 69.20.24.135 za -69.20.24.136 - 69.20.24.183 us -69.20.24.184 - 69.20.24.191 in -69.20.24.192 - 69.20.25.71 us -69.20.25.72 - 69.20.25.79 th -69.20.25.80 - 69.20.25.87 ru -69.20.25.88 - 69.20.25.95 ca -69.20.25.96 - 69.20.25.103 us -69.20.25.104 - 69.20.25.111 mx -69.20.25.112 - 69.20.25.247 us -69.20.25.248 - 69.20.26.7 ca -69.20.26.8 - 69.20.26.39 us -69.20.26.40 - 69.20.26.55 ca -69.20.26.56 - 69.20.26.255 us -69.20.27.0 - 69.20.27.7 ca -69.20.27.8 - 69.20.27.199 us -69.20.27.200 - 69.20.27.207 tr -69.20.27.208 - 69.20.27.255 us -69.20.28.0 - 69.20.28.23 ie -69.20.28.24 - 69.20.28.31 us -69.20.28.32 - 69.20.28.39 jp -69.20.28.40 - 69.20.28.143 us -69.20.28.144 - 69.20.28.151 ca -69.20.28.152 - 69.20.28.255 us -69.20.29.0 - 69.20.29.7 ca -69.20.29.8 - 69.20.29.15 us -69.20.29.16 - 69.20.29.23 il -69.20.29.24 - 69.20.29.103 us -69.20.29.104 - 69.20.29.111 ie -69.20.29.112 - 69.20.29.159 us -69.20.29.160 - 69.20.29.167 ca -69.20.29.168 - 69.20.29.175 us -69.20.29.176 - 69.20.29.191 cr -69.20.29.192 - 69.20.30.31 us -69.20.30.32 - 69.20.30.39 se -69.20.30.40 - 69.20.30.183 us -69.20.30.184 - 69.20.30.191 gb -69.20.30.192 - 69.20.30.247 us -69.20.30.248 - 69.20.30.255 ch -69.20.31.0 - 69.20.31.15 us -69.20.31.16 - 69.20.31.23 in -69.20.31.24 - 69.20.31.71 us -69.20.31.72 - 69.20.31.79 it -69.20.31.80 - 69.20.31.87 il -69.20.31.88 - 69.20.31.151 us -69.20.31.152 - 69.20.31.159 hk -69.20.31.160 - 69.20.31.211 us -69.20.31.212 - 69.20.31.212 mx -69.20.31.213 - 69.20.33.15 us -69.20.33.16 - 69.20.33.23 za -69.20.33.24 - 69.20.34.63 us -69.20.34.64 - 69.20.34.71 ca -69.20.34.72 - 69.20.34.79 gb -69.20.34.80 - 69.20.35.7 us -69.20.35.8 - 69.20.35.15 jp -69.20.35.16 - 69.20.35.63 us -69.20.35.64 - 69.20.35.71 ca -69.20.35.72 - 69.20.35.79 us -69.20.35.80 - 69.20.35.111 ie -69.20.35.112 - 69.20.35.127 us -69.20.35.128 - 69.20.35.135 ca -69.20.35.136 - 69.20.35.151 us -69.20.35.152 - 69.20.35.159 in -69.20.35.160 - 69.20.35.207 us -69.20.35.208 - 69.20.35.215 in -69.20.35.216 - 69.20.35.247 us -69.20.35.248 - 69.20.35.255 tr -69.20.36.0 - 69.20.38.31 us -69.20.38.32 - 69.20.38.39 it -69.20.38.40 - 69.20.38.63 us -69.20.38.64 - 69.20.38.71 ca -69.20.38.72 - 69.20.40.31 us -69.20.40.32 - 69.20.40.39 ca -69.20.40.40 - 69.20.40.103 us -69.20.40.104 - 69.20.40.111 ca -69.20.40.112 - 69.20.40.143 us -69.20.40.144 - 69.20.40.151 il -69.20.40.152 - 69.20.41.167 us -69.20.41.168 - 69.20.41.175 ca -69.20.41.176 - 69.20.42.31 us -69.20.42.32 - 69.20.42.39 za -69.20.42.40 - 69.20.44.217 us -69.20.44.218 - 69.20.44.219 ca -69.20.44.220 - 69.20.45.175 us -69.20.45.176 - 69.20.45.183 ca -69.20.45.184 - 69.20.45.191 us -69.20.45.192 - 69.20.45.207 ca -69.20.45.208 - 69.20.45.215 in -69.20.45.216 - 69.20.45.223 ca -69.20.45.224 - 69.20.47.111 us -69.20.47.112 - 69.20.47.119 th -69.20.47.120 - 69.20.47.127 us -69.20.47.128 - 69.20.47.135 sa -69.20.47.136 - 69.20.48.255 us -69.20.49.0 - 69.20.49.15 ca -69.20.49.16 - 69.20.49.47 us -69.20.49.48 - 69.20.49.55 ca -69.20.49.56 - 69.20.49.63 us -69.20.49.64 - 69.20.49.95 th -69.20.49.96 - 69.20.49.255 us -69.20.50.0 - 69.20.50.15 ca -69.20.50.16 - 69.20.50.23 nl -69.20.50.24 - 69.20.50.127 us -69.20.50.128 - 69.20.50.135 nl -69.20.50.136 - 69.20.50.151 us -69.20.50.152 - 69.20.50.159 ca -69.20.50.160 - 69.20.50.203 us -69.20.50.204 - 69.20.50.207 ca -69.20.50.208 - 69.20.51.63 us -69.20.51.64 - 69.20.51.71 in -69.20.51.72 - 69.20.51.159 us -69.20.51.160 - 69.20.51.175 ca -69.20.51.176 - 69.20.55.7 us -69.20.55.8 - 69.20.55.15 in -69.20.55.16 - 69.20.55.39 us -69.20.55.40 - 69.20.55.47 fi -69.20.55.48 - 69.20.55.111 us -69.20.55.112 - 69.20.55.119 ca -69.20.55.120 - 69.20.55.191 us -69.20.55.192 - 69.20.55.199 il -69.20.55.200 - 69.20.58.31 us -69.20.58.32 - 69.20.58.39 nl -69.20.58.40 - 69.20.63.63 us -69.20.63.64 - 69.20.63.71 gb -69.20.63.72 - 69.20.63.79 ca -69.20.63.80 - 69.20.64.7 us -69.20.64.8 - 69.20.64.15 ca -69.20.64.16 - 69.20.64.31 us -69.20.64.32 - 69.20.64.39 gb -69.20.64.40 - 69.20.68.31 us -69.20.68.32 - 69.20.68.47 nl -69.20.68.48 - 69.20.68.63 us -69.20.68.64 - 69.20.68.71 ca -69.20.68.72 - 69.20.69.7 us -69.20.69.8 - 69.20.69.15 ca -69.20.69.16 - 69.20.73.143 us -69.20.73.144 - 69.20.73.159 nl -69.20.73.160 - 69.20.74.79 us -69.20.74.80 - 69.20.74.87 au -69.20.74.88 - 69.20.74.95 pe -69.20.74.96 - 69.20.74.233 us -69.20.74.234 - 69.20.74.235 nl -69.20.74.236 - 69.20.76.215 us -69.20.76.216 - 69.20.76.223 ag -69.20.76.224 - 69.20.76.231 es -69.20.76.232 - 69.20.77.31 us -69.20.77.32 - 69.20.77.39 ca -69.20.77.40 - 69.20.77.255 us -69.20.78.0 - 69.20.78.7 za -69.20.78.8 - 69.20.78.15 il -69.20.78.16 - 69.20.78.79 us -69.20.78.80 - 69.20.78.87 sa -69.20.78.88 - 69.20.78.127 us -69.20.78.128 - 69.20.78.159 ca -69.20.78.160 - 69.20.79.183 us -69.20.79.184 - 69.20.79.191 ca -69.20.79.192 - 69.20.79.231 us -69.20.79.232 - 69.20.79.233 bg -69.20.79.234 - 69.20.80.31 us -69.20.80.32 - 69.20.80.47 bd -69.20.80.48 - 69.20.82.63 us -69.20.82.64 - 69.20.82.71 cr -69.20.82.72 - 69.20.83.151 us -69.20.83.152 - 69.20.83.159 gb -69.20.83.160 - 69.20.83.183 us -69.20.83.184 - 69.20.83.191 gb -69.20.83.192 - 69.20.85.71 us -69.20.85.72 - 69.20.85.79 in -69.20.85.80 - 69.20.85.151 us -69.20.85.152 - 69.20.85.159 nz -69.20.85.160 - 69.20.87.167 us -69.20.87.168 - 69.20.87.175 tw -69.20.87.176 - 69.20.87.255 us -69.20.88.0 - 69.20.88.7 gb -69.20.88.8 - 69.20.88.23 us -69.20.88.24 - 69.20.88.31 ca -69.20.88.32 - 69.20.88.103 us -69.20.88.104 - 69.20.88.111 es -69.20.88.112 - 69.20.90.111 us -69.20.90.112 - 69.20.90.119 ca -69.20.90.120 - 69.20.91.103 us -69.20.91.104 - 69.20.91.107 il -69.20.91.108 - 69.20.91.255 us -69.20.92.0 - 69.20.92.7 gb -69.20.92.8 - 69.20.92.111 us -69.20.92.112 - 69.20.92.119 za -69.20.92.120 - 69.20.93.159 us -69.20.93.160 - 69.20.93.175 gb -69.20.93.176 - 69.20.93.183 us -69.20.93.184 - 69.20.93.191 gb -69.20.93.192 - 69.20.93.239 us -69.20.93.240 - 69.20.93.243 in -69.20.93.244 - 69.20.96.71 us -69.20.96.72 - 69.20.96.79 ie -69.20.96.80 - 69.20.96.135 us -69.20.96.136 - 69.20.96.143 se -69.20.96.144 - 69.20.97.95 us -69.20.97.96 - 69.20.97.103 in -69.20.97.104 - 69.20.97.191 us -69.20.97.192 - 69.20.97.207 in -69.20.97.208 - 69.20.98.15 us -69.20.98.16 - 69.20.98.23 gb -69.20.98.24 - 69.20.99.135 us -69.20.99.136 - 69.20.99.143 in -69.20.99.144 - 69.20.99.221 us -69.20.99.222 - 69.20.99.223 ca -69.20.99.224 - 69.20.100.31 us -69.20.100.32 - 69.20.100.39 in -69.20.100.40 - 69.20.100.63 us -69.20.100.64 - 69.20.100.95 ca -69.20.100.96 - 69.20.101.151 us -69.20.101.152 - 69.20.101.159 ca -69.20.101.160 - 69.20.101.167 mx -69.20.101.168 - 69.20.101.221 us -69.20.101.222 - 69.20.101.223 ca -69.20.101.224 - 69.20.102.63 us -69.20.102.64 - 69.20.102.71 ie -69.20.102.72 - 69.20.102.95 us -69.20.102.96 - 69.20.102.103 gb -69.20.102.104 - 69.20.102.207 us -69.20.102.208 - 69.20.102.215 mx -69.20.102.216 - 69.20.102.223 tw -69.20.102.224 - 69.20.103.95 us -69.20.103.96 - 69.20.103.119 ca -69.20.103.120 - 69.20.103.127 us -69.20.103.128 - 69.20.103.143 ar -69.20.103.144 - 69.20.103.167 us -69.20.103.168 - 69.20.103.175 il -69.20.103.176 - 69.20.103.207 us -69.20.103.208 - 69.20.103.223 ca -69.20.103.224 - 69.20.103.255 us -69.20.104.0 - 69.20.104.7 in -69.20.104.8 - 69.20.105.55 us -69.20.105.56 - 69.20.105.63 in -69.20.105.64 - 69.20.105.239 us -69.20.105.240 - 69.20.105.247 in -69.20.105.248 - 69.20.107.111 us -69.20.107.112 - 69.20.107.127 fr -69.20.107.128 - 69.20.108.63 us -69.20.108.64 - 69.20.108.71 pl -69.20.108.72 - 69.20.108.87 ca -69.20.108.88 - 69.20.109.39 us -69.20.109.40 - 69.20.109.63 ca -69.20.109.64 - 69.20.110.15 us -69.20.110.16 - 69.20.110.23 ca -69.20.110.24 - 69.20.110.103 us -69.20.110.104 - 69.20.110.111 eg -69.20.110.112 - 69.20.110.127 us -69.20.110.128 - 69.20.110.135 mx -69.20.110.136 - 69.20.110.175 us -69.20.110.176 - 69.20.110.183 mx -69.20.110.184 - 69.20.110.207 us -69.20.110.208 - 69.20.110.215 ca -69.20.110.216 - 69.20.111.223 us -69.20.111.224 - 69.20.111.239 th -69.20.111.240 - 69.20.112.31 us -69.20.112.32 - 69.20.112.39 jp -69.20.112.40 - 69.20.112.207 us -69.20.112.208 - 69.20.112.215 gb -69.20.112.216 - 69.20.112.231 us -69.20.112.232 - 69.20.112.239 ca -69.20.112.240 - 69.20.112.247 ie -69.20.112.248 - 69.20.113.7 us -69.20.113.8 - 69.20.113.15 ca -69.20.113.16 - 69.20.113.63 us -69.20.113.64 - 69.20.113.71 gt -69.20.113.72 - 69.20.113.79 us -69.20.113.80 - 69.20.113.127 ca -69.20.113.128 - 69.20.115.7 us -69.20.115.8 - 69.20.115.15 mt -69.20.115.16 - 69.20.115.39 us -69.20.115.40 - 69.20.115.47 hu -69.20.115.48 - 69.20.115.143 us -69.20.115.144 - 69.20.115.175 ca -69.20.115.176 - 69.20.120.103 us -69.20.120.104 - 69.20.120.111 ca -69.20.120.112 - 69.20.121.63 us -69.20.121.64 - 69.20.121.79 mx -69.20.121.80 - 69.20.121.103 us -69.20.121.104 - 69.20.121.111 ca -69.20.121.112 - 69.20.123.15 us -69.20.123.16 - 69.20.123.23 ca -69.20.123.24 - 69.20.123.175 us -69.20.123.176 - 69.20.123.183 ca -69.20.123.184 - 69.20.123.191 my -69.20.123.192 - 69.20.126.39 us -69.20.126.40 - 69.20.126.47 ag -69.20.126.48 - 69.20.126.63 us -69.20.126.64 - 69.20.126.95 ca -69.20.126.96 - 69.20.223.255 us -69.20.224.0 - 69.20.231.159 ca -69.20.231.160 - 69.20.231.175 gb -69.20.231.176 - 69.20.236.231 ca -69.20.236.232 - 69.20.236.239 sk -69.20.236.240 - 69.20.238.111 ca -69.20.238.112 - 69.20.238.119 us -69.20.238.120 - 69.20.239.55 ca -69.20.239.56 - 69.20.239.63 us -69.20.239.64 - 69.20.255.255 ca +69.18.0.0 - 69.20.223.255 us +69.20.224.0 - 69.20.255.255 ca 69.21.0.0 - 69.24.47.255 us 69.24.48.0 - 69.24.63.255 ca 69.24.64.0 - 69.24.191.255 us 69.24.192.0 - 69.24.207.255 pr -69.24.208.0 - 69.24.241.7 us -69.24.241.8 - 69.24.241.11 tz +69.24.208.0 - 69.24.241.11 us 69.24.241.12 - 69.24.241.15 sa -69.24.241.16 - 69.24.241.19 us -69.24.241.20 - 69.24.241.23 tz +69.24.241.16 - 69.24.241.23 us 69.24.241.24 - 69.24.241.27 sa -69.24.241.28 - 69.24.242.7 us -69.24.242.8 - 69.24.242.11 de -69.24.242.12 - 69.24.242.15 ru -69.24.242.16 - 69.24.242.19 us -69.24.242.20 - 69.24.242.23 de -69.24.242.24 - 69.24.242.31 ru -69.24.242.32 - 69.24.242.247 us -69.24.242.248 - 69.24.242.255 ru -69.24.243.0 - 69.25.2.119 us -69.25.2.120 - 69.25.2.127 pr -69.25.2.128 - 69.25.10.255 us +69.24.241.28 - 69.25.10.255 us 69.25.11.0 - 69.25.11.255 ar 69.25.12.0 - 69.25.31.255 us 69.25.32.0 - 69.25.32.255 gb 69.25.33.0 - 69.25.40.255 us 69.25.41.0 - 69.25.41.255 a2 -69.25.42.0 - 69.25.60.15 us -69.25.60.16 - 69.25.60.31 hk -69.25.60.32 - 69.25.60.63 us -69.25.60.64 - 69.25.60.79 hk -69.25.60.80 - 69.25.60.255 us +69.25.42.0 - 69.25.60.255 us 69.25.61.0 - 69.25.61.255 gb -69.25.62.0 - 69.25.95.31 us -69.25.95.32 - 69.25.95.63 ca -69.25.95.64 - 69.25.103.135 us -69.25.103.136 - 69.25.103.143 au -69.25.103.144 - 69.25.105.159 us -69.25.105.160 - 69.25.105.175 kr -69.25.105.176 - 69.25.106.47 us -69.25.106.48 - 69.25.106.63 br -69.25.106.64 - 69.25.133.255 us +69.25.62.0 - 69.25.133.255 us 69.25.134.0 - 69.25.134.255 se -69.25.135.0 - 69.25.185.255 us -69.25.186.0 - 69.25.186.7 mx -69.25.186.8 - 69.25.186.159 us -69.25.186.160 - 69.25.186.167 tr -69.25.186.168 - 69.25.187.191 us -69.25.187.192 - 69.25.187.207 br -69.25.187.208 - 69.25.189.255 us -69.25.190.0 - 69.25.190.255 cr -69.25.191.0 - 69.25.201.255 us -69.25.202.0 - 69.25.202.31 gb -69.25.202.32 - 69.25.243.143 us -69.25.243.144 - 69.25.243.159 fr -69.25.243.160 - 69.26.63.255 us +69.25.135.0 - 69.26.36.47 us +69.26.36.48 - 69.26.36.55 br +69.26.36.56 - 69.26.63.255 us 69.26.64.0 - 69.26.95.255 ca 69.26.96.0 - 69.27.95.255 us 69.27.96.0 - 69.27.127.255 ca -69.27.128.0 - 69.28.68.119 us -69.28.68.120 - 69.28.68.127 ca -69.28.68.128 - 69.28.71.79 us -69.28.71.80 - 69.28.71.95 vg -69.28.71.96 - 69.28.76.55 us -69.28.76.56 - 69.28.76.63 an -69.28.76.64 - 69.28.191.255 us -69.28.192.0 - 69.28.192.95 ca -69.28.192.96 - 69.28.192.127 us -69.28.192.128 - 69.28.195.63 ca -69.28.195.64 - 69.28.195.127 us -69.28.195.128 - 69.28.195.175 ca -69.28.195.176 - 69.28.195.191 us -69.28.195.192 - 69.28.196.255 ca -69.28.197.0 - 69.28.197.31 us -69.28.197.32 - 69.28.197.95 ca -69.28.197.96 - 69.28.197.143 us -69.28.197.144 - 69.28.197.175 ca -69.28.197.176 - 69.28.197.191 us -69.28.197.192 - 69.28.197.223 ca -69.28.197.224 - 69.28.197.255 us +69.27.128.0 - 69.28.66.255 us +69.28.67.0 - 69.28.67.255 ca +69.28.68.0 - 69.28.81.255 us +69.28.82.0 - 69.28.83.255 ca +69.28.84.0 - 69.28.193.255 us +69.28.194.0 - 69.28.194.255 ca +69.28.195.0 - 69.28.197.255 us 69.28.198.0 - 69.28.202.255 ca 69.28.203.0 - 69.28.203.255 us 69.28.204.0 - 69.28.205.255 ca -69.28.206.0 - 69.28.206.63 us -69.28.206.64 - 69.28.206.239 ca -69.28.206.240 - 69.28.206.247 us -69.28.206.248 - 69.28.206.255 mx +69.28.206.0 - 69.28.206.255 us 69.28.207.0 - 69.28.207.255 ca -69.28.208.0 - 69.28.208.95 us -69.28.208.96 - 69.28.208.127 ca -69.28.208.128 - 69.28.211.191 us -69.28.211.192 - 69.28.211.223 ca -69.28.211.224 - 69.28.211.255 us -69.28.212.0 - 69.28.212.143 ca -69.28.212.144 - 69.28.212.159 us -69.28.212.160 - 69.28.212.175 ca -69.28.212.176 - 69.28.212.255 us -69.28.213.0 - 69.28.213.159 ca -69.28.213.160 - 69.28.213.191 us -69.28.213.192 - 69.28.213.223 ca -69.28.213.224 - 69.28.213.255 us -69.28.214.0 - 69.28.215.23 ca -69.28.215.24 - 69.28.215.39 us -69.28.215.40 - 69.28.215.47 ca -69.28.215.48 - 69.28.215.63 us -69.28.215.64 - 69.28.215.223 ca -69.28.215.224 - 69.28.215.247 us -69.28.215.248 - 69.28.215.255 ca -69.28.216.0 - 69.28.221.255 us -69.28.222.0 - 69.28.225.255 ca -69.28.226.0 - 69.28.226.31 us -69.28.226.32 - 69.28.226.191 ca -69.28.226.192 - 69.28.226.207 us -69.28.226.208 - 69.28.226.239 ca -69.28.226.240 - 69.28.227.63 us -69.28.227.64 - 69.28.227.175 ca -69.28.227.176 - 69.28.227.191 us -69.28.227.192 - 69.28.230.31 ca -69.28.230.32 - 69.28.230.63 us -69.28.230.64 - 69.28.230.239 ca -69.28.230.240 - 69.28.230.255 us -69.28.231.0 - 69.28.231.47 ca -69.28.231.48 - 69.28.231.63 us -69.28.231.64 - 69.28.231.95 ca -69.28.231.96 - 69.28.231.119 us -69.28.231.120 - 69.28.231.127 ca -69.28.231.128 - 69.28.231.159 us -69.28.231.160 - 69.28.231.191 ca -69.28.231.192 - 69.28.231.223 bv -69.28.231.224 - 69.28.231.239 ca -69.28.231.240 - 69.28.231.255 bv -69.28.232.0 - 69.28.235.255 ca -69.28.236.0 - 69.28.236.255 us +69.28.208.0 - 69.28.208.255 us +69.28.209.0 - 69.28.209.255 nl +69.28.210.0 - 69.28.213.255 us +69.28.214.0 - 69.28.214.255 ca +69.28.215.0 - 69.28.215.63 us +69.28.215.64 - 69.28.215.95 ca +69.28.215.96 - 69.28.221.255 us +69.28.222.0 - 69.28.223.255 ca +69.28.224.0 - 69.28.228.255 us +69.28.229.0 - 69.28.229.255 ca +69.28.230.0 - 69.28.231.175 us +69.28.231.176 - 69.28.231.191 ca +69.28.231.192 - 69.28.233.255 us +69.28.234.0 - 69.28.234.255 ca +69.28.235.0 - 69.28.236.255 us 69.28.237.0 - 69.28.239.255 ca 69.28.240.0 - 69.28.243.255 us 69.28.244.0 - 69.28.247.255 ca 69.28.248.0 - 69.28.253.255 us 69.28.254.0 - 69.28.254.255 ca -69.28.255.0 - 69.29.14.71 us -69.29.14.72 - 69.29.14.79 mo -69.29.14.80 - 69.29.124.15 us +69.28.255.0 - 69.29.124.15 us 69.29.124.16 - 69.29.124.23 mo -69.29.124.24 - 69.30.193.47 us -69.30.193.48 - 69.30.193.63 tr -69.30.193.64 - 69.30.193.79 jp -69.30.193.80 - 69.30.244.39 us -69.30.244.40 - 69.30.244.47 br -69.30.244.48 - 69.30.246.63 us -69.30.246.64 - 69.30.246.79 au -69.30.246.80 - 69.30.246.111 us -69.30.246.112 - 69.30.246.127 nz -69.30.246.128 - 69.30.254.55 us -69.30.254.56 - 69.30.254.71 in -69.30.254.72 - 69.31.34.255 us +69.29.124.24 - 69.31.34.255 us 69.31.35.0 - 69.31.35.255 ca -69.31.36.0 - 69.31.54.127 us -69.31.54.128 - 69.31.54.159 ca -69.31.54.160 - 69.31.136.255 us +69.31.36.0 - 69.31.136.255 us 69.31.137.0 - 69.31.137.255 ca 69.31.138.0 - 69.31.159.255 us 69.31.160.0 - 69.31.255.255 ca -69.32.0.0 - 69.36.5.255 us -69.36.6.0 - 69.36.6.255 mx -69.36.7.0 - 69.36.32.255 us -69.36.33.0 - 69.36.33.7 au -69.36.33.8 - 69.36.34.31 us -69.36.34.32 - 69.36.34.47 ca -69.36.34.48 - 69.36.34.159 us -69.36.34.160 - 69.36.34.175 gb -69.36.34.176 - 69.36.35.127 us -69.36.35.128 - 69.36.35.159 au -69.36.35.160 - 69.36.35.223 us -69.36.35.224 - 69.36.35.255 au -69.36.36.0 - 69.36.40.143 us -69.36.40.144 - 69.36.40.151 bb -69.36.40.152 - 69.36.40.183 us -69.36.40.184 - 69.36.40.191 sc -69.36.40.192 - 69.36.44.111 us -69.36.44.112 - 69.36.44.119 ug -69.36.44.120 - 69.36.44.239 us -69.36.44.240 - 69.36.44.247 rs -69.36.44.248 - 69.36.95.255 us -69.36.96.0 - 69.36.99.239 ca -69.36.99.240 - 69.36.99.247 us -69.36.99.248 - 69.36.102.87 ca -69.36.102.88 - 69.36.102.111 us -69.36.102.112 - 69.36.102.151 ca -69.36.102.152 - 69.36.102.167 us -69.36.102.168 - 69.36.103.79 ca -69.36.103.80 - 69.36.103.95 us -69.36.103.96 - 69.36.103.111 ca -69.36.103.112 - 69.36.103.119 us -69.36.103.120 - 69.36.107.183 ca -69.36.107.184 - 69.36.107.191 us -69.36.107.192 - 69.36.108.111 ca -69.36.108.112 - 69.36.108.119 us -69.36.108.120 - 69.36.108.159 ca -69.36.108.160 - 69.36.108.167 us -69.36.108.168 - 69.36.108.183 ca -69.36.108.184 - 69.36.108.191 us -69.36.108.192 - 69.36.108.215 ca -69.36.108.216 - 69.36.108.223 us -69.36.108.224 - 69.36.109.39 ca -69.36.109.40 - 69.36.109.47 us -69.36.109.48 - 69.36.109.63 ca -69.36.109.64 - 69.36.109.87 us -69.36.109.88 - 69.36.109.127 ca -69.36.109.128 - 69.36.109.135 us -69.36.109.136 - 69.36.109.175 ca -69.36.109.176 - 69.36.109.183 us -69.36.109.184 - 69.36.109.207 ca -69.36.109.208 - 69.36.109.223 us -69.36.109.224 - 69.36.112.127 ca -69.36.112.128 - 69.36.112.223 us -69.36.112.224 - 69.36.113.55 ca -69.36.113.56 - 69.36.113.63 us -69.36.113.64 - 69.36.113.95 ca -69.36.113.96 - 69.36.113.111 us -69.36.113.112 - 69.36.113.119 ca -69.36.113.120 - 69.36.113.135 us -69.36.113.136 - 69.36.113.143 ca -69.36.113.144 - 69.36.113.151 us -69.36.113.152 - 69.36.113.167 ca -69.36.113.168 - 69.36.113.191 us -69.36.113.192 - 69.36.113.215 ca -69.36.113.216 - 69.36.113.223 us -69.36.113.224 - 69.36.113.231 ca -69.36.113.232 - 69.36.113.255 us -69.36.114.0 - 69.36.115.255 ca -69.36.116.0 - 69.36.116.7 us -69.36.116.8 - 69.36.116.47 ca -69.36.116.48 - 69.36.116.55 us -69.36.116.56 - 69.36.116.127 ca -69.36.116.128 - 69.36.116.135 us -69.36.116.136 - 69.36.116.247 ca -69.36.116.248 - 69.36.117.7 us -69.36.117.8 - 69.36.127.255 ca +69.32.0.0 - 69.36.95.255 us +69.36.96.0 - 69.36.127.255 ca 69.36.128.0 - 69.41.191.255 us 69.41.192.0 - 69.41.207.255 ca -69.41.208.0 - 69.42.51.255 us +69.41.208.0 - 69.41.227.255 us +69.41.228.0 - 69.41.228.255 ae +69.41.229.0 - 69.42.47.255 us +69.42.48.0 - 69.42.48.255 ca +69.42.49.0 - 69.42.51.255 us 69.42.52.0 - 69.42.63.255 ca -69.42.64.0 - 69.42.64.207 us -69.42.64.208 - 69.42.64.223 gb -69.42.64.224 - 69.42.98.127 us -69.42.98.128 - 69.42.99.255 do -69.42.100.0 - 69.42.100.255 us -69.42.101.0 - 69.42.101.31 ve -69.42.101.32 - 69.42.101.47 us +69.42.64.0 - 69.42.98.255 us +69.42.99.0 - 69.42.99.255 do +69.42.100.0 - 69.42.101.47 us 69.42.101.48 - 69.42.101.63 do -69.42.101.64 - 69.42.101.159 us -69.42.101.160 - 69.42.101.175 es -69.42.101.176 - 69.42.101.207 us -69.42.101.208 - 69.42.101.215 a2 -69.42.101.216 - 69.42.108.31 us -69.42.108.32 - 69.42.108.47 gd -69.42.108.48 - 69.42.108.63 es -69.42.108.64 - 69.42.108.255 us +69.42.101.64 - 69.42.108.255 us 69.42.109.0 - 69.42.109.255 ca -69.42.110.0 - 69.42.113.79 us -69.42.113.80 - 69.42.113.95 pt -69.42.113.96 - 69.42.113.255 us +69.42.110.0 - 69.42.113.255 us 69.42.114.0 - 69.42.115.255 co -69.42.116.0 - 69.42.116.31 us -69.42.116.32 - 69.42.116.63 pr -69.42.116.64 - 69.42.116.79 us -69.42.116.80 - 69.42.116.95 bm -69.42.116.96 - 69.42.116.127 us -69.42.116.128 - 69.42.116.143 mx -69.42.116.144 - 69.42.116.175 us -69.42.116.176 - 69.42.116.191 do -69.42.116.192 - 69.42.117.79 us -69.42.117.80 - 69.42.117.95 uy -69.42.117.96 - 69.42.117.111 tt -69.42.117.112 - 69.42.117.127 us -69.42.117.128 - 69.42.117.143 pr +69.42.116.0 - 69.42.117.143 us 69.42.117.144 - 69.42.117.151 ec 69.42.117.152 - 69.42.117.183 us 69.42.117.184 - 69.42.117.191 ec -69.42.117.192 - 69.42.121.15 us -69.42.121.16 - 69.42.121.31 gb -69.42.121.32 - 69.42.121.175 us -69.42.121.176 - 69.42.121.191 br -69.42.121.192 - 69.42.126.191 us -69.42.126.192 - 69.42.126.207 gt -69.42.126.208 - 69.42.137.149 us -69.42.137.150 - 69.42.137.245 kn -69.42.137.246 - 69.42.138.2 us -69.42.138.3 - 69.42.138.32 ca -69.42.138.33 - 69.42.175.255 us +69.42.117.192 - 69.42.175.255 us 69.42.176.0 - 69.42.191.255 ca -69.42.192.0 - 69.42.208.31 us -69.42.208.32 - 69.42.208.47 gr -69.42.208.48 - 69.42.209.95 us -69.42.209.96 - 69.42.209.127 tr -69.42.209.128 - 69.42.209.191 pt -69.42.209.192 - 69.42.210.127 us -69.42.210.128 - 69.42.210.191 nl -69.42.210.192 - 69.42.211.127 us -69.42.211.128 - 69.42.211.191 gb -69.42.211.192 - 69.42.212.191 us -69.42.212.192 - 69.42.212.255 in -69.42.213.0 - 69.42.213.63 us -69.42.213.64 - 69.42.213.255 in -69.42.214.0 - 69.42.219.63 us -69.42.219.64 - 69.42.219.95 id -69.42.219.96 - 69.42.219.127 co -69.42.219.128 - 69.42.220.63 us -69.42.220.64 - 69.42.220.127 pk -69.42.220.128 - 69.42.220.191 pt -69.42.220.192 - 69.42.221.127 us -69.42.221.128 - 69.42.221.191 it -69.42.221.192 - 69.42.221.255 us -69.42.222.0 - 69.42.222.31 pt -69.42.222.32 - 69.42.222.95 us -69.42.222.96 - 69.42.222.127 ca -69.42.222.128 - 69.42.222.255 us -69.42.223.0 - 69.42.223.31 pt -69.42.223.32 - 69.42.223.191 us -69.42.223.192 - 69.42.223.255 in -69.42.224.0 - 69.43.159.255 us +69.42.192.0 - 69.43.159.255 us 69.43.160.0 - 69.43.161.255 au -69.43.162.0 - 69.43.197.231 us -69.43.197.232 - 69.43.197.239 ca -69.43.197.240 - 69.43.223.255 us -69.43.224.0 - 69.43.226.63 a2 -69.43.226.64 - 69.43.226.95 us -69.43.226.96 - 69.43.227.95 a2 -69.43.227.96 - 69.43.227.111 us -69.43.227.112 - 69.43.227.127 a2 -69.43.227.128 - 69.43.227.143 au -69.43.227.144 - 69.43.227.223 a2 -69.43.227.224 - 69.43.227.239 us -69.43.227.240 - 69.43.227.255 a2 -69.43.228.0 - 69.43.228.63 us -69.43.228.64 - 69.43.228.191 a2 -69.43.228.192 - 69.43.228.223 np -69.43.228.224 - 69.43.228.255 af -69.43.229.0 - 69.43.231.255 a2 -69.43.232.0 - 69.43.233.255 au -69.43.234.0 - 69.43.239.255 a2 -69.43.240.0 - 69.44.119.255 us -69.44.120.0 - 69.44.120.31 lb -69.44.120.32 - 69.44.124.95 us -69.44.124.96 - 69.44.124.127 mx -69.44.124.128 - 69.44.127.55 us -69.44.127.56 - 69.44.127.71 ca -69.44.127.72 - 69.44.127.135 us -69.44.127.136 - 69.44.127.143 lb -69.44.127.144 - 69.44.141.255 us +69.43.162.0 - 69.44.141.255 us 69.44.142.0 - 69.44.143.255 mx 69.44.144.0 - 69.44.201.255 us 69.44.202.0 - 69.44.203.255 mp 69.44.204.0 - 69.45.127.255 us 69.45.128.0 - 69.45.131.255 mx -69.45.132.0 - 69.46.68.143 us -69.46.68.144 - 69.46.68.151 gb -69.46.68.152 - 69.46.74.135 us -69.46.74.136 - 69.46.74.143 gb -69.46.74.144 - 69.46.77.215 us -69.46.77.216 - 69.46.77.223 gb -69.46.77.224 - 69.46.78.215 us -69.46.78.216 - 69.46.78.223 gb -69.46.78.224 - 69.46.82.127 us -69.46.82.128 - 69.46.82.159 hk -69.46.82.160 - 69.46.90.23 us -69.46.90.24 - 69.46.90.31 gb -69.46.90.32 - 69.46.90.207 us -69.46.90.208 - 69.46.90.215 gb -69.46.90.216 - 69.46.95.207 us -69.46.95.208 - 69.46.95.215 gb -69.46.95.216 - 69.46.95.255 us +69.45.132.0 - 69.46.89.255 us +69.46.90.0 - 69.46.90.255 ch +69.46.91.0 - 69.46.95.255 us 69.46.96.0 - 69.46.127.255 ca -69.46.128.0 - 69.46.134.151 us -69.46.134.152 - 69.46.134.159 ar -69.46.134.160 - 69.46.135.127 us -69.46.135.128 - 69.46.135.159 gb -69.46.135.160 - 69.46.135.255 us -69.46.136.0 - 69.46.136.63 gb -69.46.136.64 - 69.46.139.255 us +69.46.128.0 - 69.46.139.255 us 69.46.140.0 - 69.46.140.255 mx 69.46.141.0 - 69.46.159.255 us -69.46.160.0 - 69.46.162.7 ca -69.46.162.8 - 69.46.162.15 us -69.46.162.16 - 69.46.162.31 ca -69.46.162.32 - 69.46.162.39 us -69.46.162.40 - 69.46.164.71 ca -69.46.164.72 - 69.46.164.79 us -69.46.164.80 - 69.46.164.87 ca -69.46.164.88 - 69.46.164.95 us -69.46.164.96 - 69.46.165.87 ca -69.46.165.88 - 69.46.165.95 us -69.46.165.96 - 69.46.171.231 ca -69.46.171.232 - 69.46.171.239 us -69.46.171.240 - 69.46.174.167 ca -69.46.174.168 - 69.46.174.175 us -69.46.174.176 - 69.46.175.223 ca -69.46.175.224 - 69.46.175.231 us -69.46.175.232 - 69.46.178.63 ca -69.46.178.64 - 69.46.178.71 us -69.46.178.72 - 69.46.178.127 ca -69.46.178.128 - 69.46.178.135 us -69.46.178.136 - 69.46.178.223 ca -69.46.178.224 - 69.46.178.231 us -69.46.178.232 - 69.46.179.171 ca -69.46.179.172 - 69.46.179.194 us -69.46.179.195 - 69.46.180.47 ca -69.46.180.48 - 69.46.180.55 us -69.46.180.56 - 69.46.180.63 ca -69.46.180.64 - 69.46.180.71 us -69.46.180.72 - 69.46.180.127 ca -69.46.180.128 - 69.46.180.143 us -69.46.180.144 - 69.46.180.175 ca -69.46.180.176 - 69.46.180.183 us -69.46.180.184 - 69.46.180.191 ca -69.46.180.192 - 69.46.180.199 us -69.46.180.200 - 69.46.182.15 ca -69.46.182.16 - 69.46.182.23 us -69.46.182.24 - 69.46.182.47 ca -69.46.182.48 - 69.46.182.55 us -69.46.182.56 - 69.46.182.79 ca -69.46.182.80 - 69.46.182.87 us -69.46.182.88 - 69.46.182.135 ca -69.46.182.136 - 69.46.182.151 us -69.46.182.152 - 69.46.182.159 ca -69.46.182.160 - 69.46.182.167 in -69.46.182.168 - 69.46.182.215 ca -69.46.182.216 - 69.46.182.223 us -69.46.182.224 - 69.46.183.11 ca -69.46.183.12 - 69.46.183.39 us -69.46.183.40 - 69.46.183.123 ca -69.46.183.124 - 69.46.183.163 us -69.46.183.164 - 69.46.184.29 ca -69.46.184.30 - 69.46.184.68 us -69.46.184.69 - 69.46.184.69 ca -69.46.184.70 - 69.46.184.77 us -69.46.184.78 - 69.46.184.102 ca -69.46.184.103 - 69.46.184.114 us -69.46.184.115 - 69.46.184.125 ca -69.46.184.126 - 69.46.184.135 us -69.46.184.136 - 69.46.184.136 ca -69.46.184.137 - 69.46.184.147 us -69.46.184.148 - 69.46.184.170 ca -69.46.184.171 - 69.46.184.182 us -69.46.184.183 - 69.46.184.197 ca -69.46.184.198 - 69.46.184.223 us -69.46.184.224 - 69.46.185.23 ca -69.46.185.24 - 69.46.185.51 us -69.46.185.52 - 69.46.185.183 ca -69.46.185.184 - 69.46.185.255 us -69.46.186.0 - 69.46.186.173 ca -69.46.186.174 - 69.46.186.185 us -69.46.186.186 - 69.46.186.186 ca -69.46.186.187 - 69.46.186.205 us -69.46.186.206 - 69.46.186.210 ca -69.46.186.211 - 69.46.186.239 us -69.46.186.240 - 69.46.187.15 ca -69.46.187.16 - 69.46.187.23 us -69.46.187.24 - 69.46.187.127 ca -69.46.187.128 - 69.46.187.175 us -69.46.187.176 - 69.46.188.7 ca -69.46.188.8 - 69.46.188.39 us -69.46.188.40 - 69.46.188.47 ca -69.46.188.48 - 69.46.188.63 us -69.46.188.64 - 69.46.188.95 ca -69.46.188.96 - 69.46.188.103 us -69.46.188.104 - 69.46.188.119 ca -69.46.188.120 - 69.46.188.135 us -69.46.188.136 - 69.46.188.223 ca -69.46.188.224 - 69.46.188.231 us -69.46.188.232 - 69.46.189.7 ca -69.46.189.8 - 69.46.189.15 us -69.46.189.16 - 69.46.189.67 ca -69.46.189.68 - 69.46.189.83 us -69.46.189.84 - 69.46.191.95 ca -69.46.191.96 - 69.46.191.111 us -69.46.191.112 - 69.46.191.135 ca -69.46.191.136 - 69.46.191.143 us -69.46.191.144 - 69.46.191.159 ca -69.46.191.160 - 69.46.191.175 us -69.46.191.176 - 69.46.191.183 ca -69.46.191.184 - 69.46.191.191 us -69.46.191.192 - 69.46.191.215 ca -69.46.191.216 - 69.46.191.223 us -69.46.191.224 - 69.46.191.255 ca -69.46.192.0 - 69.46.229.255 us -69.46.230.0 - 69.46.230.127 ky -69.46.230.128 - 69.46.233.239 us -69.46.233.240 - 69.46.233.247 ky -69.46.233.248 - 69.46.234.239 us -69.46.234.240 - 69.46.234.247 ky -69.46.234.248 - 69.46.235.63 us -69.46.235.64 - 69.46.235.127 ky -69.46.235.128 - 69.48.135.63 us -69.48.135.64 - 69.48.135.95 ca -69.48.135.96 - 69.48.143.255 us +69.46.160.0 - 69.46.191.255 ca +69.46.192.0 - 69.48.143.255 us 69.48.144.0 - 69.48.144.255 ca -69.48.145.0 - 69.48.148.31 us -69.48.148.32 - 69.48.148.39 be -69.48.148.40 - 69.49.31.255 us +69.48.145.0 - 69.49.31.255 us 69.49.32.0 - 69.49.63.255 ca 69.49.64.0 - 69.49.96.255 us 69.49.97.0 - 69.49.97.255 ca 69.49.98.0 - 69.50.63.255 us 69.50.64.0 - 69.50.79.255 ag -69.50.80.0 - 69.50.133.127 us -69.50.133.128 - 69.50.133.135 nl -69.50.133.136 - 69.50.133.143 us -69.50.133.144 - 69.50.133.159 cy -69.50.133.160 - 69.50.143.151 us -69.50.143.152 - 69.50.143.159 ru -69.50.143.160 - 69.50.143.191 us -69.50.143.192 - 69.50.143.207 cy -69.50.143.208 - 69.50.143.223 us -69.50.143.224 - 69.50.143.255 ca -69.50.144.0 - 69.50.159.255 us +69.50.80.0 - 69.50.159.255 us 69.50.160.0 - 69.50.191.255 ca -69.50.192.0 - 69.51.12.127 us -69.51.12.128 - 69.51.12.191 mx -69.51.12.192 - 69.51.14.39 us -69.51.14.40 - 69.51.14.47 gr -69.51.14.48 - 69.51.16.255 us -69.51.17.0 - 69.51.17.31 hk -69.51.17.32 - 69.51.18.127 us -69.51.18.128 - 69.51.18.159 ca -69.51.18.160 - 69.51.18.191 us -69.51.18.192 - 69.51.18.207 mx -69.51.18.208 - 69.51.22.143 us -69.51.22.144 - 69.51.22.159 mx -69.51.22.160 - 69.51.23.175 us -69.51.23.176 - 69.51.23.191 mx -69.51.23.192 - 69.51.191.255 us +69.50.192.0 - 69.51.191.255 us 69.51.192.0 - 69.51.255.255 ca -69.52.0.0 - 69.55.239.255 us +69.52.0.0 - 69.52.65.255 us +69.52.66.0 - 69.52.66.255 gb +69.52.67.0 - 69.52.68.255 us +69.52.69.0 - 69.52.69.255 gb +69.52.70.0 - 69.52.146.255 us +69.52.147.0 - 69.52.147.255 au +69.52.148.0 - 69.55.239.255 us 69.55.240.0 - 69.55.255.255 ca -69.56.0.0 - 69.56.1.127 us -69.56.1.128 - 69.56.1.135 il -69.56.1.136 - 69.56.10.15 us -69.56.10.16 - 69.56.10.39 ca -69.56.10.40 - 69.56.26.15 us -69.56.26.16 - 69.56.26.23 au -69.56.26.24 - 69.56.53.255 us -69.56.54.0 - 69.56.54.15 kn -69.56.54.16 - 69.56.54.247 us -69.56.54.248 - 69.56.54.255 kn -69.56.55.0 - 69.56.58.71 us -69.56.58.72 - 69.56.58.87 bs -69.56.58.88 - 69.56.58.95 us -69.56.58.96 - 69.56.58.103 bs -69.56.58.104 - 69.56.58.223 us -69.56.58.224 - 69.56.58.231 il -69.56.58.232 - 69.56.59.103 us -69.56.59.104 - 69.56.59.111 bs -69.56.59.112 - 69.56.63.103 us -69.56.63.104 - 69.56.63.111 ca -69.56.63.112 - 69.56.255.255 us +69.56.0.0 - 69.56.255.255 us 69.57.0.0 - 69.57.15.255 ca 69.57.16.0 - 69.57.207.255 us 69.57.208.0 - 69.57.223.255 ca -69.57.224.0 - 69.57.225.95 ag -69.57.225.96 - 69.57.225.111 ms -69.57.225.112 - 69.57.225.255 ag +69.57.224.0 - 69.57.225.255 ag 69.57.226.0 - 69.57.226.255 ai 69.57.227.0 - 69.57.228.255 ag 69.57.229.0 - 69.57.229.255 vg @@ -28048,536 +16711,73 @@ 69.57.241.0 - 69.57.241.255 dm 69.57.242.0 - 69.57.242.255 ag 69.57.243.0 - 69.57.243.255 ai -69.57.244.0 - 69.57.244.15 ag -69.57.244.16 - 69.57.244.31 ms -69.57.244.32 - 69.57.244.223 ag -69.57.244.224 - 69.57.244.255 ms -69.57.245.0 - 69.57.247.255 ag +69.57.244.0 - 69.57.247.255 ag 69.57.248.0 - 69.57.248.255 ai 69.57.249.0 - 69.57.249.255 vg -69.57.250.0 - 69.57.250.31 ag -69.57.250.32 - 69.57.250.63 ms -69.57.250.64 - 69.57.252.255 ag +69.57.250.0 - 69.57.252.255 ag 69.57.253.0 - 69.57.255.255 kn -69.58.0.0 - 69.58.95.255 us +69.58.0.0 - 69.58.0.255 us +69.58.1.0 - 69.58.1.127 ca +69.58.1.128 - 69.58.1.159 us +69.58.1.160 - 69.58.1.255 ca +69.58.2.0 - 69.58.3.191 us +69.58.3.192 - 69.58.3.255 ca +69.58.4.0 - 69.58.6.255 us +69.58.7.0 - 69.58.7.95 ca +69.58.7.96 - 69.58.7.127 us +69.58.7.128 - 69.58.7.159 ca +69.58.7.160 - 69.58.7.191 us +69.58.7.192 - 69.58.7.255 ca +69.58.8.0 - 69.58.8.255 us +69.58.9.0 - 69.58.9.63 ca +69.58.9.64 - 69.58.11.255 us +69.58.12.0 - 69.58.12.62 ca +69.58.12.63 - 69.58.12.255 us +69.58.13.0 - 69.58.13.255 in +69.58.14.0 - 69.58.15.255 us +69.58.16.0 - 69.58.31.255 ca +69.58.32.0 - 69.58.95.255 us 69.58.96.0 - 69.58.111.255 ca -69.58.112.0 - 69.59.27.3 us -69.59.27.4 - 69.59.27.30 tr -69.59.27.31 - 69.60.63.255 us +69.58.112.0 - 69.60.63.255 us 69.60.64.0 - 69.60.79.255 ca -69.60.80.0 - 69.60.103.255 us -69.60.104.0 - 69.60.104.255 pa -69.60.105.0 - 69.60.223.255 us +69.60.80.0 - 69.60.223.255 us 69.60.224.0 - 69.60.255.255 ca -69.61.0.0 - 69.61.8.15 us -69.61.8.16 - 69.61.8.31 se -69.61.8.32 - 69.61.8.39 us -69.61.8.40 - 69.61.8.47 si -69.61.8.48 - 69.61.8.55 us -69.61.8.56 - 69.61.8.63 de -69.61.8.64 - 69.61.8.79 us -69.61.8.80 - 69.61.8.95 ar -69.61.8.96 - 69.61.8.103 us -69.61.8.104 - 69.61.8.111 pl -69.61.8.112 - 69.61.8.127 gb -69.61.8.128 - 69.61.8.135 us -69.61.8.136 - 69.61.8.143 gb -69.61.8.144 - 69.61.8.159 us -69.61.8.160 - 69.61.8.167 si -69.61.8.168 - 69.61.8.175 us -69.61.8.176 - 69.61.8.183 au -69.61.8.184 - 69.61.8.191 us -69.61.8.192 - 69.61.8.199 ar -69.61.8.200 - 69.61.8.207 us -69.61.8.208 - 69.61.8.215 ar -69.61.8.216 - 69.61.8.223 ca -69.61.8.224 - 69.61.8.231 si -69.61.8.232 - 69.61.8.247 us -69.61.8.248 - 69.61.8.255 ca -69.61.9.0 - 69.61.11.31 us -69.61.11.32 - 69.61.11.39 nl -69.61.11.40 - 69.61.11.47 gb -69.61.11.48 - 69.61.11.63 us -69.61.11.64 - 69.61.11.71 gb -69.61.11.72 - 69.61.11.103 us -69.61.11.104 - 69.61.11.111 pl -69.61.11.112 - 69.61.11.191 us -69.61.11.192 - 69.61.11.223 ar -69.61.11.224 - 69.61.11.231 in -69.61.11.232 - 69.61.11.247 us -69.61.11.248 - 69.61.11.255 ar -69.61.12.0 - 69.61.14.15 us -69.61.14.16 - 69.61.14.31 si -69.61.14.32 - 69.61.14.39 us -69.61.14.40 - 69.61.14.47 gb -69.61.14.48 - 69.61.14.55 us -69.61.14.56 - 69.61.14.63 pl -69.61.14.64 - 69.61.14.79 us -69.61.14.80 - 69.61.14.87 pl -69.61.14.88 - 69.61.14.159 us -69.61.14.160 - 69.61.14.191 fi -69.61.14.192 - 69.61.14.199 ca -69.61.14.200 - 69.61.14.207 ar -69.61.14.208 - 69.61.14.215 gb -69.61.14.216 - 69.61.14.223 il -69.61.14.224 - 69.61.14.231 gb -69.61.14.232 - 69.61.14.239 si -69.61.14.240 - 69.61.14.247 us -69.61.14.248 - 69.61.14.255 my -69.61.15.0 - 69.61.15.79 us -69.61.15.80 - 69.61.15.87 gb -69.61.15.88 - 69.61.15.95 my -69.61.15.96 - 69.61.15.143 us -69.61.15.144 - 69.61.15.159 gb -69.61.15.160 - 69.61.15.167 pl -69.61.15.168 - 69.61.15.175 us -69.61.15.176 - 69.61.15.191 gb -69.61.15.192 - 69.61.15.223 us -69.61.15.224 - 69.61.15.231 au -69.61.15.232 - 69.61.15.255 us -69.61.16.0 - 69.61.16.255 pl -69.61.17.0 - 69.61.18.15 us -69.61.18.16 - 69.61.18.23 nl -69.61.18.24 - 69.61.18.39 us -69.61.18.40 - 69.61.18.47 hr -69.61.18.48 - 69.61.18.55 nl -69.61.18.56 - 69.61.18.63 ar -69.61.18.64 - 69.61.18.127 us -69.61.18.128 - 69.61.18.135 ar -69.61.18.136 - 69.61.18.143 il -69.61.18.144 - 69.61.18.159 us -69.61.18.160 - 69.61.18.167 gb -69.61.18.168 - 69.61.18.175 us -69.61.18.176 - 69.61.18.183 ar -69.61.18.184 - 69.61.18.223 gb -69.61.18.224 - 69.61.18.231 us -69.61.18.232 - 69.61.18.239 hr -69.61.18.240 - 69.61.18.247 us -69.61.18.248 - 69.61.18.255 nl -69.61.19.0 - 69.61.20.7 us -69.61.20.8 - 69.61.20.15 pl -69.61.20.16 - 69.61.20.23 us -69.61.20.24 - 69.61.20.31 gb -69.61.20.32 - 69.61.20.47 us -69.61.20.48 - 69.61.20.55 il -69.61.20.56 - 69.61.20.87 us -69.61.20.88 - 69.61.20.95 bg -69.61.20.96 - 69.61.20.103 us -69.61.20.104 - 69.61.20.111 gb -69.61.20.112 - 69.61.20.175 us -69.61.20.176 - 69.61.20.183 dk -69.61.20.184 - 69.61.20.191 us -69.61.20.192 - 69.61.20.199 kw -69.61.20.200 - 69.61.20.207 us -69.61.20.208 - 69.61.20.215 gb -69.61.20.216 - 69.61.20.223 si -69.61.20.224 - 69.61.20.231 us -69.61.20.232 - 69.61.20.239 tr -69.61.20.240 - 69.61.20.247 us -69.61.20.248 - 69.61.20.255 cz -69.61.21.0 - 69.61.21.7 us -69.61.21.8 - 69.61.21.15 ca -69.61.21.16 - 69.61.21.23 us -69.61.21.24 - 69.61.21.31 au -69.61.21.32 - 69.61.21.63 us -69.61.21.64 - 69.61.21.71 gb -69.61.21.72 - 69.61.21.79 in -69.61.21.80 - 69.61.21.103 us -69.61.21.104 - 69.61.21.111 si -69.61.21.112 - 69.61.21.127 us -69.61.21.128 - 69.61.21.135 kw -69.61.21.136 - 69.61.21.151 us -69.61.21.152 - 69.61.21.159 bg -69.61.21.160 - 69.61.21.183 us -69.61.21.184 - 69.61.21.191 ca -69.61.21.192 - 69.61.21.207 us -69.61.21.208 - 69.61.21.223 gb -69.61.21.224 - 69.61.21.231 us -69.61.21.232 - 69.61.21.239 ar -69.61.21.240 - 69.61.21.247 gb -69.61.21.248 - 69.61.22.199 us -69.61.22.200 - 69.61.22.207 kw -69.61.22.208 - 69.61.22.239 us -69.61.22.240 - 69.61.22.247 ar -69.61.22.248 - 69.61.23.7 us -69.61.23.8 - 69.61.23.15 ca -69.61.23.16 - 69.61.23.23 us -69.61.23.24 - 69.61.23.31 bg -69.61.23.32 - 69.61.23.47 gb -69.61.23.48 - 69.61.23.55 ar -69.61.23.56 - 69.61.23.63 br -69.61.23.64 - 69.61.23.103 us -69.61.23.104 - 69.61.23.111 br -69.61.23.112 - 69.61.23.135 us +69.61.0.0 - 69.61.23.135 us 69.61.23.136 - 69.61.23.143 kw -69.61.23.144 - 69.61.23.151 br -69.61.23.152 - 69.61.23.167 us -69.61.23.168 - 69.61.23.175 ar -69.61.23.176 - 69.61.23.215 us -69.61.23.216 - 69.61.23.223 nl -69.61.23.224 - 69.61.27.7 us -69.61.27.8 - 69.61.27.15 bg -69.61.27.16 - 69.61.27.39 us -69.61.27.40 - 69.61.27.47 br -69.61.27.48 - 69.61.27.63 gb -69.61.27.64 - 69.61.27.119 us -69.61.27.120 - 69.61.27.127 gb -69.61.27.128 - 69.61.27.143 us -69.61.27.144 - 69.61.27.151 gb -69.61.27.152 - 69.61.27.175 us -69.61.27.176 - 69.61.27.191 gb -69.61.27.192 - 69.61.27.207 us -69.61.27.208 - 69.61.27.223 gb -69.61.27.224 - 69.61.28.175 us -69.61.28.176 - 69.61.28.191 ca -69.61.28.192 - 69.61.28.255 us -69.61.29.0 - 69.61.29.31 ca -69.61.29.32 - 69.61.29.191 us -69.61.29.192 - 69.61.29.207 ee -69.61.29.208 - 69.61.29.215 us -69.61.29.216 - 69.61.29.223 au -69.61.29.224 - 69.61.29.239 us -69.61.29.240 - 69.61.29.247 pl -69.61.29.248 - 69.61.31.7 us -69.61.31.8 - 69.61.31.15 ar -69.61.31.16 - 69.61.31.23 us -69.61.31.24 - 69.61.31.31 il -69.61.31.32 - 69.61.31.47 pl -69.61.31.48 - 69.61.31.95 us -69.61.31.96 - 69.61.31.103 ca -69.61.31.104 - 69.61.33.7 us -69.61.33.8 - 69.61.33.15 in -69.61.33.16 - 69.61.33.23 ca -69.61.33.24 - 69.61.33.79 us -69.61.33.80 - 69.61.33.87 ar -69.61.33.88 - 69.61.33.95 ph -69.61.33.96 - 69.61.33.127 us -69.61.33.128 - 69.61.33.143 pl -69.61.33.144 - 69.61.33.151 us -69.61.33.152 - 69.61.33.159 nz -69.61.33.160 - 69.61.33.175 us -69.61.33.176 - 69.61.33.183 vn -69.61.33.184 - 69.61.33.191 us -69.61.33.192 - 69.61.33.199 gb -69.61.33.200 - 69.61.34.31 us -69.61.34.32 - 69.61.34.47 pl -69.61.34.48 - 69.61.34.191 us -69.61.34.192 - 69.61.34.199 gb -69.61.34.200 - 69.61.34.215 us -69.61.34.216 - 69.61.34.223 bg -69.61.34.224 - 69.61.34.239 gb -69.61.34.240 - 69.61.35.255 us -69.61.36.0 - 69.61.36.15 pl -69.61.36.16 - 69.61.36.127 us -69.61.36.128 - 69.61.36.143 pl -69.61.36.144 - 69.61.36.191 us -69.61.36.192 - 69.61.36.255 kw -69.61.37.0 - 69.61.40.15 us -69.61.40.16 - 69.61.40.31 be -69.61.40.32 - 69.61.40.47 pl -69.61.40.48 - 69.61.40.255 us -69.61.41.0 - 69.61.41.31 gb -69.61.41.32 - 69.61.41.63 us -69.61.41.64 - 69.61.41.127 il -69.61.41.128 - 69.61.42.111 us -69.61.42.112 - 69.61.42.119 eg -69.61.42.120 - 69.61.42.143 us -69.61.42.144 - 69.61.42.151 ca -69.61.42.152 - 69.61.45.15 us -69.61.45.16 - 69.61.45.23 ca -69.61.45.24 - 69.61.45.39 us -69.61.45.40 - 69.61.45.47 nz -69.61.45.48 - 69.61.45.55 gb -69.61.45.56 - 69.61.45.79 us -69.61.45.80 - 69.61.45.87 gb -69.61.45.88 - 69.61.45.95 us -69.61.45.96 - 69.61.45.103 pl -69.61.45.104 - 69.61.45.175 us -69.61.45.176 - 69.61.45.183 ar -69.61.45.184 - 69.61.45.223 us -69.61.45.224 - 69.61.45.231 ru -69.61.45.232 - 69.61.47.23 us -69.61.47.24 - 69.61.47.31 il -69.61.47.32 - 69.61.47.39 us -69.61.47.40 - 69.61.47.47 il -69.61.47.48 - 69.61.47.63 ar -69.61.47.64 - 69.61.47.143 us -69.61.47.144 - 69.61.47.151 gb -69.61.47.152 - 69.61.51.255 us -69.61.52.0 - 69.61.52.31 pl -69.61.52.32 - 69.61.52.55 us -69.61.52.56 - 69.61.52.63 gb -69.61.52.64 - 69.61.52.79 us -69.61.52.80 - 69.61.52.87 pl -69.61.52.88 - 69.61.52.95 us -69.61.52.96 - 69.61.52.111 bg -69.61.52.112 - 69.61.52.127 us -69.61.52.128 - 69.61.52.135 ca -69.61.52.136 - 69.61.52.151 us -69.61.52.152 - 69.61.52.159 pl -69.61.52.160 - 69.61.52.175 us -69.61.52.176 - 69.61.52.183 ca -69.61.52.184 - 69.61.52.207 us -69.61.52.208 - 69.61.52.215 dk -69.61.52.216 - 69.61.52.239 us -69.61.52.240 - 69.61.52.247 il -69.61.52.248 - 69.61.54.23 us -69.61.54.24 - 69.61.54.31 pt -69.61.54.32 - 69.61.54.87 us -69.61.54.88 - 69.61.54.95 gb -69.61.54.96 - 69.61.54.103 pl -69.61.54.104 - 69.61.54.151 us -69.61.54.152 - 69.61.54.159 bg -69.61.54.160 - 69.61.55.7 us -69.61.55.8 - 69.61.55.15 kw -69.61.55.16 - 69.61.55.23 us -69.61.55.24 - 69.61.55.31 bz -69.61.55.32 - 69.61.55.47 us -69.61.55.48 - 69.61.55.63 gb -69.61.55.64 - 69.61.55.151 us -69.61.55.152 - 69.61.55.159 ar -69.61.55.160 - 69.61.55.199 us -69.61.55.200 - 69.61.55.207 nl -69.61.55.208 - 69.61.55.215 at -69.61.55.216 - 69.61.56.23 us -69.61.56.24 - 69.61.56.31 gb -69.61.56.32 - 69.61.56.55 us -69.61.56.56 - 69.61.56.63 hr -69.61.56.64 - 69.61.56.79 us -69.61.56.80 - 69.61.56.87 pl -69.61.56.88 - 69.61.56.95 ar -69.61.56.96 - 69.61.56.159 us -69.61.56.160 - 69.61.56.191 ar -69.61.56.192 - 69.61.59.63 us -69.61.59.64 - 69.61.59.79 ro -69.61.59.80 - 69.61.59.87 gb -69.61.59.88 - 69.61.59.143 us -69.61.59.144 - 69.61.59.159 pl -69.61.59.160 - 69.61.59.191 ar -69.61.59.192 - 69.61.61.159 us -69.61.61.160 - 69.61.61.167 kw -69.61.61.168 - 69.61.61.247 us -69.61.61.248 - 69.61.61.255 in -69.61.62.0 - 69.61.63.159 us -69.61.63.160 - 69.61.63.183 kw -69.61.63.184 - 69.61.63.191 us -69.61.63.192 - 69.61.63.255 pl -69.61.64.0 - 69.61.64.15 us -69.61.64.16 - 69.61.64.23 in -69.61.64.24 - 69.61.64.31 nl -69.61.64.32 - 69.61.64.55 gb -69.61.64.56 - 69.61.64.191 us -69.61.64.192 - 69.61.64.207 gb -69.61.64.208 - 69.61.64.215 au -69.61.64.216 - 69.61.74.111 us -69.61.74.112 - 69.61.74.127 pl -69.61.74.128 - 69.61.74.159 us -69.61.74.160 - 69.61.74.199 gb -69.61.74.200 - 69.61.74.207 ar -69.61.74.208 - 69.61.74.223 pl -69.61.74.224 - 69.61.79.63 us -69.61.79.64 - 69.61.79.79 gb -69.61.79.80 - 69.61.79.87 us -69.61.79.88 - 69.61.79.95 gb -69.61.79.96 - 69.61.79.111 us -69.61.79.112 - 69.61.79.127 pl -69.61.79.128 - 69.61.83.15 us -69.61.83.16 - 69.61.83.31 pl -69.61.83.32 - 69.61.83.47 us -69.61.83.48 - 69.61.83.95 pl -69.61.83.96 - 69.61.83.255 us -69.61.84.0 - 69.61.84.15 pl -69.61.84.16 - 69.61.84.31 gb -69.61.84.32 - 69.61.84.63 pl -69.61.84.64 - 69.61.92.255 us +69.61.23.144 - 69.61.92.255 us 69.61.93.0 - 69.61.93.255 ar -69.61.94.0 - 69.61.95.255 us -69.61.96.0 - 69.61.96.7 hr -69.61.96.8 - 69.61.96.15 ar -69.61.96.16 - 69.61.96.23 us -69.61.96.24 - 69.61.96.31 bg -69.61.96.32 - 69.61.96.39 us -69.61.96.40 - 69.61.96.47 fi -69.61.96.48 - 69.61.96.63 ca -69.61.96.64 - 69.61.96.127 us -69.61.96.128 - 69.61.96.135 nl -69.61.96.136 - 69.61.96.151 us -69.61.96.152 - 69.61.96.167 ar -69.61.96.168 - 69.61.96.183 us -69.61.96.184 - 69.61.96.191 il -69.61.96.192 - 69.61.96.199 es -69.61.96.200 - 69.61.96.215 us -69.61.96.216 - 69.61.96.223 ca -69.61.96.224 - 69.61.96.239 us -69.61.96.240 - 69.61.96.247 pl -69.61.96.248 - 69.61.98.111 us -69.61.98.112 - 69.61.98.127 si -69.61.98.128 - 69.61.98.135 us -69.61.98.136 - 69.61.98.143 au -69.61.98.144 - 69.61.98.159 us -69.61.98.160 - 69.61.98.175 ar -69.61.98.176 - 69.61.98.191 us -69.61.98.192 - 69.61.98.207 gb -69.61.98.208 - 69.61.98.239 us -69.61.98.240 - 69.61.98.247 si -69.61.98.248 - 69.61.98.255 us -69.61.99.0 - 69.61.99.7 si -69.61.99.8 - 69.61.99.23 us -69.61.99.24 - 69.61.99.31 si -69.61.99.32 - 69.61.99.111 us -69.61.99.112 - 69.61.99.127 pl -69.61.99.128 - 69.61.99.135 si -69.61.99.136 - 69.61.99.151 us -69.61.99.152 - 69.61.99.159 hr -69.61.99.160 - 69.61.99.191 gb -69.61.99.192 - 69.61.99.199 bg -69.61.99.200 - 69.61.99.239 us -69.61.99.240 - 69.61.99.255 gb -69.61.100.0 - 69.61.101.31 us -69.61.101.32 - 69.61.101.47 gb -69.61.101.48 - 69.61.101.55 us -69.61.101.56 - 69.61.101.63 gb -69.61.101.64 - 69.61.101.79 ca -69.61.101.80 - 69.61.101.87 pl -69.61.101.88 - 69.61.101.119 us -69.61.101.120 - 69.61.101.127 ca -69.61.101.128 - 69.61.101.143 us -69.61.101.144 - 69.61.101.151 rs -69.61.101.152 - 69.61.101.191 us -69.61.101.192 - 69.61.101.255 pl -69.61.102.0 - 69.61.102.31 us -69.61.102.32 - 69.61.102.63 gb -69.61.102.64 - 69.61.102.95 ar -69.61.102.96 - 69.61.102.127 us -69.61.102.128 - 69.61.102.143 my -69.61.102.144 - 69.61.102.255 us -69.61.103.0 - 69.61.103.7 ch -69.61.103.8 - 69.61.103.39 us -69.61.103.40 - 69.61.103.47 gb -69.61.103.48 - 69.61.103.127 us -69.61.103.128 - 69.61.103.135 cy -69.61.103.136 - 69.61.103.175 us -69.61.103.176 - 69.61.103.183 gb -69.61.103.184 - 69.61.106.255 us -69.61.107.0 - 69.61.107.31 ca -69.61.107.32 - 69.61.107.63 ar -69.61.107.64 - 69.61.107.95 us -69.61.107.96 - 69.61.107.127 pl -69.61.107.128 - 69.61.108.255 us -69.61.109.0 - 69.61.109.255 ca -69.61.110.0 - 69.61.110.31 us -69.61.110.32 - 69.61.110.39 si -69.61.110.40 - 69.61.110.71 us -69.61.110.72 - 69.61.110.79 si -69.61.110.80 - 69.61.110.87 us -69.61.110.88 - 69.61.110.95 si -69.61.110.96 - 69.61.110.127 us -69.61.110.128 - 69.61.110.191 se -69.61.110.192 - 69.61.111.223 us -69.61.111.224 - 69.61.111.231 gb -69.61.111.232 - 69.61.111.247 us -69.61.111.248 - 69.61.111.255 si -69.61.112.0 - 69.61.125.7 us -69.61.125.8 - 69.61.125.15 ne -69.61.125.16 - 69.61.125.23 ca -69.61.125.24 - 69.61.125.79 us -69.61.125.80 - 69.61.125.95 pl -69.61.125.96 - 69.61.127.23 us -69.61.127.24 - 69.61.127.31 ar -69.61.127.32 - 69.61.127.39 si -69.61.127.40 - 69.61.127.47 ar -69.61.127.48 - 69.63.31.255 us +69.61.94.0 - 69.63.31.255 us 69.63.32.0 - 69.63.63.255 ca 69.63.64.0 - 69.63.79.255 sz -69.63.80.0 - 69.63.130.29 us -69.63.130.30 - 69.63.130.31 ca -69.63.130.32 - 69.63.130.32 us -69.63.130.33 - 69.63.130.33 ca -69.63.130.34 - 69.63.130.213 us -69.63.130.214 - 69.63.130.219 ca -69.63.130.220 - 69.63.130.244 us -69.63.130.245 - 69.63.130.253 de -69.63.130.254 - 69.63.133.119 us -69.63.133.120 - 69.63.133.128 ca -69.63.133.129 - 69.63.135.89 us -69.63.135.90 - 69.63.135.98 ca -69.63.135.99 - 69.63.135.149 us -69.63.135.150 - 69.63.135.154 ca -69.63.135.155 - 69.63.147.164 us -69.63.147.165 - 69.63.147.168 za -69.63.147.169 - 69.63.148.89 us -69.63.148.90 - 69.63.148.94 za -69.63.148.95 - 69.63.153.139 us -69.63.153.140 - 69.63.153.143 ca -69.63.153.144 - 69.63.239.255 us +69.63.80.0 - 69.63.239.255 us 69.63.240.0 - 69.63.255.255 ca -69.64.0.0 - 69.64.41.63 us -69.64.41.64 - 69.64.41.127 br -69.64.41.128 - 69.64.45.31 us -69.64.45.32 - 69.64.45.63 tr -69.64.45.64 - 69.64.45.127 us -69.64.45.128 - 69.64.45.159 fr -69.64.45.160 - 69.64.45.191 us -69.64.45.192 - 69.64.45.223 ua -69.64.45.224 - 69.64.45.239 us +69.64.0.0 - 69.64.32.25 us +69.64.32.26 - 69.64.32.26 ua +69.64.32.27 - 69.64.32.196 us +69.64.32.197 - 69.64.32.197 ua +69.64.32.198 - 69.64.34.178 us +69.64.34.179 - 69.64.34.179 de +69.64.34.180 - 69.64.35.137 us +69.64.35.138 - 69.64.35.138 de +69.64.35.139 - 69.64.35.216 us +69.64.35.217 - 69.64.35.217 ua +69.64.35.218 - 69.64.40.35 us +69.64.40.36 - 69.64.40.36 ua +69.64.40.37 - 69.64.45.239 us 69.64.45.240 - 69.64.45.247 de -69.64.45.248 - 69.64.51.77 us -69.64.51.78 - 69.64.51.89 gr -69.64.51.90 - 69.64.53.255 us -69.64.54.0 - 69.64.54.31 ca -69.64.54.32 - 69.64.54.63 jp -69.64.54.64 - 69.64.54.127 us -69.64.54.128 - 69.64.54.159 br -69.64.54.160 - 69.64.54.255 us -69.64.55.0 - 69.64.55.31 rs -69.64.55.32 - 69.64.55.95 us -69.64.55.96 - 69.64.55.127 cy -69.64.55.128 - 69.64.55.159 br -69.64.55.160 - 69.64.55.191 us -69.64.55.192 - 69.64.55.223 gb -69.64.55.224 - 69.64.59.255 us +69.64.45.248 - 69.64.50.217 us +69.64.50.218 - 69.64.50.218 ua +69.64.50.219 - 69.64.50.222 us +69.64.50.223 - 69.64.50.223 ph +69.64.50.224 - 69.64.51.74 us +69.64.51.75 - 69.64.51.75 de +69.64.51.76 - 69.64.59.255 us 69.64.60.0 - 69.64.60.255 jp -69.64.61.0 - 69.64.63.212 us -69.64.63.213 - 69.64.63.224 ru -69.64.63.225 - 69.64.73.205 us -69.64.73.206 - 69.64.73.216 de -69.64.73.217 - 69.64.77.181 us -69.64.77.182 - 69.64.77.189 ch -69.64.77.190 - 69.64.80.244 us -69.64.80.245 - 69.64.80.252 mx -69.64.80.253 - 69.64.81.11 us -69.64.81.12 - 69.64.81.19 ca -69.64.81.20 - 69.64.81.26 us -69.64.81.27 - 69.64.81.34 gb -69.64.81.35 - 69.64.81.140 us -69.64.81.141 - 69.64.81.148 mx -69.64.81.149 - 69.64.81.154 us -69.64.81.155 - 69.64.81.162 mx -69.64.81.163 - 69.64.81.199 us -69.64.81.200 - 69.64.81.209 ca -69.64.81.210 - 69.64.82.45 us -69.64.82.46 - 69.64.82.53 mx -69.64.82.54 - 69.64.169.231 us -69.64.169.232 - 69.64.169.239 eg -69.64.169.240 - 69.64.171.127 us -69.64.171.128 - 69.64.171.143 mt -69.64.171.144 - 69.64.182.63 us -69.64.182.64 - 69.64.182.71 vi -69.64.182.72 - 69.65.13.215 us -69.65.13.216 - 69.65.13.223 ca -69.65.13.224 - 69.65.14.199 us -69.65.14.200 - 69.65.14.207 ca -69.65.14.208 - 69.65.14.215 us -69.65.14.216 - 69.65.14.223 ca -69.65.14.224 - 69.65.43.237 us -69.65.43.238 - 69.65.43.238 a1 -69.65.43.239 - 69.65.51.63 us -69.65.51.64 - 69.65.51.95 a1 -69.65.51.96 - 69.65.51.223 us -69.65.51.224 - 69.65.51.255 a1 -69.65.52.0 - 69.65.54.79 us -69.65.54.80 - 69.65.54.87 vn -69.65.54.88 - 69.65.147.255 us +69.64.61.0 - 69.64.247.255 us +69.64.248.0 - 69.64.249.255 jp +69.64.250.0 - 69.64.253.255 us +69.64.254.0 - 69.64.255.255 au +69.65.0.0 - 69.65.147.255 us 69.65.148.0 - 69.65.148.255 ec 69.65.149.0 - 69.65.150.255 us 69.65.151.0 - 69.65.151.255 ec @@ -28585,70 +16785,23 @@ 69.67.0.0 - 69.67.15.255 ca 69.67.16.0 - 69.67.31.255 us 69.67.32.0 - 69.67.47.255 za -69.67.48.0 - 69.67.49.15 us -69.67.49.16 - 69.67.49.23 ca -69.67.49.24 - 69.67.49.47 us -69.67.49.48 - 69.67.49.63 do -69.67.49.64 - 69.67.52.127 us -69.67.52.128 - 69.67.52.143 ca -69.67.52.144 - 69.67.52.159 us +69.67.48.0 - 69.67.52.159 us 69.67.52.160 - 69.67.52.175 be -69.67.52.176 - 69.67.52.231 us -69.67.52.232 - 69.67.52.239 jo -69.67.52.240 - 69.67.54.95 us -69.67.54.96 - 69.67.54.127 ca -69.67.54.128 - 69.67.54.191 do -69.67.54.192 - 69.67.56.95 us -69.67.56.96 - 69.67.56.111 ca -69.67.56.112 - 69.67.59.63 us -69.67.59.64 - 69.67.59.95 in -69.67.59.96 - 69.67.159.255 us +69.67.52.176 - 69.67.159.255 us 69.67.160.0 - 69.67.191.255 ca 69.67.192.0 - 69.69.255.255 us 69.70.0.0 - 69.70.255.255 ca -69.71.0.0 - 69.71.58.207 us -69.71.58.208 - 69.71.58.215 ca -69.71.58.216 - 69.71.60.87 us -69.71.60.88 - 69.71.60.95 ca -69.71.60.96 - 69.71.63.255 us +69.71.0.0 - 69.71.63.255 us 69.71.64.0 - 69.71.95.255 ca 69.71.96.0 - 69.71.127.255 us -69.71.128.0 - 69.71.139.255 a2 -69.71.140.0 - 69.71.146.255 bh -69.71.147.0 - 69.71.153.255 a2 -69.71.154.0 - 69.71.154.255 us -69.71.155.0 - 69.71.156.255 a2 -69.71.157.0 - 69.72.142.215 us -69.72.142.216 - 69.72.142.223 in -69.72.142.224 - 69.72.184.159 us -69.72.184.160 - 69.72.184.167 in -69.72.184.168 - 69.72.187.95 us -69.72.187.96 - 69.72.187.103 gb -69.72.187.104 - 69.72.214.239 us -69.72.214.240 - 69.72.214.247 in -69.72.214.248 - 69.72.242.7 us -69.72.242.8 - 69.72.242.15 in -69.72.242.16 - 69.72.242.151 us -69.72.242.152 - 69.72.242.159 in -69.72.242.160 - 69.72.243.79 us -69.72.243.80 - 69.72.243.127 cr -69.72.243.128 - 69.72.244.87 us -69.72.244.88 - 69.72.244.95 in -69.72.244.96 - 69.72.245.95 us -69.72.245.96 - 69.72.245.103 in -69.72.245.104 - 69.72.246.7 us -69.72.246.8 - 69.72.246.15 in -69.72.246.16 - 69.72.246.39 us -69.72.246.40 - 69.72.246.47 in -69.72.246.48 - 69.73.179.135 us -69.73.179.136 - 69.73.179.143 id -69.73.179.144 - 69.73.191.255 us +69.71.128.0 - 69.71.152.255 a2 +69.71.153.0 - 69.71.153.255 us +69.71.154.0 - 69.71.159.255 a2 +69.71.160.0 - 69.73.191.255 us 69.73.192.0 - 69.73.193.255 bb 69.73.194.0 - 69.73.195.255 gd 69.73.196.0 - 69.73.198.255 bb -69.73.199.0 - 69.73.199.78 vc -69.73.199.79 - 69.73.199.79 bb -69.73.199.80 - 69.73.202.255 vc +69.73.199.0 - 69.73.202.255 vc 69.73.203.0 - 69.73.207.255 bb 69.73.208.0 - 69.73.208.255 gd 69.73.209.0 - 69.73.229.255 bb @@ -28658,665 +16811,259 @@ 69.73.240.0 - 69.73.245.255 gd 69.73.246.0 - 69.73.255.255 bb 69.74.0.0 - 69.77.159.255 us -69.77.160.0 - 69.77.163.255 ca -69.77.164.0 - 69.77.164.15 us -69.77.164.16 - 69.77.173.31 ca -69.77.173.32 - 69.77.173.47 us -69.77.173.48 - 69.77.177.111 ca -69.77.177.112 - 69.77.177.127 us -69.77.177.128 - 69.77.191.255 ca -69.77.192.0 - 69.78.255.255 us -69.79.0.0 - 69.79.23.255 pr -69.79.24.0 - 69.79.24.255 an +69.77.160.0 - 69.77.191.255 ca +69.77.192.0 - 69.79.4.255 us +69.79.5.0 - 69.79.5.255 pr +69.79.6.0 - 69.79.7.255 us +69.79.8.0 - 69.79.15.255 pr +69.79.16.0 - 69.79.23.255 us +69.79.24.0 - 69.79.24.255 cw 69.79.25.0 - 69.79.26.255 us 69.79.27.0 - 69.79.27.255 do 69.79.28.0 - 69.79.31.255 bs -69.79.32.0 - 69.79.47.255 an -69.79.48.0 - 69.79.63.255 gt -69.79.64.0 - 69.79.71.255 pr +69.79.32.0 - 69.79.71.255 us 69.79.72.0 - 69.79.79.255 gt -69.79.80.0 - 69.79.87.255 us -69.79.88.0 - 69.79.111.255 pr +69.79.80.0 - 69.79.103.255 us +69.79.104.0 - 69.79.111.255 pr 69.79.112.0 - 69.79.119.255 gt 69.79.120.0 - 69.79.120.255 bs -69.79.121.0 - 69.79.122.255 an +69.79.121.0 - 69.79.122.255 cw 69.79.123.0 - 69.79.123.255 us 69.79.124.0 - 69.79.127.255 bs 69.79.128.0 - 69.79.135.255 pr 69.79.136.0 - 69.79.187.255 us 69.79.188.0 - 69.79.191.255 pr 69.79.192.0 - 69.79.207.255 jm -69.79.208.0 - 69.79.223.255 hn -69.79.224.0 - 69.79.255.255 us +69.79.208.0 - 69.79.223.255 us +69.79.224.0 - 69.79.224.255 pr +69.79.225.0 - 69.79.255.255 us 69.80.0.0 - 69.80.1.255 bb 69.80.2.0 - 69.80.35.255 lc 69.80.36.0 - 69.80.45.255 dm 69.80.46.0 - 69.80.50.255 gd -69.80.51.0 - 69.80.63.255 bb -69.80.64.0 - 69.80.95.255 us -69.80.96.0 - 69.80.111.255 a1 -69.80.112.0 - 69.80.215.159 us -69.80.215.160 - 69.80.215.191 au -69.80.215.192 - 69.80.215.247 us -69.80.215.248 - 69.80.215.255 au -69.80.216.0 - 69.87.255.255 us -69.88.0.0 - 69.88.2.239 a2 -69.88.2.240 - 69.88.2.243 np -69.88.2.244 - 69.88.2.247 af -69.88.2.248 - 69.88.2.255 a2 -69.88.3.0 - 69.88.3.7 bd -69.88.3.8 - 69.88.3.15 id -69.88.3.16 - 69.88.3.23 bd -69.88.3.24 - 69.88.3.31 id -69.88.3.32 - 69.88.3.39 pk -69.88.3.40 - 69.88.3.71 id -69.88.3.72 - 69.88.3.79 bd -69.88.3.80 - 69.88.3.87 id -69.88.3.88 - 69.88.3.103 bd -69.88.3.104 - 69.88.3.111 a2 -69.88.3.112 - 69.88.3.119 pk -69.88.3.120 - 69.88.3.183 id -69.88.3.184 - 69.88.3.191 pk -69.88.3.192 - 69.88.3.239 id -69.88.3.240 - 69.88.3.247 bd -69.88.3.248 - 69.88.4.47 id -69.88.4.48 - 69.88.4.55 bd -69.88.4.56 - 69.88.4.95 id -69.88.4.96 - 69.88.4.103 a2 -69.88.4.104 - 69.88.4.111 id -69.88.4.112 - 69.88.4.119 a2 -69.88.4.120 - 69.88.4.135 id -69.88.4.136 - 69.88.4.143 a2 -69.88.4.144 - 69.88.4.151 id -69.88.4.152 - 69.88.4.159 bd -69.88.4.160 - 69.88.4.191 id -69.88.4.192 - 69.88.4.199 a2 -69.88.4.200 - 69.88.4.207 bd -69.88.4.208 - 69.88.4.223 a2 -69.88.4.224 - 69.88.4.231 bd -69.88.4.232 - 69.88.4.247 id -69.88.4.248 - 69.88.4.255 a2 -69.88.5.0 - 69.88.5.31 id -69.88.5.32 - 69.88.5.47 a2 -69.88.5.48 - 69.88.5.79 bd -69.88.5.80 - 69.88.5.167 a2 -69.88.5.168 - 69.88.5.175 id -69.88.5.176 - 69.88.5.207 a2 -69.88.5.208 - 69.88.5.223 id -69.88.5.224 - 69.88.6.15 a2 -69.88.6.16 - 69.88.6.31 id -69.88.6.32 - 69.88.6.47 a2 -69.88.6.48 - 69.88.6.63 bd -69.88.6.64 - 69.88.6.79 a2 -69.88.6.80 - 69.88.6.111 bd -69.88.6.112 - 69.88.6.223 a2 -69.88.6.224 - 69.88.7.31 bd -69.88.7.32 - 69.88.7.63 id -69.88.7.64 - 69.88.7.127 a2 -69.88.7.128 - 69.88.7.159 bd -69.88.7.160 - 69.88.7.191 a2 -69.88.7.192 - 69.88.7.223 bd -69.88.7.224 - 69.88.7.255 a2 -69.88.8.0 - 69.88.8.127 np -69.88.8.128 - 69.88.8.255 bd -69.88.9.0 - 69.88.9.95 a2 -69.88.9.96 - 69.88.9.103 us -69.88.9.104 - 69.88.9.159 a2 -69.88.9.160 - 69.88.9.167 us -69.88.9.168 - 69.88.9.199 a2 -69.88.9.200 - 69.88.9.207 bd -69.88.9.208 - 69.88.10.31 a2 -69.88.10.32 - 69.88.10.63 bd -69.88.10.64 - 69.88.10.159 a2 -69.88.10.160 - 69.88.10.175 af -69.88.10.176 - 69.88.10.223 a2 -69.88.10.224 - 69.88.10.255 us -69.88.11.0 - 69.88.11.255 np -69.88.12.0 - 69.88.12.95 a2 -69.88.12.96 - 69.88.12.159 bd -69.88.12.160 - 69.88.12.223 a2 -69.88.12.224 - 69.88.12.255 bd -69.88.13.0 - 69.88.13.255 us -69.88.14.0 - 69.88.15.127 bd -69.88.15.128 - 69.88.15.191 a2 -69.88.15.192 - 69.88.16.127 bd -69.88.16.128 - 69.88.17.255 a2 -69.88.18.0 - 69.88.18.127 us -69.88.18.128 - 69.88.18.255 a2 -69.88.19.0 - 69.88.19.127 us -69.88.19.128 - 69.88.20.255 a2 -69.88.21.0 - 69.88.21.255 bd -69.88.22.0 - 69.88.22.15 pk -69.88.22.16 - 69.88.22.23 id -69.88.22.24 - 69.88.22.31 a2 -69.88.22.32 - 69.88.22.39 pk -69.88.22.40 - 69.88.22.47 a2 -69.88.22.48 - 69.88.22.55 pk -69.88.22.56 - 69.88.22.135 a2 -69.88.22.136 - 69.88.22.143 id -69.88.22.144 - 69.88.22.183 a2 -69.88.22.184 - 69.88.22.223 id -69.88.22.224 - 69.88.23.127 a2 -69.88.23.128 - 69.88.23.191 bd -69.88.23.192 - 69.88.23.255 a2 -69.88.24.0 - 69.88.24.23 id -69.88.24.24 - 69.88.24.39 a2 -69.88.24.40 - 69.88.24.47 id -69.88.24.48 - 69.88.24.103 a2 -69.88.24.104 - 69.88.24.111 pk -69.88.24.112 - 69.88.24.135 a2 -69.88.24.136 - 69.88.24.143 pk -69.88.24.144 - 69.88.24.215 a2 -69.88.24.216 - 69.88.24.223 pk -69.88.24.224 - 69.88.25.63 a2 -69.88.25.64 - 69.88.25.71 id -69.88.25.72 - 69.88.25.255 a2 -69.88.26.0 - 69.88.26.63 bd -69.88.26.64 - 69.88.26.255 a2 -69.88.27.0 - 69.88.28.127 bd -69.88.28.128 - 69.88.28.255 a2 -69.88.29.0 - 69.88.30.127 bd -69.88.30.128 - 69.88.30.255 a2 -69.88.31.0 - 69.88.31.63 bd -69.88.31.64 - 69.88.31.127 us -69.88.31.128 - 69.88.31.255 a2 -69.88.32.0 - 69.88.47.255 us +69.80.51.0 - 69.80.54.255 bb +69.80.55.0 - 69.80.58.255 vc +69.80.59.0 - 69.80.63.255 bb +69.80.64.0 - 69.88.15.255 us +69.88.16.0 - 69.88.16.255 ws +69.88.17.0 - 69.88.22.255 us +69.88.23.0 - 69.88.23.255 bd +69.88.24.0 - 69.88.24.255 us +69.88.25.0 - 69.88.25.255 id +69.88.26.0 - 69.88.47.255 us 69.88.48.0 - 69.88.63.255 ca 69.88.64.0 - 69.89.31.255 us 69.89.32.0 - 69.89.32.255 pr 69.89.33.0 - 69.89.33.255 us 69.89.34.0 - 69.89.47.255 pr -69.89.48.0 - 69.89.66.191 us -69.89.66.192 - 69.89.66.223 jp -69.89.66.224 - 69.89.68.31 us -69.89.68.32 - 69.89.68.47 jp -69.89.68.48 - 69.89.255.255 us -69.90.0.0 - 69.90.1.71 ca -69.90.1.72 - 69.90.1.255 us -69.90.2.0 - 69.90.3.111 ca -69.90.3.112 - 69.90.3.127 bv -69.90.3.128 - 69.90.3.147 ca -69.90.3.148 - 69.90.3.159 us -69.90.3.160 - 69.90.3.191 ca -69.90.3.192 - 69.90.3.223 us -69.90.3.224 - 69.90.11.255 ca -69.90.12.0 - 69.90.15.255 us -69.90.16.0 - 69.90.16.175 ca -69.90.16.176 - 69.90.16.191 us -69.90.16.192 - 69.90.17.143 ca -69.90.17.144 - 69.90.17.159 us -69.90.17.160 - 69.90.18.87 ca -69.90.18.88 - 69.90.18.95 rs -69.90.18.96 - 69.90.18.135 ca -69.90.18.136 - 69.90.18.143 us -69.90.18.144 - 69.90.18.151 ca -69.90.18.152 - 69.90.18.183 us -69.90.18.184 - 69.90.18.207 ca -69.90.18.208 - 69.90.18.215 us -69.90.18.216 - 69.90.26.223 ca -69.90.26.224 - 69.90.26.255 us -69.90.27.0 - 69.90.28.239 ca -69.90.28.240 - 69.90.28.255 pa -69.90.29.0 - 69.90.29.127 ca -69.90.29.128 - 69.90.29.159 us -69.90.29.160 - 69.90.29.191 ca -69.90.29.192 - 69.90.29.223 au -69.90.29.224 - 69.90.29.239 us -69.90.29.240 - 69.90.30.127 ca -69.90.30.128 - 69.90.30.191 us -69.90.30.192 - 69.90.30.207 ca -69.90.30.208 - 69.90.30.223 us -69.90.30.224 - 69.90.30.239 ca -69.90.30.240 - 69.90.30.247 us -69.90.30.248 - 69.90.30.255 mx -69.90.31.0 - 69.90.31.63 us -69.90.31.64 - 69.90.31.95 ca -69.90.31.96 - 69.90.31.175 us -69.90.31.176 - 69.90.31.231 ca -69.90.31.232 - 69.90.31.239 us -69.90.31.240 - 69.90.31.247 ca -69.90.31.248 - 69.90.35.255 us -69.90.36.0 - 69.90.37.63 ca -69.90.37.64 - 69.90.37.127 us -69.90.37.128 - 69.90.37.223 ca -69.90.37.224 - 69.90.37.255 us -69.90.38.0 - 69.90.39.255 ca -69.90.40.0 - 69.90.42.175 us -69.90.42.176 - 69.90.42.183 ca -69.90.42.184 - 69.90.44.255 us -69.90.45.0 - 69.90.55.255 ca -69.90.56.0 - 69.90.56.31 us -69.90.56.32 - 69.90.56.127 ca -69.90.56.128 - 69.90.56.255 us +69.89.48.0 - 69.89.72.255 us +69.89.73.0 - 69.89.73.255 ca +69.89.74.0 - 69.89.255.255 us +69.90.0.0 - 69.90.0.255 ca +69.90.1.0 - 69.90.1.255 us +69.90.2.0 - 69.90.2.255 ca +69.90.3.0 - 69.90.3.255 us +69.90.4.0 - 69.90.5.255 ca +69.90.6.0 - 69.90.6.255 us +69.90.7.0 - 69.90.11.255 ca +69.90.12.0 - 69.90.17.159 us +69.90.17.160 - 69.90.17.167 ca +69.90.17.168 - 69.90.18.239 us +69.90.18.240 - 69.90.25.255 ca +69.90.26.0 - 69.90.26.255 us +69.90.27.0 - 69.90.27.255 ca +69.90.28.0 - 69.90.29.239 us +69.90.29.240 - 69.90.29.255 ca +69.90.30.0 - 69.90.31.175 us +69.90.31.176 - 69.90.31.191 ca +69.90.31.192 - 69.90.38.255 us +69.90.39.0 - 69.90.39.255 ca +69.90.40.0 - 69.90.44.255 us +69.90.45.0 - 69.90.47.255 ca +69.90.48.0 - 69.90.48.31 us +69.90.48.32 - 69.90.48.47 ca +69.90.48.48 - 69.90.48.143 us +69.90.48.144 - 69.90.48.159 ca +69.90.48.160 - 69.90.50.255 us +69.90.51.0 - 69.90.51.255 ca +69.90.52.0 - 69.90.55.127 us +69.90.55.128 - 69.90.55.255 ca +69.90.56.0 - 69.90.56.255 us 69.90.57.0 - 69.90.59.255 ca 69.90.60.0 - 69.90.61.255 us -69.90.62.0 - 69.90.65.63 ca -69.90.65.64 - 69.90.65.71 us -69.90.65.72 - 69.90.65.135 ca -69.90.65.136 - 69.90.65.143 us -69.90.65.144 - 69.90.68.135 ca -69.90.68.136 - 69.90.68.143 fi -69.90.68.144 - 69.90.69.15 ca -69.90.69.16 - 69.90.69.39 us -69.90.69.40 - 69.90.69.175 ca -69.90.69.176 - 69.90.69.183 us -69.90.69.184 - 69.90.70.255 ca -69.90.71.0 - 69.90.71.7 us -69.90.71.8 - 69.90.71.15 gb -69.90.71.16 - 69.90.71.63 ca -69.90.71.64 - 69.90.71.103 us -69.90.71.104 - 69.90.71.255 ca -69.90.72.0 - 69.90.72.31 us -69.90.72.32 - 69.90.72.175 ca -69.90.72.176 - 69.90.72.183 sg -69.90.72.184 - 69.90.72.207 ca -69.90.72.208 - 69.90.72.223 us -69.90.72.224 - 69.90.74.207 ca -69.90.74.208 - 69.90.74.215 us -69.90.74.216 - 69.90.74.223 ca -69.90.74.224 - 69.90.74.255 bv -69.90.75.0 - 69.90.75.7 us -69.90.75.8 - 69.90.75.15 ca -69.90.75.16 - 69.90.75.31 us -69.90.75.32 - 69.90.75.127 ca -69.90.75.128 - 69.90.75.255 us -69.90.76.0 - 69.90.76.31 ca -69.90.76.32 - 69.90.76.63 gb -69.90.76.64 - 69.90.76.95 ca -69.90.76.96 - 69.90.76.127 us -69.90.76.128 - 69.90.77.47 ca -69.90.77.48 - 69.90.77.55 us -69.90.77.56 - 69.90.77.127 ca -69.90.77.128 - 69.90.77.159 us -69.90.77.160 - 69.90.77.183 ca -69.90.77.184 - 69.90.77.191 nz -69.90.77.192 - 69.90.78.7 ca -69.90.78.8 - 69.90.78.15 us -69.90.78.16 - 69.90.78.23 ca -69.90.78.24 - 69.90.78.31 us -69.90.78.32 - 69.90.78.87 ca -69.90.78.88 - 69.90.78.95 us -69.90.78.96 - 69.90.79.31 ca -69.90.79.32 - 69.90.79.55 us -69.90.79.56 - 69.90.79.79 ca -69.90.79.80 - 69.90.79.87 us -69.90.79.88 - 69.90.79.159 ca -69.90.79.160 - 69.90.79.167 us -69.90.79.168 - 69.90.79.183 ca -69.90.79.184 - 69.90.79.191 us -69.90.79.192 - 69.90.83.63 ca -69.90.83.64 - 69.90.83.71 us -69.90.83.72 - 69.90.83.95 ca -69.90.83.96 - 69.90.83.127 us -69.90.83.128 - 69.90.83.143 ca -69.90.83.144 - 69.90.83.147 us -69.90.83.148 - 69.90.83.175 ca -69.90.83.176 - 69.90.83.191 vg -69.90.83.192 - 69.90.85.47 ca -69.90.85.48 - 69.90.85.79 us -69.90.85.80 - 69.90.94.127 ca -69.90.94.128 - 69.90.94.143 us -69.90.94.144 - 69.90.94.159 ca -69.90.94.160 - 69.90.94.167 us -69.90.94.168 - 69.90.94.175 ca -69.90.94.176 - 69.90.94.191 us -69.90.94.192 - 69.90.96.63 ca -69.90.96.64 - 69.90.96.95 us -69.90.96.96 - 69.90.97.95 ca -69.90.97.96 - 69.90.97.111 us -69.90.97.112 - 69.90.98.191 ca -69.90.98.192 - 69.90.98.207 us -69.90.98.208 - 69.90.99.135 ca -69.90.99.136 - 69.90.99.143 cn -69.90.99.144 - 69.90.99.175 ca -69.90.99.176 - 69.90.99.191 us -69.90.99.192 - 69.90.99.239 ca -69.90.99.240 - 69.90.99.255 us -69.90.100.0 - 69.90.102.255 ca -69.90.103.0 - 69.90.103.7 us +69.90.62.0 - 69.90.63.255 ca +69.90.64.0 - 69.90.66.255 us +69.90.67.0 - 69.90.67.255 ca +69.90.68.0 - 69.90.72.255 us +69.90.73.0 - 69.90.73.255 ca +69.90.74.0 - 69.90.74.255 us +69.90.75.0 - 69.90.75.255 ca +69.90.76.0 - 69.90.77.159 us +69.90.77.160 - 69.90.77.175 ca +69.90.77.176 - 69.90.79.255 us +69.90.80.0 - 69.90.80.255 ca +69.90.81.0 - 69.90.81.255 us +69.90.82.0 - 69.90.82.255 ca +69.90.83.0 - 69.90.85.255 us +69.90.86.0 - 69.90.88.255 ca +69.90.89.0 - 69.90.89.255 us +69.90.90.0 - 69.90.91.255 ca +69.90.92.0 - 69.90.92.255 us +69.90.93.0 - 69.90.93.255 ca +69.90.94.0 - 69.90.96.95 us +69.90.96.96 - 69.90.96.111 ca +69.90.96.112 - 69.90.96.127 us +69.90.96.128 - 69.90.96.255 ca +69.90.97.0 - 69.90.98.63 us +69.90.98.64 - 69.90.98.79 ca +69.90.98.80 - 69.90.98.223 us +69.90.98.224 - 69.90.98.255 ca +69.90.99.0 - 69.90.99.143 us +69.90.99.144 - 69.90.99.159 ca +69.90.99.160 - 69.90.99.255 us +69.90.100.0 - 69.90.101.255 ca +69.90.102.0 - 69.90.103.7 us 69.90.103.8 - 69.90.103.15 ca -69.90.103.16 - 69.90.103.23 us -69.90.103.24 - 69.90.103.63 ca -69.90.103.64 - 69.90.103.95 pa -69.90.103.96 - 69.90.103.167 ca -69.90.103.168 - 69.90.103.175 us -69.90.103.176 - 69.90.103.183 ca -69.90.103.184 - 69.90.103.191 us -69.90.103.192 - 69.90.108.63 ca -69.90.108.64 - 69.90.108.79 us -69.90.108.80 - 69.90.108.127 ca -69.90.108.128 - 69.90.108.143 bv -69.90.108.144 - 69.90.108.159 us -69.90.108.160 - 69.90.110.255 ca -69.90.111.0 - 69.90.111.31 us -69.90.111.32 - 69.90.111.79 ca -69.90.111.80 - 69.90.111.87 us -69.90.111.88 - 69.90.111.95 mx -69.90.111.96 - 69.90.111.143 ca -69.90.111.144 - 69.90.111.191 us -69.90.111.192 - 69.90.115.255 ca +69.90.103.16 - 69.90.103.31 us +69.90.103.32 - 69.90.103.47 ca +69.90.103.48 - 69.90.103.95 us +69.90.103.96 - 69.90.103.111 ca +69.90.103.112 - 69.90.103.255 us +69.90.104.0 - 69.90.107.255 ca +69.90.108.0 - 69.90.108.255 us +69.90.109.0 - 69.90.110.255 ca +69.90.111.0 - 69.90.111.255 us +69.90.112.0 - 69.90.115.255 ca 69.90.116.0 - 69.90.116.255 us 69.90.117.0 - 69.90.118.255 ca -69.90.119.0 - 69.90.123.95 us -69.90.123.96 - 69.90.123.127 ca -69.90.123.128 - 69.90.124.127 us -69.90.124.128 - 69.90.124.140 kw -69.90.124.141 - 69.90.132.255 us -69.90.133.0 - 69.90.133.255 ca -69.90.134.0 - 69.90.135.255 us -69.90.136.0 - 69.90.140.79 ca -69.90.140.80 - 69.90.140.95 us -69.90.140.96 - 69.90.140.135 ca -69.90.140.136 - 69.90.140.143 sg -69.90.140.144 - 69.90.140.215 ca -69.90.140.216 - 69.90.140.223 us -69.90.140.224 - 69.90.140.247 ca -69.90.140.248 - 69.90.140.255 us +69.90.119.0 - 69.90.135.255 us +69.90.136.0 - 69.90.139.255 ca +69.90.140.0 - 69.90.140.255 us 69.90.141.0 - 69.90.143.255 ca 69.90.144.0 - 69.90.147.255 us -69.90.148.0 - 69.90.151.255 ca -69.90.152.0 - 69.90.155.223 us -69.90.155.224 - 69.90.155.255 ca -69.90.156.0 - 69.90.159.255 us +69.90.148.0 - 69.90.152.255 ca +69.90.153.0 - 69.90.159.255 us 69.90.160.0 - 69.90.163.255 ca -69.90.164.0 - 69.90.172.255 us -69.90.173.0 - 69.90.173.63 ca -69.90.173.64 - 69.90.175.255 us -69.90.176.0 - 69.90.179.15 ca -69.90.179.16 - 69.90.179.31 us -69.90.179.32 - 69.90.179.207 ca -69.90.179.208 - 69.90.179.215 us -69.90.179.216 - 69.90.181.207 ca -69.90.181.208 - 69.90.181.223 us -69.90.181.224 - 69.90.183.79 ca -69.90.183.80 - 69.90.183.95 us -69.90.183.96 - 69.90.183.207 ca -69.90.183.208 - 69.90.183.223 us -69.90.183.224 - 69.90.184.15 ca -69.90.184.16 - 69.90.184.191 us +69.90.164.0 - 69.90.175.255 us +69.90.176.0 - 69.90.178.255 ca +69.90.179.0 - 69.90.179.255 us +69.90.180.0 - 69.90.180.255 ca +69.90.181.0 - 69.90.184.191 us 69.90.184.192 - 69.90.184.255 in -69.90.185.0 - 69.90.191.255 us -69.90.192.0 - 69.90.197.127 ca -69.90.197.128 - 69.90.197.223 us -69.90.197.224 - 69.90.198.127 ca -69.90.198.128 - 69.90.198.159 us -69.90.198.160 - 69.90.199.239 ca -69.90.199.240 - 69.90.200.31 us -69.90.200.32 - 69.90.200.63 ca -69.90.200.64 - 69.90.200.79 us -69.90.200.80 - 69.90.200.95 ca -69.90.200.96 - 69.90.200.127 us -69.90.200.128 - 69.90.200.159 ca -69.90.200.160 - 69.90.202.7 us -69.90.202.8 - 69.90.202.63 ca -69.90.202.64 - 69.90.202.95 us -69.90.202.96 - 69.90.202.255 ca -69.90.203.0 - 69.90.203.79 us -69.90.203.80 - 69.90.203.127 ca -69.90.203.128 - 69.90.203.143 us -69.90.203.144 - 69.90.203.159 ca -69.90.203.160 - 69.90.203.175 us -69.90.203.176 - 69.90.205.87 ca -69.90.205.88 - 69.90.205.91 us -69.90.205.92 - 69.90.206.239 ca -69.90.206.240 - 69.90.206.247 us -69.90.206.248 - 69.90.207.255 ca -69.90.208.0 - 69.90.208.127 us -69.90.208.128 - 69.90.208.255 ca -69.90.209.0 - 69.90.209.223 us -69.90.209.224 - 69.90.209.255 ca -69.90.210.0 - 69.90.213.255 us +69.90.185.0 - 69.90.190.255 us +69.90.191.0 - 69.90.191.255 in +69.90.192.0 - 69.90.196.255 ca +69.90.197.0 - 69.90.209.255 us +69.90.210.0 - 69.90.210.255 nl +69.90.211.0 - 69.90.213.255 us 69.90.214.0 - 69.90.214.255 ca -69.90.215.0 - 69.90.215.255 us -69.90.216.0 - 69.90.216.63 ca -69.90.216.64 - 69.90.216.127 us -69.90.216.128 - 69.90.216.143 ca -69.90.216.144 - 69.90.216.175 us -69.90.216.176 - 69.90.216.191 ca -69.90.216.192 - 69.90.216.255 us -69.90.217.0 - 69.90.218.31 ca -69.90.218.32 - 69.90.218.63 us -69.90.218.64 - 69.90.218.159 ca -69.90.218.160 - 69.90.218.175 us -69.90.218.176 - 69.90.218.207 ca -69.90.218.208 - 69.90.218.215 fi -69.90.218.216 - 69.90.218.231 ca -69.90.218.232 - 69.90.218.239 us -69.90.218.240 - 69.90.222.255 ca -69.90.223.0 - 69.90.230.175 us -69.90.230.176 - 69.90.230.191 ca -69.90.230.192 - 69.90.233.63 us -69.90.233.64 - 69.90.233.79 ca -69.90.233.80 - 69.90.233.97 us -69.90.233.98 - 69.90.233.113 gb -69.90.233.114 - 69.90.236.180 us -69.90.236.181 - 69.90.236.183 ca -69.90.236.184 - 69.90.236.184 nl -69.90.236.185 - 69.90.236.185 gb -69.90.236.186 - 69.90.239.255 us -69.90.240.0 - 69.90.241.255 ca -69.90.242.0 - 69.90.242.15 us -69.90.242.16 - 69.90.242.63 ca -69.90.242.64 - 69.90.242.103 us -69.90.242.104 - 69.90.242.111 dm -69.90.242.112 - 69.90.242.119 ca -69.90.242.120 - 69.90.242.127 us -69.90.242.128 - 69.90.243.255 ca -69.90.244.0 - 69.90.244.0 us -69.90.244.1 - 69.90.244.87 ca -69.90.244.88 - 69.90.244.95 us -69.90.244.96 - 69.90.244.119 ca -69.90.244.120 - 69.90.244.191 us -69.90.244.192 - 69.90.244.207 ca -69.90.244.208 - 69.90.244.223 us -69.90.244.224 - 69.90.244.239 ca -69.90.244.240 - 69.90.244.255 us +69.90.215.0 - 69.90.216.255 us +69.90.217.0 - 69.90.217.255 ca +69.90.218.0 - 69.90.218.51 us +69.90.218.52 - 69.90.218.55 ca +69.90.218.56 - 69.90.218.79 us +69.90.218.80 - 69.90.218.87 ca +69.90.218.88 - 69.90.218.127 us +69.90.218.128 - 69.90.218.159 ca +69.90.218.160 - 69.90.219.255 us +69.90.220.0 - 69.90.223.255 ca +69.90.224.0 - 69.90.239.255 us +69.90.240.0 - 69.90.240.255 ca +69.90.241.0 - 69.90.242.255 us +69.90.243.0 - 69.90.243.255 ca +69.90.244.0 - 69.90.244.255 us 69.90.245.0 - 69.90.247.255 ca -69.90.248.0 - 69.95.65.111 us -69.95.65.112 - 69.95.65.119 cn -69.95.65.120 - 69.95.88.119 us -69.95.88.120 - 69.95.88.127 pa -69.95.88.128 - 69.95.95.255 us -69.95.96.0 - 69.95.96.7 cn -69.95.96.8 - 69.147.224.71 us -69.147.224.72 - 69.147.224.79 za -69.147.224.80 - 69.147.224.215 us -69.147.224.216 - 69.147.224.223 ca -69.147.224.224 - 69.147.225.63 us -69.147.225.64 - 69.147.225.71 ca -69.147.225.72 - 69.147.228.7 us -69.147.228.8 - 69.147.228.15 ca -69.147.228.16 - 69.147.233.103 us -69.147.233.104 - 69.147.233.111 ca -69.147.233.112 - 69.147.235.103 us -69.147.235.104 - 69.147.235.111 gb -69.147.235.112 - 69.147.236.143 us -69.147.236.144 - 69.147.236.151 ca -69.147.236.152 - 69.147.238.71 us -69.147.238.72 - 69.147.238.79 in -69.147.238.80 - 69.147.241.151 us -69.147.241.152 - 69.147.241.159 ca -69.147.241.160 - 69.147.242.175 us -69.147.242.176 - 69.147.242.183 in -69.147.242.184 - 69.147.243.143 us -69.147.243.144 - 69.147.243.151 ca -69.147.243.152 - 69.147.244.127 us -69.147.244.128 - 69.147.244.135 gb -69.147.244.136 - 69.147.244.151 us -69.147.244.152 - 69.147.244.159 ca -69.147.244.160 - 69.147.250.31 us -69.147.250.32 - 69.147.250.39 ca -69.147.250.40 - 69.147.250.239 us -69.147.250.240 - 69.147.250.255 ca -69.147.251.0 - 69.147.251.255 us -69.147.252.0 - 69.147.252.23 in -69.147.252.24 - 69.147.252.31 ca -69.147.252.32 - 69.147.252.63 in -69.147.252.64 - 69.147.252.95 us -69.147.252.96 - 69.147.252.127 in -69.147.252.128 - 69.147.252.159 si -69.147.252.160 - 69.147.252.191 us -69.147.252.192 - 69.147.252.223 in -69.147.252.224 - 69.147.252.231 us -69.147.252.232 - 69.147.252.239 in -69.147.252.240 - 69.147.255.7 us -69.147.255.8 - 69.147.255.15 in -69.147.255.16 - 69.147.255.47 us -69.147.255.48 - 69.147.255.55 ca -69.147.255.56 - 69.147.255.135 us -69.147.255.136 - 69.147.255.143 in -69.147.255.144 - 69.147.255.231 us -69.147.255.232 - 69.147.255.239 in -69.147.255.240 - 69.153.149.143 us -69.153.149.144 - 69.153.149.159 ua -69.153.149.160 - 69.155.255.255 us +69.90.248.0 - 69.155.255.255 us 69.156.0.0 - 69.159.255.255 ca -69.160.0.0 - 69.160.80.127 us -69.160.80.128 - 69.160.80.159 ca -69.160.80.160 - 69.160.95.255 us +69.160.0.0 - 69.160.95.255 us 69.160.96.0 - 69.160.127.255 jm 69.160.128.0 - 69.161.127.255 us 69.161.128.0 - 69.161.159.255 ca -69.161.160.0 - 69.162.143.255 us -69.162.144.0 - 69.162.144.255 eg -69.162.145.0 - 69.163.32.255 us -69.163.33.0 - 69.163.33.255 ca -69.163.34.0 - 69.163.43.255 us +69.161.160.0 - 69.163.43.255 us 69.163.44.0 - 69.163.44.255 ca 69.163.45.0 - 69.164.67.255 us -69.164.68.0 - 69.164.72.31 ca -69.164.72.32 - 69.164.72.39 us -69.164.72.40 - 69.164.72.135 ca -69.164.72.136 - 69.164.72.143 us -69.164.72.144 - 69.164.72.183 ca -69.164.72.184 - 69.164.72.191 us -69.164.72.192 - 69.164.72.231 ca -69.164.72.232 - 69.164.72.239 us -69.164.72.240 - 69.164.73.7 ca -69.164.73.8 - 69.164.73.15 us -69.164.73.16 - 69.164.73.255 ca +69.164.68.0 - 69.164.68.255 ca +69.164.69.0 - 69.164.69.31 us +69.164.69.32 - 69.164.69.47 ca +69.164.69.48 - 69.164.69.71 us +69.164.69.72 - 69.164.69.95 ca +69.164.69.96 - 69.164.69.191 us +69.164.69.192 - 69.164.70.255 ca +69.164.71.0 - 69.164.71.159 us +69.164.71.160 - 69.164.71.167 ca +69.164.71.168 - 69.164.72.39 us +69.164.72.40 - 69.164.72.63 ca +69.164.72.64 - 69.164.72.159 us +69.164.72.160 - 69.164.72.167 ca +69.164.72.168 - 69.164.72.191 us +69.164.72.192 - 69.164.72.207 ca +69.164.72.208 - 69.164.72.239 us +69.164.72.240 - 69.164.72.255 ca +69.164.73.0 - 69.164.73.79 us +69.164.73.80 - 69.164.73.95 ca +69.164.73.96 - 69.164.73.223 us +69.164.73.224 - 69.164.73.255 ca 69.164.74.0 - 69.164.175.255 us 69.164.176.0 - 69.164.191.255 ca -69.164.192.0 - 69.165.47.255 us -69.165.48.0 - 69.165.63.255 a1 -69.165.64.0 - 69.165.127.255 us +69.164.192.0 - 69.165.79.255 us +69.165.80.0 - 69.165.95.255 ca +69.165.96.0 - 69.165.127.255 us 69.165.128.0 - 69.165.255.255 ca -69.166.8.0 - 69.166.15.255 us +69.166.0.0 - 69.166.15.255 us 69.166.16.0 - 69.166.31.255 ca 69.166.32.0 - 69.166.111.255 us 69.166.112.0 - 69.166.127.255 ca -69.166.128.0 - 69.168.127.255 us +69.166.128.0 - 69.167.80.255 us +69.167.81.0 - 69.167.81.127 ca +69.167.81.128 - 69.168.127.255 us 69.168.128.0 - 69.168.191.255 ca -69.168.192.0 - 69.171.95.255 us +69.168.192.0 - 69.168.232.255 us +69.168.233.0 - 69.168.233.255 gb +69.168.234.0 - 69.168.234.255 nl +69.168.235.0 - 69.168.235.255 gb +69.168.236.0 - 69.169.93.255 us +69.169.94.0 - 69.169.94.255 es +69.169.95.0 - 69.171.95.255 us 69.171.96.0 - 69.171.111.255 ca 69.171.112.0 - 69.171.127.255 us 69.171.128.0 - 69.171.159.255 ca -69.171.160.0 - 69.171.207.255 us -69.171.208.0 - 69.171.223.255 ca -69.171.224.0 - 69.172.63.255 us +69.171.160.0 - 69.172.63.255 us 69.172.64.0 - 69.172.127.255 ca -69.172.128.0 - 69.172.139.127 us -69.172.139.128 - 69.172.139.255 ru -69.172.140.0 - 69.172.143.255 us +69.172.128.0 - 69.172.143.255 us 69.172.144.0 - 69.172.191.255 ca 69.172.192.0 - 69.172.192.255 us 69.172.193.0 - 69.172.193.255 ca -69.172.194.0 - 69.172.194.63 us -69.172.194.64 - 69.172.194.95 ca -69.172.194.96 - 69.172.195.255 us -69.172.196.0 - 69.172.202.15 ca -69.172.202.16 - 69.172.202.255 us -69.172.203.0 - 69.172.203.31 ca -69.172.203.32 - 69.172.203.255 us -69.172.204.0 - 69.172.205.255 ca -69.172.206.0 - 69.172.206.31 sg -69.172.206.32 - 69.172.206.47 ca -69.172.206.48 - 69.172.206.55 sg +69.172.194.0 - 69.172.195.255 us +69.172.196.0 - 69.172.199.255 ca +69.172.200.0 - 69.172.204.255 us +69.172.205.0 - 69.172.205.255 ca +69.172.206.0 - 69.172.206.55 us 69.172.206.56 - 69.172.206.63 ca -69.172.206.64 - 69.172.206.127 us -69.172.206.128 - 69.172.207.255 ca -69.172.208.0 - 69.172.210.159 us -69.172.210.160 - 69.172.210.191 in -69.172.210.192 - 69.172.210.219 us -69.172.210.220 - 69.172.210.223 ca -69.172.210.224 - 69.172.212.255 us -69.172.213.0 - 69.172.213.63 in -69.172.213.64 - 69.172.216.255 us -69.172.217.0 - 69.172.218.255 ca -69.172.219.0 - 69.172.223.255 us -69.172.224.0 - 69.172.226.95 ca -69.172.226.96 - 69.172.226.103 de -69.172.226.104 - 69.172.226.111 ca -69.172.226.112 - 69.172.226.119 us -69.172.226.120 - 69.172.226.159 ca -69.172.226.160 - 69.172.226.175 us -69.172.226.176 - 69.172.226.239 ca -69.172.226.240 - 69.172.226.255 au -69.172.227.0 - 69.172.227.3 us -69.172.227.4 - 69.172.227.7 ca -69.172.227.8 - 69.172.227.15 us -69.172.227.16 - 69.172.227.23 sg -69.172.227.24 - 69.172.227.31 us -69.172.227.32 - 69.172.227.95 ca -69.172.227.96 - 69.172.227.127 us -69.172.227.128 - 69.172.227.215 ca -69.172.227.216 - 69.172.227.255 us -69.172.228.0 - 69.172.228.15 ca -69.172.228.16 - 69.172.228.31 us -69.172.228.32 - 69.172.228.95 in -69.172.228.96 - 69.172.236.31 us -69.172.236.32 - 69.172.236.79 ca -69.172.236.80 - 69.172.236.95 us -69.172.236.96 - 69.172.236.111 ca -69.172.236.112 - 69.172.236.127 us -69.172.236.128 - 69.172.236.255 ca -69.172.237.0 - 69.172.237.31 us -69.172.237.32 - 69.172.237.63 ca -69.172.237.64 - 69.172.237.95 us -69.172.237.96 - 69.172.237.119 ca -69.172.237.120 - 69.172.237.127 us -69.172.237.128 - 69.172.241.191 ca -69.172.241.192 - 69.172.241.199 us -69.172.241.200 - 69.172.241.207 ca -69.172.241.208 - 69.172.242.255 us +69.172.206.64 - 69.172.216.255 us +69.172.217.0 - 69.172.219.255 ca +69.172.220.0 - 69.172.222.255 us +69.172.223.0 - 69.172.223.127 in +69.172.223.128 - 69.172.223.255 us +69.172.224.0 - 69.172.226.255 ca +69.172.227.0 - 69.172.227.63 us +69.172.227.64 - 69.172.227.95 ca +69.172.227.96 - 69.172.228.63 us +69.172.228.64 - 69.172.228.95 in +69.172.228.96 - 69.172.236.159 us +69.172.236.160 - 69.172.236.191 ca +69.172.236.192 - 69.172.239.255 us +69.172.240.0 - 69.172.240.255 ca +69.172.241.0 - 69.172.241.15 us +69.172.241.16 - 69.172.241.23 ca +69.172.241.24 - 69.172.241.95 us +69.172.241.96 - 69.172.241.127 ca +69.172.241.128 - 69.172.242.255 us 69.172.243.0 - 69.172.243.255 ca -69.172.244.0 - 69.172.245.223 us -69.172.245.224 - 69.172.245.255 es +69.172.244.0 - 69.172.245.255 us 69.172.246.0 - 69.172.255.255 ca 69.173.0.0 - 69.173.31.255 us 69.173.32.0 - 69.173.63.255 ca -69.173.64.0 - 69.174.80.255 us -69.174.81.0 - 69.174.81.7 sg -69.174.81.8 - 69.174.101.15 us -69.174.101.16 - 69.174.101.31 br -69.174.101.32 - 69.174.101.47 us -69.174.101.48 - 69.174.101.55 ar -69.174.101.56 - 69.174.101.63 us -69.174.101.64 - 69.174.101.95 br -69.174.101.96 - 69.174.101.103 us -69.174.101.104 - 69.174.101.111 br -69.174.101.112 - 69.174.101.119 us -69.174.101.120 - 69.174.101.127 br -69.174.101.128 - 69.174.101.191 us -69.174.101.192 - 69.174.101.199 br -69.174.101.200 - 69.174.101.207 us -69.174.101.208 - 69.174.101.223 br -69.174.101.224 - 69.174.101.239 us -69.174.101.240 - 69.174.101.255 br -69.174.102.0 - 69.174.240.31 us -69.174.240.32 - 69.174.240.63 gb -69.174.240.64 - 69.174.243.127 us -69.174.243.128 - 69.174.243.191 de -69.174.243.192 - 69.174.248.57 us -69.174.248.58 - 69.174.248.70 ca -69.174.248.71 - 69.174.248.99 us -69.174.248.100 - 69.174.248.107 au -69.174.248.108 - 69.174.248.115 in -69.174.248.116 - 69.174.249.13 us -69.174.249.14 - 69.174.249.21 in -69.174.249.22 - 69.174.249.105 us -69.174.249.106 - 69.174.249.115 in -69.174.249.116 - 69.176.80.255 us +69.173.64.0 - 69.176.80.255 us 69.176.81.0 - 69.176.82.255 ca 69.176.83.0 - 69.176.87.255 us 69.176.88.0 - 69.176.88.255 ca @@ -29325,639 +17072,132 @@ 69.176.93.0 - 69.176.93.255 sg 69.176.94.0 - 69.176.159.255 us 69.176.160.0 - 69.176.191.255 ca -69.176.192.0 - 69.195.193.127 us -69.195.193.128 - 69.195.193.143 cr -69.195.193.144 - 69.195.193.159 us -69.195.193.160 - 69.195.193.175 pr -69.195.193.176 - 69.195.195.255 us -69.195.196.0 - 69.195.196.63 br -69.195.196.64 - 69.195.197.207 us -69.195.197.208 - 69.195.197.223 de -69.195.197.224 - 69.195.209.127 us -69.195.209.128 - 69.195.211.255 co -69.195.212.0 - 69.195.215.255 il -69.195.216.0 - 69.195.227.255 us +69.176.192.0 - 69.191.175.255 us +69.191.176.0 - 69.191.176.255 gb +69.191.177.0 - 69.191.177.255 us +69.191.178.0 - 69.191.178.255 jp +69.191.179.0 - 69.192.5.255 us +69.192.6.0 - 69.192.6.255 nl +69.192.7.0 - 69.192.63.255 us +69.192.64.0 - 69.192.79.255 nl +69.192.80.0 - 69.195.209.255 us +69.195.210.0 - 69.195.211.255 co +69.195.212.0 - 69.195.227.255 us 69.195.228.0 - 69.195.228.255 cy -69.195.229.0 - 69.195.231.207 us -69.195.231.208 - 69.195.231.223 mq -69.195.231.224 - 69.195.231.255 us -69.195.232.0 - 69.195.235.255 il +69.195.229.0 - 69.195.235.255 us 69.195.236.0 - 69.195.237.255 do -69.195.238.0 - 69.195.240.191 us -69.195.240.192 - 69.195.240.207 vg -69.195.240.208 - 69.195.247.255 us +69.195.238.0 - 69.195.247.255 us 69.195.248.0 - 69.195.248.255 es -69.195.249.0 - 69.195.249.207 us -69.195.249.208 - 69.195.249.223 uy -69.195.249.224 - 69.195.251.223 us -69.195.251.224 - 69.195.251.239 be -69.195.251.240 - 69.195.254.255 us -69.195.255.0 - 69.195.255.255 vg +69.195.249.0 - 69.195.255.255 us 69.196.0.0 - 69.196.31.255 ca 69.196.32.0 - 69.196.63.255 us 69.196.64.0 - 69.196.95.255 ca 69.196.96.0 - 69.196.127.255 us 69.196.128.0 - 69.196.191.255 ca -69.196.192.0 - 69.196.255.255 us -69.197.0.0 - 69.197.0.255 kh -69.197.1.0 - 69.197.3.65 us -69.197.3.66 - 69.197.3.66 cn -69.197.3.67 - 69.197.3.67 tr -69.197.3.68 - 69.197.3.68 ca -69.197.3.69 - 69.197.3.69 ro -69.197.3.70 - 69.197.3.196 us -69.197.3.197 - 69.197.3.197 pk -69.197.3.198 - 69.197.4.2 us -69.197.4.3 - 69.197.4.3 au -69.197.4.4 - 69.197.4.66 us -69.197.4.67 - 69.197.4.67 sc -69.197.4.68 - 69.197.4.69 us -69.197.4.70 - 69.197.4.70 sa -69.197.4.71 - 69.197.4.71 cn -69.197.4.72 - 69.197.4.72 au -69.197.4.73 - 69.197.4.132 us -69.197.4.133 - 69.197.4.133 gb -69.197.4.134 - 69.197.4.192 us -69.197.4.193 - 69.197.4.193 cn -69.197.4.194 - 69.197.4.194 us -69.197.4.195 - 69.197.4.195 pk -69.197.4.196 - 69.197.5.0 us -69.197.5.1 - 69.197.5.1 sc -69.197.5.2 - 69.197.5.2 cn -69.197.5.3 - 69.197.5.3 sc -69.197.5.4 - 69.197.5.4 us -69.197.5.5 - 69.197.5.5 pr -69.197.5.6 - 69.197.5.65 us -69.197.5.66 - 69.197.5.66 bd -69.197.5.67 - 69.197.5.67 my -69.197.5.68 - 69.197.5.134 us -69.197.5.135 - 69.197.5.135 kh -69.197.5.136 - 69.197.5.193 us -69.197.5.194 - 69.197.5.194 kh -69.197.5.195 - 69.197.6.4 us -69.197.6.5 - 69.197.6.5 tr -69.197.6.6 - 69.197.6.6 us -69.197.6.7 - 69.197.6.7 ph -69.197.6.8 - 69.197.6.64 us -69.197.6.65 - 69.197.6.66 tr -69.197.6.67 - 69.197.6.73 us -69.197.6.74 - 69.197.6.74 cn -69.197.6.75 - 69.197.6.131 us -69.197.6.132 - 69.197.6.132 ro -69.197.6.133 - 69.197.6.198 us -69.197.6.199 - 69.197.6.199 kr -69.197.6.200 - 69.197.6.200 cn -69.197.6.201 - 69.197.7.0 us -69.197.7.1 - 69.197.7.2 cn -69.197.7.3 - 69.197.7.3 us -69.197.7.4 - 69.197.7.4 tr -69.197.7.5 - 69.197.7.6 us -69.197.7.7 - 69.197.7.7 cn -69.197.7.8 - 69.197.7.65 us -69.197.7.66 - 69.197.7.66 cn -69.197.7.67 - 69.197.7.71 us -69.197.7.72 - 69.197.7.72 cn -69.197.7.73 - 69.197.7.73 ca -69.197.7.74 - 69.197.7.81 us -69.197.7.82 - 69.197.7.82 cn -69.197.7.83 - 69.197.7.83 us -69.197.7.84 - 69.197.7.84 cn -69.197.7.85 - 69.197.7.128 us -69.197.7.129 - 69.197.7.129 cn -69.197.7.130 - 69.197.7.140 us -69.197.7.141 - 69.197.7.141 tr -69.197.7.142 - 69.197.7.192 us -69.197.7.193 - 69.197.7.193 tr -69.197.7.194 - 69.197.7.198 us -69.197.7.199 - 69.197.7.199 tr -69.197.7.200 - 69.197.7.203 us -69.197.7.204 - 69.197.7.206 tr -69.197.7.207 - 69.197.7.208 us -69.197.7.209 - 69.197.7.209 cz -69.197.7.210 - 69.197.7.215 us -69.197.7.216 - 69.197.7.216 bd -69.197.7.217 - 69.197.8.64 us -69.197.8.65 - 69.197.8.65 cn -69.197.8.66 - 69.197.8.72 us -69.197.8.73 - 69.197.8.73 tr -69.197.8.74 - 69.197.17.15 us -69.197.17.16 - 69.197.17.23 cn -69.197.17.24 - 69.197.20.131 us -69.197.20.132 - 69.197.20.135 pr -69.197.20.136 - 69.197.21.255 us -69.197.22.0 - 69.197.22.63 cn -69.197.22.64 - 69.197.22.67 us -69.197.22.68 - 69.197.22.71 bd -69.197.22.72 - 69.197.22.79 tr -69.197.22.80 - 69.197.22.111 us -69.197.22.112 - 69.197.22.119 cn -69.197.22.120 - 69.197.22.123 us -69.197.22.124 - 69.197.22.127 cn -69.197.22.128 - 69.197.22.255 pk -69.197.23.0 - 69.197.23.3 us -69.197.23.4 - 69.197.23.7 bd -69.197.23.8 - 69.197.23.11 tr -69.197.23.12 - 69.197.23.47 us -69.197.23.48 - 69.197.23.55 cn -69.197.23.56 - 69.197.23.59 au -69.197.23.60 - 69.197.24.167 us -69.197.24.168 - 69.197.24.175 cn -69.197.24.176 - 69.197.24.191 us -69.197.24.192 - 69.197.25.63 cn -69.197.25.64 - 69.197.25.87 us -69.197.25.88 - 69.197.25.91 cn -69.197.25.92 - 69.197.25.95 us -69.197.25.96 - 69.197.25.127 sc -69.197.25.128 - 69.197.25.159 us -69.197.25.160 - 69.197.25.191 cn -69.197.25.192 - 69.197.26.255 us -69.197.27.0 - 69.197.27.31 tr -69.197.27.32 - 69.197.27.63 sc -69.197.27.64 - 69.197.27.187 us -69.197.27.188 - 69.197.27.191 cn -69.197.27.192 - 69.197.55.31 us -69.197.55.32 - 69.197.55.35 cn -69.197.55.36 - 69.197.56.127 us -69.197.56.128 - 69.197.56.191 cn -69.197.56.192 - 69.197.56.255 us -69.197.57.0 - 69.197.57.63 gb -69.197.57.64 - 69.197.57.191 us -69.197.57.192 - 69.197.58.63 cn -69.197.58.64 - 69.197.58.79 us -69.197.58.80 - 69.197.58.83 cn -69.197.58.84 - 69.197.58.87 us -69.197.58.88 - 69.197.58.91 tr -69.197.58.92 - 69.197.58.95 us -69.197.58.96 - 69.197.58.127 tr -69.197.58.128 - 69.197.58.191 pk -69.197.58.192 - 69.197.58.255 us -69.197.59.0 - 69.197.59.3 tr -69.197.59.4 - 69.197.59.15 us -69.197.59.16 - 69.197.59.19 sa -69.197.59.20 - 69.197.59.23 tr -69.197.59.24 - 69.197.59.27 us -69.197.59.28 - 69.197.59.31 tr -69.197.59.32 - 69.197.59.35 us -69.197.59.36 - 69.197.59.43 sa -69.197.59.44 - 69.197.59.51 us -69.197.59.52 - 69.197.59.55 tr -69.197.59.56 - 69.197.59.59 bd -69.197.59.60 - 69.197.59.63 us -69.197.59.64 - 69.197.59.67 sa -69.197.59.68 - 69.197.59.75 us -69.197.59.76 - 69.197.59.79 sc -69.197.59.80 - 69.197.59.83 us -69.197.59.84 - 69.197.59.87 cn -69.197.59.88 - 69.197.59.255 us -69.197.60.0 - 69.197.60.127 my -69.197.60.128 - 69.197.60.191 cn -69.197.60.192 - 69.197.61.255 us -69.197.62.0 - 69.197.62.63 cn -69.197.62.64 - 69.197.62.95 us -69.197.62.96 - 69.197.62.111 cn -69.197.62.112 - 69.197.62.115 tr -69.197.62.116 - 69.197.62.119 bd -69.197.62.120 - 69.197.62.127 cn -69.197.62.128 - 69.197.63.59 us -69.197.63.60 - 69.197.63.63 tr -69.197.63.64 - 69.197.136.63 us -69.197.136.64 - 69.197.136.79 ru -69.197.136.80 - 69.197.136.80 us -69.197.136.81 - 69.197.136.127 ru -69.197.136.128 - 70.23.255.255 us +69.196.192.0 - 70.23.255.255 us 70.24.0.0 - 70.25.96.71 ca 70.25.96.72 - 70.25.96.79 us 70.25.96.80 - 70.25.96.95 ca 70.25.96.96 - 70.25.96.111 us -70.25.96.112 - 70.25.99.143 ca -70.25.99.144 - 70.25.99.159 us -70.25.99.160 - 70.25.224.159 ca -70.25.224.160 - 70.25.224.175 us -70.25.224.176 - 70.25.254.7 ca -70.25.254.8 - 70.25.254.15 us -70.25.254.16 - 70.31.255.255 ca -70.32.0.0 - 70.32.38.151 us -70.32.38.152 - 70.32.38.159 gb -70.32.38.160 - 70.32.40.191 us -70.32.40.192 - 70.32.40.199 za -70.32.40.200 - 70.32.43.199 us -70.32.43.200 - 70.32.43.207 ca -70.32.43.208 - 70.32.45.87 us -70.32.45.88 - 70.32.45.95 gb -70.32.45.96 - 70.32.46.223 us -70.32.46.224 - 70.32.46.255 in -70.32.47.0 - 70.33.162.255 us -70.33.163.0 - 70.33.163.47 ca -70.33.163.48 - 70.33.163.63 us -70.33.163.64 - 70.33.163.79 ca -70.33.163.80 - 70.33.163.95 us -70.33.163.96 - 70.33.163.127 ca -70.33.163.128 - 70.33.180.39 us -70.33.180.40 - 70.33.180.47 ca -70.33.180.48 - 70.33.191.255 us -70.33.192.0 - 70.33.204.15 ca -70.33.204.16 - 70.33.204.23 us -70.33.204.24 - 70.33.204.63 ca -70.33.204.64 - 70.33.204.95 us -70.33.204.96 - 70.33.204.143 ca -70.33.204.144 - 70.33.204.151 us -70.33.204.152 - 70.33.204.207 ca -70.33.204.208 - 70.33.204.223 us -70.33.204.224 - 70.33.204.255 ca -70.33.205.0 - 70.33.205.31 us -70.33.205.32 - 70.33.205.199 ca -70.33.205.200 - 70.33.205.223 us -70.33.205.224 - 70.33.206.199 ca -70.33.206.200 - 70.33.206.239 us -70.33.206.240 - 70.33.207.63 ca -70.33.207.64 - 70.33.207.79 us -70.33.207.80 - 70.33.207.167 ca -70.33.207.168 - 70.33.207.175 us -70.33.207.176 - 70.33.207.191 ca -70.33.207.192 - 70.33.207.199 us -70.33.207.200 - 70.33.210.31 ca -70.33.210.32 - 70.33.210.63 us -70.33.210.64 - 70.33.210.127 ca -70.33.210.128 - 70.33.210.159 us -70.33.210.160 - 70.33.210.191 ca -70.33.210.192 - 70.33.210.255 us -70.33.211.0 - 70.33.211.47 ca -70.33.211.48 - 70.33.211.63 us -70.33.211.64 - 70.33.211.223 ca -70.33.211.224 - 70.33.211.255 us +70.25.96.112 - 70.31.255.255 ca +70.32.0.0 - 70.33.191.255 us +70.33.192.0 - 70.33.203.255 ca +70.33.204.0 - 70.33.205.159 us +70.33.205.160 - 70.33.205.191 ca +70.33.205.192 - 70.33.208.255 us +70.33.209.0 - 70.33.209.255 ca +70.33.210.0 - 70.33.211.255 us 70.33.212.0 - 70.33.212.255 gb -70.33.213.0 - 70.33.213.95 ca -70.33.213.96 - 70.33.213.119 us -70.33.213.120 - 70.33.213.223 ca -70.33.213.224 - 70.33.213.255 us -70.33.214.0 - 70.33.216.255 ca -70.33.217.0 - 70.33.217.127 us -70.33.217.128 - 70.33.217.207 ca -70.33.217.208 - 70.33.217.223 us -70.33.217.224 - 70.33.217.255 ca -70.33.218.0 - 70.33.218.255 us -70.33.219.0 - 70.33.240.31 ca -70.33.240.32 - 70.33.240.47 us -70.33.240.48 - 70.33.240.55 ca -70.33.240.56 - 70.33.240.63 us -70.33.240.64 - 70.33.240.95 ca -70.33.240.96 - 70.33.240.127 us -70.33.240.128 - 70.33.240.191 gi -70.33.240.192 - 70.33.240.207 ca -70.33.240.208 - 70.33.240.215 gi -70.33.240.216 - 70.33.240.255 us -70.33.241.0 - 70.33.241.15 ca -70.33.241.16 - 70.33.241.31 nz -70.33.241.32 - 70.33.241.127 ca -70.33.241.128 - 70.33.241.223 us -70.33.241.224 - 70.33.244.255 ca -70.33.245.0 - 70.33.246.255 us -70.33.247.0 - 70.33.247.255 ca -70.33.248.0 - 70.33.248.255 nl -70.33.249.0 - 70.34.111.255 us -70.34.112.0 - 70.34.127.255 ca -70.34.128.0 - 70.34.192.31 us -70.34.192.32 - 70.34.192.39 jm -70.34.192.40 - 70.34.192.47 us -70.34.192.48 - 70.34.192.63 tr -70.34.192.64 - 70.34.192.127 us -70.34.192.128 - 70.34.192.135 jm -70.34.192.136 - 70.34.192.143 gb -70.34.192.144 - 70.34.192.191 tr -70.34.192.192 - 70.34.194.39 us -70.34.194.40 - 70.34.194.47 br -70.34.194.48 - 70.34.194.127 us -70.34.194.128 - 70.34.194.135 hk -70.34.194.136 - 70.34.195.47 us -70.34.195.48 - 70.34.195.55 ro -70.34.195.56 - 70.34.196.87 us -70.34.196.88 - 70.34.196.95 pe -70.34.196.96 - 70.34.196.143 us -70.34.196.144 - 70.34.196.151 pe -70.34.196.152 - 70.34.199.95 us -70.34.199.96 - 70.34.199.111 de -70.34.199.112 - 70.34.208.31 us -70.34.208.32 - 70.34.208.39 il -70.34.208.40 - 70.34.208.127 us -70.34.208.128 - 70.34.208.159 ca -70.34.208.160 - 70.34.208.255 us -70.34.209.0 - 70.34.209.255 an -70.34.210.0 - 70.34.211.159 us -70.34.211.160 - 70.34.211.191 jp -70.34.211.192 - 70.34.212.159 us -70.34.212.160 - 70.34.212.191 mx -70.34.212.192 - 70.34.212.223 us -70.34.212.224 - 70.34.212.255 gb -70.34.213.0 - 70.34.213.15 us -70.34.213.16 - 70.34.213.23 au -70.34.213.24 - 70.34.213.31 us -70.34.213.32 - 70.34.213.39 mx -70.34.213.40 - 70.34.214.255 us -70.34.215.0 - 70.34.215.7 gb -70.34.215.8 - 70.34.215.15 us -70.34.215.16 - 70.34.215.23 ca -70.34.215.24 - 70.34.215.55 us -70.34.215.56 - 70.34.215.63 cz -70.34.215.64 - 70.34.215.87 us -70.34.215.88 - 70.34.215.95 ru -70.34.215.96 - 70.34.215.103 us -70.34.215.104 - 70.34.215.111 au -70.34.215.112 - 70.34.215.119 bg -70.34.215.120 - 70.34.215.127 sg -70.34.215.128 - 70.34.215.183 us -70.34.215.184 - 70.34.215.191 de -70.34.215.192 - 70.34.215.247 us -70.34.215.248 - 70.34.215.255 tr -70.34.216.0 - 70.34.216.127 us -70.34.216.128 - 70.34.216.159 nz -70.34.216.160 - 70.34.216.191 cn -70.34.216.192 - 70.34.216.223 us -70.34.216.224 - 70.34.216.255 gb -70.34.217.0 - 70.34.217.31 us -70.34.217.32 - 70.34.217.63 gb -70.34.217.64 - 70.34.217.95 nl -70.34.217.96 - 70.34.217.127 us -70.34.217.128 - 70.34.217.159 ca -70.34.217.160 - 70.34.217.191 my -70.34.217.192 - 70.34.218.31 us -70.34.218.32 - 70.34.218.63 br -70.34.218.64 - 70.34.218.255 us -70.34.219.0 - 70.34.219.31 de -70.34.219.32 - 70.34.219.95 us -70.34.219.96 - 70.34.219.127 il -70.34.219.128 - 70.34.219.159 br -70.34.219.160 - 70.34.219.191 fi -70.34.219.192 - 70.34.220.159 us -70.34.220.160 - 70.34.220.175 au -70.34.220.176 - 70.34.220.183 us -70.34.220.184 - 70.34.220.191 fr -70.34.220.192 - 70.34.221.63 us -70.34.221.64 - 70.34.221.95 de -70.34.221.96 - 70.34.221.127 jm -70.34.221.128 - 70.34.221.135 us -70.34.221.136 - 70.34.221.143 gb -70.34.221.144 - 70.34.221.151 us -70.34.221.152 - 70.34.221.159 gb -70.34.221.160 - 70.34.221.191 au -70.34.221.192 - 70.34.221.255 us -70.34.222.0 - 70.34.222.31 fr -70.34.222.32 - 70.34.222.95 us -70.34.222.96 - 70.34.222.127 eg -70.34.222.128 - 70.34.222.159 us -70.34.222.160 - 70.34.222.191 ca -70.34.222.192 - 70.34.222.223 pk -70.34.222.224 - 70.34.222.255 ca -70.34.223.0 - 70.34.223.31 us -70.34.223.32 - 70.34.223.63 do -70.34.223.64 - 70.34.223.95 ca -70.34.223.96 - 70.34.223.103 fr -70.34.223.104 - 70.34.223.111 us -70.34.223.112 - 70.34.223.119 ru -70.34.223.120 - 70.34.223.127 us -70.34.223.128 - 70.34.223.159 in -70.34.223.160 - 70.34.224.103 us -70.34.224.104 - 70.34.224.111 ca -70.34.224.112 - 70.34.224.127 us -70.34.224.128 - 70.34.224.159 br -70.34.224.160 - 70.34.225.63 us -70.34.225.64 - 70.34.225.95 es -70.34.225.96 - 70.34.225.127 us -70.34.225.128 - 70.34.225.159 id -70.34.225.160 - 70.34.225.191 de -70.34.225.192 - 70.34.225.223 gb -70.34.225.224 - 70.34.225.255 us -70.34.226.0 - 70.34.226.31 gb -70.34.226.32 - 70.34.226.63 us -70.34.226.64 - 70.34.226.95 ru -70.34.226.96 - 70.34.226.127 tr -70.34.226.128 - 70.34.226.175 us -70.34.226.176 - 70.34.226.191 au -70.34.226.192 - 70.34.227.63 us -70.34.227.64 - 70.34.227.95 gb -70.34.227.96 - 70.34.227.127 us -70.34.227.128 - 70.34.227.159 be -70.34.227.160 - 70.34.227.191 lt -70.34.227.192 - 70.34.228.31 us -70.34.228.32 - 70.34.228.63 ca -70.34.228.64 - 70.34.228.95 us -70.34.228.96 - 70.34.228.127 gb -70.34.228.128 - 70.34.228.159 hk -70.34.228.160 - 70.34.229.31 us -70.34.229.32 - 70.34.229.63 pk -70.34.229.64 - 70.34.229.159 us -70.34.229.160 - 70.34.229.175 fr -70.34.229.176 - 70.34.229.183 no -70.34.229.184 - 70.34.229.191 br -70.34.229.192 - 70.34.230.63 us -70.34.230.64 - 70.34.230.95 gb -70.34.230.96 - 70.34.230.127 us -70.34.230.128 - 70.34.230.159 ca -70.34.230.160 - 70.34.230.191 us -70.34.230.192 - 70.34.230.223 id -70.34.230.224 - 70.34.231.95 us -70.34.231.96 - 70.34.231.103 tr -70.34.231.104 - 70.34.231.111 ro -70.34.231.112 - 70.34.231.119 fr -70.34.231.120 - 70.34.231.127 se -70.34.231.128 - 70.34.231.159 us -70.34.231.160 - 70.34.231.191 gr -70.34.231.192 - 70.34.231.223 de -70.34.231.224 - 70.34.231.255 gb -70.34.232.0 - 70.34.232.31 br -70.34.232.32 - 70.34.232.63 us -70.34.232.64 - 70.34.232.95 at -70.34.232.96 - 70.34.232.191 us -70.34.232.192 - 70.34.232.223 gb -70.34.232.224 - 70.34.232.255 us -70.34.233.0 - 70.34.233.31 cn -70.34.233.32 - 70.34.233.71 us -70.34.233.72 - 70.34.233.79 au -70.34.233.80 - 70.34.233.87 us -70.34.233.88 - 70.34.233.95 gb -70.34.233.96 - 70.34.233.223 us -70.34.233.224 - 70.34.233.255 fi -70.34.234.0 - 70.34.235.63 us -70.34.235.64 - 70.34.235.95 gb -70.34.235.96 - 70.34.235.127 lt -70.34.235.128 - 70.34.235.159 tr -70.34.235.160 - 70.34.235.191 my -70.34.235.192 - 70.34.235.223 us -70.34.235.224 - 70.34.235.255 tr -70.34.236.0 - 70.34.236.31 us -70.34.236.32 - 70.34.236.63 tr -70.34.236.64 - 70.34.236.127 us -70.34.236.128 - 70.34.236.159 ca -70.34.236.160 - 70.34.237.31 us -70.34.237.32 - 70.34.237.63 it -70.34.237.64 - 70.34.237.95 pa -70.34.237.96 - 70.34.237.127 fr -70.34.237.128 - 70.34.237.159 es -70.34.237.160 - 70.34.238.31 us -70.34.238.32 - 70.34.238.63 ru -70.34.238.64 - 70.34.238.95 cn -70.34.238.96 - 70.34.238.127 uy -70.34.238.128 - 70.34.238.159 gr -70.34.238.160 - 70.34.238.191 hr -70.34.238.192 - 70.34.239.31 us -70.34.239.32 - 70.34.239.63 ie -70.34.239.64 - 70.34.239.95 us -70.34.239.96 - 70.34.239.127 th -70.34.239.128 - 70.34.240.159 us -70.34.240.160 - 70.34.240.191 gb -70.34.240.192 - 70.34.240.223 ca -70.34.240.224 - 70.34.241.191 us -70.34.241.192 - 70.34.241.223 de -70.34.241.224 - 70.34.241.255 us -70.34.242.0 - 70.34.242.7 tr -70.34.242.8 - 70.34.242.31 us -70.34.242.32 - 70.34.242.39 ca -70.34.242.40 - 70.34.242.63 us -70.34.242.64 - 70.34.242.95 jp -70.34.242.96 - 70.34.242.191 us -70.34.242.192 - 70.34.242.223 au -70.34.242.224 - 70.34.242.255 fr -70.34.243.0 - 70.34.243.31 ca -70.34.243.32 - 70.34.243.63 us -70.34.243.64 - 70.34.243.95 hr -70.34.243.96 - 70.34.243.103 gb -70.34.243.104 - 70.34.243.111 us -70.34.243.112 - 70.34.243.119 hr -70.34.243.120 - 70.34.243.255 us -70.34.244.0 - 70.34.244.31 vn -70.34.244.32 - 70.34.244.159 us -70.34.244.160 - 70.34.244.191 ca -70.34.244.192 - 70.34.244.223 us -70.34.244.224 - 70.34.244.255 cy -70.34.245.0 - 70.34.246.127 us -70.34.246.128 - 70.34.246.143 ca -70.34.246.144 - 70.34.248.183 us -70.34.248.184 - 70.34.248.191 tr -70.34.248.192 - 70.34.249.71 us -70.34.249.72 - 70.34.249.79 at -70.34.249.80 - 70.34.249.135 us -70.34.249.136 - 70.34.249.143 fr -70.34.249.144 - 70.34.249.151 us -70.34.249.152 - 70.34.249.159 il -70.34.249.160 - 70.34.250.63 us -70.34.250.64 - 70.34.250.71 il -70.34.250.72 - 70.34.250.79 us -70.34.250.80 - 70.34.250.95 ca -70.34.250.96 - 70.34.251.215 us -70.34.251.216 - 70.34.251.223 de -70.34.251.224 - 70.34.252.95 us -70.34.252.96 - 70.34.252.103 ca -70.34.252.104 - 70.34.252.111 de -70.34.252.112 - 70.34.252.119 us -70.34.252.120 - 70.34.252.127 au -70.34.252.128 - 70.34.254.167 us -70.34.254.168 - 70.34.254.175 ca -70.34.254.176 - 70.34.254.247 us -70.34.254.248 - 70.34.254.255 dz -70.34.255.0 - 70.34.255.103 us -70.34.255.104 - 70.34.255.111 nl -70.34.255.112 - 70.34.255.223 us -70.34.255.224 - 70.34.255.231 gb -70.34.255.232 - 70.35.15.255 us +70.33.213.0 - 70.33.213.255 us +70.33.214.0 - 70.33.215.255 ca +70.33.216.0 - 70.33.218.255 us +70.33.219.0 - 70.33.223.255 ca +70.33.224.0 - 70.33.227.191 us +70.33.227.192 - 70.33.227.207 ca +70.33.227.208 - 70.33.243.255 us +70.33.244.0 - 70.33.247.255 ca +70.33.248.0 - 70.35.15.255 us 70.35.16.0 - 70.35.31.255 ca 70.35.32.0 - 70.35.127.255 us 70.35.128.0 - 70.35.143.255 pr -70.35.144.0 - 70.35.159.255 a2 +70.35.144.0 - 70.35.152.255 a2 +70.35.153.0 - 70.35.153.255 us +70.35.154.0 - 70.35.156.255 co +70.35.157.0 - 70.35.157.255 us +70.35.158.0 - 70.35.158.255 a2 +70.35.159.0 - 70.35.159.255 co 70.35.160.0 - 70.35.175.255 ca 70.35.176.0 - 70.35.207.255 us 70.35.208.0 - 70.35.223.255 ca 70.35.224.0 - 70.35.255.255 us 70.36.0.0 - 70.36.15.255 pm -70.36.16.0 - 70.36.24.191 us -70.36.24.192 - 70.36.24.223 ae -70.36.24.224 - 70.36.24.239 us -70.36.24.240 - 70.36.24.243 kr -70.36.24.244 - 70.36.24.251 us -70.36.24.252 - 70.36.24.255 ca -70.36.25.0 - 70.36.25.15 us -70.36.25.16 - 70.36.25.31 br -70.36.25.32 - 70.36.25.35 bm -70.36.25.36 - 70.36.25.103 us -70.36.25.104 - 70.36.25.111 br +70.36.16.0 - 70.36.25.111 us 70.36.25.112 - 70.36.25.119 do 70.36.25.120 - 70.36.26.255 us 70.36.27.0 - 70.36.27.255 kr -70.36.28.0 - 70.36.29.55 us -70.36.29.56 - 70.36.29.63 ae -70.36.29.64 - 70.36.29.239 us -70.36.29.240 - 70.36.29.255 do -70.36.30.0 - 70.36.47.255 us +70.36.28.0 - 70.36.28.255 gb +70.36.29.0 - 70.36.47.255 us 70.36.48.0 - 70.36.63.255 ca -70.36.64.0 - 70.37.255.255 us -70.38.0.0 - 70.38.4.7 ca -70.38.4.8 - 70.38.4.15 mx -70.38.4.16 - 70.38.4.31 ca -70.38.4.32 - 70.38.4.39 mx -70.38.4.40 - 70.38.6.23 ca +70.36.64.0 - 70.37.135.255 us +70.37.136.0 - 70.37.138.255 fr +70.37.139.0 - 70.37.148.255 us +70.37.149.0 - 70.37.149.255 au +70.37.150.0 - 70.37.151.255 br +70.37.152.0 - 70.37.190.15 us +70.37.190.16 - 70.37.190.47 sg +70.37.190.48 - 70.37.255.255 us +70.38.0.0 - 70.38.6.23 ca 70.38.6.24 - 70.38.6.31 us -70.38.6.32 - 70.38.14.79 ca -70.38.14.80 - 70.38.14.87 kz -70.38.14.88 - 70.38.49.191 ca -70.38.49.192 - 70.38.49.199 mx -70.38.49.200 - 70.38.55.103 ca -70.38.55.104 - 70.38.55.111 us -70.38.55.112 - 70.38.87.71 ca +70.38.6.32 - 70.38.20.127 ca +70.38.20.128 - 70.38.20.135 us +70.38.20.136 - 70.38.36.63 ca +70.38.36.64 - 70.38.36.71 us +70.38.36.72 - 70.38.36.167 ca +70.38.36.168 - 70.38.36.175 us +70.38.36.176 - 70.38.87.71 ca 70.38.87.72 - 70.38.87.79 au 70.38.87.80 - 70.38.115.79 ca 70.38.115.80 - 70.38.115.87 ng 70.38.115.88 - 70.38.127.255 ca -70.38.128.0 - 70.39.141.255 us -70.39.142.0 - 70.39.142.31 gb -70.39.142.32 - 70.40.15.255 us +70.38.128.0 - 70.39.154.255 us +70.39.155.0 - 70.39.155.7 ca +70.39.155.8 - 70.39.155.15 us +70.39.155.16 - 70.39.155.31 ca +70.39.155.32 - 70.39.155.47 us +70.39.155.48 - 70.39.155.55 ca +70.39.155.56 - 70.39.241.255 us +70.39.242.0 - 70.39.242.255 gb +70.39.243.0 - 70.40.15.255 us 70.40.16.0 - 70.40.27.255 ag -70.40.28.0 - 70.40.105.255 us -70.40.106.0 - 70.40.106.255 gb -70.40.107.0 - 70.40.127.255 us +70.40.28.0 - 70.40.127.255 us 70.40.128.0 - 70.40.135.255 ca 70.40.136.0 - 70.40.138.255 us 70.40.139.0 - 70.40.190.255 ca -70.40.191.0 - 70.42.25.223 us -70.42.25.224 - 70.42.25.231 ca -70.42.25.232 - 70.42.26.127 us -70.42.26.128 - 70.42.26.191 ca -70.42.26.192 - 70.42.26.223 us -70.42.26.224 - 70.42.26.255 ca -70.42.27.0 - 70.42.28.127 us -70.42.28.128 - 70.42.28.143 ca -70.42.28.144 - 70.42.29.255 us -70.42.30.0 - 70.42.31.255 ca -70.42.32.0 - 70.42.39.127 us -70.42.39.128 - 70.42.39.135 lb -70.42.39.136 - 70.42.39.223 us -70.42.39.224 - 70.42.39.231 il -70.42.39.232 - 70.42.41.95 us -70.42.41.96 - 70.42.41.103 ie -70.42.41.104 - 70.42.68.159 us -70.42.68.160 - 70.42.68.191 cz -70.42.68.192 - 70.42.97.63 us -70.42.97.64 - 70.42.97.127 ca -70.42.97.128 - 70.42.117.79 us -70.42.117.80 - 70.42.117.87 gb -70.42.117.88 - 70.42.208.103 us -70.42.208.104 - 70.42.208.127 fr -70.42.208.128 - 70.44.255.255 us -70.45.0.0 - 70.45.255.255 pr +70.40.191.0 - 70.42.26.127 us +70.42.26.128 - 70.42.26.255 ca +70.42.27.0 - 70.42.28.63 us +70.42.28.64 - 70.42.28.95 ca +70.42.28.96 - 70.42.28.255 us +70.42.29.0 - 70.42.29.255 ca +70.42.30.0 - 70.44.255.255 us +70.45.0.0 - 70.45.135.255 pr +70.45.136.0 - 70.45.137.255 us +70.45.138.0 - 70.45.255.255 pr 70.46.0.0 - 70.47.255.255 us -70.48.0.0 - 70.54.222.15 ca -70.54.222.16 - 70.54.222.23 us -70.54.222.24 - 70.55.255.255 ca +70.48.0.0 - 70.55.255.255 ca 70.56.0.0 - 70.63.255.255 us 70.64.0.0 - 70.83.255.255 ca 70.84.0.0 - 70.87.27.255 us 70.87.28.0 - 70.87.29.255 ae -70.87.30.0 - 70.224.176.207 us -70.224.176.208 - 70.224.176.223 in -70.224.176.224 - 70.240.141.255 us -70.240.142.0 - 70.240.142.15 uy -70.240.142.16 - 70.252.247.31 us -70.252.247.32 - 70.252.247.63 ua -70.252.247.64 - 71.7.127.255 us +70.87.30.0 - 70.159.15.255 us +70.159.16.0 - 70.159.16.255 a2 +70.159.17.0 - 70.232.244.255 us +70.232.245.0 - 70.232.245.255 a1 +70.232.246.0 - 71.7.127.255 us 71.7.128.0 - 71.7.255.255 ca -71.8.0.0 - 71.16.255.255 us +71.8.0.0 - 71.16.4.191 us +71.16.4.192 - 71.16.4.223 pa +71.16.4.224 - 71.16.255.255 us 71.17.0.0 - 71.17.255.255 ca 71.18.0.0 - 71.18.255.255 us 71.19.0.0 - 71.19.127.255 ca @@ -29973,1225 +17213,68 @@ 72.0.240.0 - 72.0.255.255 ca 72.1.0.0 - 72.1.100.255 us 72.1.101.0 - 72.1.101.255 ca -72.1.102.0 - 72.1.113.255 us -72.1.114.0 - 72.1.114.255 ca -72.1.115.0 - 72.1.121.47 us -72.1.121.48 - 72.1.121.63 cn -72.1.121.64 - 72.1.191.255 us -72.1.192.0 - 72.1.208.191 ca -72.1.208.192 - 72.1.208.255 us -72.1.209.0 - 72.1.210.255 ca -72.1.211.0 - 72.1.211.63 us -72.1.211.64 - 72.1.223.255 ca +72.1.102.0 - 72.1.191.255 us +72.1.192.0 - 72.1.223.255 ca 72.1.224.0 - 72.1.255.255 us 72.2.0.0 - 72.2.63.255 ca -72.2.64.0 - 72.3.131.255 us -72.3.132.0 - 72.3.132.63 gb -72.3.132.64 - 72.3.134.79 us -72.3.134.80 - 72.3.134.95 gb -72.3.134.96 - 72.3.134.119 us -72.3.134.120 - 72.3.134.127 gb -72.3.134.128 - 72.3.134.143 us -72.3.134.144 - 72.3.134.151 gb -72.3.134.152 - 72.3.136.23 us -72.3.136.24 - 72.3.136.31 ca -72.3.136.32 - 72.3.136.71 us -72.3.136.72 - 72.3.136.79 au -72.3.136.80 - 72.3.136.111 us -72.3.136.112 - 72.3.136.119 no -72.3.136.120 - 72.3.136.223 us -72.3.136.224 - 72.3.136.239 ca -72.3.136.240 - 72.3.136.247 us -72.3.136.248 - 72.3.136.255 bg -72.3.137.0 - 72.3.137.79 us -72.3.137.80 - 72.3.137.87 gb -72.3.137.88 - 72.3.137.127 us -72.3.137.128 - 72.3.137.135 gb -72.3.137.136 - 72.3.137.159 us -72.3.137.160 - 72.3.137.191 no -72.3.137.192 - 72.3.137.215 us -72.3.137.216 - 72.3.137.223 ie -72.3.137.224 - 72.3.138.79 us -72.3.138.80 - 72.3.138.87 sg -72.3.138.88 - 72.3.138.159 us -72.3.138.160 - 72.3.138.167 ag -72.3.138.168 - 72.3.140.167 us -72.3.140.168 - 72.3.140.175 bm -72.3.140.176 - 72.3.141.103 us -72.3.141.104 - 72.3.141.111 gb -72.3.141.112 - 72.3.143.111 us -72.3.143.112 - 72.3.143.127 my -72.3.143.128 - 72.3.143.135 us -72.3.143.136 - 72.3.143.143 ca -72.3.143.144 - 72.3.143.191 us -72.3.143.192 - 72.3.143.199 il -72.3.143.200 - 72.3.144.111 us -72.3.144.112 - 72.3.144.127 my -72.3.144.128 - 72.3.145.23 us -72.3.145.24 - 72.3.145.31 ca -72.3.145.32 - 72.3.145.111 us -72.3.145.112 - 72.3.145.127 au -72.3.145.128 - 72.3.145.175 us -72.3.145.176 - 72.3.145.183 pa -72.3.145.184 - 72.3.146.63 us -72.3.146.64 - 72.3.146.79 ca -72.3.146.80 - 72.3.147.79 us -72.3.147.80 - 72.3.147.87 au -72.3.147.88 - 72.3.147.143 us -72.3.147.144 - 72.3.147.151 ca -72.3.147.152 - 72.3.148.7 us -72.3.148.8 - 72.3.148.15 au -72.3.148.16 - 72.3.148.39 us -72.3.148.40 - 72.3.148.47 au -72.3.148.48 - 72.3.148.143 us -72.3.148.144 - 72.3.148.175 my -72.3.148.176 - 72.3.148.241 us -72.3.148.242 - 72.3.148.243 gb -72.3.148.244 - 72.3.149.207 us -72.3.149.208 - 72.3.149.209 ca -72.3.149.210 - 72.3.149.215 us -72.3.149.216 - 72.3.149.217 au -72.3.149.218 - 72.3.153.31 us -72.3.153.32 - 72.3.153.47 my -72.3.153.48 - 72.3.153.63 us -72.3.153.64 - 72.3.153.71 in -72.3.153.72 - 72.3.153.119 us -72.3.153.120 - 72.3.153.127 gb -72.3.153.128 - 72.3.153.207 us -72.3.153.208 - 72.3.153.223 gb -72.3.153.224 - 72.3.154.119 us -72.3.154.120 - 72.3.154.127 ca -72.3.154.128 - 72.3.154.143 th -72.3.154.144 - 72.3.154.175 us -72.3.154.176 - 72.3.154.191 bg -72.3.154.192 - 72.3.155.7 us -72.3.155.8 - 72.3.155.15 fr -72.3.155.16 - 72.3.155.31 gb -72.3.155.32 - 72.3.155.47 us -72.3.155.48 - 72.3.155.63 id -72.3.155.64 - 72.3.156.47 us -72.3.156.48 - 72.3.156.55 au -72.3.156.56 - 72.3.156.231 us -72.3.156.232 - 72.3.156.239 ca -72.3.156.240 - 72.3.157.255 us -72.3.158.0 - 72.3.158.7 ca -72.3.158.8 - 72.3.158.95 us -72.3.158.96 - 72.3.158.111 ca -72.3.158.112 - 72.3.159.87 us -72.3.159.88 - 72.3.159.95 za -72.3.159.96 - 72.3.159.159 us -72.3.159.160 - 72.3.159.167 cr -72.3.159.168 - 72.3.160.15 us -72.3.160.16 - 72.3.160.47 my -72.3.160.48 - 72.3.160.55 us -72.3.160.56 - 72.3.160.63 au -72.3.160.64 - 72.3.160.119 us -72.3.160.120 - 72.3.160.127 ca -72.3.160.128 - 72.3.161.143 us -72.3.161.144 - 72.3.161.151 au -72.3.161.152 - 72.3.161.183 us -72.3.161.184 - 72.3.161.191 au -72.3.161.192 - 72.3.161.203 us -72.3.161.204 - 72.3.161.207 gb -72.3.161.208 - 72.3.161.255 us -72.3.162.0 - 72.3.162.7 au -72.3.162.8 - 72.3.162.39 us -72.3.162.40 - 72.3.162.47 mx -72.3.162.48 - 72.3.162.151 us -72.3.162.152 - 72.3.162.159 ca -72.3.162.160 - 72.3.163.79 us -72.3.163.80 - 72.3.163.95 au -72.3.163.96 - 72.3.163.151 us -72.3.163.152 - 72.3.163.159 bs -72.3.163.160 - 72.3.163.247 us -72.3.163.248 - 72.3.163.255 au -72.3.164.0 - 72.3.164.15 us -72.3.164.16 - 72.3.164.23 id -72.3.164.24 - 72.3.164.135 us -72.3.164.136 - 72.3.164.143 za -72.3.164.144 - 72.3.164.159 us -72.3.164.160 - 72.3.164.175 fr -72.3.164.176 - 72.3.164.199 us -72.3.164.200 - 72.3.164.203 gb -72.3.164.204 - 72.3.164.205 ca -72.3.164.206 - 72.3.165.63 us -72.3.165.64 - 72.3.165.71 ca -72.3.165.72 - 72.3.165.159 us -72.3.165.160 - 72.3.165.175 in -72.3.165.176 - 72.3.166.87 us -72.3.166.88 - 72.3.166.95 gb -72.3.166.96 - 72.3.166.135 us -72.3.166.136 - 72.3.166.143 cn -72.3.166.144 - 72.3.167.143 us -72.3.167.144 - 72.3.167.151 au -72.3.167.152 - 72.3.167.175 us -72.3.167.176 - 72.3.167.191 my -72.3.167.192 - 72.3.168.47 us -72.3.168.48 - 72.3.168.55 au -72.3.168.56 - 72.3.168.175 us -72.3.168.176 - 72.3.168.183 cr -72.3.168.184 - 72.3.168.191 my -72.3.168.192 - 72.3.170.87 us -72.3.170.88 - 72.3.170.95 mx -72.3.170.96 - 72.3.170.103 my -72.3.170.104 - 72.3.170.143 us -72.3.170.144 - 72.3.170.167 ca -72.3.170.168 - 72.3.170.255 us -72.3.171.0 - 72.3.171.7 au -72.3.171.8 - 72.3.171.231 us -72.3.171.232 - 72.3.171.239 ca -72.3.171.240 - 72.3.172.55 us -72.3.172.56 - 72.3.172.63 mc -72.3.172.64 - 72.3.172.79 us -72.3.172.80 - 72.3.172.95 bd -72.3.172.96 - 72.3.172.111 us -72.3.172.112 - 72.3.172.127 au -72.3.172.128 - 72.3.173.191 us -72.3.173.192 - 72.3.173.199 fr -72.3.173.200 - 72.3.173.207 us -72.3.173.208 - 72.3.173.215 bs -72.3.173.216 - 72.3.174.111 us -72.3.174.112 - 72.3.174.183 bs -72.3.174.184 - 72.3.174.255 us -72.3.175.0 - 72.3.175.3 id -72.3.175.4 - 72.3.175.103 us -72.3.175.104 - 72.3.175.111 in -72.3.175.112 - 72.3.176.39 us -72.3.176.40 - 72.3.176.47 es -72.3.176.48 - 72.3.177.63 us -72.3.177.64 - 72.3.177.71 gb -72.3.177.72 - 72.3.177.159 us -72.3.177.160 - 72.3.177.167 ca -72.3.177.168 - 72.3.177.255 us -72.3.178.0 - 72.3.178.15 my -72.3.178.16 - 72.3.178.223 us -72.3.178.224 - 72.3.178.231 my -72.3.178.232 - 72.3.179.23 us -72.3.179.24 - 72.3.179.31 ca -72.3.179.32 - 72.3.179.47 us -72.3.179.48 - 72.3.179.55 gb -72.3.179.56 - 72.3.179.151 us -72.3.179.152 - 72.3.179.159 my -72.3.179.160 - 72.3.179.255 us -72.3.180.0 - 72.3.180.7 tw -72.3.180.8 - 72.3.180.15 us -72.3.180.16 - 72.3.180.47 my -72.3.180.48 - 72.3.180.127 us -72.3.180.128 - 72.3.180.135 tw -72.3.180.136 - 72.3.180.255 us -72.3.181.0 - 72.3.181.15 gb -72.3.181.16 - 72.3.181.23 au -72.3.181.24 - 72.3.181.63 us -72.3.181.64 - 72.3.181.79 jp -72.3.181.80 - 72.3.183.15 us -72.3.183.16 - 72.3.183.63 my -72.3.183.64 - 72.3.184.79 us -72.3.184.80 - 72.3.184.87 au -72.3.184.88 - 72.3.185.127 us -72.3.185.128 - 72.3.185.135 pr -72.3.185.136 - 72.3.186.231 us -72.3.186.232 - 72.3.186.239 nl -72.3.186.240 - 72.3.186.255 us -72.3.187.0 - 72.3.187.7 gb -72.3.187.8 - 72.3.187.15 us -72.3.187.16 - 72.3.187.23 jp -72.3.187.24 - 72.3.189.223 us -72.3.189.224 - 72.3.189.231 mx -72.3.189.232 - 72.3.189.239 ca -72.3.189.240 - 72.3.190.127 us -72.3.190.128 - 72.3.190.135 au -72.3.190.136 - 72.3.190.151 us -72.3.190.152 - 72.3.190.159 my -72.3.190.160 - 72.3.191.7 us -72.3.191.8 - 72.3.191.23 my -72.3.191.24 - 72.3.191.63 us -72.3.191.64 - 72.3.191.71 ca -72.3.191.72 - 72.3.191.111 us -72.3.191.112 - 72.3.191.175 my -72.3.191.176 - 72.3.191.191 us -72.3.191.192 - 72.3.191.207 in -72.3.191.208 - 72.3.191.247 us -72.3.191.248 - 72.3.191.255 co -72.3.192.0 - 72.3.192.95 us -72.3.192.96 - 72.3.192.111 my -72.3.192.112 - 72.3.192.143 us -72.3.192.144 - 72.3.192.151 ca -72.3.192.152 - 72.3.193.135 us -72.3.193.136 - 72.3.193.143 ca -72.3.193.144 - 72.3.194.135 us -72.3.194.136 - 72.3.194.143 sg -72.3.194.144 - 72.3.194.159 us -72.3.194.160 - 72.3.194.167 gb -72.3.194.168 - 72.3.196.103 us -72.3.196.104 - 72.3.196.127 ca -72.3.196.128 - 72.3.198.247 us -72.3.198.248 - 72.3.198.249 in -72.3.198.250 - 72.3.199.79 us -72.3.199.80 - 72.3.199.87 au -72.3.199.88 - 72.3.199.199 us -72.3.199.200 - 72.3.199.207 za -72.3.199.208 - 72.3.199.255 us -72.3.200.0 - 72.3.200.39 ca -72.3.200.40 - 72.3.200.103 us -72.3.200.104 - 72.3.200.111 ca -72.3.200.112 - 72.3.200.223 us -72.3.200.224 - 72.3.200.231 au -72.3.200.232 - 72.3.200.239 us -72.3.200.240 - 72.3.200.247 au -72.3.200.248 - 72.3.201.7 us -72.3.201.8 - 72.3.201.15 gb -72.3.201.16 - 72.3.202.111 us -72.3.202.112 - 72.3.202.127 nl -72.3.202.128 - 72.3.203.87 us -72.3.203.88 - 72.3.203.95 ca -72.3.203.96 - 72.3.203.103 au -72.3.203.104 - 72.3.203.111 us -72.3.203.112 - 72.3.203.127 gb -72.3.203.128 - 72.3.203.159 us -72.3.203.160 - 72.3.203.175 gb -72.3.203.176 - 72.3.203.183 kr -72.3.203.184 - 72.3.203.191 us -72.3.203.192 - 72.3.203.193 ca -72.3.203.194 - 72.3.205.159 us -72.3.205.160 - 72.3.205.167 au -72.3.205.168 - 72.3.205.175 us -72.3.205.176 - 72.3.205.191 ca -72.3.205.192 - 72.3.206.31 us -72.3.206.32 - 72.3.206.47 au -72.3.206.48 - 72.3.206.127 us -72.3.206.128 - 72.3.206.135 co -72.3.206.136 - 72.3.207.23 us -72.3.207.24 - 72.3.207.31 ca -72.3.207.32 - 72.3.207.63 us -72.3.207.64 - 72.3.207.95 my -72.3.207.96 - 72.3.207.207 us -72.3.207.208 - 72.3.207.223 my -72.3.207.224 - 72.3.207.239 us -72.3.207.240 - 72.3.207.255 my -72.3.208.0 - 72.3.208.135 us -72.3.208.136 - 72.3.208.143 au -72.3.208.144 - 72.3.209.55 us -72.3.209.56 - 72.3.209.63 th -72.3.209.64 - 72.3.209.199 us -72.3.209.200 - 72.3.209.207 gt -72.3.209.208 - 72.3.210.135 us -72.3.210.136 - 72.3.210.143 in -72.3.210.144 - 72.3.210.151 hk -72.3.210.152 - 72.3.210.159 us -72.3.210.160 - 72.3.210.175 gb -72.3.210.176 - 72.3.211.127 us -72.3.211.128 - 72.3.211.175 gb -72.3.211.176 - 72.3.211.255 us -72.3.212.0 - 72.3.212.15 jp -72.3.212.16 - 72.3.212.79 us -72.3.212.80 - 72.3.212.87 ca -72.3.212.88 - 72.3.213.63 us -72.3.213.64 - 72.3.213.71 tr -72.3.213.72 - 72.3.215.39 us -72.3.215.40 - 72.3.215.47 jm -72.3.215.48 - 72.3.222.95 us -72.3.222.96 - 72.3.222.111 ng -72.3.222.112 - 72.3.223.135 us -72.3.223.136 - 72.3.223.143 ca -72.3.223.144 - 72.3.231.55 us -72.3.231.56 - 72.3.231.63 pr -72.3.231.64 - 72.3.233.127 us -72.3.233.128 - 72.3.233.143 gb -72.3.233.144 - 72.3.235.47 us -72.3.235.48 - 72.3.235.55 ca -72.3.235.56 - 72.3.239.103 us -72.3.239.104 - 72.3.239.111 ae -72.3.239.112 - 72.3.241.175 us -72.3.241.176 - 72.3.241.183 hk -72.3.241.184 - 72.3.243.47 us -72.3.243.48 - 72.3.243.55 in -72.3.243.56 - 72.3.246.23 us -72.3.246.24 - 72.3.246.31 au -72.3.246.32 - 72.3.246.175 us -72.3.246.176 - 72.3.246.183 jp -72.3.246.184 - 72.3.251.239 us -72.3.251.240 - 72.3.251.247 au -72.3.251.248 - 72.3.251.255 nz -72.3.252.0 - 72.3.252.71 us -72.3.252.72 - 72.3.252.79 gb -72.3.252.80 - 72.4.111.255 us -72.4.112.0 - 72.4.112.7 ca -72.4.112.8 - 72.4.112.255 us -72.4.113.0 - 72.4.113.7 nl -72.4.113.8 - 72.4.113.87 us -72.4.113.88 - 72.4.113.95 gb -72.4.113.96 - 72.4.113.111 us -72.4.113.112 - 72.4.113.119 in -72.4.113.120 - 72.4.115.63 us -72.4.115.64 - 72.4.115.71 ca -72.4.115.72 - 72.4.115.79 us -72.4.115.80 - 72.4.115.87 au -72.4.115.88 - 72.4.116.23 us -72.4.116.24 - 72.4.116.31 gb -72.4.116.32 - 72.4.116.39 il -72.4.116.40 - 72.4.116.55 es -72.4.116.56 - 72.4.116.87 us -72.4.116.88 - 72.4.116.95 gb -72.4.116.96 - 72.4.116.103 bb -72.4.116.104 - 72.4.116.239 us -72.4.116.240 - 72.4.116.255 gb -72.4.117.0 - 72.4.117.31 us -72.4.117.32 - 72.4.117.47 gb -72.4.117.48 - 72.4.117.159 us -72.4.117.160 - 72.4.117.175 ca -72.4.117.176 - 72.4.117.191 gr -72.4.117.192 - 72.4.117.223 us -72.4.117.224 - 72.4.117.239 gb -72.4.117.240 - 72.4.117.255 il -72.4.118.0 - 72.4.120.7 us -72.4.120.8 - 72.4.120.15 ca -72.4.120.16 - 72.4.121.31 us -72.4.121.32 - 72.4.121.63 au -72.4.121.64 - 72.4.121.255 us -72.4.122.0 - 72.4.122.255 mx -72.4.123.0 - 72.4.124.159 us -72.4.124.160 - 72.4.124.175 in -72.4.124.176 - 72.5.55.143 us -72.5.55.144 - 72.5.55.159 ca -72.5.55.160 - 72.5.180.255 us -72.5.181.0 - 72.5.181.255 gb -72.5.182.0 - 72.5.197.255 us +72.2.64.0 - 72.5.197.255 us 72.5.198.0 - 72.5.198.255 a2 -72.5.199.0 - 72.8.127.255 us -72.8.128.0 - 72.8.128.15 mx -72.8.128.16 - 72.8.128.31 us -72.8.128.32 - 72.8.128.63 tr -72.8.128.64 - 72.8.128.127 us -72.8.128.128 - 72.8.128.191 id -72.8.128.192 - 72.8.128.247 us -72.8.128.248 - 72.8.128.251 cn -72.8.128.252 - 72.8.129.91 us -72.8.129.92 - 72.8.129.95 cn -72.8.129.96 - 72.8.129.135 us -72.8.129.136 - 72.8.129.136 tr -72.8.129.137 - 72.8.129.137 us -72.8.129.138 - 72.8.129.138 cn -72.8.129.139 - 72.8.129.146 us -72.8.129.147 - 72.8.129.147 tr -72.8.129.148 - 72.8.129.148 gb -72.8.129.149 - 72.8.129.153 us -72.8.129.154 - 72.8.129.154 gb -72.8.129.155 - 72.8.129.255 us -72.8.130.0 - 72.8.130.255 kh -72.8.131.0 - 72.8.131.95 us -72.8.131.96 - 72.8.131.111 cn -72.8.131.112 - 72.8.131.127 us -72.8.131.128 - 72.8.131.191 cn -72.8.131.192 - 72.8.131.255 us -72.8.132.0 - 72.8.132.255 kh -72.8.133.0 - 72.8.133.127 tr -72.8.133.128 - 72.8.133.191 cn -72.8.133.192 - 72.8.133.255 us -72.8.134.0 - 72.8.134.63 cn -72.8.134.64 - 72.8.134.99 us -72.8.134.100 - 72.8.134.100 cn -72.8.134.101 - 72.8.134.102 us -72.8.134.103 - 72.8.134.103 kh -72.8.134.104 - 72.8.134.117 us -72.8.134.118 - 72.8.134.118 tr -72.8.134.119 - 72.8.134.119 cn -72.8.134.120 - 72.8.134.120 gb -72.8.134.121 - 72.8.134.155 us -72.8.134.156 - 72.8.134.159 bd -72.8.134.160 - 72.8.134.191 us -72.8.134.192 - 72.8.134.255 tr -72.8.135.0 - 72.8.135.255 id -72.8.136.0 - 72.8.137.255 us -72.8.138.0 - 72.8.138.255 cn -72.8.139.0 - 72.8.139.127 us -72.8.139.128 - 72.8.139.143 cn -72.8.139.144 - 72.8.139.255 us -72.8.140.0 - 72.8.140.255 gb -72.8.141.0 - 72.8.148.255 us -72.8.149.0 - 72.8.149.255 cn -72.8.150.0 - 72.8.150.31 us -72.8.150.32 - 72.8.150.63 tr -72.8.150.64 - 72.8.150.79 us -72.8.150.80 - 72.8.150.95 tr -72.8.150.96 - 72.8.150.127 us -72.8.150.128 - 72.8.150.191 cn -72.8.150.192 - 72.8.156.199 us -72.8.156.200 - 72.8.156.207 cn -72.8.156.208 - 72.8.156.215 us -72.8.156.216 - 72.8.156.219 tr -72.8.156.220 - 72.8.156.223 us -72.8.156.224 - 72.8.156.255 tr -72.8.157.0 - 72.8.157.23 us -72.8.157.24 - 72.8.157.27 cn -72.8.157.28 - 72.8.157.31 us -72.8.157.32 - 72.8.157.47 cn -72.8.157.48 - 72.8.157.51 us -72.8.157.52 - 72.8.157.55 kr -72.8.157.56 - 72.8.157.59 us -72.8.157.60 - 72.8.157.63 tr -72.8.157.64 - 72.8.157.127 us -72.8.157.128 - 72.8.157.191 id -72.8.157.192 - 72.8.157.195 sc -72.8.157.196 - 72.8.157.199 bd -72.8.157.200 - 72.8.157.255 us -72.8.158.0 - 72.8.158.63 pk -72.8.158.64 - 72.8.158.127 cn -72.8.158.128 - 72.8.160.63 us -72.8.160.64 - 72.8.160.127 pk -72.8.160.128 - 72.8.161.255 us -72.8.162.0 - 72.8.162.31 cn -72.8.162.32 - 72.8.162.63 tr -72.8.162.64 - 72.8.163.255 us -72.8.164.0 - 72.8.164.255 kh -72.8.165.0 - 72.8.165.255 us -72.8.166.0 - 72.8.166.255 cn -72.8.167.0 - 72.8.167.15 tr -72.8.167.16 - 72.8.167.127 us -72.8.167.128 - 72.8.167.143 bd -72.8.167.144 - 72.8.167.223 us -72.8.167.224 - 72.8.167.255 cn -72.8.168.0 - 72.8.168.87 us -72.8.168.88 - 72.8.168.95 bd -72.8.168.96 - 72.8.171.255 us -72.8.172.0 - 72.8.172.15 vn -72.8.172.16 - 72.8.172.31 us -72.8.172.32 - 72.8.172.143 vn -72.8.172.144 - 72.8.172.159 sc -72.8.172.160 - 72.8.172.255 vn -72.8.173.0 - 72.8.184.63 us -72.8.184.64 - 72.8.184.127 cn -72.8.184.128 - 72.8.185.255 us -72.8.186.0 - 72.8.186.127 cn -72.8.186.128 - 72.8.186.255 us -72.8.187.0 - 72.8.187.255 pk -72.8.188.0 - 72.8.188.27 us -72.8.188.28 - 72.8.188.31 gb -72.8.188.32 - 72.8.189.63 us -72.8.189.64 - 72.8.189.127 pk -72.8.189.128 - 72.9.144.124 us -72.9.144.125 - 72.9.144.132 ma -72.9.144.133 - 72.9.144.179 us -72.9.144.180 - 72.9.144.187 ae -72.9.144.188 - 72.9.144.207 us -72.9.144.208 - 72.9.144.215 tr -72.9.144.216 - 72.9.145.30 us -72.9.145.31 - 72.9.145.40 tr -72.9.145.41 - 72.9.145.77 us -72.9.145.78 - 72.9.145.85 mx -72.9.145.86 - 72.9.145.93 lk -72.9.145.94 - 72.9.145.101 nz -72.9.145.102 - 72.9.145.166 us -72.9.145.167 - 72.9.145.174 gb -72.9.145.175 - 72.9.145.179 us -72.9.145.180 - 72.9.145.187 ca -72.9.145.188 - 72.9.146.9 us -72.9.146.10 - 72.9.146.22 gb -72.9.146.23 - 72.9.146.119 us -72.9.146.120 - 72.9.146.127 bs -72.9.146.128 - 72.9.146.167 us -72.9.146.168 - 72.9.146.175 af -72.9.146.176 - 72.9.146.176 us -72.9.146.177 - 72.9.146.204 ca -72.9.146.205 - 72.9.146.205 us -72.9.146.206 - 72.9.146.221 gb -72.9.146.222 - 72.9.146.224 us -72.9.146.225 - 72.9.146.228 gb -72.9.146.229 - 72.9.146.236 us -72.9.146.237 - 72.9.146.240 gb -72.9.146.241 - 72.9.147.17 us -72.9.147.18 - 72.9.147.25 nz -72.9.147.26 - 72.9.147.37 us -72.9.147.38 - 72.9.147.45 in -72.9.147.46 - 72.9.147.79 us -72.9.147.80 - 72.9.147.87 lk -72.9.147.88 - 72.9.147.161 us -72.9.147.162 - 72.9.147.169 mx -72.9.147.170 - 72.9.147.179 us -72.9.147.180 - 72.9.147.187 eg -72.9.147.188 - 72.9.147.234 us -72.9.147.235 - 72.9.147.250 cn -72.9.147.251 - 72.9.148.57 us -72.9.148.58 - 72.9.148.65 gb -72.9.148.66 - 72.9.148.69 us -72.9.148.70 - 72.9.148.77 ca -72.9.148.78 - 72.9.148.81 us -72.9.148.82 - 72.9.148.89 gb -72.9.148.90 - 72.9.148.114 us -72.9.148.115 - 72.9.148.122 ge -72.9.148.123 - 72.9.148.130 us -72.9.148.131 - 72.9.148.138 eg -72.9.148.139 - 72.9.148.154 us -72.9.148.155 - 72.9.148.162 tr -72.9.148.163 - 72.9.148.163 us -72.9.148.164 - 72.9.148.179 gb -72.9.148.180 - 72.9.148.186 us -72.9.148.187 - 72.9.148.194 in -72.9.148.195 - 72.9.148.215 us -72.9.148.216 - 72.9.148.223 lk -72.9.148.224 - 72.9.148.224 us -72.9.148.225 - 72.9.148.240 gb -72.9.148.241 - 72.9.148.243 us -72.9.148.244 - 72.9.148.251 cn -72.9.148.252 - 72.9.149.33 us -72.9.149.34 - 72.9.149.41 id -72.9.149.42 - 72.9.149.109 us -72.9.149.110 - 72.9.149.117 ma -72.9.149.118 - 72.9.149.143 us -72.9.149.144 - 72.9.149.151 cn -72.9.149.152 - 72.9.149.159 eg -72.9.149.160 - 72.9.149.185 us -72.9.149.186 - 72.9.149.193 ca -72.9.149.194 - 72.9.149.208 us -72.9.149.209 - 72.9.149.216 ca -72.9.149.217 - 72.9.149.217 us -72.9.149.218 - 72.9.149.239 cn -72.9.149.240 - 72.9.149.245 us -72.9.149.246 - 72.9.149.253 ve -72.9.149.254 - 72.9.150.97 us -72.9.150.98 - 72.9.150.105 pk -72.9.150.106 - 72.9.150.168 us -72.9.150.169 - 72.9.150.200 gb -72.9.150.201 - 72.9.151.39 us -72.9.151.40 - 72.9.151.47 ru -72.9.151.48 - 72.9.151.59 us -72.9.151.60 - 72.9.151.67 ca -72.9.151.68 - 72.9.151.71 us -72.9.151.72 - 72.9.151.79 ma -72.9.151.80 - 72.9.151.179 us -72.9.151.180 - 72.9.151.187 ca -72.9.151.188 - 72.9.152.120 us -72.9.152.121 - 72.9.152.128 pe -72.9.152.129 - 72.9.152.139 us -72.9.152.140 - 72.9.152.147 mo -72.9.152.148 - 72.9.152.175 us -72.9.152.176 - 72.9.152.188 au -72.9.152.189 - 72.9.153.47 us -72.9.153.48 - 72.9.153.55 in -72.9.153.56 - 72.9.153.162 us -72.9.153.163 - 72.9.153.163 pe -72.9.153.164 - 72.9.153.167 us -72.9.153.168 - 72.9.153.170 pe -72.9.153.171 - 72.9.153.184 us -72.9.153.185 - 72.9.153.216 gb -72.9.153.217 - 72.9.153.227 us -72.9.153.228 - 72.9.153.235 gb -72.9.153.236 - 72.9.154.53 us -72.9.154.54 - 72.9.154.61 in -72.9.154.62 - 72.9.154.69 pe -72.9.154.70 - 72.9.154.153 us -72.9.154.154 - 72.9.154.161 tr -72.9.154.162 - 72.9.154.172 us -72.9.154.173 - 72.9.154.185 gb -72.9.154.186 - 72.9.154.189 us -72.9.154.190 - 72.9.154.200 gb -72.9.154.201 - 72.9.154.243 us -72.9.154.244 - 72.9.154.251 bh -72.9.154.252 - 72.9.155.9 us -72.9.155.10 - 72.9.155.25 ca -72.9.155.26 - 72.9.155.55 us -72.9.155.56 - 72.9.155.63 ve -72.9.155.64 - 72.9.155.100 us -72.9.155.101 - 72.9.155.109 gb -72.9.155.110 - 72.9.155.118 us -72.9.155.119 - 72.9.155.130 ca -72.9.155.131 - 72.9.155.243 us -72.9.155.244 - 72.9.155.251 lk -72.9.155.252 - 72.9.156.9 us -72.9.156.10 - 72.9.156.17 ca -72.9.156.18 - 72.9.156.29 us -72.9.156.30 - 72.9.156.37 id -72.9.156.38 - 72.9.156.67 us -72.9.156.68 - 72.9.156.75 eg -72.9.156.76 - 72.9.157.9 us -72.9.157.10 - 72.9.157.17 gb -72.9.157.18 - 72.9.157.71 us -72.9.157.72 - 72.9.157.83 tr -72.9.157.84 - 72.9.158.33 us -72.9.158.34 - 72.9.158.41 ma -72.9.158.42 - 72.9.158.77 us -72.9.158.78 - 72.9.158.89 eg -72.9.158.90 - 72.9.158.91 us -72.9.158.92 - 72.9.158.93 eg -72.9.158.94 - 72.9.158.146 us -72.9.158.147 - 72.9.158.178 gb -72.9.158.179 - 72.9.158.180 us -72.9.158.181 - 72.9.158.190 gb -72.9.158.191 - 72.9.158.207 us -72.9.158.208 - 72.9.158.209 eg -72.9.158.210 - 72.9.158.217 us -72.9.158.218 - 72.9.158.231 eg -72.9.158.232 - 72.9.158.237 us -72.9.158.238 - 72.9.158.247 cn -72.9.158.248 - 72.9.159.11 us -72.9.159.12 - 72.9.159.28 gb -72.9.159.29 - 72.9.159.35 us -72.9.159.36 - 72.9.159.43 eg -72.9.159.44 - 72.9.159.60 us -72.9.159.61 - 72.9.159.74 ca -72.9.159.75 - 72.9.159.77 us -72.9.159.78 - 72.9.159.85 eg -72.9.159.86 - 72.9.159.90 us -72.9.159.91 - 72.9.159.98 gb -72.9.159.99 - 72.9.159.128 us -72.9.159.129 - 72.9.159.159 gb -72.9.159.160 - 72.9.159.177 us -72.9.159.178 - 72.9.159.185 ph -72.9.159.186 - 72.9.159.255 us +72.5.199.0 - 72.9.159.255 us 72.9.160.0 - 72.9.191.255 ca 72.9.192.0 - 72.10.127.255 us -72.10.128.0 - 72.10.161.191 ca -72.10.161.192 - 72.10.161.223 us -72.10.161.224 - 72.10.162.127 ca -72.10.162.128 - 72.10.162.159 us -72.10.162.160 - 72.10.162.191 ca -72.10.162.192 - 72.10.162.199 do -72.10.162.200 - 72.10.162.207 pa -72.10.162.208 - 72.10.162.255 ca -72.10.163.0 - 72.10.163.63 my -72.10.163.64 - 72.10.163.127 ca -72.10.163.128 - 72.10.163.255 my -72.10.164.0 - 72.10.164.7 ca -72.10.164.8 - 72.10.164.15 lb -72.10.164.16 - 72.10.164.191 ca -72.10.164.192 - 72.10.164.207 ma -72.10.164.208 - 72.10.164.243 ca -72.10.164.244 - 72.10.164.247 se -72.10.164.248 - 72.10.166.7 ca -72.10.166.8 - 72.10.166.15 ch -72.10.166.16 - 72.10.166.111 ca -72.10.166.112 - 72.10.166.119 ma -72.10.166.120 - 72.10.166.123 pa -72.10.166.124 - 72.10.166.127 ca -72.10.166.128 - 72.10.166.135 se -72.10.166.136 - 72.10.166.143 ca -72.10.166.144 - 72.10.166.151 ph -72.10.166.152 - 72.10.167.55 ca -72.10.167.56 - 72.10.167.63 ch -72.10.167.64 - 72.10.167.111 ca -72.10.167.112 - 72.10.167.119 pa -72.10.167.120 - 72.10.167.191 ca -72.10.167.192 - 72.10.167.207 pa -72.10.167.208 - 72.10.167.255 ca -72.10.168.0 - 72.10.168.55 ma -72.10.168.56 - 72.10.168.63 ca -72.10.168.64 - 72.10.168.71 cn -72.10.168.72 - 72.10.168.95 ma -72.10.168.96 - 72.10.168.111 ca -72.10.168.112 - 72.10.168.119 ma -72.10.168.120 - 72.10.168.183 ca -72.10.168.184 - 72.10.168.191 fr -72.10.168.192 - 72.10.168.207 ca -72.10.168.208 - 72.10.168.223 ma -72.10.168.224 - 72.10.168.239 ca -72.10.168.240 - 72.10.168.247 ma -72.10.168.248 - 72.10.168.255 ca -72.10.169.0 - 72.10.169.23 ma -72.10.169.24 - 72.10.169.47 ca -72.10.169.48 - 72.10.169.63 ma -72.10.169.64 - 72.10.169.87 ca -72.10.169.88 - 72.10.169.95 ke -72.10.169.96 - 72.10.169.103 il -72.10.169.104 - 72.10.169.127 ca -72.10.169.128 - 72.10.169.159 us -72.10.169.160 - 72.10.169.167 ke -72.10.169.168 - 72.10.169.255 ca -72.10.170.0 - 72.10.170.255 us -72.10.171.0 - 72.10.171.79 ca -72.10.171.80 - 72.10.171.87 ma -72.10.171.88 - 72.10.171.111 ca -72.10.171.112 - 72.10.171.119 ke -72.10.171.120 - 72.10.171.159 ca -72.10.171.160 - 72.10.171.167 ma -72.10.171.168 - 72.10.171.191 ca -72.10.171.192 - 72.10.171.199 do -72.10.171.200 - 72.10.172.191 ca -72.10.172.192 - 72.10.172.207 cn -72.10.172.208 - 72.10.172.223 ca -72.10.172.224 - 72.10.172.255 ae -72.10.173.0 - 72.10.173.127 ca -72.10.173.128 - 72.10.173.159 us -72.10.173.160 - 72.10.173.191 ca -72.10.173.192 - 72.10.173.199 cn -72.10.173.200 - 72.10.173.223 ca -72.10.173.224 - 72.10.173.255 us -72.10.174.0 - 72.10.174.63 pk -72.10.174.64 - 72.10.174.95 us -72.10.174.96 - 72.10.174.127 ca -72.10.174.128 - 72.10.174.191 ae -72.10.174.192 - 72.10.174.255 id -72.10.175.0 - 72.10.175.31 ca -72.10.175.32 - 72.10.175.63 id -72.10.175.64 - 72.10.175.79 ca -72.10.175.80 - 72.10.175.87 us -72.10.175.88 - 72.10.175.119 ca -72.10.175.120 - 72.10.175.127 id -72.10.175.128 - 72.10.175.191 pk -72.10.175.192 - 72.11.159.255 us +72.10.128.0 - 72.10.167.111 ca +72.10.167.112 - 72.10.167.119 tr +72.10.167.120 - 72.10.175.255 ca +72.10.176.0 - 72.11.159.255 us 72.11.160.0 - 72.11.191.255 ca 72.11.192.0 - 72.12.95.255 us 72.12.96.0 - 72.12.111.255 ca 72.12.112.0 - 72.12.127.255 us 72.12.128.0 - 72.12.191.255 ca -72.12.192.0 - 72.13.5.95 us -72.13.5.96 - 72.13.5.127 ca -72.13.5.128 - 72.13.12.95 us -72.13.12.96 - 72.13.12.127 ca -72.13.12.128 - 72.13.13.7 us -72.13.13.8 - 72.13.13.15 ca -72.13.13.16 - 72.13.81.135 us -72.13.81.136 - 72.13.81.151 cn -72.13.81.152 - 72.13.81.199 us -72.13.81.200 - 72.13.81.207 cn -72.13.81.208 - 72.13.82.55 us -72.13.82.56 - 72.13.82.63 cn -72.13.82.64 - 72.13.82.71 us -72.13.82.72 - 72.13.82.79 cn -72.13.82.80 - 72.13.82.87 us -72.13.82.88 - 72.13.82.95 cn -72.13.82.96 - 72.13.82.111 it -72.13.82.112 - 72.13.82.119 nz -72.13.82.120 - 72.13.82.127 cn -72.13.82.128 - 72.13.82.199 us -72.13.82.200 - 72.13.82.207 cn -72.13.82.208 - 72.13.83.7 us -72.13.83.8 - 72.13.83.15 ca -72.13.83.16 - 72.13.83.255 us -72.13.84.0 - 72.13.84.7 pr -72.13.84.8 - 72.13.89.111 us -72.13.89.112 - 72.13.89.119 tk -72.13.89.120 - 72.13.91.151 us -72.13.91.152 - 72.13.91.159 id -72.13.91.160 - 72.13.91.175 us -72.13.91.176 - 72.13.91.183 np -72.13.91.184 - 72.13.91.191 ca -72.13.91.192 - 72.13.159.255 us +72.12.192.0 - 72.13.159.255 us 72.13.160.0 - 72.13.191.255 ca 72.13.192.0 - 72.14.159.255 us -72.14.160.0 - 72.14.167.199 ca -72.14.167.200 - 72.14.167.207 us -72.14.167.208 - 72.14.175.255 ca -72.14.176.0 - 72.15.47.255 us +72.14.160.0 - 72.14.175.255 ca +72.14.176.0 - 72.14.192.255 us +72.14.193.0 - 72.14.193.255 eu +72.14.194.0 - 72.14.229.255 us +72.14.230.0 - 72.14.230.7 au +72.14.230.8 - 72.14.230.15 in +72.14.230.16 - 72.14.230.23 sg +72.14.230.24 - 72.14.230.31 hk +72.14.230.32 - 72.14.230.39 kr +72.14.230.40 - 72.14.230.47 tw +72.14.230.48 - 72.14.230.55 in +72.14.230.56 - 72.14.230.63 jp +72.14.230.64 - 72.14.230.67 hk +72.14.230.68 - 72.14.230.71 in +72.14.230.72 - 72.14.230.79 id +72.14.230.80 - 72.14.230.255 in +72.14.231.0 - 72.14.231.7 au +72.14.231.8 - 72.14.231.15 sg +72.14.231.16 - 72.14.231.23 hk +72.14.231.24 - 72.14.231.31 in +72.14.231.32 - 72.14.231.39 kr +72.14.231.40 - 72.14.231.47 tw +72.14.231.48 - 72.14.231.55 jp +72.14.231.56 - 72.14.231.63 in +72.14.231.64 - 72.14.231.71 my +72.14.231.72 - 72.14.231.103 us +72.14.231.104 - 72.14.231.107 hk +72.14.231.108 - 72.14.231.119 us +72.14.231.120 - 72.14.231.121 id +72.14.231.122 - 72.14.231.127 us +72.14.231.128 - 72.14.231.255 in +72.14.232.0 - 72.15.47.255 us 72.15.48.0 - 72.15.63.255 ca 72.15.64.0 - 72.15.127.255 us -72.15.128.0 - 72.15.146.223 ca -72.15.146.224 - 72.15.146.255 us -72.15.147.0 - 72.15.148.23 ca -72.15.148.24 - 72.15.148.31 us -72.15.148.32 - 72.15.159.255 ca -72.15.160.0 - 72.15.192.31 us -72.15.192.32 - 72.15.192.47 gb -72.15.192.48 - 72.15.206.127 us -72.15.206.128 - 72.15.206.143 ca -72.15.206.144 - 72.15.243.63 us -72.15.243.64 - 72.15.243.127 gb -72.15.243.128 - 72.18.196.3 us -72.18.196.4 - 72.18.196.19 mx -72.18.196.20 - 72.18.199.3 us -72.18.199.4 - 72.18.199.19 mx -72.18.199.20 - 72.18.199.23 us -72.18.199.24 - 72.18.199.51 gr -72.18.199.52 - 72.18.201.195 us -72.18.201.196 - 72.18.201.227 ca -72.18.201.228 - 72.18.201.255 us -72.18.202.0 - 72.18.202.255 mx -72.18.203.0 - 72.20.1.51 us -72.20.1.52 - 72.20.1.55 id -72.20.1.56 - 72.20.1.79 us -72.20.1.80 - 72.20.1.83 kr -72.20.1.84 - 72.20.1.87 cn -72.20.1.88 - 72.20.3.27 us -72.20.3.28 - 72.20.3.31 vn -72.20.3.32 - 72.20.3.43 us -72.20.3.44 - 72.20.3.47 br -72.20.3.48 - 72.20.3.87 us -72.20.3.88 - 72.20.3.91 sa -72.20.3.92 - 72.20.3.151 us -72.20.3.152 - 72.20.3.155 ro -72.20.3.156 - 72.20.3.167 us -72.20.3.168 - 72.20.3.171 sc -72.20.3.172 - 72.20.3.175 us -72.20.3.176 - 72.20.3.179 in -72.20.3.180 - 72.20.4.71 us -72.20.4.72 - 72.20.4.75 tr -72.20.4.76 - 72.20.4.79 pe -72.20.4.80 - 72.20.4.139 us -72.20.4.140 - 72.20.4.143 cn -72.20.4.144 - 72.20.4.155 us -72.20.4.156 - 72.20.4.159 cn -72.20.4.160 - 72.20.4.167 us -72.20.4.168 - 72.20.4.171 pk -72.20.4.172 - 72.20.4.191 us -72.20.4.192 - 72.20.4.199 cn -72.20.4.200 - 72.20.4.203 ca -72.20.4.204 - 72.20.4.207 mx -72.20.4.208 - 72.20.4.215 us -72.20.4.216 - 72.20.4.219 cn -72.20.4.220 - 72.20.4.223 us -72.20.4.224 - 72.20.4.227 ro -72.20.4.228 - 72.20.4.247 us -72.20.4.248 - 72.20.4.255 cn -72.20.5.0 - 72.20.5.15 us -72.20.5.16 - 72.20.5.19 pl -72.20.5.20 - 72.20.5.27 us -72.20.5.28 - 72.20.5.31 bd -72.20.5.32 - 72.20.5.55 us -72.20.5.56 - 72.20.5.59 kh -72.20.5.60 - 72.20.5.63 ca -72.20.5.64 - 72.20.5.87 us -72.20.5.88 - 72.20.5.91 ca -72.20.5.92 - 72.20.5.107 us -72.20.5.108 - 72.20.5.111 pk -72.20.5.112 - 72.20.5.139 us -72.20.5.140 - 72.20.5.143 ca -72.20.5.144 - 72.20.5.151 us -72.20.5.152 - 72.20.5.155 cn -72.20.5.156 - 72.20.5.167 us -72.20.5.168 - 72.20.5.171 cn -72.20.5.172 - 72.20.5.175 us -72.20.5.176 - 72.20.5.179 pk -72.20.5.180 - 72.20.5.183 cn -72.20.5.184 - 72.20.5.215 us -72.20.5.216 - 72.20.5.219 ro -72.20.5.220 - 72.20.5.231 us -72.20.5.232 - 72.20.5.235 ro -72.20.5.236 - 72.20.6.19 us -72.20.6.20 - 72.20.6.23 cn -72.20.6.24 - 72.20.6.31 us -72.20.6.32 - 72.20.6.35 cn -72.20.6.36 - 72.20.6.39 us -72.20.6.40 - 72.20.6.47 in -72.20.6.48 - 72.20.6.59 us -72.20.6.60 - 72.20.6.63 br -72.20.6.64 - 72.20.6.115 us -72.20.6.116 - 72.20.6.119 ca -72.20.6.120 - 72.20.6.127 us -72.20.6.128 - 72.20.6.131 bd -72.20.6.132 - 72.20.6.143 us -72.20.6.144 - 72.20.6.147 kh -72.20.6.148 - 72.20.6.155 us -72.20.6.156 - 72.20.6.159 tr -72.20.6.160 - 72.20.6.163 vn -72.20.6.164 - 72.20.6.167 tr -72.20.6.168 - 72.20.6.171 ca -72.20.6.172 - 72.20.6.175 za -72.20.6.176 - 72.20.6.187 us -72.20.6.188 - 72.20.6.191 sc -72.20.6.192 - 72.20.6.199 tr -72.20.6.200 - 72.20.6.203 pl -72.20.6.204 - 72.20.7.63 us -72.20.7.64 - 72.20.7.95 cn -72.20.7.96 - 72.20.7.111 us -72.20.7.112 - 72.20.7.127 br -72.20.7.128 - 72.20.7.191 us -72.20.7.192 - 72.20.7.223 cn -72.20.7.224 - 72.20.8.63 us -72.20.8.64 - 72.20.8.79 cn -72.20.8.80 - 72.20.8.87 us -72.20.8.88 - 72.20.8.95 pe -72.20.8.96 - 72.20.8.127 us -72.20.8.128 - 72.20.8.159 kh -72.20.8.160 - 72.20.8.175 cn -72.20.8.176 - 72.20.8.191 us -72.20.8.192 - 72.20.8.255 cn -72.20.9.0 - 72.20.9.7 us -72.20.9.8 - 72.20.9.15 ph -72.20.9.16 - 72.20.9.31 us -72.20.9.32 - 72.20.9.47 tr -72.20.9.48 - 72.20.9.79 us -72.20.9.80 - 72.20.9.95 tr -72.20.9.96 - 72.20.9.143 us -72.20.9.144 - 72.20.9.159 pr -72.20.9.160 - 72.20.9.191 cn -72.20.9.192 - 72.20.10.63 us -72.20.10.64 - 72.20.10.127 cn -72.20.10.128 - 72.20.10.191 br -72.20.10.192 - 72.20.10.223 us -72.20.10.224 - 72.20.10.239 tr -72.20.10.240 - 72.20.10.247 us -72.20.10.248 - 72.20.10.251 sc -72.20.10.252 - 72.20.11.31 us -72.20.11.32 - 72.20.11.47 br -72.20.11.48 - 72.20.11.63 tr -72.20.11.64 - 72.20.11.119 us -72.20.11.120 - 72.20.11.127 ca -72.20.11.128 - 72.20.11.191 us -72.20.11.192 - 72.20.11.223 br -72.20.11.224 - 72.20.12.15 us -72.20.12.16 - 72.20.12.63 tr -72.20.12.64 - 72.20.12.127 cz -72.20.12.128 - 72.20.12.211 us -72.20.12.212 - 72.20.12.215 ca -72.20.12.216 - 72.20.13.47 us -72.20.13.48 - 72.20.13.55 cn -72.20.13.56 - 72.20.13.63 au -72.20.13.64 - 72.20.13.71 bd -72.20.13.72 - 72.20.13.75 us -72.20.13.76 - 72.20.13.79 gb -72.20.13.80 - 72.20.14.135 us -72.20.14.136 - 72.20.14.143 sc -72.20.14.144 - 72.20.14.167 us -72.20.14.168 - 72.20.14.175 ro -72.20.14.176 - 72.20.14.183 cz -72.20.14.184 - 72.20.14.191 us -72.20.14.192 - 72.20.14.255 cn -72.20.15.0 - 72.20.15.3 us -72.20.15.4 - 72.20.15.7 cz -72.20.15.8 - 72.20.15.23 us -72.20.15.24 - 72.20.15.31 tr -72.20.15.32 - 72.20.15.63 us -72.20.15.64 - 72.20.15.127 sc -72.20.15.128 - 72.20.16.127 us -72.20.16.128 - 72.20.16.159 cn -72.20.16.160 - 72.20.16.175 us -72.20.16.176 - 72.20.16.191 tr -72.20.16.192 - 72.20.16.239 us -72.20.16.240 - 72.20.16.255 sc -72.20.17.0 - 72.20.17.191 us -72.20.17.192 - 72.20.17.255 ca -72.20.18.0 - 72.20.18.31 cn -72.20.18.32 - 72.20.18.47 us -72.20.18.48 - 72.20.18.63 tr -72.20.18.64 - 72.20.18.79 us -72.20.18.80 - 72.20.18.87 ph -72.20.18.88 - 72.20.18.159 us -72.20.18.160 - 72.20.18.191 bd -72.20.18.192 - 72.20.18.255 gb -72.20.19.0 - 72.20.20.255 us -72.20.21.0 - 72.20.21.31 sc -72.20.21.32 - 72.20.21.47 tr -72.20.21.48 - 72.20.21.143 us -72.20.21.144 - 72.20.21.151 tr -72.20.21.152 - 72.20.21.175 us -72.20.21.176 - 72.20.21.179 cn -72.20.21.180 - 72.20.21.215 us -72.20.21.216 - 72.20.21.223 sc -72.20.21.224 - 72.20.22.2 us -72.20.22.3 - 72.20.22.4 kh -72.20.22.5 - 72.20.22.9 us -72.20.22.10 - 72.20.22.10 kh -72.20.22.11 - 72.20.22.13 us -72.20.22.14 - 72.20.22.14 kh -72.20.22.15 - 72.20.22.20 us -72.20.22.21 - 72.20.22.21 tr -72.20.22.22 - 72.20.22.23 us -72.20.22.24 - 72.20.22.24 cn -72.20.22.25 - 72.20.22.25 my -72.20.22.26 - 72.20.22.26 us -72.20.22.27 - 72.20.22.27 au -72.20.22.28 - 72.20.22.28 cn -72.20.22.29 - 72.20.22.31 us -72.20.22.32 - 72.20.22.47 ro -72.20.22.48 - 72.20.22.95 us -72.20.22.96 - 72.20.22.127 my -72.20.22.128 - 72.20.22.159 br -72.20.22.160 - 72.20.23.191 us -72.20.23.192 - 72.20.23.255 cn -72.20.24.0 - 72.20.24.175 us -72.20.24.176 - 72.20.24.191 ro -72.20.24.192 - 72.20.24.255 us -72.20.25.0 - 72.20.25.31 cn -72.20.25.32 - 72.20.25.131 us -72.20.25.132 - 72.20.25.135 bd -72.20.25.136 - 72.20.25.231 us -72.20.25.232 - 72.20.25.239 cn -72.20.25.240 - 72.20.25.255 tr -72.20.26.0 - 72.20.26.159 us -72.20.26.160 - 72.20.26.167 sc -72.20.26.168 - 72.20.26.175 us -72.20.26.176 - 72.20.26.191 tr -72.20.26.192 - 72.20.26.207 ro -72.20.26.208 - 72.20.26.215 us -72.20.26.216 - 72.20.26.219 tr -72.20.26.220 - 72.20.26.226 us -72.20.26.227 - 72.20.26.227 tr -72.20.26.228 - 72.20.26.228 se -72.20.26.229 - 72.20.26.229 us -72.20.26.230 - 72.20.26.230 in -72.20.26.231 - 72.20.26.231 us -72.20.26.232 - 72.20.26.232 cn -72.20.26.233 - 72.20.26.233 sc -72.20.26.234 - 72.20.26.235 us -72.20.26.236 - 72.20.26.237 sc -72.20.26.238 - 72.20.26.238 gb -72.20.26.239 - 72.20.26.239 cn -72.20.26.240 - 72.20.26.240 au -72.20.26.241 - 72.20.26.243 us -72.20.26.244 - 72.20.26.244 au -72.20.26.245 - 72.20.27.31 us -72.20.27.32 - 72.20.27.47 br -72.20.27.48 - 72.20.27.63 us -72.20.27.64 - 72.20.27.79 br -72.20.27.80 - 72.20.27.95 us -72.20.27.96 - 72.20.27.99 ca -72.20.27.100 - 72.20.27.103 us -72.20.27.104 - 72.20.27.111 bd -72.20.27.112 - 72.20.27.191 us -72.20.27.192 - 72.20.27.195 pl -72.20.27.196 - 72.20.27.215 us -72.20.27.216 - 72.20.27.235 cn -72.20.27.236 - 72.20.28.135 us -72.20.28.136 - 72.20.28.143 bd -72.20.28.144 - 72.20.28.159 tr -72.20.28.160 - 72.20.28.255 us -72.20.29.0 - 72.20.29.255 kh -72.20.30.0 - 72.20.30.131 us -72.20.30.132 - 72.20.30.135 cn -72.20.30.136 - 72.20.30.143 au -72.20.30.144 - 72.20.30.159 us -72.20.30.160 - 72.20.30.191 tr -72.20.30.192 - 72.20.30.203 us -72.20.30.204 - 72.20.30.207 sc -72.20.30.208 - 72.20.30.255 us -72.20.31.0 - 72.20.31.255 kh -72.20.32.0 - 72.20.32.31 us -72.20.32.32 - 72.20.32.47 tr -72.20.32.48 - 72.20.32.59 us -72.20.32.60 - 72.20.32.63 cn -72.20.32.64 - 72.20.32.127 us -72.20.32.128 - 72.20.32.255 cn -72.20.33.0 - 72.20.33.75 us -72.20.33.76 - 72.20.33.79 cn -72.20.33.80 - 72.20.33.95 us -72.20.33.96 - 72.20.33.103 cn -72.20.33.104 - 72.20.33.107 us -72.20.33.108 - 72.20.33.111 cn -72.20.33.112 - 72.20.33.119 us -72.20.33.120 - 72.20.33.127 cn -72.20.33.128 - 72.20.33.191 us -72.20.33.192 - 72.20.33.199 tr -72.20.33.200 - 72.20.33.255 us -72.20.34.0 - 72.20.34.115 ca -72.20.34.116 - 72.20.34.119 bd -72.20.34.120 - 72.20.34.127 ca -72.20.34.128 - 72.20.34.143 us -72.20.34.144 - 72.20.34.159 ca -72.20.34.160 - 72.20.34.163 us -72.20.34.164 - 72.20.34.167 pl -72.20.34.168 - 72.20.34.191 us -72.20.34.192 - 72.20.34.255 vn -72.20.35.0 - 72.20.35.63 br -72.20.35.64 - 72.20.36.95 us -72.20.36.96 - 72.20.36.111 bd -72.20.36.112 - 72.20.36.127 us -72.20.36.128 - 72.20.36.255 gb -72.20.37.0 - 72.20.37.127 us -72.20.37.128 - 72.20.37.191 my -72.20.37.192 - 72.20.37.207 gb -72.20.37.208 - 72.20.37.223 us -72.20.37.224 - 72.20.37.255 cn -72.20.38.0 - 72.20.38.15 tr -72.20.38.16 - 72.20.38.27 us -72.20.38.28 - 72.20.38.31 sa -72.20.38.32 - 72.20.38.47 in -72.20.38.48 - 72.20.38.191 us -72.20.38.192 - 72.20.38.255 id -72.20.39.0 - 72.20.39.63 sc -72.20.39.64 - 72.20.39.163 us -72.20.39.164 - 72.20.39.167 cn -72.20.39.168 - 72.20.39.183 us -72.20.39.184 - 72.20.39.191 cn -72.20.39.192 - 72.20.39.207 in -72.20.39.208 - 72.20.39.239 us -72.20.39.240 - 72.20.39.255 cn -72.20.40.0 - 72.20.40.3 us -72.20.40.4 - 72.20.40.7 tr -72.20.40.8 - 72.20.40.15 au -72.20.40.16 - 72.20.40.23 us -72.20.40.24 - 72.20.40.31 bd -72.20.40.32 - 72.20.40.63 us -72.20.40.64 - 72.20.40.95 sc -72.20.40.96 - 72.20.41.127 us -72.20.41.128 - 72.20.41.191 br -72.20.41.192 - 72.20.42.127 us -72.20.42.128 - 72.20.42.207 cn -72.20.42.208 - 72.20.42.223 us -72.20.42.224 - 72.20.42.255 ca -72.20.43.0 - 72.20.43.255 kh -72.20.44.0 - 72.20.44.255 in -72.20.45.0 - 72.20.45.71 us -72.20.45.72 - 72.20.45.79 sc -72.20.45.80 - 72.20.45.135 us -72.20.45.136 - 72.20.45.143 in -72.20.45.144 - 72.20.46.15 us -72.20.46.16 - 72.20.46.19 sa -72.20.46.20 - 72.20.46.63 us -72.20.46.64 - 72.20.46.95 sc -72.20.46.96 - 72.20.46.111 us -72.20.46.112 - 72.20.46.127 cn -72.20.46.128 - 72.20.47.255 us -72.20.48.0 - 72.20.48.63 cn -72.20.48.64 - 72.20.51.159 us -72.20.51.160 - 72.20.51.175 tr -72.20.51.176 - 72.20.51.215 us -72.20.51.216 - 72.20.51.219 sa -72.20.51.220 - 72.20.51.239 us -72.20.51.240 - 72.20.51.247 cn -72.20.51.248 - 72.20.51.255 us -72.20.52.0 - 72.20.52.3 sa -72.20.52.4 - 72.20.52.15 us -72.20.52.16 - 72.20.52.23 in -72.20.52.24 - 72.20.52.95 us -72.20.52.96 - 72.20.52.99 cz -72.20.52.100 - 72.20.52.167 us -72.20.52.168 - 72.20.52.175 bd -72.20.52.176 - 72.20.52.191 us -72.20.52.192 - 72.20.52.223 za -72.20.52.224 - 72.20.52.255 my -72.20.53.0 - 72.20.53.47 us -72.20.53.48 - 72.20.53.63 br -72.20.53.64 - 72.20.53.75 us -72.20.53.76 - 72.20.53.79 kr -72.20.53.80 - 72.20.53.255 us -72.20.54.0 - 72.20.54.31 ca -72.20.54.32 - 72.20.54.63 us -72.20.54.64 - 72.20.54.127 tr -72.20.54.128 - 72.20.54.255 cn -72.20.55.0 - 72.20.55.39 us -72.20.55.40 - 72.20.55.47 ro -72.20.55.48 - 72.20.55.63 tr -72.20.55.64 - 72.20.55.79 us -72.20.55.80 - 72.20.55.95 tr -72.20.55.96 - 72.20.55.255 us -72.20.56.0 - 72.20.56.63 tr -72.20.56.64 - 72.20.56.127 cn -72.20.56.128 - 72.20.56.151 us -72.20.56.152 - 72.20.56.159 sc -72.20.56.160 - 72.20.56.191 my -72.20.56.192 - 72.20.56.223 tr -72.20.56.224 - 72.20.56.247 us -72.20.56.248 - 72.20.56.255 cn -72.20.57.0 - 72.20.57.129 us -72.20.57.130 - 72.20.57.130 tr -72.20.57.131 - 72.20.57.133 us -72.20.57.134 - 72.20.57.134 cn -72.20.57.135 - 72.20.57.135 us -72.20.57.136 - 72.20.57.136 ca -72.20.57.137 - 72.20.57.138 us -72.20.57.139 - 72.20.57.140 cn -72.20.57.141 - 72.20.57.145 us -72.20.57.146 - 72.20.57.146 ca -72.20.57.147 - 72.20.57.147 us -72.20.57.148 - 72.20.57.148 tr -72.20.57.149 - 72.20.57.153 us -72.20.57.154 - 72.20.57.154 ca -72.20.57.155 - 72.20.57.157 us -72.20.57.158 - 72.20.57.158 ca -72.20.57.159 - 72.20.57.199 us -72.20.57.200 - 72.20.57.207 tr -72.20.57.208 - 72.20.58.31 us -72.20.58.32 - 72.20.58.63 ro -72.20.58.64 - 72.20.58.127 tr -72.20.58.128 - 72.20.61.255 us -72.20.62.0 - 72.20.62.255 kh -72.20.63.0 - 72.21.46.255 us -72.21.47.0 - 72.21.47.255 gb -72.21.48.0 - 72.21.83.159 us -72.21.83.160 - 72.21.83.175 si -72.21.83.176 - 72.21.89.159 us -72.21.89.160 - 72.21.89.175 si -72.21.89.176 - 72.21.89.231 us -72.21.89.232 - 72.21.89.239 cn -72.21.89.240 - 72.22.127.255 us +72.15.128.0 - 72.15.159.255 ca +72.15.160.0 - 72.15.235.255 us +72.15.236.0 - 72.15.239.255 a2 +72.15.240.0 - 72.21.88.255 us +72.21.89.0 - 72.21.89.255 de +72.21.90.0 - 72.21.90.255 gb +72.21.91.0 - 72.22.127.255 us 72.22.128.0 - 72.22.137.255 bb 72.22.138.0 - 72.22.139.255 vc 72.22.140.0 - 72.22.153.255 bb @@ -31199,874 +17282,86 @@ 72.22.156.0 - 72.22.159.255 bb 72.22.160.0 - 72.25.191.255 us 72.25.192.0 - 72.25.255.255 ca -72.26.0.0 - 72.26.255.255 us +72.26.0.0 - 72.26.215.255 us +72.26.216.0 - 72.26.219.255 nl +72.26.220.0 - 72.26.223.255 sg +72.26.224.0 - 72.26.255.255 us 72.27.0.0 - 72.27.223.255 jm 72.27.224.0 - 72.28.63.255 us 72.28.64.0 - 72.28.95.255 ca -72.28.96.0 - 72.28.255.255 us -72.29.0.0 - 72.29.0.31 in -72.29.0.32 - 72.29.0.63 be -72.29.0.64 - 72.29.1.95 us -72.29.1.96 - 72.29.1.127 be -72.29.1.128 - 72.29.1.223 us -72.29.1.224 - 72.29.1.255 in -72.29.2.0 - 72.29.3.63 us -72.29.3.64 - 72.29.3.95 au -72.29.3.96 - 72.29.3.255 us +72.28.96.0 - 72.28.112.255 us +72.28.113.0 - 72.28.113.31 gb +72.28.113.32 - 72.28.113.55 us +72.28.113.56 - 72.28.113.63 gb +72.28.113.64 - 72.28.116.191 us +72.28.116.192 - 72.28.116.255 gb +72.28.117.0 - 72.28.117.255 cn +72.28.118.0 - 72.29.3.255 us 72.29.4.0 - 72.29.4.255 ca -72.29.5.0 - 72.29.6.127 us -72.29.6.128 - 72.29.6.255 fr -72.29.7.0 - 72.29.7.255 us +72.29.5.0 - 72.29.7.255 us 72.29.8.0 - 72.29.8.255 ca 72.29.9.0 - 72.29.11.255 us 72.29.12.0 - 72.29.12.255 ca 72.29.13.0 - 72.29.13.255 in 72.29.14.0 - 72.29.14.255 us -72.29.15.0 - 72.29.16.255 ca -72.29.17.0 - 72.29.17.95 us -72.29.17.96 - 72.29.17.127 be -72.29.17.128 - 72.29.17.159 us -72.29.17.160 - 72.29.17.191 be -72.29.17.192 - 72.29.17.223 in -72.29.17.224 - 72.29.21.127 us -72.29.21.128 - 72.29.21.255 in -72.29.22.0 - 72.29.23.127 us -72.29.23.128 - 72.29.23.159 in -72.29.23.160 - 72.29.23.191 us -72.29.23.192 - 72.29.23.223 be -72.29.23.224 - 72.29.24.63 in -72.29.24.64 - 72.29.25.255 us -72.29.26.0 - 72.29.26.255 in -72.29.27.0 - 72.29.27.31 nz -72.29.27.32 - 72.29.27.63 be -72.29.27.64 - 72.29.27.127 us -72.29.27.128 - 72.29.27.159 be -72.29.27.160 - 72.29.27.191 us -72.29.27.192 - 72.29.27.223 in -72.29.27.224 - 72.29.27.255 us +72.29.15.0 - 72.29.15.255 ca +72.29.16.0 - 72.29.27.255 us 72.29.28.0 - 72.29.28.255 ca -72.29.29.0 - 72.29.69.174 us -72.29.69.175 - 72.29.69.178 pk -72.29.69.179 - 72.29.76.2 us -72.29.76.3 - 72.29.76.6 pe -72.29.76.7 - 72.29.78.61 us -72.29.78.62 - 72.29.78.62 ca -72.29.78.63 - 72.29.87.148 us -72.29.87.149 - 72.29.87.149 ca -72.29.87.150 - 72.29.95.255 us -72.29.96.0 - 72.29.96.7 it -72.29.96.8 - 72.29.96.15 es -72.29.96.16 - 72.29.96.151 us -72.29.96.152 - 72.29.96.159 it -72.29.96.160 - 72.29.97.191 us -72.29.97.192 - 72.29.97.199 au -72.29.97.200 - 72.29.97.215 it -72.29.97.216 - 72.29.97.239 us -72.29.97.240 - 72.29.97.247 it -72.29.97.248 - 72.29.101.223 us -72.29.101.224 - 72.29.101.255 gb -72.29.102.0 - 72.29.118.191 us -72.29.118.192 - 72.29.118.255 au -72.29.119.0 - 72.29.130.127 us -72.29.130.128 - 72.29.130.143 mx -72.29.130.144 - 72.29.175.63 us -72.29.175.64 - 72.29.175.79 gb -72.29.175.80 - 72.29.223.255 us -72.29.224.0 - 72.29.227.159 ca -72.29.227.160 - 72.29.227.191 us -72.29.227.192 - 72.29.255.255 ca -72.30.0.0 - 72.32.1.79 us -72.32.1.80 - 72.32.1.87 jm -72.32.1.88 - 72.32.1.95 us -72.32.1.96 - 72.32.1.111 de -72.32.1.112 - 72.32.3.47 us -72.32.3.48 - 72.32.3.63 in -72.32.3.64 - 72.32.3.95 us -72.32.3.96 - 72.32.3.111 ng -72.32.3.112 - 72.32.3.143 us -72.32.3.144 - 72.32.3.151 ca -72.32.3.152 - 72.32.3.167 us -72.32.3.168 - 72.32.3.175 gb -72.32.3.176 - 72.32.4.151 us -72.32.4.152 - 72.32.4.159 il -72.32.4.160 - 72.32.4.167 us -72.32.4.168 - 72.32.4.175 mx -72.32.4.176 - 72.32.4.183 gb -72.32.4.184 - 72.32.5.63 us -72.32.5.64 - 72.32.5.71 ca -72.32.5.72 - 72.32.5.175 us -72.32.5.176 - 72.32.5.183 ca -72.32.5.184 - 72.32.5.207 us -72.32.5.208 - 72.32.5.215 ca -72.32.5.216 - 72.32.7.119 us -72.32.7.120 - 72.32.7.127 au -72.32.7.128 - 72.32.10.7 us -72.32.10.8 - 72.32.10.15 es -72.32.10.16 - 72.32.11.255 us -72.32.12.0 - 72.32.12.15 gb -72.32.12.16 - 72.32.12.255 us -72.32.13.0 - 72.32.13.15 ae -72.32.13.16 - 72.32.14.63 us -72.32.14.64 - 72.32.14.71 in -72.32.14.72 - 72.32.14.95 us -72.32.14.96 - 72.32.14.119 il -72.32.14.120 - 72.32.15.79 us -72.32.15.80 - 72.32.15.95 ca -72.32.15.96 - 72.32.15.255 us -72.32.16.0 - 72.32.16.15 br -72.32.16.16 - 72.32.16.39 us -72.32.16.40 - 72.32.16.47 au -72.32.16.48 - 72.32.18.15 us -72.32.18.16 - 72.32.18.23 ca -72.32.18.24 - 72.32.18.55 us -72.32.18.56 - 72.32.18.63 in -72.32.18.64 - 72.32.18.95 us -72.32.18.96 - 72.32.18.103 au -72.32.18.104 - 72.32.18.151 us -72.32.18.152 - 72.32.18.159 hk -72.32.18.160 - 72.32.19.31 us -72.32.19.32 - 72.32.19.63 il -72.32.19.64 - 72.32.19.79 us -72.32.19.80 - 72.32.19.87 in -72.32.19.88 - 72.32.19.95 gb -72.32.19.96 - 72.32.19.159 us -72.32.19.160 - 72.32.19.167 gb -72.32.19.168 - 72.32.20.167 us -72.32.20.168 - 72.32.20.175 au -72.32.20.176 - 72.32.20.183 us -72.32.20.184 - 72.32.20.191 ca -72.32.20.192 - 72.32.20.255 us -72.32.21.0 - 72.32.21.7 in -72.32.21.8 - 72.32.21.15 us -72.32.21.16 - 72.32.21.23 nz -72.32.21.24 - 72.32.22.127 us -72.32.22.128 - 72.32.22.143 in -72.32.22.144 - 72.32.22.151 us -72.32.22.152 - 72.32.22.159 mx -72.32.22.160 - 72.32.23.223 us -72.32.23.224 - 72.32.23.239 za -72.32.23.240 - 72.32.23.255 il -72.32.24.0 - 72.32.24.79 us -72.32.24.80 - 72.32.24.87 au -72.32.24.88 - 72.32.24.127 us -72.32.24.128 - 72.32.24.135 cr -72.32.24.136 - 72.32.28.195 us -72.32.28.196 - 72.32.28.199 ca -72.32.28.200 - 72.32.29.183 us -72.32.29.184 - 72.32.29.191 ie -72.32.29.192 - 72.32.30.143 us -72.32.30.144 - 72.32.30.151 au -72.32.30.152 - 72.32.31.23 us -72.32.31.24 - 72.32.31.31 au -72.32.31.32 - 72.32.32.55 us -72.32.32.56 - 72.32.32.63 kw -72.32.32.64 - 72.32.32.103 us -72.32.32.104 - 72.32.32.111 br -72.32.32.112 - 72.32.32.127 us -72.32.32.128 - 72.32.32.135 ca -72.32.32.136 - 72.32.33.167 us -72.32.33.168 - 72.32.33.175 au -72.32.33.176 - 72.32.34.127 us -72.32.34.128 - 72.32.34.135 in -72.32.34.136 - 72.32.34.143 us -72.32.34.144 - 72.32.34.151 gb -72.32.34.152 - 72.32.34.159 us -72.32.34.160 - 72.32.34.167 gb -72.32.34.168 - 72.32.34.207 us -72.32.34.208 - 72.32.34.215 ca -72.32.34.216 - 72.32.34.255 us -72.32.35.0 - 72.32.35.15 in -72.32.35.16 - 72.32.35.31 au -72.32.35.32 - 72.32.35.39 in -72.32.35.40 - 72.32.35.71 us -72.32.35.72 - 72.32.35.79 do -72.32.35.80 - 72.32.35.87 us -72.32.35.88 - 72.32.35.95 gb -72.32.35.96 - 72.32.35.119 us -72.32.35.120 - 72.32.35.127 pa -72.32.35.128 - 72.32.35.159 us -72.32.35.160 - 72.32.35.191 au -72.32.35.192 - 72.32.37.79 us -72.32.37.80 - 72.32.37.87 ca -72.32.37.88 - 72.32.37.111 us -72.32.37.112 - 72.32.37.119 in -72.32.37.120 - 72.32.38.87 us -72.32.38.88 - 72.32.38.95 bm -72.32.38.96 - 72.32.39.119 us -72.32.39.120 - 72.32.39.143 ca -72.32.39.144 - 72.32.41.63 us -72.32.41.64 - 72.32.41.87 gb -72.32.41.88 - 72.32.42.79 us -72.32.42.80 - 72.32.42.87 au -72.32.42.88 - 72.32.42.176 us -72.32.42.177 - 72.32.42.184 au -72.32.42.185 - 72.32.43.255 us -72.32.44.0 - 72.32.44.15 il -72.32.44.16 - 72.32.44.71 us -72.32.44.72 - 72.32.44.79 gb -72.32.44.80 - 72.32.44.183 us -72.32.44.184 - 72.32.44.191 ca -72.32.44.192 - 72.32.45.95 us -72.32.45.96 - 72.32.45.103 ca -72.32.45.104 - 72.32.45.119 us -72.32.45.120 - 72.32.45.127 mx -72.32.45.128 - 72.32.45.223 us -72.32.45.224 - 72.32.45.247 no -72.32.45.248 - 72.32.46.63 us -72.32.46.64 - 72.32.46.79 ca -72.32.46.80 - 72.32.46.127 us -72.32.46.128 - 72.32.46.255 il -72.32.47.0 - 72.32.47.23 us -72.32.47.24 - 72.32.47.31 il -72.32.47.32 - 72.32.47.39 ca -72.32.47.40 - 72.32.47.167 us -72.32.47.168 - 72.32.47.191 au -72.32.47.192 - 72.32.48.15 us -72.32.48.16 - 72.32.48.31 ca -72.32.48.32 - 72.32.48.167 us -72.32.48.168 - 72.32.48.175 au -72.32.48.176 - 72.32.52.55 us -72.32.52.56 - 72.32.52.63 gb -72.32.52.64 - 72.32.52.159 us -72.32.52.160 - 72.32.52.167 il -72.32.52.168 - 72.32.53.159 us -72.32.53.160 - 72.32.53.167 il -72.32.53.168 - 72.32.53.231 us -72.32.53.232 - 72.32.53.239 ca -72.32.53.240 - 72.32.54.103 us -72.32.54.104 - 72.32.54.111 mx -72.32.54.112 - 72.32.55.15 us -72.32.55.16 - 72.32.55.23 au -72.32.55.24 - 72.32.55.79 us -72.32.55.80 - 72.32.55.87 bh -72.32.55.88 - 72.32.55.159 us -72.32.55.160 - 72.32.55.167 in -72.32.55.168 - 72.32.55.175 us -72.32.55.176 - 72.32.55.183 jp -72.32.55.184 - 72.32.55.223 us -72.32.55.224 - 72.32.55.231 gb -72.32.55.232 - 72.32.55.255 us -72.32.56.0 - 72.32.56.127 gb -72.32.56.128 - 72.32.60.191 us -72.32.60.192 - 72.32.60.255 ca -72.32.61.0 - 72.32.61.199 us -72.32.61.200 - 72.32.61.207 nz -72.32.61.208 - 72.32.61.239 us -72.32.61.240 - 72.32.61.247 gb -72.32.61.248 - 72.32.62.207 us -72.32.62.208 - 72.32.62.215 kw -72.32.62.216 - 72.32.64.111 us -72.32.64.112 - 72.32.64.119 de -72.32.64.120 - 72.32.74.15 us -72.32.74.16 - 72.32.74.23 in -72.32.74.24 - 72.32.75.135 us -72.32.75.136 - 72.32.75.143 ca -72.32.75.144 - 72.32.90.159 us -72.32.90.160 - 72.32.90.167 it -72.32.90.168 - 72.32.90.175 bm -72.32.90.176 - 72.32.90.255 us -72.32.91.0 - 72.32.91.15 in -72.32.91.16 - 72.32.91.79 us -72.32.91.80 - 72.32.91.111 gb -72.32.91.112 - 72.32.92.151 us -72.32.92.152 - 72.32.92.199 nl -72.32.92.200 - 72.32.93.103 us -72.32.93.104 - 72.32.93.111 ca -72.32.93.112 - 72.32.94.79 us -72.32.94.80 - 72.32.94.87 sv -72.32.94.88 - 72.32.95.63 us -72.32.95.64 - 72.32.95.79 ca -72.32.95.80 - 72.32.96.55 us -72.32.96.56 - 72.32.96.63 cr -72.32.96.64 - 72.32.97.23 us -72.32.97.24 - 72.32.97.31 pk -72.32.97.32 - 72.32.97.63 us -72.32.97.64 - 72.32.97.79 au -72.32.97.80 - 72.32.98.31 us -72.32.98.32 - 72.32.98.39 mx -72.32.98.40 - 72.32.98.47 us -72.32.98.48 - 72.32.98.55 mx -72.32.98.56 - 72.32.98.87 us -72.32.98.88 - 72.32.98.95 mx -72.32.98.96 - 72.32.98.119 us -72.32.98.120 - 72.32.98.127 au -72.32.98.128 - 72.32.98.151 us -72.32.98.152 - 72.32.98.159 ca -72.32.98.160 - 72.32.98.255 us -72.32.99.0 - 72.32.99.7 in -72.32.99.8 - 72.32.99.151 us -72.32.99.152 - 72.32.99.159 ca -72.32.99.160 - 72.32.100.143 us -72.32.100.144 - 72.32.100.159 au -72.32.100.160 - 72.32.101.95 us -72.32.101.96 - 72.32.101.103 ca -72.32.101.104 - 72.32.102.15 us -72.32.102.16 - 72.32.102.23 au -72.32.102.24 - 72.32.102.31 in -72.32.102.32 - 72.32.102.159 us -72.32.102.160 - 72.32.102.175 gb -72.32.102.176 - 72.32.102.255 us -72.32.103.0 - 72.32.103.7 jp -72.32.103.8 - 72.32.105.135 us -72.32.105.136 - 72.32.105.151 in -72.32.105.152 - 72.32.106.31 us -72.32.106.32 - 72.32.106.39 ca -72.32.106.40 - 72.32.106.143 us -72.32.106.144 - 72.32.106.151 in -72.32.106.152 - 72.32.107.119 us -72.32.107.120 - 72.32.107.127 ve -72.32.107.128 - 72.32.107.167 us -72.32.107.168 - 72.32.107.175 nz -72.32.107.176 - 72.32.108.7 us -72.32.108.8 - 72.32.108.15 bg -72.32.108.16 - 72.32.108.63 us -72.32.108.64 - 72.32.108.127 ca -72.32.108.128 - 72.32.109.103 us -72.32.109.104 - 72.32.109.111 au -72.32.109.112 - 72.32.109.175 us -72.32.109.176 - 72.32.109.191 bd -72.32.109.192 - 72.32.116.103 us -72.32.116.104 - 72.32.116.111 gb -72.32.116.112 - 72.32.116.151 us -72.32.116.152 - 72.32.116.159 se -72.32.116.160 - 72.32.116.183 us -72.32.116.184 - 72.32.116.191 se -72.32.116.192 - 72.32.116.199 us -72.32.116.200 - 72.32.116.207 nz -72.32.116.208 - 72.32.116.223 us -72.32.116.224 - 72.32.116.231 se -72.32.116.232 - 72.32.119.127 us -72.32.119.128 - 72.32.119.135 gb -72.32.119.136 - 72.32.119.255 us -72.32.120.0 - 72.32.120.7 mx -72.32.120.8 - 72.32.125.255 us -72.32.126.0 - 72.32.126.7 gb -72.32.126.8 - 72.32.126.87 us -72.32.126.88 - 72.32.126.95 mx -72.32.126.96 - 72.32.127.159 us -72.32.127.160 - 72.32.127.167 ca -72.32.127.168 - 72.32.129.95 us -72.32.129.96 - 72.32.129.127 ca -72.32.129.128 - 72.32.130.87 us -72.32.130.88 - 72.32.130.95 mx -72.32.130.96 - 72.32.131.47 us -72.32.131.48 - 72.32.131.55 au -72.32.131.56 - 72.32.131.127 us -72.32.131.128 - 72.32.131.135 jm -72.32.131.136 - 72.32.131.143 us -72.32.131.144 - 72.32.131.159 ca -72.32.131.160 - 72.32.131.199 us -72.32.131.200 - 72.32.131.203 fr -72.32.131.204 - 72.32.132.127 us -72.32.132.128 - 72.32.132.143 bd -72.32.132.144 - 72.32.133.15 us -72.32.133.16 - 72.32.133.31 bd -72.32.133.32 - 72.32.133.63 us -72.32.133.64 - 72.32.133.71 ca -72.32.133.72 - 72.32.133.143 us -72.32.133.144 - 72.32.133.151 au -72.32.133.152 - 72.32.134.71 us -72.32.134.72 - 72.32.134.79 sg -72.32.134.80 - 72.32.134.127 us -72.32.134.128 - 72.32.134.143 ca -72.32.134.144 - 72.32.134.167 us -72.32.134.168 - 72.32.134.175 sr -72.32.134.176 - 72.32.135.87 us -72.32.135.88 - 72.32.135.95 au -72.32.135.96 - 72.32.136.15 us -72.32.136.16 - 72.32.136.23 ca -72.32.136.24 - 72.32.136.159 us -72.32.136.160 - 72.32.136.167 au -72.32.136.168 - 72.32.136.203 us -72.32.136.204 - 72.32.136.205 gb -72.32.136.206 - 72.32.137.15 us -72.32.137.16 - 72.32.137.31 ca -72.32.137.32 - 72.32.137.63 us -72.32.137.64 - 72.32.137.71 ca -72.32.137.72 - 72.32.137.211 us -72.32.137.212 - 72.32.137.215 gb -72.32.137.216 - 72.32.138.255 us -72.32.139.0 - 72.32.139.255 es -72.32.140.0 - 72.32.140.23 us -72.32.140.24 - 72.32.140.31 au -72.32.140.32 - 72.32.140.39 ca -72.32.140.40 - 72.32.140.47 mx -72.32.140.48 - 72.32.140.63 us -72.32.140.64 - 72.32.140.95 gb -72.32.140.96 - 72.32.140.255 us -72.32.141.0 - 72.32.141.15 ca -72.32.141.16 - 72.32.142.87 us -72.32.142.88 - 72.32.142.95 id -72.32.142.96 - 72.32.142.135 us -72.32.142.136 - 72.32.142.143 br -72.32.142.144 - 72.32.143.95 us -72.32.143.96 - 72.32.143.111 mx -72.32.143.112 - 72.32.144.7 us -72.32.144.8 - 72.32.144.15 my -72.32.144.16 - 72.32.144.71 us -72.32.144.72 - 72.32.144.79 ca -72.32.144.80 - 72.32.144.95 us -72.32.144.96 - 72.32.144.103 ca -72.32.144.104 - 72.32.144.111 au -72.32.144.112 - 72.32.144.183 us -72.32.144.184 - 72.32.144.191 au -72.32.144.192 - 72.32.144.203 us -72.32.144.204 - 72.32.144.207 hu -72.32.144.208 - 72.32.144.247 us -72.32.144.248 - 72.32.144.249 je -72.32.144.250 - 72.32.145.23 us -72.32.145.24 - 72.32.145.31 au -72.32.145.32 - 72.32.146.95 us -72.32.146.96 - 72.32.146.103 tt -72.32.146.104 - 72.32.147.71 us -72.32.147.72 - 72.32.147.79 gb -72.32.147.80 - 72.32.148.239 us -72.32.148.240 - 72.32.148.255 sg -72.32.149.0 - 72.32.149.7 us -72.32.149.8 - 72.32.149.15 se -72.32.149.16 - 72.32.149.95 us -72.32.149.96 - 72.32.149.103 gb -72.32.149.104 - 72.32.149.111 us -72.32.149.112 - 72.32.149.119 gb -72.32.149.120 - 72.32.150.159 us -72.32.150.160 - 72.32.150.167 gb -72.32.150.168 - 72.32.151.143 us -72.32.151.144 - 72.32.151.159 in -72.32.151.160 - 72.32.151.167 nz -72.32.151.168 - 72.32.152.95 us -72.32.152.96 - 72.32.152.111 gb -72.32.152.112 - 72.32.153.63 us -72.32.153.64 - 72.32.153.79 in -72.32.153.80 - 72.32.153.87 us -72.32.153.88 - 72.32.153.95 gb -72.32.153.96 - 72.32.154.167 us -72.32.154.168 - 72.32.154.175 gb -72.32.154.176 - 72.32.155.159 us -72.32.155.160 - 72.32.155.167 mx -72.32.155.168 - 72.32.155.175 us -72.32.155.176 - 72.32.155.191 de -72.32.155.192 - 72.32.156.231 us -72.32.156.232 - 72.32.156.239 ca -72.32.156.240 - 72.32.157.255 us -72.32.158.0 - 72.32.158.7 gb -72.32.158.8 - 72.32.158.151 us -72.32.158.152 - 72.32.158.159 mx -72.32.158.160 - 72.32.158.183 us -72.32.158.184 - 72.32.158.191 ie -72.32.158.192 - 72.32.159.7 us -72.32.159.8 - 72.32.159.15 za -72.32.159.16 - 72.32.159.159 us -72.32.159.160 - 72.32.159.167 gb -72.32.159.168 - 72.32.159.247 us -72.32.159.248 - 72.32.159.255 gb -72.32.160.0 - 72.32.160.119 us -72.32.160.120 - 72.32.160.127 gb -72.32.160.128 - 72.32.161.79 us -72.32.161.80 - 72.32.161.87 ca -72.32.161.88 - 72.32.161.191 us -72.32.161.192 - 72.32.161.199 il -72.32.161.200 - 72.32.161.207 us -72.32.161.208 - 72.32.161.223 ca -72.32.161.224 - 72.32.162.39 us -72.32.162.40 - 72.32.162.47 in -72.32.162.48 - 72.32.162.143 us -72.32.162.144 - 72.32.162.151 ca -72.32.162.152 - 72.32.163.95 us -72.32.163.96 - 72.32.163.103 sg -72.32.163.104 - 72.32.163.183 us -72.32.163.184 - 72.32.163.191 nz -72.32.163.192 - 72.32.164.55 us -72.32.164.56 - 72.32.164.63 bo -72.32.164.64 - 72.32.164.87 us -72.32.164.88 - 72.32.164.95 cn -72.32.164.96 - 72.32.165.15 us -72.32.165.16 - 72.32.165.31 ca -72.32.165.32 - 72.32.166.183 us -72.32.166.184 - 72.32.166.199 ae -72.32.166.200 - 72.32.167.39 us -72.32.167.40 - 72.32.167.47 bg -72.32.167.48 - 72.32.167.55 us -72.32.167.56 - 72.32.167.63 mx -72.32.167.64 - 72.32.167.127 us -72.32.167.128 - 72.32.167.135 ca -72.32.167.136 - 72.32.167.239 us -72.32.167.240 - 72.32.167.255 au -72.32.168.0 - 72.32.168.71 us -72.32.168.72 - 72.32.168.79 nz -72.32.168.80 - 72.32.168.167 us -72.32.168.168 - 72.32.168.183 gb -72.32.168.184 - 72.32.168.255 us -72.32.169.0 - 72.32.169.7 mt -72.32.169.8 - 72.32.169.135 us -72.32.169.136 - 72.32.169.143 mt -72.32.169.144 - 72.32.170.7 us -72.32.170.8 - 72.32.170.15 ca -72.32.170.16 - 72.32.170.31 pk -72.32.170.32 - 72.32.170.63 ca -72.32.170.64 - 72.32.170.135 us -72.32.170.136 - 72.32.170.143 au -72.32.170.144 - 72.32.170.239 us -72.32.170.240 - 72.32.170.255 ca -72.32.171.0 - 72.32.171.151 us -72.32.171.152 - 72.32.171.159 nz -72.32.171.160 - 72.32.173.31 us -72.32.173.32 - 72.32.173.47 gb -72.32.173.48 - 72.32.173.199 us -72.32.173.200 - 72.32.173.203 ca -72.32.173.204 - 72.32.174.15 us -72.32.174.16 - 72.32.174.31 my -72.32.174.32 - 72.32.174.63 us -72.32.174.64 - 72.32.174.71 ie -72.32.174.72 - 72.32.174.79 il -72.32.174.80 - 72.32.175.15 us -72.32.175.16 - 72.32.175.23 il -72.32.175.24 - 72.32.175.55 us -72.32.175.56 - 72.32.175.63 au -72.32.175.64 - 72.32.175.223 us -72.32.175.224 - 72.32.175.239 gb -72.32.175.240 - 72.32.176.119 us -72.32.176.120 - 72.32.176.127 ca -72.32.176.128 - 72.32.178.15 us -72.32.178.16 - 72.32.178.23 il -72.32.178.24 - 72.32.178.127 us -72.32.178.128 - 72.32.178.135 au -72.32.178.136 - 72.32.180.31 us -72.32.180.32 - 72.32.180.39 ca -72.32.180.40 - 72.32.188.231 us -72.32.188.232 - 72.32.188.239 se -72.32.188.240 - 72.32.200.63 us -72.32.200.64 - 72.32.200.71 mo -72.32.200.72 - 72.32.201.135 us -72.32.201.136 - 72.32.201.143 in -72.32.201.144 - 72.32.201.175 us -72.32.201.176 - 72.32.201.183 ca -72.32.201.184 - 72.32.201.191 il -72.32.201.192 - 72.32.201.199 us -72.32.201.200 - 72.32.201.207 ca -72.32.201.208 - 72.32.202.7 us -72.32.202.8 - 72.32.202.15 pr -72.32.202.16 - 72.32.202.215 us -72.32.202.216 - 72.32.202.223 gb -72.32.202.224 - 72.32.203.231 us -72.32.203.232 - 72.32.203.239 au -72.32.203.240 - 72.32.203.247 gb -72.32.203.248 - 72.32.205.63 us -72.32.205.64 - 72.32.205.71 dk -72.32.205.72 - 72.32.205.79 il -72.32.205.80 - 72.32.205.87 ca -72.32.205.88 - 72.32.205.159 us -72.32.205.160 - 72.32.205.167 fi -72.32.205.168 - 72.32.207.55 us -72.32.207.56 - 72.32.207.63 il -72.32.207.64 - 72.32.207.71 gb -72.32.207.72 - 72.32.207.79 in -72.32.207.80 - 72.32.207.239 us -72.32.207.240 - 72.32.207.247 bb -72.32.207.248 - 72.32.212.31 us -72.32.212.32 - 72.32.212.39 gb -72.32.212.40 - 72.32.212.119 us -72.32.212.120 - 72.32.212.127 ca -72.32.212.128 - 72.32.213.47 us -72.32.213.48 - 72.32.213.55 vg -72.32.213.56 - 72.32.213.63 us -72.32.213.64 - 72.32.213.71 au -72.32.213.72 - 72.32.215.255 us -72.32.216.0 - 72.32.216.7 ca -72.32.216.8 - 72.32.216.39 us -72.32.216.40 - 72.32.216.47 il -72.32.216.48 - 72.32.217.199 us -72.32.217.200 - 72.32.217.207 za -72.32.217.208 - 72.32.218.167 us -72.32.218.168 - 72.32.218.175 ca -72.32.218.176 - 72.32.218.215 us -72.32.218.216 - 72.32.218.223 py -72.32.218.224 - 72.32.219.47 us -72.32.219.48 - 72.32.219.55 mx -72.32.219.56 - 72.32.219.71 us -72.32.219.72 - 72.32.219.79 lt -72.32.219.80 - 72.32.219.87 in -72.32.219.88 - 72.32.220.31 us -72.32.220.32 - 72.32.220.39 ca -72.32.220.40 - 72.32.220.71 us -72.32.220.72 - 72.32.220.79 br -72.32.220.80 - 72.32.220.111 us -72.32.220.112 - 72.32.220.119 ca -72.32.220.120 - 72.32.221.255 us -72.32.222.0 - 72.32.222.15 ca -72.32.222.16 - 72.32.222.79 us -72.32.222.80 - 72.32.222.95 gb -72.32.222.96 - 72.32.223.199 us -72.32.223.200 - 72.32.223.207 ie -72.32.223.208 - 72.32.224.47 us -72.32.224.48 - 72.32.224.55 cr -72.32.224.56 - 72.32.224.103 us -72.32.224.104 - 72.32.224.111 my -72.32.224.112 - 72.32.224.119 us -72.32.224.120 - 72.32.224.127 hn -72.32.224.128 - 72.32.224.231 us -72.32.224.232 - 72.32.224.239 au -72.32.224.240 - 72.32.225.47 us -72.32.225.48 - 72.32.225.63 au -72.32.225.64 - 72.32.225.135 us -72.32.225.136 - 72.32.225.143 gb -72.32.225.144 - 72.32.225.167 us -72.32.225.168 - 72.32.225.175 au -72.32.225.176 - 72.32.225.183 cl -72.32.225.184 - 72.32.225.191 au -72.32.225.192 - 72.32.225.199 us -72.32.225.200 - 72.32.225.207 bb -72.32.225.208 - 72.32.225.247 us -72.32.225.248 - 72.32.225.255 au -72.32.226.0 - 72.32.226.63 us -72.32.226.64 - 72.32.226.71 ca -72.32.226.72 - 72.32.226.151 us -72.32.226.152 - 72.32.226.159 za -72.32.226.160 - 72.32.226.199 us -72.32.226.200 - 72.32.226.215 mt -72.32.226.216 - 72.32.227.15 us -72.32.227.16 - 72.32.227.23 au -72.32.227.24 - 72.32.227.175 us -72.32.227.176 - 72.32.227.183 au -72.32.227.184 - 72.32.228.7 us -72.32.228.8 - 72.32.228.15 au -72.32.228.16 - 72.32.228.63 us -72.32.228.64 - 72.32.228.71 au -72.32.228.72 - 72.32.228.127 us -72.32.228.128 - 72.32.228.135 gb -72.32.228.136 - 72.32.228.159 us -72.32.228.160 - 72.32.228.167 au -72.32.228.168 - 72.32.229.7 us -72.32.229.8 - 72.32.229.15 gb -72.32.229.16 - 72.32.229.143 us -72.32.229.144 - 72.32.229.151 in -72.32.229.152 - 72.32.229.167 us -72.32.229.168 - 72.32.229.175 au -72.32.229.176 - 72.32.229.215 us -72.32.229.216 - 72.32.229.247 bb -72.32.229.248 - 72.32.230.7 us -72.32.230.8 - 72.32.230.15 ca -72.32.230.16 - 72.32.230.135 us -72.32.230.136 - 72.32.230.143 au -72.32.230.144 - 72.32.230.207 us -72.32.230.208 - 72.32.230.215 gb -72.32.230.216 - 72.32.231.71 us -72.32.231.72 - 72.32.231.79 gb -72.32.231.80 - 72.32.232.159 us -72.32.232.160 - 72.32.232.167 in -72.32.232.168 - 72.32.233.23 us -72.32.233.24 - 72.32.233.31 ca -72.32.233.32 - 72.32.233.71 us -72.32.233.72 - 72.32.233.79 gb -72.32.233.80 - 72.32.233.175 us -72.32.233.176 - 72.32.233.183 pr -72.32.233.184 - 72.32.234.63 us -72.32.234.64 - 72.32.234.71 au -72.32.234.72 - 72.32.234.79 gb -72.32.234.80 - 72.32.234.87 ng -72.32.234.88 - 72.32.234.255 us -72.32.235.0 - 72.32.235.7 gb -72.32.235.8 - 72.32.236.71 us -72.32.236.72 - 72.32.236.79 ca -72.32.236.80 - 72.32.237.191 us -72.32.237.192 - 72.32.237.223 ca -72.32.237.224 - 72.32.237.255 us -72.32.238.0 - 72.32.238.7 in -72.32.238.8 - 72.32.238.15 gb -72.32.238.16 - 72.32.238.23 ae -72.32.238.24 - 72.32.238.239 us -72.32.238.240 - 72.32.238.247 ca -72.32.238.248 - 72.32.238.255 us -72.32.239.0 - 72.32.239.7 th -72.32.239.8 - 72.32.239.135 us -72.32.239.136 - 72.32.239.143 gb -72.32.239.144 - 72.32.239.201 us -72.32.239.202 - 72.32.239.203 in -72.32.239.204 - 72.32.240.47 us -72.32.240.48 - 72.32.240.55 nz -72.32.240.56 - 72.32.240.95 us -72.32.240.96 - 72.32.240.111 th -72.32.240.112 - 72.32.241.31 us -72.32.241.32 - 72.32.241.39 au -72.32.241.40 - 72.32.241.255 us -72.32.242.0 - 72.32.242.7 in -72.32.242.8 - 72.32.242.31 us -72.32.242.32 - 72.32.242.47 in -72.32.242.48 - 72.32.242.231 us -72.32.242.232 - 72.32.242.239 br -72.32.242.240 - 72.32.243.207 us -72.32.243.208 - 72.32.243.223 gb -72.32.243.224 - 72.32.244.15 us -72.32.244.16 - 72.32.244.23 ca -72.32.244.24 - 72.32.244.87 us -72.32.244.88 - 72.32.244.95 my -72.32.244.96 - 72.32.244.143 us -72.32.244.144 - 72.32.244.151 an -72.32.244.152 - 72.32.244.159 mx -72.32.244.160 - 72.32.245.127 us -72.32.245.128 - 72.32.245.135 mx -72.32.245.136 - 72.32.246.143 us -72.32.246.144 - 72.32.246.151 ca -72.32.246.152 - 72.32.246.201 us -72.32.246.202 - 72.32.246.203 gb -72.32.246.204 - 72.32.247.71 us -72.32.247.72 - 72.32.247.79 in -72.32.247.80 - 72.32.250.143 us -72.32.250.144 - 72.32.250.151 my -72.32.250.152 - 72.32.250.191 us -72.32.250.192 - 72.32.250.199 mx -72.32.250.200 - 72.32.251.31 us -72.32.251.32 - 72.32.251.39 in -72.32.251.40 - 72.32.251.63 us -72.32.251.64 - 72.32.251.79 au -72.32.251.80 - 72.32.251.119 us -72.32.251.120 - 72.32.251.127 br -72.32.251.128 - 72.32.254.159 us -72.32.254.160 - 72.32.254.175 mo -72.32.254.176 - 72.32.255.47 us -72.32.255.48 - 72.32.255.55 ca -72.32.255.56 - 72.32.255.79 us -72.32.255.80 - 72.32.255.87 mx -72.32.255.88 - 72.34.255.255 us -72.35.0.0 - 72.35.5.111 ca -72.35.5.112 - 72.35.5.127 nz -72.35.5.128 - 72.35.31.255 ca -72.35.32.0 - 72.36.156.255 us -72.36.157.0 - 72.36.157.255 es -72.36.158.0 - 72.36.186.191 us -72.36.186.192 - 72.36.186.255 gb -72.36.187.0 - 72.37.131.255 us -72.37.132.0 - 72.37.132.31 sg -72.37.132.32 - 72.37.166.159 us -72.37.166.160 - 72.37.166.191 jp -72.37.166.192 - 72.37.255.255 us -72.38.0.0 - 72.38.73.143 ca -72.38.73.144 - 72.38.73.159 us -72.38.73.160 - 72.39.255.255 ca -72.40.0.0 - 72.44.70.151 us -72.44.70.152 - 72.44.70.159 gb -72.44.70.160 - 72.44.74.111 us -72.44.74.112 - 72.44.74.119 gb -72.44.74.120 - 72.44.86.110 us -72.44.86.111 - 72.44.86.118 my -72.44.86.119 - 72.44.91.3 us -72.44.91.4 - 72.44.91.11 cl -72.44.91.12 - 72.45.63.255 us +72.29.29.0 - 72.29.223.255 us +72.29.224.0 - 72.29.255.255 ca +72.30.0.0 - 72.35.6.87 us +72.35.6.88 - 72.35.6.95 ca +72.35.6.96 - 72.35.10.255 us +72.35.11.0 - 72.35.11.255 ca +72.35.12.0 - 72.35.16.255 us +72.35.17.0 - 72.35.17.255 ca +72.35.18.0 - 72.35.25.255 us +72.35.26.0 - 72.35.26.255 ca +72.35.27.0 - 72.35.239.255 us +72.35.240.0 - 72.35.240.255 gb +72.35.241.0 - 72.35.243.255 us +72.35.244.0 - 72.35.244.255 gb +72.35.245.0 - 72.35.245.255 us +72.35.246.0 - 72.35.246.255 nl +72.35.247.0 - 72.35.247.255 us +72.35.248.0 - 72.35.251.255 id +72.35.252.0 - 72.37.139.255 us +72.37.140.0 - 72.37.140.255 it +72.37.141.0 - 72.37.144.255 us +72.37.145.0 - 72.37.145.47 ca +72.37.145.48 - 72.37.255.255 us +72.38.0.0 - 72.39.255.255 ca +72.40.0.0 - 72.45.63.255 us 72.45.64.0 - 72.45.127.255 ca -72.45.128.0 - 72.46.223.255 us -72.46.224.0 - 72.46.224.255 bb -72.46.225.0 - 72.46.226.159 us -72.46.226.160 - 72.46.226.191 ve -72.46.226.192 - 72.46.226.207 us +72.45.128.0 - 72.46.226.207 us 72.46.226.208 - 72.46.226.223 do 72.46.226.224 - 72.46.229.255 us 72.46.230.0 - 72.46.231.255 co -72.46.232.0 - 72.46.239.255 us -72.46.240.0 - 72.46.240.15 pr -72.46.240.16 - 72.46.240.63 us +72.46.232.0 - 72.46.240.63 us 72.46.240.64 - 72.46.240.127 ca -72.46.240.128 - 72.46.240.143 us -72.46.240.144 - 72.46.240.159 cr -72.46.240.160 - 72.46.240.175 us -72.46.240.176 - 72.46.240.191 ch -72.46.240.192 - 72.46.241.127 us -72.46.241.128 - 72.46.241.191 ec -72.46.241.192 - 72.46.244.31 us -72.46.244.32 - 72.46.244.47 bo -72.46.244.48 - 72.46.244.63 us -72.46.244.64 - 72.46.244.79 gt -72.46.244.80 - 72.46.245.63 us -72.46.245.64 - 72.46.245.127 br -72.46.245.128 - 72.46.245.207 us -72.46.245.208 - 72.46.245.223 gb -72.46.245.224 - 72.46.245.255 do -72.46.246.0 - 72.46.247.79 us -72.46.247.80 - 72.46.247.95 uy -72.46.247.96 - 72.46.247.239 us -72.46.247.240 - 72.46.247.255 ar -72.46.248.0 - 72.46.249.31 us -72.46.249.32 - 72.46.249.47 cr -72.46.249.48 - 72.46.249.55 bb -72.46.249.56 - 72.46.249.59 tt -72.46.249.60 - 72.46.249.111 us -72.46.249.112 - 72.46.249.127 tt -72.46.249.128 - 72.46.251.255 us +72.46.240.128 - 72.46.251.255 us 72.46.252.0 - 72.46.252.255 cy -72.46.253.0 - 72.46.253.31 us -72.46.253.32 - 72.46.253.47 vg -72.46.253.48 - 72.46.253.111 us -72.46.253.112 - 72.46.253.127 ru -72.46.253.128 - 72.46.255.15 us -72.46.255.16 - 72.46.255.31 a2 -72.46.255.32 - 72.46.255.159 us -72.46.255.160 - 72.46.255.175 ar -72.46.255.176 - 72.46.255.191 us -72.46.255.192 - 72.46.255.207 br -72.46.255.208 - 72.49.255.255 us +72.46.253.0 - 72.49.255.255 us 72.50.0.0 - 72.50.127.255 pr -72.50.128.0 - 72.51.7.255 us -72.51.8.0 - 72.51.8.223 ca -72.51.8.224 - 72.51.9.31 us -72.51.9.32 - 72.51.9.63 ca -72.51.9.64 - 72.51.9.95 us -72.51.9.96 - 72.51.9.127 ca -72.51.9.128 - 72.51.9.159 nl -72.51.9.160 - 72.51.10.255 ca -72.51.11.0 - 72.51.11.63 gb -72.51.11.64 - 72.51.11.127 us -72.51.11.128 - 72.51.11.255 ca -72.51.12.0 - 72.51.15.255 us -72.51.16.0 - 72.51.16.127 nl -72.51.16.128 - 72.51.18.255 us -72.51.19.0 - 72.51.19.127 ca -72.51.19.128 - 72.51.24.135 us +72.50.128.0 - 72.51.6.255 us +72.51.7.0 - 72.51.7.255 ca +72.51.8.0 - 72.51.9.31 us +72.51.9.32 - 72.51.9.47 ca +72.51.9.48 - 72.51.9.255 us +72.51.10.0 - 72.51.10.255 ca +72.51.11.0 - 72.51.19.31 us +72.51.19.32 - 72.51.19.127 ca +72.51.19.128 - 72.51.23.255 us +72.51.24.0 - 72.51.24.127 ca +72.51.24.128 - 72.51.24.135 us 72.51.24.136 - 72.51.24.143 ca -72.51.24.144 - 72.51.24.159 bv -72.51.24.160 - 72.51.25.255 ca -72.51.26.0 - 72.51.26.15 kn -72.51.26.16 - 72.51.26.63 ca -72.51.26.64 - 72.51.26.71 us -72.51.26.72 - 72.51.26.79 ca -72.51.26.80 - 72.51.26.95 us -72.51.26.96 - 72.51.26.111 mx -72.51.26.112 - 72.51.26.127 gb -72.51.26.128 - 72.51.26.159 ca -72.51.26.160 - 72.51.26.175 vg -72.51.26.176 - 72.51.26.191 ca -72.51.26.192 - 72.51.26.207 bv -72.51.26.208 - 72.51.26.223 ca -72.51.26.224 - 72.51.26.239 us -72.51.26.240 - 72.51.31.255 ca -72.51.32.0 - 72.51.33.68 us -72.51.33.69 - 72.51.33.69 in -72.51.33.70 - 72.51.35.103 us -72.51.35.104 - 72.51.35.104 in -72.51.35.105 - 72.51.37.18 us -72.51.37.19 - 72.51.37.19 in -72.51.37.20 - 72.51.37.34 us -72.51.37.35 - 72.51.37.35 in -72.51.37.36 - 72.51.39.11 us -72.51.39.12 - 72.51.39.12 in -72.51.39.13 - 72.51.39.91 us -72.51.39.92 - 72.51.39.92 in -72.51.39.93 - 72.51.41.185 us -72.51.41.186 - 72.51.41.186 in -72.51.41.187 - 72.51.44.67 us -72.51.44.68 - 72.51.44.79 in -72.51.44.80 - 72.51.44.159 us -72.51.44.160 - 72.51.44.163 in -72.51.44.164 - 72.51.45.23 us -72.51.45.24 - 72.51.45.31 in -72.51.45.32 - 72.51.45.159 us -72.51.45.160 - 72.51.45.171 in -72.51.45.172 - 72.51.48.207 us -72.51.48.208 - 72.51.48.223 ca -72.51.48.224 - 72.51.48.239 us -72.51.48.240 - 72.51.48.247 ca -72.51.48.248 - 72.51.49.207 us -72.51.49.208 - 72.51.49.239 ca -72.51.49.240 - 72.51.50.175 us -72.51.50.176 - 72.51.50.191 ca -72.51.50.192 - 72.51.56.255 us +72.51.24.144 - 72.51.24.255 us +72.51.25.0 - 72.51.25.255 ca +72.51.26.0 - 72.51.26.175 us +72.51.26.176 - 72.51.26.183 ca +72.51.26.184 - 72.51.26.255 us +72.51.27.0 - 72.51.31.255 ca +72.51.32.0 - 72.51.56.255 us 72.51.57.0 - 72.51.58.255 ca 72.51.59.0 - 72.51.60.255 us 72.51.61.0 - 72.51.61.255 ca @@ -32080,152 +17375,84 @@ 72.51.122.0 - 72.51.123.255 vc 72.51.124.0 - 72.51.124.255 gd 72.51.125.0 - 72.51.127.255 vg -72.51.128.0 - 72.52.0.63 us -72.52.0.64 - 72.52.0.71 gb -72.52.0.72 - 72.52.0.79 us -72.52.0.80 - 72.52.0.95 ch -72.52.0.96 - 72.52.0.191 us -72.52.0.192 - 72.52.0.255 gb -72.52.1.0 - 72.52.1.255 us +72.51.128.0 - 72.52.1.255 us 72.52.2.0 - 72.52.2.255 ca 72.52.3.0 - 72.52.3.255 ee -72.52.4.0 - 72.52.65.215 us -72.52.65.216 - 72.52.65.223 gb -72.52.65.224 - 72.52.66.7 us -72.52.66.8 - 72.52.66.15 a1 -72.52.66.16 - 72.52.80.79 us -72.52.80.80 - 72.52.80.95 ae -72.52.80.96 - 72.52.80.255 us -72.52.81.0 - 72.52.81.127 a1 -72.52.81.128 - 72.52.82.255 us -72.52.83.0 - 72.52.83.15 it -72.52.83.16 - 72.52.93.223 us -72.52.93.224 - 72.52.93.255 cn -72.52.94.0 - 72.52.94.223 us -72.52.94.224 - 72.52.94.231 cn -72.52.94.232 - 72.52.94.239 us -72.52.94.240 - 72.52.94.247 cn -72.52.94.248 - 72.52.94.255 us -72.52.95.0 - 72.52.95.255 it -72.52.96.0 - 72.52.98.79 us -72.52.98.80 - 72.52.98.95 it -72.52.98.96 - 72.52.98.127 gb -72.52.98.128 - 72.52.99.15 us -72.52.99.16 - 72.52.99.31 it -72.52.99.32 - 72.52.100.255 us -72.52.101.0 - 72.52.101.31 au -72.52.101.32 - 72.52.101.47 it -72.52.101.48 - 72.52.104.15 us -72.52.104.16 - 72.52.104.31 es -72.52.104.32 - 72.52.106.191 us -72.52.106.192 - 72.52.107.255 it -72.52.108.0 - 72.52.144.133 us -72.52.144.134 - 72.52.144.134 ca -72.52.144.135 - 72.52.155.189 us -72.52.155.190 - 72.52.155.229 mx -72.52.155.230 - 72.52.178.255 us -72.52.179.0 - 72.52.179.255 ca -72.52.180.0 - 72.52.203.97 us -72.52.203.98 - 72.52.203.105 ca -72.52.203.106 - 72.52.212.43 us -72.52.212.44 - 72.52.212.44 ca -72.52.212.45 - 72.52.255.255 us +72.52.4.0 - 72.52.92.5 us +72.52.92.6 - 72.52.92.6 de +72.52.92.7 - 72.52.92.13 us +72.52.92.14 - 72.52.92.14 de +72.52.92.15 - 72.52.92.240 us +72.52.92.241 - 72.52.92.241 it +72.52.92.242 - 72.52.255.255 us 72.53.0.0 - 72.53.159.255 ca 72.53.160.0 - 72.55.127.255 us -72.55.128.0 - 72.55.191.255 ca +72.55.128.0 - 72.55.163.239 ca +72.55.163.240 - 72.55.163.243 us +72.55.163.244 - 72.55.191.255 ca 72.55.192.0 - 72.135.255.255 us 72.136.0.0 - 72.143.255.255 ca -72.144.0.0 - 72.164.95.31 us -72.164.95.32 - 72.164.95.39 a2 -72.164.95.40 - 72.165.19.255 us -72.165.20.0 - 72.165.20.255 sg -72.165.21.0 - 72.166.57.127 us -72.166.57.128 - 72.166.57.159 pr -72.166.57.160 - 72.172.83.127 us -72.172.83.128 - 72.172.83.143 in -72.172.83.144 - 72.172.84.71 us -72.172.84.72 - 72.172.84.79 ca -72.172.84.80 - 72.172.95.255 us +72.144.0.0 - 72.163.215.255 us +72.163.216.0 - 72.163.217.255 in +72.163.218.0 - 72.163.219.255 us +72.163.220.0 - 72.163.220.255 in +72.163.221.0 - 72.168.68.255 us +72.168.69.0 - 72.168.69.255 ca +72.168.70.0 - 72.172.95.255 us 72.172.96.0 - 72.172.127.255 ca 72.172.128.0 - 72.172.159.255 us 72.172.160.0 - 72.172.175.255 ca -72.172.176.0 - 72.172.229.255 us -72.172.230.0 - 72.172.230.127 au -72.172.230.128 - 72.172.248.63 us -72.172.248.64 - 72.172.248.127 gr -72.172.248.128 - 72.232.72.151 us -72.232.72.152 - 72.232.73.62 es -72.232.73.63 - 72.232.129.255 us -72.232.130.0 - 72.232.130.255 es -72.232.131.0 - 72.232.139.255 us -72.232.140.0 - 72.232.140.255 gb -72.232.141.0 - 72.232.153.255 us -72.232.154.0 - 72.232.154.255 es -72.232.155.0 - 72.232.173.255 us -72.232.174.0 - 72.232.174.255 es -72.232.175.0 - 72.232.175.63 us -72.232.175.64 - 72.232.175.255 es -72.232.176.0 - 72.232.230.127 us -72.232.230.128 - 72.232.230.255 br -72.232.231.0 - 72.233.17.255 us -72.233.18.0 - 72.233.18.255 es -72.233.19.0 - 72.233.37.255 us -72.233.38.0 - 72.233.38.127 es -72.233.38.128 - 72.233.57.127 us -72.233.57.128 - 72.233.57.191 br -72.233.57.192 - 72.233.109.255 us -72.233.110.0 - 72.233.110.127 mx -72.233.110.128 - 72.248.255.255 us -72.249.0.0 - 72.249.0.7 gb -72.249.0.8 - 72.249.0.95 us -72.249.0.96 - 72.249.0.127 my -72.249.0.128 - 72.249.0.167 us -72.249.0.168 - 72.249.0.175 ca -72.249.0.176 - 72.249.1.87 us -72.249.1.88 - 72.249.1.95 gb -72.249.1.96 - 72.249.2.71 us -72.249.2.72 - 72.249.2.79 au -72.249.2.80 - 72.249.3.31 us -72.249.3.32 - 72.249.3.39 ch -72.249.3.40 - 72.249.33.255 us -72.249.34.0 - 72.249.34.255 ca -72.249.35.0 - 72.249.49.255 us -72.249.50.0 - 72.249.50.255 ca -72.249.51.0 - 72.249.54.255 us -72.249.55.0 - 72.249.55.255 ca -72.249.56.0 - 72.249.67.255 us -72.249.68.0 - 72.249.68.255 vn -72.249.69.0 - 72.249.71.255 us -72.249.72.0 - 72.249.73.255 ca -72.249.74.0 - 72.249.83.255 us -72.249.84.0 - 72.249.84.255 ca -72.249.85.0 - 72.249.98.255 us -72.249.99.0 - 72.249.99.7 ca -72.249.99.8 - 72.249.129.23 us -72.249.129.24 - 72.249.129.31 mx -72.249.129.32 - 72.249.129.207 us -72.249.129.208 - 72.249.129.215 ca -72.249.129.216 - 72.249.131.255 us -72.249.132.0 - 72.249.133.255 ca -72.249.134.0 - 72.249.134.7 gb -72.249.134.8 - 72.249.136.79 us -72.249.136.80 - 72.249.136.95 au -72.249.136.96 - 72.249.140.191 us -72.249.140.192 - 72.249.140.223 gb -72.249.140.224 - 72.249.143.63 us -72.249.143.64 - 72.249.143.127 pa -72.249.143.128 - 72.249.153.255 us -72.249.154.0 - 72.249.154.255 ca -72.249.155.0 - 72.249.156.255 us -72.249.157.0 - 72.249.157.255 ca -72.249.158.0 - 72.249.167.255 us -72.249.168.0 - 72.249.169.255 ca -72.249.170.0 - 72.249.173.255 us -72.249.174.0 - 72.249.175.255 gb -72.249.176.0 - 72.251.255.255 us +72.172.176.0 - 72.246.40.255 us +72.246.41.0 - 72.246.41.255 nl +72.246.42.0 - 72.246.45.255 us +72.246.46.0 - 72.246.46.255 nl +72.246.47.0 - 72.246.50.255 us +72.246.51.0 - 72.246.51.255 nl +72.246.52.0 - 72.246.52.255 us +72.246.53.0 - 72.246.54.255 nl +72.246.55.0 - 72.246.69.255 us +72.246.70.0 - 72.246.71.255 nl +72.246.72.0 - 72.246.98.255 us +72.246.99.0 - 72.246.101.255 nl +72.246.102.0 - 72.246.167.255 us +72.246.168.0 - 72.246.175.255 nl +72.246.176.0 - 72.247.15.255 us +72.247.16.0 - 72.247.21.255 nl +72.247.22.0 - 72.247.95.255 us +72.247.96.0 - 72.247.103.255 nl +72.247.104.0 - 72.247.144.255 us +72.247.145.0 - 72.247.145.255 nl +72.247.146.0 - 72.247.167.255 us +72.247.168.0 - 72.247.175.255 nl +72.247.176.0 - 72.247.191.255 us +72.247.192.0 - 72.247.193.255 nl +72.247.194.0 - 72.247.195.255 us +72.247.196.0 - 72.247.199.255 nl +72.247.200.0 - 72.247.207.255 us +72.247.208.0 - 72.247.210.255 nl +72.247.211.0 - 72.247.211.255 us +72.247.212.0 - 72.247.215.255 nl +72.247.216.0 - 72.247.235.255 us +72.247.236.0 - 72.247.237.255 nl +72.247.238.0 - 72.247.247.255 us +72.247.248.0 - 72.247.255.255 nl +72.248.0.0 - 72.251.239.255 us +72.251.240.0 - 72.251.244.15 nl +72.251.244.16 - 72.251.244.16 ru +72.251.244.17 - 72.251.251.255 nl +72.251.252.0 - 72.251.255.255 us 72.252.0.0 - 72.252.3.255 gt -72.252.4.0 - 72.252.7.255 us -72.252.8.0 - 72.252.15.255 an +72.252.4.0 - 72.252.4.255 pr +72.252.5.0 - 72.252.7.255 us +72.252.8.0 - 72.252.8.255 sx +72.252.9.0 - 72.252.9.47 us +72.252.9.48 - 72.252.9.49 sx +72.252.9.50 - 72.252.9.255 us +72.252.10.0 - 72.252.10.255 sx +72.252.11.0 - 72.252.11.255 us +72.252.12.0 - 72.252.13.255 sx +72.252.14.0 - 72.252.14.255 us +72.252.15.0 - 72.252.15.255 sx 72.252.16.0 - 72.252.23.255 us 72.252.24.0 - 72.252.39.255 jm 72.252.40.0 - 72.252.71.255 gt @@ -32233,15 +17460,11 @@ 72.252.88.0 - 72.252.103.255 gt 72.252.104.0 - 72.252.112.255 jm 72.252.113.0 - 72.252.113.255 bs -72.252.114.0 - 72.252.191.0 jm -72.252.191.1 - 72.252.191.255 us +72.252.114.0 - 72.252.190.255 jm +72.252.191.0 - 72.252.191.255 us 72.252.192.0 - 72.252.199.0 jm 72.252.199.1 - 72.252.199.255 us -72.252.200.0 - 72.252.207.0 jm -72.252.207.1 - 72.252.207.255 us -72.252.208.0 - 72.252.215.0 jm -72.252.215.1 - 72.252.215.255 us -72.252.216.0 - 72.252.255.0 jm +72.252.200.0 - 72.252.255.0 jm 72.252.255.1 - 74.3.127.255 us 74.3.128.0 - 74.3.191.255 ca 74.3.192.0 - 74.11.255.255 us @@ -32254,159 +17477,46 @@ 74.50.224.0 - 74.50.239.255 ca 74.50.240.0 - 74.51.31.255 us 74.51.32.0 - 74.51.63.255 ca -74.51.64.0 - 74.53.36.47 us -74.53.36.48 - 74.53.36.55 ch -74.53.36.56 - 74.55.101.255 us +74.51.64.0 - 74.55.101.255 us 74.55.102.0 - 74.55.102.255 ch -74.55.103.0 - 74.55.194.87 us -74.55.194.88 - 74.55.194.91 ch -74.55.194.92 - 74.55.213.223 us -74.55.213.224 - 74.55.213.231 ch -74.55.213.232 - 74.55.255.255 us +74.55.103.0 - 74.55.255.255 us 74.56.0.0 - 74.59.255.255 ca -74.60.0.0 - 74.81.166.3 us -74.81.166.4 - 74.81.166.62 eg -74.81.166.63 - 74.81.194.5 us -74.81.194.6 - 74.81.194.17 gb -74.81.194.18 - 74.81.202.15 us -74.81.202.16 - 74.81.202.104 gb -74.81.202.105 - 74.81.202.178 us -74.81.202.179 - 74.81.202.192 ca -74.81.202.193 - 74.81.203.0 us -74.81.203.1 - 74.81.203.128 gb -74.81.203.129 - 74.81.203.190 us -74.81.203.191 - 74.81.203.222 gb -74.81.203.223 - 74.81.207.117 us -74.81.207.118 - 74.81.207.128 nl -74.81.207.129 - 74.81.209.0 us -74.81.209.1 - 74.81.209.25 ca -74.81.209.26 - 74.82.57.255 us +74.60.0.0 - 74.82.9.191 us +74.82.9.192 - 74.82.9.223 ca +74.82.9.224 - 74.82.9.224 a1 +74.82.9.225 - 74.82.9.255 ca +74.82.10.0 - 74.82.57.255 us 74.82.58.0 - 74.82.58.255 nl -74.82.59.0 - 74.82.191.255 us -74.82.192.0 - 74.82.195.255 ca -74.82.196.0 - 74.82.196.15 us -74.82.196.16 - 74.82.203.255 ca -74.82.204.0 - 74.82.204.255 gb -74.82.205.0 - 74.82.216.55 ca -74.82.216.56 - 74.82.216.63 de -74.82.216.64 - 74.82.223.255 ca +74.82.59.0 - 74.82.64.255 us +74.82.65.0 - 74.82.67.255 ca +74.82.68.0 - 74.82.68.255 us +74.82.69.0 - 74.82.95.255 ca +74.82.96.0 - 74.82.138.255 us +74.82.139.0 - 74.82.139.255 au +74.82.140.0 - 74.82.191.255 us +74.82.192.0 - 74.82.223.255 ca 74.82.224.0 - 74.84.31.255 us -74.84.32.0 - 74.84.60.191 a2 -74.84.60.192 - 74.84.60.207 us -74.84.60.208 - 74.84.63.255 a2 -74.84.64.0 - 74.84.196.119 us -74.84.196.120 - 74.84.196.127 va -74.84.196.128 - 74.84.202.95 us -74.84.202.96 - 74.84.202.111 ca -74.84.202.112 - 74.84.209.207 us -74.84.209.208 - 74.84.209.223 nl -74.84.209.224 - 74.91.15.255 us -74.91.16.0 - 74.91.16.7 cn -74.91.16.8 - 74.91.16.15 co -74.91.16.16 - 74.91.16.23 tr -74.91.16.24 - 74.91.16.31 us -74.91.16.32 - 74.91.16.47 cn -74.91.16.48 - 74.91.16.55 bo -74.91.16.56 - 74.91.16.71 cn -74.91.16.72 - 74.91.16.95 us -74.91.16.96 - 74.91.16.111 cn -74.91.16.112 - 74.91.16.127 us -74.91.16.128 - 74.91.16.159 gb -74.91.16.160 - 74.91.16.191 cn -74.91.16.192 - 74.91.16.207 ca -74.91.16.208 - 74.91.16.215 bo -74.91.16.216 - 74.91.16.223 us -74.91.16.224 - 74.91.17.63 cn -74.91.17.64 - 74.91.17.127 us -74.91.17.128 - 74.91.17.143 gb -74.91.17.144 - 74.91.17.207 cn -74.91.17.208 - 74.91.17.223 us -74.91.17.224 - 74.91.17.239 cn -74.91.17.240 - 74.91.17.255 us -74.91.18.0 - 74.91.18.15 gb -74.91.18.16 - 74.91.18.175 cn -74.91.18.176 - 74.91.18.183 us -74.91.18.184 - 74.91.18.191 cn -74.91.18.192 - 74.91.18.199 us -74.91.18.200 - 74.91.18.215 cn -74.91.18.216 - 74.91.18.239 us -74.91.18.240 - 74.91.18.255 cn -74.91.19.0 - 74.91.19.63 us -74.91.19.64 - 74.91.19.127 ca -74.91.19.128 - 74.91.19.191 us -74.91.19.192 - 74.91.19.255 cn -74.91.20.0 - 74.91.20.47 us -74.91.20.48 - 74.91.20.71 bo -74.91.20.72 - 74.91.20.87 us -74.91.20.88 - 74.91.20.95 cn -74.91.20.96 - 74.91.20.135 us -74.91.20.136 - 74.91.20.159 cn -74.91.20.160 - 74.91.20.167 ca -74.91.20.168 - 74.91.20.199 us -74.91.20.200 - 74.91.20.215 cn -74.91.20.216 - 74.91.20.231 us -74.91.20.232 - 74.91.20.239 cn -74.91.20.240 - 74.91.22.255 us -74.91.23.0 - 74.91.24.47 cn -74.91.24.48 - 74.91.24.63 us -74.91.24.64 - 74.91.24.127 cn -74.91.24.128 - 74.91.24.143 us -74.91.24.144 - 74.91.25.127 cn -74.91.25.128 - 74.91.25.159 us -74.91.25.160 - 74.91.26.127 cn -74.91.26.128 - 74.91.26.135 us -74.91.26.136 - 74.91.26.143 cn -74.91.26.144 - 74.91.26.151 us -74.91.26.152 - 74.91.26.255 cn -74.91.27.0 - 74.91.27.255 us -74.91.28.0 - 74.91.29.7 cn -74.91.29.8 - 74.91.29.47 us -74.91.29.48 - 74.91.29.79 cn -74.91.29.80 - 74.91.29.255 us -74.91.30.0 - 74.91.30.31 cn -74.91.30.32 - 74.91.30.39 us -74.91.30.40 - 74.91.30.63 cn -74.91.30.64 - 74.91.30.71 us -74.91.30.72 - 74.91.30.103 cn -74.91.30.104 - 74.91.30.175 us -74.91.30.176 - 74.91.30.183 cn -74.91.30.184 - 74.91.30.191 us -74.91.30.192 - 74.91.30.199 cn -74.91.30.200 - 74.91.30.207 us -74.91.30.208 - 74.91.31.255 cn -74.91.32.0 - 74.112.39.255 us +74.84.32.0 - 74.84.63.255 a2 +74.84.64.0 - 74.84.213.255 us +74.84.214.0 - 74.84.215.255 a2 +74.84.216.0 - 74.85.65.255 us +74.85.66.0 - 74.85.66.255 ca +74.85.67.0 - 74.85.175.255 us +74.85.176.0 - 74.85.191.255 nl +74.85.192.0 - 74.112.39.255 us 74.112.40.0 - 74.112.47.255 ca 74.112.48.0 - 74.112.123.255 us 74.112.124.0 - 74.112.127.255 ca -74.112.128.0 - 74.112.132.63 us -74.112.132.64 - 74.112.132.95 gb -74.112.132.96 - 74.112.132.127 us -74.112.132.128 - 74.112.132.135 ca -74.112.132.136 - 74.112.132.247 us -74.112.132.248 - 74.112.132.255 br -74.112.133.0 - 74.112.135.55 us -74.112.135.56 - 74.112.135.63 ca -74.112.135.64 - 74.112.135.95 us -74.112.135.96 - 74.112.135.103 gb -74.112.135.104 - 74.112.135.111 bo -74.112.135.112 - 74.112.135.127 us -74.112.135.128 - 74.112.135.135 br -74.112.135.136 - 74.112.168.239 us -74.112.168.240 - 74.112.168.247 fr -74.112.168.248 - 74.112.175.255 us +74.112.128.0 - 74.112.175.255 us 74.112.176.0 - 74.112.179.255 ca 74.112.180.0 - 74.112.187.255 us 74.112.188.0 - 74.112.191.255 ca -74.112.192.0 - 74.112.194.15 us -74.112.194.16 - 74.112.194.31 za -74.112.194.32 - 74.112.194.95 us -74.112.194.96 - 74.112.194.111 fr -74.112.194.112 - 74.112.231.255 us +74.112.192.0 - 74.112.231.255 us 74.112.232.0 - 74.112.239.255 mf 74.112.240.0 - 74.112.255.255 us 74.113.0.0 - 74.113.3.255 ca 74.113.4.0 - 74.113.7.255 us -74.113.8.0 - 74.113.15.255 ca +74.113.12.0 - 74.113.15.255 ca 74.113.16.0 - 74.113.67.255 us 74.113.68.0 - 74.113.75.255 ca 74.113.76.0 - 74.113.103.255 us @@ -32421,100 +17531,44 @@ 74.114.100.0 - 74.114.103.255 ca 74.114.104.0 - 74.114.135.255 us 74.114.136.0 - 74.114.139.255 ca -74.114.140.0 - 74.114.161.119 us -74.114.161.120 - 74.114.161.127 ca -74.114.161.128 - 74.114.161.151 us -74.114.161.152 - 74.114.161.159 es -74.114.161.160 - 74.114.162.143 us -74.114.162.144 - 74.114.162.151 za -74.114.162.152 - 74.114.162.159 ca -74.114.162.160 - 74.114.162.207 us -74.114.162.208 - 74.114.162.215 ca -74.114.162.216 - 74.114.162.223 mx -74.114.162.224 - 74.114.164.55 us -74.114.164.56 - 74.114.164.63 za -74.114.164.64 - 74.114.164.71 au -74.114.164.72 - 74.114.164.103 us -74.114.164.104 - 74.114.164.111 in -74.114.164.112 - 74.114.164.199 us -74.114.164.200 - 74.114.164.207 gb -74.114.164.208 - 74.114.165.63 us -74.114.165.64 - 74.114.165.79 ph -74.114.165.80 - 74.114.165.175 us -74.114.165.176 - 74.114.165.191 ca -74.114.165.192 - 74.114.165.223 us -74.114.165.224 - 74.114.165.231 ca -74.114.165.232 - 74.114.166.63 us -74.114.166.64 - 74.114.166.71 gb -74.114.166.72 - 74.114.166.135 us -74.114.166.136 - 74.114.166.143 gr -74.114.166.144 - 74.114.166.239 us -74.114.166.240 - 74.114.166.255 ca -74.114.167.0 - 74.114.167.55 us -74.114.167.56 - 74.114.167.63 pl -74.114.167.64 - 74.114.167.79 us -74.114.167.80 - 74.114.167.95 au -74.114.167.96 - 74.114.171.255 us +74.114.140.0 - 74.114.171.255 us 74.114.172.0 - 74.114.175.255 ca 74.114.176.0 - 74.114.199.255 us 74.114.200.0 - 74.114.203.255 tc -74.114.204.0 - 74.114.204.31 us -74.114.204.32 - 74.114.204.47 ca -74.114.204.48 - 74.114.207.255 us +74.114.204.0 - 74.114.207.255 us 74.114.208.0 - 74.114.215.255 ca 74.114.216.0 - 74.114.239.255 us 74.114.240.0 - 74.114.243.255 bm 74.114.244.0 - 74.114.255.255 us 74.115.0.0 - 74.115.7.255 a1 -74.115.8.0 - 74.115.123.255 us -74.115.124.0 - 74.115.127.255 ca -74.115.128.0 - 74.115.159.255 us +74.115.8.0 - 74.115.33.255 us +74.115.34.0 - 74.115.35.255 ca +74.115.36.0 - 74.115.159.255 us 74.115.160.0 - 74.115.163.255 a1 74.115.164.0 - 74.115.191.255 us 74.115.192.0 - 74.115.199.255 ca 74.115.200.0 - 74.115.203.255 pr 74.115.204.0 - 74.115.204.255 us 74.115.205.0 - 74.115.207.255 ca -74.115.208.0 - 74.115.208.15 tw -74.115.208.16 - 74.115.208.79 us -74.115.208.80 - 74.115.208.95 tw -74.115.208.96 - 74.115.208.223 us -74.115.208.224 - 74.115.208.239 tw -74.115.208.240 - 74.115.209.223 us -74.115.209.224 - 74.115.209.239 au -74.115.209.240 - 74.115.210.159 us -74.115.210.160 - 74.115.210.167 es -74.115.210.168 - 74.115.210.191 us -74.115.210.192 - 74.115.210.223 es -74.115.210.224 - 74.115.212.223 us -74.115.212.224 - 74.115.212.231 ar -74.115.212.232 - 74.115.212.239 us -74.115.212.240 - 74.115.212.247 ch -74.115.212.248 - 74.115.213.127 us -74.115.213.128 - 74.115.213.143 ca -74.115.213.144 - 74.115.213.215 us -74.115.213.216 - 74.115.213.223 es -74.115.213.224 - 74.115.214.127 us -74.115.214.128 - 74.115.214.159 es -74.115.214.160 - 74.115.214.191 ca -74.115.214.192 - 74.115.219.255 us +74.115.208.0 - 74.115.219.255 us 74.115.220.0 - 74.115.223.255 ca 74.115.224.0 - 74.116.55.255 us 74.116.56.0 - 74.116.59.255 jm 74.116.60.0 - 74.116.91.255 us -74.116.92.0 - 74.116.94.255 gp -74.116.95.0 - 74.116.95.255 mf -74.116.96.0 - 74.116.183.255 us -74.116.184.0 - 74.116.199.255 ca -74.116.200.0 - 74.116.215.255 us +74.116.92.0 - 74.116.94.44 mf +74.116.94.45 - 74.116.94.45 fr +74.116.94.46 - 74.116.95.255 mf +74.116.96.0 - 74.116.100.255 us +74.116.101.0 - 74.116.101.255 gb +74.116.102.0 - 74.116.119.255 us +74.116.120.0 - 74.116.123.255 ca +74.116.124.0 - 74.116.183.255 us +74.116.184.0 - 74.116.191.255 ca +74.116.192.0 - 74.116.193.255 us +74.116.194.0 - 74.116.195.255 ca +74.116.196.0 - 74.116.215.255 us 74.116.216.0 - 74.116.223.255 ca -74.116.224.0 - 74.116.248.183 us -74.116.248.184 - 74.116.248.191 ca -74.116.248.192 - 74.116.249.63 us -74.116.249.64 - 74.116.249.79 se -74.116.249.80 - 74.116.249.127 us -74.116.249.128 - 74.116.249.191 tw -74.116.249.192 - 74.117.39.255 us +74.116.224.0 - 74.117.39.255 us 74.117.40.0 - 74.117.47.255 ca 74.117.48.0 - 74.117.51.255 us 74.117.52.0 - 74.117.55.255 ca @@ -32524,105 +17578,52 @@ 74.117.112.0 - 74.117.119.255 ky 74.117.120.0 - 74.117.139.255 us 74.117.140.0 - 74.117.143.255 ca -74.117.144.0 - 74.117.156.255 us -74.117.157.0 - 74.117.159.255 ro -74.117.160.0 - 74.117.176.255 us -74.117.177.0 - 74.117.177.63 cy -74.117.177.64 - 74.117.177.127 vg -74.117.177.128 - 74.117.177.159 us -74.117.177.160 - 74.117.177.191 vg -74.117.177.192 - 74.117.177.255 hk +74.117.144.0 - 74.117.177.255 us 74.117.178.0 - 74.117.178.255 vg -74.117.179.0 - 74.117.180.255 us -74.117.181.0 - 74.117.181.31 cz -74.117.181.32 - 74.117.181.63 us -74.117.181.64 - 74.117.181.191 ua -74.117.181.192 - 74.117.181.207 cz -74.117.181.208 - 74.117.181.255 us -74.117.182.0 - 74.117.182.63 sc -74.117.182.64 - 74.117.184.207 us -74.117.184.208 - 74.117.184.208 ca -74.117.184.209 - 74.117.185.31 us -74.117.185.32 - 74.117.185.39 ca -74.117.185.40 - 74.117.185.160 us -74.117.185.161 - 74.117.185.161 ca -74.117.185.162 - 74.117.185.233 us -74.117.185.234 - 74.117.185.235 ca -74.117.185.236 - 74.117.187.23 us -74.117.187.24 - 74.117.187.31 es -74.117.187.32 - 74.117.215.255 us +74.117.179.0 - 74.117.206.255 us +74.117.207.0 - 74.117.207.255 gb +74.117.208.0 - 74.117.215.255 us 74.117.216.0 - 74.117.223.255 ky 74.117.224.0 - 74.117.247.255 us 74.117.248.0 - 74.117.255.255 ca -74.118.0.0 - 74.118.24.207 us -74.118.24.208 - 74.118.24.215 va -74.118.24.216 - 74.118.35.255 us -74.118.36.0 - 74.118.36.52 ca -74.118.36.53 - 74.118.36.94 gb -74.118.36.95 - 74.118.37.9 ca -74.118.37.10 - 74.118.37.69 us -74.118.37.70 - 74.118.37.131 ca -74.118.37.132 - 74.118.37.132 us -74.118.37.133 - 74.118.37.135 ca -74.118.37.136 - 74.118.37.164 us -74.118.37.165 - 74.118.38.28 ca -74.118.38.29 - 74.118.38.38 us -74.118.38.39 - 74.118.38.39 ca -74.118.38.40 - 74.118.38.49 lb -74.118.38.50 - 74.118.38.57 ca -74.118.38.58 - 74.118.38.82 us -74.118.38.83 - 74.118.38.92 ca -74.118.38.93 - 74.118.38.102 us -74.118.38.103 - 74.118.38.161 ca -74.118.38.162 - 74.118.38.171 lb -74.118.38.172 - 74.118.39.132 ca -74.118.39.133 - 74.118.39.196 us -74.118.39.197 - 74.118.39.221 ca -74.118.39.222 - 74.118.39.254 us -74.118.39.255 - 74.118.39.255 ca +74.118.0.0 - 74.118.35.255 us +74.118.36.0 - 74.118.39.255 ca 74.118.40.0 - 74.118.51.255 us 74.118.52.0 - 74.118.55.255 ca -74.118.56.0 - 74.118.99.255 us +74.118.56.0 - 74.118.79.255 us +74.118.80.0 - 74.118.83.255 af +74.118.84.0 - 74.118.99.255 us 74.118.100.0 - 74.118.103.255 ca 74.118.104.0 - 74.118.247.255 us 74.118.248.0 - 74.118.251.255 ca 74.118.252.0 - 74.118.255.255 us 74.119.0.0 - 74.119.3.255 ca -74.119.4.0 - 74.119.46.255 us -74.119.47.0 - 74.119.47.255 in -74.119.48.0 - 74.119.87.255 us +74.119.4.0 - 74.119.87.255 us 74.119.88.0 - 74.119.95.255 ca 74.119.96.0 - 74.119.183.255 us 74.119.184.0 - 74.119.191.255 ca -74.119.192.0 - 74.120.12.127 us -74.120.12.128 - 74.120.12.143 de -74.120.12.144 - 74.120.13.127 us -74.120.13.128 - 74.120.13.143 de -74.120.13.144 - 74.120.15.143 us -74.120.15.144 - 74.120.15.159 de -74.120.15.160 - 74.120.23.255 us +74.119.192.0 - 74.120.3.255 us +74.120.4.0 - 74.120.7.255 ca +74.120.8.0 - 74.120.19.255 us 74.120.24.0 - 74.120.31.255 pr 74.120.32.0 - 74.120.51.255 us 74.120.52.0 - 74.120.55.255 ca 74.120.56.0 - 74.120.71.255 us 74.120.72.0 - 74.120.75.255 ca -74.120.76.0 - 74.120.119.255 us +74.120.80.0 - 74.120.119.255 us 74.120.120.0 - 74.120.123.255 ca -74.120.124.0 - 74.120.240.79 us -74.120.240.80 - 74.120.240.95 br -74.120.240.96 - 74.120.241.63 us -74.120.241.64 - 74.120.241.127 an -74.120.241.128 - 74.120.241.255 us -74.120.242.0 - 74.120.242.15 an -74.120.242.16 - 74.120.242.23 us -74.120.242.24 - 74.120.242.31 fr -74.120.242.32 - 74.121.31.255 us +74.120.124.0 - 74.120.219.255 us +74.120.220.0 - 74.120.223.255 ca +74.120.224.0 - 74.121.31.255 us 74.121.32.0 - 74.121.35.255 ca -74.121.36.0 - 74.121.65.191 us -74.121.65.192 - 74.121.65.207 ca -74.121.65.208 - 74.121.119.255 us +74.121.36.0 - 74.121.119.255 us 74.121.120.0 - 74.121.123.255 ca -74.121.124.0 - 74.121.159.255 us +74.121.124.0 - 74.121.137.255 us +74.121.138.0 - 74.121.138.255 fr +74.121.139.0 - 74.121.139.255 us +74.121.140.0 - 74.121.140.255 ch +74.121.141.0 - 74.121.141.255 hk +74.121.142.0 - 74.121.159.255 us 74.121.160.0 - 74.121.167.255 ca 74.121.168.0 - 74.121.190.255 us 74.121.191.0 - 74.121.191.255 ca @@ -32634,844 +17635,197 @@ 74.122.88.0 - 74.122.95.255 gd 74.122.96.0 - 74.122.127.255 us 74.122.128.0 - 74.122.135.255 ca -74.122.136.0 - 74.122.160.31 us -74.122.160.32 - 74.122.160.39 hk -74.122.160.40 - 74.122.207.255 us +74.122.136.0 - 74.122.207.255 us 74.122.208.0 - 74.122.215.255 ca -74.122.216.0 - 74.122.230.63 us -74.122.230.64 - 74.122.230.71 nl -74.122.230.72 - 74.122.243.255 us +74.122.216.0 - 74.122.243.255 us 74.122.244.0 - 74.122.247.255 ca -74.122.248.0 - 74.123.8.127 us -74.123.8.128 - 74.123.9.16 ca -74.123.9.17 - 74.123.9.127 us -74.123.9.128 - 74.123.9.187 ca -74.123.9.188 - 74.123.9.252 us -74.123.9.253 - 74.123.10.8 ca -74.123.10.9 - 74.123.10.73 us -74.123.10.74 - 74.123.11.2 ca -74.123.11.3 - 74.123.11.66 us -74.123.11.67 - 74.123.11.255 ca +74.122.248.0 - 74.123.7.255 us +74.123.8.0 - 74.123.11.255 ca 74.123.12.0 - 74.123.67.255 us 74.123.68.0 - 74.123.71.255 ca 74.123.72.0 - 74.123.91.255 us 74.123.92.0 - 74.123.95.255 ca 74.123.96.0 - 74.123.245.255 us 74.123.246.0 - 74.123.246.255 ca -74.123.247.0 - 74.124.196.53 us -74.124.196.54 - 74.124.196.62 gb -74.124.196.63 - 74.124.196.159 us -74.124.196.160 - 74.124.196.191 au -74.124.196.192 - 74.124.201.95 us -74.124.201.96 - 74.124.201.127 ca -74.124.201.128 - 74.124.204.63 us -74.124.204.64 - 74.124.204.95 hk -74.124.204.96 - 74.124.206.79 us -74.124.206.80 - 74.124.206.87 ca -74.124.206.88 - 74.126.5.223 us -74.126.5.224 - 74.126.5.255 ca -74.126.6.0 - 74.126.95.255 us +74.123.247.0 - 74.125.16.63 us +74.125.16.64 - 74.125.16.127 cn +74.125.16.128 - 74.125.16.191 nl +74.125.16.192 - 74.125.17.255 be +74.125.18.0 - 74.125.18.255 nl +74.125.19.0 - 74.125.40.255 us +74.125.41.0 - 74.125.41.255 tw +74.125.42.0 - 74.125.45.255 us +74.125.46.0 - 74.125.46.255 fi +74.125.47.0 - 74.125.47.255 nl +74.125.48.0 - 74.125.55.255 us +74.125.56.0 - 74.125.56.19 jp +74.125.56.20 - 74.125.56.23 au +74.125.56.24 - 74.125.56.191 jp +74.125.56.192 - 74.125.56.207 in +74.125.56.208 - 74.125.56.223 au +74.125.56.224 - 74.125.56.255 jp +74.125.57.0 - 74.125.57.15 fr +74.125.57.16 - 74.125.57.23 us +74.125.57.24 - 74.125.57.31 de +74.125.57.32 - 74.125.57.47 us +74.125.57.48 - 74.125.57.55 gb +74.125.57.56 - 74.125.57.87 us +74.125.57.88 - 74.125.57.95 se +74.125.57.96 - 74.125.57.131 gb +74.125.57.132 - 74.125.57.135 us +74.125.57.136 - 74.125.57.143 nl +74.125.57.144 - 74.125.57.175 us +74.125.57.176 - 74.125.57.191 gb +74.125.57.192 - 74.125.59.255 us +74.125.60.0 - 74.125.60.7 at +74.125.60.8 - 74.125.60.15 be +74.125.60.16 - 74.125.60.23 ch +74.125.60.24 - 74.125.60.31 cz +74.125.60.32 - 74.125.60.63 de +74.125.60.64 - 74.125.60.71 es +74.125.60.72 - 74.125.60.79 fi +74.125.60.80 - 74.125.60.87 fr +74.125.60.88 - 74.125.60.95 hu +74.125.60.96 - 74.125.60.103 ie +74.125.60.104 - 74.125.60.111 it +74.125.60.112 - 74.125.60.119 nl +74.125.60.120 - 74.125.60.127 no +74.125.60.128 - 74.125.60.135 pl +74.125.60.136 - 74.125.60.143 pt +74.125.60.144 - 74.125.60.151 se +74.125.60.152 - 74.125.60.159 gb +74.125.60.160 - 74.125.60.167 ke +74.125.60.168 - 74.125.60.175 tr +74.125.60.176 - 74.125.60.183 za +74.125.60.184 - 74.125.60.191 dk +74.125.60.192 - 74.125.60.195 pl +74.125.60.196 - 74.125.60.199 us +74.125.60.200 - 74.125.60.207 gb +74.125.60.208 - 74.125.60.255 us +74.125.61.0 - 74.125.61.7 at +74.125.61.8 - 74.125.61.15 be +74.125.61.16 - 74.125.61.23 ch +74.125.61.24 - 74.125.61.31 cz +74.125.61.32 - 74.125.61.47 de +74.125.61.48 - 74.125.61.55 dk +74.125.61.56 - 74.125.61.63 es +74.125.61.64 - 74.125.61.71 fi +74.125.61.72 - 74.125.61.79 fr +74.125.61.80 - 74.125.61.87 hu +74.125.61.88 - 74.125.61.95 ie +74.125.61.96 - 74.125.61.103 it +74.125.61.104 - 74.125.61.111 nl +74.125.61.112 - 74.125.61.119 no +74.125.61.120 - 74.125.61.127 pl +74.125.61.128 - 74.125.61.135 pt +74.125.61.136 - 74.125.61.143 se +74.125.61.144 - 74.125.61.151 gb +74.125.61.152 - 74.125.61.159 de +74.125.61.160 - 74.125.61.167 fr +74.125.61.168 - 74.125.61.175 ie +74.125.61.176 - 74.125.61.183 ru +74.125.61.184 - 74.125.61.191 gb +74.125.61.192 - 74.125.61.199 ke +74.125.61.200 - 74.125.61.207 tr +74.125.61.208 - 74.125.61.215 za +74.125.61.216 - 74.125.61.233 us +74.125.61.234 - 74.125.61.235 gb +74.125.61.236 - 74.125.62.255 us +74.125.63.0 - 74.125.63.255 in +74.125.64.0 - 74.125.72.255 us +74.125.73.0 - 74.125.73.22 nl +74.125.73.23 - 74.125.73.23 eu +74.125.73.24 - 74.125.73.255 nl +74.125.74.0 - 74.125.74.255 fi +74.125.75.0 - 74.125.120.255 us +74.125.121.0 - 74.125.122.255 eu +74.125.123.0 - 74.125.180.255 us +74.125.181.0 - 74.125.181.255 nl +74.125.182.0 - 74.125.187.255 us +74.125.188.0 - 74.125.188.255 ie +74.125.189.0 - 74.125.189.22 us +74.125.189.23 - 74.125.189.23 de +74.125.189.24 - 74.125.189.255 us +74.125.190.0 - 74.125.190.255 sg +74.125.191.0 - 74.126.95.255 us 74.126.96.0 - 74.126.127.255 ca -74.126.128.0 - 74.127.6.255 us -74.127.7.0 - 74.127.7.63 in -74.127.7.64 - 74.127.7.127 us -74.127.7.128 - 74.127.7.255 in -74.127.8.0 - 74.127.9.63 us -74.127.9.64 - 74.127.9.127 ve -74.127.9.128 - 74.127.9.191 us -74.127.9.192 - 74.127.9.255 in -74.127.10.0 - 74.127.24.31 us -74.127.24.32 - 74.127.24.47 in -74.127.24.48 - 74.127.24.223 us -74.127.24.224 - 74.127.24.239 in -74.127.24.240 - 74.127.32.63 us -74.127.32.64 - 74.127.32.79 in -74.127.32.80 - 74.127.32.95 us -74.127.32.96 - 74.127.32.127 in -74.127.32.128 - 74.127.38.63 us -74.127.38.64 - 74.127.38.95 gb -74.127.38.96 - 74.127.38.127 cn -74.127.38.128 - 74.127.38.255 us -74.127.39.0 - 74.127.39.127 in -74.127.39.128 - 74.127.42.31 us -74.127.42.32 - 74.127.42.63 in -74.127.42.64 - 74.127.42.95 us -74.127.42.96 - 74.127.42.127 no -74.127.42.128 - 74.127.42.159 gb -74.127.42.160 - 74.127.46.95 us -74.127.46.96 - 74.127.46.127 au -74.127.46.128 - 74.127.51.255 us -74.127.52.0 - 74.127.52.15 in -74.127.52.16 - 74.127.52.143 us -74.127.52.144 - 74.127.52.159 ca -74.127.52.160 - 74.127.52.175 us -74.127.52.176 - 74.127.52.191 in -74.127.52.192 - 74.127.52.207 us -74.127.52.208 - 74.127.52.223 in -74.127.52.224 - 74.127.52.239 ng -74.127.52.240 - 74.127.57.255 us +74.126.128.0 - 74.127.57.255 us 74.127.58.0 - 74.127.58.255 fr -74.127.59.0 - 74.127.60.31 us -74.127.60.32 - 74.127.60.63 in -74.127.60.64 - 74.127.61.55 us -74.127.61.56 - 74.127.61.63 cy -74.127.61.64 - 74.127.61.95 us -74.127.61.96 - 74.127.61.103 id -74.127.61.104 - 74.127.191.255 us +74.127.59.0 - 74.127.191.255 us 74.127.192.0 - 74.127.255.255 ca 74.128.0.0 - 74.197.255.255 us 74.198.0.0 - 74.198.255.255 ca -74.199.0.0 - 74.199.189.15 us -74.199.189.16 - 74.199.189.31 es -74.199.189.32 - 74.199.189.127 us -74.199.189.128 - 74.199.189.143 gb -74.199.189.144 - 74.199.189.159 us -74.199.189.160 - 74.199.189.167 ie -74.199.189.168 - 74.199.255.255 us +74.199.0.0 - 74.199.255.255 us 74.200.0.0 - 74.200.31.255 ca -74.200.32.0 - 74.201.6.255 us -74.201.7.0 - 74.201.7.31 ca -74.201.7.32 - 74.201.14.191 us -74.201.14.192 - 74.201.14.199 ca -74.201.14.200 - 74.201.68.255 us -74.201.69.0 - 74.201.69.255 ph -74.201.70.0 - 74.201.71.7 us -74.201.71.8 - 74.201.71.15 ph -74.201.71.16 - 74.201.104.15 us -74.201.104.16 - 74.201.104.63 ca -74.201.104.64 - 74.201.255.191 us -74.201.255.192 - 74.201.255.207 ch -74.201.255.208 - 74.204.161.143 us -74.204.161.144 - 74.204.161.159 ro -74.204.161.160 - 74.205.0.63 us -74.205.0.64 - 74.205.0.71 sg -74.205.0.72 - 74.205.0.95 us -74.205.0.96 - 74.205.0.111 ca -74.205.0.112 - 74.205.1.127 us -74.205.1.128 - 74.205.1.159 in -74.205.1.160 - 74.205.5.55 us -74.205.5.56 - 74.205.5.63 il -74.205.5.64 - 74.205.7.15 us -74.205.7.16 - 74.205.7.23 ru -74.205.7.24 - 74.205.7.31 ca -74.205.7.32 - 74.205.7.95 us -74.205.7.96 - 74.205.7.103 il -74.205.7.104 - 74.205.7.111 us -74.205.7.112 - 74.205.7.119 gr -74.205.7.120 - 74.205.7.191 us -74.205.7.192 - 74.205.7.199 il -74.205.7.200 - 74.205.8.7 us -74.205.8.8 - 74.205.8.15 ca -74.205.8.16 - 74.205.8.39 us -74.205.8.40 - 74.205.8.47 in -74.205.8.48 - 74.205.9.79 us -74.205.9.80 - 74.205.9.95 ca -74.205.9.96 - 74.205.10.7 us -74.205.10.8 - 74.205.10.15 ca -74.205.10.16 - 74.205.10.47 us -74.205.10.48 - 74.205.10.55 mx -74.205.10.56 - 74.205.10.71 us -74.205.10.72 - 74.205.10.79 pr -74.205.10.80 - 74.205.10.167 us -74.205.10.168 - 74.205.10.175 il -74.205.10.176 - 74.205.10.183 us -74.205.10.184 - 74.205.10.191 in -74.205.10.192 - 74.205.10.207 us -74.205.10.208 - 74.205.10.215 jp -74.205.10.216 - 74.205.10.223 ca -74.205.10.224 - 74.205.10.231 us -74.205.10.232 - 74.205.10.239 ca -74.205.10.240 - 74.205.11.191 us -74.205.11.192 - 74.205.11.207 th -74.205.11.208 - 74.205.12.79 us -74.205.12.80 - 74.205.12.87 ca -74.205.12.88 - 74.205.12.111 us -74.205.12.112 - 74.205.12.119 mx -74.205.12.120 - 74.205.13.47 us -74.205.13.48 - 74.205.13.55 au -74.205.13.56 - 74.205.13.63 us -74.205.13.64 - 74.205.13.71 ca -74.205.13.72 - 74.205.13.87 us -74.205.13.88 - 74.205.13.95 ca -74.205.13.96 - 74.205.13.103 il -74.205.13.104 - 74.205.14.143 us -74.205.14.144 - 74.205.14.151 ca -74.205.14.152 - 74.205.15.223 us -74.205.15.224 - 74.205.15.231 ca -74.205.15.232 - 74.205.16.71 us -74.205.16.72 - 74.205.16.79 ca -74.205.16.80 - 74.205.16.87 za -74.205.16.88 - 74.205.16.95 us -74.205.16.96 - 74.205.16.103 il -74.205.16.104 - 74.205.16.111 us -74.205.16.112 - 74.205.16.119 ca -74.205.16.120 - 74.205.16.127 us -74.205.16.128 - 74.205.16.135 ca -74.205.16.136 - 74.205.17.63 us -74.205.17.64 - 74.205.17.79 bd -74.205.17.80 - 74.205.17.111 us -74.205.17.112 - 74.205.17.127 nl -74.205.17.128 - 74.205.17.143 us -74.205.17.144 - 74.205.17.151 ca -74.205.17.152 - 74.205.18.143 us -74.205.18.144 - 74.205.18.151 gb -74.205.18.152 - 74.205.18.167 us -74.205.18.168 - 74.205.18.175 tw -74.205.18.176 - 74.205.18.215 us -74.205.18.216 - 74.205.18.231 ca -74.205.18.232 - 74.205.19.15 us -74.205.19.16 - 74.205.19.23 in -74.205.19.24 - 74.205.19.31 us -74.205.19.32 - 74.205.19.39 in -74.205.19.40 - 74.205.19.47 gb -74.205.19.48 - 74.205.19.87 us -74.205.19.88 - 74.205.19.95 gt -74.205.19.96 - 74.205.19.127 us -74.205.19.128 - 74.205.19.151 nl -74.205.19.152 - 74.205.19.191 us -74.205.19.192 - 74.205.19.207 nl -74.205.19.208 - 74.205.21.15 us -74.205.21.16 - 74.205.21.23 ca -74.205.21.24 - 74.205.21.47 us -74.205.21.48 - 74.205.21.55 ca -74.205.21.56 - 74.205.21.63 us -74.205.21.64 - 74.205.21.71 mx -74.205.21.72 - 74.205.21.79 us -74.205.21.80 - 74.205.21.87 ca -74.205.21.88 - 74.205.21.103 us -74.205.21.104 - 74.205.21.111 th -74.205.21.112 - 74.205.22.143 us -74.205.22.144 - 74.205.22.151 gb -74.205.22.152 - 74.205.22.159 ca -74.205.22.160 - 74.205.22.167 us -74.205.22.168 - 74.205.22.175 gb -74.205.22.176 - 74.205.23.135 us -74.205.23.136 - 74.205.23.143 il -74.205.23.144 - 74.205.24.95 us -74.205.24.96 - 74.205.24.103 gb -74.205.24.104 - 74.205.26.79 us -74.205.26.80 - 74.205.26.87 gb -74.205.26.88 - 74.205.26.215 us -74.205.26.216 - 74.205.26.223 gb -74.205.26.224 - 74.205.28.103 us -74.205.28.104 - 74.205.28.111 il -74.205.28.112 - 74.205.29.95 us -74.205.29.96 - 74.205.29.103 il -74.205.29.104 - 74.205.31.255 us -74.205.32.0 - 74.205.32.7 gb -74.205.32.8 - 74.205.32.15 mx -74.205.32.16 - 74.205.32.183 us -74.205.32.184 - 74.205.32.191 gb -74.205.32.192 - 74.205.32.199 mt -74.205.32.200 - 74.205.32.231 us -74.205.32.232 - 74.205.32.239 in -74.205.32.240 - 74.205.32.255 us -74.205.33.0 - 74.205.33.15 ca -74.205.33.16 - 74.205.33.63 us -74.205.33.64 - 74.205.33.79 ca -74.205.33.80 - 74.205.33.95 us -74.205.33.96 - 74.205.33.111 in -74.205.33.112 - 74.205.34.175 us -74.205.34.176 - 74.205.34.183 gb -74.205.34.184 - 74.205.35.159 us -74.205.35.160 - 74.205.35.167 mx -74.205.35.168 - 74.205.36.223 us -74.205.36.224 - 74.205.36.239 gb -74.205.36.240 - 74.205.37.15 us -74.205.37.16 - 74.205.37.23 bo -74.205.37.24 - 74.205.37.31 us -74.205.37.32 - 74.205.37.47 ca -74.205.37.48 - 74.205.37.87 us -74.205.37.88 - 74.205.37.95 no -74.205.37.96 - 74.205.37.199 us -74.205.37.200 - 74.205.37.207 ca -74.205.37.208 - 74.205.39.7 us -74.205.39.8 - 74.205.39.15 nz -74.205.39.16 - 74.205.39.47 us -74.205.39.48 - 74.205.39.55 ca -74.205.39.56 - 74.205.40.47 us -74.205.40.48 - 74.205.40.79 ca -74.205.40.80 - 74.205.41.31 us -74.205.41.32 - 74.205.41.39 gb -74.205.41.40 - 74.205.42.55 us -74.205.42.56 - 74.205.42.63 gb -74.205.42.64 - 74.205.42.159 us -74.205.42.160 - 74.205.42.167 kr -74.205.42.168 - 74.205.42.183 us -74.205.42.184 - 74.205.42.191 gb -74.205.42.192 - 74.205.43.55 us -74.205.43.56 - 74.205.43.63 mx -74.205.43.64 - 74.205.43.71 us -74.205.43.72 - 74.205.43.79 ca -74.205.43.80 - 74.205.43.119 us -74.205.43.120 - 74.205.43.127 mx -74.205.43.128 - 74.205.43.167 us -74.205.43.168 - 74.205.43.175 in -74.205.43.176 - 74.205.44.151 us -74.205.44.152 - 74.205.44.159 jm -74.205.44.160 - 74.205.44.223 us -74.205.44.224 - 74.205.44.231 au -74.205.44.232 - 74.205.44.239 ca -74.205.44.240 - 74.205.45.31 us -74.205.45.32 - 74.205.45.39 ca -74.205.45.40 - 74.205.45.63 us -74.205.45.64 - 74.205.45.71 au -74.205.45.72 - 74.205.45.79 us -74.205.45.80 - 74.205.45.87 sg -74.205.45.88 - 74.205.45.103 au -74.205.45.104 - 74.205.45.111 gb -74.205.45.112 - 74.205.45.175 us -74.205.45.176 - 74.205.45.183 my -74.205.45.184 - 74.205.45.199 us -74.205.45.200 - 74.205.45.207 my -74.205.45.208 - 74.205.46.15 us -74.205.46.16 - 74.205.46.23 ca -74.205.46.24 - 74.205.46.239 us -74.205.46.240 - 74.205.46.247 ca -74.205.46.248 - 74.205.47.7 us -74.205.47.8 - 74.205.47.15 nz -74.205.47.16 - 74.205.47.39 us -74.205.47.40 - 74.205.47.47 in -74.205.47.48 - 74.205.47.71 us -74.205.47.72 - 74.205.47.79 in -74.205.47.80 - 74.205.49.159 us -74.205.49.160 - 74.205.49.191 bd -74.205.49.192 - 74.205.50.79 us -74.205.50.80 - 74.205.50.87 za -74.205.50.88 - 74.205.50.103 gb -74.205.50.104 - 74.205.50.159 us -74.205.50.160 - 74.205.50.167 ae -74.205.50.168 - 74.205.50.247 us -74.205.50.248 - 74.205.50.255 ca -74.205.51.0 - 74.205.51.95 us -74.205.51.96 - 74.205.51.103 ae -74.205.51.104 - 74.205.52.15 us -74.205.52.16 - 74.205.52.23 gb -74.205.52.24 - 74.205.52.175 us -74.205.52.176 - 74.205.52.183 gb -74.205.52.184 - 74.205.53.79 us -74.205.53.80 - 74.205.53.95 jp -74.205.53.96 - 74.205.54.7 us -74.205.54.8 - 74.205.54.15 gb -74.205.54.16 - 74.205.54.111 us -74.205.54.112 - 74.205.54.119 ca -74.205.54.120 - 74.205.54.167 us -74.205.54.168 - 74.205.54.175 ca -74.205.54.176 - 74.205.55.7 us -74.205.55.8 - 74.205.55.15 nz -74.205.55.16 - 74.205.55.31 us -74.205.55.32 - 74.205.55.39 ca -74.205.55.40 - 74.205.55.103 us -74.205.55.104 - 74.205.55.111 mx -74.205.55.112 - 74.205.57.119 us -74.205.57.120 - 74.205.57.135 au -74.205.57.136 - 74.205.57.207 us -74.205.57.208 - 74.205.57.215 gb -74.205.57.216 - 74.205.59.111 us -74.205.59.112 - 74.205.59.119 dk -74.205.59.120 - 74.205.60.7 us -74.205.60.8 - 74.205.60.15 pr -74.205.60.16 - 74.205.60.31 us -74.205.60.32 - 74.205.60.39 br -74.205.60.40 - 74.205.60.111 us -74.205.60.112 - 74.205.60.119 nz -74.205.60.120 - 74.205.60.127 pr -74.205.60.128 - 74.205.60.167 us -74.205.60.168 - 74.205.60.175 au -74.205.60.176 - 74.205.61.159 us -74.205.61.160 - 74.205.61.191 au -74.205.61.192 - 74.205.62.63 us -74.205.62.64 - 74.205.62.79 ca -74.205.62.80 - 74.205.62.191 us -74.205.62.192 - 74.205.62.207 ca -74.205.62.208 - 74.205.63.103 us -74.205.63.104 - 74.205.63.111 in -74.205.63.112 - 74.205.63.215 us -74.205.63.216 - 74.205.63.223 au -74.205.63.224 - 74.205.63.247 us -74.205.63.248 - 74.205.63.255 gb -74.205.64.0 - 74.205.64.143 us -74.205.64.144 - 74.205.64.151 tc -74.205.64.152 - 74.205.64.183 us -74.205.64.184 - 74.205.64.191 gb -74.205.64.192 - 74.205.65.7 us -74.205.65.8 - 74.205.65.15 au -74.205.65.16 - 74.205.65.231 us -74.205.65.232 - 74.205.65.239 ca -74.205.65.240 - 74.205.65.247 au -74.205.65.248 - 74.205.66.127 us -74.205.66.128 - 74.205.66.135 mx -74.205.66.136 - 74.205.67.15 us -74.205.67.16 - 74.205.67.23 ca -74.205.67.24 - 74.205.67.119 us -74.205.67.120 - 74.205.67.127 gb -74.205.67.128 - 74.205.67.143 us -74.205.67.144 - 74.205.67.151 ca -74.205.67.152 - 74.205.67.223 us -74.205.67.224 - 74.205.67.231 au -74.205.67.232 - 74.205.68.111 us -74.205.68.112 - 74.205.68.119 za -74.205.68.120 - 74.205.68.215 us -74.205.68.216 - 74.205.68.223 ie -74.205.68.224 - 74.205.69.39 us -74.205.69.40 - 74.205.69.47 za -74.205.69.48 - 74.205.69.79 us -74.205.69.80 - 74.205.69.87 jo -74.205.69.88 - 74.205.69.127 us -74.205.69.128 - 74.205.69.135 gb -74.205.69.136 - 74.205.69.239 us -74.205.69.240 - 74.205.69.247 za -74.205.69.248 - 74.205.70.79 us -74.205.70.80 - 74.205.70.95 il -74.205.70.96 - 74.205.70.143 us -74.205.70.144 - 74.205.70.159 fr -74.205.70.160 - 74.205.70.191 us -74.205.70.192 - 74.205.70.207 il -74.205.70.208 - 74.205.71.39 us -74.205.71.40 - 74.205.71.47 ph -74.205.71.48 - 74.205.71.87 us -74.205.71.88 - 74.205.71.103 bm -74.205.71.104 - 74.205.71.223 us -74.205.71.224 - 74.205.71.231 au -74.205.71.232 - 74.205.71.239 us -74.205.71.240 - 74.205.71.247 fr -74.205.71.248 - 74.205.72.223 us -74.205.72.224 - 74.205.72.239 ca -74.205.72.240 - 74.205.73.55 us -74.205.73.56 - 74.205.73.63 ca -74.205.73.64 - 74.205.73.95 us -74.205.73.96 - 74.205.73.103 eg -74.205.73.104 - 74.205.74.79 us -74.205.74.80 - 74.205.74.87 ca -74.205.74.88 - 74.205.74.167 us -74.205.74.168 - 74.205.74.183 in -74.205.74.184 - 74.205.74.231 us -74.205.74.232 - 74.205.74.239 ca -74.205.74.240 - 74.205.75.39 us -74.205.75.40 - 74.205.75.47 uy -74.205.75.48 - 74.205.75.119 us -74.205.75.120 - 74.205.75.127 ca -74.205.75.128 - 74.205.75.231 us -74.205.75.232 - 74.205.75.239 it -74.205.75.240 - 74.205.76.71 us -74.205.76.72 - 74.205.76.79 sg -74.205.76.80 - 74.205.76.87 us -74.205.76.88 - 74.205.76.95 ca -74.205.76.96 - 74.205.76.167 us -74.205.76.168 - 74.205.76.175 ca -74.205.76.176 - 74.205.76.183 us -74.205.76.184 - 74.205.76.191 gb -74.205.76.192 - 74.205.77.95 us -74.205.77.96 - 74.205.77.103 do -74.205.77.104 - 74.205.77.175 us -74.205.77.176 - 74.205.77.183 gb -74.205.77.184 - 74.205.78.95 us -74.205.78.96 - 74.205.78.103 ca -74.205.78.104 - 74.205.78.119 us -74.205.78.120 - 74.205.78.127 gb -74.205.78.128 - 74.205.78.159 us -74.205.78.160 - 74.205.78.167 ca -74.205.78.168 - 74.205.79.23 us -74.205.79.24 - 74.205.79.39 au -74.205.79.40 - 74.205.79.87 us -74.205.79.88 - 74.205.79.95 au -74.205.79.96 - 74.205.79.159 us -74.205.79.160 - 74.205.79.167 co -74.205.79.168 - 74.205.79.175 bd -74.205.79.176 - 74.205.79.199 us -74.205.79.200 - 74.205.79.207 gb -74.205.79.208 - 74.205.79.223 us -74.205.79.224 - 74.205.79.231 ca -74.205.79.232 - 74.205.80.55 us -74.205.80.56 - 74.205.80.63 ca -74.205.80.64 - 74.205.80.79 us -74.205.80.80 - 74.205.80.87 ca -74.205.80.88 - 74.205.80.95 gb -74.205.80.96 - 74.205.80.103 ca -74.205.80.104 - 74.205.80.111 us -74.205.80.112 - 74.205.80.119 il -74.205.80.120 - 74.205.80.127 gb -74.205.80.128 - 74.205.80.151 us -74.205.80.152 - 74.205.80.159 dk -74.205.80.160 - 74.205.80.207 us -74.205.80.208 - 74.205.80.215 ca -74.205.80.216 - 74.205.80.223 gb -74.205.80.224 - 74.205.80.231 us -74.205.80.232 - 74.205.80.239 ae -74.205.80.240 - 74.205.81.63 us -74.205.81.64 - 74.205.81.71 au -74.205.81.72 - 74.205.82.191 us -74.205.82.192 - 74.205.82.207 ca -74.205.82.208 - 74.205.82.239 us -74.205.82.240 - 74.205.82.255 ae -74.205.83.0 - 74.205.83.55 us -74.205.83.56 - 74.205.83.63 gb -74.205.83.64 - 74.205.83.71 us -74.205.83.72 - 74.205.83.79 gb -74.205.83.80 - 74.205.83.87 us -74.205.83.88 - 74.205.83.95 ca -74.205.83.96 - 74.205.83.103 il -74.205.83.104 - 74.205.83.175 us -74.205.83.176 - 74.205.83.183 in -74.205.83.184 - 74.205.83.223 us -74.205.83.224 - 74.205.83.231 ch -74.205.83.232 - 74.205.84.159 us -74.205.84.160 - 74.205.84.175 gb -74.205.84.176 - 74.205.84.223 us -74.205.84.224 - 74.205.84.239 ph -74.205.84.240 - 74.205.84.255 gh -74.205.85.0 - 74.205.85.7 mx -74.205.85.8 - 74.205.86.23 us -74.205.86.24 - 74.205.86.31 ca -74.205.86.32 - 74.205.86.127 us -74.205.86.128 - 74.205.86.135 jp -74.205.86.136 - 74.205.86.143 in -74.205.86.144 - 74.205.86.175 us -74.205.86.176 - 74.205.86.183 gb -74.205.86.184 - 74.205.87.7 us -74.205.87.8 - 74.205.87.15 ca -74.205.87.16 - 74.205.87.95 us -74.205.87.96 - 74.205.87.103 in -74.205.87.104 - 74.205.87.119 us -74.205.87.120 - 74.205.87.127 ca -74.205.87.128 - 74.205.87.183 us -74.205.87.184 - 74.205.87.191 mx -74.205.87.192 - 74.205.90.47 us -74.205.90.48 - 74.205.90.55 gb -74.205.90.56 - 74.205.90.63 in -74.205.90.64 - 74.205.91.79 us -74.205.91.80 - 74.205.91.87 ca -74.205.91.88 - 74.205.91.247 us -74.205.91.248 - 74.205.91.255 au -74.205.92.0 - 74.205.92.15 us -74.205.92.16 - 74.205.92.23 au -74.205.92.24 - 74.205.92.31 us -74.205.92.32 - 74.205.92.39 gg -74.205.92.40 - 74.205.92.255 us -74.205.93.0 - 74.205.93.7 gb -74.205.93.8 - 74.205.93.55 us -74.205.93.56 - 74.205.93.63 au -74.205.93.64 - 74.205.93.207 us -74.205.93.208 - 74.205.93.223 mx -74.205.93.224 - 74.205.94.55 us -74.205.94.56 - 74.205.94.63 ca -74.205.94.64 - 74.205.94.87 us -74.205.94.88 - 74.205.94.95 br -74.205.94.96 - 74.205.94.119 us -74.205.94.120 - 74.205.94.127 au -74.205.94.128 - 74.205.96.31 us -74.205.96.32 - 74.205.96.39 in -74.205.96.40 - 74.205.96.71 us -74.205.96.72 - 74.205.96.79 ie -74.205.96.80 - 74.205.96.135 us -74.205.96.136 - 74.205.96.143 mx -74.205.96.144 - 74.205.96.223 us -74.205.96.224 - 74.205.96.231 ph -74.205.96.232 - 74.205.96.239 us -74.205.96.240 - 74.205.96.247 in -74.205.96.248 - 74.205.96.255 us -74.205.97.0 - 74.205.97.7 my -74.205.97.8 - 74.205.97.111 us -74.205.97.112 - 74.205.97.119 in -74.205.97.120 - 74.205.97.199 us -74.205.97.200 - 74.205.97.207 mx -74.205.97.208 - 74.205.98.215 us -74.205.98.216 - 74.205.98.223 mx -74.205.98.224 - 74.205.99.119 us -74.205.99.120 - 74.205.99.127 mx -74.205.99.128 - 74.205.99.159 us -74.205.99.160 - 74.205.99.167 ca -74.205.99.168 - 74.205.99.183 us -74.205.99.184 - 74.205.99.191 ca -74.205.99.192 - 74.205.100.47 us -74.205.100.48 - 74.205.100.55 il -74.205.100.56 - 74.205.100.183 us -74.205.100.184 - 74.205.100.191 ca -74.205.100.192 - 74.205.101.47 us -74.205.101.48 - 74.205.101.55 gb -74.205.101.56 - 74.205.101.167 us -74.205.101.168 - 74.205.101.175 au -74.205.101.176 - 74.205.101.231 us -74.205.101.232 - 74.205.101.239 nz -74.205.101.240 - 74.205.102.255 us -74.205.103.0 - 74.205.103.7 au -74.205.103.8 - 74.205.103.183 us -74.205.103.184 - 74.205.103.191 ca -74.205.103.192 - 74.205.103.239 us -74.205.103.240 - 74.205.103.255 gb -74.205.104.0 - 74.205.104.127 us -74.205.104.128 - 74.205.104.135 in -74.205.104.136 - 74.205.104.143 il -74.205.104.144 - 74.205.105.143 us -74.205.105.144 - 74.205.105.151 in -74.205.105.152 - 74.205.105.175 us -74.205.105.176 - 74.205.105.183 in -74.205.105.184 - 74.205.105.191 ca -74.205.105.192 - 74.205.106.23 us -74.205.106.24 - 74.205.106.31 gb -74.205.106.32 - 74.205.106.127 us -74.205.106.128 - 74.205.106.135 au -74.205.106.136 - 74.205.106.151 us -74.205.106.152 - 74.205.106.167 ca -74.205.106.168 - 74.205.107.47 us -74.205.107.48 - 74.205.107.55 gb -74.205.107.56 - 74.205.107.95 us -74.205.107.96 - 74.205.107.103 gb -74.205.107.104 - 74.205.107.143 us -74.205.107.144 - 74.205.107.151 mx -74.205.107.152 - 74.205.108.223 us -74.205.108.224 - 74.205.108.239 ca -74.205.108.240 - 74.205.108.255 us -74.205.109.0 - 74.205.109.7 gb -74.205.109.8 - 74.205.109.23 us -74.205.109.24 - 74.205.109.31 in -74.205.109.32 - 74.205.109.135 us -74.205.109.136 - 74.205.109.143 mx -74.205.109.144 - 74.205.110.71 us -74.205.110.72 - 74.205.110.79 co -74.205.110.80 - 74.205.110.111 us -74.205.110.112 - 74.205.110.119 nz -74.205.110.120 - 74.205.110.135 us -74.205.110.136 - 74.205.110.143 in -74.205.110.144 - 74.205.110.223 us -74.205.110.224 - 74.205.110.231 cl -74.205.110.232 - 74.205.111.175 us -74.205.111.176 - 74.205.111.191 in -74.205.111.192 - 74.205.111.207 us -74.205.111.208 - 74.205.111.223 th -74.205.111.224 - 74.205.112.87 us -74.205.112.88 - 74.205.112.95 ca -74.205.112.96 - 74.205.112.111 us -74.205.112.112 - 74.205.112.119 ae -74.205.112.120 - 74.205.112.199 us -74.205.112.200 - 74.205.112.207 nz -74.205.112.208 - 74.205.112.255 us -74.205.113.0 - 74.205.113.7 gb -74.205.113.8 - 74.205.114.135 us -74.205.114.136 - 74.205.114.143 gb -74.205.114.144 - 74.205.115.23 us -74.205.115.24 - 74.205.115.31 in -74.205.115.32 - 74.205.115.71 us -74.205.115.72 - 74.205.115.79 br -74.205.115.80 - 74.205.115.87 ca -74.205.115.88 - 74.205.115.143 us -74.205.115.144 - 74.205.115.159 in -74.205.115.160 - 74.205.115.191 us -74.205.115.192 - 74.205.115.255 nl -74.205.116.0 - 74.205.119.79 us -74.205.119.80 - 74.205.119.95 ca -74.205.119.96 - 74.205.159.255 us -74.205.160.0 - 74.205.191.255 ca +74.200.32.0 - 74.205.116.191 us +74.205.116.192 - 74.205.116.207 lb +74.205.116.208 - 74.205.159.255 us +74.205.160.0 - 74.205.161.255 ca +74.205.162.0 - 74.205.162.255 us +74.205.163.0 - 74.205.191.255 ca 74.205.192.0 - 74.205.207.255 us 74.205.208.0 - 74.205.223.255 ca -74.205.224.0 - 74.205.228.255 us -74.205.229.0 - 74.205.229.223 ca -74.205.229.224 - 74.205.244.15 us -74.205.244.16 - 74.205.244.31 ca -74.205.244.32 - 74.205.244.47 us -74.205.244.48 - 74.205.244.223 ca -74.205.244.224 - 74.205.244.231 us -74.205.244.232 - 74.205.245.255 ca -74.205.246.0 - 74.206.98.143 us -74.206.98.144 - 74.206.98.175 ca -74.206.98.176 - 74.206.110.191 us -74.206.110.192 - 74.206.110.223 ca -74.206.110.224 - 74.206.127.255 us +74.205.224.0 - 74.205.244.255 us +74.205.245.0 - 74.205.245.255 ca +74.205.246.0 - 74.206.127.255 us 74.206.128.0 - 74.206.159.255 ca -74.206.160.0 - 74.206.169.223 us -74.206.169.224 - 74.206.169.255 nl -74.206.170.0 - 74.206.172.239 us -74.206.172.240 - 74.206.172.255 gb -74.206.173.0 - 74.206.175.127 us -74.206.175.128 - 74.206.175.143 nl -74.206.175.144 - 74.206.175.159 us -74.206.175.160 - 74.206.175.191 ca -74.206.175.192 - 74.206.178.191 us -74.206.178.192 - 74.206.178.223 nl -74.206.178.224 - 74.206.180.127 us -74.206.180.128 - 74.206.180.143 an -74.206.180.144 - 74.206.180.175 us -74.206.180.176 - 74.206.180.191 an -74.206.180.192 - 74.206.181.127 us -74.206.181.128 - 74.206.181.255 ca -74.206.182.0 - 74.206.184.127 us -74.206.184.128 - 74.206.184.143 ca -74.206.184.144 - 74.206.184.191 us -74.206.184.192 - 74.206.184.223 cr -74.206.184.224 - 74.206.185.223 us -74.206.185.224 - 74.206.185.255 ca -74.206.186.0 - 74.206.187.191 us -74.206.187.192 - 74.206.187.255 pa -74.206.188.0 - 74.206.189.63 us -74.206.189.64 - 74.206.189.79 ca -74.206.189.80 - 74.206.191.255 us -74.206.192.0 - 74.206.223.255 pr -74.206.224.0 - 74.208.253.255 us +74.206.160.0 - 74.208.253.255 us 74.208.254.0 - 74.208.255.255 de 74.209.0.0 - 74.209.208.255 us 74.209.209.0 - 74.209.209.255 sg -74.209.210.0 - 74.209.211.255 us -74.209.212.0 - 74.209.215.255 sg -74.209.216.0 - 74.209.246.63 us -74.209.246.64 - 74.209.246.95 gb -74.209.246.96 - 74.209.247.255 us +74.209.210.0 - 74.209.247.255 us 74.209.248.0 - 74.209.248.255 sg 74.209.249.0 - 74.209.255.255 us 74.210.0.0 - 74.210.255.255 ca 74.211.0.0 - 74.211.97.255 us 74.211.98.0 - 74.211.98.255 de -74.211.99.0 - 74.211.117.255 us -74.211.118.0 - 74.211.118.255 pa -74.211.119.0 - 74.211.119.255 us -74.211.120.0 - 74.211.120.255 de -74.211.121.0 - 74.213.63.255 us +74.211.99.0 - 74.213.63.255 us 74.213.64.0 - 74.213.127.255 pr 74.213.128.0 - 74.213.159.255 us 74.213.160.0 - 74.213.191.255 ca 74.213.192.0 - 74.214.127.255 us 74.214.128.0 - 74.214.159.255 ca -74.214.160.0 - 74.215.255.255 us +74.214.160.0 - 74.214.193.255 us +74.214.194.0 - 74.214.194.255 nl +74.214.195.0 - 74.215.255.255 us 74.216.0.0 - 74.216.255.255 ca -74.217.0.0 - 74.217.44.239 us -74.217.44.240 - 74.217.44.255 bb -74.217.45.0 - 74.217.54.127 us -74.217.54.128 - 74.217.54.191 ch -74.217.54.192 - 74.217.58.95 us -74.217.58.96 - 74.217.58.127 au -74.217.58.128 - 74.217.83.255 us -74.217.84.0 - 74.217.84.15 ca -74.217.84.16 - 74.217.127.255 us -74.217.128.0 - 74.217.129.255 ca -74.217.130.0 - 74.217.136.255 us +74.217.0.0 - 74.217.136.255 us 74.217.137.0 - 74.217.137.255 ca -74.217.138.0 - 74.217.160.175 us -74.217.160.176 - 74.217.160.183 lb -74.217.160.184 - 74.217.193.255 us -74.217.194.0 - 74.217.194.7 be -74.217.194.8 - 74.217.207.223 us -74.217.207.224 - 74.217.207.255 be -74.217.208.0 - 74.217.221.255 us +74.217.138.0 - 74.217.221.255 us 74.217.222.0 - 74.217.222.255 il -74.217.223.0 - 74.217.224.127 us -74.217.224.128 - 74.217.224.255 il -74.217.225.0 - 74.220.159.255 us +74.217.223.0 - 74.220.159.255 us 74.220.160.0 - 74.220.191.255 ca 74.220.192.0 - 74.221.15.255 us 74.221.16.0 - 74.221.31.255 ca -74.221.32.0 - 74.221.236.119 us -74.221.236.120 - 74.221.236.127 bz -74.221.236.128 - 74.221.236.143 us -74.221.236.144 - 74.221.236.151 ca -74.221.236.152 - 74.221.239.95 us -74.221.239.96 - 74.221.239.103 ca -74.221.239.104 - 74.222.63.255 us +74.221.32.0 - 74.221.127.255 us +74.221.128.0 - 74.221.143.255 ca +74.221.144.0 - 74.221.222.127 us +74.221.222.128 - 74.221.223.255 cz +74.221.224.0 - 74.222.63.255 us 74.222.64.0 - 74.222.95.255 ky -74.222.96.0 - 74.222.138.255 us -74.222.139.0 - 74.222.139.255 ca -74.222.140.0 - 75.75.224.255 us -75.75.225.0 - 75.75.225.127 ca -75.75.225.128 - 75.75.226.49 us -75.75.226.50 - 75.75.226.65 pk -75.75.226.66 - 75.75.226.255 us -75.75.227.0 - 75.75.227.255 ca -75.75.228.0 - 75.75.235.63 us -75.75.235.64 - 75.75.235.95 ca -75.75.235.96 - 75.75.237.255 us -75.75.238.0 - 75.75.238.255 ca -75.75.239.0 - 75.75.239.63 us -75.75.239.64 - 75.75.239.95 ca -75.75.239.96 - 75.75.239.255 us -75.75.240.0 - 75.75.241.95 ca -75.75.241.96 - 75.75.241.179 us -75.75.241.180 - 75.75.241.244 ca -75.75.241.245 - 75.75.241.247 us -75.75.241.248 - 75.75.241.255 ca -75.75.242.0 - 75.75.243.161 us -75.75.243.162 - 75.75.243.255 ca -75.75.244.0 - 75.75.248.255 us -75.75.249.0 - 75.75.249.15 ca -75.75.249.16 - 75.75.253.255 us -75.75.254.0 - 75.75.254.255 ca -75.75.255.0 - 75.98.15.255 us -75.98.16.0 - 75.98.17.255 ca -75.98.18.0 - 75.98.18.255 us -75.98.19.0 - 75.98.19.7 gb -75.98.19.8 - 75.98.19.127 us -75.98.19.128 - 75.98.19.255 ca +74.222.96.0 - 75.98.15.255 us +75.98.16.0 - 75.98.16.255 ca +75.98.17.0 - 75.98.18.255 us +75.98.19.0 - 75.98.19.255 ca 75.98.20.0 - 75.98.20.255 us -75.98.21.0 - 75.98.21.255 ca -75.98.22.0 - 75.98.78.63 us -75.98.78.64 - 75.98.78.127 il -75.98.78.128 - 75.98.87.255 us -75.98.88.0 - 75.98.91.255 do -75.98.92.0 - 75.98.95.127 us -75.98.95.128 - 75.98.95.159 il -75.98.95.160 - 75.98.191.255 us +75.98.21.0 - 75.98.23.255 ca +75.98.24.0 - 75.98.127.255 us +75.98.128.0 - 75.98.128.255 ca +75.98.129.0 - 75.98.129.255 us +75.98.130.0 - 75.98.130.255 ca +75.98.131.0 - 75.98.191.255 us 75.98.192.0 - 75.98.193.255 ca 75.98.194.0 - 75.98.194.255 ie -75.98.195.0 - 75.98.199.255 ca -75.98.200.0 - 75.98.200.31 us -75.98.200.32 - 75.98.207.255 ca -75.98.208.0 - 75.102.10.191 us -75.102.10.192 - 75.102.10.207 ca -75.102.10.208 - 75.102.18.255 us -75.102.19.0 - 75.102.19.7 ca -75.102.19.8 - 75.102.27.63 us -75.102.27.64 - 75.102.27.71 ca -75.102.27.72 - 75.102.27.111 us -75.102.27.112 - 75.102.27.119 af -75.102.27.120 - 75.102.27.247 us -75.102.27.248 - 75.102.27.255 au -75.102.28.0 - 75.102.33.255 us -75.102.34.0 - 75.102.34.7 ve -75.102.34.8 - 75.102.34.127 us -75.102.34.128 - 75.102.34.135 ca -75.102.34.136 - 75.102.34.143 us -75.102.34.144 - 75.102.34.159 in -75.102.34.160 - 75.102.34.175 us -75.102.34.176 - 75.102.34.191 in -75.102.34.192 - 75.102.34.215 us -75.102.34.216 - 75.102.34.223 ca -75.102.34.224 - 75.102.34.231 af -75.102.34.232 - 75.119.69.111 us -75.119.69.112 - 75.119.69.127 um -75.119.69.128 - 75.119.223.255 us +75.98.195.0 - 75.98.207.255 ca +75.98.208.0 - 75.102.60.79 us +75.102.60.80 - 75.102.60.87 jp +75.102.60.88 - 75.119.223.255 us 75.119.224.0 - 75.119.255.255 ca -75.120.0.0 - 75.125.25.63 us -75.125.25.64 - 75.125.25.95 ca -75.125.25.96 - 75.125.58.127 us -75.125.58.128 - 75.125.58.255 ma -75.125.59.0 - 75.125.123.127 us -75.125.123.128 - 75.125.123.191 ca -75.125.123.192 - 75.125.131.81 us -75.125.131.82 - 75.125.131.94 ie -75.125.131.95 - 75.151.255.255 us +75.120.0.0 - 75.151.255.255 us 75.152.0.0 - 75.159.255.255 ca 75.160.0.0 - 76.8.31.255 us 76.8.32.0 - 76.8.47.255 bm -76.8.48.0 - 76.8.49.15 us -76.8.49.16 - 76.8.49.31 pl -76.8.49.32 - 76.8.50.63 us -76.8.50.64 - 76.8.50.79 pl -76.8.50.80 - 76.8.51.63 us -76.8.51.64 - 76.8.51.79 pl -76.8.51.80 - 76.8.52.191 us -76.8.52.192 - 76.8.52.207 pl -76.8.52.208 - 76.8.53.95 us -76.8.53.96 - 76.8.53.111 pl -76.8.53.112 - 76.8.55.191 us -76.8.55.192 - 76.8.55.207 pl -76.8.55.208 - 76.8.56.31 us -76.8.56.32 - 76.8.56.47 pl -76.8.56.48 - 76.8.57.111 us -76.8.57.112 - 76.8.57.127 pl -76.8.57.128 - 76.8.60.255 us -76.8.61.0 - 76.8.61.15 pl -76.8.61.16 - 76.8.61.255 us -76.8.62.0 - 76.8.62.15 pl -76.8.62.16 - 76.8.62.255 us -76.8.63.0 - 76.8.63.15 pl -76.8.63.16 - 76.8.111.255 us +76.8.48.0 - 76.8.111.255 us 76.8.112.0 - 76.8.127.255 ca 76.8.128.0 - 76.8.255.255 us 76.9.0.0 - 76.9.0.255 gb @@ -33482,9 +17836,7 @@ 76.9.28.0 - 76.9.31.255 us 76.9.32.0 - 76.9.63.255 ca 76.9.64.0 - 76.9.191.255 us -76.9.192.0 - 76.9.197.255 ca -76.9.198.0 - 76.9.198.255 us -76.9.199.0 - 76.9.207.255 ca +76.9.192.0 - 76.9.207.255 ca 76.9.208.0 - 76.9.211.255 us 76.9.212.0 - 76.9.217.255 ca 76.9.218.0 - 76.9.219.255 us @@ -33493,665 +17845,70 @@ 76.10.128.0 - 76.10.191.255 ca 76.10.192.0 - 76.10.255.255 us 76.11.0.0 - 76.11.127.255 ca -76.11.128.0 - 76.12.0.119 us -76.12.0.120 - 76.12.0.127 ca -76.12.0.128 - 76.12.13.39 us -76.12.13.40 - 76.12.13.47 bb -76.12.13.48 - 76.12.13.63 us -76.12.13.64 - 76.12.13.71 ca -76.12.13.72 - 76.12.18.215 us -76.12.18.216 - 76.12.18.223 au -76.12.18.224 - 76.12.18.255 us -76.12.19.0 - 76.12.19.7 pr -76.12.19.8 - 76.12.19.15 us -76.12.19.16 - 76.12.19.31 pr -76.12.19.32 - 76.12.19.95 us -76.12.19.96 - 76.12.19.103 ae -76.12.19.104 - 76.12.20.119 us -76.12.20.120 - 76.12.20.127 mx -76.12.20.128 - 76.12.24.47 us -76.12.24.48 - 76.12.24.63 ca -76.12.24.64 - 76.12.24.111 us -76.12.24.112 - 76.12.24.127 gt -76.12.24.128 - 76.12.28.167 us -76.12.28.168 - 76.12.28.175 jo -76.12.28.176 - 76.12.36.111 us -76.12.36.112 - 76.12.36.119 ca -76.12.36.120 - 76.12.39.223 us -76.12.39.224 - 76.12.39.231 au -76.12.39.232 - 76.12.41.39 us -76.12.41.40 - 76.12.41.47 ca -76.12.41.48 - 76.12.42.111 us -76.12.42.112 - 76.12.42.119 sa -76.12.42.120 - 76.12.55.159 us -76.12.55.160 - 76.12.55.167 ca -76.12.55.168 - 76.12.55.175 il -76.12.55.176 - 76.12.57.95 us -76.12.57.96 - 76.12.57.111 gb -76.12.57.112 - 76.12.58.199 us -76.12.58.200 - 76.12.58.207 il -76.12.58.208 - 76.12.58.239 us -76.12.58.240 - 76.12.58.247 pk -76.12.58.248 - 76.12.61.183 us -76.12.61.184 - 76.12.61.191 ca -76.12.61.192 - 76.12.61.207 us -76.12.61.208 - 76.12.61.231 ca -76.12.61.232 - 76.12.65.231 us -76.12.65.232 - 76.12.65.239 gb -76.12.65.240 - 76.12.70.127 us -76.12.70.128 - 76.12.70.135 au -76.12.70.136 - 76.12.70.143 ca -76.12.70.144 - 76.12.70.159 us -76.12.70.160 - 76.12.70.167 ca -76.12.70.168 - 76.12.71.71 us -76.12.71.72 - 76.12.71.79 ca -76.12.71.80 - 76.12.71.159 us -76.12.71.160 - 76.12.71.191 au -76.12.71.192 - 76.12.72.255 us -76.12.73.0 - 76.12.73.7 cg -76.12.73.8 - 76.12.73.103 us -76.12.73.104 - 76.12.73.111 sa -76.12.73.112 - 76.12.79.63 us -76.12.79.64 - 76.12.79.71 ca -76.12.79.72 - 76.12.79.175 us -76.12.79.176 - 76.12.79.183 ca -76.12.79.184 - 76.12.80.31 us -76.12.80.32 - 76.12.80.39 au -76.12.80.40 - 76.12.80.151 us -76.12.80.152 - 76.12.80.175 au -76.12.80.176 - 76.12.81.183 us -76.12.81.184 - 76.12.81.191 ca -76.12.81.192 - 76.12.85.15 us -76.12.85.16 - 76.12.85.23 gb -76.12.85.24 - 76.12.85.231 us -76.12.85.232 - 76.12.85.239 ca -76.12.85.240 - 76.12.86.247 us -76.12.86.248 - 76.12.86.255 ca -76.12.87.0 - 76.12.89.63 us -76.12.89.64 - 76.12.89.71 pk -76.12.89.72 - 76.12.96.39 us -76.12.96.40 - 76.12.96.47 gb -76.12.96.48 - 76.12.96.63 au -76.12.96.64 - 76.12.96.95 gb -76.12.96.96 - 76.12.96.103 au -76.12.96.104 - 76.12.96.111 us -76.12.96.112 - 76.12.96.127 au -76.12.96.128 - 76.12.97.31 us -76.12.97.32 - 76.12.97.63 ca -76.12.97.64 - 76.12.97.111 us -76.12.97.112 - 76.12.97.127 gb -76.12.97.128 - 76.12.98.143 us -76.12.98.144 - 76.12.98.159 au -76.12.98.160 - 76.12.98.255 us -76.12.99.0 - 76.12.99.15 mx -76.12.99.16 - 76.12.99.55 us -76.12.99.56 - 76.12.99.63 ca -76.12.99.64 - 76.12.101.79 us -76.12.101.80 - 76.12.101.95 ca -76.12.101.96 - 76.12.105.63 us -76.12.105.64 - 76.12.105.71 au -76.12.105.72 - 76.12.105.79 ca -76.12.105.80 - 76.12.105.119 us -76.12.105.120 - 76.12.105.143 ca -76.12.105.144 - 76.12.105.159 us -76.12.105.160 - 76.12.105.167 ca -76.12.105.168 - 76.12.110.119 us -76.12.110.120 - 76.12.110.127 ca -76.12.110.128 - 76.12.112.31 us -76.12.112.32 - 76.12.112.39 ca -76.12.112.40 - 76.12.113.215 us -76.12.113.216 - 76.12.113.223 ca -76.12.113.224 - 76.12.115.103 us -76.12.115.104 - 76.12.115.111 au -76.12.115.112 - 76.12.119.239 us -76.12.119.240 - 76.12.119.247 it -76.12.119.248 - 76.12.119.255 us -76.12.120.0 - 76.12.120.15 it -76.12.120.16 - 76.12.120.79 us -76.12.120.80 - 76.12.120.87 au -76.12.120.88 - 76.12.124.111 us -76.12.124.112 - 76.12.124.127 ca -76.12.124.128 - 76.12.124.143 us -76.12.124.144 - 76.12.124.151 au -76.12.124.152 - 76.12.125.7 us -76.12.125.8 - 76.12.125.15 it -76.12.125.16 - 76.12.125.31 us -76.12.125.32 - 76.12.125.47 it -76.12.125.48 - 76.12.125.135 us -76.12.125.136 - 76.12.125.143 pa -76.12.125.144 - 76.12.125.215 us -76.12.125.216 - 76.12.125.223 ae -76.12.125.224 - 76.12.125.231 us -76.12.125.232 - 76.12.125.239 ae -76.12.125.240 - 76.12.129.143 us -76.12.129.144 - 76.12.129.151 in -76.12.129.152 - 76.12.129.167 us -76.12.129.168 - 76.12.129.175 gb -76.12.129.176 - 76.12.129.223 us -76.12.129.224 - 76.12.129.255 za -76.12.130.0 - 76.12.130.183 us -76.12.130.184 - 76.12.130.191 de -76.12.130.192 - 76.12.136.31 us -76.12.136.32 - 76.12.136.47 ca -76.12.136.48 - 76.12.137.47 us -76.12.137.48 - 76.12.137.63 de -76.12.137.64 - 76.12.137.119 us -76.12.137.120 - 76.12.137.127 ca -76.12.137.128 - 76.12.137.167 us -76.12.137.168 - 76.12.137.175 gb -76.12.137.176 - 76.12.138.15 us -76.12.138.16 - 76.12.138.31 sa -76.12.138.32 - 76.12.138.183 us -76.12.138.184 - 76.12.138.191 ca -76.12.138.192 - 76.12.138.247 us -76.12.138.248 - 76.12.138.255 nl -76.12.139.0 - 76.12.139.255 us -76.12.140.0 - 76.12.140.15 de -76.12.140.16 - 76.12.140.47 us -76.12.140.48 - 76.12.140.63 nl -76.12.140.64 - 76.12.141.63 us -76.12.141.64 - 76.12.141.71 ca -76.12.141.72 - 76.12.141.119 us -76.12.141.120 - 76.12.141.127 lb -76.12.141.128 - 76.12.141.247 us -76.12.141.248 - 76.12.141.255 de -76.12.142.0 - 76.12.143.7 us -76.12.143.8 - 76.12.143.15 ie -76.12.143.16 - 76.12.143.55 us -76.12.143.56 - 76.12.143.63 au -76.12.143.64 - 76.12.146.31 us -76.12.146.32 - 76.12.146.55 dk -76.12.146.56 - 76.12.146.199 us -76.12.146.200 - 76.12.146.207 gb -76.12.146.208 - 76.12.147.255 us -76.12.148.0 - 76.12.148.31 gb -76.12.148.32 - 76.12.148.215 us -76.12.148.216 - 76.12.148.231 gb -76.12.148.232 - 76.12.150.55 us -76.12.150.56 - 76.12.150.63 ca -76.12.150.64 - 76.12.150.207 us -76.12.150.208 - 76.12.150.215 mx -76.12.150.216 - 76.12.151.159 us -76.12.151.160 - 76.12.151.175 ca -76.12.151.176 - 76.12.152.15 us -76.12.152.16 - 76.12.152.31 mx -76.12.152.32 - 76.12.154.55 us -76.12.154.56 - 76.12.154.63 gb -76.12.154.64 - 76.12.154.111 us -76.12.154.112 - 76.12.154.127 gb -76.12.154.128 - 76.12.154.247 us -76.12.154.248 - 76.12.154.255 au -76.12.155.0 - 76.12.156.47 us -76.12.156.48 - 76.12.156.79 au -76.12.156.80 - 76.12.156.239 us -76.12.156.240 - 76.12.156.255 ca -76.12.157.0 - 76.12.157.55 us -76.12.157.56 - 76.12.157.63 cg -76.12.157.64 - 76.12.157.95 us -76.12.157.96 - 76.12.157.103 sa -76.12.157.104 - 76.12.157.119 us -76.12.157.120 - 76.12.157.127 ca -76.12.157.128 - 76.12.157.151 us -76.12.157.152 - 76.12.157.159 gb -76.12.157.160 - 76.12.157.223 us -76.12.157.224 - 76.12.157.231 ng -76.12.157.232 - 76.12.164.119 us -76.12.164.120 - 76.12.164.127 pk -76.12.164.128 - 76.12.169.135 us -76.12.169.136 - 76.12.169.143 it -76.12.169.144 - 76.12.169.207 us -76.12.169.208 - 76.12.169.223 it -76.12.169.224 - 76.12.171.159 us -76.12.171.160 - 76.12.171.167 au -76.12.171.168 - 76.12.171.175 us -76.12.171.176 - 76.12.171.183 au -76.12.171.184 - 76.12.173.87 us -76.12.173.88 - 76.12.173.95 pt -76.12.173.96 - 76.12.175.239 us -76.12.175.240 - 76.12.175.255 no -76.12.176.0 - 76.12.176.47 us -76.12.176.48 - 76.12.176.63 ng -76.12.176.64 - 76.12.176.103 us -76.12.176.104 - 76.12.176.111 za -76.12.176.112 - 76.12.177.111 us -76.12.177.112 - 76.12.177.127 gb -76.12.177.128 - 76.12.178.39 us -76.12.178.40 - 76.12.178.63 au -76.12.178.64 - 76.12.180.79 us -76.12.180.80 - 76.12.180.95 pt -76.12.180.96 - 76.12.180.207 us -76.12.180.208 - 76.12.180.215 il -76.12.180.216 - 76.12.181.255 us -76.12.182.0 - 76.12.182.15 gb -76.12.182.16 - 76.12.182.71 us -76.12.182.72 - 76.12.182.79 mx -76.12.182.80 - 76.12.183.87 us -76.12.183.88 - 76.12.183.95 ng -76.12.183.96 - 76.12.184.39 us -76.12.184.40 - 76.12.184.63 ng -76.12.184.64 - 76.12.184.79 us -76.12.184.80 - 76.12.184.87 gb -76.12.184.88 - 76.12.184.95 us -76.12.184.96 - 76.12.184.127 gb -76.12.184.128 - 76.12.184.143 cr -76.12.184.144 - 76.12.184.167 us -76.12.184.168 - 76.12.184.175 ng -76.12.184.176 - 76.12.185.95 us -76.12.185.96 - 76.12.185.103 ca -76.12.185.104 - 76.12.185.127 us -76.12.185.128 - 76.12.185.135 pk -76.12.185.136 - 76.12.185.175 us -76.12.185.176 - 76.12.185.183 ca -76.12.185.184 - 76.12.191.31 us -76.12.191.32 - 76.12.191.95 no -76.12.191.96 - 76.12.191.119 us -76.12.191.120 - 76.12.191.127 ca -76.12.191.128 - 76.12.195.55 us -76.12.195.56 - 76.12.195.63 ng -76.12.195.64 - 76.12.195.223 us -76.12.195.224 - 76.12.195.255 ca -76.12.196.0 - 76.12.198.231 us -76.12.198.232 - 76.12.198.247 gb -76.12.198.248 - 76.12.198.255 za -76.12.199.0 - 76.12.201.39 us -76.12.201.40 - 76.12.201.47 ca -76.12.201.48 - 76.12.203.255 us -76.12.204.0 - 76.12.204.7 ca -76.12.204.8 - 76.12.207.71 us -76.12.207.72 - 76.12.207.79 hk -76.12.207.80 - 76.12.209.79 us -76.12.209.80 - 76.12.209.95 gb -76.12.209.96 - 76.12.213.63 us -76.12.213.64 - 76.12.213.79 gb -76.12.213.80 - 76.12.216.63 us -76.12.216.64 - 76.12.216.79 pa -76.12.216.80 - 76.12.217.103 us -76.12.217.104 - 76.12.217.111 in -76.12.217.112 - 76.12.217.231 us -76.12.217.232 - 76.12.217.239 za -76.12.217.240 - 76.12.221.231 us -76.12.221.232 - 76.12.221.239 ca -76.12.221.240 - 76.12.222.255 us -76.12.223.0 - 76.12.223.31 ca -76.12.223.32 - 76.12.226.55 us +76.11.128.0 - 76.12.226.55 us 76.12.226.56 - 76.12.226.79 ca -76.12.226.80 - 76.12.226.95 au -76.12.226.96 - 76.12.226.175 us -76.12.226.176 - 76.12.226.183 pt -76.12.226.184 - 76.12.231.151 us -76.12.231.152 - 76.12.231.159 au -76.12.231.160 - 76.12.237.135 us -76.12.237.136 - 76.12.237.143 mx -76.12.237.144 - 76.12.239.135 us -76.12.239.136 - 76.12.239.167 ca -76.12.239.168 - 76.12.240.63 us -76.12.240.64 - 76.12.240.95 nl -76.12.240.96 - 76.12.242.87 us -76.12.242.88 - 76.12.242.95 ca -76.12.242.96 - 76.12.248.95 us -76.12.248.96 - 76.12.248.127 pk -76.12.248.128 - 76.12.248.143 in -76.12.248.144 - 76.12.249.127 us -76.12.249.128 - 76.12.249.143 ca -76.12.249.144 - 76.12.249.215 us -76.12.249.216 - 76.12.249.223 ng -76.12.249.224 - 76.12.251.159 us -76.12.251.160 - 76.12.251.175 ie -76.12.251.176 - 76.12.254.39 us -76.12.254.40 - 76.12.254.47 br -76.12.254.48 - 76.12.254.63 us -76.12.254.64 - 76.12.254.95 br -76.12.254.96 - 76.12.254.127 ie -76.12.254.128 - 76.12.254.143 gb -76.12.254.144 - 76.12.254.159 ch -76.12.254.160 - 76.12.254.183 us -76.12.254.184 - 76.12.254.191 gb -76.12.254.192 - 76.12.254.207 us -76.12.254.208 - 76.12.254.223 ca -76.12.254.224 - 76.63.255.255 us +76.12.226.80 - 76.16.168.255 us +76.16.169.0 - 76.16.169.255 pr +76.16.170.0 - 76.63.255.255 us 76.64.0.0 - 76.71.255.255 ca -76.72.0.0 - 76.72.162.87 us -76.72.162.88 - 76.72.162.95 ca -76.72.162.96 - 76.72.162.135 us -76.72.162.136 - 76.72.162.143 ca -76.72.162.144 - 76.72.166.207 us -76.72.166.208 - 76.72.166.255 fr -76.72.167.0 - 76.72.239.255 us +76.72.0.0 - 76.72.239.255 us 76.72.240.0 - 76.72.255.255 pr -76.73.0.0 - 76.74.14.255 us -76.74.15.0 - 76.74.15.127 ie -76.74.15.128 - 76.74.89.15 us -76.74.89.16 - 76.74.89.23 de -76.74.89.24 - 76.74.89.79 us -76.74.89.80 - 76.74.89.95 de -76.74.89.96 - 76.74.89.127 us -76.74.89.128 - 76.74.89.135 de -76.74.89.136 - 76.74.99.255 us -76.74.100.0 - 76.74.100.63 pr -76.74.100.64 - 76.74.127.255 us +76.73.0.0 - 76.74.127.255 us 76.74.128.0 - 76.74.128.255 ca -76.74.129.0 - 76.74.129.31 us -76.74.129.32 - 76.74.129.47 ca -76.74.129.48 - 76.74.129.63 us -76.74.129.64 - 76.74.129.95 ca -76.74.129.96 - 76.74.129.119 us -76.74.129.120 - 76.74.136.23 ca -76.74.136.24 - 76.74.136.31 vg -76.74.136.32 - 76.74.136.47 us -76.74.136.48 - 76.74.136.127 ca -76.74.136.128 - 76.74.136.159 vg -76.74.136.160 - 76.74.136.191 us -76.74.136.192 - 76.74.139.7 ca -76.74.139.8 - 76.74.139.15 us -76.74.139.16 - 76.74.139.95 ca -76.74.139.96 - 76.74.139.127 gb -76.74.139.128 - 76.74.140.31 ca -76.74.140.32 - 76.74.140.47 us -76.74.140.48 - 76.74.140.95 ca -76.74.140.96 - 76.74.140.127 us -76.74.140.128 - 76.74.140.175 ca -76.74.140.176 - 76.74.140.199 us -76.74.140.200 - 76.74.141.127 ca -76.74.141.128 - 76.74.141.255 us -76.74.142.0 - 76.74.142.95 ca -76.74.142.96 - 76.74.142.111 us -76.74.142.112 - 76.74.142.191 ca -76.74.142.192 - 76.74.142.223 fi -76.74.142.224 - 76.74.143.31 ca -76.74.143.32 - 76.74.143.39 us -76.74.143.40 - 76.74.143.95 ca -76.74.143.96 - 76.74.143.151 us -76.74.143.152 - 76.74.143.191 ca -76.74.143.192 - 76.74.143.223 us -76.74.143.224 - 76.74.143.255 ca -76.74.144.0 - 76.74.144.151 us -76.74.144.152 - 76.74.144.159 bb -76.74.144.160 - 76.74.144.175 ca -76.74.144.176 - 76.74.144.207 us -76.74.144.208 - 76.74.144.215 au -76.74.144.216 - 76.74.148.55 us -76.74.148.56 - 76.74.148.63 mx -76.74.148.64 - 76.74.148.79 cr -76.74.148.80 - 76.74.148.91 us -76.74.148.92 - 76.74.148.95 mx -76.74.148.96 - 76.74.148.103 us -76.74.148.104 - 76.74.148.111 ca -76.74.148.112 - 76.74.148.127 cr -76.74.148.128 - 76.74.149.15 us -76.74.149.16 - 76.74.149.31 ca -76.74.149.32 - 76.74.149.87 us -76.74.149.88 - 76.74.149.127 ca -76.74.149.128 - 76.74.149.231 us -76.74.149.232 - 76.74.149.239 pa -76.74.149.240 - 76.74.152.6 us -76.74.152.7 - 76.74.152.15 in -76.74.152.16 - 76.74.152.127 us -76.74.152.128 - 76.74.152.136 in -76.74.152.137 - 76.74.152.143 us -76.74.152.144 - 76.74.152.159 in -76.74.152.160 - 76.74.152.180 us -76.74.152.181 - 76.74.152.181 in -76.74.152.182 - 76.74.152.182 us -76.74.152.183 - 76.74.152.183 in -76.74.152.184 - 76.74.152.187 us -76.74.152.188 - 76.74.152.188 in -76.74.152.189 - 76.74.152.192 us -76.74.152.193 - 76.74.152.193 in -76.74.152.194 - 76.74.152.239 us -76.74.152.240 - 76.74.152.251 in -76.74.152.252 - 76.74.153.4 us -76.74.153.5 - 76.74.153.5 in -76.74.153.6 - 76.74.153.127 us -76.74.153.128 - 76.74.153.135 in -76.74.153.136 - 76.74.153.183 us -76.74.153.184 - 76.74.153.191 in -76.74.153.192 - 76.74.154.127 us -76.74.154.128 - 76.74.154.147 in -76.74.154.148 - 76.74.154.151 us -76.74.154.152 - 76.74.154.170 in -76.74.154.171 - 76.74.156.4 us -76.74.156.5 - 76.74.156.14 in -76.74.156.15 - 76.74.157.33 us -76.74.157.34 - 76.74.157.34 in -76.74.157.35 - 76.74.157.127 us -76.74.157.128 - 76.74.157.223 in -76.74.157.224 - 76.74.161.255 us +76.74.129.0 - 76.74.129.127 us +76.74.129.128 - 76.74.132.255 ca +76.74.133.0 - 76.74.133.255 us +76.74.134.0 - 76.74.135.255 ca +76.74.136.0 - 76.74.136.255 us +76.74.137.0 - 76.74.138.255 ca +76.74.139.0 - 76.74.139.95 us +76.74.139.96 - 76.74.139.127 ca +76.74.139.128 - 76.74.161.255 us 76.74.162.0 - 76.74.162.255 ca -76.74.163.0 - 76.74.163.255 us -76.74.164.0 - 76.74.164.63 ca -76.74.164.64 - 76.74.164.79 us -76.74.164.80 - 76.74.164.95 ca -76.74.164.96 - 76.74.164.151 us -76.74.164.152 - 76.74.165.23 ca -76.74.165.24 - 76.74.165.95 us -76.74.165.96 - 76.74.165.207 ca -76.74.165.208 - 76.74.165.215 us -76.74.165.216 - 76.74.165.239 ca -76.74.165.240 - 76.74.165.247 mx -76.74.165.248 - 76.74.167.255 us -76.74.168.0 - 76.74.168.255 in -76.74.169.0 - 76.74.172.63 us -76.74.172.64 - 76.74.172.95 ca -76.74.172.96 - 76.74.172.111 us -76.74.172.112 - 76.74.172.127 ca -76.74.172.128 - 76.74.174.159 us -76.74.174.160 - 76.74.174.167 cn -76.74.174.168 - 76.74.175.15 us -76.74.175.16 - 76.74.175.31 ca -76.74.175.32 - 76.74.175.47 cn -76.74.175.48 - 76.74.175.63 us -76.74.175.64 - 76.74.175.95 cn -76.74.175.96 - 76.74.175.255 us +76.74.163.0 - 76.74.165.159 us +76.74.165.160 - 76.74.165.191 ca +76.74.165.192 - 76.74.175.255 us 76.74.176.0 - 76.74.176.255 in -76.74.177.0 - 76.74.179.31 us -76.74.179.32 - 76.74.179.63 ca -76.74.179.64 - 76.74.183.255 us +76.74.177.0 - 76.74.183.255 us 76.74.184.0 - 76.74.187.255 ca 76.74.188.0 - 76.74.191.255 us -76.74.192.0 - 76.74.207.255 ca -76.74.208.0 - 76.74.208.255 us +76.74.192.0 - 76.74.192.255 ca +76.74.193.0 - 76.74.195.127 us +76.74.195.128 - 76.74.195.255 ca +76.74.196.0 - 76.74.200.63 us +76.74.200.64 - 76.74.200.127 ca +76.74.200.128 - 76.74.201.127 us +76.74.201.128 - 76.74.201.255 ca +76.74.202.0 - 76.74.202.255 us +76.74.203.0 - 76.74.203.255 ca +76.74.204.0 - 76.74.204.255 us +76.74.205.0 - 76.74.205.255 ca +76.74.206.0 - 76.74.206.127 us +76.74.206.128 - 76.74.206.255 ca +76.74.207.0 - 76.74.208.255 us 76.74.209.0 - 76.74.210.255 ca -76.74.211.0 - 76.74.217.255 us -76.74.218.0 - 76.74.218.63 in -76.74.218.64 - 76.74.218.79 ca -76.74.218.80 - 76.74.218.95 us +76.74.211.0 - 76.74.218.95 us 76.74.218.96 - 76.74.218.127 in -76.74.218.128 - 76.74.219.31 us -76.74.219.32 - 76.74.219.63 cn -76.74.219.64 - 76.74.219.127 ca -76.74.219.128 - 76.74.219.247 us -76.74.219.248 - 76.74.219.255 ca -76.74.220.0 - 76.74.221.127 us -76.74.221.128 - 76.74.221.143 eg -76.74.221.144 - 76.74.221.159 ca -76.74.221.160 - 76.74.223.95 us -76.74.223.96 - 76.74.223.127 eg -76.74.223.128 - 76.74.223.239 us -76.74.223.240 - 76.74.223.255 nz -76.74.224.0 - 76.74.225.15 ca -76.74.225.16 - 76.74.226.23 us -76.74.226.24 - 76.74.226.31 ca -76.74.226.32 - 76.74.226.39 hk -76.74.226.40 - 76.74.226.47 us -76.74.226.48 - 76.74.226.71 ca -76.74.226.72 - 76.74.226.79 us -76.74.226.80 - 76.74.226.95 ca -76.74.226.96 - 76.74.226.127 kn -76.74.226.128 - 76.74.226.191 us -76.74.226.192 - 76.74.226.207 ca -76.74.226.208 - 76.74.226.223 us -76.74.226.224 - 76.74.234.127 ca -76.74.234.128 - 76.74.234.159 us -76.74.234.160 - 76.74.235.31 ca -76.74.235.32 - 76.74.235.63 us -76.74.235.64 - 76.74.235.127 ca -76.74.235.128 - 76.74.235.255 vg -76.74.236.0 - 76.74.236.187 us -76.74.236.188 - 76.74.236.196 in -76.74.236.197 - 76.74.236.197 us -76.74.236.198 - 76.74.236.206 in -76.74.236.207 - 76.74.237.139 us -76.74.237.140 - 76.74.237.147 in -76.74.237.148 - 76.74.237.175 us -76.74.237.176 - 76.74.237.187 in -76.74.237.188 - 76.74.237.255 us -76.74.238.0 - 76.74.238.255 in -76.74.239.0 - 76.74.239.63 us -76.74.239.64 - 76.74.239.127 in -76.74.239.128 - 76.74.239.160 us -76.74.239.161 - 76.74.239.161 in -76.74.239.162 - 76.74.240.39 us -76.74.240.40 - 76.74.240.55 ca -76.74.240.56 - 76.74.240.63 us -76.74.240.64 - 76.74.242.31 ca -76.74.242.32 - 76.74.242.39 us -76.74.242.40 - 76.74.242.47 bv -76.74.242.48 - 76.74.242.95 ca -76.74.242.96 - 76.74.242.103 us -76.74.242.104 - 76.74.242.127 ca -76.74.242.128 - 76.74.242.255 us +76.74.218.128 - 76.74.223.255 us +76.74.224.0 - 76.74.224.255 ca +76.74.225.0 - 76.74.226.255 us +76.74.227.0 - 76.74.229.255 ca +76.74.230.0 - 76.74.230.255 us +76.74.231.0 - 76.74.231.255 ca +76.74.232.0 - 76.74.232.255 us +76.74.233.0 - 76.74.233.255 ca +76.74.234.0 - 76.74.240.255 us +76.74.241.0 - 76.74.241.255 ca +76.74.242.0 - 76.74.242.255 us 76.74.243.0 - 76.74.247.255 ca -76.74.248.0 - 76.74.248.255 us -76.74.249.0 - 76.74.249.31 vg -76.74.249.32 - 76.74.252.186 us -76.74.252.187 - 76.74.252.196 in -76.74.252.197 - 76.74.253.199 us -76.74.253.200 - 76.74.253.224 in -76.74.253.225 - 76.74.253.231 us -76.74.253.232 - 76.74.253.239 in -76.74.253.240 - 76.75.63.255 us +76.74.248.0 - 76.75.63.255 us 76.75.64.0 - 76.75.191.255 ca 76.75.192.0 - 76.75.223.255 us -76.75.224.0 - 76.75.234.7 ca -76.75.234.8 - 76.75.234.15 us -76.75.234.16 - 76.75.234.31 ca -76.75.234.32 - 76.75.234.39 us -76.75.234.40 - 76.75.234.47 ca -76.75.234.48 - 76.75.234.87 us -76.75.234.88 - 76.75.234.159 ca -76.75.234.160 - 76.75.234.183 us -76.75.234.184 - 76.75.234.191 ca -76.75.234.192 - 76.75.234.199 us -76.75.234.200 - 76.75.234.231 ca -76.75.234.232 - 76.75.234.239 us -76.75.234.240 - 76.75.234.247 ca -76.75.234.248 - 76.75.234.255 us -76.75.235.0 - 76.75.235.31 ca -76.75.235.32 - 76.75.235.39 us -76.75.235.40 - 76.75.235.47 ca -76.75.235.48 - 76.75.235.55 us -76.75.235.56 - 76.75.235.183 ca -76.75.235.184 - 76.75.235.199 us -76.75.235.200 - 76.75.237.127 ca -76.75.237.128 - 76.75.237.135 us -76.75.237.136 - 76.75.237.159 ca -76.75.237.160 - 76.75.237.167 us -76.75.237.168 - 76.75.237.175 ca -76.75.237.176 - 76.75.237.183 us -76.75.237.184 - 76.75.237.215 ca -76.75.237.216 - 76.75.237.247 us -76.75.237.248 - 76.75.240.7 ca -76.75.240.8 - 76.75.240.15 us -76.75.240.16 - 76.75.240.111 ca -76.75.240.112 - 76.75.240.119 us -76.75.240.120 - 76.75.240.127 ca -76.75.240.128 - 76.75.240.135 us -76.75.240.136 - 76.75.241.127 ca -76.75.241.128 - 76.75.241.151 us -76.75.241.152 - 76.75.241.199 ca -76.75.241.200 - 76.75.241.215 us -76.75.241.216 - 76.75.241.239 ca -76.75.241.240 - 76.75.241.247 us -76.75.241.248 - 76.75.242.143 ca -76.75.242.144 - 76.75.242.159 us -76.75.242.160 - 76.75.242.183 ca -76.75.242.184 - 76.75.242.191 us -76.75.242.192 - 76.75.242.215 ca -76.75.242.216 - 76.75.242.223 us -76.75.242.224 - 76.75.243.55 ca -76.75.243.56 - 76.75.243.63 us -76.75.243.64 - 76.75.243.215 ca -76.75.243.216 - 76.75.243.231 us -76.75.243.232 - 76.75.244.87 ca -76.75.244.88 - 76.75.244.119 us -76.75.244.120 - 76.75.244.151 ca -76.75.244.152 - 76.75.244.159 us -76.75.244.160 - 76.75.244.167 ca -76.75.244.168 - 76.75.244.175 us -76.75.244.176 - 76.75.245.7 ca -76.75.245.8 - 76.75.245.15 us -76.75.245.16 - 76.75.245.87 ca -76.75.245.88 - 76.75.245.95 us -76.75.245.96 - 76.75.245.191 ca -76.75.245.192 - 76.75.245.215 us -76.75.245.216 - 76.75.246.159 ca -76.75.246.160 - 76.75.246.167 us -76.75.246.168 - 76.75.246.199 ca -76.75.246.200 - 76.75.246.207 us -76.75.246.208 - 76.75.247.23 ca -76.75.247.24 - 76.75.247.31 us -76.75.247.32 - 76.75.247.103 ca -76.75.247.104 - 76.75.247.111 us -76.75.247.112 - 76.75.247.247 ca -76.75.247.248 - 76.75.247.255 us -76.75.248.0 - 76.75.248.79 ca -76.75.248.80 - 76.75.248.87 us -76.75.248.88 - 76.75.249.135 ca -76.75.249.136 - 76.75.249.159 us -76.75.249.160 - 76.75.249.167 ca -76.75.249.168 - 76.75.249.175 nl -76.75.249.176 - 76.75.249.183 ca -76.75.249.184 - 76.75.249.191 us -76.75.249.192 - 76.75.249.223 ca -76.75.249.224 - 76.75.249.231 us -76.75.249.232 - 76.75.250.159 ca -76.75.250.160 - 76.75.250.167 us -76.75.250.168 - 76.75.250.183 ca -76.75.250.184 - 76.75.250.191 us -76.75.250.192 - 76.75.250.215 ca -76.75.250.216 - 76.75.250.223 us -76.75.250.224 - 76.75.251.95 ca -76.75.251.96 - 76.75.251.111 us -76.75.251.112 - 76.75.251.119 ca -76.75.251.120 - 76.75.251.127 us -76.75.251.128 - 76.75.251.223 ca -76.75.251.224 - 76.75.251.231 us -76.75.251.232 - 76.75.251.247 ca -76.75.251.248 - 76.75.251.255 us -76.75.252.0 - 76.75.253.15 ca -76.75.253.16 - 76.75.253.23 us -76.75.253.24 - 76.75.253.39 ca -76.75.253.40 - 76.75.253.47 us -76.75.253.48 - 76.75.253.167 ca -76.75.253.168 - 76.75.253.175 us -76.75.253.176 - 76.75.253.207 ca -76.75.253.208 - 76.75.253.215 us -76.75.253.216 - 76.75.253.223 ca -76.75.253.224 - 76.75.253.239 us -76.75.253.240 - 76.75.253.247 nl -76.75.253.248 - 76.75.253.255 us -76.75.254.0 - 76.75.254.23 ca -76.75.254.24 - 76.75.254.39 us -76.75.254.40 - 76.75.254.63 ca -76.75.254.64 - 76.75.254.71 us -76.75.254.72 - 76.75.254.95 ca -76.75.254.96 - 76.75.254.175 us -76.75.254.176 - 76.75.254.183 ca -76.75.254.184 - 76.75.255.7 us -76.75.255.8 - 76.75.255.15 ca -76.75.255.16 - 76.75.255.23 fr -76.75.255.24 - 76.75.255.87 us -76.75.255.88 - 76.75.255.95 ca -76.75.255.96 - 76.75.255.111 us -76.75.255.112 - 76.75.255.167 ca -76.75.255.168 - 76.75.255.175 us -76.75.255.176 - 76.75.255.199 ca -76.75.255.200 - 76.75.255.231 us -76.75.255.232 - 76.75.255.255 ca +76.75.224.0 - 76.75.255.255 ca 76.76.0.0 - 76.76.95.255 us 76.76.96.0 - 76.76.127.255 ca 76.76.128.0 - 76.76.159.255 us -76.76.160.0 - 76.76.163.255 ai +76.76.160.0 - 76.76.163.255 ag 76.76.164.0 - 76.76.167.255 vg 76.76.168.0 - 76.76.171.255 kn 76.76.172.0 - 76.76.175.255 vg @@ -34161,15 +17918,12 @@ 76.76.188.0 - 76.76.189.255 lc 76.76.190.0 - 76.76.191.255 ag 76.76.192.0 - 76.76.207.255 pr -76.76.208.0 - 76.77.31.255 us +76.76.208.0 - 76.77.47.255 us +76.77.48.0 - 76.77.63.255 jp 76.77.64.0 - 76.77.95.255 ca -76.77.96.0 - 76.191.102.218 us -76.191.102.219 - 76.191.102.232 se -76.191.102.233 - 76.195.115.127 us -76.195.115.128 - 76.195.115.191 um -76.195.115.192 - 76.231.177.255 us -76.231.178.0 - 76.231.178.63 gb -76.231.178.64 - 76.255.255.255 us +76.77.96.0 - 76.78.241.255 us +76.78.242.0 - 76.78.242.0 ca +76.78.242.1 - 76.255.255.255 us 77.0.0.0 - 77.15.255.255 de 77.16.0.0 - 77.19.255.255 no 77.20.0.0 - 77.25.255.255 de @@ -34180,9 +17934,7 @@ 77.34.0.0 - 77.35.255.255 ru 77.36.0.0 - 77.36.127.255 ro 77.36.128.0 - 77.36.255.255 ir -77.37.0.0 - 77.37.31.63 de -77.37.31.64 - 77.37.31.95 ca -77.37.31.96 - 77.37.127.255 de +77.37.0.0 - 77.37.127.255 de 77.37.128.0 - 77.37.255.255 ru 77.38.0.0 - 77.38.127.255 si 77.38.128.0 - 77.38.255.255 lv @@ -34203,11 +17955,9 @@ 77.46.128.0 - 77.46.255.255 rs 77.47.0.0 - 77.47.127.255 de 77.47.128.0 - 77.47.255.255 ua -77.48.0.0 - 77.48.27.255 cz -77.48.28.0 - 77.48.28.63 sk -77.48.28.64 - 77.48.68.255 cz -77.48.69.0 - 77.48.70.127 sk -77.48.70.128 - 77.48.219.255 cz +77.48.0.0 - 77.48.129.255 cz +77.48.130.0 - 77.48.130.255 sk +77.48.131.0 - 77.48.219.255 cz 77.48.220.0 - 77.48.221.255 sk 77.48.222.0 - 77.48.255.255 cz 77.49.0.0 - 77.49.255.255 gr @@ -34221,227 +17971,113 @@ 77.64.0.0 - 77.64.127.255 sa 77.64.128.0 - 77.64.255.255 de 77.65.0.0 - 77.65.255.255 pl -77.66.0.0 - 77.66.2.79 dk -77.66.2.80 - 77.66.2.80 de -77.66.2.81 - 77.66.2.81 gb -77.66.2.82 - 77.66.41.239 dk -77.66.41.240 - 77.66.41.247 gb -77.66.41.248 - 77.66.127.255 dk +77.66.0.0 - 77.66.127.255 dk 77.66.128.0 - 77.66.255.255 ru 77.67.0.0 - 77.67.0.127 fr 77.67.0.128 - 77.67.0.255 us -77.67.1.0 - 77.67.1.255 gb -77.67.2.0 - 77.67.2.255 fr -77.67.3.0 - 77.67.3.255 us +77.67.1.0 - 77.67.3.127 fr +77.67.3.128 - 77.67.3.255 it 77.67.4.0 - 77.67.4.255 fr -77.67.5.0 - 77.67.5.255 es -77.67.6.0 - 77.67.7.255 de +77.67.5.0 - 77.67.5.255 gb +77.67.6.0 - 77.67.7.255 fr 77.67.8.0 - 77.67.9.255 nl 77.67.10.0 - 77.67.10.127 fr 77.67.10.128 - 77.67.10.255 nl 77.67.11.0 - 77.67.11.255 de -77.67.12.0 - 77.67.13.255 fr -77.67.14.0 - 77.67.17.255 be -77.67.18.0 - 77.67.18.255 it +77.67.12.0 - 77.67.18.255 fr 77.67.19.0 - 77.67.21.255 nl -77.67.22.0 - 77.67.22.127 de +77.67.22.0 - 77.67.22.127 fr 77.67.22.128 - 77.67.22.255 nl -77.67.23.0 - 77.67.23.255 be -77.67.24.0 - 77.67.25.255 fr -77.67.26.0 - 77.67.26.255 gb -77.67.27.0 - 77.67.27.255 fr +77.67.23.0 - 77.67.26.255 fr +77.67.27.0 - 77.67.27.255 de 77.67.28.0 - 77.67.29.255 us 77.67.30.0 - 77.67.30.255 nl -77.67.31.0 - 77.67.31.255 gb -77.67.32.0 - 77.67.32.255 ir +77.67.31.0 - 77.67.32.255 fr 77.67.33.0 - 77.67.33.255 ch -77.67.34.0 - 77.67.34.255 ca +77.67.34.0 - 77.67.34.255 fr 77.67.35.0 - 77.67.35.255 nl 77.67.36.0 - 77.67.39.255 es 77.67.40.0 - 77.67.41.255 nl -77.67.42.0 - 77.67.43.255 fr -77.67.44.0 - 77.67.44.63 us -77.67.44.64 - 77.67.44.191 fr -77.67.44.192 - 77.67.44.255 ie -77.67.45.0 - 77.67.45.127 fr -77.67.45.128 - 77.67.45.191 ie -77.67.45.192 - 77.67.45.254 be -77.67.45.255 - 77.67.45.255 fr -77.67.46.0 - 77.67.46.63 be -77.67.46.64 - 77.67.46.127 it -77.67.46.128 - 77.67.46.255 us -77.67.47.0 - 77.67.47.127 ie -77.67.47.128 - 77.67.48.127 fr -77.67.48.128 - 77.67.48.192 de -77.67.48.193 - 77.67.51.255 fr -77.67.52.0 - 77.67.52.31 us -77.67.52.32 - 77.67.52.95 fr -77.67.52.96 - 77.67.52.159 de -77.67.52.160 - 77.67.52.191 il -77.67.52.192 - 77.67.52.223 ie -77.67.52.224 - 77.67.52.255 il -77.67.53.0 - 77.67.53.31 ie -77.67.53.32 - 77.67.53.63 gb -77.67.53.64 - 77.67.53.95 fr -77.67.53.96 - 77.67.53.127 es -77.67.53.128 - 77.67.53.159 be -77.67.53.160 - 77.67.53.191 de -77.67.53.192 - 77.67.53.223 fr -77.67.53.224 - 77.67.53.255 es -77.67.54.0 - 77.67.56.159 fr -77.67.56.160 - 77.67.56.191 us -77.67.56.192 - 77.67.56.223 nl -77.67.56.224 - 77.67.56.255 es -77.67.57.0 - 77.67.57.31 gb -77.67.57.32 - 77.67.57.63 hr -77.67.57.64 - 77.67.57.159 de -77.67.57.160 - 77.67.57.191 be -77.67.57.192 - 77.67.57.223 ie -77.67.57.224 - 77.67.57.255 de +77.67.42.0 - 77.67.48.127 fr +77.67.48.128 - 77.67.48.191 de +77.67.48.192 - 77.67.48.255 gb +77.67.49.0 - 77.67.49.191 fr +77.67.49.192 - 77.67.49.255 de +77.67.50.0 - 77.67.50.63 fr +77.67.50.64 - 77.67.50.79 gb +77.67.50.80 - 77.67.50.95 fr +77.67.50.96 - 77.67.50.111 gb +77.67.50.112 - 77.67.50.119 fr +77.67.50.120 - 77.67.50.127 gb +77.67.50.128 - 77.67.50.223 fr +77.67.50.224 - 77.67.50.255 no +77.67.51.0 - 77.67.51.15 gb +77.67.51.16 - 77.67.53.255 fr +77.67.54.0 - 77.67.54.31 cz +77.67.54.32 - 77.67.54.63 de +77.67.54.64 - 77.67.54.95 pl +77.67.54.96 - 77.67.54.127 ro +77.67.54.128 - 77.67.54.159 fr +77.67.54.160 - 77.67.54.191 dk +77.67.54.192 - 77.67.55.223 fr +77.67.55.224 - 77.67.55.255 gb +77.67.56.0 - 77.67.57.63 fr +77.67.57.64 - 77.67.57.95 nl +77.67.57.96 - 77.67.57.255 fr 77.67.58.0 - 77.67.59.127 nl 77.67.59.128 - 77.67.59.255 de -77.67.60.0 - 77.67.60.15 ir -77.67.60.16 - 77.67.60.31 be -77.67.60.32 - 77.67.60.63 us -77.67.60.64 - 77.67.60.111 nl -77.67.60.112 - 77.67.60.135 us -77.67.60.136 - 77.67.60.151 de -77.67.60.152 - 77.67.60.159 us -77.67.60.160 - 77.67.60.175 it -77.67.60.176 - 77.67.60.183 ie -77.67.60.184 - 77.67.60.191 fr -77.67.60.192 - 77.67.60.207 us -77.67.60.208 - 77.67.60.223 gb -77.67.60.224 - 77.67.60.239 es -77.67.60.240 - 77.67.60.255 us -77.67.61.0 - 77.67.61.15 gb -77.67.61.16 - 77.67.61.31 pl -77.67.61.32 - 77.67.61.47 ro -77.67.61.48 - 77.67.61.63 bg -77.67.61.64 - 77.67.61.79 gb -77.67.61.80 - 77.67.61.95 it -77.67.61.96 - 77.67.61.111 gb -77.67.61.112 - 77.67.61.143 fr -77.67.61.144 - 77.67.61.159 il -77.67.61.160 - 77.67.61.175 gb -77.67.61.176 - 77.67.61.207 fr -77.67.61.208 - 77.67.61.223 de -77.67.61.224 - 77.67.61.239 ro -77.67.61.240 - 77.67.61.255 ie -77.67.62.0 - 77.67.62.255 fr -77.67.63.0 - 77.67.63.7 gb -77.67.63.8 - 77.67.63.15 fr -77.67.63.16 - 77.67.63.23 nl -77.67.63.24 - 77.67.63.39 de -77.67.63.40 - 77.67.63.47 fr -77.67.63.48 - 77.67.63.55 be -77.67.63.56 - 77.67.63.63 il -77.67.63.64 - 77.67.63.67 fr -77.67.63.68 - 77.67.63.71 im -77.67.63.72 - 77.67.63.87 fr -77.67.63.88 - 77.67.63.119 de -77.67.63.120 - 77.67.63.127 ie -77.67.63.128 - 77.67.63.167 gb -77.67.63.168 - 77.67.63.175 de -77.67.63.176 - 77.67.63.183 gb -77.67.63.184 - 77.67.63.199 ie -77.67.63.200 - 77.67.63.215 de -77.67.63.216 - 77.67.63.223 ie -77.67.63.224 - 77.67.63.239 be -77.67.63.240 - 77.67.63.247 gb -77.67.63.248 - 77.67.63.255 pl -77.67.64.0 - 77.67.74.255 de -77.67.75.0 - 77.67.75.255 fr -77.67.76.0 - 77.67.79.255 de -77.67.80.0 - 77.67.81.255 us -77.67.82.0 - 77.67.82.255 de -77.67.83.0 - 77.67.83.255 us -77.67.84.0 - 77.67.84.255 tw -77.67.85.0 - 77.67.87.255 nl -77.67.88.0 - 77.67.89.255 us -77.67.90.0 - 77.67.90.255 de -77.67.91.0 - 77.67.92.255 nl -77.67.93.0 - 77.67.93.255 us -77.67.94.0 - 77.67.99.255 de +77.67.60.0 - 77.67.62.63 fr +77.67.62.64 - 77.67.62.71 es +77.67.62.72 - 77.67.62.119 fr +77.67.62.120 - 77.67.62.127 it +77.67.62.128 - 77.67.62.175 fr +77.67.62.176 - 77.67.62.179 gb +77.67.62.180 - 77.67.62.183 fr +77.67.62.184 - 77.67.62.191 gb +77.67.62.192 - 77.67.62.199 nl +77.67.62.200 - 77.67.62.207 es +77.67.62.208 - 77.67.62.231 fr +77.67.62.232 - 77.67.62.239 gb +77.67.62.240 - 77.67.62.247 ie +77.67.62.248 - 77.67.62.251 fr +77.67.62.252 - 77.67.62.255 gb +77.67.63.0 - 77.67.63.199 fr +77.67.63.200 - 77.67.63.207 de +77.67.63.208 - 77.67.79.71 fr +77.67.79.72 - 77.67.79.79 us +77.67.79.80 - 77.67.84.255 fr +77.67.85.0 - 77.67.85.255 nl +77.67.86.0 - 77.67.86.255 us +77.67.87.0 - 77.67.87.255 nl +77.67.88.0 - 77.67.90.255 fr +77.67.91.0 - 77.67.91.255 nl +77.67.92.0 - 77.67.92.255 us +77.67.93.0 - 77.67.95.255 fr +77.67.96.0 - 77.67.99.255 de 77.67.100.0 - 77.67.100.255 fr 77.67.101.0 - 77.67.101.255 us -77.67.102.0 - 77.67.102.255 fr -77.67.103.0 - 77.67.106.255 us -77.67.107.0 - 77.67.107.7 fr -77.67.107.8 - 77.67.107.63 us -77.67.107.64 - 77.67.107.79 fr -77.67.107.80 - 77.67.107.87 us -77.67.107.88 - 77.67.107.91 de -77.67.107.92 - 77.67.107.95 fr -77.67.107.96 - 77.67.107.99 im -77.67.107.100 - 77.67.107.103 fr -77.67.107.104 - 77.67.107.111 us -77.67.107.112 - 77.67.107.127 fr -77.67.107.128 - 77.67.107.215 gb -77.67.107.216 - 77.67.107.255 fr -77.67.108.0 - 77.67.108.31 us -77.67.108.32 - 77.67.108.47 ie -77.67.108.48 - 77.67.108.79 fr -77.67.108.80 - 77.67.108.111 us -77.67.108.112 - 77.67.108.127 ca -77.67.108.128 - 77.67.108.191 us -77.67.108.192 - 77.67.108.255 fr -77.67.109.0 - 77.67.109.95 us -77.67.109.96 - 77.67.109.191 ca -77.67.109.192 - 77.67.109.223 us -77.67.109.224 - 77.67.109.255 fr -77.67.110.0 - 77.67.111.63 us -77.67.111.64 - 77.67.111.127 fr -77.67.111.128 - 77.67.111.191 ca -77.67.111.192 - 77.67.111.255 fr -77.67.112.0 - 77.67.113.255 us -77.67.114.0 - 77.67.115.255 fr -77.67.116.0 - 77.67.117.255 us -77.67.118.0 - 77.67.118.255 fr -77.67.119.0 - 77.67.119.255 us -77.67.120.0 - 77.67.120.255 fr -77.67.121.0 - 77.67.121.255 ca -77.67.122.0 - 77.67.122.255 us -77.67.123.0 - 77.67.123.255 fr -77.67.124.0 - 77.67.125.255 us -77.67.126.0 - 77.67.126.255 fr +77.67.102.0 - 77.67.105.255 fr +77.67.106.0 - 77.67.106.255 us +77.67.107.0 - 77.67.108.71 fr +77.67.108.72 - 77.67.108.79 gb +77.67.108.80 - 77.67.108.95 fr +77.67.108.96 - 77.67.108.111 us +77.67.108.112 - 77.67.115.255 fr +77.67.116.0 - 77.67.116.255 us +77.67.117.0 - 77.67.126.255 fr 77.67.127.0 - 77.67.127.255 us -77.67.128.0 - 77.67.255.255 tr +77.67.128.0 - 77.67.255.255 by 77.68.0.0 - 77.68.127.255 gb 77.68.128.0 - 77.68.255.255 dk 77.69.0.0 - 77.69.127.255 gr 77.69.128.0 - 77.69.255.255 bh 77.70.0.0 - 77.70.127.255 bg -77.70.128.0 - 77.70.129.127 no -77.70.129.128 - 77.70.129.159 bf -77.70.129.160 - 77.70.129.223 no -77.70.129.224 - 77.70.129.239 ao -77.70.129.240 - 77.70.129.255 ng -77.70.130.0 - 77.70.130.15 tz -77.70.130.16 - 77.70.130.63 no -77.70.130.64 - 77.70.130.111 gn -77.70.130.112 - 77.70.130.127 no -77.70.130.128 - 77.70.130.143 ng -77.70.130.144 - 77.70.130.191 no -77.70.130.192 - 77.70.130.199 mr -77.70.130.200 - 77.70.130.207 no -77.70.130.208 - 77.70.130.223 ng -77.70.130.224 - 77.70.130.239 bj -77.70.130.240 - 77.70.130.255 no -77.70.131.0 - 77.70.131.31 bj -77.70.131.32 - 77.70.131.71 no -77.70.131.72 - 77.70.131.79 sl -77.70.131.80 - 77.70.131.87 bf -77.70.131.88 - 77.70.139.255 no -77.70.140.0 - 77.70.140.255 ng -77.70.141.0 - 77.70.153.63 no -77.70.153.64 - 77.70.153.95 bi -77.70.153.96 - 77.70.155.255 no -77.70.156.0 - 77.70.161.255 lt -77.70.162.0 - 77.70.167.255 us -77.70.168.0 - 77.70.181.255 lt +77.70.128.0 - 77.70.142.255 lu +77.70.143.0 - 77.70.156.175 fr +77.70.156.176 - 77.70.156.191 cd +77.70.156.192 - 77.70.181.255 fr 77.70.182.0 - 77.70.191.255 no -77.70.192.0 - 77.70.255.255 lt +77.70.192.0 - 77.70.255.255 fr 77.71.0.0 - 77.71.127.255 bg 77.71.128.0 - 77.71.255.255 mt 77.72.0.0 - 77.72.7.255 gb @@ -34461,19 +18097,9 @@ 77.72.120.0 - 77.72.127.255 ru 77.72.128.0 - 77.72.135.255 de 77.72.136.0 - 77.72.143.255 ru -77.72.144.0 - 77.72.151.255 de -77.72.152.0 - 77.72.159.255 nl -77.72.160.0 - 77.72.164.63 at -77.72.164.64 - 77.72.164.127 de -77.72.164.128 - 77.72.164.159 at -77.72.164.160 - 77.72.164.191 ch -77.72.164.192 - 77.72.167.127 at -77.72.167.128 - 77.72.167.159 ch -77.72.167.160 - 77.72.167.255 at -77.72.168.0 - 77.72.169.255 ch -77.72.170.0 - 77.72.170.255 nl -77.72.171.0 - 77.72.174.255 ch -77.72.175.0 - 77.72.175.255 nl +77.72.144.0 - 77.72.159.255 nl +77.72.160.0 - 77.72.167.255 at +77.72.168.0 - 77.72.175.255 nl 77.72.176.0 - 77.72.183.255 ch 77.72.184.0 - 77.72.191.255 tr 77.72.192.0 - 77.72.199.255 it @@ -34484,7 +18110,6 @@ 77.72.232.0 - 77.72.239.255 be 77.72.240.0 - 77.72.255.255 ru 77.73.0.0 - 77.73.15.255 gb -77.73.16.0 - 77.73.23.255 nl 77.73.24.0 - 77.73.31.255 ru 77.73.32.0 - 77.73.39.255 ch 77.73.40.0 - 77.73.47.255 es @@ -34503,53 +18128,17 @@ 77.73.160.0 - 77.73.167.255 es 77.73.168.0 - 77.73.175.255 gb 77.73.176.0 - 77.73.183.255 be -77.73.184.0 - 77.73.185.151 ng -77.73.185.152 - 77.73.185.167 a2 -77.73.185.168 - 77.73.185.191 ng -77.73.185.192 - 77.73.185.199 a2 -77.73.185.200 - 77.73.185.223 ng -77.73.185.224 - 77.73.185.231 a2 -77.73.185.232 - 77.73.185.247 ng -77.73.185.248 - 77.73.185.255 us -77.73.186.0 - 77.73.186.135 ng -77.73.186.136 - 77.73.186.143 a2 -77.73.186.144 - 77.73.186.215 ng -77.73.186.216 - 77.73.186.223 a2 -77.73.186.224 - 77.73.187.71 ng -77.73.187.72 - 77.73.187.87 a2 -77.73.187.88 - 77.73.187.103 ng -77.73.187.104 - 77.73.187.119 a2 -77.73.187.120 - 77.73.187.135 ng -77.73.187.136 - 77.73.187.143 a2 -77.73.187.144 - 77.73.188.71 ng -77.73.188.72 - 77.73.188.79 a2 -77.73.188.80 - 77.73.188.103 ng -77.73.188.104 - 77.73.188.127 a2 -77.73.188.128 - 77.73.188.159 ng -77.73.188.160 - 77.73.188.191 a2 -77.73.188.192 - 77.73.188.231 ng -77.73.188.232 - 77.73.188.255 a2 -77.73.189.0 - 77.73.189.7 ng -77.73.189.8 - 77.73.189.15 a2 -77.73.189.16 - 77.73.189.71 ng -77.73.189.72 - 77.73.189.79 a2 -77.73.189.80 - 77.73.189.207 ng -77.73.189.208 - 77.73.189.223 a2 -77.73.189.224 - 77.73.190.15 ng -77.73.190.16 - 77.73.190.31 a2 -77.73.190.32 - 77.73.190.47 ng -77.73.190.48 - 77.73.190.63 a2 -77.73.190.64 - 77.73.190.71 ng -77.73.190.72 - 77.73.190.79 a2 -77.73.190.80 - 77.73.191.119 ng -77.73.191.120 - 77.73.191.135 a2 -77.73.191.136 - 77.73.191.175 ng -77.73.191.176 - 77.73.191.183 a2 -77.73.191.184 - 77.73.191.255 ng -77.73.192.0 - 77.73.196.255 sa -77.73.197.0 - 77.73.197.255 ae -77.73.198.0 - 77.73.198.255 kw -77.73.199.0 - 77.73.199.255 sa +77.73.184.0 - 77.73.185.175 a2 +77.73.185.176 - 77.73.185.183 ng +77.73.185.184 - 77.73.187.7 a2 +77.73.187.8 - 77.73.187.15 ng +77.73.187.16 - 77.73.187.95 a2 +77.73.187.96 - 77.73.187.103 ng +77.73.187.104 - 77.73.191.135 a2 +77.73.191.136 - 77.73.191.143 ng +77.73.191.144 - 77.73.191.247 a2 +77.73.191.248 - 77.73.191.255 ng +77.73.192.0 - 77.73.199.255 sa 77.73.200.0 - 77.73.207.255 es 77.73.208.0 - 77.73.215.255 ie 77.73.216.0 - 77.73.223.255 tr @@ -34557,9 +18146,7 @@ 77.73.232.0 - 77.73.239.255 ru 77.73.240.0 - 77.73.247.255 ch 77.73.248.0 - 77.73.255.255 de -77.74.0.0 - 77.74.5.255 ch -77.74.6.0 - 77.74.6.255 de -77.74.7.0 - 77.74.7.255 ch +77.74.0.0 - 77.74.7.255 ch 77.74.8.0 - 77.74.15.255 ru 77.74.16.0 - 77.74.23.255 it 77.74.24.0 - 77.74.31.255 ru @@ -34578,14 +18165,13 @@ 77.74.128.0 - 77.74.135.255 se 77.74.136.0 - 77.74.143.255 de 77.74.144.0 - 77.74.151.255 it -77.74.152.0 - 77.74.159.255 fr +77.74.152.0 - 77.74.159.255 us 77.74.160.0 - 77.74.167.255 no 77.74.168.0 - 77.74.169.255 ch 77.74.170.0 - 77.74.171.255 fi 77.74.172.0 - 77.74.175.255 ch 77.74.176.0 - 77.74.191.255 ru 77.74.192.0 - 77.74.199.255 gb -77.74.200.0 - 77.74.207.255 si 77.74.208.0 - 77.74.215.255 fr 77.74.216.0 - 77.74.223.255 no 77.74.224.0 - 77.74.231.255 ba @@ -34596,8 +18182,8 @@ 77.75.16.0 - 77.75.31.255 at 77.75.32.0 - 77.75.39.255 tr 77.75.40.0 - 77.75.47.255 lt -77.75.48.0 - 77.75.52.223 fr -77.75.52.224 - 77.75.55.255 eu +77.75.48.0 - 77.75.51.255 fr +77.75.52.0 - 77.75.55.255 eu 77.75.56.0 - 77.75.71.255 fr 77.75.72.0 - 77.75.79.255 cz 77.75.80.0 - 77.75.87.255 dk @@ -34607,14 +18193,13 @@ 77.75.112.0 - 77.75.119.255 ch 77.75.120.0 - 77.75.127.255 gb 77.75.128.0 - 77.75.135.255 ru -77.75.136.0 - 77.75.136.255 nl -77.75.137.0 - 77.75.143.255 gb +77.75.136.0 - 77.75.143.255 gb 77.75.144.0 - 77.75.151.255 ua 77.75.152.0 - 77.75.159.255 ru 77.75.160.0 - 77.75.167.255 dk 77.75.168.0 - 77.75.175.255 ru 77.75.176.0 - 77.75.183.255 es -77.75.184.0 - 77.75.191.255 gb +77.75.184.0 - 77.75.199.255 gb 77.75.200.0 - 77.75.207.255 de 77.75.208.0 - 77.75.215.255 no 77.75.216.0 - 77.75.223.255 tr @@ -34634,21 +18219,51 @@ 77.78.64.0 - 77.78.127.255 cz 77.78.128.0 - 77.78.191.255 bg 77.78.192.0 - 77.78.255.255 ba -77.79.0.0 - 77.79.14.255 lt -77.79.15.0 - 77.79.15.31 fr -77.79.15.32 - 77.79.15.63 lt -77.79.15.64 - 77.79.15.72 cy -77.79.15.73 - 77.79.63.255 lt +77.79.0.0 - 77.79.63.255 lt 77.79.64.0 - 77.79.127.255 tr 77.79.128.0 - 77.79.191.255 ru -77.79.192.0 - 77.79.235.239 pl -77.79.235.240 - 77.79.235.255 se -77.79.236.0 - 77.79.255.255 pl +77.79.192.0 - 77.79.255.255 pl 77.80.0.0 - 77.80.127.255 at 77.80.128.0 - 77.80.255.255 se -77.81.0.0 - 77.81.255.255 ro +77.81.0.0 - 77.81.2.255 ro +77.81.3.0 - 77.81.3.255 md +77.81.4.0 - 77.81.31.255 ro +77.81.32.0 - 77.81.47.255 ir +77.81.48.0 - 77.81.55.255 ro +77.81.56.0 - 77.81.63.255 az +77.81.64.0 - 77.81.65.255 ro +77.81.66.0 - 77.81.67.255 gb +77.81.68.0 - 77.81.71.255 ro +77.81.72.0 - 77.81.73.255 gb +77.81.74.0 - 77.81.75.255 ro +77.81.76.0 - 77.81.83.255 ir +77.81.84.0 - 77.81.86.255 gb +77.81.87.0 - 77.81.88.255 ro +77.81.89.0 - 77.81.91.255 gb +77.81.92.0 - 77.81.92.255 qa +77.81.93.0 - 77.81.93.255 us +77.81.94.0 - 77.81.94.255 qa +77.81.95.0 - 77.81.95.255 ro +77.81.96.0 - 77.81.96.255 nl +77.81.97.0 - 77.81.108.255 ro +77.81.109.0 - 77.81.110.255 de +77.81.111.0 - 77.81.111.255 ro +77.81.112.0 - 77.81.119.255 es +77.81.120.0 - 77.81.121.255 bz +77.81.122.0 - 77.81.123.255 ro +77.81.124.0 - 77.81.124.127 nl +77.81.124.128 - 77.81.140.255 ro +77.81.141.0 - 77.81.141.255 es +77.81.142.0 - 77.81.159.255 ro +77.81.160.0 - 77.81.160.127 nl +77.81.160.128 - 77.81.166.255 ro +77.81.167.0 - 77.81.167.255 cn +77.81.168.0 - 77.81.191.255 ro +77.81.192.0 - 77.81.223.255 ir +77.81.224.0 - 77.81.239.255 it +77.81.240.0 - 77.81.247.255 nl +77.81.248.0 - 77.81.255.255 az 77.82.0.0 - 77.82.255.255 ru -77.83.0.0 - 77.83.255.255 gr 77.84.0.0 - 77.84.255.255 fr 77.85.0.0 - 77.85.255.255 bg 77.86.0.0 - 77.86.127.255 gb @@ -34668,7 +18283,7 @@ 77.87.104.0 - 77.87.111.255 fr 77.87.112.0 - 77.87.119.255 ru 77.87.120.0 - 77.87.127.255 pl -77.87.128.0 - 77.87.135.255 gb +77.87.128.0 - 77.87.135.255 ch 77.87.136.0 - 77.87.143.255 pl 77.87.144.0 - 77.87.159.255 ua 77.87.160.0 - 77.87.167.255 nl @@ -34700,24 +18315,11 @@ 77.91.200.0 - 77.91.207.255 pt 77.91.208.0 - 77.91.215.255 fi 77.91.216.0 - 77.91.223.255 se -77.91.224.0 - 77.91.227.63 ru -77.91.227.64 - 77.91.227.127 sc -77.91.227.128 - 77.91.227.167 ru -77.91.227.168 - 77.91.227.175 cy -77.91.227.176 - 77.91.227.223 ru -77.91.227.224 - 77.91.227.255 aq -77.91.228.0 - 77.91.228.79 ru -77.91.228.80 - 77.91.228.95 mk -77.91.228.96 - 77.91.228.103 es -77.91.228.104 - 77.91.231.255 ru +77.91.224.0 - 77.91.231.255 ru 77.91.232.0 - 77.91.239.255 de 77.91.240.0 - 77.91.247.255 fr 77.91.248.0 - 77.91.255.255 gb -77.92.0.0 - 77.92.2.31 cy -77.92.2.32 - 77.92.2.47 tr -77.92.2.48 - 77.92.2.80 cy -77.92.2.81 - 77.92.2.95 tr -77.92.2.96 - 77.92.16.0 cy +77.92.0.0 - 77.92.16.0 cy 77.92.16.1 - 77.92.31.255 tr 77.92.32.0 - 77.92.63.255 pl 77.92.64.0 - 77.92.95.255 gb @@ -34731,25 +18333,13 @@ 77.93.96.0 - 77.93.127.255 ru 77.93.128.0 - 77.93.159.255 gb 77.93.160.0 - 77.93.191.255 ro -77.93.192.0 - 77.93.206.79 cz -77.93.206.80 - 77.93.206.95 sk -77.93.206.96 - 77.93.223.255 cz +77.93.192.0 - 77.93.223.255 cz 77.93.224.0 - 77.93.255.255 it -77.94.0.0 - 77.94.31.255 ru -77.94.32.0 - 77.94.33.255 lt -77.94.34.0 - 77.94.34.255 ru -77.94.35.0 - 77.94.35.255 lt -77.94.36.0 - 77.94.36.255 ru -77.94.37.0 - 77.94.37.255 lb -77.94.38.0 - 77.94.38.255 iq -77.94.39.0 - 77.94.40.255 lb -77.94.41.0 - 77.94.42.255 ru -77.94.43.0 - 77.94.45.255 by -77.94.46.0 - 77.94.47.255 ru -77.94.48.0 - 77.94.48.255 tm -77.94.49.0 - 77.94.51.255 ru -77.94.52.0 - 77.94.53.255 lt -77.94.54.0 - 77.94.55.255 ru +77.94.0.0 - 77.94.39.255 ru +77.94.40.0 - 77.94.40.255 lt +77.94.41.0 - 77.94.43.255 ru +77.94.44.0 - 77.94.47.255 by +77.94.48.0 - 77.94.55.255 ru 77.94.56.0 - 77.94.63.255 by 77.94.64.0 - 77.94.95.255 it 77.94.96.0 - 77.94.127.255 ru @@ -34760,9 +18350,8 @@ 77.94.240.0 - 77.94.255.255 nl 77.95.0.0 - 77.95.7.255 tj 77.95.8.0 - 77.95.15.255 ru -77.95.16.0 - 77.95.19.255 cy -77.95.20.0 - 77.95.23.255 us -77.95.24.0 - 77.95.31.255 de +77.95.16.0 - 77.95.23.255 cy +77.95.24.0 - 77.95.31.255 nl 77.95.32.0 - 77.95.39.255 gb 77.95.40.0 - 77.95.47.255 cz 77.95.48.0 - 77.95.55.255 pl @@ -34774,9 +18363,7 @@ 77.95.96.0 - 77.95.103.255 nl 77.95.104.0 - 77.95.111.255 se 77.95.112.0 - 77.95.119.255 gb -77.95.120.0 - 77.95.121.159 ch -77.95.121.160 - 77.95.121.175 lv -77.95.121.176 - 77.95.127.255 ch +77.95.120.0 - 77.95.127.255 ch 77.95.128.0 - 77.95.135.255 ru 77.95.136.0 - 77.95.143.255 it 77.95.144.0 - 77.95.151.255 fi @@ -34788,33 +18375,15 @@ 77.95.192.0 - 77.95.199.255 cz 77.95.200.0 - 77.95.207.255 ru 77.95.208.0 - 77.95.215.255 it -77.95.216.0 - 77.95.218.255 sa -77.95.219.0 - 77.95.220.255 ir -77.95.221.0 - 77.95.223.255 sa -77.95.224.0 - 77.95.225.4 nl -77.95.225.5 - 77.95.225.14 es -77.95.225.15 - 77.95.225.41 nl -77.95.225.42 - 77.95.225.45 es -77.95.225.46 - 77.95.225.96 nl -77.95.225.97 - 77.95.225.100 es -77.95.225.101 - 77.95.227.74 nl -77.95.227.75 - 77.95.227.75 it -77.95.227.76 - 77.95.227.80 nl -77.95.227.81 - 77.95.227.81 us -77.95.227.82 - 77.95.227.87 nl -77.95.227.88 - 77.95.227.91 us -77.95.227.92 - 77.95.227.124 nl -77.95.227.125 - 77.95.227.128 it -77.95.227.129 - 77.95.229.4 nl -77.95.229.5 - 77.95.229.250 tr -77.95.229.251 - 77.95.231.255 nl +77.95.216.0 - 77.95.223.255 sa +77.95.224.0 - 77.95.231.255 nl 77.95.232.0 - 77.95.239.255 bg 77.95.240.0 - 77.95.247.255 fi 77.95.248.0 - 77.95.255.255 nl 77.96.0.0 - 77.103.255.255 gb 77.104.0.0 - 77.104.63.255 fr 77.104.64.0 - 77.104.127.255 ir -77.104.128.0 - 77.104.191.255 ro +77.104.128.0 - 77.104.191.255 bg 77.104.192.0 - 77.104.255.255 cz 77.105.0.0 - 77.105.63.255 rs 77.105.64.0 - 77.105.127.255 fi @@ -34825,59 +18394,38 @@ 77.106.192.0 - 77.106.255.255 ru 77.107.0.0 - 77.107.63.255 se 77.107.64.0 - 77.107.191.255 gb -77.107.192.0 - 77.107.223.127 ie -77.107.223.128 - 77.107.223.143 ca -77.107.223.144 - 77.107.236.255 ie -77.107.237.0 - 77.107.237.7 us -77.107.237.8 - 77.107.255.255 ie +77.107.192.0 - 77.107.255.255 ie 77.108.0.0 - 77.108.63.255 it 77.108.64.0 - 77.108.127.255 ru 77.108.128.0 - 77.108.191.255 gb 77.108.192.0 - 77.108.255.255 ru 77.109.0.0 - 77.109.63.255 ua -77.109.64.0 - 77.109.64.255 be -77.109.65.0 - 77.109.65.255 ru -77.109.66.0 - 77.109.75.255 nl -77.109.76.0 - 77.109.80.255 be -77.109.81.0 - 77.109.81.255 nl +77.109.64.0 - 77.109.81.255 nl 77.109.82.0 - 77.109.84.255 be -77.109.85.0 - 77.109.85.255 ru -77.109.86.0 - 77.109.86.255 be -77.109.87.0 - 77.109.87.255 ru -77.109.88.0 - 77.109.88.255 fr -77.109.89.0 - 77.109.89.255 de -77.109.90.0 - 77.109.91.255 be -77.109.92.0 - 77.109.93.255 gb -77.109.94.0 - 77.109.94.255 fr -77.109.95.0 - 77.109.95.255 de +77.109.85.0 - 77.109.93.255 nl +77.109.94.0 - 77.109.94.255 be +77.109.95.0 - 77.109.95.255 nl 77.109.96.0 - 77.109.103.255 be -77.109.104.0 - 77.109.107.255 nl -77.109.108.0 - 77.109.108.255 be -77.109.109.0 - 77.109.109.255 nl -77.109.110.0 - 77.109.111.255 ru -77.109.112.0 - 77.109.127.255 be -77.109.128.0 - 77.109.136.7 ch -77.109.136.8 - 77.109.136.15 de -77.109.136.16 - 77.109.138.175 ch -77.109.138.176 - 77.109.138.191 de -77.109.138.192 - 77.109.144.191 ch +77.109.104.0 - 77.109.111.255 nl +77.109.112.0 - 77.109.119.255 be +77.109.120.0 - 77.109.120.255 nl +77.109.121.0 - 77.109.124.255 be +77.109.125.0 - 77.109.127.255 nl +77.109.128.0 - 77.109.140.252 ch +77.109.140.253 - 77.109.140.253 de +77.109.140.254 - 77.109.144.191 ch 77.109.144.192 - 77.109.144.207 es -77.109.144.208 - 77.109.145.75 ch -77.109.145.76 - 77.109.145.87 pt -77.109.145.88 - 77.109.191.255 ch +77.109.144.208 - 77.109.191.255 ch 77.109.192.0 - 77.109.255.255 fi 77.110.0.0 - 77.110.63.255 se -77.110.64.0 - 77.110.79.255 sa -77.110.80.0 - 77.110.127.255 lb +77.110.64.0 - 77.110.127.255 sa 77.110.128.0 - 77.110.191.255 hu 77.110.192.0 - 77.110.255.255 no 77.111.0.0 - 77.111.63.255 si 77.111.64.0 - 77.111.191.255 hu 77.111.192.0 - 77.111.211.255 fr -77.111.212.0 - 77.111.221.255 gb -77.111.222.0 - 77.111.223.255 fr -77.111.224.0 - 77.111.233.255 de -77.111.234.0 - 77.111.255.255 fr +77.111.212.0 - 77.111.227.255 gb +77.111.228.0 - 77.111.255.255 fr 77.112.0.0 - 77.115.255.255 pl 77.116.0.0 - 77.119.255.255 at 77.120.0.0 - 77.123.255.255 ua @@ -34888,32 +18436,23 @@ 77.192.0.0 - 77.207.255.255 fr 77.208.0.0 - 77.211.255.255 es 77.212.0.0 - 77.215.255.255 dk -77.216.0.0 - 77.217.255.255 ru -77.218.0.0 - 77.218.255.255 se +77.216.0.0 - 77.218.39.195 se +77.218.39.196 - 77.218.39.196 ee +77.218.39.197 - 77.218.255.255 se 77.219.0.0 - 77.219.31.255 lv 77.219.32.0 - 77.219.63.255 hr 77.219.64.0 - 77.219.95.255 lt 77.219.96.0 - 77.219.127.255 hr 77.219.128.0 - 77.219.159.255 lt 77.219.160.0 - 77.219.255.255 se -77.220.0.0 - 77.220.31.255 ke +77.220.0.0 - 77.220.7.255 a2 +77.220.8.0 - 77.220.31.255 ke 77.220.32.0 - 77.220.63.255 ru -77.220.64.0 - 77.220.86.207 it -77.220.86.208 - 77.220.86.215 us -77.220.86.216 - 77.220.87.255 it -77.220.88.0 - 77.220.91.255 ch -77.220.92.0 - 77.220.93.255 it -77.220.94.0 - 77.220.95.31 ch -77.220.95.32 - 77.220.95.255 it +77.220.64.0 - 77.220.95.255 it 77.220.96.0 - 77.220.127.255 at -77.220.128.0 - 77.220.185.231 ru -77.220.185.232 - 77.220.185.239 ch -77.220.185.240 - 77.220.191.255 ru +77.220.128.0 - 77.220.191.255 ru 77.220.192.0 - 77.220.223.255 uz -77.220.224.0 - 77.220.232.255 de -77.220.233.0 - 77.220.233.63 nl -77.220.233.64 - 77.220.233.95 gb -77.220.233.96 - 77.220.255.255 de +77.220.224.0 - 77.220.255.255 de 77.221.0.0 - 77.221.31.255 ba 77.221.32.0 - 77.221.63.255 hu 77.221.64.0 - 77.221.95.255 lt @@ -34937,12 +18476,14 @@ 77.223.192.0 - 77.223.255.255 pl 77.224.0.0 - 77.231.255.255 es 77.232.0.0 - 77.232.63.255 ru -77.232.64.0 - 77.232.76.255 eu -77.232.77.0 - 77.232.77.223 de -77.232.77.224 - 77.232.95.255 eu +77.232.64.0 - 77.232.73.197 eu +77.232.73.198 - 77.232.73.198 ch +77.232.73.199 - 77.232.95.255 eu 77.232.96.0 - 77.232.127.255 sa -77.232.128.0 - 77.232.159.255 ru -77.232.160.0 - 77.232.191.255 gb +77.232.128.0 - 77.232.167.255 ru +77.232.168.0 - 77.232.175.255 gb +77.232.176.0 - 77.232.183.255 sa +77.232.184.0 - 77.232.191.255 ru 77.232.192.0 - 77.232.223.255 ro 77.232.224.0 - 77.232.255.255 de 77.233.0.0 - 77.233.31.255 ru @@ -34953,7 +18494,15 @@ 77.233.160.0 - 77.233.223.255 ru 77.233.224.0 - 77.233.255.255 dk 77.234.0.0 - 77.234.31.255 ru -77.234.32.0 - 77.234.63.255 de +77.234.32.0 - 77.234.39.255 de +77.234.40.0 - 77.234.40.255 cz +77.234.41.0 - 77.234.42.255 us +77.234.43.0 - 77.234.43.255 gb +77.234.44.0 - 77.234.44.255 us +77.234.45.0 - 77.234.45.255 de +77.234.46.0 - 77.234.47.255 cz +77.234.48.0 - 77.234.55.255 no +77.234.56.0 - 77.234.63.255 ch 77.234.64.0 - 77.234.95.255 hu 77.234.96.0 - 77.234.127.255 fi 77.234.128.0 - 77.234.159.255 si @@ -34961,9 +18510,7 @@ 77.234.192.0 - 77.234.223.255 ru 77.234.224.0 - 77.234.255.255 sk 77.235.0.0 - 77.235.31.255 kg -77.235.32.0 - 77.235.34.255 nl -77.235.35.0 - 77.235.35.255 gb -77.235.36.0 - 77.235.63.255 nl +77.235.32.0 - 77.235.63.255 nl 77.235.64.0 - 77.235.95.255 at 77.235.96.0 - 77.235.127.255 md 77.235.128.0 - 77.235.159.255 lb @@ -34978,32 +18525,29 @@ 77.236.192.0 - 77.236.223.255 cz 77.236.224.0 - 77.236.255.255 ru 77.237.0.0 - 77.237.31.255 pl -77.237.32.0 - 77.237.63.127 at -77.237.63.128 - 77.237.63.191 cz -77.237.63.192 - 77.237.63.255 at +77.237.32.0 - 77.237.63.255 at 77.237.64.0 - 77.237.95.255 ir 77.237.96.0 - 77.237.127.255 hr 77.237.128.0 - 77.237.159.255 cz 77.237.160.0 - 77.237.191.255 ir 77.237.192.0 - 77.237.223.255 ch -77.237.224.0 - 77.237.255.255 de +77.237.224.0 - 77.237.231.255 de +77.237.232.0 - 77.237.247.255 es +77.237.248.0 - 77.237.251.255 nl +77.237.252.0 - 77.237.255.255 de 77.238.0.0 - 77.238.31.255 it 77.238.32.0 - 77.238.63.255 se 77.238.64.0 - 77.238.95.255 bg 77.238.96.0 - 77.238.159.255 ru -77.238.160.0 - 77.238.177.255 gb -77.238.178.0 - 77.238.178.255 ie -77.238.179.0 - 77.238.187.255 gb -77.238.188.0 - 77.238.189.255 ie -77.238.190.0 - 77.238.191.255 gb +77.238.160.0 - 77.238.191.255 gb 77.238.192.0 - 77.238.223.255 ba 77.238.224.0 - 77.238.255.255 ru 77.239.0.0 - 77.239.31.255 ba 77.239.32.0 - 77.239.63.255 ch 77.239.64.0 - 77.239.95.255 ba -77.239.96.0 - 77.239.103.255 gb -77.239.104.0 - 77.239.104.255 de -77.239.105.0 - 77.239.127.255 gb +77.239.96.0 - 77.239.105.255 gb +77.239.106.0 - 77.239.106.255 us +77.239.107.0 - 77.239.127.255 gb 77.239.128.0 - 77.239.159.255 it 77.239.160.0 - 77.239.191.255 ua 77.239.192.0 - 77.239.255.255 ru @@ -35022,29 +18566,14 @@ 77.240.208.0 - 77.240.223.255 se 77.240.224.0 - 77.240.239.255 it 77.240.240.0 - 77.240.243.255 ee -77.240.244.0 - 77.240.244.71 lv -77.240.244.72 - 77.240.244.79 ee -77.240.244.80 - 77.240.244.111 lv -77.240.244.112 - 77.240.244.127 ee -77.240.244.128 - 77.240.246.111 lv -77.240.246.112 - 77.240.246.119 ee -77.240.246.120 - 77.240.246.135 lv -77.240.246.136 - 77.240.246.159 ee -77.240.246.160 - 77.240.246.223 lv -77.240.246.224 - 77.240.246.243 ee -77.240.246.244 - 77.240.247.247 lv -77.240.247.248 - 77.240.247.255 ee -77.240.248.0 - 77.240.255.239 lt -77.240.255.240 - 77.240.255.255 ee +77.240.244.0 - 77.240.247.255 lv +77.240.248.0 - 77.240.255.255 lt 77.241.0.0 - 77.241.15.255 it 77.241.16.0 - 77.241.47.255 ru 77.241.48.0 - 77.241.63.255 es 77.241.64.0 - 77.241.79.255 jo 77.241.80.0 - 77.241.87.255 be -77.241.88.0 - 77.241.88.15 nl -77.241.88.16 - 77.241.88.23 gb -77.241.88.24 - 77.241.88.31 fr -77.241.88.32 - 77.241.95.255 be +77.241.88.0 - 77.241.95.255 nl 77.241.96.0 - 77.241.111.255 no 77.241.112.0 - 77.241.127.255 es 77.241.128.0 - 77.241.143.255 dk @@ -35053,7 +18582,11 @@ 77.241.176.0 - 77.241.191.255 gb 77.241.192.0 - 77.241.207.255 lt 77.241.208.0 - 77.241.223.255 it -77.241.224.0 - 77.241.239.255 nl +77.241.224.0 - 77.241.224.255 nl +77.241.225.0 - 77.241.225.255 eu +77.241.226.0 - 77.241.229.255 nl +77.241.230.0 - 77.241.230.255 eu +77.241.231.0 - 77.241.239.255 nl 77.241.240.0 - 77.242.15.255 ru 77.242.16.0 - 77.242.31.255 al 77.242.32.0 - 77.242.47.255 it @@ -35061,25 +18594,16 @@ 77.242.64.0 - 77.242.79.255 at 77.242.80.0 - 77.242.95.255 cz 77.242.96.0 - 77.242.111.255 ru -77.242.112.0 - 77.242.127.255 nl +77.242.112.0 - 77.242.114.173 nl +77.242.114.174 - 77.242.114.174 eu +77.242.114.175 - 77.242.127.255 nl 77.242.128.0 - 77.242.143.255 it 77.242.144.0 - 77.242.159.255 hu 77.242.160.0 - 77.242.175.255 ua 77.242.176.0 - 77.242.191.255 it -77.242.192.0 - 77.242.195.255 us -77.242.196.0 - 77.242.197.255 gb -77.242.198.0 - 77.242.198.255 us -77.242.199.0 - 77.242.199.143 gb -77.242.199.144 - 77.242.199.159 fr -77.242.199.160 - 77.242.199.255 gb -77.242.200.0 - 77.242.201.63 fr -77.242.201.64 - 77.242.201.103 gb -77.242.201.104 - 77.242.201.111 us -77.242.201.112 - 77.242.202.7 gb -77.242.202.8 - 77.242.202.15 us -77.242.202.16 - 77.242.202.127 gb -77.242.202.128 - 77.242.202.223 us -77.242.202.224 - 77.242.207.255 gb +77.242.192.0 - 77.242.201.255 gb +77.242.202.0 - 77.242.202.255 fr +77.242.203.0 - 77.242.207.255 gb 77.242.208.0 - 77.242.223.255 sm 77.242.224.0 - 77.242.239.255 pl 77.242.240.0 - 77.242.255.255 gb @@ -35087,26 +18611,42 @@ 77.243.16.0 - 77.243.31.255 rs 77.243.32.0 - 77.243.63.255 dk 77.243.64.0 - 77.243.79.255 mt -77.243.80.0 - 77.243.95.255 kz 77.243.96.0 - 77.243.127.255 ru 77.243.128.0 - 77.243.143.255 dk 77.243.144.0 - 77.243.159.255 se 77.243.160.0 - 77.243.175.255 nl 77.243.176.0 - 77.243.176.255 eu 77.243.177.0 - 77.243.177.255 gb -77.243.178.0 - 77.243.184.255 eu -77.243.185.0 - 77.243.185.255 gb -77.243.186.0 - 77.243.186.255 de -77.243.187.0 - 77.243.187.255 es -77.243.188.0 - 77.243.188.255 de -77.243.189.0 - 77.243.189.255 nl -77.243.190.0 - 77.243.190.255 be -77.243.191.0 - 77.243.191.255 it -77.243.192.0 - 77.243.207.255 es +77.243.178.0 - 77.243.179.255 eu +77.243.180.0 - 77.243.180.255 nl +77.243.181.0 - 77.243.181.3 de +77.243.181.4 - 77.243.181.7 cz +77.243.181.8 - 77.243.181.15 de +77.243.181.16 - 77.243.181.35 cz +77.243.181.36 - 77.243.181.39 hu +77.243.181.40 - 77.243.181.43 cz +77.243.181.44 - 77.243.181.255 de +77.243.182.0 - 77.243.182.255 eu +77.243.183.0 - 77.243.183.255 de +77.243.184.0 - 77.243.184.64 gb +77.243.184.65 - 77.243.184.65 be +77.243.184.66 - 77.243.184.255 gb +77.243.185.0 - 77.243.187.255 eu +77.243.188.0 - 77.243.188.255 gb +77.243.189.0 - 77.243.189.23 nl +77.243.189.24 - 77.243.189.67 de +77.243.189.68 - 77.243.189.79 nl +77.243.189.80 - 77.243.189.91 de +77.243.189.92 - 77.243.189.131 nl +77.243.189.132 - 77.243.189.135 de +77.243.189.136 - 77.243.189.143 nl +77.243.189.144 - 77.243.189.167 de +77.243.189.168 - 77.243.189.255 nl +77.243.190.0 - 77.243.190.255 gb +77.243.191.0 - 77.243.191.255 eu +77.243.192.0 - 77.243.207.255 pt 77.243.208.0 - 77.243.223.255 hu -77.243.224.0 - 77.243.231.112 nl -77.243.231.113 - 77.243.231.113 se -77.243.231.114 - 77.243.239.255 nl +77.243.224.0 - 77.243.239.255 nl 77.243.240.0 - 77.243.255.255 ru 77.244.0.0 - 77.244.15.255 se 77.244.16.0 - 77.244.31.255 ru @@ -35114,47 +18654,22 @@ 77.244.48.0 - 77.244.63.255 ch 77.244.64.0 - 77.244.79.255 ru 77.244.80.0 - 77.244.95.255 it -77.244.96.0 - 77.244.96.87 de -77.244.96.88 - 77.244.96.91 lu -77.244.96.92 - 77.244.96.127 de -77.244.96.128 - 77.244.96.131 lu -77.244.96.132 - 77.244.96.135 a2 -77.244.96.136 - 77.244.96.159 de -77.244.96.160 - 77.244.96.163 lu -77.244.96.164 - 77.244.99.159 de -77.244.99.160 - 77.244.99.175 lu -77.244.99.176 - 77.244.99.223 de -77.244.99.224 - 77.244.99.227 a2 -77.244.99.228 - 77.244.108.63 de -77.244.108.64 - 77.244.108.71 lu -77.244.108.72 - 77.244.108.79 de -77.244.108.80 - 77.244.108.83 a2 -77.244.108.84 - 77.244.109.147 de -77.244.109.148 - 77.244.109.151 lu -77.244.109.152 - 77.244.109.159 de -77.244.109.160 - 77.244.109.175 lu -77.244.109.176 - 77.244.111.255 de +77.244.96.0 - 77.244.111.255 de 77.244.112.0 - 77.244.127.255 az 77.244.128.0 - 77.244.143.255 gb 77.244.144.0 - 77.244.159.255 tj 77.244.160.0 - 77.244.175.255 ru 77.244.176.0 - 77.244.191.255 it -77.244.192.0 - 77.244.197.127 dk -77.244.197.128 - 77.244.197.255 se -77.244.198.0 - 77.244.207.255 dk +77.244.192.0 - 77.244.207.255 bg 77.244.208.0 - 77.244.223.255 ru 77.244.224.0 - 77.244.239.255 se -77.244.240.0 - 77.244.254.223 at -77.244.254.224 - 77.244.254.231 de -77.244.254.232 - 77.244.255.255 at +77.244.240.0 - 77.244.255.255 at 77.245.0.0 - 77.245.15.255 jo -77.245.16.0 - 77.245.18.39 ch -77.245.18.40 - 77.245.18.47 dk -77.245.18.48 - 77.245.20.191 ch -77.245.20.192 - 77.245.20.255 im -77.245.21.0 - 77.245.31.255 ch +77.245.16.0 - 77.245.31.255 ch 77.245.32.0 - 77.245.47.255 de -77.245.48.0 - 77.245.63.255 nl +77.245.48.0 - 77.245.48.255 nl +77.245.49.0 - 77.245.49.31 gb +77.245.49.32 - 77.245.63.255 nl 77.245.64.0 - 77.245.79.255 gb 77.245.80.0 - 77.245.95.255 nl 77.245.96.0 - 77.245.111.255 kz @@ -35169,14 +18684,7 @@ 77.246.0.0 - 77.246.15.255 it 77.246.16.0 - 77.246.47.255 gb 77.246.48.0 - 77.246.55.255 zw -77.246.56.0 - 77.246.59.255 za -77.246.60.0 - 77.246.61.255 zw -77.246.62.0 - 77.246.62.63 za -77.246.62.64 - 77.246.62.127 bw -77.246.62.128 - 77.246.62.191 zm -77.246.62.192 - 77.246.62.255 mz -77.246.63.0 - 77.246.63.127 za -77.246.63.128 - 77.246.63.255 zm +77.246.56.0 - 77.246.63.255 gb 77.246.64.0 - 77.246.79.255 lb 77.246.80.0 - 77.246.95.255 fr 77.246.96.0 - 77.246.111.255 ru @@ -35188,32 +18696,16 @@ 77.246.192.0 - 77.246.207.255 fi 77.246.208.0 - 77.246.223.255 bg 77.246.224.0 - 77.246.255.255 ru -77.247.0.0 - 77.247.0.255 nl -77.247.1.0 - 77.247.1.255 fr -77.247.2.0 - 77.247.2.255 de -77.247.3.0 - 77.247.3.255 it -77.247.4.0 - 77.247.5.255 gb -77.247.6.0 - 77.247.6.255 cz -77.247.7.0 - 77.247.8.255 de -77.247.9.0 - 77.247.9.255 gb -77.247.10.0 - 77.247.10.255 ae -77.247.11.0 - 77.247.11.255 gb -77.247.12.0 - 77.247.12.255 se -77.247.13.0 - 77.247.13.255 be -77.247.14.0 - 77.247.14.255 es -77.247.15.0 - 77.247.15.255 fr +77.247.0.0 - 77.247.15.255 de 77.247.16.0 - 77.247.31.255 ua 77.247.32.0 - 77.247.63.255 ru 77.247.64.0 - 77.247.79.255 dk -77.247.96.0 - 77.247.111.255 gr -77.247.112.0 - 77.247.143.255 ru +77.247.80.0 - 77.247.87.255 de +77.247.88.0 - 77.247.95.255 al +77.247.128.0 - 77.247.143.255 ru 77.247.144.0 - 77.247.159.255 no 77.247.160.0 - 77.247.175.255 ru -77.247.176.0 - 77.247.179.31 nl -77.247.179.32 - 77.247.179.63 fr -77.247.179.64 - 77.247.182.191 nl -77.247.182.192 - 77.247.182.207 sc -77.247.182.208 - 77.247.183.255 nl +77.247.176.0 - 77.247.183.255 nl 77.247.184.0 - 77.247.191.255 ru 77.247.192.0 - 77.247.199.255 gb 77.247.200.0 - 77.247.207.255 rs @@ -35232,8 +18724,7 @@ 78.20.0.0 - 78.23.255.255 be 78.24.0.0 - 78.24.7.255 ru 78.24.8.0 - 78.24.15.255 cz -78.24.16.0 - 78.24.22.255 ie -78.24.23.0 - 78.24.23.255 gb +78.24.16.0 - 78.24.23.255 ie 78.24.24.0 - 78.24.31.255 ru 78.24.32.0 - 78.24.39.255 fr 78.24.40.0 - 78.24.47.255 ru @@ -35242,10 +18733,6 @@ 78.24.64.0 - 78.24.71.255 hu 78.24.72.0 - 78.24.79.255 ua 78.24.80.0 - 78.24.87.255 it -78.24.88.0 - 78.24.95.255 no -78.24.96.0 - 78.24.99.255 nl -78.24.100.0 - 78.24.100.255 mk -78.24.101.0 - 78.24.103.255 nl 78.24.104.0 - 78.24.111.255 rs 78.24.112.0 - 78.24.119.255 gb 78.24.120.0 - 78.24.127.255 be @@ -35258,173 +18745,8 @@ 78.24.176.0 - 78.24.183.255 ru 78.24.184.0 - 78.24.191.255 hu 78.24.192.0 - 78.24.199.255 ee -78.24.200.0 - 78.24.200.15 fr -78.24.200.16 - 78.24.200.31 es -78.24.200.32 - 78.24.200.47 it -78.24.200.48 - 78.24.200.63 at -78.24.200.64 - 78.24.200.79 pt -78.24.200.80 - 78.24.200.95 nl -78.24.200.96 - 78.24.200.111 gb -78.24.200.112 - 78.24.200.127 gr -78.24.200.128 - 78.24.200.143 cl -78.24.200.144 - 78.24.200.159 be -78.24.200.160 - 78.24.200.175 mx -78.24.200.176 - 78.24.200.191 ar -78.24.200.192 - 78.24.200.207 pl -78.24.200.208 - 78.24.200.223 ie -78.24.200.224 - 78.24.200.239 ch -78.24.200.240 - 78.24.200.255 ru -78.24.201.0 - 78.24.201.15 be -78.24.201.16 - 78.24.201.31 br -78.24.201.32 - 78.24.201.47 cz -78.24.201.48 - 78.24.201.63 hk -78.24.201.64 - 78.24.201.79 lu -78.24.201.80 - 78.24.201.95 cn -78.24.201.96 - 78.24.201.111 ph -78.24.201.112 - 78.24.201.127 ch -78.24.201.128 - 78.24.201.143 jp -78.24.201.144 - 78.24.201.159 pe -78.24.201.160 - 78.24.201.175 de -78.24.201.176 - 78.24.201.191 ca -78.24.201.192 - 78.24.201.207 cr -78.24.201.208 - 78.24.201.223 in -78.24.201.224 - 78.24.201.239 us -78.24.201.240 - 78.24.201.255 ca -78.24.202.0 - 78.24.202.7 be -78.24.202.8 - 78.24.202.15 br -78.24.202.16 - 78.24.202.23 cz -78.24.202.24 - 78.24.202.31 hk -78.24.202.32 - 78.24.202.39 lu -78.24.202.40 - 78.24.202.47 cn -78.24.202.48 - 78.24.202.55 ph -78.24.202.56 - 78.24.202.63 ch -78.24.202.64 - 78.24.202.71 jp -78.24.202.72 - 78.24.202.79 pe -78.24.202.80 - 78.24.202.87 de -78.24.202.88 - 78.24.202.95 ca -78.24.202.96 - 78.24.202.103 cr -78.24.202.104 - 78.24.202.111 in -78.24.202.112 - 78.24.202.119 us -78.24.202.120 - 78.24.202.127 ca -78.24.202.128 - 78.24.202.135 fr -78.24.202.136 - 78.24.202.143 es -78.24.202.144 - 78.24.202.151 it -78.24.202.152 - 78.24.202.159 at -78.24.202.160 - 78.24.202.167 pt -78.24.202.168 - 78.24.202.175 nl -78.24.202.176 - 78.24.202.183 gb -78.24.202.184 - 78.24.202.191 gr -78.24.202.192 - 78.24.202.199 cl -78.24.202.200 - 78.24.202.207 be -78.24.202.208 - 78.24.202.215 mx -78.24.202.216 - 78.24.202.223 ar -78.24.202.224 - 78.24.202.231 pl -78.24.202.232 - 78.24.202.239 ie -78.24.202.240 - 78.24.202.247 ch -78.24.202.248 - 78.24.202.255 ru -78.24.203.0 - 78.24.203.7 be -78.24.203.8 - 78.24.203.15 br -78.24.203.16 - 78.24.203.23 cz -78.24.203.24 - 78.24.203.31 hk -78.24.203.32 - 78.24.203.39 lu -78.24.203.40 - 78.24.203.47 cn -78.24.203.48 - 78.24.203.55 ph -78.24.203.56 - 78.24.203.63 ch -78.24.203.64 - 78.24.203.71 jp -78.24.203.72 - 78.24.203.79 pe -78.24.203.80 - 78.24.203.87 de -78.24.203.88 - 78.24.203.95 ca -78.24.203.96 - 78.24.203.103 cr -78.24.203.104 - 78.24.203.111 in -78.24.203.112 - 78.24.203.119 us -78.24.203.120 - 78.24.203.127 ca -78.24.203.128 - 78.24.203.135 fr -78.24.203.136 - 78.24.203.143 es -78.24.203.144 - 78.24.203.151 it -78.24.203.152 - 78.24.203.159 at -78.24.203.160 - 78.24.203.167 pt -78.24.203.168 - 78.24.203.175 nl -78.24.203.176 - 78.24.203.183 gb -78.24.203.184 - 78.24.203.191 gr -78.24.203.192 - 78.24.203.199 cl -78.24.203.200 - 78.24.203.207 be -78.24.203.208 - 78.24.203.215 mx -78.24.203.216 - 78.24.203.223 ar -78.24.203.224 - 78.24.203.231 pl -78.24.203.232 - 78.24.203.239 ie -78.24.203.240 - 78.24.203.247 ch -78.24.203.248 - 78.24.203.255 ru -78.24.204.0 - 78.24.204.15 tr -78.24.204.16 - 78.24.204.31 se -78.24.204.32 - 78.24.204.47 no -78.24.204.48 - 78.24.204.63 dk -78.24.204.64 - 78.24.204.79 lv -78.24.204.80 - 78.24.204.95 bg -78.24.204.96 - 78.24.204.111 ua -78.24.204.112 - 78.24.204.127 ch -78.24.204.128 - 78.24.204.143 za -78.24.204.144 - 78.24.204.159 lu -78.24.204.160 - 78.24.204.175 uy -78.24.204.176 - 78.24.204.191 pa -78.24.204.192 - 78.24.204.207 my -78.24.204.208 - 78.24.204.223 co -78.24.204.224 - 78.24.204.239 sg -78.24.204.240 - 78.24.204.255 us -78.24.205.0 - 78.24.205.15 ro -78.24.205.16 - 78.24.205.31 lt -78.24.205.32 - 78.24.205.47 bo -78.24.205.48 - 78.24.205.63 hu -78.24.205.64 - 78.24.205.79 fi -78.24.205.80 - 78.24.205.95 il -78.24.205.96 - 78.24.205.111 au -78.24.205.112 - 78.24.205.127 nz -78.24.205.128 - 78.24.205.143 ve -78.24.205.144 - 78.24.205.159 cr -78.24.205.160 - 78.24.205.175 ma -78.24.205.176 - 78.24.205.191 id -78.24.205.192 - 78.24.205.207 sk -78.24.205.208 - 78.24.205.223 tw -78.24.205.224 - 78.24.205.239 pa -78.24.205.240 - 78.24.205.255 us -78.24.206.0 - 78.24.206.7 be -78.24.206.8 - 78.24.206.15 br -78.24.206.16 - 78.24.206.39 fr -78.24.206.40 - 78.24.206.47 cn -78.24.206.48 - 78.24.206.55 fr -78.24.206.56 - 78.24.206.63 ch -78.24.206.64 - 78.24.206.71 jp -78.24.206.72 - 78.24.206.79 pe -78.24.206.80 - 78.24.206.87 de -78.24.206.88 - 78.24.206.95 ca -78.24.206.96 - 78.24.206.103 cr -78.24.206.104 - 78.24.206.111 in -78.24.206.112 - 78.24.206.119 us -78.24.206.120 - 78.24.206.127 ca -78.24.206.128 - 78.24.206.135 fr -78.24.206.136 - 78.24.206.143 es -78.24.206.144 - 78.24.206.151 it -78.24.206.152 - 78.24.206.159 at -78.24.206.160 - 78.24.206.167 pt -78.24.206.168 - 78.24.206.175 nl -78.24.206.176 - 78.24.206.183 gb -78.24.206.184 - 78.24.206.191 gr -78.24.206.192 - 78.24.206.199 cl -78.24.206.200 - 78.24.206.207 be -78.24.206.208 - 78.24.206.215 mx -78.24.206.216 - 78.24.206.223 ar -78.24.206.224 - 78.24.206.231 pl -78.24.206.232 - 78.24.206.239 ie -78.24.206.240 - 78.24.206.247 ch -78.24.206.248 - 78.24.206.255 ru -78.24.207.0 - 78.24.207.255 ch -78.24.208.0 - 78.24.208.255 im -78.24.209.0 - 78.24.209.63 gb -78.24.209.64 - 78.24.211.47 im -78.24.211.48 - 78.24.211.71 gg -78.24.211.72 - 78.24.212.127 im -78.24.212.128 - 78.24.212.159 gg -78.24.212.160 - 78.24.213.255 im -78.24.214.0 - 78.24.215.255 mt +78.24.200.0 - 78.24.207.255 za +78.24.208.0 - 78.24.215.255 im 78.24.216.0 - 78.24.231.255 ru 78.24.232.0 - 78.24.239.255 cz 78.24.240.0 - 78.24.247.255 fr @@ -35450,7 +18772,8 @@ 78.30.128.0 - 78.30.191.255 rs 78.30.192.0 - 78.30.255.255 ua 78.31.0.0 - 78.31.7.255 ru -78.31.8.0 - 78.31.15.255 lu +78.31.8.0 - 78.31.11.255 gb +78.31.12.0 - 78.31.15.255 se 78.31.16.0 - 78.31.23.255 ru 78.31.24.0 - 78.31.31.255 cz 78.31.32.0 - 78.31.39.255 dk @@ -35467,47 +18790,62 @@ 78.31.120.0 - 78.31.127.255 pl 78.31.128.0 - 78.31.135.255 ro 78.31.136.0 - 78.31.159.255 pl -78.31.160.0 - 78.31.167.255 ro +78.31.160.0 - 78.31.161.255 ru +78.31.162.0 - 78.31.163.255 pl +78.31.164.0 - 78.31.164.255 ro +78.31.165.0 - 78.31.165.255 se +78.31.166.0 - 78.31.167.255 pl 78.31.168.0 - 78.31.175.255 de 78.31.176.0 - 78.31.199.255 ua -78.31.200.0 - 78.31.223.255 ru +78.31.200.0 - 78.31.207.255 ru +78.31.208.0 - 78.31.208.255 gb +78.31.209.0 - 78.31.209.255 pl +78.31.210.0 - 78.31.210.255 ru +78.31.211.0 - 78.31.211.255 gb +78.31.212.0 - 78.31.212.191 ie +78.31.212.192 - 78.31.212.207 gb +78.31.212.208 - 78.31.213.207 ie +78.31.213.208 - 78.31.213.223 de +78.31.213.224 - 78.31.213.239 nl +78.31.213.240 - 78.31.213.255 ie +78.31.214.0 - 78.31.215.255 pl +78.31.216.0 - 78.31.223.255 ru 78.31.224.0 - 78.31.231.255 lt 78.31.232.0 - 78.31.239.255 ua 78.31.240.0 - 78.31.247.255 ru 78.31.248.0 - 78.31.255.255 ua 78.32.0.0 - 78.33.255.255 gb -78.34.0.0 - 78.35.255.255 de +78.34.0.0 - 78.35.17.143 de +78.35.17.144 - 78.35.17.159 es +78.35.17.160 - 78.35.255.255 de 78.36.0.0 - 78.37.255.255 ru 78.38.0.0 - 78.39.255.255 ir 78.40.0.0 - 78.40.7.255 mk 78.40.8.0 - 78.40.15.255 it 78.40.16.0 - 78.40.23.255 gb 78.40.24.0 - 78.40.31.255 ru -78.40.32.0 - 78.40.39.255 gb +78.40.32.0 - 78.40.35.199 gb +78.40.35.200 - 78.40.35.207 it +78.40.35.208 - 78.40.37.127 gb +78.40.37.128 - 78.40.37.135 it +78.40.37.136 - 78.40.37.247 gb +78.40.37.248 - 78.40.37.255 it +78.40.38.0 - 78.40.39.255 gb 78.40.40.0 - 78.40.47.255 se 78.40.48.0 - 78.40.55.255 fr 78.40.56.0 - 78.40.71.255 gb -78.40.72.0 - 78.40.72.255 fr -78.40.73.0 - 78.40.74.127 ch -78.40.74.128 - 78.40.74.143 fr -78.40.74.144 - 78.40.74.175 ch -78.40.74.176 - 78.40.74.191 be -78.40.74.192 - 78.40.75.127 ch -78.40.75.128 - 78.40.75.191 fr -78.40.75.192 - 78.40.76.127 ch -78.40.76.128 - 78.40.76.255 fr -78.40.77.0 - 78.40.77.119 ch -78.40.77.120 - 78.40.77.127 fr -78.40.77.128 - 78.40.77.191 ch -78.40.77.192 - 78.40.79.255 fr +78.40.72.0 - 78.40.72.15 ch +78.40.72.16 - 78.40.72.47 fr +78.40.72.48 - 78.40.79.255 ch 78.40.80.0 - 78.40.87.255 ru 78.40.88.0 - 78.40.95.255 fr 78.40.96.0 - 78.40.103.255 be -78.40.104.0 - 78.40.111.255 ru +78.40.104.0 - 78.40.107.255 ru +78.40.108.0 - 78.40.109.255 kz +78.40.110.0 - 78.40.110.255 ru +78.40.111.0 - 78.40.111.255 ie 78.40.112.0 - 78.40.119.255 gb -78.40.120.0 - 78.40.126.127 fr -78.40.126.128 - 78.40.126.159 ru -78.40.126.160 - 78.40.127.255 fr +78.40.120.0 - 78.40.127.255 fr 78.40.128.0 - 78.40.135.255 it 78.40.136.0 - 78.40.139.255 bg 78.40.140.0 - 78.40.140.255 mk @@ -35518,24 +18856,25 @@ 78.40.184.0 - 78.40.191.255 ru 78.40.192.0 - 78.40.199.255 nl 78.40.200.0 - 78.40.207.255 it -78.40.208.0 - 78.40.212.255 eu -78.40.213.0 - 78.40.215.255 at +78.40.208.0 - 78.40.215.255 eu 78.40.216.0 - 78.40.223.255 ru 78.40.224.0 - 78.40.231.255 tr 78.40.232.0 - 78.40.247.255 gb 78.40.248.0 - 78.40.255.255 is -78.41.0.0 - 78.41.7.207 gb -78.41.7.208 - 78.41.7.208 je -78.41.7.209 - 78.41.7.255 gb +78.41.0.0 - 78.41.2.255 gb +78.41.3.0 - 78.41.3.255 gg +78.41.4.0 - 78.41.4.255 gb +78.41.5.0 - 78.41.5.255 gg +78.41.6.0 - 78.41.7.255 gb 78.41.8.0 - 78.41.23.255 cz -78.41.24.0 - 78.41.31.255 pl +78.41.24.0 - 78.41.28.255 pl +78.41.29.0 - 78.41.29.255 a2 +78.41.30.0 - 78.41.31.255 pl 78.41.32.0 - 78.41.39.255 ru 78.41.40.0 - 78.41.47.255 fr -78.41.48.0 - 78.41.55.255 it 78.41.56.0 - 78.41.63.255 lb 78.41.64.0 - 78.41.71.255 be 78.41.72.0 - 78.41.79.255 nl -78.41.80.0 - 78.41.87.255 de 78.41.88.0 - 78.41.111.255 ru 78.41.112.0 - 78.41.119.255 at 78.41.120.0 - 78.41.127.255 no @@ -35546,73 +18885,24 @@ 78.41.160.0 - 78.41.167.255 fr 78.41.168.0 - 78.41.175.255 sk 78.41.176.0 - 78.41.183.255 ru -78.41.184.0 - 78.41.184.255 gb -78.41.185.0 - 78.41.185.255 fr -78.41.186.0 - 78.41.186.255 it -78.41.187.0 - 78.41.189.55 fr -78.41.189.56 - 78.41.189.63 es -78.41.189.64 - 78.41.191.255 fr +78.41.184.0 - 78.41.191.255 fr 78.41.192.0 - 78.41.199.255 ru 78.41.200.0 - 78.41.207.255 nl 78.41.208.0 - 78.41.215.255 gb 78.41.216.0 - 78.41.223.255 de -78.41.224.0 - 78.41.224.127 gn -78.41.224.128 - 78.41.224.255 ga -78.41.225.0 - 78.41.225.255 mm -78.41.226.0 - 78.41.226.31 ug -78.41.226.32 - 78.41.226.63 cd -78.41.226.64 - 78.41.226.95 sl -78.41.226.96 - 78.41.226.127 lr -78.41.226.128 - 78.41.226.159 us -78.41.226.160 - 78.41.226.191 dk -78.41.226.192 - 78.41.226.207 lr -78.41.226.208 - 78.41.226.215 de -78.41.226.216 - 78.41.226.223 ng -78.41.226.224 - 78.41.226.247 a2 -78.41.226.248 - 78.41.226.255 de -78.41.227.0 - 78.41.227.31 bj -78.41.227.32 - 78.41.227.63 et -78.41.227.64 - 78.41.227.79 a2 -78.41.227.80 - 78.41.227.87 de -78.41.227.88 - 78.41.227.95 a2 -78.41.227.96 - 78.41.227.127 pg -78.41.227.128 - 78.41.227.135 a2 -78.41.227.136 - 78.41.227.167 ng -78.41.227.168 - 78.41.227.175 af -78.41.227.176 - 78.41.227.207 ng -78.41.227.208 - 78.41.227.223 et -78.41.227.224 - 78.41.227.239 ng -78.41.227.240 - 78.41.227.255 a2 -78.41.228.0 - 78.41.228.127 bd -78.41.228.128 - 78.41.228.255 cf -78.41.229.0 - 78.41.229.127 tz -78.41.229.128 - 78.41.229.255 pg -78.41.230.0 - 78.41.230.127 np -78.41.230.128 - 78.41.230.255 gm -78.41.231.0 - 78.41.231.127 pt -78.41.231.128 - 78.41.231.255 bt +78.41.224.0 - 78.41.231.255 a2 78.41.232.0 - 78.41.239.255 fr 78.41.240.0 - 78.41.247.255 se -78.41.248.0 - 78.41.251.255 fr -78.41.252.0 - 78.41.252.15 es -78.41.252.16 - 78.41.255.255 fr +78.41.248.0 - 78.41.255.255 fr 78.42.0.0 - 78.43.255.255 de -78.44.0.0 - 78.45.255.255 cz -78.46.0.0 - 78.46.150.119 de -78.46.150.120 - 78.46.150.127 it -78.46.150.128 - 78.47.18.7 de -78.47.18.8 - 78.47.18.15 nl -78.47.18.16 - 78.47.204.143 de -78.47.204.144 - 78.47.204.151 it -78.47.204.152 - 78.47.212.127 de -78.47.212.128 - 78.47.212.135 es -78.47.212.136 - 78.47.212.151 de -78.47.212.152 - 78.47.212.159 es -78.47.212.160 - 78.47.251.15 de -78.47.251.16 - 78.47.251.23 it -78.47.251.24 - 78.55.255.255 de +78.44.0.0 - 78.45.83.215 cz +78.45.83.216 - 78.45.83.216 us +78.45.83.217 - 78.45.255.255 cz +78.46.0.0 - 78.55.255.255 de 78.56.0.0 - 78.63.255.255 lt -78.64.0.0 - 78.79.255.255 se +78.64.0.0 - 78.72.148.255 se +78.72.149.0 - 78.72.149.255 dk +78.72.150.0 - 78.79.255.255 se 78.80.0.0 - 78.80.255.255 cz 78.81.0.0 - 78.81.255.255 ru 78.82.0.0 - 78.82.255.255 se @@ -35622,13 +18912,16 @@ 78.86.0.0 - 78.86.255.255 gb 78.87.0.0 - 78.87.255.255 gr 78.88.0.0 - 78.88.255.255 pl -78.89.0.0 - 78.89.255.255 kw +78.89.0.0 - 78.89.132.255 kw +78.89.133.0 - 78.89.133.255 us +78.89.134.0 - 78.89.255.255 kw 78.90.0.0 - 78.90.255.255 bg 78.91.0.0 - 78.91.255.255 no 78.92.0.0 - 78.92.255.255 hu 78.93.0.0 - 78.93.255.255 sa 78.94.0.0 - 78.94.255.255 de -78.95.0.0 - 78.97.255.255 ro +78.95.0.0 - 78.95.255.255 sa +78.96.0.0 - 78.97.255.255 ro 78.98.0.0 - 78.99.255.255 sk 78.100.0.0 - 78.101.255.255 qa 78.102.0.0 - 78.103.255.255 cz @@ -35642,132 +18935,26 @@ 78.108.64.0 - 78.108.95.255 ru 78.108.96.0 - 78.108.111.255 cz 78.108.112.0 - 78.108.127.255 eu -78.108.128.0 - 78.108.143.255 nl +78.108.128.0 - 78.108.137.255 nl +78.108.138.0 - 78.108.138.255 be +78.108.139.0 - 78.108.143.255 nl 78.108.144.0 - 78.108.159.255 cz 78.108.160.0 - 78.108.175.255 lb -78.108.176.0 - 78.108.189.255 cz -78.108.190.0 - 78.108.190.127 es -78.108.190.128 - 78.108.191.255 cz +78.108.176.0 - 78.108.191.255 cz 78.108.192.0 - 78.108.207.255 ru -78.108.208.0 - 78.108.223.255 kz 78.108.224.0 - 78.108.239.255 fr 78.108.240.0 - 78.108.255.255 bg -78.109.0.0 - 78.109.15.255 nl -78.109.16.0 - 78.109.16.15 ua -78.109.16.16 - 78.109.16.31 na -78.109.16.32 - 78.109.16.135 ua -78.109.16.136 - 78.109.16.143 na -78.109.16.144 - 78.109.16.207 ua -78.109.16.208 - 78.109.16.215 na -78.109.16.216 - 78.109.16.223 ua -78.109.16.224 - 78.109.16.231 na -78.109.16.232 - 78.109.17.15 ua -78.109.17.16 - 78.109.17.23 na -78.109.17.24 - 78.109.17.95 ua -78.109.17.96 - 78.109.17.103 na -78.109.17.104 - 78.109.18.95 ua -78.109.18.96 - 78.109.18.103 na -78.109.18.104 - 78.109.18.111 ua -78.109.18.112 - 78.109.18.119 na -78.109.18.120 - 78.109.19.63 ua -78.109.19.64 - 78.109.19.71 na -78.109.19.72 - 78.109.19.87 ua -78.109.19.88 - 78.109.19.95 na -78.109.19.96 - 78.109.19.111 ua -78.109.19.112 - 78.109.19.127 na -78.109.19.128 - 78.109.19.135 ua -78.109.19.136 - 78.109.19.143 na -78.109.19.144 - 78.109.20.23 ua -78.109.20.24 - 78.109.20.31 na -78.109.20.32 - 78.109.20.247 ua -78.109.20.248 - 78.109.20.255 na -78.109.21.0 - 78.109.21.111 ua -78.109.21.112 - 78.109.21.119 na -78.109.21.120 - 78.109.21.167 ua -78.109.21.168 - 78.109.21.175 na -78.109.21.176 - 78.109.21.223 ua -78.109.21.224 - 78.109.21.231 na -78.109.21.232 - 78.109.22.31 ua -78.109.22.32 - 78.109.22.47 na -78.109.22.48 - 78.109.22.55 ua -78.109.22.56 - 78.109.22.63 na -78.109.22.64 - 78.109.22.127 ua -78.109.22.128 - 78.109.22.135 na -78.109.22.136 - 78.109.23.7 ua -78.109.23.8 - 78.109.23.15 na -78.109.23.16 - 78.109.23.31 ua -78.109.23.32 - 78.109.23.39 na -78.109.23.40 - 78.109.23.63 ua -78.109.23.64 - 78.109.23.71 na -78.109.23.72 - 78.109.23.143 ua -78.109.23.144 - 78.109.23.151 na -78.109.23.152 - 78.109.23.159 ua -78.109.23.160 - 78.109.23.167 na -78.109.23.168 - 78.109.23.239 ua -78.109.23.240 - 78.109.23.247 na -78.109.23.248 - 78.109.24.47 ua -78.109.24.48 - 78.109.24.63 na -78.109.24.64 - 78.109.24.87 ua -78.109.24.88 - 78.109.24.95 na -78.109.24.96 - 78.109.24.167 ua -78.109.24.168 - 78.109.24.183 na -78.109.24.184 - 78.109.25.31 ua -78.109.25.32 - 78.109.25.39 na -78.109.25.40 - 78.109.25.215 ua -78.109.25.216 - 78.109.25.223 na -78.109.25.224 - 78.109.25.247 ua -78.109.25.248 - 78.109.25.255 na -78.109.26.0 - 78.109.28.23 ua -78.109.28.24 - 78.109.28.31 na -78.109.28.32 - 78.109.28.47 ua -78.109.28.48 - 78.109.28.55 na -78.109.28.56 - 78.109.28.71 ua -78.109.28.72 - 78.109.28.79 na -78.109.28.80 - 78.109.28.95 ua -78.109.28.96 - 78.109.28.103 na -78.109.28.104 - 78.109.28.111 ua -78.109.28.112 - 78.109.28.119 na -78.109.28.120 - 78.109.28.135 ua -78.109.28.136 - 78.109.28.143 na -78.109.28.144 - 78.109.28.215 ua -78.109.28.216 - 78.109.28.223 na -78.109.28.224 - 78.109.28.239 ua -78.109.28.240 - 78.109.28.247 na -78.109.28.248 - 78.109.29.7 ua -78.109.29.8 - 78.109.29.15 na -78.109.29.16 - 78.109.29.23 ua -78.109.29.24 - 78.109.29.55 na -78.109.29.56 - 78.109.29.199 ua -78.109.29.200 - 78.109.29.207 na -78.109.29.208 - 78.109.30.3 ua -78.109.30.4 - 78.109.30.7 na -78.109.30.8 - 78.109.30.31 ua -78.109.30.32 - 78.109.30.39 by -78.109.30.40 - 78.109.30.63 ua -78.109.30.64 - 78.109.30.79 na -78.109.30.80 - 78.109.30.87 ua -78.109.30.88 - 78.109.30.119 na -78.109.30.120 - 78.109.30.143 ua -78.109.30.144 - 78.109.30.159 na -78.109.30.160 - 78.109.30.183 ua -78.109.30.184 - 78.109.30.191 us -78.109.30.192 - 78.109.30.239 ua -78.109.30.240 - 78.109.30.255 na -78.109.31.0 - 78.109.31.31 ua -78.109.31.32 - 78.109.31.47 ru -78.109.31.48 - 78.109.31.55 na -78.109.31.56 - 78.109.31.215 ua -78.109.31.216 - 78.109.31.223 na -78.109.31.224 - 78.109.31.255 ua +78.109.0.0 - 78.109.10.255 nl +78.109.11.0 - 78.109.11.255 eu +78.109.12.0 - 78.109.13.255 nl +78.109.14.0 - 78.109.14.255 eu +78.109.15.0 - 78.109.15.255 nl +78.109.16.0 - 78.109.31.255 ua 78.109.32.0 - 78.109.47.255 ru 78.109.48.0 - 78.109.55.255 az -78.109.56.0 - 78.109.56.255 de -78.109.57.0 - 78.109.57.255 pl -78.109.58.0 - 78.109.63.255 de +78.109.56.0 - 78.109.63.255 de 78.109.64.0 - 78.109.79.255 am -78.109.80.0 - 78.109.95.0 fr -78.109.95.1 - 78.109.95.1 it -78.109.95.2 - 78.109.95.255 fr +78.109.80.0 - 78.109.95.255 fr 78.109.96.0 - 78.109.111.255 rs 78.109.112.0 - 78.109.143.255 ru 78.109.144.0 - 78.109.159.255 kz @@ -35775,12 +18962,9 @@ 78.109.192.0 - 78.109.207.255 ir 78.109.208.0 - 78.109.223.255 dk 78.109.224.0 - 78.109.239.255 iq -78.109.240.0 - 78.109.255.255 ru +78.109.240.0 - 78.109.255.255 fr 78.110.0.0 - 78.110.15.255 sa -78.110.16.0 - 78.110.16.255 cy -78.110.17.0 - 78.110.29.255 mt -78.110.30.0 - 78.110.30.255 cy -78.110.31.0 - 78.110.31.255 mt +78.110.16.0 - 78.110.31.255 mt 78.110.32.0 - 78.110.47.255 ee 78.110.48.0 - 78.110.63.255 ru 78.110.64.0 - 78.110.79.255 bh @@ -35789,9 +18973,7 @@ 78.110.112.0 - 78.110.127.255 ir 78.110.128.0 - 78.110.143.255 ch 78.110.144.0 - 78.110.159.255 ru -78.110.160.0 - 78.110.169.111 gb -78.110.169.112 - 78.110.169.127 es -78.110.169.128 - 78.110.175.255 gb +78.110.160.0 - 78.110.175.255 gb 78.110.176.0 - 78.110.191.255 it 78.110.192.0 - 78.110.207.255 be 78.110.208.0 - 78.110.223.255 cz @@ -35799,23 +18981,20 @@ 78.110.240.0 - 78.110.255.255 ru 78.111.0.0 - 78.111.15.255 ir 78.111.16.0 - 78.111.31.255 ua -78.111.32.0 - 78.111.39.255 ba -78.111.40.0 - 78.111.41.255 si -78.111.42.0 - 78.111.47.255 ba +78.111.32.0 - 78.111.47.255 ba 78.111.48.0 - 78.111.63.255 az 78.111.64.0 - 78.111.79.255 de 78.111.80.0 - 78.111.95.255 ru 78.111.96.0 - 78.111.111.255 tr 78.111.112.0 - 78.111.127.255 cz -78.111.128.0 - 78.111.129.255 de -78.111.130.0 - 78.111.130.255 lb -78.111.131.0 - 78.111.131.255 de -78.111.132.0 - 78.111.132.255 lb -78.111.133.0 - 78.111.143.255 de +78.111.128.0 - 78.111.143.255 de 78.111.144.0 - 78.111.159.255 ru 78.111.160.0 - 78.111.175.255 dk -78.111.176.0 - 78.111.191.255 ua -78.111.192.0 - 78.111.207.255 gg +78.111.176.0 - 78.111.186.70 ua +78.111.186.71 - 78.111.186.71 ru +78.111.186.72 - 78.111.191.255 ua +78.111.192.0 - 78.111.193.255 gb +78.111.194.0 - 78.111.207.255 gg 78.111.208.0 - 78.111.223.255 ua 78.111.224.0 - 78.111.239.255 de 78.111.240.0 - 78.111.255.255 ru @@ -35823,37 +19002,9 @@ 78.128.0.0 - 78.128.127.255 bg 78.128.128.0 - 78.128.255.255 cz 78.129.0.0 - 78.129.127.255 be -78.129.128.0 - 78.129.141.15 gb -78.129.141.16 - 78.129.141.31 ie -78.129.141.32 - 78.129.143.255 gb -78.129.144.0 - 78.129.144.255 us -78.129.145.0 - 78.129.160.255 gb -78.129.161.0 - 78.129.161.255 in -78.129.162.0 - 78.129.176.255 gb -78.129.177.0 - 78.129.177.255 ru -78.129.178.0 - 78.129.192.255 gb +78.129.128.0 - 78.129.192.255 gb 78.129.193.0 - 78.129.193.255 us -78.129.194.0 - 78.129.204.63 gb -78.129.204.64 - 78.129.204.127 ca -78.129.204.128 - 78.129.204.255 gb -78.129.205.0 - 78.129.205.255 it -78.129.206.0 - 78.129.218.255 gb -78.129.219.0 - 78.129.219.127 lv -78.129.219.128 - 78.129.228.255 gb -78.129.229.0 - 78.129.229.255 de -78.129.230.0 - 78.129.233.255 gb -78.129.234.0 - 78.129.234.255 ee -78.129.235.0 - 78.129.235.31 gb -78.129.235.32 - 78.129.235.63 ch -78.129.235.64 - 78.129.236.255 gb -78.129.237.0 - 78.129.237.255 se -78.129.238.0 - 78.129.246.127 gb -78.129.246.128 - 78.129.246.255 us -78.129.247.0 - 78.129.248.79 gb -78.129.248.80 - 78.129.248.95 fr -78.129.248.96 - 78.129.254.127 gb -78.129.254.128 - 78.129.254.255 ca -78.129.255.0 - 78.129.255.255 gb +78.129.194.0 - 78.129.255.255 gb 78.130.0.0 - 78.130.127.255 pt 78.130.128.0 - 78.130.255.255 bg 78.131.0.0 - 78.131.127.255 hu @@ -35866,863 +19017,70 @@ 78.134.128.0 - 78.134.255.255 hr 78.135.0.0 - 78.135.127.255 tr 78.135.128.0 - 78.135.255.255 ie -78.136.0.0 - 78.136.15.23 gb -78.136.15.24 - 78.136.15.31 a2 -78.136.15.32 - 78.136.63.255 gb +78.136.0.0 - 78.136.63.255 gb 78.136.64.0 - 78.136.127.255 es 78.136.128.0 - 78.136.191.255 cz 78.136.192.0 - 78.136.255.255 ru 78.137.0.0 - 78.137.63.255 ua -78.137.64.0 - 78.137.127.255 ru -78.137.128.0 - 78.137.139.255 ie -78.137.140.0 - 78.137.140.255 gb -78.137.141.0 - 78.137.153.255 ie -78.137.154.0 - 78.137.155.255 gb -78.137.156.0 - 78.137.156.255 ie -78.137.157.0 - 78.137.157.255 gb -78.137.158.0 - 78.137.162.111 ie -78.137.162.112 - 78.137.162.127 gb -78.137.162.128 - 78.137.162.223 ie -78.137.162.224 - 78.137.162.239 gb -78.137.162.240 - 78.137.163.15 ie -78.137.163.16 - 78.137.163.31 gb -78.137.163.32 - 78.137.172.95 ie -78.137.172.96 - 78.137.172.111 gb -78.137.172.112 - 78.137.172.159 ie -78.137.172.160 - 78.137.173.255 gb -78.137.174.0 - 78.137.178.47 ie -78.137.178.48 - 78.137.178.63 gb -78.137.178.64 - 78.137.178.143 ie -78.137.178.144 - 78.137.178.151 gb -78.137.178.152 - 78.137.179.255 ie -78.137.180.0 - 78.137.180.255 gb -78.137.181.0 - 78.137.187.255 ie -78.137.188.0 - 78.137.189.255 gb -78.137.190.0 - 78.137.190.103 ie -78.137.190.104 - 78.137.190.111 gb -78.137.190.112 - 78.137.190.127 ie -78.137.190.128 - 78.137.190.175 gb -78.137.190.176 - 78.137.190.215 ie -78.137.190.216 - 78.137.190.223 gb -78.137.190.224 - 78.137.191.255 ie +78.137.64.0 - 78.137.95.255 ye +78.137.96.0 - 78.137.103.255 de +78.137.104.0 - 78.137.111.255 ru +78.137.112.0 - 78.137.135.255 gb +78.137.136.0 - 78.137.139.255 ie +78.137.140.0 - 78.137.159.255 gb +78.137.160.0 - 78.137.160.255 ie +78.137.161.0 - 78.137.164.52 gb +78.137.164.53 - 78.137.164.53 ie +78.137.164.54 - 78.137.178.167 gb +78.137.178.168 - 78.137.178.175 ie +78.137.178.176 - 78.137.178.178 gb +78.137.178.179 - 78.137.178.179 ie +78.137.178.180 - 78.137.190.210 gb +78.137.190.211 - 78.137.190.211 ie +78.137.190.212 - 78.137.191.255 gb 78.137.192.0 - 78.137.255.255 pt -78.138.0.0 - 78.138.0.7 a2 -78.138.0.8 - 78.138.0.15 cd -78.138.0.16 - 78.138.0.23 a2 -78.138.0.24 - 78.138.0.39 gh -78.138.0.40 - 78.138.0.47 a2 -78.138.0.48 - 78.138.0.55 gh -78.138.0.56 - 78.138.0.63 a2 -78.138.0.64 - 78.138.0.71 lr -78.138.0.72 - 78.138.0.95 ng -78.138.0.96 - 78.138.0.143 a2 -78.138.0.144 - 78.138.0.151 ng -78.138.0.152 - 78.138.0.183 a2 -78.138.0.184 - 78.138.0.191 ao -78.138.0.192 - 78.138.0.199 gh -78.138.0.200 - 78.138.0.223 a2 -78.138.0.224 - 78.138.0.231 gh -78.138.0.232 - 78.138.0.239 a2 -78.138.0.240 - 78.138.0.247 lr -78.138.0.248 - 78.138.1.31 a2 -78.138.1.32 - 78.138.1.39 ug -78.138.1.40 - 78.138.1.63 a2 -78.138.1.64 - 78.138.1.71 ao -78.138.1.72 - 78.138.1.79 a2 -78.138.1.80 - 78.138.1.87 ng -78.138.1.88 - 78.138.1.95 ao -78.138.1.96 - 78.138.1.103 ng -78.138.1.104 - 78.138.1.119 a2 -78.138.1.120 - 78.138.1.135 ng -78.138.1.136 - 78.138.1.143 a2 -78.138.1.144 - 78.138.1.159 ng -78.138.1.160 - 78.138.1.167 a2 -78.138.1.168 - 78.138.1.175 ng -78.138.1.176 - 78.138.1.191 a2 -78.138.1.192 - 78.138.1.199 gb -78.138.1.200 - 78.138.1.215 a2 -78.138.1.216 - 78.138.1.223 ng -78.138.1.224 - 78.138.1.239 a2 -78.138.1.240 - 78.138.2.7 ng -78.138.2.8 - 78.138.2.15 a2 -78.138.2.16 - 78.138.2.23 ng -78.138.2.24 - 78.138.2.31 ao -78.138.2.32 - 78.138.2.39 a2 -78.138.2.40 - 78.138.2.47 ng -78.138.2.48 - 78.138.2.95 a2 -78.138.2.96 - 78.138.2.103 td -78.138.2.104 - 78.138.2.111 gh -78.138.2.112 - 78.138.2.127 a2 -78.138.2.128 - 78.138.2.135 ng -78.138.2.136 - 78.138.2.159 a2 -78.138.2.160 - 78.138.2.167 gh -78.138.2.168 - 78.138.2.175 ng -78.138.2.176 - 78.138.2.223 a2 -78.138.2.224 - 78.138.2.239 ng -78.138.2.240 - 78.138.3.151 a2 -78.138.3.152 - 78.138.3.159 ng -78.138.3.160 - 78.138.3.167 a2 -78.138.3.168 - 78.138.3.175 ng -78.138.3.176 - 78.138.3.183 fr -78.138.3.184 - 78.138.3.191 za -78.138.3.192 - 78.138.3.199 us -78.138.3.200 - 78.138.3.207 ao -78.138.3.208 - 78.138.3.215 ng -78.138.3.216 - 78.138.3.223 a2 -78.138.3.224 - 78.138.3.231 ng -78.138.3.232 - 78.138.3.240 ug -78.138.3.241 - 78.138.4.255 a2 -78.138.5.0 - 78.138.5.7 gh -78.138.5.8 - 78.138.5.47 a2 -78.138.5.48 - 78.138.5.55 ao -78.138.5.56 - 78.138.5.71 ng -78.138.5.72 - 78.138.5.87 a2 -78.138.5.88 - 78.138.5.95 ci -78.138.5.96 - 78.138.5.103 a2 -78.138.5.104 - 78.138.5.111 bw -78.138.5.112 - 78.138.5.119 lr -78.138.5.120 - 78.138.5.127 a2 -78.138.5.128 - 78.138.5.143 ng -78.138.5.144 - 78.138.5.175 a2 -78.138.5.176 - 78.138.5.183 sl -78.138.5.184 - 78.138.5.207 a2 -78.138.5.208 - 78.138.5.215 ug -78.138.5.216 - 78.138.5.223 iq -78.138.5.224 - 78.138.5.255 a2 -78.138.6.0 - 78.138.6.7 ng -78.138.6.8 - 78.138.6.15 sl -78.138.6.16 - 78.138.6.39 a2 -78.138.6.40 - 78.138.6.47 ng -78.138.6.48 - 78.138.6.55 a2 -78.138.6.56 - 78.138.6.63 gh -78.138.6.64 - 78.138.6.95 ng -78.138.6.96 - 78.138.6.103 sl -78.138.6.104 - 78.138.6.111 a2 -78.138.6.112 - 78.138.6.119 ao -78.138.6.120 - 78.138.6.127 ng -78.138.6.128 - 78.138.6.135 a2 -78.138.6.136 - 78.138.6.143 ug -78.138.6.144 - 78.138.6.151 gh -78.138.6.152 - 78.138.6.159 cd -78.138.6.160 - 78.138.6.167 iq -78.138.6.168 - 78.138.6.175 mz -78.138.6.176 - 78.138.6.183 a2 -78.138.6.184 - 78.138.6.191 bj -78.138.6.192 - 78.138.6.199 a2 -78.138.6.200 - 78.138.6.207 ao -78.138.6.208 - 78.138.6.223 ng -78.138.6.224 - 78.138.6.231 a2 -78.138.6.232 - 78.138.6.239 lr -78.138.6.240 - 78.138.6.247 ug -78.138.6.248 - 78.138.7.7 a2 -78.138.7.8 - 78.138.7.15 ug -78.138.7.16 - 78.138.7.23 iq -78.138.7.24 - 78.138.7.31 a2 -78.138.7.32 - 78.138.7.47 ng -78.138.7.48 - 78.138.7.63 a2 -78.138.7.64 - 78.138.7.79 ng -78.138.7.80 - 78.138.7.87 a2 -78.138.7.88 - 78.138.7.95 ng -78.138.7.96 - 78.138.7.119 a2 -78.138.7.120 - 78.138.7.127 ng -78.138.7.128 - 78.138.7.159 a2 -78.138.7.160 - 78.138.7.167 lr -78.138.7.168 - 78.138.7.175 a2 -78.138.7.176 - 78.138.7.183 ng -78.138.7.184 - 78.138.7.199 a2 -78.138.7.200 - 78.138.7.207 ng -78.138.7.208 - 78.138.7.239 a2 -78.138.7.240 - 78.138.7.247 ng -78.138.7.248 - 78.138.7.255 a2 -78.138.8.0 - 78.138.8.7 lr -78.138.8.8 - 78.138.8.95 a2 -78.138.8.96 - 78.138.8.127 ug -78.138.8.128 - 78.138.8.135 a2 -78.138.8.136 - 78.138.8.143 cd -78.138.8.144 - 78.138.8.151 ng -78.138.8.152 - 78.138.8.191 a2 -78.138.8.192 - 78.138.8.199 ng -78.138.8.200 - 78.138.8.231 a2 -78.138.8.232 - 78.138.8.239 ng -78.138.8.240 - 78.138.8.247 a2 -78.138.8.248 - 78.138.8.255 ng -78.138.9.0 - 78.138.9.255 ge -78.138.10.0 - 78.138.10.255 cg -78.138.11.0 - 78.138.12.15 a2 -78.138.12.16 - 78.138.12.23 ng -78.138.12.24 - 78.138.12.31 gh -78.138.12.32 - 78.138.12.55 a2 -78.138.12.56 - 78.138.12.71 ng -78.138.12.72 - 78.138.12.95 a2 -78.138.12.96 - 78.138.12.103 lr -78.138.12.104 - 78.138.12.111 ng -78.138.12.112 - 78.138.12.175 a2 -78.138.12.176 - 78.138.12.215 ng -78.138.12.216 - 78.138.12.247 a2 -78.138.12.248 - 78.138.12.255 ng -78.138.13.0 - 78.138.13.31 sl -78.138.13.32 - 78.138.13.71 a2 -78.138.13.72 - 78.138.13.79 ng -78.138.13.80 - 78.138.13.87 ao -78.138.13.88 - 78.138.13.95 a2 -78.138.13.96 - 78.138.13.103 ng -78.138.13.104 - 78.138.13.111 a2 -78.138.13.112 - 78.138.13.119 ng -78.138.13.120 - 78.138.14.47 a2 -78.138.14.48 - 78.138.14.55 iq -78.138.14.56 - 78.138.14.63 a2 -78.138.14.64 - 78.138.14.71 ng -78.138.14.72 - 78.138.14.79 co -78.138.14.80 - 78.138.14.111 a2 -78.138.14.112 - 78.138.14.119 ci -78.138.14.120 - 78.138.14.143 ng -78.138.14.144 - 78.138.14.151 a2 -78.138.14.152 - 78.138.14.159 ug -78.138.14.160 - 78.138.14.167 ng -78.138.14.168 - 78.138.14.175 a2 -78.138.14.176 - 78.138.14.183 ng -78.138.14.184 - 78.138.14.191 gh -78.138.14.192 - 78.138.14.207 a2 -78.138.14.208 - 78.138.14.215 ng -78.138.14.216 - 78.138.14.231 ug -78.138.14.232 - 78.138.14.239 ng -78.138.14.240 - 78.138.14.247 a2 -78.138.14.248 - 78.138.14.255 ng -78.138.15.0 - 78.138.15.7 ao -78.138.15.8 - 78.138.15.23 a2 -78.138.15.24 - 78.138.15.47 ng -78.138.15.48 - 78.138.15.55 a2 -78.138.15.56 - 78.138.15.63 gh -78.138.15.64 - 78.138.15.71 a2 -78.138.15.72 - 78.138.15.79 gh -78.138.15.80 - 78.138.15.111 a2 -78.138.15.112 - 78.138.15.119 gh -78.138.15.120 - 78.138.15.127 a2 -78.138.15.128 - 78.138.15.135 gh -78.138.15.136 - 78.138.15.143 ng -78.138.15.144 - 78.138.15.159 a2 -78.138.15.160 - 78.138.15.167 ng -78.138.15.168 - 78.138.15.191 a2 -78.138.15.192 - 78.138.15.199 ng -78.138.15.200 - 78.138.15.207 cd -78.138.15.208 - 78.138.15.223 a2 -78.138.15.224 - 78.138.15.231 ng -78.138.15.232 - 78.138.15.240 a2 -78.138.15.241 - 78.138.15.247 ng -78.138.15.248 - 78.138.17.7 a2 -78.138.17.8 - 78.138.17.23 ng -78.138.17.24 - 78.138.17.71 a2 -78.138.17.72 - 78.138.17.79 ci -78.138.17.80 - 78.138.17.87 a2 -78.138.17.88 - 78.138.17.95 ci -78.138.17.96 - 78.138.17.111 a2 -78.138.17.112 - 78.138.17.119 ng -78.138.17.120 - 78.138.17.127 a2 -78.138.17.128 - 78.138.17.135 ng -78.138.17.136 - 78.138.17.151 a2 -78.138.17.152 - 78.138.17.159 ng -78.138.17.160 - 78.138.17.167 a2 -78.138.17.168 - 78.138.17.175 bw -78.138.17.176 - 78.138.17.191 a2 -78.138.17.192 - 78.138.17.199 ng -78.138.17.200 - 78.138.17.207 a2 -78.138.17.208 - 78.138.17.215 ng -78.138.17.216 - 78.138.17.223 ci -78.138.17.224 - 78.138.17.231 ng -78.138.17.232 - 78.138.17.239 iq -78.138.17.240 - 78.138.17.247 ug -78.138.17.248 - 78.138.18.15 a2 -78.138.18.16 - 78.138.18.23 zw -78.138.18.24 - 78.138.18.63 ng -78.138.18.64 - 78.138.18.103 a2 -78.138.18.104 - 78.138.18.111 ng -78.138.18.112 - 78.138.18.119 lr -78.138.18.120 - 78.138.18.127 a2 -78.138.18.128 - 78.138.18.143 ng -78.138.18.144 - 78.138.18.159 a2 -78.138.18.160 - 78.138.18.167 ng -78.138.18.168 - 78.138.18.183 a2 -78.138.18.184 - 78.138.18.191 gh -78.138.18.192 - 78.138.18.223 a2 -78.138.18.224 - 78.138.18.247 ng -78.138.18.248 - 78.138.18.255 ao -78.138.19.0 - 78.138.19.7 lr -78.138.19.8 - 78.138.19.39 a2 -78.138.19.40 - 78.138.19.47 ng -78.138.19.48 - 78.138.19.79 a2 -78.138.19.80 - 78.138.19.87 ao -78.138.19.88 - 78.138.19.103 a2 -78.138.19.104 - 78.138.19.127 ng -78.138.19.128 - 78.138.19.143 ci -78.138.19.144 - 78.138.19.151 ng -78.138.19.152 - 78.138.19.167 a2 -78.138.19.168 - 78.138.19.175 ng -78.138.19.176 - 78.138.19.183 ug -78.138.19.184 - 78.138.19.207 a2 -78.138.19.208 - 78.138.19.215 ng -78.138.19.216 - 78.138.19.223 a2 -78.138.19.224 - 78.138.19.231 ng -78.138.19.232 - 78.138.19.239 ao -78.138.19.240 - 78.138.19.247 ng -78.138.19.248 - 78.138.19.255 a2 -78.138.20.0 - 78.138.21.255 ga -78.138.22.0 - 78.138.22.7 a2 -78.138.22.8 - 78.138.22.15 ga -78.138.22.16 - 78.138.22.23 ng -78.138.22.24 - 78.138.22.31 a2 -78.138.22.32 - 78.138.22.39 zm -78.138.22.40 - 78.138.22.55 ng -78.138.22.56 - 78.138.22.135 a2 -78.138.22.136 - 78.138.22.143 cd -78.138.22.144 - 78.138.22.167 a2 -78.138.22.168 - 78.138.22.175 ng -78.138.22.176 - 78.138.22.207 a2 -78.138.22.208 - 78.138.22.215 cd -78.138.22.216 - 78.138.22.223 a2 -78.138.22.224 - 78.138.22.231 ng -78.138.22.232 - 78.138.23.23 a2 -78.138.23.24 - 78.138.23.31 ug -78.138.23.32 - 78.138.23.39 lr -78.138.23.40 - 78.138.23.55 a2 -78.138.23.56 - 78.138.23.63 ng -78.138.23.64 - 78.138.23.111 a2 -78.138.23.112 - 78.138.23.119 bw -78.138.23.120 - 78.138.23.135 a2 -78.138.23.136 - 78.138.23.143 ng -78.138.23.144 - 78.138.23.159 a2 -78.138.23.160 - 78.138.23.167 ng -78.138.23.168 - 78.138.23.199 a2 -78.138.23.200 - 78.138.23.215 ci -78.138.23.216 - 78.138.23.223 gh -78.138.23.224 - 78.138.23.231 a2 -78.138.23.232 - 78.138.23.239 ng -78.138.23.240 - 78.138.23.255 a2 -78.138.24.0 - 78.138.25.15 ng -78.138.25.16 - 78.138.25.23 a2 -78.138.25.24 - 78.138.25.31 ng -78.138.25.32 - 78.138.25.47 a2 -78.138.25.48 - 78.138.25.55 ug -78.138.25.56 - 78.138.25.63 a2 -78.138.25.64 - 78.138.25.71 ng -78.138.25.72 - 78.138.25.119 a2 -78.138.25.120 - 78.138.25.127 gh -78.138.25.128 - 78.138.25.143 a2 -78.138.25.144 - 78.138.25.151 ng -78.138.25.152 - 78.138.25.159 a2 -78.138.25.160 - 78.138.25.167 ao -78.138.25.168 - 78.138.25.175 ng -78.138.25.176 - 78.138.25.183 a2 -78.138.25.184 - 78.138.25.191 ng -78.138.25.192 - 78.138.25.207 a2 -78.138.25.208 - 78.138.25.215 ng -78.138.25.216 - 78.138.25.239 a2 -78.138.25.240 - 78.138.25.247 ao -78.138.25.248 - 78.138.25.255 a2 -78.138.26.0 - 78.138.26.7 ng -78.138.26.8 - 78.138.26.23 a2 -78.138.26.24 - 78.138.26.55 ng -78.138.26.56 - 78.138.26.63 a2 -78.138.26.64 - 78.138.26.79 zw -78.138.26.80 - 78.138.26.95 a2 -78.138.26.96 - 78.138.26.103 ng -78.138.26.104 - 78.138.26.111 cd -78.138.26.112 - 78.138.26.135 a2 -78.138.26.136 - 78.138.26.143 ng -78.138.26.144 - 78.138.26.151 a2 -78.138.26.152 - 78.138.26.159 ng -78.138.26.160 - 78.138.26.167 a2 -78.138.26.168 - 78.138.26.175 ao -78.138.26.176 - 78.138.26.207 a2 -78.138.26.208 - 78.138.26.215 iq -78.138.26.216 - 78.138.26.223 a2 -78.138.26.224 - 78.138.26.231 ng -78.138.26.232 - 78.138.26.239 a2 -78.138.26.240 - 78.138.26.247 co -78.138.26.248 - 78.138.26.255 ng -78.138.27.0 - 78.138.27.7 a2 -78.138.27.8 - 78.138.27.15 ao -78.138.27.16 - 78.138.27.23 iq -78.138.27.24 - 78.138.27.87 a2 -78.138.27.88 - 78.138.27.95 lr -78.138.27.96 - 78.138.27.135 a2 -78.138.27.136 - 78.138.27.143 ng -78.138.27.144 - 78.138.27.175 a2 -78.138.27.176 - 78.138.27.183 ng -78.138.27.184 - 78.138.27.191 ao -78.138.27.192 - 78.138.27.199 ci -78.138.27.200 - 78.138.27.215 ng -78.138.27.216 - 78.138.27.223 ao -78.138.27.224 - 78.138.27.239 ng -78.138.27.240 - 78.138.27.247 a2 -78.138.27.248 - 78.138.28.255 ng -78.138.29.0 - 78.138.29.31 a2 -78.138.29.32 - 78.138.29.39 ng -78.138.29.40 - 78.138.29.47 a2 -78.138.29.48 - 78.138.29.55 gh -78.138.29.56 - 78.138.29.63 ao -78.138.29.64 - 78.138.29.95 ng -78.138.29.96 - 78.138.29.111 a2 -78.138.29.112 - 78.138.29.119 ng -78.138.29.120 - 78.138.29.143 a2 -78.138.29.144 - 78.138.29.159 ng -78.138.29.160 - 78.138.29.175 a2 -78.138.29.176 - 78.138.29.183 ao -78.138.29.184 - 78.138.29.191 ug -78.138.29.192 - 78.138.29.199 a2 -78.138.29.200 - 78.138.29.200 ao -78.138.29.201 - 78.138.29.207 a2 -78.138.29.208 - 78.138.29.215 ao -78.138.29.216 - 78.138.29.231 ng -78.138.29.232 - 78.138.29.247 a2 -78.138.29.248 - 78.138.29.255 ug -78.138.30.0 - 78.138.30.31 a2 -78.138.30.32 - 78.138.30.39 ng -78.138.30.40 - 78.138.30.47 iq -78.138.30.48 - 78.138.30.71 ng -78.138.30.72 - 78.138.30.111 a2 -78.138.30.112 - 78.138.30.119 ng -78.138.30.120 - 78.138.30.127 a2 -78.138.30.128 - 78.138.30.135 ng -78.138.30.136 - 78.138.30.143 a2 -78.138.30.144 - 78.138.30.151 ng -78.138.30.152 - 78.138.30.159 a2 -78.138.30.160 - 78.138.30.175 ng -78.138.30.176 - 78.138.30.191 a2 -78.138.30.192 - 78.138.30.207 ng -78.138.30.208 - 78.138.30.215 a2 -78.138.30.216 - 78.138.30.239 ng -78.138.30.240 - 78.138.30.247 ao -78.138.30.248 - 78.138.30.255 iq -78.138.31.0 - 78.138.31.7 ng -78.138.31.8 - 78.138.31.15 a2 -78.138.31.16 - 78.138.31.23 ng -78.138.31.24 - 78.138.31.31 a2 -78.138.31.32 - 78.138.31.39 ng -78.138.31.40 - 78.138.31.47 a2 -78.138.31.48 - 78.138.31.55 ng -78.138.31.56 - 78.138.31.71 a2 -78.138.31.72 - 78.138.31.79 ng -78.138.31.80 - 78.138.31.95 a2 -78.138.31.96 - 78.138.31.111 ng -78.138.31.112 - 78.138.31.127 a2 -78.138.31.128 - 78.138.31.135 ng -78.138.31.136 - 78.138.31.159 a2 -78.138.31.160 - 78.138.31.175 ng -78.138.31.176 - 78.138.31.183 a2 -78.138.31.184 - 78.138.31.191 ng -78.138.31.192 - 78.138.31.199 ga -78.138.31.200 - 78.138.31.207 ng -78.138.31.208 - 78.138.31.215 gh -78.138.31.216 - 78.138.31.231 ng -78.138.31.232 - 78.138.32.23 a2 -78.138.32.24 - 78.138.32.31 ng -78.138.32.32 - 78.138.32.47 a2 -78.138.32.48 - 78.138.32.55 ng -78.138.32.56 - 78.138.32.63 ao -78.138.32.64 - 78.138.32.87 ng -78.138.32.88 - 78.138.32.191 a2 -78.138.32.192 - 78.138.32.207 ng -78.138.32.208 - 78.138.32.239 a2 -78.138.32.240 - 78.138.32.247 ao -78.138.32.248 - 78.138.33.7 a2 -78.138.33.8 - 78.138.33.15 ng -78.138.33.16 - 78.138.33.31 a2 -78.138.33.32 - 78.138.33.55 ng -78.138.33.56 - 78.138.33.87 a2 -78.138.33.88 - 78.138.33.95 iq -78.138.33.96 - 78.138.33.103 ng -78.138.33.104 - 78.138.33.159 a2 -78.138.33.160 - 78.138.33.175 ng -78.138.33.176 - 78.138.33.183 a2 -78.138.33.184 - 78.138.33.191 ng -78.138.33.192 - 78.138.33.199 a2 -78.138.33.200 - 78.138.33.207 ci -78.138.33.208 - 78.138.33.215 a2 -78.138.33.216 - 78.138.33.223 ng -78.138.33.224 - 78.138.33.239 a2 -78.138.33.240 - 78.138.33.247 ng -78.138.33.248 - 78.138.34.15 a2 -78.138.34.16 - 78.138.34.23 ug -78.138.34.24 - 78.138.34.31 iq -78.138.34.32 - 78.138.34.39 ng -78.138.34.40 - 78.138.34.47 na -78.138.34.48 - 78.138.34.71 a2 -78.138.34.72 - 78.138.34.87 ng -78.138.34.88 - 78.138.34.103 a2 -78.138.34.104 - 78.138.34.119 ng -78.138.34.120 - 78.138.34.127 fr -78.138.34.128 - 78.138.34.135 lr -78.138.34.136 - 78.138.34.143 ng -78.138.34.144 - 78.138.34.151 a2 -78.138.34.152 - 78.138.34.159 ng -78.138.34.160 - 78.138.34.175 a2 -78.138.34.176 - 78.138.34.183 ng -78.138.34.184 - 78.138.34.191 a2 -78.138.34.192 - 78.138.34.199 cm -78.138.34.200 - 78.138.34.223 a2 -78.138.34.224 - 78.138.34.231 gh -78.138.34.232 - 78.138.34.239 ng -78.138.34.240 - 78.138.34.255 gh -78.138.35.0 - 78.138.35.15 a2 -78.138.35.16 - 78.138.35.23 cd -78.138.35.24 - 78.138.35.31 gb -78.138.35.32 - 78.138.35.39 ng -78.138.35.40 - 78.138.35.47 a2 -78.138.35.48 - 78.138.35.63 ng -78.138.35.64 - 78.138.35.71 a2 -78.138.35.72 - 78.138.35.79 td -78.138.35.80 - 78.138.35.87 ng -78.138.35.88 - 78.138.35.111 a2 -78.138.35.112 - 78.138.35.119 cd -78.138.35.120 - 78.138.35.127 a2 -78.138.35.128 - 78.138.35.135 ug -78.138.35.136 - 78.138.35.143 ng -78.138.35.144 - 78.138.35.151 ug -78.138.35.152 - 78.138.35.159 lr -78.138.35.160 - 78.138.35.175 a2 -78.138.35.176 - 78.138.35.183 ng -78.138.35.184 - 78.138.35.191 a2 -78.138.35.192 - 78.138.35.199 ng -78.138.35.200 - 78.138.35.215 a2 -78.138.35.216 - 78.138.35.223 ng -78.138.35.224 - 78.138.35.231 a2 -78.138.35.232 - 78.138.35.239 gh -78.138.35.240 - 78.138.35.247 sd -78.138.35.248 - 78.138.35.255 gq -78.138.36.0 - 78.138.36.7 ng -78.138.36.8 - 78.138.36.23 a2 -78.138.36.24 - 78.138.36.31 ng -78.138.36.32 - 78.138.36.39 gh -78.138.36.40 - 78.138.36.47 ng -78.138.36.48 - 78.138.36.55 ao -78.138.36.56 - 78.138.36.63 ng -78.138.36.64 - 78.138.36.71 cm -78.138.36.72 - 78.138.36.79 ng -78.138.36.80 - 78.138.36.87 cm -78.138.36.88 - 78.138.36.103 a2 -78.138.36.104 - 78.138.36.111 cm -78.138.36.112 - 78.138.36.119 ng -78.138.36.120 - 78.138.36.127 cm -78.138.36.128 - 78.138.36.135 tg -78.138.36.136 - 78.138.36.143 ml -78.138.36.144 - 78.138.36.159 a2 -78.138.36.160 - 78.138.36.175 sd -78.138.36.176 - 78.138.36.183 a2 -78.138.36.184 - 78.138.36.191 ng -78.138.36.192 - 78.138.36.199 gh -78.138.36.200 - 78.138.36.207 ng -78.138.36.208 - 78.138.36.215 sd -78.138.36.216 - 78.138.36.223 ng -78.138.36.224 - 78.138.36.231 cd -78.138.36.232 - 78.138.36.239 ng -78.138.36.240 - 78.138.36.247 a2 -78.138.36.248 - 78.138.36.255 ng -78.138.37.0 - 78.138.37.255 lr -78.138.38.0 - 78.138.38.7 ng -78.138.38.8 - 78.138.38.15 ao -78.138.38.16 - 78.138.38.23 ng -78.138.38.24 - 78.138.38.31 lr -78.138.38.32 - 78.138.38.39 a2 -78.138.38.40 - 78.138.38.47 ng -78.138.38.48 - 78.138.38.55 ao -78.138.38.56 - 78.138.38.63 ug -78.138.38.64 - 78.138.38.87 a2 -78.138.38.88 - 78.138.38.95 ng -78.138.38.96 - 78.138.38.103 cd -78.138.38.104 - 78.138.38.111 a2 -78.138.38.112 - 78.138.38.127 ng -78.138.38.128 - 78.138.38.143 a2 -78.138.38.144 - 78.138.38.151 lr -78.138.38.152 - 78.138.38.167 a2 -78.138.38.168 - 78.138.38.175 ng -78.138.38.176 - 78.138.38.215 a2 -78.138.38.216 - 78.138.38.223 lr -78.138.38.224 - 78.138.38.231 a2 -78.138.38.232 - 78.138.38.239 ug -78.138.38.240 - 78.138.38.255 a2 -78.138.39.0 - 78.138.39.7 cd -78.138.39.8 - 78.138.39.15 ng -78.138.39.16 - 78.138.39.23 lr -78.138.39.24 - 78.138.39.47 a2 -78.138.39.48 - 78.138.39.55 ng -78.138.39.56 - 78.138.39.63 a2 -78.138.39.64 - 78.138.39.71 tg -78.138.39.72 - 78.138.39.79 ng -78.138.39.80 - 78.138.39.103 a2 -78.138.39.104 - 78.138.39.111 ng -78.138.39.112 - 78.138.39.119 a2 -78.138.39.120 - 78.138.39.127 ng -78.138.39.128 - 78.138.39.143 a2 -78.138.39.144 - 78.138.39.151 cm -78.138.39.152 - 78.138.39.183 a2 -78.138.39.184 - 78.138.39.199 ng -78.138.39.200 - 78.138.39.207 iq -78.138.39.208 - 78.138.39.223 a2 -78.138.39.224 - 78.138.39.239 ng -78.138.39.240 - 78.138.39.247 a2 -78.138.39.248 - 78.138.39.255 ng -78.138.40.0 - 78.138.40.7 ug -78.138.40.8 - 78.138.40.15 td -78.138.40.16 - 78.138.40.23 ng -78.138.40.24 - 78.138.40.31 ug -78.138.40.32 - 78.138.40.39 a2 -78.138.40.40 - 78.138.40.47 bf -78.138.40.48 - 78.138.40.71 a2 -78.138.40.72 - 78.138.40.79 ng -78.138.40.80 - 78.138.40.135 a2 -78.138.40.136 - 78.138.40.143 sd -78.138.40.144 - 78.138.40.159 ng -78.138.40.160 - 78.138.40.175 a2 -78.138.40.176 - 78.138.40.183 ug -78.138.40.184 - 78.138.40.191 a2 -78.138.40.192 - 78.138.40.215 ng -78.138.40.216 - 78.138.40.223 fr -78.138.40.224 - 78.138.40.247 a2 -78.138.40.248 - 78.138.40.255 ng -78.138.41.0 - 78.138.41.7 cd -78.138.41.8 - 78.138.41.15 ao -78.138.41.16 - 78.138.41.23 cd -78.138.41.24 - 78.138.41.31 a2 -78.138.41.32 - 78.138.41.39 ng -78.138.41.40 - 78.138.41.55 cd -78.138.41.56 - 78.138.41.79 ng -78.138.41.80 - 78.138.41.87 a2 -78.138.41.88 - 78.138.41.95 ng -78.138.41.96 - 78.138.41.103 cd -78.138.41.104 - 78.138.41.111 lr -78.138.41.112 - 78.138.41.119 cd -78.138.41.120 - 78.138.41.127 lr -78.138.41.128 - 78.138.41.135 ng -78.138.41.136 - 78.138.41.143 cd -78.138.41.144 - 78.138.41.151 ao -78.138.41.152 - 78.138.41.159 gq -78.138.41.160 - 78.138.41.167 ng -78.138.41.168 - 78.138.41.175 ao -78.138.41.176 - 78.138.41.183 cd -78.138.41.184 - 78.138.41.215 ng -78.138.41.216 - 78.138.41.223 gq -78.138.41.224 - 78.138.41.239 cd -78.138.41.240 - 78.138.41.247 a2 -78.138.41.248 - 78.138.41.255 ng -78.138.42.0 - 78.138.42.95 a2 -78.138.42.96 - 78.138.42.103 gb -78.138.42.104 - 78.138.42.255 a2 -78.138.43.0 - 78.138.43.7 ao -78.138.43.8 - 78.138.43.15 a2 -78.138.43.16 - 78.138.43.23 lr -78.138.43.24 - 78.138.43.31 ng -78.138.43.32 - 78.138.43.39 bf -78.138.43.40 - 78.138.43.71 a2 -78.138.43.72 - 78.138.43.79 gn -78.138.43.80 - 78.138.43.183 a2 -78.138.43.184 - 78.138.43.191 ng -78.138.43.192 - 78.138.43.223 a2 -78.138.43.224 - 78.138.43.231 iq -78.138.43.232 - 78.138.44.7 a2 -78.138.44.8 - 78.138.44.15 ng -78.138.44.16 - 78.138.44.23 gq -78.138.44.24 - 78.138.44.31 ng -78.138.44.32 - 78.138.44.47 a2 -78.138.44.48 - 78.138.44.55 sd -78.138.44.56 - 78.138.44.63 ng -78.138.44.64 - 78.138.44.71 cd -78.138.44.72 - 78.138.44.79 ng -78.138.44.80 - 78.138.44.87 gq -78.138.44.88 - 78.138.44.95 ng -78.138.44.96 - 78.138.44.103 gr -78.138.44.104 - 78.138.44.111 ng -78.138.44.112 - 78.138.44.119 a2 -78.138.44.120 - 78.138.44.127 cd -78.138.44.128 - 78.138.44.143 a2 -78.138.44.144 - 78.138.44.151 ng -78.138.44.152 - 78.138.44.159 bf -78.138.44.160 - 78.138.44.167 cd -78.138.44.168 - 78.138.44.175 a2 -78.138.44.176 - 78.138.44.183 cd -78.138.44.184 - 78.138.44.191 a2 -78.138.44.192 - 78.138.44.207 ng -78.138.44.208 - 78.138.44.215 gr -78.138.44.216 - 78.138.44.231 a2 -78.138.44.232 - 78.138.44.239 sd -78.138.44.240 - 78.138.44.247 ng -78.138.44.248 - 78.138.44.255 a2 -78.138.45.0 - 78.138.45.7 ao -78.138.45.8 - 78.138.45.15 a2 -78.138.45.16 - 78.138.45.23 cd -78.138.45.24 - 78.138.45.31 ng -78.138.45.32 - 78.138.45.39 cd -78.138.45.40 - 78.138.45.47 ng -78.138.45.48 - 78.138.45.55 gl -78.138.45.56 - 78.138.45.63 a2 -78.138.45.64 - 78.138.45.71 ml -78.138.45.72 - 78.138.45.79 a2 -78.138.45.80 - 78.138.45.95 ng -78.138.45.96 - 78.138.45.103 a2 -78.138.45.104 - 78.138.45.111 cd -78.138.45.112 - 78.138.45.119 a2 -78.138.45.120 - 78.138.45.127 cd -78.138.45.128 - 78.138.45.143 a2 -78.138.45.144 - 78.138.45.151 cd -78.138.45.152 - 78.138.45.159 ml -78.138.45.160 - 78.138.45.199 a2 -78.138.45.200 - 78.138.45.215 cd -78.138.45.216 - 78.138.45.223 ml -78.138.45.224 - 78.138.45.231 ng -78.138.45.232 - 78.138.45.239 cd -78.138.45.240 - 78.138.45.247 ng -78.138.45.248 - 78.138.45.255 ao -78.138.46.0 - 78.138.47.199 a2 -78.138.47.200 - 78.138.47.207 ng -78.138.47.208 - 78.138.49.255 a2 -78.138.50.0 - 78.138.50.15 ao -78.138.50.16 - 78.138.50.23 ng -78.138.50.24 - 78.138.50.31 zw -78.138.50.32 - 78.138.50.39 cd -78.138.50.40 - 78.138.50.47 ng -78.138.50.48 - 78.138.50.55 ao -78.138.50.56 - 78.138.50.71 ng -78.138.50.72 - 78.138.50.79 a2 -78.138.50.80 - 78.138.50.87 lu -78.138.50.88 - 78.138.50.103 ng -78.138.50.104 - 78.138.50.111 a2 -78.138.50.112 - 78.138.50.119 gn -78.138.50.120 - 78.138.50.127 ng -78.138.50.128 - 78.138.50.135 ao -78.138.50.136 - 78.138.50.151 ng -78.138.50.152 - 78.138.50.159 a2 -78.138.50.160 - 78.138.50.183 ng -78.138.50.184 - 78.138.50.191 a2 -78.138.50.192 - 78.138.50.199 ao -78.138.50.200 - 78.138.50.215 ng -78.138.50.216 - 78.138.50.223 a2 -78.138.50.224 - 78.138.50.231 ng -78.138.50.232 - 78.138.50.247 a2 -78.138.50.248 - 78.138.50.255 ng -78.138.51.0 - 78.138.56.7 a2 -78.138.56.8 - 78.138.56.15 ng -78.138.56.16 - 78.138.56.23 a2 -78.138.56.24 - 78.138.56.39 ng -78.138.56.40 - 78.138.56.127 a2 -78.138.56.128 - 78.138.56.135 ng -78.138.56.136 - 78.138.59.7 a2 -78.138.59.8 - 78.138.59.11 ng -78.138.59.12 - 78.138.63.255 a2 -78.138.64.0 - 78.138.66.127 de -78.138.66.128 - 78.138.66.143 ch -78.138.66.144 - 78.138.66.151 de -78.138.66.152 - 78.138.66.159 fr -78.138.66.160 - 78.138.72.255 de -78.138.73.0 - 78.138.73.127 be -78.138.73.128 - 78.138.76.31 de -78.138.76.32 - 78.138.76.47 nl -78.138.76.48 - 78.138.123.255 de -78.138.124.0 - 78.138.124.127 nl -78.138.124.128 - 78.138.127.255 de +78.138.0.0 - 78.138.50.111 a2 +78.138.50.112 - 78.138.50.119 cm +78.138.50.120 - 78.138.63.255 a2 +78.138.64.0 - 78.138.127.255 de 78.138.128.0 - 78.138.191.255 ru 78.138.192.0 - 78.138.255.255 sa 78.139.0.0 - 78.139.63.255 hu 78.139.64.0 - 78.139.127.255 ru 78.139.128.0 - 78.139.191.255 ge 78.139.192.0 - 78.140.63.255 ru -78.140.64.0 - 78.140.127.255 de -78.140.128.0 - 78.140.132.159 nl -78.140.132.160 - 78.140.132.191 ca -78.140.132.192 - 78.140.133.255 nl -78.140.134.0 - 78.140.134.255 gb -78.140.135.0 - 78.140.135.63 cy -78.140.135.64 - 78.140.135.127 nl -78.140.135.128 - 78.140.135.255 gi -78.140.136.0 - 78.140.136.255 nl -78.140.137.0 - 78.140.137.255 it -78.140.138.0 - 78.140.144.255 nl -78.140.145.0 - 78.140.145.63 ru -78.140.145.64 - 78.140.145.127 gi -78.140.145.128 - 78.140.145.191 ru -78.140.145.192 - 78.140.145.255 cy -78.140.146.0 - 78.140.147.95 nl -78.140.147.96 - 78.140.147.127 ru -78.140.147.128 - 78.140.147.191 nl -78.140.147.192 - 78.140.147.255 gi -78.140.148.0 - 78.140.148.255 cy -78.140.149.0 - 78.140.152.63 nl -78.140.152.64 - 78.140.152.127 cy -78.140.152.128 - 78.140.152.191 nl -78.140.152.192 - 78.140.152.207 gb -78.140.152.208 - 78.140.152.223 ru -78.140.152.224 - 78.140.154.255 nl -78.140.155.0 - 78.140.155.255 us -78.140.156.0 - 78.140.160.95 nl -78.140.160.96 - 78.140.160.111 gb -78.140.160.112 - 78.140.160.127 nl -78.140.160.128 - 78.140.160.255 gi -78.140.161.0 - 78.140.161.255 nl -78.140.162.0 - 78.140.162.255 ru -78.140.163.0 - 78.140.163.63 hk -78.140.163.64 - 78.140.163.79 cz -78.140.163.80 - 78.140.169.255 nl -78.140.170.0 - 78.140.170.31 sc -78.140.170.32 - 78.140.170.63 mt -78.140.170.64 - 78.140.170.127 cy -78.140.170.128 - 78.140.170.159 hk -78.140.170.160 - 78.140.170.191 nl -78.140.170.192 - 78.140.170.255 gi -78.140.171.0 - 78.140.171.63 hk -78.140.171.64 - 78.140.171.191 cy -78.140.171.192 - 78.140.171.223 il -78.140.171.224 - 78.140.175.255 nl -78.140.176.0 - 78.140.176.127 cy -78.140.176.128 - 78.140.176.191 hk -78.140.176.192 - 78.140.176.255 cy -78.140.177.0 - 78.140.177.191 us -78.140.177.192 - 78.140.177.223 nl -78.140.177.224 - 78.140.177.255 pr -78.140.178.0 - 78.140.178.63 nl -78.140.178.64 - 78.140.178.127 gi -78.140.178.128 - 78.140.178.191 us -78.140.178.192 - 78.140.179.127 nl -78.140.179.128 - 78.140.179.255 sc -78.140.180.0 - 78.140.180.255 my -78.140.181.0 - 78.140.191.255 nl +78.140.64.0 - 78.140.72.15 de +78.140.72.16 - 78.140.72.31 jp +78.140.72.32 - 78.140.127.255 de +78.140.128.0 - 78.140.191.255 nl 78.140.192.0 - 78.140.255.255 ru 78.141.0.0 - 78.141.63.255 gb 78.141.64.0 - 78.141.127.255 sk 78.141.128.0 - 78.141.191.255 lu 78.141.192.0 - 78.141.255.255 gb 78.142.0.0 - 78.142.63.255 bg -78.142.64.0 - 78.142.140.247 at -78.142.140.248 - 78.142.140.255 de -78.142.141.0 - 78.142.189.63 at -78.142.189.64 - 78.142.189.71 mt -78.142.189.72 - 78.142.191.255 at +78.142.64.0 - 78.142.191.255 at 78.142.192.0 - 78.142.255.255 ru -78.143.0.0 - 78.143.1.255 nl -78.143.2.0 - 78.143.6.63 de -78.143.6.64 - 78.143.6.255 nl -78.143.7.0 - 78.143.14.127 de -78.143.14.128 - 78.143.14.255 nl -78.143.15.0 - 78.143.22.255 de -78.143.23.0 - 78.143.23.63 nl -78.143.23.64 - 78.143.28.127 de -78.143.28.128 - 78.143.28.255 nl -78.143.29.0 - 78.143.29.255 de -78.143.30.0 - 78.143.30.255 nl -78.143.31.0 - 78.143.35.255 de -78.143.36.0 - 78.143.36.255 nl -78.143.37.0 - 78.143.43.127 de -78.143.43.128 - 78.143.43.255 nl -78.143.44.0 - 78.143.45.255 de -78.143.46.0 - 78.143.47.255 nl -78.143.48.0 - 78.143.52.191 de -78.143.52.192 - 78.143.52.223 nl -78.143.52.224 - 78.143.58.79 de -78.143.58.80 - 78.143.58.127 nl -78.143.58.128 - 78.143.62.143 de -78.143.62.144 - 78.143.63.255 nl +78.143.0.0 - 78.143.63.255 de 78.143.64.0 - 78.143.127.255 dk -78.143.128.0 - 78.143.191.255 ie +78.143.128.0 - 78.143.160.255 ie +78.143.161.0 - 78.143.161.255 gb +78.143.162.0 - 78.143.191.255 ie 78.143.192.0 - 78.151.255.255 gb 78.152.0.0 - 78.152.31.255 pl -78.152.32.0 - 78.152.63.255 nl +78.152.32.0 - 78.152.37.191 nl +78.152.37.192 - 78.152.37.199 gb +78.152.37.200 - 78.152.37.215 nl +78.152.37.216 - 78.152.37.223 gb +78.152.37.224 - 78.152.39.31 nl +78.152.39.32 - 78.152.39.39 us +78.152.39.40 - 78.152.47.191 nl +78.152.47.192 - 78.152.47.207 se +78.152.47.208 - 78.152.50.223 nl +78.152.50.224 - 78.152.50.239 us +78.152.50.240 - 78.152.59.255 nl +78.152.60.0 - 78.152.60.7 ie +78.152.60.8 - 78.152.63.255 nl 78.152.64.0 - 78.152.95.255 at 78.152.96.0 - 78.152.127.255 it 78.152.128.0 - 78.152.159.255 fr @@ -36734,36 +19092,13 @@ 78.153.96.0 - 78.153.127.255 hu 78.153.128.0 - 78.153.159.255 ru 78.153.160.0 - 78.153.191.255 dk -78.153.192.0 - 78.153.204.223 ie -78.153.204.224 - 78.153.204.255 us -78.153.205.0 - 78.153.223.255 ie -78.153.224.0 - 78.153.226.63 fr -78.153.226.64 - 78.153.226.71 gb -78.153.226.72 - 78.153.229.31 fr -78.153.229.32 - 78.153.229.39 gb -78.153.229.40 - 78.153.229.119 fr -78.153.229.120 - 78.153.229.127 gb -78.153.229.128 - 78.153.229.143 fr -78.153.229.144 - 78.153.229.147 gb -78.153.229.148 - 78.153.229.159 fr -78.153.229.160 - 78.153.229.167 gb -78.153.229.168 - 78.153.229.255 fr -78.153.230.0 - 78.153.230.255 gb -78.153.231.0 - 78.153.241.95 fr -78.153.241.96 - 78.153.241.111 it -78.153.241.112 - 78.153.246.151 fr -78.153.246.152 - 78.153.246.159 gb -78.153.246.160 - 78.153.249.255 fr -78.153.250.0 - 78.153.250.255 gb -78.153.251.0 - 78.153.255.254 fr -78.153.255.255 - 78.153.255.255 gb +78.153.192.0 - 78.153.223.255 ie +78.153.224.0 - 78.153.255.255 fr 78.154.0.0 - 78.154.31.255 bg 78.154.32.0 - 78.154.63.255 ir 78.154.64.0 - 78.154.95.255 pl 78.154.96.0 - 78.154.127.255 gb -78.154.128.0 - 78.154.146.255 lv -78.154.147.0 - 78.154.147.255 be -78.154.148.0 - 78.154.159.255 lv +78.154.128.0 - 78.154.159.255 lv 78.154.160.0 - 78.154.191.255 ua 78.154.192.0 - 78.154.255.255 kw 78.155.0.0 - 78.155.31.255 ch @@ -36772,38 +19107,36 @@ 78.155.96.0 - 78.155.127.255 pl 78.155.128.0 - 78.155.159.255 fr 78.155.160.0 - 78.155.223.255 ru -78.155.224.0 - 78.155.255.255 ie +78.155.224.0 - 78.155.234.246 ie +78.155.234.247 - 78.155.234.247 gb +78.155.234.248 - 78.155.255.255 ie 78.156.0.0 - 78.156.31.255 no 78.156.32.0 - 78.156.63.255 cz 78.156.64.0 - 78.156.95.255 gb 78.156.96.0 - 78.156.127.255 dk 78.156.128.0 - 78.156.159.255 cz 78.156.160.0 - 78.156.191.255 pl -78.156.192.0 - 78.156.199.255 se -78.156.200.0 - 78.156.223.255 dk +78.156.192.0 - 78.156.223.255 dk 78.156.224.0 - 78.156.255.255 ru 78.157.0.0 - 78.157.31.255 mk 78.157.32.0 - 78.157.63.255 ir -78.157.64.0 - 78.157.95.255 lt +78.157.64.0 - 78.157.95.63 lt +78.157.95.64 - 78.157.95.127 br +78.157.95.128 - 78.157.95.255 lt 78.157.96.0 - 78.157.127.255 dk -78.157.128.0 - 78.157.172.255 cz -78.157.173.0 - 78.157.175.255 pl -78.157.176.0 - 78.157.179.255 cz -78.157.180.0 - 78.157.190.255 pl -78.157.191.0 - 78.157.191.255 cz +78.157.128.0 - 78.157.179.255 cz +78.157.180.0 - 78.157.187.255 pl +78.157.188.0 - 78.157.191.255 cz 78.157.192.0 - 78.157.223.255 gb 78.157.224.0 - 78.157.255.255 ru 78.158.0.0 - 78.158.31.255 lt -78.158.32.0 - 78.158.91.255 gb -78.158.92.0 - 78.158.95.255 us +78.158.32.0 - 78.158.87.255 gb +78.158.88.0 - 78.158.95.255 us 78.158.96.0 - 78.158.127.255 ie -78.158.128.0 - 78.158.154.255 cy -78.158.155.0 - 78.158.155.63 de -78.158.155.64 - 78.158.155.79 cy -78.158.155.80 - 78.158.155.87 de -78.158.155.88 - 78.158.159.255 cy +78.158.128.0 - 78.158.159.255 cy 78.158.160.0 - 78.158.191.255 ir -78.158.192.0 - 78.158.223.255 ru +78.158.192.0 - 78.158.192.255 ua +78.158.193.0 - 78.158.223.255 ru 78.158.224.0 - 78.158.227.255 no 78.158.228.0 - 78.158.231.255 dk 78.158.232.0 - 78.158.239.255 se @@ -36811,26 +19144,15 @@ 78.159.0.0 - 78.159.31.255 fr 78.159.32.0 - 78.159.63.255 ua 78.159.64.0 - 78.159.95.255 pl -78.159.96.0 - 78.159.106.63 de -78.159.106.64 - 78.159.106.127 pt -78.159.106.128 - 78.159.106.255 ru -78.159.107.0 - 78.159.108.255 de +78.159.96.0 - 78.159.108.255 de 78.159.109.0 - 78.159.109.127 pl -78.159.109.128 - 78.159.109.255 ru +78.159.109.128 - 78.159.109.255 de 78.159.110.0 - 78.159.110.255 pl -78.159.111.0 - 78.159.116.255 de -78.159.117.0 - 78.159.117.255 tr -78.159.118.0 - 78.159.121.255 de -78.159.122.0 - 78.159.122.255 hk -78.159.123.0 - 78.159.123.255 de +78.159.111.0 - 78.159.123.255 de 78.159.124.0 - 78.159.124.127 pl -78.159.124.128 - 78.159.124.255 ru +78.159.124.128 - 78.159.124.255 de 78.159.125.0 - 78.159.125.127 pl -78.159.125.128 - 78.159.125.255 ru -78.159.126.0 - 78.159.126.127 de -78.159.126.128 - 78.159.126.255 ru -78.159.127.0 - 78.159.127.127 de -78.159.127.128 - 78.159.127.255 ru +78.159.125.128 - 78.159.127.255 de 78.159.128.0 - 78.159.159.255 bg 78.159.160.0 - 78.159.191.255 kw 78.159.192.0 - 78.159.223.255 it @@ -36844,14 +19166,9 @@ 79.97.0.0 - 79.97.255.255 ie 79.98.0.0 - 79.98.7.255 it 79.98.8.0 - 79.98.15.255 ru -79.98.16.0 - 79.98.23.127 fr -79.98.23.128 - 79.98.23.135 be -79.98.23.136 - 79.98.23.255 fr +79.98.16.0 - 79.98.23.255 fr 79.98.24.0 - 79.98.31.255 lt -79.98.32.0 - 79.98.34.39 gb -79.98.34.40 - 79.98.34.47 ie -79.98.34.48 - 79.98.34.55 ae -79.98.34.56 - 79.98.39.255 gb +79.98.32.0 - 79.98.39.255 gb 79.98.40.0 - 79.98.47.255 it 79.98.48.0 - 79.98.55.255 by 79.98.56.0 - 79.98.63.255 fr @@ -36860,7 +19177,8 @@ 79.98.80.0 - 79.98.87.255 gb 79.98.88.0 - 79.98.95.255 ru 79.98.96.0 - 79.98.103.255 fr -79.98.104.0 - 79.98.111.255 ru +79.98.104.0 - 79.98.111.255 bg +79.98.112.0 - 79.98.119.255 al 79.98.120.0 - 79.98.127.255 ae 79.98.128.0 - 79.98.135.255 tr 79.98.136.0 - 79.98.143.255 ru @@ -36868,13 +19186,11 @@ 79.98.152.0 - 79.98.159.255 cz 79.98.160.0 - 79.98.167.255 gb 79.98.168.0 - 79.98.183.255 nl -79.98.184.0 - 79.98.191.255 sa 79.98.192.0 - 79.98.199.255 dk -79.98.200.0 - 79.98.223.255 ru +79.98.200.0 - 79.98.215.255 ru +79.98.216.0 - 79.98.223.255 es 79.98.224.0 - 79.98.231.255 de -79.98.232.0 - 79.98.235.255 gb -79.98.236.0 - 79.98.236.255 sl -79.98.237.0 - 79.98.247.255 gb +79.98.232.0 - 79.98.247.255 gb 79.98.248.0 - 79.98.255.255 ru 79.99.0.0 - 79.99.7.255 se 79.99.8.0 - 79.99.15.255 it @@ -36886,14 +19202,11 @@ 79.99.56.0 - 79.99.63.255 mk 79.99.64.0 - 79.99.79.255 gb 79.99.80.0 - 79.99.87.255 de -79.99.88.0 - 79.99.95.255 bh 79.99.96.0 - 79.99.103.255 de 79.99.104.0 - 79.99.111.255 ru 79.99.112.0 - 79.99.119.255 it 79.99.120.0 - 79.99.127.255 be -79.99.128.0 - 79.99.135.63 nl -79.99.135.64 - 79.99.135.127 be -79.99.135.128 - 79.99.135.255 nl +79.99.128.0 - 79.99.135.255 nl 79.99.136.0 - 79.99.143.255 de 79.99.144.0 - 79.99.151.255 gb 79.99.152.0 - 79.99.159.255 fi @@ -36901,64 +19214,12 @@ 79.99.168.0 - 79.99.175.255 se 79.99.176.0 - 79.99.183.255 tr 79.99.184.0 - 79.99.191.255 nl -79.99.192.0 - 79.99.192.127 pl -79.99.192.128 - 79.99.192.191 gb -79.99.192.192 - 79.99.192.239 ng -79.99.192.240 - 79.99.192.255 lb -79.99.193.0 - 79.99.193.31 sm -79.99.193.32 - 79.99.193.39 ng -79.99.193.40 - 79.99.193.47 gb -79.99.193.48 - 79.99.193.63 za -79.99.193.64 - 79.99.193.127 gb -79.99.193.128 - 79.99.193.191 de -79.99.193.192 - 79.99.195.63 gb -79.99.195.64 - 79.99.195.79 ae -79.99.195.80 - 79.99.195.87 sa -79.99.195.88 - 79.99.195.95 ae -79.99.195.96 - 79.99.195.103 gb -79.99.195.104 - 79.99.195.111 pl -79.99.195.112 - 79.99.195.119 gb -79.99.195.120 - 79.99.195.127 kw -79.99.195.128 - 79.99.195.143 gb -79.99.195.144 - 79.99.195.159 ae -79.99.195.160 - 79.99.195.223 gb -79.99.195.224 - 79.99.195.255 qa -79.99.196.0 - 79.99.196.15 gb -79.99.196.16 - 79.99.196.31 ae -79.99.196.32 - 79.99.196.71 gb -79.99.196.72 - 79.99.196.79 ae -79.99.196.80 - 79.99.196.95 ie -79.99.196.96 - 79.99.197.255 gb -79.99.198.0 - 79.99.198.7 ng -79.99.198.8 - 79.99.198.15 us -79.99.198.16 - 79.99.198.23 ng -79.99.198.24 - 79.99.198.31 ie -79.99.198.32 - 79.99.198.55 gb -79.99.198.56 - 79.99.198.79 ng -79.99.198.80 - 79.99.198.95 gb -79.99.198.96 - 79.99.198.111 ng -79.99.198.112 - 79.99.198.119 ru -79.99.198.120 - 79.99.198.127 ng -79.99.198.128 - 79.99.198.151 us -79.99.198.152 - 79.99.198.167 gb -79.99.198.168 - 79.99.198.183 ng -79.99.198.184 - 79.99.198.191 qa -79.99.198.192 - 79.99.199.255 gb +79.99.192.0 - 79.99.199.255 gb 79.99.200.0 - 79.99.207.255 be 79.99.208.0 - 79.99.215.255 es 79.99.216.0 - 79.99.223.255 ru 79.99.224.0 - 79.99.231.255 se -79.99.232.0 - 79.99.235.255 ch -79.99.236.0 - 79.99.236.3 nl -79.99.236.4 - 79.99.236.7 ch -79.99.236.8 - 79.99.236.15 fr -79.99.236.16 - 79.99.236.23 gb -79.99.236.24 - 79.99.236.31 de -79.99.236.32 - 79.99.236.39 cz -79.99.236.40 - 79.99.236.47 cy -79.99.236.48 - 79.99.236.63 bg -79.99.236.64 - 79.99.236.71 us -79.99.236.72 - 79.99.239.255 ch +79.99.232.0 - 79.99.239.255 de 79.99.240.0 - 79.99.247.255 ru 79.99.248.0 - 79.99.255.255 ge 79.100.0.0 - 79.100.255.255 bg @@ -36970,22 +19231,28 @@ 79.107.0.0 - 79.107.255.255 gr 79.108.0.0 - 79.109.255.255 es 79.110.0.0 - 79.110.15.255 pl -79.110.16.0 - 79.110.31.255 ua +79.110.16.0 - 79.110.22.127 ua +79.110.22.128 - 79.110.22.255 kz +79.110.23.0 - 79.110.27.255 ua +79.110.28.0 - 79.110.28.127 gb +79.110.28.128 - 79.110.28.255 us +79.110.29.0 - 79.110.30.255 ua +79.110.31.0 - 79.110.31.127 ru +79.110.31.128 - 79.110.31.255 ca 79.110.32.0 - 79.110.47.255 cz -79.110.48.0 - 79.110.63.255 ua 79.110.64.0 - 79.110.79.255 ru 79.110.80.0 - 79.110.95.255 de 79.110.96.0 - 79.110.111.255 ua 79.110.112.0 - 79.110.127.255 bg -79.110.128.0 - 79.110.191.255 ua +79.110.128.0 - 79.110.143.255 ua +79.110.144.0 - 79.110.159.255 rs +79.110.176.0 - 79.110.191.255 ru 79.110.192.0 - 79.110.207.255 pl 79.110.208.0 - 79.110.239.255 ua 79.110.240.0 - 79.111.255.255 ru 79.112.0.0 - 79.119.255.255 ro 79.120.0.0 - 79.120.127.255 ru -79.120.128.0 - 79.120.208.255 hu -79.120.209.0 - 79.120.209.255 mk -79.120.210.0 - 79.121.127.255 hu +79.120.128.0 - 79.121.127.255 hu 79.121.128.0 - 79.121.255.255 gb 79.122.0.0 - 79.122.127.255 hu 79.122.128.0 - 79.122.255.255 ru @@ -37008,23 +19275,29 @@ 79.132.128.0 - 79.132.159.255 de 79.132.160.0 - 79.132.191.255 lt 79.132.192.0 - 79.132.223.255 ir -79.132.224.0 - 79.132.244.247 be -79.132.244.248 - 79.132.244.255 nl -79.132.245.0 - 79.132.255.255 be -79.133.0.0 - 79.133.31.255 ax -79.133.32.0 - 79.133.63.255 de +79.132.224.0 - 79.132.255.255 be +79.133.0.0 - 79.133.7.255 ax +79.133.8.0 - 79.133.8.255 fi +79.133.9.0 - 79.133.31.255 ax +79.133.32.0 - 79.133.36.255 de +79.133.37.0 - 79.133.37.91 es +79.133.37.92 - 79.133.37.92 de +79.133.37.93 - 79.133.39.255 es +79.133.40.0 - 79.133.42.255 de +79.133.43.0 - 79.133.43.255 at +79.133.44.0 - 79.133.55.255 de +79.133.56.0 - 79.133.59.255 nl +79.133.60.0 - 79.133.63.255 de 79.133.64.0 - 79.133.191.255 ru 79.133.192.0 - 79.133.223.255 pl 79.133.224.0 - 79.133.255.255 lt 79.134.0.0 - 79.134.31.255 ru 79.134.32.0 - 79.134.63.255 bg 79.134.64.0 - 79.134.95.255 ru -79.134.96.0 - 79.134.127.151 fi -79.134.127.152 - 79.134.127.159 ax -79.134.127.160 - 79.134.127.255 fi +79.134.96.0 - 79.134.127.255 fi 79.134.128.0 - 79.134.159.255 jo 79.134.160.0 - 79.134.191.255 bg -79.134.192.0 - 79.134.223.255 ee +79.134.192.0 - 79.134.223.255 ru 79.134.224.0 - 79.134.255.255 is 79.135.0.0 - 79.135.31.255 no 79.135.32.0 - 79.135.63.255 it @@ -37034,81 +19307,38 @@ 79.135.160.0 - 79.135.191.255 pl 79.135.192.0 - 79.135.223.255 ua 79.135.224.0 - 79.135.255.255 ru -79.136.0.0 - 79.136.117.135 se -79.136.117.136 - 79.136.117.143 no -79.136.117.144 - 79.136.127.255 se +79.136.0.0 - 79.136.127.255 se 79.136.128.0 - 79.136.255.255 ru 79.137.0.0 - 79.137.127.255 it 79.137.128.0 - 79.137.255.255 ru -79.138.0.0 - 79.138.135.255 se -79.138.136.0 - 79.138.143.255 dk -79.138.144.0 - 79.138.159.255 se -79.138.160.0 - 79.138.175.255 dk -79.138.176.0 - 79.138.223.255 se -79.138.224.0 - 79.138.255.255 dk +79.138.0.0 - 79.138.255.255 se 79.139.0.0 - 79.139.127.255 pl 79.139.128.0 - 79.139.255.255 ru 79.140.0.0 - 79.140.15.255 ua 79.140.16.0 - 79.140.31.255 ru -79.140.32.0 - 79.140.32.239 de -79.140.32.240 - 79.140.32.247 us -79.140.32.248 - 79.140.33.255 de -79.140.34.0 - 79.140.34.255 ch -79.140.35.0 - 79.140.35.191 de -79.140.35.192 - 79.140.35.223 at -79.140.35.224 - 79.140.38.167 de -79.140.38.168 - 79.140.38.175 us -79.140.38.176 - 79.140.39.23 de -79.140.39.24 - 79.140.39.31 at -79.140.39.32 - 79.140.40.127 de -79.140.40.128 - 79.140.40.159 at -79.140.40.160 - 79.140.63.255 de +79.140.32.0 - 79.140.63.255 de 79.140.64.0 - 79.140.79.255 ru -79.140.80.0 - 79.140.82.255 it -79.140.83.0 - 79.140.83.255 gr -79.140.84.0 - 79.140.88.255 it -79.140.89.0 - 79.140.89.255 gr -79.140.90.0 - 79.140.90.127 sk -79.140.90.128 - 79.140.90.255 cz -79.140.91.0 - 79.140.91.63 gr -79.140.91.64 - 79.140.91.127 it -79.140.91.128 - 79.140.91.255 gr -79.140.92.0 - 79.140.93.127 it +79.140.80.0 - 79.140.93.127 it 79.140.93.128 - 79.140.93.255 fr 79.140.94.0 - 79.140.95.255 it 79.140.96.0 - 79.140.111.255 ru 79.140.112.0 - 79.140.127.255 de -79.140.128.0 - 79.140.136.74 ie -79.140.136.75 - 79.140.136.75 gb -79.140.136.76 - 79.140.136.100 ie -79.140.136.101 - 79.140.136.101 gb -79.140.136.102 - 79.140.143.255 ie +79.140.128.0 - 79.140.143.255 ie 79.140.144.0 - 79.140.159.255 me 79.140.160.0 - 79.140.175.255 md 79.140.176.0 - 79.140.191.255 de -79.140.192.0 - 79.140.207.255 gb +79.140.192.0 - 79.140.196.255 gb +79.140.197.0 - 79.140.197.255 ap +79.140.198.0 - 79.140.198.255 au +79.140.199.0 - 79.140.207.255 gb 79.140.208.0 - 79.140.223.255 ie 79.140.224.0 - 79.140.239.255 kz 79.140.240.0 - 79.140.255.255 ru 79.141.0.0 - 79.141.15.255 fr -79.141.16.0 - 79.141.16.255 lu -79.141.17.0 - 79.141.17.255 a2 -79.141.18.0 - 79.141.27.255 iq -79.141.28.0 - 79.141.28.255 lb -79.141.29.0 - 79.141.29.255 iq -79.141.30.0 - 79.141.30.255 de -79.141.31.0 - 79.141.31.255 a2 -79.141.32.0 - 79.141.42.63 gb -79.141.42.64 - 79.141.42.223 nl -79.141.42.224 - 79.141.42.239 gb -79.141.42.240 - 79.141.42.255 nl -79.141.43.0 - 79.141.43.255 fr -79.141.44.0 - 79.141.44.255 de -79.141.45.0 - 79.141.46.127 gb -79.141.46.128 - 79.141.46.143 nl -79.141.46.144 - 79.141.47.191 gb -79.141.47.192 - 79.141.47.223 fr -79.141.47.224 - 79.141.47.255 gb +79.141.16.0 - 79.141.24.255 de +79.141.25.0 - 79.141.27.255 iq +79.141.28.0 - 79.141.31.255 de +79.141.32.0 - 79.141.47.255 gb 79.141.48.0 - 79.141.79.255 ru 79.141.80.0 - 79.141.95.255 ch 79.141.96.0 - 79.141.111.255 no @@ -37119,13 +19349,16 @@ 79.141.161.0 - 79.141.161.255 gb 79.141.162.0 - 79.141.162.255 ie 79.141.163.0 - 79.141.163.255 fr -79.141.164.0 - 79.141.164.255 no -79.141.165.0 - 79.141.165.255 dk +79.141.164.0 - 79.141.165.255 eu 79.141.166.0 - 79.141.166.255 cz 79.141.167.0 - 79.141.167.255 ch -79.141.168.0 - 79.141.169.255 de +79.141.168.0 - 79.141.168.255 gb +79.141.169.0 - 79.141.169.127 de +79.141.169.128 - 79.141.169.255 nl 79.141.170.0 - 79.141.170.255 se -79.141.171.0 - 79.141.171.255 de +79.141.171.0 - 79.141.171.63 gb +79.141.171.64 - 79.141.171.95 de +79.141.171.96 - 79.141.171.255 gb 79.141.172.0 - 79.141.172.255 fi 79.141.173.0 - 79.141.173.255 nl 79.141.174.0 - 79.141.175.255 de @@ -37133,45 +19366,28 @@ 79.141.192.0 - 79.141.207.255 fr 79.141.208.0 - 79.141.239.255 ru 79.141.240.0 - 79.141.255.255 cz -79.142.0.0 - 79.142.15.255 ba +79.142.0.0 - 79.142.0.255 ba +79.142.1.0 - 79.142.1.255 at +79.142.2.0 - 79.142.15.255 ba 79.142.16.0 - 79.142.31.255 ru 79.142.32.0 - 79.142.47.255 de 79.142.48.0 - 79.142.63.255 kz -79.142.64.0 - 79.142.75.255 nl +79.142.64.0 - 79.142.68.255 nl +79.142.69.0 - 79.142.69.255 dk +79.142.70.0 - 79.142.70.255 nl +79.142.71.0 - 79.142.71.255 se +79.142.72.0 - 79.142.72.255 us +79.142.73.0 - 79.142.75.255 nl 79.142.76.0 - 79.142.77.255 se -79.142.78.0 - 79.142.79.255 nl -79.142.80.0 - 79.142.92.255 ru -79.142.93.0 - 79.142.93.43 kz -79.142.93.44 - 79.142.93.47 ru -79.142.93.48 - 79.142.93.59 kz -79.142.93.60 - 79.142.93.63 ru -79.142.93.64 - 79.142.93.71 kz -79.142.93.72 - 79.142.93.79 ru -79.142.93.80 - 79.142.93.123 kz -79.142.93.124 - 79.142.93.127 ru -79.142.93.128 - 79.142.93.151 kz -79.142.93.152 - 79.142.93.255 ru -79.142.94.0 - 79.142.94.191 kz -79.142.94.192 - 79.142.94.199 ru -79.142.94.200 - 79.142.94.203 kz -79.142.94.204 - 79.142.94.207 ru -79.142.94.208 - 79.142.94.223 kz -79.142.94.224 - 79.142.94.255 ru -79.142.95.0 - 79.142.95.3 kz -79.142.95.4 - 79.142.95.7 ru -79.142.95.8 - 79.142.95.43 kz -79.142.95.44 - 79.142.95.47 ru -79.142.95.48 - 79.142.95.83 kz -79.142.95.84 - 79.142.95.87 ru -79.142.95.88 - 79.142.95.171 kz -79.142.95.172 - 79.142.95.175 ru -79.142.95.176 - 79.142.95.247 kz -79.142.95.248 - 79.142.111.255 ru +79.142.78.0 - 79.142.78.255 lu +79.142.79.0 - 79.142.79.255 se +79.142.80.0 - 79.142.93.255 ru +79.142.94.0 - 79.142.94.255 kz +79.142.95.0 - 79.142.111.255 ru 79.142.112.0 - 79.142.127.255 lt 79.142.128.0 - 79.142.143.255 ch 79.142.144.0 - 79.142.159.255 cz 79.142.160.0 - 79.142.175.255 ru -79.142.176.0 - 79.142.191.255 bh 79.142.192.0 - 79.142.207.255 ua 79.142.208.0 - 79.142.223.255 se 79.142.224.0 - 79.142.239.255 dk @@ -37179,7 +19395,11 @@ 79.143.0.0 - 79.143.31.255 ru 79.143.32.0 - 79.143.47.255 ua 79.143.48.0 - 79.143.63.255 at -79.143.64.0 - 79.143.95.255 ru +79.143.64.0 - 79.143.79.255 ru +79.143.80.0 - 79.143.84.104 gb +79.143.84.105 - 79.143.84.105 ir +79.143.84.106 - 79.143.87.255 gb +79.143.88.0 - 79.143.95.255 es 79.143.96.0 - 79.143.111.255 me 79.143.112.0 - 79.143.127.255 it 79.143.128.0 - 79.143.143.255 fr @@ -37204,9 +19424,7 @@ 79.170.40.0 - 79.170.47.255 gb 79.170.48.0 - 79.170.55.255 sa 79.170.56.0 - 79.170.63.255 be -79.170.64.0 - 79.170.67.255 es -79.170.68.0 - 79.170.70.224 us -79.170.70.225 - 79.170.71.255 es +79.170.64.0 - 79.170.71.255 es 79.170.72.0 - 79.170.79.255 gb 79.170.80.0 - 79.170.87.255 no 79.170.88.0 - 79.170.103.255 nl @@ -37215,7 +19433,6 @@ 79.170.120.0 - 79.170.127.255 pl 79.170.128.0 - 79.170.135.255 dk 79.170.136.0 - 79.170.143.255 ru -79.170.144.0 - 79.170.151.255 ir 79.170.152.0 - 79.170.167.255 ru 79.170.168.0 - 79.170.175.255 tr 79.170.176.0 - 79.170.183.255 gb @@ -37237,19 +19454,11 @@ 79.171.48.0 - 79.171.55.255 al 79.171.56.0 - 79.171.63.255 de 79.171.64.0 - 79.171.71.255 be -79.171.72.0 - 79.171.74.159 ie -79.171.74.160 - 79.171.74.175 gb -79.171.74.176 - 79.171.76.31 ie -79.171.76.32 - 79.171.76.63 gb -79.171.76.64 - 79.171.76.127 ie -79.171.76.128 - 79.171.76.143 gb -79.171.76.144 - 79.171.77.15 ie -79.171.77.16 - 79.171.77.31 gb -79.171.77.32 - 79.171.79.255 ie +79.171.72.0 - 79.171.79.255 ie 79.171.80.0 - 79.171.87.255 no 79.171.88.0 - 79.171.95.255 de 79.171.96.0 - 79.171.103.255 is -79.171.104.0 - 79.171.111.255 es +79.171.104.0 - 79.171.111.255 pt 79.171.112.0 - 79.171.119.255 ru 79.171.120.0 - 79.171.127.255 ua 79.171.128.0 - 79.171.143.255 hu @@ -37262,9 +19471,7 @@ 79.171.192.0 - 79.171.199.255 nl 79.171.200.0 - 79.171.207.255 de 79.171.208.0 - 79.171.215.255 ru -79.171.216.0 - 79.171.219.255 es -79.171.220.0 - 79.171.220.31 fr -79.171.220.32 - 79.171.223.255 es +79.171.216.0 - 79.171.223.255 es 79.171.224.0 - 79.171.239.255 fi 79.171.240.0 - 79.171.247.255 bh 79.171.248.0 - 79.171.255.255 se @@ -37275,90 +19482,96 @@ 79.173.64.0 - 79.173.127.255 ru 79.173.128.0 - 79.173.191.255 gb 79.173.192.0 - 79.173.255.255 jo -79.174.0.0 - 79.174.31.255 ua 79.174.32.0 - 79.174.95.255 ru 79.174.96.0 - 79.174.127.255 at -79.174.128.0 - 79.174.191.255 ru +79.174.128.0 - 79.174.131.25 nl +79.174.131.26 - 79.174.131.26 be +79.174.131.27 - 79.174.135.255 nl +79.174.136.0 - 79.174.151.255 de +79.174.152.0 - 79.174.159.255 dk +79.174.160.0 - 79.174.167.255 ir +79.174.168.0 - 79.174.175.255 gb +79.174.176.0 - 79.174.183.255 no +79.174.184.0 - 79.174.191.255 ru 79.174.192.0 - 79.174.255.255 fr 79.175.0.0 - 79.175.63.255 ru 79.175.64.0 - 79.175.127.255 rs -79.175.128.0 - 79.175.162.192 ir -79.175.162.193 - 79.175.162.224 se -79.175.162.225 - 79.175.164.255 ir -79.175.165.0 - 79.175.165.255 se -79.175.166.0 - 79.175.167.133 ir -79.175.167.134 - 79.175.167.143 ae -79.175.167.144 - 79.175.167.237 ir -79.175.167.238 - 79.175.167.253 ca -79.175.167.254 - 79.175.191.255 ir +79.175.128.0 - 79.175.191.255 ir 79.175.192.0 - 79.175.255.255 pl -79.176.0.0 - 79.183.255.255 il +79.176.0.0 - 79.180.175.218 il +79.180.175.219 - 79.180.175.219 ro +79.180.175.220 - 79.183.255.255 il 79.184.0.0 - 79.191.255.255 pl 79.192.0.0 - 79.255.255.255 de -80.0.0.0 - 80.6.224.191 gb -80.6.224.192 - 80.6.224.255 ie -80.6.225.0 - 80.6.225.63 gb -80.6.225.64 - 80.6.225.79 ie -80.6.225.80 - 80.6.225.111 gb +80.0.0.0 - 80.6.225.111 gb 80.6.225.112 - 80.6.225.127 ie -80.6.225.128 - 80.6.225.223 gb -80.6.225.224 - 80.6.225.239 ie -80.6.225.240 - 80.6.225.255 gb -80.6.226.0 - 80.6.226.15 ie -80.6.226.16 - 80.6.226.79 gb -80.6.226.80 - 80.6.226.111 ie -80.6.226.112 - 80.6.227.55 gb -80.6.227.56 - 80.6.227.63 ie -80.6.227.64 - 80.7.255.255 gb -80.8.0.0 - 80.12.70.255 fr -80.12.71.0 - 80.12.71.47 gb -80.12.71.48 - 80.12.71.255 fr -80.12.72.0 - 80.12.72.255 mg -80.12.73.0 - 80.12.95.255 fr +80.6.225.128 - 80.7.255.255 gb +80.8.0.0 - 80.8.191.255 re +80.8.192.0 - 80.8.194.255 yt +80.8.195.0 - 80.8.195.255 fr +80.8.196.0 - 80.8.198.255 yt +80.8.199.0 - 80.8.199.255 fr +80.8.200.0 - 80.8.200.255 yt +80.8.201.0 - 80.8.202.255 fr +80.8.203.0 - 80.8.204.255 yt +80.8.205.0 - 80.8.205.255 fr +80.8.206.0 - 80.8.207.255 yt +80.8.208.0 - 80.8.208.255 fr +80.8.209.0 - 80.8.213.255 yt +80.8.214.0 - 80.8.214.255 fr +80.8.215.0 - 80.8.215.255 yt +80.8.216.0 - 80.8.217.255 fr +80.8.218.0 - 80.8.218.255 yt +80.8.219.0 - 80.8.224.255 fr +80.8.225.0 - 80.8.225.255 yt +80.8.226.0 - 80.8.226.255 fr +80.8.227.0 - 80.8.230.255 yt +80.8.231.0 - 80.8.231.255 fr +80.8.232.0 - 80.8.233.255 yt +80.8.234.0 - 80.8.234.255 fr +80.8.235.0 - 80.8.245.255 yt +80.8.246.0 - 80.12.95.255 fr 80.12.96.0 - 80.12.98.255 us -80.12.99.0 - 80.12.192.255 fr -80.12.193.0 - 80.12.193.255 us -80.12.194.0 - 80.12.211.255 fr -80.12.212.0 - 80.12.213.127 re -80.12.213.128 - 80.12.239.255 fr +80.12.99.0 - 80.12.128.255 fr +80.12.129.0 - 80.12.136.255 gf +80.12.137.0 - 80.12.137.255 fr +80.12.138.0 - 80.12.140.255 gf +80.12.141.0 - 80.12.141.255 fr +80.12.142.0 - 80.12.143.255 gf +80.12.144.0 - 80.12.144.255 fr +80.12.145.0 - 80.12.146.255 gf +80.12.147.0 - 80.12.147.255 fr +80.12.148.0 - 80.12.149.255 gf +80.12.150.0 - 80.12.150.255 fr +80.12.151.0 - 80.12.154.255 gf +80.12.155.0 - 80.12.156.255 fr +80.12.157.0 - 80.12.158.255 gf +80.12.159.0 - 80.12.159.255 fr +80.12.160.0 - 80.12.168.255 gf +80.12.169.0 - 80.12.171.255 fr +80.12.172.0 - 80.12.180.255 gf +80.12.181.0 - 80.12.181.255 fr +80.12.182.0 - 80.12.191.255 gf +80.12.192.0 - 80.12.211.255 fr +80.12.212.0 - 80.12.213.255 re +80.12.214.0 - 80.12.239.255 fr 80.12.240.0 - 80.12.241.255 re -80.12.242.0 - 80.12.242.155 fr -80.12.242.156 - 80.12.242.156 lu -80.12.242.157 - 80.15.223.255 fr -80.15.224.0 - 80.15.227.255 mu -80.15.228.0 - 80.15.231.255 fr -80.15.232.0 - 80.15.232.255 kr -80.15.233.0 - 80.15.234.255 fr +80.12.242.0 - 80.15.227.255 fr +80.15.228.0 - 80.15.231.255 de +80.15.232.0 - 80.15.234.255 fr 80.15.235.0 - 80.15.235.191 de 80.15.235.192 - 80.15.235.255 fr 80.15.236.0 - 80.15.236.127 gb -80.15.236.128 - 80.15.237.31 fr -80.15.237.32 - 80.15.237.35 de -80.15.237.36 - 80.15.237.39 fr -80.15.237.40 - 80.15.237.47 gb -80.15.237.48 - 80.15.238.191 fr -80.15.238.192 - 80.15.238.199 gb -80.15.238.200 - 80.15.238.255 fr -80.15.239.0 - 80.15.239.255 gb -80.15.240.0 - 80.15.240.63 lb -80.15.240.64 - 80.15.240.95 fr -80.15.240.96 - 80.15.241.255 lb -80.15.242.0 - 80.15.242.15 ci -80.15.242.16 - 80.15.242.255 fr -80.15.243.0 - 80.15.243.47 td -80.15.243.48 - 80.15.243.255 fr -80.15.244.0 - 80.15.244.127 td -80.15.244.128 - 80.15.246.255 fr -80.15.247.0 - 80.15.247.255 lb -80.15.248.0 - 80.15.248.255 fr -80.15.249.0 - 80.15.249.239 us -80.15.249.240 - 80.15.249.255 fr -80.15.250.0 - 80.15.250.215 lb -80.15.250.216 - 80.15.250.223 fr -80.15.250.224 - 80.15.250.255 lb -80.15.251.0 - 80.15.251.255 fr -80.15.252.0 - 80.15.252.255 a2 -80.15.253.0 - 80.15.255.255 fr +80.15.236.128 - 80.15.237.63 fr +80.15.237.64 - 80.15.237.127 gb +80.15.237.128 - 80.15.237.255 de +80.15.238.0 - 80.15.239.255 fr +80.15.240.0 - 80.15.242.63 gb +80.15.242.64 - 80.15.247.127 fr +80.15.247.128 - 80.15.247.135 lb +80.15.247.136 - 80.15.249.191 fr +80.15.249.192 - 80.15.249.239 us +80.15.249.240 - 80.15.255.255 fr 80.16.0.0 - 80.23.255.255 it 80.24.0.0 - 80.39.255.255 es 80.40.0.0 - 80.47.255.255 gb @@ -37375,15 +19588,14 @@ 80.64.80.0 - 80.64.95.255 ua 80.64.96.0 - 80.64.111.255 ru 80.64.112.0 - 80.64.127.255 it -80.64.128.0 - 80.64.143.255 at +80.64.128.0 - 80.64.139.255 at +80.64.140.0 - 80.64.143.255 de 80.64.144.0 - 80.64.159.255 lu 80.64.160.0 - 80.64.175.255 ru 80.64.176.0 - 80.64.191.255 de 80.64.192.0 - 80.64.207.255 no -80.64.208.0 - 80.64.223.255 jo -80.64.224.0 - 80.64.234.255 fr -80.64.235.0 - 80.64.235.255 kz -80.64.236.0 - 80.64.239.255 fr +80.64.224.0 - 80.64.224.255 eu +80.64.225.0 - 80.64.239.255 fr 80.64.240.0 - 80.65.7.255 nl 80.65.8.0 - 80.65.15.255 es 80.65.16.0 - 80.65.31.255 ru @@ -37392,94 +19604,43 @@ 80.65.64.0 - 80.65.95.255 ba 80.65.96.0 - 80.65.127.255 nl 80.65.128.0 - 80.65.143.255 be -80.65.144.0 - 80.65.158.255 it -80.65.159.0 - 80.65.159.31 hu -80.65.159.32 - 80.65.159.255 it +80.65.144.0 - 80.65.159.255 it 80.65.160.0 - 80.65.175.255 ba 80.65.176.0 - 80.65.191.255 cz 80.65.192.0 - 80.65.207.255 se -80.65.208.0 - 80.65.223.255 gb 80.65.224.0 - 80.65.239.255 fr -80.65.240.0 - 80.65.247.255 im -80.65.248.0 - 80.65.248.31 gb -80.65.248.32 - 80.65.248.127 im -80.65.248.128 - 80.65.248.159 gb -80.65.248.160 - 80.65.248.255 im -80.65.249.0 - 80.65.250.15 gb -80.65.250.16 - 80.65.250.31 im -80.65.250.32 - 80.65.250.111 gb -80.65.250.112 - 80.65.250.127 im -80.65.250.128 - 80.65.250.223 gb -80.65.250.224 - 80.65.250.255 im -80.65.251.0 - 80.65.252.63 gb -80.65.252.64 - 80.65.252.127 im -80.65.252.128 - 80.65.252.163 gb -80.65.252.164 - 80.65.252.167 im -80.65.252.168 - 80.65.252.175 gb -80.65.252.176 - 80.65.252.207 im -80.65.252.208 - 80.65.252.215 gb -80.65.252.216 - 80.65.252.247 im -80.65.252.248 - 80.65.252.251 gb -80.65.252.252 - 80.65.252.255 im -80.65.253.0 - 80.65.253.3 gb -80.65.253.4 - 80.65.253.7 im -80.65.253.8 - 80.65.254.79 gb -80.65.254.80 - 80.65.254.119 im -80.65.254.120 - 80.65.254.175 gb -80.65.254.176 - 80.65.254.179 im -80.65.254.180 - 80.65.255.255 gb +80.65.240.0 - 80.65.255.255 im 80.66.0.0 - 80.66.31.255 de 80.66.32.0 - 80.66.63.255 at 80.66.64.0 - 80.66.95.255 ru -80.66.96.0 - 80.66.101.95 de -80.66.101.96 - 80.66.101.111 ch -80.66.101.112 - 80.66.111.255 de +80.66.96.0 - 80.66.111.255 de 80.66.112.0 - 80.66.127.255 es -80.66.128.0 - 80.66.135.119 be -80.66.135.120 - 80.66.135.127 gb -80.66.135.128 - 80.66.137.255 be -80.66.138.0 - 80.66.138.4 at -80.66.138.5 - 80.66.138.7 be -80.66.138.8 - 80.66.138.15 at -80.66.138.16 - 80.66.138.23 cz -80.66.138.24 - 80.66.138.31 be -80.66.138.32 - 80.66.138.47 ch -80.66.138.48 - 80.66.138.159 be -80.66.138.160 - 80.66.138.191 hr -80.66.138.192 - 80.66.138.255 be -80.66.139.0 - 80.66.139.63 at -80.66.139.64 - 80.66.143.255 be +80.66.128.0 - 80.66.143.255 be 80.66.144.0 - 80.66.159.255 ru 80.66.160.0 - 80.66.175.255 fi 80.66.176.0 - 80.66.191.255 ir -80.66.192.0 - 80.66.207.255 de 80.66.208.0 - 80.66.223.255 it -80.66.224.0 - 80.66.229.255 li -80.66.230.0 - 80.66.230.63 ch -80.66.230.64 - 80.66.235.255 li -80.66.236.0 - 80.66.236.255 ch -80.66.237.0 - 80.66.239.255 li +80.66.224.0 - 80.66.239.255 li 80.66.240.0 - 80.66.255.255 ee -80.67.0.0 - 80.67.11.191 se -80.67.11.192 - 80.67.11.199 sk -80.67.11.200 - 80.67.13.255 se -80.67.14.0 - 80.67.15.255 a1 +80.67.0.0 - 80.67.6.87 se +80.67.6.88 - 80.67.6.91 es +80.67.6.92 - 80.67.15.255 se 80.67.16.0 - 80.67.31.255 de -80.67.32.0 - 80.67.47.255 dk 80.67.48.0 - 80.67.63.255 ru 80.67.64.0 - 80.67.77.255 us 80.67.78.0 - 80.67.79.255 kr -80.67.80.0 - 80.67.82.255 us +80.67.80.0 - 80.67.80.255 eu +80.67.81.0 - 80.67.82.255 us 80.67.83.0 - 80.67.83.255 de 80.67.84.0 - 80.67.95.255 us 80.67.96.0 - 80.67.111.255 es 80.67.112.0 - 80.67.127.255 it -80.67.128.0 - 80.67.143.255 dz +80.67.128.0 - 80.67.143.255 mu 80.67.144.0 - 80.67.159.255 ch -80.67.160.0 - 80.67.191.255 fr -80.67.192.0 - 80.67.203.255 se -80.67.204.0 - 80.67.205.255 dk -80.67.206.0 - 80.67.207.255 se +80.67.160.0 - 80.67.180.255 fr +80.67.181.0 - 80.67.181.255 be +80.67.182.0 - 80.67.191.255 fr +80.67.192.0 - 80.67.207.255 se 80.67.208.0 - 80.67.223.255 ru 80.67.224.0 - 80.67.239.255 de 80.67.240.0 - 80.68.15.255 ru @@ -37494,44 +19655,7 @@ 80.68.208.0 - 80.68.223.255 gb 80.68.224.0 - 80.68.239.255 pl 80.68.240.0 - 80.68.255.255 ru -80.69.0.0 - 80.69.2.63 gb -80.69.2.64 - 80.69.2.95 hk -80.69.2.96 - 80.69.2.99 gb -80.69.2.100 - 80.69.2.103 il -80.69.2.104 - 80.69.2.111 us -80.69.2.112 - 80.69.5.31 gb -80.69.5.32 - 80.69.5.47 vg -80.69.5.48 - 80.69.5.63 gb -80.69.5.64 - 80.69.5.95 us -80.69.5.96 - 80.69.6.47 gb -80.69.6.48 - 80.69.6.55 us -80.69.6.56 - 80.69.7.127 gb -80.69.7.128 - 80.69.7.159 gr -80.69.7.160 - 80.69.16.71 gb -80.69.16.72 - 80.69.16.75 us -80.69.16.76 - 80.69.16.123 gb -80.69.16.124 - 80.69.16.127 us -80.69.16.128 - 80.69.16.143 gb -80.69.16.144 - 80.69.16.151 us -80.69.16.152 - 80.69.16.207 gb -80.69.16.208 - 80.69.16.211 us -80.69.16.212 - 80.69.16.243 gb -80.69.16.244 - 80.69.16.247 us -80.69.16.248 - 80.69.17.255 gb -80.69.18.0 - 80.69.18.255 li -80.69.19.0 - 80.69.19.255 gb -80.69.20.0 - 80.69.20.63 us -80.69.20.64 - 80.69.20.95 gb -80.69.20.96 - 80.69.20.127 us -80.69.20.128 - 80.69.20.191 gb -80.69.20.192 - 80.69.20.255 us -80.69.21.0 - 80.69.21.127 li -80.69.21.128 - 80.69.21.255 us -80.69.22.0 - 80.69.23.95 gb -80.69.23.96 - 80.69.23.127 us -80.69.23.128 - 80.69.23.255 gb -80.69.24.0 - 80.69.24.127 us -80.69.24.128 - 80.69.31.255 gb +80.69.0.0 - 80.69.31.255 gb 80.69.32.0 - 80.69.47.255 de 80.69.48.0 - 80.69.63.255 az 80.69.64.0 - 80.69.95.255 nl @@ -37541,7 +19665,9 @@ 80.69.160.0 - 80.69.175.255 fi 80.69.176.0 - 80.69.191.255 ru 80.69.192.0 - 80.69.207.255 de -80.69.208.0 - 80.69.223.255 fr +80.69.208.0 - 80.69.212.255 fr +80.69.213.0 - 80.69.213.255 re +80.69.214.0 - 80.69.223.255 fr 80.69.224.0 - 80.69.239.255 se 80.69.240.0 - 80.69.255.255 ir 80.70.0.0 - 80.70.15.255 dk @@ -37553,9 +19679,7 @@ 80.70.112.0 - 80.70.127.255 it 80.70.128.0 - 80.70.143.255 il 80.70.144.0 - 80.70.159.255 se -80.70.160.0 - 80.70.161.15 de -80.70.161.16 - 80.70.161.31 ch -80.70.161.32 - 80.70.207.255 de +80.70.160.0 - 80.70.207.255 de 80.70.208.0 - 80.70.223.255 fr 80.70.224.0 - 80.70.239.255 ru 80.70.240.0 - 80.70.255.255 rs @@ -37591,11 +19715,7 @@ 80.73.32.0 - 80.73.47.255 de 80.73.48.0 - 80.73.63.255 se 80.73.64.0 - 80.73.95.255 ru -80.73.96.0 - 80.73.99.223 de -80.73.99.224 - 80.73.99.255 es -80.73.100.0 - 80.73.116.127 de -80.73.116.128 - 80.73.116.143 ch -80.73.116.144 - 80.73.127.255 de +80.73.96.0 - 80.73.127.255 de 80.73.128.0 - 80.73.143.255 nl 80.73.144.0 - 80.73.159.255 es 80.73.160.0 - 80.73.175.255 ru @@ -37603,8 +19723,8 @@ 80.73.192.0 - 80.73.207.255 ru 80.73.208.0 - 80.73.223.255 gg 80.73.224.0 - 80.73.239.255 it -80.73.240.0 - 80.73.255.255 at -80.74.0.0 - 80.74.31.255 gb +80.73.240.0 - 80.73.247.255 at +80.73.248.0 - 80.74.31.255 gb 80.74.32.0 - 80.74.47.255 cz 80.74.48.0 - 80.74.63.255 ro 80.74.64.0 - 80.74.79.255 fr @@ -37618,9 +19738,7 @@ 80.75.0.0 - 80.75.15.255 ir 80.75.16.0 - 80.75.31.255 se 80.75.32.0 - 80.75.63.255 at -80.75.64.0 - 80.75.73.255 gb -80.75.74.0 - 80.75.74.31 us -80.75.74.32 - 80.75.79.255 gb +80.75.64.0 - 80.75.79.255 gb 80.75.80.0 - 80.75.95.255 ru 80.75.96.0 - 80.75.111.255 fi 80.75.112.0 - 80.75.127.255 ch @@ -37628,22 +19746,21 @@ 80.75.144.0 - 80.75.159.255 fr 80.75.160.0 - 80.75.191.255 eg 80.75.192.0 - 80.75.207.255 ch -80.75.208.0 - 80.75.209.255 gb -80.75.210.0 - 80.75.210.255 in -80.75.211.0 - 80.75.211.255 fr -80.75.212.0 - 80.75.212.255 in -80.75.213.0 - 80.75.213.255 de +80.75.208.0 - 80.75.209.255 in +80.75.210.0 - 80.75.211.255 de +80.75.212.0 - 80.75.213.255 in 80.75.214.0 - 80.75.215.255 gb 80.75.216.0 - 80.75.217.255 de 80.75.218.0 - 80.75.218.255 gb -80.75.219.0 - 80.75.219.255 in -80.75.220.0 - 80.75.220.255 no +80.75.219.0 - 80.75.220.255 in 80.75.221.0 - 80.75.221.255 gb 80.75.222.0 - 80.75.222.255 de 80.75.223.0 - 80.75.223.255 in -80.75.224.0 - 80.75.239.255 hu -80.75.240.0 - 80.75.255.255 at -80.76.0.0 - 80.76.15.255 ch +80.75.224.0 - 80.75.230.63 hu +80.75.230.64 - 80.75.255.255 at +80.76.0.0 - 80.76.7.127 ch +80.76.7.128 - 80.76.7.255 at +80.76.8.0 - 80.76.15.255 ch 80.76.16.0 - 80.76.31.255 it 80.76.32.0 - 80.76.63.255 gr 80.76.64.0 - 80.76.95.255 it @@ -37651,170 +19768,265 @@ 80.76.112.0 - 80.76.127.255 gb 80.76.128.0 - 80.76.143.255 ru 80.76.144.0 - 80.76.159.255 se -80.76.160.0 - 80.76.175.255 qa +80.76.160.0 - 80.76.165.255 qa +80.76.166.0 - 80.76.167.255 us +80.76.168.0 - 80.76.175.255 qa 80.76.176.0 - 80.76.191.255 ru -80.76.192.0 - 80.76.205.239 gb -80.76.205.240 - 80.76.205.247 ie -80.76.205.248 - 80.76.206.159 gb -80.76.206.160 - 80.76.206.167 ie -80.76.206.168 - 80.76.206.175 gb -80.76.206.176 - 80.76.206.183 ie -80.76.206.184 - 80.76.207.103 gb -80.76.207.104 - 80.76.207.111 ie -80.76.207.112 - 80.76.223.255 gb +80.76.192.0 - 80.76.223.255 gb 80.76.224.0 - 80.76.255.255 ru -80.77.0.0 - 80.77.0.255 eg -80.77.1.0 - 80.77.1.255 hk -80.77.2.0 - 80.77.2.119 us -80.77.2.120 - 80.77.3.255 eg -80.77.4.0 - 80.77.4.255 us -80.77.5.0 - 80.77.7.255 eg +80.77.0.0 - 80.77.7.255 gb 80.77.8.0 - 80.77.11.255 pk -80.77.12.0 - 80.77.13.255 eg -80.77.14.0 - 80.77.14.255 hk -80.77.15.0 - 80.77.15.255 eg -80.77.16.0 - 80.77.17.151 de -80.77.17.152 - 80.77.17.159 gr -80.77.17.160 - 80.77.22.127 de -80.77.22.128 - 80.77.22.159 at -80.77.22.160 - 80.77.24.199 de +80.77.12.0 - 80.77.15.255 gb +80.77.16.0 - 80.77.24.199 de 80.77.24.200 - 80.77.24.207 gr -80.77.24.208 - 80.77.28.255 de -80.77.29.0 - 80.77.29.7 es -80.77.29.8 - 80.77.29.95 de -80.77.29.96 - 80.77.29.111 at -80.77.29.112 - 80.77.29.119 gr -80.77.29.120 - 80.77.31.255 de +80.77.24.208 - 80.77.31.255 de 80.77.32.0 - 80.77.47.255 ua 80.77.48.0 - 80.77.63.255 ge -80.77.64.0 - 80.77.67.239 dk -80.77.67.240 - 80.77.67.255 gb -80.77.68.0 - 80.77.79.255 dk -80.77.80.0 - 80.77.84.255 gb -80.77.85.0 - 80.77.85.255 us -80.77.86.0 - 80.77.92.255 gb -80.77.93.0 - 80.77.94.223 ru -80.77.94.224 - 80.77.95.255 us -80.77.96.0 - 80.77.98.223 se -80.77.98.224 - 80.77.98.224 fi -80.77.98.225 - 80.77.100.191 se -80.77.100.192 - 80.77.100.223 fi -80.77.100.224 - 80.77.101.223 se -80.77.101.224 - 80.77.101.231 ru -80.77.101.232 - 80.77.105.255 se -80.77.106.0 - 80.77.106.3 no -80.77.106.4 - 80.77.106.7 se -80.77.106.8 - 80.77.106.47 no -80.77.106.48 - 80.77.106.79 se -80.77.106.80 - 80.77.106.95 fi -80.77.106.96 - 80.77.111.255 se -80.77.112.0 - 80.77.126.95 hu -80.77.126.96 - 80.77.126.111 sc -80.77.126.112 - 80.77.127.207 hu -80.77.127.208 - 80.77.127.223 sc -80.77.127.224 - 80.77.127.255 hu +80.77.64.0 - 80.77.79.255 dk +80.77.80.0 - 80.77.95.255 gb +80.77.96.0 - 80.77.111.255 se +80.77.112.0 - 80.77.127.255 hu 80.77.128.0 - 80.77.143.255 fo 80.77.144.0 - 80.77.159.255 mk 80.77.160.0 - 80.77.175.255 ru 80.77.176.0 - 80.77.191.255 lb 80.77.192.0 - 80.77.207.255 mt -80.77.208.0 - 80.77.215.239 de -80.77.215.240 - 80.77.215.255 br -80.77.216.0 - 80.77.222.159 de -80.77.222.160 - 80.77.222.191 my -80.77.222.192 - 80.77.223.255 de +80.77.208.0 - 80.77.223.255 de 80.77.224.0 - 80.77.239.255 fr -80.77.240.0 - 80.77.244.255 gb -80.77.245.0 - 80.77.245.63 bn -80.77.245.64 - 80.77.245.255 gb -80.77.246.0 - 80.77.246.7 bg -80.77.246.8 - 80.77.255.255 gb +80.77.240.0 - 80.77.255.255 gb 80.78.0.0 - 80.78.15.255 fr 80.78.16.0 - 80.78.16.127 se -80.78.16.128 - 80.78.16.135 lr -80.78.16.136 - 80.78.16.143 ga -80.78.16.144 - 80.78.16.167 a2 -80.78.16.168 - 80.78.16.175 ng -80.78.16.176 - 80.78.16.239 a2 -80.78.16.240 - 80.78.16.247 gn -80.78.16.248 - 80.78.17.7 a2 -80.78.17.8 - 80.78.17.15 gb -80.78.17.16 - 80.78.17.39 a2 +80.78.16.128 - 80.78.16.128 lr +80.78.16.129 - 80.78.16.132 dj +80.78.16.133 - 80.78.16.135 lr +80.78.16.136 - 80.78.16.144 ga +80.78.16.145 - 80.78.16.151 ng +80.78.16.152 - 80.78.16.167 a2 +80.78.16.168 - 80.78.16.191 ng +80.78.16.192 - 80.78.16.207 a2 +80.78.16.208 - 80.78.16.208 cy +80.78.16.209 - 80.78.16.216 ng +80.78.16.217 - 80.78.16.223 us +80.78.16.224 - 80.78.16.224 a2 +80.78.16.225 - 80.78.16.232 ng +80.78.16.233 - 80.78.16.240 tz +80.78.16.241 - 80.78.17.0 gn +80.78.17.1 - 80.78.17.7 us +80.78.17.8 - 80.78.17.16 ga +80.78.17.17 - 80.78.17.24 ng +80.78.17.25 - 80.78.17.31 a2 +80.78.17.32 - 80.78.17.39 iq 80.78.17.40 - 80.78.17.47 lr -80.78.17.48 - 80.78.17.71 a2 -80.78.17.72 - 80.78.17.79 gn -80.78.17.80 - 80.78.17.87 ps -80.78.17.88 - 80.78.17.95 ng -80.78.17.96 - 80.78.17.103 gh -80.78.17.104 - 80.78.17.119 a2 -80.78.17.120 - 80.78.17.127 gn -80.78.17.128 - 80.78.17.159 a2 -80.78.17.160 - 80.78.17.167 ng -80.78.17.168 - 80.78.17.175 a2 -80.78.17.176 - 80.78.17.183 us -80.78.17.184 - 80.78.17.191 a2 -80.78.17.192 - 80.78.17.199 us -80.78.17.200 - 80.78.17.215 a2 -80.78.17.216 - 80.78.17.231 gn -80.78.17.232 - 80.78.17.247 a2 -80.78.17.248 - 80.78.18.15 ng -80.78.18.16 - 80.78.18.47 a2 -80.78.18.48 - 80.78.18.55 gn -80.78.18.56 - 80.78.18.63 a2 -80.78.18.64 - 80.78.18.71 zm -80.78.18.72 - 80.78.18.95 a2 -80.78.18.96 - 80.78.18.103 ng -80.78.18.104 - 80.78.18.111 a2 -80.78.18.112 - 80.78.18.119 ng -80.78.18.120 - 80.78.18.143 a2 -80.78.18.144 - 80.78.18.151 ca -80.78.18.152 - 80.78.18.159 a2 -80.78.18.160 - 80.78.18.167 gn -80.78.18.168 - 80.78.18.175 gb -80.78.18.176 - 80.78.18.191 a2 -80.78.18.192 - 80.78.18.207 gq -80.78.18.208 - 80.78.18.223 a2 -80.78.18.224 - 80.78.18.231 gb -80.78.18.232 - 80.78.18.239 us -80.78.18.240 - 80.78.18.247 ng -80.78.18.248 - 80.78.19.7 a2 -80.78.19.8 - 80.78.19.15 ng -80.78.19.16 - 80.78.19.39 a2 -80.78.19.40 - 80.78.19.47 ng -80.78.19.48 - 80.78.19.79 a2 -80.78.19.80 - 80.78.19.87 gn -80.78.19.88 - 80.78.19.135 a2 +80.78.17.48 - 80.78.17.55 td +80.78.17.56 - 80.78.17.56 gh +80.78.17.57 - 80.78.17.72 ng +80.78.17.73 - 80.78.17.80 gn +80.78.17.81 - 80.78.17.88 ps +80.78.17.89 - 80.78.17.96 ng +80.78.17.97 - 80.78.17.104 gh +80.78.17.105 - 80.78.17.112 ng +80.78.17.113 - 80.78.17.119 zm +80.78.17.120 - 80.78.17.120 a2 +80.78.17.121 - 80.78.17.128 gn +80.78.17.129 - 80.78.17.136 ng +80.78.17.137 - 80.78.17.144 gn +80.78.17.145 - 80.78.17.151 ng +80.78.17.152 - 80.78.17.160 us +80.78.17.161 - 80.78.17.176 ng +80.78.17.177 - 80.78.17.183 us +80.78.17.184 - 80.78.17.184 pk +80.78.17.185 - 80.78.17.192 gh +80.78.17.193 - 80.78.17.200 lr +80.78.17.201 - 80.78.17.216 ng +80.78.17.217 - 80.78.17.232 gn +80.78.17.233 - 80.78.17.235 a2 +80.78.17.236 - 80.78.17.239 br +80.78.17.240 - 80.78.17.240 gn +80.78.17.241 - 80.78.17.248 us +80.78.17.249 - 80.78.18.23 ng +80.78.18.24 - 80.78.18.27 a2 +80.78.18.28 - 80.78.18.28 us +80.78.18.29 - 80.78.18.31 a2 +80.78.18.32 - 80.78.18.32 gn +80.78.18.33 - 80.78.18.48 us +80.78.18.49 - 80.78.18.56 gn +80.78.18.57 - 80.78.18.64 ng +80.78.18.65 - 80.78.18.80 zm +80.78.18.81 - 80.78.18.104 ng +80.78.18.105 - 80.78.18.111 us +80.78.18.112 - 80.78.18.120 ng +80.78.18.121 - 80.78.18.128 gn +80.78.18.129 - 80.78.18.135 cm +80.78.18.136 - 80.78.18.144 ng +80.78.18.145 - 80.78.18.152 cg +80.78.18.153 - 80.78.18.160 ng +80.78.18.161 - 80.78.18.168 gn +80.78.18.169 - 80.78.18.176 zm +80.78.18.177 - 80.78.18.184 gn +80.78.18.185 - 80.78.18.191 ng +80.78.18.192 - 80.78.18.208 gq +80.78.18.209 - 80.78.18.216 gn +80.78.18.217 - 80.78.18.224 us +80.78.18.225 - 80.78.18.232 cm +80.78.18.233 - 80.78.18.240 tz +80.78.18.241 - 80.78.18.248 ng +80.78.18.249 - 80.78.19.0 us +80.78.19.1 - 80.78.19.24 ng +80.78.19.25 - 80.78.19.32 cm +80.78.19.33 - 80.78.19.39 us +80.78.19.40 - 80.78.19.48 ng +80.78.19.49 - 80.78.19.56 tz +80.78.19.57 - 80.78.19.63 a2 +80.78.19.64 - 80.78.19.71 us +80.78.19.72 - 80.78.19.88 gn +80.78.19.89 - 80.78.19.96 ng +80.78.19.97 - 80.78.19.104 gn +80.78.19.105 - 80.78.19.120 us +80.78.19.121 - 80.78.19.128 ng +80.78.19.129 - 80.78.19.135 ga 80.78.19.136 - 80.78.19.143 us -80.78.19.144 - 80.78.19.191 a2 -80.78.19.192 - 80.78.19.199 ng -80.78.19.200 - 80.78.19.207 gb -80.78.19.208 - 80.78.19.247 a2 -80.78.19.248 - 80.78.19.255 ng -80.78.20.0 - 80.78.20.215 a2 -80.78.20.216 - 80.78.20.223 kw -80.78.20.224 - 80.78.23.95 a2 -80.78.23.96 - 80.78.23.103 us -80.78.23.104 - 80.78.23.111 ng -80.78.23.112 - 80.78.23.231 a2 -80.78.23.232 - 80.78.23.239 gb -80.78.23.240 - 80.78.26.31 a2 -80.78.26.32 - 80.78.26.39 iq -80.78.26.40 - 80.78.27.7 a2 -80.78.27.8 - 80.78.27.15 us -80.78.27.16 - 80.78.31.255 a2 +80.78.19.144 - 80.78.19.144 cm +80.78.19.145 - 80.78.19.160 ng +80.78.19.161 - 80.78.19.167 gn +80.78.19.168 - 80.78.19.184 ng +80.78.19.185 - 80.78.19.191 lr +80.78.19.192 - 80.78.19.200 ng +80.78.19.201 - 80.78.19.208 ne +80.78.19.209 - 80.78.19.216 gn +80.78.19.217 - 80.78.19.224 ng +80.78.19.225 - 80.78.19.232 us +80.78.19.233 - 80.78.19.239 a2 +80.78.19.240 - 80.78.19.240 ke +80.78.19.241 - 80.78.20.0 ng +80.78.20.1 - 80.78.20.4 se +80.78.20.5 - 80.78.20.7 a2 +80.78.20.8 - 80.78.20.15 iq +80.78.20.16 - 80.78.20.16 a2 +80.78.20.17 - 80.78.20.24 cm +80.78.20.25 - 80.78.20.32 us +80.78.20.33 - 80.78.20.40 lr +80.78.20.41 - 80.78.20.48 ng +80.78.20.49 - 80.78.20.56 lr +80.78.20.57 - 80.78.20.60 ls +80.78.20.61 - 80.78.20.63 lr +80.78.20.64 - 80.78.20.71 br +80.78.20.72 - 80.78.20.72 a2 +80.78.20.73 - 80.78.20.80 cm +80.78.20.81 - 80.78.20.95 ug +80.78.20.96 - 80.78.20.96 us +80.78.20.97 - 80.78.20.104 ng +80.78.20.105 - 80.78.20.111 kz +80.78.20.112 - 80.78.20.120 ng +80.78.20.121 - 80.78.20.128 ga +80.78.20.129 - 80.78.20.135 ng +80.78.20.136 - 80.78.20.143 cm +80.78.20.144 - 80.78.20.144 lr +80.78.20.145 - 80.78.20.160 us +80.78.20.161 - 80.78.20.164 ls +80.78.20.165 - 80.78.20.167 iq +80.78.20.168 - 80.78.20.192 ng +80.78.20.193 - 80.78.20.193 cm +80.78.20.194 - 80.78.20.194 ng +80.78.20.195 - 80.78.20.200 cm +80.78.20.201 - 80.78.20.207 gn +80.78.20.208 - 80.78.20.210 a2 +80.78.20.211 - 80.78.20.216 ng +80.78.20.217 - 80.78.20.217 us +80.78.20.218 - 80.78.20.218 ng +80.78.20.219 - 80.78.20.224 us +80.78.20.225 - 80.78.20.227 a2 +80.78.20.228 - 80.78.20.232 se +80.78.20.233 - 80.78.20.239 so +80.78.20.240 - 80.78.20.255 us +80.78.21.0 - 80.78.21.0 a2 +80.78.21.1 - 80.78.21.32 us +80.78.21.33 - 80.78.22.255 a2 +80.78.23.0 - 80.78.23.16 cg +80.78.23.17 - 80.78.23.32 us +80.78.23.33 - 80.78.23.39 lr +80.78.23.40 - 80.78.23.56 a2 +80.78.23.57 - 80.78.23.80 ng +80.78.23.81 - 80.78.23.88 a2 +80.78.23.89 - 80.78.23.96 ls +80.78.23.97 - 80.78.23.103 af +80.78.23.104 - 80.78.23.127 ng +80.78.23.128 - 80.78.23.128 a2 +80.78.23.129 - 80.78.23.136 ly +80.78.23.137 - 80.78.23.144 za +80.78.23.145 - 80.78.23.152 ng +80.78.23.153 - 80.78.23.156 gn +80.78.23.157 - 80.78.23.159 a2 +80.78.23.160 - 80.78.23.168 fr +80.78.23.169 - 80.78.23.176 ng +80.78.23.177 - 80.78.23.183 us +80.78.23.184 - 80.78.23.184 ng +80.78.23.185 - 80.78.23.192 gn +80.78.23.193 - 80.78.23.208 ls +80.78.23.209 - 80.78.23.216 so +80.78.23.217 - 80.78.23.223 a2 +80.78.23.224 - 80.78.23.240 zm +80.78.23.241 - 80.78.23.247 us +80.78.23.248 - 80.78.23.248 ao +80.78.23.249 - 80.78.24.0 ng +80.78.24.1 - 80.78.26.0 a2 +80.78.26.1 - 80.78.26.1 us +80.78.26.2 - 80.78.26.4 a2 +80.78.26.5 - 80.78.26.8 us +80.78.26.9 - 80.78.26.11 bw +80.78.26.12 - 80.78.26.15 a2 +80.78.26.16 - 80.78.26.31 bw +80.78.26.32 - 80.78.26.32 iq +80.78.26.33 - 80.78.26.40 hu +80.78.26.41 - 80.78.26.47 lb +80.78.26.48 - 80.78.26.72 a2 +80.78.26.73 - 80.78.26.80 om +80.78.26.81 - 80.78.26.88 gh +80.78.26.89 - 80.78.26.96 fr +80.78.26.97 - 80.78.26.104 ng +80.78.26.105 - 80.78.26.108 ls +80.78.26.109 - 80.78.26.112 a2 +80.78.26.113 - 80.78.26.120 ng +80.78.26.121 - 80.78.26.184 a2 +80.78.26.185 - 80.78.26.192 ng +80.78.26.193 - 80.78.26.232 us +80.78.26.233 - 80.78.26.240 ls +80.78.26.241 - 80.78.26.248 us +80.78.26.249 - 80.78.26.255 a2 +80.78.27.0 - 80.78.27.7 us +80.78.27.8 - 80.78.27.8 a2 +80.78.27.9 - 80.78.27.32 us +80.78.27.33 - 80.78.27.40 a2 +80.78.27.41 - 80.78.27.44 us +80.78.27.45 - 80.78.27.56 a2 +80.78.27.57 - 80.78.27.80 us +80.78.27.81 - 80.78.27.88 se +80.78.27.89 - 80.78.27.104 a2 +80.78.27.105 - 80.78.27.112 us +80.78.27.113 - 80.78.27.128 zm +80.78.27.129 - 80.78.27.136 a2 +80.78.27.137 - 80.78.27.144 us +80.78.27.145 - 80.78.27.160 a2 +80.78.27.161 - 80.78.27.168 us +80.78.27.169 - 80.78.27.176 a2 +80.78.27.177 - 80.78.27.184 us +80.78.27.185 - 80.78.27.192 a2 +80.78.27.193 - 80.78.27.200 us +80.78.27.201 - 80.78.27.224 a2 +80.78.27.225 - 80.78.27.232 us +80.78.27.233 - 80.78.27.240 jo +80.78.27.241 - 80.78.28.8 a2 +80.78.28.9 - 80.78.28.16 us +80.78.28.17 - 80.78.31.47 a2 +80.78.31.48 - 80.78.31.55 us +80.78.31.56 - 80.78.31.127 a2 +80.78.31.128 - 80.78.31.135 sl +80.78.31.136 - 80.78.31.255 a2 80.78.32.0 - 80.78.63.255 ua 80.78.64.0 - 80.78.79.255 al -80.78.80.0 - 80.78.81.15 de -80.78.81.16 - 80.78.81.31 ch -80.78.81.32 - 80.78.95.255 de +80.78.80.0 - 80.78.95.255 de 80.78.96.0 - 80.78.127.255 ru -80.78.128.0 - 80.78.142.255 kw -80.78.143.0 - 80.78.143.255 iq -80.78.144.0 - 80.78.148.255 cz -80.78.149.0 - 80.78.149.255 sk -80.78.150.0 - 80.78.150.255 cz -80.78.151.0 - 80.78.151.255 sk -80.78.152.0 - 80.78.159.255 cz +80.78.128.0 - 80.78.143.255 us +80.78.144.0 - 80.78.159.255 cz 80.78.160.0 - 80.78.191.255 de 80.78.192.0 - 80.78.207.255 ru 80.78.208.0 - 80.78.223.255 se @@ -37825,55 +20037,33 @@ 80.79.32.0 - 80.79.47.255 nl 80.79.48.0 - 80.79.63.255 it 80.79.64.0 - 80.79.79.255 ru -80.79.80.0 - 80.79.95.255 gb +80.79.80.0 - 80.79.80.255 eu +80.79.81.0 - 80.79.81.255 gb +80.79.82.0 - 80.79.82.255 eu +80.79.83.0 - 80.79.95.255 gb 80.79.96.0 - 80.79.111.255 nl -80.79.112.0 - 80.79.115.47 ee -80.79.115.48 - 80.79.115.51 fi -80.79.115.52 - 80.79.125.127 ee -80.79.125.128 - 80.79.125.191 my -80.79.125.192 - 80.79.126.131 ee +80.79.112.0 - 80.79.126.131 ee 80.79.126.132 - 80.79.126.135 de -80.79.126.136 - 80.79.127.79 ee -80.79.127.80 - 80.79.127.83 nz -80.79.127.84 - 80.79.127.88 ee -80.79.127.89 - 80.79.127.92 de -80.79.127.93 - 80.79.127.255 ee +80.79.126.136 - 80.79.127.255 ee 80.79.128.0 - 80.79.143.255 gb -80.79.144.0 - 80.79.159.255 lb +80.79.144.0 - 80.79.151.255 iq +80.79.152.0 - 80.79.159.255 lb 80.79.160.0 - 80.79.175.255 se 80.79.176.0 - 80.79.191.255 ru 80.79.192.0 - 80.79.207.255 nl 80.79.208.0 - 80.79.223.255 gb 80.79.224.0 - 80.79.239.255 de 80.79.240.0 - 80.79.255.255 ru -80.80.0.0 - 80.80.1.255 dk -80.80.2.0 - 80.80.2.7 se -80.80.2.8 - 80.80.2.119 dk -80.80.2.120 - 80.80.2.127 us -80.80.2.128 - 80.80.2.159 dk -80.80.2.160 - 80.80.2.175 us -80.80.2.176 - 80.80.2.215 dk -80.80.2.216 - 80.80.2.223 pt -80.80.2.224 - 80.80.3.63 dk -80.80.3.64 - 80.80.3.79 ch -80.80.3.80 - 80.80.14.31 dk -80.80.14.32 - 80.80.14.63 no -80.80.14.64 - 80.80.16.83 dk -80.80.16.84 - 80.80.16.95 no -80.80.16.96 - 80.80.27.63 dk -80.80.27.64 - 80.80.27.255 no -80.80.28.0 - 80.80.31.255 dk +80.80.0.0 - 80.80.21.255 dk +80.80.22.0 - 80.80.22.255 eu +80.80.23.0 - 80.80.31.255 dk 80.80.32.0 - 80.80.47.255 ba 80.80.48.0 - 80.80.63.255 hr 80.80.64.0 - 80.80.79.255 se 80.80.80.0 - 80.80.95.255 es 80.80.96.0 - 80.80.127.255 ru 80.80.128.0 - 80.80.159.255 bg -80.80.160.0 - 80.80.165.179 al -80.80.165.180 - 80.80.165.183 rs -80.80.165.184 - 80.80.165.191 al -80.80.165.192 - 80.80.165.207 rs -80.80.165.208 - 80.80.175.255 al +80.80.160.0 - 80.80.175.255 al 80.80.176.0 - 80.80.191.255 gb 80.80.192.0 - 80.80.207.255 ru 80.80.208.0 - 80.80.223.255 uz @@ -37882,31 +20072,19 @@ 80.81.0.0 - 80.81.31.255 de 80.81.32.0 - 80.81.63.255 lv 80.81.64.0 - 80.81.67.255 es -80.81.68.0 - 80.81.68.255 gb -80.81.69.0 - 80.81.72.255 es -80.81.73.0 - 80.81.73.255 gb -80.81.74.0 - 80.81.75.63 es -80.81.75.64 - 80.81.75.127 gb -80.81.75.128 - 80.81.75.255 es -80.81.76.0 - 80.81.76.255 gb -80.81.77.0 - 80.81.77.255 de -80.81.78.0 - 80.81.79.255 es -80.81.80.0 - 80.81.80.255 gb -80.81.81.0 - 80.81.127.255 es +80.81.68.0 - 80.81.68.255 kr +80.81.69.0 - 80.81.76.7 es +80.81.76.8 - 80.81.76.15 gb +80.81.76.16 - 80.81.76.63 es +80.81.76.64 - 80.81.76.95 gb +80.81.76.96 - 80.81.127.255 es 80.81.128.0 - 80.81.143.255 at 80.81.144.0 - 80.81.159.255 lb -80.81.160.0 - 80.81.165.31 fi -80.81.165.32 - 80.81.165.63 se -80.81.165.64 - 80.81.191.255 fi +80.81.160.0 - 80.81.191.255 fi 80.81.192.0 - 80.81.207.255 de 80.81.208.0 - 80.81.223.255 ru -80.81.224.0 - 80.81.227.255 sk -80.81.228.0 - 80.81.228.255 sl -80.81.229.0 - 80.81.239.255 sk -80.81.240.0 - 80.81.252.95 de -80.81.252.96 - 80.81.252.127 at -80.81.252.128 - 80.81.255.191 de -80.81.255.192 - 80.81.255.255 pl +80.81.224.0 - 80.81.239.255 sk +80.81.240.0 - 80.81.255.255 de 80.82.0.0 - 80.82.15.255 it 80.82.16.0 - 80.82.31.255 pl 80.82.32.0 - 80.82.63.255 ru @@ -37914,12 +20092,11 @@ 80.82.80.0 - 80.82.95.255 ru 80.82.96.0 - 80.82.111.255 dk 80.82.112.0 - 80.82.143.255 gb -80.82.144.0 - 80.82.154.255 cz -80.82.155.0 - 80.82.155.255 sk -80.82.156.0 - 80.82.159.255 cz +80.82.144.0 - 80.82.159.255 cz 80.82.160.0 - 80.82.191.255 ru -80.82.192.0 - 80.82.207.255 it -80.82.208.0 - 80.82.223.255 de +80.82.192.0 - 80.82.195.255 cz +80.82.196.0 - 80.82.199.255 ua +80.82.200.0 - 80.82.223.255 de 80.82.224.0 - 80.82.239.255 fr 80.82.240.0 - 80.82.255.255 gb 80.83.0.0 - 80.83.15.255 fi @@ -37927,63 +20104,39 @@ 80.83.32.0 - 80.83.63.255 ch 80.83.64.0 - 80.83.79.255 cz 80.83.80.0 - 80.83.95.255 se -80.83.96.0 - 80.83.114.242 de -80.83.114.243 - 80.83.114.255 tr -80.83.115.0 - 80.83.127.255 de +80.83.96.0 - 80.83.127.255 de 80.83.128.0 - 80.83.143.255 ge -80.83.144.0 - 80.83.147.215 gb -80.83.147.216 - 80.83.147.223 eg -80.83.147.224 - 80.83.150.7 gb -80.83.150.8 - 80.83.150.15 eg -80.83.150.16 - 80.83.159.255 gb +80.83.144.0 - 80.83.159.255 gb 80.83.160.0 - 80.83.175.255 it 80.83.176.0 - 80.83.191.255 de 80.83.192.0 - 80.83.207.255 ru 80.83.208.0 - 80.83.223.255 se 80.83.224.0 - 80.83.255.255 ru 80.84.0.0 - 80.84.15.255 de -80.84.16.0 - 80.84.25.39 eu -80.84.25.40 - 80.84.25.47 et -80.84.25.48 - 80.84.25.63 sn -80.84.25.64 - 80.84.25.255 eu -80.84.26.0 - 80.84.27.127 be -80.84.27.128 - 80.84.31.255 eu +80.84.16.0 - 80.84.31.255 eu 80.84.32.0 - 80.84.47.255 se 80.84.48.0 - 80.84.95.255 gb 80.84.96.0 - 80.84.111.255 it 80.84.112.0 - 80.84.127.255 ru -80.84.128.0 - 80.84.159.255 es +80.84.128.0 - 80.84.136.255 es +80.84.137.0 - 80.84.137.255 bg +80.84.138.0 - 80.84.139.255 es +80.84.140.0 - 80.84.140.255 us +80.84.141.0 - 80.84.159.255 es 80.84.160.0 - 80.84.175.255 gb 80.84.176.0 - 80.84.191.255 ua 80.84.192.0 - 80.84.223.255 de 80.84.224.0 - 80.84.255.255 nl 80.85.0.0 - 80.85.15.255 de -80.85.16.0 - 80.85.26.255 cy -80.85.27.0 - 80.85.27.23 gr -80.85.27.24 - 80.85.27.39 cy -80.85.27.40 - 80.85.27.135 gr -80.85.27.136 - 80.85.27.136 cy -80.85.27.137 - 80.85.27.142 gr -80.85.27.143 - 80.85.27.143 cy -80.85.27.144 - 80.85.27.167 gr -80.85.27.168 - 80.85.27.175 cy -80.85.27.176 - 80.85.27.183 gr -80.85.27.184 - 80.85.27.191 rs -80.85.27.192 - 80.85.27.199 cy -80.85.27.200 - 80.85.27.207 tn -80.85.27.208 - 80.85.27.215 cy -80.85.27.216 - 80.85.27.231 gr -80.85.27.232 - 80.85.27.239 cy -80.85.27.240 - 80.85.28.104 gr -80.85.28.105 - 80.85.28.111 cy -80.85.28.112 - 80.85.28.183 gr -80.85.28.184 - 80.85.28.215 cy -80.85.28.216 - 80.85.28.223 gr -80.85.28.224 - 80.85.28.231 cy -80.85.28.232 - 80.85.28.239 gr -80.85.28.240 - 80.85.28.255 cy -80.85.29.0 - 80.85.30.255 gr -80.85.31.0 - 80.85.31.255 cy +80.85.16.0 - 80.85.27.151 cy +80.85.27.152 - 80.85.27.159 gr +80.85.27.160 - 80.85.28.7 cy +80.85.28.8 - 80.85.28.15 gr +80.85.28.16 - 80.85.28.127 cy +80.85.28.128 - 80.85.28.143 gr +80.85.28.144 - 80.85.28.151 cy +80.85.28.152 - 80.85.28.167 gr +80.85.28.168 - 80.85.31.255 cy 80.85.32.0 - 80.85.47.255 nl 80.85.48.0 - 80.85.63.255 hu 80.85.64.0 - 80.85.95.255 gb @@ -37999,99 +20152,33 @@ 80.85.240.0 - 80.85.255.255 ru 80.86.0.0 - 80.86.15.255 de 80.86.16.0 - 80.86.31.255 a2 -80.86.32.0 - 80.86.35.7 gb -80.86.35.8 - 80.86.35.15 nl -80.86.35.16 - 80.86.47.255 gb +80.86.32.0 - 80.86.47.255 gb 80.86.48.0 - 80.86.63.255 it 80.86.64.0 - 80.86.79.255 se -80.86.80.0 - 80.86.89.63 de -80.86.89.64 - 80.86.89.95 se -80.86.89.96 - 80.86.95.255 de +80.86.80.0 - 80.86.95.255 de 80.86.96.0 - 80.86.127.255 ro 80.86.128.0 - 80.86.143.255 no 80.86.144.0 - 80.86.159.255 it -80.86.160.0 - 80.86.161.255 eu -80.86.162.0 - 80.86.162.23 de -80.86.162.24 - 80.86.162.31 eu -80.86.162.32 - 80.86.162.39 de -80.86.162.40 - 80.86.162.63 eu -80.86.162.64 - 80.86.162.175 de -80.86.162.176 - 80.86.162.191 eu -80.86.162.192 - 80.86.162.223 de -80.86.162.224 - 80.86.162.239 eu -80.86.162.240 - 80.86.162.255 de -80.86.163.0 - 80.86.163.255 ch -80.86.164.0 - 80.86.166.63 de -80.86.166.64 - 80.86.166.71 eu -80.86.166.72 - 80.86.166.79 de -80.86.166.80 - 80.86.166.87 eu -80.86.166.88 - 80.86.166.95 de -80.86.166.96 - 80.86.166.127 eu -80.86.166.128 - 80.86.166.191 de -80.86.166.192 - 80.86.166.207 eu -80.86.166.208 - 80.86.166.215 de -80.86.166.216 - 80.86.166.223 eu -80.86.166.224 - 80.86.166.255 de -80.86.167.0 - 80.86.167.63 eu -80.86.167.64 - 80.86.167.111 de -80.86.167.112 - 80.86.167.127 eu -80.86.167.128 - 80.86.167.255 de -80.86.168.0 - 80.86.168.15 eu -80.86.168.16 - 80.86.168.39 de -80.86.168.40 - 80.86.168.63 eu -80.86.168.64 - 80.86.168.207 de -80.86.168.208 - 80.86.168.223 eu -80.86.168.224 - 80.86.168.255 de -80.86.169.0 - 80.86.169.255 at -80.86.170.0 - 80.86.176.63 de -80.86.176.64 - 80.86.176.71 eu -80.86.176.72 - 80.86.176.95 de -80.86.176.96 - 80.86.176.127 eu -80.86.176.128 - 80.86.176.143 de -80.86.176.144 - 80.86.176.191 eu -80.86.176.192 - 80.86.176.199 de -80.86.176.200 - 80.86.176.207 eu -80.86.176.208 - 80.86.177.63 de -80.86.177.64 - 80.86.177.127 eu -80.86.177.128 - 80.86.179.135 de -80.86.179.136 - 80.86.179.143 eu -80.86.179.144 - 80.86.179.151 de -80.86.179.152 - 80.86.179.159 eu -80.86.179.160 - 80.86.179.183 de -80.86.179.184 - 80.86.179.191 eu -80.86.179.192 - 80.86.179.223 de -80.86.179.224 - 80.86.179.255 eu -80.86.180.0 - 80.86.185.127 de -80.86.185.128 - 80.86.185.143 eu -80.86.185.144 - 80.86.185.159 de -80.86.185.160 - 80.86.185.175 eu -80.86.185.176 - 80.86.187.135 de -80.86.187.136 - 80.86.187.143 eu -80.86.187.144 - 80.86.187.147 de -80.86.187.148 - 80.86.187.151 eu -80.86.187.152 - 80.86.187.223 de -80.86.187.224 - 80.86.187.255 eu -80.86.188.0 - 80.86.188.255 de -80.86.189.0 - 80.86.189.39 eu -80.86.189.40 - 80.86.189.63 de -80.86.189.64 - 80.86.189.183 eu -80.86.189.184 - 80.86.189.191 de -80.86.189.192 - 80.86.189.247 eu -80.86.189.248 - 80.86.189.255 ch -80.86.190.0 - 80.86.190.95 eu -80.86.190.96 - 80.86.190.127 de -80.86.190.128 - 80.86.191.31 eu -80.86.191.32 - 80.86.191.159 de -80.86.191.160 - 80.86.191.191 eu -80.86.191.192 - 80.86.191.255 de +80.86.160.0 - 80.86.160.255 de +80.86.161.0 - 80.86.161.7 eu +80.86.161.8 - 80.86.161.15 de +80.86.161.16 - 80.86.171.255 eu +80.86.172.0 - 80.86.175.255 de +80.86.176.0 - 80.86.177.63 eu +80.86.177.64 - 80.86.177.127 de +80.86.177.128 - 80.86.185.255 eu +80.86.186.0 - 80.86.186.255 de +80.86.187.0 - 80.86.190.73 eu +80.86.190.74 - 80.86.190.74 de +80.86.190.75 - 80.86.190.255 eu +80.86.191.0 - 80.86.191.255 de 80.86.192.0 - 80.86.207.255 ch 80.86.208.0 - 80.86.223.255 no 80.86.224.0 - 80.86.239.255 am 80.86.240.0 - 80.86.255.255 sk 80.87.0.0 - 80.87.31.255 gb 80.87.32.0 - 80.87.47.255 pl -80.87.48.0 - 80.87.63.247 se -80.87.63.248 - 80.87.63.255 gb +80.87.48.0 - 80.87.63.255 se 80.87.64.0 - 80.87.95.255 gh 80.87.96.0 - 80.87.111.255 ru 80.87.112.0 - 80.87.127.255 de @@ -38100,104 +20187,18 @@ 80.87.160.0 - 80.87.175.255 de 80.87.176.0 - 80.87.191.255 cz 80.87.192.0 - 80.87.207.255 ru -80.87.208.0 - 80.87.209.223 sk -80.87.209.224 - 80.87.209.239 pl -80.87.209.240 - 80.87.209.247 sk -80.87.209.248 - 80.87.209.251 pl -80.87.209.252 - 80.87.223.255 sk +80.87.208.0 - 80.87.223.255 sk 80.87.224.0 - 80.87.239.255 fr 80.87.240.0 - 80.87.255.255 ba -80.88.0.0 - 80.88.15.255 dz +80.88.4.0 - 80.88.7.255 ng +80.88.12.0 - 80.88.15.255 dz 80.88.16.0 - 80.88.31.255 de 80.88.32.0 - 80.88.47.255 be 80.88.48.0 - 80.88.63.255 ru 80.88.64.0 - 80.88.79.255 de 80.88.80.0 - 80.88.95.255 it 80.88.96.0 - 80.88.127.255 se -80.88.128.0 - 80.88.131.23 a2 -80.88.131.24 - 80.88.131.31 ng -80.88.131.32 - 80.88.131.47 a2 -80.88.131.48 - 80.88.131.55 ng -80.88.131.56 - 80.88.131.207 a2 -80.88.131.208 - 80.88.131.215 ng -80.88.131.216 - 80.88.132.23 a2 -80.88.132.24 - 80.88.132.31 ng -80.88.132.32 - 80.88.132.79 a2 -80.88.132.80 - 80.88.132.87 ng -80.88.132.88 - 80.88.132.111 a2 -80.88.132.112 - 80.88.132.119 ng -80.88.132.120 - 80.88.132.135 a2 -80.88.132.136 - 80.88.132.167 ng -80.88.132.168 - 80.88.132.207 a2 -80.88.132.208 - 80.88.132.223 ng -80.88.132.224 - 80.88.133.135 a2 -80.88.133.136 - 80.88.133.151 ng -80.88.133.152 - 80.88.133.231 a2 -80.88.133.232 - 80.88.133.239 ng -80.88.133.240 - 80.88.134.95 a2 -80.88.134.96 - 80.88.134.103 ng -80.88.134.104 - 80.88.134.183 a2 -80.88.134.184 - 80.88.134.191 ng -80.88.134.192 - 80.88.135.47 a2 -80.88.135.48 - 80.88.135.63 ng -80.88.135.64 - 80.88.135.127 a2 -80.88.135.128 - 80.88.135.135 ng -80.88.135.136 - 80.88.135.151 a2 -80.88.135.152 - 80.88.135.159 ng -80.88.135.160 - 80.88.135.223 a2 -80.88.135.224 - 80.88.135.239 ng -80.88.135.240 - 80.88.136.111 a2 -80.88.136.112 - 80.88.136.135 ng -80.88.136.136 - 80.88.137.63 a2 -80.88.137.64 - 80.88.137.71 ng -80.88.137.72 - 80.88.137.223 a2 -80.88.137.224 - 80.88.137.231 ng -80.88.137.232 - 80.88.139.79 a2 -80.88.139.80 - 80.88.139.95 gn -80.88.139.96 - 80.88.139.239 a2 -80.88.139.240 - 80.88.139.247 dk -80.88.139.248 - 80.88.142.207 a2 -80.88.142.208 - 80.88.142.215 ng -80.88.142.216 - 80.88.142.223 a2 -80.88.142.224 - 80.88.142.231 ng -80.88.142.232 - 80.88.143.199 a2 -80.88.143.200 - 80.88.143.207 dk -80.88.143.208 - 80.88.146.103 a2 -80.88.146.104 - 80.88.146.111 ng -80.88.146.112 - 80.88.146.207 a2 -80.88.146.208 - 80.88.146.231 ng -80.88.146.232 - 80.88.147.199 a2 -80.88.147.200 - 80.88.147.207 ng -80.88.147.208 - 80.88.150.79 a2 -80.88.150.80 - 80.88.150.95 ng -80.88.150.96 - 80.88.150.215 a2 -80.88.150.216 - 80.88.150.223 ng -80.88.150.224 - 80.88.151.143 a2 -80.88.151.144 - 80.88.151.159 dk -80.88.151.160 - 80.88.151.199 a2 -80.88.151.200 - 80.88.151.207 ng -80.88.151.208 - 80.88.154.31 a2 -80.88.154.32 - 80.88.154.39 ng -80.88.154.40 - 80.88.154.47 a2 -80.88.154.48 - 80.88.154.55 ng -80.88.154.56 - 80.88.154.111 a2 -80.88.154.112 - 80.88.154.255 ng -80.88.155.0 - 80.88.155.79 a2 -80.88.155.80 - 80.88.155.87 ng -80.88.155.88 - 80.88.156.31 a2 -80.88.156.32 - 80.88.156.39 ng -80.88.156.40 - 80.88.157.79 a2 -80.88.157.80 - 80.88.157.87 ng -80.88.157.88 - 80.88.157.239 a2 -80.88.157.240 - 80.88.157.255 ng -80.88.158.0 - 80.88.158.63 a2 -80.88.158.64 - 80.88.158.95 ng -80.88.158.96 - 80.88.158.135 a2 -80.88.158.136 - 80.88.158.143 ng -80.88.158.144 - 80.88.158.207 a2 -80.88.158.208 - 80.88.158.223 ng -80.88.158.224 - 80.88.158.255 a2 -80.88.159.0 - 80.88.159.255 dk +80.88.128.0 - 80.88.159.255 a2 80.88.160.0 - 80.88.175.255 it 80.88.176.0 - 80.88.191.255 fi 80.88.192.0 - 80.88.223.255 gb @@ -38218,11 +20219,11 @@ 80.89.208.0 - 80.89.223.255 ch 80.89.224.0 - 80.89.239.255 nl 80.89.240.0 - 80.89.255.255 de -80.90.0.0 - 80.90.1.191 lv -80.90.1.192 - 80.90.1.255 pa -80.90.2.0 - 80.90.2.255 lv +80.90.0.0 - 80.90.2.255 lv 80.90.3.0 - 80.90.3.255 ru -80.90.4.0 - 80.90.31.255 lv +80.90.4.0 - 80.90.27.255 lv +80.90.28.0 - 80.90.28.255 ru +80.90.29.0 - 80.90.31.255 lv 80.90.32.0 - 80.90.63.255 lu 80.90.64.0 - 80.90.79.255 ru 80.90.80.0 - 80.90.95.255 al @@ -38233,7 +20234,9 @@ 80.90.160.0 - 80.90.175.255 jo 80.90.176.0 - 80.90.191.255 ru 80.90.192.0 - 80.90.207.255 gb -80.90.208.0 - 80.90.223.255 si +80.90.208.0 - 80.90.211.255 be +80.90.212.0 - 80.90.221.255 si +80.90.222.0 - 80.90.223.255 be 80.90.224.0 - 80.90.239.255 ua 80.90.240.0 - 80.90.255.255 ru 80.91.0.0 - 80.91.15.255 dk @@ -38243,57 +20246,30 @@ 80.91.64.0 - 80.91.95.255 es 80.91.96.0 - 80.91.111.255 de 80.91.112.0 - 80.91.127.255 al -80.91.128.0 - 80.91.130.255 fi -80.91.131.0 - 80.91.143.255 dk +80.91.128.0 - 80.91.143.255 dk 80.91.144.0 - 80.91.159.255 be 80.91.160.0 - 80.91.191.255 ua 80.91.192.0 - 80.91.207.255 ru 80.91.208.0 - 80.91.223.255 gr 80.91.224.0 - 80.91.239.255 no -80.91.240.0 - 80.91.255.255 eu +80.91.240.0 - 80.91.250.201 eu +80.91.250.202 - 80.91.250.202 de +80.91.250.203 - 80.91.255.255 eu 80.92.0.0 - 80.92.47.255 ru -80.92.48.0 - 80.92.49.159 de -80.92.49.160 - 80.92.49.191 a2 -80.92.49.192 - 80.92.49.207 de -80.92.49.208 - 80.92.49.223 zm -80.92.49.224 - 80.92.49.255 de -80.92.50.0 - 80.92.50.255 us -80.92.51.0 - 80.92.51.255 de -80.92.52.0 - 80.92.52.63 ca -80.92.52.64 - 80.92.55.15 de -80.92.55.16 - 80.92.55.31 sa -80.92.55.32 - 80.92.55.39 de -80.92.55.40 - 80.92.55.63 sa -80.92.55.64 - 80.92.55.127 bh -80.92.55.128 - 80.92.55.191 de -80.92.55.192 - 80.92.55.223 bh -80.92.55.224 - 80.92.55.255 de -80.92.56.0 - 80.92.56.255 us -80.92.57.0 - 80.92.63.255 de +80.92.48.0 - 80.92.63.255 de 80.92.64.0 - 80.92.95.255 lu 80.92.96.0 - 80.92.111.255 ru 80.92.112.0 - 80.92.127.255 at 80.92.128.0 - 80.92.135.255 se -80.92.136.0 - 80.92.141.255 gb -80.92.142.0 - 80.92.143.255 se +80.92.136.0 - 80.92.139.255 gb +80.92.140.0 - 80.92.143.255 se 80.92.144.0 - 80.92.159.255 gb 80.92.160.0 - 80.92.175.255 ru 80.92.176.0 - 80.92.191.255 ge 80.92.192.0 - 80.92.223.255 ru 80.92.224.0 - 80.92.239.255 ua 80.92.240.0 - 80.92.255.255 cz -80.93.0.0 - 80.93.10.7 ie -80.93.10.8 - 80.93.10.83 ch -80.93.10.84 - 80.93.10.87 ie -80.93.10.88 - 80.93.10.103 ch -80.93.10.104 - 80.93.10.111 ie -80.93.10.112 - 80.93.10.127 il -80.93.10.128 - 80.93.10.239 ie -80.93.10.240 - 80.93.10.247 il -80.93.10.248 - 80.93.11.255 ch -80.93.12.0 - 80.93.13.255 gb -80.93.14.0 - 80.93.14.255 ch -80.93.15.0 - 80.93.31.255 ie +80.93.0.0 - 80.93.31.255 ie 80.93.32.0 - 80.93.47.255 at 80.93.48.0 - 80.93.63.255 ru 80.93.64.0 - 80.93.79.255 it @@ -38323,19 +20299,15 @@ 80.94.208.0 - 80.94.223.255 se 80.94.224.0 - 80.94.239.255 by 80.94.240.0 - 80.94.255.255 md -80.95.0.0 - 80.95.15.255 eg +80.95.0.0 - 80.95.15.255 za 80.95.16.0 - 80.95.31.255 bg 80.95.32.0 - 80.95.47.255 ru 80.95.48.0 - 80.95.63.255 gb 80.95.64.0 - 80.95.95.255 hu 80.95.96.0 - 80.95.127.255 cz 80.95.128.0 - 80.95.143.255 fi -80.95.144.0 - 80.95.148.127 de -80.95.148.128 - 80.95.148.255 nl -80.95.149.0 - 80.95.150.255 de -80.95.151.0 - 80.95.151.255 nl -80.95.152.0 - 80.95.158.127 de -80.95.158.128 - 80.95.175.255 nl +80.95.144.0 - 80.95.159.255 de +80.95.160.0 - 80.95.175.255 nl 80.95.176.0 - 80.95.207.255 gb 80.95.208.0 - 80.95.223.255 bh 80.95.224.0 - 80.95.239.255 si @@ -38348,518 +20320,120 @@ 80.102.0.0 - 80.103.255.255 es 80.104.0.0 - 80.105.255.255 it 80.106.0.0 - 80.107.255.255 gr -80.108.0.0 - 80.111.255.255 at +80.108.0.0 - 80.110.255.255 at +80.111.0.0 - 80.111.255.255 ie 80.112.0.0 - 80.115.191.255 nl 80.115.192.0 - 80.115.223.255 ru 80.115.224.0 - 80.115.255.255 nl 80.116.0.0 - 80.117.255.255 it 80.118.0.0 - 80.119.255.255 fr -80.120.0.0 - 80.120.193.127 at -80.120.193.128 - 80.120.193.191 sa -80.120.193.192 - 80.120.196.215 at -80.120.196.216 - 80.120.196.223 sa -80.120.196.224 - 80.120.197.255 at -80.120.198.0 - 80.120.198.255 a2 -80.120.199.0 - 80.122.165.255 at -80.122.166.0 - 80.122.166.23 iq -80.122.166.24 - 80.122.167.255 at -80.122.168.0 - 80.122.175.255 a2 -80.122.176.0 - 80.122.185.255 at -80.122.186.0 - 80.122.186.255 de -80.122.187.0 - 80.123.225.15 at -80.123.225.16 - 80.123.225.23 sa -80.123.225.24 - 80.123.225.39 at -80.123.225.40 - 80.123.225.47 sa -80.123.225.48 - 80.123.225.255 at -80.123.226.0 - 80.123.226.255 a2 -80.123.227.0 - 80.123.227.7 at -80.123.227.8 - 80.123.227.23 a2 -80.123.227.24 - 80.123.227.31 at -80.123.227.32 - 80.123.227.39 a2 -80.123.227.40 - 80.123.227.47 at -80.123.227.48 - 80.123.227.67 a2 -80.123.227.68 - 80.123.227.71 at -80.123.227.72 - 80.123.227.75 a2 -80.123.227.76 - 80.123.227.79 at -80.123.227.80 - 80.123.227.119 a2 -80.123.227.120 - 80.123.227.191 at -80.123.227.192 - 80.123.227.199 a2 -80.123.227.200 - 80.123.227.219 at -80.123.227.220 - 80.123.227.223 a2 -80.123.227.224 - 80.123.255.255 at +80.120.0.0 - 80.122.167.255 at +80.122.168.0 - 80.122.168.255 iq +80.122.169.0 - 80.122.172.255 at +80.122.173.0 - 80.122.173.255 iq +80.122.174.0 - 80.122.174.255 at +80.122.175.0 - 80.122.175.255 iq +80.122.176.0 - 80.123.255.255 at 80.124.0.0 - 80.125.255.255 fr 80.126.0.0 - 80.127.255.255 nl -80.128.0.0 - 80.146.188.127 de -80.146.188.128 - 80.146.188.191 gb -80.146.188.192 - 80.146.201.239 de -80.146.201.240 - 80.146.201.247 pl -80.146.201.248 - 80.146.217.239 de -80.146.217.240 - 80.146.217.247 hu -80.146.217.248 - 80.146.239.255 de -80.146.240.0 - 80.146.240.255 it -80.146.241.0 - 80.148.11.207 de -80.148.11.208 - 80.148.11.215 it -80.148.11.216 - 80.148.13.63 de -80.148.13.64 - 80.148.13.95 it -80.148.13.96 - 80.149.89.255 de -80.149.90.0 - 80.149.90.255 us -80.149.91.0 - 80.149.191.255 de -80.149.192.0 - 80.149.192.255 it -80.149.193.0 - 80.149.233.255 de -80.149.234.0 - 80.149.234.255 us -80.149.235.0 - 80.150.9.255 de -80.150.10.0 - 80.150.10.255 us -80.150.11.0 - 80.150.14.183 de -80.150.14.184 - 80.150.14.191 it -80.150.14.192 - 80.150.121.39 de -80.150.121.40 - 80.150.121.43 us -80.150.121.44 - 80.150.131.255 de -80.150.132.0 - 80.150.132.255 us -80.150.133.0 - 80.150.198.63 de -80.150.198.64 - 80.150.198.127 us -80.150.198.128 - 80.152.3.151 de -80.152.3.152 - 80.152.3.159 it -80.152.3.160 - 80.152.9.255 de -80.152.10.0 - 80.152.10.255 nl -80.152.11.0 - 80.152.22.135 de -80.152.22.136 - 80.152.22.143 it -80.152.22.144 - 80.152.22.151 us -80.152.22.152 - 80.152.32.63 de -80.152.32.64 - 80.152.32.71 se -80.152.32.72 - 80.152.32.163 de -80.152.32.164 - 80.152.32.167 se -80.152.32.168 - 80.152.33.63 de -80.152.33.64 - 80.152.33.71 es -80.152.33.72 - 80.152.33.191 de -80.152.33.192 - 80.152.33.199 cz -80.152.33.200 - 80.152.33.223 de -80.152.33.224 - 80.152.33.231 es -80.152.33.232 - 80.152.33.239 de -80.152.33.240 - 80.152.33.247 sz -80.152.33.248 - 80.152.36.183 de -80.152.36.184 - 80.152.36.191 it -80.152.36.192 - 80.152.39.15 de -80.152.39.16 - 80.152.39.23 us -80.152.39.24 - 80.152.41.167 de -80.152.41.168 - 80.152.41.175 fi -80.152.41.176 - 80.152.41.179 de -80.152.41.180 - 80.152.41.203 fr -80.152.41.204 - 80.152.41.207 de -80.152.41.208 - 80.152.41.239 fr -80.152.41.240 - 80.152.42.239 de -80.152.42.240 - 80.152.42.247 at -80.152.42.248 - 80.152.43.23 de -80.152.43.24 - 80.152.43.31 se -80.152.43.32 - 80.152.43.47 de -80.152.43.48 - 80.152.43.63 se -80.152.43.64 - 80.152.43.95 de -80.152.43.96 - 80.152.43.111 se -80.152.43.112 - 80.154.30.31 de -80.154.30.32 - 80.154.30.63 it -80.154.30.64 - 80.154.135.255 de -80.154.136.0 - 80.154.136.255 ch -80.154.137.0 - 80.156.7.103 de -80.156.7.104 - 80.156.7.111 be -80.156.7.112 - 80.156.14.119 de -80.156.14.120 - 80.156.14.127 nl -80.156.14.128 - 80.156.174.247 de -80.156.174.248 - 80.156.175.7 nl -80.156.175.8 - 80.159.255.255 de -80.160.0.0 - 80.167.237.127 dk -80.167.237.128 - 80.167.237.135 de -80.167.237.136 - 80.167.255.255 dk -80.168.0.0 - 80.169.0.127 gb -80.169.0.128 - 80.169.0.159 fr -80.169.0.160 - 80.169.3.31 gb -80.169.3.32 - 80.169.3.39 nl -80.169.3.40 - 80.169.3.159 gb -80.169.3.160 - 80.169.3.191 fr -80.169.3.192 - 80.169.8.159 gb -80.169.8.160 - 80.169.8.175 ca -80.169.8.176 - 80.169.11.159 gb -80.169.11.160 - 80.169.11.175 fr -80.169.11.176 - 80.169.16.151 gb -80.169.16.152 - 80.169.16.159 es -80.169.16.160 - 80.169.19.255 gb -80.169.20.0 - 80.169.21.7 se -80.169.21.8 - 80.169.21.15 gb -80.169.21.16 - 80.169.21.23 se -80.169.21.24 - 80.169.21.31 no -80.169.21.32 - 80.169.21.63 se -80.169.21.64 - 80.169.21.127 fi -80.169.21.128 - 80.169.21.151 se -80.169.21.152 - 80.169.21.159 gb -80.169.21.160 - 80.169.21.175 se -80.169.21.176 - 80.169.21.183 dk -80.169.21.184 - 80.169.21.255 se -80.169.22.0 - 80.169.22.7 gb -80.169.22.8 - 80.169.22.23 se -80.169.22.24 - 80.169.22.63 gb -80.169.22.64 - 80.169.22.143 se -80.169.22.144 - 80.169.23.31 gb -80.169.23.32 - 80.169.23.55 se -80.169.23.56 - 80.169.25.7 gb -80.169.25.8 - 80.169.25.15 de -80.169.25.16 - 80.169.44.39 gb -80.169.44.40 - 80.169.44.47 fr -80.169.44.48 - 80.169.48.223 gb -80.169.48.224 - 80.169.48.231 ie -80.169.48.232 - 80.169.51.23 gb -80.169.51.24 - 80.169.51.31 ie -80.169.51.32 - 80.169.55.15 gb -80.169.55.16 - 80.169.55.31 ie -80.169.55.32 - 80.169.56.255 gb -80.169.57.0 - 80.169.59.255 ie -80.169.60.0 - 80.169.61.7 gb -80.169.61.8 - 80.169.61.119 be -80.169.61.120 - 80.169.61.127 gb -80.169.61.128 - 80.169.61.207 be -80.169.61.208 - 80.169.61.215 gb -80.169.61.216 - 80.169.63.15 be -80.169.63.16 - 80.169.63.23 gb -80.169.63.24 - 80.169.63.231 be -80.169.63.232 - 80.169.63.239 fr -80.169.63.240 - 80.169.63.255 be -80.169.64.0 - 80.169.68.255 gb -80.169.69.0 - 80.169.69.255 ie -80.169.70.0 - 80.169.71.255 gb -80.169.72.0 - 80.169.72.127 ie -80.169.72.128 - 80.169.74.7 gb -80.169.74.8 - 80.169.74.23 es -80.169.74.24 - 80.169.74.31 gb -80.169.74.32 - 80.169.74.103 es -80.169.74.104 - 80.169.74.111 gb -80.169.74.112 - 80.169.74.231 es -80.169.74.232 - 80.169.74.239 gb -80.169.74.240 - 80.169.74.247 es -80.169.74.248 - 80.169.75.7 gb -80.169.75.8 - 80.169.75.127 es -80.169.75.128 - 80.169.75.143 gb -80.169.75.144 - 80.169.75.181 es -80.169.75.182 - 80.169.75.183 gb -80.169.75.184 - 80.169.77.115 es -80.169.77.116 - 80.169.77.119 gb -80.169.77.120 - 80.169.77.231 es -80.169.77.232 - 80.169.77.239 gb -80.169.77.240 - 80.169.79.255 es -80.169.80.0 - 80.169.81.31 be -80.169.81.32 - 80.169.81.39 es -80.169.81.40 - 80.169.81.111 be -80.169.81.112 - 80.169.81.119 gb -80.169.81.120 - 80.169.83.255 be -80.169.84.0 - 80.169.85.135 es -80.169.85.136 - 80.169.85.143 gb -80.169.85.144 - 80.169.85.167 es -80.169.85.168 - 80.169.85.183 gb -80.169.85.184 - 80.169.86.15 es -80.169.86.16 - 80.169.86.31 gb -80.169.86.32 - 80.169.86.127 es -80.169.86.128 - 80.169.86.135 gb -80.169.86.136 - 80.169.87.255 es -80.169.88.0 - 80.169.95.255 gb +80.128.0.0 - 80.150.93.130 de +80.150.93.131 - 80.150.93.131 eu +80.150.93.132 - 80.154.97.255 de +80.154.98.0 - 80.154.98.255 eu +80.154.99.0 - 80.154.116.255 de +80.154.117.0 - 80.154.117.255 us +80.154.118.0 - 80.156.43.255 de +80.156.44.0 - 80.156.44.255 fr +80.156.45.0 - 80.156.63.255 de +80.156.64.0 - 80.156.67.255 sk +80.156.68.0 - 80.157.87.255 de +80.157.88.0 - 80.157.95.255 fr +80.157.96.0 - 80.159.255.255 de +80.160.0.0 - 80.167.255.255 dk +80.168.0.0 - 80.169.36.215 gb +80.169.36.216 - 80.169.36.223 us +80.169.36.224 - 80.169.73.15 gb +80.169.73.16 - 80.169.73.23 at +80.169.73.24 - 80.169.73.159 gb +80.169.73.160 - 80.169.73.167 at +80.169.73.168 - 80.169.73.175 gb +80.169.73.176 - 80.169.73.191 at +80.169.73.192 - 80.169.73.223 gb +80.169.73.224 - 80.169.73.255 at +80.169.74.0 - 80.169.75.15 gb +80.169.75.16 - 80.169.75.31 es +80.169.75.32 - 80.169.80.63 gb +80.169.80.64 - 80.169.80.79 be +80.169.80.80 - 80.169.87.111 gb +80.169.87.112 - 80.169.87.119 es +80.169.87.120 - 80.169.95.255 gb 80.169.96.0 - 80.169.103.255 ch -80.169.104.0 - 80.169.104.255 it -80.169.105.0 - 80.169.105.7 gb -80.169.105.8 - 80.169.105.15 it -80.169.105.16 - 80.169.105.19 gb -80.169.105.20 - 80.169.106.111 it -80.169.106.112 - 80.169.106.127 gb -80.169.106.128 - 80.169.106.143 it -80.169.106.144 - 80.169.106.151 gb -80.169.106.152 - 80.169.107.31 it -80.169.107.32 - 80.169.107.39 gb -80.169.107.40 - 80.169.107.207 it -80.169.107.208 - 80.169.107.223 gb -80.169.107.224 - 80.169.108.55 it -80.169.108.56 - 80.169.108.63 gb -80.169.108.64 - 80.169.109.255 it -80.169.110.0 - 80.169.111.255 be -80.169.112.0 - 80.169.113.255 gb -80.169.114.0 - 80.169.114.55 it -80.169.114.56 - 80.169.114.63 gb -80.169.114.64 - 80.169.114.111 it -80.169.114.112 - 80.169.114.119 gb -80.169.114.120 - 80.169.114.167 it -80.169.114.168 - 80.169.114.175 gb -80.169.114.176 - 80.169.115.255 it -80.169.116.0 - 80.169.117.255 gb -80.169.118.0 - 80.169.118.255 it -80.169.119.0 - 80.169.135.255 gb -80.169.136.0 - 80.169.137.95 ie -80.169.137.96 - 80.169.137.127 gb -80.169.137.128 - 80.169.137.215 ie -80.169.137.216 - 80.169.137.223 gb -80.169.137.224 - 80.169.137.231 ie -80.169.137.232 - 80.169.137.255 gb -80.169.138.0 - 80.169.138.127 ie -80.169.138.128 - 80.169.138.135 gb -80.169.138.136 - 80.169.138.159 ie -80.169.138.160 - 80.169.138.191 gb -80.169.138.192 - 80.169.138.207 ie -80.169.138.208 - 80.169.138.215 gb -80.169.138.216 - 80.169.139.71 ie -80.169.139.72 - 80.169.139.79 gb -80.169.139.80 - 80.169.139.159 ie -80.169.139.160 - 80.169.139.191 gb -80.169.139.192 - 80.169.140.127 ie -80.169.140.128 - 80.169.140.135 gb -80.169.140.136 - 80.169.140.143 ie -80.169.140.144 - 80.169.140.151 gb -80.169.140.152 - 80.169.140.175 ie -80.169.140.176 - 80.169.140.191 gb -80.169.140.192 - 80.169.140.255 ie -80.169.141.0 - 80.169.141.15 gb -80.169.141.16 - 80.169.141.31 ie -80.169.141.32 - 80.169.141.39 gb -80.169.141.40 - 80.169.141.63 ie -80.169.141.64 - 80.169.141.71 nl -80.169.141.72 - 80.169.141.87 ie -80.169.141.88 - 80.169.141.127 gb -80.169.141.128 - 80.169.142.143 ie -80.169.142.144 - 80.169.142.151 gb -80.169.142.152 - 80.169.142.175 ie -80.169.142.176 - 80.169.142.191 gb -80.169.142.192 - 80.169.143.127 ie -80.169.143.128 - 80.169.143.143 gb -80.169.143.144 - 80.169.143.151 ie -80.169.143.152 - 80.169.143.159 gb -80.169.143.160 - 80.169.143.175 ie -80.169.143.176 - 80.169.143.191 gb -80.169.143.192 - 80.169.143.255 ie -80.169.144.0 - 80.169.148.175 gb -80.169.148.176 - 80.169.148.183 ie -80.169.148.184 - 80.169.158.39 gb -80.169.158.40 - 80.169.158.43 it -80.169.158.44 - 80.169.166.111 gb -80.169.166.112 - 80.169.166.119 ie -80.169.166.120 - 80.169.172.255 gb -80.169.173.0 - 80.169.173.31 ie -80.169.173.32 - 80.169.178.255 gb -80.169.179.0 - 80.169.179.7 se -80.169.179.8 - 80.169.179.15 de -80.169.179.16 - 80.169.179.19 se -80.169.179.20 - 80.169.179.31 gb -80.169.179.32 - 80.169.179.63 de -80.169.179.64 - 80.169.179.127 se -80.169.179.128 - 80.169.179.143 pt -80.169.179.144 - 80.169.179.151 se -80.169.179.152 - 80.169.179.159 ie -80.169.179.160 - 80.169.179.175 se -80.169.179.176 - 80.169.179.183 gb -80.169.179.184 - 80.169.179.193 se -80.169.179.194 - 80.169.179.199 gb -80.169.179.200 - 80.169.182.47 se -80.169.182.48 - 80.169.182.55 gb -80.169.182.56 - 80.169.182.191 se -80.169.182.192 - 80.169.183.127 gb -80.169.183.128 - 80.169.183.135 se -80.169.183.136 - 80.169.183.151 gb -80.169.183.152 - 80.169.183.207 se -80.169.183.208 - 80.169.183.215 gb -80.169.183.216 - 80.169.183.239 se -80.169.183.240 - 80.169.183.255 gb -80.169.184.0 - 80.169.184.127 se -80.169.184.128 - 80.169.184.135 ch -80.169.184.136 - 80.169.184.143 se -80.169.184.144 - 80.169.184.151 fi -80.169.184.152 - 80.169.184.159 se -80.169.184.160 - 80.169.184.207 gb -80.169.184.208 - 80.169.184.223 se -80.169.184.224 - 80.169.185.15 gb -80.169.185.16 - 80.169.185.23 se -80.169.185.24 - 80.169.185.55 gb -80.169.185.56 - 80.169.186.255 se -80.169.187.0 - 80.169.188.103 gb -80.169.188.104 - 80.169.188.111 us -80.169.188.112 - 80.169.201.15 gb -80.169.201.16 - 80.169.201.31 de -80.169.201.32 - 80.169.206.79 gb -80.169.206.80 - 80.169.206.87 us -80.169.206.88 - 80.169.207.255 gb -80.169.208.0 - 80.169.209.255 es -80.169.210.0 - 80.169.210.63 gb -80.169.210.64 - 80.169.210.111 be -80.169.210.112 - 80.169.210.127 gb -80.169.210.128 - 80.169.211.255 be -80.169.212.0 - 80.169.212.7 it -80.169.212.8 - 80.169.215.255 gb +80.169.104.0 - 80.169.104.95 gb +80.169.104.96 - 80.169.104.103 it +80.169.104.104 - 80.169.129.255 gb +80.169.130.0 - 80.169.130.191 eu +80.169.130.192 - 80.169.130.223 gb +80.169.130.224 - 80.169.130.255 eu +80.169.131.0 - 80.169.137.23 gb +80.169.137.24 - 80.169.137.31 ie +80.169.137.32 - 80.169.137.255 gb +80.169.138.0 - 80.169.138.255 ie +80.169.139.0 - 80.169.179.95 gb +80.169.179.96 - 80.169.179.127 se +80.169.179.128 - 80.169.179.207 gb +80.169.179.208 - 80.169.179.223 se +80.169.179.224 - 80.169.179.255 gb +80.169.180.0 - 80.169.181.255 se +80.169.182.0 - 80.169.184.95 gb +80.169.184.96 - 80.169.184.103 se +80.169.184.104 - 80.169.184.111 gb +80.169.184.112 - 80.169.184.127 se +80.169.184.128 - 80.169.210.71 gb +80.169.210.72 - 80.169.210.79 be +80.169.210.80 - 80.169.215.255 gb 80.169.216.0 - 80.169.219.255 fr -80.169.220.0 - 80.169.224.95 gb -80.169.224.96 - 80.169.224.127 ie -80.169.224.128 - 80.169.224.255 gb -80.169.225.0 - 80.169.225.15 es -80.169.225.16 - 80.169.225.23 gb -80.169.225.24 - 80.169.225.135 es -80.169.225.136 - 80.169.225.143 de -80.169.225.144 - 80.169.225.255 es -80.169.226.0 - 80.169.227.159 it -80.169.227.160 - 80.169.227.167 gb -80.169.227.168 - 80.169.227.199 it -80.169.227.200 - 80.169.227.207 es -80.169.227.208 - 80.169.227.255 it -80.169.228.0 - 80.169.231.255 gb -80.169.232.0 - 80.169.233.255 ch -80.169.234.0 - 80.169.234.111 it -80.169.234.112 - 80.169.234.119 gb -80.169.234.120 - 80.169.234.231 it -80.169.234.232 - 80.169.234.239 gb -80.169.234.240 - 80.169.235.167 it -80.169.235.168 - 80.169.235.175 gb -80.169.235.176 - 80.169.235.255 it -80.169.236.0 - 80.169.237.255 ie -80.169.238.0 - 80.169.239.255 gb -80.169.240.0 - 80.169.241.255 ch -80.169.242.0 - 80.169.244.87 es -80.169.244.88 - 80.169.244.95 fr -80.169.244.96 - 80.169.247.255 es -80.169.248.0 - 80.169.251.255 gb -80.169.252.0 - 80.169.252.255 fr -80.169.253.0 - 80.169.254.255 gb -80.169.255.0 - 80.169.255.255 ie +80.169.220.0 - 80.169.232.191 gb +80.169.232.192 - 80.169.232.223 ch +80.169.232.224 - 80.169.233.255 gb +80.169.234.0 - 80.169.234.255 it +80.169.235.0 - 80.169.243.255 gb +80.169.244.0 - 80.169.244.255 us +80.169.245.0 - 80.169.247.255 es +80.169.248.0 - 80.169.255.255 gb 80.170.0.0 - 80.170.255.255 se 80.171.0.0 - 80.171.255.255 de 80.172.0.0 - 80.172.255.255 pt 80.173.0.0 - 80.174.255.255 es 80.175.0.0 - 80.177.255.255 gb -80.178.0.0 - 80.179.95.15 il -80.179.95.16 - 80.179.95.23 a2 -80.179.95.24 - 80.179.95.31 il -80.179.95.32 - 80.179.95.47 a2 -80.179.95.48 - 80.179.164.31 il -80.179.164.32 - 80.179.164.55 a2 -80.179.164.56 - 80.179.164.143 il -80.179.164.144 - 80.179.164.159 a2 -80.179.164.160 - 80.179.164.191 il -80.179.164.192 - 80.179.164.207 a2 -80.179.164.208 - 80.179.168.255 il -80.179.169.0 - 80.179.169.15 a2 -80.179.169.16 - 80.179.169.23 il -80.179.169.24 - 80.179.169.31 a2 -80.179.169.32 - 80.179.169.63 il -80.179.169.64 - 80.179.169.103 a2 -80.179.169.104 - 80.179.169.127 il -80.179.169.128 - 80.179.169.191 a2 -80.179.169.192 - 80.179.169.223 il -80.179.169.224 - 80.179.169.239 a2 -80.179.169.240 - 80.179.175.255 il -80.179.176.0 - 80.179.176.31 a2 -80.179.176.32 - 80.179.176.87 il -80.179.176.88 - 80.179.176.95 a2 -80.179.176.96 - 80.179.176.111 il -80.179.176.112 - 80.179.176.127 a2 -80.179.176.128 - 80.179.188.255 il -80.179.189.0 - 80.179.189.255 gb -80.179.190.0 - 80.179.235.255 il -80.179.236.0 - 80.179.236.255 a2 -80.179.237.0 - 80.179.242.255 il -80.179.243.0 - 80.179.243.111 a2 -80.179.243.112 - 80.179.243.115 il -80.179.243.116 - 80.179.243.139 a2 -80.179.243.140 - 80.179.243.143 il -80.179.243.144 - 80.179.243.147 a2 -80.179.243.148 - 80.179.243.155 il -80.179.243.156 - 80.179.243.191 a2 -80.179.243.192 - 80.179.243.207 il -80.179.243.208 - 80.179.243.255 a2 -80.179.244.0 - 80.179.255.255 il +80.178.0.0 - 80.179.255.255 il 80.180.0.0 - 80.183.255.255 it 80.184.0.0 - 80.184.255.255 kw 80.185.0.0 - 80.185.255.255 fr 80.186.0.0 - 80.186.255.255 fi -80.187.0.0 - 80.187.255.255 de +80.187.0.0 - 80.187.143.255 de +80.187.144.0 - 80.187.144.255 eu +80.187.145.0 - 80.187.145.255 de +80.187.146.0 - 80.187.152.255 eu +80.187.153.0 - 80.187.153.255 de +80.187.154.0 - 80.187.154.255 eu +80.187.155.0 - 80.187.157.255 de +80.187.158.0 - 80.187.158.255 eu +80.187.159.0 - 80.187.207.255 de +80.187.208.0 - 80.187.213.255 eu +80.187.214.0 - 80.187.217.255 de +80.187.218.0 - 80.187.219.255 eu +80.187.220.0 - 80.187.220.255 de +80.187.221.0 - 80.187.223.255 eu +80.187.224.0 - 80.187.255.255 de 80.188.0.0 - 80.188.255.255 cz 80.189.0.0 - 80.189.255.255 gb -80.190.0.0 - 80.190.128.255 de -80.190.129.0 - 80.190.129.7 at -80.190.129.8 - 80.190.129.47 de -80.190.129.48 - 80.190.129.63 cy -80.190.129.64 - 80.190.130.63 de -80.190.130.64 - 80.190.130.127 at -80.190.130.128 - 80.190.132.31 de -80.190.132.32 - 80.190.132.63 at -80.190.132.64 - 80.190.139.39 de -80.190.139.40 - 80.190.139.47 at -80.190.139.48 - 80.190.139.55 de -80.190.139.56 - 80.190.139.63 it -80.190.139.64 - 80.190.143.195 de -80.190.143.196 - 80.190.143.199 at -80.190.143.200 - 80.190.143.215 de -80.190.143.216 - 80.190.143.223 at -80.190.143.224 - 80.190.146.143 de -80.190.146.144 - 80.190.146.154 fi -80.190.146.155 - 80.190.146.191 de -80.190.146.192 - 80.190.146.192 fi -80.190.146.193 - 80.190.151.255 de -80.190.152.0 - 80.190.152.127 at -80.190.152.128 - 80.190.174.255 de -80.190.175.0 - 80.190.175.255 pl -80.190.176.0 - 80.190.178.31 de -80.190.178.32 - 80.190.178.63 ch -80.190.178.64 - 80.190.178.95 dk -80.190.178.96 - 80.190.178.127 de -80.190.178.128 - 80.190.178.255 it -80.190.179.0 - 80.190.179.255 ae -80.190.180.0 - 80.190.180.127 de -80.190.180.128 - 80.190.180.159 dk -80.190.180.160 - 80.190.184.255 de -80.190.185.0 - 80.190.186.31 ae -80.190.186.32 - 80.190.186.47 de -80.190.186.48 - 80.190.186.55 pl -80.190.186.56 - 80.190.186.255 de -80.190.187.0 - 80.190.187.31 ae -80.190.187.32 - 80.190.187.255 de -80.190.188.0 - 80.190.188.31 ae -80.190.188.32 - 80.190.190.255 de -80.190.191.0 - 80.190.191.15 ae -80.190.191.16 - 80.190.191.143 de -80.190.191.144 - 80.190.191.147 pl -80.190.191.148 - 80.190.193.31 de -80.190.193.32 - 80.190.193.47 ae -80.190.193.48 - 80.190.193.215 de -80.190.193.216 - 80.190.193.223 ch -80.190.193.224 - 80.190.193.231 it -80.190.193.232 - 80.190.195.255 de -80.190.196.0 - 80.190.197.255 ae -80.190.198.0 - 80.190.198.31 de -80.190.198.32 - 80.190.198.63 dk -80.190.198.64 - 80.190.198.255 de -80.190.199.0 - 80.190.199.15 ae -80.190.199.16 - 80.190.199.111 de -80.190.199.112 - 80.190.199.115 pl -80.190.199.116 - 80.190.203.159 de -80.190.203.160 - 80.190.203.191 dk -80.190.203.192 - 80.190.204.127 de -80.190.204.128 - 80.190.204.143 ae -80.190.204.144 - 80.190.205.215 de -80.190.205.216 - 80.190.205.223 ch -80.190.205.224 - 80.190.206.255 de -80.190.207.0 - 80.190.207.31 dk -80.190.207.32 - 80.190.207.63 ch -80.190.207.64 - 80.190.207.175 de -80.190.207.176 - 80.190.207.191 ae -80.190.207.192 - 80.190.209.147 de -80.190.209.148 - 80.190.209.151 rs -80.190.209.152 - 80.190.210.15 de -80.190.210.16 - 80.190.210.31 ae -80.190.210.32 - 80.190.210.215 de -80.190.210.216 - 80.190.210.223 it -80.190.210.224 - 80.190.211.255 de -80.190.212.0 - 80.190.213.255 pl -80.190.214.0 - 80.190.215.255 de -80.190.216.0 - 80.190.216.15 ae -80.190.216.16 - 80.190.216.255 de -80.190.217.0 - 80.190.217.255 ae -80.190.218.0 - 80.190.226.47 de -80.190.226.48 - 80.190.226.55 lu -80.190.226.56 - 80.190.227.127 de -80.190.227.128 - 80.190.227.143 nz -80.190.227.144 - 80.190.227.151 de -80.190.227.152 - 80.190.227.159 nz -80.190.227.160 - 80.190.227.167 de -80.190.227.168 - 80.190.227.175 it -80.190.227.176 - 80.190.227.223 de -80.190.227.224 - 80.190.227.255 it -80.190.228.0 - 80.190.255.255 de +80.190.0.0 - 80.190.114.191 de +80.190.114.192 - 80.190.114.207 at +80.190.114.208 - 80.190.129.15 de +80.190.129.16 - 80.190.129.23 at +80.190.129.24 - 80.190.140.255 de +80.190.141.0 - 80.190.141.7 at +80.190.141.8 - 80.190.255.255 de 80.191.0.0 - 80.191.255.255 ir 80.192.0.0 - 80.195.255.255 gb 80.196.0.0 - 80.199.255.255 dk @@ -38875,166 +20449,130 @@ 80.224.0.0 - 80.224.255.255 es 80.225.0.0 - 80.225.255.255 gb 80.226.0.0 - 80.226.255.255 de -80.227.0.0 - 80.227.147.143 ae -80.227.147.144 - 80.227.147.159 a2 -80.227.147.160 - 80.227.255.255 ae -80.228.0.0 - 80.228.28.151 de -80.228.28.152 - 80.228.28.159 nl -80.228.28.160 - 80.228.29.151 de -80.228.29.152 - 80.228.29.167 nl -80.228.29.168 - 80.228.31.47 de -80.228.31.48 - 80.228.31.63 ch -80.228.31.64 - 80.228.228.87 de -80.228.228.88 - 80.228.228.95 nl -80.228.228.96 - 80.228.255.255 de +80.227.0.0 - 80.227.255.255 ae +80.228.0.0 - 80.228.255.255 de 80.229.0.0 - 80.229.255.255 gb 80.230.0.0 - 80.230.255.255 il -80.231.0.0 - 80.231.1.255 es -80.231.2.0 - 80.231.3.255 lu +80.231.0.0 - 80.231.3.255 eu 80.231.4.0 - 80.231.4.255 gb -80.231.5.0 - 80.231.5.255 eu -80.231.6.0 - 80.231.7.255 ly -80.231.8.0 - 80.231.15.255 qa -80.231.16.0 - 80.231.17.255 fr -80.231.18.0 - 80.231.18.255 ro -80.231.19.0 - 80.231.19.31 es -80.231.19.32 - 80.231.19.39 gb -80.231.19.40 - 80.231.19.47 fr -80.231.19.48 - 80.231.19.55 gb -80.231.19.56 - 80.231.19.63 dk +80.231.5.0 - 80.231.5.255 a2 +80.231.6.0 - 80.231.8.7 eu +80.231.8.8 - 80.231.8.15 gr +80.231.8.16 - 80.231.8.63 gb +80.231.8.64 - 80.231.8.71 it +80.231.8.72 - 80.231.8.255 eu +80.231.9.0 - 80.231.9.255 fr +80.231.10.0 - 80.231.10.255 eu +80.231.11.0 - 80.231.11.255 de +80.231.12.0 - 80.231.19.63 eu 80.231.19.64 - 80.231.19.127 ke -80.231.19.128 - 80.231.19.255 hk -80.231.20.0 - 80.231.20.255 gb -80.231.21.0 - 80.231.21.255 es -80.231.22.0 - 80.231.22.255 cy +80.231.19.128 - 80.231.22.255 eu 80.231.23.0 - 80.231.23.255 gb -80.231.24.0 - 80.231.25.255 de -80.231.26.0 - 80.231.27.255 bh -80.231.28.0 - 80.231.28.255 es +80.231.24.0 - 80.231.24.15 de +80.231.24.16 - 80.231.25.255 eu +80.231.26.0 - 80.231.26.255 gb +80.231.27.0 - 80.231.27.7 cg +80.231.27.8 - 80.231.28.255 eu 80.231.29.0 - 80.231.29.255 gb -80.231.30.0 - 80.231.31.255 de -80.231.32.0 - 80.231.39.255 gb -80.231.40.0 - 80.231.40.255 nl -80.231.41.0 - 80.231.41.255 de -80.231.42.0 - 80.231.43.255 gb -80.231.44.0 - 80.231.47.255 de -80.231.48.0 - 80.231.55.255 eu -80.231.56.0 - 80.231.57.255 de -80.231.58.0 - 80.231.59.255 es -80.231.60.0 - 80.231.63.255 eu -80.231.64.0 - 80.231.66.255 de -80.231.67.0 - 80.231.67.255 gb -80.231.68.0 - 80.231.68.255 ir -80.231.69.0 - 80.231.69.63 fr -80.231.69.64 - 80.231.69.95 gb -80.231.69.96 - 80.231.69.255 es -80.231.70.0 - 80.231.70.255 tz -80.231.71.0 - 80.231.71.255 ca -80.231.72.0 - 80.231.73.255 fr -80.231.74.0 - 80.231.74.255 gb -80.231.75.0 - 80.231.75.255 fr -80.231.76.0 - 80.231.76.255 gb -80.231.77.0 - 80.231.77.255 ke -80.231.78.0 - 80.231.78.255 gb -80.231.79.0 - 80.231.79.255 fr -80.231.80.0 - 80.231.83.255 nl -80.231.84.0 - 80.231.84.255 es -80.231.85.0 - 80.231.85.255 sa -80.231.86.0 - 80.231.88.255 fr -80.231.89.0 - 80.231.90.255 no -80.231.91.0 - 80.231.91.255 es -80.231.92.0 - 80.231.92.255 dz -80.231.93.0 - 80.231.93.255 gb -80.231.94.0 - 80.231.94.255 de -80.231.95.0 - 80.231.103.255 gb -80.231.104.0 - 80.231.111.255 eu -80.231.112.0 - 80.231.119.255 ca -80.231.120.0 - 80.231.127.255 eu -80.231.128.0 - 80.231.128.255 de -80.231.129.0 - 80.231.129.255 lu -80.231.130.0 - 80.231.131.255 gb -80.231.132.0 - 80.231.133.255 es -80.231.134.0 - 80.231.135.255 qa -80.231.136.0 - 80.231.136.255 gb +80.231.30.0 - 80.231.30.15 fi +80.231.30.16 - 80.231.31.255 eu +80.231.32.0 - 80.231.32.7 ru +80.231.32.8 - 80.231.32.31 pl +80.231.32.32 - 80.231.35.255 gb +80.231.36.0 - 80.231.39.255 eu +80.231.40.0 - 80.231.40.1 es +80.231.40.2 - 80.231.40.3 sl +80.231.40.4 - 80.231.41.255 eu +80.231.42.0 - 80.231.42.255 gb +80.231.43.0 - 80.231.43.255 eu +80.231.44.0 - 80.231.44.255 fr +80.231.45.0 - 80.231.47.255 eu +80.231.48.0 - 80.231.49.31 gb +80.231.49.32 - 80.231.49.255 eu +80.231.50.0 - 80.231.51.7 nl +80.231.51.8 - 80.231.51.255 eu +80.231.52.0 - 80.231.52.7 be +80.231.52.8 - 80.231.57.255 eu +80.231.58.0 - 80.231.58.255 gb +80.231.59.0 - 80.231.76.255 eu +80.231.77.0 - 80.231.77.255 it +80.231.78.0 - 80.231.83.255 eu +80.231.84.0 - 80.231.84.35 nl +80.231.84.36 - 80.231.84.39 eu +80.231.84.40 - 80.231.84.47 nl +80.231.84.48 - 80.231.95.255 eu +80.231.96.0 - 80.231.99.255 gb +80.231.100.0 - 80.231.104.255 eu +80.231.105.0 - 80.231.105.255 gb +80.231.106.0 - 80.231.106.255 eu +80.231.107.0 - 80.231.107.15 gb +80.231.107.16 - 80.231.109.255 eu +80.231.110.0 - 80.231.111.255 fr +80.231.112.0 - 80.231.119.255 eu +80.231.120.0 - 80.231.120.19 fr +80.231.120.20 - 80.231.120.31 eu +80.231.120.32 - 80.231.120.47 fr +80.231.120.48 - 80.231.122.7 eu +80.231.122.8 - 80.231.122.47 fr +80.231.122.48 - 80.231.122.127 eu +80.231.122.128 - 80.231.122.255 fr +80.231.123.0 - 80.231.123.31 eu +80.231.123.32 - 80.231.123.75 fr +80.231.123.76 - 80.231.123.79 eu +80.231.123.80 - 80.231.123.87 fr +80.231.123.88 - 80.231.123.95 eu +80.231.123.96 - 80.231.123.143 fr +80.231.123.144 - 80.231.123.159 eu +80.231.123.160 - 80.231.123.191 fr +80.231.123.192 - 80.231.123.255 eu +80.231.124.0 - 80.231.124.255 pl +80.231.125.0 - 80.231.125.255 eu +80.231.126.0 - 80.231.126.7 es +80.231.126.8 - 80.231.126.31 eu +80.231.126.32 - 80.231.126.63 es +80.231.126.64 - 80.231.126.127 eu +80.231.126.128 - 80.231.126.255 es +80.231.127.0 - 80.231.133.255 eu +80.231.134.0 - 80.231.134.247 gb +80.231.134.248 - 80.231.134.255 eu +80.231.135.0 - 80.231.135.191 gb +80.231.135.192 - 80.231.136.255 eu 80.231.137.0 - 80.231.137.255 pl -80.231.138.0 - 80.231.143.255 gb -80.231.144.0 - 80.231.147.255 ca -80.231.148.0 - 80.231.151.255 eu -80.231.152.0 - 80.231.152.255 nl -80.231.153.0 - 80.231.154.255 fr -80.231.155.0 - 80.231.155.255 gb -80.231.156.0 - 80.231.157.255 es -80.231.158.0 - 80.231.159.255 pt -80.231.160.0 - 80.231.161.255 es -80.231.162.0 - 80.231.163.255 de -80.231.164.0 - 80.231.164.255 es -80.231.165.0 - 80.231.165.255 fr -80.231.166.0 - 80.231.166.255 de -80.231.167.0 - 80.231.167.255 pl -80.231.168.0 - 80.231.171.127 es -80.231.171.128 - 80.231.171.143 gb -80.231.171.144 - 80.231.171.151 it -80.231.171.152 - 80.231.171.159 be -80.231.171.160 - 80.231.172.143 gb -80.231.172.144 - 80.231.172.151 fr -80.231.172.152 - 80.231.172.159 gb -80.231.172.160 - 80.231.172.191 in -80.231.172.192 - 80.231.172.207 gb -80.231.172.208 - 80.231.172.215 be -80.231.172.216 - 80.231.172.223 lu -80.231.172.224 - 80.231.172.255 gb -80.231.173.0 - 80.231.173.255 es -80.231.174.0 - 80.231.174.255 gb -80.231.175.0 - 80.231.175.255 de -80.231.176.0 - 80.231.183.255 eu +80.231.138.0 - 80.231.171.191 eu +80.231.171.192 - 80.231.172.255 gb +80.231.173.0 - 80.231.175.255 eu +80.231.176.0 - 80.231.183.255 gb 80.231.184.0 - 80.231.187.255 qa 80.231.188.0 - 80.231.191.255 es -80.231.192.0 - 80.231.193.255 dz -80.231.194.0 - 80.231.194.31 es -80.231.194.32 - 80.231.194.63 bh -80.231.194.64 - 80.231.194.127 gb -80.231.194.128 - 80.231.194.255 de -80.231.195.0 - 80.231.195.255 km -80.231.196.0 - 80.231.196.255 fr -80.231.197.0 - 80.231.197.63 be -80.231.197.64 - 80.231.197.127 fr -80.231.197.128 - 80.231.197.191 pt -80.231.197.192 - 80.231.197.255 gb -80.231.198.0 - 80.231.198.15 md -80.231.198.16 - 80.231.198.31 es -80.231.198.32 - 80.231.198.63 fr -80.231.198.64 - 80.231.198.79 gb -80.231.198.80 - 80.231.198.95 es -80.231.198.96 - 80.231.198.127 eu -80.231.198.128 - 80.231.198.143 gb -80.231.198.144 - 80.231.198.159 eu -80.231.198.160 - 80.231.198.175 gb +80.231.192.0 - 80.231.197.255 eu +80.231.198.0 - 80.231.198.175 nl 80.231.198.176 - 80.231.198.183 be -80.231.198.184 - 80.231.198.191 fr -80.231.198.192 - 80.231.199.255 gb -80.231.200.0 - 80.231.200.255 fr -80.231.201.0 - 80.231.201.255 eu -80.231.202.0 - 80.231.202.255 gb -80.231.203.0 - 80.231.205.255 gn -80.231.206.0 - 80.231.207.255 es -80.231.208.0 - 80.231.208.255 pl -80.231.209.0 - 80.231.209.255 gb -80.231.210.0 - 80.231.210.255 ke -80.231.211.0 - 80.231.211.255 de -80.231.212.0 - 80.231.213.255 gb -80.231.214.0 - 80.231.215.255 ly +80.231.198.184 - 80.231.198.191 nl +80.231.198.192 - 80.231.198.255 gb +80.231.199.0 - 80.231.204.31 eu +80.231.204.32 - 80.231.204.63 nl +80.231.204.64 - 80.231.204.255 eu +80.231.205.0 - 80.231.205.255 nl +80.231.206.0 - 80.231.215.255 eu 80.231.216.0 - 80.231.216.255 gb -80.231.217.0 - 80.231.217.255 fr -80.231.218.0 - 80.231.218.255 ru -80.231.219.0 - 80.231.221.255 gb -80.231.222.0 - 80.231.222.255 am -80.231.223.0 - 80.231.223.255 gb -80.231.224.0 - 80.231.255.255 eu -80.232.0.0 - 80.232.17.159 no -80.232.17.160 - 80.232.17.163 dk -80.232.17.164 - 80.232.38.255 no -80.232.39.0 - 80.232.39.255 se -80.232.40.0 - 80.232.127.255 no +80.231.217.0 - 80.231.219.255 eu +80.231.220.0 - 80.231.221.255 gb +80.231.222.0 - 80.231.224.27 eu +80.231.224.28 - 80.231.224.31 gb +80.231.224.32 - 80.231.224.39 eu +80.231.224.40 - 80.231.224.79 gb +80.231.224.80 - 80.231.224.95 fi +80.231.224.96 - 80.231.224.99 es +80.231.224.100 - 80.231.224.103 pt +80.231.224.104 - 80.231.224.115 gb +80.231.224.116 - 80.231.224.119 eu +80.231.224.120 - 80.231.230.231 gb +80.231.230.232 - 80.231.230.255 eu +80.231.231.0 - 80.231.231.63 gb +80.231.231.64 - 80.231.239.255 eu +80.231.240.0 - 80.231.244.63 fr +80.231.244.64 - 80.231.255.255 eu +80.232.0.0 - 80.232.127.255 no 80.232.128.0 - 80.232.255.255 lv 80.233.0.0 - 80.233.127.255 ie 80.233.128.0 - 80.233.255.255 lv @@ -39045,54 +20583,24 @@ 80.236.0.0 - 80.236.127.255 fr 80.236.128.0 - 80.236.255.255 be 80.237.0.0 - 80.237.127.255 ru -80.237.128.0 - 80.237.194.103 de -80.237.194.104 - 80.237.194.111 am -80.237.194.112 - 80.237.194.207 de -80.237.194.208 - 80.237.194.215 at -80.237.194.216 - 80.237.220.191 de -80.237.220.192 - 80.237.220.199 at -80.237.220.200 - 80.237.249.55 de -80.237.249.56 - 80.237.249.63 pl -80.237.249.64 - 80.237.255.255 de +80.237.128.0 - 80.237.255.255 de 80.238.0.0 - 80.238.63.255 gb 80.238.64.0 - 80.238.127.255 pl 80.238.128.0 - 80.238.255.255 ch -80.239.0.0 - 80.239.106.215 no -80.239.106.216 - 80.239.106.223 se -80.239.106.224 - 80.239.127.255 no -80.239.128.0 - 80.239.135.255 de -80.239.136.0 - 80.239.136.15 at -80.239.136.16 - 80.239.136.47 de -80.239.136.48 - 80.239.136.63 us -80.239.136.64 - 80.239.136.79 at -80.239.136.80 - 80.239.136.223 de -80.239.136.224 - 80.239.136.239 gb -80.239.136.240 - 80.239.137.255 de -80.239.138.0 - 80.239.138.255 pl -80.239.139.0 - 80.239.139.175 de -80.239.139.176 - 80.239.139.183 se -80.239.139.184 - 80.239.139.255 de -80.239.140.0 - 80.239.140.15 no -80.239.140.16 - 80.239.140.63 eu -80.239.140.64 - 80.239.140.79 pl -80.239.140.80 - 80.239.140.95 gb -80.239.140.96 - 80.239.140.111 eu -80.239.140.112 - 80.239.140.115 pl -80.239.140.116 - 80.239.140.119 ru -80.239.140.120 - 80.239.140.159 eu -80.239.140.160 - 80.239.140.167 ru -80.239.140.168 - 80.239.140.175 pl -80.239.140.176 - 80.239.140.183 de -80.239.140.184 - 80.239.140.191 gb -80.239.140.192 - 80.239.140.255 pl -80.239.141.0 - 80.239.141.15 se -80.239.141.16 - 80.239.141.63 eu -80.239.141.64 - 80.239.142.127 de -80.239.142.128 - 80.239.142.191 se -80.239.142.192 - 80.239.144.87 de -80.239.144.88 - 80.239.144.95 eu -80.239.144.96 - 80.239.145.255 de -80.239.146.0 - 80.239.147.255 eu +80.239.0.0 - 80.239.127.255 no +80.239.128.0 - 80.239.136.95 eu +80.239.136.96 - 80.239.136.127 ie +80.239.136.128 - 80.239.136.255 eu +80.239.137.0 - 80.239.137.255 nl +80.239.138.0 - 80.239.140.223 eu +80.239.140.224 - 80.239.140.255 de +80.239.141.0 - 80.239.141.255 eu +80.239.142.0 - 80.239.142.127 es +80.239.142.128 - 80.239.143.255 eu +80.239.144.0 - 80.239.144.63 de +80.239.144.64 - 80.239.144.127 eu +80.239.144.128 - 80.239.144.191 de +80.239.144.192 - 80.239.147.255 eu 80.239.148.0 - 80.239.148.63 ch 80.239.148.64 - 80.239.148.127 cz 80.239.148.128 - 80.239.148.191 nl @@ -39100,155 +20608,69 @@ 80.239.149.0 - 80.239.149.63 at 80.239.149.64 - 80.239.149.127 pl 80.239.149.128 - 80.239.149.191 de -80.239.149.192 - 80.239.149.255 nl -80.239.150.0 - 80.239.153.255 de -80.239.154.0 - 80.239.154.63 ru -80.239.154.64 - 80.239.154.127 de +80.239.149.192 - 80.239.151.255 eu +80.239.152.0 - 80.239.152.127 de +80.239.152.128 - 80.239.154.127 eu 80.239.154.128 - 80.239.154.255 gb -80.239.155.0 - 80.239.155.255 nl -80.239.156.0 - 80.239.156.127 de -80.239.156.128 - 80.239.156.191 ch -80.239.156.192 - 80.239.156.223 de -80.239.156.224 - 80.239.156.239 at -80.239.156.240 - 80.239.157.255 de -80.239.158.0 - 80.239.158.255 at -80.239.159.0 - 80.239.159.255 de -80.239.160.0 - 80.239.167.255 fr -80.239.168.0 - 80.239.168.15 es -80.239.168.16 - 80.239.168.63 eu -80.239.168.64 - 80.239.168.127 fr -80.239.168.128 - 80.239.168.143 eu -80.239.168.144 - 80.239.168.151 fr -80.239.168.152 - 80.239.168.191 eu -80.239.168.192 - 80.239.169.63 fr -80.239.169.64 - 80.239.169.71 eu -80.239.169.72 - 80.239.169.79 fr -80.239.169.80 - 80.239.169.95 de -80.239.169.96 - 80.239.169.111 it -80.239.169.112 - 80.239.169.127 fr -80.239.169.128 - 80.239.169.159 ru -80.239.169.160 - 80.239.169.191 gb -80.239.169.192 - 80.239.170.95 eu -80.239.170.96 - 80.239.170.127 fr -80.239.170.128 - 80.239.170.191 ru -80.239.170.192 - 80.239.170.255 se +80.239.155.0 - 80.239.168.255 eu +80.239.169.0 - 80.239.169.255 se +80.239.170.0 - 80.239.170.255 eu 80.239.171.0 - 80.239.171.255 gb -80.239.172.0 - 80.239.172.7 fr -80.239.172.8 - 80.239.172.11 be -80.239.172.12 - 80.239.172.15 de -80.239.172.16 - 80.239.172.23 us -80.239.172.24 - 80.239.172.31 fr -80.239.172.32 - 80.239.172.79 eu -80.239.172.80 - 80.239.172.95 de -80.239.172.96 - 80.239.173.255 fr -80.239.174.0 - 80.239.174.7 eu -80.239.174.8 - 80.239.174.15 gb -80.239.174.16 - 80.239.174.31 fr -80.239.174.32 - 80.239.174.63 ru -80.239.174.64 - 80.239.174.127 eu -80.239.174.128 - 80.239.174.191 fr -80.239.174.192 - 80.239.174.255 eu -80.239.175.0 - 80.239.175.7 se -80.239.175.8 - 80.239.175.15 es -80.239.175.16 - 80.239.175.31 eu -80.239.175.32 - 80.239.175.63 es -80.239.175.64 - 80.239.175.255 de -80.239.176.0 - 80.239.176.255 fr -80.239.177.0 - 80.239.177.255 de -80.239.178.0 - 80.239.179.255 eu -80.239.180.0 - 80.239.183.255 us -80.239.184.0 - 80.239.187.255 fr -80.239.188.0 - 80.239.189.255 de -80.239.190.0 - 80.239.191.255 gb -80.239.192.0 - 80.239.196.255 pl -80.239.197.0 - 80.239.197.11 nl -80.239.197.12 - 80.239.197.31 eu -80.239.197.32 - 80.239.197.63 nl -80.239.197.64 - 80.239.197.95 eu -80.239.197.96 - 80.239.197.127 de -80.239.197.128 - 80.239.198.255 nl -80.239.199.0 - 80.239.199.63 eu -80.239.199.64 - 80.239.199.71 nl -80.239.199.72 - 80.239.199.95 eu -80.239.199.96 - 80.239.199.127 de -80.239.199.128 - 80.239.199.255 se -80.239.200.0 - 80.239.200.63 eu -80.239.200.64 - 80.239.200.95 nl +80.239.172.0 - 80.239.174.191 eu +80.239.174.192 - 80.239.174.255 de +80.239.175.0 - 80.239.175.15 eu +80.239.175.16 - 80.239.175.31 at +80.239.175.32 - 80.239.175.63 eu +80.239.175.64 - 80.239.175.127 se +80.239.175.128 - 80.239.177.255 eu +80.239.178.0 - 80.239.178.255 se +80.239.179.0 - 80.239.189.255 eu +80.239.190.0 - 80.239.190.255 gb +80.239.191.0 - 80.239.191.255 se +80.239.192.0 - 80.239.192.255 eu +80.239.193.0 - 80.239.193.255 se +80.239.194.0 - 80.239.197.11 eu +80.239.197.12 - 80.239.197.15 nl +80.239.197.16 - 80.239.197.255 eu +80.239.198.0 - 80.239.198.255 nl +80.239.199.0 - 80.239.199.255 eu +80.239.200.0 - 80.239.200.63 se +80.239.200.64 - 80.239.200.95 eu 80.239.200.96 - 80.239.200.127 gb 80.239.200.128 - 80.239.200.255 se 80.239.201.0 - 80.239.201.255 gb -80.239.202.0 - 80.239.202.15 de -80.239.202.16 - 80.239.202.31 es -80.239.202.32 - 80.239.202.47 fr -80.239.202.48 - 80.239.202.63 it -80.239.202.64 - 80.239.202.79 gb -80.239.202.80 - 80.239.202.87 ar -80.239.202.88 - 80.239.202.95 au -80.239.202.96 - 80.239.202.103 br -80.239.202.104 - 80.239.202.111 nl -80.239.202.112 - 80.239.202.119 se -80.239.202.120 - 80.239.202.127 us +80.239.202.0 - 80.239.202.127 eu 80.239.202.128 - 80.239.202.255 fr -80.239.203.0 - 80.239.205.255 nl -80.239.206.0 - 80.239.206.255 se -80.239.207.0 - 80.239.207.31 eu -80.239.207.32 - 80.239.207.63 se -80.239.207.64 - 80.239.207.95 it -80.239.207.96 - 80.239.207.127 pl -80.239.207.128 - 80.239.207.255 de -80.239.208.0 - 80.239.212.255 eu +80.239.203.0 - 80.239.203.255 eu +80.239.204.0 - 80.239.204.127 nl +80.239.204.128 - 80.239.204.255 eu +80.239.205.0 - 80.239.205.255 nl +80.239.206.0 - 80.239.212.255 eu 80.239.213.0 - 80.239.214.255 fr -80.239.215.0 - 80.239.221.255 eu -80.239.222.0 - 80.239.222.63 se -80.239.222.64 - 80.239.222.127 eu -80.239.222.128 - 80.239.222.159 hu -80.239.222.160 - 80.239.222.223 eu -80.239.222.224 - 80.239.223.15 de -80.239.223.16 - 80.239.223.63 eu -80.239.223.64 - 80.239.223.71 cz -80.239.223.72 - 80.239.223.79 se -80.239.223.80 - 80.239.223.247 eu -80.239.223.248 - 80.239.223.255 de -80.239.224.0 - 80.239.224.127 eu -80.239.224.128 - 80.239.226.255 de -80.239.227.0 - 80.239.227.255 eu -80.239.228.0 - 80.239.229.7 de -80.239.229.8 - 80.239.229.11 eu -80.239.229.12 - 80.239.229.15 nl -80.239.229.16 - 80.239.229.31 de -80.239.229.32 - 80.239.229.39 eu -80.239.229.40 - 80.239.229.55 de -80.239.229.56 - 80.239.229.63 eu -80.239.229.64 - 80.239.229.191 de -80.239.229.192 - 80.239.229.255 eu -80.239.230.0 - 80.239.230.3 de -80.239.230.4 - 80.239.230.11 fr -80.239.230.12 - 80.239.230.15 nl -80.239.230.16 - 80.239.230.23 ru -80.239.230.24 - 80.239.230.31 eu -80.239.230.32 - 80.239.230.47 de -80.239.230.48 - 80.239.231.7 eu -80.239.231.8 - 80.239.231.15 br -80.239.231.16 - 80.239.231.23 cz -80.239.231.24 - 80.239.231.31 eu -80.239.231.32 - 80.239.231.47 at -80.239.231.48 - 80.239.231.127 eu +80.239.215.0 - 80.239.215.255 eu +80.239.216.0 - 80.239.216.255 de +80.239.217.0 - 80.239.217.255 se +80.239.218.0 - 80.239.218.255 de +80.239.219.0 - 80.239.222.159 eu +80.239.222.160 - 80.239.222.191 pl +80.239.222.192 - 80.239.227.255 eu +80.239.228.0 - 80.239.228.127 de +80.239.228.128 - 80.239.231.63 eu +80.239.231.64 - 80.239.231.95 nl +80.239.231.96 - 80.239.231.127 eu 80.239.231.128 - 80.239.231.255 gb -80.239.232.0 - 80.239.233.255 de -80.239.234.0 - 80.239.234.31 eu -80.239.234.32 - 80.239.234.39 fr -80.239.234.40 - 80.239.234.63 eu -80.239.234.64 - 80.239.234.127 ch +80.239.232.0 - 80.239.234.127 eu 80.239.234.128 - 80.239.234.255 se -80.239.235.0 - 80.239.235.255 nl -80.239.236.0 - 80.239.239.255 de -80.239.240.0 - 80.239.241.255 eu -80.239.242.0 - 80.239.243.255 pl +80.239.235.0 - 80.239.236.255 eu +80.239.237.0 - 80.239.237.127 se +80.239.237.128 - 80.239.242.29 eu +80.239.242.30 - 80.239.242.30 no +80.239.242.31 - 80.239.243.255 eu 80.239.244.0 - 80.239.245.255 gb -80.239.246.0 - 80.239.246.255 de -80.239.247.0 - 80.239.247.255 se -80.239.248.0 - 80.239.249.255 eu -80.239.250.0 - 80.239.251.255 de +80.239.246.0 - 80.239.246.255 eu +80.239.247.0 - 80.239.247.127 ch +80.239.247.128 - 80.239.247.255 dk +80.239.248.0 - 80.239.251.255 eu 80.239.252.0 - 80.239.253.255 gb 80.239.254.0 - 80.239.254.255 se 80.239.255.0 - 80.239.255.255 nl @@ -39257,70 +20679,40 @@ 80.240.32.0 - 80.240.63.255 ru 80.240.64.0 - 80.240.79.255 sa 80.240.80.0 - 80.240.95.255 gb -80.240.96.0 - 80.240.143.255 ru +80.240.96.0 - 80.240.127.255 ru +80.240.128.0 - 80.240.143.255 nl 80.240.144.0 - 80.240.159.255 rs -80.240.160.0 - 80.240.191.255 pl +80.240.160.0 - 80.240.183.255 pl +80.240.184.0 - 80.240.187.255 us +80.240.188.0 - 80.240.191.255 pl 80.240.192.0 - 80.240.207.255 ke 80.240.208.0 - 80.240.223.255 ru -80.240.224.0 - 80.240.227.167 at -80.240.227.168 - 80.240.227.175 de -80.240.227.176 - 80.240.239.255 at +80.240.224.0 - 80.240.239.255 at 80.240.240.0 - 80.240.255.255 ru 80.241.0.0 - 80.241.15.255 kz 80.241.16.0 - 80.241.31.255 at 80.241.32.0 - 80.241.47.255 kz -80.241.48.0 - 80.241.63.255 ru -80.241.64.0 - 80.241.66.127 gb -80.241.66.128 - 80.241.66.131 de -80.241.66.132 - 80.241.66.143 gb -80.241.66.144 - 80.241.66.191 de -80.241.66.192 - 80.241.66.199 nl -80.241.66.200 - 80.241.66.207 de -80.241.66.208 - 80.241.66.215 gb -80.241.66.216 - 80.241.66.255 de -80.241.67.0 - 80.241.67.143 gb -80.241.67.144 - 80.241.67.167 de -80.241.67.168 - 80.241.67.175 gb -80.241.67.176 - 80.241.67.255 de -80.241.68.0 - 80.241.69.255 gb -80.241.70.0 - 80.241.70.7 ch -80.241.70.8 - 80.241.71.15 gb -80.241.71.16 - 80.241.71.23 fr -80.241.71.24 - 80.241.71.31 gb -80.241.71.32 - 80.241.71.39 fr -80.241.71.40 - 80.241.71.47 be -80.241.71.48 - 80.241.71.71 fr -80.241.71.72 - 80.241.71.79 gb -80.241.71.80 - 80.241.71.95 fr -80.241.71.96 - 80.241.71.111 gb -80.241.71.112 - 80.241.71.127 ch -80.241.71.128 - 80.241.71.151 fr -80.241.71.152 - 80.241.71.159 gb -80.241.71.160 - 80.241.71.175 fr -80.241.71.176 - 80.241.71.191 gb -80.241.71.192 - 80.241.71.199 nl -80.241.71.200 - 80.241.71.207 fr -80.241.71.208 - 80.241.71.215 gb -80.241.71.216 - 80.241.71.255 fr -80.241.72.0 - 80.241.78.255 gb -80.241.79.0 - 80.241.79.31 de -80.241.79.32 - 80.241.79.39 gb -80.241.79.40 - 80.241.79.55 de -80.241.79.56 - 80.241.79.79 gb -80.241.79.80 - 80.241.79.103 de -80.241.79.104 - 80.241.79.111 gb -80.241.79.112 - 80.241.79.119 de -80.241.79.120 - 80.241.79.143 gb -80.241.79.144 - 80.241.79.159 de -80.241.79.160 - 80.241.79.175 gb -80.241.79.176 - 80.241.79.215 de -80.241.79.216 - 80.241.79.223 gb -80.241.79.224 - 80.241.79.247 de -80.241.79.248 - 80.241.79.255 gb +80.241.48.0 - 80.241.49.103 gb +80.241.49.104 - 80.241.49.119 it +80.241.49.120 - 80.241.51.15 gb +80.241.51.16 - 80.241.51.23 it +80.241.51.24 - 80.241.51.31 gb +80.241.51.32 - 80.241.51.39 it +80.241.51.40 - 80.241.51.79 gb +80.241.51.80 - 80.241.51.87 it +80.241.51.88 - 80.241.52.63 gb +80.241.52.64 - 80.241.52.71 it +80.241.52.72 - 80.241.52.143 gb +80.241.52.144 - 80.241.52.151 it +80.241.52.152 - 80.241.52.247 gb +80.241.52.248 - 80.241.52.255 it +80.241.53.0 - 80.241.55.255 gb +80.241.56.0 - 80.241.63.255 de +80.241.64.0 - 80.241.79.255 gb 80.241.80.0 - 80.241.95.255 no 80.241.96.0 - 80.241.111.255 ch 80.241.112.0 - 80.241.127.255 li -80.241.128.0 - 80.241.143.255 pl +80.241.128.0 - 80.241.135.255 pl 80.241.144.0 - 80.241.159.255 bh 80.241.160.0 - 80.241.175.255 it 80.241.176.0 - 80.241.191.255 ge @@ -39330,125 +20722,54 @@ 80.242.0.0 - 80.242.15.255 ir 80.242.16.0 - 80.242.31.255 fi 80.242.32.0 - 80.242.47.255 sk -80.242.48.0 - 80.242.95.255 ru -80.242.96.0 - 80.242.111.255 ua +80.242.48.0 - 80.242.107.255 ru +80.242.108.0 - 80.242.111.255 ua 80.242.112.0 - 80.242.127.255 ba -80.242.128.0 - 80.242.147.95 de -80.242.147.96 - 80.242.147.127 ch -80.242.147.128 - 80.242.178.255 de -80.242.179.0 - 80.242.179.255 ch -80.242.180.0 - 80.242.191.255 de +80.242.128.0 - 80.242.191.255 de 80.242.192.0 - 80.242.207.255 ch 80.242.208.0 - 80.242.223.255 kz 80.242.224.0 - 80.242.255.255 nl 80.243.0.0 - 80.243.15.255 ru 80.243.16.0 - 80.243.31.255 lt -80.243.32.0 - 80.243.56.31 de -80.243.56.32 - 80.243.56.47 it -80.243.56.48 - 80.243.63.255 de +80.243.32.0 - 80.243.63.255 de 80.243.64.0 - 80.243.79.255 ru 80.243.80.0 - 80.243.95.255 pt 80.243.96.0 - 80.243.111.255 cz -80.243.112.0 - 80.243.127.255 dk +80.243.112.0 - 80.243.117.255 dk +80.243.118.0 - 80.243.119.255 gb +80.243.120.0 - 80.243.127.255 dk 80.243.128.0 - 80.243.143.255 ru 80.243.144.0 - 80.243.159.255 ua -80.243.160.0 - 80.243.162.159 at -80.243.162.160 - 80.243.162.191 mt -80.243.162.192 - 80.243.175.191 at -80.243.175.192 - 80.243.175.255 mt +80.243.160.0 - 80.243.175.255 at 80.243.176.0 - 80.243.191.255 gb 80.243.192.0 - 80.243.207.255 de 80.243.208.0 - 80.243.223.255 ch -80.243.224.0 - 80.243.239.255 es -80.243.240.0 - 80.243.255.255 fr +80.243.240.0 - 80.243.241.255 fr +80.243.242.0 - 80.243.244.255 mq +80.243.245.0 - 80.243.252.255 fr +80.243.253.0 - 80.243.253.255 gp +80.243.254.0 - 80.243.254.255 fr +80.243.255.0 - 80.243.255.255 gp 80.244.0.0 - 80.244.15.255 gb -80.244.16.0 - 80.244.19.255 cy -80.244.20.0 - 80.244.22.255 gr -80.244.23.0 - 80.244.23.255 de -80.244.24.0 - 80.244.31.255 cy +80.244.16.0 - 80.244.31.255 cy 80.244.32.0 - 80.244.47.255 ru 80.244.48.0 - 80.244.63.255 es -80.244.64.0 - 80.244.95.255 se +80.244.64.0 - 80.244.76.255 se +80.244.77.0 - 80.244.77.63 no +80.244.77.64 - 80.244.95.255 se 80.244.96.0 - 80.244.111.255 hu 80.244.112.0 - 80.244.127.255 it 80.244.128.0 - 80.244.159.255 pl 80.244.160.0 - 80.244.175.255 il 80.244.176.0 - 80.244.191.255 gb 80.244.192.0 - 80.244.207.255 se -80.244.208.0 - 80.244.215.255 de -80.244.216.0 - 80.244.217.15 gb -80.244.217.16 - 80.244.217.47 de -80.244.217.48 - 80.244.217.55 gb -80.244.217.56 - 80.244.217.71 de -80.244.217.72 - 80.244.217.79 gb -80.244.217.80 - 80.244.217.103 de -80.244.217.104 - 80.244.217.199 gb -80.244.217.200 - 80.244.217.227 de -80.244.217.228 - 80.244.217.255 gb -80.244.218.0 - 80.244.218.15 nl -80.244.218.16 - 80.244.218.23 de -80.244.218.24 - 80.244.218.31 nl -80.244.218.32 - 80.244.218.39 de -80.244.218.40 - 80.244.218.55 nl -80.244.218.56 - 80.244.218.63 de -80.244.218.64 - 80.244.218.67 nl -80.244.218.68 - 80.244.218.103 de -80.244.218.104 - 80.244.218.119 nl -80.244.218.120 - 80.244.218.127 de -80.244.218.128 - 80.244.218.215 nl -80.244.218.216 - 80.244.220.127 de -80.244.220.128 - 80.244.220.135 be -80.244.220.136 - 80.244.220.227 de -80.244.220.228 - 80.244.221.11 be -80.244.221.12 - 80.244.221.15 de -80.244.221.16 - 80.244.221.87 be -80.244.221.88 - 80.244.222.63 de -80.244.222.64 - 80.244.222.127 it -80.244.222.128 - 80.244.222.135 de -80.244.222.136 - 80.244.222.231 it -80.244.222.232 - 80.244.222.239 de -80.244.222.240 - 80.244.223.31 it -80.244.223.32 - 80.244.223.39 de -80.244.223.40 - 80.244.223.55 it -80.244.223.56 - 80.244.223.255 de +80.244.208.0 - 80.244.223.255 de 80.244.224.0 - 80.244.239.255 ru -80.244.240.0 - 80.244.242.95 de -80.244.242.96 - 80.244.242.99 at -80.244.242.100 - 80.244.243.111 de -80.244.243.112 - 80.244.243.119 tr -80.244.243.120 - 80.244.243.127 ch -80.244.243.128 - 80.244.253.31 de -80.244.253.32 - 80.244.253.35 it -80.244.253.36 - 80.244.253.71 de -80.244.253.72 - 80.244.253.79 ch -80.244.253.80 - 80.244.255.255 de +80.244.240.0 - 80.244.255.255 de 80.245.0.0 - 80.245.15.255 es -80.245.16.0 - 80.245.21.255 fr -80.245.22.0 - 80.245.22.255 ch -80.245.23.0 - 80.245.23.255 fr -80.245.24.0 - 80.245.24.255 ch -80.245.25.0 - 80.245.25.255 fr -80.245.26.0 - 80.245.26.63 ch -80.245.26.64 - 80.245.31.255 fr -80.245.32.0 - 80.245.32.31 be -80.245.32.32 - 80.245.32.159 fr -80.245.32.160 - 80.245.32.191 be -80.245.32.192 - 80.245.35.31 fr -80.245.35.32 - 80.245.35.63 be -80.245.35.64 - 80.245.41.255 fr -80.245.42.0 - 80.245.42.255 it -80.245.43.0 - 80.245.46.127 fr -80.245.46.128 - 80.245.46.255 be -80.245.47.0 - 80.245.47.63 fr -80.245.47.64 - 80.245.47.127 be -80.245.47.128 - 80.245.60.255 fr -80.245.61.0 - 80.245.61.255 it -80.245.62.0 - 80.245.63.255 fr -80.245.64.0 - 80.245.71.39 de -80.245.71.40 - 80.245.71.47 nl -80.245.71.48 - 80.245.79.255 de +80.245.16.0 - 80.245.63.255 fr +80.245.64.0 - 80.245.79.255 de 80.245.80.0 - 80.245.95.255 md -80.245.96.0 - 80.245.111.255 ru 80.245.112.0 - 80.245.127.255 ua 80.245.128.0 - 80.245.159.255 de 80.245.160.0 - 80.245.175.255 gr @@ -39462,9 +20783,7 @@ 80.246.32.0 - 80.246.63.255 de 80.246.64.0 - 80.246.95.255 ru 80.246.96.0 - 80.246.111.255 lu -80.246.112.0 - 80.246.115.95 de -80.246.115.96 - 80.246.115.151 at -80.246.115.152 - 80.246.127.255 de +80.246.112.0 - 80.246.127.255 de 80.246.128.0 - 80.246.143.255 il 80.246.144.0 - 80.246.175.255 fi 80.246.176.0 - 80.246.207.255 nl @@ -39474,92 +20793,16 @@ 80.247.0.0 - 80.247.31.255 gb 80.247.32.0 - 80.247.47.255 ru 80.247.48.0 - 80.247.63.255 gb -80.247.64.0 - 80.247.72.207 it -80.247.72.208 - 80.247.72.223 fr -80.247.72.224 - 80.247.75.255 it -80.247.76.0 - 80.247.76.15 fr -80.247.76.16 - 80.247.76.63 it -80.247.76.64 - 80.247.76.71 fr -80.247.76.72 - 80.247.79.255 it +80.247.64.0 - 80.247.79.255 it 80.247.80.0 - 80.247.95.255 gb 80.247.96.0 - 80.247.127.255 ru -80.247.128.0 - 80.247.129.47 gb -80.247.129.48 - 80.247.129.255 a2 -80.247.130.0 - 80.247.131.255 tz +80.247.128.0 - 80.247.131.255 a2 80.247.132.0 - 80.247.135.255 gb -80.247.136.0 - 80.247.137.255 ng -80.247.138.0 - 80.247.138.7 pk -80.247.138.8 - 80.247.138.15 a2 -80.247.138.16 - 80.247.138.71 in -80.247.138.72 - 80.247.138.255 a2 -80.247.139.0 - 80.247.139.255 af -80.247.140.0 - 80.247.140.7 ga -80.247.140.8 - 80.247.140.15 a2 -80.247.140.16 - 80.247.140.23 tz -80.247.140.24 - 80.247.140.31 a2 -80.247.140.32 - 80.247.140.39 ga -80.247.140.40 - 80.247.140.63 a2 -80.247.140.64 - 80.247.140.79 ke -80.247.140.80 - 80.247.140.127 a2 -80.247.140.128 - 80.247.141.7 ke -80.247.141.8 - 80.247.141.15 a2 -80.247.141.16 - 80.247.141.31 ke -80.247.141.32 - 80.247.141.95 ng -80.247.141.96 - 80.247.141.127 ga -80.247.141.128 - 80.247.142.255 ng -80.247.143.0 - 80.247.143.111 ke -80.247.143.112 - 80.247.143.127 a2 -80.247.143.128 - 80.247.143.159 ke -80.247.143.160 - 80.247.143.255 a2 -80.247.144.0 - 80.247.144.255 gb -80.247.145.0 - 80.247.146.127 a2 -80.247.146.128 - 80.247.146.255 tz -80.247.147.0 - 80.247.147.15 a2 -80.247.147.16 - 80.247.147.39 ng -80.247.147.40 - 80.247.147.47 ke -80.247.147.48 - 80.247.147.55 a2 -80.247.147.56 - 80.247.147.59 id -80.247.147.60 - 80.247.147.63 a2 -80.247.147.64 - 80.247.147.95 ng -80.247.147.96 - 80.247.147.111 cg -80.247.147.112 - 80.247.147.115 id -80.247.147.116 - 80.247.147.143 a2 -80.247.147.144 - 80.247.147.159 ke -80.247.147.160 - 80.247.147.191 a2 -80.247.147.192 - 80.247.147.239 ke -80.247.147.240 - 80.247.147.255 a2 -80.247.148.0 - 80.247.148.159 gb -80.247.148.160 - 80.247.150.31 a2 -80.247.150.32 - 80.247.150.63 id -80.247.150.64 - 80.247.150.79 a2 -80.247.150.80 - 80.247.150.95 id -80.247.150.96 - 80.247.150.111 a2 -80.247.150.112 - 80.247.150.201 id -80.247.150.202 - 80.247.150.255 a2 -80.247.151.0 - 80.247.151.255 ng -80.247.152.0 - 80.247.152.7 pk -80.247.152.8 - 80.247.152.47 a2 -80.247.152.48 - 80.247.152.95 pk -80.247.152.96 - 80.247.152.103 a2 -80.247.152.104 - 80.247.152.127 pk -80.247.152.128 - 80.247.152.255 a2 -80.247.153.0 - 80.247.153.255 ng -80.247.154.0 - 80.247.155.255 a2 -80.247.156.0 - 80.247.156.3 ng -80.247.156.4 - 80.247.156.7 tz -80.247.156.8 - 80.247.156.15 ng -80.247.156.16 - 80.247.156.47 tz -80.247.156.48 - 80.247.156.63 ng -80.247.156.64 - 80.247.156.87 a2 -80.247.156.88 - 80.247.156.95 tz -80.247.156.96 - 80.247.156.127 a2 -80.247.156.128 - 80.247.156.143 ng -80.247.156.144 - 80.247.156.159 a2 -80.247.156.160 - 80.247.156.175 ng -80.247.156.176 - 80.247.156.255 a2 -80.247.157.0 - 80.247.157.255 ng -80.247.158.0 - 80.247.158.255 tz -80.247.159.0 - 80.247.159.255 ng +80.247.136.0 - 80.247.142.255 a2 +80.247.143.0 - 80.247.143.255 ke +80.247.144.0 - 80.247.146.255 a2 +80.247.147.0 - 80.247.147.255 tz +80.247.148.0 - 80.247.159.255 a2 80.247.160.0 - 80.247.175.255 nl 80.247.176.0 - 80.247.191.255 ru 80.247.192.0 - 80.247.223.255 nl @@ -39576,30 +20819,11 @@ 80.248.144.0 - 80.248.159.255 ru 80.248.160.0 - 80.248.175.255 fi 80.248.176.0 - 80.248.191.255 gb -80.248.192.0 - 80.248.207.255 li +80.248.192.0 - 80.248.192.255 ch +80.248.193.0 - 80.248.207.255 li 80.248.208.0 - 80.248.223.255 fr -80.248.224.0 - 80.248.224.137 se -80.248.224.138 - 80.248.224.139 ru -80.248.224.140 - 80.248.224.141 ro -80.248.224.142 - 80.248.224.143 pl -80.248.224.144 - 80.248.224.145 hu -80.248.224.146 - 80.248.224.147 bg -80.248.224.148 - 80.248.224.149 es -80.248.224.150 - 80.248.224.159 se -80.248.224.160 - 80.248.224.175 us -80.248.224.176 - 80.248.225.191 fr -80.248.225.192 - 80.248.226.127 se -80.248.226.128 - 80.248.226.159 gb -80.248.226.160 - 80.248.226.175 us -80.248.226.176 - 80.248.226.191 fr -80.248.226.192 - 80.248.227.127 se -80.248.227.128 - 80.248.227.159 gb -80.248.227.160 - 80.248.227.175 us -80.248.227.176 - 80.248.227.191 fr -80.248.227.192 - 80.248.239.255 se -80.248.240.0 - 80.248.248.127 fi -80.248.248.128 - 80.248.248.191 ax -80.248.248.192 - 80.248.255.255 fi +80.248.224.0 - 80.248.239.255 se +80.248.240.0 - 80.248.255.255 fi 80.249.0.0 - 80.249.15.255 pl 80.249.16.0 - 80.249.31.255 kz 80.249.32.0 - 80.249.47.255 it @@ -39607,15 +20831,13 @@ 80.249.64.0 - 80.249.79.255 dz 80.249.80.0 - 80.249.95.255 by 80.249.96.0 - 80.249.111.255 gb -80.249.112.0 - 80.249.127.255 de 80.249.128.0 - 80.249.159.255 ru 80.249.160.0 - 80.249.175.255 hu 80.249.176.0 - 80.249.207.255 ru -80.249.208.0 - 80.249.223.255 jo +80.249.208.0 - 80.249.215.255 nl +80.249.216.0 - 80.249.223.255 gb 80.249.224.0 - 80.249.239.255 ua -80.249.240.0 - 80.249.249.15 ie -80.249.249.16 - 80.249.249.31 gb -80.249.249.32 - 80.249.255.255 ie +80.249.240.0 - 80.249.255.255 ie 80.250.0.0 - 80.250.31.255 cz 80.250.32.0 - 80.250.47.255 ng 80.250.48.0 - 80.250.63.255 lv @@ -39624,73 +20846,35 @@ 80.250.112.0 - 80.250.127.255 ee 80.250.128.0 - 80.250.143.255 de 80.250.144.0 - 80.250.159.255 il -80.250.160.0 - 80.250.239.255 ru +80.250.160.0 - 80.250.191.255 ru +80.250.192.0 - 80.250.207.255 ir +80.250.208.0 - 80.250.239.255 ru 80.250.240.0 - 80.250.255.255 sk 80.251.0.0 - 80.251.15.255 a2 -80.251.16.0 - 80.251.23.255 us -80.251.24.0 - 80.251.31.255 gb +80.251.16.0 - 80.251.31.255 gb 80.251.32.0 - 80.251.47.255 tr 80.251.48.0 - 80.251.63.255 ru 80.251.64.0 - 80.251.79.255 es 80.251.80.0 - 80.251.95.255 de 80.251.96.0 - 80.251.111.255 fr 80.251.112.0 - 80.251.159.255 ru -80.251.160.0 - 80.251.161.35 pt -80.251.161.36 - 80.251.161.39 gb -80.251.161.40 - 80.251.161.87 pt -80.251.161.88 - 80.251.161.95 gb -80.251.161.96 - 80.251.161.239 pt -80.251.161.240 - 80.251.161.247 es -80.251.161.248 - 80.251.161.255 pt -80.251.162.0 - 80.251.162.31 gb -80.251.162.32 - 80.251.162.71 pt -80.251.162.72 - 80.251.162.79 gb -80.251.162.80 - 80.251.162.175 pt -80.251.162.176 - 80.251.162.191 es -80.251.162.192 - 80.251.162.207 gb -80.251.162.208 - 80.251.163.255 pt -80.251.164.0 - 80.251.164.7 gb -80.251.164.8 - 80.251.164.127 pt -80.251.164.128 - 80.251.164.159 es -80.251.164.160 - 80.251.166.39 pt -80.251.166.40 - 80.251.166.47 gb -80.251.166.48 - 80.251.166.151 pt -80.251.166.152 - 80.251.166.159 gb -80.251.166.160 - 80.251.166.231 pt -80.251.166.232 - 80.251.166.239 gb -80.251.166.240 - 80.251.167.255 pt -80.251.168.0 - 80.251.168.31 gb -80.251.168.32 - 80.251.168.151 pt -80.251.168.152 - 80.251.168.159 gb -80.251.168.160 - 80.251.168.191 pt -80.251.168.192 - 80.251.168.199 gb -80.251.168.200 - 80.251.169.103 pt -80.251.169.104 - 80.251.169.111 gb -80.251.169.112 - 80.251.172.95 pt +80.251.160.0 - 80.251.161.127 gb +80.251.161.128 - 80.251.161.135 pt +80.251.161.136 - 80.251.162.159 gb +80.251.162.160 - 80.251.162.167 pt +80.251.162.168 - 80.251.163.79 gb +80.251.163.80 - 80.251.163.87 pt +80.251.163.88 - 80.251.172.95 gb 80.251.172.96 - 80.251.172.103 fr -80.251.172.104 - 80.251.172.199 pt -80.251.172.200 - 80.251.172.207 es -80.251.172.208 - 80.251.174.55 pt -80.251.174.56 - 80.251.174.63 gb -80.251.174.64 - 80.251.174.71 pt -80.251.174.72 - 80.251.174.79 gb -80.251.174.80 - 80.251.175.223 pt -80.251.175.224 - 80.251.175.239 es -80.251.175.240 - 80.251.175.255 pt -80.251.176.0 - 80.251.176.31 gb -80.251.176.32 - 80.251.176.95 pt -80.251.176.96 - 80.251.176.111 gb -80.251.176.112 - 80.251.178.95 pt -80.251.178.96 - 80.251.178.127 gb -80.251.178.128 - 80.251.179.47 pt -80.251.179.48 - 80.251.179.63 gb -80.251.179.64 - 80.251.182.127 pt -80.251.182.128 - 80.251.182.159 us -80.251.182.160 - 80.251.182.191 gb -80.251.182.192 - 80.251.182.255 pt -80.251.183.0 - 80.251.191.255 gb -80.251.192.0 - 80.251.196.255 se -80.251.197.0 - 80.251.198.255 dk +80.251.172.104 - 80.251.172.127 gb +80.251.172.128 - 80.251.172.143 pt +80.251.172.144 - 80.251.172.153 gb +80.251.172.154 - 80.251.172.154 pt +80.251.172.155 - 80.251.176.63 gb +80.251.176.64 - 80.251.176.71 pt +80.251.176.72 - 80.251.191.255 gb +80.251.192.0 - 80.251.195.255 se +80.251.196.0 - 80.251.198.255 dk 80.251.199.0 - 80.251.204.255 se 80.251.205.0 - 80.251.207.255 dk 80.251.208.0 - 80.251.239.255 ru @@ -39704,64 +20888,7 @@ 80.252.96.0 - 80.252.111.255 de 80.252.112.0 - 80.252.127.255 gb 80.252.128.0 - 80.252.159.255 ru -80.252.160.0 - 80.252.161.71 se -80.252.161.72 - 80.252.161.75 de -80.252.161.76 - 80.252.162.179 se -80.252.162.180 - 80.252.162.183 no -80.252.162.184 - 80.252.163.43 se -80.252.163.44 - 80.252.163.47 an -80.252.163.48 - 80.252.164.7 se -80.252.164.8 - 80.252.164.11 nl -80.252.164.12 - 80.252.165.123 se -80.252.165.124 - 80.252.165.127 nl -80.252.165.128 - 80.252.165.135 se -80.252.165.136 - 80.252.165.139 us -80.252.165.140 - 80.252.166.127 se -80.252.166.128 - 80.252.166.131 nl -80.252.166.132 - 80.252.167.35 se -80.252.167.36 - 80.252.167.39 nl -80.252.167.40 - 80.252.167.215 se -80.252.167.216 - 80.252.167.219 de -80.252.167.220 - 80.252.168.131 se -80.252.168.132 - 80.252.168.135 nl -80.252.168.136 - 80.252.169.95 se -80.252.169.96 - 80.252.169.99 fr -80.252.169.100 - 80.252.169.127 se -80.252.169.128 - 80.252.169.135 fr -80.252.169.136 - 80.252.170.199 se -80.252.170.200 - 80.252.170.203 us -80.252.170.204 - 80.252.174.31 se -80.252.174.32 - 80.252.174.47 nl -80.252.174.48 - 80.252.175.231 se -80.252.175.232 - 80.252.175.235 nl -80.252.175.236 - 80.252.178.183 se -80.252.178.184 - 80.252.178.191 fr -80.252.178.192 - 80.252.179.127 se -80.252.179.128 - 80.252.179.131 fr -80.252.179.132 - 80.252.179.255 se -80.252.180.0 - 80.252.180.15 nl -80.252.180.16 - 80.252.180.255 se -80.252.181.0 - 80.252.181.3 de -80.252.181.4 - 80.252.182.191 se -80.252.182.192 - 80.252.182.207 nl -80.252.182.208 - 80.252.184.47 se -80.252.184.48 - 80.252.184.63 fr -80.252.184.64 - 80.252.186.131 se -80.252.186.132 - 80.252.186.135 my -80.252.186.136 - 80.252.186.191 se -80.252.186.192 - 80.252.186.207 fr -80.252.186.208 - 80.252.187.111 se -80.252.187.112 - 80.252.187.127 gb -80.252.187.128 - 80.252.188.191 se -80.252.188.192 - 80.252.188.195 pl -80.252.188.196 - 80.252.188.199 bg -80.252.188.200 - 80.252.188.203 br -80.252.188.204 - 80.252.188.207 tr -80.252.188.208 - 80.252.189.147 se -80.252.189.148 - 80.252.189.151 nl -80.252.189.152 - 80.252.189.191 se -80.252.189.192 - 80.252.189.207 dk -80.252.189.208 - 80.252.191.255 se +80.252.160.0 - 80.252.191.255 se 80.252.192.0 - 80.252.207.255 it 80.252.208.0 - 80.252.223.255 se 80.252.224.0 - 80.252.239.255 it @@ -39771,20 +20898,13 @@ 80.253.48.0 - 80.253.63.255 bg 80.253.64.0 - 80.253.79.255 es 80.253.80.0 - 80.253.95.255 ch -80.253.96.0 - 80.253.102.15 gb -80.253.102.16 - 80.253.102.39 nl -80.253.102.40 - 80.253.102.63 de -80.253.102.64 - 80.253.105.63 gb -80.253.105.64 - 80.253.105.95 nl -80.253.105.96 - 80.253.105.127 de -80.253.105.128 - 80.253.106.63 gb -80.253.106.64 - 80.253.106.127 nl -80.253.106.128 - 80.253.111.255 gb -80.253.112.0 - 80.253.113.255 nl -80.253.114.0 - 80.253.127.255 gb +80.253.96.0 - 80.253.102.39 gb +80.253.102.40 - 80.253.102.47 de +80.253.102.48 - 80.253.114.255 gb +80.253.115.0 - 80.253.115.255 ie +80.253.116.0 - 80.253.127.255 gb 80.253.128.0 - 80.253.159.255 ir -80.253.160.0 - 80.253.161.255 de -80.253.162.0 - 80.253.175.255 hr +80.253.160.0 - 80.253.175.255 hr 80.253.176.0 - 80.253.191.255 hu 80.253.192.0 - 80.253.207.255 es 80.253.208.0 - 80.253.223.255 de @@ -39794,292 +20914,111 @@ 80.254.16.0 - 80.254.31.255 ru 80.254.32.0 - 80.254.47.255 no 80.254.48.0 - 80.254.63.255 ru -80.254.64.0 - 80.254.79.255 ch +80.254.64.0 - 80.254.73.255 ch +80.254.74.0 - 80.254.75.255 a1 +80.254.76.0 - 80.254.79.255 ch 80.254.80.0 - 80.254.95.255 mt 80.254.96.0 - 80.254.127.255 ru 80.254.128.0 - 80.254.143.255 de -80.254.144.0 - 80.254.147.255 gb -80.254.148.0 - 80.254.149.255 de +80.254.144.0 - 80.254.146.35 gb +80.254.146.36 - 80.254.146.36 eu +80.254.146.37 - 80.254.147.255 gb +80.254.148.0 - 80.254.148.49 eu +80.254.148.50 - 80.254.148.51 de +80.254.148.52 - 80.254.148.137 eu +80.254.148.138 - 80.254.148.138 de +80.254.148.139 - 80.254.148.161 eu +80.254.148.162 - 80.254.148.162 de +80.254.148.163 - 80.254.148.255 eu +80.254.149.0 - 80.254.149.255 de 80.254.150.0 - 80.254.151.255 fr 80.254.152.0 - 80.254.153.255 us -80.254.154.0 - 80.254.154.255 dk -80.254.155.0 - 80.254.155.255 ch -80.254.156.0 - 80.254.157.255 us -80.254.158.0 - 80.254.159.255 gb -80.254.160.0 - 80.254.160.15 ch -80.254.160.16 - 80.254.160.23 in -80.254.160.24 - 80.254.160.151 ch -80.254.160.152 - 80.254.160.159 li -80.254.160.160 - 80.254.191.255 ch +80.254.154.0 - 80.254.154.63 dk +80.254.154.64 - 80.254.154.66 eu +80.254.154.67 - 80.254.154.67 dk +80.254.154.68 - 80.254.155.255 eu +80.254.156.0 - 80.254.156.255 us +80.254.157.0 - 80.254.159.255 gb +80.254.160.0 - 80.254.191.255 ch 80.254.192.0 - 80.254.207.255 it 80.254.208.0 - 80.254.223.255 lv -80.254.224.0 - 80.254.239.255 gb 80.254.240.0 - 80.254.255.255 se -80.255.0.0 - 80.255.2.127 de -80.255.2.128 - 80.255.2.159 in -80.255.2.160 - 80.255.6.95 de -80.255.6.96 - 80.255.6.127 it -80.255.6.128 - 80.255.7.191 de -80.255.7.192 - 80.255.7.223 gb -80.255.7.224 - 80.255.7.255 it -80.255.8.0 - 80.255.10.127 de -80.255.10.128 - 80.255.10.191 it -80.255.10.192 - 80.255.12.159 de -80.255.12.160 - 80.255.12.191 it -80.255.12.192 - 80.255.15.255 de +80.255.0.0 - 80.255.6.255 de +80.255.7.0 - 80.255.7.127 a1 +80.255.7.128 - 80.255.15.255 de 80.255.16.0 - 80.255.31.255 ru -80.255.32.0 - 80.255.35.255 a2 -80.255.36.0 - 80.255.36.63 ca -80.255.36.64 - 80.255.36.159 a2 -80.255.36.160 - 80.255.36.175 dk -80.255.36.176 - 80.255.38.128 a2 -80.255.38.129 - 80.255.38.255 cg -80.255.39.0 - 80.255.39.31 a2 -80.255.39.32 - 80.255.39.47 us -80.255.39.48 - 80.255.39.135 a2 -80.255.39.136 - 80.255.39.143 cd -80.255.39.144 - 80.255.39.151 a2 -80.255.39.152 - 80.255.39.159 cd -80.255.39.160 - 80.255.39.167 a2 -80.255.39.168 - 80.255.39.175 za -80.255.39.176 - 80.255.39.183 a2 -80.255.39.184 - 80.255.39.191 ng -80.255.39.192 - 80.255.39.255 a2 -80.255.40.0 - 80.255.40.7 ug -80.255.40.8 - 80.255.40.15 la -80.255.40.16 - 80.255.40.39 us -80.255.40.40 - 80.255.40.47 lk -80.255.40.48 - 80.255.40.63 a2 -80.255.40.64 - 80.255.40.95 pk -80.255.40.96 - 80.255.40.103 ng -80.255.40.104 - 80.255.40.111 ae -80.255.40.112 - 80.255.40.127 ng -80.255.40.128 - 80.255.40.135 cd -80.255.40.136 - 80.255.40.143 ng -80.255.40.144 - 80.255.40.159 mr -80.255.40.160 - 80.255.40.175 us -80.255.40.176 - 80.255.40.183 cd -80.255.40.184 - 80.255.40.191 ug -80.255.40.192 - 80.255.40.207 a2 -80.255.40.208 - 80.255.40.215 de -80.255.40.216 - 80.255.40.223 cd -80.255.40.224 - 80.255.40.239 a2 -80.255.40.240 - 80.255.40.255 ng -80.255.41.0 - 80.255.41.7 a2 -80.255.41.8 - 80.255.41.15 us -80.255.41.16 - 80.255.41.23 sv -80.255.41.24 - 80.255.41.143 a2 -80.255.41.144 - 80.255.41.151 lk -80.255.41.152 - 80.255.41.159 a2 -80.255.41.160 - 80.255.41.175 ng -80.255.41.176 - 80.255.41.191 np -80.255.41.192 - 80.255.43.15 a2 -80.255.43.16 - 80.255.43.23 ky -80.255.43.24 - 80.255.46.31 a2 -80.255.46.32 - 80.255.46.47 bi -80.255.46.48 - 80.255.46.223 a2 -80.255.46.224 - 80.255.46.239 sl -80.255.46.240 - 80.255.50.47 a2 -80.255.50.48 - 80.255.50.55 cd -80.255.50.56 - 80.255.50.175 a2 -80.255.50.176 - 80.255.50.191 ng -80.255.50.192 - 80.255.50.239 a2 -80.255.50.240 - 80.255.51.23 ng -80.255.51.24 - 80.255.51.47 a2 -80.255.51.48 - 80.255.51.63 tz -80.255.51.64 - 80.255.51.71 ng -80.255.51.72 - 80.255.51.87 mg -80.255.51.88 - 80.255.51.127 ng -80.255.51.128 - 80.255.51.135 a2 -80.255.51.136 - 80.255.51.151 ng -80.255.51.152 - 80.255.51.159 au -80.255.51.160 - 80.255.51.191 a2 -80.255.51.192 - 80.255.51.199 us -80.255.51.200 - 80.255.51.217 ng -80.255.51.218 - 80.255.51.247 a2 -80.255.51.248 - 80.255.51.255 za -80.255.52.0 - 80.255.57.63 a2 -80.255.57.64 - 80.255.57.71 gb -80.255.57.72 - 80.255.57.255 a2 -80.255.58.0 - 80.255.58.143 ng -80.255.58.144 - 80.255.58.159 a2 -80.255.58.160 - 80.255.58.175 ca -80.255.58.176 - 80.255.58.191 ng -80.255.58.192 - 80.255.58.224 za -80.255.58.225 - 80.255.59.7 a2 -80.255.59.8 - 80.255.59.31 us -80.255.59.32 - 80.255.59.39 a2 -80.255.59.40 - 80.255.59.55 us -80.255.59.56 - 80.255.59.63 a2 -80.255.59.64 - 80.255.59.71 us -80.255.59.72 - 80.255.59.79 a2 -80.255.59.80 - 80.255.59.87 ng -80.255.59.88 - 80.255.59.103 a2 -80.255.59.104 - 80.255.59.111 us -80.255.59.112 - 80.255.59.127 a2 -80.255.59.128 - 80.255.59.135 ng -80.255.59.136 - 80.255.59.191 us -80.255.59.192 - 80.255.59.231 a2 -80.255.59.232 - 80.255.59.247 ng -80.255.59.248 - 80.255.60.231 a2 -80.255.60.232 - 80.255.60.239 il -80.255.60.240 - 80.255.60.255 a2 -80.255.61.0 - 80.255.61.125 ng -80.255.61.126 - 80.255.61.127 a2 -80.255.61.128 - 80.255.61.143 mu -80.255.61.144 - 80.255.61.159 kn -80.255.61.160 - 80.255.61.191 za -80.255.61.192 - 80.255.61.255 ng -80.255.62.0 - 80.255.63.7 a2 -80.255.63.8 - 80.255.63.15 gh -80.255.63.16 - 80.255.63.23 a2 -80.255.63.24 - 80.255.63.31 tz -80.255.63.32 - 80.255.63.39 gy -80.255.63.40 - 80.255.63.63 a2 -80.255.63.64 - 80.255.63.71 mg -80.255.63.72 - 80.255.63.79 a2 -80.255.63.80 - 80.255.63.95 cd -80.255.63.96 - 80.255.63.127 gh -80.255.63.128 - 80.255.63.135 us -80.255.63.136 - 80.255.63.143 a2 -80.255.63.144 - 80.255.63.159 gn -80.255.63.160 - 80.255.63.191 us -80.255.63.192 - 80.255.63.207 a2 -80.255.63.208 - 80.255.63.215 lr -80.255.63.216 - 80.255.63.223 a2 -80.255.63.224 - 80.255.63.239 us -80.255.63.240 - 80.255.63.255 a2 +80.255.32.0 - 80.255.41.255 a2 +80.255.42.0 - 80.255.42.255 us +80.255.43.0 - 80.255.43.255 ke +80.255.44.0 - 80.255.63.255 a2 80.255.64.0 - 80.255.79.255 ua 80.255.80.0 - 80.255.95.255 ru 80.255.96.0 - 80.255.111.255 ch 80.255.112.0 - 80.255.127.255 es 80.255.128.0 - 80.255.159.255 ru -80.255.160.0 - 80.255.175.255 lu +80.255.160.0 - 80.255.163.12 lu +80.255.163.13 - 80.255.163.13 eu +80.255.163.14 - 80.255.175.255 lu 80.255.176.0 - 80.255.191.255 ru 80.255.192.0 - 80.255.223.255 gb 80.255.224.0 - 80.255.239.255 lv 80.255.240.0 - 80.255.255.255 nl 81.0.0.0 - 81.0.63.255 es -81.0.64.0 - 81.0.115.255 hu -81.0.116.0 - 81.0.117.255 sk -81.0.118.0 - 81.0.123.255 hu -81.0.124.0 - 81.0.124.255 sk -81.0.125.0 - 81.0.127.255 hu +81.0.64.0 - 81.0.127.255 hu 81.0.128.0 - 81.0.191.255 no 81.0.192.0 - 81.0.255.255 cz 81.1.0.0 - 81.1.63.255 fr 81.1.64.0 - 81.1.127.255 gb 81.1.128.0 - 81.2.63.255 ru 81.2.64.0 - 81.2.127.255 gb -81.2.128.0 - 81.2.128.255 de -81.2.129.0 - 81.2.129.127 nl -81.2.129.128 - 81.2.129.223 de -81.2.129.224 - 81.2.129.239 nl -81.2.129.240 - 81.2.135.255 de +81.2.128.0 - 81.2.129.63 de +81.2.129.64 - 81.2.129.127 gr +81.2.129.128 - 81.2.129.255 de +81.2.130.0 - 81.2.130.255 it +81.2.131.0 - 81.2.131.95 de +81.2.131.96 - 81.2.131.127 nl +81.2.131.128 - 81.2.131.255 de +81.2.132.0 - 81.2.135.255 nl 81.2.136.0 - 81.2.139.255 dk -81.2.140.0 - 81.2.148.127 de -81.2.148.128 - 81.2.148.255 se -81.2.149.0 - 81.2.186.127 de -81.2.186.128 - 81.2.186.255 at -81.2.187.0 - 81.2.190.95 de -81.2.190.96 - 81.2.190.111 nl -81.2.190.112 - 81.2.191.255 de -81.2.192.0 - 81.2.251.255 cz -81.2.252.0 - 81.2.253.255 hu -81.2.254.0 - 81.2.255.255 cz -81.3.0.0 - 81.3.27.191 de -81.3.27.192 - 81.3.27.199 ch -81.3.27.200 - 81.3.58.223 de -81.3.58.224 - 81.3.58.239 hk -81.3.58.240 - 81.3.63.255 de -81.3.64.0 - 81.3.127.255 gb +81.2.140.0 - 81.2.143.255 es +81.2.144.0 - 81.2.149.255 de +81.2.150.0 - 81.2.151.255 es +81.2.152.0 - 81.2.191.255 de +81.2.192.0 - 81.2.243.184 cz +81.2.243.185 - 81.2.243.185 pt +81.2.243.186 - 81.2.255.255 cz +81.3.0.0 - 81.3.63.255 de +81.3.64.0 - 81.3.81.255 gb +81.3.82.0 - 81.3.82.255 eu +81.3.83.0 - 81.3.127.255 gb 81.3.128.0 - 81.3.191.255 ru 81.3.192.0 - 81.3.255.255 at -81.4.0.0 - 81.4.63.255 eg +81.4.0.0 - 81.4.63.255 za 81.4.64.0 - 81.4.127.255 nl -81.4.128.0 - 81.4.172.63 cy -81.4.172.64 - 81.4.172.79 a2 -81.4.172.80 - 81.4.183.255 cy -81.4.184.0 - 81.4.184.255 lb -81.4.185.0 - 81.4.191.255 cy +81.4.128.0 - 81.4.191.255 cy 81.4.192.0 - 81.4.255.255 ru 81.5.0.0 - 81.5.63.255 il 81.5.64.0 - 81.5.127.255 ru 81.5.128.0 - 81.5.191.255 gb 81.5.192.0 - 81.5.255.255 at -81.6.0.0 - 81.6.6.103 ch -81.6.6.104 - 81.6.6.111 lb -81.6.6.112 - 81.6.63.255 ch +81.6.0.0 - 81.6.63.255 ch 81.6.64.0 - 81.6.127.255 tr 81.6.128.0 - 81.6.191.255 pl 81.6.192.0 - 81.6.255.255 gb -81.7.0.0 - 81.7.0.255 de -81.7.1.0 - 81.7.1.255 fr -81.7.2.0 - 81.7.63.255 de +81.7.0.0 - 81.7.63.255 de 81.7.64.0 - 81.7.127.255 lt -81.7.128.0 - 81.7.150.79 dk -81.7.150.80 - 81.7.150.83 us -81.7.150.84 - 81.7.191.255 dk +81.7.128.0 - 81.7.191.255 dk 81.7.192.0 - 81.7.209.255 de -81.7.210.0 - 81.7.210.7 us -81.7.210.8 - 81.7.210.55 de -81.7.210.56 - 81.7.210.71 us -81.7.210.72 - 81.7.210.79 de -81.7.210.80 - 81.7.210.87 us -81.7.210.88 - 81.7.210.95 br -81.7.210.96 - 81.7.210.127 us -81.7.210.128 - 81.7.210.135 mx -81.7.210.136 - 81.7.210.207 us -81.7.210.208 - 81.7.210.215 de -81.7.210.216 - 81.7.210.223 us -81.7.210.224 - 81.7.210.231 de -81.7.210.232 - 81.7.210.247 us -81.7.210.248 - 81.7.210.255 mx -81.7.211.0 - 81.7.211.191 us -81.7.211.192 - 81.7.211.223 ca -81.7.211.224 - 81.7.211.231 de -81.7.211.232 - 81.7.212.127 us -81.7.212.128 - 81.7.212.255 de -81.7.213.0 - 81.7.213.79 us -81.7.213.80 - 81.7.213.127 de -81.7.213.128 - 81.7.214.31 us -81.7.214.32 - 81.7.216.31 de -81.7.216.32 - 81.7.216.39 sg -81.7.216.40 - 81.7.216.95 de -81.7.216.96 - 81.7.216.111 sg -81.7.216.112 - 81.7.216.127 jp -81.7.216.128 - 81.7.216.151 sg -81.7.216.152 - 81.7.216.167 de -81.7.216.168 - 81.7.216.207 sg -81.7.216.208 - 81.7.216.215 au -81.7.216.216 - 81.7.217.63 de -81.7.217.64 - 81.7.217.79 sg -81.7.217.80 - 81.7.217.127 de -81.7.217.128 - 81.7.217.255 sg -81.7.218.0 - 81.7.218.255 de -81.7.219.0 - 81.7.219.255 sg -81.7.220.0 - 81.7.221.119 de -81.7.221.120 - 81.7.221.159 at -81.7.221.160 - 81.7.223.255 de +81.7.210.0 - 81.7.210.255 us +81.7.211.0 - 81.7.216.63 de +81.7.216.64 - 81.7.216.79 sg +81.7.216.80 - 81.7.223.255 de 81.7.224.0 - 81.7.255.255 ch 81.8.0.0 - 81.8.127.255 tr 81.8.128.0 - 81.8.255.255 se -81.9.0.0 - 81.9.11.255 ru -81.9.12.0 - 81.9.13.255 us -81.9.14.0 - 81.9.14.255 ru -81.9.15.0 - 81.9.15.255 us -81.9.16.0 - 81.9.31.255 ru -81.9.32.0 - 81.9.32.255 us -81.9.33.0 - 81.9.36.63 ru -81.9.36.64 - 81.9.36.95 us -81.9.36.96 - 81.9.127.255 ru +81.9.0.0 - 81.9.127.255 ru 81.9.128.0 - 81.9.255.255 es -81.10.0.0 - 81.10.80.255 eg -81.10.81.0 - 81.10.83.255 jo -81.10.84.0 - 81.10.115.255 eg -81.10.116.0 - 81.10.119.255 jo -81.10.120.0 - 81.10.122.255 eg -81.10.123.0 - 81.10.127.255 jo +81.10.0.0 - 81.10.127.255 eg 81.10.128.0 - 81.10.255.255 at 81.11.0.0 - 81.11.127.255 de 81.11.128.0 - 81.11.255.255 be @@ -40092,31 +21031,15 @@ 81.15.0.0 - 81.15.127.255 is 81.15.128.0 - 81.15.255.255 pl 81.16.0.0 - 81.16.15.255 am -81.16.16.0 - 81.16.31.255 gb 81.16.32.0 - 81.16.47.255 at 81.16.48.0 - 81.16.63.255 de 81.16.64.0 - 81.16.79.255 fi 81.16.80.0 - 81.16.95.255 ru 81.16.96.0 - 81.16.111.255 at -81.16.112.0 - 81.16.143.255 ru -81.16.144.0 - 81.16.149.223 at -81.16.149.224 - 81.16.149.231 cz -81.16.149.232 - 81.16.158.151 at -81.16.158.152 - 81.16.158.159 cz -81.16.158.160 - 81.16.159.255 at +81.16.112.0 - 81.16.127.255 ru +81.16.144.0 - 81.16.159.255 at 81.16.160.0 - 81.16.175.255 se -81.16.176.0 - 81.16.180.15 de -81.16.180.16 - 81.16.180.31 gb -81.16.180.32 - 81.16.180.47 de -81.16.180.48 - 81.16.180.55 se -81.16.180.56 - 81.16.180.63 it -81.16.180.64 - 81.16.180.71 es -81.16.180.72 - 81.16.180.79 jp -81.16.180.80 - 81.16.180.87 us -81.16.180.88 - 81.16.180.95 gb -81.16.180.96 - 81.16.187.15 de -81.16.187.16 - 81.16.187.31 us -81.16.187.32 - 81.16.191.255 de +81.16.176.0 - 81.16.191.255 de 81.16.192.0 - 81.16.207.255 hu 81.16.208.0 - 81.16.223.255 sa 81.16.224.0 - 81.16.239.255 lt @@ -40133,23 +21056,14 @@ 81.17.176.0 - 81.17.191.255 hu 81.17.192.0 - 81.17.207.255 fi 81.17.208.0 - 81.17.223.255 de -81.17.224.0 - 81.17.227.255 si -81.17.228.0 - 81.17.229.255 hr +81.17.224.0 - 81.17.229.255 si 81.17.230.0 - 81.17.231.255 rs 81.17.232.0 - 81.17.233.255 mk -81.17.234.0 - 81.17.235.255 si -81.17.236.0 - 81.17.239.255 ba -81.17.240.0 - 81.17.242.15 ie -81.17.242.16 - 81.17.242.23 gb -81.17.242.24 - 81.17.242.255 ie -81.17.243.0 - 81.17.243.63 gb -81.17.243.64 - 81.17.245.192 ie -81.17.245.193 - 81.17.245.255 gb -81.17.246.0 - 81.17.247.63 ie -81.17.247.64 - 81.17.247.79 us -81.17.247.80 - 81.17.247.95 au -81.17.247.96 - 81.17.247.111 gb -81.17.247.112 - 81.17.255.255 ie +81.17.234.0 - 81.17.234.255 me +81.17.235.0 - 81.17.235.255 si +81.17.236.0 - 81.17.237.255 ba +81.17.238.0 - 81.17.239.255 si +81.17.240.0 - 81.17.255.255 ie 81.18.0.0 - 81.18.15.255 nl 81.18.16.0 - 81.18.31.255 ch 81.18.32.0 - 81.18.47.255 kz @@ -40158,56 +21072,40 @@ 81.18.96.0 - 81.18.111.255 de 81.18.112.0 - 81.18.159.255 ru 81.18.160.0 - 81.18.175.255 nl -81.18.176.0 - 81.18.191.175 fr -81.18.191.176 - 81.18.191.191 be -81.18.191.192 - 81.18.191.255 fr +81.18.176.0 - 81.18.191.255 fr 81.18.192.0 - 81.18.223.255 pl 81.18.224.0 - 81.18.239.255 fo 81.18.240.0 - 81.18.255.255 nl 81.19.0.0 - 81.19.15.255 cz 81.19.16.0 - 81.19.31.255 fr -81.19.32.0 - 81.19.47.255 cz +81.19.32.0 - 81.19.43.255 cz +81.19.44.0 - 81.19.44.255 eu +81.19.45.0 - 81.19.47.255 cz 81.19.48.0 - 81.19.63.255 gb 81.19.64.0 - 81.19.95.255 ru -81.19.96.0 - 81.19.101.127 es -81.19.101.128 - 81.19.101.159 gb -81.19.101.160 - 81.19.111.255 es -81.19.112.0 - 81.19.124.191 fi -81.19.124.192 - 81.19.124.255 ax -81.19.125.0 - 81.19.127.255 fi +81.19.96.0 - 81.19.111.255 es +81.19.112.0 - 81.19.127.255 fi 81.19.128.0 - 81.19.143.255 ru -81.19.144.0 - 81.19.154.31 at -81.19.154.32 - 81.19.154.63 de -81.19.154.64 - 81.19.159.255 at -81.19.160.0 - 81.19.175.255 es -81.19.176.0 - 81.19.195.255 gb -81.19.196.0 - 81.19.196.255 ch -81.19.197.0 - 81.19.201.255 gb -81.19.202.0 - 81.19.202.255 de -81.19.203.0 - 81.19.205.255 gb -81.19.206.0 - 81.19.206.255 ch -81.19.207.0 - 81.19.223.255 gb -81.19.224.0 - 81.19.233.119 dk -81.19.233.120 - 81.19.233.123 us -81.19.233.124 - 81.19.255.255 dk -81.20.0.0 - 81.20.2.255 nl -81.20.3.0 - 81.20.6.255 gb -81.20.7.0 - 81.20.10.255 se -81.20.11.0 - 81.20.11.255 fr -81.20.12.0 - 81.20.15.255 gb +81.19.144.0 - 81.19.159.255 at +81.19.160.0 - 81.19.166.255 es +81.19.167.0 - 81.19.174.255 us +81.19.175.0 - 81.19.175.255 es +81.19.176.0 - 81.19.223.255 gb +81.19.224.0 - 81.19.255.255 dk +81.20.0.0 - 81.20.15.255 gb 81.20.16.0 - 81.20.31.255 kg 81.20.32.0 - 81.20.63.255 gb 81.20.64.0 - 81.20.64.127 nl 81.20.64.128 - 81.20.64.255 es 81.20.65.0 - 81.20.65.255 nl 81.20.66.0 - 81.20.66.127 es -81.20.66.128 - 81.20.68.127 nl -81.20.68.128 - 81.20.68.159 gb -81.20.68.160 - 81.20.77.255 nl -81.20.78.0 - 81.20.78.151 es -81.20.78.152 - 81.20.78.159 nl -81.20.78.160 - 81.20.78.191 es -81.20.78.192 - 81.20.79.255 nl +81.20.66.128 - 81.20.67.127 nl +81.20.67.128 - 81.20.67.255 de +81.20.68.0 - 81.20.75.255 nl +81.20.76.0 - 81.20.76.255 dk +81.20.77.0 - 81.20.77.255 nl +81.20.78.0 - 81.20.78.63 es +81.20.78.64 - 81.20.79.255 nl 81.20.80.0 - 81.20.95.255 de 81.20.96.0 - 81.20.111.255 ru 81.20.112.0 - 81.20.143.255 de @@ -40228,7 +21126,9 @@ 81.21.112.0 - 81.21.127.255 at 81.21.128.0 - 81.21.135.255 it 81.21.136.0 - 81.21.143.255 nl -81.21.144.0 - 81.21.159.255 ie +81.21.144.0 - 81.21.144.155 ie +81.21.144.156 - 81.21.144.156 de +81.21.144.157 - 81.21.159.255 ie 81.21.160.0 - 81.21.175.255 tr 81.21.176.0 - 81.21.191.255 nl 81.21.192.0 - 81.21.207.255 pl @@ -40237,11 +21137,7 @@ 81.21.240.0 - 81.21.255.255 ee 81.22.0.0 - 81.22.15.255 ru 81.22.16.0 - 81.22.31.255 bh -81.22.32.0 - 81.22.32.255 gb -81.22.33.0 - 81.22.33.255 de -81.22.34.0 - 81.22.34.255 fr -81.22.35.0 - 81.22.35.255 se -81.22.36.0 - 81.22.47.255 gb +81.22.32.0 - 81.22.47.255 gb 81.22.48.0 - 81.22.63.255 ru 81.22.64.0 - 81.22.95.255 dz 81.22.96.0 - 81.22.111.255 tr @@ -40279,45 +21175,34 @@ 81.24.192.0 - 81.24.207.255 gb 81.24.208.0 - 81.24.223.255 ua 81.24.224.0 - 81.24.239.255 it -81.24.240.0 - 81.24.255.255 gb +81.24.240.0 - 81.24.247.255 rs +81.24.248.0 - 81.24.255.255 ie 81.25.0.0 - 81.25.15.255 ru 81.25.16.0 - 81.25.31.255 cz 81.25.32.0 - 81.25.47.255 by -81.25.48.0 - 81.25.79.255 ru +81.25.48.0 - 81.25.63.255 ru 81.25.80.0 - 81.25.95.255 se 81.25.96.0 - 81.25.111.255 it 81.25.112.0 - 81.25.127.255 es -81.25.128.0 - 81.25.131.255 de -81.25.132.0 - 81.25.133.255 lb -81.25.134.0 - 81.25.134.255 a2 -81.25.135.0 - 81.25.135.64 iq -81.25.135.65 - 81.25.135.255 de -81.25.136.0 - 81.25.136.31 lb -81.25.136.32 - 81.25.136.255 de -81.25.137.0 - 81.25.137.127 iq -81.25.137.128 - 81.25.137.255 lu -81.25.138.0 - 81.25.138.255 a2 -81.25.139.0 - 81.25.139.255 lb -81.25.140.0 - 81.25.140.255 iq -81.25.141.0 - 81.25.141.63 tr -81.25.141.64 - 81.25.141.255 de -81.25.142.0 - 81.25.142.255 a2 -81.25.143.0 - 81.25.143.255 iq +81.25.128.0 - 81.25.143.255 de 81.25.144.0 - 81.25.159.255 se 81.25.160.0 - 81.25.175.255 ru 81.25.176.0 - 81.25.191.255 fo -81.25.192.0 - 81.25.206.79 fr -81.25.206.80 - 81.25.206.87 gb -81.25.206.88 - 81.25.207.255 fr +81.25.192.0 - 81.25.202.127 fr +81.25.202.128 - 81.25.202.255 it +81.25.203.0 - 81.25.206.255 fr +81.25.207.0 - 81.25.207.255 gb 81.25.208.0 - 81.25.223.255 at 81.25.224.0 - 81.25.239.255 ua 81.25.240.0 - 81.25.255.255 ee 81.26.0.0 - 81.26.31.255 pl 81.26.32.0 - 81.26.63.255 no -81.26.64.0 - 81.26.79.255 dz +81.26.64.0 - 81.26.71.255 dz +81.26.72.0 - 81.26.79.255 za 81.26.80.0 - 81.26.95.255 ru 81.26.96.0 - 81.26.127.255 gb -81.26.128.0 - 81.26.159.255 ru +81.26.128.0 - 81.26.157.255 ru +81.26.158.0 - 81.26.159.255 ro 81.26.160.0 - 81.26.175.255 de 81.26.176.0 - 81.26.191.255 ru 81.26.192.0 - 81.26.199.255 it @@ -40327,11 +21212,7 @@ 81.27.16.0 - 81.27.31.255 fr 81.27.32.0 - 81.27.47.255 no 81.27.48.0 - 81.27.63.255 ru -81.27.64.0 - 81.27.76.255 gb -81.27.77.0 - 81.27.77.255 fr -81.27.78.0 - 81.27.100.191 gb -81.27.100.192 - 81.27.100.223 im -81.27.100.224 - 81.27.111.255 gb +81.27.64.0 - 81.27.111.255 gb 81.27.112.0 - 81.27.127.255 de 81.27.128.0 - 81.27.143.255 it 81.27.144.0 - 81.27.159.255 ru @@ -40353,62 +21234,16 @@ 81.28.192.0 - 81.28.207.255 fr 81.28.208.0 - 81.28.223.255 ru 81.28.224.0 - 81.28.239.255 de -81.28.240.0 - 81.28.255.255 it -81.29.0.0 - 81.29.3.33 nl -81.29.3.34 - 81.29.3.43 mx -81.29.3.44 - 81.29.4.11 nl -81.29.4.12 - 81.29.4.15 au -81.29.4.16 - 81.29.4.45 nl -81.29.4.46 - 81.29.4.49 au -81.29.4.50 - 81.29.4.69 nl -81.29.4.70 - 81.29.4.80 mx -81.29.4.81 - 81.29.15.255 nl +81.29.0.0 - 81.29.15.255 nl 81.29.16.0 - 81.29.31.255 lt 81.29.32.0 - 81.29.47.255 no 81.29.48.0 - 81.29.95.255 gb 81.29.96.0 - 81.29.111.255 eg 81.29.112.0 - 81.29.127.255 ru -81.29.128.0 - 81.29.137.255 fi -81.29.138.0 - 81.29.138.255 ru -81.29.139.0 - 81.29.139.255 fi -81.29.140.0 - 81.29.141.255 ru -81.29.142.0 - 81.29.142.255 fi -81.29.143.0 - 81.29.143.255 ru -81.29.144.0 - 81.29.146.11 ch -81.29.146.12 - 81.29.146.15 it -81.29.146.16 - 81.29.146.71 ch -81.29.146.72 - 81.29.146.79 it -81.29.146.80 - 81.29.147.79 ch -81.29.147.80 - 81.29.147.95 it -81.29.147.96 - 81.29.147.119 ch -81.29.147.120 - 81.29.147.127 it -81.29.147.128 - 81.29.147.135 ch -81.29.147.136 - 81.29.147.143 mr -81.29.147.144 - 81.29.147.255 ch -81.29.148.0 - 81.29.148.255 it -81.29.149.0 - 81.29.149.7 ch -81.29.149.8 - 81.29.149.15 it -81.29.149.16 - 81.29.152.119 ch -81.29.152.120 - 81.29.152.123 it -81.29.152.124 - 81.29.152.127 ch -81.29.152.128 - 81.29.152.131 it -81.29.152.132 - 81.29.155.255 ch -81.29.156.0 - 81.29.156.7 it -81.29.156.8 - 81.29.159.255 ch +81.29.128.0 - 81.29.143.255 fi +81.29.144.0 - 81.29.159.255 ch 81.29.160.0 - 81.29.175.255 qa -81.29.176.0 - 81.29.195.79 it -81.29.195.80 - 81.29.195.95 gb -81.29.195.96 - 81.29.196.175 it -81.29.196.176 - 81.29.196.191 gb -81.29.196.192 - 81.29.201.191 it -81.29.201.192 - 81.29.201.223 gb -81.29.201.224 - 81.29.212.79 it -81.29.212.80 - 81.29.212.95 gb -81.29.212.96 - 81.29.216.159 it -81.29.216.160 - 81.29.216.175 gb -81.29.216.176 - 81.29.216.191 it -81.29.216.192 - 81.29.216.223 gb -81.29.216.224 - 81.29.239.255 it +81.29.176.0 - 81.29.239.255 it 81.29.240.0 - 81.29.255.255 ir 81.30.0.0 - 81.30.31.255 it 81.30.32.0 - 81.30.47.255 nl @@ -40422,13 +21257,27 @@ 81.30.160.0 - 81.30.175.255 ua 81.30.176.0 - 81.30.223.255 ru 81.30.224.0 - 81.30.255.255 cz -81.31.0.0 - 81.31.7.31 gb -81.31.7.32 - 81.31.7.79 sk -81.31.7.80 - 81.31.7.151 gb -81.31.7.152 - 81.31.7.159 sk -81.31.7.160 - 81.31.15.255 gb -81.31.16.0 - 81.31.16.255 cz -81.31.17.0 - 81.31.31.255 gb +81.31.0.0 - 81.31.0.157 gb +81.31.0.158 - 81.31.0.158 us +81.31.0.159 - 81.31.0.187 gb +81.31.0.188 - 81.31.0.188 us +81.31.0.189 - 81.31.0.244 gb +81.31.0.245 - 81.31.0.246 us +81.31.0.247 - 81.31.0.255 gb +81.31.1.0 - 81.31.1.31 us +81.31.1.32 - 81.31.1.63 gb +81.31.1.64 - 81.31.1.79 us +81.31.1.80 - 81.31.2.7 gb +81.31.2.8 - 81.31.2.11 us +81.31.2.12 - 81.31.2.131 gb +81.31.2.132 - 81.31.2.139 us +81.31.2.140 - 81.31.14.233 gb +81.31.14.234 - 81.31.14.234 fr +81.31.14.235 - 81.31.23.255 gb +81.31.24.0 - 81.31.24.255 de +81.31.25.0 - 81.31.27.71 gb +81.31.27.72 - 81.31.27.75 de +81.31.27.76 - 81.31.31.255 gb 81.31.32.0 - 81.31.47.255 cz 81.31.48.0 - 81.31.63.255 fi 81.31.64.0 - 81.31.79.255 gb @@ -40437,1009 +21286,67 @@ 81.31.128.0 - 81.31.143.255 at 81.31.144.0 - 81.31.159.255 it 81.31.160.0 - 81.31.191.255 ir -81.31.192.0 - 81.31.193.7 nl -81.31.193.8 - 81.31.193.15 it -81.31.193.16 - 81.31.193.23 iq -81.31.193.24 - 81.31.193.27 es -81.31.193.28 - 81.31.193.31 de -81.31.193.32 - 81.31.193.35 iq -81.31.193.36 - 81.31.193.39 nl -81.31.193.40 - 81.31.193.43 iq -81.31.193.44 - 81.31.193.47 de -81.31.193.48 - 81.31.193.55 es -81.31.193.56 - 81.31.193.63 de -81.31.193.64 - 81.31.193.67 it -81.31.193.68 - 81.31.193.79 iq -81.31.193.80 - 81.31.193.87 nl -81.31.193.88 - 81.31.193.95 it -81.31.193.96 - 81.31.193.99 gb -81.31.193.100 - 81.31.193.103 it -81.31.193.104 - 81.31.193.107 de 81.31.193.108 - 81.31.193.111 dz -81.31.193.112 - 81.31.193.115 it -81.31.193.116 - 81.31.193.135 iq -81.31.193.136 - 81.31.193.143 tr -81.31.193.144 - 81.31.193.151 iq -81.31.193.152 - 81.31.193.155 it -81.31.193.156 - 81.31.193.159 iq -81.31.193.160 - 81.31.193.163 ie -81.31.193.164 - 81.31.193.167 iq -81.31.193.168 - 81.31.193.171 gb -81.31.193.172 - 81.31.193.175 iq -81.31.193.176 - 81.31.193.183 nl -81.31.193.184 - 81.31.193.195 iq -81.31.193.196 - 81.31.193.203 gb -81.31.193.204 - 81.31.193.207 iq -81.31.193.208 - 81.31.193.215 nl -81.31.193.216 - 81.31.193.219 iq -81.31.193.220 - 81.31.193.223 it -81.31.193.224 - 81.31.193.231 iq -81.31.193.232 - 81.31.193.235 gb -81.31.193.236 - 81.31.193.239 iq -81.31.193.240 - 81.31.193.243 es -81.31.193.244 - 81.31.193.247 nl -81.31.193.248 - 81.31.193.255 iq -81.31.194.0 - 81.31.194.3 gb -81.31.194.4 - 81.31.194.7 pl -81.31.194.8 - 81.31.194.23 iq -81.31.194.24 - 81.31.194.31 tr -81.31.194.32 - 81.31.194.35 nl -81.31.194.36 - 81.31.194.39 ba -81.31.194.40 - 81.31.194.47 nl -81.31.194.48 - 81.31.194.55 de -81.31.194.56 - 81.31.194.63 be -81.31.194.64 - 81.31.194.71 es -81.31.194.72 - 81.31.194.75 gb -81.31.194.76 - 81.31.194.79 iq -81.31.194.80 - 81.31.194.87 es -81.31.194.88 - 81.31.194.95 be -81.31.194.96 - 81.31.194.99 gb -81.31.194.100 - 81.31.194.103 nl -81.31.194.104 - 81.31.194.123 iq -81.31.194.124 - 81.31.194.127 nl -81.31.194.128 - 81.31.194.131 kw -81.31.194.132 - 81.31.194.135 es -81.31.194.136 - 81.31.194.139 iq -81.31.194.140 - 81.31.194.143 it -81.31.194.144 - 81.31.194.147 ch -81.31.194.148 - 81.31.194.151 iq -81.31.194.152 - 81.31.194.155 de -81.31.194.156 - 81.31.194.159 tr -81.31.194.160 - 81.31.194.167 gb -81.31.194.168 - 81.31.194.183 iq -81.31.194.184 - 81.31.194.187 gb -81.31.194.188 - 81.31.194.191 ch -81.31.194.192 - 81.31.194.199 gb -81.31.194.200 - 81.31.194.203 nl -81.31.194.204 - 81.31.194.207 iq -81.31.194.208 - 81.31.194.219 de -81.31.194.220 - 81.31.194.223 ie -81.31.194.224 - 81.31.194.239 gb -81.31.194.240 - 81.31.194.243 iq -81.31.194.244 - 81.31.194.247 nl -81.31.194.248 - 81.31.194.255 iq -81.31.195.0 - 81.31.195.7 ie -81.31.195.8 - 81.31.195.11 it -81.31.195.12 - 81.31.195.23 iq -81.31.195.24 - 81.31.195.31 nl -81.31.195.32 - 81.31.195.39 de -81.31.195.40 - 81.31.195.47 be -81.31.195.48 - 81.31.195.55 fr -81.31.195.56 - 81.31.195.63 it -81.31.195.64 - 81.31.195.71 iq -81.31.195.72 - 81.31.195.79 no -81.31.195.80 - 81.31.195.87 ro -81.31.195.88 - 81.31.195.95 hu -81.31.195.96 - 81.31.195.103 cz -81.31.195.104 - 81.31.195.111 iq -81.31.195.112 - 81.31.195.119 tr -81.31.195.120 - 81.31.195.135 es -81.31.195.136 - 81.31.195.143 iq -81.31.195.144 - 81.31.195.159 gb -81.31.195.160 - 81.31.195.167 iq -81.31.195.168 - 81.31.195.175 tr -81.31.195.176 - 81.31.195.183 iq -81.31.195.184 - 81.31.195.191 de -81.31.195.192 - 81.31.195.207 iq -81.31.195.208 - 81.31.195.211 nl -81.31.195.212 - 81.31.195.215 it -81.31.195.216 - 81.31.195.219 tn -81.31.195.220 - 81.31.195.223 nl -81.31.195.224 - 81.31.195.227 gb -81.31.195.228 - 81.31.195.255 iq -81.31.196.0 - 81.31.196.7 it -81.31.196.8 - 81.31.196.11 iq -81.31.196.12 - 81.31.196.15 gb -81.31.196.16 - 81.31.196.19 es -81.31.196.20 - 81.31.196.23 nl -81.31.196.24 - 81.31.196.27 iq -81.31.196.28 - 81.31.196.31 dz -81.31.196.32 - 81.31.196.39 iq -81.31.196.40 - 81.31.196.43 dz -81.31.196.44 - 81.31.196.47 it -81.31.196.48 - 81.31.196.71 iq -81.31.196.72 - 81.31.196.79 dz -81.31.196.80 - 81.31.196.83 tr -81.31.196.84 - 81.31.196.87 gb -81.31.196.88 - 81.31.196.91 nl -81.31.196.92 - 81.31.196.95 gb -81.31.196.96 - 81.31.196.99 dz -81.31.196.100 - 81.31.196.115 iq -81.31.196.116 - 81.31.196.123 it -81.31.196.124 - 81.31.196.127 nl -81.31.196.128 - 81.31.196.131 us -81.31.196.132 - 81.31.196.135 es -81.31.196.136 - 81.31.196.143 gb -81.31.196.144 - 81.31.196.147 eg -81.31.196.148 - 81.31.196.171 iq -81.31.196.172 - 81.31.196.183 tr -81.31.196.184 - 81.31.196.187 gb -81.31.196.188 - 81.31.196.203 iq -81.31.196.204 - 81.31.196.207 gb -81.31.196.208 - 81.31.196.227 iq -81.31.196.228 - 81.31.196.231 it -81.31.196.232 - 81.31.196.235 gb -81.31.196.236 - 81.31.196.239 iq -81.31.196.240 - 81.31.196.243 it -81.31.196.244 - 81.31.196.247 iq -81.31.196.248 - 81.31.197.7 tr -81.31.197.8 - 81.31.197.15 gb -81.31.197.16 - 81.31.197.23 iq -81.31.197.24 - 81.31.197.31 nl -81.31.197.32 - 81.31.197.35 iq -81.31.197.36 - 81.31.197.39 it -81.31.197.40 - 81.31.197.51 iq -81.31.197.52 - 81.31.197.55 gi -81.31.197.56 - 81.31.197.63 iq -81.31.197.64 - 81.31.197.67 gi -81.31.197.68 - 81.31.197.71 nl -81.31.197.72 - 81.31.197.79 gb -81.31.197.80 - 81.31.197.87 iq -81.31.197.88 - 81.31.197.91 gr -81.31.197.92 - 81.31.197.95 gb -81.31.197.96 - 81.31.197.111 iq -81.31.197.112 - 81.31.197.119 nl -81.31.197.120 - 81.31.197.123 dz -81.31.197.124 - 81.31.197.127 ch -81.31.197.128 - 81.31.197.131 tr -81.31.197.132 - 81.31.197.135 nl -81.31.197.136 - 81.31.197.143 iq -81.31.197.144 - 81.31.197.151 nl -81.31.197.152 - 81.31.197.159 tr -81.31.197.160 - 81.31.197.167 iq -81.31.197.168 - 81.31.197.175 gb -81.31.197.176 - 81.31.197.183 iq -81.31.197.184 - 81.31.197.191 us -81.31.197.192 - 81.31.197.219 iq -81.31.197.220 - 81.31.197.223 kw -81.31.197.224 - 81.31.197.239 us -81.31.197.240 - 81.31.197.243 gb -81.31.197.244 - 81.31.197.247 iq -81.31.197.248 - 81.31.197.255 nl -81.31.198.0 - 81.31.198.23 iq -81.31.198.24 - 81.31.198.27 gb -81.31.198.28 - 81.31.198.31 dz -81.31.198.32 - 81.31.198.39 nl -81.31.198.40 - 81.31.198.47 iq -81.31.198.48 - 81.31.198.51 dz -81.31.198.52 - 81.31.198.55 iq -81.31.198.56 - 81.31.198.63 nl -81.31.198.64 - 81.31.198.67 iq -81.31.198.68 - 81.31.198.71 de -81.31.198.72 - 81.31.198.79 tr -81.31.198.80 - 81.31.198.87 us -81.31.198.88 - 81.31.198.91 gb -81.31.198.92 - 81.31.198.99 nl -81.31.198.100 - 81.31.198.119 iq -81.31.198.120 - 81.31.198.123 it -81.31.198.124 - 81.31.198.127 dz -81.31.198.128 - 81.31.198.135 tr -81.31.198.136 - 81.31.198.143 nl -81.31.198.144 - 81.31.198.191 iq -81.31.198.192 - 81.31.198.207 tr -81.31.198.208 - 81.31.199.11 iq -81.31.199.12 - 81.31.199.19 tr -81.31.199.20 - 81.31.199.23 hu -81.31.199.24 - 81.31.199.31 iq -81.31.199.32 - 81.31.199.35 af -81.31.199.36 - 81.31.199.39 iq -81.31.199.40 - 81.31.199.43 it -81.31.199.44 - 81.31.199.47 tr -81.31.199.48 - 81.31.199.55 nl -81.31.199.56 - 81.31.199.59 us -81.31.199.60 - 81.31.199.63 nl -81.31.199.64 - 81.31.199.67 us -81.31.199.68 - 81.31.199.71 iq -81.31.199.72 - 81.31.199.87 nl -81.31.199.88 - 81.31.199.95 iq -81.31.199.96 - 81.31.199.103 us -81.31.199.104 - 81.31.199.115 iq -81.31.199.116 - 81.31.199.119 tr -81.31.199.120 - 81.31.199.123 iq -81.31.199.124 - 81.31.199.127 gb -81.31.199.128 - 81.31.199.147 iq -81.31.199.148 - 81.31.199.151 fr -81.31.199.152 - 81.31.199.159 de -81.31.199.160 - 81.31.199.199 iq -81.31.199.200 - 81.31.199.207 nl -81.31.199.208 - 81.31.199.215 iq -81.31.199.216 - 81.31.199.223 nl -81.31.199.224 - 81.31.199.239 iq -81.31.199.240 - 81.31.199.255 dz -81.31.200.0 - 81.31.200.7 iq -81.31.200.8 - 81.31.200.15 gb -81.31.200.16 - 81.31.200.39 iq -81.31.200.40 - 81.31.200.47 nl -81.31.200.48 - 81.31.200.55 iq -81.31.200.56 - 81.31.200.63 tr -81.31.200.64 - 81.31.200.79 iq -81.31.200.80 - 81.31.200.83 it -81.31.200.84 - 81.31.200.87 us -81.31.200.88 - 81.31.200.95 dz -81.31.200.96 - 81.31.200.103 tr -81.31.200.104 - 81.31.200.127 iq -81.31.200.128 - 81.31.200.135 tr -81.31.200.136 - 81.31.200.143 iq -81.31.200.144 - 81.31.200.151 dz -81.31.200.152 - 81.31.200.159 ch -81.31.200.160 - 81.31.200.167 nl -81.31.200.168 - 81.31.200.175 dz -81.31.200.176 - 81.31.200.191 iq -81.31.200.192 - 81.31.200.199 de -81.31.200.200 - 81.31.200.215 iq -81.31.200.216 - 81.31.200.219 nl -81.31.200.220 - 81.31.200.223 dz -81.31.200.224 - 81.31.200.239 tr -81.31.200.240 - 81.31.200.255 iq -81.31.201.0 - 81.31.201.7 tr -81.31.201.8 - 81.31.201.15 iq -81.31.201.16 - 81.31.201.19 gb -81.31.201.20 - 81.31.201.23 nl -81.31.201.24 - 81.31.201.39 iq -81.31.201.40 - 81.31.201.43 nl -81.31.201.44 - 81.31.201.47 es -81.31.201.48 - 81.31.201.51 nl -81.31.201.52 - 81.31.201.59 es -81.31.201.60 - 81.31.201.63 it -81.31.201.64 - 81.31.201.71 dz -81.31.201.72 - 81.31.201.99 iq -81.31.201.100 - 81.31.201.103 dz -81.31.201.104 - 81.31.201.111 tr -81.31.201.112 - 81.31.201.115 iq -81.31.201.116 - 81.31.201.119 tr -81.31.201.120 - 81.31.201.127 iq -81.31.201.128 - 81.31.201.135 tr -81.31.201.136 - 81.31.201.203 iq -81.31.201.204 - 81.31.201.207 gb -81.31.201.208 - 81.31.201.215 nl -81.31.201.216 - 81.31.201.251 iq -81.31.201.252 - 81.31.201.255 nl -81.31.202.0 - 81.31.202.11 iq -81.31.202.12 - 81.31.202.15 es -81.31.202.16 - 81.31.202.23 iq -81.31.202.24 - 81.31.202.27 nl -81.31.202.28 - 81.31.202.31 es -81.31.202.32 - 81.31.202.47 iq -81.31.202.48 - 81.31.202.51 es -81.31.202.52 - 81.31.202.55 nl -81.31.202.56 - 81.31.202.59 pt -81.31.202.60 - 81.31.202.67 iq -81.31.202.68 - 81.31.202.71 es -81.31.202.72 - 81.31.202.75 nl -81.31.202.76 - 81.31.202.79 iq -81.31.202.80 - 81.31.202.83 nl -81.31.202.84 - 81.31.202.87 us -81.31.202.88 - 81.31.202.95 nl -81.31.202.96 - 81.31.202.175 iq -81.31.202.176 - 81.31.202.191 nl -81.31.202.192 - 81.31.202.199 iq -81.31.202.200 - 81.31.202.207 it -81.31.202.208 - 81.31.202.215 iq -81.31.202.216 - 81.31.202.223 us -81.31.202.224 - 81.31.202.231 iq -81.31.202.232 - 81.31.202.247 nl -81.31.202.248 - 81.31.203.7 iq -81.31.203.8 - 81.31.203.15 nl -81.31.203.16 - 81.31.203.23 us -81.31.203.24 - 81.31.203.39 iq -81.31.203.40 - 81.31.203.47 nl -81.31.203.48 - 81.31.203.55 ma -81.31.203.56 - 81.31.203.63 iq -81.31.203.64 - 81.31.203.67 nl -81.31.203.68 - 81.31.203.79 gb -81.31.203.80 - 81.31.203.83 nl -81.31.203.84 - 81.31.203.95 gb -81.31.203.96 - 81.31.203.99 nl -81.31.203.100 - 81.31.203.111 gb -81.31.203.112 - 81.31.203.115 nl -81.31.203.116 - 81.31.203.119 iq -81.31.203.120 - 81.31.203.131 gb -81.31.203.132 - 81.31.203.135 nl -81.31.203.136 - 81.31.203.143 gb -81.31.203.144 - 81.31.203.151 iq -81.31.203.152 - 81.31.203.159 de -81.31.203.160 - 81.31.203.167 iq -81.31.203.168 - 81.31.203.191 us -81.31.203.192 - 81.31.203.195 gb -81.31.203.196 - 81.31.203.199 nl -81.31.203.200 - 81.31.203.207 gb -81.31.203.208 - 81.31.203.215 nl -81.31.203.216 - 81.31.203.223 de -81.31.203.224 - 81.31.203.231 iq -81.31.203.232 - 81.31.203.239 nl -81.31.203.240 - 81.31.203.255 us -81.31.204.0 - 81.31.207.255 nl -81.31.208.0 - 81.31.223.255 pl +81.31.208.0 - 81.31.215.255 ie +81.31.216.0 - 81.31.223.255 nl 81.31.224.0 - 81.31.255.255 ir 81.32.0.0 - 81.47.255.255 es -81.48.0.0 - 81.52.127.255 fr -81.52.128.0 - 81.52.128.47 ch -81.52.128.48 - 81.52.128.255 fr -81.52.129.0 - 81.52.129.127 sg -81.52.129.128 - 81.52.129.255 fr -81.52.130.0 - 81.52.131.255 us -81.52.132.0 - 81.52.132.255 fr -81.52.133.0 - 81.52.134.255 us -81.52.135.0 - 81.52.135.255 cm -81.52.136.0 - 81.52.136.71 gb -81.52.136.72 - 81.52.136.255 fr -81.52.137.0 - 81.52.137.63 us -81.52.137.64 - 81.52.140.255 fr +81.48.0.0 - 81.52.129.255 fr +81.52.130.0 - 81.52.130.127 us +81.52.130.128 - 81.52.130.159 fr +81.52.130.160 - 81.52.130.255 us +81.52.131.0 - 81.52.133.255 fr +81.52.134.0 - 81.52.134.255 us +81.52.135.0 - 81.52.140.255 fr 81.52.141.0 - 81.52.141.255 de 81.52.142.0 - 81.52.160.255 fr -81.52.161.0 - 81.52.169.255 dz +81.52.161.0 - 81.52.163.255 dz +81.52.164.0 - 81.52.164.255 fr +81.52.165.0 - 81.52.169.255 dz 81.52.170.0 - 81.52.170.255 fr 81.52.171.0 - 81.52.174.255 sv 81.52.175.0 - 81.52.191.255 fr 81.52.192.0 - 81.52.198.217 mq -81.52.198.218 - 81.52.199.255 fr -81.52.200.0 - 81.52.200.19 cm -81.52.200.20 - 81.52.201.255 fr -81.52.202.0 - 81.52.204.255 us +81.52.198.218 - 81.52.204.255 fr 81.52.205.0 - 81.52.205.255 gb 81.52.206.0 - 81.52.206.255 fr 81.52.207.0 - 81.52.207.255 de 81.52.208.0 - 81.52.215.255 gp 81.52.216.0 - 81.52.223.255 sg -81.52.224.0 - 81.52.236.255 fr -81.52.237.0 - 81.52.237.127 sg -81.52.237.128 - 81.52.237.191 fr -81.52.237.192 - 81.52.237.199 gb -81.52.237.200 - 81.52.237.223 fr -81.52.237.224 - 81.52.237.255 sg -81.52.238.0 - 81.52.239.255 ve +81.52.224.0 - 81.52.239.255 fr 81.52.240.0 - 81.52.247.255 sg -81.52.248.0 - 81.52.250.255 us -81.52.251.0 - 81.52.251.255 fr -81.52.252.0 - 81.52.255.255 mq -81.53.0.0 - 81.57.255.255 fr -81.58.0.0 - 81.58.16.15 nl -81.58.16.16 - 81.58.16.23 be -81.58.16.24 - 81.58.16.31 nl -81.58.16.32 - 81.58.16.47 be -81.58.16.48 - 81.58.16.55 nl -81.58.16.56 - 81.58.16.79 be -81.58.16.80 - 81.58.16.95 nl -81.58.16.96 - 81.58.16.111 be -81.58.16.112 - 81.58.16.135 nl -81.58.16.136 - 81.58.16.167 be -81.58.16.168 - 81.58.16.183 nl -81.58.16.184 - 81.58.16.199 be -81.58.16.200 - 81.58.16.215 nl -81.58.16.216 - 81.58.16.223 be -81.58.16.224 - 81.58.16.239 nl -81.58.16.240 - 81.58.16.247 be -81.58.16.248 - 81.58.17.7 nl -81.58.17.8 - 81.58.17.31 be -81.58.17.32 - 81.58.17.47 nl -81.58.17.48 - 81.58.17.63 be -81.58.17.64 - 81.58.17.71 nl -81.58.17.72 - 81.58.17.95 be -81.58.17.96 - 81.58.17.103 nl -81.58.17.104 - 81.58.17.111 be -81.58.17.112 - 81.58.17.119 nl -81.58.17.120 - 81.58.17.151 be -81.58.17.152 - 81.58.17.175 nl -81.58.17.176 - 81.58.17.183 be -81.58.17.184 - 81.58.17.231 nl -81.58.17.232 - 81.58.17.255 be -81.58.18.0 - 81.58.18.23 nl -81.58.18.24 - 81.58.18.31 be -81.58.18.32 - 81.58.18.47 nl -81.58.18.48 - 81.58.18.79 be -81.58.18.80 - 81.58.18.87 nl -81.58.18.88 - 81.58.18.95 be -81.58.18.96 - 81.58.18.111 nl -81.58.18.112 - 81.58.18.159 be -81.58.18.160 - 81.58.18.183 nl -81.58.18.184 - 81.58.18.191 be -81.58.18.192 - 81.58.18.199 nl -81.58.18.200 - 81.58.18.207 be -81.58.18.208 - 81.58.18.231 nl -81.58.18.232 - 81.58.18.247 be -81.58.18.248 - 81.58.18.255 nl -81.58.19.0 - 81.58.19.7 be -81.58.19.8 - 81.58.19.23 nl -81.58.19.24 - 81.58.19.31 be -81.58.19.32 - 81.58.19.55 nl -81.58.19.56 - 81.58.19.63 be -81.58.19.64 - 81.58.19.71 nl -81.58.19.72 - 81.58.19.87 be -81.58.19.88 - 81.58.19.111 nl -81.58.19.112 - 81.58.19.119 be -81.58.19.120 - 81.58.19.127 nl -81.58.19.128 - 81.58.19.143 be -81.58.19.144 - 81.58.19.167 nl -81.58.19.168 - 81.58.19.191 be -81.58.19.192 - 81.58.19.199 nl -81.58.19.200 - 81.58.19.215 be -81.58.19.216 - 81.58.19.223 nl -81.58.19.224 - 81.58.19.231 be -81.58.19.232 - 81.58.19.239 nl -81.58.19.240 - 81.58.19.255 be -81.58.20.0 - 81.58.20.7 nl -81.58.20.8 - 81.58.20.15 be -81.58.20.16 - 81.58.20.31 nl -81.58.20.32 - 81.58.20.47 be -81.58.20.48 - 81.58.20.79 nl -81.58.20.80 - 81.58.20.95 be -81.58.20.96 - 81.58.20.127 nl -81.58.20.128 - 81.58.20.135 be -81.58.20.136 - 81.58.20.159 nl -81.58.20.160 - 81.58.20.175 be -81.58.20.176 - 81.58.20.183 nl -81.58.20.184 - 81.58.20.199 be -81.58.20.200 - 81.58.20.215 nl -81.58.20.216 - 81.58.20.223 be -81.58.20.224 - 81.58.21.7 nl -81.58.21.8 - 81.58.21.23 be -81.58.21.24 - 81.58.21.47 nl -81.58.21.48 - 81.58.21.63 be -81.58.21.64 - 81.58.21.71 nl -81.58.21.72 - 81.58.21.103 be -81.58.21.104 - 81.58.21.143 nl -81.58.21.144 - 81.58.21.151 be -81.58.21.152 - 81.58.21.159 nl -81.58.21.160 - 81.58.21.167 be -81.58.21.168 - 81.58.21.199 nl -81.58.21.200 - 81.58.21.207 be -81.58.21.208 - 81.58.21.215 nl -81.58.21.216 - 81.58.21.239 be -81.58.21.240 - 81.58.21.247 nl -81.58.21.248 - 81.58.21.255 be -81.58.22.0 - 81.58.22.31 nl -81.58.22.32 - 81.58.22.39 be -81.58.22.40 - 81.58.22.63 nl -81.58.22.64 - 81.58.22.71 be -81.58.22.72 - 81.58.22.87 nl -81.58.22.88 - 81.58.22.95 be -81.58.22.96 - 81.58.22.103 nl -81.58.22.104 - 81.58.22.111 be -81.58.22.112 - 81.58.22.191 nl -81.58.22.192 - 81.58.22.199 be -81.58.22.200 - 81.58.22.247 nl -81.58.22.248 - 81.58.22.255 be -81.58.23.0 - 81.58.23.47 nl -81.58.23.48 - 81.58.23.63 be -81.58.23.64 - 81.58.23.87 nl -81.58.23.88 - 81.58.23.95 be -81.58.23.96 - 81.58.23.111 nl -81.58.23.112 - 81.58.23.119 be -81.58.23.120 - 81.58.23.135 nl -81.58.23.136 - 81.58.23.151 be -81.58.23.152 - 81.58.23.159 nl -81.58.23.160 - 81.58.23.175 be -81.58.23.176 - 81.58.23.191 nl -81.58.23.192 - 81.58.23.207 be -81.58.23.208 - 81.58.23.215 nl -81.58.23.216 - 81.58.23.223 be -81.58.23.224 - 81.58.23.247 nl -81.58.23.248 - 81.58.23.255 be -81.58.24.0 - 81.58.24.15 nl -81.58.24.16 - 81.58.24.39 be -81.58.24.40 - 81.58.24.151 nl -81.58.24.152 - 81.58.24.159 be -81.58.24.160 - 81.58.24.231 nl -81.58.24.232 - 81.58.24.239 be -81.58.24.240 - 81.58.24.255 nl -81.58.25.0 - 81.58.25.15 be -81.58.25.16 - 81.58.25.23 nl -81.58.25.24 - 81.58.25.31 be -81.58.25.32 - 81.58.25.47 nl -81.58.25.48 - 81.58.25.55 be -81.58.25.56 - 81.58.25.63 nl -81.58.25.64 - 81.58.25.79 be -81.58.25.80 - 81.58.25.87 nl -81.58.25.88 - 81.58.25.95 be -81.58.25.96 - 81.58.25.111 nl -81.58.25.112 - 81.58.25.143 be -81.58.25.144 - 81.58.25.151 nl -81.58.25.152 - 81.58.25.159 be -81.58.25.160 - 81.58.25.167 nl -81.58.25.168 - 81.58.25.175 be -81.58.25.176 - 81.58.25.199 nl -81.58.25.200 - 81.58.25.215 be -81.58.25.216 - 81.58.25.223 nl -81.58.25.224 - 81.58.25.231 be -81.58.25.232 - 81.58.25.247 nl -81.58.25.248 - 81.58.26.15 be -81.58.26.16 - 81.58.26.23 nl -81.58.26.24 - 81.58.26.31 be -81.58.26.32 - 81.58.26.39 nl -81.58.26.40 - 81.58.26.47 be -81.58.26.48 - 81.58.26.95 nl -81.58.26.96 - 81.58.26.103 be -81.58.26.104 - 81.58.26.111 nl -81.58.26.112 - 81.58.26.119 be -81.58.26.120 - 81.58.26.191 nl -81.58.26.192 - 81.58.26.199 be -81.58.26.200 - 81.58.26.207 nl -81.58.26.208 - 81.58.26.215 be -81.58.26.216 - 81.58.26.255 nl -81.58.27.0 - 81.58.27.31 be -81.58.27.32 - 81.58.27.39 nl -81.58.27.40 - 81.58.27.71 be -81.58.27.72 - 81.58.27.87 nl -81.58.27.88 - 81.58.27.103 be -81.58.27.104 - 81.58.27.151 nl -81.58.27.152 - 81.58.27.159 be -81.58.27.160 - 81.58.27.223 nl -81.58.27.224 - 81.58.27.231 be -81.58.27.232 - 81.58.28.39 nl -81.58.28.40 - 81.58.28.55 be -81.58.28.56 - 81.58.28.111 nl -81.58.28.112 - 81.58.28.127 be -81.58.28.128 - 81.58.28.151 nl -81.58.28.152 - 81.58.28.159 be -81.58.28.160 - 81.58.28.199 nl -81.58.28.200 - 81.58.28.231 be -81.58.28.232 - 81.58.28.239 nl -81.58.28.240 - 81.58.29.23 be -81.58.29.24 - 81.58.29.39 nl -81.58.29.40 - 81.58.29.47 be -81.58.29.48 - 81.58.29.71 nl -81.58.29.72 - 81.58.29.79 be -81.58.29.80 - 81.58.29.95 nl -81.58.29.96 - 81.58.29.111 be -81.58.29.112 - 81.58.29.135 nl -81.58.29.136 - 81.58.29.143 be -81.58.29.144 - 81.58.29.151 nl -81.58.29.152 - 81.58.29.167 be -81.58.29.168 - 81.58.29.175 nl -81.58.29.176 - 81.58.29.183 be -81.58.29.184 - 81.58.29.215 nl -81.58.29.216 - 81.58.29.223 be -81.58.29.224 - 81.58.30.23 nl -81.58.30.24 - 81.58.30.31 be -81.58.30.32 - 81.58.30.39 nl -81.58.30.40 - 81.58.30.47 be -81.58.30.48 - 81.58.30.71 nl -81.58.30.72 - 81.58.30.79 be -81.58.30.80 - 81.58.30.103 nl -81.58.30.104 - 81.58.30.111 be -81.58.30.112 - 81.58.30.119 nl -81.58.30.120 - 81.58.30.151 be -81.58.30.152 - 81.58.30.159 nl -81.58.30.160 - 81.58.30.175 be -81.58.30.176 - 81.58.30.191 nl -81.58.30.192 - 81.58.30.199 be -81.58.30.200 - 81.58.30.207 nl -81.58.30.208 - 81.58.30.215 be -81.58.30.216 - 81.58.30.239 nl -81.58.30.240 - 81.58.30.255 be -81.58.31.0 - 81.58.31.15 nl -81.58.31.16 - 81.58.31.23 be -81.58.31.24 - 81.58.31.79 nl -81.58.31.80 - 81.58.31.95 be -81.58.31.96 - 81.58.31.103 nl -81.58.31.104 - 81.58.31.111 be -81.58.31.112 - 81.58.31.159 nl -81.58.31.160 - 81.58.31.167 be -81.58.31.168 - 81.58.31.175 nl -81.58.31.176 - 81.58.31.183 be -81.58.31.184 - 81.58.31.223 nl -81.58.31.224 - 81.58.31.231 be -81.58.31.232 - 81.58.31.255 nl -81.58.32.0 - 81.58.32.7 be -81.58.32.8 - 81.58.32.23 nl -81.58.32.24 - 81.58.32.39 be -81.58.32.40 - 81.58.32.127 nl -81.58.32.128 - 81.58.32.151 be -81.58.32.152 - 81.58.32.191 nl -81.58.32.192 - 81.58.32.199 be -81.58.32.200 - 81.58.32.215 nl -81.58.32.216 - 81.58.32.223 be -81.58.32.224 - 81.58.32.247 nl -81.58.32.248 - 81.58.32.255 be -81.58.33.0 - 81.58.33.7 nl -81.58.33.8 - 81.58.33.15 be -81.58.33.16 - 81.58.33.31 nl -81.58.33.32 - 81.58.33.55 be -81.58.33.56 - 81.58.33.71 nl -81.58.33.72 - 81.58.33.79 be -81.58.33.80 - 81.58.33.103 nl -81.58.33.104 - 81.58.33.111 be -81.58.33.112 - 81.58.33.127 nl -81.58.33.128 - 81.58.33.135 be -81.58.33.136 - 81.58.33.143 nl -81.58.33.144 - 81.58.33.151 be -81.58.33.152 - 81.58.33.167 nl -81.58.33.168 - 81.58.33.175 be -81.58.33.176 - 81.58.33.223 nl -81.58.33.224 - 81.58.33.231 be -81.58.33.232 - 81.58.34.23 nl -81.58.34.24 - 81.58.34.39 be -81.58.34.40 - 81.58.34.47 nl -81.58.34.48 - 81.58.34.63 be -81.58.34.64 - 81.58.34.79 nl -81.58.34.80 - 81.58.34.87 be -81.58.34.88 - 81.58.34.95 nl -81.58.34.96 - 81.58.34.103 be -81.58.34.104 - 81.58.34.119 nl -81.58.34.120 - 81.58.34.127 be -81.58.34.128 - 81.58.34.143 nl -81.58.34.144 - 81.58.34.151 be -81.58.34.152 - 81.58.34.207 nl -81.58.34.208 - 81.58.34.239 be -81.58.34.240 - 81.58.34.247 nl -81.58.34.248 - 81.58.34.255 be -81.58.35.0 - 81.58.35.7 nl -81.58.35.8 - 81.58.35.15 be -81.58.35.16 - 81.58.35.23 nl -81.58.35.24 - 81.58.35.31 be -81.58.35.32 - 81.58.35.63 nl -81.58.35.64 - 81.58.35.71 be -81.58.35.72 - 81.58.35.79 nl -81.58.35.80 - 81.58.35.95 be -81.58.35.96 - 81.58.35.111 nl -81.58.35.112 - 81.58.35.135 be -81.58.35.136 - 81.58.35.151 nl -81.58.35.152 - 81.58.35.159 be -81.58.35.160 - 81.58.35.167 nl -81.58.35.168 - 81.58.35.191 be -81.58.35.192 - 81.58.35.199 nl -81.58.35.200 - 81.58.35.207 be -81.58.35.208 - 81.58.35.215 nl -81.58.35.216 - 81.58.35.231 be -81.58.35.232 - 81.58.35.247 nl -81.58.35.248 - 81.58.36.7 be -81.58.36.8 - 81.58.36.23 nl -81.58.36.24 - 81.58.36.31 be -81.58.36.32 - 81.58.36.47 nl -81.58.36.48 - 81.58.36.55 be -81.58.36.56 - 81.58.36.71 nl -81.58.36.72 - 81.58.36.87 be -81.58.36.88 - 81.58.36.95 nl -81.58.36.96 - 81.58.36.111 be -81.58.36.112 - 81.58.36.127 nl -81.58.36.128 - 81.58.36.135 be -81.58.36.136 - 81.58.36.175 nl -81.58.36.176 - 81.58.36.191 be -81.58.36.192 - 81.58.36.199 nl -81.58.36.200 - 81.58.36.215 be -81.58.36.216 - 81.58.36.223 nl -81.58.36.224 - 81.58.36.247 be -81.58.36.248 - 81.58.37.7 nl -81.58.37.8 - 81.58.37.15 be -81.58.37.16 - 81.58.37.23 nl -81.58.37.24 - 81.58.37.31 be -81.58.37.32 - 81.58.37.39 nl -81.58.37.40 - 81.58.37.71 be -81.58.37.72 - 81.58.37.79 nl -81.58.37.80 - 81.58.37.95 be -81.58.37.96 - 81.58.37.119 nl -81.58.37.120 - 81.58.37.135 be -81.58.37.136 - 81.58.37.143 nl -81.58.37.144 - 81.58.37.159 be -81.58.37.160 - 81.58.37.183 nl -81.58.37.184 - 81.58.37.191 be -81.58.37.192 - 81.58.37.199 nl -81.58.37.200 - 81.58.37.207 be -81.58.37.208 - 81.58.37.255 nl -81.58.38.0 - 81.58.38.7 be -81.58.38.8 - 81.58.38.15 nl -81.58.38.16 - 81.58.38.31 be -81.58.38.32 - 81.58.38.63 nl -81.58.38.64 - 81.58.38.95 be -81.58.38.96 - 81.58.38.103 nl -81.58.38.104 - 81.58.38.111 be -81.58.38.112 - 81.58.38.135 nl -81.58.38.136 - 81.58.38.143 be -81.58.38.144 - 81.58.38.151 nl -81.58.38.152 - 81.58.38.159 be -81.58.38.160 - 81.58.38.183 nl -81.58.38.184 - 81.58.38.199 be -81.58.38.200 - 81.58.38.207 nl -81.58.38.208 - 81.58.38.223 be -81.58.38.224 - 81.58.38.239 nl -81.58.38.240 - 81.58.38.247 be -81.58.38.248 - 81.58.39.7 nl -81.58.39.8 - 81.58.39.31 be -81.58.39.32 - 81.58.39.39 nl -81.58.39.40 - 81.58.39.47 be -81.58.39.48 - 81.58.39.71 nl -81.58.39.72 - 81.58.39.79 be -81.58.39.80 - 81.58.39.135 nl -81.58.39.136 - 81.58.39.143 be -81.58.39.144 - 81.58.39.159 nl -81.58.39.160 - 81.58.39.167 be -81.58.39.168 - 81.58.39.215 nl -81.58.39.216 - 81.58.39.223 be -81.58.39.224 - 81.58.39.231 nl -81.58.39.232 - 81.58.39.239 be -81.58.39.240 - 81.58.39.255 nl -81.58.40.0 - 81.58.40.15 be -81.58.40.16 - 81.58.40.95 nl -81.58.40.96 - 81.58.40.119 be -81.58.40.120 - 81.58.40.135 nl -81.58.40.136 - 81.58.40.143 be -81.58.40.144 - 81.58.40.167 nl -81.58.40.168 - 81.58.40.175 be -81.58.40.176 - 81.58.40.183 nl -81.58.40.184 - 81.58.40.191 be -81.58.40.192 - 81.58.40.207 nl -81.58.40.208 - 81.58.40.247 be -81.58.40.248 - 81.58.41.15 nl -81.58.41.16 - 81.58.41.39 be -81.58.41.40 - 81.58.41.47 nl -81.58.41.48 - 81.58.41.63 be -81.58.41.64 - 81.58.41.71 nl -81.58.41.72 - 81.58.41.79 be -81.58.41.80 - 81.58.41.95 nl -81.58.41.96 - 81.58.41.103 be -81.58.41.104 - 81.58.41.111 nl -81.58.41.112 - 81.58.41.127 be -81.58.41.128 - 81.58.41.135 nl -81.58.41.136 - 81.58.41.151 be -81.58.41.152 - 81.58.41.167 nl -81.58.41.168 - 81.58.41.175 be -81.58.41.176 - 81.58.41.199 nl -81.58.41.200 - 81.58.41.207 be -81.58.41.208 - 81.58.41.239 nl -81.58.41.240 - 81.58.41.255 be -81.58.42.0 - 81.58.42.15 nl -81.58.42.16 - 81.58.42.23 be -81.58.42.24 - 81.58.42.39 nl -81.58.42.40 - 81.58.42.47 be -81.58.42.48 - 81.58.42.79 nl -81.58.42.80 - 81.58.42.111 be -81.58.42.112 - 81.58.42.143 nl -81.58.42.144 - 81.58.42.151 be -81.58.42.152 - 81.58.42.167 nl -81.58.42.168 - 81.58.42.175 be -81.58.42.176 - 81.58.42.191 nl -81.58.42.192 - 81.58.42.199 be -81.58.42.200 - 81.58.42.215 nl -81.58.42.216 - 81.58.42.255 be -81.58.43.0 - 81.58.43.7 nl -81.58.43.8 - 81.58.43.23 be -81.58.43.24 - 81.58.43.31 nl -81.58.43.32 - 81.58.43.47 be -81.58.43.48 - 81.58.43.55 nl -81.58.43.56 - 81.58.43.71 be -81.58.43.72 - 81.58.43.79 nl -81.58.43.80 - 81.58.43.87 be -81.58.43.88 - 81.58.43.111 nl -81.58.43.112 - 81.58.43.119 be -81.58.43.120 - 81.58.43.135 nl -81.58.43.136 - 81.58.43.151 be -81.58.43.152 - 81.58.43.167 nl -81.58.43.168 - 81.58.43.175 be -81.58.43.176 - 81.58.43.239 nl -81.58.43.240 - 81.58.43.255 be -81.58.44.0 - 81.58.44.15 nl -81.58.44.16 - 81.58.44.23 be -81.58.44.24 - 81.58.44.31 nl -81.58.44.32 - 81.58.44.39 be -81.58.44.40 - 81.58.44.47 nl -81.58.44.48 - 81.58.44.55 be -81.58.44.56 - 81.58.44.63 nl -81.58.44.64 - 81.58.44.71 be -81.58.44.72 - 81.58.44.79 nl -81.58.44.80 - 81.58.44.87 be -81.58.44.88 - 81.58.44.95 nl -81.58.44.96 - 81.58.44.111 be -81.58.44.112 - 81.58.44.119 nl -81.58.44.120 - 81.58.44.135 be -81.58.44.136 - 81.58.44.151 nl -81.58.44.152 - 81.58.44.183 be -81.58.44.184 - 81.58.44.191 nl -81.58.44.192 - 81.58.44.215 be -81.58.44.216 - 81.58.44.247 nl -81.58.44.248 - 81.58.44.255 be -81.58.45.0 - 81.58.45.7 nl -81.58.45.8 - 81.58.45.23 be -81.58.45.24 - 81.58.45.31 nl -81.58.45.32 - 81.58.45.39 be -81.58.45.40 - 81.58.45.95 nl -81.58.45.96 - 81.58.45.103 be -81.58.45.104 - 81.58.45.119 nl -81.58.45.120 - 81.58.45.127 be -81.58.45.128 - 81.58.45.135 nl -81.58.45.136 - 81.58.45.151 be -81.58.45.152 - 81.58.45.199 nl -81.58.45.200 - 81.58.45.215 be -81.58.45.216 - 81.58.45.223 nl -81.58.45.224 - 81.58.45.231 be -81.58.45.232 - 81.58.45.239 nl -81.58.45.240 - 81.58.46.7 be -81.58.46.8 - 81.58.46.15 nl -81.58.46.16 - 81.58.46.23 be -81.58.46.24 - 81.58.46.47 nl -81.58.46.48 - 81.58.46.63 be -81.58.46.64 - 81.58.46.87 nl -81.58.46.88 - 81.58.46.103 be -81.58.46.104 - 81.58.46.119 nl -81.58.46.120 - 81.58.46.135 be -81.58.46.136 - 81.58.46.167 nl -81.58.46.168 - 81.58.46.175 be -81.58.46.176 - 81.58.46.199 nl -81.58.46.200 - 81.58.46.215 be -81.58.46.216 - 81.58.46.247 nl -81.58.46.248 - 81.58.47.23 be -81.58.47.24 - 81.58.47.31 nl -81.58.47.32 - 81.58.47.47 be -81.58.47.48 - 81.58.47.55 nl -81.58.47.56 - 81.58.47.63 be -81.58.47.64 - 81.58.47.79 nl -81.58.47.80 - 81.58.47.95 be -81.58.47.96 - 81.58.47.103 nl -81.58.47.104 - 81.58.47.143 be -81.58.47.144 - 81.58.47.151 nl -81.58.47.152 - 81.58.47.159 be -81.58.47.160 - 81.58.47.167 nl -81.58.47.168 - 81.58.47.191 be -81.58.47.192 - 81.58.47.199 nl -81.58.47.200 - 81.58.47.223 be -81.58.47.224 - 81.58.47.247 nl -81.58.47.248 - 81.58.47.255 be -81.58.48.0 - 81.58.240.23 nl -81.58.240.24 - 81.58.240.39 be -81.58.240.40 - 81.58.240.47 nl -81.58.240.48 - 81.58.240.63 be -81.58.240.64 - 81.58.240.79 nl -81.58.240.80 - 81.58.240.95 be -81.58.240.96 - 81.58.240.127 nl -81.58.240.128 - 81.58.240.191 be -81.58.240.192 - 81.58.240.247 nl -81.58.240.248 - 81.58.240.255 be -81.58.241.0 - 81.58.241.31 nl -81.58.241.32 - 81.58.241.63 be -81.58.241.64 - 81.58.241.79 nl -81.58.241.80 - 81.58.241.87 be -81.58.241.88 - 81.58.242.27 nl -81.58.242.28 - 81.58.242.47 be -81.58.242.48 - 81.58.242.207 nl -81.58.242.208 - 81.58.242.255 be -81.58.243.0 - 81.59.63.255 nl -81.59.64.0 - 81.59.95.255 be -81.59.96.0 - 81.59.191.255 nl -81.59.192.0 - 81.59.199.255 be -81.59.200.0 - 81.59.200.15 nl -81.59.200.16 - 81.59.200.23 be -81.59.200.24 - 81.59.200.31 nl -81.59.200.32 - 81.59.205.255 be -81.59.206.0 - 81.59.206.3 nl -81.59.206.4 - 81.59.207.255 be -81.59.208.0 - 81.59.208.7 nl -81.59.208.8 - 81.59.213.255 be -81.59.214.0 - 81.59.214.3 nl -81.59.214.4 - 81.59.216.7 be -81.59.216.8 - 81.59.216.15 nl -81.59.216.16 - 81.59.216.23 be -81.59.216.24 - 81.59.216.47 nl -81.59.216.48 - 81.59.216.55 be -81.59.216.56 - 81.59.216.119 nl -81.59.216.120 - 81.59.216.127 be -81.59.216.128 - 81.59.216.167 nl -81.59.216.168 - 81.59.216.191 be -81.59.216.192 - 81.59.216.223 nl -81.59.216.224 - 81.59.222.11 be -81.59.222.12 - 81.59.222.27 nl -81.59.222.28 - 81.59.222.31 be -81.59.222.32 - 81.59.222.47 nl -81.59.222.48 - 81.59.222.51 be -81.59.222.52 - 81.59.222.63 nl -81.59.222.64 - 81.59.223.255 be -81.59.224.0 - 81.59.224.7 nl -81.59.224.8 - 81.59.229.255 be -81.59.230.0 - 81.59.230.3 nl -81.59.230.4 - 81.59.232.15 be -81.59.232.16 - 81.59.232.215 nl -81.59.232.216 - 81.59.232.223 be -81.59.232.224 - 81.59.232.231 nl -81.59.232.232 - 81.59.232.239 be -81.59.232.240 - 81.59.233.15 nl -81.59.233.16 - 81.59.233.31 be -81.59.233.32 - 81.59.233.127 nl -81.59.233.128 - 81.59.233.191 be -81.59.233.192 - 81.59.233.199 nl -81.59.233.200 - 81.59.233.207 be -81.59.233.208 - 81.59.233.231 nl -81.59.233.232 - 81.59.233.239 be -81.59.233.240 - 81.59.233.255 nl -81.59.234.0 - 81.59.234.31 be -81.59.234.32 - 81.59.234.63 nl -81.59.234.64 - 81.59.234.79 be -81.59.234.80 - 81.59.234.87 nl -81.59.234.88 - 81.59.237.255 be -81.59.238.0 - 81.59.238.3 nl -81.59.238.4 - 81.59.238.7 be -81.59.238.8 - 81.59.238.19 nl -81.59.238.20 - 81.59.238.23 be -81.59.238.24 - 81.59.238.95 nl -81.59.238.96 - 81.59.238.107 be -81.59.238.108 - 81.59.238.159 nl -81.59.238.160 - 81.59.238.163 be -81.59.238.164 - 81.59.238.171 nl -81.59.238.172 - 81.59.238.175 be -81.59.238.176 - 81.59.238.183 nl -81.59.238.184 - 81.59.245.255 be -81.59.246.0 - 81.59.246.3 nl -81.59.246.4 - 81.59.249.255 be -81.59.250.0 - 81.59.254.255 nl -81.59.255.0 - 81.59.255.0 be -81.59.255.1 - 81.59.255.9 nl -81.59.255.10 - 81.59.255.13 be -81.59.255.14 - 81.59.255.16 nl -81.59.255.17 - 81.59.255.19 be -81.59.255.20 - 81.59.255.21 nl -81.59.255.22 - 81.59.255.22 be -81.59.255.23 - 81.59.255.23 nl -81.59.255.24 - 81.59.255.255 be +81.52.248.0 - 81.52.251.255 fr +81.52.252.0 - 81.52.255.167 mq +81.52.255.168 - 81.57.255.255 fr +81.58.0.0 - 81.59.255.255 nl 81.60.0.0 - 81.61.255.255 es 81.62.0.0 - 81.63.255.255 ch 81.64.0.0 - 81.67.255.255 fr 81.68.0.0 - 81.71.255.255 nl 81.72.0.0 - 81.75.255.255 it 81.76.0.0 - 81.79.255.255 gb -81.80.0.0 - 81.80.26.2 fr -81.80.26.3 - 81.80.26.3 gb -81.80.26.4 - 81.80.255.255 fr +81.80.0.0 - 81.80.255.255 fr 81.81.0.0 - 81.81.255.255 it 81.82.0.0 - 81.83.255.255 be 81.84.0.0 - 81.84.255.255 pt -81.85.0.0 - 81.85.4.255 nl -81.85.5.0 - 81.85.5.255 us +81.85.0.0 - 81.85.5.255 nl 81.85.6.0 - 81.85.13.255 gb -81.85.14.0 - 81.85.14.255 ua -81.85.15.0 - 81.85.19.255 gb -81.85.20.0 - 81.85.24.255 nl -81.85.25.0 - 81.85.25.255 it -81.85.26.0 - 81.85.60.255 nl -81.85.61.0 - 81.85.61.255 us -81.85.62.0 - 81.85.202.255 nl -81.85.203.0 - 81.85.203.255 gb -81.85.204.0 - 81.85.205.255 nl -81.85.206.0 - 81.85.207.255 gb -81.85.208.0 - 81.85.219.255 nl +81.85.14.0 - 81.85.17.255 nl +81.85.18.0 - 81.85.19.255 gb +81.85.20.0 - 81.85.63.255 nl +81.85.64.0 - 81.85.79.255 se +81.85.80.0 - 81.85.219.255 nl 81.85.220.0 - 81.85.223.255 ly -81.85.224.0 - 81.85.224.15 nl -81.85.224.16 - 81.85.224.31 lb -81.85.224.32 - 81.85.237.255 nl -81.85.238.0 - 81.85.239.0 lb -81.85.239.1 - 81.85.239.255 nl -81.85.240.0 - 81.85.241.0 lb -81.85.241.1 - 81.85.255.255 nl +81.85.224.0 - 81.85.236.255 nl +81.85.237.0 - 81.85.237.255 ca +81.85.238.0 - 81.85.255.255 nl 81.86.0.0 - 81.87.255.255 gb 81.88.0.0 - 81.88.15.255 se 81.88.16.0 - 81.88.47.255 de 81.88.48.0 - 81.88.63.255 it 81.88.64.0 - 81.88.79.255 no 81.88.80.0 - 81.88.95.255 ru -81.88.96.0 - 81.88.107.255 fr -81.88.108.0 - 81.88.108.62 be -81.88.108.63 - 81.88.108.143 fr -81.88.108.144 - 81.88.108.151 be -81.88.108.152 - 81.88.108.159 fr -81.88.108.160 - 81.88.109.15 be -81.88.109.16 - 81.88.109.31 fr -81.88.109.32 - 81.88.109.128 be -81.88.109.129 - 81.88.109.255 fr -81.88.110.0 - 81.88.110.159 be -81.88.110.160 - 81.88.110.167 fr -81.88.110.168 - 81.88.110.255 be -81.88.111.0 - 81.88.111.255 fr +81.88.96.0 - 81.88.111.255 fr 81.88.112.0 - 81.88.127.255 ru 81.88.128.0 - 81.88.143.255 sk 81.88.144.0 - 81.88.159.255 kz @@ -41451,25 +21358,16 @@ 81.89.0.0 - 81.89.31.255 ro 81.89.32.0 - 81.89.47.255 es 81.89.48.0 - 81.89.63.255 sk -81.89.64.0 - 81.89.95.255 ru -81.89.96.0 - 81.89.111.255 de +81.89.64.0 - 81.89.87.255 ru +81.89.88.0 - 81.89.111.255 de 81.89.112.0 - 81.89.127.255 ru -81.89.128.0 - 81.89.140.255 gb -81.89.141.0 - 81.89.141.15 ae -81.89.141.16 - 81.89.143.255 gb +81.89.128.0 - 81.89.143.255 gb 81.89.144.0 - 81.89.159.255 se -81.89.160.0 - 81.89.164.255 gb -81.89.165.0 - 81.89.165.47 fr -81.89.165.48 - 81.89.165.63 gb -81.89.165.64 - 81.89.165.87 fr -81.89.165.88 - 81.89.175.255 gb +81.89.160.0 - 81.89.175.255 gb 81.89.176.0 - 81.89.191.255 ru 81.89.192.0 - 81.89.207.255 de 81.89.208.0 - 81.89.223.255 am -81.89.224.0 - 81.89.253.143 de -81.89.253.144 - 81.89.253.159 gb -81.89.253.160 - 81.89.254.255 de -81.89.255.0 - 81.89.255.255 gb +81.89.224.0 - 81.89.255.255 de 81.90.0.0 - 81.90.15.255 ru 81.90.16.0 - 81.90.31.255 iq 81.90.32.0 - 81.90.47.255 de @@ -41487,129 +21385,47 @@ 81.90.224.0 - 81.90.239.255 ua 81.90.240.0 - 81.90.255.255 cz 81.91.0.0 - 81.91.15.255 se -81.91.16.0 - 81.91.31.255 tr +81.91.16.0 - 81.91.23.255 de +81.91.24.0 - 81.91.31.255 ye 81.91.32.0 - 81.91.63.255 ru 81.91.64.0 - 81.91.79.255 fr 81.91.80.0 - 81.91.95.255 cz 81.91.96.0 - 81.91.111.255 gb -81.91.112.0 - 81.91.112.223 tr -81.91.112.224 - 81.91.112.255 us -81.91.113.0 - 81.91.117.255 gb -81.91.118.0 - 81.91.120.255 tr -81.91.121.0 - 81.91.121.255 cy -81.91.122.0 - 81.91.122.255 tr -81.91.123.0 - 81.91.123.255 cy -81.91.124.0 - 81.91.125.255 tr -81.91.126.0 - 81.91.126.255 cy -81.91.127.0 - 81.91.127.63 tr -81.91.127.64 - 81.91.127.127 gb -81.91.127.128 - 81.91.127.255 tr +81.91.112.0 - 81.91.127.255 tr 81.91.128.0 - 81.91.159.255 ir 81.91.160.0 - 81.91.175.255 de 81.91.176.0 - 81.91.191.255 ru -81.91.192.0 - 81.91.201.255 gb -81.91.202.0 - 81.91.202.255 fr -81.91.203.0 - 81.91.203.255 us -81.91.204.0 - 81.91.207.255 gb +81.91.192.0 - 81.91.207.255 gb 81.91.208.0 - 81.91.223.255 cz 81.91.224.0 - 81.91.239.255 bj -81.91.240.0 - 81.91.251.255 gb -81.91.252.0 - 81.91.253.255 ch -81.91.254.0 - 81.91.254.255 us -81.91.255.0 - 81.91.255.255 gb +81.91.240.0 - 81.91.255.255 gb 81.92.0.0 - 81.92.31.255 de 81.92.32.0 - 81.92.47.255 it 81.92.48.0 - 81.92.63.255 gr -81.92.64.0 - 81.92.72.191 se -81.92.72.192 - 81.92.72.207 gb -81.92.72.208 - 81.92.73.255 se -81.92.74.0 - 81.92.75.255 gb -81.92.76.0 - 81.92.78.127 se -81.92.78.128 - 81.92.79.3 gb -81.92.79.4 - 81.92.79.7 se -81.92.79.8 - 81.92.79.15 gb -81.92.79.16 - 81.92.79.31 se -81.92.79.32 - 81.92.79.255 gb +81.92.64.0 - 81.92.79.255 se 81.92.80.0 - 81.92.95.255 fr 81.92.96.0 - 81.92.111.255 ch -81.92.112.0 - 81.92.112.255 fr -81.92.113.0 - 81.92.115.255 us -81.92.116.0 - 81.92.116.127 fr -81.92.116.128 - 81.92.123.255 us -81.92.124.0 - 81.92.125.31 fr -81.92.125.32 - 81.92.125.111 us -81.92.125.112 - 81.92.125.119 de -81.92.125.120 - 81.92.125.127 es -81.92.125.128 - 81.92.125.255 us -81.92.126.0 - 81.92.126.15 fr -81.92.126.16 - 81.92.126.31 us -81.92.126.32 - 81.92.126.47 fr -81.92.126.48 - 81.92.127.255 us +81.92.112.0 - 81.92.125.95 us +81.92.125.96 - 81.92.125.111 gb +81.92.125.112 - 81.92.127.255 us 81.92.128.0 - 81.92.143.255 es 81.92.144.0 - 81.92.159.255 cz -81.92.160.0 - 81.92.171.255 de -81.92.172.0 - 81.92.172.31 us -81.92.172.32 - 81.92.175.255 de +81.92.160.0 - 81.92.161.127 de +81.92.161.128 - 81.92.161.191 at +81.92.161.192 - 81.92.175.255 de 81.92.176.0 - 81.92.191.255 nl -81.92.192.0 - 81.92.223.255 pt -81.92.224.0 - 81.92.224.255 iq -81.92.225.0 - 81.92.225.255 lu -81.92.226.0 - 81.92.226.31 fr -81.92.226.32 - 81.92.226.63 gb -81.92.226.64 - 81.92.227.127 lu -81.92.227.128 - 81.92.227.135 gb -81.92.227.136 - 81.92.227.255 lu -81.92.228.0 - 81.92.236.255 fr -81.92.237.0 - 81.92.237.127 lu -81.92.237.128 - 81.92.237.159 be -81.92.237.160 - 81.92.237.175 lu -81.92.237.176 - 81.92.237.239 fr -81.92.237.240 - 81.92.238.79 lu -81.92.238.80 - 81.92.238.95 be -81.92.238.96 - 81.92.238.159 lu -81.92.238.160 - 81.92.238.175 fr -81.92.238.176 - 81.92.238.223 lu -81.92.238.224 - 81.92.238.239 be -81.92.238.240 - 81.92.239.223 lu -81.92.239.224 - 81.92.239.255 be -81.92.240.0 - 81.92.241.31 at -81.92.241.32 - 81.92.241.39 ba -81.92.241.40 - 81.92.241.47 bg -81.92.241.48 - 81.92.241.55 de -81.92.241.56 - 81.92.241.63 gb -81.92.241.64 - 81.92.241.71 hr -81.92.241.72 - 81.92.241.79 at -81.92.241.80 - 81.92.241.87 pl -81.92.241.88 - 81.92.241.95 ro -81.92.241.96 - 81.92.241.103 ru -81.92.241.104 - 81.92.241.111 rs -81.92.241.112 - 81.92.241.119 si -81.92.241.120 - 81.92.241.127 sk -81.92.241.128 - 81.92.241.135 cz -81.92.241.136 - 81.92.241.143 ua -81.92.241.144 - 81.92.241.159 hu -81.92.241.160 - 81.92.247.255 at -81.92.248.0 - 81.92.248.127 sk -81.92.248.128 - 81.92.248.255 at -81.92.249.0 - 81.92.249.95 sk -81.92.249.96 - 81.92.249.127 at -81.92.249.128 - 81.92.249.255 sk -81.92.250.0 - 81.92.250.63 at -81.92.250.64 - 81.92.250.95 sk -81.92.250.96 - 81.92.250.191 at -81.92.250.192 - 81.92.251.127 sk -81.92.251.128 - 81.92.251.191 at -81.92.251.192 - 81.92.252.63 sk -81.92.252.64 - 81.92.252.191 at -81.92.252.192 - 81.92.253.31 sk -81.92.253.32 - 81.92.253.127 at -81.92.253.128 - 81.92.254.55 sk -81.92.254.56 - 81.92.254.63 at -81.92.254.64 - 81.92.254.95 sk -81.92.254.96 - 81.92.255.255 at -81.93.0.0 - 81.93.19.55 fr -81.93.19.56 - 81.93.19.63 us -81.93.19.64 - 81.93.31.255 fr +81.92.192.0 - 81.92.217.255 pt +81.92.218.0 - 81.92.218.255 be +81.92.219.0 - 81.92.223.255 pt +81.92.224.0 - 81.92.237.255 fr +81.92.238.0 - 81.92.238.63 lu +81.92.238.64 - 81.92.238.191 fr +81.92.238.192 - 81.92.238.199 gr +81.92.238.200 - 81.92.238.207 lu +81.92.238.208 - 81.92.239.255 fr +81.92.240.0 - 81.92.247.255 at +81.92.248.0 - 81.92.255.255 sk +81.93.0.0 - 81.93.31.255 fr 81.93.32.0 - 81.93.47.255 it 81.93.48.0 - 81.93.63.255 nl 81.93.64.0 - 81.93.95.255 ba @@ -41617,46 +21433,14 @@ 81.93.112.0 - 81.93.127.255 de 81.93.128.0 - 81.93.159.255 se 81.93.160.0 - 81.93.175.255 no -81.93.176.0 - 81.93.178.175 fr -81.93.178.176 - 81.93.178.183 gb -81.93.178.184 - 81.93.180.151 fr -81.93.180.152 - 81.93.180.159 gb -81.93.180.160 - 81.93.184.255 fr -81.93.185.0 - 81.93.185.7 gb -81.93.185.8 - 81.93.185.31 fr -81.93.185.32 - 81.93.185.63 it -81.93.185.64 - 81.93.186.255 fr -81.93.187.0 - 81.93.187.255 es -81.93.188.0 - 81.93.188.255 fr -81.93.189.0 - 81.93.189.255 ch -81.93.190.0 - 81.93.191.255 fr +81.93.176.0 - 81.93.191.255 fr 81.93.192.0 - 81.93.207.255 hu -81.93.208.0 - 81.93.209.63 es -81.93.209.64 - 81.93.209.71 gb -81.93.209.72 - 81.93.211.23 es -81.93.211.24 - 81.93.211.31 gb -81.93.211.32 - 81.93.211.119 es -81.93.211.120 - 81.93.211.127 gb -81.93.211.128 - 81.93.211.159 es -81.93.211.160 - 81.93.211.191 gb -81.93.211.192 - 81.93.212.63 es -81.93.212.64 - 81.93.212.127 gb -81.93.212.128 - 81.93.212.159 es -81.93.212.160 - 81.93.212.175 gb -81.93.212.176 - 81.93.212.255 es -81.93.213.0 - 81.93.213.255 gb -81.93.214.0 - 81.93.214.71 es -81.93.214.72 - 81.93.214.79 gb -81.93.214.80 - 81.93.223.255 es +81.93.208.0 - 81.93.223.255 es 81.93.224.0 - 81.93.239.255 gb 81.93.240.0 - 81.93.255.255 fr 81.94.0.0 - 81.94.15.255 ba 81.94.16.0 - 81.94.47.255 ru -81.94.48.0 - 81.94.60.31 at -81.94.60.32 - 81.94.60.63 it -81.94.60.64 - 81.94.60.255 at -81.94.61.0 - 81.94.62.255 it -81.94.63.0 - 81.94.63.255 at +81.94.48.0 - 81.94.63.255 at 81.94.64.0 - 81.94.95.255 se 81.94.96.0 - 81.94.127.255 ch 81.94.128.0 - 81.94.159.255 ru @@ -41665,9 +21449,7 @@ 81.94.192.0 - 81.94.223.255 gb 81.94.224.0 - 81.94.239.255 lv 81.94.240.0 - 81.94.255.255 hu -81.95.0.0 - 81.95.10.255 de -81.95.11.0 - 81.95.11.63 sc -81.95.11.64 - 81.95.15.255 de +81.95.0.0 - 81.95.15.255 de 81.95.16.0 - 81.95.47.255 ru 81.95.48.0 - 81.95.63.255 gb 81.95.64.0 - 81.95.79.255 es @@ -41675,212 +21457,9 @@ 81.95.96.0 - 81.95.111.255 cz 81.95.112.0 - 81.95.127.255 be 81.95.128.0 - 81.95.143.255 ru -81.95.144.0 - 81.95.145.15 gb -81.95.145.16 - 81.95.145.31 us -81.95.145.32 - 81.95.145.39 pt -81.95.145.40 - 81.95.145.55 gb -81.95.145.56 - 81.95.145.63 eg -81.95.145.64 - 81.95.145.95 gb -81.95.145.96 - 81.95.145.127 us -81.95.145.128 - 81.95.145.135 ph -81.95.145.136 - 81.95.145.151 il -81.95.145.152 - 81.95.145.159 kw -81.95.145.160 - 81.95.145.167 gb -81.95.145.168 - 81.95.145.175 au -81.95.145.176 - 81.95.145.255 us -81.95.146.0 - 81.95.146.15 bd -81.95.146.16 - 81.95.146.23 us -81.95.146.24 - 81.95.146.31 dk -81.95.146.32 - 81.95.146.39 gb -81.95.146.40 - 81.95.146.47 tr -81.95.146.48 - 81.95.146.55 gb -81.95.146.56 - 81.95.146.63 bd -81.95.146.64 - 81.95.146.79 gb -81.95.146.80 - 81.95.146.87 bd -81.95.146.88 - 81.95.146.127 us -81.95.146.128 - 81.95.146.135 dk -81.95.146.136 - 81.95.146.159 bd -81.95.146.160 - 81.95.146.183 gb -81.95.146.184 - 81.95.146.191 us -81.95.146.192 - 81.95.146.199 dk -81.95.146.200 - 81.95.146.231 us -81.95.146.232 - 81.95.146.239 dk -81.95.146.240 - 81.95.147.255 us -81.95.148.0 - 81.95.148.7 ca -81.95.148.8 - 81.95.148.15 ar -81.95.148.16 - 81.95.148.23 za -81.95.148.24 - 81.95.148.47 us -81.95.148.48 - 81.95.148.63 cy -81.95.148.64 - 81.95.148.71 ro -81.95.148.72 - 81.95.148.79 ua -81.95.148.80 - 81.95.148.103 eg -81.95.148.104 - 81.95.148.111 in -81.95.148.112 - 81.95.148.127 gb -81.95.148.128 - 81.95.148.135 eg -81.95.148.136 - 81.95.148.143 za -81.95.148.144 - 81.95.148.151 ca -81.95.148.152 - 81.95.148.155 gb -81.95.148.156 - 81.95.148.159 us -81.95.148.160 - 81.95.148.167 hk -81.95.148.168 - 81.95.148.175 gb -81.95.148.176 - 81.95.148.207 gr -81.95.148.208 - 81.95.148.215 au -81.95.148.216 - 81.95.148.223 us -81.95.148.224 - 81.95.148.239 gr -81.95.148.240 - 81.95.148.247 cy -81.95.148.248 - 81.95.148.255 gr -81.95.149.0 - 81.95.149.255 gb -81.95.150.0 - 81.95.150.63 eg -81.95.150.64 - 81.95.150.79 us -81.95.150.80 - 81.95.150.87 gb -81.95.150.88 - 81.95.150.95 mu -81.95.150.96 - 81.95.150.111 us -81.95.150.112 - 81.95.150.127 br -81.95.150.128 - 81.95.150.135 in -81.95.150.136 - 81.95.150.143 nl -81.95.150.144 - 81.95.150.159 us -81.95.150.160 - 81.95.150.191 cn -81.95.150.192 - 81.95.150.207 us -81.95.150.208 - 81.95.150.215 dk -81.95.150.216 - 81.95.150.223 cy -81.95.150.224 - 81.95.150.255 gb -81.95.151.0 - 81.95.151.31 tr -81.95.151.32 - 81.95.151.39 sa -81.95.151.40 - 81.95.151.47 gb -81.95.151.48 - 81.95.151.63 us -81.95.151.64 - 81.95.151.71 gb -81.95.151.72 - 81.95.151.87 us -81.95.151.88 - 81.95.151.95 ca -81.95.151.96 - 81.95.151.111 es -81.95.151.112 - 81.95.151.119 ca -81.95.151.120 - 81.95.151.127 de -81.95.151.128 - 81.95.151.135 in -81.95.151.136 - 81.95.151.143 us -81.95.151.144 - 81.95.151.159 gb -81.95.151.160 - 81.95.151.175 cy -81.95.151.176 - 81.95.151.207 gb -81.95.151.208 - 81.95.151.215 bd -81.95.151.216 - 81.95.151.223 us -81.95.151.224 - 81.95.151.239 gb -81.95.151.240 - 81.95.151.255 tr -81.95.152.0 - 81.95.152.63 us -81.95.152.64 - 81.95.152.71 dk -81.95.152.72 - 81.95.152.79 au -81.95.152.80 - 81.95.152.87 gb -81.95.152.88 - 81.95.152.95 tr -81.95.152.96 - 81.95.152.103 us -81.95.152.104 - 81.95.152.111 ru -81.95.152.112 - 81.95.152.127 us -81.95.152.128 - 81.95.152.135 nl -81.95.152.136 - 81.95.152.143 au -81.95.152.144 - 81.95.152.151 il -81.95.152.152 - 81.95.152.183 gb -81.95.152.184 - 81.95.152.191 bd -81.95.152.192 - 81.95.152.255 us -81.95.153.0 - 81.95.153.63 cn -81.95.153.64 - 81.95.153.79 in -81.95.153.80 - 81.95.153.87 tr -81.95.153.88 - 81.95.153.95 gb -81.95.153.96 - 81.95.153.103 bd -81.95.153.104 - 81.95.153.111 us -81.95.153.112 - 81.95.153.119 dk -81.95.153.120 - 81.95.153.127 ua -81.95.153.128 - 81.95.153.159 tr -81.95.153.160 - 81.95.153.167 us -81.95.153.168 - 81.95.153.175 sg -81.95.153.176 - 81.95.153.191 ua -81.95.153.192 - 81.95.153.199 py -81.95.153.200 - 81.95.153.207 ba -81.95.153.208 - 81.95.153.215 no -81.95.153.216 - 81.95.153.223 tr -81.95.153.224 - 81.95.153.227 us -81.95.153.228 - 81.95.153.231 au -81.95.153.232 - 81.95.154.63 us -81.95.154.64 - 81.95.154.79 es -81.95.154.80 - 81.95.154.95 in -81.95.154.96 - 81.95.154.111 ca -81.95.154.112 - 81.95.154.127 dk -81.95.154.128 - 81.95.154.143 es -81.95.154.144 - 81.95.154.151 it -81.95.154.152 - 81.95.154.167 ee -81.95.154.168 - 81.95.154.175 es -81.95.154.176 - 81.95.154.191 us -81.95.154.192 - 81.95.155.31 cn -81.95.155.32 - 81.95.155.47 tr -81.95.155.48 - 81.95.155.55 il -81.95.155.56 - 81.95.155.63 ar -81.95.155.64 - 81.95.155.127 us -81.95.155.128 - 81.95.155.159 jo -81.95.155.160 - 81.95.155.167 kw -81.95.155.168 - 81.95.155.175 gb -81.95.155.176 - 81.95.155.191 kw -81.95.155.192 - 81.95.155.207 ar -81.95.155.208 - 81.95.155.215 nl -81.95.155.216 - 81.95.155.223 br -81.95.155.224 - 81.95.156.19 us -81.95.156.20 - 81.95.156.23 gb -81.95.156.24 - 81.95.156.35 us -81.95.156.36 - 81.95.156.39 jo -81.95.156.40 - 81.95.156.47 za -81.95.156.48 - 81.95.156.55 gb -81.95.156.56 - 81.95.156.71 us -81.95.156.72 - 81.95.156.79 gb -81.95.156.80 - 81.95.156.83 jo -81.95.156.84 - 81.95.156.87 us -81.95.156.88 - 81.95.156.127 gb -81.95.156.128 - 81.95.156.135 au -81.95.156.136 - 81.95.156.171 us -81.95.156.172 - 81.95.156.175 gb -81.95.156.176 - 81.95.156.183 is -81.95.156.184 - 81.95.156.199 gb -81.95.156.200 - 81.95.156.215 is -81.95.156.216 - 81.95.156.223 il -81.95.156.224 - 81.95.156.231 ch -81.95.156.232 - 81.95.156.247 tr -81.95.156.248 - 81.95.156.255 gr -81.95.157.0 - 81.95.157.7 tr -81.95.157.8 - 81.95.157.15 us -81.95.157.16 - 81.95.157.23 kw -81.95.157.24 - 81.95.157.31 gr -81.95.157.32 - 81.95.157.55 gb -81.95.157.56 - 81.95.157.71 us -81.95.157.72 - 81.95.157.79 it -81.95.157.80 - 81.95.157.119 us -81.95.157.120 - 81.95.157.127 jo -81.95.157.128 - 81.95.157.159 us -81.95.157.160 - 81.95.157.167 gr -81.95.157.168 - 81.95.157.175 us -81.95.157.176 - 81.95.157.183 in -81.95.157.184 - 81.95.157.191 kw -81.95.157.192 - 81.95.157.199 ru -81.95.157.200 - 81.95.157.207 us -81.95.157.208 - 81.95.157.215 kw -81.95.157.216 - 81.95.157.223 gb -81.95.157.224 - 81.95.157.239 it -81.95.157.240 - 81.95.157.247 au -81.95.157.248 - 81.95.158.39 us -81.95.158.40 - 81.95.158.47 ca -81.95.158.48 - 81.95.158.55 us -81.95.158.56 - 81.95.158.63 kw -81.95.158.64 - 81.95.158.71 it -81.95.158.72 - 81.95.158.75 ar -81.95.158.76 - 81.95.158.79 us -81.95.158.80 - 81.95.158.95 gb -81.95.158.96 - 81.95.158.103 us -81.95.158.104 - 81.95.158.111 gb -81.95.158.112 - 81.95.158.115 us -81.95.158.116 - 81.95.158.119 gb -81.95.158.120 - 81.95.158.127 br -81.95.158.128 - 81.95.158.135 za -81.95.158.136 - 81.95.158.159 us -81.95.158.160 - 81.95.158.167 tr -81.95.158.168 - 81.95.158.183 il -81.95.158.184 - 81.95.158.191 gb -81.95.158.192 - 81.95.158.199 kw -81.95.158.200 - 81.95.158.207 my -81.95.158.208 - 81.95.158.223 es -81.95.158.224 - 81.95.158.255 us -81.95.159.0 - 81.95.159.255 gb +81.95.144.0 - 81.95.151.95 nl +81.95.151.96 - 81.95.151.96 gb +81.95.151.97 - 81.95.159.255 nl 81.95.160.0 - 81.95.175.255 ge 81.95.176.0 - 81.95.191.255 ua 81.95.192.0 - 81.95.207.255 pl @@ -41892,14 +21471,34 @@ 81.128.0.0 - 81.159.255.255 gb 81.160.0.0 - 81.160.127.255 de 81.160.128.0 - 81.160.255.255 hu -81.161.0.0 - 81.161.127.255 de +81.161.0.0 - 81.161.15.255 ro +81.161.16.0 - 81.161.47.255 ru +81.161.48.0 - 81.161.55.255 ro +81.161.56.0 - 81.161.57.255 li +81.161.58.0 - 81.161.58.255 fr +81.161.59.0 - 81.161.59.255 ro +81.161.60.0 - 81.161.61.255 sk +81.161.62.0 - 81.161.62.255 pl +81.161.63.0 - 81.161.63.255 ru +81.161.64.0 - 81.161.95.255 cz +81.161.96.0 - 81.161.97.255 dk +81.161.98.0 - 81.161.99.255 ru +81.161.100.0 - 81.161.113.255 pl +81.161.114.0 - 81.161.114.255 ru +81.161.115.0 - 81.161.115.255 at +81.161.116.0 - 81.161.127.255 ru 81.161.128.0 - 81.161.191.255 dk 81.161.192.0 - 81.161.207.255 pl 81.161.208.0 - 81.161.223.255 ru -81.161.224.0 - 81.161.239.255 pl 81.161.240.0 - 81.161.255.255 bg -81.162.0.0 - 81.162.63.255 ru -81.162.64.0 - 81.162.79.255 ua +81.162.0.0 - 81.162.55.255 ru +81.162.56.0 - 81.162.79.255 ua +81.162.80.0 - 81.162.95.255 sk +81.162.96.0 - 81.162.127.255 ua +81.162.128.0 - 81.162.191.255 md +81.162.192.0 - 81.162.207.255 cz +81.162.208.0 - 81.162.215.255 pl +81.162.216.0 - 81.162.255.255 ua 81.163.0.0 - 81.163.7.255 ir 81.163.8.0 - 81.163.15.255 pl 81.163.16.0 - 81.163.71.255 ru @@ -41907,8 +21506,7 @@ 81.163.80.0 - 81.163.87.255 ru 81.163.88.0 - 81.163.95.255 ua 81.163.96.0 - 81.163.111.255 ru -81.163.112.0 - 81.163.127.255 ro -81.163.128.0 - 81.163.159.255 ua +81.163.112.0 - 81.163.159.255 ua 81.163.160.0 - 81.163.191.255 ru 81.163.192.0 - 81.163.207.255 pl 81.163.208.0 - 81.163.223.255 ua @@ -41921,32 +21519,49 @@ 81.169.128.0 - 81.169.255.255 de 81.170.0.0 - 81.170.127.255 gb 81.170.128.0 - 81.170.255.255 se -81.171.0.0 - 81.171.35.255 nl -81.171.36.0 - 81.171.36.31 us -81.171.36.32 - 81.171.103.255 nl -81.171.104.0 - 81.171.104.255 gr -81.171.105.0 - 81.171.127.255 nl +81.171.0.0 - 81.171.50.255 nl +81.171.51.0 - 81.171.51.255 de +81.171.52.0 - 81.171.52.31 be +81.171.52.32 - 81.171.52.63 fr +81.171.52.64 - 81.171.52.95 ch +81.171.52.96 - 81.171.52.127 hu +81.171.52.128 - 81.171.52.159 cz +81.171.52.160 - 81.171.52.191 pl +81.171.52.192 - 81.171.52.223 de +81.171.52.224 - 81.171.52.255 se +81.171.53.0 - 81.171.53.31 dk +81.171.53.32 - 81.171.53.32 nl +81.171.53.33 - 81.171.53.63 es +81.171.53.64 - 81.171.53.95 ch +81.171.53.96 - 81.171.58.255 nl +81.171.59.0 - 81.171.59.255 gb +81.171.60.0 - 81.171.68.255 nl +81.171.69.0 - 81.171.69.255 es +81.171.70.0 - 81.171.80.255 nl +81.171.81.0 - 81.171.81.255 us +81.171.82.0 - 81.171.84.255 nl +81.171.85.0 - 81.171.85.255 de +81.171.86.0 - 81.171.96.255 nl +81.171.97.0 - 81.171.97.255 gb +81.171.98.0 - 81.171.106.255 nl +81.171.107.0 - 81.171.107.255 fr +81.171.108.0 - 81.171.108.255 us +81.171.109.0 - 81.171.109.255 nl +81.171.110.0 - 81.171.110.255 us +81.171.111.0 - 81.171.115.255 nl +81.171.116.0 - 81.171.120.255 de +81.171.121.0 - 81.171.127.255 nl 81.171.128.0 - 81.171.255.255 gb 81.172.0.0 - 81.172.127.255 es 81.172.128.0 - 81.172.255.255 se -81.173.0.0 - 81.173.29.255 nl -81.173.30.0 - 81.173.30.255 us -81.173.31.0 - 81.173.127.255 nl +81.173.0.0 - 81.173.127.255 nl 81.173.128.0 - 81.173.255.255 de 81.174.0.0 - 81.174.127.255 it 81.174.128.0 - 81.174.255.255 gb 81.175.0.0 - 81.175.63.255 no 81.175.64.0 - 81.175.127.255 nl 81.175.128.0 - 81.175.255.255 fi -81.176.0.0 - 81.176.66.127 ru -81.176.66.128 - 81.176.66.143 cy -81.176.66.144 - 81.176.78.95 ru -81.176.78.96 - 81.176.78.111 cy -81.176.78.112 - 81.177.5.239 ru -81.177.5.240 - 81.177.5.255 cy -81.177.6.0 - 81.177.37.127 ru -81.177.37.128 - 81.177.37.191 us -81.177.37.192 - 81.177.255.255 ru +81.176.0.0 - 81.177.255.255 ru 81.178.0.0 - 81.179.255.255 gb 81.180.0.0 - 81.180.63.255 ro 81.180.64.0 - 81.180.79.255 md @@ -41961,9 +21576,7 @@ 81.186.240.0 - 81.186.255.255 se 81.187.0.0 - 81.187.255.255 gb 81.188.0.0 - 81.188.255.255 be -81.189.0.0 - 81.189.132.148 at -81.189.132.149 - 81.189.132.149 sk -81.189.132.150 - 81.189.255.255 at +81.189.0.0 - 81.189.255.255 at 81.190.0.0 - 81.190.255.255 pl 81.191.0.0 - 81.191.255.255 no 81.192.0.0 - 81.192.255.255 ma @@ -41973,83 +21586,23 @@ 81.196.0.0 - 81.196.255.255 ro 81.197.0.0 - 81.197.255.255 fi 81.198.0.0 - 81.198.255.255 lv -81.199.0.0 - 81.199.0.255 ng -81.199.1.0 - 81.199.3.255 a2 -81.199.4.0 - 81.199.4.255 ke -81.199.5.0 - 81.199.7.255 ng -81.199.8.0 - 81.199.8.255 cd -81.199.9.0 - 81.199.9.255 ng -81.199.10.0 - 81.199.15.255 a2 +81.199.0.0 - 81.199.1.255 a2 +81.199.2.0 - 81.199.2.255 ga +81.199.3.0 - 81.199.15.255 a2 81.199.16.0 - 81.199.31.255 ug -81.199.32.0 - 81.199.39.255 a2 -81.199.40.0 - 81.199.40.7 ng -81.199.40.8 - 81.199.40.63 a2 -81.199.40.64 - 81.199.40.95 ng -81.199.40.96 - 81.199.42.127 a2 -81.199.42.128 - 81.199.44.31 ng -81.199.44.32 - 81.199.46.159 a2 -81.199.46.160 - 81.199.46.191 ng -81.199.46.192 - 81.199.46.223 a2 -81.199.46.224 - 81.199.46.255 ng -81.199.47.0 - 81.199.49.223 a2 -81.199.49.224 - 81.199.49.255 mw -81.199.50.0 - 81.199.54.255 a2 -81.199.55.0 - 81.199.55.32 ng -81.199.55.33 - 81.199.57.215 a2 -81.199.57.216 - 81.199.57.255 tz -81.199.58.0 - 81.199.60.255 a2 -81.199.61.0 - 81.199.61.255 zm -81.199.62.0 - 81.199.63.255 a2 -81.199.64.0 - 81.199.71.255 zm -81.199.72.0 - 81.199.75.255 a2 -81.199.76.0 - 81.199.76.255 ng -81.199.77.0 - 81.199.77.255 a2 -81.199.78.0 - 81.199.78.255 gh -81.199.79.0 - 81.199.89.255 a2 -81.199.90.0 - 81.199.90.255 ga -81.199.91.0 - 81.199.95.255 a2 -81.199.96.0 - 81.199.103.255 zm -81.199.104.0 - 81.199.111.255 a2 -81.199.112.0 - 81.199.112.255 zm -81.199.113.0 - 81.199.115.31 a2 -81.199.115.32 - 81.199.115.63 zm -81.199.115.64 - 81.199.115.95 ke -81.199.115.96 - 81.199.115.127 tz -81.199.115.128 - 81.199.115.255 a2 -81.199.116.0 - 81.199.117.255 il -81.199.118.0 - 81.199.119.255 a2 +81.199.32.0 - 81.199.63.255 a2 +81.199.64.0 - 81.199.67.255 zm +81.199.68.0 - 81.199.95.255 a2 +81.199.96.0 - 81.199.96.255 lr +81.199.97.0 - 81.199.97.255 cd +81.199.98.0 - 81.199.103.255 zm +81.199.104.0 - 81.199.118.255 a2 +81.199.119.0 - 81.199.119.255 ke 81.199.120.0 - 81.199.123.255 il -81.199.124.0 - 81.199.129.255 a2 -81.199.130.0 - 81.199.130.255 ng -81.199.131.0 - 81.199.131.255 ne -81.199.132.0 - 81.199.139.255 a2 -81.199.140.0 - 81.199.140.255 cm -81.199.141.0 - 81.199.176.127 a2 -81.199.176.128 - 81.199.176.255 ng -81.199.177.0 - 81.199.184.255 a2 +81.199.124.0 - 81.199.184.255 a2 81.199.185.0 - 81.199.185.255 ng -81.199.186.0 - 81.199.187.255 a2 -81.199.188.0 - 81.199.188.255 ng -81.199.189.0 - 81.199.189.255 a2 -81.199.190.0 - 81.199.190.63 cm -81.199.190.64 - 81.199.190.127 ng -81.199.190.128 - 81.199.190.255 a2 -81.199.191.0 - 81.199.191.31 cm -81.199.191.32 - 81.199.191.63 a2 -81.199.191.64 - 81.199.191.95 ng -81.199.191.96 - 81.199.192.255 a2 -81.199.193.0 - 81.199.193.255 zm -81.199.194.0 - 81.199.194.63 ng -81.199.194.64 - 81.199.196.223 a2 -81.199.196.224 - 81.199.196.255 ng -81.199.197.0 - 81.199.199.127 a2 -81.199.199.128 - 81.199.199.191 ng -81.199.199.192 - 81.199.199.255 a2 -81.199.200.0 - 81.199.200.255 cm -81.199.201.0 - 81.199.209.255 a2 -81.199.210.0 - 81.199.210.255 ng -81.199.211.0 - 81.199.249.255 a2 -81.199.250.0 - 81.199.255.255 il +81.199.186.0 - 81.199.251.255 a2 +81.199.252.0 - 81.199.255.255 il 81.200.0.0 - 81.200.31.255 ru 81.200.32.0 - 81.200.47.255 fr 81.200.48.0 - 81.200.63.255 cz @@ -42060,292 +21613,225 @@ 81.200.128.0 - 81.200.143.255 it 81.200.144.0 - 81.200.159.255 ru 81.200.160.0 - 81.200.175.255 se -81.200.176.0 - 81.200.190.255 fr -81.200.191.0 - 81.200.191.31 gb -81.200.191.32 - 81.200.191.63 de -81.200.191.64 - 81.200.191.95 it -81.200.191.96 - 81.200.191.127 es -81.200.191.128 - 81.200.191.159 fr -81.200.191.160 - 81.200.191.191 nl -81.200.191.192 - 81.200.191.255 fr +81.200.176.0 - 81.200.191.255 fr 81.200.192.0 - 81.200.207.255 de 81.200.208.0 - 81.200.223.255 ru 81.200.224.0 - 81.200.239.255 it 81.200.240.0 - 81.200.255.255 ru 81.201.0.0 - 81.201.15.255 it 81.201.16.0 - 81.201.31.255 ru -81.201.32.0 - 81.201.43.15 de -81.201.43.16 - 81.201.43.23 gb -81.201.43.24 - 81.201.47.255 de +81.201.32.0 - 81.201.47.255 de 81.201.48.0 - 81.201.63.255 cz 81.201.64.0 - 81.201.79.255 ru -81.201.80.0 - 81.201.95.255 be -81.201.96.0 - 81.201.99.247 de -81.201.99.248 - 81.201.99.255 gb -81.201.100.0 - 81.201.112.159 de -81.201.112.160 - 81.201.112.191 gb -81.201.112.192 - 81.201.115.47 de -81.201.115.48 - 81.201.115.63 gb -81.201.115.64 - 81.201.127.255 de +81.201.80.0 - 81.201.85.255 be +81.201.86.0 - 81.201.86.127 hk +81.201.86.128 - 81.201.95.255 be +81.201.96.0 - 81.201.127.255 de 81.201.128.0 - 81.201.143.255 gb -81.201.144.0 - 81.201.154.207 de -81.201.154.208 - 81.201.154.223 us -81.201.154.224 - 81.201.159.255 de +81.201.144.0 - 81.201.159.255 de 81.201.160.0 - 81.201.175.255 gb 81.201.176.0 - 81.201.191.255 fr 81.201.192.0 - 81.201.207.255 ch -81.201.208.0 - 81.201.222.7 se -81.201.222.8 - 81.201.222.15 es -81.201.222.16 - 81.201.223.255 se +81.201.208.0 - 81.201.223.255 se 81.201.224.0 - 81.201.239.255 de 81.201.240.0 - 81.201.255.255 ru 81.202.0.0 - 81.203.255.255 es 81.204.0.0 - 81.207.255.255 nl -81.208.0.0 - 81.208.0.255 a2 -81.208.1.0 - 81.208.13.255 it -81.208.14.0 - 81.208.14.255 a2 -81.208.15.0 - 81.208.127.255 it +81.208.0.0 - 81.208.127.255 it 81.208.128.0 - 81.208.255.255 gb 81.209.0.0 - 81.209.127.255 fi -81.209.128.0 - 81.209.133.63 de -81.209.133.64 - 81.209.133.87 eu -81.209.133.88 - 81.209.133.95 de -81.209.133.96 - 81.209.133.127 eu -81.209.133.128 - 81.209.133.255 de -81.209.134.0 - 81.209.134.63 eu -81.209.134.64 - 81.209.135.255 de -81.209.136.0 - 81.209.139.255 eu -81.209.140.0 - 81.209.140.127 de -81.209.140.128 - 81.209.140.191 eu -81.209.140.192 - 81.209.140.255 de -81.209.141.0 - 81.209.141.63 eu -81.209.141.64 - 81.209.141.95 de -81.209.141.96 - 81.209.141.103 eu -81.209.141.104 - 81.209.141.111 de -81.209.141.112 - 81.209.141.127 eu -81.209.141.128 - 81.209.143.71 de -81.209.143.72 - 81.209.143.95 eu -81.209.143.96 - 81.209.143.223 de -81.209.143.224 - 81.209.143.255 eu -81.209.144.0 - 81.209.149.31 de -81.209.149.32 - 81.209.149.127 eu -81.209.149.128 - 81.209.149.175 de -81.209.149.176 - 81.209.149.191 eu -81.209.149.192 - 81.209.155.255 de -81.209.156.0 - 81.209.156.255 us -81.209.157.0 - 81.209.157.255 eu -81.209.158.0 - 81.209.166.255 de -81.209.167.0 - 81.209.167.31 eu -81.209.167.32 - 81.209.167.95 de -81.209.167.96 - 81.209.167.111 eu -81.209.167.112 - 81.209.167.127 de -81.209.167.128 - 81.209.168.31 eu -81.209.168.32 - 81.209.168.63 de -81.209.168.64 - 81.209.168.95 eu -81.209.168.96 - 81.209.168.191 de -81.209.168.192 - 81.209.168.255 eu -81.209.169.0 - 81.209.169.31 de -81.209.169.32 - 81.209.169.47 eu -81.209.169.48 - 81.209.169.255 de -81.209.170.0 - 81.209.170.255 eu -81.209.171.0 - 81.209.171.127 de -81.209.171.128 - 81.209.171.255 eu -81.209.172.0 - 81.209.172.255 cz -81.209.173.0 - 81.209.173.199 dk -81.209.173.200 - 81.209.173.255 eu -81.209.174.0 - 81.209.178.127 de -81.209.178.128 - 81.209.178.143 eu -81.209.178.144 - 81.209.178.151 de -81.209.178.152 - 81.209.178.159 eu -81.209.178.160 - 81.209.178.191 de -81.209.178.192 - 81.209.178.255 eu -81.209.179.0 - 81.209.183.103 de -81.209.183.104 - 81.209.183.191 eu -81.209.183.192 - 81.209.185.255 de -81.209.186.0 - 81.209.186.255 eu -81.209.187.0 - 81.209.189.255 de -81.209.190.0 - 81.209.190.255 se -81.209.191.0 - 81.209.191.255 eu -81.209.192.0 - 81.209.198.255 de -81.209.199.0 - 81.209.199.255 eu -81.209.200.0 - 81.209.200.15 de -81.209.200.16 - 81.209.200.31 eu -81.209.200.32 - 81.209.201.15 de -81.209.201.16 - 81.209.202.39 eu -81.209.202.40 - 81.209.202.91 de -81.209.202.92 - 81.209.202.95 eu -81.209.202.96 - 81.209.202.159 de -81.209.202.160 - 81.209.202.191 eu -81.209.202.192 - 81.209.202.255 de -81.209.203.0 - 81.209.207.255 eu -81.209.208.0 - 81.209.255.255 de +81.209.128.0 - 81.209.128.255 eu +81.209.129.0 - 81.209.129.255 de +81.209.130.0 - 81.209.133.95 eu +81.209.133.96 - 81.209.133.111 de +81.209.133.112 - 81.209.143.255 eu +81.209.144.0 - 81.209.147.255 de +81.209.148.0 - 81.209.149.255 eu +81.209.150.0 - 81.209.150.255 de +81.209.151.0 - 81.209.151.255 eu +81.209.152.0 - 81.209.155.255 de +81.209.156.0 - 81.209.163.255 eu +81.209.164.0 - 81.209.165.255 de +81.209.166.0 - 81.209.178.255 eu +81.209.179.0 - 81.209.179.255 de +81.209.180.0 - 81.209.184.255 eu +81.209.185.0 - 81.209.187.255 de +81.209.188.0 - 81.209.188.255 eu +81.209.189.0 - 81.209.189.255 de +81.209.190.0 - 81.209.199.255 eu +81.209.200.0 - 81.209.201.255 de +81.209.202.0 - 81.209.203.127 eu +81.209.203.128 - 81.209.203.255 de +81.209.204.0 - 81.209.207.255 eu +81.209.208.0 - 81.209.243.255 de +81.209.244.0 - 81.209.247.255 eu +81.209.248.0 - 81.209.255.255 de 81.210.0.0 - 81.210.127.255 pl 81.210.128.0 - 81.210.255.255 de 81.211.0.0 - 81.211.127.255 ru 81.211.128.0 - 81.211.255.255 kz -81.212.0.0 - 81.215.255.255 tr +81.212.0.0 - 81.215.3.255 tr +81.215.4.0 - 81.215.7.255 us +81.215.8.0 - 81.215.255.255 tr 81.216.0.0 - 81.216.255.255 se 81.217.0.0 - 81.217.255.255 at 81.218.0.0 - 81.218.255.255 il 81.219.0.0 - 81.219.255.255 pl 81.220.0.0 - 81.220.255.255 fr 81.221.0.0 - 81.221.255.255 ch -81.222.0.0 - 81.222.63.255 ru -81.222.64.0 - 81.222.67.255 gb -81.222.68.0 - 81.222.255.255 ru +81.222.0.0 - 81.222.255.255 ru 81.223.0.0 - 81.223.255.255 at 81.224.0.0 - 81.239.255.255 se -81.240.0.0 - 81.247.255.255 be -81.248.0.0 - 81.255.255.255 fr -82.0.0.0 - 82.1.4.63 gb -82.1.4.64 - 82.1.4.79 ie -82.1.4.80 - 82.1.215.255 gb -82.1.216.0 - 82.1.216.255 ie -82.1.217.0 - 82.47.255.255 gb +81.240.0.0 - 81.246.17.255 be +81.246.18.0 - 81.246.18.255 eu +81.246.19.0 - 81.247.255.255 be +81.248.0.0 - 81.248.3.255 mq +81.248.4.0 - 81.248.4.255 gp +81.248.5.0 - 81.248.5.255 fr +81.248.6.0 - 81.248.10.255 mq +81.248.11.0 - 81.248.11.255 gp +81.248.12.0 - 81.248.14.255 mq +81.248.15.0 - 81.248.16.255 fr +81.248.17.0 - 81.248.21.255 gp +81.248.22.0 - 81.248.22.255 fr +81.248.23.0 - 81.248.27.255 gp +81.248.28.0 - 81.248.28.255 fr +81.248.29.0 - 81.248.31.255 gp +81.248.32.0 - 81.248.35.255 gf +81.248.36.0 - 81.248.36.255 fr +81.248.37.0 - 81.248.37.255 gf +81.248.38.0 - 81.248.39.255 fr +81.248.40.0 - 81.248.40.255 gf +81.248.41.0 - 81.248.41.255 fr +81.248.42.0 - 81.248.51.255 gf +81.248.52.0 - 81.248.55.255 fr +81.248.56.0 - 81.248.56.255 gf +81.248.57.0 - 81.248.59.255 fr +81.248.60.0 - 81.248.60.255 gf +81.248.61.0 - 81.248.61.255 fr +81.248.62.0 - 81.248.62.255 gf +81.248.63.0 - 81.248.67.255 fr +81.248.68.0 - 81.248.69.255 mq +81.248.70.0 - 81.248.71.255 fr +81.248.72.0 - 81.248.73.255 mq +81.248.74.0 - 81.248.74.255 fr +81.248.75.0 - 81.248.81.255 mq +81.248.82.0 - 81.248.82.255 fr +81.248.83.0 - 81.248.83.255 mq +81.248.84.0 - 81.248.84.255 fr +81.248.85.0 - 81.248.86.255 mq +81.248.87.0 - 81.248.87.255 fr +81.248.88.0 - 81.248.88.255 mq +81.248.89.0 - 81.248.89.255 fr +81.248.90.0 - 81.248.91.255 mq +81.248.92.0 - 81.248.93.255 fr +81.248.94.0 - 81.248.94.255 mq +81.248.95.0 - 81.248.103.255 fr +81.248.104.0 - 81.248.104.255 mq +81.248.105.0 - 81.248.105.255 fr +81.248.106.0 - 81.248.106.255 mq +81.248.107.0 - 81.248.107.255 fr +81.248.108.0 - 81.248.109.255 mq +81.248.110.0 - 81.248.115.255 fr +81.248.116.0 - 81.248.116.255 mq +81.248.117.0 - 81.248.117.255 fr +81.248.118.0 - 81.248.120.255 mq +81.248.121.0 - 81.248.121.255 fr +81.248.122.0 - 81.248.124.255 mq +81.248.125.0 - 81.248.131.255 fr +81.248.132.0 - 81.248.132.255 gp +81.248.133.0 - 81.248.136.255 fr +81.248.137.0 - 81.248.139.255 gp +81.248.140.0 - 81.248.140.255 fr +81.248.141.0 - 81.248.142.255 gp +81.248.143.0 - 81.248.145.255 fr +81.248.146.0 - 81.248.147.255 gp +81.248.148.0 - 81.248.149.255 fr +81.248.150.0 - 81.248.152.255 gp +81.248.153.0 - 81.248.157.255 fr +81.248.158.0 - 81.248.159.255 gp +81.248.160.0 - 81.248.168.255 fr +81.248.169.0 - 81.248.170.255 gp +81.248.171.0 - 81.248.172.255 fr +81.248.173.0 - 81.248.174.255 gp +81.248.175.0 - 81.248.176.255 fr +81.248.177.0 - 81.248.183.255 gp +81.248.184.0 - 81.248.185.255 fr +81.248.186.0 - 81.248.186.255 gp +81.248.187.0 - 81.248.187.255 fr +81.248.188.0 - 81.248.188.255 gp +81.248.189.0 - 81.248.191.255 fr +81.248.192.0 - 81.248.195.255 re +81.248.196.0 - 81.248.197.255 fr +81.248.198.0 - 81.248.199.255 re +81.248.200.0 - 81.248.203.255 fr +81.248.204.0 - 81.248.206.255 re +81.248.207.0 - 81.248.208.13 fr +81.248.208.14 - 81.248.208.14 re +81.248.208.15 - 81.248.208.255 fr +81.248.209.0 - 81.248.214.255 re +81.248.215.0 - 81.248.215.255 fr +81.248.216.0 - 81.248.218.255 re +81.248.219.0 - 81.248.219.255 fr +81.248.220.0 - 81.248.220.255 re +81.248.221.0 - 81.248.221.255 fr +81.248.222.0 - 81.248.222.255 re +81.248.223.0 - 81.248.223.38 fr +81.248.223.39 - 81.248.223.39 re +81.248.223.40 - 81.248.223.215 fr +81.248.223.216 - 81.248.223.216 re +81.248.223.217 - 81.248.223.255 fr +81.248.224.0 - 81.248.227.255 re +81.248.228.0 - 81.248.228.255 fr +81.248.229.0 - 81.248.231.255 re +81.248.232.0 - 81.248.240.255 fr +81.248.241.0 - 81.248.241.255 re +81.248.242.0 - 81.248.242.255 fr +81.248.243.0 - 81.248.250.255 re +81.248.251.0 - 81.248.252.28 fr +81.248.252.29 - 81.248.252.29 re +81.248.252.30 - 81.248.252.255 fr +81.248.253.0 - 81.248.253.255 re +81.248.254.0 - 81.248.254.255 fr +81.248.255.0 - 81.248.255.255 re +81.249.0.0 - 81.253.67.255 fr +81.253.68.0 - 81.253.71.255 eu +81.253.72.0 - 81.255.155.128 fr +81.255.155.129 - 81.255.155.129 eu +81.255.155.130 - 81.255.255.255 fr +82.0.0.0 - 82.45.149.221 gb +82.45.149.222 - 82.45.149.222 eu +82.45.149.223 - 82.47.255.255 gb 82.48.0.0 - 82.63.255.255 it 82.64.0.0 - 82.67.255.255 fr 82.68.0.0 - 82.71.255.255 gb 82.72.0.0 - 82.75.255.255 nl -82.76.0.0 - 82.78.235.255 ro -82.78.236.0 - 82.78.237.255 sk -82.78.238.0 - 82.79.255.255 ro -82.80.0.0 - 82.80.241.183 il -82.80.241.184 - 82.80.241.191 a2 -82.80.241.192 - 82.81.255.255 il +82.76.0.0 - 82.79.255.255 ro +82.80.0.0 - 82.81.255.255 il 82.82.0.0 - 82.83.255.255 de -82.84.0.0 - 82.85.175.255 it -82.85.176.0 - 82.85.176.255 a2 -82.85.177.0 - 82.85.255.255 it +82.84.0.0 - 82.85.255.255 it 82.86.0.0 - 82.87.255.255 es 82.88.0.0 - 82.91.255.255 it 82.92.0.0 - 82.95.255.255 nl -82.96.0.0 - 82.96.6.255 se -82.96.7.0 - 82.96.7.255 dk -82.96.8.0 - 82.96.40.175 se -82.96.40.176 - 82.96.40.191 nl -82.96.40.192 - 82.96.47.159 se -82.96.47.160 - 82.96.47.175 no -82.96.47.176 - 82.96.61.223 se -82.96.61.224 - 82.96.61.239 fr -82.96.61.240 - 82.96.62.15 se -82.96.62.16 - 82.96.62.31 de -82.96.62.32 - 82.96.62.135 se -82.96.62.136 - 82.96.62.151 gb -82.96.62.152 - 82.96.62.231 se -82.96.62.232 - 82.96.62.235 gb -82.96.62.236 - 82.96.63.255 se +82.96.0.0 - 82.96.63.255 se 82.96.64.0 - 82.96.127.255 de 82.96.128.0 - 82.96.191.255 fr 82.96.192.0 - 82.96.255.255 ru -82.97.0.0 - 82.97.10.47 fr -82.97.10.48 - 82.97.10.63 mc -82.97.10.64 - 82.97.10.111 fr -82.97.10.112 - 82.97.10.127 mc -82.97.10.128 - 82.97.14.79 fr -82.97.14.80 - 82.97.14.111 mc -82.97.14.112 - 82.97.16.15 fr -82.97.16.16 - 82.97.16.31 mc -82.97.16.32 - 82.97.16.95 fr -82.97.16.96 - 82.97.16.111 ch -82.97.16.112 - 82.97.16.127 fr -82.97.16.128 - 82.97.16.143 mc -82.97.16.144 - 82.97.16.255 fr -82.97.17.0 - 82.97.17.31 gb -82.97.17.32 - 82.97.17.63 fr -82.97.17.64 - 82.97.17.95 mc -82.97.17.96 - 82.97.18.191 fr -82.97.18.192 - 82.97.19.15 mc -82.97.19.16 - 82.97.19.255 fr -82.97.20.0 - 82.97.20.63 mc -82.97.20.64 - 82.97.20.255 fr -82.97.21.0 - 82.97.21.63 mc -82.97.21.64 - 82.97.21.255 fr -82.97.22.0 - 82.97.22.15 mc -82.97.22.16 - 82.97.22.255 fr -82.97.23.0 - 82.97.23.31 mc -82.97.23.32 - 82.97.63.255 fr +82.97.0.0 - 82.97.63.255 fr 82.97.64.0 - 82.97.191.255 de -82.97.192.0 - 82.97.255.255 ru +82.97.192.0 - 82.97.247.255 ru +82.97.248.0 - 82.97.255.255 ir 82.98.0.0 - 82.98.63.255 fr -82.98.64.0 - 82.98.68.128 de -82.98.68.129 - 82.98.68.143 ch -82.98.68.144 - 82.98.70.55 de -82.98.70.56 - 82.98.70.63 ch -82.98.70.64 - 82.98.75.223 de -82.98.75.224 - 82.98.75.231 gb -82.98.75.232 - 82.98.75.235 de -82.98.75.236 - 82.98.75.239 ch -82.98.75.240 - 82.98.85.99 de -82.98.85.100 - 82.98.85.103 ch -82.98.85.104 - 82.98.92.191 de -82.98.92.192 - 82.98.93.255 li -82.98.94.0 - 82.98.97.175 de -82.98.97.176 - 82.98.97.207 gb -82.98.97.208 - 82.98.110.147 de -82.98.110.148 - 82.98.110.151 ch -82.98.110.152 - 82.98.110.255 de -82.98.111.0 - 82.98.111.31 us -82.98.111.32 - 82.98.111.143 de -82.98.111.144 - 82.98.111.175 gb -82.98.111.176 - 82.98.111.239 de -82.98.111.240 - 82.98.111.255 gb -82.98.112.0 - 82.98.112.255 li -82.98.113.0 - 82.98.113.255 ch -82.98.114.0 - 82.98.115.255 li -82.98.116.0 - 82.98.120.71 de -82.98.120.72 - 82.98.120.79 sk -82.98.120.80 - 82.98.127.255 de -82.98.128.0 - 82.98.146.255 es -82.98.147.0 - 82.98.147.255 ve -82.98.148.0 - 82.98.191.255 es +82.98.64.0 - 82.98.127.255 de +82.98.128.0 - 82.98.191.255 es 82.98.192.0 - 82.98.199.255 gb -82.98.200.0 - 82.98.200.255 eu -82.98.201.0 - 82.98.201.255 de -82.98.202.0 - 82.98.208.255 eu -82.98.209.0 - 82.98.209.255 de -82.98.210.0 - 82.98.210.255 eu -82.98.211.0 - 82.98.211.63 de -82.98.211.64 - 82.98.215.255 eu -82.98.216.0 - 82.98.216.255 de -82.98.217.0 - 82.98.221.255 eu -82.98.222.0 - 82.98.222.127 de -82.98.222.128 - 82.98.223.255 eu -82.98.224.0 - 82.98.224.127 fr -82.98.224.128 - 82.98.226.127 eu -82.98.226.128 - 82.98.226.143 fr -82.98.226.144 - 82.98.227.255 eu -82.98.228.0 - 82.98.228.255 fr -82.98.229.0 - 82.98.231.255 eu -82.98.232.0 - 82.98.239.255 gb -82.98.240.0 - 82.98.242.255 nl -82.98.243.0 - 82.98.247.255 gb -82.98.248.0 - 82.98.248.255 nl -82.98.249.0 - 82.98.252.255 gb -82.98.253.0 - 82.98.254.255 nl -82.98.255.0 - 82.98.255.255 gb -82.99.0.0 - 82.99.11.255 se -82.99.12.0 - 82.99.12.63 fi -82.99.12.64 - 82.99.13.223 se -82.99.13.224 - 82.99.13.255 fi -82.99.14.0 - 82.99.14.191 se -82.99.14.192 - 82.99.14.255 no -82.99.15.0 - 82.99.17.159 se -82.99.17.160 - 82.99.17.191 no -82.99.17.192 - 82.99.25.95 se -82.99.25.96 - 82.99.25.127 no -82.99.25.128 - 82.99.29.127 se -82.99.29.128 - 82.99.29.255 no -82.99.30.0 - 82.99.30.127 se -82.99.30.128 - 82.99.30.255 dk -82.99.31.0 - 82.99.37.255 se -82.99.38.0 - 82.99.38.7 no -82.99.38.8 - 82.99.49.255 se -82.99.50.0 - 82.99.50.63 no -82.99.50.64 - 82.99.52.191 se -82.99.52.192 - 82.99.52.255 no -82.99.53.0 - 82.99.53.63 se -82.99.53.64 - 82.99.53.79 no -82.99.53.80 - 82.99.127.255 se +82.98.200.0 - 82.98.231.255 eu +82.98.232.0 - 82.98.255.255 gb +82.99.0.0 - 82.99.11.215 se +82.99.11.216 - 82.99.11.223 fi +82.99.11.224 - 82.99.11.255 se +82.99.12.0 - 82.99.12.255 fi +82.99.13.0 - 82.99.127.255 se 82.99.128.0 - 82.99.191.255 cz 82.99.192.0 - 82.99.255.255 ir 82.100.0.0 - 82.100.63.255 cz @@ -42356,147 +21842,79 @@ 82.101.64.0 - 82.101.127.255 bg 82.101.128.0 - 82.101.191.255 dz 82.101.192.0 - 82.101.255.255 nl -82.102.0.0 - 82.102.63.255 pt +82.102.0.0 - 82.102.4.255 pt +82.102.5.0 - 82.102.6.255 se +82.102.7.0 - 82.102.63.255 pt 82.102.64.0 - 82.102.127.255 cy 82.102.128.0 - 82.102.191.255 il 82.102.192.0 - 82.102.255.255 ps 82.103.0.0 - 82.103.63.255 at 82.103.64.0 - 82.103.127.255 bg -82.103.128.0 - 82.103.191.255 dk +82.103.128.0 - 82.103.143.255 dk +82.103.144.0 - 82.103.159.255 de +82.103.160.0 - 82.103.191.255 dk 82.103.192.0 - 82.103.255.255 fi 82.104.0.0 - 82.107.255.255 it -82.108.0.0 - 82.111.75.255 gb -82.111.76.0 - 82.111.76.8 de -82.111.76.9 - 82.111.76.15 gb -82.111.76.16 - 82.111.76.47 de -82.111.76.48 - 82.111.76.63 gb -82.111.76.64 - 82.111.76.95 de -82.111.76.96 - 82.111.152.95 gb -82.111.152.96 - 82.111.152.111 it -82.111.152.112 - 82.111.255.255 gb -82.112.0.0 - 82.112.5.255 ru -82.112.6.0 - 82.112.6.255 kz -82.112.7.0 - 82.112.63.255 ru +82.108.0.0 - 82.111.255.255 gb +82.112.0.0 - 82.112.63.255 ru 82.112.64.0 - 82.112.95.255 is -82.112.96.0 - 82.112.96.127 pl -82.112.96.128 - 82.112.96.255 fr -82.112.97.0 - 82.112.97.255 gb -82.112.98.0 - 82.112.98.31 fr -82.112.98.32 - 82.112.98.127 gb -82.112.98.128 - 82.112.98.255 fr -82.112.99.0 - 82.112.99.255 es -82.112.100.0 - 82.112.102.255 gb -82.112.103.0 - 82.112.103.255 de -82.112.104.0 - 82.112.105.255 gb -82.112.106.0 - 82.112.107.23 de -82.112.107.24 - 82.112.107.27 be -82.112.107.28 - 82.112.107.31 nl -82.112.107.32 - 82.112.107.35 it -82.112.107.36 - 82.112.107.39 ru -82.112.107.40 - 82.112.107.43 gb -82.112.107.44 - 82.112.107.47 de -82.112.107.48 - 82.112.107.63 gb -82.112.107.64 - 82.112.107.95 de -82.112.107.96 - 82.112.107.255 gb -82.112.108.0 - 82.112.109.31 de -82.112.109.32 - 82.112.109.39 gb -82.112.109.40 - 82.112.109.47 de -82.112.109.48 - 82.112.109.63 gb -82.112.109.64 - 82.112.109.255 de -82.112.110.0 - 82.112.111.255 fr -82.112.112.0 - 82.112.113.159 gb -82.112.113.160 - 82.112.113.175 ie -82.112.113.176 - 82.112.113.207 gb -82.112.113.208 - 82.112.113.223 ie -82.112.113.224 - 82.112.123.39 gb -82.112.123.40 - 82.112.123.47 es -82.112.123.48 - 82.112.123.239 gb -82.112.123.240 - 82.112.123.255 ae -82.112.124.0 - 82.112.126.15 gb -82.112.126.16 - 82.112.126.23 es -82.112.126.24 - 82.112.126.255 gb -82.112.127.0 - 82.112.127.255 fr +82.112.96.0 - 82.112.96.255 fr +82.112.97.0 - 82.112.105.255 gb +82.112.106.0 - 82.112.106.255 de +82.112.107.0 - 82.112.107.27 gb +82.112.107.28 - 82.112.107.28 nl +82.112.107.29 - 82.112.127.255 gb 82.112.128.0 - 82.112.159.255 je 82.112.160.0 - 82.112.167.255 lb 82.112.168.0 - 82.112.175.255 gb 82.112.176.0 - 82.112.191.255 ru -82.112.192.0 - 82.112.223.199 it -82.112.223.200 - 82.112.223.207 es -82.112.223.208 - 82.112.223.255 it +82.112.192.0 - 82.112.223.255 it 82.112.224.0 - 82.112.255.255 gb 82.113.0.0 - 82.113.31.255 mc 82.113.32.0 - 82.113.63.255 cz 82.113.64.0 - 82.113.95.255 gb 82.113.96.0 - 82.113.127.255 de -82.113.128.0 - 82.113.134.159 gb -82.113.134.160 - 82.113.134.191 nz -82.113.134.192 - 82.113.137.207 gb -82.113.137.208 - 82.113.137.215 za -82.113.137.216 - 82.113.191.255 gb +82.113.128.0 - 82.113.191.255 gb 82.113.192.0 - 82.113.223.255 it 82.113.224.0 - 82.113.255.255 gb 82.114.0.0 - 82.114.31.255 ru 82.114.32.0 - 82.114.63.255 cy -82.114.64.0 - 82.114.67.255 al -82.114.68.0 - 82.114.76.175 rs -82.114.76.176 - 82.114.76.183 al -82.114.76.184 - 82.114.81.143 rs -82.114.81.144 - 82.114.81.151 al -82.114.81.152 - 82.114.89.159 rs -82.114.89.160 - 82.114.89.171 al -82.114.89.172 - 82.114.89.207 rs -82.114.89.208 - 82.114.89.208 al -82.114.89.209 - 82.114.89.219 rs -82.114.89.220 - 82.114.89.227 al -82.114.89.228 - 82.114.90.235 rs -82.114.90.236 - 82.114.90.239 al -82.114.90.240 - 82.114.91.159 rs -82.114.91.160 - 82.114.92.255 al -82.114.93.0 - 82.114.93.127 rs -82.114.93.128 - 82.114.93.191 al -82.114.93.192 - 82.114.95.255 rs -82.114.96.0 - 82.114.142.127 ru -82.114.142.128 - 82.114.142.255 ar -82.114.143.0 - 82.114.159.255 ru +82.114.64.0 - 82.114.90.127 al +82.114.90.128 - 82.114.90.151 rs +82.114.90.152 - 82.114.91.95 al +82.114.91.96 - 82.114.91.127 rs +82.114.91.128 - 82.114.95.255 al +82.114.96.0 - 82.114.159.255 ru 82.114.160.0 - 82.114.191.255 ye 82.114.192.0 - 82.114.223.255 cz 82.114.224.0 - 82.114.255.255 ru -82.115.0.0 - 82.115.21.255 ir -82.115.22.0 - 82.115.31.255 kw +82.115.0.0 - 82.115.14.255 ir +82.115.15.0 - 82.115.15.255 nl +82.115.16.0 - 82.115.21.255 ir +82.115.22.0 - 82.115.23.8 kw +82.115.23.9 - 82.115.23.9 ir +82.115.23.10 - 82.115.28.255 kw +82.115.29.0 - 82.115.31.255 ir 82.115.32.0 - 82.115.63.255 kz 82.115.64.0 - 82.115.95.255 pl 82.115.96.0 - 82.115.127.255 de 82.115.128.0 - 82.115.159.255 se 82.115.160.0 - 82.115.191.255 it 82.115.192.0 - 82.115.207.255 se -82.115.208.0 - 82.115.223.255 ru 82.115.224.0 - 82.115.255.255 gb 82.116.0.0 - 82.116.63.255 ru 82.116.64.0 - 82.116.95.255 no -82.116.96.0 - 82.116.128.255 de -82.116.129.0 - 82.116.129.255 sy -82.116.130.0 - 82.116.131.255 kw +82.116.96.0 - 82.116.131.255 de 82.116.132.0 - 82.116.135.255 gb -82.116.136.0 - 82.116.136.127 de -82.116.136.128 - 82.116.136.143 gb -82.116.136.144 - 82.116.136.191 kw -82.116.136.192 - 82.116.137.127 de -82.116.137.128 - 82.116.137.159 gb -82.116.137.160 - 82.116.138.15 kw -82.116.138.16 - 82.116.138.31 gb -82.116.138.32 - 82.116.139.63 kw -82.116.139.64 - 82.116.139.95 gb -82.116.139.96 - 82.116.139.127 de -82.116.139.128 - 82.116.143.255 kw -82.116.144.0 - 82.116.147.255 de -82.116.148.0 - 82.116.158.255 kw -82.116.159.0 - 82.116.159.255 us +82.116.136.0 - 82.116.139.255 de +82.116.140.0 - 82.116.140.255 sa +82.116.141.0 - 82.116.148.255 de +82.116.149.0 - 82.116.157.255 kw +82.116.158.0 - 82.116.159.255 de 82.116.160.0 - 82.116.191.255 es 82.116.192.0 - 82.116.223.255 cy 82.116.224.0 - 82.116.255.255 fi -82.117.0.0 - 82.117.10.31 li -82.117.10.32 - 82.117.10.39 ch -82.117.10.40 - 82.117.31.255 li +82.117.0.0 - 82.117.31.255 li 82.117.32.0 - 82.117.63.255 no 82.117.64.0 - 82.117.95.255 ru 82.117.96.0 - 82.117.127.255 se @@ -42512,27 +21930,15 @@ 82.118.65.0 - 82.118.65.15 us 82.118.65.16 - 82.118.65.63 gb 82.118.65.64 - 82.118.65.95 us -82.118.65.96 - 82.118.65.103 gb -82.118.65.104 - 82.118.65.111 us -82.118.65.112 - 82.118.65.175 gb -82.118.65.176 - 82.118.65.191 sa -82.118.65.192 - 82.118.67.255 gb -82.118.68.0 - 82.118.69.255 nl -82.118.70.0 - 82.118.73.239 gb -82.118.73.240 - 82.118.73.255 jp -82.118.74.0 - 82.118.79.191 gb -82.118.79.192 - 82.118.79.223 us -82.118.79.224 - 82.118.127.255 gb -82.118.128.0 - 82.118.133.31 ru -82.118.133.32 - 82.118.133.39 ua -82.118.133.40 - 82.118.145.255 ru -82.118.146.0 - 82.118.147.255 ch -82.118.148.0 - 82.118.150.255 ru -82.118.151.0 - 82.118.151.0 cz -82.118.151.1 - 82.118.159.255 ru +82.118.65.96 - 82.118.68.255 gb +82.118.69.0 - 82.118.69.255 nl +82.118.70.0 - 82.118.127.255 gb +82.118.128.0 - 82.118.159.255 ru 82.118.160.0 - 82.118.191.255 sa 82.118.192.0 - 82.118.223.255 fi -82.118.224.0 - 82.118.255.255 bg +82.118.224.0 - 82.118.229.255 bg +82.118.230.0 - 82.118.230.255 gb +82.118.231.0 - 82.118.255.255 bg 82.119.0.0 - 82.119.31.255 de 82.119.32.0 - 82.119.63.255 it 82.119.64.0 - 82.119.95.255 bg @@ -42545,33 +21951,13 @@ 82.120.0.0 - 82.127.255.255 fr 82.128.0.0 - 82.128.127.255 ng 82.128.128.0 - 82.128.255.255 fi -82.129.0.0 - 82.129.12.255 de -82.129.13.0 - 82.129.13.255 at -82.129.14.0 - 82.129.17.255 de -82.129.18.0 - 82.129.18.255 nl -82.129.19.0 - 82.129.19.255 de +82.129.0.0 - 82.129.19.255 eu 82.129.20.0 - 82.129.20.255 dk -82.129.21.0 - 82.129.23.255 de -82.129.24.0 - 82.129.24.191 nl -82.129.24.192 - 82.129.24.255 de -82.129.25.0 - 82.129.25.255 nl -82.129.26.0 - 82.129.26.63 de -82.129.26.64 - 82.129.26.127 se -82.129.26.128 - 82.129.26.255 de -82.129.27.0 - 82.129.27.255 bg -82.129.28.0 - 82.129.32.143 de -82.129.32.144 - 82.129.32.159 at -82.129.32.160 - 82.129.33.255 de -82.129.34.0 - 82.129.34.255 nl -82.129.35.0 - 82.129.38.127 de -82.129.38.128 - 82.129.38.159 nl -82.129.38.160 - 82.129.38.167 ch -82.129.38.168 - 82.129.38.191 de -82.129.38.192 - 82.129.38.255 se -82.129.39.0 - 82.129.39.255 de +82.129.21.0 - 82.129.39.255 eu 82.129.40.0 - 82.129.43.255 cz -82.129.44.0 - 82.129.63.255 de -82.129.64.0 - 82.129.127.255 gb +82.129.44.0 - 82.129.71.255 eu +82.129.72.0 - 82.129.79.255 es +82.129.80.0 - 82.129.127.255 eu 82.129.128.0 - 82.129.255.255 eg 82.130.0.0 - 82.130.63.255 fi 82.130.64.0 - 82.130.127.255 ch @@ -42580,17 +21966,7 @@ 82.131.128.0 - 82.131.255.255 hu 82.132.0.0 - 82.132.127.255 hr 82.132.128.0 - 82.133.127.255 gb -82.133.128.0 - 82.133.159.159 fi -82.133.159.160 - 82.133.159.167 ax -82.133.159.168 - 82.133.183.31 fi -82.133.183.32 - 82.133.183.39 ax -82.133.183.40 - 82.133.183.87 fi -82.133.183.88 - 82.133.183.95 ax -82.133.183.96 - 82.133.212.143 fi -82.133.212.144 - 82.133.212.175 ax -82.133.212.176 - 82.133.221.39 fi -82.133.221.40 - 82.133.221.47 ax -82.133.221.48 - 82.133.255.255 fi +82.133.128.0 - 82.133.255.255 fi 82.134.0.0 - 82.134.127.255 no 82.134.128.0 - 82.134.255.255 nl 82.135.0.0 - 82.135.127.255 de @@ -42604,91 +21980,8 @@ 82.137.128.0 - 82.137.191.255 ru 82.137.192.0 - 82.137.255.255 sy 82.138.0.0 - 82.138.63.255 ru -82.138.64.0 - 82.138.66.47 fr -82.138.66.48 - 82.138.66.63 be -82.138.66.64 - 82.138.70.79 fr -82.138.70.80 - 82.138.70.95 be -82.138.70.96 - 82.138.70.191 fr -82.138.70.192 - 82.138.70.223 be -82.138.70.224 - 82.138.72.15 fr -82.138.72.16 - 82.138.72.31 ch -82.138.72.32 - 82.138.72.159 fr -82.138.72.160 - 82.138.72.175 ch -82.138.72.176 - 82.138.76.143 fr -82.138.76.144 - 82.138.76.191 be -82.138.76.192 - 82.138.94.63 fr -82.138.94.64 - 82.138.94.127 ch -82.138.94.128 - 82.138.127.255 fr -82.138.128.0 - 82.138.128.31 be -82.138.128.32 - 82.138.129.31 eu -82.138.129.32 - 82.138.129.95 be -82.138.129.96 - 82.138.129.127 fr -82.138.129.128 - 82.138.129.255 fi -82.138.130.0 - 82.138.130.7 be -82.138.130.8 - 82.138.130.15 eu -82.138.130.16 - 82.138.130.31 de -82.138.130.32 - 82.138.130.55 be -82.138.130.56 - 82.138.130.63 gb -82.138.130.64 - 82.138.130.79 fr -82.138.130.80 - 82.138.130.87 be -82.138.130.88 - 82.138.130.95 eu -82.138.130.96 - 82.138.130.111 be -82.138.130.112 - 82.138.130.127 fr -82.138.130.128 - 82.138.130.143 be -82.138.130.144 - 82.138.130.151 eu -82.138.130.152 - 82.138.130.159 ge -82.138.130.160 - 82.138.130.215 be -82.138.130.216 - 82.138.130.223 eu -82.138.130.224 - 82.138.130.239 be -82.138.130.240 - 82.138.130.247 eu -82.138.130.248 - 82.138.130.255 be -82.138.131.0 - 82.138.131.191 br -82.138.131.192 - 82.138.131.223 fr -82.138.131.224 - 82.138.131.255 de -82.138.132.0 - 82.138.133.255 us -82.138.134.0 - 82.138.134.255 pt -82.138.135.0 - 82.138.137.255 us -82.138.138.0 - 82.138.139.255 gb -82.138.140.0 - 82.138.140.127 ir -82.138.140.128 - 82.138.140.191 eu -82.138.140.192 - 82.138.140.223 es -82.138.140.224 - 82.138.140.255 be -82.138.141.0 - 82.138.141.255 fr -82.138.142.0 - 82.138.142.127 pr -82.138.142.128 - 82.138.142.255 pt -82.138.143.0 - 82.138.143.255 es -82.138.144.0 - 82.138.147.255 gb -82.138.148.0 - 82.138.149.255 es -82.138.150.0 - 82.138.151.255 gb -82.138.152.0 - 82.138.153.255 be -82.138.154.0 - 82.138.155.255 fr -82.138.156.0 - 82.138.157.255 be -82.138.158.0 - 82.138.158.127 eu -82.138.158.128 - 82.138.158.255 es -82.138.159.0 - 82.138.159.255 eu -82.138.160.0 - 82.138.161.255 dk -82.138.162.0 - 82.138.162.255 eu -82.138.163.0 - 82.138.163.31 gb -82.138.163.32 - 82.138.163.63 eu -82.138.163.64 - 82.138.163.95 se -82.138.163.96 - 82.138.163.191 be -82.138.163.192 - 82.138.163.255 fr -82.138.164.0 - 82.138.164.255 be -82.138.165.0 - 82.138.165.255 eu -82.138.166.0 - 82.138.168.127 be -82.138.168.128 - 82.138.168.191 nl -82.138.168.192 - 82.138.169.255 eu -82.138.170.0 - 82.138.171.255 gb -82.138.172.0 - 82.138.173.255 ch -82.138.174.0 - 82.138.175.255 be -82.138.176.0 - 82.138.177.255 eu -82.138.178.0 - 82.138.179.255 be -82.138.180.0 - 82.138.181.255 dk -82.138.182.0 - 82.138.183.255 es -82.138.184.0 - 82.138.185.255 be -82.138.186.0 - 82.138.187.255 ch -82.138.188.0 - 82.138.191.127 eu -82.138.191.128 - 82.138.191.255 be +82.138.64.0 - 82.138.127.255 fr +82.138.128.0 - 82.138.191.255 eu 82.138.192.0 - 82.138.255.255 gb 82.139.0.0 - 82.139.63.255 pl 82.139.64.0 - 82.139.127.255 nl @@ -42697,9 +21990,7 @@ 82.140.64.0 - 82.140.127.255 ru 82.140.128.0 - 82.140.191.255 lt 82.140.192.0 - 82.140.255.255 ru -82.141.0.0 - 82.141.26.31 de -82.141.26.32 - 82.141.26.47 nl -82.141.26.48 - 82.141.63.255 de +82.141.0.0 - 82.141.63.255 de 82.141.64.0 - 82.141.127.255 fi 82.141.128.0 - 82.141.191.255 hu 82.141.192.0 - 82.141.255.255 ie @@ -42725,16 +22016,20 @@ 82.145.96.0 - 82.145.127.255 it 82.145.128.0 - 82.145.159.255 se 82.145.160.0 - 82.145.191.255 it -82.145.192.0 - 82.145.199.255 de -82.145.200.0 - 82.145.207.255 gb -82.145.208.0 - 82.145.223.128 is -82.145.223.129 - 82.145.223.255 gb +82.145.192.0 - 82.145.201.255 de +82.145.202.0 - 82.145.207.255 gb +82.145.208.0 - 82.145.218.48 eu +82.145.218.49 - 82.145.218.49 re +82.145.218.50 - 82.145.219.135 eu +82.145.219.136 - 82.145.219.136 is +82.145.219.137 - 82.145.222.79 eu +82.145.222.80 - 82.145.222.80 is +82.145.222.81 - 82.145.223.255 eu 82.145.224.0 - 82.145.255.255 tr 82.146.0.0 - 82.146.31.255 bg -82.146.32.0 - 82.146.36.255 be -82.146.37.0 - 82.146.37.255 ru -82.146.38.0 - 82.146.39.255 be -82.146.40.0 - 82.146.63.255 ru +82.146.32.0 - 82.146.47.255 ru +82.146.48.0 - 82.146.51.255 us +82.146.52.0 - 82.146.63.255 ru 82.146.64.0 - 82.146.95.255 no 82.146.96.0 - 82.146.127.255 be 82.146.128.0 - 82.146.159.255 gb @@ -42762,75 +22057,13 @@ 82.149.128.0 - 82.149.159.255 ru 82.149.160.0 - 82.149.191.255 de 82.149.192.0 - 82.149.223.255 ru -82.149.224.0 - 82.149.226.83 de -82.149.226.84 - 82.149.226.87 ch -82.149.226.88 - 82.149.226.95 de -82.149.226.96 - 82.149.226.99 at -82.149.226.100 - 82.149.227.31 de -82.149.227.32 - 82.149.227.47 at -82.149.227.48 - 82.149.237.255 de -82.149.238.0 - 82.149.238.255 at -82.149.239.0 - 82.149.243.255 de -82.149.244.0 - 82.149.244.255 sk -82.149.245.0 - 82.149.250.255 de -82.149.251.0 - 82.149.251.255 sk -82.149.252.0 - 82.149.255.255 de -82.150.0.0 - 82.150.0.255 es -82.150.1.0 - 82.150.1.255 eu -82.150.2.0 - 82.150.3.255 es -82.150.4.0 - 82.150.4.255 ie -82.150.5.0 - 82.150.5.255 eu -82.150.6.0 - 82.150.7.31 ie -82.150.7.32 - 82.150.7.127 eu -82.150.7.128 - 82.150.7.191 ie -82.150.7.192 - 82.150.7.199 eu -82.150.7.200 - 82.150.7.207 ie -82.150.7.208 - 82.150.7.255 eu -82.150.8.0 - 82.150.8.71 hu -82.150.8.72 - 82.150.8.79 at -82.150.8.80 - 82.150.8.223 eu -82.150.8.224 - 82.150.9.255 hu -82.150.10.0 - 82.150.11.255 eu -82.150.12.0 - 82.150.12.255 es -82.150.13.0 - 82.150.15.255 eu -82.150.16.0 - 82.150.16.191 fr -82.150.16.192 - 82.150.16.223 eu -82.150.16.224 - 82.150.18.127 fr -82.150.18.128 - 82.150.18.207 eu -82.150.18.208 - 82.150.18.215 fr -82.150.18.216 - 82.150.18.239 eu -82.150.18.240 - 82.150.19.15 fr -82.150.19.16 - 82.150.19.23 eu -82.150.19.24 - 82.150.19.47 fr -82.150.19.48 - 82.150.19.111 eu -82.150.19.112 - 82.150.19.127 fr -82.150.19.128 - 82.150.19.159 eu -82.150.19.160 - 82.150.19.179 fr -82.150.19.180 - 82.150.19.183 eu -82.150.19.184 - 82.150.19.239 fr -82.150.19.240 - 82.150.19.247 eu -82.150.19.248 - 82.150.19.251 fr -82.150.19.252 - 82.150.19.255 eu +82.149.224.0 - 82.149.255.255 de +82.150.0.0 - 82.150.19.255 eu 82.150.20.0 - 82.150.23.255 ie -82.150.24.0 - 82.150.25.255 fr -82.150.26.0 - 82.150.27.255 eu -82.150.28.0 - 82.150.28.127 fr -82.150.28.128 - 82.150.28.207 cz -82.150.28.208 - 82.150.29.255 eu -82.150.30.0 - 82.150.31.255 fr +82.150.24.0 - 82.150.31.255 eu 82.150.32.0 - 82.150.63.255 hu 82.150.64.0 - 82.150.95.255 tr -82.150.96.0 - 82.150.100.255 gb -82.150.101.0 - 82.150.103.255 us -82.150.104.0 - 82.150.105.255 hk -82.150.106.0 - 82.150.106.255 jp -82.150.107.0 - 82.150.107.255 sg -82.150.108.0 - 82.150.108.255 jp -82.150.109.0 - 82.150.111.255 gb -82.150.112.0 - 82.150.113.255 us -82.150.114.0 - 82.150.115.255 hk -82.150.116.0 - 82.150.116.255 sg -82.150.117.0 - 82.150.127.255 gb +82.150.96.0 - 82.150.127.255 gb 82.150.128.0 - 82.150.159.255 nl 82.150.160.0 - 82.150.191.255 cz 82.150.192.0 - 82.150.223.255 at @@ -42849,31 +22082,42 @@ 82.160.0.0 - 82.160.255.255 pl 82.161.0.0 - 82.161.255.255 nl 82.162.0.0 - 82.162.255.255 ru -82.163.0.0 - 82.163.255.255 gb +82.163.0.0 - 82.163.94.255 gb +82.163.95.0 - 82.163.95.255 fr +82.163.96.0 - 82.163.135.255 gb +82.163.136.0 - 82.163.136.255 il +82.163.137.0 - 82.163.137.191 nl +82.163.137.192 - 82.163.137.195 gb +82.163.137.196 - 82.163.137.207 nl +82.163.137.208 - 82.163.137.211 gb +82.163.137.212 - 82.163.137.215 be +82.163.137.216 - 82.163.137.219 au +82.163.137.220 - 82.163.137.223 at +82.163.137.224 - 82.163.137.227 nl +82.163.137.228 - 82.163.137.231 ch +82.163.137.232 - 82.163.137.235 fr +82.163.137.236 - 82.163.137.239 nl +82.163.137.240 - 82.163.137.243 es +82.163.137.244 - 82.163.137.247 pt +82.163.137.248 - 82.163.137.251 ru +82.163.137.252 - 82.163.137.255 de +82.163.138.0 - 82.163.138.255 il +82.163.139.0 - 82.163.139.255 hk +82.163.140.0 - 82.163.143.255 il +82.163.144.0 - 82.163.247.255 gb +82.163.248.0 - 82.163.248.255 us +82.163.249.0 - 82.163.249.255 gb +82.163.250.0 - 82.163.250.255 us +82.163.251.0 - 82.163.255.255 gb 82.164.0.0 - 82.164.255.255 no -82.165.0.0 - 82.165.159.255 de -82.165.160.0 - 82.165.191.255 us -82.165.192.0 - 82.165.223.255 de -82.165.224.0 - 82.165.255.255 us +82.165.0.0 - 82.165.27.255 de +82.165.28.0 - 82.165.30.255 gb +82.165.31.0 - 82.165.255.255 de 82.166.0.0 - 82.166.255.255 il 82.167.0.0 - 82.167.255.255 sa -82.168.0.0 - 82.175.129.87 nl -82.175.129.88 - 82.175.129.91 be -82.175.129.92 - 82.175.129.127 nl -82.175.129.128 - 82.175.129.191 be -82.175.129.192 - 82.175.129.255 nl -82.175.130.0 - 82.175.130.127 be -82.175.130.128 - 82.175.191.255 nl -82.175.192.0 - 82.175.198.31 be -82.175.198.32 - 82.175.198.63 nl -82.175.198.64 - 82.175.199.159 be -82.175.199.160 - 82.175.199.191 nl -82.175.199.192 - 82.175.200.15 be -82.175.200.16 - 82.175.200.39 nl -82.175.200.40 - 82.175.200.47 be -82.175.200.48 - 82.175.201.255 nl -82.175.202.0 - 82.175.202.255 be -82.175.203.0 - 82.176.255.255 nl +82.168.0.0 - 82.175.191.255 nl +82.175.192.0 - 82.175.195.255 be +82.175.196.0 - 82.176.255.255 nl 82.177.0.0 - 82.177.255.255 pl 82.178.0.0 - 82.178.255.255 om 82.179.0.0 - 82.179.255.255 ru @@ -42883,34 +22127,12 @@ 82.184.0.0 - 82.191.255.255 it 82.192.0.0 - 82.192.31.255 at 82.192.32.0 - 82.192.63.255 si -82.192.64.0 - 82.192.91.255 nl -82.192.92.0 - 82.192.92.2 fr -82.192.92.3 - 82.192.92.4 gb -82.192.92.5 - 82.192.92.6 de -82.192.92.7 - 82.192.92.10 nl -82.192.92.11 - 82.192.92.12 it -82.192.92.13 - 82.192.92.14 nl -82.192.92.15 - 82.192.92.16 pl -82.192.92.17 - 82.192.95.255 nl +82.192.64.0 - 82.192.95.255 nl 82.192.96.0 - 82.192.127.255 gb 82.192.128.0 - 82.192.191.255 dk 82.192.192.0 - 82.192.223.255 de 82.192.224.0 - 82.192.255.255 ch -82.193.0.0 - 82.193.34.47 it -82.193.34.48 - 82.193.34.63 ng -82.193.34.64 - 82.193.34.79 it -82.193.34.80 - 82.193.34.87 ng -82.193.34.88 - 82.193.34.95 it -82.193.34.96 - 82.193.34.103 ng -82.193.34.104 - 82.193.36.191 it -82.193.36.192 - 82.193.36.255 ng -82.193.37.0 - 82.193.38.55 it -82.193.38.56 - 82.193.38.127 ng -82.193.38.128 - 82.193.38.255 it -82.193.39.0 - 82.193.55.255 ng -82.193.56.0 - 82.193.61.255 it -82.193.62.0 - 82.193.62.255 ng -82.193.63.0 - 82.193.63.255 it +82.193.0.0 - 82.193.63.255 it 82.193.64.0 - 82.193.95.255 lv 82.193.96.0 - 82.193.127.255 ua 82.193.128.0 - 82.193.159.255 ru @@ -42928,59 +22150,31 @@ 82.195.32.0 - 82.195.63.255 nl 82.195.64.0 - 82.195.95.255 de 82.195.96.0 - 82.195.127.255 gb -82.195.128.0 - 82.195.136.18 ie -82.195.136.19 - 82.195.136.21 gb -82.195.136.22 - 82.195.136.111 ie -82.195.136.112 - 82.195.136.119 gb -82.195.136.120 - 82.195.143.95 ie -82.195.143.96 - 82.195.143.111 gb -82.195.143.112 - 82.195.159.255 ie +82.195.128.0 - 82.195.154.191 ie +82.195.154.192 - 82.195.154.196 a1 +82.195.154.197 - 82.195.159.255 ie 82.195.160.0 - 82.195.191.255 gb 82.195.192.0 - 82.195.223.255 fi 82.195.224.0 - 82.195.255.255 ch -82.196.0.0 - 82.196.31.255 fr -82.196.32.0 - 82.196.37.63 gb -82.196.37.64 - 82.196.37.127 eu -82.196.37.128 - 82.196.37.151 gb -82.196.37.152 - 82.196.37.159 eu -82.196.37.160 - 82.196.37.207 gb -82.196.37.208 - 82.196.37.215 eu -82.196.37.216 - 82.196.37.255 gb -82.196.38.0 - 82.196.40.255 eu -82.196.41.0 - 82.196.41.127 gb -82.196.41.128 - 82.196.41.143 eu -82.196.41.144 - 82.196.41.159 gb -82.196.41.160 - 82.196.41.175 eu -82.196.41.176 - 82.196.41.207 gb -82.196.41.208 - 82.196.41.223 eu -82.196.41.224 - 82.196.41.239 fr -82.196.41.240 - 82.196.41.247 gb -82.196.41.248 - 82.196.41.255 eu -82.196.42.0 - 82.196.42.95 gb -82.196.42.96 - 82.196.42.111 eu -82.196.42.112 - 82.196.45.127 gb -82.196.45.128 - 82.196.45.255 eu -82.196.46.0 - 82.196.46.255 us -82.196.47.0 - 82.196.50.255 gb +82.196.0.0 - 82.196.15.255 nl +82.196.16.0 - 82.196.16.255 gb +82.196.17.0 - 82.196.24.255 fr +82.196.25.0 - 82.196.25.255 dz +82.196.26.0 - 82.196.31.255 fr +82.196.32.0 - 82.196.40.255 eu +82.196.41.0 - 82.196.41.191 be +82.196.41.192 - 82.196.41.207 gb +82.196.41.208 - 82.196.41.255 be +82.196.42.0 - 82.196.42.255 gb +82.196.43.0 - 82.196.44.255 eu +82.196.45.0 - 82.196.45.255 gb +82.196.46.0 - 82.196.47.255 eu +82.196.48.0 - 82.196.50.255 gb 82.196.51.0 - 82.196.51.255 eu -82.196.52.0 - 82.196.52.47 fr -82.196.52.48 - 82.196.52.247 eu -82.196.52.248 - 82.196.52.255 fr +82.196.52.0 - 82.196.52.255 gb 82.196.53.0 - 82.196.55.255 eu -82.196.56.0 - 82.196.56.47 sg -82.196.56.48 - 82.196.56.63 eu -82.196.56.64 - 82.196.56.83 sg -82.196.56.84 - 82.196.56.95 eu -82.196.56.96 - 82.196.56.127 sg -82.196.56.128 - 82.196.56.199 eu -82.196.56.200 - 82.196.56.207 sg -82.196.56.208 - 82.196.56.251 eu -82.196.56.252 - 82.196.56.255 sg -82.196.57.0 - 82.196.57.255 eu -82.196.58.0 - 82.196.58.15 us -82.196.58.16 - 82.196.58.31 eu -82.196.58.32 - 82.196.58.47 us -82.196.58.48 - 82.196.63.255 eu +82.196.56.0 - 82.196.56.255 au +82.196.57.0 - 82.196.63.255 eu 82.196.64.0 - 82.196.95.255 ru 82.196.96.0 - 82.196.127.255 se 82.196.128.0 - 82.196.159.255 ru @@ -42990,173 +22184,82 @@ 82.197.0.0 - 82.197.31.255 fi 82.197.32.0 - 82.197.63.255 pl 82.197.64.0 - 82.197.95.255 gb -82.197.96.0 - 82.197.127.255 fr -82.197.128.0 - 82.197.128.255 nl -82.197.129.0 - 82.197.134.255 de -82.197.135.0 - 82.197.135.255 eu -82.197.136.0 - 82.197.136.255 gb -82.197.137.0 - 82.197.137.255 eu -82.197.138.0 - 82.197.138.31 at -82.197.138.32 - 82.197.138.255 eu -82.197.139.0 - 82.197.143.255 de +82.197.96.0 - 82.197.99.255 fr +82.197.100.0 - 82.197.100.255 re +82.197.101.0 - 82.197.112.121 fr +82.197.112.122 - 82.197.112.122 re +82.197.112.123 - 82.197.112.255 fr +82.197.113.0 - 82.197.113.255 re +82.197.114.0 - 82.197.115.19 fr +82.197.115.20 - 82.197.115.20 re +82.197.115.21 - 82.197.116.244 fr +82.197.116.245 - 82.197.116.245 re +82.197.116.246 - 82.197.120.55 fr +82.197.120.56 - 82.197.120.56 re +82.197.120.57 - 82.197.122.233 fr +82.197.122.234 - 82.197.122.234 re +82.197.122.235 - 82.197.127.255 fr +82.197.128.0 - 82.197.129.255 eu +82.197.130.0 - 82.197.131.255 de +82.197.132.0 - 82.197.137.255 eu +82.197.138.0 - 82.197.138.255 nl +82.197.139.0 - 82.197.139.255 eu +82.197.140.0 - 82.197.143.255 de 82.197.144.0 - 82.197.144.255 fr -82.197.145.0 - 82.197.145.31 de -82.197.145.32 - 82.197.145.255 eu -82.197.146.0 - 82.197.155.255 de -82.197.156.0 - 82.197.157.255 eu -82.197.158.0 - 82.197.159.255 de -82.197.160.0 - 82.197.184.231 ch -82.197.184.232 - 82.197.184.239 de -82.197.184.240 - 82.197.191.255 ch +82.197.145.0 - 82.197.151.255 eu +82.197.152.0 - 82.197.159.255 de +82.197.160.0 - 82.197.162.127 ch +82.197.162.128 - 82.197.162.143 de +82.197.162.144 - 82.197.163.48 ch +82.197.163.49 - 82.197.163.49 at +82.197.163.50 - 82.197.169.31 ch +82.197.169.32 - 82.197.169.63 gb +82.197.169.64 - 82.197.178.255 ch +82.197.179.0 - 82.197.179.31 nl +82.197.179.32 - 82.197.191.255 ch 82.197.192.0 - 82.197.223.255 nl 82.197.224.0 - 82.197.255.255 se -82.198.0.0 - 82.198.0.255 ru -82.198.1.0 - 82.198.2.255 lb -82.198.3.0 - 82.198.4.255 lt -82.198.5.0 - 82.198.5.255 iq -82.198.6.0 - 82.198.7.255 ru -82.198.8.0 - 82.198.11.255 lb -82.198.12.0 - 82.198.12.255 iq -82.198.13.0 - 82.198.14.255 ru -82.198.15.0 - 82.198.15.255 iq -82.198.16.0 - 82.198.16.255 ru -82.198.17.0 - 82.198.18.255 lt -82.198.19.0 - 82.198.20.255 lb -82.198.21.0 - 82.198.21.255 se -82.198.22.0 - 82.198.22.255 ru -82.198.23.0 - 82.198.23.255 lt -82.198.24.0 - 82.198.26.255 ru -82.198.27.0 - 82.198.27.255 iq -82.198.28.0 - 82.198.29.255 lt -82.198.30.0 - 82.198.30.255 lv -82.198.31.0 - 82.198.31.255 lt +82.198.0.0 - 82.198.3.119 ru +82.198.3.120 - 82.198.3.135 us +82.198.3.136 - 82.198.3.251 ru +82.198.3.252 - 82.198.3.255 us +82.198.4.0 - 82.198.5.255 ru +82.198.6.0 - 82.198.7.255 lt +82.198.8.0 - 82.198.16.127 ru +82.198.16.128 - 82.198.16.255 lt +82.198.17.0 - 82.198.24.255 ru +82.198.25.0 - 82.198.25.255 lb +82.198.26.0 - 82.198.26.255 ru +82.198.27.0 - 82.198.27.255 lt +82.198.28.0 - 82.198.28.255 ru +82.198.29.0 - 82.198.29.255 lt +82.198.30.0 - 82.198.31.255 ru 82.198.32.0 - 82.198.63.255 es -82.198.64.0 - 82.198.81.24 de -82.198.81.25 - 82.198.81.32 cz -82.198.81.33 - 82.198.95.255 de +82.198.64.0 - 82.198.95.255 de 82.198.96.0 - 82.198.127.255 es -82.198.128.0 - 82.198.128.15 gb -82.198.128.16 - 82.198.128.95 ie -82.198.128.96 - 82.198.128.99 gb -82.198.128.100 - 82.198.128.111 ie -82.198.128.112 - 82.198.128.127 gb -82.198.128.128 - 82.198.128.239 ie -82.198.128.240 - 82.198.128.255 gb -82.198.129.0 - 82.198.130.255 ie -82.198.131.0 - 82.198.131.67 gb -82.198.131.68 - 82.198.131.159 ie -82.198.131.160 - 82.198.131.175 gb -82.198.131.176 - 82.198.131.183 ie -82.198.131.184 - 82.198.131.223 gb -82.198.131.224 - 82.198.131.239 ie -82.198.131.240 - 82.198.131.255 gb -82.198.132.0 - 82.198.132.27 ie -82.198.132.28 - 82.198.132.91 gb -82.198.132.92 - 82.198.132.113 ie -82.198.132.114 - 82.198.132.115 gb -82.198.132.116 - 82.198.132.119 ie -82.198.132.120 - 82.198.132.127 gb -82.198.132.128 - 82.198.132.155 ie -82.198.132.156 - 82.198.132.159 gb -82.198.132.160 - 82.198.132.167 ie -82.198.132.168 - 82.198.132.168 gb -82.198.132.169 - 82.198.132.175 ie -82.198.132.176 - 82.198.132.183 gb -82.198.132.184 - 82.198.132.227 ie -82.198.132.228 - 82.198.132.231 gb -82.198.132.232 - 82.198.133.123 ie -82.198.133.124 - 82.198.133.127 gb -82.198.133.128 - 82.198.133.131 ie -82.198.133.132 - 82.198.133.135 gb -82.198.133.136 - 82.198.133.136 ie -82.198.133.137 - 82.198.133.143 gb -82.198.133.144 - 82.198.133.179 ie -82.198.133.180 - 82.198.133.191 gb -82.198.133.192 - 82.198.135.255 ie -82.198.136.0 - 82.198.136.63 gb -82.198.136.64 - 82.198.136.75 ie -82.198.136.76 - 82.198.136.79 ir -82.198.136.80 - 82.198.136.127 ie -82.198.136.128 - 82.198.136.191 gb -82.198.136.192 - 82.198.137.111 ie -82.198.137.112 - 82.198.137.123 gb -82.198.137.124 - 82.198.137.135 ie -82.198.137.136 - 82.198.137.143 gb -82.198.137.144 - 82.198.137.175 ie -82.198.137.176 - 82.198.137.187 gb -82.198.137.188 - 82.198.138.175 ie -82.198.138.176 - 82.198.138.183 gb -82.198.138.184 - 82.198.138.191 ie -82.198.138.192 - 82.198.138.207 gb -82.198.138.208 - 82.198.139.19 ie -82.198.139.20 - 82.198.139.27 gb -82.198.139.28 - 82.198.139.131 ie -82.198.139.132 - 82.198.139.135 gb -82.198.139.136 - 82.198.139.147 ie -82.198.139.148 - 82.198.139.158 gb -82.198.139.159 - 82.198.139.179 ie -82.198.139.180 - 82.198.139.183 gb -82.198.139.184 - 82.198.140.239 ie -82.198.140.240 - 82.198.140.255 gb -82.198.141.0 - 82.198.141.111 ie -82.198.141.112 - 82.198.141.119 gb -82.198.141.120 - 82.198.141.151 ie -82.198.141.152 - 82.198.141.159 gb -82.198.141.160 - 82.198.141.181 ie -82.198.141.182 - 82.198.141.191 gb -82.198.141.192 - 82.198.144.189 ie -82.198.144.190 - 82.198.144.191 gb -82.198.144.192 - 82.198.144.207 ie -82.198.144.208 - 82.198.144.211 gb -82.198.144.212 - 82.198.145.195 ie -82.198.145.196 - 82.198.145.199 gb -82.198.145.200 - 82.198.147.27 ie -82.198.147.28 - 82.198.147.31 gb -82.198.147.32 - 82.198.147.87 ie -82.198.147.88 - 82.198.147.91 gb -82.198.147.92 - 82.198.147.199 ie -82.198.147.200 - 82.198.147.215 gb -82.198.147.216 - 82.198.147.254 ie -82.198.147.255 - 82.198.147.255 gb -82.198.148.0 - 82.198.148.183 ie -82.198.148.184 - 82.198.148.187 gb -82.198.148.188 - 82.198.148.199 ie -82.198.148.200 - 82.198.148.203 gb -82.198.148.204 - 82.198.149.171 ie -82.198.149.172 - 82.198.149.175 gb -82.198.149.176 - 82.198.149.203 ie -82.198.149.204 - 82.198.149.207 gb -82.198.149.208 - 82.198.151.163 ie -82.198.151.164 - 82.198.151.175 gb -82.198.151.176 - 82.198.151.179 ie -82.198.151.180 - 82.198.151.199 gb -82.198.151.200 - 82.198.151.207 ie -82.198.151.208 - 82.198.151.215 gb -82.198.151.216 - 82.198.152.99 ie -82.198.152.100 - 82.198.152.111 gb -82.198.152.112 - 82.198.152.215 ie -82.198.152.216 - 82.198.152.223 gb -82.198.152.224 - 82.198.155.23 ie -82.198.155.24 - 82.198.155.27 gb -82.198.155.28 - 82.198.155.55 ie -82.198.155.56 - 82.198.155.79 gb -82.198.155.80 - 82.198.155.107 ie -82.198.155.108 - 82.198.155.127 gb -82.198.155.128 - 82.198.156.7 ie -82.198.156.8 - 82.198.156.15 gb -82.198.156.16 - 82.198.156.83 ie -82.198.156.84 - 82.198.156.99 gb -82.198.156.100 - 82.198.156.207 ie -82.198.156.208 - 82.198.156.211 gb -82.198.156.212 - 82.198.156.254 ie -82.198.156.255 - 82.198.156.255 gb -82.198.157.0 - 82.198.157.191 ie -82.198.157.192 - 82.198.157.223 gb -82.198.157.224 - 82.198.157.255 ie -82.198.158.0 - 82.198.158.31 gb -82.198.158.32 - 82.198.158.61 ie -82.198.158.62 - 82.198.158.63 gb -82.198.158.64 - 82.198.159.255 ie +82.198.128.0 - 82.198.132.159 gb +82.198.132.160 - 82.198.132.163 ie +82.198.132.164 - 82.198.137.103 gb +82.198.137.104 - 82.198.137.111 ie +82.198.137.112 - 82.198.137.135 gb +82.198.137.136 - 82.198.137.143 ie +82.198.137.144 - 82.198.138.255 gb +82.198.139.0 - 82.198.139.11 ie +82.198.139.12 - 82.198.139.255 gb +82.198.140.0 - 82.198.140.255 ie +82.198.141.0 - 82.198.142.199 gb +82.198.142.200 - 82.198.142.203 ie +82.198.142.204 - 82.198.144.55 gb +82.198.144.56 - 82.198.144.63 ie +82.198.144.64 - 82.198.144.127 gb +82.198.144.128 - 82.198.144.143 ie +82.198.144.144 - 82.198.148.243 gb +82.198.148.244 - 82.198.148.247 ie +82.198.148.248 - 82.198.150.255 gb +82.198.151.0 - 82.198.151.63 ie +82.198.151.64 - 82.198.152.159 gb +82.198.152.160 - 82.198.152.175 ie +82.198.152.176 - 82.198.159.255 gb 82.198.160.0 - 82.198.191.255 ru 82.198.192.0 - 82.198.223.255 de 82.198.224.0 - 82.198.255.255 gb @@ -43164,30 +22267,19 @@ 82.199.32.0 - 82.199.63.255 es 82.199.64.0 - 82.199.84.63 nl 82.199.84.64 - 82.199.84.79 gb -82.199.84.80 - 82.199.85.207 nl -82.199.85.208 - 82.199.85.223 gb -82.199.85.224 - 82.199.90.143 nl -82.199.90.144 - 82.199.90.159 gb -82.199.90.160 - 82.199.91.7 nl -82.199.91.8 - 82.199.91.15 gb -82.199.91.16 - 82.199.91.111 nl -82.199.91.112 - 82.199.91.127 gb -82.199.91.128 - 82.199.95.255 nl +82.199.84.80 - 82.199.91.7 nl +82.199.91.8 - 82.199.91.9 gb +82.199.91.10 - 82.199.91.10 eu +82.199.91.11 - 82.199.91.15 gb +82.199.91.16 - 82.199.95.255 nl 82.199.96.0 - 82.199.127.255 ru -82.199.128.0 - 82.199.133.255 de -82.199.134.0 - 82.199.134.31 bz -82.199.134.32 - 82.199.136.63 de -82.199.136.64 - 82.199.136.95 bz -82.199.136.96 - 82.199.159.255 de -82.199.160.0 - 82.199.162.255 ax -82.199.163.0 - 82.199.163.127 fi -82.199.163.128 - 82.199.176.255 ax -82.199.177.0 - 82.199.177.127 fi -82.199.177.128 - 82.199.186.127 ax -82.199.186.128 - 82.199.186.158 se -82.199.186.159 - 82.199.186.255 ax -82.199.187.0 - 82.199.191.255 se -82.199.192.0 - 82.199.223.255 bg +82.199.128.0 - 82.199.128.255 de +82.199.129.0 - 82.199.129.255 a1 +82.199.130.0 - 82.199.149.255 de +82.199.150.0 - 82.199.150.255 a1 +82.199.151.0 - 82.199.159.255 de +82.199.160.0 - 82.199.191.255 ax +82.199.192.0 - 82.199.223.255 am 82.199.224.0 - 82.199.255.255 fi 82.200.0.0 - 82.200.127.255 ru 82.200.128.0 - 82.200.255.255 kz @@ -43200,287 +22292,37 @@ 82.204.0.0 - 82.204.127.255 nl 82.204.128.0 - 82.204.255.255 ru 82.205.0.0 - 82.205.127.255 ps -82.205.128.0 - 82.205.128.255 a2 -82.205.129.0 - 82.205.129.31 ir -82.205.129.32 - 82.205.131.255 a2 -82.205.132.0 - 82.205.132.255 ae -82.205.133.0 - 82.205.137.255 a2 -82.205.138.0 - 82.205.138.255 af -82.205.139.0 - 82.205.144.95 a2 -82.205.144.96 - 82.205.144.111 lb -82.205.144.112 - 82.205.145.31 a2 -82.205.145.32 - 82.205.145.63 iq -82.205.145.64 - 82.205.145.255 a2 -82.205.146.0 - 82.205.146.31 ly -82.205.146.32 - 82.205.146.255 a2 -82.205.147.0 - 82.205.147.31 iq -82.205.147.32 - 82.205.149.63 a2 -82.205.149.64 - 82.205.149.127 iq -82.205.149.128 - 82.205.149.143 a2 -82.205.149.144 - 82.205.149.159 iq -82.205.149.160 - 82.205.150.255 a2 -82.205.151.0 - 82.205.151.255 af -82.205.152.0 - 82.205.152.127 a2 -82.205.152.128 - 82.205.152.255 de -82.205.153.0 - 82.205.153.31 a2 -82.205.153.32 - 82.205.153.159 ir -82.205.153.160 - 82.205.154.127 a2 -82.205.154.128 - 82.205.154.159 ly -82.205.154.160 - 82.205.154.255 a2 -82.205.155.0 - 82.205.156.128 ir -82.205.156.129 - 82.205.156.255 a2 -82.205.157.0 - 82.205.157.255 de -82.205.158.0 - 82.205.159.95 a2 -82.205.159.96 - 82.205.159.127 ir -82.205.159.128 - 82.205.159.191 de -82.205.159.192 - 82.205.159.223 a2 -82.205.159.224 - 82.205.159.255 ir -82.205.160.0 - 82.205.169.31 a2 -82.205.169.32 - 82.205.169.47 iq -82.205.169.48 - 82.205.170.31 a2 -82.205.170.32 - 82.205.170.95 iq -82.205.170.96 - 82.205.170.159 a2 -82.205.170.160 - 82.205.170.191 iq -82.205.170.192 - 82.205.171.255 a2 -82.205.172.0 - 82.205.172.31 iq -82.205.172.32 - 82.205.172.63 a2 -82.205.172.64 - 82.205.172.95 iq -82.205.172.96 - 82.205.172.143 a2 -82.205.172.144 - 82.205.172.159 iq -82.205.172.160 - 82.205.172.191 a2 -82.205.172.192 - 82.205.172.239 iq -82.205.172.240 - 82.205.173.255 a2 -82.205.174.0 - 82.205.174.15 iq -82.205.174.16 - 82.205.174.63 a2 -82.205.174.64 - 82.205.174.127 iq -82.205.174.128 - 82.205.174.207 a2 -82.205.174.208 - 82.205.174.223 ly -82.205.174.224 - 82.205.174.255 a2 -82.205.175.0 - 82.205.175.31 iq -82.205.175.32 - 82.205.175.47 a2 -82.205.175.48 - 82.205.175.63 iq -82.205.175.64 - 82.205.175.127 a2 -82.205.175.128 - 82.205.175.143 iq -82.205.175.144 - 82.205.175.175 a2 -82.205.175.176 - 82.205.175.255 iq -82.205.176.0 - 82.205.177.255 a2 -82.205.178.0 - 82.205.178.255 kw -82.205.179.0 - 82.205.179.255 a2 -82.205.180.0 - 82.205.180.95 iq -82.205.180.96 - 82.205.180.255 a2 -82.205.181.0 - 82.205.181.63 ir -82.205.181.64 - 82.205.181.159 a2 -82.205.181.160 - 82.205.181.191 iq -82.205.181.192 - 82.205.182.23 a2 -82.205.182.24 - 82.205.182.31 ly -82.205.182.32 - 82.205.182.127 a2 -82.205.182.128 - 82.205.182.159 ly -82.205.182.160 - 82.205.187.255 a2 -82.205.188.0 - 82.205.191.255 ly -82.205.192.0 - 82.205.199.255 af -82.205.200.0 - 82.205.200.255 a2 -82.205.201.0 - 82.205.201.255 ae -82.205.202.0 - 82.205.207.255 af -82.205.208.0 - 82.205.209.95 a2 -82.205.209.96 - 82.205.209.111 iq -82.205.209.112 - 82.205.212.47 a2 -82.205.212.48 - 82.205.212.63 sa -82.205.212.64 - 82.205.218.95 a2 -82.205.218.96 - 82.205.218.111 sa -82.205.218.112 - 82.205.218.143 a2 -82.205.218.144 - 82.205.218.159 ly -82.205.218.160 - 82.205.218.191 sa -82.205.218.192 - 82.205.222.255 a2 -82.205.223.0 - 82.205.224.255 de -82.205.225.0 - 82.205.230.111 a2 -82.205.230.112 - 82.205.230.127 iq -82.205.230.128 - 82.205.231.255 a2 -82.205.232.0 - 82.205.232.255 ae -82.205.233.0 - 82.205.233.255 a2 -82.205.234.0 - 82.205.238.255 ae -82.205.239.0 - 82.205.239.15 iq -82.205.239.16 - 82.205.241.63 a2 -82.205.241.64 - 82.205.241.127 ae +82.205.128.0 - 82.205.129.255 ae +82.205.130.0 - 82.205.131.31 us +82.205.131.32 - 82.205.191.255 ae +82.205.192.0 - 82.205.192.255 us +82.205.193.0 - 82.205.196.255 ae +82.205.197.0 - 82.205.198.255 us +82.205.199.0 - 82.205.203.255 ae +82.205.204.0 - 82.205.207.255 af +82.205.208.0 - 82.205.223.255 ae +82.205.224.0 - 82.205.224.255 us +82.205.225.0 - 82.205.241.127 ae 82.205.241.128 - 82.205.241.191 lb -82.205.241.192 - 82.205.243.255 a2 -82.205.244.0 - 82.205.253.255 ae -82.205.254.0 - 82.205.254.255 a2 -82.205.255.0 - 82.205.255.255 sa -82.206.0.0 - 82.206.0.191 de -82.206.0.192 - 82.206.0.199 lt -82.206.0.200 - 82.206.124.159 de -82.206.124.160 - 82.206.124.191 es -82.206.124.192 - 82.206.124.255 de -82.206.125.0 - 82.206.126.255 es -82.206.127.0 - 82.206.128.15 us -82.206.128.16 - 82.206.128.31 cd -82.206.128.32 - 82.206.128.47 gb -82.206.128.48 - 82.206.128.63 gh -82.206.128.64 - 82.206.128.143 tz -82.206.128.144 - 82.206.128.159 a2 -82.206.128.160 - 82.206.128.175 za -82.206.128.176 - 82.206.128.183 gb -82.206.128.184 - 82.206.128.191 ng -82.206.128.192 - 82.206.128.231 a2 -82.206.128.232 - 82.206.128.239 bh -82.206.128.240 - 82.206.128.255 a2 -82.206.129.0 - 82.206.129.15 ng -82.206.129.16 - 82.206.129.31 us -82.206.129.32 - 82.206.129.47 za -82.206.129.48 - 82.206.129.79 et -82.206.129.80 - 82.206.129.87 tz -82.206.129.88 - 82.206.129.111 a2 -82.206.129.112 - 82.206.129.127 ng -82.206.129.128 - 82.206.129.255 td -82.206.130.0 - 82.206.130.127 us -82.206.130.128 - 82.206.130.128 a2 -82.206.130.129 - 82.206.130.143 us -82.206.130.144 - 82.206.130.151 ca -82.206.130.152 - 82.206.130.159 lr -82.206.130.160 - 82.206.130.166 gm -82.206.130.167 - 82.206.130.167 a2 -82.206.130.168 - 82.206.130.183 sc -82.206.130.184 - 82.206.130.190 cg -82.206.130.191 - 82.206.130.191 a2 -82.206.130.192 - 82.206.130.231 us -82.206.130.232 - 82.206.130.255 a2 -82.206.131.0 - 82.206.131.127 za -82.206.131.128 - 82.206.131.143 a2 -82.206.131.144 - 82.206.131.159 ca -82.206.131.160 - 82.206.131.191 ng -82.206.131.192 - 82.206.131.199 us -82.206.131.200 - 82.206.134.31 a2 -82.206.134.32 - 82.206.134.39 cd -82.206.134.40 - 82.206.134.111 a2 -82.206.134.112 - 82.206.134.119 cd -82.206.134.120 - 82.206.134.127 a2 -82.206.134.128 - 82.206.134.137 cd -82.206.134.138 - 82.206.134.143 a2 -82.206.134.144 - 82.206.134.159 ng -82.206.134.160 - 82.206.134.167 a2 -82.206.134.168 - 82.206.134.175 ng -82.206.134.176 - 82.206.134.231 a2 -82.206.134.232 - 82.206.134.255 cd -82.206.135.0 - 82.206.135.7 za -82.206.135.8 - 82.206.135.255 a2 +82.205.241.192 - 82.205.252.255 ae +82.205.253.0 - 82.205.253.255 eu +82.205.254.0 - 82.205.255.255 ae +82.206.0.0 - 82.206.127.255 de +82.206.128.0 - 82.206.128.255 tz +82.206.129.0 - 82.206.135.255 a2 82.206.136.0 - 82.206.136.255 ke -82.206.137.0 - 82.206.137.255 cd -82.206.138.0 - 82.206.139.255 a2 -82.206.140.0 - 82.206.140.255 bi -82.206.141.0 - 82.206.141.127 us -82.206.141.128 - 82.206.141.255 a2 -82.206.142.0 - 82.206.142.127 us -82.206.142.128 - 82.206.142.255 gb -82.206.143.0 - 82.206.143.127 a2 +82.206.137.0 - 82.206.143.127 a2 82.206.143.128 - 82.206.143.135 ke -82.206.143.136 - 82.206.144.31 a2 -82.206.144.32 - 82.206.144.39 cd -82.206.144.40 - 82.206.144.63 a2 -82.206.144.64 - 82.206.144.71 cd -82.206.144.72 - 82.206.144.159 a2 -82.206.144.160 - 82.206.144.167 ng -82.206.144.168 - 82.206.144.191 a2 -82.206.144.192 - 82.206.144.223 ng -82.206.144.224 - 82.206.144.255 a2 -82.206.145.0 - 82.206.145.127 ng -82.206.145.128 - 82.206.146.255 a2 -82.206.147.0 - 82.206.147.127 cd -82.206.147.128 - 82.206.147.255 a2 -82.206.148.0 - 82.206.148.63 cd -82.206.148.64 - 82.206.148.79 a2 -82.206.148.80 - 82.206.148.95 cd -82.206.148.96 - 82.206.151.31 a2 -82.206.151.32 - 82.206.151.39 us -82.206.151.40 - 82.206.151.255 a2 -82.206.152.0 - 82.206.152.255 ca -82.206.153.0 - 82.206.155.255 a2 -82.206.156.0 - 82.206.156.127 no -82.206.156.128 - 82.206.156.159 gb -82.206.156.160 - 82.206.156.255 a2 -82.206.157.0 - 82.206.157.255 ae -82.206.158.0 - 82.206.158.255 a2 -82.206.159.0 - 82.206.159.127 za -82.206.159.128 - 82.206.159.255 fr -82.206.160.0 - 82.206.160.255 lb -82.206.161.0 - 82.206.161.255 ae -82.206.162.0 - 82.206.162.255 mg -82.206.163.0 - 82.206.163.255 ng -82.206.164.0 - 82.206.164.255 a2 -82.206.165.0 - 82.206.165.31 us -82.206.165.32 - 82.206.165.63 gh -82.206.165.64 - 82.206.165.126 us -82.206.165.127 - 82.206.165.127 a2 -82.206.165.128 - 82.206.166.127 za -82.206.166.128 - 82.206.166.191 cd -82.206.166.192 - 82.206.166.215 lr -82.206.166.216 - 82.206.166.223 a2 -82.206.166.224 - 82.206.166.255 lr -82.206.167.0 - 82.206.167.255 ae -82.206.168.0 - 82.206.168.255 gb -82.206.169.0 - 82.206.169.79 bd -82.206.169.80 - 82.206.169.111 a2 -82.206.169.112 - 82.206.169.119 de -82.206.169.120 - 82.206.170.191 a2 -82.206.170.192 - 82.206.170.254 sa -82.206.170.255 - 82.206.170.255 a2 -82.206.171.0 - 82.206.172.255 us -82.206.173.0 - 82.206.173.255 mx -82.206.174.0 - 82.206.175.127 a2 -82.206.175.128 - 82.206.175.255 mx -82.206.176.0 - 82.206.176.255 a2 -82.206.177.0 - 82.206.177.255 iq -82.206.178.0 - 82.206.178.255 ae -82.206.179.0 - 82.206.179.255 a2 -82.206.180.0 - 82.206.180.255 sn -82.206.181.0 - 82.206.181.255 mx -82.206.182.0 - 82.206.182.255 de -82.206.183.0 - 82.206.183.255 mx -82.206.184.0 - 82.206.184.255 us -82.206.185.0 - 82.206.185.255 tz -82.206.186.0 - 82.206.186.255 lr -82.206.187.0 - 82.206.187.255 ci -82.206.188.0 - 82.206.188.255 a2 -82.206.189.0 - 82.206.189.255 fr -82.206.190.0 - 82.206.190.255 vg -82.206.191.0 - 82.206.191.255 a2 -82.206.192.0 - 82.206.194.255 za -82.206.195.0 - 82.206.197.255 a2 -82.206.198.0 - 82.206.198.127 lr -82.206.198.128 - 82.206.198.255 sn -82.206.199.0 - 82.206.199.255 a2 -82.206.200.0 - 82.206.200.255 lr -82.206.201.0 - 82.206.201.127 a2 -82.206.201.128 - 82.206.201.255 za -82.206.202.0 - 82.206.215.255 a2 -82.206.216.0 - 82.206.216.127 us -82.206.216.128 - 82.206.216.255 a2 -82.206.217.0 - 82.206.217.255 dk -82.206.218.0 - 82.206.219.255 us -82.206.220.0 - 82.206.223.255 gn +82.206.143.136 - 82.206.169.255 a2 +82.206.170.0 - 82.206.170.255 za +82.206.171.0 - 82.206.223.255 a2 82.206.224.0 - 82.206.227.255 no -82.206.228.0 - 82.206.228.255 us -82.206.229.0 - 82.206.229.255 fr -82.206.230.0 - 82.206.231.255 a2 -82.206.232.0 - 82.206.233.255 us -82.206.234.0 - 82.206.236.255 gh -82.206.237.0 - 82.206.237.255 mg -82.206.238.0 - 82.206.238.255 us -82.206.239.0 - 82.206.239.255 ke -82.206.240.0 - 82.206.242.255 a2 -82.206.243.0 - 82.206.243.255 us -82.206.244.0 - 82.206.244.127 a2 -82.206.244.128 - 82.206.244.255 iq -82.206.245.0 - 82.206.247.255 us -82.206.248.0 - 82.206.248.255 za -82.206.249.0 - 82.206.249.191 us -82.206.249.192 - 82.206.250.255 a2 -82.206.251.0 - 82.206.251.63 ad -82.206.251.64 - 82.206.251.255 a2 -82.206.252.0 - 82.206.253.255 tz -82.206.254.0 - 82.206.255.255 a2 +82.206.228.0 - 82.206.255.255 a2 82.207.0.0 - 82.207.127.255 ua 82.207.128.0 - 82.207.255.255 de -82.208.0.0 - 82.208.63.255 cz +82.208.0.0 - 82.208.40.58 cz +82.208.40.59 - 82.208.40.59 es +82.208.40.60 - 82.208.63.255 cz 82.208.64.0 - 82.208.127.255 ru 82.208.128.0 - 82.208.191.255 ro 82.208.192.0 - 82.208.255.255 rs @@ -43488,59 +22330,25 @@ 82.209.64.0 - 82.209.127.255 ru 82.209.128.0 - 82.209.191.255 se 82.209.192.0 - 82.209.255.255 by -82.210.0.0 - 82.210.5.63 de -82.210.5.64 - 82.210.5.93 ch -82.210.5.94 - 82.210.31.31 de -82.210.31.32 - 82.210.31.63 ch -82.210.31.64 - 82.210.39.255 de -82.210.40.0 - 82.210.41.4 fr -82.210.41.5 - 82.210.41.12 ch -82.210.41.13 - 82.210.41.255 fr -82.210.42.0 - 82.210.63.255 de +82.210.0.0 - 82.210.0.255 ro +82.210.1.0 - 82.210.63.255 de 82.210.64.0 - 82.210.127.255 nl -82.210.128.0 - 82.210.191.255 pl -82.210.192.0 - 82.210.197.223 de -82.210.197.224 - 82.210.197.239 sg -82.210.197.240 - 82.210.213.191 de -82.210.213.192 - 82.210.213.255 be -82.210.214.0 - 82.210.233.103 de -82.210.233.104 - 82.210.233.119 fr -82.210.233.120 - 82.210.233.127 tr -82.210.233.128 - 82.210.233.167 de -82.210.233.168 - 82.210.233.175 es -82.210.233.176 - 82.210.233.183 de -82.210.233.184 - 82.210.233.191 fr -82.210.233.192 - 82.210.233.215 it -82.210.233.216 - 82.210.238.63 de -82.210.238.64 - 82.210.238.127 at -82.210.238.128 - 82.210.244.15 de -82.210.244.16 - 82.210.244.23 ch -82.210.244.24 - 82.210.255.191 de -82.210.255.192 - 82.210.255.255 ch -82.211.0.0 - 82.211.5.255 de -82.211.6.0 - 82.211.6.255 it -82.211.7.0 - 82.211.9.255 de -82.211.10.0 - 82.211.12.255 it -82.211.13.0 - 82.211.13.255 de -82.211.14.0 - 82.211.14.255 it -82.211.15.0 - 82.211.15.255 us -82.211.16.0 - 82.211.16.255 it -82.211.17.0 - 82.211.17.255 de -82.211.18.0 - 82.211.18.255 us -82.211.19.0 - 82.211.20.255 de -82.211.21.0 - 82.211.21.255 us -82.211.22.0 - 82.211.22.255 it -82.211.23.0 - 82.211.23.255 us -82.211.24.0 - 82.211.24.255 it -82.211.25.0 - 82.211.26.255 de -82.211.27.0 - 82.211.27.255 us -82.211.28.0 - 82.211.34.255 de -82.211.35.0 - 82.211.35.255 it -82.211.36.0 - 82.211.36.255 de -82.211.37.0 - 82.211.37.255 us -82.211.38.0 - 82.211.63.255 de +82.210.128.0 - 82.210.191.255 ro +82.210.192.0 - 82.210.245.255 de +82.210.246.0 - 82.210.246.127 eu +82.210.246.128 - 82.210.246.143 de +82.210.246.144 - 82.210.246.255 eu +82.210.247.0 - 82.210.248.255 de +82.210.249.0 - 82.210.249.255 eu +82.210.250.0 - 82.211.63.255 de 82.211.64.0 - 82.211.127.255 gb -82.211.128.0 - 82.211.191.255 ge +82.211.128.0 - 82.211.151.255 ge +82.211.152.0 - 82.211.152.236 ru +82.211.152.237 - 82.211.152.237 ge +82.211.152.238 - 82.211.152.255 ru +82.211.153.0 - 82.211.175.255 ge +82.211.176.0 - 82.211.176.255 ru +82.211.177.0 - 82.211.191.255 ge 82.211.192.0 - 82.211.255.255 dk 82.212.0.0 - 82.212.63.255 de 82.212.64.0 - 82.212.127.255 jo @@ -43551,19 +22359,28 @@ 82.213.128.0 - 82.213.255.255 es 82.214.0.0 - 82.214.63.255 se 82.214.64.0 - 82.214.85.255 si -82.214.86.0 - 82.214.87.255 ca -82.214.88.0 - 82.214.94.255 rs -82.214.95.0 - 82.214.95.255 si -82.214.96.0 - 82.214.101.255 hr -82.214.102.0 - 82.214.102.15 si -82.214.102.16 - 82.214.102.31 hr -82.214.102.32 - 82.214.103.255 si +82.214.86.0 - 82.214.95.255 rs +82.214.96.0 - 82.214.103.255 hr 82.214.104.0 - 82.214.111.255 ba 82.214.112.0 - 82.214.119.255 mk 82.214.120.0 - 82.214.125.255 si 82.214.126.0 - 82.214.127.255 rs 82.214.128.0 - 82.214.191.255 pl -82.214.192.0 - 82.214.255.255 us +82.214.192.0 - 82.214.195.255 us +82.214.196.0 - 82.214.196.255 sa +82.214.197.0 - 82.214.203.255 us +82.214.204.0 - 82.214.204.255 eu +82.214.205.0 - 82.214.225.255 us +82.214.226.0 - 82.214.226.255 de +82.214.227.0 - 82.214.227.255 us +82.214.228.0 - 82.214.228.255 eu +82.214.229.0 - 82.214.229.255 us +82.214.230.0 - 82.214.230.255 de +82.214.231.0 - 82.214.239.3 us +82.214.239.4 - 82.214.239.4 no +82.214.239.5 - 82.214.239.255 us +82.214.240.0 - 82.214.247.255 gb +82.214.248.0 - 82.214.255.255 us 82.215.0.0 - 82.215.63.255 nl 82.215.64.0 - 82.215.127.255 uz 82.215.128.0 - 82.215.191.255 it @@ -43575,14 +22392,11 @@ 82.220.0.0 - 82.220.255.255 ch 82.221.0.0 - 82.221.255.255 is 82.222.0.0 - 82.222.255.255 tr -82.223.0.0 - 82.223.187.255 es -82.223.188.0 - 82.223.189.255 pt -82.223.190.0 - 82.223.191.255 es -82.223.192.0 - 82.223.195.255 fr -82.223.196.0 - 82.223.198.255 pt -82.223.199.0 - 82.223.255.255 es +82.223.0.0 - 82.223.255.255 es 82.224.0.0 - 82.255.255.255 fr -83.0.0.0 - 83.31.255.255 pl +83.0.0.0 - 83.17.2.153 pl +83.17.2.154 - 83.17.2.154 gb +83.17.2.155 - 83.31.255.255 pl 83.32.0.0 - 83.63.255.255 es 83.64.0.0 - 83.65.255.255 at 83.66.0.0 - 83.66.255.255 tr @@ -43606,12 +22420,9 @@ 83.80.0.0 - 83.87.255.255 nl 83.88.0.0 - 83.95.255.255 dk 83.96.0.0 - 83.96.127.255 kw -83.96.128.0 - 83.96.156.127 nl -83.96.156.128 - 83.96.156.255 gb -83.96.157.0 - 83.96.255.255 nl -83.97.0.0 - 83.97.7.255 de +83.96.128.0 - 83.96.255.255 nl +83.97.0.0 - 83.97.7.255 ru 83.97.8.0 - 83.97.15.255 nl -83.97.16.0 - 83.97.23.255 pl 83.97.24.0 - 83.97.31.255 bg 83.97.32.0 - 83.97.39.255 gb 83.97.40.0 - 83.97.55.255 de @@ -43622,42 +22433,10 @@ 83.97.88.0 - 83.97.95.255 gb 83.97.96.0 - 83.97.103.255 dk 83.97.104.0 - 83.97.111.255 ru -83.97.112.0 - 83.97.119.255 de 83.97.120.0 - 83.97.127.255 ch 83.97.128.0 - 83.97.255.255 es 83.98.0.0 - 83.98.127.255 gb -83.98.128.0 - 83.98.129.63 nl -83.98.129.64 - 83.98.129.79 us -83.98.129.80 - 83.98.132.255 nl -83.98.133.0 - 83.98.133.255 us -83.98.134.0 - 83.98.134.255 de -83.98.135.0 - 83.98.138.55 nl -83.98.138.56 - 83.98.138.63 pl -83.98.138.64 - 83.98.142.63 nl -83.98.142.64 - 83.98.142.95 ie -83.98.142.96 - 83.98.142.255 nl -83.98.143.0 - 83.98.143.255 de -83.98.144.0 - 83.98.159.255 nl -83.98.160.0 - 83.98.160.255 ie -83.98.161.0 - 83.98.164.255 nl -83.98.165.0 - 83.98.165.255 at -83.98.166.0 - 83.98.166.255 us -83.98.167.0 - 83.98.186.255 nl -83.98.187.0 - 83.98.187.255 us -83.98.188.0 - 83.98.188.255 gb -83.98.189.0 - 83.98.193.9 nl -83.98.193.10 - 83.98.193.17 us -83.98.193.18 - 83.98.193.92 nl -83.98.193.93 - 83.98.193.111 us -83.98.193.112 - 83.98.197.255 nl -83.98.198.0 - 83.98.198.255 us -83.98.199.0 - 83.98.202.255 nl -83.98.203.0 - 83.98.203.63 gb -83.98.203.64 - 83.98.203.95 je -83.98.203.96 - 83.98.203.127 gb -83.98.203.128 - 83.98.203.255 nl -83.98.204.0 - 83.98.205.255 us -83.98.206.0 - 83.98.255.255 nl +83.98.128.0 - 83.98.255.255 nl 83.99.0.0 - 83.99.127.255 lu 83.99.128.0 - 83.99.255.255 lv 83.100.0.0 - 83.100.127.255 fi @@ -43673,75 +22452,33 @@ 83.110.0.0 - 83.111.255.255 ae 83.112.0.0 - 83.115.255.255 fr 83.116.0.0 - 83.119.255.255 nl -83.120.0.0 - 83.125.16.255 de -83.125.17.0 - 83.125.18.255 eu -83.125.19.0 - 83.125.23.255 de -83.125.24.0 - 83.125.27.255 eu -83.125.28.0 - 83.125.30.255 de -83.125.31.0 - 83.125.32.0 eu -83.125.32.1 - 83.125.35.254 de -83.125.35.255 - 83.125.36.255 eu -83.125.37.0 - 83.125.43.255 de -83.125.44.0 - 83.125.44.255 eu -83.125.45.0 - 83.125.45.255 de -83.125.46.0 - 83.125.46.255 eu -83.125.47.0 - 83.125.67.255 de -83.125.68.0 - 83.125.69.255 eu -83.125.70.0 - 83.125.79.255 de -83.125.80.0 - 83.125.81.255 eu -83.125.82.0 - 83.125.83.255 de -83.125.84.0 - 83.125.111.255 eu -83.125.112.0 - 83.125.116.15 de -83.125.116.16 - 83.125.117.255 eu -83.125.118.0 - 83.125.127.255 de -83.125.128.0 - 83.127.255.255 eu +83.120.0.0 - 83.125.255.255 de +83.126.0.0 - 83.127.255.255 eu 83.128.0.0 - 83.128.255.255 nl 83.129.0.0 - 83.129.255.255 de 83.130.0.0 - 83.130.255.255 il 83.131.0.0 - 83.131.255.255 hr 83.132.0.0 - 83.132.255.255 pt 83.133.0.0 - 83.133.63.255 de -83.133.64.0 - 83.133.67.255 dk -83.133.68.0 - 83.133.73.255 de -83.133.74.0 - 83.133.83.255 eu +83.133.64.0 - 83.133.83.255 eu 83.133.84.0 - 83.133.127.255 de -83.133.128.0 - 83.133.151.255 eu -83.133.152.0 - 83.133.155.7 de -83.133.155.8 - 83.133.155.255 eu -83.133.156.0 - 83.133.158.255 de -83.133.159.0 - 83.133.159.31 eu -83.133.159.32 - 83.133.159.63 de -83.133.159.64 - 83.133.159.255 eu -83.133.160.0 - 83.133.188.255 de -83.133.189.0 - 83.133.189.127 eu -83.133.189.128 - 83.133.191.255 de +83.133.128.0 - 83.133.179.255 eu +83.133.180.0 - 83.133.191.255 de 83.133.192.0 - 83.133.207.255 eu 83.133.208.0 - 83.133.227.255 de 83.133.228.0 - 83.133.239.255 eu 83.133.240.0 - 83.133.255.255 de 83.134.0.0 - 83.134.255.255 be 83.135.0.0 - 83.135.255.255 de -83.136.0.0 - 83.136.5.31 gb -83.136.5.32 - 83.136.5.63 in -83.136.5.64 - 83.136.5.95 gb -83.136.5.96 - 83.136.5.127 us -83.136.5.128 - 83.136.7.255 gb -83.136.8.0 - 83.136.8.31 ae -83.136.8.32 - 83.136.8.95 gr -83.136.8.96 - 83.136.8.127 sa -83.136.8.128 - 83.136.12.255 ae -83.136.13.0 - 83.136.13.255 gr -83.136.14.0 - 83.136.15.255 ae +83.136.0.0 - 83.136.7.255 gb +83.136.8.0 - 83.136.15.255 ae 83.136.16.0 - 83.136.23.255 nl 83.136.24.0 - 83.136.31.255 ru 83.136.32.0 - 83.136.39.255 at 83.136.40.0 - 83.136.47.255 ie -83.136.48.0 - 83.136.55.255 ru 83.136.56.0 - 83.136.63.255 bh 83.136.64.0 - 83.136.71.255 gb -83.136.72.0 - 83.136.84.159 de -83.136.84.160 - 83.136.84.191 gi -83.136.84.192 - 83.136.87.255 de +83.136.72.0 - 83.136.87.255 de 83.136.88.0 - 83.136.95.255 dk 83.136.96.0 - 83.136.103.255 de 83.136.104.0 - 83.136.111.255 it @@ -43749,7 +22486,6 @@ 83.136.120.0 - 83.136.127.255 gb 83.136.128.0 - 83.136.135.255 de 83.136.136.0 - 83.136.143.255 lv -83.136.144.0 - 83.136.151.255 it 83.136.152.0 - 83.136.159.255 pl 83.136.160.0 - 83.136.167.255 fr 83.136.168.0 - 83.136.175.255 ie @@ -43761,27 +22497,24 @@ 83.136.216.0 - 83.136.223.255 be 83.136.224.0 - 83.136.231.255 pl 83.136.232.0 - 83.136.247.255 ru -83.136.248.0 - 83.136.255.255 fi -83.137.0.0 - 83.137.7.255 gb +83.136.248.0 - 83.137.1.255 gb +83.137.2.0 - 83.137.2.255 eu +83.137.3.0 - 83.137.7.255 gb 83.137.8.0 - 83.137.15.255 se 83.137.16.0 - 83.137.23.255 nl 83.137.24.0 - 83.137.31.255 ch 83.137.32.0 - 83.137.39.255 de 83.137.40.0 - 83.137.47.255 at 83.137.48.0 - 83.137.55.255 ru -83.137.56.0 - 83.137.56.95 it -83.137.56.96 - 83.137.57.255 a2 -83.137.58.0 - 83.137.58.255 it -83.137.59.0 - 83.137.63.255 a2 +83.137.56.0 - 83.137.62.255 it +83.137.63.0 - 83.137.63.255 al 83.137.64.0 - 83.137.71.255 de 83.137.72.0 - 83.137.87.255 ch 83.137.88.0 - 83.137.95.255 ua 83.137.96.0 - 83.137.103.255 de 83.137.104.0 - 83.137.111.255 it -83.137.112.0 - 83.137.113.151 at -83.137.113.152 - 83.137.113.159 ae -83.137.113.160 - 83.137.119.255 at -83.137.120.0 - 83.137.127.255 it +83.137.112.0 - 83.137.119.255 at +83.137.120.0 - 83.137.127.255 dk 83.137.128.0 - 83.137.135.255 gb 83.137.136.0 - 83.137.151.255 nl 83.137.152.0 - 83.137.159.255 hu @@ -43796,15 +22529,11 @@ 83.137.224.0 - 83.137.231.255 gb 83.137.232.0 - 83.137.239.255 it 83.137.240.0 - 83.137.247.255 fr -83.137.248.0 - 83.137.248.31 gb -83.137.248.32 - 83.137.248.63 je -83.137.248.64 - 83.137.248.87 gb -83.137.248.88 - 83.137.248.127 je -83.137.248.128 - 83.137.248.135 gb -83.137.248.136 - 83.137.248.167 je -83.137.248.168 - 83.137.248.175 gb -83.137.248.176 - 83.137.248.223 je -83.137.248.224 - 83.137.255.255 gb +83.137.248.0 - 83.137.249.255 je +83.137.250.0 - 83.137.250.255 gb +83.137.251.0 - 83.137.253.255 je +83.137.254.0 - 83.137.254.255 gb +83.137.255.0 - 83.137.255.255 je 83.138.0.0 - 83.138.7.255 nl 83.138.8.0 - 83.138.15.255 ie 83.138.16.0 - 83.138.39.255 gb @@ -43818,227 +22547,18 @@ 83.139.64.0 - 83.139.127.255 hr 83.139.128.0 - 83.139.191.255 ru 83.139.192.0 - 83.139.255.255 it -83.140.0.0 - 83.140.0.99 se -83.140.0.100 - 83.140.0.103 no -83.140.0.104 - 83.140.0.107 de -83.140.0.108 - 83.140.1.255 se -83.140.2.0 - 83.140.2.31 dk -83.140.2.32 - 83.140.2.35 de -83.140.2.36 - 83.140.2.63 se -83.140.2.64 - 83.140.2.127 dk -83.140.2.128 - 83.140.2.191 se -83.140.2.192 - 83.140.2.223 dk -83.140.2.224 - 83.140.2.251 se -83.140.2.252 - 83.140.2.255 dk -83.140.3.0 - 83.140.3.19 no -83.140.3.20 - 83.140.3.23 se -83.140.3.24 - 83.140.3.27 de -83.140.3.28 - 83.140.3.31 se -83.140.3.32 - 83.140.3.159 no -83.140.3.160 - 83.140.4.3 se -83.140.4.4 - 83.140.4.7 de -83.140.4.8 - 83.140.7.255 se -83.140.8.0 - 83.140.8.43 gb -83.140.8.44 - 83.140.8.47 de -83.140.8.48 - 83.140.8.127 gb -83.140.8.128 - 83.140.8.207 se -83.140.8.208 - 83.140.8.255 gb -83.140.9.0 - 83.140.9.15 nl -83.140.9.16 - 83.140.9.19 de -83.140.9.20 - 83.140.9.63 se -83.140.9.64 - 83.140.9.127 nl -83.140.9.128 - 83.140.11.127 se -83.140.11.128 - 83.140.11.143 de -83.140.11.144 - 83.140.11.159 se -83.140.11.160 - 83.140.11.163 de -83.140.11.164 - 83.140.29.127 se -83.140.29.128 - 83.140.29.143 de -83.140.29.144 - 83.140.44.31 se -83.140.44.32 - 83.140.44.35 gb -83.140.44.36 - 83.140.44.39 se -83.140.44.40 - 83.140.44.43 gb -83.140.44.44 - 83.140.44.47 de -83.140.44.48 - 83.140.54.23 se -83.140.54.24 - 83.140.54.31 de -83.140.54.32 - 83.140.55.175 se -83.140.55.176 - 83.140.55.179 gb -83.140.55.180 - 83.140.55.183 de -83.140.55.184 - 83.140.78.15 se -83.140.78.16 - 83.140.78.19 de -83.140.78.20 - 83.140.80.63 se -83.140.80.64 - 83.140.80.67 de -83.140.80.68 - 83.140.85.255 se -83.140.86.0 - 83.140.86.3 de -83.140.86.4 - 83.140.94.255 se +83.140.0.0 - 83.140.94.255 se 83.140.95.0 - 83.140.95.255 de -83.140.96.0 - 83.140.97.255 fr -83.140.98.0 - 83.140.98.255 se -83.140.99.0 - 83.140.99.255 gb -83.140.100.0 - 83.140.107.255 se -83.140.108.0 - 83.140.108.31 gb -83.140.108.32 - 83.140.108.63 de -83.140.108.64 - 83.140.108.95 nl -83.140.108.96 - 83.140.108.127 es -83.140.108.128 - 83.140.108.159 dk -83.140.108.160 - 83.140.108.191 it -83.140.108.192 - 83.140.108.223 us -83.140.108.224 - 83.140.108.255 nl -83.140.109.0 - 83.140.109.31 gb -83.140.109.32 - 83.140.109.63 de -83.140.109.64 - 83.140.109.95 nl -83.140.109.96 - 83.140.109.127 es -83.140.109.128 - 83.140.109.159 dk -83.140.109.160 - 83.140.109.191 ch -83.140.109.192 - 83.140.109.223 fr -83.140.109.224 - 83.140.109.255 nl -83.140.110.0 - 83.140.110.31 gb -83.140.110.32 - 83.140.110.63 de -83.140.110.64 - 83.140.110.95 se -83.140.110.96 - 83.140.110.127 es -83.140.110.128 - 83.140.110.159 dk -83.140.110.160 - 83.140.110.191 se -83.140.110.192 - 83.140.110.223 it -83.140.110.224 - 83.140.110.255 de -83.140.111.0 - 83.140.111.31 gb -83.140.111.32 - 83.140.111.63 de -83.140.111.64 - 83.140.111.95 nl -83.140.111.96 - 83.140.111.127 es -83.140.111.128 - 83.140.111.159 se -83.140.111.160 - 83.140.111.191 us -83.140.111.192 - 83.140.111.223 gb -83.140.111.224 - 83.140.111.255 nl -83.140.112.0 - 83.140.112.255 se +83.140.96.0 - 83.140.112.255 se 83.140.113.0 - 83.140.113.255 de -83.140.114.0 - 83.140.117.127 se -83.140.117.128 - 83.140.117.143 fr -83.140.117.144 - 83.140.122.203 se -83.140.122.204 - 83.140.122.207 de -83.140.122.208 - 83.140.122.255 se -83.140.123.0 - 83.140.123.3 us -83.140.123.4 - 83.140.131.255 se -83.140.132.0 - 83.140.132.255 nl -83.140.133.0 - 83.140.140.127 se -83.140.140.128 - 83.140.140.143 dk -83.140.140.144 - 83.140.140.147 gb -83.140.140.148 - 83.140.140.151 se -83.140.140.152 - 83.140.140.155 gb -83.140.140.156 - 83.140.140.159 de -83.140.140.160 - 83.140.167.63 se -83.140.167.64 - 83.140.167.67 de -83.140.167.68 - 83.140.170.255 se +83.140.114.0 - 83.140.170.255 se 83.140.171.0 - 83.140.171.255 gb -83.140.172.0 - 83.140.173.79 se -83.140.173.80 - 83.140.173.95 nl -83.140.173.96 - 83.140.173.175 se -83.140.173.176 - 83.140.173.191 nl -83.140.173.192 - 83.140.220.255 se +83.140.172.0 - 83.140.220.255 se 83.140.221.0 - 83.140.221.255 de -83.140.222.0 - 83.140.229.255 se -83.140.230.0 - 83.140.230.31 gb -83.140.230.32 - 83.140.230.47 se -83.140.230.48 - 83.140.230.63 gb -83.140.230.64 - 83.140.230.207 se -83.140.230.208 - 83.140.230.223 gb -83.140.230.224 - 83.140.230.239 se -83.140.230.240 - 83.140.231.15 gb -83.140.231.16 - 83.140.231.47 se -83.140.231.48 - 83.140.231.63 gb -83.140.231.64 - 83.140.231.207 se -83.140.231.208 - 83.140.231.223 gb -83.140.231.224 - 83.140.231.239 se -83.140.231.240 - 83.140.231.255 gb -83.140.232.0 - 83.140.240.31 se -83.140.240.32 - 83.140.240.35 gb -83.140.240.36 - 83.140.240.39 us -83.140.240.40 - 83.140.240.79 se -83.140.240.80 - 83.140.240.95 es -83.140.240.96 - 83.140.241.255 se -83.140.242.0 - 83.140.242.15 it -83.140.242.16 - 83.140.242.39 se -83.140.242.40 - 83.140.242.47 us -83.140.242.48 - 83.140.242.51 my -83.140.242.52 - 83.140.242.55 nl -83.140.242.56 - 83.140.242.63 se -83.140.242.64 - 83.140.242.79 nl -83.140.242.80 - 83.140.242.95 es -83.140.242.96 - 83.140.242.99 gb -83.140.242.100 - 83.140.242.103 se -83.140.242.104 - 83.140.242.107 de -83.140.242.108 - 83.140.242.255 se -83.140.243.0 - 83.140.243.15 dk -83.140.243.16 - 83.140.243.39 se -83.140.243.40 - 83.140.243.47 bg -83.140.243.48 - 83.140.243.63 se -83.140.243.64 - 83.140.243.79 nl -83.140.243.80 - 83.140.243.95 es -83.140.243.96 - 83.140.243.103 gb -83.140.243.104 - 83.140.243.107 se -83.140.243.108 - 83.140.243.111 us -83.140.243.112 - 83.140.243.115 de -83.140.243.116 - 83.140.243.255 se -83.140.244.0 - 83.140.244.15 nl -83.140.244.16 - 83.140.244.35 se -83.140.244.36 - 83.140.244.39 nl -83.140.244.40 - 83.140.244.47 us -83.140.244.48 - 83.140.244.55 gb -83.140.244.56 - 83.140.244.63 se -83.140.244.64 - 83.140.244.79 nl -83.140.244.80 - 83.140.244.95 es -83.140.244.96 - 83.140.244.99 de -83.140.244.100 - 83.140.244.191 se -83.140.244.192 - 83.140.244.207 de -83.140.244.208 - 83.140.244.223 se -83.140.244.224 - 83.140.244.255 ie -83.140.245.0 - 83.140.245.15 no -83.140.245.16 - 83.140.245.31 se -83.140.245.32 - 83.140.245.35 de -83.140.245.36 - 83.140.245.63 se -83.140.245.64 - 83.140.245.79 nl -83.140.245.80 - 83.140.245.95 es -83.140.245.96 - 83.140.245.191 se -83.140.245.192 - 83.140.245.207 de -83.140.245.208 - 83.140.245.255 se -83.140.246.0 - 83.140.246.15 fr -83.140.246.16 - 83.140.246.63 se -83.140.246.64 - 83.140.246.79 nl -83.140.246.80 - 83.140.246.95 es -83.140.246.96 - 83.140.246.99 de -83.140.246.100 - 83.140.246.191 se -83.140.246.192 - 83.140.246.207 de -83.140.246.208 - 83.140.246.255 se -83.140.247.0 - 83.140.247.15 it -83.140.247.16 - 83.140.247.35 se -83.140.247.36 - 83.140.247.39 us -83.140.247.40 - 83.140.247.43 de -83.140.247.44 - 83.140.247.47 se -83.140.247.48 - 83.140.247.63 es -83.140.247.64 - 83.140.247.191 se -83.140.247.192 - 83.140.247.207 de -83.140.247.208 - 83.140.247.223 gb -83.140.247.224 - 83.140.247.239 es -83.140.247.240 - 83.140.248.31 se -83.140.248.32 - 83.140.248.39 dk -83.140.248.40 - 83.140.248.43 se -83.140.248.44 - 83.140.248.47 gb -83.140.248.48 - 83.140.248.127 se -83.140.248.128 - 83.140.248.131 de -83.140.248.132 - 83.140.248.191 se -83.140.248.192 - 83.140.248.207 de -83.140.248.208 - 83.140.248.255 se +83.140.222.0 - 83.140.248.255 se 83.140.249.0 - 83.140.249.255 fr -83.140.250.0 - 83.140.254.143 se -83.140.254.144 - 83.140.254.159 de -83.140.254.160 - 83.140.255.255 se -83.141.0.0 - 83.141.13.255 de -83.141.14.0 - 83.141.14.255 at -83.141.15.0 - 83.141.37.255 de -83.141.38.0 - 83.141.38.255 gb -83.141.39.0 - 83.141.41.255 de -83.141.42.0 - 83.141.43.255 sk -83.141.44.0 - 83.141.61.127 de -83.141.61.128 - 83.141.61.255 nl -83.141.62.0 - 83.141.63.127 de -83.141.63.128 - 83.141.63.255 nl +83.140.250.0 - 83.140.255.255 se +83.141.0.0 - 83.141.63.255 de 83.141.64.0 - 83.141.127.255 ie 83.141.128.0 - 83.141.255.255 fr 83.142.0.0 - 83.142.7.255 se @@ -44046,7 +22566,6 @@ 83.142.16.0 - 83.142.23.255 bg 83.142.24.0 - 83.142.39.255 gb 83.142.40.0 - 83.142.47.255 pl -83.142.48.0 - 83.142.55.255 gb 83.142.56.0 - 83.142.63.255 pl 83.142.64.0 - 83.142.71.255 gb 83.142.72.0 - 83.142.79.255 fi @@ -44076,18 +22595,15 @@ 83.143.48.0 - 83.143.55.255 ru 83.143.56.0 - 83.143.63.255 fi 83.143.64.0 - 83.143.71.255 ru -83.143.72.0 - 83.143.79.255 pl 83.143.80.0 - 83.143.87.255 no 83.143.88.0 - 83.143.95.255 fi 83.143.96.0 - 83.143.103.255 pl -83.143.104.0 - 83.143.111.255 gr -83.143.112.0 - 83.143.119.255 no 83.143.120.0 - 83.143.127.255 dk 83.143.128.0 - 83.143.143.255 pl 83.143.144.0 - 83.143.151.255 bg 83.143.152.0 - 83.143.159.255 ru 83.143.160.0 - 83.143.167.255 pl -83.143.168.0 - 83.143.175.255 kn +83.143.168.0 - 83.143.175.255 gg 83.143.176.0 - 83.143.183.255 bg 83.143.184.0 - 83.143.191.255 nl 83.143.192.0 - 83.143.199.255 ru @@ -44096,7 +22612,22 @@ 83.143.216.0 - 83.143.223.255 fi 83.143.224.0 - 83.143.231.255 gb 83.143.232.0 - 83.143.239.255 ua -83.143.240.0 - 83.143.247.255 eu +83.143.240.0 - 83.143.240.31 cz +83.143.240.32 - 83.143.241.255 eu +83.143.242.0 - 83.143.243.255 gb +83.143.244.0 - 83.143.244.7 eu +83.143.244.8 - 83.143.244.15 it +83.143.244.16 - 83.143.244.23 es +83.143.244.24 - 83.143.244.27 nl +83.143.244.28 - 83.143.244.31 eu +83.143.244.32 - 83.143.244.39 hu +83.143.244.40 - 83.143.244.47 fr +83.143.244.48 - 83.143.244.55 eu +83.143.244.56 - 83.143.244.63 de +83.143.244.64 - 83.143.244.71 hu +83.143.244.72 - 83.143.245.255 eu +83.143.246.0 - 83.143.246.255 us +83.143.247.0 - 83.143.247.255 eu 83.143.248.0 - 83.143.255.255 bg 83.144.0.0 - 83.144.63.255 fr 83.144.64.0 - 83.144.127.255 pl @@ -44104,9 +22635,9 @@ 83.144.192.0 - 83.144.255.255 ch 83.145.0.0 - 83.145.27.255 se 83.145.28.0 - 83.145.29.255 fi -83.145.30.0 - 83.145.63.47 se -83.145.63.48 - 83.145.63.55 gb -83.145.63.56 - 83.145.63.255 se +83.145.30.0 - 83.145.60.255 se +83.145.61.0 - 83.145.61.255 no +83.145.62.0 - 83.145.63.255 se 83.145.64.0 - 83.145.127.255 fr 83.145.128.0 - 83.145.191.255 pl 83.145.192.0 - 83.145.255.255 fi @@ -44124,7 +22655,9 @@ 83.149.0.0 - 83.149.14.255 ru 83.149.15.0 - 83.149.15.255 tj 83.149.16.0 - 83.149.63.255 ru -83.149.64.0 - 83.149.127.255 nl +83.149.64.0 - 83.149.126.156 nl +83.149.126.157 - 83.149.126.157 de +83.149.126.158 - 83.149.127.255 nl 83.149.128.0 - 83.149.191.255 it 83.149.192.0 - 83.149.255.255 ru 83.150.0.0 - 83.150.63.255 ch @@ -44135,55 +22668,31 @@ 83.151.16.0 - 83.151.31.255 de 83.151.32.0 - 83.151.47.255 pl 83.151.48.0 - 83.151.63.255 de -83.151.64.0 - 83.151.69.255 fr -83.151.70.0 - 83.151.70.255 lu -83.151.71.0 - 83.151.71.255 fr -83.151.72.0 - 83.151.73.255 be -83.151.74.0 - 83.151.75.255 fr -83.151.76.0 - 83.151.76.255 be -83.151.77.0 - 83.151.77.255 fr -83.151.78.0 - 83.151.79.255 gb -83.151.80.0 - 83.151.80.255 de -83.151.81.0 - 83.151.81.255 lu -83.151.82.0 - 83.151.83.255 fr -83.151.84.0 - 83.151.84.255 de -83.151.85.0 - 83.151.86.255 ch -83.151.87.0 - 83.151.95.255 gb -83.151.96.0 - 83.151.103.255 us -83.151.104.0 - 83.151.111.255 gb -83.151.112.0 - 83.151.113.255 fr -83.151.114.0 - 83.151.115.255 gb -83.151.116.0 - 83.151.116.255 us -83.151.117.0 - 83.151.127.255 gb +83.151.64.0 - 83.151.67.255 fr +83.151.68.0 - 83.151.95.255 gb +83.151.96.0 - 83.151.99.255 us +83.151.100.0 - 83.151.112.64 gb +83.151.112.65 - 83.151.112.65 fr +83.151.112.66 - 83.151.127.255 gb 83.151.128.0 - 83.151.191.255 dk -83.151.192.0 - 83.151.255.255 gb +83.151.192.0 - 83.151.197.255 gb +83.151.198.0 - 83.151.198.255 us +83.151.199.0 - 83.151.255.255 gb 83.152.0.0 - 83.159.255.255 fr 83.160.0.0 - 83.163.255.255 nl 83.164.0.0 - 83.164.255.255 at 83.165.0.0 - 83.165.255.255 es 83.166.0.0 - 83.166.31.255 se -83.166.32.0 - 83.166.47.255 ee -83.166.48.0 - 83.166.48.15 tr -83.166.48.16 - 83.166.48.23 ee -83.166.48.24 - 83.166.48.27 us -83.166.48.28 - 83.166.48.47 ee -83.166.48.48 - 83.166.48.63 bg -83.166.48.64 - 83.166.48.71 ee -83.166.48.72 - 83.166.48.79 us -83.166.48.80 - 83.166.63.255 ee +83.166.32.0 - 83.166.63.255 ee 83.166.64.0 - 83.166.95.255 gb 83.166.96.0 - 83.166.127.255 ru 83.166.128.0 - 83.166.159.255 nl 83.166.160.0 - 83.166.191.255 gb 83.166.192.0 - 83.166.223.255 ro -83.166.224.0 - 83.167.31.255 ru -83.167.32.0 - 83.167.43.215 fr -83.167.43.216 - 83.167.43.223 be -83.167.43.224 - 83.167.47.255 fr -83.167.48.0 - 83.167.48.15 gb -83.167.48.16 - 83.167.62.111 fr -83.167.62.112 - 83.167.62.119 us -83.167.62.120 - 83.167.63.255 fr +83.166.224.0 - 83.166.231.255 ru +83.166.232.0 - 83.166.236.255 md +83.166.237.0 - 83.167.31.255 ru +83.167.32.0 - 83.167.63.255 fr 83.167.64.0 - 83.167.127.255 ru 83.167.128.0 - 83.167.159.255 fr 83.167.160.0 - 83.167.191.255 gb @@ -44191,9 +22700,7 @@ 83.167.224.0 - 83.167.255.255 cz 83.168.0.0 - 83.168.63.255 cy 83.168.64.0 - 83.168.127.255 pl -83.168.128.0 - 83.168.146.151 sk -83.168.146.152 - 83.168.146.159 sr -83.168.146.160 - 83.168.191.255 sk +83.168.128.0 - 83.168.191.255 sk 83.168.192.0 - 83.168.211.255 se 83.168.212.0 - 83.168.212.255 es 83.168.213.0 - 83.168.217.255 se @@ -44202,86 +22709,16 @@ 83.168.223.0 - 83.168.223.255 de 83.168.224.0 - 83.168.233.255 se 83.168.234.0 - 83.168.234.255 dk -83.168.235.0 - 83.168.238.255 se -83.168.239.0 - 83.168.239.255 gb -83.168.240.0 - 83.168.245.255 se +83.168.235.0 - 83.168.245.255 se 83.168.246.0 - 83.168.246.255 us 83.168.247.0 - 83.168.255.255 se 83.169.0.0 - 83.169.63.255 de -83.169.64.0 - 83.169.66.111 fr -83.169.66.112 - 83.169.66.127 mc -83.169.66.128 - 83.169.127.255 fr +83.169.64.0 - 83.169.127.255 fr 83.169.128.0 - 83.169.191.255 de 83.169.192.0 - 83.169.255.255 ru -83.170.0.0 - 83.170.6.63 a2 -83.170.6.64 - 83.170.6.79 de -83.170.6.80 - 83.170.6.143 a2 -83.170.6.144 - 83.170.6.159 de -83.170.6.160 - 83.170.6.223 a2 -83.170.6.224 - 83.170.6.247 de -83.170.6.248 - 83.170.6.255 a2 -83.170.7.0 - 83.170.7.255 de -83.170.8.0 - 83.170.8.223 a2 -83.170.8.224 - 83.170.8.255 de -83.170.9.0 - 83.170.22.255 a2 -83.170.23.0 - 83.170.23.7 ir -83.170.23.8 - 83.170.25.255 a2 -83.170.26.0 - 83.170.26.255 ir -83.170.27.0 - 83.170.32.255 a2 -83.170.33.0 - 83.170.33.31 ir -83.170.33.32 - 83.170.33.63 kw -83.170.33.64 - 83.170.34.95 a2 -83.170.34.96 - 83.170.34.127 ir -83.170.34.128 - 83.170.34.159 a2 -83.170.34.160 - 83.170.34.223 ir -83.170.34.224 - 83.170.41.191 a2 -83.170.41.192 - 83.170.41.255 ir -83.170.42.0 - 83.170.43.127 a2 -83.170.43.128 - 83.170.43.159 ir -83.170.43.160 - 83.170.43.223 ae -83.170.43.224 - 83.170.43.254 ir -83.170.43.255 - 83.170.45.63 a2 -83.170.45.64 - 83.170.45.95 ir -83.170.45.96 - 83.170.45.159 a2 -83.170.45.160 - 83.170.45.191 ir -83.170.45.192 - 83.170.46.63 a2 -83.170.46.64 - 83.170.46.95 ir -83.170.46.96 - 83.170.46.127 a2 -83.170.46.128 - 83.170.46.159 ir -83.170.46.160 - 83.170.46.191 a2 -83.170.46.192 - 83.170.46.223 ir -83.170.46.224 - 83.170.47.31 a2 -83.170.47.32 - 83.170.47.63 ir -83.170.47.64 - 83.170.47.95 a2 -83.170.47.96 - 83.170.47.127 ae -83.170.47.128 - 83.170.47.191 a2 -83.170.47.192 - 83.170.47.223 ae -83.170.47.224 - 83.170.48.159 a2 -83.170.48.160 - 83.170.48.191 ir -83.170.48.192 - 83.170.49.63 a2 -83.170.49.64 - 83.170.49.95 ir -83.170.49.96 - 83.170.49.223 a2 -83.170.49.224 - 83.170.50.63 ir -83.170.50.64 - 83.170.50.95 a2 -83.170.50.96 - 83.170.50.127 ae -83.170.50.128 - 83.170.50.191 ir -83.170.50.192 - 83.170.51.31 a2 -83.170.51.32 - 83.170.51.95 ae -83.170.51.96 - 83.170.51.255 a2 -83.170.52.0 - 83.170.52.127 ir -83.170.52.128 - 83.170.52.151 a2 -83.170.52.152 - 83.170.52.159 ir -83.170.52.160 - 83.170.52.167 a2 -83.170.52.168 - 83.170.52.175 iq -83.170.52.176 - 83.170.52.207 a2 -83.170.52.208 - 83.170.52.215 ae -83.170.52.216 - 83.170.52.229 a2 -83.170.52.230 - 83.170.52.230 ir -83.170.52.231 - 83.170.58.23 a2 -83.170.58.24 - 83.170.58.31 tz -83.170.58.32 - 83.170.58.255 a2 -83.170.59.0 - 83.170.59.31 de -83.170.59.32 - 83.170.63.255 a2 +83.170.0.0 - 83.170.13.255 a2 +83.170.14.0 - 83.170.14.31 de +83.170.14.32 - 83.170.63.255 a2 83.170.64.0 - 83.170.127.255 gb 83.170.128.0 - 83.170.151.255 a2 83.170.152.0 - 83.170.163.255 gb @@ -44301,7 +22738,8 @@ 83.173.192.0 - 83.173.255.255 ch 83.174.0.0 - 83.174.63.255 pt 83.174.64.0 - 83.174.127.255 se -83.174.128.0 - 83.174.191.255 gr +83.174.128.0 - 83.174.159.255 gr +83.174.160.0 - 83.174.191.255 ie 83.174.192.0 - 83.174.255.255 ru 83.175.0.0 - 83.175.63.255 it 83.175.64.0 - 83.175.127.255 at @@ -44310,100 +22748,197 @@ 83.176.0.0 - 83.176.31.255 ee 83.176.32.0 - 83.176.63.255 hr 83.176.64.0 - 83.176.127.255 no -83.176.128.0 - 83.176.159.255 de +83.176.128.0 - 83.176.129.255 se +83.176.130.0 - 83.176.149.255 lv +83.176.150.0 - 83.176.151.255 se +83.176.152.0 - 83.176.155.255 de +83.176.156.0 - 83.176.159.255 se 83.176.160.0 - 83.176.191.255 no -83.176.192.0 - 83.177.31.255 se +83.176.192.0 - 83.176.255.255 se +83.177.0.0 - 83.177.15.255 nl +83.177.16.0 - 83.177.23.255 hr +83.177.24.0 - 83.177.31.255 se 83.177.32.0 - 83.177.63.255 no -83.177.64.0 - 83.178.37.255 se -83.178.38.0 - 83.178.39.255 no -83.178.40.0 - 83.178.47.255 se -83.178.48.0 - 83.178.51.255 no -83.178.52.0 - 83.178.55.255 se -83.178.56.0 - 83.178.57.255 lt -83.178.58.0 - 83.178.59.255 ee -83.178.60.0 - 83.178.63.255 no +83.177.64.0 - 83.177.83.255 se +83.177.84.0 - 83.177.87.255 hr +83.177.88.0 - 83.177.103.255 se +83.177.104.0 - 83.177.111.255 nl +83.177.112.0 - 83.177.119.255 se +83.177.120.0 - 83.177.127.255 nl +83.177.128.0 - 83.177.223.255 se +83.177.224.0 - 83.177.255.255 lv +83.178.0.0 - 83.178.31.255 ee +83.178.32.0 - 83.178.51.127 se +83.178.51.128 - 83.178.51.143 lv +83.178.51.144 - 83.178.51.159 nl +83.178.51.160 - 83.178.57.255 se +83.178.58.0 - 83.178.63.255 ee 83.178.64.0 - 83.178.71.255 se 83.178.72.0 - 83.178.79.255 lv -83.178.80.0 - 83.178.83.255 lt -83.178.84.0 - 83.178.85.255 no -83.178.86.0 - 83.178.89.255 lt -83.178.90.0 - 83.178.91.255 no -83.178.92.0 - 83.178.95.255 lt +83.178.80.0 - 83.178.95.255 lt 83.178.96.0 - 83.178.103.255 se 83.178.104.0 - 83.178.111.255 nl 83.178.112.0 - 83.178.127.255 hr -83.178.128.0 - 83.178.139.255 no +83.178.128.0 - 83.178.135.255 lv +83.178.136.0 - 83.178.139.255 no 83.178.140.0 - 83.178.147.255 lv 83.178.148.0 - 83.178.159.255 se 83.178.160.0 - 83.178.175.255 lv 83.178.176.0 - 83.178.179.255 se 83.178.180.0 - 83.178.183.255 ee -83.178.184.0 - 83.178.187.255 ru +83.178.184.0 - 83.178.187.255 se 83.178.188.0 - 83.178.189.255 lv -83.178.190.0 - 83.178.199.255 se -83.178.200.0 - 83.178.205.255 ru -83.178.206.0 - 83.178.207.255 hr -83.178.208.0 - 83.178.223.255 lv +83.178.190.0 - 83.178.205.255 se +83.178.206.0 - 83.178.223.255 lv 83.178.224.0 - 83.178.225.255 se 83.178.226.0 - 83.178.227.255 no -83.178.228.0 - 83.178.229.255 ch -83.178.230.0 - 83.178.233.255 se -83.178.234.0 - 83.178.239.255 hr -83.178.240.0 - 83.179.63.255 se -83.179.64.0 - 83.179.255.255 ru -83.180.0.0 - 83.180.63.255 nl -83.180.64.0 - 83.180.127.255 ru -83.180.128.0 - 83.181.31.255 se +83.178.228.0 - 83.178.229.255 lv +83.178.230.0 - 83.178.235.255 se +83.178.236.0 - 83.178.255.255 hr +83.179.0.0 - 83.179.255.255 se +83.180.0.0 - 83.180.31.255 ee +83.180.32.0 - 83.180.63.255 hr +83.180.64.0 - 83.180.127.255 ee +83.180.128.0 - 83.180.135.255 se +83.180.136.0 - 83.180.143.255 hr +83.180.144.0 - 83.181.31.255 se 83.181.32.0 - 83.181.47.255 at -83.181.48.0 - 83.181.63.255 se -83.181.64.0 - 83.181.95.255 de -83.181.96.0 - 83.181.127.255 se -83.181.128.0 - 83.181.159.255 nl -83.181.160.0 - 83.181.191.255 se -83.181.192.0 - 83.181.255.255 ru -83.182.0.0 - 83.184.31.255 se -83.184.32.0 - 83.184.63.255 hr -83.184.64.0 - 83.184.127.255 kz -83.184.128.0 - 83.185.47.255 se -83.185.48.0 - 83.185.49.255 hr -83.185.50.0 - 83.186.255.255 se -83.187.0.0 - 83.187.16.255 nl -83.187.17.0 - 83.187.17.255 se -83.187.18.0 - 83.187.19.255 nl -83.187.20.0 - 83.187.23.255 se -83.187.24.0 - 83.187.63.255 nl -83.187.64.0 - 83.187.127.255 se +83.181.48.0 - 83.181.55.255 hr +83.181.56.0 - 83.181.58.255 lt +83.181.59.0 - 83.181.63.255 se +83.181.64.0 - 83.181.191.255 lt +83.181.192.0 - 83.181.217.6 hr +83.181.217.7 - 83.181.217.7 se +83.181.217.8 - 83.181.255.255 hr +83.182.0.0 - 83.182.31.255 se +83.182.32.0 - 83.182.63.255 no +83.182.64.0 - 83.183.31.255 se +83.183.32.0 - 83.183.63.255 hr +83.183.64.0 - 83.183.79.255 se +83.183.80.0 - 83.183.95.255 lv +83.183.96.0 - 83.183.143.255 se +83.183.144.0 - 83.183.159.255 lv +83.183.160.0 - 83.183.223.255 se +83.183.224.0 - 83.183.239.255 lv +83.183.240.0 - 83.183.255.255 se +83.184.0.0 - 83.184.63.255 hr +83.184.64.0 - 83.184.127.255 no +83.184.128.0 - 83.184.255.255 se +83.185.0.0 - 83.185.31.255 hr +83.185.32.0 - 83.185.175.255 se +83.185.176.0 - 83.185.183.255 hr +83.185.184.0 - 83.186.127.255 se +83.186.128.0 - 83.186.255.255 hr +83.187.0.0 - 83.187.63.255 nl +83.187.64.0 - 83.187.95.255 se +83.187.96.0 - 83.187.127.255 nl 83.187.128.0 - 83.187.143.255 ee -83.187.144.0 - 83.187.147.255 se -83.187.148.0 - 83.187.151.255 ee +83.187.144.0 - 83.187.151.255 se 83.187.152.0 - 83.187.155.255 lv 83.187.156.0 - 83.187.159.255 se 83.187.160.0 - 83.187.191.255 at 83.187.192.0 - 83.187.201.255 ee 83.187.202.0 - 83.187.203.255 lt -83.187.204.0 - 83.187.223.255 nl -83.187.224.0 - 83.187.255.255 se -83.188.0.0 - 83.188.159.255 ru +83.187.204.0 - 83.187.255.255 nl +83.188.0.0 - 83.188.95.255 lt +83.188.96.0 - 83.188.127.255 se +83.188.128.0 - 83.188.159.255 hr 83.188.160.0 - 83.188.167.255 lt 83.188.168.0 - 83.188.175.255 se 83.188.176.0 - 83.188.179.255 lv -83.188.180.0 - 83.188.183.255 lt -83.188.184.0 - 83.188.255.255 se -83.189.0.0 - 83.189.127.255 de +83.188.180.0 - 83.188.223.255 se +83.188.224.0 - 83.189.127.255 nl 83.189.128.0 - 83.189.191.255 se -83.189.192.0 - 83.189.223.255 de -83.189.224.0 - 83.189.255.255 nl -83.190.0.0 - 83.190.255.255 se +83.189.192.0 - 83.189.255.255 lt +83.190.0.0 - 83.190.63.255 se +83.190.64.0 - 83.190.127.255 lt +83.190.128.0 - 83.190.191.255 se +83.190.192.0 - 83.190.255.255 lt 83.191.0.0 - 83.191.63.255 no 83.191.64.0 - 83.191.87.255 se 83.191.88.0 - 83.191.95.255 hr 83.191.96.0 - 83.191.127.255 at 83.191.128.0 - 83.191.143.255 se 83.191.144.0 - 83.191.159.255 no -83.191.160.0 - 83.191.191.255 de -83.191.192.0 - 83.191.223.255 nl +83.191.160.0 - 83.191.223.255 ee 83.191.224.0 - 83.191.255.255 se -83.192.0.0 - 83.207.255.255 fr +83.192.0.0 - 83.203.0.255 fr +83.203.1.0 - 83.203.3.255 mq +83.203.4.0 - 83.203.5.255 fr +83.203.6.0 - 83.203.6.255 mq +83.203.7.0 - 83.203.7.255 fr +83.203.8.0 - 83.203.10.255 mq +83.203.11.0 - 83.203.13.255 fr +83.203.14.0 - 83.203.16.255 mq +83.203.17.0 - 83.203.18.255 fr +83.203.19.0 - 83.203.33.255 mq +83.203.34.0 - 83.203.34.255 fr +83.203.35.0 - 83.203.42.255 mq +83.203.43.0 - 83.203.43.255 fr +83.203.44.0 - 83.203.50.255 mq +83.203.51.0 - 83.203.51.255 fr +83.203.52.0 - 83.203.57.255 mq +83.203.58.0 - 83.203.58.255 fr +83.203.59.0 - 83.203.60.255 mq +83.203.61.0 - 83.203.61.255 fr +83.203.62.0 - 83.203.64.255 mq +83.203.65.0 - 83.203.66.255 fr +83.203.67.0 - 83.203.67.255 mq +83.203.68.0 - 83.203.68.255 fr +83.203.69.0 - 83.203.70.255 mq +83.203.71.0 - 83.203.71.255 fr +83.203.72.0 - 83.203.85.255 mq +83.203.86.0 - 83.203.86.255 fr +83.203.87.0 - 83.203.90.255 mq +83.203.91.0 - 83.203.91.255 fr +83.203.92.0 - 83.203.92.255 mq +83.203.93.0 - 83.203.97.255 fr +83.203.98.0 - 83.203.98.255 mq +83.203.99.0 - 83.203.99.255 fr +83.203.100.0 - 83.203.108.255 mq +83.203.109.0 - 83.203.109.255 fr +83.203.110.0 - 83.203.115.255 mq +83.203.116.0 - 83.203.116.255 fr +83.203.117.0 - 83.203.129.255 mq +83.203.130.0 - 83.203.130.255 fr +83.203.131.0 - 83.203.132.255 mq +83.203.133.0 - 83.203.133.255 fr +83.203.134.0 - 83.203.135.255 mq +83.203.136.0 - 83.203.136.255 fr +83.203.137.0 - 83.203.138.255 mq +83.203.139.0 - 83.203.143.255 fr +83.203.144.0 - 83.203.149.255 mq +83.203.150.0 - 83.203.150.255 fr +83.203.151.0 - 83.203.153.255 mq +83.203.154.0 - 83.203.154.255 fr +83.203.155.0 - 83.203.156.255 mq +83.203.157.0 - 83.203.158.255 fr +83.203.159.0 - 83.203.159.255 mq +83.203.160.0 - 83.203.160.255 fr +83.203.161.0 - 83.203.162.255 mq +83.203.163.0 - 83.203.164.255 fr +83.203.165.0 - 83.203.176.255 mq +83.203.177.0 - 83.203.177.255 fr +83.203.178.0 - 83.203.186.255 mq +83.203.187.0 - 83.203.187.255 fr +83.203.188.0 - 83.203.191.255 mq +83.203.192.0 - 83.203.193.255 fr +83.203.194.0 - 83.203.200.255 mq +83.203.201.0 - 83.203.207.255 fr +83.203.208.0 - 83.203.208.255 mq +83.203.209.0 - 83.203.209.255 fr +83.203.210.0 - 83.203.213.255 mq +83.203.214.0 - 83.203.214.255 fr +83.203.215.0 - 83.203.219.255 mq +83.203.220.0 - 83.203.220.255 fr +83.203.221.0 - 83.203.240.255 mq +83.203.241.0 - 83.203.241.255 fr +83.203.242.0 - 83.203.242.255 mq +83.203.243.0 - 83.203.243.255 fr +83.203.244.0 - 83.203.252.255 mq +83.203.253.0 - 83.203.253.255 fr +83.203.254.0 - 83.203.255.255 mq +83.204.0.0 - 83.207.255.255 fr 83.208.0.0 - 83.208.255.255 cz 83.209.0.0 - 83.209.255.255 se 83.210.0.0 - 83.210.255.255 ie @@ -44418,99 +22953,29 @@ 83.216.96.0 - 83.216.127.255 se 83.216.128.0 - 83.216.159.255 gb 83.216.160.0 - 83.216.171.255 it -83.216.172.0 - 83.216.175.255 a2 -83.216.176.0 - 83.216.176.255 it -83.216.177.0 - 83.216.181.255 a2 -83.216.182.0 - 83.216.184.255 it -83.216.185.0 - 83.216.189.255 a2 -83.216.190.0 - 83.216.191.255 it -83.216.192.0 - 83.216.195.255 at -83.216.196.0 - 83.216.197.255 nl -83.216.198.0 - 83.216.198.127 at -83.216.198.128 - 83.216.198.255 nl -83.216.199.0 - 83.216.199.63 at -83.216.199.64 - 83.216.201.255 nl -83.216.202.0 - 83.216.202.255 at -83.216.203.0 - 83.216.203.255 nl -83.216.204.0 - 83.216.205.255 at -83.216.206.0 - 83.216.206.255 nl -83.216.207.0 - 83.216.207.255 de -83.216.208.0 - 83.216.208.63 gb -83.216.208.64 - 83.216.208.67 at -83.216.208.68 - 83.216.213.255 gb -83.216.214.0 - 83.216.214.255 at -83.216.215.0 - 83.216.215.255 gb -83.216.216.0 - 83.216.219.255 at -83.216.220.0 - 83.216.223.255 gb +83.216.172.0 - 83.216.173.255 a2 +83.216.174.0 - 83.216.191.255 it +83.216.192.0 - 83.216.223.255 at 83.216.224.0 - 83.216.255.255 de 83.217.0.0 - 83.217.63.255 ru -83.217.64.0 - 83.217.66.255 be -83.217.67.0 - 83.217.68.31 nl -83.217.68.32 - 83.217.68.95 be -83.217.68.96 - 83.217.68.127 nl -83.217.68.128 - 83.217.73.255 be -83.217.74.0 - 83.217.74.255 nl -83.217.75.0 - 83.217.75.127 be -83.217.75.128 - 83.217.75.255 nl -83.217.76.0 - 83.217.76.79 be -83.217.76.80 - 83.217.76.127 nl -83.217.76.128 - 83.217.76.143 be -83.217.76.144 - 83.217.76.223 nl -83.217.76.224 - 83.217.76.255 be -83.217.77.0 - 83.217.77.255 nl -83.217.78.0 - 83.217.78.111 be -83.217.78.112 - 83.217.78.127 nl -83.217.78.128 - 83.217.80.255 be -83.217.81.0 - 83.217.83.255 nl -83.217.84.0 - 83.217.84.63 be -83.217.84.64 - 83.217.84.159 nl -83.217.84.160 - 83.217.84.223 be -83.217.84.224 - 83.217.84.255 nl -83.217.85.0 - 83.217.85.255 be -83.217.86.0 - 83.217.86.127 nl -83.217.86.128 - 83.217.86.191 be -83.217.86.192 - 83.217.86.255 nl -83.217.87.0 - 83.217.87.223 be -83.217.87.224 - 83.217.87.239 nl -83.217.87.240 - 83.217.87.255 be -83.217.88.0 - 83.217.95.255 nl +83.217.64.0 - 83.217.94.255 be +83.217.95.0 - 83.217.95.255 fr 83.217.96.0 - 83.217.127.255 gb -83.217.128.0 - 83.217.159.255 be +83.217.128.0 - 83.217.159.255 lu 83.217.160.0 - 83.217.191.255 gb 83.217.192.0 - 83.217.223.255 ru -83.217.224.0 - 83.217.224.95 gb -83.217.224.96 - 83.217.224.111 es -83.217.224.112 - 83.217.225.95 gb -83.217.225.96 - 83.217.225.127 es -83.217.225.128 - 83.217.225.215 gb -83.217.225.216 - 83.217.226.255 es -83.217.227.0 - 83.217.227.127 bg -83.217.227.128 - 83.217.227.255 es -83.217.228.0 - 83.217.228.103 gb -83.217.228.104 - 83.217.229.255 es -83.217.230.0 - 83.217.230.15 gb -83.217.230.16 - 83.217.230.63 es -83.217.230.64 - 83.217.230.127 gb -83.217.230.128 - 83.217.230.255 es -83.217.231.0 - 83.217.231.127 ro -83.217.231.128 - 83.217.231.255 es -83.217.232.0 - 83.217.232.255 fr -83.217.233.0 - 83.217.233.127 hu -83.217.233.128 - 83.217.233.255 es -83.217.234.0 - 83.217.234.7 gb -83.217.234.8 - 83.217.234.15 es -83.217.234.16 - 83.217.234.31 gb -83.217.234.32 - 83.217.234.63 es -83.217.234.64 - 83.217.235.71 gb -83.217.235.72 - 83.217.235.79 es -83.217.235.80 - 83.217.235.87 gb -83.217.235.88 - 83.217.235.95 es -83.217.235.96 - 83.217.237.175 gb -83.217.237.176 - 83.217.238.255 es -83.217.239.0 - 83.217.239.31 gb -83.217.239.32 - 83.217.251.255 es +83.217.224.0 - 83.217.225.255 es +83.217.226.0 - 83.217.226.255 nl +83.217.227.0 - 83.217.237.247 es +83.217.237.248 - 83.217.238.127 gb +83.217.238.128 - 83.217.248.115 es +83.217.248.116 - 83.217.248.119 gb +83.217.248.120 - 83.217.251.255 es 83.217.252.0 - 83.217.255.255 nl -83.218.0.0 - 83.218.31.255 gb +83.218.0.0 - 83.218.2.255 gb +83.218.3.0 - 83.218.3.255 im +83.218.4.0 - 83.218.30.255 gb +83.218.31.0 - 83.218.31.255 im 83.218.32.0 - 83.218.63.255 de 83.218.64.0 - 83.218.95.255 se 83.218.96.0 - 83.218.127.255 pl @@ -44521,36 +22986,24 @@ 83.219.0.0 - 83.219.31.255 ru 83.219.32.0 - 83.219.63.255 gb 83.219.64.0 - 83.219.95.255 nl -83.219.96.0 - 83.219.127.255 ch +83.219.104.0 - 83.219.111.255 de +83.219.112.0 - 83.219.127.255 ch 83.219.128.0 - 83.219.159.255 ru 83.219.160.0 - 83.219.191.255 at 83.219.192.0 - 83.219.223.255 se -83.219.224.0 - 83.219.253.255 ru -83.219.254.0 - 83.219.255.255 de +83.219.224.0 - 83.219.255.255 ru 83.220.0.0 - 83.220.31.255 it 83.220.32.0 - 83.220.95.255 ru 83.220.96.0 - 83.220.127.255 pl -83.220.128.0 - 83.220.146.63 de -83.220.146.64 - 83.220.146.127 nl -83.220.146.128 - 83.220.147.255 de -83.220.148.0 - 83.220.148.191 us -83.220.148.192 - 83.220.157.255 de -83.220.158.0 - 83.220.158.31 gb -83.220.158.32 - 83.220.158.47 nl -83.220.158.48 - 83.220.158.103 gb -83.220.158.104 - 83.220.158.111 de -83.220.158.112 - 83.220.158.127 gb -83.220.158.128 - 83.220.158.255 de -83.220.159.0 - 83.220.159.63 gb -83.220.159.64 - 83.220.159.255 de +83.220.128.0 - 83.220.146.127 de +83.220.146.128 - 83.220.146.255 nl +83.220.147.0 - 83.220.159.255 de 83.220.160.0 - 83.220.191.255 ru 83.220.192.0 - 83.220.223.255 ie 83.220.224.0 - 83.221.31.255 ru 83.221.32.0 - 83.221.95.255 de 83.221.96.0 - 83.221.127.255 it -83.221.128.0 - 83.221.129.255 dk -83.221.130.0 - 83.221.130.255 us -83.221.131.0 - 83.221.159.255 dk +83.221.128.0 - 83.221.159.255 dk 83.221.160.0 - 83.221.163.255 uz 83.221.164.0 - 83.221.167.255 ru 83.221.168.0 - 83.221.191.255 uz @@ -44559,7 +23012,8 @@ 83.222.0.0 - 83.222.31.255 ru 83.222.32.0 - 83.222.63.255 lu 83.222.64.0 - 83.222.123.255 ru -83.222.124.0 - 83.222.127.255 us +83.222.124.0 - 83.222.127.127 us +83.222.127.128 - 83.222.127.255 ru 83.222.128.0 - 83.222.159.255 ch 83.222.160.0 - 83.222.191.255 bg 83.222.192.0 - 83.222.223.255 ru @@ -44567,1186 +23021,65 @@ 83.223.0.0 - 83.223.31.255 se 83.223.32.0 - 83.223.63.255 nl 83.223.64.0 - 83.223.95.255 de -83.223.96.0 - 83.223.97.7 gb -83.223.97.8 - 83.223.97.15 se -83.223.97.16 - 83.223.102.127 gb -83.223.102.128 - 83.223.102.191 cy -83.223.102.192 - 83.223.102.223 se -83.223.102.224 - 83.223.109.255 gb -83.223.110.0 - 83.223.110.255 se -83.223.111.0 - 83.223.112.131 gb -83.223.112.132 - 83.223.112.135 ie -83.223.112.136 - 83.223.112.159 us -83.223.112.160 - 83.223.115.7 gb -83.223.115.8 - 83.223.115.31 nl -83.223.115.32 - 83.223.121.191 gb -83.223.121.192 - 83.223.121.199 se -83.223.121.200 - 83.223.122.23 gb -83.223.122.24 - 83.223.122.31 se -83.223.122.32 - 83.223.127.255 gb +83.223.96.0 - 83.223.127.255 gb 83.223.128.0 - 83.223.159.255 lv 83.223.160.0 - 83.223.191.255 pt 83.223.192.0 - 83.223.223.255 gb -83.223.224.0 - 83.223.255.255 ru +83.223.224.0 - 83.223.255.255 pt 83.224.0.0 - 83.225.255.255 it 83.226.0.0 - 83.227.255.255 se 83.228.0.0 - 83.228.127.255 bg 83.228.128.0 - 83.228.255.255 ch -83.229.0.0 - 83.229.0.7 a2 -83.229.0.8 - 83.229.0.15 ng -83.229.0.16 - 83.229.0.31 a2 -83.229.0.32 - 83.229.0.39 ng -83.229.0.40 - 83.229.0.55 a2 -83.229.0.56 - 83.229.0.63 ng -83.229.0.64 - 83.229.0.71 ug -83.229.0.72 - 83.229.0.79 lr -83.229.0.80 - 83.229.0.95 a2 -83.229.0.96 - 83.229.0.103 ao -83.229.0.104 - 83.229.0.111 a2 -83.229.0.112 - 83.229.0.119 ng -83.229.0.120 - 83.229.0.135 a2 -83.229.0.136 - 83.229.0.143 ng -83.229.0.144 - 83.229.0.175 a2 -83.229.0.176 - 83.229.0.183 ng -83.229.0.184 - 83.229.0.191 a2 -83.229.0.192 - 83.229.0.199 ng -83.229.0.200 - 83.229.0.207 a2 -83.229.0.208 - 83.229.0.223 ng -83.229.0.224 - 83.229.0.239 a2 -83.229.0.240 - 83.229.0.255 ng -83.229.1.0 - 83.229.1.7 a2 -83.229.1.8 - 83.229.1.23 ng -83.229.1.24 - 83.229.1.31 a2 -83.229.1.32 - 83.229.1.39 ng -83.229.1.40 - 83.229.1.47 a2 -83.229.1.48 - 83.229.1.55 gn -83.229.1.56 - 83.229.1.63 ke -83.229.1.64 - 83.229.1.71 cd -83.229.1.72 - 83.229.1.95 a2 -83.229.1.96 - 83.229.1.103 gq -83.229.1.104 - 83.229.1.111 ng -83.229.1.112 - 83.229.1.119 a2 -83.229.1.120 - 83.229.1.127 gq -83.229.1.128 - 83.229.1.207 a2 -83.229.1.208 - 83.229.1.215 ng -83.229.1.216 - 83.229.1.223 a2 -83.229.1.224 - 83.229.1.231 cd -83.229.1.232 - 83.229.1.239 ml -83.229.1.240 - 83.229.1.247 a2 -83.229.1.248 - 83.229.1.255 ng -83.229.2.0 - 83.229.2.127 gb -83.229.2.128 - 83.229.2.199 a2 -83.229.2.200 - 83.229.2.207 cd -83.229.2.208 - 83.229.2.239 a2 -83.229.2.240 - 83.229.2.247 us -83.229.2.248 - 83.229.2.255 ng -83.229.3.0 - 83.229.3.255 a2 -83.229.4.0 - 83.229.4.191 ng -83.229.4.192 - 83.229.4.223 cd -83.229.4.224 - 83.229.4.255 a2 -83.229.5.0 - 83.229.5.63 sl -83.229.5.64 - 83.229.5.79 za -83.229.5.80 - 83.229.5.87 a2 -83.229.5.88 - 83.229.5.103 cd -83.229.5.104 - 83.229.5.111 ng -83.229.5.112 - 83.229.5.127 a2 -83.229.5.128 - 83.229.5.159 lr -83.229.5.160 - 83.229.5.175 ng -83.229.5.176 - 83.229.5.183 zw -83.229.5.184 - 83.229.5.191 gh -83.229.5.192 - 83.229.5.199 a2 -83.229.5.200 - 83.229.5.207 za -83.229.5.208 - 83.229.5.215 ng -83.229.5.216 - 83.229.5.223 cd -83.229.5.224 - 83.229.5.231 a2 -83.229.5.232 - 83.229.5.247 ng -83.229.5.248 - 83.229.5.255 ae -83.229.6.0 - 83.229.6.7 lr -83.229.6.8 - 83.229.6.23 a2 -83.229.6.24 - 83.229.6.47 ng -83.229.6.48 - 83.229.6.55 cd -83.229.6.56 - 83.229.6.61 gh -83.229.6.62 - 83.229.6.127 a2 -83.229.6.128 - 83.229.6.135 cg -83.229.6.136 - 83.229.6.143 za -83.229.6.144 - 83.229.6.151 a2 -83.229.6.152 - 83.229.6.159 ng -83.229.6.160 - 83.229.6.167 za -83.229.6.168 - 83.229.6.175 ao -83.229.6.176 - 83.229.8.111 a2 -83.229.8.112 - 83.229.8.127 ng -83.229.8.128 - 83.229.8.191 fr -83.229.8.192 - 83.229.8.223 ng -83.229.8.224 - 83.229.8.255 a2 -83.229.9.0 - 83.229.9.7 ng -83.229.9.8 - 83.229.9.15 a2 -83.229.9.16 - 83.229.9.23 ng -83.229.9.24 - 83.229.9.39 a2 -83.229.9.40 - 83.229.9.47 ao -83.229.9.48 - 83.229.9.55 a2 -83.229.9.56 - 83.229.9.63 ao -83.229.9.64 - 83.229.9.71 ng -83.229.9.72 - 83.229.9.79 a2 -83.229.9.80 - 83.229.9.87 ng -83.229.9.88 - 83.229.9.95 bj -83.229.9.96 - 83.229.9.103 a2 -83.229.9.104 - 83.229.9.119 ng -83.229.9.120 - 83.229.9.127 cm -83.229.9.128 - 83.229.9.135 ng -83.229.9.136 - 83.229.9.159 sl -83.229.9.160 - 83.229.9.167 a2 -83.229.9.168 - 83.229.9.175 ao -83.229.9.176 - 83.229.9.183 a2 -83.229.9.184 - 83.229.9.191 ao -83.229.9.192 - 83.229.9.199 a2 -83.229.9.200 - 83.229.9.207 sl -83.229.9.208 - 83.229.9.215 a2 -83.229.9.216 - 83.229.9.223 cd -83.229.9.224 - 83.229.9.231 a2 -83.229.9.232 - 83.229.9.239 tg -83.229.9.240 - 83.229.9.247 ng -83.229.9.248 - 83.229.9.255 a2 -83.229.10.0 - 83.229.11.127 ng -83.229.11.128 - 83.229.12.7 a2 -83.229.12.8 - 83.229.12.15 ng -83.229.12.16 - 83.229.12.23 cd -83.229.12.24 - 83.229.12.31 gn -83.229.12.32 - 83.229.12.39 cg -83.229.12.40 - 83.229.12.47 a2 -83.229.12.48 - 83.229.12.55 ng -83.229.12.56 - 83.229.12.71 a2 -83.229.12.72 - 83.229.12.79 ng -83.229.12.80 - 83.229.12.87 a2 -83.229.12.88 - 83.229.12.95 sd -83.229.12.96 - 83.229.12.103 ml -83.229.12.104 - 83.229.12.111 ng -83.229.12.112 - 83.229.12.119 gn -83.229.12.120 - 83.229.12.127 ng -83.229.12.128 - 83.229.12.135 il -83.229.12.136 - 83.229.12.143 ng -83.229.12.144 - 83.229.12.151 cd -83.229.12.152 - 83.229.12.159 a2 -83.229.12.160 - 83.229.12.167 ng -83.229.12.168 - 83.229.12.199 a2 -83.229.12.200 - 83.229.12.215 cd -83.229.12.216 - 83.229.12.223 gb -83.229.12.224 - 83.229.12.239 ng -83.229.12.240 - 83.229.12.247 sd -83.229.12.248 - 83.229.13.7 ng -83.229.13.8 - 83.229.13.15 a2 -83.229.13.16 - 83.229.13.23 ng -83.229.13.24 - 83.229.13.31 a2 -83.229.13.32 - 83.229.13.39 gn -83.229.13.40 - 83.229.13.47 a2 -83.229.13.48 - 83.229.13.55 gb -83.229.13.56 - 83.229.13.71 a2 -83.229.13.72 - 83.229.13.79 cm -83.229.13.80 - 83.229.13.87 ng -83.229.13.88 - 83.229.13.103 a2 -83.229.13.104 - 83.229.13.111 sd -83.229.13.112 - 83.229.13.119 a2 -83.229.13.120 - 83.229.13.127 ne -83.229.13.128 - 83.229.13.135 gn -83.229.13.136 - 83.229.13.143 cd -83.229.13.144 - 83.229.13.151 gn -83.229.13.152 - 83.229.13.152 a2 -83.229.13.153 - 83.229.13.159 gn -83.229.13.160 - 83.229.13.167 il -83.229.13.168 - 83.229.13.175 gn -83.229.13.176 - 83.229.13.207 a2 -83.229.13.208 - 83.229.13.215 ng -83.229.13.216 - 83.229.13.223 cd -83.229.13.224 - 83.229.13.231 sd -83.229.13.232 - 83.229.13.239 a2 -83.229.13.240 - 83.229.13.247 ne -83.229.13.248 - 83.229.14.15 a2 -83.229.14.16 - 83.229.14.23 ng -83.229.14.24 - 83.229.14.55 a2 -83.229.14.56 - 83.229.14.71 ng -83.229.14.72 - 83.229.14.79 sl -83.229.14.80 - 83.229.14.95 a2 -83.229.14.96 - 83.229.14.103 ng -83.229.14.104 - 83.229.14.111 cd -83.229.14.112 - 83.229.14.119 a2 -83.229.14.120 - 83.229.14.141 ng -83.229.14.142 - 83.229.14.159 a2 -83.229.14.160 - 83.229.14.167 ao -83.229.14.168 - 83.229.14.183 a2 -83.229.14.184 - 83.229.14.191 cd -83.229.14.192 - 83.229.14.207 ng -83.229.14.208 - 83.229.14.255 a2 -83.229.15.0 - 83.229.15.15 cd -83.229.15.16 - 83.229.15.31 ng -83.229.15.32 - 83.229.15.39 a2 -83.229.15.40 - 83.229.15.47 ng -83.229.15.48 - 83.229.15.55 sl -83.229.15.56 - 83.229.15.71 ng -83.229.15.72 - 83.229.15.79 a2 -83.229.15.80 - 83.229.15.87 ng -83.229.15.88 - 83.229.15.95 a2 -83.229.15.96 - 83.229.15.103 ao -83.229.15.104 - 83.229.15.111 a2 -83.229.15.112 - 83.229.15.135 ng -83.229.15.136 - 83.229.15.143 ml -83.229.15.144 - 83.229.15.151 ga -83.229.15.152 - 83.229.15.175 a2 -83.229.15.176 - 83.229.15.183 ng -83.229.15.184 - 83.229.15.199 a2 -83.229.15.200 - 83.229.15.207 ng -83.229.15.208 - 83.229.15.223 a2 -83.229.15.224 - 83.229.15.231 lr -83.229.15.232 - 83.229.15.239 ng -83.229.15.240 - 83.229.15.247 bf -83.229.15.248 - 83.229.15.255 cd -83.229.16.0 - 83.229.16.7 tz -83.229.16.8 - 83.229.16.15 a2 -83.229.16.16 - 83.229.16.23 sd -83.229.16.24 - 83.229.16.31 za -83.229.16.32 - 83.229.16.39 a2 -83.229.16.40 - 83.229.16.47 mu -83.229.16.48 - 83.229.16.55 zw -83.229.16.56 - 83.229.16.63 ci -83.229.16.64 - 83.229.16.71 so -83.229.16.72 - 83.229.16.79 a2 -83.229.16.80 - 83.229.16.87 zm -83.229.16.88 - 83.229.16.95 a2 -83.229.16.96 - 83.229.16.103 tz -83.229.16.104 - 83.229.16.119 cd -83.229.16.120 - 83.229.16.127 tz -83.229.16.128 - 83.229.16.135 ao -83.229.16.136 - 83.229.16.143 ng -83.229.16.144 - 83.229.16.151 zw -83.229.16.152 - 83.229.16.159 iq -83.229.16.160 - 83.229.16.167 a2 -83.229.16.168 - 83.229.16.175 cd -83.229.16.176 - 83.229.16.183 tz -83.229.16.184 - 83.229.16.191 zm -83.229.16.192 - 83.229.16.199 ng -83.229.16.200 - 83.229.16.207 a2 -83.229.16.208 - 83.229.16.223 zm -83.229.16.224 - 83.229.16.231 iq -83.229.16.232 - 83.229.16.255 cd -83.229.17.0 - 83.229.17.7 zm -83.229.17.8 - 83.229.17.23 a2 -83.229.17.24 - 83.229.17.31 ng -83.229.17.32 - 83.229.17.39 ke -83.229.17.40 - 83.229.17.47 ng -83.229.17.48 - 83.229.17.55 tz -83.229.17.56 - 83.229.17.63 ug -83.229.17.64 - 83.229.17.71 ng -83.229.17.72 - 83.229.17.79 a2 -83.229.17.80 - 83.229.17.87 mz -83.229.17.88 - 83.229.17.95 sl -83.229.17.96 - 83.229.17.103 a2 -83.229.17.104 - 83.229.17.111 ng -83.229.17.112 - 83.229.17.119 a2 -83.229.17.120 - 83.229.17.127 zm -83.229.17.128 - 83.229.17.135 ng -83.229.17.136 - 83.229.17.143 zw -83.229.17.144 - 83.229.17.151 sd -83.229.17.152 - 83.229.17.159 iq -83.229.17.160 - 83.229.17.175 cd -83.229.17.176 - 83.229.17.183 a2 -83.229.17.184 - 83.229.17.191 iq -83.229.17.192 - 83.229.17.199 mu -83.229.17.200 - 83.229.17.207 tz -83.229.17.208 - 83.229.17.215 lr -83.229.17.216 - 83.229.17.223 a2 -83.229.17.224 - 83.229.17.255 gh -83.229.18.0 - 83.229.18.135 a2 -83.229.18.136 - 83.229.18.143 lr -83.229.18.144 - 83.229.18.255 a2 -83.229.19.0 - 83.229.19.173 ng -83.229.19.174 - 83.229.19.175 a2 -83.229.19.176 - 83.229.19.191 ng -83.229.19.192 - 83.229.19.199 a2 -83.229.19.200 - 83.229.19.215 ng -83.229.19.216 - 83.229.19.223 a2 -83.229.19.224 - 83.229.19.231 ng -83.229.19.232 - 83.229.19.247 a2 -83.229.19.248 - 83.229.19.255 ng -83.229.20.0 - 83.229.22.15 a2 -83.229.22.16 - 83.229.22.23 tg -83.229.22.24 - 83.229.22.31 a2 -83.229.22.32 - 83.229.22.47 so -83.229.22.48 - 83.229.22.55 cd -83.229.22.56 - 83.229.22.63 a2 -83.229.22.64 - 83.229.22.71 gq -83.229.22.72 - 83.229.22.87 a2 -83.229.22.88 - 83.229.22.103 ng -83.229.22.104 - 83.229.22.111 zw -83.229.22.112 - 83.229.22.119 sd -83.229.22.120 - 83.229.22.127 a2 -83.229.22.128 - 83.229.22.135 zm -83.229.22.136 - 83.229.22.151 ug -83.229.22.152 - 83.229.22.159 ml -83.229.22.160 - 83.229.22.167 a2 -83.229.22.168 - 83.229.22.175 lr -83.229.22.176 - 83.229.22.183 tz -83.229.22.184 - 83.229.22.191 zw -83.229.22.192 - 83.229.22.199 lr -83.229.22.200 - 83.229.22.207 zw -83.229.22.208 - 83.229.22.223 a2 -83.229.22.224 - 83.229.22.231 zm -83.229.22.232 - 83.229.22.239 ng -83.229.22.240 - 83.229.22.255 ug -83.229.23.0 - 83.229.23.7 mz -83.229.23.8 - 83.229.23.15 ng -83.229.23.16 - 83.229.23.23 a2 -83.229.23.24 - 83.229.23.31 gl -83.229.23.32 - 83.229.23.39 ug -83.229.23.40 - 83.229.23.47 zm -83.229.23.48 - 83.229.23.55 ao -83.229.23.56 - 83.229.23.71 a2 -83.229.23.72 - 83.229.23.79 mw -83.229.23.80 - 83.229.23.87 gq -83.229.23.88 - 83.229.23.95 ng -83.229.23.96 - 83.229.23.111 a2 -83.229.23.112 - 83.229.23.119 zm -83.229.23.120 - 83.229.23.127 sd -83.229.23.128 - 83.229.23.135 a2 -83.229.23.136 - 83.229.23.143 gl -83.229.23.144 - 83.229.23.151 ng -83.229.23.152 - 83.229.23.159 bj -83.229.23.160 - 83.229.23.167 a2 -83.229.23.168 - 83.229.23.175 zw -83.229.23.176 - 83.229.23.183 lr -83.229.23.184 - 83.229.23.191 ng -83.229.23.192 - 83.229.23.207 zm -83.229.23.208 - 83.229.23.215 a2 -83.229.23.216 - 83.229.23.223 td -83.229.23.224 - 83.229.23.231 zw -83.229.23.232 - 83.229.23.239 a2 -83.229.23.240 - 83.229.23.247 ng -83.229.23.248 - 83.229.23.255 a2 -83.229.24.0 - 83.229.24.7 cd -83.229.24.8 - 83.229.24.15 ng -83.229.24.16 - 83.229.24.23 mz -83.229.24.24 - 83.229.24.31 ng -83.229.24.32 - 83.229.24.39 tz -83.229.24.40 - 83.229.24.47 zw -83.229.24.48 - 83.229.24.55 tz -83.229.24.56 - 83.229.24.63 iq -83.229.24.64 - 83.229.24.71 mu -83.229.24.72 - 83.229.24.79 a2 -83.229.24.80 - 83.229.24.87 ug -83.229.24.88 - 83.229.24.95 ke -83.229.24.96 - 83.229.24.103 cg -83.229.24.104 - 83.229.24.111 a2 -83.229.24.112 - 83.229.24.119 gr -83.229.24.120 - 83.229.24.135 a2 -83.229.24.136 - 83.229.24.151 zw -83.229.24.152 - 83.229.24.159 mu -83.229.24.160 - 83.229.24.167 cd -83.229.24.168 - 83.229.24.175 a2 -83.229.24.176 - 83.229.24.183 cd -83.229.24.184 - 83.229.24.199 a2 -83.229.24.200 - 83.229.24.207 ke -83.229.24.208 - 83.229.24.215 mu -83.229.24.216 - 83.229.24.231 a2 -83.229.24.232 - 83.229.24.239 ng -83.229.24.240 - 83.229.24.247 mu -83.229.24.248 - 83.229.24.255 a2 -83.229.25.0 - 83.229.25.7 cd -83.229.25.8 - 83.229.25.15 a2 -83.229.25.16 - 83.229.25.16 ng -83.229.25.17 - 83.229.25.31 a2 -83.229.25.32 - 83.229.25.39 ug -83.229.25.40 - 83.229.25.47 zw -83.229.25.48 - 83.229.25.55 cd -83.229.25.56 - 83.229.25.63 a2 -83.229.25.64 - 83.229.25.71 bj -83.229.25.72 - 83.229.25.87 a2 -83.229.25.88 - 83.229.25.95 lr -83.229.25.96 - 83.229.25.103 a2 -83.229.25.104 - 83.229.25.111 ug -83.229.25.112 - 83.229.25.119 ng -83.229.25.120 - 83.229.25.135 a2 -83.229.25.136 - 83.229.25.143 sd -83.229.25.144 - 83.229.25.151 bi -83.229.25.152 - 83.229.25.175 ao -83.229.25.176 - 83.229.25.183 a2 -83.229.25.184 - 83.229.25.191 ng -83.229.25.192 - 83.229.25.199 a2 -83.229.25.200 - 83.229.25.207 us -83.229.25.208 - 83.229.25.215 zw -83.229.25.216 - 83.229.25.223 ng -83.229.25.224 - 83.229.25.231 gr -83.229.25.232 - 83.229.25.239 ng -83.229.25.240 - 83.229.25.255 bj -83.229.26.0 - 83.229.26.7 mw -83.229.26.8 - 83.229.26.23 a2 -83.229.26.24 - 83.229.26.31 lu -83.229.26.32 - 83.229.26.127 a2 -83.229.26.128 - 83.229.26.159 mw -83.229.26.160 - 83.229.26.167 lr -83.229.26.168 - 83.229.26.191 mw -83.229.26.192 - 83.229.26.207 a2 -83.229.26.208 - 83.229.26.215 so -83.229.26.216 - 83.229.26.223 ng -83.229.26.224 - 83.229.26.231 cm -83.229.26.232 - 83.229.26.239 ke -83.229.26.240 - 83.229.26.255 a2 -83.229.27.0 - 83.229.27.7 iq -83.229.27.8 - 83.229.27.23 a2 -83.229.27.24 - 83.229.27.31 iq -83.229.27.32 - 83.229.27.39 a2 -83.229.27.40 - 83.229.27.71 iq -83.229.27.72 - 83.229.27.79 a2 -83.229.27.80 - 83.229.27.135 iq -83.229.27.136 - 83.229.27.159 a2 -83.229.27.160 - 83.229.27.167 iq -83.229.27.168 - 83.229.27.207 a2 -83.229.27.208 - 83.229.27.215 iq -83.229.27.216 - 83.229.27.223 sy -83.229.27.224 - 83.229.27.247 a2 -83.229.27.248 - 83.229.27.255 iq -83.229.28.0 - 83.229.29.255 a2 -83.229.30.0 - 83.229.30.255 gb -83.229.31.0 - 83.229.31.7 zw -83.229.31.8 - 83.229.31.15 cd -83.229.31.16 - 83.229.31.23 za -83.229.31.24 - 83.229.31.31 ng -83.229.31.32 - 83.229.31.39 ke -83.229.31.40 - 83.229.31.47 cd -83.229.31.48 - 83.229.31.55 zw -83.229.31.56 - 83.229.31.63 cd -83.229.31.64 - 83.229.31.71 a2 -83.229.31.72 - 83.229.31.79 lr -83.229.31.80 - 83.229.31.95 mz -83.229.31.96 - 83.229.31.103 a2 -83.229.31.104 - 83.229.31.111 zw -83.229.31.112 - 83.229.31.119 a2 -83.229.31.120 - 83.229.31.127 ng -83.229.31.128 - 83.229.31.135 a2 -83.229.31.136 - 83.229.31.143 zw -83.229.31.144 - 83.229.31.151 a2 -83.229.31.152 - 83.229.31.159 cm -83.229.31.160 - 83.229.31.167 bw -83.229.31.168 - 83.229.31.175 a2 -83.229.31.176 - 83.229.31.183 zw -83.229.31.184 - 83.229.31.191 lr -83.229.31.192 - 83.229.31.231 a2 -83.229.31.232 - 83.229.31.239 lr -83.229.31.240 - 83.229.31.247 a2 -83.229.31.248 - 83.229.31.255 cd -83.229.32.0 - 83.229.32.15 a2 -83.229.32.16 - 83.229.32.23 zw -83.229.32.24 - 83.229.32.31 tz -83.229.32.32 - 83.229.32.39 lr -83.229.32.40 - 83.229.32.47 a2 -83.229.32.48 - 83.229.32.55 zw -83.229.32.56 - 83.229.32.63 za -83.229.32.64 - 83.229.32.71 a2 -83.229.32.72 - 83.229.32.79 gr -83.229.32.80 - 83.229.32.87 zw -83.229.32.88 - 83.229.32.95 ug -83.229.32.96 - 83.229.32.103 tz -83.229.32.104 - 83.229.32.111 ng -83.229.32.112 - 83.229.32.119 cd -83.229.32.120 - 83.229.32.127 za -83.229.32.128 - 83.229.32.135 tz -83.229.32.136 - 83.229.32.143 a2 -83.229.32.144 - 83.229.32.151 tz -83.229.32.152 - 83.229.32.159 ug -83.229.32.160 - 83.229.32.167 ng -83.229.32.168 - 83.229.32.175 il -83.229.32.176 - 83.229.32.183 za -83.229.32.184 - 83.229.32.191 ng -83.229.32.192 - 83.229.32.199 za -83.229.32.200 - 83.229.32.207 so -83.229.32.208 - 83.229.32.215 cd -83.229.32.216 - 83.229.32.223 a2 -83.229.32.224 - 83.229.32.231 mw -83.229.32.232 - 83.229.32.239 zw -83.229.32.240 - 83.229.32.247 ng -83.229.32.248 - 83.229.32.255 za -83.229.33.0 - 83.229.33.7 a2 -83.229.33.8 - 83.229.33.15 sd -83.229.33.16 - 83.229.33.23 cd -83.229.33.24 - 83.229.33.31 tz -83.229.33.32 - 83.229.33.47 cd -83.229.33.48 - 83.229.33.55 a2 -83.229.33.56 - 83.229.33.63 cd -83.229.33.64 - 83.229.33.71 zw -83.229.33.72 - 83.229.33.87 a2 -83.229.33.88 - 83.229.33.95 cd -83.229.33.96 - 83.229.33.111 a2 -83.229.33.112 - 83.229.33.135 cd -83.229.33.136 - 83.229.33.143 a2 -83.229.33.144 - 83.229.33.167 cd -83.229.33.168 - 83.229.33.183 a2 -83.229.33.184 - 83.229.33.199 cd -83.229.33.200 - 83.229.33.207 a2 -83.229.33.208 - 83.229.33.223 cd -83.229.33.224 - 83.229.34.7 a2 -83.229.34.8 - 83.229.34.15 cd -83.229.34.16 - 83.229.34.23 a2 -83.229.34.24 - 83.229.34.31 ke -83.229.34.32 - 83.229.34.39 ug -83.229.34.40 - 83.229.34.47 a2 -83.229.34.48 - 83.229.34.55 ug -83.229.34.56 - 83.229.34.95 a2 -83.229.34.96 - 83.229.34.103 ug -83.229.34.104 - 83.229.34.111 cd -83.229.34.112 - 83.229.34.127 a2 -83.229.34.128 - 83.229.34.135 ug -83.229.34.136 - 83.229.34.167 a2 -83.229.34.168 - 83.229.34.175 ke -83.229.34.176 - 83.229.34.183 vg -83.229.34.184 - 83.229.34.191 a2 -83.229.34.192 - 83.229.34.199 cd -83.229.34.200 - 83.229.34.207 lr -83.229.34.208 - 83.229.34.231 a2 -83.229.34.232 - 83.229.34.239 cd -83.229.34.240 - 83.229.34.247 a2 -83.229.34.248 - 83.229.34.255 so -83.229.35.0 - 83.229.35.7 a2 -83.229.35.8 - 83.229.35.47 iq -83.229.35.48 - 83.229.35.63 a2 -83.229.35.64 - 83.229.35.71 iq -83.229.35.72 - 83.229.35.87 a2 -83.229.35.88 - 83.229.35.95 iq -83.229.35.96 - 83.229.35.119 a2 -83.229.35.120 - 83.229.35.127 iq -83.229.35.128 - 83.229.35.143 a2 -83.229.35.144 - 83.229.35.151 iq -83.229.35.152 - 83.229.39.55 a2 -83.229.39.56 - 83.229.39.63 gn -83.229.39.64 - 83.229.47.255 a2 -83.229.48.0 - 83.229.48.31 so -83.229.48.32 - 83.229.48.63 a2 -83.229.48.64 - 83.229.48.127 us -83.229.48.128 - 83.229.48.135 so -83.229.48.136 - 83.229.48.143 a2 -83.229.48.144 - 83.229.48.151 so -83.229.48.152 - 83.229.48.215 a2 -83.229.48.216 - 83.229.48.223 so -83.229.48.224 - 83.229.48.231 ng -83.229.48.232 - 83.229.48.247 a2 -83.229.48.248 - 83.229.48.255 ng -83.229.49.0 - 83.229.55.255 a2 -83.229.56.0 - 83.229.57.255 ng -83.229.58.0 - 83.229.58.31 cd -83.229.58.32 - 83.229.58.39 sd -83.229.58.40 - 83.229.58.47 a2 -83.229.58.48 - 83.229.58.55 cd -83.229.58.56 - 83.229.58.63 gq -83.229.58.64 - 83.229.58.71 cd -83.229.58.72 - 83.229.58.79 a2 -83.229.58.80 - 83.229.58.87 ly -83.229.58.88 - 83.229.58.95 cd -83.229.58.96 - 83.229.58.103 a2 -83.229.58.104 - 83.229.58.111 cd -83.229.58.112 - 83.229.58.119 zm -83.229.58.120 - 83.229.58.127 cd -83.229.58.128 - 83.229.58.143 a2 -83.229.58.144 - 83.229.58.151 mz -83.229.58.152 - 83.229.58.167 cd -83.229.58.168 - 83.229.58.183 a2 -83.229.58.184 - 83.229.58.191 sd -83.229.58.192 - 83.229.58.215 cd -83.229.58.216 - 83.229.58.223 zw -83.229.58.224 - 83.229.58.231 a2 -83.229.58.232 - 83.229.58.239 gq -83.229.58.240 - 83.229.58.247 zw -83.229.58.248 - 83.229.58.255 sd -83.229.59.0 - 83.229.61.255 a2 -83.229.62.0 - 83.229.62.7 so -83.229.62.8 - 83.229.62.15 ao -83.229.62.16 - 83.229.62.39 a2 -83.229.62.40 - 83.229.62.47 zw -83.229.62.48 - 83.229.62.71 a2 -83.229.62.72 - 83.229.62.79 kg -83.229.62.80 - 83.229.62.95 a2 -83.229.62.96 - 83.229.62.103 ng -83.229.62.104 - 83.229.62.119 a2 -83.229.62.120 - 83.229.62.127 tz -83.229.62.128 - 83.229.62.255 a2 -83.229.63.0 - 83.229.63.127 so -83.229.63.128 - 83.229.63.255 a2 -83.229.64.0 - 83.229.64.255 ng -83.229.65.0 - 83.229.65.15 ao -83.229.65.16 - 83.229.65.31 a2 -83.229.65.32 - 83.229.65.63 ng -83.229.65.64 - 83.229.65.95 cd -83.229.65.96 - 83.229.65.111 a2 -83.229.65.112 - 83.229.65.255 gh -83.229.66.0 - 83.229.66.15 ng -83.229.66.16 - 83.229.66.23 ne -83.229.66.24 - 83.229.66.39 a2 -83.229.66.40 - 83.229.66.63 ng -83.229.66.64 - 83.229.66.111 a2 -83.229.66.112 - 83.229.66.127 ng -83.229.66.128 - 83.229.66.143 a2 -83.229.66.144 - 83.229.66.151 zw -83.229.66.152 - 83.229.66.159 sl -83.229.66.160 - 83.229.66.167 a2 -83.229.66.168 - 83.229.66.175 gn -83.229.66.176 - 83.229.66.183 ng -83.229.66.184 - 83.229.66.191 sl -83.229.66.192 - 83.229.66.199 ng -83.229.66.200 - 83.229.66.207 a2 -83.229.66.208 - 83.229.66.215 ng -83.229.66.216 - 83.229.66.247 a2 -83.229.66.248 - 83.229.66.255 ng -83.229.67.0 - 83.229.67.7 lr -83.229.67.8 - 83.229.67.95 a2 -83.229.67.96 - 83.229.67.103 bf -83.229.67.104 - 83.229.67.255 a2 -83.229.68.0 - 83.229.68.255 ae -83.229.69.0 - 83.229.69.23 a2 -83.229.69.24 - 83.229.69.47 ng -83.229.69.48 - 83.229.69.55 gr -83.229.69.56 - 83.229.69.63 ao -83.229.69.64 - 83.229.69.71 ng -83.229.69.72 - 83.229.69.79 ci -83.229.69.80 - 83.229.69.119 a2 -83.229.69.120 - 83.229.69.127 ng -83.229.69.128 - 83.229.69.207 a2 -83.229.69.208 - 83.229.69.223 gh -83.229.69.224 - 83.229.69.231 ng -83.229.69.232 - 83.229.69.239 a2 -83.229.69.240 - 83.229.69.247 cd -83.229.69.248 - 83.229.70.127 a2 -83.229.70.128 - 83.229.70.135 ng -83.229.70.136 - 83.229.70.143 a2 -83.229.70.144 - 83.229.70.183 ng -83.229.70.184 - 83.229.70.191 ml -83.229.70.192 - 83.229.70.199 cd -83.229.70.200 - 83.229.70.255 a2 -83.229.71.0 - 83.229.71.255 cm -83.229.72.0 - 83.229.73.255 ga -83.229.74.0 - 83.229.74.7 cd -83.229.74.8 - 83.229.74.15 a2 -83.229.74.16 - 83.229.74.23 sd -83.229.74.24 - 83.229.74.31 cd -83.229.74.32 - 83.229.74.39 ng -83.229.74.40 - 83.229.74.55 a2 -83.229.74.56 - 83.229.74.63 sd -83.229.74.64 - 83.229.74.71 gn -83.229.74.72 - 83.229.74.79 a2 -83.229.74.80 - 83.229.74.87 gn -83.229.74.88 - 83.229.74.95 cd -83.229.74.96 - 83.229.74.103 gb -83.229.74.104 - 83.229.74.119 a2 -83.229.74.120 - 83.229.74.127 ng -83.229.74.128 - 83.229.74.135 a2 -83.229.74.136 - 83.229.74.143 gb -83.229.74.144 - 83.229.74.183 a2 -83.229.74.184 - 83.229.74.191 ng -83.229.74.192 - 83.229.74.199 a2 -83.229.74.200 - 83.229.74.207 ng -83.229.74.208 - 83.229.74.231 a2 -83.229.74.232 - 83.229.74.239 cd -83.229.74.240 - 83.229.74.247 gb -83.229.74.248 - 83.229.75.255 a2 -83.229.76.0 - 83.229.77.255 ga -83.229.78.0 - 83.229.78.255 cd -83.229.79.0 - 83.229.79.7 a2 -83.229.79.8 - 83.229.79.23 zw -83.229.79.24 - 83.229.79.39 a2 -83.229.79.40 - 83.229.79.47 ng -83.229.79.48 - 83.229.79.55 ao -83.229.79.56 - 83.229.79.87 a2 -83.229.79.88 - 83.229.79.95 iq -83.229.79.96 - 83.229.79.135 a2 -83.229.79.136 - 83.229.79.143 ng -83.229.79.144 - 83.229.79.151 a2 -83.229.79.152 - 83.229.79.159 ng -83.229.79.160 - 83.229.79.175 gh -83.229.79.176 - 83.229.79.183 a2 -83.229.79.184 - 83.229.79.191 ng +83.229.0.0 - 83.229.37.87 a2 +83.229.37.88 - 83.229.37.95 cd +83.229.37.96 - 83.229.79.191 a2 83.229.79.192 - 83.229.79.199 gh -83.229.79.200 - 83.229.79.207 a2 -83.229.79.208 - 83.229.79.215 ng -83.229.79.216 - 83.229.79.223 lr -83.229.79.224 - 83.229.79.239 a2 -83.229.79.240 - 83.229.79.247 ng -83.229.79.248 - 83.229.79.255 a2 -83.229.80.0 - 83.229.80.7 ug -83.229.80.8 - 83.229.80.31 a2 -83.229.80.32 - 83.229.80.39 ng -83.229.80.40 - 83.229.80.55 a2 -83.229.80.56 - 83.229.80.63 be -83.229.80.64 - 83.229.80.87 a2 -83.229.80.88 - 83.229.80.103 ng -83.229.80.104 - 83.229.80.111 a2 -83.229.80.112 - 83.229.80.127 cm -83.229.80.128 - 83.229.80.135 a2 -83.229.80.136 - 83.229.80.151 ug -83.229.80.152 - 83.229.80.159 lr -83.229.80.160 - 83.229.80.167 a2 -83.229.80.168 - 83.229.80.175 ng -83.229.80.176 - 83.229.80.191 a2 -83.229.80.192 - 83.229.80.207 ng -83.229.80.208 - 83.229.80.215 a2 -83.229.80.216 - 83.229.80.231 ng -83.229.80.232 - 83.229.81.23 a2 -83.229.81.24 - 83.229.81.31 ng -83.229.81.32 - 83.229.81.39 lr -83.229.81.40 - 83.229.81.47 ug -83.229.81.48 - 83.229.81.55 ao -83.229.81.56 - 83.229.81.71 a2 -83.229.81.72 - 83.229.81.79 cm -83.229.81.80 - 83.229.81.87 gh -83.229.81.88 - 83.229.81.103 a2 -83.229.81.104 - 83.229.81.111 lr -83.229.81.112 - 83.229.81.135 a2 -83.229.81.136 - 83.229.81.143 ao -83.229.81.144 - 83.229.81.167 a2 -83.229.81.168 - 83.229.81.183 ng -83.229.81.184 - 83.229.81.199 a2 -83.229.81.200 - 83.229.81.207 cm -83.229.81.208 - 83.229.81.223 a2 -83.229.81.224 - 83.229.81.231 ng -83.229.81.232 - 83.229.82.15 a2 -83.229.82.16 - 83.229.82.23 iq -83.229.82.24 - 83.229.82.39 a2 -83.229.82.40 - 83.229.82.71 ng -83.229.82.72 - 83.229.82.87 a2 -83.229.82.88 - 83.229.82.183 ng -83.229.82.184 - 83.229.82.191 a2 -83.229.82.192 - 83.229.82.199 ng -83.229.82.200 - 83.229.82.207 tg -83.229.82.208 - 83.229.82.215 iq -83.229.82.216 - 83.229.82.239 a2 -83.229.82.240 - 83.229.82.247 tg -83.229.82.248 - 83.229.83.7 a2 -83.229.83.8 - 83.229.83.15 sl -83.229.83.16 - 83.229.83.23 gh -83.229.83.24 - 83.229.83.31 tg -83.229.83.32 - 83.229.83.39 a2 -83.229.83.40 - 83.229.83.47 tg -83.229.83.48 - 83.229.83.55 ng -83.229.83.56 - 83.229.83.63 a2 -83.229.83.64 - 83.229.83.71 ng -83.229.83.72 - 83.229.83.79 a2 -83.229.83.80 - 83.229.83.103 ng -83.229.83.104 - 83.229.83.111 a2 -83.229.83.112 - 83.229.83.119 ng -83.229.83.120 - 83.229.83.127 cd -83.229.83.128 - 83.229.83.135 ng -83.229.83.136 - 83.229.83.143 a2 -83.229.83.144 - 83.229.83.151 lu -83.229.83.152 - 83.229.83.159 a2 -83.229.83.160 - 83.229.83.167 lr -83.229.83.168 - 83.229.83.175 ao -83.229.83.176 - 83.229.83.191 a2 -83.229.83.192 - 83.229.83.199 lr -83.229.83.200 - 83.229.83.207 ng -83.229.83.208 - 83.229.83.223 a2 -83.229.83.224 - 83.229.83.231 gn -83.229.83.232 - 83.229.83.247 a2 -83.229.83.248 - 83.229.83.255 iq -83.229.84.0 - 83.229.84.23 a2 -83.229.84.24 - 83.229.84.95 ng -83.229.84.96 - 83.229.84.103 co -83.229.84.104 - 83.229.84.111 a2 -83.229.84.112 - 83.229.84.119 ng -83.229.84.120 - 83.229.84.127 ao -83.229.84.128 - 83.229.84.135 ng -83.229.84.136 - 83.229.84.143 cd -83.229.84.144 - 83.229.84.151 a2 -83.229.84.152 - 83.229.84.159 cd -83.229.84.160 - 83.229.84.167 a2 -83.229.84.168 - 83.229.84.175 cd -83.229.84.176 - 83.229.84.207 a2 -83.229.84.208 - 83.229.84.215 cm -83.229.84.216 - 83.229.84.231 a2 -83.229.84.232 - 83.229.84.239 ng -83.229.84.240 - 83.229.84.247 a2 -83.229.84.248 - 83.229.84.255 ng -83.229.85.0 - 83.229.85.7 a2 -83.229.85.8 - 83.229.85.15 ng -83.229.85.16 - 83.229.85.31 a2 -83.229.85.32 - 83.229.85.39 zm -83.229.85.40 - 83.229.85.47 ng -83.229.85.48 - 83.229.85.231 a2 -83.229.85.232 - 83.229.85.247 ng -83.229.85.248 - 83.229.86.175 a2 -83.229.86.176 - 83.229.86.191 ge -83.229.86.192 - 83.229.86.199 a2 -83.229.86.200 - 83.229.86.207 ng -83.229.86.208 - 83.229.86.223 a2 -83.229.86.224 - 83.229.86.231 gh -83.229.86.232 - 83.229.86.239 a2 -83.229.86.240 - 83.229.86.247 ng -83.229.86.248 - 83.229.86.255 gh -83.229.87.0 - 83.229.87.31 a2 -83.229.87.32 - 83.229.87.39 ng -83.229.87.40 - 83.229.87.47 sl -83.229.87.48 - 83.229.87.55 a2 -83.229.87.56 - 83.229.87.63 ng -83.229.87.64 - 83.229.87.111 a2 -83.229.87.112 - 83.229.87.119 ng -83.229.87.120 - 83.229.87.159 a2 -83.229.87.160 - 83.229.87.167 ng -83.229.87.168 - 83.229.87.199 a2 -83.229.87.200 - 83.229.87.207 ng -83.229.87.208 - 83.229.87.223 a2 -83.229.87.224 - 83.229.87.231 td -83.229.87.232 - 83.229.87.239 gh -83.229.87.240 - 83.229.87.247 a2 -83.229.87.248 - 83.229.87.255 ng -83.229.88.0 - 83.229.88.255 ge -83.229.89.0 - 83.229.89.255 a2 -83.229.90.0 - 83.229.90.7 be -83.229.90.8 - 83.229.90.15 a2 -83.229.90.16 - 83.229.90.23 gr -83.229.90.24 - 83.229.90.31 ng -83.229.90.32 - 83.229.90.39 a2 -83.229.90.40 - 83.229.90.47 ng -83.229.90.48 - 83.229.90.55 a2 -83.229.90.56 - 83.229.90.63 gr -83.229.90.64 - 83.229.90.71 a2 -83.229.90.72 - 83.229.90.79 gr -83.229.90.80 - 83.229.90.87 ng -83.229.90.88 - 83.229.90.111 a2 -83.229.90.112 - 83.229.90.119 ng -83.229.90.120 - 83.229.90.143 a2 -83.229.90.144 - 83.229.90.151 cd -83.229.90.152 - 83.229.90.167 ng -83.229.90.168 - 83.229.90.175 a2 -83.229.90.176 - 83.229.90.183 ng -83.229.90.184 - 83.229.90.191 cd -83.229.90.192 - 83.229.90.199 a2 -83.229.90.200 - 83.229.90.215 ng -83.229.90.216 - 83.229.90.223 a2 -83.229.90.224 - 83.229.90.231 gn -83.229.90.232 - 83.229.90.239 cd -83.229.90.240 - 83.229.90.247 lr -83.229.90.248 - 83.229.90.255 a2 -83.229.91.0 - 83.229.91.7 cd -83.229.91.8 - 83.229.91.87 a2 -83.229.91.88 - 83.229.91.95 ng -83.229.91.96 - 83.229.91.103 a2 -83.229.91.104 - 83.229.91.111 ng -83.229.91.112 - 83.229.91.143 a2 -83.229.91.144 - 83.229.91.151 tg -83.229.91.152 - 83.229.91.167 a2 -83.229.91.168 - 83.229.91.175 ng -83.229.91.176 - 83.229.91.191 a2 -83.229.91.192 - 83.229.91.199 cd -83.229.91.200 - 83.229.91.231 a2 -83.229.91.232 - 83.229.91.247 cd -83.229.91.248 - 83.229.91.255 a2 -83.229.92.0 - 83.229.92.7 ao -83.229.92.8 - 83.229.92.23 ng -83.229.92.24 - 83.229.92.31 a2 -83.229.92.32 - 83.229.92.39 cd -83.229.92.40 - 83.229.92.47 a2 -83.229.92.48 - 83.229.92.55 lr -83.229.92.56 - 83.229.92.63 ng -83.229.92.64 - 83.229.92.71 cd -83.229.92.72 - 83.229.92.79 ng -83.229.92.80 - 83.229.92.87 ao -83.229.92.88 - 83.229.92.95 a2 -83.229.92.96 - 83.229.92.103 cd -83.229.92.104 - 83.229.92.119 a2 -83.229.92.120 - 83.229.92.127 cf -83.229.92.128 - 83.229.92.135 td -83.229.92.136 - 83.229.92.143 a2 -83.229.92.144 - 83.229.92.151 lr -83.229.92.152 - 83.229.92.159 a2 -83.229.92.160 - 83.229.92.167 ng -83.229.92.168 - 83.229.92.191 a2 -83.229.92.192 - 83.229.92.199 ng -83.229.92.200 - 83.229.92.207 a2 -83.229.92.208 - 83.229.92.215 ci -83.229.92.216 - 83.229.92.223 a2 -83.229.92.224 - 83.229.92.231 lr -83.229.92.232 - 83.229.92.239 a2 -83.229.92.240 - 83.229.92.247 mu -83.229.92.248 - 83.229.92.255 a2 -83.229.93.0 - 83.229.93.7 cm -83.229.93.8 - 83.229.93.15 a2 -83.229.93.16 - 83.229.93.23 ng -83.229.93.24 - 83.229.93.71 a2 -83.229.93.72 - 83.229.93.79 ng -83.229.93.80 - 83.229.93.87 cd -83.229.93.88 - 83.229.93.111 a2 -83.229.93.112 - 83.229.93.119 gn -83.229.93.120 - 83.229.93.127 a2 -83.229.93.128 - 83.229.93.135 cd -83.229.93.136 - 83.229.93.143 sd -83.229.93.144 - 83.229.93.175 a2 -83.229.93.176 - 83.229.93.183 cd -83.229.93.184 - 83.229.93.215 a2 -83.229.93.216 - 83.229.93.223 ng -83.229.93.224 - 83.229.94.31 a2 -83.229.94.32 - 83.229.94.39 ng -83.229.94.40 - 83.229.94.255 a2 -83.229.95.0 - 83.229.95.7 cd -83.229.95.8 - 83.229.95.31 a2 -83.229.95.32 - 83.229.95.39 lr -83.229.95.40 - 83.229.95.47 ng -83.229.95.48 - 83.229.95.55 a2 -83.229.95.56 - 83.229.95.63 ng -83.229.95.64 - 83.229.95.71 a2 -83.229.95.72 - 83.229.95.79 ng -83.229.95.80 - 83.229.95.103 a2 -83.229.95.104 - 83.229.95.111 gq -83.229.95.112 - 83.229.95.183 a2 -83.229.95.184 - 83.229.95.191 ng -83.229.95.192 - 83.229.95.199 a2 -83.229.95.200 - 83.229.95.207 ng -83.229.95.208 - 83.229.96.223 a2 -83.229.96.224 - 83.229.96.247 ng -83.229.96.248 - 83.229.97.31 a2 -83.229.97.32 - 83.229.97.39 cm -83.229.97.40 - 83.229.97.47 a2 -83.229.97.48 - 83.229.97.55 ng -83.229.97.56 - 83.229.97.63 gh -83.229.97.64 - 83.229.97.207 a2 -83.229.97.208 - 83.229.97.215 ng -83.229.97.216 - 83.229.97.223 a2 -83.229.97.224 - 83.229.97.231 ng -83.229.97.232 - 83.229.97.247 a2 -83.229.97.248 - 83.229.97.255 ng -83.229.98.0 - 83.229.98.127 a2 -83.229.98.128 - 83.229.99.127 ng -83.229.99.128 - 83.229.101.15 a2 -83.229.101.16 - 83.229.101.23 lr -83.229.101.24 - 83.229.101.47 a2 -83.229.101.48 - 83.229.101.55 cd -83.229.101.56 - 83.229.101.71 a2 -83.229.101.72 - 83.229.101.79 tg -83.229.101.80 - 83.229.101.95 a2 -83.229.101.96 - 83.229.101.103 bj -83.229.101.104 - 83.229.101.111 ng -83.229.101.112 - 83.229.101.127 a2 -83.229.101.128 - 83.229.101.135 sl -83.229.101.136 - 83.229.101.143 a2 -83.229.101.144 - 83.229.101.151 cm -83.229.101.152 - 83.229.101.159 ng -83.229.101.160 - 83.229.101.167 cd -83.229.101.168 - 83.229.101.175 ng -83.229.101.176 - 83.229.101.199 a2 -83.229.101.200 - 83.229.101.207 ng -83.229.101.208 - 83.229.101.239 a2 -83.229.101.240 - 83.229.101.247 ga -83.229.101.248 - 83.229.102.7 a2 -83.229.102.8 - 83.229.102.15 ng -83.229.102.16 - 83.229.102.63 a2 -83.229.102.64 - 83.229.102.79 ng -83.229.102.80 - 83.229.102.119 a2 -83.229.102.120 - 83.229.102.127 cd -83.229.102.128 - 83.229.102.255 at -83.229.103.0 - 83.229.103.127 a2 -83.229.103.128 - 83.229.103.143 gh -83.229.103.144 - 83.229.103.151 a2 -83.229.103.152 - 83.229.103.199 ng -83.229.103.200 - 83.229.103.215 a2 -83.229.103.216 - 83.229.103.223 ng -83.229.103.224 - 83.229.103.239 a2 -83.229.103.240 - 83.229.103.247 ng -83.229.103.248 - 83.229.113.255 a2 -83.229.114.0 - 83.229.114.7 ci -83.229.114.8 - 83.229.114.15 a2 -83.229.114.16 - 83.229.114.23 cd -83.229.114.24 - 83.229.114.31 a2 -83.229.114.32 - 83.229.114.39 ng -83.229.114.40 - 83.229.114.47 cd -83.229.114.48 - 83.229.114.55 a2 -83.229.114.56 - 83.229.114.71 ng -83.229.114.72 - 83.229.114.79 a2 -83.229.114.80 - 83.229.114.87 za -83.229.114.88 - 83.229.114.95 a2 -83.229.114.96 - 83.229.114.103 bj -83.229.114.104 - 83.229.114.111 a2 -83.229.114.112 - 83.229.114.119 gq -83.229.114.120 - 83.229.114.135 a2 -83.229.114.136 - 83.229.114.143 gn -83.229.114.144 - 83.229.114.151 cf -83.229.114.152 - 83.229.114.167 a2 -83.229.114.168 - 83.229.114.191 ng -83.229.114.192 - 83.229.114.199 a2 -83.229.114.200 - 83.229.114.207 ng -83.229.114.208 - 83.229.114.215 ml -83.229.114.216 - 83.229.115.255 a2 -83.229.116.0 - 83.229.116.127 ae -83.229.116.128 - 83.229.117.239 a2 -83.229.117.240 - 83.229.117.255 lr -83.229.118.0 - 83.229.119.7 a2 -83.229.119.8 - 83.229.119.15 gh -83.229.119.16 - 83.229.119.31 a2 -83.229.119.32 - 83.229.119.39 ng -83.229.119.40 - 83.229.119.47 gh -83.229.119.48 - 83.229.119.55 ug -83.229.119.56 - 83.229.119.63 ng -83.229.119.64 - 83.229.119.71 ao -83.229.119.72 - 83.229.119.79 td -83.229.119.80 - 83.229.119.103 a2 -83.229.119.104 - 83.229.119.119 sl -83.229.119.120 - 83.229.119.127 a2 -83.229.119.128 - 83.229.119.135 sl -83.229.119.136 - 83.229.119.167 a2 -83.229.119.168 - 83.229.119.175 sl -83.229.119.176 - 83.229.119.191 ng -83.229.119.192 - 83.229.119.199 a2 -83.229.119.200 - 83.229.119.207 ci -83.229.119.208 - 83.229.122.7 ng -83.229.122.8 - 83.229.122.15 a2 -83.229.122.16 - 83.229.122.23 cg -83.229.122.24 - 83.229.122.39 a2 -83.229.122.40 - 83.229.122.47 bj -83.229.122.48 - 83.229.122.79 a2 -83.229.122.80 - 83.229.122.95 bj -83.229.122.96 - 83.229.122.119 a2 -83.229.122.120 - 83.229.122.127 ng -83.229.122.128 - 83.229.122.143 a2 -83.229.122.144 - 83.229.122.151 ga -83.229.122.152 - 83.229.122.159 ng -83.229.122.160 - 83.229.122.207 a2 -83.229.122.208 - 83.229.122.215 ci -83.229.122.216 - 83.229.122.223 a2 -83.229.122.224 - 83.229.122.239 cm -83.229.122.240 - 83.229.122.247 a2 -83.229.122.248 - 83.229.123.255 ng -83.229.124.0 - 83.229.124.27 ge -83.229.124.28 - 83.229.124.31 ne -83.229.124.32 - 83.229.124.127 ge -83.229.124.128 - 83.229.125.39 a2 -83.229.125.40 - 83.229.125.47 cd -83.229.125.48 - 83.229.125.95 a2 -83.229.125.96 - 83.229.125.103 cd -83.229.125.104 - 83.229.125.255 a2 -83.229.126.0 - 83.229.126.31 ng -83.229.126.32 - 83.229.126.39 a2 -83.229.126.40 - 83.229.126.47 cm -83.229.126.48 - 83.229.126.55 a2 -83.229.126.56 - 83.229.126.63 cd -83.229.126.64 - 83.229.126.111 a2 -83.229.126.112 - 83.229.126.119 ng -83.229.126.120 - 83.229.126.127 a2 -83.229.126.128 - 83.229.126.135 ng -83.229.126.136 - 83.229.126.143 ga -83.229.126.144 - 83.229.126.151 ng -83.229.126.152 - 83.229.126.159 a2 -83.229.126.160 - 83.229.126.167 lr -83.229.126.168 - 83.229.126.191 a2 -83.229.126.192 - 83.229.126.199 lr -83.229.126.200 - 83.229.126.215 a2 -83.229.126.216 - 83.229.126.231 lr -83.229.126.232 - 83.229.126.239 a2 -83.229.126.240 - 83.229.126.255 ng -83.229.127.0 - 83.229.127.255 a2 +83.229.79.200 - 83.229.127.255 a2 83.229.128.0 - 83.229.255.255 ru 83.230.0.0 - 83.230.127.255 pl 83.230.128.0 - 83.231.127.255 es -83.231.128.0 - 83.231.128.183 fr -83.231.128.184 - 83.231.128.191 gb -83.231.128.192 - 83.231.129.63 fr -83.231.129.64 - 83.231.129.255 gb -83.231.130.0 - 83.231.131.11 es -83.231.131.12 - 83.231.131.15 gb -83.231.131.16 - 83.231.131.255 es -83.231.132.0 - 83.231.132.103 fr -83.231.132.104 - 83.231.133.191 gb -83.231.133.192 - 83.231.133.207 es -83.231.133.208 - 83.231.134.255 gb -83.231.135.0 - 83.231.135.255 fr -83.231.136.0 - 83.231.137.63 gb -83.231.137.64 - 83.231.137.95 fi -83.231.137.96 - 83.231.154.255 gb -83.231.155.0 - 83.231.155.255 es -83.231.156.0 - 83.231.177.103 gb -83.231.177.104 - 83.231.177.111 es -83.231.177.112 - 83.231.185.111 gb -83.231.185.112 - 83.231.185.119 es -83.231.185.120 - 83.231.190.103 gb -83.231.190.104 - 83.231.190.111 au -83.231.190.112 - 83.231.205.47 gb -83.231.205.48 - 83.231.205.63 de -83.231.205.64 - 83.231.211.255 gb -83.231.212.0 - 83.231.212.255 fr -83.231.213.0 - 83.231.214.255 gb -83.231.215.0 - 83.231.215.127 fr -83.231.215.128 - 83.231.215.143 gb -83.231.215.144 - 83.231.215.191 fr -83.231.215.192 - 83.231.215.255 gb -83.231.216.0 - 83.231.217.159 fr -83.231.217.160 - 83.231.217.239 gb -83.231.217.240 - 83.231.219.63 fr -83.231.219.64 - 83.231.219.127 gb -83.231.219.128 - 83.231.219.231 fr -83.231.219.232 - 83.231.219.255 gb -83.231.220.0 - 83.231.220.63 fr -83.231.220.64 - 83.231.220.127 gb -83.231.220.128 - 83.231.220.255 fr -83.231.221.0 - 83.231.221.63 gb -83.231.221.64 - 83.231.221.127 fr -83.231.221.128 - 83.231.224.119 gb -83.231.224.120 - 83.231.224.127 es -83.231.224.128 - 83.231.225.255 gb -83.231.226.0 - 83.231.226.127 fr -83.231.226.128 - 83.231.226.159 gb -83.231.226.160 - 83.231.226.191 fr -83.231.226.192 - 83.231.228.255 gb -83.231.229.0 - 83.231.229.55 fr -83.231.229.56 - 83.231.229.63 gb -83.231.229.64 - 83.231.229.191 fr -83.231.229.192 - 83.231.234.55 gb -83.231.234.56 - 83.231.234.191 ch -83.231.234.192 - 83.231.234.255 gb -83.231.235.0 - 83.231.235.31 ch -83.231.235.32 - 83.231.239.255 gb -83.231.240.0 - 83.231.241.255 de -83.231.242.0 - 83.231.243.255 gb -83.231.244.0 - 83.231.244.31 es -83.231.244.32 - 83.231.246.255 gb -83.231.247.0 - 83.231.248.87 fr -83.231.248.88 - 83.231.248.95 gb -83.231.248.96 - 83.231.249.255 fr -83.231.250.0 - 83.231.251.207 gb -83.231.251.208 - 83.231.251.223 fr -83.231.251.224 - 83.231.253.255 gb -83.231.254.0 - 83.231.254.63 de -83.231.254.64 - 83.231.254.119 gb -83.231.254.120 - 83.231.254.143 de -83.231.254.144 - 83.231.254.151 gb -83.231.254.152 - 83.231.254.191 de -83.231.254.192 - 83.231.254.207 gb -83.231.254.208 - 83.231.255.215 de -83.231.255.216 - 83.231.255.223 gb -83.231.255.224 - 83.231.255.255 de +83.231.128.0 - 83.231.129.255 gb +83.231.130.0 - 83.231.130.63 es +83.231.130.64 - 83.231.149.231 gb +83.231.149.232 - 83.231.149.235 ch +83.231.149.236 - 83.231.149.239 de +83.231.149.240 - 83.231.149.243 fr +83.231.149.244 - 83.231.149.247 be +83.231.149.248 - 83.231.149.251 gb +83.231.149.252 - 83.231.149.255 es +83.231.150.0 - 83.231.150.3 se +83.231.150.4 - 83.231.187.63 gb +83.231.187.64 - 83.231.187.67 it +83.231.187.68 - 83.231.187.147 gb +83.231.187.148 - 83.231.187.151 dk +83.231.187.152 - 83.231.187.155 gb +83.231.187.156 - 83.231.187.159 dk +83.231.187.160 - 83.231.187.191 gb +83.231.187.192 - 83.231.187.195 se +83.231.187.196 - 83.231.212.255 gb +83.231.213.0 - 83.231.213.255 de +83.231.214.0 - 83.231.248.7 gb +83.231.248.8 - 83.231.248.15 fr +83.231.248.16 - 83.231.248.31 gb +83.231.248.32 - 83.231.248.63 fr +83.231.248.64 - 83.231.255.255 gb 83.232.0.0 - 83.232.255.255 nl 83.233.0.0 - 83.233.255.255 se 83.234.0.0 - 83.234.255.255 ru 83.235.0.0 - 83.235.255.255 gr -83.236.0.0 - 83.236.149.79 de -83.236.149.80 - 83.236.149.87 a2 -83.236.149.88 - 83.236.155.208 de -83.236.155.209 - 83.236.155.209 a2 -83.236.155.210 - 83.236.232.230 de -83.236.232.231 - 83.236.232.231 a2 -83.236.232.232 - 83.236.255.255 de +83.236.0.0 - 83.236.255.255 de 83.237.0.0 - 83.237.255.255 ru 83.238.0.0 - 83.238.255.255 pl 83.239.0.0 - 83.239.255.255 ru 83.240.0.0 - 83.240.127.255 cz 83.240.128.0 - 83.240.255.255 pt 83.241.0.0 - 83.241.127.255 lv -83.241.128.0 - 83.241.131.239 se -83.241.131.240 - 83.241.131.247 fi -83.241.131.248 - 83.241.135.31 se -83.241.135.32 - 83.241.135.39 dk -83.241.135.40 - 83.241.139.119 se -83.241.139.120 - 83.241.139.127 dk -83.241.139.128 - 83.241.140.15 se -83.241.140.16 - 83.241.140.23 no -83.241.140.24 - 83.241.144.79 se -83.241.144.80 - 83.241.144.87 no -83.241.144.88 - 83.241.198.23 se -83.241.198.24 - 83.241.198.31 dk -83.241.198.32 - 83.241.225.231 se -83.241.225.232 - 83.241.225.239 dk -83.241.225.240 - 83.241.255.255 se +83.241.128.0 - 83.241.255.255 se 83.242.0.0 - 83.242.31.255 no 83.242.32.0 - 83.242.63.255 de 83.242.64.0 - 83.242.95.255 pl -83.242.96.0 - 83.242.127.255 nl +83.242.96.0 - 83.242.111.255 ua +83.242.112.0 - 83.242.127.255 pl 83.242.128.0 - 83.242.255.255 ru 83.243.0.0 - 83.243.7.255 de 83.243.8.0 - 83.243.15.255 lu @@ -45760,24 +23093,14 @@ 83.243.96.0 - 83.243.103.255 gb 83.243.104.0 - 83.243.111.255 pl 83.243.112.0 - 83.243.119.255 de -83.243.120.0 - 83.243.127.255 ro 83.243.128.0 - 83.243.255.255 no 83.244.0.0 - 83.244.127.255 ps 83.244.128.0 - 83.245.10.111 gb 83.245.10.112 - 83.245.10.119 ie -83.245.10.120 - 83.245.37.127 gb -83.245.37.128 - 83.245.37.191 ie -83.245.37.192 - 83.245.38.255 gb -83.245.39.0 - 83.245.39.7 ie -83.245.39.8 - 83.245.73.255 gb -83.245.74.0 - 83.245.75.255 ie -83.245.76.0 - 83.245.78.191 gb -83.245.78.192 - 83.245.78.255 ie -83.245.79.0 - 83.245.98.31 gb -83.245.98.32 - 83.245.98.47 im -83.245.98.48 - 83.245.99.255 gb -83.245.100.0 - 83.245.100.255 be -83.245.101.0 - 83.245.127.255 gb +83.245.10.120 - 83.245.55.255 gb +83.245.56.0 - 83.245.56.255 ie +83.245.57.0 - 83.245.125.255 gb +83.245.126.0 - 83.245.127.255 ie 83.245.128.0 - 83.245.255.255 fi 83.246.0.0 - 83.246.15.255 ro 83.246.16.0 - 83.246.127.255 de @@ -45787,257 +23110,44 @@ 83.248.0.0 - 83.255.255.255 se 84.0.0.0 - 84.1.41.255 hu 84.1.42.0 - 84.1.47.255 bg -84.1.48.0 - 84.1.239.255 hu +84.1.48.0 - 84.1.101.255 hu +84.1.102.0 - 84.1.102.255 ro +84.1.103.0 - 84.1.105.119 hu +84.1.105.120 - 84.1.105.127 ro +84.1.105.128 - 84.1.153.255 hu +84.1.154.0 - 84.1.154.255 bg +84.1.155.0 - 84.1.239.255 hu 84.1.240.0 - 84.1.247.255 bg -84.1.248.0 - 84.2.50.255 hu -84.2.51.0 - 84.2.52.255 ro -84.2.53.0 - 84.3.255.255 hu +84.1.248.0 - 84.2.73.255 hu +84.2.74.0 - 84.2.74.255 bg +84.2.75.0 - 84.3.255.255 hu 84.4.0.0 - 84.7.255.255 fr 84.8.0.0 - 84.9.255.255 gb 84.10.0.0 - 84.10.255.255 pl -84.11.0.0 - 84.11.1.255 a2 -84.11.2.0 - 84.11.2.255 ir -84.11.3.0 - 84.11.5.255 a2 -84.11.6.0 - 84.11.6.31 ae -84.11.6.32 - 84.11.6.255 a2 -84.11.7.0 - 84.11.7.79 us -84.11.7.80 - 84.11.8.255 a2 -84.11.9.0 - 84.11.9.135 us -84.11.9.136 - 84.11.9.143 a2 -84.11.9.144 - 84.11.9.191 gi -84.11.9.192 - 84.11.13.31 a2 -84.11.13.32 - 84.11.13.63 ly -84.11.13.64 - 84.11.13.175 a2 -84.11.13.176 - 84.11.13.207 ly -84.11.13.208 - 84.11.13.231 a2 -84.11.13.232 - 84.11.13.239 ir -84.11.13.240 - 84.11.13.255 ly -84.11.14.0 - 84.11.14.15 de -84.11.14.16 - 84.11.14.63 a2 -84.11.14.64 - 84.11.14.79 ir -84.11.14.80 - 84.11.14.95 a2 -84.11.14.96 - 84.11.14.127 ly -84.11.14.128 - 84.11.14.199 a2 -84.11.14.200 - 84.11.14.207 ir -84.11.14.208 - 84.11.14.255 a2 -84.11.15.0 - 84.11.15.255 ir -84.11.16.0 - 84.11.17.255 de -84.11.18.0 - 84.11.21.255 a2 -84.11.22.0 - 84.11.23.255 de -84.11.24.0 - 84.11.24.255 es -84.11.25.0 - 84.11.25.31 ir -84.11.25.32 - 84.11.25.95 ae -84.11.25.96 - 84.11.25.127 ir -84.11.25.128 - 84.11.25.191 ae -84.11.25.192 - 84.11.25.223 ir -84.11.25.224 - 84.11.25.255 ae -84.11.26.0 - 84.11.26.31 kw -84.11.26.32 - 84.11.26.63 ae -84.11.26.64 - 84.11.26.95 ir -84.11.26.96 - 84.11.26.127 a2 -84.11.26.128 - 84.11.26.191 af -84.11.26.192 - 84.11.26.223 a2 -84.11.26.224 - 84.11.26.255 kw -84.11.27.0 - 84.11.27.31 ae -84.11.27.32 - 84.11.27.63 ir -84.11.27.64 - 84.11.27.95 kw -84.11.27.96 - 84.11.27.127 ae -84.11.27.128 - 84.11.27.255 a2 -84.11.28.0 - 84.11.28.31 ae -84.11.28.32 - 84.11.28.127 ir -84.11.28.128 - 84.11.28.191 ae -84.11.28.192 - 84.11.28.255 es -84.11.29.0 - 84.11.29.31 kw -84.11.29.32 - 84.11.29.127 ir -84.11.29.128 - 84.11.30.165 a2 -84.11.30.166 - 84.11.30.166 es -84.11.30.167 - 84.11.30.175 a2 -84.11.30.176 - 84.11.30.207 ir -84.11.30.208 - 84.11.30.215 pa -84.11.30.216 - 84.11.30.223 ir -84.11.30.224 - 84.11.30.231 ae -84.11.30.232 - 84.11.30.246 a2 -84.11.30.247 - 84.11.30.247 ir -84.11.30.248 - 84.11.30.248 a2 -84.11.30.249 - 84.11.30.249 ir -84.11.30.250 - 84.11.30.252 a2 -84.11.30.253 - 84.11.30.254 ae -84.11.30.255 - 84.11.31.31 a2 -84.11.31.32 - 84.11.31.127 ir -84.11.31.128 - 84.11.31.159 es -84.11.31.160 - 84.11.32.31 ir -84.11.32.32 - 84.11.32.63 kw -84.11.32.64 - 84.11.32.191 ir -84.11.32.192 - 84.11.32.255 ae -84.11.33.0 - 84.11.33.255 af -84.11.34.0 - 84.11.34.127 ir -84.11.34.128 - 84.11.34.191 ae -84.11.34.192 - 84.11.35.255 ir -84.11.36.0 - 84.11.36.63 ae -84.11.36.64 - 84.11.36.127 es -84.11.36.128 - 84.11.36.159 ir -84.11.36.160 - 84.11.36.191 pa -84.11.36.192 - 84.11.37.31 ir -84.11.37.32 - 84.11.37.63 a2 -84.11.37.64 - 84.11.37.95 ae -84.11.37.96 - 84.11.37.127 pa -84.11.37.128 - 84.11.37.159 ir -84.11.37.160 - 84.11.37.191 pa -84.11.37.192 - 84.11.37.255 a2 -84.11.38.0 - 84.11.38.63 ir -84.11.38.64 - 84.11.38.95 ae -84.11.38.96 - 84.11.38.127 ir -84.11.38.128 - 84.11.38.255 ae -84.11.39.0 - 84.11.39.31 pa -84.11.39.32 - 84.11.39.95 ir -84.11.39.96 - 84.11.39.255 a2 -84.11.40.0 - 84.11.40.127 ir -84.11.40.128 - 84.11.41.255 a2 -84.11.42.0 - 84.11.42.255 ir -84.11.43.0 - 84.11.43.255 a2 -84.11.44.0 - 84.11.44.255 ae -84.11.45.0 - 84.11.45.31 a2 -84.11.45.32 - 84.11.45.47 ir -84.11.45.48 - 84.11.45.63 ly -84.11.45.64 - 84.11.51.7 a2 -84.11.51.8 - 84.11.51.15 us -84.11.51.16 - 84.11.55.255 a2 -84.11.56.0 - 84.11.56.31 ir -84.11.56.32 - 84.11.56.255 a2 -84.11.57.0 - 84.11.57.31 ir -84.11.57.32 - 84.11.57.159 a2 -84.11.57.160 - 84.11.57.191 ir -84.11.57.192 - 84.11.60.127 a2 -84.11.60.128 - 84.11.60.191 ae -84.11.60.192 - 84.11.60.255 ir -84.11.61.0 - 84.11.61.255 a2 -84.11.62.0 - 84.11.63.255 ir -84.11.64.0 - 84.11.67.95 a2 -84.11.67.96 - 84.11.67.127 ir -84.11.67.128 - 84.11.67.255 a2 -84.11.68.0 - 84.11.70.127 ir -84.11.70.128 - 84.11.70.255 a2 -84.11.71.0 - 84.11.71.31 es -84.11.71.32 - 84.11.71.63 a2 -84.11.71.64 - 84.11.71.95 ae -84.11.71.96 - 84.11.71.127 es -84.11.71.128 - 84.11.71.191 ir -84.11.71.192 - 84.11.71.223 ae -84.11.71.224 - 84.11.72.31 a2 -84.11.72.32 - 84.11.72.47 ae -84.11.72.48 - 84.11.72.63 ir -84.11.72.64 - 84.11.72.95 es -84.11.72.96 - 84.11.72.127 a2 -84.11.72.128 - 84.11.72.255 ir -84.11.73.0 - 84.11.73.31 ae -84.11.73.32 - 84.11.73.63 a2 -84.11.73.64 - 84.11.73.95 ae -84.11.73.96 - 84.11.73.127 ir -84.11.73.128 - 84.11.73.255 a2 -84.11.74.0 - 84.11.74.31 ir -84.11.74.32 - 84.11.74.63 ae -84.11.74.64 - 84.11.74.127 es -84.11.74.128 - 84.11.74.159 a2 -84.11.74.160 - 84.11.74.191 ir -84.11.74.192 - 84.11.74.223 ae -84.11.74.224 - 84.11.74.255 ir -84.11.75.0 - 84.11.75.127 ae -84.11.75.128 - 84.11.75.191 ir -84.11.75.192 - 84.11.75.223 a2 -84.11.75.224 - 84.11.76.255 ir -84.11.77.0 - 84.11.77.63 ca -84.11.77.64 - 84.11.77.95 a2 -84.11.77.96 - 84.11.77.159 ir -84.11.77.160 - 84.11.77.191 a2 -84.11.77.192 - 84.11.77.254 ir -84.11.77.255 - 84.11.77.255 a2 -84.11.78.0 - 84.11.78.255 kw -84.11.79.0 - 84.11.79.255 af -84.11.80.0 - 84.11.80.191 a2 -84.11.80.192 - 84.11.80.255 ir -84.11.81.0 - 84.11.84.255 a2 -84.11.85.0 - 84.11.85.31 ir -84.11.85.32 - 84.11.110.127 a2 -84.11.110.128 - 84.11.110.143 ir -84.11.110.144 - 84.11.113.15 a2 -84.11.113.16 - 84.11.113.31 pa -84.11.113.32 - 84.11.113.63 a2 -84.11.113.64 - 84.11.113.95 pa -84.11.113.96 - 84.11.113.143 a2 -84.11.113.144 - 84.11.113.159 pa -84.11.113.160 - 84.11.113.223 a2 -84.11.113.224 - 84.11.113.239 pa -84.11.113.240 - 84.11.115.255 a2 -84.11.116.0 - 84.11.116.15 pa -84.11.116.16 - 84.11.116.255 a2 -84.11.117.0 - 84.11.117.255 lb -84.11.118.0 - 84.11.119.255 a2 -84.11.120.0 - 84.11.120.255 us -84.11.121.0 - 84.11.139.191 a2 -84.11.139.192 - 84.11.139.207 us -84.11.139.208 - 84.11.148.255 a2 -84.11.149.0 - 84.11.149.255 iq -84.11.150.0 - 84.11.150.255 lb -84.11.151.0 - 84.11.253.7 a2 -84.11.253.8 - 84.11.253.31 de -84.11.253.32 - 84.11.254.255 a2 -84.11.255.0 - 84.11.255.255 ae +84.11.0.0 - 84.11.41.255 a2 +84.11.42.0 - 84.11.42.0 de +84.11.42.1 - 84.11.255.255 a2 84.12.0.0 - 84.13.255.255 gb -84.14.0.0 - 84.14.3.23 fr -84.14.3.24 - 84.14.3.39 it -84.14.3.40 - 84.14.3.63 fr -84.14.3.64 - 84.14.3.79 pt -84.14.3.80 - 84.14.35.255 fr +84.14.0.0 - 84.14.35.255 fr 84.14.36.0 - 84.14.36.255 gb -84.14.37.0 - 84.14.121.215 fr -84.14.121.216 - 84.14.121.223 a2 -84.14.121.224 - 84.14.214.95 fr -84.14.214.96 - 84.14.214.103 es -84.14.214.104 - 84.14.224.15 fr -84.14.224.16 - 84.14.224.23 gb -84.14.224.24 - 84.14.226.159 fr -84.14.226.160 - 84.14.226.167 gb -84.14.226.168 - 84.14.228.7 fr -84.14.228.8 - 84.14.228.15 be -84.14.228.16 - 84.14.229.119 fr -84.14.229.120 - 84.14.229.127 gb -84.14.229.128 - 84.14.231.15 fr -84.14.231.16 - 84.14.231.31 de -84.14.231.32 - 84.14.244.191 fr -84.14.244.192 - 84.14.244.199 ie -84.14.244.200 - 84.14.247.159 fr -84.14.247.160 - 84.14.247.175 es -84.14.247.176 - 84.14.247.191 gb -84.14.247.192 - 84.14.247.207 it -84.14.247.208 - 84.14.255.255 fr -84.15.0.0 - 84.15.35.255 lt -84.15.36.0 - 84.15.36.255 lv -84.15.37.0 - 84.15.191.255 lt +84.14.37.0 - 84.14.255.255 fr +84.15.0.0 - 84.15.135.255 lt +84.15.136.0 - 84.15.143.255 lv +84.15.144.0 - 84.15.191.255 lt 84.15.192.0 - 84.15.195.255 lv -84.15.196.0 - 84.15.255.255 lt -84.16.0.0 - 84.16.27.255 es -84.16.28.0 - 84.16.31.255 ma +84.15.196.0 - 84.15.207.255 lt +84.15.208.0 - 84.15.223.255 lv +84.15.224.0 - 84.15.255.255 lt +84.16.0.0 - 84.16.31.255 es 84.16.32.0 - 84.16.63.255 sk -84.16.64.0 - 84.16.71.143 ch -84.16.71.144 - 84.16.71.151 ni -84.16.71.152 - 84.16.71.247 ch -84.16.71.248 - 84.16.71.255 ni -84.16.72.0 - 84.16.75.255 ch -84.16.76.0 - 84.16.76.255 fr -84.16.77.0 - 84.16.95.255 ch +84.16.64.0 - 84.16.95.255 ch 84.16.96.0 - 84.16.127.255 cz 84.16.128.0 - 84.16.159.255 ru -84.16.160.0 - 84.16.160.255 dk -84.16.161.0 - 84.16.161.255 ch -84.16.162.0 - 84.16.191.255 dk +84.16.160.0 - 84.16.169.31 dk +84.16.169.32 - 84.16.169.47 no +84.16.169.48 - 84.16.191.255 dk 84.16.192.0 - 84.16.223.255 no -84.16.224.0 - 84.16.243.255 de -84.16.244.0 - 84.16.244.255 pl -84.16.245.0 - 84.16.252.255 de -84.16.253.0 - 84.16.253.255 tr -84.16.254.0 - 84.16.255.63 de -84.16.255.64 - 84.16.255.127 tr -84.16.255.128 - 84.16.255.255 de +84.16.224.0 - 84.16.255.255 de 84.17.0.0 - 84.17.31.255 ru 84.17.32.0 - 84.17.63.255 it 84.17.64.0 - 84.17.95.255 tr @@ -46049,70 +23159,18 @@ 84.18.0.0 - 84.18.31.255 es 84.18.32.0 - 84.18.95.255 jo 84.18.96.0 - 84.18.127.255 ru -84.18.128.0 - 84.18.144.147 it -84.18.144.148 - 84.18.144.151 us -84.18.144.152 - 84.18.159.255 it +84.18.128.0 - 84.18.159.255 it 84.18.160.0 - 84.18.191.255 ie 84.18.192.0 - 84.18.223.255 gb 84.18.224.0 - 84.18.255.255 pt 84.19.0.0 - 84.19.31.255 de -84.19.32.0 - 84.19.51.31 gb -84.19.51.32 - 84.19.51.47 de -84.19.51.48 - 84.19.63.255 gb +84.19.32.0 - 84.19.63.255 gb 84.19.64.0 - 84.19.95.255 cz 84.19.96.0 - 84.19.127.255 gb -84.19.128.0 - 84.19.159.255 se -84.19.160.0 - 84.19.162.63 de -84.19.162.64 - 84.19.162.95 ru -84.19.162.96 - 84.19.164.95 de -84.19.164.96 - 84.19.164.127 ru -84.19.164.128 - 84.19.165.127 de -84.19.165.128 - 84.19.165.143 ru -84.19.165.144 - 84.19.165.191 de -84.19.165.192 - 84.19.165.207 ru -84.19.165.208 - 84.19.165.231 de -84.19.165.232 - 84.19.165.247 it -84.19.165.248 - 84.19.165.255 ru -84.19.166.0 - 84.19.168.175 de -84.19.168.176 - 84.19.168.183 ch -84.19.168.184 - 84.19.168.191 de -84.19.168.192 - 84.19.168.207 it -84.19.168.208 - 84.19.168.223 de -84.19.168.224 - 84.19.168.239 ru -84.19.168.240 - 84.19.168.247 de -84.19.168.248 - 84.19.168.255 ru -84.19.169.0 - 84.19.169.127 de -84.19.169.128 - 84.19.169.135 ru -84.19.169.136 - 84.19.169.255 de -84.19.170.0 - 84.19.170.127 br -84.19.170.128 - 84.19.170.223 de -84.19.170.224 - 84.19.170.239 it -84.19.170.240 - 84.19.170.255 ru -84.19.171.0 - 84.19.171.7 us -84.19.171.8 - 84.19.171.15 it -84.19.171.16 - 84.19.171.31 de -84.19.171.32 - 84.19.171.63 ru -84.19.171.64 - 84.19.171.127 de -84.19.171.128 - 84.19.171.159 ch -84.19.171.160 - 84.19.171.175 de -84.19.171.176 - 84.19.171.191 il -84.19.171.192 - 84.19.171.223 it -84.19.171.224 - 84.19.171.255 si -84.19.172.0 - 84.19.172.191 de -84.19.172.192 - 84.19.172.255 it -84.19.173.0 - 84.19.173.159 de -84.19.173.160 - 84.19.173.175 ru -84.19.173.176 - 84.19.173.191 de -84.19.173.192 - 84.19.173.207 il -84.19.173.208 - 84.19.173.223 bg -84.19.173.224 - 84.19.173.239 it -84.19.173.240 - 84.19.173.255 de -84.19.174.0 - 84.19.174.127 dk -84.19.174.128 - 84.19.175.127 de -84.19.175.128 - 84.19.175.191 it -84.19.175.192 - 84.19.175.223 de -84.19.175.224 - 84.19.175.255 it -84.19.176.0 - 84.19.223.255 de +84.19.128.0 - 84.19.147.31 se +84.19.147.32 - 84.19.147.47 no +84.19.147.48 - 84.19.159.255 se +84.19.160.0 - 84.19.223.255 de 84.19.224.0 - 84.19.255.255 gb 84.20.0.0 - 84.20.31.255 es 84.20.32.0 - 84.20.63.255 ch @@ -46120,260 +23178,25 @@ 84.20.96.0 - 84.20.127.255 no 84.20.128.0 - 84.20.159.255 fi 84.20.160.0 - 84.20.191.255 at -84.20.192.0 - 84.20.198.255 gb -84.20.199.0 - 84.20.200.255 ie -84.20.201.0 - 84.20.223.255 gb +84.20.192.0 - 84.20.223.255 gb 84.20.224.0 - 84.20.255.255 si 84.21.0.0 - 84.21.31.255 hu -84.21.32.0 - 84.21.63.255 de +84.21.32.0 - 84.21.41.255 de +84.21.42.0 - 84.21.42.255 us +84.21.43.0 - 84.21.52.255 de +84.21.53.0 - 84.21.53.255 us +84.21.54.0 - 84.21.63.255 de 84.21.64.0 - 84.21.95.255 ru 84.21.96.0 - 84.21.127.255 cz 84.21.128.0 - 84.21.159.255 gb -84.21.160.0 - 84.21.191.255 es 84.21.192.0 - 84.21.223.255 bg 84.21.224.0 - 84.21.255.255 ru 84.22.0.0 - 84.22.31.255 bg -84.22.32.0 - 84.22.32.0 rs -84.22.32.1 - 84.22.32.254 al -84.22.32.255 - 84.22.33.0 rs -84.22.33.1 - 84.22.33.254 al -84.22.33.255 - 84.22.34.0 rs -84.22.34.1 - 84.22.34.254 al -84.22.34.255 - 84.22.35.0 rs -84.22.35.1 - 84.22.35.15 al -84.22.35.16 - 84.22.35.32 rs -84.22.35.33 - 84.22.35.95 al -84.22.35.96 - 84.22.37.7 rs -84.22.37.8 - 84.22.37.15 al -84.22.37.16 - 84.22.37.23 rs -84.22.37.24 - 84.22.37.31 al -84.22.37.32 - 84.22.38.0 rs -84.22.38.1 - 84.22.38.254 al -84.22.38.255 - 84.22.39.0 rs -84.22.39.1 - 84.22.39.254 al -84.22.39.255 - 84.22.39.255 rs -84.22.40.0 - 84.22.40.39 al -84.22.40.40 - 84.22.40.47 rs -84.22.40.48 - 84.22.40.71 al -84.22.40.72 - 84.22.40.87 rs -84.22.40.88 - 84.22.40.95 al -84.22.40.96 - 84.22.40.103 rs -84.22.40.104 - 84.22.40.119 al -84.22.40.120 - 84.22.40.128 rs -84.22.40.129 - 84.22.40.134 al -84.22.40.135 - 84.22.40.144 rs -84.22.40.145 - 84.22.40.150 al -84.22.40.151 - 84.22.40.152 rs -84.22.40.153 - 84.22.40.158 al -84.22.40.159 - 84.22.40.175 rs -84.22.40.176 - 84.22.40.183 al -84.22.40.184 - 84.22.40.208 rs -84.22.40.209 - 84.22.40.214 al -84.22.40.215 - 84.22.41.7 rs -84.22.41.8 - 84.22.41.15 al -84.22.41.16 - 84.22.42.15 rs -84.22.42.16 - 84.22.42.30 al -84.22.42.31 - 84.22.42.32 rs -84.22.42.33 - 84.22.42.46 al -84.22.42.47 - 84.22.42.64 rs -84.22.42.65 - 84.22.42.78 al -84.22.42.79 - 84.22.42.80 rs -84.22.42.81 - 84.22.42.94 al -84.22.42.95 - 84.22.42.112 rs -84.22.42.113 - 84.22.42.126 al -84.22.42.127 - 84.22.42.128 rs -84.22.42.129 - 84.22.42.142 al -84.22.42.143 - 84.22.42.144 rs -84.22.42.145 - 84.22.42.158 al -84.22.42.159 - 84.22.42.176 rs -84.22.42.177 - 84.22.42.190 al -84.22.42.191 - 84.22.42.208 rs -84.22.42.209 - 84.22.42.214 al -84.22.42.215 - 84.22.42.224 rs -84.22.42.225 - 84.22.42.239 al -84.22.42.240 - 84.22.44.0 rs -84.22.44.1 - 84.22.44.126 al -84.22.44.127 - 84.22.44.128 rs -84.22.44.129 - 84.22.44.190 al -84.22.44.191 - 84.22.45.16 rs -84.22.45.17 - 84.22.45.30 al -84.22.45.31 - 84.22.45.64 rs -84.22.45.65 - 84.22.45.78 al -84.22.45.79 - 84.22.45.87 rs -84.22.45.88 - 84.22.45.94 al -84.22.45.95 - 84.22.45.112 rs -84.22.45.113 - 84.22.45.126 al -84.22.45.127 - 84.22.45.160 rs -84.22.45.161 - 84.22.45.174 al -84.22.45.175 - 84.22.45.240 rs -84.22.45.241 - 84.22.45.254 al -84.22.45.255 - 84.22.46.0 rs -84.22.46.1 - 84.22.46.7 al -84.22.46.8 - 84.22.46.8 rs -84.22.46.9 - 84.22.46.15 al -84.22.46.16 - 84.22.46.16 rs -84.22.46.17 - 84.22.46.22 al -84.22.46.23 - 84.22.46.24 rs -84.22.46.25 - 84.22.46.30 al -84.22.46.31 - 84.22.46.32 rs -84.22.46.33 - 84.22.46.38 al -84.22.46.39 - 84.22.46.40 rs -84.22.46.41 - 84.22.46.47 al -84.22.46.48 - 84.22.46.64 rs -84.22.46.65 - 84.22.46.71 al -84.22.46.72 - 84.22.46.79 rs -84.22.46.80 - 84.22.46.87 al -84.22.46.88 - 84.22.46.95 rs -84.22.46.96 - 84.22.46.167 al -84.22.46.168 - 84.22.46.175 rs -84.22.46.176 - 84.22.46.207 al -84.22.46.208 - 84.22.46.215 rs -84.22.46.216 - 84.22.46.239 al -84.22.46.240 - 84.22.46.255 rs -84.22.47.0 - 84.22.47.27 al -84.22.47.28 - 84.22.47.31 rs -84.22.47.32 - 84.22.47.35 al -84.22.47.36 - 84.22.47.39 rs -84.22.47.40 - 84.22.47.75 al -84.22.47.76 - 84.22.47.79 rs -84.22.47.80 - 84.22.47.107 al -84.22.47.108 - 84.22.47.111 rs -84.22.47.112 - 84.22.47.154 al -84.22.47.155 - 84.22.47.155 rs -84.22.47.156 - 84.22.47.167 al -84.22.47.168 - 84.22.47.171 rs -84.22.47.172 - 84.22.47.203 al -84.22.47.204 - 84.22.47.207 rs -84.22.47.208 - 84.22.48.14 al -84.22.48.15 - 84.22.48.15 rs -84.22.48.16 - 84.22.48.111 al -84.22.48.112 - 84.22.48.119 rs -84.22.48.120 - 84.22.48.191 al -84.22.48.192 - 84.22.48.199 rs -84.22.48.200 - 84.22.48.247 al -84.22.48.248 - 84.22.48.255 rs -84.22.49.0 - 84.22.49.27 al -84.22.49.28 - 84.22.49.31 rs -84.22.49.32 - 84.22.49.35 al -84.22.49.36 - 84.22.49.39 rs -84.22.49.40 - 84.22.49.163 al -84.22.49.164 - 84.22.49.167 rs -84.22.49.168 - 84.22.49.195 al -84.22.49.196 - 84.22.49.199 rs -84.22.49.200 - 84.22.49.254 al -84.22.49.255 - 84.22.49.255 rs -84.22.50.0 - 84.22.50.23 al -84.22.50.24 - 84.22.50.31 rs -84.22.50.32 - 84.22.50.135 al -84.22.50.136 - 84.22.50.143 rs -84.22.50.144 - 84.22.50.175 al -84.22.50.176 - 84.22.50.183 rs -84.22.50.184 - 84.22.50.195 al -84.22.50.196 - 84.22.50.255 rs -84.22.51.0 - 84.22.52.55 al -84.22.52.56 - 84.22.52.56 rs -84.22.52.57 - 84.22.52.63 al -84.22.52.64 - 84.22.52.79 rs -84.22.52.80 - 84.22.52.95 al -84.22.52.96 - 84.22.52.103 rs -84.22.52.104 - 84.22.52.139 al -84.22.52.140 - 84.22.52.143 rs -84.22.52.144 - 84.22.52.171 al -84.22.52.172 - 84.22.52.175 rs -84.22.52.176 - 84.22.52.179 al -84.22.52.180 - 84.22.52.183 rs -84.22.52.184 - 84.22.52.215 al -84.22.52.216 - 84.22.52.223 rs -84.22.52.224 - 84.22.52.231 al -84.22.52.232 - 84.22.52.235 rs -84.22.52.236 - 84.22.56.7 al -84.22.56.8 - 84.22.56.47 rs -84.22.56.48 - 84.22.56.79 al -84.22.56.80 - 84.22.56.87 rs -84.22.56.88 - 84.22.56.143 al -84.22.56.144 - 84.22.56.255 rs -84.22.57.0 - 84.22.58.123 al -84.22.58.124 - 84.22.58.127 rs -84.22.58.128 - 84.22.58.139 al -84.22.58.140 - 84.22.58.143 rs -84.22.58.144 - 84.22.58.147 al -84.22.58.148 - 84.22.58.155 rs -84.22.58.156 - 84.22.58.159 al -84.22.58.160 - 84.22.58.163 rs -84.22.58.164 - 84.22.58.168 al -84.22.58.169 - 84.22.58.171 rs -84.22.58.172 - 84.22.58.175 al -84.22.58.176 - 84.22.58.187 rs -84.22.58.188 - 84.22.58.191 al -84.22.58.192 - 84.22.58.199 rs -84.22.58.200 - 84.22.58.203 al -84.22.58.204 - 84.22.58.207 rs -84.22.58.208 - 84.22.58.212 al -84.22.58.213 - 84.22.58.255 rs -84.22.59.0 - 84.22.62.127 al -84.22.62.128 - 84.22.62.191 rs -84.22.62.192 - 84.22.63.255 al -84.22.64.0 - 84.22.64.255 fr -84.22.65.0 - 84.22.65.255 a2 -84.22.66.0 - 84.22.67.135 fr -84.22.67.136 - 84.22.67.143 ae -84.22.67.144 - 84.22.67.159 fr -84.22.67.160 - 84.22.67.191 us -84.22.67.192 - 84.22.69.255 fr -84.22.70.0 - 84.22.70.255 ch -84.22.71.0 - 84.22.73.255 ao -84.22.74.0 - 84.22.79.255 a2 -84.22.80.0 - 84.22.95.255 de -84.22.96.0 - 84.22.96.191 aq -84.22.96.192 - 84.22.96.251 de -84.22.96.252 - 84.22.97.23 aq -84.22.97.24 - 84.22.97.31 de -84.22.97.32 - 84.22.97.59 aq -84.22.97.60 - 84.22.97.63 de -84.22.97.64 - 84.22.97.67 aq -84.22.97.68 - 84.22.97.255 de -84.22.98.0 - 84.22.98.7 aq -84.22.98.8 - 84.22.98.23 de -84.22.98.24 - 84.22.98.31 bs -84.22.98.32 - 84.22.98.119 aq -84.22.98.120 - 84.22.98.127 sc -84.22.98.128 - 84.22.98.131 aq -84.22.98.132 - 84.22.98.135 de -84.22.98.136 - 84.22.98.143 aq -84.22.98.144 - 84.22.99.23 de -84.22.99.24 - 84.22.99.47 aq -84.22.99.48 - 84.22.99.55 de -84.22.99.56 - 84.22.99.63 aq -84.22.99.64 - 84.22.99.71 de -84.22.99.72 - 84.22.99.87 aq -84.22.99.88 - 84.22.99.111 de -84.22.99.112 - 84.22.99.119 nl -84.22.99.120 - 84.22.103.255 aq -84.22.104.0 - 84.22.104.31 us -84.22.104.32 - 84.22.104.63 aq -84.22.104.64 - 84.22.104.71 cn -84.22.104.72 - 84.22.105.15 aq -84.22.105.16 - 84.22.105.19 de -84.22.105.20 - 84.22.105.23 aq -84.22.105.24 - 84.22.105.39 de -84.22.105.40 - 84.22.105.43 aq -84.22.105.44 - 84.22.105.51 de -84.22.105.52 - 84.22.105.55 aq -84.22.105.56 - 84.22.105.243 de -84.22.105.244 - 84.22.105.251 aq -84.22.105.252 - 84.22.105.255 de -84.22.106.0 - 84.22.106.255 aq -84.22.107.0 - 84.22.107.255 de -84.22.108.0 - 84.22.123.255 aq -84.22.124.0 - 84.22.125.255 us -84.22.126.0 - 84.22.126.255 de -84.22.127.0 - 84.22.127.7 cn -84.22.127.8 - 84.22.127.15 bs -84.22.127.16 - 84.22.127.23 aq -84.22.127.24 - 84.22.127.39 de -84.22.127.40 - 84.22.127.55 aq -84.22.127.56 - 84.22.127.127 de -84.22.127.128 - 84.22.127.255 aq +84.22.32.0 - 84.22.63.255 rs +84.22.64.0 - 84.22.75.255 a2 +84.22.76.0 - 84.22.76.255 gf +84.22.77.0 - 84.22.95.255 a2 +84.22.96.0 - 84.22.127.255 nl 84.22.128.0 - 84.22.159.255 ru 84.22.160.0 - 84.22.191.255 gb 84.22.192.0 - 84.22.223.255 ru @@ -46388,43 +23211,19 @@ 84.23.224.0 - 84.23.255.255 de 84.24.0.0 - 84.31.255.255 nl 84.32.0.0 - 84.32.255.255 lt -84.33.0.0 - 84.33.9.255 it -84.33.10.0 - 84.33.11.255 de -84.33.12.0 - 84.33.12.255 it -84.33.13.0 - 84.33.13.255 de -84.33.14.0 - 84.33.17.255 it -84.33.18.0 - 84.33.18.255 de -84.33.19.0 - 84.33.23.255 it -84.33.24.0 - 84.33.26.255 de -84.33.27.0 - 84.33.28.255 it -84.33.29.0 - 84.33.29.255 de -84.33.30.0 - 84.33.32.255 it -84.33.33.0 - 84.33.33.255 de -84.33.34.0 - 84.33.63.255 it -84.33.64.0 - 84.33.64.255 gb -84.33.65.0 - 84.33.65.255 us -84.33.66.0 - 84.33.128.255 it +84.33.0.0 - 84.33.3.127 it +84.33.3.128 - 84.33.3.191 de +84.33.3.192 - 84.33.5.191 it +84.33.5.192 - 84.33.5.255 de +84.33.6.0 - 84.33.128.255 it 84.33.129.0 - 84.33.136.255 de -84.33.137.0 - 84.33.202.255 it -84.33.203.0 - 84.33.203.255 de -84.33.204.0 - 84.33.220.255 it -84.33.221.0 - 84.33.221.255 us -84.33.222.0 - 84.33.255.255 it +84.33.137.0 - 84.33.255.255 it 84.34.0.0 - 84.34.255.255 fi 84.35.0.0 - 84.35.255.255 nl 84.36.0.0 - 84.36.255.255 eg -84.37.0.0 - 84.37.24.7 fr -84.37.24.8 - 84.37.24.15 a2 -84.37.24.16 - 84.37.24.63 fr -84.37.24.64 - 84.37.24.71 a2 -84.37.24.72 - 84.37.24.247 fr -84.37.24.248 - 84.37.24.255 a2 -84.37.25.0 - 84.37.100.87 fr -84.37.100.88 - 84.37.100.95 a2 -84.37.100.96 - 84.37.101.247 fr -84.37.101.248 - 84.37.101.255 a2 -84.37.102.0 - 84.37.255.255 fr -84.38.0.0 - 84.38.15.255 gr +84.37.0.0 - 84.37.255.255 fr +84.38.0.0 - 84.38.7.255 ru +84.38.8.0 - 84.38.15.255 no 84.38.16.0 - 84.38.31.255 pl 84.38.32.0 - 84.38.47.255 gb 84.38.48.0 - 84.38.63.255 it @@ -46439,132 +23238,45 @@ 84.38.208.0 - 84.38.223.255 pl 84.38.224.0 - 84.38.239.255 nl 84.38.240.0 - 84.38.255.255 bg -84.39.0.0 - 84.39.255.255 pt -84.40.0.0 - 84.40.0.255 eu -84.40.1.0 - 84.40.1.255 gb -84.40.2.0 - 84.40.2.255 de -84.40.3.0 - 84.40.3.47 eu -84.40.3.48 - 84.40.3.127 gb -84.40.3.128 - 84.40.3.183 eu -84.40.3.184 - 84.40.3.207 gb -84.40.3.208 - 84.40.3.211 au -84.40.3.212 - 84.40.3.255 eu -84.40.4.0 - 84.40.6.255 gb -84.40.7.0 - 84.40.7.255 eu -84.40.8.0 - 84.40.8.127 gb -84.40.8.128 - 84.40.8.255 eu -84.40.9.0 - 84.40.9.255 gb -84.40.10.0 - 84.40.10.255 eu -84.40.11.0 - 84.40.11.255 gb -84.40.12.0 - 84.40.12.255 eu -84.40.13.0 - 84.40.13.255 gb -84.40.14.0 - 84.40.14.255 eu -84.40.15.0 - 84.40.15.15 gb -84.40.15.16 - 84.40.15.191 eu -84.40.15.192 - 84.40.15.223 gb -84.40.15.224 - 84.40.15.255 eu +84.39.0.0 - 84.39.31.255 nl +84.39.32.0 - 84.39.63.255 fr +84.39.64.0 - 84.39.111.255 de +84.39.112.0 - 84.39.115.255 eu +84.39.116.0 - 84.39.116.27 gb +84.39.116.28 - 84.39.116.31 fr +84.39.116.32 - 84.39.117.255 gb +84.39.118.0 - 84.39.119.255 eu +84.39.120.0 - 84.39.127.255 nl +84.39.128.0 - 84.39.135.255 ru +84.39.136.0 - 84.39.143.255 eu +84.39.144.0 - 84.39.151.255 ch +84.39.152.0 - 84.39.152.30 de +84.39.152.31 - 84.39.152.31 gb +84.39.152.32 - 84.39.152.255 de +84.39.153.0 - 84.39.153.255 gb +84.39.154.0 - 84.39.159.255 de +84.39.160.0 - 84.39.175.255 pl +84.39.176.0 - 84.39.183.255 ir +84.39.184.0 - 84.39.191.255 it +84.39.208.0 - 84.39.223.255 si +84.39.224.0 - 84.39.231.255 es +84.39.232.0 - 84.39.239.255 ie +84.39.240.0 - 84.39.255.255 ru +84.40.0.0 - 84.40.15.255 gb 84.40.16.0 - 84.40.31.255 us -84.40.32.0 - 84.40.32.63 gb -84.40.32.64 - 84.40.32.127 eu -84.40.32.128 - 84.40.32.135 gb -84.40.32.136 - 84.40.32.159 eu -84.40.32.160 - 84.40.32.191 gb -84.40.32.192 - 84.40.32.255 eu -84.40.33.0 - 84.40.33.63 gb -84.40.33.64 - 84.40.34.7 eu -84.40.34.8 - 84.40.34.15 gb -84.40.34.16 - 84.40.35.255 eu -84.40.36.0 - 84.40.36.63 gb -84.40.36.64 - 84.40.38.255 eu -84.40.39.0 - 84.40.39.71 gb -84.40.39.72 - 84.40.39.95 eu -84.40.39.96 - 84.40.39.127 gb -84.40.39.128 - 84.40.39.191 eu -84.40.39.192 - 84.40.39.223 gb -84.40.39.224 - 84.40.47.255 eu -84.40.48.0 - 84.40.63.255 de +84.40.32.0 - 84.40.47.255 gb +84.40.48.0 - 84.40.55.255 de +84.40.56.0 - 84.40.57.255 eu +84.40.58.0 - 84.40.63.255 gb 84.40.64.0 - 84.40.127.255 bg -84.40.128.0 - 84.40.255.255 pl -84.41.0.0 - 84.41.104.7 si -84.41.104.8 - 84.41.104.47 ba -84.41.104.48 - 84.41.104.63 si -84.41.104.64 - 84.41.104.103 ba -84.41.104.104 - 84.41.104.127 si -84.41.104.128 - 84.41.104.151 ba -84.41.104.152 - 84.41.104.159 si -84.41.104.160 - 84.41.104.167 ba -84.41.104.168 - 84.41.104.175 si -84.41.104.176 - 84.41.104.183 ba -84.41.104.184 - 84.41.104.191 si -84.41.104.192 - 84.41.104.199 ba -84.41.104.200 - 84.41.104.207 si -84.41.104.208 - 84.41.104.215 ba -84.41.104.216 - 84.41.104.223 si -84.41.104.224 - 84.41.107.255 ba -84.41.108.0 - 84.41.108.15 si -84.41.108.16 - 84.41.108.23 ba -84.41.108.24 - 84.41.108.95 si -84.41.108.96 - 84.41.108.111 ba -84.41.108.112 - 84.41.108.127 si -84.41.108.128 - 84.41.108.143 ba -84.41.108.144 - 84.41.108.175 si -84.41.108.176 - 84.41.108.191 ba -84.41.108.192 - 84.41.108.199 si -84.41.108.200 - 84.41.108.231 ba -84.41.108.232 - 84.41.108.239 si -84.41.108.240 - 84.41.108.247 ba -84.41.108.248 - 84.41.110.31 si -84.41.110.32 - 84.41.110.39 de -84.41.110.40 - 84.41.112.15 si -84.41.112.16 - 84.41.112.63 ro -84.41.112.64 - 84.41.112.127 si -84.41.112.128 - 84.41.113.255 ro -84.41.114.0 - 84.41.114.255 si -84.41.115.0 - 84.41.115.223 mk -84.41.115.224 - 84.41.115.255 si -84.41.116.0 - 84.41.116.31 ba -84.41.116.32 - 84.41.116.47 si -84.41.116.48 - 84.41.116.79 ba -84.41.116.80 - 84.41.116.87 si -84.41.116.88 - 84.41.116.95 ba -84.41.116.96 - 84.41.116.103 si -84.41.116.104 - 84.41.116.199 ba -84.41.116.200 - 84.41.116.207 si -84.41.116.208 - 84.41.116.223 ba -84.41.116.224 - 84.41.116.239 si -84.41.116.240 - 84.41.117.47 ba -84.41.117.48 - 84.41.117.63 si -84.41.117.64 - 84.41.117.79 ba -84.41.117.80 - 84.41.117.127 si -84.41.117.128 - 84.41.117.143 ba -84.41.117.144 - 84.41.117.151 si -84.41.117.152 - 84.41.117.159 ba -84.41.117.160 - 84.41.117.175 si -84.41.117.176 - 84.41.117.191 ba -84.41.117.192 - 84.41.117.199 si -84.41.117.200 - 84.41.117.231 ba -84.41.117.232 - 84.41.117.255 si -84.41.118.0 - 84.41.118.7 ba -84.41.118.8 - 84.41.118.15 si -84.41.118.16 - 84.41.118.23 ba -84.41.118.24 - 84.41.118.47 si -84.41.118.48 - 84.41.118.55 ba -84.41.118.56 - 84.41.118.63 si -84.41.118.64 - 84.41.118.199 ba -84.41.118.200 - 84.41.118.207 si -84.41.118.208 - 84.41.118.223 ba -84.41.118.224 - 84.41.118.255 si -84.41.119.0 - 84.41.119.15 ba -84.41.119.16 - 84.41.119.39 si -84.41.119.40 - 84.41.119.47 ba -84.41.119.48 - 84.41.119.55 si -84.41.119.56 - 84.41.119.63 ba -84.41.119.64 - 84.41.120.15 si -84.41.120.16 - 84.41.120.63 bg -84.41.120.64 - 84.41.120.95 si -84.41.120.96 - 84.41.121.255 bg -84.41.122.0 - 84.41.123.255 ba -84.41.124.0 - 84.41.127.255 si +84.40.128.0 - 84.40.211.11 pl +84.40.211.12 - 84.40.211.12 ie +84.40.211.13 - 84.40.255.255 pl +84.41.0.0 - 84.41.103.255 si +84.41.104.0 - 84.41.108.255 ba +84.41.109.0 - 84.41.115.255 si +84.41.116.0 - 84.41.119.255 ba +84.41.120.0 - 84.41.127.255 si 84.41.128.0 - 84.41.255.255 nl 84.42.0.0 - 84.42.127.255 ru 84.42.128.0 - 84.42.255.255 cz @@ -46572,38 +23284,37 @@ 84.43.128.0 - 84.43.255.255 bg 84.44.0.0 - 84.44.127.255 tr 84.44.128.0 - 84.44.255.255 de -84.45.0.0 - 84.45.22.215 gb -84.45.22.216 - 84.45.22.223 nl -84.45.22.224 - 84.45.75.255 gb -84.45.76.0 - 84.45.76.255 nl -84.45.77.0 - 84.45.86.255 gb -84.45.87.0 - 84.45.87.63 nl -84.45.87.64 - 84.45.90.255 gb -84.45.91.0 - 84.45.91.255 de -84.45.92.0 - 84.45.255.255 gb +84.45.0.0 - 84.45.255.255 gb 84.46.0.0 - 84.46.127.255 de 84.46.128.0 - 84.46.255.255 lt 84.47.0.0 - 84.47.127.255 sk -84.47.128.0 - 84.47.191.255 ru -84.47.192.0 - 84.47.195.255 ae -84.47.196.0 - 84.47.210.255 ir -84.47.211.0 - 84.47.211.255 ae -84.47.212.0 - 84.47.255.255 ir +84.47.128.0 - 84.47.131.255 ru +84.47.132.0 - 84.47.133.255 ro +84.47.134.0 - 84.47.145.255 ru +84.47.146.0 - 84.47.146.255 ro +84.47.147.0 - 84.47.153.255 ru +84.47.154.0 - 84.47.155.255 ro +84.47.156.0 - 84.47.165.255 ru +84.47.166.0 - 84.47.167.255 ro +84.47.168.0 - 84.47.178.255 ru +84.47.179.0 - 84.47.179.255 ua +84.47.180.0 - 84.47.180.255 ro +84.47.181.0 - 84.47.183.255 ru +84.47.184.0 - 84.47.185.255 ro +84.47.186.0 - 84.47.191.255 ru +84.47.192.0 - 84.47.197.255 ae +84.47.198.0 - 84.47.198.255 ir +84.47.199.0 - 84.47.207.255 ae +84.47.208.0 - 84.47.239.255 ir +84.47.240.0 - 84.47.247.255 ae +84.47.248.0 - 84.47.255.255 ir 84.48.0.0 - 84.49.255.255 no 84.50.0.0 - 84.50.255.255 ee -84.51.0.0 - 84.51.51.255 tr -84.51.52.0 - 84.51.55.255 de -84.51.56.0 - 84.51.63.255 tr +84.51.0.0 - 84.51.63.255 tr 84.51.64.0 - 84.51.127.255 ru 84.51.128.0 - 84.51.191.255 gb 84.51.192.0 - 84.51.223.255 ru -84.51.224.0 - 84.51.225.159 ie -84.51.225.160 - 84.51.225.255 bb -84.51.226.0 - 84.51.237.163 ie -84.51.237.164 - 84.51.237.191 gb -84.51.237.192 - 84.51.241.15 ie -84.51.241.16 - 84.51.241.23 gb -84.51.241.24 - 84.51.255.255 ie +84.51.224.0 - 84.51.255.255 ie 84.52.0.0 - 84.52.63.255 ee 84.52.64.0 - 84.52.127.255 ru 84.52.128.0 - 84.52.191.255 si @@ -46611,16 +23322,16 @@ 84.53.64.0 - 84.53.127.255 nl 84.53.128.0 - 84.53.131.255 us 84.53.132.0 - 84.53.133.255 eu -84.53.134.0 - 84.53.175.255 us +84.53.134.0 - 84.53.141.255 us +84.53.142.0 - 84.53.143.255 eu +84.53.144.0 - 84.53.175.255 us 84.53.176.0 - 84.53.176.255 eu 84.53.177.0 - 84.53.179.255 us 84.53.180.0 - 84.53.181.255 eu 84.53.182.0 - 84.53.191.255 us 84.53.192.0 - 84.53.255.255 ru -84.54.0.0 - 84.54.20.255 iq -84.54.21.0 - 84.54.31.255 lb -84.54.32.0 - 84.54.32.255 ci -84.54.33.0 - 84.54.63.255 lb +84.54.0.0 - 84.54.23.255 iq +84.54.30.0 - 84.54.30.255 sl 84.54.64.0 - 84.54.127.255 uz 84.54.128.0 - 84.54.191.255 bg 84.54.192.0 - 84.54.255.255 ru @@ -46628,9 +23339,13 @@ 84.55.64.0 - 84.55.127.255 se 84.55.128.0 - 84.55.191.255 fr 84.55.192.0 - 84.55.255.255 ch -84.56.0.0 - 84.63.255.255 de -84.64.0.0 - 84.71.255.255 gb -84.72.0.0 - 84.75.255.255 ch +84.56.0.0 - 84.63.160.68 de +84.63.160.69 - 84.63.160.69 us +84.63.160.70 - 84.63.255.255 de +84.64.0.0 - 84.71.255.255 in +84.72.0.0 - 84.72.251.226 ch +84.72.251.227 - 84.72.251.227 at +84.72.251.228 - 84.75.255.255 ch 84.76.0.0 - 84.79.255.255 es 84.80.0.0 - 84.87.255.255 nl 84.88.0.0 - 84.89.255.255 es @@ -46640,47 +23355,27 @@ 84.96.0.0 - 84.103.255.255 fr 84.104.0.0 - 84.107.255.255 nl 84.108.0.0 - 84.111.255.255 il -84.112.0.0 - 84.119.255.255 at -84.120.0.0 - 84.127.255.255 es +84.112.0.0 - 84.116.207.255 at +84.116.208.0 - 84.116.215.255 ch +84.116.216.0 - 84.116.219.255 at +84.116.220.0 - 84.116.223.255 cz +84.116.224.0 - 84.116.255.255 at +84.117.0.0 - 84.117.255.255 ro +84.118.0.0 - 84.119.255.255 de +84.120.0.0 - 84.125.188.255 es +84.125.189.0 - 84.125.189.255 us +84.125.190.0 - 84.127.255.255 es 84.128.0.0 - 84.191.255.255 de 84.192.0.0 - 84.199.255.255 be -84.200.0.0 - 84.200.0.255 de -84.200.1.0 - 84.200.1.255 it -84.200.2.0 - 84.200.20.255 de -84.200.21.0 - 84.200.21.63 it -84.200.21.64 - 84.200.22.127 de -84.200.22.128 - 84.200.22.159 it -84.200.22.160 - 84.200.22.255 de -84.200.23.0 - 84.200.23.255 us -84.200.24.0 - 84.200.25.255 de -84.200.26.0 - 84.200.26.255 it -84.200.27.0 - 84.200.27.255 de -84.200.28.0 - 84.200.28.255 br -84.200.29.0 - 84.200.40.255 de -84.200.41.0 - 84.200.41.63 it -84.200.41.64 - 84.200.41.95 se -84.200.41.96 - 84.200.50.255 de -84.200.51.0 - 84.200.51.63 gb -84.200.51.64 - 84.200.66.127 de -84.200.66.128 - 84.200.66.255 it -84.200.67.0 - 84.200.201.255 de -84.200.202.0 - 84.200.205.255 it -84.200.206.0 - 84.200.227.95 de -84.200.227.96 - 84.200.227.127 se -84.200.227.128 - 84.200.230.47 de -84.200.230.48 - 84.200.230.51 ru -84.200.230.52 - 84.201.36.111 de -84.201.36.112 - 84.201.36.127 it -84.201.36.128 - 84.201.38.63 de -84.201.38.64 - 84.201.38.127 it -84.201.38.128 - 84.201.42.207 de -84.201.42.208 - 84.201.42.215 ro -84.201.42.216 - 84.201.70.63 de -84.201.70.64 - 84.201.70.95 gb -84.201.70.96 - 84.201.80.255 de -84.201.81.0 - 84.201.81.255 be -84.201.82.0 - 84.201.127.255 de -84.201.128.0 - 84.201.191.255 ru +84.200.0.0 - 84.200.78.255 de +84.200.79.0 - 84.200.79.127 at +84.200.79.128 - 84.200.79.159 us +84.200.79.160 - 84.201.16.255 de +84.201.17.0 - 84.201.18.255 nl +84.201.19.0 - 84.201.127.255 de +84.201.128.0 - 84.201.143.127 ru +84.201.143.128 - 84.201.143.191 nl +84.201.143.192 - 84.201.191.255 ru 84.201.192.0 - 84.201.207.255 bg 84.201.208.0 - 84.201.223.255 pl 84.201.224.0 - 84.201.239.255 by @@ -46696,24 +23391,17 @@ 84.205.160.0 - 84.205.191.255 pl 84.205.192.0 - 84.205.255.255 gr 84.206.0.0 - 84.206.255.255 hu -84.207.0.0 - 84.207.16.191 eu -84.207.16.192 - 84.207.16.255 fr -84.207.17.0 - 84.207.17.255 eu -84.207.18.0 - 84.207.18.255 fr -84.207.19.0 - 84.207.19.127 eu +84.207.0.0 - 84.207.19.127 eu 84.207.19.128 - 84.207.19.191 fr -84.207.19.192 - 84.207.19.223 eu -84.207.19.224 - 84.207.22.127 fr -84.207.22.128 - 84.207.22.191 eu -84.207.22.192 - 84.207.23.159 fr -84.207.23.160 - 84.207.23.255 eu -84.207.24.0 - 84.207.25.127 fr -84.207.25.128 - 84.207.223.255 eu -84.207.224.0 - 84.207.224.255 nl -84.207.225.0 - 84.207.230.255 eu -84.207.231.0 - 84.207.231.255 nl -84.207.232.0 - 84.207.254.255 eu -84.207.255.0 - 84.207.255.255 gb +84.207.19.192 - 84.207.207.255 eu +84.207.208.0 - 84.207.215.255 ie +84.207.216.0 - 84.207.231.255 nl +84.207.232.0 - 84.207.247.255 gb +84.207.248.0 - 84.207.251.255 eu +84.207.252.0 - 84.207.252.255 gb +84.207.253.0 - 84.207.254.223 eu +84.207.254.224 - 84.207.254.255 nl +84.207.255.0 - 84.207.255.255 eu 84.208.0.0 - 84.215.255.255 no 84.216.0.0 - 84.219.255.255 se 84.220.0.0 - 84.223.255.255 it @@ -46721,252 +23409,50 @@ 84.226.0.0 - 84.227.255.255 ch 84.228.0.0 - 84.229.255.255 il 84.230.0.0 - 84.231.255.255 fi -84.232.0.0 - 84.232.127.255 es +84.232.0.0 - 84.232.51.159 es +84.232.51.160 - 84.232.51.163 pt +84.232.51.164 - 84.232.127.255 es 84.232.128.0 - 84.232.255.255 ro 84.233.0.0 - 84.233.127.255 eg -84.233.128.0 - 84.233.128.39 de -84.233.128.40 - 84.233.128.47 gb -84.233.128.48 - 84.233.128.63 de -84.233.128.64 - 84.233.128.127 us -84.233.128.128 - 84.233.128.151 de -84.233.128.152 - 84.233.128.159 gb -84.233.128.160 - 84.233.128.163 it -84.233.128.164 - 84.233.129.255 de -84.233.130.0 - 84.233.130.255 fr -84.233.131.0 - 84.233.135.127 gb -84.233.135.128 - 84.233.135.175 se -84.233.135.176 - 84.233.135.179 gb -84.233.135.180 - 84.233.135.191 se -84.233.135.192 - 84.233.135.255 ch -84.233.136.0 - 84.233.138.46 se -84.233.138.47 - 84.233.138.47 gb -84.233.138.48 - 84.233.138.63 se -84.233.138.64 - 84.233.138.79 gb -84.233.138.80 - 84.233.138.103 se -84.233.138.104 - 84.233.138.111 gb -84.233.138.112 - 84.233.138.191 se -84.233.138.192 - 84.233.138.255 cz -84.233.139.0 - 84.233.142.255 gb -84.233.143.0 - 84.233.144.255 fr -84.233.145.0 - 84.233.145.255 nl -84.233.146.0 - 84.233.146.255 de -84.233.147.0 - 84.233.147.63 sk -84.233.147.64 - 84.233.147.127 hu -84.233.147.128 - 84.233.147.255 de -84.233.148.0 - 84.233.148.47 fr -84.233.148.48 - 84.233.148.63 gb -84.233.148.64 - 84.233.148.135 fr -84.233.148.136 - 84.233.148.143 it -84.233.148.144 - 84.233.148.183 fr -84.233.148.184 - 84.233.148.191 gb -84.233.148.192 - 84.233.148.255 fr -84.233.149.0 - 84.233.149.255 gb -84.233.150.0 - 84.233.150.87 ie -84.233.150.88 - 84.233.150.95 gb -84.233.150.96 - 84.233.150.103 ie -84.233.150.104 - 84.233.153.255 gb -84.233.154.0 - 84.233.154.71 it -84.233.154.72 - 84.233.154.79 gb -84.233.154.80 - 84.233.154.119 it -84.233.154.120 - 84.233.154.127 gb -84.233.154.128 - 84.233.155.107 it -84.233.155.108 - 84.233.155.111 gb -84.233.155.112 - 84.233.157.255 it -84.233.158.0 - 84.233.159.255 fr -84.233.160.0 - 84.233.161.7 cz -84.233.161.8 - 84.233.161.15 gb -84.233.161.16 - 84.233.161.63 cz -84.233.161.64 - 84.233.161.95 gb -84.233.161.96 - 84.233.161.103 ch -84.233.161.104 - 84.233.161.127 gb -84.233.161.128 - 84.233.161.143 cz -84.233.161.144 - 84.233.161.159 gb -84.233.161.160 - 84.233.161.183 cz -84.233.161.184 - 84.233.161.255 gb -84.233.162.0 - 84.233.162.255 fr -84.233.163.0 - 84.233.163.255 it -84.233.164.0 - 84.233.167.255 gb -84.233.168.0 - 84.233.168.239 dk -84.233.168.240 - 84.233.168.255 gb -84.233.169.0 - 84.233.169.255 dk -84.233.170.0 - 84.233.171.47 hu -84.233.171.48 - 84.233.171.63 gb -84.233.171.64 - 84.233.171.67 hu -84.233.171.68 - 84.233.171.71 gb -84.233.171.72 - 84.233.171.79 hu -84.233.171.80 - 84.233.171.95 gb -84.233.171.96 - 84.233.171.127 hu -84.233.171.128 - 84.233.171.135 gb -84.233.171.136 - 84.233.171.143 hu -84.233.171.144 - 84.233.171.191 gb -84.233.171.192 - 84.233.171.223 hu -84.233.171.224 - 84.233.171.255 gb -84.233.172.0 - 84.233.172.255 ch -84.233.173.0 - 84.233.173.255 gb +84.233.128.0 - 84.233.142.255 gb +84.233.143.0 - 84.233.143.255 fr +84.233.144.0 - 84.233.155.14 gb +84.233.155.15 - 84.233.155.15 it +84.233.155.16 - 84.233.155.31 gb +84.233.155.32 - 84.233.155.39 it +84.233.155.40 - 84.233.160.77 gb +84.233.160.78 - 84.233.160.78 cz +84.233.160.79 - 84.233.173.255 gb 84.233.174.0 - 84.233.174.255 fr -84.233.175.0 - 84.233.175.255 be -84.233.176.0 - 84.233.176.255 gb -84.233.177.0 - 84.233.177.7 es -84.233.177.8 - 84.233.177.255 gb -84.233.178.0 - 84.233.178.255 ch -84.233.179.0 - 84.233.179.255 gb -84.233.180.0 - 84.233.181.255 de -84.233.182.0 - 84.233.182.111 gb -84.233.182.112 - 84.233.182.119 it -84.233.182.120 - 84.233.182.255 gb -84.233.183.0 - 84.233.183.31 us -84.233.183.32 - 84.233.183.47 fr -84.233.183.48 - 84.233.183.55 gb -84.233.183.56 - 84.233.183.127 us -84.233.183.128 - 84.233.183.143 gb -84.233.183.144 - 84.233.183.207 us -84.233.183.208 - 84.233.183.215 gb -84.233.183.216 - 84.233.183.255 us -84.233.184.0 - 84.233.184.255 sk -84.233.185.0 - 84.233.185.255 de -84.233.186.0 - 84.233.186.255 gb -84.233.187.0 - 84.233.187.135 es -84.233.187.136 - 84.233.187.143 gb -84.233.187.144 - 84.233.187.255 es -84.233.188.0 - 84.233.189.127 nl -84.233.189.128 - 84.233.189.255 gb -84.233.190.0 - 84.233.190.127 nl -84.233.190.128 - 84.233.190.255 gb -84.233.191.0 - 84.233.191.31 nl -84.233.191.32 - 84.233.191.39 gb -84.233.191.40 - 84.233.191.191 nl -84.233.191.192 - 84.233.191.207 gb -84.233.191.208 - 84.233.191.255 nl -84.233.192.0 - 84.233.192.255 gb -84.233.193.0 - 84.233.193.127 bg -84.233.193.128 - 84.233.193.143 gr -84.233.193.144 - 84.233.193.159 be -84.233.193.160 - 84.233.193.167 gb -84.233.193.168 - 84.233.193.183 bg -84.233.193.184 - 84.233.193.191 gb -84.233.193.192 - 84.233.193.255 bg -84.233.194.0 - 84.233.194.255 nl -84.233.195.0 - 84.233.195.7 ch -84.233.195.8 - 84.233.195.15 at -84.233.195.16 - 84.233.195.31 gb -84.233.195.32 - 84.233.195.71 at -84.233.195.72 - 84.233.195.255 gb -84.233.196.0 - 84.233.197.255 it -84.233.198.0 - 84.233.198.255 nl -84.233.199.0 - 84.233.199.191 gb -84.233.199.192 - 84.233.199.223 sk -84.233.199.224 - 84.233.199.239 gb -84.233.199.240 - 84.233.199.247 sk -84.233.199.248 - 84.233.200.255 gb -84.233.201.0 - 84.233.202.127 de -84.233.202.128 - 84.233.203.31 gb -84.233.203.32 - 84.233.203.83 fr -84.233.203.84 - 84.233.203.87 gb -84.233.203.88 - 84.233.203.127 fr -84.233.203.128 - 84.233.204.23 gb -84.233.204.24 - 84.233.204.63 fr -84.233.204.64 - 84.233.204.71 gb -84.233.204.72 - 84.233.204.127 fr -84.233.204.128 - 84.233.204.143 es -84.233.204.144 - 84.233.204.255 fr -84.233.205.0 - 84.233.205.47 es -84.233.205.48 - 84.233.205.55 gb -84.233.205.56 - 84.233.205.175 es -84.233.205.176 - 84.233.205.179 gb -84.233.205.180 - 84.233.206.255 es -84.233.207.0 - 84.233.207.231 de -84.233.207.232 - 84.233.207.247 gb -84.233.207.248 - 84.233.207.255 de -84.233.208.0 - 84.233.208.115 ch -84.233.208.116 - 84.233.208.119 gb -84.233.208.120 - 84.233.208.255 ch -84.233.209.0 - 84.233.209.7 gb -84.233.209.8 - 84.233.209.207 ch -84.233.209.208 - 84.233.209.223 gb -84.233.209.224 - 84.233.209.255 ch -84.233.210.0 - 84.233.211.255 gb -84.233.212.0 - 84.233.212.255 tz -84.233.213.0 - 84.233.213.255 pl -84.233.214.0 - 84.233.214.255 fr -84.233.215.0 - 84.233.215.63 be -84.233.215.64 - 84.233.215.79 gb -84.233.215.80 - 84.233.215.199 be -84.233.215.200 - 84.233.215.207 lu -84.233.215.208 - 84.233.215.255 be -84.233.216.0 - 84.233.216.255 pl -84.233.217.0 - 84.233.218.255 gb -84.233.219.0 - 84.233.219.135 cz -84.233.219.136 - 84.233.219.143 ch -84.233.219.144 - 84.233.219.223 cz -84.233.219.224 - 84.233.220.255 gb -84.233.221.0 - 84.233.221.63 ae -84.233.221.64 - 84.233.221.255 gb -84.233.222.0 - 84.233.222.255 fr -84.233.223.0 - 84.233.223.255 gb -84.233.224.0 - 84.233.224.255 es -84.233.225.0 - 84.233.226.199 it -84.233.226.200 - 84.233.226.207 gb -84.233.226.208 - 84.233.226.239 it -84.233.226.240 - 84.233.226.247 gb -84.233.226.248 - 84.233.226.255 it -84.233.227.0 - 84.233.227.255 gb -84.233.228.0 - 84.233.228.15 fr -84.233.228.16 - 84.233.228.103 it -84.233.228.104 - 84.233.228.111 gb -84.233.228.112 - 84.233.228.255 it -84.233.229.0 - 84.233.229.255 fr -84.233.230.0 - 84.233.230.255 ro -84.233.231.0 - 84.233.232.255 gb -84.233.233.0 - 84.233.233.123 it -84.233.233.124 - 84.233.233.127 gb -84.233.233.128 - 84.233.233.255 it -84.233.234.0 - 84.233.234.255 fr -84.233.235.0 - 84.233.235.255 it -84.233.236.0 - 84.233.236.31 gb -84.233.236.32 - 84.233.236.35 es -84.233.236.36 - 84.233.236.39 gb -84.233.236.40 - 84.233.236.55 es -84.233.236.56 - 84.233.236.63 gb -84.233.236.64 - 84.233.236.167 es -84.233.236.168 - 84.233.236.175 gb -84.233.236.176 - 84.233.236.207 es -84.233.236.208 - 84.233.236.211 gb -84.233.236.212 - 84.233.236.247 es -84.233.236.248 - 84.233.236.255 gb -84.233.237.0 - 84.233.237.255 us -84.233.238.0 - 84.233.238.255 fr +84.233.175.0 - 84.233.179.31 gb +84.233.179.32 - 84.233.179.47 nl +84.233.179.48 - 84.233.182.255 gb +84.233.183.0 - 84.233.183.255 us +84.233.184.0 - 84.233.189.255 gb +84.233.190.0 - 84.233.190.255 eu +84.233.191.0 - 84.233.191.47 gb +84.233.191.48 - 84.233.191.63 nl +84.233.191.64 - 84.233.201.255 gb +84.233.202.0 - 84.233.202.31 de +84.233.202.32 - 84.233.203.83 gb +84.233.203.84 - 84.233.203.87 fr +84.233.203.88 - 84.233.207.223 gb +84.233.207.224 - 84.233.207.231 de +84.233.207.232 - 84.233.213.83 gb +84.233.213.84 - 84.233.213.84 pl +84.233.213.85 - 84.233.214.176 gb +84.233.214.177 - 84.233.214.177 fr +84.233.214.178 - 84.233.214.186 gb +84.233.214.187 - 84.233.214.187 fr +84.233.214.188 - 84.233.214.189 gb +84.233.214.190 - 84.233.214.190 fr +84.233.214.191 - 84.233.215.223 gb +84.233.215.224 - 84.233.215.239 be +84.233.215.240 - 84.233.238.255 gb 84.233.239.0 - 84.233.239.15 it -84.233.239.16 - 84.233.239.31 gb -84.233.239.32 - 84.233.239.135 it -84.233.239.136 - 84.233.239.175 gb -84.233.239.176 - 84.233.239.179 it -84.233.239.180 - 84.233.239.183 gb -84.233.239.184 - 84.233.239.191 it -84.233.239.192 - 84.233.239.207 es -84.233.239.208 - 84.233.239.223 gb -84.233.239.224 - 84.233.239.231 it -84.233.239.232 - 84.233.239.239 gb -84.233.239.240 - 84.233.239.247 it -84.233.239.248 - 84.233.239.255 gb -84.233.240.0 - 84.233.240.255 us -84.233.241.0 - 84.233.242.47 it -84.233.242.48 - 84.233.242.63 gb -84.233.242.64 - 84.233.242.207 it -84.233.242.208 - 84.233.242.223 gb -84.233.242.224 - 84.233.242.255 it -84.233.243.0 - 84.233.243.255 nl -84.233.244.0 - 84.233.244.255 gb -84.233.245.0 - 84.233.245.175 fr -84.233.245.176 - 84.233.245.191 it -84.233.245.192 - 84.233.245.255 fr -84.233.246.0 - 84.233.248.255 it -84.233.249.0 - 84.233.249.31 be -84.233.249.32 - 84.233.249.63 gb -84.233.249.64 - 84.233.249.139 be -84.233.249.140 - 84.233.249.143 gb -84.233.249.144 - 84.233.249.255 be -84.233.250.0 - 84.233.253.255 gb -84.233.254.0 - 84.233.255.255 it +84.233.239.16 - 84.233.249.79 gb +84.233.249.80 - 84.233.249.87 be +84.233.249.88 - 84.233.255.255 gb 84.234.0.0 - 84.234.15.255 pl 84.234.16.0 - 84.234.31.255 gb 84.234.32.0 - 84.234.47.255 pl @@ -46981,65 +23467,31 @@ 84.235.104.0 - 84.235.127.255 sa 84.235.128.0 - 84.235.137.255 ie 84.235.138.0 - 84.235.140.255 cz -84.235.141.0 - 84.235.146.255 de -84.235.147.0 - 84.235.147.255 ie +84.235.141.0 - 84.235.147.255 de 84.235.148.0 - 84.235.155.255 gb -84.235.156.0 - 84.235.156.255 ie -84.235.157.0 - 84.235.157.255 sl -84.235.158.0 - 84.235.159.255 pl -84.235.160.0 - 84.235.160.255 ie +84.235.156.0 - 84.235.160.255 de 84.235.161.0 - 84.235.166.255 fr -84.235.167.0 - 84.235.168.255 de -84.235.169.0 - 84.235.169.255 es -84.235.170.0 - 84.235.170.255 gb +84.235.167.0 - 84.235.170.255 de 84.235.171.0 - 84.235.179.255 ie 84.235.180.0 - 84.235.182.255 nl 84.235.183.0 - 84.235.187.127 se -84.235.187.128 - 84.235.191.127 de -84.235.191.128 - 84.235.192.127 at -84.235.192.128 - 84.235.194.127 fr -84.235.194.128 - 84.235.195.127 de -84.235.195.128 - 84.235.195.255 gb -84.235.196.0 - 84.235.196.127 dk -84.235.196.128 - 84.235.196.255 at -84.235.197.0 - 84.235.197.135 de -84.235.197.136 - 84.235.197.215 gb -84.235.197.216 - 84.235.201.255 de +84.235.187.128 - 84.235.201.255 de 84.235.202.0 - 84.235.204.255 se -84.235.205.0 - 84.235.205.255 gb -84.235.206.0 - 84.235.208.159 de -84.235.208.160 - 84.235.208.199 gb -84.235.208.200 - 84.235.210.255 de -84.235.211.0 - 84.235.211.255 ie -84.235.212.0 - 84.235.217.255 de -84.235.218.0 - 84.235.218.255 ie -84.235.219.0 - 84.235.219.255 it -84.235.220.0 - 84.235.221.255 de -84.235.222.0 - 84.235.222.255 gb -84.235.223.0 - 84.235.224.255 de -84.235.225.0 - 84.235.225.255 gb -84.235.226.0 - 84.235.231.255 de +84.235.205.0 - 84.235.231.255 de 84.235.232.0 - 84.235.241.255 ie -84.235.242.0 - 84.235.242.255 sl -84.235.243.0 - 84.235.245.255 de -84.235.246.0 - 84.235.246.255 fr -84.235.247.0 - 84.235.247.255 gb -84.235.248.0 - 84.235.248.255 fr -84.235.249.0 - 84.235.249.255 ie -84.235.250.0 - 84.235.250.255 de -84.235.251.0 - 84.235.251.255 at -84.235.252.0 - 84.235.253.255 ie -84.235.254.0 - 84.235.254.255 de -84.235.255.0 - 84.235.255.255 nl +84.235.242.0 - 84.235.255.255 de 84.236.0.0 - 84.236.127.255 hu 84.236.128.0 - 84.236.255.255 es 84.237.0.0 - 84.237.127.255 ru 84.237.128.0 - 84.237.255.255 lv 84.238.0.0 - 84.238.127.255 dk 84.238.128.0 - 84.238.255.255 bg -84.239.0.0 - 84.239.127.255 ro +84.239.0.0 - 84.239.63.255 ro +84.239.64.0 - 84.239.127.255 fr 84.239.128.0 - 84.239.255.255 fi -84.240.0.0 - 84.240.63.255 lt +84.240.0.0 - 84.240.1.255 lt +84.240.2.0 - 84.240.2.255 ru +84.240.3.0 - 84.240.63.255 lt 84.240.64.0 - 84.240.127.255 fi 84.240.128.0 - 84.240.191.255 it 84.240.192.0 - 84.240.255.255 kz @@ -47060,85 +23512,43 @@ 84.244.192.0 - 84.244.255.255 se 84.245.0.0 - 84.245.63.255 nl 84.245.64.0 - 84.245.127.255 sk -84.245.128.0 - 84.245.136.59 de -84.245.136.60 - 84.245.136.60 a2 -84.245.136.61 - 84.245.191.255 de +84.245.128.0 - 84.245.191.255 de 84.245.192.0 - 84.245.255.255 lv 84.246.0.0 - 84.246.63.255 nl -84.246.64.0 - 84.246.64.79 a2 -84.246.64.80 - 84.246.65.255 de -84.246.66.0 - 84.246.66.255 ne -84.246.67.0 - 84.246.71.127 de -84.246.71.128 - 84.246.71.143 ir -84.246.71.144 - 84.246.71.167 de -84.246.71.168 - 84.246.71.176 ir -84.246.71.177 - 84.246.71.255 de +84.246.64.0 - 84.246.71.255 de 84.246.72.0 - 84.246.79.255 kw 84.246.80.0 - 84.246.87.255 gb 84.246.88.0 - 84.246.95.255 se 84.246.96.0 - 84.246.103.255 hr 84.246.104.0 - 84.246.111.255 fr 84.246.112.0 - 84.246.119.255 gb -84.246.120.0 - 84.246.122.39 de -84.246.122.40 - 84.246.122.47 cz -84.246.122.48 - 84.246.122.167 de -84.246.122.168 - 84.246.122.175 cz -84.246.122.176 - 84.246.123.47 de -84.246.123.48 - 84.246.123.55 cz -84.246.123.56 - 84.246.123.223 de -84.246.123.224 - 84.246.123.239 cz -84.246.123.240 - 84.246.127.255 de +84.246.120.0 - 84.246.127.255 de 84.246.128.0 - 84.246.135.255 se 84.246.136.0 - 84.246.143.255 gb -84.246.144.0 - 84.246.145.6 it -84.246.145.7 - 84.246.145.7 fr -84.246.145.8 - 84.246.145.19 it -84.246.145.20 - 84.246.145.21 gb -84.246.145.22 - 84.246.151.255 it +84.246.144.0 - 84.246.151.255 it 84.246.152.0 - 84.246.159.255 gb 84.246.160.0 - 84.246.167.255 cz -84.246.168.0 - 84.246.194.191 gb -84.246.194.192 - 84.246.194.255 us -84.246.195.0 - 84.246.199.255 gb -84.246.200.0 - 84.246.205.255 im -84.246.206.0 - 84.246.206.31 gb -84.246.206.32 - 84.246.206.127 im -84.246.206.128 - 84.246.206.191 gb -84.246.206.192 - 84.246.206.255 im -84.246.207.0 - 84.246.207.127 gb -84.246.207.128 - 84.246.207.255 im +84.246.168.0 - 84.246.199.255 gb +84.246.200.0 - 84.246.207.255 im 84.246.208.0 - 84.246.215.255 es 84.246.216.0 - 84.246.230.255 fr 84.246.231.0 - 84.246.231.255 es 84.246.232.0 - 84.246.239.255 ch 84.246.240.0 - 84.246.247.255 dk -84.246.248.0 - 84.246.249.47 de -84.246.249.48 - 84.246.249.55 ch -84.246.249.56 - 84.246.249.71 de -84.246.249.72 - 84.246.249.79 ch -84.246.249.80 - 84.246.249.87 gb -84.246.249.88 - 84.246.249.119 de -84.246.249.120 - 84.246.249.127 gb -84.246.249.128 - 84.246.249.143 it -84.246.249.144 - 84.246.249.151 gb -84.246.249.152 - 84.246.249.175 de -84.246.249.176 - 84.246.249.199 gb -84.246.249.200 - 84.246.249.223 de -84.246.249.224 - 84.246.249.231 ch -84.246.249.232 - 84.246.250.7 de -84.246.250.8 - 84.246.250.11 gb -84.246.250.12 - 84.246.250.15 es -84.246.250.16 - 84.246.250.35 de -84.246.250.36 - 84.246.250.39 gb -84.246.250.40 - 84.246.255.255 de -84.247.0.0 - 84.247.45.255 ro -84.247.46.0 - 84.247.47.255 ae -84.247.48.0 - 84.247.127.255 ro +84.246.248.0 - 84.246.255.255 de +84.247.0.0 - 84.247.43.255 ro +84.247.44.0 - 84.247.45.255 md +84.247.46.0 - 84.247.51.255 ro +84.247.52.0 - 84.247.53.255 md +84.247.54.0 - 84.247.61.255 ro +84.247.62.0 - 84.247.62.255 nl +84.247.63.0 - 84.247.127.255 ro 84.247.128.0 - 84.247.191.255 no 84.247.192.0 - 84.247.255.255 it 84.248.0.0 - 84.251.255.255 fi -84.252.0.0 - 84.252.63.255 bg -84.252.64.0 - 84.252.127.255 de +84.252.0.0 - 84.252.47.255 bg +84.252.48.0 - 84.252.51.255 mk +84.252.52.0 - 84.252.63.255 bg 84.252.128.0 - 84.252.191.255 ru 84.252.192.0 - 84.252.255.255 gb 84.253.0.0 - 84.253.63.255 ch @@ -47146,237 +23556,15 @@ 84.253.128.0 - 84.253.191.255 it 84.253.192.0 - 84.253.255.255 fi 84.254.0.0 - 84.254.63.255 gr -84.254.64.0 - 84.254.65.255 de -84.254.66.0 - 84.254.66.7 nl -84.254.66.8 - 84.254.127.255 de -84.254.128.0 - 84.254.128.44 es -84.254.128.45 - 84.254.128.56 fr -84.254.128.57 - 84.254.128.60 za -84.254.128.61 - 84.254.128.64 a2 -84.254.128.65 - 84.254.128.126 it -84.254.128.127 - 84.254.128.127 a2 -84.254.128.128 - 84.254.129.191 it -84.254.129.192 - 84.254.129.255 fr -84.254.130.0 - 84.254.130.0 a2 -84.254.130.1 - 84.254.130.4 ng -84.254.130.5 - 84.254.130.8 us -84.254.130.9 - 84.254.130.12 fr -84.254.130.13 - 84.254.130.16 bj -84.254.130.17 - 84.254.130.20 es -84.254.130.21 - 84.254.130.24 a2 -84.254.130.25 - 84.254.130.63 fr -84.254.130.64 - 84.254.132.0 a2 -84.254.132.1 - 84.254.132.8 de -84.254.132.9 - 84.254.132.24 a2 -84.254.132.25 - 84.254.132.48 de -84.254.132.49 - 84.254.132.64 a2 -84.254.132.65 - 84.254.132.72 de -84.254.132.73 - 84.254.132.128 a2 -84.254.132.129 - 84.254.132.144 de -84.254.132.145 - 84.254.132.159 a2 -84.254.132.160 - 84.254.132.191 it -84.254.132.192 - 84.254.132.255 de -84.254.133.0 - 84.254.133.127 a2 -84.254.133.128 - 84.254.133.191 it -84.254.133.192 - 84.254.134.16 a2 -84.254.134.17 - 84.254.134.32 it -84.254.134.33 - 84.254.134.63 a2 -84.254.134.64 - 84.254.134.127 it -84.254.134.128 - 84.254.134.128 a2 -84.254.134.129 - 84.254.134.136 bj -84.254.134.137 - 84.254.134.143 a2 -84.254.134.144 - 84.254.134.159 bj -84.254.134.160 - 84.254.134.223 a2 -84.254.134.224 - 84.254.134.255 bj -84.254.135.0 - 84.254.135.4 a2 -84.254.135.5 - 84.254.135.48 de -84.254.135.49 - 84.254.135.63 a2 -84.254.135.64 - 84.254.135.127 de -84.254.135.128 - 84.254.135.191 it -84.254.135.192 - 84.254.135.255 de -84.254.136.0 - 84.254.136.0 a2 -84.254.136.1 - 84.254.136.16 tr -84.254.136.17 - 84.254.136.255 it -84.254.137.0 - 84.254.138.127 a2 -84.254.138.128 - 84.254.138.191 it -84.254.138.192 - 84.254.139.4 a2 -84.254.139.5 - 84.254.139.20 de -84.254.139.21 - 84.254.139.24 a2 -84.254.139.25 - 84.254.139.32 de -84.254.139.33 - 84.254.139.40 a2 -84.254.139.41 - 84.254.139.52 de -84.254.139.53 - 84.254.139.56 a2 -84.254.139.57 - 84.254.139.68 de -84.254.139.69 - 84.254.139.95 a2 -84.254.139.96 - 84.254.139.127 it -84.254.139.128 - 84.254.139.255 de -84.254.140.0 - 84.254.140.255 a2 -84.254.141.0 - 84.254.141.254 gb -84.254.141.255 - 84.254.142.63 a2 -84.254.142.64 - 84.254.142.191 it -84.254.142.192 - 84.254.142.255 a2 -84.254.143.0 - 84.254.143.127 it -84.254.143.128 - 84.254.144.47 a2 -84.254.144.48 - 84.254.144.63 it -84.254.144.64 - 84.254.144.127 a2 -84.254.144.128 - 84.254.144.191 it -84.254.144.192 - 84.254.144.255 a2 -84.254.145.0 - 84.254.145.63 it -84.254.145.64 - 84.254.145.255 a2 -84.254.146.0 - 84.254.146.63 fr -84.254.146.64 - 84.254.146.127 it -84.254.146.128 - 84.254.146.191 fr -84.254.146.192 - 84.254.147.63 a2 -84.254.147.64 - 84.254.147.127 it -84.254.147.128 - 84.254.147.191 de -84.254.147.192 - 84.254.148.0 a2 -84.254.148.1 - 84.254.148.4 de -84.254.148.5 - 84.254.148.8 a2 -84.254.148.9 - 84.254.148.12 gb -84.254.148.13 - 84.254.148.16 de -84.254.148.17 - 84.254.148.63 gb -84.254.148.64 - 84.254.148.127 a2 -84.254.148.128 - 84.254.148.255 it -84.254.149.0 - 84.254.149.63 a2 -84.254.149.64 - 84.254.149.255 it -84.254.150.0 - 84.254.150.0 a2 -84.254.150.1 - 84.254.150.63 de -84.254.150.64 - 84.254.150.255 a2 -84.254.151.0 - 84.254.151.63 it -84.254.151.64 - 84.254.151.127 nl -84.254.151.128 - 84.254.151.255 a2 -84.254.152.0 - 84.254.152.31 nl -84.254.152.32 - 84.254.152.63 de -84.254.152.64 - 84.254.152.255 nl -84.254.153.0 - 84.254.153.63 a2 -84.254.153.64 - 84.254.153.127 it -84.254.153.128 - 84.254.153.191 a2 -84.254.153.192 - 84.254.153.255 it -84.254.154.0 - 84.254.154.15 ae -84.254.154.16 - 84.254.154.31 us -84.254.154.32 - 84.254.154.63 a2 -84.254.154.64 - 84.254.154.127 de -84.254.154.128 - 84.254.154.191 se -84.254.154.192 - 84.254.154.255 a2 -84.254.155.0 - 84.254.155.255 it -84.254.156.0 - 84.254.157.191 a2 -84.254.157.192 - 84.254.157.255 it -84.254.158.0 - 84.254.159.191 a2 -84.254.159.192 - 84.254.159.255 it -84.254.160.0 - 84.254.160.0 a2 -84.254.160.1 - 84.254.160.12 pl -84.254.160.13 - 84.254.160.16 a2 -84.254.160.17 - 84.254.160.20 de -84.254.160.21 - 84.254.160.24 fr -84.254.160.25 - 84.254.160.28 pl -84.254.160.29 - 84.254.160.32 a2 -84.254.160.33 - 84.254.160.52 pl -84.254.160.53 - 84.254.160.60 de -84.254.160.61 - 84.254.160.84 pl -84.254.160.85 - 84.254.160.88 de -84.254.160.89 - 84.254.160.191 a2 -84.254.160.192 - 84.254.160.255 pl -84.254.161.0 - 84.254.161.255 it -84.254.162.0 - 84.254.162.63 pl -84.254.162.64 - 84.254.162.127 it -84.254.162.128 - 84.254.163.127 a2 -84.254.163.128 - 84.254.163.191 it -84.254.163.192 - 84.254.164.191 a2 -84.254.164.192 - 84.254.164.255 it -84.254.165.0 - 84.254.165.255 a2 -84.254.166.0 - 84.254.166.63 it -84.254.166.64 - 84.254.166.127 se -84.254.166.128 - 84.254.166.191 a2 -84.254.166.192 - 84.254.166.255 it -84.254.167.0 - 84.254.167.63 a2 -84.254.167.64 - 84.254.167.127 it -84.254.167.128 - 84.254.168.0 a2 -84.254.168.1 - 84.254.168.64 pe -84.254.168.65 - 84.254.168.191 a2 -84.254.168.192 - 84.254.168.255 it -84.254.169.0 - 84.254.169.127 fr -84.254.169.128 - 84.254.169.191 it -84.254.169.192 - 84.254.169.255 a2 -84.254.170.0 - 84.254.170.255 it -84.254.171.0 - 84.254.171.0 a2 -84.254.171.1 - 84.254.171.62 fr -84.254.171.63 - 84.254.171.63 a2 -84.254.171.64 - 84.254.171.127 it -84.254.171.128 - 84.254.171.191 fr -84.254.171.192 - 84.254.171.255 it -84.254.172.0 - 84.254.172.0 a2 -84.254.172.1 - 84.254.172.8 fr -84.254.172.9 - 84.254.172.16 gb -84.254.172.17 - 84.254.172.24 a2 -84.254.172.25 - 84.254.172.32 fr -84.254.172.33 - 84.254.172.48 gb -84.254.172.49 - 84.254.172.52 fr -84.254.172.53 - 84.254.172.60 gb -84.254.172.61 - 84.254.172.68 fr -84.254.172.69 - 84.254.172.72 it -84.254.172.73 - 84.254.172.112 fr -84.254.172.113 - 84.254.172.120 gb -84.254.172.121 - 84.254.172.128 fr -84.254.172.129 - 84.254.172.144 gb -84.254.172.145 - 84.254.172.255 a2 -84.254.173.0 - 84.254.173.254 gb -84.254.173.255 - 84.254.173.255 a2 -84.254.174.0 - 84.254.175.254 gb -84.254.175.255 - 84.254.175.255 a2 -84.254.176.0 - 84.254.177.255 it -84.254.178.0 - 84.254.178.255 de -84.254.179.0 - 84.254.179.255 bg -84.254.180.0 - 84.254.180.0 a2 -84.254.180.1 - 84.254.180.20 it -84.254.180.21 - 84.254.180.21 a2 -84.254.180.22 - 84.254.180.127 it -84.254.180.128 - 84.254.181.0 a2 -84.254.181.1 - 84.254.181.127 it -84.254.181.128 - 84.254.181.191 a2 -84.254.181.192 - 84.254.181.195 it -84.254.181.196 - 84.254.182.191 a2 -84.254.182.192 - 84.254.182.255 it -84.254.183.0 - 84.254.183.191 a2 -84.254.183.192 - 84.254.183.255 it -84.254.184.0 - 84.254.184.0 a2 -84.254.184.1 - 84.254.184.8 de -84.254.184.9 - 84.254.184.20 a2 -84.254.184.21 - 84.254.184.24 de -84.254.184.25 - 84.254.184.44 a2 -84.254.184.45 - 84.254.184.64 de -84.254.184.65 - 84.254.184.68 a2 -84.254.184.69 - 84.254.184.72 de -84.254.184.73 - 84.254.184.80 a2 -84.254.184.81 - 84.254.184.84 de -84.254.184.85 - 84.254.184.88 a2 -84.254.184.89 - 84.254.184.96 de -84.254.184.97 - 84.254.184.111 a2 -84.254.184.112 - 84.254.184.127 it -84.254.184.128 - 84.254.184.191 de -84.254.184.192 - 84.254.185.4 a2 -84.254.185.5 - 84.254.185.8 ae -84.254.185.9 - 84.254.185.12 a2 -84.254.185.13 - 84.254.185.44 ae -84.254.185.45 - 84.254.185.56 a2 -84.254.185.57 - 84.254.185.60 ae -84.254.185.61 - 84.254.185.63 a2 -84.254.185.64 - 84.254.185.127 de -84.254.185.128 - 84.254.185.191 us -84.254.185.192 - 84.254.185.255 it -84.254.186.0 - 84.254.186.0 a2 -84.254.186.1 - 84.254.186.64 ae -84.254.186.65 - 84.254.186.72 a2 -84.254.186.73 - 84.254.186.80 fr -84.254.186.81 - 84.254.186.94 it -84.254.186.95 - 84.254.186.95 a2 -84.254.186.96 - 84.254.186.127 us -84.254.186.128 - 84.254.186.191 de -84.254.186.192 - 84.254.186.255 ae -84.254.187.0 - 84.254.187.127 it -84.254.187.128 - 84.254.187.191 a2 -84.254.187.192 - 84.254.187.255 it -84.254.188.0 - 84.254.191.191 a2 -84.254.191.192 - 84.254.191.255 it +84.254.64.0 - 84.254.127.255 de +84.254.128.0 - 84.254.163.255 eu +84.254.164.0 - 84.254.165.255 gb +84.254.166.0 - 84.254.169.255 eu +84.254.170.0 - 84.254.170.255 fr +84.254.171.0 - 84.254.175.255 eu +84.254.176.0 - 84.254.187.255 fr +84.254.188.0 - 84.254.188.255 iq +84.254.189.0 - 84.254.191.255 eu 84.254.192.0 - 84.254.255.255 ru 84.255.0.0 - 84.255.63.255 mt 84.255.64.0 - 84.255.127.255 dk @@ -47385,112 +23573,52 @@ 85.0.0.0 - 85.7.255.255 ch 85.8.0.0 - 85.8.63.255 se 85.8.64.0 - 85.8.127.255 de -85.8.128.0 - 85.8.255.255 gb -85.9.0.0 - 85.9.63.255 ro +85.8.192.0 - 85.8.255.255 gb +85.9.0.0 - 85.9.29.49 ro +85.9.29.50 - 85.9.29.50 us +85.9.29.51 - 85.9.63.255 ro 85.9.64.0 - 85.9.127.255 ir 85.9.128.0 - 85.9.191.255 tj -85.9.192.0 - 85.9.194.255 lv -85.9.195.0 - 85.9.195.63 ru -85.9.195.64 - 85.9.195.110 lv -85.9.195.111 - 85.9.195.113 ru -85.9.195.114 - 85.9.245.255 lv +85.9.192.0 - 85.9.245.255 lv 85.9.246.0 - 85.9.246.255 ru 85.9.247.0 - 85.9.255.255 lv 85.10.0.0 - 85.10.47.255 si 85.10.48.0 - 85.10.63.255 hr -85.10.64.0 - 85.10.127.255 be +85.10.64.0 - 85.10.95.255 be +85.10.96.0 - 85.10.127.255 lu 85.10.128.0 - 85.10.191.255 fr -85.10.192.0 - 85.10.235.111 de -85.10.235.112 - 85.10.235.119 it -85.10.235.120 - 85.10.245.215 de -85.10.245.216 - 85.10.245.223 it -85.10.245.224 - 85.10.255.255 de +85.10.192.0 - 85.10.255.255 de 85.11.0.0 - 85.11.63.255 se 85.11.64.0 - 85.11.127.255 pl 85.11.128.0 - 85.11.191.255 bg 85.11.192.0 - 85.11.255.255 se -85.12.0.0 - 85.12.6.191 nl -85.12.6.192 - 85.12.6.255 pa -85.12.7.0 - 85.12.10.0 nl -85.12.10.1 - 85.12.10.7 ru -85.12.10.8 - 85.12.10.15 se -85.12.10.16 - 85.12.10.23 nl -85.12.10.24 - 85.12.10.31 us -85.12.10.32 - 85.12.30.0 nl -85.12.30.1 - 85.12.30.28 es -85.12.30.29 - 85.12.57.127 nl -85.12.57.128 - 85.12.57.255 pa -85.12.58.0 - 85.12.63.255 nl +85.12.0.0 - 85.12.63.255 nl 85.12.64.0 - 85.12.127.255 gb 85.12.128.0 - 85.12.191.255 fr 85.12.192.0 - 85.12.255.255 ru 85.13.0.0 - 85.13.63.255 at 85.13.64.0 - 85.13.127.255 cz 85.13.128.0 - 85.13.191.255 de -85.13.192.0 - 85.13.202.247 gb -85.13.202.248 - 85.13.202.255 es -85.13.203.0 - 85.13.203.159 gb -85.13.203.160 - 85.13.203.167 es -85.13.203.168 - 85.13.204.15 gb -85.13.204.16 - 85.13.204.23 es -85.13.204.24 - 85.13.204.119 gb -85.13.204.120 - 85.13.204.127 es -85.13.204.128 - 85.13.207.23 gb -85.13.207.24 - 85.13.207.31 es -85.13.207.32 - 85.13.208.15 gb -85.13.208.16 - 85.13.208.24 es -85.13.208.25 - 85.13.208.223 gb -85.13.208.224 - 85.13.208.224 es -85.13.208.225 - 85.13.210.47 gb -85.13.210.48 - 85.13.210.63 es -85.13.210.64 - 85.13.220.207 gb -85.13.220.208 - 85.13.220.211 es -85.13.220.212 - 85.13.222.159 gb -85.13.222.160 - 85.13.222.166 fr -85.13.222.167 - 85.13.226.151 gb -85.13.226.152 - 85.13.226.159 es -85.13.226.160 - 85.13.237.31 gb -85.13.237.32 - 85.13.237.47 es -85.13.237.48 - 85.13.237.111 gb -85.13.237.112 - 85.13.237.119 es -85.13.237.120 - 85.13.248.183 gb -85.13.248.184 - 85.13.248.191 es -85.13.248.192 - 85.13.255.255 gb +85.13.192.0 - 85.13.255.255 gb 85.14.0.0 - 85.14.63.255 bg 85.14.64.0 - 85.14.127.255 pl 85.14.128.0 - 85.14.191.255 fr -85.14.192.0 - 85.14.198.127 de -85.14.198.128 - 85.14.198.191 at -85.14.198.192 - 85.14.198.255 de -85.14.199.0 - 85.14.199.255 at -85.14.200.0 - 85.14.200.119 de -85.14.200.120 - 85.14.200.127 pl -85.14.200.128 - 85.14.200.159 de -85.14.200.160 - 85.14.200.167 gr -85.14.200.168 - 85.14.202.159 de +85.14.192.0 - 85.14.200.79 de +85.14.200.80 - 85.14.200.95 tw +85.14.200.96 - 85.14.202.159 de 85.14.202.160 - 85.14.202.167 at -85.14.202.168 - 85.14.203.127 de +85.14.202.168 - 85.14.203.23 de +85.14.203.24 - 85.14.203.31 tr +85.14.203.32 - 85.14.203.127 de 85.14.203.128 - 85.14.203.135 nl -85.14.203.136 - 85.14.212.255 de -85.14.213.0 - 85.14.213.127 gb -85.14.213.128 - 85.14.255.255 de +85.14.203.136 - 85.14.204.159 de +85.14.204.160 - 85.14.204.175 tw +85.14.204.176 - 85.14.255.255 de 85.15.0.0 - 85.15.63.255 ir 85.15.64.0 - 85.15.191.255 ru 85.15.192.0 - 85.15.255.255 lv 85.16.0.0 - 85.16.255.255 de -85.17.0.0 - 85.17.153.63 nl -85.17.153.64 - 85.17.153.127 be -85.17.153.128 - 85.17.193.255 nl -85.17.194.0 - 85.17.195.255 us -85.17.196.0 - 85.17.197.63 nl -85.17.197.64 - 85.17.197.71 gb -85.17.197.72 - 85.17.197.79 de -85.17.197.80 - 85.17.197.87 it -85.17.197.88 - 85.17.197.95 es -85.17.197.96 - 85.17.197.103 pl -85.17.197.104 - 85.17.197.111 ru -85.17.197.112 - 85.17.197.119 fr -85.17.197.120 - 85.17.255.255 nl +85.17.0.0 - 85.17.255.255 nl 85.18.0.0 - 85.18.255.255 it 85.19.0.0 - 85.19.255.255 no 85.20.0.0 - 85.20.255.255 it @@ -47499,246 +23627,35 @@ 85.23.0.0 - 85.23.255.255 fi 85.24.0.0 - 85.24.127.255 dk 85.24.128.0 - 85.24.255.255 se -85.25.0.0 - 85.25.84.127 de -85.25.84.128 - 85.25.84.255 li -85.25.85.0 - 85.25.103.255 de -85.25.104.0 - 85.25.104.31 br -85.25.104.32 - 85.25.104.63 ru -85.25.104.64 - 85.25.104.95 de -85.25.104.96 - 85.25.104.127 cy -85.25.104.128 - 85.25.104.159 br -85.25.104.160 - 85.25.104.191 de -85.25.104.192 - 85.25.104.255 br -85.25.105.0 - 85.25.105.31 cy -85.25.105.32 - 85.25.105.63 tr -85.25.105.64 - 85.25.105.95 ru -85.25.105.96 - 85.25.105.159 de -85.25.105.160 - 85.25.105.191 ru -85.25.105.192 - 85.25.105.255 cy -85.25.106.0 - 85.25.106.31 ru -85.25.106.32 - 85.25.106.63 us -85.25.106.64 - 85.25.106.95 ru -85.25.106.96 - 85.25.106.127 lt -85.25.106.128 - 85.25.106.159 gb -85.25.106.160 - 85.25.106.191 ca -85.25.106.192 - 85.25.106.223 de -85.25.106.224 - 85.25.106.255 br -85.25.107.0 - 85.25.107.63 de -85.25.107.64 - 85.25.107.127 in -85.25.107.128 - 85.25.107.159 de -85.25.107.160 - 85.25.107.191 gr -85.25.107.192 - 85.25.159.255 de -85.25.160.0 - 85.25.160.31 io -85.25.160.32 - 85.25.160.191 de -85.25.160.192 - 85.25.160.223 us -85.25.160.224 - 85.25.160.255 br -85.25.161.0 - 85.25.161.31 ru -85.25.161.32 - 85.25.161.63 us -85.25.161.64 - 85.25.161.95 br -85.25.161.96 - 85.25.161.127 cy -85.25.161.128 - 85.25.161.159 br -85.25.161.160 - 85.25.161.191 in -85.25.161.192 - 85.25.161.223 ru -85.25.161.224 - 85.25.161.255 tr -85.25.162.0 - 85.25.162.31 gr -85.25.162.32 - 85.25.162.63 de -85.25.162.64 - 85.25.162.95 br -85.25.162.96 - 85.25.162.127 nl -85.25.162.128 - 85.25.162.191 br -85.25.162.192 - 85.25.162.223 us -85.25.162.224 - 85.25.162.255 cy -85.25.163.0 - 85.25.163.31 de -85.25.163.32 - 85.25.163.63 br -85.25.163.64 - 85.25.163.95 de -85.25.163.96 - 85.25.163.127 lv -85.25.163.128 - 85.25.163.159 dk -85.25.163.160 - 85.25.163.191 br -85.25.163.192 - 85.25.163.223 ru -85.25.163.224 - 85.25.163.255 de -85.25.164.0 - 85.25.164.31 ma -85.25.164.32 - 85.25.164.63 za -85.25.164.64 - 85.25.164.95 br -85.25.164.96 - 85.25.164.127 ru -85.25.164.128 - 85.25.164.159 de -85.25.164.160 - 85.25.164.191 us -85.25.164.192 - 85.25.164.223 ru -85.25.164.224 - 85.25.164.255 us -85.25.165.0 - 85.25.165.31 at -85.25.165.32 - 85.25.165.63 ru -85.25.165.64 - 85.25.165.95 de -85.25.165.96 - 85.25.165.127 ma -85.25.165.128 - 85.25.165.159 pl -85.25.165.160 - 85.25.165.223 ru -85.25.165.224 - 85.25.165.255 de -85.25.166.0 - 85.25.166.31 us -85.25.166.32 - 85.25.166.63 tr -85.25.166.64 - 85.25.166.95 in -85.25.166.96 - 85.25.166.127 ua -85.25.166.128 - 85.25.166.159 pl -85.25.166.160 - 85.25.166.191 ua -85.25.166.192 - 85.25.166.223 us -85.25.166.224 - 85.25.166.255 de -85.25.167.0 - 85.25.167.31 us -85.25.167.32 - 85.25.167.63 de -85.25.167.64 - 85.25.167.95 pl -85.25.167.96 - 85.25.167.127 ma -85.25.167.128 - 85.25.167.159 tr -85.25.167.160 - 85.25.167.191 de -85.25.167.192 - 85.25.167.223 br -85.25.167.224 - 85.25.167.255 de -85.25.168.0 - 85.25.168.31 br -85.25.168.32 - 85.25.168.63 de -85.25.168.64 - 85.25.168.95 au -85.25.168.96 - 85.25.168.159 tr -85.25.168.160 - 85.25.168.191 hu -85.25.168.192 - 85.25.168.223 ru -85.25.168.224 - 85.25.168.255 dk -85.25.169.0 - 85.25.169.31 bm -85.25.169.32 - 85.25.169.63 us -85.25.169.64 - 85.25.169.95 ma -85.25.169.96 - 85.25.169.127 de -85.25.169.128 - 85.25.169.159 ro -85.25.169.160 - 85.25.169.191 ch -85.25.169.192 - 85.25.169.223 us -85.25.169.224 - 85.25.169.255 de -85.25.170.0 - 85.25.170.31 ma -85.25.170.32 - 85.25.170.63 th -85.25.170.64 - 85.25.170.95 ru -85.25.170.96 - 85.25.170.127 br -85.25.170.128 - 85.25.170.191 us -85.25.170.192 - 85.25.170.223 ro -85.25.170.224 - 85.25.170.255 ru -85.25.171.0 - 85.25.171.31 cn -85.25.171.32 - 85.25.171.63 ru -85.25.171.64 - 85.25.171.95 de -85.25.171.96 - 85.25.171.127 bm -85.25.171.128 - 85.25.171.159 cy -85.25.171.160 - 85.25.171.191 us -85.25.171.192 - 85.25.171.223 de -85.25.171.224 - 85.25.171.255 lt -85.25.172.0 - 85.25.172.31 fr -85.25.172.32 - 85.25.172.63 us -85.25.172.64 - 85.25.172.95 br -85.25.172.96 - 85.25.172.127 in -85.25.172.128 - 85.25.172.159 es -85.25.172.160 - 85.25.172.191 in -85.25.172.192 - 85.25.172.223 de -85.25.172.224 - 85.25.172.255 us -85.25.173.0 - 85.25.173.31 se -85.25.173.32 - 85.25.173.63 gb -85.25.173.64 - 85.25.173.95 de -85.25.173.96 - 85.25.173.127 gr -85.25.173.128 - 85.25.173.191 de -85.25.173.192 - 85.25.173.223 us -85.25.173.224 - 85.25.174.159 de -85.25.174.160 - 85.25.174.191 ma -85.25.174.192 - 85.25.179.255 de -85.25.180.0 - 85.25.180.31 fi -85.25.180.32 - 85.25.180.63 br -85.25.180.64 - 85.25.180.95 cy -85.25.180.96 - 85.25.180.127 us -85.25.180.128 - 85.25.180.159 au -85.25.180.160 - 85.25.180.191 br -85.25.180.192 - 85.25.180.223 de -85.25.180.224 - 85.25.180.255 us -85.25.181.0 - 85.25.181.31 br -85.25.181.32 - 85.25.181.63 de -85.25.181.64 - 85.25.181.95 gb -85.25.181.96 - 85.25.181.159 de -85.25.181.160 - 85.25.181.191 us -85.25.181.192 - 85.25.181.255 de -85.25.182.0 - 85.25.182.31 br -85.25.182.32 - 85.25.182.95 de -85.25.182.96 - 85.25.182.127 ru -85.25.182.128 - 85.25.182.191 ma -85.25.182.192 - 85.25.182.223 de -85.25.182.224 - 85.25.182.255 br -85.25.183.0 - 85.25.183.31 hu -85.25.183.32 - 85.25.183.63 gb -85.25.183.64 - 85.25.183.127 de -85.25.183.128 - 85.25.183.191 br -85.25.183.192 - 85.25.183.255 ma -85.25.184.0 - 85.25.186.95 de -85.25.186.96 - 85.25.186.127 br -85.25.186.128 - 85.25.186.159 de -85.25.186.160 - 85.25.186.191 ma -85.25.186.192 - 85.25.186.223 cy -85.25.186.224 - 85.25.186.255 au -85.25.187.0 - 85.25.187.31 ru -85.25.187.32 - 85.25.187.63 de -85.25.187.64 - 85.25.187.95 br -85.25.187.96 - 85.25.187.127 de -85.25.187.128 - 85.25.187.159 br -85.25.187.160 - 85.25.187.223 de -85.25.187.224 - 85.25.187.255 ru -85.25.188.0 - 85.25.188.31 br -85.25.188.32 - 85.25.188.63 us -85.25.188.64 - 85.25.188.95 br -85.25.188.96 - 85.25.188.191 de -85.25.188.192 - 85.25.188.223 bg -85.25.188.224 - 85.25.189.31 de -85.25.189.32 - 85.25.189.63 tr -85.25.189.64 - 85.25.189.95 de -85.25.189.96 - 85.25.189.127 us -85.25.189.128 - 85.25.189.159 gr -85.25.189.160 - 85.25.189.191 fr -85.25.189.192 - 85.25.189.223 us -85.25.189.224 - 85.25.192.255 de -85.25.193.0 - 85.25.193.255 nl -85.25.194.0 - 85.25.227.31 de -85.25.227.32 - 85.25.227.63 ma -85.25.227.64 - 85.25.227.95 hr -85.25.227.96 - 85.25.227.127 de -85.25.227.128 - 85.25.227.159 br -85.25.227.160 - 85.25.227.255 us -85.25.228.0 - 85.25.228.31 de -85.25.228.32 - 85.25.228.63 pl -85.25.228.64 - 85.25.228.127 us -85.25.228.128 - 85.25.228.191 br -85.25.228.192 - 85.25.228.223 tr -85.25.228.224 - 85.25.228.255 ru -85.25.229.0 - 85.25.229.31 in -85.25.229.32 - 85.25.229.63 us -85.25.229.64 - 85.25.229.191 de -85.25.229.192 - 85.25.229.223 ch -85.25.229.224 - 85.25.230.31 de -85.25.230.32 - 85.25.230.63 br -85.25.230.64 - 85.25.230.95 de -85.25.230.96 - 85.25.230.127 br -85.25.230.128 - 85.25.230.159 de -85.25.230.160 - 85.25.230.191 us -85.25.230.192 - 85.25.230.223 de -85.25.230.224 - 85.25.230.255 us -85.25.231.0 - 85.25.231.63 de -85.25.231.64 - 85.25.231.95 cz -85.25.231.96 - 85.25.231.127 bg -85.25.231.128 - 85.25.231.159 hr -85.25.231.160 - 85.25.231.191 cl -85.25.231.192 - 85.25.231.223 ch -85.25.231.224 - 85.25.231.255 tr -85.25.232.0 - 85.25.232.31 au -85.25.232.32 - 85.25.232.63 de -85.25.232.64 - 85.25.232.95 tr -85.25.232.96 - 85.25.232.127 us -85.25.232.128 - 85.25.232.159 ru -85.25.232.160 - 85.25.232.191 ua -85.25.232.192 - 85.25.232.223 cy -85.25.232.224 - 85.25.232.255 tw -85.25.233.0 - 85.25.233.31 ru -85.25.233.32 - 85.25.233.63 us -85.25.233.64 - 85.25.233.95 in -85.25.233.96 - 85.25.233.127 pl -85.25.233.128 - 85.25.233.159 us -85.25.233.160 - 85.25.233.191 ru -85.25.233.192 - 85.25.233.223 eg -85.25.233.224 - 85.25.233.255 tr -85.25.234.0 - 85.25.255.255 de +85.25.0.0 - 85.25.41.48 de +85.25.41.49 - 85.25.41.49 sg +85.25.41.50 - 85.25.41.113 de +85.25.41.114 - 85.25.41.117 sg +85.25.41.118 - 85.25.41.118 de +85.25.41.119 - 85.25.41.125 sg +85.25.41.126 - 85.25.41.126 de +85.25.41.127 - 85.25.41.132 sg +85.25.41.133 - 85.25.79.43 de +85.25.79.44 - 85.25.79.46 sg +85.25.79.47 - 85.25.79.47 de +85.25.79.48 - 85.25.79.49 sg +85.25.79.50 - 85.25.79.109 de +85.25.79.110 - 85.25.79.110 ee +85.25.79.111 - 85.25.102.216 de +85.25.102.217 - 85.25.102.228 sg +85.25.102.229 - 85.25.104.215 de +85.25.104.216 - 85.25.104.216 sk +85.25.104.217 - 85.25.154.188 de +85.25.154.189 - 85.25.154.189 at +85.25.154.190 - 85.25.255.255 de 85.26.0.0 - 85.26.127.255 be 85.26.128.0 - 85.26.255.255 ru 85.27.0.0 - 85.27.127.255 be 85.27.128.0 - 85.27.255.255 dk 85.28.0.0 - 85.28.63.255 ru -85.28.64.0 - 85.28.127.255 be +85.28.64.0 - 85.28.127.85 be +85.28.127.86 - 85.28.127.86 lu +85.28.127.87 - 85.28.127.255 be 85.28.128.0 - 85.28.191.255 pl 85.28.192.0 - 85.28.255.255 ru 85.29.0.0 - 85.29.63.255 tr @@ -47751,12 +23668,12 @@ 85.30.192.0 - 85.30.255.255 ru 85.31.0.0 - 85.31.31.255 at 85.31.32.0 - 85.31.63.255 gb -85.31.64.0 - 85.31.95.255 a2 +85.31.64.0 - 85.31.92.255 a2 +85.31.93.0 - 85.31.93.255 us +85.31.94.0 - 85.31.95.255 a2 85.31.96.0 - 85.31.103.255 lv 85.31.104.0 - 85.31.111.255 fr -85.31.112.0 - 85.31.124.255 ru -85.31.125.0 - 85.31.125.255 tr -85.31.126.0 - 85.31.127.255 ru +85.31.112.0 - 85.31.127.255 ru 85.31.128.0 - 85.31.135.255 es 85.31.136.0 - 85.31.143.255 gb 85.31.144.0 - 85.31.151.255 fr @@ -47764,26 +23681,12 @@ 85.31.160.0 - 85.31.167.255 it 85.31.168.0 - 85.31.175.255 gb 85.31.176.0 - 85.31.183.255 ru -85.31.184.0 - 85.31.188.159 de -85.31.188.160 - 85.31.188.175 ch -85.31.188.176 - 85.31.191.255 de -85.31.192.0 - 85.31.204.143 fr -85.31.204.144 - 85.31.204.151 gb -85.31.204.152 - 85.31.205.143 fr -85.31.205.144 - 85.31.205.159 gb -85.31.205.160 - 85.31.206.143 fr -85.31.206.144 - 85.31.206.159 us -85.31.206.160 - 85.31.207.207 fr -85.31.207.208 - 85.31.207.223 ch -85.31.207.224 - 85.31.216.215 fr -85.31.216.216 - 85.31.216.223 gb -85.31.216.224 - 85.31.217.135 fr -85.31.217.136 - 85.31.217.143 gb -85.31.217.144 - 85.31.219.191 fr -85.31.219.192 - 85.31.219.255 ch -85.31.220.0 - 85.31.223.255 fr +85.31.184.0 - 85.31.191.255 de +85.31.192.0 - 85.31.223.255 fr 85.31.224.0 - 85.31.255.255 pl -85.32.0.0 - 85.47.255.255 it +85.32.0.0 - 85.33.135.255 it +85.33.136.0 - 85.33.136.255 gb +85.33.137.0 - 85.47.255.255 it 85.48.0.0 - 85.63.255.255 es 85.64.0.0 - 85.65.255.255 il 85.66.0.0 - 85.67.255.255 hu @@ -47793,33 +23696,11 @@ 85.76.0.0 - 85.79.255.255 fi 85.80.0.0 - 85.83.255.255 dk 85.84.0.0 - 85.87.255.255 es -85.88.0.0 - 85.88.9.0 de -85.88.9.1 - 85.88.9.14 at -85.88.9.15 - 85.88.27.240 de -85.88.27.241 - 85.88.27.254 at -85.88.27.255 - 85.88.31.255 de -85.88.32.0 - 85.88.33.31 be -85.88.33.32 - 85.88.33.63 de -85.88.33.64 - 85.88.63.255 be +85.88.0.0 - 85.88.31.255 de +85.88.32.0 - 85.88.63.255 be 85.88.64.0 - 85.88.95.255 no 85.88.96.0 - 85.88.127.255 nl -85.88.128.0 - 85.88.132.71 pt -85.88.132.72 - 85.88.132.79 es -85.88.132.80 - 85.88.134.47 pt -85.88.134.48 - 85.88.134.55 es -85.88.134.56 - 85.88.134.103 pt -85.88.134.104 - 85.88.134.111 es -85.88.134.112 - 85.88.135.247 pt -85.88.135.248 - 85.88.135.255 es -85.88.136.0 - 85.88.137.31 pt -85.88.137.32 - 85.88.137.47 es -85.88.137.48 - 85.88.137.63 pt -85.88.137.64 - 85.88.137.79 es -85.88.137.80 - 85.88.140.79 pt -85.88.140.80 - 85.88.140.87 nl -85.88.140.88 - 85.88.140.111 pt -85.88.140.112 - 85.88.140.127 es -85.88.140.128 - 85.88.159.255 pt +85.88.128.0 - 85.88.159.255 pt 85.88.160.0 - 85.88.191.255 ru 85.88.192.0 - 85.88.223.255 it 85.88.224.0 - 85.88.255.255 gb @@ -47830,29 +23711,29 @@ 85.89.128.0 - 85.89.159.255 it 85.89.160.0 - 85.89.191.255 pl 85.89.192.0 - 85.89.223.255 no -85.89.224.0 - 85.89.255.255 dk +85.89.224.0 - 85.89.236.255 dk +85.89.237.0 - 85.89.237.255 eu +85.89.238.0 - 85.89.255.255 dk 85.90.0.0 - 85.90.31.255 ch 85.90.32.0 - 85.90.63.255 gb -85.90.64.0 - 85.90.69.215 nl -85.90.69.216 - 85.90.69.223 gb -85.90.69.224 - 85.90.72.119 nl -85.90.72.120 - 85.90.72.127 us -85.90.72.128 - 85.90.74.143 nl -85.90.74.144 - 85.90.74.151 de -85.90.74.152 - 85.90.74.175 nl +85.90.64.0 - 85.90.74.175 nl 85.90.74.176 - 85.90.74.183 sa 85.90.74.184 - 85.90.95.255 nl 85.90.96.0 - 85.90.127.255 ru 85.90.128.0 - 85.90.159.255 at 85.90.160.0 - 85.90.191.255 hu 85.90.192.0 - 85.90.223.255 ua -85.90.224.0 - 85.90.241.255 gb -85.90.242.0 - 85.90.242.15 bg -85.90.242.16 - 85.90.255.255 gb +85.90.224.0 - 85.90.243.255 gb +85.90.244.0 - 85.90.247.255 de +85.90.248.0 - 85.90.255.255 gb 85.91.0.0 - 85.91.31.255 ie 85.91.32.0 - 85.91.63.255 gb 85.91.64.0 - 85.91.95.255 es -85.91.96.0 - 85.91.127.255 ru +85.91.96.0 - 85.91.104.255 ru +85.91.105.0 - 85.91.105.255 ro +85.91.106.0 - 85.91.115.255 ru +85.91.116.0 - 85.91.117.255 ro +85.91.118.0 - 85.91.127.255 ru 85.91.128.0 - 85.91.159.255 bg 85.91.160.0 - 85.91.191.255 be 85.91.192.0 - 85.91.223.255 ru @@ -47860,67 +23741,16 @@ 85.92.0.0 - 85.92.31.255 ru 85.92.32.0 - 85.92.63.255 cz 85.92.64.0 - 85.92.95.255 gb -85.92.96.0 - 85.92.127.255 cy -85.92.128.0 - 85.92.152.23 nl -85.92.152.24 - 85.92.152.31 ph -85.92.152.32 - 85.92.152.95 nl -85.92.152.96 - 85.92.152.111 ph -85.92.152.112 - 85.92.152.127 nl -85.92.152.128 - 85.92.152.143 ph -85.92.152.144 - 85.92.152.159 nl -85.92.152.160 - 85.92.152.175 ph -85.92.152.176 - 85.92.152.191 nl -85.92.152.192 - 85.92.152.199 ph -85.92.152.200 - 85.92.153.47 nl -85.92.153.48 - 85.92.153.63 ph -85.92.153.64 - 85.92.153.79 nl -85.92.153.80 - 85.92.153.95 ph -85.92.153.96 - 85.92.153.111 nl -85.92.153.112 - 85.92.153.127 ph -85.92.153.128 - 85.92.153.159 nl -85.92.153.160 - 85.92.153.191 ph -85.92.153.192 - 85.92.154.175 nl -85.92.154.176 - 85.92.154.191 ph -85.92.154.192 - 85.92.154.207 nl -85.92.154.208 - 85.92.154.223 ph -85.92.154.224 - 85.92.154.255 nl -85.92.155.0 - 85.92.155.143 ph -85.92.155.144 - 85.92.155.159 nl -85.92.155.160 - 85.92.155.207 ph -85.92.155.208 - 85.92.156.31 nl -85.92.156.32 - 85.92.156.47 ph -85.92.156.48 - 85.92.156.63 nl -85.92.156.64 - 85.92.156.79 ph -85.92.156.80 - 85.92.156.207 nl -85.92.156.208 - 85.92.156.223 ph -85.92.156.224 - 85.92.157.31 nl -85.92.157.32 - 85.92.157.47 ph -85.92.157.48 - 85.92.157.63 nl -85.92.157.64 - 85.92.157.79 ph -85.92.157.80 - 85.92.157.175 nl -85.92.157.176 - 85.92.157.191 ph -85.92.157.192 - 85.92.158.31 nl -85.92.158.32 - 85.92.158.47 ph -85.92.158.48 - 85.92.158.79 nl -85.92.158.80 - 85.92.158.95 ph -85.92.158.96 - 85.92.158.207 nl -85.92.158.208 - 85.92.158.223 ph -85.92.158.224 - 85.92.159.79 nl -85.92.159.80 - 85.92.159.127 ph -85.92.159.128 - 85.92.159.167 nl -85.92.159.168 - 85.92.159.175 ph -85.92.159.176 - 85.92.159.255 nl +85.92.128.0 - 85.92.151.255 nl +85.92.152.0 - 85.92.159.255 us 85.92.160.0 - 85.92.223.255 gb 85.92.224.0 - 85.92.255.255 ba -85.93.0.0 - 85.93.4.79 de -85.93.4.80 - 85.93.4.89 us -85.93.4.90 - 85.93.5.255 de -85.93.6.0 - 85.93.6.127 pl -85.93.6.128 - 85.93.7.255 de -85.93.8.0 - 85.93.8.255 ch -85.93.9.0 - 85.93.27.127 de -85.93.27.128 - 85.93.27.255 pl -85.93.28.0 - 85.93.31.255 de +85.93.0.0 - 85.93.0.255 ro +85.93.1.0 - 85.93.1.255 de +85.93.2.0 - 85.93.2.255 lb +85.93.3.0 - 85.93.4.255 de +85.93.5.0 - 85.93.5.255 ae +85.93.6.0 - 85.93.31.255 de 85.93.32.0 - 85.93.63.255 ru 85.93.64.0 - 85.93.95.255 de 85.93.96.0 - 85.93.127.255 cz @@ -47942,21 +23772,7 @@ 85.95.128.0 - 85.95.191.255 ru 85.95.192.0 - 85.95.223.255 fr 85.95.224.0 - 85.111.255.255 tr -85.112.0.0 - 85.112.11.223 es -85.112.11.224 - 85.112.11.239 us -85.112.11.240 - 85.112.15.255 es -85.112.16.0 - 85.112.25.255 nl -85.112.26.0 - 85.112.27.255 us -85.112.28.0 - 85.112.29.255 es -85.112.30.0 - 85.112.30.255 us -85.112.31.0 - 85.112.31.15 es -85.112.31.16 - 85.112.31.47 tr -85.112.31.48 - 85.112.31.79 us -85.112.31.80 - 85.112.31.95 tr -85.112.31.96 - 85.112.31.111 es -85.112.31.112 - 85.112.31.127 tr -85.112.31.128 - 85.112.31.191 us -85.112.31.192 - 85.112.31.255 es +85.112.0.0 - 85.112.31.255 es 85.112.32.0 - 85.112.63.255 ru 85.112.64.0 - 85.112.95.255 lb 85.112.96.0 - 85.112.127.255 ru @@ -47980,19 +23796,19 @@ 85.114.160.0 - 85.114.191.255 ru 85.114.192.0 - 85.114.223.255 ua 85.114.224.0 - 85.114.255.255 ge -85.115.0.0 - 85.115.8.255 de -85.115.9.0 - 85.115.9.15 lu -85.115.9.16 - 85.115.31.255 de -85.115.32.0 - 85.115.34.255 gb -85.115.35.0 - 85.115.35.255 de -85.115.36.0 - 85.115.36.255 za -85.115.37.0 - 85.115.37.255 gb -85.115.38.0 - 85.115.39.255 ch +85.115.0.0 - 85.115.31.255 de +85.115.32.0 - 85.115.32.255 tr +85.115.33.0 - 85.115.33.255 nl +85.115.34.0 - 85.115.39.255 gb 85.115.40.0 - 85.115.47.255 us 85.115.48.0 - 85.115.55.255 gb -85.115.56.0 - 85.115.59.255 de -85.115.60.0 - 85.115.61.255 fr -85.115.62.0 - 85.115.63.255 gb +85.115.56.0 - 85.115.58.179 de +85.115.58.180 - 85.115.58.180 eu +85.115.58.181 - 85.115.59.255 de +85.115.60.0 - 85.115.60.255 fr +85.115.61.0 - 85.115.61.255 gb +85.115.62.0 - 85.115.62.255 it +85.115.63.0 - 85.115.63.255 gb 85.115.64.0 - 85.115.95.255 ae 85.115.96.0 - 85.115.127.255 lv 85.115.128.0 - 85.115.159.255 gi @@ -48010,34 +23826,21 @@ 85.117.0.0 - 85.117.31.255 pl 85.117.32.0 - 85.117.63.255 ge 85.117.64.0 - 85.117.95.255 ru -85.117.96.0 - 85.117.127.255 ee +85.117.96.0 - 85.117.127.255 kz 85.117.128.0 - 85.117.159.255 fr 85.117.160.0 - 85.117.223.255 se -85.117.224.0 - 85.117.255.255 uz 85.118.0.0 - 85.118.31.255 gb -85.118.32.0 - 85.118.38.255 fr -85.118.39.0 - 85.118.39.31 gb -85.118.39.32 - 85.118.39.63 be -85.118.39.64 - 85.118.39.95 it -85.118.39.96 - 85.118.39.127 nl -85.118.39.128 - 85.118.39.159 de -85.118.39.160 - 85.118.39.191 es -85.118.39.192 - 85.118.39.223 ch -85.118.39.224 - 85.118.63.255 fr +85.118.32.0 - 85.118.63.255 fr 85.118.64.0 - 85.118.95.255 bg 85.118.96.0 - 85.118.127.255 ge -85.118.128.0 - 85.118.143.255 ru +85.118.128.0 - 85.118.135.255 cz +85.118.136.0 - 85.118.143.255 ru 85.118.144.0 - 85.118.151.255 it 85.118.152.0 - 85.118.159.255 gb 85.118.160.0 - 85.118.167.255 de 85.118.168.0 - 85.118.175.255 gb 85.118.176.0 - 85.118.183.255 ru -85.118.184.0 - 85.118.184.31 se -85.118.184.32 - 85.118.184.63 nl -85.118.184.64 - 85.118.184.127 se -85.118.184.128 - 85.118.184.255 nl -85.118.185.0 - 85.118.185.15 rs -85.118.185.16 - 85.118.191.255 nl +85.118.184.0 - 85.118.191.255 hr 85.118.192.0 - 85.118.199.255 bg 85.118.200.0 - 85.118.207.255 se 85.118.208.0 - 85.118.215.255 be @@ -48046,32 +23849,12 @@ 85.118.232.0 - 85.118.239.255 gb 85.118.240.0 - 85.118.247.255 es 85.118.248.0 - 85.118.255.255 de -85.119.0.0 - 85.119.1.67 ch -85.119.1.68 - 85.119.1.71 us -85.119.1.72 - 85.119.1.119 ch -85.119.1.120 - 85.119.1.127 nl -85.119.1.128 - 85.119.1.159 ch -85.119.1.160 - 85.119.1.175 gb -85.119.1.176 - 85.119.2.95 ch -85.119.2.96 - 85.119.2.127 mc -85.119.2.128 - 85.119.3.63 ch -85.119.3.64 - 85.119.3.79 gb -85.119.3.80 - 85.119.3.143 ch -85.119.3.144 - 85.119.3.159 gb -85.119.3.160 - 85.119.3.183 ch -85.119.3.184 - 85.119.3.207 us -85.119.3.208 - 85.119.4.255 ch -85.119.5.0 - 85.119.5.63 us -85.119.5.64 - 85.119.7.255 ch +85.119.0.0 - 85.119.7.255 ch 85.119.8.0 - 85.119.15.255 hu -85.119.16.0 - 85.119.17.255 nl -85.119.18.0 - 85.119.18.255 gb -85.119.19.0 - 85.119.19.255 nl -85.119.20.0 - 85.119.20.31 gb -85.119.20.32 - 85.119.20.255 nl -85.119.21.0 - 85.119.21.127 gb -85.119.21.128 - 85.119.21.255 nl -85.119.22.0 - 85.119.31.255 gb +85.119.16.0 - 85.119.20.255 nl +85.119.21.0 - 85.119.21.255 gb +85.119.22.0 - 85.119.23.255 nl +85.119.24.0 - 85.119.31.255 gb 85.119.32.0 - 85.119.39.255 tr 85.119.40.0 - 85.119.47.255 it 85.119.48.0 - 85.119.55.255 nl @@ -48085,90 +23868,34 @@ 85.119.112.0 - 85.119.119.255 gb 85.119.120.0 - 85.119.127.255 mt 85.119.128.0 - 85.119.135.255 se -85.119.136.0 - 85.119.137.255 no -85.119.138.0 - 85.119.138.255 nl -85.119.139.0 - 85.119.143.255 no +85.119.136.0 - 85.119.143.255 no 85.119.144.0 - 85.119.151.255 ru 85.119.152.0 - 85.119.167.255 de 85.119.168.0 - 85.119.175.255 fr 85.119.176.0 - 85.119.183.255 it 85.119.184.0 - 85.119.191.255 be 85.119.192.0 - 85.119.199.255 es -85.119.200.0 - 85.119.202.19 nl -85.119.202.20 - 85.119.202.23 de -85.119.202.24 - 85.119.202.191 nl -85.119.202.192 - 85.119.206.255 de -85.119.207.0 - 85.119.207.255 nl -85.119.208.0 - 85.119.215.255 de +85.119.200.0 - 85.119.215.255 de 85.119.216.0 - 85.119.223.255 be 85.119.224.0 - 85.119.231.255 gb -85.119.232.0 - 85.119.239.255 ch -85.119.240.0 - 85.119.240.127 be -85.119.240.128 - 85.119.243.127 nl -85.119.243.128 - 85.119.247.255 be +85.119.232.0 - 85.119.232.199 ch +85.119.232.200 - 85.119.232.200 eu +85.119.232.201 - 85.119.239.255 ch +85.119.240.0 - 85.119.247.255 be 85.119.248.0 - 85.119.255.255 gb 85.120.0.0 - 85.123.255.255 ro 85.124.0.0 - 85.127.255.255 at 85.128.0.0 - 85.128.255.255 pl 85.129.0.0 - 85.129.127.255 dk 85.129.128.0 - 85.129.255.255 sa -85.130.0.0 - 85.130.127.255 bg +85.130.0.0 - 85.130.49.255 bg +85.130.50.0 - 85.130.51.255 mk +85.130.52.0 - 85.130.111.255 bg +85.130.112.0 - 85.130.119.255 mk +85.130.120.0 - 85.130.127.255 bg 85.130.128.0 - 85.130.255.255 il 85.131.0.0 - 85.131.127.255 fi -85.131.128.0 - 85.131.130.127 de -85.131.130.128 - 85.131.130.159 cy -85.131.130.160 - 85.131.130.255 nl -85.131.131.0 - 85.131.131.191 de -85.131.131.192 - 85.131.131.255 nl -85.131.132.0 - 85.131.134.239 de -85.131.134.240 - 85.131.134.255 nl -85.131.135.0 - 85.131.135.191 de -85.131.135.192 - 85.131.135.255 my -85.131.136.0 - 85.131.145.63 de -85.131.145.64 - 85.131.145.255 nl -85.131.146.0 - 85.131.149.255 de -85.131.150.0 - 85.131.150.255 nl -85.131.151.0 - 85.131.151.127 de -85.131.151.128 - 85.131.151.255 nl -85.131.152.0 - 85.131.152.159 de -85.131.152.160 - 85.131.152.191 nl -85.131.152.192 - 85.131.154.31 de -85.131.154.32 - 85.131.154.63 nl -85.131.154.64 - 85.131.154.95 de -85.131.154.96 - 85.131.154.127 nl -85.131.154.128 - 85.131.154.143 de -85.131.154.144 - 85.131.154.151 nl -85.131.154.152 - 85.131.154.207 de -85.131.154.208 - 85.131.154.223 nl -85.131.154.224 - 85.131.161.95 de -85.131.161.96 - 85.131.161.127 nl -85.131.161.128 - 85.131.161.159 de -85.131.161.160 - 85.131.161.223 nl -85.131.161.224 - 85.131.171.255 de -85.131.172.0 - 85.131.172.63 nl -85.131.172.64 - 85.131.179.255 de -85.131.180.0 - 85.131.180.63 nl -85.131.180.64 - 85.131.186.255 de -85.131.187.0 - 85.131.187.255 nl -85.131.188.0 - 85.131.196.127 de -85.131.196.128 - 85.131.196.255 nl -85.131.197.0 - 85.131.210.127 de -85.131.210.128 - 85.131.210.255 nl -85.131.211.0 - 85.131.211.63 de -85.131.211.64 - 85.131.211.79 nl -85.131.211.80 - 85.131.211.191 de -85.131.211.192 - 85.131.212.63 nl -85.131.212.64 - 85.131.212.127 de -85.131.212.128 - 85.131.212.191 nl -85.131.212.192 - 85.131.223.63 de -85.131.223.64 - 85.131.223.255 nl -85.131.224.0 - 85.131.239.255 de -85.131.240.0 - 85.131.241.255 nl -85.131.242.0 - 85.131.247.255 de -85.131.248.0 - 85.131.248.255 nl -85.131.249.0 - 85.131.251.127 de -85.131.251.128 - 85.131.251.143 nl -85.131.251.144 - 85.131.255.255 de +85.131.128.0 - 85.131.255.255 de 85.132.0.0 - 85.132.127.255 az 85.132.128.0 - 85.132.255.255 cz 85.133.0.0 - 85.133.127.255 gb @@ -48187,7 +23914,6 @@ 85.155.0.0 - 85.155.255.255 es 85.156.0.0 - 85.157.255.255 fi 85.158.0.0 - 85.158.7.255 de -85.158.8.0 - 85.158.15.255 gb 85.158.16.0 - 85.158.23.255 fr 85.158.24.0 - 85.158.31.255 ch 85.158.32.0 - 85.158.39.255 ba @@ -48201,41 +23927,30 @@ 85.158.104.0 - 85.158.111.255 be 85.158.112.0 - 85.158.127.255 fr 85.158.128.0 - 85.158.135.255 bh -85.158.136.0 - 85.158.136.255 nl -85.158.137.0 - 85.158.138.255 de -85.158.139.0 - 85.158.139.255 nl -85.158.140.0 - 85.158.141.255 gb -85.158.142.0 - 85.158.142.255 nl -85.158.143.0 - 85.158.143.255 gb +85.158.136.0 - 85.158.137.194 gb +85.158.137.195 - 85.158.137.195 eu +85.158.137.196 - 85.158.137.255 gb +85.158.138.0 - 85.158.138.255 de +85.158.139.0 - 85.158.139.255 eu +85.158.140.0 - 85.158.143.255 gb 85.158.144.0 - 85.158.151.255 az 85.158.152.0 - 85.158.159.255 gb 85.158.160.0 - 85.158.167.255 nl 85.158.168.0 - 85.158.175.255 es -85.158.176.0 - 85.158.183.255 de +85.158.176.0 - 85.158.180.255 de +85.158.181.0 - 85.158.181.255 at +85.158.182.0 - 85.158.183.255 de 85.158.184.0 - 85.158.191.255 ru 85.158.192.0 - 85.158.199.255 de 85.158.200.0 - 85.158.207.255 nl -85.158.208.0 - 85.158.208.255 be -85.158.209.0 - 85.158.209.63 nl -85.158.209.64 - 85.158.209.127 fr -85.158.209.128 - 85.158.209.191 be -85.158.209.192 - 85.158.209.255 br -85.158.210.0 - 85.158.215.255 be -85.158.216.0 - 85.158.216.255 ro -85.158.217.0 - 85.158.217.255 it -85.158.218.0 - 85.158.218.255 ro -85.158.219.0 - 85.158.219.255 it -85.158.220.0 - 85.158.223.255 ro +85.158.208.0 - 85.158.215.255 be +85.158.216.0 - 85.158.223.255 ro 85.158.224.0 - 85.158.231.255 at 85.158.232.0 - 85.158.239.255 ch 85.158.240.0 - 85.158.247.255 ru 85.158.248.0 - 85.158.255.255 nl 85.159.0.0 - 85.159.7.255 ua -85.159.8.0 - 85.159.15.47 de -85.159.15.48 - 85.159.15.63 at -85.159.15.64 - 85.159.15.199 de -85.159.15.200 - 85.159.15.207 at -85.159.15.208 - 85.159.15.255 de +85.159.8.0 - 85.159.15.255 de 85.159.16.0 - 85.159.23.255 ie 85.159.24.0 - 85.159.31.255 kz 85.159.32.0 - 85.159.47.255 ru @@ -48254,161 +23969,82 @@ 85.159.168.0 - 85.159.175.255 gb 85.159.176.0 - 85.159.183.255 it 85.159.184.0 - 85.159.191.255 gb -85.159.192.0 - 85.159.204.31 it -85.159.204.32 - 85.159.204.47 et -85.159.204.48 - 85.159.204.135 it -85.159.204.136 - 85.159.204.143 et -85.159.204.144 - 85.159.204.191 it -85.159.204.192 - 85.159.204.199 mo -85.159.204.200 - 85.159.207.255 it +85.159.192.0 - 85.159.200.255 it +85.159.201.0 - 85.159.201.255 ap +85.159.202.0 - 85.159.207.255 it 85.159.208.0 - 85.159.215.255 gb 85.159.216.0 - 85.159.223.255 jo 85.159.224.0 - 85.159.231.255 ru -85.159.232.0 - 85.159.236.203 nl -85.159.236.204 - 85.159.236.207 hk -85.159.236.208 - 85.159.239.255 nl +85.159.232.0 - 85.159.239.255 nl 85.159.240.0 - 85.159.247.255 de 85.159.248.0 - 85.159.255.255 gb -85.160.0.0 - 85.163.255.255 cz +85.160.0.0 - 85.161.255.255 cz +85.162.0.0 - 85.162.255.255 sk +85.163.0.0 - 85.163.0.0 cz +85.163.0.1 - 85.163.255.255 sk 85.164.0.0 - 85.167.255.255 no 85.168.0.0 - 85.171.255.255 fr 85.172.0.0 - 85.175.255.255 ru 85.176.0.0 - 85.183.255.255 de -85.184.0.0 - 85.184.19.255 nl -85.184.20.0 - 85.184.20.255 gb -85.184.21.0 - 85.184.21.255 se -85.184.22.0 - 85.184.22.255 be -85.184.23.0 - 85.184.79.255 nl -85.184.80.0 - 85.184.80.255 gb -85.184.81.0 - 85.184.255.255 nl +85.184.0.0 - 85.184.255.255 nl 85.185.0.0 - 85.185.255.255 ir 85.186.0.0 - 85.186.255.255 ro 85.187.0.0 - 85.187.255.255 bg 85.188.0.0 - 85.188.63.255 fi 85.188.64.0 - 85.188.191.255 se 85.188.192.0 - 85.189.255.255 gb -85.190.0.0 - 85.190.14.223 de -85.190.14.224 - 85.190.14.255 si -85.190.15.0 - 85.190.31.255 de -85.190.32.0 - 85.190.38.19 nl -85.190.38.20 - 85.190.38.23 de -85.190.38.24 - 85.190.39.151 nl -85.190.39.152 - 85.190.39.159 de -85.190.39.160 - 85.190.40.167 nl -85.190.40.168 - 85.190.40.255 de -85.190.41.0 - 85.190.45.3 nl -85.190.45.4 - 85.190.255.255 de -85.191.0.0 - 85.191.255.255 nl +85.190.0.0 - 85.190.150.255 de +85.190.151.0 - 85.190.151.255 br +85.190.152.0 - 85.190.153.255 us +85.190.154.0 - 85.190.155.255 de +85.190.156.0 - 85.190.156.255 us +85.190.157.0 - 85.190.175.255 de +85.190.176.0 - 85.190.183.255 us +85.190.184.0 - 85.190.255.255 de +85.191.0.0 - 85.191.127.255 nl +85.191.128.0 - 85.191.255.255 dk 85.192.0.0 - 85.192.63.255 ru 85.192.64.0 - 85.192.127.255 es 85.192.128.0 - 85.192.191.255 ru 85.192.192.0 - 85.192.255.255 fr 85.193.0.0 - 85.193.63.255 cz 85.193.64.0 - 85.193.127.255 ru -85.193.128.0 - 85.193.191.255 at +85.193.128.0 - 85.193.143.255 at +85.193.144.0 - 85.193.159.255 gb +85.193.160.0 - 85.193.191.255 at 85.193.192.0 - 85.193.255.255 pl 85.194.0.0 - 85.194.63.255 se 85.194.64.0 - 85.194.127.255 sa 85.194.128.0 - 85.194.191.255 se -85.194.192.0 - 85.194.255.255 fi +85.194.192.0 - 85.194.195.255 fi +85.194.196.0 - 85.194.199.255 iq +85.194.200.0 - 85.194.203.255 ee +85.194.204.0 - 85.194.239.255 fi +85.194.240.0 - 85.194.247.255 pl +85.194.248.0 - 85.194.251.255 iq +85.194.252.0 - 85.194.253.255 de +85.194.254.0 - 85.194.255.255 dk 85.195.0.0 - 85.195.63.255 se -85.195.64.0 - 85.195.67.255 de -85.195.68.0 - 85.195.68.127 us -85.195.68.128 - 85.195.73.255 de -85.195.74.0 - 85.195.74.255 ch -85.195.75.0 - 85.195.99.71 de -85.195.99.72 - 85.195.99.79 lt -85.195.99.80 - 85.195.104.87 de -85.195.104.88 - 85.195.104.91 ru -85.195.104.92 - 85.195.104.143 de -85.195.104.144 - 85.195.104.147 lv -85.195.104.148 - 85.195.104.151 us -85.195.104.152 - 85.195.104.159 ua -85.195.104.160 - 85.195.108.255 de -85.195.109.0 - 85.195.109.255 gb -85.195.110.0 - 85.195.118.31 de -85.195.118.32 - 85.195.118.39 pa -85.195.118.40 - 85.195.120.71 de -85.195.120.72 - 85.195.120.79 pa -85.195.120.80 - 85.195.124.63 de -85.195.124.64 - 85.195.124.71 ch -85.195.124.72 - 85.195.124.95 de -85.195.124.96 - 85.195.124.127 nl -85.195.124.128 - 85.195.124.135 de -85.195.124.136 - 85.195.124.143 pa -85.195.124.144 - 85.195.124.159 de -85.195.124.160 - 85.195.124.167 pa -85.195.124.168 - 85.195.124.175 de -85.195.124.176 - 85.195.124.231 pa -85.195.124.232 - 85.195.124.239 de -85.195.124.240 - 85.195.124.255 pa -85.195.125.0 - 85.195.127.255 de -85.195.128.0 - 85.195.129.255 ru -85.195.130.0 - 85.195.130.255 lt -85.195.131.0 - 85.195.132.255 ru +85.195.64.0 - 85.195.127.255 de +85.195.128.0 - 85.195.132.255 ru 85.195.133.0 - 85.195.133.255 iq -85.195.134.0 - 85.195.134.255 lt -85.195.135.0 - 85.195.135.255 ru -85.195.136.0 - 85.195.136.255 lt +85.195.134.0 - 85.195.136.255 ru 85.195.137.0 - 85.195.137.255 lb -85.195.138.0 - 85.195.138.255 iq -85.195.139.0 - 85.195.140.255 lb -85.195.141.0 - 85.195.141.255 iq -85.195.142.0 - 85.195.147.255 ru -85.195.148.0 - 85.195.151.255 lb -85.195.152.0 - 85.195.153.255 ru -85.195.154.0 - 85.195.154.255 lt -85.195.155.0 - 85.195.158.255 ru -85.195.159.0 - 85.195.159.255 am -85.195.160.0 - 85.195.161.255 ru -85.195.162.0 - 85.195.162.255 lb -85.195.163.0 - 85.195.163.255 iq -85.195.164.0 - 85.195.167.255 ru -85.195.168.0 - 85.195.184.255 lt -85.195.185.0 - 85.195.185.255 ru -85.195.186.0 - 85.195.186.255 iq -85.195.187.0 - 85.195.191.255 ru -85.195.192.0 - 85.195.204.255 ch -85.195.205.0 - 85.195.223.255 is -85.195.224.0 - 85.195.255.255 aq +85.195.138.0 - 85.195.167.255 ru +85.195.168.0 - 85.195.183.255 lt +85.195.184.0 - 85.195.191.255 ru +85.195.192.0 - 85.195.207.255 ch +85.195.208.0 - 85.195.223.255 aq +85.195.224.0 - 85.195.255.255 ch 85.196.0.0 - 85.196.63.255 gr 85.196.64.0 - 85.196.127.255 no 85.196.128.0 - 85.196.191.255 bg 85.196.192.0 - 85.196.255.255 ee -85.197.0.0 - 85.197.78.255 de -85.197.79.0 - 85.197.79.255 se -85.197.80.0 - 85.197.80.119 de -85.197.80.120 - 85.197.80.127 gb -85.197.80.128 - 85.197.80.187 de -85.197.80.188 - 85.197.80.191 se -85.197.80.192 - 85.197.81.63 de -85.197.81.64 - 85.197.81.71 gb -85.197.81.72 - 85.197.81.75 se -85.197.81.76 - 85.197.82.95 de -85.197.82.96 - 85.197.82.103 gb -85.197.82.104 - 85.197.82.123 de -85.197.82.124 - 85.197.82.127 se -85.197.82.128 - 85.197.83.199 de -85.197.83.200 - 85.197.83.207 gb -85.197.83.208 - 85.197.84.191 de -85.197.84.192 - 85.197.84.199 gb -85.197.84.200 - 85.197.96.169 de -85.197.96.170 - 85.197.96.202 nl -85.197.96.203 - 85.197.98.127 de -85.197.98.128 - 85.197.98.208 nl -85.197.98.209 - 85.197.98.212 de -85.197.98.213 - 85.197.98.255 nl -85.197.99.0 - 85.197.99.255 de -85.197.100.0 - 85.197.100.255 gb -85.197.101.0 - 85.197.103.255 de -85.197.104.0 - 85.197.104.255 nl -85.197.105.0 - 85.197.110.255 de +85.197.0.0 - 85.197.103.255 de +85.197.104.0 - 85.197.106.255 nl +85.197.107.0 - 85.197.110.255 de 85.197.111.0 - 85.197.111.255 nl -85.197.112.0 - 85.197.127.103 de -85.197.127.104 - 85.197.127.111 at -85.197.127.112 - 85.197.127.207 de -85.197.127.208 - 85.197.127.211 pl -85.197.127.212 - 85.197.127.255 de +85.197.112.0 - 85.197.127.255 de 85.197.128.0 - 85.197.191.255 se 85.197.192.0 - 85.197.255.255 is 85.198.0.0 - 85.198.63.255 ir @@ -48418,46 +24054,127 @@ 85.199.0.0 - 85.199.63.255 at 85.199.64.0 - 85.199.191.255 de 85.199.192.0 - 85.199.255.255 gb -85.200.0.0 - 85.200.255.255 no +85.200.0.0 - 85.200.239.255 no +85.200.240.0 - 85.200.240.255 au +85.200.241.0 - 85.200.255.255 no 85.201.0.0 - 85.201.255.255 be 85.202.0.0 - 85.202.15.255 ru 85.202.16.0 - 85.202.31.255 dk 85.202.32.0 - 85.202.63.255 pl 85.202.64.0 - 85.202.79.255 dk -85.202.80.0 - 85.202.95.255 ro 85.202.96.0 - 85.202.111.255 pl -85.202.112.0 - 85.202.143.255 ru +85.202.112.0 - 85.202.127.255 rs +85.202.128.0 - 85.202.143.255 ru 85.202.144.0 - 85.202.159.255 pl -85.202.160.0 - 85.202.175.255 ua 85.202.176.0 - 85.202.191.255 ru -85.202.192.0 - 85.202.207.255 ua 85.202.208.0 - 85.202.223.255 pl 85.202.224.0 - 85.202.255.255 ru -85.203.0.0 - 85.203.31.255 nl -85.203.32.0 - 85.203.63.255 de -85.203.64.0 - 85.203.255.255 nl -85.204.0.0 - 85.204.255.255 ro -85.205.0.0 - 85.205.34.255 de -85.205.35.0 - 85.205.35.255 gb -85.205.36.0 - 85.205.59.255 de +85.203.0.0 - 85.203.15.255 nl +85.203.16.0 - 85.203.16.255 cz +85.203.17.0 - 85.203.17.255 fr +85.203.18.0 - 85.203.18.255 se +85.203.19.0 - 85.203.19.255 tr +85.203.20.0 - 85.203.20.255 it +85.203.21.0 - 85.203.21.255 jp +85.203.22.0 - 85.203.22.15 mt +85.203.22.16 - 85.203.22.31 ad +85.203.22.32 - 85.203.22.47 cy +85.203.22.48 - 85.203.22.63 am +85.203.22.64 - 85.203.22.79 by +85.203.22.80 - 85.203.22.95 pk +85.203.22.96 - 85.203.22.111 cz +85.203.22.112 - 85.203.22.127 gr +85.203.22.128 - 85.203.22.143 is +85.203.22.144 - 85.203.22.159 im +85.203.22.160 - 85.203.22.175 je +85.203.22.176 - 85.203.22.191 rs +85.203.22.192 - 85.203.22.207 mk +85.203.22.208 - 85.203.22.208 mc +85.203.22.209 - 85.203.22.223 mt +85.203.22.224 - 85.203.22.239 me +85.203.22.240 - 85.203.22.240 sc +85.203.22.241 - 85.203.22.255 mt +85.203.23.0 - 85.203.23.255 it +85.203.24.0 - 85.203.24.255 ae +85.203.25.0 - 85.203.27.255 nl +85.203.28.0 - 85.203.31.255 it +85.203.32.0 - 85.203.32.255 es +85.203.33.0 - 85.203.33.255 kw +85.203.34.0 - 85.203.34.255 om +85.203.35.0 - 85.203.35.255 sa +85.203.36.0 - 85.203.39.255 cn +85.203.40.0 - 85.203.43.255 it +85.203.44.0 - 85.203.44.255 nl +85.203.45.0 - 85.203.45.255 ca +85.203.46.0 - 85.203.63.255 nl +85.203.64.0 - 85.203.127.255 fr +85.203.128.0 - 85.203.255.255 dk +85.204.0.0 - 85.204.19.255 ro +85.204.20.0 - 85.204.21.255 fr +85.204.22.0 - 85.204.23.255 ro +85.204.24.0 - 85.204.25.255 fr +85.204.26.0 - 85.204.26.255 ro +85.204.27.0 - 85.204.27.255 pl +85.204.28.0 - 85.204.29.255 ro +85.204.30.0 - 85.204.31.255 ir +85.204.32.0 - 85.204.35.255 ro +85.204.36.0 - 85.204.39.255 es +85.204.40.0 - 85.204.53.255 ro +85.204.54.0 - 85.204.55.255 de +85.204.56.0 - 85.204.73.255 ro +85.204.74.0 - 85.204.74.255 lt +85.204.75.0 - 85.204.75.255 ro +85.204.76.0 - 85.204.77.255 ir +85.204.78.0 - 85.204.79.255 ro +85.204.80.0 - 85.204.95.255 ir +85.204.96.0 - 85.204.97.255 de +85.204.98.0 - 85.204.103.255 ro +85.204.104.0 - 85.204.105.255 ir +85.204.106.0 - 85.204.108.255 ro +85.204.109.0 - 85.204.109.255 md +85.204.110.0 - 85.204.116.255 ro +85.204.117.0 - 85.204.117.255 md +85.204.118.0 - 85.204.119.255 ro +85.204.120.0 - 85.204.121.255 dk +85.204.122.0 - 85.204.131.255 ro +85.204.132.0 - 85.204.133.255 dk +85.204.134.0 - 85.204.135.255 ro +85.204.136.0 - 85.204.137.255 dk +85.204.138.0 - 85.204.139.255 ro +85.204.140.0 - 85.204.143.255 es +85.204.144.0 - 85.204.167.255 ro +85.204.168.0 - 85.204.168.255 in +85.204.169.0 - 85.204.171.255 ro +85.204.172.0 - 85.204.175.255 in +85.204.176.0 - 85.204.183.255 md +85.204.184.0 - 85.204.193.255 ro +85.204.194.0 - 85.204.195.255 dk +85.204.196.0 - 85.204.199.255 ro +85.204.200.0 - 85.204.207.255 es +85.204.208.0 - 85.204.223.255 ir +85.204.224.0 - 85.204.244.255 ro +85.204.245.0 - 85.204.245.255 gb +85.204.246.0 - 85.204.250.255 ro +85.204.251.0 - 85.204.251.255 gb +85.204.252.0 - 85.204.255.255 ro +85.205.0.0 - 85.205.59.255 de 85.205.60.0 - 85.205.63.255 gb 85.205.64.0 - 85.205.71.255 it 85.205.72.0 - 85.205.77.255 de 85.205.78.0 - 85.205.79.255 it 85.205.80.0 - 85.205.115.255 de 85.205.116.0 - 85.205.119.255 gb -85.205.120.0 - 85.205.123.255 de +85.205.120.0 - 85.205.122.127 de +85.205.122.128 - 85.205.123.255 gb 85.205.124.0 - 85.205.124.255 eg -85.205.125.0 - 85.205.125.255 gb -85.205.126.0 - 85.205.139.255 de +85.205.125.0 - 85.205.139.255 de 85.205.140.0 - 85.205.143.255 gb 85.205.144.0 - 85.205.147.255 it -85.205.148.0 - 85.205.151.255 gb +85.205.148.0 - 85.205.151.255 de 85.205.152.0 - 85.205.155.255 it 85.205.156.0 - 85.205.157.255 gb 85.205.158.0 - 85.205.159.255 it -85.205.160.0 - 85.205.175.255 de -85.205.176.0 - 85.205.199.255 gb +85.205.160.0 - 85.205.199.255 de 85.205.200.0 - 85.205.207.255 it 85.205.208.0 - 85.205.225.255 de 85.205.226.0 - 85.205.227.255 it @@ -48477,9 +24194,7 @@ 85.207.0.0 - 85.207.255.255 cz 85.208.0.0 - 85.209.255.255 sa 85.210.0.0 - 85.211.255.255 gb -85.212.0.0 - 85.215.199.255 de -85.215.200.0 - 85.215.239.255 eu -85.215.240.0 - 85.216.127.255 de +85.212.0.0 - 85.216.127.255 de 85.216.128.0 - 85.216.255.255 sk 85.217.0.0 - 85.217.127.255 fi 85.217.128.0 - 85.217.255.255 bg @@ -48491,8 +24206,13 @@ 85.220.128.0 - 85.220.255.255 de 85.221.0.0 - 85.221.127.255 no 85.221.128.0 - 85.222.127.255 pl -85.222.128.0 - 85.222.255.255 rs -85.223.0.0 - 85.223.127.255 nl +85.222.128.0 - 85.222.159.255 gb +85.222.160.0 - 85.222.199.255 rs +85.222.200.0 - 85.222.207.255 fr +85.222.208.0 - 85.222.223.255 de +85.222.224.0 - 85.222.231.255 nl +85.222.232.0 - 85.222.235.255 ee +85.222.236.0 - 85.223.127.255 nl 85.223.128.0 - 85.223.255.255 ua 85.224.0.0 - 85.231.255.255 se 85.232.0.0 - 85.232.31.255 de @@ -48502,35 +24222,13 @@ 85.232.128.0 - 85.232.159.255 lt 85.232.160.0 - 85.232.191.255 se 85.232.192.0 - 85.232.223.255 mt -85.232.224.0 - 85.232.226.191 pl -85.232.226.192 - 85.232.226.207 us -85.232.226.208 - 85.232.255.255 pl +85.232.224.0 - 85.232.255.255 pl 85.233.0.0 - 85.233.63.255 de 85.233.64.0 - 85.233.95.255 ru 85.233.96.0 - 85.233.127.255 at 85.233.128.0 - 85.233.159.255 ru 85.233.160.0 - 85.233.191.255 gb -85.233.192.0 - 85.233.200.63 fr -85.233.200.64 - 85.233.200.95 us -85.233.200.96 - 85.233.200.143 fr -85.233.200.144 - 85.233.200.151 au -85.233.200.152 - 85.233.206.127 fr -85.233.206.128 - 85.233.206.255 il -85.233.207.0 - 85.233.211.255 fr -85.233.212.0 - 85.233.212.127 us -85.233.212.128 - 85.233.216.127 fr -85.233.216.128 - 85.233.216.255 ca -85.233.217.0 - 85.233.217.255 fr -85.233.218.0 - 85.233.218.63 ie -85.233.218.64 - 85.233.218.167 fr -85.233.218.168 - 85.233.218.175 lu -85.233.218.176 - 85.233.219.255 fr -85.233.220.0 - 85.233.220.31 lu -85.233.220.32 - 85.233.221.143 fr -85.233.221.144 - 85.233.221.159 ca -85.233.221.160 - 85.233.223.47 fr -85.233.223.48 - 85.233.223.63 ca -85.233.223.64 - 85.233.223.255 fr +85.233.192.0 - 85.233.223.255 fr 85.233.224.0 - 85.233.255.255 dk 85.234.0.0 - 85.234.63.255 ru 85.234.64.0 - 85.234.95.255 gb @@ -48539,96 +24237,61 @@ 85.234.160.0 - 85.234.191.255 lv 85.234.192.0 - 85.234.223.255 be 85.234.224.0 - 85.234.255.255 nl -85.235.0.0 - 85.235.16.255 se -85.235.17.0 - 85.235.24.255 dk -85.235.25.0 - 85.235.31.255 se +85.235.0.0 - 85.235.31.255 se 85.235.32.0 - 85.235.63.255 ru 85.235.64.0 - 85.235.95.255 tr -85.235.96.0 - 85.235.108.255 gb -85.235.109.0 - 85.235.109.255 be -85.235.110.0 - 85.235.127.255 gb +85.235.96.0 - 85.235.127.255 gb 85.235.128.0 - 85.235.159.255 it 85.235.160.0 - 85.235.223.255 ru 85.235.224.0 - 85.235.255.255 dk 85.236.0.0 - 85.236.31.255 ru -85.236.32.0 - 85.236.51.239 de -85.236.51.240 - 85.236.51.255 li -85.236.52.0 - 85.236.53.143 de -85.236.53.144 - 85.236.53.159 ch -85.236.53.160 - 85.236.53.175 hr -85.236.53.176 - 85.236.55.127 de -85.236.55.128 - 85.236.55.191 tr -85.236.55.192 - 85.236.61.63 de -85.236.61.64 - 85.236.61.127 at -85.236.61.128 - 85.236.63.255 de +85.236.32.0 - 85.236.63.255 de 85.236.64.0 - 85.236.95.255 dk -85.236.96.0 - 85.236.96.255 gb -85.236.97.0 - 85.236.97.255 nl -85.236.98.0 - 85.236.98.255 gb -85.236.99.0 - 85.236.99.255 de -85.236.100.0 - 85.236.104.255 gb -85.236.105.0 - 85.236.105.255 de -85.236.106.0 - 85.236.108.255 gb -85.236.109.0 - 85.236.109.255 nl -85.236.110.0 - 85.236.127.255 gb -85.236.128.0 - 85.236.135.255 iq -85.236.136.0 - 85.236.143.255 pk -85.236.144.0 - 85.236.159.255 ir +85.236.96.0 - 85.236.105.255 gb +85.236.106.0 - 85.236.107.255 se +85.236.108.0 - 85.236.135.255 gb +85.236.136.0 - 85.236.143.255 nl +85.236.144.0 - 85.236.151.255 gb +85.236.152.0 - 85.236.159.255 fr 85.236.160.0 - 85.236.191.255 ru -85.236.192.0 - 85.236.207.127 de -85.236.207.128 - 85.236.207.255 us -85.236.208.0 - 85.236.220.255 de -85.236.221.0 - 85.236.221.255 us -85.236.222.0 - 85.236.223.255 de -85.236.224.0 - 85.236.253.255 at -85.236.254.0 - 85.236.254.255 de -85.236.255.0 - 85.237.31.255 at +85.236.192.0 - 85.236.223.255 de +85.236.224.0 - 85.237.31.255 at 85.237.32.0 - 85.237.63.255 ru 85.237.64.0 - 85.237.95.255 de -85.237.96.0 - 85.237.97.47 fr -85.237.97.48 - 85.237.97.63 es -85.237.97.64 - 85.237.97.183 fr -85.237.97.184 - 85.237.97.187 es -85.237.97.188 - 85.237.98.255 fr -85.237.99.0 - 85.237.99.31 es -85.237.99.32 - 85.237.99.159 fr -85.237.99.160 - 85.237.99.191 pt -85.237.99.192 - 85.237.127.255 fr +85.237.96.0 - 85.237.127.255 fr 85.237.128.0 - 85.237.159.255 sa 85.237.160.0 - 85.237.191.255 pl -85.237.192.0 - 85.237.223.255 gb +85.237.192.0 - 85.237.196.255 gb +85.237.197.0 - 85.237.197.255 a1 +85.237.198.0 - 85.237.218.255 gb +85.237.219.0 - 85.237.219.255 ca +85.237.220.0 - 85.237.221.255 gb +85.237.222.0 - 85.237.222.255 a1 +85.237.223.0 - 85.237.223.255 gb 85.237.224.0 - 85.237.255.255 sk 85.238.0.0 - 85.238.31.255 es 85.238.32.0 - 85.238.63.255 ge 85.238.64.0 - 85.238.95.255 hu 85.238.96.0 - 85.238.127.255 ua 85.238.128.0 - 85.238.131.255 br -85.238.132.0 - 85.238.135.255 de -85.238.136.0 - 85.238.139.255 us -85.238.140.0 - 85.238.143.255 sg +85.238.132.0 - 85.238.139.255 de +85.238.140.0 - 85.238.140.255 ap +85.238.141.0 - 85.238.143.255 sg 85.238.144.0 - 85.238.147.255 us 85.238.148.0 - 85.238.159.255 de 85.238.160.0 - 85.238.191.255 at 85.238.192.0 - 85.238.223.255 se 85.238.224.0 - 85.238.255.255 de -85.239.0.0 - 85.239.9.255 kw -85.239.10.0 - 85.239.11.255 sg -85.239.12.0 - 85.239.31.255 kw +85.239.0.0 - 85.239.31.255 kw 85.239.32.0 - 85.239.63.255 ru 85.239.64.0 - 85.239.95.255 cz 85.239.96.0 - 85.239.127.255 de 85.239.128.0 - 85.239.159.255 bg 85.239.160.0 - 85.239.191.255 it -85.239.192.0 - 85.239.223.255 es +85.239.192.0 - 85.239.223.255 ir 85.239.224.0 - 85.239.255.255 cz 85.240.0.0 - 85.247.255.255 pt -85.248.0.0 - 85.248.1.39 sk -85.248.1.40 - 85.248.1.47 de -85.248.1.48 - 85.248.20.47 sk -85.248.20.48 - 85.248.20.55 de -85.248.20.56 - 85.248.64.255 sk -85.248.65.0 - 85.248.65.127 be -85.248.65.128 - 85.248.255.255 sk +85.248.0.0 - 85.248.255.255 sk 85.249.0.0 - 85.249.255.255 ru 85.250.0.0 - 85.250.255.255 il 85.251.0.0 - 85.251.255.255 es @@ -48640,9 +24303,8 @@ 85.255.32.0 - 85.255.47.255 no 85.255.48.0 - 85.255.63.255 lt 85.255.64.0 - 85.255.79.255 lv -85.255.80.0 - 85.255.95.255 de 85.255.96.0 - 85.255.111.255 lt -85.255.112.0 - 85.255.127.255 ua +85.255.112.0 - 85.255.127.255 ro 85.255.128.0 - 85.255.143.255 bg 85.255.144.0 - 85.255.159.255 at 85.255.160.0 - 85.255.175.255 bg @@ -48657,56 +24319,7 @@ 86.34.0.0 - 86.35.255.255 ro 86.36.0.0 - 86.37.255.255 qa 86.38.0.0 - 86.38.255.255 lt -86.39.0.0 - 86.39.127.255 be -86.39.128.0 - 86.39.128.63 nl -86.39.128.64 - 86.39.132.31 be -86.39.132.32 - 86.39.135.255 nl -86.39.136.0 - 86.39.137.95 be -86.39.137.96 - 86.39.137.127 nl -86.39.137.128 - 86.39.137.255 be -86.39.138.0 - 86.39.145.255 nl -86.39.146.0 - 86.39.146.31 be -86.39.146.32 - 86.39.146.255 nl -86.39.147.0 - 86.39.148.31 be -86.39.148.32 - 86.39.148.159 nl -86.39.148.160 - 86.39.148.191 be -86.39.148.192 - 86.39.152.3 nl -86.39.152.4 - 86.39.152.7 be -86.39.152.8 - 86.39.152.31 nl -86.39.152.32 - 86.39.152.39 be -86.39.152.40 - 86.39.154.63 nl -86.39.154.64 - 86.39.154.95 be -86.39.154.96 - 86.39.155.127 nl -86.39.155.128 - 86.39.155.255 be -86.39.156.0 - 86.39.156.47 nl -86.39.156.48 - 86.39.156.95 be -86.39.156.96 - 86.39.157.127 nl -86.39.157.128 - 86.39.157.191 be -86.39.157.192 - 86.39.157.223 nl -86.39.157.224 - 86.39.157.255 be -86.39.158.0 - 86.39.158.31 nl -86.39.158.32 - 86.39.158.254 be -86.39.158.255 - 86.39.159.127 nl -86.39.159.128 - 86.39.159.135 be -86.39.159.136 - 86.39.159.255 nl -86.39.160.0 - 86.39.160.255 be -86.39.161.0 - 86.39.161.15 nl -86.39.161.16 - 86.39.161.47 be -86.39.161.48 - 86.39.161.127 nl -86.39.161.128 - 86.39.163.63 be -86.39.163.64 - 86.39.169.255 nl -86.39.170.0 - 86.39.170.255 be -86.39.171.0 - 86.39.179.255 nl -86.39.180.0 - 86.39.182.255 be -86.39.183.0 - 86.39.189.255 nl -86.39.190.0 - 86.39.192.223 be -86.39.192.224 - 86.39.199.255 nl -86.39.200.0 - 86.39.214.255 be -86.39.215.0 - 86.39.215.127 nl -86.39.215.128 - 86.39.232.254 be -86.39.232.255 - 86.39.232.255 nl -86.39.233.0 - 86.39.240.255 be -86.39.241.0 - 86.39.255.255 nl +86.39.0.0 - 86.39.255.255 be 86.40.0.0 - 86.47.255.255 ie 86.48.0.0 - 86.48.255.255 dk 86.49.0.0 - 86.49.255.255 cz @@ -48714,848 +24327,195 @@ 86.51.0.0 - 86.51.255.255 sa 86.52.0.0 - 86.52.255.255 dk 86.53.0.0 - 86.54.255.255 gb -86.55.0.0 - 86.55.255.255 ro +86.55.0.0 - 86.55.255.255 ir 86.56.0.0 - 86.56.127.255 de 86.56.128.0 - 86.56.255.255 at 86.57.0.0 - 86.57.127.255 ir 86.57.128.0 - 86.57.255.255 by 86.58.0.0 - 86.58.127.255 si -86.58.128.0 - 86.58.143.135 dk -86.58.143.136 - 86.58.143.139 us -86.58.143.140 - 86.58.206.143 dk -86.58.206.144 - 86.58.206.159 se -86.58.206.160 - 86.58.206.191 dk -86.58.206.192 - 86.58.206.207 no -86.58.206.208 - 86.58.206.223 gb -86.58.206.224 - 86.58.206.239 th -86.58.206.240 - 86.58.206.255 br -86.58.207.0 - 86.58.255.231 dk -86.58.255.232 - 86.58.255.235 no -86.58.255.236 - 86.58.255.239 fi -86.58.255.240 - 86.58.255.255 dk -86.59.0.0 - 86.59.14.15 at -86.59.14.16 - 86.59.14.31 mt -86.59.14.32 - 86.59.14.103 at -86.59.14.104 - 86.59.14.111 mt -86.59.14.112 - 86.59.14.119 at -86.59.14.120 - 86.59.14.127 mt -86.59.14.128 - 86.59.21.207 at -86.59.21.208 - 86.59.21.215 de -86.59.21.216 - 86.59.35.239 at -86.59.35.240 - 86.59.35.247 mt -86.59.35.248 - 86.59.114.119 at -86.59.114.120 - 86.59.114.127 us -86.59.114.128 - 86.59.127.255 at -86.59.128.0 - 86.59.255.255 ru +86.58.128.0 - 86.58.243.255 dk +86.58.244.0 - 86.58.247.255 es +86.58.248.0 - 86.58.255.255 dk +86.59.0.0 - 86.59.127.255 at +86.59.128.0 - 86.59.255.255 hu 86.60.0.0 - 86.60.127.255 sa 86.60.128.0 - 86.60.255.255 fi -86.61.0.0 - 86.61.92.255 si -86.61.93.0 - 86.61.94.255 hr -86.61.95.0 - 86.61.127.255 si +86.61.0.0 - 86.61.127.255 si 86.61.128.0 - 86.61.255.255 cz -86.62.0.0 - 86.62.0.255 a2 -86.62.1.0 - 86.62.1.7 cy -86.62.1.8 - 86.62.1.15 ly -86.62.1.16 - 86.62.1.23 af -86.62.1.24 - 86.62.1.31 bf -86.62.1.32 - 86.62.1.39 sd -86.62.1.40 - 86.62.1.47 iq -86.62.1.48 - 86.62.1.55 gn -86.62.1.56 - 86.62.1.63 iq -86.62.1.64 - 86.62.1.71 a2 -86.62.1.72 - 86.62.1.79 ly -86.62.1.80 - 86.62.1.87 er -86.62.1.88 - 86.62.1.167 a2 -86.62.1.168 - 86.62.1.175 iq -86.62.1.176 - 86.62.1.183 a2 -86.62.1.184 - 86.62.1.191 af -86.62.1.192 - 86.62.1.199 cy -86.62.1.200 - 86.62.1.255 a2 -86.62.2.0 - 86.62.2.15 ae -86.62.2.16 - 86.62.2.31 a2 -86.62.2.32 - 86.62.2.47 ae -86.62.2.48 - 86.62.2.63 iq -86.62.2.64 - 86.62.2.79 a2 -86.62.2.80 - 86.62.2.95 iq -86.62.2.96 - 86.62.2.255 a2 -86.62.3.0 - 86.62.3.15 sd -86.62.3.16 - 86.62.3.23 af -86.62.3.24 - 86.62.3.31 a2 -86.62.3.32 - 86.62.3.47 sd -86.62.3.48 - 86.62.3.63 a2 -86.62.3.64 - 86.62.3.103 iq -86.62.3.104 - 86.62.3.175 a2 -86.62.3.176 - 86.62.3.183 ng -86.62.3.184 - 86.62.3.223 a2 -86.62.3.224 - 86.62.3.231 sd -86.62.3.232 - 86.62.3.255 a2 -86.62.4.0 - 86.62.4.3 ly -86.62.4.4 - 86.62.4.11 iq -86.62.4.12 - 86.62.4.15 cg -86.62.4.16 - 86.62.4.19 af -86.62.4.20 - 86.62.4.23 ly -86.62.4.24 - 86.62.4.27 iq -86.62.4.28 - 86.62.4.35 ly -86.62.4.36 - 86.62.4.39 iq -86.62.4.40 - 86.62.4.47 a2 -86.62.4.48 - 86.62.4.51 iq -86.62.4.52 - 86.62.4.55 af -86.62.4.56 - 86.62.4.63 iq -86.62.4.64 - 86.62.4.67 ly -86.62.4.68 - 86.62.4.71 a2 -86.62.4.72 - 86.62.4.75 af -86.62.4.76 - 86.62.4.87 a2 -86.62.4.88 - 86.62.4.91 ly -86.62.4.92 - 86.62.4.95 af -86.62.4.96 - 86.62.4.99 td -86.62.4.100 - 86.62.4.103 a2 -86.62.4.104 - 86.62.4.107 ao -86.62.4.108 - 86.62.4.111 ly -86.62.4.112 - 86.62.4.115 iq -86.62.4.116 - 86.62.4.119 ly -86.62.4.120 - 86.62.4.123 af -86.62.4.124 - 86.62.4.127 a2 -86.62.4.128 - 86.62.4.131 iq -86.62.4.132 - 86.62.4.135 td -86.62.4.136 - 86.62.4.139 a2 -86.62.4.140 - 86.62.4.143 ly -86.62.4.144 - 86.62.4.147 cg -86.62.4.148 - 86.62.4.151 tg -86.62.4.152 - 86.62.4.159 ly -86.62.4.160 - 86.62.4.163 iq -86.62.4.164 - 86.62.4.171 a2 -86.62.4.172 - 86.62.4.175 ng -86.62.4.176 - 86.62.4.179 a2 -86.62.4.180 - 86.62.4.183 af -86.62.4.184 - 86.62.4.187 ng -86.62.4.188 - 86.62.4.191 ly -86.62.4.192 - 86.62.4.195 a2 -86.62.4.196 - 86.62.4.199 iq -86.62.4.200 - 86.62.4.203 ly -86.62.4.204 - 86.62.4.207 iq -86.62.4.208 - 86.62.4.211 af -86.62.4.212 - 86.62.4.215 iq -86.62.4.216 - 86.62.4.219 ly -86.62.4.220 - 86.62.4.227 iq -86.62.4.228 - 86.62.4.235 ng -86.62.4.236 - 86.62.4.239 a2 -86.62.4.240 - 86.62.4.243 ng -86.62.4.244 - 86.62.4.251 a2 -86.62.4.252 - 86.62.5.7 af -86.62.5.8 - 86.62.5.11 ly -86.62.5.12 - 86.62.5.15 iq -86.62.5.16 - 86.62.5.23 ly -86.62.5.24 - 86.62.5.27 ng -86.62.5.28 - 86.62.5.31 sd -86.62.5.32 - 86.62.5.35 a2 -86.62.5.36 - 86.62.5.39 af -86.62.5.40 - 86.62.5.43 iq -86.62.5.44 - 86.62.5.51 ly -86.62.5.52 - 86.62.5.59 iq -86.62.5.60 - 86.62.5.63 a2 -86.62.5.64 - 86.62.5.71 iq -86.62.5.72 - 86.62.5.75 a2 -86.62.5.76 - 86.62.5.83 ly -86.62.5.84 - 86.62.5.87 a2 -86.62.5.88 - 86.62.5.91 af -86.62.5.92 - 86.62.5.95 ly -86.62.5.96 - 86.62.5.103 a2 -86.62.5.104 - 86.62.5.107 ly -86.62.5.108 - 86.62.5.111 af -86.62.5.112 - 86.62.5.115 a2 -86.62.5.116 - 86.62.5.119 af -86.62.5.120 - 86.62.5.123 er -86.62.5.124 - 86.62.5.127 af -86.62.5.128 - 86.62.5.131 ly -86.62.5.132 - 86.62.5.135 iq -86.62.5.136 - 86.62.5.139 ly -86.62.5.140 - 86.62.5.147 ng -86.62.5.148 - 86.62.5.151 a2 -86.62.5.152 - 86.62.5.155 iq -86.62.5.156 - 86.62.5.159 af -86.62.5.160 - 86.62.5.163 a2 -86.62.5.164 - 86.62.5.167 ly -86.62.5.168 - 86.62.5.171 a2 -86.62.5.172 - 86.62.5.175 iq -86.62.5.176 - 86.62.5.183 a2 -86.62.5.184 - 86.62.5.199 iq -86.62.5.200 - 86.62.5.207 ly -86.62.5.208 - 86.62.5.215 iq -86.62.5.216 - 86.62.5.219 cf -86.62.5.220 - 86.62.5.223 iq -86.62.5.224 - 86.62.5.227 eg -86.62.5.228 - 86.62.5.231 ng -86.62.5.232 - 86.62.5.243 iq -86.62.5.244 - 86.62.5.247 ng -86.62.5.248 - 86.62.5.255 iq -86.62.6.0 - 86.62.6.7 ng -86.62.6.8 - 86.62.6.39 a2 -86.62.6.40 - 86.62.6.47 sd -86.62.6.48 - 86.62.6.239 a2 -86.62.6.240 - 86.62.6.247 af -86.62.6.248 - 86.62.7.11 a2 -86.62.7.12 - 86.62.7.15 iq -86.62.7.16 - 86.62.7.19 a2 -86.62.7.20 - 86.62.7.23 td -86.62.7.24 - 86.62.7.27 a2 -86.62.7.28 - 86.62.7.31 iq -86.62.7.32 - 86.62.7.35 a2 -86.62.7.36 - 86.62.7.39 iq -86.62.7.40 - 86.62.7.43 a2 -86.62.7.44 - 86.62.7.47 iq -86.62.7.48 - 86.62.7.51 a2 -86.62.7.52 - 86.62.7.55 iq -86.62.7.56 - 86.62.7.59 af -86.62.7.60 - 86.62.7.63 er -86.62.7.64 - 86.62.7.67 ly -86.62.7.68 - 86.62.7.75 af -86.62.7.76 - 86.62.7.83 ly -86.62.7.84 - 86.62.7.87 a2 -86.62.7.88 - 86.62.7.91 cf -86.62.7.92 - 86.62.7.103 a2 -86.62.7.104 - 86.62.7.107 iq -86.62.7.108 - 86.62.7.115 a2 -86.62.7.116 - 86.62.7.119 iq -86.62.7.120 - 86.62.7.123 af -86.62.7.124 - 86.62.7.127 a2 -86.62.7.128 - 86.62.7.131 iq -86.62.7.132 - 86.62.7.135 af -86.62.7.136 - 86.62.7.139 iq -86.62.7.140 - 86.62.7.143 a2 -86.62.7.144 - 86.62.7.159 ly -86.62.7.160 - 86.62.7.163 ml -86.62.7.164 - 86.62.7.167 a2 -86.62.7.168 - 86.62.7.175 iq -86.62.7.176 - 86.62.7.191 a2 -86.62.7.192 - 86.62.7.195 td -86.62.7.196 - 86.62.7.199 a2 -86.62.7.200 - 86.62.7.203 iq -86.62.7.204 - 86.62.7.215 a2 -86.62.7.216 - 86.62.7.219 ly -86.62.7.220 - 86.62.7.223 iq -86.62.7.224 - 86.62.7.231 a2 -86.62.7.232 - 86.62.7.235 ng -86.62.7.236 - 86.62.7.239 iq -86.62.7.240 - 86.62.7.251 a2 -86.62.7.252 - 86.62.7.255 af -86.62.8.0 - 86.62.8.7 ly -86.62.8.8 - 86.62.8.15 sd -86.62.8.16 - 86.62.8.55 a2 -86.62.8.56 - 86.62.8.71 sd -86.62.8.72 - 86.62.8.79 a2 -86.62.8.80 - 86.62.8.87 sd -86.62.8.88 - 86.62.8.103 a2 -86.62.8.104 - 86.62.8.111 af -86.62.8.112 - 86.62.8.167 a2 -86.62.8.168 - 86.62.8.175 sd -86.62.8.176 - 86.62.8.215 a2 -86.62.8.216 - 86.62.8.223 cy -86.62.8.224 - 86.62.8.255 a2 -86.62.9.0 - 86.62.9.7 iq -86.62.9.8 - 86.62.9.11 a2 -86.62.9.12 - 86.62.9.19 iq -86.62.9.20 - 86.62.9.23 sd -86.62.9.24 - 86.62.9.39 a2 -86.62.9.40 - 86.62.9.47 af -86.62.9.48 - 86.62.9.55 a2 -86.62.9.56 - 86.62.9.59 iq -86.62.9.60 - 86.62.9.67 af -86.62.9.68 - 86.62.9.99 a2 -86.62.9.100 - 86.62.9.103 af -86.62.9.104 - 86.62.9.107 iq -86.62.9.108 - 86.62.9.111 bg -86.62.9.112 - 86.62.9.119 a2 -86.62.9.120 - 86.62.9.127 af -86.62.9.128 - 86.62.9.131 iq -86.62.9.132 - 86.62.9.139 a2 -86.62.9.140 - 86.62.9.143 iq -86.62.9.144 - 86.62.9.147 a2 -86.62.9.148 - 86.62.9.151 af -86.62.9.152 - 86.62.9.175 a2 -86.62.9.176 - 86.62.9.183 iq -86.62.9.184 - 86.62.9.187 a2 -86.62.9.188 - 86.62.9.191 ly -86.62.9.192 - 86.62.9.215 a2 -86.62.9.216 - 86.62.9.219 iq -86.62.9.220 - 86.62.9.231 a2 -86.62.9.232 - 86.62.9.235 ng -86.62.9.236 - 86.62.9.247 a2 -86.62.9.248 - 86.62.9.251 sd -86.62.9.252 - 86.62.10.23 a2 -86.62.10.24 - 86.62.10.31 cy -86.62.10.32 - 86.62.12.3 a2 -86.62.12.4 - 86.62.12.7 af -86.62.12.8 - 86.62.12.11 ly -86.62.12.12 - 86.62.12.15 a2 -86.62.12.16 - 86.62.12.19 gn -86.62.12.20 - 86.62.12.35 a2 -86.62.12.36 - 86.62.12.39 af -86.62.12.40 - 86.62.12.43 a2 -86.62.12.44 - 86.62.12.47 iq -86.62.12.48 - 86.62.12.51 sa -86.62.12.52 - 86.62.12.59 a2 -86.62.12.60 - 86.62.12.63 ly -86.62.12.64 - 86.62.12.67 iq -86.62.12.68 - 86.62.12.87 a2 -86.62.12.88 - 86.62.12.91 ly -86.62.12.92 - 86.62.12.95 a2 -86.62.12.96 - 86.62.12.99 iq -86.62.12.100 - 86.62.12.103 ly -86.62.12.104 - 86.62.12.107 ng -86.62.12.108 - 86.62.12.111 a2 -86.62.12.112 - 86.62.12.115 iq -86.62.12.116 - 86.62.12.119 af -86.62.12.120 - 86.62.12.123 ly -86.62.12.124 - 86.62.12.127 a2 -86.62.12.128 - 86.62.12.131 af -86.62.12.132 - 86.62.12.139 a2 -86.62.12.140 - 86.62.12.143 ly -86.62.12.144 - 86.62.12.151 a2 -86.62.12.152 - 86.62.12.155 ly -86.62.12.156 - 86.62.12.159 iq -86.62.12.160 - 86.62.12.163 a2 -86.62.12.164 - 86.62.12.167 cg -86.62.12.168 - 86.62.12.171 iq -86.62.12.172 - 86.62.12.187 a2 -86.62.12.188 - 86.62.12.191 af -86.62.12.192 - 86.62.12.195 iq -86.62.12.196 - 86.62.12.199 a2 -86.62.12.200 - 86.62.12.203 af -86.62.12.204 - 86.62.12.215 a2 -86.62.12.216 - 86.62.12.219 ng -86.62.12.220 - 86.62.12.231 a2 -86.62.12.232 - 86.62.12.235 iq -86.62.12.236 - 86.62.12.239 ly -86.62.12.240 - 86.62.12.251 a2 -86.62.12.252 - 86.62.12.255 af -86.62.13.0 - 86.62.13.7 a2 -86.62.13.8 - 86.62.13.11 af -86.62.13.12 - 86.62.13.15 iq -86.62.13.16 - 86.62.13.23 a2 -86.62.13.24 - 86.62.13.27 iq -86.62.13.28 - 86.62.13.35 a2 -86.62.13.36 - 86.62.13.39 iq -86.62.13.40 - 86.62.13.51 a2 -86.62.13.52 - 86.62.13.55 cg -86.62.13.56 - 86.62.13.59 a2 -86.62.13.60 - 86.62.13.63 ly -86.62.13.64 - 86.62.13.75 a2 -86.62.13.76 - 86.62.13.79 iq -86.62.13.80 - 86.62.13.83 a2 -86.62.13.84 - 86.62.13.87 bj -86.62.13.88 - 86.62.13.95 a2 -86.62.13.96 - 86.62.13.107 iq -86.62.13.108 - 86.62.13.115 a2 -86.62.13.116 - 86.62.13.123 iq -86.62.13.124 - 86.62.13.127 a2 -86.62.13.128 - 86.62.13.135 iq -86.62.13.136 - 86.62.13.143 a2 -86.62.13.144 - 86.62.13.147 ga -86.62.13.148 - 86.62.13.151 a2 -86.62.13.152 - 86.62.13.155 af -86.62.13.156 - 86.62.13.171 a2 -86.62.13.172 - 86.62.13.175 af -86.62.13.176 - 86.62.13.179 a2 -86.62.13.180 - 86.62.13.183 iq -86.62.13.184 - 86.62.13.187 af -86.62.13.188 - 86.62.13.219 a2 -86.62.13.220 - 86.62.13.223 iq -86.62.13.224 - 86.62.13.231 a2 -86.62.13.232 - 86.62.13.232 iq -86.62.13.233 - 86.62.13.235 a2 -86.62.13.236 - 86.62.13.239 af -86.62.13.240 - 86.62.13.247 a2 -86.62.13.248 - 86.62.13.251 ci -86.62.13.252 - 86.62.14.3 a2 -86.62.14.4 - 86.62.14.7 iq -86.62.14.8 - 86.62.14.11 a2 -86.62.14.12 - 86.62.14.15 iq -86.62.14.16 - 86.62.14.23 a2 -86.62.14.24 - 86.62.14.31 iq -86.62.14.32 - 86.62.14.39 a2 -86.62.14.40 - 86.62.14.43 iq -86.62.14.44 - 86.62.14.47 a2 -86.62.14.48 - 86.62.14.51 af -86.62.14.52 - 86.62.14.55 iq -86.62.14.56 - 86.62.14.95 a2 -86.62.14.96 - 86.62.14.99 iq -86.62.14.100 - 86.62.14.103 td -86.62.14.104 - 86.62.14.127 a2 -86.62.14.128 - 86.62.14.131 ly -86.62.14.132 - 86.62.14.139 a2 -86.62.14.140 - 86.62.14.143 ci -86.62.14.144 - 86.62.14.151 a2 -86.62.14.152 - 86.62.14.155 ly -86.62.14.156 - 86.62.14.159 a2 -86.62.14.160 - 86.62.14.163 ly -86.62.14.164 - 86.62.14.167 a2 -86.62.14.168 - 86.62.14.171 af -86.62.14.172 - 86.62.14.179 a2 -86.62.14.180 - 86.62.14.183 af -86.62.14.184 - 86.62.14.187 iq -86.62.14.188 - 86.62.14.191 a2 -86.62.14.192 - 86.62.14.195 iq -86.62.14.196 - 86.62.14.203 a2 -86.62.14.204 - 86.62.14.207 iq -86.62.14.208 - 86.62.14.219 a2 -86.62.14.220 - 86.62.14.223 iq -86.62.14.224 - 86.62.14.227 td -86.62.14.228 - 86.62.14.243 a2 -86.62.14.244 - 86.62.14.247 iq -86.62.14.248 - 86.62.15.15 a2 -86.62.15.16 - 86.62.15.19 ng -86.62.15.20 - 86.62.15.23 iq -86.62.15.24 - 86.62.15.31 a2 -86.62.15.32 - 86.62.15.35 ly -86.62.15.36 - 86.62.15.39 iq -86.62.15.40 - 86.62.15.43 a2 -86.62.15.44 - 86.62.15.47 iq -86.62.15.48 - 86.62.15.63 a2 -86.62.15.64 - 86.62.15.67 iq -86.62.15.68 - 86.62.15.71 af -86.62.15.72 - 86.62.15.87 a2 -86.62.15.88 - 86.62.15.91 iq -86.62.15.92 - 86.62.15.95 a2 -86.62.15.96 - 86.62.15.99 iq -86.62.15.100 - 86.62.15.103 a2 -86.62.15.104 - 86.62.15.107 af -86.62.15.108 - 86.62.15.119 a2 -86.62.15.120 - 86.62.15.127 iq -86.62.15.128 - 86.62.15.139 a2 -86.62.15.140 - 86.62.15.143 iq -86.62.15.144 - 86.62.15.163 a2 -86.62.15.164 - 86.62.15.171 iq -86.62.15.172 - 86.62.15.175 af -86.62.15.176 - 86.62.15.179 a2 -86.62.15.180 - 86.62.15.183 td -86.62.15.184 - 86.62.15.207 a2 -86.62.15.208 - 86.62.15.211 af -86.62.15.212 - 86.62.15.223 a2 -86.62.15.224 - 86.62.15.227 iq -86.62.15.228 - 86.62.15.243 a2 -86.62.15.244 - 86.62.15.247 af -86.62.15.248 - 86.62.15.251 a2 -86.62.15.252 - 86.62.15.255 eg -86.62.16.0 - 86.62.16.7 a2 -86.62.16.8 - 86.62.16.15 sd -86.62.16.16 - 86.62.16.239 a2 -86.62.16.240 - 86.62.16.247 ae -86.62.16.248 - 86.62.16.255 sd -86.62.17.0 - 86.62.17.3 af -86.62.17.4 - 86.62.17.27 a2 -86.62.17.28 - 86.62.17.31 gh -86.62.17.32 - 86.62.17.35 a2 -86.62.17.36 - 86.62.17.39 iq -86.62.17.40 - 86.62.17.51 a2 -86.62.17.52 - 86.62.17.55 sd -86.62.17.56 - 86.62.17.71 a2 -86.62.17.72 - 86.62.17.75 ly -86.62.17.76 - 86.62.17.87 a2 -86.62.17.88 - 86.62.17.91 af -86.62.17.92 - 86.62.17.99 a2 -86.62.17.100 - 86.62.17.103 iq -86.62.17.104 - 86.62.17.107 a2 -86.62.17.108 - 86.62.17.111 af -86.62.17.112 - 86.62.17.115 a2 -86.62.17.116 - 86.62.17.119 ly -86.62.17.120 - 86.62.17.123 a2 -86.62.17.124 - 86.62.17.127 af -86.62.17.128 - 86.62.17.139 a2 -86.62.17.140 - 86.62.17.143 iq -86.62.17.144 - 86.62.17.171 a2 -86.62.17.172 - 86.62.17.175 ng -86.62.17.176 - 86.62.17.183 a2 -86.62.17.184 - 86.62.17.187 iq -86.62.17.188 - 86.62.17.191 td -86.62.17.192 - 86.62.17.195 iq -86.62.17.196 - 86.62.17.199 a2 -86.62.17.200 - 86.62.17.203 ly -86.62.17.204 - 86.62.17.219 a2 -86.62.17.220 - 86.62.17.223 iq -86.62.17.224 - 86.62.17.227 a2 -86.62.17.228 - 86.62.17.231 iq -86.62.17.232 - 86.62.18.7 a2 -86.62.18.8 - 86.62.18.11 af -86.62.18.12 - 86.62.18.19 a2 -86.62.18.20 - 86.62.18.27 af -86.62.18.28 - 86.62.18.39 a2 -86.62.18.40 - 86.62.18.43 lb -86.62.18.44 - 86.62.18.63 a2 -86.62.18.64 - 86.62.18.67 iq -86.62.18.68 - 86.62.18.187 a2 -86.62.18.188 - 86.62.18.191 cg -86.62.18.192 - 86.62.18.215 a2 -86.62.18.216 - 86.62.18.219 iq -86.62.18.220 - 86.62.18.239 a2 -86.62.18.240 - 86.62.18.243 iq -86.62.18.244 - 86.62.18.247 a2 -86.62.18.248 - 86.62.18.251 iq -86.62.18.252 - 86.62.19.11 a2 -86.62.19.12 - 86.62.19.15 sd -86.62.19.16 - 86.62.19.19 iq -86.62.19.20 - 86.62.19.83 a2 -86.62.19.84 - 86.62.19.87 iq -86.62.19.88 - 86.62.19.115 a2 -86.62.19.116 - 86.62.19.119 ng -86.62.19.120 - 86.62.19.191 a2 -86.62.19.192 - 86.62.19.199 af -86.62.19.200 - 86.62.19.203 a2 -86.62.19.204 - 86.62.19.207 af -86.62.19.208 - 86.62.19.247 a2 -86.62.19.248 - 86.62.19.251 iq -86.62.19.252 - 86.62.19.255 a2 -86.62.20.0 - 86.62.20.3 iq -86.62.20.4 - 86.62.20.43 a2 -86.62.20.44 - 86.62.20.47 af -86.62.20.48 - 86.62.20.51 ga -86.62.20.52 - 86.62.20.55 af -86.62.20.56 - 86.62.20.63 a2 -86.62.20.64 - 86.62.20.67 iq -86.62.20.68 - 86.62.20.79 a2 -86.62.20.80 - 86.62.20.83 iq -86.62.20.84 - 86.62.20.155 a2 -86.62.20.156 - 86.62.20.159 cg -86.62.20.160 - 86.62.20.167 a2 -86.62.20.168 - 86.62.20.171 td -86.62.20.172 - 86.62.20.183 a2 -86.62.20.184 - 86.62.20.187 iq -86.62.20.188 - 86.62.20.235 a2 -86.62.20.236 - 86.62.20.239 iq -86.62.20.240 - 86.62.21.3 a2 -86.62.21.4 - 86.62.21.7 iq -86.62.21.8 - 86.62.21.19 a2 -86.62.21.20 - 86.62.21.23 iq -86.62.21.24 - 86.62.21.55 a2 -86.62.21.56 - 86.62.21.59 ly -86.62.21.60 - 86.62.21.111 a2 -86.62.21.112 - 86.62.21.115 iq -86.62.21.116 - 86.62.21.179 a2 -86.62.21.180 - 86.62.21.183 iq -86.62.21.184 - 86.62.21.215 a2 -86.62.21.216 - 86.62.21.219 af -86.62.21.220 - 86.62.21.239 a2 -86.62.21.240 - 86.62.21.251 af -86.62.21.252 - 86.62.22.3 iq -86.62.22.4 - 86.62.22.7 ng -86.62.22.8 - 86.62.22.59 a2 -86.62.22.60 - 86.62.22.63 iq -86.62.22.64 - 86.62.22.67 ly -86.62.22.68 - 86.62.22.71 iq -86.62.22.72 - 86.62.22.75 a2 -86.62.22.76 - 86.62.22.79 eg -86.62.22.80 - 86.62.22.83 cg -86.62.22.84 - 86.62.22.87 a2 -86.62.22.88 - 86.62.22.91 eg -86.62.22.92 - 86.62.22.95 a2 -86.62.22.96 - 86.62.22.99 af -86.62.22.100 - 86.62.22.107 iq -86.62.22.108 - 86.62.22.135 a2 -86.62.22.136 - 86.62.22.139 af -86.62.22.140 - 86.62.22.159 a2 -86.62.22.160 - 86.62.22.163 af -86.62.22.164 - 86.62.22.199 a2 -86.62.22.200 - 86.62.22.203 ng -86.62.22.204 - 86.62.22.247 a2 -86.62.22.248 - 86.62.22.251 af -86.62.22.252 - 86.62.23.43 a2 -86.62.23.44 - 86.62.23.47 af -86.62.23.48 - 86.62.23.107 a2 -86.62.23.108 - 86.62.23.111 af -86.62.23.112 - 86.62.23.119 a2 -86.62.23.120 - 86.62.23.123 af -86.62.23.124 - 86.62.23.131 iq -86.62.23.132 - 86.62.24.15 a2 -86.62.24.16 - 86.62.24.19 ly -86.62.24.20 - 86.62.24.47 a2 -86.62.24.48 - 86.62.24.51 af -86.62.24.52 - 86.62.24.67 a2 -86.62.24.68 - 86.62.24.71 iq -86.62.24.72 - 86.62.24.83 a2 -86.62.24.84 - 86.62.24.87 ng -86.62.24.88 - 86.62.24.103 a2 -86.62.24.104 - 86.62.24.107 zm -86.62.24.108 - 86.62.24.159 a2 -86.62.24.160 - 86.62.24.163 ng -86.62.24.164 - 86.62.24.187 a2 -86.62.24.188 - 86.62.24.191 ng -86.62.24.192 - 86.62.24.211 a2 -86.62.24.212 - 86.62.24.215 ng -86.62.24.216 - 86.62.24.235 a2 -86.62.24.236 - 86.62.24.239 iq -86.62.24.240 - 86.62.24.243 a2 -86.62.24.244 - 86.62.24.247 af -86.62.24.248 - 86.62.25.7 a2 -86.62.25.8 - 86.62.25.11 iq -86.62.25.12 - 86.62.25.15 a2 -86.62.25.16 - 86.62.25.19 iq -86.62.25.20 - 86.62.25.43 a2 -86.62.25.44 - 86.62.25.47 iq -86.62.25.48 - 86.62.25.67 a2 -86.62.25.68 - 86.62.25.71 iq -86.62.25.72 - 86.62.25.75 a2 -86.62.25.76 - 86.62.25.79 iq -86.62.25.80 - 86.62.25.95 a2 -86.62.25.96 - 86.62.25.99 iq -86.62.25.100 - 86.62.25.103 af -86.62.25.104 - 86.62.25.127 a2 -86.62.25.128 - 86.62.25.131 af -86.62.25.132 - 86.62.25.139 a2 -86.62.25.140 - 86.62.25.143 ga -86.62.25.144 - 86.62.25.151 a2 -86.62.25.152 - 86.62.25.155 iq -86.62.25.156 - 86.62.25.167 a2 -86.62.25.168 - 86.62.25.171 af -86.62.25.172 - 86.62.25.251 a2 -86.62.25.252 - 86.62.25.255 ly -86.62.26.0 - 86.62.26.7 a2 -86.62.26.8 - 86.62.26.15 ly -86.62.26.16 - 86.62.26.23 eg -86.62.26.24 - 86.62.26.31 a2 -86.62.26.32 - 86.62.26.39 ng -86.62.26.40 - 86.62.26.135 a2 -86.62.26.136 - 86.62.26.143 ng -86.62.26.144 - 86.62.26.159 a2 -86.62.26.160 - 86.62.26.175 af -86.62.26.176 - 86.62.26.231 a2 -86.62.26.232 - 86.62.26.247 sd -86.62.26.248 - 86.62.27.7 a2 -86.62.27.8 - 86.62.27.11 af -86.62.27.12 - 86.62.27.19 a2 -86.62.27.20 - 86.62.27.27 af -86.62.27.28 - 86.62.27.47 a2 -86.62.27.48 - 86.62.27.55 af -86.62.27.56 - 86.62.27.71 a2 -86.62.27.72 - 86.62.27.75 ly -86.62.27.76 - 86.62.27.79 a2 -86.62.27.80 - 86.62.27.87 iq -86.62.27.88 - 86.62.27.95 a2 -86.62.27.96 - 86.62.27.99 iq -86.62.27.100 - 86.62.27.103 af -86.62.27.104 - 86.62.27.115 a2 -86.62.27.116 - 86.62.27.119 af -86.62.27.120 - 86.62.27.123 a2 -86.62.27.124 - 86.62.27.127 ng -86.62.27.128 - 86.62.27.131 iq -86.62.27.132 - 86.62.27.167 a2 -86.62.27.168 - 86.62.27.171 ly -86.62.27.172 - 86.62.27.191 a2 -86.62.27.192 - 86.62.27.195 iq -86.62.27.196 - 86.62.27.199 a2 -86.62.27.200 - 86.62.27.203 af -86.62.27.204 - 86.62.27.211 a2 -86.62.27.212 - 86.62.27.219 iq -86.62.27.220 - 86.62.27.231 a2 -86.62.27.232 - 86.62.27.235 iq -86.62.27.236 - 86.62.27.243 a2 -86.62.27.244 - 86.62.27.247 af -86.62.27.248 - 86.62.27.251 a2 -86.62.27.252 - 86.62.27.255 af -86.62.28.0 - 86.62.28.3 iq -86.62.28.4 - 86.62.28.7 a2 -86.62.28.8 - 86.62.28.15 af -86.62.28.16 - 86.62.28.19 a2 -86.62.28.20 - 86.62.28.23 iq -86.62.28.24 - 86.62.28.27 a2 -86.62.28.28 - 86.62.28.31 iq -86.62.28.32 - 86.62.28.39 a2 -86.62.28.40 - 86.62.28.47 iq -86.62.28.48 - 86.62.28.51 ly -86.62.28.52 - 86.62.28.55 af -86.62.28.56 - 86.62.28.107 a2 -86.62.28.108 - 86.62.28.111 ly -86.62.28.112 - 86.62.28.119 a2 -86.62.28.120 - 86.62.28.123 ng -86.62.28.124 - 86.62.28.135 a2 -86.62.28.136 - 86.62.28.139 sd -86.62.28.140 - 86.62.28.147 a2 -86.62.28.148 - 86.62.28.167 ly -86.62.28.168 - 86.62.28.171 td -86.62.28.172 - 86.62.28.187 a2 -86.62.28.188 - 86.62.28.195 iq -86.62.28.196 - 86.62.28.231 a2 -86.62.28.232 - 86.62.28.239 iq -86.62.28.240 - 86.62.28.247 a2 -86.62.28.248 - 86.62.28.251 af -86.62.28.252 - 86.62.29.3 a2 -86.62.29.4 - 86.62.29.7 iq -86.62.29.8 - 86.62.29.23 a2 -86.62.29.24 - 86.62.29.27 ly -86.62.29.28 - 86.62.29.31 af -86.62.29.32 - 86.62.29.35 iq -86.62.29.36 - 86.62.29.39 af -86.62.29.40 - 86.62.29.71 a2 -86.62.29.72 - 86.62.29.75 iq -86.62.29.76 - 86.62.29.87 a2 -86.62.29.88 - 86.62.29.91 af -86.62.29.92 - 86.62.29.111 a2 -86.62.29.112 - 86.62.29.115 iq -86.62.29.116 - 86.62.29.119 ly -86.62.29.120 - 86.62.29.131 a2 -86.62.29.132 - 86.62.29.135 ly -86.62.29.136 - 86.62.29.163 a2 -86.62.29.164 - 86.62.29.167 af -86.62.29.168 - 86.62.29.171 a2 -86.62.29.172 - 86.62.29.175 af -86.62.29.176 - 86.62.29.179 ly -86.62.29.180 - 86.62.29.191 a2 -86.62.29.192 - 86.62.29.195 af -86.62.29.196 - 86.62.29.203 a2 -86.62.29.204 - 86.62.29.207 sd -86.62.29.208 - 86.62.29.211 a2 -86.62.29.212 - 86.62.29.215 iq -86.62.29.216 - 86.62.29.227 a2 -86.62.29.228 - 86.62.29.231 ly -86.62.29.232 - 86.62.29.243 a2 -86.62.29.244 - 86.62.29.247 er -86.62.29.248 - 86.62.29.251 cg -86.62.29.252 - 86.62.29.255 a2 -86.62.30.0 - 86.62.30.3 ly -86.62.30.4 - 86.62.30.19 a2 -86.62.30.20 - 86.62.30.23 af -86.62.30.24 - 86.62.30.27 eg -86.62.30.28 - 86.62.30.47 a2 -86.62.30.48 - 86.62.30.51 sd -86.62.30.52 - 86.62.30.55 ly -86.62.30.56 - 86.62.30.59 af -86.62.30.60 - 86.62.30.71 a2 -86.62.30.72 - 86.62.30.75 ly -86.62.30.76 - 86.62.30.79 a2 -86.62.30.80 - 86.62.30.83 iq -86.62.30.84 - 86.62.30.91 a2 -86.62.30.92 - 86.62.30.95 cg -86.62.30.96 - 86.62.30.99 a2 -86.62.30.100 - 86.62.30.103 ly -86.62.30.104 - 86.62.30.107 af -86.62.30.108 - 86.62.30.111 a2 -86.62.30.112 - 86.62.30.115 ly -86.62.30.116 - 86.62.30.127 a2 -86.62.30.128 - 86.62.30.131 ly -86.62.30.132 - 86.62.30.135 a2 -86.62.30.136 - 86.62.30.139 iq -86.62.30.140 - 86.62.30.143 af -86.62.30.144 - 86.62.30.147 iq -86.62.30.148 - 86.62.30.191 a2 -86.62.30.192 - 86.62.30.195 sd -86.62.30.196 - 86.62.30.203 a2 -86.62.30.204 - 86.62.30.207 ly -86.62.30.208 - 86.62.30.211 a2 -86.62.30.212 - 86.62.30.213 ly -86.62.30.214 - 86.62.30.251 a2 -86.62.30.252 - 86.62.30.255 ly -86.62.31.0 - 86.62.31.7 iq -86.62.31.8 - 86.62.31.19 a2 -86.62.31.20 - 86.62.31.23 ly -86.62.31.24 - 86.62.31.27 a2 -86.62.31.28 - 86.62.31.31 af -86.62.31.32 - 86.62.31.35 a2 -86.62.31.36 - 86.62.31.39 af -86.62.31.40 - 86.62.31.43 a2 -86.62.31.44 - 86.62.31.47 af -86.62.31.48 - 86.62.31.51 a2 -86.62.31.52 - 86.62.31.55 iq -86.62.31.56 - 86.62.31.59 ng -86.62.31.60 - 86.62.31.75 a2 -86.62.31.76 - 86.62.31.79 iq -86.62.31.80 - 86.62.31.83 a2 -86.62.31.84 - 86.62.31.87 iq -86.62.31.88 - 86.62.31.91 a2 -86.62.31.92 - 86.62.31.99 iq -86.62.31.100 - 86.62.31.103 a2 -86.62.31.104 - 86.62.31.111 iq -86.62.31.112 - 86.62.31.115 af -86.62.31.116 - 86.62.31.123 a2 -86.62.31.124 - 86.62.31.127 ly -86.62.31.128 - 86.62.31.131 af -86.62.31.132 - 86.62.31.159 a2 -86.62.31.160 - 86.62.31.163 af -86.62.31.164 - 86.62.31.203 a2 -86.62.31.204 - 86.62.31.207 iq -86.62.31.208 - 86.62.31.211 a2 -86.62.31.212 - 86.62.31.215 iq -86.62.31.216 - 86.62.31.219 a2 -86.62.31.220 - 86.62.31.223 iq -86.62.31.224 - 86.62.31.243 a2 -86.62.31.244 - 86.62.31.251 af -86.62.31.252 - 86.62.32.3 a2 -86.62.32.4 - 86.62.32.7 af -86.62.32.8 - 86.62.32.11 a2 -86.62.32.12 - 86.62.32.15 iq -86.62.32.16 - 86.62.32.27 a2 -86.62.32.28 - 86.62.32.31 af -86.62.32.32 - 86.62.32.35 a2 -86.62.32.36 - 86.62.32.39 af -86.62.32.40 - 86.62.32.43 iq -86.62.32.44 - 86.62.32.47 cg -86.62.32.48 - 86.62.32.51 af -86.62.32.52 - 86.62.32.55 er -86.62.32.56 - 86.62.32.59 a2 -86.62.32.60 - 86.62.32.63 ng -86.62.32.64 - 86.62.32.67 af -86.62.32.68 - 86.62.32.71 a2 -86.62.32.72 - 86.62.32.75 iq -86.62.32.76 - 86.62.32.79 a2 -86.62.32.80 - 86.62.32.83 iq -86.62.32.84 - 86.62.32.87 af -86.62.32.88 - 86.62.32.95 a2 -86.62.32.96 - 86.62.32.103 af -86.62.32.104 - 86.62.32.115 a2 -86.62.32.116 - 86.62.32.119 ly -86.62.32.120 - 86.62.32.151 a2 -86.62.32.152 - 86.62.32.155 cf -86.62.32.156 - 86.62.32.163 a2 -86.62.32.164 - 86.62.32.167 iq -86.62.32.168 - 86.62.32.183 a2 -86.62.32.184 - 86.62.32.187 af -86.62.32.188 - 86.62.32.191 iq -86.62.32.192 - 86.62.32.195 a2 -86.62.32.196 - 86.62.32.203 iq -86.62.32.204 - 86.62.32.215 a2 -86.62.32.216 - 86.62.32.219 iq -86.62.32.220 - 86.62.32.239 a2 -86.62.32.240 - 86.62.32.247 iq -86.62.32.248 - 86.62.32.251 af -86.62.32.252 - 86.62.32.255 iq -86.62.33.0 - 86.62.33.7 af -86.62.33.8 - 86.62.33.39 iq -86.62.33.40 - 86.62.33.55 af -86.62.33.56 - 86.62.33.63 a2 -86.62.33.64 - 86.62.33.79 iq -86.62.33.80 - 86.62.33.87 kw -86.62.33.88 - 86.62.33.111 iq -86.62.33.112 - 86.62.33.119 a2 -86.62.33.120 - 86.62.33.135 af -86.62.33.136 - 86.62.33.143 ga -86.62.33.144 - 86.62.33.159 af -86.62.33.160 - 86.62.33.167 a2 -86.62.33.168 - 86.62.33.175 af -86.62.33.176 - 86.62.63.255 a2 +86.62.5.0 - 86.62.5.255 a2 +86.62.12.0 - 86.62.12.255 iq +86.62.27.0 - 86.62.28.255 iq +86.62.30.0 - 86.62.30.255 a2 86.62.64.0 - 86.62.127.255 ru 86.62.128.0 - 86.62.191.255 no 86.62.192.0 - 86.62.255.255 qa 86.63.0.0 - 86.63.63.255 gb 86.63.64.0 - 86.63.159.255 pl 86.63.160.0 - 86.63.191.255 lv -86.63.192.0 - 86.63.193.255 cz -86.63.194.0 - 86.63.194.15 bz -86.63.194.16 - 86.63.223.255 cz -86.63.224.0 - 86.66.13.95 fr -86.66.13.96 - 86.66.13.111 tn -86.66.13.112 - 86.79.255.255 fr +86.63.192.0 - 86.63.223.255 cz +86.63.224.0 - 86.79.255.255 fr 86.80.0.0 - 86.95.255.255 nl 86.96.0.0 - 86.99.255.255 ae 86.100.0.0 - 86.100.255.255 lt 86.101.0.0 - 86.101.255.255 hu 86.102.0.0 - 86.102.255.255 ru 86.103.0.0 - 86.103.255.255 de -86.104.0.0 - 86.106.82.255 ro -86.106.83.0 - 86.106.83.255 ua -86.106.84.0 - 86.106.207.255 ro +86.104.0.0 - 86.104.2.255 gb +86.104.3.0 - 86.104.14.255 ro +86.104.15.0 - 86.104.15.255 bg +86.104.16.0 - 86.104.31.255 ro +86.104.32.0 - 86.104.47.255 ir +86.104.48.0 - 86.104.63.255 se +86.104.64.0 - 86.104.79.255 ro +86.104.80.0 - 86.104.111.255 ir +86.104.112.0 - 86.104.125.255 ro +86.104.126.0 - 86.104.126.255 gb +86.104.127.0 - 86.104.133.255 ro +86.104.134.0 - 86.104.134.255 md +86.104.135.0 - 86.104.151.255 ro +86.104.152.0 - 86.104.159.255 se +86.104.160.0 - 86.104.167.255 ps +86.104.168.0 - 86.104.195.255 ro +86.104.196.0 - 86.104.199.255 md +86.104.200.0 - 86.104.207.255 se +86.104.208.0 - 86.104.208.255 gb +86.104.209.0 - 86.104.211.255 ro +86.104.212.0 - 86.104.213.255 gb +86.104.214.0 - 86.104.221.255 ro +86.104.222.0 - 86.104.225.255 gb +86.104.226.0 - 86.104.231.255 ro +86.104.232.0 - 86.104.247.255 ir +86.104.248.0 - 86.105.0.255 ro +86.105.1.0 - 86.105.1.255 it +86.105.2.0 - 86.105.4.255 ro +86.105.5.0 - 86.105.5.255 de +86.105.6.0 - 86.105.6.255 ro +86.105.7.0 - 86.105.7.255 gb +86.105.8.0 - 86.105.11.255 ro +86.105.12.0 - 86.105.13.255 gb +86.105.14.0 - 86.105.17.255 ro +86.105.18.0 - 86.105.18.255 nl +86.105.19.0 - 86.105.23.255 ro +86.105.24.0 - 86.105.24.255 md +86.105.25.0 - 86.105.47.255 ro +86.105.48.0 - 86.105.55.255 de +86.105.56.0 - 86.105.56.255 ro +86.105.57.0 - 86.105.57.255 md +86.105.58.0 - 86.105.79.255 ro +86.105.80.0 - 86.105.87.255 md +86.105.88.0 - 86.105.111.255 ro +86.105.112.0 - 86.105.119.255 se +86.105.120.0 - 86.105.127.255 ro +86.105.128.0 - 86.105.143.255 ir +86.105.144.0 - 86.105.147.255 ro +86.105.148.0 - 86.105.150.255 md +86.105.151.0 - 86.105.167.255 ro +86.105.168.0 - 86.105.168.255 md +86.105.169.0 - 86.105.171.255 ro +86.105.172.0 - 86.105.175.255 md +86.105.176.0 - 86.105.183.255 ro +86.105.184.0 - 86.105.185.255 gb +86.105.186.0 - 86.105.195.255 ro +86.105.196.0 - 86.105.196.255 gb +86.105.197.0 - 86.105.211.255 ro +86.105.212.0 - 86.105.213.255 fr +86.105.214.0 - 86.105.220.255 ro +86.105.221.0 - 86.105.221.255 md +86.105.222.0 - 86.105.224.255 ro +86.105.225.0 - 86.105.225.255 gb +86.105.226.0 - 86.105.226.255 ro +86.105.227.0 - 86.105.227.255 ru +86.105.228.0 - 86.105.228.255 ro +86.105.229.0 - 86.105.230.255 gb +86.105.231.0 - 86.105.231.255 ro +86.105.232.0 - 86.105.232.255 md +86.105.233.0 - 86.105.234.255 ro +86.105.235.0 - 86.105.235.255 gb +86.105.236.0 - 86.105.239.255 ro +86.105.240.0 - 86.105.240.255 de +86.105.241.0 - 86.105.241.255 ro +86.105.242.0 - 86.105.243.255 gb +86.105.244.0 - 86.106.7.255 ro +86.106.8.0 - 86.106.10.255 gb +86.106.11.0 - 86.106.12.255 ro +86.106.13.0 - 86.106.15.255 gb +86.106.16.0 - 86.106.22.255 ro +86.106.23.0 - 86.106.23.255 nl +86.106.24.0 - 86.106.25.255 ir +86.106.26.0 - 86.106.26.255 ph +86.106.27.0 - 86.106.90.255 ro +86.106.91.0 - 86.106.91.255 pl +86.106.92.0 - 86.106.92.255 md +86.106.93.0 - 86.106.93.255 bg +86.106.94.0 - 86.106.95.255 gb +86.106.96.0 - 86.106.96.255 dk +86.106.97.0 - 86.106.99.255 ro +86.106.100.0 - 86.106.101.255 gb +86.106.102.0 - 86.106.102.255 ru +86.106.103.0 - 86.106.104.255 ro +86.106.105.0 - 86.106.107.255 gb +86.106.108.0 - 86.106.108.255 ro +86.106.109.0 - 86.106.111.255 gb +86.106.112.0 - 86.106.113.255 ro +86.106.114.0 - 86.106.118.255 gb +86.106.119.0 - 86.106.119.255 ro +86.106.120.0 - 86.106.120.255 de +86.106.121.0 - 86.106.130.255 ro +86.106.131.0 - 86.106.131.255 de +86.106.132.0 - 86.106.137.255 ro +86.106.138.0 - 86.106.141.255 gb +86.106.142.0 - 86.106.143.255 ro +86.106.144.0 - 86.106.151.255 md +86.106.152.0 - 86.106.159.255 ro +86.106.160.0 - 86.106.167.255 se +86.106.168.0 - 86.106.173.255 ro +86.106.174.0 - 86.106.175.255 gb +86.106.176.0 - 86.106.183.255 ro +86.106.184.0 - 86.106.187.255 es +86.106.188.0 - 86.106.207.255 ro 86.106.208.0 - 86.106.255.255 md -86.107.0.0 - 86.107.255.255 ro +86.107.0.0 - 86.107.15.255 ir +86.107.16.0 - 86.107.25.255 ro +86.107.26.0 - 86.107.29.255 gb +86.107.30.0 - 86.107.41.255 ro +86.107.42.0 - 86.107.42.255 gb +86.107.43.0 - 86.107.63.255 ro +86.107.64.0 - 86.107.67.255 md +86.107.68.0 - 86.107.69.255 ro +86.107.70.0 - 86.107.72.255 gb +86.107.73.0 - 86.107.73.255 ro +86.107.74.0 - 86.107.75.255 gb +86.107.76.0 - 86.107.79.255 ro +86.107.80.0 - 86.107.95.255 ir +86.107.96.0 - 86.107.99.255 it +86.107.100.0 - 86.107.101.255 ro +86.107.102.0 - 86.107.102.127 ph +86.107.102.128 - 86.107.102.255 th +86.107.103.0 - 86.107.106.255 ro +86.107.107.0 - 86.107.107.255 md +86.107.108.0 - 86.107.119.255 ro +86.107.120.0 - 86.107.127.255 be +86.107.128.0 - 86.107.143.255 gb +86.107.144.0 - 86.107.159.255 ir +86.107.160.0 - 86.107.167.255 md +86.107.168.0 - 86.107.185.255 ro +86.107.186.0 - 86.107.187.255 md +86.107.188.0 - 86.107.188.255 ro +86.107.189.0 - 86.107.190.255 fr +86.107.191.0 - 86.107.191.255 de +86.107.192.0 - 86.107.192.255 ro +86.107.193.0 - 86.107.195.255 gb +86.107.196.0 - 86.107.196.255 md +86.107.197.0 - 86.107.199.255 ro +86.107.200.0 - 86.107.203.255 nl +86.107.204.0 - 86.107.207.255 ro +86.107.208.0 - 86.107.223.255 ir +86.107.224.0 - 86.107.255.255 ro 86.108.0.0 - 86.108.127.255 jo 86.108.128.0 - 86.108.255.255 tr 86.109.0.0 - 86.109.31.255 nl -86.109.32.0 - 86.109.63.255 ir +86.109.32.0 - 86.109.62.255 ir +86.109.63.0 - 86.109.63.255 gb 86.109.64.0 - 86.109.95.255 hu 86.109.96.0 - 86.109.127.255 es 86.109.128.0 - 86.109.159.255 it @@ -49564,18 +24524,15 @@ 86.109.224.0 - 86.109.255.255 de 86.110.0.0 - 86.110.31.255 ru 86.110.32.0 - 86.110.63.255 ee -86.110.64.0 - 86.110.95.255 de +86.110.64.0 - 86.110.68.191 de +86.110.68.192 - 86.110.68.255 at +86.110.69.0 - 86.110.95.255 de 86.110.96.0 - 86.110.127.255 ru -86.110.128.0 - 86.110.135.255 it -86.110.136.0 - 86.110.138.255 a2 -86.110.139.0 - 86.110.159.255 it +86.110.128.0 - 86.110.159.255 it 86.110.160.0 - 86.110.223.255 ru 86.110.224.0 - 86.110.255.255 sk 86.111.0.0 - 86.111.31.255 ru -86.111.32.0 - 86.111.39.175 at -86.111.39.176 - 86.111.39.183 de -86.111.39.184 - 86.111.39.191 us -86.111.39.192 - 86.111.63.255 at +86.111.32.0 - 86.111.63.255 at 86.111.64.0 - 86.111.95.255 ua 86.111.96.0 - 86.111.127.255 pl 86.111.128.0 - 86.111.143.255 ch @@ -49584,7 +24541,6 @@ 86.111.160.0 - 86.111.191.255 gb 86.111.192.0 - 86.111.199.255 sa 86.111.200.0 - 86.111.207.255 pl -86.111.208.0 - 86.111.215.255 eu 86.111.216.0 - 86.111.223.255 gb 86.111.224.0 - 86.111.231.255 ua 86.111.232.0 - 86.111.239.255 de @@ -49593,11 +24549,11 @@ 86.112.0.0 - 86.113.255.255 gb 86.114.0.0 - 86.115.255.255 fi 86.116.0.0 - 86.119.255.255 ch -86.120.0.0 - 86.127.39.255 ro -86.127.40.0 - 86.127.47.255 hu -86.127.48.0 - 86.127.255.255 ro +86.120.0.0 - 86.127.255.255 ro 86.128.0.0 - 86.191.255.255 gb -86.192.0.0 - 86.255.255.255 fr +86.192.0.0 - 86.211.225.255 fr +86.211.226.0 - 86.211.226.255 re +86.211.227.0 - 86.255.255.255 fr 87.0.0.0 - 87.31.255.255 it 87.32.0.0 - 87.47.255.255 ie 87.48.0.0 - 87.63.255.255 dk @@ -49618,13 +24574,18 @@ 87.97.0.0 - 87.97.127.255 hu 87.97.128.0 - 87.97.255.255 bg 87.98.0.0 - 87.98.127.255 ee -87.98.128.0 - 87.98.223.255 fr +87.98.128.0 - 87.98.178.128 fr +87.98.178.129 - 87.98.178.129 es +87.98.178.130 - 87.98.223.255 fr 87.98.224.0 - 87.98.231.255 es 87.98.232.0 - 87.98.239.255 pl 87.98.240.0 - 87.98.247.255 de 87.98.248.0 - 87.98.250.255 gb -87.98.251.0 - 87.98.251.255 fr -87.98.252.0 - 87.98.253.255 be +87.98.251.0 - 87.98.252.110 fr +87.98.252.111 - 87.98.252.111 be +87.98.252.112 - 87.98.253.85 fr +87.98.253.86 - 87.98.253.86 be +87.98.253.87 - 87.98.253.255 fr 87.98.254.0 - 87.98.255.255 gb 87.99.0.0 - 87.99.63.255 pl 87.99.64.0 - 87.99.95.255 lv @@ -49636,47 +24597,30 @@ 87.101.16.0 - 87.101.47.255 pl 87.101.48.0 - 87.101.63.255 gr 87.101.64.0 - 87.101.79.255 pl -87.101.80.0 - 87.101.95.255 gr 87.101.96.0 - 87.101.111.255 gb 87.101.112.0 - 87.101.127.255 hu 87.101.128.0 - 87.101.255.255 sa 87.102.0.0 - 87.102.127.255 gb -87.102.128.0 - 87.102.252.143 ch -87.102.252.144 - 87.102.252.151 gr -87.102.252.152 - 87.102.254.143 ch -87.102.254.144 - 87.102.254.151 at -87.102.254.152 - 87.102.255.255 ch +87.102.128.0 - 87.102.255.255 ch 87.103.0.0 - 87.103.127.255 pt 87.103.128.0 - 87.103.255.255 ru 87.104.0.0 - 87.104.255.255 dk 87.105.0.0 - 87.105.255.255 pl -87.106.0.0 - 87.106.95.255 de +87.106.0.0 - 87.106.28.118 de +87.106.28.119 - 87.106.28.119 ae +87.106.28.120 - 87.106.94.113 de +87.106.94.114 - 87.106.94.114 fr +87.106.94.115 - 87.106.95.255 de 87.106.96.0 - 87.106.99.255 fr -87.106.100.0 - 87.106.107.255 gb -87.106.108.0 - 87.106.108.255 fr -87.106.109.0 - 87.106.109.255 gb -87.106.110.0 - 87.106.110.127 fr -87.106.110.128 - 87.106.111.255 gb -87.106.112.0 - 87.106.156.255 de -87.106.157.0 - 87.106.157.255 es -87.106.158.0 - 87.106.164.255 de -87.106.165.0 - 87.106.165.255 fr -87.106.166.0 - 87.106.172.255 de -87.106.173.0 - 87.106.173.255 es -87.106.174.0 - 87.106.191.255 de +87.106.100.0 - 87.106.106.255 gb +87.106.107.0 - 87.106.191.255 de 87.106.192.0 - 87.106.199.255 es 87.106.200.0 - 87.106.202.255 gb -87.106.203.0 - 87.106.205.255 es -87.106.206.0 - 87.106.206.127 fr -87.106.206.128 - 87.106.206.255 gb -87.106.207.0 - 87.106.207.255 es -87.106.208.0 - 87.106.255.255 de +87.106.203.0 - 87.106.255.255 de 87.107.0.0 - 87.107.255.255 ir 87.108.0.0 - 87.108.255.255 fi 87.109.0.0 - 87.109.255.255 sa -87.110.0.0 - 87.110.232.255 lv -87.110.233.0 - 87.110.233.255 lt -87.110.234.0 - 87.110.255.255 lv +87.110.0.0 - 87.110.255.255 lv 87.111.0.0 - 87.111.255.255 es 87.112.0.0 - 87.115.255.255 gb 87.116.0.0 - 87.116.63.255 dk @@ -49686,36 +24630,11 @@ 87.117.0.0 - 87.117.63.255 ru 87.117.64.0 - 87.117.127.255 gb 87.117.128.0 - 87.117.191.255 ru -87.117.192.0 - 87.117.216.159 gb -87.117.216.160 - 87.117.216.191 us -87.117.216.192 - 87.117.230.255 gb -87.117.231.0 - 87.117.231.255 za -87.117.232.0 - 87.117.255.255 gb +87.117.192.0 - 87.117.238.63 gb +87.117.238.64 - 87.117.238.127 a1 +87.117.238.128 - 87.117.255.255 gb 87.118.0.0 - 87.118.63.255 no -87.118.64.0 - 87.118.64.191 de -87.118.64.192 - 87.118.64.223 se -87.118.64.224 - 87.118.64.255 de -87.118.65.0 - 87.118.65.15 it -87.118.65.16 - 87.118.65.191 de -87.118.65.192 - 87.118.65.223 se -87.118.65.224 - 87.118.65.255 de -87.118.66.0 - 87.118.66.255 si -87.118.67.0 - 87.118.67.127 dk -87.118.67.128 - 87.118.67.255 de -87.118.68.0 - 87.118.68.255 dk -87.118.69.0 - 87.118.72.47 de -87.118.72.48 - 87.118.72.63 ru -87.118.72.64 - 87.118.72.175 de -87.118.72.176 - 87.118.72.191 ch -87.118.72.192 - 87.118.73.31 de -87.118.73.32 - 87.118.73.63 hr -87.118.73.64 - 87.118.73.127 se -87.118.73.128 - 87.118.73.143 ru -87.118.73.144 - 87.118.73.159 de -87.118.73.160 - 87.118.73.175 ru -87.118.73.176 - 87.118.73.191 de -87.118.73.192 - 87.118.73.223 sg -87.118.73.224 - 87.118.127.255 de +87.118.64.0 - 87.118.127.255 de 87.118.128.0 - 87.118.191.255 bg 87.118.192.0 - 87.118.255.255 ru 87.119.0.0 - 87.119.63.255 pl @@ -49723,47 +24642,29 @@ 87.119.128.0 - 87.119.159.255 si 87.119.160.0 - 87.119.191.255 ee 87.119.192.0 - 87.119.192.31 nl -87.119.192.32 - 87.119.192.63 at +87.119.192.32 - 87.119.192.63 de 87.119.192.64 - 87.119.192.71 nl -87.119.192.72 - 87.119.192.79 at -87.119.192.80 - 87.119.192.95 nl -87.119.192.96 - 87.119.192.127 at -87.119.192.128 - 87.119.192.255 de +87.119.192.72 - 87.119.192.255 de 87.119.193.0 - 87.119.193.31 nl -87.119.193.32 - 87.119.193.39 de -87.119.193.40 - 87.119.193.47 at -87.119.193.48 - 87.119.193.127 nl -87.119.193.128 - 87.119.193.159 de -87.119.193.160 - 87.119.193.191 nl -87.119.193.192 - 87.119.193.231 de -87.119.193.232 - 87.119.193.239 vg -87.119.193.240 - 87.119.193.255 nl -87.119.194.0 - 87.119.194.31 de -87.119.194.32 - 87.119.194.255 nl -87.119.195.0 - 87.119.197.63 de -87.119.197.64 - 87.119.197.95 ch -87.119.197.96 - 87.119.223.255 de +87.119.193.32 - 87.119.194.255 de +87.119.195.0 - 87.119.195.255 nl +87.119.196.0 - 87.119.202.255 de +87.119.203.0 - 87.119.203.255 a1 +87.119.204.0 - 87.119.219.255 de +87.119.220.0 - 87.119.223.255 nl 87.119.224.0 - 87.119.255.255 ru 87.120.0.0 - 87.121.255.255 bg 87.122.0.0 - 87.123.255.255 de -87.124.0.0 - 87.125.255.255 gb +87.124.0.0 - 87.124.127.255 gb +87.124.128.0 - 87.124.191.255 es +87.124.192.0 - 87.125.255.255 gb 87.126.0.0 - 87.126.255.255 bg 87.127.0.0 - 87.127.255.255 gb 87.128.0.0 - 87.191.255.255 de -87.192.0.0 - 87.192.100.159 ie -87.192.100.160 - 87.192.100.175 gb -87.192.100.176 - 87.192.228.135 ie -87.192.228.136 - 87.192.228.159 gb -87.192.228.160 - 87.192.228.175 ie -87.192.228.176 - 87.192.228.183 gb -87.192.228.184 - 87.192.250.95 ie -87.192.250.96 - 87.192.250.103 gb -87.192.250.104 - 87.192.255.255 ie -87.193.0.0 - 87.193.187.223 de -87.193.187.224 - 87.193.187.231 a2 -87.193.187.232 - 87.193.251.203 de -87.193.251.204 - 87.193.251.204 a2 -87.193.251.205 - 87.193.255.255 de +87.192.0.0 - 87.192.227.255 ie +87.192.228.0 - 87.192.228.255 gb +87.192.229.0 - 87.192.255.255 ie +87.193.0.0 - 87.193.255.255 de 87.194.0.0 - 87.194.255.255 gb 87.195.0.0 - 87.195.255.255 nl 87.196.0.0 - 87.196.255.255 pt @@ -49773,9 +24674,9 @@ 87.200.0.0 - 87.201.255.255 ae 87.202.0.0 - 87.203.255.255 gr 87.204.0.0 - 87.207.255.255 pl -87.208.0.0 - 87.215.63.255 nl -87.215.64.0 - 87.215.127.255 be -87.215.128.0 - 87.215.255.255 nl +87.208.0.0 - 87.213.40.255 nl +87.213.41.0 - 87.213.41.255 us +87.213.42.0 - 87.215.255.255 nl 87.216.0.0 - 87.223.255.255 es 87.224.0.0 - 87.224.127.255 gb 87.224.128.0 - 87.225.127.255 ru @@ -49792,25 +24693,20 @@ 87.230.128.0 - 87.230.255.255 sa 87.231.0.0 - 87.231.255.255 fr 87.232.0.0 - 87.232.255.255 ie -87.233.0.0 - 87.233.222.15 nl -87.233.222.16 - 87.233.222.23 us -87.233.222.24 - 87.233.255.255 nl -87.234.0.0 - 87.234.51.201 de -87.234.51.202 - 87.234.51.202 a2 -87.234.51.203 - 87.234.61.63 de -87.234.61.64 - 87.234.61.71 a2 -87.234.61.72 - 87.234.255.255 de +87.233.0.0 - 87.233.255.255 nl +87.234.0.0 - 87.234.246.255 de +87.234.247.0 - 87.234.247.255 a2 +87.234.248.0 - 87.234.255.255 de 87.235.0.0 - 87.235.255.255 es 87.236.0.0 - 87.236.7.255 nl 87.236.8.0 - 87.236.31.255 ru 87.236.32.0 - 87.236.39.255 cy 87.236.40.0 - 87.236.47.255 ru 87.236.48.0 - 87.236.55.255 bh -87.236.56.0 - 87.236.67.255 gb -87.236.68.0 - 87.236.69.255 za -87.236.70.0 - 87.236.71.255 gb +87.236.56.0 - 87.236.71.255 gb 87.236.72.0 - 87.236.79.255 fr 87.236.80.0 - 87.236.87.255 ru +87.236.88.0 - 87.236.95.255 se 87.236.96.0 - 87.236.103.255 nl 87.236.104.0 - 87.236.111.255 de 87.236.112.0 - 87.236.119.255 at @@ -49840,133 +24736,61 @@ 87.237.48.0 - 87.237.79.255 gb 87.237.80.0 - 87.237.87.255 es 87.237.88.0 - 87.237.95.255 de -87.237.96.0 - 87.237.98.135 nl -87.237.98.136 - 87.237.98.143 us -87.237.98.144 - 87.237.103.255 nl +87.237.96.0 - 87.237.103.255 nl 87.237.104.0 - 87.237.111.255 ro 87.237.112.0 - 87.237.119.255 ru -87.237.120.0 - 87.237.123.31 de -87.237.123.32 - 87.237.123.63 lu -87.237.123.64 - 87.237.123.143 de -87.237.123.144 - 87.237.123.159 sc -87.237.123.160 - 87.237.123.207 de -87.237.123.208 - 87.237.123.223 gb -87.237.123.224 - 87.237.123.239 nl -87.237.123.240 - 87.237.125.31 de -87.237.125.32 - 87.237.125.63 lu -87.237.125.64 - 87.237.125.255 de -87.237.126.0 - 87.237.126.255 ro -87.237.127.0 - 87.237.135.255 de +87.237.120.0 - 87.237.135.255 de 87.237.136.0 - 87.237.143.255 ru 87.237.144.0 - 87.237.151.255 gb 87.237.152.0 - 87.237.159.255 se 87.237.160.0 - 87.237.167.255 gb 87.237.168.0 - 87.237.175.255 ch 87.237.176.0 - 87.237.183.255 de -87.237.184.0 - 87.237.187.95 fr -87.237.187.96 - 87.237.187.111 es -87.237.187.112 - 87.237.191.255 fr +87.237.184.0 - 87.237.191.255 fr 87.237.192.0 - 87.237.199.255 bh 87.237.200.0 - 87.237.207.255 rs 87.237.208.0 - 87.237.215.255 se 87.237.216.0 - 87.237.218.255 de 87.237.219.0 - 87.237.219.255 us -87.237.220.0 - 87.237.220.63 jp -87.237.220.64 - 87.237.220.127 us -87.237.220.128 - 87.237.220.239 de -87.237.220.240 - 87.237.220.255 nl -87.237.221.0 - 87.237.221.255 hk -87.237.222.0 - 87.237.222.255 de -87.237.223.0 - 87.237.223.15 nl -87.237.223.16 - 87.237.223.31 fr -87.237.223.32 - 87.237.223.47 pt -87.237.223.48 - 87.237.223.63 gb -87.237.223.64 - 87.237.223.79 it -87.237.223.80 - 87.237.223.95 se -87.237.223.96 - 87.237.223.111 ru -87.237.223.112 - 87.237.223.127 es -87.237.223.128 - 87.237.223.143 au -87.237.223.144 - 87.237.223.159 kr -87.237.223.160 - 87.237.223.175 ch -87.237.223.176 - 87.237.223.191 jp -87.237.223.192 - 87.237.223.223 kr -87.237.223.224 - 87.237.223.235 de -87.237.223.236 - 87.237.223.255 us -87.237.224.0 - 87.237.224.95 ae -87.237.224.96 - 87.237.224.127 us -87.237.224.128 - 87.237.224.255 ae -87.237.225.0 - 87.237.225.255 gr -87.237.226.0 - 87.237.227.255 sa -87.237.228.0 - 87.237.231.255 ae +87.237.220.0 - 87.237.220.255 de +87.237.221.0 - 87.237.221.255 ap +87.237.222.0 - 87.237.223.255 de +87.237.224.0 - 87.237.231.255 ae 87.237.232.0 - 87.237.239.255 uz 87.237.240.0 - 87.237.247.255 de 87.237.248.0 - 87.237.255.255 fr 87.238.0.0 - 87.238.31.255 it -87.238.32.0 - 87.238.55.255 no -87.238.56.0 - 87.238.56.63 se -87.238.56.64 - 87.238.56.255 no -87.238.57.0 - 87.238.58.15 se -87.238.58.16 - 87.238.58.63 no -87.238.58.64 - 87.238.58.95 se -87.238.58.96 - 87.238.71.255 no -87.238.72.0 - 87.238.73.255 gb -87.238.74.0 - 87.238.74.255 ie -87.238.75.0 - 87.238.79.255 gb +87.238.32.0 - 87.238.71.255 no +87.238.72.0 - 87.238.79.255 gb 87.238.80.0 - 87.238.87.255 ie 87.238.88.0 - 87.238.95.255 es 87.238.96.0 - 87.238.103.255 ru -87.238.104.0 - 87.238.104.255 mc -87.238.105.0 - 87.238.110.255 fr -87.238.111.0 - 87.238.111.255 mc -87.238.112.0 - 87.238.112.255 de -87.238.113.0 - 87.238.113.255 sd -87.238.114.0 - 87.238.116.127 de -87.238.116.128 - 87.238.116.255 sd -87.238.117.0 - 87.238.119.255 de +87.238.104.0 - 87.238.111.255 fr +87.238.112.0 - 87.238.118.255 de +87.238.119.0 - 87.238.119.255 ru 87.238.120.0 - 87.238.127.255 ch 87.238.128.0 - 87.238.135.255 jo 87.238.136.0 - 87.238.143.255 de 87.238.144.0 - 87.238.151.255 fr 87.238.152.0 - 87.238.159.255 ua -87.238.160.0 - 87.238.163.32 be -87.238.163.33 - 87.238.163.33 nl -87.238.163.34 - 87.238.163.48 be -87.238.163.49 - 87.238.163.49 fr -87.238.163.50 - 87.238.163.187 be -87.238.163.188 - 87.238.163.188 nl -87.238.163.189 - 87.238.163.189 gb -87.238.163.190 - 87.238.163.190 be -87.238.163.191 - 87.238.163.192 gb -87.238.163.193 - 87.238.163.194 nl -87.238.163.195 - 87.238.163.198 be -87.238.163.199 - 87.238.163.199 nl -87.238.163.200 - 87.238.163.202 be -87.238.163.203 - 87.238.163.203 de -87.238.163.204 - 87.238.163.207 be -87.238.163.208 - 87.238.163.208 gb -87.238.163.209 - 87.238.163.209 nl -87.238.163.210 - 87.238.163.210 be -87.238.163.211 - 87.238.163.211 es -87.238.163.212 - 87.238.163.212 gb -87.238.163.213 - 87.238.167.65 be -87.238.167.66 - 87.238.167.95 nl -87.238.167.96 - 87.238.167.255 be +87.238.160.0 - 87.238.167.255 be 87.238.168.0 - 87.238.175.255 nl 87.238.176.0 - 87.238.183.255 fr 87.238.184.0 - 87.238.199.255 de 87.238.200.0 - 87.238.207.255 gb 87.238.208.0 - 87.238.215.255 rs -87.238.216.0 - 87.238.223.255 gb +87.238.216.0 - 87.238.218.255 gb +87.238.219.0 - 87.238.219.127 us +87.238.219.128 - 87.238.223.255 gb 87.238.224.0 - 87.238.231.255 be 87.238.232.0 - 87.238.239.255 ru 87.238.240.0 - 87.238.247.255 es 87.238.248.0 - 87.238.255.255 dk -87.239.0.0 - 87.239.7.255 pl +87.239.0.0 - 87.239.7.255 ru 87.239.8.0 - 87.239.15.255 nl 87.239.16.0 - 87.239.23.255 gb 87.239.24.0 - 87.239.39.255 ru 87.239.40.0 - 87.239.47.255 pl -87.239.48.0 - 87.239.55.255 gb 87.239.56.0 - 87.239.63.255 sk 87.239.64.0 - 87.239.71.255 dk 87.239.72.0 - 87.239.79.255 pl @@ -49977,7 +24801,8 @@ 87.239.112.0 - 87.239.119.255 lt 87.239.120.0 - 87.239.127.255 fi 87.239.128.0 - 87.239.135.255 de -87.239.136.0 - 87.239.143.255 us +87.239.136.0 - 87.239.142.255 us +87.239.143.0 - 87.239.143.255 de 87.239.144.0 - 87.239.151.255 ru 87.239.152.0 - 87.239.159.255 bg 87.239.160.0 - 87.239.167.255 ro @@ -49990,130 +24815,83 @@ 87.239.224.0 - 87.239.231.255 ro 87.239.232.0 - 87.239.239.255 gr 87.239.240.0 - 87.239.247.255 pl -87.239.248.0 - 87.239.255.255 ro +87.239.248.0 - 87.239.248.255 es +87.239.249.0 - 87.239.253.255 nl +87.239.254.0 - 87.239.255.255 gb 87.240.0.0 - 87.240.63.255 ru 87.240.64.0 - 87.240.127.255 fr 87.240.128.0 - 87.240.191.255 ru 87.240.192.0 - 87.240.255.255 lu -87.241.0.0 - 87.241.1.159 it -87.241.1.160 - 87.241.1.167 es -87.241.1.168 - 87.241.23.119 it -87.241.23.120 - 87.241.23.127 a2 -87.241.23.128 - 87.241.63.255 it +87.241.0.0 - 87.241.63.255 it 87.241.64.0 - 87.241.127.255 se 87.241.128.0 - 87.241.191.255 am 87.241.192.0 - 87.241.255.255 ru 87.242.0.0 - 87.242.63.255 hu 87.242.64.0 - 87.242.127.255 ru 87.242.128.0 - 87.242.255.255 gb -87.243.0.0 - 87.243.63.255 ro -87.243.64.0 - 87.243.76.255 gr -87.243.77.0 - 87.243.77.255 bg -87.243.78.0 - 87.243.111.255 gr +87.243.0.0 - 87.243.7.255 ro +87.243.8.0 - 87.243.63.255 kz +87.243.64.0 - 87.243.111.255 gr 87.243.112.0 - 87.243.115.255 bg 87.243.116.0 - 87.243.127.255 gr 87.243.128.0 - 87.243.191.255 at 87.243.192.0 - 87.243.255.255 gb 87.244.0.0 - 87.244.63.255 ru -87.244.64.0 - 87.244.73.255 je -87.244.74.0 - 87.244.74.135 gb -87.244.74.136 - 87.244.74.143 je -87.244.74.144 - 87.244.74.168 gb -87.244.74.169 - 87.244.74.175 je -87.244.74.176 - 87.244.74.255 gb -87.244.75.0 - 87.244.100.255 je -87.244.101.0 - 87.244.101.63 gb -87.244.101.64 - 87.244.101.127 je -87.244.101.128 - 87.244.102.31 gb -87.244.102.32 - 87.244.102.39 je -87.244.102.40 - 87.244.102.47 gb -87.244.102.48 - 87.244.102.63 je -87.244.102.64 - 87.244.102.71 gb -87.244.102.72 - 87.244.103.23 je -87.244.103.24 - 87.244.103.31 gb -87.244.103.32 - 87.244.107.255 je -87.244.108.0 - 87.244.108.175 gb -87.244.108.176 - 87.244.108.191 je -87.244.108.192 - 87.244.108.207 gb -87.244.108.208 - 87.244.108.223 je -87.244.108.224 - 87.244.108.255 gb -87.244.109.0 - 87.244.109.255 je -87.244.110.0 - 87.244.112.255 gb -87.244.113.0 - 87.244.117.255 je -87.244.118.0 - 87.244.119.142 gb -87.244.119.143 - 87.244.119.143 je -87.244.119.144 - 87.244.119.176 gb -87.244.119.177 - 87.244.119.183 je -87.244.119.184 - 87.244.119.223 gb -87.244.119.224 - 87.244.119.231 bb -87.244.119.232 - 87.244.119.255 je -87.244.120.0 - 87.244.120.47 gb -87.244.120.48 - 87.244.120.55 je -87.244.120.56 - 87.244.120.79 gb -87.244.120.80 - 87.244.120.87 je -87.244.120.88 - 87.244.120.231 gb -87.244.120.232 - 87.244.120.247 je -87.244.120.248 - 87.244.121.43 gb -87.244.121.44 - 87.244.121.47 je -87.244.121.48 - 87.244.121.255 gb -87.244.122.0 - 87.244.127.255 je +87.244.64.0 - 87.244.117.255 je +87.244.118.0 - 87.244.118.255 gb +87.244.119.0 - 87.244.120.95 je +87.244.120.96 - 87.244.120.103 gb +87.244.120.104 - 87.244.120.183 je +87.244.120.184 - 87.244.120.191 gb +87.244.120.192 - 87.244.121.7 je +87.244.121.8 - 87.244.121.15 gb +87.244.121.16 - 87.244.121.31 je +87.244.121.32 - 87.244.121.39 gb +87.244.121.40 - 87.244.121.143 je +87.244.121.144 - 87.244.121.151 gb +87.244.121.152 - 87.244.127.255 je 87.244.128.0 - 87.244.191.255 ua 87.244.192.0 - 87.244.255.255 sk 87.245.0.0 - 87.245.63.255 de 87.245.64.0 - 87.245.127.255 ch 87.245.128.0 - 87.245.191.255 ru -87.245.192.0 - 87.245.199.255 cy -87.245.200.0 - 87.245.202.127 ru -87.245.202.128 - 87.245.203.127 gb -87.245.203.128 - 87.245.203.255 ru -87.245.204.0 - 87.245.204.127 gb -87.245.204.128 - 87.245.204.191 ru -87.245.204.192 - 87.245.204.255 gb +87.245.192.0 - 87.245.194.63 gb +87.245.194.64 - 87.245.194.127 ru +87.245.194.128 - 87.245.194.191 gb +87.245.194.192 - 87.245.194.255 ru +87.245.195.0 - 87.245.195.191 gb +87.245.195.192 - 87.245.195.255 ru +87.245.196.0 - 87.245.196.63 gb +87.245.196.64 - 87.245.196.127 ru +87.245.196.128 - 87.245.196.191 gb +87.245.196.192 - 87.245.196.255 ru +87.245.197.0 - 87.245.198.66 gb +87.245.198.67 - 87.245.198.67 ru +87.245.198.68 - 87.245.198.69 gb +87.245.198.70 - 87.245.198.70 ru +87.245.198.71 - 87.245.198.127 gb +87.245.198.128 - 87.245.199.127 ru +87.245.199.128 - 87.245.199.255 gb +87.245.200.0 - 87.245.200.255 ru +87.245.201.0 - 87.245.204.255 gb 87.245.205.0 - 87.245.205.255 ru -87.245.206.0 - 87.245.206.255 gb -87.245.207.0 - 87.245.207.63 ru -87.245.207.64 - 87.245.207.239 gb -87.245.207.240 - 87.245.207.255 ru -87.245.208.0 - 87.245.208.31 fi -87.245.208.32 - 87.245.208.255 gb -87.245.209.0 - 87.245.209.7 fi -87.245.209.8 - 87.245.209.15 gb -87.245.209.16 - 87.245.209.23 fi -87.245.209.24 - 87.245.209.191 gb -87.245.209.192 - 87.245.209.255 fi -87.245.210.0 - 87.245.214.191 gb -87.245.214.192 - 87.245.214.207 de -87.245.214.208 - 87.245.214.255 gb -87.245.215.0 - 87.245.215.63 at -87.245.215.64 - 87.245.215.255 gb -87.245.216.0 - 87.245.223.255 ua -87.245.224.0 - 87.245.227.255 gb -87.245.228.0 - 87.245.229.255 ru -87.245.230.0 - 87.245.236.255 gb -87.245.237.0 - 87.245.237.127 ua -87.245.237.128 - 87.245.238.255 gb -87.245.239.0 - 87.245.239.255 ua -87.245.240.0 - 87.245.240.255 us -87.245.241.0 - 87.245.241.191 ru -87.245.241.192 - 87.245.241.255 gb -87.245.242.0 - 87.245.242.63 lv -87.245.242.64 - 87.245.242.127 ee -87.245.242.128 - 87.245.242.191 gb -87.245.242.192 - 87.245.242.255 hu -87.245.243.0 - 87.245.243.127 ru -87.245.243.128 - 87.245.243.255 ua -87.245.244.0 - 87.245.244.255 ru -87.245.245.0 - 87.245.245.127 gb -87.245.245.128 - 87.245.245.191 fr -87.245.245.192 - 87.245.245.255 pl -87.245.246.0 - 87.245.246.63 nl -87.245.246.64 - 87.245.246.127 cz -87.245.246.128 - 87.245.246.191 de -87.245.246.192 - 87.245.246.255 at -87.245.247.0 - 87.245.247.255 ua -87.245.248.0 - 87.245.248.255 fi -87.245.249.0 - 87.245.249.255 se -87.245.250.0 - 87.245.255.255 ru +87.245.206.0 - 87.245.212.255 gb +87.245.213.0 - 87.245.213.127 pl +87.245.213.128 - 87.245.215.255 gb +87.245.216.0 - 87.245.216.127 ua +87.245.216.128 - 87.245.216.255 gb +87.245.217.0 - 87.245.217.7 ua +87.245.217.8 - 87.245.217.127 gb +87.245.217.128 - 87.245.217.191 ua +87.245.217.192 - 87.245.221.63 gb +87.245.221.64 - 87.245.221.127 ua +87.245.221.128 - 87.245.222.63 gb +87.245.222.64 - 87.245.222.127 ua +87.245.222.128 - 87.245.222.191 gb +87.245.222.192 - 87.245.222.223 ua +87.245.222.224 - 87.245.249.255 gb +87.245.250.0 - 87.245.252.255 ru +87.245.253.0 - 87.245.255.255 gb 87.246.0.0 - 87.246.63.255 bg 87.246.64.0 - 87.246.127.255 gb 87.246.128.0 - 87.246.191.255 lv @@ -50130,32 +24908,18 @@ 87.248.0.0 - 87.248.31.255 no 87.248.32.0 - 87.248.63.255 it 87.248.64.0 - 87.248.95.255 pl -87.248.96.0 - 87.248.96.255 gb -87.248.97.0 - 87.248.103.255 ie -87.248.104.0 - 87.248.113.255 gb -87.248.114.0 - 87.248.119.255 ie -87.248.120.0 - 87.248.127.255 ch +87.248.96.0 - 87.248.127.255 gb 87.248.128.0 - 87.248.159.255 ir 87.248.160.0 - 87.248.191.255 md 87.248.192.0 - 87.248.223.255 it 87.248.224.0 - 87.249.63.255 ru -87.249.64.0 - 87.249.65.255 ae -87.249.66.0 - 87.249.67.255 a2 -87.249.68.0 - 87.249.73.255 gb -87.249.74.0 - 87.249.76.127 ng -87.249.76.128 - 87.249.76.255 gh -87.249.77.0 - 87.249.77.255 gb -87.249.78.0 - 87.249.79.127 ng -87.249.79.128 - 87.249.79.255 gh -87.249.80.0 - 87.249.82.255 gb -87.249.83.0 - 87.249.83.255 in -87.249.84.0 - 87.249.84.255 af -87.249.85.0 - 87.249.88.255 gb -87.249.89.0 - 87.249.89.7 us -87.249.89.8 - 87.249.89.255 a2 -87.249.90.0 - 87.249.93.143 gb -87.249.93.144 - 87.249.93.255 a2 -87.249.94.0 - 87.249.95.255 gb +87.249.64.0 - 87.249.69.255 a2 +87.249.70.0 - 87.249.71.255 no +87.249.72.0 - 87.249.74.47 a2 +87.249.74.48 - 87.249.74.55 ng +87.249.74.56 - 87.249.86.255 a2 +87.249.87.0 - 87.249.87.255 no +87.249.88.0 - 87.249.95.255 a2 87.249.96.0 - 87.249.127.255 nl 87.249.128.0 - 87.249.159.255 cz 87.249.160.0 - 87.249.191.255 se @@ -50167,43 +24931,21 @@ 87.250.160.0 - 87.250.191.255 pl 87.250.192.0 - 87.250.255.255 ru 87.251.0.0 - 87.251.31.255 tr -87.251.32.0 - 87.251.41.87 nl -87.251.41.88 - 87.251.41.95 de -87.251.41.96 - 87.251.47.191 nl -87.251.47.192 - 87.251.47.211 de -87.251.47.212 - 87.251.63.255 nl +87.251.32.0 - 87.251.63.255 nl 87.251.64.0 - 87.251.191.255 ru 87.251.192.0 - 87.251.223.255 se 87.251.224.0 - 87.251.255.255 pl -87.252.0.0 - 87.252.7.255 fr -87.252.8.0 - 87.252.8.255 gb -87.252.9.0 - 87.252.31.255 fr +87.252.0.0 - 87.252.31.255 fr 87.252.32.0 - 87.252.63.255 gb 87.252.64.0 - 87.252.95.255 no -87.252.96.0 - 87.252.96.95 bh -87.252.96.96 - 87.252.96.191 br -87.252.96.192 - 87.252.96.255 bh -87.252.97.0 - 87.252.97.127 br -87.252.97.128 - 87.252.97.159 bh -87.252.97.160 - 87.252.97.191 br -87.252.97.192 - 87.252.97.255 bh -87.252.98.0 - 87.252.98.31 br -87.252.98.32 - 87.252.98.127 bh -87.252.98.128 - 87.252.99.191 br -87.252.99.192 - 87.252.99.255 bh -87.252.100.0 - 87.252.101.255 br -87.252.102.0 - 87.252.102.255 bh -87.252.103.0 - 87.252.103.255 jo -87.252.104.0 - 87.252.104.207 gb -87.252.104.208 - 87.252.104.239 bh -87.252.104.240 - 87.252.105.207 gb -87.252.105.208 - 87.252.105.239 bh -87.252.105.240 - 87.252.125.255 gb -87.252.126.0 - 87.252.126.255 bh -87.252.127.0 - 87.252.127.255 jo +87.252.96.0 - 87.252.107.255 bh +87.252.108.0 - 87.252.123.255 gb +87.252.124.0 - 87.252.127.255 bh 87.252.128.0 - 87.252.159.255 hr 87.252.160.0 - 87.252.191.255 bg -87.252.192.0 - 87.252.223.255 ie +87.252.192.0 - 87.252.208.255 gb +87.252.209.0 - 87.252.209.15 ie +87.252.209.16 - 87.252.223.255 gb 87.252.224.0 - 87.252.255.255 by 87.253.0.0 - 87.253.31.255 ru 87.253.32.0 - 87.253.63.255 ge @@ -50211,19 +24953,21 @@ 87.253.96.0 - 87.253.127.255 it 87.253.128.0 - 87.253.159.255 nl 87.253.160.0 - 87.253.191.255 de -87.253.192.0 - 87.253.255.255 ru +87.253.192.0 - 87.253.223.255 ru +87.253.224.0 - 87.253.231.255 es +87.253.232.0 - 87.253.239.255 fr +87.253.240.0 - 87.253.255.255 de 87.254.0.0 - 87.254.31.255 gb 87.254.32.0 - 87.254.63.255 no 87.254.64.0 - 87.254.95.255 im 87.254.96.0 - 87.254.127.255 lu 87.254.128.0 - 87.254.159.255 ru 87.254.160.0 - 87.254.191.255 bg -87.254.192.0 - 87.254.199.255 fi +87.254.192.0 - 87.254.199.255 de 87.254.200.0 - 87.254.203.255 us -87.254.204.0 - 87.254.205.255 sg -87.254.206.0 - 87.254.207.255 fi -87.254.208.0 - 87.254.223.127 de -87.254.223.128 - 87.254.223.255 fi +87.254.204.0 - 87.254.207.255 fi +87.254.208.0 - 87.254.215.255 de +87.254.216.0 - 87.254.223.255 fi 87.254.224.0 - 87.254.255.255 mc 87.255.0.0 - 87.255.31.255 ru 87.255.32.0 - 87.255.63.255 nl @@ -50234,26 +24978,24 @@ 87.255.192.0 - 87.255.223.255 kz 87.255.224.0 - 87.255.255.255 ru 88.0.0.0 - 88.31.255.255 es -88.32.0.0 - 88.63.255.255 it +88.32.0.0 - 88.53.116.255 it +88.53.117.0 - 88.53.117.255 us +88.53.118.0 - 88.63.255.255 it 88.64.0.0 - 88.79.255.255 de 88.80.0.0 - 88.80.31.255 se 88.80.32.0 - 88.80.63.255 ru 88.80.64.0 - 88.80.95.255 it 88.80.96.0 - 88.80.159.255 bg -88.80.160.0 - 88.80.163.127 se -88.80.163.128 - 88.80.163.159 gb -88.80.163.160 - 88.80.166.255 se -88.80.167.0 - 88.80.167.3 gb -88.80.167.4 - 88.80.191.255 se +88.80.160.0 - 88.80.183.255 se +88.80.184.0 - 88.80.191.255 gb 88.80.192.0 - 88.80.223.255 de 88.80.224.0 - 88.80.255.255 sk 88.81.0.0 - 88.81.31.255 sa 88.81.32.0 - 88.81.63.255 ru 88.81.64.0 - 88.81.95.255 cz 88.81.96.0 - 88.81.127.255 ie -88.81.128.0 - 88.81.149.255 gg -88.81.150.0 - 88.81.150.255 gb -88.81.151.0 - 88.81.159.255 gg +88.81.128.0 - 88.81.146.255 gg +88.81.147.0 - 88.81.159.255 gb 88.81.160.0 - 88.81.191.255 it 88.81.192.0 - 88.81.223.255 ru 88.81.224.0 - 88.81.255.255 ua @@ -50266,46 +25008,30 @@ 88.82.192.0 - 88.82.223.255 es 88.82.224.0 - 88.82.255.255 de 88.83.0.0 - 88.83.31.255 gl -88.83.32.0 - 88.83.63.255 se +88.83.32.0 - 88.83.33.63 se +88.83.33.64 - 88.83.33.95 no +88.83.33.96 - 88.83.63.255 se 88.83.64.0 - 88.83.95.255 dk 88.83.96.0 - 88.83.127.255 gb 88.83.128.0 - 88.83.159.255 se 88.83.160.0 - 88.83.191.255 cz 88.83.192.0 - 88.83.223.255 ru -88.83.224.0 - 88.83.228.255 cz -88.83.229.0 - 88.83.229.255 sk -88.83.230.0 - 88.83.230.255 cz +88.83.224.0 - 88.83.230.255 cz 88.83.231.0 - 88.83.231.255 sk 88.83.232.0 - 88.83.255.255 cz 88.84.0.0 - 88.84.31.255 ch 88.84.32.0 - 88.84.63.255 no 88.84.64.0 - 88.84.95.255 es 88.84.96.0 - 88.84.127.255 sa -88.84.128.0 - 88.84.159.255 de +88.84.128.0 - 88.84.130.255 de +88.84.131.0 - 88.84.131.31 gb +88.84.131.32 - 88.84.159.255 de 88.84.160.0 - 88.84.191.255 no 88.84.192.0 - 88.84.223.255 ru 88.84.224.0 - 88.84.255.255 se 88.85.0.0 - 88.85.31.255 ch 88.85.32.0 - 88.85.63.255 fo -88.85.64.0 - 88.85.72.127 nl -88.85.72.128 - 88.85.72.255 pa -88.85.73.0 - 88.85.73.127 nl -88.85.73.128 - 88.85.73.255 gi -88.85.74.0 - 88.85.74.127 cy -88.85.74.128 - 88.85.75.255 nl -88.85.76.0 - 88.85.76.255 mt -88.85.77.0 - 88.85.84.255 nl -88.85.85.0 - 88.85.85.255 gb -88.85.86.0 - 88.85.87.127 nl -88.85.87.128 - 88.85.87.191 pa -88.85.87.192 - 88.85.87.255 nl -88.85.88.0 - 88.85.88.63 gi -88.85.88.64 - 88.85.88.71 ru -88.85.88.72 - 88.85.88.223 nl -88.85.88.224 - 88.85.88.239 bz -88.85.88.240 - 88.85.88.255 nl -88.85.89.0 - 88.85.89.255 gb -88.85.90.0 - 88.85.95.255 nl +88.85.64.0 - 88.85.95.255 nl 88.85.96.0 - 88.85.127.255 mk 88.85.128.0 - 88.85.159.255 fi 88.85.160.0 - 88.85.223.255 ru @@ -50313,21 +25039,15 @@ 88.86.0.0 - 88.86.31.255 sy 88.86.32.0 - 88.86.63.255 se 88.86.64.0 - 88.86.95.255 ru -88.86.96.0 - 88.86.116.119 cz -88.86.116.120 - 88.86.116.127 sk -88.86.116.128 - 88.86.127.255 cz +88.86.96.0 - 88.86.127.255 cz 88.86.128.0 - 88.86.159.255 fi -88.86.160.0 - 88.86.176.223 it -88.86.176.224 - 88.86.176.255 mt -88.86.177.0 - 88.86.191.255 it +88.86.160.0 - 88.86.191.255 it 88.86.192.0 - 88.86.223.255 ru 88.86.224.0 - 88.86.255.255 fr 88.87.0.0 - 88.87.31.255 bg 88.87.32.0 - 88.87.63.255 no 88.87.64.0 - 88.87.95.255 ru -88.87.96.0 - 88.87.119.19 it -88.87.119.20 - 88.87.119.23 tr -88.87.119.24 - 88.87.127.255 it +88.87.96.0 - 88.87.127.255 it 88.87.128.0 - 88.87.159.255 es 88.87.160.0 - 88.87.191.255 ie 88.87.192.0 - 88.87.223.255 es @@ -50337,15 +25057,7 @@ 88.100.0.0 - 88.103.255.255 cz 88.104.0.0 - 88.111.255.255 gb 88.112.0.0 - 88.115.255.255 fi -88.116.0.0 - 88.116.160.79 at -88.116.160.80 - 88.116.160.83 a2 -88.116.160.84 - 88.116.160.99 at -88.116.160.100 - 88.116.160.103 a2 -88.116.160.104 - 88.116.160.107 at -88.116.160.108 - 88.116.160.111 a2 -88.116.160.112 - 88.116.160.247 at -88.116.160.248 - 88.116.160.255 a2 -88.116.161.0 - 88.117.255.255 at +88.116.0.0 - 88.117.255.255 at 88.118.0.0 - 88.119.255.255 lt 88.120.0.0 - 88.127.255.255 fr 88.128.0.0 - 88.128.255.255 de @@ -50357,8 +25069,9 @@ 88.135.0.0 - 88.135.15.255 ru 88.135.16.0 - 88.135.31.255 ua 88.135.32.0 - 88.135.47.255 ir -88.135.48.0 - 88.135.63.255 ru -88.135.64.0 - 88.135.95.255 ua +88.135.48.0 - 88.135.64.255 ru +88.135.80.0 - 88.135.80.255 ua +88.135.81.0 - 88.135.95.255 ru 88.135.96.0 - 88.135.111.255 ro 88.135.112.0 - 88.135.127.255 ua 88.135.128.0 - 88.135.159.255 lv @@ -50367,46 +25080,32 @@ 88.136.0.0 - 88.143.255.255 fr 88.144.0.0 - 88.145.255.255 gb 88.146.0.0 - 88.146.255.255 cz -88.147.0.0 - 88.147.127.255 be +88.147.0.0 - 88.147.127.255 it 88.147.128.0 - 88.147.255.255 ru 88.148.0.0 - 88.148.127.255 es 88.148.128.0 - 88.148.255.255 fi 88.149.0.0 - 88.149.127.255 is -88.149.128.0 - 88.149.202.103 it -88.149.202.104 - 88.149.202.111 gb -88.149.202.112 - 88.149.255.255 it +88.149.128.0 - 88.149.255.255 it 88.150.0.0 - 88.150.127.255 de -88.150.128.0 - 88.150.255.255 rs -88.151.0.0 - 88.151.0.15 ie -88.151.0.16 - 88.151.0.127 gb -88.151.0.128 - 88.151.0.159 ie -88.151.0.160 - 88.151.0.255 gb -88.151.1.0 - 88.151.1.15 ie -88.151.1.16 - 88.151.1.255 gb -88.151.2.0 - 88.151.2.31 ie -88.151.2.32 - 88.151.7.255 gb +88.150.128.0 - 88.151.7.255 gb 88.151.8.0 - 88.151.15.255 ru 88.151.16.0 - 88.151.23.255 es 88.151.24.0 - 88.151.31.255 ie 88.151.32.0 - 88.151.39.255 nl -88.151.40.0 - 88.151.46.143 dk -88.151.46.144 - 88.151.46.159 se -88.151.46.160 - 88.151.47.255 dk -88.151.48.0 - 88.151.54.255 is -88.151.55.0 - 88.151.55.255 gb -88.151.56.0 - 88.151.63.255 no +88.151.40.0 - 88.151.47.255 gb +88.151.48.0 - 88.151.55.255 is +88.151.56.0 - 88.151.63.255 hu 88.151.64.0 - 88.151.71.255 de 88.151.72.0 - 88.151.79.255 at 88.151.80.0 - 88.151.87.255 ie 88.151.88.0 - 88.151.95.255 ru 88.151.96.0 - 88.151.103.255 hu -88.151.104.0 - 88.151.114.255 ru -88.151.115.0 - 88.151.115.255 us -88.151.116.0 - 88.151.119.255 ru +88.151.104.0 - 88.151.119.255 ru 88.151.120.0 - 88.151.127.255 nl 88.151.128.0 - 88.151.135.255 gb 88.151.136.0 - 88.151.143.255 pl 88.151.144.0 - 88.151.151.255 ch +88.151.152.0 - 88.151.159.255 gb 88.151.160.0 - 88.151.167.255 no 88.151.168.0 - 88.151.175.255 se 88.151.176.0 - 88.151.183.255 kz @@ -50431,229 +25130,94 @@ 88.196.0.0 - 88.196.255.255 ee 88.197.0.0 - 88.197.127.255 gr 88.197.128.0 - 88.197.255.255 be -88.198.0.0 - 88.198.71.79 de -88.198.71.80 - 88.198.71.87 it -88.198.71.88 - 88.198.84.127 de -88.198.84.128 - 88.198.84.135 it -88.198.84.136 - 88.198.121.127 de -88.198.121.128 - 88.198.121.255 tr -88.198.122.0 - 88.198.131.95 de -88.198.131.96 - 88.198.131.103 it -88.198.131.104 - 88.198.131.167 de -88.198.131.168 - 88.198.131.175 es -88.198.131.176 - 88.198.131.183 de -88.198.131.184 - 88.198.131.191 es -88.198.131.192 - 88.198.255.255 de +88.198.0.0 - 88.198.255.255 de 88.199.0.0 - 88.199.255.255 pl 88.200.0.0 - 88.200.127.255 si 88.200.128.0 - 88.200.255.255 ru 88.201.0.0 - 88.201.127.255 bh 88.201.128.0 - 88.201.255.255 ru -88.202.0.0 - 88.202.7.255 it -88.202.8.0 - 88.202.9.254 gb -88.202.9.255 - 88.202.9.255 a2 -88.202.10.0 - 88.202.13.255 it -88.202.14.0 - 88.202.14.255 fr -88.202.15.0 - 88.202.17.255 it -88.202.18.0 - 88.202.19.255 a2 -88.202.20.0 - 88.202.20.255 it -88.202.21.0 - 88.202.21.255 fr -88.202.22.0 - 88.202.28.255 it -88.202.29.0 - 88.202.29.255 fr -88.202.30.0 - 88.202.32.255 it -88.202.33.0 - 88.202.33.255 hk -88.202.34.0 - 88.202.35.255 it -88.202.36.0 - 88.202.36.255 fr -88.202.37.0 - 88.202.43.255 it -88.202.44.0 - 88.202.45.255 a2 -88.202.46.0 - 88.202.47.255 it -88.202.48.0 - 88.202.52.255 a2 -88.202.53.0 - 88.202.53.255 it -88.202.54.0 - 88.202.54.255 a2 -88.202.55.0 - 88.202.59.255 it -88.202.60.0 - 88.202.63.255 a2 +88.202.0.0 - 88.202.3.255 fr +88.202.4.0 - 88.202.7.255 it +88.202.8.0 - 88.202.9.255 eu +88.202.10.0 - 88.202.13.255 fr +88.202.14.0 - 88.202.14.255 eu +88.202.15.0 - 88.202.16.255 fr +88.202.17.0 - 88.202.18.255 eu +88.202.19.0 - 88.202.23.255 fr +88.202.24.0 - 88.202.24.255 eu +88.202.25.0 - 88.202.29.255 fr +88.202.30.0 - 88.202.30.255 eu +88.202.31.0 - 88.202.31.255 fr +88.202.32.0 - 88.202.32.127 pt +88.202.32.128 - 88.202.32.255 gr +88.202.33.0 - 88.202.35.255 fr +88.202.36.0 - 88.202.36.255 eu +88.202.37.0 - 88.202.41.255 fr +88.202.42.0 - 88.202.42.255 eu +88.202.43.0 - 88.202.43.255 fr +88.202.44.0 - 88.202.44.255 iq +88.202.45.0 - 88.202.45.255 it +88.202.46.0 - 88.202.48.255 eu +88.202.49.0 - 88.202.49.255 it +88.202.50.0 - 88.202.55.255 eu +88.202.56.0 - 88.202.58.255 fr +88.202.59.0 - 88.202.59.255 gr +88.202.60.0 - 88.202.63.255 eu 88.202.64.0 - 88.202.67.255 fr -88.202.68.0 - 88.202.69.255 a2 -88.202.70.0 - 88.202.79.255 it -88.202.80.0 - 88.202.95.255 a2 -88.202.96.0 - 88.202.104.15 it -88.202.104.16 - 88.202.104.31 fr -88.202.104.32 - 88.202.104.47 de -88.202.104.48 - 88.202.104.63 cy -88.202.104.64 - 88.202.104.79 fi -88.202.104.80 - 88.202.104.95 gr -88.202.104.96 - 88.202.104.111 ie -88.202.104.112 - 88.202.104.127 es -88.202.104.128 - 88.202.104.143 pl -88.202.104.144 - 88.202.104.159 gb -88.202.104.160 - 88.202.104.175 ad -88.202.104.176 - 88.202.104.191 ae -88.202.104.192 - 88.202.104.207 al -88.202.104.208 - 88.202.104.223 am -88.202.104.224 - 88.202.104.239 at -88.202.104.240 - 88.202.104.255 ba -88.202.105.0 - 88.202.105.15 be -88.202.105.16 - 88.202.105.31 bg -88.202.105.32 - 88.202.105.47 bh -88.202.105.48 - 88.202.105.63 by -88.202.105.64 - 88.202.105.79 ch -88.202.105.80 - 88.202.105.95 cz -88.202.105.96 - 88.202.105.111 dk -88.202.105.112 - 88.202.105.127 dz -88.202.105.128 - 88.202.105.143 ee -88.202.105.144 - 88.202.105.159 eg -88.202.105.160 - 88.202.105.175 hr -88.202.105.176 - 88.202.105.191 hu -88.202.105.192 - 88.202.105.207 kw -88.202.105.208 - 88.202.105.223 li -88.202.105.224 - 88.202.105.239 lt -88.202.105.240 - 88.202.105.255 lu -88.202.106.0 - 88.202.106.15 lv -88.202.106.16 - 88.202.106.31 ly -88.202.106.32 - 88.202.106.47 ma -88.202.106.48 - 88.202.106.63 mc -88.202.106.64 - 88.202.106.79 md -88.202.106.80 - 88.202.106.95 me -88.202.106.96 - 88.202.106.111 mk -88.202.106.112 - 88.202.106.127 mt -88.202.106.128 - 88.202.106.143 nl -88.202.106.144 - 88.202.106.159 no -88.202.106.160 - 88.202.106.175 om -88.202.106.176 - 88.202.106.191 pt -88.202.106.192 - 88.202.106.207 qa -88.202.106.208 - 88.202.106.223 ro -88.202.106.224 - 88.202.106.239 rs -88.202.106.240 - 88.202.106.255 ru -88.202.107.0 - 88.202.107.15 sa -88.202.107.16 - 88.202.107.31 se -88.202.107.32 - 88.202.107.47 si -88.202.107.48 - 88.202.107.63 sk -88.202.107.64 - 88.202.107.79 sm -88.202.107.80 - 88.202.107.95 tn -88.202.107.96 - 88.202.107.111 tr -88.202.107.112 - 88.202.107.127 ua -88.202.107.128 - 88.202.107.143 va -88.202.107.144 - 88.202.107.255 a2 -88.202.108.0 - 88.202.108.15 it -88.202.108.16 - 88.202.108.31 fr -88.202.108.32 - 88.202.108.47 de -88.202.108.48 - 88.202.108.63 cy -88.202.108.64 - 88.202.108.79 fi -88.202.108.80 - 88.202.108.95 gr -88.202.108.96 - 88.202.108.111 ie -88.202.108.112 - 88.202.108.127 es -88.202.108.128 - 88.202.108.143 pl -88.202.108.144 - 88.202.108.159 gb -88.202.108.160 - 88.202.108.175 ad -88.202.108.176 - 88.202.108.191 ae -88.202.108.192 - 88.202.108.207 al -88.202.108.208 - 88.202.108.223 am -88.202.108.224 - 88.202.108.239 at -88.202.108.240 - 88.202.108.255 ba -88.202.109.0 - 88.202.109.15 be -88.202.109.16 - 88.202.109.31 bg -88.202.109.32 - 88.202.109.47 bh -88.202.109.48 - 88.202.109.63 by -88.202.109.64 - 88.202.109.79 ch -88.202.109.80 - 88.202.109.95 cz -88.202.109.96 - 88.202.109.111 dk -88.202.109.112 - 88.202.109.127 dz -88.202.109.128 - 88.202.109.143 ee -88.202.109.144 - 88.202.109.159 eg -88.202.109.160 - 88.202.109.175 hr -88.202.109.176 - 88.202.109.191 hu -88.202.109.192 - 88.202.109.207 kw -88.202.109.208 - 88.202.109.223 li -88.202.109.224 - 88.202.109.239 lt -88.202.109.240 - 88.202.109.255 lu -88.202.110.0 - 88.202.110.15 lv -88.202.110.16 - 88.202.110.31 ly -88.202.110.32 - 88.202.110.47 ma -88.202.110.48 - 88.202.110.63 mc -88.202.110.64 - 88.202.110.79 md -88.202.110.80 - 88.202.110.95 me -88.202.110.96 - 88.202.110.111 mk -88.202.110.112 - 88.202.110.127 mt -88.202.110.128 - 88.202.110.143 nl -88.202.110.144 - 88.202.110.159 no -88.202.110.160 - 88.202.110.175 om -88.202.110.176 - 88.202.110.191 pt -88.202.110.192 - 88.202.110.207 qa -88.202.110.208 - 88.202.110.223 ro -88.202.110.224 - 88.202.110.239 rs -88.202.110.240 - 88.202.110.255 ru -88.202.111.0 - 88.202.111.15 sa -88.202.111.16 - 88.202.111.31 se -88.202.111.32 - 88.202.111.47 si -88.202.111.48 - 88.202.111.63 sk -88.202.111.64 - 88.202.111.79 sm -88.202.111.80 - 88.202.111.95 tn -88.202.111.96 - 88.202.111.111 tr -88.202.111.112 - 88.202.111.127 ua -88.202.111.128 - 88.202.111.143 va -88.202.111.144 - 88.202.114.255 a2 -88.202.115.0 - 88.202.115.255 za -88.202.116.0 - 88.202.117.255 fr -88.202.118.0 - 88.202.119.255 es -88.202.120.0 - 88.202.121.255 ly -88.202.122.0 - 88.202.123.255 a2 -88.202.124.0 - 88.202.124.255 za -88.202.125.0 - 88.202.127.255 it -88.202.128.0 - 88.202.255.255 gb +88.202.68.0 - 88.202.69.255 eu +88.202.70.0 - 88.202.77.255 fr +88.202.78.0 - 88.202.85.255 eu +88.202.86.0 - 88.202.86.255 gr +88.202.87.0 - 88.202.95.255 eu +88.202.96.0 - 88.202.102.255 it +88.202.103.0 - 88.202.111.255 fr +88.202.112.0 - 88.202.115.255 eu +88.202.116.0 - 88.202.117.255 it +88.202.118.0 - 88.202.121.255 eu +88.202.122.0 - 88.202.122.255 ly +88.202.123.0 - 88.202.123.255 tn +88.202.124.0 - 88.202.127.255 eu +88.202.128.0 - 88.202.159.255 gb +88.202.160.0 - 88.202.167.255 nl +88.202.168.0 - 88.202.215.255 gb +88.202.216.0 - 88.202.216.255 il +88.202.217.0 - 88.202.230.255 gb +88.202.231.0 - 88.202.231.15 au +88.202.231.16 - 88.202.231.31 gb +88.202.231.32 - 88.202.231.47 au +88.202.231.48 - 88.202.255.255 gb 88.203.0.0 - 88.203.127.255 mt 88.203.128.0 - 88.203.255.255 bg 88.204.0.0 - 88.204.127.255 ru 88.204.128.0 - 88.204.255.255 kz -88.205.0.0 - 88.205.100.7 de -88.205.100.8 - 88.205.100.15 ch -88.205.100.16 - 88.205.100.31 ru -88.205.100.32 - 88.205.100.55 de -88.205.100.56 - 88.205.100.63 pl -88.205.100.64 - 88.205.100.95 de -88.205.100.96 - 88.205.100.127 ru -88.205.100.128 - 88.205.101.255 de -88.205.102.0 - 88.205.102.31 pl -88.205.102.32 - 88.205.102.63 ru -88.205.102.64 - 88.205.127.255 de +88.205.0.0 - 88.205.101.63 de +88.205.101.64 - 88.205.101.95 us +88.205.101.96 - 88.205.104.15 de +88.205.104.16 - 88.205.104.31 us +88.205.104.32 - 88.205.127.255 de 88.205.128.0 - 88.206.127.255 ru 88.206.128.0 - 88.206.255.255 se 88.207.0.0 - 88.207.127.255 hr 88.207.128.0 - 88.207.255.255 lu -88.208.0.0 - 88.208.7.255 us -88.208.8.0 - 88.208.9.255 ua -88.208.10.0 - 88.208.56.23 nl -88.208.56.24 - 88.208.56.31 ua -88.208.56.32 - 88.208.63.255 nl -88.208.64.0 - 88.208.91.87 cz -88.208.91.88 - 88.208.91.95 at -88.208.91.96 - 88.208.91.127 cz -88.208.91.128 - 88.208.91.191 pl -88.208.91.192 - 88.208.104.255 cz +88.208.0.0 - 88.208.7.255 nl +88.208.8.0 - 88.208.8.127 gb +88.208.8.128 - 88.208.8.255 de +88.208.9.0 - 88.208.63.255 nl +88.208.64.0 - 88.208.104.255 cz 88.208.105.0 - 88.208.107.255 pl 88.208.108.0 - 88.208.127.255 cz 88.208.128.0 - 88.208.191.255 de 88.208.192.0 - 88.208.255.255 gb 88.209.0.0 - 88.209.63.255 de -88.209.64.0 - 88.209.83.255 mc -88.209.84.0 - 88.209.85.255 fr -88.209.86.0 - 88.209.87.255 mc -88.209.88.0 - 88.209.125.255 fr -88.209.126.0 - 88.209.127.255 mc +88.209.64.0 - 88.209.127.255 mc 88.209.128.0 - 88.209.255.255 hu 88.210.0.0 - 88.210.63.255 ru 88.210.64.0 - 88.210.127.255 pt -88.210.128.0 - 88.210.151.255 gb -88.210.152.0 - 88.210.152.31 fr -88.210.152.32 - 88.210.152.47 de -88.210.152.48 - 88.210.152.63 rs -88.210.152.64 - 88.210.152.127 gb -88.210.152.128 - 88.210.152.255 al -88.210.153.0 - 88.210.153.127 cz -88.210.153.128 - 88.210.153.159 es -88.210.153.160 - 88.210.153.191 hu -88.210.153.192 - 88.210.153.223 it -88.210.153.224 - 88.210.155.255 ie -88.210.156.0 - 88.210.191.255 gb +88.210.128.0 - 88.210.140.208 gb +88.210.140.209 - 88.210.140.209 de +88.210.140.210 - 88.210.153.255 gb +88.210.154.0 - 88.210.154.255 ie +88.210.155.0 - 88.210.191.255 gb 88.210.192.0 - 88.210.255.255 ge 88.211.0.0 - 88.211.127.255 gb 88.211.128.0 - 88.211.191.255 nl @@ -50668,24 +25232,16 @@ 88.214.0.0 - 88.214.63.255 de 88.214.64.0 - 88.214.127.255 ua 88.214.128.0 - 88.214.191.255 pt -88.214.192.0 - 88.214.205.255 gb -88.214.206.0 - 88.214.206.255 us -88.214.207.0 - 88.214.211.255 gb -88.214.212.0 - 88.214.212.255 us -88.214.213.0 - 88.214.229.255 gb -88.214.230.0 - 88.214.231.255 ru -88.214.232.0 - 88.214.251.255 gb -88.214.252.0 - 88.214.252.255 us -88.214.253.0 - 88.215.63.255 gb +88.214.192.0 - 88.214.229.255 gb +88.214.230.0 - 88.214.230.255 ru +88.214.231.0 - 88.214.235.255 gb +88.214.236.0 - 88.214.237.255 ru +88.214.238.0 - 88.215.63.255 gb 88.215.64.0 - 88.215.127.255 de 88.215.128.0 - 88.215.191.255 ru 88.215.192.0 - 88.215.255.255 de 88.216.0.0 - 88.216.255.255 lt -88.217.0.0 - 88.217.251.67 de -88.217.251.68 - 88.217.251.71 a2 -88.217.251.72 - 88.217.251.87 de -88.217.251.88 - 88.217.251.91 a2 -88.217.251.92 - 88.217.255.255 de +88.217.0.0 - 88.217.255.255 de 88.218.0.0 - 88.218.255.255 gr 88.219.0.0 - 88.219.255.255 fr 88.220.0.0 - 88.220.255.255 pl @@ -50705,28 +25261,40 @@ 88.221.160.0 - 88.221.191.255 eu 88.221.192.0 - 88.221.199.255 fr 88.221.200.0 - 88.221.207.255 eu -88.221.208.0 - 88.221.215.255 de +88.221.208.0 - 88.221.208.255 de +88.221.209.0 - 88.221.209.255 pl +88.221.210.0 - 88.221.215.255 de 88.221.216.0 - 88.221.218.255 eu 88.221.219.0 - 88.221.219.255 il 88.221.220.0 - 88.221.255.255 eu 88.222.0.0 - 88.223.255.255 lt 88.224.0.0 - 88.255.255.255 tr 89.0.0.0 - 89.1.255.255 de -89.2.0.0 - 89.3.255.255 fr +89.2.0.0 - 89.3.244.255 fr +89.3.245.0 - 89.3.245.255 gp +89.3.246.0 - 89.3.246.255 fr +89.3.247.0 - 89.3.247.255 gp +89.3.248.0 - 89.3.255.255 fr 89.4.0.0 - 89.5.255.255 sa 89.6.0.0 - 89.7.255.255 es 89.8.0.0 - 89.11.255.255 no 89.12.0.0 - 89.15.255.255 de -89.16.0.0 - 89.16.31.255 fr +89.16.0.0 - 89.16.3.255 fr +89.16.4.0 - 89.16.5.255 re +89.16.6.0 - 89.16.6.255 fr +89.16.7.0 - 89.16.7.255 re +89.16.8.0 - 89.16.11.255 fr +89.16.12.0 - 89.16.12.255 re +89.16.13.0 - 89.16.14.255 fr +89.16.15.0 - 89.16.15.255 re +89.16.16.0 - 89.16.31.255 fr 89.16.32.0 - 89.16.63.255 ru 89.16.64.0 - 89.16.95.255 ie 89.16.96.0 - 89.16.127.255 ru 89.16.128.0 - 89.16.159.255 de 89.16.160.0 - 89.16.191.255 gb 89.16.192.0 - 89.16.223.255 at -89.16.224.0 - 89.16.241.255 gb -89.16.242.0 - 89.16.242.255 fr -89.16.243.0 - 89.16.255.255 gb +89.16.224.0 - 89.16.255.255 gb 89.17.0.0 - 89.17.31.255 hr 89.17.32.0 - 89.17.63.255 ru 89.17.64.0 - 89.17.95.255 fi @@ -50740,21 +25308,15 @@ 89.18.64.0 - 89.18.95.255 ie 89.18.96.0 - 89.18.127.255 se 89.18.128.0 - 89.18.159.255 ru -89.18.160.0 - 89.18.160.255 us -89.18.161.0 - 89.18.183.255 nl -89.18.184.0 - 89.18.186.255 us -89.18.187.0 - 89.18.191.255 nl +89.18.160.0 - 89.18.191.255 nl 89.18.192.0 - 89.18.223.255 lv 89.18.224.0 - 89.18.255.255 fi 89.19.0.0 - 89.19.31.255 tr -89.19.32.0 - 89.19.63.255 ru 89.19.64.0 - 89.19.95.255 ie 89.19.96.0 - 89.19.127.255 ua 89.19.128.0 - 89.19.159.255 dk 89.19.160.0 - 89.19.223.255 ru -89.19.224.0 - 89.19.234.159 de -89.19.234.160 - 89.19.234.191 il -89.19.234.192 - 89.19.255.255 de +89.19.224.0 - 89.19.255.255 de 89.20.0.0 - 89.20.63.255 ru 89.20.64.0 - 89.20.95.255 nl 89.20.96.0 - 89.20.159.255 ru @@ -50764,18 +25326,9 @@ 89.21.0.0 - 89.21.31.255 gb 89.21.32.0 - 89.21.63.255 de 89.21.64.0 - 89.21.95.255 ua -89.21.96.0 - 89.21.124.255 ro -89.21.125.0 - 89.21.125.255 hu -89.21.126.0 - 89.21.127.255 ro +89.21.96.0 - 89.21.127.255 ro 89.21.128.0 - 89.21.159.255 ru -89.21.160.0 - 89.21.179.255 nl -89.21.180.0 - 89.21.181.255 us -89.21.182.0 - 89.21.182.255 a2 -89.21.183.0 - 89.21.183.255 nl -89.21.184.0 - 89.21.187.255 us -89.21.188.0 - 89.21.189.255 nl -89.21.190.0 - 89.21.190.255 us -89.21.191.0 - 89.21.191.255 nl +89.21.160.0 - 89.21.191.255 us 89.21.192.0 - 89.21.223.255 it 89.21.224.0 - 89.21.255.255 gb 89.22.0.0 - 89.22.7.255 ru @@ -50783,7 +25336,11 @@ 89.22.16.0 - 89.22.31.255 ru 89.22.32.0 - 89.22.39.255 pl 89.22.40.0 - 89.22.47.255 ua -89.22.48.0 - 89.22.63.255 ro +89.22.48.0 - 89.22.48.255 cz +89.22.49.0 - 89.22.49.255 ro +89.22.50.0 - 89.22.50.255 ru +89.22.51.0 - 89.22.51.255 ie +89.22.52.0 - 89.22.63.255 ru 89.22.64.0 - 89.22.95.255 cz 89.22.96.0 - 89.22.127.255 de 89.22.128.0 - 89.22.191.255 ru @@ -50807,7 +25364,7 @@ 89.28.128.0 - 89.28.135.255 kz 89.28.136.0 - 89.28.143.255 de 89.28.144.0 - 89.28.151.255 fr -89.28.152.0 - 89.28.159.255 bh +89.28.152.0 - 89.28.159.255 ch 89.28.160.0 - 89.28.167.255 ru 89.28.168.0 - 89.28.175.255 gb 89.28.176.0 - 89.28.183.255 ie @@ -50822,126 +25379,42 @@ 89.28.248.0 - 89.28.255.255 ru 89.29.0.0 - 89.29.127.255 cz 89.29.128.0 - 89.29.255.255 es -89.30.0.0 - 89.30.3.23 fr -89.30.3.24 - 89.30.3.31 it -89.30.3.32 - 89.30.3.255 fr -89.30.4.0 - 89.30.4.255 eu -89.30.5.0 - 89.30.5.7 gb -89.30.5.8 - 89.30.5.127 eu -89.30.5.128 - 89.30.5.255 gb -89.30.6.0 - 89.30.6.31 es -89.30.6.32 - 89.30.6.63 fr -89.30.6.64 - 89.30.7.255 eu +89.30.0.0 - 89.30.3.255 fr +89.30.4.0 - 89.30.7.255 eu 89.30.8.0 - 89.30.15.255 fr -89.30.16.0 - 89.30.31.255 eu -89.30.32.0 - 89.30.47.255 fr -89.30.48.0 - 89.30.49.255 gb -89.30.50.0 - 89.30.50.255 nl -89.30.51.0 - 89.30.60.255 fr -89.30.61.0 - 89.30.61.255 tr -89.30.62.0 - 89.30.63.255 fr -89.30.64.0 - 89.30.84.255 eu -89.30.85.0 - 89.30.85.255 nl -89.30.86.0 - 89.30.90.255 eu -89.30.91.0 - 89.30.91.255 fr -89.30.92.0 - 89.30.93.255 eu -89.30.94.0 - 89.30.95.255 us -89.30.96.0 - 89.30.99.255 fr -89.30.100.0 - 89.30.101.255 eu -89.30.102.0 - 89.30.102.255 fr -89.30.103.0 - 89.30.103.255 eu -89.30.104.0 - 89.30.104.127 fr -89.30.104.128 - 89.30.104.255 eu -89.30.105.0 - 89.30.105.15 fr -89.30.105.16 - 89.30.105.23 eu -89.30.105.24 - 89.30.105.31 es -89.30.105.32 - 89.30.105.255 eu -89.30.106.0 - 89.30.117.127 fr -89.30.117.128 - 89.30.117.255 eu -89.30.118.0 - 89.30.118.255 fr -89.30.119.0 - 89.30.119.255 gb +89.30.16.0 - 89.30.39.255 eu +89.30.40.0 - 89.30.47.255 fr +89.30.48.0 - 89.30.51.255 eu +89.30.52.0 - 89.30.59.255 fr +89.30.60.0 - 89.30.85.175 eu +89.30.85.176 - 89.30.85.191 fr +89.30.85.192 - 89.30.85.199 gb +89.30.85.200 - 89.30.97.255 eu +89.30.98.0 - 89.30.98.255 fr +89.30.99.0 - 89.30.118.127 eu +89.30.118.128 - 89.30.118.143 fr +89.30.118.144 - 89.30.119.255 eu 89.30.120.0 - 89.30.120.255 fr -89.30.121.0 - 89.30.121.255 eu -89.30.122.0 - 89.30.122.255 fr -89.30.123.0 - 89.30.123.255 nl -89.30.124.0 - 89.30.124.31 fr -89.30.124.32 - 89.30.124.111 eu -89.30.124.112 - 89.30.124.127 fr -89.30.124.128 - 89.30.124.255 eu -89.30.125.0 - 89.30.125.31 fr -89.30.125.32 - 89.30.125.127 eu -89.30.125.128 - 89.30.126.255 fr -89.30.127.0 - 89.30.127.255 gb -89.30.128.0 - 89.30.140.255 nl -89.30.141.0 - 89.30.141.255 us -89.30.142.0 - 89.30.255.255 nl +89.30.121.0 - 89.30.126.199 eu +89.30.126.200 - 89.30.126.203 de +89.30.126.204 - 89.30.126.255 eu +89.30.127.0 - 89.30.127.255 fr +89.30.128.0 - 89.30.255.255 nl 89.31.0.0 - 89.31.7.255 de 89.31.8.0 - 89.31.15.255 cz 89.31.16.0 - 89.31.23.255 ru -89.31.24.0 - 89.31.31.255 kz 89.31.32.0 - 89.31.39.255 ru 89.31.40.0 - 89.31.47.255 cz -89.31.48.0 - 89.31.63.255 it +89.31.48.0 - 89.31.55.255 it +89.31.56.0 - 89.31.63.255 nl 89.31.64.0 - 89.31.71.255 pl 89.31.72.0 - 89.31.79.255 it 89.31.80.0 - 89.31.95.255 ru 89.31.96.0 - 89.31.103.255 nl 89.31.104.0 - 89.31.119.255 ru -89.31.120.0 - 89.31.127.255 ch -89.31.128.0 - 89.31.130.127 at -89.31.130.128 - 89.31.130.135 eu -89.31.130.136 - 89.31.130.151 at -89.31.130.152 - 89.31.130.191 eu -89.31.130.192 - 89.31.130.199 at -89.31.130.200 - 89.31.130.255 eu -89.31.131.0 - 89.31.132.79 at -89.31.132.80 - 89.31.132.95 nl -89.31.132.96 - 89.31.132.99 at -89.31.132.100 - 89.31.132.107 eu -89.31.132.108 - 89.31.132.111 at -89.31.132.112 - 89.31.132.119 eu -89.31.132.120 - 89.31.132.143 at -89.31.132.144 - 89.31.132.159 eu -89.31.132.160 - 89.31.132.175 at -89.31.132.176 - 89.31.132.255 eu -89.31.133.0 - 89.31.134.63 at -89.31.134.64 - 89.31.134.79 eu -89.31.134.80 - 89.31.134.87 at -89.31.134.88 - 89.31.134.95 eu -89.31.134.96 - 89.31.134.111 at -89.31.134.112 - 89.31.134.127 eu -89.31.134.128 - 89.31.135.255 at +89.31.128.0 - 89.31.135.255 eu 89.31.136.0 - 89.31.143.255 de -89.31.144.0 - 89.31.144.47 fr -89.31.144.48 - 89.31.144.55 be -89.31.144.56 - 89.31.144.63 ch -89.31.144.64 - 89.31.149.127 fr -89.31.149.128 - 89.31.149.135 nl -89.31.149.136 - 89.31.149.143 lu -89.31.149.144 - 89.31.149.151 de -89.31.149.152 - 89.31.149.159 at -89.31.149.160 - 89.31.149.167 es -89.31.149.168 - 89.31.149.175 it -89.31.149.176 - 89.31.149.183 pl -89.31.149.184 - 89.31.149.191 fr -89.31.149.192 - 89.31.149.199 gb -89.31.149.200 - 89.31.149.207 ie -89.31.149.208 - 89.31.149.215 dk -89.31.149.216 - 89.31.149.223 cz -89.31.149.224 - 89.31.149.231 gr -89.31.149.232 - 89.31.149.239 pt -89.31.149.240 - 89.31.149.247 ro -89.31.149.248 - 89.31.150.127 fr -89.31.150.128 - 89.31.150.135 hu -89.31.150.136 - 89.31.150.143 bg -89.31.150.144 - 89.31.150.151 sk -89.31.150.152 - 89.31.150.159 lt -89.31.150.160 - 89.31.150.167 lv -89.31.150.168 - 89.31.150.175 si -89.31.150.176 - 89.31.150.183 ee -89.31.150.184 - 89.31.150.191 fi -89.31.150.192 - 89.31.150.199 se -89.31.150.200 - 89.31.151.255 fr +89.31.144.0 - 89.31.151.255 fr 89.31.152.0 - 89.31.159.255 mk 89.31.160.0 - 89.31.167.255 cz 89.31.168.0 - 89.31.175.255 ie @@ -50951,42 +25424,567 @@ 89.31.200.0 - 89.31.207.255 it 89.31.208.0 - 89.31.215.255 gb 89.31.216.0 - 89.31.223.255 be -89.31.224.0 - 89.31.231.255 pt +89.31.224.0 - 89.31.224.255 eu +89.31.225.0 - 89.31.231.255 pt 89.31.232.0 - 89.31.239.255 gb -89.31.240.0 - 89.31.241.255 de -89.31.242.0 - 89.31.247.255 ru +89.31.240.0 - 89.31.247.255 us 89.31.248.0 - 89.31.255.255 se -89.32.0.0 - 89.32.143.255 ro -89.32.144.0 - 89.32.151.255 gb -89.32.152.0 - 89.32.223.255 ro -89.32.224.0 - 89.32.239.255 md -89.32.240.0 - 89.32.255.255 ro -89.33.0.0 - 89.33.3.255 md -89.33.4.0 - 89.33.15.255 ro -89.33.16.0 - 89.33.31.255 md -89.33.32.0 - 89.33.253.255 ro -89.33.254.0 - 89.33.254.255 md -89.33.255.0 - 89.37.103.255 ro -89.37.104.0 - 89.37.104.255 md -89.37.105.0 - 89.39.95.255 ro -89.39.96.0 - 89.39.103.255 es -89.39.104.0 - 89.40.31.255 ro -89.40.32.0 - 89.40.35.255 gb -89.40.36.0 - 89.41.63.255 ro -89.41.64.0 - 89.41.127.255 md -89.41.128.0 - 89.42.9.255 ro -89.42.10.0 - 89.42.10.255 ae -89.42.11.0 - 89.42.47.255 ro -89.42.48.0 - 89.42.49.255 se -89.42.50.0 - 89.44.87.255 ro -89.44.88.0 - 89.44.91.255 md -89.44.92.0 - 89.44.255.255 ro +89.32.0.0 - 89.32.31.255 ir +89.32.32.0 - 89.32.39.255 se +89.32.40.0 - 89.32.40.255 de +89.32.41.0 - 89.32.55.255 ro +89.32.56.0 - 89.32.63.255 md +89.32.64.0 - 89.32.71.255 us +89.32.72.0 - 89.32.79.255 se +89.32.80.0 - 89.32.95.255 ro +89.32.96.0 - 89.32.111.255 ir +89.32.112.0 - 89.32.119.255 ro +89.32.120.0 - 89.32.120.255 se +89.32.121.0 - 89.32.121.255 us +89.32.122.0 - 89.32.122.255 se +89.32.123.0 - 89.32.135.255 ro +89.32.136.0 - 89.32.143.255 md +89.32.144.0 - 89.32.145.77 gb +89.32.145.78 - 89.32.145.78 ro +89.32.145.79 - 89.32.151.255 gb +89.32.152.0 - 89.32.167.255 ro +89.32.168.0 - 89.32.169.255 it +89.32.170.0 - 89.32.170.255 gb +89.32.171.0 - 89.32.171.255 md +89.32.172.0 - 89.32.185.255 ro +89.32.186.0 - 89.32.187.255 it +89.32.188.0 - 89.32.193.255 ro +89.32.194.0 - 89.32.194.127 fr +89.32.194.128 - 89.32.194.255 ro +89.32.195.0 - 89.32.195.255 se +89.32.196.0 - 89.32.197.255 ir +89.32.198.0 - 89.32.223.255 ro +89.32.224.0 - 89.32.247.255 md +89.32.248.0 - 89.32.249.255 ro +89.32.250.0 - 89.32.250.255 ch +89.32.251.0 - 89.33.5.255 ro +89.33.6.0 - 89.33.7.255 gb +89.33.8.0 - 89.33.15.255 ro +89.33.16.0 - 89.33.16.255 de +89.33.17.0 - 89.33.17.255 md +89.33.18.0 - 89.33.19.255 ir +89.33.20.0 - 89.33.29.255 ro +89.33.30.0 - 89.33.30.255 md +89.33.31.0 - 89.33.39.255 ro +89.33.40.0 - 89.33.40.255 fi +89.33.41.0 - 89.33.41.255 us +89.33.42.0 - 89.33.42.255 fi +89.33.43.0 - 89.33.45.255 ro +89.33.46.0 - 89.33.47.255 gb +89.33.48.0 - 89.33.63.255 ro +89.33.64.0 - 89.33.64.255 gb +89.33.65.0 - 89.33.65.255 md +89.33.66.0 - 89.33.67.255 iq +89.33.68.0 - 89.33.68.127 fr +89.33.68.128 - 89.33.69.255 ro +89.33.70.0 - 89.33.70.255 fi +89.33.71.0 - 89.33.107.255 ro +89.33.108.0 - 89.33.111.255 es +89.33.112.0 - 89.33.115.255 ro +89.33.116.0 - 89.33.116.255 gb +89.33.117.0 - 89.33.117.255 pt +89.33.118.0 - 89.33.118.255 se +89.33.119.0 - 89.33.127.255 ro +89.33.128.0 - 89.33.129.255 ir +89.33.130.0 - 89.33.133.255 ro +89.33.134.0 - 89.33.134.255 gb +89.33.135.0 - 89.33.135.255 ro +89.33.136.0 - 89.33.143.255 se +89.33.144.0 - 89.33.161.255 ro +89.33.162.0 - 89.33.162.255 gb +89.33.163.0 - 89.33.163.255 ro +89.33.164.0 - 89.33.165.255 gb +89.33.166.0 - 89.33.183.255 ro +89.33.184.0 - 89.33.191.255 es +89.33.192.0 - 89.33.197.255 ro +89.33.198.0 - 89.33.201.255 gb +89.33.202.0 - 89.33.203.255 ro +89.33.204.0 - 89.33.205.255 ir +89.33.206.0 - 89.33.206.255 gb +89.33.207.0 - 89.33.207.255 ro +89.33.208.0 - 89.33.223.255 kz +89.33.224.0 - 89.33.233.255 ro +89.33.234.0 - 89.33.235.255 ir +89.33.236.0 - 89.33.239.255 ro +89.33.240.0 - 89.33.241.255 ir +89.33.242.0 - 89.33.249.255 ro +89.33.250.0 - 89.33.251.255 gb +89.33.252.0 - 89.33.253.255 ro +89.33.254.0 - 89.33.255.255 gb +89.34.0.0 - 89.34.19.255 ro +89.34.20.0 - 89.34.21.255 ir +89.34.22.0 - 89.34.31.255 ro +89.34.32.0 - 89.34.63.255 ir +89.34.64.0 - 89.34.71.255 md +89.34.72.0 - 89.34.87.255 ro +89.34.88.0 - 89.34.89.255 ir +89.34.90.0 - 89.34.93.255 ro +89.34.94.0 - 89.34.95.255 ir +89.34.96.0 - 89.34.101.255 ro +89.34.102.0 - 89.34.102.255 gb +89.34.103.0 - 89.34.103.255 ro +89.34.104.0 - 89.34.105.255 gb +89.34.106.0 - 89.34.107.255 ro +89.34.108.0 - 89.34.108.255 gb +89.34.109.0 - 89.34.110.255 ro +89.34.111.0 - 89.34.111.255 de +89.34.112.0 - 89.34.127.255 ro +89.34.128.0 - 89.34.159.255 ir +89.34.160.0 - 89.34.163.255 ro +89.34.164.0 - 89.34.164.127 fr +89.34.164.128 - 89.34.165.255 ro +89.34.166.0 - 89.34.166.255 ae +89.34.167.0 - 89.34.167.255 ro +89.34.168.0 - 89.34.169.255 ir +89.34.170.0 - 89.34.171.255 ro +89.34.172.0 - 89.34.172.127 kr +89.34.172.128 - 89.34.172.255 in +89.34.173.0 - 89.34.175.255 ro +89.34.176.0 - 89.34.177.255 ir +89.34.178.0 - 89.34.178.255 ro +89.34.179.0 - 89.34.179.255 md +89.34.180.0 - 89.34.183.255 ro +89.34.184.0 - 89.34.191.255 se +89.34.192.0 - 89.34.199.255 md +89.34.200.0 - 89.34.201.255 ir +89.34.202.0 - 89.34.215.255 ro +89.34.216.0 - 89.34.217.255 md +89.34.218.0 - 89.34.231.255 ro +89.34.232.0 - 89.34.235.255 md +89.34.236.0 - 89.34.239.255 ro +89.34.240.0 - 89.34.247.255 se +89.34.248.0 - 89.35.1.255 ro +89.35.2.0 - 89.35.3.255 de +89.35.4.0 - 89.35.33.255 ro +89.35.34.0 - 89.35.34.255 md +89.35.35.0 - 89.35.57.255 ro +89.35.58.0 - 89.35.59.255 ir +89.35.60.0 - 89.35.75.255 ro +89.35.76.0 - 89.35.76.255 md +89.35.77.0 - 89.35.83.255 ro +89.35.84.0 - 89.35.88.255 md +89.35.89.0 - 89.35.90.255 gb +89.35.91.0 - 89.35.91.255 md +89.35.92.0 - 89.35.105.255 ro +89.35.106.0 - 89.35.106.255 us +89.35.107.0 - 89.35.107.255 ro +89.35.108.0 - 89.35.111.255 ae +89.35.112.0 - 89.35.113.255 ro +89.35.114.0 - 89.35.114.255 md +89.35.115.0 - 89.35.122.72 ro +89.35.122.73 - 89.35.122.73 ir +89.35.122.74 - 89.35.125.255 ro +89.35.126.0 - 89.35.126.127 in +89.35.126.128 - 89.35.126.255 bd +89.35.127.0 - 89.35.131.255 ro +89.35.132.0 - 89.35.133.255 ir +89.35.134.0 - 89.35.143.255 ro +89.35.144.0 - 89.35.147.255 pl +89.35.148.0 - 89.35.152.255 ro +89.35.153.0 - 89.35.153.255 gb +89.35.154.0 - 89.35.155.255 ro +89.35.156.0 - 89.35.157.255 ir +89.35.158.0 - 89.35.162.255 ro +89.35.163.0 - 89.35.163.255 md +89.35.164.0 - 89.35.167.255 ro +89.35.168.0 - 89.35.171.255 it +89.35.172.0 - 89.35.173.255 ro +89.35.174.0 - 89.35.175.255 de +89.35.176.0 - 89.35.177.255 ir +89.35.178.0 - 89.35.178.255 lt +89.35.179.0 - 89.35.193.255 ro +89.35.194.0 - 89.35.195.255 ir +89.35.196.0 - 89.35.196.127 fr +89.35.196.128 - 89.35.197.255 ro +89.35.198.0 - 89.35.198.255 gr +89.35.199.0 - 89.35.199.255 ro +89.35.200.0 - 89.35.203.255 md +89.35.204.0 - 89.35.247.255 ro +89.35.248.0 - 89.35.248.255 md +89.35.249.0 - 89.36.15.255 ro +89.36.16.0 - 89.36.17.255 ir +89.36.18.0 - 89.36.35.255 ro +89.36.36.0 - 89.36.36.255 nl +89.36.37.0 - 89.36.37.255 ro +89.36.38.0 - 89.36.39.255 gb +89.36.40.0 - 89.36.47.255 ro +89.36.48.0 - 89.36.63.255 ir +89.36.64.0 - 89.36.64.255 us +89.36.65.0 - 89.36.66.255 ro +89.36.67.0 - 89.36.67.31 ru +89.36.67.32 - 89.36.67.63 ro +89.36.67.64 - 89.36.67.255 ru +89.36.68.0 - 89.36.70.255 ro +89.36.71.0 - 89.36.71.255 ru +89.36.72.0 - 89.36.79.255 ro +89.36.80.0 - 89.36.87.255 es +89.36.88.0 - 89.36.89.255 ro +89.36.90.0 - 89.36.91.255 se +89.36.92.0 - 89.36.95.255 ro +89.36.96.0 - 89.36.111.255 ir +89.36.112.0 - 89.36.135.255 ro +89.36.136.0 - 89.36.136.255 gb +89.36.137.0 - 89.36.137.255 ro +89.36.138.0 - 89.36.139.255 gb +89.36.140.0 - 89.36.141.255 ro +89.36.142.0 - 89.36.142.255 ie +89.36.143.0 - 89.36.155.255 ro +89.36.156.0 - 89.36.159.255 md +89.36.160.0 - 89.36.175.255 ro +89.36.176.0 - 89.36.191.255 ir +89.36.192.0 - 89.36.193.255 ro +89.36.194.0 - 89.36.195.255 ir +89.36.196.0 - 89.36.207.255 ro +89.36.208.0 - 89.36.211.255 it +89.36.212.0 - 89.36.215.255 fr +89.36.216.0 - 89.36.219.255 de +89.36.220.0 - 89.36.224.255 ro +89.36.225.0 - 89.36.225.255 fi +89.36.226.0 - 89.36.227.255 ir +89.36.228.0 - 89.36.251.255 ro +89.36.252.0 - 89.36.253.255 ir +89.36.254.0 - 89.36.254.255 ro +89.36.255.0 - 89.36.255.255 md +89.37.0.0 - 89.37.15.255 ir +89.37.16.0 - 89.37.23.255 az +89.37.24.0 - 89.37.29.255 ro +89.37.30.0 - 89.37.31.255 ir +89.37.32.0 - 89.37.39.255 az +89.37.40.0 - 89.37.40.255 md +89.37.41.0 - 89.37.41.255 ro +89.37.42.0 - 89.37.43.255 ir +89.37.44.0 - 89.37.79.255 ro +89.37.80.0 - 89.37.83.255 es +89.37.84.0 - 89.37.91.255 ro +89.37.92.0 - 89.37.94.255 gb +89.37.95.0 - 89.37.101.255 ro +89.37.102.0 - 89.37.103.255 ir +89.37.104.0 - 89.37.105.255 md +89.37.106.0 - 89.37.128.255 ro +89.37.129.0 - 89.37.134.255 gb +89.37.135.0 - 89.37.136.255 ro +89.37.137.0 - 89.37.138.255 md +89.37.139.0 - 89.37.175.255 ro +89.37.176.0 - 89.37.183.255 se +89.37.184.0 - 89.37.197.255 ro +89.37.198.0 - 89.37.199.255 ir +89.37.200.0 - 89.37.217.255 ro +89.37.218.0 - 89.37.219.255 ir +89.37.220.0 - 89.37.233.255 ro +89.37.234.0 - 89.37.234.255 gb +89.37.235.0 - 89.37.239.255 ro +89.37.240.0 - 89.37.255.255 ir +89.38.0.0 - 89.38.23.255 ro +89.38.24.0 - 89.38.25.255 ir +89.38.26.0 - 89.38.26.255 gb +89.38.27.0 - 89.38.31.255 ro +89.38.32.0 - 89.38.35.255 md +89.38.36.0 - 89.38.38.255 ro +89.38.39.0 - 89.38.39.255 md +89.38.40.0 - 89.38.47.255 es +89.38.48.0 - 89.38.75.255 ro +89.38.76.0 - 89.38.79.255 md +89.38.80.0 - 89.38.95.255 ir +89.38.96.0 - 89.38.101.255 ro +89.38.102.0 - 89.38.103.255 ir +89.38.104.0 - 89.38.143.255 ro +89.38.144.0 - 89.38.147.255 gb +89.38.148.0 - 89.38.151.255 fr +89.38.152.0 - 89.38.237.255 ro +89.38.238.0 - 89.38.239.255 fr +89.38.240.0 - 89.38.241.255 ro +89.38.242.0 - 89.38.243.255 ir +89.38.244.0 - 89.39.15.255 ro +89.39.16.0 - 89.39.23.255 es +89.39.24.0 - 89.39.31.255 ro +89.39.32.0 - 89.39.63.255 es +89.39.64.0 - 89.39.68.255 ro +89.39.69.0 - 89.39.69.255 gb +89.39.70.0 - 89.39.75.255 ro +89.39.76.0 - 89.39.79.255 md +89.39.80.0 - 89.39.80.255 ro +89.39.81.0 - 89.39.81.255 gb +89.39.82.0 - 89.39.83.255 ro +89.39.84.0 - 89.39.87.255 md +89.39.88.0 - 89.39.107.255 ro +89.39.108.0 - 89.39.108.255 pl +89.39.109.0 - 89.39.121.255 ro +89.39.122.0 - 89.39.122.127 th +89.39.122.128 - 89.39.122.255 id +89.39.123.0 - 89.39.123.255 ro +89.39.124.0 - 89.39.124.255 es +89.39.125.0 - 89.39.127.255 ro +89.39.128.0 - 89.39.135.255 de +89.39.136.0 - 89.39.139.255 gb +89.39.140.0 - 89.39.142.255 ro +89.39.143.0 - 89.39.143.255 au +89.39.144.0 - 89.39.145.255 ro +89.39.146.0 - 89.39.146.255 gb +89.39.147.0 - 89.39.147.255 nl +89.39.148.0 - 89.39.151.255 ro +89.39.152.0 - 89.39.159.255 es +89.39.160.0 - 89.39.167.255 ro +89.39.168.0 - 89.39.171.255 pl +89.39.172.0 - 89.39.185.255 ro +89.39.186.0 - 89.39.187.255 ir +89.39.188.0 - 89.39.211.255 ro +89.39.212.0 - 89.39.213.255 gb +89.39.214.0 - 89.39.214.255 ro +89.39.215.0 - 89.39.215.255 gb +89.39.216.0 - 89.39.240.255 ro +89.39.241.0 - 89.39.241.255 gb +89.39.242.0 - 89.39.242.255 md +89.39.243.0 - 89.39.244.255 gb +89.39.245.0 - 89.39.246.255 ro +89.39.247.0 - 89.39.247.255 gb +89.39.248.0 - 89.39.255.255 ro +89.40.0.0 - 89.40.3.255 de +89.40.4.0 - 89.40.5.255 ro +89.40.6.0 - 89.40.6.127 fr +89.40.6.128 - 89.40.6.255 ro +89.40.7.0 - 89.40.7.255 ru +89.40.8.0 - 89.40.37.255 ro +89.40.38.0 - 89.40.39.255 ir +89.40.40.0 - 89.40.43.255 ro +89.40.44.0 - 89.40.45.255 gb +89.40.46.0 - 89.40.47.255 ro +89.40.48.0 - 89.40.63.255 kz +89.40.64.0 - 89.40.77.255 ro +89.40.78.0 - 89.40.79.255 ir +89.40.80.0 - 89.40.83.255 ro +89.40.84.0 - 89.40.87.255 es +89.40.88.0 - 89.40.89.255 ro +89.40.90.0 - 89.40.91.255 ir +89.40.92.0 - 89.40.105.255 ro +89.40.106.0 - 89.40.107.255 ir +89.40.108.0 - 89.40.109.255 de +89.40.110.0 - 89.40.111.255 ir +89.40.112.0 - 89.40.115.255 it +89.40.116.0 - 89.40.119.255 de +89.40.120.0 - 89.40.127.255 it +89.40.128.0 - 89.40.129.255 ir +89.40.130.0 - 89.40.133.255 ro +89.40.134.0 - 89.40.135.255 de +89.40.136.0 - 89.40.139.255 ro +89.40.140.0 - 89.40.141.255 gb +89.40.142.0 - 89.40.156.72 ro +89.40.156.73 - 89.40.156.73 ir +89.40.156.74 - 89.40.171.255 ro +89.40.172.0 - 89.40.175.255 it +89.40.176.0 - 89.40.202.255 ro +89.40.203.0 - 89.40.203.255 gb +89.40.204.0 - 89.40.207.255 ro +89.40.208.0 - 89.40.209.255 gb +89.40.210.0 - 89.40.215.255 ro +89.40.216.0 - 89.40.217.255 se +89.40.218.0 - 89.40.229.12 ro +89.40.229.13 - 89.40.229.13 md +89.40.229.14 - 89.40.230.167 ro +89.40.230.168 - 89.40.230.168 md +89.40.230.169 - 89.40.239.255 ro +89.40.240.0 - 89.40.255.255 ir +89.41.0.0 - 89.41.3.255 es +89.41.4.0 - 89.41.7.255 az +89.41.8.0 - 89.41.23.255 ir +89.41.24.0 - 89.41.24.255 gb +89.41.25.0 - 89.41.26.255 ro +89.41.27.0 - 89.41.29.255 gb +89.41.30.0 - 89.41.31.255 ro +89.41.32.0 - 89.41.33.255 ir +89.41.34.0 - 89.41.39.255 ro +89.41.40.0 - 89.41.43.255 ir +89.41.44.0 - 89.41.48.255 ro +89.41.49.0 - 89.41.51.255 gb +89.41.52.0 - 89.41.57.255 ro +89.41.58.0 - 89.41.59.255 ir +89.41.60.0 - 89.41.94.255 ro +89.41.95.0 - 89.41.95.255 md +89.41.96.0 - 89.41.101.255 ro +89.41.102.0 - 89.41.102.255 md +89.41.103.0 - 89.41.114.79 ro +89.41.114.80 - 89.41.114.80 md +89.41.114.81 - 89.41.159.255 ro +89.41.160.0 - 89.41.167.255 se +89.41.168.0 - 89.41.188.255 ro +89.41.189.0 - 89.41.191.255 gb +89.41.192.0 - 89.41.247.255 ir +89.41.248.0 - 89.42.7.255 ro +89.42.8.0 - 89.42.8.255 sg +89.42.9.0 - 89.42.9.255 ro +89.42.10.0 - 89.42.10.255 gb +89.42.11.0 - 89.42.31.255 ro +89.42.32.0 - 89.42.33.255 ir +89.42.34.0 - 89.42.55.255 ro +89.42.56.0 - 89.42.57.255 ir +89.42.58.0 - 89.42.66.196 ro +89.42.66.197 - 89.42.66.197 md +89.42.66.198 - 89.42.67.255 ro +89.42.68.0 - 89.42.69.255 ir +89.42.70.0 - 89.42.71.255 ro +89.42.72.0 - 89.42.79.255 md +89.42.80.0 - 89.42.103.255 ro +89.42.104.0 - 89.42.107.255 md +89.42.108.0 - 89.42.113.255 ro +89.42.114.0 - 89.42.114.255 gb +89.42.115.0 - 89.42.135.255 ro +89.42.136.0 - 89.42.139.255 ir +89.42.140.0 - 89.42.141.255 se +89.42.142.0 - 89.42.149.255 ro +89.42.150.0 - 89.42.151.255 ir +89.42.152.0 - 89.42.154.255 gb +89.42.155.0 - 89.42.159.255 ro +89.42.160.0 - 89.42.163.255 pl +89.42.164.0 - 89.42.167.255 ro +89.42.168.0 - 89.42.171.255 nl +89.42.172.0 - 89.42.179.255 ro +89.42.180.0 - 89.42.183.255 md +89.42.184.0 - 89.42.195.255 ro +89.42.196.0 - 89.42.199.255 ir +89.42.200.0 - 89.42.211.255 ro +89.42.212.0 - 89.42.212.255 nl +89.42.213.0 - 89.42.227.255 ro +89.42.228.0 - 89.42.229.255 ir +89.42.230.0 - 89.42.237.255 ro +89.42.238.0 - 89.42.238.127 fr +89.42.238.128 - 89.42.238.255 ro +89.42.239.0 - 89.42.239.255 jp +89.42.240.0 - 89.42.255.255 ro +89.43.0.0 - 89.43.15.255 ir +89.43.16.0 - 89.43.31.255 ro +89.43.32.0 - 89.43.32.255 sg +89.43.33.0 - 89.43.35.255 ro +89.43.36.0 - 89.43.37.255 ir +89.43.38.0 - 89.43.59.255 ro +89.43.60.0 - 89.43.60.255 gb +89.43.61.0 - 89.43.69.255 ro +89.43.70.0 - 89.43.71.255 ir +89.43.72.0 - 89.43.87.255 ro +89.43.88.0 - 89.43.103.255 ir +89.43.104.0 - 89.43.111.255 ro +89.43.112.0 - 89.43.115.255 fr +89.43.116.0 - 89.43.118.255 ro +89.43.119.0 - 89.43.119.255 au +89.43.120.0 - 89.43.181.255 ro +89.43.182.0 - 89.43.183.255 ir +89.43.184.0 - 89.43.187.255 ro +89.43.188.0 - 89.43.189.255 ir +89.43.190.0 - 89.43.195.255 ro +89.43.196.0 - 89.43.197.255 es +89.43.198.0 - 89.43.203.255 ro +89.43.204.0 - 89.43.205.255 ir +89.43.206.0 - 89.43.215.255 ro +89.43.216.0 - 89.43.231.255 ir +89.43.232.0 - 89.43.239.255 se +89.43.240.0 - 89.43.255.255 ro +89.44.0.0 - 89.44.7.255 se +89.44.8.0 - 89.44.8.255 de +89.44.9.0 - 89.44.42.255 ro +89.44.43.0 - 89.44.43.255 qa +89.44.44.0 - 89.44.64.191 ro +89.44.64.192 - 89.44.64.255 es +89.44.65.0 - 89.44.70.255 ro +89.44.71.0 - 89.44.71.255 es +89.44.72.0 - 89.44.102.255 ro +89.44.103.0 - 89.44.103.255 gb +89.44.104.0 - 89.44.109.255 ro +89.44.110.0 - 89.44.111.255 fr +89.44.112.0 - 89.44.113.255 ir +89.44.114.0 - 89.44.114.255 md +89.44.115.0 - 89.44.117.255 ro +89.44.118.0 - 89.44.119.255 ir +89.44.120.0 - 89.44.125.255 ro +89.44.126.0 - 89.44.127.255 md +89.44.128.0 - 89.44.145.255 ro +89.44.146.0 - 89.44.147.255 ir +89.44.148.0 - 89.44.151.255 ro +89.44.152.0 - 89.44.155.255 md +89.44.156.0 - 89.44.189.255 ro +89.44.190.0 - 89.44.191.255 ir +89.44.192.0 - 89.44.201.255 ro +89.44.202.0 - 89.44.203.255 ir +89.44.204.0 - 89.44.240.61 ro +89.44.240.62 - 89.44.240.62 ir +89.44.240.63 - 89.44.247.255 ro +89.44.248.0 - 89.44.255.255 se 89.45.0.0 - 89.45.3.255 md -89.45.4.0 - 89.45.224.255 ro -89.45.225.0 - 89.45.225.255 ae -89.45.226.0 - 89.47.39.255 ro -89.47.40.0 - 89.47.41.255 ae -89.47.42.0 - 89.47.255.255 ro +89.45.4.0 - 89.45.35.255 ro +89.45.36.0 - 89.45.39.255 es +89.45.40.0 - 89.45.43.255 md +89.45.44.0 - 89.45.47.255 ro +89.45.48.0 - 89.45.63.255 ir +89.45.64.0 - 89.45.66.255 ro +89.45.67.0 - 89.45.67.255 bg +89.45.68.0 - 89.45.69.255 ir +89.45.70.0 - 89.45.79.255 ro +89.45.80.0 - 89.45.81.255 ir +89.45.82.0 - 89.45.111.255 ro +89.45.112.0 - 89.45.119.255 ir +89.45.120.0 - 89.45.125.255 ro +89.45.126.0 - 89.45.127.255 ir +89.45.128.0 - 89.45.219.255 ro +89.45.220.0 - 89.45.223.255 es +89.45.224.0 - 89.45.225.255 ro +89.45.226.0 - 89.45.227.255 se +89.45.228.0 - 89.45.229.255 ro +89.45.230.0 - 89.45.231.255 ir +89.45.232.0 - 89.45.239.255 se +89.45.240.0 - 89.45.240.255 es +89.45.241.0 - 89.46.7.255 ro +89.46.8.0 - 89.46.11.255 es +89.46.12.0 - 89.46.15.255 ro +89.46.16.0 - 89.46.23.255 se +89.46.24.0 - 89.46.39.255 ro +89.46.40.0 - 89.46.41.255 md +89.46.42.0 - 89.46.43.255 ro +89.46.44.0 - 89.46.45.255 ir +89.46.46.0 - 89.46.46.255 eu +89.46.47.0 - 89.46.47.255 gb +89.46.48.0 - 89.46.59.255 ro +89.46.60.0 - 89.46.61.255 ir +89.46.62.0 - 89.46.63.255 ro +89.46.64.0 - 89.46.79.255 it +89.46.80.0 - 89.46.93.255 ro +89.46.94.0 - 89.46.95.255 ir +89.46.96.0 - 89.46.103.255 ro +89.46.104.0 - 89.46.111.255 it +89.46.112.0 - 89.46.114.255 ro +89.46.115.0 - 89.46.115.255 md +89.46.116.0 - 89.46.135.255 ro +89.46.136.0 - 89.46.143.255 es +89.46.144.0 - 89.46.163.255 ro +89.46.164.0 - 89.46.167.255 md +89.46.168.0 - 89.46.175.255 ro +89.46.176.0 - 89.46.183.255 ps +89.46.184.0 - 89.46.191.255 ro +89.46.192.0 - 89.46.199.255 it +89.46.200.0 - 89.46.207.255 iq +89.46.208.0 - 89.47.3.255 ro +89.47.4.0 - 89.47.7.255 es +89.47.8.0 - 89.47.63.255 ro +89.47.64.0 - 89.47.79.255 ir +89.47.80.0 - 89.47.89.255 ro +89.47.90.0 - 89.47.90.255 md +89.47.91.0 - 89.47.94.255 ro +89.47.95.0 - 89.47.95.255 md +89.47.96.0 - 89.47.127.255 ro +89.47.128.0 - 89.47.159.255 ir +89.47.160.0 - 89.47.167.255 ro +89.47.168.0 - 89.47.175.255 pl +89.47.176.0 - 89.47.176.255 md +89.47.177.0 - 89.47.177.255 ro +89.47.178.0 - 89.47.178.255 md +89.47.179.0 - 89.47.180.255 ro +89.47.181.0 - 89.47.182.255 md +89.47.183.0 - 89.47.183.255 ro +89.47.184.0 - 89.47.191.255 se +89.47.192.0 - 89.47.195.255 ro +89.47.196.0 - 89.47.203.255 ir +89.47.204.0 - 89.47.255.255 ro 89.48.0.0 - 89.63.255.255 de 89.64.0.0 - 89.79.255.255 pl 89.80.0.0 - 89.95.255.255 fr @@ -51006,34 +26004,11 @@ 89.105.96.0 - 89.105.127.255 gb 89.105.128.0 - 89.105.159.255 ru 89.105.160.0 - 89.105.191.255 at -89.105.192.0 - 89.105.207.31 nl -89.105.207.32 - 89.105.207.63 de -89.105.207.64 - 89.105.210.151 nl -89.105.210.152 - 89.105.210.159 de -89.105.210.160 - 89.105.210.175 nl -89.105.210.176 - 89.105.210.191 de -89.105.210.192 - 89.105.211.255 nl -89.105.212.0 - 89.105.212.127 de -89.105.212.128 - 89.105.212.167 nl -89.105.212.168 - 89.105.212.175 de -89.105.212.176 - 89.105.212.223 nl -89.105.212.224 - 89.105.212.231 be -89.105.212.232 - 89.105.213.127 nl -89.105.213.128 - 89.105.213.255 de -89.105.214.0 - 89.105.214.31 nl -89.105.214.32 - 89.105.214.63 de -89.105.214.64 - 89.105.214.79 nl -89.105.214.80 - 89.105.214.87 de -89.105.214.88 - 89.105.223.255 nl +89.105.192.0 - 89.105.223.255 nl 89.105.224.0 - 89.105.255.255 ua 89.106.0.0 - 89.106.31.255 tr 89.106.32.0 - 89.106.63.255 fi -89.106.64.0 - 89.106.64.131 de -89.106.64.132 - 89.106.64.135 ch -89.106.64.136 - 89.106.84.16 de -89.106.84.17 - 89.106.84.20 at -89.106.84.21 - 89.106.84.24 ch -89.106.84.25 - 89.106.95.255 de +89.106.64.0 - 89.106.95.255 de 89.106.96.0 - 89.106.127.255 bg 89.106.128.0 - 89.106.135.255 gb 89.106.136.0 - 89.106.143.255 ie @@ -51042,9 +26017,7 @@ 89.106.160.0 - 89.106.167.255 nl 89.106.168.0 - 89.106.175.255 ru 89.106.176.0 - 89.106.183.255 gb -89.106.184.0 - 89.106.184.255 fr -89.106.185.0 - 89.106.185.255 de -89.106.186.0 - 89.106.191.255 fr +89.106.184.0 - 89.106.191.255 fr 89.106.192.0 - 89.106.199.255 ru 89.106.200.0 - 89.106.207.255 lu 89.106.208.0 - 89.106.215.255 at @@ -51053,33 +26026,10 @@ 89.106.232.0 - 89.106.239.255 kz 89.106.240.0 - 89.106.247.255 be 89.106.248.0 - 89.106.255.255 ru -89.107.0.0 - 89.107.0.255 gb -89.107.1.0 - 89.107.1.63 im -89.107.1.64 - 89.107.1.87 gb -89.107.1.88 - 89.107.1.111 im -89.107.1.112 - 89.107.1.175 gb -89.107.1.176 - 89.107.1.191 im -89.107.1.192 - 89.107.1.215 gb -89.107.1.216 - 89.107.1.223 im -89.107.1.224 - 89.107.1.231 gb -89.107.1.232 - 89.107.1.239 im -89.107.1.240 - 89.107.1.247 gb -89.107.1.248 - 89.107.1.255 im -89.107.2.0 - 89.107.2.31 gb -89.107.2.32 - 89.107.2.111 im -89.107.2.112 - 89.107.2.119 gb -89.107.2.120 - 89.107.2.143 im -89.107.2.144 - 89.107.2.159 gb -89.107.2.160 - 89.107.2.191 im -89.107.2.192 - 89.107.2.199 gb -89.107.2.200 - 89.107.2.223 im -89.107.2.224 - 89.107.2.231 gb -89.107.2.232 - 89.107.2.239 im -89.107.2.240 - 89.107.2.247 gb -89.107.2.248 - 89.107.7.255 im +89.107.0.0 - 89.107.7.255 im 89.107.8.0 - 89.107.15.255 kw -89.107.16.0 - 89.107.23.255 gb -89.107.24.0 - 89.107.39.255 ru +89.107.16.0 - 89.107.23.255 fr +89.107.32.0 - 89.107.39.255 ru 89.107.40.0 - 89.107.47.255 gb 89.107.48.0 - 89.107.55.255 es 89.107.56.0 - 89.107.63.255 gb @@ -51090,11 +26040,8 @@ 89.107.96.0 - 89.107.103.255 kz 89.107.104.0 - 89.107.111.255 it 89.107.112.0 - 89.107.127.255 ru -89.107.128.0 - 89.107.128.255 cz -89.107.129.0 - 89.107.130.255 de -89.107.131.0 - 89.107.131.255 cz -89.107.132.0 - 89.107.135.255 de -89.107.136.0 - 89.107.143.255 fr +89.107.128.0 - 89.107.135.255 de +89.107.136.0 - 89.107.143.255 ru 89.107.144.0 - 89.107.151.255 sk 89.107.152.0 - 89.107.159.255 pl 89.107.160.0 - 89.107.167.255 de @@ -51103,17 +26050,7 @@ 89.107.184.0 - 89.107.191.255 de 89.107.192.0 - 89.107.207.255 ru 89.107.208.0 - 89.107.223.255 se -89.107.224.0 - 89.107.224.40 tr -89.107.224.41 - 89.107.224.46 us -89.107.224.47 - 89.107.226.51 tr -89.107.226.52 - 89.107.226.53 us -89.107.226.54 - 89.107.227.96 tr -89.107.227.97 - 89.107.227.105 gb -89.107.227.106 - 89.107.227.113 tr -89.107.227.114 - 89.107.227.126 us -89.107.227.127 - 89.107.228.64 tr -89.107.228.65 - 89.107.228.94 gb -89.107.228.95 - 89.107.231.255 tr +89.107.224.0 - 89.107.231.255 tr 89.107.232.0 - 89.107.239.255 gb 89.107.240.0 - 89.107.247.255 es 89.107.248.0 - 89.107.255.255 hu @@ -51126,16 +26063,12 @@ 89.109.128.0 - 89.110.127.255 ru 89.110.128.0 - 89.110.191.255 de 89.110.192.0 - 89.110.255.255 rs -89.111.0.0 - 89.111.3.255 lv -89.111.4.0 - 89.111.4.255 lt -89.111.5.0 - 89.111.6.255 lv -89.111.7.0 - 89.111.7.255 lt -89.111.8.0 - 89.111.63.255 lv +89.111.0.0 - 89.111.63.255 lv 89.111.64.0 - 89.111.127.255 cz 89.111.128.0 - 89.111.191.255 ru 89.111.192.0 - 89.111.255.255 ba 89.112.0.0 - 89.113.255.255 ru -89.114.0.0 - 89.115.255.255 ro +89.114.0.0 - 89.115.255.255 pt 89.116.0.0 - 89.117.255.255 lt 89.118.0.0 - 89.119.255.255 it 89.120.0.0 - 89.123.255.255 ro @@ -51148,39 +26081,23 @@ 89.142.0.0 - 89.143.239.255 si 89.143.240.0 - 89.143.243.255 hr 89.143.244.0 - 89.143.255.255 si -89.144.0.0 - 89.144.57.30 de -89.144.57.31 - 89.144.57.47 ir -89.144.57.48 - 89.144.63.255 de +89.144.0.0 - 89.144.63.255 de 89.144.64.0 - 89.144.127.255 sa 89.144.128.0 - 89.144.191.255 ir 89.144.192.0 - 89.144.255.255 at 89.145.0.0 - 89.145.63.255 de -89.145.64.0 - 89.145.65.95 gb -89.145.65.96 - 89.145.65.127 se -89.145.65.128 - 89.145.108.243 gb -89.145.108.244 - 89.145.108.247 ie -89.145.108.248 - 89.145.109.255 gb -89.145.110.0 - 89.145.111.255 se -89.145.112.0 - 89.145.123.191 gb -89.145.123.192 - 89.145.123.255 cy -89.145.124.0 - 89.145.127.255 gb +89.145.64.0 - 89.145.127.255 gb 89.145.128.0 - 89.145.159.255 ru 89.145.160.0 - 89.145.167.255 it 89.145.168.0 - 89.145.175.255 gb -89.145.176.0 - 89.145.183.255 ch +89.145.176.0 - 89.145.179.255 fr +89.145.180.0 - 89.145.183.255 ch +89.145.184.0 - 89.145.191.255 tr 89.145.192.0 - 89.145.255.255 gb 89.146.0.0 - 89.146.63.255 nl 89.146.64.0 - 89.146.127.255 uz 89.146.128.0 - 89.146.191.255 ba -89.146.192.0 - 89.146.199.127 de -89.146.199.128 - 89.146.199.255 pl -89.146.200.0 - 89.146.207.31 de -89.146.207.32 - 89.146.207.39 nl -89.146.207.40 - 89.146.209.255 de -89.146.210.0 - 89.146.210.255 nl -89.146.211.0 - 89.146.215.247 de -89.146.215.248 - 89.146.215.251 nl -89.146.215.252 - 89.146.255.255 de +89.146.192.0 - 89.146.255.255 de 89.147.0.0 - 89.147.63.255 sa 89.147.64.0 - 89.147.127.255 hu 89.147.128.0 - 89.147.191.255 se @@ -51191,69 +26108,34 @@ 89.148.192.0 - 89.148.255.255 ru 89.149.0.0 - 89.149.63.255 ro 89.149.64.0 - 89.149.127.255 md -89.149.128.0 - 89.149.148.255 us -89.149.149.0 - 89.149.149.15 fr -89.149.149.16 - 89.149.149.31 ie -89.149.149.32 - 89.149.149.63 gb -89.149.149.64 - 89.149.149.79 fr -89.149.149.80 - 89.149.149.87 ie -89.149.149.88 - 89.149.149.127 fr -89.149.149.128 - 89.149.149.135 ie -89.149.149.136 - 89.149.149.151 fr -89.149.149.152 - 89.149.149.159 es -89.149.149.160 - 89.149.149.191 fr -89.149.149.192 - 89.149.149.223 gb -89.149.149.224 - 89.149.149.255 ie -89.149.150.0 - 89.149.150.255 es -89.149.151.0 - 89.149.151.255 fr -89.149.152.0 - 89.149.156.31 us -89.149.156.32 - 89.149.156.127 fr -89.149.156.128 - 89.149.163.255 us -89.149.164.0 - 89.149.164.31 fr -89.149.164.32 - 89.149.164.39 es -89.149.164.40 - 89.149.164.47 fr -89.149.164.48 - 89.149.164.63 es -89.149.164.64 - 89.149.164.127 fr -89.149.164.128 - 89.149.164.143 es -89.149.164.144 - 89.149.164.255 fr -89.149.165.0 - 89.149.165.255 us -89.149.166.0 - 89.149.167.255 fr -89.149.168.0 - 89.149.168.63 us -89.149.168.64 - 89.149.168.255 fr -89.149.169.0 - 89.149.171.7 us -89.149.171.8 - 89.149.171.255 fr -89.149.172.0 - 89.149.174.255 us +89.149.128.0 - 89.149.143.255 fr +89.149.144.0 - 89.149.147.255 de +89.149.148.0 - 89.149.148.255 fr +89.149.149.0 - 89.149.149.15 gb +89.149.149.16 - 89.149.149.95 fr +89.149.149.96 - 89.149.149.127 gb +89.149.149.128 - 89.149.150.255 fr +89.149.151.0 - 89.149.155.255 de +89.149.156.0 - 89.149.159.255 fr +89.149.160.0 - 89.149.163.255 us +89.149.164.0 - 89.149.164.63 fr +89.149.164.64 - 89.149.164.127 gb +89.149.164.128 - 89.149.164.143 fr +89.149.164.144 - 89.149.164.159 cz +89.149.164.160 - 89.149.164.191 ie +89.149.164.192 - 89.149.168.255 fr +89.149.169.0 - 89.149.169.255 us +89.149.170.0 - 89.149.171.15 fr +89.149.171.16 - 89.149.171.31 de +89.149.171.32 - 89.149.171.127 fr +89.149.171.128 - 89.149.171.255 de +89.149.172.0 - 89.149.174.255 fr 89.149.175.0 - 89.149.175.255 nl -89.149.176.0 - 89.149.178.255 de -89.149.179.0 - 89.149.179.255 fr -89.149.180.0 - 89.149.192.15 de -89.149.192.16 - 89.149.192.255 tr -89.149.193.0 - 89.149.193.15 de -89.149.193.16 - 89.149.193.255 pl -89.149.194.0 - 89.149.197.15 de -89.149.197.16 - 89.149.197.31 ae -89.149.197.32 - 89.149.197.255 de -89.149.198.0 - 89.149.198.255 tr -89.149.199.0 - 89.149.202.255 de -89.149.203.0 - 89.149.204.255 tr -89.149.205.0 - 89.149.209.255 de -89.149.210.0 - 89.149.210.255 pl -89.149.211.0 - 89.149.211.255 de -89.149.212.0 - 89.149.212.255 pl -89.149.213.0 - 89.149.224.255 de -89.149.225.0 - 89.149.225.255 pl -89.149.226.0 - 89.149.229.255 de -89.149.230.0 - 89.149.231.255 pl -89.149.232.0 - 89.149.232.255 de -89.149.233.0 - 89.149.234.255 pl -89.149.235.0 - 89.149.235.255 lt -89.149.236.0 - 89.149.236.255 hk -89.149.237.0 - 89.149.245.47 de -89.149.245.48 - 89.149.245.63 mk -89.149.245.64 - 89.149.245.255 de +89.149.176.0 - 89.149.191.255 fr +89.149.192.0 - 89.149.245.255 de 89.149.246.0 - 89.149.246.255 pl -89.149.247.0 - 89.149.248.255 de -89.149.249.0 - 89.149.250.255 pl +89.149.247.0 - 89.149.249.255 de +89.149.250.0 - 89.149.250.255 pl 89.149.251.0 - 89.149.255.255 de 89.150.0.0 - 89.150.15.255 ge 89.150.16.0 - 89.150.31.255 gb @@ -51264,47 +26146,46 @@ 89.151.64.0 - 89.151.127.255 gb 89.151.128.0 - 89.151.191.255 ru 89.151.192.0 - 89.151.255.255 no -89.152.0.0 - 89.155.255.255 pt -89.156.0.0 - 89.159.255.255 fr +89.152.0.0 - 89.155.155.154 pt +89.155.155.155 - 89.155.155.155 gb +89.155.155.156 - 89.155.255.255 pt +89.156.0.0 - 89.157.116.10 fr +89.157.116.11 - 89.157.116.11 gp +89.157.116.12 - 89.159.255.255 fr 89.160.0.0 - 89.160.127.255 se 89.160.128.0 - 89.160.255.255 is 89.161.0.0 - 89.161.255.255 pl 89.162.0.0 - 89.162.127.255 no 89.162.128.0 - 89.162.255.255 ua 89.163.0.0 - 89.163.127.255 ru -89.163.128.0 - 89.163.160.47 de +89.163.128.0 - 89.163.160.7 de +89.163.160.8 - 89.163.160.15 gr +89.163.160.16 - 89.163.160.47 de 89.163.160.48 - 89.163.160.55 be -89.163.160.56 - 89.163.160.79 de -89.163.160.80 - 89.163.160.87 at -89.163.160.88 - 89.163.160.95 gr -89.163.160.96 - 89.163.160.111 de +89.163.160.56 - 89.163.160.111 de 89.163.160.112 - 89.163.160.119 fr 89.163.160.120 - 89.163.160.127 pl 89.163.160.128 - 89.163.160.135 it 89.163.160.136 - 89.163.160.143 de 89.163.160.144 - 89.163.160.151 gb -89.163.160.152 - 89.163.160.199 de -89.163.160.200 - 89.163.160.207 it -89.163.160.208 - 89.163.160.215 de -89.163.160.216 - 89.163.160.231 it -89.163.160.232 - 89.163.160.247 de -89.163.160.248 - 89.163.160.255 ca -89.163.161.0 - 89.163.162.111 de +89.163.160.152 - 89.163.162.111 de 89.163.162.112 - 89.163.162.119 nl -89.163.162.120 - 89.163.163.31 de -89.163.163.32 - 89.163.163.39 at +89.163.162.120 - 89.163.163.39 de 89.163.163.40 - 89.163.163.47 ch 89.163.163.48 - 89.163.163.55 de 89.163.163.56 - 89.163.163.63 ch -89.163.163.64 - 89.163.163.119 de +89.163.163.64 - 89.163.163.79 de +89.163.163.80 - 89.163.163.87 gr +89.163.163.88 - 89.163.163.119 de 89.163.163.120 - 89.163.163.127 no 89.163.163.128 - 89.163.163.223 de 89.163.163.224 - 89.163.163.231 fr 89.163.163.232 - 89.163.166.215 de -89.163.166.216 - 89.163.166.223 be +89.163.166.216 - 89.163.166.223 at 89.163.166.224 - 89.163.166.247 de 89.163.166.248 - 89.163.166.255 pt -89.163.167.0 - 89.163.167.23 de +89.163.167.0 - 89.163.167.7 ro +89.163.167.8 - 89.163.167.23 de 89.163.167.24 - 89.163.167.31 be 89.163.167.32 - 89.163.167.39 gr 89.163.167.40 - 89.163.167.63 de @@ -51313,11 +26194,9 @@ 89.163.167.88 - 89.163.167.95 it 89.163.167.96 - 89.163.167.119 de 89.163.167.120 - 89.163.167.127 gr -89.163.167.128 - 89.163.167.135 at +89.163.167.128 - 89.163.167.135 de 89.163.167.136 - 89.163.167.143 be -89.163.167.144 - 89.163.167.175 de -89.163.167.176 - 89.163.167.183 it -89.163.167.184 - 89.163.167.239 de +89.163.167.144 - 89.163.167.239 de 89.163.167.240 - 89.163.167.247 gb 89.163.167.248 - 89.163.170.7 de 89.163.170.8 - 89.163.170.23 th @@ -51325,34 +26204,32 @@ 89.163.170.56 - 89.163.170.63 ro 89.163.170.64 - 89.163.170.71 it 89.163.170.72 - 89.163.170.79 at -89.163.170.80 - 89.163.170.87 gr -89.163.170.88 - 89.163.170.95 us -89.163.170.96 - 89.163.170.103 be -89.163.170.104 - 89.163.170.127 de -89.163.170.128 - 89.163.170.191 it -89.163.170.192 - 89.163.170.199 be -89.163.170.200 - 89.163.170.239 de +89.163.170.80 - 89.163.170.95 de +89.163.170.96 - 89.163.170.103 it +89.163.170.104 - 89.163.170.223 de +89.163.170.224 - 89.163.170.231 it +89.163.170.232 - 89.163.170.239 de 89.163.170.240 - 89.163.170.247 ch 89.163.170.248 - 89.163.171.47 de -89.163.171.48 - 89.163.171.63 be -89.163.171.64 - 89.163.171.135 de +89.163.171.48 - 89.163.171.55 be +89.163.171.56 - 89.163.171.135 de 89.163.171.136 - 89.163.171.143 gr 89.163.171.144 - 89.163.171.199 de -89.163.171.200 - 89.163.171.207 nl -89.163.171.208 - 89.163.171.231 de -89.163.171.232 - 89.163.171.239 it +89.163.171.200 - 89.163.171.207 th +89.163.171.208 - 89.163.171.239 de 89.163.171.240 - 89.163.171.247 gr 89.163.171.248 - 89.163.172.7 de 89.163.172.8 - 89.163.172.23 gr 89.163.172.24 - 89.163.172.167 de -89.163.172.168 - 89.163.172.175 us -89.163.172.176 - 89.163.172.191 de +89.163.172.168 - 89.163.172.175 at +89.163.172.176 - 89.163.172.183 de +89.163.172.184 - 89.163.172.191 pl 89.163.172.192 - 89.163.172.207 gb -89.163.172.208 - 89.163.172.223 de -89.163.172.224 - 89.163.172.231 mx -89.163.172.232 - 89.163.173.7 de +89.163.172.208 - 89.163.172.215 ro +89.163.172.216 - 89.163.173.7 de 89.163.173.8 - 89.163.173.15 it -89.163.173.16 - 89.163.173.55 de +89.163.173.16 - 89.163.173.47 de +89.163.173.48 - 89.163.173.55 ro 89.163.173.56 - 89.163.173.63 it 89.163.173.64 - 89.163.173.79 de 89.163.173.80 - 89.163.173.87 it @@ -51360,73 +26237,133 @@ 89.163.173.112 - 89.163.173.119 gb 89.163.173.120 - 89.163.173.127 at 89.163.173.128 - 89.163.173.135 ch -89.163.173.136 - 89.163.173.183 de -89.163.173.184 - 89.163.173.199 at -89.163.173.200 - 89.163.173.239 de +89.163.173.136 - 89.163.173.191 de +89.163.173.192 - 89.163.173.207 at +89.163.173.208 - 89.163.173.239 de 89.163.173.240 - 89.163.173.247 nl 89.163.173.248 - 89.163.174.7 de 89.163.174.8 - 89.163.174.15 it -89.163.174.16 - 89.163.174.23 de -89.163.174.24 - 89.163.174.31 gb -89.163.174.32 - 89.163.174.47 de +89.163.174.16 - 89.163.174.47 de 89.163.174.48 - 89.163.174.55 gr 89.163.174.56 - 89.163.174.63 ch -89.163.174.64 - 89.163.174.127 de -89.163.174.128 - 89.163.174.135 at -89.163.174.136 - 89.163.174.151 be -89.163.174.152 - 89.163.174.159 ch +89.163.174.64 - 89.163.174.135 de +89.163.174.136 - 89.163.174.143 be +89.163.174.144 - 89.163.174.159 de 89.163.174.160 - 89.163.174.167 gr 89.163.174.168 - 89.163.174.175 nl -89.163.174.176 - 89.163.174.183 ru -89.163.174.184 - 89.163.174.199 de -89.163.174.200 - 89.163.174.207 th -89.163.174.208 - 89.163.174.215 de +89.163.174.176 - 89.163.174.215 de 89.163.174.216 - 89.163.174.231 gr -89.163.174.232 - 89.163.175.7 de +89.163.174.232 - 89.163.174.239 ch +89.163.174.240 - 89.163.174.247 de +89.163.174.248 - 89.163.174.255 ro +89.163.175.0 - 89.163.175.7 de 89.163.175.8 - 89.163.175.15 ch 89.163.175.16 - 89.163.175.31 de 89.163.175.32 - 89.163.175.39 it 89.163.175.40 - 89.163.175.47 gr 89.163.175.48 - 89.163.175.71 de -89.163.175.72 - 89.163.175.87 br -89.163.175.88 - 89.163.175.103 de -89.163.175.104 - 89.163.175.111 it -89.163.175.112 - 89.163.209.255 de -89.163.210.0 - 89.163.213.255 it -89.163.214.0 - 89.163.255.255 de +89.163.175.72 - 89.163.175.79 it +89.163.175.80 - 89.163.175.151 de +89.163.175.152 - 89.163.175.159 sk +89.163.175.160 - 89.163.175.183 de +89.163.175.184 - 89.163.175.191 be +89.163.175.192 - 89.163.176.39 de +89.163.176.40 - 89.163.176.47 it +89.163.176.48 - 89.163.176.55 be +89.163.176.56 - 89.163.177.15 de +89.163.177.16 - 89.163.177.23 be +89.163.177.24 - 89.163.177.31 it +89.163.177.32 - 89.163.177.39 be +89.163.177.40 - 89.163.177.47 de +89.163.177.48 - 89.163.177.55 it +89.163.177.56 - 89.163.177.239 de +89.163.177.240 - 89.163.177.247 ru +89.163.177.248 - 89.163.180.7 de +89.163.180.8 - 89.163.180.15 be +89.163.180.16 - 89.163.180.31 it +89.163.180.32 - 89.163.180.47 de +89.163.180.48 - 89.163.180.55 tw +89.163.180.56 - 89.163.183.15 de +89.163.183.16 - 89.163.183.23 it +89.163.183.24 - 89.163.183.31 ch +89.163.183.32 - 89.163.183.127 de +89.163.183.128 - 89.163.183.255 tw +89.163.184.0 - 89.163.185.55 de +89.163.185.56 - 89.163.185.63 it +89.163.185.64 - 89.163.185.127 de +89.163.185.128 - 89.163.185.135 ba +89.163.185.136 - 89.163.185.183 de +89.163.185.184 - 89.163.185.191 be +89.163.185.192 - 89.163.185.215 de +89.163.185.216 - 89.163.185.223 nl +89.163.185.224 - 89.163.186.7 de +89.163.186.8 - 89.163.186.15 us +89.163.186.16 - 89.163.186.127 de +89.163.186.128 - 89.163.186.191 be +89.163.186.192 - 89.163.186.199 ro +89.163.186.200 - 89.163.191.199 de +89.163.191.200 - 89.163.191.207 it +89.163.191.208 - 89.163.191.223 de +89.163.191.224 - 89.163.191.231 it +89.163.191.232 - 89.163.194.63 de +89.163.194.64 - 89.163.194.71 it +89.163.194.72 - 89.163.194.87 de +89.163.194.88 - 89.163.194.95 be +89.163.194.96 - 89.163.194.111 de +89.163.194.112 - 89.163.194.119 ch +89.163.194.120 - 89.163.199.15 de +89.163.199.16 - 89.163.199.23 ch +89.163.199.24 - 89.163.199.31 es +89.163.199.32 - 89.163.199.47 de +89.163.199.48 - 89.163.199.55 ye +89.163.199.56 - 89.163.199.63 de +89.163.199.64 - 89.163.199.71 be +89.163.199.72 - 89.163.199.79 de +89.163.199.80 - 89.163.199.87 fi +89.163.199.88 - 89.163.199.111 de +89.163.199.112 - 89.163.199.119 it +89.163.199.120 - 89.163.199.127 at +89.163.199.128 - 89.163.200.71 de +89.163.200.72 - 89.163.200.79 fi +89.163.200.80 - 89.163.200.103 de +89.163.200.104 - 89.163.200.111 gb +89.163.200.112 - 89.163.200.191 de +89.163.200.192 - 89.163.200.199 ua +89.163.200.200 - 89.163.200.223 de +89.163.200.224 - 89.163.200.231 at +89.163.200.232 - 89.163.201.7 de +89.163.201.8 - 89.163.201.15 ch +89.163.201.16 - 89.163.201.23 tr +89.163.201.24 - 89.163.201.63 de +89.163.201.64 - 89.163.201.127 tr +89.163.201.128 - 89.163.202.39 de +89.163.202.40 - 89.163.202.47 at +89.163.202.48 - 89.163.202.79 de +89.163.202.80 - 89.163.202.87 gr +89.163.202.88 - 89.163.202.103 de +89.163.202.104 - 89.163.202.111 mx +89.163.202.112 - 89.163.202.127 de +89.163.202.128 - 89.163.202.135 at +89.163.202.136 - 89.163.202.191 de +89.163.202.192 - 89.163.202.255 tr +89.163.203.0 - 89.163.255.255 de 89.164.0.0 - 89.164.255.255 hr 89.165.0.0 - 89.165.127.255 ir 89.165.128.0 - 89.165.255.255 ro 89.166.0.0 - 89.166.127.255 fi 89.166.128.0 - 89.166.255.255 de 89.167.0.0 - 89.167.127.255 pl -89.167.128.0 - 89.167.138.63 gb -89.167.138.64 - 89.167.138.127 ie -89.167.138.128 - 89.167.139.95 gb -89.167.139.96 - 89.167.139.111 ie -89.167.139.112 - 89.167.147.255 gb +89.167.128.0 - 89.167.128.255 gb +89.167.129.0 - 89.167.129.255 es +89.167.130.0 - 89.167.130.255 gb +89.167.131.0 - 89.167.131.255 de +89.167.132.0 - 89.167.133.255 gb +89.167.134.0 - 89.167.134.255 fr +89.167.135.0 - 89.167.147.255 gb 89.167.148.0 - 89.167.151.255 ie -89.167.152.0 - 89.167.156.255 gb -89.167.157.0 - 89.167.157.255 ie -89.167.158.0 - 89.167.173.255 gb -89.167.174.0 - 89.167.174.255 ie -89.167.175.0 - 89.167.186.255 gb -89.167.187.0 - 89.167.187.255 ie -89.167.188.0 - 89.167.207.255 gb -89.167.208.0 - 89.167.208.255 ie -89.167.209.0 - 89.167.211.255 gb -89.167.212.0 - 89.167.212.255 pt -89.167.213.0 - 89.167.214.255 gb -89.167.215.0 - 89.167.215.255 us -89.167.216.0 - 89.167.219.255 gb +89.167.152.0 - 89.167.219.255 gb 89.167.220.0 - 89.167.220.255 ie -89.167.221.0 - 89.167.225.255 gb -89.167.226.0 - 89.167.227.255 ie -89.167.228.0 - 89.167.232.255 gb -89.167.233.0 - 89.167.233.255 ie -89.167.234.0 - 89.167.240.255 gb -89.167.241.0 - 89.167.241.255 ie -89.167.242.0 - 89.168.255.255 gb +89.167.221.0 - 89.168.255.255 gb 89.169.0.0 - 89.169.255.255 ru 89.170.0.0 - 89.170.255.255 fr 89.171.0.0 - 89.171.255.255 pl @@ -51447,169 +26384,35 @@ 89.184.192.0 - 89.184.223.255 ir 89.184.224.0 - 89.184.255.255 ru 89.185.0.0 - 89.185.31.255 ua -89.185.32.0 - 89.185.35.7 fr -89.185.35.8 - 89.185.35.15 gb -89.185.35.16 - 89.185.35.23 be -89.185.35.24 - 89.185.35.31 es -89.185.35.32 - 89.185.35.39 nl -89.185.35.40 - 89.185.35.47 de -89.185.35.48 - 89.185.35.55 it -89.185.35.56 - 89.185.35.63 pt -89.185.35.64 - 89.185.35.71 us -89.185.35.72 - 89.185.35.79 ch -89.185.35.80 - 89.185.37.52 fr -89.185.37.53 - 89.185.37.53 lu -89.185.37.54 - 89.185.38.191 fr -89.185.38.192 - 89.185.38.207 es -89.185.38.208 - 89.185.38.223 de -89.185.38.224 - 89.185.38.239 gb -89.185.38.240 - 89.185.38.255 it -89.185.39.0 - 89.185.63.255 fr +89.185.32.0 - 89.185.63.255 fr 89.185.64.0 - 89.185.95.255 ru -89.185.96.0 - 89.185.96.143 at -89.185.96.144 - 89.185.96.175 de -89.185.96.176 - 89.185.97.207 at -89.185.97.208 - 89.185.97.223 de -89.185.97.224 - 89.185.98.127 at -89.185.98.128 - 89.185.98.159 de -89.185.98.160 - 89.185.98.223 at -89.185.98.224 - 89.185.99.95 de -89.185.99.96 - 89.185.99.103 at -89.185.99.104 - 89.185.99.255 de -89.185.100.0 - 89.185.101.63 at -89.185.101.64 - 89.185.101.175 de -89.185.101.176 - 89.185.103.143 at -89.185.103.144 - 89.185.109.47 de -89.185.109.48 - 89.185.109.79 at -89.185.109.80 - 89.185.110.247 de -89.185.110.248 - 89.185.110.255 at -89.185.111.0 - 89.185.111.255 de -89.185.112.0 - 89.185.127.255 at -89.185.128.0 - 89.185.128.63 gb -89.185.128.64 - 89.185.128.79 ie -89.185.128.80 - 89.185.128.95 gb -89.185.128.96 - 89.185.128.223 ie -89.185.128.224 - 89.185.128.255 gb -89.185.129.0 - 89.185.142.255 ie -89.185.143.0 - 89.185.143.7 gb -89.185.143.8 - 89.185.144.223 ie -89.185.144.224 - 89.185.144.239 gb -89.185.144.240 - 89.185.145.119 ie -89.185.145.120 - 89.185.145.127 gb -89.185.145.128 - 89.185.146.127 ie -89.185.146.128 - 89.185.146.191 gb -89.185.146.192 - 89.185.154.63 ie -89.185.154.64 - 89.185.154.103 gb -89.185.154.104 - 89.185.154.127 ie -89.185.154.128 - 89.185.154.167 gb -89.185.154.168 - 89.185.154.175 ie -89.185.154.176 - 89.185.154.191 gb -89.185.154.192 - 89.185.154.255 ie -89.185.155.0 - 89.185.155.7 gb -89.185.155.8 - 89.185.157.0 ie -89.185.157.1 - 89.185.157.63 gb -89.185.157.64 - 89.185.157.79 ie -89.185.157.80 - 89.185.157.119 gb -89.185.157.120 - 89.185.157.247 ie -89.185.157.248 - 89.185.158.31 gb -89.185.158.32 - 89.185.158.32 ie -89.185.158.33 - 89.185.158.47 gb -89.185.158.48 - 89.185.158.127 ie -89.185.158.128 - 89.185.158.143 gb -89.185.158.144 - 89.185.158.191 ie -89.185.158.192 - 89.185.158.223 gb -89.185.158.224 - 89.185.158.239 ie -89.185.158.240 - 89.185.159.127 gb -89.185.159.128 - 89.185.159.255 ie +89.185.96.0 - 89.185.127.255 at +89.185.128.0 - 89.185.159.255 ie 89.185.160.0 - 89.185.191.255 fr 89.185.192.0 - 89.185.223.255 mk -89.185.224.0 - 89.185.247.47 cz -89.185.247.48 - 89.185.247.55 sk -89.185.247.56 - 89.185.247.59 cz -89.185.247.60 - 89.185.247.63 sk -89.185.247.64 - 89.185.247.143 cz -89.185.247.144 - 89.185.247.159 sk -89.185.247.160 - 89.185.255.255 cz +89.185.224.0 - 89.185.255.255 cz 89.186.0.0 - 89.186.31.255 pl 89.186.32.0 - 89.186.63.255 sm 89.186.64.0 - 89.186.95.255 it 89.186.96.0 - 89.186.127.255 hu 89.186.128.0 - 89.186.159.255 de 89.186.160.0 - 89.186.191.255 dk -89.186.192.0 - 89.186.223.255 bg +89.186.192.0 - 89.186.199.255 ch +89.186.200.0 - 89.186.207.255 bg +89.186.208.0 - 89.186.215.255 ch +89.186.216.0 - 89.186.223.255 at 89.186.224.0 - 89.186.255.255 ru 89.187.0.0 - 89.187.31.255 ua 89.187.32.0 - 89.187.63.255 md -89.187.64.0 - 89.187.96.71 gb -89.187.96.72 - 89.187.96.79 us -89.187.96.80 - 89.187.97.39 gb -89.187.97.40 - 89.187.97.47 no -89.187.97.48 - 89.187.100.111 gb -89.187.100.112 - 89.187.100.119 se -89.187.100.120 - 89.187.100.127 us -89.187.100.128 - 89.187.101.127 gb -89.187.101.128 - 89.187.101.255 us -89.187.102.0 - 89.187.105.31 gb -89.187.105.32 - 89.187.105.39 us -89.187.105.40 - 89.187.105.47 gb -89.187.105.48 - 89.187.105.55 us -89.187.105.56 - 89.187.105.63 sg -89.187.105.64 - 89.187.105.127 gb -89.187.105.128 - 89.187.105.159 au -89.187.105.160 - 89.187.105.175 gb -89.187.105.176 - 89.187.105.191 de -89.187.105.192 - 89.187.105.207 nz -89.187.105.208 - 89.187.107.63 gb -89.187.107.64 - 89.187.107.95 cz -89.187.107.96 - 89.187.107.111 gb -89.187.107.112 - 89.187.107.127 ie -89.187.107.128 - 89.187.107.255 us -89.187.108.0 - 89.187.109.143 gb -89.187.109.144 - 89.187.109.159 nl -89.187.109.160 - 89.187.110.67 gb -89.187.110.68 - 89.187.110.71 us -89.187.110.72 - 89.187.110.79 gb -89.187.110.80 - 89.187.110.83 nz -89.187.110.84 - 89.187.110.95 us -89.187.110.96 - 89.187.110.103 gb -89.187.110.104 - 89.187.110.111 us -89.187.110.112 - 89.187.110.143 gb -89.187.110.144 - 89.187.110.151 de -89.187.110.152 - 89.187.110.175 gb -89.187.110.176 - 89.187.110.183 us -89.187.110.184 - 89.187.111.127 gb -89.187.111.128 - 89.187.111.207 us -89.187.111.208 - 89.187.111.255 gb -89.187.112.0 - 89.187.112.127 us -89.187.112.128 - 89.187.112.215 gb -89.187.112.216 - 89.187.112.219 us -89.187.112.220 - 89.187.112.223 gb -89.187.112.224 - 89.187.112.239 us -89.187.112.240 - 89.187.113.255 gb -89.187.114.0 - 89.187.114.255 us -89.187.115.0 - 89.187.115.31 gb -89.187.115.32 - 89.187.115.39 us -89.187.115.40 - 89.187.115.87 gb -89.187.115.88 - 89.187.115.91 il -89.187.115.92 - 89.187.115.95 us -89.187.115.96 - 89.187.115.115 gb -89.187.115.116 - 89.187.115.119 us -89.187.115.120 - 89.187.119.255 gb -89.187.120.0 - 89.187.120.255 us -89.187.121.0 - 89.187.121.23 gb -89.187.121.24 - 89.187.121.63 us -89.187.121.64 - 89.187.121.87 gb -89.187.121.88 - 89.187.121.95 us -89.187.121.96 - 89.187.121.111 gb -89.187.121.112 - 89.187.121.127 us -89.187.121.128 - 89.187.127.255 gb +89.187.64.0 - 89.187.127.255 gb 89.187.128.0 - 89.187.199.255 cz 89.187.200.0 - 89.187.215.255 de 89.187.216.0 - 89.187.223.255 lb 89.187.224.0 - 89.187.255.255 pl 89.188.0.0 - 89.188.31.255 nl 89.188.32.0 - 89.188.63.255 me -89.188.64.0 - 89.188.95.255 sa +89.188.64.0 - 89.188.71.255 at +89.188.72.0 - 89.188.95.255 dk 89.188.96.0 - 89.188.127.255 ru 89.188.128.0 - 89.188.159.255 it 89.188.160.0 - 89.188.191.255 ru @@ -51625,31 +26428,20 @@ 89.190.89.0 - 89.190.89.255 pl 89.190.90.0 - 89.190.95.255 cz 89.190.96.0 - 89.190.127.255 lt -89.190.128.0 - 89.190.159.255 bh -89.190.160.0 - 89.190.172.167 it -89.190.172.168 - 89.190.172.171 de -89.190.172.172 - 89.190.181.215 it -89.190.181.216 - 89.190.181.223 us -89.190.181.224 - 89.190.191.255 it +89.190.160.0 - 89.190.191.255 it 89.190.192.0 - 89.190.223.255 bg 89.190.224.0 - 89.190.255.255 ru 89.191.0.0 - 89.191.31.255 no 89.191.32.0 - 89.191.63.255 ie -89.191.64.0 - 89.191.69.63 de -89.191.69.64 - 89.191.69.255 at -89.191.70.0 - 89.191.73.255 de -89.191.74.0 - 89.191.75.255 at -89.191.76.0 - 89.191.95.255 de +89.191.64.0 - 89.191.95.255 de 89.191.96.0 - 89.191.127.255 lv 89.191.128.0 - 89.191.191.255 pl -89.191.192.0 - 89.191.216.239 gb -89.191.216.240 - 89.191.216.255 es -89.191.217.0 - 89.191.219.175 gb -89.191.219.176 - 89.191.219.191 il -89.191.219.192 - 89.191.223.255 gb +89.191.192.0 - 89.191.223.255 gb 89.191.224.0 - 89.191.255.255 ru 89.192.0.0 - 89.195.255.255 gb -89.196.0.0 - 89.199.255.255 de +89.196.0.0 - 89.196.255.255 ir +89.197.0.0 - 89.197.255.255 gb +89.198.0.0 - 89.199.255.255 ir 89.200.0.0 - 89.200.127.255 nl 89.200.128.0 - 89.200.143.255 gb 89.200.144.0 - 89.200.167.255 pl @@ -51665,313 +26457,94 @@ 89.200.248.0 - 89.200.255.255 ua 89.201.0.0 - 89.201.127.255 lv 89.201.128.0 - 89.201.255.255 hr -89.202.0.0 - 89.202.31.255 de -89.202.32.0 - 89.202.32.7 cy -89.202.32.8 - 89.202.32.15 gb -89.202.32.16 - 89.202.32.31 ca -89.202.32.32 - 89.202.33.31 de -89.202.33.32 - 89.202.33.39 ca -89.202.33.40 - 89.202.45.63 de -89.202.45.64 - 89.202.45.95 cy -89.202.45.96 - 89.202.45.126 ca -89.202.45.127 - 89.202.47.127 de -89.202.47.128 - 89.202.47.159 cy -89.202.47.160 - 89.202.47.175 ca -89.202.47.176 - 89.202.47.191 gb -89.202.47.192 - 89.202.47.223 us -89.202.47.224 - 89.202.65.47 de -89.202.65.48 - 89.202.65.63 ca -89.202.65.64 - 89.202.67.15 de -89.202.67.16 - 89.202.67.31 gb -89.202.67.32 - 89.202.67.95 de -89.202.67.96 - 89.202.67.111 ca -89.202.67.112 - 89.202.69.63 de -89.202.69.64 - 89.202.69.79 us -89.202.69.80 - 89.202.102.255 de -89.202.103.0 - 89.202.103.15 fr -89.202.103.16 - 89.202.103.19 gb -89.202.103.20 - 89.202.103.255 de -89.202.104.0 - 89.202.105.127 us -89.202.105.128 - 89.202.105.175 de -89.202.105.176 - 89.202.105.191 bg -89.202.105.192 - 89.202.105.207 de -89.202.105.208 - 89.202.105.239 nl -89.202.105.240 - 89.202.105.247 us -89.202.105.248 - 89.202.105.255 de -89.202.106.0 - 89.202.106.255 mu -89.202.107.0 - 89.202.107.15 ca -89.202.107.16 - 89.202.107.31 us -89.202.107.32 - 89.202.107.63 in -89.202.107.64 - 89.202.107.95 de -89.202.107.96 - 89.202.107.103 us -89.202.107.104 - 89.202.107.111 de -89.202.107.112 - 89.202.107.127 ca -89.202.107.128 - 89.202.107.255 de -89.202.108.0 - 89.202.108.127 hk -89.202.108.128 - 89.202.108.223 gb -89.202.108.224 - 89.202.108.239 il -89.202.108.240 - 89.202.108.255 gb -89.202.109.0 - 89.202.109.127 us -89.202.109.128 - 89.202.110.127 de -89.202.110.128 - 89.202.110.143 kr -89.202.110.144 - 89.202.110.191 de -89.202.110.192 - 89.202.110.207 us -89.202.110.208 - 89.202.110.215 de -89.202.110.216 - 89.202.110.223 fr -89.202.110.224 - 89.202.110.227 us -89.202.110.228 - 89.202.110.231 de -89.202.110.232 - 89.202.110.239 nl -89.202.110.240 - 89.202.110.255 ch -89.202.111.0 - 89.202.111.127 us -89.202.111.128 - 89.202.113.39 de -89.202.113.40 - 89.202.113.47 gb -89.202.113.48 - 89.202.113.147 de -89.202.113.148 - 89.202.113.151 us -89.202.113.152 - 89.202.113.155 de -89.202.113.156 - 89.202.113.159 nl -89.202.113.160 - 89.202.114.255 de -89.202.115.0 - 89.202.115.255 us -89.202.116.0 - 89.202.116.255 de -89.202.117.0 - 89.202.117.127 us -89.202.117.128 - 89.202.117.255 de -89.202.118.0 - 89.202.118.7 us -89.202.118.8 - 89.202.118.15 fr -89.202.118.16 - 89.202.118.31 us -89.202.118.32 - 89.202.118.63 gb -89.202.118.64 - 89.202.118.95 us -89.202.118.96 - 89.202.118.127 de -89.202.118.128 - 89.202.118.255 us -89.202.119.0 - 89.202.119.31 fr -89.202.119.32 - 89.202.119.39 us -89.202.119.40 - 89.202.119.47 gb -89.202.119.48 - 89.202.119.63 us -89.202.119.64 - 89.202.119.127 hk -89.202.119.128 - 89.202.119.255 ca -89.202.120.0 - 89.202.120.127 us -89.202.120.128 - 89.202.120.191 hk -89.202.120.192 - 89.202.120.199 de -89.202.120.200 - 89.202.120.207 fr -89.202.120.208 - 89.202.121.23 de -89.202.121.24 - 89.202.121.31 gb -89.202.121.32 - 89.202.121.63 us -89.202.121.64 - 89.202.121.127 de -89.202.121.128 - 89.202.121.159 us -89.202.121.160 - 89.202.121.175 de -89.202.121.176 - 89.202.121.191 gb -89.202.121.192 - 89.202.121.199 nl -89.202.121.200 - 89.202.121.207 ca -89.202.121.208 - 89.202.121.223 de -89.202.121.224 - 89.202.121.255 ca -89.202.122.0 - 89.202.123.255 mu -89.202.124.0 - 89.202.124.143 us -89.202.124.144 - 89.202.124.159 gb -89.202.124.160 - 89.202.124.175 fr -89.202.124.176 - 89.202.124.187 us -89.202.124.188 - 89.202.124.191 de -89.202.124.192 - 89.202.124.223 hk -89.202.124.224 - 89.202.125.127 de -89.202.125.128 - 89.202.125.159 gb -89.202.125.160 - 89.202.125.191 us -89.202.125.192 - 89.202.125.207 gb -89.202.125.208 - 89.202.125.215 us -89.202.125.216 - 89.202.125.219 nl -89.202.125.220 - 89.202.125.223 us -89.202.125.224 - 89.202.125.239 gb -89.202.125.240 - 89.202.125.247 de -89.202.125.248 - 89.202.125.255 us -89.202.126.0 - 89.202.126.127 de -89.202.126.128 - 89.202.126.159 gb -89.202.126.160 - 89.202.126.167 de -89.202.126.168 - 89.202.126.171 gb -89.202.126.172 - 89.202.126.175 nl -89.202.126.176 - 89.202.126.223 us -89.202.126.224 - 89.202.126.239 de -89.202.126.240 - 89.202.126.247 gb -89.202.126.248 - 89.202.126.251 ie -89.202.126.252 - 89.202.127.143 de -89.202.127.144 - 89.202.127.151 us -89.202.127.152 - 89.202.127.159 gb -89.202.127.160 - 89.202.127.175 nl -89.202.127.176 - 89.202.127.191 de -89.202.127.192 - 89.202.127.255 us -89.202.128.0 - 89.202.131.255 gb -89.202.132.0 - 89.202.135.255 de -89.202.136.0 - 89.202.136.25 fr -89.202.136.26 - 89.202.136.31 gb -89.202.136.32 - 89.202.136.207 fr -89.202.136.208 - 89.202.136.215 gb -89.202.136.216 - 89.202.137.135 fr -89.202.137.136 - 89.202.137.143 nl -89.202.137.144 - 89.202.137.151 gb -89.202.137.152 - 89.202.137.191 fr -89.202.137.192 - 89.202.137.199 gb -89.202.137.200 - 89.202.137.247 fr -89.202.137.248 - 89.202.137.255 gb -89.202.138.0 - 89.202.139.255 fr -89.202.140.0 - 89.202.141.127 nl -89.202.141.128 - 89.202.141.143 gb -89.202.141.144 - 89.202.143.255 nl -89.202.144.0 - 89.202.144.63 it -89.202.144.64 - 89.202.144.103 gb -89.202.144.104 - 89.202.147.127 it -89.202.147.128 - 89.202.147.191 gb +89.202.0.0 - 89.202.45.47 de +89.202.45.48 - 89.202.45.63 gb +89.202.45.64 - 89.202.127.255 de +89.202.128.0 - 89.202.132.109 gb +89.202.132.110 - 89.202.132.110 de +89.202.132.111 - 89.202.133.213 gb +89.202.133.214 - 89.202.133.214 de +89.202.133.215 - 89.202.135.47 gb +89.202.135.48 - 89.202.135.63 de +89.202.135.64 - 89.202.135.79 gb +89.202.135.80 - 89.202.135.95 de +89.202.135.96 - 89.202.135.111 gb +89.202.135.112 - 89.202.135.127 de +89.202.135.128 - 89.202.135.143 gb +89.202.135.144 - 89.202.135.159 de +89.202.135.160 - 89.202.139.63 gb +89.202.139.64 - 89.202.139.71 fr +89.202.139.72 - 89.202.141.231 gb +89.202.141.232 - 89.202.141.239 nl +89.202.141.240 - 89.202.147.191 gb 89.202.147.192 - 89.202.147.255 it -89.202.148.0 - 89.202.148.255 at -89.202.149.0 - 89.202.149.7 gb -89.202.149.8 - 89.202.149.23 at -89.202.149.24 - 89.202.149.31 gb -89.202.149.32 - 89.202.149.63 at -89.202.149.64 - 89.202.149.255 gb -89.202.150.0 - 89.202.151.7 be -89.202.151.8 - 89.202.151.19 gb -89.202.151.20 - 89.202.151.255 be -89.202.152.0 - 89.202.152.255 nl -89.202.153.0 - 89.202.153.255 sk -89.202.154.0 - 89.202.154.7 ch -89.202.154.8 - 89.202.154.15 gb -89.202.154.16 - 89.202.154.79 ch -89.202.154.80 - 89.202.154.95 gb -89.202.154.96 - 89.202.155.255 ch -89.202.156.0 - 89.202.157.79 cz -89.202.157.80 - 89.202.157.159 gb -89.202.157.160 - 89.202.157.175 cz -89.202.157.176 - 89.202.157.191 gb -89.202.157.192 - 89.202.157.255 cz -89.202.158.0 - 89.202.158.14 dk -89.202.158.15 - 89.202.158.15 gb -89.202.158.16 - 89.202.158.31 dk -89.202.158.32 - 89.202.158.63 gb -89.202.158.64 - 89.202.158.79 dk -89.202.158.80 - 89.202.158.87 fi -89.202.158.88 - 89.202.158.95 dk -89.202.158.96 - 89.202.158.111 no -89.202.158.112 - 89.202.158.115 dk -89.202.158.116 - 89.202.158.255 gb -89.202.159.0 - 89.202.161.79 es -89.202.161.80 - 89.202.161.87 gb -89.202.161.88 - 89.202.161.159 es -89.202.161.160 - 89.202.161.175 gb -89.202.161.176 - 89.202.161.183 es -89.202.161.184 - 89.202.161.191 gb -89.202.161.192 - 89.202.162.175 es -89.202.162.176 - 89.202.162.191 gb -89.202.162.192 - 89.202.162.255 es -89.202.163.0 - 89.202.163.255 gb -89.202.164.0 - 89.202.164.255 us -89.202.165.0 - 89.202.165.15 ro -89.202.165.16 - 89.202.165.255 gb -89.202.166.0 - 89.202.166.255 at -89.202.167.0 - 89.202.167.143 se -89.202.167.144 - 89.202.167.151 es -89.202.167.152 - 89.202.167.167 se -89.202.167.168 - 89.202.167.175 gb -89.202.167.176 - 89.202.167.191 se -89.202.167.192 - 89.202.167.199 gb -89.202.167.200 - 89.202.167.223 se -89.202.167.224 - 89.202.167.239 gb -89.202.167.240 - 89.202.167.255 se -89.202.168.0 - 89.202.168.255 de -89.202.169.0 - 89.202.169.63 fr -89.202.169.64 - 89.202.169.79 gb -89.202.169.80 - 89.202.169.255 fr -89.202.170.0 - 89.202.170.255 at -89.202.171.0 - 89.202.171.255 es -89.202.172.0 - 89.202.172.255 it -89.202.173.0 - 89.202.173.255 us -89.202.174.0 - 89.202.174.255 gb -89.202.175.0 - 89.202.175.255 it -89.202.176.0 - 89.202.177.255 ae -89.202.178.0 - 89.202.178.255 hu -89.202.179.0 - 89.202.179.255 it -89.202.180.0 - 89.202.180.255 ie -89.202.181.0 - 89.202.181.15 it -89.202.181.16 - 89.202.181.31 gb -89.202.181.32 - 89.202.181.127 it -89.202.181.128 - 89.202.181.159 gb -89.202.181.160 - 89.202.181.255 it -89.202.182.0 - 89.202.186.127 gb -89.202.186.128 - 89.202.186.159 ch -89.202.186.160 - 89.202.186.167 gb -89.202.186.168 - 89.202.186.175 ch -89.202.186.176 - 89.202.186.191 gb -89.202.186.192 - 89.202.187.255 ch -89.202.188.0 - 89.202.189.255 gb -89.202.190.0 - 89.202.191.255 be -89.202.192.0 - 89.202.193.143 fr -89.202.193.144 - 89.202.193.151 gb -89.202.193.152 - 89.202.193.159 fr -89.202.193.160 - 89.202.193.175 gb -89.202.193.176 - 89.202.193.222 fr -89.202.193.223 - 89.202.193.223 gb -89.202.193.224 - 89.202.194.155 fr -89.202.194.156 - 89.202.194.159 gb -89.202.194.160 - 89.202.194.175 fr -89.202.194.176 - 89.202.194.183 gb -89.202.194.184 - 89.202.195.255 fr -89.202.196.0 - 89.202.196.255 at -89.202.197.0 - 89.202.198.127 it -89.202.198.128 - 89.202.198.131 gb -89.202.198.132 - 89.202.198.135 it -89.202.198.136 - 89.202.198.143 gb -89.202.198.144 - 89.202.198.159 it -89.202.198.160 - 89.202.198.167 gb -89.202.198.168 - 89.202.198.175 fr -89.202.198.176 - 89.202.199.255 it -89.202.200.0 - 89.202.200.167 fr -89.202.200.168 - 89.202.200.191 gb -89.202.200.192 - 89.202.201.255 fr -89.202.202.0 - 89.202.202.255 es -89.202.203.0 - 89.202.203.63 fr -89.202.203.64 - 89.202.203.119 gb -89.202.203.120 - 89.202.203.135 fr -89.202.203.136 - 89.202.203.143 gb -89.202.203.144 - 89.202.203.255 fr -89.202.204.0 - 89.202.205.255 it -89.202.206.0 - 89.202.206.255 se -89.202.207.0 - 89.202.207.183 de -89.202.207.184 - 89.202.207.191 gb -89.202.207.192 - 89.202.208.255 de -89.202.209.0 - 89.202.211.255 gb -89.202.212.0 - 89.202.213.255 nl -89.202.214.0 - 89.202.215.255 gb -89.202.216.0 - 89.202.216.255 de -89.202.217.0 - 89.202.217.255 be -89.202.218.0 - 89.202.218.255 de -89.202.219.0 - 89.202.219.67 gb -89.202.219.68 - 89.202.219.71 nl -89.202.219.72 - 89.202.220.255 gb -89.202.221.0 - 89.202.221.255 de -89.202.222.0 - 89.202.222.255 gb -89.202.223.0 - 89.202.223.7 it -89.202.223.8 - 89.202.223.15 gb -89.202.223.16 - 89.202.223.95 it -89.202.223.96 - 89.202.223.255 gb -89.202.224.0 - 89.202.225.255 it -89.202.226.0 - 89.202.226.255 gb -89.202.227.0 - 89.202.227.255 tz -89.202.228.0 - 89.202.232.255 it -89.202.233.0 - 89.202.233.255 gb -89.202.234.0 - 89.202.234.255 de -89.202.235.0 - 89.202.238.255 it -89.202.239.0 - 89.202.239.255 gb -89.202.240.0 - 89.202.240.39 nl -89.202.240.40 - 89.202.240.43 gb -89.202.240.44 - 89.202.240.63 nl -89.202.240.64 - 89.202.240.95 be -89.202.240.96 - 89.202.240.239 nl -89.202.240.240 - 89.202.240.255 gb -89.202.241.0 - 89.202.241.255 it -89.202.242.0 - 89.202.242.255 gb -89.202.243.0 - 89.202.244.255 it -89.202.245.0 - 89.202.245.255 gb -89.202.246.0 - 89.202.249.7 it -89.202.249.8 - 89.202.249.15 gb -89.202.249.16 - 89.202.249.255 it -89.202.250.0 - 89.202.250.255 fr -89.202.251.0 - 89.202.253.255 it -89.202.254.0 - 89.202.254.47 at -89.202.254.48 - 89.202.254.255 gb -89.202.255.0 - 89.202.255.255 de +89.202.148.0 - 89.202.151.111 gb +89.202.151.112 - 89.202.151.127 be +89.202.151.128 - 89.202.154.127 gb +89.202.154.128 - 89.202.154.191 ch +89.202.154.192 - 89.202.157.175 gb +89.202.157.176 - 89.202.157.191 cz +89.202.157.192 - 89.202.167.63 gb +89.202.167.64 - 89.202.167.71 se +89.202.167.72 - 89.202.179.213 gb +89.202.179.214 - 89.202.179.214 it +89.202.179.215 - 89.202.181.127 gb +89.202.181.128 - 89.202.181.143 it +89.202.181.144 - 89.202.186.132 gb +89.202.186.133 - 89.202.186.133 ch +89.202.186.134 - 89.202.186.247 gb +89.202.186.248 - 89.202.186.255 ch +89.202.187.0 - 89.202.190.41 gb +89.202.190.42 - 89.202.190.42 eu +89.202.190.43 - 89.202.190.71 gb +89.202.190.72 - 89.202.190.111 be +89.202.190.112 - 89.202.190.159 gb +89.202.190.160 - 89.202.190.191 be +89.202.190.192 - 89.202.192.115 gb +89.202.192.116 - 89.202.192.119 fr +89.202.192.120 - 89.202.193.64 gb +89.202.193.65 - 89.202.193.65 fr +89.202.193.66 - 89.202.193.247 gb +89.202.193.248 - 89.202.193.255 fr +89.202.194.0 - 89.202.196.7 gb +89.202.196.8 - 89.202.196.11 it +89.202.196.12 - 89.202.203.47 gb +89.202.203.48 - 89.202.203.63 fr +89.202.203.64 - 89.202.203.255 gb +89.202.204.0 - 89.202.204.255 it +89.202.205.0 - 89.202.207.63 gb +89.202.207.64 - 89.202.207.127 de +89.202.207.128 - 89.202.207.191 gb +89.202.207.192 - 89.202.207.207 de +89.202.207.208 - 89.202.212.127 gb +89.202.212.128 - 89.202.212.143 nl +89.202.212.144 - 89.202.212.231 gb +89.202.212.232 - 89.202.212.239 nl +89.202.212.240 - 89.202.212.255 gb +89.202.213.0 - 89.202.213.163 eu +89.202.213.164 - 89.202.213.164 nl +89.202.213.165 - 89.202.213.255 eu +89.202.214.0 - 89.202.218.79 gb +89.202.218.80 - 89.202.218.87 de +89.202.218.88 - 89.202.218.127 gb +89.202.218.128 - 89.202.218.255 de +89.202.219.0 - 89.202.231.31 gb +89.202.231.32 - 89.202.231.63 it +89.202.231.64 - 89.202.231.127 gb +89.202.231.128 - 89.202.231.143 it +89.202.231.144 - 89.202.238.31 gb +89.202.238.32 - 89.202.238.63 it +89.202.238.64 - 89.202.238.127 gb +89.202.238.128 - 89.202.238.255 it +89.202.239.0 - 89.202.239.191 gb +89.202.239.192 - 89.202.239.223 it +89.202.239.224 - 89.202.240.47 gb +89.202.240.48 - 89.202.240.63 nl +89.202.240.64 - 89.202.240.95 gb +89.202.240.96 - 89.202.240.111 nl +89.202.240.112 - 89.202.255.97 gb +89.202.255.98 - 89.202.255.98 de +89.202.255.99 - 89.202.255.255 gb 89.203.0.0 - 89.203.127.255 kw 89.203.128.0 - 89.203.255.255 cz 89.204.0.0 - 89.204.127.255 ru @@ -51981,16 +26554,11 @@ 89.205.128.0 - 89.205.255.255 nl 89.206.0.0 - 89.206.63.255 pl 89.206.64.0 - 89.206.127.255 ch -89.206.128.0 - 89.207.7.255 gb -89.207.8.0 - 89.207.15.255 fi -89.207.16.0 - 89.207.19.127 se -89.207.19.128 - 89.207.19.143 de -89.207.19.144 - 89.207.19.159 fr -89.207.19.160 - 89.207.19.175 ie -89.207.19.176 - 89.207.23.255 se -89.207.24.0 - 89.207.24.63 nl -89.207.24.64 - 89.207.24.71 gb -89.207.24.72 - 89.207.31.255 nl +89.206.128.0 - 89.206.215.255 gb +89.206.216.0 - 89.206.219.255 fr +89.206.220.0 - 89.207.7.255 gb +89.207.16.0 - 89.207.23.255 se +89.207.24.0 - 89.207.31.255 nl 89.207.32.0 - 89.207.47.255 ru 89.207.48.0 - 89.207.55.255 gb 89.207.56.0 - 89.207.63.255 ie @@ -51998,47 +26566,28 @@ 89.207.80.0 - 89.207.87.255 it 89.207.88.0 - 89.207.103.255 ru 89.207.104.0 - 89.207.111.255 it -89.207.112.0 - 89.207.112.255 no -89.207.113.0 - 89.207.114.255 ge -89.207.115.0 - 89.207.115.63 no -89.207.115.64 - 89.207.119.255 ge +89.207.112.0 - 89.207.119.255 no 89.207.120.0 - 89.207.127.255 at -89.207.128.0 - 89.207.132.49 nl -89.207.132.50 - 89.207.132.50 us -89.207.132.51 - 89.207.132.175 nl -89.207.132.176 - 89.207.132.177 tr -89.207.132.178 - 89.207.132.179 nl -89.207.132.180 - 89.207.132.208 tr -89.207.132.209 - 89.207.133.99 nl -89.207.133.100 - 89.207.133.101 ir -89.207.133.102 - 89.207.133.137 nl -89.207.133.138 - 89.207.133.140 ir -89.207.133.141 - 89.207.135.202 nl -89.207.135.203 - 89.207.135.203 ir -89.207.135.204 - 89.207.135.255 nl +89.207.128.0 - 89.207.135.255 nl 89.207.136.0 - 89.207.143.255 gb 89.207.144.0 - 89.207.151.255 at -89.207.152.0 - 89.207.169.255 gb -89.207.170.0 - 89.207.170.255 ie -89.207.171.0 - 89.207.175.255 gb -89.207.176.0 - 89.207.183.255 ru +89.207.152.0 - 89.207.175.255 gb 89.207.184.0 - 89.207.191.255 be 89.207.192.0 - 89.207.199.255 me 89.207.200.0 - 89.207.207.255 de 89.207.208.0 - 89.207.215.255 gb 89.207.216.0 - 89.207.223.255 ru -89.207.224.0 - 89.207.231.255 ie -89.207.232.0 - 89.207.239.255 es +89.207.224.0 - 89.207.239.255 ch 89.207.240.0 - 89.207.247.255 lv -89.207.248.0 - 89.207.252.143 de -89.207.252.144 - 89.207.252.151 ch -89.207.252.152 - 89.207.253.191 de -89.207.253.192 - 89.207.253.207 ch -89.207.253.208 - 89.207.255.255 de +89.207.248.0 - 89.207.255.255 de 89.208.0.0 - 89.208.255.255 ru 89.209.0.0 - 89.209.255.255 ua 89.210.0.0 - 89.210.255.255 gr -89.211.0.0 - 89.211.255.255 qa +89.211.0.0 - 89.211.57.255 qa +89.211.58.0 - 89.211.58.255 us +89.211.59.0 - 89.211.61.255 qa +89.211.62.0 - 89.211.62.255 us +89.211.63.0 - 89.211.255.255 qa 89.212.0.0 - 89.212.255.255 si 89.213.0.0 - 89.213.255.255 gb 89.214.0.0 - 89.214.255.255 pt @@ -52046,30 +26595,25 @@ 89.216.0.0 - 89.216.255.255 rs 89.217.0.0 - 89.217.255.255 ch 89.218.0.0 - 89.218.255.255 kz -89.219.0.0 - 89.219.255.255 ee +89.219.0.0 - 89.219.3.255 ee +89.219.4.0 - 89.219.35.255 kz +89.219.36.0 - 89.219.63.255 az +89.219.64.0 - 89.219.127.255 ir +89.219.128.0 - 89.219.131.255 ee +89.219.132.0 - 89.219.133.255 az +89.219.134.0 - 89.219.154.255 ee +89.219.155.0 - 89.219.160.255 az +89.219.161.0 - 89.219.162.255 ee +89.219.163.0 - 89.219.167.255 az +89.219.168.0 - 89.219.168.255 ee +89.219.169.0 - 89.219.191.255 az +89.219.192.0 - 89.219.255.255 ir 89.220.0.0 - 89.220.255.255 nl -89.221.0.0 - 89.221.13.111 de -89.221.13.112 - 89.221.13.127 tr -89.221.13.128 - 89.221.15.255 de +89.221.0.0 - 89.221.15.255 de 89.221.16.0 - 89.221.31.255 ru -89.221.32.0 - 89.221.32.255 it -89.221.33.0 - 89.221.33.255 gr -89.221.34.0 - 89.221.35.127 de -89.221.35.128 - 89.221.35.255 us -89.221.36.0 - 89.221.37.255 gr -89.221.38.0 - 89.221.38.255 it -89.221.39.0 - 89.221.39.127 tz +89.221.32.0 - 89.221.39.127 it 89.221.39.128 - 89.221.39.255 gr -89.221.40.0 - 89.221.41.255 us -89.221.42.0 - 89.221.42.127 gr -89.221.42.128 - 89.221.42.159 fr -89.221.42.160 - 89.221.42.207 gr -89.221.42.208 - 89.221.42.223 il -89.221.42.224 - 89.221.42.255 sg -89.221.43.0 - 89.221.43.255 gb -89.221.44.0 - 89.221.45.255 it -89.221.46.0 - 89.221.46.255 de -89.221.47.0 - 89.221.47.255 us +89.221.40.0 - 89.221.47.255 it 89.221.48.0 - 89.221.63.255 ru 89.221.64.0 - 89.221.79.255 ee 89.221.80.0 - 89.221.95.255 ir @@ -52083,9 +26627,7 @@ 89.221.224.0 - 89.221.239.255 ru 89.221.240.0 - 89.221.241.255 se 89.221.242.0 - 89.221.246.255 no -89.221.247.0 - 89.221.251.255 se -89.221.252.0 - 89.221.252.255 no -89.221.253.0 - 89.221.255.255 se +89.221.247.0 - 89.221.255.255 se 89.222.0.0 - 89.222.127.255 gb 89.222.128.0 - 89.223.127.255 ru 89.223.128.0 - 89.223.255.255 hu @@ -52094,50 +26636,25 @@ 89.232.0.0 - 89.232.63.255 ge 89.232.64.0 - 89.232.255.255 ru 89.233.0.0 - 89.233.63.255 dk -89.233.64.0 - 89.233.127.255 ru -89.233.128.0 - 89.233.145.31 cz -89.233.145.32 - 89.233.145.63 gb -89.233.145.64 - 89.233.173.63 cz -89.233.173.64 - 89.233.173.127 de -89.233.173.128 - 89.233.191.255 cz +89.233.64.0 - 89.233.95.255 de +89.233.96.0 - 89.233.103.255 no +89.233.104.0 - 89.233.111.255 nl +89.233.112.0 - 89.233.127.255 si +89.233.128.0 - 89.233.191.255 cz 89.233.192.0 - 89.233.255.255 se -89.234.0.0 - 89.234.25.15 gb -89.234.25.16 - 89.234.25.23 a2 -89.234.25.24 - 89.234.54.63 gb -89.234.54.64 - 89.234.54.79 ie -89.234.54.80 - 89.234.63.255 gb +89.234.0.0 - 89.234.63.255 gb 89.234.64.0 - 89.234.127.255 ie 89.234.128.0 - 89.234.191.255 fr 89.234.192.0 - 89.234.255.255 pl -89.235.0.0 - 89.235.0.71 cz -89.235.0.72 - 89.235.0.75 sk -89.235.0.76 - 89.235.63.255 cz +89.235.0.0 - 89.235.63.255 cz 89.235.64.0 - 89.235.127.255 ir 89.235.128.0 - 89.235.191.255 ru 89.235.192.0 - 89.235.255.255 ee -89.236.0.0 - 89.236.1.255 se -89.236.2.0 - 89.236.7.255 dk -89.236.8.0 - 89.236.9.255 se -89.236.10.0 - 89.236.10.255 dk -89.236.11.0 - 89.236.13.127 se +89.236.0.0 - 89.236.13.127 se 89.236.13.128 - 89.236.13.255 dk -89.236.14.0 - 89.236.14.255 se -89.236.15.0 - 89.236.15.255 dk -89.236.16.0 - 89.236.31.255 se -89.236.32.0 - 89.236.32.15 dk -89.236.32.16 - 89.236.32.23 se -89.236.32.24 - 89.236.32.127 dk -89.236.32.128 - 89.236.34.255 se -89.236.35.0 - 89.236.35.127 dk -89.236.35.128 - 89.236.37.255 se -89.236.38.0 - 89.236.38.255 dk -89.236.39.0 - 89.236.46.255 se -89.236.47.0 - 89.236.47.103 dk -89.236.47.104 - 89.236.47.127 se -89.236.47.128 - 89.236.48.255 dk -89.236.49.0 - 89.236.53.255 se -89.236.54.0 - 89.236.59.255 dk -89.236.60.0 - 89.236.63.255 se +89.236.14.0 - 89.236.35.11 se +89.236.35.12 - 89.236.35.12 dk +89.236.35.13 - 89.236.63.255 se 89.236.64.0 - 89.236.127.255 fi 89.236.128.0 - 89.236.191.255 ch 89.236.192.0 - 89.236.255.255 uz @@ -52146,19 +26663,19 @@ 89.237.128.0 - 89.237.191.255 sa 89.237.192.0 - 89.237.255.255 kg 89.238.0.0 - 89.238.63.255 pl -89.238.64.0 - 89.238.67.255 de -89.238.68.0 - 89.238.68.255 es -89.238.69.0 - 89.238.71.63 de -89.238.71.64 - 89.238.71.95 be -89.238.71.96 - 89.238.127.255 de -89.238.128.0 - 89.238.136.175 gb -89.238.136.176 - 89.238.136.183 de -89.238.136.184 - 89.238.137.255 gb -89.238.138.0 - 89.238.138.255 nl -89.238.139.0 - 89.238.154.47 gb -89.238.154.48 - 89.238.154.55 fr -89.238.154.56 - 89.238.191.255 gb -89.238.192.0 - 89.238.255.255 ro +89.238.64.0 - 89.238.127.255 de +89.238.128.0 - 89.238.146.63 gb +89.238.146.64 - 89.238.146.79 cz +89.238.146.80 - 89.238.161.183 gb +89.238.161.184 - 89.238.161.187 nl +89.238.161.188 - 89.238.166.231 gb +89.238.166.232 - 89.238.166.239 cz +89.238.166.240 - 89.238.185.255 gb +89.238.186.0 - 89.238.186.255 cz +89.238.187.0 - 89.238.191.255 gb +89.238.192.0 - 89.238.237.255 ro +89.238.238.0 - 89.238.240.255 sk +89.238.241.0 - 89.238.255.255 ro 89.239.0.0 - 89.239.63.255 cz 89.239.64.0 - 89.239.127.255 pl 89.239.128.0 - 89.239.191.255 ru @@ -52174,82 +26691,51 @@ 89.248.96.0 - 89.248.111.255 es 89.248.112.0 - 89.248.127.255 ru 89.248.128.0 - 89.248.143.255 nl -89.248.144.0 - 89.248.157.255 li -89.248.158.0 - 89.248.159.255 ch -89.248.160.0 - 89.248.162.255 nl -89.248.163.0 - 89.248.163.31 fr -89.248.163.32 - 89.248.163.175 nl -89.248.163.176 - 89.248.163.223 se -89.248.163.224 - 89.248.165.7 nl -89.248.165.8 - 89.248.165.15 pl -89.248.165.16 - 89.248.165.31 nl -89.248.165.32 - 89.248.165.63 pl -89.248.165.64 - 89.248.165.95 nl -89.248.165.96 - 89.248.165.127 pl -89.248.165.128 - 89.248.165.191 be -89.248.165.192 - 89.248.166.191 nl -89.248.166.192 - 89.248.166.223 pl -89.248.166.224 - 89.248.171.127 nl -89.248.171.128 - 89.248.171.255 pl -89.248.172.0 - 89.248.174.191 nl -89.248.174.192 - 89.248.174.223 my -89.248.174.224 - 89.248.175.255 nl +89.248.144.0 - 89.248.159.255 li +89.248.160.0 - 89.248.175.255 nl 89.248.176.0 - 89.248.207.255 ru 89.248.208.0 - 89.248.223.255 fr 89.248.224.0 - 89.248.239.255 ru -89.248.240.0 - 89.248.250.255 cz -89.248.251.0 - 89.248.251.127 de -89.248.251.128 - 89.248.255.255 cz +89.248.240.0 - 89.248.255.255 cz 89.249.0.0 - 89.249.15.255 dk 89.249.16.0 - 89.249.31.255 ru -89.249.32.0 - 89.249.33.255 ch -89.249.34.0 - 89.249.38.255 de -89.249.39.0 - 89.249.39.255 ch -89.249.40.0 - 89.249.40.223 de -89.249.40.224 - 89.249.40.231 gb -89.249.40.232 - 89.249.47.255 ch +89.249.32.0 - 89.249.47.255 de 89.249.48.0 - 89.249.63.255 ru 89.249.64.0 - 89.249.79.255 gb 89.249.80.0 - 89.249.95.255 lt 89.249.96.0 - 89.249.111.255 hr -89.249.112.0 - 89.249.191.255 ru +89.249.112.0 - 89.249.175.255 ru +89.249.176.0 - 89.249.183.255 it +89.249.184.0 - 89.249.191.255 hr 89.249.192.0 - 89.249.207.255 am -89.249.208.0 - 89.249.208.39 lb -89.249.208.40 - 89.249.208.47 de -89.249.208.48 - 89.249.223.255 lb +89.249.208.0 - 89.249.223.255 lb 89.249.224.0 - 89.250.31.255 ru 89.250.32.0 - 89.250.47.255 gb 89.250.48.0 - 89.250.63.255 fi 89.250.64.0 - 89.250.79.255 nl 89.250.80.0 - 89.250.95.255 kz 89.250.96.0 - 89.250.111.255 cz -89.250.112.0 - 89.250.125.255 no -89.250.126.0 - 89.250.126.127 gb -89.250.126.128 - 89.250.127.255 no +89.250.112.0 - 89.250.127.255 no 89.250.128.0 - 89.250.143.255 de 89.250.144.0 - 89.250.175.255 ru 89.250.176.0 - 89.250.191.255 nl 89.250.192.0 - 89.250.207.255 pl 89.250.208.0 - 89.250.239.255 ru 89.250.240.0 - 89.250.255.255 cz -89.251.0.0 - 89.251.9.255 nl -89.251.10.0 - 89.251.11.255 us -89.251.12.0 - 89.251.15.255 nl +89.251.0.0 - 89.251.15.255 us 89.251.16.0 - 89.251.31.255 ua 89.251.32.0 - 89.251.47.255 hu 89.251.48.0 - 89.251.63.255 fr 89.251.64.0 - 89.251.79.255 ru -89.251.80.0 - 89.251.88.63 kw -89.251.88.64 - 89.251.88.95 gb -89.251.88.96 - 89.251.95.255 kw +89.251.80.0 - 89.251.95.255 kw 89.251.96.0 - 89.251.111.255 ru 89.251.112.0 - 89.251.127.255 gb 89.251.128.0 - 89.251.143.255 de 89.251.144.0 - 89.251.175.255 ru 89.251.176.0 - 89.251.191.255 it 89.251.192.0 - 89.251.207.255 gb -89.251.208.0 - 89.251.218.255 no -89.251.219.0 - 89.251.223.255 gb +89.251.208.0 - 89.251.217.127 no +89.251.217.128 - 89.251.223.255 gb 89.251.224.0 - 89.251.239.255 es 89.251.240.0 - 89.251.255.255 ch 89.252.0.0 - 89.252.63.255 ua @@ -52266,52 +26752,387 @@ 89.255.0.0 - 89.255.63.255 nl 89.255.64.0 - 89.255.127.255 ru 89.255.128.0 - 89.255.191.255 gb -89.255.192.0 - 89.255.255.255 us -90.0.0.0 - 90.80.193.31 fr -90.80.193.32 - 90.80.193.63 gb -90.80.193.64 - 90.84.48.255 fr +89.255.192.0 - 89.255.199.255 ch +89.255.200.0 - 89.255.223.255 nl +89.255.224.0 - 89.255.247.255 se +89.255.248.0 - 89.255.255.255 nl +90.0.0.0 - 90.9.255.255 fr +90.10.0.0 - 90.10.2.255 re +90.10.3.0 - 90.10.4.255 fr +90.10.5.0 - 90.10.6.255 re +90.10.7.0 - 90.10.7.255 fr +90.10.8.0 - 90.10.18.255 re +90.10.19.0 - 90.10.19.255 fr +90.10.20.0 - 90.10.24.255 re +90.10.25.0 - 90.10.26.255 fr +90.10.27.0 - 90.10.36.255 re +90.10.37.0 - 90.10.37.255 fr +90.10.38.0 - 90.10.41.255 re +90.10.42.0 - 90.10.42.255 fr +90.10.43.0 - 90.10.43.255 re +90.10.44.0 - 90.10.44.255 fr +90.10.45.0 - 90.10.49.255 re +90.10.50.0 - 90.10.50.255 fr +90.10.51.0 - 90.10.57.255 re +90.10.58.0 - 90.10.59.255 fr +90.10.60.0 - 90.10.60.255 re +90.10.61.0 - 90.10.61.255 fr +90.10.62.0 - 90.10.76.255 re +90.10.77.0 - 90.10.77.255 fr +90.10.78.0 - 90.10.79.255 re +90.10.80.0 - 90.10.82.255 fr +90.10.83.0 - 90.10.83.255 re +90.10.84.0 - 90.10.84.255 fr +90.10.85.0 - 90.10.91.255 re +90.10.92.0 - 90.10.93.255 fr +90.10.94.0 - 90.10.94.255 re +90.10.95.0 - 90.10.95.255 fr +90.10.96.0 - 90.10.98.255 re +90.10.99.0 - 90.10.99.255 fr +90.10.100.0 - 90.10.103.255 re +90.10.104.0 - 90.10.104.255 fr +90.10.105.0 - 90.10.105.255 re +90.10.106.0 - 90.10.106.255 fr +90.10.107.0 - 90.10.119.255 re +90.10.120.0 - 90.10.120.196 fr +90.10.120.197 - 90.10.120.197 re +90.10.120.198 - 90.10.120.255 fr +90.10.121.0 - 90.10.131.255 re +90.10.132.0 - 90.10.133.255 fr +90.10.134.0 - 90.10.138.255 re +90.10.139.0 - 90.10.139.255 fr +90.10.140.0 - 90.10.147.255 re +90.10.148.0 - 90.10.148.255 fr +90.10.149.0 - 90.10.150.255 re +90.10.151.0 - 90.10.151.255 fr +90.10.152.0 - 90.10.156.255 re +90.10.157.0 - 90.10.157.255 fr +90.10.158.0 - 90.10.163.255 re +90.10.164.0 - 90.10.164.255 fr +90.10.165.0 - 90.10.193.255 re +90.10.194.0 - 90.10.194.255 fr +90.10.195.0 - 90.10.195.255 re +90.10.196.0 - 90.10.196.255 fr +90.10.197.0 - 90.10.202.255 re +90.10.203.0 - 90.10.203.255 fr +90.10.204.0 - 90.10.205.255 re +90.10.206.0 - 90.10.206.255 fr +90.10.207.0 - 90.10.208.255 re +90.10.209.0 - 90.10.209.255 fr +90.10.210.0 - 90.10.210.255 re +90.10.211.0 - 90.10.211.255 fr +90.10.212.0 - 90.10.213.255 re +90.10.214.0 - 90.10.214.255 fr +90.10.215.0 - 90.10.215.255 re +90.10.216.0 - 90.10.217.255 fr +90.10.218.0 - 90.10.224.255 re +90.10.225.0 - 90.10.225.255 fr +90.10.226.0 - 90.10.232.255 re +90.10.233.0 - 90.10.233.255 fr +90.10.234.0 - 90.10.245.255 re +90.10.246.0 - 90.10.248.115 fr +90.10.248.116 - 90.10.248.116 re +90.10.248.117 - 90.10.250.218 fr +90.10.250.219 - 90.10.250.219 re +90.10.250.220 - 90.10.254.73 fr +90.10.254.74 - 90.10.254.74 re +90.10.254.75 - 90.10.254.188 fr +90.10.254.189 - 90.10.254.189 re +90.10.254.190 - 90.10.254.255 fr +90.10.255.0 - 90.10.255.255 re +90.11.0.0 - 90.30.255.255 fr +90.31.0.0 - 90.31.11.255 gp +90.31.12.0 - 90.31.12.255 fr +90.31.13.0 - 90.31.15.255 gp +90.31.16.0 - 90.31.16.255 fr +90.31.17.0 - 90.31.23.255 gp +90.31.24.0 - 90.31.24.255 fr +90.31.25.0 - 90.31.56.255 gp +90.31.57.0 - 90.31.57.255 fr +90.31.58.0 - 90.31.63.255 gp +90.31.64.0 - 90.31.66.255 fr +90.31.67.0 - 90.31.77.255 gp +90.31.78.0 - 90.31.83.255 fr +90.31.84.0 - 90.31.86.255 gp +90.31.87.0 - 90.31.88.255 fr +90.31.89.0 - 90.31.93.255 gp +90.31.94.0 - 90.31.94.255 fr +90.31.95.0 - 90.31.95.255 gp +90.31.96.0 - 90.31.99.255 fr +90.31.100.0 - 90.31.100.255 gp +90.31.101.0 - 90.31.101.255 fr +90.31.102.0 - 90.31.108.255 gp +90.31.109.0 - 90.31.109.255 fr +90.31.110.0 - 90.31.110.255 gp +90.31.111.0 - 90.31.113.255 fr +90.31.114.0 - 90.31.114.255 gp +90.31.115.0 - 90.31.115.255 fr +90.31.116.0 - 90.31.117.255 gp +90.31.118.0 - 90.31.119.255 fr +90.31.120.0 - 90.31.127.255 gp +90.31.128.0 - 90.31.133.255 gf +90.31.134.0 - 90.31.134.255 fr +90.31.135.0 - 90.31.140.255 gf +90.31.141.0 - 90.31.141.255 fr +90.31.142.0 - 90.31.158.255 gf +90.31.159.0 - 90.31.159.255 fr +90.31.160.0 - 90.31.185.255 gf +90.31.186.0 - 90.31.186.255 fr +90.31.187.0 - 90.31.191.255 gf +90.31.192.0 - 90.31.255.255 mq +90.32.0.0 - 90.35.255.255 fr +90.36.0.0 - 90.36.0.255 gp +90.36.1.0 - 90.36.1.255 fr +90.36.2.0 - 90.36.11.255 gp +90.36.12.0 - 90.36.12.255 fr +90.36.13.0 - 90.36.14.255 gp +90.36.15.0 - 90.36.15.255 fr +90.36.16.0 - 90.36.21.255 gp +90.36.22.0 - 90.36.22.255 fr +90.36.23.0 - 90.36.29.255 gp +90.36.30.0 - 90.36.30.255 fr +90.36.31.0 - 90.36.32.255 gp +90.36.33.0 - 90.36.33.255 fr +90.36.34.0 - 90.36.35.255 gp +90.36.36.0 - 90.36.37.255 fr +90.36.38.0 - 90.36.39.255 gp +90.36.40.0 - 90.36.40.255 fr +90.36.41.0 - 90.36.41.255 gp +90.36.42.0 - 90.36.42.255 fr +90.36.43.0 - 90.36.45.255 gp +90.36.46.0 - 90.36.46.255 fr +90.36.47.0 - 90.36.48.255 gp +90.36.49.0 - 90.36.49.255 fr +90.36.50.0 - 90.36.65.255 gp +90.36.66.0 - 90.36.66.255 fr +90.36.67.0 - 90.36.67.255 gp +90.36.68.0 - 90.36.68.255 fr +90.36.69.0 - 90.36.75.255 gp +90.36.76.0 - 90.36.76.255 fr +90.36.77.0 - 90.36.96.255 gp +90.36.97.0 - 90.36.104.255 fr +90.36.105.0 - 90.36.114.255 gp +90.36.115.0 - 90.36.115.255 fr +90.36.116.0 - 90.36.121.255 gp +90.36.122.0 - 90.36.122.255 fr +90.36.123.0 - 90.36.123.255 gp +90.36.124.0 - 90.36.125.255 fr +90.36.126.0 - 90.36.128.255 gp +90.36.129.0 - 90.36.129.255 fr +90.36.130.0 - 90.36.132.255 gp +90.36.133.0 - 90.36.133.255 fr +90.36.134.0 - 90.36.136.255 gp +90.36.137.0 - 90.36.137.255 fr +90.36.138.0 - 90.36.138.255 gp +90.36.139.0 - 90.36.140.255 fr +90.36.141.0 - 90.36.141.255 gp +90.36.142.0 - 90.36.142.255 fr +90.36.143.0 - 90.36.143.255 gp +90.36.144.0 - 90.36.144.255 fr +90.36.145.0 - 90.36.147.255 gp +90.36.148.0 - 90.36.148.255 fr +90.36.149.0 - 90.36.164.255 gp +90.36.165.0 - 90.36.165.255 fr +90.36.166.0 - 90.36.168.255 gp +90.36.169.0 - 90.36.169.255 fr +90.36.170.0 - 90.36.176.255 gp +90.36.177.0 - 90.36.177.255 fr +90.36.178.0 - 90.36.180.255 gp +90.36.181.0 - 90.36.181.255 fr +90.36.182.0 - 90.36.186.255 gp +90.36.187.0 - 90.36.188.255 fr +90.36.189.0 - 90.36.194.255 gp +90.36.195.0 - 90.36.197.255 fr +90.36.198.0 - 90.36.198.255 gp +90.36.199.0 - 90.36.199.255 fr +90.36.200.0 - 90.36.203.255 gp +90.36.204.0 - 90.36.204.255 fr +90.36.205.0 - 90.36.222.255 gp +90.36.223.0 - 90.36.223.255 fr +90.36.224.0 - 90.36.224.255 gp +90.36.225.0 - 90.36.233.255 fr +90.36.234.0 - 90.36.235.255 gp +90.36.236.0 - 90.36.236.255 fr +90.36.237.0 - 90.36.241.9 gp +90.36.241.10 - 90.36.241.10 fr +90.36.241.11 - 90.36.243.255 gp +90.36.244.0 - 90.36.244.255 fr +90.36.245.0 - 90.36.255.255 gp +90.37.0.0 - 90.63.255.255 fr +90.64.0.0 - 90.64.127.255 sk +90.64.128.0 - 90.68.255.255 fr +90.69.0.0 - 90.69.255.255 es +90.70.0.0 - 90.70.255.255 fr +90.71.0.0 - 90.71.255.255 es +90.72.0.0 - 90.73.255.255 fr +90.74.0.0 - 90.75.255.255 es +90.76.0.0 - 90.77.14.255 fr +90.77.15.0 - 90.77.17.255 es +90.77.18.0 - 90.77.20.255 fr +90.77.21.0 - 90.77.21.255 es +90.77.22.0 - 90.77.23.255 fr +90.77.24.0 - 90.77.24.255 es +90.77.25.0 - 90.77.25.255 fr +90.77.26.0 - 90.77.26.255 es +90.77.27.0 - 90.77.27.255 fr +90.77.28.0 - 90.77.28.255 es +90.77.29.0 - 90.77.29.255 fr +90.77.30.0 - 90.77.30.255 es +90.77.31.0 - 90.77.36.255 fr +90.77.37.0 - 90.77.37.255 es +90.77.38.0 - 90.77.38.255 fr +90.77.39.0 - 90.77.39.255 es +90.77.40.0 - 90.77.40.255 fr +90.77.41.0 - 90.77.41.255 es +90.77.42.0 - 90.77.43.255 fr +90.77.44.0 - 90.77.44.255 es +90.77.45.0 - 90.77.48.255 fr +90.77.49.0 - 90.77.49.255 es +90.77.50.0 - 90.77.53.20 fr +90.77.53.21 - 90.77.53.21 es +90.77.53.22 - 90.77.53.255 fr +90.77.54.0 - 90.77.54.255 es +90.77.55.0 - 90.77.62.255 fr +90.77.63.0 - 90.77.63.255 es +90.77.64.0 - 90.77.65.255 fr +90.77.66.0 - 90.77.66.255 es +90.77.67.0 - 90.77.75.255 fr +90.77.76.0 - 90.77.76.255 es +90.77.77.0 - 90.77.84.255 fr +90.77.85.0 - 90.77.86.255 es +90.77.87.0 - 90.77.87.255 fr +90.77.88.0 - 90.77.88.255 es +90.77.89.0 - 90.77.89.255 fr +90.77.90.0 - 90.77.91.255 es +90.77.92.0 - 90.77.92.255 fr +90.77.93.0 - 90.77.94.255 es +90.77.95.0 - 90.77.97.255 fr +90.77.98.0 - 90.77.98.255 es +90.77.99.0 - 90.77.104.255 fr +90.77.105.0 - 90.77.105.255 es +90.77.106.0 - 90.77.121.255 fr +90.77.122.0 - 90.77.122.255 es +90.77.123.0 - 90.77.136.255 fr +90.77.137.0 - 90.77.137.255 es +90.77.138.0 - 90.77.142.255 fr +90.77.143.0 - 90.77.143.255 es +90.77.144.0 - 90.77.148.255 fr +90.77.149.0 - 90.77.149.255 es +90.77.150.0 - 90.77.150.255 fr +90.77.151.0 - 90.77.151.255 es +90.77.152.0 - 90.77.154.32 fr +90.77.154.33 - 90.77.154.33 es +90.77.154.34 - 90.77.168.251 fr +90.77.168.252 - 90.77.168.252 es +90.77.168.253 - 90.77.172.255 fr +90.77.173.0 - 90.77.173.255 es +90.77.174.0 - 90.77.177.255 fr +90.77.178.0 - 90.77.178.255 es +90.77.179.0 - 90.77.179.255 fr +90.77.180.0 - 90.77.180.255 es +90.77.181.0 - 90.77.194.255 fr +90.77.195.0 - 90.77.195.255 es +90.77.196.0 - 90.77.200.255 fr +90.77.201.0 - 90.77.202.255 es +90.77.203.0 - 90.77.209.255 fr +90.77.210.0 - 90.77.210.255 es +90.77.211.0 - 90.77.211.255 fr +90.77.212.0 - 90.77.213.255 es +90.77.214.0 - 90.77.216.255 fr +90.77.217.0 - 90.77.217.255 es +90.77.218.0 - 90.77.219.255 fr +90.77.220.0 - 90.77.220.255 es +90.77.221.0 - 90.77.223.189 fr +90.77.223.190 - 90.77.223.190 es +90.77.223.191 - 90.77.224.255 fr +90.77.225.0 - 90.77.225.255 es +90.77.226.0 - 90.77.226.255 fr +90.77.227.0 - 90.77.227.255 es +90.77.228.0 - 90.77.237.255 fr +90.77.238.0 - 90.77.238.255 es +90.77.239.0 - 90.77.239.255 fr +90.77.240.0 - 90.77.240.255 es +90.77.241.0 - 90.77.242.255 fr +90.77.243.0 - 90.77.243.255 es +90.77.244.0 - 90.77.249.165 fr +90.77.249.166 - 90.77.249.166 es +90.77.249.167 - 90.80.1.63 fr +90.80.1.64 - 90.80.1.79 eu +90.80.1.80 - 90.84.48.255 fr 90.84.49.0 - 90.84.49.255 es 90.84.50.0 - 90.84.50.255 fr 90.84.51.0 - 90.84.52.255 us 90.84.53.0 - 90.84.53.255 es -90.84.54.0 - 90.84.54.127 nl -90.84.54.128 - 90.84.54.255 fr -90.84.55.0 - 90.84.55.127 de -90.84.55.128 - 90.84.126.255 fr -90.84.127.0 - 90.84.127.255 cd -90.84.128.0 - 90.84.129.7 hk -90.84.129.8 - 90.84.129.251 fr -90.84.129.252 - 90.84.130.31 hk -90.84.130.32 - 90.84.130.255 fr -90.84.131.0 - 90.84.131.255 hk -90.84.132.0 - 90.84.254.255 fr -90.84.255.0 - 90.84.255.255 es -90.85.0.0 - 90.127.255.255 fr +90.84.54.0 - 90.84.54.255 nl +90.84.55.0 - 90.84.55.255 de +90.84.56.0 - 90.84.59.255 fr +90.84.60.0 - 90.84.60.255 de +90.84.61.0 - 90.84.61.255 fr +90.84.62.0 - 90.84.63.255 us +90.84.64.0 - 90.84.132.255 fr +90.84.133.0 - 90.84.134.255 us +90.84.135.0 - 90.84.135.15 de +90.84.135.16 - 90.84.135.31 fr +90.84.135.32 - 90.84.135.63 de +90.84.135.64 - 90.84.135.127 fr +90.84.135.128 - 90.84.135.143 es +90.84.135.144 - 90.84.136.255 fr +90.84.137.0 - 90.84.137.255 us +90.84.138.0 - 90.84.142.191 nl +90.84.142.192 - 90.106.157.255 fr +90.106.158.0 - 90.106.158.255 es +90.106.159.0 - 90.106.203.255 fr +90.106.204.0 - 90.106.204.255 es +90.106.205.0 - 90.127.255.255 fr 90.128.0.0 - 90.128.127.255 de -90.128.128.0 - 90.128.255.255 nl -90.129.0.0 - 90.129.191.255 se +90.128.128.0 - 90.129.23.255 nl +90.129.24.0 - 90.129.31.255 se +90.129.32.0 - 90.129.63.255 no +90.129.64.0 - 90.129.127.255 se +90.129.128.0 - 90.129.191.255 no 90.129.192.0 - 90.129.223.255 at -90.129.224.0 - 90.130.39.255 se -90.130.40.0 - 90.130.47.255 ee -90.130.48.0 - 90.130.127.255 se +90.129.224.0 - 90.130.7.255 nl +90.130.8.0 - 90.130.11.255 se +90.130.12.0 - 90.130.23.255 lt +90.130.24.0 - 90.130.27.255 se +90.130.28.0 - 90.130.29.255 ee +90.130.30.0 - 90.130.31.255 se +90.130.32.0 - 90.130.47.255 ee +90.130.48.0 - 90.130.79.255 se +90.130.80.0 - 90.130.127.255 nl 90.130.128.0 - 90.130.135.255 ee -90.130.136.0 - 90.130.154.255 lt -90.130.155.0 - 90.130.155.255 se -90.130.156.0 - 90.130.159.255 lt -90.130.160.0 - 90.130.184.255 lv -90.130.185.0 - 90.130.187.255 se +90.130.136.0 - 90.130.159.255 lt +90.130.160.0 - 90.130.183.255 lv +90.130.184.0 - 90.130.187.255 se 90.130.188.0 - 90.130.191.255 lv -90.130.192.0 - 90.131.14.255 se -90.131.15.0 - 90.131.15.255 lt -90.131.16.0 - 90.131.31.255 se +90.130.192.0 - 90.130.239.255 se +90.130.240.0 - 90.130.255.255 no +90.131.0.0 - 90.131.22.255 se +90.131.23.0 - 90.131.23.255 lt +90.131.24.0 - 90.131.26.167 se +90.131.26.168 - 90.131.26.168 de +90.131.26.169 - 90.131.31.255 se 90.131.32.0 - 90.131.63.255 lt 90.131.64.0 - 90.131.119.255 nl -90.131.120.0 - 90.132.255.255 se -90.133.0.0 - 90.133.239.255 ru +90.131.120.0 - 90.131.127.255 se +90.131.128.0 - 90.131.255.255 lv +90.132.0.0 - 90.132.128.255 se +90.132.129.0 - 90.132.129.255 nl +90.132.130.0 - 90.132.135.255 se +90.132.136.0 - 90.132.143.255 nl +90.132.144.0 - 90.132.159.255 se +90.132.160.0 - 90.132.191.255 nl +90.132.192.0 - 90.132.255.255 se +90.133.0.0 - 90.133.223.255 lv +90.133.224.0 - 90.133.239.255 ee 90.133.240.0 - 90.133.255.255 se -90.134.0.0 - 90.136.255.255 de -90.137.0.0 - 90.137.63.255 ru -90.137.64.0 - 90.137.127.255 se +90.134.0.0 - 90.134.63.255 de +90.134.64.0 - 90.134.159.255 lt +90.134.160.0 - 90.134.191.255 nl +90.134.192.0 - 90.134.255.255 hr +90.135.0.0 - 90.136.255.255 de +90.137.0.0 - 90.137.63.255 se +90.137.64.0 - 90.137.127.255 nl 90.137.128.0 - 90.137.131.255 lt 90.137.132.0 - 90.137.133.255 ee 90.137.134.0 - 90.137.135.255 lv @@ -52319,11 +27140,39 @@ 90.137.144.0 - 90.137.151.255 hr 90.137.152.0 - 90.137.155.255 se 90.137.156.0 - 90.137.191.255 hr -90.137.192.0 - 90.137.255.255 se -90.138.0.0 - 90.140.255.255 ru -90.141.0.0 - 90.142.255.255 se -90.143.0.0 - 90.143.255.255 ru -90.144.0.0 - 90.144.255.255 se +90.137.192.0 - 90.137.223.255 nl +90.137.224.0 - 90.137.239.255 se +90.137.240.0 - 90.137.255.0 nl +90.137.255.1 - 90.138.255.255 se +90.139.0.0 - 90.139.95.255 lv +90.139.96.0 - 90.139.127.255 se +90.139.128.0 - 90.139.255.255 lv +90.140.0.0 - 90.140.255.255 se +90.141.0.0 - 90.141.31.255 nl +90.141.32.0 - 90.141.39.255 se +90.141.40.0 - 90.141.63.255 ee +90.141.64.0 - 90.141.71.255 lv +90.141.72.0 - 90.141.95.255 se +90.141.96.0 - 90.141.127.255 lv +90.141.128.0 - 90.142.15.255 se +90.142.16.0 - 90.142.19.255 nl +90.142.20.0 - 90.142.31.255 se +90.142.32.0 - 90.142.135.255 nl +90.142.136.0 - 90.142.143.255 se +90.142.144.0 - 90.142.151.255 lt +90.142.152.0 - 90.142.159.255 se +90.142.160.0 - 90.142.191.255 lt +90.142.192.0 - 90.142.207.255 nl +90.142.208.0 - 90.142.223.255 se +90.142.224.0 - 90.142.255.255 lt +90.143.0.0 - 90.143.63.255 kz +90.143.64.0 - 90.143.147.255 se +90.143.148.0 - 90.143.148.255 kz +90.143.149.0 - 90.144.31.255 se +90.144.32.0 - 90.144.47.255 hr +90.144.48.0 - 90.144.63.255 se +90.144.64.0 - 90.144.127.255 nl +90.144.128.0 - 90.144.255.255 se 90.145.0.0 - 90.145.255.255 nl 90.146.0.0 - 90.146.255.255 at 90.147.0.0 - 90.147.255.255 it @@ -52331,166 +27180,25 @@ 90.149.0.0 - 90.149.255.255 no 90.150.0.0 - 90.151.255.255 ru 90.152.0.0 - 90.152.63.255 gb -90.152.64.0 - 90.152.64.15 fr -90.152.64.16 - 90.152.64.23 be -90.152.64.24 - 90.152.64.31 fr -90.152.64.32 - 90.152.64.39 es -90.152.64.40 - 90.152.64.47 ch -90.152.64.48 - 90.152.64.55 at -90.152.64.56 - 90.152.64.79 nl -90.152.64.80 - 90.152.64.87 ch -90.152.64.88 - 90.152.64.103 nl -90.152.64.104 - 90.152.64.111 fr -90.152.64.112 - 90.152.64.119 at -90.152.64.120 - 90.152.64.127 be -90.152.64.128 - 90.152.64.135 lu -90.152.64.136 - 90.152.64.143 nl -90.152.64.144 - 90.152.64.151 ch -90.152.64.152 - 90.152.64.167 fr -90.152.64.168 - 90.152.64.175 it -90.152.64.176 - 90.152.64.183 nl -90.152.64.184 - 90.152.64.207 fr -90.152.64.208 - 90.152.64.215 nl -90.152.64.216 - 90.152.64.231 es -90.152.64.232 - 90.152.64.239 nl -90.152.64.240 - 90.152.64.247 fr -90.152.64.248 - 90.152.64.255 ie -90.152.65.0 - 90.152.65.7 se -90.152.65.8 - 90.152.65.15 it -90.152.65.16 - 90.152.65.23 gb -90.152.65.24 - 90.152.65.31 fr -90.152.65.32 - 90.152.65.39 at -90.152.65.40 - 90.152.65.55 be -90.152.65.56 - 90.152.65.63 fr -90.152.65.64 - 90.152.65.79 nl -90.152.65.80 - 90.152.65.87 ch -90.152.65.88 - 90.152.65.95 be -90.152.65.96 - 90.152.65.103 fr -90.152.65.104 - 90.152.65.111 nl -90.152.65.112 - 90.152.65.119 it -90.152.65.120 - 90.152.65.127 fi -90.152.65.128 - 90.152.65.135 ie -90.152.65.136 - 90.152.65.143 it -90.152.65.144 - 90.152.65.167 nl -90.152.65.168 - 90.152.65.175 es -90.152.65.176 - 90.152.65.183 fr -90.152.65.184 - 90.152.65.191 nl -90.152.65.192 - 90.152.65.199 es -90.152.65.200 - 90.152.65.207 it -90.152.65.208 - 90.152.65.215 es -90.152.65.216 - 90.152.65.223 nl -90.152.65.224 - 90.152.65.231 fr -90.152.65.232 - 90.152.66.15 gb -90.152.66.16 - 90.152.66.23 be -90.152.66.24 - 90.152.66.47 gb -90.152.66.48 - 90.152.66.55 dk -90.152.66.56 - 90.152.66.63 fi -90.152.66.64 - 90.152.66.71 nl -90.152.66.72 - 90.152.66.87 gb -90.152.66.88 - 90.152.66.95 nl -90.152.66.96 - 90.152.67.55 gb -90.152.67.56 - 90.152.67.79 no -90.152.67.80 - 90.152.67.87 nl -90.152.67.88 - 90.152.67.119 dk -90.152.67.120 - 90.152.67.127 gb -90.152.67.128 - 90.152.67.135 se -90.152.67.136 - 90.152.67.183 gb -90.152.67.184 - 90.152.67.191 dk -90.152.67.192 - 90.152.71.191 gb -90.152.71.192 - 90.152.71.199 nl -90.152.71.200 - 90.152.71.255 gb -90.152.72.0 - 90.152.72.127 nl -90.152.72.128 - 90.152.72.159 fi -90.152.72.160 - 90.152.72.223 nl -90.152.72.224 - 90.152.72.255 fi -90.152.73.0 - 90.152.73.159 nl -90.152.73.160 - 90.152.73.191 cz -90.152.73.192 - 90.152.73.192 gb -90.152.73.193 - 90.152.73.223 se -90.152.73.224 - 90.152.73.255 dk -90.152.74.0 - 90.152.74.95 se -90.152.74.96 - 90.152.74.255 be -90.152.75.0 - 90.152.75.95 nl -90.152.75.96 - 90.152.75.127 be -90.152.75.128 - 90.152.75.159 nl -90.152.75.160 - 90.152.75.223 dk -90.152.75.224 - 90.152.75.255 se -90.152.76.0 - 90.152.76.31 dk -90.152.76.32 - 90.152.76.159 nl -90.152.76.160 - 90.152.76.191 no -90.152.76.192 - 90.152.76.223 se -90.152.76.224 - 90.152.77.31 no -90.152.77.32 - 90.152.77.127 nl -90.152.77.128 - 90.152.77.159 be -90.152.77.160 - 90.152.78.31 nl -90.152.78.32 - 90.152.78.63 cz -90.152.78.64 - 90.152.78.95 be -90.152.78.96 - 90.152.78.127 nl -90.152.78.128 - 90.152.78.159 be -90.152.78.160 - 90.152.78.191 dk -90.152.78.192 - 90.152.78.223 no -90.152.78.224 - 90.152.78.255 se -90.152.79.0 - 90.152.79.95 nl -90.152.79.96 - 90.152.79.127 no -90.152.79.128 - 90.152.79.223 gb -90.152.79.224 - 90.152.79.239 be -90.152.79.240 - 90.152.79.255 gb +90.152.64.0 - 90.152.64.255 nl +90.152.65.0 - 90.152.66.255 gb +90.152.67.0 - 90.152.67.255 dk +90.152.68.0 - 90.152.79.255 gb 90.152.80.0 - 90.152.91.255 nl -90.152.92.0 - 90.152.93.255 gb -90.152.94.0 - 90.152.95.255 nl -90.152.96.0 - 90.152.96.127 fr -90.152.96.128 - 90.152.96.255 nl -90.152.97.0 - 90.152.97.191 fi -90.152.97.192 - 90.152.98.191 be +90.152.92.0 - 90.152.98.191 gb 90.152.98.192 - 90.152.98.255 dk -90.152.99.0 - 90.152.99.127 nl -90.152.99.128 - 90.152.99.191 be -90.152.99.192 - 90.152.99.255 no -90.152.100.0 - 90.152.100.63 sk -90.152.100.64 - 90.152.100.255 dk -90.152.101.0 - 90.152.101.127 se -90.152.101.128 - 90.152.101.255 be -90.152.102.0 - 90.152.102.255 dk -90.152.103.0 - 90.152.103.63 nl -90.152.103.64 - 90.152.103.127 se -90.152.103.128 - 90.152.103.191 no -90.152.103.192 - 90.152.103.255 gb -90.152.104.0 - 90.152.104.191 nl -90.152.104.192 - 90.152.107.255 gb -90.152.108.0 - 90.152.111.255 nl -90.152.112.0 - 90.152.112.31 no -90.152.112.32 - 90.152.112.63 nl -90.152.112.64 - 90.152.112.95 se -90.152.112.96 - 90.152.112.127 sk -90.152.112.128 - 90.152.112.159 nl -90.152.112.160 - 90.152.112.223 be -90.152.112.224 - 90.152.112.255 nl -90.152.113.0 - 90.152.113.255 gb -90.152.114.0 - 90.152.114.63 nl -90.152.114.64 - 90.152.114.95 fi -90.152.114.96 - 90.152.114.127 se -90.152.114.128 - 90.152.127.255 gb +90.152.99.0 - 90.152.127.255 gb 90.152.128.0 - 90.152.255.255 at 90.153.0.0 - 90.153.127.255 de 90.153.128.0 - 90.153.255.255 sy 90.154.0.0 - 90.154.127.255 ru 90.154.128.0 - 90.154.255.255 bg -90.155.0.0 - 90.155.119.183 gb -90.155.119.184 - 90.155.119.191 ie -90.155.119.192 - 90.155.121.115 gb -90.155.121.116 - 90.155.121.119 ie -90.155.121.120 - 90.155.124.135 gb -90.155.124.136 - 90.155.124.143 ie -90.155.124.144 - 90.155.127.255 gb +90.155.0.0 - 90.155.127.255 gb 90.155.128.0 - 90.155.255.255 ru 90.156.0.0 - 90.156.127.255 pl 90.156.128.0 - 90.156.223.255 ru -90.156.224.0 - 90.156.225.255 nl -90.156.226.0 - 90.156.229.255 ru -90.156.230.0 - 90.156.231.255 nl -90.156.232.0 - 90.156.233.255 ru -90.156.234.0 - 90.156.235.255 nl -90.156.236.0 - 90.157.127.255 ru +90.156.224.0 - 90.156.239.255 nl +90.156.240.0 - 90.157.127.255 ru 90.157.128.0 - 90.157.255.255 si 90.158.0.0 - 90.159.255.255 tr 90.160.0.0 - 90.175.255.255 es @@ -52523,7 +27231,6 @@ 91.90.56.0 - 91.90.63.255 pl 91.90.64.0 - 91.90.71.255 no 91.90.72.0 - 91.90.79.255 pl -91.90.80.0 - 91.90.87.255 ru 91.90.88.0 - 91.90.95.255 pl 91.90.96.0 - 91.90.103.255 fr 91.90.104.0 - 91.90.111.255 no @@ -52554,9 +27261,9 @@ 91.102.80.0 - 91.102.87.255 ie 91.102.88.0 - 91.102.95.255 dk 91.102.96.0 - 91.102.103.255 cz -91.102.112.0 - 91.102.117.239 pl -91.102.117.240 - 91.102.117.255 ch -91.102.118.0 - 91.102.119.255 pl +91.102.104.0 - 91.102.110.255 pl +91.102.111.0 - 91.102.111.255 a2 +91.102.112.0 - 91.102.119.255 pl 91.102.120.0 - 91.102.127.255 ae 91.102.128.0 - 91.102.135.255 it 91.102.136.0 - 91.102.143.255 de @@ -52566,7 +27273,7 @@ 91.102.168.0 - 91.102.175.255 rs 91.102.176.0 - 91.102.183.255 ua 91.102.184.0 - 91.102.191.255 gb -91.102.192.0 - 91.102.199.255 nl +91.102.192.0 - 91.102.199.255 ch 91.102.200.0 - 91.102.207.255 ru 91.102.208.0 - 91.102.215.255 nl 91.102.216.0 - 91.102.223.255 ru @@ -52575,21 +27282,13 @@ 91.102.240.0 - 91.102.247.255 es 91.102.248.0 - 91.102.255.255 fr 91.103.0.0 - 91.103.7.255 ie -91.103.8.0 - 91.103.15.255 rs 91.103.16.0 - 91.103.23.255 nl 91.103.24.0 - 91.103.31.255 am -91.103.32.0 - 91.103.33.255 gb -91.103.34.0 - 91.103.34.255 de -91.103.35.0 - 91.103.36.255 se +91.103.32.0 - 91.103.35.255 gb +91.103.36.0 - 91.103.36.255 se 91.103.37.0 - 91.103.37.255 no -91.103.38.0 - 91.103.38.255 dk -91.103.39.0 - 91.103.39.255 fi -91.103.40.0 - 91.103.40.255 fr -91.103.41.0 - 91.103.41.255 us -91.103.42.0 - 91.103.42.255 jp -91.103.43.0 - 91.103.45.255 fr -91.103.46.0 - 91.103.46.255 us -91.103.47.0 - 91.103.47.255 jp +91.103.38.0 - 91.103.39.255 gb +91.103.40.0 - 91.103.47.255 fr 91.103.48.0 - 91.103.55.255 es 91.103.56.0 - 91.103.63.255 am 91.103.64.0 - 91.103.87.255 ru @@ -52599,12 +27298,7 @@ 91.103.112.0 - 91.103.119.255 de 91.103.120.0 - 91.103.127.255 ua 91.103.128.0 - 91.103.135.255 gb -91.103.136.0 - 91.103.136.255 it -91.103.137.0 - 91.103.141.63 fr -91.103.141.64 - 91.103.141.127 es -91.103.141.128 - 91.103.141.255 fr -91.103.142.0 - 91.103.142.255 gb -91.103.143.0 - 91.103.143.255 de +91.103.136.0 - 91.103.143.255 fr 91.103.144.0 - 91.103.151.255 kw 91.103.152.0 - 91.103.159.255 ru 91.103.160.0 - 91.103.167.255 cz @@ -52615,591 +27309,122 @@ 91.103.232.0 - 91.103.239.255 fr 91.103.240.0 - 91.103.247.255 de 91.103.248.0 - 91.103.255.255 at -91.104.0.0 - 91.111.255.255 gb -91.112.0.0 - 91.112.243.255 at -91.112.244.0 - 91.112.244.255 a2 -91.112.245.0 - 91.115.255.255 at +91.104.0.0 - 91.104.255.255 hu +91.105.0.0 - 91.105.127.255 lv +91.105.128.0 - 91.105.199.255 ru +91.105.200.0 - 91.105.203.255 lv +91.105.204.0 - 91.105.207.255 ua +91.105.208.0 - 91.105.215.255 se +91.105.216.0 - 91.105.223.255 nl +91.105.224.0 - 91.105.231.255 gb +91.105.232.0 - 91.105.239.255 ru +91.105.240.0 - 91.105.247.255 de +91.105.248.0 - 91.105.255.255 fi +91.106.0.0 - 91.106.15.255 de +91.106.16.0 - 91.106.23.255 es +91.106.24.0 - 91.106.25.255 pl +91.106.26.0 - 91.106.26.255 es +91.106.27.0 - 91.106.31.255 pl +91.106.32.0 - 91.106.63.255 iq +91.106.64.0 - 91.106.95.255 ir +91.106.96.0 - 91.106.111.255 jo +91.106.112.0 - 91.106.119.255 ru +91.106.120.0 - 91.106.191.255 de +91.106.192.0 - 91.106.199.255 se +91.106.200.0 - 91.106.207.255 ru +91.106.208.0 - 91.106.215.255 cy +91.106.216.0 - 91.106.223.255 fr +91.106.224.0 - 91.106.231.255 nl +91.106.232.0 - 91.106.239.255 ru +91.106.240.0 - 91.106.255.255 cz +91.107.0.0 - 91.107.0.255 ir +91.107.1.0 - 91.107.127.255 ru +91.107.128.0 - 91.107.255.255 ir +91.108.0.0 - 91.108.3.255 ru +91.108.4.0 - 91.108.7.255 nl +91.108.8.0 - 91.108.55.255 ru +91.108.56.0 - 91.108.59.255 nl +91.108.60.0 - 91.108.63.255 ru +91.108.64.0 - 91.108.127.255 de +91.108.128.0 - 91.108.159.255 ir +91.108.160.0 - 91.108.167.255 gb +91.108.168.0 - 91.108.175.255 ru +91.108.176.0 - 91.108.183.255 se +91.108.184.0 - 91.108.191.255 ch +91.108.192.0 - 91.109.15.255 gb +91.109.16.0 - 91.109.31.255 de +91.109.32.0 - 91.109.39.255 cz +91.109.40.0 - 91.109.47.255 gb +91.109.48.0 - 91.109.63.255 it +91.109.64.0 - 91.109.95.255 ru +91.109.96.0 - 91.109.103.255 es +91.109.104.0 - 91.109.119.255 pt +91.109.120.0 - 91.109.127.255 fr +91.109.128.0 - 91.109.159.255 ru +91.109.160.0 - 91.109.167.255 es +91.109.168.0 - 91.109.175.255 it +91.109.176.0 - 91.109.191.255 nl +91.109.192.0 - 91.109.199.255 it +91.109.200.0 - 91.109.207.255 ru +91.109.208.0 - 91.109.215.255 tr +91.109.216.0 - 91.109.223.255 af +91.109.224.0 - 91.109.231.255 ru +91.109.232.0 - 91.109.244.255 gb +91.109.245.0 - 91.109.245.255 de +91.109.246.0 - 91.111.255.255 gb +91.112.0.0 - 91.115.255.255 at 91.116.0.0 - 91.117.255.255 es -91.118.0.0 - 91.118.86.171 at -91.118.86.172 - 91.118.86.175 gb -91.118.86.176 - 91.119.255.255 at +91.118.0.0 - 91.119.255.255 at 91.120.0.0 - 91.120.255.255 hu 91.121.0.0 - 91.121.215.255 fr 91.121.216.0 - 91.121.219.255 be -91.121.220.0 - 91.121.223.255 fr -91.121.224.0 - 91.121.224.31 pl -91.121.224.32 - 91.121.224.63 fr -91.121.224.64 - 91.121.224.71 it -91.121.224.72 - 91.121.224.75 gb -91.121.224.76 - 91.121.224.79 fi -91.121.224.80 - 91.121.224.87 ch -91.121.224.88 - 91.121.224.91 de -91.121.224.92 - 91.121.224.95 pl -91.121.224.96 - 91.121.224.99 de -91.121.224.100 - 91.121.224.103 be -91.121.224.104 - 91.121.224.107 ch -91.121.224.108 - 91.121.224.127 fr -91.121.224.128 - 91.121.224.143 pl -91.121.224.144 - 91.121.224.159 fr -91.121.224.160 - 91.121.224.175 de -91.121.224.176 - 91.121.224.191 be -91.121.224.192 - 91.121.224.195 fr -91.121.224.196 - 91.121.224.199 it -91.121.224.200 - 91.121.224.203 de -91.121.224.204 - 91.121.224.207 fr -91.121.224.208 - 91.121.224.223 es -91.121.224.224 - 91.121.224.239 fr -91.121.224.240 - 91.121.224.255 be -91.121.225.0 - 91.121.225.3 es -91.121.225.4 - 91.121.225.7 de -91.121.225.8 - 91.121.225.11 fi -91.121.225.12 - 91.121.225.15 es -91.121.225.16 - 91.121.225.31 be -91.121.225.32 - 91.121.225.47 gb -91.121.225.48 - 91.121.225.147 fr -91.121.225.148 - 91.121.225.159 pl -91.121.225.160 - 91.121.225.175 it -91.121.225.176 - 91.121.225.191 es -91.121.225.192 - 91.121.225.195 gb -91.121.225.196 - 91.121.225.199 es -91.121.225.200 - 91.121.225.207 fr -91.121.225.208 - 91.121.225.215 de -91.121.225.216 - 91.121.225.219 fr -91.121.225.220 - 91.121.225.223 pl -91.121.225.224 - 91.121.225.239 fr -91.121.225.240 - 91.121.225.247 de -91.121.225.248 - 91.121.225.255 nl -91.121.226.0 - 91.121.226.15 gb -91.121.226.16 - 91.121.226.31 fr -91.121.226.32 - 91.121.226.35 gb -91.121.226.36 - 91.121.226.39 pl -91.121.226.40 - 91.121.226.47 de -91.121.226.48 - 91.121.226.63 gb -91.121.226.64 - 91.121.226.95 fr -91.121.226.96 - 91.121.226.127 gb -91.121.226.128 - 91.121.226.143 fr -91.121.226.144 - 91.121.226.159 pl -91.121.226.160 - 91.121.226.163 fr -91.121.226.164 - 91.121.226.167 pl -91.121.226.168 - 91.121.226.171 gb -91.121.226.172 - 91.121.226.175 pl -91.121.226.176 - 91.121.226.179 fr -91.121.226.180 - 91.121.226.183 es -91.121.226.184 - 91.121.226.191 gb -91.121.226.192 - 91.121.226.207 nl -91.121.226.208 - 91.121.227.79 fr -91.121.227.80 - 91.121.227.95 ch -91.121.227.96 - 91.121.227.127 be +91.121.220.0 - 91.121.225.95 fr +91.121.225.96 - 91.121.225.111 nl +91.121.225.112 - 91.121.226.47 fr +91.121.226.48 - 91.121.226.63 es +91.121.226.64 - 91.121.227.15 fr +91.121.227.16 - 91.121.227.31 ie +91.121.227.32 - 91.121.227.127 fr 91.121.227.128 - 91.121.227.143 de -91.121.227.144 - 91.121.227.159 fr -91.121.227.160 - 91.121.227.175 pl -91.121.227.176 - 91.121.227.191 fr -91.121.227.192 - 91.121.227.195 be -91.121.227.196 - 91.121.227.207 fr -91.121.227.208 - 91.121.227.223 be -91.121.227.224 - 91.121.227.231 gb -91.121.227.232 - 91.121.227.239 ch -91.121.227.240 - 91.121.227.247 fr -91.121.227.248 - 91.121.227.251 es -91.121.227.252 - 91.121.227.255 de -91.121.228.0 - 91.121.228.15 pl -91.121.228.16 - 91.121.228.31 fr -91.121.228.32 - 91.121.228.47 de -91.121.228.48 - 91.121.228.51 be -91.121.228.52 - 91.121.228.55 de -91.121.228.56 - 91.121.228.59 gb -91.121.228.60 - 91.121.228.95 de -91.121.228.96 - 91.121.228.159 fr -91.121.228.160 - 91.121.228.175 gb -91.121.228.176 - 91.121.228.191 pl -91.121.228.192 - 91.121.228.223 fr -91.121.228.224 - 91.121.228.239 be -91.121.228.240 - 91.121.228.255 fr -91.121.229.0 - 91.121.229.7 pl -91.121.229.8 - 91.121.229.31 fr -91.121.229.32 - 91.121.229.47 nl -91.121.229.48 - 91.121.229.63 fr -91.121.229.64 - 91.121.229.67 it -91.121.229.68 - 91.121.229.71 fr -91.121.229.72 - 91.121.229.79 be -91.121.229.80 - 91.121.229.127 fr -91.121.229.128 - 91.121.229.143 es -91.121.229.144 - 91.121.229.147 pl -91.121.229.148 - 91.121.229.151 fr -91.121.229.152 - 91.121.229.159 pl -91.121.229.160 - 91.121.229.163 es -91.121.229.164 - 91.121.229.167 fr -91.121.229.168 - 91.121.229.171 es -91.121.229.172 - 91.121.229.175 de -91.121.229.176 - 91.121.229.179 pl -91.121.229.180 - 91.121.229.183 es -91.121.229.184 - 91.121.229.191 pl -91.121.229.192 - 91.121.229.223 fr -91.121.229.224 - 91.121.229.231 pl -91.121.229.232 - 91.121.229.235 fr -91.121.229.236 - 91.121.229.239 ch -91.121.229.240 - 91.121.229.255 es -91.121.230.0 - 91.121.230.7 pl -91.121.230.8 - 91.121.230.15 fr -91.121.230.16 - 91.121.230.19 gb -91.121.230.20 - 91.121.230.23 fi -91.121.230.24 - 91.121.230.27 de -91.121.230.28 - 91.121.230.31 it -91.121.230.32 - 91.121.230.47 pl -91.121.230.48 - 91.121.230.55 es -91.121.230.56 - 91.121.230.59 fr -91.121.230.60 - 91.121.230.95 pl -91.121.230.96 - 91.121.230.111 fr -91.121.230.112 - 91.121.230.127 ch -91.121.230.128 - 91.121.230.159 fr -91.121.230.160 - 91.121.230.191 es -91.121.230.192 - 91.121.230.207 gb -91.121.230.208 - 91.121.230.211 pl -91.121.230.212 - 91.121.230.215 gb -91.121.230.216 - 91.121.230.219 ch -91.121.230.220 - 91.121.230.223 fi -91.121.230.224 - 91.121.230.247 fr -91.121.230.248 - 91.121.230.251 pl -91.121.230.252 - 91.121.230.255 de -91.121.231.0 - 91.121.231.15 pl -91.121.231.16 - 91.121.231.19 fr -91.121.231.20 - 91.121.231.27 pl -91.121.231.28 - 91.121.231.31 gb -91.121.231.32 - 91.121.231.63 fr -91.121.231.64 - 91.121.231.79 pt -91.121.231.80 - 91.121.231.83 fr -91.121.231.84 - 91.121.231.87 gb -91.121.231.88 - 91.121.231.111 pl -91.121.231.112 - 91.121.231.127 es -91.121.231.128 - 91.121.231.135 pl -91.121.231.136 - 91.121.231.143 be -91.121.231.144 - 91.121.231.159 cz -91.121.231.160 - 91.121.231.227 fr -91.121.231.228 - 91.121.231.231 gb -91.121.231.232 - 91.121.231.235 pt -91.121.231.236 - 91.121.231.239 pl -91.121.231.240 - 91.121.232.15 fr -91.121.232.16 - 91.121.232.31 es -91.121.232.32 - 91.121.232.47 pl -91.121.232.48 - 91.121.232.95 fr -91.121.232.96 - 91.121.232.103 nl -91.121.232.104 - 91.121.232.143 fr -91.121.232.144 - 91.121.232.159 gb -91.121.232.160 - 91.121.232.223 fr -91.121.232.224 - 91.121.232.239 es -91.121.232.240 - 91.121.232.255 pl -91.121.233.0 - 91.121.233.3 it -91.121.233.4 - 91.121.233.7 fi -91.121.233.8 - 91.121.233.15 ie -91.121.233.16 - 91.121.233.31 fr -91.121.233.32 - 91.121.233.63 es -91.121.233.64 - 91.121.233.79 fr -91.121.233.80 - 91.121.233.95 gb -91.121.233.96 - 91.121.233.159 fr -91.121.233.160 - 91.121.233.191 pl -91.121.233.192 - 91.121.233.195 fr -91.121.233.196 - 91.121.233.199 pl -91.121.233.200 - 91.121.233.203 fr -91.121.233.204 - 91.121.233.207 gb -91.121.233.208 - 91.121.233.215 be -91.121.233.216 - 91.121.233.219 ch -91.121.233.220 - 91.121.233.223 pl -91.121.233.224 - 91.121.233.231 fr -91.121.233.232 - 91.121.233.235 es -91.121.233.236 - 91.121.233.239 gb -91.121.233.240 - 91.121.234.15 fr -91.121.234.16 - 91.121.234.31 pl -91.121.234.32 - 91.121.234.63 fr -91.121.234.64 - 91.121.234.79 es -91.121.234.80 - 91.121.234.159 fr -91.121.234.160 - 91.121.234.175 pl -91.121.234.176 - 91.121.234.223 fr -91.121.234.224 - 91.121.234.231 be -91.121.234.232 - 91.121.234.239 fr -91.121.234.240 - 91.121.234.247 ie -91.121.234.248 - 91.121.234.255 fr -91.121.235.0 - 91.121.235.15 pl -91.121.235.16 - 91.121.235.31 fr -91.121.235.32 - 91.121.235.63 es -91.121.235.64 - 91.121.235.79 fr -91.121.235.80 - 91.121.235.87 pl -91.121.235.88 - 91.121.235.91 de -91.121.235.92 - 91.121.235.95 es -91.121.235.96 - 91.121.235.127 fr -91.121.235.128 - 91.121.235.131 de -91.121.235.132 - 91.121.235.135 pl -91.121.235.136 - 91.121.235.139 nl -91.121.235.140 - 91.121.235.143 de -91.121.235.144 - 91.121.235.151 fr -91.121.235.152 - 91.121.235.159 gb -91.121.235.160 - 91.121.235.207 fr -91.121.235.208 - 91.121.235.223 be -91.121.235.224 - 91.121.235.231 es -91.121.235.232 - 91.121.235.239 de -91.121.235.240 - 91.121.235.255 fr -91.121.236.0 - 91.121.236.15 de -91.121.236.16 - 91.121.236.31 fr -91.121.236.32 - 91.121.236.39 pl -91.121.236.40 - 91.121.236.43 de -91.121.236.44 - 91.121.236.63 fr -91.121.236.64 - 91.121.236.79 de -91.121.236.80 - 91.121.236.83 pl -91.121.236.84 - 91.121.236.91 fr -91.121.236.92 - 91.121.236.95 de -91.121.236.96 - 91.121.236.111 gb -91.121.236.112 - 91.121.236.119 pl -91.121.236.120 - 91.121.236.127 fr -91.121.236.128 - 91.121.236.143 gb -91.121.236.144 - 91.121.236.175 fr -91.121.236.176 - 91.121.236.191 pl -91.121.236.192 - 91.121.236.207 it -91.121.236.208 - 91.121.236.211 ch -91.121.236.212 - 91.121.236.215 be -91.121.236.216 - 91.121.236.219 fr -91.121.236.220 - 91.121.236.223 it -91.121.236.224 - 91.121.237.31 fr -91.121.237.32 - 91.121.237.35 es -91.121.237.36 - 91.121.237.63 fr -91.121.237.64 - 91.121.237.67 cz -91.121.237.68 - 91.121.237.71 nl -91.121.237.72 - 91.121.237.79 fr -91.121.237.80 - 91.121.237.83 pl -91.121.237.84 - 91.121.237.127 fr -91.121.237.128 - 91.121.237.131 de -91.121.237.132 - 91.121.237.135 ie -91.121.237.136 - 91.121.237.139 gb -91.121.237.140 - 91.121.237.159 fr -91.121.237.160 - 91.121.237.175 gb -91.121.237.176 - 91.121.237.191 pl -91.121.237.192 - 91.121.237.227 fr -91.121.237.228 - 91.121.237.231 ch -91.121.237.232 - 91.121.237.235 cz -91.121.237.236 - 91.121.237.243 pl -91.121.237.244 - 91.121.237.247 fr -91.121.237.248 - 91.121.237.251 gb -91.121.237.252 - 91.121.237.255 nl -91.121.238.0 - 91.121.238.63 fr -91.121.238.64 - 91.121.238.79 be -91.121.238.80 - 91.121.238.95 de -91.121.238.96 - 91.121.238.111 pl -91.121.238.112 - 91.121.238.127 cz -91.121.238.128 - 91.121.238.143 ie -91.121.238.144 - 91.121.238.147 cz -91.121.238.148 - 91.121.238.151 nl -91.121.238.152 - 91.121.238.159 it -91.121.238.160 - 91.121.238.207 fr -91.121.238.208 - 91.121.238.219 pl -91.121.238.220 - 91.121.238.223 fr +91.121.227.144 - 91.121.229.127 fr +91.121.229.128 - 91.121.229.131 it +91.121.229.132 - 91.121.231.223 fr +91.121.231.224 - 91.121.231.227 es +91.121.231.228 - 91.121.232.31 fr +91.121.232.32 - 91.121.232.35 nl +91.121.232.36 - 91.121.232.191 fr +91.121.232.192 - 91.121.232.195 de +91.121.232.196 - 91.121.232.207 fr +91.121.232.208 - 91.121.232.211 de +91.121.232.212 - 91.121.233.215 fr +91.121.233.216 - 91.121.233.219 es +91.121.233.220 - 91.121.237.15 fr +91.121.237.16 - 91.121.237.31 gb +91.121.237.32 - 91.121.237.63 fr +91.121.237.64 - 91.121.237.67 es +91.121.237.68 - 91.121.237.79 fr +91.121.237.80 - 91.121.237.83 es +91.121.237.84 - 91.121.238.223 fr 91.121.238.224 - 91.121.238.239 gb -91.121.238.240 - 91.121.238.255 es -91.121.239.0 - 91.121.239.15 ie -91.121.239.16 - 91.121.239.31 fr -91.121.239.32 - 91.121.239.35 gb -91.121.239.36 - 91.121.239.39 fr -91.121.239.40 - 91.121.239.43 be -91.121.239.44 - 91.121.239.47 gb -91.121.239.48 - 91.121.239.55 fr -91.121.239.56 - 91.121.239.63 be -91.121.239.64 - 91.121.239.71 fr -91.121.239.72 - 91.121.239.75 it -91.121.239.76 - 91.121.239.87 fr -91.121.239.88 - 91.121.239.91 gb -91.121.239.92 - 91.121.239.95 de -91.121.239.96 - 91.121.239.127 fr -91.121.239.128 - 91.121.239.159 be -91.121.239.160 - 91.121.239.175 nl -91.121.239.176 - 91.121.239.207 fr -91.121.239.208 - 91.121.239.211 it -91.121.239.212 - 91.121.239.215 gb -91.121.239.216 - 91.121.239.219 fr -91.121.239.220 - 91.121.239.223 de -91.121.239.224 - 91.121.239.227 pl -91.121.239.228 - 91.121.239.231 es -91.121.239.232 - 91.121.239.235 de -91.121.239.236 - 91.121.239.255 fr -91.121.240.0 - 91.121.240.3 de -91.121.240.4 - 91.121.240.7 fr -91.121.240.8 - 91.121.240.11 pt -91.121.240.12 - 91.121.240.15 ch -91.121.240.16 - 91.121.240.31 it -91.121.240.32 - 91.121.240.35 pl -91.121.240.36 - 91.121.240.39 de -91.121.240.40 - 91.121.240.43 nl -91.121.240.44 - 91.121.240.47 gb -91.121.240.48 - 91.121.240.55 es -91.121.240.56 - 91.121.240.59 pl -91.121.240.60 - 91.121.240.63 fr -91.121.240.64 - 91.121.240.79 be -91.121.240.80 - 91.121.240.111 fr -91.121.240.112 - 91.121.240.127 it -91.121.240.128 - 91.121.240.135 es -91.121.240.136 - 91.121.240.139 de -91.121.240.140 - 91.121.240.143 es -91.121.240.144 - 91.121.240.159 pl -91.121.240.160 - 91.121.240.175 gb -91.121.240.176 - 91.121.240.191 es -91.121.240.192 - 91.121.240.207 fr -91.121.240.208 - 91.121.240.223 de -91.121.240.224 - 91.121.240.255 pl -91.121.241.0 - 91.121.241.63 es -91.121.241.64 - 91.121.241.191 fr -91.121.241.192 - 91.121.241.207 de -91.121.241.208 - 91.121.241.211 cz -91.121.241.212 - 91.121.241.215 gb -91.121.241.216 - 91.121.241.223 es -91.121.241.224 - 91.121.241.227 gb -91.121.241.228 - 91.121.241.231 de -91.121.241.232 - 91.121.241.239 es -91.121.241.240 - 91.121.241.255 fr -91.121.242.0 - 91.121.242.3 de -91.121.242.4 - 91.121.242.7 pt -91.121.242.8 - 91.121.242.23 pl -91.121.242.24 - 91.121.242.31 de -91.121.242.32 - 91.121.242.67 fr -91.121.242.68 - 91.121.242.71 pl -91.121.242.72 - 91.121.242.75 de -91.121.242.76 - 91.121.242.79 es -91.121.242.80 - 91.121.242.95 fr -91.121.242.96 - 91.121.242.111 be -91.121.242.112 - 91.121.242.127 gb -91.121.242.128 - 91.121.242.159 fr -91.121.242.160 - 91.121.242.167 pl -91.121.242.168 - 91.121.242.223 fr -91.121.242.224 - 91.121.242.239 pl -91.121.242.240 - 91.121.242.247 fr -91.121.242.248 - 91.121.242.255 es -91.121.243.0 - 91.121.243.15 gb -91.121.243.16 - 91.121.243.19 nl -91.121.243.20 - 91.121.243.39 fr -91.121.243.40 - 91.121.243.43 pl -91.121.243.44 - 91.121.243.47 ie -91.121.243.48 - 91.121.243.63 fr -91.121.243.64 - 91.121.243.95 es -91.121.243.96 - 91.121.243.111 gb -91.121.243.112 - 91.121.243.127 fr -91.121.243.128 - 91.121.243.191 be -91.121.243.192 - 91.121.243.207 it -91.121.243.208 - 91.121.243.239 fr -91.121.243.240 - 91.121.243.255 es -91.121.244.0 - 91.121.244.63 fr -91.121.244.64 - 91.121.244.191 be -91.121.244.192 - 91.121.244.223 fr -91.121.244.224 - 91.121.244.239 pl -91.121.244.240 - 91.121.245.63 fr -91.121.245.64 - 91.121.245.79 de -91.121.245.80 - 91.121.245.103 fr -91.121.245.104 - 91.121.245.111 pl -91.121.245.112 - 91.121.245.127 fr -91.121.245.128 - 91.121.245.143 pl -91.121.245.144 - 91.121.245.159 de -91.121.245.160 - 91.121.245.163 ch -91.121.245.164 - 91.121.245.167 pt -91.121.245.168 - 91.121.245.171 it -91.121.245.172 - 91.121.245.207 fr -91.121.245.208 - 91.121.245.227 pl -91.121.245.228 - 91.121.245.231 fr -91.121.245.232 - 91.121.245.239 pl -91.121.245.240 - 91.121.245.255 ie -91.121.246.0 - 91.121.246.143 fr -91.121.246.144 - 91.121.246.151 es -91.121.246.152 - 91.121.246.159 fr -91.121.246.160 - 91.121.246.167 es -91.121.246.168 - 91.121.246.175 fr -91.121.246.176 - 91.121.246.191 ie -91.121.246.192 - 91.121.246.207 gb -91.121.246.208 - 91.121.246.211 it -91.121.246.212 - 91.121.246.215 de -91.121.246.216 - 91.121.246.223 gb -91.121.246.224 - 91.121.247.3 fr -91.121.247.4 - 91.121.247.7 pl -91.121.247.8 - 91.121.247.15 fr -91.121.247.16 - 91.121.247.31 it -91.121.247.32 - 91.121.247.39 pl -91.121.247.40 - 91.121.247.43 fr -91.121.247.44 - 91.121.247.47 de -91.121.247.48 - 91.121.247.55 fr -91.121.247.56 - 91.121.247.59 es -91.121.247.60 - 91.121.247.63 gb -91.121.247.64 - 91.121.247.67 pl -91.121.247.68 - 91.121.247.71 fr -91.121.247.72 - 91.121.247.75 ch -91.121.247.76 - 91.121.247.79 cz -91.121.247.80 - 91.121.247.83 pt -91.121.247.84 - 91.121.247.87 fr -91.121.247.88 - 91.121.247.95 pl -91.121.247.96 - 91.121.247.207 fr -91.121.247.208 - 91.121.247.223 de -91.121.247.224 - 91.121.247.239 pl -91.121.247.240 - 91.121.248.3 fr -91.121.248.4 - 91.121.248.7 es -91.121.248.8 - 91.121.248.15 pl -91.121.248.16 - 91.121.248.23 es +91.121.238.240 - 91.121.239.227 fr +91.121.239.228 - 91.121.239.231 it +91.121.239.232 - 91.121.240.135 fr +91.121.240.136 - 91.121.240.139 es +91.121.240.140 - 91.121.243.43 fr +91.121.243.44 - 91.121.243.47 es +91.121.243.48 - 91.121.247.3 fr +91.121.247.4 - 91.121.247.7 es +91.121.247.8 - 91.121.247.39 fr +91.121.247.40 - 91.121.247.43 es +91.121.247.44 - 91.121.248.7 fr +91.121.248.8 - 91.121.248.11 it +91.121.248.12 - 91.121.248.23 fr 91.121.248.24 - 91.121.248.27 pl -91.121.248.28 - 91.121.248.63 es -91.121.248.64 - 91.121.248.79 it -91.121.248.80 - 91.121.248.95 gb -91.121.248.96 - 91.121.248.111 fr -91.121.248.112 - 91.121.248.127 es -91.121.248.128 - 91.121.248.211 fr -91.121.248.212 - 91.121.248.215 pl -91.121.248.216 - 91.121.248.219 fr -91.121.248.220 - 91.121.248.223 gb -91.121.248.224 - 91.121.248.239 de -91.121.248.240 - 91.121.248.255 be -91.121.249.0 - 91.121.249.15 fr -91.121.249.16 - 91.121.249.31 pl -91.121.249.32 - 91.121.249.35 it -91.121.249.36 - 91.121.249.39 pl -91.121.249.40 - 91.121.249.43 gb -91.121.249.44 - 91.121.249.95 fr -91.121.249.96 - 91.121.249.111 es -91.121.249.112 - 91.121.249.127 pl -91.121.249.128 - 91.121.249.143 fr -91.121.249.144 - 91.121.249.147 lt -91.121.249.148 - 91.121.249.155 gb -91.121.249.156 - 91.121.249.159 ie -91.121.249.160 - 91.121.249.163 es -91.121.249.164 - 91.121.249.167 de -91.121.249.168 - 91.121.249.175 es -91.121.249.176 - 91.121.249.179 de -91.121.249.180 - 91.121.249.183 fr -91.121.249.184 - 91.121.249.187 gb -91.121.249.188 - 91.121.249.191 nl -91.121.249.192 - 91.121.249.195 fr -91.121.249.196 - 91.121.249.199 nl -91.121.249.200 - 91.121.249.207 ie -91.121.249.208 - 91.121.249.211 fr -91.121.249.212 - 91.121.249.215 gb +91.121.248.28 - 91.121.248.179 fr +91.121.248.180 - 91.121.248.183 es +91.121.248.184 - 91.121.249.215 fr 91.121.249.216 - 91.121.249.223 de -91.121.249.224 - 91.121.249.239 gb -91.121.249.240 - 91.121.249.255 pl -91.121.250.0 - 91.121.250.23 fr -91.121.250.24 - 91.121.250.27 pl -91.121.250.28 - 91.121.250.31 fi -91.121.250.32 - 91.121.250.47 fr -91.121.250.48 - 91.121.250.71 it -91.121.250.72 - 91.121.250.79 be -91.121.250.80 - 91.121.250.99 fr -91.121.250.100 - 91.121.250.103 be -91.121.250.104 - 91.121.250.107 de -91.121.250.108 - 91.121.250.111 pt -91.121.250.112 - 91.121.250.127 fr -91.121.250.128 - 91.121.250.143 pl -91.121.250.144 - 91.121.250.159 es -91.121.250.160 - 91.121.250.227 fr -91.121.250.228 - 91.121.250.231 pl -91.121.250.232 - 91.121.250.235 ie -91.121.250.236 - 91.121.250.255 fr -91.121.251.0 - 91.121.251.15 es -91.121.251.16 - 91.121.251.19 fr -91.121.251.20 - 91.121.251.23 de -91.121.251.24 - 91.121.251.27 it -91.121.251.28 - 91.121.251.31 es -91.121.251.32 - 91.121.251.47 pl -91.121.251.48 - 91.121.251.63 fr -91.121.251.64 - 91.121.251.95 pl -91.121.251.96 - 91.121.251.111 es -91.121.251.112 - 91.121.251.127 fr -91.121.251.128 - 91.121.251.131 es -91.121.251.132 - 91.121.251.135 lt -91.121.251.136 - 91.121.251.175 fr -91.121.251.176 - 91.121.251.183 es -91.121.251.184 - 91.121.251.191 pl -91.121.251.192 - 91.121.251.199 it -91.121.251.200 - 91.121.251.203 de -91.121.251.204 - 91.121.251.207 fr -91.121.251.208 - 91.121.251.211 nl -91.121.251.212 - 91.121.251.215 fr -91.121.251.216 - 91.121.251.223 pl -91.121.251.224 - 91.121.251.227 pt -91.121.251.228 - 91.121.251.231 es -91.121.251.232 - 91.121.251.235 fi -91.121.251.236 - 91.121.251.239 gb -91.121.251.240 - 91.121.251.255 es -91.121.252.0 - 91.121.252.7 de -91.121.252.8 - 91.121.252.31 fr -91.121.252.32 - 91.121.252.39 es -91.121.252.40 - 91.121.252.47 fr -91.121.252.48 - 91.121.252.63 gb -91.121.252.64 - 91.121.252.79 es -91.121.252.80 - 91.121.252.83 pl -91.121.252.84 - 91.121.252.87 es -91.121.252.88 - 91.121.252.91 de -91.121.252.92 - 91.121.252.95 fr -91.121.252.96 - 91.121.252.111 it -91.121.252.112 - 91.121.252.135 fr -91.121.252.136 - 91.121.252.139 es -91.121.252.140 - 91.121.252.159 fr -91.121.252.160 - 91.121.252.167 lt -91.121.252.168 - 91.121.252.171 fr -91.121.252.172 - 91.121.252.175 it -91.121.252.176 - 91.121.252.191 fr -91.121.252.192 - 91.121.252.199 be -91.121.252.200 - 91.121.252.207 ch -91.121.252.208 - 91.121.252.223 de -91.121.252.224 - 91.121.252.239 fr -91.121.252.240 - 91.121.252.255 gb -91.121.253.0 - 91.121.253.7 pl -91.121.253.8 - 91.121.253.15 nl -91.121.253.16 - 91.121.253.31 fr -91.121.253.32 - 91.121.253.39 pl -91.121.253.40 - 91.121.253.47 pt -91.121.253.48 - 91.121.253.63 nl -91.121.253.64 - 91.121.253.79 pl -91.121.253.80 - 91.121.253.95 gb -91.121.253.96 - 91.121.253.111 es -91.121.253.112 - 91.121.253.127 pl -91.121.253.128 - 91.121.253.159 de -91.121.253.160 - 91.121.253.191 fr -91.121.253.192 - 91.121.253.211 gb -91.121.253.212 - 91.121.253.215 fr -91.121.253.216 - 91.121.253.239 pl -91.121.253.240 - 91.121.253.247 fr -91.121.253.248 - 91.121.253.251 es -91.121.253.252 - 91.121.254.31 fr -91.121.254.32 - 91.121.254.47 gb -91.121.254.48 - 91.121.254.51 ie -91.121.254.52 - 91.121.254.59 fr -91.121.254.60 - 91.121.254.83 es -91.121.254.84 - 91.121.254.91 pl -91.121.254.92 - 91.121.254.95 nl -91.121.254.96 - 91.121.254.111 es -91.121.254.112 - 91.121.254.127 fr -91.121.254.128 - 91.121.254.143 es -91.121.254.144 - 91.121.254.159 fr -91.121.254.160 - 91.121.254.167 pl -91.121.254.168 - 91.121.254.175 de -91.121.254.176 - 91.121.254.207 fr -91.121.254.208 - 91.121.254.211 pl -91.121.254.212 - 91.121.254.215 gb -91.121.254.216 - 91.121.254.219 de -91.121.254.220 - 91.121.255.31 fr -91.121.255.32 - 91.121.255.35 pl -91.121.255.36 - 91.121.255.39 fr -91.121.255.40 - 91.121.255.43 de -91.121.255.44 - 91.121.255.47 be -91.121.255.48 - 91.121.255.63 pl -91.121.255.64 - 91.121.255.95 es -91.121.255.96 - 91.121.255.111 fr -91.121.255.112 - 91.121.255.127 de -91.121.255.128 - 91.121.255.143 fr -91.121.255.144 - 91.121.255.151 ch -91.121.255.152 - 91.121.255.159 ie -91.121.255.160 - 91.121.255.163 fr -91.121.255.164 - 91.121.255.167 pl -91.121.255.168 - 91.121.255.171 ie -91.121.255.172 - 91.121.255.175 ch -91.121.255.176 - 91.121.255.179 de -91.121.255.180 - 91.121.255.183 pl -91.121.255.184 - 91.121.255.187 es -91.121.255.188 - 91.121.255.191 pl -91.121.255.192 - 91.121.255.207 fr -91.121.255.208 - 91.121.255.215 pl -91.121.255.216 - 91.121.255.219 pt -91.121.255.220 - 91.121.255.223 es -91.121.255.224 - 91.121.255.247 fr -91.121.255.248 - 91.121.255.251 be -91.121.255.252 - 91.121.255.255 fr +91.121.249.224 - 91.121.255.255 fr 91.122.0.0 - 91.122.255.255 ru 91.123.0.0 - 91.123.15.255 ro 91.123.16.0 - 91.123.31.255 ru @@ -53217,35 +27442,34 @@ 91.123.240.0 - 91.123.255.255 nl 91.124.0.0 - 91.124.255.255 ua 91.125.0.0 - 91.125.255.255 gb -91.126.0.0 - 91.126.1.255 se -91.126.2.0 - 91.126.3.255 es -91.126.4.0 - 91.126.22.31 se -91.126.22.32 - 91.126.22.239 es -91.126.22.240 - 91.126.22.255 se -91.126.23.0 - 91.126.23.255 es -91.126.24.0 - 91.126.59.255 se -91.126.60.0 - 91.126.79.255 es -91.126.80.0 - 91.126.95.255 se -91.126.96.0 - 91.126.107.255 es -91.126.108.0 - 91.126.131.255 se -91.126.132.0 - 91.126.137.255 es -91.126.138.0 - 91.126.141.255 se -91.126.142.0 - 91.126.143.255 es -91.126.144.0 - 91.126.147.255 se -91.126.148.0 - 91.126.151.255 es -91.126.152.0 - 91.126.155.255 se -91.126.156.0 - 91.126.255.255 es +91.126.0.0 - 91.126.15.255 no +91.126.16.0 - 91.126.255.255 es 91.127.0.0 - 91.127.255.255 sk 91.128.0.0 - 91.129.63.255 at -91.129.64.0 - 91.129.255.255 se -91.130.0.0 - 91.131.255.255 at +91.129.64.0 - 91.129.88.31 ee +91.129.88.32 - 91.129.95.255 se +91.129.96.0 - 91.129.127.255 ee +91.129.128.0 - 91.129.255.255 se +91.130.0.0 - 91.130.255.255 at +91.131.0.0 - 91.131.127.255 no +91.131.128.0 - 91.131.151.255 lv +91.131.152.0 - 91.131.159.255 hr +91.131.160.0 - 91.131.191.255 ee +91.131.192.0 - 91.131.255.255 nl 91.132.0.0 - 91.132.255.255 gr -91.133.0.0 - 91.133.255.255 fi +91.133.0.0 - 91.133.31.255 ru +91.133.32.0 - 91.133.63.255 dk +91.133.64.0 - 91.133.127.255 at +91.133.128.0 - 91.133.255.255 ir 91.134.0.0 - 91.134.255.255 bg 91.135.0.0 - 91.135.15.255 gb 91.135.16.0 - 91.135.31.255 lv 91.135.32.0 - 91.135.63.255 no -91.135.64.0 - 91.135.79.255 ch +91.135.64.0 - 91.135.67.255 ch +91.135.68.0 - 91.135.68.255 nl +91.135.69.0 - 91.135.75.255 ch +91.135.76.0 - 91.135.76.255 hk +91.135.77.0 - 91.135.79.255 ch 91.135.80.0 - 91.135.95.255 lv 91.135.96.0 - 91.135.111.255 il 91.135.112.0 - 91.135.127.255 hu @@ -53258,56 +27482,24 @@ 91.135.224.0 - 91.135.239.255 gb 91.135.240.0 - 91.135.255.255 az 91.136.0.0 - 91.136.127.255 gb -91.136.128.0 - 91.136.255.255 de -91.137.0.0 - 91.137.13.255 ch -91.137.14.0 - 91.137.17.254 de -91.137.17.255 - 91.137.59.255 ch -91.137.60.0 - 91.137.60.127 de -91.137.60.128 - 91.137.60.255 ch -91.137.61.0 - 91.137.61.127 de -91.137.61.128 - 91.137.61.255 ch -91.137.62.0 - 91.137.62.127 de -91.137.62.128 - 91.137.62.255 ch -91.137.63.0 - 91.137.63.127 de -91.137.63.128 - 91.137.63.255 ch -91.137.64.0 - 91.137.64.254 de -91.137.64.255 - 91.137.127.255 ch -91.137.128.0 - 91.137.252.255 hu -91.137.253.0 - 91.137.255.255 sr +91.136.128.0 - 91.137.127.255 de +91.137.128.0 - 91.137.255.255 hu 91.138.0.0 - 91.138.127.255 ch 91.138.128.0 - 91.138.255.255 gr -91.139.0.0 - 91.139.127.255 hu +91.139.0.0 - 91.139.127.255 cz 91.139.128.0 - 91.139.255.255 bg 91.140.0.0 - 91.140.127.255 gr -91.140.128.0 - 91.140.255.255 kw +91.140.128.0 - 91.140.225.255 kw +91.140.226.0 - 91.140.226.255 us +91.140.227.0 - 91.140.240.255 kw +91.140.241.0 - 91.140.241.255 us +91.140.242.0 - 91.140.255.255 kw 91.141.0.0 - 91.141.127.255 at 91.141.128.0 - 91.141.255.255 nl 91.142.0.0 - 91.142.15.255 lv 91.142.16.0 - 91.142.31.255 at 91.142.32.0 - 91.142.47.255 gb -91.142.48.0 - 91.142.49.127 de -91.142.49.128 - 91.142.49.255 a2 -91.142.50.0 - 91.142.51.255 iq -91.142.52.0 - 91.142.53.255 de -91.142.54.0 - 91.142.54.255 iq -91.142.55.0 - 91.142.55.127 a2 -91.142.55.128 - 91.142.55.191 sa -91.142.55.192 - 91.142.55.255 iq -91.142.56.0 - 91.142.58.63 lb -91.142.58.64 - 91.142.59.127 a2 -91.142.59.128 - 91.142.59.255 sa -91.142.60.0 - 91.142.60.127 ae -91.142.60.128 - 91.142.60.191 de -91.142.60.192 - 91.142.60.255 iq -91.142.61.0 - 91.142.61.127 a2 -91.142.61.128 - 91.142.61.191 iq -91.142.61.192 - 91.142.61.255 a2 -91.142.62.0 - 91.142.62.31 fr -91.142.62.32 - 91.142.62.63 lu -91.142.62.64 - 91.142.62.79 iq -91.142.62.80 - 91.142.62.95 nl -91.142.62.96 - 91.142.62.255 de -91.142.63.0 - 91.142.63.255 a2 +91.142.48.0 - 91.142.63.255 de 91.142.64.0 - 91.142.71.255 it 91.142.72.0 - 91.142.95.255 ru 91.142.96.0 - 91.142.111.255 ie @@ -53315,14 +27507,13 @@ 91.142.128.0 - 91.142.128.255 gb 91.142.129.0 - 91.142.130.255 lu 91.142.131.0 - 91.142.132.255 nl -91.142.133.0 - 91.142.133.255 ru 91.142.134.0 - 91.142.134.255 gb 91.142.135.0 - 91.142.135.255 ru 91.142.136.0 - 91.142.136.255 dk 91.142.137.0 - 91.142.137.255 pl 91.142.138.0 - 91.142.138.255 ru 91.142.139.0 - 91.142.139.255 hr -91.142.140.0 - 91.142.141.255 ru +91.142.141.0 - 91.142.141.255 ru 91.142.142.0 - 91.142.142.255 tr 91.142.143.0 - 91.142.143.255 it 91.142.144.0 - 91.142.159.255 ru @@ -53365,7 +27556,11 @@ 91.148.0.0 - 91.148.63.255 sk 91.148.64.0 - 91.148.127.255 rs 91.148.128.0 - 91.148.191.255 bg -91.148.192.0 - 91.148.255.255 nl +91.148.192.0 - 91.148.197.129 nl +91.148.197.130 - 91.148.197.130 gb +91.148.197.131 - 91.148.207.255 nl +91.148.208.0 - 91.148.223.255 gb +91.148.224.0 - 91.148.255.255 nl 91.149.0.0 - 91.149.31.255 no 91.149.32.0 - 91.149.47.255 se 91.149.48.0 - 91.149.63.255 no @@ -53377,44 +27572,14 @@ 91.150.128.0 - 91.150.223.255 pl 91.150.224.0 - 91.150.255.255 dk 91.151.0.0 - 91.151.15.255 gb -91.151.16.0 - 91.151.31.255 it +91.151.16.0 - 91.151.31.255 de 91.151.32.0 - 91.151.47.255 ru 91.151.48.0 - 91.151.79.255 fr 91.151.80.0 - 91.151.95.255 tr 91.151.96.0 - 91.151.111.255 es 91.151.112.0 - 91.151.127.255 fr 91.151.128.0 - 91.151.143.255 ge -91.151.144.0 - 91.151.145.63 de -91.151.145.64 - 91.151.145.79 ao -91.151.145.80 - 91.151.145.111 sd -91.151.145.112 - 91.151.146.23 de -91.151.146.24 - 91.151.146.31 eg -91.151.146.32 - 91.151.146.39 so -91.151.146.40 - 91.151.146.47 de -91.151.146.48 - 91.151.146.51 cg -91.151.146.52 - 91.151.146.55 de -91.151.146.56 - 91.151.146.63 cg -91.151.146.64 - 91.151.146.95 de -91.151.146.96 - 91.151.146.111 so -91.151.146.112 - 91.151.154.255 de -91.151.155.0 - 91.151.155.31 so -91.151.155.32 - 91.151.155.63 lb -91.151.155.64 - 91.151.155.95 de -91.151.155.96 - 91.151.155.127 so -91.151.155.128 - 91.151.155.135 de -91.151.155.136 - 91.151.155.143 so -91.151.155.144 - 91.151.155.159 gn -91.151.155.160 - 91.151.155.175 ir -91.151.155.176 - 91.151.155.191 iq -91.151.155.192 - 91.151.155.255 so -91.151.156.0 - 91.151.158.255 de -91.151.159.0 - 91.151.159.15 lb -91.151.159.16 - 91.151.159.23 de -91.151.159.24 - 91.151.159.31 lb -91.151.159.32 - 91.151.159.47 de -91.151.159.48 - 91.151.159.63 ye -91.151.159.64 - 91.151.159.127 de -91.151.159.128 - 91.151.159.255 kw +91.151.144.0 - 91.151.159.255 de 91.151.160.0 - 91.151.175.255 sa 91.151.176.0 - 91.151.207.255 ru 91.151.208.0 - 91.151.223.255 gb @@ -53424,8 +27589,8 @@ 91.160.0.0 - 91.175.255.255 fr 91.176.0.0 - 91.183.255.255 be 91.184.0.0 - 91.184.31.255 nl -91.184.32.0 - 91.184.45.255 de -91.184.46.0 - 91.184.63.255 nl +91.184.32.0 - 91.184.47.255 de +91.184.48.0 - 91.184.63.255 nl 91.184.64.0 - 91.184.95.255 ir 91.184.96.0 - 91.184.127.255 ge 91.184.128.0 - 91.184.159.255 no @@ -53435,35 +27600,18 @@ 91.185.0.0 - 91.185.31.255 kz 91.185.32.0 - 91.185.95.255 ru 91.185.96.0 - 91.185.127.255 rs -91.185.128.0 - 91.185.159.255 be -91.185.160.0 - 91.185.183.7 de -91.185.183.8 - 91.185.183.15 it -91.185.183.16 - 91.185.183.23 es -91.185.183.24 - 91.185.183.31 ru -91.185.183.32 - 91.185.183.39 pl -91.185.183.40 - 91.185.183.47 gr -91.185.183.48 - 91.185.183.55 pt -91.185.183.56 - 91.185.183.63 gb -91.185.183.64 - 91.185.183.71 nl -91.185.183.72 - 91.185.183.255 fr -91.185.184.0 - 91.185.185.255 de -91.185.186.0 - 91.185.191.255 fr -91.185.192.0 - 91.185.207.223 si -91.185.207.224 - 91.185.207.231 bh -91.185.207.232 - 91.185.223.255 si +91.185.128.0 - 91.185.159.255 ir +91.185.160.0 - 91.185.183.255 gb +91.185.184.0 - 91.185.191.255 pl +91.185.192.0 - 91.185.223.255 si 91.185.224.0 - 91.185.255.255 ru 91.186.0.0 - 91.186.31.255 gb 91.186.32.0 - 91.186.63.255 de 91.186.64.0 - 91.186.95.255 no 91.186.96.0 - 91.186.127.255 ru 91.186.128.0 - 91.186.159.255 at -91.186.160.0 - 91.186.176.127 de -91.186.176.128 - 91.186.176.191 it -91.186.176.192 - 91.186.179.87 de -91.186.179.88 - 91.186.179.95 gb -91.186.179.96 - 91.186.183.199 de -91.186.183.200 - 91.186.183.207 fr -91.186.183.208 - 91.186.191.255 de +91.186.160.0 - 91.186.189.255 de +91.186.190.0 - 91.186.191.255 gb 91.186.192.0 - 91.186.223.255 ir 91.186.224.0 - 91.186.255.255 jo 91.187.0.0 - 91.187.31.255 by @@ -53474,55 +27622,14 @@ 91.187.160.0 - 91.187.191.255 lt 91.187.192.0 - 91.187.223.255 it 91.187.224.0 - 91.187.255.255 pl -91.188.0.0 - 91.188.0.159 it -91.188.0.160 - 91.188.0.167 us -91.188.0.168 - 91.188.3.31 it -91.188.3.32 - 91.188.3.47 gb -91.188.3.48 - 91.188.3.55 it -91.188.3.56 - 91.188.3.71 gb -91.188.3.72 - 91.188.3.79 it -91.188.3.80 - 91.188.3.143 gb -91.188.3.144 - 91.188.3.191 it -91.188.3.192 - 91.188.3.199 gb -91.188.3.200 - 91.188.3.207 it -91.188.3.208 - 91.188.3.255 gb -91.188.4.0 - 91.188.4.95 it -91.188.4.96 - 91.188.4.103 ly -91.188.4.104 - 91.188.4.111 it -91.188.4.112 - 91.188.4.119 ly -91.188.4.120 - 91.188.4.191 it -91.188.4.192 - 91.188.4.239 iq -91.188.4.240 - 91.188.4.255 it -91.188.5.0 - 91.188.5.255 a2 -91.188.6.0 - 91.188.6.255 it -91.188.7.0 - 91.188.7.7 ly -91.188.7.8 - 91.188.7.39 it -91.188.7.40 - 91.188.7.47 ly -91.188.7.48 - 91.188.7.95 it -91.188.7.96 - 91.188.7.111 ly -91.188.7.112 - 91.188.7.119 it -91.188.7.120 - 91.188.7.127 ly -91.188.7.128 - 91.188.11.23 it -91.188.11.24 - 91.188.11.31 tr -91.188.11.32 - 91.188.11.127 it -91.188.11.128 - 91.188.11.135 fr -91.188.11.136 - 91.188.11.143 it -91.188.11.144 - 91.188.11.159 fr -91.188.11.160 - 91.188.11.167 it -91.188.11.168 - 91.188.11.175 al -91.188.11.176 - 91.188.31.111 it -91.188.31.112 - 91.188.31.127 fr -91.188.31.128 - 91.188.31.151 it -91.188.31.152 - 91.188.31.159 de -91.188.31.160 - 91.188.31.255 it +91.188.0.0 - 91.188.31.255 it 91.188.32.0 - 91.188.63.255 lv 91.188.64.0 - 91.188.95.255 fr 91.188.96.0 - 91.188.127.255 pl 91.188.128.0 - 91.188.159.255 uz 91.188.160.0 - 91.188.191.255 ru -91.188.192.0 - 91.188.255.255 tr 91.189.0.0 - 91.189.7.255 pl -91.189.8.0 - 91.189.15.255 ch +91.189.8.0 - 91.189.15.255 ae 91.189.16.0 - 91.189.39.255 pl 91.189.40.0 - 91.189.47.255 se 91.189.48.0 - 91.189.55.255 ru @@ -53530,7 +27637,9 @@ 91.189.64.0 - 91.189.71.255 ie 91.189.72.0 - 91.189.79.255 pl 91.189.80.0 - 91.189.87.255 ru -91.189.88.0 - 91.189.95.255 gb +91.189.88.0 - 91.189.90.255 gb +91.189.91.0 - 91.189.91.255 us +91.189.92.0 - 91.189.95.255 gb 91.189.96.0 - 91.189.103.255 nl 91.189.104.0 - 91.189.111.255 fr 91.189.112.0 - 91.189.119.255 ru @@ -53541,7 +27650,6 @@ 91.189.152.0 - 91.189.159.255 ua 91.189.160.0 - 91.189.167.255 ru 91.189.168.0 - 91.189.183.255 no -91.189.184.0 - 91.189.191.255 ru 91.189.192.0 - 91.189.199.255 de 91.189.200.0 - 91.189.207.255 dk 91.189.208.0 - 91.189.215.255 fi @@ -53554,26 +27662,22 @@ 91.190.64.0 - 91.190.95.255 ru 91.190.96.0 - 91.190.111.255 nl 91.190.112.0 - 91.190.127.255 ru -91.190.128.0 - 91.190.129.255 cz -91.190.130.0 - 91.190.130.255 de -91.190.131.0 - 91.190.131.255 cz -91.190.132.0 - 91.190.132.255 de -91.190.133.0 - 91.190.135.255 cz +91.190.128.0 - 91.190.135.255 cz 91.190.136.0 - 91.190.143.255 se 91.190.144.0 - 91.190.159.255 de -91.190.160.0 - 91.190.160.255 gb -91.190.161.0 - 91.190.167.255 gg -91.190.168.0 - 91.190.171.255 fr -91.190.172.0 - 91.190.172.255 hk -91.190.173.0 - 91.190.173.255 cn -91.190.174.0 - 91.190.175.255 fr +91.190.160.0 - 91.190.160.255 gg +91.190.161.0 - 91.190.162.255 gb +91.190.163.0 - 91.190.163.255 gg +91.190.164.0 - 91.190.164.255 gb +91.190.165.0 - 91.190.166.255 gg +91.190.167.0 - 91.190.167.255 gb +91.190.168.0 - 91.190.175.255 fr +91.190.176.0 - 91.190.183.255 ru 91.190.184.0 - 91.190.191.255 hu 91.190.192.0 - 91.190.199.255 fi 91.190.200.0 - 91.190.207.255 de 91.190.208.0 - 91.190.215.255 be -91.190.216.0 - 91.190.217.255 lu -91.190.218.0 - 91.190.218.255 ie -91.190.219.0 - 91.190.223.255 lu +91.190.216.0 - 91.190.223.255 lu 91.190.224.0 - 91.190.231.255 de 91.190.232.0 - 91.190.239.255 ru 91.190.240.0 - 91.190.255.255 de @@ -53581,19 +27685,16 @@ 91.191.64.0 - 91.191.127.255 sk 91.191.128.0 - 91.191.143.255 se 91.191.144.0 - 91.191.159.255 fr -91.191.160.0 - 91.191.167.255 de -91.191.168.0 - 91.191.175.255 tr +91.191.160.0 - 91.191.175.255 tr 91.191.176.0 - 91.191.191.255 ru 91.191.192.0 - 91.191.207.255 az 91.191.208.0 - 91.191.223.255 bg 91.191.224.0 - 91.191.255.255 ru 91.192.0.0 - 91.192.3.255 pl -91.192.4.0 - 91.192.7.255 ua 91.192.8.0 - 91.192.11.255 nl 91.192.12.0 - 91.192.15.255 de 91.192.16.0 - 91.192.19.255 gb 91.192.20.0 - 91.192.23.255 ru -91.192.24.0 - 91.192.27.255 ua 91.192.28.0 - 91.192.31.255 se 91.192.32.0 - 91.192.35.255 cz 91.192.36.0 - 91.192.39.255 nl @@ -53607,12 +27708,11 @@ 91.192.68.0 - 91.192.75.255 ru 91.192.76.0 - 91.192.79.255 pl 91.192.80.0 - 91.192.83.255 ru -91.192.84.0 - 91.192.87.255 ua +91.192.84.0 - 91.192.87.255 cz 91.192.88.0 - 91.192.91.255 pl 91.192.92.0 - 91.192.99.255 ru 91.192.100.0 - 91.192.103.255 ch 91.192.104.0 - 91.192.105.255 ua -91.192.106.0 - 91.192.107.255 ee 91.192.108.0 - 91.192.111.255 es 91.192.112.0 - 91.192.115.255 se 91.192.116.0 - 91.192.119.255 nl @@ -53625,7 +27725,6 @@ 91.192.152.0 - 91.192.163.255 ua 91.192.164.0 - 91.192.167.255 pl 91.192.168.0 - 91.192.175.255 ru -91.192.176.0 - 91.192.179.255 pl 91.192.180.0 - 91.192.187.255 ua 91.192.188.0 - 91.192.191.255 ru 91.192.192.0 - 91.192.195.255 gb @@ -53644,10 +27743,8 @@ 91.192.248.0 - 91.192.251.255 pl 91.192.252.0 - 91.192.255.255 se 91.193.0.0 - 91.193.3.255 no -91.193.4.0 - 91.193.7.255 il 91.193.8.0 - 91.193.11.255 ua 91.193.12.0 - 91.193.15.255 pl -91.193.16.0 - 91.193.19.255 eu 91.193.20.0 - 91.193.23.255 ch 91.193.24.0 - 91.193.27.255 rs 91.193.28.0 - 91.193.31.255 ro @@ -53660,22 +27757,22 @@ 91.193.52.0 - 91.193.55.255 pl 91.193.56.0 - 91.193.57.255 fr 91.193.58.0 - 91.193.59.255 ru -91.193.60.0 - 91.193.63.255 ro 91.193.64.0 - 91.193.67.255 lv 91.193.68.0 - 91.193.71.255 ua -91.193.72.0 - 91.193.75.255 ru +91.193.72.0 - 91.193.72.255 de +91.193.73.0 - 91.193.73.255 pl +91.193.74.0 - 91.193.74.255 gi +91.193.75.0 - 91.193.75.255 rs 91.193.76.0 - 91.193.83.255 ua 91.193.84.0 - 91.193.87.255 pl 91.193.88.0 - 91.193.89.255 ru 91.193.90.0 - 91.193.91.255 pl 91.193.92.0 - 91.193.95.255 es -91.193.96.0 - 91.193.103.255 pl +91.193.96.0 - 91.193.99.255 pl 91.193.104.0 - 91.193.105.255 gb 91.193.106.0 - 91.193.107.255 fr 91.193.108.0 - 91.193.109.255 gb 91.193.110.0 - 91.193.111.255 ru -91.193.112.0 - 91.193.115.255 gr -91.193.116.0 - 91.193.119.255 ee 91.193.120.0 - 91.193.123.255 pl 91.193.124.0 - 91.193.131.255 ua 91.193.132.0 - 91.193.135.255 cz @@ -53683,37 +27780,32 @@ 91.193.140.0 - 91.193.143.255 ru 91.193.144.0 - 91.193.147.255 pl 91.193.148.0 - 91.193.151.255 ru -91.193.152.0 - 91.193.155.255 ua 91.193.156.0 - 91.193.159.255 bg 91.193.160.0 - 91.193.163.255 pl 91.193.164.0 - 91.193.167.255 ua 91.193.168.0 - 91.193.171.255 ru 91.193.172.0 - 91.193.175.255 ua 91.193.176.0 - 91.193.179.255 ru -91.193.180.0 - 91.193.183.255 gb 91.193.184.0 - 91.193.187.255 pl 91.193.188.0 - 91.193.191.255 ie -91.193.192.0 - 91.193.195.255 lv 91.193.196.0 - 91.193.199.255 pl 91.193.200.0 - 91.193.203.255 bg 91.193.204.0 - 91.193.207.255 ua 91.193.208.0 - 91.193.211.255 pl 91.193.212.0 - 91.193.231.255 ru -91.193.232.0 - 91.193.235.255 ua +91.193.232.0 - 91.193.235.255 gb 91.193.236.0 - 91.193.243.255 ru -91.193.244.0 - 91.193.251.255 gb +91.193.244.0 - 91.193.247.255 gb 91.193.252.0 - 91.193.255.255 ua -91.194.0.0 - 91.194.3.255 ru +91.194.2.0 - 91.194.3.255 ru 91.194.4.0 - 91.194.5.255 il 91.194.6.0 - 91.194.7.255 de 91.194.8.0 - 91.194.9.255 nl 91.194.10.0 - 91.194.13.255 ru -91.194.14.0 - 91.194.15.255 fr 91.194.16.0 - 91.194.17.255 ru 91.194.18.0 - 91.194.19.255 pl 91.194.20.0 - 91.194.21.255 fi 91.194.22.0 - 91.194.23.255 se -91.194.24.0 - 91.194.25.255 ru 91.194.26.0 - 91.194.27.255 se 91.194.28.0 - 91.194.31.255 ro 91.194.32.0 - 91.194.33.255 at @@ -53721,12 +27813,11 @@ 91.194.36.0 - 91.194.37.255 dk 91.194.38.0 - 91.194.39.255 se 91.194.40.0 - 91.194.41.255 ua -91.194.42.0 - 91.194.45.255 ro +91.194.42.0 - 91.194.43.255 gb +91.194.44.0 - 91.194.45.255 ro 91.194.46.0 - 91.194.47.255 gb 91.194.48.0 - 91.194.49.255 ch 91.194.50.0 - 91.194.51.255 ua -91.194.52.0 - 91.194.53.255 gb -91.194.54.0 - 91.194.55.255 ru 91.194.56.0 - 91.194.57.255 ua 91.194.58.0 - 91.194.59.255 ru 91.194.60.0 - 91.194.61.255 fr @@ -53747,16 +27838,13 @@ 91.194.94.0 - 91.194.95.255 dk 91.194.96.0 - 91.194.101.255 fr 91.194.102.0 - 91.194.103.255 kw -91.194.104.0 - 91.194.105.255 ru 91.194.106.0 - 91.194.107.255 pl 91.194.108.0 - 91.194.109.255 de 91.194.110.0 - 91.194.113.255 ru 91.194.114.0 - 91.194.115.255 il 91.194.116.0 - 91.194.117.255 gb -91.194.118.0 - 91.194.119.255 se 91.194.120.0 - 91.194.121.255 ru 91.194.122.0 - 91.194.123.255 pl -91.194.124.0 - 91.194.125.255 ua 91.194.126.0 - 91.194.127.255 gb 91.194.128.0 - 91.194.129.255 fr 91.194.130.0 - 91.194.131.255 kw @@ -53764,30 +27852,27 @@ 91.194.134.0 - 91.194.135.255 ua 91.194.136.0 - 91.194.137.255 nl 91.194.138.0 - 91.194.139.255 pl -91.194.140.0 - 91.194.141.255 cz 91.194.142.0 - 91.194.143.255 it 91.194.144.0 - 91.194.145.255 pl 91.194.146.0 - 91.194.147.255 ch 91.194.148.0 - 91.194.149.255 ro -91.194.150.0 - 91.194.151.255 dk -91.194.152.0 - 91.194.153.255 gb +91.194.150.0 - 91.194.153.255 gb 91.194.154.0 - 91.194.155.255 dk 91.194.156.0 - 91.194.157.255 pl 91.194.158.0 - 91.194.159.255 gb 91.194.160.0 - 91.194.161.255 ru 91.194.162.0 - 91.194.163.255 ua 91.194.164.0 - 91.194.165.255 ru -91.194.166.0 - 91.194.167.255 es 91.194.168.0 - 91.194.169.255 ua -91.194.170.0 - 91.194.171.255 gb 91.194.172.0 - 91.194.175.255 ru -91.194.176.0 - 91.194.177.255 ro +91.194.176.0 - 91.194.176.255 lv +91.194.177.0 - 91.194.177.255 ro 91.194.178.0 - 91.194.179.255 fr 91.194.180.0 - 91.194.181.255 de -91.194.182.0 - 91.194.185.255 ru +91.194.184.0 - 91.194.185.255 ru 91.194.186.0 - 91.194.187.255 se 91.194.188.0 - 91.194.189.255 pl -91.194.190.0 - 91.194.195.255 ru +91.194.190.0 - 91.194.191.255 ru 91.194.196.0 - 91.194.197.255 ch 91.194.198.0 - 91.194.199.255 pl 91.194.200.0 - 91.194.201.255 ru @@ -53797,7 +27882,6 @@ 91.194.208.0 - 91.194.209.255 fr 91.194.210.0 - 91.194.211.255 pl 91.194.212.0 - 91.194.213.255 ru -91.194.214.0 - 91.194.215.255 ua 91.194.216.0 - 91.194.217.255 rs 91.194.218.0 - 91.194.219.255 nl 91.194.220.0 - 91.194.221.255 gb @@ -53809,12 +27893,12 @@ 91.194.234.0 - 91.194.235.255 ro 91.194.236.0 - 91.194.237.255 be 91.194.238.0 - 91.194.239.255 ua -91.194.240.0 - 91.194.241.255 pl 91.194.242.0 - 91.194.243.255 hr 91.194.244.0 - 91.194.247.255 ru 91.194.248.0 - 91.194.249.255 at 91.194.250.0 - 91.194.251.255 ua -91.194.252.0 - 91.194.255.255 ru +91.194.252.0 - 91.194.253.255 ru +91.194.254.0 - 91.194.255.255 at 91.195.0.0 - 91.195.1.255 nl 91.195.2.0 - 91.195.3.255 ua 91.195.4.0 - 91.195.7.255 ro @@ -53836,19 +27920,16 @@ 91.195.40.0 - 91.195.41.255 at 91.195.42.0 - 91.195.43.255 pl 91.195.44.0 - 91.195.45.255 ro -91.195.46.0 - 91.195.47.255 gb +91.195.46.0 - 91.195.47.255 pl 91.195.48.0 - 91.195.49.255 de -91.195.50.0 - 91.195.51.255 ru 91.195.52.0 - 91.195.53.255 ua 91.195.54.0 - 91.195.55.255 de 91.195.56.0 - 91.195.57.255 pl 91.195.58.0 - 91.195.59.255 dk 91.195.60.0 - 91.195.61.255 ru 91.195.62.0 - 91.195.63.255 ro -91.195.64.0 - 91.195.65.255 ru -91.195.66.0 - 91.195.67.255 ro 91.195.68.0 - 91.195.69.255 ua -91.195.70.0 - 91.195.71.255 gr +91.195.70.0 - 91.195.71.255 gb 91.195.72.0 - 91.195.73.255 fr 91.195.74.0 - 91.195.75.255 ua 91.195.76.0 - 91.195.77.255 se @@ -53883,7 +27964,7 @@ 91.195.144.0 - 91.195.145.255 ro 91.195.146.0 - 91.195.147.255 si 91.195.148.0 - 91.195.149.255 ru -91.195.150.0 - 91.195.151.255 ch +91.195.150.0 - 91.195.151.255 de 91.195.152.0 - 91.195.153.255 gr 91.195.154.0 - 91.195.155.255 se 91.195.156.0 - 91.195.157.255 ua @@ -53895,7 +27976,6 @@ 91.195.168.0 - 91.195.169.255 gb 91.195.170.0 - 91.195.171.255 ru 91.195.172.0 - 91.195.173.255 ua -91.195.174.0 - 91.195.175.255 es 91.195.176.0 - 91.195.177.255 rs 91.195.178.0 - 91.195.179.255 ru 91.195.180.0 - 91.195.181.255 ro @@ -53912,11 +27992,9 @@ 91.195.204.0 - 91.195.205.255 ru 91.195.206.0 - 91.195.207.255 fr 91.195.208.0 - 91.195.211.255 ru -91.195.212.0 - 91.195.213.255 gb 91.195.214.0 - 91.195.215.255 ua 91.195.216.0 - 91.195.217.255 ro 91.195.218.0 - 91.195.221.255 de -91.195.222.0 - 91.195.223.255 ru 91.195.224.0 - 91.195.225.255 se 91.195.226.0 - 91.195.227.255 kz 91.195.228.0 - 91.195.229.255 gb @@ -53934,20 +28012,16 @@ 91.196.0.0 - 91.196.3.255 ua 91.196.4.0 - 91.196.7.255 ru 91.196.8.0 - 91.196.15.255 pl -91.196.16.0 - 91.196.19.255 lv 91.196.20.0 - 91.196.23.255 gb 91.196.24.0 - 91.196.27.255 ru 91.196.28.0 - 91.196.31.255 pl 91.196.32.0 - 91.196.35.255 ru 91.196.36.0 - 91.196.39.255 am -91.196.40.0 - 91.196.43.255 ru 91.196.44.0 - 91.196.47.255 ro 91.196.48.0 - 91.196.51.255 pl 91.196.52.0 - 91.196.55.255 ua 91.196.56.0 - 91.196.59.255 pl 91.196.60.0 - 91.196.63.255 ua -91.196.64.0 - 91.196.67.255 bg -91.196.68.0 - 91.196.71.255 gb 91.196.72.0 - 91.196.75.255 ru 91.196.76.0 - 91.196.79.255 uz 91.196.80.0 - 91.196.83.255 ua @@ -53960,7 +28034,7 @@ 91.196.120.0 - 91.196.123.255 ua 91.196.124.0 - 91.196.127.255 bg 91.196.128.0 - 91.196.131.255 es -91.196.132.0 - 91.196.135.255 ua +91.196.132.0 - 91.196.135.255 de 91.196.136.0 - 91.196.139.255 ru 91.196.140.0 - 91.196.147.255 de 91.196.148.0 - 91.196.151.255 ua @@ -53969,21 +28043,18 @@ 91.196.168.0 - 91.196.171.255 nl 91.196.172.0 - 91.196.175.255 dk 91.196.176.0 - 91.196.179.255 ua -91.196.180.0 - 91.196.183.255 fr 91.196.184.0 - 91.196.187.255 gb 91.196.188.0 - 91.196.191.255 ru -91.196.192.0 - 91.196.203.255 ua +91.196.192.0 - 91.196.199.255 ua 91.196.204.0 - 91.196.207.255 de 91.196.208.0 - 91.196.211.255 ru 91.196.212.0 - 91.196.215.255 pl 91.196.216.0 - 91.196.219.255 ru -91.196.220.0 - 91.196.223.255 ua 91.196.224.0 - 91.196.227.255 bg 91.196.228.0 - 91.196.231.255 ua -91.196.232.0 - 91.196.235.255 cn 91.196.236.0 - 91.196.239.255 ru 91.196.240.0 - 91.196.243.255 se -91.196.244.0 - 91.197.3.255 ru +91.196.244.0 - 91.196.255.255 ru 91.197.4.0 - 91.197.7.255 ua 91.197.8.0 - 91.197.11.255 ru 91.197.12.0 - 91.197.15.255 pl @@ -53992,13 +28063,14 @@ 91.197.24.0 - 91.197.27.255 ua 91.197.28.0 - 91.197.31.255 de 91.197.32.0 - 91.197.35.255 gb -91.197.36.0 - 91.197.39.255 ie -91.197.40.0 - 91.197.43.255 ru -91.197.44.0 - 91.197.51.255 ua +91.197.44.0 - 91.197.45.255 cy +91.197.46.0 - 91.197.47.255 lb +91.197.48.0 - 91.197.51.255 ua 91.197.52.0 - 91.197.55.255 ru 91.197.56.0 - 91.197.59.255 ua 91.197.60.0 - 91.197.63.255 il -91.197.64.0 - 91.197.71.255 ru +91.197.64.0 - 91.197.67.255 ru +91.197.68.0 - 91.197.71.255 ua 91.197.72.0 - 91.197.75.255 nl 91.197.76.0 - 91.197.79.255 ru 91.197.80.0 - 91.197.83.255 ua @@ -54011,7 +28083,6 @@ 91.197.108.0 - 91.197.111.255 be 91.197.112.0 - 91.197.115.255 ru 91.197.116.0 - 91.197.119.255 cz -91.197.120.0 - 91.197.123.255 ua 91.197.124.0 - 91.197.127.255 ru 91.197.128.0 - 91.197.135.255 ua 91.197.136.0 - 91.197.139.255 fr @@ -54024,9 +28095,7 @@ 91.197.168.0 - 91.197.171.255 ua 91.197.172.0 - 91.197.183.255 ru 91.197.184.0 - 91.197.187.255 ua -91.197.188.0 - 91.197.199.255 ru -91.197.200.0 - 91.197.203.255 sa -91.197.204.0 - 91.197.207.255 ru +91.197.188.0 - 91.197.207.255 ru 91.197.208.0 - 91.197.211.255 fi 91.197.212.0 - 91.197.215.255 ru 91.197.216.0 - 91.197.223.255 ua @@ -54034,7 +28103,6 @@ 91.197.228.0 - 91.197.231.255 gb 91.197.232.0 - 91.197.235.255 ru 91.197.236.0 - 91.197.239.255 ua -91.197.240.0 - 91.197.243.255 ge 91.197.244.0 - 91.197.247.255 ro 91.197.248.0 - 91.197.251.255 dk 91.197.252.0 - 91.197.255.255 ua @@ -54055,7 +28123,8 @@ 91.198.15.0 - 91.198.16.255 pl 91.198.17.0 - 91.198.17.255 lt 91.198.18.0 - 91.198.18.255 gb -91.198.20.0 - 91.198.20.255 ua +91.198.19.0 - 91.198.19.255 ae +91.198.20.0 - 91.198.20.255 pl 91.198.21.0 - 91.198.21.255 de 91.198.22.0 - 91.198.22.255 gb 91.198.23.0 - 91.198.23.255 ro @@ -54063,7 +28132,6 @@ 91.198.25.0 - 91.198.25.255 at 91.198.26.0 - 91.198.26.255 be 91.198.27.0 - 91.198.27.255 nl -91.198.28.0 - 91.198.28.255 tr 91.198.29.0 - 91.198.29.255 gb 91.198.30.0 - 91.198.30.255 fr 91.198.31.0 - 91.198.31.255 ua @@ -54072,18 +28140,14 @@ 91.198.34.0 - 91.198.34.255 ua 91.198.35.0 - 91.198.35.255 de 91.198.36.0 - 91.198.36.255 ua -91.198.37.0 - 91.198.37.255 nl -91.198.38.0 - 91.198.38.255 ru -91.198.39.0 - 91.198.39.255 ro +91.198.38.0 - 91.198.39.255 ru 91.198.40.0 - 91.198.40.255 ua -91.198.41.0 - 91.198.41.255 fr 91.198.42.0 - 91.198.42.255 dk 91.198.43.0 - 91.198.43.255 de 91.198.44.0 - 91.198.44.255 fr 91.198.45.0 - 91.198.45.255 at 91.198.46.0 - 91.198.46.255 ru 91.198.47.0 - 91.198.47.255 pt -91.198.48.0 - 91.198.48.255 se 91.198.49.0 - 91.198.49.255 tr 91.198.50.0 - 91.198.50.255 ua 91.198.51.0 - 91.198.51.255 ru @@ -54108,7 +28172,6 @@ 91.198.74.0 - 91.198.74.255 pl 91.198.75.0 - 91.198.75.255 ru 91.198.76.0 - 91.198.76.255 pl -91.198.77.0 - 91.198.77.255 gb 91.198.78.0 - 91.198.78.255 de 91.198.79.0 - 91.198.79.255 ch 91.198.80.0 - 91.198.80.255 pl @@ -54117,12 +28180,12 @@ 91.198.83.0 - 91.198.83.255 ua 91.198.84.0 - 91.198.84.255 it 91.198.85.0 - 91.198.85.255 ru -91.198.86.0 - 91.198.86.255 ua +91.198.86.0 - 91.198.86.255 de 91.198.87.0 - 91.198.87.255 nl 91.198.88.0 - 91.198.88.255 fr 91.198.89.0 - 91.198.89.255 pl 91.198.90.0 - 91.198.90.255 pt -91.198.91.0 - 91.198.91.255 ru +91.198.91.0 - 91.198.91.255 lv 91.198.92.0 - 91.198.92.255 se 91.198.93.0 - 91.198.93.255 at 91.198.94.0 - 91.198.94.255 pl @@ -54139,12 +28202,9 @@ 91.198.105.0 - 91.198.105.255 fr 91.198.106.0 - 91.198.106.255 nl 91.198.107.0 - 91.198.107.255 gb -91.198.108.0 - 91.198.108.255 gr -91.198.109.0 - 91.198.109.255 kz 91.198.110.0 - 91.198.111.255 pl 91.198.112.0 - 91.198.112.255 si 91.198.113.0 - 91.198.114.255 de -91.198.115.0 - 91.198.115.255 fr 91.198.116.0 - 91.198.116.255 ua 91.198.117.0 - 91.198.117.255 dk 91.198.118.0 - 91.198.118.255 pl @@ -54152,8 +28212,8 @@ 91.198.120.0 - 91.198.120.255 fi 91.198.121.0 - 91.198.121.255 pl 91.198.122.0 - 91.198.122.255 fr -91.198.123.0 - 91.198.123.255 no -91.198.124.0 - 91.198.125.255 tr +91.198.124.0 - 91.198.124.255 tr +91.198.125.0 - 91.198.125.255 fr 91.198.126.0 - 91.198.126.255 be 91.198.127.0 - 91.198.127.255 ru 91.198.128.0 - 91.198.128.255 at @@ -54163,8 +28223,9 @@ 91.198.132.0 - 91.198.132.255 bg 91.198.133.0 - 91.198.133.255 ua 91.198.134.0 - 91.198.134.255 kw -91.198.135.0 - 91.198.135.255 ru +91.198.135.0 - 91.198.135.255 se 91.198.136.0 - 91.198.136.255 ro +91.198.137.0 - 91.198.137.255 de 91.198.138.0 - 91.198.138.255 dk 91.198.139.0 - 91.198.139.255 de 91.198.140.0 - 91.198.140.255 ua @@ -54173,7 +28234,6 @@ 91.198.143.0 - 91.198.143.255 ua 91.198.144.0 - 91.198.144.255 dk 91.198.145.0 - 91.198.146.255 pl -91.198.147.0 - 91.198.147.255 ro 91.198.148.0 - 91.198.148.255 at 91.198.149.0 - 91.198.149.255 ru 91.198.150.0 - 91.198.150.255 pl @@ -54184,18 +28244,16 @@ 91.198.155.0 - 91.198.155.255 ru 91.198.156.0 - 91.198.156.255 lv 91.198.157.0 - 91.198.157.255 de -91.198.158.0 - 91.198.158.255 gr 91.198.159.0 - 91.198.159.255 fr 91.198.160.0 - 91.198.160.255 ro -91.198.161.0 - 91.198.161.255 hr +91.198.161.0 - 91.198.161.255 pl 91.198.162.0 - 91.198.162.255 ro 91.198.163.0 - 91.198.163.255 de 91.198.164.0 - 91.198.164.255 se 91.198.165.0 - 91.198.165.255 gb 91.198.166.0 - 91.198.166.255 gi -91.198.167.0 - 91.198.167.255 ch 91.198.168.0 - 91.198.169.255 dk -91.198.170.0 - 91.198.171.255 ru +91.198.171.0 - 91.198.171.255 ru 91.198.172.0 - 91.198.172.255 dk 91.198.173.0 - 91.198.173.255 ch 91.198.174.0 - 91.198.174.255 nl @@ -54209,18 +28267,15 @@ 91.198.182.0 - 91.198.182.255 pt 91.198.183.0 - 91.198.183.255 gr 91.198.184.0 - 91.198.184.255 ru -91.198.185.0 - 91.198.185.255 tr 91.198.186.0 - 91.198.186.255 pl 91.198.187.0 - 91.198.187.255 de 91.198.188.0 - 91.198.188.255 ua -91.198.189.0 - 91.198.189.255 at +91.198.189.0 - 91.198.189.255 de 91.198.190.0 - 91.198.190.255 si 91.198.191.0 - 91.198.191.255 fr -91.198.192.0 - 91.198.192.255 de 91.198.193.0 - 91.198.193.255 se 91.198.194.0 - 91.198.194.255 pl 91.198.195.0 - 91.198.195.255 at -91.198.196.0 - 91.198.196.255 ro 91.198.197.0 - 91.198.197.255 de 91.198.198.0 - 91.198.198.255 hu 91.198.199.0 - 91.198.200.255 fr @@ -54231,18 +28286,13 @@ 91.198.205.0 - 91.198.205.255 il 91.198.206.0 - 91.198.206.255 ee 91.198.207.0 - 91.198.207.255 mt -91.198.208.0 - 91.198.209.255 pl -91.198.210.0 - 91.198.210.255 de +91.198.209.0 - 91.198.209.255 pl 91.198.211.0 - 91.198.211.255 be -91.198.212.0 - 91.198.212.255 ru -91.198.213.0 - 91.198.213.255 gb +91.198.212.0 - 91.198.213.255 ru 91.198.214.0 - 91.198.214.255 si -91.198.215.0 - 91.198.215.255 ua 91.198.216.0 - 91.198.216.255 hr 91.198.217.0 - 91.198.217.255 pl -91.198.218.0 - 91.198.218.255 nl 91.198.219.0 - 91.198.219.255 ba -91.198.220.0 - 91.198.220.255 dk 91.198.221.0 - 91.198.221.255 ru 91.198.222.0 - 91.198.222.255 pl 91.198.223.0 - 91.198.223.255 se @@ -54252,7 +28302,6 @@ 91.198.227.0 - 91.198.227.255 dk 91.198.228.0 - 91.198.228.255 de 91.198.229.0 - 91.198.229.255 ch -91.198.230.0 - 91.198.230.255 pl 91.198.231.0 - 91.198.231.255 ru 91.198.232.0 - 91.198.232.255 pl 91.198.233.0 - 91.198.233.255 ua @@ -54264,7 +28313,7 @@ 91.198.239.0 - 91.198.239.255 pt 91.198.240.0 - 91.198.240.255 at 91.198.241.0 - 91.198.241.255 gb -91.198.242.0 - 91.198.242.255 ro +91.198.242.0 - 91.198.242.255 de 91.198.243.0 - 91.198.243.255 be 91.198.244.0 - 91.198.244.255 gb 91.198.245.0 - 91.198.246.255 pl @@ -54275,17 +28324,16 @@ 91.198.251.0 - 91.198.251.255 sa 91.198.252.0 - 91.198.252.255 dk 91.198.253.0 - 91.198.253.255 de -91.198.254.0 - 91.198.254.255 il 91.198.255.0 - 91.198.255.255 gb 91.199.0.0 - 91.199.0.255 fr 91.199.1.0 - 91.199.1.255 gb 91.199.2.0 - 91.199.2.255 it -91.199.3.0 - 91.199.4.255 be +91.199.3.0 - 91.199.3.255 be +91.199.4.0 - 91.199.4.255 ru 91.199.5.0 - 91.199.5.255 at 91.199.6.0 - 91.199.6.255 fr 91.199.7.0 - 91.199.7.255 gr 91.199.8.0 - 91.199.8.255 de -91.199.9.0 - 91.199.9.255 fr 91.199.10.0 - 91.199.10.255 ru 91.199.11.0 - 91.199.11.255 fr 91.199.12.0 - 91.199.12.255 pl @@ -54294,21 +28342,17 @@ 91.199.15.0 - 91.199.15.255 be 91.199.16.0 - 91.199.16.255 ru 91.199.17.0 - 91.199.17.255 rs -91.199.18.0 - 91.199.18.255 ru 91.199.19.0 - 91.199.19.255 gb 91.199.20.0 - 91.199.20.255 kz 91.199.21.0 - 91.199.21.255 de 91.199.22.0 - 91.199.22.255 pl 91.199.23.0 - 91.199.23.255 si -91.199.24.0 - 91.199.24.255 ru +91.199.24.0 - 91.199.24.255 gb 91.199.25.0 - 91.199.25.255 pl 91.199.26.0 - 91.199.26.255 ru -91.199.27.0 - 91.199.27.255 ch 91.199.28.0 - 91.199.28.255 ua 91.199.29.0 - 91.199.29.255 il -91.199.30.0 - 91.199.30.255 pl 91.199.31.0 - 91.199.31.255 sk -91.199.32.0 - 91.199.32.255 hu 91.199.33.0 - 91.199.33.255 ua 91.199.34.0 - 91.199.34.255 ru 91.199.35.0 - 91.199.35.255 ua @@ -54318,12 +28362,9 @@ 91.199.39.0 - 91.199.39.255 lb 91.199.40.0 - 91.199.40.255 ru 91.199.41.0 - 91.199.41.255 ro -91.199.42.0 - 91.199.42.255 gb 91.199.43.0 - 91.199.43.255 ch -91.199.44.0 - 91.199.44.255 pl 91.199.45.0 - 91.199.45.255 nl 91.199.46.0 - 91.199.46.255 ru -91.199.47.0 - 91.199.47.255 at 91.199.48.0 - 91.199.48.255 pl 91.199.49.0 - 91.199.49.255 ro 91.199.50.0 - 91.199.50.255 nl @@ -54355,16 +28396,13 @@ 91.199.77.0 - 91.199.77.255 hr 91.199.78.0 - 91.199.78.255 gb 91.199.79.0 - 91.199.79.255 hr -91.199.80.0 - 91.199.81.255 ru -91.199.82.0 - 91.199.82.255 ua +91.199.80.0 - 91.199.80.255 ru 91.199.83.0 - 91.199.83.255 de 91.199.84.0 - 91.199.84.255 nl 91.199.85.0 - 91.199.85.255 ch 91.199.86.0 - 91.199.86.255 lv -91.199.87.0 - 91.199.87.255 pl 91.199.88.0 - 91.199.88.255 de 91.199.89.0 - 91.199.89.255 pl -91.199.90.0 - 91.199.90.255 ru 91.199.91.0 - 91.199.93.255 ua 91.199.94.0 - 91.199.94.255 il 91.199.95.0 - 91.199.95.255 pl @@ -54373,17 +28411,15 @@ 91.199.98.0 - 91.199.98.255 ch 91.199.99.0 - 91.199.100.255 il 91.199.101.0 - 91.199.101.255 pl -91.199.102.0 - 91.199.102.255 dk 91.199.103.0 - 91.199.103.255 fr 91.199.104.0 - 91.199.104.255 ro 91.199.105.0 - 91.199.105.255 pl 91.199.106.0 - 91.199.106.255 ua 91.199.107.0 - 91.199.107.255 sa -91.199.108.0 - 91.199.108.255 nl 91.199.109.0 - 91.199.109.255 mc 91.199.110.0 - 91.199.110.255 gb 91.199.111.0 - 91.199.111.255 tr -91.199.112.0 - 91.199.112.255 cy +91.199.112.0 - 91.199.112.255 ua 91.199.113.0 - 91.199.113.255 dk 91.199.114.0 - 91.199.114.255 ru 91.199.115.0 - 91.199.115.255 ua @@ -54394,7 +28430,6 @@ 91.199.120.0 - 91.199.120.255 es 91.199.121.0 - 91.199.121.255 dk 91.199.122.0 - 91.199.122.255 es -91.199.123.0 - 91.199.123.255 ro 91.199.124.0 - 91.199.124.255 si 91.199.125.0 - 91.199.125.255 gb 91.199.126.0 - 91.199.126.255 lv @@ -54414,7 +28449,6 @@ 91.199.143.0 - 91.199.144.255 ua 91.199.145.0 - 91.199.145.255 at 91.199.146.0 - 91.199.146.255 ch -91.199.147.0 - 91.199.147.255 ru 91.199.148.0 - 91.199.148.255 fi 91.199.149.0 - 91.199.149.255 ru 91.199.150.0 - 91.199.150.255 bg @@ -54424,33 +28458,27 @@ 91.199.154.0 - 91.199.154.255 gb 91.199.155.0 - 91.199.155.255 hu 91.199.156.0 - 91.199.156.255 ru -91.199.157.0 - 91.199.157.255 eu +91.199.157.0 - 91.199.157.255 gb 91.199.158.0 - 91.199.158.255 de 91.199.159.0 - 91.199.159.255 gb -91.199.160.0 - 91.199.160.255 eu 91.199.161.0 - 91.199.161.255 si 91.199.162.0 - 91.199.162.255 de -91.199.163.0 - 91.199.163.255 ua 91.199.164.0 - 91.199.164.255 cz 91.199.165.0 - 91.199.165.255 de 91.199.166.0 - 91.199.166.255 tr 91.199.167.0 - 91.199.167.255 nl -91.199.168.0 - 91.199.168.255 cz 91.199.169.0 - 91.199.169.255 de -91.199.170.0 - 91.199.170.255 se +91.199.170.0 - 91.199.170.255 it 91.199.171.0 - 91.199.171.255 ru -91.199.172.0 - 91.199.172.255 ch 91.199.173.0 - 91.199.173.255 it 91.199.174.0 - 91.199.174.255 ru 91.199.175.0 - 91.199.175.255 at 91.199.176.0 - 91.199.176.255 pl 91.199.177.0 - 91.199.177.255 nl 91.199.178.0 - 91.199.178.255 ru -91.199.179.0 - 91.199.179.255 nl 91.199.180.0 - 91.199.181.255 gb 91.199.182.0 - 91.199.182.255 ua 91.199.183.0 - 91.199.183.255 gb -91.199.184.0 - 91.199.185.255 ru 91.199.186.0 - 91.199.186.255 ch 91.199.187.0 - 91.199.187.255 sa 91.199.188.0 - 91.199.188.255 ua @@ -54458,7 +28486,6 @@ 91.199.190.0 - 91.199.190.255 dk 91.199.191.0 - 91.199.191.255 tr 91.199.192.0 - 91.199.192.255 de -91.199.193.0 - 91.199.193.255 pl 91.199.194.0 - 91.199.194.255 ua 91.199.195.0 - 91.199.195.255 no 91.199.196.0 - 91.199.197.255 ru @@ -54466,7 +28493,7 @@ 91.199.199.0 - 91.199.199.255 ro 91.199.200.0 - 91.199.200.255 at 91.199.201.0 - 91.199.201.255 si -91.199.202.0 - 91.199.202.255 vg +91.199.202.0 - 91.199.202.255 il 91.199.203.0 - 91.199.203.255 pl 91.199.204.0 - 91.199.204.255 es 91.199.205.0 - 91.199.205.255 ru @@ -54475,7 +28502,6 @@ 91.199.208.0 - 91.199.208.255 dk 91.199.209.0 - 91.199.209.255 de 91.199.210.0 - 91.199.210.255 ro -91.199.211.0 - 91.199.211.255 ru 91.199.212.0 - 91.199.212.255 gb 91.199.213.0 - 91.199.213.255 ie 91.199.214.0 - 91.199.214.255 de @@ -54492,7 +28518,8 @@ 91.199.226.0 - 91.199.226.255 am 91.199.227.0 - 91.199.227.255 be 91.199.228.0 - 91.199.228.255 ch -91.199.229.0 - 91.199.230.255 ru +91.199.229.0 - 91.199.229.255 ru +91.199.230.0 - 91.199.230.255 es 91.199.231.0 - 91.199.231.255 mk 91.199.232.0 - 91.199.232.255 ru 91.199.233.0 - 91.199.234.255 fr @@ -54509,7 +28536,6 @@ 91.199.245.0 - 91.199.245.255 ua 91.199.246.0 - 91.199.246.255 pl 91.199.247.0 - 91.199.247.255 de -91.199.248.0 - 91.199.248.255 ru 91.199.249.0 - 91.199.249.255 gb 91.199.250.0 - 91.199.250.255 pl 91.199.251.0 - 91.199.251.255 ru @@ -54524,37 +28550,37 @@ 91.200.32.0 - 91.200.39.255 pl 91.200.40.0 - 91.200.47.255 ua 91.200.48.0 - 91.200.51.255 nl -91.200.52.0 - 91.200.59.255 ua -91.200.60.0 - 91.200.63.255 ru +91.200.52.0 - 91.200.60.255 ua +91.200.61.0 - 91.200.61.255 gb +91.200.62.0 - 91.200.63.255 ru 91.200.64.0 - 91.200.67.255 lv 91.200.68.0 - 91.200.71.255 pl 91.200.72.0 - 91.200.75.255 ua 91.200.76.0 - 91.200.79.255 pl -91.200.80.0 - 91.200.83.255 ua +91.200.80.0 - 91.200.82.255 ua +91.200.83.0 - 91.200.83.127 us +91.200.83.128 - 91.200.83.255 ua 91.200.84.0 - 91.200.87.255 ru -91.200.88.0 - 91.200.91.255 ua 91.200.92.0 - 91.200.95.255 pl 91.200.96.0 - 91.200.99.255 ro -91.200.100.0 - 91.200.103.255 de +91.200.104.0 - 91.200.107.255 pl 91.200.108.0 - 91.200.111.255 de 91.200.112.0 - 91.200.115.255 ua 91.200.116.0 - 91.200.119.255 es 91.200.120.0 - 91.200.123.255 ro 91.200.124.0 - 91.200.127.255 ua 91.200.128.0 - 91.200.131.255 it -91.200.132.0 - 91.200.139.255 ua +91.200.132.0 - 91.200.135.255 ro +91.200.136.0 - 91.200.139.255 ru 91.200.140.0 - 91.200.143.255 es 91.200.144.0 - 91.200.147.255 il -91.200.148.0 - 91.200.151.255 es 91.200.152.0 - 91.200.155.255 se 91.200.156.0 - 91.200.163.255 ua -91.200.164.0 - 91.200.167.255 md +91.200.164.0 - 91.200.167.255 ru 91.200.168.0 - 91.200.171.255 es 91.200.172.0 - 91.200.175.255 pl -91.200.176.0 - 91.200.179.255 eu 91.200.180.0 - 91.200.183.255 ua 91.200.184.0 - 91.200.187.255 pl -91.200.188.0 - 91.200.191.255 ua 91.200.192.0 - 91.200.195.255 rs 91.200.196.0 - 91.200.199.255 mt 91.200.200.0 - 91.200.203.255 ua @@ -54566,22 +28592,20 @@ 91.200.224.0 - 91.200.231.255 ru 91.200.232.0 - 91.200.235.255 ua 91.200.236.0 - 91.200.239.255 pl -91.200.240.0 - 91.200.243.255 eu -91.200.244.0 - 91.200.255.255 ua +91.200.248.0 - 91.200.251.255 ua +91.200.252.0 - 91.200.255.255 cz 91.201.0.0 - 91.201.3.255 ru -91.201.4.0 - 91.201.7.255 eu 91.201.8.0 - 91.201.11.255 ru 91.201.12.0 - 91.201.15.255 lv 91.201.16.0 - 91.201.19.255 pl 91.201.20.0 - 91.201.23.255 cz -91.201.24.0 - 91.201.31.255 ua -91.201.32.0 - 91.201.35.255 eu -91.201.36.0 - 91.201.43.255 ua +91.201.24.0 - 91.201.27.255 ua +91.201.36.0 - 91.201.39.255 ua +91.201.40.0 - 91.201.43.255 ru 91.201.44.0 - 91.201.47.255 pl 91.201.48.0 - 91.201.55.255 ru 91.201.56.0 - 91.201.59.255 ch 91.201.60.0 - 91.201.63.255 se -91.201.64.0 - 91.201.67.255 ru 91.201.68.0 - 91.201.71.255 ua 91.201.72.0 - 91.201.75.255 ru 91.201.76.0 - 91.201.83.255 ro @@ -54590,15 +28614,12 @@ 91.201.92.0 - 91.201.95.255 se 91.201.96.0 - 91.201.99.255 ru 91.201.100.0 - 91.201.103.255 de -91.201.104.0 - 91.201.107.255 ru 91.201.108.0 - 91.201.111.255 ua 91.201.112.0 - 91.201.119.255 ru 91.201.120.0 - 91.201.123.255 pl -91.201.124.0 - 91.201.127.255 ua 91.201.128.0 - 91.201.131.255 de 91.201.132.0 - 91.201.135.255 es 91.201.136.0 - 91.201.139.255 rs -91.201.140.0 - 91.201.143.255 lv 91.201.144.0 - 91.201.147.255 ua 91.201.148.0 - 91.201.151.255 ch 91.201.152.0 - 91.201.155.255 pl @@ -54608,24 +28629,27 @@ 91.201.168.0 - 91.201.171.255 ua 91.201.172.0 - 91.201.175.255 bg 91.201.176.0 - 91.201.183.255 ua -91.201.184.0 - 91.201.187.255 ru +91.201.184.0 - 91.201.187.255 je 91.201.188.0 - 91.201.191.255 ua 91.201.192.0 - 91.201.195.255 ro -91.201.196.0 - 91.201.199.255 md +91.201.200.0 - 91.201.200.255 gb +91.201.201.0 - 91.201.201.255 ru 91.201.202.0 - 91.201.203.255 ua 91.201.204.0 - 91.201.211.255 ru -91.201.212.0 - 91.201.215.255 ua +91.201.212.0 - 91.201.213.255 ch +91.201.214.0 - 91.201.215.255 kz 91.201.216.0 - 91.201.223.255 ro 91.201.224.0 - 91.201.227.255 ua 91.201.228.0 - 91.201.231.255 ru -91.201.232.0 - 91.201.247.255 ua +91.201.232.0 - 91.201.236.255 ua +91.201.237.0 - 91.201.239.255 ru +91.201.240.0 - 91.201.247.255 ua 91.201.248.0 - 91.201.255.255 ru 91.202.0.0 - 91.202.3.255 ua 91.202.4.0 - 91.202.7.255 ru 91.202.8.0 - 91.202.11.255 ua -91.202.12.0 - 91.202.27.255 ru -91.202.28.0 - 91.202.31.255 gb -91.202.32.0 - 91.202.39.255 ru +91.202.12.0 - 91.202.31.255 ru +91.202.36.0 - 91.202.39.255 ru 91.202.40.0 - 91.202.43.255 de 91.202.44.0 - 91.202.47.255 ru 91.202.48.0 - 91.202.51.255 de @@ -54659,17 +28683,14 @@ 91.202.172.0 - 91.202.179.255 pl 91.202.180.0 - 91.202.191.255 ru 91.202.192.0 - 91.202.195.255 pl -91.202.196.0 - 91.202.199.255 ru -91.202.200.0 - 91.202.203.255 kr -91.202.204.0 - 91.202.207.255 ru +91.202.196.0 - 91.202.207.255 ru 91.202.208.0 - 91.202.215.255 ua 91.202.216.0 - 91.202.223.255 ru 91.202.224.0 - 91.202.227.255 gb 91.202.228.0 - 91.202.231.255 pl 91.202.232.0 - 91.202.235.255 ru 91.202.236.0 - 91.202.239.255 gb -91.202.240.0 - 91.202.247.255 ua -91.202.248.0 - 91.202.251.255 es +91.202.240.0 - 91.202.243.255 ua 91.202.252.0 - 91.203.3.255 ru 91.203.4.0 - 91.203.7.255 ua 91.203.8.0 - 91.203.11.255 ru @@ -54689,13 +28710,11 @@ 91.203.64.0 - 91.203.67.255 ru 91.203.68.0 - 91.203.71.255 lv 91.203.72.0 - 91.203.75.255 gb -91.203.76.0 - 91.203.79.255 ua 91.203.80.0 - 91.203.87.255 ru -91.203.88.0 - 91.203.92.36 ua -91.203.92.37 - 91.203.92.46 md -91.203.92.47 - 91.203.95.255 ua -91.203.96.0 - 91.203.99.255 no -91.203.100.0 - 91.203.103.255 nl +91.203.88.0 - 91.203.91.255 ua +91.203.96.0 - 91.203.97.127 eu +91.203.97.128 - 91.203.97.255 no +91.203.98.0 - 91.203.99.255 eu 91.203.104.0 - 91.203.104.255 pl 91.203.105.0 - 91.203.105.255 ru 91.203.106.0 - 91.203.106.255 us @@ -54725,12 +28744,15 @@ 91.203.216.0 - 91.203.223.255 pl 91.203.224.0 - 91.203.243.255 ru 91.203.244.0 - 91.203.251.255 pl +91.203.252.0 - 91.203.255.255 ru 91.204.0.0 - 91.204.3.255 se 91.204.4.0 - 91.204.11.255 de -91.204.12.0 - 91.204.15.255 ua -91.204.16.0 - 91.204.27.255 ru +91.204.12.0 - 91.204.13.255 ua +91.204.14.0 - 91.204.14.127 us +91.204.14.128 - 91.204.14.255 de +91.204.15.0 - 91.204.27.255 ru 91.204.28.0 - 91.204.35.255 de -91.204.36.0 - 91.204.55.255 ua +91.204.36.0 - 91.204.39.255 ua 91.204.56.0 - 91.204.59.255 ru 91.204.60.0 - 91.204.63.255 ua 91.204.64.0 - 91.204.67.255 lv @@ -54755,19 +28777,20 @@ 91.204.160.0 - 91.204.163.255 pl 91.204.164.0 - 91.204.167.255 ru 91.204.168.0 - 91.204.171.255 de -91.204.172.0 - 91.204.175.255 gb +91.204.172.0 - 91.204.174.255 gb +91.204.175.0 - 91.204.175.255 us 91.204.176.0 - 91.204.179.255 ru 91.204.180.0 - 91.204.183.255 ua 91.204.184.0 - 91.204.187.255 ru 91.204.188.0 - 91.204.191.255 am -91.204.192.0 - 91.204.195.255 at +91.204.192.0 - 91.204.192.255 eu +91.204.193.0 - 91.204.195.255 at 91.204.196.0 - 91.204.199.255 ua 91.204.200.0 - 91.204.203.255 ru 91.204.204.0 - 91.204.207.255 pl 91.204.208.0 - 91.204.211.255 gb 91.204.212.0 - 91.204.215.255 ua 91.204.216.0 - 91.204.219.255 at -91.204.220.0 - 91.204.223.255 se 91.204.224.0 - 91.204.235.255 ru 91.204.236.0 - 91.204.239.255 uz 91.204.240.0 - 91.204.243.255 ru @@ -54793,14 +28816,12 @@ 91.205.68.0 - 91.205.71.255 ba 91.205.72.0 - 91.205.75.255 pl 91.205.76.0 - 91.205.79.255 de -91.205.80.0 - 91.205.83.255 ua +91.205.80.0 - 91.205.83.255 it 91.205.84.0 - 91.205.87.255 ru 91.205.88.0 - 91.205.91.255 pl 91.205.92.0 - 91.205.95.255 ru 91.205.96.0 - 91.205.99.255 nl 91.205.100.0 - 91.205.103.255 us -91.205.104.0 - 91.205.107.255 kz -91.205.108.0 - 91.205.111.255 gb 91.205.112.0 - 91.205.115.255 pt 91.205.116.0 - 91.205.119.255 fr 91.205.120.0 - 91.205.131.255 ru @@ -54815,8 +28836,8 @@ 91.205.172.0 - 91.205.175.255 de 91.205.176.0 - 91.205.183.255 ru 91.205.184.0 - 91.205.187.255 no -91.205.188.0 - 91.205.195.255 ru -91.205.196.0 - 91.205.199.255 ro +91.205.192.0 - 91.205.194.255 nl +91.205.195.0 - 91.205.195.255 cz 91.205.200.0 - 91.205.203.255 ru 91.205.204.0 - 91.205.207.255 ua 91.205.208.0 - 91.205.211.255 ru @@ -54825,7 +28846,7 @@ 91.205.220.0 - 91.205.223.255 gb 91.205.224.0 - 91.205.227.255 ru 91.205.228.0 - 91.205.231.255 pl -91.205.232.0 - 91.205.235.255 nl +91.205.232.0 - 91.205.235.255 us 91.205.236.0 - 91.205.243.255 ru 91.205.244.0 - 91.205.247.255 pl 91.205.248.0 - 91.205.251.255 gb @@ -54837,7 +28858,7 @@ 91.206.8.0 - 91.206.9.255 at 91.206.10.0 - 91.206.11.255 nl 91.206.12.0 - 91.206.19.255 ru -91.206.20.0 - 91.206.21.255 bg +91.206.20.0 - 91.206.21.255 lu 91.206.22.0 - 91.206.23.255 ru 91.206.24.0 - 91.206.25.255 ch 91.206.26.0 - 91.206.27.255 pl @@ -54856,7 +28877,6 @@ 91.206.62.0 - 91.206.63.255 ru 91.206.64.0 - 91.206.65.255 pl 91.206.66.0 - 91.206.67.255 ru -91.206.68.0 - 91.206.69.255 ch 91.206.70.0 - 91.206.71.255 de 91.206.72.0 - 91.206.73.255 ru 91.206.74.0 - 91.206.75.255 it @@ -54868,7 +28888,6 @@ 91.206.88.0 - 91.206.89.255 kz 91.206.90.0 - 91.206.90.255 pl 91.206.91.0 - 91.206.91.255 cz -91.206.92.0 - 91.206.93.255 ru 91.206.94.0 - 91.206.95.255 gb 91.206.96.0 - 91.206.97.255 pl 91.206.98.0 - 91.206.99.255 de @@ -54932,7 +28951,8 @@ 91.206.226.0 - 91.206.227.255 ua 91.206.228.0 - 91.206.229.255 de 91.206.230.0 - 91.206.231.255 ru -91.206.232.0 - 91.206.233.255 nl +91.206.232.0 - 91.206.232.255 gb +91.206.233.0 - 91.206.233.255 nl 91.206.234.0 - 91.206.235.255 gb 91.206.236.0 - 91.206.239.255 at 91.206.240.0 - 91.206.243.255 ru @@ -54942,18 +28962,16 @@ 91.206.250.0 - 91.206.251.255 be 91.206.252.0 - 91.206.253.255 ua 91.206.254.0 - 91.206.255.255 ru -91.207.0.0 - 91.207.1.255 fr 91.207.2.0 - 91.207.3.255 dk 91.207.4.0 - 91.207.9.255 ua 91.207.10.0 - 91.207.11.255 pl -91.207.12.0 - 91.207.13.255 sa 91.207.14.0 - 91.207.15.255 pl 91.207.16.0 - 91.207.17.255 de 91.207.18.0 - 91.207.21.255 fr 91.207.22.0 - 91.207.23.255 hr 91.207.24.0 - 91.207.25.255 ru 91.207.26.0 - 91.207.27.255 ua -91.207.28.0 - 91.207.29.255 kz +91.207.28.0 - 91.207.29.255 kg 91.207.30.0 - 91.207.31.255 ru 91.207.32.0 - 91.207.33.255 dk 91.207.34.0 - 91.207.35.255 il @@ -54971,19 +28989,19 @@ 91.207.64.0 - 91.207.65.255 pl 91.207.66.0 - 91.207.67.255 ua 91.207.68.0 - 91.207.69.255 pl -91.207.70.0 - 91.207.79.255 ru +91.207.72.0 - 91.207.79.255 ru 91.207.80.0 - 91.207.81.255 se 91.207.82.0 - 91.207.87.255 ru 91.207.88.0 - 91.207.89.255 ua 91.207.90.0 - 91.207.91.255 il -91.207.92.0 - 91.207.93.255 de +91.207.92.0 - 91.207.92.255 eu +91.207.93.0 - 91.207.93.255 de 91.207.94.0 - 91.207.95.255 ro -91.207.96.0 - 91.207.97.255 kg 91.207.98.0 - 91.207.99.255 ua 91.207.100.0 - 91.207.101.255 ru 91.207.102.0 - 91.207.103.255 ro -91.207.104.0 - 91.207.107.255 ua -91.207.108.0 - 91.207.109.255 ru +91.207.104.0 - 91.207.106.255 ua +91.207.107.0 - 91.207.107.255 ru 91.207.110.0 - 91.207.111.255 gb 91.207.112.0 - 91.207.113.255 se 91.207.114.0 - 91.207.115.255 ru @@ -55004,7 +29022,6 @@ 91.207.148.0 - 91.207.149.255 pl 91.207.150.0 - 91.207.151.255 it 91.207.152.0 - 91.207.153.255 gb -91.207.154.0 - 91.207.155.255 ru 91.207.156.0 - 91.207.157.255 pl 91.207.158.0 - 91.207.159.255 no 91.207.160.0 - 91.207.161.255 ro @@ -55012,15 +29029,14 @@ 91.207.164.0 - 91.207.165.255 ru 91.207.166.0 - 91.207.169.255 pl 91.207.170.0 - 91.207.171.255 ru -91.207.172.0 - 91.207.175.255 mc 91.207.176.0 - 91.207.177.255 fr -91.207.178.0 - 91.207.181.255 ru +91.207.180.0 - 91.207.181.255 ru 91.207.182.0 - 91.207.183.255 ua 91.207.184.0 - 91.207.187.255 pl 91.207.188.0 - 91.207.189.255 cz 91.207.190.0 - 91.207.191.255 bg +91.207.192.0 - 91.207.193.255 gb 91.207.194.0 - 91.207.195.255 ua -91.207.196.0 - 91.207.197.255 es 91.207.198.0 - 91.207.199.255 gb 91.207.200.0 - 91.207.203.255 pl 91.207.204.0 - 91.207.205.255 ua @@ -55032,13 +29048,10 @@ 91.207.216.0 - 91.207.217.255 ro 91.207.218.0 - 91.207.219.255 ua 91.207.220.0 - 91.207.221.255 gb -91.207.222.0 - 91.207.223.255 at 91.207.224.0 - 91.207.225.255 ua 91.207.226.0 - 91.207.227.255 no 91.207.228.0 - 91.207.229.255 dk -91.207.230.0 - 91.207.231.255 ro 91.207.232.0 - 91.207.233.255 nl -91.207.234.0 - 91.207.235.255 ru 91.207.236.0 - 91.207.237.255 gr 91.207.238.0 - 91.207.239.255 ru 91.207.240.0 - 91.207.241.255 il @@ -55064,11 +29077,8 @@ 91.208.13.0 - 91.208.13.255 de 91.208.14.0 - 91.208.14.255 it 91.208.15.0 - 91.208.15.255 ee -91.208.16.0 - 91.208.16.255 ru -91.208.17.0 - 91.208.18.255 de -91.208.19.0 - 91.208.19.255 fr +91.208.16.0 - 91.208.19.255 de 91.208.20.0 - 91.208.20.255 ru -91.208.21.0 - 91.208.21.255 gb 91.208.22.0 - 91.208.22.255 is 91.208.23.0 - 91.208.23.255 ru 91.208.24.0 - 91.208.24.255 no @@ -55078,7 +29088,6 @@ 91.208.28.0 - 91.208.28.255 gb 91.208.29.0 - 91.208.29.255 ru 91.208.30.0 - 91.208.30.255 ch -91.208.31.0 - 91.208.31.255 ie 91.208.32.0 - 91.208.32.255 pl 91.208.33.0 - 91.208.33.255 ru 91.208.34.0 - 91.208.34.255 at @@ -55092,7 +29101,6 @@ 91.208.42.0 - 91.208.43.255 ru 91.208.44.0 - 91.208.44.255 pl 91.208.45.0 - 91.208.45.255 de -91.208.46.0 - 91.208.46.255 ua 91.208.47.0 - 91.208.47.255 de 91.208.48.0 - 91.208.48.255 lb 91.208.49.0 - 91.208.49.255 nl @@ -55109,13 +29117,11 @@ 91.208.60.0 - 91.208.60.255 nl 91.208.61.0 - 91.208.61.255 tr 91.208.62.0 - 91.208.62.255 nl -91.208.63.0 - 91.208.63.255 hu +91.208.63.0 - 91.208.63.255 bg 91.208.64.0 - 91.208.64.255 ru 91.208.65.0 - 91.208.65.255 ua -91.208.66.0 - 91.208.66.255 de -91.208.67.0 - 91.208.67.255 gb +91.208.66.0 - 91.208.67.255 gb 91.208.68.0 - 91.208.68.255 de -91.208.69.0 - 91.208.69.255 nl 91.208.70.0 - 91.208.70.255 tr 91.208.71.0 - 91.208.71.255 dk 91.208.72.0 - 91.208.72.255 pl @@ -55150,7 +29156,6 @@ 91.208.101.0 - 91.208.101.255 si 91.208.102.0 - 91.208.102.255 fr 91.208.103.0 - 91.208.103.255 se -91.208.104.0 - 91.208.104.255 hr 91.208.105.0 - 91.208.105.255 gb 91.208.106.0 - 91.208.106.255 pl 91.208.107.0 - 91.208.107.255 de @@ -55158,7 +29163,6 @@ 91.208.110.0 - 91.208.110.255 nl 91.208.111.0 - 91.208.111.255 gb 91.208.112.0 - 91.208.112.255 nl -91.208.113.0 - 91.208.113.255 ru 91.208.114.0 - 91.208.114.255 gb 91.208.115.0 - 91.208.116.255 ua 91.208.117.0 - 91.208.117.255 gb @@ -55172,7 +29176,6 @@ 91.208.125.0 - 91.208.125.255 si 91.208.126.0 - 91.208.126.255 ru 91.208.127.0 - 91.208.127.255 ua -91.208.128.0 - 91.208.128.255 sa 91.208.129.0 - 91.208.129.255 il 91.208.130.0 - 91.208.130.255 ch 91.208.131.0 - 91.208.131.255 nl @@ -55180,7 +29183,7 @@ 91.208.133.0 - 91.208.133.255 pl 91.208.134.0 - 91.208.134.255 ru 91.208.135.0 - 91.208.135.255 pl -91.208.136.0 - 91.208.137.255 gb +91.208.136.0 - 91.208.136.255 gb 91.208.138.0 - 91.208.138.255 ua 91.208.139.0 - 91.208.140.255 il 91.208.141.0 - 91.208.141.255 gb @@ -55199,8 +29202,8 @@ 91.208.155.0 - 91.208.155.255 de 91.208.156.0 - 91.208.156.255 sa 91.208.157.0 - 91.208.157.255 dk -91.208.159.0 - 91.208.160.255 de -91.208.161.0 - 91.208.162.255 ru +91.208.158.0 - 91.208.160.255 de +91.208.161.0 - 91.208.161.255 ru 91.208.163.0 - 91.208.163.255 gb 91.208.164.0 - 91.208.164.255 nl 91.208.165.0 - 91.208.165.255 ir @@ -55215,7 +29218,6 @@ 91.208.174.0 - 91.208.174.255 se 91.208.175.0 - 91.208.175.255 nl 91.208.176.0 - 91.208.176.255 at -91.208.177.0 - 91.208.177.255 gb 91.208.178.0 - 91.208.179.255 ro 91.208.180.0 - 91.208.180.255 ch 91.208.181.0 - 91.208.181.255 fr @@ -55231,7 +29233,6 @@ 91.208.194.0 - 91.208.194.255 ua 91.208.195.0 - 91.208.195.255 it 91.208.196.0 - 91.208.196.255 nl -91.208.197.0 - 91.208.197.255 hr 91.208.198.0 - 91.208.198.255 ua 91.208.199.0 - 91.208.199.255 tr 91.208.200.0 - 91.208.200.255 si @@ -55240,9 +29241,7 @@ 91.208.203.0 - 91.208.203.255 kw 91.208.204.0 - 91.208.204.255 ch 91.208.205.0 - 91.208.205.255 ru -91.208.206.0 - 91.208.206.255 tr -91.208.207.0 - 91.208.207.255 sg -91.208.208.0 - 91.208.208.255 ru +91.208.207.0 - 91.208.207.255 nl 91.208.209.0 - 91.208.209.255 fr 91.208.210.0 - 91.208.210.255 ru 91.208.211.0 - 91.208.211.255 be @@ -55262,22 +29261,18 @@ 91.208.225.0 - 91.208.225.255 si 91.208.226.0 - 91.208.226.255 fr 91.208.227.0 - 91.208.227.255 ch -91.208.228.0 - 91.208.228.255 ru 91.208.229.0 - 91.208.229.255 nl -91.208.230.0 - 91.208.230.255 ru 91.208.231.0 - 91.208.231.255 ua 91.208.232.0 - 91.208.232.255 ru 91.208.233.0 - 91.208.233.255 hr 91.208.234.0 - 91.208.235.255 ro -91.208.236.0 - 91.208.236.255 at 91.208.237.0 - 91.208.237.255 fr 91.208.238.0 - 91.208.238.255 ru -91.208.239.0 - 91.208.240.255 gb +91.208.239.0 - 91.208.239.255 gb 91.208.241.0 - 91.208.241.255 nl 91.208.242.0 - 91.208.243.255 gb 91.208.244.0 - 91.208.244.255 de 91.208.245.0 - 91.208.245.255 gb -91.208.246.0 - 91.208.246.255 ru 91.208.247.0 - 91.208.247.255 pl 91.208.248.0 - 91.208.249.255 ru 91.208.250.0 - 91.208.250.255 pl @@ -55294,18 +29289,16 @@ 91.209.6.0 - 91.209.6.255 us 91.209.7.0 - 91.209.7.255 nl 91.209.8.0 - 91.209.8.255 bg -91.209.9.0 - 91.209.9.255 de +91.209.9.0 - 91.209.9.255 ru 91.209.10.0 - 91.209.10.255 ie 91.209.11.0 - 91.209.11.255 ua 91.209.12.0 - 91.209.13.255 nl -91.209.14.0 - 91.209.14.255 ru 91.209.15.0 - 91.209.15.255 fr 91.209.16.0 - 91.209.17.255 ru 91.209.18.0 - 91.209.18.255 si 91.209.19.0 - 91.209.19.255 fr 91.209.20.0 - 91.209.20.255 pl -91.209.21.0 - 91.209.21.255 bg -91.209.22.0 - 91.209.23.255 ro +91.209.23.0 - 91.209.23.255 ro 91.209.24.0 - 91.209.24.255 ua 91.209.25.0 - 91.209.25.255 fr 91.209.26.0 - 91.209.26.255 de @@ -55322,14 +29315,12 @@ 91.209.37.0 - 91.209.37.255 gb 91.209.38.0 - 91.209.38.255 am 91.209.39.0 - 91.209.39.255 dk -91.209.40.0 - 91.209.40.255 gb 91.209.41.0 - 91.209.41.255 ch 91.209.42.0 - 91.209.42.255 de 91.209.43.0 - 91.209.43.255 gb 91.209.44.0 - 91.209.44.255 fr 91.209.45.0 - 91.209.45.255 ro 91.209.46.0 - 91.209.47.255 gr -91.209.48.0 - 91.209.48.255 ru 91.209.49.0 - 91.209.49.255 si 91.209.50.0 - 91.209.50.255 gb 91.209.51.0 - 91.209.51.255 ua @@ -55338,21 +29329,21 @@ 91.209.54.0 - 91.209.55.255 ua 91.209.56.0 - 91.209.56.255 pl 91.209.57.0 - 91.209.57.255 us -91.209.58.0 - 91.209.59.255 ru +91.209.59.0 - 91.209.59.255 ru +91.209.60.0 - 91.209.60.255 gb 91.209.61.0 - 91.209.61.255 ro -91.209.62.0 - 91.209.63.255 pl 91.209.64.0 - 91.209.64.255 ua 91.209.65.0 - 91.209.65.255 ru 91.209.66.0 - 91.209.66.255 md -91.209.67.0 - 91.209.67.255 gb -91.209.68.0 - 91.209.68.255 pl +91.209.67.0 - 91.209.67.255 ru 91.209.69.0 - 91.209.70.255 ru 91.209.71.0 - 91.209.71.255 gb 91.209.72.0 - 91.209.72.255 ru 91.209.73.0 - 91.209.73.255 gb 91.209.74.0 - 91.209.74.255 ie 91.209.75.0 - 91.209.75.255 at -91.209.76.0 - 91.209.77.255 ru +91.209.76.0 - 91.209.76.255 ru +91.209.77.0 - 91.209.77.255 cz 91.209.78.0 - 91.209.78.255 fr 91.209.79.0 - 91.209.79.255 gb 91.209.80.0 - 91.209.80.255 ru @@ -55373,8 +29364,6 @@ 91.209.96.0 - 91.209.96.255 ua 91.209.97.0 - 91.209.97.255 it 91.209.98.0 - 91.209.98.255 ch -91.209.99.0 - 91.209.99.255 de -91.209.100.0 - 91.209.100.255 ua 91.209.101.0 - 91.209.101.255 cz 91.209.102.0 - 91.209.102.255 ro 91.209.103.0 - 91.209.103.255 de @@ -55384,11 +29373,11 @@ 91.209.107.0 - 91.209.107.255 fr 91.209.108.0 - 91.209.108.255 es 91.209.109.0 - 91.209.109.255 ro +91.209.110.0 - 91.209.110.255 nl 91.209.111.0 - 91.209.111.255 ch 91.209.112.0 - 91.209.112.255 at 91.209.113.0 - 91.209.113.255 il 91.209.114.0 - 91.209.114.255 hu -91.209.115.0 - 91.209.115.255 ru 91.209.116.0 - 91.209.116.255 pl 91.209.117.0 - 91.209.117.255 fr 91.209.118.0 - 91.209.118.255 ua @@ -55410,14 +29399,13 @@ 91.209.138.0 - 91.209.139.255 ua 91.209.140.0 - 91.209.140.255 gb 91.209.141.0 - 91.209.141.255 pl -91.209.142.0 - 91.209.143.255 nl +91.209.142.0 - 91.209.142.255 gb +91.209.143.0 - 91.209.143.255 nl 91.209.144.0 - 91.209.144.255 gb 91.209.145.0 - 91.209.145.255 si 91.209.146.0 - 91.209.146.255 bg 91.209.147.0 - 91.209.148.255 ru -91.209.149.0 - 91.209.149.255 ro 91.209.150.0 - 91.209.150.255 si -91.209.151.0 - 91.209.151.255 ua 91.209.152.0 - 91.209.153.255 pl 91.209.154.0 - 91.209.154.255 fr 91.209.155.0 - 91.209.155.255 pl @@ -55426,9 +29414,8 @@ 91.209.158.0 - 91.209.158.255 ch 91.209.159.0 - 91.209.160.255 de 91.209.161.0 - 91.209.162.255 gb -91.209.163.0 - 91.209.163.255 es 91.209.164.0 - 91.209.164.255 nl -91.209.165.0 - 91.209.165.255 ru +91.209.165.0 - 91.209.165.255 ua 91.209.166.0 - 91.209.166.255 dk 91.209.167.0 - 91.209.167.255 ru 91.209.168.0 - 91.209.168.255 nl @@ -55440,13 +29427,10 @@ 91.209.176.0 - 91.209.176.255 ua 91.209.177.0 - 91.209.177.255 pl 91.209.178.0 - 91.209.178.255 gb -91.209.179.0 - 91.209.179.255 ro 91.209.180.0 - 91.209.180.255 pl 91.209.181.0 - 91.209.181.255 si 91.209.182.0 - 91.209.182.255 il -91.209.183.0 - 91.209.184.255 ru 91.209.185.0 - 91.209.185.255 de -91.209.186.0 - 91.209.186.255 ru 91.209.187.0 - 91.209.187.255 gb 91.209.188.0 - 91.209.188.255 si 91.209.189.0 - 91.209.189.255 ro @@ -55466,13 +29450,11 @@ 91.209.206.0 - 91.209.206.255 ua 91.209.207.0 - 91.209.207.255 si 91.209.208.0 - 91.209.208.255 nl -91.209.209.0 - 91.209.209.255 ro 91.209.210.0 - 91.209.210.255 ua 91.209.211.0 - 91.209.211.255 de 91.209.212.0 - 91.209.212.255 no 91.209.213.0 - 91.209.213.255 nl 91.209.214.0 - 91.209.214.255 ua -91.209.215.0 - 91.209.215.255 sa 91.209.216.0 - 91.209.216.255 hr 91.209.217.0 - 91.209.217.255 gb 91.209.218.0 - 91.209.218.255 ru @@ -55480,13 +29462,10 @@ 91.209.220.0 - 91.209.220.255 gb 91.209.221.0 - 91.209.222.255 pl 91.209.223.0 - 91.209.223.255 gb -91.209.224.0 - 91.209.224.255 lt 91.209.225.0 - 91.209.225.255 gb 91.209.226.0 - 91.209.226.255 ua -91.209.227.0 - 91.209.227.255 ru 91.209.228.0 - 91.209.228.255 dk 91.209.229.0 - 91.209.229.255 fr -91.209.230.0 - 91.209.230.255 ch 91.209.231.0 - 91.209.231.255 de 91.209.232.0 - 91.209.232.255 se 91.209.233.0 - 91.209.234.255 ru @@ -55506,9 +29485,10 @@ 91.209.248.0 - 91.209.248.255 ps 91.209.249.0 - 91.209.249.255 ua 91.209.250.0 - 91.209.250.255 de +91.209.251.0 - 91.209.251.255 si 91.209.252.0 - 91.209.252.255 gb 91.209.253.0 - 91.209.253.255 sa -91.209.254.0 - 91.209.254.255 gb +91.209.254.0 - 91.209.254.255 de 91.209.255.0 - 91.209.255.255 ro 91.210.0.0 - 91.210.7.255 ru 91.210.8.0 - 91.210.11.255 ua @@ -55521,18 +29501,15 @@ 91.210.44.0 - 91.210.47.255 ru 91.210.48.0 - 91.210.51.255 pl 91.210.52.0 - 91.210.55.255 ru -91.210.56.0 - 91.210.59.255 nl 91.210.60.0 - 91.210.63.255 se -91.210.64.0 - 91.210.67.255 ro +91.210.64.0 - 91.210.67.255 eu 91.210.68.0 - 91.210.71.255 gb 91.210.72.0 - 91.210.75.255 ru 91.210.76.0 - 91.210.79.255 ua 91.210.80.0 - 91.210.83.255 ro 91.210.84.0 - 91.210.87.255 ru 91.210.88.0 - 91.210.91.255 bg -91.210.92.0 - 91.210.95.255 ru -91.210.96.0 - 91.210.99.255 ua -91.210.100.0 - 91.210.103.255 gb +91.210.92.0 - 91.210.99.255 ru 91.210.104.0 - 91.210.107.255 ru 91.210.108.0 - 91.210.111.255 ua 91.210.112.0 - 91.210.115.255 ru @@ -55549,11 +29526,12 @@ 91.210.164.0 - 91.210.167.255 ua 91.210.168.0 - 91.210.171.255 ru 91.210.172.0 - 91.210.175.255 kz -91.210.176.0 - 91.210.179.255 ua +91.210.176.0 - 91.210.176.255 ua +91.210.177.0 - 91.210.179.255 ru 91.210.180.0 - 91.210.183.255 sk 91.210.184.0 - 91.210.187.255 ru -91.210.188.0 - 91.210.191.255 ua -91.210.192.0 - 91.210.207.255 ru +91.210.188.0 - 91.210.195.255 ua +91.210.196.0 - 91.210.207.255 ru 91.210.208.0 - 91.210.211.255 pl 91.210.212.0 - 91.210.215.255 de 91.210.216.0 - 91.210.219.255 ru @@ -55572,12 +29550,12 @@ 91.211.40.0 - 91.211.43.255 de 91.211.44.0 - 91.211.47.255 ru 91.211.48.0 - 91.211.51.255 md -91.211.52.0 - 91.211.67.255 ru +91.211.52.0 - 91.211.63.255 ru 91.211.68.0 - 91.211.71.255 ua 91.211.72.0 - 91.211.75.255 nl 91.211.76.0 - 91.211.83.255 ru 91.211.84.0 - 91.211.87.255 pl -91.211.88.0 - 91.211.95.255 ru +91.211.92.0 - 91.211.95.255 ru 91.211.96.0 - 91.211.99.255 ie 91.211.100.0 - 91.211.103.255 pl 91.211.104.0 - 91.211.107.255 ru @@ -55587,28 +29565,24 @@ 91.211.124.0 - 91.211.131.255 ru 91.211.132.0 - 91.211.135.255 ua 91.211.136.0 - 91.211.151.255 ru -91.211.152.0 - 91.211.155.255 gb 91.211.156.0 - 91.211.159.255 it -91.211.160.0 - 91.211.163.255 uz 91.211.164.0 - 91.211.167.255 fr 91.211.168.0 - 91.211.171.255 se 91.211.172.0 - 91.211.179.255 ua 91.211.180.0 - 91.211.187.255 ru 91.211.188.0 - 91.211.191.255 bg -91.211.192.0 - 91.211.199.255 ru +91.211.192.0 - 91.211.195.255 ru 91.211.200.0 - 91.211.203.255 md 91.211.204.0 - 91.211.207.255 ua 91.211.208.0 - 91.211.211.255 ru 91.211.212.0 - 91.211.215.255 ua 91.211.216.0 - 91.211.219.255 ru 91.211.220.0 - 91.211.223.255 pl -91.211.224.0 - 91.211.227.255 tr 91.211.228.0 - 91.211.231.255 ru 91.211.232.0 - 91.211.235.255 bg 91.211.236.0 - 91.211.239.255 ru 91.211.240.0 - 91.211.243.255 at 91.211.244.0 - 91.211.247.255 lt -91.211.248.0 - 91.211.251.255 ua 91.211.252.0 - 91.211.255.255 pl 91.212.0.0 - 91.212.0.255 nl 91.212.1.0 - 91.212.1.255 lb @@ -55620,23 +29594,18 @@ 91.212.8.0 - 91.212.8.255 kw 91.212.9.0 - 91.212.9.255 pl 91.212.10.0 - 91.212.10.255 ru -91.212.11.0 - 91.212.11.255 se 91.212.12.0 - 91.212.12.255 gb 91.212.13.0 - 91.212.13.255 bg -91.212.14.0 - 91.212.14.255 ro 91.212.15.0 - 91.212.15.255 rs 91.212.16.0 - 91.212.16.255 ir 91.212.17.0 - 91.212.17.255 bg 91.212.18.0 - 91.212.18.255 gb -91.212.19.0 - 91.212.19.255 ir -91.212.20.0 - 91.212.20.255 ru 91.212.21.0 - 91.212.21.255 fr 91.212.22.0 - 91.212.22.255 ua 91.212.23.0 - 91.212.23.255 ro 91.212.24.0 - 91.212.24.255 si 91.212.25.0 - 91.212.25.255 pl 91.212.26.0 - 91.212.26.255 fr -91.212.27.0 - 91.212.27.255 pl 91.212.28.0 - 91.212.28.255 dk 91.212.29.0 - 91.212.29.255 ch 91.212.30.0 - 91.212.30.255 pl @@ -55647,24 +29616,17 @@ 91.212.35.0 - 91.212.35.255 ro 91.212.36.0 - 91.212.36.255 dk 91.212.37.0 - 91.212.37.255 bg -91.212.38.0 - 91.212.38.255 de 91.212.39.0 - 91.212.39.255 ro 91.212.40.0 - 91.212.40.255 ch -91.212.41.0 - 91.212.41.255 ru 91.212.42.0 - 91.212.42.255 nl 91.212.43.0 - 91.212.43.255 ch 91.212.44.0 - 91.212.44.255 hr -91.212.45.0 - 91.212.45.255 lv 91.212.46.0 - 91.212.46.255 at 91.212.47.0 - 91.212.47.255 ru 91.212.48.0 - 91.212.48.255 dk -91.212.49.0 - 91.212.49.255 gb 91.212.50.0 - 91.212.50.255 ru -91.212.51.0 - 91.212.51.255 ch 91.212.52.0 - 91.212.52.255 ro 91.212.53.0 - 91.212.53.255 ae -91.212.54.0 - 91.212.54.255 gb -91.212.55.0 - 91.212.55.255 fr 91.212.56.0 - 91.212.56.255 ua 91.212.57.0 - 91.212.57.255 ru 91.212.58.0 - 91.212.58.255 fr @@ -55673,16 +29635,16 @@ 91.212.62.0 - 91.212.62.255 ro 91.212.63.0 - 91.212.63.255 lv 91.212.64.0 - 91.212.64.255 ru -91.212.65.0 - 91.212.65.255 ua 91.212.66.0 - 91.212.66.255 ro 91.212.67.0 - 91.212.67.255 sa 91.212.68.0 - 91.212.68.255 ru 91.212.69.0 - 91.212.69.255 rs 91.212.70.0 - 91.212.70.255 ro 91.212.71.0 - 91.212.71.255 am -91.212.72.0 - 91.212.72.255 ua -91.212.73.0 - 91.212.74.255 ro -91.212.75.0 - 91.212.75.255 ch +91.212.74.0 - 91.212.74.255 ro +91.212.75.0 - 91.212.75.3 ch +91.212.75.4 - 91.212.75.4 eu +91.212.75.5 - 91.212.75.255 ch 91.212.76.0 - 91.212.76.255 il 91.212.77.0 - 91.212.77.255 ch 91.212.78.0 - 91.212.78.255 fr @@ -55705,16 +29667,16 @@ 91.212.97.0 - 91.212.97.255 ru 91.212.98.0 - 91.212.98.255 be 91.212.99.0 - 91.212.99.255 nl -91.212.100.0 - 91.212.100.255 pl 91.212.101.0 - 91.212.101.255 ro 91.212.102.0 - 91.212.102.255 ps 91.212.103.0 - 91.212.103.255 se 91.212.104.0 - 91.212.104.255 ru 91.212.105.0 - 91.212.105.255 gb 91.212.106.0 - 91.212.106.255 ru -91.212.107.0 - 91.212.108.255 gb +91.212.108.0 - 91.212.108.255 gb 91.212.109.0 - 91.212.109.255 ch 91.212.110.0 - 91.212.111.255 ro +91.212.112.0 - 91.212.112.255 sk 91.212.113.0 - 91.212.113.255 de 91.212.114.0 - 91.212.114.255 il 91.212.115.0 - 91.212.115.255 gb @@ -55722,16 +29684,16 @@ 91.212.117.0 - 91.212.117.255 ch 91.212.118.0 - 91.212.118.255 ru 91.212.119.0 - 91.212.119.255 fr -91.212.120.0 - 91.212.120.255 ro 91.212.121.0 - 91.212.121.255 ch 91.212.122.0 - 91.212.122.255 mk -91.212.123.0 - 91.212.123.255 ru 91.212.124.0 - 91.212.125.255 ua 91.212.126.0 - 91.212.126.255 tr +91.212.127.0 - 91.212.127.255 pl 91.212.128.0 - 91.212.128.255 fr 91.212.129.0 - 91.212.129.255 dk 91.212.130.0 - 91.212.130.255 de 91.212.131.0 - 91.212.131.255 gb +91.212.132.0 - 91.212.132.255 eu 91.212.133.0 - 91.212.133.255 ru 91.212.134.0 - 91.212.134.255 si 91.212.135.0 - 91.212.135.255 ru @@ -55739,23 +29701,22 @@ 91.212.137.0 - 91.212.137.255 ru 91.212.138.0 - 91.212.138.255 gb 91.212.139.0 - 91.212.140.255 nl -91.212.141.0 - 91.212.142.255 ru 91.212.143.0 - 91.212.143.255 ro 91.212.144.0 - 91.212.144.255 de 91.212.145.0 - 91.212.145.255 cy 91.212.146.0 - 91.212.146.255 ru 91.212.147.0 - 91.212.147.255 fr 91.212.148.0 - 91.212.148.255 ro -91.212.149.0 - 91.212.151.255 ru +91.212.150.0 - 91.212.151.255 ru 91.212.152.0 - 91.212.152.255 fr -91.212.153.0 - 91.212.154.255 ua +91.212.154.0 - 91.212.154.255 ua 91.212.155.0 - 91.212.155.255 pl 91.212.156.0 - 91.212.156.255 ru 91.212.157.0 - 91.212.157.255 fr +91.212.158.0 - 91.212.158.255 ru 91.212.159.0 - 91.212.159.255 ro 91.212.160.0 - 91.212.160.255 gb -91.212.161.0 - 91.212.162.255 ro -91.212.163.0 - 91.212.163.255 bg +91.212.162.0 - 91.212.162.255 ro 91.212.164.0 - 91.212.164.255 ro 91.212.165.0 - 91.212.165.255 pl 91.212.166.0 - 91.212.166.255 gb @@ -55784,7 +29745,6 @@ 91.212.195.0 - 91.212.195.255 ru 91.212.196.0 - 91.212.196.255 ch 91.212.197.0 - 91.212.197.255 ru -91.212.198.0 - 91.212.198.255 lv 91.212.199.0 - 91.212.199.255 si 91.212.200.0 - 91.212.200.255 ch 91.212.201.0 - 91.212.201.255 bg @@ -55796,7 +29756,7 @@ 91.212.207.0 - 91.212.207.255 se 91.212.208.0 - 91.212.208.255 si 91.212.209.0 - 91.212.209.255 se -91.212.210.0 - 91.212.210.255 nl +91.212.210.0 - 91.212.210.255 gb 91.212.211.0 - 91.212.211.255 fr 91.212.212.0 - 91.212.212.255 gb 91.212.213.0 - 91.212.213.255 ge @@ -55809,13 +29769,10 @@ 91.212.222.0 - 91.212.222.255 gb 91.212.223.0 - 91.212.223.255 pl 91.212.224.0 - 91.212.224.255 dk -91.212.225.0 - 91.212.225.255 de -91.212.226.0 - 91.212.226.255 ru +91.212.225.0 - 91.212.225.255 ge 91.212.227.0 - 91.212.227.255 ro 91.212.228.0 - 91.212.228.255 se -91.212.229.0 - 91.212.229.255 eu -91.212.230.0 - 91.212.230.255 ru -91.212.231.0 - 91.212.231.255 pl +91.212.229.0 - 91.212.230.255 ru 91.212.232.0 - 91.212.232.255 lt 91.212.233.0 - 91.212.233.255 bg 91.212.234.0 - 91.212.234.255 ch @@ -55824,13 +29781,12 @@ 91.212.237.0 - 91.212.237.255 nl 91.212.238.0 - 91.212.238.255 fr 91.212.239.0 - 91.212.239.255 ru -91.212.240.0 - 91.212.240.255 tr 91.212.241.0 - 91.212.241.255 it 91.212.242.0 - 91.212.242.255 pl 91.212.243.0 - 91.212.243.255 de 91.212.244.0 - 91.212.244.255 ee 91.212.245.0 - 91.212.245.255 de -91.212.246.0 - 91.212.247.255 hr +91.212.247.0 - 91.212.247.255 hr 91.212.248.0 - 91.212.248.255 ua 91.212.249.0 - 91.212.249.255 it 91.212.250.0 - 91.212.250.255 hu @@ -55862,16 +29818,14 @@ 91.213.20.0 - 91.213.22.255 de 91.213.23.0 - 91.213.23.255 ru 91.213.24.0 - 91.213.24.255 ch -91.213.25.0 - 91.213.25.255 fr -91.213.26.0 - 91.213.26.255 be +91.213.25.0 - 91.213.26.255 fr 91.213.27.0 - 91.213.27.255 de 91.213.28.0 - 91.213.28.255 gb -91.213.29.0 - 91.213.29.255 ru 91.213.30.0 - 91.213.30.255 es 91.213.31.0 - 91.213.31.255 uz 91.213.32.0 - 91.213.32.255 ch 91.213.33.0 - 91.213.33.255 ua -91.213.34.0 - 91.213.35.255 ro +91.213.34.0 - 91.213.34.255 ro 91.213.36.0 - 91.213.36.255 de 91.213.37.0 - 91.213.37.255 nl 91.213.38.0 - 91.213.38.255 pl @@ -55886,7 +29840,6 @@ 91.213.47.0 - 91.213.47.255 no 91.213.48.0 - 91.213.48.255 de 91.213.49.0 - 91.213.49.255 ie -91.213.50.0 - 91.213.50.255 eu 91.213.51.0 - 91.213.51.255 ru 91.213.52.0 - 91.213.52.255 gr 91.213.53.0 - 91.213.53.255 nl @@ -55903,14 +29856,11 @@ 91.213.65.0 - 91.213.65.255 pt 91.213.66.0 - 91.213.66.255 dk 91.213.67.0 - 91.213.67.255 ru -91.213.68.0 - 91.213.68.255 mh +91.213.68.0 - 91.213.68.255 gb 91.213.69.0 - 91.213.69.255 nl 91.213.70.0 - 91.213.70.255 dk 91.213.71.0 - 91.213.71.255 pl -91.213.72.0 - 91.213.72.255 kz 91.213.73.0 - 91.213.73.255 ie -91.213.74.0 - 91.213.74.255 ua -91.213.75.0 - 91.213.75.255 hu 91.213.76.0 - 91.213.76.255 ro 91.213.77.0 - 91.213.77.255 at 91.213.78.0 - 91.213.78.255 nl @@ -55919,7 +29869,7 @@ 91.213.81.0 - 91.213.81.255 gb 91.213.82.0 - 91.213.82.255 fr 91.213.83.0 - 91.213.83.255 at -91.213.84.0 - 91.213.84.255 gb +91.213.84.0 - 91.213.84.255 hr 91.213.85.0 - 91.213.85.255 nl 91.213.86.0 - 91.213.86.255 md 91.213.87.0 - 91.213.87.255 ru @@ -55928,8 +29878,6 @@ 91.213.90.0 - 91.213.90.255 fr 91.213.91.0 - 91.213.91.255 de 91.213.92.0 - 91.213.92.255 ua -91.213.93.0 - 91.213.93.255 kz -91.213.94.0 - 91.213.94.255 ua 91.213.95.0 - 91.213.95.255 nl 91.213.96.0 - 91.213.96.255 pl 91.213.97.0 - 91.213.97.255 fi @@ -55943,15 +29891,12 @@ 91.213.107.0 - 91.213.108.255 pl 91.213.109.0 - 91.213.109.255 ru 91.213.110.0 - 91.213.110.255 gb -91.213.111.0 - 91.213.111.255 ro 91.213.112.0 - 91.213.112.255 nl -91.213.113.0 - 91.213.115.255 ru +91.213.113.0 - 91.213.114.255 ru +91.213.115.0 - 91.213.115.255 nl 91.213.116.0 - 91.213.116.255 de -91.213.117.0 - 91.213.117.255 ua 91.213.118.0 - 91.213.118.255 pl 91.213.119.0 - 91.213.119.255 ua -91.213.120.0 - 91.213.120.255 ru -91.213.121.0 - 91.213.121.255 ua 91.213.122.0 - 91.213.122.255 cz 91.213.123.0 - 91.213.124.255 pl 91.213.125.0 - 91.213.125.255 ua @@ -55967,23 +29912,20 @@ 91.213.135.0 - 91.213.135.255 ro 91.213.136.0 - 91.213.136.255 ch 91.213.137.0 - 91.213.137.255 pl -91.213.138.0 - 91.213.139.255 ru +91.213.139.0 - 91.213.139.255 ru 91.213.140.0 - 91.213.140.255 gb 91.213.141.0 - 91.213.142.255 ru 91.213.143.0 - 91.213.143.255 cz 91.213.144.0 - 91.213.144.255 ru 91.213.145.0 - 91.213.146.255 fr 91.213.147.0 - 91.213.147.255 si -91.213.148.0 - 91.213.148.255 ru 91.213.149.0 - 91.213.149.255 ua 91.213.150.0 - 91.213.150.255 hu -91.213.151.0 - 91.213.151.255 de 91.213.152.0 - 91.213.152.255 ch 91.213.153.0 - 91.213.153.255 it 91.213.154.0 - 91.213.154.255 ua 91.213.155.0 - 91.213.155.255 se 91.213.156.0 - 91.213.156.255 pl -91.213.157.0 - 91.213.157.255 tt 91.213.158.0 - 91.213.158.255 ru 91.213.159.0 - 91.213.159.255 ch 91.213.160.0 - 91.213.160.255 cz @@ -55992,12 +29934,12 @@ 91.213.163.0 - 91.213.163.255 ru 91.213.164.0 - 91.213.164.255 gb 91.213.165.0 - 91.213.165.255 nl -91.213.166.0 - 91.213.169.255 ru +91.213.166.0 - 91.213.166.255 ru +91.213.168.0 - 91.213.169.255 ru 91.213.170.0 - 91.213.170.255 pl 91.213.171.0 - 91.213.171.255 ch 91.213.172.0 - 91.213.172.255 ru 91.213.173.0 - 91.213.173.255 gb -91.213.174.0 - 91.213.174.255 ru 91.213.175.0 - 91.213.175.255 ua 91.213.176.0 - 91.213.176.255 il 91.213.177.0 - 91.213.177.255 de @@ -56029,7 +29971,7 @@ 91.213.206.0 - 91.213.206.255 pl 91.213.207.0 - 91.213.207.255 de 91.213.208.0 - 91.213.208.255 se -91.213.209.0 - 91.213.209.255 pa +91.213.209.0 - 91.213.209.255 ua 91.213.210.0 - 91.213.210.255 it 91.213.211.0 - 91.213.211.255 cz 91.213.212.0 - 91.213.212.255 gb @@ -56037,18 +29979,16 @@ 91.213.214.0 - 91.213.214.255 nl 91.213.215.0 - 91.213.215.255 ro 91.213.216.0 - 91.213.216.255 gb -91.213.217.0 - 91.213.217.255 eu 91.213.218.0 - 91.213.219.255 nl 91.213.220.0 - 91.213.220.255 ru 91.213.221.0 - 91.213.221.255 de 91.213.222.0 - 91.213.222.255 at -91.213.223.0 - 91.213.223.255 ru 91.213.224.0 - 91.213.224.255 no -91.213.225.0 - 91.213.225.255 ru +91.213.225.0 - 91.213.225.255 gb 91.213.226.0 - 91.213.226.255 pl 91.213.227.0 - 91.213.227.255 ch 91.213.228.0 - 91.213.228.255 gr -91.213.229.0 - 91.213.229.255 ua +91.213.229.0 - 91.213.229.255 fr 91.213.230.0 - 91.213.230.255 gb 91.213.231.0 - 91.213.231.255 ua 91.213.232.0 - 91.213.232.255 de @@ -56068,7 +30008,7 @@ 91.213.249.0 - 91.213.249.255 ru 91.213.250.0 - 91.213.250.255 se 91.213.251.0 - 91.213.251.255 be -91.213.252.0 - 91.213.252.255 gb +91.213.252.0 - 91.213.252.255 de 91.213.253.0 - 91.213.254.255 tr 91.213.255.0 - 91.214.3.255 pl 91.214.4.0 - 91.214.7.255 gb @@ -56077,7 +30017,7 @@ 91.214.16.0 - 91.214.19.255 ua 91.214.20.0 - 91.214.23.255 dk 91.214.24.0 - 91.214.27.255 pl -91.214.28.0 - 91.214.35.255 ua +91.214.28.0 - 91.214.31.255 ua 91.214.36.0 - 91.214.39.255 pl 91.214.40.0 - 91.214.43.255 ru 91.214.44.0 - 91.214.47.255 lu @@ -56085,13 +30025,11 @@ 91.214.52.0 - 91.214.55.255 pl 91.214.56.0 - 91.214.59.255 ru 91.214.60.0 - 91.214.63.255 it -91.214.64.0 - 91.214.67.255 gb 91.214.68.0 - 91.214.71.255 ru 91.214.72.0 - 91.214.75.255 it 91.214.76.0 - 91.214.79.255 ru 91.214.80.0 - 91.214.87.255 ua 91.214.88.0 - 91.214.91.255 se -91.214.92.0 - 91.214.95.255 gb 91.214.96.0 - 91.214.99.255 ru 91.214.100.0 - 91.214.103.255 il 91.214.104.0 - 91.214.107.255 hr @@ -56099,8 +30037,7 @@ 91.214.112.0 - 91.214.115.255 ua 91.214.116.0 - 91.214.123.255 ru 91.214.124.0 - 91.214.139.255 ua -91.214.140.0 - 91.214.143.255 kz -91.214.144.0 - 91.214.151.255 ru +91.214.140.0 - 91.214.147.255 ru 91.214.152.0 - 91.214.155.255 kw 91.214.156.0 - 91.214.159.255 cz 91.214.160.0 - 91.214.163.255 ua @@ -56115,7 +30052,8 @@ 91.214.200.0 - 91.214.203.255 md 91.214.204.0 - 91.214.207.255 ru 91.214.208.0 - 91.214.211.255 ua -91.214.212.0 - 91.214.227.255 ru +91.214.212.0 - 91.214.215.255 ru +91.214.220.0 - 91.214.227.255 ru 91.214.228.0 - 91.214.231.255 gb 91.214.232.0 - 91.214.235.255 ua 91.214.236.0 - 91.214.239.255 pl @@ -56150,11 +30088,10 @@ 91.215.124.0 - 91.215.127.255 ua 91.215.128.0 - 91.215.131.255 ru 91.215.132.0 - 91.215.135.255 fi -91.215.136.0 - 91.215.139.255 ua -91.215.140.0 - 91.215.143.255 ru +91.215.136.0 - 91.215.143.255 ru 91.215.144.0 - 91.215.147.255 ua 91.215.148.0 - 91.215.151.255 nl -91.215.152.0 - 91.215.155.255 ru +91.215.152.0 - 91.215.155.255 bg 91.215.156.0 - 91.215.159.255 nl 91.215.160.0 - 91.215.163.255 dk 91.215.164.0 - 91.215.167.255 gb @@ -56179,9 +30116,9 @@ 91.216.5.0 - 91.216.5.255 pl 91.216.6.0 - 91.216.6.255 ie 91.216.7.0 - 91.216.7.255 se -91.216.8.0 - 91.216.9.255 gb +91.216.8.0 - 91.216.8.255 ro +91.216.9.0 - 91.216.9.255 gb 91.216.10.0 - 91.216.10.255 be -91.216.11.0 - 91.216.11.255 ua 91.216.12.0 - 91.216.12.255 es 91.216.13.0 - 91.216.13.255 de 91.216.14.0 - 91.216.14.255 dk @@ -56209,7 +30146,6 @@ 91.216.36.0 - 91.216.36.255 ch 91.216.37.0 - 91.216.37.255 gb 91.216.38.0 - 91.216.38.255 it -91.216.39.0 - 91.216.39.255 ua 91.216.40.0 - 91.216.40.255 gb 91.216.41.0 - 91.216.41.255 be 91.216.42.0 - 91.216.42.255 gb @@ -56217,7 +30153,7 @@ 91.216.44.0 - 91.216.44.255 hu 91.216.45.0 - 91.216.45.255 de 91.216.46.0 - 91.216.46.255 ru -91.216.47.0 - 91.216.47.255 ro +91.216.47.0 - 91.216.47.255 md 91.216.48.0 - 91.216.50.255 ru 91.216.51.0 - 91.216.51.255 pl 91.216.52.0 - 91.216.52.255 ro @@ -56227,7 +30163,7 @@ 91.216.56.0 - 91.216.56.255 eu 91.216.57.0 - 91.216.57.255 gb 91.216.58.0 - 91.216.58.255 fr -91.216.59.0 - 91.216.59.255 ru +91.216.59.0 - 91.216.59.255 sc 91.216.60.0 - 91.216.60.255 hu 91.216.61.0 - 91.216.61.255 ua 91.216.62.0 - 91.216.62.255 se @@ -56240,13 +30176,12 @@ 91.216.70.0 - 91.216.70.255 hu 91.216.71.0 - 91.216.71.255 bg 91.216.72.0 - 91.216.72.255 ru -91.216.73.0 - 91.216.73.255 lv -91.216.74.0 - 91.216.74.255 de +91.216.74.0 - 91.216.74.255 si 91.216.75.0 - 91.216.75.255 ro 91.216.76.0 - 91.216.76.255 gr 91.216.77.0 - 91.216.77.255 fi 91.216.78.0 - 91.216.78.255 ro -91.216.79.0 - 91.216.79.255 de +91.216.79.0 - 91.216.79.255 ch 91.216.80.0 - 91.216.80.255 ro 91.216.81.0 - 91.216.81.255 ru 91.216.82.0 - 91.216.82.255 gb @@ -56262,7 +30197,7 @@ 91.216.95.0 - 91.216.95.255 bg 91.216.96.0 - 91.216.96.255 ru 91.216.97.0 - 91.216.97.255 md -91.216.98.0 - 91.216.98.255 ru +91.216.98.0 - 91.216.98.255 tr 91.216.99.0 - 91.216.99.255 pl 91.216.100.0 - 91.216.100.255 nl 91.216.101.0 - 91.216.101.255 dk @@ -56286,7 +30221,6 @@ 91.216.119.0 - 91.216.119.255 tr 91.216.120.0 - 91.216.120.255 at 91.216.121.0 - 91.216.121.255 ru -91.216.122.0 - 91.216.122.255 md 91.216.123.0 - 91.216.123.255 ru 91.216.124.0 - 91.216.125.255 pl 91.216.126.0 - 91.216.126.255 ru @@ -56298,10 +30232,10 @@ 91.216.134.0 - 91.216.134.255 pl 91.216.135.0 - 91.216.135.255 ua 91.216.136.0 - 91.216.136.255 fi -91.216.137.0 - 91.216.138.255 gb +91.216.137.0 - 91.216.137.255 gb +91.216.138.0 - 91.216.138.255 ro 91.216.139.0 - 91.216.140.255 fr -91.216.141.0 - 91.216.141.255 eu -91.216.142.0 - 91.216.142.255 nl +91.216.141.0 - 91.216.142.255 nl 91.216.143.0 - 91.216.143.255 gb 91.216.144.0 - 91.216.144.255 ro 91.216.145.0 - 91.216.145.255 be @@ -56311,7 +30245,7 @@ 91.216.149.0 - 91.216.149.255 pl 91.216.150.0 - 91.216.150.255 hu 91.216.151.0 - 91.216.152.255 ro -91.216.153.0 - 91.216.154.255 eu +91.216.153.0 - 91.216.154.255 mt 91.216.155.0 - 91.216.155.255 es 91.216.156.0 - 91.216.157.255 ro 91.216.158.0 - 91.216.158.255 de @@ -56325,7 +30259,6 @@ 91.216.166.0 - 91.216.166.255 md 91.216.167.0 - 91.216.167.255 ru 91.216.168.0 - 91.216.168.255 cz -91.216.169.0 - 91.216.169.255 ae 91.216.170.0 - 91.216.170.255 tr 91.216.171.0 - 91.216.171.255 fr 91.216.172.0 - 91.216.172.255 si @@ -56346,7 +30279,6 @@ 91.216.187.0 - 91.216.187.255 ru 91.216.188.0 - 91.216.188.255 kw 91.216.189.0 - 91.216.189.255 kz -91.216.190.0 - 91.216.190.255 eu 91.216.191.0 - 91.216.192.255 pl 91.216.193.0 - 91.216.193.255 gb 91.216.194.0 - 91.216.194.255 pl @@ -56368,7 +30300,6 @@ 91.216.210.0 - 91.216.210.255 cy 91.216.211.0 - 91.216.212.255 ru 91.216.213.0 - 91.216.214.255 pl -91.216.215.0 - 91.216.215.255 ru 91.216.216.0 - 91.216.216.255 de 91.216.217.0 - 91.216.217.255 ru 91.216.218.0 - 91.216.219.255 es @@ -56401,8 +30332,7 @@ 91.216.247.0 - 91.216.247.255 at 91.216.248.0 - 91.216.248.255 de 91.216.249.0 - 91.216.249.255 at -91.216.250.0 - 91.216.250.255 ru -91.216.251.0 - 91.216.251.255 ua +91.216.250.0 - 91.216.251.255 ua 91.216.252.0 - 91.216.252.255 il 91.216.253.0 - 91.216.253.255 bg 91.216.254.0 - 91.216.254.255 pl @@ -56410,14 +30340,12 @@ 91.217.0.0 - 91.217.1.255 pl 91.217.2.0 - 91.217.3.255 ru 91.217.4.0 - 91.217.5.255 ua -91.217.6.0 - 91.217.7.255 ru 91.217.8.0 - 91.217.13.255 ua 91.217.14.0 - 91.217.15.255 rs 91.217.16.0 - 91.217.17.255 ru 91.217.18.0 - 91.217.19.255 pl 91.217.20.0 - 91.217.21.255 ru -91.217.22.0 - 91.217.23.255 ua -91.217.24.0 - 91.217.25.255 pl +91.217.22.0 - 91.217.25.255 pl 91.217.26.0 - 91.217.29.255 ro 91.217.30.0 - 91.217.31.255 nl 91.217.32.0 - 91.217.33.255 sk @@ -56441,8 +30369,8 @@ 91.217.72.0 - 91.217.73.255 gb 91.217.74.0 - 91.217.77.255 ru 91.217.78.0 - 91.217.79.255 ua -91.217.80.0 - 91.217.83.255 ro -91.217.84.0 - 91.217.85.255 nl +91.217.82.0 - 91.217.83.255 ro +91.217.84.0 - 91.217.85.255 gb 91.217.86.0 - 91.217.87.255 de 91.217.88.0 - 91.217.89.255 ie 91.217.90.0 - 91.217.91.255 ua @@ -56459,7 +30387,6 @@ 91.217.114.0 - 91.217.115.255 pl 91.217.116.0 - 91.217.117.255 fi 91.217.118.0 - 91.217.119.255 at -91.217.120.0 - 91.217.121.255 ru 91.217.122.0 - 91.217.123.255 si 91.217.124.0 - 91.217.125.255 ru 91.217.126.0 - 91.217.127.255 si @@ -56472,7 +30399,6 @@ 91.217.134.0 - 91.217.135.255 gb 91.217.136.0 - 91.217.137.255 ru 91.217.138.0 - 91.217.138.255 me -91.217.139.0 - 91.217.139.255 ch 91.217.140.0 - 91.217.140.255 fr 91.217.141.0 - 91.217.141.255 de 91.217.142.0 - 91.217.142.255 pl @@ -56486,7 +30412,7 @@ 91.217.150.0 - 91.217.150.255 pl 91.217.151.0 - 91.217.151.255 fr 91.217.152.0 - 91.217.152.255 pl -91.217.153.0 - 91.217.153.255 ua +91.217.153.0 - 91.217.153.255 lv 91.217.154.0 - 91.217.154.255 fr 91.217.155.0 - 91.217.155.255 gr 91.217.156.0 - 91.217.156.255 ru @@ -56495,11 +30421,11 @@ 91.217.159.0 - 91.217.159.255 ru 91.217.160.0 - 91.217.160.255 gb 91.217.161.0 - 91.217.161.255 pl -91.217.162.0 - 91.217.162.255 ua +91.217.162.0 - 91.217.162.255 ru 91.217.163.0 - 91.217.163.255 pl 91.217.164.0 - 91.217.164.255 fr 91.217.165.0 - 91.217.165.255 de -91.217.166.0 - 91.217.167.255 ua +91.217.166.0 - 91.217.166.255 ua 91.217.168.0 - 91.217.168.255 fr 91.217.169.0 - 91.217.169.255 hu 91.217.170.0 - 91.217.170.255 ch @@ -56508,7 +30434,7 @@ 91.217.173.0 - 91.217.173.255 at 91.217.174.0 - 91.217.176.255 de 91.217.177.0 - 91.217.177.255 lb -91.217.178.0 - 91.217.178.255 sc +91.217.178.0 - 91.217.178.255 ru 91.217.179.0 - 91.217.179.255 ua 91.217.180.0 - 91.217.180.255 ru 91.217.181.0 - 91.217.181.255 se @@ -56519,7 +30445,7 @@ 91.217.186.0 - 91.217.186.255 se 91.217.187.0 - 91.217.187.255 ro 91.217.188.0 - 91.217.188.255 de -91.217.189.0 - 91.217.189.255 nl +91.217.189.0 - 91.217.189.255 se 91.217.190.0 - 91.217.190.255 ru 91.217.191.0 - 91.217.191.255 nl 91.217.192.0 - 91.217.192.255 ru @@ -56528,14 +30454,12 @@ 91.217.197.0 - 91.217.197.255 ua 91.217.198.0 - 91.217.198.255 pl 91.217.199.0 - 91.217.199.255 de -91.217.200.0 - 91.217.200.255 ru 91.217.201.0 - 91.217.201.255 dk 91.217.202.0 - 91.217.202.255 ru 91.217.203.0 - 91.217.203.255 ro 91.217.204.0 - 91.217.204.255 pl 91.217.205.0 - 91.217.205.255 bg 91.217.206.0 - 91.217.206.255 de -91.217.207.0 - 91.217.207.255 ru 91.217.208.0 - 91.217.208.255 pl 91.217.209.0 - 91.217.209.255 se 91.217.210.0 - 91.217.210.255 nl @@ -56550,7 +30474,6 @@ 91.217.220.0 - 91.217.220.255 ru 91.217.221.0 - 91.217.221.255 pl 91.217.222.0 - 91.217.222.255 si -91.217.223.0 - 91.217.223.255 nl 91.217.224.0 - 91.217.224.255 pl 91.217.225.0 - 91.217.226.255 at 91.217.227.0 - 91.217.227.255 ru @@ -56565,7 +30488,6 @@ 91.217.236.0 - 91.217.236.255 ru 91.217.237.0 - 91.217.237.255 gb 91.217.238.0 - 91.217.238.255 tr -91.217.239.0 - 91.217.239.255 ru 91.217.240.0 - 91.217.240.255 ua 91.217.241.0 - 91.217.241.255 ch 91.217.242.0 - 91.217.242.255 pl @@ -56575,24 +30497,20 @@ 91.217.246.0 - 91.217.246.255 cy 91.217.247.0 - 91.217.247.255 ch 91.217.248.0 - 91.217.248.255 fi -91.217.249.0 - 91.217.250.255 ru 91.217.251.0 - 91.217.251.255 de 91.217.252.0 - 91.217.252.255 fi -91.217.253.0 - 91.217.254.255 ua +91.217.254.0 - 91.217.254.255 ua 91.217.255.0 - 91.217.255.255 si 91.218.0.0 - 91.218.3.255 ro 91.218.4.0 - 91.218.7.255 am 91.218.8.0 - 91.218.11.255 ru 91.218.12.0 - 91.218.19.255 ua -91.218.20.0 - 91.218.23.255 es 91.218.24.0 - 91.218.27.255 ru 91.218.28.0 - 91.218.39.255 ua 91.218.40.0 - 91.218.43.255 ru 91.218.44.0 - 91.218.51.255 ua 91.218.52.0 - 91.218.55.255 lv -91.218.56.0 - 91.218.59.255 ru 91.218.60.0 - 91.218.63.255 pl -91.218.64.0 - 91.218.67.255 ua 91.218.68.0 - 91.218.71.255 pl 91.218.72.0 - 91.218.75.255 ua 91.218.76.0 - 91.218.79.255 pl @@ -56603,16 +30521,16 @@ 91.218.96.0 - 91.218.99.255 ua 91.218.100.0 - 91.218.103.255 ru 91.218.104.0 - 91.218.107.255 ua -91.218.108.0 - 91.218.111.255 ru -91.218.112.0 - 91.218.115.255 de -91.218.116.0 - 91.218.119.255 ru +91.218.108.0 - 91.218.119.255 ru 91.218.120.0 - 91.218.123.255 us 91.218.124.0 - 91.218.127.255 nl -91.218.128.0 - 91.218.147.255 ru +91.218.128.0 - 91.218.131.255 ru +91.218.132.0 - 91.218.132.255 ua +91.218.133.0 - 91.218.147.255 ru 91.218.148.0 - 91.218.151.255 nl 91.218.152.0 - 91.218.155.255 ro 91.218.156.0 - 91.218.159.255 pl -91.218.160.0 - 91.218.163.255 ru +91.218.160.0 - 91.218.163.255 tj 91.218.164.0 - 91.218.167.255 pl 91.218.168.0 - 91.218.171.255 tj 91.218.172.0 - 91.218.175.255 rs @@ -56630,7 +30548,7 @@ 91.218.224.0 - 91.218.227.255 it 91.218.228.0 - 91.218.231.255 ru 91.218.232.0 - 91.218.235.255 cz -91.218.236.0 - 91.218.239.255 ro +91.218.236.0 - 91.218.239.255 gb 91.218.240.0 - 91.218.243.255 pl 91.218.244.0 - 91.218.251.255 ru 91.218.252.0 - 91.218.255.255 ro @@ -56640,7 +30558,10 @@ 91.219.12.0 - 91.219.15.255 ru 91.219.16.0 - 91.219.19.255 ro 91.219.20.0 - 91.219.27.255 ru -91.219.28.0 - 91.219.35.255 ua +91.219.28.0 - 91.219.28.255 nl +91.219.29.0 - 91.219.30.255 ua +91.219.31.0 - 91.219.31.255 ru +91.219.32.0 - 91.219.35.255 ua 91.219.36.0 - 91.219.39.255 ru 91.219.40.0 - 91.219.43.255 gb 91.219.44.0 - 91.219.47.255 cz @@ -56655,7 +30576,7 @@ 91.219.80.0 - 91.219.83.255 ua 91.219.84.0 - 91.219.87.255 hu 91.219.88.0 - 91.219.91.255 ru -91.219.92.0 - 91.219.95.255 ro +91.219.92.0 - 91.219.95.255 sa 91.219.96.0 - 91.219.103.255 ru 91.219.104.0 - 91.219.107.255 pl 91.219.108.0 - 91.219.111.255 nl @@ -56681,13 +30602,12 @@ 91.219.212.0 - 91.219.215.255 ro 91.219.216.0 - 91.219.219.255 se 91.219.220.0 - 91.219.223.255 ua -91.219.224.0 - 91.219.231.255 ru -91.219.232.0 - 91.219.235.255 ua +91.219.224.0 - 91.219.235.255 ru 91.219.236.0 - 91.219.239.255 hu 91.219.240.0 - 91.219.247.255 cz 91.219.248.0 - 91.219.251.255 ru 91.219.252.0 - 91.219.255.255 ua -91.220.0.0 - 91.220.0.255 lv +91.220.0.0 - 91.220.0.255 pl 91.220.1.0 - 91.220.1.255 ru 91.220.2.0 - 91.220.2.255 at 91.220.3.0 - 91.220.3.255 ua @@ -56711,7 +30631,6 @@ 91.220.24.0 - 91.220.25.255 gb 91.220.26.0 - 91.220.26.255 ro 91.220.27.0 - 91.220.27.255 fr -91.220.28.0 - 91.220.28.255 nl 91.220.29.0 - 91.220.29.255 hu 91.220.30.0 - 91.220.30.255 nl 91.220.31.0 - 91.220.31.255 ru @@ -56726,7 +30645,7 @@ 91.220.40.0 - 91.220.40.255 ch 91.220.41.0 - 91.220.41.255 cy 91.220.42.0 - 91.220.42.255 gb -91.220.43.0 - 91.220.43.255 ru +91.220.43.0 - 91.220.43.255 lv 91.220.44.0 - 91.220.44.255 pl 91.220.45.0 - 91.220.45.255 ie 91.220.46.0 - 91.220.46.255 ru @@ -56745,7 +30664,7 @@ 91.220.59.0 - 91.220.59.255 lt 91.220.60.0 - 91.220.61.255 ua 91.220.62.0 - 91.220.62.255 ru -91.220.63.0 - 91.220.63.255 md +91.220.63.0 - 91.220.63.255 ro 91.220.64.0 - 91.220.64.255 ch 91.220.65.0 - 91.220.65.255 tr 91.220.66.0 - 91.220.66.255 es @@ -56753,26 +30672,23 @@ 91.220.68.0 - 91.220.68.255 be 91.220.69.0 - 91.220.69.255 ru 91.220.70.0 - 91.220.70.255 gb -91.220.71.0 - 91.220.71.255 de 91.220.72.0 - 91.220.72.255 ro 91.220.73.0 - 91.220.73.255 pl 91.220.74.0 - 91.220.74.255 de 91.220.75.0 - 91.220.75.255 ro 91.220.76.0 - 91.220.76.255 ru -91.220.77.0 - 91.220.77.255 hr +91.220.77.0 - 91.220.77.255 ch 91.220.78.0 - 91.220.78.255 si 91.220.79.0 - 91.220.79.255 ir 91.220.80.0 - 91.220.80.255 ua 91.220.81.0 - 91.220.81.255 ru 91.220.82.0 - 91.220.82.255 nl 91.220.83.0 - 91.220.83.255 gb -91.220.84.0 - 91.220.84.255 ru 91.220.85.0 - 91.220.85.255 fr 91.220.86.0 - 91.220.86.255 ro 91.220.87.0 - 91.220.87.255 ru 91.220.88.0 - 91.220.88.255 nl 91.220.89.0 - 91.220.89.255 at -91.220.90.0 - 91.220.90.255 ru 91.220.91.0 - 91.220.91.255 ua 91.220.92.0 - 91.220.93.255 ru 91.220.94.0 - 91.220.94.255 md @@ -56806,7 +30722,6 @@ 91.220.123.0 - 91.220.123.255 nl 91.220.124.0 - 91.220.124.255 am 91.220.125.0 - 91.220.125.255 de -91.220.126.0 - 91.220.126.255 ru 91.220.127.0 - 91.220.127.255 gb 91.220.128.0 - 91.220.128.255 ch 91.220.129.0 - 91.220.129.255 de @@ -56854,7 +30769,6 @@ 91.220.173.0 - 91.220.173.255 ru 91.220.174.0 - 91.220.174.255 ua 91.220.175.0 - 91.220.175.255 gb -91.220.176.0 - 91.220.176.255 sc 91.220.177.0 - 91.220.177.255 pl 91.220.178.0 - 91.220.178.255 gb 91.220.179.0 - 91.220.179.255 at @@ -56863,7 +30777,6 @@ 91.220.182.0 - 91.220.182.255 tr 91.220.183.0 - 91.220.183.255 ro 91.220.184.0 - 91.220.185.255 nl -91.220.186.0 - 91.220.186.255 ru 91.220.187.0 - 91.220.187.255 me 91.220.188.0 - 91.220.188.255 ru 91.220.189.0 - 91.220.189.255 bg @@ -56878,9 +30791,8 @@ 91.220.198.0 - 91.220.198.255 ua 91.220.199.0 - 91.220.199.255 gb 91.220.200.0 - 91.220.200.255 fr -91.220.201.0 - 91.220.201.255 nl -91.220.202.0 - 91.220.202.255 ru -91.220.203.0 - 91.220.204.255 ua +91.220.201.0 - 91.220.201.255 cz +91.220.204.0 - 91.220.204.255 ua 91.220.205.0 - 91.220.205.255 pl 91.220.206.0 - 91.220.206.255 ru 91.220.207.0 - 91.220.207.255 md @@ -56903,7 +30815,6 @@ 91.220.226.0 - 91.220.226.255 es 91.220.227.0 - 91.220.227.255 se 91.220.228.0 - 91.220.228.255 de -91.220.229.0 - 91.220.229.255 es 91.220.230.0 - 91.220.230.255 ua 91.220.231.0 - 91.220.231.255 gb 91.220.232.0 - 91.220.232.255 ro @@ -56957,11 +30868,11 @@ 91.221.62.0 - 91.221.63.255 lv 91.221.64.0 - 91.221.65.255 ua 91.221.66.0 - 91.221.67.255 fi -91.221.68.0 - 91.221.69.255 gb +91.221.68.0 - 91.221.68.255 ru +91.221.69.0 - 91.221.69.255 nl 91.221.70.0 - 91.221.71.255 ru 91.221.72.0 - 91.221.73.255 cz 91.221.74.0 - 91.221.75.255 ua -91.221.76.0 - 91.221.77.255 ru 91.221.78.0 - 91.221.79.255 ro 91.221.80.0 - 91.221.81.255 ru 91.221.82.0 - 91.221.83.255 gb @@ -56969,18 +30880,16 @@ 91.221.86.0 - 91.221.87.255 ru 91.221.88.0 - 91.221.89.255 pl 91.221.90.0 - 91.221.91.255 ru -91.221.92.0 - 91.221.93.255 sk 91.221.94.0 - 91.221.95.255 ro 91.221.96.0 - 91.221.97.255 nl -91.221.98.0 - 91.221.99.255 lv +91.221.98.0 - 91.221.98.255 ru +91.221.99.0 - 91.221.99.255 nl 91.221.100.0 - 91.221.101.255 at 91.221.102.0 - 91.221.103.255 ru 91.221.104.0 - 91.221.105.255 de -91.221.106.0 - 91.221.107.255 ru -91.221.108.0 - 91.221.109.255 cz +91.221.106.0 - 91.221.109.255 ru 91.221.110.0 - 91.221.113.255 sk 91.221.114.0 - 91.221.115.255 pl -91.221.116.0 - 91.221.117.255 ru 91.221.118.0 - 91.221.119.255 ch 91.221.120.0 - 91.221.121.255 de 91.221.122.0 - 91.221.123.255 pl @@ -57030,7 +30939,7 @@ 91.221.216.0 - 91.221.217.255 rs 91.221.218.0 - 91.221.219.255 ua 91.221.220.0 - 91.221.221.255 kw -91.221.222.0 - 91.221.223.255 us +91.221.222.0 - 91.221.223.255 cy 91.221.224.0 - 91.221.225.255 fr 91.221.226.0 - 91.221.227.255 de 91.221.228.0 - 91.221.229.255 am @@ -57042,8 +30951,7 @@ 91.221.240.0 - 91.221.241.255 ro 91.221.242.0 - 91.221.243.255 ru 91.221.244.0 - 91.221.245.255 fr -91.221.246.0 - 91.221.249.255 ru -91.221.250.0 - 91.221.251.255 de +91.221.246.0 - 91.221.251.255 ru 91.221.252.0 - 91.221.253.255 ua 91.221.254.0 - 91.221.255.255 fr 91.222.0.0 - 91.222.3.255 ua @@ -57055,7 +30963,7 @@ 91.222.28.0 - 91.222.31.255 ru 91.222.32.0 - 91.222.43.255 ua 91.222.44.0 - 91.222.47.255 de -91.222.48.0 - 91.222.51.255 ua +91.222.48.0 - 91.222.51.255 ru 91.222.52.0 - 91.222.55.255 cz 91.222.56.0 - 91.222.59.255 pl 91.222.60.0 - 91.222.67.255 ua @@ -57128,7 +31036,7 @@ 91.223.29.0 - 91.223.29.255 hr 91.223.30.0 - 91.223.30.255 ua 91.223.31.0 - 91.223.31.255 pl -91.223.32.0 - 91.223.32.255 es +91.223.32.0 - 91.223.32.255 ru 91.223.33.0 - 91.223.33.255 pl 91.223.34.0 - 91.223.34.255 ru 91.223.35.0 - 91.223.35.255 fr @@ -57166,12 +31074,10 @@ 91.223.67.0 - 91.223.67.255 gb 91.223.68.0 - 91.223.68.255 pl 91.223.69.0 - 91.223.69.255 sk -91.223.70.0 - 91.223.70.255 lv 91.223.71.0 - 91.223.71.255 fr 91.223.72.0 - 91.223.72.255 pl 91.223.73.0 - 91.223.73.255 fr 91.223.74.0 - 91.223.74.255 cz -91.223.75.0 - 91.223.75.255 ru 91.223.76.0 - 91.223.76.255 fr 91.223.77.0 - 91.223.77.255 ua 91.223.78.0 - 91.223.78.255 pl @@ -57184,8 +31090,8 @@ 91.223.85.0 - 91.223.85.255 dk 91.223.86.0 - 91.223.86.255 ua 91.223.87.0 - 91.223.87.255 ie -91.223.88.0 - 91.223.88.255 ua -91.223.89.0 - 91.223.90.255 ru +91.223.88.0 - 91.223.89.255 ua +91.223.90.0 - 91.223.90.255 ru 91.223.91.0 - 91.223.91.255 at 91.223.92.0 - 91.223.92.255 se 91.223.93.0 - 91.223.93.255 ru @@ -57194,7 +31100,6 @@ 91.223.96.0 - 91.223.96.255 de 91.223.97.0 - 91.223.97.255 ua 91.223.98.0 - 91.223.98.255 ru -91.223.99.0 - 91.223.99.255 ro 91.223.100.0 - 91.223.100.255 no 91.223.101.0 - 91.223.101.255 at 91.223.102.0 - 91.223.103.255 ua @@ -57212,12 +31117,11 @@ 91.223.116.0 - 91.223.116.255 fi 91.223.117.0 - 91.223.117.255 ro 91.223.118.0 - 91.223.118.255 ru -91.223.119.0 - 91.223.119.255 de +91.223.119.0 - 91.223.119.255 pl 91.223.120.0 - 91.223.120.255 ru 91.223.121.0 - 91.223.121.255 ch 91.223.122.0 - 91.223.122.255 ua -91.223.123.0 - 91.223.123.255 es -91.223.124.0 - 91.223.124.255 nl +91.223.123.0 - 91.223.124.255 nl 91.223.125.0 - 91.223.125.255 fr 91.223.126.0 - 91.223.126.255 gb 91.223.127.0 - 91.223.127.255 ua @@ -57254,12 +31158,10 @@ 91.223.160.0 - 91.223.160.255 pl 91.223.161.0 - 91.223.161.255 im 91.223.162.0 - 91.223.162.255 rs -91.223.163.0 - 91.223.163.255 ro 91.223.164.0 - 91.223.164.255 cy 91.223.165.0 - 91.223.165.255 lv 91.223.166.0 - 91.223.166.255 si 91.223.167.0 - 91.223.168.255 pl -91.223.169.0 - 91.223.169.255 lv 91.223.170.0 - 91.223.170.255 ru 91.223.171.0 - 91.223.171.255 pl 91.223.172.0 - 91.223.172.255 nl @@ -57281,7 +31183,7 @@ 91.223.188.0 - 91.223.188.255 ru 91.223.189.0 - 91.223.189.255 si 91.223.190.0 - 91.223.190.255 ro -91.223.191.0 - 91.223.191.255 us +91.223.191.0 - 91.223.191.255 nl 91.223.192.0 - 91.223.192.255 dk 91.223.193.0 - 91.223.193.255 si 91.223.194.0 - 91.223.194.255 ru @@ -57291,6 +31193,7 @@ 91.223.198.0 - 91.223.198.255 de 91.223.199.0 - 91.223.199.255 ru 91.223.200.0 - 91.223.200.255 ro +91.223.201.0 - 91.223.201.255 at 91.223.202.0 - 91.223.202.255 de 91.223.203.0 - 91.223.203.255 gb 91.223.204.0 - 91.223.204.255 de @@ -57308,6 +31211,7 @@ 91.223.216.0 - 91.223.216.255 ua 91.223.217.0 - 91.223.217.255 ru 91.223.218.0 - 91.223.218.255 gb +91.223.219.0 - 91.223.219.255 se 91.223.220.0 - 91.223.220.255 nl 91.223.221.0 - 91.223.221.255 pl 91.223.222.0 - 91.223.222.255 hu @@ -57367,10 +31271,9 @@ 91.224.52.0 - 91.224.53.255 ru 91.224.54.0 - 91.224.55.255 nl 91.224.56.0 - 91.224.57.255 pl -91.224.58.0 - 91.224.59.255 gb +91.224.58.0 - 91.224.59.255 cz 91.224.60.0 - 91.224.61.255 pl 91.224.62.0 - 91.224.63.255 ru -91.224.64.0 - 91.224.65.255 ua 91.224.66.0 - 91.224.67.255 at 91.224.68.0 - 91.224.69.255 ua 91.224.70.0 - 91.224.71.255 at @@ -57379,14 +31282,14 @@ 91.224.76.0 - 91.224.77.255 ru 91.224.78.0 - 91.224.79.255 ua 91.224.80.0 - 91.224.83.255 ru -91.224.84.0 - 91.224.87.255 ua +91.224.84.0 - 91.224.85.255 ua +91.224.86.0 - 91.224.87.255 ru 91.224.88.0 - 91.224.89.255 fi 91.224.90.0 - 91.224.91.255 cz 91.224.92.0 - 91.224.93.255 lt 91.224.94.0 - 91.224.95.255 ch 91.224.96.0 - 91.224.97.255 ua 91.224.98.0 - 91.224.99.255 ru -91.224.100.0 - 91.224.101.255 ro 91.224.102.0 - 91.224.103.255 ru 91.224.104.0 - 91.224.105.255 pl 91.224.106.0 - 91.224.107.255 ru @@ -57429,8 +31332,7 @@ 91.224.194.0 - 91.224.195.255 ru 91.224.196.0 - 91.224.199.255 pl 91.224.200.0 - 91.224.203.255 ua -91.224.204.0 - 91.224.205.255 ro -91.224.206.0 - 91.224.209.255 ru +91.224.204.0 - 91.224.209.255 ru 91.224.210.0 - 91.224.211.255 dk 91.224.212.0 - 91.224.213.255 ro 91.224.214.0 - 91.224.217.255 pl @@ -57439,7 +31341,6 @@ 91.224.222.0 - 91.224.223.255 ua 91.224.224.0 - 91.224.225.255 pl 91.224.226.0 - 91.224.227.255 de -91.224.228.0 - 91.224.229.255 ru 91.224.230.0 - 91.224.231.255 fr 91.224.232.0 - 91.224.235.255 ru 91.224.236.0 - 91.224.237.255 pl @@ -57447,7 +31348,6 @@ 91.224.240.0 - 91.224.241.255 es 91.224.242.0 - 91.224.243.255 nl 91.224.244.0 - 91.224.245.255 se -91.224.246.0 - 91.224.247.255 lv 91.224.248.0 - 91.224.249.255 nl 91.224.250.0 - 91.224.251.255 rs 91.224.252.0 - 91.224.255.255 ua @@ -57488,13 +31388,15 @@ 91.225.184.0 - 91.225.191.255 pl 91.225.192.0 - 91.225.195.255 ru 91.225.196.0 - 91.225.203.255 ua -91.225.204.0 - 91.225.207.255 ro +91.225.204.0 - 91.225.207.255 sa 91.225.208.0 - 91.225.219.255 ru 91.225.220.0 - 91.225.235.255 ua 91.225.236.0 - 91.225.239.255 ru 91.225.240.0 - 91.225.243.255 pl 91.225.244.0 - 91.225.247.255 it -91.225.248.0 - 91.225.251.255 us +91.225.248.0 - 91.225.249.255 us +91.225.250.0 - 91.225.250.255 ie +91.225.251.0 - 91.225.251.255 us 91.225.252.0 - 91.225.255.255 ru 91.226.0.0 - 91.226.1.255 gb 91.226.2.0 - 91.226.3.255 ro @@ -57523,17 +31425,14 @@ 91.226.56.0 - 91.226.59.255 ua 91.226.60.0 - 91.226.67.255 ru 91.226.68.0 - 91.226.71.255 pl -91.226.72.0 - 91.226.72.255 ua 91.226.73.0 - 91.226.73.255 ru 91.226.74.0 - 91.226.75.255 it -91.226.76.0 - 91.226.76.255 ru 91.226.77.0 - 91.226.77.255 si -91.226.78.0 - 91.226.78.255 ru 91.226.79.0 - 91.226.79.255 hu 91.226.80.0 - 91.226.83.255 ru -91.226.84.0 - 91.226.87.255 ro 91.226.88.0 - 91.226.91.255 de -91.226.92.0 - 91.226.97.255 ru +91.226.92.0 - 91.226.95.255 ru +91.226.97.0 - 91.226.97.255 ru 91.226.98.0 - 91.226.98.255 fr 91.226.99.0 - 91.226.99.255 nl 91.226.100.0 - 91.226.103.255 pl @@ -57551,7 +31450,7 @@ 91.226.136.0 - 91.226.137.255 ru 91.226.138.0 - 91.226.139.255 ua 91.226.140.0 - 91.226.143.255 ru -91.226.144.0 - 91.226.145.255 dk +91.226.144.0 - 91.226.145.255 se 91.226.146.0 - 91.226.146.255 pl 91.226.147.0 - 91.226.147.255 it 91.226.148.0 - 91.226.155.255 ru @@ -57568,8 +31467,7 @@ 91.226.179.0 - 91.226.179.255 ge 91.226.180.0 - 91.226.180.255 se 91.226.181.0 - 91.226.181.255 gb -91.226.182.0 - 91.226.183.255 be -91.226.184.0 - 91.226.184.255 de +91.226.182.0 - 91.226.183.255 nl 91.226.185.0 - 91.226.186.255 ru 91.226.187.0 - 91.226.187.255 ua 91.226.188.0 - 91.226.189.255 ru @@ -57586,8 +31484,8 @@ 91.226.212.0 - 91.226.213.255 ua 91.226.214.0 - 91.226.215.255 fr 91.226.216.0 - 91.226.219.255 cz -91.226.220.0 - 91.226.220.255 eu -91.226.221.0 - 91.226.223.255 ru +91.226.220.0 - 91.226.220.255 al +91.226.222.0 - 91.226.223.255 ru 91.226.224.0 - 91.226.225.255 ir 91.226.226.0 - 91.226.227.255 bg 91.226.228.0 - 91.226.233.255 pl @@ -57639,7 +31537,7 @@ 91.227.78.0 - 91.227.78.255 gb 91.227.79.0 - 91.227.79.255 ru 91.227.80.0 - 91.227.83.255 pl -91.227.84.0 - 91.227.87.255 ru +91.227.84.0 - 91.227.87.255 ir 91.227.88.0 - 91.227.89.255 pl 91.227.90.0 - 91.227.90.255 ro 91.227.91.0 - 91.227.95.255 ru @@ -57653,17 +31551,14 @@ 91.227.110.0 - 91.227.111.255 si 91.227.112.0 - 91.227.113.255 ru 91.227.114.0 - 91.227.114.255 nl -91.227.115.0 - 91.227.115.255 sk -91.227.116.0 - 91.227.120.255 pl +91.227.115.0 - 91.227.120.255 pl 91.227.121.0 - 91.227.121.255 md 91.227.122.0 - 91.227.123.255 pl 91.227.124.0 - 91.227.127.255 gb 91.227.128.0 - 91.227.130.255 at 91.227.131.0 - 91.227.131.255 ro -91.227.132.0 - 91.227.133.255 pl 91.227.134.0 - 91.227.135.255 cz 91.227.136.0 - 91.227.136.255 ru -91.227.137.0 - 91.227.137.255 fr 91.227.138.0 - 91.227.139.255 hu 91.227.140.0 - 91.227.143.255 ru 91.227.144.0 - 91.227.147.255 kz @@ -57675,9 +31570,7 @@ 91.227.164.0 - 91.227.165.255 il 91.227.166.0 - 91.227.166.255 ro 91.227.167.0 - 91.227.167.255 pl -91.227.168.0 - 91.227.169.255 ru -91.227.170.0 - 91.227.171.255 no -91.227.172.0 - 91.227.175.255 ru +91.227.168.0 - 91.227.175.255 ru 91.227.176.0 - 91.227.176.255 pl 91.227.177.0 - 91.227.177.255 dk 91.227.178.0 - 91.227.178.255 gb @@ -57704,14 +31597,13 @@ 91.227.224.0 - 91.227.227.255 sk 91.227.228.0 - 91.227.228.255 ru 91.227.229.0 - 91.227.229.255 nl -91.227.230.0 - 91.227.231.255 ro +91.227.230.0 - 91.227.231.255 at 91.227.232.0 - 91.227.235.255 cz 91.227.236.0 - 91.227.239.255 ro 91.227.240.0 - 91.227.244.255 ru -91.227.245.0 - 91.227.247.255 gb +91.227.245.0 - 91.227.245.255 gb 91.227.248.0 - 91.227.251.255 no 91.227.252.0 - 91.227.252.255 ch -91.227.253.0 - 91.227.253.255 gb 91.227.254.0 - 91.227.254.255 ua 91.227.255.0 - 91.227.255.255 ge 91.228.0.0 - 91.228.3.255 gb @@ -57730,7 +31622,8 @@ 91.228.32.0 - 91.228.35.255 pl 91.228.36.0 - 91.228.37.255 ro 91.228.38.0 - 91.228.38.255 bg -91.228.39.0 - 91.228.41.255 ru +91.228.39.0 - 91.228.39.255 kz +91.228.40.0 - 91.228.41.255 ru 91.228.42.0 - 91.228.43.255 pl 91.228.44.0 - 91.228.47.255 cz 91.228.48.0 - 91.228.51.255 ru @@ -57753,7 +31646,7 @@ 91.228.92.0 - 91.228.95.255 pl 91.228.96.0 - 91.228.99.255 ru 91.228.100.0 - 91.228.100.255 cz -91.228.101.0 - 91.228.101.255 ch +91.228.101.0 - 91.228.101.255 de 91.228.102.0 - 91.228.103.255 ru 91.228.104.0 - 91.228.107.255 de 91.228.108.0 - 91.228.111.255 md @@ -57767,27 +31660,26 @@ 91.228.124.0 - 91.228.124.255 ru 91.228.125.0 - 91.228.125.255 pl 91.228.126.0 - 91.228.127.255 il -91.228.128.0 - 91.228.131.255 ro -91.228.132.0 - 91.228.135.255 ru +91.228.128.0 - 91.228.131.255 sa +91.228.135.0 - 91.228.135.255 ru 91.228.136.0 - 91.228.139.255 pl 91.228.140.0 - 91.228.145.255 ro 91.228.146.0 - 91.228.147.255 ua 91.228.148.0 - 91.228.149.255 ru -91.228.150.0 - 91.228.150.255 ch +91.228.150.0 - 91.228.150.255 de 91.228.151.0 - 91.228.151.255 nl -91.228.152.0 - 91.228.155.255 ru +91.228.152.0 - 91.228.155.255 de 91.228.156.0 - 91.228.159.255 pl -91.228.160.0 - 91.228.161.255 ru +91.228.161.0 - 91.228.161.255 ru 91.228.162.0 - 91.228.163.255 il 91.228.164.0 - 91.228.167.255 sk 91.228.168.0 - 91.228.168.255 fr 91.228.169.0 - 91.228.169.255 tr 91.228.170.0 - 91.228.171.255 de -91.228.172.0 - 91.228.175.255 ru 91.228.176.0 - 91.228.176.255 nl 91.228.177.0 - 91.228.184.255 ru 91.228.185.0 - 91.228.185.255 pl -91.228.186.0 - 91.228.187.255 ua +91.228.186.0 - 91.228.187.255 gb 91.228.188.0 - 91.228.188.255 fr 91.228.189.0 - 91.228.189.255 ir 91.228.190.0 - 91.228.191.255 de @@ -57804,10 +31696,9 @@ 91.228.214.0 - 91.228.214.255 no 91.228.215.0 - 91.228.215.255 be 91.228.216.0 - 91.228.219.255 cz -91.228.220.0 - 91.228.227.255 ru -91.228.228.0 - 91.228.229.255 ua +91.228.220.0 - 91.228.228.255 ru +91.228.229.0 - 91.228.229.255 ua 91.228.230.0 - 91.228.230.255 ru -91.228.231.0 - 91.228.231.255 ua 91.228.232.0 - 91.228.234.255 gb 91.228.235.0 - 91.228.235.255 de 91.228.236.0 - 91.228.236.255 ua @@ -57828,7 +31719,6 @@ 91.229.2.0 - 91.229.2.255 ru 91.229.3.0 - 91.229.3.255 de 91.229.4.0 - 91.229.4.255 gb -91.229.5.0 - 91.229.5.255 ru 91.229.6.0 - 91.229.7.255 ro 91.229.8.0 - 91.229.11.255 ru 91.229.12.0 - 91.229.19.255 ro @@ -57836,8 +31726,7 @@ 91.229.21.0 - 91.229.21.255 no 91.229.22.0 - 91.229.22.255 pl 91.229.23.0 - 91.229.23.255 nl -91.229.24.0 - 91.229.24.255 sk -91.229.25.0 - 91.229.25.255 ru +91.229.24.0 - 91.229.24.255 cz 91.229.26.0 - 91.229.27.255 pl 91.229.28.0 - 91.229.29.255 sk 91.229.30.0 - 91.229.31.255 ro @@ -57846,12 +31735,10 @@ 91.229.36.0 - 91.229.39.255 sk 91.229.40.0 - 91.229.43.255 pl 91.229.44.0 - 91.229.45.255 tr -91.229.46.0 - 91.229.47.255 ua 91.229.48.0 - 91.229.48.255 ru 91.229.49.0 - 91.229.49.255 nl 91.229.50.0 - 91.229.51.255 ru 91.229.52.0 - 91.229.55.255 ua -91.229.56.0 - 91.229.56.255 ru 91.229.57.0 - 91.229.57.255 at 91.229.58.0 - 91.229.58.255 es 91.229.59.0 - 91.229.59.255 ru @@ -57865,7 +31752,6 @@ 91.229.76.0 - 91.229.79.255 ua 91.229.80.0 - 91.229.81.255 it 91.229.82.0 - 91.229.89.255 pl -91.229.90.0 - 91.229.91.255 eu 91.229.92.0 - 91.229.92.255 gb 91.229.93.0 - 91.229.93.255 hu 91.229.94.0 - 91.229.94.255 ru @@ -57883,7 +31769,6 @@ 91.229.124.0 - 91.229.127.255 gb 91.229.128.0 - 91.229.129.255 ua 91.229.130.0 - 91.229.131.255 fr -91.229.132.0 - 91.229.135.255 ro 91.229.136.0 - 91.229.136.255 fr 91.229.137.0 - 91.229.139.255 fi 91.229.140.0 - 91.229.140.255 ch @@ -57907,7 +31792,7 @@ 91.229.178.0 - 91.229.179.255 de 91.229.180.0 - 91.229.180.255 es 91.229.181.0 - 91.229.181.255 gb -91.229.182.0 - 91.229.183.255 ro +91.229.183.0 - 91.229.183.255 ro 91.229.184.0 - 91.229.184.255 tr 91.229.185.0 - 91.229.185.255 ru 91.229.186.0 - 91.229.186.255 ro @@ -57943,10 +31828,8 @@ 91.229.239.0 - 91.229.239.255 es 91.229.240.0 - 91.229.243.255 ua 91.229.244.0 - 91.229.245.255 ru -91.229.246.0 - 91.229.247.255 nl -91.229.248.0 - 91.229.248.255 ua -91.229.249.0 - 91.229.249.255 pl -91.229.250.0 - 91.229.251.255 ro +91.229.246.0 - 91.229.247.255 gb +91.229.248.0 - 91.229.251.255 pl 91.229.252.0 - 91.229.255.255 cz 91.230.0.0 - 91.230.1.255 fr 91.230.2.0 - 91.230.3.255 at @@ -58010,7 +31893,6 @@ 91.230.107.0 - 91.230.107.255 ru 91.230.108.0 - 91.230.109.255 se 91.230.110.0 - 91.230.110.255 ru -91.230.111.0 - 91.230.111.255 lv 91.230.112.0 - 91.230.120.255 pl 91.230.121.0 - 91.230.121.255 ua 91.230.122.0 - 91.230.122.255 pl @@ -58018,15 +31900,12 @@ 91.230.124.0 - 91.230.125.255 sa 91.230.126.0 - 91.230.132.255 se 91.230.133.0 - 91.230.133.255 ru -91.230.134.0 - 91.230.134.255 lv 91.230.135.0 - 91.230.135.255 ru -91.230.136.0 - 91.230.139.255 ro 91.230.140.0 - 91.230.141.255 ch 91.230.142.0 - 91.230.142.255 at -91.230.143.0 - 91.230.143.255 ru 91.230.144.0 - 91.230.144.255 cz 91.230.145.0 - 91.230.145.255 it -91.230.146.0 - 91.230.147.255 ru +91.230.146.0 - 91.230.146.255 ru 91.230.148.0 - 91.230.148.255 pl 91.230.149.0 - 91.230.155.255 ru 91.230.156.0 - 91.230.157.255 pl @@ -58041,7 +31920,7 @@ 91.230.176.0 - 91.230.179.255 be 91.230.180.0 - 91.230.180.255 pl 91.230.181.0 - 91.230.181.255 gb -91.230.182.0 - 91.230.187.255 ru +91.230.184.0 - 91.230.187.255 ru 91.230.188.0 - 91.230.188.255 hu 91.230.189.0 - 91.230.189.255 gb 91.230.190.0 - 91.230.191.255 ru @@ -58061,8 +31940,6 @@ 91.230.224.0 - 91.230.224.255 ru 91.230.225.0 - 91.230.225.255 kw 91.230.226.0 - 91.230.227.255 ru -91.230.228.0 - 91.230.228.255 lv -91.230.229.0 - 91.230.229.255 ua 91.230.230.0 - 91.230.231.255 bg 91.230.232.0 - 91.230.232.255 ro 91.230.233.0 - 91.230.233.255 pl @@ -58107,7 +31984,7 @@ 91.231.44.0 - 91.231.45.255 pl 91.231.46.0 - 91.231.46.255 gb 91.231.47.0 - 91.231.47.255 ru -91.231.48.0 - 91.231.51.255 ro +91.231.48.0 - 91.231.51.255 sa 91.231.52.0 - 91.231.53.255 pl 91.231.54.0 - 91.231.55.255 ua 91.231.56.0 - 91.231.59.255 uz @@ -58122,7 +31999,6 @@ 91.231.80.0 - 91.231.83.255 pl 91.231.84.0 - 91.231.87.255 ua 91.231.88.0 - 91.231.88.255 rs -91.231.89.0 - 91.231.89.255 ru 91.231.90.0 - 91.231.91.255 gb 91.231.92.0 - 91.231.93.255 pl 91.231.94.0 - 91.231.96.255 ru @@ -58133,7 +32009,6 @@ 91.231.110.0 - 91.231.111.255 pl 91.231.112.0 - 91.231.115.255 ru 91.231.116.0 - 91.231.125.255 pl -91.231.126.0 - 91.231.126.255 ru 91.231.127.0 - 91.231.127.255 ua 91.231.128.0 - 91.231.137.255 ru 91.231.138.0 - 91.231.138.255 ro @@ -58148,8 +32023,8 @@ 91.231.152.0 - 91.231.152.255 pl 91.231.153.0 - 91.231.153.255 se 91.231.154.0 - 91.231.155.255 gb -91.231.156.0 - 91.231.156.255 ru -91.231.157.0 - 91.231.159.255 ro +91.231.157.0 - 91.231.157.255 pl +91.231.158.0 - 91.231.159.255 rs 91.231.160.0 - 91.231.160.255 ua 91.231.161.0 - 91.231.163.255 ru 91.231.164.0 - 91.231.167.255 it @@ -58166,7 +32041,6 @@ 91.231.186.0 - 91.231.191.255 ru 91.231.192.0 - 91.231.195.255 il 91.231.196.0 - 91.231.199.255 ru -91.231.200.0 - 91.231.203.255 ro 91.231.204.0 - 91.231.204.255 ch 91.231.205.0 - 91.231.205.255 pl 91.231.206.0 - 91.231.206.255 ua @@ -58226,6 +32100,8 @@ 91.232.88.0 - 91.232.89.255 lu 91.232.90.0 - 91.232.91.255 pl 91.232.92.0 - 91.232.95.255 ru +91.232.96.0 - 91.232.97.255 de +91.232.98.0 - 91.232.98.255 ro 91.232.100.0 - 91.232.101.255 lb 91.232.102.0 - 91.232.102.255 pl 91.232.103.0 - 91.232.103.255 ua @@ -58241,14 +32117,12 @@ 91.232.124.0 - 91.232.125.255 gb 91.232.126.0 - 91.232.126.255 ru 91.232.127.0 - 91.232.128.255 ua -91.232.129.0 - 91.232.129.255 ru 91.232.130.0 - 91.232.130.255 nl 91.232.131.0 - 91.232.135.255 ru 91.232.136.0 - 91.232.139.255 nl 91.232.140.0 - 91.232.143.255 pl 91.232.144.0 - 91.232.147.255 ru -91.232.148.0 - 91.232.149.255 ro -91.232.150.0 - 91.232.151.255 gb +91.232.148.0 - 91.232.151.255 gb 91.232.152.0 - 91.232.152.255 it 91.232.153.0 - 91.232.153.255 gb 91.232.154.0 - 91.232.156.255 fi @@ -58260,14 +32134,12 @@ 91.232.168.0 - 91.232.173.255 ru 91.232.174.0 - 91.232.174.255 tr 91.232.175.0 - 91.232.176.255 pl -91.232.177.0 - 91.232.177.255 ua -91.232.178.0 - 91.232.179.255 ru +91.232.177.0 - 91.232.179.255 ua 91.232.180.0 - 91.232.180.255 it 91.232.181.0 - 91.232.181.255 gb 91.232.182.0 - 91.232.182.255 ro 91.232.183.0 - 91.232.183.255 pl -91.232.184.0 - 91.232.185.255 ro -91.232.186.0 - 91.232.186.255 md +91.232.184.0 - 91.232.186.255 ro 91.232.187.0 - 91.232.187.255 fr 91.232.188.0 - 91.232.189.255 ru 91.232.190.0 - 91.232.195.255 pl @@ -58275,12 +32147,12 @@ 91.232.199.0 - 91.232.199.255 ua 91.232.200.0 - 91.232.201.255 rs 91.232.202.0 - 91.232.207.255 ru -91.232.208.0 - 91.232.208.255 ua 91.232.209.0 - 91.232.209.255 bg 91.232.210.0 - 91.232.211.255 ro 91.232.212.0 - 91.232.215.255 cz 91.232.216.0 - 91.232.217.255 ru -91.232.218.0 - 91.232.223.255 sk +91.232.218.0 - 91.232.219.255 cz +91.232.220.0 - 91.232.223.255 sk 91.232.224.0 - 91.232.224.255 fr 91.232.225.0 - 91.232.225.255 ru 91.232.226.0 - 91.232.228.255 ro @@ -58288,7 +32160,6 @@ 91.232.230.0 - 91.232.231.255 ru 91.232.232.0 - 91.232.233.255 at 91.232.234.0 - 91.232.234.255 si -91.232.235.0 - 91.232.235.255 ru 91.232.236.0 - 91.232.237.255 rs 91.232.238.0 - 91.232.238.255 ua 91.232.239.0 - 91.232.239.255 si @@ -58299,7 +32170,6 @@ 91.232.248.0 - 91.232.251.255 pl 91.232.252.0 - 91.232.253.255 ru 91.232.254.0 - 91.232.254.255 ro -91.232.255.0 - 91.232.255.255 ru 91.233.0.0 - 91.233.3.255 ro 91.233.4.0 - 91.233.4.255 ru 91.233.5.0 - 91.233.5.255 gb @@ -58312,7 +32182,6 @@ 91.233.16.0 - 91.233.16.255 gb 91.233.17.0 - 91.233.17.255 ua 91.233.18.0 - 91.233.19.255 pl -91.233.20.0 - 91.233.20.255 sc 91.233.21.0 - 91.233.21.255 hu 91.233.22.0 - 91.233.23.255 nl 91.233.24.0 - 91.233.24.255 rs @@ -58326,7 +32195,7 @@ 91.233.36.0 - 91.233.37.255 hr 91.233.38.0 - 91.233.47.255 ru 91.233.48.0 - 91.233.49.255 ua -91.233.50.0 - 91.233.50.255 li +91.233.50.0 - 91.233.50.255 se 91.233.51.0 - 91.233.51.255 fr 91.233.52.0 - 91.233.53.255 nl 91.233.54.0 - 91.233.55.255 ru @@ -58336,20 +32205,1118 @@ 91.233.62.0 - 91.233.62.255 gb 91.233.63.0 - 91.233.67.255 ru 91.233.68.0 - 91.233.68.255 fr -91.233.69.0 - 91.233.75.255 pl +91.233.69.0 - 91.233.79.255 pl +91.233.80.0 - 91.233.80.255 tr +91.233.81.0 - 91.233.81.255 gb +91.233.82.0 - 91.233.82.255 ru +91.233.83.0 - 91.233.83.255 gb +91.233.84.0 - 91.233.87.255 de +91.233.88.0 - 91.233.89.255 ru +91.233.90.0 - 91.233.91.255 ua +91.233.92.0 - 91.233.95.255 ru +91.233.96.0 - 91.233.103.255 ua +91.233.104.0 - 91.233.104.255 pl +91.233.105.0 - 91.233.105.255 nl +91.233.106.0 - 91.233.106.255 ro +91.233.107.0 - 91.233.107.255 pl +91.233.108.0 - 91.233.111.255 ua +91.233.112.0 - 91.233.115.255 pl +91.233.116.0 - 91.233.117.255 fi +91.233.118.0 - 91.233.118.255 be +91.233.119.0 - 91.233.119.255 fr +91.233.122.0 - 91.233.122.255 fr +91.233.123.0 - 91.233.123.255 ua +91.233.124.0 - 91.233.124.255 gb +91.233.125.0 - 91.233.125.255 fi +91.233.126.0 - 91.233.126.255 ch +91.233.127.0 - 91.233.127.255 ua +91.233.128.0 - 91.233.129.255 gb +91.233.132.0 - 91.233.135.255 ru +91.233.136.0 - 91.233.139.255 pl +91.233.140.0 - 91.233.140.255 ua +91.233.141.0 - 91.233.141.255 sa +91.233.142.0 - 91.233.143.255 dk +91.233.144.0 - 91.233.151.255 ru +91.233.152.0 - 91.233.155.255 gb +91.233.156.0 - 91.233.162.255 pl +91.233.163.0 - 91.233.163.255 si +91.233.164.0 - 91.233.171.255 ru +91.233.172.0 - 91.233.173.255 ua +91.233.174.0 - 91.233.174.255 sa +91.233.175.0 - 91.233.175.255 ru +91.233.176.0 - 91.233.179.255 lt +91.233.180.0 - 91.233.181.255 it +91.233.182.0 - 91.233.182.255 ch +91.233.183.0 - 91.233.183.255 gb +91.233.184.0 - 91.233.187.255 pl +91.233.188.0 - 91.233.189.255 ru +91.233.190.0 - 91.233.190.255 ro +91.233.191.0 - 91.233.191.255 at +91.233.192.0 - 91.233.195.255 ro +91.233.196.0 - 91.233.199.255 pl +91.233.200.0 - 91.233.203.255 ro +91.233.204.0 - 91.233.205.255 pl +91.233.206.0 - 91.233.207.255 be +91.233.208.0 - 91.233.211.255 cz +91.233.212.0 - 91.233.213.255 ru +91.233.214.0 - 91.233.215.255 lv +91.233.216.0 - 91.233.223.255 ru +91.233.224.0 - 91.233.225.255 nl +91.233.226.0 - 91.233.226.255 ru +91.233.227.0 - 91.233.227.255 at +91.233.228.0 - 91.233.229.255 pl +91.233.230.0 - 91.233.231.255 ru +91.233.232.0 - 91.233.237.255 pl +91.233.238.0 - 91.233.247.255 ru +91.233.248.0 - 91.233.248.255 sk +91.233.249.0 - 91.233.249.255 ro +91.233.250.0 - 91.233.251.255 pl +91.233.252.0 - 91.233.255.255 it +91.234.0.0 - 91.234.3.255 ua +91.234.4.0 - 91.234.7.255 ru +91.234.8.0 - 91.234.8.255 pl +91.234.9.0 - 91.234.9.255 fr +91.234.10.0 - 91.234.11.255 ru +91.234.12.0 - 91.234.15.255 pl +91.234.16.0 - 91.234.16.255 ru +91.234.17.0 - 91.234.17.255 nl +91.234.18.0 - 91.234.18.255 gb +91.234.19.0 - 91.234.19.255 bg +91.234.20.0 - 91.234.20.255 ua +91.234.21.0 - 91.234.21.255 bg +91.234.22.0 - 91.234.22.255 us +91.234.23.0 - 91.234.23.255 gb +91.234.24.0 - 91.234.29.255 ua +91.234.30.0 - 91.234.30.255 de +91.234.31.0 - 91.234.35.255 ua +91.234.36.0 - 91.234.36.255 cn +91.234.37.0 - 91.234.37.255 ua +91.234.38.0 - 91.234.39.255 de +91.234.40.0 - 91.234.43.255 ua +91.234.44.0 - 91.234.45.255 pl +91.234.46.0 - 91.234.46.255 hr +91.234.47.0 - 91.234.47.255 ua +91.234.48.0 - 91.234.48.255 gb +91.234.49.0 - 91.234.49.255 pl +91.234.50.0 - 91.234.51.255 nl +91.234.52.0 - 91.234.52.255 ch +91.234.53.0 - 91.234.53.255 ru +91.234.54.0 - 91.234.54.255 ie +91.234.55.0 - 91.234.59.255 ro +91.234.60.0 - 91.234.65.255 ru +91.234.66.0 - 91.234.67.255 pl +91.234.68.0 - 91.234.71.255 ru +91.234.72.0 - 91.234.79.255 ua +91.234.80.0 - 91.234.83.255 ru +91.234.84.0 - 91.234.91.255 ua +91.234.92.0 - 91.234.95.255 bg +91.234.96.0 - 91.234.97.255 ru +91.234.98.0 - 91.234.99.255 ua +91.234.100.0 - 91.234.103.255 pl +91.234.104.0 - 91.234.107.255 fr +91.234.108.0 - 91.234.111.255 ru +91.234.112.0 - 91.234.115.255 pl +91.234.116.0 - 91.234.119.255 ru +91.234.120.0 - 91.234.123.255 ro +91.234.124.0 - 91.234.131.255 pl +91.234.132.0 - 91.234.135.255 rs +91.234.136.0 - 91.234.141.255 ua +91.234.142.0 - 91.234.144.255 pl +91.234.145.0 - 91.234.145.255 ru +91.234.146.0 - 91.234.146.255 pl +91.234.147.0 - 91.234.147.255 ru +91.234.148.0 - 91.234.148.255 nl +91.234.149.0 - 91.234.149.255 dk +91.234.150.0 - 91.234.151.255 ro +91.234.152.0 - 91.234.155.255 ru +91.234.156.0 - 91.234.159.255 ro +91.234.160.0 - 91.234.160.255 ch +91.234.161.0 - 91.234.161.255 ru +91.234.162.0 - 91.234.163.255 cz +91.234.164.0 - 91.234.167.255 ru +91.234.168.0 - 91.234.169.255 ro +91.234.170.0 - 91.234.170.255 ru +91.234.171.0 - 91.234.171.255 de +91.234.172.0 - 91.234.175.255 ru +91.234.176.0 - 91.234.176.255 pl +91.234.177.0 - 91.234.178.255 ru +91.234.179.0 - 91.234.179.255 at +91.234.180.0 - 91.234.183.255 ru +91.234.184.0 - 91.234.185.255 gb +91.234.186.0 - 91.234.187.255 pl +91.234.188.0 - 91.234.188.255 ru +91.234.189.0 - 91.234.189.255 ch +91.234.190.0 - 91.234.191.255 rs +91.234.192.0 - 91.234.192.255 se +91.234.193.0 - 91.234.193.255 nl +91.234.194.0 - 91.234.195.255 fr +91.234.196.0 - 91.234.199.255 ua +91.234.200.0 - 91.234.200.255 lt +91.234.201.0 - 91.234.201.255 gb +91.234.202.0 - 91.234.202.255 ru +91.234.203.0 - 91.234.203.255 be +91.234.204.0 - 91.234.205.255 fi +91.234.206.0 - 91.234.206.255 nl +91.234.207.0 - 91.234.207.255 pl +91.234.208.0 - 91.234.211.255 ua +91.234.212.0 - 91.234.212.255 ro +91.234.213.0 - 91.234.213.255 de +91.234.214.0 - 91.234.214.255 gb +91.234.215.0 - 91.234.216.255 de +91.234.217.0 - 91.234.217.255 pl +91.234.218.0 - 91.234.219.255 uz +91.234.220.0 - 91.234.223.255 ro +91.234.224.0 - 91.234.225.255 ru +91.234.226.0 - 91.234.227.255 ua +91.234.228.0 - 91.234.228.255 ge +91.234.229.0 - 91.234.229.255 at +91.234.230.0 - 91.234.231.255 be +91.234.232.0 - 91.234.232.255 pl +91.234.233.0 - 91.234.239.255 fr +91.234.240.0 - 91.234.240.255 se +91.234.241.0 - 91.234.243.255 ro +91.234.244.0 - 91.234.244.255 de +91.234.245.0 - 91.234.247.255 pl +91.234.248.0 - 91.234.251.255 cz +91.234.252.0 - 91.234.253.255 pl +91.234.255.0 - 91.234.255.255 ru +91.235.0.0 - 91.235.1.255 pl +91.235.2.0 - 91.235.2.255 ru +91.235.3.0 - 91.235.5.255 ro +91.235.6.0 - 91.235.6.255 is +91.235.7.0 - 91.235.7.255 ru +91.235.8.0 - 91.235.11.255 de +91.235.12.0 - 91.235.15.255 ua +91.235.16.0 - 91.235.25.255 pl +91.235.26.0 - 91.235.33.255 ru +91.235.34.0 - 91.235.35.255 de +91.235.36.0 - 91.235.39.255 ru +91.235.40.0 - 91.235.41.255 es +91.235.42.0 - 91.235.42.255 ru +91.235.43.0 - 91.235.43.255 ro +91.235.44.0 - 91.235.44.255 gb +91.235.45.0 - 91.235.45.255 de +91.235.46.0 - 91.235.46.255 ua +91.235.47.0 - 91.235.47.255 de +91.235.48.0 - 91.235.51.255 es +91.235.52.0 - 91.235.55.255 sk +91.235.56.0 - 91.235.59.255 gb +91.235.60.0 - 91.235.63.255 no +91.235.64.0 - 91.235.64.255 tr +91.235.65.0 - 91.235.65.255 gb +91.235.66.0 - 91.235.66.255 ru +91.235.67.0 - 91.235.71.255 ua +91.235.72.0 - 91.235.77.255 ru +91.235.78.0 - 91.235.79.255 fr +91.235.80.0 - 91.235.81.255 ru +91.235.82.0 - 91.235.82.255 si +91.235.83.0 - 91.235.83.255 nl +91.235.84.0 - 91.235.87.255 ua +91.235.88.0 - 91.235.95.255 ru +91.235.96.0 - 91.235.99.255 ie +91.235.100.0 - 91.235.100.255 dk +91.235.101.0 - 91.235.101.255 ru +91.235.102.0 - 91.235.102.255 ua +91.235.103.0 - 91.235.103.255 ru +91.235.104.0 - 91.235.105.255 tr +91.235.106.0 - 91.235.106.255 ru +91.235.107.0 - 91.235.107.255 il +91.235.108.0 - 91.235.111.255 es +91.235.112.0 - 91.235.112.255 ru +91.235.113.0 - 91.235.113.255 ro +91.235.114.0 - 91.235.115.255 de +91.235.116.0 - 91.235.119.255 az +91.235.120.0 - 91.235.121.255 it +91.235.122.0 - 91.235.123.255 ro +91.235.124.0 - 91.235.126.255 pl +91.235.127.0 - 91.235.127.255 ru +91.235.128.0 - 91.235.129.255 ua +91.235.130.0 - 91.235.131.255 gb +91.235.132.0 - 91.235.135.255 nl +91.235.136.0 - 91.235.137.255 ru +91.235.138.0 - 91.235.138.255 fr +91.235.139.0 - 91.235.139.255 dk +91.235.140.0 - 91.235.140.255 gb +91.235.141.0 - 91.235.141.255 fr +91.235.142.0 - 91.235.143.255 ua +91.235.144.0 - 91.235.147.255 ru +91.235.149.0 - 91.235.149.255 pl +91.235.150.0 - 91.235.151.255 il +91.235.152.0 - 91.235.155.255 pl +91.235.156.0 - 91.235.158.255 ru +91.235.159.0 - 91.235.159.255 ae +91.235.160.0 - 91.235.163.255 pl +91.235.164.0 - 91.235.164.255 bg +91.235.165.0 - 91.235.167.255 ro +91.235.168.0 - 91.235.168.255 se +91.235.169.0 - 91.235.169.255 ru +91.235.170.0 - 91.235.171.255 hr +91.235.172.0 - 91.235.173.255 gb +91.235.174.0 - 91.235.174.255 nl +91.235.175.0 - 91.235.175.255 ru +91.235.176.0 - 91.235.179.255 kz +91.235.180.0 - 91.235.181.255 ru +91.235.182.0 - 91.235.183.255 cz +91.235.184.0 - 91.235.191.255 ru +91.235.192.0 - 91.235.195.255 pl +91.235.196.0 - 91.235.199.255 ua +91.235.200.0 - 91.235.201.255 cz +91.235.202.0 - 91.235.202.255 pl +91.235.203.0 - 91.235.203.255 ru +91.235.204.0 - 91.235.207.255 pl +91.235.208.0 - 91.235.211.255 gb +91.235.212.0 - 91.235.212.255 ch +91.235.213.0 - 91.235.213.255 ru +91.235.214.0 - 91.235.214.255 gb +91.235.215.0 - 91.235.215.255 fr +91.235.216.0 - 91.235.219.255 pl +91.235.220.0 - 91.235.220.255 gb +91.235.221.0 - 91.235.221.255 ru +91.235.222.0 - 91.235.223.255 pl +91.235.224.0 - 91.235.227.255 ua +91.235.228.0 - 91.235.231.255 pl +91.235.232.0 - 91.235.232.255 dk +91.235.233.0 - 91.235.233.255 ru +91.235.234.0 - 91.235.235.255 gb +91.235.236.0 - 91.235.236.255 de +91.235.237.0 - 91.235.237.255 nl +91.235.238.0 - 91.235.239.255 pl +91.235.240.0 - 91.235.240.255 de +91.235.242.0 - 91.235.242.255 si +91.235.243.0 - 91.235.243.255 de +91.235.244.0 - 91.235.247.255 ru +91.235.248.0 - 91.235.251.255 bg +91.235.252.0 - 91.236.0.255 pl +91.236.1.0 - 91.236.1.255 si +91.236.2.0 - 91.236.3.255 ru +91.236.4.0 - 91.236.9.255 pl +91.236.10.0 - 91.236.12.255 ru +91.236.13.0 - 91.236.13.255 pl +91.236.14.0 - 91.236.15.255 ru +91.236.16.0 - 91.236.16.255 dk +91.236.17.0 - 91.236.18.255 gb +91.236.19.0 - 91.236.19.255 nl +91.236.20.0 - 91.236.21.255 pl +91.236.22.0 - 91.236.24.255 ru +91.236.25.0 - 91.236.25.255 fr +91.236.26.0 - 91.236.27.255 gb +91.236.28.0 - 91.236.28.255 dk +91.236.29.0 - 91.236.29.255 us +91.236.30.0 - 91.236.31.255 ru +91.236.32.0 - 91.236.35.255 pl +91.236.36.0 - 91.236.36.255 ua +91.236.37.0 - 91.236.37.255 hr +91.236.38.0 - 91.236.39.255 ee +91.236.40.0 - 91.236.43.255 cz +91.236.44.0 - 91.236.44.255 ee +91.236.45.0 - 91.236.45.255 ch +91.236.46.0 - 91.236.47.255 ro +91.236.48.0 - 91.236.51.255 ru +91.236.52.0 - 91.236.55.255 pl +91.236.56.0 - 91.236.56.255 gb +91.236.57.0 - 91.236.57.255 pl +91.236.58.0 - 91.236.58.255 ro +91.236.59.0 - 91.236.59.255 es +91.236.60.0 - 91.236.63.255 ru +91.236.64.0 - 91.236.71.255 sk +91.236.72.0 - 91.236.75.255 pl +91.236.76.0 - 91.236.77.255 ro +91.236.78.0 - 91.236.78.255 ch +91.236.79.0 - 91.236.79.255 ro +91.236.80.0 - 91.236.81.255 ru +91.236.82.0 - 91.236.82.255 sk +91.236.83.0 - 91.236.83.255 nl +91.236.84.0 - 91.236.87.255 pl +91.236.88.0 - 91.236.91.255 ro +91.236.92.0 - 91.236.95.255 ru +91.236.96.0 - 91.236.99.255 ua +91.236.100.0 - 91.236.104.255 ru +91.236.105.0 - 91.236.105.255 pl +91.236.106.0 - 91.236.107.255 de +91.236.108.0 - 91.236.115.255 ru +91.236.116.0 - 91.236.116.255 se +91.236.117.0 - 91.236.117.255 gb +91.236.118.0 - 91.236.119.255 ua +91.236.120.0 - 91.236.120.255 ru +91.236.122.0 - 91.236.122.255 de +91.236.123.0 - 91.236.123.255 dk +91.236.124.0 - 91.236.124.255 ru +91.236.125.0 - 91.236.125.255 pl +91.236.126.0 - 91.236.127.255 ua +91.236.128.0 - 91.236.133.255 pl +91.236.134.0 - 91.236.135.255 ua +91.236.136.0 - 91.236.136.255 ru +91.236.137.0 - 91.236.137.255 pl +91.236.138.0 - 91.236.139.255 ua +91.236.140.0 - 91.236.143.255 ru +91.236.144.0 - 91.236.147.255 bg +91.236.148.0 - 91.236.151.255 ru +91.236.152.0 - 91.236.152.255 gb +91.236.153.0 - 91.236.153.255 fr +91.236.154.0 - 91.236.155.255 ru +91.236.156.0 - 91.236.159.255 ua +91.236.160.0 - 91.236.160.255 at +91.236.161.0 - 91.236.161.255 fr +91.236.162.0 - 91.236.162.255 ae +91.236.163.0 - 91.236.163.255 pl +91.236.164.0 - 91.236.167.255 ru +91.236.168.0 - 91.236.169.255 ir +91.236.170.0 - 91.236.170.255 ro +91.236.171.0 - 91.236.171.255 ua +91.236.172.0 - 91.236.175.255 pl +91.236.176.0 - 91.236.181.255 ru +91.236.182.0 - 91.236.182.255 hu +91.236.183.0 - 91.236.183.255 ru +91.236.184.0 - 91.236.185.255 ua +91.236.186.0 - 91.236.186.255 dk +91.236.187.0 - 91.236.187.255 gb +91.236.188.0 - 91.236.188.255 lv +91.236.189.0 - 91.236.189.255 nl +91.236.190.0 - 91.236.191.255 gb +91.236.192.0 - 91.236.194.255 nl +91.236.195.0 - 91.236.201.255 ru +91.236.202.0 - 91.236.203.255 nl +91.236.204.0 - 91.236.205.255 ru +91.236.206.0 - 91.236.206.255 gb +91.236.207.0 - 91.236.209.255 se +91.236.210.0 - 91.236.211.255 dk +91.236.212.0 - 91.236.212.255 se +91.236.213.0 - 91.236.213.255 ua +91.236.214.0 - 91.236.215.255 nl +91.236.216.0 - 91.236.219.255 ro +91.236.220.0 - 91.236.220.255 ru +91.236.221.0 - 91.236.221.255 ua +91.236.222.0 - 91.236.222.255 ee +91.236.223.0 - 91.236.223.255 ro +91.236.224.0 - 91.236.227.255 ua +91.236.228.0 - 91.236.228.255 ro +91.236.229.0 - 91.236.229.255 pl +91.236.230.0 - 91.236.231.255 ro +91.236.232.0 - 91.236.233.255 pl +91.236.234.0 - 91.236.235.255 ru +91.236.236.0 - 91.236.236.255 lb +91.236.237.0 - 91.236.237.255 ro +91.236.238.0 - 91.236.238.255 ru +91.236.239.0 - 91.236.239.255 fr +91.236.240.0 - 91.236.243.255 ro +91.236.244.0 - 91.236.245.255 be +91.236.246.0 - 91.236.247.255 ru +91.236.248.0 - 91.236.251.255 ua +91.236.252.0 - 91.236.253.255 ru +91.236.254.0 - 91.236.255.255 fr +91.237.0.0 - 91.237.15.255 ua +91.237.16.0 - 91.237.17.255 it +91.237.18.0 - 91.237.19.255 pl +91.237.20.0 - 91.237.20.255 ru +91.237.21.0 - 91.237.23.255 sa +91.237.24.0 - 91.237.27.255 ua +91.237.28.0 - 91.237.31.255 sa +91.237.32.0 - 91.237.32.255 ru +91.237.33.0 - 91.237.33.255 si +91.237.34.0 - 91.237.35.255 no +91.237.36.0 - 91.237.36.255 pl +91.237.37.0 - 91.237.37.255 ru +91.237.38.0 - 91.237.39.255 fr +91.237.40.0 - 91.237.41.255 ua +91.237.42.0 - 91.237.42.255 lv +91.237.43.0 - 91.237.43.255 nl +91.237.44.0 - 91.237.49.255 ro +91.237.50.0 - 91.237.50.255 ps +91.237.51.0 - 91.237.51.255 cz +91.237.52.0 - 91.237.52.255 pl +91.237.53.0 - 91.237.55.255 ru +91.237.56.0 - 91.237.59.255 bg +91.237.60.0 - 91.237.63.255 pl +91.237.64.0 - 91.237.64.255 ua +91.237.65.0 - 91.237.65.255 at +91.237.66.0 - 91.237.67.255 se +91.237.68.0 - 91.237.73.255 pl +91.237.74.0 - 91.237.75.255 gb +91.237.76.0 - 91.237.76.255 ru +91.237.77.0 - 91.237.77.255 pl +91.237.78.0 - 91.237.78.255 nl +91.237.79.0 - 91.237.81.255 pl +91.237.82.0 - 91.237.83.255 ru +91.237.84.0 - 91.237.86.255 pl +91.237.87.0 - 91.237.87.255 gb +91.237.88.0 - 91.237.89.255 de +91.237.90.0 - 91.237.90.255 se +91.237.91.0 - 91.237.93.255 ro +91.237.94.0 - 91.237.94.255 ru +91.237.95.0 - 91.237.95.255 se +91.237.96.0 - 91.237.96.255 at +91.237.97.0 - 91.237.97.255 ru +91.237.98.0 - 91.237.99.255 lv +91.237.100.0 - 91.237.101.255 de +91.237.102.0 - 91.237.103.255 bg +91.237.104.0 - 91.237.105.255 ru +91.237.106.0 - 91.237.106.255 se +91.237.107.0 - 91.237.111.255 ua +91.237.112.0 - 91.237.113.255 pl +91.237.114.0 - 91.237.116.255 ua +91.237.117.0 - 91.237.117.255 de +91.237.118.0 - 91.237.118.255 pl +91.237.119.0 - 91.237.129.255 ua +91.237.130.0 - 91.237.131.255 ro +91.237.132.0 - 91.237.135.255 si +91.237.136.0 - 91.237.139.255 pl +91.237.140.0 - 91.237.141.255 se +91.237.142.0 - 91.237.142.255 ua +91.237.143.0 - 91.237.143.255 at +91.237.144.0 - 91.237.148.255 ru +91.237.149.0 - 91.237.149.255 pl +91.237.150.0 - 91.237.150.255 ru +91.237.151.0 - 91.237.151.255 fi +91.237.152.0 - 91.237.152.255 ua +91.237.154.0 - 91.237.161.255 pl +91.237.162.0 - 91.237.163.255 ru +91.237.164.0 - 91.237.167.255 ua +91.237.168.0 - 91.237.170.255 sk +91.237.171.0 - 91.237.173.255 pl +91.237.174.0 - 91.237.176.255 gb +91.237.177.0 - 91.237.177.255 fr +91.237.178.0 - 91.237.181.255 ru +91.237.182.0 - 91.237.183.255 ua +91.237.184.0 - 91.237.184.255 fr +91.237.185.0 - 91.237.185.255 gb +91.237.186.0 - 91.237.189.255 ru +91.237.190.0 - 91.237.190.255 pl +91.237.191.0 - 91.237.191.255 se +91.237.192.0 - 91.237.192.255 ru +91.237.193.0 - 91.237.195.255 ro +91.237.196.0 - 91.237.196.255 pl +91.237.197.0 - 91.237.197.255 gb +91.237.198.0 - 91.237.203.255 ru +91.237.204.0 - 91.237.208.255 ua +91.237.209.0 - 91.237.209.255 ru +91.237.210.0 - 91.237.211.255 gb +91.237.212.0 - 91.237.212.255 fr +91.237.213.0 - 91.237.213.255 ru +91.237.214.0 - 91.237.214.255 de +91.237.215.0 - 91.237.215.255 ru +91.237.216.0 - 91.237.217.255 tr +91.237.218.0 - 91.237.218.255 ch +91.237.219.0 - 91.237.219.255 pl +91.237.220.0 - 91.237.223.255 ru +91.237.224.0 - 91.237.229.255 pl +91.237.230.0 - 91.237.230.255 ru +91.237.231.0 - 91.237.231.255 gb +91.237.232.0 - 91.237.235.255 ua +91.237.236.0 - 91.237.239.255 cz +91.237.240.0 - 91.237.247.255 ua +91.237.248.0 - 91.237.248.255 ro +91.237.249.0 - 91.237.249.255 ru +91.237.250.0 - 91.237.250.255 eu +91.237.251.0 - 91.237.251.255 il +91.237.252.0 - 91.237.253.255 ru +91.237.254.0 - 91.238.0.255 ir +91.238.1.0 - 91.238.3.255 ru +91.238.4.0 - 91.238.5.255 ua +91.238.6.0 - 91.238.7.255 rs +91.238.8.0 - 91.238.8.255 ch +91.238.9.0 - 91.238.9.255 ua +91.238.10.0 - 91.238.11.255 ru +91.238.12.0 - 91.238.15.255 md +91.238.16.0 - 91.238.17.255 ua +91.238.19.0 - 91.238.19.255 at +91.238.20.0 - 91.238.21.255 ru +91.238.22.0 - 91.238.22.255 gb +91.238.23.0 - 91.238.23.255 ua +91.238.24.0 - 91.238.29.255 ru +91.238.30.0 - 91.238.32.255 be +91.238.33.0 - 91.238.35.255 ru +91.238.36.0 - 91.238.36.255 pl +91.238.37.0 - 91.238.43.255 ro +91.238.44.0 - 91.238.49.255 ru +91.238.50.0 - 91.238.50.255 ro +91.238.51.0 - 91.238.51.255 se +91.238.52.0 - 91.238.60.255 pl +91.238.61.0 - 91.238.61.255 rs +91.238.62.0 - 91.238.63.255 pl +91.238.64.0 - 91.238.69.255 ru +91.238.70.0 - 91.238.71.255 ro +91.238.72.0 - 91.238.73.255 fr +91.238.74.0 - 91.238.75.255 ua +91.238.76.0 - 91.238.78.255 pl +91.238.79.0 - 91.238.83.255 ru +91.238.85.0 - 91.238.85.255 pl +91.238.86.0 - 91.238.91.255 ru +91.238.94.0 - 91.238.95.255 md +91.238.96.0 - 91.238.99.255 ru +91.238.100.0 - 91.238.103.255 ua +91.238.104.0 - 91.238.105.255 cz +91.238.106.0 - 91.238.106.255 bg +91.238.107.0 - 91.238.107.255 pl +91.238.108.0 - 91.238.112.255 ru +91.238.113.0 - 91.238.113.255 sa +91.238.114.0 - 91.238.115.255 ru +91.238.116.0 - 91.238.119.255 it +91.238.120.0 - 91.238.122.255 ru +91.238.123.0 - 91.238.123.255 gb +91.238.124.0 - 91.238.125.255 pl +91.238.126.0 - 91.238.126.255 es +91.238.127.0 - 91.238.129.255 ru +91.238.130.0 - 91.238.130.255 gb +91.238.131.0 - 91.238.131.255 fr +91.238.132.0 - 91.238.132.255 ua +91.238.133.0 - 91.238.133.255 cz +91.238.134.0 - 91.238.135.255 pl +91.238.136.0 - 91.238.140.255 ru +91.238.141.0 - 91.238.141.255 nl +91.238.142.0 - 91.238.143.255 pl +91.238.144.0 - 91.238.144.255 ch +91.238.145.0 - 91.238.145.255 pl +91.238.146.0 - 91.238.147.255 ua +91.238.148.0 - 91.238.149.255 ro +91.238.150.0 - 91.238.151.255 fr +91.238.152.0 - 91.238.153.255 dk +91.238.154.0 - 91.238.155.255 nl +91.238.156.0 - 91.238.159.255 ru +91.238.160.0 - 91.238.165.255 gb +91.238.166.0 - 91.238.167.255 pl +91.238.168.0 - 91.238.171.255 ru +91.238.172.0 - 91.238.175.255 pl +91.238.176.0 - 91.238.177.255 nl +91.238.178.0 - 91.238.179.255 pl +91.238.180.0 - 91.238.181.255 de +91.238.182.0 - 91.238.185.255 ru +91.238.186.0 - 91.238.187.255 ro +91.238.188.0 - 91.238.191.255 ru +91.238.192.0 - 91.238.195.255 ua +91.238.196.0 - 91.238.198.255 gb +91.238.199.0 - 91.238.199.255 bg +91.238.200.0 - 91.238.203.255 ru +91.238.204.0 - 91.238.205.255 bg +91.238.206.0 - 91.238.206.255 dk +91.238.208.0 - 91.238.209.255 gb +91.238.210.0 - 91.238.211.255 ru +91.238.212.0 - 91.238.212.255 dk +91.238.213.0 - 91.238.213.255 ru +91.238.214.0 - 91.238.215.255 a1 +91.238.216.0 - 91.238.216.255 pl +91.238.217.0 - 91.238.217.255 ru +91.238.218.0 - 91.238.218.255 ro +91.238.219.0 - 91.238.219.255 be +91.238.220.0 - 91.238.220.255 fr +91.238.221.0 - 91.238.221.255 gb +91.238.222.0 - 91.238.224.255 ru +91.238.225.0 - 91.238.225.255 at +91.238.226.0 - 91.238.226.255 be +91.238.227.0 - 91.238.231.255 ru +91.238.232.0 - 91.238.235.255 pl +91.238.236.0 - 91.238.236.255 de +91.238.237.0 - 91.238.237.255 ru +91.238.238.0 - 91.238.239.255 ch +91.238.240.0 - 91.238.243.255 pl +91.238.244.0 - 91.238.245.255 ua +91.238.246.0 - 91.238.247.255 pl +91.238.248.0 - 91.238.249.255 ru +91.238.250.0 - 91.238.250.255 it +91.238.251.0 - 91.238.251.255 bg +91.238.252.0 - 91.238.253.255 ru +91.238.254.0 - 91.238.254.255 pl +91.238.255.0 - 91.238.255.255 bg +91.239.0.0 - 91.239.3.255 ro +91.239.4.0 - 91.239.5.255 ru +91.239.6.0 - 91.239.7.255 fr +91.239.8.0 - 91.239.11.255 md +91.239.12.0 - 91.239.12.255 ro +91.239.13.0 - 91.239.13.255 bg +91.239.14.0 - 91.239.14.255 ir +91.239.16.0 - 91.239.19.255 ru +91.239.20.0 - 91.239.20.255 de +91.239.21.0 - 91.239.21.255 es +91.239.22.0 - 91.239.22.255 ru +91.239.23.0 - 91.239.23.255 at +91.239.24.0 - 91.239.24.255 ru +91.239.25.0 - 91.239.25.255 no +91.239.26.0 - 91.239.27.255 ru +91.239.28.0 - 91.239.31.255 pl +91.239.32.0 - 91.239.33.255 nl +91.239.34.0 - 91.239.35.255 de +91.239.36.0 - 91.239.36.255 pl +91.239.38.0 - 91.239.39.255 dk +91.239.40.0 - 91.239.45.255 ru +91.239.46.0 - 91.239.46.255 gb +91.239.47.0 - 91.239.47.255 bg +91.239.48.0 - 91.239.51.255 ua +91.239.52.0 - 91.239.52.255 ch +91.239.53.0 - 91.239.53.255 ru +91.239.54.0 - 91.239.55.255 ir +91.239.56.0 - 91.239.60.255 ru +91.239.61.0 - 91.239.61.255 pl +91.239.62.0 - 91.239.62.255 gb +91.239.63.0 - 91.239.63.255 ru +91.239.64.0 - 91.239.65.255 nl +91.239.66.0 - 91.239.67.255 pl +91.239.68.0 - 91.239.71.255 ru +91.239.72.0 - 91.239.73.255 gb +91.239.74.0 - 91.239.74.255 ua +91.239.75.0 - 91.239.75.255 ch +91.239.76.0 - 91.239.83.255 ua +91.239.84.0 - 91.239.84.255 de +91.239.85.0 - 91.239.85.255 ru +91.239.86.0 - 91.239.86.255 ee +91.239.87.0 - 91.239.87.255 gb +91.239.88.0 - 91.239.89.255 ru +91.239.90.0 - 91.239.90.255 pl +91.239.91.0 - 91.239.91.255 gb +91.239.92.0 - 91.239.93.255 de +91.239.94.0 - 91.239.94.255 ru +91.239.95.0 - 91.239.95.255 ua +91.239.96.0 - 91.239.97.255 si +91.239.98.0 - 91.239.99.255 ru +91.239.100.0 - 91.239.100.255 dk +91.239.101.0 - 91.239.101.255 kz +91.239.102.0 - 91.239.103.255 ru +91.239.104.0 - 91.239.107.255 ua +91.239.108.0 - 91.239.111.255 ir +91.239.112.0 - 91.239.112.255 ru +91.239.113.0 - 91.239.120.255 pl +91.239.121.0 - 91.239.121.255 ru +91.239.122.0 - 91.239.122.255 dk +91.239.123.0 - 91.239.123.255 ro +91.239.124.0 - 91.239.125.255 gb +91.239.126.0 - 91.239.127.255 ru +91.239.128.0 - 91.239.128.255 ro +91.239.129.0 - 91.239.129.255 pl +91.239.131.0 - 91.239.135.255 ru +91.239.136.0 - 91.239.139.255 ua +91.239.140.0 - 91.239.143.255 ru +91.239.144.0 - 91.239.144.255 pl +91.239.145.0 - 91.239.145.255 gb +91.239.146.0 - 91.239.146.255 pt +91.239.147.0 - 91.239.147.255 ie +91.239.150.0 - 91.239.150.255 ua +91.239.151.0 - 91.239.151.255 rs +91.239.152.0 - 91.239.155.255 pl +91.239.156.0 - 91.239.156.255 gb +91.239.158.0 - 91.239.159.255 ru +91.239.160.0 - 91.239.163.255 ua +91.239.164.0 - 91.239.167.255 ro +91.239.168.0 - 91.239.171.255 pl +91.239.172.0 - 91.239.172.255 ru +91.239.173.0 - 91.239.173.255 ro +91.239.174.0 - 91.239.175.255 nl +91.239.176.0 - 91.239.176.255 ru +91.239.177.0 - 91.239.177.255 de +91.239.178.0 - 91.239.179.255 ro +91.239.180.0 - 91.239.183.255 pl +91.239.184.0 - 91.239.184.255 ru +91.239.185.0 - 91.239.185.255 pl +91.239.186.0 - 91.239.186.255 nl +91.239.187.0 - 91.239.187.255 ua +91.239.188.0 - 91.239.189.255 se +91.239.190.0 - 91.239.190.255 ua +91.239.191.0 - 91.239.191.255 ru +91.239.192.0 - 91.239.192.255 kz +91.239.193.0 - 91.239.193.255 si +91.239.194.0 - 91.239.194.255 ro +91.239.195.0 - 91.239.195.255 cy +91.239.196.0 - 91.239.199.255 pl +91.239.200.0 - 91.239.203.255 cz +91.239.204.0 - 91.239.204.255 tr +91.239.205.0 - 91.239.205.255 pl +91.239.206.0 - 91.239.207.255 ge +91.239.208.0 - 91.239.211.255 gb +91.239.212.0 - 91.239.213.255 nl +91.239.214.0 - 91.239.214.255 ir +91.239.215.0 - 91.239.215.255 ru +91.239.216.0 - 91.239.217.255 se +91.239.218.0 - 91.239.219.255 il +91.239.220.0 - 91.239.226.255 ro +91.239.227.0 - 91.239.229.255 ru +91.239.230.0 - 91.239.230.255 ro +91.239.231.0 - 91.239.231.255 at +91.239.232.0 - 91.239.235.255 ua +91.239.236.0 - 91.239.237.255 cz +91.239.238.0 - 91.239.239.255 ru +91.239.240.0 - 91.239.240.255 bg +91.239.241.0 - 91.239.241.255 ua +91.239.242.0 - 91.239.242.255 tr +91.239.243.0 - 91.239.243.255 si +91.239.244.0 - 91.239.251.255 pl +91.239.252.0 - 91.239.253.255 no +91.239.254.0 - 91.239.254.255 pl +91.239.255.0 - 91.239.255.255 se +91.240.0.0 - 91.240.0.255 ch +91.240.1.0 - 91.240.1.255 ro +91.240.2.0 - 91.240.3.255 gb +91.240.4.0 - 91.240.5.255 ro +91.240.6.0 - 91.240.7.255 rs +91.240.8.0 - 91.240.11.255 ro +91.240.12.0 - 91.240.15.255 uz +91.240.16.0 - 91.240.16.255 ru +91.240.17.0 - 91.240.17.255 gb +91.240.18.0 - 91.240.19.255 ua +91.240.20.0 - 91.240.23.255 cz +91.240.24.0 - 91.240.24.255 gb +91.240.25.0 - 91.240.25.255 ru +91.240.26.0 - 91.240.26.255 tr +91.240.27.0 - 91.240.27.255 ge +91.240.28.0 - 91.240.31.255 pl +91.240.32.0 - 91.240.32.255 fr +91.240.33.0 - 91.240.33.255 es +91.240.34.0 - 91.240.34.255 de +91.240.35.0 - 91.240.35.255 cz +91.240.36.0 - 91.240.36.255 ru +91.240.37.0 - 91.240.37.255 tr +91.240.38.0 - 91.240.39.255 ru +91.240.40.0 - 91.240.43.255 rs +91.240.44.0 - 91.240.44.255 pl +91.240.45.0 - 91.240.45.255 ru +91.240.46.0 - 91.240.47.255 pl +91.240.48.0 - 91.240.51.255 ua +91.240.52.0 - 91.240.55.255 si +91.240.56.0 - 91.240.59.255 es +91.240.60.0 - 91.240.63.255 ir +91.240.64.0 - 91.240.67.255 se +91.240.68.0 - 91.240.68.255 pl +91.240.69.0 - 91.240.69.255 lb +91.240.70.0 - 91.240.70.255 pl +91.240.71.0 - 91.240.71.255 gb +91.240.72.0 - 91.240.72.255 fr +91.240.73.0 - 91.240.73.255 ae +91.240.74.0 - 91.240.75.255 ru +91.240.76.0 - 91.240.76.255 pl +91.240.77.0 - 91.240.77.255 de +91.240.78.0 - 91.240.79.255 fr +91.240.80.0 - 91.240.83.255 lb +91.240.84.0 - 91.240.87.255 ru +91.240.88.0 - 91.240.88.255 dk +91.240.90.0 - 91.240.92.255 ru +91.240.93.0 - 91.240.93.255 pl +91.240.94.0 - 91.240.94.255 ro +91.240.95.0 - 91.240.95.255 ru +91.240.96.0 - 91.240.99.255 ua +91.240.100.0 - 91.240.101.255 pl +91.240.102.0 - 91.240.103.255 ru +91.240.104.0 - 91.240.105.255 ch +91.240.106.0 - 91.240.107.255 pl +91.240.108.0 - 91.240.108.255 tr +91.240.109.0 - 91.240.109.255 fr +91.240.110.0 - 91.240.115.255 ru +91.240.116.0 - 91.240.119.255 nl +91.240.120.0 - 91.240.128.255 ru +91.240.129.0 - 91.240.129.255 de +91.240.130.0 - 91.240.139.255 pl +91.240.140.0 - 91.240.143.255 ua +91.240.144.0 - 91.240.144.255 ru +91.240.145.0 - 91.240.145.255 cz +91.240.146.0 - 91.240.147.255 il +91.240.148.0 - 91.240.148.255 ps +91.240.149.0 - 91.240.151.255 ro +91.240.152.0 - 91.240.153.255 pl +91.240.154.0 - 91.240.154.255 ro +91.240.155.0 - 91.240.155.255 ru +91.240.156.0 - 91.240.159.255 ro +91.240.160.0 - 91.240.161.255 de +91.240.162.0 - 91.240.163.255 ru +91.240.164.0 - 91.240.164.255 de +91.240.165.0 - 91.240.165.255 cz +91.240.166.0 - 91.240.167.255 it +91.240.168.0 - 91.240.172.255 ru +91.240.173.0 - 91.240.173.255 es +91.240.174.0 - 91.240.174.255 gb +91.240.176.0 - 91.240.176.255 gb +91.240.177.0 - 91.240.177.255 ro +91.240.178.0 - 91.240.178.255 gb +91.240.179.0 - 91.240.179.255 ru +91.240.180.0 - 91.240.183.255 ir +91.240.184.0 - 91.240.184.255 ro +91.240.185.0 - 91.240.187.255 dk +91.240.188.0 - 91.240.188.255 ro +91.240.189.0 - 91.240.189.255 dk +91.240.190.0 - 91.240.191.255 ua +91.240.192.0 - 91.240.192.255 gb +91.240.193.0 - 91.240.193.255 pl +91.240.194.0 - 91.240.194.255 se +91.240.195.0 - 91.240.195.255 no +91.240.196.0 - 91.240.199.255 pl +91.240.200.0 - 91.240.201.255 nl +91.240.202.0 - 91.240.202.255 ru +91.240.203.0 - 91.240.203.255 cy +91.240.204.0 - 91.240.207.255 no +91.240.208.0 - 91.240.211.255 ru +91.240.212.0 - 91.240.213.255 cy +91.240.214.0 - 91.240.215.255 ru +91.240.216.0 - 91.240.216.255 si +91.240.217.0 - 91.240.217.255 de +91.240.218.0 - 91.240.220.255 ru +91.240.221.0 - 91.240.221.255 gb +91.240.222.0 - 91.240.222.255 ru +91.240.223.0 - 91.240.223.255 pl +91.240.224.0 - 91.240.224.255 gb +91.240.225.0 - 91.240.225.255 ru +91.240.226.0 - 91.240.227.255 gb +91.240.228.0 - 91.240.228.255 fr +91.240.229.0 - 91.240.229.255 gb +91.240.230.0 - 91.240.231.255 it +91.240.232.0 - 91.240.233.255 ru +91.240.234.0 - 91.240.235.255 il +91.240.236.0 - 91.240.237.255 ro +91.240.238.0 - 91.240.239.255 pl +91.240.240.0 - 91.240.240.255 nl +91.240.241.0 - 91.240.241.255 fr +91.240.242.0 - 91.240.243.255 ru +91.240.244.0 - 91.240.244.255 ua +91.240.245.0 - 91.240.245.255 sk +91.240.246.0 - 91.240.247.255 lv +91.240.248.0 - 91.240.251.255 pl +91.240.252.0 - 91.240.253.255 se +91.240.254.0 - 91.240.254.255 pl +91.240.255.0 - 91.240.255.255 bg +91.241.0.0 - 91.241.1.255 gb +91.241.2.0 - 91.241.2.255 pl +91.241.3.0 - 91.241.3.255 pt +91.241.4.0 - 91.241.4.255 ru +91.241.5.0 - 91.241.5.255 pl +91.241.6.0 - 91.241.7.255 nl +91.241.8.0 - 91.241.11.255 cz +91.241.12.0 - 91.241.13.255 ru +91.241.16.0 - 91.241.19.255 ru +91.241.20.0 - 91.241.21.255 ir +91.241.22.0 - 91.241.22.255 ru +91.241.23.0 - 91.241.23.255 cz +91.241.24.0 - 91.241.27.255 pl +91.241.28.0 - 91.241.28.255 lu +91.241.29.0 - 91.241.29.255 nl +91.241.30.0 - 91.241.30.255 be +91.241.31.0 - 91.241.41.255 pl +91.241.42.0 - 91.241.42.255 fr +91.241.43.0 - 91.241.43.255 ru +91.241.44.0 - 91.241.44.255 de +91.241.45.0 - 91.241.47.255 ru +91.241.48.0 - 91.241.51.255 pl +91.241.52.0 - 91.241.52.255 de +91.241.53.0 - 91.241.53.255 hr +91.241.54.0 - 91.241.55.255 de +91.241.56.0 - 91.241.56.255 gb +91.241.57.0 - 91.241.57.255 fr +91.241.58.0 - 91.241.59.255 ru +91.241.60.0 - 91.241.63.255 pl +91.241.64.0 - 91.241.67.255 lv +91.241.68.0 - 91.241.69.255 ru +91.241.70.0 - 91.241.70.255 gb +91.241.71.0 - 91.241.71.255 ua +91.241.72.0 - 91.241.75.255 de +91.241.76.0 - 91.241.77.255 it +91.241.78.0 - 91.241.78.255 gb +91.241.79.0 - 91.241.79.255 be +91.241.80.0 - 91.241.83.255 ua +91.241.84.0 - 91.241.85.255 ru +91.241.86.0 - 91.241.87.255 gb +91.241.88.0 - 91.241.91.255 ru +91.241.92.0 - 91.241.92.255 ir +91.241.94.0 - 91.241.95.255 gr +91.241.96.0 - 91.241.127.255 ua +91.241.128.0 - 91.241.159.255 ru +91.241.160.0 - 91.241.255.255 ua +91.242.0.0 - 91.242.31.255 az +91.242.32.0 - 91.242.43.255 ru +91.242.44.0 - 91.242.45.255 ir +91.242.46.0 - 91.242.51.255 ro +91.242.52.0 - 91.242.55.255 ua +91.242.56.0 - 91.242.63.255 pl +91.242.64.0 - 91.242.159.255 md +91.242.160.0 - 91.242.160.255 nl +91.242.161.0 - 91.242.161.255 ru +91.242.162.0 - 91.242.162.255 fr +91.242.163.0 - 91.242.171.255 ru +91.242.172.0 - 91.242.172.255 gb +91.242.173.0 - 91.242.173.255 de +91.242.174.0 - 91.242.175.255 pl +91.242.176.0 - 91.242.191.255 ru +91.242.192.0 - 91.242.199.255 ua +91.242.200.0 - 91.242.207.255 no +91.242.208.0 - 91.242.211.255 ua +91.242.212.0 - 91.242.212.255 de +91.242.213.0 - 91.242.213.255 ru +91.242.214.0 - 91.242.215.255 in +91.242.216.0 - 91.242.216.255 ro +91.242.217.0 - 91.242.217.255 ae +91.242.218.0 - 91.242.218.255 pl +91.242.220.0 - 91.242.221.255 pl +91.242.222.0 - 91.242.222.255 ua +91.242.223.0 - 91.242.223.255 nl +91.242.224.0 - 91.243.31.255 ua +91.243.32.0 - 91.243.63.255 ru +91.243.64.0 - 91.243.65.255 nl +91.243.66.0 - 91.243.67.255 pl +91.243.68.0 - 91.243.68.255 ru +91.243.69.0 - 91.243.69.255 no +91.243.70.0 - 91.243.70.255 de +91.243.71.0 - 91.243.71.255 ch +91.243.72.0 - 91.243.72.255 us +91.243.73.0 - 91.243.73.255 es +91.243.74.0 - 91.243.75.255 nl +91.243.76.0 - 91.243.77.255 fr +91.243.78.0 - 91.243.79.255 at +91.243.80.0 - 91.243.113.255 ru +91.243.114.0 - 91.243.114.255 gb +91.243.115.0 - 91.243.121.255 ru +91.243.122.0 - 91.243.122.255 sk +91.243.123.0 - 91.243.123.255 rs +91.243.124.0 - 91.243.125.255 ru +91.243.126.0 - 91.243.127.255 ir +91.243.128.0 - 91.243.159.255 ru +91.243.160.0 - 91.243.175.255 ir +91.243.176.0 - 91.243.191.255 ru +91.243.192.0 - 91.243.223.255 ua +91.243.224.0 - 91.243.255.255 ru +91.244.0.0 - 91.244.63.255 ua +91.244.64.0 - 91.244.67.255 ru +91.244.68.0 - 91.244.68.255 gb +91.244.69.0 - 91.244.69.255 ua +91.244.70.0 - 91.244.71.255 pl +91.244.72.0 - 91.244.95.255 ru +91.244.96.0 - 91.244.111.255 ro +91.244.112.0 - 91.244.115.255 ru +91.244.116.0 - 91.244.116.255 tr +91.244.117.0 - 91.244.117.255 gb +91.244.118.0 - 91.244.119.255 ua +91.244.120.0 - 91.244.123.255 sk +91.244.124.0 - 91.244.124.255 ua +91.244.125.0 - 91.244.125.255 de +91.244.126.0 - 91.244.126.255 gb +91.244.127.0 - 91.244.159.255 ua +91.244.160.0 - 91.244.179.255 ru +91.244.180.0 - 91.244.180.255 de +91.244.181.0 - 91.244.181.255 bg +91.244.182.0 - 91.244.183.255 ru +91.244.184.0 - 91.244.191.255 pl +91.244.192.0 - 91.244.207.255 ru +91.244.208.0 - 91.244.223.255 pl +91.244.224.0 - 91.244.224.255 nl +91.244.225.0 - 91.244.225.255 pl +91.244.226.0 - 91.244.227.255 tr +91.244.228.0 - 91.244.228.255 ru +91.244.229.0 - 91.244.229.255 gb +91.244.230.0 - 91.244.231.255 pl +91.244.232.0 - 91.244.235.255 ua +91.244.236.0 - 91.244.237.255 gb +91.244.238.0 - 91.244.238.255 fr +91.244.239.0 - 91.244.239.255 gb +91.244.240.0 - 91.244.244.255 ru +91.244.245.0 - 91.244.247.255 gb +91.244.248.0 - 91.244.251.255 pl +91.244.252.0 - 91.244.255.255 ru +91.245.0.0 - 91.245.31.255 cz +91.245.32.0 - 91.245.71.255 ru +91.245.72.0 - 91.245.79.255 ua +91.245.80.0 - 91.245.87.255 pl +91.245.88.0 - 91.245.95.255 ro +91.245.96.0 - 91.245.127.255 ua +91.245.128.0 - 91.245.159.255 ru +91.245.160.0 - 91.245.191.255 ro +91.245.192.0 - 91.245.192.255 bg +91.245.193.0 - 91.245.193.255 si +91.245.194.0 - 91.245.194.255 lv +91.245.195.0 - 91.245.195.255 gr +91.245.196.0 - 91.245.209.255 ro +91.245.210.0 - 91.245.211.255 ru +91.245.212.0 - 91.245.212.255 gb +91.245.213.0 - 91.245.213.255 ua +91.245.214.0 - 91.245.214.255 rs +91.245.215.0 - 91.245.215.255 de +91.245.216.0 - 91.245.217.255 ua +91.245.218.0 - 91.245.218.255 dk +91.245.219.0 - 91.245.219.255 pl +91.245.220.0 - 91.245.220.255 de +91.245.221.0 - 91.245.221.255 ua +91.245.222.0 - 91.245.222.255 cy +91.245.223.0 - 91.245.223.255 ua +91.246.0.0 - 91.246.3.255 ru +91.246.4.0 - 91.246.7.255 ua +91.246.8.0 - 91.246.11.255 gb +91.246.12.0 - 91.246.12.255 bg +91.246.14.0 - 91.246.14.255 kw +91.246.15.0 - 91.246.15.255 pl +91.246.16.0 - 91.246.25.255 ru +91.246.26.0 - 91.246.29.255 gb +91.246.30.0 - 91.246.31.255 ru +91.246.32.0 - 91.246.63.255 ua +91.246.64.0 - 91.246.79.255 pl +91.246.80.0 - 91.246.103.255 ru +91.246.104.0 - 91.246.111.255 pl +91.246.112.0 - 91.246.127.255 ru +91.246.128.0 - 91.246.159.255 ua +91.246.160.0 - 91.246.167.255 ru +91.246.168.0 - 91.246.171.255 pl +91.246.172.0 - 91.246.201.255 ro +91.246.202.0 - 91.246.202.255 de +91.246.203.0 - 91.246.207.255 ro +91.246.208.0 - 91.246.215.255 pl +91.246.216.0 - 91.246.217.255 ro +91.246.218.0 - 91.246.218.255 il +91.246.219.0 - 91.246.219.255 ru +91.246.220.0 - 91.246.255.255 ua +91.247.0.0 - 91.247.31.255 ru +91.247.32.0 - 91.247.63.255 ua +91.247.64.0 - 91.247.65.255 cz +91.247.66.0 - 91.247.67.255 ir +91.247.68.0 - 91.247.71.255 ru +91.247.72.0 - 91.247.72.255 lv +91.247.73.0 - 91.247.73.255 gb +91.247.74.0 - 91.247.74.255 no +91.247.75.0 - 91.247.75.255 fr +91.247.76.0 - 91.247.95.255 ua +91.247.96.0 - 91.247.143.255 ru +91.247.144.0 - 91.247.145.255 de +91.247.146.0 - 91.247.146.255 ro +91.247.147.0 - 91.247.147.255 pl +91.247.148.0 - 91.247.159.255 ru +91.247.160.0 - 91.247.191.255 ua +91.247.192.0 - 91.247.220.255 ru +91.247.221.0 - 91.247.221.255 ua +91.247.222.0 - 91.247.223.255 ru +91.247.224.0 - 91.247.227.255 ua +91.247.228.0 - 91.247.231.255 no +91.247.232.0 - 91.247.239.255 ru +91.247.240.0 - 91.247.247.255 ro +91.247.248.0 - 91.247.251.255 ru +91.247.252.0 - 91.247.252.255 pl +91.247.253.0 - 91.247.253.255 ch +91.247.254.0 - 91.247.255.255 ru +91.248.0.0 - 91.249.255.255 de +91.250.0.0 - 91.250.63.255 ua +91.250.64.0 - 91.250.127.255 de +91.250.128.0 - 91.250.191.255 ro +91.250.192.0 - 91.250.223.255 se +91.250.224.0 - 91.250.239.255 md +91.250.240.0 - 91.250.255.255 ro +91.251.0.0 - 91.251.255.255 ir +91.252.0.0 - 91.255.255.255 it 92.0.0.0 - 92.31.255.255 gb -92.32.0.0 - 92.33.25.207 se -92.33.25.208 - 92.33.25.215 fi -92.33.25.216 - 92.33.25.223 se -92.33.25.224 - 92.33.25.255 fi -92.33.26.0 - 92.33.30.255 se +92.32.0.0 - 92.33.30.255 se 92.33.31.0 - 92.33.31.255 fi 92.33.32.0 - 92.35.255.255 se 92.36.0.0 - 92.36.127.255 ru 92.36.128.0 - 92.36.255.255 ba 92.37.0.0 - 92.37.127.255 si -92.37.128.0 - 92.37.255.255 ru -92.38.0.0 - 92.38.127.255 cz +92.37.128.0 - 92.38.1.255 ru +92.38.2.0 - 92.38.2.255 cz +92.38.3.0 - 92.38.4.255 ru +92.38.5.0 - 92.38.7.255 cz +92.38.8.0 - 92.38.15.255 ru +92.38.16.0 - 92.38.23.255 cz +92.38.24.0 - 92.38.27.255 uz +92.38.28.0 - 92.38.33.255 ru +92.38.34.0 - 92.38.34.255 ua +92.38.35.0 - 92.38.37.255 ru +92.38.38.0 - 92.38.39.255 cz +92.38.40.0 - 92.38.40.255 ua +92.38.41.0 - 92.38.41.59 cz +92.38.41.60 - 92.38.41.60 ua +92.38.41.61 - 92.38.42.255 cz +92.38.43.0 - 92.38.47.255 ru +92.38.48.0 - 92.38.55.255 ua +92.38.56.0 - 92.38.79.255 by +92.38.80.0 - 92.38.83.255 ru +92.38.84.0 - 92.38.91.255 cz +92.38.92.0 - 92.38.93.255 ru +92.38.94.0 - 92.38.95.255 fr +92.38.96.0 - 92.38.127.255 ua 92.38.128.0 - 92.38.255.255 ru 92.39.0.0 - 92.39.15.255 se 92.39.16.0 - 92.39.31.255 de @@ -58358,46 +33325,28 @@ 92.39.64.0 - 92.39.79.255 ru 92.39.80.0 - 92.39.95.255 az 92.39.96.0 - 92.39.111.255 ru -92.39.112.0 - 92.39.112.127 sn -92.39.112.128 - 92.39.112.255 tm -92.39.113.0 - 92.39.113.127 ba -92.39.113.128 - 92.39.113.255 tj -92.39.114.0 - 92.39.114.127 sd -92.39.114.128 - 92.39.114.255 de -92.39.115.0 - 92.39.115.127 mw -92.39.115.128 - 92.39.115.255 zw -92.39.116.0 - 92.39.116.127 bi -92.39.116.128 - 92.39.116.255 gw -92.39.117.0 - 92.39.117.127 ls -92.39.117.128 - 92.39.117.255 ne -92.39.118.0 - 92.39.118.127 de -92.39.118.128 - 92.39.118.255 mr -92.39.119.0 - 92.39.119.127 zm -92.39.119.128 - 92.39.119.255 mg -92.39.120.0 - 92.39.120.127 bw -92.39.120.128 - 92.39.120.255 gh -92.39.121.0 - 92.39.121.127 er -92.39.121.128 - 92.39.121.255 ao -92.39.122.0 - 92.39.122.127 na -92.39.122.128 - 92.39.122.255 km -92.39.123.0 - 92.39.123.127 gn -92.39.123.128 - 92.39.123.255 ht -92.39.124.0 - 92.39.124.127 af -92.39.124.128 - 92.39.124.255 td -92.39.125.0 - 92.39.125.127 bf -92.39.125.128 - 92.39.125.255 rw -92.39.126.0 - 92.39.126.127 tg -92.39.126.128 - 92.39.126.255 sd -92.39.127.0 - 92.39.127.127 rw -92.39.127.128 - 92.39.127.255 ng +92.39.112.0 - 92.39.127.255 a2 92.39.128.0 - 92.39.143.255 ru 92.39.144.0 - 92.39.159.255 it 92.39.160.0 - 92.39.175.255 at 92.39.176.0 - 92.39.191.255 ie 92.39.192.0 - 92.39.207.255 im 92.39.208.0 - 92.39.239.255 ru -92.39.240.0 - 92.39.253.255 es -92.39.254.0 - 92.39.255.255 fr +92.39.240.0 - 92.39.241.255 fr +92.39.242.0 - 92.39.242.255 it +92.39.243.0 - 92.39.243.3 es +92.39.243.4 - 92.39.244.223 fr +92.39.244.224 - 92.39.244.239 dz +92.39.244.240 - 92.39.245.137 fr +92.39.245.138 - 92.39.245.145 gb +92.39.245.146 - 92.39.245.146 de +92.39.245.147 - 92.39.245.153 fr +92.39.245.154 - 92.39.245.154 pt +92.39.245.155 - 92.39.245.200 fr +92.39.245.201 - 92.39.245.208 es +92.39.245.209 - 92.39.251.159 fr +92.39.251.160 - 92.39.251.191 dz +92.39.251.192 - 92.39.255.255 fr 92.40.0.0 - 92.41.255.255 gb 92.42.0.0 - 92.42.31.255 ru 92.42.32.0 - 92.42.39.255 tr @@ -58428,9 +33377,7 @@ 92.42.240.0 - 92.42.247.255 ch 92.42.248.0 - 92.42.255.255 rs 92.43.0.0 - 92.43.7.255 ru -92.43.8.0 - 92.43.13.255 ge -92.43.14.0 - 92.43.14.255 se -92.43.15.0 - 92.43.15.255 no +92.43.8.0 - 92.43.15.255 no 92.43.16.0 - 92.43.23.255 es 92.43.24.0 - 92.43.31.255 cz 92.43.32.0 - 92.43.39.255 se @@ -58442,9 +33389,9 @@ 92.43.80.0 - 92.43.87.255 tr 92.43.88.0 - 92.43.95.255 dk 92.43.96.0 - 92.43.103.255 at -92.43.104.0 - 92.43.111.63 de -92.43.111.64 - 92.43.111.95 jp -92.43.111.96 - 92.43.111.255 de +92.43.104.0 - 92.43.104.63 de +92.43.104.64 - 92.43.104.79 ch +92.43.104.80 - 92.43.111.255 de 92.43.112.0 - 92.43.119.255 pl 92.43.120.0 - 92.43.127.255 dk 92.43.128.0 - 92.43.135.255 fr @@ -58461,29 +33408,27 @@ 92.43.224.0 - 92.43.231.255 es 92.43.232.0 - 92.43.239.255 dk 92.43.240.0 - 92.43.247.255 it -92.43.248.0 - 92.43.248.127 fr -92.43.248.128 - 92.43.248.191 us -92.43.248.192 - 92.43.255.255 fr -92.44.0.0 - 92.45.31.32 tr -92.45.31.33 - 92.45.31.39 nl -92.45.31.40 - 92.45.255.255 tr +92.43.248.0 - 92.43.255.255 fr +92.44.0.0 - 92.45.255.255 tr 92.46.0.0 - 92.47.255.255 kz 92.48.0.0 - 92.48.63.255 sa -92.48.64.0 - 92.48.94.159 gb -92.48.94.160 - 92.48.94.175 rs -92.48.94.176 - 92.48.114.79 gb -92.48.114.80 - 92.48.114.87 rs -92.48.114.88 - 92.48.121.255 gb -92.48.122.0 - 92.48.122.63 rs -92.48.122.64 - 92.48.124.63 gb -92.48.124.64 - 92.48.124.95 rs -92.48.124.96 - 92.48.124.111 gb -92.48.124.112 - 92.48.124.127 rs -92.48.124.128 - 92.48.127.255 gb +92.48.64.0 - 92.48.127.255 gb 92.48.128.0 - 92.48.191.255 be 92.48.192.0 - 92.48.255.255 nl 92.49.0.0 - 92.49.63.255 lv -92.49.64.0 - 92.49.127.255 fr +92.49.64.0 - 92.49.78.255 fr +92.49.79.0 - 92.49.79.255 gp +92.49.80.0 - 92.49.80.255 fr +92.49.81.0 - 92.49.81.255 mq +92.49.82.0 - 92.49.95.255 fr +92.49.96.0 - 92.49.97.255 gp +92.49.98.0 - 92.49.101.255 fr +92.49.102.0 - 92.49.102.255 gp +92.49.103.0 - 92.49.119.255 fr +92.49.120.0 - 92.49.120.255 mq +92.49.121.0 - 92.49.124.255 fr +92.49.125.0 - 92.49.125.255 mq +92.49.126.0 - 92.49.127.255 fr 92.49.128.0 - 92.49.191.255 ru 92.49.192.0 - 92.49.255.255 ua 92.50.0.0 - 92.50.63.255 ir @@ -58491,38 +33436,39 @@ 92.50.128.0 - 92.51.63.255 ru 92.51.64.0 - 92.51.127.255 ge 92.51.128.0 - 92.51.191.255 de -92.51.192.0 - 92.51.255.255 ie +92.51.192.0 - 92.51.201.255 ie +92.51.202.0 - 92.51.202.255 us +92.51.203.0 - 92.51.255.255 ie 92.52.0.0 - 92.52.63.255 sk -92.52.64.0 - 92.52.68.255 gb -92.52.69.0 - 92.52.69.7 a2 -92.52.69.8 - 92.52.127.255 gb +92.52.64.0 - 92.52.127.255 gb 92.52.128.0 - 92.52.191.255 ua -92.52.192.0 - 92.52.255.255 hu +92.52.192.0 - 92.52.207.255 hu +92.52.208.0 - 92.52.211.255 us +92.52.212.0 - 92.52.255.255 hu 92.53.0.0 - 92.53.63.255 mk 92.53.64.0 - 92.53.127.255 ru 92.53.128.0 - 92.53.191.255 si +92.53.192.0 - 92.53.223.255 es +92.53.224.0 - 92.53.231.255 ru +92.53.232.0 - 92.53.239.255 se +92.53.240.0 - 92.53.247.255 gb +92.53.248.0 - 92.53.255.255 nl 92.54.0.0 - 92.54.63.255 es 92.54.64.0 - 92.54.127.255 ru 92.54.128.0 - 92.54.191.255 gb 92.54.192.0 - 92.54.255.255 ge 92.55.0.0 - 92.55.63.255 ru 92.55.64.0 - 92.55.127.255 mk -92.55.128.0 - 92.55.191.255 ro +92.55.128.0 - 92.55.159.255 ro +92.55.160.0 - 92.55.191.255 kz 92.55.192.0 - 92.55.255.255 pl 92.56.0.0 - 92.59.255.255 es 92.60.0.0 - 92.60.15.255 at 92.60.16.0 - 92.60.31.255 al -92.60.32.0 - 92.60.47.255 it 92.60.48.0 - 92.60.63.255 sk 92.60.64.0 - 92.60.79.255 it 92.60.80.0 - 92.60.95.255 ru -92.60.96.0 - 92.60.115.255 gb -92.60.116.0 - 92.60.116.255 es -92.60.117.0 - 92.60.123.255 gb -92.60.124.0 - 92.60.124.255 es -92.60.125.0 - 92.60.125.255 gb -92.60.126.0 - 92.60.126.255 es -92.60.127.0 - 92.60.127.255 gb +92.60.96.0 - 92.60.127.255 gb 92.60.128.0 - 92.60.143.255 pl 92.60.144.0 - 92.60.159.255 dk 92.60.160.0 - 92.60.175.255 es @@ -58544,22 +33490,13 @@ 92.61.160.0 - 92.61.175.255 fr 92.61.176.0 - 92.61.191.255 ir 92.61.192.0 - 92.61.207.255 ie -92.61.208.0 - 92.61.223.255 at +92.61.208.0 - 92.61.209.6 at +92.61.209.7 - 92.61.209.7 eu +92.61.209.8 - 92.61.223.255 at 92.61.224.0 - 92.61.239.255 il -92.61.240.0 - 92.61.244.255 nl -92.61.245.0 - 92.61.245.23 ch -92.61.245.24 - 92.61.245.27 bg -92.61.245.28 - 92.61.245.47 nl -92.61.245.48 - 92.61.245.63 us -92.61.245.64 - 92.61.245.127 cy -92.61.245.128 - 92.61.245.151 nz -92.61.245.152 - 92.61.245.255 nl -92.61.246.0 - 92.61.246.255 us -92.61.247.0 - 92.61.247.31 nl -92.61.247.32 - 92.61.247.63 lv -92.61.247.64 - 92.61.247.255 nl -92.61.248.0 - 92.61.251.255 us -92.61.252.0 - 92.61.255.255 nl +92.61.240.0 - 92.61.247.255 nl +92.61.248.0 - 92.61.250.255 us +92.61.251.0 - 92.61.255.255 nl 92.62.0.0 - 92.62.15.255 gb 92.62.16.0 - 92.62.31.255 at 92.62.32.0 - 92.62.47.255 no @@ -58573,162 +33510,94 @@ 92.62.160.0 - 92.62.175.255 lb 92.62.176.0 - 92.62.191.255 ir 92.62.192.0 - 92.62.207.255 dk -92.62.208.0 - 92.62.208.7 a2 -92.62.208.8 - 92.62.208.15 ng -92.62.208.16 - 92.62.208.23 a2 -92.62.208.24 - 92.62.208.39 ng -92.62.208.40 - 92.62.208.47 a2 +92.62.208.0 - 92.62.208.23 a2 +92.62.208.24 - 92.62.208.31 ng +92.62.208.32 - 92.62.208.47 a2 92.62.208.48 - 92.62.208.55 ng -92.62.208.56 - 92.62.208.63 a2 -92.62.208.64 - 92.62.208.71 ng -92.62.208.72 - 92.62.208.87 a2 -92.62.208.88 - 92.62.208.199 ng -92.62.208.200 - 92.62.208.207 a2 -92.62.208.208 - 92.62.209.7 ng -92.62.209.8 - 92.62.209.31 a2 -92.62.209.32 - 92.62.209.39 ng -92.62.209.40 - 92.62.209.255 a2 -92.62.210.0 - 92.62.210.7 ng -92.62.210.8 - 92.62.210.15 a2 -92.62.210.16 - 92.62.210.23 ng -92.62.210.24 - 92.62.210.31 a2 -92.62.210.32 - 92.62.210.39 ng -92.62.210.40 - 92.62.210.47 a2 -92.62.210.48 - 92.62.210.71 ng -92.62.210.72 - 92.62.210.87 a2 -92.62.210.88 - 92.62.210.95 ng -92.62.210.96 - 92.62.210.103 a2 -92.62.210.104 - 92.62.210.127 ng -92.62.210.128 - 92.62.210.135 a2 -92.62.210.136 - 92.62.210.167 ng -92.62.210.168 - 92.62.210.175 a2 -92.62.210.176 - 92.62.210.199 ng -92.62.210.200 - 92.62.210.207 a2 -92.62.210.208 - 92.62.210.223 ng -92.62.210.224 - 92.62.210.231 a2 -92.62.210.232 - 92.62.211.15 ng -92.62.211.16 - 92.62.211.23 a2 -92.62.211.24 - 92.62.211.31 ng -92.62.211.32 - 92.62.211.47 a2 -92.62.211.48 - 92.62.211.71 ng -92.62.211.72 - 92.62.211.79 a2 -92.62.211.80 - 92.62.211.103 ng +92.62.208.56 - 92.62.208.247 a2 +92.62.208.248 - 92.62.208.255 ng +92.62.209.0 - 92.62.210.55 a2 +92.62.210.56 - 92.62.210.63 ng +92.62.210.64 - 92.62.210.151 a2 +92.62.210.152 - 92.62.210.159 ng +92.62.210.160 - 92.62.210.183 a2 +92.62.210.184 - 92.62.210.191 ng +92.62.210.192 - 92.62.211.63 a2 +92.62.211.64 - 92.62.211.71 ng +92.62.211.72 - 92.62.211.95 a2 +92.62.211.96 - 92.62.211.103 ng 92.62.211.104 - 92.62.211.111 a2 92.62.211.112 - 92.62.211.119 ng -92.62.211.120 - 92.62.211.127 a2 -92.62.211.128 - 92.62.211.143 ng +92.62.211.120 - 92.62.211.135 a2 +92.62.211.136 - 92.62.211.143 ng 92.62.211.144 - 92.62.211.151 a2 92.62.211.152 - 92.62.211.159 ng -92.62.211.160 - 92.62.211.183 a2 -92.62.211.184 - 92.62.211.215 ng -92.62.211.216 - 92.62.211.231 a2 -92.62.211.232 - 92.62.211.255 ng -92.62.212.0 - 92.62.212.71 a2 +92.62.211.160 - 92.62.212.71 a2 92.62.212.72 - 92.62.212.79 ng 92.62.212.80 - 92.62.212.87 a2 92.62.212.88 - 92.62.212.95 ng -92.62.212.96 - 92.62.212.199 a2 -92.62.212.200 - 92.62.212.207 ng -92.62.212.208 - 92.62.212.239 a2 -92.62.212.240 - 92.62.212.247 ng -92.62.212.248 - 92.62.213.55 a2 -92.62.213.56 - 92.62.213.79 ng -92.62.213.80 - 92.62.216.7 a2 -92.62.216.8 - 92.62.216.15 ng -92.62.216.16 - 92.62.216.55 a2 -92.62.216.56 - 92.62.216.71 ng -92.62.216.72 - 92.62.216.111 a2 -92.62.216.112 - 92.62.216.127 ng -92.62.216.128 - 92.62.216.159 a2 -92.62.216.160 - 92.62.216.175 ng -92.62.216.176 - 92.62.216.183 a2 -92.62.216.184 - 92.62.216.215 ng -92.62.216.216 - 92.62.216.223 a2 -92.62.216.224 - 92.62.216.231 ng -92.62.216.232 - 92.62.217.255 a2 -92.62.218.0 - 92.62.218.23 ng -92.62.218.24 - 92.62.218.39 a2 -92.62.218.40 - 92.62.218.47 ng -92.62.218.48 - 92.62.218.55 a2 -92.62.218.56 - 92.62.218.71 ng -92.62.218.72 - 92.62.218.79 a2 -92.62.218.80 - 92.62.218.103 ng -92.62.218.104 - 92.62.218.119 a2 -92.62.218.120 - 92.62.218.127 ng -92.62.218.128 - 92.62.218.135 a2 -92.62.218.136 - 92.62.218.159 ng -92.62.218.160 - 92.62.218.191 a2 -92.62.218.192 - 92.62.218.247 ng -92.62.218.248 - 92.62.218.255 a2 -92.62.219.0 - 92.62.219.7 ng -92.62.219.8 - 92.62.219.15 a2 -92.62.219.16 - 92.62.219.23 ng -92.62.219.24 - 92.62.219.31 a2 -92.62.219.32 - 92.62.219.39 ng -92.62.219.40 - 92.62.219.47 a2 -92.62.219.48 - 92.62.219.79 ng -92.62.219.80 - 92.62.219.87 a2 -92.62.219.88 - 92.62.219.95 ng -92.62.219.96 - 92.62.219.119 a2 -92.62.219.120 - 92.62.219.127 ng -92.62.219.128 - 92.62.219.151 a2 -92.62.219.152 - 92.62.219.159 ng -92.62.219.160 - 92.62.219.167 a2 -92.62.219.168 - 92.62.219.175 ng -92.62.219.176 - 92.62.219.191 a2 -92.62.219.192 - 92.62.219.199 ng -92.62.219.200 - 92.62.219.215 a2 -92.62.219.216 - 92.62.219.223 ng -92.62.219.224 - 92.62.219.231 a2 -92.62.219.232 - 92.62.219.247 ng -92.62.219.248 - 92.62.220.31 a2 -92.62.220.32 - 92.62.220.39 ng -92.62.220.40 - 92.62.220.55 a2 +92.62.212.96 - 92.62.218.7 a2 +92.62.218.8 - 92.62.218.23 ng +92.62.218.24 - 92.62.218.255 a2 +92.62.219.0 - 92.62.219.255 ng +92.62.220.0 - 92.62.220.55 a2 92.62.220.56 - 92.62.220.63 ng -92.62.220.64 - 92.62.220.71 a2 -92.62.220.72 - 92.62.220.95 ng -92.62.220.96 - 92.62.220.103 a2 -92.62.220.104 - 92.62.220.135 ng -92.62.220.136 - 92.62.220.143 a2 -92.62.220.144 - 92.62.220.191 ng -92.62.220.192 - 92.62.221.47 a2 -92.62.221.48 - 92.62.221.55 ng -92.62.221.56 - 92.62.223.255 a2 +92.62.220.64 - 92.62.223.255 a2 92.62.224.0 - 92.62.239.255 cz 92.62.240.0 - 92.62.255.255 bg -92.63.0.0 - 92.63.7.255 gb -92.63.8.0 - 92.63.15.255 tr +92.63.0.0 - 92.63.15.255 tr 92.63.16.0 - 92.63.31.255 si 92.63.32.0 - 92.63.47.255 pl 92.63.48.0 - 92.63.63.255 cz 92.63.64.0 - 92.63.79.255 ru -92.63.80.0 - 92.63.86.255 lv -92.63.87.0 - 92.63.87.255 se -92.63.88.0 - 92.63.95.255 lv +92.63.80.0 - 92.63.95.255 lv 92.63.96.0 - 92.63.107.255 ru 92.63.108.0 - 92.63.111.255 be -92.63.112.0 - 92.63.127.255 lv +92.63.112.0 - 92.63.127.255 es 92.63.128.0 - 92.63.143.255 gb -92.63.144.0 - 92.63.155.255 at -92.63.156.0 - 92.63.157.255 hr -92.63.158.0 - 92.63.159.255 at -92.63.160.0 - 92.63.207.255 ru +92.63.144.0 - 92.63.159.255 at +92.63.160.0 - 92.63.175.255 nl +92.63.176.0 - 92.63.199.255 ru +92.63.200.0 - 92.63.207.255 fr 92.63.208.0 - 92.63.223.255 at 92.63.224.0 - 92.63.239.255 it 92.63.240.0 - 92.63.255.255 hu -92.64.0.0 - 92.65.52.95 nl -92.65.52.96 - 92.65.52.103 it -92.65.52.104 - 92.71.0.191 nl -92.71.0.192 - 92.71.0.255 de -92.71.1.0 - 92.71.3.255 nl -92.71.4.0 - 92.71.4.255 se -92.71.5.0 - 92.71.6.159 nl -92.71.6.160 - 92.71.6.175 de -92.71.6.176 - 92.71.7.255 nl -92.71.8.0 - 92.71.8.127 de -92.71.8.128 - 92.71.8.255 nl -92.71.9.0 - 92.71.9.255 es -92.71.10.0 - 92.71.255.255 nl +92.64.0.0 - 92.71.6.135 nl +92.71.6.136 - 92.71.6.143 gb +92.71.6.144 - 92.71.8.255 nl +92.71.9.0 - 92.71.9.3 es +92.71.9.4 - 92.71.9.255 nl +92.71.10.0 - 92.71.11.255 gb +92.71.12.0 - 92.71.12.255 nl +92.71.13.0 - 92.71.13.1 be +92.71.13.2 - 92.71.13.3 eu +92.71.13.4 - 92.71.13.255 be +92.71.14.0 - 92.71.17.95 nl +92.71.17.96 - 92.71.17.127 gb +92.71.17.128 - 92.71.21.159 nl +92.71.21.160 - 92.71.21.191 fr +92.71.21.192 - 92.71.47.255 nl +92.71.48.0 - 92.71.55.255 de +92.71.56.0 - 92.71.59.255 fr +92.71.60.0 - 92.71.63.255 gb +92.71.64.0 - 92.71.67.255 be +92.71.68.0 - 92.71.69.255 lu +92.71.70.0 - 92.71.71.255 ie +92.71.72.0 - 92.71.73.255 es +92.71.74.0 - 92.71.75.255 pt +92.71.76.0 - 92.71.77.255 it +92.71.78.0 - 92.71.79.255 ch +92.71.80.0 - 92.71.81.255 at +92.71.82.0 - 92.71.83.255 pl +92.71.84.0 - 92.71.85.255 dk +92.71.86.0 - 92.71.87.255 no +92.71.88.0 - 92.71.89.255 se +92.71.90.0 - 92.71.91.255 fi +92.71.92.0 - 92.71.93.255 sk +92.71.94.0 - 92.71.95.255 tr +92.71.96.0 - 92.71.97.255 us +92.71.98.0 - 92.71.99.255 hk +92.71.100.0 - 92.71.255.255 nl 92.72.0.0 - 92.79.255.255 de 92.80.0.0 - 92.87.255.255 ro 92.88.0.0 - 92.95.255.255 fr @@ -58738,40 +33607,46 @@ 92.104.0.0 - 92.107.255.255 ch 92.108.0.0 - 92.111.255.255 nl 92.112.0.0 - 92.113.255.255 ua -92.114.0.0 - 92.114.0.255 md -92.114.1.0 - 92.114.82.255 ro -92.114.83.0 - 92.114.83.255 ch -92.114.84.0 - 92.114.127.255 ro -92.114.128.0 - 92.115.255.255 md +92.114.0.0 - 92.114.3.255 ro +92.114.4.0 - 92.114.4.255 eg +92.114.5.0 - 92.114.6.255 ro +92.114.7.0 - 92.114.7.255 us +92.114.8.0 - 92.114.15.255 ro +92.114.16.0 - 92.114.31.255 ir +92.114.32.0 - 92.114.34.255 ro +92.114.35.0 - 92.114.35.255 gb +92.114.36.0 - 92.114.36.255 kr +92.114.37.0 - 92.114.39.255 ro +92.114.40.0 - 92.114.47.255 ps +92.114.48.0 - 92.114.51.255 ir +92.114.52.0 - 92.114.52.255 ro +92.114.53.0 - 92.114.53.255 jp +92.114.54.0 - 92.114.59.255 ro +92.114.60.0 - 92.114.63.255 au +92.114.64.0 - 92.114.82.255 ro +92.114.83.0 - 92.114.83.255 au +92.114.84.0 - 92.114.91.255 ro +92.114.92.0 - 92.114.92.255 it +92.114.93.0 - 92.114.186.255 ro +92.114.187.0 - 92.114.187.255 md +92.114.188.0 - 92.114.222.255 ro +92.114.223.0 - 92.114.223.255 md +92.114.224.0 - 92.114.225.255 ro +92.114.226.0 - 92.114.226.255 md +92.114.227.0 - 92.115.9.255 ro +92.115.10.0 - 92.115.10.255 md +92.115.11.0 - 92.115.143.255 ro +92.115.144.0 - 92.115.144.255 md +92.115.145.0 - 92.115.176.255 ro +92.115.177.0 - 92.115.177.255 md +92.115.178.0 - 92.115.211.255 ro +92.115.212.0 - 92.115.212.255 md +92.115.213.0 - 92.115.236.255 ro +92.115.237.0 - 92.115.237.255 md +92.115.238.0 - 92.115.255.255 ro 92.116.0.0 - 92.117.255.255 de 92.118.0.0 - 92.119.255.255 gr -92.120.0.0 - 92.120.66.63 nl -92.120.66.64 - 92.120.66.127 tr -92.120.66.128 - 92.120.66.255 de -92.120.67.0 - 92.120.67.127 ch -92.120.67.128 - 92.120.87.255 nl -92.120.88.0 - 92.120.95.255 de -92.120.96.0 - 92.120.111.255 nl -92.120.112.0 - 92.120.113.255 gb -92.120.114.0 - 92.120.115.255 nl -92.120.116.0 - 92.120.117.127 gb -92.120.117.128 - 92.120.117.255 nl -92.120.118.0 - 92.120.119.255 il -92.120.120.0 - 92.120.123.255 nl -92.120.124.0 - 92.120.127.255 in -92.120.128.0 - 92.120.131.255 nl -92.120.132.0 - 92.120.135.255 sg -92.120.136.0 - 92.120.175.255 nl -92.120.176.0 - 92.120.191.255 cn -92.120.192.0 - 92.120.193.255 nl -92.120.194.0 - 92.120.197.255 cn -92.120.198.0 - 92.120.199.255 nl -92.120.200.0 - 92.120.207.255 cn -92.120.208.0 - 92.120.223.255 ph -92.120.224.0 - 92.120.231.255 th -92.120.232.0 - 92.120.239.255 hk -92.120.240.0 - 92.120.255.255 th -92.121.0.0 - 92.121.255.255 nl +92.120.0.0 - 92.121.255.255 nl 92.122.0.0 - 92.122.15.255 eu 92.122.16.0 - 92.122.19.255 gb 92.122.20.0 - 92.122.23.255 fr @@ -58794,27 +33669,250 @@ 92.122.244.0 - 92.122.247.255 fr 92.122.248.0 - 92.122.255.255 eu 92.123.0.0 - 92.123.31.255 fr -92.123.32.0 - 92.123.43.255 nl -92.123.44.0 - 92.123.47.255 eu +92.123.32.0 - 92.123.47.255 eu 92.123.48.0 - 92.123.59.255 nl 92.123.60.0 - 92.123.154.255 eu 92.123.155.0 - 92.123.155.255 se 92.123.156.0 - 92.123.255.255 eu 92.124.0.0 - 92.127.255.255 ru -92.128.0.0 - 92.191.255.255 fr -92.192.0.0 - 92.198.27.12 de -92.198.27.13 - 92.198.27.13 a2 -92.198.27.14 - 92.198.54.79 de -92.198.54.80 - 92.198.54.87 a2 -92.198.54.88 - 92.198.68.247 de -92.198.68.248 - 92.198.68.255 a2 -92.198.69.0 - 92.231.255.255 de -92.232.0.0 - 92.239.255.255 gb -92.240.0.0 - 92.240.31.255 il +92.128.0.0 - 92.168.1.74 fr +92.168.1.75 - 92.168.1.75 re +92.168.1.76 - 92.174.249.165 fr +92.174.249.166 - 92.174.249.166 es +92.174.249.167 - 92.176.136.93 fr +92.176.136.94 - 92.176.136.94 es +92.176.136.95 - 92.176.138.47 fr +92.176.138.48 - 92.176.138.48 es +92.176.138.49 - 92.176.172.255 fr +92.176.173.0 - 92.176.173.255 es +92.176.174.0 - 92.177.0.255 fr +92.177.1.0 - 92.177.1.255 es +92.177.2.0 - 92.177.18.38 fr +92.177.18.39 - 92.177.18.39 es +92.177.18.40 - 92.177.31.140 fr +92.177.31.141 - 92.177.31.141 es +92.177.31.142 - 92.177.82.255 fr +92.177.83.0 - 92.177.83.255 es +92.177.84.0 - 92.184.255.255 fr +92.185.0.0 - 92.185.0.255 es +92.185.1.0 - 92.185.2.255 fr +92.185.3.0 - 92.185.3.255 es +92.185.4.0 - 92.185.7.255 fr +92.185.8.0 - 92.185.8.255 es +92.185.9.0 - 92.185.11.75 fr +92.185.11.76 - 92.185.11.76 es +92.185.11.77 - 92.185.11.248 fr +92.185.11.249 - 92.185.11.249 es +92.185.11.250 - 92.185.17.146 fr +92.185.17.147 - 92.185.17.147 es +92.185.17.148 - 92.185.21.255 fr +92.185.22.0 - 92.185.22.255 es +92.185.23.0 - 92.185.25.255 fr +92.185.26.0 - 92.185.26.255 es +92.185.27.0 - 92.185.27.255 fr +92.185.28.0 - 92.185.28.255 es +92.185.29.0 - 92.185.30.133 fr +92.185.30.134 - 92.185.30.134 es +92.185.30.135 - 92.185.31.174 fr +92.185.31.175 - 92.185.31.175 es +92.185.31.176 - 92.185.32.213 fr +92.185.32.214 - 92.185.32.214 es +92.185.32.215 - 92.185.36.77 fr +92.185.36.78 - 92.185.36.78 es +92.185.36.79 - 92.185.38.255 fr +92.185.39.0 - 92.185.39.255 es +92.185.40.0 - 92.185.40.255 fr +92.185.41.0 - 92.185.41.255 es +92.185.42.0 - 92.185.42.231 fr +92.185.42.232 - 92.185.42.232 es +92.185.42.233 - 92.185.43.40 fr +92.185.43.41 - 92.185.43.41 es +92.185.43.42 - 92.185.43.59 fr +92.185.43.60 - 92.185.43.60 es +92.185.43.61 - 92.185.66.255 fr +92.185.67.0 - 92.185.67.255 es +92.185.68.0 - 92.185.68.111 fr +92.185.68.112 - 92.185.68.112 es +92.185.68.113 - 92.185.69.224 fr +92.185.69.225 - 92.185.69.225 es +92.185.69.226 - 92.185.84.1 fr +92.185.84.2 - 92.185.84.2 es +92.185.84.3 - 92.185.87.214 fr +92.185.87.215 - 92.185.87.215 es +92.185.87.216 - 92.185.90.255 fr +92.185.91.0 - 92.185.91.255 es +92.185.92.0 - 92.185.105.132 fr +92.185.105.133 - 92.185.105.133 es +92.185.105.134 - 92.185.109.2 fr +92.185.109.3 - 92.185.109.3 es +92.185.109.4 - 92.185.111.57 fr +92.185.111.58 - 92.185.111.58 es +92.185.111.59 - 92.185.111.232 fr +92.185.111.233 - 92.185.111.233 es +92.185.111.234 - 92.185.111.255 fr +92.185.112.0 - 92.185.112.255 es +92.185.113.0 - 92.185.122.157 fr +92.185.122.158 - 92.185.122.158 es +92.185.122.159 - 92.185.124.255 fr +92.185.125.0 - 92.185.125.255 es +92.185.126.0 - 92.186.8.255 fr +92.186.9.0 - 92.186.9.255 es +92.186.10.0 - 92.186.11.255 fr +92.186.12.0 - 92.186.13.255 es +92.186.14.0 - 92.186.15.255 fr +92.186.16.0 - 92.186.17.255 es +92.186.18.0 - 92.186.18.255 fr +92.186.19.0 - 92.186.19.255 es +92.186.20.0 - 92.186.44.255 fr +92.186.45.0 - 92.186.45.255 es +92.186.46.0 - 92.186.55.255 fr +92.186.56.0 - 92.186.56.255 es +92.186.57.0 - 92.186.62.255 fr +92.186.63.0 - 92.186.63.255 es +92.186.64.0 - 92.186.68.255 fr +92.186.69.0 - 92.186.69.255 es +92.186.70.0 - 92.186.75.255 fr +92.186.76.0 - 92.186.76.255 es +92.186.77.0 - 92.186.89.255 fr +92.186.90.0 - 92.186.90.255 es +92.186.91.0 - 92.186.115.255 fr +92.186.116.0 - 92.186.116.255 es +92.186.117.0 - 92.186.121.255 fr +92.186.122.0 - 92.186.123.255 es +92.186.124.0 - 92.186.129.255 fr +92.186.130.0 - 92.186.130.255 es +92.186.131.0 - 92.186.143.99 fr +92.186.143.100 - 92.186.143.100 es +92.186.143.101 - 92.186.146.255 fr +92.186.147.0 - 92.186.147.255 es +92.186.148.0 - 92.186.180.193 fr +92.186.180.194 - 92.186.180.194 es +92.186.180.195 - 92.186.189.255 fr +92.186.190.0 - 92.186.190.255 es +92.186.191.0 - 92.186.237.255 fr +92.186.238.0 - 92.186.238.255 es +92.186.239.0 - 92.186.239.255 fr +92.186.240.0 - 92.186.240.255 es +92.186.241.0 - 92.186.253.255 fr +92.186.254.0 - 92.186.254.255 es +92.186.255.0 - 92.187.5.255 fr +92.187.6.0 - 92.187.6.255 es +92.187.7.0 - 92.187.11.255 fr +92.187.12.0 - 92.187.12.255 es +92.187.13.0 - 92.187.13.32 fr +92.187.13.33 - 92.187.13.33 es +92.187.13.34 - 92.187.15.255 fr +92.187.16.0 - 92.187.16.255 es +92.187.17.0 - 92.187.25.255 fr +92.187.26.0 - 92.187.26.255 es +92.187.27.0 - 92.187.27.255 fr +92.187.28.0 - 92.187.28.255 es +92.187.29.0 - 92.191.255.255 fr +92.192.0.0 - 92.198.43.196 de +92.198.43.197 - 92.198.43.197 eu +92.198.43.198 - 92.206.255.255 de +92.207.0.0 - 92.207.27.255 gb +92.207.28.0 - 92.207.28.255 de +92.207.29.0 - 92.207.255.255 gb +92.208.0.0 - 92.210.182.255 de +92.210.183.0 - 92.210.183.255 us +92.210.184.0 - 92.219.255.255 de +92.220.0.0 - 92.221.255.255 no +92.222.0.0 - 92.222.3.128 fr +92.222.3.129 - 92.222.3.129 pt +92.222.3.130 - 92.222.5.207 fr +92.222.5.208 - 92.222.5.208 pt +92.222.5.209 - 92.222.5.255 fr +92.222.6.0 - 92.222.6.255 de +92.222.7.0 - 92.222.12.166 fr +92.222.12.167 - 92.222.12.167 es +92.222.12.168 - 92.222.103.175 fr +92.222.103.176 - 92.222.103.183 pl +92.222.103.184 - 92.222.103.191 gb +92.222.103.192 - 92.222.105.127 fr +92.222.105.128 - 92.222.105.143 gb +92.222.105.144 - 92.222.110.151 fr +92.222.110.152 - 92.222.110.159 be +92.222.110.160 - 92.222.120.191 fr +92.222.120.192 - 92.222.120.207 de +92.222.120.208 - 92.222.121.119 fr +92.222.121.120 - 92.222.121.123 cz +92.222.121.124 - 92.222.124.47 fr +92.222.124.48 - 92.222.124.51 be +92.222.124.52 - 92.222.125.191 fr +92.222.125.192 - 92.222.125.207 gb +92.222.125.208 - 92.222.150.87 fr +92.222.150.88 - 92.222.150.88 es +92.222.150.89 - 92.222.158.219 fr +92.222.158.220 - 92.222.158.220 hr +92.222.158.221 - 92.222.159.41 fr +92.222.159.42 - 92.222.159.42 es +92.222.159.43 - 92.222.175.255 fr +92.222.176.0 - 92.222.176.255 gb +92.222.177.0 - 92.222.193.229 fr +92.222.193.230 - 92.222.193.230 de +92.222.193.231 - 92.222.193.235 fr +92.222.193.236 - 92.222.193.236 de +92.222.193.237 - 92.222.196.119 fr +92.222.196.120 - 92.222.196.127 gb +92.222.196.128 - 92.222.212.255 fr +92.222.213.0 - 92.222.213.63 nl +92.222.213.64 - 92.222.231.95 fr +92.222.231.96 - 92.222.231.127 es +92.222.231.128 - 92.222.231.191 fr +92.222.231.192 - 92.222.231.192 es +92.222.231.193 - 92.222.231.207 fr +92.222.231.208 - 92.222.231.208 es +92.222.231.209 - 92.222.231.209 fr +92.222.231.210 - 92.222.231.211 es +92.222.231.212 - 92.222.243.255 fr +92.222.244.0 - 92.222.244.127 nl +92.222.244.128 - 92.222.255.255 fr +92.223.0.0 - 92.223.3.255 de +92.223.4.0 - 92.223.15.255 ru +92.223.16.0 - 92.223.17.255 sg +92.223.18.0 - 92.223.19.255 ru +92.223.20.0 - 92.223.27.255 lu +92.223.28.0 - 92.223.31.255 at +92.223.32.0 - 92.223.39.255 ru +92.223.40.0 - 92.223.89.255 at +92.223.90.0 - 92.223.90.255 cy +92.223.91.0 - 92.223.111.255 at +92.223.112.0 - 92.223.112.255 lu +92.223.113.0 - 92.223.113.255 at +92.223.114.0 - 92.223.114.255 ru +92.223.115.0 - 92.223.115.255 at +92.223.116.0 - 92.223.116.255 sg +92.223.117.0 - 92.223.117.255 at +92.223.118.0 - 92.223.121.255 us +92.223.122.0 - 92.223.123.255 ru +92.223.124.0 - 92.223.125.255 de +92.223.126.0 - 92.223.127.255 nl +92.223.128.0 - 92.223.212.255 it +92.223.213.0 - 92.223.213.171 us +92.223.213.172 - 92.223.213.172 it +92.223.213.173 - 92.223.213.255 us +92.223.214.0 - 92.223.239.255 it +92.223.240.0 - 92.223.240.115 nl +92.223.240.116 - 92.223.240.119 it +92.223.240.120 - 92.223.240.183 nl +92.223.240.184 - 92.223.240.199 it +92.223.240.200 - 92.223.241.191 nl +92.223.241.192 - 92.223.241.255 it +92.223.242.0 - 92.223.243.255 nl +92.223.244.0 - 92.223.255.255 it +92.224.0.0 - 92.231.255.255 de +92.232.0.0 - 92.234.255.255 gb +92.235.0.0 - 92.235.63.255 ie +92.235.64.0 - 92.235.255.255 be +92.236.0.0 - 92.240.15.255 gb +92.240.16.0 - 92.240.31.255 il 92.240.32.0 - 92.240.63.255 ba 92.240.64.0 - 92.240.95.255 lv 92.240.96.0 - 92.240.127.255 ua -92.240.128.0 - 92.240.159.255 ru +92.240.128.0 - 92.240.143.255 ru +92.240.144.0 - 92.240.151.255 nl +92.240.152.0 - 92.240.159.255 fi 92.240.160.0 - 92.240.191.255 cz 92.240.192.0 - 92.240.223.255 ru 92.240.224.0 - 92.240.255.255 sk @@ -58823,18 +33921,15 @@ 92.241.64.0 - 92.241.95.255 ge 92.241.96.0 - 92.241.127.255 ru 92.241.128.0 - 92.241.159.255 ba -92.241.160.0 - 92.241.162.127 ru -92.241.162.128 - 92.241.162.159 my -92.241.162.160 - 92.241.162.223 ru -92.241.162.224 - 92.241.162.255 mh -92.241.163.0 - 92.241.170.127 ru -92.241.170.128 - 92.241.170.135 es -92.241.170.136 - 92.241.191.255 ru -92.241.192.0 - 92.241.223.255 se +92.241.160.0 - 92.241.191.255 ru +92.241.192.0 - 92.241.194.255 se +92.241.195.0 - 92.241.195.255 dk +92.241.196.0 - 92.241.196.255 se +92.241.197.0 - 92.241.197.255 dk +92.241.198.0 - 92.241.223.255 se 92.241.224.0 - 92.242.95.255 ru 92.242.96.0 - 92.242.127.255 ua 92.242.128.0 - 92.242.159.255 gb -92.242.160.0 - 92.242.191.255 fi 92.242.192.0 - 92.242.223.255 ir 92.242.224.0 - 92.242.255.255 hr 92.243.0.0 - 92.243.31.255 fr @@ -58862,33 +33957,43 @@ 92.245.224.0 - 92.245.255.255 gb 92.246.0.0 - 92.246.31.255 dk 92.246.32.0 - 92.246.63.255 it -92.246.64.0 - 92.246.95.255 ru 92.246.96.0 - 92.246.127.255 it 92.246.128.0 - 92.246.223.255 ru -92.246.224.0 - 92.246.255.255 ch +92.246.224.0 - 92.246.255.255 ie 92.247.0.0 - 92.247.255.255 bg 92.248.0.0 - 92.248.127.255 at -92.248.128.0 - 92.249.63.255 ru +92.248.128.0 - 92.248.255.255 ru 92.249.64.0 - 92.249.127.255 ua 92.249.128.0 - 92.249.255.255 hu 92.250.0.0 - 92.250.127.255 pt 92.250.128.0 - 92.250.175.255 lu -92.250.176.0 - 92.250.255.255 de +92.250.176.0 - 92.250.199.255 de +92.250.200.0 - 92.250.210.255 lu +92.250.211.0 - 92.250.215.255 de +92.250.216.0 - 92.250.219.255 lu +92.250.220.0 - 92.250.225.255 fr +92.250.226.0 - 92.250.229.255 lu +92.250.230.0 - 92.250.243.255 de +92.250.244.0 - 92.250.247.255 lu +92.250.248.0 - 92.250.251.255 de +92.250.252.0 - 92.250.255.255 lu 92.251.0.0 - 92.251.127.255 mt 92.251.128.0 - 92.251.255.255 ie 92.252.0.0 - 92.252.127.255 de 92.252.128.0 - 92.252.255.255 ru 92.253.0.0 - 92.253.127.255 jo -92.253.128.0 - 92.253.135.255 cz -92.253.136.0 - 92.253.143.255 ua -92.253.144.0 - 92.253.255.255 cz +92.253.128.0 - 92.253.159.255 cz +92.253.160.0 - 92.253.199.255 ru +92.253.200.0 - 92.253.200.127 ua +92.253.200.128 - 92.253.200.255 cz +92.253.201.0 - 92.253.207.255 ru +92.253.208.0 - 92.253.208.255 de +92.253.209.0 - 92.253.255.255 cz 92.254.0.0 - 92.254.127.255 nl 92.254.128.0 - 92.254.255.255 se 92.255.0.0 - 92.255.255.255 ru 93.0.0.0 - 93.31.255.255 fr -93.32.0.0 - 93.62.236.159 it -93.62.236.160 - 93.62.236.167 a2 -93.62.236.168 - 93.71.255.255 it +93.32.0.0 - 93.71.255.255 it 93.72.0.0 - 93.79.255.255 ua 93.80.0.0 - 93.81.255.255 ru 93.82.0.0 - 93.83.255.255 at @@ -58912,9 +34017,7 @@ 93.89.32.0 - 93.89.47.255 no 93.89.48.0 - 93.89.63.255 it 93.89.64.0 - 93.89.79.255 tr -93.89.80.0 - 93.89.82.215 gb -93.89.82.216 - 93.89.82.223 es -93.89.82.224 - 93.89.95.255 gb +93.89.80.0 - 93.89.95.255 gb 93.89.96.0 - 93.89.111.255 cz 93.89.112.0 - 93.89.127.255 no 93.89.128.0 - 93.89.143.255 gb @@ -58923,31 +34026,27 @@ 93.89.176.0 - 93.89.191.255 ru 93.89.192.0 - 93.89.207.255 pl 93.89.208.0 - 93.89.223.255 ua -93.89.224.0 - 93.89.239.255 tr +93.89.224.0 - 93.89.239.255 cy 93.89.240.0 - 93.89.255.255 ie 93.90.0.0 - 93.90.15.255 dk 93.90.16.0 - 93.90.31.255 es 93.90.32.0 - 93.90.47.255 ru 93.90.48.0 - 93.90.63.255 fi -93.90.64.0 - 93.90.79.255 al 93.90.80.0 - 93.90.111.255 ru 93.90.112.0 - 93.90.127.255 dk 93.90.128.0 - 93.90.143.255 de 93.90.144.0 - 93.90.159.255 se 93.90.160.0 - 93.90.175.255 cz -93.90.176.0 - 93.90.183.167 de -93.90.183.168 - 93.90.183.175 nl -93.90.183.176 - 93.90.191.255 de +93.90.176.0 - 93.90.191.255 de 93.90.192.0 - 93.90.207.255 gb 93.90.208.0 - 93.91.15.255 ru 93.91.16.0 - 93.91.47.255 gb 93.91.48.0 - 93.91.63.255 cz 93.91.64.0 - 93.91.79.255 tr -93.91.80.0 - 93.91.95.255 a2 -93.91.96.0 - 93.91.103.255 no -93.91.104.0 - 93.91.105.255 fi -93.91.106.0 - 93.91.107.255 se -93.91.108.0 - 93.91.111.255 no +93.91.80.0 - 93.91.80.255 de +93.91.81.0 - 93.91.95.223 a2 +93.91.95.224 - 93.91.95.255 de +93.91.96.0 - 93.91.111.255 no 93.91.112.0 - 93.91.127.255 ru 93.91.128.0 - 93.91.143.255 it 93.91.144.0 - 93.91.159.255 cz @@ -58960,14 +34059,9 @@ 93.92.0.0 - 93.92.7.255 se 93.92.8.0 - 93.92.15.255 ie 93.92.16.0 - 93.92.23.255 be -93.92.24.0 - 93.92.31.255 no +93.92.24.0 - 93.92.31.255 nl 93.92.32.0 - 93.92.39.255 ru -93.92.40.0 - 93.92.41.255 de -93.92.42.0 - 93.92.42.255 nl -93.92.43.0 - 93.92.43.255 ua -93.92.44.0 - 93.92.44.255 bz -93.92.45.0 - 93.92.46.255 gb -93.92.47.0 - 93.92.47.255 bs +93.92.40.0 - 93.92.47.255 de 93.92.48.0 - 93.92.55.255 cz 93.92.56.0 - 93.92.63.255 hu 93.92.64.0 - 93.92.71.255 ru @@ -58988,95 +34082,60 @@ 93.92.192.0 - 93.92.207.255 ru 93.92.208.0 - 93.92.215.255 gb 93.92.216.0 - 93.92.223.255 ru -93.92.224.0 - 93.92.239.255 es +93.92.232.0 - 93.92.239.255 es 93.92.240.0 - 93.92.247.255 it 93.92.248.0 - 93.92.255.255 rs 93.93.0.0 - 93.93.7.255 de 93.93.8.0 - 93.93.15.255 bg 93.93.16.0 - 93.93.23.255 it 93.93.24.0 - 93.93.31.255 tr -93.93.32.0 - 93.93.39.255 ru +93.93.32.0 - 93.93.39.255 cz 93.93.40.0 - 93.93.47.255 fr -93.93.48.0 - 93.93.48.255 hk -93.93.49.0 - 93.93.50.255 hu -93.93.51.0 - 93.93.51.255 sc -93.93.52.0 - 93.93.52.255 hu -93.93.53.0 - 93.93.53.255 sc -93.93.54.0 - 93.93.55.255 us +93.93.48.0 - 93.93.55.255 lu 93.93.56.0 - 93.93.63.255 lt 93.93.64.0 - 93.93.71.255 es -93.93.72.0 - 93.93.79.15 no -93.93.79.16 - 93.93.79.31 nl -93.93.79.32 - 93.93.79.255 no +93.93.72.0 - 93.93.72.97 gb +93.93.72.98 - 93.93.72.98 no +93.93.72.99 - 93.93.72.160 gb +93.93.72.161 - 93.93.72.161 fr +93.93.72.162 - 93.93.72.162 gb +93.93.72.163 - 93.93.72.163 de +93.93.72.164 - 93.93.72.164 pl +93.93.72.165 - 93.93.72.165 nl +93.93.72.166 - 93.93.72.166 se +93.93.72.167 - 93.93.72.167 pt +93.93.72.168 - 93.93.72.170 gb +93.93.72.171 - 93.93.72.171 ru +93.93.72.172 - 93.93.72.255 gb +93.93.73.0 - 93.93.79.255 no 93.93.80.0 - 93.93.87.255 gb 93.93.88.0 - 93.93.95.255 ru -93.93.96.0 - 93.93.96.63 no -93.93.96.64 - 93.93.96.127 gb +93.93.96.0 - 93.93.96.95 no +93.93.96.96 - 93.93.96.127 gb 93.93.96.128 - 93.93.96.159 no 93.93.96.160 - 93.93.96.191 de 93.93.96.192 - 93.93.96.223 nl -93.93.96.224 - 93.93.97.95 no -93.93.97.96 - 93.93.97.103 gb -93.93.97.104 - 93.93.97.135 no -93.93.97.136 - 93.93.97.139 de -93.93.97.140 - 93.93.97.143 gb -93.93.97.144 - 93.93.97.147 ge -93.93.97.148 - 93.93.97.151 no -93.93.97.152 - 93.93.97.155 ne -93.93.97.156 - 93.93.97.175 no -93.93.97.176 - 93.93.97.187 ne -93.93.97.188 - 93.93.97.199 no -93.93.97.200 - 93.93.97.211 gb -93.93.97.212 - 93.93.97.215 ge -93.93.97.216 - 93.93.97.219 ne -93.93.97.220 - 93.93.97.255 no -93.93.98.0 - 93.93.98.31 us -93.93.98.32 - 93.93.98.63 no -93.93.98.64 - 93.93.98.223 us -93.93.98.224 - 93.93.98.255 no -93.93.99.0 - 93.93.99.31 us -93.93.99.32 - 93.93.99.119 no -93.93.99.120 - 93.93.99.183 us -93.93.99.184 - 93.93.99.187 no -93.93.99.188 - 93.93.99.203 us -93.93.99.204 - 93.93.99.211 no -93.93.99.212 - 93.93.99.219 us -93.93.99.220 - 93.93.99.223 no -93.93.99.224 - 93.93.99.255 us -93.93.100.0 - 93.93.100.63 in +93.93.96.224 - 93.93.97.255 no +93.93.98.0 - 93.93.98.63 us +93.93.98.64 - 93.93.98.127 no +93.93.98.128 - 93.93.98.255 us +93.93.99.0 - 93.93.100.63 no 93.93.100.64 - 93.93.100.95 hk 93.93.100.96 - 93.93.100.127 no 93.93.100.128 - 93.93.100.159 sg 93.93.100.160 - 93.93.100.191 no 93.93.100.192 - 93.93.100.223 au -93.93.100.224 - 93.93.100.255 no -93.93.101.0 - 93.93.101.64 si -93.93.101.65 - 93.93.101.95 no -93.93.101.96 - 93.93.101.127 us -93.93.101.128 - 93.93.101.175 no -93.93.101.176 - 93.93.101.183 hk -93.93.101.184 - 93.93.101.195 au -93.93.101.196 - 93.93.101.199 hk -93.93.101.200 - 93.93.101.207 sg -93.93.101.208 - 93.93.101.211 au -93.93.101.212 - 93.93.101.219 no -93.93.101.220 - 93.93.101.239 hk -93.93.101.240 - 93.93.102.63 no -93.93.102.64 - 93.93.102.95 hk -93.93.102.96 - 93.93.102.127 no -93.93.102.128 - 93.93.102.151 us -93.93.102.152 - 93.93.102.159 no -93.93.102.160 - 93.93.102.167 us -93.93.102.168 - 93.93.102.175 no -93.93.102.176 - 93.93.102.191 us -93.93.102.192 - 93.93.102.207 no -93.93.102.208 - 93.93.102.255 us -93.93.103.0 - 93.93.103.255 no -93.93.104.0 - 93.93.111.255 iq +93.93.100.224 - 93.93.101.95 no +93.93.101.96 - 93.93.101.127 a2 +93.93.101.128 - 93.93.102.95 no +93.93.102.96 - 93.93.102.127 a2 +93.93.102.128 - 93.93.102.255 no +93.93.103.0 - 93.93.103.255 sg 93.93.112.0 - 93.93.119.255 es 93.93.120.0 - 93.93.127.255 nl 93.93.128.0 - 93.93.135.255 gb -93.93.136.0 - 93.93.151.255 ru +93.93.136.0 - 93.93.143.255 ru +93.93.144.0 - 93.93.151.255 jo 93.93.152.0 - 93.93.159.255 fr 93.93.160.0 - 93.93.167.255 it 93.93.168.0 - 93.93.175.255 ru @@ -59085,53 +34144,24 @@ 93.93.192.0 - 93.93.199.255 rs 93.93.200.0 - 93.93.207.255 it 93.93.208.0 - 93.93.239.255 gb -93.93.240.0 - 93.93.247.255 be 93.93.248.0 - 93.94.7.255 de 93.94.8.0 - 93.94.15.255 no +93.94.16.0 - 93.94.23.255 pl 93.94.24.0 - 93.94.39.255 it 93.94.40.0 - 93.94.47.255 il 93.94.48.0 - 93.94.55.255 iq -93.94.56.0 - 93.94.58.31 pt -93.94.58.32 - 93.94.58.39 ao -93.94.58.40 - 93.94.63.255 pt +93.94.56.0 - 93.94.63.255 pt 93.94.64.0 - 93.94.71.255 ch 93.94.72.0 - 93.94.79.255 gb 93.94.80.0 - 93.94.87.255 de 93.94.88.0 - 93.94.95.255 it 93.94.96.0 - 93.94.103.255 es -93.94.104.0 - 93.94.107.15 be -93.94.107.16 - 93.94.107.31 hu -93.94.107.32 - 93.94.109.15 be -93.94.109.16 - 93.94.109.31 hu -93.94.109.32 - 93.94.111.255 be -93.94.112.0 - 93.94.112.15 ie -93.94.112.16 - 93.94.112.27 gb -93.94.112.28 - 93.94.112.95 ie -93.94.112.96 - 93.94.112.135 gb -93.94.112.136 - 93.94.112.139 ie -93.94.112.140 - 93.94.112.159 gb -93.94.112.160 - 93.94.112.207 ie -93.94.112.208 - 93.94.112.223 gb -93.94.112.224 - 93.94.113.111 ie -93.94.113.112 - 93.94.113.127 gb -93.94.113.128 - 93.94.113.159 ie -93.94.113.160 - 93.94.113.163 gb -93.94.113.164 - 93.94.113.223 ie -93.94.113.224 - 93.94.113.255 gb -93.94.114.0 - 93.94.114.83 ie -93.94.114.84 - 93.94.114.87 gb -93.94.114.88 - 93.94.114.199 ie -93.94.114.200 - 93.94.114.203 gb -93.94.114.204 - 93.94.115.119 ie -93.94.115.120 - 93.94.115.127 gb -93.94.115.128 - 93.94.115.139 ie -93.94.115.140 - 93.94.115.239 gb -93.94.115.240 - 93.94.115.245 ie -93.94.115.246 - 93.94.116.23 gb -93.94.116.24 - 93.94.116.61 ie -93.94.116.62 - 93.94.116.79 gb -93.94.116.80 - 93.94.116.95 ie -93.94.116.96 - 93.94.127.255 gb +93.94.104.0 - 93.94.111.255 be +93.94.112.0 - 93.94.115.95 gb +93.94.115.96 - 93.94.115.99 ie +93.94.115.100 - 93.94.115.231 gb +93.94.115.232 - 93.94.115.235 ie +93.94.115.236 - 93.94.127.255 gb 93.94.128.0 - 93.94.135.255 de 93.94.136.0 - 93.94.143.255 bg 93.94.144.0 - 93.94.159.255 ru @@ -59149,7 +34179,7 @@ 93.94.248.0 - 93.94.255.255 tr 93.95.0.0 - 93.95.7.255 nl 93.95.8.0 - 93.95.15.255 gb -93.95.16.0 - 93.95.23.255 kn +93.95.16.0 - 93.95.23.255 gg 93.95.24.0 - 93.95.31.255 bh 93.95.32.0 - 93.95.39.255 cz 93.95.40.0 - 93.95.47.255 ru @@ -59171,22 +34201,16 @@ 93.95.184.0 - 93.95.191.255 ua 93.95.192.0 - 93.95.199.255 ru 93.95.200.0 - 93.95.207.255 jo -93.95.208.0 - 93.95.223.255 it +93.95.208.0 - 93.95.209.255 it +93.95.210.0 - 93.95.210.255 sm +93.95.211.0 - 93.95.223.255 it 93.95.224.0 - 93.95.231.255 is 93.95.232.0 - 93.95.239.255 fr 93.95.240.0 - 93.95.247.255 kz -93.95.248.0 - 93.95.249.191 nl -93.95.249.192 - 93.95.249.199 de -93.95.249.200 - 93.95.251.215 nl -93.95.251.216 - 93.95.251.219 de -93.95.251.220 - 93.95.255.255 nl +93.95.248.0 - 93.95.255.255 nl 93.96.0.0 - 93.97.255.255 gb 93.98.0.0 - 93.98.255.255 sa -93.99.0.0 - 93.99.17.255 cz -93.99.18.0 - 93.99.18.255 sk -93.99.19.0 - 93.99.93.255 cz -93.99.94.0 - 93.99.94.255 sk -93.99.95.0 - 93.99.255.255 cz +93.99.0.0 - 93.99.255.255 cz 93.100.0.0 - 93.100.255.255 ru 93.101.0.0 - 93.101.255.255 it 93.102.0.0 - 93.102.255.255 pt @@ -59196,122 +34220,145 @@ 93.106.0.0 - 93.106.255.255 fi 93.107.0.0 - 93.107.255.255 ie 93.108.0.0 - 93.108.255.255 pt -93.109.0.0 - 93.109.248.55 cy -93.109.248.56 - 93.109.248.63 a2 -93.109.248.64 - 93.109.255.255 cy +93.109.0.0 - 93.109.255.255 cy 93.110.0.0 - 93.110.255.255 ir 93.111.0.0 - 93.111.255.255 at -93.112.0.0 - 93.113.37.255 ro +93.112.0.0 - 93.112.255.255 sa +93.113.0.0 - 93.113.15.255 ro +93.113.16.0 - 93.113.23.255 es +93.113.24.0 - 93.113.37.255 ro 93.113.38.0 - 93.113.39.255 md -93.113.40.0 - 93.113.71.255 ro -93.113.72.0 - 93.113.79.255 md -93.113.80.0 - 93.113.101.255 ro -93.113.102.0 - 93.113.103.255 de -93.113.104.0 - 93.113.111.255 ro +93.113.40.0 - 93.113.63.255 ro +93.113.64.0 - 93.113.79.255 md +93.113.80.0 - 93.113.111.255 ro 93.113.112.0 - 93.113.119.255 md -93.113.120.0 - 93.113.249.255 ro -93.113.250.0 - 93.113.251.255 se -93.113.252.0 - 93.113.255.255 ro -93.114.0.0 - 93.114.15.255 md -93.114.16.0 - 93.114.91.255 ro -93.114.92.0 - 93.114.95.255 md -93.114.96.0 - 93.115.47.255 ro -93.115.48.0 - 93.115.51.255 md -93.115.52.0 - 93.115.87.255 ro -93.115.88.0 - 93.115.95.255 de -93.115.96.0 - 93.115.243.255 ro -93.115.244.0 - 93.115.247.255 se -93.115.248.0 - 93.115.255.255 ro +93.113.120.0 - 93.113.126.255 ro +93.113.127.0 - 93.113.127.255 gb +93.113.128.0 - 93.113.158.255 ro +93.113.159.0 - 93.113.159.255 gb +93.113.160.0 - 93.113.219.255 ro +93.113.220.0 - 93.113.221.255 md +93.113.222.0 - 93.113.223.255 ro +93.113.224.0 - 93.113.239.255 ir +93.113.240.0 - 93.114.11.255 ro +93.114.12.0 - 93.114.12.255 md +93.114.13.0 - 93.114.15.255 ro +93.114.16.0 - 93.114.31.255 ir +93.114.32.0 - 93.114.39.255 ro +93.114.40.0 - 93.114.41.132 a1 +93.114.41.133 - 93.114.41.133 ro +93.114.41.134 - 93.114.44.65 a1 +93.114.44.66 - 93.114.44.66 eu +93.114.44.67 - 93.114.44.86 a1 +93.114.44.87 - 93.114.44.87 eu +93.114.44.88 - 93.114.47.255 a1 +93.114.48.0 - 93.114.50.255 ro +93.114.51.0 - 93.114.54.255 gb +93.114.55.0 - 93.114.57.255 ro +93.114.58.0 - 93.114.59.255 gb +93.114.60.0 - 93.114.63.255 es +93.114.64.0 - 93.114.66.255 ro +93.114.67.0 - 93.114.67.255 md +93.114.68.0 - 93.114.84.255 ro +93.114.85.0 - 93.114.85.255 md +93.114.86.0 - 93.114.131.255 ro +93.114.132.0 - 93.114.132.255 md +93.114.133.0 - 93.114.143.255 ro +93.114.144.0 - 93.114.159.255 es +93.114.160.0 - 93.114.203.255 ro +93.114.204.0 - 93.114.207.255 es +93.114.208.0 - 93.115.32.255 ro +93.115.33.0 - 93.115.33.255 de +93.115.34.0 - 93.115.37.255 ro +93.115.38.0 - 93.115.38.255 bg +93.115.39.0 - 93.115.58.255 ro +93.115.59.0 - 93.115.59.255 gb +93.115.60.0 - 93.115.61.255 nl +93.115.62.0 - 93.115.63.255 it +93.115.64.0 - 93.115.79.255 ro +93.115.80.0 - 93.115.95.255 a1 +93.115.96.0 - 93.115.97.255 fr +93.115.98.0 - 93.115.135.255 ro +93.115.136.0 - 93.115.151.255 md +93.115.152.0 - 93.115.159.255 ro +93.115.160.0 - 93.115.167.255 se +93.115.168.0 - 93.115.191.255 ro +93.115.192.0 - 93.115.192.255 in +93.115.193.0 - 93.115.193.255 ro +93.115.194.0 - 93.115.194.127 gb +93.115.194.128 - 93.115.200.255 ro +93.115.201.0 - 93.115.201.255 gb +93.115.202.0 - 93.115.211.255 ro +93.115.212.0 - 93.115.215.255 es +93.115.216.0 - 93.115.239.255 md +93.115.240.0 - 93.115.255.255 ro 93.116.0.0 - 93.116.255.255 md -93.117.0.0 - 93.118.47.255 ro -93.118.48.0 - 93.118.63.255 md -93.118.64.0 - 93.119.15.255 ro -93.119.16.0 - 93.119.23.255 md -93.119.24.0 - 93.120.127.255 ro -93.120.128.0 - 93.121.127.255 ru -93.121.128.0 - 93.121.128.255 gp -93.121.129.0 - 93.121.131.255 fr -93.121.132.0 - 93.121.132.255 gp -93.121.133.0 - 93.121.135.255 fr -93.121.136.0 - 93.121.138.255 gf -93.121.139.0 - 93.121.140.255 gp -93.121.141.0 - 93.121.142.255 gf -93.121.143.0 - 93.121.147.255 gp -93.121.148.0 - 93.121.148.255 mq -93.121.149.0 - 93.121.155.255 gp -93.121.156.0 - 93.121.156.255 mq -93.121.157.0 - 93.121.159.255 gp -93.121.160.0 - 93.121.160.255 mq -93.121.161.0 - 93.121.163.255 gp -93.121.164.0 - 93.121.164.255 mq -93.121.165.0 - 93.121.170.255 gp -93.121.171.0 - 93.121.171.255 gf -93.121.172.0 - 93.121.174.255 gp -93.121.175.0 - 93.121.175.255 gf -93.121.176.0 - 93.121.182.255 gp -93.121.183.0 - 93.121.184.255 mq -93.121.185.0 - 93.121.187.255 gf -93.121.188.0 - 93.121.188.255 mq -93.121.189.0 - 93.121.191.255 gp -93.121.192.0 - 93.121.192.255 mq -93.121.193.0 - 93.121.195.255 fr -93.121.196.0 - 93.121.196.255 mq -93.121.197.0 - 93.121.199.255 fr -93.121.200.0 - 93.121.200.255 mq -93.121.201.0 - 93.121.203.255 fr -93.121.204.0 - 93.121.204.255 mq -93.121.205.0 - 93.121.205.255 fr -93.121.206.0 - 93.121.206.255 mq -93.121.207.0 - 93.121.208.255 gp -93.121.209.0 - 93.121.211.255 fr -93.121.212.0 - 93.121.212.255 gp -93.121.213.0 - 93.121.215.255 fr -93.121.216.0 - 93.121.216.255 gp -93.121.217.0 - 93.121.219.255 fr -93.121.220.0 - 93.121.220.255 gp -93.121.221.0 - 93.121.221.255 fr -93.121.222.0 - 93.121.223.255 gp -93.121.224.0 - 93.121.224.255 gf -93.121.225.0 - 93.121.227.255 fr -93.121.228.0 - 93.121.228.255 mq -93.121.229.0 - 93.121.231.255 fr -93.121.232.0 - 93.121.232.255 gp -93.121.233.0 - 93.121.235.255 fr -93.121.236.0 - 93.121.236.255 gp -93.121.237.0 - 93.121.239.255 fr -93.121.240.0 - 93.121.240.255 gp -93.121.241.0 - 93.121.243.255 gf -93.121.244.0 - 93.121.248.255 mq -93.121.249.0 - 93.121.251.255 fr -93.121.252.0 - 93.121.255.255 mq -93.122.0.0 - 93.122.65.15 de -93.122.65.16 - 93.122.65.31 sa -93.122.65.32 - 93.122.69.79 de -93.122.69.80 - 93.122.69.95 it -93.122.69.96 - 93.122.72.71 de -93.122.72.72 - 93.122.72.79 fr -93.122.72.80 - 93.122.75.111 de -93.122.75.112 - 93.122.75.119 gb -93.122.75.120 - 93.122.75.175 de -93.122.75.176 - 93.122.75.183 gb -93.122.75.184 - 93.122.77.47 de -93.122.77.48 - 93.122.77.55 za -93.122.77.56 - 93.122.127.255 de +93.117.0.0 - 93.117.47.255 ir +93.117.48.0 - 93.117.67.255 ro +93.117.68.0 - 93.117.79.255 md +93.117.80.0 - 93.117.95.255 ro +93.117.96.0 - 93.117.127.255 ir +93.117.128.0 - 93.117.136.255 ro +93.117.137.0 - 93.117.137.255 nl +93.117.138.0 - 93.117.151.255 ro +93.117.152.0 - 93.117.153.255 it +93.117.154.0 - 93.117.171.255 ro +93.117.172.0 - 93.117.173.255 it +93.117.174.0 - 93.117.174.255 gb +93.117.175.0 - 93.117.175.255 ro +93.117.176.0 - 93.117.191.255 ir +93.117.192.0 - 93.117.255.255 nl +93.118.0.0 - 93.118.31.255 de +93.118.32.0 - 93.118.35.255 fr +93.118.36.0 - 93.118.37.255 ro +93.118.38.0 - 93.118.38.255 sg +93.118.39.0 - 93.118.95.255 ro +93.118.96.0 - 93.118.175.255 ir +93.118.176.0 - 93.118.179.255 ro +93.118.180.0 - 93.118.191.255 md +93.118.192.0 - 93.119.15.255 ro +93.119.16.0 - 93.119.16.255 cn +93.119.17.0 - 93.119.19.255 ro +93.119.20.0 - 93.119.23.255 cn +93.119.24.0 - 93.119.31.255 ro +93.119.32.0 - 93.119.95.255 ir +93.119.96.0 - 93.119.103.255 md +93.119.104.0 - 93.119.107.255 ro +93.119.108.0 - 93.119.111.255 md +93.119.112.0 - 93.119.113.255 gb +93.119.114.0 - 93.119.117.255 ro +93.119.118.0 - 93.119.121.255 gb +93.119.122.0 - 93.119.122.255 ro +93.119.123.0 - 93.119.123.255 nl +93.119.124.0 - 93.119.125.255 gb +93.119.126.0 - 93.119.127.255 ro +93.119.128.0 - 93.119.135.255 md +93.119.136.0 - 93.119.139.255 ro +93.119.140.0 - 93.119.151.255 md +93.119.152.0 - 93.119.159.255 ro +93.119.160.0 - 93.119.167.255 md +93.119.168.0 - 93.119.195.255 ro +93.119.196.0 - 93.119.207.255 md +93.119.208.0 - 93.119.223.255 ir +93.119.224.0 - 93.119.227.255 ro +93.119.228.0 - 93.119.239.255 md +93.119.240.0 - 93.119.255.255 de +93.120.0.0 - 93.120.127.255 ro +93.120.128.0 - 93.120.255.255 ru +93.121.0.0 - 93.121.127.255 gb +93.121.128.0 - 93.121.255.255 gp +93.122.0.0 - 93.122.127.255 de 93.122.128.0 - 93.122.255.255 ro 93.123.0.0 - 93.123.127.255 bg 93.123.128.0 - 93.124.127.255 ru -93.124.128.0 - 93.124.142.15 no -93.124.142.16 - 93.124.142.23 se -93.124.142.24 - 93.124.255.255 no +93.124.128.0 - 93.124.255.255 no 93.125.0.0 - 93.125.127.255 by 93.125.128.0 - 93.125.255.255 nl 93.126.0.0 - 93.126.63.255 ir 93.126.64.0 - 93.126.127.255 ua 93.126.128.0 - 93.126.255.255 lb 93.127.0.0 - 93.127.127.255 ua -93.127.128.0 - 93.127.254.255 de -93.127.255.0 - 93.127.255.255 md -93.128.0.0 - 93.135.255.255 de +93.127.128.0 - 93.135.255.255 de 93.136.0.0 - 93.143.255.255 hr 93.144.0.0 - 93.151.255.255 it 93.152.0.0 - 93.152.127.255 gb @@ -59321,11 +34368,7 @@ 93.154.0.0 - 93.154.127.255 nl 93.154.128.0 - 93.154.255.255 pl 93.155.0.0 - 93.155.127.255 tr -93.155.128.0 - 93.155.162.255 bg -93.155.163.0 - 93.155.163.255 mk -93.155.164.0 - 93.155.206.255 bg -93.155.207.0 - 93.155.207.255 es -93.155.208.0 - 93.155.255.255 bg +93.155.128.0 - 93.155.255.255 bg 93.156.0.0 - 93.156.255.255 es 93.157.0.0 - 93.157.7.255 nl 93.157.8.0 - 93.157.15.255 ua @@ -59338,7 +34381,6 @@ 93.157.64.0 - 93.157.79.255 pl 93.157.80.0 - 93.157.87.255 il 93.157.88.0 - 93.157.103.255 pl -93.157.104.0 - 93.157.111.255 ua 93.157.112.0 - 93.157.119.255 pl 93.157.120.0 - 93.157.127.255 ru 93.157.128.0 - 93.157.135.255 cz @@ -59353,162 +34395,19 @@ 93.158.0.0 - 93.158.35.31 fr 93.158.35.32 - 93.158.35.39 gb 93.158.35.40 - 93.158.35.255 fr -93.158.36.0 - 93.158.36.63 gb -93.158.36.64 - 93.158.36.239 fr -93.158.36.240 - 93.158.36.255 gb +93.158.36.0 - 93.158.36.255 gb 93.158.37.0 - 93.158.63.255 fr -93.158.64.0 - 93.158.64.127 se -93.158.64.128 - 93.158.64.131 my -93.158.64.132 - 93.158.64.135 gb -93.158.64.136 - 93.158.64.139 de -93.158.64.140 - 93.158.65.127 se -93.158.65.128 - 93.158.65.135 fr -93.158.65.136 - 93.158.66.219 se -93.158.66.220 - 93.158.66.223 de -93.158.66.224 - 93.158.77.143 se -93.158.77.144 - 93.158.77.147 de -93.158.77.148 - 93.158.78.255 se -93.158.79.0 - 93.158.79.3 de -93.158.79.4 - 93.158.79.119 se -93.158.79.120 - 93.158.79.127 gb -93.158.79.128 - 93.158.95.255 se -93.158.96.0 - 93.158.96.7 fi -93.158.96.8 - 93.158.96.15 se -93.158.96.16 - 93.158.96.31 fr -93.158.96.32 - 93.158.96.35 ru -93.158.96.36 - 93.158.96.55 se -93.158.96.56 - 93.158.96.59 de -93.158.96.60 - 93.158.96.191 se -93.158.96.192 - 93.158.96.223 fi -93.158.96.224 - 93.158.96.239 gb -93.158.96.240 - 93.158.96.243 ru -93.158.96.244 - 93.158.96.247 se -93.158.96.248 - 93.158.96.255 fi -93.158.97.0 - 93.158.97.7 se -93.158.97.8 - 93.158.97.11 ru -93.158.97.12 - 93.158.97.15 se -93.158.97.16 - 93.158.97.31 fr -93.158.97.32 - 93.158.97.67 de -93.158.97.68 - 93.158.97.255 se +93.158.64.0 - 93.158.97.255 se 93.158.98.0 - 93.158.99.255 no -93.158.100.0 - 93.158.100.255 gb -93.158.101.0 - 93.158.102.255 se +93.158.100.0 - 93.158.102.255 se 93.158.103.0 - 93.158.103.255 de -93.158.104.0 - 93.158.107.255 se -93.158.108.0 - 93.158.109.255 gb -93.158.110.0 - 93.158.115.127 se -93.158.115.128 - 93.158.115.135 gb -93.158.115.136 - 93.158.115.191 se -93.158.115.192 - 93.158.115.207 gb -93.158.115.208 - 93.158.115.223 se -93.158.115.224 - 93.158.115.239 fr -93.158.115.240 - 93.158.115.247 dk -93.158.115.248 - 93.158.117.191 se -93.158.117.192 - 93.158.117.207 gb -93.158.117.208 - 93.158.117.223 it -93.158.117.224 - 93.158.117.239 fr -93.158.117.240 - 93.158.118.159 se -93.158.118.160 - 93.158.118.163 de -93.158.118.164 - 93.158.118.191 se -93.158.118.192 - 93.158.118.207 gb -93.158.118.208 - 93.158.118.239 fr -93.158.118.240 - 93.158.118.243 se -93.158.118.244 - 93.158.118.247 no -93.158.118.248 - 93.158.119.23 se -93.158.119.24 - 93.158.119.27 us -93.158.119.28 - 93.158.119.127 se -93.158.119.128 - 93.158.119.143 fr -93.158.119.144 - 93.158.119.147 se -93.158.119.148 - 93.158.119.151 nl -93.158.119.152 - 93.158.119.155 se -93.158.119.156 - 93.158.119.159 de -93.158.119.160 - 93.158.119.191 se -93.158.119.192 - 93.158.119.207 gb -93.158.119.208 - 93.158.119.223 de -93.158.119.224 - 93.158.119.255 se -93.158.120.0 - 93.158.120.3 es -93.158.120.4 - 93.158.120.15 se -93.158.120.16 - 93.158.120.23 no -93.158.120.24 - 93.158.120.191 se -93.158.120.192 - 93.158.120.207 gb -93.158.120.208 - 93.158.120.223 es -93.158.120.224 - 93.158.120.239 fr -93.158.120.240 - 93.158.120.255 se -93.158.121.0 - 93.158.121.3 es -93.158.121.4 - 93.158.121.7 se -93.158.121.8 - 93.158.121.15 gb -93.158.121.16 - 93.158.121.135 se -93.158.121.136 - 93.158.121.139 de -93.158.121.140 - 93.158.121.191 se -93.158.121.192 - 93.158.121.207 fr -93.158.121.208 - 93.158.121.223 se -93.158.121.224 - 93.158.121.239 fr -93.158.121.240 - 93.158.121.255 se -93.158.122.0 - 93.158.122.3 es -93.158.122.4 - 93.158.122.7 se -93.158.122.8 - 93.158.122.15 fi -93.158.122.16 - 93.158.122.31 es -93.158.122.32 - 93.158.122.159 se -93.158.122.160 - 93.158.122.163 de -93.158.122.164 - 93.158.122.191 se -93.158.122.192 - 93.158.122.207 fr -93.158.122.208 - 93.158.122.223 se -93.158.122.224 - 93.158.122.239 fr -93.158.122.240 - 93.158.122.255 se -93.158.123.0 - 93.158.123.3 es -93.158.123.4 - 93.158.123.19 se -93.158.123.20 - 93.158.123.23 mt -93.158.123.24 - 93.158.123.31 se -93.158.123.32 - 93.158.123.63 gb -93.158.123.64 - 93.158.123.71 se -93.158.123.72 - 93.158.123.75 gb -93.158.123.76 - 93.158.123.79 nl -93.158.123.80 - 93.158.123.83 de -93.158.123.84 - 93.158.123.191 se -93.158.123.192 - 93.158.123.207 fr -93.158.123.208 - 93.158.123.223 se -93.158.123.224 - 93.158.123.239 fr -93.158.123.240 - 93.158.123.251 se -93.158.123.252 - 93.158.123.255 us -93.158.124.0 - 93.158.124.3 nl -93.158.124.4 - 93.158.124.7 it -93.158.124.8 - 93.158.124.11 no -93.158.124.12 - 93.158.124.15 it -93.158.124.16 - 93.158.124.67 se -93.158.124.68 - 93.158.124.71 us -93.158.124.72 - 93.158.124.79 se -93.158.124.80 - 93.158.124.83 de -93.158.124.84 - 93.158.124.127 se -93.158.124.128 - 93.158.124.131 us -93.158.124.132 - 93.158.124.191 se -93.158.124.192 - 93.158.124.207 fr -93.158.124.208 - 93.158.124.223 nl -93.158.124.224 - 93.158.124.255 se -93.158.125.0 - 93.158.125.3 nl -93.158.125.4 - 93.158.125.15 se -93.158.125.16 - 93.158.125.31 es -93.158.125.32 - 93.158.125.63 se -93.158.125.64 - 93.158.125.127 fr -93.158.125.128 - 93.158.125.131 se -93.158.125.132 - 93.158.125.135 ru -93.158.125.136 - 93.158.125.139 us -93.158.125.140 - 93.158.125.143 se -93.158.125.144 - 93.158.125.147 de -93.158.125.148 - 93.158.125.191 se -93.158.125.192 - 93.158.125.207 fr -93.158.125.208 - 93.158.125.255 se -93.158.126.0 - 93.158.126.3 nl -93.158.126.4 - 93.158.126.15 se -93.158.126.16 - 93.158.126.23 es -93.158.126.24 - 93.158.126.31 nl -93.158.126.32 - 93.158.126.255 se -93.158.127.0 - 93.158.127.3 nl -93.158.127.4 - 93.158.127.63 se -93.158.127.64 - 93.158.127.127 no -93.158.127.128 - 93.158.127.255 se -93.158.128.0 - 93.158.141.111 ru -93.158.141.112 - 93.158.141.115 tr -93.158.141.116 - 93.158.255.255 ru +93.158.104.0 - 93.158.127.255 se +93.158.128.0 - 93.158.199.255 ru +93.158.200.0 - 93.158.223.255 nl +93.158.224.0 - 93.158.231.255 ru +93.158.232.0 - 93.158.235.255 pl +93.158.236.0 - 93.158.239.255 nl +93.158.240.0 - 93.158.255.255 ru 93.159.0.0 - 93.159.63.255 pl 93.159.64.0 - 93.159.95.255 hr 93.159.96.0 - 93.159.127.255 de @@ -59519,43 +34418,171 @@ 93.159.216.0 - 93.159.247.255 ru 93.159.248.0 - 93.159.255.255 de 93.160.0.0 - 93.167.255.255 dk -93.168.0.0 - 93.169.255.255 ro -93.170.0.0 - 93.170.15.255 ru -93.170.16.0 - 93.170.23.255 cz -93.170.24.0 - 93.170.25.255 ru -93.170.26.0 - 93.170.26.255 kz -93.170.27.0 - 93.170.27.255 ru -93.170.28.0 - 93.170.39.255 ua -93.170.40.0 - 93.170.47.255 cz +93.168.0.0 - 93.169.255.255 sa +93.170.0.0 - 93.170.0.255 cz +93.170.1.0 - 93.170.1.255 ua +93.170.2.0 - 93.170.3.255 ru +93.170.4.0 - 93.170.4.255 ua +93.170.5.0 - 93.170.7.255 ru +93.170.8.0 - 93.170.8.255 kg +93.170.9.0 - 93.170.9.255 am +93.170.10.0 - 93.170.10.255 cz +93.170.11.0 - 93.170.11.0 ru +93.170.11.1 - 93.170.11.124 cz +93.170.11.125 - 93.170.11.125 ru +93.170.11.126 - 93.170.11.207 cz +93.170.11.208 - 93.170.11.208 ru +93.170.11.209 - 93.170.11.255 cz +93.170.12.0 - 93.170.12.255 ru +93.170.13.0 - 93.170.13.255 nl +93.170.14.0 - 93.170.14.79 cz +93.170.14.80 - 93.170.14.80 ru +93.170.14.81 - 93.170.14.255 cz +93.170.15.0 - 93.170.15.255 ua +93.170.16.0 - 93.170.24.255 cz +93.170.25.0 - 93.170.25.255 ua +93.170.26.0 - 93.170.31.255 cz +93.170.32.0 - 93.170.33.255 ua +93.170.34.0 - 93.170.34.255 by +93.170.35.0 - 93.170.35.255 ua +93.170.36.0 - 93.170.39.255 kz +93.170.40.0 - 93.170.47.255 ru 93.170.48.0 - 93.170.51.255 ua -93.170.52.0 - 93.170.53.255 nl -93.170.54.0 - 93.170.54.255 ua -93.170.55.0 - 93.170.63.255 ru -93.170.64.0 - 93.170.75.255 ua -93.170.76.0 - 93.170.77.255 kz +93.170.52.0 - 93.170.53.255 ru +93.170.54.0 - 93.170.54.255 cz +93.170.55.0 - 93.170.55.255 ua +93.170.56.0 - 93.170.63.255 ba +93.170.64.0 - 93.170.71.255 ua +93.170.72.0 - 93.170.73.255 ru +93.170.74.0 - 93.170.74.255 cz +93.170.75.0 - 93.170.75.255 ua +93.170.76.0 - 93.170.76.255 ru +93.170.77.0 - 93.170.77.255 cz 93.170.78.0 - 93.170.79.255 nl -93.170.80.0 - 93.170.95.255 cz -93.170.96.0 - 93.170.99.255 kz -93.170.100.0 - 93.170.103.255 cz -93.170.104.0 - 93.170.111.255 us -93.170.112.0 - 93.170.115.255 ua -93.170.116.0 - 93.170.123.255 cz -93.170.124.0 - 93.170.127.255 gb -93.170.128.0 - 93.170.131.255 ru -93.170.132.0 - 93.170.133.255 cy -93.170.134.0 - 93.170.134.255 ru -93.170.135.0 - 93.170.135.255 cz -93.170.136.0 - 93.170.139.255 ua -93.170.140.0 - 93.170.143.255 cz +93.170.80.0 - 93.170.81.255 ua +93.170.82.0 - 93.170.83.255 ru +93.170.84.0 - 93.170.88.255 cz +93.170.89.0 - 93.170.89.255 ua +93.170.90.0 - 93.170.93.255 nl +93.170.94.0 - 93.170.95.255 ru +93.170.96.0 - 93.170.96.255 gb +93.170.97.0 - 93.170.97.255 ua +93.170.98.0 - 93.170.99.255 ru +93.170.100.0 - 93.170.100.255 cz +93.170.101.0 - 93.170.101.255 ru +93.170.102.0 - 93.170.102.8 cz +93.170.102.9 - 93.170.102.9 ru +93.170.102.10 - 93.170.102.255 cz +93.170.103.0 - 93.170.103.255 ru +93.170.104.0 - 93.170.105.255 nl +93.170.106.0 - 93.170.107.255 cz +93.170.108.0 - 93.170.113.255 ru +93.170.114.0 - 93.170.119.255 ua +93.170.120.0 - 93.170.122.255 ru +93.170.123.0 - 93.170.123.255 cz +93.170.124.0 - 93.170.131.255 ru +93.170.132.0 - 93.170.133.255 ua +93.170.134.0 - 93.170.134.255 cz +93.170.135.0 - 93.170.135.255 ua +93.170.136.0 - 93.170.137.255 cz +93.170.138.0 - 93.170.141.255 ru +93.170.142.0 - 93.170.142.255 cz +93.170.143.0 - 93.170.143.255 by 93.170.144.0 - 93.170.159.255 ua -93.170.160.0 - 93.170.255.255 cz -93.171.0.0 - 93.171.31.255 sk -93.171.32.0 - 93.171.255.255 cz +93.170.160.0 - 93.170.171.255 cz +93.170.172.0 - 93.170.174.255 ru +93.170.175.0 - 93.170.175.255 cz +93.170.176.0 - 93.170.177.255 ru +93.170.178.0 - 93.170.179.255 cz +93.170.180.0 - 93.170.183.255 ru +93.170.184.0 - 93.170.185.255 by +93.170.186.0 - 93.170.187.255 cz +93.170.188.0 - 93.170.189.255 ua +93.170.190.0 - 93.170.207.255 ru +93.170.208.0 - 93.170.209.255 ua +93.170.210.0 - 93.170.211.255 cz +93.170.212.0 - 93.170.223.255 ru +93.170.224.0 - 93.170.239.255 cz +93.170.240.0 - 93.170.241.255 ru +93.170.242.0 - 93.170.243.255 cz +93.170.244.0 - 93.170.244.255 kz +93.170.245.0 - 93.170.251.255 ru +93.170.252.0 - 93.170.252.255 cz +93.170.253.0 - 93.170.253.255 ua +93.170.254.0 - 93.170.255.255 cz +93.171.0.0 - 93.171.4.255 sk +93.171.5.0 - 93.171.5.255 ua +93.171.6.0 - 93.171.6.255 by +93.171.7.0 - 93.171.12.255 ru +93.171.13.0 - 93.171.13.255 cz +93.171.14.0 - 93.171.31.255 ua +93.171.32.0 - 93.171.33.255 ru +93.171.34.0 - 93.171.39.255 by +93.171.40.0 - 93.171.47.255 ru +93.171.48.0 - 93.171.63.255 by +93.171.64.0 - 93.171.79.255 ua +93.171.80.0 - 93.171.103.255 cz +93.171.104.0 - 93.171.127.255 by +93.171.128.0 - 93.171.133.255 ua +93.171.134.0 - 93.171.136.255 ru +93.171.137.0 - 93.171.139.255 cz +93.171.140.0 - 93.171.142.255 ru +93.171.143.0 - 93.171.143.255 cz +93.171.144.0 - 93.171.151.255 ru +93.171.152.0 - 93.171.152.255 ua +93.171.153.0 - 93.171.153.255 cz +93.171.154.0 - 93.171.155.255 sk +93.171.156.0 - 93.171.157.255 cz +93.171.158.0 - 93.171.159.255 ua +93.171.160.0 - 93.171.161.255 by +93.171.162.0 - 93.171.162.255 cz +93.171.163.0 - 93.171.163.255 ua +93.171.164.0 - 93.171.165.255 ru +93.171.166.0 - 93.171.169.255 cz +93.171.170.0 - 93.171.172.255 ua +93.171.173.0 - 93.171.173.255 ru +93.171.174.0 - 93.171.174.255 cz +93.171.175.0 - 93.171.175.255 ru +93.171.176.0 - 93.171.180.255 cz +93.171.181.0 - 93.171.183.255 ru +93.171.184.0 - 93.171.184.255 lv +93.171.185.0 - 93.171.185.255 ua +93.171.186.0 - 93.171.187.1 cz +93.171.187.2 - 93.171.187.2 ru +93.171.187.3 - 93.171.187.255 cz +93.171.188.0 - 93.171.199.255 ru +93.171.200.0 - 93.171.203.255 cz +93.171.204.0 - 93.171.204.255 ua +93.171.205.0 - 93.171.206.213 cz +93.171.206.214 - 93.171.206.215 ru +93.171.206.216 - 93.171.206.216 cz +93.171.206.217 - 93.171.206.217 ru +93.171.206.218 - 93.171.207.255 cz +93.171.208.0 - 93.171.208.255 ru +93.171.209.0 - 93.171.209.255 ua +93.171.210.0 - 93.171.211.255 cz +93.171.212.0 - 93.171.213.255 ru +93.171.214.0 - 93.171.214.255 sk +93.171.215.0 - 93.171.215.255 cz +93.171.216.0 - 93.171.217.255 nl +93.171.218.0 - 93.171.218.255 ua +93.171.219.0 - 93.171.224.255 ru +93.171.225.0 - 93.171.225.255 ua +93.171.226.0 - 93.171.226.255 cz +93.171.227.0 - 93.171.227.255 ru +93.171.228.0 - 93.171.229.255 cz +93.171.230.0 - 93.171.230.255 nl +93.171.231.0 - 93.171.231.255 ru +93.171.232.0 - 93.171.235.255 cz +93.171.236.0 - 93.171.239.255 ru +93.171.240.0 - 93.171.243.255 ua +93.171.244.0 - 93.171.244.255 ru +93.171.245.0 - 93.171.255.255 ua 93.172.0.0 - 93.173.255.255 il 93.174.0.0 - 93.174.7.255 es 93.174.8.0 - 93.174.15.255 gb 93.174.16.0 - 93.174.23.255 ch -93.174.24.0 - 93.174.31.255 ge +93.174.24.0 - 93.174.31.255 pl 93.174.32.0 - 93.174.39.255 fr 93.174.40.0 - 93.174.47.255 lu 93.174.48.0 - 93.174.63.255 ru @@ -59563,45 +34590,32 @@ 93.174.72.0 - 93.174.79.255 ru 93.174.80.0 - 93.174.87.255 gb 93.174.88.0 - 93.174.95.255 nl -93.174.96.0 - 93.174.97.255 gb -93.174.98.0 - 93.174.98.127 de -93.174.98.128 - 93.174.98.255 gb -93.174.99.0 - 93.174.99.127 fr -93.174.99.128 - 93.174.99.255 gb -93.174.100.0 - 93.174.100.127 nl -93.174.100.128 - 93.174.100.255 gb -93.174.101.0 - 93.174.101.127 es -93.174.101.128 - 93.174.101.255 gb -93.174.102.0 - 93.174.102.127 it -93.174.102.128 - 93.174.103.255 gb +93.174.96.0 - 93.174.103.255 gb 93.174.104.0 - 93.174.111.255 nl 93.174.112.0 - 93.174.119.255 ru 93.174.120.0 - 93.174.127.255 gr 93.174.128.0 - 93.174.135.255 ru 93.174.136.0 - 93.174.143.255 gb 93.174.144.0 - 93.174.151.255 fr -93.174.152.0 - 93.174.153.255 gb -93.174.154.0 - 93.174.154.255 se -93.174.155.0 - 93.174.159.255 gb +93.174.152.0 - 93.174.159.255 gb 93.174.160.0 - 93.174.167.255 ro 93.174.168.0 - 93.174.175.255 ie -93.174.176.0 - 93.174.177.127 sk -93.174.177.128 - 93.174.177.135 cz -93.174.177.136 - 93.174.183.255 sk -93.174.184.0 - 93.174.187.255 ch -93.174.188.0 - 93.174.188.15 li -93.174.188.16 - 93.174.191.255 ch +93.174.176.0 - 93.174.183.255 sk +93.174.184.0 - 93.174.191.255 ch 93.174.192.0 - 93.174.199.255 fi 93.174.200.0 - 93.174.207.255 nl -93.174.208.0 - 93.174.208.255 gb -93.174.209.0 - 93.174.209.255 eu -93.174.210.0 - 93.174.210.255 nl -93.174.211.0 - 93.174.215.255 eu +93.174.208.0 - 93.174.215.255 eu 93.174.216.0 - 93.174.223.255 gb 93.174.224.0 - 93.174.231.255 ru 93.174.232.0 - 93.174.239.255 gb 93.174.240.0 - 93.174.247.255 ru -93.174.248.0 - 93.174.255.255 gb +93.174.248.0 - 93.174.248.255 gb +93.174.249.0 - 93.174.249.255 us +93.174.250.0 - 93.174.250.255 sg +93.174.251.0 - 93.174.251.255 gb +93.174.252.0 - 93.174.252.255 us +93.174.253.0 - 93.174.253.255 sg +93.174.254.0 - 93.174.255.255 gb 93.175.0.0 - 93.175.31.255 ru 93.175.32.0 - 93.175.63.255 il 93.175.64.0 - 93.175.143.255 pl @@ -59609,14 +34623,23 @@ 93.175.160.0 - 93.175.175.255 pl 93.175.176.0 - 93.175.191.255 nl 93.175.192.0 - 93.175.255.255 ua -93.176.0.0 - 93.176.63.255 fr -93.176.64.0 - 93.176.88.127 dk -93.176.88.128 - 93.176.88.159 cy -93.176.88.160 - 93.176.127.255 dk +93.176.0.0 - 93.176.0.255 fr +93.176.1.0 - 93.176.1.255 re +93.176.2.0 - 93.176.13.255 fr +93.176.14.0 - 93.176.14.255 re +93.176.15.0 - 93.176.27.255 fr +93.176.28.0 - 93.176.28.255 re +93.176.29.0 - 93.176.37.255 fr +93.176.38.0 - 93.176.38.255 re +93.176.39.0 - 93.176.56.255 fr +93.176.57.0 - 93.176.57.255 re +93.176.58.0 - 93.176.58.255 fr +93.176.59.0 - 93.176.59.255 re +93.176.60.0 - 93.176.63.255 fr +93.176.64.0 - 93.176.127.255 dk 93.176.128.0 - 93.176.191.255 ru 93.176.192.0 - 93.176.255.255 pl 93.177.0.0 - 93.177.63.255 ru -93.177.64.0 - 93.177.127.255 no 93.177.128.0 - 93.177.191.255 ge 93.177.192.0 - 93.177.255.255 lv 93.178.0.0 - 93.178.63.255 sa @@ -59625,14 +34648,33 @@ 93.178.192.0 - 93.178.255.255 ua 93.179.0.0 - 93.179.31.255 no 93.179.32.0 - 93.179.63.255 se -93.179.64.0 - 93.179.127.255 ru +93.179.64.0 - 93.179.65.255 gb +93.179.66.0 - 93.179.66.255 ua +93.179.67.0 - 93.179.69.255 gb +93.179.70.0 - 93.179.88.255 ru +93.179.89.0 - 93.179.89.127 by +93.179.89.128 - 93.179.89.255 us +93.179.90.0 - 93.179.90.127 cz +93.179.90.128 - 93.179.90.255 ng +93.179.91.0 - 93.179.91.127 us +93.179.91.128 - 93.179.91.255 ru +93.179.92.0 - 93.179.95.255 gb +93.179.96.0 - 93.179.119.255 ru +93.179.120.0 - 93.179.121.255 gb +93.179.122.0 - 93.179.127.255 ru 93.179.128.0 - 93.179.191.255 it 93.179.192.0 - 93.179.255.255 pl 93.180.0.0 - 93.180.63.255 ru 93.180.64.0 - 93.180.71.255 nl 93.180.72.0 - 93.180.79.255 de +93.180.80.0 - 93.180.87.255 dk +93.180.88.0 - 93.180.95.255 ch 93.180.96.0 - 93.180.127.255 ba -93.180.128.0 - 93.180.191.255 ru +93.180.128.0 - 93.180.135.255 gb +93.180.136.0 - 93.180.143.255 ru +93.180.144.0 - 93.180.151.255 ba +93.180.152.0 - 93.180.159.255 de +93.180.160.0 - 93.180.191.255 pl 93.180.192.0 - 93.180.255.255 ua 93.181.0.0 - 93.181.63.255 de 93.181.64.0 - 93.181.127.255 cz @@ -59641,14 +34683,9 @@ 93.182.64.0 - 93.182.127.255 tr 93.182.128.0 - 93.182.191.255 se 93.182.192.0 - 93.182.255.255 fr -93.183.0.0 - 93.183.7.255 sg +93.183.0.0 - 93.183.7.255 fi 93.183.8.0 - 93.183.11.255 us -93.183.12.0 - 93.183.13.255 de -93.183.14.0 - 93.183.23.255 sg -93.183.24.0 - 93.183.24.255 de -93.183.25.0 - 93.183.30.255 sg -93.183.31.0 - 93.183.31.255 pt -93.183.32.0 - 93.183.63.255 sg +93.183.12.0 - 93.183.63.255 sg 93.183.64.0 - 93.183.127.255 ru 93.183.128.0 - 93.183.191.255 bg 93.183.192.0 - 93.183.255.255 ua @@ -59665,7 +34702,13 @@ 93.184.160.0 - 93.184.175.255 ru 93.184.176.0 - 93.184.191.255 de 93.184.192.0 - 93.184.207.255 dk -93.184.208.0 - 93.184.223.255 us +93.184.208.0 - 93.184.209.255 nl +93.184.210.0 - 93.184.211.255 gb +93.184.212.0 - 93.184.213.255 de +93.184.214.0 - 93.184.214.255 fr +93.184.215.0 - 93.184.216.255 us +93.184.217.0 - 93.184.217.255 nl +93.184.218.0 - 93.184.223.255 us 93.184.224.0 - 93.184.239.255 az 93.184.240.0 - 93.184.255.255 gb 93.185.0.0 - 93.185.15.255 cz @@ -59678,73 +34721,39 @@ 93.185.112.0 - 93.185.127.255 it 93.185.128.0 - 93.185.143.255 at 93.185.144.0 - 93.185.159.255 ru -93.185.160.0 - 93.185.175.255 no 93.185.176.0 - 93.185.207.255 ru 93.185.208.0 - 93.185.223.255 ua 93.185.224.0 - 93.185.239.255 lb 93.185.240.0 - 93.185.255.255 ee 93.186.0.0 - 93.186.15.255 de -93.186.16.0 - 93.186.47.255 gb +93.186.16.0 - 93.186.16.255 za +93.186.17.0 - 93.186.47.255 gb 93.186.48.0 - 93.186.63.255 ru -93.186.64.0 - 93.186.77.255 rs -93.186.78.0 - 93.186.78.255 hr +93.186.64.0 - 93.186.78.255 rs 93.186.79.0 - 93.186.79.255 lu 93.186.80.0 - 93.186.95.255 it 93.186.96.0 - 93.186.111.255 ru 93.186.112.0 - 93.186.127.255 tr -93.186.128.0 - 93.186.129.255 it -93.186.130.0 - 93.186.130.255 us -93.186.131.0 - 93.186.131.255 de -93.186.132.0 - 93.186.132.127 ro -93.186.132.128 - 93.186.132.255 tr -93.186.133.0 - 93.186.133.255 sg -93.186.134.0 - 93.186.137.127 it +93.186.128.0 - 93.186.137.127 it 93.186.137.128 - 93.186.139.255 gr -93.186.140.0 - 93.186.142.63 it -93.186.142.64 - 93.186.142.71 gb -93.186.142.72 - 93.186.143.255 it +93.186.140.0 - 93.186.143.255 it 93.186.144.0 - 93.186.159.255 gb 93.186.160.0 - 93.186.175.255 de -93.186.176.0 - 93.186.183.127 nl -93.186.183.128 - 93.186.183.143 ca -93.186.183.144 - 93.186.191.255 nl -93.186.192.0 - 93.186.207.255 de +93.186.176.0 - 93.186.191.255 nl +93.186.192.0 - 93.186.193.255 de +93.186.194.0 - 93.186.194.255 es +93.186.195.0 - 93.186.207.255 de 93.186.208.0 - 93.186.223.255 ge 93.186.224.0 - 93.186.239.255 ru 93.186.240.0 - 93.186.255.255 it -93.187.0.0 - 93.187.1.255 je -93.187.2.0 - 93.187.2.255 gb -93.187.3.0 - 93.187.6.255 je -93.187.7.0 - 93.187.7.63 gb -93.187.7.64 - 93.187.7.255 je +93.187.0.0 - 93.187.4.255 gg +93.187.5.0 - 93.187.7.255 gb 93.187.8.0 - 93.187.15.255 nl -93.187.16.0 - 93.187.16.95 gb -93.187.16.96 - 93.187.16.103 de -93.187.16.104 - 93.187.19.255 gb -93.187.20.0 - 93.187.20.7 fr -93.187.20.8 - 93.187.20.15 gb -93.187.20.16 - 93.187.20.23 fr -93.187.20.24 - 93.187.20.31 gb -93.187.20.32 - 93.187.20.95 fr -93.187.20.96 - 93.187.20.103 gb -93.187.20.104 - 93.187.20.111 ch -93.187.20.112 - 93.187.21.255 gb -93.187.22.0 - 93.187.22.31 de -93.187.22.32 - 93.187.22.47 es -93.187.22.48 - 93.187.22.63 gb -93.187.22.64 - 93.187.22.79 hu -93.187.22.80 - 93.187.22.119 gb -93.187.22.120 - 93.187.22.127 de -93.187.22.128 - 93.187.22.135 es -93.187.22.136 - 93.187.22.159 gb -93.187.22.160 - 93.187.22.167 pl -93.187.22.168 - 93.187.22.175 es -93.187.22.176 - 93.187.22.199 gb -93.187.22.200 - 93.187.22.207 de -93.187.22.208 - 93.187.22.255 gb -93.187.23.0 - 93.187.23.255 fr +93.187.16.0 - 93.187.23.255 gb 93.187.24.0 - 93.187.31.255 it -93.187.32.0 - 93.187.39.255 iq +93.187.32.0 - 93.187.35.127 iq +93.187.35.128 - 93.187.35.159 au +93.187.35.160 - 93.187.39.255 iq 93.187.40.0 - 93.187.47.255 fr 93.187.48.0 - 93.187.55.255 nl 93.187.56.0 - 93.187.63.255 de @@ -59756,13 +34765,13 @@ 93.187.104.0 - 93.187.111.255 cz 93.187.112.0 - 93.187.119.255 de 93.187.120.0 - 93.187.127.255 ru -93.187.128.0 - 93.187.128.255 nl -93.187.129.0 - 93.187.129.255 gb -93.187.130.0 - 93.187.135.255 nl -93.187.136.0 - 93.187.143.255 ro -93.187.144.0 - 93.187.150.255 gg -93.187.151.0 - 93.187.151.191 gb -93.187.151.192 - 93.187.151.255 gg +93.187.136.0 - 93.187.143.255 bg +93.187.144.0 - 93.187.144.255 gg +93.187.145.0 - 93.187.146.255 gb +93.187.147.0 - 93.187.148.255 gg +93.187.149.0 - 93.187.149.255 gb +93.187.150.0 - 93.187.150.255 gg +93.187.151.0 - 93.187.151.255 gb 93.187.152.0 - 93.187.159.255 ru 93.187.160.0 - 93.187.167.255 am 93.187.168.0 - 93.187.175.255 gb @@ -59771,9 +34780,7 @@ 93.187.200.0 - 93.187.207.255 tr 93.187.208.0 - 93.187.215.255 ch 93.187.216.0 - 93.187.223.255 nl -93.187.224.0 - 93.187.227.255 gb -93.187.228.0 - 93.187.228.255 fr -93.187.229.0 - 93.187.231.255 gb +93.187.224.0 - 93.187.231.255 gb 93.187.232.0 - 93.187.239.255 de 93.187.240.0 - 93.187.247.255 rs 93.187.248.0 - 93.187.255.255 de @@ -59784,24 +34791,25 @@ 93.188.32.0 - 93.188.39.255 ua 93.188.40.0 - 93.188.47.255 ru 93.188.48.0 - 93.188.55.255 es -93.188.56.0 - 93.188.63.255 ch 93.188.64.0 - 93.188.71.255 nl -93.188.72.0 - 93.188.72.127 ch -93.188.72.128 - 93.188.72.143 cz -93.188.72.144 - 93.188.73.15 ch -93.188.73.16 - 93.188.73.23 nl -93.188.73.24 - 93.188.79.255 ch +93.188.72.0 - 93.188.79.255 ch 93.188.80.0 - 93.188.87.255 ru 93.188.88.0 - 93.188.95.255 no 93.188.96.0 - 93.188.103.255 it 93.188.104.0 - 93.188.111.255 de 93.188.112.0 - 93.188.119.255 it 93.188.120.0 - 93.188.127.255 ru -93.188.128.0 - 93.188.135.255 us +93.188.128.0 - 93.188.128.255 gb +93.188.129.0 - 93.188.130.255 nl +93.188.131.0 - 93.188.131.255 fr +93.188.132.0 - 93.188.132.255 es +93.188.133.0 - 93.188.133.255 de +93.188.134.0 - 93.188.134.255 it +93.188.135.0 - 93.188.135.255 nl 93.188.136.0 - 93.188.143.255 es 93.188.144.0 - 93.188.151.255 fr 93.188.152.0 - 93.188.159.255 ru -93.188.160.0 - 93.188.167.255 ua +93.188.160.0 - 93.188.167.255 us 93.188.168.0 - 93.188.175.255 fr 93.188.176.0 - 93.188.183.255 gb 93.188.184.0 - 93.188.191.255 ru @@ -59812,58 +34820,44 @@ 93.188.232.0 - 93.188.239.255 no 93.188.240.0 - 93.188.247.255 de 93.188.248.0 - 93.188.255.255 nl -93.189.0.0 - 93.189.4.239 gb -93.189.4.240 - 93.189.4.255 cy -93.189.5.0 - 93.189.5.31 gb -93.189.5.32 - 93.189.5.39 cy -93.189.5.40 - 93.189.5.47 gb -93.189.5.48 - 93.189.5.55 cy -93.189.5.56 - 93.189.7.255 gb +93.189.0.0 - 93.189.7.255 gb 93.189.8.0 - 93.189.23.255 ru 93.189.24.0 - 93.189.31.255 at 93.189.32.0 - 93.189.39.255 es -93.189.40.0 - 93.189.55.255 ru -93.189.56.0 - 93.189.56.255 de -93.189.57.0 - 93.189.57.255 ru -93.189.58.0 - 93.189.59.255 de -93.189.60.0 - 93.189.63.255 ru +93.189.40.0 - 93.189.63.255 ru 93.189.64.0 - 93.189.71.255 ch 93.189.72.0 - 93.189.87.255 ru 93.189.88.0 - 93.189.95.255 es 93.189.96.0 - 93.189.103.255 sa -93.189.104.0 - 93.189.104.198 gb -93.189.104.199 - 93.189.104.201 us -93.189.104.202 - 93.189.106.127 gb -93.189.106.128 - 93.189.106.255 sg -93.189.107.0 - 93.189.111.255 gb +93.189.104.0 - 93.189.111.255 gb 93.189.112.0 - 93.189.119.255 hu -93.189.120.0 - 93.189.127.255 ru 93.189.128.0 - 93.189.135.255 nl 93.189.136.0 - 93.189.143.255 it 93.189.144.0 - 93.189.151.255 ru 93.189.152.0 - 93.189.159.255 de -93.189.160.0 - 93.189.167.255 gb +93.189.160.0 - 93.189.160.255 gb +93.189.161.0 - 93.189.163.255 gg +93.189.164.0 - 93.189.167.255 gb 93.189.168.0 - 93.189.175.255 de 93.189.176.0 - 93.189.183.255 es -93.189.184.0 - 93.189.191.255 it +93.189.184.0 - 93.189.185.191 ng +93.189.185.192 - 93.189.185.207 it +93.189.185.208 - 93.189.191.255 ng 93.189.192.0 - 93.189.199.255 sa 93.189.200.0 - 93.189.207.255 ru 93.189.208.0 - 93.189.215.255 it -93.189.216.0 - 93.189.231.255 ru +93.189.216.0 - 93.189.223.255 ru +93.189.224.0 - 93.189.231.255 by 93.189.232.0 - 93.189.239.255 ch -93.189.240.0 - 93.189.245.127 se -93.189.245.128 - 93.189.245.191 my -93.189.245.192 - 93.189.247.255 se +93.189.240.0 - 93.189.247.255 se 93.189.248.0 - 93.189.255.255 ru 93.190.0.0 - 93.190.7.255 hu -93.190.8.0 - 93.190.23.255 ru +93.190.16.0 - 93.190.23.255 ru 93.190.24.0 - 93.190.31.255 ir 93.190.32.0 - 93.190.39.255 fi 93.190.40.0 - 93.190.47.255 ua 93.190.48.0 - 93.190.63.255 cz -93.190.64.0 - 93.190.71.7 de -93.190.71.8 - 93.190.71.15 gb -93.190.71.16 - 93.190.71.255 de +93.190.64.0 - 93.190.71.255 de 93.190.72.0 - 93.190.79.255 ch 93.190.80.0 - 93.190.87.255 no 93.190.88.0 - 93.190.95.255 de @@ -59872,13 +34866,10 @@ 93.190.112.0 - 93.190.119.255 gb 93.190.120.0 - 93.190.127.255 tr 93.190.128.0 - 93.190.135.255 cz -93.190.136.0 - 93.190.143.204 nl -93.190.143.205 - 93.190.143.254 ky -93.190.143.255 - 93.190.143.255 nl -93.190.144.0 - 93.190.144.255 ro -93.190.145.0 - 93.190.145.63 rs -93.190.145.64 - 93.190.151.255 ro -93.190.152.0 - 93.190.159.255 es +93.190.136.0 - 93.190.143.255 nl +93.190.144.0 - 93.190.151.255 ro +93.190.152.0 - 93.190.152.255 eu +93.190.153.0 - 93.190.159.255 es 93.190.160.0 - 93.190.167.255 rs 93.190.168.0 - 93.190.175.255 gb 93.190.176.0 - 93.190.183.255 ua @@ -59892,12 +34883,14 @@ 93.190.240.0 - 93.190.247.255 ru 93.190.248.0 - 93.190.255.255 de 93.191.0.0 - 93.191.7.255 nl -93.191.8.0 - 93.191.23.255 ru +93.191.8.0 - 93.191.8.226 ru +93.191.8.227 - 93.191.8.228 ua +93.191.8.229 - 93.191.8.229 ru +93.191.8.230 - 93.191.8.230 ua +93.191.8.231 - 93.191.23.255 ru 93.191.24.0 - 93.191.39.255 gb 93.191.40.0 - 93.191.47.255 fr -93.191.48.0 - 93.191.52.255 de -93.191.53.0 - 93.191.54.255 ro -93.191.55.0 - 93.191.55.255 de +93.191.48.0 - 93.191.55.255 de 93.191.56.0 - 93.191.63.255 ru 93.191.64.0 - 93.191.71.255 kw 93.191.72.0 - 93.191.79.255 ru @@ -59907,686 +34900,142 @@ 93.191.104.0 - 93.191.111.255 ru 93.191.112.0 - 93.191.119.255 no 93.191.120.0 - 93.191.127.255 fi -93.191.128.0 - 93.191.135.255 bh +93.191.128.0 - 93.191.135.255 nl 93.191.136.0 - 93.191.143.255 es 93.191.144.0 - 93.191.151.255 ie 93.191.152.0 - 93.191.159.255 dk 93.191.160.0 - 93.191.167.255 de -93.191.168.0 - 93.191.170.255 eu -93.191.171.0 - 93.191.171.255 lv -93.191.172.0 - 93.191.172.255 eu +93.191.168.0 - 93.191.172.255 eu 93.191.173.0 - 93.191.173.255 nl 93.191.174.0 - 93.191.175.255 eu 93.191.176.0 - 93.191.183.255 jo 93.191.184.0 - 93.191.191.255 fr 93.191.192.0 - 93.191.199.255 gi -93.191.200.0 - 93.191.207.255 gb +93.191.200.0 - 93.191.200.255 je +93.191.201.0 - 93.191.201.255 gb +93.191.202.0 - 93.191.202.255 je +93.191.203.0 - 93.191.203.255 gb +93.191.204.0 - 93.191.204.255 je +93.191.205.0 - 93.191.207.255 gb 93.191.208.0 - 93.191.215.255 de -93.191.216.0 - 93.191.216.0 eu -93.191.216.1 - 93.191.216.7 be -93.191.216.8 - 93.191.216.9 eu -93.191.216.10 - 93.191.216.10 dk -93.191.216.11 - 93.191.216.15 eu -93.191.216.16 - 93.191.216.255 be -93.191.217.0 - 93.191.217.255 lu -93.191.218.0 - 93.191.218.0 eu -93.191.218.1 - 93.191.218.12 be -93.191.218.13 - 93.191.218.13 nl -93.191.218.14 - 93.191.218.14 ch -93.191.218.15 - 93.191.218.15 lu -93.191.218.16 - 93.191.218.255 be -93.191.219.0 - 93.191.220.255 eu -93.191.221.0 - 93.191.221.31 be -93.191.221.32 - 93.191.221.255 eu -93.191.222.0 - 93.191.222.255 ch -93.191.223.0 - 93.191.223.0 eu -93.191.223.1 - 93.191.223.6 be -93.191.223.7 - 93.191.223.9 eu -93.191.223.10 - 93.191.223.10 dk -93.191.223.11 - 93.191.223.15 eu -93.191.223.16 - 93.191.223.255 be +93.191.216.0 - 93.191.223.255 be 93.191.224.0 - 93.191.231.255 kz 93.191.232.0 - 93.191.239.255 se 93.191.240.0 - 93.191.247.255 it 93.191.248.0 - 93.191.255.255 ch 93.192.0.0 - 93.255.255.255 de 94.0.0.0 - 94.15.255.255 gb -94.16.0.0 - 94.16.255.255 de +94.16.0.0 - 94.16.127.255 de +94.16.128.0 - 94.16.255.255 ch 94.17.0.0 - 94.17.255.255 mt 94.18.0.0 - 94.18.255.255 dk 94.19.0.0 - 94.19.255.255 ru 94.20.0.0 - 94.20.255.255 az 94.21.0.0 - 94.21.255.255 hu 94.22.0.0 - 94.22.255.255 fi -94.23.0.0 - 94.23.63.255 fr -94.23.64.0 - 94.23.73.255 it -94.23.74.0 - 94.23.79.255 pt +94.23.0.0 - 94.23.53.121 fr +94.23.53.122 - 94.23.53.122 hr +94.23.53.123 - 94.23.63.255 fr +94.23.64.0 - 94.23.71.255 it +94.23.72.0 - 94.23.73.35 fr +94.23.73.36 - 94.23.73.36 it +94.23.73.37 - 94.23.74.104 fr +94.23.74.105 - 94.23.74.105 pt +94.23.74.106 - 94.23.74.113 fr +94.23.74.114 - 94.23.74.114 pt +94.23.74.115 - 94.23.75.255 fr +94.23.76.0 - 94.23.76.211 pt +94.23.76.212 - 94.23.76.212 fr +94.23.76.213 - 94.23.79.255 pt 94.23.80.0 - 94.23.87.255 es 94.23.88.0 - 94.23.95.255 pl -94.23.96.0 - 94.23.96.15 fr -94.23.96.16 - 94.23.96.23 es -94.23.96.24 - 94.23.96.31 it -94.23.96.32 - 94.23.96.63 fr -94.23.96.64 - 94.23.96.67 nl -94.23.96.68 - 94.23.96.71 pt -94.23.96.72 - 94.23.96.75 pl -94.23.96.76 - 94.23.96.79 gb -94.23.96.80 - 94.23.96.95 de -94.23.96.96 - 94.23.96.103 it -94.23.96.104 - 94.23.96.131 fr -94.23.96.132 - 94.23.96.135 de -94.23.96.136 - 94.23.96.139 fr -94.23.96.140 - 94.23.96.143 pl -94.23.96.144 - 94.23.96.207 fr -94.23.96.208 - 94.23.96.223 pl -94.23.96.224 - 94.23.96.239 be -94.23.96.240 - 94.23.97.7 fr -94.23.97.8 - 94.23.97.15 de -94.23.97.16 - 94.23.97.31 it -94.23.97.32 - 94.23.97.63 pl -94.23.97.64 - 94.23.97.71 es -94.23.97.72 - 94.23.97.79 fr -94.23.97.80 - 94.23.97.95 pl -94.23.97.96 - 94.23.97.111 es -94.23.97.112 - 94.23.97.135 fr -94.23.97.136 - 94.23.97.139 lt -94.23.97.140 - 94.23.97.143 pl -94.23.97.144 - 94.23.97.151 gb -94.23.97.152 - 94.23.97.155 de -94.23.97.156 - 94.23.97.159 it -94.23.97.160 - 94.23.97.175 fr -94.23.97.176 - 94.23.97.183 cz -94.23.97.184 - 94.23.97.191 be -94.23.97.192 - 94.23.97.195 fr -94.23.97.196 - 94.23.97.199 cz -94.23.97.200 - 94.23.97.203 fr -94.23.97.204 - 94.23.97.207 nl -94.23.97.208 - 94.23.97.223 pl -94.23.97.224 - 94.23.97.227 gb -94.23.97.228 - 94.23.97.231 de -94.23.97.232 - 94.23.97.235 fr -94.23.97.236 - 94.23.98.15 pl -94.23.98.16 - 94.23.98.67 fr -94.23.98.68 - 94.23.98.71 lt -94.23.98.72 - 94.23.98.75 nl -94.23.98.76 - 94.23.98.79 it -94.23.98.80 - 94.23.98.95 es -94.23.98.96 - 94.23.98.111 gb -94.23.98.112 - 94.23.98.119 nl -94.23.98.120 - 94.23.98.127 pl -94.23.98.128 - 94.23.98.131 de -94.23.98.132 - 94.23.98.135 fr -94.23.98.136 - 94.23.98.139 gb -94.23.98.140 - 94.23.98.159 fr -94.23.98.160 - 94.23.98.191 pl -94.23.98.192 - 94.23.98.207 gb -94.23.98.208 - 94.23.98.215 de -94.23.98.216 - 94.23.98.223 es -94.23.98.224 - 94.23.98.255 fr -94.23.99.0 - 94.23.99.15 gb -94.23.99.16 - 94.23.99.23 it -94.23.99.24 - 94.23.99.31 fr -94.23.99.32 - 94.23.99.35 gb -94.23.99.36 - 94.23.99.47 fr -94.23.99.48 - 94.23.99.63 pl -94.23.99.64 - 94.23.99.79 nl -94.23.99.80 - 94.23.99.111 fr -94.23.99.112 - 94.23.99.143 gb -94.23.99.144 - 94.23.99.151 fr -94.23.99.152 - 94.23.99.159 de -94.23.99.160 - 94.23.99.167 fr -94.23.99.168 - 94.23.99.175 gb -94.23.99.176 - 94.23.99.207 fr -94.23.99.208 - 94.23.99.211 ch -94.23.99.212 - 94.23.99.219 gb -94.23.99.220 - 94.23.100.47 fr -94.23.100.48 - 94.23.100.55 es -94.23.100.56 - 94.23.100.59 de -94.23.100.60 - 94.23.100.63 es -94.23.100.64 - 94.23.100.95 fr -94.23.100.96 - 94.23.100.111 pl -94.23.100.112 - 94.23.100.159 fr -94.23.100.160 - 94.23.100.163 it -94.23.100.164 - 94.23.100.175 pl -94.23.100.176 - 94.23.100.179 es -94.23.100.180 - 94.23.100.183 fr -94.23.100.184 - 94.23.100.191 es -94.23.100.192 - 94.23.100.199 pl -94.23.100.200 - 94.23.100.207 es -94.23.100.208 - 94.23.100.223 fr -94.23.100.224 - 94.23.100.227 gb -94.23.100.228 - 94.23.100.231 fr -94.23.100.232 - 94.23.100.255 pl -94.23.101.0 - 94.23.101.15 fr -94.23.101.16 - 94.23.101.31 ch -94.23.101.32 - 94.23.101.63 es -94.23.101.64 - 94.23.101.67 be -94.23.101.68 - 94.23.101.71 it -94.23.101.72 - 94.23.101.75 pl -94.23.101.76 - 94.23.101.87 fr -94.23.101.88 - 94.23.101.91 de -94.23.101.92 - 94.23.101.95 es -94.23.101.96 - 94.23.101.111 it -94.23.101.112 - 94.23.101.191 fr -94.23.101.192 - 94.23.101.207 pl -94.23.101.208 - 94.23.101.211 de -94.23.101.212 - 94.23.101.215 fr -94.23.101.216 - 94.23.101.219 de -94.23.101.220 - 94.23.101.223 fr -94.23.101.224 - 94.23.101.255 pl -94.23.102.0 - 94.23.102.15 es -94.23.102.16 - 94.23.102.47 fr -94.23.102.48 - 94.23.102.51 es -94.23.102.52 - 94.23.102.55 nl -94.23.102.56 - 94.23.102.63 pl -94.23.102.64 - 94.23.102.143 fr -94.23.102.144 - 94.23.102.147 de -94.23.102.148 - 94.23.102.155 fr -94.23.102.156 - 94.23.102.159 nl -94.23.102.160 - 94.23.102.175 pl -94.23.102.176 - 94.23.102.195 es -94.23.102.196 - 94.23.102.207 fr -94.23.102.208 - 94.23.102.223 pt -94.23.102.224 - 94.23.102.239 fr -94.23.102.240 - 94.23.103.31 pl -94.23.103.32 - 94.23.103.39 pt -94.23.103.40 - 94.23.103.43 es -94.23.103.44 - 94.23.103.47 pl -94.23.103.48 - 94.23.103.79 fr -94.23.103.80 - 94.23.103.95 pl -94.23.103.96 - 94.23.103.111 fr -94.23.103.112 - 94.23.103.127 gb -94.23.103.128 - 94.23.103.143 de -94.23.103.144 - 94.23.103.159 nl -94.23.103.160 - 94.23.103.163 fr -94.23.103.164 - 94.23.103.171 it -94.23.103.172 - 94.23.103.175 es +94.23.96.0 - 94.23.98.67 fr +94.23.98.68 - 94.23.98.71 es +94.23.98.72 - 94.23.98.131 fr +94.23.98.132 - 94.23.98.135 es +94.23.98.136 - 94.23.98.143 fr +94.23.98.144 - 94.23.98.159 be +94.23.98.160 - 94.23.99.111 fr +94.23.99.112 - 94.23.99.127 it +94.23.99.128 - 94.23.101.207 fr +94.23.101.208 - 94.23.101.211 es +94.23.101.212 - 94.23.103.71 fr +94.23.103.72 - 94.23.103.79 es +94.23.103.80 - 94.23.103.167 fr +94.23.103.168 - 94.23.103.171 it +94.23.103.172 - 94.23.103.175 fr 94.23.103.176 - 94.23.103.183 cz 94.23.103.184 - 94.23.103.191 pt 94.23.103.192 - 94.23.103.199 be 94.23.103.200 - 94.23.103.207 ch -94.23.103.208 - 94.23.103.223 fr -94.23.103.224 - 94.23.103.239 es -94.23.103.240 - 94.23.104.15 fr -94.23.104.16 - 94.23.104.23 pl -94.23.104.24 - 94.23.104.27 be -94.23.104.28 - 94.23.104.31 fr -94.23.104.32 - 94.23.104.39 pl -94.23.104.40 - 94.23.104.47 pt -94.23.104.48 - 94.23.104.95 fr -94.23.104.96 - 94.23.104.111 pl -94.23.104.112 - 94.23.104.139 fr -94.23.104.140 - 94.23.104.143 de -94.23.104.144 - 94.23.104.151 fr -94.23.104.152 - 94.23.104.155 gb -94.23.104.156 - 94.23.104.159 de -94.23.104.160 - 94.23.104.167 it -94.23.104.168 - 94.23.104.175 ie -94.23.104.176 - 94.23.104.227 fr -94.23.104.228 - 94.23.104.231 pl -94.23.104.232 - 94.23.104.239 be -94.23.104.240 - 94.23.104.255 fr -94.23.105.0 - 94.23.105.3 gb -94.23.105.4 - 94.23.105.7 pl -94.23.105.8 - 94.23.105.19 fr -94.23.105.20 - 94.23.105.23 gb -94.23.105.24 - 94.23.105.27 pl +94.23.103.208 - 94.23.104.39 fr +94.23.104.40 - 94.23.104.47 nl +94.23.104.48 - 94.23.105.27 fr 94.23.105.28 - 94.23.105.31 es -94.23.105.32 - 94.23.105.47 fr -94.23.105.48 - 94.23.105.63 nl -94.23.105.64 - 94.23.105.79 gb -94.23.105.80 - 94.23.105.95 fr -94.23.105.96 - 94.23.105.111 ie -94.23.105.112 - 94.23.105.175 fr -94.23.105.176 - 94.23.105.183 de -94.23.105.184 - 94.23.105.207 es -94.23.105.208 - 94.23.105.223 ch -94.23.105.224 - 94.23.105.231 pl -94.23.105.232 - 94.23.105.235 pt -94.23.105.236 - 94.23.105.239 de -94.23.105.240 - 94.23.105.255 ie -94.23.106.0 - 94.23.106.15 de -94.23.106.16 - 94.23.106.31 fr -94.23.106.32 - 94.23.106.35 ie -94.23.106.36 - 94.23.106.43 fr -94.23.106.44 - 94.23.106.47 pl -94.23.106.48 - 94.23.106.63 fr -94.23.106.64 - 94.23.106.79 pl -94.23.106.80 - 94.23.106.83 be -94.23.106.84 - 94.23.106.87 de -94.23.106.88 - 94.23.106.91 fr -94.23.106.92 - 94.23.106.111 pl -94.23.106.112 - 94.23.106.115 fr -94.23.106.116 - 94.23.106.123 gb -94.23.106.124 - 94.23.106.127 fr -94.23.106.128 - 94.23.106.191 it -94.23.106.192 - 94.23.106.239 fr -94.23.106.240 - 94.23.107.255 de -94.23.108.0 - 94.23.108.15 pl -94.23.108.16 - 94.23.108.19 es -94.23.108.20 - 94.23.108.23 gb -94.23.108.24 - 94.23.108.27 es -94.23.108.28 - 94.23.108.39 fr -94.23.108.40 - 94.23.108.43 pt -94.23.108.44 - 94.23.108.47 fr -94.23.108.48 - 94.23.108.63 it -94.23.108.64 - 94.23.108.79 fr -94.23.108.80 - 94.23.108.95 pl -94.23.108.96 - 94.23.108.127 gb -94.23.108.128 - 94.23.108.131 it -94.23.108.132 - 94.23.108.135 fr -94.23.108.136 - 94.23.108.143 pl +94.23.105.32 - 94.23.106.15 fr +94.23.106.16 - 94.23.106.31 be +94.23.106.32 - 94.23.106.255 fr +94.23.107.0 - 94.23.107.255 de +94.23.108.0 - 94.23.108.135 fr +94.23.108.136 - 94.23.108.143 it 94.23.108.144 - 94.23.108.159 fr -94.23.108.160 - 94.23.108.163 it -94.23.108.164 - 94.23.108.167 pl -94.23.108.168 - 94.23.108.175 de -94.23.108.176 - 94.23.108.191 fr -94.23.108.192 - 94.23.108.199 gb -94.23.108.200 - 94.23.108.203 pl -94.23.108.204 - 94.23.108.207 fr -94.23.108.208 - 94.23.108.215 es -94.23.108.216 - 94.23.108.223 fr -94.23.108.224 - 94.23.108.239 pl -94.23.108.240 - 94.23.109.7 fr -94.23.109.8 - 94.23.109.11 es -94.23.109.12 - 94.23.109.15 fi -94.23.109.16 - 94.23.109.23 pl -94.23.109.24 - 94.23.109.31 fr -94.23.109.32 - 94.23.109.47 cz -94.23.109.48 - 94.23.109.51 gb -94.23.109.52 - 94.23.109.63 de -94.23.109.64 - 94.23.109.95 fr -94.23.109.96 - 94.23.109.111 nl -94.23.109.112 - 94.23.109.123 pl -94.23.109.124 - 94.23.109.127 fr -94.23.109.128 - 94.23.109.143 it -94.23.109.144 - 94.23.109.175 fr -94.23.109.176 - 94.23.109.191 cz -94.23.109.192 - 94.23.109.223 fr -94.23.109.224 - 94.23.109.239 es -94.23.109.240 - 94.23.109.255 nl -94.23.110.0 - 94.23.110.31 fr -94.23.110.32 - 94.23.110.39 gb -94.23.110.40 - 94.23.110.43 fr -94.23.110.44 - 94.23.110.47 nl -94.23.110.48 - 94.23.110.79 fr -94.23.110.80 - 94.23.110.83 es -94.23.110.84 - 94.23.110.87 fr -94.23.110.88 - 94.23.110.95 de -94.23.110.96 - 94.23.110.103 es -94.23.110.104 - 94.23.110.107 gb -94.23.110.108 - 94.23.110.111 de -94.23.110.112 - 94.23.110.127 fr -94.23.110.128 - 94.23.110.143 pl -94.23.110.144 - 94.23.110.151 fr -94.23.110.152 - 94.23.110.155 it -94.23.110.156 - 94.23.110.163 fr -94.23.110.164 - 94.23.110.167 lt -94.23.110.168 - 94.23.110.171 fr -94.23.110.172 - 94.23.110.175 es -94.23.110.176 - 94.23.110.191 fr -94.23.110.192 - 94.23.110.207 pl -94.23.110.208 - 94.23.110.223 fr -94.23.110.224 - 94.23.110.239 be -94.23.110.240 - 94.23.110.247 es -94.23.110.248 - 94.23.110.255 it -94.23.111.0 - 94.23.111.7 fr -94.23.111.8 - 94.23.111.11 es -94.23.111.12 - 94.23.111.15 fr -94.23.111.16 - 94.23.111.31 pl -94.23.111.32 - 94.23.111.39 ch -94.23.111.40 - 94.23.111.47 cz -94.23.111.48 - 94.23.111.95 fr -94.23.111.96 - 94.23.111.99 pl -94.23.111.100 - 94.23.111.103 es -94.23.111.104 - 94.23.111.111 it -94.23.111.112 - 94.23.111.115 pt -94.23.111.116 - 94.23.111.119 es -94.23.111.120 - 94.23.111.123 de -94.23.111.124 - 94.23.111.159 fr -94.23.111.160 - 94.23.111.163 de -94.23.111.164 - 94.23.111.191 pl -94.23.111.192 - 94.23.111.207 fr -94.23.111.208 - 94.23.111.223 ie -94.23.111.224 - 94.23.111.255 pl -94.23.112.0 - 94.23.112.3 gb -94.23.112.4 - 94.23.112.7 fi -94.23.112.8 - 94.23.112.11 pl -94.23.112.12 - 94.23.112.15 fr -94.23.112.16 - 94.23.112.31 pl -94.23.112.32 - 94.23.112.51 gb -94.23.112.52 - 94.23.112.55 fr -94.23.112.56 - 94.23.112.59 pt -94.23.112.60 - 94.23.112.63 es -94.23.112.64 - 94.23.112.71 fr -94.23.112.72 - 94.23.112.79 pt -94.23.112.80 - 94.23.112.95 fr -94.23.112.96 - 94.23.112.127 pl -94.23.112.128 - 94.23.112.143 fr -94.23.112.144 - 94.23.112.159 pl -94.23.112.160 - 94.23.112.175 fr -94.23.112.176 - 94.23.112.191 es -94.23.112.192 - 94.23.112.207 fr -94.23.112.208 - 94.23.112.211 pl -94.23.112.212 - 94.23.112.215 fr -94.23.112.216 - 94.23.112.219 pl -94.23.112.220 - 94.23.112.223 fr -94.23.112.224 - 94.23.112.231 gb -94.23.112.232 - 94.23.112.235 de -94.23.112.236 - 94.23.112.239 fr -94.23.112.240 - 94.23.112.247 es -94.23.112.248 - 94.23.112.251 pl -94.23.112.252 - 94.23.112.255 lt -94.23.113.0 - 94.23.113.15 pl -94.23.113.16 - 94.23.113.47 es -94.23.113.48 - 94.23.113.63 fr -94.23.113.64 - 94.23.113.127 de -94.23.113.128 - 94.23.113.143 fr -94.23.113.144 - 94.23.113.147 be -94.23.113.148 - 94.23.113.151 de -94.23.113.152 - 94.23.113.155 it -94.23.113.156 - 94.23.113.191 fr -94.23.113.192 - 94.23.113.207 es -94.23.113.208 - 94.23.113.215 gb -94.23.113.216 - 94.23.113.223 es -94.23.113.224 - 94.23.113.239 fr -94.23.113.240 - 94.23.113.255 de -94.23.114.0 - 94.23.114.31 fr -94.23.114.32 - 94.23.114.47 it -94.23.114.48 - 94.23.114.55 pl -94.23.114.56 - 94.23.114.223 fr -94.23.114.224 - 94.23.114.239 gb -94.23.114.240 - 94.23.115.31 fr -94.23.115.32 - 94.23.115.47 gb -94.23.115.48 - 94.23.115.55 fr -94.23.115.56 - 94.23.115.59 es -94.23.115.60 - 94.23.115.79 fr -94.23.115.80 - 94.23.115.95 es -94.23.115.96 - 94.23.115.127 fr -94.23.115.128 - 94.23.115.131 de -94.23.115.132 - 94.23.115.135 fr -94.23.115.136 - 94.23.115.143 pl -94.23.115.144 - 94.23.115.159 de -94.23.115.160 - 94.23.115.191 be -94.23.115.192 - 94.23.115.195 es -94.23.115.196 - 94.23.115.199 fr -94.23.115.200 - 94.23.115.203 de -94.23.115.204 - 94.23.115.207 es -94.23.115.208 - 94.23.115.215 fr -94.23.115.216 - 94.23.115.223 pl -94.23.115.224 - 94.23.115.255 fr -94.23.116.0 - 94.23.116.15 it -94.23.116.16 - 94.23.116.35 fr -94.23.116.36 - 94.23.116.39 de -94.23.116.40 - 94.23.116.51 fr -94.23.116.52 - 94.23.116.55 ch -94.23.116.56 - 94.23.116.59 es -94.23.116.60 - 94.23.116.79 pl -94.23.116.80 - 94.23.116.83 ie -94.23.116.84 - 94.23.116.91 pl -94.23.116.92 - 94.23.116.95 it -94.23.116.96 - 94.23.116.111 pl -94.23.116.112 - 94.23.116.119 fr -94.23.116.120 - 94.23.116.127 es -94.23.116.128 - 94.23.116.131 de -94.23.116.132 - 94.23.116.139 pl -94.23.116.140 - 94.23.116.159 fr -94.23.116.160 - 94.23.116.175 de -94.23.116.176 - 94.23.116.191 pl -94.23.116.192 - 94.23.116.207 fr -94.23.116.208 - 94.23.116.211 be -94.23.116.212 - 94.23.116.215 ch -94.23.116.216 - 94.23.116.219 gb -94.23.116.220 - 94.23.117.23 fr -94.23.117.24 - 94.23.117.27 gb -94.23.117.28 - 94.23.117.31 es -94.23.117.32 - 94.23.117.35 pl -94.23.117.36 - 94.23.117.39 be -94.23.117.40 - 94.23.117.43 gb -94.23.117.44 - 94.23.117.51 fr -94.23.117.52 - 94.23.117.55 es -94.23.117.56 - 94.23.117.59 de -94.23.117.60 - 94.23.117.63 gb -94.23.117.64 - 94.23.117.95 fr -94.23.117.96 - 94.23.117.111 pl -94.23.117.112 - 94.23.117.127 fr -94.23.117.128 - 94.23.117.159 gb -94.23.117.160 - 94.23.117.163 it -94.23.117.164 - 94.23.117.167 fr -94.23.117.168 - 94.23.117.175 es -94.23.117.176 - 94.23.117.179 fr -94.23.117.180 - 94.23.117.191 es -94.23.117.192 - 94.23.117.223 ch -94.23.117.224 - 94.23.117.239 de -94.23.117.240 - 94.23.118.15 fr -94.23.118.16 - 94.23.118.31 gb -94.23.118.32 - 94.23.118.67 pl -94.23.118.68 - 94.23.118.71 be -94.23.118.72 - 94.23.118.95 fr -94.23.118.96 - 94.23.118.127 de -94.23.118.128 - 94.23.118.143 ie -94.23.118.144 - 94.23.118.151 nl -94.23.118.152 - 94.23.118.155 it -94.23.118.156 - 94.23.118.191 fr -94.23.118.192 - 94.23.118.223 it -94.23.118.224 - 94.23.118.255 ie -94.23.119.0 - 94.23.119.3 de -94.23.119.4 - 94.23.119.7 gb -94.23.119.8 - 94.23.119.11 pl -94.23.119.12 - 94.23.119.15 es -94.23.119.16 - 94.23.119.19 de -94.23.119.20 - 94.23.119.23 fr -94.23.119.24 - 94.23.119.27 pt -94.23.119.28 - 94.23.119.31 es -94.23.119.32 - 94.23.119.47 pl -94.23.119.48 - 94.23.119.51 de -94.23.119.52 - 94.23.119.55 fr -94.23.119.56 - 94.23.119.59 de -94.23.119.60 - 94.23.119.63 fr -94.23.119.64 - 94.23.119.79 pl -94.23.119.80 - 94.23.119.87 gb -94.23.119.88 - 94.23.119.95 be -94.23.119.96 - 94.23.119.111 es -94.23.119.112 - 94.23.119.159 fr -94.23.119.160 - 94.23.119.191 gb -94.23.119.192 - 94.23.119.207 es -94.23.119.208 - 94.23.119.239 fr -94.23.119.240 - 94.23.119.255 es +94.23.108.160 - 94.23.108.163 es +94.23.108.164 - 94.23.109.15 fr +94.23.109.16 - 94.23.109.23 nl +94.23.109.24 - 94.23.110.163 fr +94.23.110.164 - 94.23.110.167 es +94.23.110.168 - 94.23.112.255 fr +94.23.113.0 - 94.23.113.255 es +94.23.114.0 - 94.23.115.223 fr +94.23.115.224 - 94.23.115.255 de +94.23.116.0 - 94.23.116.39 fr +94.23.116.40 - 94.23.116.43 it +94.23.116.44 - 94.23.116.91 fr +94.23.116.92 - 94.23.116.95 gb +94.23.116.96 - 94.23.117.223 fr +94.23.117.224 - 94.23.117.239 es +94.23.117.240 - 94.23.118.147 fr +94.23.118.148 - 94.23.118.151 es +94.23.118.152 - 94.23.119.255 fr 94.23.120.0 - 94.23.121.255 gb -94.23.122.0 - 94.23.134.255 fr -94.23.135.0 - 94.23.135.63 be -94.23.135.64 - 94.23.136.63 fr -94.23.136.64 - 94.23.136.127 be -94.23.136.128 - 94.23.143.255 fr +94.23.122.0 - 94.23.143.255 fr 94.23.144.0 - 94.23.151.255 nl 94.23.152.0 - 94.23.159.255 gb 94.23.160.0 - 94.23.167.255 de 94.23.168.0 - 94.23.175.255 cz -94.23.176.0 - 94.23.176.79 fr -94.23.176.80 - 94.23.176.83 ch -94.23.176.84 - 94.23.176.87 gb -94.23.176.88 - 94.23.176.91 de -94.23.176.92 - 94.23.176.95 fr -94.23.176.96 - 94.23.176.111 de -94.23.176.112 - 94.23.176.115 pl -94.23.176.116 - 94.23.176.119 gb -94.23.176.120 - 94.23.176.131 fr -94.23.176.132 - 94.23.176.135 nl -94.23.176.136 - 94.23.176.143 de -94.23.176.144 - 94.23.176.159 ch -94.23.176.160 - 94.23.176.163 pl -94.23.176.164 - 94.23.176.167 ie -94.23.176.168 - 94.23.176.171 it -94.23.176.172 - 94.23.176.175 pl -94.23.176.176 - 94.23.176.179 be -94.23.176.180 - 94.23.176.183 fr -94.23.176.184 - 94.23.176.191 pl -94.23.176.192 - 94.23.176.255 fr -94.23.177.0 - 94.23.177.31 es -94.23.177.32 - 94.23.177.63 pl -94.23.177.64 - 94.23.177.95 fr -94.23.177.96 - 94.23.177.99 es -94.23.177.100 - 94.23.177.103 cz -94.23.177.104 - 94.23.177.107 es -94.23.177.108 - 94.23.177.111 pl -94.23.177.112 - 94.23.177.127 fr -94.23.177.128 - 94.23.177.131 de -94.23.177.132 - 94.23.177.135 fr -94.23.177.136 - 94.23.177.143 nl -94.23.177.144 - 94.23.177.159 de -94.23.177.160 - 94.23.177.163 be -94.23.177.164 - 94.23.177.175 de -94.23.177.176 - 94.23.177.191 fr -94.23.177.192 - 94.23.177.207 ch -94.23.177.208 - 94.23.177.239 de -94.23.177.240 - 94.23.177.247 be -94.23.177.248 - 94.23.177.251 fr -94.23.177.252 - 94.23.177.255 es -94.23.178.0 - 94.23.178.15 nl -94.23.178.16 - 94.23.178.19 gb -94.23.178.20 - 94.23.178.23 de -94.23.178.24 - 94.23.178.27 es -94.23.178.28 - 94.23.178.31 pl -94.23.178.32 - 94.23.178.35 it -94.23.178.36 - 94.23.178.43 fr -94.23.178.44 - 94.23.178.51 gb -94.23.178.52 - 94.23.178.55 it -94.23.178.56 - 94.23.178.63 pl -94.23.178.64 - 94.23.178.79 it -94.23.178.80 - 94.23.178.87 fr -94.23.178.88 - 94.23.178.91 pl -94.23.178.92 - 94.23.178.95 de -94.23.178.96 - 94.23.178.103 gb -94.23.178.104 - 94.23.178.127 pl -94.23.178.128 - 94.23.178.143 be -94.23.178.144 - 94.23.178.159 fr -94.23.178.160 - 94.23.178.175 ch -94.23.178.176 - 94.23.178.191 fr -94.23.178.192 - 94.23.178.199 gb -94.23.178.200 - 94.23.178.207 es -94.23.178.208 - 94.23.178.223 it -94.23.178.224 - 94.23.178.239 gb -94.23.178.240 - 94.23.178.243 es -94.23.178.244 - 94.23.178.247 nl -94.23.178.248 - 94.23.178.255 es -94.23.179.0 - 94.23.179.255 fr -94.23.180.0 - 94.23.180.63 ch -94.23.180.64 - 94.23.180.71 de -94.23.180.72 - 94.23.180.79 fr -94.23.180.80 - 94.23.180.95 gb -94.23.180.96 - 94.23.180.127 ch -94.23.180.128 - 94.23.180.143 be -94.23.180.144 - 94.23.180.207 fr -94.23.180.208 - 94.23.180.223 be -94.23.180.224 - 94.23.180.231 pl -94.23.180.232 - 94.23.180.235 fr -94.23.180.236 - 94.23.180.239 gb -94.23.180.240 - 94.23.180.255 fr -94.23.181.0 - 94.23.181.63 gb -94.23.181.64 - 94.23.181.71 de -94.23.181.72 - 94.23.181.79 ch -94.23.181.80 - 94.23.181.83 nl -94.23.181.84 - 94.23.181.87 de -94.23.181.88 - 94.23.181.91 pl -94.23.181.92 - 94.23.181.95 es -94.23.181.96 - 94.23.181.147 fr -94.23.181.148 - 94.23.181.151 pl -94.23.181.152 - 94.23.181.155 ie -94.23.181.156 - 94.23.181.159 de -94.23.181.160 - 94.23.181.167 es -94.23.181.168 - 94.23.181.171 ie -94.23.181.172 - 94.23.181.175 es -94.23.181.176 - 94.23.181.255 pl -94.23.182.0 - 94.23.182.15 it -94.23.182.16 - 94.23.182.31 fr -94.23.182.32 - 94.23.182.35 pl -94.23.182.36 - 94.23.182.39 it -94.23.182.40 - 94.23.182.79 fr -94.23.182.80 - 94.23.182.95 de -94.23.182.96 - 94.23.182.159 fr -94.23.182.160 - 94.23.182.191 pl -94.23.182.192 - 94.23.182.255 fr -94.23.183.0 - 94.23.183.95 gb -94.23.183.96 - 94.23.183.99 pl -94.23.183.100 - 94.23.183.103 fr -94.23.183.104 - 94.23.183.107 ie -94.23.183.108 - 94.23.183.127 it -94.23.183.128 - 94.23.183.143 pt -94.23.183.144 - 94.23.183.159 ch -94.23.183.160 - 94.23.183.191 pl -94.23.183.192 - 94.23.183.207 es -94.23.183.208 - 94.23.183.223 de -94.23.183.224 - 94.23.184.127 fr -94.23.184.128 - 94.23.184.159 nl -94.23.184.160 - 94.23.184.163 fr -94.23.184.164 - 94.23.184.167 pl -94.23.184.168 - 94.23.184.171 de -94.23.184.172 - 94.23.184.175 fr -94.23.184.176 - 94.23.184.223 es -94.23.184.224 - 94.23.184.239 de -94.23.184.240 - 94.23.184.247 it -94.23.184.248 - 94.23.184.255 fr -94.23.185.0 - 94.23.185.255 de -94.23.186.0 - 94.23.186.143 fr -94.23.186.144 - 94.23.186.151 gb -94.23.186.152 - 94.23.186.175 fr -94.23.186.176 - 94.23.186.179 de -94.23.186.180 - 94.23.186.183 gb -94.23.186.184 - 94.23.186.191 de -94.23.186.192 - 94.23.186.199 fr -94.23.186.200 - 94.23.186.207 gb -94.23.186.208 - 94.23.186.223 fr -94.23.186.224 - 94.23.186.227 es -94.23.186.228 - 94.23.186.231 ch -94.23.186.232 - 94.23.186.235 gb -94.23.186.236 - 94.23.186.255 fr -94.23.187.0 - 94.23.187.63 de -94.23.187.64 - 94.23.187.127 pl -94.23.187.128 - 94.23.187.143 de -94.23.187.144 - 94.23.187.175 fr -94.23.187.176 - 94.23.187.191 es -94.23.187.192 - 94.23.187.207 nl -94.23.187.208 - 94.23.187.215 be -94.23.187.216 - 94.23.187.219 es -94.23.187.220 - 94.23.187.223 it -94.23.187.224 - 94.23.187.231 fr -94.23.187.232 - 94.23.187.235 pl -94.23.187.236 - 94.23.187.239 fr -94.23.187.240 - 94.23.187.247 es -94.23.187.248 - 94.23.187.255 nl -94.23.188.0 - 94.23.188.15 de -94.23.188.16 - 94.23.188.19 fr -94.23.188.20 - 94.23.188.23 pl -94.23.188.24 - 94.23.188.27 be -94.23.188.28 - 94.23.188.31 pl -94.23.188.32 - 94.23.188.63 es -94.23.188.64 - 94.23.188.127 it -94.23.188.128 - 94.23.188.191 es -94.23.188.192 - 94.23.188.223 fr -94.23.188.224 - 94.23.188.239 pl -94.23.188.240 - 94.23.188.243 fr -94.23.188.244 - 94.23.188.247 pl -94.23.188.248 - 94.23.188.255 de -94.23.189.0 - 94.23.189.15 fr -94.23.189.16 - 94.23.189.31 be -94.23.189.32 - 94.23.189.39 fi -94.23.189.40 - 94.23.189.55 fr -94.23.189.56 - 94.23.189.63 es -94.23.189.64 - 94.23.189.159 fr -94.23.189.160 - 94.23.189.175 es -94.23.189.176 - 94.23.189.179 fr -94.23.189.180 - 94.23.189.191 gb -94.23.189.192 - 94.23.189.255 pl -94.23.190.0 - 94.23.190.255 es -94.23.191.0 - 94.23.191.15 gb -94.23.191.16 - 94.23.191.31 pl -94.23.191.32 - 94.23.191.47 fr -94.23.191.48 - 94.23.191.55 de -94.23.191.56 - 94.23.191.63 gb -94.23.191.64 - 94.23.191.95 cz -94.23.191.96 - 94.23.191.127 be -94.23.191.128 - 94.23.255.255 fr -94.24.0.0 - 94.24.127.255 ro +94.23.176.0 - 94.23.177.223 fr +94.23.177.224 - 94.23.177.231 de +94.23.177.232 - 94.23.180.255 fr +94.23.181.0 - 94.23.181.3 de +94.23.181.4 - 94.23.181.11 fr +94.23.181.12 - 94.23.181.15 de +94.23.181.16 - 94.23.184.171 fr +94.23.184.172 - 94.23.184.175 es +94.23.184.176 - 94.23.186.188 fr +94.23.186.189 - 94.23.186.189 es +94.23.186.190 - 94.23.187.231 fr +94.23.187.232 - 94.23.187.235 es +94.23.187.236 - 94.23.188.171 fr +94.23.188.172 - 94.23.188.175 nl +94.23.188.176 - 94.23.190.47 fr +94.23.190.48 - 94.23.190.51 ru +94.23.190.52 - 94.23.190.55 hu +94.23.190.56 - 94.23.190.127 fr +94.23.190.128 - 94.23.190.131 ee +94.23.190.132 - 94.23.190.151 fr +94.23.190.152 - 94.23.190.155 is +94.23.190.156 - 94.23.190.159 lv +94.23.190.160 - 94.23.190.163 bg +94.23.190.164 - 94.23.190.187 fr +94.23.190.188 - 94.23.190.191 no +94.23.190.192 - 94.23.190.199 fr +94.23.190.200 - 94.23.190.203 si +94.23.190.204 - 94.23.190.207 ua +94.23.190.208 - 94.23.190.223 fr +94.23.190.224 - 94.23.190.239 de +94.23.190.240 - 94.23.255.255 fr +94.24.0.0 - 94.24.111.255 ro +94.24.112.0 - 94.24.127.255 es 94.24.128.0 - 94.25.255.255 ru 94.26.0.0 - 94.26.127.255 bg 94.26.128.0 - 94.26.255.255 ru @@ -60596,30 +35045,7 @@ 94.29.128.0 - 94.29.255.255 kw 94.30.0.0 - 94.30.127.255 gb 94.30.128.0 - 94.30.255.255 lv -94.31.0.0 - 94.31.1.255 gb -94.31.2.0 - 94.31.2.31 nl -94.31.2.32 - 94.31.7.47 gb -94.31.7.48 - 94.31.7.63 il -94.31.7.64 - 94.31.7.127 gb -94.31.7.128 - 94.31.7.143 us -94.31.7.144 - 94.31.7.255 gb -94.31.8.0 - 94.31.8.255 de -94.31.9.0 - 94.31.14.255 gb -94.31.15.0 - 94.31.15.255 nl -94.31.16.0 - 94.31.16.255 gb -94.31.17.0 - 94.31.17.255 nl -94.31.18.0 - 94.31.18.255 gb -94.31.19.0 - 94.31.19.255 nl -94.31.20.0 - 94.31.24.255 gb -94.31.25.0 - 94.31.25.131 nl -94.31.25.132 - 94.31.32.255 gb -94.31.33.0 - 94.31.33.255 nl -94.31.34.0 - 94.31.58.255 gb -94.31.59.0 - 94.31.59.63 nl -94.31.59.64 - 94.31.59.95 de -94.31.59.96 - 94.31.60.255 gb -94.31.61.0 - 94.31.61.63 nl -94.31.61.64 - 94.31.63.255 gb +94.31.0.0 - 94.31.63.255 gb 94.31.64.0 - 94.31.127.255 de 94.31.128.0 - 94.31.255.255 ru 94.32.0.0 - 94.39.255.255 it @@ -60631,21 +35057,38 @@ 94.45.0.0 - 94.45.31.255 ru 94.45.32.0 - 94.45.159.255 ua 94.45.160.0 - 94.45.223.255 ru -94.45.224.0 - 94.45.255.255 de -94.46.0.0 - 94.46.23.255 pt -94.46.24.0 - 94.46.24.255 us -94.46.25.0 - 94.46.124.255 pt -94.46.125.0 - 94.46.125.255 ch -94.46.126.0 - 94.46.239.255 pt -94.46.240.0 - 94.46.247.255 es -94.46.248.0 - 94.46.255.255 pt +94.45.224.0 - 94.45.255.255 gb +94.46.0.0 - 94.46.31.255 pt +94.46.32.0 - 94.46.39.255 tr +94.46.40.0 - 94.46.47.255 de +94.46.48.0 - 94.46.57.13 us +94.46.57.14 - 94.46.57.14 se +94.46.57.15 - 94.46.63.14 us +94.46.63.15 - 94.46.63.15 se +94.46.63.16 - 94.46.63.255 us +94.46.64.0 - 94.46.95.255 pt +94.46.96.0 - 94.46.97.255 gb +94.46.98.0 - 94.46.98.255 us +94.46.99.0 - 94.46.113.67 gb +94.46.113.68 - 94.46.113.68 se +94.46.113.69 - 94.46.125.47 gb +94.46.125.48 - 94.46.125.48 se +94.46.125.49 - 94.46.127.255 gb +94.46.128.0 - 94.46.142.255 pt +94.46.143.0 - 94.46.143.255 se +94.46.144.0 - 94.46.159.255 us +94.46.160.0 - 94.46.205.255 pt +94.46.206.0 - 94.46.206.255 tr +94.46.207.0 - 94.46.239.255 pt +94.46.240.0 - 94.46.243.255 se +94.46.244.0 - 94.46.255.255 pt 94.47.0.0 - 94.47.255.255 it -94.48.0.0 - 94.49.255.255 ro +94.48.0.0 - 94.49.255.255 sa 94.50.0.0 - 94.51.255.255 ru 94.52.0.0 - 94.53.255.255 ro 94.54.0.0 - 94.55.255.255 tr 94.56.0.0 - 94.59.255.255 ae -94.60.0.0 - 94.63.255.255 ro +94.60.0.0 - 94.63.255.255 pt 94.64.0.0 - 94.71.255.255 gr 94.72.0.0 - 94.72.63.255 ru 94.72.64.0 - 94.72.127.255 pl @@ -60653,11 +35096,7 @@ 94.72.192.0 - 94.72.255.255 gb 94.73.0.0 - 94.73.63.255 bg 94.73.64.0 - 94.73.127.255 it -94.73.128.0 - 94.73.151.255 tr -94.73.152.0 - 94.73.152.255 gb -94.73.153.0 - 94.73.187.255 tr -94.73.188.0 - 94.73.189.255 gb -94.73.190.0 - 94.73.191.255 tr +94.73.128.0 - 94.73.191.255 tr 94.73.192.0 - 94.73.255.255 ru 94.74.0.0 - 94.74.63.255 it 94.74.64.0 - 94.74.127.255 ua @@ -60667,18 +35106,18 @@ 94.75.64.0 - 94.75.127.255 pl 94.75.128.0 - 94.75.191.255 ru 94.75.192.0 - 94.75.255.255 nl -94.76.0.0 - 94.76.63.255 bh +94.76.0.0 - 94.76.21.255 bh +94.76.22.0 - 94.76.22.255 us +94.76.23.0 - 94.76.63.255 bh 94.76.64.0 - 94.76.127.255 ua 94.76.128.0 - 94.76.191.255 es 94.76.192.0 - 94.76.255.255 gb 94.77.0.0 - 94.77.191.255 ru 94.77.192.0 - 94.77.255.255 sa 94.78.0.0 - 94.78.63.255 ch -94.78.64.0 - 94.78.92.255 gb -94.78.93.0 - 94.78.94.31 tr -94.78.94.32 - 94.78.104.255 gb -94.78.105.0 - 94.78.108.255 tr -94.78.109.0 - 94.78.127.255 gb +94.78.64.0 - 94.78.94.95 tr +94.78.94.96 - 94.78.94.127 cy +94.78.94.128 - 94.78.127.255 tr 94.78.128.0 - 94.78.191.255 pl 94.78.192.0 - 94.79.63.255 ru 94.79.64.0 - 94.79.127.255 tr @@ -60687,137 +35126,99 @@ 94.80.0.0 - 94.95.255.255 it 94.96.0.0 - 94.99.255.255 sa 94.100.0.0 - 94.100.15.255 lv -94.100.16.0 - 94.100.22.255 nl -94.100.23.0 - 94.100.23.255 us -94.100.24.0 - 94.100.30.255 nl -94.100.31.0 - 94.100.31.255 us +94.100.16.0 - 94.100.31.255 nl 94.100.32.0 - 94.100.47.255 it 94.100.48.0 - 94.100.63.255 rs -94.100.64.0 - 94.100.75.179 de -94.100.75.180 - 94.100.75.183 a2 -94.100.75.184 - 94.100.79.255 de +94.100.64.0 - 94.100.79.255 de 94.100.80.0 - 94.100.95.255 ru 94.100.96.0 - 94.100.111.255 mk 94.100.112.0 - 94.100.127.255 nl -94.100.128.0 - 94.100.134.255 de -94.100.135.0 - 94.100.135.255 gb -94.100.136.0 - 94.100.143.255 de +94.100.128.0 - 94.100.143.255 de 94.100.144.0 - 94.100.159.255 ch 94.100.160.0 - 94.100.175.255 fr 94.100.176.0 - 94.100.207.255 ru 94.100.208.0 - 94.100.223.255 ua 94.100.224.0 - 94.100.239.255 ge -94.100.240.0 - 94.100.242.135 de -94.100.242.136 - 94.100.242.143 gb -94.100.242.144 - 94.100.255.255 de +94.100.240.0 - 94.100.255.255 de 94.101.0.0 - 94.101.15.255 fi 94.101.16.0 - 94.101.31.255 pl 94.101.32.0 - 94.101.47.255 de 94.101.48.0 - 94.101.63.255 it -94.101.64.0 - 94.101.64.47 ru -94.101.64.48 - 94.101.64.55 a2 -94.101.64.56 - 94.101.79.255 ru +94.101.64.0 - 94.101.79.255 ru 94.101.80.0 - 94.101.95.255 tr 94.101.96.0 - 94.101.111.255 ru -94.101.112.0 - 94.101.127.255 gi -94.101.128.0 - 94.101.135.255 ir -94.101.136.0 - 94.101.143.255 ae -94.101.144.0 - 94.101.158.223 gb -94.101.158.224 - 94.101.158.224 fr -94.101.158.225 - 94.101.158.225 de -94.101.158.226 - 94.101.158.226 es -94.101.158.227 - 94.101.158.227 it -94.101.158.228 - 94.101.158.228 nl -94.101.158.229 - 94.101.158.229 be -94.101.158.230 - 94.101.175.255 gb +94.101.128.0 - 94.101.143.255 ir +94.101.144.0 - 94.101.175.255 gb 94.101.176.0 - 94.101.191.255 ir 94.101.192.0 - 94.101.207.255 bg -94.101.208.0 - 94.101.214.111 dk -94.101.214.112 - 94.101.214.127 a2 -94.101.214.128 - 94.101.214.159 dk -94.101.214.160 - 94.101.214.175 de -94.101.214.176 - 94.101.223.255 dk +94.101.208.0 - 94.101.223.255 dk 94.101.224.0 - 94.101.239.255 lv 94.101.240.0 - 94.101.255.255 ir 94.102.0.0 - 94.102.15.255 tr 94.102.16.0 - 94.102.31.255 ru 94.102.32.0 - 94.102.47.255 no -94.102.48.0 - 94.102.48.150 nl -94.102.48.151 - 94.102.48.160 ru -94.102.48.161 - 94.102.63.255 nl +94.102.48.0 - 94.102.63.255 nl 94.102.64.0 - 94.102.79.255 tr 94.102.80.0 - 94.102.95.255 ru 94.102.96.0 - 94.102.111.255 at 94.102.112.0 - 94.102.127.255 ru 94.102.128.0 - 94.102.143.255 it -94.102.144.0 - 94.102.159.255 gb +94.102.144.0 - 94.102.145.167 gb +94.102.145.168 - 94.102.145.175 it +94.102.145.176 - 94.102.145.239 gb +94.102.145.240 - 94.102.145.247 it +94.102.145.248 - 94.102.146.71 gb +94.102.146.72 - 94.102.146.79 it +94.102.146.80 - 94.102.147.159 gb +94.102.147.160 - 94.102.147.167 it +94.102.147.168 - 94.102.147.183 gb +94.102.147.184 - 94.102.147.191 it +94.102.147.192 - 94.102.149.239 gb +94.102.149.240 - 94.102.149.247 it +94.102.149.248 - 94.102.151.231 gb +94.102.151.232 - 94.102.151.239 it +94.102.151.240 - 94.102.154.15 gb +94.102.154.16 - 94.102.154.23 it +94.102.154.24 - 94.102.154.31 gb +94.102.154.32 - 94.102.154.39 it +94.102.154.40 - 94.102.155.47 gb +94.102.155.48 - 94.102.155.55 it +94.102.155.56 - 94.102.156.63 gb +94.102.156.64 - 94.102.156.71 it +94.102.156.72 - 94.102.156.183 gb +94.102.156.184 - 94.102.156.191 it +94.102.156.192 - 94.102.158.71 gb +94.102.158.72 - 94.102.158.79 it +94.102.158.80 - 94.102.159.255 gb 94.102.160.0 - 94.102.175.255 eu 94.102.176.0 - 94.102.191.255 tm 94.102.192.0 - 94.102.207.255 ie -94.102.208.0 - 94.102.222.255 de -94.102.223.0 - 94.102.223.31 at -94.102.223.32 - 94.102.223.255 de +94.102.208.0 - 94.102.223.255 de 94.102.224.0 - 94.102.239.255 me 94.102.240.0 - 94.102.255.255 gb 94.103.0.0 - 94.103.15.255 md -94.103.16.0 - 94.103.18.51 nl -94.103.18.52 - 94.103.18.63 us -94.103.18.64 - 94.103.18.79 nl -94.103.18.80 - 94.103.18.95 ru -94.103.18.96 - 94.103.18.111 us -94.103.18.112 - 94.103.18.119 nl -94.103.18.120 - 94.103.18.123 us -94.103.18.124 - 94.103.20.31 nl -94.103.20.32 - 94.103.20.39 us -94.103.20.40 - 94.103.20.79 nl -94.103.20.80 - 94.103.20.95 us -94.103.20.96 - 94.103.20.103 nl -94.103.20.104 - 94.103.20.111 de -94.103.20.112 - 94.103.25.255 nl -94.103.26.0 - 94.103.26.47 us -94.103.26.48 - 94.103.26.175 nl -94.103.26.176 - 94.103.26.183 us -94.103.26.184 - 94.103.27.255 nl -94.103.28.0 - 94.103.28.31 de -94.103.28.32 - 94.103.28.47 us -94.103.28.48 - 94.103.28.127 nl -94.103.28.128 - 94.103.28.255 us -94.103.29.0 - 94.103.29.255 gb -94.103.30.0 - 94.103.30.63 de -94.103.30.64 - 94.103.31.255 nl -94.103.32.0 - 94.103.40.255 tr -94.103.41.0 - 94.103.41.128 gb -94.103.41.129 - 94.103.47.255 tr +94.103.16.0 - 94.103.30.159 nl +94.103.30.160 - 94.103.30.175 gb +94.103.30.176 - 94.103.31.255 nl +94.103.32.0 - 94.103.47.255 tr 94.103.48.0 - 94.103.63.255 lv 94.103.64.0 - 94.103.79.255 si 94.103.80.0 - 94.103.95.255 ru 94.103.96.0 - 94.103.111.255 ch -94.103.112.0 - 94.103.127.255 gb 94.103.128.0 - 94.103.143.255 fr -94.103.144.0 - 94.103.145.95 nl -94.103.145.96 - 94.103.145.111 be -94.103.145.112 - 94.103.156.191 nl -94.103.156.192 - 94.103.156.255 be -94.103.157.0 - 94.103.157.31 nl -94.103.157.32 - 94.103.157.95 be -94.103.157.96 - 94.103.159.255 nl -94.103.160.0 - 94.103.164.255 de -94.103.165.0 - 94.103.165.191 at -94.103.165.192 - 94.103.165.199 de -94.103.165.200 - 94.103.165.207 at -94.103.165.208 - 94.103.165.247 de -94.103.165.248 - 94.103.165.255 at -94.103.166.0 - 94.103.175.255 de +94.103.144.0 - 94.103.159.255 nl +94.103.160.0 - 94.103.175.255 de 94.103.176.0 - 94.103.191.255 ru 94.103.192.0 - 94.103.207.255 se 94.103.208.0 - 94.103.223.255 lu 94.103.224.0 - 94.103.239.255 ru 94.103.240.0 - 94.103.255.255 kz 94.104.0.0 - 94.111.255.255 be -94.112.0.0 - 94.115.255.255 cz -94.116.0.0 - 94.118.255.255 gb -94.119.0.0 - 94.119.7.255 de -94.119.8.0 - 94.119.255.255 gb +94.112.0.0 - 94.113.255.255 cz +94.114.0.0 - 94.115.255.255 de +94.116.0.0 - 94.119.1.10 gb +94.119.1.11 - 94.119.1.11 de +94.119.1.12 - 94.119.255.255 gb 94.120.0.0 - 94.123.255.255 tr 94.124.0.0 - 94.124.23.255 pl 94.124.24.0 - 94.124.31.255 es @@ -60827,21 +35228,21 @@ 94.124.56.0 - 94.124.63.255 nl 94.124.64.0 - 94.124.79.255 it 94.124.80.0 - 94.124.87.255 fr -94.124.88.0 - 94.124.97.255 nl -94.124.98.0 - 94.124.98.255 iq -94.124.99.0 - 94.124.99.255 ir -94.124.100.0 - 94.124.103.255 nl +94.124.88.0 - 94.124.95.255 nl 94.124.104.0 - 94.124.111.255 cz 94.124.112.0 - 94.124.115.255 gb 94.124.116.0 - 94.124.127.255 nl 94.124.128.0 - 94.124.135.255 fr 94.124.136.0 - 94.124.143.255 nl 94.124.144.0 - 94.124.151.255 sk -94.124.152.0 - 94.124.159.255 fr -94.124.160.0 - 94.124.167.255 ua -94.124.168.0 - 94.124.181.255 ru -94.124.182.0 - 94.124.182.255 nl -94.124.183.0 - 94.124.183.255 ru +94.124.152.0 - 94.124.152.255 mq +94.124.153.0 - 94.124.153.255 fr +94.124.154.0 - 94.124.154.255 yt +94.124.155.0 - 94.124.159.255 fr +94.124.160.0 - 94.124.164.255 ua +94.124.165.0 - 94.124.165.255 ru +94.124.166.0 - 94.124.167.255 ua +94.124.168.0 - 94.124.183.255 ru 94.124.184.0 - 94.124.191.255 cz 94.124.192.0 - 94.124.207.255 ru 94.124.208.0 - 94.124.215.255 de @@ -60857,13 +35258,7 @@ 94.125.32.0 - 94.125.39.255 gb 94.125.40.0 - 94.125.55.255 ru 94.125.56.0 - 94.125.59.255 mt -94.125.60.0 - 94.125.60.31 fr -94.125.60.32 - 94.125.60.63 im -94.125.60.64 - 94.125.61.191 fr -94.125.61.192 - 94.125.61.255 im -94.125.62.0 - 94.125.62.95 mt -94.125.62.96 - 94.125.62.111 ma -94.125.62.112 - 94.125.63.255 mt +94.125.60.0 - 94.125.63.255 im 94.125.64.0 - 94.125.79.255 de 94.125.80.0 - 94.125.87.255 it 94.125.88.0 - 94.125.95.255 ru @@ -60899,9 +35294,7 @@ 94.126.80.0 - 94.126.87.255 se 94.126.88.0 - 94.126.95.255 ru 94.126.96.0 - 94.126.103.255 at -94.126.104.0 - 94.126.107.79 gb -94.126.107.80 - 94.126.107.87 de -94.126.107.88 - 94.126.111.255 gb +94.126.104.0 - 94.126.111.255 gb 94.126.112.0 - 94.126.119.255 fr 94.126.120.0 - 94.126.127.255 gb 94.126.128.0 - 94.126.135.255 ch @@ -60911,9 +35304,7 @@ 94.126.160.0 - 94.126.167.255 fi 94.126.168.0 - 94.126.175.255 pt 94.126.176.0 - 94.126.183.255 dk -94.126.184.0 - 94.126.185.255 it -94.126.186.0 - 94.126.186.95 es -94.126.186.96 - 94.126.191.255 it +94.126.184.0 - 94.126.191.255 it 94.126.192.0 - 94.126.199.255 gb 94.126.200.0 - 94.126.207.255 ru 94.126.208.0 - 94.126.215.255 gb @@ -60921,8 +35312,7 @@ 94.126.232.0 - 94.126.239.255 gb 94.126.240.0 - 94.126.247.255 es 94.126.248.0 - 94.126.255.255 ch -94.127.0.0 - 94.127.3.255 rs -94.127.4.0 - 94.127.7.255 gb +94.127.0.0 - 94.127.7.255 rs 94.127.8.0 - 94.127.15.255 fr 94.127.16.0 - 94.127.23.255 de 94.127.24.0 - 94.127.31.255 si @@ -60931,12 +35321,9 @@ 94.127.48.0 - 94.127.55.255 dk 94.127.56.0 - 94.127.63.255 no 94.127.64.0 - 94.127.71.255 ru -94.127.72.0 - 94.127.72.255 nl -94.127.73.0 - 94.127.73.255 il -94.127.74.0 - 94.127.74.255 gb -94.127.75.0 - 94.127.75.255 fr +94.127.72.0 - 94.127.75.255 eu 94.127.76.0 - 94.127.76.255 de -94.127.77.0 - 94.127.77.255 nl +94.127.77.0 - 94.127.77.255 eu 94.127.78.0 - 94.127.78.255 de 94.127.79.0 - 94.127.79.255 gb 94.127.80.0 - 94.127.87.255 it @@ -60957,42 +35344,13 @@ 94.127.232.0 - 94.127.239.255 it 94.127.240.0 - 94.127.255.255 ru 94.128.0.0 - 94.129.255.255 kw -94.130.0.0 - 94.131.255.255 ua +94.130.0.0 - 94.130.255.255 ua +94.131.0.0 - 94.131.255.255 ru 94.132.0.0 - 94.133.255.255 pt 94.134.0.0 - 94.135.255.255 de 94.136.0.0 - 94.136.31.255 at 94.136.32.0 - 94.136.63.255 gb -94.136.64.0 - 94.136.65.255 se -94.136.66.0 - 94.136.66.7 it -94.136.66.8 - 94.136.66.23 se -94.136.66.24 - 94.136.66.27 us -94.136.66.28 - 94.136.66.255 se -94.136.67.0 - 94.136.67.7 de -94.136.67.8 - 94.136.67.127 se -94.136.67.128 - 94.136.67.131 us -94.136.67.132 - 94.136.69.63 se -94.136.69.64 - 94.136.69.67 us -94.136.69.68 - 94.136.70.187 se -94.136.70.188 - 94.136.70.191 us -94.136.70.192 - 94.136.75.255 se -94.136.76.0 - 94.136.76.3 us -94.136.76.4 - 94.136.76.191 se -94.136.76.192 - 94.136.76.195 us -94.136.76.196 - 94.136.76.255 se -94.136.77.0 - 94.136.77.3 us -94.136.77.4 - 94.136.77.255 se -94.136.78.0 - 94.136.78.3 us -94.136.78.4 - 94.136.80.3 se -94.136.80.4 - 94.136.80.7 us -94.136.80.8 - 94.136.80.47 se -94.136.80.48 - 94.136.80.51 ru -94.136.80.52 - 94.136.80.255 se -94.136.81.0 - 94.136.81.3 us -94.136.81.4 - 94.136.91.47 se -94.136.91.48 - 94.136.91.51 my -94.136.91.52 - 94.136.95.127 se -94.136.95.128 - 94.136.95.131 us -94.136.95.132 - 94.136.95.255 se +94.136.64.0 - 94.136.95.255 se 94.136.96.0 - 94.136.127.255 at 94.136.128.0 - 94.136.159.255 sk 94.136.160.0 - 94.136.191.255 de @@ -61000,14 +35358,13 @@ 94.136.224.0 - 94.136.255.255 gb 94.137.0.0 - 94.137.95.255 ru 94.137.96.0 - 94.137.127.255 se -94.137.128.0 - 94.137.159.255 de +94.137.128.0 - 94.137.143.255 dk +94.137.144.0 - 94.137.159.255 de 94.137.160.0 - 94.137.191.255 ge 94.137.192.0 - 94.138.31.255 ru 94.138.32.0 - 94.138.63.255 it 94.138.64.0 - 94.138.95.255 dk -94.138.96.0 - 94.138.101.255 cz -94.138.102.0 - 94.138.102.255 sk -94.138.103.0 - 94.138.127.255 cz +94.138.96.0 - 94.138.127.255 cz 94.138.128.0 - 94.138.159.255 ru 94.138.160.0 - 94.138.191.255 it 94.138.192.0 - 94.138.223.255 tr @@ -61021,13 +35378,11 @@ 94.139.192.0 - 94.139.223.255 bg 94.139.224.0 - 94.139.255.255 ru 94.140.0.0 - 94.140.31.255 fr -94.140.32.0 - 94.140.37.167 se -94.140.37.168 - 94.140.37.175 dk -94.140.37.176 - 94.140.40.195 se -94.140.40.196 - 94.140.40.203 no -94.140.40.204 - 94.140.63.255 se +94.140.32.0 - 94.140.63.255 se 94.140.64.0 - 94.140.95.255 si -94.140.96.0 - 94.140.127.255 eu +94.140.96.0 - 94.140.121.255 eu +94.140.122.0 - 94.140.122.255 lv +94.140.123.0 - 94.140.127.255 eu 94.140.128.0 - 94.140.159.255 ru 94.140.160.0 - 94.140.191.255 be 94.140.192.0 - 94.140.255.255 ru @@ -61039,22 +35394,21 @@ 94.141.160.0 - 94.141.191.255 ru 94.141.192.0 - 94.141.223.255 sy 94.141.224.0 - 94.142.31.255 ru -94.142.32.0 - 94.142.63.255 jo +94.142.32.0 - 94.142.32.255 jo +94.142.33.0 - 94.142.33.138 us +94.142.33.139 - 94.142.33.139 jo +94.142.33.140 - 94.142.33.255 us +94.142.34.0 - 94.142.63.255 jo 94.142.64.0 - 94.142.95.255 gb -94.142.96.0 - 94.142.127.255 es -94.142.128.0 - 94.142.135.255 lv +94.142.96.0 - 94.142.97.255 es +94.142.98.0 - 94.142.98.255 us +94.142.99.0 - 94.142.127.255 es 94.142.136.0 - 94.142.143.255 ru 94.142.144.0 - 94.142.151.255 it 94.142.152.0 - 94.142.159.255 is 94.142.160.0 - 94.142.167.255 at 94.142.168.0 - 94.142.175.255 gb -94.142.176.0 - 94.142.183.255 it -94.142.184.0 - 94.142.184.255 gb -94.142.185.0 - 94.142.186.255 us -94.142.187.0 - 94.142.187.255 hk -94.142.188.0 - 94.142.188.255 gb -94.142.189.0 - 94.142.189.255 us -94.142.190.0 - 94.142.191.255 gb +94.142.184.0 - 94.142.191.255 gb 94.142.192.0 - 94.142.199.255 it 94.142.200.0 - 94.142.202.127 es 94.142.202.128 - 94.142.207.255 ad @@ -61063,11 +35417,9 @@ 94.142.224.0 - 94.142.231.255 se 94.142.232.0 - 94.142.239.255 cz 94.142.240.0 - 94.142.247.255 nl -94.142.248.0 - 94.142.248.255 ch -94.142.249.0 - 94.142.255.255 fr -94.143.0.0 - 94.143.7.255 ch +94.142.248.0 - 94.143.7.255 ch 94.143.8.0 - 94.143.15.255 dk -94.143.16.0 - 94.143.23.255 be +94.143.16.0 - 94.143.23.255 fr 94.143.24.0 - 94.143.31.255 es 94.143.32.0 - 94.143.63.255 ru 94.143.64.0 - 94.143.71.255 no @@ -61082,7 +35434,6 @@ 94.143.136.0 - 94.143.143.255 es 94.143.144.0 - 94.143.151.255 ru 94.143.152.0 - 94.143.159.255 it -94.143.160.0 - 94.143.167.255 gb 94.143.168.0 - 94.143.175.255 cz 94.143.176.0 - 94.143.183.255 gr 94.143.184.0 - 94.143.191.255 be @@ -61100,7 +35451,7 @@ 94.154.0.0 - 94.154.15.255 ru 94.154.16.0 - 94.154.31.255 pl 94.154.32.0 - 94.154.47.255 ua -94.154.48.0 - 94.154.55.255 de +94.154.48.0 - 94.154.55.255 eu 94.154.56.0 - 94.154.63.255 pl 94.154.64.0 - 94.154.95.255 ru 94.154.96.0 - 94.154.103.255 pl @@ -61108,10 +35459,12 @@ 94.154.112.0 - 94.154.127.255 ua 94.154.128.0 - 94.154.191.255 ru 94.154.192.0 - 94.154.255.255 ua -94.155.0.0 - 94.156.255.255 bg +94.155.0.0 - 94.156.171.255 bg +94.156.172.0 - 94.156.175.255 gr +94.156.176.0 - 94.156.255.255 bg 94.157.0.0 - 94.157.255.255 nl 94.158.0.0 - 94.158.15.255 ru -94.158.16.0 - 94.158.47.255 ua +94.158.32.0 - 94.158.47.255 ua 94.158.48.0 - 94.158.63.255 uz 94.158.64.0 - 94.158.95.255 ua 94.158.96.0 - 94.158.127.255 ru @@ -61119,32 +35472,74 @@ 94.158.144.0 - 94.158.159.255 ua 94.158.160.0 - 94.158.223.255 ru 94.158.224.0 - 94.158.239.255 pl -94.158.240.0 - 94.158.255.255 ua 94.159.0.0 - 94.159.127.255 ru 94.159.128.0 - 94.159.255.255 il 94.160.0.0 - 94.167.255.255 it -94.168.0.0 - 94.175.255.255 gb -94.176.0.0 - 94.176.111.255 ro -94.176.112.0 - 94.176.127.255 md -94.176.128.0 - 94.177.47.255 ro -94.177.48.0 - 94.177.63.255 md -94.177.64.0 - 94.177.121.255 ro -94.177.122.0 - 94.177.123.255 de -94.177.124.0 - 94.177.255.255 ro +94.168.0.0 - 94.169.2.255 nl +94.169.3.0 - 94.169.3.255 gb +94.169.4.0 - 94.169.255.255 nl +94.170.0.0 - 94.175.255.255 gb +94.176.0.0 - 94.176.3.255 ro +94.176.4.0 - 94.176.4.255 md +94.176.5.0 - 94.176.7.255 ro +94.176.8.0 - 94.176.39.255 ir +94.176.40.0 - 94.176.47.255 ro +94.176.48.0 - 94.176.63.255 ir +94.176.64.0 - 94.176.79.255 md +94.176.80.0 - 94.176.95.255 ir +94.176.96.0 - 94.176.105.255 ro +94.176.106.0 - 94.176.107.255 sg +94.176.108.0 - 94.176.139.255 ro +94.176.140.0 - 94.176.140.255 es +94.176.141.0 - 94.176.175.255 ro +94.176.176.0 - 94.176.179.255 es +94.176.180.0 - 94.176.190.255 ro +94.176.191.0 - 94.176.191.255 gb +94.176.192.0 - 94.176.199.255 es +94.176.200.0 - 94.176.223.255 ro +94.176.224.0 - 94.176.231.255 se +94.176.232.0 - 94.176.232.127 nl +94.176.232.128 - 94.176.239.255 ro +94.176.240.0 - 94.176.255.255 de +94.177.0.0 - 94.177.3.255 ro +94.177.4.0 - 94.177.5.255 gb +94.177.6.0 - 94.177.11.255 ro +94.177.12.0 - 94.177.12.255 nl +94.177.13.0 - 94.177.21.255 ro +94.177.22.0 - 94.177.22.255 gb +94.177.23.0 - 94.177.23.255 ro +94.177.24.0 - 94.177.24.255 th +94.177.25.0 - 94.177.25.255 vg +94.177.26.0 - 94.177.59.255 ro +94.177.60.0 - 94.177.63.255 md +94.177.64.0 - 94.177.71.255 ro +94.177.72.0 - 94.177.79.255 ir +94.177.80.0 - 94.177.103.255 ro +94.177.104.0 - 94.177.104.255 th +94.177.105.0 - 94.177.105.255 vg +94.177.106.0 - 94.177.122.255 ro +94.177.123.0 - 94.177.123.255 ru +94.177.124.0 - 94.177.126.255 gb +94.177.127.0 - 94.177.127.255 ro +94.177.128.0 - 94.177.135.255 pl +94.177.136.0 - 94.177.159.255 ro +94.177.160.0 - 94.177.239.255 it +94.177.240.0 - 94.177.251.255 ro +94.177.252.0 - 94.177.255.255 it 94.178.0.0 - 94.179.255.255 ua 94.180.0.0 - 94.181.255.255 ru 94.182.0.0 - 94.184.255.255 ir 94.185.0.0 - 94.185.63.255 om 94.185.64.0 - 94.185.71.255 fr 94.185.72.0 - 94.185.79.255 it -94.185.80.0 - 94.185.82.255 se -94.185.83.0 - 94.185.83.255 nl -94.185.84.0 - 94.185.84.255 se -94.185.85.0 - 94.185.87.255 nl +94.185.80.0 - 94.185.87.255 se 94.185.88.0 - 94.185.95.255 de 94.185.96.0 - 94.185.127.255 it 94.185.128.0 - 94.185.255.255 gb -94.186.0.0 - 94.186.127.255 no +94.186.0.0 - 94.186.31.255 no +94.186.32.0 - 94.186.39.255 se +94.186.40.0 - 94.186.63.255 lv +94.186.64.0 - 94.186.127.255 nl 94.186.128.0 - 94.186.255.255 de 94.187.0.0 - 94.187.127.255 lb 94.187.128.0 - 94.187.255.255 kw @@ -61155,9 +35550,8 @@ 94.190.0.0 - 94.190.127.255 ru 94.190.128.0 - 94.190.255.255 bg 94.191.0.0 - 94.191.127.255 ru -94.191.128.0 - 94.191.143.255 dk -94.191.144.0 - 94.191.175.255 se -94.191.176.0 - 94.191.255.255 dk +94.191.128.0 - 94.191.183.255 se +94.191.184.0 - 94.191.255.255 dk 94.192.0.0 - 94.197.255.255 gb 94.198.0.0 - 94.198.7.255 ru 94.198.8.0 - 94.198.15.255 gb @@ -61169,10 +35563,7 @@ 94.198.72.0 - 94.198.79.255 it 94.198.80.0 - 94.198.87.255 gb 94.198.88.0 - 94.198.95.255 es -94.198.96.0 - 94.198.100.191 it -94.198.100.192 - 94.198.100.223 ch -94.198.100.224 - 94.198.102.255 it -94.198.103.0 - 94.198.103.255 us +94.198.96.0 - 94.198.103.255 it 94.198.104.0 - 94.198.111.255 ru 94.198.112.0 - 94.198.119.255 cz 94.198.120.0 - 94.198.127.255 ie @@ -61180,11 +35571,11 @@ 94.198.136.0 - 94.198.143.255 at 94.198.144.0 - 94.198.151.255 fr 94.198.152.0 - 94.198.159.255 nl -94.198.160.0 - 94.198.167.63 be -94.198.167.64 - 94.198.167.95 nl -94.198.167.96 - 94.198.167.255 be +94.198.160.0 - 94.198.167.255 be 94.198.168.0 - 94.198.175.255 gb -94.198.176.0 - 94.198.183.255 fr +94.198.176.0 - 94.198.176.255 mq +94.198.177.0 - 94.198.179.255 gp +94.198.180.0 - 94.198.183.255 mq 94.198.184.0 - 94.198.191.255 gb 94.198.192.0 - 94.198.199.255 ru 94.198.200.0 - 94.198.207.255 fr @@ -61205,13 +35596,10 @@ 94.199.64.0 - 94.199.79.255 ru 94.199.80.0 - 94.199.87.255 it 94.199.88.0 - 94.199.95.255 de -94.199.96.0 - 94.199.103.255 ch 94.199.104.0 - 94.199.111.255 ru 94.199.112.0 - 94.199.119.255 fi 94.199.120.0 - 94.199.127.255 fr -94.199.128.0 - 94.199.128.255 de -94.199.129.0 - 94.199.135.255 gb -94.199.136.0 - 94.199.143.255 es +94.199.128.0 - 94.199.135.255 gb 94.199.144.0 - 94.199.151.255 gb 94.199.152.0 - 94.199.159.255 fr 94.199.160.0 - 94.199.167.255 ua @@ -61221,15 +35609,10 @@ 94.199.192.0 - 94.199.199.255 cz 94.199.200.0 - 94.199.207.255 tr 94.199.208.0 - 94.199.223.255 ru -94.199.224.0 - 94.199.224.159 ie -94.199.224.160 - 94.199.225.255 gb -94.199.226.0 - 94.199.226.127 ie -94.199.226.128 - 94.199.239.255 gb +94.199.224.0 - 94.199.239.255 gb 94.199.240.0 - 94.199.247.255 de 94.199.248.0 - 94.199.255.255 nl -94.200.0.0 - 94.200.44.63 ae -94.200.44.64 - 94.200.44.95 a2 -94.200.44.96 - 94.207.255.255 ae +94.200.0.0 - 94.207.255.255 ae 94.208.0.0 - 94.215.255.255 nl 94.216.0.0 - 94.223.255.255 de 94.224.0.0 - 94.227.255.255 be @@ -61244,48 +35627,25 @@ 94.228.128.0 - 94.228.143.255 nl 94.228.144.0 - 94.228.159.255 ch 94.228.160.0 - 94.228.175.255 ru -94.228.176.0 - 94.228.191.255 fr +94.228.176.0 - 94.228.176.27 fr +94.228.176.28 - 94.228.176.31 gb +94.228.176.32 - 94.228.178.27 fr +94.228.178.28 - 94.228.178.31 gb +94.228.178.32 - 94.228.191.255 fr 94.228.192.0 - 94.228.207.255 ru -94.228.208.0 - 94.228.209.255 nl -94.228.210.0 - 94.228.210.255 ae -94.228.211.0 - 94.228.211.255 nl -94.228.212.0 - 94.228.213.255 ae -94.228.214.0 - 94.228.223.23 nl -94.228.223.24 - 94.228.223.31 in -94.228.223.32 - 94.228.223.255 nl +94.228.208.0 - 94.228.223.255 nl 94.228.224.0 - 94.228.239.255 rs 94.228.240.0 - 94.228.255.255 ru -94.229.0.0 - 94.229.5.255 us -94.229.6.0 - 94.229.6.127 no -94.229.6.128 - 94.229.6.255 cy -94.229.7.0 - 94.229.7.255 nl -94.229.8.0 - 94.229.9.255 us -94.229.10.0 - 94.229.10.255 cy -94.229.11.0 - 94.229.11.31 us -94.229.11.32 - 94.229.11.63 nl -94.229.11.64 - 94.229.11.95 us -94.229.11.96 - 94.229.11.127 cy -94.229.11.128 - 94.229.11.223 us -94.229.11.224 - 94.229.11.255 cy -94.229.12.0 - 94.229.12.15 ru -94.229.12.16 - 94.229.12.127 cy -94.229.12.128 - 94.229.12.255 ru -94.229.13.0 - 94.229.13.31 us -94.229.13.32 - 94.229.13.255 cy -94.229.14.0 - 94.229.14.79 nl -94.229.14.80 - 94.229.14.95 cy -94.229.14.96 - 94.229.14.127 nl -94.229.14.128 - 94.229.14.207 cy -94.229.14.208 - 94.229.14.255 nl -94.229.15.0 - 94.229.31.255 ru +94.229.0.0 - 94.229.1.255 cy +94.229.2.0 - 94.229.5.255 us +94.229.6.0 - 94.229.15.255 cy +94.229.16.0 - 94.229.31.255 ru 94.229.32.0 - 94.229.47.255 sk 94.229.48.0 - 94.229.63.255 nl 94.229.64.0 - 94.229.79.255 gb -94.229.80.0 - 94.229.82.39 cz -94.229.82.40 - 94.229.82.47 pl -94.229.82.48 - 94.229.82.255 cz -94.229.83.0 - 94.229.86.127 pl -94.229.86.128 - 94.229.95.255 cz +94.229.80.0 - 94.229.83.255 cz +94.229.84.0 - 94.229.85.255 pl +94.229.86.0 - 94.229.95.255 cz 94.229.96.0 - 94.229.111.255 ru 94.229.112.0 - 94.229.127.255 rs 94.229.128.0 - 94.229.143.255 gb @@ -61318,10 +35678,12 @@ 94.231.96.0 - 94.231.111.255 dk 94.231.112.0 - 94.231.175.255 ru 94.231.176.0 - 94.231.191.255 ua -94.231.192.0 - 94.231.223.255 ru +94.231.192.0 - 94.231.207.255 ru 94.231.224.0 - 94.231.239.255 pl 94.231.240.0 - 94.231.255.255 nl -94.232.0.0 - 94.232.31.255 ru +94.232.0.0 - 94.232.23.255 ru +94.232.24.0 - 94.232.27.255 uz +94.232.28.0 - 94.232.31.255 ru 94.232.32.0 - 94.232.39.255 pl 94.232.40.0 - 94.232.71.255 ru 94.232.72.0 - 94.232.79.255 ua @@ -61343,16 +35705,14 @@ 94.232.216.0 - 94.232.223.255 pl 94.232.224.0 - 94.232.231.255 lt 94.232.232.0 - 94.232.239.255 ru -94.232.240.0 - 94.232.247.255 kz -94.232.248.0 - 94.232.255.255 ua 94.233.0.0 - 94.233.255.255 ru 94.234.0.0 - 94.234.255.255 se 94.235.0.0 - 94.235.255.255 tr -94.236.0.0 - 94.236.60.255 gb -94.236.61.0 - 94.236.61.7 a2 -94.236.61.8 - 94.236.127.255 gb +94.236.0.0 - 94.236.127.255 gb 94.236.128.0 - 94.236.255.255 bg -94.237.0.0 - 94.237.127.255 fi +94.237.0.0 - 94.237.15.255 fi +94.237.16.0 - 94.237.31.255 de +94.237.32.0 - 94.237.127.255 fi 94.237.128.0 - 94.237.255.255 ru 94.238.0.0 - 94.239.255.255 fr 94.240.0.0 - 94.240.63.255 pl @@ -61373,45 +35733,39 @@ 94.244.64.0 - 94.244.127.255 lt 94.244.128.0 - 94.244.191.255 ua 94.244.192.0 - 94.244.255.255 ch -94.245.0.0 - 94.245.31.255 dk -94.245.32.0 - 94.245.63.255 se -94.245.64.0 - 94.245.127.255 gb +94.245.0.0 - 94.245.63.255 se +94.245.64.0 - 94.245.64.15 ch +94.245.64.16 - 94.245.64.31 se +94.245.64.32 - 94.245.75.255 gb +94.245.76.0 - 94.245.77.255 at +94.245.78.0 - 94.245.78.255 gb +94.245.79.0 - 94.245.79.15 se +94.245.79.16 - 94.245.80.255 gb +94.245.81.0 - 94.245.81.255 ie +94.245.82.0 - 94.245.85.255 gb +94.245.86.0 - 94.245.86.255 ie +94.245.87.0 - 94.245.87.255 eu +94.245.88.0 - 94.245.95.255 ie +94.245.96.0 - 94.245.99.255 nl +94.245.100.0 - 94.245.100.127 ie +94.245.100.128 - 94.245.100.255 nl +94.245.101.0 - 94.245.126.255 ie +94.245.127.0 - 94.245.127.255 eu 94.245.128.0 - 94.245.191.255 ru 94.245.192.0 - 94.245.255.255 at 94.246.0.0 - 94.246.63.255 no -94.246.64.0 - 94.246.87.255 se -94.246.88.0 - 94.246.88.127 no -94.246.88.128 - 94.246.90.255 se -94.246.91.0 - 94.246.91.31 no -94.246.91.32 - 94.246.93.119 se -94.246.93.120 - 94.246.93.127 fi -94.246.93.128 - 94.246.93.191 se -94.246.93.192 - 94.246.93.255 fi -94.246.94.0 - 94.246.99.63 se -94.246.99.64 - 94.246.99.127 dk -94.246.99.128 - 94.246.101.67 se -94.246.101.68 - 94.246.101.79 dk -94.246.101.80 - 94.246.101.87 fi -94.246.101.88 - 94.246.101.95 gb -94.246.101.96 - 94.246.101.207 se -94.246.101.208 - 94.246.101.215 fi -94.246.101.216 - 94.246.113.63 se -94.246.113.64 - 94.246.113.67 gr -94.246.113.68 - 94.246.113.71 hu -94.246.113.72 - 94.246.113.75 fi -94.246.113.76 - 94.246.113.79 ch -94.246.113.80 - 94.246.119.255 se -94.246.120.0 - 94.246.121.255 no -94.246.122.0 - 94.246.125.255 se -94.246.126.0 - 94.246.127.255 no +94.246.64.0 - 94.246.89.159 se +94.246.89.160 - 94.246.89.191 fi +94.246.89.192 - 94.246.103.255 se +94.246.104.0 - 94.246.104.255 fi +94.246.105.0 - 94.246.127.255 se 94.246.128.0 - 94.246.191.255 pl 94.246.192.0 - 94.246.255.255 ee 94.247.0.0 - 94.247.7.255 nl 94.247.8.0 - 94.247.15.255 it 94.247.16.0 - 94.247.23.255 ru -94.247.24.0 - 94.247.25.63 fr -94.247.25.64 - 94.247.25.96 gb -94.247.25.97 - 94.247.31.255 fr +94.247.24.0 - 94.247.30.255 fr +94.247.31.0 - 94.247.31.255 es 94.247.32.0 - 94.247.39.255 cz 94.247.40.0 - 94.247.47.255 de 94.247.48.0 - 94.247.55.255 ie @@ -61425,7 +35779,6 @@ 94.247.112.0 - 94.247.119.255 de 94.247.120.0 - 94.247.127.255 ru 94.247.128.0 - 94.247.135.255 kz -94.247.136.0 - 94.247.143.255 ee 94.247.144.0 - 94.247.151.255 at 94.247.152.0 - 94.247.159.255 gb 94.247.160.0 - 94.247.167.255 fr @@ -61442,9 +35795,33 @@ 94.248.0.0 - 94.248.127.255 ua 94.248.128.0 - 94.248.255.255 hu 94.249.0.0 - 94.249.127.255 jo -94.249.128.0 - 94.249.255.255 de +94.249.128.0 - 94.249.137.255 de +94.249.138.0 - 94.249.138.255 gb +94.249.139.0 - 94.249.172.255 de +94.249.173.0 - 94.249.173.255 gb +94.249.174.0 - 94.249.174.255 fr +94.249.175.0 - 94.249.175.255 gb +94.249.176.0 - 94.249.178.255 de +94.249.179.0 - 94.249.179.255 gb +94.249.180.0 - 94.249.181.255 de +94.249.182.0 - 94.249.182.63 us +94.249.182.64 - 94.249.182.79 de +94.249.182.80 - 94.249.182.255 us +94.249.183.0 - 94.249.212.127 de +94.249.212.128 - 94.249.212.255 gb +94.249.213.0 - 94.249.241.255 de +94.249.242.0 - 94.249.242.127 us +94.249.242.128 - 94.249.242.143 de +94.249.242.144 - 94.249.242.255 us +94.249.243.0 - 94.249.250.255 de +94.249.251.0 - 94.249.251.255 ru +94.249.252.0 - 94.249.255.255 de 94.250.0.0 - 94.250.127.255 ba -94.250.128.0 - 94.251.127.255 ru +94.250.128.0 - 94.250.191.255 hr +94.250.192.0 - 94.250.223.255 de +94.250.224.0 - 94.250.239.255 gb +94.250.240.0 - 94.250.247.255 cz +94.250.248.0 - 94.251.127.255 ru 94.251.128.0 - 94.251.255.255 pl 94.252.0.0 - 94.252.127.255 lu 94.252.128.0 - 94.252.255.255 sy @@ -61467,7 +35844,98 @@ 95.40.0.0 - 95.41.255.255 pl 95.42.0.0 - 95.43.255.255 bg 95.44.0.0 - 95.45.255.255 ie -95.46.0.0 - 95.47.255.255 cz +95.46.0.0 - 95.46.1.255 cz +95.46.2.0 - 95.46.3.255 ua +95.46.4.0 - 95.46.4.255 ru +95.46.5.0 - 95.46.5.255 cz +95.46.6.0 - 95.46.6.255 ua +95.46.7.0 - 95.46.7.255 lv +95.46.8.0 - 95.46.15.255 ua +95.46.16.0 - 95.46.31.255 by +95.46.32.0 - 95.46.33.255 cz +95.46.34.0 - 95.46.35.255 ru +95.46.36.0 - 95.46.47.255 cz +95.46.48.0 - 95.46.103.255 ru +95.46.104.0 - 95.46.104.255 cz +95.46.105.0 - 95.46.105.255 ru +95.46.106.0 - 95.46.107.255 cz +95.46.108.0 - 95.46.113.255 ru +95.46.114.0 - 95.46.115.255 cz +95.46.116.0 - 95.46.119.255 ru +95.46.120.0 - 95.46.121.255 ua +95.46.122.0 - 95.46.123.255 cz +95.46.124.0 - 95.46.139.255 ru +95.46.140.0 - 95.46.141.255 ua +95.46.142.0 - 95.46.144.255 ru +95.46.145.0 - 95.46.145.255 kz +95.46.146.0 - 95.46.147.255 ua +95.46.148.0 - 95.46.151.255 ru +95.46.152.0 - 95.46.153.255 kz +95.46.154.0 - 95.46.154.255 cz +95.46.155.0 - 95.46.155.255 ua +95.46.156.0 - 95.46.157.255 ru +95.46.158.0 - 95.46.158.255 cz +95.46.159.0 - 95.46.195.255 ru +95.46.196.0 - 95.46.196.255 cz +95.46.197.0 - 95.46.197.255 ru +95.46.198.0 - 95.46.199.255 nl +95.46.200.0 - 95.46.223.255 by +95.46.224.0 - 95.46.231.255 ru +95.46.232.0 - 95.46.239.255 kz +95.46.240.0 - 95.46.240.255 by +95.46.241.0 - 95.46.255.255 ru +95.47.0.0 - 95.47.31.255 ua +95.47.32.0 - 95.47.39.255 cz +95.47.40.0 - 95.47.63.255 ru +95.47.64.0 - 95.47.96.255 cz +95.47.97.0 - 95.47.97.255 ru +95.47.98.0 - 95.47.98.255 ua +95.47.99.0 - 95.47.99.255 by +95.47.100.0 - 95.47.103.255 ru +95.47.104.0 - 95.47.115.255 ua +95.47.116.0 - 95.47.117.255 cz +95.47.118.0 - 95.47.123.255 ru +95.47.124.0 - 95.47.127.255 ua +95.47.128.0 - 95.47.135.255 by +95.47.136.0 - 95.47.136.255 ua +95.47.137.0 - 95.47.139.255 cz +95.47.140.0 - 95.47.140.255 ru +95.47.141.0 - 95.47.141.255 nl +95.47.142.0 - 95.47.143.255 ua +95.47.144.0 - 95.47.144.255 ru +95.47.145.0 - 95.47.147.255 cz +95.47.148.0 - 95.47.151.255 ua +95.47.152.0 - 95.47.152.255 ru +95.47.153.0 - 95.47.154.255 cz +95.47.155.0 - 95.47.155.255 ru +95.47.156.0 - 95.47.157.255 cz +95.47.158.0 - 95.47.159.255 ru +95.47.160.0 - 95.47.160.255 cz +95.47.161.0 - 95.47.161.255 ru +95.47.162.0 - 95.47.163.255 ua +95.47.164.0 - 95.47.164.255 ru +95.47.165.0 - 95.47.165.255 cz +95.47.166.0 - 95.47.166.255 ru +95.47.167.0 - 95.47.167.255 ua +95.47.168.0 - 95.47.176.255 ru +95.47.177.0 - 95.47.177.255 cz +95.47.178.0 - 95.47.179.255 sk +95.47.180.0 - 95.47.183.255 ru +95.47.184.0 - 95.47.185.255 am +95.47.186.0 - 95.47.187.255 cz +95.47.188.0 - 95.47.188.255 kz +95.47.189.0 - 95.47.190.255 cz +95.47.191.0 - 95.47.200.255 ru +95.47.201.0 - 95.47.201.255 cz +95.47.202.0 - 95.47.203.255 ru +95.47.204.0 - 95.47.207.255 ua +95.47.208.0 - 95.47.223.255 ba +95.47.224.0 - 95.47.231.255 by +95.47.232.0 - 95.47.232.255 cz +95.47.233.0 - 95.47.244.255 ru +95.47.245.0 - 95.47.247.0 cz +95.47.247.1 - 95.47.247.1 ru +95.47.247.2 - 95.47.255.255 cz 95.48.0.0 - 95.51.255.255 pl 95.52.0.0 - 95.55.255.255 ru 95.56.0.0 - 95.59.255.255 kz @@ -61493,18 +35961,14 @@ 95.80.0.0 - 95.80.63.255 se 95.80.64.0 - 95.80.127.255 ru 95.80.128.0 - 95.80.191.255 ir -95.80.192.0 - 95.80.197.175 cz -95.80.197.176 - 95.80.197.179 ee -95.80.197.180 - 95.80.215.255 cz -95.80.216.0 - 95.80.216.127 sk -95.80.216.128 - 95.80.229.31 cz -95.80.229.32 - 95.80.229.47 sk -95.80.229.48 - 95.80.255.255 cz +95.80.192.0 - 95.80.255.255 cz 95.81.0.0 - 95.81.63.255 ua 95.81.64.0 - 95.81.127.255 ir 95.81.128.0 - 95.81.175.255 fr -95.81.176.0 - 95.81.177.127 de -95.81.177.128 - 95.81.191.255 fr +95.81.176.0 - 95.81.177.255 de +95.81.178.0 - 95.81.179.255 fr +95.81.180.0 - 95.81.180.255 eu +95.81.181.0 - 95.81.191.255 fr 95.81.192.0 - 95.81.255.255 ru 95.82.0.0 - 95.82.127.255 ir 95.82.128.0 - 95.82.191.255 cz @@ -61512,14 +35976,19 @@ 95.83.192.0 - 95.83.255.255 ie 95.84.0.0 - 95.84.63.255 ru 95.84.64.0 - 95.84.127.255 bh -95.84.128.0 - 95.85.127.255 ru +95.84.128.0 - 95.84.255.255 ru +95.85.0.0 - 95.85.63.255 nl +95.85.64.0 - 95.85.95.255 ru +95.85.96.0 - 95.85.127.255 tm 95.85.128.0 - 95.85.191.255 rs 95.85.192.0 - 95.85.255.255 cz 95.86.0.0 - 95.86.63.255 mk 95.86.64.0 - 95.86.127.255 il 95.86.128.0 - 95.86.191.255 az 95.86.192.0 - 95.86.255.255 ru -95.87.0.0 - 95.87.63.255 bg +95.87.0.0 - 95.87.52.255 bg +95.87.53.0 - 95.87.53.255 rs +95.87.54.0 - 95.87.63.255 bg 95.87.64.0 - 95.87.95.255 kg 95.87.96.0 - 95.87.111.255 gb 95.87.112.0 - 95.87.119.255 sy @@ -61545,14 +36014,7 @@ 95.106.0.0 - 95.107.127.255 ru 95.107.128.0 - 95.107.255.255 al 95.108.0.0 - 95.108.127.255 pl -95.108.128.0 - 95.108.194.95 ru -95.108.194.96 - 95.108.194.103 ua -95.108.194.104 - 95.108.194.111 ru -95.108.194.112 - 95.108.194.119 by -95.108.194.120 - 95.108.194.127 kz -95.108.194.128 - 95.108.225.79 ru -95.108.225.80 - 95.108.225.83 tr -95.108.225.84 - 95.108.255.255 ru +95.108.128.0 - 95.108.255.255 ru 95.109.0.0 - 95.109.127.255 se 95.109.128.0 - 95.109.255.255 ua 95.110.0.0 - 95.110.127.255 ru @@ -61567,55 +36029,34 @@ 95.128.23.255 - 95.128.23.255 de 95.128.24.0 - 95.128.31.255 dk 95.128.32.0 - 95.128.39.255 ch -95.128.40.0 - 95.128.40.223 fr -95.128.40.224 - 95.128.40.255 gb -95.128.41.0 - 95.128.41.79 fr -95.128.41.80 - 95.128.41.224 gb -95.128.41.225 - 95.128.42.15 fr -95.128.42.16 - 95.128.42.23 gb -95.128.42.24 - 95.128.42.63 fr -95.128.42.64 - 95.128.42.255 gb -95.128.43.0 - 95.128.43.127 fr -95.128.43.128 - 95.128.44.255 gb -95.128.45.0 - 95.128.45.127 fr -95.128.45.128 - 95.128.45.255 gb -95.128.46.0 - 95.128.46.63 es -95.128.46.64 - 95.128.55.255 gb +95.128.40.0 - 95.128.46.63 fr +95.128.46.64 - 95.128.46.95 es +95.128.46.96 - 95.128.47.255 fr +95.128.48.0 - 95.128.55.255 gb 95.128.56.0 - 95.128.63.255 tr 95.128.64.0 - 95.128.71.255 by -95.128.72.0 - 95.128.77.191 fr -95.128.77.192 - 95.128.77.195 gb -95.128.77.196 - 95.128.79.255 fr +95.128.72.0 - 95.128.79.255 fr 95.128.80.0 - 95.128.87.255 ch 95.128.88.0 - 95.128.95.255 nl 95.128.96.0 - 95.128.103.255 be 95.128.104.0 - 95.128.111.255 no 95.128.112.0 - 95.128.119.255 se -95.128.120.0 - 95.128.120.255 pt -95.128.121.0 - 95.128.121.255 hu -95.128.122.0 - 95.128.122.255 us -95.128.123.0 - 95.128.123.255 pt -95.128.124.0 - 95.128.127.255 hu +95.128.120.0 - 95.128.127.255 lu 95.128.128.0 - 95.128.135.255 gb 95.128.136.0 - 95.128.143.255 ru 95.128.144.0 - 95.128.151.255 fr 95.128.152.0 - 95.128.159.255 es 95.128.160.0 - 95.128.167.255 ru -95.128.168.0 - 95.128.168.63 de -95.128.168.64 - 95.128.168.127 fr -95.128.168.128 - 95.128.168.191 gb -95.128.168.192 - 95.128.168.255 es -95.128.169.0 - 95.128.175.255 ro +95.128.168.0 - 95.128.175.255 ro 95.128.176.0 - 95.128.183.255 ru 95.128.184.0 - 95.128.191.255 mk 95.128.192.0 - 95.128.192.255 fr -95.128.193.0 - 95.128.193.255 gb -95.128.194.0 - 95.128.196.255 in +95.128.193.0 - 95.128.193.0 gb +95.128.193.1 - 95.128.196.255 in 95.128.197.0 - 95.128.197.255 ie -95.128.198.0 - 95.128.198.255 gb -95.128.199.0 - 95.128.201.95 de -95.128.201.96 - 95.128.201.111 ca -95.128.201.112 - 95.128.215.255 de +95.128.198.0 - 95.128.198.0 gb +95.128.198.1 - 95.128.198.255 in +95.128.199.0 - 95.128.215.255 de 95.128.216.0 - 95.128.223.255 gb 95.128.224.0 - 95.128.231.255 ru 95.128.232.0 - 95.128.239.255 hr @@ -61625,12 +36066,8 @@ 95.129.8.0 - 95.129.15.255 sa 95.129.16.0 - 95.129.23.255 gb 95.129.24.0 - 95.129.31.255 nl -95.129.32.0 - 95.129.33.255 il -95.129.34.0 - 95.129.34.63 mt -95.129.34.64 - 95.129.35.255 il -95.129.36.0 - 95.129.37.255 mt -95.129.38.0 - 95.129.39.255 gb -95.129.40.0 - 95.129.47.255 dk +95.129.32.0 - 95.129.39.255 il +95.129.40.0 - 95.129.47.255 gr 95.129.48.0 - 95.129.55.255 de 95.129.56.0 - 95.129.63.255 ru 95.129.64.0 - 95.129.71.255 gb @@ -61640,9 +36077,7 @@ 95.129.96.0 - 95.129.103.255 cz 95.129.104.0 - 95.129.111.255 gb 95.129.112.0 - 95.129.119.255 es -95.129.120.0 - 95.129.128.255 nl -95.129.129.0 - 95.129.129.15 ie -95.129.129.16 - 95.129.135.255 nl +95.129.120.0 - 95.129.135.255 nl 95.129.136.0 - 95.129.151.255 ru 95.129.152.0 - 95.129.159.255 es 95.129.160.0 - 95.129.183.255 ru @@ -61655,7 +36090,6 @@ 95.129.232.0 - 95.129.239.255 ru 95.129.240.0 - 95.129.247.255 cz 95.129.248.0 - 95.129.255.255 es -95.130.0.0 - 95.130.7.255 gb 95.130.8.0 - 95.130.15.255 fr 95.130.16.0 - 95.130.23.255 de 95.130.24.0 - 95.130.31.255 fi @@ -61668,11 +36102,7 @@ 95.130.80.0 - 95.130.87.255 by 95.130.88.0 - 95.130.95.255 ps 95.130.96.0 - 95.130.111.255 gb -95.130.112.0 - 95.130.112.0 eu -95.130.112.1 - 95.130.112.1 de -95.130.112.2 - 95.130.115.255 eu -95.130.116.0 - 95.130.116.255 de -95.130.117.0 - 95.130.119.255 eu +95.130.112.0 - 95.130.119.255 de 95.130.120.0 - 95.130.127.255 at 95.130.128.0 - 95.130.135.255 ru 95.130.136.0 - 95.130.143.255 it @@ -61682,11 +36112,12 @@ 95.130.168.0 - 95.130.175.255 tr 95.130.176.0 - 95.130.183.255 ru 95.130.184.0 - 95.130.191.255 lu -95.130.192.0 - 95.130.199.255 gb +95.130.192.0 - 95.130.196.255 gb +95.130.197.0 - 95.130.197.127 cn +95.130.197.128 - 95.130.199.255 gb 95.130.200.0 - 95.130.207.255 de 95.130.208.0 - 95.130.215.255 dk 95.130.216.0 - 95.130.223.255 no -95.130.224.0 - 95.130.231.255 gb 95.130.232.0 - 95.130.239.255 nl 95.130.240.0 - 95.130.247.255 ir 95.130.248.0 - 95.130.255.255 de @@ -61695,35 +36126,18 @@ 95.131.24.0 - 95.131.31.255 ru 95.131.32.0 - 95.131.39.255 pl 95.131.40.0 - 95.131.47.255 it -95.131.48.0 - 95.131.49.191 hu -95.131.49.192 - 95.131.49.199 cy -95.131.49.200 - 95.131.55.255 hu +95.131.48.0 - 95.131.55.255 hu 95.131.56.0 - 95.131.63.255 it 95.131.64.0 - 95.131.71.255 gb 95.131.72.0 - 95.131.79.255 ru 95.131.80.0 - 95.131.87.255 gb 95.131.88.0 - 95.131.95.255 ru 95.131.96.0 - 95.131.103.255 de -95.131.104.0 - 95.131.105.255 gb -95.131.106.0 - 95.131.107.255 de -95.131.108.0 - 95.131.109.255 nl -95.131.110.0 - 95.131.111.255 gb +95.131.104.0 - 95.131.111.255 gb 95.131.112.0 - 95.131.119.255 lv 95.131.120.0 - 95.131.127.255 de 95.131.128.0 - 95.131.135.255 sk -95.131.136.0 - 95.131.136.138 fr -95.131.136.139 - 95.131.136.139 be -95.131.136.140 - 95.131.137.207 fr -95.131.137.208 - 95.131.137.217 es -95.131.137.218 - 95.131.137.218 de -95.131.137.219 - 95.131.137.219 nl -95.131.137.220 - 95.131.137.220 it -95.131.137.221 - 95.131.137.221 es -95.131.137.222 - 95.131.137.222 pt -95.131.137.223 - 95.131.137.223 es -95.131.137.224 - 95.131.138.111 fr -95.131.138.112 - 95.131.138.119 es -95.131.138.120 - 95.131.143.255 fr +95.131.136.0 - 95.131.143.255 fr 95.131.144.0 - 95.131.151.255 ru 95.131.152.0 - 95.131.159.255 gb 95.131.160.0 - 95.131.175.255 es @@ -61742,10 +36156,14 @@ 95.136.128.0 - 95.136.255.255 fr 95.137.0.0 - 95.137.127.255 ru 95.137.128.0 - 95.137.255.255 ge -95.138.0.0 - 95.138.63.255 fr -95.138.64.0 - 95.138.64.255 mq -95.138.65.0 - 95.138.127.255 fr -95.138.128.0 - 95.139.255.255 ru +95.138.0.0 - 95.138.68.28 mq +95.138.68.29 - 95.138.68.29 re +95.138.68.30 - 95.138.127.255 mq +95.138.128.0 - 95.138.191.255 gb +95.138.192.0 - 95.138.199.255 hu +95.138.200.0 - 95.138.207.255 gb +95.138.208.0 - 95.138.223.255 dk +95.138.224.0 - 95.139.255.255 ru 95.140.0.0 - 95.140.15.255 fr 95.140.16.0 - 95.140.31.255 ru 95.140.32.0 - 95.140.47.255 hu @@ -61763,14 +36181,31 @@ 95.140.224.0 - 95.140.239.255 gb 95.140.240.0 - 95.140.255.255 cz 95.141.0.0 - 95.141.15.255 ru -95.141.16.0 - 95.141.25.255 de +95.141.16.0 - 95.141.17.255 gb +95.141.18.0 - 95.141.18.127 us +95.141.18.128 - 95.141.18.255 se +95.141.19.0 - 95.141.19.127 de +95.141.19.128 - 95.141.20.31 gb +95.141.20.32 - 95.141.20.39 no +95.141.20.40 - 95.141.20.47 fi +95.141.20.48 - 95.141.20.63 gb +95.141.20.64 - 95.141.20.79 us +95.141.20.80 - 95.141.20.191 gb +95.141.20.192 - 95.141.20.255 es +95.141.21.0 - 95.141.23.255 gb +95.141.24.0 - 95.141.24.255 de +95.141.25.0 - 95.141.25.255 gt 95.141.26.0 - 95.141.26.255 es 95.141.27.0 - 95.141.27.255 ua -95.141.28.0 - 95.141.30.255 de -95.141.31.0 - 95.141.40.255 it -95.141.41.0 - 95.141.41.255 gb -95.141.42.0 - 95.141.42.255 de -95.141.43.0 - 95.141.47.255 it +95.141.28.0 - 95.141.29.15 de +95.141.29.16 - 95.141.29.31 lu +95.141.29.32 - 95.141.29.47 nl +95.141.29.48 - 95.141.29.63 lu +95.141.29.64 - 95.141.29.95 de +95.141.29.96 - 95.141.29.127 lu +95.141.29.128 - 95.141.29.255 de +95.141.30.0 - 95.141.30.255 gb +95.141.31.0 - 95.141.47.255 it 95.141.48.0 - 95.141.63.255 lb 95.141.64.0 - 95.141.95.255 no 95.141.96.0 - 95.141.127.255 fr @@ -61781,67 +36216,23 @@ 95.141.224.0 - 95.141.239.255 ru 95.141.240.0 - 95.141.255.255 kw 95.142.0.0 - 95.142.15.255 es -95.142.16.0 - 95.142.17.47 nl -95.142.17.48 - 95.142.17.79 cy -95.142.17.80 - 95.142.17.255 nl +95.142.16.0 - 95.142.17.255 il 95.142.18.0 - 95.142.19.255 us -95.142.20.0 - 95.142.20.255 nl -95.142.21.0 - 95.142.21.255 us -95.142.22.0 - 95.142.22.127 cy -95.142.22.128 - 95.142.22.255 nl -95.142.23.0 - 95.142.23.255 il -95.142.24.0 - 95.142.24.255 us -95.142.25.0 - 95.142.25.255 il -95.142.26.0 - 95.142.27.255 nl -95.142.28.0 - 95.142.29.255 il +95.142.20.0 - 95.142.29.255 il 95.142.30.0 - 95.142.30.255 nl -95.142.31.0 - 95.142.31.255 us +95.142.31.0 - 95.142.31.255 il 95.142.32.0 - 95.142.47.255 ru 95.142.48.0 - 95.142.63.255 nl -95.142.64.0 - 95.142.68.127 de -95.142.68.128 - 95.142.68.143 nl -95.142.68.144 - 95.142.68.159 fr -95.142.68.160 - 95.142.69.191 de -95.142.69.192 - 95.142.69.223 at -95.142.69.224 - 95.142.69.239 de -95.142.69.240 - 95.142.69.255 gb -95.142.70.0 - 95.142.71.15 de -95.142.71.16 - 95.142.71.31 ch -95.142.71.32 - 95.142.72.15 de -95.142.72.16 - 95.142.72.31 nl -95.142.72.32 - 95.142.72.47 gb -95.142.72.48 - 95.142.75.175 de -95.142.75.176 - 95.142.75.191 gb -95.142.75.192 - 95.142.76.15 de -95.142.76.16 - 95.142.76.31 gb -95.142.76.32 - 95.142.76.47 at -95.142.76.48 - 95.142.76.63 gb -95.142.76.64 - 95.142.77.223 de -95.142.77.224 - 95.142.77.255 fr -95.142.78.0 - 95.142.79.255 de +95.142.64.0 - 95.142.79.255 de 95.142.80.0 - 95.142.95.255 tj -95.142.96.0 - 95.142.98.31 nl -95.142.98.32 - 95.142.98.47 mt -95.142.98.48 - 95.142.98.95 nl -95.142.98.96 - 95.142.98.127 ve -95.142.98.128 - 95.142.98.191 nl -95.142.98.192 - 95.142.98.223 ve -95.142.98.224 - 95.142.98.239 nl -95.142.98.240 - 95.142.98.255 us -95.142.99.0 - 95.142.99.159 nl -95.142.99.160 - 95.142.99.191 jp -95.142.99.192 - 95.142.99.255 nl -95.142.100.0 - 95.142.101.255 be -95.142.102.0 - 95.142.102.127 no -95.142.102.128 - 95.142.107.175 nl -95.142.107.176 - 95.142.107.183 us -95.142.107.184 - 95.142.110.127 nl -95.142.110.128 - 95.142.110.191 us -95.142.110.192 - 95.142.110.255 se -95.142.111.0 - 95.142.111.255 nl +95.142.96.0 - 95.142.103.191 nl +95.142.103.192 - 95.142.103.207 us +95.142.103.208 - 95.142.105.103 nl +95.142.105.104 - 95.142.105.111 us +95.142.105.112 - 95.142.111.255 nl 95.142.112.0 - 95.142.127.255 ie 95.142.128.0 - 95.142.143.255 tr -95.142.144.0 - 95.142.159.255 dk +95.142.144.0 - 95.142.159.255 gb 95.142.160.0 - 95.142.175.255 fr 95.142.176.0 - 95.142.191.255 it 95.142.192.0 - 95.142.207.255 ru @@ -61849,47 +36240,15 @@ 95.142.224.0 - 95.142.239.255 ir 95.142.240.0 - 95.142.255.255 pl 95.143.0.0 - 95.143.31.255 ru -95.143.32.0 - 95.143.39.15 de -95.143.39.16 - 95.143.39.31 us -95.143.39.32 - 95.143.47.255 de -95.143.48.0 - 95.143.52.15 ch -95.143.52.16 - 95.143.52.23 li -95.143.52.24 - 95.143.63.255 ch -95.143.64.0 - 95.143.64.63 fr -95.143.64.64 - 95.143.64.79 gb -95.143.64.80 - 95.143.64.152 fr -95.143.64.153 - 95.143.64.159 gb -95.143.64.160 - 95.143.65.128 fr -95.143.65.129 - 95.143.65.143 gb -95.143.65.144 - 95.143.66.255 fr -95.143.67.0 - 95.143.67.15 gb -95.143.67.16 - 95.143.67.31 be -95.143.67.32 - 95.143.67.47 nl -95.143.67.48 - 95.143.67.63 de -95.143.67.64 - 95.143.67.79 ch -95.143.67.80 - 95.143.67.95 it -95.143.67.96 - 95.143.67.111 es -95.143.67.112 - 95.143.67.127 us -95.143.67.128 - 95.143.67.143 mx -95.143.67.144 - 95.143.67.255 gb -95.143.68.0 - 95.143.68.255 fr -95.143.69.0 - 95.143.69.15 es -95.143.69.16 - 95.143.69.63 fr -95.143.69.64 - 95.143.69.79 gb -95.143.69.80 - 95.143.69.175 fr -95.143.69.176 - 95.143.69.191 mx -95.143.69.192 - 95.143.70.71 fr -95.143.70.72 - 95.143.70.255 gb -95.143.71.0 - 95.143.71.255 fr -95.143.72.0 - 95.143.72.7 es -95.143.72.8 - 95.143.72.15 gb -95.143.72.16 - 95.143.72.23 de -95.143.72.24 - 95.143.72.31 it -95.143.72.32 - 95.143.72.39 us -95.143.72.40 - 95.143.72.47 cn -95.143.72.48 - 95.143.73.255 fr -95.143.74.0 - 95.143.75.255 gb -95.143.76.0 - 95.143.79.255 fr +95.143.32.0 - 95.143.47.255 de +95.143.48.0 - 95.143.63.255 ch +95.143.64.0 - 95.143.64.255 fr +95.143.65.0 - 95.143.69.255 gb +95.143.70.0 - 95.143.71.255 fr +95.143.72.0 - 95.143.74.143 gb +95.143.74.144 - 95.143.74.151 de +95.143.74.152 - 95.143.74.159 nl +95.143.74.160 - 95.143.79.255 gb 95.143.80.0 - 95.143.95.255 at 95.143.96.0 - 95.143.111.255 it 95.143.112.0 - 95.143.127.255 ru @@ -61911,24 +36270,7 @@ 95.153.128.0 - 95.153.255.255 ru 95.154.0.0 - 95.154.63.255 dk 95.154.64.0 - 95.154.191.255 ru -95.154.192.0 - 95.154.200.31 gb -95.154.200.32 - 95.154.200.63 us -95.154.200.64 - 95.154.204.175 gb -95.154.204.176 - 95.154.204.191 ch -95.154.204.192 - 95.154.206.63 gb -95.154.206.64 - 95.154.206.127 id -95.154.206.128 - 95.154.213.63 gb -95.154.213.64 - 95.154.213.95 dk -95.154.213.96 - 95.154.213.127 an -95.154.213.128 - 95.154.213.191 gb -95.154.213.192 - 95.154.213.255 an -95.154.214.0 - 95.154.221.255 gb -95.154.222.0 - 95.154.222.255 pt -95.154.223.0 - 95.154.223.127 gb -95.154.223.128 - 95.154.223.255 br -95.154.224.0 - 95.154.242.255 gb -95.154.243.0 - 95.154.243.255 sa -95.154.244.0 - 95.154.255.255 gb +95.154.192.0 - 95.154.255.255 gb 95.155.0.0 - 95.155.63.255 me 95.155.64.0 - 95.155.127.255 pl 95.155.128.0 - 95.155.191.255 nl @@ -61936,8 +36278,19 @@ 95.156.0.0 - 95.156.63.255 mk 95.156.64.0 - 95.156.127.255 ru 95.156.128.0 - 95.156.191.255 ba -95.156.192.0 - 95.157.63.255 de -95.157.64.0 - 95.157.127.255 ro +95.156.192.0 - 95.156.215.255 de +95.156.216.0 - 95.156.219.255 ir +95.156.220.0 - 95.156.221.255 de +95.156.222.0 - 95.156.223.255 ir +95.156.224.0 - 95.156.232.255 de +95.156.233.0 - 95.156.237.255 ir +95.156.238.0 - 95.156.239.255 de +95.156.240.0 - 95.156.247.255 pl +95.156.248.0 - 95.156.249.255 ir +95.156.250.0 - 95.156.251.255 de +95.156.252.0 - 95.156.255.255 ir +95.157.0.0 - 95.157.63.255 de +95.157.64.0 - 95.157.127.255 it 95.157.128.0 - 95.157.255.255 fr 95.158.0.0 - 95.158.63.255 ua 95.158.64.0 - 95.158.127.255 pl @@ -61948,12 +36301,14 @@ 95.159.128.0 - 95.159.191.255 ru 95.159.192.0 - 95.159.255.255 si 95.160.0.0 - 95.160.255.255 pl -95.161.0.0 - 95.161.255.255 ru +95.161.0.0 - 95.161.183.255 ru +95.161.184.0 - 95.161.187.255 kz +95.161.188.0 - 95.161.223.255 ru +95.161.224.0 - 95.161.227.255 kz +95.161.228.0 - 95.161.255.255 ru 95.162.0.0 - 95.162.255.255 ro -95.163.0.0 - 95.164.191.0 ru -95.164.191.1 - 95.164.191.255 ua -95.164.192.0 - 95.164.250.255 ru -95.164.251.0 - 95.164.255.255 ua +95.163.0.0 - 95.163.255.255 ru +95.164.0.0 - 95.164.255.255 ua 95.165.0.0 - 95.165.255.255 ru 95.166.0.0 - 95.166.255.255 dk 95.167.0.0 - 95.167.255.255 ru @@ -61961,47 +36316,16 @@ 95.168.32.0 - 95.168.63.255 hu 95.168.64.0 - 95.168.95.255 rs 95.168.96.0 - 95.168.127.255 hr -95.168.128.0 - 95.168.160.127 de -95.168.160.128 - 95.168.160.255 ru -95.168.161.0 - 95.168.161.255 de -95.168.162.0 - 95.168.162.255 gb -95.168.163.0 - 95.168.165.255 de -95.168.166.0 - 95.168.171.255 tr -95.168.172.0 - 95.168.173.255 de -95.168.174.0 - 95.168.174.255 ru -95.168.175.0 - 95.168.176.255 tr -95.168.177.0 - 95.168.181.63 de -95.168.181.64 - 95.168.181.255 ru -95.168.182.0 - 95.168.184.255 de -95.168.185.0 - 95.168.185.255 hk -95.168.186.0 - 95.168.188.255 de -95.168.189.0 - 95.168.190.255 tr -95.168.191.0 - 95.168.191.255 de -95.168.192.0 - 95.168.194.255 cz -95.168.195.0 - 95.168.195.3 sk -95.168.195.4 - 95.168.195.119 cz -95.168.195.120 - 95.168.195.123 sk -95.168.195.124 - 95.168.213.255 cz -95.168.214.0 - 95.168.214.31 sc -95.168.214.32 - 95.168.217.191 cz -95.168.217.192 - 95.168.217.255 sc -95.168.218.0 - 95.168.218.255 cz -95.168.219.0 - 95.168.219.255 sk -95.168.220.0 - 95.168.220.23 cz -95.168.220.24 - 95.168.220.47 sk -95.168.220.48 - 95.168.220.95 cz -95.168.220.96 - 95.168.220.254 sk -95.168.220.255 - 95.168.221.255 cz -95.168.222.0 - 95.168.223.255 sk +95.168.128.0 - 95.168.165.255 de +95.168.166.0 - 95.168.168.255 tr +95.168.169.0 - 95.168.191.255 de +95.168.192.0 - 95.168.223.255 cz 95.168.224.0 - 95.168.255.255 bg 95.169.0.0 - 95.169.31.255 ua 95.169.32.0 - 95.169.63.255 no 95.169.64.0 - 95.169.95.255 it 95.169.96.0 - 95.169.159.255 ru -95.169.160.0 - 95.169.185.255 de -95.169.186.0 - 95.169.187.255 ru -95.169.188.0 - 95.169.189.255 de -95.169.190.0 - 95.169.191.255 ru +95.169.160.0 - 95.169.191.255 de 95.169.192.0 - 95.169.223.255 bg 95.169.224.0 - 95.169.255.255 es 95.170.0.0 - 95.170.63.255 fr @@ -62017,48 +36341,92 @@ 95.171.160.0 - 95.171.191.255 be 95.171.192.0 - 95.171.223.255 pl 95.171.224.0 - 95.171.255.255 ru -95.172.0.0 - 95.172.31.255 gb +95.172.0.0 - 95.172.2.23 gb +95.172.2.24 - 95.172.2.31 it +95.172.2.32 - 95.172.2.63 gb +95.172.2.64 - 95.172.2.71 it +95.172.2.72 - 95.172.2.183 gb +95.172.2.184 - 95.172.2.191 it +95.172.2.192 - 95.172.3.87 gb +95.172.3.88 - 95.172.3.95 it +95.172.3.96 - 95.172.4.167 gb +95.172.4.168 - 95.172.4.175 it +95.172.4.176 - 95.172.5.231 gb +95.172.5.232 - 95.172.5.239 it +95.172.5.240 - 95.172.6.247 gb +95.172.6.248 - 95.172.6.255 it +95.172.7.0 - 95.172.7.55 gb +95.172.7.56 - 95.172.7.63 it +95.172.7.64 - 95.172.7.135 gb +95.172.7.136 - 95.172.7.143 it +95.172.7.144 - 95.172.8.55 gb +95.172.8.56 - 95.172.8.63 it +95.172.8.64 - 95.172.9.247 gb +95.172.9.248 - 95.172.9.255 it +95.172.10.0 - 95.172.12.239 gb +95.172.12.240 - 95.172.12.247 it +95.172.12.248 - 95.172.13.159 gb +95.172.13.160 - 95.172.13.167 it +95.172.13.168 - 95.172.15.247 gb +95.172.15.248 - 95.172.15.255 it +95.172.16.0 - 95.172.16.71 gb +95.172.16.72 - 95.172.16.79 it +95.172.16.80 - 95.172.16.111 gb +95.172.16.112 - 95.172.16.119 it +95.172.16.120 - 95.172.16.127 gb +95.172.16.128 - 95.172.16.135 it +95.172.16.136 - 95.172.18.103 gb +95.172.18.104 - 95.172.18.111 it +95.172.18.112 - 95.172.20.15 gb +95.172.20.16 - 95.172.20.23 it +95.172.20.24 - 95.172.20.255 gb +95.172.21.0 - 95.172.21.7 it +95.172.21.8 - 95.172.22.39 gb +95.172.22.40 - 95.172.22.47 it +95.172.22.48 - 95.172.22.63 gb +95.172.22.64 - 95.172.22.71 it +95.172.22.72 - 95.172.22.223 gb +95.172.22.224 - 95.172.22.239 it +95.172.22.240 - 95.172.23.215 gb +95.172.23.216 - 95.172.23.223 it +95.172.23.224 - 95.172.25.87 gb +95.172.25.88 - 95.172.25.95 it +95.172.25.96 - 95.172.25.175 gb +95.172.25.176 - 95.172.25.183 it +95.172.25.184 - 95.172.25.215 gb +95.172.25.216 - 95.172.25.223 it +95.172.25.224 - 95.172.28.95 gb +95.172.28.96 - 95.172.28.103 it +95.172.28.104 - 95.172.28.127 gb +95.172.28.128 - 95.172.28.135 it +95.172.28.136 - 95.172.30.191 gb +95.172.30.192 - 95.172.30.199 it +95.172.30.200 - 95.172.30.207 gb +95.172.30.208 - 95.172.30.215 it +95.172.30.216 - 95.172.31.63 gb +95.172.31.64 - 95.172.31.71 it +95.172.31.72 - 95.172.31.255 gb 95.172.32.0 - 95.172.63.255 ru -95.172.64.0 - 95.172.65.255 us -95.172.66.0 - 95.172.66.31 gb -95.172.66.32 - 95.172.66.127 us -95.172.66.128 - 95.172.66.255 gb -95.172.67.0 - 95.172.67.31 us -95.172.67.32 - 95.172.67.63 gb -95.172.67.64 - 95.172.67.95 us -95.172.67.96 - 95.172.67.255 gb -95.172.68.0 - 95.172.68.127 us -95.172.68.128 - 95.172.68.143 gb -95.172.68.144 - 95.172.68.159 us -95.172.68.160 - 95.172.68.215 gb -95.172.68.216 - 95.172.68.223 us -95.172.68.224 - 95.172.68.255 gb -95.172.69.0 - 95.172.71.15 us -95.172.71.16 - 95.172.71.255 gb -95.172.72.0 - 95.172.77.255 us -95.172.78.0 - 95.172.78.255 gb -95.172.79.0 - 95.172.81.255 us -95.172.82.0 - 95.172.83.255 gb -95.172.84.0 - 95.172.85.255 us -95.172.86.0 - 95.172.87.255 gb -95.172.88.0 - 95.172.88.31 us -95.172.88.32 - 95.172.88.55 gb -95.172.88.56 - 95.172.88.95 us -95.172.88.96 - 95.172.88.255 gb -95.172.89.0 - 95.172.90.255 us -95.172.91.0 - 95.172.91.255 gb -95.172.92.0 - 95.172.94.255 us -95.172.95.0 - 95.172.95.255 gb +95.172.64.0 - 95.172.67.255 gb +95.172.68.0 - 95.172.68.155 de +95.172.68.156 - 95.172.68.156 gb +95.172.68.157 - 95.172.68.255 de +95.172.69.0 - 95.172.71.15 gb +95.172.71.16 - 95.172.71.31 de +95.172.71.32 - 95.172.74.45 gb +95.172.74.46 - 95.172.74.46 us +95.172.74.47 - 95.172.87.255 gb +95.172.88.0 - 95.172.88.31 nl +95.172.88.32 - 95.172.91.255 gb +95.172.92.0 - 95.172.92.255 de +95.172.93.0 - 95.172.95.255 gb 95.172.96.0 - 95.172.159.255 ru 95.172.160.0 - 95.172.191.255 pt 95.172.192.0 - 95.172.223.255 jo 95.172.224.0 - 95.172.255.255 gb 95.173.0.0 - 95.173.31.255 tr 95.173.32.0 - 95.173.63.255 lt -95.173.64.0 - 95.173.64.31 sk -95.173.64.32 - 95.173.64.127 cz -95.173.64.128 - 95.173.64.255 sk -95.173.65.0 - 95.173.95.255 cz +95.173.64.0 - 95.173.95.255 cz 95.173.96.0 - 95.173.127.255 de 95.173.128.0 - 95.173.159.255 ru 95.173.160.0 - 95.173.191.255 tr @@ -62066,7 +36434,6 @@ 95.173.224.0 - 95.173.255.255 tr 95.174.0.0 - 95.174.31.255 it 95.174.32.0 - 95.174.63.255 pl -95.174.64.0 - 95.174.71.255 ru 95.174.72.0 - 95.174.79.255 fr 95.174.80.0 - 95.174.87.255 de 95.174.88.0 - 95.174.127.255 ru @@ -62085,243 +36452,231 @@ 95.176.0.0 - 95.176.127.255 fr 95.176.128.0 - 95.176.255.255 si 95.177.0.0 - 95.177.127.255 gb -95.177.128.0 - 95.177.255.255 ro +95.177.128.0 - 95.177.255.255 sa 95.178.0.0 - 95.178.127.255 pl 95.178.128.0 - 95.178.255.255 hr 95.179.0.0 - 95.179.127.255 ru 95.179.128.0 - 95.179.255.255 gr 95.180.0.0 - 95.180.127.255 rs 95.180.128.0 - 95.180.255.255 mk -95.181.0.0 - 95.182.127.255 ru +95.181.0.0 - 95.181.217.255 ru +95.181.218.0 - 95.181.218.127 us +95.181.218.128 - 95.181.219.255 ru +95.181.220.0 - 95.181.223.255 fr +95.181.224.0 - 95.181.255.255 ru +95.182.0.0 - 95.182.23.255 kz +95.182.24.0 - 95.182.31.255 pl +95.182.32.0 - 95.182.127.255 ru 95.182.128.0 - 95.182.255.255 be -95.183.0.0 - 95.183.127.255 ru +95.183.0.0 - 95.183.0.255 gb +95.183.1.0 - 95.183.3.255 us +95.183.4.0 - 95.183.4.255 gb +95.183.5.0 - 95.183.5.255 us +95.183.6.0 - 95.183.6.255 il +95.183.7.0 - 95.183.7.255 us +95.183.8.0 - 95.183.47.255 ru +95.183.48.0 - 95.183.63.255 ch +95.183.64.0 - 95.183.127.255 ru 95.183.128.0 - 95.183.255.255 tr -95.184.0.0 - 95.187.255.255 ro +95.184.0.0 - 95.187.255.255 sa 95.188.0.0 - 95.191.255.255 ru 95.192.0.0 - 95.207.255.255 se 95.208.0.0 - 95.208.255.255 de 95.209.0.0 - 95.209.143.255 se 95.209.144.0 - 95.209.155.255 dk 95.209.156.0 - 95.209.167.255 se -95.209.168.0 - 95.209.175.255 dk +95.209.168.0 - 95.209.175.255 gb 95.209.176.0 - 95.209.191.255 se -95.209.192.0 - 95.209.199.255 dk -95.209.200.0 - 95.209.207.255 se -95.209.208.0 - 95.209.255.255 dk -95.210.0.0 - 95.210.47.255 it +95.209.192.0 - 95.209.255.255 dk +95.210.0.0 - 95.210.3.255 gb +95.210.4.0 - 95.210.8.255 it +95.210.9.0 - 95.210.9.255 de +95.210.10.0 - 95.210.10.255 at +95.210.11.0 - 95.210.11.255 ch +95.210.12.0 - 95.210.14.255 it +95.210.15.0 - 95.210.15.255 gb +95.210.16.0 - 95.210.30.255 it +95.210.31.0 - 95.210.31.255 fr +95.210.32.0 - 95.210.33.255 de +95.210.34.0 - 95.210.34.255 gb +95.210.35.0 - 95.210.35.255 it +95.210.36.0 - 95.210.36.255 pl +95.210.37.0 - 95.210.39.255 it +95.210.40.0 - 95.210.40.255 hu +95.210.41.0 - 95.210.41.255 sk +95.210.42.0 - 95.210.47.255 eu 95.210.48.0 - 95.210.55.255 ie -95.210.56.0 - 95.210.63.255 a2 -95.210.64.0 - 95.210.71.255 gr -95.210.72.0 - 95.210.79.255 a2 -95.210.80.0 - 95.210.95.255 gb -95.210.96.0 - 95.210.127.255 a2 -95.210.128.0 - 95.210.139.255 ie -95.210.140.0 - 95.210.151.255 a2 -95.210.152.0 - 95.210.159.255 ie -95.210.160.0 - 95.210.191.255 a2 +95.210.56.0 - 95.210.63.255 eu +95.210.64.0 - 95.210.67.255 fr +95.210.68.0 - 95.210.75.255 gb +95.210.76.0 - 95.210.79.255 eu +95.210.80.0 - 95.210.87.255 es +95.210.88.0 - 95.210.90.255 it +95.210.91.0 - 95.210.91.255 eu +95.210.92.0 - 95.210.95.255 it +95.210.96.0 - 95.210.103.255 es +95.210.104.0 - 95.210.107.255 it +95.210.108.0 - 95.210.109.2 es +95.210.109.3 - 95.210.109.3 pt +95.210.109.4 - 95.210.111.255 es +95.210.112.0 - 95.210.114.255 fr +95.210.115.0 - 95.210.115.255 fi +95.210.116.0 - 95.210.118.255 it +95.210.119.0 - 95.210.119.255 eu +95.210.120.0 - 95.210.122.255 it +95.210.123.0 - 95.210.141.255 eu +95.210.142.0 - 95.210.149.255 it +95.210.150.0 - 95.210.159.255 eu +95.210.160.0 - 95.210.166.229 it +95.210.166.230 - 95.210.166.230 ch +95.210.166.231 - 95.210.173.20 it +95.210.173.21 - 95.210.173.21 nl +95.210.173.22 - 95.210.191.255 it 95.210.192.0 - 95.210.207.255 de 95.210.208.0 - 95.210.223.255 fr -95.210.224.0 - 95.210.255.255 a2 +95.210.224.0 - 95.210.255.255 it 95.211.0.0 - 95.211.255.255 nl -95.212.0.0 - 95.212.127.255 eg -95.212.128.0 - 95.212.143.255 sy -95.212.144.0 - 95.212.255.255 eg +95.212.0.0 - 95.212.31.255 sy +95.212.32.0 - 95.212.63.255 eg +95.212.64.0 - 95.212.159.255 sy +95.212.160.0 - 95.212.191.255 eg +95.212.192.0 - 95.212.255.255 sy 95.213.0.0 - 95.213.255.255 ru -95.214.0.0 - 95.214.128.0 es -95.214.128.1 - 95.214.128.2 de -95.214.128.3 - 95.214.128.8 es -95.214.128.9 - 95.214.128.12 gb -95.214.128.13 - 95.214.128.63 es +95.214.0.0 - 95.214.127.255 es +95.214.128.0 - 95.214.128.63 gb 95.214.128.64 - 95.214.128.127 de -95.214.128.128 - 95.214.255.255 es +95.214.128.128 - 95.214.128.191 dk +95.214.128.192 - 95.214.128.255 it +95.214.129.0 - 95.214.129.63 at +95.214.129.64 - 95.214.129.127 fr +95.214.129.128 - 95.214.129.191 se +95.214.129.192 - 95.214.129.255 nl +95.214.130.0 - 95.214.130.63 be +95.214.130.64 - 95.214.130.127 ie +95.214.130.128 - 95.214.255.255 es 95.215.0.0 - 95.215.3.255 ru -95.215.4.0 - 95.215.7.255 nl +95.215.4.0 - 95.215.7.255 ua 95.215.8.0 - 95.215.15.255 ru 95.215.16.0 - 95.215.19.255 se 95.215.20.0 - 95.215.31.255 pl 95.215.32.0 - 95.215.35.255 de -95.215.36.0 - 95.215.39.255 ua -95.215.44.0 - 95.215.47.255 lv +95.215.36.0 - 95.215.43.255 ua +95.215.44.0 - 95.215.47.255 se 95.215.48.0 - 95.215.51.255 ua 95.215.52.0 - 95.215.55.255 pl 95.215.56.0 - 95.215.59.255 ru 95.215.60.0 - 95.215.63.255 es 95.215.64.0 - 95.215.71.255 ru 95.215.72.0 - 95.215.75.255 fr -95.215.80.0 - 95.215.83.255 ua +95.215.76.0 - 95.215.79.255 pl 95.215.84.0 - 95.215.87.255 ru 95.215.88.0 - 95.215.91.255 gb 95.215.92.0 - 95.215.95.255 ua 95.215.96.0 - 95.215.103.255 ru 95.215.104.0 - 95.215.107.255 ua -95.215.112.0 - 95.215.119.255 ua +95.215.108.0 - 95.215.119.255 ru 95.215.120.0 - 95.215.123.255 es 95.215.124.0 - 95.215.127.255 ua 95.215.128.0 - 95.215.131.255 ps 95.215.132.0 - 95.215.135.255 ee -95.215.136.0 - 95.215.143.255 ru +95.215.136.0 - 95.215.139.255 ru 95.215.144.0 - 95.215.147.255 ua 95.215.148.0 - 95.215.155.255 ru 95.215.156.0 - 95.215.159.255 ua +95.215.160.0 - 95.215.163.255 ir 95.215.164.0 - 95.215.167.255 ua 95.215.168.0 - 95.215.171.255 se +95.215.172.0 - 95.215.172.255 ru +95.215.173.0 - 95.215.173.255 ir +95.215.174.0 - 95.215.175.255 gb 95.215.176.0 - 95.215.183.255 ru 95.215.184.0 - 95.215.191.255 nl 95.215.192.0 - 95.215.199.255 pl 95.215.200.0 - 95.215.211.255 ru 95.215.212.0 - 95.215.215.255 de 95.215.216.0 - 95.215.219.255 ua +95.215.220.0 - 95.215.222.255 ro +95.215.223.0 - 95.215.223.255 ua 95.215.224.0 - 95.215.227.255 gb +95.215.228.0 - 95.215.231.255 ru 95.215.232.0 - 95.215.235.255 pl -95.215.236.0 - 95.215.239.255 ua +95.215.236.0 - 95.215.236.255 fr +95.215.237.0 - 95.215.237.255 gb +95.215.238.0 - 95.215.243.255 ru 95.215.244.0 - 95.215.247.255 kg -95.215.252.0 - 95.215.255.255 ru +95.215.248.0 - 95.215.255.255 ru 95.216.0.0 - 95.217.255.255 ua -95.218.0.0 - 95.219.255.255 ro +95.218.0.0 - 95.219.255.255 sa 95.220.0.0 - 95.221.255.255 ru 95.222.0.0 - 95.223.255.255 de 95.224.0.0 - 95.255.255.255 it 96.0.0.0 - 96.0.255.255 us 96.1.0.0 - 96.1.255.255 ca -96.2.0.0 - 96.8.112.247 us -96.8.112.248 - 96.8.112.255 bd -96.8.113.0 - 96.8.113.159 us -96.8.113.160 - 96.8.113.167 nz -96.8.113.168 - 96.8.113.215 us -96.8.113.216 - 96.8.113.223 af -96.8.113.224 - 96.8.114.135 us -96.8.114.136 - 96.8.114.143 ve -96.8.114.144 - 96.8.114.151 us -96.8.114.152 - 96.8.114.159 gb -96.8.114.160 - 96.8.115.63 us -96.8.115.64 - 96.8.115.95 in -96.8.115.96 - 96.8.115.111 hn -96.8.115.112 - 96.8.115.191 us -96.8.115.192 - 96.8.115.239 in -96.8.115.240 - 96.8.116.31 us -96.8.116.32 - 96.8.116.63 in -96.8.116.64 - 96.8.116.95 us -96.8.116.96 - 96.8.116.127 in -96.8.116.128 - 96.8.116.191 us -96.8.116.192 - 96.8.116.255 in -96.8.117.0 - 96.8.117.127 us -96.8.117.128 - 96.8.117.191 in -96.8.117.192 - 96.8.117.223 us -96.8.117.224 - 96.8.117.255 in -96.8.118.0 - 96.8.119.191 us -96.8.119.192 - 96.8.119.239 se -96.8.119.240 - 96.8.122.223 us -96.8.122.224 - 96.8.122.255 in -96.8.123.0 - 96.8.124.255 us -96.8.125.0 - 96.8.127.127 ie -96.8.127.128 - 96.8.127.255 gb -96.8.128.0 - 96.9.95.255 us +96.2.0.0 - 96.5.255.255 us +96.6.0.0 - 96.6.7.255 nl +96.6.8.0 - 96.6.11.255 us +96.6.12.0 - 96.6.15.255 nl +96.6.16.0 - 96.6.41.255 us +96.6.42.0 - 96.6.42.255 nl +96.6.43.0 - 96.6.119.255 us +96.6.120.0 - 96.6.121.255 nl +96.6.122.0 - 96.7.48.255 us +96.7.49.0 - 96.7.50.255 nl +96.7.51.0 - 96.7.57.255 us +96.7.58.0 - 96.7.59.255 nl +96.7.60.0 - 96.7.175.255 us +96.7.176.0 - 96.7.179.255 nl +96.7.180.0 - 96.7.223.255 us +96.7.224.0 - 96.7.231.255 nl +96.7.232.0 - 96.9.63.255 us +96.9.64.0 - 96.9.95.255 kh 96.9.96.0 - 96.9.127.255 ca -96.9.128.0 - 96.19.255.255 us +96.9.128.0 - 96.9.159.255 sg +96.9.160.0 - 96.9.175.255 my +96.9.176.0 - 96.9.191.255 hk +96.9.192.0 - 96.16.3.255 us +96.16.4.0 - 96.16.5.255 nl +96.16.6.0 - 96.16.121.255 us +96.16.122.0 - 96.16.125.255 nl +96.16.126.0 - 96.17.195.255 us +96.17.196.0 - 96.17.196.255 nl +96.17.197.0 - 96.17.199.255 us +96.17.200.0 - 96.17.201.255 nl +96.17.202.0 - 96.19.255.255 us 96.20.0.0 - 96.23.255.255 ca -96.24.0.0 - 96.30.127.255 us -96.30.128.0 - 96.30.223.255 ca -96.30.224.0 - 96.31.160.255 us -96.31.161.0 - 96.31.161.15 ca -96.31.161.16 - 96.31.163.95 us -96.31.163.96 - 96.31.163.127 kr -96.31.163.128 - 96.31.166.207 us -96.31.166.208 - 96.31.166.215 ca -96.31.166.216 - 96.31.174.191 us -96.31.174.192 - 96.31.174.255 ca -96.31.175.0 - 96.43.159.255 us +96.24.0.0 - 96.30.126.255 us +96.30.127.0 - 96.30.223.255 ca +96.30.224.0 - 96.43.159.255 us 96.43.160.0 - 96.43.191.255 jm -96.43.192.0 - 96.43.223.255 us +96.43.192.0 - 96.43.192.255 ca +96.43.193.0 - 96.43.223.255 us 96.43.224.0 - 96.43.239.255 ca 96.43.240.0 - 96.44.31.255 us 96.44.32.0 - 96.44.127.255 ca -96.44.128.0 - 96.44.155.191 us -96.44.155.192 - 96.44.155.223 tw -96.44.155.224 - 96.44.155.255 us -96.44.156.0 - 96.44.156.31 tw -96.44.156.32 - 96.44.191.255 us -96.44.192.0 - 96.44.192.23 ca -96.44.192.24 - 96.44.192.31 us -96.44.192.32 - 96.44.192.79 ca -96.44.192.80 - 96.44.192.87 us -96.44.192.88 - 96.44.193.71 ca -96.44.193.72 - 96.44.193.79 us -96.44.193.80 - 96.44.193.143 ca -96.44.193.144 - 96.44.193.151 us -96.44.193.152 - 96.44.193.159 nl -96.44.193.160 - 96.44.194.135 ca -96.44.194.136 - 96.44.194.143 us -96.44.194.144 - 96.44.194.175 ca -96.44.194.176 - 96.44.194.183 us -96.44.194.184 - 96.44.195.167 ca -96.44.195.168 - 96.44.195.183 us -96.44.195.184 - 96.44.196.47 ca -96.44.196.48 - 96.44.196.55 us -96.44.196.56 - 96.44.196.111 ca -96.44.196.112 - 96.44.196.119 us -96.44.196.120 - 96.44.196.167 ca -96.44.196.168 - 96.44.196.175 us -96.44.196.176 - 96.44.196.183 ca -96.44.196.184 - 96.44.196.199 us -96.44.196.200 - 96.44.196.207 ca -96.44.196.208 - 96.44.196.223 us -96.44.196.224 - 96.44.199.239 ca -96.44.199.240 - 96.44.199.255 us -96.44.200.0 - 96.44.201.143 ca -96.44.201.144 - 96.44.201.167 us -96.44.201.168 - 96.44.203.191 ca -96.44.203.192 - 96.44.203.199 us -96.44.203.200 - 96.44.205.159 ca -96.44.205.160 - 96.44.205.167 us -96.44.205.168 - 96.44.205.183 ca -96.44.205.184 - 96.44.205.191 us -96.44.205.192 - 96.44.205.239 ca -96.44.205.240 - 96.44.205.247 us -96.44.205.248 - 96.44.206.87 ca -96.44.206.88 - 96.44.206.111 us -96.44.206.112 - 96.44.206.127 ca -96.44.206.128 - 96.44.206.135 us -96.44.206.136 - 96.44.206.151 ca -96.44.206.152 - 96.44.207.7 us -96.44.207.8 - 96.44.212.143 ca -96.44.212.144 - 96.44.212.151 us -96.44.212.152 - 96.44.228.55 ca -96.44.228.56 - 96.44.228.63 us -96.44.228.64 - 96.44.233.215 ca -96.44.233.216 - 96.44.233.223 us -96.44.233.224 - 96.44.237.15 ca -96.44.237.16 - 96.44.237.23 us -96.44.237.24 - 96.44.237.95 ca -96.44.237.96 - 96.44.237.103 us -96.44.237.104 - 96.44.242.87 ca -96.44.242.88 - 96.44.242.103 nl -96.44.242.104 - 96.45.15.255 ca -96.45.16.0 - 96.45.31.255 us -96.45.32.0 - 96.45.47.255 ca -96.45.48.0 - 96.45.175.255 us -96.45.176.0 - 96.45.176.255 ca -96.45.177.0 - 96.45.177.255 us -96.45.178.0 - 96.45.178.255 gb -96.45.179.0 - 96.45.179.255 us -96.45.180.0 - 96.45.207.255 ca +96.44.128.0 - 96.44.191.255 us +96.44.192.0 - 96.45.15.255 ca +96.45.16.0 - 96.45.88.255 us +96.45.89.0 - 96.45.89.255 hk +96.45.90.0 - 96.45.91.255 us +96.45.92.0 - 96.45.92.255 de +96.45.93.0 - 96.45.93.255 gb +96.45.94.0 - 96.45.175.255 us +96.45.176.0 - 96.45.207.255 ca 96.45.208.0 - 96.46.31.255 us -96.46.32.0 - 96.46.47.255 ca -96.46.48.0 - 96.46.191.255 us +96.46.32.0 - 96.46.49.255 ca +96.46.50.0 - 96.46.50.127 us +96.46.50.128 - 96.46.50.255 ca +96.46.51.0 - 96.46.51.127 us +96.46.51.128 - 96.46.61.255 ca +96.46.62.0 - 96.46.62.127 us +96.46.62.128 - 96.46.63.255 ca +96.46.64.0 - 96.46.191.255 us 96.46.192.0 - 96.46.207.255 ca -96.46.208.0 - 96.47.41.246 us -96.47.41.247 - 96.47.41.254 lk -96.47.41.255 - 96.47.175.255 us +96.46.208.0 - 96.47.175.255 us 96.47.176.0 - 96.47.191.255 ca -96.47.192.0 - 96.47.225.63 us -96.47.225.64 - 96.47.225.79 br -96.47.225.80 - 96.47.225.111 us -96.47.225.112 - 96.47.225.119 pa -96.47.225.120 - 96.47.225.127 nl -96.47.225.128 - 96.47.225.191 us -96.47.225.192 - 96.47.225.199 tw -96.47.225.200 - 96.47.228.15 us -96.47.228.16 - 96.47.228.23 pa -96.47.228.24 - 96.47.255.255 us +96.47.192.0 - 96.47.226.19 us +96.47.226.20 - 96.47.226.20 a1 +96.47.226.21 - 96.47.255.255 us 96.48.0.0 - 96.55.255.255 ca 96.56.0.0 - 96.62.255.255 us 96.63.0.0 - 96.63.63.255 ca @@ -62330,29 +36685,19 @@ 96.63.176.0 - 96.125.127.255 us 96.125.128.0 - 96.125.143.255 ca 96.125.144.0 - 96.125.175.255 us -96.125.176.0 - 96.125.223.255 ca +96.125.176.0 - 96.125.177.255 ca +96.125.178.0 - 96.125.178.255 us +96.125.179.0 - 96.125.223.255 ca 96.125.224.0 - 96.125.239.255 us 96.125.240.0 - 96.125.255.255 ca 96.126.0.0 - 96.127.191.255 us 96.127.192.0 - 96.127.255.255 ca -96.128.0.0 - 97.74.255.255 us +96.128.0.0 - 97.68.73.255 us +97.68.74.0 - 97.68.74.255 pr +97.68.75.0 - 97.74.255.255 us 97.75.0.0 - 97.75.63.255 ca 97.75.64.0 - 97.75.191.255 us -97.75.192.0 - 97.75.193.47 ca -97.75.193.48 - 97.75.193.55 us -97.75.193.56 - 97.75.193.119 ca -97.75.193.120 - 97.75.193.127 us -97.75.193.128 - 97.75.194.103 ca -97.75.194.104 - 97.75.194.111 nl -97.75.194.112 - 97.75.196.183 ca -97.75.196.184 - 97.75.196.191 us -97.75.196.192 - 97.75.196.255 ca -97.75.197.0 - 97.75.197.15 us -97.75.197.16 - 97.75.208.247 ca -97.75.208.248 - 97.75.208.255 us -97.75.209.0 - 97.75.209.119 ca -97.75.209.120 - 97.75.209.127 us -97.75.209.128 - 97.75.223.255 ca +97.75.192.0 - 97.75.223.255 ca 97.75.224.0 - 97.107.47.255 us 97.107.48.0 - 97.107.63.255 ca 97.107.64.0 - 97.107.175.255 us @@ -62365,603 +36710,18 @@ 98.124.0.0 - 98.124.63.255 ca 98.124.64.0 - 98.126.220.255 us 98.126.221.0 - 98.126.222.255 cn -98.126.223.0 - 98.126.244.118 us -98.126.244.119 - 98.126.244.119 tr -98.126.244.120 - 98.129.0.15 us -98.129.0.16 - 98.129.0.23 ca -98.129.0.24 - 98.129.0.31 au -98.129.0.32 - 98.129.0.47 ca -98.129.0.48 - 98.129.0.183 us -98.129.0.184 - 98.129.0.191 ca -98.129.0.192 - 98.129.1.95 us -98.129.1.96 - 98.129.1.103 gb -98.129.1.104 - 98.129.1.111 us -98.129.1.112 - 98.129.1.119 ca -98.129.1.120 - 98.129.1.127 us -98.129.1.128 - 98.129.1.135 mx -98.129.1.136 - 98.129.2.87 us -98.129.2.88 - 98.129.2.95 gb -98.129.2.96 - 98.129.3.39 us -98.129.3.40 - 98.129.3.47 gb -98.129.3.48 - 98.129.3.95 us -98.129.3.96 - 98.129.3.127 gb -98.129.3.128 - 98.129.3.191 us -98.129.3.192 - 98.129.3.199 au -98.129.3.200 - 98.129.4.239 us -98.129.4.240 - 98.129.4.247 gb -98.129.4.248 - 98.129.6.47 us -98.129.6.48 - 98.129.6.55 mx -98.129.6.56 - 98.129.10.31 us -98.129.10.32 - 98.129.10.63 in -98.129.10.64 - 98.129.10.239 us -98.129.10.240 - 98.129.10.247 mx -98.129.10.248 - 98.129.12.127 us -98.129.12.128 - 98.129.12.135 in -98.129.12.136 - 98.129.12.143 us -98.129.12.144 - 98.129.12.151 gb -98.129.12.152 - 98.129.12.207 us -98.129.12.208 - 98.129.12.215 ie -98.129.12.216 - 98.129.13.15 us -98.129.13.16 - 98.129.13.23 za -98.129.13.24 - 98.129.14.223 us -98.129.14.224 - 98.129.14.231 za -98.129.14.232 - 98.129.15.151 us -98.129.15.152 - 98.129.15.159 ca -98.129.15.160 - 98.129.16.87 us -98.129.16.88 - 98.129.16.95 ca -98.129.16.96 - 98.129.17.31 us -98.129.17.32 - 98.129.17.47 in -98.129.17.48 - 98.129.18.135 us -98.129.18.136 - 98.129.18.143 gb -98.129.18.144 - 98.129.18.199 us -98.129.18.200 - 98.129.18.207 mx -98.129.18.208 - 98.129.19.143 us -98.129.19.144 - 98.129.19.151 gb -98.129.19.152 - 98.129.19.223 us -98.129.19.224 - 98.129.19.231 ie -98.129.19.232 - 98.129.20.55 us -98.129.20.56 - 98.129.20.63 gb -98.129.20.64 - 98.129.21.39 us -98.129.21.40 - 98.129.21.47 il -98.129.21.48 - 98.129.24.63 us -98.129.24.64 - 98.129.24.111 my -98.129.24.112 - 98.129.24.119 us -98.129.24.120 - 98.129.24.127 gb -98.129.24.128 - 98.129.26.87 us -98.129.26.88 - 98.129.26.95 in -98.129.26.96 - 98.129.27.87 us -98.129.27.88 - 98.129.27.95 bo -98.129.27.96 - 98.129.27.127 us -98.129.27.128 - 98.129.27.135 ca -98.129.27.136 - 98.129.32.47 us -98.129.32.48 - 98.129.32.55 nz -98.129.32.56 - 98.129.34.15 us -98.129.34.16 - 98.129.34.23 gb -98.129.34.24 - 98.129.34.231 us -98.129.34.232 - 98.129.34.239 au -98.129.34.240 - 98.129.36.127 us -98.129.36.128 - 98.129.36.135 il -98.129.36.136 - 98.129.37.103 us -98.129.37.104 - 98.129.37.111 au -98.129.37.112 - 98.129.37.231 us -98.129.37.232 - 98.129.37.239 in -98.129.37.240 - 98.129.39.47 us -98.129.39.48 - 98.129.39.55 ca -98.129.39.56 - 98.129.39.239 us -98.129.39.240 - 98.129.39.255 my -98.129.40.0 - 98.129.40.199 us -98.129.40.200 - 98.129.40.207 gb -98.129.40.208 - 98.129.41.191 us -98.129.41.192 - 98.129.41.207 ae -98.129.41.208 - 98.129.42.191 us -98.129.42.192 - 98.129.42.199 il -98.129.42.200 - 98.129.43.111 us -98.129.43.112 - 98.129.43.119 ca -98.129.43.120 - 98.129.44.71 us -98.129.44.72 - 98.129.44.79 my -98.129.44.80 - 98.129.44.95 us -98.129.44.96 - 98.129.44.175 my -98.129.44.176 - 98.129.45.31 us -98.129.45.32 - 98.129.45.47 ca -98.129.45.48 - 98.129.45.55 us -98.129.45.56 - 98.129.45.63 au -98.129.45.64 - 98.129.45.79 us -98.129.45.80 - 98.129.45.87 ca -98.129.45.88 - 98.129.45.103 us -98.129.45.104 - 98.129.45.111 ph -98.129.45.112 - 98.129.46.71 us -98.129.46.72 - 98.129.46.79 ca -98.129.46.80 - 98.129.49.143 us -98.129.49.144 - 98.129.49.151 gb -98.129.49.152 - 98.129.50.31 us -98.129.50.32 - 98.129.50.39 ae -98.129.50.40 - 98.129.51.55 us -98.129.51.56 - 98.129.51.63 ca -98.129.51.64 - 98.129.52.23 us -98.129.52.24 - 98.129.52.31 ph -98.129.52.32 - 98.129.52.39 au -98.129.52.40 - 98.129.52.143 us -98.129.52.144 - 98.129.52.151 au -98.129.52.152 - 98.129.52.167 us -98.129.52.168 - 98.129.52.175 ca -98.129.52.176 - 98.129.52.231 us -98.129.52.232 - 98.129.52.239 ca -98.129.52.240 - 98.129.53.167 us -98.129.53.168 - 98.129.53.175 gb -98.129.53.176 - 98.129.54.159 us -98.129.54.160 - 98.129.54.175 ca -98.129.54.176 - 98.129.55.199 us -98.129.55.200 - 98.129.55.207 ca -98.129.55.208 - 98.129.56.255 us -98.129.57.0 - 98.129.57.7 au -98.129.57.8 - 98.129.59.7 us -98.129.59.8 - 98.129.59.15 ca -98.129.59.16 - 98.129.59.215 us -98.129.59.216 - 98.129.59.223 il -98.129.59.224 - 98.129.59.239 us -98.129.59.240 - 98.129.59.247 ca -98.129.59.248 - 98.129.60.167 us -98.129.60.168 - 98.129.60.175 ca -98.129.60.176 - 98.129.62.23 us -98.129.62.24 - 98.129.62.31 fr -98.129.62.32 - 98.129.63.183 us -98.129.63.184 - 98.129.63.191 gb -98.129.63.192 - 98.129.64.191 us -98.129.64.192 - 98.129.64.199 il -98.129.64.200 - 98.129.65.191 us -98.129.65.192 - 98.129.65.199 ch -98.129.65.200 - 98.129.65.239 us -98.129.65.240 - 98.129.65.255 in -98.129.66.0 - 98.129.66.7 us -98.129.66.8 - 98.129.66.15 au -98.129.66.16 - 98.129.67.239 us -98.129.67.240 - 98.129.67.247 in -98.129.67.248 - 98.129.68.135 us -98.129.68.136 - 98.129.68.143 ca -98.129.68.144 - 98.129.68.175 us -98.129.68.176 - 98.129.68.183 gb -98.129.68.184 - 98.129.69.39 us -98.129.69.40 - 98.129.69.47 mx -98.129.69.48 - 98.129.69.159 us -98.129.69.160 - 98.129.69.167 au -98.129.69.168 - 98.129.70.223 us -98.129.70.224 - 98.129.70.239 in -98.129.70.240 - 98.129.71.47 us -98.129.71.48 - 98.129.71.55 ca -98.129.71.56 - 98.129.71.183 us -98.129.71.184 - 98.129.71.191 gb -98.129.71.192 - 98.129.75.119 us -98.129.75.120 - 98.129.75.127 nl -98.129.75.128 - 98.129.77.159 us -98.129.77.160 - 98.129.77.167 br -98.129.77.168 - 98.129.78.151 us -98.129.78.152 - 98.129.78.159 in -98.129.78.160 - 98.129.80.87 us -98.129.80.88 - 98.129.80.95 gb -98.129.80.96 - 98.129.80.103 us -98.129.80.104 - 98.129.80.119 gb -98.129.80.120 - 98.129.80.127 ca -98.129.80.128 - 98.129.80.191 us -98.129.80.192 - 98.129.80.223 ae -98.129.80.224 - 98.129.80.231 ca -98.129.80.232 - 98.129.85.143 us -98.129.85.144 - 98.129.85.151 it -98.129.85.152 - 98.129.86.23 us -98.129.86.24 - 98.129.86.31 ca -98.129.86.32 - 98.129.86.103 us -98.129.86.104 - 98.129.86.119 ca -98.129.86.120 - 98.129.86.135 us -98.129.86.136 - 98.129.86.143 ca -98.129.86.144 - 98.129.86.247 us -98.129.86.248 - 98.129.86.255 eg -98.129.87.0 - 98.129.87.47 us -98.129.87.48 - 98.129.87.55 in -98.129.87.56 - 98.129.87.71 us -98.129.87.72 - 98.129.87.79 gb -98.129.87.80 - 98.129.87.95 us -98.129.87.96 - 98.129.87.103 gb -98.129.87.104 - 98.129.87.215 us -98.129.87.216 - 98.129.87.223 gb -98.129.87.224 - 98.129.87.255 us -98.129.88.0 - 98.129.88.7 gb -98.129.88.8 - 98.129.88.39 us -98.129.88.40 - 98.129.88.47 au -98.129.88.48 - 98.129.88.55 ca -98.129.88.56 - 98.129.89.127 us -98.129.89.128 - 98.129.89.135 au -98.129.89.136 - 98.129.89.151 us -98.129.89.152 - 98.129.89.159 gb -98.129.89.160 - 98.129.89.215 us -98.129.89.216 - 98.129.89.223 ca -98.129.89.224 - 98.129.90.23 us -98.129.90.24 - 98.129.90.31 ca -98.129.90.32 - 98.129.90.239 us -98.129.90.240 - 98.129.91.31 bd -98.129.91.32 - 98.129.91.39 us -98.129.91.40 - 98.129.91.47 bo -98.129.91.48 - 98.129.91.191 us -98.129.91.192 - 98.129.91.199 ca -98.129.91.200 - 98.129.91.255 us -98.129.92.0 - 98.129.92.7 au -98.129.92.8 - 98.129.92.239 us -98.129.92.240 - 98.129.92.247 ca -98.129.92.248 - 98.129.95.119 us -98.129.95.120 - 98.129.95.127 nz -98.129.95.128 - 98.129.95.159 us -98.129.95.160 - 98.129.95.167 in -98.129.95.168 - 98.129.95.247 us -98.129.95.248 - 98.129.95.255 nz -98.129.96.0 - 98.129.96.31 us -98.129.96.32 - 98.129.96.47 ae -98.129.96.48 - 98.129.97.127 us -98.129.97.128 - 98.129.97.135 au -98.129.97.136 - 98.129.98.87 us -98.129.98.88 - 98.129.98.95 ca -98.129.98.96 - 98.129.98.103 us -98.129.98.104 - 98.129.98.111 ca -98.129.98.112 - 98.129.99.159 us -98.129.99.160 - 98.129.99.167 bd -98.129.99.168 - 98.129.101.31 us -98.129.101.32 - 98.129.101.39 il -98.129.101.40 - 98.129.101.47 gb -98.129.101.48 - 98.129.101.135 us -98.129.101.136 - 98.129.101.143 au -98.129.101.144 - 98.129.101.151 us -98.129.101.152 - 98.129.101.159 il -98.129.101.160 - 98.129.101.183 us -98.129.101.184 - 98.129.101.191 gb -98.129.101.192 - 98.129.102.87 us -98.129.102.88 - 98.129.102.95 ca -98.129.102.96 - 98.129.102.223 us -98.129.102.224 - 98.129.102.231 mx -98.129.102.232 - 98.129.103.143 us -98.129.103.144 - 98.129.103.151 ca -98.129.103.152 - 98.129.103.175 us -98.129.103.176 - 98.129.103.191 ca -98.129.103.192 - 98.129.103.239 us -98.129.103.240 - 98.129.103.255 ie -98.129.104.0 - 98.129.104.167 us -98.129.104.168 - 98.129.104.175 mx -98.129.104.176 - 98.129.105.63 us -98.129.105.64 - 98.129.105.71 gb -98.129.105.72 - 98.129.105.207 us -98.129.105.208 - 98.129.105.215 in -98.129.105.216 - 98.129.106.191 us -98.129.106.192 - 98.129.106.199 my -98.129.106.200 - 98.129.107.175 us -98.129.107.176 - 98.129.107.183 bd -98.129.107.184 - 98.129.108.23 us -98.129.108.24 - 98.129.108.31 nz -98.129.108.32 - 98.129.109.247 us -98.129.109.248 - 98.129.109.255 gb -98.129.110.0 - 98.129.110.47 us -98.129.110.48 - 98.129.110.55 se -98.129.110.56 - 98.129.110.71 us -98.129.110.72 - 98.129.110.79 ca -98.129.110.80 - 98.129.113.63 us -98.129.113.64 - 98.129.113.71 se -98.129.113.72 - 98.129.113.95 us -98.129.113.96 - 98.129.113.103 ca -98.129.113.104 - 98.129.114.183 us -98.129.114.184 - 98.129.114.191 ca -98.129.114.192 - 98.129.114.255 us -98.129.115.0 - 98.129.115.7 au -98.129.115.8 - 98.129.115.39 us -98.129.115.40 - 98.129.115.47 gb -98.129.115.48 - 98.129.116.55 us -98.129.116.56 - 98.129.116.63 sg -98.129.116.64 - 98.129.116.71 us -98.129.116.72 - 98.129.116.79 gb -98.129.116.80 - 98.129.116.103 us -98.129.116.104 - 98.129.116.111 nz -98.129.116.112 - 98.129.117.7 us -98.129.117.8 - 98.129.117.15 in -98.129.117.16 - 98.129.117.87 us -98.129.117.88 - 98.129.117.95 ca -98.129.117.96 - 98.129.117.231 us -98.129.117.232 - 98.129.117.239 ar -98.129.117.240 - 98.129.120.119 us -98.129.120.120 - 98.129.120.127 in -98.129.120.128 - 98.129.121.39 us -98.129.121.40 - 98.129.121.47 sg -98.129.121.48 - 98.129.122.47 us -98.129.122.48 - 98.129.122.55 bd -98.129.122.56 - 98.129.122.111 us -98.129.122.112 - 98.129.122.119 gb -98.129.122.120 - 98.129.123.95 us -98.129.123.96 - 98.129.123.127 ca -98.129.123.128 - 98.129.124.175 us -98.129.124.176 - 98.129.124.183 ca -98.129.124.184 - 98.129.124.191 us -98.129.124.192 - 98.129.124.223 bd -98.129.124.224 - 98.129.125.31 us -98.129.125.32 - 98.129.125.47 bd -98.129.125.48 - 98.129.126.63 us -98.129.126.64 - 98.129.126.71 ca -98.129.126.72 - 98.129.126.95 us -98.129.126.96 - 98.129.126.103 in -98.129.126.104 - 98.129.126.111 gb -98.129.126.112 - 98.129.127.31 us -98.129.127.32 - 98.129.127.39 ar -98.129.127.40 - 98.129.127.199 us -98.129.127.200 - 98.129.127.207 ca -98.129.127.208 - 98.129.129.191 us -98.129.129.192 - 98.129.129.199 nz -98.129.129.200 - 98.129.129.207 ca -98.129.129.208 - 98.129.130.127 us -98.129.130.128 - 98.129.130.135 gb -98.129.130.136 - 98.129.130.191 us -98.129.130.192 - 98.129.130.223 bd -98.129.130.224 - 98.129.131.47 us -98.129.131.48 - 98.129.131.63 za -98.129.131.64 - 98.129.131.79 us -98.129.131.80 - 98.129.131.87 gb -98.129.131.88 - 98.129.131.159 us -98.129.131.160 - 98.129.131.167 gb -98.129.131.168 - 98.129.131.215 us -98.129.131.216 - 98.129.131.223 gu -98.129.131.224 - 98.129.132.127 us -98.129.132.128 - 98.129.132.159 ca -98.129.132.160 - 98.129.132.199 us -98.129.132.200 - 98.129.132.207 in -98.129.132.208 - 98.129.133.71 us -98.129.133.72 - 98.129.133.79 gu -98.129.133.80 - 98.129.133.151 us -98.129.133.152 - 98.129.133.159 au -98.129.133.160 - 98.129.134.111 us -98.129.134.112 - 98.129.134.127 gb -98.129.134.128 - 98.129.134.255 us -98.129.135.0 - 98.129.135.7 ca -98.129.135.8 - 98.129.135.15 us -98.129.135.16 - 98.129.135.23 in -98.129.135.24 - 98.129.135.31 gb -98.129.135.32 - 98.129.135.71 us -98.129.135.72 - 98.129.135.79 jm -98.129.135.80 - 98.129.135.111 us -98.129.135.112 - 98.129.135.127 gb -98.129.135.128 - 98.129.135.191 us -98.129.135.192 - 98.129.135.199 gb -98.129.135.200 - 98.129.136.255 us -98.129.137.0 - 98.129.137.7 ca -98.129.137.8 - 98.129.137.47 us -98.129.137.48 - 98.129.137.55 za -98.129.137.56 - 98.129.137.63 ca -98.129.137.64 - 98.129.138.31 us -98.129.138.32 - 98.129.138.39 gb -98.129.138.40 - 98.129.138.63 us -98.129.138.64 - 98.129.138.71 ca -98.129.138.72 - 98.129.138.79 us -98.129.138.80 - 98.129.138.87 nz -98.129.138.88 - 98.129.138.119 us -98.129.138.120 - 98.129.138.127 cn -98.129.138.128 - 98.129.138.159 us -98.129.138.160 - 98.129.138.167 gb -98.129.138.168 - 98.129.138.215 us -98.129.138.216 - 98.129.138.223 ph -98.129.138.224 - 98.129.139.31 us -98.129.139.32 - 98.129.139.39 gb -98.129.139.40 - 98.129.140.143 us -98.129.140.144 - 98.129.140.159 au -98.129.140.160 - 98.129.141.31 us -98.129.141.32 - 98.129.141.39 mx -98.129.141.40 - 98.129.141.159 us -98.129.141.160 - 98.129.141.167 jm -98.129.141.168 - 98.129.142.199 us -98.129.142.200 - 98.129.142.207 gb -98.129.142.208 - 98.129.144.47 us -98.129.144.48 - 98.129.144.55 gb -98.129.144.56 - 98.129.144.191 us -98.129.144.192 - 98.129.144.199 mx -98.129.144.200 - 98.129.144.255 us -98.129.145.0 - 98.129.145.7 gb -98.129.145.8 - 98.129.145.103 us -98.129.145.104 - 98.129.145.111 gb -98.129.145.112 - 98.129.145.127 us -98.129.145.128 - 98.129.145.135 ca -98.129.145.136 - 98.129.145.255 us -98.129.146.0 - 98.129.146.7 nz -98.129.146.8 - 98.129.146.39 us -98.129.146.40 - 98.129.146.47 in -98.129.146.48 - 98.129.147.207 us -98.129.147.208 - 98.129.147.215 gb -98.129.147.216 - 98.129.148.167 us -98.129.148.168 - 98.129.148.175 ca -98.129.148.176 - 98.129.151.39 us -98.129.151.40 - 98.129.151.47 ca -98.129.151.48 - 98.129.151.159 us -98.129.151.160 - 98.129.151.167 ca -98.129.151.168 - 98.129.151.215 us -98.129.151.216 - 98.129.151.223 mx -98.129.151.224 - 98.129.152.63 us -98.129.152.64 - 98.129.152.71 in -98.129.152.72 - 98.129.152.79 mx -98.129.152.80 - 98.129.153.71 us -98.129.153.72 - 98.129.153.79 gb -98.129.153.80 - 98.129.153.159 us -98.129.153.160 - 98.129.153.183 au -98.129.153.184 - 98.129.154.223 us -98.129.154.224 - 98.129.154.231 br -98.129.154.232 - 98.129.155.95 us -98.129.155.96 - 98.129.155.103 my -98.129.155.104 - 98.129.155.143 us -98.129.155.144 - 98.129.155.151 gb -98.129.155.152 - 98.129.155.159 us -98.129.155.160 - 98.129.155.167 il -98.129.155.168 - 98.129.155.199 us -98.129.155.200 - 98.129.155.207 ca -98.129.155.208 - 98.129.161.207 us -98.129.161.208 - 98.129.161.223 gb -98.129.161.224 - 98.129.162.135 us -98.129.162.136 - 98.129.162.143 au -98.129.162.144 - 98.129.162.255 us -98.129.163.0 - 98.129.163.7 mx -98.129.163.8 - 98.129.163.95 us -98.129.163.96 - 98.129.163.103 ca -98.129.163.104 - 98.129.168.207 us -98.129.168.208 - 98.129.168.223 ca -98.129.168.224 - 98.129.170.247 us -98.129.170.248 - 98.129.170.255 ca -98.129.171.0 - 98.129.171.15 us -98.129.171.16 - 98.129.171.23 ca -98.129.171.24 - 98.129.171.231 us -98.129.171.232 - 98.129.171.239 br -98.129.171.240 - 98.129.171.247 pr -98.129.171.248 - 98.129.172.111 us -98.129.172.112 - 98.129.172.119 ca -98.129.172.120 - 98.129.172.135 us -98.129.172.136 - 98.129.172.143 gb -98.129.172.144 - 98.129.173.71 us -98.129.173.72 - 98.129.173.79 mx -98.129.173.80 - 98.129.173.87 ie -98.129.173.88 - 98.129.173.207 us -98.129.173.208 - 98.129.173.215 gb -98.129.173.216 - 98.129.174.7 us -98.129.174.8 - 98.129.174.15 au -98.129.174.16 - 98.129.174.95 us -98.129.174.96 - 98.129.174.103 it -98.129.174.104 - 98.129.174.127 us -98.129.174.128 - 98.129.174.135 ca -98.129.174.136 - 98.129.175.63 us -98.129.175.64 - 98.129.175.71 ca -98.129.175.72 - 98.129.175.95 us -98.129.175.96 - 98.129.175.103 gb -98.129.175.104 - 98.129.175.215 us -98.129.175.216 - 98.129.175.223 mx -98.129.175.224 - 98.129.176.127 us -98.129.176.128 - 98.129.176.143 ca -98.129.176.144 - 98.129.176.159 us -98.129.176.160 - 98.129.176.175 gb -98.129.176.176 - 98.129.186.23 us -98.129.186.24 - 98.129.186.31 ie -98.129.186.32 - 98.129.186.39 us -98.129.186.40 - 98.129.186.47 au -98.129.186.48 - 98.129.187.7 us -98.129.187.8 - 98.129.187.15 in -98.129.187.16 - 98.129.187.47 us -98.129.187.48 - 98.129.187.55 ca -98.129.187.56 - 98.129.188.127 us -98.129.188.128 - 98.129.188.135 gb -98.129.188.136 - 98.129.190.63 us -98.129.190.64 - 98.129.190.71 ca -98.129.190.72 - 98.129.191.103 us -98.129.191.104 - 98.129.191.111 br -98.129.191.112 - 98.129.191.119 us -98.129.191.120 - 98.129.191.127 br -98.129.191.128 - 98.129.191.255 ca -98.129.192.0 - 98.129.193.151 us -98.129.193.152 - 98.129.193.159 ca -98.129.193.160 - 98.129.194.191 us -98.129.194.192 - 98.129.194.199 nl -98.129.194.200 - 98.129.194.231 us -98.129.194.232 - 98.129.194.239 nl -98.129.194.240 - 98.129.195.39 us -98.129.195.40 - 98.129.195.47 gb -98.129.195.48 - 98.129.195.111 us -98.129.195.112 - 98.129.195.119 gb -98.129.195.120 - 98.129.195.127 mx -98.129.195.128 - 98.129.195.143 us -98.129.195.144 - 98.129.195.151 ca -98.129.195.152 - 98.129.195.175 us -98.129.195.176 - 98.129.195.183 gb -98.129.195.184 - 98.129.197.39 us -98.129.197.40 - 98.129.197.47 nl -98.129.197.48 - 98.129.198.23 us -98.129.198.24 - 98.129.198.31 mx -98.129.198.32 - 98.129.198.63 us -98.129.198.64 - 98.129.198.71 gb -98.129.198.72 - 98.129.198.159 us -98.129.198.160 - 98.129.198.167 jp -98.129.198.168 - 98.129.198.191 us -98.129.198.192 - 98.129.198.199 pk -98.129.198.200 - 98.129.199.39 us -98.129.199.40 - 98.129.199.47 mt -98.129.199.48 - 98.129.199.79 us -98.129.199.80 - 98.129.199.87 mt -98.129.199.88 - 98.129.199.183 us -98.129.199.184 - 98.129.199.191 ca -98.129.199.192 - 98.129.199.199 gb -98.129.199.200 - 98.129.199.207 us -98.129.199.208 - 98.129.199.215 in -98.129.199.216 - 98.129.199.223 za -98.129.199.224 - 98.129.199.231 in -98.129.199.232 - 98.129.201.31 us -98.129.201.32 - 98.129.201.39 ca -98.129.201.40 - 98.129.202.255 us -98.129.203.0 - 98.129.203.255 ca -98.129.204.0 - 98.129.206.15 us -98.129.206.16 - 98.129.206.23 ca -98.129.206.24 - 98.129.206.87 us -98.129.206.88 - 98.129.206.95 mx -98.129.206.96 - 98.129.207.23 us -98.129.207.24 - 98.129.207.31 gb -98.129.207.32 - 98.129.207.39 us -98.129.207.40 - 98.129.207.47 na -98.129.207.48 - 98.129.207.63 us -98.129.207.64 - 98.129.207.71 gb -98.129.207.72 - 98.129.209.63 us -98.129.209.64 - 98.129.209.71 ca -98.129.209.72 - 98.129.209.103 us -98.129.209.104 - 98.129.209.111 ch -98.129.209.112 - 98.129.209.127 us -98.129.209.128 - 98.129.209.135 ca -98.129.209.136 - 98.129.209.231 us -98.129.209.232 - 98.129.209.239 mx -98.129.209.240 - 98.129.210.31 us -98.129.210.32 - 98.129.210.39 gb -98.129.210.40 - 98.129.211.63 us -98.129.211.64 - 98.129.211.71 in -98.129.211.72 - 98.129.211.159 us -98.129.211.160 - 98.129.211.167 nz -98.129.211.168 - 98.129.213.111 us -98.129.213.112 - 98.129.213.119 ke -98.129.213.120 - 98.129.213.191 us -98.129.213.192 - 98.129.213.207 in -98.129.213.208 - 98.129.214.95 us -98.129.214.96 - 98.129.214.103 in -98.129.214.104 - 98.129.216.7 us -98.129.216.8 - 98.129.216.15 au -98.129.216.16 - 98.129.216.71 us -98.129.216.72 - 98.129.216.79 ca -98.129.216.80 - 98.129.217.143 us -98.129.217.144 - 98.129.217.151 in -98.129.217.152 - 98.129.217.175 us -98.129.217.176 - 98.129.217.183 mt -98.129.217.184 - 98.129.218.215 us -98.129.218.216 - 98.129.218.223 ke -98.129.218.224 - 98.129.218.247 us -98.129.218.248 - 98.129.218.255 gb -98.129.219.0 - 98.129.219.31 us -98.129.219.32 - 98.129.219.39 in -98.129.219.40 - 98.129.219.199 us -98.129.219.200 - 98.129.219.207 ch -98.129.219.208 - 98.129.225.87 us -98.129.225.88 - 98.129.225.95 sg -98.129.225.96 - 98.129.225.119 us -98.129.225.120 - 98.129.225.127 br -98.129.225.128 - 98.129.225.191 us -98.129.225.192 - 98.129.225.199 mx -98.129.225.200 - 98.129.225.207 no -98.129.225.208 - 98.129.232.39 us -98.129.232.40 - 98.129.232.47 ca -98.129.232.48 - 98.129.233.87 us -98.129.233.88 - 98.129.233.95 gb -98.129.233.96 - 98.129.233.199 us -98.129.233.200 - 98.129.233.207 ca -98.129.233.208 - 98.129.234.239 us -98.129.234.240 - 98.129.234.247 ca -98.129.234.248 - 98.129.234.255 us -98.129.235.0 - 98.129.235.7 gb -98.129.235.8 - 98.129.235.39 us -98.129.235.40 - 98.129.235.47 il -98.129.235.48 - 98.142.239.255 us +98.126.223.0 - 98.142.107.255 us +98.142.108.0 - 98.142.108.247 fr +98.142.108.248 - 98.142.108.255 us +98.142.109.0 - 98.142.109.255 il +98.142.110.0 - 98.142.239.255 us 98.142.240.0 - 98.142.255.255 ca 98.143.0.0 - 98.143.63.255 us -98.143.64.0 - 98.143.83.255 ca -98.143.84.0 - 98.143.84.7 us -98.143.84.8 - 98.143.111.255 ca +98.143.64.0 - 98.143.111.255 ca 98.143.112.0 - 98.143.127.255 us 98.143.128.0 - 98.143.143.255 ca -98.143.144.0 - 98.143.207.255 us +98.143.144.0 - 98.143.159.255 us +98.143.176.0 - 98.143.207.255 us 98.143.208.0 - 98.143.223.255 ca 98.143.224.0 - 98.143.239.255 us 98.143.240.0 - 98.143.255.255 ca @@ -62970,122 +36730,22 @@ 98.158.96.0 - 98.158.111.255 vg 98.158.112.0 - 98.158.127.255 us 98.158.128.0 - 98.158.143.255 ca -98.158.144.0 - 98.158.239.63 us -98.158.239.64 - 98.158.239.95 ca -98.158.239.96 - 98.159.40.191 us -98.159.40.192 - 98.159.40.223 gb -98.159.40.224 - 98.159.47.31 us -98.159.47.32 - 98.159.47.47 ca -98.159.47.48 - 98.159.47.63 us -98.159.47.64 - 98.159.47.95 ba -98.159.47.96 - 98.159.239.255 us +98.158.144.0 - 98.159.239.255 us 98.159.240.0 - 98.159.255.255 ca -98.160.0.0 - 99.74.152.215 us -99.74.152.216 - 99.74.152.223 a2 -99.74.152.224 - 99.191.255.255 us +98.160.0.0 - 99.191.255.255 us 99.192.0.0 - 99.192.127.255 ca -99.192.128.0 - 99.192.136.95 us -99.192.136.96 - 99.192.136.127 cr -99.192.136.128 - 99.192.136.143 ca -99.192.136.144 - 99.192.136.191 us -99.192.136.192 - 99.192.136.207 ca -99.192.136.208 - 99.192.136.223 pl -99.192.136.224 - 99.192.137.31 us -99.192.137.32 - 99.192.137.47 gb -99.192.137.48 - 99.192.137.127 us -99.192.137.128 - 99.192.137.143 ca -99.192.137.144 - 99.192.138.15 us -99.192.138.16 - 99.192.138.47 gb -99.192.138.48 - 99.192.138.95 us -99.192.138.96 - 99.192.138.127 nl -99.192.138.128 - 99.192.138.143 ca -99.192.138.144 - 99.192.139.15 us -99.192.139.16 - 99.192.139.31 ca -99.192.139.32 - 99.192.139.95 us -99.192.139.96 - 99.192.139.127 nl -99.192.139.128 - 99.192.140.15 us -99.192.140.16 - 99.192.140.31 ca -99.192.140.32 - 99.192.141.15 us -99.192.141.16 - 99.192.141.31 ca -99.192.141.32 - 99.192.141.95 us -99.192.141.96 - 99.192.141.127 ca -99.192.141.128 - 99.192.142.15 us -99.192.142.16 - 99.192.142.31 ca -99.192.142.32 - 99.192.142.47 us -99.192.142.48 - 99.192.142.63 ca -99.192.142.64 - 99.192.142.127 us -99.192.142.128 - 99.192.142.255 gb -99.192.143.0 - 99.192.154.127 us -99.192.154.128 - 99.192.154.191 ca -99.192.154.192 - 99.192.154.255 us -99.192.155.0 - 99.192.155.31 ca -99.192.155.32 - 99.192.155.111 us -99.192.155.112 - 99.192.155.191 gb -99.192.155.192 - 99.192.156.31 us -99.192.156.32 - 99.192.156.47 at -99.192.156.48 - 99.192.156.79 us -99.192.156.80 - 99.192.156.95 gb -99.192.156.96 - 99.192.156.111 ru -99.192.156.112 - 99.192.156.127 us -99.192.156.128 - 99.192.156.191 mt -99.192.156.192 - 99.192.157.79 us -99.192.157.80 - 99.192.157.95 cz -99.192.157.96 - 99.192.157.127 ca -99.192.157.128 - 99.192.157.255 cz -99.192.158.0 - 99.192.158.47 us -99.192.158.48 - 99.192.158.63 ca -99.192.158.64 - 99.192.158.79 au -99.192.158.80 - 99.192.158.111 us -99.192.158.112 - 99.192.158.127 ca -99.192.158.128 - 99.192.159.255 us -99.192.160.0 - 99.192.160.15 ca -99.192.160.16 - 99.192.160.47 us -99.192.160.48 - 99.192.160.63 gb -99.192.160.64 - 99.192.160.127 us -99.192.160.128 - 99.192.160.191 ca -99.192.160.192 - 99.192.162.255 us -99.192.163.0 - 99.192.163.15 ca -99.192.163.16 - 99.192.163.31 hr -99.192.163.32 - 99.192.163.79 us -99.192.163.80 - 99.192.163.95 ca -99.192.163.96 - 99.192.163.159 us -99.192.163.160 - 99.192.163.191 nl -99.192.163.192 - 99.192.166.95 us -99.192.166.96 - 99.192.166.111 pl -99.192.166.112 - 99.192.166.175 us -99.192.166.176 - 99.192.166.191 gb -99.192.166.192 - 99.192.168.255 us -99.192.169.0 - 99.192.169.255 lt -99.192.170.0 - 99.192.173.95 us -99.192.173.96 - 99.192.173.127 ca -99.192.173.128 - 99.192.174.255 us -99.192.175.0 - 99.192.175.255 lt -99.192.176.0 - 99.192.176.31 us -99.192.176.32 - 99.192.176.47 ec -99.192.176.48 - 99.192.178.31 us -99.192.178.32 - 99.192.178.47 ca -99.192.178.48 - 99.192.179.63 us -99.192.179.64 - 99.192.179.127 ca -99.192.179.128 - 99.192.180.127 us -99.192.180.128 - 99.192.180.191 nl -99.192.180.192 - 99.192.181.127 us -99.192.181.128 - 99.192.181.191 ca -99.192.181.192 - 99.192.196.255 us -99.192.197.0 - 99.192.197.255 lt -99.192.198.0 - 99.192.198.255 a1 -99.192.199.0 - 99.192.199.47 us -99.192.199.48 - 99.192.199.63 ca -99.192.199.64 - 99.192.218.127 us -99.192.218.128 - 99.192.218.191 ca -99.192.218.192 - 99.192.226.191 us -99.192.226.192 - 99.192.226.255 sc -99.192.227.0 - 99.192.247.255 us -99.192.248.0 - 99.192.248.127 ec -99.192.248.128 - 99.198.255.255 us +99.192.128.0 - 99.192.206.255 us +99.192.207.0 - 99.192.207.255 ca +99.192.208.0 - 99.198.255.255 us 99.199.0.0 - 99.199.255.255 ca 99.200.0.0 - 99.207.255.255 us 99.208.0.0 - 99.255.255.255 ca -100.0.0.0 - 100.63.255.255 us +100.0.0.0 - 100.42.239.255 us +100.42.240.0 - 100.42.255.255 ca +100.43.0.0 - 100.43.95.255 us +100.43.96.0 - 100.43.127.255 ca +100.43.128.0 - 100.63.255.255 us +100.128.0.0 - 100.255.255.255 us 101.0.0.0 - 101.0.3.255 cn 101.0.4.0 - 101.0.7.255 id 101.0.8.0 - 101.0.31.255 jp @@ -63110,7 +36770,8 @@ 101.8.0.0 - 101.15.255.255 tw 101.16.0.0 - 101.49.255.255 cn 101.50.0.0 - 101.50.3.255 id -101.50.4.0 - 101.50.15.255 jp +101.50.4.0 - 101.50.7.255 jp +101.50.8.0 - 101.50.15.255 cn 101.50.16.0 - 101.50.31.255 id 101.50.32.0 - 101.50.55.255 jp 101.50.56.0 - 101.50.59.255 cn @@ -63124,7 +36785,8 @@ 101.53.96.0 - 101.53.99.255 jp 101.53.100.0 - 101.53.103.255 cn 101.53.104.0 - 101.53.127.255 jp -101.53.128.0 - 101.53.255.255 au +101.53.128.0 - 101.53.159.255 in +101.53.160.0 - 101.53.255.255 au 101.54.0.0 - 101.54.255.255 cn 101.55.0.0 - 101.55.127.255 kr 101.55.128.0 - 101.55.223.255 jp @@ -63151,7 +36813,8 @@ 101.99.64.0 - 101.99.95.255 my 101.99.96.0 - 101.99.127.255 cn 101.99.128.0 - 101.99.255.255 gu -101.100.0.0 - 101.100.255.255 nz +101.100.0.0 - 101.100.159.255 nz +101.100.160.0 - 101.100.255.255 sg 101.101.0.0 - 101.101.63.255 nc 101.101.64.0 - 101.101.95.255 cn 101.101.96.0 - 101.101.99.255 hk @@ -63176,7 +36839,7 @@ 101.110.128.0 - 101.111.255.255 jp 101.112.0.0 - 101.119.255.255 au 101.120.0.0 - 101.126.255.255 cn -101.127.0.0 - 101.127.255.255 hk +101.127.0.0 - 101.127.255.255 sg 101.128.0.0 - 101.128.3.255 cn 101.128.4.0 - 101.128.7.255 au 101.128.8.0 - 101.128.63.255 cn @@ -63186,7 +36849,14 @@ 101.136.0.0 - 101.139.255.255 tw 101.140.0.0 - 101.143.255.255 jp 101.144.0.0 - 101.159.255.255 cn -101.160.0.0 - 101.191.255.255 au +101.160.0.0 - 101.167.175.255 au +101.167.176.0 - 101.167.179.255 hk +101.167.180.0 - 101.167.183.255 sg +101.167.184.0 - 101.167.187.255 gb +101.167.188.0 - 101.167.199.255 hk +101.167.200.0 - 101.167.211.255 sg +101.167.212.0 - 101.167.223.255 gb +101.167.224.0 - 101.191.255.255 au 101.192.0.0 - 101.201.255.255 cn 101.202.0.0 - 101.202.255.255 kr 101.203.0.0 - 101.203.127.255 jp @@ -63209,6 +36879,7 @@ 101.251.4.0 - 101.251.7.255 np 101.251.8.0 - 101.254.255.255 cn 101.255.0.0 - 101.255.255.255 id +102.205.18.36 - 102.205.18.36 mu 103.0.0.0 - 103.1.4.255 au 103.1.5.0 - 103.1.5.255 sg 103.1.6.0 - 103.1.6.255 in @@ -63218,7 +36889,9 @@ 103.1.20.0 - 103.1.27.255 cn 103.1.28.0 - 103.1.31.255 la 103.1.32.0 - 103.1.51.255 hk -103.1.52.0 - 103.1.63.255 au +103.1.52.0 - 103.1.60.255 au +103.1.61.0 - 103.1.61.255 us +103.1.62.0 - 103.1.63.255 au 103.1.64.0 - 103.1.67.255 hk 103.1.68.0 - 103.1.71.255 my 103.1.72.0 - 103.1.75.255 cn @@ -63238,7 +36911,8 @@ 103.1.132.0 - 103.1.135.255 my 103.1.136.0 - 103.1.139.255 sg 103.1.140.0 - 103.1.143.255 jp -103.1.144.0 - 103.1.155.255 my +103.1.144.0 - 103.1.154.255 my +103.1.155.0 - 103.1.155.255 nl 103.1.156.0 - 103.1.159.255 hk 103.1.160.0 - 103.1.167.255 th 103.1.168.0 - 103.1.171.255 cn @@ -63251,7 +36925,8 @@ 103.1.204.0 - 103.1.207.255 au 103.1.208.0 - 103.1.211.255 vn 103.1.212.0 - 103.1.219.255 au -103.1.220.0 - 103.1.227.255 hk +103.1.220.0 - 103.1.223.255 tw +103.1.224.0 - 103.1.227.255 hk 103.1.228.0 - 103.1.231.255 au 103.1.232.0 - 103.1.235.255 la 103.1.236.0 - 103.1.239.255 vn @@ -63288,7 +36963,7 @@ 103.2.244.0 - 103.3.19.255 jp 103.3.20.0 - 103.3.23.255 my 103.3.24.0 - 103.3.27.255 hk -103.3.28.0 - 103.3.31.255 mn +103.3.28.0 - 103.3.31.255 jp 103.3.32.0 - 103.3.35.255 in 103.3.36.0 - 103.3.39.255 kr 103.3.40.0 - 103.3.43.255 in @@ -63305,7 +36980,8 @@ 103.3.144.0 - 103.3.147.255 au 103.3.148.0 - 103.3.159.255 cn 103.3.160.0 - 103.3.163.255 au -103.3.164.0 - 103.3.167.255 sg +103.3.164.0 - 103.3.166.255 us +103.3.167.0 - 103.3.167.255 sg 103.3.168.0 - 103.3.171.255 pg 103.3.172.0 - 103.3.175.255 my 103.3.176.0 - 103.3.179.255 th @@ -63325,11 +37001,9 @@ 103.3.244.0 - 103.3.255.255 vn 103.4.0.0 - 103.4.3.255 id 103.4.4.0 - 103.4.7.255 my -103.4.8.0 - 103.4.11.255 jp -103.4.12.0 - 103.4.15.255 sg +103.4.8.0 - 103.4.15.255 jp 103.4.16.0 - 103.4.19.255 au -103.4.20.0 - 103.4.23.255 ph -103.4.24.0 - 103.4.27.255 jp +103.4.20.0 - 103.4.27.255 hk 103.4.28.0 - 103.4.31.255 my 103.4.32.0 - 103.4.35.255 jp 103.4.36.0 - 103.4.39.255 sg @@ -63356,10 +37030,15 @@ 103.4.120.0 - 103.4.120.255 au 103.4.121.0 - 103.4.121.255 nz 103.4.122.0 - 103.4.123.255 au -103.4.124.0 - 103.4.127.255 sg +103.4.124.0 - 103.4.124.11 sg +103.4.124.12 - 103.4.124.12 ap +103.4.124.13 - 103.4.125.24 sg +103.4.125.25 - 103.4.125.25 ap +103.4.125.26 - 103.4.125.29 sg +103.4.125.30 - 103.4.125.30 ap +103.4.125.31 - 103.4.127.255 sg 103.4.128.0 - 103.4.131.255 vn -103.4.132.0 - 103.4.134.255 au -103.4.135.0 - 103.4.135.255 np +103.4.132.0 - 103.4.135.255 au 103.4.136.0 - 103.4.139.255 nz 103.4.140.0 - 103.4.143.255 my 103.4.144.0 - 103.4.147.255 bd @@ -63384,12 +37063,14 @@ 103.4.212.0 - 103.4.215.255 au 103.4.216.0 - 103.4.219.255 th 103.4.220.0 - 103.4.223.255 in -103.4.224.0 - 103.4.227.255 hk +103.4.224.0 - 103.4.227.255 cn 103.4.228.0 - 103.4.231.255 th 103.4.232.0 - 103.4.232.255 sg +103.4.233.0 - 103.4.233.255 in 103.4.234.0 - 103.4.239.255 au 103.4.240.0 - 103.4.243.255 id -103.4.244.0 - 103.4.247.255 hk +103.4.244.0 - 103.4.246.255 hk +103.4.247.0 - 103.4.247.255 us 103.4.248.0 - 103.4.255.255 in 103.5.0.0 - 103.5.7.255 ph 103.5.8.0 - 103.5.11.255 sg @@ -63403,7 +37084,10 @@ 103.5.32.0 - 103.5.35.255 tw 103.5.36.0 - 103.5.39.255 cn 103.5.40.0 - 103.5.43.255 jp -103.5.44.0 - 103.5.47.255 sg +103.5.44.0 - 103.5.44.23 tw +103.5.44.24 - 103.5.45.79 sg +103.5.45.80 - 103.5.45.95 tw +103.5.45.96 - 103.5.47.255 sg 103.5.48.0 - 103.5.51.255 id 103.5.52.0 - 103.5.59.255 cn 103.5.60.0 - 103.5.63.255 ph @@ -63413,14 +37097,14 @@ 103.5.71.0 - 103.5.75.255 nz 103.5.76.0 - 103.5.77.255 au 103.5.78.0 - 103.5.78.255 in -103.5.79.0 - 103.5.79.255 sg +103.5.79.0 - 103.5.79.255 hk 103.5.80.0 - 103.5.83.255 nz 103.5.84.0 - 103.5.87.255 in 103.5.88.0 - 103.5.99.255 au 103.5.100.0 - 103.5.103.255 tw -103.5.104.0 - 103.5.104.255 jp +103.5.104.0 - 103.5.104.255 au 103.5.105.0 - 103.5.105.255 my -103.5.106.0 - 103.5.106.255 nz +103.5.106.0 - 103.5.106.255 au 103.5.107.0 - 103.5.107.255 id 103.5.108.0 - 103.5.111.255 nz 103.5.112.0 - 103.5.115.255 in @@ -63436,17 +37120,16 @@ 103.5.149.0 - 103.5.149.255 hk 103.5.150.0 - 103.5.150.255 np 103.5.151.0 - 103.5.151.255 sg -103.5.152.0 - 103.5.155.255 jp +103.5.152.0 - 103.5.155.255 cn 103.5.156.0 - 103.5.159.255 nz 103.5.160.0 - 103.5.163.255 jp 103.5.164.0 - 103.5.167.255 au -103.5.168.0 - 103.5.171.255 tw +103.5.168.0 - 103.5.171.255 cn 103.5.172.0 - 103.5.175.255 af 103.5.176.0 - 103.5.179.255 jp 103.5.180.0 - 103.5.183.255 my 103.5.184.0 - 103.5.191.255 in -103.5.192.0 - 103.5.195.255 jp -103.5.196.0 - 103.5.197.255 af +103.5.192.0 - 103.5.195.255 cn 103.5.198.0 - 103.5.198.255 hk 103.5.199.0 - 103.5.199.255 sg 103.5.200.0 - 103.5.203.255 in @@ -63457,14 +37140,297 @@ 103.5.220.0 - 103.5.223.255 hk 103.5.224.0 - 103.5.227.255 nz 103.5.228.0 - 103.5.229.255 np -103.5.230.0 - 103.5.231.255 au +103.5.230.0 - 103.5.231.255 kh 103.5.232.0 - 103.5.235.255 bd 103.5.236.0 - 103.5.239.255 my 103.5.240.0 - 103.5.243.255 sg 103.5.244.0 - 103.5.247.255 in -103.5.248.0 - 103.5.251.255 jp +103.5.248.0 - 103.5.248.255 hk +103.5.249.0 - 103.5.249.255 jp +103.5.250.0 - 103.5.250.255 hk +103.5.251.0 - 103.5.251.255 jp 103.5.252.0 - 103.5.255.255 cn -103.10.0.0 - 103.10.3.255 cn +103.6.0.0 - 103.6.1.255 id +103.6.2.0 - 103.6.2.255 in +103.6.3.0 - 103.6.3.255 au +103.6.4.0 - 103.6.7.255 hk +103.6.8.0 - 103.6.11.255 kh +103.6.12.0 - 103.6.15.255 au +103.6.16.0 - 103.6.23.255 jp +103.6.24.0 - 103.6.25.255 au +103.6.26.0 - 103.6.27.255 in +103.6.28.0 - 103.6.31.255 nz +103.6.32.0 - 103.6.33.255 in +103.6.34.0 - 103.6.34.255 id +103.6.35.0 - 103.6.35.255 au +103.6.36.0 - 103.6.43.255 id +103.6.44.0 - 103.6.47.255 jp +103.6.48.0 - 103.6.51.255 hk +103.6.52.0 - 103.6.55.255 id +103.6.56.0 - 103.6.63.255 jp +103.6.64.0 - 103.6.65.255 nz +103.6.66.0 - 103.6.67.255 us +103.6.68.0 - 103.6.71.255 jp +103.6.72.0 - 103.6.75.255 kr +103.6.76.0 - 103.6.79.255 cn +103.6.80.0 - 103.6.83.255 kr +103.6.84.0 - 103.6.86.255 hk +103.6.87.0 - 103.6.88.255 in +103.6.89.0 - 103.6.89.255 nz +103.6.90.0 - 103.6.91.255 in +103.6.92.0 - 103.6.95.255 jp +103.6.96.0 - 103.6.99.255 ph +103.6.100.0 - 103.6.103.255 kr +103.6.104.0 - 103.6.104.255 ph +103.6.105.0 - 103.6.105.255 au +103.6.106.0 - 103.6.107.255 sg +103.6.108.0 - 103.6.111.255 cn +103.6.112.0 - 103.6.115.255 jp +103.6.116.0 - 103.6.116.255 au +103.6.117.0 - 103.6.118.255 id +103.6.119.0 - 103.6.119.255 in +103.6.124.0 - 103.6.127.255 jp +103.6.128.0 - 103.6.131.255 hk +103.6.132.0 - 103.6.135.255 in +103.6.136.0 - 103.6.143.255 hk +103.6.144.0 - 103.6.147.255 nz +103.6.148.0 - 103.6.151.255 sg +103.6.152.0 - 103.6.155.255 hk +103.6.156.0 - 103.6.159.255 in +103.6.160.0 - 103.6.161.255 hk +103.6.162.0 - 103.6.162.255 th +103.6.163.0 - 103.6.163.255 my +103.6.164.0 - 103.6.164.255 in +103.6.165.0 - 103.6.165.255 th +103.6.166.0 - 103.6.166.255 hk +103.6.167.0 - 103.6.171.255 in +103.6.172.0 - 103.6.175.255 kr +103.6.176.0 - 103.6.179.255 hk +103.6.180.0 - 103.6.180.255 id +103.6.181.0 - 103.6.181.255 ph +103.6.182.0 - 103.6.183.255 th +103.6.184.0 - 103.6.187.255 in +103.6.188.0 - 103.6.191.255 au +103.6.192.0 - 103.6.195.255 hk +103.6.196.0 - 103.6.199.255 my +103.6.200.0 - 103.6.207.255 id +103.6.208.0 - 103.6.211.255 au +103.6.212.0 - 103.6.213.255 nz +103.6.214.0 - 103.6.214.255 id +103.6.215.0 - 103.6.219.255 au +103.6.220.0 - 103.6.223.255 cn +103.6.224.0 - 103.6.227.255 jp +103.6.228.0 - 103.6.231.255 cn +103.6.232.0 - 103.6.235.255 nl +103.6.236.0 - 103.6.239.255 my +103.6.240.0 - 103.6.243.255 jp +103.6.244.0 - 103.6.247.255 my +103.6.248.0 - 103.6.251.255 ph +103.6.252.0 - 103.6.255.255 au +103.7.0.0 - 103.7.1.255 id +103.7.2.0 - 103.7.2.255 sg +103.7.3.0 - 103.7.3.255 in +103.7.4.0 - 103.7.7.255 cn +103.7.8.0 - 103.7.11.255 sg +103.7.12.0 - 103.7.15.255 id +103.7.16.0 - 103.7.19.255 th +103.7.20.0 - 103.7.23.255 jp +103.7.24.0 - 103.7.27.255 kh +103.7.28.0 - 103.7.31.255 cn +103.7.32.0 - 103.7.35.255 kr +103.7.36.0 - 103.7.43.255 vn +103.7.44.0 - 103.7.51.255 au +103.7.52.0 - 103.7.53.255 id +103.7.54.0 - 103.7.55.255 hk +103.7.56.0 - 103.7.59.255 th +103.7.60.0 - 103.7.63.255 pk +103.7.64.0 - 103.7.67.255 in +103.7.68.0 - 103.7.71.255 my +103.7.72.0 - 103.7.75.255 au +103.7.76.0 - 103.7.79.255 pk +103.7.80.0 - 103.7.83.255 in +103.7.84.0 - 103.7.87.255 id +103.7.88.0 - 103.7.91.255 au +103.7.92.0 - 103.7.95.255 jp +103.7.96.0 - 103.7.97.255 nz +103.7.98.0 - 103.7.99.255 au +103.7.100.0 - 103.7.103.255 gu +103.7.104.0 - 103.7.107.255 af +103.7.108.0 - 103.7.111.255 in +103.7.112.0 - 103.7.115.255 bd +103.7.116.0 - 103.7.119.255 jp +103.7.124.0 - 103.7.127.255 sg +103.7.128.0 - 103.7.131.255 in +103.7.132.0 - 103.7.135.255 jp +103.7.136.0 - 103.7.139.255 au +103.7.140.0 - 103.7.143.255 cn +103.7.144.0 - 103.7.144.255 kh +103.7.145.0 - 103.7.145.255 in +103.7.146.0 - 103.7.146.255 ph +103.7.147.0 - 103.7.147.255 au +103.7.148.0 - 103.7.151.255 in +103.7.152.0 - 103.7.155.255 jp +103.7.156.0 - 103.7.159.255 my +103.7.160.0 - 103.7.163.255 hk +103.7.164.0 - 103.7.167.255 au +103.7.168.0 - 103.7.171.255 nz +103.7.172.0 - 103.7.172.255 vn +103.7.173.0 - 103.7.173.255 id +103.7.174.0 - 103.7.175.255 vn +103.7.176.0 - 103.7.176.255 id +103.7.177.0 - 103.7.177.255 vn +103.7.178.0 - 103.7.179.255 id +103.7.180.0 - 103.7.183.255 in +103.7.184.0 - 103.7.187.255 id +103.7.188.0 - 103.7.189.255 au +103.7.190.0 - 103.7.191.255 kr +103.7.192.0 - 103.7.195.255 au +103.7.196.0 - 103.7.196.255 vn +103.7.197.0 - 103.7.197.255 vu +103.7.198.0 - 103.7.199.255 jp +103.7.200.0 - 103.7.203.255 sg +103.7.204.0 - 103.7.207.255 in +103.7.208.0 - 103.7.211.255 jp +103.7.212.0 - 103.7.223.255 cn +103.7.224.0 - 103.7.224.255 ph +103.7.225.0 - 103.7.231.255 id +103.7.232.0 - 103.7.235.255 au +103.7.236.0 - 103.7.239.255 jp +103.7.240.0 - 103.7.243.255 hk +103.7.244.0 - 103.7.247.255 kr +103.7.248.0 - 103.7.251.255 bd +103.7.252.0 - 103.7.255.255 bt +103.8.4.0 - 103.8.11.255 cn +103.8.12.0 - 103.8.12.255 id +103.8.13.0 - 103.8.13.255 vn +103.8.14.0 - 103.8.15.255 pk +103.8.16.0 - 103.8.19.255 nz +103.8.20.0 - 103.8.23.255 jp +103.8.24.0 - 103.8.27.255 my +103.8.28.0 - 103.8.29.255 au +103.8.30.0 - 103.8.31.255 sg +103.8.32.0 - 103.8.35.255 cn +103.8.36.0 - 103.8.47.255 in +103.8.48.0 - 103.8.51.255 jp +103.8.52.0 - 103.8.55.255 cn +103.8.56.0 - 103.8.59.255 id +103.8.60.0 - 103.8.60.255 mn +103.8.61.0 - 103.8.61.255 au +103.8.62.0 - 103.8.62.255 in +103.8.63.0 - 103.8.63.255 id +103.8.64.0 - 103.8.67.255 jp +103.8.68.0 - 103.8.71.255 cn +103.8.72.0 - 103.8.73.255 nz +103.8.74.0 - 103.8.79.255 id +103.8.80.0 - 103.8.83.255 nz +103.8.84.0 - 103.8.95.255 jp +103.8.96.0 - 103.8.99.255 id +103.8.100.0 - 103.8.103.255 kr +103.8.104.0 - 103.8.107.255 tw +103.8.108.0 - 103.8.111.255 cn +103.8.112.0 - 103.8.115.255 pk +103.8.116.0 - 103.8.119.255 in +103.8.120.0 - 103.8.120.255 sg +103.8.121.0 - 103.8.121.255 bd +103.8.122.0 - 103.8.122.255 id +103.8.123.0 - 103.8.127.255 in +103.8.128.0 - 103.8.131.255 th +103.8.132.0 - 103.8.139.255 au +103.8.140.0 - 103.8.143.255 nz +103.8.144.0 - 103.8.147.255 my +103.8.148.0 - 103.8.151.255 in +103.8.152.0 - 103.8.155.255 sg +103.8.156.0 - 103.8.159.255 cn +103.8.160.0 - 103.8.163.255 my +103.8.164.0 - 103.8.167.255 in +103.8.168.0 - 103.8.175.255 au +103.8.176.0 - 103.8.183.55 sg +103.8.183.56 - 103.8.183.63 jp +103.8.183.64 - 103.8.183.255 sg +103.8.184.0 - 103.8.187.255 jp +103.8.188.0 - 103.8.189.255 in +103.8.190.0 - 103.8.190.255 jp +103.8.191.0 - 103.8.191.255 hk +103.8.192.0 - 103.8.195.255 in +103.8.196.0 - 103.8.199.255 jp +103.8.200.0 - 103.8.207.255 cn +103.8.208.0 - 103.8.211.255 th +103.8.212.0 - 103.8.213.255 sg +103.8.214.0 - 103.8.214.255 pk +103.8.215.0 - 103.8.219.255 in +103.8.220.0 - 103.8.223.255 cn +103.8.224.0 - 103.8.228.255 id +103.8.229.0 - 103.8.229.255 au +103.8.230.0 - 103.8.230.255 kr +103.8.231.0 - 103.8.231.255 pk +103.8.232.0 - 103.8.235.255 nz +103.8.236.0 - 103.8.237.255 au +103.8.238.0 - 103.8.238.255 id +103.8.239.0 - 103.8.239.255 au +103.8.240.0 - 103.8.243.255 jp +103.8.244.0 - 103.8.247.255 id +103.8.248.0 - 103.8.251.255 in +103.8.252.0 - 103.8.255.255 nz +103.9.0.0 - 103.9.7.255 vn +103.9.8.0 - 103.9.11.255 cn +103.9.12.0 - 103.9.15.255 in +103.9.16.0 - 103.9.21.255 au +103.9.22.0 - 103.9.22.255 id +103.9.23.0 - 103.9.23.255 pk +103.9.24.0 - 103.9.27.255 cn +103.9.28.0 - 103.9.31.255 jp +103.9.32.0 - 103.9.35.255 kr +103.9.36.0 - 103.9.39.255 id +103.9.40.0 - 103.9.43.255 nz +103.9.44.0 - 103.9.47.255 id +103.9.48.0 - 103.9.49.255 au +103.9.50.0 - 103.9.50.255 sb +103.9.51.0 - 103.9.51.255 my +103.9.52.0 - 103.9.71.255 au +103.9.72.0 - 103.9.75.255 in +103.9.76.0 - 103.9.87.255 vn +103.9.88.0 - 103.9.91.255 mn +103.9.92.0 - 103.9.99.255 jp +103.9.100.0 - 103.9.103.255 sg +103.9.104.0 - 103.9.105.255 bd +103.9.106.0 - 103.9.106.255 nz +103.9.107.0 - 103.9.107.255 id +103.9.108.0 - 103.9.111.255 cn +103.9.112.0 - 103.9.115.255 bd +103.9.116.0 - 103.9.119.255 tw +103.9.120.0 - 103.9.123.255 jp +103.9.124.0 - 103.9.127.255 id +103.9.128.0 - 103.9.131.255 kr +103.9.132.0 - 103.9.139.255 bd +103.9.140.0 - 103.9.143.255 pg +103.9.144.0 - 103.9.147.255 id +103.9.148.0 - 103.9.151.255 my +103.9.152.0 - 103.9.155.255 cn +103.9.156.0 - 103.9.159.255 vn +103.9.160.0 - 103.9.163.255 au +103.9.164.0 - 103.9.167.255 jp +103.9.168.0 - 103.9.171.255 au +103.9.172.0 - 103.9.175.255 jp +103.9.180.0 - 103.9.180.255 jp +103.9.181.0 - 103.9.181.255 bd +103.9.182.0 - 103.9.182.255 pk +103.9.183.0 - 103.9.183.255 id +103.9.184.0 - 103.9.187.255 bd +103.9.188.0 - 103.9.191.255 kh +103.9.192.0 - 103.9.215.255 vn +103.9.216.0 - 103.9.219.255 nz +103.9.220.0 - 103.9.221.255 bd +103.9.222.0 - 103.9.223.255 in +103.9.224.0 - 103.9.224.255 bd +103.9.225.0 - 103.9.225.255 in +103.9.226.0 - 103.9.226.255 pg +103.9.227.0 - 103.9.227.255 id +103.9.228.0 - 103.9.231.255 ws +103.9.232.0 - 103.9.235.255 in +103.9.236.0 - 103.9.239.255 nz +103.9.240.0 - 103.9.243.255 au +103.9.244.0 - 103.9.247.255 hk +103.9.248.0 - 103.10.3.255 cn 103.10.4.0 - 103.10.7.255 tw 103.10.8.0 - 103.10.8.255 au 103.10.9.0 - 103.10.9.255 in @@ -63477,7 +37443,7 @@ 103.10.32.0 - 103.10.35.255 au 103.10.36.0 - 103.10.39.255 jp 103.10.40.0 - 103.10.43.255 my -103.10.44.0 - 103.10.47.255 nz +103.10.44.0 - 103.10.47.255 vn 103.10.48.0 - 103.10.51.255 au 103.10.52.0 - 103.10.55.255 bd 103.10.56.0 - 103.10.56.255 id @@ -63497,12 +37463,11 @@ 103.10.108.0 - 103.10.108.255 hk 103.10.109.0 - 103.10.109.255 in 103.10.110.0 - 103.10.110.255 id -103.10.111.0 - 103.10.111.255 cn 103.10.112.0 - 103.10.115.255 jp 103.10.116.0 - 103.10.119.255 in 103.10.120.0 - 103.10.123.255 id -103.10.124.0 - 103.10.125.255 hk -103.10.126.0 - 103.10.126.255 au +103.10.124.0 - 103.10.124.255 sg +103.10.125.0 - 103.10.126.255 au 103.10.127.0 - 103.10.127.255 in 103.10.128.0 - 103.10.131.255 id 103.10.132.0 - 103.10.135.255 in @@ -63514,7 +37479,7 @@ 103.10.164.0 - 103.10.167.255 jp 103.10.168.0 - 103.10.168.255 in 103.10.169.0 - 103.10.171.255 id -103.10.172.0 - 103.10.175.255 lk +103.10.172.0 - 103.10.175.255 hk 103.10.176.0 - 103.10.179.255 ph 103.10.180.0 - 103.10.183.255 in 103.10.184.0 - 103.10.187.255 id @@ -63522,7 +37487,8 @@ 103.10.192.0 - 103.10.195.255 jp 103.10.196.0 - 103.10.196.255 my 103.10.197.0 - 103.10.197.255 hk -103.10.198.0 - 103.10.199.255 my +103.10.198.0 - 103.10.198.255 my +103.10.199.0 - 103.10.199.255 hk 103.10.200.0 - 103.10.203.255 ph 103.10.204.0 - 103.10.207.255 tw 103.10.208.0 - 103.10.211.255 in @@ -63541,14 +37507,12 @@ 103.10.248.0 - 103.10.252.255 in 103.10.253.0 - 103.10.253.255 id 103.10.254.0 - 103.10.255.255 ph -103.11.0.0 - 103.11.3.255 au +103.11.0.0 - 103.11.3.255 pk 103.11.4.0 - 103.11.7.255 jp 103.11.8.0 - 103.11.11.255 au 103.11.12.0 - 103.11.15.255 th -103.11.16.0 - 103.11.19.255 jp 103.11.20.0 - 103.11.20.255 in -103.11.21.0 - 103.11.21.255 nz -103.11.22.0 - 103.11.23.255 id +103.11.21.0 - 103.11.23.255 id 103.11.24.0 - 103.11.27.255 kr 103.11.28.0 - 103.11.31.255 id 103.11.32.0 - 103.11.35.255 lk @@ -63559,9 +37523,9 @@ 103.11.52.0 - 103.11.55.255 au 103.11.56.0 - 103.11.59.255 kr 103.11.60.0 - 103.11.63.255 pk -103.11.64.0 - 103.11.67.255 ph +103.11.64.0 - 103.11.67.255 us 103.11.68.0 - 103.11.71.255 pk -103.11.72.0 - 103.11.73.255 nz +103.11.72.0 - 103.11.73.255 hk 103.11.74.0 - 103.11.75.255 id 103.11.76.0 - 103.11.79.255 au 103.11.80.0 - 103.11.87.255 in @@ -63585,7 +37549,8 @@ 103.11.150.0 - 103.11.151.255 sg 103.11.152.0 - 103.11.155.255 in 103.11.156.0 - 103.11.159.255 jp -103.11.160.0 - 103.11.171.255 au +103.11.160.0 - 103.11.167.255 au +103.11.168.0 - 103.11.171.255 cn 103.11.172.0 - 103.11.175.255 vn 103.11.176.0 - 103.11.177.255 id 103.11.178.0 - 103.11.178.255 nz @@ -63595,13 +37560,12 @@ 103.11.186.0 - 103.11.187.255 id 103.11.188.0 - 103.11.191.255 sg 103.11.192.0 - 103.11.195.255 mn -103.11.196.0 - 103.11.199.255 jp 103.11.200.0 - 103.11.203.255 sg 103.11.204.0 - 103.11.207.255 au 103.11.208.0 - 103.11.211.255 jp 103.11.212.0 - 103.11.215.255 au 103.11.216.0 - 103.11.219.255 kh -103.11.220.0 - 103.11.220.255 sg +103.11.220.0 - 103.11.220.255 pk 103.11.221.0 - 103.11.221.255 jp 103.11.222.0 - 103.11.223.255 id 103.11.224.0 - 103.11.227.255 in @@ -63612,12 +37576,761 @@ 103.11.244.0 - 103.11.247.255 hk 103.11.248.0 - 103.11.251.255 kr 103.11.252.0 - 103.11.255.255 id +103.12.0.0 - 103.12.0.255 mn +103.12.1.0 - 103.12.1.255 in +103.12.2.0 - 103.12.2.255 sg +103.12.3.0 - 103.12.11.255 au +103.12.12.0 - 103.12.15.255 id +103.12.16.0 - 103.12.19.255 jp +103.12.20.0 - 103.12.21.255 id +103.12.22.0 - 103.12.22.255 au +103.12.23.0 - 103.12.23.255 id +103.12.24.0 - 103.12.27.255 in +103.12.28.0 - 103.12.31.255 id +103.12.32.0 - 103.12.35.255 cn +103.12.36.0 - 103.12.39.255 au +103.12.40.0 - 103.12.43.255 pk +103.12.44.0 - 103.12.47.255 bd +103.12.52.0 - 103.12.55.255 jp +103.12.56.0 - 103.12.57.255 au +103.12.58.0 - 103.12.58.255 pk +103.12.59.0 - 103.12.59.255 au +103.12.60.0 - 103.12.63.255 hk +103.12.64.0 - 103.12.67.255 my +103.12.68.0 - 103.12.71.255 cn +103.12.72.0 - 103.12.75.255 bd +103.12.76.0 - 103.12.79.255 hk +103.12.80.0 - 103.12.81.255 id +103.12.82.0 - 103.12.83.255 bd +103.12.84.0 - 103.12.84.255 id +103.12.85.0 - 103.12.87.255 au +103.12.88.0 - 103.12.91.255 ph +103.12.92.0 - 103.12.95.255 cn +103.12.96.0 - 103.12.99.255 af +103.12.100.0 - 103.12.103.255 au +103.12.104.0 - 103.12.107.255 vn +103.12.108.0 - 103.12.111.255 au +103.12.112.0 - 103.12.115.255 id +103.12.116.0 - 103.12.119.255 in +103.12.120.0 - 103.12.123.255 pk +103.12.124.0 - 103.12.127.255 in +103.12.128.0 - 103.12.131.255 au +103.12.132.0 - 103.12.135.255 in +103.12.136.0 - 103.12.139.255 cn +103.12.140.0 - 103.12.143.255 hk +103.12.144.0 - 103.12.147.255 my +103.12.148.0 - 103.12.151.255 hk +103.12.152.0 - 103.12.155.255 my +103.12.156.0 - 103.12.157.255 in +103.12.158.0 - 103.12.158.255 jp +103.12.159.0 - 103.12.159.255 au +103.12.160.0 - 103.12.163.255 kh +103.12.164.0 - 103.12.164.255 id +103.12.165.0 - 103.12.165.255 au +103.12.166.0 - 103.12.166.255 bd +103.12.167.0 - 103.12.167.255 id +103.12.168.0 - 103.12.171.255 in +103.12.172.0 - 103.12.179.255 bd +103.12.184.0 - 103.12.187.255 cn +103.12.188.0 - 103.12.191.255 au +103.12.192.0 - 103.12.195.255 in +103.12.200.0 - 103.12.203.255 au +103.12.204.0 - 103.12.207.255 bd +103.12.208.0 - 103.12.209.255 bn +103.12.210.0 - 103.12.210.255 sg +103.12.211.0 - 103.12.211.255 in +103.12.212.0 - 103.12.215.255 sg +103.12.216.0 - 103.12.219.255 hk +103.12.220.0 - 103.12.223.255 id +103.12.224.0 - 103.12.227.255 jp +103.12.228.0 - 103.12.231.255 bd +103.12.232.0 - 103.12.235.255 cn +103.12.236.0 - 103.12.239.255 bd +103.12.240.0 - 103.12.243.255 id +103.12.244.0 - 103.12.247.255 in +103.12.248.0 - 103.12.255.255 kr +103.13.0.0 - 103.13.0.255 in +103.13.1.0 - 103.13.1.255 pk +103.13.2.0 - 103.13.3.255 in +103.13.4.0 - 103.13.7.255 my +103.13.8.0 - 103.13.11.255 nz +103.13.12.0 - 103.13.15.255 cn +103.13.16.0 - 103.13.27.255 jp +103.13.28.0 - 103.13.31.255 th +103.13.36.0 - 103.13.38.255 id +103.13.39.0 - 103.13.39.255 nz +103.13.40.0 - 103.13.47.255 jp +103.13.48.0 - 103.13.51.255 hk +103.13.52.0 - 103.13.55.255 kr +103.13.56.0 - 103.13.59.255 au +103.13.60.0 - 103.13.63.255 jp +103.13.64.0 - 103.13.64.255 af +103.13.65.0 - 103.13.65.255 us +103.13.66.0 - 103.13.67.255 af +103.13.68.0 - 103.13.71.255 au +103.13.72.0 - 103.13.73.255 cn +103.13.74.0 - 103.13.75.255 my +103.13.76.0 - 103.13.79.255 vn +103.13.80.0 - 103.13.87.255 au +103.13.88.0 - 103.13.91.255 la +103.13.92.0 - 103.13.95.255 jp +103.13.96.0 - 103.13.99.255 in +103.13.100.0 - 103.13.103.255 au +103.13.108.0 - 103.13.115.255 in +103.13.116.0 - 103.13.119.255 nz +103.13.120.0 - 103.13.123.255 my +103.13.124.0 - 103.13.127.255 cn +103.13.128.0 - 103.13.131.255 sg +103.13.132.0 - 103.13.133.255 bd +103.13.134.0 - 103.13.134.255 ph +103.13.135.0 - 103.13.135.255 in +103.13.136.0 - 103.13.143.255 jp +103.13.144.0 - 103.13.147.255 cn +103.13.148.0 - 103.13.151.255 bd +103.13.152.0 - 103.13.155.255 jp +103.13.156.0 - 103.13.159.255 bd +103.13.160.0 - 103.13.163.255 kr +103.13.164.0 - 103.13.171.255 jp +103.13.172.0 - 103.13.175.255 sg +103.13.176.0 - 103.13.177.255 hk +103.13.178.0 - 103.13.180.255 in +103.13.181.0 - 103.13.181.255 id +103.13.182.0 - 103.13.182.255 sg +103.13.183.0 - 103.13.183.255 in +103.13.184.0 - 103.13.185.255 ph +103.13.186.0 - 103.13.187.255 au +103.13.188.0 - 103.13.191.255 hk +103.13.196.0 - 103.13.199.255 cn +103.13.200.0 - 103.13.203.255 id +103.13.208.0 - 103.13.211.255 jp +103.13.212.0 - 103.13.215.255 th +103.13.216.0 - 103.13.218.255 au +103.13.219.0 - 103.13.219.255 in +103.13.220.0 - 103.13.223.255 cn +103.13.224.0 - 103.13.227.255 bd +103.13.228.0 - 103.13.231.255 th +103.13.232.0 - 103.13.235.255 hk +103.13.236.0 - 103.13.239.255 bd +103.13.240.0 - 103.13.243.255 in +103.13.244.0 - 103.13.247.255 cn +103.13.248.0 - 103.13.255.255 jp +103.14.0.0 - 103.14.0.255 in +103.14.1.0 - 103.14.1.255 au +103.14.2.0 - 103.14.2.255 in +103.14.3.0 - 103.14.3.255 nz +103.14.4.0 - 103.14.7.255 au +103.14.8.0 - 103.14.11.255 th +103.14.12.0 - 103.14.15.255 jp +103.14.16.0 - 103.14.21.255 id +103.14.22.0 - 103.14.23.255 au +103.14.25.0 - 103.14.25.255 au +103.14.26.0 - 103.14.27.255 bd +103.14.28.0 - 103.14.31.255 my +103.14.36.0 - 103.14.39.255 mn +103.14.40.0 - 103.14.43.255 au +103.14.44.0 - 103.14.45.255 id +103.14.46.0 - 103.14.46.255 in +103.14.47.0 - 103.14.55.255 au +103.14.56.0 - 103.14.59.255 sg +103.14.60.0 - 103.14.63.255 ph +103.14.64.0 - 103.14.64.255 jp +103.14.65.0 - 103.14.67.255 au +103.14.68.0 - 103.14.68.31 nz +103.14.68.32 - 103.14.68.39 us +103.14.68.40 - 103.14.71.255 nz +103.14.72.0 - 103.14.73.255 bd +103.14.74.0 - 103.14.75.255 id +103.14.76.0 - 103.14.76.127 my +103.14.76.128 - 103.14.76.255 id +103.14.77.0 - 103.14.78.255 kr +103.14.79.0 - 103.14.79.255 sg +103.14.80.0 - 103.14.83.255 jp +103.14.84.0 - 103.14.87.255 cn +103.14.88.0 - 103.14.91.255 pg +103.14.92.0 - 103.14.95.255 au +103.14.96.0 - 103.14.98.255 in +103.14.99.0 - 103.14.99.255 sg +103.14.100.0 - 103.14.103.255 cn +103.14.104.0 - 103.14.107.255 in +103.14.108.0 - 103.14.108.255 id +103.14.109.0 - 103.14.109.255 bd +103.14.110.0 - 103.14.111.255 id +103.14.112.0 - 103.14.119.255 hk +103.14.120.0 - 103.14.127.255 in +103.14.128.0 - 103.14.131.255 bd +103.14.132.0 - 103.14.139.255 cn +103.14.140.0 - 103.14.143.255 nz +103.14.144.0 - 103.14.147.255 hk +103.14.148.0 - 103.14.155.255 jp +103.14.156.0 - 103.14.159.255 cn +103.14.160.0 - 103.14.163.255 in +103.14.164.0 - 103.14.167.255 th +103.14.168.0 - 103.14.171.255 nz +103.14.172.0 - 103.14.175.255 au +103.14.176.0 - 103.14.179.255 jp +103.14.180.0 - 103.14.183.255 in +103.14.184.0 - 103.14.184.255 my +103.14.185.0 - 103.14.185.255 sg +103.14.186.0 - 103.14.187.255 au +103.14.188.0 - 103.14.191.255 in +103.14.192.0 - 103.14.192.255 id +103.14.193.0 - 103.14.193.255 bd +103.14.194.0 - 103.14.194.255 ph +103.14.195.0 - 103.14.195.255 id +103.14.196.0 - 103.14.199.255 in +103.14.200.0 - 103.14.203.255 au +103.14.204.0 - 103.14.207.255 bd +103.14.208.0 - 103.14.211.255 in +103.14.212.0 - 103.14.215.255 sg +103.14.216.0 - 103.14.219.255 nz +103.14.220.0 - 103.14.220.255 hk +103.14.221.0 - 103.14.221.255 au +103.14.222.0 - 103.14.222.255 jp +103.14.223.0 - 103.14.223.255 hk +103.14.224.0 - 103.14.227.255 sg +103.14.229.0 - 103.14.229.255 id +103.14.230.0 - 103.14.230.255 au +103.14.231.0 - 103.14.231.255 pk +103.14.232.0 - 103.14.235.255 in +103.14.236.0 - 103.14.239.255 sg +103.14.240.0 - 103.14.243.255 cn +103.14.244.0 - 103.14.245.255 sg +103.14.246.0 - 103.14.247.255 gb +103.14.248.0 - 103.14.251.255 kh +103.14.252.0 - 103.14.255.255 au +103.15.0.0 - 103.15.3.255 jp +103.15.4.0 - 103.15.11.255 cn +103.15.16.0 - 103.15.19.255 cn +103.15.20.0 - 103.15.24.255 hk +103.15.25.0 - 103.15.25.255 sg +103.15.26.0 - 103.15.31.255 hk +103.15.32.0 - 103.15.35.255 jp +103.15.36.0 - 103.15.37.255 id +103.15.38.0 - 103.15.38.255 hk +103.15.39.0 - 103.15.39.255 jp +103.15.40.0 - 103.15.43.255 bd +103.15.44.0 - 103.15.47.255 au +103.15.48.0 - 103.15.51.255 vn +103.15.52.0 - 103.15.67.255 in +103.15.68.0 - 103.15.71.255 jp +103.15.72.0 - 103.15.73.255 au +103.15.74.0 - 103.15.74.255 in +103.15.75.0 - 103.15.75.255 nz +103.15.76.0 - 103.15.79.255 jp +103.15.80.0 - 103.15.83.255 in +103.15.84.0 - 103.15.87.255 hk +103.15.88.0 - 103.15.91.255 th +103.15.96.0 - 103.15.99.255 cn +103.15.100.0 - 103.15.103.255 sg +103.15.104.0 - 103.15.107.255 my +103.15.108.0 - 103.15.111.255 jp +103.15.112.0 - 103.15.115.255 pg +103.15.116.0 - 103.15.119.255 jp +103.15.120.0 - 103.15.123.255 hk +103.15.124.0 - 103.15.124.255 in +103.15.125.0 - 103.15.125.255 sg +103.15.126.0 - 103.15.127.255 nz +103.15.128.0 - 103.15.131.255 au +103.15.132.0 - 103.15.135.255 hk +103.15.136.0 - 103.15.139.255 my +103.15.140.0 - 103.15.142.255 bd +103.15.143.0 - 103.15.143.255 id +103.15.144.0 - 103.15.147.255 th +103.15.148.0 - 103.15.151.255 au +103.15.152.0 - 103.15.155.255 nz +103.15.156.0 - 103.15.157.255 au +103.15.158.0 - 103.15.158.255 hk +103.15.159.0 - 103.15.159.255 in +103.15.160.0 - 103.15.163.255 jp +103.15.164.0 - 103.15.167.255 bd +103.15.168.0 - 103.15.171.255 au +103.15.172.0 - 103.15.175.255 id +103.15.176.0 - 103.15.176.255 in +103.15.177.0 - 103.15.178.255 au +103.15.179.0 - 103.15.179.255 in +103.15.180.0 - 103.15.183.255 hk +103.15.184.0 - 103.15.191.255 jp +103.15.192.0 - 103.15.199.255 hk +103.15.200.0 - 103.15.203.255 cn +103.15.204.0 - 103.15.211.255 au +103.15.212.0 - 103.15.215.255 jp +103.15.216.0 - 103.15.219.255 hk +103.15.224.0 - 103.15.225.255 bd +103.15.226.0 - 103.15.226.255 id +103.15.228.0 - 103.15.231.255 in +103.15.232.0 - 103.15.235.255 sg +103.15.236.0 - 103.15.237.255 au +103.15.238.0 - 103.15.239.255 af +103.15.240.0 - 103.15.243.255 id +103.15.244.0 - 103.15.247.255 bd +103.15.248.0 - 103.15.250.255 in +103.15.251.0 - 103.15.251.255 id +103.15.252.0 - 103.15.255.255 in +103.16.0.0 - 103.16.3.255 vn +103.16.4.0 - 103.16.7.255 in +103.16.8.0 - 103.16.11.255 jp +103.16.12.0 - 103.16.14.255 in +103.16.15.0 - 103.16.15.255 vu +103.16.16.0 - 103.16.19.255 sg +103.16.20.0 - 103.16.23.255 nz +103.16.24.0 - 103.16.25.255 bd +103.16.26.0 - 103.16.27.255 hk +103.16.28.0 - 103.16.35.255 in +103.16.36.0 - 103.16.39.255 jp +103.16.40.0 - 103.16.43.255 my +103.16.44.0 - 103.16.47.255 in +103.16.48.0 - 103.16.49.255 id +103.16.50.0 - 103.16.50.255 in +103.16.51.0 - 103.16.51.255 au +103.16.52.0 - 103.16.55.255 cn +103.16.56.0 - 103.16.59.255 in +103.16.60.0 - 103.16.63.255 kh +103.16.64.0 - 103.16.67.255 au +103.16.68.0 - 103.16.71.255 in +103.16.72.0 - 103.16.75.255 bd +103.16.76.0 - 103.16.76.255 in +103.16.77.0 - 103.16.79.255 id +103.16.80.0 - 103.16.91.255 cn +103.16.92.0 - 103.16.99.255 au +103.16.100.0 - 103.16.101.255 in +103.16.102.0 - 103.16.103.255 sg +103.16.104.0 - 103.16.107.255 in +103.16.108.0 - 103.16.111.255 cn +103.16.112.0 - 103.16.115.255 id +103.16.116.0 - 103.16.119.255 hk +103.16.120.0 - 103.16.123.255 bn +103.16.124.0 - 103.16.127.255 cn +103.16.128.0 - 103.16.131.255 au +103.16.132.0 - 103.16.133.255 id +103.16.134.0 - 103.16.135.255 au +103.16.136.0 - 103.16.139.255 id +103.16.140.0 - 103.16.147.255 in +103.16.148.0 - 103.16.151.255 au +103.16.152.0 - 103.16.155.255 bd +103.16.156.0 - 103.16.159.255 pg +103.16.160.0 - 103.16.163.255 jp +103.16.164.0 - 103.16.167.255 in +103.16.168.0 - 103.16.171.255 ph +103.16.172.0 - 103.16.175.255 nz +103.16.176.0 - 103.16.179.255 in +103.16.180.0 - 103.16.181.255 nz +103.16.182.0 - 103.16.183.255 my +103.16.184.0 - 103.16.187.255 hk +103.16.188.0 - 103.16.191.255 id +103.16.192.0 - 103.16.195.255 au +103.16.196.0 - 103.16.196.255 in +103.16.197.0 - 103.16.199.255 id +103.16.200.0 - 103.16.203.255 in +103.16.204.0 - 103.16.207.255 th +103.16.208.0 - 103.16.209.255 in +103.16.210.0 - 103.16.211.255 au +103.16.212.0 - 103.16.215.255 jp +103.16.216.0 - 103.16.219.255 hk +103.16.220.0 - 103.16.220.255 id +103.16.221.0 - 103.16.222.255 in +103.16.223.0 - 103.16.223.255 id +103.16.224.0 - 103.16.227.255 jp +103.16.228.0 - 103.16.231.255 hk +103.16.232.0 - 103.16.235.255 id +103.16.236.0 - 103.16.239.255 jp +103.16.240.0 - 103.16.247.255 tw +103.16.248.0 - 103.16.251.255 jp +103.16.252.0 - 103.16.253.79 sg +103.16.253.80 - 103.16.253.95 ph +103.16.253.96 - 103.16.253.255 sg +103.16.254.0 - 103.16.255.255 hk +103.17.0.0 - 103.17.3.255 in +103.17.4.0 - 103.17.7.255 jp +103.17.8.0 - 103.17.11.255 tw +103.17.12.0 - 103.17.12.30 jp +103.17.12.31 - 103.17.12.31 hk +103.17.12.32 - 103.17.12.62 jp +103.17.12.63 - 103.17.12.63 hk +103.17.12.64 - 103.17.12.94 jp +103.17.12.95 - 103.17.12.95 hk +103.17.12.96 - 103.17.12.126 jp +103.17.12.127 - 103.17.12.127 hk +103.17.12.128 - 103.17.12.158 jp +103.17.12.159 - 103.17.12.159 hk +103.17.12.160 - 103.17.12.190 jp +103.17.12.191 - 103.17.12.191 hk +103.17.12.192 - 103.17.12.222 jp +103.17.12.223 - 103.17.12.223 hk +103.17.12.224 - 103.17.12.254 jp +103.17.12.255 - 103.17.12.255 hk +103.17.13.0 - 103.17.13.30 cn +103.17.13.31 - 103.17.13.31 hk +103.17.13.32 - 103.17.13.62 cn +103.17.13.63 - 103.17.13.63 hk +103.17.13.64 - 103.17.13.94 cn +103.17.13.95 - 103.17.13.95 hk +103.17.13.96 - 103.17.13.126 cn +103.17.13.127 - 103.17.13.127 hk +103.17.13.128 - 103.17.13.158 cn +103.17.13.159 - 103.17.13.159 hk +103.17.13.160 - 103.17.13.190 cn +103.17.13.191 - 103.17.13.191 hk +103.17.13.192 - 103.17.13.254 cn +103.17.13.255 - 103.17.13.255 hk +103.17.14.0 - 103.17.14.30 cn +103.17.14.31 - 103.17.14.31 hk +103.17.14.32 - 103.17.14.62 cn +103.17.14.63 - 103.17.14.63 hk +103.17.14.64 - 103.17.14.94 cn +103.17.14.95 - 103.17.14.95 hk +103.17.14.96 - 103.17.14.126 cn +103.17.14.127 - 103.17.14.127 hk +103.17.14.128 - 103.17.14.158 cn +103.17.14.159 - 103.17.14.191 hk +103.17.14.192 - 103.17.14.222 cn +103.17.14.223 - 103.17.14.223 hk +103.17.14.224 - 103.17.14.254 cn +103.17.14.255 - 103.17.14.255 hk +103.17.15.0 - 103.17.15.30 jp +103.17.15.31 - 103.17.15.31 hk +103.17.15.32 - 103.17.15.62 jp +103.17.15.63 - 103.17.15.63 hk +103.17.15.64 - 103.17.15.94 jp +103.17.15.95 - 103.17.15.95 hk +103.17.15.96 - 103.17.15.126 jp +103.17.15.127 - 103.17.15.127 hk +103.17.15.128 - 103.17.15.158 jp +103.17.15.159 - 103.17.15.159 hk +103.17.15.160 - 103.17.15.190 jp +103.17.15.191 - 103.17.15.191 hk +103.17.15.192 - 103.17.15.222 jp +103.17.15.223 - 103.17.15.223 hk +103.17.15.224 - 103.17.15.254 jp +103.17.15.255 - 103.17.15.255 hk +103.17.16.0 - 103.17.17.255 au +103.17.18.0 - 103.17.18.255 in +103.17.19.0 - 103.17.19.255 my +103.17.20.0 - 103.17.23.255 ph +103.17.24.0 - 103.17.27.255 bn +103.17.28.0 - 103.17.35.255 hk +103.17.36.0 - 103.17.39.255 bd +103.17.40.0 - 103.17.43.255 cn +103.17.44.0 - 103.17.47.255 nc +103.17.48.0 - 103.17.51.255 in +103.17.52.0 - 103.17.55.255 id +103.17.56.0 - 103.17.57.255 au +103.17.58.0 - 103.17.58.255 id +103.17.59.0 - 103.17.59.255 au +103.17.60.0 - 103.17.63.255 af +103.17.68.0 - 103.17.71.255 bd +103.17.72.0 - 103.17.75.255 hk +103.17.76.0 - 103.17.77.255 id +103.17.78.0 - 103.17.78.255 my +103.17.79.0 - 103.17.79.255 id +103.17.80.0 - 103.17.87.255 in +103.17.88.0 - 103.17.91.255 vn +103.17.92.0 - 103.17.95.255 hk +103.17.96.0 - 103.17.107.255 in +103.17.108.0 - 103.17.109.255 mn +103.17.110.0 - 103.17.111.255 in +103.17.112.0 - 103.17.115.255 gu +103.17.116.0 - 103.17.119.255 hk +103.17.120.0 - 103.17.123.255 cn +103.17.124.0 - 103.17.125.255 my +103.17.126.0 - 103.17.126.255 jp +103.17.128.0 - 103.17.131.255 in +103.17.132.0 - 103.17.135.255 au +103.17.136.0 - 103.17.139.255 cn +103.17.140.0 - 103.17.147.255 sg +103.17.148.0 - 103.17.151.255 jp +103.17.152.0 - 103.17.155.255 au +103.17.156.0 - 103.17.159.255 in +103.17.160.0 - 103.17.163.255 cn +103.17.164.0 - 103.17.164.255 id +103.17.165.0 - 103.17.167.255 af +103.17.168.0 - 103.17.171.255 my +103.17.172.0 - 103.17.175.255 id +103.17.176.0 - 103.17.179.255 jp +103.17.180.0 - 103.17.181.255 bd +103.17.182.0 - 103.17.183.255 id +103.17.184.0 - 103.17.191.255 jp +103.17.192.0 - 103.17.192.255 id +103.17.193.0 - 103.17.193.255 au +103.17.194.0 - 103.17.195.255 in +103.17.196.0 - 103.17.196.255 jp +103.17.197.0 - 103.17.198.127 my +103.17.198.128 - 103.17.198.255 sg +103.17.199.0 - 103.17.199.127 jp +103.17.199.128 - 103.17.199.255 kr +103.17.200.0 - 103.17.203.255 pk +103.17.204.0 - 103.17.207.255 cn +103.17.208.0 - 103.17.211.255 my +103.17.212.0 - 103.17.215.255 kh +103.17.216.0 - 103.17.227.255 au +103.17.228.0 - 103.17.231.255 cn +103.17.232.0 - 103.17.235.255 au +103.17.236.0 - 103.17.239.255 vn +103.17.240.0 - 103.17.243.255 tw +103.17.244.0 - 103.17.247.255 id +103.17.248.0 - 103.17.248.255 ph +103.17.249.0 - 103.17.249.255 th +103.17.250.0 - 103.17.255.255 au +103.18.0.0 - 103.18.3.255 my +103.18.4.0 - 103.18.7.255 vn +103.18.8.0 - 103.18.15.255 pk +103.18.16.0 - 103.18.19.255 id +103.18.20.0 - 103.18.23.255 pk +103.18.24.0 - 103.18.27.255 jp +103.18.28.0 - 103.18.35.255 id +103.18.36.0 - 103.18.43.255 au +103.18.48.0 - 103.18.55.255 au +103.18.56.0 - 103.18.56.255 nz +103.18.57.0 - 103.18.57.255 au +103.18.58.0 - 103.18.59.255 nz +103.18.60.0 - 103.18.63.255 jp +103.18.64.0 - 103.18.75.255 in +103.18.76.0 - 103.18.79.255 id +103.18.80.0 - 103.18.83.255 bd +103.18.84.0 - 103.18.87.255 au +103.18.88.0 - 103.18.95.255 my +103.18.96.0 - 103.18.99.255 id +103.18.100.0 - 103.18.103.255 jp +103.18.104.0 - 103.18.107.255 in +103.18.108.0 - 103.18.111.255 au +103.18.112.0 - 103.18.115.255 jp +103.18.116.0 - 103.18.116.255 pk +103.18.117.0 - 103.18.117.255 id +103.18.118.0 - 103.18.119.255 nz +103.18.120.0 - 103.18.123.255 in +103.18.124.0 - 103.18.127.255 au +103.18.128.0 - 103.18.131.255 tw +103.18.132.0 - 103.18.135.255 id +103.18.136.0 - 103.18.139.255 nz +103.18.140.0 - 103.18.143.255 in +103.18.144.0 - 103.18.147.255 id +103.18.148.0 - 103.18.151.255 au +103.18.152.0 - 103.18.152.255 in +103.18.153.0 - 103.18.153.255 id +103.18.154.0 - 103.18.155.255 au +103.18.156.0 - 103.18.159.255 in +103.18.160.0 - 103.18.163.255 af +103.18.164.0 - 103.18.171.255 in +103.18.172.0 - 103.18.175.255 bn +103.18.176.0 - 103.18.179.255 vn +103.18.180.0 - 103.18.180.255 bd +103.18.181.0 - 103.18.181.255 id +103.18.182.0 - 103.18.187.255 hk +103.18.188.0 - 103.18.189.255 au +103.18.190.0 - 103.18.191.255 id +103.18.192.0 - 103.18.195.255 cn +103.18.196.0 - 103.18.199.255 au +103.18.200.0 - 103.18.203.255 nz +103.18.204.0 - 103.18.207.255 au +103.18.208.0 - 103.18.215.255 cn +103.18.216.0 - 103.18.219.255 in +103.18.220.0 - 103.18.223.255 id +103.18.224.0 - 103.18.227.255 cn +103.18.228.0 - 103.18.235.255 jp +103.18.236.0 - 103.18.240.255 id +103.18.241.0 - 103.18.241.255 au +103.18.242.0 - 103.18.242.255 in +103.18.243.0 - 103.18.243.255 pk +103.18.244.0 - 103.18.247.255 my +103.18.248.0 - 103.18.251.255 in +103.18.252.0 - 103.18.255.255 au +103.19.0.0 - 103.19.3.255 jp +103.19.4.0 - 103.19.7.255 nz +103.19.8.0 - 103.19.9.255 sg +103.19.10.0 - 103.19.11.255 nz +103.19.12.0 - 103.19.15.255 cn +103.19.16.0 - 103.19.16.255 ph +103.19.17.0 - 103.19.19.255 in +103.19.20.0 - 103.19.23.255 sg +103.19.24.0 - 103.19.27.255 hk +103.19.28.0 - 103.19.31.255 jp +103.19.32.0 - 103.19.35.255 ph +103.19.36.0 - 103.19.36.255 bd +103.19.37.0 - 103.19.37.255 id +103.19.38.0 - 103.19.38.255 hk +103.19.39.0 - 103.19.39.255 in +103.19.40.0 - 103.19.47.255 cn +103.19.48.0 - 103.19.51.255 jp +103.19.52.0 - 103.19.55.255 in +103.19.56.0 - 103.19.59.255 id +103.19.60.0 - 103.19.63.255 au +103.19.64.0 - 103.19.75.255 cn +103.19.76.0 - 103.19.81.255 id +103.19.82.0 - 103.19.83.255 sg +103.19.84.0 - 103.19.87.255 hk +103.19.88.0 - 103.19.91.255 in +103.19.92.0 - 103.19.95.255 au +103.19.96.0 - 103.19.99.255 vn +103.19.100.0 - 103.19.103.255 nz +103.19.104.0 - 103.19.107.255 th +103.19.108.0 - 103.19.111.255 id +103.19.112.0 - 103.19.115.255 au +103.19.116.0 - 103.19.123.255 jp +103.19.124.0 - 103.19.127.255 kr +103.19.128.0 - 103.19.129.255 in +103.19.130.0 - 103.19.131.255 bd +103.19.132.0 - 103.19.143.255 in +103.19.144.0 - 103.19.147.255 au +103.19.148.0 - 103.19.155.255 in +103.19.156.0 - 103.19.163.255 jp +103.19.164.0 - 103.19.167.255 vn +103.19.168.0 - 103.19.169.255 in +103.19.170.0 - 103.19.175.255 au +103.19.176.0 - 103.19.187.255 id +103.19.188.0 - 103.19.191.255 hk +103.19.192.0 - 103.19.195.255 au +103.19.196.0 - 103.19.203.255 in +103.19.204.0 - 103.19.211.255 id +103.19.212.0 - 103.19.215.255 in +103.19.216.0 - 103.19.216.255 au +103.19.217.0 - 103.19.217.255 in +103.19.218.0 - 103.19.218.255 au +103.19.220.0 - 103.19.223.255 vn +103.19.224.0 - 103.19.227.255 in +103.19.228.0 - 103.19.231.255 id +103.19.232.0 - 103.19.235.255 cn +103.19.236.0 - 103.19.239.255 hk +103.19.240.0 - 103.19.243.255 jp +103.19.244.0 - 103.19.247.255 au +103.19.248.0 - 103.19.251.255 in +103.19.252.0 - 103.19.255.255 bd +103.20.0.0 - 103.20.3.255 pk +103.20.4.0 - 103.20.11.255 jp +103.20.12.0 - 103.20.15.255 cn +103.20.16.0 - 103.20.20.255 au +103.20.21.0 - 103.20.21.255 id +103.20.22.0 - 103.20.23.255 au +103.20.24.0 - 103.20.27.255 bn +103.20.28.0 - 103.20.31.255 in +103.20.32.0 - 103.20.35.255 cn +103.20.36.0 - 103.20.39.255 jp +103.20.40.0 - 103.20.43.255 tw +103.20.44.0 - 103.20.47.255 cn +103.20.48.0 - 103.20.49.255 au +103.20.50.0 - 103.20.50.255 sg +103.20.51.0 - 103.20.51.255 id +103.20.52.0 - 103.20.55.255 bd +103.20.56.0 - 103.20.56.255 au +103.20.57.0 - 103.20.57.255 in +103.20.58.0 - 103.20.58.255 kr +103.20.59.0 - 103.20.59.255 sg +103.20.60.0 - 103.20.63.255 hk +103.20.64.0 - 103.20.67.255 in +103.20.68.0 - 103.20.71.255 cn +103.20.72.0 - 103.20.75.255 jp +103.20.76.0 - 103.20.79.255 pg +103.20.80.0 - 103.20.83.255 kh +103.20.84.0 - 103.20.87.255 jp +103.20.88.0 - 103.20.88.255 nz +103.20.89.0 - 103.20.89.255 bd +103.20.90.0 - 103.20.91.255 id +103.20.92.0 - 103.20.95.255 sg +103.20.104.0 - 103.20.105.255 in +103.20.106.0 - 103.20.107.255 id +103.20.112.0 - 103.20.115.255 cn +103.20.116.0 - 103.20.119.255 kr +103.20.120.0 - 103.20.123.255 th +103.20.124.0 - 103.20.124.255 nr +103.20.125.0 - 103.20.127.255 in +103.20.128.0 - 103.20.131.255 cn +103.20.132.0 - 103.20.135.255 pk +103.20.136.0 - 103.20.139.255 nz +103.20.140.0 - 103.20.143.255 bd +103.20.144.0 - 103.20.151.255 vn +103.20.152.0 - 103.20.155.255 mn +103.20.156.0 - 103.20.159.255 jp +103.20.160.0 - 103.20.163.255 cn +103.20.164.0 - 103.20.164.255 in +103.20.165.0 - 103.20.165.255 hk +103.20.166.0 - 103.20.167.255 id +103.20.168.0 - 103.20.171.255 sg +103.20.172.0 - 103.20.175.255 hk +103.20.176.0 - 103.20.179.255 tw +103.20.180.0 - 103.20.183.255 bd +103.20.184.0 - 103.20.191.255 id +103.20.192.0 - 103.20.195.255 hk +103.20.196.0 - 103.20.197.255 id +103.20.198.0 - 103.20.203.255 au +103.20.204.0 - 103.20.207.255 th +103.20.208.0 - 103.20.211.255 au +103.20.212.0 - 103.20.215.255 in +103.20.216.0 - 103.20.216.255 au +103.20.217.0 - 103.20.217.255 sg +103.20.218.0 - 103.20.218.255 in +103.20.220.0 - 103.20.223.255 hk +103.20.224.0 - 103.20.227.255 my +103.20.232.0 - 103.20.233.255 vu +103.20.234.0 - 103.20.235.255 au +103.20.236.0 - 103.20.239.255 hk +103.20.244.0 - 103.20.247.255 au +103.20.248.0 - 103.20.251.255 cn +103.20.252.0 - 103.21.3.255 au +103.21.8.0 - 103.21.11.255 hk +103.21.12.0 - 103.21.15.255 ph +103.21.16.0 - 103.21.16.255 in +103.21.17.0 - 103.21.17.255 au +103.21.18.0 - 103.21.19.255 in +103.21.20.0 - 103.21.23.255 au +103.21.24.0 - 103.21.27.255 th +103.21.28.0 - 103.21.31.255 sg +103.21.32.0 - 103.21.35.255 my +103.21.36.0 - 103.21.39.255 jp +103.21.40.0 - 103.21.43.255 bd +103.21.44.0 - 103.21.47.255 my +103.21.48.0 - 103.21.51.255 au +103.21.52.0 - 103.21.55.255 in +103.21.56.0 - 103.21.57.255 au +103.21.58.0 - 103.21.59.255 in +103.21.60.0 - 103.21.63.255 tw +103.21.64.0 - 103.21.65.255 sg +103.21.66.0 - 103.21.67.255 in +103.21.68.0 - 103.21.71.255 sg +103.21.72.0 - 103.21.75.255 bd +103.21.76.0 - 103.21.79.255 in +103.21.80.0 - 103.21.81.255 sg +103.21.82.0 - 103.21.83.255 in +103.21.84.0 - 103.21.87.255 id +103.21.88.0 - 103.21.91.255 my +103.21.92.0 - 103.21.95.255 id +103.21.96.0 - 103.21.107.255 jp +103.21.108.0 - 103.21.111.255 au +103.21.112.0 - 103.21.119.255 cn +103.21.120.0 - 103.21.123.255 vn +103.21.124.0 - 103.21.127.255 in +103.21.128.0 - 103.21.135.255 au +103.21.136.0 - 103.21.143.255 cn +103.21.144.0 - 103.21.147.255 au +103.21.148.0 - 103.21.151.255 vn +103.21.152.0 - 103.21.155.255 my +103.21.156.0 - 103.21.159.255 au +103.21.160.0 - 103.21.163.255 in +103.21.164.0 - 103.21.167.255 lk +103.21.168.0 - 103.21.171.255 ph +103.21.172.0 - 103.21.175.255 nz +103.21.176.0 - 103.21.179.255 cn +103.21.180.0 - 103.21.183.255 my +103.21.184.0 - 103.21.187.255 in +103.21.188.0 - 103.21.191.255 au +103.21.192.0 - 103.21.195.255 nz +103.21.196.0 - 103.21.199.255 tw +103.21.200.0 - 103.21.203.255 kr +103.21.204.0 - 103.21.207.255 id +103.21.208.0 - 103.21.211.255 cn +103.21.212.0 - 103.21.219.255 id +103.21.224.0 - 103.21.229.255 id +103.21.230.0 - 103.21.231.255 sb +103.21.232.0 - 103.21.239.255 in +103.21.240.0 - 103.21.243.255 cn +103.21.244.0 - 103.21.244.255 us +103.21.245.0 - 103.21.245.255 au +103.21.246.0 - 103.21.247.255 us +103.21.248.0 - 103.21.251.255 sb +103.21.252.0 - 103.21.255.255 my 103.22.0.0 - 103.22.95.255 cn 103.22.96.0 - 103.22.99.255 hk 103.22.100.0 - 103.22.127.255 cn 103.22.128.0 - 103.22.131.255 sg 103.22.132.0 - 103.22.139.255 id -103.22.140.0 - 103.22.143.255 my +103.22.140.0 - 103.22.143.255 in 103.22.144.0 - 103.22.147.255 au 103.22.148.0 - 103.22.151.255 my 103.22.152.0 - 103.22.155.255 jp @@ -63625,7 +38338,9 @@ 103.22.160.0 - 103.22.163.255 hk 103.22.164.0 - 103.22.166.255 id 103.22.167.0 - 103.22.167.255 jp -103.22.168.0 - 103.22.171.255 sg +103.22.168.0 - 103.22.169.255 id +103.22.170.0 - 103.22.170.255 sg +103.22.171.0 - 103.22.171.255 id 103.22.172.0 - 103.22.175.255 in 103.22.176.0 - 103.22.179.255 au 103.22.180.0 - 103.22.183.255 th @@ -63633,10 +38348,12 @@ 103.22.188.0 - 103.22.191.255 cn 103.22.192.0 - 103.22.195.255 in 103.22.196.0 - 103.22.199.255 au -103.22.200.0 - 103.22.203.255 hk -103.22.204.0 - 103.22.207.255 in +103.22.200.0 - 103.22.200.255 jp +103.22.201.0 - 103.22.201.255 sg +103.22.202.0 - 103.22.202.255 nz +103.22.203.0 - 103.22.203.255 hk +103.22.204.0 - 103.22.207.255 id 103.22.208.0 - 103.22.211.255 au -103.22.212.0 - 103.22.215.255 jp 103.22.216.0 - 103.22.219.255 my 103.22.220.0 - 103.22.223.255 kr 103.22.224.0 - 103.22.227.255 au @@ -63645,7 +38362,7 @@ 103.22.234.0 - 103.22.235.255 nz 103.22.236.0 - 103.22.239.255 in 103.22.240.0 - 103.22.243.255 id -103.22.244.0 - 103.22.247.255 hk +103.22.244.0 - 103.22.247.255 nz 103.22.248.0 - 103.22.251.255 id 103.22.252.0 - 103.22.255.255 cn 103.23.0.0 - 103.23.3.255 au @@ -63656,6 +38373,7 @@ 103.23.20.0 - 103.23.23.255 id 103.23.24.0 - 103.23.29.255 in 103.23.30.0 - 103.23.30.255 id +103.23.31.0 - 103.23.31.255 bd 103.23.32.0 - 103.23.35.255 id 103.23.36.0 - 103.23.39.255 af 103.23.40.0 - 103.23.43.255 au @@ -63667,13 +38385,13 @@ 103.23.64.0 - 103.23.67.255 au 103.23.68.0 - 103.23.69.255 hk 103.23.70.0 - 103.23.70.255 au -103.23.71.0 - 103.23.71.255 my +103.23.71.0 - 103.23.71.255 nz 103.23.72.0 - 103.23.75.255 jp 103.23.76.0 - 103.23.79.255 sg 103.23.80.0 - 103.23.87.255 kr 103.23.88.0 - 103.23.91.255 jp 103.23.92.0 - 103.23.95.255 sg -103.23.96.0 - 103.23.99.255 hk +103.23.96.0 - 103.23.99.255 ph 103.23.100.0 - 103.23.103.255 id 103.23.104.0 - 103.23.107.255 au 103.23.108.0 - 103.23.111.255 tw @@ -63688,23 +38406,380 @@ 103.23.141.0 - 103.23.141.255 id 103.23.142.0 - 103.23.143.255 nz 103.23.144.0 - 103.23.147.255 vn -103.23.148.0 - 103.23.149.255 au 103.23.150.0 - 103.23.150.255 in 103.23.151.0 - 103.23.151.255 id 103.23.152.0 - 103.23.155.255 au 103.23.156.0 - 103.23.159.255 vn 103.23.160.0 - 103.23.167.255 cn -103.23.168.0 - 103.23.171.255 bd -103.23.172.0 - 103.23.173.255 au -103.23.174.0 - 103.23.174.255 ph +103.23.168.0 - 103.23.171.255 hk +103.23.172.0 - 103.23.173.255 in +103.23.174.0 - 103.23.174.255 au 103.23.175.0 - 103.23.175.255 id 103.23.176.0 - 103.23.179.255 cn 103.23.180.0 - 103.23.183.255 id 103.23.184.0 - 103.23.191.255 au -103.23.192.0 - 103.23.195.255 hk -103.29.0.0 - 103.29.3.255 my +103.23.192.0 - 103.23.193.15 hk +103.23.193.16 - 103.23.193.19 jp +103.23.193.20 - 103.23.193.79 hk +103.23.193.80 - 103.23.193.87 sg +103.23.193.88 - 103.23.195.255 hk +103.23.200.0 - 103.23.203.255 id +103.23.204.0 - 103.23.207.255 bd +103.23.208.0 - 103.23.211.255 sg +103.23.212.0 - 103.23.212.255 nz +103.23.213.0 - 103.23.213.255 kh +103.23.214.0 - 103.23.214.255 in +103.23.216.0 - 103.23.219.255 au +103.23.220.0 - 103.23.223.255 jp +103.23.224.0 - 103.23.227.255 id +103.23.228.0 - 103.23.231.255 cn +103.23.232.0 - 103.23.235.255 id +103.23.236.0 - 103.23.239.255 in +103.23.240.0 - 103.23.244.255 id +103.23.245.0 - 103.23.245.255 au +103.23.246.0 - 103.23.246.255 th +103.23.247.0 - 103.23.247.255 af +103.23.248.0 - 103.23.255.255 jp +103.24.0.0 - 103.24.3.255 hk +103.24.4.0 - 103.24.7.255 sg +103.24.8.0 - 103.24.11.255 kr +103.24.12.0 - 103.24.13.255 id +103.24.14.0 - 103.24.14.255 au +103.24.15.0 - 103.24.15.255 hk +103.24.16.0 - 103.24.19.255 ph +103.24.20.0 - 103.24.23.255 in +103.24.28.0 - 103.24.31.255 nz +103.24.32.0 - 103.24.35.255 kh +103.24.36.0 - 103.24.39.255 in +103.24.40.0 - 103.24.43.255 nz +103.24.44.0 - 103.24.45.255 sg +103.24.46.0 - 103.24.46.255 in +103.24.47.0 - 103.24.47.255 au +103.24.48.0 - 103.24.51.255 id +103.24.52.0 - 103.24.55.255 jp +103.24.56.0 - 103.24.59.255 id +103.24.60.0 - 103.24.63.255 in +103.24.64.0 - 103.24.67.255 au +103.24.68.0 - 103.24.71.255 jp +103.24.72.0 - 103.24.76.255 id +103.24.77.0 - 103.24.77.255 sg +103.24.78.0 - 103.24.79.255 pg +103.24.80.0 - 103.24.91.255 in +103.24.92.0 - 103.24.95.255 hk +103.24.96.0 - 103.24.99.255 pk +103.24.100.0 - 103.24.103.255 tw +103.24.104.0 - 103.24.107.255 id +103.24.108.0 - 103.24.111.255 in +103.24.112.0 - 103.24.115.255 nc +103.24.116.0 - 103.24.119.255 cn +103.24.120.0 - 103.24.123.255 au +103.24.124.0 - 103.24.127.255 in +103.24.128.0 - 103.24.131.255 cn +103.24.132.0 - 103.24.133.255 au +103.24.134.0 - 103.24.134.255 my +103.24.135.0 - 103.24.135.255 in +103.24.136.0 - 103.24.143.255 nz +103.24.144.0 - 103.24.147.255 cn +103.24.148.0 - 103.24.151.255 id +103.24.152.0 - 103.24.155.255 hk +103.24.156.0 - 103.24.159.255 sg +103.24.160.0 - 103.24.163.255 jp +103.24.164.0 - 103.24.167.255 sg +103.24.168.0 - 103.24.171.255 jp +103.24.172.0 - 103.24.175.255 in +103.24.176.0 - 103.24.179.255 cn +103.24.180.0 - 103.24.183.255 in +103.24.184.0 - 103.24.187.255 cn +103.24.188.0 - 103.24.191.255 in +103.24.192.0 - 103.24.195.255 jp +103.24.196.0 - 103.24.199.255 au +103.24.200.0 - 103.24.200.127 in +103.24.200.128 - 103.24.200.255 nl +103.24.201.0 - 103.24.201.255 in +103.24.202.0 - 103.24.202.255 nl +103.24.203.0 - 103.24.203.255 in +103.24.204.0 - 103.24.207.255 hk +103.24.208.0 - 103.24.211.255 au +103.24.212.0 - 103.24.215.255 id +103.24.216.0 - 103.24.219.255 hk +103.24.220.0 - 103.24.223.255 cn +103.24.224.0 - 103.24.227.255 hk +103.24.228.0 - 103.24.231.255 cn +103.24.232.0 - 103.24.239.255 in +103.24.240.0 - 103.24.243.255 au +103.24.244.0 - 103.24.247.255 vn +103.24.248.0 - 103.24.255.255 cn +103.25.0.0 - 103.25.7.255 in +103.25.8.0 - 103.25.9.255 cn +103.25.10.0 - 103.25.11.255 in +103.25.12.0 - 103.25.15.255 mm +103.25.16.0 - 103.25.19.255 kr +103.25.20.0 - 103.25.43.255 cn +103.25.44.0 - 103.25.47.255 in +103.25.48.0 - 103.25.51.255 cn +103.25.52.0 - 103.25.52.255 sg +103.25.53.0 - 103.25.53.255 au +103.25.54.0 - 103.25.55.255 id +103.25.56.0 - 103.25.58.255 au +103.25.59.0 - 103.25.59.255 nz +103.25.60.0 - 103.25.63.255 hk +103.25.64.0 - 103.25.71.255 cn +103.25.72.0 - 103.25.75.255 hk +103.25.76.0 - 103.25.79.255 mm +103.25.80.0 - 103.25.83.255 bd +103.25.84.0 - 103.25.87.255 in +103.25.88.0 - 103.25.91.255 jp +103.25.92.0 - 103.25.95.255 in +103.25.96.0 - 103.25.99.255 th +103.25.100.0 - 103.25.103.255 jp +103.25.104.0 - 103.25.107.255 hk +103.25.108.0 - 103.25.111.255 id +103.25.112.0 - 103.25.115.255 au +103.25.116.0 - 103.25.119.255 nz +103.25.120.0 - 103.25.123.255 bd +103.25.124.0 - 103.25.135.255 in +103.25.136.0 - 103.25.139.255 pk +103.25.140.0 - 103.25.143.255 ki +103.25.148.0 - 103.25.151.255 cn +103.25.152.0 - 103.25.155.255 in +103.25.156.0 - 103.25.159.255 cn +103.25.160.0 - 103.25.163.255 au +103.25.164.0 - 103.25.164.255 bd +103.25.165.0 - 103.25.167.255 id +103.25.168.0 - 103.25.175.255 in +103.25.176.0 - 103.25.179.255 ph +103.25.180.0 - 103.25.183.255 au +103.25.184.0 - 103.25.187.255 bd +103.25.188.0 - 103.25.191.255 nz +103.25.192.0 - 103.25.197.255 id +103.25.198.0 - 103.25.199.255 ph +103.25.200.0 - 103.25.203.255 sg +103.25.204.0 - 103.25.207.255 in +103.25.208.0 - 103.25.211.255 id +103.25.212.0 - 103.25.215.255 au +103.25.216.0 - 103.25.219.255 cn +103.25.220.0 - 103.25.220.255 in +103.25.221.0 - 103.25.221.255 au +103.25.222.0 - 103.25.223.255 id +103.25.224.0 - 103.25.227.255 in +103.25.228.0 - 103.25.229.255 vu +103.25.230.0 - 103.25.231.255 in +103.25.232.0 - 103.25.239.255 tw +103.25.240.0 - 103.25.243.255 th +103.25.244.0 - 103.25.247.255 nz +103.25.248.0 - 103.25.251.255 bd +103.25.252.0 - 103.25.255.255 hk +103.26.0.0 - 103.26.3.255 cn +103.26.4.0 - 103.26.7.255 id +103.26.8.0 - 103.26.11.255 in +103.26.12.0 - 103.26.15.255 id +103.26.16.0 - 103.26.19.255 nz +103.26.20.0 - 103.26.23.255 th +103.26.24.0 - 103.26.27.255 sg +103.26.28.0 - 103.26.35.255 jp +103.26.36.0 - 103.26.39.255 ph +103.26.40.0 - 103.26.43.255 sg +103.26.44.0 - 103.26.47.255 my +103.26.48.0 - 103.26.59.255 in +103.26.60.0 - 103.26.63.255 au +103.26.64.0 - 103.26.67.255 cn +103.26.68.0 - 103.26.71.255 au +103.26.72.0 - 103.26.73.255 in +103.26.74.0 - 103.26.75.255 my +103.26.76.0 - 103.26.79.255 cn +103.26.80.0 - 103.26.87.255 pk +103.26.88.0 - 103.26.91.255 au +103.26.92.0 - 103.26.92.255 hk +103.26.93.0 - 103.26.93.255 id +103.26.94.0 - 103.26.94.255 hk +103.26.95.0 - 103.26.95.255 tl +103.26.96.0 - 103.26.99.255 in +103.26.100.0 - 103.26.102.255 id +103.26.103.0 - 103.26.103.255 nz +103.26.104.0 - 103.26.111.255 in +103.26.112.0 - 103.26.115.255 bd +103.26.116.0 - 103.26.119.255 cn +103.26.120.0 - 103.26.127.255 hk +103.26.128.0 - 103.26.131.255 id +103.26.132.0 - 103.26.135.255 cn +103.26.136.0 - 103.26.139.255 bd +103.26.140.0 - 103.26.143.255 in +103.26.144.0 - 103.26.147.255 hk +103.26.148.0 - 103.26.151.255 my +103.26.152.0 - 103.26.155.255 jp +103.26.156.0 - 103.26.163.255 cn +103.26.164.0 - 103.26.167.255 jp +103.26.168.0 - 103.26.169.255 in +103.26.170.0 - 103.26.171.255 my +103.26.172.0 - 103.26.175.255 au +103.26.176.0 - 103.26.179.255 my +103.26.180.0 - 103.26.183.255 th +103.26.184.0 - 103.26.187.255 pk +103.26.188.0 - 103.26.191.255 jp +103.26.192.0 - 103.26.195.255 mn +103.26.196.0 - 103.26.199.255 my +103.26.200.0 - 103.26.201.255 in +103.26.202.0 - 103.26.203.255 au +103.26.204.0 - 103.26.207.255 in +103.26.208.0 - 103.26.215.255 id +103.26.216.0 - 103.26.219.255 in +103.26.220.0 - 103.26.223.255 hk +103.26.224.0 - 103.26.227.255 in +103.26.228.0 - 103.26.231.255 cn +103.26.232.0 - 103.26.235.255 in +103.26.236.0 - 103.26.239.255 au +103.26.240.0 - 103.26.243.255 cn +103.26.244.0 - 103.26.247.255 bd +103.26.248.0 - 103.26.251.255 my +103.26.252.0 - 103.26.255.255 vn +103.27.0.0 - 103.27.0.255 hk +103.27.1.0 - 103.27.1.255 au +103.27.2.0 - 103.27.2.255 in +103.27.3.0 - 103.27.3.255 id +103.27.4.0 - 103.27.7.255 cn +103.27.8.0 - 103.27.11.255 in +103.27.12.0 - 103.27.15.255 cn +103.27.16.0 - 103.27.19.255 in +103.27.20.0 - 103.27.23.255 pk +103.27.24.0 - 103.27.27.255 cn +103.27.28.0 - 103.27.35.255 au +103.27.36.0 - 103.27.36.255 id +103.27.37.0 - 103.27.37.255 nz +103.27.38.0 - 103.27.39.255 au +103.27.40.0 - 103.27.43.255 jp +103.27.44.0 - 103.27.47.255 sg +103.27.48.0 - 103.27.51.255 in +103.27.52.0 - 103.27.55.255 nz +103.27.56.0 - 103.27.59.255 cn +103.27.60.0 - 103.27.67.255 vn +103.27.68.0 - 103.27.71.255 jp +103.27.72.0 - 103.27.75.255 my +103.27.76.0 - 103.27.79.255 hk +103.27.80.0 - 103.27.83.255 jp +103.27.84.0 - 103.27.87.255 in +103.27.88.0 - 103.27.91.255 nz +103.27.92.0 - 103.27.95.255 au +103.27.96.0 - 103.27.99.255 cn +103.27.100.0 - 103.27.103.255 th +103.27.104.0 - 103.27.107.255 my +103.27.108.0 - 103.27.111.255 hk +103.27.112.0 - 103.27.115.255 my +103.27.116.0 - 103.27.119.255 mm +103.27.120.0 - 103.27.120.255 in +103.27.121.0 - 103.27.121.255 nz +103.27.122.0 - 103.27.123.255 ph +103.27.124.0 - 103.27.127.255 hk +103.27.128.0 - 103.27.131.255 kr +103.27.132.0 - 103.27.135.255 au +103.27.136.0 - 103.27.139.255 jp +103.27.140.0 - 103.27.143.255 in +103.27.144.0 - 103.27.147.255 ph +103.27.148.0 - 103.27.151.255 kr +103.27.152.0 - 103.27.155.255 au +103.27.156.0 - 103.27.159.255 jp +103.27.160.0 - 103.27.163.255 au +103.27.164.0 - 103.27.171.255 in +103.27.172.0 - 103.27.175.255 au +103.27.176.0 - 103.27.183.255 hk +103.27.188.0 - 103.27.191.255 au +103.27.192.0 - 103.27.195.255 jp +103.27.196.0 - 103.27.199.255 au +103.27.200.0 - 103.27.203.255 th +103.27.204.0 - 103.27.205.255 my +103.27.206.0 - 103.27.207.255 id +103.27.208.0 - 103.27.211.255 cn +103.27.216.0 - 103.27.219.255 nz +103.27.220.0 - 103.27.220.127 au +103.27.220.128 - 103.27.220.255 jp +103.27.221.0 - 103.27.221.127 kr +103.27.221.128 - 103.27.222.127 jp +103.27.222.128 - 103.27.222.255 au +103.27.223.0 - 103.27.223.127 jp +103.27.223.128 - 103.27.223.255 kr +103.27.224.0 - 103.27.226.255 au +103.27.227.0 - 103.27.227.255 nz +103.27.228.0 - 103.27.228.127 ph +103.27.228.128 - 103.27.228.255 th +103.27.229.0 - 103.27.229.127 id +103.27.229.128 - 103.27.229.255 vn +103.27.230.0 - 103.27.230.127 th +103.27.230.128 - 103.27.230.255 ph +103.27.231.0 - 103.27.231.127 vn +103.27.231.128 - 103.27.231.255 id +103.27.232.0 - 103.27.235.255 in +103.27.236.0 - 103.27.239.255 vn +103.27.240.0 - 103.27.243.255 cn +103.27.244.0 - 103.27.247.255 jp +103.27.248.0 - 103.27.253.255 id +103.27.254.0 - 103.27.254.255 jp +103.27.255.0 - 103.27.255.255 in +103.28.0.0 - 103.28.3.255 kh +103.28.4.0 - 103.28.11.255 cn +103.28.12.0 - 103.28.15.255 id +103.28.16.0 - 103.28.19.255 ph +103.28.20.0 - 103.28.20.255 au +103.28.21.0 - 103.28.23.255 id +103.28.24.0 - 103.28.31.255 jp +103.28.32.0 - 103.28.39.255 vn +103.28.40.0 - 103.28.43.255 au +103.28.44.0 - 103.28.47.255 hk +103.28.48.0 - 103.28.51.255 au +103.28.52.0 - 103.28.53.255 id +103.28.54.0 - 103.28.55.255 sg +103.28.56.0 - 103.28.59.255 id +103.28.60.0 - 103.28.67.255 kr +103.28.68.0 - 103.28.71.255 ph +103.28.72.0 - 103.28.72.255 au +103.28.73.0 - 103.28.73.255 jp +103.28.74.0 - 103.28.75.255 id +103.28.76.0 - 103.28.79.255 hk +103.28.80.0 - 103.28.83.255 id +103.28.84.0 - 103.28.87.255 np +103.28.88.0 - 103.28.91.255 my +103.28.92.0 - 103.28.92.255 au +103.28.93.0 - 103.28.95.255 id +103.28.96.0 - 103.28.99.255 jp +103.28.100.0 - 103.28.103.255 th +103.28.104.0 - 103.28.104.255 id +103.28.105.0 - 103.28.105.255 in +103.28.106.0 - 103.28.119.255 id +103.28.120.0 - 103.28.123.255 bd +103.28.124.0 - 103.28.127.255 th +103.28.128.0 - 103.28.131.255 au +103.28.132.0 - 103.28.133.255 us +103.28.134.0 - 103.28.135.255 af +103.28.136.0 - 103.28.139.255 vn +103.28.140.0 - 103.28.143.255 in +103.28.144.0 - 103.28.147.255 hk +103.28.148.0 - 103.28.149.255 id +103.28.150.0 - 103.28.155.255 pk +103.28.156.0 - 103.28.159.255 in +103.28.160.0 - 103.28.160.255 au +103.28.161.0 - 103.28.161.255 id +103.28.162.0 - 103.28.162.255 my +103.28.163.0 - 103.28.163.255 id +103.28.164.0 - 103.28.171.255 jp +103.28.172.0 - 103.28.175.255 vn +103.28.176.0 - 103.28.179.255 id +103.28.180.0 - 103.28.183.255 in +103.28.188.0 - 103.28.195.255 id +103.28.196.0 - 103.28.199.255 au +103.28.200.0 - 103.28.201.255 tw +103.28.202.0 - 103.28.203.255 ph +103.28.204.0 - 103.28.207.255 cn +103.28.208.0 - 103.28.211.255 sg +103.28.212.0 - 103.28.215.255 cn +103.28.216.0 - 103.28.217.255 au +103.28.218.0 - 103.28.227.255 id +103.28.228.0 - 103.28.239.255 jp +103.28.240.0 - 103.28.241.255 in +103.28.242.0 - 103.28.243.255 kh +103.28.244.0 - 103.28.247.255 in +103.28.248.0 - 103.28.248.255 sg +103.28.249.0 - 103.28.250.255 jp +103.28.251.0 - 103.28.251.255 nz +103.28.252.0 - 103.28.255.255 in 103.29.4.0 - 103.29.7.255 id -103.29.8.0 - 103.29.11.255 bd 103.29.12.0 - 103.29.15.255 hk 103.29.16.0 - 103.29.19.255 cn 103.29.20.0 - 103.29.23.255 ph @@ -63719,12 +38794,11 @@ 103.29.56.0 - 103.29.59.255 my 103.29.60.0 - 103.29.63.255 lk 103.29.64.0 - 103.29.67.255 au -103.29.68.0 - 103.29.71.255 jp +103.29.68.0 - 103.29.71.255 sg 103.29.72.0 - 103.29.75.255 hk 103.29.76.0 - 103.29.79.255 au 103.29.80.0 - 103.29.83.255 ph 103.29.84.0 - 103.29.89.255 au -103.29.90.0 - 103.29.91.255 nz 103.29.92.0 - 103.29.95.255 hk 103.29.96.0 - 103.29.99.255 in 103.29.100.0 - 103.29.103.255 au @@ -63764,27 +38838,3703 @@ 103.29.220.0 - 103.29.223.255 in 103.29.224.0 - 103.29.227.255 bt 103.29.228.0 - 103.29.231.255 id -103.29.232.0 - 103.29.239.255 in +103.29.232.0 - 103.29.235.255 in 103.29.240.0 - 103.29.243.255 my -103.29.244.0 - 103.29.247.255 ph +103.29.244.0 - 103.29.247.255 nz 103.29.248.0 - 103.29.249.255 in 103.29.250.0 - 103.29.255.255 ph +103.30.0.0 - 103.30.3.255 id +103.30.4.0 - 103.30.7.255 hk +103.30.12.0 - 103.30.15.255 in +103.30.16.0 - 103.30.19.255 hk +103.30.20.0 - 103.30.23.255 cn +103.30.24.0 - 103.30.27.255 hk +103.30.28.0 - 103.30.31.255 bd +103.30.32.0 - 103.30.35.255 sg +103.30.36.0 - 103.30.39.255 vn +103.30.40.0 - 103.30.43.255 hk +103.30.44.0 - 103.30.47.255 tw +103.30.48.0 - 103.30.51.255 hk +103.30.52.0 - 103.30.55.255 jp +103.30.56.0 - 103.30.59.255 id +103.30.64.0 - 103.30.67.255 in +103.30.68.0 - 103.30.71.255 hk +103.30.72.0 - 103.30.75.255 jp +103.30.76.0 - 103.30.79.255 hk +103.30.80.0 - 103.30.83.255 in +103.30.84.0 - 103.30.95.255 id +103.30.96.0 - 103.30.99.255 cn +103.30.100.0 - 103.30.103.255 hk +103.30.108.0 - 103.30.111.255 kr +103.30.112.0 - 103.30.115.255 tl +103.30.116.0 - 103.30.119.255 in +103.30.120.0 - 103.30.120.255 au +103.30.121.0 - 103.30.121.255 sg +103.30.122.0 - 103.30.123.255 id +103.30.124.0 - 103.30.127.255 th +103.30.128.0 - 103.30.135.255 tw +103.30.136.0 - 103.30.139.255 af +103.30.140.0 - 103.30.143.255 in +103.30.144.0 - 103.30.147.255 id +103.30.148.0 - 103.30.151.255 cn +103.30.152.0 - 103.30.155.255 in +103.30.156.0 - 103.30.163.255 kr +103.30.164.0 - 103.30.167.255 jp +103.30.168.0 - 103.30.168.255 au +103.30.169.0 - 103.30.169.255 bd +103.30.170.0 - 103.30.175.255 id +103.30.176.0 - 103.30.179.255 in +103.30.180.0 - 103.30.183.255 id +103.30.184.0 - 103.30.187.255 au +103.30.188.0 - 103.30.191.255 bd +103.30.192.0 - 103.30.195.255 in +103.30.196.0 - 103.30.199.255 pk +103.30.200.0 - 103.30.203.255 cn +103.30.204.0 - 103.30.207.255 kr +103.30.208.0 - 103.30.210.255 sg +103.30.211.0 - 103.30.212.255 hk +103.30.214.0 - 103.30.214.255 au +103.30.215.0 - 103.30.215.255 sg +103.30.220.0 - 103.30.223.255 id +103.30.224.0 - 103.30.227.255 in +103.30.228.0 - 103.30.231.255 cn +103.30.232.0 - 103.30.235.255 hk +103.30.236.0 - 103.30.239.255 cn +103.30.240.0 - 103.30.243.255 hk +103.30.244.0 - 103.30.247.255 id +103.30.248.0 - 103.30.251.255 pw +103.30.252.0 - 103.30.255.255 in +103.31.0.0 - 103.31.3.255 cn +103.31.4.0 - 103.31.5.255 sg +103.31.6.0 - 103.31.7.255 us +103.31.12.0 - 103.31.15.255 jp +103.31.16.0 - 103.31.23.255 hk +103.31.24.0 - 103.31.25.255 sg +103.31.26.0 - 103.31.26.255 au +103.31.28.0 - 103.31.31.255 au +103.31.32.0 - 103.31.33.255 id +103.31.34.0 - 103.31.35.255 my +103.31.36.0 - 103.31.39.255 id +103.31.44.0 - 103.31.47.255 id +103.31.48.0 - 103.31.71.255 cn +103.31.72.0 - 103.31.75.255 hk +103.31.76.0 - 103.31.79.255 jp +103.31.80.0 - 103.31.83.255 pk +103.31.84.0 - 103.31.87.255 mv +103.31.88.0 - 103.31.91.255 au +103.31.92.0 - 103.31.95.255 pk +103.31.96.0 - 103.31.99.255 hk +103.31.100.0 - 103.31.107.255 pk +103.31.108.0 - 103.31.108.255 bd +103.31.109.0 - 103.31.111.255 id +103.31.112.0 - 103.31.115.255 au +103.31.120.0 - 103.31.127.255 vn +103.31.128.0 - 103.31.131.255 kh +103.31.132.0 - 103.31.135.255 id +103.31.136.0 - 103.31.139.255 hk +103.31.140.0 - 103.31.143.255 jp +103.31.144.0 - 103.31.147.255 in +103.31.148.0 - 103.31.151.255 cn +103.31.152.0 - 103.31.155.255 bd +103.31.156.0 - 103.31.159.255 id +103.31.160.0 - 103.31.163.255 cn +103.31.164.0 - 103.31.167.255 id +103.31.168.0 - 103.31.171.255 cn +103.31.172.0 - 103.31.175.255 sg +103.31.176.0 - 103.31.179.255 bd +103.31.180.0 - 103.31.183.255 kr +103.31.184.0 - 103.31.184.47 hk +103.31.184.48 - 103.31.184.255 us +103.31.185.0 - 103.31.185.127 hk +103.31.185.128 - 103.31.185.175 gb +103.31.185.176 - 103.31.186.255 hk +103.31.187.0 - 103.31.187.95 ro +103.31.187.96 - 103.31.187.255 hk +103.31.188.0 - 103.31.191.255 in +103.31.192.0 - 103.31.195.255 jp +103.31.196.0 - 103.31.199.255 tw +103.31.200.0 - 103.31.203.255 cn +103.31.204.0 - 103.31.207.255 id +103.31.208.0 - 103.31.211.255 bd +103.31.212.0 - 103.31.215.255 in +103.31.216.0 - 103.31.219.255 jp +103.31.220.0 - 103.31.223.255 hk +103.31.224.0 - 103.31.227.255 id +103.31.228.0 - 103.31.231.255 sg +103.31.232.0 - 103.31.235.255 id +103.31.236.0 - 103.31.239.255 cn +103.31.240.0 - 103.31.243.255 hk +103.31.244.0 - 103.31.247.255 jp +103.31.248.0 - 103.31.251.255 id +103.31.252.0 - 103.31.255.255 jp +103.32.0.0 - 103.35.51.255 cn +103.35.52.0 - 103.35.55.255 in +103.35.56.0 - 103.35.59.255 sg +103.35.60.0 - 103.35.63.255 jp +103.35.64.0 - 103.35.67.255 vn +103.35.68.0 - 103.35.71.255 in +103.35.72.0 - 103.35.79.255 hk +103.35.80.0 - 103.35.83.255 au +103.35.84.0 - 103.35.87.255 hk +103.35.88.0 - 103.35.89.255 nz +103.35.90.0 - 103.35.90.255 in +103.35.91.0 - 103.35.91.255 jp +103.35.92.0 - 103.35.95.255 au +103.35.96.0 - 103.35.99.255 th +103.35.100.0 - 103.35.103.255 in +103.35.104.0 - 103.35.107.255 cn +103.35.108.0 - 103.35.111.255 bd +103.35.112.0 - 103.35.113.255 au +103.35.114.0 - 103.35.115.255 vu +103.35.116.0 - 103.35.119.255 cn +103.35.120.0 - 103.35.121.255 in +103.35.122.0 - 103.35.122.255 hk +103.35.123.0 - 103.35.123.255 in +103.35.124.0 - 103.35.127.255 hk +103.35.128.0 - 103.35.131.255 au +103.35.132.0 - 103.35.135.255 in +103.35.136.0 - 103.35.139.255 my +103.35.140.0 - 103.35.141.255 id +103.35.142.0 - 103.35.142.255 in +103.35.143.0 - 103.35.143.255 my +103.35.144.0 - 103.35.151.255 hk +103.35.152.0 - 103.35.155.255 au +103.35.156.0 - 103.35.159.255 bd +103.35.160.0 - 103.35.165.255 in +103.35.166.0 - 103.35.167.255 af +103.35.168.0 - 103.35.171.255 bd +103.35.172.0 - 103.35.175.255 hk +103.35.176.0 - 103.35.179.255 au +103.35.180.0 - 103.35.183.255 sg +103.35.184.0 - 103.35.187.255 hk +103.35.188.0 - 103.35.191.255 jp +103.35.192.0 - 103.35.199.255 in +103.35.200.0 - 103.35.203.255 cn +103.35.204.0 - 103.35.207.255 tw +103.35.208.0 - 103.35.215.255 pk +103.35.216.0 - 103.35.216.255 nz +103.35.217.0 - 103.35.217.255 in +103.35.218.0 - 103.35.218.255 id +103.35.219.0 - 103.35.219.255 au +103.35.220.0 - 103.35.223.255 cn +103.35.224.0 - 103.35.231.255 au +103.35.232.0 - 103.35.235.255 in +103.35.236.0 - 103.35.239.255 id +103.35.240.0 - 103.35.247.255 in +103.35.248.0 - 103.35.251.255 sg +103.35.252.0 - 103.35.255.255 hk +103.36.0.0 - 103.36.7.255 au +103.36.8.0 - 103.36.11.255 id +103.36.12.0 - 103.36.13.255 au +103.36.14.0 - 103.36.15.255 id +103.36.16.0 - 103.36.19.255 ph +103.36.20.0 - 103.36.23.255 cn +103.36.24.0 - 103.36.27.255 bd +103.36.28.0 - 103.36.31.255 cn +103.36.32.0 - 103.36.35.255 id +103.36.36.0 - 103.36.39.255 cn +103.36.40.0 - 103.36.43.255 id +103.36.44.0 - 103.36.51.255 in +103.36.52.0 - 103.36.55.255 hk +103.36.56.0 - 103.36.67.255 cn +103.36.68.0 - 103.36.68.255 id +103.36.69.0 - 103.36.69.255 au +103.36.70.0 - 103.36.70.255 hk +103.36.71.0 - 103.36.71.255 in +103.36.72.0 - 103.36.75.255 cn +103.36.76.0 - 103.36.87.255 in +103.36.88.0 - 103.36.91.255 hk +103.36.92.0 - 103.36.95.255 sg +103.36.96.0 - 103.36.99.255 cn +103.36.100.0 - 103.36.103.255 bd +103.36.104.0 - 103.36.107.255 in +103.36.108.0 - 103.36.115.255 hk +103.36.116.0 - 103.36.119.255 tw +103.36.120.0 - 103.36.127.255 in +103.36.128.0 - 103.36.128.255 nz +103.36.129.0 - 103.36.131.255 au +103.36.132.0 - 103.36.139.255 cn +103.36.140.0 - 103.36.143.255 jp +103.36.144.0 - 103.36.147.255 vu +103.36.148.0 - 103.36.148.255 au +103.36.149.0 - 103.36.149.255 in +103.36.150.0 - 103.36.151.255 ph +103.36.152.0 - 103.36.155.255 au +103.36.156.0 - 103.36.159.255 id +103.36.160.0 - 103.36.247.255 cn +103.36.248.0 - 103.36.249.255 au +103.36.250.0 - 103.36.250.255 nz +103.36.251.0 - 103.36.251.255 in +103.36.252.0 - 103.36.255.255 au +103.37.0.0 - 103.37.3.255 cn +103.37.8.0 - 103.37.9.255 au +103.37.10.0 - 103.37.11.255 jp +103.37.12.0 - 103.37.19.255 cn +103.37.20.0 - 103.37.21.255 in +103.37.22.0 - 103.37.23.255 au +103.37.24.0 - 103.37.27.255 cn +103.37.28.0 - 103.37.35.255 vn +103.37.36.0 - 103.37.39.255 tw +103.37.40.0 - 103.37.43.255 hk +103.37.44.0 - 103.37.47.255 cn +103.37.48.0 - 103.37.51.255 ph +103.37.52.0 - 103.37.59.255 cn +103.37.60.0 - 103.37.63.255 hk +103.37.64.0 - 103.37.67.255 jp +103.37.68.0 - 103.37.71.255 au +103.37.72.0 - 103.37.75.255 cn +103.37.76.0 - 103.37.83.255 in +103.37.84.0 - 103.37.87.255 hk +103.37.88.0 - 103.37.91.255 in +103.37.92.0 - 103.37.95.255 jp +103.37.96.0 - 103.37.97.255 my +103.37.98.0 - 103.37.98.255 id +103.37.99.0 - 103.37.99.255 au +103.37.100.0 - 103.37.107.255 cn +103.37.108.0 - 103.37.119.255 jp +103.37.120.0 - 103.37.123.255 au +103.37.124.0 - 103.37.126.255 cn +103.37.127.0 - 103.37.127.255 hk +103.37.128.0 - 103.37.131.255 au +103.37.132.0 - 103.37.135.255 jp +103.37.136.0 - 103.37.167.255 cn +103.37.168.0 - 103.37.171.255 id +103.37.172.0 - 103.37.179.255 cn +103.37.180.0 - 103.37.183.255 in +103.37.196.0 - 103.37.199.255 sg +103.37.200.0 - 103.37.201.255 in +103.37.202.0 - 103.37.203.255 au +103.37.204.0 - 103.37.207.255 nz +103.37.208.0 - 103.37.223.255 cn +103.37.224.0 - 103.37.227.255 id +103.37.228.0 - 103.37.228.255 au +103.37.229.0 - 103.37.231.255 id +103.37.232.0 - 103.37.235.255 hk +103.37.236.0 - 103.37.243.255 jp +103.37.244.0 - 103.37.247.255 id +103.37.248.0 - 103.38.3.255 cn +103.38.4.0 - 103.38.8.255 in +103.38.9.0 - 103.38.11.255 au +103.38.12.0 - 103.38.15.255 in +103.38.16.0 - 103.38.19.255 bd +103.38.20.0 - 103.38.23.255 hk +103.38.24.0 - 103.38.27.255 kr +103.38.28.0 - 103.38.31.255 hk +103.38.32.0 - 103.38.35.255 cn +103.38.36.0 - 103.38.39.255 in +103.38.40.0 - 103.38.47.255 cn +103.38.48.0 - 103.38.49.255 in +103.38.56.0 - 103.38.59.255 cn +103.38.60.0 - 103.38.63.255 my +103.38.64.0 - 103.38.67.255 hk +103.38.68.0 - 103.38.71.255 in +103.38.72.0 - 103.38.75.255 sg +103.38.76.0 - 103.38.79.255 cn +103.38.80.0 - 103.38.83.255 hk +103.38.84.0 - 103.38.87.255 cn +103.38.88.0 - 103.38.89.255 in +103.38.90.0 - 103.38.91.255 hk +103.38.92.0 - 103.38.99.255 cn +103.38.100.0 - 103.38.103.255 id +103.38.104.0 - 103.38.107.255 hk +103.38.112.0 - 103.38.115.255 kh +103.38.116.0 - 103.38.119.255 cn +103.38.120.0 - 103.38.123.255 au +103.38.124.0 - 103.38.131.255 in +103.38.132.0 - 103.38.135.255 cn +103.38.136.0 - 103.38.139.255 vn +103.38.140.0 - 103.38.143.255 cn +103.38.144.0 - 103.38.144.255 hk +103.38.145.0 - 103.38.145.255 au +103.38.146.0 - 103.38.147.255 tw +103.38.148.0 - 103.38.149.255 au +103.38.150.0 - 103.38.150.255 in +103.38.151.0 - 103.38.151.255 ph +103.38.152.0 - 103.38.163.255 hk +103.38.164.0 - 103.38.167.255 nz +103.38.168.0 - 103.38.171.255 hk +103.38.172.0 - 103.38.175.255 ph +103.38.176.0 - 103.38.179.255 in +103.38.180.0 - 103.38.183.255 jp +103.38.184.0 - 103.38.187.255 sg +103.38.188.0 - 103.38.188.255 ph +103.38.189.0 - 103.38.191.255 in +103.38.192.0 - 103.38.195.255 my +103.38.196.0 - 103.38.199.255 np +103.38.200.0 - 103.38.207.255 in +103.38.212.0 - 103.38.215.255 ph +103.38.218.0 - 103.38.219.255 vu +103.38.220.0 - 103.38.235.255 cn +103.38.236.0 - 103.38.239.255 np +103.38.240.0 - 103.38.247.255 in +103.38.252.0 - 103.38.255.255 cn +103.39.0.0 - 103.39.5.255 in +103.39.6.0 - 103.39.6.255 my +103.39.7.0 - 103.39.7.255 sg +103.39.8.0 - 103.39.11.255 in +103.39.12.0 - 103.39.15.255 id +103.39.16.0 - 103.39.19.255 cn +103.39.20.0 - 103.39.23.255 nz +103.39.24.0 - 103.39.27.255 hk +103.39.28.0 - 103.39.31.255 in +103.39.32.0 - 103.39.35.255 tw +103.39.36.0 - 103.39.39.255 kr +103.39.40.0 - 103.39.41.255 hk +103.39.42.0 - 103.39.43.255 sg +103.39.44.0 - 103.39.47.255 nz +103.39.48.0 - 103.39.52.255 id +103.39.53.0 - 103.39.53.255 au +103.39.54.0 - 103.39.54.255 in +103.39.55.0 - 103.39.55.255 au +103.39.56.0 - 103.39.59.255 hk +103.39.60.0 - 103.39.63.255 au +103.39.64.0 - 103.39.67.255 cn +103.39.68.0 - 103.39.79.255 hk +103.39.80.0 - 103.39.83.255 pk +103.39.84.0 - 103.39.87.255 au +103.39.88.0 - 103.39.91.255 cn +103.39.92.0 - 103.39.99.255 vn +103.39.100.0 - 103.39.111.255 cn +103.39.112.0 - 103.39.112.255 au +103.39.113.0 - 103.39.113.255 jp +103.39.114.0 - 103.39.115.255 nz +103.39.116.0 - 103.39.119.255 in +103.39.120.0 - 103.39.121.255 au +103.39.122.0 - 103.39.123.255 my +103.39.128.0 - 103.39.135.255 in +103.39.136.0 - 103.39.138.255 au +103.39.139.0 - 103.39.139.255 in +103.39.140.0 - 103.39.143.255 my +103.39.148.0 - 103.39.155.255 hk +103.39.156.0 - 103.39.159.255 in +103.39.160.0 - 103.39.191.255 cn +103.39.192.0 - 103.39.195.255 jp +103.39.200.0 - 103.39.235.255 cn +103.39.236.0 - 103.39.237.255 in +103.39.238.0 - 103.39.239.255 au +103.39.240.0 - 103.39.247.255 in +103.39.248.0 - 103.39.250.255 au +103.39.251.0 - 103.39.251.255 in +103.39.252.0 - 103.39.255.255 fm +103.40.0.0 - 103.40.3.255 au +103.40.4.0 - 103.40.11.255 hk +103.40.12.0 - 103.40.47.255 cn +103.40.48.0 - 103.40.51.255 in +103.40.52.0 - 103.40.53.255 au +103.40.54.0 - 103.40.55.255 id +103.40.56.0 - 103.40.67.255 in +103.40.68.0 - 103.40.69.255 id +103.40.70.0 - 103.40.71.255 au +103.40.72.0 - 103.40.75.255 in +103.40.76.0 - 103.40.79.255 bd +103.40.80.0 - 103.40.80.255 in +103.40.81.0 - 103.40.81.255 nz +103.40.82.0 - 103.40.83.255 bd +103.40.84.0 - 103.40.87.255 hk +103.40.88.0 - 103.40.91.255 cn +103.40.92.0 - 103.40.95.255 id +103.40.96.0 - 103.40.99.255 jp +103.40.100.0 - 103.40.103.255 cn +103.40.104.0 - 103.40.107.255 jp +103.40.108.0 - 103.40.108.255 id +103.40.109.0 - 103.40.109.255 au +103.40.110.0 - 103.40.111.255 hk +103.40.112.0 - 103.40.115.255 cn +103.40.116.0 - 103.40.119.255 th +103.40.120.0 - 103.40.123.255 id +103.40.124.0 - 103.40.131.255 jp +103.40.132.0 - 103.40.151.255 th +103.40.152.0 - 103.40.155.255 hk +103.40.160.0 - 103.40.163.255 hk +103.40.164.0 - 103.40.165.255 ph +103.40.168.0 - 103.40.171.255 in +103.40.172.0 - 103.40.179.255 hk +103.40.180.0 - 103.40.191.255 th +103.40.192.0 - 103.40.195.255 cn +103.40.196.0 - 103.40.207.255 in +103.40.208.0 - 103.40.211.255 hk +103.40.212.0 - 103.40.215.255 cn +103.40.216.0 - 103.40.219.255 jp +103.40.220.0 - 103.40.223.255 cn +103.40.224.0 - 103.40.224.255 au +103.40.225.0 - 103.40.225.255 hk +103.40.226.0 - 103.40.227.255 bd +103.40.228.0 - 103.41.3.255 cn +103.41.4.0 - 103.41.7.255 hk +103.41.8.0 - 103.41.9.255 af +103.41.10.0 - 103.41.11.255 in +103.41.12.0 - 103.41.15.255 sg +103.41.16.0 - 103.41.19.255 cn +103.41.20.0 - 103.41.47.255 in +103.41.48.0 - 103.41.51.255 hk +103.41.52.0 - 103.41.55.255 cn +103.41.56.0 - 103.41.57.255 in +103.41.58.0 - 103.41.59.255 th +103.41.60.0 - 103.41.63.255 jp +103.41.64.0 - 103.41.67.255 hk +103.41.68.0 - 103.41.71.255 sg +103.41.80.0 - 103.41.83.255 hk +103.41.84.0 - 103.41.87.255 th +103.41.88.0 - 103.41.103.255 in +103.41.104.0 - 103.41.107.255 cn +103.41.108.0 - 103.41.108.255 au +103.41.109.0 - 103.41.110.255 id +103.41.111.0 - 103.41.111.255 bd +103.41.116.0 - 103.41.119.255 cn +103.41.120.0 - 103.41.123.255 id +103.41.124.0 - 103.41.127.255 cn +103.41.128.0 - 103.41.131.255 sg +103.41.132.0 - 103.41.135.255 hk +103.41.136.0 - 103.41.139.255 jp +103.41.140.0 - 103.41.143.255 cn +103.41.144.0 - 103.41.147.255 in +103.41.148.0 - 103.41.155.255 cn +103.41.156.0 - 103.41.159.255 au +103.41.160.0 - 103.41.167.255 cn +103.41.168.0 - 103.41.168.255 in +103.41.169.0 - 103.41.169.255 id +103.41.170.0 - 103.41.170.255 in +103.41.171.0 - 103.41.171.255 id +103.41.172.0 - 103.41.175.255 hk +103.41.176.0 - 103.41.176.255 nl +103.41.177.0 - 103.41.179.255 au +103.41.180.0 - 103.41.184.255 hk +103.41.185.0 - 103.41.187.255 cn +103.41.188.0 - 103.41.195.255 id +103.41.196.0 - 103.41.199.255 in +103.41.200.0 - 103.41.211.255 id +103.41.212.0 - 103.41.213.255 bd +103.41.214.0 - 103.41.215.255 in +103.41.216.0 - 103.41.219.255 au +103.41.220.0 - 103.41.235.255 cn +103.41.236.0 - 103.41.239.255 in +103.41.240.0 - 103.41.243.255 jp +103.41.244.0 - 103.41.245.255 bd +103.41.246.0 - 103.41.247.255 id +103.41.248.0 - 103.41.251.255 hk +103.41.252.0 - 103.41.255.255 jp +103.42.0.0 - 103.42.3.255 af +103.42.8.0 - 103.42.11.255 cn +103.42.12.0 - 103.42.15.255 hk +103.42.16.0 - 103.42.18.255 in +103.42.19.0 - 103.42.23.255 au +103.42.24.0 - 103.42.35.255 cn +103.42.36.0 - 103.42.39.255 hk +103.42.40.0 - 103.42.43.255 id +103.42.44.0 - 103.42.47.255 jp +103.42.48.0 - 103.42.50.255 au +103.42.51.0 - 103.42.51.255 in +103.42.56.0 - 103.42.59.255 vn +103.42.60.0 - 103.42.63.255 hk +103.42.64.0 - 103.42.71.255 cn +103.42.72.0 - 103.42.75.255 in +103.42.76.0 - 103.42.79.255 cn +103.42.80.0 - 103.42.83.255 jp +103.42.84.0 - 103.42.91.255 in +103.42.92.0 - 103.42.99.255 ph +103.42.100.0 - 103.42.103.255 hk +103.42.104.0 - 103.42.107.255 cn +103.42.108.0 - 103.42.111.255 au +103.42.112.0 - 103.42.113.255 tw +103.42.114.0 - 103.42.115.255 in +103.42.116.0 - 103.42.123.255 id +103.42.124.0 - 103.42.127.255 in +103.42.132.0 - 103.42.135.255 au +103.42.136.0 - 103.42.139.255 sg +103.42.140.0 - 103.42.143.255 au +103.42.144.0 - 103.42.151.255 tw +103.42.152.0 - 103.42.155.255 bd +103.42.156.0 - 103.42.167.255 in +103.42.168.0 - 103.42.171.255 jp +103.42.172.0 - 103.42.175.255 in +103.42.176.0 - 103.42.179.255 hk +103.42.180.0 - 103.42.183.255 cn +103.42.184.0 - 103.42.187.255 kr +103.42.188.0 - 103.42.188.255 in +103.42.189.0 - 103.42.189.255 au +103.42.190.0 - 103.42.190.255 nz +103.42.191.0 - 103.42.191.255 hk +103.42.192.0 - 103.42.199.255 in +103.42.204.0 - 103.42.204.255 au +103.42.205.0 - 103.42.205.255 id +103.42.206.0 - 103.42.207.255 in +103.42.208.0 - 103.42.211.255 bn +103.42.212.0 - 103.42.215.255 hk +103.42.216.0 - 103.42.219.255 mm +103.42.224.0 - 103.42.227.255 au +103.42.232.0 - 103.42.235.255 cn +103.42.236.0 - 103.42.239.255 au +103.42.248.0 - 103.42.251.255 in +103.42.252.0 - 103.43.1.255 id +103.43.2.0 - 103.43.7.255 in +103.43.8.0 - 103.43.15.255 hk +103.43.16.0 - 103.43.19.255 cn +103.43.20.0 - 103.43.23.255 au +103.43.28.0 - 103.43.31.255 hk +103.43.32.0 - 103.43.37.255 in +103.43.38.0 - 103.43.39.255 au +103.43.40.0 - 103.43.43.255 in +103.43.44.0 - 103.43.47.255 id +103.43.48.0 - 103.43.51.255 tw +103.43.52.0 - 103.43.55.255 bd +103.43.56.0 - 103.43.59.255 au +103.43.60.0 - 103.43.63.255 hk +103.43.64.0 - 103.43.64.255 kr +103.43.65.0 - 103.43.65.255 in +103.43.66.0 - 103.43.67.255 id +103.43.68.0 - 103.43.71.255 hk +103.43.72.0 - 103.43.75.255 au +103.43.76.0 - 103.43.79.255 la +103.43.80.0 - 103.43.83.255 in +103.43.84.0 - 103.43.87.255 cn +103.43.88.0 - 103.43.92.255 au +103.43.93.0 - 103.43.93.255 bd +103.43.94.0 - 103.43.95.255 nl +103.43.96.0 - 103.43.107.255 cn +103.43.108.0 - 103.43.111.255 mo +103.43.112.0 - 103.43.115.255 in +103.43.116.0 - 103.43.116.255 hk +103.43.117.0 - 103.43.117.255 sg +103.43.118.0 - 103.43.118.255 de +103.43.119.0 - 103.43.119.255 au +103.43.120.0 - 103.43.123.255 kr +103.43.124.0 - 103.43.127.255 cn +103.43.128.0 - 103.43.131.255 id +103.43.132.0 - 103.43.135.255 cn +103.43.136.0 - 103.43.136.255 th +103.43.137.0 - 103.43.139.255 au +103.43.140.0 - 103.43.143.255 jp +103.43.144.0 - 103.43.147.255 pg +103.43.148.0 - 103.43.151.255 bd +103.43.152.0 - 103.43.155.255 in +103.43.156.0 - 103.43.159.255 nc +103.43.160.0 - 103.43.163.255 in +103.43.168.0 - 103.43.171.255 np +103.43.172.0 - 103.43.175.255 hk +103.43.176.0 - 103.43.183.255 au +103.43.184.0 - 103.43.187.255 cn +103.43.188.0 - 103.43.191.255 sg +103.43.192.0 - 103.43.199.255 cn +103.43.200.0 - 103.43.203.255 in +103.43.204.0 - 103.43.205.255 nf +103.43.206.0 - 103.43.207.255 nz +103.43.208.0 - 103.43.211.255 cn +103.43.212.0 - 103.43.215.255 nz +103.43.216.0 - 103.43.219.255 hk +103.43.220.0 - 103.43.227.255 cn +103.43.228.0 - 103.43.228.255 in +103.43.229.0 - 103.43.229.255 th +103.43.230.0 - 103.43.230.255 bd +103.43.231.0 - 103.43.231.255 in +103.43.232.0 - 103.43.235.255 cn +103.43.236.0 - 103.43.239.255 hk +103.43.240.0 - 103.43.243.255 cn +103.43.244.0 - 103.43.247.255 hk +103.43.248.0 - 103.43.252.255 in +103.43.253.0 - 103.43.255.255 au +103.44.0.0 - 103.44.3.255 in +103.44.4.0 - 103.44.7.255 sg +103.44.8.0 - 103.44.11.255 jp +103.44.12.0 - 103.44.15.255 in +103.44.16.0 - 103.44.17.255 jp +103.44.18.0 - 103.44.19.255 in +103.44.20.0 - 103.44.23.255 hk +103.44.24.0 - 103.44.25.255 au +103.44.26.0 - 103.44.27.255 id +103.44.28.0 - 103.44.31.255 hk +103.44.32.0 - 103.44.35.255 au +103.44.36.0 - 103.44.39.255 id +103.44.40.0 - 103.44.43.255 au +103.44.44.0 - 103.44.44.255 th +103.44.45.0 - 103.44.45.255 nz +103.44.46.0 - 103.44.47.255 au +103.44.48.0 - 103.44.55.255 in +103.44.56.0 - 103.44.59.255 cn +103.44.60.0 - 103.44.67.255 hk +103.44.68.0 - 103.44.71.255 sg +103.44.72.0 - 103.44.74.255 bd +103.44.75.0 - 103.44.75.255 nl +103.44.76.0 - 103.44.79.255 bd +103.44.80.0 - 103.44.83.255 cn +103.44.84.0 - 103.44.87.255 jp +103.44.88.0 - 103.44.91.255 cn +103.44.92.0 - 103.44.95.255 au +103.44.96.0 - 103.44.99.255 in +103.44.100.0 - 103.44.100.255 id +103.44.101.0 - 103.44.101.255 au +103.44.102.0 - 103.44.103.255 jp +103.44.104.0 - 103.44.107.255 in +103.44.108.0 - 103.44.108.255 my +103.44.109.0 - 103.44.109.255 hk +103.44.110.0 - 103.44.111.255 nz +103.44.112.0 - 103.44.115.255 sg +103.44.116.0 - 103.44.119.255 in +103.44.120.0 - 103.44.127.255 cn +103.44.128.0 - 103.44.131.255 jp +103.44.132.0 - 103.44.135.255 cn +103.44.136.0 - 103.44.143.255 in +103.44.144.0 - 103.44.147.255 cn +103.44.148.0 - 103.44.148.255 au +103.44.149.0 - 103.44.149.255 id +103.44.150.0 - 103.44.151.255 bd +103.44.152.0 - 103.44.155.255 cn +103.44.156.0 - 103.44.159.255 in +103.44.160.0 - 103.44.163.255 hk +103.44.164.0 - 103.44.167.255 nz +103.44.168.0 - 103.44.171.255 cn +103.44.172.0 - 103.44.175.255 in +103.44.176.0 - 103.44.207.255 cn +103.44.208.0 - 103.44.215.255 jp +103.44.216.0 - 103.44.219.255 th +103.44.220.0 - 103.44.220.255 sg +103.44.221.0 - 103.44.221.255 in +103.44.222.0 - 103.44.222.255 nz +103.44.223.0 - 103.44.223.255 pk +103.44.224.0 - 103.44.227.255 cn +103.44.228.0 - 103.44.231.255 au +103.44.232.0 - 103.44.235.255 ph +103.44.236.0 - 103.45.63.255 cn +103.45.64.0 - 103.45.71.255 hk +103.45.72.0 - 103.45.227.255 cn +103.45.228.0 - 103.45.239.255 vn +103.45.240.0 - 103.45.243.255 nz +103.45.244.0 - 103.45.247.255 jp +103.45.248.0 - 103.45.251.255 cn +103.45.252.0 - 103.45.253.255 ph +103.45.254.0 - 103.45.255.255 au +103.46.0.0 - 103.46.139.255 cn +103.46.140.0 - 103.46.140.127 th +103.46.140.128 - 103.46.140.255 fr +103.46.141.0 - 103.46.141.127 kr +103.46.141.128 - 103.46.141.255 jp +103.46.142.0 - 103.46.142.255 cn +103.46.143.0 - 103.46.143.127 my +103.46.143.128 - 103.46.143.255 sg +103.46.148.0 - 103.46.151.255 bd +103.46.152.0 - 103.46.183.255 cn +103.46.184.0 - 103.46.187.255 hk +103.46.188.0 - 103.46.191.255 tw +103.46.192.0 - 103.46.198.255 in +103.46.199.0 - 103.46.199.255 au +103.46.200.0 - 103.46.203.255 in +103.46.204.0 - 103.46.207.255 jp +103.46.208.0 - 103.46.208.255 af +103.46.209.0 - 103.46.209.255 us +103.46.210.0 - 103.46.211.255 af +103.46.212.0 - 103.46.215.255 au +103.46.216.0 - 103.46.219.255 pf +103.46.220.0 - 103.46.223.255 au +103.46.224.0 - 103.46.227.255 hk +103.46.228.0 - 103.46.230.255 au +103.46.231.0 - 103.46.231.255 nz +103.46.232.0 - 103.46.243.255 in +103.46.244.0 - 103.46.251.255 cn +103.46.252.0 - 103.46.255.255 sg +103.47.0.0 - 103.47.1.255 au +103.47.2.0 - 103.47.2.255 jp +103.47.3.0 - 103.47.3.255 nz +103.47.4.0 - 103.47.7.255 cn +103.47.8.0 - 103.47.11.255 jp +103.47.12.0 - 103.47.19.255 in +103.47.20.0 - 103.47.23.255 cn +103.47.24.0 - 103.47.27.255 hk +103.47.28.0 - 103.47.31.255 sg +103.47.32.0 - 103.47.35.255 in +103.47.36.0 - 103.47.43.255 cn +103.47.44.0 - 103.47.47.255 in +103.47.48.0 - 103.47.51.255 cn +103.47.52.0 - 103.47.59.255 in +103.47.60.0 - 103.47.60.255 id +103.47.61.0 - 103.47.61.255 hk +103.47.62.0 - 103.47.63.255 au +103.47.64.0 - 103.47.75.255 in +103.47.76.0 - 103.47.77.255 sg +103.47.78.0 - 103.47.79.255 in +103.47.80.0 - 103.47.83.255 cn +103.47.84.0 - 103.47.87.255 th +103.47.88.0 - 103.47.89.255 hk +103.47.90.0 - 103.47.95.255 in +103.47.96.0 - 103.47.99.255 cn +103.47.100.0 - 103.47.103.255 jp +103.47.104.0 - 103.47.107.255 in +103.47.108.0 - 103.47.111.255 cn +103.47.112.0 - 103.47.115.255 hk +103.47.116.0 - 103.47.123.255 cn +103.47.124.0 - 103.47.131.255 in +103.47.132.0 - 103.47.135.255 id +103.47.136.0 - 103.47.144.255 cn +103.47.145.0 - 103.47.145.127 hk +103.47.145.128 - 103.47.145.255 my +103.47.146.0 - 103.47.146.255 au +103.47.147.0 - 103.47.147.127 th +103.47.147.128 - 103.47.147.255 my +103.47.148.0 - 103.47.153.255 in +103.47.154.0 - 103.47.154.255 my +103.47.155.0 - 103.47.155.255 sg +103.47.156.0 - 103.47.175.255 in +103.47.176.0 - 103.47.179.255 hk +103.47.180.0 - 103.47.183.255 jp +103.47.184.0 - 103.47.185.255 mm +103.47.186.0 - 103.47.186.255 in +103.47.187.0 - 103.47.187.255 au +103.47.188.0 - 103.47.191.255 kh +103.47.192.0 - 103.47.195.255 vn +103.47.196.0 - 103.47.199.255 in +103.47.200.0 - 103.47.203.255 cn +103.47.204.0 - 103.47.207.255 us +103.47.208.0 - 103.47.211.255 sg +103.47.212.0 - 103.47.215.255 cn +103.47.216.0 - 103.47.219.255 in +103.47.220.0 - 103.47.223.255 cn +103.47.224.0 - 103.47.227.255 sg +103.47.228.0 - 103.47.231.255 id +103.47.232.0 - 103.47.232.255 sg +103.47.233.0 - 103.47.235.255 au +103.47.236.0 - 103.47.239.255 in +103.47.240.0 - 103.47.244.255 sg +103.47.245.0 - 103.47.247.255 au +103.47.248.0 - 103.47.251.255 cn +103.47.252.0 - 103.48.3.255 my +103.48.4.0 - 103.48.7.255 hk +103.48.8.0 - 103.48.11.255 nz +103.48.12.0 - 103.48.12.255 th +103.48.13.0 - 103.48.13.255 id +103.48.14.0 - 103.48.15.255 au +103.48.16.0 - 103.48.19.255 bd +103.48.20.0 - 103.48.23.255 cn +103.48.24.0 - 103.48.25.255 pk +103.48.26.0 - 103.48.26.255 hk +103.48.27.0 - 103.48.27.255 id +103.48.28.0 - 103.48.29.255 hk +103.48.30.0 - 103.48.30.255 ph +103.48.31.0 - 103.48.31.255 jp +103.48.32.0 - 103.48.35.255 in +103.48.36.0 - 103.48.43.255 jp +103.48.44.0 - 103.48.47.255 in +103.48.48.0 - 103.48.49.255 hk +103.48.50.0 - 103.48.51.255 in +103.48.52.0 - 103.48.55.255 cn +103.48.56.0 - 103.48.75.255 in +103.48.76.0 - 103.48.87.255 vn +103.48.88.0 - 103.48.88.255 np +103.48.89.0 - 103.48.89.255 au +103.48.90.0 - 103.48.91.255 in +103.48.92.0 - 103.48.95.255 cn +103.48.96.0 - 103.48.115.255 in +103.48.116.0 - 103.48.116.255 mn +103.48.117.0 - 103.48.117.255 au +103.48.118.0 - 103.48.118.255 nz +103.48.119.0 - 103.48.119.255 bd +103.48.120.0 - 103.48.123.255 jp +103.48.124.0 - 103.48.127.255 in +103.48.128.0 - 103.48.131.255 id +103.48.132.0 - 103.48.135.255 hk +103.48.136.0 - 103.48.139.255 jp +103.48.140.0 - 103.48.143.255 hk +103.48.144.0 - 103.48.159.255 cn +103.48.160.0 - 103.48.167.255 jp +103.48.168.0 - 103.48.171.255 hk +103.48.172.0 - 103.48.175.255 sg +103.48.176.0 - 103.48.187.255 in +103.48.188.0 - 103.48.195.255 vn +103.48.196.0 - 103.48.199.255 in +103.48.200.0 - 103.48.201.255 au +103.48.202.0 - 103.48.203.255 cn +103.48.204.0 - 103.48.207.255 th +103.48.208.0 - 103.48.211.255 au +103.48.212.0 - 103.48.213.255 in +103.48.214.0 - 103.48.215.255 au +103.48.216.0 - 103.48.247.255 cn +103.48.248.0 - 103.48.251.255 jp +103.48.252.0 - 103.48.255.255 in +103.49.0.0 - 103.49.3.255 jp +103.49.4.0 - 103.49.7.255 au +103.49.8.0 - 103.49.11.255 hk +103.49.12.0 - 103.49.15.255 cn +103.49.16.0 - 103.49.19.255 au +103.49.20.0 - 103.49.23.255 cn +103.49.24.0 - 103.49.27.255 my +103.49.28.0 - 103.49.31.255 id +103.49.32.0 - 103.49.35.255 sg +103.49.36.0 - 103.49.36.255 ph +103.49.37.0 - 103.49.37.255 id +103.49.38.0 - 103.49.39.255 au +103.49.40.0 - 103.49.43.255 kh +103.49.44.0 - 103.49.47.255 kr +103.49.48.0 - 103.49.59.255 in +103.49.60.0 - 103.49.63.255 hk +103.49.64.0 - 103.49.67.255 jp +103.49.68.0 - 103.49.68.255 in +103.49.69.0 - 103.49.69.255 pk +103.49.70.0 - 103.49.71.255 ph +103.49.72.0 - 103.49.79.255 cn +103.49.80.0 - 103.49.83.255 au +103.49.84.0 - 103.49.91.255 jp +103.49.92.0 - 103.49.99.255 cn +103.49.100.0 - 103.49.103.255 ph +103.49.104.0 - 103.49.105.255 id +103.49.106.0 - 103.49.107.255 au +103.49.108.0 - 103.49.111.255 cn +103.49.112.0 - 103.49.115.255 sg +103.49.116.0 - 103.49.125.255 in +103.49.126.0 - 103.49.126.255 hk +103.49.127.0 - 103.49.127.255 au +103.49.128.0 - 103.49.131.255 cn +103.49.132.0 - 103.49.135.255 hk +103.49.136.0 - 103.49.139.255 pk +103.49.140.0 - 103.49.143.255 jp +103.49.144.0 - 103.49.146.255 au +103.49.147.0 - 103.49.147.255 in +103.49.148.0 - 103.49.149.255 th +103.49.150.0 - 103.49.150.255 nz +103.49.151.0 - 103.49.151.255 au +103.49.152.0 - 103.49.155.255 in +103.49.156.0 - 103.49.163.255 hk +103.49.164.0 - 103.49.167.255 sg +103.49.168.0 - 103.49.171.255 bd +103.49.172.0 - 103.49.172.255 nz +103.49.173.0 - 103.49.175.255 nr +103.49.176.0 - 103.49.183.255 cn +103.49.184.0 - 103.49.195.255 id +103.49.196.0 - 103.49.199.255 cn +103.49.200.0 - 103.49.203.255 bd +103.49.204.0 - 103.49.204.255 in +103.49.205.0 - 103.49.205.255 nz +103.49.206.0 - 103.49.206.255 in +103.49.207.0 - 103.49.207.255 pg +103.49.208.0 - 103.49.215.255 hk +103.49.216.0 - 103.49.219.255 jp +103.49.220.0 - 103.49.223.255 id +103.49.224.0 - 103.49.227.255 in +103.49.228.0 - 103.49.231.255 id +103.49.232.0 - 103.49.245.255 in +103.49.246.0 - 103.49.247.255 hk +103.49.252.0 - 103.49.255.255 in +103.50.0.0 - 103.50.3.255 sg +103.50.4.0 - 103.50.7.255 in +103.50.8.0 - 103.50.11.255 hk +103.50.12.0 - 103.50.13.255 au +103.50.14.0 - 103.50.15.255 sg +103.50.16.0 - 103.50.19.255 hk +103.50.20.0 - 103.50.23.255 jp +103.50.24.0 - 103.50.27.255 id +103.50.28.0 - 103.50.31.255 jp +103.50.32.0 - 103.50.33.255 in +103.50.34.0 - 103.50.35.255 au +103.50.36.0 - 103.50.39.255 cn +103.50.40.0 - 103.50.43.255 kr +103.50.44.0 - 103.50.75.255 cn +103.50.76.0 - 103.50.83.255 in +103.50.84.0 - 103.50.87.255 jp +103.50.88.0 - 103.50.91.255 hk +103.50.92.0 - 103.50.95.255 sg +103.50.96.0 - 103.50.99.255 hk +103.50.100.0 - 103.50.103.255 au +103.50.104.0 - 103.50.107.255 mv +103.50.108.0 - 103.50.127.255 cn +103.50.128.0 - 103.50.131.255 id +103.50.132.0 - 103.50.143.255 cn +103.50.144.0 - 103.50.155.255 in +103.50.156.0 - 103.50.159.255 pk +103.50.160.0 - 103.50.163.255 in +103.50.164.0 - 103.50.167.255 my +103.50.168.0 - 103.50.171.255 bd +103.50.172.0 - 103.50.203.255 cn +103.50.204.0 - 103.50.207.255 mn +103.50.208.0 - 103.50.215.255 in +103.50.216.0 - 103.50.218.255 id +103.50.219.0 - 103.50.219.255 in +103.50.220.0 - 103.50.251.255 cn +103.50.252.0 - 103.50.255.255 hk +103.51.0.0 - 103.51.1.255 in +103.51.2.0 - 103.51.3.255 bd +103.51.4.0 - 103.51.7.255 jp +103.51.8.0 - 103.51.9.255 in +103.51.10.0 - 103.51.11.255 th +103.51.12.0 - 103.51.15.255 hk +103.51.16.0 - 103.51.19.255 np +103.51.20.0 - 103.51.35.255 in +103.51.36.0 - 103.51.39.255 jp +103.51.40.0 - 103.51.40.255 au +103.51.41.0 - 103.51.41.255 my +103.51.42.0 - 103.51.42.255 au +103.51.43.0 - 103.51.43.255 my +103.51.44.0 - 103.51.47.255 id +103.51.48.0 - 103.51.51.255 my +103.51.52.0 - 103.51.59.255 in +103.51.60.0 - 103.51.60.255 mn +103.51.61.0 - 103.51.61.255 au +103.51.62.0 - 103.51.62.255 sg +103.51.63.0 - 103.51.63.255 in +103.51.64.0 - 103.51.67.255 th +103.51.68.0 - 103.51.71.255 au +103.51.72.0 - 103.51.79.255 in +103.51.80.0 - 103.51.87.255 jp +103.51.88.0 - 103.51.99.255 in +103.51.100.0 - 103.51.101.255 nz +103.51.102.0 - 103.51.102.255 in +103.51.103.0 - 103.51.103.255 id +103.51.104.0 - 103.51.107.255 bd +103.51.108.0 - 103.51.111.255 hk +103.51.112.0 - 103.51.115.255 au +103.51.116.0 - 103.51.119.255 in +103.51.120.0 - 103.51.123.255 bd +103.51.124.0 - 103.51.127.255 kh +103.51.128.0 - 103.51.128.255 in +103.51.130.0 - 103.51.130.255 au +103.51.131.0 - 103.51.131.255 id +103.51.132.0 - 103.51.139.255 in +103.51.140.0 - 103.51.141.255 tr +103.51.142.0 - 103.51.142.255 tw +103.51.143.0 - 103.51.143.255 tr +103.51.144.0 - 103.51.147.255 hk +103.51.148.0 - 103.51.155.255 in +103.51.156.0 - 103.51.157.255 nz +103.51.158.0 - 103.51.158.255 id +103.51.159.0 - 103.51.159.255 au +103.51.160.0 - 103.51.163.255 sg +103.51.164.0 - 103.51.167.255 id +103.51.168.0 - 103.51.179.255 kr +103.51.180.0 - 103.51.183.255 jp +103.51.184.0 - 103.51.203.255 kr +103.51.204.0 - 103.51.207.255 jp +103.51.208.0 - 103.51.211.255 in +103.51.212.0 - 103.51.215.255 jp +103.51.216.0 - 103.51.219.255 in +103.51.220.0 - 103.51.220.255 pk +103.51.221.0 - 103.51.221.255 au +103.51.222.0 - 103.51.223.255 in +103.51.224.0 - 103.51.227.255 th +103.51.228.0 - 103.51.231.255 bd +103.51.232.0 - 103.51.239.255 in +103.51.240.0 - 103.51.255.255 kr +103.52.0.0 - 103.52.0.255 in +103.52.1.0 - 103.52.1.255 au +103.52.2.0 - 103.52.3.255 id +103.52.4.0 - 103.52.5.255 au +103.52.6.0 - 103.52.6.255 in +103.52.7.0 - 103.52.7.255 id +103.52.8.0 - 103.52.11.255 in +103.52.12.0 - 103.52.15.255 mm +103.52.16.0 - 103.52.19.255 id +103.52.20.0 - 103.52.23.255 jp +103.52.24.0 - 103.52.31.255 np +103.52.32.0 - 103.52.35.255 sg +103.52.36.0 - 103.52.39.255 in +103.52.40.0 - 103.52.43.255 cn +103.52.44.0 - 103.52.47.255 id +103.52.48.0 - 103.52.55.255 in +103.52.56.0 - 103.52.59.255 my +103.52.60.0 - 103.52.61.255 id +103.52.62.0 - 103.52.62.255 ph +103.52.63.0 - 103.52.63.255 au +103.52.64.0 - 103.52.71.255 id +103.52.72.0 - 103.52.87.255 cn +103.52.88.0 - 103.52.91.255 fj +103.52.92.0 - 103.52.95.255 vn +103.52.96.0 - 103.52.107.255 cn +103.52.108.0 - 103.52.111.255 jp +103.52.112.0 - 103.52.115.255 hk +103.52.116.0 - 103.52.119.255 au +103.52.120.0 - 103.52.123.255 id +103.52.124.0 - 103.52.127.255 in +103.52.128.0 - 103.52.132.255 jp +103.52.133.0 - 103.52.133.255 sg +103.52.134.0 - 103.52.135.255 bd +103.52.136.0 - 103.52.139.255 in +103.52.140.0 - 103.52.143.255 bd +103.52.144.0 - 103.52.147.255 id +103.52.148.0 - 103.52.151.255 jp +103.52.152.0 - 103.52.155.255 hk +103.52.156.0 - 103.52.159.255 nz +103.52.160.0 - 103.52.167.255 cn +103.52.168.0 - 103.52.169.255 au +103.52.170.0 - 103.52.171.255 id +103.52.172.0 - 103.52.179.255 cn +103.52.180.0 - 103.52.183.255 in +103.52.184.0 - 103.52.187.255 cn +103.52.188.0 - 103.52.191.255 hk +103.52.192.0 - 103.52.192.255 my +103.52.193.0 - 103.52.193.255 au +103.52.194.0 - 103.52.194.255 in +103.52.195.0 - 103.52.195.255 us +103.52.196.0 - 103.52.199.255 cn +103.52.200.0 - 103.52.203.255 kr +103.52.204.0 - 103.52.207.255 nz +103.52.208.0 - 103.52.211.255 in +103.52.212.0 - 103.52.212.255 au +103.52.213.0 - 103.52.213.255 id +103.52.214.0 - 103.52.214.255 hk +103.52.215.0 - 103.52.215.255 us +103.52.216.0 - 103.52.219.255 hk +103.52.220.0 - 103.52.227.255 in +103.52.228.0 - 103.52.231.255 mm +103.52.232.0 - 103.52.243.255 jp +103.52.244.0 - 103.52.255.255 in +103.53.0.0 - 103.53.3.255 id +103.53.4.0 - 103.53.7.255 cn +103.53.8.0 - 103.53.11.255 hk +103.53.12.0 - 103.53.15.255 jp +103.53.16.0 - 103.53.19.255 af +103.53.20.0 - 103.53.20.255 id +103.53.21.0 - 103.53.21.255 in +103.53.22.0 - 103.53.23.255 nz +103.53.24.0 - 103.53.27.255 af +103.53.28.0 - 103.53.31.255 jp +103.53.32.0 - 103.53.35.255 my +103.53.36.0 - 103.53.39.255 bd +103.53.40.0 - 103.53.43.255 in +103.53.44.0 - 103.53.47.255 pk +103.53.48.0 - 103.53.51.255 hk +103.53.52.0 - 103.53.55.255 in +103.53.56.0 - 103.53.59.255 ph +103.53.60.0 - 103.53.63.255 in +103.53.64.0 - 103.53.71.255 cn +103.53.72.0 - 103.53.75.255 in +103.53.76.0 - 103.53.79.255 id +103.53.80.0 - 103.53.83.255 in +103.53.84.0 - 103.53.85.255 bd +103.53.86.0 - 103.53.87.255 in +103.53.88.0 - 103.53.91.255 vn +103.53.92.0 - 103.53.95.255 cn +103.53.96.0 - 103.53.99.255 jp +103.53.100.0 - 103.53.103.255 cn +103.53.104.0 - 103.53.113.255 in +103.53.114.0 - 103.53.114.255 kr +103.53.115.0 - 103.53.119.255 au +103.53.120.0 - 103.53.123.255 jp +103.53.124.0 - 103.53.147.255 cn +103.53.148.0 - 103.53.151.255 nz +103.53.152.0 - 103.53.152.32 hk +103.53.152.33 - 103.53.152.37 jp +103.53.152.38 - 103.53.152.43 hk +103.53.152.44 - 103.53.152.45 jp +103.53.152.46 - 103.53.153.255 hk +103.53.154.0 - 103.53.155.255 ph +103.53.156.0 - 103.53.159.255 in +103.53.160.0 - 103.53.163.255 cn +103.53.164.0 - 103.53.167.255 in +103.53.168.0 - 103.53.171.255 vn +103.53.172.0 - 103.53.175.255 sg +103.53.176.0 - 103.53.179.255 pg +103.53.180.0 - 103.53.183.255 cn +103.53.184.0 - 103.53.185.255 id +103.53.186.0 - 103.53.186.255 my +103.53.187.0 - 103.53.187.255 au +103.53.188.0 - 103.53.195.255 id +103.53.196.0 - 103.53.196.255 au +103.53.197.0 - 103.53.198.255 sg +103.53.199.0 - 103.53.199.255 hk +103.53.200.0 - 103.53.203.255 au +103.53.204.0 - 103.53.211.255 cn +103.53.216.0 - 103.53.219.255 cn +103.53.220.0 - 103.53.223.255 ph +103.53.224.0 - 103.53.227.255 hk +103.53.228.0 - 103.53.231.255 vn +103.53.232.0 - 103.53.235.255 in +103.53.236.0 - 103.53.239.255 cn +103.53.240.0 - 103.53.247.255 in +103.53.248.0 - 103.53.251.255 cn +103.53.252.0 - 103.53.255.255 vn +103.54.0.0 - 103.54.3.255 id +103.54.4.0 - 103.54.7.255 hk +103.54.8.0 - 103.54.11.255 cn +103.54.12.0 - 103.54.35.255 in +103.54.36.0 - 103.54.43.255 bd +103.54.44.0 - 103.54.47.255 hk +103.54.48.0 - 103.54.51.255 cn +103.54.52.0 - 103.54.55.255 my +103.54.56.0 - 103.54.59.255 jp +103.54.60.0 - 103.54.63.255 cn +103.54.64.0 - 103.54.67.255 in +103.54.68.0 - 103.54.71.255 au +103.54.72.0 - 103.54.75.255 kr +103.54.76.0 - 103.54.87.255 pk +103.54.88.0 - 103.54.91.255 jp +103.54.92.0 - 103.54.95.255 id +103.54.96.0 - 103.54.109.255 in +103.54.110.0 - 103.54.110.255 my +103.54.111.0 - 103.54.111.255 au +103.54.112.0 - 103.54.115.255 kh +103.54.116.0 - 103.54.131.255 hk +103.54.132.0 - 103.54.133.255 au +103.54.134.0 - 103.54.134.255 id +103.54.135.0 - 103.54.141.255 in +103.54.142.0 - 103.54.142.255 ph +103.54.143.0 - 103.54.147.255 in +103.54.148.0 - 103.54.151.255 bd +103.54.152.0 - 103.54.155.255 sg +103.54.156.0 - 103.54.159.255 jp +103.54.160.0 - 103.54.167.255 cn +103.54.168.0 - 103.54.171.255 in +103.54.172.0 - 103.54.172.255 id +103.54.173.0 - 103.54.175.255 in +103.54.176.0 - 103.54.179.255 hk +103.54.180.0 - 103.54.183.255 in +103.54.184.0 - 103.54.187.255 jp +103.54.188.0 - 103.54.191.255 in +103.54.192.0 - 103.54.195.255 hk +103.54.196.0 - 103.54.203.255 in +103.54.204.0 - 103.54.211.255 jp +103.54.212.0 - 103.54.215.255 cn +103.54.216.0 - 103.54.219.255 id +103.54.220.0 - 103.54.223.255 in +103.54.224.0 - 103.54.224.255 nz +103.54.225.0 - 103.54.227.255 id +103.54.228.0 - 103.54.231.255 cn +103.54.232.0 - 103.54.235.255 au +103.54.236.0 - 103.54.237.255 in +103.54.238.0 - 103.54.239.255 au +103.54.240.0 - 103.54.243.255 cn +103.54.244.0 - 103.54.247.255 in +103.54.248.0 - 103.54.255.255 vn +103.55.0.0 - 103.55.3.255 th +103.55.4.0 - 103.55.7.255 jp +103.55.8.0 - 103.55.8.255 hk +103.55.9.0 - 103.55.9.255 sg +103.55.10.0 - 103.55.10.255 my +103.55.11.0 - 103.55.11.255 bn +103.55.12.0 - 103.55.15.255 jp +103.55.16.0 - 103.55.19.255 au +103.55.20.0 - 103.55.31.255 hk +103.55.32.0 - 103.55.32.255 au +103.55.33.0 - 103.55.33.255 id +103.55.34.0 - 103.55.34.255 au +103.55.35.0 - 103.55.35.255 kr +103.55.36.0 - 103.55.39.255 id +103.55.40.0 - 103.55.43.255 in +103.55.44.0 - 103.55.47.255 au +103.55.48.0 - 103.55.51.255 tl +103.55.52.0 - 103.55.53.255 au +103.55.54.0 - 103.55.55.255 th +103.55.56.0 - 103.55.57.255 id +103.55.58.0 - 103.55.58.255 au +103.55.59.0 - 103.55.59.255 th +103.55.60.0 - 103.55.67.255 in +103.55.68.0 - 103.55.71.255 pk +103.55.72.0 - 103.55.75.255 in +103.55.76.0 - 103.55.79.255 au +103.55.80.0 - 103.55.83.255 cn +103.55.84.0 - 103.55.91.255 in +103.55.92.0 - 103.55.95.255 au +103.55.96.0 - 103.55.111.255 in +103.55.112.0 - 103.55.113.255 hk +103.55.114.0 - 103.55.119.255 au +103.55.120.0 - 103.55.123.255 cn +103.55.124.0 - 103.55.127.255 sg +103.55.128.0 - 103.55.131.255 hk +103.55.132.0 - 103.55.132.255 au +103.55.133.0 - 103.55.133.255 pk +103.55.134.0 - 103.55.135.255 au +103.55.136.0 - 103.55.137.255 pk +103.55.138.0 - 103.55.138.255 sg +103.55.139.0 - 103.55.139.255 id +103.55.140.0 - 103.55.143.255 th +103.55.144.0 - 103.55.147.255 bd +103.55.148.0 - 103.55.151.255 au +103.55.152.0 - 103.55.155.255 cn +103.55.156.0 - 103.55.159.255 jp +103.55.160.0 - 103.55.160.255 id +103.55.161.0 - 103.55.161.255 ph +103.55.162.0 - 103.55.163.255 au +103.55.164.0 - 103.55.171.255 in +103.55.172.0 - 103.55.175.255 cn +103.55.176.0 - 103.55.177.255 au +103.55.178.0 - 103.55.178.255 af +103.55.179.0 - 103.55.179.255 nz +103.55.180.0 - 103.55.187.255 in +103.55.188.0 - 103.55.191.255 kr +103.55.192.0 - 103.55.199.255 jp +103.55.200.0 - 103.55.203.255 hk +103.55.204.0 - 103.55.211.255 cn +103.55.212.0 - 103.55.212.255 au +103.55.213.0 - 103.55.215.255 in +103.55.216.0 - 103.55.216.255 id +103.55.217.0 - 103.55.217.255 au +103.55.218.0 - 103.55.218.255 hk +103.55.219.0 - 103.55.219.255 au +103.55.220.0 - 103.55.223.255 id +103.55.224.0 - 103.55.227.255 au +103.55.228.0 - 103.55.231.255 cn +103.55.232.0 - 103.55.235.255 au +103.55.236.0 - 103.55.243.255 cn +103.55.244.0 - 103.55.255.255 in +103.56.0.0 - 103.56.3.255 au +103.56.4.0 - 103.56.7.255 bd +103.56.8.0 - 103.56.11.255 cn +103.56.12.0 - 103.56.15.255 au +103.56.16.0 - 103.56.23.255 cn +103.56.24.0 - 103.56.27.255 hk +103.56.28.0 - 103.56.30.255 in +103.56.31.0 - 103.56.31.255 au +103.56.32.0 - 103.56.35.255 cn +103.56.36.0 - 103.56.43.255 in +103.56.44.0 - 103.56.47.255 hk +103.56.48.0 - 103.56.51.255 jp +103.56.52.0 - 103.56.55.255 hk +103.56.56.0 - 103.56.63.255 cn +103.56.64.0 - 103.56.69.255 in +103.56.70.0 - 103.56.70.255 id +103.56.71.0 - 103.56.71.255 au +103.56.72.0 - 103.56.79.255 cn +103.56.80.0 - 103.56.83.255 jp +103.56.84.0 - 103.56.95.255 in +103.56.96.0 - 103.56.99.255 jp +103.56.100.0 - 103.56.107.255 cn +103.56.108.0 - 103.56.111.255 jp +103.56.112.0 - 103.56.119.255 hk +103.56.120.0 - 103.56.123.255 in +103.56.124.0 - 103.56.127.255 sg +103.56.128.0 - 103.56.131.255 ph +103.56.132.0 - 103.56.135.255 jp +103.56.136.0 - 103.56.139.255 hk +103.56.140.0 - 103.56.143.255 cn +103.56.144.0 - 103.56.149.255 id +103.56.150.0 - 103.56.151.255 au +103.56.152.0 - 103.56.155.255 cn +103.56.156.0 - 103.56.171.255 vn +103.56.172.0 - 103.56.173.255 in +103.56.174.0 - 103.56.174.255 kh +103.56.175.0 - 103.56.183.255 in +103.56.184.0 - 103.56.187.255 cn +103.56.188.0 - 103.56.191.255 id +103.56.192.0 - 103.56.195.255 hk +103.56.196.0 - 103.56.199.255 in +103.56.200.0 - 103.56.203.255 cn +103.56.204.0 - 103.56.207.255 id +103.56.208.0 - 103.56.209.255 bd +103.56.210.0 - 103.56.211.255 in +103.56.212.0 - 103.56.215.255 jp +103.56.216.0 - 103.56.217.255 hk +103.56.218.0 - 103.56.219.255 jp +103.56.220.0 - 103.56.231.255 in +103.56.232.0 - 103.56.235.255 id +103.56.236.0 - 103.56.255.255 in +103.57.0.0 - 103.57.3.255 au +103.57.4.0 - 103.57.7.255 jp +103.57.8.0 - 103.57.11.255 id +103.57.12.0 - 103.57.15.255 cn +103.57.16.0 - 103.57.19.255 in +103.57.20.0 - 103.57.23.255 bd +103.57.24.0 - 103.57.27.255 hk +103.57.28.0 - 103.57.31.255 jp +103.57.32.0 - 103.57.35.255 au +103.57.36.0 - 103.57.39.255 id +103.57.40.0 - 103.57.43.255 bd +103.57.44.0 - 103.57.51.255 jp +103.57.52.0 - 103.57.59.255 cn +103.57.60.0 - 103.57.63.255 kr +103.57.64.0 - 103.57.67.255 in +103.57.68.0 - 103.57.68.255 au +103.57.69.0 - 103.57.71.255 in +103.57.72.0 - 103.57.75.255 sg +103.57.76.0 - 103.57.79.255 cn +103.57.80.0 - 103.57.88.255 in +103.57.89.0 - 103.57.89.255 au +103.57.90.0 - 103.57.90.255 hk +103.57.91.0 - 103.57.91.255 au +103.57.92.0 - 103.57.95.255 mn +103.57.96.0 - 103.57.103.255 jp +103.57.104.0 - 103.57.107.255 vn +103.57.108.0 - 103.57.111.255 cn +103.57.112.0 - 103.57.115.255 vn +103.57.116.0 - 103.57.123.255 bd +103.57.124.0 - 103.57.127.255 in +103.57.128.0 - 103.57.131.255 jp +103.57.132.0 - 103.57.135.255 in +103.57.136.0 - 103.57.139.255 cn +103.57.140.0 - 103.57.143.255 in +103.57.144.0 - 103.57.147.255 jp +103.57.148.0 - 103.57.149.255 au +103.57.150.0 - 103.57.150.255 in +103.57.151.0 - 103.57.151.255 bd +103.57.152.0 - 103.57.155.255 pk +103.57.156.0 - 103.57.159.255 sg +103.57.160.0 - 103.57.163.255 in +103.57.164.0 - 103.57.164.255 sg +103.57.165.0 - 103.57.167.255 au +103.57.168.0 - 103.57.171.255 pk +103.57.172.0 - 103.57.187.255 in +103.57.188.0 - 103.57.191.255 my +103.57.192.0 - 103.57.195.255 id +103.57.196.0 - 103.57.199.255 cn +103.57.200.0 - 103.57.203.255 hk +103.57.204.0 - 103.57.207.255 np +103.57.208.0 - 103.57.211.255 vn +103.57.212.0 - 103.57.219.255 in +103.57.220.0 - 103.57.223.255 vn +103.57.224.0 - 103.57.225.255 hk +103.57.226.0 - 103.57.226.255 in +103.57.227.0 - 103.57.227.255 ph +103.57.228.0 - 103.57.231.255 hk +103.57.232.0 - 103.57.235.255 mp +103.57.236.0 - 103.58.15.255 in +103.58.16.0 - 103.58.19.255 my +103.58.20.0 - 103.58.23.255 fj +103.58.24.0 - 103.58.27.255 cn +103.58.28.0 - 103.58.31.255 in +103.58.32.0 - 103.58.32.255 au +103.58.33.0 - 103.58.33.255 id +103.58.34.0 - 103.58.35.255 au +103.58.36.0 - 103.58.67.255 in +103.58.68.0 - 103.58.71.255 jp +103.58.72.0 - 103.58.75.255 bd +103.58.76.0 - 103.58.91.255 in +103.58.92.0 - 103.58.95.255 bd +103.58.96.0 - 103.58.99.255 in +103.58.100.0 - 103.58.107.255 id +103.58.108.0 - 103.58.109.255 bd +103.58.110.0 - 103.58.110.255 sg +103.58.111.0 - 103.58.111.255 id +103.58.112.0 - 103.58.112.255 sg +103.58.113.0 - 103.58.113.255 my +103.58.114.0 - 103.58.143.255 in +103.58.144.0 - 103.58.145.255 np +103.58.146.0 - 103.58.147.255 id +103.58.148.0 - 103.58.151.255 th +103.58.152.0 - 103.58.159.255 in +103.58.160.0 - 103.58.163.255 id +103.58.164.0 - 103.58.175.255 in +103.58.176.0 - 103.58.179.255 hk +103.58.180.0 - 103.58.180.255 in +103.58.181.0 - 103.58.181.255 hk +103.58.182.0 - 103.58.183.255 cn +103.58.184.0 - 103.58.191.255 in +103.58.192.0 - 103.58.199.255 au +103.58.200.0 - 103.58.211.255 in +103.58.212.0 - 103.58.223.255 au +103.58.224.0 - 103.58.227.255 kh +103.58.228.0 - 103.58.231.255 nz +103.58.232.0 - 103.58.232.255 au +103.58.233.0 - 103.59.31.255 in +103.59.32.0 - 103.59.35.255 jp +103.59.36.0 - 103.59.39.255 bd +103.59.40.0 - 103.59.51.255 hk +103.59.52.0 - 103.59.55.255 la +103.59.56.0 - 103.59.75.255 in +103.59.76.0 - 103.59.79.255 cn +103.59.80.0 - 103.59.88.255 in +103.59.89.0 - 103.59.89.255 jp +103.59.90.0 - 103.59.91.255 hk +103.59.92.0 - 103.59.95.255 kr +103.59.96.0 - 103.59.99.255 in +103.59.100.0 - 103.59.103.255 cn +103.59.104.0 - 103.59.107.255 in +103.59.108.0 - 103.59.111.255 au +103.59.112.0 - 103.59.131.255 cn +103.59.132.0 - 103.59.135.255 in +103.59.136.0 - 103.59.139.255 jp +103.59.144.0 - 103.59.147.255 hk +103.59.148.0 - 103.59.151.255 cn +103.59.152.0 - 103.59.155.255 in +103.59.156.0 - 103.59.159.255 kr +103.59.160.0 - 103.59.163.255 au +103.59.164.0 - 103.59.167.255 cn +103.59.168.0 - 103.59.171.255 bd +103.59.172.0 - 103.59.175.255 kh +103.59.176.0 - 103.59.179.255 bd +103.59.180.0 - 103.59.181.255 in +103.59.182.0 - 103.59.183.255 au +103.59.184.0 - 103.59.215.255 in +103.59.216.0 - 103.59.219.255 cn +103.59.220.0 - 103.59.223.255 tw +103.59.224.0 - 103.59.232.255 in +103.59.233.0 - 103.59.233.255 bd +103.59.234.0 - 103.59.235.255 id +103.59.236.0 - 103.60.3.255 in +103.60.4.0 - 103.60.7.255 jp +103.60.8.0 - 103.60.11.255 sg +103.60.12.0 - 103.60.15.255 jp +103.60.16.0 - 103.60.19.255 vn +103.60.20.0 - 103.60.20.255 au +103.60.21.0 - 103.60.21.255 in +103.60.22.0 - 103.60.23.255 au +103.60.24.0 - 103.60.27.255 my +103.60.28.0 - 103.60.31.255 in +103.60.32.0 - 103.60.35.255 cn +103.60.36.0 - 103.60.39.255 jp +103.60.40.0 - 103.60.43.255 in +103.60.44.0 - 103.60.47.255 cn +103.60.48.0 - 103.60.55.255 in +103.60.56.0 - 103.60.67.255 hk +103.60.68.0 - 103.60.87.255 in +103.60.88.0 - 103.60.95.255 jp +103.60.96.0 - 103.60.96.255 au +103.60.97.0 - 103.60.97.255 mn +103.60.98.0 - 103.60.98.255 au +103.60.99.0 - 103.60.99.255 nz +103.60.100.0 - 103.60.104.255 in +103.60.105.0 - 103.60.107.255 au +103.60.108.0 - 103.60.111.255 hk +103.60.112.0 - 103.60.119.255 in +103.60.120.0 - 103.60.127.255 kr +103.60.128.0 - 103.60.131.255 in +103.60.132.0 - 103.60.134.255 au +103.60.135.0 - 103.60.143.255 in +103.60.144.0 - 103.60.151.255 hk +103.60.152.0 - 103.60.155.255 au +103.60.156.0 - 103.60.159.255 in +103.60.160.0 - 103.60.163.255 bd +103.60.164.0 - 103.60.167.255 cn +103.60.168.0 - 103.60.171.255 ph +103.60.172.0 - 103.60.175.255 bd +103.60.176.0 - 103.60.179.255 in +103.60.180.0 - 103.60.183.255 id +103.60.184.0 - 103.60.184.255 ph +103.60.185.0 - 103.60.185.255 th +103.60.186.0 - 103.60.187.255 in +103.60.188.0 - 103.60.191.255 jp +103.60.192.0 - 103.60.195.255 nz +103.60.196.0 - 103.60.199.255 in +103.60.200.0 - 103.60.203.255 au +103.60.204.0 - 103.60.207.255 jp +103.60.208.0 - 103.60.215.255 in +103.60.216.0 - 103.60.216.255 au +103.60.217.0 - 103.60.217.255 sg +103.60.218.0 - 103.60.219.255 in +103.60.220.0 - 103.60.223.255 hk +103.60.224.0 - 103.60.227.255 jp +103.60.228.0 - 103.60.231.255 cn +103.60.232.0 - 103.60.235.255 hk +103.60.236.0 - 103.60.239.255 cn +103.60.240.0 - 103.60.243.255 au +103.60.244.0 - 103.60.247.255 in +103.60.248.0 - 103.60.251.255 hk +103.60.252.0 - 103.60.255.255 ph +103.61.0.0 - 103.61.3.255 hk +103.61.4.0 - 103.61.7.255 sg +103.61.8.0 - 103.61.11.255 mm +103.61.12.0 - 103.61.15.255 in +103.61.16.0 - 103.61.19.255 id +103.61.20.0 - 103.61.23.255 hk +103.61.24.0 - 103.61.27.255 kh +103.61.28.0 - 103.61.31.255 hk +103.61.32.0 - 103.61.35.255 in +103.61.36.0 - 103.61.39.255 hk +103.61.40.0 - 103.61.40.255 au +103.61.41.0 - 103.61.41.255 id +103.61.42.0 - 103.61.43.255 au +103.61.44.0 - 103.61.51.255 vn +103.61.52.0 - 103.61.59.255 in +103.61.60.0 - 103.61.63.255 cn +103.61.64.0 - 103.61.68.255 in +103.61.69.0 - 103.61.69.255 nz +103.61.70.0 - 103.61.70.255 au +103.61.71.0 - 103.61.71.255 id +103.61.72.0 - 103.61.91.255 in +103.61.92.0 - 103.61.95.255 kh +103.61.96.0 - 103.61.99.255 au +103.61.100.0 - 103.61.103.255 in +103.61.104.0 - 103.61.107.255 cn +103.61.108.0 - 103.61.115.255 in +103.61.116.0 - 103.61.119.255 id +103.61.120.0 - 103.61.123.255 hk +103.61.124.0 - 103.61.127.255 my +103.61.128.0 - 103.61.131.255 au +103.61.132.0 - 103.61.135.255 in +103.61.136.0 - 103.61.139.255 tw +103.61.140.0 - 103.61.143.255 cn +103.61.144.0 - 103.61.147.255 hk +103.61.148.0 - 103.61.150.255 in +103.61.151.0 - 103.61.151.255 jp +103.61.152.0 - 103.61.163.255 cn +103.61.164.0 - 103.61.167.255 in +103.61.168.0 - 103.61.171.255 hk +103.61.172.0 - 103.61.179.255 cn +103.61.180.0 - 103.61.183.255 in +103.61.184.0 - 103.61.191.255 cn +103.61.192.0 - 103.61.193.255 sg +103.61.194.0 - 103.61.219.255 in +103.61.220.0 - 103.61.223.255 hk +103.61.224.0 - 103.61.229.255 au +103.61.230.0 - 103.61.231.255 in +103.61.232.0 - 103.61.235.255 jp +103.61.236.0 - 103.61.243.255 hk +103.61.244.0 - 103.61.247.255 jp +103.61.248.0 - 103.61.251.255 id +103.61.252.0 - 103.61.255.255 in +103.62.0.0 - 103.62.3.255 ph +103.62.4.0 - 103.62.7.255 sg +103.62.8.0 - 103.62.11.255 vn +103.62.12.0 - 103.62.23.255 in +103.62.24.0 - 103.62.27.255 cn +103.62.28.0 - 103.62.29.255 au +103.62.30.0 - 103.62.31.255 ph +103.62.32.0 - 103.62.39.255 au +103.62.40.0 - 103.62.43.255 in +103.62.44.0 - 103.62.47.255 hk +103.62.48.0 - 103.62.48.255 sg +103.62.49.0 - 103.62.49.255 nz +103.62.50.0 - 103.62.51.254 au +103.62.51.255 - 103.62.51.255 hk +103.62.52.0 - 103.62.55.255 cn +103.62.56.0 - 103.62.71.255 in +103.62.72.0 - 103.62.91.255 cn +103.62.92.0 - 103.62.95.255 in +103.62.96.0 - 103.62.135.255 cn +103.62.136.0 - 103.62.139.255 in +103.62.140.0 - 103.62.145.255 bd +103.62.146.0 - 103.62.147.255 in +103.62.148.0 - 103.62.151.255 hk +103.62.152.0 - 103.62.155.255 ph +103.62.156.0 - 103.62.195.255 cn +103.62.196.0 - 103.62.197.255 id +103.62.198.0 - 103.62.199.255 in +103.62.200.0 - 103.62.201.255 au +103.62.202.0 - 103.62.203.255 id +103.62.204.0 - 103.62.227.255 cn +103.62.228.0 - 103.62.231.255 kr +103.62.232.0 - 103.62.235.255 pk +103.62.236.0 - 103.62.239.255 in +103.62.240.0 - 103.62.243.255 sg +103.62.244.0 - 103.62.247.255 jp +103.62.248.0 - 103.62.255.255 in +103.63.0.0 - 103.63.7.255 hk +103.63.8.0 - 103.63.25.255 in +103.63.26.0 - 103.63.26.255 au +103.63.27.0 - 103.63.27.255 ws +103.63.28.0 - 103.63.31.255 in +103.63.32.0 - 103.63.91.255 cn +103.63.92.0 - 103.63.95.255 nz +103.63.96.0 - 103.63.99.255 id +103.63.100.0 - 103.63.100.255 au +103.63.101.0 - 103.63.101.255 in +103.63.102.0 - 103.63.102.255 ph +103.63.103.0 - 103.63.103.255 au +103.63.104.0 - 103.63.123.255 vn +103.63.124.0 - 103.63.131.255 in +103.63.132.0 - 103.63.139.255 hk +103.63.140.0 - 103.63.147.255 cn +103.63.148.0 - 103.63.151.255 in +103.63.152.0 - 103.63.155.255 cn +103.63.156.0 - 103.63.159.255 bd +103.63.160.0 - 103.63.187.255 cn +103.63.188.0 - 103.63.188.255 la +103.63.189.0 - 103.63.189.255 au +103.63.190.0 - 103.63.190.255 kh +103.63.191.0 - 103.63.191.255 au +103.63.192.0 - 103.63.211.255 cn +103.63.212.0 - 103.63.215.255 vn +103.63.216.0 - 103.63.227.255 jp +103.63.228.0 - 103.63.231.255 au +103.63.232.0 - 103.63.232.255 in +103.63.233.0 - 103.63.233.255 id +103.63.234.0 - 103.63.235.255 bd +103.63.236.0 - 103.63.239.255 hk +103.63.240.0 - 103.63.255.255 cn +103.192.0.0 - 103.192.31.255 cn +103.192.32.0 - 103.192.35.255 in +103.192.36.0 - 103.192.43.255 hk +103.192.44.0 - 103.192.47.255 mo +103.192.48.0 - 103.192.59.255 cn +103.192.60.0 - 103.192.67.255 in +103.192.68.0 - 103.192.71.255 jp +103.192.72.0 - 103.192.75.255 in +103.192.76.0 - 103.192.79.255 np +103.192.80.0 - 103.192.80.255 nz +103.192.81.0 - 103.192.81.255 af +103.192.82.0 - 103.192.83.255 au +103.192.84.0 - 103.192.115.255 cn +103.192.116.0 - 103.192.119.255 in +103.192.120.0 - 103.192.123.255 jp +103.192.124.0 - 103.192.127.255 ph +103.192.128.0 - 103.192.147.255 cn +103.192.148.0 - 103.192.151.255 jp +103.192.152.0 - 103.192.155.255 au +103.192.156.0 - 103.192.159.255 bd +103.192.160.0 - 103.192.163.255 hk +103.192.164.0 - 103.192.167.255 cn +103.192.168.0 - 103.192.172.255 in +103.192.173.0 - 103.192.173.255 au +103.192.174.0 - 103.192.174.255 mm +103.192.175.0 - 103.192.175.255 au +103.192.176.0 - 103.192.179.255 hk +103.192.180.0 - 103.192.183.255 kh +103.192.184.0 - 103.192.187.255 ph +103.192.188.0 - 103.192.191.255 cn +103.192.192.0 - 103.192.196.255 au +103.192.197.0 - 103.192.197.255 nz +103.192.198.0 - 103.192.199.255 in +103.192.200.0 - 103.192.203.255 hk +103.192.204.0 - 103.192.207.255 in +103.192.208.0 - 103.192.219.255 cn +103.192.220.0 - 103.192.223.255 in +103.192.224.0 - 103.192.227.255 hk +103.192.228.0 - 103.192.235.255 jp +103.192.236.0 - 103.192.239.255 vn +103.192.240.0 - 103.192.243.255 nz +103.192.244.0 - 103.192.251.255 in +103.192.252.0 - 103.192.255.255 cn +103.193.0.0 - 103.193.3.255 in +103.193.4.0 - 103.193.7.255 mx +103.193.8.0 - 103.193.9.255 nz +103.193.10.0 - 103.193.11.255 au +103.193.12.0 - 103.193.15.255 jp +103.193.16.0 - 103.193.16.255 nz +103.193.17.0 - 103.193.17.255 au +103.193.18.0 - 103.193.18.255 pk +103.193.19.0 - 103.193.19.255 id +103.193.20.0 - 103.193.31.255 in +103.193.32.0 - 103.193.35.255 hk +103.193.36.0 - 103.193.37.255 in +103.193.38.0 - 103.193.39.255 nz +103.193.40.0 - 103.193.47.255 cn +103.193.48.0 - 103.193.67.255 in +103.193.68.0 - 103.193.71.255 hk +103.193.72.0 - 103.193.75.255 jp +103.193.76.0 - 103.193.76.255 au +103.193.77.0 - 103.193.77.255 in +103.193.78.0 - 103.193.78.255 au +103.193.79.0 - 103.193.79.255 in +103.193.80.0 - 103.193.83.255 au +103.193.84.0 - 103.193.115.255 in +103.193.116.0 - 103.193.119.255 id +103.193.120.0 - 103.193.127.255 cn +103.193.128.0 - 103.193.135.255 hk +103.193.136.0 - 103.193.139.255 nz +103.193.140.0 - 103.193.151.255 cn +103.193.152.0 - 103.193.159.255 in +103.193.160.0 - 103.193.163.255 cn +103.193.164.0 - 103.193.164.255 nz +103.193.165.0 - 103.193.165.255 ph +103.193.166.0 - 103.193.167.255 au +103.193.168.0 - 103.193.171.255 bd +103.193.172.0 - 103.193.175.255 hk +103.193.176.0 - 103.193.179.255 jp +103.193.180.0 - 103.193.183.255 kh +103.193.184.0 - 103.193.187.255 jp +103.193.188.0 - 103.193.195.255 cn +103.193.196.0 - 103.193.203.255 in +103.193.204.0 - 103.193.207.255 kh +103.193.208.0 - 103.193.211.255 au +103.193.212.0 - 103.193.243.255 cn +103.193.244.0 - 103.193.251.255 hk +103.193.252.0 - 103.193.255.255 in +103.194.0.0 - 103.194.7.255 au +103.194.8.0 - 103.194.15.255 in +103.194.16.0 - 103.194.19.255 cn +103.194.20.0 - 103.194.35.255 in +103.194.36.0 - 103.194.39.255 hk +103.194.40.0 - 103.194.41.255 jp +103.194.42.0 - 103.194.42.255 kr +103.194.43.0 - 103.194.43.255 hk +103.194.44.0 - 103.194.47.255 in +103.194.48.0 - 103.194.51.255 au +103.194.52.0 - 103.194.67.255 in +103.194.68.0 - 103.194.68.255 au +103.194.69.0 - 103.194.71.255 in +103.194.72.0 - 103.194.75.255 jp +103.194.76.0 - 103.194.79.255 sg +103.194.80.0 - 103.194.83.255 my +103.194.84.0 - 103.194.87.255 kh +103.194.88.0 - 103.194.91.255 in +103.194.96.0 - 103.194.99.255 in +103.194.100.0 - 103.194.107.255 hk +103.194.108.0 - 103.194.111.255 kr +103.194.112.0 - 103.194.112.255 nz +103.194.113.0 - 103.194.113.255 au +103.194.114.0 - 103.194.114.255 in +103.194.115.0 - 103.194.115.255 au +103.194.116.0 - 103.194.120.255 in +103.194.121.0 - 103.194.121.255 au +103.194.122.0 - 103.194.123.255 in +103.194.124.0 - 103.194.127.255 au +103.194.128.0 - 103.194.129.255 in +103.194.130.0 - 103.194.130.255 id +103.194.131.0 - 103.194.147.255 in +103.194.148.0 - 103.194.151.255 hk +103.194.152.0 - 103.194.163.255 in +103.194.164.0 - 103.194.167.255 jp +103.194.168.0 - 103.194.171.255 nl +103.194.172.0 - 103.194.175.255 id +103.194.176.0 - 103.194.179.255 mn +103.194.180.0 - 103.194.183.255 in +103.194.188.0 - 103.194.191.255 vn +103.194.192.0 - 103.194.211.255 in +103.194.212.0 - 103.194.213.255 hk +103.194.214.0 - 103.194.215.255 au +103.194.216.0 - 103.194.227.255 in +103.194.228.0 - 103.194.228.255 sg +103.194.229.0 - 103.194.229.255 au +103.194.230.0 - 103.194.231.255 cn +103.194.232.0 - 103.194.235.255 in +103.194.236.0 - 103.194.239.255 hk +103.194.240.0 - 103.194.243.255 in +103.194.244.0 - 103.194.247.255 hk +103.194.248.0 - 103.194.251.255 in +103.194.252.0 - 103.194.255.255 kr +103.195.0.0 - 103.195.3.255 bd +103.195.4.0 - 103.195.7.255 hk +103.195.8.0 - 103.195.11.255 nz +103.195.12.0 - 103.195.15.255 au +103.195.16.0 - 103.195.16.255 in +103.195.18.0 - 103.195.19.255 id +103.195.20.0 - 103.195.23.255 my +103.195.24.0 - 103.195.27.255 in +103.195.28.0 - 103.195.28.255 sg +103.195.29.0 - 103.195.31.255 id +103.195.32.0 - 103.195.35.255 sg +103.195.36.0 - 103.195.47.255 in +103.195.48.0 - 103.195.51.255 hk +103.195.52.0 - 103.195.53.255 au +103.195.54.0 - 103.195.55.255 bd +103.195.56.0 - 103.195.59.255 id +103.195.60.0 - 103.195.64.255 au +103.195.65.0 - 103.195.65.255 id +103.195.66.0 - 103.195.67.255 au +103.195.68.0 - 103.195.87.255 in +103.195.88.0 - 103.195.91.255 id +103.195.92.0 - 103.195.99.255 in +103.195.100.0 - 103.195.103.255 us +103.195.104.0 - 103.195.107.255 cn +103.195.108.0 - 103.195.111.255 hk +103.195.112.0 - 103.195.115.255 cn +103.195.116.0 - 103.195.119.255 hk +103.195.120.0 - 103.195.127.255 in +103.195.128.0 - 103.195.131.255 au +103.195.132.0 - 103.195.135.255 hk +103.195.136.0 - 103.195.139.255 cn +103.195.140.0 - 103.195.141.255 bd +103.195.142.0 - 103.195.142.255 id +103.195.143.0 - 103.195.143.255 my +103.195.144.0 - 103.195.147.255 jp +103.195.148.0 - 103.195.155.255 cn +103.195.156.0 - 103.195.159.255 id +103.195.160.0 - 103.195.163.255 cn +103.195.164.0 - 103.195.169.255 id +103.195.170.0 - 103.195.171.255 au +103.195.172.0 - 103.195.186.255 in +103.195.187.0 - 103.195.187.255 hk +103.195.188.0 - 103.195.191.255 sg +103.195.192.0 - 103.195.195.255 cn +103.195.196.0 - 103.195.203.255 in +103.195.204.0 - 103.195.205.255 bd +103.195.206.0 - 103.195.207.255 au +103.195.208.0 - 103.195.235.255 in +103.195.236.0 - 103.195.243.255 vn +103.195.244.0 - 103.196.11.255 in +103.196.12.0 - 103.196.13.255 th +103.196.14.0 - 103.196.14.255 id +103.196.15.0 - 103.196.15.255 in +103.196.16.0 - 103.196.19.255 vn +103.196.20.0 - 103.196.23.255 hk +103.196.24.0 - 103.196.25.255 nz +103.196.26.0 - 103.196.35.255 in +103.196.36.0 - 103.196.39.255 us +103.196.40.0 - 103.196.41.255 pk +103.196.42.0 - 103.196.47.255 id +103.196.48.0 - 103.196.51.255 cn +103.196.52.0 - 103.196.55.255 in +103.196.56.0 - 103.196.59.255 ph +103.196.60.0 - 103.196.67.255 cn +103.196.68.0 - 103.196.71.255 au +103.196.72.0 - 103.196.75.255 cn +103.196.76.0 - 103.196.79.255 in +103.196.80.0 - 103.196.85.255 au +103.196.86.0 - 103.196.87.255 hk +103.196.88.0 - 103.196.99.255 cn +103.196.100.0 - 103.196.103.255 hk +103.196.104.0 - 103.196.107.255 ph +103.196.108.0 - 103.196.109.255 nz +103.196.110.0 - 103.196.110.255 in +103.196.111.0 - 103.196.111.255 au +103.196.112.0 - 103.196.115.255 sg +103.196.116.0 - 103.196.116.255 id +103.196.117.0 - 103.196.117.255 in +103.196.118.0 - 103.196.119.255 au +103.196.120.0 - 103.196.127.255 hk +103.196.128.0 - 103.196.131.255 ph +103.196.132.0 - 103.196.135.255 in +103.196.136.0 - 103.196.139.255 ph +103.196.140.0 - 103.196.143.255 au +103.196.144.0 - 103.196.147.255 in +103.196.148.0 - 103.196.151.255 au +103.196.152.0 - 103.196.155.255 hk +103.196.156.0 - 103.196.156.255 au +103.196.157.0 - 103.196.157.255 in +103.196.158.0 - 103.196.159.255 th +103.196.160.0 - 103.196.163.255 pk +103.196.168.0 - 103.196.171.255 cn +103.196.172.0 - 103.196.175.255 tw +103.196.180.0 - 103.196.183.255 us +103.196.184.0 - 103.196.187.255 cn +103.196.188.0 - 103.196.193.255 in +103.196.194.0 - 103.196.194.255 au +103.196.195.0 - 103.196.195.255 my +103.196.196.0 - 103.196.203.255 in +103.196.204.0 - 103.196.207.255 cn +103.196.208.0 - 103.196.231.255 in +103.196.232.0 - 103.196.235.255 bd +103.196.236.0 - 103.196.239.255 vn +103.196.240.0 - 103.196.241.255 nl +103.196.242.0 - 103.196.243.255 in +103.196.244.0 - 103.196.251.255 vn +103.196.252.0 - 103.197.3.255 sg +103.197.4.0 - 103.197.7.255 hk +103.197.8.0 - 103.197.11.255 in +103.197.12.0 - 103.197.15.255 jp +103.197.16.0 - 103.197.19.255 in +103.197.20.0 - 103.197.23.255 my +103.197.24.0 - 103.197.27.255 hk +103.197.28.0 - 103.197.43.255 in +103.197.44.0 - 103.197.47.255 pk +103.197.48.0 - 103.197.49.255 bd +103.197.50.0 - 103.197.50.255 sg +103.197.51.0 - 103.197.51.255 in +103.197.52.0 - 103.197.53.255 nz +103.197.54.0 - 103.197.54.255 gb +103.197.55.0 - 103.197.55.255 nz +103.197.56.0 - 103.197.59.255 my +103.197.60.0 - 103.197.63.255 nz +103.197.64.0 - 103.197.67.255 au +103.197.68.0 - 103.197.71.255 hk +103.197.72.0 - 103.197.83.255 in +103.197.84.0 - 103.197.87.255 ph +103.197.88.0 - 103.197.88.255 au +103.197.89.0 - 103.197.89.255 id +103.197.90.0 - 103.197.91.255 in +103.197.92.0 - 103.197.95.255 id +103.197.96.0 - 103.197.99.255 sg +103.197.100.0 - 103.197.103.255 in +103.197.104.0 - 103.197.107.255 kh +103.197.108.0 - 103.197.143.255 in +103.197.144.0 - 103.197.147.255 au +103.197.148.0 - 103.197.151.255 hk +103.197.152.0 - 103.197.155.255 bd +103.197.156.0 - 103.197.159.255 hk +103.197.160.0 - 103.197.163.255 au +103.197.164.0 - 103.197.167.255 mv +103.197.168.0 - 103.197.171.255 hk +103.197.172.0 - 103.197.175.255 tw +103.197.176.0 - 103.197.179.255 bt +103.197.180.0 - 103.197.183.255 cn +103.197.184.0 - 103.197.185.255 in +103.197.186.0 - 103.197.187.255 au +103.197.188.0 - 103.197.191.255 id +103.197.192.0 - 103.197.195.255 hk +103.197.196.0 - 103.197.199.255 mm +103.197.200.0 - 103.197.203.255 ph +103.197.204.0 - 103.197.207.255 bd +103.197.208.0 - 103.197.211.255 jp +103.197.212.0 - 103.197.215.255 au +103.197.216.0 - 103.197.219.255 hk +103.197.220.0 - 103.197.227.255 in +103.197.228.0 - 103.197.231.255 cn +103.197.232.0 - 103.197.239.255 au +103.197.240.0 - 103.197.243.255 in +103.197.244.0 - 103.197.247.255 th +103.197.248.0 - 103.197.251.255 bd +103.197.252.0 - 103.197.252.167 cn +103.197.252.168 - 103.197.252.168 hk +103.197.252.169 - 103.197.255.255 cn +103.198.0.0 - 103.198.0.255 sg +103.198.1.0 - 103.198.1.255 hk +103.198.2.0 - 103.198.3.255 bd +103.198.4.0 - 103.198.7.255 jp +103.198.8.0 - 103.198.9.255 np +103.198.10.0 - 103.198.11.255 in +103.198.12.0 - 103.198.15.255 jp +103.198.16.0 - 103.198.17.255 my +103.198.18.0 - 103.198.19.255 hk +103.198.20.0 - 103.198.23.255 cn +103.198.24.0 - 103.198.25.255 au +103.198.28.0 - 103.198.31.255 in +103.198.32.0 - 103.198.33.255 au +103.198.34.0 - 103.198.35.255 in +103.198.36.0 - 103.198.39.255 jp +103.198.40.0 - 103.198.43.255 au +103.198.44.0 - 103.198.51.255 hk +103.198.52.0 - 103.198.53.255 my +103.198.54.0 - 103.198.55.255 au +103.198.56.0 - 103.198.59.255 hk +103.198.60.0 - 103.198.67.255 cn +103.198.68.0 - 103.198.71.255 my +103.198.72.0 - 103.198.75.255 cn +103.198.76.0 - 103.198.79.255 sg +103.198.80.0 - 103.198.81.255 in +103.198.82.0 - 103.198.82.255 hk +103.198.83.0 - 103.198.83.255 in +103.198.84.0 - 103.198.87.255 my +103.198.88.0 - 103.198.91.255 ph +103.198.92.0 - 103.198.92.255 au +103.198.93.0 - 103.198.93.255 id +103.198.94.0 - 103.198.103.255 in +103.198.104.0 - 103.198.105.255 nz +103.198.106.0 - 103.198.107.255 au +103.198.108.0 - 103.198.111.255 jp +103.198.112.0 - 103.198.113.255 au +103.198.114.0 - 103.198.123.255 id +103.198.124.0 - 103.198.127.255 cn +103.198.128.0 - 103.198.129.255 in +103.198.130.0 - 103.198.130.255 au +103.198.131.0 - 103.198.131.255 id +103.198.132.0 - 103.198.139.255 bd +103.198.140.0 - 103.198.147.255 sg +103.198.148.0 - 103.198.151.255 mm +103.198.152.0 - 103.198.155.255 th +103.198.156.0 - 103.198.159.255 cn +103.198.160.0 - 103.198.163.255 jp +103.198.164.0 - 103.198.167.255 in +103.198.168.0 - 103.198.171.255 bd +103.198.172.0 - 103.198.175.255 in +103.198.176.0 - 103.198.179.255 tl +103.198.180.0 - 103.198.183.255 cn +103.198.184.0 - 103.198.186.255 nz +103.198.187.0 - 103.198.187.255 in +103.198.188.0 - 103.198.195.255 hk +103.198.196.0 - 103.198.203.255 cn +103.198.204.0 - 103.198.207.255 hk +103.198.208.0 - 103.198.215.255 jp +103.198.216.0 - 103.198.247.255 cn +103.198.248.0 - 103.198.251.255 hk +103.198.252.0 - 103.198.255.255 bd +103.199.0.0 - 103.199.1.255 nz +103.199.2.0 - 103.199.3.255 id +103.199.4.0 - 103.199.79.255 vn +103.199.80.0 - 103.199.80.255 au +103.199.81.0 - 103.199.81.255 nz +103.199.82.0 - 103.199.83.255 au +103.199.84.0 - 103.199.87.255 bd +103.199.88.0 - 103.199.95.255 in +103.199.96.0 - 103.199.96.255 au +103.199.97.0 - 103.199.99.255 in +103.199.100.0 - 103.199.107.255 hk +103.199.108.0 - 103.199.111.255 bd +103.199.112.0 - 103.199.117.255 in +103.199.118.0 - 103.199.118.255 id +103.199.119.0 - 103.199.119.255 au +103.199.120.0 - 103.199.131.255 in +103.199.132.0 - 103.199.135.255 jp +103.199.136.0 - 103.199.139.255 in +103.199.144.0 - 103.199.147.255 in +103.199.148.0 - 103.199.151.255 hk +103.199.152.0 - 103.199.155.255 bd +103.199.156.0 - 103.199.163.255 in +103.199.164.0 - 103.199.167.255 cn +103.199.168.0 - 103.199.169.255 bd +103.199.170.0 - 103.199.171.255 th +103.199.172.0 - 103.199.195.255 in +103.199.196.0 - 103.199.199.255 cn +103.199.200.0 - 103.199.215.255 in +103.199.216.0 - 103.199.219.255 my +103.199.220.0 - 103.199.223.255 jp +103.199.224.0 - 103.199.227.255 in +103.199.228.0 - 103.199.231.255 cn +103.199.232.0 - 103.199.235.255 bd +103.199.236.0 - 103.199.239.255 id +103.199.240.0 - 103.199.243.255 in +103.199.244.0 - 103.199.247.255 hk +103.199.248.0 - 103.199.255.255 cn +103.200.0.0 - 103.200.3.255 tw +103.200.4.0 - 103.200.4.255 sg +103.200.5.0 - 103.200.6.255 hk +103.200.7.0 - 103.200.7.255 sg +103.200.8.0 - 103.200.15.255 au +103.200.16.0 - 103.200.19.255 id +103.200.20.0 - 103.200.27.255 vn +103.200.28.0 - 103.200.35.255 cn +103.200.36.0 - 103.200.39.255 bd +103.200.40.0 - 103.200.51.255 in +103.200.52.0 - 103.200.55.255 cn +103.200.56.0 - 103.200.59.255 in +103.200.60.0 - 103.200.63.255 vn +103.200.64.0 - 103.200.71.255 cn +103.200.72.0 - 103.200.91.255 in +103.200.92.0 - 103.200.95.255 bd +103.200.96.0 - 103.200.99.255 jp +103.200.100.0 - 103.200.107.255 in +103.200.108.0 - 103.200.119.255 hk +103.200.120.0 - 103.200.123.255 vn +103.200.124.0 - 103.200.127.255 hk +103.200.128.0 - 103.200.131.255 id +103.200.132.0 - 103.200.135.255 mm +103.200.136.0 - 103.200.195.255 cn +103.200.196.0 - 103.200.199.255 pk +103.200.200.0 - 103.200.203.255 sg +103.200.208.0 - 103.200.211.255 sg +103.200.212.0 - 103.200.215.255 in +103.200.216.0 - 103.200.219.255 sg +103.200.220.0 - 103.201.23.255 cn +103.201.24.0 - 103.201.27.255 hk +103.201.28.0 - 103.201.67.255 cn +103.201.68.0 - 103.201.75.255 hk +103.201.76.0 - 103.201.123.255 cn +103.201.124.0 - 103.201.127.255 in +103.201.128.0 - 103.201.131.255 jp +103.201.132.0 - 103.201.151.255 in +103.201.152.0 - 103.202.47.255 cn +103.202.48.0 - 103.202.51.255 hk +103.202.52.0 - 103.202.55.255 bd +103.202.56.0 - 103.202.147.255 cn +103.202.148.0 - 103.202.151.255 mh +103.202.152.0 - 103.202.207.255 cn +103.202.208.0 - 103.202.211.255 au +103.202.212.0 - 103.202.215.255 cn +103.202.216.0 - 103.202.217.255 jp +103.202.218.0 - 103.202.218.255 ph +103.202.219.0 - 103.202.219.255 au +103.202.220.0 - 103.202.223.255 bd +103.202.224.0 - 103.202.225.255 ph +103.202.226.0 - 103.202.226.255 in +103.202.227.0 - 103.202.227.255 id +103.202.228.0 - 103.202.231.255 cn +103.202.232.0 - 103.202.235.255 us +103.202.236.0 - 103.203.35.255 cn +103.203.36.0 - 103.203.39.255 in +103.203.40.0 - 103.203.43.255 us +103.203.44.0 - 103.203.47.255 pk +103.203.48.0 - 103.203.51.255 hk +103.203.52.0 - 103.203.59.255 cn +103.203.60.0 - 103.203.75.255 in +103.203.76.0 - 103.203.79.255 id +103.203.80.0 - 103.203.89.255 in +103.203.90.0 - 103.203.90.255 sg +103.203.91.0 - 103.203.91.255 id +103.203.92.0 - 103.203.95.255 bd +103.203.96.0 - 103.203.131.255 cn +103.203.132.0 - 103.203.135.255 mm +103.203.136.0 - 103.203.139.255 in +103.203.140.0 - 103.203.143.255 cn +103.203.144.0 - 103.203.147.255 in +103.203.148.0 - 103.203.151.255 hk +103.203.152.0 - 103.203.155.255 sg +103.203.156.0 - 103.203.159.255 jp +103.203.160.0 - 103.203.162.255 id +103.203.163.0 - 103.203.163.255 au +103.203.164.0 - 103.203.171.255 cn +103.203.172.0 - 103.203.175.255 in +103.203.176.0 - 103.203.179.255 bd +103.203.180.0 - 103.203.183.255 hk +103.203.184.0 - 103.203.187.255 in +103.203.188.0 - 103.203.188.255 nz +103.203.189.0 - 103.203.189.255 id +103.203.190.0 - 103.203.191.255 au +103.203.192.0 - 103.203.195.255 cn +103.203.196.0 - 103.203.199.255 au +103.203.200.0 - 103.203.203.255 cn +103.203.204.0 - 103.203.211.255 in +103.203.212.0 - 103.203.219.255 cn +103.203.220.0 - 103.203.223.255 hk +103.203.224.0 - 103.204.3.255 in +103.204.4.0 - 103.204.11.255 my +103.204.12.0 - 103.204.12.255 th +103.204.13.0 - 103.204.13.255 jp +103.204.14.0 - 103.204.15.255 au +103.204.16.0 - 103.204.19.255 mm +103.204.20.0 - 103.204.23.255 in +103.204.24.0 - 103.204.27.255 cn +103.204.28.0 - 103.204.55.255 in +103.204.56.0 - 103.204.59.255 jp +103.204.60.0 - 103.204.63.255 ph +103.204.64.0 - 103.204.67.255 jp +103.204.68.0 - 103.204.69.255 sg +103.204.70.0 - 103.204.70.255 in +103.204.71.0 - 103.204.71.255 af +103.204.72.0 - 103.204.75.255 cn +103.204.76.0 - 103.204.79.255 hk +103.204.80.0 - 103.204.87.255 bd +103.204.88.0 - 103.204.91.255 cn +103.204.92.0 - 103.204.95.255 sg +103.204.96.0 - 103.204.99.255 hk +103.204.100.0 - 103.204.103.255 mm +103.204.104.0 - 103.204.107.255 au +103.204.108.0 - 103.204.111.255 hk +103.204.112.0 - 103.204.115.255 cn +103.204.116.0 - 103.204.116.255 in +103.204.117.0 - 103.204.117.255 au +103.204.118.0 - 103.204.118.255 id +103.204.119.0 - 103.204.127.255 in +103.204.128.0 - 103.204.131.255 bd +103.204.132.0 - 103.204.135.255 in +103.204.136.0 - 103.204.155.255 cn +103.204.156.0 - 103.204.171.255 in +103.204.172.0 - 103.204.175.255 jp +103.204.176.0 - 103.204.183.255 hk +103.204.184.0 - 103.204.195.255 in +103.204.196.0 - 103.204.199.255 cn +103.204.200.0 - 103.204.203.255 bd +103.204.204.0 - 103.204.207.255 in +103.204.208.0 - 103.204.211.255 bd +103.204.212.0 - 103.204.215.255 au +103.204.216.0 - 103.204.218.255 in +103.204.219.0 - 103.204.219.255 au +103.204.220.0 - 103.204.223.255 np +103.204.224.0 - 103.204.225.255 au +103.204.226.0 - 103.204.227.255 nz +103.204.228.0 - 103.204.229.255 au +103.204.230.0 - 103.204.230.255 jp +103.204.231.0 - 103.204.231.255 in +103.204.232.0 - 103.204.239.255 cn +103.204.240.0 - 103.204.243.255 au +103.204.244.0 - 103.204.247.255 bd +103.204.248.0 - 103.204.251.255 nz +103.204.252.0 - 103.205.3.255 hk +103.205.4.0 - 103.205.11.255 cn +103.205.12.0 - 103.205.15.255 in +103.205.16.0 - 103.205.19.255 la +103.205.20.0 - 103.205.23.255 hk +103.205.24.0 - 103.205.27.255 kh +103.205.28.0 - 103.205.35.255 au +103.205.36.0 - 103.205.37.255 ph +103.205.38.0 - 103.205.38.255 nz +103.205.39.0 - 103.205.39.255 in +103.205.40.0 - 103.205.47.255 cn +103.205.48.0 - 103.205.51.255 jp +103.205.52.0 - 103.205.55.255 cn +103.205.56.0 - 103.205.57.255 id +103.205.58.0 - 103.205.59.255 bd +103.205.60.0 - 103.205.67.255 in +103.205.68.0 - 103.205.71.255 bd +103.205.72.0 - 103.205.75.255 jp +103.205.76.0 - 103.205.79.255 sg +103.205.80.0 - 103.205.80.255 au +103.205.81.0 - 103.205.81.255 sg +103.205.82.0 - 103.205.82.255 id +103.205.83.0 - 103.205.83.255 in +103.205.84.0 - 103.205.91.255 jp +103.205.92.0 - 103.205.95.255 in +103.205.96.0 - 103.205.107.255 vn +103.205.108.0 - 103.205.111.255 cn +103.205.112.0 - 103.205.115.255 in +103.205.116.0 - 103.205.123.255 cn +103.205.124.0 - 103.205.131.255 in +103.205.132.0 - 103.205.135.255 bd +103.205.136.0 - 103.205.139.255 cn +103.205.140.0 - 103.205.155.255 in +103.205.156.0 - 103.205.159.255 ph +103.205.160.0 - 103.205.161.255 th +103.205.162.0 - 103.205.162.255 cn +103.205.163.0 - 103.205.163.255 in +103.205.164.0 - 103.205.167.255 hk +103.205.168.0 - 103.205.171.255 jp +103.205.172.0 - 103.205.175.255 in +103.205.176.0 - 103.205.179.255 pk +103.205.180.0 - 103.205.183.255 bd +103.205.184.0 - 103.205.184.255 jp +103.205.185.0 - 103.205.185.255 in +103.205.186.0 - 103.205.187.255 sg +103.205.188.0 - 103.205.203.255 cn +103.205.204.0 - 103.205.207.255 au +103.205.208.0 - 103.205.211.255 my +103.205.212.0 - 103.205.227.255 in +103.205.228.0 - 103.205.231.255 au +103.205.232.0 - 103.205.235.255 bd +103.205.236.0 - 103.205.239.255 cn +103.205.240.0 - 103.205.243.255 hk +103.205.244.0 - 103.205.245.255 in +103.205.246.0 - 103.205.247.255 au +103.205.248.0 - 103.206.3.255 cn +103.206.4.0 - 103.206.15.255 in +103.206.16.0 - 103.206.19.255 au +103.206.20.0 - 103.206.23.255 hk +103.206.24.0 - 103.206.27.255 sg +103.206.28.0 - 103.206.28.255 au +103.206.29.0 - 103.206.31.255 sg +103.206.32.0 - 103.206.35.255 nz +103.206.36.0 - 103.206.39.255 hk +103.206.40.0 - 103.206.43.255 sg +103.206.44.0 - 103.206.47.255 cn +103.206.48.0 - 103.206.73.255 in +103.206.74.0 - 103.206.75.255 kr +103.206.76.0 - 103.206.79.255 jp +103.206.80.0 - 103.206.83.255 ph +103.206.84.0 - 103.206.87.255 pk +103.206.88.0 - 103.206.91.255 jp +103.206.92.0 - 103.206.95.255 hk +103.206.96.0 - 103.206.97.255 in +103.206.98.0 - 103.206.98.255 sg +103.206.99.0 - 103.206.107.255 in +103.206.108.0 - 103.206.111.255 cn +103.206.112.0 - 103.206.119.255 in +103.206.120.0 - 103.206.127.255 hk +103.206.128.0 - 103.206.147.255 in +103.206.148.0 - 103.206.151.255 cn +103.206.152.0 - 103.206.153.255 mn +103.206.154.0 - 103.206.155.255 au +103.206.156.0 - 103.206.157.255 hk +103.206.158.0 - 103.206.158.255 my +103.206.159.0 - 103.206.167.255 in +103.206.168.0 - 103.206.171.255 id +103.206.172.0 - 103.206.172.255 in +103.206.173.0 - 103.206.173.255 mm +103.206.174.0 - 103.206.183.255 in +103.206.184.0 - 103.206.185.255 bd +103.206.186.0 - 103.206.186.255 id +103.206.187.0 - 103.206.187.255 au +103.206.188.0 - 103.206.191.255 hk +103.206.192.0 - 103.206.195.255 mn +103.206.196.0 - 103.206.199.255 jp +103.206.200.0 - 103.206.203.255 ph +103.206.204.0 - 103.206.207.255 th +103.206.208.0 - 103.206.211.255 in +103.206.212.0 - 103.206.219.255 vn +103.206.220.0 - 103.206.227.255 in +103.206.228.0 - 103.206.231.255 bd +103.206.232.0 - 103.206.235.255 hk +103.206.236.0 - 103.206.239.255 au +103.206.240.0 - 103.206.247.255 id +103.206.248.0 - 103.206.251.255 in +103.206.252.0 - 103.206.255.255 id +103.207.0.0 - 103.207.15.255 in +103.207.16.0 - 103.207.16.255 nz +103.207.17.0 - 103.207.17.255 in +103.207.18.0 - 103.207.18.255 au +103.207.19.0 - 103.207.19.255 my +103.207.20.0 - 103.207.23.255 jp +103.207.24.0 - 103.207.27.255 hk +103.207.28.0 - 103.207.31.255 au +103.207.32.0 - 103.207.39.255 vn +103.207.40.0 - 103.207.47.255 in +103.207.48.0 - 103.207.51.255 cn +103.207.52.0 - 103.207.67.255 in +103.207.68.0 - 103.207.71.255 hk +103.207.72.0 - 103.207.75.255 ph +103.207.76.0 - 103.207.79.255 nz +103.207.80.0 - 103.207.83.255 np +103.207.84.0 - 103.207.87.255 pk +103.207.88.0 - 103.207.91.255 bd +103.207.92.0 - 103.207.92.255 au +103.207.93.0 - 103.207.93.255 hk +103.207.94.0 - 103.207.95.255 au +103.207.96.0 - 103.207.99.255 id +103.207.100.0 - 103.207.101.255 in +103.207.102.0 - 103.207.102.255 au +103.207.103.0 - 103.207.103.255 in +103.207.104.0 - 103.207.107.255 cn +103.207.108.0 - 103.207.111.255 sg +103.207.112.0 - 103.207.115.255 kh +103.207.116.0 - 103.207.119.255 hk +103.207.120.0 - 103.207.151.255 in +103.207.152.0 - 103.207.153.255 bd +103.207.154.0 - 103.207.155.255 au +103.207.156.0 - 103.207.157.255 sg +103.207.158.0 - 103.207.158.255 ph +103.207.159.0 - 103.207.159.255 hk +103.207.160.0 - 103.207.163.255 in +103.207.164.0 - 103.207.167.255 cn +103.207.168.0 - 103.207.183.255 in +103.207.184.0 - 103.207.215.255 cn +103.207.216.0 - 103.207.219.255 jp +103.207.220.0 - 103.207.223.255 cn +103.207.224.0 - 103.207.227.255 in +103.207.228.0 - 103.207.235.255 cn +103.207.236.0 - 103.207.239.255 id +103.207.240.0 - 103.207.251.255 in +103.207.252.0 - 103.207.255.255 tw +103.208.0.0 - 103.208.1.255 hk +103.208.2.0 - 103.208.2.255 au +103.208.3.0 - 103.208.3.255 sg +103.208.4.0 - 103.208.7.255 au +103.208.8.0 - 103.208.11.255 hk +103.208.12.0 - 103.208.19.255 cn +103.208.20.0 - 103.208.21.255 in +103.208.22.0 - 103.208.22.255 au +103.208.23.0 - 103.208.23.255 id +103.208.24.0 - 103.208.27.255 th +103.208.28.0 - 103.208.31.255 cn +103.208.32.0 - 103.208.35.255 hk +103.208.36.0 - 103.208.39.255 tl +103.208.40.0 - 103.208.51.255 cn +103.208.52.0 - 103.208.83.255 in +103.208.84.0 - 103.208.85.255 at +103.208.86.0 - 103.208.87.255 nz +103.208.88.0 - 103.208.91.255 in +103.208.92.0 - 103.208.92.255 au +103.208.93.0 - 103.208.93.255 us +103.208.94.0 - 103.208.95.255 id +103.208.96.0 - 103.208.99.255 jp +103.208.100.0 - 103.208.103.255 id +103.208.104.0 - 103.208.131.255 in +103.208.132.0 - 103.208.135.255 bd +103.208.136.0 - 103.208.137.255 id +103.208.138.0 - 103.208.139.255 th +103.208.140.0 - 103.208.143.255 nz +103.208.144.0 - 103.208.147.255 in +103.208.148.0 - 103.208.151.255 cn +103.208.152.0 - 103.208.154.255 in +103.208.155.0 - 103.208.155.255 au +103.208.156.0 - 103.208.159.255 in +103.208.160.0 - 103.208.163.255 id +103.208.164.0 - 103.208.167.255 nz +103.208.168.0 - 103.208.175.255 in +103.208.176.0 - 103.208.179.255 hk +103.208.180.0 - 103.208.183.255 bd +103.208.184.0 - 103.208.191.255 au +103.208.192.0 - 103.208.195.255 hk +103.208.196.0 - 103.208.197.255 tw +103.208.198.0 - 103.208.198.255 in +103.208.199.0 - 103.208.199.255 au +103.208.200.0 - 103.208.203.255 in +103.208.204.0 - 103.208.207.255 id +103.208.208.0 - 103.208.211.255 in +103.208.212.0 - 103.208.215.255 th +103.208.216.0 - 103.208.219.255 au +103.208.220.0 - 103.208.223.255 jp +103.208.224.0 - 103.208.251.255 in +103.208.252.0 - 103.209.0.255 sg +103.209.1.0 - 103.209.1.255 id +103.209.2.0 - 103.209.5.255 au +103.209.6.0 - 103.209.9.255 id +103.209.10.0 - 103.209.10.255 nz +103.209.11.0 - 103.209.11.255 bd +103.209.12.0 - 103.209.15.255 nz +103.209.16.0 - 103.209.19.255 in +103.209.20.0 - 103.209.23.255 bd +103.209.24.0 - 103.209.25.255 au +103.209.26.0 - 103.209.27.255 in +103.209.28.0 - 103.209.31.255 hk +103.209.32.0 - 103.209.35.255 pk +103.209.36.0 - 103.209.39.255 in +103.209.40.0 - 103.209.43.255 hk +103.209.44.0 - 103.209.47.255 au +103.209.48.0 - 103.209.51.255 th +103.209.52.0 - 103.209.53.255 pk +103.209.54.0 - 103.209.54.255 pg +103.209.55.0 - 103.209.55.255 au +103.209.56.0 - 103.209.59.255 ph +103.209.60.0 - 103.209.63.255 hk +103.209.64.0 - 103.209.71.255 in +103.209.72.0 - 103.209.75.255 au +103.209.76.0 - 103.209.79.255 pk +103.209.80.0 - 103.209.83.255 bd +103.209.84.0 - 103.209.87.255 pk +103.209.88.0 - 103.209.94.255 in +103.209.95.0 - 103.209.95.255 id +103.209.96.0 - 103.209.97.255 in +103.209.98.0 - 103.209.98.255 id +103.209.99.0 - 103.209.99.255 in +103.209.100.0 - 103.209.107.255 my +103.209.108.0 - 103.209.109.255 au +103.209.110.0 - 103.209.111.255 in +103.209.112.0 - 103.209.115.255 cn +103.209.116.0 - 103.209.119.255 jp +103.209.120.0 - 103.209.123.255 sg +103.209.124.0 - 103.209.127.255 au +103.209.128.0 - 103.209.129.255 sg +103.209.130.0 - 103.209.131.255 id +103.209.132.0 - 103.209.135.255 in +103.209.136.0 - 103.209.139.255 cn +103.209.140.0 - 103.209.147.255 in +103.209.148.0 - 103.209.151.255 jp +103.209.152.0 - 103.209.155.255 au +103.209.156.0 - 103.209.159.255 my +103.209.160.0 - 103.209.163.255 au +103.209.164.0 - 103.209.171.255 sg +103.209.172.0 - 103.209.175.255 kr +103.209.176.0 - 103.209.183.255 in +103.209.184.0 - 103.209.187.255 id +103.209.188.0 - 103.209.189.255 au +103.209.190.0 - 103.209.190.255 sg +103.209.191.0 - 103.209.191.255 au +103.209.192.0 - 103.209.195.255 nz +103.209.196.0 - 103.209.199.255 bd +103.209.200.0 - 103.209.203.255 cn +103.209.204.0 - 103.209.207.255 in +103.209.208.0 - 103.209.211.255 cn +103.209.212.0 - 103.209.215.255 in +103.209.216.0 - 103.209.219.255 cn +103.209.220.0 - 103.209.223.255 in +103.209.224.0 - 103.209.227.255 nz +103.209.228.0 - 103.209.231.255 bd +103.209.232.0 - 103.209.235.255 cn +103.209.236.0 - 103.209.239.255 jp +103.209.240.0 - 103.209.241.255 in +103.209.242.0 - 103.209.247.255 au +103.209.248.0 - 103.209.251.255 id +103.209.252.0 - 103.209.255.255 jp +103.210.0.0 - 103.210.3.255 cn +103.210.4.0 - 103.210.7.255 pk +103.210.8.0 - 103.210.9.255 ph +103.210.10.0 - 103.210.11.255 au +103.210.12.0 - 103.210.15.255 pk +103.210.16.0 - 103.210.19.255 bd +103.210.20.0 - 103.210.23.255 ph +103.210.24.0 - 103.210.27.255 au +103.210.28.0 - 103.210.33.255 in +103.210.34.0 - 103.210.35.255 id +103.210.36.0 - 103.210.55.255 in +103.210.56.0 - 103.210.63.255 bd +103.210.64.0 - 103.210.67.255 in +103.210.68.0 - 103.210.71.255 bd +103.210.72.0 - 103.210.75.255 in +103.210.76.0 - 103.210.79.255 au +103.210.80.0 - 103.210.83.255 in +103.210.84.0 - 103.210.87.255 jp +103.210.88.0 - 103.210.95.255 in +103.210.96.0 - 103.210.99.255 cn +103.210.100.0 - 103.210.107.255 in +103.224.4.0 - 103.224.7.255 in +103.224.8.0 - 103.224.11.255 jp +103.224.12.0 - 103.224.15.255 pk +103.224.16.0 - 103.224.19.255 cn +103.224.20.0 - 103.224.20.255 hk +103.224.21.0 - 103.224.21.255 au +103.224.22.0 - 103.224.22.255 hk +103.224.23.0 - 103.224.27.255 in +103.224.28.0 - 103.224.31.255 kh +103.224.32.0 - 103.224.39.255 in +103.224.40.0 - 103.224.47.255 cn +103.224.48.0 - 103.224.48.255 in +103.224.49.0 - 103.224.49.255 au +103.224.50.0 - 103.224.51.255 in +103.224.52.0 - 103.224.53.255 au +103.224.54.0 - 103.224.54.255 in +103.224.56.0 - 103.224.59.255 hk +103.224.60.0 - 103.224.63.255 cn +103.224.64.0 - 103.224.67.255 id +103.224.68.0 - 103.224.71.255 in +103.224.72.0 - 103.224.75.255 hk +103.224.76.0 - 103.224.79.255 nz +103.224.80.0 - 103.224.83.255 hk +103.224.84.0 - 103.224.91.255 au +103.224.92.0 - 103.224.95.255 jp +103.224.96.0 - 103.224.99.255 bn +103.224.100.0 - 103.224.103.255 id +103.224.104.0 - 103.224.104.255 au +103.224.105.0 - 103.224.105.255 in +103.224.106.0 - 103.224.106.255 hk +103.224.107.0 - 103.224.107.255 nz +103.224.108.0 - 103.224.111.255 in +103.224.112.0 - 103.224.115.255 au +103.224.116.0 - 103.224.119.255 sg +103.224.120.0 - 103.224.120.255 au +103.224.121.0 - 103.224.121.255 sg +103.224.122.0 - 103.224.126.255 au +103.224.127.0 - 103.224.127.255 af +103.224.128.0 - 103.224.131.255 nz +103.224.132.0 - 103.224.135.255 tw +103.224.136.0 - 103.224.141.255 id +103.224.142.0 - 103.224.142.255 au +103.224.143.0 - 103.224.143.255 jp +103.224.144.0 - 103.224.159.255 in +103.224.160.0 - 103.224.160.255 au +103.224.161.0 - 103.224.161.255 nz +103.224.162.0 - 103.224.163.255 au +103.224.164.0 - 103.224.167.255 sg +103.224.168.0 - 103.224.171.255 vn +103.224.172.0 - 103.224.180.255 id +103.224.181.0 - 103.224.181.255 in +103.224.182.0 - 103.224.183.255 au +103.224.184.0 - 103.224.191.255 in +103.224.192.0 - 103.224.195.255 tw +103.224.196.0 - 103.224.199.255 my +103.224.200.0 - 103.224.207.255 tw +103.224.208.0 - 103.224.213.255 au +103.224.214.0 - 103.224.214.255 af +103.224.215.0 - 103.224.215.255 us +103.224.216.0 - 103.224.219.255 in +103.224.220.0 - 103.224.235.255 cn +103.224.236.0 - 103.224.247.255 in +103.224.248.0 - 103.224.251.255 hk +103.224.252.0 - 103.224.255.255 jp +103.225.0.0 - 103.225.3.255 tw +103.225.4.0 - 103.225.7.255 nz +103.225.8.0 - 103.225.11.255 hk +103.225.12.0 - 103.225.15.255 in +103.225.16.0 - 103.225.23.255 hk +103.225.24.0 - 103.225.31.255 in +103.225.32.0 - 103.225.35.255 au +103.225.36.0 - 103.225.39.255 ph +103.225.40.0 - 103.225.43.255 in +103.225.44.0 - 103.225.45.255 au +103.225.46.0 - 103.225.47.255 in +103.225.48.0 - 103.225.51.255 pk +103.225.52.0 - 103.225.55.255 jp +103.225.56.0 - 103.225.63.255 in +103.225.64.0 - 103.225.65.255 sg +103.225.66.0 - 103.225.66.255 id +103.225.67.0 - 103.225.71.255 au +103.225.72.0 - 103.225.77.255 in +103.225.78.0 - 103.225.79.255 kh +103.225.80.0 - 103.225.83.255 jp +103.225.84.0 - 103.225.87.255 cn +103.225.88.0 - 103.225.91.255 id +103.225.92.0 - 103.225.95.255 bd +103.225.96.0 - 103.225.96.255 au +103.225.97.0 - 103.225.97.255 in +103.225.98.0 - 103.225.98.255 id +103.225.99.0 - 103.225.107.255 in +103.225.112.0 - 103.225.115.255 in +103.225.120.0 - 103.225.123.255 jp +103.225.124.0 - 103.225.135.255 in +103.225.136.0 - 103.225.139.255 ph +103.225.140.0 - 103.225.143.255 au +103.225.144.0 - 103.225.147.255 jp +103.225.148.0 - 103.225.151.255 id +103.225.152.0 - 103.225.155.255 jp +103.225.156.0 - 103.225.163.255 au +103.225.164.0 - 103.225.164.255 us +103.225.165.0 - 103.225.167.255 au +103.225.168.0 - 103.225.169.255 th +103.225.170.0 - 103.225.173.255 id +103.225.174.0 - 103.225.174.255 in +103.225.175.0 - 103.225.175.255 id +103.225.176.0 - 103.225.183.255 in +103.225.184.0 - 103.225.185.255 id +103.225.186.0 - 103.225.187.255 au +103.225.188.0 - 103.225.191.255 in +103.225.192.0 - 103.225.195.255 jp +103.225.196.0 - 103.225.203.255 hk +103.225.204.0 - 103.225.207.255 in +103.225.208.0 - 103.225.209.255 id +103.225.210.0 - 103.225.211.255 nz +103.225.212.0 - 103.225.215.255 hk +103.225.216.0 - 103.225.219.255 af +103.225.220.0 - 103.225.223.255 pk +103.225.224.0 - 103.225.227.255 in +103.225.228.0 - 103.225.231.255 bd +103.225.232.0 - 103.225.235.255 au +103.225.236.0 - 103.225.239.255 vn +103.225.240.0 - 103.225.241.255 au +103.225.242.0 - 103.225.242.255 id +103.225.244.0 - 103.225.247.255 np +103.225.248.0 - 103.225.249.255 in +103.225.250.0 - 103.225.251.255 hk +103.225.252.0 - 103.225.255.255 jp +103.226.0.0 - 103.226.7.255 in +103.226.8.0 - 103.226.10.255 au +103.226.11.0 - 103.226.11.255 in +103.226.12.0 - 103.226.15.255 ph +103.226.16.0 - 103.226.19.255 cn +103.226.20.0 - 103.226.21.255 in +103.226.22.0 - 103.226.23.255 vu +103.226.24.0 - 103.226.31.255 in +103.226.32.0 - 103.226.36.255 nz +103.226.37.0 - 103.226.39.255 ph +103.226.40.0 - 103.226.43.255 cn +103.226.44.0 - 103.226.47.255 jp +103.226.48.0 - 103.226.51.255 id +103.226.52.0 - 103.226.52.255 in +103.226.53.0 - 103.226.53.255 au +103.226.54.0 - 103.226.54.255 jp +103.226.55.0 - 103.226.55.255 id +103.226.56.0 - 103.226.63.255 cn +103.226.64.0 - 103.226.67.255 nz +103.226.68.0 - 103.226.71.255 au +103.226.72.0 - 103.226.79.255 kr +103.226.80.0 - 103.226.83.255 cn +103.226.84.0 - 103.226.91.255 in +103.226.92.0 - 103.226.95.255 hk +103.226.96.0 - 103.226.99.255 kr +103.226.100.0 - 103.226.103.255 tw +103.226.104.0 - 103.226.107.255 au +103.226.108.0 - 103.226.111.255 vn +103.226.112.0 - 103.226.115.255 nz +103.226.116.0 - 103.226.119.255 cn +103.226.120.0 - 103.226.121.255 sg +103.226.122.0 - 103.226.122.255 bd +103.226.123.0 - 103.226.123.255 au +103.226.124.0 - 103.226.127.255 hk +103.226.128.0 - 103.226.131.255 au +103.226.132.0 - 103.226.135.255 cn +103.226.136.0 - 103.226.139.255 id +103.226.140.0 - 103.226.151.255 in +103.226.152.0 - 103.226.155.255 hk +103.226.156.0 - 103.226.159.255 cn +103.226.160.0 - 103.226.167.255 au +103.226.168.0 - 103.226.171.255 in +103.226.172.0 - 103.226.173.255 sg +103.226.174.0 - 103.226.174.255 id +103.226.175.0 - 103.226.175.255 in +103.226.176.0 - 103.226.179.255 au +103.226.180.0 - 103.226.183.255 cn +103.226.184.0 - 103.226.195.255 in +103.226.196.0 - 103.226.199.255 cn +103.226.200.0 - 103.226.211.255 in +103.226.212.0 - 103.226.215.255 tw +103.226.216.0 - 103.226.217.255 pk +103.226.218.0 - 103.226.218.255 id +103.226.219.0 - 103.226.223.255 au +103.226.224.0 - 103.226.231.255 in +103.226.232.0 - 103.226.235.255 id +103.226.236.0 - 103.226.243.255 in +103.226.244.0 - 103.226.245.255 au +103.226.246.0 - 103.226.246.255 sg +103.226.247.0 - 103.226.247.255 au +103.226.248.0 - 103.226.251.255 vn +103.226.252.0 - 103.226.255.255 nz +103.227.0.0 - 103.227.0.255 in +103.227.2.0 - 103.227.3.255 ph +103.227.8.0 - 103.227.11.255 jp +103.227.12.0 - 103.227.13.255 sg +103.227.14.0 - 103.227.14.255 id +103.227.15.0 - 103.227.15.255 nz +103.227.16.0 - 103.227.19.255 af +103.227.20.0 - 103.227.31.255 au +103.227.32.0 - 103.227.35.255 tw +103.227.36.0 - 103.227.39.255 in +103.227.40.0 - 103.227.43.255 jp +103.227.44.0 - 103.227.47.255 ph +103.227.48.0 - 103.227.51.255 cn +103.227.52.0 - 103.227.59.255 in +103.227.60.0 - 103.227.61.255 au +103.227.62.0 - 103.227.62.255 in +103.227.63.0 - 103.227.67.255 au +103.227.68.0 - 103.227.71.255 in +103.227.72.0 - 103.227.83.255 cn +103.227.84.0 - 103.227.91.255 hk +103.227.96.0 - 103.227.99.255 in +103.227.100.0 - 103.227.103.255 cn +103.227.104.0 - 103.227.107.255 hk +103.227.108.0 - 103.227.111.255 au +103.227.112.0 - 103.227.115.255 vn +103.227.116.0 - 103.227.119.255 in +103.227.120.0 - 103.227.123.255 cn +103.227.124.0 - 103.227.127.255 in +103.227.128.0 - 103.227.131.255 hk +103.227.132.0 - 103.227.139.255 cn +103.227.140.0 - 103.227.140.255 my +103.227.141.0 - 103.227.149.255 id +103.227.150.0 - 103.227.159.255 in +103.227.160.0 - 103.227.163.255 jp +103.227.164.0 - 103.227.167.255 sg +103.227.168.0 - 103.227.169.255 au +103.227.170.0 - 103.227.171.255 nz +103.227.172.0 - 103.227.179.255 sg +103.227.188.0 - 103.227.191.255 jp +103.227.192.0 - 103.227.195.255 hk +103.227.196.0 - 103.227.199.255 cn +103.227.200.0 - 103.227.203.255 au +103.227.204.0 - 103.227.207.255 cn +103.227.208.0 - 103.227.211.255 in +103.227.212.0 - 103.227.215.255 cn +103.227.216.0 - 103.227.219.255 vn +103.227.220.0 - 103.227.223.255 id +103.227.224.0 - 103.227.227.255 tw +103.227.228.0 - 103.227.231.255 cn +103.227.232.0 - 103.227.232.255 au +103.227.233.0 - 103.227.233.255 ph +103.227.234.0 - 103.227.235.255 au +103.227.236.0 - 103.227.239.255 in +103.227.240.0 - 103.227.243.255 id +103.227.244.0 - 103.227.247.255 lk +103.227.248.0 - 103.227.251.255 jp +103.227.252.0 - 103.227.255.255 id +103.228.0.0 - 103.228.3.255 bd +103.228.4.0 - 103.228.7.255 th +103.228.12.0 - 103.228.15.255 cn +103.228.16.0 - 103.228.16.255 au +103.228.17.0 - 103.228.17.255 id +103.228.18.0 - 103.228.19.255 in +103.228.20.0 - 103.228.23.255 vn +103.228.24.0 - 103.228.27.255 id +103.228.28.0 - 103.228.31.255 cn +103.228.32.0 - 103.228.48.255 in +103.228.49.0 - 103.228.49.255 bd +103.228.50.0 - 103.228.51.255 in +103.228.52.0 - 103.228.59.255 my +103.228.60.0 - 103.228.63.255 jp +103.228.64.0 - 103.228.67.255 hk +103.228.68.0 - 103.228.71.255 cn +103.228.72.0 - 103.228.79.255 in +103.228.80.0 - 103.228.81.255 id +103.228.82.0 - 103.228.82.255 hk +103.228.83.0 - 103.228.83.255 in +103.228.88.0 - 103.228.91.255 cn +103.228.92.0 - 103.228.99.255 hk +103.228.100.0 - 103.228.100.255 sg +103.228.101.0 - 103.228.101.255 nz +103.228.102.0 - 103.228.102.255 ph +103.228.103.0 - 103.228.103.255 in +103.228.108.0 - 103.228.111.255 hk +103.228.112.0 - 103.228.115.255 in +103.228.116.0 - 103.228.119.255 id +103.228.120.0 - 103.228.123.255 bd +103.228.124.0 - 103.228.127.255 au +103.228.128.0 - 103.228.131.255 cn +103.228.133.0 - 103.228.133.255 au +103.228.134.0 - 103.228.135.255 bd +103.228.140.0 - 103.228.155.255 in +103.228.156.0 - 103.228.159.255 pk +103.228.160.0 - 103.228.163.255 cn +103.228.164.0 - 103.228.167.255 au +103.228.172.0 - 103.228.175.255 in +103.228.176.0 - 103.228.179.255 cn +103.228.180.0 - 103.228.183.255 hk +103.228.184.0 - 103.228.187.255 in +103.228.188.0 - 103.228.191.255 au +103.228.192.0 - 103.228.193.255 in +103.228.194.0 - 103.228.195.255 au +103.228.196.0 - 103.228.199.255 jp +103.228.200.0 - 103.228.203.255 bd +103.228.204.0 - 103.228.211.255 cn +103.228.212.0 - 103.228.215.255 au +103.228.216.0 - 103.228.219.255 tw +103.228.220.0 - 103.228.223.255 in +103.228.228.0 - 103.228.235.255 cn +103.228.236.0 - 103.228.248.255 id +103.228.249.0 - 103.228.251.255 in +103.228.252.0 - 103.228.255.255 la +103.229.0.0 - 103.229.1.255 au +103.229.2.0 - 103.229.3.255 in +103.229.4.0 - 103.229.4.255 au +103.229.5.0 - 103.229.5.255 in +103.229.6.0 - 103.229.7.255 au +103.229.8.0 - 103.229.11.255 sg +103.229.12.0 - 103.229.13.255 id +103.229.14.0 - 103.229.15.255 in +103.229.16.0 - 103.229.19.255 tw +103.229.20.0 - 103.229.23.255 cn +103.229.24.0 - 103.229.27.255 in +103.229.28.0 - 103.229.31.255 hk +103.229.32.0 - 103.229.35.255 my +103.229.36.0 - 103.229.39.255 in +103.229.40.0 - 103.229.43.255 vn +103.229.44.0 - 103.229.47.255 bd +103.229.48.0 - 103.229.50.255 au +103.229.51.0 - 103.229.51.255 in +103.229.52.0 - 103.229.55.255 hk +103.229.56.0 - 103.229.59.255 my +103.229.64.0 - 103.229.67.255 in +103.229.72.0 - 103.229.77.255 id +103.229.78.0 - 103.229.79.255 in +103.229.80.0 - 103.229.87.255 bd +103.229.88.0 - 103.229.91.255 sg +103.229.92.0 - 103.229.95.255 th +103.229.96.0 - 103.229.96.255 sg +103.229.97.0 - 103.229.97.255 au +103.229.98.0 - 103.229.99.255 nz +103.229.100.0 - 103.229.103.255 tw +103.229.104.0 - 103.229.107.255 ph +103.229.108.0 - 103.229.111.255 th +103.229.112.0 - 103.229.115.255 my +103.229.116.0 - 103.229.119.255 hk +103.229.120.0 - 103.229.123.255 mn +103.229.124.0 - 103.229.127.255 tw +103.229.128.0 - 103.229.128.255 sg +103.229.129.0 - 103.229.129.255 in +103.229.130.0 - 103.229.130.255 nz +103.229.131.0 - 103.229.131.255 in +103.229.132.0 - 103.229.135.255 tw +103.229.136.0 - 103.229.139.255 cn +103.229.140.0 - 103.229.147.255 hk +103.229.148.0 - 103.229.151.255 cn +103.229.156.0 - 103.229.159.255 kr +103.229.160.0 - 103.229.167.255 id +103.229.168.0 - 103.229.171.255 in +103.229.172.0 - 103.229.175.255 cn +103.229.176.0 - 103.229.179.255 mn +103.229.180.0 - 103.229.183.255 hk +103.229.184.0 - 103.229.185.255 in +103.229.186.0 - 103.229.186.255 sg +103.229.187.0 - 103.229.187.255 au +103.229.188.0 - 103.229.191.255 hk +103.229.192.0 - 103.229.195.255 vn +103.229.196.0 - 103.229.196.255 sg +103.229.197.0 - 103.229.197.255 my +103.229.198.0 - 103.229.198.255 id +103.229.199.0 - 103.229.199.255 hk +103.229.200.0 - 103.229.203.255 id +103.229.204.0 - 103.229.207.255 sg +103.229.208.0 - 103.229.211.255 in +103.229.212.0 - 103.229.223.255 cn +103.229.224.0 - 103.229.227.255 in +103.229.228.0 - 103.229.231.255 cn +103.229.232.0 - 103.229.235.255 in +103.229.236.0 - 103.229.243.255 cn +103.229.244.0 - 103.229.247.255 in +103.229.248.0 - 103.229.249.255 nz +103.229.250.0 - 103.229.251.255 in +103.229.252.0 - 103.229.255.255 jp +103.230.0.0 - 103.230.3.255 cn +103.230.4.0 - 103.230.7.255 bd +103.230.8.0 - 103.230.11.255 jp +103.230.20.0 - 103.230.23.255 in +103.230.24.0 - 103.230.27.255 jp +103.230.28.0 - 103.230.31.255 cn +103.230.32.0 - 103.230.32.255 hk +103.230.33.0 - 103.230.33.255 in +103.230.34.0 - 103.230.35.255 hk +103.230.36.0 - 103.230.39.255 sg +103.230.40.0 - 103.230.47.255 cn +103.230.48.0 - 103.230.49.255 id +103.230.50.0 - 103.230.51.255 sg +103.230.52.0 - 103.230.55.255 in +103.230.56.0 - 103.230.59.255 my +103.230.60.0 - 103.230.63.255 bd +103.230.64.0 - 103.230.67.255 bn +103.230.72.0 - 103.230.75.255 au +103.230.76.0 - 103.230.79.255 nz +103.230.80.0 - 103.230.80.255 au +103.230.81.0 - 103.230.81.255 nz +103.230.82.0 - 103.230.82.255 mn +103.230.83.0 - 103.230.83.255 id +103.230.84.0 - 103.230.87.255 in +103.230.88.0 - 103.230.91.255 kr +103.230.92.0 - 103.230.95.255 jp +103.230.96.0 - 103.230.99.255 cn +103.230.100.0 - 103.230.100.255 id +103.230.101.0 - 103.230.103.255 in +103.230.104.0 - 103.230.107.255 bd +103.230.108.0 - 103.230.111.255 hk +103.230.112.0 - 103.230.115.255 kr +103.230.120.0 - 103.230.123.255 hk +103.230.128.0 - 103.230.131.255 jp +103.230.132.0 - 103.230.135.255 th +103.230.136.0 - 103.230.139.255 hk +103.230.144.0 - 103.230.155.255 in +103.230.156.0 - 103.230.159.255 au +103.230.160.0 - 103.230.163.255 hk +103.230.164.0 - 103.230.167.255 in +103.230.168.0 - 103.230.171.255 jp +103.230.176.0 - 103.230.179.255 au +103.230.180.0 - 103.230.183.255 bd +103.230.184.0 - 103.230.187.255 au +103.230.188.0 - 103.230.191.255 id +103.230.192.0 - 103.230.195.255 hk +103.230.196.0 - 103.230.207.255 cn +103.230.212.0 - 103.230.215.255 cn +103.230.216.0 - 103.230.219.255 hk +103.230.220.0 - 103.230.227.255 in +103.230.228.0 - 103.230.231.255 hk +103.230.232.0 - 103.230.235.255 sg +103.230.236.0 - 103.230.239.255 cn +103.230.240.0 - 103.230.243.255 hk +103.230.244.0 - 103.230.247.255 jp +103.230.248.0 - 103.230.251.255 sg +103.230.252.0 - 103.230.255.255 af +103.231.0.0 - 103.231.11.255 in +103.231.12.0 - 103.231.15.255 hk +103.231.16.0 - 103.231.23.255 cn +103.231.24.0 - 103.231.25.255 jp +103.231.26.0 - 103.231.26.255 au +103.231.27.0 - 103.231.27.255 sg +103.231.28.0 - 103.231.31.255 hk +103.231.32.0 - 103.231.35.255 in +103.231.36.0 - 103.231.39.255 ph +103.231.40.0 - 103.231.47.255 in +103.231.48.0 - 103.231.51.255 tw +103.231.56.0 - 103.231.59.255 hk +103.231.60.0 - 103.231.63.255 kh +103.231.64.0 - 103.231.71.255 cn +103.231.72.0 - 103.231.75.255 jp +103.231.76.0 - 103.231.79.255 in +103.231.80.0 - 103.231.83.255 id +103.231.84.0 - 103.231.87.255 hk +103.231.88.0 - 103.231.91.255 au +103.231.92.0 - 103.231.95.255 mm +103.231.96.0 - 103.231.97.255 sg +103.231.98.0 - 103.231.99.255 jp +103.231.100.0 - 103.231.103.255 in +103.231.104.0 - 103.231.107.255 hk +103.231.108.0 - 103.231.115.255 id +103.231.116.0 - 103.231.119.255 in +103.231.120.0 - 103.231.123.255 id +103.231.124.0 - 103.231.127.255 in +103.231.128.0 - 103.231.131.255 kr +103.231.132.0 - 103.231.133.255 in +103.231.134.0 - 103.231.134.255 ph +103.231.135.0 - 103.231.135.255 bd +103.231.136.0 - 103.231.139.255 ir +103.231.140.0 - 103.231.143.255 hk +103.231.144.0 - 103.231.147.255 cn +103.231.148.0 - 103.231.151.255 vn +103.231.152.0 - 103.231.155.255 hk +103.231.156.0 - 103.231.157.255 nz +103.231.158.0 - 103.231.159.255 au +103.231.160.0 - 103.231.163.255 bd +103.231.164.0 - 103.231.167.255 hk +103.231.168.0 - 103.231.169.255 au +103.231.170.0 - 103.231.171.255 id +103.231.172.0 - 103.231.175.255 us +103.231.176.0 - 103.231.179.255 bd +103.231.180.0 - 103.231.187.255 cn +103.231.188.0 - 103.231.191.255 sg +103.231.192.0 - 103.231.195.255 jp +103.231.196.0 - 103.231.203.255 id +103.231.204.0 - 103.231.207.255 au +103.231.208.0 - 103.231.219.255 in +103.231.220.0 - 103.231.221.255 sg +103.231.222.0 - 103.231.223.255 in +103.231.224.0 - 103.231.227.255 my +103.231.228.0 - 103.231.231.255 bd +103.231.232.0 - 103.231.235.255 in +103.231.236.0 - 103.231.239.255 jp +103.231.240.0 - 103.231.243.255 ph +103.231.244.0 - 103.231.247.255 cn +103.231.248.0 - 103.231.250.255 sg +103.231.251.0 - 103.231.251.255 my +103.231.252.0 - 103.232.3.255 hk +103.232.4.0 - 103.232.7.255 cn +103.232.8.0 - 103.232.11.255 in +103.232.12.0 - 103.232.16.7 jp +103.232.16.8 - 103.232.16.15 ph +103.232.16.16 - 103.232.19.255 hk +103.232.20.0 - 103.232.27.255 in +103.232.28.0 - 103.232.29.255 my +103.232.30.0 - 103.232.30.255 id +103.232.31.0 - 103.232.31.255 au +103.232.32.0 - 103.232.33.255 id +103.232.34.0 - 103.232.39.255 hk +103.232.40.0 - 103.232.43.255 th +103.232.44.0 - 103.232.47.255 sg +103.232.48.0 - 103.232.51.255 my +103.232.52.0 - 103.232.63.255 vn +103.232.64.0 - 103.232.67.255 id +103.232.68.0 - 103.232.71.255 hk +103.232.72.0 - 103.232.75.255 jp +103.232.80.0 - 103.232.83.255 la +103.232.84.0 - 103.232.91.255 hk +103.232.92.0 - 103.232.99.255 au +103.232.100.0 - 103.232.103.255 bd +103.232.108.0 - 103.232.111.255 nz +103.232.112.0 - 103.232.115.255 in +103.232.116.0 - 103.232.119.255 au +103.232.120.0 - 103.232.123.255 vn +103.232.124.0 - 103.232.131.255 in +103.232.132.0 - 103.232.135.255 au +103.232.136.0 - 103.232.139.255 in +103.232.140.0 - 103.232.141.255 au +103.232.144.0 - 103.232.147.255 cn +103.232.148.0 - 103.232.151.255 in +103.232.152.0 - 103.232.155.255 np +103.232.156.0 - 103.232.158.255 nz +103.232.159.0 - 103.232.163.255 au +103.232.168.0 - 103.232.171.255 au +103.232.172.0 - 103.232.179.255 in +103.232.180.0 - 103.232.183.255 nz +103.232.184.0 - 103.232.187.255 in +103.232.192.0 - 103.232.195.255 kh +103.232.196.0 - 103.232.199.255 au +103.232.200.0 - 103.232.203.255 jp +103.232.204.0 - 103.232.205.255 nz +103.232.206.0 - 103.232.211.255 au +103.232.212.0 - 103.232.215.255 cn +103.232.216.0 - 103.232.218.255 au +103.232.219.0 - 103.232.219.255 my +103.232.220.0 - 103.232.223.255 hk +103.232.224.0 - 103.232.224.255 in +103.232.225.0 - 103.232.225.255 pk +103.232.226.0 - 103.232.227.255 nz +103.232.228.0 - 103.232.231.255 np +103.232.232.0 - 103.232.239.255 in +103.232.240.0 - 103.232.240.255 id +103.232.241.0 - 103.232.241.255 in +103.232.242.0 - 103.232.243.255 id +103.232.244.0 - 103.232.247.255 in +103.232.252.0 - 103.232.255.255 au +103.233.0.0 - 103.233.3.255 my +103.233.4.0 - 103.233.7.255 cn +103.233.8.0 - 103.233.11.255 hk +103.233.12.0 - 103.233.15.255 sg +103.233.16.0 - 103.233.19.255 au +103.233.20.0 - 103.233.23.255 nz +103.233.24.0 - 103.233.27.255 in +103.233.28.0 - 103.233.31.255 au +103.233.32.0 - 103.233.39.255 ph +103.233.44.0 - 103.233.47.255 cn +103.233.48.0 - 103.233.51.255 vn +103.233.52.0 - 103.233.55.255 cn +103.233.56.0 - 103.233.59.255 np +103.233.60.0 - 103.233.63.255 nz +103.233.64.0 - 103.233.67.255 in +103.233.68.0 - 103.233.71.255 tw +103.233.72.0 - 103.233.72.255 hk +103.233.73.0 - 103.233.73.255 in +103.233.74.0 - 103.233.75.255 au +103.233.76.0 - 103.233.79.255 in +103.233.80.0 - 103.233.83.255 th +103.233.84.0 - 103.233.87.255 in +103.233.88.0 - 103.233.91.255 id +103.233.92.0 - 103.233.95.255 in +103.233.96.0 - 103.233.99.255 hk +103.233.100.0 - 103.233.100.255 id +103.233.101.0 - 103.233.101.255 in +103.233.102.0 - 103.233.103.255 id +103.233.104.0 - 103.233.107.255 cn +103.233.108.0 - 103.233.111.255 id +103.233.112.0 - 103.233.120.255 in +103.233.121.0 - 103.233.121.255 bd +103.233.122.0 - 103.233.127.255 in +103.233.128.0 - 103.233.131.255 cn +103.233.132.0 - 103.233.135.255 nz +103.233.136.0 - 103.233.139.255 cn +103.233.142.0 - 103.233.147.255 id +103.233.148.0 - 103.233.151.255 au +103.233.152.0 - 103.233.159.255 id +103.233.160.0 - 103.233.163.255 in +103.233.164.0 - 103.233.167.255 hk +103.233.168.0 - 103.233.171.255 in +103.233.172.0 - 103.233.175.255 sg +103.233.176.0 - 103.233.179.255 th +103.233.180.0 - 103.233.181.255 my +103.233.182.0 - 103.233.182.255 np +103.233.183.0 - 103.233.183.255 af +103.233.184.0 - 103.233.187.255 hk +103.233.188.0 - 103.233.191.255 mo +103.233.192.0 - 103.233.195.255 th +103.233.196.0 - 103.233.199.255 jp +103.233.204.0 - 103.233.207.255 mm +103.233.208.0 - 103.233.211.255 au +103.233.216.0 - 103.233.219.255 in +103.233.220.0 - 103.233.223.255 nz +103.233.224.0 - 103.233.227.255 au +103.233.228.0 - 103.233.231.255 cn +103.233.232.0 - 103.233.235.255 hk +103.233.236.0 - 103.233.239.255 au +103.233.240.0 - 103.233.241.255 sg +103.233.242.0 - 103.233.242.255 au +103.233.243.0 - 103.233.247.255 in +103.233.248.0 - 103.233.251.255 hk +103.234.0.0 - 103.234.3.255 cn +103.234.4.0 - 103.234.7.255 kr +103.234.12.0 - 103.234.12.255 pk +103.234.13.0 - 103.234.15.255 au +103.234.16.0 - 103.234.19.255 hk +103.234.20.0 - 103.234.23.255 cn +103.234.24.0 - 103.234.27.255 bd +103.234.28.0 - 103.234.31.255 jp +103.234.32.0 - 103.234.35.255 hk +103.234.36.0 - 103.234.39.255 vn +103.234.40.0 - 103.234.43.255 tw +103.234.48.0 - 103.234.51.255 pg +103.234.52.0 - 103.234.55.255 hk +103.234.56.0 - 103.234.59.255 cn +103.234.60.0 - 103.234.63.255 au +103.234.64.0 - 103.234.71.255 in +103.234.76.0 - 103.234.83.255 tw +103.234.84.0 - 103.234.87.255 sg +103.234.88.0 - 103.234.91.255 vn +103.234.92.0 - 103.234.92.255 au +103.234.93.0 - 103.234.94.255 in +103.234.95.0 - 103.234.95.255 au +103.234.96.0 - 103.234.99.255 hk +103.234.100.0 - 103.234.103.255 my +103.234.104.0 - 103.234.107.255 sg +103.234.108.0 - 103.234.113.255 au +103.234.114.0 - 103.234.117.255 in +103.234.118.0 - 103.234.119.255 au +103.234.120.0 - 103.234.123.255 id +103.234.124.0 - 103.234.131.255 cn +103.234.132.0 - 103.234.135.255 nz +103.234.136.0 - 103.234.139.255 in +103.234.140.0 - 103.234.143.255 hk +103.234.144.0 - 103.234.147.255 pk +103.234.148.0 - 103.234.148.255 sg +103.234.149.0 - 103.234.162.255 in +103.234.163.0 - 103.234.163.255 au +103.234.168.0 - 103.234.171.255 sg +103.234.172.0 - 103.234.175.255 cn +103.234.176.0 - 103.234.179.255 jp +103.234.180.0 - 103.234.183.255 cn +103.234.184.0 - 103.234.191.255 in +103.234.192.0 - 103.234.193.255 bd +103.234.194.0 - 103.234.194.255 au +103.234.195.0 - 103.234.195.255 id +103.234.196.0 - 103.234.199.255 jp +103.234.200.0 - 103.234.203.255 bd +103.234.204.0 - 103.234.207.255 tw +103.234.208.0 - 103.234.211.255 id +103.234.212.0 - 103.234.215.255 in +103.234.216.0 - 103.234.219.255 id +103.234.220.0 - 103.234.223.255 hk +103.234.224.0 - 103.234.231.255 tw +103.234.232.0 - 103.234.235.255 au +103.234.236.0 - 103.234.243.255 in +103.234.244.0 - 103.234.247.255 cn +103.234.248.0 - 103.234.251.255 au +103.234.252.0 - 103.234.255.255 id +103.235.0.0 - 103.235.3.255 in +103.235.4.0 - 103.235.7.255 hk +103.235.8.0 - 103.235.11.255 in +103.235.12.0 - 103.235.15.255 jp +103.235.16.0 - 103.235.19.255 cn +103.235.20.0 - 103.235.20.255 au +103.235.21.0 - 103.235.21.255 id +103.235.22.0 - 103.235.22.255 au +103.235.23.0 - 103.235.23.255 in +103.235.24.0 - 103.235.27.255 kr +103.235.28.0 - 103.235.31.255 my +103.235.32.0 - 103.235.35.255 id +103.235.36.0 - 103.235.39.255 au +103.235.40.0 - 103.235.43.255 jp +103.235.44.0 - 103.235.47.255 hk +103.235.48.0 - 103.235.51.255 cn +103.235.52.0 - 103.235.55.255 au +103.235.56.0 - 103.235.63.255 cn +103.235.64.0 - 103.235.64.255 in +103.235.65.0 - 103.235.65.255 au +103.235.66.0 - 103.235.67.255 id +103.235.68.0 - 103.235.71.255 in +103.235.80.0 - 103.235.87.255 cn +103.235.88.0 - 103.235.91.255 tw +103.235.92.0 - 103.235.99.255 au +103.235.100.0 - 103.235.103.255 hk +103.235.104.0 - 103.235.107.255 in +103.235.108.0 - 103.235.108.255 au +103.235.109.0 - 103.235.109.255 id +103.235.110.0 - 103.235.111.255 wf +103.235.112.0 - 103.235.115.255 jp +103.235.116.0 - 103.235.119.255 au +103.235.120.0 - 103.235.123.255 in +103.235.124.0 - 103.235.127.255 jp +103.235.128.0 - 103.235.151.255 cn +103.235.152.0 - 103.235.153.255 id +103.235.154.0 - 103.235.154.255 au +103.235.155.0 - 103.235.159.255 in +103.235.168.0 - 103.235.175.255 hk +103.235.176.0 - 103.235.176.255 us +103.235.177.0 - 103.235.179.255 af +103.235.180.0 - 103.235.183.255 jp +103.235.184.0 - 103.235.187.255 cn +103.235.188.0 - 103.235.191.255 au +103.235.192.0 - 103.235.195.255 cn +103.235.196.0 - 103.235.199.255 np +103.235.200.0 - 103.235.203.255 cn +103.235.204.0 - 103.235.205.255 sg +103.235.206.0 - 103.235.207.255 in +103.235.208.0 - 103.235.215.255 vn +103.235.220.0 - 103.236.99.255 cn +103.236.100.0 - 103.236.103.255 hk +103.236.104.0 - 103.236.117.255 in +103.236.118.0 - 103.236.118.255 au +103.236.119.0 - 103.236.119.255 sg +103.236.120.0 - 103.236.123.255 cn +103.236.124.0 - 103.236.127.255 in +103.236.128.0 - 103.236.131.255 jp +103.236.132.0 - 103.236.135.255 pk +103.236.136.0 - 103.236.139.255 hk +103.236.140.0 - 103.236.147.255 jp +103.236.148.0 - 103.236.149.255 sg +103.236.150.0 - 103.236.151.255 id +103.236.152.0 - 103.236.159.255 in +103.236.160.0 - 103.236.161.255 id +103.236.162.0 - 103.236.163.255 au +103.236.164.0 - 103.236.175.255 in +103.236.176.0 - 103.236.179.255 ph +103.236.180.0 - 103.236.183.255 jp +103.236.184.0 - 103.236.187.255 cn +103.236.188.0 - 103.236.192.255 id +103.236.193.0 - 103.236.195.255 in +103.236.196.0 - 103.236.199.255 sg +103.236.200.0 - 103.236.200.255 in +103.236.201.0 - 103.236.201.255 id +103.236.202.0 - 103.236.203.255 au +103.236.204.0 - 103.236.211.255 in +103.236.212.0 - 103.236.215.255 us +103.236.216.0 - 103.236.219.255 hk +103.236.220.0 - 103.236.223.255 cn +103.236.224.0 - 103.236.227.255 jp +103.236.228.0 - 103.236.231.255 my +103.236.232.0 - 103.236.235.255 cn +103.236.236.0 - 103.236.239.255 in +103.236.240.0 - 103.237.15.255 cn +103.237.16.0 - 103.237.19.255 au +103.237.20.0 - 103.237.23.255 kr +103.237.24.0 - 103.237.31.255 cn +103.237.32.0 - 103.237.35.255 id +103.237.36.0 - 103.237.39.255 bd +103.237.40.0 - 103.237.43.255 nz +103.237.44.0 - 103.237.51.255 in +103.237.52.0 - 103.237.53.255 kh +103.237.54.0 - 103.237.55.255 hk +103.237.56.0 - 103.237.59.255 in +103.237.60.0 - 103.237.67.255 vn +103.237.68.0 - 103.237.71.255 cn +103.237.72.0 - 103.237.75.255 hk +103.237.80.0 - 103.237.80.255 sg +103.237.81.0 - 103.237.82.255 au +103.237.83.0 - 103.237.83.255 af +103.237.84.0 - 103.237.87.255 pk +103.237.88.0 - 103.237.91.255 cn +103.237.92.0 - 103.237.95.255 au +103.237.96.0 - 103.237.99.255 vn +103.237.100.0 - 103.237.103.255 mo +103.237.104.0 - 103.237.111.255 au +103.237.112.0 - 103.237.119.255 in +103.237.120.0 - 103.237.123.255 jp +103.237.124.0 - 103.237.127.255 mo +103.237.128.0 - 103.237.131.255 hk +103.237.132.0 - 103.237.133.255 sg +103.237.134.0 - 103.237.134.255 id +103.237.135.0 - 103.237.135.255 in +103.237.136.0 - 103.237.139.255 jp +103.237.140.0 - 103.237.141.255 id +103.237.142.0 - 103.237.143.255 sg +103.237.144.0 - 103.237.151.255 vn +103.237.152.0 - 103.237.155.255 cn +103.237.156.0 - 103.237.159.255 in +103.237.160.0 - 103.237.163.255 au +103.237.164.0 - 103.237.167.255 nz +103.237.168.0 - 103.237.169.255 sg +103.237.170.0 - 103.237.170.255 in +103.237.171.0 - 103.237.171.255 au +103.237.172.0 - 103.237.175.255 in +103.237.176.0 - 103.238.7.255 cn +103.238.8.0 - 103.238.15.255 in +103.238.16.0 - 103.238.59.255 cn +103.238.60.0 - 103.238.60.255 nz +103.238.61.0 - 103.238.61.255 in +103.238.62.0 - 103.238.62.255 au +103.238.63.0 - 103.238.63.255 bd +103.238.64.0 - 103.238.83.255 vn +103.238.84.0 - 103.238.87.255 nz +103.238.88.0 - 103.238.99.255 cn +103.238.100.0 - 103.238.111.255 in +103.238.116.0 - 103.238.119.255 tl +103.238.120.0 - 103.238.123.255 au +103.238.124.0 - 103.238.127.255 my +103.238.128.0 - 103.238.128.255 jp +103.238.129.0 - 103.238.129.255 au +103.238.130.0 - 103.238.130.255 jp +103.238.131.0 - 103.238.131.255 au +103.238.132.0 - 103.238.135.255 cn +103.238.136.0 - 103.238.139.255 id +103.238.140.0 - 103.238.147.255 cn +103.238.148.0 - 103.238.151.255 my +103.238.152.0 - 103.238.155.255 in +103.238.156.0 - 103.238.157.255 as +103.238.158.0 - 103.238.159.255 in +103.238.160.0 - 103.238.191.255 cn +103.238.192.0 - 103.238.193.255 in +103.238.194.0 - 103.238.194.255 nz +103.238.195.0 - 103.238.195.255 au +103.238.196.0 - 103.238.199.255 cn +103.238.200.0 - 103.238.203.255 id +103.238.204.0 - 103.238.207.255 cn +103.238.208.0 - 103.238.215.255 vn +103.238.216.0 - 103.238.223.255 in +103.238.224.0 - 103.238.227.255 hk +103.238.228.0 - 103.238.235.255 in +103.238.236.0 - 103.238.239.255 jp +103.238.240.0 - 103.238.243.255 in +103.238.244.0 - 103.238.247.255 jp +103.238.248.0 - 103.238.251.255 kr +103.238.252.0 - 103.239.3.255 cn +103.239.4.0 - 103.239.7.255 bd +103.239.8.0 - 103.239.11.255 nz +103.239.16.0 - 103.239.19.255 jp +103.239.24.0 - 103.239.27.255 au +103.239.28.0 - 103.239.31.255 hk +103.239.32.0 - 103.239.35.255 vn +103.239.36.0 - 103.239.39.255 in +103.239.40.0 - 103.239.47.255 cn +103.239.48.0 - 103.239.49.255 au +103.239.50.0 - 103.239.50.255 in +103.239.51.0 - 103.239.51.255 au +103.239.52.0 - 103.239.55.255 kh +103.239.56.0 - 103.239.59.255 in +103.239.60.0 - 103.239.63.255 tw +103.239.68.0 - 103.239.71.255 cn +103.239.72.0 - 103.239.75.255 hk +103.239.76.0 - 103.239.77.255 au +103.239.78.0 - 103.239.78.255 in +103.239.79.0 - 103.239.79.255 au +103.239.80.0 - 103.239.87.255 in +103.239.92.0 - 103.239.95.255 jp +103.239.96.0 - 103.239.99.255 cn +103.239.100.0 - 103.239.103.255 hk +103.239.104.0 - 103.239.105.255 nz +103.239.106.0 - 103.239.107.255 au +103.239.108.0 - 103.239.111.255 jp +103.239.112.0 - 103.239.115.255 kr +103.239.116.0 - 103.239.123.255 vn +103.239.124.0 - 103.239.125.255 in +103.239.126.0 - 103.239.126.255 hk +103.239.127.0 - 103.239.127.255 my +103.239.128.0 - 103.239.135.255 au +103.239.136.0 - 103.239.151.255 in +103.239.152.0 - 103.239.159.255 cn +103.239.160.0 - 103.239.163.255 to +103.239.164.0 - 103.239.164.255 hk +103.239.165.0 - 103.239.165.255 id +103.239.166.0 - 103.239.167.255 au +103.239.168.0 - 103.239.175.255 in +103.239.176.0 - 103.239.187.255 cn +103.239.188.0 - 103.239.191.255 id +103.239.192.0 - 103.239.199.255 cn +103.239.200.0 - 103.239.203.255 ph +103.239.204.0 - 103.239.211.255 cn +103.239.212.0 - 103.239.212.255 au +103.239.214.0 - 103.239.215.255 nz +103.239.216.0 - 103.239.219.255 jp +103.239.220.0 - 103.239.223.255 sg +103.239.224.0 - 103.239.227.255 cn +103.239.228.0 - 103.239.231.255 nz +103.239.232.0 - 103.239.235.255 in +103.239.236.0 - 103.239.243.255 kr +103.239.244.0 - 103.239.247.255 cn +103.239.248.0 - 103.239.251.255 my +103.239.252.0 - 103.239.255.255 bd +103.240.0.0 - 103.240.7.255 jp +103.240.8.0 - 103.240.11.255 in +103.240.12.0 - 103.240.15.255 jp +103.240.16.0 - 103.240.19.255 cn +103.240.20.0 - 103.240.27.255 jp +103.240.28.0 - 103.240.31.255 kr +103.240.32.0 - 103.240.35.255 in +103.240.36.0 - 103.240.39.255 cn +103.240.40.0 - 103.240.43.255 hk +103.240.44.0 - 103.240.47.255 bd +103.240.48.0 - 103.240.51.255 kr +103.240.52.0 - 103.240.55.255 nz +103.240.56.0 - 103.240.59.255 jp +103.240.60.0 - 103.240.63.255 th +103.240.64.0 - 103.240.67.255 hk +103.240.72.0 - 103.240.75.255 cn +103.240.76.0 - 103.240.79.255 in +103.240.80.0 - 103.240.83.255 hk +103.240.84.0 - 103.240.87.255 cn +103.240.88.0 - 103.240.88.255 au +103.240.89.0 - 103.240.91.255 in +103.240.92.0 - 103.240.95.255 hk +103.240.96.0 - 103.240.107.255 in +103.240.108.0 - 103.240.111.255 id +103.240.112.0 - 103.240.115.255 kh +103.240.116.0 - 103.240.119.255 jp +103.240.120.0 - 103.240.123.255 ph +103.240.124.0 - 103.240.127.255 cn +103.240.128.0 - 103.240.131.255 sg +103.240.132.0 - 103.240.132.255 au +103.240.133.0 - 103.240.133.255 nz +103.240.134.0 - 103.240.135.255 au +103.240.136.0 - 103.240.139.255 in +103.240.140.0 - 103.240.143.255 hk +103.240.144.0 - 103.240.147.255 in +103.240.148.0 - 103.240.151.255 hk +103.240.152.0 - 103.240.155.255 nz +103.240.156.0 - 103.240.159.255 cn +103.240.160.0 - 103.240.171.255 in +103.240.172.0 - 103.240.175.255 cn +103.240.176.0 - 103.240.179.255 my +103.240.180.0 - 103.240.183.255 hk +103.240.184.0 - 103.240.187.255 nz +103.240.192.0 - 103.240.195.255 in +103.240.196.0 - 103.240.203.255 hk +103.240.204.0 - 103.240.219.255 in +103.240.220.0 - 103.240.220.255 pk +103.240.221.0 - 103.240.221.255 hk +103.240.222.0 - 103.240.231.255 au +103.240.232.0 - 103.240.239.255 in +103.240.240.0 - 103.240.243.255 la +103.240.244.0 - 103.240.247.255 cn +103.240.248.0 - 103.240.251.255 bd +103.240.252.0 - 103.240.255.255 jp +103.241.0.0 - 103.241.3.255 au +103.241.4.0 - 103.241.5.255 id +103.241.6.0 - 103.241.7.255 au +103.241.8.0 - 103.241.11.255 in +103.241.12.0 - 103.241.15.255 cn +103.241.16.0 - 103.241.19.255 hk +103.241.20.0 - 103.241.23.255 in +103.241.24.0 - 103.241.24.255 id +103.241.25.0 - 103.241.25.255 in +103.241.26.0 - 103.241.26.255 au +103.241.27.0 - 103.241.27.255 lk +103.241.28.0 - 103.241.35.255 th +103.241.36.0 - 103.241.39.255 nz +103.241.40.0 - 103.241.47.255 in +103.241.48.0 - 103.241.51.255 hk +103.241.52.0 - 103.241.55.255 in +103.241.56.0 - 103.241.59.255 nz +103.241.60.0 - 103.241.63.255 sg +103.241.64.0 - 103.241.67.255 jp +103.241.68.0 - 103.241.71.255 tw +103.241.72.0 - 103.241.75.255 cn +103.241.76.0 - 103.241.79.255 kr +103.241.80.0 - 103.241.83.255 in +103.241.84.0 - 103.241.91.255 nz +103.241.92.0 - 103.241.99.255 cn +103.241.100.0 - 103.241.103.255 au +103.241.104.0 - 103.241.104.255 jp +103.241.105.0 - 103.241.107.255 sg +103.241.108.0 - 103.241.111.255 hk +103.241.112.0 - 103.241.115.255 in +103.241.116.0 - 103.241.119.255 kr +103.241.120.0 - 103.241.123.255 nz +103.241.124.0 - 103.241.131.255 jp +103.241.132.0 - 103.241.147.255 in +103.241.148.0 - 103.241.149.255 au +103.241.150.0 - 103.241.151.127 my +103.241.151.128 - 103.241.151.255 sg +103.241.152.0 - 103.241.155.255 jp +103.241.156.0 - 103.241.159.255 af +103.241.160.0 - 103.241.163.255 cn +103.241.164.0 - 103.241.167.255 hk +103.241.168.0 - 103.241.171.255 in +103.241.172.0 - 103.241.175.255 jp +103.241.176.0 - 103.241.177.255 au +103.241.178.0 - 103.241.179.255 id +103.241.180.0 - 103.241.183.255 in +103.241.184.0 - 103.241.191.255 cn +103.241.192.0 - 103.241.195.255 jp +103.241.196.0 - 103.241.203.255 au +103.241.204.0 - 103.241.207.255 id +103.241.208.0 - 103.241.211.255 jp +103.241.212.0 - 103.241.214.255 au +103.241.215.0 - 103.241.215.255 us +103.241.216.0 - 103.241.219.255 au +103.241.220.0 - 103.241.223.255 cn +103.241.224.0 - 103.241.227.255 in +103.241.228.0 - 103.241.231.255 hk +103.241.232.0 - 103.241.239.255 in +103.241.240.0 - 103.241.241.255 au +103.241.242.0 - 103.241.247.255 in +103.241.248.0 - 103.241.251.255 vn +103.241.252.0 - 103.241.255.255 au +103.242.0.0 - 103.242.3.255 hk +103.242.4.0 - 103.242.7.255 jp +103.242.8.0 - 103.242.11.255 cn +103.242.12.0 - 103.242.15.255 kh +103.242.16.0 - 103.242.19.255 my +103.242.20.0 - 103.242.23.255 bd +103.242.24.0 - 103.242.27.255 nz +103.242.28.0 - 103.242.31.255 jp +103.242.32.0 - 103.242.35.255 au +103.242.36.0 - 103.242.39.255 nz +103.242.40.0 - 103.242.43.255 kh +103.242.44.0 - 103.242.47.255 mn +103.242.48.0 - 103.242.48.255 nz +103.242.49.0 - 103.242.49.255 au +103.242.50.0 - 103.242.51.255 af +103.242.52.0 - 103.242.55.255 vn +103.242.56.0 - 103.242.59.255 kh +103.242.60.0 - 103.242.63.255 in +103.242.64.0 - 103.242.67.255 cn +103.242.68.0 - 103.242.71.255 nz +103.242.72.0 - 103.242.75.255 hk +103.242.76.0 - 103.242.79.255 in +103.242.80.0 - 103.242.83.255 au +103.242.84.0 - 103.242.85.255 id +103.242.86.0 - 103.242.87.255 in +103.242.88.0 - 103.242.91.255 sg +103.242.92.0 - 103.242.95.255 au +103.242.96.0 - 103.242.99.255 mm +103.242.100.0 - 103.242.103.255 hk +103.242.104.0 - 103.242.107.255 id +103.242.108.0 - 103.242.111.255 hk +103.242.112.0 - 103.242.115.255 jp +103.242.116.0 - 103.242.123.255 in +103.242.124.0 - 103.242.125.255 id +103.242.126.0 - 103.242.127.255 to +103.242.128.0 - 103.242.135.255 cn +103.242.136.0 - 103.242.139.255 in +103.242.140.0 - 103.242.143.255 hk +103.242.144.0 - 103.242.147.255 th +103.242.148.0 - 103.242.149.255 hk +103.242.150.0 - 103.242.151.255 sg +103.242.152.0 - 103.242.159.255 in +103.242.160.0 - 103.242.163.255 cn +103.242.164.0 - 103.242.167.255 pg +103.242.168.0 - 103.242.179.255 cn +103.242.180.0 - 103.242.181.255 id +103.242.182.0 - 103.242.183.255 au +103.242.184.0 - 103.242.199.255 in +103.242.200.0 - 103.242.203.255 cn +103.242.204.0 - 103.242.209.255 id +103.242.210.0 - 103.242.211.255 au +103.242.212.0 - 103.242.215.255 cn +103.242.216.0 - 103.242.219.255 bd +103.242.220.0 - 103.242.223.255 cn +103.242.224.0 - 103.242.227.255 in +103.242.228.0 - 103.242.231.255 nz +103.242.232.0 - 103.242.232.255 in +103.242.233.0 - 103.242.233.255 id +103.242.234.0 - 103.242.234.255 in +103.242.235.0 - 103.242.235.255 au +103.242.236.0 - 103.242.239.255 in +103.242.240.0 - 103.242.243.255 cn +103.242.244.0 - 103.242.247.255 nz +103.242.248.0 - 103.242.251.255 au +103.242.252.0 - 103.242.255.255 jp +103.243.0.0 - 103.243.3.255 hk +103.243.4.0 - 103.243.11.255 in +103.243.12.0 - 103.243.12.255 au +103.243.13.0 - 103.243.13.255 sg +103.243.14.0 - 103.243.14.255 hk +103.243.15.0 - 103.243.15.255 sg +103.243.16.0 - 103.243.18.255 au +103.243.19.0 - 103.243.19.255 in +103.243.20.0 - 103.243.23.255 kr +103.243.24.0 - 103.243.27.255 hk +103.243.28.0 - 103.243.63.255 in +103.243.64.0 - 103.243.67.255 au +103.243.68.0 - 103.243.75.255 in +103.243.76.0 - 103.243.83.255 bd +103.243.84.0 - 103.243.87.255 au +103.243.88.0 - 103.243.89.255 in +103.243.90.0 - 103.243.90.255 nz +103.243.91.0 - 103.243.91.255 au +103.243.92.0 - 103.243.95.255 hk +103.243.96.0 - 103.243.99.255 nz +103.243.100.0 - 103.243.103.255 hk +103.243.104.0 - 103.243.107.255 vn +103.243.108.0 - 103.243.109.255 id +103.243.110.0 - 103.243.110.255 au +103.243.111.0 - 103.243.119.255 in +103.243.120.0 - 103.243.123.255 jp +103.243.124.0 - 103.243.127.255 in +103.243.128.0 - 103.243.131.255 hk +103.243.132.0 - 103.243.135.255 in +103.243.136.0 - 103.243.139.255 cn +103.243.140.0 - 103.243.143.255 bd +103.243.144.0 - 103.243.147.255 in +103.243.148.0 - 103.243.151.255 au +103.243.152.0 - 103.243.155.255 jp +103.243.156.0 - 103.243.159.255 my +103.243.160.0 - 103.243.163.255 nz +103.243.164.0 - 103.243.167.255 hk +103.243.168.0 - 103.243.171.255 th +103.243.172.0 - 103.243.175.255 sg +103.243.176.0 - 103.243.176.255 in +103.243.177.0 - 103.243.178.255 id +103.243.179.0 - 103.243.179.255 us +103.243.180.0 - 103.243.183.255 hk +103.243.184.0 - 103.243.187.255 in +103.243.188.0 - 103.243.191.255 sg +103.243.192.0 - 103.243.195.255 my +103.243.196.0 - 103.243.199.255 jp +103.243.200.0 - 103.243.203.255 kr +103.243.204.0 - 103.243.207.255 nz +103.243.208.0 - 103.243.211.255 jp +103.243.212.0 - 103.243.215.255 my +103.243.216.0 - 103.243.219.255 vn +103.243.220.0 - 103.243.223.255 sg +103.243.224.0 - 103.243.237.255 in +103.243.238.0 - 103.243.238.255 ph +103.243.239.0 - 103.243.239.255 au +103.243.240.0 - 103.243.243.255 jp +103.243.244.0 - 103.243.245.255 au +103.243.246.0 - 103.243.247.255 id +103.243.248.0 - 103.243.251.255 tw +103.243.252.0 - 103.243.255.255 cn +103.244.0.0 - 103.244.3.255 hk +103.244.8.0 - 103.244.11.255 sg +103.244.12.0 - 103.244.15.255 bd +103.244.16.0 - 103.244.19.255 cn +103.244.28.0 - 103.244.31.255 ph +103.244.32.0 - 103.244.35.255 in +103.244.36.0 - 103.244.39.255 id +103.244.40.0 - 103.244.43.255 kr +103.244.44.0 - 103.244.47.255 hk +103.244.48.0 - 103.244.48.255 in +103.244.49.0 - 103.244.49.255 my +103.244.50.0 - 103.244.50.255 nz +103.244.51.0 - 103.244.51.255 id +103.244.52.0 - 103.244.57.255 hk +103.244.58.0 - 103.244.87.255 cn +103.244.88.0 - 103.244.91.255 hk +103.244.92.0 - 103.244.95.255 jp +103.244.96.0 - 103.244.99.255 id +103.244.100.0 - 103.244.103.255 sg +103.244.104.0 - 103.244.107.255 jp +103.244.108.0 - 103.244.111.255 kr +103.244.116.0 - 103.244.119.255 cn +103.244.120.0 - 103.244.127.255 in +103.244.128.0 - 103.244.131.255 au +103.244.132.0 - 103.244.135.255 pk +103.244.136.0 - 103.244.139.255 vn +103.244.140.0 - 103.244.143.255 bd +103.244.144.0 - 103.244.144.255 us +103.244.145.0 - 103.244.147.255 af +103.244.148.0 - 103.244.151.255 hk +103.244.152.0 - 103.244.155.255 in +103.244.156.0 - 103.244.159.255 hk +103.244.160.0 - 103.244.161.255 id +103.244.162.0 - 103.244.162.255 bd +103.244.163.0 - 103.244.163.255 my +103.244.164.0 - 103.244.167.255 cn +103.244.168.0 - 103.244.171.255 in +103.244.172.0 - 103.244.179.255 pk +103.244.180.0 - 103.244.183.255 nz +103.244.184.0 - 103.244.187.255 bd +103.244.188.0 - 103.244.189.255 my +103.244.190.0 - 103.244.190.255 in +103.244.191.0 - 103.244.191.255 my +103.244.196.0 - 103.244.203.255 au +103.244.204.0 - 103.244.207.255 id +103.244.208.0 - 103.244.211.255 jp +103.244.212.0 - 103.244.215.255 nz +103.244.216.0 - 103.244.223.255 jp +103.244.224.0 - 103.244.227.255 hk +103.244.228.0 - 103.244.231.255 fj +103.244.232.0 - 103.244.235.255 cn +103.244.236.0 - 103.244.239.255 au +103.244.240.0 - 103.244.244.255 in +103.244.245.0 - 103.244.245.255 id +103.244.246.0 - 103.244.247.255 sg +103.244.248.0 - 103.244.251.255 kh +103.244.252.0 - 103.244.255.255 cn +103.245.0.0 - 103.245.3.255 in +103.245.4.0 - 103.245.7.255 jp +103.245.8.0 - 103.245.15.255 in +103.245.16.0 - 103.245.19.255 id +103.245.20.0 - 103.245.22.255 in +103.245.23.0 - 103.245.23.255 cn +103.245.24.0 - 103.245.27.255 my +103.245.28.0 - 103.245.31.255 hk +103.245.32.0 - 103.245.35.255 in +103.245.36.0 - 103.245.39.255 sg +103.245.40.0 - 103.245.43.255 jp +103.245.44.0 - 103.245.51.255 in +103.245.52.0 - 103.245.55.255 cn +103.245.56.0 - 103.245.59.255 jp +103.245.60.0 - 103.245.63.255 cn +103.245.64.0 - 103.245.71.255 in +103.245.72.0 - 103.245.73.255 id +103.245.74.0 - 103.245.74.255 in +103.245.75.0 - 103.245.75.255 au +103.245.76.0 - 103.245.79.255 kh +103.245.80.0 - 103.245.83.255 cn +103.245.84.0 - 103.245.87.255 au +103.245.88.0 - 103.245.91.255 my +103.245.92.0 - 103.245.95.255 sg +103.245.96.0 - 103.245.99.255 bd +103.245.100.0 - 103.245.107.255 in +103.245.108.0 - 103.245.111.255 bd +103.245.112.0 - 103.245.119.255 in +103.245.120.0 - 103.245.121.255 my +103.245.122.0 - 103.245.123.255 id +103.245.124.0 - 103.245.131.255 cn +103.245.132.0 - 103.245.135.255 pk +103.245.136.0 - 103.245.139.255 id +103.245.140.0 - 103.245.143.255 bd +103.245.144.0 - 103.245.144.255 in +103.245.145.0 - 103.245.146.255 au +103.245.147.0 - 103.245.147.255 in +103.245.148.0 - 103.245.151.255 vn +103.245.152.0 - 103.245.155.255 au +103.245.156.0 - 103.245.159.255 in +103.245.160.0 - 103.245.163.255 to +103.245.164.0 - 103.245.166.255 la +103.245.167.0 - 103.245.167.255 th +103.245.172.0 - 103.245.175.255 nz +103.245.176.0 - 103.245.176.255 sg +103.245.177.0 - 103.245.177.255 id +103.245.178.0 - 103.245.179.255 bd +103.245.180.0 - 103.245.183.255 id +103.245.184.0 - 103.245.189.255 in +103.245.190.0 - 103.245.191.255 hk +103.245.192.0 - 103.245.195.255 pk +103.245.196.0 - 103.245.203.255 in +103.245.204.0 - 103.245.207.255 bd +103.245.208.0 - 103.245.211.255 hk +103.245.212.0 - 103.245.222.255 au +103.245.223.0 - 103.245.223.255 sg +103.245.224.0 - 103.245.224.255 jp +103.245.225.0 - 103.245.226.255 id +103.245.227.0 - 103.245.227.255 au +103.245.228.0 - 103.245.239.255 jp +103.245.240.0 - 103.245.243.255 bt +103.245.244.0 - 103.245.255.255 vn 103.246.0.0 - 103.246.3.255 id 103.246.4.0 - 103.246.7.255 au 103.246.8.0 - 103.246.15.255 cn 103.246.16.0 - 103.246.19.255 th 103.246.20.0 - 103.246.23.255 ph 103.246.24.0 - 103.246.27.255 th -103.246.28.0 - 103.246.39.255 au -103.246.40.0 - 103.246.43.255 hk -103.246.44.0 - 103.246.49.255 in +103.246.28.0 - 103.246.36.255 au +103.246.37.0 - 103.246.37.255 sg +103.246.38.0 - 103.246.38.255 hk +103.246.39.0 - 103.246.39.255 jp +103.246.40.0 - 103.246.49.255 in 103.246.50.0 - 103.246.50.255 th 103.246.51.0 - 103.246.51.255 au 103.246.52.0 - 103.246.55.255 nz 103.246.56.0 - 103.246.59.255 kr 103.246.60.0 - 103.246.63.255 jp 103.246.64.0 - 103.246.67.255 in -103.246.68.0 - 103.246.75.255 jp +103.246.68.0 - 103.246.71.255 jp 103.246.76.0 - 103.246.76.255 id 103.246.77.0 - 103.246.77.255 hk 103.246.78.0 - 103.246.78.255 sg @@ -63793,12 +42543,13 @@ 103.246.84.0 - 103.246.87.255 in 103.246.88.0 - 103.246.91.255 my 103.246.92.0 - 103.246.95.255 sg -103.246.96.0 - 103.246.103.255 au +103.246.96.0 - 103.246.96.255 us +103.246.97.0 - 103.246.103.255 au 103.246.104.0 - 103.246.104.255 vn 103.246.106.0 - 103.246.106.255 in 103.246.107.0 - 103.246.107.255 id 103.246.108.0 - 103.246.111.255 pk -103.246.112.0 - 103.246.115.255 my +103.246.112.0 - 103.246.115.255 hk 103.246.116.0 - 103.246.119.255 id 103.246.120.0 - 103.246.127.255 cn 103.246.128.0 - 103.246.128.255 au @@ -63806,30 +42557,37 @@ 103.246.130.0 - 103.246.131.255 au 103.246.132.0 - 103.246.135.255 cn 103.246.136.0 - 103.246.139.255 au -103.246.140.0 - 103.246.143.255 sg +103.246.140.0 - 103.246.140.255 jp +103.246.141.0 - 103.246.141.255 hk +103.246.142.0 - 103.246.143.255 sg 103.246.144.0 - 103.246.147.255 kh -103.246.148.0 - 103.246.151.255 jp +103.246.148.0 - 103.246.149.255 sg +103.246.150.0 - 103.246.151.255 jp 103.246.152.0 - 103.246.159.255 cn 103.246.160.0 - 103.246.163.255 hk 103.246.164.0 - 103.246.167.255 jp 103.246.168.0 - 103.246.168.255 au 103.246.169.0 - 103.246.169.255 id 103.246.170.0 - 103.246.171.255 in -103.246.172.0 - 103.246.175.255 ph -103.246.176.0 - 103.246.179.255 hk +103.246.176.0 - 103.246.178.255 hk +103.246.179.0 - 103.246.179.255 jp 103.246.180.0 - 103.246.183.255 nz 103.246.184.0 - 103.246.185.255 id -103.246.186.0 - 103.246.187.255 au +103.246.186.0 - 103.246.186.255 au +103.246.187.0 - 103.246.187.255 in 103.246.188.0 - 103.246.191.255 th -103.246.192.0 - 103.246.195.255 jp -103.246.196.0 - 103.246.199.255 in -103.246.200.0 - 103.246.203.255 sg +103.246.192.0 - 103.246.199.255 in +103.246.200.0 - 103.246.200.255 sg +103.246.201.0 - 103.246.201.35 id +103.246.201.36 - 103.246.201.36 sg +103.246.201.37 - 103.246.201.255 id +103.246.202.0 - 103.246.203.255 sg 103.246.204.0 - 103.246.207.255 my 103.246.208.0 - 103.246.211.255 tw 103.246.212.0 - 103.246.215.255 in 103.246.216.0 - 103.246.216.255 hk 103.246.217.0 - 103.246.217.255 my -103.246.218.0 - 103.246.219.255 in +103.246.218.0 - 103.246.219.255 tw 103.246.220.0 - 103.246.223.255 vn 103.246.224.0 - 103.246.227.255 in 103.246.228.0 - 103.246.231.255 kh @@ -63838,13 +42596,1765 @@ 103.246.236.0 - 103.246.239.255 kr 103.246.240.0 - 103.246.243.255 in 103.246.244.0 - 103.246.247.255 hk -103.246.248.0 - 103.246.249.255 us -103.246.250.0 - 103.246.251.255 nz +103.246.248.0 - 103.246.248.255 us +103.246.249.0 - 103.246.251.255 nz 103.246.252.0 - 103.246.255.255 jp +103.247.0.0 - 103.247.3.255 au +103.247.4.0 - 103.247.7.255 in +103.247.8.0 - 103.247.27.255 id +103.247.28.0 - 103.247.31.255 in +103.247.32.0 - 103.247.35.255 id +103.247.36.0 - 103.247.37.255 hk +103.247.38.0 - 103.247.39.255 ph +103.247.40.0 - 103.247.43.255 id +103.247.44.0 - 103.247.47.255 bd +103.247.48.0 - 103.247.51.255 lk +103.247.52.0 - 103.247.55.255 in +103.247.56.0 - 103.247.59.255 nz +103.247.60.0 - 103.247.63.255 th +103.247.64.0 - 103.247.65.255 au +103.247.66.0 - 103.247.66.255 pk +103.247.67.0 - 103.247.67.255 au +103.247.68.0 - 103.247.71.255 jp +103.247.72.0 - 103.247.75.255 nz +103.247.76.0 - 103.247.79.255 au +103.247.80.0 - 103.247.83.255 in +103.247.84.0 - 103.247.91.255 jp +103.247.92.0 - 103.247.95.255 hk +103.247.96.0 - 103.247.99.255 in +103.247.100.0 - 103.247.103.255 id +103.247.104.0 - 103.247.107.255 in +103.247.108.0 - 103.247.111.255 hk +103.247.112.0 - 103.247.115.255 tw +103.247.116.0 - 103.247.116.255 au +103.247.117.0 - 103.247.117.255 id +103.247.118.0 - 103.247.119.255 au +103.247.120.0 - 103.247.123.255 id +103.247.124.0 - 103.247.125.255 pk +103.247.126.0 - 103.247.127.255 id +103.247.128.0 - 103.247.131.255 au +103.247.132.0 - 103.247.135.255 sg +103.247.136.0 - 103.247.147.255 hk +103.247.148.0 - 103.247.151.255 in +103.247.152.0 - 103.247.155.255 nz +103.247.156.0 - 103.247.167.255 hk +103.247.168.0 - 103.247.179.255 cn +103.247.180.0 - 103.247.180.255 sg +103.247.181.0 - 103.247.181.255 jp +103.247.182.0 - 103.247.183.255 id +103.247.184.0 - 103.247.187.255 au +103.247.188.0 - 103.247.191.255 jp +103.247.192.0 - 103.247.195.255 nz +103.247.196.0 - 103.247.197.255 id +103.247.198.0 - 103.247.198.255 af +103.247.199.0 - 103.247.199.255 sg +103.247.200.0 - 103.247.203.255 cn +103.247.204.0 - 103.247.207.255 sg +103.247.208.0 - 103.247.210.255 in +103.247.211.0 - 103.247.211.255 id +103.247.212.0 - 103.247.215.255 cn +103.247.216.0 - 103.247.219.255 id +103.247.220.0 - 103.247.223.255 kr +103.247.224.0 - 103.247.225.255 au +103.247.226.0 - 103.247.227.255 id +103.247.228.0 - 103.247.231.255 hk +103.247.232.0 - 103.247.235.255 kr +103.247.236.0 - 103.247.237.255 au +103.247.238.0 - 103.247.239.255 bd +103.247.240.0 - 103.247.243.255 jp +103.247.244.0 - 103.247.245.255 id +103.247.246.0 - 103.247.246.255 in +103.247.247.0 - 103.247.247.255 nz +103.247.248.0 - 103.247.251.255 au +103.247.252.0 - 103.247.255.255 ph +103.248.0.0 - 103.248.1.255 cn +103.248.2.0 - 103.248.7.255 au +103.248.8.0 - 103.248.11.255 jp +103.248.12.0 - 103.248.15.255 bd +103.248.16.0 - 103.248.23.255 au +103.248.24.0 - 103.248.24.255 in +103.248.25.0 - 103.248.25.255 id +103.248.26.0 - 103.248.27.255 au +103.248.28.0 - 103.248.35.255 in +103.248.36.0 - 103.248.39.255 hk +103.248.40.0 - 103.248.43.255 kh +103.248.44.0 - 103.248.47.255 au +103.248.48.0 - 103.248.51.255 jp +103.248.56.0 - 103.248.59.255 id +103.248.60.0 - 103.248.63.255 in +103.248.64.0 - 103.248.67.255 cn +103.248.68.0 - 103.248.71.255 jp +103.248.72.0 - 103.248.75.255 in +103.248.76.0 - 103.248.79.255 hk +103.248.80.0 - 103.248.87.255 in +103.248.88.0 - 103.248.91.255 hk +103.248.92.0 - 103.248.95.255 in +103.248.96.0 - 103.248.97.255 au +103.248.98.0 - 103.248.99.255 sg +103.248.100.0 - 103.248.103.255 cn +103.248.104.0 - 103.248.107.255 kr +103.248.108.0 - 103.248.111.255 hk +103.248.112.0 - 103.248.123.255 in +103.248.124.0 - 103.248.127.255 cn +103.248.128.0 - 103.248.131.255 au +103.248.132.0 - 103.248.135.255 sg +103.248.140.0 - 103.248.143.255 hk +103.248.144.0 - 103.248.145.255 sg +103.248.146.0 - 103.248.146.255 id +103.248.147.0 - 103.248.147.255 au +103.248.148.0 - 103.248.151.255 jp +103.248.152.0 - 103.248.155.255 cn +103.248.156.0 - 103.248.159.255 in +103.248.160.0 - 103.248.167.255 vn +103.248.168.0 - 103.248.171.255 cn +103.248.172.0 - 103.248.175.255 in +103.248.176.0 - 103.248.179.255 nz +103.248.180.0 - 103.248.187.255 hk +103.248.188.0 - 103.248.191.255 au +103.248.192.0 - 103.248.195.255 cn +103.248.200.0 - 103.248.200.255 nz +103.248.201.0 - 103.248.201.255 au +103.248.204.0 - 103.248.207.255 bd +103.248.208.0 - 103.248.211.255 in +103.248.212.0 - 103.248.215.255 cn +103.248.216.0 - 103.248.219.255 id +103.248.220.0 - 103.248.231.255 cn +103.248.232.0 - 103.248.235.255 in +103.248.236.0 - 103.248.239.255 bd +103.248.240.0 - 103.248.243.255 hk +103.248.244.0 - 103.248.247.255 in +103.248.248.0 - 103.248.248.255 id +103.248.249.0 - 103.248.249.255 au +103.248.251.0 - 103.248.251.255 jp +103.248.252.0 - 103.248.255.255 hk +103.249.0.0 - 103.249.3.255 bd +103.249.4.0 - 103.249.7.255 in +103.249.8.0 - 103.249.15.255 cn +103.249.16.0 - 103.249.19.255 in +103.249.20.0 - 103.249.23.255 vn +103.249.24.0 - 103.249.27.255 in +103.249.28.0 - 103.249.31.255 kr +103.249.32.0 - 103.249.35.255 hk +103.249.36.0 - 103.249.47.255 in +103.249.48.0 - 103.249.48.0 au +103.249.48.1 - 103.249.48.31 gu +103.249.48.32 - 103.249.48.39 au +103.249.48.40 - 103.249.48.47 gu +103.249.48.48 - 103.249.51.255 au +103.249.52.0 - 103.249.55.255 cn +103.249.56.0 - 103.249.56.255 bd +103.249.57.0 - 103.249.57.255 au +103.249.58.0 - 103.249.59.255 id +103.249.60.0 - 103.249.63.255 nz +103.249.64.0 - 103.249.65.255 id +103.249.66.0 - 103.249.69.255 au +103.249.70.0 - 103.249.71.255 ro +103.249.72.0 - 103.249.75.255 hk +103.249.76.0 - 103.249.83.255 in +103.249.84.0 - 103.249.87.255 my +103.249.88.0 - 103.249.91.255 in +103.249.92.0 - 103.249.95.255 my +103.249.96.0 - 103.249.99.255 in +103.249.100.0 - 103.249.103.255 vn +103.249.104.0 - 103.249.107.255 cn +103.249.108.0 - 103.249.111.255 hk +103.249.112.0 - 103.249.119.255 jp +103.249.120.0 - 103.249.123.255 in +103.249.124.0 - 103.249.127.255 au +103.249.128.0 - 103.249.131.255 cn +103.249.132.0 - 103.249.135.255 in +103.249.136.0 - 103.249.139.255 cn +103.249.140.0 - 103.249.143.255 au +103.249.144.0 - 103.249.147.255 cn +103.249.148.0 - 103.249.151.255 au +103.249.152.0 - 103.249.155.255 pk +103.249.156.0 - 103.249.159.255 la +103.249.160.0 - 103.249.163.255 tw +103.249.164.0 - 103.249.179.255 cn +103.249.180.0 - 103.249.183.255 in +103.249.184.0 - 103.249.187.255 jp +103.249.188.0 - 103.249.195.255 cn +103.249.196.0 - 103.249.199.255 hk +103.249.200.0 - 103.249.203.255 jp +103.249.204.0 - 103.249.207.255 in +103.249.208.0 - 103.249.209.255 my +103.249.210.0 - 103.249.210.255 id +103.249.211.0 - 103.249.211.255 in +103.249.212.0 - 103.249.219.255 jp +103.249.220.0 - 103.249.225.255 au +103.249.226.0 - 103.249.226.255 in +103.249.227.0 - 103.249.227.255 id +103.249.228.0 - 103.249.231.255 pk +103.249.232.0 - 103.249.243.255 in +103.249.244.0 - 103.249.247.255 cn +103.249.248.0 - 103.249.251.255 in +103.249.252.0 - 103.249.255.255 cn +103.250.0.0 - 103.250.3.255 ki +103.250.8.0 - 103.250.9.255 au +103.250.10.0 - 103.250.11.255 in +103.250.12.0 - 103.250.15.255 hk +103.250.16.0 - 103.250.19.255 in +103.250.20.0 - 103.250.23.255 au +103.250.24.0 - 103.250.27.255 vn +103.250.28.0 - 103.250.31.255 in +103.250.32.0 - 103.250.35.255 cn +103.250.36.0 - 103.250.40.255 in +103.250.41.0 - 103.250.41.255 hk +103.250.42.0 - 103.250.43.255 bd +103.250.44.0 - 103.250.47.255 in +103.250.48.0 - 103.250.51.255 nz +103.250.52.0 - 103.250.55.255 hk +103.250.56.0 - 103.250.59.255 sg +103.250.60.0 - 103.250.61.255 au +103.250.62.0 - 103.250.62.255 in +103.250.63.0 - 103.250.63.255 au +103.250.64.0 - 103.250.67.255 sg +103.250.68.0 - 103.250.71.255 bd +103.250.72.0 - 103.250.75.255 jp +103.250.76.0 - 103.250.87.255 in +103.250.88.0 - 103.250.91.255 nz +103.250.92.0 - 103.250.95.255 jp +103.250.104.0 - 103.250.107.255 cn +103.250.108.0 - 103.250.111.255 jp +103.250.112.0 - 103.250.115.255 in +103.250.116.0 - 103.250.119.255 nz +103.250.120.0 - 103.250.123.255 jp +103.250.124.0 - 103.250.127.255 cn +103.250.128.0 - 103.250.131.255 th +103.250.132.0 - 103.250.135.255 np +103.250.136.0 - 103.250.139.255 in +103.250.140.0 - 103.250.140.255 tw +103.250.141.0 - 103.250.143.255 sg +103.250.144.0 - 103.250.171.255 in +103.250.172.0 - 103.250.175.255 jp +103.250.176.0 - 103.250.179.255 hk +103.250.180.0 - 103.250.183.255 cn +103.250.184.0 - 103.250.191.255 in +103.250.192.0 - 103.250.195.255 cn +103.250.196.0 - 103.250.197.255 th +103.250.198.0 - 103.250.198.255 nz +103.250.199.0 - 103.250.199.255 id +103.250.200.0 - 103.250.203.255 jp +103.250.204.0 - 103.250.207.255 nz +103.250.208.0 - 103.250.211.255 in +103.250.212.0 - 103.250.215.255 au +103.250.216.0 - 103.250.219.255 cn +103.250.222.0 - 103.250.223.255 pk +103.250.224.0 - 103.250.227.255 cn +103.250.228.0 - 103.250.235.255 nz +103.250.236.0 - 103.250.239.255 cn +103.250.240.0 - 103.250.247.255 au +103.250.248.0 - 103.250.255.255 cn +103.251.0.0 - 103.251.3.255 my +103.251.4.0 - 103.251.7.255 au +103.251.12.0 - 103.251.13.255 au +103.251.14.0 - 103.251.14.255 id +103.251.15.0 - 103.251.15.255 au +103.251.16.0 - 103.251.31.255 in +103.251.32.0 - 103.251.35.255 cn +103.251.36.0 - 103.251.39.255 hk +103.251.40.0 - 103.251.41.255 id +103.251.42.0 - 103.251.42.255 au +103.251.43.0 - 103.251.43.255 in +103.251.44.0 - 103.251.45.255 id +103.251.46.0 - 103.251.46.255 in +103.251.47.0 - 103.251.47.255 au +103.251.48.0 - 103.251.63.255 in +103.251.64.0 - 103.251.67.255 au +103.251.68.0 - 103.251.71.255 th +103.251.72.0 - 103.251.79.255 jp +103.251.80.0 - 103.251.83.255 in +103.251.84.0 - 103.251.87.255 cn +103.251.88.0 - 103.251.91.255 hk +103.251.92.0 - 103.251.95.255 in +103.251.96.0 - 103.251.99.255 cn +103.251.100.0 - 103.251.103.255 in +103.251.104.0 - 103.251.107.255 kr +103.251.108.0 - 103.251.109.255 sg +103.251.110.0 - 103.251.111.255 au +103.251.112.0 - 103.251.115.255 hk +103.251.116.0 - 103.251.119.255 jp +103.251.120.0 - 103.251.123.255 bd +103.251.124.0 - 103.251.131.255 cn +103.251.132.0 - 103.251.133.255 pw +103.251.134.0 - 103.251.139.255 au +103.251.140.0 - 103.251.143.255 in +103.251.144.0 - 103.251.147.255 au +103.251.148.0 - 103.251.151.255 in +103.251.152.0 - 103.251.155.255 id +103.251.156.0 - 103.251.159.255 jp +103.251.160.0 - 103.251.163.255 cn +103.251.164.0 - 103.251.167.255 nl +103.251.168.0 - 103.251.168.255 nz +103.251.169.0 - 103.251.175.255 au +103.251.176.0 - 103.251.179.255 af +103.251.180.0 - 103.251.183.255 id +103.251.184.0 - 103.251.191.255 in +103.251.192.0 - 103.251.195.255 cn +103.251.196.0 - 103.251.197.255 sg +103.251.198.0 - 103.251.199.255 hk +103.251.200.0 - 103.251.203.255 my +103.251.204.0 - 103.251.207.255 cn +103.251.208.0 - 103.251.231.255 in +103.251.232.0 - 103.251.235.255 bd +103.251.236.0 - 103.251.239.255 hk +103.251.240.0 - 103.251.243.255 cn +103.251.244.0 - 103.251.247.255 bd +103.251.248.0 - 103.251.251.255 in +103.251.252.0 - 103.251.255.255 jp +103.252.0.0 - 103.252.3.255 vn +103.252.4.0 - 103.252.7.255 in +103.252.8.0 - 103.252.11.255 au +103.252.12.0 - 103.252.13.255 id +103.252.14.0 - 103.252.15.255 au +103.252.16.0 - 103.252.19.255 hk +103.252.20.0 - 103.252.23.255 id +103.252.24.0 - 103.252.27.255 in +103.252.28.0 - 103.252.31.255 cn +103.252.36.0 - 103.252.39.255 cn +103.252.40.0 - 103.252.47.255 in +103.252.49.0 - 103.252.49.255 sg +103.252.50.0 - 103.252.51.255 id +103.252.52.0 - 103.252.55.255 in +103.252.56.0 - 103.252.59.255 au +103.252.60.0 - 103.252.63.255 in +103.252.64.0 - 103.252.67.255 cn +103.252.68.0 - 103.252.71.255 tw +103.252.72.0 - 103.252.79.255 hk +103.252.80.0 - 103.252.83.255 pk +103.252.84.0 - 103.252.84.255 bt +103.252.85.0 - 103.252.85.255 id +103.252.86.0 - 103.252.86.255 in +103.252.87.0 - 103.252.87.255 au +103.252.88.0 - 103.252.91.255 hk +103.252.92.0 - 103.252.95.255 in +103.252.100.0 - 103.252.101.255 id +103.252.102.0 - 103.252.103.255 au +103.252.104.0 - 103.252.107.255 cn +103.252.108.0 - 103.252.111.255 in +103.252.112.0 - 103.252.112.31 au +103.252.112.32 - 103.252.112.131 sg +103.252.112.132 - 103.252.112.132 us +103.252.112.133 - 103.252.112.159 sg +103.252.112.160 - 103.252.112.191 in +103.252.112.192 - 103.252.112.223 jp +103.252.112.224 - 103.252.115.255 sg +103.252.116.0 - 103.252.119.255 in +103.252.120.0 - 103.252.127.255 jp +103.252.128.0 - 103.252.131.255 tw +103.252.132.0 - 103.252.135.255 hk +103.252.136.0 - 103.252.139.255 jp +103.252.140.0 - 103.252.151.255 in +103.252.152.0 - 103.252.155.255 au +103.252.156.0 - 103.252.161.255 in +103.252.162.0 - 103.252.162.255 hk +103.252.163.0 - 103.252.163.255 id +103.252.164.0 - 103.252.171.255 in +103.252.172.0 - 103.252.175.255 cn +103.252.180.0 - 103.252.183.255 jp +103.252.184.0 - 103.252.187.255 in +103.252.188.0 - 103.252.189.255 id +103.252.190.0 - 103.252.191.255 au +103.252.192.0 - 103.252.195.255 in +103.252.196.0 - 103.252.199.255 tw +103.252.200.0 - 103.252.203.255 sg +103.252.204.0 - 103.252.211.255 cn +103.252.212.0 - 103.252.219.255 in +103.252.220.0 - 103.252.223.255 nl +103.252.224.0 - 103.252.227.255 bd +103.252.228.0 - 103.252.231.255 kr +103.252.232.0 - 103.252.235.255 cn +103.252.236.0 - 103.252.239.255 in +103.252.240.0 - 103.252.243.255 hk +103.252.244.0 - 103.252.244.255 tw +103.252.245.0 - 103.252.245.255 in +103.252.246.0 - 103.252.246.255 au +103.252.247.0 - 103.252.247.255 nz +103.252.248.0 - 103.252.251.255 cn +103.252.252.0 - 103.252.255.255 vn +103.253.0.0 - 103.253.3.255 id +103.253.4.0 - 103.253.7.255 cn +103.253.8.0 - 103.253.11.255 hk +103.253.12.0 - 103.253.15.255 my +103.253.16.0 - 103.253.19.255 jp +103.253.20.0 - 103.253.23.255 in +103.253.24.0 - 103.253.27.255 sg +103.253.28.0 - 103.253.37.255 in +103.253.38.0 - 103.253.39.255 bd +103.253.40.0 - 103.253.43.255 hk +103.253.44.0 - 103.253.47.255 bd +103.253.48.0 - 103.253.51.255 nz +103.253.52.0 - 103.253.55.255 in +103.253.56.0 - 103.253.59.255 kr +103.253.60.0 - 103.253.63.255 cn +103.253.64.0 - 103.253.67.255 au +103.253.68.0 - 103.253.69.255 id +103.253.70.0 - 103.253.71.255 in +103.253.72.0 - 103.253.75.255 th +103.253.76.0 - 103.253.85.255 jp +103.253.86.0 - 103.253.87.255 id +103.253.88.0 - 103.253.91.255 vn +103.253.92.0 - 103.253.95.255 au +103.253.96.0 - 103.253.99.255 hk +103.253.100.0 - 103.253.103.255 jp +103.253.104.0 - 103.253.104.255 in +103.253.105.0 - 103.253.105.255 my +103.253.106.0 - 103.253.107.255 id +103.253.108.0 - 103.253.111.255 my +103.253.112.0 - 103.253.115.255 id +103.253.116.0 - 103.253.116.255 nz +103.253.117.0 - 103.253.117.255 th +103.253.118.0 - 103.253.119.255 au +103.253.120.0 - 103.253.123.255 hk +103.253.124.0 - 103.253.124.255 id +103.253.125.0 - 103.253.125.255 in +103.253.126.0 - 103.253.126.255 au +103.253.127.0 - 103.253.127.255 ph +103.253.128.0 - 103.253.131.255 in +103.253.132.0 - 103.253.135.255 th +103.253.136.0 - 103.253.139.255 nz +103.253.140.0 - 103.253.143.255 hk +103.253.144.0 - 103.253.147.255 sg +103.253.148.0 - 103.253.155.255 in +103.253.156.0 - 103.253.159.255 pk +103.253.160.0 - 103.253.163.255 bd +103.253.166.0 - 103.253.175.255 in +103.253.176.0 - 103.253.179.255 jp +103.253.180.0 - 103.253.183.255 kh +103.253.184.0 - 103.253.187.255 tw +103.253.188.0 - 103.253.191.255 jp +103.253.192.0 - 103.253.199.255 au +103.253.200.0 - 103.253.203.255 in +103.253.204.0 - 103.253.207.255 cn +103.253.208.0 - 103.253.211.255 in +103.253.212.0 - 103.253.215.255 id +103.253.216.0 - 103.253.219.255 jp +103.253.220.0 - 103.253.227.255 cn +103.253.228.0 - 103.253.231.255 in +103.253.232.0 - 103.253.235.255 cn +103.253.236.0 - 103.253.239.255 hk +103.253.240.0 - 103.253.243.255 kr +103.253.244.0 - 103.253.247.255 ph +103.253.248.0 - 103.253.251.255 hk +103.253.252.0 - 103.253.255.255 kh +103.254.0.0 - 103.254.3.255 nz +103.254.4.0 - 103.254.7.255 au +103.254.8.0 - 103.254.11.255 cn +103.254.12.0 - 103.254.19.255 vn +103.254.20.0 - 103.254.23.255 cn +103.254.24.0 - 103.254.24.255 au +103.254.25.0 - 103.254.25.255 id +103.254.26.0 - 103.254.26.255 bd +103.254.27.0 - 103.254.35.255 in +103.254.36.0 - 103.254.39.255 ph +103.254.40.0 - 103.254.43.255 vn +103.254.44.0 - 103.254.47.255 sg +103.254.48.0 - 103.254.49.255 id +103.254.50.0 - 103.254.50.255 au +103.254.51.0 - 103.254.51.255 id +103.254.52.0 - 103.254.59.255 in +103.254.60.0 - 103.254.63.255 jp +103.254.64.0 - 103.254.79.255 cn +103.254.80.0 - 103.254.83.255 in +103.254.84.0 - 103.254.87.255 bd +103.254.88.0 - 103.254.93.255 au +103.254.94.0 - 103.254.94.255 bd +103.254.95.0 - 103.254.95.255 id +103.254.96.0 - 103.254.103.255 in +103.254.104.0 - 103.254.107.255 id +103.254.108.0 - 103.254.111.255 hk +103.254.112.0 - 103.254.115.255 cn +103.254.116.0 - 103.254.119.255 hk +103.254.120.0 - 103.254.123.255 mn +103.254.124.0 - 103.254.125.255 in +103.254.126.0 - 103.254.127.255 id +103.254.128.0 - 103.254.131.255 in +103.254.132.0 - 103.254.135.255 nz +103.254.136.0 - 103.254.143.255 au +103.254.144.0 - 103.254.147.255 jp +103.254.148.0 - 103.254.151.255 hk +103.254.152.0 - 103.254.155.255 sg +103.254.156.0 - 103.254.159.255 nz +103.254.160.0 - 103.254.163.255 in +103.254.164.0 - 103.254.165.255 au +103.254.166.0 - 103.254.166.255 af +103.254.167.0 - 103.254.167.255 bd +103.254.168.0 - 103.254.171.255 id +103.254.172.0 - 103.254.175.255 in +103.254.176.0 - 103.254.179.255 cn +103.254.180.0 - 103.254.187.255 np +103.254.188.0 - 103.254.191.255 cn +103.254.192.0 - 103.254.193.255 in +103.254.194.0 - 103.254.195.255 nz +103.254.196.0 - 103.254.196.255 cn +103.254.200.0 - 103.254.207.255 in +103.254.208.0 - 103.254.211.255 hk +103.254.212.0 - 103.254.215.255 sg +103.254.216.0 - 103.254.219.255 vn +103.254.220.0 - 103.254.223.255 hk +103.254.224.0 - 103.254.227.255 pf +103.254.228.0 - 103.254.229.255 nz +103.254.230.0 - 103.254.230.255 in +103.254.231.0 - 103.254.231.255 nz +103.254.232.0 - 103.254.235.255 pf +103.254.236.0 - 103.254.247.255 in +103.254.252.0 - 103.254.255.255 hk +103.255.0.0 - 103.255.3.255 jp +103.255.4.0 - 103.255.7.255 pk +103.255.8.0 - 103.255.11.255 in +103.255.12.0 - 103.255.12.255 id +103.255.13.0 - 103.255.13.255 th +103.255.14.0 - 103.255.15.255 id +103.255.16.0 - 103.255.19.255 au +103.255.20.0 - 103.255.23.255 jp +103.255.24.0 - 103.255.27.255 nz +103.255.28.0 - 103.255.28.255 in +103.255.29.0 - 103.255.29.255 id +103.255.30.0 - 103.255.30.255 bd +103.255.31.0 - 103.255.31.255 au +103.255.32.0 - 103.255.35.255 sg +103.255.36.0 - 103.255.43.255 in +103.255.44.0 - 103.255.47.255 hk +103.255.48.0 - 103.255.51.255 au +103.255.52.0 - 103.255.53.255 id +103.255.54.0 - 103.255.55.255 au +103.255.60.0 - 103.255.63.255 hk +103.255.64.0 - 103.255.67.255 jp +103.255.68.0 - 103.255.71.255 cn +103.255.72.0 - 103.255.83.255 in +103.255.84.0 - 103.255.87.255 vn +103.255.88.0 - 103.255.95.255 cn +103.255.96.0 - 103.255.115.255 in +103.255.116.0 - 103.255.119.255 kh +103.255.120.0 - 103.255.125.255 id +103.255.126.0 - 103.255.126.255 np +103.255.127.0 - 103.255.127.255 hk +103.255.128.0 - 103.255.131.255 pk +103.255.136.0 - 103.255.143.255 cn +103.255.144.0 - 103.255.147.255 in +103.255.148.0 - 103.255.151.255 pk +103.255.152.0 - 103.255.155.255 ph +103.255.156.0 - 103.255.157.255 id +103.255.158.0 - 103.255.169.255 in +103.255.170.0 - 103.255.171.255 my +103.255.172.0 - 103.255.175.255 mm +103.255.176.0 - 103.255.179.255 hk +103.255.180.0 - 103.255.183.255 in +103.255.184.0 - 103.255.187.255 cn +103.255.188.0 - 103.255.199.255 in +103.255.200.0 - 103.255.203.255 cn +103.255.204.0 - 103.255.207.255 in +103.255.208.0 - 103.255.215.255 cn +103.255.216.0 - 103.255.227.255 in +103.255.228.0 - 103.255.231.255 cn +103.255.232.0 - 103.255.235.255 in +103.255.236.0 - 103.255.239.255 vn +103.255.240.0 - 103.255.243.255 id +103.255.244.0 - 103.255.247.255 jp +103.255.248.0 - 103.255.249.255 au +103.255.250.0 - 103.255.250.255 sg +103.255.251.0 - 103.255.251.255 au +103.255.252.0 - 103.255.255.255 hk +104.0.0.0 - 104.8.216.255 us +104.8.217.0 - 104.8.217.255 pl +104.8.218.0 - 104.36.7.255 us +104.36.8.0 - 104.36.15.255 ca +104.36.16.0 - 104.36.99.255 us +104.36.100.0 - 104.36.103.255 ca +104.36.104.0 - 104.36.115.255 us +104.36.116.0 - 104.36.119.255 ca +104.36.120.0 - 104.36.147.255 us +104.36.148.0 - 104.36.151.255 ca +104.36.152.0 - 104.36.179.255 us +104.36.180.0 - 104.36.183.255 ca +104.36.184.0 - 104.37.1.255 us +104.37.2.0 - 104.37.2.255 cn +104.37.3.0 - 104.37.3.255 us +104.37.4.0 - 104.37.4.255 ie +104.37.5.0 - 104.37.5.255 au +104.37.6.0 - 104.37.6.255 ae +104.37.7.0 - 104.37.7.255 in +104.37.8.0 - 104.37.19.255 us +104.37.20.0 - 104.37.23.255 ca +104.37.24.0 - 104.37.59.255 us +104.37.60.0 - 104.37.67.255 ca +104.37.68.0 - 104.37.71.255 us +104.37.72.0 - 104.37.75.255 ca +104.37.76.0 - 104.37.79.255 us +104.37.80.0 - 104.37.83.255 ca +104.37.84.0 - 104.37.111.255 us +104.37.112.0 - 104.37.115.255 ca +104.37.116.0 - 104.37.147.255 us +104.37.148.0 - 104.37.151.255 ca +104.37.152.0 - 104.37.191.255 us +104.37.192.0 - 104.37.207.255 ca +104.37.208.0 - 104.37.239.255 us +104.37.240.0 - 104.37.243.255 ca +104.37.244.0 - 104.40.127.255 us +104.40.128.0 - 104.40.188.191 nl +104.40.188.192 - 104.40.188.192 ie +104.40.188.193 - 104.40.255.255 nl +104.41.0.0 - 104.41.63.255 br +104.41.64.0 - 104.41.127.255 ie +104.41.128.0 - 104.41.159.255 us +104.41.160.0 - 104.41.191.255 jp +104.41.192.0 - 104.41.255.255 ie +104.42.0.0 - 104.42.255.255 us +104.43.0.0 - 104.43.127.255 sg +104.43.128.0 - 104.44.96.255 us +104.44.97.0 - 104.44.97.255 sg +104.44.98.0 - 104.44.102.255 us +104.44.103.0 - 104.44.103.255 au +104.44.104.0 - 104.44.104.255 jp +104.44.105.0 - 104.44.106.31 us +104.44.106.32 - 104.44.106.95 in +104.44.106.96 - 104.44.106.127 us +104.44.106.128 - 104.44.106.159 at +104.44.106.160 - 104.44.106.191 us +104.44.106.192 - 104.44.106.223 nl +104.44.106.224 - 104.44.106.255 br +104.44.107.0 - 104.44.107.31 au +104.44.107.32 - 104.44.107.79 us +104.44.107.80 - 104.44.107.111 in +104.44.107.112 - 104.44.108.191 us +104.44.108.192 - 104.44.108.223 cl +104.44.108.224 - 104.44.114.255 us +104.44.115.0 - 104.44.115.255 nl +104.44.116.0 - 104.44.116.255 ie +104.44.117.0 - 104.44.119.255 us +104.44.120.0 - 104.44.127.255 sg +104.44.128.0 - 104.44.193.63 us +104.44.193.64 - 104.44.193.127 nl +104.44.193.128 - 104.44.193.223 us +104.44.193.224 - 104.44.193.255 au +104.44.194.0 - 104.44.194.127 hk +104.44.194.128 - 104.44.202.223 us +104.44.202.224 - 104.44.202.255 ca +104.44.203.0 - 104.44.203.135 us +104.44.203.136 - 104.44.203.143 ie +104.44.203.144 - 104.44.203.151 hk +104.44.203.152 - 104.44.203.191 us +104.44.203.192 - 104.44.203.255 hk +104.44.204.0 - 104.44.208.159 us +104.44.208.160 - 104.44.208.191 hk +104.44.208.192 - 104.44.208.255 us +104.44.209.0 - 104.44.209.63 hk +104.44.209.64 - 104.44.210.63 us +104.44.210.64 - 104.44.210.79 ie +104.44.210.80 - 104.44.210.95 au +104.44.210.96 - 104.44.210.111 jp +104.44.210.112 - 104.44.210.127 au +104.44.210.128 - 104.44.210.143 jp +104.44.210.144 - 104.44.219.127 us +104.44.219.128 - 104.44.219.255 in +104.44.220.0 - 104.44.220.255 us +104.44.221.0 - 104.44.221.31 jp +104.44.221.32 - 104.44.221.63 sg +104.44.221.64 - 104.44.221.95 jp +104.44.221.96 - 104.44.221.127 ie +104.44.221.128 - 104.44.221.191 at +104.44.221.192 - 104.44.222.63 us +104.44.222.64 - 104.44.222.127 se +104.44.222.128 - 104.44.222.255 au +104.44.223.0 - 104.44.248.143 us +104.44.248.144 - 104.44.248.207 ca +104.44.248.208 - 104.44.253.255 us +104.44.254.0 - 104.44.254.63 in +104.44.254.64 - 104.44.254.127 sg +104.44.254.128 - 104.44.255.255 us +104.45.0.0 - 104.45.79.255 nl +104.45.80.0 - 104.45.127.255 ie +104.45.128.0 - 104.46.7.255 us +104.46.8.0 - 104.46.15.255 ie +104.46.16.0 - 104.46.23.255 nl +104.46.24.0 - 104.46.27.255 hk +104.46.28.0 - 104.46.31.255 au +104.46.32.0 - 104.46.63.255 nl +104.46.64.0 - 104.46.95.255 ie +104.46.96.0 - 104.46.127.255 us +104.46.128.0 - 104.46.159.255 sg +104.46.160.0 - 104.46.191.255 hk +104.46.192.0 - 104.46.207.255 us +104.46.208.0 - 104.46.239.255 jp +104.46.240.0 - 104.46.255.255 au +104.47.0.0 - 104.47.121.255 us +104.47.122.0 - 104.47.122.255 my +104.47.123.0 - 104.47.127.255 us +104.47.128.0 - 104.47.191.255 nl +104.47.192.0 - 104.47.209.255 us +104.47.210.0 - 104.47.215.255 in +104.47.216.0 - 104.47.217.255 us +104.47.218.0 - 104.47.219.255 ie +104.47.220.0 - 104.64.143.255 us +104.64.144.0 - 104.64.175.255 nl +104.64.176.0 - 104.65.15.255 us +104.65.16.0 - 104.65.31.255 nl +104.65.32.0 - 104.66.63.255 us +104.66.64.0 - 104.66.127.255 nl +104.66.128.0 - 104.66.159.255 us +104.66.160.0 - 104.66.191.255 nl +104.66.192.0 - 104.66.223.255 us +104.66.224.0 - 104.67.63.255 nl +104.67.64.0 - 104.68.159.255 us +104.68.160.0 - 104.68.223.255 nl +104.68.224.0 - 104.69.47.255 us +104.69.48.0 - 104.69.143.255 nl +104.69.144.0 - 104.69.175.255 us +104.69.176.0 - 104.69.211.255 nl +104.69.212.0 - 104.69.239.255 us +104.69.240.0 - 104.70.15.255 nl +104.70.16.0 - 104.70.123.255 us +104.70.124.0 - 104.70.125.255 nl +104.70.126.0 - 104.70.229.255 us +104.70.230.0 - 104.71.49.255 nl +104.71.50.0 - 104.71.55.255 us +104.71.56.0 - 104.71.61.255 nl +104.71.62.0 - 104.71.95.255 us +104.71.96.0 - 104.71.127.255 nl +104.71.128.0 - 104.71.129.255 us +104.71.130.0 - 104.71.130.255 nl +104.71.131.0 - 104.71.131.255 us +104.71.132.0 - 104.71.135.255 nl +104.71.136.0 - 104.71.141.255 us +104.71.142.0 - 104.71.143.255 nl +104.71.144.0 - 104.71.175.255 us +104.71.176.0 - 104.71.217.255 nl +104.71.218.0 - 104.71.223.255 us +104.71.224.0 - 104.71.255.255 nl +104.72.0.0 - 104.72.147.255 us +104.72.148.0 - 104.72.153.255 nl +104.72.154.0 - 104.72.159.255 us +104.72.160.0 - 104.72.191.255 nl +104.72.192.0 - 104.74.19.255 us +104.74.20.0 - 104.74.25.255 nl +104.74.26.0 - 104.74.63.255 us +104.74.64.0 - 104.74.69.255 nl +104.74.70.0 - 104.74.71.255 us +104.74.72.0 - 104.74.147.255 nl +104.74.148.0 - 104.75.13.255 us +104.75.14.0 - 104.75.15.255 nl +104.75.16.0 - 104.75.47.255 us +104.75.48.0 - 104.75.83.255 nl +104.75.84.0 - 104.75.85.255 us +104.75.86.0 - 104.75.91.255 nl +104.75.92.0 - 104.75.95.255 us +104.75.96.0 - 104.75.127.255 nl +104.75.128.0 - 104.76.21.255 us +104.76.22.0 - 104.76.27.255 nl +104.76.28.0 - 104.76.31.255 us +104.76.32.0 - 104.76.63.255 nl +104.76.64.0 - 104.76.103.255 us +104.76.104.0 - 104.76.107.255 nl +104.76.108.0 - 104.76.198.255 us +104.76.199.0 - 104.76.199.255 nl +104.76.200.0 - 104.76.203.255 us +104.76.204.0 - 104.76.204.255 nl +104.76.205.0 - 104.76.214.255 us +104.76.215.0 - 104.76.215.255 nl +104.76.216.0 - 104.76.218.255 us +104.76.219.0 - 104.76.219.255 nl +104.76.220.0 - 104.76.221.255 us +104.76.222.0 - 104.76.222.255 nl +104.76.223.0 - 104.80.25.255 us +104.80.26.0 - 104.80.31.255 nl +104.80.32.0 - 104.80.63.255 us +104.80.64.0 - 104.80.127.255 nl +104.80.128.0 - 104.82.143.255 us +104.82.144.0 - 104.82.187.255 nl +104.82.188.0 - 104.82.191.255 us +104.82.192.0 - 104.82.223.255 nl +104.82.224.0 - 104.83.3.255 us +104.83.4.0 - 104.83.81.255 nl +104.83.82.0 - 104.83.87.255 us +104.83.88.0 - 104.83.95.255 nl +104.83.96.0 - 104.83.127.255 us +104.83.128.0 - 104.83.201.255 nl +104.83.202.0 - 104.83.207.255 us +104.83.208.0 - 104.83.239.255 nl +104.83.240.0 - 104.84.143.255 us +104.84.144.0 - 104.84.147.255 nl +104.84.148.0 - 104.84.151.255 us +104.84.152.0 - 104.84.153.255 nl +104.84.154.0 - 104.86.109.255 us +104.86.110.0 - 104.86.111.255 nl +104.86.112.0 - 104.86.189.255 us +104.86.190.0 - 104.86.191.255 nl +104.86.192.0 - 104.86.223.255 us +104.86.224.0 - 104.87.3.255 nl +104.87.4.0 - 104.87.191.255 us +104.87.192.0 - 104.87.255.255 nl +104.88.0.0 - 104.89.163.255 us +104.89.164.0 - 104.89.239.255 nl +104.89.240.0 - 104.101.219.255 us +104.101.220.0 - 104.101.220.255 in +104.101.221.0 - 104.101.221.255 hk +104.101.222.0 - 104.128.127.255 us +104.128.128.0 - 104.128.128.255 mn +104.128.129.0 - 104.128.129.255 sy +104.128.130.0 - 104.128.130.255 by +104.128.131.0 - 104.128.131.255 pk +104.128.132.0 - 104.128.132.255 sd +104.128.133.0 - 104.128.133.255 lk +104.128.134.0 - 104.128.134.255 id +104.128.135.0 - 104.128.135.255 lb +104.128.136.0 - 104.128.136.255 om +104.128.137.0 - 104.128.137.255 mt +104.128.138.0 - 104.128.138.255 mk +104.128.139.0 - 104.128.139.255 my +104.128.140.0 - 104.128.140.255 al +104.128.141.0 - 104.128.141.255 np +104.128.142.0 - 104.128.142.255 dz +104.128.143.0 - 104.128.143.255 kz +104.128.144.0 - 104.128.159.255 ca +104.128.160.0 - 104.128.239.255 us +104.128.240.0 - 104.128.255.255 ca +104.129.0.0 - 104.129.95.255 us +104.129.96.0 - 104.129.127.255 ca +104.129.128.0 - 104.129.223.255 us +104.129.224.0 - 104.129.239.255 ca +104.129.240.0 - 104.132.7.255 us +104.132.8.0 - 104.132.8.255 ie +104.132.9.0 - 104.132.9.255 il +104.132.10.0 - 104.132.13.63 us +104.132.13.64 - 104.132.13.111 br +104.132.13.112 - 104.132.16.255 us +104.132.17.0 - 104.132.17.255 gh +104.132.18.0 - 104.132.19.255 us +104.132.20.0 - 104.132.20.255 in +104.132.21.0 - 104.132.23.255 us +104.132.24.0 - 104.132.24.255 ch +104.132.25.0 - 104.132.31.255 us +104.132.32.0 - 104.132.32.255 gb +104.132.33.0 - 104.132.34.255 us +104.132.35.0 - 104.132.35.255 au +104.132.36.0 - 104.132.36.255 il +104.132.37.0 - 104.132.51.255 us +104.132.52.0 - 104.132.52.255 il +104.132.53.0 - 104.132.137.255 us +104.132.138.0 - 104.132.138.255 es +104.132.139.0 - 104.132.141.255 us +104.132.142.0 - 104.132.142.255 no +104.132.143.0 - 104.132.160.255 us +104.132.161.0 - 104.132.161.255 fr +104.132.162.0 - 104.132.174.255 us +104.132.175.0 - 104.132.175.255 de +104.132.176.0 - 104.132.178.255 us +104.132.179.0 - 104.132.179.255 nl +104.132.180.0 - 104.132.186.255 us +104.132.187.0 - 104.132.187.255 nz +104.132.188.0 - 104.133.0.255 us +104.133.1.0 - 104.133.1.255 de +104.133.2.0 - 104.135.223.255 us +104.135.224.0 - 104.135.255.255 ie +104.136.0.0 - 104.141.255.255 us +104.142.0.0 - 104.142.127.255 ca +104.142.128.0 - 104.143.17.255 us +104.143.18.0 - 104.143.18.255 gw +104.143.19.0 - 104.143.19.255 rw +104.143.20.0 - 104.143.20.255 ga +104.143.21.0 - 104.143.21.255 ki +104.143.22.0 - 104.143.22.255 mm +104.143.23.0 - 104.143.23.255 vu +104.143.24.0 - 104.143.24.70 na +104.143.24.71 - 104.143.24.71 ao +104.143.24.72 - 104.143.24.97 na +104.143.24.98 - 104.143.24.98 ao +104.143.24.99 - 104.143.24.255 na +104.143.25.0 - 104.143.25.255 dj +104.143.26.0 - 104.143.26.255 bf +104.143.27.0 - 104.143.27.255 bw +104.143.28.0 - 104.143.28.255 pw +104.143.29.0 - 104.143.29.255 br +104.143.30.0 - 104.143.30.255 ar +104.143.31.0 - 104.143.31.255 bj +104.143.32.0 - 104.143.83.255 us +104.143.84.0 - 104.143.84.7 mx +104.143.84.8 - 104.143.84.15 au +104.143.84.16 - 104.143.192.255 us +104.143.193.0 - 104.143.193.255 ly +104.143.194.0 - 104.143.194.255 us +104.143.195.0 - 104.143.195.255 mr +104.143.196.0 - 104.143.196.255 us +104.143.197.0 - 104.143.197.255 mz +104.143.198.0 - 104.143.198.255 us +104.143.199.0 - 104.143.199.255 gn +104.143.200.0 - 104.143.200.255 us +104.143.201.0 - 104.143.201.255 ml +104.143.202.0 - 104.143.202.255 us +104.143.203.0 - 104.143.203.255 so +104.143.204.0 - 104.143.204.255 cd +104.143.205.0 - 104.143.205.255 us +104.143.206.0 - 104.143.206.255 ve +104.143.207.0 - 104.143.207.255 us +104.143.208.0 - 104.143.208.255 ec +104.143.209.0 - 104.143.209.255 us +104.143.210.0 - 104.143.210.255 py +104.143.211.0 - 104.143.211.255 us +104.143.212.0 - 104.143.212.255 bo +104.143.213.0 - 104.143.213.255 us +104.143.214.0 - 104.143.214.255 uy +104.143.215.0 - 104.143.215.255 us +104.143.216.0 - 104.143.216.255 tz +104.143.217.0 - 104.143.217.255 us +104.143.218.0 - 104.143.218.255 td +104.143.219.0 - 104.143.219.255 us +104.143.220.0 - 104.143.220.255 mg +104.143.221.0 - 104.143.221.255 us +104.143.222.0 - 104.143.222.255 tn +104.143.223.0 - 104.144.255.255 us +104.145.0.0 - 104.145.15.255 ca +104.145.16.0 - 104.145.238.255 us +104.145.239.0 - 104.145.239.255 ca +104.145.240.0 - 104.146.15.255 us +104.146.16.0 - 104.146.16.63 nl +104.146.16.64 - 104.146.16.127 ie +104.146.16.128 - 104.146.17.63 nl +104.146.17.64 - 104.146.17.255 ie +104.146.18.0 - 104.146.18.191 nl +104.146.18.192 - 104.146.19.127 ie +104.146.19.128 - 104.146.19.191 hk +104.146.19.192 - 104.146.19.255 sg +104.146.20.0 - 104.146.22.63 nl +104.146.22.64 - 104.146.23.255 ie +104.146.24.0 - 104.146.27.255 us +104.146.28.0 - 104.146.28.15 nl +104.146.28.16 - 104.146.28.31 ie +104.146.28.32 - 104.146.28.63 nl +104.146.28.64 - 104.146.28.79 ie +104.146.28.80 - 104.146.28.95 hk +104.146.28.96 - 104.146.28.111 sg +104.146.28.112 - 104.146.28.143 nl +104.146.28.144 - 104.146.28.175 ie +104.146.28.176 - 104.146.29.255 us +104.146.30.0 - 104.146.30.127 ie +104.146.30.128 - 104.146.182.255 us +104.146.183.0 - 104.146.183.255 ca +104.146.184.0 - 104.146.192.255 us +104.146.193.0 - 104.146.193.255 ca +104.146.194.0 - 104.146.195.255 us +104.146.196.0 - 104.146.197.255 jp +104.146.198.0 - 104.146.199.255 sg +104.146.200.0 - 104.146.204.255 nl +104.146.205.0 - 104.146.212.255 us +104.146.213.0 - 104.146.213.255 br +104.146.214.0 - 104.146.216.255 ie +104.146.217.0 - 104.146.221.255 us +104.146.222.0 - 104.146.223.255 hk +104.146.224.0 - 104.146.227.255 us +104.146.228.0 - 104.146.228.255 sg +104.146.229.0 - 104.152.3.255 us +104.152.4.0 - 104.152.7.255 ca +104.152.8.0 - 104.152.27.255 us +104.152.28.0 - 104.152.31.255 ca +104.152.32.0 - 104.152.119.255 us +104.152.120.0 - 104.152.123.255 ca +104.152.124.0 - 104.152.151.255 us +104.152.152.0 - 104.152.155.255 ca +104.152.156.0 - 104.152.159.255 us +104.152.160.0 - 104.152.171.255 ca +104.152.172.0 - 104.152.190.167 us +104.152.190.168 - 104.152.190.175 ro +104.152.190.176 - 104.152.207.255 us +104.152.208.0 - 104.152.211.255 ca +104.152.212.0 - 104.152.223.255 us +104.152.224.0 - 104.152.227.255 ca +104.152.228.0 - 104.152.235.255 us +104.152.236.0 - 104.152.239.255 jm +104.152.240.0 - 104.153.23.255 us +104.153.24.0 - 104.153.27.255 ca +104.153.28.0 - 104.153.47.255 us +104.153.48.0 - 104.153.51.255 ca +104.153.52.0 - 104.153.55.255 us +104.153.56.0 - 104.153.59.255 ca +104.153.60.0 - 104.153.127.255 us +104.153.128.0 - 104.153.135.255 bb +104.153.136.0 - 104.153.143.255 ca +104.153.144.0 - 104.153.163.255 us +104.153.164.0 - 104.153.167.255 ca +104.153.168.0 - 104.153.211.255 us +104.153.212.0 - 104.153.215.255 ca +104.153.216.0 - 104.153.247.255 us +104.153.248.0 - 104.153.251.255 dm +104.153.252.0 - 104.156.31.255 us +104.156.32.0 - 104.156.47.255 ca +104.156.48.0 - 104.156.63.255 us +104.156.64.0 - 104.156.79.255 ca +104.156.80.0 - 104.156.192.255 us +104.156.193.0 - 104.156.193.255 mh +104.156.194.0 - 104.156.194.255 us +104.156.195.0 - 104.156.195.255 zm +104.156.196.0 - 104.156.196.255 us +104.156.197.0 - 104.156.197.255 ht +104.156.198.0 - 104.156.198.255 us +104.156.199.0 - 104.156.199.255 bb +104.156.200.0 - 104.156.202.255 us +104.156.203.0 - 104.156.203.255 sr +104.156.204.0 - 104.156.204.255 us +104.156.205.0 - 104.156.205.255 bz +104.156.206.0 - 104.156.206.255 us +104.156.207.0 - 104.156.207.255 mw +104.156.208.0 - 104.156.208.255 us +104.156.209.0 - 104.156.209.255 dm +104.156.210.0 - 104.156.210.255 us +104.156.211.0 - 104.156.211.255 ne +104.156.212.0 - 104.156.212.255 us +104.156.213.0 - 104.156.213.255 ag +104.156.214.0 - 104.156.214.255 us +104.156.215.0 - 104.156.215.255 tl +104.156.216.0 - 104.156.216.255 us +104.156.217.0 - 104.156.217.255 hn +104.156.218.0 - 104.156.218.255 us +104.156.219.0 - 104.156.219.255 sb +104.156.220.0 - 104.156.220.255 us +104.156.221.0 - 104.156.221.255 jo +104.156.222.0 - 104.156.222.255 us +104.156.223.0 - 104.156.223.255 sd +104.156.224.0 - 104.156.231.255 us +104.156.232.0 - 104.156.233.255 au +104.156.234.0 - 104.156.237.255 us +104.156.238.0 - 104.156.239.255 jp +104.156.240.0 - 104.156.255.255 us +104.157.0.0 - 104.159.127.255 ca +104.159.128.0 - 104.160.191.255 us +104.160.192.0 - 104.160.223.255 ca +104.160.224.0 - 104.162.255.255 us +104.163.0.0 - 104.163.255.255 ca +104.164.0.0 - 104.166.31.255 us +104.166.32.0 - 104.166.47.255 bs +104.166.48.0 - 104.166.96.255 us +104.166.97.0 - 104.166.97.255 lb +104.166.98.0 - 104.166.98.255 bs +104.166.99.0 - 104.166.100.255 us +104.166.101.0 - 104.166.101.255 ke +104.166.102.0 - 104.166.102.255 ma +104.166.103.0 - 104.166.103.255 cn +104.166.104.0 - 104.166.104.255 us +104.166.105.0 - 104.166.105.255 mx +104.166.106.0 - 104.166.106.255 aw +104.166.107.0 - 104.166.107.255 us +104.166.108.0 - 104.166.108.255 gh +104.166.109.0 - 104.166.109.255 in +104.166.110.0 - 104.166.110.255 mo +104.166.111.0 - 104.166.111.255 mt +104.166.112.0 - 104.166.112.255 qa +104.166.113.0 - 104.166.113.255 ye +104.166.114.0 - 104.166.114.255 gr +104.166.115.0 - 104.166.115.255 us +104.166.116.0 - 104.166.116.255 bh +104.166.117.0 - 104.166.117.255 co +104.166.118.0 - 104.166.118.255 om +104.166.119.0 - 104.166.119.255 bn +104.166.120.0 - 104.166.120.255 sc +104.166.121.0 - 104.166.121.255 sy +104.166.122.0 - 104.166.123.255 us +104.166.124.0 - 104.166.124.255 pa +104.166.125.0 - 104.166.125.255 bz +104.166.126.0 - 104.166.126.255 im +104.166.127.0 - 104.166.127.255 ng +104.166.128.0 - 104.167.95.255 us +104.167.96.0 - 104.167.127.255 ca +104.167.128.0 - 104.167.191.255 us +104.167.192.0 - 104.167.192.255 tv +104.167.193.0 - 104.167.193.255 sy +104.167.194.0 - 104.167.194.255 zw +104.167.195.0 - 104.167.195.255 us +104.167.196.0 - 104.167.196.255 gm +104.167.197.0 - 104.167.197.255 ao +104.167.198.0 - 104.167.198.255 lb +104.167.199.0 - 104.167.199.255 mw +104.167.200.0 - 104.167.200.255 cv +104.167.201.0 - 104.167.201.255 tz +104.167.202.0 - 104.167.202.255 km +104.167.203.0 - 104.167.203.255 mn +104.167.204.0 - 104.167.204.255 cg +104.167.205.0 - 104.167.205.255 fm +104.167.206.0 - 104.167.206.255 sb +104.167.207.0 - 104.167.207.255 bi +104.167.208.0 - 104.167.208.255 cd +104.167.209.0 - 104.167.209.255 ne +104.167.210.0 - 104.167.210.255 np +104.167.211.0 - 104.167.211.255 pk +104.167.212.0 - 104.167.212.255 kz +104.167.213.0 - 104.167.213.255 om +104.167.214.0 - 104.167.214.255 cn +104.167.215.0 - 104.167.215.255 st +104.167.216.0 - 104.167.216.255 lr +104.167.217.0 - 104.167.217.255 jp +104.167.218.0 - 104.167.218.255 sd +104.167.219.0 - 104.167.219.255 mu +104.167.220.0 - 104.167.220.255 gq +104.167.221.0 - 104.167.221.255 mk +104.167.222.0 - 104.167.222.255 tl +104.167.223.0 - 104.167.223.255 ml +104.167.224.0 - 104.167.224.255 dz +104.167.225.0 - 104.167.225.255 mm +104.167.226.0 - 104.167.226.255 nr +104.167.227.0 - 104.167.227.255 sa +104.167.228.0 - 104.167.228.255 in +104.167.229.0 - 104.167.229.255 by +104.167.230.0 - 104.167.230.255 sz +104.167.231.0 - 104.167.231.255 cn +104.167.232.0 - 104.167.232.255 tn +104.167.233.0 - 104.167.233.255 as +104.167.234.0 - 104.167.234.255 pg +104.167.235.0 - 104.167.235.255 pr +104.167.236.0 - 104.167.236.255 ba +104.167.237.0 - 104.167.237.255 us +104.167.238.0 - 104.167.238.255 gn +104.167.239.0 - 104.167.239.255 fj +104.167.240.0 - 104.167.240.255 mh +104.167.241.0 - 104.167.241.255 sl +104.167.242.0 - 104.167.242.255 lk +104.167.243.0 - 104.167.243.255 mg +104.167.244.0 - 104.167.244.255 me +104.167.245.0 - 104.167.245.255 mr +104.167.246.0 - 104.167.246.255 so +104.167.247.0 - 104.167.247.255 ua +104.167.248.0 - 104.167.248.255 ly +104.167.249.0 - 104.167.249.255 to +104.167.250.0 - 104.167.250.255 td +104.167.251.0 - 104.167.251.255 mz +104.167.252.0 - 104.167.252.255 zm +104.167.253.0 - 104.167.253.255 er +104.167.254.0 - 104.167.254.255 al +104.167.255.0 - 104.167.255.255 ru +104.168.0.0 - 104.171.47.255 us +104.171.48.0 - 104.171.63.255 ca +104.171.64.0 - 104.171.115.159 us +104.171.115.160 - 104.171.115.191 ro +104.171.115.192 - 104.171.119.79 us +104.171.119.80 - 104.171.119.87 ro +104.171.119.88 - 104.171.122.95 us +104.171.122.96 - 104.171.122.127 ro +104.171.122.128 - 104.171.126.63 us +104.171.126.64 - 104.171.126.95 ro +104.171.126.96 - 104.171.126.191 us +104.171.126.192 - 104.171.126.223 ro +104.171.126.224 - 104.171.127.63 us +104.171.127.64 - 104.171.127.95 ro +104.171.127.96 - 104.171.127.183 us +104.171.127.184 - 104.171.127.191 ro +104.171.127.192 - 104.171.191.255 us +104.171.192.0 - 104.171.207.255 ca +104.171.208.0 - 104.192.15.255 us +104.192.16.0 - 104.192.23.255 ca +104.192.24.0 - 104.192.43.255 us +104.192.44.0 - 104.192.47.255 ca +104.192.48.0 - 104.192.51.255 us +104.192.52.0 - 104.192.55.255 ca +104.192.56.0 - 104.192.115.255 us +104.192.116.0 - 104.192.127.255 ca +104.192.128.0 - 104.192.131.255 us +104.192.132.0 - 104.192.132.175 ca +104.192.132.176 - 104.192.132.176 us +104.192.132.177 - 104.192.135.255 ca +104.192.136.0 - 104.192.143.255 us +104.192.144.0 - 104.192.147.255 ca +104.192.148.0 - 104.192.151.255 us +104.192.152.0 - 104.192.155.255 ca +104.192.156.0 - 104.192.171.255 us +104.192.172.0 - 104.192.175.255 ca +104.192.176.0 - 104.192.183.255 us +104.192.184.0 - 104.192.191.255 vi +104.192.192.0 - 104.192.231.255 us +104.192.232.0 - 104.192.235.255 ca +104.192.236.0 - 104.193.31.255 us +104.193.32.0 - 104.193.39.255 ca +104.193.40.0 - 104.193.47.255 us +104.193.48.0 - 104.193.71.255 ca +104.193.72.0 - 104.193.91.255 us +104.193.92.0 - 104.193.95.255 ca +104.193.96.0 - 104.193.103.255 us +104.193.104.0 - 104.193.107.255 ca +104.193.108.0 - 104.193.131.255 us +104.193.132.0 - 104.193.135.255 ca +104.193.136.0 - 104.193.171.255 us +104.193.172.0 - 104.193.175.255 ca +104.193.176.0 - 104.193.195.255 us +104.193.196.0 - 104.193.199.255 ai +104.193.200.0 - 104.193.207.255 us +104.193.208.0 - 104.193.215.255 ca +104.193.216.0 - 104.193.251.127 us +104.193.251.128 - 104.193.251.159 au +104.193.251.160 - 104.194.31.255 us +104.194.32.0 - 104.194.63.255 ca +104.194.64.0 - 104.194.202.255 us +104.194.203.0 - 104.194.203.255 au +104.194.204.0 - 104.194.207.255 us +104.194.208.0 - 104.194.215.255 gb +104.194.216.0 - 104.195.127.255 us +104.195.128.0 - 104.195.255.255 ca +104.196.0.0 - 104.199.255.255 us +104.200.0.0 - 104.200.15.255 ca +104.200.16.0 - 104.200.77.255 us +104.200.78.0 - 104.200.78.255 nl +104.200.79.0 - 104.200.79.255 us +104.200.80.0 - 104.200.95.255 ca +104.200.96.0 - 104.200.111.255 bb +104.200.112.0 - 104.203.255.255 us +104.204.0.0 - 104.205.255.255 ca +104.206.0.0 - 104.207.63.255 us +104.207.64.0 - 104.207.64.255 bg +104.207.65.0 - 104.207.65.255 se +104.207.66.0 - 104.207.66.255 ps +104.207.67.0 - 104.207.69.255 us +104.207.70.0 - 104.207.70.255 lv +104.207.71.0 - 104.207.71.255 in +104.207.72.0 - 104.207.72.255 us +104.207.73.0 - 104.207.73.255 gb +104.207.74.0 - 104.207.74.255 fr +104.207.75.0 - 104.207.75.255 cy +104.207.76.0 - 104.207.76.255 it +104.207.77.0 - 104.207.77.255 us +104.207.78.0 - 104.207.78.255 cf +104.207.79.0 - 104.207.79.255 us +104.207.80.0 - 104.207.80.255 vc +104.207.81.0 - 104.207.81.255 id +104.207.82.0 - 104.207.82.255 cl +104.207.83.0 - 104.207.83.255 hk +104.207.84.0 - 104.207.84.255 de +104.207.85.0 - 104.207.85.255 us +104.207.86.0 - 104.207.86.255 cn +104.207.87.0 - 104.207.87.255 bl +104.207.88.0 - 104.207.88.255 us +104.207.89.0 - 104.207.89.255 cr +104.207.90.0 - 104.207.92.255 us +104.207.93.0 - 104.207.93.255 hu +104.207.94.0 - 104.207.94.255 ch +104.207.95.0 - 104.207.95.255 mm +104.207.96.0 - 104.207.129.255 us +104.207.130.0 - 104.207.131.255 de +104.207.132.0 - 104.208.63.255 us +104.208.64.0 - 104.208.127.255 hk +104.208.128.0 - 104.209.63.255 us +104.209.64.0 - 104.209.95.255 au +104.209.96.0 - 104.210.63.255 us +104.210.64.0 - 104.210.127.255 au +104.210.128.0 - 104.211.63.255 us +104.211.64.0 - 104.211.255.255 in +104.212.0.0 - 104.214.127.255 us +104.214.128.0 - 104.214.159.255 jp +104.214.160.0 - 104.214.191.255 hk +104.214.192.0 - 104.214.255.255 nl +104.215.0.0 - 104.215.63.255 jp +104.215.64.0 - 104.215.127.255 us +104.215.128.0 - 104.215.255.255 sg +104.216.0.0 - 104.218.43.255 us +104.218.44.0 - 104.218.47.255 ca +104.218.48.0 - 104.218.55.255 us +104.218.56.0 - 104.218.63.255 ca +104.218.64.0 - 104.218.83.255 us +104.218.84.0 - 104.218.87.255 ca +104.218.88.0 - 104.218.91.255 us +104.218.92.0 - 104.218.95.255 ca +104.218.96.0 - 104.218.123.255 us +104.218.124.0 - 104.218.127.255 ca +104.218.128.0 - 104.218.167.255 us +104.218.168.0 - 104.218.175.255 bm +104.218.176.0 - 104.218.179.255 bb +104.218.180.0 - 104.218.191.255 us +104.218.192.0 - 104.218.196.23 ca +104.218.196.24 - 104.218.215.255 us +104.218.216.0 - 104.218.219.255 vc +104.218.220.0 - 104.218.239.255 us +104.218.240.0 - 104.218.243.255 pr +104.218.244.0 - 104.219.6.255 us +104.219.7.0 - 104.219.7.255 au +104.219.8.0 - 104.219.15.255 ca +104.219.16.0 - 104.219.23.255 us +104.219.24.0 - 104.219.27.255 vc +104.219.28.0 - 104.219.31.255 pr +104.219.32.0 - 104.219.71.255 us +104.219.72.0 - 104.219.75.255 vg +104.219.76.0 - 104.219.99.255 us +104.219.100.0 - 104.219.103.255 ca +104.219.104.0 - 104.219.115.255 us +104.219.116.0 - 104.219.135.255 ca +104.219.136.0 - 104.219.155.255 us +104.219.156.0 - 104.219.159.255 ca +104.219.160.0 - 104.219.187.255 us +104.219.188.0 - 104.219.195.255 ca +104.219.196.0 - 104.219.199.255 us +104.219.200.0 - 104.219.207.255 ca +104.219.208.0 - 104.219.219.255 us +104.219.220.0 - 104.219.223.255 ca +104.219.224.0 - 104.220.255.255 us +104.221.0.0 - 104.221.127.255 ca +104.221.128.0 - 104.222.111.255 us +104.222.112.0 - 104.222.127.255 ca +104.222.128.0 - 104.222.130.255 us +104.222.131.0 - 104.222.131.255 au +104.222.132.0 - 104.222.135.255 us +104.222.136.0 - 104.222.136.255 se +104.222.137.0 - 104.222.139.255 us +104.222.140.0 - 104.222.140.255 sg +104.222.141.0 - 104.222.144.255 us +104.222.145.0 - 104.222.145.255 hk +104.222.146.0 - 104.222.148.255 us +104.222.149.0 - 104.222.149.255 fr +104.222.150.0 - 104.222.191.255 us +104.222.192.0 - 104.222.192.255 lb +104.222.193.0 - 104.222.193.255 us +104.222.194.0 - 104.222.194.255 lk +104.222.195.0 - 104.222.195.255 mo +104.222.196.0 - 104.222.196.255 cn +104.222.197.0 - 104.222.197.255 dk +104.222.198.0 - 104.222.198.255 qa +104.222.199.0 - 104.222.199.255 ba +104.222.200.0 - 104.222.200.255 ar +104.222.201.0 - 104.222.201.255 mx +104.222.202.0 - 104.222.202.255 aw +104.222.203.0 - 104.222.203.255 bz +104.222.204.0 - 104.222.204.255 bs +104.222.205.0 - 104.222.205.255 in +104.222.206.0 - 104.222.206.255 hr +104.222.207.0 - 104.222.207.255 om +104.222.208.0 - 104.222.208.255 pk +104.222.209.0 - 104.222.209.255 ps +104.222.210.0 - 104.222.210.255 sa +104.222.211.0 - 104.222.212.255 us +104.222.213.0 - 104.222.213.255 ma +104.222.214.0 - 104.222.214.255 de +104.222.215.0 - 104.222.215.255 jp +104.222.216.0 - 104.222.216.255 sy +104.222.217.0 - 104.222.217.255 us +104.222.218.0 - 104.222.218.255 hk +104.222.219.0 - 104.222.219.255 iq +104.222.220.0 - 104.222.220.255 ke +104.222.221.0 - 104.222.221.255 ae +104.222.222.0 - 104.223.255.255 us +104.224.0.0 - 104.224.0.255 ve +104.224.1.0 - 104.224.1.255 ag +104.224.2.0 - 104.224.2.255 gt +104.224.3.0 - 104.224.3.255 vc +104.224.4.0 - 104.224.4.255 py +104.224.5.0 - 104.224.5.255 jm +104.224.6.0 - 104.224.6.255 ms +104.224.7.0 - 104.224.7.255 gd +104.224.8.0 - 104.224.8.255 lc +104.224.9.0 - 104.224.9.255 ht +104.224.10.0 - 104.224.10.255 ec +104.224.11.0 - 104.224.11.255 kn +104.224.12.0 - 104.224.12.255 sr +104.224.13.0 - 104.224.13.255 ni +104.224.14.0 - 104.224.14.255 bb +104.224.15.0 - 104.224.15.255 pe +104.224.16.0 - 104.224.16.255 ky +104.224.17.0 - 104.224.17.255 tt +104.224.18.0 - 104.224.18.255 gy +104.224.19.0 - 104.224.19.255 bo +104.224.20.0 - 104.224.20.255 cu +104.224.21.0 - 104.224.21.255 dm +104.224.22.0 - 104.224.22.255 sh +104.224.23.0 - 104.224.23.255 bm +104.224.24.0 - 104.224.24.255 fj +104.224.25.0 - 104.224.25.255 hn +104.224.26.0 - 104.224.26.255 gl +104.224.27.0 - 104.224.27.255 mq +104.224.28.0 - 104.224.28.255 gf +104.224.29.0 - 104.224.29.255 mf +104.224.30.0 - 104.224.30.255 bz +104.224.31.0 - 104.224.31.255 gp +104.224.32.0 - 104.224.32.255 aw +104.224.33.0 - 104.224.33.255 ai +104.224.34.0 - 104.224.34.255 bl +104.224.35.0 - 104.224.35.255 co +104.224.36.0 - 104.224.36.255 tc +104.224.37.0 - 104.224.37.255 vg +104.224.38.0 - 104.224.38.255 wf +104.224.39.0 - 104.224.39.255 us +104.224.40.0 - 104.224.40.255 sv +104.224.41.0 - 104.224.41.255 tk +104.224.42.0 - 104.224.42.255 sj +104.224.43.0 - 104.224.43.255 pm +104.224.44.0 - 104.224.44.255 gs +104.224.45.0 - 104.224.45.255 do +104.224.46.0 - 104.224.46.255 re +104.224.47.0 - 104.224.47.255 pn +104.224.48.0 - 104.224.48.255 mp +104.224.49.0 - 104.224.49.255 nf +104.224.50.0 - 104.224.50.255 pr +104.224.51.0 - 104.224.51.255 nu +104.224.52.0 - 104.224.52.255 nc +104.224.53.0 - 104.224.53.255 nl +104.224.54.0 - 104.224.54.255 cx +104.224.55.0 - 104.224.55.255 bs +104.224.56.0 - 104.224.56.255 pf +104.224.57.0 - 104.224.57.255 ck +104.224.58.0 - 104.224.58.255 tf +104.224.59.0 - 104.224.59.255 fk +104.224.60.0 - 104.224.60.255 gg +104.224.61.0 - 104.224.61.255 cc +104.224.62.0 - 104.224.62.255 je +104.224.63.0 - 104.224.63.255 fo +104.224.64.0 - 104.224.95.255 us +104.224.96.0 - 104.224.127.255 ca +104.224.128.0 - 104.224.143.255 us +104.224.144.0 - 104.224.147.255 nl +104.224.148.0 - 104.232.47.255 us +104.232.48.0 - 104.232.63.255 ca +104.232.64.0 - 104.232.191.255 us +104.232.192.0 - 104.232.199.255 se +104.232.200.0 - 104.232.207.255 gb +104.232.208.0 - 104.233.63.255 us +104.233.64.0 - 104.233.127.255 ca +104.233.128.0 - 104.233.255.255 us +104.234.0.0 - 104.234.255.255 ca +104.235.0.0 - 104.237.82.255 us +104.237.83.0 - 104.237.83.255 mo +104.237.84.0 - 104.237.84.255 gb +104.237.85.0 - 104.237.85.255 bz +104.237.86.0 - 104.237.86.255 us +104.237.87.0 - 104.237.87.255 ke +104.237.88.0 - 104.237.88.255 us +104.237.89.0 - 104.237.89.255 sg +104.237.90.0 - 104.237.90.255 us +104.237.91.0 - 104.237.91.255 hk +104.237.92.0 - 104.237.92.255 us +104.237.93.0 - 104.237.93.255 gb +104.237.94.0 - 104.237.94.255 us +104.237.95.0 - 104.237.95.255 hk +104.237.96.0 - 104.238.49.255 us +104.238.50.0 - 104.238.51.255 au +104.238.52.0 - 104.238.59.255 us +104.238.60.0 - 104.238.63.255 de +104.238.64.0 - 104.238.147.255 us +104.238.148.0 - 104.238.151.255 jp +104.238.152.0 - 104.238.157.255 us +104.238.158.0 - 104.238.159.255 de +104.238.160.0 - 104.238.161.255 jp +104.238.162.0 - 104.238.165.255 us +104.238.166.0 - 104.238.167.255 de +104.238.168.0 - 104.238.175.255 gb +104.238.176.0 - 104.238.177.255 de +104.238.178.0 - 104.238.183.255 us +104.238.184.0 - 104.238.187.255 gb +104.238.188.0 - 104.238.191.255 fr +104.238.192.0 - 104.241.127.255 us +104.241.128.0 - 104.241.207.255 ca +104.241.208.0 - 104.241.255.255 us +104.242.0.0 - 104.242.255.255 ca +104.243.0.0 - 104.243.79.255 us +104.243.80.0 - 104.243.111.255 ca +104.243.112.0 - 104.243.240.255 us +104.243.241.0 - 104.243.241.255 bz +104.243.242.0 - 104.243.242.255 bs +104.243.243.0 - 104.243.243.255 pa +104.243.244.0 - 104.243.244.255 ar +104.243.245.0 - 104.243.245.255 mx +104.243.246.0 - 104.243.246.255 aw +104.243.247.0 - 104.243.247.255 se +104.243.248.0 - 104.243.248.255 es +104.243.249.0 - 104.243.249.255 gb +104.243.250.0 - 104.243.250.255 ma +104.243.251.0 - 104.243.251.255 hk +104.243.252.0 - 104.243.252.255 jp +104.243.253.0 - 104.243.253.255 ca +104.243.254.0 - 104.244.63.255 us +104.244.64.0 - 104.244.71.255 ca +104.244.72.0 - 104.244.74.187 us +104.244.74.188 - 104.244.74.188 lu +104.244.74.189 - 104.244.179.255 us +104.244.180.0 - 104.244.183.255 pr +104.244.184.0 - 104.244.187.255 us +104.244.188.0 - 104.244.191.255 ca +104.244.192.0 - 104.244.195.255 us +104.244.196.0 - 104.244.199.255 ca +104.244.200.0 - 104.244.223.255 us +104.244.224.0 - 104.244.231.255 jm +104.244.232.0 - 104.244.243.255 us +104.244.244.0 - 104.244.247.255 ca +104.244.248.0 - 104.244.255.255 us +104.245.0.0 - 104.245.7.255 ca +104.245.8.0 - 104.245.8.255 us +104.245.9.0 - 104.245.9.255 jp +104.245.10.0 - 104.245.10.255 gb +104.245.11.0 - 104.245.14.255 us +104.245.15.0 - 104.245.15.255 sg +104.245.16.0 - 104.245.36.255 us +104.245.37.0 - 104.245.37.255 ca +104.245.38.0 - 104.245.47.255 us +104.245.48.0 - 104.245.51.255 gd +104.245.52.0 - 104.245.63.255 us +104.245.64.0 - 104.245.67.255 ca +104.245.68.0 - 104.245.87.255 us +104.245.88.0 - 104.245.91.255 vg +104.245.92.0 - 104.245.95.255 gd +104.245.96.0 - 104.245.111.255 us +104.245.112.0 - 104.245.119.255 mq +104.245.120.0 - 104.245.143.255 us +104.245.144.0 - 104.245.147.255 ca +104.245.148.0 - 104.245.151.255 us +104.245.152.0 - 104.245.167.255 ca +104.245.168.0 - 104.245.199.255 us +104.245.200.0 - 104.245.203.255 ca +104.245.204.0 - 104.245.207.255 dm +104.245.208.0 - 104.245.223.255 us +104.245.224.0 - 104.245.227.255 ca +104.245.228.0 - 104.246.127.255 us +104.246.128.0 - 104.246.255.255 ca +104.247.0.0 - 104.247.6.255 us +104.247.7.0 - 104.247.7.255 ve +104.247.8.0 - 104.247.20.255 us +104.247.21.0 - 104.247.21.255 jp +104.247.22.0 - 104.247.100.255 us +104.247.101.0 - 104.247.101.255 ph +104.247.102.0 - 104.247.103.255 us +104.247.104.0 - 104.247.104.255 au +104.247.105.0 - 104.247.111.255 us +104.247.112.0 - 104.247.112.255 jp +104.247.113.0 - 104.247.117.255 us +104.247.118.0 - 104.247.118.255 in +104.247.119.0 - 104.247.223.255 us +104.247.224.0 - 104.247.255.255 ca +104.248.0.0 - 104.249.127.255 us +104.249.128.0 - 104.249.128.255 mx +104.249.129.0 - 104.249.135.255 us +104.249.136.0 - 104.249.136.255 au +104.249.137.0 - 104.249.140.255 us +104.249.141.0 - 104.249.141.255 ru +104.249.142.0 - 104.249.142.255 us +104.249.143.0 - 104.249.143.255 ae +104.249.144.0 - 104.249.144.255 mx +104.249.145.0 - 104.249.145.255 us +104.249.146.0 - 104.249.146.255 de +104.249.147.0 - 104.249.147.255 us +104.249.148.0 - 104.249.148.255 mx +104.249.149.0 - 104.249.149.255 us +104.249.150.0 - 104.249.150.255 pk +104.249.151.0 - 104.249.152.255 us +104.249.153.0 - 104.249.153.255 ru +104.249.154.0 - 104.249.158.255 us +104.249.159.0 - 104.249.159.255 de +104.249.160.0 - 104.249.160.255 jp +104.249.161.0 - 104.249.166.255 us +104.249.167.0 - 104.249.167.255 mx +104.249.168.0 - 104.249.170.255 us +104.249.171.0 - 104.249.171.255 au +104.249.172.0 - 104.249.174.255 us +104.249.175.0 - 104.249.175.255 de +104.249.176.0 - 104.249.176.255 us +104.249.177.0 - 104.249.177.255 ph +104.249.178.0 - 104.249.178.255 hk +104.249.179.0 - 104.249.179.255 us +104.249.180.0 - 104.249.180.255 hk +104.249.181.0 - 104.249.191.255 us +104.249.192.0 - 104.249.255.255 ca +104.250.0.0 - 104.250.31.255 gp +104.250.32.0 - 104.250.63.255 us +104.250.64.0 - 104.250.95.255 ca +104.250.96.0 - 104.250.159.255 us +104.250.160.0 - 104.250.160.255 cn +104.250.161.0 - 104.250.161.255 nz +104.250.162.0 - 104.250.162.255 dk +104.250.163.0 - 104.250.163.255 hr +104.250.164.0 - 104.250.164.255 li +104.250.165.0 - 104.250.165.255 me +104.250.166.0 - 104.250.166.255 am +104.250.167.0 - 104.250.167.255 ge +104.250.168.0 - 104.250.168.255 mc +104.250.169.0 - 104.250.169.255 ba +104.250.170.0 - 104.250.170.255 rs +104.250.171.0 - 104.250.171.255 si +104.250.172.0 - 104.250.172.255 it +104.250.173.0 - 104.250.173.255 lu +104.250.174.0 - 104.250.174.255 pt +104.250.175.0 - 104.250.175.255 fr +104.250.176.0 - 104.250.176.255 kh +104.250.177.0 - 104.250.177.255 az +104.250.178.0 - 104.250.178.255 et +104.250.179.0 - 104.250.179.255 us +104.250.180.0 - 104.250.180.255 ec +104.250.181.0 - 104.250.181.255 mu +104.250.182.0 - 104.250.182.255 jm +104.250.183.0 - 104.250.183.255 pr +104.250.184.0 - 104.250.184.255 vg +104.250.185.0 - 104.250.185.255 sg +104.250.186.0 - 104.250.186.255 in +104.250.187.0 - 104.250.187.255 pk +104.250.188.0 - 104.250.188.255 us +104.250.189.0 - 104.250.189.255 ru +104.250.190.0 - 104.250.228.255 us +104.250.229.0 - 104.250.229.255 ph +104.250.230.0 - 104.250.230.255 us +104.250.231.0 - 104.250.231.255 au +104.250.232.0 - 104.250.237.255 us +104.250.238.0 - 104.250.238.255 jp +104.250.239.0 - 104.251.31.255 us +104.251.32.0 - 104.251.47.255 ca +104.251.48.0 - 104.251.85.255 us +104.251.86.0 - 104.251.86.255 ca +104.251.87.0 - 104.251.87.255 us +104.251.88.0 - 104.251.88.255 ca +104.251.89.0 - 104.251.95.255 us +104.251.96.0 - 104.251.111.255 ca +104.251.112.0 - 104.251.189.255 us +104.251.190.0 - 104.251.190.255 au +104.251.191.0 - 104.254.7.255 us +104.254.8.0 - 104.254.11.255 ca +104.254.12.0 - 104.254.31.255 us +104.254.32.0 - 104.254.35.255 ca +104.254.36.0 - 104.254.47.255 us +104.254.48.0 - 104.254.51.255 ca +104.254.52.0 - 104.254.87.255 us +104.254.88.0 - 104.254.95.255 ca +104.254.96.0 - 104.254.99.255 vg +104.254.100.0 - 104.254.121.31 us +104.254.121.32 - 104.254.121.127 gb +104.254.121.128 - 104.254.151.255 us +104.254.152.0 - 104.254.159.255 ca +104.254.160.0 - 104.254.167.255 us +104.254.168.0 - 104.254.175.255 pr +104.254.176.0 - 104.254.179.255 us +104.254.180.0 - 104.254.183.255 ca +104.254.184.0 - 104.254.195.255 us +104.254.196.0 - 104.254.199.255 ca +104.254.200.0 - 104.255.7.255 us +104.255.8.0 - 104.255.15.255 ca +104.255.16.0 - 104.255.47.255 us +104.255.48.0 - 104.255.51.255 ca +104.255.52.0 - 104.255.151.255 us +104.255.152.0 - 104.255.159.255 ca +104.255.160.0 - 104.255.175.255 us +104.255.176.0 - 104.255.179.255 ai +104.255.180.0 - 104.255.183.255 pr +104.255.184.0 - 104.255.207.255 us +104.255.208.0 - 104.255.211.255 ca +104.255.212.0 - 104.255.231.255 us +104.255.232.0 - 104.255.235.255 vc +104.255.236.0 - 104.255.251.255 us +104.255.252.0 - 104.255.255.255 vc +105.0.0.0 - 105.15.255.255 za +105.16.0.0 - 105.16.15.255 mu +105.16.16.0 - 105.16.19.255 ke +105.16.20.0 - 105.16.21.255 mu +105.16.22.0 - 105.16.23.255 tz +105.16.24.0 - 105.16.25.255 mz +105.16.26.0 - 105.16.31.255 za +105.16.32.0 - 105.16.33.255 fr +105.16.34.0 - 105.16.35.255 gb +105.16.36.0 - 105.16.92.255 mu +105.16.93.0 - 105.16.94.255 nl +105.16.95.0 - 105.16.96.255 se +105.16.97.0 - 105.16.98.255 de +105.16.99.0 - 105.16.111.255 mu +105.16.112.0 - 105.16.127.255 ke +105.16.128.0 - 105.16.135.255 dj +105.16.136.0 - 105.16.143.255 tz +105.16.144.0 - 105.16.151.255 mz +105.16.152.0 - 105.16.175.255 za +105.16.176.0 - 105.16.183.255 fr +105.16.184.0 - 105.16.191.255 gb +105.16.192.0 - 105.17.183.255 mu +105.17.184.0 - 105.17.191.255 de +105.17.192.0 - 105.17.239.255 mu +105.17.240.0 - 105.18.15.255 ke +105.18.16.0 - 105.18.31.255 dj +105.18.32.0 - 105.18.47.255 tz +105.18.48.0 - 105.18.63.255 mz +105.18.64.0 - 105.18.111.255 za +105.18.112.0 - 105.18.127.255 fr +105.18.128.0 - 105.20.95.255 mu +105.20.96.0 - 105.20.111.255 nl +105.20.112.0 - 105.20.127.255 se +105.20.128.0 - 105.20.143.255 de +105.20.144.0 - 105.20.255.255 mu +105.21.0.0 - 105.21.63.255 ke +105.21.64.0 - 105.21.95.255 ug +105.21.96.0 - 105.21.127.255 rw +105.21.128.0 - 105.21.159.255 dj +105.21.160.0 - 105.21.223.255 tz +105.21.224.0 - 105.21.255.255 mz +105.22.0.0 - 105.22.95.255 za +105.22.96.0 - 105.22.127.255 fr +105.22.128.0 - 105.22.159.255 gb +105.22.160.0 - 105.25.95.255 mu +105.25.96.0 - 105.25.127.255 us +105.25.128.0 - 105.26.31.255 mu +105.26.32.0 - 105.26.63.255 in +105.26.64.0 - 105.26.95.255 nl +105.26.96.0 - 105.26.127.255 se +105.26.128.0 - 105.26.129.255 ug +105.26.130.0 - 105.26.159.255 de +105.26.160.0 - 105.27.31.255 mu +105.27.32.0 - 105.27.63.255 ae +105.27.64.0 - 105.27.95.255 gb +105.27.96.0 - 105.27.97.255 mu +105.27.98.0 - 105.27.99.255 ke +105.27.100.0 - 105.27.113.255 mu +105.27.114.0 - 105.27.115.255 za +105.27.116.0 - 105.27.199.255 mu +105.27.200.0 - 105.27.203.255 za +105.27.204.0 - 105.27.207.255 mu +105.27.208.0 - 105.27.239.255 ke +105.27.240.0 - 105.27.255.255 ug +105.28.0.0 - 105.28.15.255 rw +105.28.16.0 - 105.28.31.255 dj +105.28.32.0 - 105.28.63.255 tz +105.28.64.0 - 105.28.79.255 mz +105.28.80.0 - 105.28.127.255 za +105.28.128.0 - 105.28.143.255 fr +105.28.144.0 - 105.28.159.255 gb +105.28.160.0 - 105.29.255.255 mu +105.30.0.0 - 105.30.15.255 us +105.30.16.0 - 105.30.95.255 mu +105.30.96.0 - 105.30.111.255 in +105.30.112.0 - 105.30.127.255 nl +105.30.128.0 - 105.30.143.255 mu +105.30.144.0 - 105.30.159.255 de +105.30.160.0 - 105.30.223.255 mu +105.30.224.0 - 105.30.239.255 ae +105.30.240.0 - 105.31.71.255 mu +105.31.72.0 - 105.31.79.255 za +105.31.80.0 - 105.31.87.255 mu +105.31.88.0 - 105.31.95.255 fr +105.31.96.0 - 105.31.199.255 mu +105.31.200.0 - 105.31.207.255 za +105.31.208.0 - 105.31.215.255 mu +105.31.216.0 - 105.31.223.255 fr +105.31.224.0 - 105.31.255.255 mu +105.32.0.0 - 105.47.255.255 eg +105.48.0.0 - 105.63.255.255 ke +105.64.0.0 - 105.79.255.255 ma +105.80.0.0 - 105.95.255.255 eg +105.96.0.0 - 105.111.255.255 dz +105.112.0.0 - 105.127.255.255 ng 105.128.0.0 - 105.159.255.255 ma +105.160.0.0 - 105.167.255.255 ke +105.168.0.0 - 105.175.255.255 ao +105.176.0.0 - 105.177.255.255 za +105.178.0.0 - 105.179.255.255 rw +105.180.0.0 - 105.183.255.255 eg +105.184.0.0 - 105.187.255.255 za +105.188.0.0 - 105.191.255.255 ma +105.192.0.0 - 105.207.255.255 eg +105.208.0.0 - 105.229.255.255 za +105.230.0.0 - 105.231.255.255 ke +105.232.0.0 - 105.232.255.255 na +105.233.0.0 - 105.233.255.255 za +105.234.0.0 - 105.234.255.255 mw +105.235.0.0 - 105.235.127.255 ci +105.235.128.0 - 105.235.143.255 dz +105.235.144.0 - 105.235.159.255 mu +105.235.160.0 - 105.235.175.255 za +105.235.176.0 - 105.235.191.255 bf +105.235.192.0 - 105.235.207.255 ng +105.235.208.0 - 105.235.215.255 ss +105.235.216.0 - 105.235.223.255 mz +105.235.224.0 - 105.235.239.255 gq +105.235.240.0 - 105.235.255.255 bw +105.236.0.0 - 105.237.255.255 za +105.238.0.0 - 105.239.255.255 sd +105.240.0.0 - 105.255.255.255 za 106.0.0.0 - 106.0.0.255 cn 106.0.1.0 - 106.0.1.255 au 106.0.2.0 - 106.0.31.255 cn +106.0.32.0 - 106.0.43.255 in +106.0.44.0 - 106.0.47.255 cn +106.0.48.0 - 106.0.51.255 id +106.0.52.0 - 106.0.55.255 bd +106.0.56.0 - 106.0.59.255 in +106.0.60.0 - 106.0.63.255 bd 106.0.64.0 - 106.0.127.255 cn 106.0.128.0 - 106.0.255.255 th 106.1.0.0 - 106.1.255.255 tw @@ -63868,66 +44378,162 @@ 106.192.0.0 - 106.223.255.255 in 106.224.0.0 - 106.239.255.255 cn 106.240.0.0 - 106.255.255.255 kr -107.0.0.0 - 107.6.0.31 us -107.6.0.32 - 107.6.0.127 ca -107.6.0.128 - 107.6.0.191 us -107.6.0.192 - 107.6.0.255 ca -107.6.1.0 - 107.6.1.255 us +107.0.0.0 - 107.6.1.255 us 107.6.2.0 - 107.6.2.15 ca -107.6.2.16 - 107.6.2.23 us -107.6.2.24 - 107.6.2.63 ca -107.6.2.64 - 107.6.2.127 an -107.6.2.128 - 107.6.2.255 ca -107.6.3.0 - 107.6.3.7 us -107.6.3.8 - 107.6.3.31 ca -107.6.3.32 - 107.6.3.79 us -107.6.3.80 - 107.6.3.87 ca -107.6.3.88 - 107.6.3.95 us -107.6.3.96 - 107.6.3.159 ca -107.6.3.160 - 107.6.3.191 us -107.6.3.192 - 107.6.3.223 qa -107.6.3.224 - 107.6.3.255 us -107.6.4.0 - 107.6.4.255 gb -107.6.5.0 - 107.6.5.31 us -107.6.5.32 - 107.6.5.255 ca -107.6.6.0 - 107.6.6.63 us -107.6.6.64 - 107.6.6.95 ca -107.6.6.96 - 107.6.6.127 us -107.6.6.128 - 107.6.6.255 ca -107.6.7.0 - 107.6.7.15 us -107.6.7.16 - 107.6.7.23 ca -107.6.7.24 - 107.6.7.31 us -107.6.7.32 - 107.6.7.95 ca -107.6.7.96 - 107.6.7.127 us -107.6.7.128 - 107.6.7.255 ca -107.6.8.0 - 107.6.9.255 in -107.6.10.0 - 107.6.10.255 us -107.6.11.0 - 107.6.12.255 in -107.6.13.0 - 107.6.13.255 us -107.6.14.0 - 107.6.15.255 in +107.6.2.16 - 107.6.3.255 us +107.6.4.0 - 107.6.4.255 ca +107.6.5.0 - 107.6.7.255 us +107.6.8.0 - 107.6.8.255 in +107.6.9.0 - 107.6.15.255 us 107.6.16.0 - 107.6.16.255 ar -107.6.17.0 - 107.6.17.63 us -107.6.17.64 - 107.6.17.127 ae -107.6.17.128 - 107.6.19.255 us +107.6.17.0 - 107.6.19.255 us 107.6.20.0 - 107.6.21.255 ca -107.6.22.0 - 107.6.23.255 us -107.6.24.0 - 107.6.26.255 ca -107.6.27.0 - 107.6.37.255 us -107.6.38.0 - 107.6.39.255 in -107.6.40.0 - 107.6.40.63 us -107.6.40.64 - 107.6.40.151 ca -107.6.40.152 - 107.6.40.191 us -107.6.40.192 - 107.6.40.223 ca -107.6.40.224 - 107.6.40.239 us -107.6.40.240 - 107.6.42.63 ca -107.6.42.64 - 107.16.184.127 us -107.16.184.128 - 107.16.184.255 pr -107.16.185.0 - 107.16.203.255 us -107.16.204.0 - 107.16.204.255 pr -107.16.205.0 - 107.17.191.255 us -107.17.192.0 - 107.17.192.255 pr -107.17.193.0 - 107.127.255.255 us -107.224.0.0 - 108.59.63.255 us +107.6.22.0 - 107.6.23.31 us +107.6.23.32 - 107.6.23.127 ca +107.6.23.128 - 107.6.25.255 us +107.6.26.0 - 107.6.27.255 ca +107.6.28.0 - 107.6.29.159 us +107.6.29.160 - 107.6.29.191 ca +107.6.29.192 - 107.6.30.255 us +107.6.31.0 - 107.6.31.255 ca +107.6.32.0 - 107.6.33.255 us +107.6.34.0 - 107.6.35.255 ca +107.6.36.0 - 107.6.40.255 us +107.6.41.0 - 107.6.41.255 ca +107.6.42.0 - 107.6.42.255 us +107.6.43.0 - 107.6.43.255 ca +107.6.44.0 - 107.6.49.255 us +107.6.50.0 - 107.6.51.255 ca +107.6.52.0 - 107.6.55.255 us +107.6.56.0 - 107.6.57.255 ca +107.6.58.0 - 107.6.61.143 us +107.6.61.144 - 107.6.61.159 ca +107.6.61.160 - 107.6.111.255 us +107.6.112.0 - 107.6.127.255 sg +107.6.128.0 - 107.6.139.255 us +107.6.140.0 - 107.6.143.255 nl +107.6.144.0 - 107.6.149.255 us +107.6.150.0 - 107.6.157.255 nl +107.6.158.0 - 107.6.159.255 us +107.6.160.0 - 107.6.187.255 nl +107.6.188.0 - 107.150.29.122 us +107.150.29.123 - 107.150.29.123 ca +107.150.29.124 - 107.150.93.255 us +107.150.94.0 - 107.150.94.255 nz +107.150.95.0 - 107.150.95.255 tr +107.150.96.0 - 107.150.111.255 cn +107.150.112.0 - 107.150.223.255 us +107.150.224.0 - 107.150.255.255 ca +107.151.0.0 - 107.152.79.255 us +107.152.80.0 - 107.152.95.255 ca +107.152.96.0 - 107.152.169.255 us +107.152.170.0 - 107.152.170.255 fr +107.152.171.0 - 107.152.186.31 us +107.152.186.32 - 107.152.186.39 ca +107.152.186.40 - 107.152.187.151 us +107.152.187.152 - 107.152.187.159 ca +107.152.187.160 - 107.153.4.255 us +107.153.5.0 - 107.153.5.255 es +107.153.6.0 - 107.153.6.255 de +107.153.7.0 - 107.153.19.255 us +107.153.20.0 - 107.153.20.255 au +107.153.21.0 - 107.153.27.255 us +107.153.28.0 - 107.153.28.255 de +107.153.29.0 - 107.153.33.255 us +107.153.34.0 - 107.153.34.255 de +107.153.35.0 - 107.153.83.255 us +107.153.84.0 - 107.153.84.255 eg +107.153.85.0 - 107.153.109.255 us +107.153.110.0 - 107.153.110.255 de +107.153.111.0 - 107.153.125.255 us +107.153.126.0 - 107.153.126.255 de +107.153.127.0 - 107.153.243.255 us +107.153.244.0 - 107.153.244.255 de +107.153.245.0 - 107.153.245.255 gb +107.153.246.0 - 107.153.246.255 de +107.153.247.0 - 107.153.247.255 gb +107.153.248.0 - 107.153.248.255 de +107.153.249.0 - 107.153.249.255 gb +107.153.250.0 - 107.153.250.255 de +107.153.251.0 - 107.153.251.255 gb +107.153.252.0 - 107.153.252.255 de +107.153.253.0 - 107.153.253.255 us +107.153.254.0 - 107.153.254.255 de +107.153.255.0 - 107.154.117.255 us +107.154.118.0 - 107.154.118.255 es +107.154.119.0 - 107.158.255.255 us +107.159.0.0 - 107.159.255.255 ca +107.160.0.0 - 107.160.255.255 us +107.161.0.0 - 107.161.15.255 ca +107.161.16.0 - 107.161.31.255 us +107.161.32.0 - 107.161.47.255 ca +107.161.48.0 - 107.161.63.255 us +107.161.64.0 - 107.161.79.255 ca +107.161.80.0 - 107.161.95.255 us +107.161.96.0 - 107.161.111.255 ca +107.161.112.0 - 107.161.152.255 us +107.161.153.0 - 107.161.154.255 ca +107.161.155.0 - 107.161.158.255 us +107.161.159.0 - 107.161.159.255 ca +107.161.160.0 - 107.167.255.255 us +107.168.0.0 - 107.168.0.255 de +107.168.1.0 - 107.168.1.255 gb +107.168.2.0 - 107.168.2.255 de +107.168.3.0 - 107.168.3.255 gb +107.168.4.0 - 107.168.5.255 cn +107.168.6.0 - 107.168.7.255 us +107.168.8.0 - 107.168.8.255 br +107.168.9.0 - 107.168.31.255 us +107.168.32.0 - 107.168.32.255 au +107.168.33.0 - 107.168.47.255 us +107.168.48.0 - 107.168.49.255 au +107.168.50.0 - 107.168.54.255 us +107.168.55.0 - 107.168.56.255 gb +107.168.57.0 - 107.168.69.255 us +107.168.70.0 - 107.168.71.255 jp +107.168.72.0 - 107.168.101.255 us +107.168.102.0 - 107.168.102.255 jp +107.168.103.0 - 107.168.121.255 us +107.168.122.0 - 107.168.122.255 au +107.168.123.0 - 107.168.128.255 us +107.168.129.0 - 107.168.129.255 ca +107.168.130.0 - 107.169.100.255 us +107.169.101.0 - 107.169.101.255 kr +107.169.102.0 - 107.171.127.255 us +107.171.128.0 - 107.171.255.255 ca +107.172.0.0 - 107.179.127.255 us +107.179.128.0 - 107.179.255.255 ca +107.180.0.0 - 107.181.127.255 us +107.181.128.0 - 107.181.128.255 au +107.181.129.0 - 107.181.130.255 us +107.181.131.0 - 107.181.131.255 gb +107.181.132.0 - 107.188.255.255 us +107.189.0.0 - 107.189.1.255 lu +107.189.2.0 - 107.189.191.255 us +107.189.192.0 - 107.190.127.255 ca +107.190.128.0 - 107.190.162.255 us +107.190.163.0 - 107.190.163.255 ie +107.190.164.0 - 107.190.165.255 us +107.190.166.0 - 107.190.166.255 nl +107.190.167.0 - 107.190.171.255 us +107.190.172.0 - 107.190.172.255 sg +107.190.173.0 - 107.190.173.255 gb +107.190.174.0 - 107.190.174.255 bs +107.190.175.0 - 107.191.45.255 us +107.191.46.0 - 107.191.47.255 fr +107.191.48.0 - 107.191.51.255 us +107.191.52.0 - 107.191.53.255 jp +107.191.54.0 - 107.191.55.255 us +107.191.56.0 - 107.191.56.255 au +107.191.57.0 - 107.191.59.255 us +107.191.60.0 - 107.191.61.255 jp +107.191.62.0 - 107.191.63.255 fr +107.191.64.0 - 107.191.79.255 vi +107.191.80.0 - 107.191.108.175 us +107.191.108.176 - 107.191.108.176 jp +107.191.108.177 - 107.191.207.255 us +107.191.208.0 - 107.191.223.255 gp +107.191.224.0 - 108.59.63.255 us 108.59.64.0 - 108.59.79.255 ca 108.59.80.0 - 108.59.255.255 us 108.60.0.0 - 108.60.31.255 ca @@ -63935,17 +44541,86 @@ 108.60.160.0 - 108.60.191.255 ca 108.60.192.0 - 108.60.223.255 us 108.60.224.0 - 108.60.255.255 bs -108.61.0.0 - 108.61.252.255 us +108.61.0.0 - 108.61.12.15 us +108.61.12.16 - 108.61.12.31 a1 +108.61.12.32 - 108.61.51.111 us +108.61.51.112 - 108.61.51.127 a1 +108.61.51.128 - 108.61.55.143 us +108.61.55.144 - 108.61.55.159 a1 +108.61.55.160 - 108.61.56.47 us +108.61.56.48 - 108.61.56.63 a1 +108.61.56.64 - 108.61.81.63 us +108.61.81.64 - 108.61.81.127 a1 +108.61.81.128 - 108.61.95.255 us +108.61.96.0 - 108.61.96.255 au +108.61.97.0 - 108.61.97.255 es +108.61.98.0 - 108.61.99.255 nl +108.61.100.0 - 108.61.102.255 us +108.61.103.0 - 108.61.103.255 nl +108.61.104.0 - 108.61.104.255 us +108.61.105.0 - 108.61.105.255 fr +108.61.106.0 - 108.61.106.255 dk +108.61.107.0 - 108.61.107.255 pl +108.61.108.0 - 108.61.111.255 us +108.61.112.0 - 108.61.113.255 de +108.61.114.0 - 108.61.115.255 us +108.61.116.0 - 108.61.116.255 gb +108.61.117.0 - 108.61.117.255 nl +108.61.118.0 - 108.61.118.255 ca +108.61.119.0 - 108.61.121.255 us +108.61.122.0 - 108.61.123.255 fr +108.61.124.0 - 108.61.125.255 us +108.61.126.0 - 108.61.127.255 jp +108.61.128.0 - 108.61.159.255 us +108.61.160.0 - 108.61.163.255 jp +108.61.164.0 - 108.61.167.255 nl +108.61.168.0 - 108.61.169.255 au +108.61.170.0 - 108.61.171.255 de +108.61.172.0 - 108.61.175.255 gb +108.61.176.0 - 108.61.177.255 fr +108.61.178.0 - 108.61.179.255 de +108.61.180.0 - 108.61.183.255 jp +108.61.184.0 - 108.61.185.255 au +108.61.186.0 - 108.61.187.255 us +108.61.188.0 - 108.61.189.255 nl +108.61.190.0 - 108.61.190.255 de +108.61.191.0 - 108.61.195.255 us +108.61.196.0 - 108.61.197.255 gb +108.61.198.0 - 108.61.199.255 nl +108.61.200.0 - 108.61.201.255 jp +108.61.202.0 - 108.61.207.255 us +108.61.208.0 - 108.61.209.255 fr +108.61.210.0 - 108.61.211.255 de +108.61.212.0 - 108.61.213.255 au +108.61.214.0 - 108.61.220.255 us +108.61.221.0 - 108.61.221.255 gb +108.61.222.0 - 108.61.222.255 us +108.61.223.0 - 108.61.223.255 jp +108.61.224.0 - 108.61.224.255 us +108.61.225.0 - 108.61.225.255 gb +108.61.226.0 - 108.61.226.255 us +108.61.227.0 - 108.61.227.255 au +108.61.228.0 - 108.61.229.255 us +108.61.230.0 - 108.61.230.255 gb +108.61.231.0 - 108.61.231.255 ca +108.61.232.0 - 108.61.236.255 us +108.61.237.0 - 108.61.237.255 fr +108.61.238.0 - 108.61.246.63 us +108.61.246.64 - 108.61.247.255 jp +108.61.248.0 - 108.61.249.255 us +108.61.250.0 - 108.61.250.255 jp +108.61.251.0 - 108.61.251.255 au +108.61.252.0 - 108.61.252.255 us 108.61.253.0 - 108.61.255.255 nl -108.62.0.0 - 108.62.84.255 us -108.62.85.0 - 108.62.85.255 ca -108.62.86.0 - 108.62.255.255 us +108.62.0.0 - 108.62.255.255 us 108.63.0.0 - 108.63.255.255 ca -108.64.0.0 - 108.160.15.255 us +108.64.0.0 - 108.122.163.174 us +108.122.163.175 - 108.122.163.175 re +108.122.163.176 - 108.160.15.255 us 108.160.16.0 - 108.160.31.255 ca 108.160.32.0 - 108.160.79.255 us -108.160.80.0 - 108.160.111.255 ca -108.160.112.0 - 108.160.239.255 us +108.160.80.0 - 108.160.101.255 ca +108.160.102.0 - 108.160.239.255 us 108.160.240.0 - 108.160.255.255 ca 108.161.0.0 - 108.161.31.255 us 108.161.32.0 - 108.161.47.255 ca @@ -63953,27 +44628,130 @@ 108.161.112.0 - 108.161.127.255 ca 108.161.128.0 - 108.161.159.255 us 108.161.160.0 - 108.161.175.255 ca -108.161.176.0 - 108.162.63.255 us +108.161.176.0 - 108.161.241.255 us +108.161.242.0 - 108.161.243.255 at +108.161.244.0 - 108.161.244.255 us +108.161.245.0 - 108.161.245.255 br +108.161.246.0 - 108.161.246.255 us +108.161.247.0 - 108.161.247.255 hk +108.161.248.0 - 108.162.63.255 us 108.162.64.0 - 108.162.191.255 ca -108.162.192.0 - 108.163.127.255 us -108.163.128.0 - 108.163.191.255 ca -108.163.192.0 - 108.165.255.255 us -108.192.0.0 - 108.255.255.255 us +108.162.192.0 - 108.162.207.255 us +108.162.208.0 - 108.162.208.255 sg +108.162.209.0 - 108.162.221.255 us +108.162.222.0 - 108.162.223.255 hk +108.162.224.0 - 108.162.224.255 us +108.162.225.0 - 108.162.225.255 sg +108.162.226.0 - 108.162.227.255 jp +108.162.228.0 - 108.162.229.255 fr +108.162.230.0 - 108.162.231.255 de +108.162.232.0 - 108.162.238.255 us +108.162.239.0 - 108.162.242.255 ca +108.162.243.0 - 108.162.246.255 us +108.162.247.0 - 108.162.250.255 au +108.162.251.0 - 108.162.252.255 us +108.162.253.0 - 108.162.253.255 de +108.162.254.0 - 108.163.127.255 us +108.163.128.0 - 108.163.157.255 ca +108.163.158.0 - 108.163.158.255 us +108.163.159.0 - 108.163.191.255 ca +108.163.192.0 - 108.167.255.255 us +108.168.0.0 - 108.168.127.255 ca +108.168.128.0 - 108.170.127.255 us +108.170.128.0 - 108.170.191.255 ca +108.170.192.0 - 108.171.63.255 us +108.171.64.0 - 108.171.95.255 ca +108.171.96.0 - 108.171.127.255 us +108.171.128.0 - 108.171.128.255 gb +108.171.129.0 - 108.171.129.255 de +108.171.130.0 - 108.171.133.255 us +108.171.134.0 - 108.171.134.255 au +108.171.135.0 - 108.171.136.255 us +108.171.137.0 - 108.171.137.255 dk +108.171.138.0 - 108.171.138.255 br +108.171.139.0 - 108.171.139.255 fr +108.171.140.0 - 108.171.140.255 ca +108.171.141.0 - 108.171.141.255 us +108.171.142.0 - 108.171.142.255 sg +108.171.143.0 - 108.171.158.255 us +108.171.159.0 - 108.171.159.255 in +108.171.160.0 - 108.171.255.255 us +108.172.0.0 - 108.173.255.255 ca +108.174.0.0 - 108.174.15.255 us +108.174.16.0 - 108.174.31.255 ca +108.174.32.0 - 108.174.74.255 us +108.174.75.0 - 108.174.76.255 ca +108.174.77.0 - 108.174.127.255 us +108.174.128.0 - 108.174.143.255 ca +108.174.144.0 - 108.174.159.255 us +108.174.160.0 - 108.174.175.255 ca +108.174.176.0 - 108.175.79.255 us +108.175.80.0 - 108.175.95.255 ca +108.175.96.0 - 108.175.133.255 us +108.175.134.0 - 108.175.134.255 ca +108.175.135.0 - 108.175.223.255 us +108.175.224.0 - 108.175.239.255 ca +108.175.240.0 - 108.179.255.255 us +108.180.0.0 - 108.181.255.255 ca +108.182.0.0 - 108.255.255.255 us 109.0.0.0 - 109.31.255.255 fr 109.32.0.0 - 109.39.255.255 nl 109.40.0.0 - 109.47.255.255 de 109.48.0.0 - 109.51.255.255 pt 109.52.0.0 - 109.55.255.255 it -109.56.0.0 - 109.57.255.255 dk -109.58.0.0 - 109.58.133.255 se -109.58.134.0 - 109.58.191.255 dk -109.58.192.0 - 109.58.255.255 se -109.59.0.0 - 109.59.255.255 dk +109.56.0.0 - 109.57.18.255 dk +109.57.19.0 - 109.57.19.255 se +109.57.20.0 - 109.57.255.255 dk +109.58.0.0 - 109.58.255.255 se +109.59.0.0 - 109.59.61.255 dk +109.59.62.0 - 109.59.62.127 se +109.59.62.128 - 109.59.255.255 dk 109.60.0.0 - 109.60.127.255 hr 109.60.128.0 - 109.60.255.255 ru 109.61.0.0 - 109.61.127.255 hu 109.61.128.0 - 109.61.255.255 ru -109.62.0.0 - 109.62.127.255 fr +109.62.0.0 - 109.62.0.255 fr +109.62.1.0 - 109.62.1.255 mq +109.62.2.0 - 109.62.3.255 fr +109.62.4.0 - 109.62.4.255 mq +109.62.5.0 - 109.62.10.255 fr +109.62.11.0 - 109.62.11.255 mq +109.62.12.0 - 109.62.12.255 fr +109.62.13.0 - 109.62.13.255 mq +109.62.14.0 - 109.62.18.255 fr +109.62.19.0 - 109.62.21.255 gp +109.62.22.0 - 109.62.22.255 fr +109.62.23.0 - 109.62.23.255 gp +109.62.24.0 - 109.62.28.255 fr +109.62.29.0 - 109.62.31.255 gf +109.62.32.0 - 109.62.39.255 fr +109.62.40.0 - 109.62.40.255 yt +109.62.41.0 - 109.62.41.255 fr +109.62.42.0 - 109.62.42.255 yt +109.62.43.0 - 109.62.57.255 fr +109.62.58.0 - 109.62.58.255 gp +109.62.59.0 - 109.62.66.255 fr +109.62.67.0 - 109.62.67.255 gp +109.62.68.0 - 109.62.73.255 fr +109.62.74.0 - 109.62.75.255 gp +109.62.76.0 - 109.62.79.255 fr +109.62.80.0 - 109.62.80.255 mq +109.62.81.0 - 109.62.81.255 fr +109.62.82.0 - 109.62.84.255 mq +109.62.85.0 - 109.62.91.255 fr +109.62.92.0 - 109.62.92.255 mq +109.62.93.0 - 109.62.97.255 fr +109.62.98.0 - 109.62.98.255 mq +109.62.99.0 - 109.62.99.255 fr +109.62.100.0 - 109.62.100.255 mq +109.62.101.0 - 109.62.101.255 fr +109.62.102.0 - 109.62.103.255 mq +109.62.104.0 - 109.62.105.255 gp +109.62.106.0 - 109.62.107.255 fr +109.62.108.0 - 109.62.108.255 gp +109.62.109.0 - 109.62.110.255 fr +109.62.111.0 - 109.62.111.255 gp +109.62.112.0 - 109.62.127.255 fr 109.62.128.0 - 109.62.255.255 ru 109.63.0.0 - 109.63.127.255 bh 109.63.128.0 - 109.63.255.255 ru @@ -64031,47 +44809,34 @@ 109.69.184.0 - 109.69.199.255 fr 109.69.200.0 - 109.69.207.255 it 109.69.208.0 - 109.69.215.255 cz -109.69.216.0 - 109.69.218.204 be -109.69.218.205 - 109.69.218.214 nl -109.69.218.215 - 109.69.218.255 fr -109.69.219.0 - 109.69.223.255 be +109.69.216.0 - 109.69.223.255 be 109.69.224.0 - 109.69.231.255 nl 109.69.232.0 - 109.69.239.255 gb 109.69.240.0 - 109.69.247.255 lu 109.69.248.0 - 109.69.255.255 at 109.70.0.0 - 109.70.15.255 nl -109.70.16.0 - 109.70.18.79 fr -109.70.18.80 - 109.70.18.87 nl -109.70.18.88 - 109.70.18.91 fr -109.70.18.92 - 109.70.18.95 nl -109.70.18.96 - 109.70.18.135 fr -109.70.18.136 - 109.70.18.143 nl -109.70.18.144 - 109.70.18.147 fr -109.70.18.148 - 109.70.18.151 nl -109.70.18.152 - 109.70.18.159 fr -109.70.18.160 - 109.70.18.167 nl -109.70.18.168 - 109.70.18.183 fr -109.70.18.184 - 109.70.18.187 nl -109.70.18.188 - 109.70.23.255 fr +109.70.16.0 - 109.70.23.255 fr 109.70.24.0 - 109.70.31.255 ru 109.70.32.0 - 109.70.39.255 es -109.70.40.0 - 109.70.46.63 im -109.70.46.64 - 109.70.46.79 gb -109.70.46.80 - 109.70.47.255 im +109.70.40.0 - 109.70.46.123 im +109.70.46.124 - 109.70.46.127 gb +109.70.46.128 - 109.70.47.255 im 109.70.48.0 - 109.70.55.255 dk 109.70.56.0 - 109.70.63.255 gb -109.70.64.0 - 109.70.71.255 ae +109.70.64.0 - 109.70.65.255 ae +109.70.66.0 - 109.70.66.255 iq +109.70.67.0 - 109.70.67.66 us +109.70.67.67 - 109.70.67.67 ae +109.70.67.68 - 109.70.67.255 us +109.70.68.0 - 109.70.71.255 ae 109.70.72.0 - 109.70.79.255 it 109.70.80.0 - 109.70.87.255 no -109.70.88.0 - 109.70.89.255 gb -109.70.90.0 - 109.70.95.255 us +109.70.88.0 - 109.70.95.255 us 109.70.96.0 - 109.70.103.255 at 109.70.104.0 - 109.70.111.255 ua 109.70.112.0 - 109.70.119.255 ch 109.70.120.0 - 109.70.127.255 it -109.70.128.0 - 109.70.128.127 es -109.70.128.128 - 109.70.128.239 fr -109.70.128.240 - 109.70.135.255 es +109.70.128.0 - 109.70.135.255 es 109.70.136.0 - 109.70.151.255 gb 109.70.152.0 - 109.70.159.255 ch 109.70.160.0 - 109.70.167.255 fi @@ -64080,18 +44845,17 @@ 109.70.184.0 - 109.70.191.255 ru 109.70.192.0 - 109.70.199.255 de 109.70.200.0 - 109.70.207.255 it -109.70.208.0 - 109.70.211.47 gb -109.70.211.48 - 109.70.211.55 ie -109.70.211.56 - 109.70.215.255 gb +109.70.208.0 - 109.70.209.19 gb +109.70.209.20 - 109.70.209.63 ie +109.70.209.64 - 109.70.209.255 gb +109.70.210.0 - 109.70.210.79 ie +109.70.210.80 - 109.70.215.255 gb 109.70.216.0 - 109.70.223.255 de 109.70.224.0 - 109.70.231.255 gb 109.70.232.0 - 109.70.239.255 ru 109.70.240.0 - 109.70.247.255 it 109.70.248.0 - 109.70.255.255 ru -109.71.0.0 - 109.71.1.255 nl -109.71.2.0 - 109.71.2.255 bg -109.71.3.0 - 109.71.3.255 se -109.71.4.0 - 109.71.7.255 nl +109.71.0.0 - 109.71.7.255 nl 109.71.8.0 - 109.71.15.255 ru 109.71.16.0 - 109.71.31.255 de 109.71.32.0 - 109.71.39.255 kz @@ -64099,37 +44863,23 @@ 109.71.48.0 - 109.71.55.255 nl 109.71.56.0 - 109.71.63.255 dk 109.71.64.0 - 109.71.71.255 sk -109.71.72.0 - 109.71.79.255 ru -109.71.80.0 - 109.71.80.127 gb -109.71.80.128 - 109.71.80.255 us -109.71.81.0 - 109.71.86.255 gb -109.71.87.0 - 109.71.87.255 us +109.71.80.0 - 109.71.87.255 gb 109.71.88.0 - 109.71.103.255 ch 109.71.104.0 - 109.71.111.255 nl 109.71.112.0 - 109.71.119.255 de 109.71.120.0 - 109.71.127.255 gb 109.71.128.0 - 109.71.143.255 fr -109.71.144.0 - 109.71.145.0 gb -109.71.145.1 - 109.71.145.31 nl -109.71.145.32 - 109.71.145.128 gb -109.71.145.129 - 109.71.145.143 et -109.71.145.144 - 109.71.145.192 gb -109.71.145.193 - 109.71.145.199 ca -109.71.145.200 - 109.71.151.255 gb -109.71.152.0 - 109.71.158.255 rs -109.71.159.0 - 109.71.159.255 al -109.71.160.0 - 109.71.167.255 pt +109.71.144.0 - 109.71.151.255 gb +109.71.160.0 - 109.71.167.255 lu 109.71.168.0 - 109.71.175.255 gb 109.71.176.0 - 109.71.183.255 ru 109.71.184.0 - 109.71.191.255 nl 109.71.192.0 - 109.71.207.255 ru 109.71.208.0 - 109.71.215.255 cz -109.71.216.0 - 109.71.222.255 de -109.71.223.0 - 109.71.223.255 gb +109.71.216.0 - 109.71.223.255 de 109.71.224.0 - 109.71.231.255 kg 109.71.232.0 - 109.71.239.255 it 109.71.240.0 - 109.71.247.255 ru -109.71.248.0 - 109.71.255.255 gb 109.72.0.0 - 109.72.15.255 cz 109.72.16.0 - 109.72.31.255 gb 109.72.32.0 - 109.72.47.255 nl @@ -64138,23 +44888,14 @@ 109.72.80.0 - 109.72.95.255 nl 109.72.96.0 - 109.72.111.255 me 109.72.112.0 - 109.72.127.255 ua -109.72.128.0 - 109.72.128.175 ru -109.72.128.176 - 109.72.128.255 ch -109.72.129.0 - 109.72.129.127 ru -109.72.129.128 - 109.72.130.159 ch -109.72.130.160 - 109.72.130.175 ru -109.72.130.176 - 109.72.133.255 ch -109.72.134.0 - 109.72.135.255 in -109.72.136.0 - 109.72.143.255 ch -109.72.144.0 - 109.72.151.255 eu -109.72.152.0 - 109.72.153.255 ua -109.72.154.0 - 109.72.154.255 ru -109.72.155.0 - 109.72.155.255 eu -109.72.156.0 - 109.72.159.255 de -109.72.160.0 - 109.72.164.255 nl -109.72.165.0 - 109.72.165.127 gb -109.72.165.128 - 109.72.165.255 de -109.72.166.0 - 109.72.191.255 nl +109.72.128.0 - 109.72.130.163 ch +109.72.130.164 - 109.72.130.164 ru +109.72.130.165 - 109.72.143.255 ch +109.72.144.0 - 109.72.147.255 nl +109.72.148.0 - 109.72.151.255 eu +109.72.152.0 - 109.72.155.255 ua +109.72.156.0 - 109.72.159.255 eu +109.72.160.0 - 109.72.191.255 nl 109.72.192.0 - 109.72.207.255 ir 109.72.208.0 - 109.72.223.255 gb 109.72.224.0 - 109.73.15.255 ru @@ -64165,31 +44906,37 @@ 109.73.80.0 - 109.73.95.255 it 109.73.96.0 - 109.73.111.255 lv 109.73.112.0 - 109.73.127.255 gb -109.73.128.0 - 109.73.143.255 ru +109.73.136.0 - 109.73.143.255 ru 109.73.144.0 - 109.73.159.255 at -109.73.160.0 - 109.73.161.255 il +109.73.160.0 - 109.73.160.255 gb +109.73.161.0 - 109.73.161.255 in 109.73.162.0 - 109.73.163.255 gb 109.73.164.0 - 109.73.164.255 in -109.73.165.0 - 109.73.166.0 gb -109.73.166.1 - 109.73.166.255 in -109.73.167.0 - 109.73.175.255 gb +109.73.165.0 - 109.73.165.255 gb +109.73.166.0 - 109.73.166.255 in +109.73.167.0 - 109.73.172.255 gb +109.73.173.0 - 109.73.173.41 in +109.73.173.42 - 109.73.173.42 gb +109.73.173.43 - 109.73.173.127 in +109.73.173.128 - 109.73.173.255 gb +109.73.174.0 - 109.73.174.255 nl +109.73.175.0 - 109.73.175.255 gb 109.73.176.0 - 109.73.191.255 it 109.73.192.0 - 109.73.207.255 ru 109.73.208.0 - 109.73.223.255 cz -109.73.224.0 - 109.73.239.255 ro +109.73.224.0 - 109.73.239.255 us 109.73.240.0 - 109.73.255.255 ps 109.74.0.0 - 109.74.15.255 se -109.74.16.0 - 109.74.19.255 gb -109.74.20.0 - 109.74.31.255 nl +109.74.16.0 - 109.74.20.255 nl +109.74.21.0 - 109.74.28.255 gb +109.74.29.0 - 109.74.31.255 nl 109.74.32.0 - 109.74.47.255 ye 109.74.48.0 - 109.74.63.255 hu 109.74.64.0 - 109.74.79.255 tj 109.74.80.0 - 109.74.95.255 fr 109.74.96.0 - 109.74.111.255 pl 109.74.112.0 - 109.74.143.255 ru -109.74.144.0 - 109.74.156.255 sk -109.74.157.0 - 109.74.157.255 cz -109.74.158.0 - 109.74.159.255 sk +109.74.144.0 - 109.74.159.255 sk 109.74.160.0 - 109.74.175.255 ru 109.74.176.0 - 109.74.191.255 no 109.74.192.0 - 109.74.207.255 gb @@ -64197,26 +44944,16 @@ 109.74.224.0 - 109.74.239.255 ir 109.74.240.0 - 109.74.255.255 gb 109.75.0.0 - 109.75.15.255 cz -109.75.16.0 - 109.75.18.15 de -109.75.18.16 - 109.75.18.23 al -109.75.18.24 - 109.75.31.255 de +109.75.16.0 - 109.75.31.255 de 109.75.32.0 - 109.75.47.255 am -109.75.48.0 - 109.75.48.31 tj -109.75.48.32 - 109.75.48.255 ru -109.75.49.0 - 109.75.49.31 tj -109.75.49.32 - 109.75.63.255 ru +109.75.48.0 - 109.75.63.255 ru 109.75.64.0 - 109.75.79.255 lb -109.75.80.0 - 109.75.111.191 de -109.75.111.192 - 109.75.111.255 us +109.75.80.0 - 109.75.111.255 de 109.75.112.0 - 109.75.127.255 it 109.75.128.0 - 109.75.143.255 ru 109.75.144.0 - 109.75.159.255 cz 109.75.160.0 - 109.75.175.255 gb -109.75.176.0 - 109.75.178.255 de -109.75.179.0 - 109.75.179.31 ch -109.75.179.32 - 109.75.179.207 de -109.75.179.208 - 109.75.179.215 fr -109.75.179.216 - 109.75.191.255 de +109.75.176.0 - 109.75.191.255 de 109.75.192.0 - 109.75.207.255 ua 109.75.208.0 - 109.75.223.255 de 109.75.224.0 - 109.75.239.255 fi @@ -64249,7 +44986,7 @@ 109.95.88.0 - 109.95.95.255 pl 109.95.96.0 - 109.95.111.255 ru 109.95.112.0 - 109.95.119.255 pl -109.95.120.0 - 109.95.127.255 ru +109.95.120.0 - 109.95.123.255 ua 109.95.128.0 - 109.95.135.255 il 109.95.136.0 - 109.95.159.255 pl 109.95.160.0 - 109.95.167.255 ru @@ -64264,11 +45001,7 @@ 109.96.0.0 - 109.103.255.255 ro 109.104.0.0 - 109.104.31.255 se 109.104.32.0 - 109.104.63.255 de -109.104.64.0 - 109.104.67.255 gb -109.104.68.0 - 109.104.69.255 es -109.104.70.0 - 109.104.113.135 gb -109.104.113.136 - 109.104.113.143 a2 -109.104.113.144 - 109.104.127.255 gb +109.104.64.0 - 109.104.127.255 gb 109.104.128.0 - 109.104.159.255 al 109.104.160.0 - 109.104.191.255 ua 109.104.192.0 - 109.104.223.255 bg @@ -64276,19 +45009,9 @@ 109.105.0.0 - 109.105.31.255 hu 109.105.32.0 - 109.105.63.255 cz 109.105.64.0 - 109.105.95.255 ru -109.105.96.0 - 109.105.105.255 se -109.105.106.0 - 109.105.106.255 dk -109.105.107.0 - 109.105.107.255 se -109.105.108.0 - 109.105.108.127 dk -109.105.108.128 - 109.105.110.255 se -109.105.111.0 - 109.105.111.255 dk -109.105.112.0 - 109.105.112.255 se -109.105.113.0 - 109.105.113.255 dk -109.105.114.0 - 109.105.115.255 se -109.105.116.0 - 109.105.116.127 dk -109.105.116.128 - 109.105.123.255 se -109.105.124.0 - 109.105.126.255 dk -109.105.127.0 - 109.105.127.255 se +109.105.96.0 - 109.105.113.255 se +109.105.114.0 - 109.105.114.255 dk +109.105.115.0 - 109.105.127.255 se 109.105.128.0 - 109.105.151.255 ru 109.105.152.0 - 109.105.158.255 lu 109.105.159.0 - 109.105.159.255 am @@ -64317,7 +45040,7 @@ 109.108.64.0 - 109.108.95.255 ua 109.108.96.0 - 109.108.127.255 cz 109.108.128.0 - 109.108.159.255 gb -109.108.160.0 - 109.108.191.255 es +109.108.160.0 - 109.108.191.255 ir 109.108.192.0 - 109.108.223.255 no 109.108.224.0 - 109.108.255.255 ua 109.109.0.0 - 109.109.31.255 de @@ -64325,28 +45048,74 @@ 109.109.64.0 - 109.109.95.255 no 109.109.96.0 - 109.109.127.255 nl 109.109.128.0 - 109.109.191.255 gb -109.109.192.0 - 109.109.207.255 rs +109.109.192.0 - 109.109.199.255 rs +109.109.200.0 - 109.109.201.131 de +109.109.201.132 - 109.109.201.135 us +109.109.201.136 - 109.109.207.255 de 109.109.208.0 - 109.109.223.255 ru -109.109.224.0 - 109.109.235.7 gb -109.109.235.8 - 109.109.235.31 pt -109.109.235.32 - 109.109.235.39 gb -109.109.235.40 - 109.109.235.47 pt -109.109.235.48 - 109.109.235.55 gb -109.109.235.56 - 109.109.235.71 pt -109.109.235.72 - 109.109.235.79 gb -109.109.235.80 - 109.109.235.111 pt -109.109.235.112 - 109.109.235.119 gb -109.109.235.120 - 109.109.235.207 pt -109.109.235.208 - 109.109.235.215 gb -109.109.235.216 - 109.109.235.231 pt -109.109.235.232 - 109.109.255.255 gb +109.109.224.0 - 109.109.226.31 gb +109.109.226.32 - 109.109.226.39 it +109.109.226.40 - 109.109.226.95 gb +109.109.226.96 - 109.109.226.111 it +109.109.226.112 - 109.109.226.207 gb +109.109.226.208 - 109.109.226.215 it +109.109.226.216 - 109.109.228.47 gb +109.109.228.48 - 109.109.228.55 it +109.109.228.56 - 109.109.228.103 gb +109.109.228.104 - 109.109.228.111 it +109.109.228.112 - 109.109.228.183 gb +109.109.228.184 - 109.109.228.191 it +109.109.228.192 - 109.109.229.119 gb +109.109.229.120 - 109.109.229.127 it +109.109.229.128 - 109.109.229.143 gb +109.109.229.144 - 109.109.229.151 it +109.109.229.152 - 109.109.229.255 gb +109.109.230.0 - 109.109.230.7 it +109.109.230.8 - 109.109.231.23 gb +109.109.231.24 - 109.109.231.31 it +109.109.231.32 - 109.109.231.47 gb +109.109.231.48 - 109.109.231.55 it +109.109.231.56 - 109.109.233.135 gb +109.109.233.136 - 109.109.233.143 it +109.109.233.144 - 109.109.236.95 gb +109.109.236.96 - 109.109.236.103 it +109.109.236.104 - 109.109.238.223 gb +109.109.238.224 - 109.109.238.231 it +109.109.238.232 - 109.109.239.191 gb +109.109.239.192 - 109.109.239.199 it +109.109.239.200 - 109.109.241.47 gb +109.109.241.48 - 109.109.241.55 it +109.109.241.56 - 109.109.243.175 gb +109.109.243.176 - 109.109.243.183 it +109.109.243.184 - 109.109.243.239 gb +109.109.243.240 - 109.109.243.247 it +109.109.243.248 - 109.109.244.127 gb +109.109.244.128 - 109.109.244.135 it +109.109.244.136 - 109.109.244.215 gb +109.109.244.216 - 109.109.244.223 it +109.109.244.224 - 109.109.244.239 gb +109.109.244.240 - 109.109.244.247 it +109.109.244.248 - 109.109.246.15 gb +109.109.246.16 - 109.109.246.23 it +109.109.246.24 - 109.109.246.63 gb +109.109.246.64 - 109.109.246.71 it +109.109.246.72 - 109.109.247.143 gb +109.109.247.144 - 109.109.247.151 it +109.109.247.152 - 109.109.251.151 gb +109.109.251.152 - 109.109.251.159 it +109.109.251.160 - 109.109.254.167 gb +109.109.254.168 - 109.109.254.175 it +109.109.254.176 - 109.109.255.79 gb +109.109.255.80 - 109.109.255.87 it +109.109.255.88 - 109.109.255.255 gb 109.110.0.0 - 109.110.31.255 lv 109.110.32.0 - 109.110.63.255 ru 109.110.64.0 - 109.110.95.255 ua 109.110.96.0 - 109.110.127.255 lb 109.110.128.0 - 109.110.159.255 hu 109.110.160.0 - 109.110.191.255 ir -109.110.192.0 - 109.110.223.255 pl +109.110.192.0 - 109.110.207.255 hu +109.110.208.0 - 109.110.223.255 pl 109.110.224.0 - 109.110.255.255 cy 109.111.0.0 - 109.111.31.255 ru 109.111.32.0 - 109.111.63.255 ir @@ -64354,24 +45123,202 @@ 109.111.96.0 - 109.111.127.255 ad 109.111.128.0 - 109.111.191.255 ru 109.111.192.0 - 109.111.223.255 gb -109.111.224.0 - 109.111.224.83 rs -109.111.224.84 - 109.111.224.87 sr -109.111.224.88 - 109.111.255.255 rs -109.112.0.0 - 109.119.255.255 it +109.111.224.0 - 109.111.255.255 rs +109.112.0.0 - 109.118.2.33 it +109.118.2.34 - 109.118.2.34 cn +109.118.2.35 - 109.118.2.67 it +109.118.2.68 - 109.118.2.68 cn +109.118.2.69 - 109.118.2.146 it +109.118.2.147 - 109.118.2.147 cn +109.118.2.148 - 109.118.2.166 it +109.118.2.167 - 109.118.2.167 cn +109.118.2.168 - 109.118.2.207 it +109.118.2.208 - 109.118.2.208 cn +109.118.2.209 - 109.118.4.53 it +109.118.4.54 - 109.118.4.54 cn +109.118.4.55 - 109.118.4.65 it +109.118.4.66 - 109.118.4.66 cn +109.118.4.67 - 109.118.4.67 it +109.118.4.68 - 109.118.4.68 cn +109.118.4.69 - 109.118.4.110 it +109.118.4.111 - 109.118.4.111 cn +109.118.4.112 - 109.118.4.115 it +109.118.4.116 - 109.118.4.116 cn +109.118.4.117 - 109.118.4.124 it +109.118.4.125 - 109.118.4.125 cn +109.118.4.126 - 109.118.4.139 it +109.118.4.140 - 109.118.4.140 cn +109.118.4.141 - 109.118.6.18 it +109.118.6.19 - 109.118.6.20 cn +109.118.6.21 - 109.118.6.22 it +109.118.6.23 - 109.118.6.23 cn +109.118.6.24 - 109.118.6.78 it +109.118.6.79 - 109.118.6.79 cn +109.118.6.80 - 109.118.6.89 it +109.118.6.90 - 109.118.6.90 cn +109.118.6.91 - 109.118.6.133 it +109.118.6.134 - 109.118.6.134 cn +109.118.6.135 - 109.118.6.135 it +109.118.6.136 - 109.118.6.136 cn +109.118.6.137 - 109.118.6.193 it +109.118.6.194 - 109.118.6.194 cn +109.118.6.195 - 109.118.9.26 it +109.118.9.27 - 109.118.9.27 cn +109.118.9.28 - 109.118.9.51 it +109.118.9.52 - 109.118.9.52 cn +109.118.9.53 - 109.118.9.90 it +109.118.9.91 - 109.118.9.91 cn +109.118.9.92 - 109.118.9.219 it +109.118.9.220 - 109.118.9.220 cn +109.118.9.221 - 109.118.9.247 it +109.118.9.248 - 109.118.9.249 cn +109.118.9.250 - 109.118.10.93 it +109.118.10.94 - 109.118.10.94 cn +109.118.10.95 - 109.118.10.95 it +109.118.10.96 - 109.118.10.96 cn +109.118.10.97 - 109.118.10.98 it +109.118.10.99 - 109.118.10.99 cn +109.118.10.100 - 109.118.10.194 it +109.118.10.195 - 109.118.10.195 cn +109.118.10.196 - 109.118.11.143 it +109.118.11.144 - 109.118.11.144 cn +109.118.11.145 - 109.118.11.147 it +109.118.11.148 - 109.118.11.149 cn +109.118.11.150 - 109.118.14.107 it +109.118.14.108 - 109.118.14.108 cn +109.118.14.109 - 109.118.14.163 it +109.118.14.164 - 109.118.14.164 cn +109.118.14.165 - 109.118.14.197 it +109.118.14.198 - 109.118.14.198 cn +109.118.14.199 - 109.118.19.39 it +109.118.19.40 - 109.118.19.40 cn +109.118.19.41 - 109.118.19.84 it +109.118.19.85 - 109.118.19.85 cn +109.118.19.86 - 109.118.19.99 it +109.118.19.100 - 109.118.19.100 cn +109.118.19.101 - 109.118.21.51 it +109.118.21.52 - 109.118.21.52 cn +109.118.21.53 - 109.118.21.60 it +109.118.21.61 - 109.118.21.61 cn +109.118.21.62 - 109.118.21.65 it +109.118.21.66 - 109.118.21.66 cn +109.118.21.67 - 109.118.21.95 it +109.118.21.96 - 109.118.21.96 cn +109.118.21.97 - 109.118.21.104 it +109.118.21.105 - 109.118.21.106 cn +109.118.21.107 - 109.118.21.113 it +109.118.21.114 - 109.118.21.114 cn +109.118.21.115 - 109.118.21.137 it +109.118.21.138 - 109.118.21.138 cn +109.118.21.139 - 109.118.21.141 it +109.118.21.142 - 109.118.21.142 cn +109.118.21.143 - 109.118.21.210 it +109.118.21.211 - 109.118.21.211 cn +109.118.21.212 - 109.118.22.30 it +109.118.22.31 - 109.118.22.31 cn +109.118.22.32 - 109.118.22.34 it +109.118.22.35 - 109.118.22.36 cn +109.118.22.37 - 109.118.22.92 it +109.118.22.93 - 109.118.22.93 cn +109.118.22.94 - 109.118.22.122 it +109.118.22.123 - 109.118.22.123 cn +109.118.22.124 - 109.118.22.132 it +109.118.22.133 - 109.118.22.133 cn +109.118.22.134 - 109.118.22.138 it +109.118.22.139 - 109.118.22.139 cn +109.118.22.140 - 109.118.22.141 it +109.118.22.142 - 109.118.22.142 cn +109.118.22.143 - 109.118.22.144 it +109.118.22.145 - 109.118.22.146 cn +109.118.22.147 - 109.118.22.165 it +109.118.22.166 - 109.118.22.166 cn +109.118.22.167 - 109.118.22.207 it +109.118.22.208 - 109.118.22.208 cn +109.118.22.209 - 109.118.24.51 it +109.118.24.52 - 109.118.24.52 cn +109.118.24.53 - 109.118.24.57 it +109.118.24.58 - 109.118.24.59 cn +109.118.24.60 - 109.118.24.61 it +109.118.24.62 - 109.118.24.62 cn +109.118.24.63 - 109.118.24.65 it +109.118.24.66 - 109.118.24.66 cn +109.118.24.67 - 109.118.24.85 it +109.118.24.86 - 109.118.24.86 cn +109.118.24.87 - 109.118.24.161 it +109.118.24.162 - 109.118.24.162 cn +109.118.24.163 - 109.118.24.181 it +109.118.24.182 - 109.118.24.182 cn +109.118.24.183 - 109.118.24.195 it +109.118.24.196 - 109.118.24.199 cn +109.118.24.200 - 109.118.24.200 it +109.118.24.201 - 109.118.24.201 cn +109.118.24.202 - 109.118.32.63 it +109.118.32.64 - 109.118.32.64 cn +109.118.32.65 - 109.118.37.30 it +109.118.37.31 - 109.118.37.31 cn +109.118.37.32 - 109.118.37.119 it +109.118.37.120 - 109.118.37.120 cn +109.118.37.121 - 109.118.37.135 it +109.118.37.136 - 109.118.37.136 cn +109.118.37.137 - 109.118.65.22 it +109.118.65.23 - 109.118.65.23 cn +109.118.65.24 - 109.118.65.33 it +109.118.65.34 - 109.118.65.34 cn +109.118.65.35 - 109.118.65.97 it +109.118.65.98 - 109.118.65.98 cn +109.118.65.99 - 109.118.65.100 it +109.118.65.101 - 109.118.65.101 cn +109.118.65.102 - 109.118.65.119 it +109.118.65.120 - 109.118.65.120 cn +109.118.65.121 - 109.119.255.255 it 109.120.0.0 - 109.120.63.255 ru -109.120.64.0 - 109.120.65.255 lu -109.120.66.0 - 109.120.99.255 de -109.120.100.0 - 109.120.127.255 lu -109.120.128.0 - 109.120.191.255 ru +109.120.64.0 - 109.120.67.255 lu +109.120.68.0 - 109.120.95.255 fr +109.120.96.0 - 109.120.99.255 gb +109.120.100.0 - 109.120.119.255 lu +109.120.120.0 - 109.120.127.255 de +109.120.128.0 - 109.120.179.255 ru +109.120.180.0 - 109.120.183.255 nl +109.120.184.0 - 109.120.191.255 ru 109.120.192.0 - 109.120.255.255 bg 109.121.0.0 - 109.121.127.255 rs -109.121.128.0 - 109.121.255.255 bg +109.121.128.0 - 109.121.133.255 bg +109.121.134.0 - 109.121.135.255 mk +109.121.136.0 - 109.121.159.255 bg +109.121.160.0 - 109.121.166.255 mk +109.121.167.0 - 109.121.255.255 bg 109.122.0.0 - 109.122.63.255 ua 109.122.64.0 - 109.122.127.255 rs -109.122.128.0 - 109.122.191.255 fr +109.122.128.0 - 109.122.134.255 fr +109.122.135.0 - 109.122.135.255 re +109.122.136.0 - 109.122.142.255 fr +109.122.143.0 - 109.122.143.255 re +109.122.144.0 - 109.122.146.255 fr +109.122.147.0 - 109.122.147.255 re +109.122.148.0 - 109.122.148.255 fr +109.122.149.0 - 109.122.151.255 re +109.122.152.0 - 109.122.152.255 fr +109.122.153.0 - 109.122.154.255 re +109.122.155.0 - 109.122.164.255 fr +109.122.165.0 - 109.122.166.255 re +109.122.167.0 - 109.122.170.255 fr +109.122.171.0 - 109.122.171.255 re +109.122.172.0 - 109.122.183.255 fr +109.122.184.0 - 109.122.184.255 re +109.122.185.0 - 109.122.191.255 fr 109.122.192.0 - 109.122.255.255 ir 109.123.0.0 - 109.123.63.255 si -109.123.64.0 - 109.123.127.255 gb +109.123.64.0 - 109.123.66.199 gb +109.123.66.200 - 109.123.66.219 fr +109.123.66.220 - 109.123.66.220 gb +109.123.66.221 - 109.123.66.224 fr +109.123.66.225 - 109.123.66.226 gb +109.123.66.227 - 109.123.66.227 fr +109.123.66.228 - 109.123.79.255 gb +109.123.80.0 - 109.123.80.255 de +109.123.81.0 - 109.123.115.175 gb +109.123.115.176 - 109.123.115.176 cn +109.123.115.177 - 109.123.127.255 gb 109.123.128.0 - 109.123.191.255 ru 109.123.192.0 - 109.123.255.255 cz 109.124.0.0 - 109.124.127.255 ru @@ -64389,7 +45336,75 @@ 109.127.64.0 - 109.127.127.255 iq 109.127.128.0 - 109.127.191.255 ru 109.127.192.0 - 109.127.255.255 si -109.128.0.0 - 109.143.255.255 be +109.128.0.0 - 109.134.10.25 be +109.134.10.26 - 109.134.10.26 cn +109.134.10.27 - 109.134.10.91 be +109.134.10.92 - 109.134.10.92 cn +109.134.10.93 - 109.134.10.112 be +109.134.10.113 - 109.134.10.113 cn +109.134.10.114 - 109.134.12.144 be +109.134.12.145 - 109.134.12.145 cn +109.134.12.146 - 109.134.12.148 be +109.134.12.149 - 109.134.12.149 cn +109.134.12.150 - 109.134.12.183 be +109.134.12.184 - 109.134.12.184 cn +109.134.12.185 - 109.134.12.203 be +109.134.12.204 - 109.134.12.204 cn +109.134.12.205 - 109.134.14.46 be +109.134.14.47 - 109.134.14.47 cn +109.134.14.48 - 109.134.14.70 be +109.134.14.71 - 109.134.14.71 cn +109.134.14.72 - 109.134.14.89 be +109.134.14.90 - 109.134.14.90 cn +109.134.14.91 - 109.134.14.100 be +109.134.14.101 - 109.134.14.101 cn +109.134.14.102 - 109.134.14.174 be +109.134.14.175 - 109.134.14.175 cn +109.134.14.176 - 109.134.14.212 be +109.134.14.213 - 109.134.14.213 cn +109.134.14.214 - 109.134.16.75 be +109.134.16.76 - 109.134.16.76 cn +109.134.16.77 - 109.134.16.110 be +109.134.16.111 - 109.134.16.111 cn +109.134.16.112 - 109.134.16.142 be +109.134.16.143 - 109.134.16.143 cn +109.134.16.144 - 109.134.16.146 be +109.134.16.147 - 109.134.16.147 cn +109.134.16.148 - 109.134.16.175 be +109.134.16.176 - 109.134.16.176 cn +109.134.16.177 - 109.134.16.238 be +109.134.16.239 - 109.134.16.239 cn +109.134.16.240 - 109.134.17.98 be +109.134.17.99 - 109.134.17.99 cn +109.134.17.100 - 109.134.17.193 be +109.134.17.194 - 109.134.17.194 cn +109.134.17.195 - 109.134.17.211 be +109.134.17.212 - 109.134.17.212 cn +109.134.17.213 - 109.134.18.140 be +109.134.18.141 - 109.134.18.141 cn +109.134.18.142 - 109.134.18.149 be +109.134.18.150 - 109.134.18.151 cn +109.134.18.152 - 109.134.18.153 be +109.134.18.154 - 109.134.18.155 cn +109.134.18.156 - 109.134.18.160 be +109.134.18.161 - 109.134.18.161 cn +109.134.18.162 - 109.134.18.177 be +109.134.18.178 - 109.134.18.178 cn +109.134.18.179 - 109.134.18.180 be +109.134.18.181 - 109.134.18.181 cn +109.134.18.182 - 109.134.18.187 be +109.134.18.188 - 109.134.18.189 cn +109.134.18.190 - 109.134.18.190 be +109.134.18.191 - 109.134.18.191 cn +109.134.18.192 - 109.134.18.199 be +109.134.18.200 - 109.134.18.200 cn +109.134.18.201 - 109.134.18.208 be +109.134.18.209 - 109.134.18.209 cn +109.134.18.210 - 109.134.18.210 be +109.134.18.211 - 109.134.18.211 cn +109.134.18.212 - 109.134.18.212 be +109.134.18.213 - 109.134.18.213 cn +109.134.18.214 - 109.143.255.255 be 109.144.0.0 - 109.159.255.255 gb 109.160.0.0 - 109.160.127.255 bg 109.160.128.0 - 109.160.255.255 il @@ -64403,49 +45418,32 @@ 109.163.200.0 - 109.163.207.255 no 109.163.208.0 - 109.163.215.255 fi 109.163.216.0 - 109.163.223.255 ru -109.163.224.0 - 109.163.235.255 ro -109.163.236.0 - 109.163.237.255 de -109.163.238.0 - 109.163.239.255 ro +109.163.224.0 - 109.163.239.255 ro 109.163.240.0 - 109.163.247.255 ru 109.163.248.0 - 109.163.255.255 fi 109.164.0.0 - 109.164.127.255 cz 109.164.128.0 - 109.164.255.255 ch 109.165.0.0 - 109.165.127.255 ru 109.165.128.0 - 109.165.255.255 ba -109.166.0.0 - 109.166.255.255 ro -109.167.0.0 - 109.167.127.255 ua +109.166.0.0 - 109.166.31.255 sa +109.166.32.0 - 109.166.87.255 ro +109.166.88.0 - 109.166.127.255 sa +109.166.128.0 - 109.166.255.255 ro +109.167.0.0 - 109.167.99.255 ua +109.167.100.0 - 109.167.101.255 es +109.167.102.0 - 109.167.105.255 ua +109.167.106.0 - 109.167.107.255 es +109.167.108.0 - 109.167.112.255 ua +109.167.113.0 - 109.167.113.255 es +109.167.114.0 - 109.167.124.255 ua +109.167.125.0 - 109.167.125.255 es +109.167.126.0 - 109.167.127.255 ua 109.167.128.0 - 109.167.255.255 ru -109.168.0.0 - 109.168.116.39 it -109.168.116.40 - 109.168.116.47 fr -109.168.116.48 - 109.168.127.255 it +109.168.0.0 - 109.168.127.255 it 109.168.128.0 - 109.168.255.255 ru -109.169.0.0 - 109.169.11.207 gb -109.169.11.208 - 109.169.11.223 us -109.169.11.224 - 109.169.17.127 gb -109.169.17.128 - 109.169.17.191 us -109.169.17.192 - 109.169.17.255 sg -109.169.18.0 - 109.169.21.255 gb -109.169.22.0 - 109.169.22.255 gr -109.169.23.0 - 109.169.23.255 gb -109.169.24.0 - 109.169.24.127 us -109.169.24.128 - 109.169.24.255 gb -109.169.25.0 - 109.169.25.31 us -109.169.25.32 - 109.169.32.127 gb -109.169.32.128 - 109.169.32.159 sg -109.169.32.160 - 109.169.34.63 gb -109.169.34.64 - 109.169.34.127 cy -109.169.34.128 - 109.169.34.191 gr -109.169.34.192 - 109.169.35.191 gb -109.169.35.192 - 109.169.35.223 vg -109.169.35.224 - 109.169.36.207 gb -109.169.36.208 - 109.169.36.223 us -109.169.36.224 - 109.169.38.255 gb -109.169.39.0 - 109.169.39.127 ro -109.169.39.128 - 109.169.55.255 gb -109.169.56.0 - 109.169.73.255 us -109.169.74.0 - 109.169.79.255 gb -109.169.80.0 - 109.169.85.255 us -109.169.86.0 - 109.169.95.255 gb +109.169.0.0 - 109.169.10.159 gb +109.169.10.160 - 109.169.10.191 ch +109.169.10.192 - 109.169.95.255 gb 109.169.96.0 - 109.169.127.255 no 109.169.128.0 - 109.170.127.255 ru 109.170.128.0 - 109.170.255.255 gb @@ -64458,8 +45456,12 @@ 109.174.0.0 - 109.174.127.255 ru 109.174.128.0 - 109.174.255.255 gb 109.175.0.0 - 109.175.127.255 ba -109.175.128.0 - 109.176.255.255 gb -109.177.0.0 - 109.177.255.255 ru +109.175.128.0 - 109.175.183.255 gb +109.175.184.0 - 109.175.184.255 nl +109.175.185.0 - 109.175.240.223 gb +109.175.240.224 - 109.175.240.239 nl +109.175.240.240 - 109.176.255.255 gb +109.177.0.0 - 109.177.255.255 ae 109.178.0.0 - 109.178.255.255 gr 109.179.0.0 - 109.179.255.255 no 109.180.0.0 - 109.181.255.255 gb @@ -64483,7 +45485,7 @@ 109.196.112.0 - 109.196.127.255 pl 109.196.128.0 - 109.196.143.255 ru 109.196.144.0 - 109.196.159.255 pl -109.196.160.0 - 109.196.191.255 ua +109.196.176.0 - 109.196.191.255 ua 109.196.192.0 - 109.196.223.255 ru 109.196.224.0 - 109.196.255.255 pl 109.197.0.0 - 109.197.7.255 no @@ -64497,7 +45499,11 @@ 109.197.96.0 - 109.197.103.255 pl 109.197.104.0 - 109.197.111.255 fr 109.197.112.0 - 109.197.159.255 ru -109.197.160.0 - 109.197.167.255 ro +109.197.160.0 - 109.197.161.255 se +109.197.162.0 - 109.197.163.255 ru +109.197.164.0 - 109.197.164.255 pl +109.197.165.0 - 109.197.165.255 be +109.197.166.0 - 109.197.167.255 ua 109.197.168.0 - 109.197.175.255 pl 109.197.176.0 - 109.197.183.255 fr 109.197.184.0 - 109.197.191.255 pl @@ -64516,7 +45522,7 @@ 109.199.0.0 - 109.199.31.255 pl 109.199.32.0 - 109.199.63.255 hu 109.199.64.0 - 109.199.95.255 pl -109.199.96.0 - 109.199.127.255 ro +109.199.96.0 - 109.199.127.255 us 109.199.128.0 - 109.199.159.255 bg 109.199.160.0 - 109.199.191.255 de 109.199.192.0 - 109.199.223.255 no @@ -64527,73 +45533,72 @@ 109.200.96.0 - 109.200.127.255 ru 109.200.128.0 - 109.200.159.255 ua 109.200.160.0 - 109.200.191.255 ye -109.200.192.0 - 109.200.211.255 nl +109.200.192.0 - 109.200.207.255 nl +109.200.208.0 - 109.200.211.255 jp 109.200.212.0 - 109.200.215.255 au -109.200.216.0 - 109.200.217.255 nl -109.200.218.0 - 109.200.218.255 us +109.200.216.0 - 109.200.218.255 nl 109.200.219.0 - 109.200.219.255 gb 109.200.220.0 - 109.200.223.255 jp 109.200.224.0 - 109.200.255.255 ua 109.201.0.0 - 109.201.31.255 ir -109.201.32.0 - 109.201.63.255 ro +109.201.32.0 - 109.201.63.255 kz 109.201.64.0 - 109.201.127.255 ru -109.201.128.0 - 109.201.159.255 nl +109.201.128.0 - 109.201.143.211 nl +109.201.143.212 - 109.201.143.212 de +109.201.143.213 - 109.201.159.255 nl 109.201.160.0 - 109.201.191.255 kg 109.201.192.0 - 109.201.223.255 ru 109.201.224.0 - 109.201.255.255 ua 109.202.0.0 - 109.202.63.255 ru 109.202.64.0 - 109.202.95.255 cz -109.202.96.0 - 109.202.111.255 nl -109.202.112.0 - 109.202.113.255 gi -109.202.114.0 - 109.202.119.255 im +109.202.96.0 - 109.202.109.255 nl +109.202.110.0 - 109.202.110.127 be +109.202.110.128 - 109.202.111.255 nl +109.202.112.0 - 109.202.119.255 im 109.202.120.0 - 109.202.127.255 si 109.202.128.0 - 109.202.159.255 dk 109.202.160.0 - 109.202.191.255 ru 109.202.192.0 - 109.202.223.255 ch -109.202.224.0 - 109.202.255.255 gb +109.202.224.0 - 109.202.242.255 gb +109.202.243.0 - 109.202.243.255 be +109.202.244.0 - 109.202.255.255 gb 109.203.0.0 - 109.203.31.255 no -109.203.32.0 - 109.203.63.255 ch -109.203.64.0 - 109.203.71.255 fr -109.203.72.0 - 109.203.95.255 lu -109.203.96.0 - 109.203.105.137 gb -109.203.105.138 - 109.203.105.139 in -109.203.105.140 - 109.203.127.255 gb -109.203.128.0 - 109.203.159.255 es -109.203.160.0 - 109.203.191.255 ir +109.203.32.0 - 109.203.35.255 ch +109.203.36.0 - 109.203.39.255 fr +109.203.40.0 - 109.203.63.255 ch +109.203.64.0 - 109.203.87.255 fr +109.203.88.0 - 109.203.95.255 lu +109.203.96.0 - 109.203.127.255 gb +109.203.128.0 - 109.203.191.255 ir 109.203.192.0 - 109.203.223.255 ru -109.203.224.0 - 109.203.231.255 fr -109.203.232.0 - 109.203.255.255 mq +109.203.224.0 - 109.203.226.255 fr +109.203.227.0 - 109.203.227.255 mq +109.203.228.0 - 109.203.229.255 fr +109.203.230.0 - 109.203.230.255 mq +109.203.231.0 - 109.203.231.255 fr +109.203.232.0 - 109.203.232.255 gp +109.203.233.0 - 109.203.235.255 mq +109.203.236.0 - 109.203.236.255 gp +109.203.237.0 - 109.203.239.255 mq +109.203.240.0 - 109.203.240.255 gp +109.203.241.0 - 109.203.245.255 mq +109.203.246.0 - 109.203.246.255 gp +109.203.247.0 - 109.203.255.255 mq 109.204.0.0 - 109.204.127.255 gb 109.204.128.0 - 109.204.255.255 fi 109.205.0.0 - 109.205.7.255 fr -109.205.8.0 - 109.205.8.95 no -109.205.8.96 - 109.205.8.103 gb -109.205.8.104 - 109.205.9.95 no -109.205.9.96 - 109.205.9.127 gb -109.205.9.128 - 109.205.9.159 no -109.205.9.160 - 109.205.9.191 de -109.205.9.192 - 109.205.9.223 ne -109.205.9.224 - 109.205.9.255 no -109.205.10.0 - 109.205.10.31 us -109.205.10.32 - 109.205.10.47 no -109.205.10.48 - 109.205.10.63 us -109.205.10.64 - 109.205.10.127 no -109.205.10.128 - 109.205.10.131 us -109.205.10.132 - 109.205.10.135 no -109.205.10.136 - 109.205.10.159 us -109.205.10.160 - 109.205.10.255 no -109.205.11.0 - 109.205.11.7 hk -109.205.11.8 - 109.205.11.127 no -109.205.11.128 - 109.205.11.191 us -109.205.11.192 - 109.205.11.255 no -109.205.12.0 - 109.205.12.15 cn -109.205.12.16 - 109.205.12.31 sg -109.205.12.32 - 109.205.12.63 au -109.205.12.64 - 109.205.12.255 no -109.205.13.0 - 109.205.13.63 au -109.205.13.64 - 109.205.13.255 no +109.205.8.0 - 109.205.9.255 no +109.205.10.0 - 109.205.10.255 us +109.205.11.0 - 109.205.11.31 no +109.205.11.32 - 109.205.11.63 hk +109.205.11.64 - 109.205.11.95 no +109.205.11.96 - 109.205.11.103 sg +109.205.11.104 - 109.205.11.111 no +109.205.11.112 - 109.205.11.127 sg +109.205.11.128 - 109.205.11.255 no +109.205.12.0 - 109.205.13.255 us 109.205.14.0 - 109.205.14.255 au -109.205.15.0 - 109.205.15.255 sg +109.205.15.0 - 109.205.15.255 nl 109.205.16.0 - 109.205.23.255 it 109.205.24.0 - 109.205.31.255 ae 109.205.32.0 - 109.205.39.255 ba @@ -64622,21 +45627,21 @@ 109.205.216.0 - 109.205.223.255 se 109.205.224.0 - 109.205.231.255 gb 109.205.232.0 - 109.205.239.255 lt -109.205.240.0 - 109.205.246.255 cz -109.205.247.0 - 109.205.255.255 ru +109.205.240.0 - 109.205.242.255 cz +109.205.243.0 - 109.205.243.255 sk +109.205.244.0 - 109.205.247.255 cz +109.205.248.0 - 109.205.255.255 ru 109.206.0.0 - 109.206.31.255 ro 109.206.32.0 - 109.206.63.255 ua -109.206.64.0 - 109.206.95.255 ro +109.206.64.0 - 109.206.95.255 sa 109.206.96.0 - 109.206.127.255 rs 109.206.128.0 - 109.206.159.255 ru -109.206.160.0 - 109.206.191.255 eu +109.206.160.0 - 109.206.191.255 nl 109.206.192.0 - 109.206.223.255 pl -109.206.224.0 - 109.206.255.255 ro 109.207.0.0 - 109.207.15.255 ru 109.207.16.0 - 109.207.31.255 gb 109.207.32.0 - 109.207.47.255 rs 109.207.48.0 - 109.207.63.255 pl -109.207.64.0 - 109.207.79.255 ua 109.207.80.0 - 109.207.95.255 ru 109.207.96.0 - 109.207.111.255 pl 109.207.112.0 - 109.207.127.255 ua @@ -64675,17 +45680,18 @@ 109.230.0.0 - 109.230.63.255 sk 109.230.64.0 - 109.230.127.255 ir 109.230.128.0 - 109.230.191.255 ru -109.230.192.0 - 109.230.201.255 de -109.230.202.0 - 109.230.202.255 ch -109.230.203.0 - 109.230.203.255 au -109.230.204.0 - 109.230.231.255 de -109.230.232.0 - 109.230.235.255 gb -109.230.236.0 - 109.230.255.255 de +109.230.192.0 - 109.230.198.255 de +109.230.199.0 - 109.230.199.255 se +109.230.200.0 - 109.230.222.255 de +109.230.223.0 - 109.230.223.255 ir +109.230.224.0 - 109.230.246.255 de +109.230.247.0 - 109.230.247.255 ir +109.230.248.0 - 109.230.255.255 de 109.231.0.0 - 109.231.63.255 pl 109.231.64.0 - 109.231.127.255 gb 109.231.128.0 - 109.231.191.255 cz 109.231.192.0 - 109.231.255.255 gb -109.232.0.0 - 109.232.7.255 kz +109.232.0.0 - 109.232.7.255 ir 109.232.8.0 - 109.232.15.255 nl 109.232.16.0 - 109.232.23.255 es 109.232.24.0 - 109.232.31.255 pl @@ -64699,12 +45705,13 @@ 109.232.88.0 - 109.232.95.255 ch 109.232.96.0 - 109.232.103.255 fr 109.232.104.0 - 109.232.111.255 ru -109.232.112.0 - 109.232.119.255 by +109.232.112.0 - 109.232.115.255 es +109.232.116.0 - 109.232.119.255 by 109.232.120.0 - 109.232.135.255 de 109.232.136.0 - 109.232.143.255 it 109.232.144.0 - 109.232.151.255 cz 109.232.152.0 - 109.232.159.255 gb -109.232.160.0 - 109.232.175.255 de +109.232.168.0 - 109.232.175.255 de 109.232.176.0 - 109.232.183.255 gb 109.232.184.0 - 109.232.191.255 ru 109.232.192.0 - 109.232.199.255 fr @@ -64714,16 +45721,15 @@ 109.232.224.0 - 109.232.231.255 nl 109.232.232.0 - 109.232.239.255 fr 109.232.240.0 - 109.232.247.255 pl -109.232.248.0 - 109.232.251.255 ru -109.232.252.0 - 109.232.252.255 ua -109.232.253.0 - 109.232.255.255 ru +109.232.248.0 - 109.232.255.255 ru 109.233.0.0 - 109.233.7.255 no -109.233.8.0 - 109.233.15.255 gb +109.233.8.0 - 109.233.8.47 gb +109.233.8.48 - 109.233.8.48 eu +109.233.8.49 - 109.233.15.255 gb 109.233.16.0 - 109.233.23.255 lb 109.233.24.0 - 109.233.31.255 at 109.233.32.0 - 109.233.55.255 gb -109.233.56.0 - 109.233.62.255 nl -109.233.63.0 - 109.233.63.255 no +109.233.56.0 - 109.233.63.255 no 109.233.64.0 - 109.233.79.255 cz 109.233.80.0 - 109.233.87.255 sm 109.233.88.0 - 109.233.95.255 pl @@ -64734,20 +45740,12 @@ 109.233.136.0 - 109.233.159.255 de 109.233.160.0 - 109.233.167.255 cz 109.233.168.0 - 109.233.175.255 ru -109.233.176.0 - 109.233.176.255 eu -109.233.177.0 - 109.233.177.31 ch -109.233.177.32 - 109.233.177.255 eu -109.233.178.0 - 109.233.178.31 gb -109.233.178.32 - 109.233.178.255 eu -109.233.179.0 - 109.233.181.255 ch -109.233.182.0 - 109.233.182.247 eu -109.233.182.248 - 109.233.183.255 ch +109.233.176.0 - 109.233.183.255 eu 109.233.184.0 - 109.233.191.255 rs 109.233.192.0 - 109.233.199.255 md 109.233.200.0 - 109.233.215.255 ru 109.233.216.0 - 109.233.223.255 it -109.233.224.0 - 109.233.239.255 ru -109.233.240.0 - 109.233.247.255 kz +109.233.224.0 - 109.233.247.255 ru 109.233.248.0 - 109.233.255.255 de 109.234.0.0 - 109.234.7.255 fr 109.234.8.0 - 109.234.15.255 ru @@ -64755,17 +45753,13 @@ 109.234.24.0 - 109.234.39.255 ru 109.234.40.0 - 109.234.47.255 cz 109.234.48.0 - 109.234.63.255 it -109.234.64.0 - 109.234.64.255 fr -109.234.65.0 - 109.234.71.255 es -109.234.72.0 - 109.234.79.255 gb +109.234.64.0 - 109.234.71.255 es +109.234.72.0 - 109.234.79.255 lu 109.234.80.0 - 109.234.95.255 es 109.234.96.0 - 109.234.103.255 ie -109.234.104.0 - 109.234.109.255 de -109.234.110.0 - 109.234.111.255 pl +109.234.104.0 - 109.234.111.255 de 109.234.112.0 - 109.234.119.255 ge -109.234.120.0 - 109.234.125.87 de -109.234.125.88 - 109.234.125.95 ch -109.234.125.96 - 109.234.127.255 de +109.234.120.0 - 109.234.127.255 de 109.234.128.0 - 109.234.135.255 ru 109.234.136.0 - 109.234.143.255 it 109.234.144.0 - 109.234.151.255 at @@ -64775,9 +45769,7 @@ 109.234.184.0 - 109.234.191.255 de 109.234.192.0 - 109.234.207.255 gb 109.234.208.0 - 109.234.215.255 es -109.234.216.0 - 109.234.218.31 de -109.234.218.32 - 109.234.218.47 ch -109.234.218.48 - 109.234.223.255 de +109.234.216.0 - 109.234.223.255 de 109.234.224.0 - 109.234.224.255 us 109.234.225.0 - 109.234.231.255 gb 109.234.232.0 - 109.234.239.255 al @@ -64789,12 +45781,7 @@ 109.235.24.0 - 109.235.31.255 ru 109.235.32.0 - 109.235.39.255 nl 109.235.40.0 - 109.235.47.255 de -109.235.48.0 - 109.235.54.255 nl -109.235.55.0 - 109.235.55.63 sc -109.235.55.64 - 109.235.55.127 nl -109.235.55.128 - 109.235.55.191 ru -109.235.55.192 - 109.235.55.223 us -109.235.55.224 - 109.235.55.255 nl +109.235.48.0 - 109.235.55.255 nl 109.235.56.0 - 109.235.63.255 de 109.235.64.0 - 109.235.71.255 lt 109.235.72.0 - 109.235.79.255 nl @@ -64813,101 +45800,31 @@ 109.235.176.0 - 109.235.183.255 cz 109.235.184.0 - 109.235.191.255 ru 109.235.192.0 - 109.235.199.255 az -109.235.200.0 - 109.235.202.255 se -109.235.203.0 - 109.235.203.15 af -109.235.203.16 - 109.235.203.47 us -109.235.203.48 - 109.235.203.127 se -109.235.203.128 - 109.235.203.175 us -109.235.203.176 - 109.235.203.183 af -109.235.203.184 - 109.235.203.191 se -109.235.203.192 - 109.235.203.207 us -109.235.203.208 - 109.235.203.215 zm -109.235.203.216 - 109.235.203.223 iq -109.235.203.224 - 109.235.203.231 kz -109.235.203.232 - 109.235.203.255 se -109.235.204.0 - 109.235.204.39 de -109.235.204.40 - 109.235.204.223 us -109.235.204.224 - 109.235.204.255 de -109.235.205.0 - 109.235.205.11 af -109.235.205.12 - 109.235.205.15 tm -109.235.205.16 - 109.235.205.31 af -109.235.205.32 - 109.235.205.35 ng -109.235.205.36 - 109.235.205.43 af -109.235.205.44 - 109.235.205.47 iq -109.235.205.48 - 109.235.205.67 af -109.235.205.68 - 109.235.205.71 gh -109.235.205.72 - 109.235.205.79 af -109.235.205.80 - 109.235.205.83 de -109.235.205.84 - 109.235.205.87 ng -109.235.205.88 - 109.235.205.91 cg -109.235.205.92 - 109.235.205.95 de -109.235.205.96 - 109.235.205.99 cg -109.235.205.100 - 109.235.205.107 ng -109.235.205.108 - 109.235.205.111 zm -109.235.205.112 - 109.235.205.135 de -109.235.205.136 - 109.235.205.139 af -109.235.205.140 - 109.235.205.143 de -109.235.205.144 - 109.235.205.147 ng -109.235.205.148 - 109.235.205.255 de -109.235.206.0 - 109.235.206.15 af -109.235.206.16 - 109.235.206.23 iq -109.235.206.24 - 109.235.206.39 af -109.235.206.40 - 109.235.207.255 de +109.235.200.0 - 109.235.203.31 gi +109.235.203.32 - 109.235.203.47 us +109.235.203.48 - 109.235.203.95 gi +109.235.203.96 - 109.235.203.111 us +109.235.203.112 - 109.235.203.255 gi +109.235.204.0 - 109.235.207.255 de 109.235.208.0 - 109.235.223.255 ru 109.235.224.0 - 109.235.239.255 de 109.235.240.0 - 109.235.247.255 ee -109.235.248.0 - 109.235.249.240 tr -109.235.249.241 - 109.235.249.255 de -109.235.250.0 - 109.235.250.104 tr -109.235.250.105 - 109.235.250.112 ca -109.235.250.113 - 109.235.251.192 tr -109.235.251.193 - 109.235.251.198 gb -109.235.251.199 - 109.235.251.224 tr -109.235.251.225 - 109.235.251.230 gb -109.235.251.231 - 109.235.253.0 tr -109.235.253.1 - 109.235.253.30 us -109.235.253.31 - 109.235.253.37 tr -109.235.253.38 - 109.235.253.57 us -109.235.253.58 - 109.235.253.71 tr -109.235.253.72 - 109.235.253.131 us -109.235.253.132 - 109.235.253.144 tr -109.235.253.145 - 109.235.253.145 us -109.235.253.146 - 109.235.253.152 tr -109.235.253.153 - 109.235.253.154 us -109.235.253.155 - 109.235.253.160 tr -109.235.253.161 - 109.235.253.208 us -109.235.253.209 - 109.235.253.213 tr -109.235.253.214 - 109.235.253.217 us -109.235.253.218 - 109.235.253.229 tr -109.235.253.230 - 109.235.253.239 us -109.235.253.240 - 109.235.255.255 tr -109.236.0.0 - 109.236.31.255 it +109.235.248.0 - 109.235.255.255 tr +109.236.0.0 - 109.236.7.255 it +109.236.8.0 - 109.236.11.255 ie +109.236.12.0 - 109.236.31.255 it 109.236.32.0 - 109.236.47.255 al -109.236.48.0 - 109.236.79.255 ru +109.236.64.0 - 109.236.79.255 ru 109.236.80.0 - 109.236.95.255 nl 109.236.96.0 - 109.236.111.255 ru 109.236.112.0 - 109.236.127.255 sk 109.236.128.0 - 109.236.143.255 be -109.236.144.0 - 109.236.144.15 a2 -109.236.144.16 - 109.236.144.55 lb -109.236.144.56 - 109.236.144.255 a2 -109.236.145.0 - 109.236.145.31 iq -109.236.145.32 - 109.236.145.127 de -109.236.145.128 - 109.236.145.255 lb -109.236.146.0 - 109.236.146.15 a2 -109.236.146.16 - 109.236.147.255 de -109.236.148.0 - 109.236.151.255 a2 -109.236.152.0 - 109.236.158.255 de -109.236.159.0 - 109.236.159.255 a2 +109.236.144.0 - 109.236.147.255 de +109.236.148.0 - 109.236.155.255 a2 +109.236.156.0 - 109.236.159.255 de 109.236.160.0 - 109.236.175.255 gb -109.236.176.0 - 109.236.177.127 dk -109.236.177.128 - 109.236.177.159 se -109.236.177.160 - 109.236.184.15 dk -109.236.184.16 - 109.236.184.31 se -109.236.184.32 - 109.236.191.255 dk -109.236.192.0 - 109.236.205.255 es -109.236.206.0 - 109.236.206.255 gb -109.236.207.0 - 109.236.207.255 fr +109.236.176.0 - 109.236.191.255 dk +109.236.192.0 - 109.236.207.255 es 109.236.208.0 - 109.237.15.255 ru 109.237.16.0 - 109.237.31.255 gb 109.237.32.0 - 109.237.47.255 ba @@ -64926,24 +45843,11 @@ 109.237.240.0 - 109.238.15.255 fr 109.238.16.0 - 109.238.31.255 it 109.238.32.0 - 109.238.47.255 cz -109.238.48.0 - 109.238.61.255 dk -109.238.62.0 - 109.238.63.63 lu -109.238.63.64 - 109.238.63.255 dk +109.238.48.0 - 109.238.63.255 dk 109.238.64.0 - 109.238.79.255 gb 109.238.80.0 - 109.238.111.255 ru 109.238.112.0 - 109.238.127.255 it -109.238.128.0 - 109.238.128.127 us -109.238.128.128 - 109.238.128.255 gb -109.238.129.0 - 109.238.129.127 be -109.238.129.128 - 109.238.131.255 gb -109.238.132.0 - 109.238.132.255 us -109.238.133.0 - 109.238.134.255 gb -109.238.135.0 - 109.238.135.255 be -109.238.136.0 - 109.238.137.255 gb -109.238.138.0 - 109.238.139.255 us -109.238.140.0 - 109.238.140.255 hk -109.238.141.0 - 109.238.142.255 ca -109.238.143.0 - 109.238.143.255 gb +109.238.128.0 - 109.238.143.255 gb 109.238.144.0 - 109.238.159.255 sy 109.238.160.0 - 109.238.175.255 kz 109.238.176.0 - 109.238.191.255 ir @@ -64967,14 +45871,26 @@ 109.239.224.0 - 109.239.239.255 no 109.239.240.0 - 109.239.255.255 it 109.240.0.0 - 109.240.255.255 fi -109.241.0.0 - 109.241.255.255 ru +109.241.0.0 - 109.241.255.255 pl 109.242.0.0 - 109.242.255.255 gr 109.243.0.0 - 109.243.255.255 pl 109.244.0.0 - 109.244.255.255 ru 109.245.0.0 - 109.245.255.255 rs 109.246.0.0 - 109.246.255.255 gb 109.247.0.0 - 109.247.255.255 no -109.248.0.0 - 109.248.255.255 ru +109.248.0.0 - 109.248.143.255 ru +109.248.144.0 - 109.248.159.255 kz +109.248.160.0 - 109.248.207.255 ru +109.248.208.0 - 109.248.211.255 kz +109.248.212.0 - 109.248.218.255 ru +109.248.219.0 - 109.248.219.255 kz +109.248.220.0 - 109.248.226.255 ru +109.248.227.0 - 109.248.227.255 es +109.248.228.0 - 109.248.235.255 ru +109.248.236.0 - 109.248.236.255 kz +109.248.237.0 - 109.248.239.255 ru +109.248.240.0 - 109.248.243.255 ge +109.248.244.0 - 109.248.255.255 ru 109.249.0.0 - 109.249.255.255 gb 109.250.0.0 - 109.250.255.255 de 109.251.0.0 - 109.251.255.255 ua @@ -65005,11 +45921,17 @@ 110.32.0.0 - 110.33.255.255 au 110.34.0.0 - 110.34.31.255 np 110.34.32.0 - 110.34.39.255 pk +110.34.40.0 - 110.34.47.255 cn 110.34.48.0 - 110.34.51.255 nz 110.34.52.0 - 110.34.55.255 au -110.34.56.0 - 110.34.63.255 hk +110.34.56.0 - 110.34.63.255 jp 110.34.64.0 - 110.34.127.255 kr -110.34.128.0 - 110.34.255.255 th +110.34.128.0 - 110.34.139.255 th +110.34.140.0 - 110.34.143.255 cn +110.34.144.0 - 110.34.187.255 th +110.34.188.0 - 110.34.191.255 sg +110.34.192.0 - 110.34.239.255 th +110.34.240.0 - 110.34.255.255 us 110.35.0.0 - 110.35.63.255 kr 110.35.64.0 - 110.35.79.255 vn 110.35.80.0 - 110.35.87.255 id @@ -65017,6 +45939,10 @@ 110.35.96.0 - 110.35.255.255 kr 110.36.0.0 - 110.39.255.255 pk 110.40.0.0 - 110.43.255.255 cn +110.44.0.0 - 110.44.3.255 bd +110.44.4.0 - 110.44.7.255 hk +110.44.8.0 - 110.44.11.255 in +110.44.12.0 - 110.44.15.255 cn 110.44.16.0 - 110.44.19.255 nz 110.44.20.0 - 110.44.23.255 jp 110.44.24.0 - 110.44.31.255 au @@ -65057,7 +45983,9 @@ 110.74.224.0 - 110.74.255.255 jp 110.75.0.0 - 110.76.63.255 cn 110.76.64.0 - 110.76.127.255 kr -110.76.128.0 - 110.76.139.255 au +110.76.128.0 - 110.76.131.255 bd +110.76.132.0 - 110.76.135.255 cn +110.76.136.0 - 110.76.139.255 au 110.76.140.0 - 110.76.143.255 kr 110.76.144.0 - 110.76.151.255 id 110.76.152.0 - 110.76.155.255 th @@ -65076,6 +46004,8 @@ 110.92.20.0 - 110.92.23.255 kr 110.92.24.0 - 110.92.31.255 ph 110.92.32.0 - 110.92.63.255 jp +110.92.64.0 - 110.92.67.255 hk +110.92.68.0 - 110.92.71.255 cn 110.92.72.0 - 110.92.75.255 id 110.92.76.0 - 110.92.79.255 hk 110.92.80.0 - 110.92.95.255 jp @@ -65137,7 +46067,10 @@ 110.232.148.0 - 110.232.151.255 au 110.232.152.0 - 110.232.159.255 jp 110.232.160.0 - 110.232.175.255 ph -110.232.176.0 - 110.232.179.255 au +110.232.176.0 - 110.232.176.255 hk +110.232.177.0 - 110.232.177.255 jp +110.232.178.0 - 110.232.178.255 ap +110.232.179.0 - 110.232.179.255 au 110.232.180.0 - 110.232.183.255 in 110.232.184.0 - 110.232.187.255 au 110.232.188.0 - 110.232.191.255 pk @@ -65156,7 +46089,9 @@ 111.65.224.0 - 111.65.239.255 nz 111.65.240.0 - 111.65.255.255 vn 111.66.0.0 - 111.66.255.255 cn -111.67.0.0 - 111.67.31.255 au +111.67.0.0 - 111.67.18.160 au +111.67.18.161 - 111.67.18.161 nz +111.67.18.162 - 111.67.31.255 au 111.67.32.0 - 111.67.47.255 my 111.67.48.0 - 111.67.63.255 tw 111.67.64.0 - 111.67.95.255 id @@ -65176,12 +46111,16 @@ 111.70.0.0 - 111.71.255.255 tw 111.72.0.0 - 111.79.255.255 cn 111.80.0.0 - 111.83.255.255 tw -111.84.0.0 - 111.84.255.255 th +111.84.0.0 - 111.84.191.255 th +111.84.192.0 - 111.84.195.255 mm +111.84.196.0 - 111.84.255.255 th 111.85.0.0 - 111.85.255.255 cn 111.86.0.0 - 111.87.255.255 jp 111.88.0.0 - 111.88.255.255 pk 111.89.0.0 - 111.90.127.255 jp -111.90.128.0 - 111.90.159.255 my +111.90.128.0 - 111.90.149.255 my +111.90.150.0 - 111.90.150.255 a2 +111.90.151.0 - 111.90.159.255 my 111.90.160.0 - 111.90.167.255 jp 111.90.168.0 - 111.90.175.255 in 111.90.176.0 - 111.90.191.255 kh @@ -65198,13 +46137,13 @@ 111.92.160.0 - 111.92.175.255 id 111.92.176.0 - 111.92.179.255 gu 111.92.180.0 - 111.92.183.255 th -111.92.184.0 - 111.92.187.255 au +111.92.184.0 - 111.92.187.255 hk 111.92.188.0 - 111.92.191.255 kr 111.92.192.0 - 111.92.223.255 sg 111.92.224.0 - 111.92.239.255 hk 111.92.240.0 - 111.92.243.255 kh 111.92.244.0 - 111.92.247.255 jp -111.92.248.0 - 111.92.255.255 bd +111.92.248.0 - 111.92.255.255 cn 111.93.0.0 - 111.93.255.255 in 111.94.0.0 - 111.95.255.255 id 111.96.0.0 - 111.111.255.255 jp @@ -65247,30 +46186,42 @@ 111.218.0.0 - 111.219.255.255 kr 111.220.0.0 - 111.220.255.255 au 111.221.0.0 - 111.221.7.255 bd -111.221.8.0 - 111.221.31.255 sg +111.221.8.0 - 111.221.23.255 sg +111.221.24.0 - 111.221.26.31 jp +111.221.26.32 - 111.221.26.127 sg +111.221.26.128 - 111.221.27.255 jp +111.221.28.0 - 111.221.28.255 cn +111.221.29.0 - 111.221.29.255 hk +111.221.30.0 - 111.221.31.255 sg 111.221.32.0 - 111.221.39.255 kr 111.221.40.0 - 111.221.43.255 id 111.221.44.0 - 111.221.47.255 sg 111.221.48.0 - 111.221.55.255 my 111.221.56.0 - 111.221.59.255 au 111.221.60.0 - 111.221.63.255 jp -111.221.64.0 - 111.221.127.255 sg +111.221.64.0 - 111.221.69.255 hk +111.221.70.0 - 111.221.75.255 sg +111.221.76.0 - 111.221.79.255 hk +111.221.80.0 - 111.221.111.255 sg +111.221.112.0 - 111.221.115.255 hk +111.221.116.0 - 111.221.119.255 sg +111.221.120.0 - 111.221.123.255 hk +111.221.124.0 - 111.221.127.255 sg 111.221.128.0 - 111.222.255.255 cn -111.223.0.0 - 111.223.31.255 ph +111.223.0.0 - 111.223.3.255 in +111.223.4.0 - 111.223.19.255 cn +111.223.20.0 - 111.223.31.255 in 111.223.32.0 - 111.223.63.255 th 111.223.64.0 - 111.223.127.255 sg 111.223.128.0 - 111.223.191.255 lk 111.223.192.0 - 111.223.223.255 jp 111.223.224.0 - 111.223.239.255 au 111.223.240.0 - 111.223.243.255 cn -111.223.244.0 - 111.223.247.255 af 111.223.248.0 - 111.223.251.255 cn 111.223.252.0 - 111.223.255.255 id 111.224.0.0 - 111.231.255.255 cn 111.232.0.0 - 111.235.63.255 jp -111.235.64.0 - 111.235.67.255 in -111.235.68.0 - 111.235.71.255 th -111.235.72.0 - 111.235.75.255 in +111.235.64.0 - 111.235.75.255 in 111.235.76.0 - 111.235.79.255 jp 111.235.80.0 - 111.235.95.255 ph 111.235.96.0 - 111.235.127.255 cn @@ -65321,7 +46272,8 @@ 112.121.0.0 - 112.121.31.255 kr 112.121.32.0 - 112.121.47.255 tw 112.121.48.0 - 112.121.63.255 in -112.121.64.0 - 112.121.127.255 tw +112.121.64.0 - 112.121.107.255 tw +112.121.108.0 - 112.121.127.255 hk 112.121.128.0 - 112.121.159.255 th 112.121.160.0 - 112.121.191.255 hk 112.121.192.0 - 112.121.255.255 kr @@ -65332,7 +46284,9 @@ 112.136.0.0 - 112.136.127.255 jp 112.136.128.0 - 112.136.255.255 kr 112.137.0.0 - 112.137.15.255 bd -112.137.16.0 - 112.137.31.255 hk +112.137.16.0 - 112.137.16.255 hk +112.137.17.0 - 112.137.17.255 gb +112.137.18.0 - 112.137.31.255 hk 112.137.32.0 - 112.137.47.255 jp 112.137.48.0 - 112.137.55.255 cn 112.137.56.0 - 112.137.127.255 jp @@ -65348,6 +46302,7 @@ 112.140.168.0 - 112.140.175.255 jp 112.140.176.0 - 112.140.183.255 au 112.140.184.0 - 112.140.187.255 sg +112.140.188.0 - 112.140.191.255 in 112.140.192.0 - 112.140.255.255 kr 112.141.0.0 - 112.141.255.255 au 112.142.0.0 - 112.143.255.255 th @@ -65384,7 +46339,9 @@ 113.11.224.0 - 113.11.231.255 in 113.11.232.0 - 113.11.235.255 au 113.11.236.0 - 113.11.239.255 my -113.11.240.0 - 113.11.247.255 vu +113.11.240.0 - 113.11.244.255 vu +113.11.245.0 - 113.11.245.255 au +113.11.246.0 - 113.11.247.255 vu 113.11.248.0 - 113.11.255.255 sg 113.12.0.0 - 113.18.255.255 cn 113.19.0.0 - 113.19.255.255 in @@ -65410,23 +46367,34 @@ 113.21.64.0 - 113.21.79.255 in 113.21.80.0 - 113.21.95.255 tw 113.21.96.0 - 113.21.127.255 nc -113.21.128.0 - 113.21.159.255 my +113.21.128.0 - 113.21.159.255 ap 113.21.160.0 - 113.21.191.255 tw 113.21.192.0 - 113.21.223.255 hk 113.21.224.0 - 113.21.227.255 nz 113.21.228.0 - 113.21.231.255 bd -113.21.232.0 - 113.21.239.255 jp +113.21.232.0 - 113.21.239.255 cn 113.21.240.0 - 113.21.247.255 th 113.21.248.0 - 113.21.255.255 jp 113.22.0.0 - 113.23.127.255 vn 113.23.128.0 - 113.23.255.255 my 113.24.0.0 - 113.27.255.255 cn 113.28.0.0 - 113.28.255.255 hk -113.29.0.0 - 113.29.127.255 jp +113.29.0.0 - 113.29.1.255 us +113.29.2.0 - 113.29.2.63 jp +113.29.2.64 - 113.29.17.255 us +113.29.18.0 - 113.29.18.255 au +113.29.19.0 - 113.29.36.127 us +113.29.36.128 - 113.29.36.255 hk +113.29.37.0 - 113.29.79.255 us +113.29.80.0 - 113.29.80.255 cn +113.29.81.0 - 113.29.127.255 us 113.29.128.0 - 113.29.207.255 kr 113.29.208.0 - 113.29.215.255 au 113.29.216.0 - 113.29.223.255 jp -113.29.224.0 - 113.29.239.255 sg +113.29.224.0 - 113.29.227.255 sg +113.29.228.0 - 113.29.229.255 hk +113.29.230.0 - 113.29.231.255 kr +113.29.232.0 - 113.29.239.255 sg 113.29.240.0 - 113.29.247.255 au 113.29.248.0 - 113.29.251.255 kh 113.29.252.0 - 113.29.255.255 hk @@ -65448,7 +46416,8 @@ 113.52.156.0 - 113.52.159.255 jp 113.52.160.0 - 113.52.191.255 cn 113.52.192.0 - 113.52.223.255 kr -113.52.224.0 - 113.52.239.255 au +113.52.228.0 - 113.52.231.255 cn +113.52.232.0 - 113.52.239.255 au 113.52.240.0 - 113.52.255.255 jp 113.53.0.0 - 113.53.255.255 th 113.54.0.0 - 113.59.127.255 cn @@ -65473,7 +46442,9 @@ 113.130.124.0 - 113.130.127.255 kh 113.130.128.0 - 113.131.255.255 kr 113.132.0.0 - 113.143.255.255 cn -113.144.0.0 - 113.159.255.255 jp +113.144.0.0 - 113.146.141.5 jp +113.146.141.6 - 113.146.141.6 ap +113.146.141.7 - 113.159.255.255 jp 113.160.0.0 - 113.191.255.255 vn 113.192.0.0 - 113.192.63.255 au 113.192.64.0 - 113.192.127.255 kr @@ -65494,8 +46465,9 @@ 113.197.96.0 - 113.197.99.255 nz 113.197.100.0 - 113.197.103.255 cn 113.197.104.0 - 113.197.104.255 in -113.197.105.0 - 113.197.105.255 hk -113.197.106.0 - 113.197.107.255 in +113.197.105.0 - 113.197.105.255 us +113.197.106.0 - 113.197.106.255 au +113.197.107.0 - 113.197.107.255 us 113.197.108.0 - 113.197.111.255 id 113.197.112.0 - 113.197.127.255 au 113.197.128.0 - 113.197.255.255 jp @@ -65506,11 +46478,17 @@ 113.203.128.0 - 113.203.255.255 pk 113.204.0.0 - 113.207.255.255 cn 113.208.0.0 - 113.208.63.255 jp -113.208.64.0 - 113.208.95.255 hk +113.208.64.0 - 113.208.67.255 a2 +113.208.68.0 - 113.208.71.255 ph +113.208.72.0 - 113.208.91.255 a2 +113.208.92.0 - 113.208.92.255 us +113.208.93.0 - 113.208.95.255 a2 113.208.96.0 - 113.209.255.255 cn 113.210.0.0 - 113.211.255.255 my 113.212.0.0 - 113.212.63.255 cn -113.212.64.0 - 113.212.95.255 in +113.212.64.0 - 113.212.69.9 in +113.212.69.10 - 113.212.69.10 ap +113.212.69.11 - 113.212.95.255 in 113.212.96.0 - 113.212.99.255 au 113.212.100.0 - 113.212.103.255 cn 113.212.104.0 - 113.212.107.255 jp @@ -65535,7 +46513,10 @@ 114.28.0.0 - 114.28.255.255 cn 114.29.0.0 - 114.29.191.255 kr 114.29.192.0 - 114.29.223.255 sg -114.29.224.0 - 114.29.255.255 kh +114.29.224.0 - 114.29.239.255 in +114.29.240.0 - 114.29.247.255 tw +114.29.248.0 - 114.29.251.255 in +114.29.252.0 - 114.29.255.255 my 114.30.0.0 - 114.30.31.255 kr 114.30.32.0 - 114.30.47.255 tw 114.30.48.0 - 114.30.63.255 kr @@ -65546,7 +46527,7 @@ 114.30.128.0 - 114.30.255.255 kr 114.31.0.0 - 114.31.31.255 bd 114.31.32.0 - 114.31.63.255 kr -114.31.64.0 - 114.31.71.255 mn +114.31.64.0 - 114.31.71.255 cn 114.31.72.0 - 114.31.79.255 au 114.31.80.0 - 114.31.95.255 jp 114.31.96.0 - 114.31.103.255 au @@ -65554,7 +46535,8 @@ 114.31.112.0 - 114.31.127.255 kr 114.31.128.0 - 114.31.191.255 in 114.31.192.0 - 114.31.207.255 au -114.31.208.0 - 114.31.215.255 nz +114.31.208.0 - 114.31.211.255 us +114.31.212.0 - 114.31.215.255 nz 114.31.216.0 - 114.31.223.255 jp 114.31.224.0 - 114.31.239.255 in 114.31.240.0 - 114.31.247.255 id @@ -65566,7 +46548,9 @@ 114.56.0.0 - 114.59.255.255 id 114.60.0.0 - 114.68.255.255 cn 114.69.0.0 - 114.69.175.255 jp -114.69.176.0 - 114.69.223.255 nc +114.69.176.0 - 114.69.185.255 nc +114.69.186.0 - 114.69.186.255 fr +114.69.187.0 - 114.69.223.255 nc 114.69.224.0 - 114.69.255.255 in 114.70.0.0 - 114.71.255.255 kr 114.72.0.0 - 114.78.255.255 au @@ -65580,7 +46564,9 @@ 114.110.0.0 - 114.110.15.255 cn 114.110.16.0 - 114.110.23.255 id 114.110.24.0 - 114.110.31.255 kr -114.110.32.0 - 114.110.39.255 nz +114.110.32.0 - 114.110.34.255 nz +114.110.35.0 - 114.110.35.255 au +114.110.36.0 - 114.110.39.255 nz 114.110.40.0 - 114.110.47.255 id 114.110.48.0 - 114.110.63.255 jp 114.110.64.0 - 114.110.127.255 cn @@ -65591,7 +46577,17 @@ 114.111.128.0 - 114.111.159.255 au 114.111.160.0 - 114.111.191.255 cn 114.111.192.0 - 114.111.255.255 kr -114.112.0.0 - 114.119.255.255 cn +114.112.0.0 - 114.112.223.255 cn +114.112.224.0 - 114.112.231.255 hk +114.112.232.0 - 114.112.235.255 cn +114.112.236.0 - 114.112.255.255 hk +114.113.0.0 - 114.113.191.255 cn +114.113.192.0 - 114.113.195.255 hk +114.113.196.0 - 114.113.239.255 cn +114.113.240.0 - 114.113.245.255 hk +114.113.246.0 - 114.113.251.255 cn +114.113.252.0 - 114.113.255.255 hk +114.114.0.0 - 114.119.255.255 cn 114.120.0.0 - 114.127.255.255 id 114.128.0.0 - 114.128.255.255 th 114.129.0.0 - 114.129.7.255 jp @@ -65608,10 +46604,12 @@ 114.132.0.0 - 114.132.255.255 cn 114.133.0.0 - 114.133.255.255 my 114.134.0.0 - 114.134.15.255 nz -114.134.16.0 - 114.134.31.255 pg -114.134.32.0 - 114.134.63.255 jp +114.134.16.0 - 114.134.27.255 in +114.134.28.0 - 114.134.63.255 jp 114.134.64.0 - 114.134.79.255 id -114.134.80.0 - 114.134.87.255 hk +114.134.80.0 - 114.134.85.255 hk +114.134.86.0 - 114.134.86.255 gb +114.134.87.0 - 114.134.87.255 hk 114.134.88.0 - 114.134.95.255 bd 114.134.96.0 - 114.134.159.255 jp 114.134.160.0 - 114.134.183.255 nz @@ -65625,12 +46623,16 @@ 114.141.32.0 - 114.141.39.255 jp 114.141.40.0 - 114.141.47.255 kr 114.141.48.0 - 114.141.63.255 id -114.141.64.0 - 114.141.71.255 in +114.141.64.0 - 114.141.71.255 cn 114.141.72.0 - 114.141.79.255 sg -114.141.80.0 - 114.141.87.255 bd +114.141.80.0 - 114.141.87.255 cn 114.141.88.0 - 114.141.95.255 id 114.141.96.0 - 114.141.111.255 au -114.141.112.0 - 114.141.127.255 nz +114.141.112.0 - 114.141.115.255 us +114.141.116.0 - 114.141.118.255 nz +114.141.119.0 - 114.141.120.255 us +114.141.121.0 - 114.141.122.255 nz +114.141.123.0 - 114.141.127.255 us 114.141.128.0 - 114.141.191.255 cn 114.141.192.0 - 114.141.207.255 au 114.141.208.0 - 114.141.215.255 sg @@ -65639,7 +46641,7 @@ 114.142.0.0 - 114.142.135.255 jp 114.142.136.0 - 114.142.143.255 in 114.142.144.0 - 114.142.159.255 hk -114.142.160.0 - 114.142.175.255 au +114.142.160.0 - 114.142.167.255 au 114.142.176.0 - 114.142.191.255 jp 114.142.192.0 - 114.142.255.255 gu 114.143.0.0 - 114.143.255.255 in @@ -65649,18 +46651,13 @@ 114.198.128.0 - 114.198.159.255 ph 114.198.160.0 - 114.198.191.255 tw 114.198.192.0 - 114.198.231.255 jp -114.198.232.0 - 114.198.232.255 sa -114.198.233.0 - 114.198.233.255 pk -114.198.234.0 - 114.198.234.255 kw -114.198.235.0 - 114.198.235.255 eg -114.198.236.0 - 114.198.236.255 ae -114.198.237.0 - 114.198.237.255 eg -114.198.238.0 - 114.198.238.255 kw -114.198.239.0 - 114.198.239.255 sa +114.198.232.0 - 114.198.239.255 pk 114.198.240.0 - 114.198.247.255 id -114.198.248.0 - 114.198.255.255 au +114.198.248.0 - 114.198.255.255 cn 114.199.0.0 - 114.199.63.255 kr -114.199.64.0 - 114.199.79.255 hk +114.199.64.0 - 114.199.70.255 hk +114.199.71.0 - 114.199.75.255 tw +114.199.76.0 - 114.199.79.255 hk 114.199.80.0 - 114.199.127.255 id 114.199.128.0 - 114.207.255.255 kr 114.208.0.0 - 114.255.255.255 cn @@ -65670,7 +46667,7 @@ 115.30.32.0 - 115.30.63.255 au 115.30.64.0 - 115.30.127.255 tw 115.30.128.0 - 115.31.63.255 jp -115.31.64.0 - 115.31.79.255 ph +115.31.64.0 - 115.31.79.255 cn 115.31.80.0 - 115.31.87.255 jp 115.31.88.0 - 115.31.95.255 au 115.31.96.0 - 115.31.127.255 kr @@ -65680,13 +46677,19 @@ 115.32.0.0 - 115.35.255.255 cn 115.36.0.0 - 115.39.255.255 jp 115.40.0.0 - 115.41.255.255 kr -115.42.0.0 - 115.42.63.255 au +115.42.0.0 - 115.42.31.255 au +115.42.32.0 - 115.42.51.255 in +115.42.52.0 - 115.42.55.255 bd +115.42.56.0 - 115.42.59.255 cn +115.42.60.0 - 115.42.63.255 hk 115.42.64.0 - 115.42.79.255 pk 115.42.80.0 - 115.42.95.255 tw 115.42.96.0 - 115.42.111.255 jp 115.42.112.0 - 115.42.119.255 tw 115.42.120.0 - 115.42.127.255 ph -115.42.128.0 - 115.42.255.255 sg +115.42.128.0 - 115.42.195.251 sg +115.42.195.252 - 115.42.195.252 ap +115.42.195.253 - 115.42.255.255 sg 115.43.0.0 - 115.43.255.255 tw 115.44.0.0 - 115.63.255.255 cn 115.64.0.0 - 115.64.255.255 au @@ -65695,11 +46698,11 @@ 115.67.0.0 - 115.67.255.255 th 115.68.0.0 - 115.68.255.255 kr 115.69.0.0 - 115.69.63.255 au -115.69.64.0 - 115.69.79.255 kh +115.69.64.0 - 115.69.79.255 cn 115.69.80.0 - 115.69.95.255 in 115.69.96.0 - 115.69.127.255 kr 115.69.128.0 - 115.69.159.255 in -115.69.160.0 - 115.69.191.255 au +115.69.160.0 - 115.69.191.255 nz 115.69.192.0 - 115.69.207.255 jp 115.69.208.0 - 115.69.215.255 bd 115.69.216.0 - 115.69.223.255 id @@ -65720,7 +46723,11 @@ 115.84.224.0 - 115.85.63.255 ph 115.85.64.0 - 115.85.95.255 id 115.85.96.0 - 115.85.127.255 jp -115.85.128.0 - 115.85.135.255 au +115.85.128.0 - 115.85.128.255 my +115.85.129.0 - 115.85.132.255 au +115.85.133.0 - 115.85.133.191 us +115.85.133.192 - 115.85.134.255 au +115.85.135.0 - 115.85.135.255 us 115.85.136.0 - 115.85.143.255 jp 115.85.144.0 - 115.85.159.255 tw 115.85.160.0 - 115.85.191.255 kr @@ -65738,18 +46745,20 @@ 115.124.40.0 - 115.124.47.255 in 115.124.48.0 - 115.124.63.255 jp 115.124.64.0 - 115.124.95.255 id -115.124.96.0 - 115.124.103.255 us -115.124.104.0 - 115.124.109.255 in +115.124.96.0 - 115.124.109.255 in 115.124.110.0 - 115.124.111.255 gb -115.124.112.0 - 115.124.113.255 us -115.124.114.0 - 115.124.127.255 in +115.124.112.0 - 115.124.115.255 in +115.124.116.0 - 115.124.117.255 gb +115.124.118.0 - 115.124.119.255 us +115.124.120.0 - 115.124.127.255 in 115.124.128.0 - 115.125.255.255 jp 115.126.0.0 - 115.126.127.255 hk 115.126.128.0 - 115.126.135.255 nz 115.126.136.0 - 115.126.159.255 jp 115.126.160.0 - 115.126.191.255 nc 115.126.192.0 - 115.126.255.255 kr -115.127.0.0 - 115.127.255.255 bd +115.127.0.0 - 115.127.223.255 bd +115.127.224.0 - 115.127.255.255 jp 115.128.0.0 - 115.131.255.255 au 115.132.0.0 - 115.135.255.255 my 115.136.0.0 - 115.145.255.255 kr @@ -65773,15 +46782,18 @@ 115.165.184.0 - 115.165.191.255 jp 115.165.192.0 - 115.165.255.255 tw 115.166.0.0 - 115.166.63.255 au -115.166.64.0 - 115.166.95.255 ph +115.166.64.0 - 115.166.95.255 cn 115.166.96.0 - 115.166.127.255 id -115.166.128.0 - 115.166.143.255 hk +115.166.128.0 - 115.166.143.255 in 115.166.144.0 - 115.166.255.255 jp 115.167.0.0 - 115.167.127.255 pk 115.167.128.0 - 115.167.255.255 jp 115.168.0.0 - 115.175.255.255 cn 115.176.0.0 - 115.177.255.255 jp -115.178.0.0 - 115.178.15.255 ap +115.178.0.0 - 115.178.1.255 hk +115.178.2.0 - 115.178.5.255 jp +115.178.6.0 - 115.178.11.255 hk +115.178.12.0 - 115.178.15.255 sg 115.178.16.0 - 115.178.23.255 au 115.178.24.0 - 115.178.27.255 kh 115.178.28.0 - 115.178.31.255 au @@ -65798,7 +46810,7 @@ 115.184.0.0 - 115.185.255.255 in 115.186.0.0 - 115.186.191.255 pk 115.186.192.0 - 115.186.255.255 au -115.187.0.0 - 115.187.15.255 in +115.187.0.0 - 115.187.15.255 cn 115.187.16.0 - 115.187.31.255 np 115.187.32.0 - 115.187.63.255 in 115.187.64.0 - 115.187.79.255 jp @@ -65811,27 +46823,28 @@ 115.190.0.0 - 115.239.255.255 cn 115.240.0.0 - 115.255.255.255 in 116.0.0.0 - 116.0.7.255 id -116.0.8.0 - 116.0.15.255 my +116.0.8.0 - 116.0.15.255 cn 116.0.16.0 - 116.0.23.255 au -116.0.24.0 - 116.0.31.255 hk +116.0.24.0 - 116.0.31.255 cn 116.0.32.0 - 116.0.63.255 pk -116.0.64.0 - 116.0.64.63 my -116.0.64.64 - 116.0.64.95 sg -116.0.64.96 - 116.0.64.127 ap -116.0.64.128 - 116.0.64.191 hk -116.0.64.192 - 116.0.64.223 ap -116.0.64.224 - 116.0.64.239 ph -116.0.64.240 - 116.0.64.247 tw -116.0.64.248 - 116.0.64.255 ap +116.0.64.0 - 116.0.64.127 pg +116.0.64.128 - 116.0.64.159 hk +116.0.64.160 - 116.0.64.255 pg 116.0.65.0 - 116.0.65.255 tw -116.0.66.0 - 116.0.67.255 ap -116.0.68.0 - 116.0.69.0 sg -116.0.69.1 - 116.0.71.255 ap -116.0.72.0 - 116.0.75.255 sy -116.0.76.0 - 116.0.76.255 ph -116.0.77.0 - 116.0.79.255 ap -116.0.80.0 - 116.0.80.255 sg -116.0.81.0 - 116.0.95.255 ap +116.0.66.0 - 116.0.67.255 sg +116.0.68.0 - 116.0.69.7 tw +116.0.69.8 - 116.0.71.255 sg +116.0.72.0 - 116.0.72.127 hk +116.0.72.128 - 116.0.72.255 cn +116.0.73.0 - 116.0.73.255 sg +116.0.74.0 - 116.0.74.255 jp +116.0.75.0 - 116.0.75.255 sg +116.0.76.0 - 116.0.76.255 au +116.0.77.0 - 116.0.81.255 sg +116.0.82.0 - 116.0.82.255 hk +116.0.83.0 - 116.0.87.255 sg +116.0.88.0 - 116.0.88.255 au +116.0.89.0 - 116.0.95.255 sg 116.0.96.0 - 116.0.127.255 my 116.0.128.0 - 116.0.255.255 jp 116.1.0.0 - 116.11.255.255 cn @@ -65847,14 +46860,19 @@ 116.16.0.0 - 116.31.255.255 cn 116.32.0.0 - 116.47.255.255 kr 116.48.0.0 - 116.49.255.255 hk -116.50.0.0 - 116.50.7.255 in -116.50.8.0 - 116.50.15.255 hk +116.50.0.0 - 116.50.15.255 cn 116.50.16.0 - 116.50.23.255 au 116.50.24.0 - 116.50.31.255 id 116.50.32.0 - 116.50.47.255 tw 116.50.48.0 - 116.50.55.255 jp -116.50.56.0 - 116.50.63.255 au -116.50.64.0 - 116.50.127.255 in +116.50.56.0 - 116.50.56.255 in +116.50.57.0 - 116.50.57.255 hk +116.50.58.0 - 116.50.58.255 au +116.50.59.0 - 116.50.60.179 in +116.50.60.180 - 116.50.60.180 ap +116.50.60.181 - 116.50.60.255 in +116.50.61.0 - 116.50.61.255 jp +116.50.62.0 - 116.50.127.255 in 116.50.128.0 - 116.50.255.255 ph 116.51.0.0 - 116.51.255.255 sg 116.52.0.0 - 116.57.255.255 cn @@ -65869,12 +46887,15 @@ 116.60.0.0 - 116.63.255.255 cn 116.64.0.0 - 116.65.255.255 jp 116.66.0.0 - 116.66.127.255 cn -116.66.128.0 - 116.66.139.255 us -116.66.140.0 - 116.66.141.255 in -116.66.142.0 - 116.66.143.255 nl -116.66.144.0 - 116.66.159.255 in +116.66.128.0 - 116.66.129.255 in +116.66.130.0 - 116.66.131.255 us +116.66.132.0 - 116.66.133.255 in +116.66.134.0 - 116.66.139.255 us +116.66.140.0 - 116.66.143.255 in +116.66.144.0 - 116.66.147.255 us +116.66.148.0 - 116.66.151.255 ph +116.66.152.0 - 116.66.159.255 in 116.66.160.0 - 116.66.175.255 au -116.66.176.0 - 116.66.191.255 jp 116.66.192.0 - 116.66.199.255 np 116.66.200.0 - 116.66.207.255 id 116.66.208.0 - 116.66.223.255 hk @@ -65888,10 +46909,10 @@ 116.68.32.0 - 116.68.63.255 kr 116.68.64.0 - 116.68.127.255 in 116.68.128.0 - 116.68.135.255 vn -116.68.136.0 - 116.68.143.255 ph +116.68.136.0 - 116.68.143.255 cn 116.68.144.0 - 116.68.159.255 th 116.68.160.0 - 116.68.175.255 id -116.68.176.0 - 116.68.183.255 ph +116.68.176.0 - 116.68.183.255 cn 116.68.184.0 - 116.68.191.255 hk 116.68.192.0 - 116.68.207.255 bd 116.68.208.0 - 116.68.215.255 np @@ -65955,12 +46976,14 @@ 116.193.96.0 - 116.193.127.255 jp 116.193.128.0 - 116.193.143.255 in 116.193.144.0 - 116.193.151.255 nz -116.193.156.0 - 116.193.156.255 hk -116.193.157.0 - 116.193.157.255 my +116.193.152.0 - 116.193.155.255 cn +116.193.156.0 - 116.193.157.255 my 116.193.158.0 - 116.193.159.255 hk -116.193.160.0 - 116.193.167.255 in -116.193.168.0 - 116.193.175.255 bd -116.193.176.0 - 116.193.187.255 au +116.193.160.0 - 116.193.163.255 in +116.193.164.0 - 116.193.167.255 cn +116.193.168.0 - 116.193.168.255 bd +116.193.176.0 - 116.193.183.255 cn +116.193.184.0 - 116.193.187.255 au 116.193.188.0 - 116.193.191.255 id 116.193.192.0 - 116.193.215.255 au 116.193.216.0 - 116.193.223.255 bd @@ -65970,24 +46993,29 @@ 116.197.128.0 - 116.197.135.255 id 116.197.136.0 - 116.197.143.255 jp 116.197.144.0 - 116.197.151.255 au -116.197.152.0 - 116.197.159.255 jp -116.197.160.0 - 116.197.167.255 np +116.197.160.0 - 116.197.167.255 cn 116.197.168.0 - 116.197.175.255 jp -116.197.176.0 - 116.197.191.255 hk +116.197.176.0 - 116.197.177.255 hk +116.197.178.0 - 116.197.178.255 in +116.197.179.0 - 116.197.179.255 hk +116.197.180.0 - 116.197.180.255 cn +116.197.181.0 - 116.197.183.255 hk +116.197.184.0 - 116.197.184.255 in +116.197.185.0 - 116.197.189.255 hk +116.197.190.0 - 116.197.190.255 au +116.197.191.0 - 116.197.191.255 hk 116.197.192.0 - 116.197.255.255 sg 116.198.0.0 - 116.199.159.255 cn 116.199.160.0 - 116.199.167.255 kr 116.199.168.0 - 116.199.175.255 in 116.199.176.0 - 116.199.191.255 jp -116.199.192.0 - 116.199.207.255 id +116.199.192.0 - 116.199.199.255 id 116.199.208.0 - 116.199.223.255 nz 116.199.224.0 - 116.199.239.255 au 116.199.240.0 - 116.199.255.255 jp 116.200.0.0 - 116.201.255.255 kr 116.202.0.0 - 116.203.255.255 in -116.204.0.0 - 116.205.255.255 cn -116.206.0.0 - 116.206.255.255 my -116.207.0.0 - 116.211.255.255 cn +116.204.0.0 - 116.211.255.255 cn 116.212.0.0 - 116.212.31.255 kr 116.212.32.0 - 116.212.63.255 vn 116.212.64.0 - 116.212.71.255 au @@ -65995,9 +47023,7 @@ 116.212.80.0 - 116.212.95.255 tw 116.212.96.0 - 116.212.103.255 id 116.212.104.0 - 116.212.111.255 bd -116.212.112.0 - 116.212.114.255 hk -116.212.115.0 - 116.212.115.255 cn -116.212.116.0 - 116.212.127.255 hk +116.212.112.0 - 116.212.127.255 hk 116.212.128.0 - 116.212.159.255 kh 116.212.160.0 - 116.212.175.255 cn 116.212.176.0 - 116.212.183.255 in @@ -66005,7 +47031,9 @@ 116.212.192.0 - 116.213.19.255 au 116.213.20.0 - 116.213.23.255 jp 116.213.24.0 - 116.213.31.255 id -116.213.32.0 - 116.213.47.255 au +116.213.32.0 - 116.213.35.255 pk +116.213.36.0 - 116.213.39.255 hk +116.213.40.0 - 116.213.47.255 cn 116.213.48.0 - 116.213.63.255 id 116.213.64.0 - 116.213.255.255 cn 116.214.0.0 - 116.214.15.255 tw @@ -66013,13 +47041,18 @@ 116.214.24.0 - 116.214.31.255 in 116.214.32.0 - 116.214.79.255 cn 116.214.80.0 - 116.214.95.255 jp -116.214.96.0 - 116.214.112.255 sg -116.214.113.0 - 116.214.113.255 th -116.214.114.0 - 116.214.114.255 in -116.214.115.0 - 116.214.122.255 sg -116.214.123.0 - 116.214.123.255 ph -116.214.124.0 - 116.214.124.255 cn -116.214.125.0 - 116.214.127.255 sg +116.214.96.0 - 116.214.111.255 sg +116.214.112.0 - 116.214.113.255 th +116.214.114.0 - 116.214.115.255 sg +116.214.116.0 - 116.214.117.191 au +116.214.117.192 - 116.214.117.255 sg +116.214.118.0 - 116.214.119.255 au +116.214.120.0 - 116.214.120.102 in +116.214.120.103 - 116.214.120.103 ap +116.214.120.104 - 116.214.120.255 in +116.214.121.0 - 116.214.125.255 sg +116.214.126.0 - 116.214.126.255 in +116.214.127.0 - 116.214.127.255 sg 116.214.128.0 - 116.219.255.255 cn 116.220.0.0 - 116.223.255.255 jp 116.224.0.0 - 116.239.255.255 cn @@ -66035,7 +47068,7 @@ 116.252.0.0 - 116.253.255.255 cn 116.254.0.0 - 116.254.95.255 jp 116.254.96.0 - 116.254.103.255 id -116.254.104.0 - 116.254.111.255 jp +116.254.104.0 - 116.254.111.255 cn 116.254.112.0 - 116.254.127.255 id 116.254.128.0 - 116.254.255.255 cn 116.255.0.0 - 116.255.63.255 au @@ -66047,7 +47080,13 @@ 117.18.0.0 - 117.18.15.255 hk 117.18.16.0 - 117.18.23.255 id 117.18.24.0 - 117.18.31.255 jp -117.18.32.0 - 117.18.47.255 sg +117.18.32.0 - 117.18.32.255 sg +117.18.33.0 - 117.18.34.255 jp +117.18.35.0 - 117.18.35.255 hk +117.18.36.0 - 117.18.36.255 gb +117.18.37.0 - 117.18.37.255 us +117.18.38.0 - 117.18.38.255 cn +117.18.39.0 - 117.18.47.255 sg 117.18.48.0 - 117.18.48.255 hk 117.18.49.0 - 117.18.63.255 sg 117.18.64.0 - 117.18.79.255 hk @@ -66056,8 +47095,13 @@ 117.18.96.0 - 117.18.127.255 hk 117.18.128.0 - 117.18.223.255 jp 117.18.224.0 - 117.18.231.255 bd -117.18.232.0 - 117.18.239.255 ap -117.18.240.0 - 117.18.255.255 pk +117.18.232.0 - 117.18.232.255 ap +117.18.233.0 - 117.18.233.255 jp +117.18.234.0 - 117.18.234.255 hk +117.18.235.0 - 117.18.235.255 au +117.18.236.0 - 117.18.236.255 sg +117.18.237.0 - 117.18.239.255 ap +117.18.240.0 - 117.18.255.255 gb 117.19.0.0 - 117.19.255.255 tw 117.20.0.0 - 117.20.15.255 au 117.20.16.0 - 117.20.31.255 pk @@ -66078,11 +47122,12 @@ 117.48.0.0 - 117.51.255.255 cn 117.52.0.0 - 117.52.255.255 kr 117.53.0.0 - 117.53.39.255 jp -117.53.40.0 - 117.53.47.255 in +117.53.40.0 - 117.53.43.255 pk +117.53.44.0 - 117.53.47.255 id 117.53.48.0 - 117.53.63.255 cn 117.53.64.0 - 117.53.127.255 kr 117.53.128.0 - 117.53.143.255 au -117.53.144.0 - 117.53.151.255 nz +117.53.144.0 - 117.53.151.255 id 117.53.152.0 - 117.53.155.255 my 117.53.156.0 - 117.53.159.255 nz 117.53.160.0 - 117.53.175.255 au @@ -66091,7 +47136,11 @@ 117.54.0.0 - 117.54.255.255 id 117.55.0.0 - 117.55.127.255 jp 117.55.128.0 - 117.55.191.255 kr -117.55.192.0 - 117.55.207.255 af +117.55.192.0 - 117.55.192.255 af +117.55.193.0 - 117.55.193.255 us +117.55.194.0 - 117.55.199.255 af +117.55.200.0 - 117.55.200.255 us +117.55.201.0 - 117.55.207.255 af 117.55.208.0 - 117.55.223.255 jp 117.55.224.0 - 117.55.239.255 au 117.55.240.0 - 117.55.247.255 in @@ -66107,8 +47156,7 @@ 117.58.248.0 - 117.58.255.255 au 117.59.0.0 - 117.73.255.255 cn 117.74.0.0 - 117.74.63.255 jp -117.74.64.0 - 117.74.79.255 cn -117.74.80.0 - 117.74.95.255 kh +117.74.64.0 - 117.74.95.255 cn 117.74.96.0 - 117.74.111.255 au 117.74.112.0 - 117.74.127.255 id 117.74.128.0 - 117.95.255.255 cn @@ -66122,14 +47170,16 @@ 117.102.224.0 - 117.103.15.255 id 117.103.16.0 - 117.103.31.255 cn 117.103.32.0 - 117.103.39.255 id -117.103.40.0 - 117.103.47.255 ph +117.103.40.0 - 117.103.47.255 cn 117.103.48.0 - 117.103.71.255 id -117.103.72.0 - 117.103.79.255 au +117.103.72.0 - 117.103.79.255 cn 117.103.80.0 - 117.103.87.255 bd 117.103.88.0 - 117.103.95.255 mh 117.103.96.0 - 117.103.111.255 tw 117.103.112.0 - 117.103.119.255 au -117.103.120.0 - 117.103.127.255 in +117.103.120.0 - 117.103.123.255 sg +117.103.124.0 - 117.103.125.255 hk +117.103.126.0 - 117.103.127.255 in 117.103.128.0 - 117.103.143.255 cn 117.103.144.0 - 117.103.159.255 hk 117.103.160.0 - 117.103.167.255 jp @@ -66138,10 +47188,12 @@ 117.103.192.0 - 117.103.255.255 vn 117.104.0.0 - 117.104.159.255 jp 117.104.160.0 - 117.104.167.255 au -117.104.168.0 - 117.104.175.255 ap +117.104.168.0 - 117.104.175.255 cn 117.104.176.0 - 117.104.183.255 nz -117.104.184.0 - 117.104.187.255 sg -117.104.188.0 - 117.104.191.255 hk +117.104.184.0 - 117.104.185.255 sg +117.104.186.0 - 117.104.187.255 bd +117.104.188.0 - 117.104.188.255 cn +117.104.189.0 - 117.104.191.255 hk 117.104.192.0 - 117.104.223.255 id 117.104.224.0 - 117.104.231.255 af 117.104.232.0 - 117.104.239.255 in @@ -66152,22 +47204,29 @@ 117.110.0.0 - 117.111.255.255 kr 117.112.0.0 - 117.119.255.255 cn 117.120.0.0 - 117.120.7.255 sg -117.120.8.0 - 117.120.23.255 au +117.120.8.0 - 117.120.16.255 au +117.120.17.0 - 117.120.17.255 sg +117.120.18.0 - 117.120.19.255 au +117.120.20.0 - 117.120.21.255 hk +117.120.22.0 - 117.120.23.39 au +117.120.23.40 - 117.120.23.40 sg +117.120.23.41 - 117.120.23.255 au 117.120.24.0 - 117.120.31.255 kh 117.120.32.0 - 117.120.39.255 nz 117.120.40.0 - 117.120.47.255 au 117.120.48.0 - 117.120.55.255 jp -117.120.56.0 - 117.120.63.255 lk 117.120.64.0 - 117.121.199.255 cn 117.121.200.0 - 117.121.207.255 id 117.121.208.0 - 117.121.223.255 th 117.121.224.0 - 117.121.239.255 np -117.121.240.0 - 117.121.241.255 sg +117.121.240.0 - 117.121.240.255 my +117.121.241.0 - 117.121.241.255 sg 117.121.242.0 - 117.121.242.255 au 117.121.243.0 - 117.121.243.255 us 117.121.244.0 - 117.121.244.255 sg 117.121.245.0 - 117.121.245.255 il -117.121.246.0 - 117.121.247.255 sg +117.121.246.0 - 117.121.246.255 sg +117.121.247.0 - 117.121.247.255 us 117.121.248.0 - 117.121.255.255 au 117.122.0.0 - 117.122.127.255 vn 117.122.128.0 - 117.122.255.255 cn @@ -66175,7 +47234,9 @@ 117.124.0.0 - 117.191.255.255 cn 117.192.0.0 - 117.255.255.255 in 118.0.0.0 - 118.23.255.255 jp -118.24.0.0 - 118.31.255.255 cn +118.24.0.0 - 118.26.255.255 cn +118.27.0.0 - 118.27.255.255 jp +118.28.0.0 - 118.31.255.255 cn 118.32.0.0 - 118.63.255.255 kr 118.64.0.0 - 118.66.255.255 cn 118.67.0.0 - 118.67.63.255 au @@ -66218,18 +47279,22 @@ 118.100.0.0 - 118.101.255.255 my 118.102.0.0 - 118.102.7.255 vn 118.102.8.0 - 118.102.15.255 hk -118.102.16.0 - 118.102.31.255 cn -118.102.32.0 - 118.102.39.255 ph +118.102.16.0 - 118.102.39.255 cn 118.102.40.0 - 118.102.63.255 jp 118.102.64.0 - 118.102.127.255 au 118.102.128.0 - 118.102.255.255 in 118.103.0.0 - 118.103.135.255 jp 118.103.136.0 - 118.103.143.255 bt 118.103.144.0 - 118.103.159.255 hk -118.103.160.0 - 118.103.191.255 kh +118.103.160.0 - 118.103.163.255 in +118.103.164.0 - 118.103.179.255 cn +118.103.180.0 - 118.103.183.255 sg +118.103.184.0 - 118.103.187.255 au +118.103.188.0 - 118.103.191.255 jp 118.103.192.0 - 118.103.223.255 kr 118.103.224.0 - 118.103.239.255 pk -118.103.240.0 - 118.103.247.255 cn +118.103.240.0 - 118.103.243.0 hk +118.103.243.1 - 118.103.247.255 cn 118.103.248.0 - 118.103.255.255 bn 118.104.0.0 - 118.106.255.255 jp 118.107.0.0 - 118.107.63.255 au @@ -66238,11 +47303,14 @@ 118.107.144.0 - 118.107.151.255 au 118.107.152.0 - 118.107.159.255 jp 118.107.160.0 - 118.107.175.255 kr -118.107.176.0 - 118.107.191.255 au +118.107.176.0 - 118.107.179.255 sg +118.107.184.0 - 118.107.191.255 au 118.107.192.0 - 118.107.255.255 my 118.108.0.0 - 118.111.255.255 jp 118.112.0.0 - 118.126.255.255 cn -118.127.0.0 - 118.127.191.255 au +118.127.0.0 - 118.127.127.255 au +118.127.128.0 - 118.127.159.255 cn +118.127.160.0 - 118.127.191.255 au 118.127.192.0 - 118.131.255.255 kr 118.132.0.0 - 118.135.255.255 cn 118.136.0.0 - 118.137.255.255 id @@ -66266,7 +47334,19 @@ 118.178.0.0 - 118.178.255.255 cn 118.179.0.0 - 118.179.223.255 bd 118.179.224.0 - 118.179.255.255 nc -118.180.0.0 - 118.207.255.255 cn +118.180.0.0 - 118.184.255.255 cn +118.185.0.0 - 118.185.255.255 in +118.186.0.0 - 118.188.255.255 cn +118.189.0.0 - 118.189.255.255 sg +118.190.0.0 - 118.193.15.255 cn +118.193.16.0 - 118.193.31.255 hk +118.193.32.0 - 118.193.79.255 cn +118.193.80.0 - 118.193.95.255 hk +118.193.96.0 - 118.193.223.255 cn +118.193.224.0 - 118.193.224.255 hk +118.193.225.0 - 118.199.255.255 cn +118.200.0.0 - 118.201.255.255 sg +118.202.0.0 - 118.207.255.255 cn 118.208.0.0 - 118.211.255.255 au 118.212.0.0 - 118.213.255.255 cn 118.214.0.0 - 118.215.255.255 sg @@ -66282,14 +47362,22 @@ 118.244.0.0 - 119.2.31.255 cn 119.2.32.0 - 119.2.39.255 ph 119.2.40.0 - 119.2.55.255 id -119.2.56.0 - 119.2.63.255 np +119.2.56.0 - 119.2.63.255 au 119.2.64.0 - 119.2.95.255 id 119.2.96.0 - 119.2.127.255 bt -119.2.128.0 - 119.10.127.255 cn +119.2.128.0 - 119.2.255.255 cn +119.3.0.0 - 119.3.255.255 hk +119.4.0.0 - 119.8.255.255 cn +119.9.0.0 - 119.9.63.255 au +119.9.64.0 - 119.9.127.255 hk +119.9.128.0 - 119.9.191.255 au +119.9.192.0 - 119.9.255.255 hk +119.10.0.0 - 119.10.127.255 cn 119.10.128.0 - 119.10.143.255 au 119.10.144.0 - 119.10.159.255 hk 119.10.160.0 - 119.10.167.255 jp -119.10.168.0 - 119.10.175.255 hk +119.10.168.0 - 119.10.171.255 hk +119.10.172.0 - 119.10.175.255 bd 119.10.176.0 - 119.10.183.255 id 119.10.184.0 - 119.10.255.255 jp 119.11.0.0 - 119.11.127.255 au @@ -66298,7 +47386,9 @@ 119.14.0.0 - 119.14.255.255 tw 119.15.0.0 - 119.15.31.255 nz 119.15.32.0 - 119.15.63.255 jp -119.15.64.0 - 119.15.79.255 au +119.15.64.0 - 119.15.64.255 au +119.15.65.0 - 119.15.65.255 nz +119.15.66.0 - 119.15.79.255 au 119.15.80.0 - 119.15.95.255 kh 119.15.96.0 - 119.15.111.255 au 119.15.112.0 - 119.15.127.255 jp @@ -66326,10 +47416,20 @@ 119.18.216.0 - 119.18.223.255 jp 119.18.224.0 - 119.23.255.255 cn 119.24.0.0 - 119.26.255.255 jp -119.27.0.0 - 119.27.63.255 sg -119.27.64.0 - 119.27.127.255 cn -119.27.128.0 - 119.27.159.255 ph -119.27.160.0 - 119.29.255.255 cn +119.27.0.0 - 119.27.31.255 sg +119.27.32.0 - 119.27.39.255 jp +119.27.40.0 - 119.27.51.39 sg +119.27.51.40 - 119.27.51.40 au +119.27.51.41 - 119.27.53.71 sg +119.27.53.72 - 119.27.53.79 jp +119.27.53.80 - 119.27.55.175 sg +119.27.55.176 - 119.27.55.191 jp +119.27.55.192 - 119.27.56.35 sg +119.27.56.36 - 119.27.56.39 jp +119.27.56.40 - 119.27.61.255 sg +119.27.62.0 - 119.27.62.255 us +119.27.63.0 - 119.27.63.255 sg +119.27.64.0 - 119.29.255.255 cn 119.30.0.0 - 119.30.7.255 au 119.30.8.0 - 119.30.15.255 jp 119.30.16.0 - 119.30.31.255 tw @@ -66340,21 +47440,31 @@ 119.30.192.0 - 119.30.255.255 jp 119.31.0.0 - 119.31.127.255 th 119.31.128.0 - 119.31.159.255 jp -119.31.160.0 - 119.31.175.255 in +119.31.160.0 - 119.31.164.255 in +119.31.165.0 - 119.31.165.255 ap +119.31.166.0 - 119.31.166.47 in +119.31.166.48 - 119.31.166.48 hk +119.31.166.49 - 119.31.175.255 in 119.31.176.0 - 119.31.191.255 tw 119.31.192.0 - 119.31.223.255 cn 119.31.224.0 - 119.31.231.255 au 119.31.232.0 - 119.31.239.255 sg -119.31.240.0 - 119.31.255.255 kr +119.31.240.0 - 119.31.248.255 kr +119.31.249.0 - 119.31.249.255 in +119.31.250.0 - 119.31.250.255 om +119.31.251.0 - 119.31.251.255 in +119.31.252.0 - 119.31.252.255 za +119.31.253.0 - 119.31.253.255 kr +119.31.254.0 - 119.31.254.255 jp +119.31.255.0 - 119.31.255.255 kr 119.32.0.0 - 119.40.79.255 cn 119.40.80.0 - 119.40.95.255 bd 119.40.96.0 - 119.40.103.255 mn 119.40.104.0 - 119.40.111.255 au 119.40.112.0 - 119.40.127.255 my 119.40.128.0 - 119.42.31.255 cn -119.42.32.0 - 119.42.63.255 ph -119.42.64.0 - 119.42.135.255 th -119.42.136.0 - 119.42.143.255 cn +119.42.64.0 - 119.42.127.255 th +119.42.128.0 - 119.42.143.255 cn 119.42.144.0 - 119.42.151.255 hk 119.42.152.0 - 119.42.159.255 in 119.42.160.0 - 119.42.191.255 kr @@ -66376,7 +47486,9 @@ 119.59.0.0 - 119.59.63.255 kr 119.59.64.0 - 119.59.71.255 jp 119.59.72.0 - 119.59.79.255 hk -119.59.80.0 - 119.59.87.255 af +119.59.80.0 - 119.59.81.255 af +119.59.82.0 - 119.59.82.255 us +119.59.83.0 - 119.59.87.255 af 119.59.88.0 - 119.59.95.255 jp 119.59.96.0 - 119.59.127.255 th 119.59.128.0 - 119.62.255.255 cn @@ -66402,7 +47514,76 @@ 119.77.0.0 - 119.77.95.255 au 119.77.96.0 - 119.77.127.255 kr 119.77.128.0 - 119.77.255.255 tw -119.78.0.0 - 119.81.255.255 cn +119.78.0.0 - 119.80.255.255 cn +119.81.0.0 - 119.81.127.255 sg +119.81.128.0 - 119.81.172.95 hk +119.81.172.96 - 119.81.172.96 sa +119.81.172.97 - 119.81.191.255 hk +119.81.192.0 - 119.81.226.143 sg +119.81.226.144 - 119.81.226.159 us +119.81.226.160 - 119.81.226.255 sg +119.81.227.0 - 119.81.227.31 us +119.81.227.32 - 119.81.228.255 sg +119.81.229.0 - 119.81.229.255 hk +119.81.230.0 - 119.81.230.127 sg +119.81.230.128 - 119.81.230.151 cz +119.81.230.152 - 119.81.230.155 sg +119.81.230.156 - 119.81.230.159 cz +119.81.230.160 - 119.81.230.191 sg +119.81.230.192 - 119.81.230.199 cz +119.81.230.200 - 119.81.234.255 sg +119.81.235.0 - 119.81.235.255 hk +119.81.236.0 - 119.81.236.255 sg +119.81.237.0 - 119.81.237.255 hk +119.81.238.0 - 119.81.239.31 sg +119.81.239.32 - 119.81.239.63 us +119.81.239.64 - 119.81.240.79 sg +119.81.240.80 - 119.81.240.95 us +119.81.240.96 - 119.81.241.255 sg +119.81.242.0 - 119.81.242.255 hk +119.81.243.0 - 119.81.245.175 sg +119.81.245.176 - 119.81.245.191 us +119.81.245.192 - 119.81.246.47 sg +119.81.246.48 - 119.81.246.63 us +119.81.246.64 - 119.81.246.167 sg +119.81.246.168 - 119.81.246.175 us +119.81.246.176 - 119.81.246.255 sg +119.81.247.0 - 119.81.247.255 hk +119.81.248.0 - 119.81.248.47 sg +119.81.248.48 - 119.81.248.51 us +119.81.248.52 - 119.81.248.53 hk +119.81.248.54 - 119.81.248.56 us +119.81.248.57 - 119.81.248.57 hk +119.81.248.58 - 119.81.248.59 us +119.81.248.60 - 119.81.248.60 hk +119.81.248.61 - 119.81.248.63 us +119.81.248.64 - 119.81.249.127 sg +119.81.249.128 - 119.81.249.131 us +119.81.249.132 - 119.81.249.133 hk +119.81.249.134 - 119.81.249.137 us +119.81.249.138 - 119.81.249.139 hk +119.81.249.140 - 119.81.249.143 us +119.81.249.144 - 119.81.250.143 sg +119.81.250.144 - 119.81.250.145 us +119.81.250.146 - 119.81.250.147 hk +119.81.250.148 - 119.81.250.148 us +119.81.250.149 - 119.81.250.149 hk +119.81.250.150 - 119.81.250.151 us +119.81.250.152 - 119.81.250.152 hk +119.81.250.153 - 119.81.250.153 us +119.81.250.154 - 119.81.250.154 hk +119.81.250.155 - 119.81.250.159 us +119.81.250.160 - 119.81.253.191 sg +119.81.253.192 - 119.81.253.213 us +119.81.253.214 - 119.81.253.214 hk +119.81.253.215 - 119.81.253.228 us +119.81.253.229 - 119.81.253.230 hk +119.81.253.231 - 119.81.253.236 us +119.81.253.237 - 119.81.253.237 hk +119.81.253.238 - 119.81.253.240 us +119.81.253.241 - 119.81.253.243 hk +119.81.253.244 - 119.81.253.255 us +119.81.254.0 - 119.81.255.255 sg 119.82.0.0 - 119.82.7.255 au 119.82.8.0 - 119.82.31.255 jp 119.82.32.0 - 119.82.63.255 kr @@ -66410,7 +47591,7 @@ 119.82.128.0 - 119.82.143.255 vn 119.82.144.0 - 119.82.151.255 au 119.82.152.0 - 119.82.207.255 jp -119.82.208.0 - 119.82.223.255 bd +119.82.208.0 - 119.82.223.255 cn 119.82.224.0 - 119.82.247.255 id 119.82.248.0 - 119.82.255.255 kh 119.83.0.0 - 119.83.255.255 jp @@ -66432,25 +47613,26 @@ 119.148.96.0 - 119.148.103.255 th 119.148.104.0 - 119.148.111.255 jp 119.148.112.0 - 119.148.159.255 kr -119.148.160.0 - 119.148.175.255 cn -119.148.176.0 - 119.148.191.255 ph +119.148.160.0 - 119.148.191.255 cn 119.148.192.0 - 119.148.255.255 jp 119.149.0.0 - 119.149.255.255 kr 119.150.0.0 - 119.150.255.255 jp -119.151.0.0 - 119.151.255.255 in +119.151.0.0 - 119.151.191.255 in +119.151.192.0 - 119.151.255.255 cn 119.152.0.0 - 119.160.127.255 pk 119.160.128.0 - 119.160.191.255 bn 119.160.192.0 - 119.160.199.255 in -119.160.200.0 - 119.160.207.255 id +119.160.200.0 - 119.160.207.255 cn 119.160.208.0 - 119.160.223.255 th -119.160.224.0 - 119.160.239.255 au +119.160.224.0 - 119.160.231.255 nz +119.160.232.0 - 119.160.239.255 au 119.160.240.0 - 119.160.255.255 tw 119.161.0.0 - 119.161.31.255 kr 119.161.32.0 - 119.161.95.255 au -119.161.96.0 - 119.161.103.255 my +119.161.96.0 - 119.161.99.255 in +119.161.100.0 - 119.161.103.255 sg 119.161.104.0 - 119.161.119.255 jp -119.161.120.0 - 119.161.127.255 us -119.161.128.0 - 119.167.255.255 cn +119.161.120.0 - 119.167.255.255 cn 119.168.0.0 - 119.175.255.255 jp 119.176.0.0 - 119.191.255.255 cn 119.192.0.0 - 119.223.255.255 kr @@ -66499,16 +47681,20 @@ 120.29.0.0 - 120.29.63.255 au 120.29.64.0 - 120.29.127.255 ph 120.29.128.0 - 120.29.143.255 kr -120.29.144.0 - 120.29.151.255 jp +120.29.144.0 - 120.29.146.255 jp +120.29.147.0 - 120.29.148.255 us +120.29.149.0 - 120.29.151.255 jp 120.29.152.0 - 120.29.159.255 id 120.29.160.0 - 120.29.191.255 jp -120.29.192.0 - 120.29.193.255 hk -120.29.194.0 - 120.29.199.255 ca +120.29.192.0 - 120.29.194.255 in +120.29.195.0 - 120.29.195.255 au +120.29.196.0 - 120.29.199.255 in 120.29.200.0 - 120.29.207.0 gu -120.29.207.1 - 120.29.223.191 ca -120.29.223.192 - 120.29.223.199 pg -120.29.223.200 - 120.29.223.207 au -120.29.223.208 - 120.29.223.255 ca +120.29.207.1 - 120.29.208.255 in +120.29.209.0 - 120.29.209.255 ph +120.29.210.0 - 120.29.210.255 in +120.29.211.0 - 120.29.211.255 jp +120.29.212.0 - 120.29.223.255 in 120.29.224.0 - 120.29.231.255 id 120.29.232.0 - 120.29.239.255 in 120.29.240.0 - 120.29.255.255 au @@ -66539,7 +47725,8 @@ 120.88.8.0 - 120.88.15.255 cn 120.88.16.0 - 120.88.31.255 jp 120.88.32.0 - 120.88.47.255 in -120.88.48.0 - 120.88.63.255 jp +120.88.48.0 - 120.88.48.255 us +120.88.49.0 - 120.88.63.255 jp 120.88.64.0 - 120.88.175.255 au 120.88.176.0 - 120.88.191.255 in 120.88.192.0 - 120.88.255.255 hk @@ -66557,19 +47744,32 @@ 120.128.0.0 - 120.135.255.255 cn 120.136.0.0 - 120.136.7.255 nz 120.136.8.0 - 120.136.15.255 jp -120.136.16.0 - 120.136.23.255 id +120.136.16.0 - 120.136.23.255 cn 120.136.24.0 - 120.136.31.255 kh -120.136.32.0 - 120.136.32.63 us -120.136.32.64 - 120.136.47.255 hk -120.136.48.0 - 120.136.63.255 nz +120.136.32.0 - 120.136.47.255 hk +120.136.48.0 - 120.136.59.255 nz +120.136.60.0 - 120.136.61.255 au +120.136.62.0 - 120.136.63.255 nz 120.136.64.0 - 120.136.127.255 kr 120.136.128.0 - 120.136.191.255 cn 120.136.192.0 - 120.136.255.255 jp 120.137.0.0 - 120.137.127.255 cn 120.137.128.0 - 120.137.255.255 jp -120.138.0.0 - 120.138.15.255 ph +120.138.0.0 - 120.138.15.255 in 120.138.16.0 - 120.138.31.255 nz -120.138.32.0 - 120.138.63.255 au +120.138.32.0 - 120.138.36.31 au +120.138.36.32 - 120.138.36.47 sg +120.138.36.48 - 120.138.36.255 au +120.138.37.0 - 120.138.37.255 in +120.138.38.0 - 120.138.39.255 au +120.138.40.0 - 120.138.40.255 hk +120.138.41.0 - 120.138.43.255 au +120.138.44.0 - 120.138.44.255 sg +120.138.45.0 - 120.138.47.255 au +120.138.48.0 - 120.138.48.255 jp +120.138.49.0 - 120.138.51.255 au +120.138.52.0 - 120.138.52.255 kr +120.138.53.0 - 120.138.63.255 au 120.138.64.0 - 120.138.79.255 vn 120.138.80.0 - 120.138.95.255 my 120.138.96.0 - 120.138.127.255 in @@ -66578,14 +47778,13 @@ 120.139.0.0 - 120.141.255.255 my 120.142.0.0 - 120.142.255.255 kr 120.143.0.0 - 120.143.127.255 jp -120.143.128.0 - 120.143.159.255 ph +120.143.128.0 - 120.143.159.255 cn 120.143.160.0 - 120.143.255.255 kr 120.144.0.0 - 120.159.255.255 au 120.160.0.0 - 120.191.255.255 id 120.192.0.0 - 120.255.255.255 cn 121.0.0.0 - 121.0.7.255 au -121.0.8.0 - 121.0.15.255 bd -121.0.16.0 - 121.0.31.255 cn +121.0.8.0 - 121.0.31.255 cn 121.0.32.0 - 121.0.63.255 jp 121.0.64.0 - 121.0.255.255 kr 121.1.0.0 - 121.1.63.255 ph @@ -66595,8 +47794,17 @@ 121.6.0.0 - 121.7.255.255 sg 121.8.0.0 - 121.43.255.255 cn 121.44.0.0 - 121.45.255.255 au -121.46.0.0 - 121.49.255.255 cn -121.50.0.0 - 121.50.15.255 in +121.46.0.0 - 121.46.63.255 cn +121.46.64.0 - 121.46.67.255 pk +121.46.68.0 - 121.46.75.255 bd +121.46.76.0 - 121.46.79.255 cn +121.46.80.0 - 121.46.83.255 hk +121.46.84.0 - 121.46.119.255 in +121.46.120.0 - 121.46.123.255 au +121.46.124.0 - 121.46.127.255 in +121.46.128.0 - 121.49.255.255 cn +121.50.0.0 - 121.50.7.255 in +121.50.8.0 - 121.50.15.255 cn 121.50.16.0 - 121.50.31.255 kr 121.50.32.0 - 121.50.39.255 id 121.50.40.0 - 121.50.63.255 jp @@ -66604,7 +47812,8 @@ 121.50.128.0 - 121.50.143.255 id 121.50.144.0 - 121.50.151.255 tw 121.50.152.0 - 121.50.167.255 jp -121.50.168.0 - 121.50.175.255 th +121.50.168.0 - 121.50.171.255 hk +121.50.172.0 - 121.50.175.255 vn 121.50.176.0 - 121.50.191.255 tw 121.50.192.0 - 121.50.223.255 au 121.50.224.0 - 121.50.255.255 kr @@ -66618,19 +47827,17 @@ 121.53.0.0 - 121.53.255.255 kr 121.54.0.0 - 121.54.127.255 ph 121.54.128.0 - 121.54.159.255 au -121.54.160.0 - 121.54.167.255 ph +121.54.160.0 - 121.54.163.255 hk +121.54.164.0 - 121.54.167.255 mm 121.54.168.0 - 121.54.175.255 hk -121.54.176.0 - 121.54.183.255 nz -121.54.184.0 - 121.54.191.255 jp +121.54.176.0 - 121.54.183.255 cn 121.54.192.0 - 121.54.255.255 kr 121.55.0.0 - 121.55.63.255 cn 121.55.64.0 - 121.55.191.255 kr 121.55.192.0 - 121.55.255.255 gu 121.56.0.0 - 121.58.127.255 cn 121.58.128.0 - 121.58.135.255 jp -121.58.136.0 - 121.58.143.255 id -121.58.144.0 - 121.58.159.255 cn -121.58.160.0 - 121.58.167.255 af +121.58.136.0 - 121.58.167.255 cn 121.58.168.0 - 121.58.175.255 in 121.58.176.0 - 121.58.183.255 jp 121.58.184.0 - 121.58.191.255 id @@ -66656,11 +47863,12 @@ 121.100.8.0 - 121.100.15.255 jp 121.100.16.0 - 121.100.31.255 id 121.100.32.0 - 121.100.47.255 sg -121.100.48.0 - 121.100.55.255 af +121.100.48.0 - 121.100.50.255 af +121.100.51.0 - 121.100.51.255 us +121.100.52.0 - 121.100.55.255 af 121.100.56.0 - 121.100.63.255 jp 121.100.64.0 - 121.100.127.255 kr -121.100.128.0 - 121.100.255.255 cn -121.101.0.0 - 121.101.63.255 au +121.100.128.0 - 121.101.63.255 cn 121.101.64.0 - 121.101.127.255 jp 121.101.128.0 - 121.101.135.255 id 121.101.136.0 - 121.101.143.255 au @@ -66672,7 +47880,9 @@ 121.101.192.0 - 121.101.207.255 kr 121.101.208.0 - 121.101.223.255 cn 121.101.224.0 - 121.101.255.255 kr -121.102.0.0 - 121.119.255.255 jp +121.102.0.0 - 121.119.214.255 jp +121.119.215.0 - 121.119.215.255 us +121.119.216.0 - 121.119.255.255 jp 121.120.0.0 - 121.123.255.255 my 121.124.0.0 - 121.126.255.255 kr 121.127.0.0 - 121.127.31.255 ph @@ -66687,7 +47897,7 @@ 121.200.60.0 - 121.200.63.255 bd 121.200.64.0 - 121.200.127.255 kr 121.200.128.0 - 121.200.191.255 jp -121.200.192.0 - 121.200.199.255 bd +121.200.192.0 - 121.200.199.255 cn 121.200.200.0 - 121.200.207.255 jp 121.200.208.0 - 121.200.215.255 au 121.200.216.0 - 121.200.223.255 jp @@ -66711,7 +47921,17 @@ 122.0.64.0 - 122.0.255.255 cn 122.1.0.0 - 122.1.255.255 jp 122.2.0.0 - 122.3.255.255 ph -122.4.0.0 - 122.15.255.255 cn +122.4.0.0 - 122.8.255.255 cn +122.9.0.0 - 122.10.63.255 hk +122.10.64.0 - 122.10.79.255 kr +122.10.80.0 - 122.10.119.255 hk +122.10.120.0 - 122.10.127.255 us +122.10.128.0 - 122.11.127.255 cn +122.11.128.0 - 122.11.255.255 sg +122.12.0.0 - 122.14.128.255 cn +122.14.129.0 - 122.14.138.0 hk +122.14.138.1 - 122.14.255.255 cn +122.15.0.0 - 122.15.255.255 in 122.16.0.0 - 122.31.255.255 jp 122.32.0.0 - 122.47.255.255 kr 122.48.0.0 - 122.49.63.255 cn @@ -66724,7 +47944,18 @@ 122.49.232.0 - 122.49.255.255 jp 122.50.0.0 - 122.50.15.255 sg 122.50.16.0 - 122.50.63.255 jp -122.50.64.0 - 122.50.127.255 sg +122.50.64.0 - 122.50.97.255 sg +122.50.98.0 - 122.50.98.255 jp +122.50.99.0 - 122.50.99.255 sg +122.50.100.0 - 122.50.100.127 jp +122.50.100.128 - 122.50.112.255 sg +122.50.113.0 - 122.50.113.127 jp +122.50.113.128 - 122.50.114.255 sg +122.50.115.0 - 122.50.115.127 jp +122.50.115.128 - 122.50.115.191 sg +122.50.115.192 - 122.50.116.127 jp +122.50.116.128 - 122.50.126.255 sg +122.50.127.0 - 122.50.127.255 jp 122.50.128.0 - 122.50.255.255 in 122.51.0.0 - 122.51.255.255 cn 122.52.0.0 - 122.55.255.255 ph @@ -66749,14 +47980,18 @@ 122.102.24.0 - 122.102.31.255 in 122.102.32.0 - 122.102.39.255 bd 122.102.40.0 - 122.102.55.255 id -122.102.56.0 - 122.102.63.255 bd +122.102.56.0 - 122.102.63.255 jp 122.102.64.0 - 122.102.95.255 cn -122.102.96.0 - 122.102.111.255 au +122.102.96.0 - 122.102.107.255 au +122.102.108.0 - 122.102.109.255 nz +122.102.110.0 - 122.102.111.255 au 122.102.112.0 - 122.102.115.255 vn 122.102.116.0 - 122.102.127.255 in 122.102.128.0 - 122.103.255.255 jp 122.104.0.0 - 122.111.255.255 au -122.112.0.0 - 122.115.255.255 cn +122.112.0.0 - 122.115.75.255 cn +122.115.76.0 - 122.115.79.255 hk +122.115.80.0 - 122.115.255.255 cn 122.116.0.0 - 122.118.255.255 tw 122.119.0.0 - 122.119.255.255 cn 122.120.0.0 - 122.127.255.255 tw @@ -66765,12 +48000,13 @@ 122.128.32.0 - 122.128.79.255 kr 122.128.80.0 - 122.128.87.255 tw 122.128.88.0 - 122.128.95.255 au -122.128.96.0 - 122.128.103.255 np +122.128.96.0 - 122.128.99.255 jp +122.128.100.0 - 122.128.103.255 cn 122.128.104.0 - 122.128.111.255 hk 122.128.112.0 - 122.128.119.255 jp -122.128.120.0 - 122.128.127.255 vu +122.128.120.0 - 122.128.127.255 cn 122.128.128.0 - 122.128.255.255 kr -122.129.0.0 - 122.129.63.255 au +122.129.0.0 - 122.129.63.255 vn 122.129.64.0 - 122.129.95.255 pk 122.129.96.0 - 122.129.119.255 id 122.129.120.0 - 122.129.127.255 my @@ -66797,48 +48033,19 @@ 122.152.48.0 - 122.152.55.255 bd 122.152.56.0 - 122.152.95.255 jp 122.152.96.0 - 122.152.127.255 kr -122.152.128.0 - 122.152.130.63 jp -122.152.130.64 - 122.152.130.91 hk -122.152.130.92 - 122.152.130.111 jp -122.152.130.112 - 122.152.130.191 hk -122.152.130.192 - 122.152.130.231 jp -122.152.130.232 - 122.152.130.239 hk -122.152.130.240 - 122.152.130.255 jp -122.152.131.0 - 122.152.131.255 hk -122.152.132.0 - 122.152.133.159 au -122.152.133.160 - 122.152.133.175 nz -122.152.133.176 - 122.152.133.223 au -122.152.133.224 - 122.152.135.255 jp -122.152.136.0 - 122.152.136.175 sg -122.152.136.176 - 122.152.136.191 jp -122.152.136.192 - 122.152.136.255 sg -122.152.137.0 - 122.152.137.255 jp -122.152.138.0 - 122.152.138.247 hk -122.152.138.248 - 122.152.138.255 jp -122.152.139.0 - 122.152.139.191 hk -122.152.139.192 - 122.152.142.47 jp -122.152.142.48 - 122.152.142.63 sg -122.152.142.64 - 122.152.142.127 jp -122.152.142.128 - 122.152.143.127 sg -122.152.143.128 - 122.152.147.255 jp -122.152.148.0 - 122.152.148.47 au -122.152.148.48 - 122.152.148.63 jp -122.152.148.64 - 122.152.148.79 au -122.152.148.80 - 122.152.148.95 jp -122.152.148.96 - 122.152.148.127 au -122.152.148.128 - 122.152.149.255 jp -122.152.150.0 - 122.152.150.55 hk -122.152.150.56 - 122.152.150.63 jp -122.152.150.64 - 122.152.150.95 hk -122.152.150.96 - 122.152.150.127 jp -122.152.150.128 - 122.152.150.255 hk -122.152.151.0 - 122.152.174.255 jp -122.152.175.0 - 122.152.175.255 hk -122.152.176.0 - 122.152.180.31 jp -122.152.180.32 - 122.152.180.61 hk -122.152.180.62 - 122.152.189.63 jp -122.152.189.64 - 122.152.189.67 hk -122.152.189.68 - 122.152.191.255 jp +122.152.128.0 - 122.152.130.111 jp +122.152.130.112 - 122.152.130.127 hk +122.152.130.128 - 122.152.136.223 jp +122.152.136.224 - 122.152.136.255 my +122.152.137.0 - 122.152.138.183 jp +122.152.138.184 - 122.152.138.191 hk +122.152.138.192 - 122.152.140.63 jp +122.152.140.64 - 122.152.140.127 au +122.152.140.128 - 122.152.145.49 jp +122.152.145.50 - 122.152.145.50 ap +122.152.145.51 - 122.152.164.41 jp +122.152.164.42 - 122.152.164.42 sg +122.152.164.43 - 122.152.191.255 jp 122.152.192.0 - 122.152.255.255 cn 122.153.0.0 - 122.153.255.255 kr 122.154.0.0 - 122.155.255.255 th @@ -66853,18 +48060,22 @@ 122.200.16.0 - 122.200.23.255 in 122.200.24.0 - 122.200.31.255 au 122.200.32.0 - 122.200.39.255 jp -122.200.40.0 - 122.200.47.255 bd +122.200.40.0 - 122.200.47.255 cn 122.200.48.0 - 122.200.55.255 id 122.200.56.0 - 122.200.63.255 au 122.200.64.0 - 122.200.127.255 cn -122.200.128.0 - 122.200.143.255 au +122.200.128.0 - 122.200.131.255 jp +122.200.132.0 - 122.200.135.255 hk +122.200.136.0 - 122.200.143.255 jp 122.200.144.0 - 122.200.151.255 id 122.200.152.0 - 122.200.159.255 tw 122.200.160.0 - 122.200.191.255 au 122.200.192.0 - 122.201.7.255 jp 122.201.8.0 - 122.201.15.255 vn 122.201.16.0 - 122.201.31.255 mn -122.201.32.0 - 122.201.47.255 hk +122.201.32.0 - 122.201.36.255 hk +122.201.37.0 - 122.201.37.255 id +122.201.38.0 - 122.201.47.255 hk 122.201.48.0 - 122.201.63.255 cn 122.201.64.0 - 122.201.127.255 au 122.201.128.0 - 122.201.255.255 tw @@ -66878,39 +48089,30 @@ 122.208.0.0 - 122.223.255.255 jp 122.224.0.0 - 122.247.255.255 cn 122.248.0.0 - 122.248.15.255 bd -122.248.16.0 - 122.248.31.255 hk -122.248.32.0 - 122.248.47.255 bd +122.248.16.0 - 122.248.16.1 ph +122.248.16.2 - 122.248.16.2 ap +122.248.16.3 - 122.248.16.255 ph +122.248.17.0 - 122.248.23.255 hk +122.248.24.0 - 122.248.31.255 cn +122.248.32.0 - 122.248.47.255 id 122.248.48.0 - 122.248.63.255 cn 122.248.64.0 - 122.248.95.255 jp 122.248.96.0 - 122.248.127.255 mm 122.248.128.0 - 122.248.129.255 sg -122.248.130.0 - 122.248.130.255 jp -122.248.131.0 - 122.248.133.95 sg -122.248.133.96 - 122.248.133.127 jp -122.248.133.128 - 122.248.133.247 sg -122.248.133.248 - 122.248.133.255 jp -122.248.134.0 - 122.248.134.31 sg -122.248.134.32 - 122.248.135.255 jp -122.248.136.0 - 122.248.139.255 hk -122.248.140.0 - 122.248.140.255 jp -122.248.141.0 - 122.248.141.191 hk -122.248.141.192 - 122.248.141.255 jp -122.248.142.0 - 122.248.142.127 hk -122.248.142.128 - 122.248.147.255 jp -122.248.148.0 - 122.248.150.32 au -122.248.150.33 - 122.248.150.63 jp -122.248.150.64 - 122.248.150.119 au -122.248.150.120 - 122.248.151.255 jp -122.248.152.0 - 122.248.156.23 au -122.248.156.24 - 122.248.156.31 jp -122.248.156.32 - 122.248.156.63 au -122.248.156.64 - 122.248.156.127 jp -122.248.156.128 - 122.248.157.255 au -122.248.158.0 - 122.248.159.255 jp -122.248.160.0 - 122.248.160.87 in -122.248.160.88 - 122.248.167.255 jp -122.248.168.0 - 122.248.168.31 sg -122.248.168.32 - 122.248.191.255 jp +122.248.130.0 - 122.248.130.255 au +122.248.131.0 - 122.248.131.255 sg +122.248.132.0 - 122.248.132.255 ap +122.248.133.0 - 122.248.135.255 sg +122.248.136.0 - 122.248.143.255 hk +122.248.144.0 - 122.248.147.255 jp +122.248.148.0 - 122.248.159.255 au +122.248.160.0 - 122.248.163.255 in +122.248.164.0 - 122.248.174.255 jp +122.248.175.0 - 122.248.175.255 ph +122.248.176.0 - 122.248.176.255 in +122.248.177.0 - 122.248.181.255 jp +122.248.182.0 - 122.248.183.255 in +122.248.184.0 - 122.248.191.255 jp 122.248.192.0 - 122.248.255.255 sg 122.249.0.0 - 122.251.255.255 jp 122.252.0.0 - 122.252.23.255 au @@ -66918,7 +48120,8 @@ 122.252.64.0 - 122.252.127.255 kr 122.252.128.0 - 122.252.135.255 ap 122.252.136.0 - 122.252.143.255 jp -122.252.144.0 - 122.252.151.255 ap +122.252.144.0 - 122.252.147.255 ap +122.252.148.0 - 122.252.151.255 au 122.252.152.0 - 122.252.159.255 nz 122.252.160.0 - 122.252.175.255 tw 122.252.176.0 - 122.252.183.255 kh @@ -66927,11 +48130,16 @@ 122.252.224.0 - 122.252.255.255 in 122.253.0.0 - 122.253.255.255 jp 122.254.0.0 - 122.254.63.255 tw -122.254.64.0 - 122.254.127.255 mn +122.254.64.0 - 122.254.64.255 mn +122.254.65.0 - 122.254.65.255 jp +122.254.66.0 - 122.254.79.255 mn +122.254.80.0 - 122.254.80.255 jp +122.254.81.0 - 122.254.127.255 mn 122.254.128.0 - 122.254.255.255 kr 122.255.0.0 - 122.255.63.255 lk -122.255.64.0 - 122.255.71.255 bd -122.255.72.0 - 122.255.79.255 in +122.255.64.0 - 122.255.71.255 cn +122.255.72.0 - 122.255.75.255 in +122.255.76.0 - 122.255.79.255 jp 122.255.80.0 - 122.255.95.255 tw 122.255.96.0 - 122.255.127.255 my 122.255.128.0 - 122.255.255.255 jp @@ -66959,7 +48167,11 @@ 123.50.192.0 - 123.50.255.255 jp 123.51.0.0 - 123.51.127.255 au 123.51.128.0 - 123.51.255.255 tw -123.52.0.0 - 123.98.127.255 cn +123.52.0.0 - 123.59.255.255 cn +123.60.0.0 - 123.60.255.255 hk +123.61.0.0 - 123.62.255.255 cn +123.63.0.0 - 123.63.255.255 in +123.64.0.0 - 123.98.127.255 cn 123.98.128.0 - 123.98.143.255 au 123.98.144.0 - 123.98.159.255 jp 123.98.160.0 - 123.98.223.255 kr @@ -66972,16 +48184,12 @@ 123.100.128.0 - 123.100.159.255 au 123.100.160.0 - 123.100.191.255 kr 123.100.192.0 - 123.100.223.255 jp -123.100.224.0 - 123.100.225.255 my -123.100.226.0 - 123.100.227.255 sg -123.100.228.0 - 123.100.229.255 au -123.100.230.0 - 123.100.231.255 sg -123.100.232.0 - 123.100.232.255 cn -123.100.233.0 - 123.100.233.255 sg -123.100.234.0 - 123.100.234.255 in -123.100.235.0 - 123.100.235.255 sg -123.100.236.0 - 123.100.239.255 us -123.100.240.0 - 123.100.255.255 sg +123.100.224.0 - 123.100.226.255 my +123.100.227.0 - 123.100.227.255 sg +123.100.228.0 - 123.100.231.255 au +123.100.232.0 - 123.100.232.255 sg +123.100.233.0 - 123.100.233.255 au +123.100.234.0 - 123.100.255.255 sg 123.101.0.0 - 123.101.255.255 cn 123.102.0.0 - 123.102.255.255 au 123.103.0.0 - 123.103.127.255 cn @@ -67064,6 +48272,7 @@ 123.240.0.0 - 123.241.255.255 tw 123.242.0.0 - 123.242.127.255 cn 123.242.128.0 - 123.242.191.255 th +123.242.192.0 - 123.242.199.255 cn 123.242.200.0 - 123.242.207.255 ph 123.242.208.0 - 123.242.223.255 jp 123.242.224.0 - 123.242.231.255 hk @@ -67079,7 +48288,7 @@ 123.253.0.0 - 123.253.255.255 cn 123.254.0.0 - 123.254.63.255 jp 123.254.64.0 - 123.254.95.255 kr -123.254.96.0 - 123.254.103.255 ap +123.254.96.0 - 123.254.103.255 cn 123.254.104.0 - 123.254.111.255 hk 123.254.112.0 - 123.254.127.255 au 123.254.128.0 - 123.254.255.255 kr @@ -67095,7 +48304,11 @@ 124.4.0.0 - 124.4.255.255 in 124.5.0.0 - 124.5.255.255 kr 124.6.0.0 - 124.6.31.255 tw -124.6.32.0 - 124.6.63.255 ap +124.6.32.0 - 124.6.35.255 hk +124.6.36.0 - 124.6.39.255 gb +124.6.40.0 - 124.6.47.255 us +124.6.48.0 - 124.6.51.255 id +124.6.52.0 - 124.6.63.255 sg 124.6.64.0 - 124.6.127.255 cn 124.6.128.0 - 124.6.191.255 ph 124.6.192.0 - 124.6.223.255 nz @@ -67116,11 +48329,20 @@ 124.29.192.0 - 124.29.255.255 pk 124.30.0.0 - 124.30.255.255 in 124.31.0.0 - 124.31.255.255 cn -124.32.0.0 - 124.40.111.255 jp -124.40.112.0 - 124.40.191.255 cn -124.40.192.0 - 124.40.223.255 au +124.32.0.0 - 124.40.42.255 jp +124.40.43.0 - 124.40.43.255 us +124.40.44.0 - 124.40.47.255 jp +124.40.48.0 - 124.40.48.255 us +124.40.49.0 - 124.40.55.255 jp +124.40.56.0 - 124.40.56.255 us +124.40.57.0 - 124.40.57.255 jp +124.40.58.0 - 124.40.59.255 us +124.40.60.0 - 124.40.61.255 jp +124.40.62.0 - 124.40.62.255 us +124.40.63.0 - 124.40.111.255 jp +124.40.112.0 - 124.40.223.255 cn 124.40.224.0 - 124.40.239.255 th -124.40.240.0 - 124.40.243.255 au +124.40.240.0 - 124.40.243.255 cn 124.40.244.0 - 124.40.247.255 in 124.40.248.0 - 124.40.255.255 id 124.41.0.0 - 124.41.191.255 jp @@ -67131,13 +48353,19 @@ 124.46.0.0 - 124.46.255.255 kr 124.47.0.0 - 124.47.63.255 cn 124.47.64.0 - 124.47.127.255 jp -124.47.128.0 - 124.47.191.255 in +124.47.128.0 - 124.47.142.255 au +124.47.143.0 - 124.47.143.255 us +124.47.144.0 - 124.47.147.255 au +124.47.148.0 - 124.47.149.255 us +124.47.150.0 - 124.47.191.255 au 124.47.192.0 - 124.47.255.255 jp -124.48.0.0 - 124.63.255.255 kr +124.48.0.0 - 124.54.206.255 kr +124.54.207.0 - 124.54.207.255 jp +124.54.208.0 - 124.63.255.255 kr 124.64.0.0 - 124.66.127.255 cn 124.66.128.0 - 124.66.159.255 sg 124.66.160.0 - 124.66.167.255 id -124.66.168.0 - 124.66.175.255 jp +124.66.168.0 - 124.66.175.255 in 124.66.176.0 - 124.66.191.255 kr 124.66.192.0 - 124.66.207.255 jp 124.66.208.0 - 124.66.223.255 kr @@ -67154,26 +48382,32 @@ 124.108.0.0 - 124.108.3.255 au 124.108.4.0 - 124.108.7.255 kh 124.108.8.0 - 124.108.15.255 cn -124.108.16.0 - 124.108.23.255 bd +124.108.16.0 - 124.108.19.255 in +124.108.20.0 - 124.108.23.255 hk 124.108.24.0 - 124.108.31.255 fj 124.108.32.0 - 124.108.39.255 jp 124.108.40.0 - 124.108.47.255 cn 124.108.48.0 - 124.108.55.255 kh -124.108.56.0 - 124.108.63.255 jp -124.108.64.0 - 124.108.95.255 hk +124.108.56.0 - 124.108.71.255 jp +124.108.72.0 - 124.108.75.255 sg +124.108.76.0 - 124.108.77.255 hk +124.108.78.0 - 124.108.79.255 sg +124.108.80.0 - 124.108.85.255 hk +124.108.86.0 - 124.108.87.255 jp +124.108.88.0 - 124.108.91.255 hk +124.108.92.0 - 124.108.95.255 tw 124.108.96.0 - 124.108.99.255 au -124.108.100.0 - 124.108.111.255 ap -124.108.112.0 - 124.108.127.255 hk +124.108.100.0 - 124.108.127.255 hk 124.108.128.0 - 124.108.191.255 tw 124.108.192.0 - 124.108.255.255 jp 124.109.0.0 - 124.109.3.255 th -124.109.4.0 - 124.109.7.255 sg +124.109.4.0 - 124.109.6.255 sg +124.109.7.0 - 124.109.7.255 ph 124.109.8.0 - 124.109.15.255 fm -124.109.16.0 - 124.109.23.255 bd 124.109.24.0 - 124.109.31.255 th 124.109.32.0 - 124.109.63.255 pk 124.109.64.0 - 124.109.95.255 au -124.109.96.0 - 124.109.103.255 ap +124.109.96.0 - 124.109.103.255 cn 124.109.104.0 - 124.109.107.255 bd 124.109.108.0 - 124.109.111.255 jp 124.109.112.0 - 124.109.127.255 tw @@ -67205,7 +48439,7 @@ 124.155.224.0 - 124.155.239.255 nz 124.155.240.0 - 124.155.255.255 in 124.156.0.0 - 124.156.255.255 cn -124.157.0.0 - 124.157.63.255 au +124.157.0.0 - 124.157.63.255 vn 124.157.64.0 - 124.157.127.255 nz 124.157.128.0 - 124.157.255.255 th 124.158.0.0 - 124.158.15.255 vn @@ -67238,7 +48472,7 @@ 124.198.128.0 - 124.198.255.255 nz 124.199.0.0 - 124.199.63.255 kr 124.199.64.0 - 124.199.111.255 tw -124.199.112.0 - 124.199.127.255 sg +124.199.112.0 - 124.199.127.255 af 124.199.128.0 - 124.199.255.255 kr 124.200.0.0 - 124.207.255.255 cn 124.208.0.0 - 124.215.255.255 jp @@ -67246,7 +48480,9 @@ 124.217.0.0 - 124.217.127.255 ph 124.217.128.0 - 124.217.191.255 hk 124.217.192.0 - 124.217.223.255 kr -124.217.224.0 - 124.217.255.255 my +124.217.224.0 - 124.217.236.255 my +124.217.237.0 - 124.217.239.255 sg +124.217.240.0 - 124.217.255.255 my 124.218.0.0 - 124.219.127.255 tw 124.219.128.0 - 124.219.255.255 jp 124.220.0.0 - 124.240.191.255 cn @@ -67268,7 +48504,8 @@ 124.248.160.0 - 124.248.191.255 kh 124.248.192.0 - 124.248.255.255 hk 124.249.0.0 - 124.251.255.255 cn -124.252.0.0 - 124.252.255.255 au +124.252.0.0 - 124.252.47.255 be +124.252.48.0 - 124.252.255.255 au 124.253.0.0 - 124.253.255.255 in 124.254.0.0 - 124.254.63.255 cn 124.254.64.0 - 124.254.127.255 au @@ -67289,7 +48526,7 @@ 125.48.0.0 - 125.56.127.255 jp 125.56.128.0 - 125.56.255.255 us 125.57.0.0 - 125.57.255.255 kr -125.58.0.0 - 125.58.63.255 au +125.58.0.0 - 125.58.63.255 vn 125.58.64.0 - 125.58.127.255 jp 125.58.128.0 - 125.58.255.255 cn 125.59.0.0 - 125.59.255.255 hk @@ -67335,9 +48572,7 @@ 125.213.160.0 - 125.213.191.255 au 125.213.192.0 - 125.213.223.255 af 125.213.224.0 - 125.213.255.255 th -125.214.0.0 - 125.214.43.103 vn -125.214.43.104 - 125.214.43.111 kh -125.214.43.112 - 125.214.63.255 vn +125.214.0.0 - 125.214.63.255 vn 125.214.64.0 - 125.214.95.255 au 125.214.96.0 - 125.214.127.255 cn 125.214.128.0 - 125.214.159.255 jp @@ -67347,90 +48582,104 @@ 125.215.64.0 - 125.215.127.255 jp 125.215.128.0 - 125.215.255.255 hk 125.216.0.0 - 125.223.255.255 cn -125.224.0.0 - 125.233.255.255 tw +125.224.0.0 - 125.227.209.255 tw +125.227.210.0 - 125.227.211.255 cn +125.227.212.0 - 125.233.255.255 tw 125.234.0.0 - 125.235.255.255 vn 125.236.0.0 - 125.239.255.255 nz -125.240.0.0 - 125.252.63.255 kr -125.252.64.0 - 125.252.64.31 ap -125.252.64.32 - 125.252.64.63 tw -125.252.64.64 - 125.252.64.127 ph -125.252.64.128 - 125.252.64.159 ap -125.252.64.160 - 125.252.64.191 ph -125.252.64.192 - 125.252.64.223 ap -125.252.64.224 - 125.252.65.31 tw -125.252.65.32 - 125.252.65.63 ap -125.252.65.64 - 125.252.65.127 ph -125.252.65.128 - 125.252.66.191 ap -125.252.66.192 - 125.252.66.207 tw -125.252.66.208 - 125.252.67.31 ph -125.252.67.32 - 125.252.67.47 tw -125.252.67.48 - 125.252.67.63 ap -125.252.67.64 - 125.252.67.207 ph -125.252.67.208 - 125.252.67.215 tw -125.252.67.216 - 125.252.67.223 ph -125.252.67.224 - 125.252.68.63 ap -125.252.68.64 - 125.252.68.255 ph -125.252.69.0 - 125.252.69.255 tw -125.252.70.0 - 125.252.70.15 ph -125.252.70.16 - 125.252.70.31 ap -125.252.70.32 - 125.252.70.55 ph -125.252.70.56 - 125.252.70.127 ap -125.252.70.128 - 125.252.70.223 ph -125.252.70.224 - 125.252.70.231 ap -125.252.70.232 - 125.252.70.239 ph -125.252.70.240 - 125.252.70.255 tw -125.252.71.0 - 125.252.71.159 ap -125.252.71.160 - 125.252.73.255 ph -125.252.74.0 - 125.252.74.63 ap -125.252.74.64 - 125.252.74.191 tw -125.252.74.192 - 125.252.75.255 ap -125.252.76.0 - 125.252.77.255 tw -125.252.78.0 - 125.252.79.255 jp -125.252.80.0 - 125.252.82.255 ap -125.252.83.0 - 125.252.85.255 ph -125.252.86.0 - 125.252.86.255 ap -125.252.87.0 - 125.252.87.255 hk -125.252.88.0 - 125.252.89.255 jp -125.252.90.0 - 125.252.90.255 ph -125.252.91.0 - 125.252.91.255 ap -125.252.92.0 - 125.252.95.255 au -125.252.96.0 - 125.252.97.255 ap -125.252.98.0 - 125.252.98.255 ph -125.252.99.0 - 125.252.101.255 ap -125.252.102.0 - 125.252.103.223 hk -125.252.103.224 - 125.252.105.255 ap -125.252.106.0 - 125.252.106.255 jp -125.252.107.0 - 125.252.107.255 hk -125.252.108.0 - 125.252.108.255 ap -125.252.109.0 - 125.252.109.255 ph -125.252.110.0 - 125.252.127.255 ap -125.252.128.0 - 125.252.191.255 jp -125.252.192.0 - 125.252.225.255 ap +125.240.0.0 - 125.250.93.255 kr +125.250.94.0 - 125.250.94.255 sg +125.250.95.0 - 125.252.63.255 kr +125.252.64.0 - 125.252.68.127 jp +125.252.68.128 - 125.252.68.191 tw +125.252.68.192 - 125.252.72.159 jp +125.252.72.160 - 125.252.72.191 sg +125.252.72.192 - 125.252.78.255 jp +125.252.79.0 - 125.252.79.255 au +125.252.80.0 - 125.252.81.191 jp +125.252.81.192 - 125.252.81.223 au +125.252.81.224 - 125.252.85.127 jp +125.252.85.128 - 125.252.85.159 sg +125.252.85.160 - 125.252.93.255 jp +125.252.94.0 - 125.252.94.255 sg +125.252.95.0 - 125.252.103.159 jp +125.252.103.160 - 125.252.103.175 hk +125.252.103.176 - 125.252.104.183 jp +125.252.104.184 - 125.252.104.191 au +125.252.104.192 - 125.252.105.223 jp +125.252.105.224 - 125.252.105.239 hk +125.252.105.240 - 125.252.191.255 jp +125.252.192.0 - 125.252.225.255 sg 125.252.226.0 - 125.252.226.255 in -125.252.227.0 - 125.252.239.255 ap +125.252.227.0 - 125.252.239.255 sg 125.252.240.0 - 125.252.255.255 jp 125.253.0.0 - 125.253.111.255 au 125.253.112.0 - 125.253.127.255 vn 125.253.128.0 - 125.253.255.255 hk 125.254.0.0 - 125.254.51.255 au -125.254.52.0 - 125.254.55.255 hk +125.254.52.0 - 125.254.55.255 in 125.254.56.0 - 125.254.59.255 jp 125.254.60.0 - 125.254.127.255 au 125.254.128.0 - 125.254.255.255 cn 125.255.0.0 - 125.255.255.255 au -126.0.0.0 - 126.255.255.255 jp -128.0.0.0 - 128.0.255.255 eu +126.0.0.0 - 126.80.221.255 jp +126.80.222.0 - 126.80.222.255 es +126.80.223.0 - 126.255.255.255 jp +128.0.0.0 - 128.0.7.255 ro +128.0.8.0 - 128.0.15.255 dk +128.0.16.0 - 128.0.23.255 no +128.0.24.0 - 128.0.31.255 ru +128.0.32.0 - 128.0.43.255 de +128.0.44.0 - 128.0.44.255 ro +128.0.45.0 - 128.0.45.255 de +128.0.46.0 - 128.0.51.255 ro +128.0.52.0 - 128.0.52.255 de +128.0.53.0 - 128.0.53.255 ro +128.0.54.0 - 128.0.56.255 de +128.0.57.0 - 128.0.57.255 ro +128.0.58.0 - 128.0.63.255 de +128.0.64.0 - 128.0.67.255 fr +128.0.68.0 - 128.0.71.255 nl +128.0.72.0 - 128.0.79.255 dk +128.0.80.0 - 128.0.95.255 ru +128.0.96.0 - 128.0.103.255 de +128.0.104.0 - 128.0.105.255 ua +128.0.106.0 - 128.0.106.255 ru +128.0.107.0 - 128.0.111.255 cy +128.0.112.0 - 128.0.127.255 de +128.0.128.0 - 128.0.143.255 ru +128.0.144.0 - 128.0.159.255 de +128.0.160.0 - 128.0.167.255 ru +128.0.168.0 - 128.0.175.255 ua +128.0.176.0 - 128.0.191.255 cz +128.0.192.0 - 128.0.199.255 de +128.0.200.0 - 128.0.204.255 gr +128.0.205.0 - 128.0.205.255 cy +128.0.206.0 - 128.0.208.255 gr +128.0.209.0 - 128.0.209.255 cy +128.0.210.0 - 128.0.213.255 gr +128.0.214.0 - 128.0.215.255 cy +128.0.216.0 - 128.0.221.255 gr +128.0.222.0 - 128.0.223.255 cy +128.0.224.0 - 128.0.224.255 gr +128.0.225.0 - 128.0.225.255 cy +128.0.226.0 - 128.0.238.255 gr +128.0.239.0 - 128.0.239.255 cy +128.0.240.0 - 128.0.242.255 gr +128.0.243.0 - 128.0.243.255 cy +128.0.244.0 - 128.0.245.255 gr +128.0.246.0 - 128.0.246.255 cy +128.0.247.0 - 128.0.253.255 gr +128.0.254.0 - 128.0.254.255 cy +128.0.255.0 - 128.0.255.255 gr 128.1.0.0 - 128.6.255.255 us 128.7.0.0 - 128.7.255.255 de -128.8.0.0 - 128.11.62.99 us -128.11.62.100 - 128.11.62.119 au -128.11.62.120 - 128.11.96.31 us -128.11.96.32 - 128.11.96.63 ca -128.11.96.64 - 128.15.255.255 us +128.8.0.0 - 128.15.255.255 us 128.16.0.0 - 128.16.255.255 gb 128.17.0.0 - 128.38.255.255 us 128.39.0.0 - 128.39.255.255 no -128.40.0.0 - 128.41.255.255 gb +128.40.0.0 - 128.41.127.255 gb +128.41.128.0 - 128.41.255.255 af 128.42.0.0 - 128.42.255.255 us 128.43.0.0 - 128.43.255.255 ca 128.44.0.0 - 128.44.255.255 us @@ -67448,18 +48697,64 @@ 128.65.160.0 - 128.65.191.255 ir 128.65.192.0 - 128.65.199.255 ch 128.65.200.0 - 128.65.207.255 it -128.65.208.0 - 128.65.211.255 nl -128.65.212.0 - 128.65.212.15 de -128.65.212.16 - 128.65.219.255 nl -128.65.220.0 - 128.65.223.255 de +128.65.208.0 - 128.65.211.255 de +128.65.212.0 - 128.65.215.255 nl +128.65.216.0 - 128.65.219.255 de +128.65.220.0 - 128.65.223.255 nl 128.65.224.0 - 128.65.255.255 pt 128.66.0.0 - 128.67.255.255 it 128.68.0.0 - 128.75.255.255 ru 128.76.0.0 - 128.77.255.255 dk 128.78.0.0 - 128.79.255.255 fr 128.80.0.0 - 128.85.255.255 us -128.86.0.0 - 128.87.255.255 gb -128.88.0.0 - 128.92.255.255 us +128.86.0.0 - 128.86.255.255 gb +128.87.0.0 - 128.87.255.255 se +128.88.0.0 - 128.88.254.255 us +128.88.255.0 - 128.88.255.255 ap +128.89.0.0 - 128.90.9.255 us +128.90.10.0 - 128.90.13.255 gb +128.90.14.0 - 128.90.14.127 at +128.90.14.128 - 128.90.14.191 cz +128.90.14.192 - 128.90.14.255 fi +128.90.15.0 - 128.90.15.63 pl +128.90.15.64 - 128.90.15.127 pt +128.90.15.128 - 128.90.15.191 tr +128.90.15.192 - 128.90.15.255 us +128.90.16.0 - 128.90.19.255 gb +128.90.20.0 - 128.90.20.255 ch +128.90.21.0 - 128.90.21.255 is +128.90.22.0 - 128.90.22.255 ie +128.90.23.0 - 128.90.23.255 ch +128.90.24.0 - 128.90.24.255 es +128.90.25.0 - 128.90.25.255 pl +128.90.26.0 - 128.90.58.255 us +128.90.59.0 - 128.90.59.255 il +128.90.60.0 - 128.90.60.255 in +128.90.61.0 - 128.90.61.255 sa +128.90.62.0 - 128.90.62.255 qa +128.90.63.0 - 128.90.63.255 bh +128.90.64.0 - 128.90.95.255 us +128.90.96.0 - 128.90.99.255 jp +128.90.100.0 - 128.90.100.255 hk +128.90.101.0 - 128.90.101.255 ae +128.90.102.0 - 128.90.103.255 br +128.90.104.0 - 128.90.104.255 au +128.90.105.0 - 128.90.105.255 pa +128.90.106.0 - 128.90.106.255 ar +128.90.107.0 - 128.90.107.255 cr +128.90.108.0 - 128.90.108.255 co +128.90.109.0 - 128.90.109.255 mx +128.90.110.0 - 128.90.110.255 us +128.90.111.0 - 128.90.111.255 tw +128.90.112.0 - 128.90.112.255 pa +128.90.113.0 - 128.90.113.255 ar +128.90.114.0 - 128.90.114.255 cr +128.90.115.0 - 128.90.115.255 co +128.90.116.0 - 128.90.116.255 mx +128.90.117.0 - 128.90.117.255 us +128.90.118.0 - 128.90.118.255 tw +128.90.119.0 - 128.90.121.255 au +128.90.122.0 - 128.92.255.255 us 128.93.0.0 - 128.93.255.255 fr 128.94.0.0 - 128.97.255.255 us 128.98.0.0 - 128.98.255.255 gb @@ -67469,7 +48764,6 @@ 128.124.0.0 - 128.124.255.255 ua 128.125.0.0 - 128.126.255.255 us 128.127.0.0 - 128.127.7.255 it -128.127.8.0 - 128.127.15.255 ru 128.127.16.0 - 128.127.23.255 fr 128.127.24.0 - 128.127.31.255 gb 128.127.32.0 - 128.127.47.255 nl @@ -67481,8 +48775,11 @@ 128.127.96.0 - 128.127.103.255 ru 128.127.104.0 - 128.127.105.255 se 128.127.106.0 - 128.127.107.255 nl -128.127.108.0 - 128.127.108.255 ru -128.127.109.0 - 128.127.109.255 se +128.127.108.0 - 128.127.108.96 se +128.127.108.97 - 128.127.108.144 nl +128.127.108.145 - 128.127.108.164 se +128.127.108.165 - 128.127.108.255 nl +128.127.109.0 - 128.127.109.255 lu 128.127.110.0 - 128.127.111.255 nl 128.127.112.0 - 128.127.127.255 ro 128.127.128.0 - 128.127.143.255 fr @@ -67490,9 +48787,8 @@ 128.127.152.0 - 128.127.159.255 de 128.127.160.0 - 128.127.167.255 es 128.127.168.0 - 128.127.175.255 tr -128.127.176.0 - 128.127.183.255 kz 128.127.184.0 - 128.127.191.255 se -128.127.192.0 - 128.127.255.255 ro +128.127.192.0 - 128.127.255.255 sa 128.128.0.0 - 128.129.255.255 us 128.130.0.0 - 128.131.255.255 at 128.132.0.0 - 128.133.255.255 us @@ -67500,9 +48796,11 @@ 128.135.0.0 - 128.138.255.255 us 128.139.0.0 - 128.139.255.255 il 128.140.0.0 - 128.140.127.255 ir -128.140.128.0 - 128.140.143.255 a2 +128.140.128.0 - 128.140.138.255 a2 +128.140.139.0 - 128.140.141.255 fr +128.140.142.0 - 128.140.143.255 a2 128.140.144.0 - 128.140.151.255 fr -128.140.152.0 - 128.140.159.255 cy +128.140.152.0 - 128.140.159.255 gr 128.140.160.0 - 128.140.175.255 ru 128.140.176.0 - 128.140.191.255 bg 128.140.192.0 - 128.140.199.255 ru @@ -67521,45 +48819,51 @@ 128.178.0.0 - 128.179.255.255 ch 128.180.0.0 - 128.183.255.255 us 128.184.0.0 - 128.184.255.255 au -128.185.0.0 - 128.188.255.255 us +128.185.0.0 - 128.185.255.255 in +128.186.0.0 - 128.188.255.255 us 128.189.0.0 - 128.189.255.255 ca 128.190.0.0 - 128.198.255.255 us -128.199.0.0 - 128.199.255.255 gb +128.199.0.0 - 128.199.31.255 sg +128.199.32.0 - 128.199.63.255 nl +128.199.64.0 - 128.199.255.255 sg 128.200.0.0 - 128.203.255.255 us 128.204.0.0 - 128.204.127.255 ru 128.204.128.0 - 128.204.159.255 at 128.204.160.0 - 128.204.191.255 ru -128.204.192.0 - 128.204.195.20 nl -128.204.195.21 - 128.204.195.21 ro -128.204.195.22 - 128.204.207.255 nl +128.204.192.0 - 128.204.207.255 nl 128.204.208.0 - 128.204.215.255 fr 128.204.216.0 - 128.204.223.255 pl 128.204.224.0 - 128.204.239.255 nl 128.204.240.0 - 128.204.255.255 sa 128.205.0.0 - 128.213.255.255 us 128.214.0.0 - 128.214.255.255 fi -128.215.0.0 - 128.231.255.255 us +128.215.0.0 - 128.224.251.255 us +128.224.252.0 - 128.224.252.255 ca +128.224.253.0 - 128.231.255.255 us 128.232.0.0 - 128.232.255.255 gb 128.233.0.0 - 128.233.255.255 ca -128.234.0.0 - 128.234.255.255 ro +128.234.0.0 - 128.234.255.255 sa 128.235.0.0 - 128.239.255.255 us 128.240.0.0 - 128.240.255.255 gb -128.241.0.0 - 128.241.39.255 us -128.241.40.0 - 128.241.47.255 a1 -128.241.48.0 - 128.241.103.255 us -128.241.104.0 - 128.241.111.255 a1 -128.241.112.0 - 128.242.255.255 us +128.241.0.0 - 128.242.255.255 us 128.243.0.0 - 128.243.255.255 gb 128.244.0.0 - 128.245.255.255 us -128.246.0.0 - 128.246.255.255 ch +128.246.0.0 - 128.246.71.255 de +128.246.72.0 - 128.246.72.255 ap +128.246.73.0 - 128.246.127.255 de +128.246.128.0 - 128.246.128.255 us +128.246.129.0 - 128.246.255.255 de 128.247.0.0 - 128.249.255.255 us 128.250.0.0 - 128.250.255.255 au -128.251.0.0 - 129.10.255.255 us +128.251.0.0 - 128.255.255.255 us +129.0.0.0 - 129.0.255.255 cm +129.1.0.0 - 129.10.255.255 us 129.11.0.0 - 129.12.255.255 gb 129.13.0.0 - 129.13.255.255 de 129.14.0.0 - 129.15.255.255 us 129.16.0.0 - 129.16.255.255 se 129.17.0.0 - 129.17.255.255 us +129.18.0.0 - 129.18.255.255 ng 129.19.0.0 - 129.19.255.255 us 129.20.0.0 - 129.20.255.255 fr 129.21.0.0 - 129.25.255.255 us @@ -67569,13 +48873,22 @@ 129.31.0.0 - 129.31.255.255 gb 129.32.0.0 - 129.35.63.255 us 129.35.64.0 - 129.35.79.255 gb -129.35.80.0 - 129.59.255.255 us +129.35.80.0 - 129.35.156.3 us +129.35.156.4 - 129.35.156.4 de +129.35.156.5 - 129.44.255.255 us +129.45.0.0 - 129.45.127.255 dz +129.45.128.0 - 129.45.255.255 bf +129.46.0.0 - 129.55.255.255 us +129.56.0.0 - 129.56.255.255 ng +129.57.0.0 - 129.59.255.255 us 129.60.0.0 - 129.60.255.255 jp 129.61.0.0 - 129.66.255.255 us 129.67.0.0 - 129.67.255.255 gb 129.68.0.0 - 129.68.255.255 us 129.69.0.0 - 129.70.255.255 de -129.71.0.0 - 129.77.255.255 us +129.71.0.0 - 129.75.233.255 us +129.75.234.0 - 129.75.234.63 nl +129.75.234.64 - 129.77.255.255 us 129.78.0.0 - 129.78.255.255 au 129.79.0.0 - 129.87.255.255 us 129.88.0.0 - 129.88.255.255 fr @@ -67592,7 +48905,11 @@ 129.102.0.0 - 129.102.255.255 fr 129.103.0.0 - 129.103.255.255 de 129.104.0.0 - 129.104.255.255 fr -129.105.0.0 - 129.124.255.255 us +129.105.0.0 - 129.121.255.255 us +129.122.0.0 - 129.122.63.255 gh +129.122.64.0 - 129.122.127.255 re +129.122.128.0 - 129.122.255.255 ao +129.123.0.0 - 129.124.255.255 us 129.125.0.0 - 129.125.255.255 nl 129.126.0.0 - 129.126.255.255 us 129.127.0.0 - 129.127.255.255 au @@ -67617,24 +48934,37 @@ 129.178.0.0 - 129.178.255.255 se 129.179.0.0 - 129.179.255.255 us 129.180.0.0 - 129.180.255.255 au -129.181.0.0 - 129.185.255.255 fr +129.181.0.0 - 129.185.159.255 fr +129.185.160.0 - 129.185.191.255 de +129.185.192.0 - 129.185.255.255 fr 129.186.0.0 - 129.186.255.255 us 129.187.0.0 - 129.187.255.255 de -129.188.0.0 - 129.193.255.255 us +129.188.0.0 - 129.192.96.255 us +129.192.97.0 - 129.192.97.255 it +129.192.98.0 - 129.192.195.255 us +129.192.196.0 - 129.192.196.255 ap +129.192.197.0 - 129.192.207.255 us +129.192.208.0 - 129.192.208.255 au +129.192.209.0 - 129.193.255.255 us 129.194.0.0 - 129.195.255.255 ch 129.196.0.0 - 129.198.255.255 us 129.199.0.0 - 129.199.255.255 fr 129.200.0.0 - 129.204.255.255 us +129.205.0.0 - 129.205.31.255 ug +129.205.32.0 - 129.205.95.255 za +129.205.96.0 - 129.205.127.255 ng +129.205.128.0 - 129.205.191.255 za +129.205.192.0 - 129.205.255.255 bw 129.206.0.0 - 129.206.255.255 de 129.207.0.0 - 129.207.255.255 us -129.208.0.0 - 129.208.255.255 gb +129.208.0.0 - 129.208.255.255 sa 129.209.0.0 - 129.214.255.255 us 129.215.0.0 - 129.215.255.255 gb 129.216.0.0 - 129.216.255.255 us 129.217.0.0 - 129.217.255.255 de -129.218.0.0 - 129.230.175.255 us -129.230.176.0 - 129.230.255.255 gb -129.231.0.0 - 129.231.255.255 us +129.218.0.0 - 129.231.255.255 us +129.232.0.0 - 129.232.127.255 ls +129.232.128.0 - 129.232.255.255 za 129.233.0.0 - 129.233.255.255 de 129.234.0.0 - 129.234.255.255 gb 129.235.0.0 - 129.239.255.255 us @@ -67643,7 +48973,21 @@ 129.247.0.0 - 129.247.255.255 de 129.248.0.0 - 129.248.255.255 us 129.249.0.0 - 129.249.255.255 jp -129.250.0.0 - 129.253.255.255 us +129.250.0.0 - 129.250.2.41 us +129.250.2.42 - 129.250.2.42 es +129.250.2.43 - 129.250.3.137 us +129.250.3.138 - 129.250.3.138 de +129.250.3.139 - 129.250.4.103 us +129.250.4.104 - 129.250.4.104 es +129.250.4.105 - 129.250.4.136 us +129.250.4.137 - 129.250.4.137 gb +129.250.4.138 - 129.250.6.216 us +129.250.6.217 - 129.250.6.217 de +129.250.6.218 - 129.250.8.40 us +129.250.8.41 - 129.250.8.41 es +129.250.8.42 - 129.250.16.45 us +129.250.16.46 - 129.250.16.46 es +129.250.16.47 - 129.253.255.255 us 129.254.0.0 - 129.254.255.255 kr 129.255.0.0 - 129.255.255.255 us 130.0.0.0 - 130.0.7.255 gb @@ -67677,7 +49021,15 @@ 130.32.0.0 - 130.32.255.255 gb 130.33.0.0 - 130.33.255.255 us 130.34.0.0 - 130.34.255.255 jp -130.35.0.0 - 130.36.255.255 us +130.35.0.0 - 130.36.74.255 us +130.36.75.0 - 130.36.75.255 gb +130.36.76.0 - 130.36.86.255 us +130.36.87.0 - 130.36.87.255 eu +130.36.88.0 - 130.36.94.255 us +130.36.95.0 - 130.36.95.255 eu +130.36.96.0 - 130.36.154.255 us +130.36.155.0 - 130.36.155.255 ap +130.36.156.0 - 130.36.255.255 us 130.37.0.0 - 130.37.255.255 nl 130.38.0.0 - 130.42.255.255 us 130.43.0.0 - 130.43.127.255 gr @@ -67687,7 +49039,9 @@ 130.54.0.0 - 130.54.255.255 jp 130.55.0.0 - 130.55.255.255 us 130.56.0.0 - 130.56.255.255 au -130.57.0.0 - 130.58.255.255 us +130.57.0.0 - 130.57.117.255 us +130.57.118.0 - 130.57.119.255 gb +130.57.120.0 - 130.58.255.255 us 130.59.0.0 - 130.60.255.255 ch 130.61.0.0 - 130.62.255.255 us 130.63.0.0 - 130.63.255.255 ca @@ -67713,27 +49067,7 @@ 130.89.0.0 - 130.89.255.255 nl 130.90.0.0 - 130.91.255.255 us 130.92.0.0 - 130.92.255.255 ch -130.93.0.0 - 130.94.91.127 us -130.94.91.128 - 130.94.91.255 a1 -130.94.92.0 - 130.94.105.127 us -130.94.105.128 - 130.94.105.255 a1 -130.94.106.0 - 130.94.106.223 us -130.94.106.224 - 130.94.106.255 a1 -130.94.107.0 - 130.94.107.127 us -130.94.107.128 - 130.94.107.255 a1 -130.94.108.0 - 130.94.121.31 us -130.94.121.32 - 130.94.121.39 a1 -130.94.121.40 - 130.94.121.167 us -130.94.121.168 - 130.94.121.175 a1 -130.94.121.176 - 130.94.121.239 us -130.94.121.240 - 130.94.121.247 a1 -130.94.121.248 - 130.94.123.159 us -130.94.123.160 - 130.94.123.191 a1 -130.94.123.192 - 130.94.132.255 us -130.94.133.0 - 130.94.133.127 a1 -130.94.133.128 - 130.94.133.255 us -130.94.134.0 - 130.94.134.255 a1 -130.94.135.0 - 130.94.255.255 us +130.93.0.0 - 130.94.255.255 us 130.95.0.0 - 130.95.255.255 au 130.96.0.0 - 130.97.255.255 us 130.98.0.0 - 130.98.255.255 fr @@ -67743,13 +49077,45 @@ 130.102.0.0 - 130.102.255.255 au 130.103.0.0 - 130.103.255.255 us 130.104.0.0 - 130.104.255.255 be -130.105.0.0 - 130.111.255.255 us +130.105.0.0 - 130.105.255.255 ph +130.106.0.0 - 130.111.255.255 us 130.112.0.0 - 130.112.255.255 nl 130.113.0.0 - 130.113.255.255 ca 130.114.0.0 - 130.114.255.255 us 130.115.0.0 - 130.115.255.255 nl 130.116.0.0 - 130.116.255.255 au -130.117.0.0 - 130.119.255.255 us +130.117.0.0 - 130.117.1.105 eu +130.117.1.106 - 130.117.1.106 si +130.117.1.107 - 130.117.48.81 eu +130.117.48.82 - 130.117.48.82 si +130.117.48.83 - 130.117.49.1 eu +130.117.49.2 - 130.117.49.2 at +130.117.49.3 - 130.117.49.137 eu +130.117.49.138 - 130.117.49.138 at +130.117.49.139 - 130.117.72.239 eu +130.117.72.240 - 130.117.72.240 nl +130.117.72.241 - 130.117.73.255 eu +130.117.74.0 - 130.117.74.255 nl +130.117.75.0 - 130.117.75.255 eu +130.117.76.0 - 130.117.76.255 gb +130.117.77.0 - 130.117.87.255 eu +130.117.88.0 - 130.117.88.255 gb +130.117.89.0 - 130.117.92.255 eu +130.117.93.0 - 130.117.95.255 es +130.117.96.0 - 130.117.119.255 eu +130.117.120.0 - 130.117.120.255 gb +130.117.121.0 - 130.117.127.2 eu +130.117.127.3 - 130.117.127.3 gb +130.117.127.4 - 130.117.169.127 eu +130.117.169.128 - 130.117.169.255 sl +130.117.170.0 - 130.117.189.255 eu +130.117.190.0 - 130.117.190.255 ru +130.117.191.0 - 130.117.225.255 eu +130.117.226.0 - 130.117.226.255 it +130.117.227.0 - 130.117.255.255 eu +130.118.0.0 - 130.119.247.255 us +130.119.248.0 - 130.119.248.255 eu +130.119.249.0 - 130.119.255.255 us 130.120.0.0 - 130.120.255.255 fr 130.121.0.0 - 130.122.255.255 us 130.123.0.0 - 130.123.255.255 nz @@ -67757,12 +49123,15 @@ 130.125.0.0 - 130.125.255.255 ch 130.126.0.0 - 130.129.255.255 us 130.130.0.0 - 130.130.255.255 au -130.131.0.0 - 130.132.255.255 us +130.131.0.0 - 130.131.255.255 fr +130.132.0.0 - 130.132.255.255 us 130.133.0.0 - 130.133.255.255 de 130.134.0.0 - 130.135.255.255 us 130.136.0.0 - 130.136.255.255 it 130.137.0.0 - 130.137.255.255 us -130.138.0.0 - 130.147.255.255 nl +130.138.0.0 - 130.138.226.255 nl +130.138.227.0 - 130.138.227.255 eu +130.138.228.0 - 130.147.255.255 nl 130.148.0.0 - 130.148.255.255 gb 130.149.0.0 - 130.149.255.255 de 130.150.0.0 - 130.152.255.255 us @@ -67787,14 +49156,13 @@ 130.184.0.0 - 130.184.255.255 us 130.185.0.0 - 130.185.63.255 ua 130.185.64.0 - 130.185.71.255 gb -130.185.72.0 - 130.185.75.255 ir -130.185.76.0 - 130.185.77.255 de -130.185.78.0 - 130.185.79.255 ir +130.185.72.0 - 130.185.79.255 ir 130.185.80.0 - 130.185.87.255 pt 130.185.88.0 - 130.185.95.255 es 130.185.96.0 - 130.185.103.255 pl -130.185.104.0 - 130.185.111.255 de -130.185.112.0 - 130.185.127.255 ru +130.185.104.0 - 130.185.105.127 de +130.185.105.128 - 130.185.105.255 a1 +130.185.106.0 - 130.185.111.255 de 130.185.128.0 - 130.185.143.255 dk 130.185.144.0 - 130.185.151.255 gb 130.185.152.0 - 130.185.155.255 se @@ -67803,7 +49171,11 @@ 130.185.168.0 - 130.185.175.255 fr 130.185.176.0 - 130.185.183.255 cz 130.185.184.0 - 130.185.191.255 fr -130.185.192.0 - 130.185.255.255 bg +130.185.192.0 - 130.185.238.255 bg +130.185.239.0 - 130.185.239.255 gb +130.185.240.0 - 130.185.250.255 bg +130.185.251.0 - 130.185.251.255 gb +130.185.252.0 - 130.185.255.255 bg 130.186.0.0 - 130.186.255.255 it 130.187.0.0 - 130.187.255.255 us 130.188.0.0 - 130.188.255.255 fi @@ -67816,7 +49188,25 @@ 130.193.24.0 - 130.193.31.255 fr 130.193.32.0 - 130.193.71.255 ru 130.193.72.0 - 130.193.79.255 it -130.193.80.0 - 130.193.95.255 gb +130.193.80.0 - 130.193.81.143 gb +130.193.81.144 - 130.193.81.151 it +130.193.81.152 - 130.193.82.39 gb +130.193.82.40 - 130.193.82.47 it +130.193.82.48 - 130.193.82.135 gb +130.193.82.136 - 130.193.82.143 it +130.193.82.144 - 130.193.82.231 gb +130.193.82.232 - 130.193.82.239 it +130.193.82.240 - 130.193.86.191 gb +130.193.86.192 - 130.193.86.199 it +130.193.86.200 - 130.193.87.167 gb +130.193.87.168 - 130.193.87.175 it +130.193.87.176 - 130.193.88.31 gb +130.193.88.32 - 130.193.88.39 it +130.193.88.40 - 130.193.88.143 gb +130.193.88.144 - 130.193.88.159 it +130.193.88.160 - 130.193.90.63 gb +130.193.90.64 - 130.193.90.71 it +130.193.90.72 - 130.193.95.255 gb 130.193.96.0 - 130.193.103.255 de 130.193.104.0 - 130.193.111.255 es 130.193.112.0 - 130.193.119.255 de @@ -67826,17 +49216,22 @@ 130.195.0.0 - 130.195.255.255 nz 130.196.0.0 - 130.197.255.255 us 130.198.0.0 - 130.198.255.255 ch -130.199.0.0 - 130.200.255.255 us -130.201.0.0 - 130.201.255.255 gb -130.202.0.0 - 130.203.255.255 us +130.199.0.0 - 130.203.255.255 us 130.204.0.0 - 130.204.255.255 bg 130.205.0.0 - 130.205.255.255 us 130.206.0.0 - 130.206.255.255 es 130.207.0.0 - 130.207.255.255 us 130.208.0.0 - 130.208.255.255 is 130.209.0.0 - 130.209.255.255 gb -130.210.0.0 - 130.210.255.255 us -130.212.0.0 - 130.215.255.255 us +130.210.0.0 - 130.211.87.61 us +130.211.87.62 - 130.211.87.62 ie +130.211.87.63 - 130.211.97.190 us +130.211.97.191 - 130.211.97.191 be +130.211.97.192 - 130.214.25.252 us +130.214.25.253 - 130.214.25.253 ap +130.214.25.254 - 130.214.39.255 us +130.214.40.0 - 130.214.40.255 eu +130.214.41.0 - 130.215.255.255 us 130.216.0.0 - 130.217.255.255 nz 130.218.0.0 - 130.219.255.255 us 130.220.0.0 - 130.220.255.255 au @@ -67855,10 +49250,14 @@ 130.252.0.0 - 130.254.255.255 us 130.255.0.0 - 130.255.7.255 iq 130.255.8.0 - 130.255.15.255 ru -130.255.16.0 - 130.255.31.255 gb +130.255.16.0 - 130.255.19.255 gb +130.255.20.0 - 130.255.20.255 dk +130.255.21.0 - 130.255.24.255 gb +130.255.25.0 - 130.255.25.15 pt +130.255.25.16 - 130.255.31.255 gb 130.255.32.0 - 130.255.63.255 ru 130.255.64.0 - 130.255.71.255 ps -130.255.72.0 - 130.255.79.255 il +130.255.72.0 - 130.255.79.255 de 130.255.80.0 - 130.255.87.255 ru 130.255.88.0 - 130.255.95.255 iq 130.255.96.0 - 130.255.103.255 it @@ -67873,29 +49272,146 @@ 130.255.176.0 - 130.255.183.255 sa 130.255.184.0 - 130.255.191.255 de 130.255.192.0 - 130.255.255.255 ir +131.0.0.0 - 131.0.3.255 bo +131.0.4.0 - 131.0.51.255 br +131.0.52.0 - 131.0.55.255 ar +131.0.56.0 - 131.0.71.255 br +131.0.72.0 - 131.0.75.255 cr +131.0.76.0 - 131.0.103.255 br +131.0.104.0 - 131.0.107.255 ar +131.0.108.0 - 131.0.111.255 cl +131.0.112.0 - 131.0.123.255 br +131.0.124.0 - 131.0.127.255 mx +131.0.128.0 - 131.0.131.255 ar +131.0.132.0 - 131.0.135.255 br +131.0.136.0 - 131.0.139.255 co +131.0.140.0 - 131.0.167.255 br +131.0.168.0 - 131.0.171.255 co +131.0.172.0 - 131.0.175.255 cl +131.0.176.0 - 131.0.195.255 br +131.0.196.0 - 131.0.199.255 ar +131.0.200.0 - 131.0.211.255 br +131.0.212.0 - 131.0.215.255 uy +131.0.216.0 - 131.0.231.255 br +131.0.232.0 - 131.0.235.255 ar +131.0.236.0 - 131.0.239.255 mx +131.0.240.0 - 131.0.255.255 br 131.1.0.0 - 131.1.255.255 it -131.2.0.0 - 131.96.255.255 us +131.2.0.0 - 131.71.255.255 us +131.72.0.0 - 131.72.3.255 ar +131.72.4.0 - 131.72.23.255 br +131.72.24.0 - 131.72.27.255 py +131.72.28.0 - 131.72.31.255 ar +131.72.32.0 - 131.72.71.255 br +131.72.72.0 - 131.72.75.255 ar +131.72.76.0 - 131.72.79.255 tt +131.72.80.0 - 131.72.111.255 br +131.72.112.0 - 131.72.115.255 cw +131.72.116.0 - 131.72.131.255 br +131.72.132.0 - 131.72.135.255 ar +131.72.136.0 - 131.72.139.255 nl +131.72.140.0 - 131.72.155.255 br +131.72.156.0 - 131.72.159.255 ar +131.72.160.0 - 131.72.167.255 br +131.72.168.0 - 131.72.171.255 ve +131.72.172.0 - 131.72.203.255 br +131.72.204.0 - 131.72.207.255 ar +131.72.208.0 - 131.72.211.255 hn +131.72.212.0 - 131.72.215.255 mx +131.72.216.0 - 131.72.223.255 br +131.72.224.0 - 131.72.227.255 pa +131.72.228.0 - 131.72.231.255 mx +131.72.232.0 - 131.72.239.255 cl +131.72.240.0 - 131.72.243.255 ar +131.72.244.0 - 131.72.255.255 br +131.73.0.0 - 131.96.255.255 us 131.97.0.0 - 131.97.255.255 se 131.98.0.0 - 131.98.255.255 us 131.99.0.0 - 131.99.255.255 de +131.100.0.0 - 131.100.3.255 pa +131.100.4.0 - 131.100.27.255 br +131.100.28.0 - 131.100.31.255 cl +131.100.32.0 - 131.100.35.255 br +131.100.36.0 - 131.100.39.255 tt +131.100.40.0 - 131.100.63.255 br +131.100.64.0 - 131.100.67.255 ar +131.100.68.0 - 131.100.87.255 br +131.100.88.0 - 131.100.91.255 ar +131.100.92.0 - 131.100.99.255 br +131.100.100.0 - 131.100.103.255 ar +131.100.104.0 - 131.100.107.255 br +131.100.108.0 - 131.100.111.255 ar +131.100.112.0 - 131.100.139.255 br +131.100.140.0 - 131.100.143.255 sv +131.100.144.0 - 131.100.159.255 br +131.100.160.0 - 131.100.163.255 tt +131.100.164.0 - 131.100.179.255 br +131.100.180.0 - 131.100.183.255 ar +131.100.184.0 - 131.100.187.255 py +131.100.188.0 - 131.100.199.255 br +131.100.200.0 - 131.100.203.255 bo +131.100.204.0 - 131.100.255.255 br 131.101.0.0 - 131.101.255.255 us 131.102.0.0 - 131.102.255.255 ch 131.103.0.0 - 131.103.255.255 us 131.104.0.0 - 131.104.255.255 ca 131.105.0.0 - 131.107.255.255 us +131.108.0.0 - 131.108.3.255 ar +131.108.4.0 - 131.108.7.255 pa +131.108.8.0 - 131.108.15.255 br +131.108.16.0 - 131.108.16.167 hn +131.108.16.168 - 131.108.16.175 ca +131.108.16.176 - 131.108.19.47 hn +131.108.19.48 - 131.108.19.63 cr +131.108.19.64 - 131.108.19.255 hn +131.108.20.0 - 131.108.23.255 pa +131.108.24.0 - 131.108.35.255 br +131.108.36.0 - 131.108.39.255 cr +131.108.40.0 - 131.108.43.255 ar +131.108.44.0 - 131.108.67.255 br +131.108.68.0 - 131.108.68.255 ar +131.108.69.0 - 131.108.71.127 cl +131.108.71.128 - 131.108.71.255 co +131.108.72.0 - 131.108.79.255 br +131.108.80.0 - 131.108.83.255 ar +131.108.84.0 - 131.108.139.255 br +131.108.140.0 - 131.108.143.255 ar +131.108.144.0 - 131.108.167.255 br +131.108.168.0 - 131.108.171.255 co +131.108.172.0 - 131.108.191.255 br +131.108.192.0 - 131.108.195.255 py +131.108.196.0 - 131.108.207.255 br +131.108.208.0 - 131.108.211.255 cl +131.108.212.0 - 131.108.231.255 br +131.108.232.0 - 131.108.232.191 hn +131.108.232.192 - 131.108.232.199 us +131.108.232.200 - 131.108.235.255 hn +131.108.236.0 - 131.108.255.255 br 131.109.0.0 - 131.110.255.255 us 131.111.0.0 - 131.111.255.255 gb 131.112.0.0 - 131.113.255.255 jp 131.114.0.0 - 131.114.255.255 it 131.115.0.0 - 131.116.255.255 se 131.117.0.0 - 131.117.127.255 ch +131.117.128.0 - 131.117.143.255 az +131.117.144.0 - 131.117.159.255 de +131.117.160.0 - 131.117.167.255 ye +131.117.168.0 - 131.117.175.255 gb +131.117.176.0 - 131.117.183.255 se +131.117.184.0 - 131.117.191.255 gb +131.117.192.0 - 131.117.199.255 cz +131.117.200.0 - 131.117.207.255 fr +131.117.208.0 - 131.117.215.255 cz +131.117.216.0 - 131.117.223.255 ru +131.117.224.0 - 131.117.255.255 iq 131.118.0.0 - 131.128.255.255 us -131.129.0.0 - 131.129.255.255 ca +131.129.0.0 - 131.129.255.255 hk 131.130.0.0 - 131.130.255.255 at 131.131.0.0 - 131.131.255.255 us 131.132.0.0 - 131.141.255.255 ca 131.142.0.0 - 131.146.255.255 us -131.147.0.0 - 131.150.6.255 ca +131.147.0.0 - 131.147.255.255 jp +131.148.0.0 - 131.150.6.255 ca 131.150.7.0 - 131.150.7.255 us 131.150.8.0 - 131.150.10.255 ca 131.150.11.0 - 131.150.15.255 us @@ -67909,7 +49425,9 @@ 131.150.80.0 - 131.150.83.255 us 131.150.84.0 - 131.150.129.255 ca 131.150.130.0 - 131.150.131.255 us -131.150.132.0 - 131.150.189.255 ca +131.150.132.0 - 131.150.143.255 ca +131.150.144.0 - 131.150.159.255 us +131.150.160.0 - 131.150.189.255 ca 131.150.190.0 - 131.150.190.255 us 131.150.191.0 - 131.150.255.255 ca 131.151.0.0 - 131.151.255.255 us @@ -67920,6 +49438,28 @@ 131.156.0.0 - 131.158.255.255 us 131.159.0.0 - 131.159.255.255 de 131.160.0.0 - 131.160.255.255 fi +131.161.0.0 - 131.161.51.255 br +131.161.52.0 - 131.161.55.255 hn +131.161.56.0 - 131.161.59.255 cl +131.161.60.0 - 131.161.79.255 br +131.161.80.0 - 131.161.83.255 hn +131.161.84.0 - 131.161.87.255 sx +131.161.88.0 - 131.161.91.255 ar +131.161.92.0 - 131.161.99.255 br +131.161.100.0 - 131.161.103.255 pe +131.161.104.0 - 131.161.147.255 br +131.161.148.0 - 131.161.151.255 bz +131.161.152.0 - 131.161.155.255 ar +131.161.156.0 - 131.161.183.255 br +131.161.184.0 - 131.161.187.255 ar +131.161.188.0 - 131.161.199.255 br +131.161.200.0 - 131.161.203.255 cl +131.161.204.0 - 131.161.231.255 br +131.161.232.0 - 131.161.239.255 ar +131.161.240.0 - 131.161.243.255 br +131.161.244.0 - 131.161.247.255 mx +131.161.248.0 - 131.161.251.255 br +131.161.252.0 - 131.161.255.255 py 131.162.0.0 - 131.163.255.255 ca 131.164.0.0 - 131.166.255.255 dk 131.167.0.0 - 131.168.255.255 us @@ -67952,22 +49492,50 @@ 131.208.0.0 - 131.210.255.255 us 131.211.0.0 - 131.211.255.255 nl 131.212.0.0 - 131.212.255.255 us -131.213.0.0 - 131.213.255.255 ca +131.213.0.0 - 131.213.255.255 jp 131.214.0.0 - 131.216.255.255 us 131.217.0.0 - 131.217.255.255 au 131.218.0.0 - 131.219.255.255 us 131.220.0.0 - 131.220.255.255 de +131.221.0.0 - 131.221.3.255 ar +131.221.4.0 - 131.221.7.255 do +131.221.8.0 - 131.221.11.255 hn +131.221.12.0 - 131.221.15.255 br +131.221.16.0 - 131.221.19.255 ar +131.221.20.0 - 131.221.23.255 br +131.221.24.0 - 131.221.27.255 pa +131.221.28.0 - 131.221.31.255 tt +131.221.32.0 - 131.221.35.255 cl +131.221.36.0 - 131.221.39.255 br +131.221.40.0 - 131.221.43.255 co +131.221.44.0 - 131.221.63.255 br +131.221.64.0 - 131.221.67.255 ar +131.221.68.0 - 131.221.111.255 br +131.221.112.0 - 131.221.115.255 ve +131.221.116.0 - 131.221.143.255 br +131.221.144.0 - 131.221.147.255 cw +131.221.148.0 - 131.221.151.255 br +131.221.152.0 - 131.221.155.255 pe +131.221.156.0 - 131.221.163.255 br +131.221.164.0 - 131.221.167.255 cl +131.221.168.0 - 131.221.255.255 br 131.222.0.0 - 131.223.255.255 us 131.224.0.0 - 131.224.255.255 nl 131.225.0.0 - 131.226.255.255 us 131.227.0.0 - 131.227.255.255 gb 131.228.0.0 - 131.228.15.255 fi 131.228.16.0 - 131.228.19.255 gb -131.228.20.0 - 131.228.35.255 fi +131.228.20.0 - 131.228.28.255 fi +131.228.29.0 - 131.228.29.255 gb +131.228.30.0 - 131.228.35.255 fi 131.228.36.0 - 131.228.39.255 gb -131.228.40.0 - 131.228.207.255 fi -131.228.208.0 - 131.228.210.255 us -131.228.211.0 - 131.228.255.255 fi +131.228.40.0 - 131.228.151.255 fi +131.228.152.0 - 131.228.159.255 nl +131.228.160.0 - 131.228.181.255 fi +131.228.182.0 - 131.228.182.255 nl +131.228.183.0 - 131.228.195.255 fi +131.228.196.0 - 131.228.199.255 us +131.228.200.0 - 131.228.255.255 fi 131.229.0.0 - 131.230.255.255 us 131.231.0.0 - 131.231.255.255 gb 131.232.0.0 - 131.232.255.255 ca @@ -67985,20 +49553,40 @@ 131.248.0.0 - 131.248.255.255 jp 131.249.0.0 - 131.250.255.255 us 131.251.0.0 - 131.251.255.255 gb -131.252.0.0 - 131.253.7.255 us -131.253.8.0 - 131.253.8.255 ca -131.253.9.0 - 131.253.11.255 us -131.253.12.0 - 131.253.18.255 ca -131.253.19.0 - 131.253.20.255 us -131.253.21.0 - 131.253.47.255 ca -131.253.48.0 - 131.253.60.255 us -131.253.61.0 - 131.253.255.255 ca +131.252.0.0 - 131.253.130.191 us +131.253.130.192 - 131.253.130.255 nl +131.253.131.0 - 131.253.179.63 us +131.253.179.64 - 131.253.179.95 nl +131.253.179.96 - 131.253.255.255 us 131.254.0.0 - 131.254.255.255 fr +131.255.0.0 - 131.255.3.255 br +131.255.4.0 - 131.255.7.255 ar +131.255.8.0 - 131.255.11.255 br +131.255.12.0 - 131.255.15.255 ar +131.255.16.0 - 131.255.39.255 br +131.255.40.0 - 131.255.43.255 bz +131.255.44.0 - 131.255.59.255 br +131.255.60.0 - 131.255.63.255 ar +131.255.64.0 - 131.255.103.255 br +131.255.104.0 - 131.255.107.255 ve +131.255.108.0 - 131.255.135.255 br +131.255.136.0 - 131.255.139.255 pe +131.255.140.0 - 131.255.179.255 br +131.255.180.0 - 131.255.183.255 ar +131.255.184.0 - 131.255.191.255 br +131.255.192.0 - 131.255.195.255 pe +131.255.196.0 - 131.255.247.255 br +131.255.248.0 - 131.255.251.255 ar +131.255.252.0 - 131.255.255.255 br 132.0.0.0 - 132.63.255.255 us 132.64.0.0 - 132.78.255.255 il -132.79.0.0 - 132.145.255.255 us +132.79.0.0 - 132.129.253.255 us +132.129.254.0 - 132.129.254.255 vi +132.129.255.0 - 132.145.255.255 us 132.146.0.0 - 132.146.255.255 gb -132.147.0.0 - 132.148.255.255 us +132.147.0.0 - 132.147.63.255 us +132.147.64.0 - 132.147.127.255 sg +132.147.128.0 - 132.148.255.255 us 132.149.0.0 - 132.149.255.255 fr 132.150.0.0 - 132.150.255.255 no 132.151.0.0 - 132.152.255.255 us @@ -68006,8 +49594,9 @@ 132.154.0.0 - 132.154.255.255 us 132.155.0.0 - 132.155.255.255 fi 132.156.0.0 - 132.156.255.255 ca -132.158.0.0 - 132.164.255.255 us -132.165.0.0 - 132.169.255.255 fr +132.157.0.0 - 132.157.255.255 pe +132.158.0.0 - 132.163.255.255 us +132.164.0.0 - 132.169.255.255 fr 132.170.0.0 - 132.170.255.255 us 132.171.0.0 - 132.171.255.255 fi 132.172.0.0 - 132.175.255.255 us @@ -68018,10 +49607,19 @@ 132.181.0.0 - 132.181.255.255 nz 132.182.0.0 - 132.182.255.255 jp 132.183.0.0 - 132.183.255.255 us +132.184.0.0 - 132.184.255.255 pe 132.185.0.0 - 132.185.255.255 gb -132.186.0.0 - 132.186.255.255 au +132.186.0.0 - 132.186.255.255 za 132.187.0.0 - 132.187.255.255 de -132.188.0.0 - 132.194.255.255 us +132.188.0.0 - 132.188.31.255 us +132.188.32.0 - 132.188.32.255 eu +132.188.33.0 - 132.189.78.255 us +132.189.79.0 - 132.189.79.255 be +132.189.80.0 - 132.190.31.255 us +132.190.32.0 - 132.190.32.255 eu +132.190.33.0 - 132.190.255.255 us +132.191.0.0 - 132.191.255.255 pe +132.192.0.0 - 132.194.255.255 us 132.195.0.0 - 132.195.255.255 de 132.196.0.0 - 132.196.255.255 se 132.197.0.0 - 132.198.255.255 us @@ -68040,21 +49638,145 @@ 132.233.0.0 - 132.233.255.255 us 132.234.0.0 - 132.234.255.255 au 132.235.0.0 - 132.243.255.255 us -132.244.0.0 - 132.244.255.255 gb -132.245.0.0 - 132.245.255.255 us +132.244.0.0 - 132.244.71.255 gb +132.244.72.0 - 132.244.72.255 eu +132.244.73.0 - 132.244.79.255 gb +132.244.80.0 - 132.244.95.255 us +132.244.96.0 - 132.244.211.255 gb +132.244.212.0 - 132.244.215.255 sg +132.244.216.0 - 132.244.255.255 gb +132.245.0.0 - 132.245.3.95 us +132.245.3.96 - 132.245.3.127 ie +132.245.3.128 - 132.245.16.135 us +132.245.16.136 - 132.245.16.207 br +132.245.16.208 - 132.245.26.71 us +132.245.26.72 - 132.245.26.223 ie +132.245.26.224 - 132.245.27.31 us +132.245.27.32 - 132.245.27.47 ie +132.245.27.48 - 132.245.36.95 us +132.245.36.96 - 132.245.36.111 at +132.245.36.112 - 132.245.36.127 ie +132.245.36.128 - 132.245.64.79 us +132.245.64.80 - 132.245.64.143 sg +132.245.64.144 - 132.245.67.47 us +132.245.67.48 - 132.245.67.79 sg +132.245.67.80 - 132.245.68.239 us +132.245.68.240 - 132.245.68.255 nl +132.245.69.0 - 132.245.69.63 sg +132.245.69.64 - 132.245.92.23 us +132.245.92.24 - 132.245.92.31 ie +132.245.92.32 - 132.245.92.47 us +132.245.92.48 - 132.245.92.191 ie +132.245.92.192 - 132.245.127.255 us +132.245.128.0 - 132.245.130.135 hk +132.245.130.136 - 132.245.130.231 jp +132.245.130.232 - 132.245.130.239 hk +132.245.130.240 - 132.245.131.15 jp +132.245.131.16 - 132.245.131.47 hk +132.245.131.48 - 132.245.131.63 jp +132.245.131.64 - 132.245.131.143 hk +132.245.131.144 - 132.245.131.175 jp +132.245.131.176 - 132.245.131.239 us +132.245.131.240 - 132.245.143.255 hk +132.245.144.0 - 132.245.144.31 at +132.245.144.32 - 132.245.144.63 hk +132.245.144.64 - 132.245.144.159 jp +132.245.144.160 - 132.245.144.207 hk +132.245.144.208 - 132.245.144.239 us +132.245.144.240 - 132.245.151.255 hk +132.245.152.0 - 132.245.153.255 us +132.245.154.0 - 132.245.155.255 sg +132.245.156.0 - 132.245.159.255 br +132.245.160.0 - 132.245.160.207 sg +132.245.160.208 - 132.245.160.215 au +132.245.160.216 - 132.245.162.159 sg +132.245.162.160 - 132.245.163.79 au +132.245.163.80 - 132.245.163.119 sg +132.245.163.120 - 132.245.164.7 au +132.245.164.8 - 132.245.164.15 sg +132.245.164.16 - 132.245.164.47 au +132.245.164.48 - 132.245.164.143 sg +132.245.164.144 - 132.245.164.159 au +132.245.164.160 - 132.245.164.191 sg +132.245.164.192 - 132.245.164.223 my +132.245.164.224 - 132.245.164.255 au +132.245.165.0 - 132.245.165.127 sg +132.245.165.128 - 132.245.165.143 au +132.245.165.144 - 132.245.175.255 sg +132.245.176.0 - 132.245.176.31 nl +132.245.176.32 - 132.245.176.175 us +132.245.176.176 - 132.245.176.207 nl +132.245.176.208 - 132.245.191.255 us +132.245.192.0 - 132.245.195.151 nl +132.245.195.152 - 132.245.195.247 fi +132.245.195.248 - 132.245.195.255 nl +132.245.196.0 - 132.245.196.31 fi +132.245.196.32 - 132.245.207.255 nl +132.245.208.0 - 132.245.227.255 ie +132.245.228.0 - 132.245.229.255 nl +132.245.230.0 - 132.245.241.143 us +132.245.241.144 - 132.245.241.191 br +132.245.241.192 - 132.245.241.207 us +132.245.241.208 - 132.245.241.223 br +132.245.241.224 - 132.245.241.255 kr +132.245.242.0 - 132.245.242.15 us +132.245.242.16 - 132.245.242.47 br +132.245.242.48 - 132.245.242.63 us +132.245.242.64 - 132.245.242.95 br +132.245.242.96 - 132.245.245.47 us +132.245.245.48 - 132.245.245.63 in +132.245.245.64 - 132.245.245.79 us +132.245.245.80 - 132.245.245.143 in +132.245.245.144 - 132.245.253.63 us +132.245.253.64 - 132.245.253.95 hk +132.245.253.96 - 132.245.254.191 us +132.245.254.192 - 132.245.254.223 br +132.245.254.224 - 132.245.255.143 us +132.245.255.144 - 132.245.255.175 br +132.245.255.176 - 132.245.255.255 us 132.246.0.0 - 132.246.255.255 ca 132.247.0.0 - 132.248.255.255 mx 132.249.0.0 - 132.250.255.255 us +132.251.0.0 - 132.251.223.255 pe +132.251.224.0 - 132.251.255.255 bo 132.252.0.0 - 132.252.255.255 de 132.253.0.0 - 132.253.255.255 us 132.254.0.0 - 132.254.255.255 mx -133.0.0.0 - 133.255.255.255 jp +132.255.0.0 - 132.255.3.255 pe +132.255.4.0 - 132.255.11.255 ar +132.255.12.0 - 132.255.19.255 br +132.255.20.0 - 132.255.23.255 co +132.255.24.0 - 132.255.67.255 br +132.255.68.0 - 132.255.71.255 cl +132.255.72.0 - 132.255.111.255 br +132.255.112.0 - 132.255.115.255 ar +132.255.116.0 - 132.255.123.255 br +132.255.124.0 - 132.255.127.255 mx +132.255.128.0 - 132.255.131.255 br +132.255.132.0 - 132.255.134.199 hn +132.255.134.200 - 132.255.134.207 us +132.255.134.208 - 132.255.135.255 hn +132.255.136.0 - 132.255.163.255 br +132.255.164.0 - 132.255.167.255 py +132.255.168.0 - 132.255.199.255 br +132.255.200.0 - 132.255.203.255 ar +132.255.204.0 - 132.255.207.255 br +132.255.208.0 - 132.255.211.255 sv +132.255.212.0 - 132.255.223.255 br +132.255.224.0 - 132.255.227.255 ar +132.255.228.0 - 132.255.235.255 br +132.255.236.0 - 132.255.239.255 cl +132.255.240.0 - 132.255.255.255 br +133.0.0.0 - 133.129.255.255 jp +133.130.0.0 - 133.130.3.255 us +133.130.4.0 - 133.255.255.255 jp 134.0.0.0 - 134.0.7.255 it 134.0.8.0 - 134.0.15.255 es 134.0.16.0 - 134.0.23.255 gb 134.0.24.0 - 134.0.31.255 de 134.0.32.0 - 134.0.63.255 al -134.0.64.0 - 134.0.71.255 gb +134.0.64.0 - 134.0.65.255 us +134.0.66.0 - 134.0.71.255 gb 134.0.72.0 - 134.0.79.255 us 134.0.80.0 - 134.0.87.255 ie 134.0.88.0 - 134.0.95.255 nl @@ -68083,20 +49805,10 @@ 134.22.0.0 - 134.22.255.255 ca 134.23.0.0 - 134.24.18.255 us 134.24.19.0 - 134.24.19.255 ca -134.24.20.0 - 134.24.239.255 us -134.24.240.0 - 134.24.240.7 fr -134.24.240.8 - 134.24.255.255 us +134.24.20.0 - 134.24.255.255 us 134.25.0.0 - 134.25.255.255 se 134.26.0.0 - 134.26.255.255 us -134.27.0.0 - 134.27.32.255 nl -134.27.33.0 - 134.27.33.255 us -134.27.34.0 - 134.27.47.255 nl -134.27.48.0 - 134.27.55.255 us -134.27.56.0 - 134.27.59.255 nl -134.27.60.0 - 134.27.63.255 us -134.27.64.0 - 134.27.64.127 nl -134.27.64.128 - 134.27.64.255 br -134.27.65.0 - 134.27.255.255 nl +134.27.0.0 - 134.27.255.255 nl 134.28.0.0 - 134.28.255.255 de 134.29.0.0 - 134.29.255.255 us 134.30.0.0 - 134.30.255.255 de @@ -68105,11 +49817,18 @@ 134.34.0.0 - 134.34.255.255 de 134.35.0.0 - 134.35.255.255 us 134.36.0.0 - 134.36.255.255 gb -134.37.0.0 - 134.37.255.255 fi -134.38.0.0 - 134.46.255.255 us +134.37.0.0 - 134.37.254.255 fi +134.37.255.0 - 134.37.255.255 eu +134.38.0.0 - 134.42.223.255 us +134.42.224.0 - 134.42.224.255 hk +134.42.225.0 - 134.42.225.255 sg +134.42.226.0 - 134.42.226.255 au +134.42.227.0 - 134.42.227.255 jp +134.42.228.0 - 134.46.255.255 us 134.47.0.0 - 134.47.255.255 no 134.48.0.0 - 134.53.255.255 us -134.54.0.0 - 134.54.255.255 be +134.54.0.0 - 134.54.0.255 eu +134.54.1.0 - 134.54.255.255 be 134.55.0.0 - 134.57.255.255 us 134.58.0.0 - 134.58.255.255 be 134.59.0.0 - 134.59.255.255 fr @@ -68128,11 +49847,14 @@ 134.90.0.0 - 134.90.127.255 ge 134.90.128.0 - 134.90.135.255 ba 134.90.136.0 - 134.90.143.255 fr -134.90.144.0 - 134.90.151.255 no +134.90.144.0 - 134.90.145.255 no +134.90.146.0 - 134.90.146.255 nl +134.90.147.0 - 134.90.147.255 no +134.90.148.0 - 134.90.148.255 us +134.90.149.0 - 134.90.149.255 dk +134.90.150.0 - 134.90.151.255 no 134.90.152.0 - 134.90.191.255 ru -134.90.192.0 - 134.90.199.255 ro -134.90.200.0 - 134.90.201.255 gb -134.90.202.0 - 134.90.207.255 ro +134.90.192.0 - 134.90.207.255 gb 134.90.208.0 - 134.90.215.255 ru 134.90.216.0 - 134.90.223.255 ch 134.90.224.0 - 134.90.255.255 it @@ -68142,16 +49864,32 @@ 134.116.0.0 - 134.116.255.255 us 134.117.0.0 - 134.117.255.255 ca 134.118.0.0 - 134.118.255.255 us -134.119.0.0 - 134.119.255.255 no -134.120.0.0 - 134.129.255.255 us +134.119.0.0 - 134.119.255.255 de +134.120.0.0 - 134.128.63.255 us +134.128.64.0 - 134.128.255.255 gb +134.129.0.0 - 134.129.255.255 us 134.130.0.0 - 134.130.255.255 de -134.131.0.0 - 134.137.255.255 us +134.131.0.0 - 134.132.29.255 us +134.132.30.0 - 134.132.30.255 ca +134.132.31.0 - 134.132.55.255 us +134.132.56.0 - 134.132.56.255 gb +134.132.57.0 - 134.137.255.255 us 134.138.0.0 - 134.138.255.255 se 134.139.0.0 - 134.141.255.255 us 134.142.0.0 - 134.142.255.255 gb 134.143.0.0 - 134.143.255.255 nl 134.144.0.0 - 134.144.255.255 au -134.145.0.0 - 134.146.255.255 nl +134.145.0.0 - 134.145.255.255 nl +134.146.0.0 - 134.146.0.255 eu +134.146.1.0 - 134.146.5.255 nl +134.146.6.0 - 134.146.6.255 eu +134.146.7.0 - 134.146.8.255 nl +134.146.9.0 - 134.146.9.255 gb +134.146.10.0 - 134.146.194.255 nl +134.146.195.0 - 134.146.195.255 eu +134.146.196.0 - 134.146.239.255 nl +134.146.240.0 - 134.146.240.255 in +134.146.241.0 - 134.146.255.255 nl 134.147.0.0 - 134.147.255.255 de 134.148.0.0 - 134.148.255.255 au 134.149.0.0 - 134.149.255.255 us @@ -68163,213 +49901,218 @@ 134.155.0.0 - 134.155.255.255 de 134.156.0.0 - 134.156.255.255 us 134.157.0.0 - 134.158.255.255 fr -134.159.0.0 - 134.159.1.255 us -134.159.2.0 - 134.159.2.255 hk -134.159.3.0 - 134.159.3.255 us +134.159.0.0 - 134.159.3.255 us 134.159.4.0 - 134.159.4.255 hk -134.159.5.0 - 134.159.63.255 us +134.159.5.0 - 134.159.60.255 us +134.159.61.0 - 134.159.61.7 gb +134.159.61.8 - 134.159.63.255 us 134.159.64.0 - 134.159.95.255 gb -134.159.96.0 - 134.159.96.63 hk -134.159.96.64 - 134.159.96.95 au -134.159.96.96 - 134.159.96.103 tw -134.159.96.104 - 134.159.96.111 jp -134.159.96.112 - 134.159.96.191 tw +134.159.96.0 - 134.159.96.191 au 134.159.96.192 - 134.159.96.223 hk -134.159.96.224 - 134.159.96.255 au -134.159.97.0 - 134.159.97.255 hk -134.159.98.0 - 134.159.98.127 jp -134.159.98.128 - 134.159.98.183 hk +134.159.96.224 - 134.159.98.15 au +134.159.98.16 - 134.159.98.23 jp +134.159.98.24 - 134.159.98.31 au +134.159.98.32 - 134.159.98.35 jp +134.159.98.36 - 134.159.98.183 au 134.159.98.184 - 134.159.98.191 jp -134.159.98.192 - 134.159.98.223 in -134.159.98.224 - 134.159.98.239 hk -134.159.98.240 - 134.159.98.255 jp -134.159.99.0 - 134.159.99.255 au +134.159.98.192 - 134.159.99.255 au 134.159.100.0 - 134.159.100.255 hk -134.159.101.0 - 134.159.101.127 sg -134.159.101.128 - 134.159.102.255 hk +134.159.101.0 - 134.159.101.63 tw +134.159.101.64 - 134.159.101.255 au +134.159.102.0 - 134.159.102.255 hk 134.159.103.0 - 134.159.104.255 au -134.159.105.0 - 134.159.105.255 hk -134.159.106.0 - 134.159.106.255 bd -134.159.107.0 - 134.159.107.255 hk -134.159.108.0 - 134.159.108.15 au -134.159.108.16 - 134.159.108.23 jp -134.159.108.24 - 134.159.108.31 au -134.159.108.32 - 134.159.108.63 jp -134.159.108.64 - 134.159.108.143 hk -134.159.108.144 - 134.159.108.151 jp -134.159.108.152 - 134.159.108.159 au -134.159.108.160 - 134.159.108.175 jp -134.159.108.176 - 134.159.108.191 hk -134.159.108.192 - 134.159.108.207 tw -134.159.108.208 - 134.159.108.215 jp -134.159.108.216 - 134.159.109.63 hk -134.159.109.64 - 134.159.109.95 sg -134.159.109.96 - 134.159.109.127 au -134.159.109.128 - 134.159.109.143 hk -134.159.109.144 - 134.159.109.159 au +134.159.105.0 - 134.159.105.63 hk +134.159.105.64 - 134.159.105.95 au +134.159.105.96 - 134.159.105.127 hk +134.159.105.128 - 134.159.105.255 au +134.159.106.0 - 134.159.107.47 hk +134.159.107.48 - 134.159.107.63 ap +134.159.107.64 - 134.159.107.191 hk +134.159.107.192 - 134.159.107.255 ap +134.159.108.0 - 134.159.109.31 au +134.159.109.32 - 134.159.109.95 tw +134.159.109.96 - 134.159.109.159 au 134.159.109.160 - 134.159.109.191 tw 134.159.109.192 - 134.159.109.223 au -134.159.109.224 - 134.159.109.255 sg -134.159.110.0 - 134.159.110.7 kr -134.159.110.8 - 134.159.110.15 tw -134.159.110.16 - 134.159.110.23 hk -134.159.110.24 - 134.159.110.31 jp -134.159.110.32 - 134.159.110.55 hk +134.159.109.224 - 134.159.109.255 tw +134.159.110.0 - 134.159.110.55 au 134.159.110.56 - 134.159.110.63 kr -134.159.110.64 - 134.159.110.95 hk -134.159.110.96 - 134.159.110.127 au -134.159.110.128 - 134.159.110.135 hk -134.159.110.136 - 134.159.110.143 tw -134.159.110.144 - 134.159.110.151 hk -134.159.110.152 - 134.159.110.167 au -134.159.110.168 - 134.159.110.191 hk -134.159.110.192 - 134.159.110.223 au -134.159.110.224 - 134.159.110.239 jp -134.159.110.240 - 134.159.110.255 au -134.159.111.0 - 134.159.111.7 tw -134.159.111.8 - 134.159.111.15 hk -134.159.111.16 - 134.159.111.19 au -134.159.111.20 - 134.159.111.23 jp -134.159.111.24 - 134.159.111.47 hk -134.159.111.48 - 134.159.111.55 au -134.159.111.56 - 134.159.111.59 jp -134.159.111.60 - 134.159.111.71 au -134.159.111.72 - 134.159.111.79 in -134.159.111.80 - 134.159.111.127 au -134.159.111.128 - 134.159.111.191 hk -134.159.111.192 - 134.159.111.255 sg -134.159.112.0 - 134.159.112.127 hk -134.159.112.128 - 134.159.112.143 au -134.159.112.144 - 134.159.112.159 hk -134.159.112.160 - 134.159.112.175 au -134.159.112.176 - 134.159.112.239 hk -134.159.112.240 - 134.159.112.247 jp -134.159.112.248 - 134.159.116.207 hk -134.159.116.208 - 134.159.116.223 tw -134.159.116.224 - 134.159.116.255 au -134.159.117.0 - 134.159.120.7 hk -134.159.120.8 - 134.159.120.15 nz -134.159.120.16 - 134.159.120.39 au +134.159.110.64 - 134.159.112.47 au +134.159.112.48 - 134.159.112.55 nz +134.159.112.56 - 134.159.112.127 au +134.159.112.128 - 134.159.112.143 tw +134.159.112.144 - 134.159.112.255 au +134.159.113.0 - 134.159.113.7 hk +134.159.113.8 - 134.159.113.63 au +134.159.113.64 - 134.159.113.159 hk +134.159.113.160 - 134.159.113.255 au +134.159.114.0 - 134.159.116.207 hk +134.159.116.208 - 134.159.116.215 tw +134.159.116.216 - 134.159.117.95 hk +134.159.117.96 - 134.159.117.143 au +134.159.117.144 - 134.159.117.183 hk +134.159.117.184 - 134.159.117.191 au +134.159.117.192 - 134.159.117.247 hk +134.159.117.248 - 134.159.117.251 au +134.159.117.252 - 134.159.118.159 hk +134.159.118.160 - 134.159.118.191 au +134.159.118.192 - 134.159.118.207 hk +134.159.118.208 - 134.159.118.223 au +134.159.118.224 - 134.159.118.255 hk +134.159.119.0 - 134.159.120.15 au +134.159.120.16 - 134.159.120.31 jp +134.159.120.32 - 134.159.120.39 au 134.159.120.40 - 134.159.120.47 jp -134.159.120.48 - 134.159.120.63 au -134.159.120.64 - 134.159.120.95 nz -134.159.120.96 - 134.159.120.111 jp -134.159.120.112 - 134.159.120.127 tw -134.159.120.128 - 134.159.120.255 hk -134.159.121.0 - 134.159.121.95 kr -134.159.121.96 - 134.159.121.111 au -134.159.121.112 - 134.159.121.143 kr -134.159.121.144 - 134.159.121.175 nz -134.159.121.176 - 134.159.121.191 jp -134.159.121.192 - 134.159.121.207 tw -134.159.121.208 - 134.159.121.255 au -134.159.122.0 - 134.159.122.31 hk -134.159.122.32 - 134.159.122.47 au -134.159.122.48 - 134.159.122.95 hk -134.159.122.96 - 134.159.122.119 au -134.159.122.120 - 134.159.122.127 nz -134.159.122.128 - 134.159.122.167 jp -134.159.122.168 - 134.159.122.183 au -134.159.122.184 - 134.159.122.191 hk -134.159.122.192 - 134.159.122.223 tw -134.159.122.224 - 134.159.122.239 hk -134.159.122.240 - 134.159.122.247 jp -134.159.122.248 - 134.159.122.255 kr -134.159.123.0 - 134.159.131.33 hk -134.159.131.34 - 134.159.131.37 au -134.159.131.38 - 134.159.131.95 hk -134.159.131.96 - 134.159.131.127 kr -134.159.131.128 - 134.159.131.151 hk -134.159.131.152 - 134.159.131.155 au -134.159.131.156 - 134.159.131.255 hk +134.159.120.48 - 134.159.120.191 au +134.159.120.192 - 134.159.120.199 tw +134.159.120.200 - 134.159.120.207 au +134.159.120.208 - 134.159.120.223 tw +134.159.120.224 - 134.159.120.255 jp +134.159.121.0 - 134.159.122.95 au +134.159.122.96 - 134.159.122.111 nz +134.159.122.112 - 134.159.122.119 au +134.159.122.120 - 134.159.122.127 jp +134.159.122.128 - 134.159.122.223 au +134.159.122.224 - 134.159.122.255 tw +134.159.123.0 - 134.159.125.15 au +134.159.125.16 - 134.159.125.19 jp +134.159.125.20 - 134.159.126.251 au +134.159.126.252 - 134.159.126.255 jp +134.159.127.0 - 134.159.127.255 au +134.159.128.0 - 134.159.128.35 hk +134.159.128.36 - 134.159.128.39 au +134.159.128.40 - 134.159.129.255 hk +134.159.130.0 - 134.159.130.67 au +134.159.130.68 - 134.159.130.71 in +134.159.130.72 - 134.159.130.75 au +134.159.130.76 - 134.159.130.79 in +134.159.130.80 - 134.159.131.255 au 134.159.132.0 - 134.159.132.127 sg -134.159.132.128 - 134.159.132.191 au -134.159.132.192 - 134.159.132.239 hk -134.159.132.240 - 134.159.132.247 jp -134.159.132.248 - 134.159.133.255 hk +134.159.132.128 - 134.159.132.207 au +134.159.132.208 - 134.159.132.215 nz +134.159.132.216 - 134.159.132.255 au +134.159.133.0 - 134.159.133.127 tw +134.159.133.128 - 134.159.133.255 au 134.159.134.0 - 134.159.135.255 jp -134.159.136.0 - 134.159.137.255 hk -134.159.138.0 - 134.159.138.255 vn -134.159.139.0 - 134.159.140.255 hk -134.159.141.0 - 134.159.141.15 in -134.159.141.16 - 134.159.141.127 hk -134.159.141.128 - 134.159.141.195 au -134.159.141.196 - 134.159.141.255 hk -134.159.142.0 - 134.159.142.31 au -134.159.142.32 - 134.159.142.71 hk -134.159.142.72 - 134.159.142.79 au -134.159.142.80 - 134.159.142.127 hk -134.159.142.128 - 134.159.142.159 au -134.159.142.160 - 134.159.142.191 in -134.159.142.192 - 134.159.142.207 hk -134.159.142.208 - 134.159.142.215 sg -134.159.142.216 - 134.159.142.223 hk -134.159.142.224 - 134.159.142.231 tw -134.159.142.232 - 134.159.142.255 hk -134.159.143.0 - 134.159.143.255 mo -134.159.144.0 - 134.159.145.255 au -134.159.146.0 - 134.159.146.31 in -134.159.146.32 - 134.159.146.47 sg -134.159.146.48 - 134.159.146.63 in -134.159.146.64 - 134.159.146.95 sg -134.159.146.96 - 134.159.146.127 hk +134.159.136.0 - 134.159.136.255 au +134.159.137.0 - 134.159.137.255 hk +134.159.138.0 - 134.159.138.255 au +134.159.139.0 - 134.159.140.63 hk +134.159.140.64 - 134.159.140.79 au +134.159.140.80 - 134.159.140.95 hk +134.159.140.96 - 134.159.140.127 au +134.159.140.128 - 134.159.140.131 hk +134.159.140.132 - 134.159.140.191 au +134.159.140.192 - 134.159.140.199 hk +134.159.140.200 - 134.159.142.255 au +134.159.143.0 - 134.159.143.63 hk +134.159.143.64 - 134.159.143.127 au +134.159.143.128 - 134.159.143.167 hk +134.159.143.168 - 134.159.143.175 au +134.159.143.176 - 134.159.143.191 hk +134.159.143.192 - 134.159.143.255 au +134.159.144.0 - 134.159.145.255 hk +134.159.146.0 - 134.159.146.127 au 134.159.146.128 - 134.159.146.191 sg -134.159.146.192 - 134.159.146.255 au -134.159.147.0 - 134.159.147.255 tw -134.159.148.0 - 134.159.149.255 hk -134.159.150.0 - 134.159.150.63 sg -134.159.150.64 - 134.159.150.127 au -134.159.150.128 - 134.159.150.255 hk -134.159.151.0 - 134.159.151.143 au -134.159.151.144 - 134.159.151.167 nz -134.159.151.168 - 134.159.151.207 au -134.159.151.208 - 134.159.151.211 nz -134.159.151.212 - 134.159.153.127 hk -134.159.153.128 - 134.159.153.135 jp -134.159.153.136 - 134.159.153.255 hk -134.159.154.0 - 134.159.154.15 jp -134.159.154.16 - 134.159.154.63 hk -134.159.154.64 - 134.159.154.95 au -134.159.154.96 - 134.159.154.111 jp -134.159.154.112 - 134.159.154.255 hk -134.159.155.0 - 134.159.155.31 au -134.159.155.32 - 134.159.155.63 hk -134.159.155.64 - 134.159.155.111 au -134.159.155.112 - 134.159.155.115 hk -134.159.155.116 - 134.159.155.223 au -134.159.155.224 - 134.159.155.255 hk -134.159.156.0 - 134.159.156.127 au -134.159.156.128 - 134.159.156.143 hk -134.159.156.144 - 134.159.156.159 au -134.159.156.160 - 134.159.156.167 hk -134.159.156.168 - 134.159.156.191 au -134.159.156.192 - 134.159.156.231 hk -134.159.156.232 - 134.159.156.239 au -134.159.156.240 - 134.159.156.247 sg -134.159.156.248 - 134.159.157.127 au -134.159.157.128 - 134.159.157.159 hk -134.159.157.160 - 134.159.157.175 au -134.159.157.176 - 134.159.163.127 hk -134.159.163.128 - 134.159.163.191 au -134.159.163.192 - 134.159.165.31 hk -134.159.165.32 - 134.159.165.63 au -134.159.165.64 - 134.159.165.79 hk -134.159.165.80 - 134.159.165.95 in -134.159.165.96 - 134.159.165.103 hk -134.159.165.104 - 134.159.165.119 in -134.159.165.120 - 134.159.168.127 hk -134.159.168.128 - 134.159.168.255 in -134.159.169.0 - 134.159.172.255 hk -134.159.173.0 - 134.159.173.71 au -134.159.173.72 - 134.159.173.127 hk -134.159.173.128 - 134.159.173.159 au -134.159.173.160 - 134.159.185.255 hk -134.159.186.0 - 134.159.186.15 tw -134.159.186.16 - 134.159.255.255 hk +134.159.146.192 - 134.159.147.31 au +134.159.147.32 - 134.159.147.239 hk +134.159.147.240 - 134.159.147.247 au +134.159.147.248 - 134.159.148.255 hk +134.159.149.0 - 134.159.149.127 sg +134.159.149.128 - 134.159.151.255 au +134.159.152.0 - 134.159.153.31 hk +134.159.153.32 - 134.159.153.79 au +134.159.153.80 - 134.159.153.87 hk +134.159.153.88 - 134.159.153.127 au +134.159.153.128 - 134.159.153.135 hk +134.159.153.136 - 134.159.153.151 au +134.159.153.152 - 134.159.153.199 hk +134.159.153.200 - 134.159.155.115 au +134.159.155.116 - 134.159.155.119 nz +134.159.155.120 - 134.159.155.243 au +134.159.155.244 - 134.159.155.247 nz +134.159.155.248 - 134.159.156.247 au +134.159.156.248 - 134.159.156.255 nz +134.159.157.0 - 134.159.157.255 au +134.159.158.0 - 134.159.159.7 hk +134.159.159.8 - 134.159.159.31 au +134.159.159.32 - 134.159.159.127 hk +134.159.159.128 - 134.159.159.191 au +134.159.159.192 - 134.159.159.255 hk +134.159.160.0 - 134.159.160.55 au +134.159.160.56 - 134.159.160.59 tw +134.159.160.60 - 134.159.160.127 au +134.159.160.128 - 134.159.160.131 jp +134.159.160.132 - 134.159.160.151 au +134.159.160.152 - 134.159.160.155 jp +134.159.160.156 - 134.159.160.255 au +134.159.161.0 - 134.159.161.255 hk +134.159.162.0 - 134.159.162.15 au +134.159.162.16 - 134.159.162.23 jp +134.159.162.24 - 134.159.162.31 au +134.159.162.32 - 134.159.162.47 jp +134.159.162.48 - 134.159.167.255 au +134.159.168.0 - 134.159.168.3 gb +134.159.168.4 - 134.159.168.7 in +134.159.168.8 - 134.159.168.63 gb +134.159.168.64 - 134.159.168.127 in +134.159.168.128 - 134.159.168.255 gb +134.159.169.0 - 134.159.170.15 au +134.159.170.16 - 134.159.170.31 tw +134.159.170.32 - 134.159.170.63 au +134.159.170.64 - 134.159.170.67 tw +134.159.170.68 - 134.159.170.71 au +134.159.170.72 - 134.159.170.95 tw +134.159.170.96 - 134.159.171.127 au +134.159.171.128 - 134.159.171.159 jp +134.159.171.160 - 134.159.171.175 au +134.159.171.176 - 134.159.171.223 jp +134.159.171.224 - 134.159.172.15 au +134.159.172.16 - 134.159.172.23 nz +134.159.172.24 - 134.159.173.255 au +134.159.174.0 - 134.159.174.255 nz +134.159.175.0 - 134.159.175.255 hk +134.159.176.0 - 134.159.185.255 au +134.159.186.0 - 134.159.186.31 in +134.159.186.32 - 134.159.186.255 au +134.159.187.0 - 134.159.187.15 in +134.159.187.16 - 134.159.191.255 au +134.159.192.0 - 134.159.213.255 hk +134.159.214.0 - 134.159.214.255 nz +134.159.215.0 - 134.159.216.255 hk +134.159.217.0 - 134.159.218.255 nz +134.159.219.0 - 134.159.222.255 hk +134.159.223.0 - 134.159.223.255 au +134.159.224.0 - 134.159.255.255 hk 134.160.0.0 - 134.160.255.255 jp 134.161.0.0 - 134.168.255.255 us 134.169.0.0 - 134.169.255.255 de -134.170.0.0 - 134.170.255.255 us +134.170.0.0 - 134.170.39.255 us +134.170.40.0 - 134.170.47.255 ie +134.170.48.0 - 134.170.63.255 us +134.170.64.0 - 134.170.79.255 nl +134.170.80.0 - 134.170.95.255 ie +134.170.96.0 - 134.170.103.255 nl +134.170.104.0 - 134.170.127.255 us +134.170.128.0 - 134.170.135.255 sg +134.170.136.0 - 134.170.143.255 hk +134.170.144.0 - 134.170.167.255 us +134.170.168.0 - 134.170.175.255 ie +134.170.176.0 - 134.170.191.255 us +134.170.192.0 - 134.170.199.255 hk +134.170.200.0 - 134.170.203.255 us +134.170.204.0 - 134.170.205.255 nl +134.170.206.0 - 134.170.207.255 ie +134.170.208.0 - 134.170.211.255 us +134.170.212.0 - 134.170.213.255 nl +134.170.214.0 - 134.170.215.255 ie +134.170.216.0 - 134.170.216.255 hk +134.170.217.0 - 134.170.217.255 br +134.170.218.0 - 134.170.235.255 us +134.170.236.0 - 134.170.237.255 nl +134.170.238.0 - 134.170.251.255 us +134.170.252.0 - 134.170.254.255 ie +134.170.255.0 - 134.170.255.255 us 134.171.0.0 - 134.171.255.255 de 134.172.0.0 - 134.175.255.255 us 134.176.0.0 - 134.176.255.255 de @@ -68384,34 +50127,45 @@ 134.188.0.0 - 134.188.255.255 nl 134.189.0.0 - 134.189.255.255 us 134.190.0.0 - 134.190.255.255 ca -134.191.0.0 - 134.191.255.255 gb +134.191.0.0 - 134.191.231.255 gb +134.191.232.0 - 134.191.232.255 il +134.191.233.0 - 134.191.253.255 gb +134.191.254.0 - 134.191.254.255 il +134.191.255.0 - 134.191.255.255 gb 134.192.0.0 - 134.195.255.255 us -134.196.0.0 - 134.196.255.255 cn +134.196.0.0 - 134.196.255.255 th 134.197.0.0 - 134.198.255.255 us 134.199.0.0 - 134.199.255.255 ca 134.200.0.0 - 134.201.255.255 us 134.202.0.0 - 134.202.255.255 pr 134.203.0.0 - 134.203.255.255 nl -134.204.0.0 - 134.205.255.255 us +134.204.0.0 - 134.204.207.255 us +134.204.208.0 - 134.204.208.255 th +134.204.209.0 - 134.205.255.255 us 134.206.0.0 - 134.206.255.255 fr 134.207.0.0 - 134.207.255.255 us 134.208.0.0 - 134.208.255.255 tw 134.209.0.0 - 134.210.255.255 us 134.211.0.0 - 134.211.255.255 au 134.212.0.0 - 134.212.255.255 fr -134.213.0.0 - 134.213.255.255 ie +134.213.0.0 - 134.213.255.255 gb 134.214.0.0 - 134.214.255.255 fr 134.215.0.0 - 134.218.255.255 us 134.219.0.0 - 134.220.255.255 gb -134.221.0.0 - 134.222.255.255 nl +134.221.0.0 - 134.222.104.249 nl +134.222.104.250 - 134.222.104.250 eu +134.222.104.251 - 134.222.109.231 nl +134.222.109.232 - 134.222.109.233 ie +134.222.109.234 - 134.222.255.255 nl 134.223.0.0 - 134.224.255.255 us 134.225.0.0 - 134.225.255.255 gb 134.226.0.0 - 134.226.255.255 ie 134.227.0.0 - 134.227.255.255 fr -134.228.0.0 - 134.236.255.255 us +134.228.0.0 - 134.235.255.255 us +134.236.0.0 - 134.236.255.255 th 134.237.0.0 - 134.237.255.255 jp 134.238.0.0 - 134.238.255.255 us -134.239.0.0 - 134.239.255.255 gb +134.239.0.0 - 134.239.255.255 sa 134.240.0.0 - 134.244.255.255 us 134.245.0.0 - 134.245.255.255 de 134.246.0.0 - 134.246.255.255 fr @@ -68424,17 +50178,79 @@ 134.255.160.0 - 134.255.183.255 it 134.255.184.0 - 134.255.191.255 es 134.255.192.0 - 134.255.255.255 de -135.0.0.0 - 135.11.255.255 us -135.12.0.0 - 135.12.255.255 ca -135.13.0.0 - 135.180.255.255 us +135.0.0.0 - 135.0.255.255 ca +135.1.0.0 - 135.1.255.255 us +135.2.0.0 - 135.7.255.255 fr +135.8.0.0 - 135.10.102.255 us +135.10.103.0 - 135.10.103.255 gb +135.10.104.0 - 135.12.0.255 us +135.12.1.0 - 135.12.255.255 ca +135.13.0.0 - 135.13.255.255 fr +135.14.0.0 - 135.17.255.255 us +135.18.0.0 - 135.18.255.255 fr +135.19.0.0 - 135.19.255.255 ca +135.20.0.0 - 135.22.255.255 us +135.23.0.0 - 135.23.255.255 ca +135.24.0.0 - 135.27.3.255 us +135.27.4.0 - 135.27.4.255 sg +135.27.5.0 - 135.84.208.255 us +135.84.209.0 - 135.84.209.255 gb +135.84.210.0 - 135.84.213.255 us +135.84.214.0 - 135.84.214.255 gb +135.84.215.0 - 135.84.231.255 us +135.84.232.0 - 135.84.239.255 mo +135.84.240.0 - 135.84.255.255 in +135.85.0.0 - 135.88.255.255 fr +135.89.0.0 - 135.91.255.255 us +135.92.0.0 - 135.93.255.255 fr +135.94.0.0 - 135.102.255.255 us +135.103.0.0 - 135.104.255.255 fr +135.105.0.0 - 135.108.255.255 us +135.109.0.0 - 135.109.255.255 fr +135.110.0.0 - 135.180.255.255 us 135.181.0.0 - 135.181.255.255 ca -135.182.0.0 - 135.195.255.255 us -135.196.0.0 - 135.196.12.255 gb -135.196.13.0 - 135.196.13.255 de -135.196.14.0 - 135.196.255.255 gb -135.197.0.0 - 136.144.255.255 us +135.182.0.0 - 135.182.255.255 us +135.183.0.0 - 135.183.255.255 fr +135.184.0.0 - 135.184.255.255 us +135.185.0.0 - 135.185.255.255 fr +135.186.0.0 - 135.195.255.255 us +135.196.0.0 - 135.196.255.255 gb +135.197.0.0 - 135.219.255.255 us +135.220.0.0 - 135.245.7.255 fr +135.245.8.0 - 135.245.8.255 us +135.245.9.0 - 135.245.9.255 fr +135.245.10.0 - 135.245.10.255 us +135.245.11.0 - 135.245.47.255 fr +135.245.48.0 - 135.245.49.255 us +135.245.50.0 - 135.245.71.255 fr +135.245.72.0 - 135.245.72.255 eu +135.245.73.0 - 135.245.103.255 fr +135.245.104.0 - 135.245.104.255 in +135.245.105.0 - 135.245.167.255 fr +135.245.168.0 - 135.245.168.255 in +135.245.169.0 - 135.245.223.255 fr +135.245.224.0 - 135.245.224.255 us +135.245.225.0 - 135.255.255.255 fr +136.0.0.0 - 136.0.15.255 ch +136.0.16.0 - 136.8.1.99 us +136.8.1.100 - 136.8.1.100 ap +136.8.1.101 - 136.8.1.255 us +136.8.2.0 - 136.8.2.67 au +136.8.2.68 - 136.8.2.69 ap +136.8.2.70 - 136.8.2.70 au +136.8.2.71 - 136.8.2.71 us +136.8.2.72 - 136.8.2.255 au +136.8.3.0 - 136.8.4.255 us +136.8.5.0 - 136.8.5.255 ap +136.8.6.0 - 136.8.32.255 us +136.8.33.0 - 136.8.33.255 gb +136.8.34.0 - 136.8.149.255 us +136.8.150.0 - 136.8.150.255 eu +136.8.151.0 - 136.8.151.255 us +136.8.152.0 - 136.8.152.255 eu +136.8.153.0 - 136.144.255.255 us 136.145.0.0 - 136.145.255.255 pr -136.146.0.0 - 136.147.255.255 ca +136.146.0.0 - 136.147.255.255 us 136.148.0.0 - 136.148.255.255 gb 136.149.0.0 - 136.152.255.255 us 136.153.0.0 - 136.154.255.255 au @@ -68452,8 +50268,13 @@ 136.170.0.0 - 136.170.255.255 gb 136.171.0.0 - 136.171.255.255 us 136.172.0.0 - 136.172.255.255 de -136.173.0.0 - 136.173.255.255 lu -136.174.0.0 - 136.185.255.255 us +136.173.0.0 - 136.173.161.255 eu +136.173.162.0 - 136.173.162.255 be +136.173.163.0 - 136.173.179.255 eu +136.173.180.0 - 136.173.180.255 be +136.173.181.0 - 136.173.255.255 eu +136.174.0.0 - 136.184.255.255 us +136.185.0.0 - 136.185.255.255 in 136.186.0.0 - 136.186.255.255 au 136.187.0.0 - 136.187.255.255 jp 136.188.0.0 - 136.197.255.255 us @@ -68473,7 +50294,9 @@ 136.237.0.0 - 136.237.255.255 us 136.238.0.0 - 136.238.255.255 ch 136.239.0.0 - 136.242.255.255 us -136.243.0.0 - 136.243.255.255 de +136.243.0.0 - 136.243.135.253 de +136.243.135.254 - 136.243.135.254 nl +136.243.135.255 - 136.243.255.255 de 136.244.0.0 - 137.14.255.255 us 137.15.0.0 - 137.15.255.255 ca 137.16.0.0 - 137.16.255.255 us @@ -68492,13 +50315,61 @@ 137.55.0.0 - 137.56.255.255 nl 137.57.0.0 - 137.57.255.255 us 137.58.0.0 - 137.58.255.255 se +137.59.0.0 - 137.59.3.255 in +137.59.4.0 - 137.59.7.255 bd +137.59.8.0 - 137.59.11.255 in +137.59.12.0 - 137.59.15.255 id +137.59.16.0 - 137.59.23.255 hk +137.59.24.0 - 137.59.47.255 vn +137.59.48.0 - 137.59.51.255 bd +137.59.52.0 - 137.59.79.255 in +137.59.80.0 - 137.59.83.255 hk +137.59.84.0 - 137.59.87.255 in +137.59.88.0 - 137.59.91.255 cn +137.59.92.0 - 137.59.99.255 in +137.59.100.0 - 137.59.103.255 hk +137.59.104.0 - 137.59.107.255 vn +137.59.108.0 - 137.59.111.255 my +137.59.112.0 - 137.59.115.255 th +137.59.116.0 - 137.59.119.255 vn +137.59.120.0 - 137.59.123.255 af +137.59.124.0 - 137.59.127.255 id +137.59.128.0 - 137.59.143.255 in +137.59.144.0 - 137.59.147.255 pk +137.59.148.0 - 137.59.151.255 hk +137.59.152.0 - 137.59.155.255 bd +137.59.156.0 - 137.59.159.255 in +137.59.160.0 - 137.59.163.255 id +137.59.164.0 - 137.59.167.255 in +137.59.168.0 - 137.59.171.255 nz +137.59.172.0 - 137.59.179.255 in +137.59.180.0 - 137.59.183.255 bd +137.59.184.0 - 137.59.187.255 hk +137.59.188.0 - 137.59.191.255 au +137.59.192.0 - 137.59.195.255 pk +137.59.196.0 - 137.59.199.255 au +137.59.200.0 - 137.59.207.255 in +137.59.208.0 - 137.59.211.255 hk +137.59.212.0 - 137.59.215.255 in +137.59.216.0 - 137.59.231.255 pk +137.59.232.0 - 137.59.235.255 jp +137.59.236.0 - 137.59.239.255 hk +137.59.240.0 - 137.59.247.255 in +137.59.248.0 - 137.59.251.255 au +137.59.252.0 - 137.59.255.255 jp 137.60.0.0 - 137.61.255.255 se 137.62.0.0 - 137.62.255.255 ch +137.63.0.0 - 137.63.71.225 sc +137.63.71.226 - 137.63.71.226 ca +137.63.71.227 - 137.63.127.255 sc +137.63.128.0 - 137.63.255.255 ug 137.64.0.0 - 137.67.255.255 us 137.68.0.0 - 137.68.255.255 kr -137.69.0.0 - 137.72.255.255 us +137.69.0.0 - 137.71.229.255 us +137.71.230.0 - 137.71.230.255 ap +137.71.231.0 - 137.72.255.255 us 137.73.0.0 - 137.73.255.255 gb -137.74.0.0 - 137.74.255.255 ca +137.74.0.0 - 137.74.255.255 hk 137.75.0.0 - 137.75.255.255 us 137.76.0.0 - 137.76.255.255 au 137.77.0.0 - 137.81.255.255 us @@ -68509,8 +50380,10 @@ 137.94.0.0 - 137.94.255.255 ca 137.95.0.0 - 137.95.255.255 us 137.96.0.0 - 137.96.255.255 fi -137.97.0.0 - 137.100.255.255 us -137.101.0.0 - 137.101.255.255 gb +137.97.0.0 - 137.97.255.255 sg +137.98.0.0 - 137.98.255.255 cz +137.99.0.0 - 137.100.255.255 us +137.101.0.0 - 137.101.255.255 es 137.102.0.0 - 137.104.255.255 us 137.105.0.0 - 137.105.255.255 gb 137.106.0.0 - 137.107.255.255 us @@ -68518,7 +50391,15 @@ 137.109.0.0 - 137.109.255.255 au 137.110.0.0 - 137.110.255.255 us 137.111.0.0 - 137.111.255.255 au -137.112.0.0 - 137.119.255.255 us +137.112.0.0 - 137.116.127.255 us +137.116.128.0 - 137.116.159.255 sg +137.116.160.0 - 137.116.175.255 hk +137.116.176.0 - 137.116.191.255 us +137.116.192.0 - 137.116.223.255 nl +137.116.224.0 - 137.116.255.255 ie +137.117.0.0 - 137.117.127.255 us +137.117.128.0 - 137.117.255.255 nl +137.118.0.0 - 137.119.255.255 us 137.120.0.0 - 137.120.255.255 nl 137.121.0.0 - 137.121.255.255 fr 137.122.0.0 - 137.122.255.255 ca @@ -68527,7 +50408,9 @@ 137.130.0.0 - 137.131.255.255 us 137.132.0.0 - 137.132.255.255 sg 137.133.0.0 - 137.133.255.255 no -137.134.0.0 - 137.137.255.255 us +137.134.0.0 - 137.135.127.255 us +137.135.128.0 - 137.135.255.255 ie +137.136.0.0 - 137.137.255.255 us 137.138.0.0 - 137.138.255.255 ch 137.139.0.0 - 137.146.255.255 us 137.147.0.0 - 137.147.255.255 au @@ -68544,11 +50427,14 @@ 137.163.0.0 - 137.163.255.255 fi 137.164.0.0 - 137.165.255.255 us 137.166.0.0 - 137.166.255.255 au -137.167.0.0 - 137.171.255.255 us +137.167.0.0 - 137.170.255.255 us +137.171.0.0 - 137.171.255.255 za 137.172.0.0 - 137.172.255.255 au 137.173.0.0 - 137.173.255.255 us 137.174.0.0 - 137.174.255.255 nl -137.175.0.0 - 137.185.255.255 us +137.175.0.0 - 137.175.127.255 us +137.175.128.0 - 137.175.255.255 ca +137.176.0.0 - 137.185.255.255 us 137.186.0.0 - 137.186.255.255 ca 137.187.0.0 - 137.188.255.255 us 137.189.0.0 - 137.189.255.255 hk @@ -68557,7 +50443,9 @@ 137.192.0.0 - 137.192.255.255 us 137.193.0.0 - 137.193.255.255 de 137.194.0.0 - 137.194.255.255 fr -137.195.0.0 - 137.195.255.255 gb +137.195.0.0 - 137.195.223.255 gb +137.195.224.0 - 137.195.239.255 my +137.195.240.0 - 137.195.255.255 gb 137.196.0.0 - 137.203.255.255 us 137.204.0.0 - 137.204.255.255 it 137.205.0.0 - 137.205.255.255 gb @@ -68584,6 +50472,29 @@ 137.252.0.0 - 137.252.255.255 us 137.253.0.0 - 137.253.255.255 gb 137.254.0.0 - 137.254.255.255 us +138.0.0.0 - 138.0.7.255 br +138.0.8.0 - 138.0.11.255 ar +138.0.12.0 - 138.0.15.255 cl +138.0.16.0 - 138.0.39.255 br +138.0.40.0 - 138.0.43.255 ve +138.0.44.0 - 138.0.55.255 br +138.0.56.0 - 138.0.59.255 ar +138.0.60.0 - 138.0.87.255 br +138.0.88.0 - 138.0.91.255 co +138.0.92.0 - 138.0.103.255 br +138.0.104.0 - 138.0.107.255 ar +138.0.108.0 - 138.0.115.255 br +138.0.116.0 - 138.0.119.255 pa +138.0.120.0 - 138.0.123.255 cl +138.0.124.0 - 138.0.151.255 br +138.0.152.0 - 138.0.159.255 ar +138.0.160.0 - 138.0.183.255 br +138.0.184.0 - 138.0.187.255 ar +138.0.188.0 - 138.0.227.255 br +138.0.228.0 - 138.0.231.255 hn +138.0.232.0 - 138.0.239.255 br +138.0.240.0 - 138.0.243.255 hn +138.0.244.0 - 138.0.255.255 br 138.1.0.0 - 138.2.255.255 us 138.3.0.0 - 138.3.255.255 gb 138.4.0.0 - 138.4.255.255 es @@ -68595,17 +50506,59 @@ 138.12.0.0 - 138.13.255.255 us 138.14.0.0 - 138.14.255.255 se 138.15.0.0 - 138.18.255.255 us -138.19.0.0 - 138.19.255.255 au -138.20.0.0 - 138.20.255.255 us +138.19.0.0 - 138.19.18.255 hk +138.19.19.0 - 138.19.19.255 au +138.19.20.0 - 138.19.255.255 hk +138.20.0.0 - 138.20.184.255 us +138.20.185.0 - 138.20.185.255 gb +138.20.186.0 - 138.20.255.255 us 138.21.0.0 - 138.21.255.255 fr 138.22.0.0 - 138.22.255.255 at 138.23.0.0 - 138.23.255.255 us 138.24.0.0 - 138.25.255.255 au 138.26.0.0 - 138.29.255.255 us 138.30.0.0 - 138.30.255.255 jp -138.31.0.0 - 138.33.255.255 us -138.34.0.0 - 138.34.255.255 ca +138.31.0.0 - 138.32.167.255 us +138.32.168.0 - 138.32.168.255 no +138.32.169.0 - 138.32.175.255 us +138.32.176.0 - 138.32.176.255 gb +138.32.177.0 - 138.32.234.255 us +138.32.235.0 - 138.32.235.255 ca +138.32.236.0 - 138.32.236.255 id +138.32.237.0 - 138.32.240.255 us +138.32.241.0 - 138.32.241.255 au +138.32.242.0 - 138.32.253.255 us +138.32.254.0 - 138.32.254.255 ap +138.32.255.0 - 138.33.255.255 us +138.34.0.0 - 138.34.12.255 ca +138.34.13.0 - 138.34.13.255 us +138.34.14.0 - 138.34.255.255 ca 138.35.0.0 - 138.35.255.255 us +138.36.0.0 - 138.36.15.255 br +138.36.16.0 - 138.36.19.255 ar +138.36.20.0 - 138.36.23.255 br +138.36.24.0 - 138.36.27.255 do +138.36.28.0 - 138.36.51.255 br +138.36.52.0 - 138.36.55.255 ar +138.36.56.0 - 138.36.63.255 br +138.36.64.0 - 138.36.67.255 co +138.36.68.0 - 138.36.75.255 br +138.36.76.0 - 138.36.79.255 bo +138.36.80.0 - 138.36.91.255 br +138.36.92.0 - 138.36.95.255 hn +138.36.96.0 - 138.36.99.255 ar +138.36.100.0 - 138.36.135.255 br +138.36.136.0 - 138.36.139.255 hn +138.36.140.0 - 138.36.143.255 br +138.36.144.0 - 138.36.147.255 pe +138.36.148.0 - 138.36.151.255 ar +138.36.152.0 - 138.36.155.255 mx +138.36.156.0 - 138.36.219.255 br +138.36.220.0 - 138.36.223.255 ar +138.36.224.0 - 138.36.235.255 br +138.36.236.0 - 138.36.239.255 ar +138.36.240.0 - 138.36.251.255 br +138.36.252.0 - 138.36.255.255 cl 138.37.0.0 - 138.38.255.255 gb 138.39.0.0 - 138.39.255.255 us 138.40.0.0 - 138.40.255.255 gb @@ -68616,7 +50569,36 @@ 138.48.0.0 - 138.48.255.255 be 138.49.0.0 - 138.50.255.255 us 138.51.0.0 - 138.51.255.255 ca -138.52.0.0 - 138.61.255.255 us +138.52.0.0 - 138.58.255.255 us +138.59.0.0 - 138.59.3.255 ar +138.59.4.0 - 138.59.7.255 hn +138.59.8.0 - 138.59.11.255 ve +138.59.12.0 - 138.59.15.255 uy +138.59.16.0 - 138.59.19.255 cr +138.59.20.0 - 138.59.23.255 br +138.59.24.0 - 138.59.27.255 tt +138.59.28.0 - 138.59.63.255 br +138.59.64.0 - 138.59.67.255 pe +138.59.68.0 - 138.59.107.255 br +138.59.108.0 - 138.59.111.255 ec +138.59.112.0 - 138.59.115.255 br +138.59.116.0 - 138.59.119.255 ve +138.59.120.0 - 138.59.131.255 br +138.59.132.0 - 138.59.135.255 cr +138.59.136.0 - 138.59.139.255 br +138.59.140.0 - 138.59.143.255 ar +138.59.144.0 - 138.59.147.255 br +138.59.148.0 - 138.59.151.255 pa +138.59.152.0 - 138.59.163.255 br +138.59.164.0 - 138.59.167.255 py +138.59.168.0 - 138.59.175.255 ar +138.59.176.0 - 138.59.179.255 hn +138.59.184.0 - 138.59.203.255 br +138.59.204.0 - 138.59.207.255 hn +138.59.208.0 - 138.59.243.255 br +138.59.244.0 - 138.59.247.255 ar +138.59.248.0 - 138.59.255.255 br +138.60.0.0 - 138.61.255.255 us 138.62.0.0 - 138.62.255.255 no 138.63.0.0 - 138.63.255.255 fr 138.64.0.0 - 138.65.255.255 us @@ -68627,35 +50609,306 @@ 138.72.0.0 - 138.72.255.255 us 138.73.0.0 - 138.73.255.255 ca 138.74.0.0 - 138.74.255.255 us -138.75.0.0 - 138.75.255.255 nz +138.75.0.0 - 138.75.255.255 sg 138.76.0.0 - 138.76.255.255 us 138.77.0.0 - 138.77.255.255 au 138.78.0.0 - 138.78.255.255 us 138.79.0.0 - 138.80.255.255 au 138.81.0.0 - 138.81.255.255 ch 138.82.0.0 - 138.82.255.255 ca -138.83.0.0 - 138.95.255.255 us +138.83.0.0 - 138.90.255.255 us +138.91.0.0 - 138.91.31.255 jp +138.91.32.0 - 138.91.47.255 sg +138.91.48.0 - 138.91.63.255 ie +138.91.64.0 - 138.93.255.255 us +138.94.0.0 - 138.94.3.255 co +138.94.4.0 - 138.94.11.255 br +138.94.12.0 - 138.94.15.255 ar +138.94.16.0 - 138.94.55.255 br +138.94.56.0 - 138.94.59.255 cr +138.94.60.0 - 138.94.119.255 br +138.94.120.0 - 138.94.122.223 hn +138.94.122.224 - 138.94.122.255 nl +138.94.123.0 - 138.94.123.47 hn +138.94.123.48 - 138.94.123.63 nl +138.94.123.64 - 138.94.123.255 hn +138.94.124.0 - 138.94.139.255 br +138.94.140.0 - 138.94.143.255 mx +138.94.144.0 - 138.94.147.255 hn +138.94.148.0 - 138.94.199.0 br +138.94.199.1 - 138.94.199.1 us +138.94.199.2 - 138.94.215.255 br +138.94.216.0 - 138.94.219.255 hn +138.94.220.0 - 138.94.239.255 br +138.94.240.0 - 138.94.243.255 tt +138.94.244.0 - 138.94.247.255 sv +138.94.248.0 - 138.94.251.255 gy +138.94.252.0 - 138.94.255.255 gt +138.95.0.0 - 138.95.255.255 us 138.96.0.0 - 138.96.255.255 fr +138.97.0.0 - 138.97.55.255 br +138.97.56.0 - 138.97.59.255 co +138.97.60.0 - 138.97.79.255 br +138.97.80.0 - 138.97.83.255 co +138.97.84.0 - 138.97.139.255 br +138.97.140.0 - 138.97.143.255 sv +138.97.144.0 - 138.97.155.255 br +138.97.156.0 - 138.97.159.255 bz +138.97.160.0 - 138.97.163.255 ni +138.97.164.0 - 138.97.167.255 br +138.97.168.0 - 138.97.171.255 mx +138.97.172.0 - 138.97.175.255 br +138.97.176.0 - 138.97.179.255 ar +138.97.180.0 - 138.97.199.255 br +138.97.200.0 - 138.97.203.255 ar +138.97.204.0 - 138.97.235.255 br +138.97.236.0 - 138.97.239.255 ar +138.97.240.0 - 138.97.247.255 br +138.97.248.0 - 138.97.251.255 do +138.97.252.0 - 138.97.255.255 br 138.98.0.0 - 138.98.255.255 us +138.99.0.0 - 138.99.3.255 sv +138.99.4.0 - 138.99.7.255 ar +138.99.8.0 - 138.99.35.255 br +138.99.36.0 - 138.99.39.71 hn +138.99.39.72 - 138.99.39.79 nl +138.99.39.80 - 138.99.39.255 hn +138.99.40.0 - 138.99.43.255 br +138.99.44.0 - 138.99.47.255 uy +138.99.48.0 - 138.99.99.255 br +138.99.100.0 - 138.99.103.255 py +138.99.104.0 - 138.99.120.127 br +138.99.120.128 - 138.99.120.255 pe +138.99.121.0 - 138.99.121.127 ar +138.99.121.128 - 138.99.121.255 ve +138.99.122.0 - 138.99.122.127 pe +138.99.122.128 - 138.99.122.255 br +138.99.123.0 - 138.99.123.127 ec +138.99.123.128 - 138.99.123.255 ar +138.99.124.0 - 138.99.127.255 ve +138.99.128.0 - 138.99.131.255 ar +138.99.132.0 - 138.99.135.255 br +138.99.136.0 - 138.99.139.255 pa +138.99.140.0 - 138.99.143.255 br +138.99.144.0 - 138.99.144.255 pa +138.99.145.0 - 138.99.145.255 br +138.99.146.0 - 138.99.146.255 pa +138.99.147.0 - 138.99.147.255 br +138.99.148.0 - 138.99.151.255 mx +138.99.152.0 - 138.99.171.255 br +138.99.172.0 - 138.99.175.255 ar +138.99.176.0 - 138.99.179.255 cl +138.99.180.0 - 138.99.183.255 sv +138.99.184.0 - 138.99.187.255 ar +138.99.188.0 - 138.99.207.255 br +138.99.208.0 - 138.99.211.255 bz +138.99.212.0 - 138.99.215.255 cw +138.99.216.0 - 138.99.219.255 bz +138.99.220.0 - 138.99.223.255 ve +138.99.224.0 - 138.99.227.255 cl +138.99.232.0 - 138.99.235.255 br +138.99.236.0 - 138.99.239.255 do +138.99.240.0 - 138.99.255.255 br 138.100.0.0 - 138.100.255.255 es 138.101.0.0 - 138.101.255.255 jp 138.102.0.0 - 138.102.255.255 fr 138.103.0.0 - 138.103.255.255 se -138.104.0.0 - 138.104.255.255 gb +138.104.0.0 - 138.104.229.255 gb +138.104.230.0 - 138.104.230.255 sg +138.104.231.0 - 138.104.255.255 gb 138.105.0.0 - 138.105.255.255 us 138.106.0.0 - 138.106.255.255 se 138.107.0.0 - 138.107.255.255 jp -138.108.0.0 - 138.116.255.255 us -138.119.0.0 - 138.120.255.255 ca +138.108.0.0 - 138.108.135.255 us +138.108.136.0 - 138.108.136.255 my +138.108.137.0 - 138.111.129.255 us +138.111.130.0 - 138.111.130.255 fi +138.111.131.0 - 138.116.255.255 us +138.117.0.0 - 138.117.3.255 br +138.117.4.0 - 138.117.7.255 ni +138.117.8.0 - 138.117.23.255 ar +138.117.24.0 - 138.117.39.255 br +138.117.40.0 - 138.117.43.255 co +138.117.44.0 - 138.117.47.255 ve +138.117.48.0 - 138.117.51.255 ar +138.117.52.0 - 138.117.67.255 br +138.117.68.0 - 138.117.71.255 cl +138.117.72.0 - 138.117.75.255 br +138.117.76.0 - 138.117.79.255 ar +138.117.80.0 - 138.117.83.255 br +138.117.84.0 - 138.117.87.255 co +138.117.88.0 - 138.117.95.255 br +138.117.96.0 - 138.117.99.255 hn +138.117.100.0 - 138.117.107.255 br +138.117.108.0 - 138.117.111.255 co +138.117.112.0 - 138.117.115.255 ar +138.117.116.0 - 138.117.127.255 br +138.117.128.0 - 138.117.131.255 ar +138.117.132.0 - 138.117.135.255 br +138.117.136.0 - 138.117.139.255 co +138.117.140.0 - 138.117.143.255 gt +138.117.144.0 - 138.117.147.255 br +138.117.148.0 - 138.117.151.255 cl +138.117.152.0 - 138.117.155.255 br +138.117.156.0 - 138.117.159.255 ar +138.117.160.0 - 138.117.163.255 pe +138.117.164.0 - 138.117.199.255 br +138.117.200.0 - 138.117.203.255 ar +138.117.204.0 - 138.117.223.255 br +138.118.0.0 - 138.118.7.255 br +138.118.8.0 - 138.118.11.255 cl +138.118.12.0 - 138.118.35.255 br +138.118.36.0 - 138.118.39.255 ar +138.118.40.0 - 138.118.47.255 br +138.118.48.0 - 138.118.51.255 ar +138.118.52.0 - 138.118.79.255 br +138.118.80.0 - 138.118.83.255 cr +138.118.84.0 - 138.118.103.255 br +138.118.104.0 - 138.118.107.255 gt +138.118.108.0 - 138.118.111.255 br +138.118.112.0 - 138.118.115.255 ar +138.118.116.0 - 138.118.123.255 br +138.118.124.0 - 138.118.127.255 pa +138.118.128.0 - 138.118.143.255 br +138.118.144.0 - 138.118.147.255 ar +138.118.148.0 - 138.118.155.255 br +138.118.156.0 - 138.118.159.255 cr +138.118.160.0 - 138.118.207.255 br +138.118.208.0 - 138.118.219.255 ar +138.118.220.0 - 138.118.255.255 br +138.119.0.0 - 138.119.255.255 ca +138.120.0.0 - 138.120.255.255 us +138.121.0.0 - 138.121.3.255 br +138.121.4.0 - 138.121.7.255 co +138.121.8.0 - 138.121.11.255 br +138.121.12.0 - 138.121.15.255 co +138.121.16.0 - 138.121.75.255 br +138.121.76.0 - 138.121.91.255 ar +138.121.92.0 - 138.121.95.255 br +138.121.96.0 - 138.121.99.255 cl +138.121.100.0 - 138.121.107.255 ar +138.121.108.0 - 138.121.111.255 cl +138.121.112.0 - 138.121.115.255 ar +138.121.116.0 - 138.121.123.255 br +138.121.124.0 - 138.121.127.255 ar +138.121.128.0 - 138.121.139.255 br +138.121.140.0 - 138.121.143.255 cr +138.121.144.0 - 138.121.155.255 br +138.121.156.0 - 138.121.159.255 co +138.121.160.0 - 138.121.163.255 ar +138.121.164.0 - 138.121.167.255 br +138.121.168.0 - 138.121.171.255 cl +138.121.172.0 - 138.121.175.255 br +138.121.176.0 - 138.121.179.255 cl +138.121.180.0 - 138.121.199.255 br +138.121.200.0 - 138.121.203.255 co +138.121.204.0 - 138.121.227.255 br +138.121.228.0 - 138.121.231.255 ar +138.121.232.0 - 138.121.239.255 br +138.121.240.0 - 138.121.243.255 ar +138.121.244.0 - 138.122.3.255 br +138.122.4.0 - 138.122.7.255 ve +138.122.8.0 - 138.122.23.255 br +138.122.24.0 - 138.122.27.255 cr +138.122.28.0 - 138.122.95.255 br +138.122.96.0 - 138.122.99.255 mx +138.122.100.0 - 138.122.107.255 br +138.122.108.0 - 138.122.111.255 ec +138.122.112.0 - 138.122.127.255 br +138.122.128.0 - 138.122.131.255 ar +138.122.132.0 - 138.122.143.255 br +138.122.144.0 - 138.122.147.255 mx +138.122.148.0 - 138.122.155.255 br +138.122.156.0 - 138.122.159.255 ar +138.122.160.0 - 138.122.163.255 py +138.122.164.0 - 138.122.183.255 br +138.122.184.0 - 138.122.187.255 py +138.122.188.0 - 138.122.191.255 ar +138.122.192.0 - 138.122.195.255 hn +138.122.196.0 - 138.122.199.255 br +138.122.200.0 - 138.122.203.255 co +138.122.204.0 - 138.122.223.255 br +138.122.224.0 - 138.122.227.255 cl +138.122.228.0 - 138.122.231.255 ar +138.122.232.0 - 138.122.243.255 br +138.122.244.0 - 138.122.247.255 cr +138.122.248.0 - 138.122.251.255 br +138.122.252.0 - 138.122.255.255 mx 138.123.0.0 - 138.123.255.255 us 138.124.0.0 - 138.124.255.255 no -138.125.0.0 - 138.129.255.255 us +138.125.0.0 - 138.128.179.255 us +138.128.180.0 - 138.128.180.255 in +138.128.181.0 - 138.128.215.255 us +138.128.216.0 - 138.128.219.255 nl +138.128.220.0 - 138.129.255.255 us 138.130.0.0 - 138.130.255.255 au 138.131.0.0 - 138.131.255.255 ch 138.132.0.0 - 138.132.255.255 it 138.133.0.0 - 138.133.255.255 us 138.134.0.0 - 138.134.255.255 il 138.135.0.0 - 138.184.255.255 us +138.185.0.0 - 138.185.3.255 mx +138.185.4.0 - 138.185.11.255 br +138.185.12.0 - 138.185.15.255 cl +138.185.16.0 - 138.185.27.255 br +138.185.28.0 - 138.185.31.255 ni +138.185.32.0 - 138.185.63.255 br +138.185.64.0 - 138.185.71.255 ve +138.185.72.0 - 138.185.75.255 br +138.185.76.0 - 138.185.79.255 bz +138.185.80.0 - 138.185.83.255 ar +138.185.84.0 - 138.185.103.255 br +138.185.104.0 - 138.185.107.255 ni +138.185.108.0 - 138.185.111.255 br +138.185.112.0 - 138.185.115.255 ar +138.185.116.0 - 138.185.119.255 pe +138.185.120.0 - 138.185.135.255 br +138.185.136.0 - 138.185.139.255 ec +138.185.140.0 - 138.185.143.255 ar +138.185.144.0 - 138.185.203.255 br +138.185.204.0 - 138.185.207.255 ar +138.185.208.0 - 138.185.211.255 bq +138.185.212.0 - 138.185.223.255 br +138.185.224.0 - 138.185.227.255 mx +138.185.228.0 - 138.185.247.255 br +138.185.248.0 - 138.185.251.255 cr +138.185.252.0 - 138.186.3.255 br +138.186.4.0 - 138.186.7.255 ve +138.186.8.0 - 138.186.11.255 cl +138.186.12.0 - 138.186.15.255 pa +138.186.16.0 - 138.186.19.255 br +138.186.20.0 - 138.186.23.255 co +138.186.24.0 - 138.186.27.255 br +138.186.28.0 - 138.186.31.255 mx +138.186.32.0 - 138.186.59.255 br +138.186.60.0 - 138.186.63.255 py +138.186.64.0 - 138.186.67.255 mx +138.186.68.0 - 138.186.87.255 br +138.186.88.0 - 138.186.91.255 pa +138.186.92.0 - 138.186.99.255 br +138.186.100.0 - 138.186.103.255 mx +138.186.104.0 - 138.186.119.255 br +138.186.120.0 - 138.186.123.255 cl +138.186.124.0 - 138.186.135.255 br +138.186.136.0 - 138.186.139.255 hn +138.186.140.0 - 138.186.143.255 ar +138.186.144.0 - 138.186.147.255 br +138.186.148.0 - 138.186.155.255 ar +138.186.156.0 - 138.186.159.255 br +138.186.160.0 - 138.186.163.255 ar +138.186.164.0 - 138.186.175.255 br +138.186.176.0 - 138.186.179.255 ve +138.186.180.0 - 138.186.187.255 br +138.186.188.0 - 138.186.191.255 co +138.186.192.0 - 138.186.199.255 br +138.186.200.0 - 138.186.203.255 mx +138.186.204.0 - 138.186.207.255 br +138.186.208.0 - 138.186.211.255 hn +138.186.212.0 - 138.186.219.255 ar +138.186.220.0 - 138.186.243.255 br +138.186.244.0 - 138.186.247.255 ar +138.186.248.0 - 138.186.251.255 sv +138.186.252.0 - 138.186.255.255 ar 138.187.0.0 - 138.191.255.255 ch 138.192.0.0 - 138.193.255.255 us 138.194.0.0 - 138.194.255.255 au @@ -68664,22 +50917,76 @@ 138.198.0.0 - 138.198.255.255 gb 138.199.0.0 - 138.199.63.255 eu 138.199.64.0 - 138.199.79.255 nl -138.199.80.0 - 138.199.175.255 eu -138.199.176.0 - 138.199.176.255 de -138.199.177.0 - 138.199.254.255 eu -138.199.255.0 - 138.201.255.255 de +138.199.80.0 - 138.199.255.255 eu +138.200.0.0 - 138.201.255.255 de 138.202.0.0 - 138.202.255.255 us 138.203.0.0 - 138.203.255.255 be +138.204.0.0 - 138.204.7.255 ar +138.204.8.0 - 138.204.11.255 br +138.204.12.0 - 138.204.15.255 bz +138.204.16.0 - 138.204.39.255 br +138.204.40.0 - 138.204.43.255 ar +138.204.44.0 - 138.204.107.255 br +138.204.108.0 - 138.204.111.255 pa +138.204.112.0 - 138.204.151.255 br +138.204.152.0 - 138.204.163.255 ar +138.204.164.0 - 138.204.167.255 br +138.204.168.0 - 138.204.171.255 mx +138.204.172.0 - 138.204.179.255 br +138.204.180.0 - 138.204.183.255 hn +138.204.184.0 - 138.204.203.255 br +138.204.204.0 - 138.204.207.255 mx +138.204.208.0 - 138.204.215.255 br +138.204.216.0 - 138.204.219.255 ar +138.204.220.0 - 138.204.227.255 br +138.204.228.0 - 138.204.231.255 cl +138.204.232.0 - 138.204.235.255 br +138.204.236.0 - 138.204.239.255 ve +138.204.240.0 - 138.204.243.255 br +138.204.244.0 - 138.204.255.255 ar 138.205.0.0 - 138.205.255.255 be -138.206.0.0 - 138.206.255.255 ch +138.206.0.0 - 138.206.160.255 ch +138.206.161.0 - 138.206.161.255 au +138.206.162.0 - 138.206.255.255 ch 138.207.0.0 - 138.210.255.255 us 138.211.0.0 - 138.211.255.255 nz -138.212.0.0 - 138.213.255.255 jp +138.212.0.0 - 138.212.255.255 jp 138.214.0.0 - 138.214.255.255 ca 138.215.0.0 - 138.215.255.255 se 138.216.0.0 - 138.216.255.255 fi 138.217.0.0 - 138.217.255.255 au 138.218.0.0 - 138.218.255.255 ca +138.219.0.0 - 138.219.7.255 ar +138.219.8.0 - 138.219.11.255 py +138.219.12.0 - 138.219.15.255 sv +138.219.16.0 - 138.219.19.255 ar +138.219.20.0 - 138.219.35.255 br +138.219.36.0 - 138.219.39.255 mx +138.219.40.0 - 138.219.43.255 ar +138.219.44.0 - 138.219.55.255 br +138.219.56.0 - 138.219.59.255 cl +138.219.60.0 - 138.219.63.255 ar +138.219.64.0 - 138.219.71.255 br +138.219.72.0 - 138.219.75.255 hn +138.219.76.0 - 138.219.79.255 br +138.219.80.0 - 138.219.83.255 ar +138.219.84.0 - 138.219.119.255 br +138.219.120.0 - 138.219.123.255 hn +138.219.124.0 - 138.219.139.255 br +138.219.140.0 - 138.219.143.255 cw +138.219.144.0 - 138.219.155.255 br +138.219.156.0 - 138.219.159.255 sv +138.219.160.0 - 138.219.163.255 ar +138.219.164.0 - 138.219.171.255 br +138.219.172.0 - 138.219.175.255 hn +138.219.176.0 - 138.219.211.255 br +138.219.212.0 - 138.219.219.255 ar +138.219.220.0 - 138.219.227.255 br +138.219.228.0 - 138.219.231.255 cl +138.219.232.0 - 138.219.235.255 ar +138.219.236.0 - 138.219.247.255 br +138.219.248.0 - 138.219.251.255 ar +138.219.252.0 - 138.219.255.255 br 138.220.0.0 - 138.220.255.255 us 138.221.0.0 - 138.221.255.255 ch 138.222.0.0 - 138.222.255.255 de @@ -68690,26 +50997,52 @@ 138.227.0.0 - 138.227.255.255 se 138.228.0.0 - 138.228.255.255 ch 138.229.0.0 - 138.229.15.255 us -138.230.0.0 - 138.230.255.255 us +138.229.16.0 - 138.229.31.255 ca +138.229.32.0 - 138.230.255.255 us 138.231.0.0 - 138.231.255.255 fr 138.232.0.0 - 138.232.255.255 at 138.233.0.0 - 138.233.255.255 se 138.234.0.0 - 138.234.255.255 us 138.235.0.0 - 138.235.255.255 nz -138.236.0.0 - 138.240.255.255 us -138.241.0.0 - 138.241.255.255 gb -138.242.0.0 - 138.242.255.255 us +138.236.0.0 - 138.239.145.255 us +138.239.146.0 - 138.239.146.255 gb +138.239.147.0 - 138.239.147.255 us +138.239.148.0 - 138.239.149.255 nz +138.239.150.0 - 138.239.191.255 us +138.239.192.0 - 138.239.192.255 in +138.239.193.0 - 138.242.255.255 us 138.243.0.0 - 138.243.255.255 jp 138.244.0.0 - 138.246.255.255 de 138.247.0.0 - 138.247.255.255 us 138.248.0.0 - 138.248.255.255 gb 138.249.0.0 - 138.249.255.255 fi 138.250.0.0 - 138.251.255.255 gb -138.252.0.0 - 138.252.255.255 au 138.253.0.0 - 138.253.255.255 gb 138.254.0.0 - 138.254.255.255 us +138.255.0.0 - 138.255.51.255 br +138.255.52.0 - 138.255.54.255 pa +138.255.55.0 - 138.255.55.255 us +138.255.56.0 - 138.255.59.255 br +138.255.60.0 - 138.255.63.255 mx +138.255.64.0 - 138.255.79.255 br +138.255.80.0 - 138.255.83.255 ar +138.255.84.0 - 138.255.87.255 br +138.255.88.0 - 138.255.91.255 ar +138.255.92.0 - 138.255.95.255 br +138.255.96.0 - 138.255.103.255 cl +138.255.104.0 - 138.255.115.255 br +138.255.116.0 - 138.255.119.255 mx +138.255.120.0 - 138.255.151.255 br +138.255.152.0 - 138.255.155.255 sv +138.255.156.0 - 138.255.167.255 br +138.255.168.0 - 138.255.171.255 ar +138.255.172.0 - 138.255.247.255 br +138.255.248.0 - 138.255.251.255 do +138.255.252.0 - 138.255.255.255 aw 139.0.0.0 - 139.0.255.255 id -139.1.0.0 - 139.8.255.255 de +139.1.0.0 - 139.4.255.255 de +139.5.0.0 - 139.5.31.255 in +139.6.0.0 - 139.8.255.255 de 139.9.0.0 - 139.9.255.255 cn 139.10.0.0 - 139.10.255.255 nl 139.11.0.0 - 139.27.255.255 de @@ -68726,11 +51059,13 @@ 139.55.0.0 - 139.56.255.255 us 139.57.0.0 - 139.57.255.255 ca 139.58.0.0 - 139.58.255.255 se -139.59.0.0 - 139.59.255.255 au +139.59.0.0 - 139.59.255.255 sg 139.60.0.0 - 139.62.255.255 us 139.63.0.0 - 139.63.255.255 nl 139.65.0.0 - 139.65.255.255 us -139.66.0.0 - 139.66.255.255 fi +139.66.0.0 - 139.66.207.255 fi +139.66.208.0 - 139.66.211.255 sg +139.66.212.0 - 139.66.255.255 fi 139.67.0.0 - 139.73.255.255 us 139.74.0.0 - 139.74.255.255 fi 139.75.0.0 - 139.75.255.255 de @@ -68746,21 +51081,27 @@ 139.89.0.0 - 139.89.255.255 de 139.90.0.0 - 139.90.255.255 be 139.91.0.0 - 139.91.255.255 gr -139.92.0.0 - 139.92.50.255 eu -139.92.51.0 - 139.92.51.255 il -139.92.52.0 - 139.92.87.255 eu -139.92.88.0 - 139.92.89.255 il -139.92.90.0 - 139.92.90.255 eu -139.92.91.0 - 139.92.92.255 il -139.92.93.0 - 139.92.97.255 eu -139.92.98.0 - 139.92.98.255 il -139.92.99.0 - 139.92.181.255 eu -139.92.182.0 - 139.92.185.255 il -139.92.186.0 - 139.92.205.255 eu +139.92.0.0 - 139.92.83.255 eu +139.92.84.0 - 139.92.84.255 tr +139.92.85.0 - 139.92.95.255 eu +139.92.96.0 - 139.92.97.255 de +139.92.98.0 - 139.92.116.255 eu +139.92.117.0 - 139.92.117.255 se +139.92.118.0 - 139.92.199.255 eu +139.92.200.0 - 139.92.200.255 fr +139.92.201.0 - 139.92.205.255 eu 139.92.206.0 - 139.92.208.255 il -139.92.209.0 - 139.92.250.255 eu -139.92.251.0 - 139.92.254.255 il -139.92.255.0 - 139.92.255.255 eu +139.92.209.0 - 139.92.226.255 eu +139.92.227.0 - 139.92.227.255 de +139.92.228.0 - 139.92.236.255 eu +139.92.237.0 - 139.92.237.255 at +139.92.238.0 - 139.92.238.255 eu +139.92.239.0 - 139.92.239.255 it +139.92.240.0 - 139.92.243.255 eu +139.92.244.0 - 139.92.244.255 gb +139.92.245.0 - 139.92.245.255 fr +139.92.246.0 - 139.92.246.255 gb +139.92.247.0 - 139.92.255.255 eu 139.93.0.0 - 139.95.255.255 us 139.96.0.0 - 139.96.255.255 se 139.97.0.0 - 139.97.255.255 fi @@ -68773,7 +51114,7 @@ 139.104.0.0 - 139.104.255.255 us 139.105.0.0 - 139.120.255.255 no 139.121.0.0 - 139.121.255.255 us -139.122.0.0 - 139.122.255.255 nl +139.122.0.0 - 139.122.255.255 se 139.123.0.0 - 139.123.255.255 fi 139.124.0.0 - 139.124.255.255 fr 139.125.0.0 - 139.127.255.255 us @@ -68804,13 +51145,26 @@ 139.158.0.0 - 139.158.255.255 fr 139.159.0.0 - 139.159.255.255 cn 139.160.0.0 - 139.160.255.255 fr -139.161.0.0 - 139.161.255.255 us -139.162.0.0 - 139.162.255.255 nl +139.161.0.0 - 139.162.0.0 us +139.162.0.1 - 139.162.31.255 sg +139.162.32.0 - 139.162.127.255 us +139.162.128.0 - 139.162.159.255 de +139.162.160.0 - 139.162.196.215 us +139.162.196.216 - 139.162.196.216 gb +139.162.196.217 - 139.162.201.96 us +139.162.201.97 - 139.162.201.97 gb +139.162.201.98 - 139.162.215.16 us +139.162.215.17 - 139.162.215.17 gb +139.162.215.18 - 139.162.215.224 us +139.162.215.225 - 139.162.215.225 gb +139.162.215.226 - 139.162.220.18 us +139.162.220.19 - 139.162.220.19 gb +139.162.220.20 - 139.162.255.255 us 139.163.0.0 - 139.163.255.255 au 139.164.0.0 - 139.164.255.255 no 139.165.0.0 - 139.165.255.255 be 139.166.0.0 - 139.166.255.255 gb -139.167.0.0 - 139.167.255.255 us +139.167.0.0 - 139.167.255.255 sg 139.168.0.0 - 139.168.255.255 au 139.169.0.0 - 139.169.255.255 us 139.170.0.0 - 139.170.255.255 cn @@ -68838,8 +51192,10 @@ 139.191.0.0 - 139.191.255.255 eu 139.192.0.0 - 139.195.255.255 id 139.196.0.0 - 139.215.255.255 cn -139.216.0.0 - 139.219.255.255 au -139.220.0.0 - 139.221.255.255 cn +139.216.0.0 - 139.216.255.255 au +139.217.0.0 - 139.217.255.255 cn +139.218.0.0 - 139.218.255.255 au +139.219.0.0 - 139.221.255.255 cn 139.222.0.0 - 139.222.255.255 gb 139.223.0.0 - 139.223.255.255 tw 139.224.0.0 - 139.224.255.255 cn @@ -68857,22 +51213,20 @@ 140.78.0.0 - 140.78.255.255 at 140.79.0.0 - 140.79.255.255 au 140.80.0.0 - 140.80.255.255 ca -140.81.0.0 - 140.81.255.255 jp 140.82.0.0 - 140.82.255.255 us 140.83.0.0 - 140.83.255.255 au -140.84.0.0 - 140.84.255.255 de +140.84.0.0 - 140.84.255.255 us 140.85.0.0 - 140.85.255.255 nl 140.86.0.0 - 140.86.255.255 se -140.87.0.0 - 140.87.255.255 ca -140.88.0.0 - 140.91.255.255 us +140.87.0.0 - 140.91.255.255 us 140.92.0.0 - 140.92.255.255 tw 140.93.0.0 - 140.94.255.255 fr 140.95.0.0 - 140.95.255.255 us 140.96.0.0 - 140.96.255.255 tw 140.97.0.0 - 140.97.255.255 gb -140.98.0.0 - 140.99.28.111 us -140.99.28.112 - 140.99.28.119 dk -140.99.28.120 - 140.104.255.255 us +140.98.0.0 - 140.101.147.255 us +140.101.148.0 - 140.101.148.255 au +140.101.149.0 - 140.104.255.255 us 140.105.0.0 - 140.105.255.255 it 140.106.0.0 - 140.108.255.255 us 140.109.0.0 - 140.138.255.255 tw @@ -68924,8 +51278,17 @@ 140.242.7.0 - 140.242.22.255 us 140.242.23.0 - 140.242.23.255 ca 140.242.24.0 - 140.242.26.255 us -140.242.27.0 - 140.242.27.255 gb -140.242.28.0 - 140.242.255.255 us +140.242.27.0 - 140.242.27.3 eu +140.242.27.4 - 140.242.27.255 gb +140.242.28.0 - 140.242.45.255 us +140.242.46.0 - 140.242.46.255 eu +140.242.47.0 - 140.242.213.255 us +140.242.214.0 - 140.242.214.255 ap +140.242.215.0 - 140.242.216.255 us +140.242.217.0 - 140.242.217.255 il +140.242.218.0 - 140.242.225.255 us +140.242.226.0 - 140.242.226.255 de +140.242.227.0 - 140.242.255.255 us 140.243.0.0 - 140.243.255.255 cn 140.244.0.0 - 140.245.255.255 us 140.246.0.0 - 140.246.255.255 cn @@ -68936,7 +51299,10 @@ 140.254.0.0 - 140.254.255.255 us 140.255.0.0 - 140.255.255.255 cn 141.0.0.0 - 141.0.7.255 jo -141.0.8.0 - 141.0.15.255 us +141.0.8.0 - 141.0.11.255 us +141.0.12.0 - 141.0.13.255 no +141.0.14.0 - 141.0.14.255 eu +141.0.15.0 - 141.0.15.255 no 141.0.16.0 - 141.0.23.255 de 141.0.24.0 - 141.0.31.255 nl 141.0.32.0 - 141.0.63.255 gb @@ -68949,9 +51315,16 @@ 141.0.200.0 - 141.0.207.255 fr 141.0.208.0 - 141.0.223.255 gb 141.0.224.0 - 141.0.255.255 no -141.1.0.0 - 141.7.255.255 de +141.1.0.0 - 141.6.10.255 de +141.6.11.0 - 141.6.11.31 eu +141.6.11.32 - 141.6.203.255 de +141.6.204.0 - 141.6.204.255 gb +141.6.205.0 - 141.7.255.255 de 141.8.0.0 - 141.8.127.255 mt -141.8.128.0 - 141.8.146.255 ru +141.8.128.0 - 141.8.142.255 ru +141.8.143.0 - 141.8.143.127 tr +141.8.143.128 - 141.8.143.255 us +141.8.144.0 - 141.8.146.255 ru 141.8.147.0 - 141.8.147.31 de 141.8.147.32 - 141.8.147.47 pl 141.8.147.48 - 141.8.147.63 sk @@ -68964,7 +51337,12 @@ 141.8.147.136 - 141.8.147.143 ee 141.8.147.144 - 141.8.147.151 bg 141.8.147.152 - 141.8.147.159 rs -141.8.147.160 - 141.8.199.255 ru +141.8.147.160 - 141.8.147.167 ua +141.8.147.168 - 141.8.147.175 by +141.8.147.176 - 141.8.147.183 kz +141.8.147.184 - 141.8.189.95 ru +141.8.189.96 - 141.8.189.127 de +141.8.189.128 - 141.8.199.255 ru 141.8.200.0 - 141.8.207.255 al 141.8.208.0 - 141.8.215.255 ge 141.8.216.0 - 141.8.223.255 gb @@ -68981,76 +51359,94 @@ 141.87.0.0 - 141.91.255.255 de 141.92.0.0 - 141.92.255.255 gb 141.93.0.0 - 141.93.255.255 nl -141.94.0.0 - 141.95.255.255 gb +141.94.0.0 - 141.95.1.255 gb +141.95.2.0 - 141.95.2.255 us +141.95.3.0 - 141.95.3.0 ch +141.95.3.1 - 141.95.255.255 gb 141.96.0.0 - 141.96.255.255 be 141.97.0.0 - 141.97.255.255 gb -141.98.0.0 - 141.98.255.255 ch 141.99.0.0 - 141.100.255.255 de 141.101.0.0 - 141.101.31.255 ua 141.101.32.0 - 141.101.47.255 de -141.101.48.0 - 141.101.55.255 fr -141.101.56.0 - 141.101.63.255 kw -141.101.64.0 - 141.101.127.255 eu -141.101.128.0 - 141.101.225.255 ru -141.101.226.0 - 141.101.233.255 ua -141.101.234.0 - 141.101.255.255 ru +141.101.48.0 - 141.101.60.255 fr +141.101.61.0 - 141.101.63.255 ch +141.101.64.0 - 141.101.65.255 nl +141.101.66.0 - 141.101.67.255 fr +141.101.68.0 - 141.101.68.255 in +141.101.69.0 - 141.101.69.255 de +141.101.70.0 - 141.101.71.255 gb +141.101.72.0 - 141.101.74.255 us +141.101.75.0 - 141.101.75.255 nl +141.101.76.0 - 141.101.76.255 jp +141.101.77.0 - 141.101.77.255 sg +141.101.78.0 - 141.101.81.255 se +141.101.82.0 - 141.101.85.255 kr +141.101.86.0 - 141.101.89.255 pl +141.101.90.0 - 141.101.93.255 at +141.101.94.0 - 141.101.97.255 cz +141.101.98.0 - 141.101.99.255 gb +141.101.100.0 - 141.101.103.255 cl +141.101.104.0 - 141.101.105.255 nl +141.101.106.0 - 141.101.107.255 gb +141.101.108.0 - 141.101.111.255 co +141.101.112.0 - 141.101.125.137 eu +141.101.125.138 - 141.101.125.138 us +141.101.125.139 - 141.101.127.255 eu +141.101.128.0 - 141.101.131.255 sk +141.101.132.0 - 141.101.132.127 nl +141.101.132.128 - 141.101.132.255 lu +141.101.133.0 - 141.101.133.255 nl +141.101.134.0 - 141.101.134.255 ch +141.101.135.0 - 141.101.135.255 pk +141.101.136.0 - 141.101.255.255 ru 141.102.0.0 - 141.102.255.255 us 141.103.0.0 - 141.103.255.255 id 141.104.0.0 - 141.104.255.255 us 141.105.0.0 - 141.105.15.255 nl -141.105.16.0 - 141.105.21.255 pl -141.105.22.0 - 141.105.22.255 us -141.105.23.0 - 141.105.23.255 gb +141.105.16.0 - 141.105.23.255 pl 141.105.24.0 - 141.105.55.255 ru 141.105.56.0 - 141.105.63.255 jo -141.105.64.0 - 141.105.64.65 ru -141.105.64.66 - 141.105.64.126 nl -141.105.64.127 - 141.105.64.127 ru -141.105.64.128 - 141.105.64.255 in -141.105.65.0 - 141.105.66.191 ru -141.105.66.192 - 141.105.66.255 nl -141.105.67.0 - 141.105.71.255 ru +141.105.64.0 - 141.105.71.255 ru 141.105.72.0 - 141.105.79.255 fr 141.105.80.0 - 141.105.95.255 lb 141.105.96.0 - 141.105.111.255 es 141.105.112.0 - 141.105.119.255 ie 141.105.120.0 - 141.105.127.255 nl -141.105.128.0 - 141.105.143.255 ua +141.105.128.0 - 141.105.135.255 bg +141.105.136.0 - 141.105.143.255 ua 141.105.144.0 - 141.105.151.255 nl 141.105.152.0 - 141.105.159.255 it -141.105.160.0 - 141.105.167.255 ae -141.105.168.0 - 141.105.168.0 si -141.105.168.1 - 141.105.168.254 ba -141.105.168.255 - 141.105.169.0 si -141.105.169.1 - 141.105.169.254 ba -141.105.169.255 - 141.105.170.0 si -141.105.170.1 - 141.105.170.254 ba -141.105.170.255 - 141.105.171.0 si -141.105.171.1 - 141.105.171.254 ba -141.105.171.255 - 141.105.172.0 si -141.105.172.1 - 141.105.172.254 ba -141.105.172.255 - 141.105.173.0 si -141.105.173.1 - 141.105.173.254 ba -141.105.173.255 - 141.105.174.0 si -141.105.174.1 - 141.105.174.254 ba -141.105.174.255 - 141.105.175.0 si -141.105.175.1 - 141.105.175.254 ba -141.105.175.255 - 141.105.175.255 si +141.105.160.0 - 141.105.162.127 a2 +141.105.162.128 - 141.105.162.128 es +141.105.162.129 - 141.105.167.255 a2 +141.105.168.0 - 141.105.175.255 ba 141.105.176.0 - 141.105.255.255 gb 141.106.0.0 - 141.107.255.255 us 141.108.0.0 - 141.108.255.255 it 141.109.0.0 - 141.109.255.255 ca 141.110.0.0 - 141.112.255.255 us -141.113.0.0 - 141.113.255.255 de +141.113.0.0 - 141.113.127.255 de +141.113.128.0 - 141.113.128.255 sg +141.113.129.0 - 141.113.149.255 de +141.113.150.0 - 141.113.150.255 us +141.113.151.0 - 141.113.167.255 de +141.113.168.0 - 141.113.175.255 us +141.113.176.0 - 141.113.255.255 de 141.114.0.0 - 141.114.255.255 us 141.115.0.0 - 141.115.255.255 fr 141.116.0.0 - 141.116.255.255 us 141.117.0.0 - 141.119.255.255 ca 141.120.0.0 - 141.120.255.255 au 141.121.0.0 - 141.121.255.255 us -141.122.0.0 - 141.122.255.255 ch +141.122.0.0 - 141.122.171.255 ch +141.122.172.0 - 141.122.172.222 au +141.122.172.223 - 141.122.172.223 ch +141.122.172.224 - 141.122.172.255 au +141.122.173.0 - 141.122.255.255 ch 141.123.0.0 - 141.126.255.255 us -141.127.0.0 - 141.127.255.255 fi +141.127.0.0 - 141.127.2.1 fi +141.127.2.2 - 141.127.2.2 eu +141.127.2.3 - 141.127.255.255 fi 141.128.0.0 - 141.129.255.255 us 141.130.0.0 - 141.130.255.255 de 141.131.0.0 - 141.131.255.255 us @@ -69064,8 +51460,11 @@ 141.136.48.0 - 141.136.55.255 sk 141.136.56.0 - 141.136.63.255 es 141.136.64.0 - 141.136.95.255 am -141.136.96.0 - 141.136.96.255 de -141.136.97.0 - 141.136.111.255 fr +141.136.96.0 - 141.136.99.21 fr +141.136.99.22 - 141.136.99.22 be +141.136.99.23 - 141.136.109.5 fr +141.136.109.6 - 141.136.109.6 pl +141.136.109.7 - 141.136.111.255 fr 141.136.112.0 - 141.136.119.255 ru 141.136.120.0 - 141.136.127.255 nl 141.136.128.0 - 141.136.255.255 hr @@ -69082,19 +51481,7 @@ 141.138.168.0 - 141.138.175.255 nl 141.138.176.0 - 141.138.191.255 lb 141.138.192.0 - 141.138.207.255 nl -141.138.208.0 - 141.138.209.63 gb -141.138.209.64 - 141.138.209.191 fi -141.138.209.192 - 141.138.210.63 gb -141.138.210.64 - 141.138.210.191 no -141.138.210.192 - 141.138.211.63 gb -141.138.211.64 - 141.138.211.191 dk -141.138.211.192 - 141.138.212.63 gb -141.138.212.64 - 141.138.212.191 nl -141.138.212.192 - 141.138.213.63 gb -141.138.213.64 - 141.138.213.191 pl -141.138.213.192 - 141.138.214.63 gb -141.138.214.64 - 141.138.214.95 nl -141.138.214.96 - 141.138.215.255 gb +141.138.208.0 - 141.138.215.255 gb 141.138.216.0 - 141.138.223.255 nl 141.138.224.0 - 141.138.255.255 gb 141.139.0.0 - 141.142.255.255 us @@ -69111,8 +51498,8 @@ 141.170.0.0 - 141.170.127.255 gb 141.170.128.0 - 141.170.191.255 cz 141.170.192.0 - 141.170.207.255 ba -141.170.208.0 - 141.170.215.255 es -141.170.216.0 - 141.170.223.255 fr +141.170.208.0 - 141.170.211.255 dz +141.170.212.0 - 141.170.223.255 fr 141.170.224.0 - 141.170.255.255 ua 141.171.0.0 - 141.171.255.255 ch 141.172.0.0 - 141.172.255.255 fi @@ -69125,26 +51512,51 @@ 141.181.0.0 - 141.181.255.255 fr 141.182.0.0 - 141.186.255.255 us 141.187.0.0 - 141.187.255.255 gb -141.188.0.0 - 141.191.255.255 us -141.192.0.0 - 141.192.255.255 fi +141.188.0.0 - 141.189.141.255 us +141.189.142.0 - 141.189.142.255 au +141.189.143.0 - 141.189.191.255 us +141.189.192.0 - 141.189.193.255 hk +141.189.194.0 - 141.189.203.255 us +141.189.204.0 - 141.189.204.255 nl +141.189.205.0 - 141.189.205.255 eu +141.189.206.0 - 141.189.207.255 fr +141.189.208.0 - 141.191.255.255 us +141.192.0.0 - 141.192.127.255 fi +141.192.128.0 - 141.192.129.255 no +141.192.130.0 - 141.192.156.255 fi +141.192.157.0 - 141.192.158.255 no +141.192.159.0 - 141.192.255.255 fi 141.193.0.0 - 141.193.255.255 us -141.194.0.0 - 141.194.255.255 fr +141.194.0.0 - 141.194.6.255 fr +141.194.7.0 - 141.194.7.255 eu +141.194.8.0 - 141.194.255.255 fr 141.195.0.0 - 141.195.255.255 us 141.196.0.0 - 141.196.255.255 tr -141.197.0.0 - 141.199.255.255 us +141.197.0.0 - 141.197.9.255 us +141.197.10.0 - 141.197.10.255 gb +141.197.11.0 - 141.197.13.255 us +141.197.14.0 - 141.197.14.255 eu +141.197.15.0 - 141.199.255.255 us 141.200.0.0 - 141.200.255.255 de 141.201.0.0 - 141.201.255.255 at 141.202.0.0 - 141.202.255.255 us 141.203.0.0 - 141.203.255.255 at -141.204.0.0 - 141.207.255.255 us +141.204.0.0 - 141.206.169.255 us +141.206.170.0 - 141.206.170.255 in +141.206.171.0 - 141.207.255.255 us 141.208.0.0 - 141.208.255.255 fi 141.209.0.0 - 141.222.255.255 us 141.223.0.0 - 141.223.255.255 kr 141.224.0.0 - 141.225.255.255 us 141.226.0.0 - 141.226.255.255 il -141.227.0.0 - 141.227.255.255 fr -141.228.0.0 - 141.228.255.255 gb -141.229.0.0 - 141.229.255.255 jp +141.227.0.0 - 141.227.2.255 fr +141.227.3.0 - 141.227.3.255 us +141.227.4.0 - 141.227.4.255 fr +141.227.5.0 - 141.227.5.255 ap +141.227.6.0 - 141.227.255.255 fr +141.228.0.0 - 141.228.249.255 gb +141.228.250.0 - 141.228.250.255 ap +141.228.251.0 - 141.228.255.255 gb 141.230.0.0 - 141.230.255.255 us 141.231.0.0 - 141.231.255.255 gb 141.232.0.0 - 141.236.255.255 us @@ -69158,7 +51570,60 @@ 141.246.0.0 - 141.248.255.255 us 141.249.0.0 - 141.249.255.255 ch 141.250.0.0 - 141.250.255.255 it -141.251.0.0 - 141.251.255.255 us +141.251.0.0 - 141.251.116.255 us +141.251.117.0 - 141.251.117.63 ie +141.251.117.64 - 141.251.117.255 us +141.251.118.0 - 141.251.118.63 ie +141.251.118.64 - 141.251.118.255 us +141.251.119.0 - 141.251.119.63 ie +141.251.119.64 - 141.251.119.255 us +141.251.120.0 - 141.251.120.63 ie +141.251.120.64 - 141.251.120.255 us +141.251.121.0 - 141.251.121.63 ie +141.251.121.64 - 141.251.121.255 us +141.251.122.0 - 141.251.122.63 ie +141.251.122.64 - 141.251.122.255 us +141.251.123.0 - 141.251.123.63 ie +141.251.123.64 - 141.251.123.255 us +141.251.124.0 - 141.251.124.63 ie +141.251.124.64 - 141.251.124.255 us +141.251.125.0 - 141.251.125.63 ie +141.251.125.64 - 141.251.186.191 us +141.251.186.192 - 141.251.186.255 ie +141.251.187.0 - 141.251.187.191 us +141.251.187.192 - 141.251.187.255 ie +141.251.188.0 - 141.251.188.127 us +141.251.188.128 - 141.251.188.191 at +141.251.188.192 - 141.251.188.255 ie +141.251.189.0 - 141.251.189.191 us +141.251.189.192 - 141.251.189.255 ie +141.251.190.0 - 141.251.190.191 us +141.251.190.192 - 141.251.190.255 ie +141.251.191.0 - 141.251.191.191 us +141.251.191.192 - 141.251.191.255 ie +141.251.192.0 - 141.251.192.191 us +141.251.192.192 - 141.251.192.255 ie +141.251.193.0 - 141.251.193.191 us +141.251.193.192 - 141.251.193.255 ie +141.251.194.0 - 141.251.194.191 us +141.251.194.192 - 141.251.194.255 ie +141.251.195.0 - 141.251.195.191 us +141.251.195.192 - 141.251.195.255 ie +141.251.196.0 - 141.251.196.255 us +141.251.197.0 - 141.251.197.63 sg +141.251.197.64 - 141.251.197.127 hk +141.251.197.128 - 141.251.197.191 sg +141.251.197.192 - 141.251.197.255 hk +141.251.198.0 - 141.251.202.255 sg +141.251.203.0 - 141.251.220.255 us +141.251.221.0 - 141.251.221.255 sg +141.251.222.0 - 141.251.243.255 us +141.251.244.0 - 141.251.244.127 sg +141.251.244.128 - 141.251.244.191 us +141.251.244.192 - 141.251.244.255 hk +141.251.245.0 - 141.251.253.255 us +141.251.254.0 - 141.251.254.63 ie +141.251.254.64 - 141.251.255.255 us 141.252.0.0 - 141.252.255.255 nl 141.253.0.0 - 141.253.255.255 be 141.254.0.0 - 141.254.255.255 us @@ -69170,34 +51635,160 @@ 141.255.176.0 - 141.255.183.255 nl 141.255.184.0 - 141.255.191.255 se 141.255.192.0 - 141.255.255.255 si -142.0.0.0 - 142.46.200.127 ca -142.46.200.128 - 142.46.200.159 us -142.46.200.160 - 142.53.255.255 ca -142.54.0.0 - 142.54.255.255 us -142.55.0.0 - 142.56.127.255 ca -142.56.128.0 - 142.56.191.255 us -142.56.192.0 - 142.64.255.255 ca +142.0.0.0 - 142.0.15.255 us +142.0.16.0 - 142.0.31.255 ca +142.0.32.0 - 142.0.72.105 us +142.0.72.106 - 142.0.72.106 ae +142.0.72.107 - 142.0.143.255 us +142.0.144.0 - 142.0.159.255 ca +142.0.160.0 - 142.0.223.255 us +142.0.224.0 - 142.0.239.255 jm +142.0.240.0 - 142.0.255.255 us +142.1.0.0 - 142.3.255.255 ca +142.4.0.0 - 142.4.106.255 us +142.4.107.0 - 142.4.107.255 cn +142.4.108.0 - 142.4.117.255 us +142.4.118.0 - 142.4.119.255 cn +142.4.120.0 - 142.4.120.255 us +142.4.121.0 - 142.4.123.255 cn +142.4.124.0 - 142.4.124.255 ca +142.4.125.0 - 142.4.125.255 cn +142.4.126.0 - 142.4.193.255 us +142.4.194.0 - 142.4.195.255 ca +142.4.196.0 - 142.4.197.255 us +142.4.198.0 - 142.4.199.227 ca +142.4.199.228 - 142.4.199.231 us +142.4.199.232 - 142.4.199.255 ca +142.4.200.0 - 142.4.201.255 us +142.4.202.0 - 142.4.203.255 ca +142.4.204.0 - 142.4.204.110 us +142.4.204.111 - 142.4.204.111 io +142.4.204.112 - 142.4.205.46 us +142.4.205.47 - 142.4.205.47 io +142.4.205.48 - 142.4.207.255 us +142.4.208.0 - 142.4.223.255 ca +142.4.224.0 - 142.4.255.255 us +142.5.0.0 - 142.10.255.255 ca +142.11.0.0 - 142.11.255.255 us +142.12.0.0 - 142.53.255.255 ca +142.54.0.0 - 142.54.19.255 us +142.54.20.0 - 142.54.23.255 vg +142.54.24.0 - 142.54.47.255 us +142.54.48.0 - 142.54.63.255 ca +142.54.64.0 - 142.54.191.255 us +142.54.192.0 - 142.54.199.255 bm +142.54.200.0 - 142.54.203.255 us +142.54.204.0 - 142.54.207.255 tc +142.54.208.0 - 142.54.255.255 us +142.55.0.0 - 142.64.255.255 ca 142.65.0.0 - 142.65.255.255 us 142.66.0.0 - 142.70.140.255 ca 142.70.141.0 - 142.70.141.255 ch 142.70.142.0 - 142.70.143.255 ca -142.70.144.0 - 142.70.144.255 gb +142.70.144.0 - 142.70.144.255 ch 142.70.145.0 - 142.70.199.255 ca -142.70.200.0 - 142.70.200.255 gb +142.70.200.0 - 142.70.200.255 ch 142.70.201.0 - 142.70.201.255 ca -142.70.202.0 - 142.70.202.255 gb -142.70.203.0 - 142.76.255.255 ca +142.70.202.0 - 142.70.202.255 ch +142.70.203.0 - 142.75.250.255 ca +142.75.251.0 - 142.75.253.255 us +142.75.254.0 - 142.75.254.255 ca +142.75.255.0 - 142.75.255.255 us +142.76.0.0 - 142.76.255.255 ca 142.77.0.0 - 142.77.255.255 us 142.78.0.0 - 142.78.255.255 ca 142.79.0.0 - 142.79.255.255 us -142.80.0.0 - 142.128.255.255 ca +142.80.0.0 - 142.90.255.255 ca +142.91.0.0 - 142.91.65.255 us +142.91.66.0 - 142.91.66.255 lk +142.91.67.0 - 142.91.84.255 us +142.91.85.0 - 142.91.85.255 lk +142.91.86.0 - 142.91.255.255 us +142.92.0.0 - 142.104.255.255 ca +142.105.0.0 - 142.105.255.255 us +142.106.0.0 - 142.110.255.255 ca +142.111.0.0 - 142.111.255.255 us +142.112.0.0 - 142.128.255.255 ca +142.129.0.0 - 142.129.255.255 us 142.130.0.0 - 142.131.177.255 ca 142.131.178.0 - 142.131.255.255 us -142.132.0.0 - 142.191.255.255 ca +142.132.0.0 - 142.135.255.255 ca +142.136.0.0 - 142.136.255.255 us +142.137.0.0 - 142.146.255.255 ca +142.147.0.0 - 142.147.14.255 us +142.147.15.0 - 142.147.47.255 ca +142.147.48.0 - 142.147.49.255 us +142.147.50.0 - 142.147.50.255 ca +142.147.51.0 - 142.147.51.255 us +142.147.52.0 - 142.147.54.255 ca +142.147.55.0 - 142.147.60.255 us +142.147.61.0 - 142.147.61.255 ca +142.147.66.0 - 142.147.67.255 ca +142.147.68.0 - 142.147.73.255 us +142.147.74.0 - 142.147.74.255 ca +142.147.75.0 - 142.147.77.255 us +142.147.78.0 - 142.147.78.255 ca +142.147.79.0 - 142.147.79.255 us +142.147.80.0 - 142.147.80.255 ca +142.147.81.0 - 142.147.81.255 us +142.147.82.0 - 142.147.83.255 ca +142.147.84.0 - 142.147.90.255 us +142.147.91.0 - 142.147.91.255 nl +142.147.92.0 - 142.147.92.255 fr +142.147.93.0 - 142.147.93.255 de +142.147.94.0 - 142.147.94.255 gb +142.147.95.0 - 142.147.95.255 us +142.147.96.0 - 142.147.100.255 ca +142.147.101.0 - 142.147.101.255 us +142.147.102.0 - 142.147.103.255 vi +142.147.104.0 - 142.147.255.255 us +142.148.0.0 - 142.148.127.255 ca +142.148.128.0 - 142.148.255.255 us +142.149.0.0 - 142.191.255.255 ca 142.192.0.0 - 142.192.255.255 us 142.193.0.0 - 142.195.255.255 ca -142.198.0.0 - 142.255.255.255 ca -143.0.0.0 - 143.40.255.255 us +142.196.0.0 - 142.197.255.255 us +142.198.0.0 - 142.205.59.255 ca +142.205.60.0 - 142.205.60.255 us +142.205.61.0 - 142.205.161.255 ca +142.205.162.0 - 142.205.163.255 gb +142.205.164.0 - 142.233.255.255 ca +142.234.0.0 - 142.234.255.255 us +142.235.0.0 - 142.249.255.255 ca +142.250.0.0 - 142.252.255.255 us +142.253.0.0 - 142.253.255.255 ca +142.254.0.0 - 142.255.127.255 us +142.255.128.0 - 142.255.255.255 pr +143.0.0.0 - 143.0.23.255 br +143.0.24.0 - 143.0.27.255 do +143.0.28.0 - 143.0.31.255 br +143.0.32.0 - 143.0.35.255 bq +143.0.36.0 - 143.0.63.255 br +143.0.64.0 - 143.0.67.255 ar +143.0.68.0 - 143.0.75.255 br +143.0.76.0 - 143.0.83.255 ar +143.0.84.0 - 143.0.91.255 br +143.0.92.0 - 143.0.95.255 co +143.0.96.0 - 143.0.99.255 ve +143.0.100.0 - 143.0.100.255 ar +143.0.101.0 - 143.0.101.255 bo +143.0.102.0 - 143.0.103.255 co +143.0.104.0 - 143.0.107.255 sv +143.0.108.0 - 143.0.111.255 co +143.0.112.0 - 143.0.159.255 br +143.0.160.0 - 143.0.163.255 cr +143.0.164.0 - 143.0.167.255 br +143.0.168.0 - 143.0.171.255 ar +143.0.172.0 - 143.0.175.255 tt +143.0.176.0 - 143.0.235.255 br +143.0.236.0 - 143.0.239.255 hn +143.0.240.0 - 143.0.243.255 cl +143.0.244.0 - 143.0.247.255 ar +143.0.248.0 - 143.0.251.255 pe +143.0.252.0 - 143.0.255.255 br +143.1.0.0 - 143.28.231.255 us +143.28.232.0 - 143.28.232.255 eu +143.28.233.0 - 143.40.255.255 us 143.41.0.0 - 143.41.255.255 gb 143.42.0.0 - 143.46.255.255 us 143.47.0.0 - 143.47.255.255 ie @@ -69206,7 +51797,9 @@ 143.51.0.0 - 143.51.255.255 fi 143.52.0.0 - 143.53.255.255 gb 143.54.0.0 - 143.54.255.255 br -143.55.0.0 - 143.64.255.255 us +143.55.0.0 - 143.58.7.255 us +143.58.8.0 - 143.58.8.255 gb +143.58.9.0 - 143.64.255.255 us 143.65.0.0 - 143.65.255.255 gb 143.66.0.0 - 143.88.255.255 us 143.89.0.0 - 143.89.255.255 hk @@ -69237,7 +51830,30 @@ 143.130.0.0 - 143.130.255.255 at 143.131.0.0 - 143.135.255.255 us 143.136.0.0 - 143.136.255.255 jp -143.138.0.0 - 143.159.255.255 us +143.137.0.0 - 143.137.19.255 br +143.137.20.0 - 143.137.23.255 ar +143.137.24.0 - 143.137.27.255 ni +143.137.28.0 - 143.137.79.255 br +143.137.80.0 - 143.137.83.255 do +143.137.84.0 - 143.137.95.255 br +143.137.96.0 - 143.137.99.255 co +143.137.100.0 - 143.137.107.255 br +143.137.108.0 - 143.137.111.255 mx +143.137.112.0 - 143.137.115.255 bo +143.137.116.0 - 143.137.143.255 br +143.137.144.0 - 143.137.147.255 pe +143.137.148.0 - 143.137.151.255 cr +143.137.152.0 - 143.137.163.255 br +143.137.164.0 - 143.137.171.255 hn +143.137.172.0 - 143.137.191.255 br +143.137.192.0 - 143.137.195.255 tt +143.137.196.0 - 143.137.227.255 br +143.137.228.0 - 143.137.231.255 hn +143.137.232.0 - 143.137.243.255 br +143.137.244.0 - 143.137.247.255 ar +143.137.248.0 - 143.137.255.255 br +143.138.0.0 - 143.158.255.255 us +143.159.0.0 - 143.159.255.255 gb 143.160.0.0 - 143.160.255.255 za 143.161.0.0 - 143.161.255.255 at 143.162.0.0 - 143.162.255.255 us @@ -69247,7 +51863,6 @@ 143.168.0.0 - 143.168.255.255 us 143.169.0.0 - 143.169.255.255 be 143.170.0.0 - 143.170.255.255 us -143.171.0.0 - 143.171.255.255 jp 143.172.0.0 - 143.173.255.255 us 143.174.0.0 - 143.174.255.255 au 143.175.0.0 - 143.175.255.255 us @@ -69255,13 +51870,60 @@ 143.180.0.0 - 143.180.255.255 ch 143.181.0.0 - 143.187.255.255 us 143.188.0.0 - 143.189.255.255 au -143.190.0.0 - 143.195.255.255 us +143.190.0.0 - 143.192.95.255 us +143.192.96.0 - 143.192.111.255 my +143.192.112.0 - 143.192.127.255 sg +143.192.128.0 - 143.195.255.255 us 143.196.0.0 - 143.196.255.255 fr 143.197.0.0 - 143.200.255.255 us -143.201.0.0 - 143.201.255.255 jp +143.202.0.0 - 143.202.11.255 br +143.202.12.0 - 143.202.15.255 cl +143.202.16.0 - 143.202.27.255 ar +143.202.28.0 - 143.202.31.255 br +143.202.32.0 - 143.202.35.255 ar +143.202.36.0 - 143.202.75.255 br +143.202.76.0 - 143.202.79.255 mx +143.202.80.0 - 143.202.87.255 br +143.202.88.0 - 143.202.91.255 ar +143.202.92.0 - 143.202.95.255 br +143.202.96.0 - 143.202.99.255 ar +143.202.100.0 - 143.202.135.255 br +143.202.136.0 - 143.202.139.255 ar +143.202.140.0 - 143.202.143.255 cl +143.202.144.0 - 143.202.147.255 ar +143.202.148.0 - 143.202.151.255 br +143.202.152.0 - 143.202.155.255 pa +143.202.156.0 - 143.202.159.255 mx +143.202.160.0 - 143.202.163.255 cr +143.202.164.0 - 143.202.191.255 br +143.202.192.0 - 143.202.195.255 ar +143.202.196.0 - 143.202.199.255 hn +143.202.200.0 - 143.202.203.255 ar +143.202.204.0 - 143.202.207.255 mx +143.202.208.0 - 143.202.211.255 py +143.202.212.0 - 143.202.251.255 br +143.202.252.0 - 143.202.255.255 ni 143.203.0.0 - 143.204.255.255 us 143.205.0.0 - 143.205.255.255 at 143.206.0.0 - 143.207.255.255 us +143.208.0.0 - 143.208.15.255 br +143.208.16.0 - 143.208.19.255 hn +143.208.20.0 - 143.208.35.255 br +143.208.36.0 - 143.208.39.255 ar +143.208.40.0 - 143.208.43.255 br +143.208.44.0 - 143.208.51.255 ar +143.208.52.0 - 143.208.55.255 cl +143.208.56.0 - 143.208.59.255 gt +143.208.60.0 - 143.208.63.255 br +143.208.64.0 - 143.208.67.255 co +143.208.68.0 - 143.208.131.255 br +143.208.132.0 - 143.208.135.255 pe +143.208.136.0 - 143.208.163.255 br +143.208.164.0 - 143.208.167.255 do +143.208.168.0 - 143.208.171.255 cr +143.208.172.0 - 143.208.179.255 br +143.208.180.0 - 143.208.183.255 gt +143.208.184.0 - 143.208.255.255 br 143.209.0.0 - 143.209.255.255 us 143.210.0.0 - 143.210.255.255 gb 143.211.0.0 - 143.215.255.255 us @@ -69270,7 +51932,9 @@ 143.218.0.0 - 143.218.255.255 au 143.219.0.0 - 143.220.255.255 us 143.221.0.0 - 143.221.255.255 jp -143.222.0.0 - 143.223.255.255 us +143.222.0.0 - 143.223.7.255 us +143.223.8.0 - 143.223.9.255 gb +143.223.10.0 - 143.223.255.255 us 143.224.0.0 - 143.224.255.255 at 143.225.0.0 - 143.225.255.255 it 143.226.0.0 - 143.232.255.255 us @@ -69288,9 +51952,40 @@ 143.252.0.0 - 143.252.255.255 gb 143.253.0.0 - 143.253.255.255 jp 143.254.0.0 - 143.254.255.255 us +143.255.0.0 - 143.255.23.255 br +143.255.24.0 - 143.255.27.255 cl +143.255.28.0 - 143.255.31.255 cr +143.255.32.0 - 143.255.35.255 hn +143.255.36.0 - 143.255.39.255 ar +143.255.40.0 - 143.255.43.255 mx +143.255.44.0 - 143.255.55.255 br +143.255.56.0 - 143.255.59.255 mx +143.255.60.0 - 143.255.83.255 br +143.255.84.0 - 143.255.87.255 ve +143.255.88.0 - 143.255.103.255 br +143.255.104.0 - 143.255.107.255 cl +143.255.108.0 - 143.255.135.255 br +143.255.136.0 - 143.255.139.255 ar +143.255.140.0 - 143.255.143.255 py +143.255.144.0 - 143.255.151.255 br +143.255.152.0 - 143.255.155.255 ar +143.255.156.0 - 143.255.159.255 pa +143.255.160.0 - 143.255.175.255 br +143.255.176.0 - 143.255.179.255 cl +143.255.180.0 - 143.255.247.255 br +143.255.248.0 - 143.255.251.255 ec +143.255.252.0 - 143.255.255.255 br 144.0.0.0 - 144.0.255.255 cn -144.1.0.0 - 144.1.255.255 jp -144.2.0.0 - 144.2.255.255 nl +144.2.0.0 - 144.2.31.255 us +144.2.32.0 - 144.2.102.255 nl +144.2.103.0 - 144.2.103.255 ch +144.2.104.0 - 144.2.135.255 nl +144.2.136.0 - 144.2.136.255 au +144.2.137.0 - 144.2.137.255 nl +144.2.138.0 - 144.2.138.255 us +144.2.139.0 - 144.2.139.255 nl +144.2.140.0 - 144.2.140.255 sg +144.2.141.0 - 144.2.255.255 nl 144.3.0.0 - 144.3.255.255 us 144.4.0.0 - 144.4.255.255 fi 144.5.0.0 - 144.5.255.255 us @@ -69298,24 +51993,149 @@ 144.7.0.0 - 144.7.255.255 cn 144.8.0.0 - 144.11.255.255 us 144.12.0.0 - 144.12.255.255 cn -144.13.0.0 - 144.15.255.255 us +144.13.0.0 - 144.15.239.255 us +144.15.240.0 - 144.15.240.255 eu +144.15.241.0 - 144.15.255.255 us 144.16.0.0 - 144.16.255.255 in 144.17.0.0 - 144.19.255.255 us 144.20.0.0 - 144.20.255.255 es 144.21.0.0 - 144.21.255.255 pt -144.22.0.0 - 144.22.255.255 mx -144.23.0.0 - 144.23.255.255 br -144.24.0.0 - 144.24.255.255 gr +144.22.0.0 - 144.23.255.255 cr +144.24.0.0 - 144.24.255.255 gb 144.25.0.0 - 144.26.255.255 us 144.27.0.0 - 144.27.255.255 se 144.28.0.0 - 144.31.255.255 us 144.32.0.0 - 144.32.255.255 gb -144.33.0.0 - 144.40.255.255 us +144.33.0.0 - 144.36.0.255 us +144.36.1.0 - 144.36.1.255 za +144.36.2.0 - 144.36.4.63 us +144.36.4.64 - 144.36.4.67 es +144.36.4.68 - 144.36.10.191 us +144.36.10.192 - 144.36.10.255 in +144.36.11.0 - 144.36.13.255 us +144.36.14.0 - 144.36.14.255 es +144.36.15.0 - 144.36.23.255 us +144.36.24.0 - 144.36.25.255 ca +144.36.26.0 - 144.36.27.255 mx +144.36.28.0 - 144.36.30.255 us +144.36.31.0 - 144.36.31.255 mx +144.36.32.0 - 144.36.33.255 ca +144.36.34.0 - 144.36.34.191 us +144.36.34.192 - 144.36.34.255 gb +144.36.35.0 - 144.36.49.255 us +144.36.50.0 - 144.36.53.255 ar +144.36.54.0 - 144.36.55.255 ph +144.36.56.0 - 144.36.60.255 us +144.36.61.0 - 144.36.63.255 ar +144.36.64.0 - 144.36.64.127 us +144.36.64.128 - 144.36.64.255 gb +144.36.65.0 - 144.36.67.255 us +144.36.68.0 - 144.36.68.127 gb +144.36.68.128 - 144.36.68.139 us +144.36.68.140 - 144.36.68.143 gb +144.36.68.144 - 144.36.68.255 us +144.36.69.0 - 144.36.69.255 de +144.36.70.0 - 144.36.73.255 in +144.36.74.0 - 144.36.75.255 us +144.36.76.0 - 144.36.77.255 br +144.36.78.0 - 144.36.78.255 za +144.36.79.0 - 144.36.89.255 us +144.36.90.0 - 144.36.90.255 ph +144.36.91.0 - 144.36.93.255 us +144.36.94.0 - 144.36.94.255 ph +144.36.95.0 - 144.36.95.255 us +144.36.96.0 - 144.36.96.255 in +144.36.97.0 - 144.36.97.255 za +144.36.98.0 - 144.36.99.127 us +144.36.99.128 - 144.36.99.135 gb +144.36.99.136 - 144.36.101.255 us +144.36.102.0 - 144.36.102.159 gb +144.36.102.160 - 144.36.102.255 us +144.36.103.0 - 144.36.103.127 de +144.36.103.128 - 144.36.104.127 us +144.36.104.128 - 144.36.104.255 in +144.36.105.0 - 144.36.105.255 es +144.36.106.0 - 144.36.108.255 us +144.36.109.0 - 144.36.109.255 gb +144.36.110.0 - 144.36.112.255 mu +144.36.113.0 - 144.36.113.127 us +144.36.113.128 - 144.36.113.255 ph +144.36.114.0 - 144.36.115.255 lv +144.36.116.0 - 144.36.116.255 ph +144.36.117.0 - 144.36.117.31 gb +144.36.117.32 - 144.36.117.255 us +144.36.118.0 - 144.36.119.255 ro +144.36.120.0 - 144.36.121.255 pl +144.36.122.0 - 144.36.123.255 us +144.36.124.0 - 144.36.125.255 ph +144.36.126.0 - 144.36.127.255 us +144.36.128.0 - 144.36.129.255 in +144.36.130.0 - 144.36.133.255 cz +144.36.134.0 - 144.36.135.255 in +144.36.136.0 - 144.36.139.255 ph +144.36.140.0 - 144.36.141.255 in +144.36.142.0 - 144.36.142.255 ph +144.36.143.0 - 144.36.143.127 in +144.36.143.128 - 144.36.143.255 us +144.36.144.0 - 144.36.145.255 in +144.36.146.0 - 144.36.147.255 cn +144.36.148.0 - 144.36.149.255 in +144.36.150.0 - 144.36.150.255 au +144.36.151.0 - 144.36.151.255 jp +144.36.152.0 - 144.36.153.255 ph +144.36.154.0 - 144.36.154.255 us +144.36.155.0 - 144.36.155.255 in +144.36.156.0 - 144.36.161.255 ph +144.36.162.0 - 144.36.162.255 kr +144.36.163.0 - 144.36.163.63 us +144.36.163.64 - 144.36.163.127 au +144.36.163.128 - 144.36.163.191 in +144.36.163.192 - 144.36.163.255 ph +144.36.164.0 - 144.36.167.255 us +144.36.168.0 - 144.36.171.255 ph +144.36.172.0 - 144.36.172.255 us +144.36.173.0 - 144.36.173.159 in +144.36.173.160 - 144.36.175.255 us +144.36.176.0 - 144.36.176.255 in +144.36.177.0 - 144.36.177.255 us +144.36.178.0 - 144.36.179.255 in +144.36.180.0 - 144.36.180.255 ph +144.36.181.0 - 144.36.181.63 in +144.36.181.64 - 144.36.181.255 us +144.36.182.0 - 144.36.185.255 in +144.36.186.0 - 144.36.187.255 ph +144.36.188.0 - 144.36.189.255 in +144.36.190.0 - 144.36.191.127 us +144.36.191.128 - 144.36.191.191 ph +144.36.191.192 - 144.36.193.255 us +144.36.194.0 - 144.36.196.255 sk +144.36.197.0 - 144.36.199.255 us +144.36.200.0 - 144.36.202.255 sk +144.36.203.0 - 144.36.205.255 us +144.36.206.0 - 144.36.207.255 in +144.36.208.0 - 144.36.209.255 us +144.36.210.0 - 144.36.211.255 in +144.36.212.0 - 144.36.213.255 ph +144.36.214.0 - 144.36.217.255 in +144.36.218.0 - 144.36.218.255 cn +144.36.219.0 - 144.36.219.255 ph +144.36.220.0 - 144.36.236.255 in +144.36.237.0 - 144.36.239.255 mu +144.36.240.0 - 144.36.241.255 cn +144.36.242.0 - 144.36.243.255 us +144.36.244.0 - 144.36.245.255 in +144.36.246.0 - 144.36.247.255 ph +144.36.248.0 - 144.36.251.255 in +144.36.252.0 - 144.36.253.255 ph +144.36.254.0 - 144.36.255.255 in +144.37.0.0 - 144.40.255.255 us 144.41.0.0 - 144.41.255.255 de 144.42.0.0 - 144.42.255.255 us 144.43.0.0 - 144.43.255.255 nl 144.44.0.0 - 144.44.255.255 eu -144.45.0.0 - 144.51.255.255 us +144.45.0.0 - 144.46.251.255 us +144.46.252.0 - 144.46.252.255 gb +144.46.253.0 - 144.51.255.255 us 144.52.0.0 - 144.52.255.255 cn 144.53.0.0 - 144.53.255.255 au 144.54.0.0 - 144.54.255.255 nl @@ -69328,9 +52148,10 @@ 144.65.0.0 - 144.65.255.255 at 144.66.0.0 - 144.66.255.255 nz 144.67.0.0 - 144.75.255.255 us -144.76.0.0 - 144.76.255.255 de +144.76.0.0 - 144.76.126.203 de +144.76.126.204 - 144.76.126.204 nl +144.76.126.205 - 144.76.255.255 de 144.77.0.0 - 144.78.255.255 us -144.79.0.0 - 144.79.255.255 au 144.80.0.0 - 144.81.255.255 us 144.82.0.0 - 144.82.255.255 gb 144.83.0.0 - 144.83.255.255 us @@ -69339,9 +52160,12 @@ 144.86.0.0 - 144.86.255.255 us 144.87.0.0 - 144.87.255.255 gb 144.88.0.0 - 144.94.255.255 us -144.95.0.0 - 144.95.35.255 nl +144.95.0.0 - 144.95.31.255 nl +144.95.32.0 - 144.95.32.255 eu +144.95.33.0 - 144.95.35.255 nl 144.95.36.0 - 144.95.39.255 us -144.95.40.0 - 144.95.63.255 nl +144.95.40.0 - 144.95.40.255 ap +144.95.41.0 - 144.95.63.255 nl 144.95.64.0 - 144.95.71.255 gb 144.95.72.0 - 144.95.79.255 us 144.95.80.0 - 144.95.87.255 hk @@ -69361,21 +52185,35 @@ 144.125.0.0 - 144.126.255.255 us 144.127.0.0 - 144.127.255.255 no 144.128.0.0 - 144.129.255.255 us -144.130.0.0 - 144.140.255.255 au +144.130.0.0 - 144.130.127.255 au +144.130.128.0 - 144.130.143.255 us +144.130.144.0 - 144.140.255.255 au 144.141.0.0 - 144.144.255.255 us 144.145.0.0 - 144.145.255.255 de 144.146.0.0 - 144.163.255.255 us 144.164.0.0 - 144.164.255.255 no 144.165.0.0 - 144.165.255.255 fr -144.166.0.0 - 144.172.63.255 us +144.166.0.0 - 144.168.51.255 us +144.168.52.0 - 144.168.55.255 ca +144.168.56.0 - 144.172.127.255 us +144.172.128.0 - 144.172.255.255 ca 144.173.0.0 - 144.173.255.255 gb 144.174.0.0 - 144.175.255.255 us -144.176.0.0 - 144.177.255.255 no +144.176.0.0 - 144.177.69.255 no +144.177.70.0 - 144.177.70.255 us +144.177.71.0 - 144.177.98.255 no +144.177.99.0 - 144.177.99.255 my +144.177.100.0 - 144.177.100.255 ap +144.177.101.0 - 144.177.255.255 no 144.178.0.0 - 144.178.255.255 gb 144.179.0.0 - 144.181.255.255 no -144.182.0.0 - 144.192.255.255 us +144.182.0.0 - 144.187.36.10 us +144.187.36.11 - 144.187.36.11 eu +144.187.36.12 - 144.192.255.255 us 144.193.0.0 - 144.193.255.255 no -144.194.0.0 - 144.194.255.255 ca +144.194.0.0 - 144.194.248.255 ca +144.194.249.0 - 144.194.249.255 eu +144.194.250.0 - 144.194.255.255 ca 144.195.0.0 - 144.198.255.255 us 144.199.0.0 - 144.199.255.255 my 144.200.0.0 - 144.200.255.255 ch @@ -69384,46 +52222,50 @@ 144.205.0.0 - 144.205.255.255 au 144.206.0.0 - 144.206.255.255 ru 144.207.0.0 - 144.208.255.255 us -144.209.0.0 - 144.209.255.255 nl -144.210.0.0 - 144.212.255.255 us +144.209.0.0 - 144.209.106.255 nl +144.209.107.0 - 144.209.107.255 ru +144.209.108.0 - 144.209.255.255 nl +144.210.0.0 - 144.211.192.255 us +144.211.193.0 - 144.211.195.255 gb +144.211.196.0 - 144.212.255.255 us 144.213.0.0 - 144.213.255.255 jp 144.214.0.0 - 144.214.255.255 hk -144.215.0.0 - 144.217.255.255 us -144.218.0.0 - 144.218.255.255 au -144.219.0.0 - 144.247.255.255 us +144.215.0.0 - 144.247.255.255 us 144.248.0.0 - 144.248.255.255 be -144.249.0.0 - 144.254.255.255 us +144.249.0.0 - 144.254.199.255 us +144.254.200.0 - 144.254.203.255 nl +144.254.204.0 - 144.254.255.255 us 144.255.0.0 - 144.255.255.255 cn -145.0.0.0 - 145.16.255.255 nl +145.0.0.0 - 145.8.103.255 nl +145.8.104.0 - 145.8.104.255 gb +145.8.105.0 - 145.16.255.255 nl 145.17.0.0 - 145.17.255.255 gb -145.18.0.0 - 145.54.255.255 nl +145.18.0.0 - 145.35.255.255 nl +145.36.0.0 - 145.36.255.255 gb +145.37.0.0 - 145.54.255.255 nl 145.55.0.0 - 145.55.255.255 gb 145.56.0.0 - 145.61.255.255 nl -145.62.0.0 - 145.62.255.255 gb -145.63.0.0 - 145.217.255.255 nl -145.218.0.0 - 145.218.127.255 eu -145.218.128.0 - 145.218.128.3 dk -145.218.128.4 - 145.218.128.7 se -145.218.128.8 - 145.218.128.11 gb -145.218.128.12 - 145.218.255.255 eu +145.62.0.0 - 145.62.31.255 gb +145.62.32.0 - 145.62.32.255 eu +145.62.33.0 - 145.62.63.255 gb +145.62.64.0 - 145.62.95.255 de +145.62.96.0 - 145.62.255.255 gb +145.63.0.0 - 145.128.255.255 nl +145.129.0.0 - 145.129.50.255 be +145.129.51.0 - 145.129.51.255 nl +145.129.52.0 - 145.129.255.255 be +145.130.0.0 - 145.217.255.255 nl +145.218.0.0 - 145.218.255.255 eu 145.219.0.0 - 145.223.255.255 nl -145.224.0.0 - 145.224.32.56 gb -145.224.32.57 - 145.224.32.57 nl -145.224.32.58 - 145.224.32.58 fr -145.224.32.59 - 145.224.32.59 be -145.224.32.60 - 145.224.32.60 de -145.224.32.61 - 145.224.144.56 gb -145.224.144.57 - 145.224.144.57 nl -145.224.144.58 - 145.224.144.58 fr -145.224.144.59 - 145.224.144.59 be -145.224.144.60 - 145.224.144.60 de -145.224.144.61 - 145.224.255.255 gb -145.225.0.0 - 145.225.255.255 de +145.224.0.0 - 145.224.31.255 gb +145.224.32.0 - 145.224.32.255 be +145.224.33.0 - 145.224.255.255 gb +145.225.0.0 - 145.225.11.255 de +145.225.12.0 - 145.225.12.255 za +145.225.13.0 - 145.225.255.255 de 145.226.0.0 - 145.226.255.255 fr 145.227.0.0 - 145.227.255.255 gb -145.228.0.0 - 145.228.161.75 de -145.228.161.76 - 145.228.161.95 it -145.228.161.96 - 145.228.255.255 de +145.228.0.0 - 145.228.255.255 de 145.229.0.0 - 145.229.255.255 gb 145.230.0.0 - 145.230.255.255 de 145.231.0.0 - 145.231.255.255 fr @@ -69431,7 +52273,9 @@ 145.233.0.0 - 145.233.255.255 gb 145.234.0.0 - 145.234.255.255 ch 145.235.0.0 - 145.235.255.255 se -145.236.0.0 - 145.236.255.255 hu +145.236.0.0 - 145.236.79.255 hu +145.236.80.0 - 145.236.80.255 bg +145.236.81.0 - 145.236.255.255 hu 145.237.0.0 - 145.237.255.255 pl 145.238.0.0 - 145.238.255.255 fr 145.239.0.0 - 145.239.255.255 gb @@ -69441,12 +52285,14 @@ 145.243.0.0 - 145.243.255.255 de 145.244.0.0 - 145.244.255.255 at 145.245.0.0 - 145.245.255.255 ch -145.246.0.0 - 145.246.255.255 gb -145.247.0.0 - 145.247.150.255 fi -145.247.151.0 - 145.247.170.255 no -145.247.171.0 - 145.247.255.255 fi +145.246.0.0 - 145.246.127.255 gb +145.246.128.0 - 145.246.131.255 us +145.246.132.0 - 145.246.255.255 gb +145.247.0.0 - 145.247.255.255 fi 145.248.0.0 - 145.248.255.255 fr -145.249.0.0 - 145.249.255.255 ru +145.249.0.0 - 145.249.63.255 ir +145.249.64.0 - 145.249.119.255 ru +145.249.120.0 - 145.249.255.255 kz 145.250.0.0 - 145.250.255.255 ch 145.251.0.0 - 145.251.255.255 se 145.252.0.0 - 145.252.255.255 ch @@ -69455,7 +52301,7 @@ 145.255.48.0 - 145.255.55.255 de 145.255.56.0 - 145.255.63.255 dk 145.255.64.0 - 145.255.127.255 om -145.255.128.0 - 145.255.135.255 ro +145.255.128.0 - 145.255.135.255 nl 145.255.136.0 - 145.255.143.255 ru 145.255.144.0 - 145.255.159.255 sk 145.255.160.0 - 145.255.191.255 kz @@ -69467,13 +52313,22 @@ 146.0.0.0 - 146.0.15.255 de 146.0.16.0 - 146.0.23.255 al 146.0.24.0 - 146.0.31.255 fr -146.0.32.0 - 146.0.63.255 ro -146.0.64.0 - 146.0.71.255 fr +146.0.32.0 - 146.0.46.255 de +146.0.47.0 - 146.0.47.255 pl +146.0.48.0 - 146.0.55.255 ie +146.0.56.0 - 146.0.57.255 gb +146.0.58.0 - 146.0.63.255 ro +146.0.64.0 - 146.0.67.255 fr +146.0.68.0 - 146.0.68.255 de +146.0.69.0 - 146.0.71.255 fr 146.0.72.0 - 146.0.79.255 nl 146.0.80.0 - 146.0.87.255 ua 146.0.88.0 - 146.0.95.255 fr 146.0.96.0 - 146.0.127.255 de -146.0.128.0 - 146.0.255.255 ro +146.0.128.0 - 146.0.230.223 ro +146.0.230.224 - 146.0.230.239 de +146.0.230.240 - 146.0.239.255 ro +146.0.240.0 - 146.0.255.255 de 146.1.0.0 - 146.1.255.255 us 146.2.0.0 - 146.2.255.255 no 146.3.0.0 - 146.3.255.255 lu @@ -69484,7 +52339,15 @@ 146.19.0.0 - 146.19.255.255 fr 146.20.0.0 - 146.20.255.255 us 146.21.0.0 - 146.21.255.255 se -146.22.0.0 - 146.47.255.255 us +146.22.0.0 - 146.23.177.255 us +146.23.178.0 - 146.23.178.255 au +146.23.179.0 - 146.23.195.255 us +146.23.196.0 - 146.23.196.255 ap +146.23.197.0 - 146.23.211.255 us +146.23.212.0 - 146.23.212.255 eu +146.23.213.0 - 146.23.240.255 us +146.23.241.0 - 146.23.242.255 za +146.23.243.0 - 146.47.255.255 us 146.48.0.0 - 146.48.255.255 it 146.49.0.0 - 146.49.255.255 us 146.50.0.0 - 146.50.255.255 nl @@ -69492,11 +52355,10 @@ 146.52.0.0 - 146.52.255.255 de 146.53.0.0 - 146.55.255.255 us 146.56.0.0 - 146.56.255.255 jp -146.57.0.0 - 146.58.255.255 us +146.57.0.0 - 146.57.255.255 us 146.59.0.0 - 146.59.255.255 no 146.60.0.0 - 146.60.255.255 de 146.61.0.0 - 146.61.255.255 us -146.62.0.0 - 146.62.255.255 au 146.63.0.0 - 146.63.255.255 us 146.64.0.0 - 146.64.255.255 za 146.65.0.0 - 146.65.255.255 us @@ -69505,15 +52367,16 @@ 146.66.16.0 - 146.66.23.255 kz 146.66.24.0 - 146.66.31.255 fi 146.66.32.0 - 146.66.63.255 gb -146.66.64.0 - 146.66.127.255 ro -146.66.128.0 - 146.66.128.127 ir -146.66.128.128 - 146.66.128.191 iq -146.66.128.192 - 146.66.132.255 ir -146.66.133.0 - 146.66.135.255 iq +146.66.64.0 - 146.66.127.255 bg +146.66.128.0 - 146.66.135.255 iq 146.66.136.0 - 146.66.143.255 es -146.66.144.0 - 146.66.151.255 de -146.66.152.0 - 146.66.153.255 lu -146.66.154.0 - 146.66.159.255 eu +146.66.144.0 - 146.66.151.255 fr +146.66.152.0 - 146.66.152.255 lu +146.66.153.0 - 146.66.153.255 eu +146.66.154.0 - 146.66.154.255 lu +146.66.155.0 - 146.66.155.255 at +146.66.156.0 - 146.66.157.255 se +146.66.158.0 - 146.66.159.255 lu 146.66.160.0 - 146.66.207.255 ru 146.66.208.0 - 146.66.223.255 ro 146.66.224.0 - 146.66.231.255 de @@ -69522,7 +52385,7 @@ 146.67.0.0 - 146.67.255.255 ch 146.68.0.0 - 146.69.255.255 us 146.70.0.0 - 146.70.255.255 gb -146.71.128.0 - 146.71.255.255 us +146.71.0.0 - 146.71.255.255 us 146.72.0.0 - 146.72.255.255 no 146.73.0.0 - 146.74.255.255 us 146.75.0.0 - 146.75.255.255 se @@ -69533,19 +52396,55 @@ 146.81.0.0 - 146.81.255.255 fi 146.82.0.0 - 146.82.15.255 us 146.82.16.0 - 146.82.16.255 dk -146.82.17.0 - 146.82.21.255 us +146.82.17.0 - 146.82.20.255 us +146.82.21.0 - 146.82.21.255 be 146.82.22.0 - 146.82.22.255 dk -146.82.23.0 - 146.82.155.255 us +146.82.23.0 - 146.82.32.255 us +146.82.33.0 - 146.82.33.233 gb +146.82.33.234 - 146.82.33.234 us +146.82.33.235 - 146.82.33.255 gb +146.82.34.0 - 146.82.67.255 us +146.82.68.0 - 146.82.68.255 gb +146.82.69.0 - 146.82.155.255 us 146.82.156.0 - 146.82.156.255 dk -146.82.157.0 - 146.82.255.255 us +146.82.157.0 - 146.82.228.63 us +146.82.228.64 - 146.82.228.95 ar +146.82.228.96 - 146.82.235.255 us +146.82.236.0 - 146.82.236.255 ve +146.82.237.0 - 146.82.255.255 us 146.83.0.0 - 146.83.255.255 cl 146.84.0.0 - 146.86.255.255 us 146.87.0.0 - 146.87.255.255 gb -146.88.0.0 - 146.89.255.255 us +146.88.0.0 - 146.88.15.255 us +146.88.16.0 - 146.88.18.255 au +146.88.19.0 - 146.88.19.255 ap +146.88.20.0 - 146.88.23.255 au +146.88.24.0 - 146.88.27.255 in +146.88.28.0 - 146.88.28.255 au +146.88.29.0 - 146.88.31.255 us +146.88.32.0 - 146.88.63.255 th +146.88.64.0 - 146.88.79.255 ph +146.88.80.0 - 146.88.83.255 my +146.88.84.0 - 146.88.87.255 kr +146.88.88.0 - 146.88.95.255 ph +146.88.96.0 - 146.88.127.255 us +146.88.128.0 - 146.88.135.255 au +146.88.136.0 - 146.88.145.255 us +146.88.146.0 - 146.88.147.255 nz +146.88.148.0 - 146.88.151.255 us +146.88.152.0 - 146.88.153.255 mo +146.88.154.0 - 146.88.154.255 my +146.88.155.0 - 146.88.159.255 mo +146.88.160.0 - 146.88.175.255 in +146.88.176.0 - 146.88.195.255 us +146.88.196.0 - 146.88.199.255 my +146.88.200.0 - 146.88.207.255 kh +146.88.208.0 - 146.89.255.255 us 146.90.0.0 - 146.90.255.255 gb 146.91.0.0 - 146.96.255.255 us 146.97.0.0 - 146.97.255.255 gb -146.98.0.0 - 146.99.255.255 us +146.98.0.0 - 146.98.255.255 us +146.99.0.0 - 146.99.255.255 jp 146.100.0.0 - 146.100.255.255 it 146.101.0.0 - 146.101.255.255 gb 146.102.0.0 - 146.102.255.255 cz @@ -69554,31 +52453,44 @@ 146.105.0.0 - 146.105.255.255 gb 146.106.0.0 - 146.106.255.255 eu 146.107.0.0 - 146.107.255.255 de -146.108.0.0 - 146.108.255.255 at +146.108.0.0 - 146.108.201.255 at +146.108.202.0 - 146.108.202.255 eu +146.108.203.0 - 146.108.255.255 at 146.109.0.0 - 146.109.255.255 ch 146.110.0.0 - 146.110.255.255 hu 146.111.0.0 - 146.111.255.255 us -146.112.0.0 - 146.112.255.255 at +146.112.0.0 - 146.112.127.255 eu +146.112.128.0 - 146.112.128.255 fr +146.112.129.0 - 146.112.129.255 cz +146.112.130.0 - 146.112.255.255 eu 146.113.0.0 - 146.115.255.255 us 146.116.0.0 - 146.116.255.255 au -146.117.0.0 - 146.117.255.255 jp 146.118.0.0 - 146.118.255.255 au 146.119.0.0 - 146.119.255.255 fi -146.120.0.0 - 146.120.87.255 ru -146.120.88.0 - 146.120.90.255 ua +146.120.0.0 - 146.120.7.255 ru +146.120.8.0 - 146.120.11.255 ba +146.120.12.0 - 146.120.23.255 ru +146.120.24.0 - 146.120.31.255 ua +146.120.32.0 - 146.120.87.255 ru +146.120.88.0 - 146.120.89.255 cz +146.120.90.0 - 146.120.90.255 ru 146.120.91.0 - 146.120.91.255 cz -146.120.92.0 - 146.120.111.255 ru +146.120.92.0 - 146.120.95.255 ru +146.120.96.0 - 146.120.103.255 gb +146.120.104.0 - 146.120.107.255 ru +146.120.108.0 - 146.120.110.255 cz +146.120.111.0 - 146.120.111.255 ru 146.120.112.0 - 146.120.115.255 gb -146.120.116.0 - 146.120.151.255 cz +146.120.116.0 - 146.120.135.255 cz +146.120.136.0 - 146.120.151.255 ru 146.120.152.0 - 146.120.159.255 de -146.120.160.0 - 146.120.167.255 ru -146.120.168.0 - 146.120.175.255 ee -146.120.176.0 - 146.120.179.255 cz -146.120.180.0 - 146.120.187.255 ru -146.120.188.0 - 146.120.235.255 cz -146.120.236.0 - 146.120.243.255 ua -146.120.244.0 - 146.120.255.255 cz -146.121.0.0 - 146.123.255.255 us +146.120.160.0 - 146.120.163.255 nl +146.120.164.0 - 146.120.215.255 ru +146.120.216.0 - 146.120.231.255 cz +146.120.232.0 - 146.120.255.255 ru +146.121.0.0 - 146.122.202.255 us +146.122.203.0 - 146.122.203.255 be +146.122.204.0 - 146.123.255.255 us 146.124.0.0 - 146.124.255.255 gr 146.125.0.0 - 146.130.255.255 us 146.131.0.0 - 146.131.255.255 ca @@ -69590,19 +52502,19 @@ 146.137.0.0 - 146.139.255.255 us 146.140.0.0 - 146.140.255.255 de 146.141.0.0 - 146.141.255.255 za -146.142.0.0 - 146.143.255.255 us -146.144.0.0 - 146.144.255.255 au -146.145.0.0 - 146.145.75.55 us -146.145.75.56 - 146.145.75.63 pa -146.145.75.64 - 146.154.255.255 us +146.142.0.0 - 146.148.71.255 us +146.148.72.0 - 146.148.72.255 eu +146.148.73.0 - 146.154.255.255 us 146.155.0.0 - 146.155.255.255 cl 146.156.0.0 - 146.157.255.255 us 146.158.0.0 - 146.158.127.255 ru -146.158.128.0 - 146.158.255.255 ro +146.158.128.0 - 146.158.255.255 es 146.159.0.0 - 146.159.255.255 ch -146.160.0.0 - 146.160.255.255 us +146.160.0.0 - 146.160.255.255 jp 146.161.0.0 - 146.161.255.255 fi -146.162.0.0 - 146.162.255.255 gb +146.162.0.0 - 146.162.242.255 gb +146.162.243.0 - 146.162.243.255 fr +146.162.244.0 - 146.162.255.255 gb 146.163.0.0 - 146.163.255.255 us 146.164.0.0 - 146.164.255.255 br 146.165.0.0 - 146.168.255.255 us @@ -69624,24 +52536,30 @@ 146.185.16.0 - 146.185.31.255 gb 146.185.32.0 - 146.185.39.255 lb 146.185.40.0 - 146.185.47.255 fr -146.185.48.0 - 146.185.48.111 be -146.185.48.112 - 146.185.48.127 nl -146.185.48.128 - 146.185.49.255 be -146.185.50.0 - 146.185.53.255 nl -146.185.54.0 - 146.185.54.55 be -146.185.54.56 - 146.185.54.63 nl -146.185.54.64 - 146.185.55.255 be -146.185.56.0 - 146.185.63.255 il -146.185.64.0 - 146.185.127.255 tr -146.185.128.0 - 146.185.211.255 ru -146.185.212.0 - 146.185.215.255 cy -146.185.216.0 - 146.185.239.255 ru -146.185.240.0 - 146.185.240.255 ua -146.185.241.0 - 146.185.242.255 ru -146.185.243.0 - 146.185.243.255 ua -146.185.244.0 - 146.185.244.255 ru -146.185.245.0 - 146.185.245.255 ro -146.185.246.0 - 146.185.255.255 ru +146.185.48.0 - 146.185.51.255 be +146.185.52.0 - 146.185.53.255 nl +146.185.54.0 - 146.185.54.255 be +146.185.55.0 - 146.185.55.255 nl +146.185.56.0 - 146.185.61.255 il +146.185.62.0 - 146.185.62.255 ps +146.185.63.0 - 146.185.63.255 il +146.185.64.0 - 146.185.95.255 ch +146.185.96.0 - 146.185.127.255 tr +146.185.128.0 - 146.185.191.255 nl +146.185.192.0 - 146.185.199.255 ru +146.185.200.0 - 146.185.200.127 by +146.185.200.128 - 146.185.203.255 ru +146.185.204.0 - 146.185.204.127 us +146.185.204.128 - 146.185.204.255 rs +146.185.205.0 - 146.185.205.127 pt +146.185.205.128 - 146.185.205.255 tw +146.185.206.0 - 146.185.206.127 ma +146.185.206.128 - 146.185.206.255 nz +146.185.207.0 - 146.185.240.255 ru +146.185.241.0 - 146.185.241.255 ua +146.185.242.0 - 146.185.252.255 ru +146.185.253.0 - 146.185.253.255 nl +146.185.254.0 - 146.185.255.255 ru 146.186.0.0 - 146.187.255.255 us 146.188.0.0 - 146.188.255.255 gb 146.189.0.0 - 146.190.255.255 us @@ -69649,8 +52567,12 @@ 146.192.0.0 - 146.192.255.255 no 146.193.0.0 - 146.193.255.255 pt 146.194.0.0 - 146.194.255.255 gb -146.195.0.0 - 146.196.255.255 au -146.197.0.0 - 146.209.255.255 us +146.195.0.0 - 146.196.31.255 au +146.197.0.0 - 146.197.255.255 us +146.198.0.0 - 146.199.44.138 gb +146.199.44.139 - 146.199.44.139 us +146.199.44.140 - 146.200.255.255 gb +146.201.0.0 - 146.209.255.255 us 146.210.0.0 - 146.210.255.255 at 146.211.0.0 - 146.211.255.255 fi 146.212.0.0 - 146.212.255.255 si @@ -69679,39 +52601,14 @@ 146.247.16.0 - 146.247.23.255 it 146.247.24.0 - 146.247.31.255 si 146.247.32.0 - 146.247.39.255 ru -146.247.40.0 - 146.247.47.255 ir +146.247.40.0 - 146.247.47.255 ie 146.247.48.0 - 146.247.63.255 gb 146.247.64.0 - 146.247.71.255 it 146.247.72.0 - 146.247.79.255 nl 146.247.80.0 - 146.247.87.255 se 146.247.88.0 - 146.247.95.255 fr 146.247.96.0 - 146.247.114.255 de -146.247.115.0 - 146.247.115.63 us -146.247.115.64 - 146.247.115.255 it -146.247.116.0 - 146.247.116.15 gb -146.247.116.16 - 146.247.116.255 it -146.247.117.0 - 146.247.117.15 ch -146.247.117.16 - 146.247.117.255 it -146.247.118.0 - 146.247.118.15 de -146.247.118.16 - 146.247.118.255 it -146.247.119.0 - 146.247.119.15 nl -146.247.119.16 - 146.247.119.255 it -146.247.120.0 - 146.247.120.15 br -146.247.120.16 - 146.247.120.255 it -146.247.121.0 - 146.247.121.15 jp -146.247.121.16 - 146.247.121.255 it -146.247.122.0 - 146.247.122.15 cn -146.247.122.16 - 146.247.122.255 it -146.247.123.0 - 146.247.123.15 lt -146.247.123.16 - 146.247.123.255 it -146.247.124.0 - 146.247.124.15 fr -146.247.124.16 - 146.247.124.255 it -146.247.125.0 - 146.247.125.15 id -146.247.125.16 - 146.247.125.255 it -146.247.126.0 - 146.247.126.15 ru -146.247.126.16 - 146.247.126.255 it -146.247.127.0 - 146.247.127.15 fr -146.247.127.16 - 146.247.127.255 it +146.247.115.0 - 146.247.127.255 it 146.247.128.0 - 146.247.255.255 no 146.248.0.0 - 146.248.255.255 ch 146.249.0.0 - 146.249.255.255 fr @@ -69729,7 +52626,10 @@ 146.255.96.0 - 146.255.103.255 es 146.255.104.0 - 146.255.111.255 gb 146.255.112.0 - 146.255.119.255 ch -146.255.120.0 - 146.255.127.255 de +146.255.120.0 - 146.255.122.255 us +146.255.123.0 - 146.255.123.255 de +146.255.124.0 - 146.255.126.255 sg +146.255.127.0 - 146.255.127.255 de 146.255.128.0 - 146.255.159.255 ba 146.255.160.0 - 146.255.167.255 it 146.255.168.0 - 146.255.175.255 fr @@ -69737,7 +52637,17 @@ 146.255.184.0 - 146.255.191.255 es 146.255.192.0 - 146.255.223.255 ru 146.255.224.0 - 146.255.255.255 ge -147.0.0.0 - 147.5.255.255 us +147.0.0.0 - 147.1.7.255 us +147.1.8.0 - 147.1.8.255 sg +147.1.9.0 - 147.1.10.255 us +147.1.11.0 - 147.1.11.255 au +147.1.12.0 - 147.1.27.255 us +147.1.28.0 - 147.1.28.255 sg +147.1.29.0 - 147.1.37.255 us +147.1.38.0 - 147.1.38.255 sg +147.1.39.0 - 147.1.79.255 us +147.1.80.0 - 147.1.80.255 sg +147.1.81.0 - 147.5.255.255 us 147.6.0.0 - 147.6.255.255 kr 147.7.0.0 - 147.7.255.255 hu 147.8.0.0 - 147.8.255.255 hk @@ -69748,10 +52658,10 @@ 147.13.0.0 - 147.14.255.255 se 147.15.0.0 - 147.26.255.255 us 147.27.0.0 - 147.27.255.255 gr -147.28.0.0 - 147.28.255.255 jp -147.29.0.0 - 147.29.149.223 dk -147.29.149.224 - 147.29.149.255 gb -147.29.150.0 - 147.29.255.255 dk +147.28.0.0 - 147.28.255.255 us +147.29.0.0 - 147.29.113.255 dk +147.29.114.0 - 147.29.114.255 eu +147.29.115.0 - 147.29.255.255 dk 147.30.0.0 - 147.30.255.255 kz 147.31.0.0 - 147.31.255.255 us 147.32.0.0 - 147.33.255.255 cz @@ -69762,20 +52672,30 @@ 147.44.0.0 - 147.44.255.255 se 147.45.0.0 - 147.45.255.255 ru 147.46.0.0 - 147.47.255.255 kr -147.48.0.0 - 147.51.255.255 us +147.48.0.0 - 147.49.255.255 us +147.50.0.0 - 147.50.255.255 th +147.51.0.0 - 147.51.255.255 us 147.52.0.0 - 147.52.255.255 gr 147.53.0.0 - 147.53.255.255 us 147.54.0.0 - 147.54.255.255 de 147.55.0.0 - 147.59.255.255 us -147.60.0.0 - 147.60.255.255 ch +147.60.0.0 - 147.60.0.255 ch +147.60.1.0 - 147.60.1.255 ap +147.60.2.0 - 147.60.255.255 ch 147.61.0.0 - 147.64.255.255 us 147.65.0.0 - 147.65.255.255 br 147.66.0.0 - 147.66.255.255 au -147.67.0.0 - 147.67.255.255 lu +147.67.0.0 - 147.67.240.255 lu +147.67.241.0 - 147.67.241.255 be +147.67.242.0 - 147.67.255.255 lu 147.68.0.0 - 147.68.255.255 gb 147.69.0.0 - 147.69.255.255 au 147.70.0.0 - 147.74.255.255 us -147.75.0.0 - 147.75.255.255 ch +147.75.0.0 - 147.75.127.255 ch +147.75.128.0 - 147.75.143.255 us +147.75.144.0 - 147.75.159.255 ch +147.75.160.0 - 147.75.207.255 us +147.75.208.0 - 147.75.255.255 ch 147.76.0.0 - 147.76.255.255 au 147.77.0.0 - 147.77.255.255 gb 147.79.0.0 - 147.82.255.255 us @@ -69794,12 +52714,28 @@ 147.98.0.0 - 147.100.255.255 fr 147.101.0.0 - 147.101.255.255 us 147.102.0.0 - 147.102.255.255 gr -147.103.0.0 - 147.108.255.255 us +147.103.0.0 - 147.108.15.255 us +147.108.16.0 - 147.108.17.255 ae +147.108.18.0 - 147.108.31.255 us +147.108.32.0 - 147.108.39.255 au +147.108.40.0 - 147.108.55.255 us +147.108.56.0 - 147.108.63.255 gb +147.108.64.0 - 147.108.65.255 us +147.108.66.0 - 147.108.67.255 ae +147.108.68.0 - 147.108.75.255 us +147.108.76.0 - 147.108.77.255 sa +147.108.78.0 - 147.108.199.255 us +147.108.200.0 - 147.108.207.255 au +147.108.208.0 - 147.108.255.255 us 147.109.0.0 - 147.109.255.255 au 147.110.0.0 - 147.110.255.255 za 147.111.0.0 - 147.112.255.255 no 147.113.0.0 - 147.113.255.255 us -147.114.0.0 - 147.114.255.255 gb +147.114.0.0 - 147.114.248.255 gb +147.114.249.0 - 147.114.249.108 ap +147.114.249.109 - 147.114.249.109 hk +147.114.249.110 - 147.114.249.255 ap +147.114.250.0 - 147.114.255.255 gb 147.115.0.0 - 147.118.255.255 us 147.119.0.0 - 147.119.255.255 gb 147.120.0.0 - 147.121.255.255 us @@ -69834,7 +52770,9 @@ 147.177.0.0 - 147.179.255.255 us 147.180.0.0 - 147.180.255.255 se 147.181.0.0 - 147.181.255.255 nl -147.182.0.0 - 147.183.255.255 us +147.182.0.0 - 147.182.200.255 us +147.182.201.0 - 147.182.201.255 ap +147.182.202.0 - 147.183.255.255 us 147.184.0.0 - 147.184.255.255 gb 147.185.0.0 - 147.185.255.255 us 147.186.0.0 - 147.186.255.255 se @@ -69842,18 +52780,21 @@ 147.188.0.0 - 147.189.255.255 gb 147.190.0.0 - 147.192.255.255 us 147.193.0.0 - 147.193.255.255 gb +147.194.0.0 - 147.194.255.255 ca 147.195.0.0 - 147.195.255.255 us 147.196.0.0 - 147.196.255.255 fr 147.197.0.0 - 147.197.255.255 gb 147.198.0.0 - 147.199.255.255 us 147.200.0.0 - 147.200.255.255 au 147.201.0.0 - 147.201.255.255 gb -147.202.0.0 - 147.203.255.255 us +147.202.0.0 - 147.203.119.255 us +147.203.120.0 - 147.203.120.255 a1 +147.203.121.0 - 147.203.255.255 us 147.204.0.0 - 147.204.255.255 de 147.205.0.0 - 147.208.255.255 us 147.209.0.0 - 147.209.255.255 au 147.210.0.0 - 147.210.255.255 fr -147.211.0.0 - 147.212.255.255 au +147.211.0.0 - 147.211.255.255 au 147.213.0.0 - 147.213.255.255 sk 147.214.0.0 - 147.214.255.255 se 147.215.0.0 - 147.215.255.255 fr @@ -69873,26 +52814,46 @@ 147.250.0.0 - 147.250.255.255 fr 147.251.0.0 - 147.251.255.255 cz 147.252.0.0 - 147.252.255.255 ie -147.253.0.0 - 147.254.255.255 us +147.253.0.0 - 147.255.255.255 us +148.0.0.0 - 148.0.255.255 do 148.1.0.0 - 148.1.255.255 us 148.2.0.0 - 148.2.255.255 se -148.3.0.0 - 148.3.255.255 gb +148.3.0.0 - 148.3.255.255 es 148.4.0.0 - 148.5.255.255 us 148.6.0.0 - 148.6.255.255 hu 148.7.0.0 - 148.53.255.255 us 148.54.0.0 - 148.54.255.255 ch 148.55.0.0 - 148.55.255.255 us -148.56.0.0 - 148.56.255.255 at +148.56.0.0 - 148.56.255.255 de 148.57.0.0 - 148.59.255.255 us 148.60.0.0 - 148.60.255.255 fr -148.61.0.0 - 148.78.255.255 us +148.61.0.0 - 148.66.63.255 us +148.66.64.0 - 148.66.127.255 pf +148.66.128.0 - 148.66.255.255 us +148.67.0.0 - 148.68.255.255 jp +148.69.0.0 - 148.78.255.255 us 148.79.0.0 - 148.79.255.255 gb 148.80.0.0 - 148.80.255.255 us 148.81.0.0 - 148.81.255.255 pl 148.82.0.0 - 148.83.255.255 no 148.84.0.0 - 148.87.255.255 us 148.88.0.0 - 148.88.255.255 gb -148.89.0.0 - 148.109.255.255 us +148.89.0.0 - 148.100.255.255 us +148.101.0.0 - 148.101.255.255 do +148.102.0.0 - 148.102.127.255 pe +148.102.128.0 - 148.102.255.255 ht +148.103.0.0 - 148.103.255.255 do +148.104.0.0 - 148.106.81.24 us +148.106.81.25 - 148.106.81.25 ap +148.106.81.26 - 148.106.151.255 us +148.106.152.0 - 148.106.153.59 gb +148.106.153.60 - 148.106.153.60 us +148.106.153.61 - 148.106.159.255 gb +148.106.160.0 - 148.107.4.255 us +148.107.5.0 - 148.107.5.255 ap +148.107.6.0 - 148.107.11.255 us +148.107.12.0 - 148.107.12.255 gb +148.107.13.0 - 148.109.255.255 us 148.110.0.0 - 148.110.255.255 lu 148.111.0.0 - 148.116.255.255 us 148.117.0.0 - 148.117.255.255 ca @@ -69908,24 +52869,42 @@ 148.144.0.0 - 148.144.255.255 us 148.145.0.0 - 148.145.255.255 au 148.146.0.0 - 148.147.255.255 us -148.148.0.0 - 148.148.255.255 nl +148.148.0.0 - 148.148.255.255 se 148.149.0.0 - 148.150.255.255 us 148.151.0.0 - 148.151.255.255 om 148.152.0.0 - 148.159.255.255 us 148.160.0.0 - 148.160.255.255 se 148.161.0.0 - 148.161.255.255 jp -148.162.0.0 - 148.168.255.255 us +148.162.0.0 - 148.163.179.255 us +148.163.180.0 - 148.163.183.255 ca +148.163.184.0 - 148.168.255.255 us 148.169.0.0 - 148.169.255.255 fr 148.170.0.0 - 148.175.255.255 us 148.176.0.0 - 148.176.255.255 gb -148.177.0.0 - 148.180.255.255 us +148.177.0.0 - 148.177.127.255 us +148.177.128.0 - 148.177.129.255 eu +148.177.130.0 - 148.177.194.255 us +148.177.195.0 - 148.177.195.255 au +148.177.196.0 - 148.177.216.255 us +148.177.217.0 - 148.177.217.255 ap +148.177.218.0 - 148.177.241.255 us +148.177.242.0 - 148.177.242.255 in +148.177.243.0 - 148.180.255.255 us 148.181.0.0 - 148.181.255.255 gb 148.182.0.0 - 148.182.255.255 au 148.183.0.0 - 148.184.255.255 us 148.185.0.0 - 148.185.255.255 eu 148.186.0.0 - 148.186.255.255 us 148.187.0.0 - 148.187.255.255 ch -148.188.0.0 - 148.194.255.255 us +148.188.0.0 - 148.188.1.59 us +148.188.1.60 - 148.188.1.60 fr +148.188.1.61 - 148.188.8.255 us +148.188.9.0 - 148.188.9.255 eu +148.188.10.0 - 148.188.17.55 us +148.188.17.56 - 148.188.17.56 eu +148.188.17.57 - 148.188.247.255 us +148.188.248.0 - 148.188.248.255 ap +148.188.249.0 - 148.194.255.255 us 148.195.0.0 - 148.195.255.255 au 148.196.0.0 - 148.196.255.255 ch 148.197.0.0 - 148.197.255.255 gb @@ -69936,10 +52915,45 @@ 148.223.156.0 - 148.223.159.255 ec 148.223.160.0 - 148.235.179.255 mx 148.235.180.0 - 148.235.183.255 ec -148.235.184.0 - 148.250.255.255 mx +148.235.184.0 - 148.245.102.119 mx +148.245.102.120 - 148.245.102.127 ni +148.245.102.128 - 148.250.255.255 mx 148.251.0.0 - 148.251.255.255 de -148.252.0.0 - 148.253.255.255 gb +148.252.0.0 - 148.252.64.255 gb +148.252.65.0 - 148.252.65.255 no +148.252.66.0 - 148.252.67.255 gb +148.252.68.0 - 148.252.68.255 no +148.252.69.0 - 148.252.69.255 gb +148.252.70.0 - 148.252.70.255 no +148.252.71.0 - 148.252.71.255 gb +148.252.72.0 - 148.252.72.255 no +148.252.73.0 - 148.252.75.255 gb +148.252.76.0 - 148.252.76.255 no +148.252.77.0 - 148.252.77.255 gb +148.252.78.0 - 148.252.79.255 no +148.252.80.0 - 148.252.80.255 gb +148.252.81.0 - 148.252.81.255 no +148.252.82.0 - 148.252.82.255 gb +148.252.83.0 - 148.252.83.255 no +148.252.84.0 - 148.252.84.255 gb +148.252.85.0 - 148.252.86.255 no +148.252.87.0 - 148.252.97.255 gb +148.252.98.0 - 148.252.98.255 no +148.252.99.0 - 148.252.104.255 gb +148.252.105.0 - 148.252.106.255 no +148.252.107.0 - 148.252.107.255 gb +148.252.108.0 - 148.252.109.255 no +148.252.110.0 - 148.252.111.255 gb +148.252.112.0 - 148.252.112.255 no +148.252.113.0 - 148.252.115.255 gb +148.252.116.0 - 148.252.116.255 no +148.252.117.0 - 148.252.117.255 gb +148.252.118.0 - 148.252.118.255 no +148.252.119.0 - 148.252.119.255 gb +148.252.120.0 - 148.252.120.255 no +148.252.121.0 - 148.253.255.255 gb 148.254.0.0 - 148.254.255.255 us +148.255.0.0 - 148.255.255.255 do 149.0.0.0 - 149.0.255.255 tr 149.1.0.0 - 149.2.255.255 us 149.3.0.0 - 149.3.127.255 ge @@ -69947,20 +52961,220 @@ 149.3.144.0 - 149.3.151.255 it 149.3.152.0 - 149.3.159.255 lb 149.3.160.0 - 149.3.175.255 sa -149.3.176.0 - 149.3.177.255 it -149.3.178.0 - 149.3.178.255 de -149.3.179.0 - 149.3.183.255 it +149.3.176.0 - 149.3.178.255 it +149.3.179.0 - 149.3.179.255 gr +149.3.180.0 - 149.3.183.255 it 149.3.184.0 - 149.3.191.255 md 149.3.192.0 - 149.3.255.255 kz -149.4.0.0 - 149.26.255.255 us +149.4.0.0 - 149.5.0.127 us +149.5.0.128 - 149.5.0.159 nl +149.5.0.160 - 149.5.21.127 us +149.5.21.128 - 149.5.21.159 be +149.5.21.160 - 149.5.31.255 us +149.5.32.0 - 149.5.32.255 ie +149.5.33.0 - 149.5.34.255 us +149.5.35.0 - 149.5.38.255 ie +149.5.39.0 - 149.5.40.255 us +149.5.41.0 - 149.5.41.255 ie +149.5.42.0 - 149.5.46.255 us +149.5.47.0 - 149.5.47.255 ie +149.5.48.0 - 149.5.64.255 us +149.5.65.0 - 149.5.65.255 gb +149.5.66.0 - 149.5.69.127 us +149.5.69.128 - 149.5.69.191 gb +149.5.69.192 - 149.5.88.255 us +149.5.89.0 - 149.5.89.255 gb +149.5.90.0 - 149.5.109.255 us +149.5.110.0 - 149.5.113.255 gb +149.5.114.0 - 149.5.129.255 us +149.5.130.0 - 149.5.130.255 gb +149.5.131.0 - 149.5.147.255 us +149.5.148.0 - 149.5.148.0 fi +149.5.148.1 - 149.5.176.15 us +149.5.176.16 - 149.5.176.23 pl +149.5.176.24 - 149.5.186.255 us +149.5.187.0 - 149.5.187.255 hr +149.5.188.0 - 149.5.218.7 us +149.5.218.8 - 149.5.218.15 ch +149.5.218.16 - 149.5.226.255 us +149.5.227.0 - 149.5.227.127 fr +149.5.227.128 - 149.5.227.255 us +149.5.228.0 - 149.5.228.255 fr +149.5.229.0 - 149.5.247.255 us +149.5.248.0 - 149.5.255.255 fi +149.6.0.0 - 149.6.1.255 us +149.6.2.0 - 149.6.2.255 gb +149.6.3.0 - 149.6.3.255 us +149.6.4.0 - 149.6.4.255 ie +149.6.5.0 - 149.6.12.63 us +149.6.12.64 - 149.6.12.71 gb +149.6.12.72 - 149.6.16.255 us +149.6.17.0 - 149.6.17.255 es +149.6.18.0 - 149.6.44.255 us +149.6.45.0 - 149.6.45.255 gb +149.6.46.0 - 149.6.52.16 us +149.6.52.17 - 149.6.52.18 si +149.6.52.19 - 149.6.54.191 us +149.6.54.192 - 149.6.54.199 ch +149.6.54.200 - 149.6.56.255 us +149.6.57.0 - 149.6.57.255 es +149.6.58.0 - 149.6.90.15 us +149.6.90.16 - 149.6.90.19 fr +149.6.90.20 - 149.6.106.15 us +149.6.106.16 - 149.6.106.23 es +149.6.106.24 - 149.6.110.55 us +149.6.110.56 - 149.6.110.63 nl +149.6.110.64 - 149.6.113.255 us +149.6.114.0 - 149.6.114.255 fr +149.6.115.0 - 149.6.115.39 us +149.6.115.40 - 149.6.115.47 fr +149.6.115.48 - 149.6.123.153 us +149.6.123.154 - 149.6.123.154 gb +149.6.123.155 - 149.6.129.255 us +149.6.130.0 - 149.6.130.255 es +149.6.131.0 - 149.6.145.255 us +149.6.146.0 - 149.6.146.255 es +149.6.147.0 - 149.6.150.37 us +149.6.150.38 - 149.6.150.38 es +149.6.150.39 - 149.6.153.223 us +149.6.153.224 - 149.6.153.231 it +149.6.153.232 - 149.6.154.223 us +149.6.154.224 - 149.6.154.231 fr +149.6.154.232 - 149.6.160.255 us +149.6.161.0 - 149.6.161.255 fr +149.6.162.0 - 149.6.163.255 us +149.6.164.0 - 149.6.164.255 fr +149.6.165.0 - 149.6.165.255 us +149.6.166.0 - 149.6.167.255 fr +149.6.168.0 - 149.6.184.255 us +149.6.185.0 - 149.6.185.255 gb +149.6.186.0 - 149.6.186.255 us +149.6.187.0 - 149.6.187.255 gb +149.6.188.0 - 149.6.191.255 us +149.6.192.0 - 149.6.195.255 es +149.6.196.0 - 149.6.198.255 us +149.6.199.0 - 149.6.200.255 es +149.6.201.0 - 149.7.31.255 us +149.7.32.0 - 149.7.32.255 gb +149.7.33.0 - 149.7.35.255 us +149.7.36.0 - 149.7.36.255 gb +149.7.37.0 - 149.7.43.255 us +149.7.44.0 - 149.7.44.255 gb +149.7.45.0 - 149.7.46.255 us +149.7.47.0 - 149.7.49.255 gb +149.7.50.0 - 149.7.50.255 us +149.7.51.0 - 149.7.51.255 gb +149.7.52.0 - 149.7.57.223 us +149.7.57.224 - 149.7.57.255 gb +149.7.58.0 - 149.7.95.255 us +149.7.96.0 - 149.7.96.255 fr +149.7.97.0 - 149.7.97.255 us +149.7.98.0 - 149.7.98.255 fr +149.7.99.0 - 149.7.103.255 us +149.7.104.0 - 149.7.104.255 fr +149.7.105.0 - 149.7.111.255 us +149.7.112.0 - 149.7.112.255 de +149.7.113.0 - 149.7.194.255 us +149.7.195.0 - 149.7.195.255 at +149.7.196.0 - 149.7.216.207 us +149.7.216.208 - 149.7.216.239 es +149.7.216.240 - 149.7.216.255 us +149.7.217.0 - 149.7.223.255 es +149.7.224.0 - 149.8.247.255 us +149.8.248.0 - 149.8.248.255 in +149.8.249.0 - 149.8.251.255 us +149.8.252.0 - 149.8.252.255 gb +149.8.253.0 - 149.11.26.13 us +149.11.26.14 - 149.11.26.14 gr +149.11.26.15 - 149.11.35.255 us +149.11.36.0 - 149.11.37.255 ie +149.11.38.0 - 149.11.44.255 us +149.11.45.0 - 149.11.45.255 gb +149.11.46.0 - 149.11.65.31 us +149.11.65.32 - 149.11.65.35 nl +149.11.65.36 - 149.11.99.255 us +149.11.100.0 - 149.11.100.255 fr +149.11.101.0 - 149.11.107.255 us +149.11.108.0 - 149.11.108.255 gb +149.11.109.0 - 149.11.110.139 us +149.11.110.140 - 149.11.110.247 de +149.11.110.248 - 149.11.113.255 us +149.11.114.0 - 149.11.114.255 fr +149.11.115.0 - 149.11.127.255 us +149.11.128.0 - 149.11.128.255 fr +149.11.129.0 - 149.11.141.255 us +149.11.142.0 - 149.11.143.255 gb +149.11.144.0 - 149.11.144.255 es +149.11.145.0 - 149.11.159.255 us +149.11.160.0 - 149.11.161.255 gb +149.11.162.0 - 149.11.166.103 us +149.11.166.104 - 149.11.166.107 gb +149.11.166.108 - 149.11.170.87 us +149.11.170.88 - 149.11.170.95 be +149.11.170.96 - 149.11.255.255 us +149.12.0.0 - 149.12.15.255 gb +149.12.16.0 - 149.12.17.255 us +149.12.18.0 - 149.12.19.255 ch +149.12.20.0 - 149.12.67.255 us +149.12.68.0 - 149.12.68.255 es +149.12.69.0 - 149.12.95.255 us +149.12.96.0 - 149.12.96.255 it +149.12.97.0 - 149.12.180.31 us +149.12.180.32 - 149.12.180.63 gb +149.12.180.64 - 149.12.183.255 us +149.12.184.0 - 149.12.187.255 gb +149.12.188.0 - 149.12.207.255 us +149.12.208.0 - 149.12.208.255 fr +149.12.209.0 - 149.12.215.255 us +149.12.216.0 - 149.12.219.255 es +149.12.220.0 - 149.12.222.133 us +149.12.222.134 - 149.12.222.134 es +149.12.222.135 - 149.13.23.255 us +149.13.24.0 - 149.13.27.255 es +149.13.28.0 - 149.13.34.255 us +149.13.35.0 - 149.13.35.255 eu +149.13.36.0 - 149.13.36.95 us +149.13.36.96 - 149.13.36.103 lu +149.13.36.104 - 149.13.96.31 us +149.13.96.32 - 149.13.96.39 pl +149.13.96.40 - 149.13.98.255 us +149.13.99.0 - 149.13.99.255 pl +149.13.100.0 - 149.13.111.255 us +149.13.112.0 - 149.13.112.255 fr +149.13.113.0 - 149.13.119.255 us +149.13.120.0 - 149.13.127.255 fr +149.13.128.0 - 149.13.144.255 us +149.13.145.0 - 149.13.146.255 it +149.13.147.0 - 149.13.147.255 us +149.13.148.0 - 149.13.151.255 it +149.13.152.0 - 149.13.241.255 us +149.13.242.0 - 149.13.249.255 ie +149.13.250.0 - 149.14.3.255 us +149.14.4.0 - 149.14.4.255 es +149.14.5.0 - 149.14.20.255 us +149.14.21.0 - 149.14.21.255 gb +149.14.22.0 - 149.14.65.255 us +149.14.66.0 - 149.14.66.255 de +149.14.67.0 - 149.14.80.47 us +149.14.80.48 - 149.14.80.55 gb +149.14.80.56 - 149.17.255.255 us +149.18.0.0 - 149.18.191.255 gb +149.18.192.0 - 149.24.153.255 us +149.24.154.0 - 149.24.154.255 in +149.24.155.0 - 149.26.255.255 us 149.27.0.0 - 149.27.255.255 kz -149.28.0.0 - 149.48.255.255 us -149.49.0.0 - 149.49.255.255 il -149.50.0.0 - 149.58.255.255 us +149.28.0.0 - 149.33.255.255 us +149.34.0.0 - 149.34.15.255 lu +149.34.16.0 - 149.34.31.255 us +149.34.32.0 - 149.34.47.255 es +149.34.48.0 - 149.48.255.255 us +149.49.0.0 - 149.50.255.255 il +149.51.0.0 - 149.53.255.255 us +149.54.0.0 - 149.54.127.255 af +149.54.128.0 - 149.58.255.255 us 149.59.0.0 - 149.59.255.255 nl 149.60.0.0 - 149.61.255.255 us 149.62.0.0 - 149.62.31.255 ru -149.62.32.0 - 149.62.47.255 es 149.62.48.0 - 149.62.55.255 ru 149.62.56.0 - 149.62.63.255 de 149.62.64.0 - 149.62.127.255 si @@ -69971,9 +53185,98 @@ 149.62.168.0 - 149.62.183.255 es 149.62.184.0 - 149.62.191.255 it 149.62.192.0 - 149.62.255.255 bg -149.63.0.0 - 149.98.255.255 us +149.63.0.0 - 149.66.195.255 us +149.66.196.0 - 149.66.196.255 es +149.66.197.0 - 149.71.56.255 us +149.71.57.0 - 149.71.59.255 es +149.71.60.0 - 149.71.63.255 us +149.71.64.0 - 149.71.95.255 hr +149.71.96.0 - 149.71.111.255 es +149.71.112.0 - 149.71.127.255 us +149.71.128.0 - 149.71.159.255 it +149.71.160.0 - 149.71.160.255 us +149.71.161.0 - 149.71.162.255 ie +149.71.163.0 - 149.78.6.114 us +149.78.6.115 - 149.78.6.115 il +149.78.6.116 - 149.78.10.118 us +149.78.10.119 - 149.78.10.119 il +149.78.10.120 - 149.78.11.255 us +149.78.12.0 - 149.78.12.255 il +149.78.13.0 - 149.78.14.255 us +149.78.15.0 - 149.78.15.255 il +149.78.16.0 - 149.78.20.255 us +149.78.21.0 - 149.78.21.255 il +149.78.22.0 - 149.78.23.255 us +149.78.24.0 - 149.78.25.255 il +149.78.26.0 - 149.78.35.255 us +149.78.36.0 - 149.78.36.255 il +149.78.37.0 - 149.78.37.255 us +149.78.38.0 - 149.78.38.255 il +149.78.39.0 - 149.78.44.255 us +149.78.45.0 - 149.78.45.255 il +149.78.46.0 - 149.78.47.255 us +149.78.48.0 - 149.78.48.255 il +149.78.49.0 - 149.78.69.255 us +149.78.70.0 - 149.78.70.255 il +149.78.71.0 - 149.78.75.255 us +149.78.76.0 - 149.78.76.255 il +149.78.77.0 - 149.78.83.255 us +149.78.84.0 - 149.78.84.255 il +149.78.85.0 - 149.78.94.237 us +149.78.94.238 - 149.78.94.238 il +149.78.94.239 - 149.78.95.255 us +149.78.96.0 - 149.78.97.255 il +149.78.98.0 - 149.78.103.255 us +149.78.104.0 - 149.78.107.255 il +149.78.108.0 - 149.78.111.24 us +149.78.111.25 - 149.78.111.25 il +149.78.111.26 - 149.78.115.255 us +149.78.116.0 - 149.78.116.255 il +149.78.117.0 - 149.78.127.255 us +149.78.128.0 - 149.78.255.255 il +149.79.0.0 - 149.86.63.255 us +149.86.64.0 - 149.86.71.255 ie +149.86.72.0 - 149.86.95.255 us +149.86.96.0 - 149.86.103.255 gb +149.86.104.0 - 149.86.109.255 us +149.86.110.0 - 149.86.111.255 es +149.86.112.0 - 149.86.127.255 nl +149.86.128.0 - 149.86.159.255 us +149.86.160.0 - 149.86.167.255 nl +149.86.168.0 - 149.86.183.255 us +149.86.184.0 - 149.86.191.255 fr +149.86.192.0 - 149.86.239.255 us +149.86.240.0 - 149.86.243.255 ua +149.86.244.0 - 149.86.247.255 us +149.86.248.0 - 149.86.255.255 fi +149.87.0.0 - 149.87.255.255 us +149.88.0.0 - 149.88.255.255 il +149.89.0.0 - 149.91.79.255 us +149.91.80.0 - 149.91.83.255 fr +149.91.84.0 - 149.91.87.255 us +149.91.88.0 - 149.91.91.255 fr +149.91.92.0 - 149.91.95.255 us +149.91.96.0 - 149.91.135.255 es +149.91.136.0 - 149.98.255.255 us 149.99.0.0 - 149.99.255.255 ca -149.100.0.0 - 149.125.255.255 us +149.100.0.0 - 149.100.0.255 es +149.100.1.0 - 149.100.5.255 us +149.100.6.0 - 149.100.8.255 es +149.100.9.0 - 149.100.160.255 us +149.100.161.0 - 149.100.161.255 it +149.100.162.0 - 149.100.167.255 us +149.100.168.0 - 149.100.175.255 it +149.100.176.0 - 149.101.255.255 us +149.102.0.0 - 149.102.31.255 es +149.102.32.0 - 149.102.35.255 fr +149.102.36.0 - 149.102.63.255 es +149.102.64.0 - 149.102.95.255 no +149.102.96.0 - 149.102.127.255 es +149.102.128.0 - 149.102.159.255 gb +149.102.160.0 - 149.102.255.255 es +149.103.0.0 - 149.111.175.255 us +149.111.176.0 - 149.111.176.255 in +149.111.177.0 - 149.125.255.255 us 149.126.0.0 - 149.126.7.255 ch 149.126.8.0 - 149.126.15.255 es 149.126.16.0 - 149.126.23.255 ru @@ -69982,8 +53285,15 @@ 149.126.48.0 - 149.126.55.255 ch 149.126.56.0 - 149.126.63.255 be 149.126.64.0 - 149.126.71.255 de -149.126.72.0 - 149.126.72.255 gb -149.126.73.0 - 149.126.79.255 il +149.126.72.0 - 149.126.72.255 nl +149.126.73.0 - 149.126.73.37 il +149.126.73.38 - 149.126.73.38 us +149.126.73.39 - 149.126.73.255 il +149.126.74.0 - 149.126.74.255 gb +149.126.75.0 - 149.126.75.0 nl +149.126.75.1 - 149.126.76.255 gb +149.126.77.0 - 149.126.78.255 de +149.126.79.0 - 149.126.79.255 gb 149.126.80.0 - 149.126.87.255 is 149.126.88.0 - 149.126.95.255 ps 149.126.96.0 - 149.126.103.255 ru @@ -69995,10 +53305,14 @@ 149.126.176.0 - 149.126.183.255 fi 149.126.184.0 - 149.126.191.255 de 149.126.192.0 - 149.126.255.255 ru -149.127.0.0 - 149.131.255.255 us +149.127.0.0 - 149.128.255.255 us +149.129.0.0 - 149.129.255.255 my +149.130.0.0 - 149.131.255.255 us 149.132.0.0 - 149.132.255.255 it 149.133.0.0 - 149.133.255.255 ch -149.134.0.0 - 149.134.255.255 be +149.134.0.0 - 149.134.172.255 be +149.134.173.0 - 149.134.173.255 us +149.134.174.0 - 149.134.255.255 be 149.135.0.0 - 149.135.255.255 au 149.136.0.0 - 149.138.255.255 us 149.139.0.0 - 149.139.255.255 it @@ -70021,41 +53335,12 @@ 149.154.120.0 - 149.154.127.255 fi 149.154.128.0 - 149.154.143.255 ru 149.154.144.0 - 149.154.151.255 de -149.154.152.0 - 149.154.156.17 at -149.154.156.18 - 149.154.156.18 me -149.154.156.19 - 149.154.156.19 ir -149.154.156.20 - 149.154.156.20 iq -149.154.156.21 - 149.154.156.21 aq -149.154.156.22 - 149.154.156.22 mp -149.154.156.23 - 149.154.156.23 bt -149.154.156.24 - 149.154.156.24 kp -149.154.156.25 - 149.154.156.25 ky -149.154.156.26 - 149.154.156.26 bs -149.154.156.27 - 149.154.156.27 cu -149.154.156.28 - 149.154.156.28 so -149.154.156.29 - 149.154.156.29 sz -149.154.156.30 - 149.154.156.30 na -149.154.156.31 - 149.154.156.31 am -149.154.156.32 - 149.154.156.33 cn -149.154.156.34 - 149.154.156.51 at -149.154.156.52 - 149.154.156.55 kp -149.154.156.56 - 149.154.156.57 ag -149.154.156.58 - 149.154.156.59 vi -149.154.156.60 - 149.154.156.60 ki -149.154.156.61 - 149.154.156.61 vu -149.154.156.62 - 149.154.156.62 tk -149.154.156.63 - 149.154.156.65 im -149.154.156.66 - 149.154.156.89 at -149.154.156.90 - 149.154.156.97 si -149.154.156.98 - 149.154.156.255 at +149.154.152.0 - 149.154.156.255 at 149.154.157.0 - 149.154.157.255 it 149.154.158.0 - 149.154.158.255 us -149.154.159.0 - 149.154.159.125 de -149.154.159.126 - 149.154.159.126 fr -149.154.159.127 - 149.154.159.127 nl -149.154.159.128 - 149.154.159.128 fr -149.154.159.129 - 149.154.159.255 de -149.154.160.0 - 149.154.191.255 ua +149.154.159.0 - 149.154.159.255 de +149.154.160.0 - 149.154.175.255 gb +149.154.176.0 - 149.154.191.255 ua 149.154.192.0 - 149.154.255.255 be 149.155.0.0 - 149.155.255.255 gb 149.156.0.0 - 149.156.255.255 pl @@ -70073,19 +53358,80 @@ 149.198.0.0 - 149.199.255.255 us 149.200.0.0 - 149.200.127.255 hu 149.200.128.0 - 149.200.255.255 jo -149.201.0.0 - 149.208.255.255 de +149.201.0.0 - 149.201.255.255 de +149.202.0.0 - 149.202.4.211 fr +149.202.4.212 - 149.202.4.215 it +149.202.4.216 - 149.202.4.223 fr +149.202.4.224 - 149.202.4.255 de +149.202.5.0 - 149.202.5.15 fr +149.202.5.16 - 149.202.5.31 be +149.202.5.32 - 149.202.5.63 es +149.202.5.64 - 149.202.5.79 fr +149.202.5.80 - 149.202.5.95 it +149.202.5.96 - 149.202.6.255 fr +149.202.7.0 - 149.202.7.7 cz +149.202.7.8 - 149.202.12.63 fr +149.202.12.64 - 149.202.12.95 es +149.202.12.96 - 149.202.17.239 fr +149.202.17.240 - 149.202.17.255 es +149.202.18.0 - 149.202.23.31 fr +149.202.23.32 - 149.202.23.63 de +149.202.23.64 - 149.202.23.207 fr +149.202.23.208 - 149.202.23.223 es +149.202.23.224 - 149.202.31.95 fr +149.202.31.96 - 149.202.31.127 gb +149.202.31.128 - 149.202.53.21 fr +149.202.53.22 - 149.202.53.22 pt +149.202.53.23 - 149.202.96.175 fr +149.202.96.176 - 149.202.96.191 de +149.202.96.192 - 149.202.96.255 nl +149.202.97.0 - 149.202.105.223 fr +149.202.105.224 - 149.202.105.255 es +149.202.106.0 - 149.202.106.31 fr +149.202.106.32 - 149.202.106.63 es +149.202.106.64 - 149.202.118.127 fr +149.202.118.128 - 149.202.118.191 it +149.202.118.192 - 149.202.119.31 fr +149.202.119.32 - 149.202.119.63 es +149.202.119.64 - 149.202.128.247 fr +149.202.128.248 - 149.202.128.255 es +149.202.129.0 - 149.202.136.95 fr +149.202.136.96 - 149.202.136.99 gb +149.202.136.100 - 149.202.139.210 fr +149.202.139.211 - 149.202.139.214 es +149.202.139.215 - 149.202.142.223 fr +149.202.142.224 - 149.202.142.255 it +149.202.143.0 - 149.202.147.239 fr +149.202.147.240 - 149.202.147.255 es +149.202.148.0 - 149.202.150.79 fr +149.202.150.80 - 149.202.150.83 de +149.202.150.84 - 149.202.152.193 fr +149.202.152.194 - 149.202.152.194 gb +149.202.152.195 - 149.202.228.223 fr +149.202.228.224 - 149.202.228.239 es +149.202.228.240 - 149.202.232.51 fr +149.202.232.52 - 149.202.232.55 cz +149.202.232.56 - 149.202.236.63 fr +149.202.236.64 - 149.202.236.95 ie +149.202.236.96 - 149.202.255.255 fr +149.203.0.0 - 149.208.255.255 de 149.209.0.0 - 149.209.255.255 no 149.210.0.0 - 149.210.127.255 gr -149.210.128.0 - 149.210.255.255 ro +149.210.128.0 - 149.210.255.255 nl 149.211.0.0 - 149.211.255.255 de 149.212.0.0 - 149.212.255.255 dk 149.213.0.0 - 149.222.255.255 de 149.223.0.0 - 149.223.255.255 gb -149.224.0.0 - 149.224.113.255 de -149.224.114.0 - 149.224.114.255 nl -149.224.115.0 - 149.240.255.255 de +149.224.0.0 - 149.226.254.255 de +149.226.255.0 - 149.226.255.255 eu +149.227.0.0 - 149.234.251.255 de +149.234.252.0 - 149.234.255.255 us +149.235.0.0 - 149.240.255.255 de 149.241.0.0 - 149.241.255.255 gb -149.242.0.0 - 149.247.255.255 de +149.242.0.0 - 149.247.175.255 de +149.247.176.0 - 149.247.177.255 dk +149.247.178.0 - 149.247.255.255 de +149.248.0.0 - 149.248.255.255 ca 149.249.0.0 - 149.250.255.255 de 149.251.0.0 - 149.251.255.255 fr 149.252.0.0 - 149.253.255.255 us @@ -70093,13 +53439,27 @@ 149.255.0.0 - 149.255.15.255 ru 149.255.16.0 - 149.255.23.255 sa 149.255.24.0 - 149.255.31.255 ru -149.255.32.0 - 149.255.36.255 us -149.255.37.0 - 149.255.37.255 nl -149.255.38.0 - 149.255.38.127 us -149.255.38.128 - 149.255.38.255 nl -149.255.39.0 - 149.255.39.255 us +149.255.32.0 - 149.255.32.127 us +149.255.32.128 - 149.255.32.191 nl +149.255.32.192 - 149.255.33.79 us +149.255.33.80 - 149.255.33.95 nl +149.255.33.96 - 149.255.33.111 us +149.255.33.112 - 149.255.33.119 nl +149.255.33.120 - 149.255.33.127 us +149.255.33.128 - 149.255.33.135 nl +149.255.33.136 - 149.255.33.207 us +149.255.33.208 - 149.255.33.239 nl +149.255.33.240 - 149.255.34.159 us +149.255.34.160 - 149.255.34.255 nl +149.255.35.0 - 149.255.35.255 us +149.255.36.0 - 149.255.36.63 nl +149.255.36.64 - 149.255.36.255 us +149.255.37.0 - 149.255.39.255 nl 149.255.40.0 - 149.255.47.255 gb -149.255.48.0 - 149.255.55.255 ch +149.255.48.0 - 149.255.48.127 ch +149.255.48.128 - 149.255.48.191 fr +149.255.48.192 - 149.255.48.223 be +149.255.48.224 - 149.255.55.255 ch 149.255.56.0 - 149.255.63.255 gb 149.255.64.0 - 149.255.95.255 cz 149.255.96.0 - 149.255.111.255 gb @@ -70116,15 +53476,97 @@ 150.0.0.0 - 150.0.255.255 cn 150.1.0.0 - 150.100.255.255 jp 150.101.0.0 - 150.101.255.255 au -150.102.0.0 - 150.105.255.255 us +150.102.0.0 - 150.104.255.255 us +150.105.0.0 - 150.105.255.255 ca 150.106.0.0 - 150.106.255.255 no +150.107.0.0 - 150.107.3.255 hk +150.107.4.0 - 150.107.7.255 kh +150.107.8.0 - 150.107.11.255 in +150.107.12.0 - 150.107.15.255 th +150.107.16.0 - 150.107.27.255 in +150.107.28.0 - 150.107.31.255 th +150.107.32.0 - 150.107.35.255 nz +150.107.36.0 - 150.107.39.255 au +150.107.40.0 - 150.107.43.255 in +150.107.44.0 - 150.107.47.255 hk +150.107.48.0 - 150.107.55.255 bd +150.107.56.0 - 150.107.67.255 tw +150.107.68.0 - 150.107.71.255 kr +150.107.72.0 - 150.107.75.255 au +150.107.76.0 - 150.107.79.255 my +150.107.80.0 - 150.107.87.255 kr +150.107.88.0 - 150.107.103.255 in +150.107.104.0 - 150.107.105.255 id +150.107.106.0 - 150.107.107.255 in +150.107.108.0 - 150.107.111.255 id +150.107.112.0 - 150.107.123.255 in +150.107.124.0 - 150.107.131.255 sg +150.107.132.0 - 150.107.143.255 id +150.107.144.0 - 150.107.147.255 in +150.107.148.0 - 150.107.151.255 id +150.107.152.0 - 150.107.155.255 sg +150.107.156.0 - 150.107.159.255 my +150.107.160.0 - 150.107.163.255 nz +150.107.164.0 - 150.107.171.255 in +150.107.172.0 - 150.107.175.255 nz +150.107.176.0 - 150.107.199.255 in +150.107.200.0 - 150.107.203.255 hk +150.107.204.0 - 150.107.207.255 np +150.107.208.0 - 150.107.243.255 in +150.107.244.0 - 150.107.251.255 id +150.107.252.0 - 150.107.255.255 in 150.108.0.0 - 150.114.255.255 us 150.115.0.0 - 150.115.255.255 cn 150.116.0.0 - 150.117.255.255 tw 150.118.0.0 - 150.120.255.255 us 150.121.0.0 - 150.122.255.255 cn -150.123.0.0 - 150.127.255.255 us +150.123.0.0 - 150.127.224.255 us +150.127.225.0 - 150.127.225.239 gb +150.127.225.240 - 150.127.225.255 eu +150.127.226.0 - 150.127.255.255 us 150.128.0.0 - 150.128.255.255 es +150.129.0.0 - 150.129.3.255 in +150.129.4.0 - 150.129.7.255 pk +150.129.8.0 - 150.129.11.255 nl +150.129.12.0 - 150.129.15.255 au +150.129.16.0 - 150.129.17.255 bd +150.129.18.0 - 150.129.18.255 id +150.129.19.0 - 150.129.19.255 in +150.129.20.0 - 150.129.23.255 kh +150.129.24.0 - 150.129.31.255 in +150.129.32.0 - 150.129.35.255 hk +150.129.36.0 - 150.129.39.255 tw +150.129.40.0 - 150.129.43.255 hk +150.129.44.0 - 150.129.55.255 in +150.129.56.0 - 150.129.59.255 id +150.129.60.0 - 150.129.67.255 in +150.129.68.0 - 150.129.71.255 my +150.129.72.0 - 150.129.75.255 tw +150.129.76.0 - 150.129.83.255 hk +150.129.84.0 - 150.129.87.255 au +150.129.88.0 - 150.129.91.255 in +150.129.92.0 - 150.129.95.255 au +150.129.96.0 - 150.129.99.255 tw +150.129.100.0 - 150.129.135.255 in +150.129.136.0 - 150.129.139.255 cn +150.129.140.0 - 150.129.143.255 mn +150.129.144.0 - 150.129.151.255 in +150.129.152.0 - 150.129.155.255 cn +150.129.156.0 - 150.129.159.255 in +150.129.160.0 - 150.129.163.255 id +150.129.164.0 - 150.129.183.255 in +150.129.184.0 - 150.129.187.255 my +150.129.188.0 - 150.129.191.255 id +150.129.192.0 - 150.129.195.255 cn +150.129.196.0 - 150.129.207.255 in +150.129.208.0 - 150.129.211.255 hk +150.129.212.0 - 150.129.215.255 in +150.129.216.0 - 150.129.219.255 cn +150.129.220.0 - 150.129.223.255 bd +150.129.224.0 - 150.129.227.255 kr +150.129.228.0 - 150.129.231.255 tw +150.129.232.0 - 150.129.251.255 in +150.129.252.0 - 150.129.255.255 cn 150.130.0.0 - 150.131.255.255 us 150.132.0.0 - 150.132.255.255 se 150.133.0.0 - 150.137.255.255 us @@ -70175,6 +53617,42 @@ 150.237.0.0 - 150.237.255.255 gb 150.238.0.0 - 150.240.255.255 us 150.241.0.0 - 150.241.255.255 es +150.242.0.0 - 150.242.11.255 cn +150.242.12.0 - 150.242.27.255 in +150.242.28.0 - 150.242.31.255 cn +150.242.32.0 - 150.242.35.255 au +150.242.36.0 - 150.242.39.255 hk +150.242.40.0 - 150.242.43.255 nz +150.242.44.0 - 150.242.59.255 cn +150.242.60.0 - 150.242.75.255 in +150.242.76.0 - 150.242.83.255 cn +150.242.84.0 - 150.242.91.255 in +150.242.92.0 - 150.242.99.255 cn +150.242.100.0 - 150.242.103.255 tw +150.242.104.0 - 150.242.107.255 bd +150.242.108.0 - 150.242.111.255 tl +150.242.112.0 - 150.242.123.255 cn +150.242.124.0 - 150.242.127.255 hk +150.242.128.0 - 150.242.131.255 nz +150.242.132.0 - 150.242.135.255 kr +150.242.136.0 - 150.242.139.255 au +150.242.140.0 - 150.242.141.255 in +150.242.142.0 - 150.242.143.255 ae +150.242.144.0 - 150.242.147.255 kr +150.242.148.0 - 150.242.151.255 in +150.242.152.0 - 150.242.171.255 cn +150.242.172.0 - 150.242.179.255 in +150.242.180.0 - 150.242.183.255 my +150.242.184.0 - 150.242.195.255 cn +150.242.196.0 - 150.242.207.255 in +150.242.208.0 - 150.242.211.255 hk +150.242.212.0 - 150.242.215.255 cn +150.242.216.0 - 150.242.219.255 hk +150.242.220.0 - 150.242.223.255 us +150.242.224.0 - 150.242.227.255 cn +150.242.228.0 - 150.242.231.255 hk +150.242.232.0 - 150.242.251.255 cn +150.242.252.0 - 150.242.255.255 in 150.243.0.0 - 150.243.255.255 us 150.244.0.0 - 150.244.255.255 es 150.245.0.0 - 150.250.255.255 us @@ -70182,7 +53660,100 @@ 150.252.0.0 - 150.253.255.255 us 150.254.0.0 - 150.254.255.255 pl 150.255.0.0 - 150.255.255.255 cn -151.0.0.0 - 151.100.255.255 it +151.0.0.0 - 151.0.31.255 ua +151.0.32.0 - 151.0.39.255 bg +151.0.40.0 - 151.0.63.255 ua +151.0.64.0 - 151.0.127.255 hu +151.0.128.0 - 151.79.255.255 it +151.80.0.0 - 151.80.9.167 fr +151.80.9.168 - 151.80.9.175 es +151.80.9.176 - 151.80.10.215 fr +151.80.10.216 - 151.80.10.223 es +151.80.10.224 - 151.80.13.203 fr +151.80.13.204 - 151.80.13.207 de +151.80.13.208 - 151.80.13.215 es +151.80.13.216 - 151.80.13.219 fr +151.80.13.220 - 151.80.13.223 de +151.80.13.224 - 151.80.15.67 fr +151.80.15.68 - 151.80.15.71 gb +151.80.15.72 - 151.80.41.142 fr +151.80.41.143 - 151.80.41.143 nl +151.80.41.144 - 151.80.65.223 fr +151.80.65.224 - 151.80.65.239 es +151.80.65.240 - 151.80.66.39 fr +151.80.66.40 - 151.80.66.43 de +151.80.66.44 - 151.80.67.255 fr +151.80.68.0 - 151.80.68.7 es +151.80.68.8 - 151.80.89.247 fr +151.80.89.248 - 151.80.89.255 de +151.80.90.0 - 151.80.94.127 fr +151.80.94.128 - 151.80.94.143 es +151.80.94.144 - 151.80.123.243 fr +151.80.123.244 - 151.80.123.247 de +151.80.123.248 - 151.80.162.47 fr +151.80.162.48 - 151.80.162.71 es +151.80.162.72 - 151.80.169.95 fr +151.80.169.96 - 151.80.169.111 es +151.80.169.112 - 151.80.170.119 fr +151.80.170.120 - 151.80.170.123 de +151.80.170.124 - 151.80.170.127 fr +151.80.170.128 - 151.80.170.139 de +151.80.170.140 - 151.80.170.203 fr +151.80.170.204 - 151.80.170.211 de +151.80.170.212 - 151.80.170.255 fr +151.80.171.0 - 151.80.171.127 be +151.80.171.128 - 151.80.172.255 fr +151.80.173.0 - 151.80.173.255 cz +151.80.174.0 - 151.80.177.207 fr +151.80.177.208 - 151.80.177.223 es +151.80.177.224 - 151.80.178.175 fr +151.80.178.176 - 151.80.178.191 de +151.80.178.192 - 151.80.180.15 fr +151.80.180.16 - 151.80.180.47 be +151.80.180.48 - 151.80.184.167 fr +151.80.184.168 - 151.80.184.175 de +151.80.184.176 - 151.80.185.135 fr +151.80.185.136 - 151.80.185.139 de +151.80.185.140 - 151.80.185.203 fr +151.80.185.204 - 151.80.185.207 de +151.80.185.208 - 151.80.185.247 fr +151.80.185.248 - 151.80.185.251 de +151.80.185.252 - 151.80.186.87 fr +151.80.186.88 - 151.80.186.91 de +151.80.186.92 - 151.80.189.255 fr +151.80.190.0 - 151.80.190.3 de +151.80.190.4 - 151.80.190.47 fr +151.80.190.48 - 151.80.190.51 de +151.80.190.52 - 151.80.190.119 fr +151.80.190.120 - 151.80.190.123 de +151.80.190.124 - 151.80.190.143 fr +151.80.190.144 - 151.80.190.147 de +151.80.190.148 - 151.80.196.55 fr +151.80.196.56 - 151.80.196.59 de +151.80.196.60 - 151.80.198.143 fr +151.80.198.144 - 151.80.198.147 cz +151.80.198.148 - 151.80.198.195 fr +151.80.198.196 - 151.80.198.199 de +151.80.198.200 - 151.80.198.203 es +151.80.198.204 - 151.80.200.231 fr +151.80.200.232 - 151.80.200.235 es +151.80.200.236 - 151.80.211.3 fr +151.80.211.4 - 151.80.211.7 it +151.80.211.8 - 151.80.212.191 fr +151.80.212.192 - 151.80.212.207 es +151.80.212.208 - 151.80.213.111 fr +151.80.213.112 - 151.80.213.115 ro +151.80.213.116 - 151.80.218.43 fr +151.80.218.44 - 151.80.218.47 de +151.80.218.48 - 151.80.219.63 fr +151.80.219.64 - 151.80.219.95 nl +151.80.219.96 - 151.80.237.131 fr +151.80.237.132 - 151.80.237.135 it +151.80.237.136 - 151.80.243.143 fr +151.80.243.144 - 151.80.243.159 nl +151.80.243.160 - 151.80.243.191 de +151.80.243.192 - 151.80.255.255 fr +151.81.0.0 - 151.100.255.255 it 151.101.0.0 - 151.104.255.255 us 151.105.0.0 - 151.105.255.255 fi 151.106.0.0 - 151.114.255.255 us @@ -70190,22 +53761,21 @@ 151.116.0.0 - 151.119.255.255 us 151.120.0.0 - 151.120.255.255 ch 151.121.0.0 - 151.126.255.255 us -151.127.0.0 - 151.127.255.255 ch +151.127.0.0 - 151.127.255.255 pl 151.128.0.0 - 151.128.255.255 us 151.129.0.0 - 151.129.255.255 gb 151.130.0.0 - 151.130.255.255 au 151.131.0.0 - 151.132.255.255 us 151.133.0.0 - 151.133.255.255 gb 151.134.0.0 - 151.134.255.255 us +151.135.0.0 - 151.135.255.255 tr 151.136.0.0 - 151.136.255.255 de 151.137.0.0 - 151.155.255.255 us 151.156.0.0 - 151.156.255.255 se 151.157.0.0 - 151.157.255.255 no -151.158.0.0 - 151.158.255.255 jp 151.159.0.0 - 151.169.255.255 us 151.170.0.0 - 151.170.255.255 gb 151.171.0.0 - 151.171.255.255 us -151.172.0.0 - 151.172.255.255 jp 151.173.0.0 - 151.174.255.255 us 151.175.0.0 - 151.175.255.255 eu 151.176.0.0 - 151.176.255.255 gb @@ -70214,21 +53784,135 @@ 151.179.0.0 - 151.179.255.255 us 151.180.0.0 - 151.180.255.255 gb 151.181.0.0 - 151.181.255.255 us -151.182.0.0 - 151.182.255.255 gb -151.183.0.0 - 151.183.255.255 ch +151.182.0.0 - 151.182.255.255 es +151.183.0.0 - 151.183.0.255 se +151.183.1.0 - 151.183.255.255 ch 151.184.0.0 - 151.184.255.255 nl 151.185.0.0 - 151.186.255.255 us 151.187.0.0 - 151.187.255.255 no 151.188.0.0 - 151.188.255.255 us 151.189.0.0 - 151.189.255.255 de -151.190.0.0 - 151.210.255.255 us +151.190.0.0 - 151.193.119.255 us +151.193.120.0 - 151.193.120.255 eu +151.193.121.0 - 151.210.255.255 us 151.211.0.0 - 151.212.255.255 gb 151.213.0.0 - 151.215.255.255 us -152.0.0.0 - 152.65.255.255 us +151.216.32.0 - 151.216.35.255 de +151.216.36.0 - 151.216.39.255 ir +151.216.40.0 - 151.216.79.255 gb +151.216.128.0 - 151.216.255.255 no +151.224.0.0 - 151.231.255.255 gb +151.232.0.0 - 151.235.255.255 ir +151.236.0.0 - 151.236.13.255 at +151.236.14.0 - 151.236.14.255 nl +151.236.15.0 - 151.236.15.255 de +151.236.16.0 - 151.236.16.255 us +151.236.17.0 - 151.236.17.255 de +151.236.18.0 - 151.236.18.255 it +151.236.19.0 - 151.236.19.255 gb +151.236.20.0 - 151.236.20.255 hk +151.236.21.0 - 151.236.21.255 fr +151.236.22.0 - 151.236.22.255 us +151.236.23.0 - 151.236.23.255 es +151.236.24.0 - 151.236.24.255 is +151.236.25.0 - 151.236.25.255 pl +151.236.26.0 - 151.236.27.255 ch +151.236.28.0 - 151.236.29.255 nl +151.236.30.0 - 151.236.31.255 at +151.236.32.0 - 151.236.63.255 gb +151.236.64.0 - 151.236.87.255 ru +151.236.88.0 - 151.236.88.255 ua +151.236.89.0 - 151.236.127.255 ru +151.236.128.0 - 151.236.159.255 nl +151.236.160.0 - 151.236.191.255 iq +151.236.192.0 - 151.236.199.255 kz +151.236.200.0 - 151.236.207.255 se +151.236.208.0 - 151.236.223.255 gb +151.236.224.0 - 151.236.239.255 sk +151.236.240.0 - 151.236.255.255 mk +151.237.0.0 - 151.237.143.255 bg +151.237.144.0 - 151.237.159.255 kz +151.237.160.0 - 151.237.167.255 nl +151.237.168.0 - 151.237.175.255 ru +151.237.176.0 - 151.237.176.255 us +151.237.177.0 - 151.237.191.255 se +151.237.192.0 - 151.237.223.255 es +151.237.224.0 - 151.237.231.255 cz +151.237.232.0 - 151.237.239.255 gb +151.237.240.0 - 151.237.247.255 ru +151.237.248.0 - 151.237.255.255 de +151.238.0.0 - 151.247.255.255 ir +151.248.0.0 - 151.248.7.111 se +151.248.7.112 - 151.248.7.127 nl +151.248.7.128 - 151.248.7.255 se +151.248.8.0 - 151.248.15.255 it +151.248.16.0 - 151.248.23.255 be +151.248.24.0 - 151.248.24.63 de +151.248.24.64 - 151.248.26.255 a2 +151.248.27.0 - 151.248.27.255 de +151.248.28.0 - 151.248.31.255 a2 +151.248.32.0 - 151.248.47.255 pl +151.248.48.0 - 151.248.55.255 be +151.248.56.0 - 151.248.63.255 pl +151.248.64.0 - 151.248.95.255 ro +151.248.96.0 - 151.248.111.255 kw +151.248.112.0 - 151.248.127.255 ru +151.248.128.0 - 151.248.255.255 ch +151.249.0.0 - 151.249.79.255 gb +151.249.80.0 - 151.249.87.255 pl +151.249.88.0 - 151.249.88.255 fr +151.249.89.0 - 151.249.90.255 de +151.249.91.0 - 151.249.91.255 se +151.249.92.0 - 151.249.92.255 pl +151.249.93.0 - 151.249.93.255 fr +151.249.94.0 - 151.249.94.255 gb +151.249.95.0 - 151.249.95.255 fr +151.249.96.0 - 151.249.103.255 ua +151.249.104.0 - 151.249.111.255 cz +151.249.112.0 - 151.249.127.255 no +151.249.128.0 - 151.249.255.255 by +151.250.0.0 - 151.250.255.255 tr +151.251.0.0 - 151.251.255.255 bg +151.252.0.0 - 151.252.7.255 gb +151.252.8.0 - 151.252.15.255 no +151.252.16.0 - 151.252.23.255 de +151.252.24.0 - 151.252.25.239 se +151.252.25.240 - 151.252.25.255 nl +151.252.26.0 - 151.252.29.223 se +151.252.29.224 - 151.252.29.239 fi +151.252.29.240 - 151.252.30.15 se +151.252.30.16 - 151.252.30.31 fi +151.252.30.32 - 151.252.31.255 se +151.252.32.0 - 151.252.39.255 ch +151.252.40.0 - 151.252.63.255 de +151.252.64.0 - 151.252.95.255 ru +151.252.96.0 - 151.252.103.255 ps +151.252.104.0 - 151.252.111.255 ru +151.252.112.0 - 151.252.119.255 es +151.252.120.0 - 151.252.127.255 gb +151.252.128.0 - 151.252.191.255 se +151.252.192.0 - 151.252.207.255 bg +151.252.208.0 - 151.252.215.255 hr +151.252.216.0 - 151.252.223.255 de +151.252.224.0 - 151.252.255.255 hr +151.253.0.0 - 151.253.255.255 ae +151.254.0.0 - 151.255.255.255 sa +152.0.0.0 - 152.0.255.255 do +152.1.0.0 - 152.51.255.255 us +152.52.0.0 - 152.52.255.255 in +152.53.0.0 - 152.62.44.55 us +152.62.44.56 - 152.62.44.59 ap +152.62.44.60 - 152.62.108.255 us +152.62.109.0 - 152.62.109.61 eu +152.62.109.62 - 152.62.109.62 us +152.62.109.63 - 152.62.109.255 eu +152.62.110.0 - 152.65.255.255 us 152.66.0.0 - 152.66.255.255 hu 152.67.0.0 - 152.70.255.255 us 152.71.0.0 - 152.71.255.255 gb -152.72.0.0 - 152.72.255.255 us +152.72.0.0 - 152.72.129.255 us +152.72.130.0 - 152.72.130.255 eu +152.72.131.0 - 152.72.255.255 us 152.73.0.0 - 152.73.255.255 dk 152.74.0.0 - 152.74.255.255 cl 152.75.0.0 - 152.75.255.255 us @@ -70252,9 +53936,12 @@ 152.98.0.0 - 152.98.255.255 au 152.99.0.0 - 152.99.255.255 kr 152.100.0.0 - 152.100.255.255 us -152.101.0.0 - 152.101.255.255 hk +152.101.0.0 - 152.101.93.255 hk +152.101.94.0 - 152.101.96.255 sg +152.101.97.0 - 152.101.255.255 hk 152.102.0.0 - 152.102.255.255 sg -152.103.0.0 - 152.104.255.255 hk +152.103.0.0 - 152.104.127.255 hk +152.104.128.0 - 152.104.255.255 cn 152.105.0.0 - 152.105.255.255 gb 152.106.0.0 - 152.112.255.255 za 152.113.0.0 - 152.113.255.255 us @@ -70262,7 +53949,9 @@ 152.115.0.0 - 152.115.255.255 dk 152.116.0.0 - 152.117.255.255 us 152.118.0.0 - 152.118.255.255 id -152.119.0.0 - 152.133.255.255 us +152.119.0.0 - 152.130.7.195 us +152.130.7.196 - 152.130.7.196 pr +152.130.7.197 - 152.133.255.255 us 152.134.0.0 - 152.134.255.255 gb 152.135.0.0 - 152.138.255.255 us 152.139.0.0 - 152.139.255.255 cl @@ -70275,13 +53964,31 @@ 152.150.0.0 - 152.150.255.255 gb 152.151.0.0 - 152.151.255.255 us 152.152.0.0 - 152.152.255.255 be -152.153.0.0 - 152.153.255.255 nz -152.154.0.0 - 152.160.85.255 us +152.154.0.0 - 152.155.255.255 us +152.156.0.0 - 152.156.255.255 uy +152.157.0.0 - 152.160.22.255 us +152.160.23.0 - 152.160.23.255 ca +152.160.24.0 - 152.160.85.255 us 152.160.86.0 - 152.160.86.255 ca 152.160.87.0 - 152.165.255.255 us -152.176.0.0 - 152.225.255.255 us +152.166.0.0 - 152.167.255.255 do +152.168.0.0 - 152.171.255.255 ar +152.172.0.0 - 152.175.255.255 cl +152.176.0.0 - 152.199.255.255 us +152.200.0.0 - 152.205.255.255 co +152.206.0.0 - 152.207.255.255 cu +152.208.0.0 - 152.225.255.255 us 152.226.0.0 - 152.226.255.255 sg 152.227.0.0 - 152.229.255.255 us +152.230.0.0 - 152.230.255.255 cl +152.231.0.0 - 152.231.15.255 hn +152.231.16.0 - 152.231.23.255 ar +152.231.24.0 - 152.231.31.255 co +152.231.32.0 - 152.231.47.255 ni +152.231.48.0 - 152.231.63.255 ar +152.231.64.0 - 152.231.127.255 cl +152.231.128.0 - 152.231.255.255 cr +152.232.0.0 - 152.255.255.255 br 153.0.0.0 - 153.0.255.255 cn 153.1.0.0 - 153.1.255.255 fi 153.2.0.0 - 153.2.255.255 us @@ -70297,20 +54004,49 @@ 153.20.0.0 - 153.20.255.255 sg 153.21.0.0 - 153.33.255.255 us 153.34.0.0 - 153.37.255.255 cn -153.38.0.0 - 153.43.255.255 us +153.38.0.0 - 153.40.255.255 us +153.41.0.0 - 153.41.255.255 ca +153.42.0.0 - 153.43.255.255 us 153.44.0.0 - 153.44.255.255 no 153.45.0.0 - 153.46.255.255 ch -153.47.0.0 - 153.48.255.255 us +153.47.0.0 - 153.47.0.255 eu +153.47.1.0 - 153.48.255.255 us 153.49.0.0 - 153.49.255.255 be 153.50.0.0 - 153.87.255.255 us 153.88.0.0 - 153.88.255.255 se 153.89.0.0 - 153.91.255.255 us -153.92.0.0 - 153.92.4.255 eu -153.92.5.0 - 153.92.5.255 de -153.92.6.0 - 153.92.9.255 eu -153.92.10.0 - 153.92.10.255 de -153.92.11.0 - 153.92.255.255 eu -153.93.0.0 - 153.98.255.255 de +153.92.0.0 - 153.92.31.255 de +153.92.32.0 - 153.92.39.255 us +153.92.40.0 - 153.92.40.255 by +153.92.41.0 - 153.92.41.255 hk +153.92.42.0 - 153.92.42.255 de +153.92.43.0 - 153.92.43.255 hk +153.92.44.0 - 153.92.44.255 au +153.92.45.0 - 153.92.45.255 hk +153.92.46.0 - 153.92.46.252 de +153.92.46.253 - 153.92.46.253 hk +153.92.46.254 - 153.92.47.255 de +153.92.48.0 - 153.92.63.255 br +153.92.64.0 - 153.92.65.255 de +153.92.66.0 - 153.92.66.255 se +153.92.67.0 - 153.92.67.255 be +153.92.68.0 - 153.92.68.255 fr +153.92.69.0 - 153.92.69.255 ch +153.92.70.0 - 153.92.70.255 it +153.92.71.0 - 153.92.71.255 es +153.92.72.0 - 153.92.97.255 de +153.92.98.0 - 153.92.99.255 cz +153.92.100.0 - 153.92.123.255 br +153.92.124.0 - 153.92.125.255 de +153.92.126.0 - 153.92.126.255 se +153.92.127.0 - 153.92.179.255 nl +153.92.180.0 - 153.92.181.255 gr +153.92.182.0 - 153.92.187.255 nl +153.92.188.0 - 153.92.223.255 br +153.92.224.0 - 153.92.255.255 fr +153.93.0.0 - 153.97.255.255 de +153.98.0.0 - 153.98.127.255 eu +153.98.128.0 - 153.98.255.255 de 153.99.0.0 - 153.99.255.255 cn 153.100.0.0 - 153.100.255.255 de 153.101.0.0 - 153.101.255.255 cn @@ -70319,13 +54055,34 @@ 153.108.0.0 - 153.109.255.255 ch 153.110.0.0 - 153.110.255.255 no 153.111.0.0 - 153.111.255.255 nz -153.112.0.0 - 153.112.237.255 se -153.112.238.0 - 153.112.238.255 no -153.112.239.0 - 153.112.255.255 se +153.112.0.0 - 153.112.222.255 se +153.112.223.0 - 153.112.223.255 us +153.112.224.0 - 153.112.255.255 se 153.113.0.0 - 153.117.255.255 us 153.118.0.0 - 153.119.255.255 cn -153.120.0.0 - 153.255.255.255 jp -154.0.0.0 - 154.4.255.255 us +153.120.0.0 - 153.143.45.255 jp +153.143.46.0 - 153.143.63.255 us +153.143.64.0 - 153.254.85.255 jp +153.254.86.0 - 153.254.86.255 hk +153.254.87.0 - 153.254.155.255 jp +153.254.156.0 - 153.254.156.255 us +153.254.157.0 - 153.254.157.255 jp +153.254.158.0 - 153.254.158.255 us +153.254.159.0 - 153.254.161.255 jp +153.254.162.0 - 153.254.164.255 us +153.254.165.0 - 153.255.255.255 jp +154.0.0.0 - 154.0.15.255 za +154.0.16.0 - 154.0.23.255 bw +154.0.24.0 - 154.0.31.255 ci +154.0.32.0 - 154.0.63.255 ga +154.0.64.0 - 154.0.127.255 ao +154.0.128.0 - 154.0.143.255 ug +154.0.144.0 - 154.0.151.255 ng +154.0.152.0 - 154.0.159.255 tz +154.0.160.0 - 154.0.175.255 za +154.0.176.0 - 154.0.191.255 ga +154.0.192.0 - 154.0.255.255 na +154.1.0.0 - 154.4.255.255 us 154.5.0.0 - 154.5.255.255 ca 154.6.0.0 - 154.7.255.255 us 154.8.0.0 - 154.8.255.255 gb @@ -70334,33 +54091,556 @@ 154.11.0.0 - 154.11.255.255 ca 154.12.0.0 - 154.13.255.255 us 154.14.0.0 - 154.15.255.255 ch -154.16.0.0 - 154.19.255.255 us +154.16.0.0 - 154.16.0.63 au +154.16.0.64 - 154.16.0.95 de +154.16.0.96 - 154.16.0.255 za +154.16.1.0 - 154.16.1.255 us +154.16.2.0 - 154.16.2.63 au +154.16.2.64 - 154.16.2.127 de +154.16.2.128 - 154.16.2.255 za +154.16.3.0 - 154.16.3.255 us +154.16.4.0 - 154.16.4.63 au +154.16.4.64 - 154.16.4.255 za +154.16.5.0 - 154.16.5.255 us +154.16.6.0 - 154.16.6.63 au +154.16.6.64 - 154.16.6.255 za +154.16.7.0 - 154.16.7.255 us +154.16.8.0 - 154.16.8.63 au +154.16.8.64 - 154.16.8.255 za +154.16.9.0 - 154.16.9.255 us +154.16.10.0 - 154.16.10.63 au +154.16.10.64 - 154.16.10.127 de +154.16.10.128 - 154.16.10.255 za +154.16.11.0 - 154.16.11.255 us +154.16.12.0 - 154.16.12.63 kr +154.16.12.64 - 154.16.12.255 za +154.16.13.0 - 154.16.13.255 us +154.16.14.0 - 154.16.14.63 kr +154.16.14.64 - 154.16.14.255 za +154.16.15.0 - 154.16.15.255 us +154.16.16.0 - 154.16.16.63 au +154.16.16.64 - 154.16.16.255 za +154.16.17.0 - 154.16.17.255 us +154.16.18.0 - 154.16.18.63 au +154.16.18.64 - 154.16.18.127 za +154.16.18.128 - 154.16.18.255 de +154.16.19.0 - 154.16.19.255 us +154.16.20.0 - 154.16.20.63 au +154.16.20.64 - 154.16.20.255 za +154.16.21.0 - 154.16.21.255 us +154.16.22.0 - 154.16.22.63 au +154.16.22.64 - 154.16.22.255 za +154.16.23.0 - 154.16.23.255 us +154.16.24.0 - 154.16.24.63 au +154.16.24.64 - 154.16.24.255 za +154.16.25.0 - 154.16.25.255 us +154.16.26.0 - 154.16.26.63 au +154.16.26.64 - 154.16.26.255 za +154.16.27.0 - 154.16.27.255 us +154.16.28.0 - 154.16.28.63 my +154.16.28.64 - 154.16.28.255 za +154.16.29.0 - 154.16.29.255 us +154.16.30.0 - 154.16.30.63 my +154.16.30.64 - 154.16.30.255 za +154.16.31.0 - 154.16.31.255 us +154.16.32.0 - 154.16.32.63 my +154.16.32.64 - 154.16.32.255 za +154.16.33.0 - 154.16.33.255 us +154.16.34.0 - 154.16.34.63 my +154.16.34.64 - 154.16.34.255 za +154.16.35.0 - 154.16.35.255 us +154.16.36.0 - 154.16.36.63 my +154.16.36.64 - 154.16.36.255 za +154.16.37.0 - 154.16.37.255 us +154.16.38.0 - 154.16.38.63 my +154.16.38.64 - 154.16.38.255 za +154.16.39.0 - 154.16.39.255 us +154.16.40.0 - 154.16.40.63 my +154.16.40.64 - 154.16.40.255 za +154.16.41.0 - 154.16.41.255 us +154.16.42.0 - 154.16.42.63 my +154.16.42.64 - 154.16.42.95 de +154.16.42.96 - 154.16.42.255 za +154.16.43.0 - 154.16.43.255 us +154.16.44.0 - 154.16.44.63 ae +154.16.44.64 - 154.16.44.255 za +154.16.45.0 - 154.16.45.255 us +154.16.46.0 - 154.16.46.63 ae +154.16.46.64 - 154.16.46.255 za +154.16.47.0 - 154.16.47.255 us +154.16.48.0 - 154.16.48.63 ae +154.16.48.64 - 154.16.48.255 za +154.16.49.0 - 154.16.49.255 us +154.16.50.0 - 154.16.50.63 ae +154.16.50.64 - 154.16.50.255 za +154.16.51.0 - 154.16.51.255 us +154.16.52.0 - 154.16.52.63 ae +154.16.52.64 - 154.16.52.255 za +154.16.53.0 - 154.16.53.255 us +154.16.54.0 - 154.16.54.63 ae +154.16.54.64 - 154.16.54.255 za +154.16.55.0 - 154.16.55.255 us +154.16.56.0 - 154.16.56.255 za +154.16.57.0 - 154.16.57.255 us +154.16.58.0 - 154.16.58.255 za +154.16.59.0 - 154.16.59.255 us +154.16.60.0 - 154.16.60.63 ar +154.16.60.64 - 154.16.60.79 de +154.16.60.80 - 154.16.60.255 za +154.16.61.0 - 154.16.61.255 us +154.16.62.0 - 154.16.62.63 ar +154.16.62.64 - 154.16.62.255 za +154.16.63.0 - 154.16.63.255 us +154.16.64.0 - 154.16.64.255 za +154.16.65.0 - 154.16.65.255 us +154.16.66.0 - 154.16.66.255 za +154.16.67.0 - 154.16.67.255 us +154.16.68.0 - 154.16.68.63 sg +154.16.68.64 - 154.16.68.255 za +154.16.69.0 - 154.16.69.255 us +154.16.70.0 - 154.16.70.63 hk +154.16.70.64 - 154.16.70.255 za +154.16.71.0 - 154.16.71.255 us +154.16.72.0 - 154.16.72.63 sg +154.16.72.64 - 154.16.72.255 za +154.16.73.0 - 154.16.73.255 us +154.16.74.0 - 154.16.74.63 hk +154.16.74.64 - 154.16.74.255 za +154.16.75.0 - 154.16.75.255 us +154.16.76.0 - 154.16.76.63 sg +154.16.76.64 - 154.16.76.255 za +154.16.77.0 - 154.16.77.255 us +154.16.78.0 - 154.16.78.63 hk +154.16.78.64 - 154.16.78.255 za +154.16.79.0 - 154.16.79.255 us +154.16.80.0 - 154.16.80.63 sg +154.16.80.64 - 154.16.80.255 za +154.16.81.0 - 154.16.81.255 us +154.16.82.0 - 154.16.82.63 hk +154.16.82.64 - 154.16.82.255 za +154.16.83.0 - 154.16.83.255 us +154.16.84.0 - 154.16.84.63 sg +154.16.84.64 - 154.16.84.255 za +154.16.85.0 - 154.16.85.255 us +154.16.86.0 - 154.16.86.63 hk +154.16.86.64 - 154.16.86.255 za +154.16.87.0 - 154.16.87.255 us +154.16.88.0 - 154.16.88.63 sg +154.16.88.64 - 154.16.88.255 za +154.16.89.0 - 154.16.89.255 us +154.16.90.0 - 154.16.90.63 hk +154.16.90.64 - 154.16.90.255 za +154.16.91.0 - 154.16.91.255 us +154.16.92.0 - 154.16.92.63 sg +154.16.92.64 - 154.16.92.255 za +154.16.93.0 - 154.16.93.255 us +154.16.94.0 - 154.16.94.63 hk +154.16.94.64 - 154.16.94.95 de +154.16.94.96 - 154.16.94.255 za +154.16.95.0 - 154.16.95.255 sg +154.16.96.0 - 154.16.96.255 za +154.16.97.0 - 154.16.138.255 us +154.16.139.0 - 154.16.139.255 ke +154.16.140.0 - 154.16.157.255 us +154.16.158.0 - 154.16.158.255 es +154.16.159.0 - 154.19.255.255 us 154.20.0.0 - 154.20.255.255 ca -154.21.0.0 - 154.31.255.255 us +154.21.0.0 - 154.25.3.8 us +154.25.3.9 - 154.25.3.10 si +154.25.3.11 - 154.25.3.36 us +154.25.3.37 - 154.25.3.38 si +154.25.3.39 - 154.31.255.255 us 154.32.0.0 - 154.32.255.255 gb 154.33.0.0 - 154.34.255.255 jp -154.35.0.0 - 154.64.255.255 us +154.35.0.0 - 154.41.1.255 us +154.41.2.0 - 154.41.3.255 ua +154.41.4.0 - 154.42.143.255 us +154.42.144.0 - 154.42.159.255 il +154.42.160.0 - 154.42.167.255 gb +154.42.168.0 - 154.43.3.255 us +154.43.4.0 - 154.43.7.255 es +154.43.8.0 - 154.43.135.255 us +154.43.136.0 - 154.43.143.255 se +154.43.144.0 - 154.43.223.255 us +154.43.224.0 - 154.43.224.31 fr +154.43.224.32 - 154.44.139.255 us +154.44.140.0 - 154.44.143.255 es +154.44.144.0 - 154.44.175.255 us +154.44.176.0 - 154.44.177.255 fr +154.44.178.0 - 154.44.185.255 us +154.44.186.0 - 154.44.187.255 es +154.44.188.0 - 154.44.255.255 us +154.45.0.0 - 154.45.0.15 mc +154.45.0.16 - 154.45.1.255 us +154.45.2.0 - 154.45.3.255 fr +154.45.4.0 - 154.45.40.63 us +154.45.40.64 - 154.45.40.79 de +154.45.40.80 - 154.45.40.255 us +154.45.41.0 - 154.45.41.255 nl +154.45.42.0 - 154.46.34.255 us +154.46.35.0 - 154.46.35.255 nl +154.46.36.0 - 154.46.39.255 us +154.46.40.0 - 154.46.41.255 es +154.46.42.0 - 154.46.43.255 us +154.46.44.0 - 154.46.47.255 es +154.46.48.0 - 154.46.107.255 us +154.46.108.0 - 154.46.108.255 lt +154.46.109.0 - 154.46.111.255 us +154.46.112.0 - 154.46.115.255 lt +154.46.116.0 - 154.46.203.255 us +154.46.204.0 - 154.46.205.255 de +154.46.206.0 - 154.47.66.255 us +154.47.67.0 - 154.47.68.255 gb +154.47.69.0 - 154.47.71.255 us +154.47.72.0 - 154.47.72.255 gb +154.47.73.0 - 154.47.127.255 us +154.47.128.0 - 154.47.128.255 es +154.47.129.0 - 154.47.131.255 us +154.47.132.0 - 154.47.132.255 es +154.47.133.0 - 154.47.135.255 us +154.47.136.0 - 154.47.139.255 es +154.47.140.0 - 154.47.223.255 us +154.47.224.0 - 154.47.224.255 ch +154.47.225.0 - 154.47.225.255 us +154.47.226.0 - 154.47.226.255 ch +154.47.227.0 - 154.48.127.255 us +154.48.128.0 - 154.48.128.255 es +154.48.129.0 - 154.48.129.255 us +154.48.130.0 - 154.48.151.255 es +154.48.152.0 - 154.48.153.255 us +154.48.154.0 - 154.48.154.255 es +154.48.155.0 - 154.48.155.255 us +154.48.156.0 - 154.48.177.255 es +154.48.178.0 - 154.49.193.255 us +154.49.194.0 - 154.49.194.255 fr +154.49.195.0 - 154.49.195.255 us +154.49.196.0 - 154.49.198.255 fr +154.49.199.0 - 154.49.199.255 es +154.49.200.0 - 154.49.200.255 mx +154.49.201.0 - 154.49.201.255 pe +154.49.202.0 - 154.50.0.63 us +154.50.0.64 - 154.50.0.255 fr +154.50.1.0 - 154.50.191.255 us +154.50.192.0 - 154.50.192.255 ie +154.50.193.0 - 154.50.194.255 us +154.50.195.0 - 154.50.196.255 ie +154.50.197.0 - 154.50.197.175 us +154.50.197.176 - 154.50.197.191 ie +154.50.197.192 - 154.50.199.255 us +154.50.200.0 - 154.50.201.255 ie +154.50.202.0 - 154.50.202.255 us +154.50.203.0 - 154.50.205.255 ie +154.50.206.0 - 154.50.209.255 us +154.50.210.0 - 154.50.211.255 ie +154.50.212.0 - 154.51.129.255 us +154.51.130.0 - 154.51.130.255 gb +154.51.131.0 - 154.51.131.255 us +154.51.132.0 - 154.51.133.255 gb +154.51.134.0 - 154.51.135.255 us +154.51.136.0 - 154.51.136.63 gb +154.51.136.64 - 154.51.143.255 us +154.51.144.0 - 154.51.144.255 gb +154.51.145.0 - 154.51.149.15 us +154.51.149.16 - 154.51.149.31 gb +154.51.149.32 - 154.52.114.202 us +154.52.114.203 - 154.52.114.203 tr +154.52.114.204 - 154.52.127.255 us +154.52.128.0 - 154.52.129.255 fr +154.52.130.0 - 154.53.0.255 us +154.53.1.0 - 154.53.1.255 ch +154.53.2.0 - 154.53.127.255 us +154.53.128.0 - 154.53.128.255 es +154.53.129.0 - 154.54.39.197 us +154.54.39.198 - 154.54.39.198 fr +154.54.39.199 - 154.54.75.9 us +154.54.75.10 - 154.54.75.10 fr +154.54.75.11 - 154.56.1.255 us +154.56.2.0 - 154.56.2.255 md +154.56.3.0 - 154.56.127.255 us +154.56.128.0 - 154.56.129.255 es +154.56.130.0 - 154.56.130.255 us +154.56.131.0 - 154.56.132.255 es +154.56.133.0 - 154.56.135.255 us +154.56.136.0 - 154.56.147.255 es +154.56.148.0 - 154.56.198.255 us +154.56.199.0 - 154.56.207.255 it +154.56.208.0 - 154.57.3.255 us +154.57.4.0 - 154.57.7.255 gr +154.57.8.0 - 154.57.63.255 us +154.57.64.0 - 154.57.79.255 ch +154.57.80.0 - 154.57.195.24 us +154.57.195.25 - 154.57.195.25 lb +154.57.195.26 - 154.57.204.79 us +154.57.204.80 - 154.57.204.80 lb +154.57.204.81 - 154.57.215.113 us +154.57.215.114 - 154.57.215.114 lb +154.57.215.115 - 154.57.223.255 us +154.57.224.0 - 154.57.255.255 gb +154.58.0.0 - 154.58.3.255 es +154.58.4.0 - 154.58.7.255 us +154.58.8.0 - 154.58.15.255 es +154.58.16.0 - 154.58.47.255 us +154.58.48.0 - 154.58.63.255 es +154.58.64.0 - 154.58.127.255 gb +154.58.128.0 - 154.58.195.255 us +154.58.196.0 - 154.58.203.255 es +154.58.204.0 - 154.58.207.255 us +154.58.208.0 - 154.58.223.255 es +154.58.224.0 - 154.59.95.255 us +154.59.96.0 - 154.59.113.255 nl +154.59.114.0 - 154.59.135.255 us +154.59.136.0 - 154.59.143.255 gb +154.59.144.0 - 154.59.151.255 us +154.59.152.0 - 154.59.159.255 gb +154.59.160.0 - 154.59.255.255 us +154.60.0.0 - 154.60.31.255 bg +154.60.32.0 - 154.60.63.255 us +154.60.64.0 - 154.60.64.255 gb +154.60.65.0 - 154.61.95.255 us +154.61.96.0 - 154.61.99.255 es +154.61.100.0 - 154.64.159.255 us +154.64.160.0 - 154.64.175.255 bg +154.64.176.0 - 154.64.208.255 us +154.64.209.0 - 154.64.210.255 pr +154.64.211.0 - 154.64.212.255 us +154.64.213.0 - 154.64.214.255 pr +154.64.215.0 - 154.64.215.255 us +154.64.216.0 - 154.64.216.255 pr +154.64.217.0 - 154.64.255.255 us +154.65.0.0 - 154.65.3.255 za +154.65.4.0 - 154.65.7.255 ng +154.65.8.0 - 154.65.11.255 mu +154.65.12.0 - 154.65.15.255 za +154.65.16.0 - 154.65.31.255 ke +154.65.32.0 - 154.65.39.255 sn +154.65.40.0 - 154.65.43.255 za +154.65.44.0 - 154.65.51.255 ss +154.65.52.0 - 154.65.55.255 za +154.65.56.0 - 154.65.59.255 ke +154.65.60.0 - 154.65.63.255 bf +154.65.64.0 - 154.65.95.255 za +154.65.96.0 - 154.65.127.255 gh +154.65.128.0 - 154.65.255.255 ao +154.66.0.0 - 154.66.63.255 ng +154.66.64.0 - 154.66.79.255 za +154.66.80.0 - 154.66.83.255 ao +154.66.84.0 - 154.66.87.255 gn +154.66.88.0 - 154.66.95.255 za +154.66.96.0 - 154.66.99.255 dz +154.66.100.0 - 154.66.103.255 ss +154.66.104.0 - 154.66.107.255 ao +154.66.108.0 - 154.66.111.255 ls +154.66.112.0 - 154.66.115.255 za +154.66.116.0 - 154.66.119.255 td +154.66.120.0 - 154.66.127.255 mw +154.66.128.0 - 154.66.143.255 bj +154.66.144.0 - 154.66.159.255 za +154.66.160.0 - 154.66.175.255 bf +154.66.176.0 - 154.66.211.255 za +154.66.212.0 - 154.66.215.255 tz +154.66.216.0 - 154.66.219.255 ug +154.66.220.0 - 154.66.223.255 ne +154.66.224.0 - 154.66.227.255 tz +154.66.228.0 - 154.66.231.255 mu +154.66.232.0 - 154.66.239.255 ga +154.66.240.0 - 154.66.247.255 mu +154.66.248.0 - 154.66.255.255 za +154.67.0.0 - 154.67.255.255 re +154.68.0.0 - 154.68.63.255 ci +154.68.64.0 - 154.68.127.255 rw +154.68.160.0 - 154.68.191.255 za +154.68.192.0 - 154.68.255.255 ng +154.69.0.0 - 154.69.255.255 za +154.70.0.0 - 154.70.63.255 ke +154.70.64.0 - 154.70.79.255 gh +154.70.80.0 - 154.70.95.255 tg +154.70.96.0 - 154.70.127.255 cm +154.70.128.0 - 154.70.143.255 za +154.70.144.0 - 154.70.151.255 bw +154.70.152.0 - 154.70.152.255 za +154.70.153.0 - 154.70.153.255 mu +154.70.154.0 - 154.70.155.255 za +154.70.156.0 - 154.70.159.255 ug +154.70.160.0 - 154.70.191.255 sc +154.70.192.0 - 154.70.195.255 ml +154.70.196.0 - 154.70.199.255 bi +154.70.200.0 - 154.70.207.255 ma +154.70.208.0 - 154.70.255.255 za +154.71.0.0 - 154.71.255.255 mu +154.72.0.0 - 154.72.3.255 ke +154.72.4.0 - 154.72.11.255 za +154.72.12.0 - 154.72.15.255 st +154.72.16.0 - 154.72.19.255 ug +154.72.20.0 - 154.72.23.255 tz +154.72.24.0 - 154.72.27.255 so +154.72.28.0 - 154.72.31.255 ke +154.72.32.0 - 154.72.39.255 ng +154.72.40.0 - 154.72.47.255 za +154.72.48.0 - 154.72.51.255 so +154.72.52.0 - 154.72.55.255 cd +154.72.56.0 - 154.72.63.255 za +154.72.64.0 - 154.72.95.255 tz +154.72.96.0 - 154.72.111.255 za +154.72.112.0 - 154.72.127.255 bj +154.72.128.0 - 154.72.191.255 cm +154.72.192.0 - 154.72.223.255 ug +154.72.224.0 - 154.72.239.255 tn +154.72.240.0 - 154.73.7.255 za +154.73.8.0 - 154.73.11.255 ng +154.73.12.0 - 154.73.15.255 ug +154.73.16.0 - 154.73.19.255 za +154.73.20.0 - 154.73.23.255 cd +154.73.24.0 - 154.73.27.255 so +154.73.28.0 - 154.73.31.255 ly +154.73.32.0 - 154.73.35.255 za +154.73.36.0 - 154.73.39.255 bw +154.73.40.0 - 154.73.43.255 bi +154.73.44.0 - 154.73.47.255 so +154.73.48.0 - 154.73.48.31 sc +154.73.48.32 - 154.73.48.63 fr +154.73.48.64 - 154.73.48.127 bf +154.73.48.128 - 154.73.48.159 ne +154.73.48.160 - 154.73.48.191 sc +154.73.48.192 - 154.73.48.255 mw +154.73.49.0 - 154.73.51.255 sc +154.73.52.0 - 154.73.55.255 ly +154.73.56.0 - 154.73.59.255 gq +154.73.60.0 - 154.73.63.255 gw +154.73.64.0 - 154.73.67.255 tz +154.73.68.0 - 154.73.75.255 za +154.73.76.0 - 154.73.79.255 so +154.73.80.0 - 154.73.83.255 zw +154.73.84.0 - 154.73.87.255 bw +154.73.88.0 - 154.73.91.255 ss +154.73.92.0 - 154.73.95.255 dz +154.73.96.0 - 154.73.99.255 za +154.73.100.0 - 154.73.103.255 ci +154.73.104.0 - 154.73.107.255 bi +154.73.108.0 - 154.73.111.255 ly +154.73.112.0 - 154.73.115.255 td +154.73.116.0 - 154.73.119.255 cg +154.73.120.0 - 154.73.123.255 za +154.73.124.0 - 154.73.127.255 so +154.73.128.0 - 154.73.135.255 ly +154.73.136.0 - 154.73.143.255 za +154.73.144.0 - 154.73.151.255 tz +154.73.152.0 - 154.73.159.255 za +154.73.160.0 - 154.73.167.255 td +154.73.168.0 - 154.73.171.255 tz +154.73.172.0 - 154.73.175.255 sn +154.73.176.0 - 154.73.179.255 sl +154.73.180.0 - 154.73.199.255 za +154.73.200.0 - 154.73.207.255 cm +154.73.208.0 - 154.73.231.255 za +154.73.232.0 - 154.73.235.255 zm +154.73.236.0 - 154.73.239.255 ng +154.73.240.0 - 154.73.255.255 za +154.74.0.0 - 154.75.255.255 tz +154.76.0.0 - 154.79.255.255 ke +154.80.0.0 - 154.95.255.255 sc +154.96.0.0 - 154.103.255.255 sd +154.104.0.0 - 154.111.255.255 tn +154.112.0.0 - 154.112.255.255 ga +154.113.0.0 - 154.113.255.255 ng +154.114.0.0 - 154.115.255.255 za +154.116.0.0 - 154.116.127.255 ga +154.116.128.0 - 154.116.255.255 ao +154.117.0.0 - 154.117.63.255 gh +154.117.64.0 - 154.117.127.255 ng +154.117.128.0 - 154.117.191.255 za +154.117.192.0 - 154.117.255.255 bi +154.118.0.0 - 154.118.127.255 ng +154.118.128.0 - 154.118.191.255 ml +154.118.192.0 - 154.118.207.255 ao +154.118.208.0 - 154.118.208.255 pt +154.118.209.0 - 154.118.209.255 ao +154.118.210.0 - 154.118.211.255 pt +154.118.212.0 - 154.118.212.255 ao +154.118.213.0 - 154.118.214.255 pt +154.118.215.0 - 154.118.216.255 ao +154.118.217.0 - 154.118.223.255 pt +154.118.224.0 - 154.118.231.255 tz +154.118.232.0 - 154.118.239.255 ke +154.118.240.0 - 154.118.243.255 so +154.118.244.0 - 154.118.247.255 za +154.118.248.0 - 154.118.251.255 ga +154.118.252.0 - 154.118.255.255 za +154.119.0.0 - 154.119.31.255 bi +154.119.32.0 - 154.119.79.255 za +154.119.80.0 - 154.119.95.255 zw +154.119.96.0 - 154.119.127.255 sz +154.119.128.0 - 154.119.143.255 lr +154.119.144.0 - 154.119.191.255 za +154.119.192.0 - 154.119.223.255 ga +154.119.224.0 - 154.119.255.255 za +154.120.0.0 - 154.120.63.255 gh +154.120.64.0 - 154.120.127.255 ng +154.120.128.0 - 154.120.191.255 mg +154.120.192.0 - 154.120.195.255 mu +154.120.196.0 - 154.120.199.255 ke +154.120.200.0 - 154.120.215.255 mu +154.120.216.0 - 154.120.223.255 zm +154.120.224.0 - 154.120.255.255 zw +154.121.0.0 - 154.121.255.255 dz +154.122.0.0 - 154.123.255.255 ke +154.124.0.0 - 154.125.255.255 sn +154.126.0.0 - 154.126.127.255 mg +154.126.128.0 - 154.126.191.255 cm +154.126.192.0 - 154.126.223.255 za +154.126.224.0 - 154.126.227.255 tz +154.126.228.0 - 154.126.235.255 za +154.126.236.0 - 154.127.31.255 tz +154.127.32.0 - 154.127.47.255 bj +154.127.48.0 - 154.127.48.255 us +154.127.49.0 - 154.127.50.255 za +154.127.51.0 - 154.127.51.255 gb +154.127.52.0 - 154.127.55.255 us +154.127.56.0 - 154.127.56.127 ng +154.127.56.128 - 154.127.56.255 ke +154.127.57.0 - 154.127.57.255 us +154.127.58.0 - 154.127.58.127 ci +154.127.58.128 - 154.127.61.255 za +154.127.62.0 - 154.127.62.127 gh +154.127.62.128 - 154.127.62.255 cm +154.127.63.0 - 154.127.63.127 ug +154.127.63.128 - 154.127.63.255 za +154.127.64.0 - 154.127.79.255 ly +154.127.80.0 - 154.127.95.255 ne +154.127.96.0 - 154.127.111.255 dz +154.127.112.0 - 154.127.127.255 za +154.127.128.0 - 154.127.255.255 ao +155.0.0.0 - 155.0.255.255 zm 155.1.0.0 - 155.2.255.255 us 155.3.0.0 - 155.3.255.255 ca -155.4.0.0 - 155.4.255.255 no +155.4.0.0 - 155.4.255.255 se 155.5.0.0 - 155.9.255.255 us 155.10.0.0 - 155.10.255.255 ca +155.11.0.0 - 155.11.255.255 eg +155.12.0.0 - 155.12.127.255 tz 155.13.0.0 - 155.14.255.255 us 155.15.0.0 - 155.15.255.255 ca 155.16.0.0 - 155.31.255.255 us 155.32.0.0 - 155.32.255.255 nz -155.33.0.0 - 155.44.255.255 us +155.33.0.0 - 155.35.247.255 us +155.35.248.0 - 155.35.248.255 au +155.35.249.0 - 155.44.255.255 us 155.45.0.0 - 155.45.255.255 de 155.46.0.0 - 155.53.255.255 us 155.54.0.0 - 155.54.255.255 es 155.55.0.0 - 155.55.255.255 no 155.56.0.0 - 155.56.255.255 de -155.57.0.0 - 155.58.255.255 us +155.57.0.0 - 155.57.154.255 us +155.57.155.0 - 155.57.155.255 ap +155.57.156.0 - 155.57.159.255 us +155.57.160.0 - 155.57.160.255 eu +155.57.161.0 - 155.58.255.255 us 155.59.0.0 - 155.59.255.255 nz 155.60.0.0 - 155.60.255.255 au -155.61.0.0 - 155.61.255.255 us -155.62.0.0 - 155.62.255.255 ca -155.63.0.0 - 155.65.255.255 us +155.61.0.0 - 155.63.199.255 us +155.63.200.0 - 155.63.201.255 nz +155.63.202.0 - 155.63.205.255 us +155.63.206.0 - 155.63.206.255 ca +155.63.207.0 - 155.65.255.255 us 155.66.0.0 - 155.66.255.255 ch 155.67.0.0 - 155.68.255.255 us 155.69.0.0 - 155.69.255.255 sg @@ -70368,17 +54648,39 @@ 155.71.0.0 - 155.71.255.255 au 155.72.0.0 - 155.72.255.255 us 155.73.0.0 - 155.73.255.255 at -155.74.0.0 - 155.104.255.255 us +155.74.0.0 - 155.88.255.255 us +155.89.0.0 - 155.89.255.255 ao +155.90.0.0 - 155.91.64.9 us +155.91.64.10 - 155.91.64.11 eu +155.91.64.12 - 155.91.135.255 us +155.91.136.0 - 155.91.136.255 ap +155.91.137.0 - 155.92.255.255 us +155.93.0.0 - 155.93.127.255 ng +155.93.128.0 - 155.93.255.255 za +155.94.0.0 - 155.94.69.255 us +155.94.70.0 - 155.94.70.255 eu +155.94.71.0 - 155.104.255.255 us 155.105.0.0 - 155.105.255.255 ch -155.106.0.0 - 155.130.255.255 us +155.106.0.0 - 155.126.7.255 us +155.126.8.0 - 155.126.8.255 ap +155.126.9.0 - 155.130.255.255 us 155.131.0.0 - 155.131.255.255 gb 155.132.0.0 - 155.132.255.255 fr -155.133.0.0 - 155.133.255.255 eu +155.133.0.0 - 155.133.193.255 pl +155.133.194.0 - 155.133.194.255 pt +155.133.195.0 - 155.133.199.255 pl +155.133.200.0 - 155.133.223.255 de +155.133.224.0 - 155.133.255.255 pl 155.134.0.0 - 155.135.255.255 us -155.136.0.0 - 155.136.255.255 gb +155.136.0.0 - 155.136.17.255 gb +155.136.18.0 - 155.136.18.255 pl +155.136.19.0 - 155.136.255.255 gb 155.137.0.0 - 155.137.255.255 dk 155.138.0.0 - 155.139.255.255 us -155.140.0.0 - 155.140.255.255 gb +155.140.0.0 - 155.140.133.247 gb +155.140.133.248 - 155.140.133.249 eu +155.140.133.250 - 155.140.254.255 gb +155.140.255.0 - 155.140.255.255 ap 155.141.0.0 - 155.142.255.255 us 155.143.0.0 - 155.144.255.255 au 155.145.0.0 - 155.145.255.255 gb @@ -70404,7 +54706,9 @@ 155.205.0.0 - 155.205.255.255 au 155.206.0.0 - 155.206.255.255 us 155.207.0.0 - 155.207.255.255 gr -155.208.0.0 - 155.208.255.255 us +155.208.0.0 - 155.208.253.255 us +155.208.254.0 - 155.208.254.255 eu +155.208.255.0 - 155.208.255.255 us 155.209.0.0 - 155.209.255.255 no 155.210.0.0 - 155.210.255.255 es 155.211.0.0 - 155.211.255.255 br @@ -70419,22 +54723,132 @@ 155.232.0.0 - 155.240.255.255 za 155.241.0.0 - 155.244.255.255 us 155.245.0.0 - 155.245.255.255 gb -155.246.0.0 - 155.248.255.255 us +155.246.0.0 - 155.248.190.255 us +155.248.191.0 - 155.248.191.255 eu +155.248.192.0 - 155.248.255.255 us 155.249.0.0 - 155.249.255.255 gb -155.250.0.0 - 155.250.255.255 de +155.250.0.0 - 155.250.129.23 de +155.250.129.24 - 155.250.129.25 eu +155.250.129.26 - 155.250.255.255 de 155.252.0.0 - 155.252.255.255 us 155.253.0.0 - 155.253.255.255 it -155.254.0.0 - 155.254.255.255 us +155.254.0.0 - 155.254.1.255 us +155.254.2.0 - 155.254.3.255 ca +155.254.4.0 - 155.254.35.255 us +155.254.36.0 - 155.254.36.255 de +155.254.37.0 - 155.254.39.255 us +155.254.40.0 - 155.254.47.255 nl +155.254.48.0 - 155.254.63.255 us +155.254.64.0 - 155.254.95.255 ca +155.254.96.0 - 155.254.96.255 pe +155.254.97.0 - 155.254.97.255 sz +155.254.98.0 - 155.254.98.255 au +155.254.99.0 - 155.254.99.255 pa +155.254.100.0 - 155.254.100.255 co +155.254.101.0 - 155.254.101.255 sc +155.254.102.0 - 155.254.102.255 ca +155.254.103.0 - 155.254.103.255 lc +155.254.104.0 - 155.254.104.255 sv +155.254.105.0 - 155.254.105.255 us +155.254.106.0 - 155.254.106.255 zw +155.254.107.0 - 155.254.107.255 kr +155.254.108.0 - 155.254.108.255 us +155.254.109.0 - 155.254.109.255 lu +155.254.110.0 - 155.254.110.255 us +155.254.111.0 - 155.254.111.255 ug +155.254.112.0 - 155.254.112.255 us +155.254.113.0 - 155.254.113.255 tt +155.254.114.0 - 155.254.114.255 us +155.254.115.0 - 155.254.115.255 za +155.254.116.0 - 155.254.116.255 us +155.254.117.0 - 155.254.117.255 fj +155.254.118.0 - 155.254.119.255 us +155.254.120.0 - 155.254.120.255 ni +155.254.121.0 - 155.254.121.255 ua +155.254.122.0 - 155.254.122.255 us +155.254.123.0 - 155.254.123.255 ci +155.254.124.0 - 155.254.124.255 us +155.254.125.0 - 155.254.125.255 gy +155.254.126.0 - 155.254.126.255 de +155.254.127.0 - 155.254.135.255 us +155.254.136.0 - 155.254.159.255 ca +155.254.160.0 - 155.254.191.255 us +155.254.192.0 - 155.254.192.255 sk +155.254.193.0 - 155.254.193.255 mc +155.254.194.0 - 155.254.194.255 az +155.254.195.0 - 155.254.195.255 fi +155.254.196.0 - 155.254.196.255 cz +155.254.197.0 - 155.254.197.255 uz +155.254.198.0 - 155.254.198.255 bt +155.254.199.0 - 155.254.199.255 cn +155.254.200.0 - 155.254.200.255 me +155.254.201.0 - 155.254.201.255 ye +155.254.202.0 - 155.254.202.255 kh +155.254.203.0 - 155.254.203.255 tj +155.254.204.0 - 155.254.204.255 kg +155.254.205.0 - 155.254.205.255 in +155.254.206.0 - 155.254.206.255 dk +155.254.207.0 - 155.254.207.255 il +155.254.208.0 - 155.254.208.255 pl +155.254.209.0 - 155.254.209.255 la +155.254.210.0 - 155.254.210.255 gh +155.254.211.0 - 155.254.211.255 bd +155.254.212.0 - 155.254.212.255 li +155.254.213.0 - 155.254.213.255 et +155.254.214.0 - 155.254.214.255 sm +155.254.215.0 - 155.254.215.255 bh +155.254.216.0 - 155.254.216.255 cy +155.254.217.0 - 155.254.217.255 nz +155.254.218.0 - 155.254.218.255 ps +155.254.219.0 - 155.254.219.255 gi +155.254.220.0 - 155.254.220.255 rs +155.254.221.0 - 155.254.221.255 hk +155.254.222.0 - 155.254.222.255 hr +155.254.223.0 - 155.254.223.255 sn +155.254.224.0 - 155.254.224.255 mv +155.254.225.0 - 155.254.225.255 af +155.254.226.0 - 155.254.226.255 jp +155.254.227.0 - 155.254.227.255 cm +155.254.228.0 - 155.254.228.255 va +155.254.229.0 - 155.254.229.255 jp +155.254.230.0 - 155.254.230.255 tm +155.254.231.0 - 155.254.231.255 ge +155.254.232.0 - 155.254.232.255 tr +155.254.233.0 - 155.254.233.255 tw +155.254.234.0 - 155.254.234.255 kw +155.254.235.0 - 155.254.235.255 ee +155.254.236.0 - 155.254.236.255 cn +155.254.237.0 - 155.254.237.255 ma +155.254.238.0 - 155.254.238.255 ba +155.254.239.0 - 155.254.239.255 iq +155.254.240.0 - 155.254.240.255 no +155.254.241.0 - 155.254.241.255 au +155.254.242.0 - 155.254.242.255 th +155.254.243.0 - 155.254.243.255 vn +155.254.244.0 - 155.254.244.255 us +155.254.245.0 - 155.254.245.255 ru +155.254.246.0 - 155.254.246.255 in +155.254.247.0 - 155.254.247.255 be +155.254.248.0 - 155.254.248.255 im +155.254.249.0 - 155.254.249.255 bn +155.254.250.0 - 155.254.250.255 us +155.254.251.0 - 155.254.251.255 lt +155.254.252.0 - 155.254.252.255 md +155.254.253.0 - 155.254.253.255 si +155.254.254.0 - 155.254.254.255 ke +155.254.255.0 - 155.254.255.255 ng 156.0.0.0 - 156.7.255.255 us 156.8.0.0 - 156.8.255.255 za 156.9.0.0 - 156.9.255.255 us 156.10.0.0 - 156.10.255.255 fi -156.11.0.0 - 156.11.255.255 ca +156.11.0.0 - 156.11.239.255 ca +156.11.240.0 - 156.11.241.255 ie +156.11.242.0 - 156.11.243.255 gb +156.11.244.0 - 156.11.255.255 ca 156.12.0.0 - 156.12.255.255 us 156.13.0.0 - 156.13.255.255 nz 156.14.0.0 - 156.14.255.255 it 156.15.0.0 - 156.15.255.255 us -156.16.0.0 - 156.16.255.255 au 156.17.0.0 - 156.17.255.255 pl 156.18.0.0 - 156.18.255.255 fr 156.19.0.0 - 156.21.255.255 us @@ -70444,16 +54858,19 @@ 156.26.0.0 - 156.27.255.255 us 156.28.0.0 - 156.28.255.255 fr 156.29.0.0 - 156.30.255.255 us -156.31.0.0 - 156.31.255.255 bn +156.31.0.0 - 156.31.196.255 bn +156.31.197.0 - 156.31.197.255 my +156.31.198.0 - 156.31.255.255 bn 156.32.0.0 - 156.33.255.255 us 156.34.0.0 - 156.34.255.255 ca 156.35.0.0 - 156.35.255.255 es -156.36.0.0 - 156.42.255.255 us +156.36.0.0 - 156.37.252.255 us +156.37.253.0 - 156.37.253.255 eu +156.37.254.0 - 156.37.255.255 us +156.39.0.0 - 156.42.255.255 us 156.43.0.0 - 156.43.255.255 gb 156.44.0.0 - 156.44.255.255 ca -156.45.0.0 - 156.46.213.159 us -156.46.213.160 - 156.46.213.183 de -156.46.213.184 - 156.47.255.255 us +156.45.0.0 - 156.47.255.255 us 156.48.0.0 - 156.48.255.255 gb 156.49.0.0 - 156.49.255.255 se 156.50.0.0 - 156.50.255.255 au @@ -70472,13 +54889,134 @@ 156.67.0.0 - 156.67.255.255 de 156.68.0.0 - 156.68.255.255 us 156.69.0.0 - 156.69.255.255 nz -156.70.0.0 - 156.82.255.255 us +156.70.0.0 - 156.71.148.255 us +156.71.149.0 - 156.71.149.255 sg +156.71.150.0 - 156.82.255.255 us 156.83.0.0 - 156.83.255.255 nl 156.84.0.0 - 156.96.255.255 us 156.97.0.0 - 156.97.255.255 cl 156.98.0.0 - 156.105.255.255 us 156.106.0.0 - 156.106.255.255 ch -156.107.0.0 - 156.113.255.255 us +156.107.0.0 - 156.107.32.255 us +156.107.33.0 - 156.107.33.255 ap +156.107.34.0 - 156.107.44.1 us +156.107.44.2 - 156.107.44.2 au +156.107.44.3 - 156.107.44.5 us +156.107.44.6 - 156.107.44.6 au +156.107.44.7 - 156.107.44.9 us +156.107.44.10 - 156.107.44.10 au +156.107.44.11 - 156.107.44.33 us +156.107.44.34 - 156.107.44.34 au +156.107.44.35 - 156.107.44.37 us +156.107.44.38 - 156.107.44.38 au +156.107.44.39 - 156.107.44.41 us +156.107.44.42 - 156.107.44.42 au +156.107.44.43 - 156.107.44.65 us +156.107.44.66 - 156.107.44.66 au +156.107.44.67 - 156.107.44.69 us +156.107.44.70 - 156.107.44.70 au +156.107.44.71 - 156.107.44.73 us +156.107.44.74 - 156.107.44.74 au +156.107.44.75 - 156.107.81.255 us +156.107.82.0 - 156.107.82.31 in +156.107.82.32 - 156.107.82.55 us +156.107.82.56 - 156.107.82.71 in +156.107.82.72 - 156.107.135.255 us +156.107.136.0 - 156.107.136.19 sg +156.107.136.20 - 156.107.136.23 hk +156.107.136.24 - 156.107.136.27 sg +156.107.136.28 - 156.107.136.31 tw +156.107.136.32 - 156.107.136.35 kr +156.107.136.36 - 156.107.136.39 vn +156.107.136.40 - 156.107.136.43 jp +156.107.136.44 - 156.107.136.47 id +156.107.136.48 - 156.107.136.51 my +156.107.136.52 - 156.107.136.55 ph +156.107.136.56 - 156.107.136.59 th +156.107.136.60 - 156.107.136.139 sg +156.107.136.140 - 156.107.136.143 hk +156.107.136.144 - 156.107.136.147 sg +156.107.136.148 - 156.107.136.151 tw +156.107.136.152 - 156.107.136.155 kr +156.107.136.156 - 156.107.136.159 vn +156.107.136.160 - 156.107.136.163 jp +156.107.136.164 - 156.107.136.167 id +156.107.136.168 - 156.107.136.171 my +156.107.136.172 - 156.107.136.175 ph +156.107.136.176 - 156.107.136.179 th +156.107.136.180 - 156.107.137.19 sg +156.107.137.20 - 156.107.137.23 hk +156.107.137.24 - 156.107.137.27 sg +156.107.137.28 - 156.107.137.31 tw +156.107.137.32 - 156.107.137.35 kr +156.107.137.36 - 156.107.137.39 vn +156.107.137.40 - 156.107.137.43 jp +156.107.137.44 - 156.107.137.47 id +156.107.137.48 - 156.107.137.51 my +156.107.137.52 - 156.107.137.55 ph +156.107.137.56 - 156.107.137.59 th +156.107.137.60 - 156.107.137.255 sg +156.107.138.0 - 156.107.138.9 us +156.107.138.10 - 156.107.138.10 sg +156.107.138.11 - 156.107.155.255 us +156.107.156.0 - 156.107.156.15 sg +156.107.156.16 - 156.107.156.19 cn +156.107.156.20 - 156.107.156.23 hk +156.107.156.24 - 156.107.156.27 sg +156.107.156.28 - 156.107.156.31 tw +156.107.156.32 - 156.107.156.35 kr +156.107.156.36 - 156.107.156.39 vn +156.107.156.40 - 156.107.156.43 jp +156.107.156.44 - 156.107.156.47 id +156.107.156.48 - 156.107.156.51 my +156.107.156.52 - 156.107.156.55 ph +156.107.156.56 - 156.107.156.59 th +156.107.156.60 - 156.107.156.135 sg +156.107.156.136 - 156.107.156.139 cn +156.107.156.140 - 156.107.156.143 hk +156.107.156.144 - 156.107.156.147 sg +156.107.156.148 - 156.107.156.151 tw +156.107.156.152 - 156.107.156.155 kr +156.107.156.156 - 156.107.156.159 vn +156.107.156.160 - 156.107.156.163 jp +156.107.156.164 - 156.107.156.167 id +156.107.156.168 - 156.107.156.171 my +156.107.156.172 - 156.107.156.175 ph +156.107.156.176 - 156.107.156.179 th +156.107.156.180 - 156.107.157.15 sg +156.107.157.16 - 156.107.157.19 cn +156.107.157.20 - 156.107.157.23 hk +156.107.157.24 - 156.107.157.27 sg +156.107.157.28 - 156.107.157.31 tw +156.107.157.32 - 156.107.157.35 kr +156.107.157.36 - 156.107.157.39 vn +156.107.157.40 - 156.107.157.43 jp +156.107.157.44 - 156.107.157.47 id +156.107.157.48 - 156.107.157.51 my +156.107.157.52 - 156.107.157.55 ph +156.107.157.56 - 156.107.157.59 th +156.107.157.60 - 156.107.157.255 sg +156.107.158.0 - 156.107.172.1 us +156.107.172.2 - 156.107.172.2 au +156.107.172.3 - 156.107.172.5 us +156.107.172.6 - 156.107.172.6 au +156.107.172.7 - 156.107.172.9 us +156.107.172.10 - 156.107.172.10 au +156.107.172.11 - 156.107.172.33 us +156.107.172.34 - 156.107.172.34 au +156.107.172.35 - 156.107.172.37 us +156.107.172.38 - 156.107.172.38 au +156.107.172.39 - 156.107.172.41 us +156.107.172.42 - 156.107.172.42 au +156.107.172.43 - 156.107.172.69 us +156.107.172.70 - 156.107.172.70 au +156.107.172.71 - 156.107.172.73 us +156.107.172.74 - 156.107.172.74 au +156.107.172.75 - 156.109.10.16 us +156.109.10.17 - 156.109.10.17 eu +156.109.10.18 - 156.109.17.255 us +156.109.18.0 - 156.109.18.255 eu +156.109.19.0 - 156.113.255.255 us 156.114.0.0 - 156.114.255.255 nl 156.115.0.0 - 156.115.255.255 ch 156.116.0.0 - 156.116.255.255 no @@ -70494,6 +55032,9 @@ 156.149.0.0 - 156.149.255.255 nz 156.150.0.0 - 156.150.255.255 nl 156.151.0.0 - 156.155.255.255 us +156.156.0.0 - 156.159.255.255 tz +156.160.0.0 - 156.223.255.255 eg +156.224.0.0 - 156.255.255.255 sc 157.0.0.0 - 157.0.255.255 cn 157.1.0.0 - 157.17.255.255 jp 157.18.0.0 - 157.18.255.255 cn @@ -70505,11 +55046,96 @@ 157.26.0.0 - 157.26.255.255 ch 157.27.0.0 - 157.29.255.255 it 157.30.0.0 - 157.31.255.255 us -157.32.0.0 - 157.53.255.255 id -157.54.0.0 - 157.60.255.255 us +157.32.0.0 - 157.51.255.255 id +157.52.0.0 - 157.52.31.255 ca +157.52.32.0 - 157.54.255.255 us +157.55.0.0 - 157.55.7.255 ie +157.55.8.0 - 157.55.8.175 nl +157.55.8.176 - 157.55.8.191 ie +157.55.8.192 - 157.55.8.223 nl +157.55.8.224 - 157.55.9.111 ie +157.55.9.112 - 157.55.9.127 nl +157.55.9.128 - 157.55.9.255 ie +157.55.10.0 - 157.55.10.159 nl +157.55.10.160 - 157.55.10.167 ie +157.55.10.168 - 157.55.10.175 nl +157.55.10.176 - 157.55.10.255 ie +157.55.11.0 - 157.55.11.127 nl +157.55.11.128 - 157.55.11.255 ie +157.55.12.0 - 157.55.12.63 nl +157.55.12.64 - 157.55.15.255 ie +157.55.16.0 - 157.55.39.255 us +157.55.40.0 - 157.55.40.255 nl +157.55.41.0 - 157.55.41.255 ie +157.55.42.0 - 157.55.42.255 nl +157.55.43.0 - 157.55.43.63 ie +157.55.43.64 - 157.55.44.15 nl +157.55.44.16 - 157.55.44.127 ie +157.55.44.128 - 157.55.44.223 nl +157.55.44.224 - 157.55.44.255 ie +157.55.45.0 - 157.55.45.255 nl +157.55.46.0 - 157.55.46.31 ie +157.55.46.32 - 157.55.46.127 nl +157.55.46.128 - 157.55.46.159 ie +157.55.46.160 - 157.55.46.191 nl +157.55.46.192 - 157.55.46.215 ie +157.55.46.216 - 157.55.46.223 nl +157.55.46.224 - 157.55.46.255 ie +157.55.47.0 - 157.55.47.127 nl +157.55.47.128 - 157.55.47.255 ie +157.55.48.0 - 157.55.127.255 us +157.55.128.0 - 157.55.128.31 sg +157.55.128.32 - 157.55.204.127 us +157.55.204.128 - 157.55.204.255 ie +157.55.205.0 - 157.55.223.255 us +157.55.224.0 - 157.55.224.255 ie +157.55.225.0 - 157.55.225.255 nl +157.55.226.0 - 157.55.227.127 ie +157.55.227.128 - 157.55.228.255 nl +157.55.229.0 - 157.55.229.127 ie +157.55.229.128 - 157.55.229.255 nl +157.55.230.0 - 157.55.230.143 ie +157.55.230.144 - 157.55.230.159 nl +157.55.230.160 - 157.55.230.191 ie +157.55.230.192 - 157.55.231.127 nl +157.55.231.128 - 157.55.232.31 ie +157.55.232.32 - 157.55.232.63 nl +157.55.232.64 - 157.55.232.95 ie +157.55.232.96 - 157.55.232.127 nl +157.55.232.128 - 157.55.232.191 ie +157.55.232.192 - 157.55.233.175 nl +157.55.233.176 - 157.55.238.127 ie +157.55.238.128 - 157.55.238.175 nl +157.55.238.176 - 157.55.238.255 ie +157.55.239.0 - 157.55.239.255 nl +157.55.240.0 - 157.56.99.255 us +157.56.100.0 - 157.56.100.31 sg +157.56.100.32 - 157.56.111.255 us +157.56.112.0 - 157.56.114.31 nl +157.56.114.32 - 157.56.114.63 ie +157.56.114.64 - 157.56.119.255 nl +157.56.120.0 - 157.56.127.255 ie +157.56.128.0 - 157.56.156.255 us +157.56.157.0 - 157.56.157.255 jp +157.56.158.0 - 157.56.158.255 sg +157.56.159.0 - 157.56.191.255 us +157.56.192.0 - 157.56.199.255 ie +157.56.200.0 - 157.56.247.255 us +157.56.248.0 - 157.56.251.255 nl +157.56.252.0 - 157.56.255.255 ie +157.57.0.0 - 157.60.163.255 us +157.60.164.0 - 157.60.164.255 au +157.60.165.0 - 157.60.169.255 us +157.60.170.0 - 157.60.170.255 au +157.60.171.0 - 157.60.175.255 us +157.60.176.0 - 157.60.176.127 au +157.60.176.128 - 157.60.183.255 us +157.60.184.0 - 157.60.185.255 au +157.60.186.0 - 157.60.255.255 us 157.61.0.0 - 157.61.255.255 cn 157.62.0.0 - 157.62.255.255 us -157.63.0.0 - 157.82.255.255 jp +157.63.0.0 - 157.80.255.255 jp +157.82.0.0 - 157.82.255.255 jp 157.83.0.0 - 157.84.255.255 gb 157.85.0.0 - 157.85.255.255 au 157.86.0.0 - 157.86.255.255 br @@ -70520,22 +55146,26 @@ 157.93.0.0 - 157.93.255.255 us 157.94.0.0 - 157.94.255.255 fi 157.95.0.0 - 157.95.255.255 us -157.96.0.0 - 157.96.255.255 se +157.96.0.0 - 157.96.255.255 gb 157.97.0.0 - 157.97.255.255 ca 157.98.0.0 - 157.98.255.255 us 157.99.0.0 - 157.99.255.255 fr 157.100.0.0 - 157.100.255.255 ec -157.101.0.0 - 157.120.255.255 jp +157.101.0.0 - 157.120.159.255 jp +157.120.160.0 - 157.120.191.255 sg +157.120.192.0 - 157.120.223.255 us +157.120.224.0 - 157.120.255.255 jp 157.121.0.0 - 157.121.255.255 us 157.122.0.0 - 157.122.255.255 cn 157.123.0.0 - 157.123.255.255 us 157.124.0.0 - 157.124.255.255 fi -157.125.0.0 - 157.125.255.255 se +157.125.0.0 - 157.125.255.255 gb 157.126.0.0 - 157.127.255.255 us 157.128.0.0 - 157.128.255.255 au 157.129.0.0 - 157.129.255.255 fi -157.130.0.0 - 157.130.255.255 us -157.132.0.0 - 157.135.255.255 us +157.130.0.0 - 157.133.47.255 us +157.133.48.0 - 157.133.55.255 ca +157.133.56.0 - 157.135.255.255 us 157.136.0.0 - 157.136.255.255 fr 157.137.0.0 - 157.137.255.255 us 157.138.0.0 - 157.138.255.255 it @@ -70555,7 +55185,9 @@ 157.161.0.0 - 157.161.255.255 ch 157.162.0.0 - 157.163.255.255 de 157.164.0.0 - 157.164.255.255 be -157.165.0.0 - 157.166.255.255 us +157.165.0.0 - 157.166.215.255 us +157.166.216.0 - 157.166.216.255 gb +157.166.217.0 - 157.166.255.255 us 157.167.0.0 - 157.167.255.255 at 157.168.0.0 - 157.168.255.255 ch 157.169.0.0 - 157.169.255.255 fr @@ -70573,7 +55205,79 @@ 157.186.0.0 - 157.186.255.255 ru 157.187.0.0 - 157.189.255.255 us 157.190.0.0 - 157.190.255.255 ie -157.191.0.0 - 157.191.255.255 us +157.191.0.0 - 157.191.26.9 us +157.191.26.10 - 157.191.26.10 ca +157.191.26.11 - 157.191.26.69 us +157.191.26.70 - 157.191.26.70 mx +157.191.26.71 - 157.191.26.73 us +157.191.26.74 - 157.191.26.74 mx +157.191.26.75 - 157.191.26.77 us +157.191.26.78 - 157.191.26.78 ca +157.191.26.79 - 157.191.26.133 us +157.191.26.134 - 157.191.26.134 ca +157.191.26.135 - 157.191.26.137 us +157.191.26.138 - 157.191.26.138 ca +157.191.26.139 - 157.191.27.9 us +157.191.27.10 - 157.191.27.10 ca +157.191.27.11 - 157.191.27.69 us +157.191.27.70 - 157.191.27.70 mx +157.191.27.71 - 157.191.27.73 us +157.191.27.74 - 157.191.27.74 mx +157.191.27.75 - 157.191.27.77 us +157.191.27.78 - 157.191.27.78 ca +157.191.27.79 - 157.191.27.133 us +157.191.27.134 - 157.191.27.134 ca +157.191.27.135 - 157.191.27.137 us +157.191.27.138 - 157.191.27.138 ca +157.191.27.139 - 157.191.44.9 us +157.191.44.10 - 157.191.44.10 ca +157.191.44.11 - 157.191.44.69 us +157.191.44.70 - 157.191.44.70 mx +157.191.44.71 - 157.191.44.73 us +157.191.44.74 - 157.191.44.74 mx +157.191.44.75 - 157.191.44.77 us +157.191.44.78 - 157.191.44.78 ca +157.191.44.79 - 157.191.44.133 us +157.191.44.134 - 157.191.44.134 ca +157.191.44.135 - 157.191.44.137 us +157.191.44.138 - 157.191.44.138 ca +157.191.44.139 - 157.191.45.9 us +157.191.45.10 - 157.191.45.10 ca +157.191.45.11 - 157.191.45.69 us +157.191.45.70 - 157.191.45.70 mx +157.191.45.71 - 157.191.45.73 us +157.191.45.74 - 157.191.45.74 mx +157.191.45.75 - 157.191.45.77 us +157.191.45.78 - 157.191.45.78 ca +157.191.45.79 - 157.191.45.133 us +157.191.45.134 - 157.191.45.134 ca +157.191.45.135 - 157.191.45.137 us +157.191.45.138 - 157.191.45.138 ca +157.191.45.139 - 157.191.81.9 us +157.191.81.10 - 157.191.81.10 ca +157.191.81.11 - 157.191.81.69 us +157.191.81.70 - 157.191.81.70 mx +157.191.81.71 - 157.191.81.73 us +157.191.81.74 - 157.191.81.74 mx +157.191.81.75 - 157.191.81.77 us +157.191.81.78 - 157.191.81.78 ca +157.191.81.79 - 157.191.81.133 us +157.191.81.134 - 157.191.81.134 ca +157.191.81.135 - 157.191.81.137 us +157.191.81.138 - 157.191.81.138 ca +157.191.81.139 - 157.191.97.9 us +157.191.97.10 - 157.191.97.10 ca +157.191.97.11 - 157.191.97.69 us +157.191.97.70 - 157.191.97.70 mx +157.191.97.71 - 157.191.97.73 us +157.191.97.74 - 157.191.97.74 mx +157.191.97.75 - 157.191.97.77 us +157.191.97.78 - 157.191.97.78 ca +157.191.97.79 - 157.191.97.133 us +157.191.97.134 - 157.191.97.134 ca +157.191.97.135 - 157.191.97.137 us +157.191.97.138 - 157.191.97.138 ca +157.191.97.139 - 157.191.255.255 us 157.192.0.0 - 157.192.255.255 jp 157.193.0.0 - 157.193.255.255 be 157.194.0.0 - 157.196.255.255 us @@ -70584,12 +55288,18 @@ 157.203.0.0 - 157.203.255.255 gb 157.204.0.0 - 157.204.255.255 us 157.205.0.0 - 157.205.255.255 jp -157.206.0.0 - 157.210.255.255 us +157.206.0.0 - 157.207.64.255 us +157.207.65.0 - 157.207.65.255 gb +157.207.66.0 - 157.208.127.255 us +157.208.128.0 - 157.208.128.255 ca +157.208.129.0 - 157.210.255.255 us 157.211.0.0 - 157.211.255.255 au 157.212.0.0 - 157.226.255.255 us 157.227.0.0 - 157.227.255.255 in 157.228.0.0 - 157.228.255.255 gb -157.229.0.0 - 157.235.255.255 us +157.229.0.0 - 157.234.215.255 us +157.234.216.0 - 157.234.216.255 ap +157.234.217.0 - 157.235.255.255 us 157.236.0.0 - 157.236.255.255 gb 157.237.0.0 - 157.237.255.255 no 157.238.0.0 - 157.242.255.255 us @@ -70599,11 +55309,15 @@ 157.247.0.0 - 157.247.255.255 at 157.248.0.0 - 157.248.255.255 us 157.249.0.0 - 157.249.255.255 no -157.250.0.0 - 157.252.255.255 us +157.250.0.0 - 157.250.63.255 us +157.250.64.0 - 157.250.255.255 jp +157.251.0.0 - 157.252.255.255 us 157.253.0.0 - 157.253.255.255 co 157.254.0.0 - 157.254.255.255 us 157.255.0.0 - 157.255.255.255 cn -158.0.0.0 - 158.35.255.255 us +158.0.0.0 - 158.34.239.255 us +158.34.240.0 - 158.34.240.255 ap +158.34.241.0 - 158.35.255.255 us 158.36.0.0 - 158.39.255.255 no 158.40.0.0 - 158.40.255.255 au 158.41.0.0 - 158.41.255.255 gb @@ -70638,9 +55352,23 @@ 158.65.0.0 - 158.65.255.255 us 158.66.0.0 - 158.66.255.255 pl 158.67.0.0 - 158.67.255.255 eu -158.68.0.0 - 158.74.255.255 us +158.68.0.0 - 158.69.3.255 us +158.69.4.0 - 158.69.5.255 ca +158.69.6.0 - 158.69.9.255 us +158.69.10.0 - 158.69.10.127 ca +158.69.10.128 - 158.69.13.255 us +158.69.14.0 - 158.69.14.127 ca +158.69.14.128 - 158.69.15.255 us +158.69.16.0 - 158.69.16.79 ca +158.69.16.80 - 158.69.16.95 us +158.69.16.96 - 158.69.16.255 ca +158.69.17.0 - 158.69.199.200 us +158.69.199.201 - 158.69.199.201 ca +158.69.199.202 - 158.74.255.255 us 158.75.0.0 - 158.75.255.255 pl -158.76.0.0 - 158.88.255.255 us +158.76.0.0 - 158.85.63.255 us +158.85.64.0 - 158.85.127.255 ca +158.85.128.0 - 158.88.255.255 us 158.89.0.0 - 158.89.255.255 au 158.90.0.0 - 158.90.255.255 fi 158.91.0.0 - 158.91.255.255 us @@ -70655,18 +55383,26 @@ 158.102.0.0 - 158.102.255.255 it 158.103.0.0 - 158.104.255.255 us 158.105.0.0 - 158.105.255.255 se -158.106.0.0 - 158.107.255.255 us +158.106.0.0 - 158.106.63.255 us +158.106.64.0 - 158.106.127.255 ca +158.106.128.0 - 158.107.255.255 us 158.108.0.0 - 158.108.255.255 th 158.109.0.0 - 158.109.255.255 es 158.110.0.0 - 158.110.255.255 it 158.111.0.0 - 158.111.255.255 us 158.112.0.0 - 158.112.255.255 no -158.113.0.0 - 158.118.255.255 us +158.113.0.0 - 158.116.224.0 us +158.116.224.1 - 158.116.224.1 eu +158.116.224.2 - 158.118.255.255 us 158.119.0.0 - 158.119.255.255 gb 158.120.0.0 - 158.123.255.255 us 158.124.0.0 - 158.125.255.255 gb 158.126.0.0 - 158.126.255.255 se -158.127.0.0 - 158.127.255.255 fi +158.127.0.0 - 158.127.223.255 fi +158.127.224.0 - 158.127.228.255 nl +158.127.229.0 - 158.127.229.255 be +158.127.230.0 - 158.127.231.255 nl +158.127.232.0 - 158.127.255.255 fi 158.128.0.0 - 158.128.255.255 ca 158.129.0.0 - 158.129.255.255 lt 158.130.0.0 - 158.130.255.255 us @@ -70691,7 +55427,11 @@ 158.162.0.0 - 158.162.255.255 pt 158.163.0.0 - 158.163.255.255 ca 158.164.0.0 - 158.165.255.255 us -158.166.0.0 - 158.169.255.255 lu +158.166.0.0 - 158.169.39.255 lu +158.169.40.0 - 158.169.40.255 be +158.169.41.0 - 158.169.149.255 lu +158.169.150.0 - 158.169.150.255 be +158.169.151.0 - 158.169.255.255 lu 158.170.0.0 - 158.170.255.255 cl 158.171.0.0 - 158.171.255.255 us 158.172.0.0 - 158.172.255.255 es @@ -70699,8 +55439,10 @@ 158.174.0.0 - 158.180.255.255 gb 158.181.0.0 - 158.181.31.255 kg 158.181.32.0 - 158.181.47.255 az -158.181.48.0 - 158.181.55.255 de -158.181.56.0 - 158.181.63.255 gb +158.181.48.0 - 158.181.58.95 de +158.181.58.96 - 158.181.59.31 us +158.181.59.32 - 158.181.59.127 de +158.181.59.128 - 158.181.63.255 us 158.181.64.0 - 158.181.95.255 de 158.181.96.0 - 158.181.127.255 ch 158.181.128.0 - 158.181.255.255 kg @@ -70712,19 +55454,31 @@ 158.195.0.0 - 158.195.255.255 sk 158.196.0.0 - 158.196.255.255 cz 158.197.0.0 - 158.197.255.255 sk -158.198.0.0 - 158.215.255.255 jp +158.198.0.0 - 158.199.139.255 jp +158.199.140.0 - 158.199.140.255 cn +158.199.141.0 - 158.199.192.255 jp +158.199.193.0 - 158.199.193.255 cn +158.199.194.0 - 158.215.255.255 jp 158.216.0.0 - 158.216.255.255 ch 158.217.0.0 - 158.217.255.255 jp 158.218.0.0 - 158.218.255.255 gb 158.219.0.0 - 158.219.255.255 us 158.220.0.0 - 158.220.255.255 ch -158.221.0.0 - 158.222.127.255 us +158.221.0.0 - 158.222.39.255 us +158.222.40.0 - 158.222.41.255 mf +158.222.42.0 - 158.222.103.255 us +158.222.104.0 - 158.222.111.255 ca +158.222.112.0 - 158.222.255.255 us 158.223.0.0 - 158.223.255.255 gb 158.224.0.0 - 158.224.255.255 us 158.225.0.0 - 158.225.255.255 de 158.226.0.0 - 158.226.255.255 ch 158.227.0.0 - 158.227.255.255 es -158.228.0.0 - 158.229.255.255 us +158.228.0.0 - 158.228.161.255 us +158.228.162.0 - 158.228.162.255 gb +158.228.163.0 - 158.228.244.255 us +158.228.245.0 - 158.228.245.255 ca +158.228.246.0 - 158.229.255.255 us 158.230.0.0 - 158.230.255.255 gb 158.231.0.0 - 158.231.255.255 fr 158.232.0.0 - 158.232.255.255 ch @@ -70738,17 +55492,39 @@ 158.252.0.0 - 158.254.255.255 us 158.255.0.0 - 158.255.7.255 ru 158.255.8.0 - 158.255.15.255 gb -158.255.16.0 - 158.255.39.255 cz +158.255.16.0 - 158.255.23.255 cz +158.255.24.0 - 158.255.31.255 sk +158.255.32.0 - 158.255.39.255 cz 158.255.40.0 - 158.255.47.255 gb 158.255.48.0 - 158.255.55.255 ru 158.255.56.0 - 158.255.63.255 lv 158.255.64.0 - 158.255.79.255 fr 158.255.80.0 - 158.255.87.255 ru 158.255.88.0 - 158.255.95.255 pl -158.255.96.0 - 158.255.127.255 at +158.255.96.0 - 158.255.96.255 fr +158.255.97.0 - 158.255.98.191 at +158.255.98.192 - 158.255.98.223 fr +158.255.98.224 - 158.255.98.255 at +158.255.99.0 - 158.255.115.255 fr +158.255.116.0 - 158.255.119.255 at +158.255.120.0 - 158.255.127.255 fr 158.255.128.0 - 158.255.191.255 ru 158.255.192.0 - 158.255.207.255 it -158.255.208.0 - 158.255.215.255 at +158.255.208.0 - 158.255.208.255 hk +158.255.209.0 - 158.255.209.109 at +158.255.209.110 - 158.255.209.110 pt +158.255.209.111 - 158.255.209.111 es +158.255.209.112 - 158.255.209.112 us +158.255.209.113 - 158.255.209.113 cr +158.255.209.114 - 158.255.209.114 kn +158.255.209.115 - 158.255.209.115 br +158.255.209.116 - 158.255.209.116 fi +158.255.209.117 - 158.255.209.117 ch +158.255.209.118 - 158.255.209.118 gb +158.255.209.119 - 158.255.212.255 at +158.255.213.0 - 158.255.213.255 us +158.255.214.0 - 158.255.214.255 de +158.255.215.0 - 158.255.215.255 fr 158.255.216.0 - 158.255.223.255 se 158.255.224.0 - 158.255.231.255 gb 158.255.232.0 - 158.255.239.255 es @@ -70758,7 +55534,10 @@ 159.1.0.0 - 159.5.255.255 us 159.6.0.0 - 159.6.255.255 ca 159.7.0.0 - 159.7.255.255 se -159.8.0.0 - 159.8.255.255 ch +159.8.0.0 - 159.8.63.255 nl +159.8.64.0 - 159.8.127.255 fr +159.8.128.0 - 159.8.191.255 gb +159.8.192.0 - 159.8.255.255 nl 159.9.0.0 - 159.11.255.255 us 159.12.0.0 - 159.12.255.255 ch 159.13.0.0 - 159.13.255.255 au @@ -70775,9 +55554,17 @@ 159.20.32.0 - 159.20.63.255 gb 159.20.64.0 - 159.20.95.255 tr 159.20.96.0 - 159.20.111.255 ir +159.20.112.0 - 159.20.119.255 tr 159.20.120.0 - 159.20.127.255 es 159.20.128.0 - 159.20.255.255 it -159.21.0.0 - 159.21.255.255 us +159.21.0.0 - 159.21.63.255 us +159.21.64.0 - 159.21.67.255 gb +159.21.68.0 - 159.21.130.255 us +159.21.131.0 - 159.21.131.255 au +159.21.132.0 - 159.21.141.255 us +159.21.142.0 - 159.21.143.255 nz +159.21.144.0 - 159.21.147.255 in +159.21.148.0 - 159.21.255.255 us 159.22.0.0 - 159.22.255.255 ch 159.23.0.0 - 159.23.255.255 es 159.24.0.0 - 159.24.255.255 us @@ -70802,7 +55589,13 @@ 159.58.0.0 - 159.58.255.255 no 159.59.0.0 - 159.59.255.255 us 159.60.0.0 - 159.60.255.255 nl -159.61.0.0 - 159.63.167.255 us +159.61.0.0 - 159.63.20.247 us +159.63.20.248 - 159.63.20.251 de +159.63.20.252 - 159.63.21.85 us +159.63.21.86 - 159.63.21.86 gb +159.63.21.87 - 159.63.49.171 us +159.63.49.172 - 159.63.49.175 gb +159.63.49.176 - 159.63.167.255 us 159.63.168.0 - 159.63.171.255 ca 159.63.172.0 - 159.71.255.255 us 159.72.0.0 - 159.72.255.255 se @@ -70823,11 +55616,19 @@ 159.94.0.0 - 159.94.255.255 us 159.95.0.0 - 159.95.255.255 fr 159.96.0.0 - 159.99.255.255 us -159.100.0.0 - 159.101.255.255 gb +159.100.0.0 - 159.100.63.255 gb +159.100.64.0 - 159.100.127.255 nl +159.100.128.0 - 159.100.175.255 gb +159.100.176.0 - 159.100.181.6 us +159.100.181.7 - 159.100.181.7 gb +159.100.181.8 - 159.100.239.255 us +159.100.240.0 - 159.100.255.255 ch +159.101.0.0 - 159.101.207.255 gb +159.101.208.0 - 159.101.215.255 us +159.101.216.0 - 159.101.255.255 gb 159.102.0.0 - 159.102.255.255 us 159.103.0.0 - 159.103.255.255 ch -159.104.0.0 - 159.104.255.255 gb -159.105.0.0 - 159.106.255.255 us +159.104.0.0 - 159.106.255.255 us 159.107.0.0 - 159.107.255.255 se 159.108.0.0 - 159.108.255.255 us 159.109.0.0 - 159.109.255.255 fr @@ -70837,9 +55638,29 @@ 159.114.0.0 - 159.114.255.255 gb 159.115.0.0 - 159.116.255.255 us 159.117.0.0 - 159.117.255.255 nz -159.118.0.0 - 159.121.255.255 us -159.122.0.0 - 159.122.255.255 ch -159.123.0.0 - 159.127.255.255 us +159.118.0.0 - 159.122.5.223 us +159.122.5.224 - 159.122.5.255 it +159.122.6.0 - 159.122.15.127 us +159.122.15.128 - 159.122.15.135 jo +159.122.15.136 - 159.122.22.159 us +159.122.22.160 - 159.122.22.167 co +159.122.22.168 - 159.122.28.159 us +159.122.28.160 - 159.122.28.191 ae +159.122.28.192 - 159.122.63.255 us +159.122.64.0 - 159.122.127.255 de +159.122.128.0 - 159.122.129.201 us +159.122.129.202 - 159.122.129.202 de +159.122.129.203 - 159.122.129.203 us +159.122.129.204 - 159.122.129.204 de +159.122.129.205 - 159.122.130.255 us +159.122.131.0 - 159.122.131.255 it +159.122.132.0 - 159.122.133.191 us +159.122.133.192 - 159.122.133.255 it +159.122.134.0 - 159.122.217.127 us +159.122.217.128 - 159.122.217.159 gb +159.122.217.160 - 159.122.224.15 us +159.122.224.16 - 159.122.224.31 gb +159.122.224.32 - 159.127.255.255 us 159.128.0.0 - 159.128.255.255 ca 159.129.0.0 - 159.129.255.255 us 159.130.0.0 - 159.130.255.255 no @@ -70850,13 +55671,39 @@ 159.145.0.0 - 159.145.255.255 us 159.146.0.0 - 159.146.127.255 tr 159.146.128.0 - 159.146.255.255 ua -159.147.0.0 - 159.147.255.255 gb +159.147.0.0 - 159.147.255.255 es 159.148.0.0 - 159.148.255.255 lv 159.149.0.0 - 159.149.255.255 it 159.150.0.0 - 159.150.255.255 us 159.151.0.0 - 159.151.255.255 fr 159.152.0.0 - 159.152.255.255 fi -159.153.0.0 - 159.153.255.255 us +159.153.0.0 - 159.153.119.255 us +159.153.120.0 - 159.153.123.255 cn +159.153.124.0 - 159.153.135.255 us +159.153.136.0 - 159.153.136.255 ca +159.153.137.0 - 159.153.137.255 us +159.153.138.0 - 159.153.138.255 ca +159.153.139.0 - 159.153.143.255 us +159.153.144.0 - 159.153.144.255 ca +159.153.145.0 - 159.153.147.255 us +159.153.148.0 - 159.153.148.255 es +159.153.149.0 - 159.153.149.255 ca +159.153.150.0 - 159.153.150.255 se +159.153.151.0 - 159.153.156.59 us +159.153.156.60 - 159.153.156.60 gb +159.153.156.61 - 159.153.171.255 us +159.153.172.0 - 159.153.175.255 jp +159.153.176.0 - 159.153.179.255 us +159.153.180.0 - 159.153.181.255 ro +159.153.182.0 - 159.153.183.255 us +159.153.184.0 - 159.153.187.255 sg +159.153.188.0 - 159.153.210.255 us +159.153.211.0 - 159.153.211.255 au +159.153.212.0 - 159.153.215.255 us +159.153.216.0 - 159.153.216.255 au +159.153.217.0 - 159.153.217.255 in +159.153.218.0 - 159.153.218.255 kr +159.153.219.0 - 159.153.255.255 us 159.154.0.0 - 159.154.255.255 de 159.155.0.0 - 159.155.255.255 us 159.156.0.0 - 159.156.255.255 ch @@ -70871,12 +55718,29 @@ 159.169.0.0 - 159.169.255.255 us 159.170.0.0 - 159.170.255.255 gb 159.171.0.0 - 159.171.255.255 no -159.172.0.0 - 159.172.139.255 us +159.172.0.0 - 159.172.7.255 us +159.172.8.0 - 159.172.8.255 gb +159.172.9.0 - 159.172.51.255 us +159.172.52.0 - 159.172.52.255 br +159.172.53.0 - 159.172.63.255 us +159.172.64.0 - 159.172.64.255 au +159.172.65.0 - 159.172.103.255 us +159.172.104.0 - 159.172.111.255 fr +159.172.112.0 - 159.172.139.255 us 159.172.140.0 - 159.172.140.255 gb -159.172.141.0 - 159.172.141.255 de -159.172.142.0 - 159.172.142.255 us +159.172.141.0 - 159.172.141.255 us +159.172.142.0 - 159.172.142.255 de 159.172.143.0 - 159.172.143.255 nl -159.172.144.0 - 159.172.255.255 us +159.172.144.0 - 159.172.144.255 gb +159.172.145.0 - 159.172.171.255 us +159.172.172.0 - 159.172.172.255 cl +159.172.173.0 - 159.172.203.255 us +159.172.204.0 - 159.172.204.255 nz +159.172.205.0 - 159.172.205.255 sg +159.172.206.0 - 159.172.240.255 us +159.172.241.0 - 159.172.241.255 nl +159.172.242.0 - 159.172.242.255 au +159.172.243.0 - 159.172.255.255 us 159.173.0.0 - 159.173.255.255 fr 159.174.0.0 - 159.174.255.255 us 159.175.0.0 - 159.175.255.255 ca @@ -70884,17 +55748,36 @@ 159.177.0.0 - 159.177.255.255 ca 159.178.0.0 - 159.178.255.255 us 159.179.0.0 - 159.179.255.255 ch -159.180.0.0 - 159.180.255.255 gb -159.181.0.0 - 159.189.255.255 us +159.180.0.0 - 159.180.127.255 gb +159.180.128.0 - 159.180.159.255 us +159.180.160.0 - 159.180.162.11 pr +159.180.162.12 - 159.180.162.12 de +159.180.162.13 - 159.180.175.255 pr +159.180.176.0 - 159.180.183.255 sg +159.180.184.0 - 159.180.191.255 pr +159.180.192.0 - 159.180.223.255 us +159.180.224.0 - 159.180.255.255 fr +159.181.0.0 - 159.182.40.255 us +159.182.41.0 - 159.182.42.255 gb +159.182.43.0 - 159.182.71.255 us +159.182.72.0 - 159.182.79.255 gb +159.182.80.0 - 159.182.119.255 us +159.182.120.0 - 159.182.127.255 gb +159.182.128.0 - 159.189.255.255 us 159.190.0.0 - 159.190.255.255 se -159.191.0.0 - 159.192.255.255 us -159.193.0.0 - 159.194.255.255 se +159.191.0.0 - 159.191.255.255 us +159.192.0.0 - 159.192.255.255 th +159.193.0.0 - 159.193.149.255 se +159.193.150.0 - 159.193.150.255 dk +159.193.151.0 - 159.194.255.255 se 159.195.0.0 - 159.195.255.255 dk 159.196.0.0 - 159.196.255.255 au 159.197.0.0 - 159.197.255.255 gb 159.198.0.0 - 159.199.255.255 us 159.200.0.0 - 159.200.255.255 se -159.201.0.0 - 159.204.255.255 us +159.201.0.0 - 159.202.255.255 us +159.203.0.0 - 159.203.63.255 ca +159.203.64.0 - 159.204.255.255 us 159.205.0.0 - 159.205.255.255 pl 159.206.0.0 - 159.206.255.255 ca 159.207.0.0 - 159.207.255.255 au @@ -70904,17 +55787,30 @@ 159.211.0.0 - 159.211.255.255 jp 159.212.0.0 - 159.212.255.255 us 159.213.0.0 - 159.213.255.255 it -159.214.0.0 - 159.215.255.255 us +159.214.0.0 - 159.215.129.255 us +159.215.130.0 - 159.215.130.255 hk +159.215.131.0 - 159.215.247.255 us +159.215.248.0 - 159.215.255.255 fr 159.216.0.0 - 159.216.255.255 no 159.217.0.0 - 159.217.255.255 fr 159.218.0.0 - 159.218.255.255 us 159.219.0.0 - 159.219.255.255 gb -159.220.0.0 - 159.223.255.255 us +159.220.0.0 - 159.220.51.255 us +159.220.52.0 - 159.220.52.255 gb +159.220.53.0 - 159.220.73.255 us +159.220.74.0 - 159.220.75.255 gb +159.220.76.0 - 159.220.76.5 th +159.220.76.6 - 159.220.76.7 sg +159.220.76.8 - 159.220.76.255 th +159.220.77.0 - 159.220.77.255 us +159.220.78.0 - 159.220.78.255 in +159.220.79.0 - 159.221.183.255 us +159.221.184.0 - 159.221.184.255 gb +159.221.185.0 - 159.223.255.255 us 159.224.0.0 - 159.224.255.255 ua 159.225.0.0 - 159.225.255.255 us 159.226.0.0 - 159.226.255.255 cn 159.227.0.0 - 159.227.255.255 us -159.228.0.0 - 159.228.255.255 jp 159.229.0.0 - 159.230.255.255 us 159.231.0.0 - 159.231.255.255 ca 159.232.0.0 - 159.232.255.255 ch @@ -70928,10 +55824,15 @@ 159.242.0.0 - 159.243.255.255 us 159.244.0.0 - 159.244.255.255 gb 159.245.0.0 - 159.245.15.255 eu -159.245.16.0 - 159.245.31.255 nl +159.245.16.0 - 159.245.16.99 fr +159.245.16.100 - 159.245.16.100 eu +159.245.16.101 - 159.245.16.255 fr +159.245.17.0 - 159.245.31.255 nl 159.245.32.0 - 159.245.47.255 us -159.245.48.0 - 159.245.63.255 sg -159.245.64.0 - 159.245.255.255 eu +159.245.48.0 - 159.245.48.255 ap +159.245.49.0 - 159.245.63.255 sg +159.245.64.0 - 159.245.67.255 us +159.245.68.0 - 159.245.255.255 eu 159.246.0.0 - 159.247.255.255 us 159.248.0.0 - 159.248.255.255 au 159.249.0.0 - 159.252.255.255 us @@ -70947,268 +55848,13 @@ 159.253.104.0 - 159.253.111.255 sk 159.253.112.0 - 159.253.119.255 de 159.253.120.0 - 159.253.127.255 ru -159.253.128.0 - 159.253.129.255 nl -159.253.130.0 - 159.253.130.7 hr -159.253.130.8 - 159.253.130.15 it -159.253.130.16 - 159.253.130.27 au -159.253.130.28 - 159.253.130.31 us -159.253.130.32 - 159.253.130.39 gb -159.253.130.40 - 159.253.130.47 us -159.253.130.48 - 159.253.130.55 gb -159.253.130.56 - 159.253.130.63 eg -159.253.130.64 - 159.253.130.71 hr -159.253.130.72 - 159.253.130.75 eg -159.253.130.76 - 159.253.130.79 nl -159.253.130.80 - 159.253.130.87 us -159.253.130.88 - 159.253.130.95 ca -159.253.130.96 - 159.253.130.103 br -159.253.130.104 - 159.253.130.111 ma -159.253.130.112 - 159.253.130.119 hr -159.253.130.120 - 159.253.130.127 cn -159.253.130.128 - 159.253.130.135 sg -159.253.130.136 - 159.253.130.143 ph -159.253.130.144 - 159.253.130.151 au -159.253.130.152 - 159.253.130.159 cn -159.253.130.160 - 159.253.130.167 no -159.253.130.168 - 159.253.130.191 us -159.253.130.192 - 159.253.130.207 au -159.253.130.208 - 159.253.130.223 cn -159.253.130.224 - 159.253.131.127 us -159.253.131.128 - 159.253.132.23 nl -159.253.132.24 - 159.253.132.135 us -159.253.132.136 - 159.253.132.143 lt -159.253.132.144 - 159.253.132.155 it -159.253.132.156 - 159.253.132.175 us -159.253.132.176 - 159.253.132.183 tr -159.253.132.184 - 159.253.132.223 us -159.253.132.224 - 159.253.132.231 nl -159.253.132.232 - 159.253.132.255 us -159.253.133.0 - 159.253.133.7 es -159.253.133.8 - 159.253.133.15 ae -159.253.133.16 - 159.253.133.31 cn -159.253.133.32 - 159.253.133.39 us -159.253.133.40 - 159.253.133.47 al -159.253.133.48 - 159.253.133.55 nl -159.253.133.56 - 159.253.133.63 in -159.253.133.64 - 159.253.133.71 al -159.253.133.72 - 159.253.133.79 us -159.253.133.80 - 159.253.133.87 in -159.253.133.88 - 159.253.133.95 sg -159.253.133.96 - 159.253.133.103 cy -159.253.133.104 - 159.253.133.107 gb -159.253.133.108 - 159.253.133.109 ca -159.253.133.110 - 159.253.133.111 tr -159.253.133.112 - 159.253.133.119 ch -159.253.133.120 - 159.253.133.127 do -159.253.133.128 - 159.253.133.191 ae -159.253.133.192 - 159.253.133.215 us -159.253.133.216 - 159.253.133.223 ca -159.253.133.224 - 159.253.133.239 us -159.253.133.240 - 159.253.133.247 in -159.253.133.248 - 159.253.134.23 us -159.253.134.24 - 159.253.134.31 ru -159.253.134.32 - 159.253.134.39 dk -159.253.134.40 - 159.253.134.47 us -159.253.134.48 - 159.253.134.63 nl -159.253.134.64 - 159.253.134.71 us -159.253.134.72 - 159.253.134.79 ae -159.253.134.80 - 159.253.134.87 us -159.253.134.88 - 159.253.134.91 ae -159.253.134.92 - 159.253.134.95 sa -159.253.134.96 - 159.253.134.103 ae -159.253.134.104 - 159.253.134.115 us -159.253.134.116 - 159.253.134.119 gb -159.253.134.120 - 159.253.134.127 bm -159.253.134.128 - 159.253.134.131 ca -159.253.134.132 - 159.253.134.143 us -159.253.134.144 - 159.253.134.151 au -159.253.134.152 - 159.253.134.159 us -159.253.134.160 - 159.253.134.167 ca -159.253.134.168 - 159.253.134.171 ch -159.253.134.172 - 159.253.134.175 nl -159.253.134.176 - 159.253.134.183 br -159.253.134.184 - 159.253.134.191 nl -159.253.134.192 - 159.253.134.203 tr -159.253.134.204 - 159.253.134.207 cn -159.253.134.208 - 159.253.134.215 us -159.253.134.216 - 159.253.134.223 cn -159.253.134.224 - 159.253.134.239 us -159.253.134.240 - 159.253.134.247 gb -159.253.134.248 - 159.253.134.251 hr -159.253.134.252 - 159.253.134.253 ca -159.253.134.254 - 159.253.134.254 bh -159.253.134.255 - 159.253.134.255 ru -159.253.135.0 - 159.253.135.63 us -159.253.135.64 - 159.253.135.127 nl -159.253.135.128 - 159.253.135.143 gr -159.253.135.144 - 159.253.135.151 gb -159.253.135.152 - 159.253.135.155 ae -159.253.135.156 - 159.253.135.159 ru -159.253.135.160 - 159.253.135.175 us -159.253.135.176 - 159.253.135.183 nl -159.253.135.184 - 159.253.135.191 it -159.253.135.192 - 159.253.135.199 be -159.253.135.200 - 159.253.135.203 ph -159.253.135.204 - 159.253.135.207 ca -159.253.135.208 - 159.253.135.215 nl -159.253.135.216 - 159.253.135.219 be -159.253.135.220 - 159.253.135.255 us -159.253.136.0 - 159.253.136.7 tr -159.253.136.8 - 159.253.136.31 us -159.253.136.32 - 159.253.136.39 gb -159.253.136.40 - 159.253.136.55 pl -159.253.136.56 - 159.253.136.63 ca -159.253.136.64 - 159.253.136.71 no -159.253.136.72 - 159.253.136.95 us -159.253.136.96 - 159.253.136.103 nl -159.253.136.104 - 159.253.136.111 cn -159.253.136.112 - 159.253.136.115 tr -159.253.136.116 - 159.253.136.119 pl -159.253.136.120 - 159.253.136.127 us -159.253.136.128 - 159.253.136.159 lt -159.253.136.160 - 159.253.136.171 es -159.253.136.172 - 159.253.136.183 us -159.253.136.184 - 159.253.136.191 es -159.253.136.192 - 159.253.136.203 pl -159.253.136.204 - 159.253.136.207 es -159.253.136.208 - 159.253.136.215 sa -159.253.136.216 - 159.253.136.223 tr -159.253.136.224 - 159.253.136.231 br -159.253.136.232 - 159.253.136.239 sa -159.253.136.240 - 159.253.136.247 gb -159.253.136.248 - 159.253.136.251 cn -159.253.136.252 - 159.253.136.252 bh -159.253.136.253 - 159.253.136.255 nl -159.253.137.0 - 159.253.137.7 tr -159.253.137.8 - 159.253.137.15 gr -159.253.137.16 - 159.253.137.39 br -159.253.137.40 - 159.253.137.47 us -159.253.137.48 - 159.253.137.55 eg -159.253.137.56 - 159.253.137.63 hr -159.253.137.64 - 159.253.137.95 gb -159.253.137.96 - 159.253.137.103 cn -159.253.137.104 - 159.253.137.123 us -159.253.137.124 - 159.253.137.127 gr -159.253.137.128 - 159.253.137.135 nz -159.253.137.136 - 159.253.137.143 sa -159.253.137.144 - 159.253.137.151 us -159.253.137.152 - 159.253.137.159 nl -159.253.137.160 - 159.253.137.171 tr -159.253.137.172 - 159.253.137.175 cn -159.253.137.176 - 159.253.137.191 be -159.253.137.192 - 159.253.137.199 us -159.253.137.200 - 159.253.137.207 br -159.253.137.208 - 159.253.137.215 us -159.253.137.216 - 159.253.137.223 br -159.253.137.224 - 159.253.137.231 es -159.253.137.232 - 159.253.137.239 us -159.253.137.240 - 159.253.137.247 no -159.253.137.248 - 159.253.137.255 cz -159.253.138.0 - 159.253.138.15 us -159.253.138.16 - 159.253.138.31 cn -159.253.138.32 - 159.253.138.103 us -159.253.138.104 - 159.253.138.111 cn -159.253.138.112 - 159.253.138.119 jo -159.253.138.120 - 159.253.138.127 pl -159.253.138.128 - 159.253.138.159 sa -159.253.138.160 - 159.253.138.167 us -159.253.138.168 - 159.253.138.175 gb -159.253.138.176 - 159.253.138.187 us -159.253.138.188 - 159.253.138.191 ae -159.253.138.192 - 159.253.138.199 mx -159.253.138.200 - 159.253.138.207 in -159.253.138.208 - 159.253.138.239 us -159.253.138.240 - 159.253.138.247 in -159.253.138.248 - 159.253.138.255 gb -159.253.139.0 - 159.253.139.7 in -159.253.139.8 - 159.253.139.15 au -159.253.139.16 - 159.253.139.23 sa -159.253.139.24 - 159.253.139.31 cn -159.253.139.32 - 159.253.139.39 tr -159.253.139.40 - 159.253.139.47 cn -159.253.139.48 - 159.253.139.55 ru -159.253.139.56 - 159.253.139.63 es -159.253.139.64 - 159.253.139.71 in -159.253.139.72 - 159.253.139.79 cn -159.253.139.80 - 159.253.139.87 in -159.253.139.88 - 159.253.139.95 gr -159.253.139.96 - 159.253.139.111 in -159.253.139.112 - 159.253.139.119 au -159.253.139.120 - 159.253.139.123 cn -159.253.139.124 - 159.253.139.127 us -159.253.139.128 - 159.253.139.135 ch -159.253.139.136 - 159.253.139.139 us -159.253.139.140 - 159.253.139.143 tr -159.253.139.144 - 159.253.139.151 de -159.253.139.152 - 159.253.139.155 us -159.253.139.156 - 159.253.139.159 gr -159.253.139.160 - 159.253.139.175 gb -159.253.139.176 - 159.253.139.183 tr -159.253.139.184 - 159.253.139.191 cn -159.253.139.192 - 159.253.139.223 us -159.253.139.224 - 159.253.139.231 es -159.253.139.232 - 159.253.139.239 ar -159.253.139.240 - 159.253.139.251 us -159.253.139.252 - 159.253.139.255 nl -159.253.140.0 - 159.253.140.7 ae -159.253.140.8 - 159.253.140.15 fr -159.253.140.16 - 159.253.140.23 au -159.253.140.24 - 159.253.140.31 gb -159.253.140.32 - 159.253.140.39 es -159.253.140.40 - 159.253.140.63 us -159.253.140.64 - 159.253.140.79 gb -159.253.140.80 - 159.253.140.119 us -159.253.140.120 - 159.253.140.127 at -159.253.140.128 - 159.253.140.135 us -159.253.140.136 - 159.253.140.139 at -159.253.140.140 - 159.253.140.143 gb -159.253.140.144 - 159.253.140.159 us -159.253.140.160 - 159.253.140.167 in -159.253.140.168 - 159.253.140.171 cn -159.253.140.172 - 159.253.140.183 gb -159.253.140.184 - 159.253.140.191 ru -159.253.140.192 - 159.253.140.247 us -159.253.140.248 - 159.253.140.255 mt -159.253.141.0 - 159.253.141.7 gb -159.253.141.8 - 159.253.141.39 us -159.253.141.40 - 159.253.141.47 gr -159.253.141.48 - 159.253.141.55 mx -159.253.141.56 - 159.253.141.71 us -159.253.141.72 - 159.253.141.79 bg -159.253.141.80 - 159.253.141.87 gb -159.253.141.88 - 159.253.141.95 mx -159.253.141.96 - 159.253.141.103 us -159.253.141.104 - 159.253.141.111 eg -159.253.141.112 - 159.253.141.119 us -159.253.141.120 - 159.253.141.123 pa -159.253.141.124 - 159.253.141.127 il -159.253.141.128 - 159.253.141.159 nl -159.253.141.160 - 159.253.141.191 us -159.253.141.192 - 159.253.141.223 nl -159.253.141.224 - 159.253.141.231 gb -159.253.141.232 - 159.253.141.239 bz -159.253.141.240 - 159.253.141.247 pa -159.253.141.248 - 159.253.141.255 ca -159.253.142.0 - 159.253.142.7 se -159.253.142.8 - 159.253.142.15 il -159.253.142.16 - 159.253.142.23 nl -159.253.142.24 - 159.253.142.27 az -159.253.142.28 - 159.253.142.31 nl -159.253.142.32 - 159.253.142.39 az -159.253.142.40 - 159.253.142.43 il -159.253.142.44 - 159.253.142.47 nl -159.253.142.48 - 159.253.142.55 us -159.253.142.56 - 159.253.152.255 nl -159.253.153.0 - 159.253.154.255 gb -159.253.155.0 - 159.253.157.255 nl -159.253.158.0 - 159.253.167.255 gb +159.253.128.0 - 159.253.159.255 nl +159.253.160.0 - 159.253.167.255 gb 159.253.168.0 - 159.253.175.255 ru -159.253.176.0 - 159.253.179.255 cz -159.253.180.0 - 159.253.181.255 hk -159.253.182.0 - 159.253.183.255 gb +159.253.176.0 - 159.253.183.255 gb 159.253.184.0 - 159.253.191.255 it 159.253.192.0 - 159.253.215.255 gb -159.253.216.0 - 159.253.223.255 mk +159.253.216.0 - 159.253.223.255 se 159.253.224.0 - 159.253.231.255 be 159.253.232.0 - 159.253.239.255 cz 159.253.240.0 - 159.253.247.255 pl @@ -71223,14 +55869,7 @@ 159.255.160.0 - 159.255.167.255 iq 159.255.168.0 - 159.255.175.255 de 159.255.176.0 - 159.255.191.255 pl -159.255.192.0 - 159.255.192.127 nl -159.255.192.128 - 159.255.192.223 es -159.255.192.224 - 159.255.193.255 nl -159.255.194.0 - 159.255.195.159 es -159.255.195.160 - 159.255.195.175 nl -159.255.195.176 - 159.255.195.191 es -159.255.195.192 - 159.255.195.255 nl -159.255.196.0 - 159.255.199.255 es +159.255.192.0 - 159.255.199.255 es 159.255.200.0 - 159.255.215.255 gb 159.255.216.0 - 159.255.223.255 nl 159.255.224.0 - 159.255.255.255 fi @@ -71242,7 +55881,7 @@ 160.8.0.0 - 160.8.255.255 se 160.9.0.0 - 160.9.255.255 gb 160.10.0.0 - 160.10.255.255 us -160.11.0.0 - 160.30.255.255 jp +160.11.0.0 - 160.29.255.255 jp 160.31.0.0 - 160.37.255.255 us 160.38.0.0 - 160.38.255.255 gb 160.39.0.0 - 160.39.255.255 us @@ -71250,24 +55889,23 @@ 160.41.0.0 - 160.43.255.255 us 160.44.0.0 - 160.44.230.207 de 160.44.230.208 - 160.44.230.215 gb -160.44.230.216 - 160.44.230.223 se -160.44.230.224 - 160.44.233.32 de -160.44.233.33 - 160.44.233.36 fr -160.44.233.37 - 160.44.238.47 de -160.44.238.48 - 160.44.238.55 us -160.44.238.56 - 160.44.238.63 cn -160.44.238.64 - 160.51.255.255 de +160.44.230.216 - 160.44.248.163 de +160.44.248.164 - 160.44.248.164 eu +160.44.248.165 - 160.48.233.255 de +160.48.234.0 - 160.48.234.255 za +160.48.235.0 - 160.51.255.255 de 160.52.0.0 - 160.52.255.255 at 160.53.0.0 - 160.53.255.255 ch 160.54.0.0 - 160.58.255.255 de 160.59.0.0 - 160.59.255.255 ch 160.60.0.0 - 160.60.255.255 de -160.61.0.0 - 160.62.8.255 ch -160.62.9.0 - 160.62.9.255 cn -160.62.10.0 - 160.62.11.255 ch -160.62.12.0 - 160.62.13.255 sg -160.62.14.0 - 160.62.15.255 us -160.62.16.0 - 160.63.255.255 ch +160.61.0.0 - 160.62.4.9 ch +160.62.4.10 - 160.62.4.10 eu +160.62.4.11 - 160.62.7.127 ch +160.62.7.128 - 160.62.7.255 de +160.62.8.0 - 160.62.12.255 ch +160.62.13.0 - 160.62.13.255 ap +160.62.14.0 - 160.63.255.255 ch 160.64.0.0 - 160.64.255.255 au 160.65.0.0 - 160.65.255.255 us 160.66.0.0 - 160.66.255.255 it @@ -71293,9 +55931,7 @@ 160.79.134.0 - 160.79.135.255 gb 160.79.136.0 - 160.79.141.255 us 160.79.142.0 - 160.79.143.255 gb -160.79.144.0 - 160.79.194.255 us -160.79.195.0 - 160.79.195.255 gb -160.79.196.0 - 160.79.213.255 us +160.79.144.0 - 160.79.213.255 us 160.79.214.0 - 160.79.215.255 gb 160.79.216.0 - 160.79.239.255 us 160.79.240.0 - 160.79.241.255 gb @@ -71303,7 +55939,18 @@ 160.79.243.0 - 160.79.245.255 gb 160.79.246.0 - 160.79.255.255 us 160.80.0.0 - 160.80.255.255 it -160.81.0.0 - 160.84.255.255 us +160.81.0.0 - 160.83.29.255 us +160.83.30.0 - 160.83.30.255 de +160.83.31.0 - 160.83.33.255 us +160.83.34.0 - 160.83.35.255 tr +160.83.36.0 - 160.83.36.255 gb +160.83.37.0 - 160.83.41.255 us +160.83.42.0 - 160.83.42.255 gb +160.83.43.0 - 160.83.95.255 us +160.83.96.0 - 160.83.97.255 in +160.83.98.0 - 160.83.159.255 us +160.83.160.0 - 160.83.160.255 au +160.83.161.0 - 160.84.255.255 us 160.85.0.0 - 160.85.255.255 ch 160.86.0.0 - 160.91.255.255 us 160.92.0.0 - 160.92.255.255 fr @@ -71319,17 +55966,35 @@ 160.106.0.0 - 160.106.255.255 ca 160.107.0.0 - 160.112.255.255 us 160.114.0.0 - 160.114.255.255 hu -160.115.0.0 - 160.124.255.255 za -160.125.0.0 - 160.159.255.255 us +160.115.0.0 - 160.119.255.255 za +160.120.0.0 - 160.120.255.255 ci +160.121.0.0 - 160.124.255.255 za +160.125.0.0 - 160.151.255.255 us +160.152.0.0 - 160.152.255.255 ng +160.153.0.0 - 160.153.255.255 us +160.154.0.0 - 160.155.255.255 ci +160.156.0.0 - 160.159.255.255 tn +160.160.0.0 - 160.179.255.255 ma 160.180.0.0 - 160.180.255.255 it -160.184.0.0 - 160.204.255.255 jp +160.181.0.0 - 160.181.255.255 bg +160.184.0.0 - 160.184.255.255 za +160.185.0.0 - 160.204.255.255 jp 160.205.0.0 - 160.205.255.255 us -160.206.0.0 - 160.206.255.255 au +160.206.0.0 - 160.206.127.255 au +160.206.128.0 - 160.206.128.255 es +160.206.129.0 - 160.206.135.255 au +160.206.136.0 - 160.206.143.255 us +160.206.144.0 - 160.206.144.255 gb +160.206.145.0 - 160.206.147.255 au +160.206.148.0 - 160.206.153.255 us +160.206.154.0 - 160.206.255.255 au 160.207.0.0 - 160.209.255.255 us 160.210.0.0 - 160.210.255.255 is -160.211.0.0 - 160.211.255.255 de +160.211.0.0 - 160.211.125.255 de +160.211.126.0 - 160.211.126.255 nl +160.211.127.0 - 160.211.255.255 de 160.212.0.0 - 160.212.255.255 us -160.213.0.0 - 160.213.255.255 gb +160.213.0.0 - 160.213.255.255 de 160.214.0.0 - 160.214.255.255 es 160.215.0.0 - 160.215.255.255 jp 160.216.0.0 - 160.218.255.255 cz @@ -71338,33 +56003,76 @@ 160.221.0.0 - 160.221.255.255 be 160.222.0.0 - 160.222.255.255 au 160.223.0.0 - 160.223.255.255 ca +160.224.0.0 - 160.225.255.255 ao +160.226.0.0 - 160.226.127.255 ng 160.227.0.0 - 160.227.255.255 us 160.228.0.0 - 160.228.255.255 fr 160.229.0.0 - 160.232.255.255 us -160.233.0.0 - 160.252.255.255 jp +160.233.0.0 - 160.233.255.255 jp +160.235.0.0 - 160.241.255.255 jp +160.242.0.0 - 160.242.127.255 na +160.242.128.0 - 160.242.191.255 ug +160.243.0.0 - 160.252.255.255 jp 160.253.0.0 - 160.254.255.255 us +160.255.0.0 - 160.255.255.255 bg +161.0.0.0 - 161.0.0.31 hn +161.0.0.32 - 161.0.0.47 ca +161.0.0.48 - 161.0.2.255 hn +161.0.3.0 - 161.0.3.15 cr +161.0.3.16 - 161.0.16.175 hn +161.0.16.176 - 161.0.16.183 us +161.0.16.184 - 161.0.28.191 hn +161.0.28.192 - 161.0.28.207 uy +161.0.28.208 - 161.0.31.255 hn +161.0.32.0 - 161.0.63.255 ni +161.0.64.0 - 161.0.67.255 ar +161.0.68.0 - 161.0.71.255 hn +161.0.72.0 - 161.0.79.255 ar +161.0.80.0 - 161.0.95.255 bq +161.0.96.0 - 161.0.111.255 cw +161.0.112.0 - 161.0.119.255 tt +161.0.120.0 - 161.0.127.255 uy +161.0.128.0 - 161.0.151.255 ht +161.0.152.0 - 161.0.159.255 tt +161.0.160.0 - 161.0.175.255 cl +161.0.176.0 - 161.0.183.255 ar +161.0.184.0 - 161.0.191.255 cl +161.0.192.0 - 161.0.223.255 hn +161.0.224.0 - 161.0.255.255 tt 161.1.0.0 - 161.1.255.255 us 161.2.0.0 - 161.2.255.255 gb 161.3.0.0 - 161.3.255.255 fr 161.4.0.0 - 161.4.255.255 no 161.5.0.0 - 161.5.255.255 at 161.6.0.0 - 161.7.255.255 us -161.8.0.0 - 161.8.255.255 ru +161.8.0.0 - 161.8.127.255 ru +161.8.128.0 - 161.8.253.255 us +161.8.254.0 - 161.8.255.255 ru 161.9.0.0 - 161.9.255.255 tr +161.10.0.0 - 161.10.255.255 co 161.11.0.0 - 161.11.255.255 us 161.12.0.0 - 161.12.255.255 gb 161.13.0.0 - 161.16.255.255 us 161.17.0.0 - 161.17.255.255 gb +161.18.0.0 - 161.18.255.255 co 161.19.0.0 - 161.19.255.255 ca 161.20.0.0 - 161.20.255.255 ch 161.21.0.0 - 161.21.255.255 us +161.22.0.0 - 161.22.31.255 ar +161.22.32.0 - 161.22.39.255 ve +161.22.40.0 - 161.22.47.255 mx +161.22.48.0 - 161.22.49.255 pa +161.22.50.0 - 161.22.55.255 cw +161.22.56.0 - 161.22.63.255 br +161.22.64.0 - 161.22.127.255 gf +161.22.128.0 - 161.22.255.255 bo 161.23.0.0 - 161.23.255.255 gb 161.24.0.0 - 161.24.255.255 br 161.25.0.0 - 161.25.255.255 cl 161.26.0.0 - 161.26.255.255 us 161.27.0.0 - 161.27.255.255 it 161.28.0.0 - 161.28.255.255 us -161.29.0.0 - 161.29.255.255 nz +161.29.0.0 - 161.29.255.255 au 161.30.0.0 - 161.30.255.255 gb 161.31.0.0 - 161.36.255.255 us 161.37.0.0 - 161.37.255.255 es @@ -71376,20 +56084,38 @@ 161.48.0.0 - 161.48.255.255 fr 161.49.0.0 - 161.49.255.255 us 161.50.0.0 - 161.50.255.255 au -161.51.0.0 - 161.51.255.255 us +161.51.0.0 - 161.51.10.255 us +161.51.11.0 - 161.51.11.255 gb +161.51.12.0 - 161.51.42.255 us +161.51.43.0 - 161.51.43.255 au +161.51.44.0 - 161.51.255.255 us 161.52.0.0 - 161.52.255.255 se 161.53.0.0 - 161.53.255.255 hr 161.54.0.0 - 161.54.255.255 se 161.55.0.0 - 161.55.255.255 us +161.56.0.0 - 161.56.255.255 bo 161.57.0.0 - 161.58.255.255 us 161.59.0.0 - 161.59.255.255 be 161.60.0.0 - 161.61.255.255 us 161.62.0.0 - 161.62.255.255 ch 161.63.0.0 - 161.63.255.255 us 161.64.0.0 - 161.64.255.255 mo -161.65.0.0 - 161.66.255.255 nz +161.65.0.0 - 161.65.31.255 au +161.65.32.0 - 161.65.63.255 nz +161.65.64.0 - 161.65.159.255 au +161.65.160.0 - 161.65.191.255 nz +161.65.192.0 - 161.65.255.255 au +161.66.0.0 - 161.66.255.255 nz 161.67.0.0 - 161.67.255.255 es -161.68.0.0 - 161.70.255.255 us +161.68.0.0 - 161.68.30.255 us +161.68.31.0 - 161.68.31.255 ca +161.68.32.0 - 161.69.134.255 us +161.69.135.0 - 161.69.135.255 de +161.69.136.0 - 161.69.147.255 us +161.69.148.0 - 161.69.151.255 gb +161.69.152.0 - 161.69.219.255 us +161.69.220.0 - 161.69.223.255 in +161.69.224.0 - 161.70.255.255 us 161.71.0.0 - 161.71.255.255 gb 161.72.0.0 - 161.72.255.255 es 161.73.0.0 - 161.74.255.255 gb @@ -71405,26 +56131,52 @@ 161.88.240.0 - 161.88.255.255 us 161.89.0.0 - 161.92.255.255 nl 161.93.0.0 - 161.96.255.255 jp -161.97.0.0 - 161.98.255.255 us -161.99.0.0 - 161.103.255.255 gb +161.97.0.0 - 161.103.255.255 us 161.104.0.0 - 161.106.255.255 fr 161.107.0.0 - 161.109.255.255 us 161.110.0.0 - 161.110.255.255 at 161.111.0.0 - 161.111.255.255 es 161.112.0.0 - 161.112.255.255 gb -161.113.0.0 - 161.115.255.255 us +161.113.0.0 - 161.114.125.255 us +161.114.126.0 - 161.114.126.255 eu +161.114.127.0 - 161.115.255.255 us 161.116.0.0 - 161.116.255.255 es 161.117.0.0 - 161.117.255.255 au 161.118.0.0 - 161.118.255.255 jp 161.119.0.0 - 161.121.255.255 us 161.122.0.0 - 161.122.255.255 kr +161.123.0.0 - 161.123.127.255 za +161.123.128.0 - 161.123.128.255 es +161.123.129.0 - 161.123.129.255 za +161.123.130.0 - 161.123.130.255 es +161.123.131.0 - 161.123.192.255 za +161.123.193.0 - 161.123.193.255 us +161.123.194.0 - 161.123.194.255 za +161.123.195.0 - 161.123.195.255 us +161.123.196.0 - 161.123.196.255 za +161.123.197.0 - 161.123.197.255 us +161.123.198.0 - 161.123.198.255 za +161.123.199.0 - 161.123.199.255 us +161.123.200.0 - 161.123.200.255 za +161.123.201.0 - 161.123.201.255 us +161.123.202.0 - 161.123.202.255 za +161.123.203.0 - 161.123.203.255 us +161.123.204.0 - 161.123.204.255 za +161.123.205.0 - 161.123.205.255 us +161.123.206.0 - 161.123.206.255 za +161.123.207.0 - 161.123.207.255 us +161.123.208.0 - 161.123.208.255 za +161.123.209.0 - 161.123.209.255 us +161.123.210.0 - 161.123.255.255 za 161.124.0.0 - 161.125.255.255 us 161.126.0.0 - 161.126.255.255 sg 161.127.0.0 - 161.130.255.255 us 161.131.0.0 - 161.131.255.255 cl 161.132.0.0 - 161.132.255.255 pe 161.133.0.0 - 161.137.255.255 us +161.138.0.0 - 161.138.255.255 bo 161.139.0.0 - 161.139.255.255 my +161.140.0.0 - 161.140.255.255 ve 161.141.0.0 - 161.141.255.255 ca 161.142.0.0 - 161.142.255.255 my 161.143.0.0 - 161.143.255.255 au @@ -71436,40 +56188,60 @@ 161.152.0.0 - 161.152.255.255 au 161.153.0.0 - 161.157.255.255 us 161.158.0.0 - 161.158.255.255 nl -161.159.0.0 - 161.183.255.255 us +161.159.0.0 - 161.162.64.255 us +161.162.65.0 - 161.162.65.255 eu +161.162.66.0 - 161.183.255.255 us 161.184.0.0 - 161.184.255.255 ca 161.185.0.0 - 161.186.255.255 us 161.187.0.0 - 161.187.255.255 ca 161.188.0.0 - 161.189.255.255 us 161.190.0.0 - 161.190.255.255 ar -161.191.0.0 - 161.195.255.255 us +161.191.0.0 - 161.195.136.255 us +161.195.137.0 - 161.195.137.255 ca +161.195.138.0 - 161.195.255.255 us 161.196.0.0 - 161.196.255.255 ve 161.197.0.0 - 161.199.255.255 us 161.200.0.0 - 161.200.255.255 th -161.201.0.0 - 161.201.255.255 us -161.202.0.0 - 161.202.255.255 ch -161.203.0.0 - 161.206.255.255 us +161.201.0.0 - 161.202.2.239 us +161.202.2.240 - 161.202.2.255 ph +161.202.3.0 - 161.202.3.79 us +161.202.3.80 - 161.202.3.95 cn +161.202.3.96 - 161.202.12.7 us +161.202.12.8 - 161.202.12.8 sg +161.202.12.9 - 161.202.63.255 us +161.202.64.0 - 161.202.127.255 jp +161.202.128.0 - 161.202.132.156 us +161.202.132.157 - 161.202.132.157 jp +161.202.132.158 - 161.202.144.201 us +161.202.144.202 - 161.202.144.202 jp +161.202.144.203 - 161.202.144.248 us +161.202.144.249 - 161.202.144.249 jp +161.202.144.250 - 161.206.255.255 us 161.207.0.0 - 161.207.255.255 cn -161.208.0.0 - 161.215.255.255 us +161.208.0.0 - 161.211.255.255 us +161.212.0.0 - 161.212.255.255 ve +161.213.0.0 - 161.215.255.255 us 161.216.0.0 - 161.216.255.255 ca 161.217.0.0 - 161.228.255.255 us 161.229.0.0 - 161.229.255.255 sg -161.230.0.0 - 161.237.255.255 us +161.230.0.0 - 161.233.255.255 us +161.234.0.0 - 161.234.255.255 ve +161.235.0.0 - 161.237.255.255 us 161.238.0.0 - 161.238.255.255 cl 161.239.0.0 - 161.245.255.255 us 161.246.0.0 - 161.246.255.255 th -161.247.0.0 - 161.247.255.255 us -161.248.0.0 - 161.248.255.255 jp -161.249.0.0 - 161.251.255.255 us +161.247.0.0 - 161.251.255.255 us 161.252.0.0 - 161.252.255.255 kw 161.253.0.0 - 161.254.255.255 us -162.0.0.0 - 162.3.255.255 us -162.4.0.0 - 162.4.255.255 jp -162.5.0.0 - 162.10.255.255 us +161.255.0.0 - 161.255.255.255 ve +162.0.0.0 - 162.0.255.255 ca +162.1.0.0 - 162.10.255.255 us 162.11.0.0 - 162.11.255.255 gb 162.12.0.0 - 162.12.255.255 us 162.13.0.0 - 162.13.255.255 gb -162.14.0.0 - 162.20.255.255 us +162.14.0.0 - 162.18.142.255 us +162.18.143.0 - 162.18.143.255 eu +162.18.144.0 - 162.20.255.255 us 162.21.0.0 - 162.21.255.255 ch 162.22.0.0 - 162.22.255.255 us 162.23.0.0 - 162.23.255.255 ch @@ -71478,24 +56250,454 @@ 162.26.0.0 - 162.26.255.255 ch 162.27.0.0 - 162.37.255.255 us 162.38.0.0 - 162.38.255.255 fr -162.39.0.0 - 162.52.255.255 us +162.39.0.0 - 162.44.223.255 us +162.44.224.0 - 162.44.224.255 gb +162.44.225.0 - 162.52.255.255 us 162.53.0.0 - 162.53.255.255 ca -162.54.0.0 - 162.71.255.255 us +162.54.0.0 - 162.55.255.255 us +162.56.0.0 - 162.56.255.255 in +162.57.0.0 - 162.69.255.255 us +162.70.0.0 - 162.70.255.255 ca +162.71.0.0 - 162.72.255.255 us 162.73.0.0 - 162.73.255.255 ca 162.74.0.0 - 162.84.255.255 us 162.85.0.0 - 162.85.255.255 ca 162.86.0.0 - 162.86.255.255 ch -162.87.0.0 - 162.103.255.255 us +162.87.0.0 - 162.90.98.255 us +162.90.99.0 - 162.90.99.255 gb +162.90.100.0 - 162.97.8.255 us +162.97.9.0 - 162.97.9.255 mx +162.97.10.0 - 162.97.148.117 us +162.97.148.118 - 162.97.148.118 gb +162.97.148.119 - 162.97.148.141 us +162.97.148.142 - 162.97.148.142 gb +162.97.148.143 - 162.104.255.255 us 162.105.0.0 - 162.105.255.255 cn 162.106.0.0 - 162.106.255.255 ca 162.107.0.0 - 162.111.255.255 us 162.112.0.0 - 162.112.255.255 nz -162.113.0.0 - 162.121.255.255 us +162.113.0.0 - 162.116.125.255 us +162.116.126.0 - 162.116.126.255 eu +162.116.127.0 - 162.121.255.255 us 162.122.0.0 - 162.122.255.255 ve 162.123.0.0 - 162.138.255.255 us 162.139.0.0 - 162.139.255.255 ca -162.140.0.0 - 162.143.255.255 us -162.144.0.0 - 162.147.255.255 au +162.140.0.0 - 162.144.255.255 us +162.145.0.0 - 162.147.255.255 au +162.148.0.0 - 162.155.255.255 us +162.156.0.0 - 162.157.255.255 ca +162.158.0.0 - 162.158.3.255 au +162.158.4.0 - 162.158.7.255 jp +162.158.8.0 - 162.158.11.255 qa +162.158.12.0 - 162.158.15.255 kw +162.158.16.0 - 162.158.19.255 ro +162.158.20.0 - 162.158.23.255 fr +162.158.24.0 - 162.158.27.255 my +162.158.28.0 - 162.158.31.255 om +162.158.32.0 - 162.158.35.255 gb +162.158.36.0 - 162.158.39.255 ie +162.158.40.0 - 162.158.43.255 ke +162.158.44.0 - 162.158.55.255 in +162.158.56.0 - 162.158.79.255 us +162.158.80.0 - 162.158.95.255 de +162.158.96.0 - 162.158.99.255 ae +162.158.100.0 - 162.158.103.255 pl +162.158.104.0 - 162.158.107.255 us +162.158.108.0 - 162.158.109.255 nl +162.158.110.0 - 162.158.111.255 us +162.158.112.0 - 162.158.115.255 de +162.158.116.0 - 162.158.119.255 jp +162.158.120.0 - 162.158.123.255 us +162.158.124.0 - 162.158.127.255 ca +162.158.128.0 - 162.158.131.255 eg +162.158.132.0 - 162.158.135.255 dk +162.158.136.0 - 162.158.139.255 ph +162.158.140.0 - 162.158.143.255 us +162.158.144.0 - 162.158.147.255 ca +162.158.148.0 - 162.158.151.255 ch +162.158.152.0 - 162.158.155.255 gb +162.158.156.0 - 162.158.159.255 at +162.158.160.0 - 162.158.160.255 us +162.158.161.0 - 162.158.162.255 sg +162.158.163.0 - 162.158.175.255 us +162.158.176.0 - 162.158.179.255 hk +162.158.180.0 - 162.158.183.255 se +162.158.184.0 - 162.158.187.255 us +162.158.188.0 - 162.158.191.255 kr +162.158.192.0 - 162.158.192.255 fr +162.158.193.0 - 162.158.195.255 us +162.158.196.0 - 162.158.199.255 it +162.158.200.0 - 162.158.203.255 de +162.158.204.0 - 162.158.207.255 us +162.158.208.0 - 162.158.211.255 bg +162.158.212.0 - 162.158.219.255 us +162.158.220.0 - 162.158.223.255 no +162.158.224.0 - 162.158.231.255 us +162.158.232.0 - 162.158.235.255 be +162.158.236.0 - 162.208.11.255 us +162.208.12.0 - 162.208.15.255 ca +162.208.16.0 - 162.208.35.255 us +162.208.36.0 - 162.208.39.255 ca +162.208.40.0 - 162.208.59.255 us +162.208.60.0 - 162.208.63.255 ca +162.208.64.0 - 162.208.79.255 us +162.208.80.0 - 162.208.83.255 ca +162.208.84.0 - 162.208.87.255 us +162.208.88.0 - 162.208.91.255 ca +162.208.92.0 - 162.208.99.255 us +162.208.100.0 - 162.208.103.255 ca +162.208.104.0 - 162.208.127.255 us +162.208.128.0 - 162.208.255.255 ca +162.209.0.0 - 162.209.239.255 us +162.209.240.0 - 162.209.255.255 hk +162.210.0.0 - 162.210.7.255 us +162.210.8.0 - 162.210.11.255 ca +162.210.12.0 - 162.210.31.255 us +162.210.32.0 - 162.210.35.255 ca +162.210.36.0 - 162.210.39.255 us +162.210.40.0 - 162.210.43.255 pr +162.210.44.0 - 162.210.55.255 us +162.210.56.0 - 162.210.59.255 ca +162.210.60.0 - 162.210.67.255 us +162.210.68.0 - 162.210.71.255 vg +162.210.72.0 - 162.210.155.255 us +162.210.156.0 - 162.210.159.255 ag +162.210.160.0 - 162.210.167.255 ca +162.210.168.0 - 162.210.179.255 us +162.210.180.0 - 162.210.183.255 ca +162.210.184.0 - 162.210.223.255 us +162.210.224.0 - 162.210.227.255 ca +162.210.228.0 - 162.211.95.255 us +162.211.96.0 - 162.211.103.255 ca +162.211.104.0 - 162.211.111.255 us +162.211.112.0 - 162.211.119.255 ca +162.211.120.0 - 162.211.135.255 us +162.211.136.0 - 162.211.139.255 ky +162.211.140.0 - 162.211.177.255 us +162.211.178.0 - 162.211.179.255 gb +162.211.180.0 - 162.211.183.255 us +162.211.184.0 - 162.211.187.255 ca +162.211.188.0 - 162.211.191.255 us +162.211.192.0 - 162.211.199.255 ca +162.211.200.0 - 162.211.207.255 us +162.211.208.0 - 162.211.215.255 ca +162.211.216.0 - 162.211.227.255 us +162.211.228.0 - 162.211.231.255 de +162.211.232.0 - 162.211.235.255 ca +162.211.240.0 - 162.211.247.255 us +162.211.248.0 - 162.211.251.255 ca +162.211.252.0 - 162.212.7.255 us +162.212.8.0 - 162.212.11.255 ca +162.212.12.0 - 162.212.12.255 bb +162.212.13.0 - 162.212.13.255 lc +162.212.14.0 - 162.212.14.255 bb +162.212.15.0 - 162.212.15.255 vg +162.212.16.0 - 162.212.19.255 us +162.212.20.0 - 162.212.23.255 ca +162.212.24.0 - 162.212.63.255 us +162.212.64.0 - 162.212.71.255 ca +162.212.72.0 - 162.212.99.255 us +162.212.100.0 - 162.212.103.255 ca +162.212.104.0 - 162.212.111.255 us +162.212.112.0 - 162.212.115.255 ca +162.212.116.0 - 162.212.133.255 us +162.212.134.0 - 162.212.134.255 is +162.212.135.0 - 162.212.159.255 us +162.212.160.0 - 162.212.167.255 pr +162.212.168.0 - 162.212.199.255 us +162.212.200.0 - 162.212.207.255 ca +162.212.208.0 - 162.212.211.255 vc +162.212.212.0 - 162.212.231.255 us +162.212.232.0 - 162.212.239.255 ca +162.212.240.0 - 162.213.7.255 us +162.213.8.0 - 162.213.11.255 ca +162.213.12.0 - 162.213.103.255 us +162.213.104.0 - 162.213.111.255 ca +162.213.112.0 - 162.213.135.255 us +162.213.136.0 - 162.213.139.255 ca +162.213.140.0 - 162.213.155.255 us +162.213.156.0 - 162.213.159.255 ca +162.213.160.0 - 162.213.167.255 us +162.213.168.0 - 162.213.171.255 dm +162.213.172.0 - 162.213.208.255 us +162.213.209.0 - 162.213.209.63 be +162.213.209.64 - 162.216.83.255 us +162.216.84.0 - 162.216.87.255 ca +162.216.88.0 - 162.216.159.255 us +162.216.160.0 - 162.216.167.255 jm +162.216.168.0 - 162.216.175.255 us +162.216.180.0 - 162.216.183.255 us +162.216.184.0 - 162.216.191.255 ca +162.216.192.0 - 162.217.23.255 us +162.217.24.0 - 162.217.31.255 ca +162.217.32.0 - 162.217.231.255 us +162.217.232.0 - 162.217.243.255 ca +162.217.244.0 - 162.218.23.255 us +162.218.24.0 - 162.218.27.255 vg +162.218.28.0 - 162.218.31.255 us +162.218.32.0 - 162.218.39.255 ca +162.218.40.0 - 162.218.95.127 us +162.218.95.128 - 162.218.95.240 ca +162.218.95.241 - 162.218.95.241 us +162.218.95.242 - 162.218.95.255 ca +162.218.96.0 - 162.218.123.255 us +162.218.124.0 - 162.218.127.255 ca +162.218.128.0 - 162.218.255.255 us +162.219.0.0 - 162.219.15.255 ca +162.219.16.0 - 162.219.47.255 us +162.219.48.0 - 162.219.55.255 ca +162.219.56.0 - 162.219.67.255 us +162.219.68.0 - 162.219.71.255 ca +162.219.72.0 - 162.219.159.255 us +162.219.160.0 - 162.219.163.255 ca +162.219.164.0 - 162.219.175.255 us +162.219.176.0 - 162.219.179.255 ca +162.219.180.0 - 162.219.183.255 us +162.219.184.0 - 162.219.191.255 ca +162.219.192.0 - 162.219.231.255 us +162.219.232.0 - 162.219.232.255 au +162.219.233.0 - 162.219.233.255 bm +162.219.234.0 - 162.219.234.255 ca +162.219.235.0 - 162.219.235.255 gb +162.219.236.0 - 162.219.239.255 ca +162.219.240.0 - 162.220.35.255 us +162.220.36.0 - 162.220.39.255 ca +162.220.40.0 - 162.220.95.255 us +162.220.96.0 - 162.220.103.255 pr +162.220.104.0 - 162.220.135.255 us +162.220.136.0 - 162.220.138.255 bb +162.220.139.0 - 162.220.139.255 dm +162.220.140.0 - 162.220.143.255 bb +162.220.144.0 - 162.220.175.255 us +162.220.180.0 - 162.220.187.255 us +162.220.188.0 - 162.220.191.255 ca +162.220.192.0 - 162.220.203.255 us +162.220.204.0 - 162.220.207.255 ca +162.220.208.0 - 162.220.245.255 us +162.220.246.0 - 162.220.246.255 it +162.220.247.0 - 162.220.247.255 us +162.220.248.0 - 162.220.251.255 ca +162.220.252.0 - 162.221.11.255 us +162.221.12.0 - 162.221.15.255 ca +162.221.16.0 - 162.221.119.255 us +162.221.120.0 - 162.221.127.255 ca +162.221.128.0 - 162.221.199.255 us +162.221.200.0 - 162.221.207.255 ca +162.221.208.0 - 162.221.211.255 us +162.221.212.0 - 162.221.215.255 bm +162.221.216.0 - 162.221.247.255 us +162.221.248.0 - 162.221.255.255 ca +162.222.0.0 - 162.222.55.255 us +162.222.56.0 - 162.222.63.255 ca +162.222.64.0 - 162.222.79.255 us +162.222.80.0 - 162.222.83.255 ca +162.222.84.0 - 162.222.87.255 ag +162.222.88.0 - 162.222.107.255 us +162.222.108.0 - 162.222.111.255 pr +162.222.112.0 - 162.222.119.255 us +162.222.120.0 - 162.222.127.255 ca +162.222.128.0 - 162.222.135.255 us +162.222.136.0 - 162.222.139.255 ca +162.222.140.0 - 162.222.143.255 us +162.222.144.0 - 162.222.147.255 ca +162.222.148.0 - 162.222.155.255 us +162.222.156.0 - 162.222.163.255 ca +162.222.164.0 - 162.222.165.255 tw +162.222.166.0 - 162.222.223.255 us +162.222.224.0 - 162.222.224.255 vg +162.222.225.0 - 162.222.255.255 us +162.223.0.0 - 162.223.7.255 ca +162.223.8.0 - 162.223.43.255 us +162.223.44.0 - 162.223.51.255 ca +162.223.52.0 - 162.223.99.255 us +162.223.100.0 - 162.223.103.255 ca +162.223.104.0 - 162.223.223.255 us +162.223.224.0 - 162.223.231.255 ca +162.223.232.0 - 162.243.189.255 us +162.243.190.0 - 162.243.190.255 ca +162.243.191.0 - 162.244.15.255 us +162.244.16.0 - 162.244.19.255 pr +162.244.20.0 - 162.244.31.255 ca +162.244.32.0 - 162.244.43.255 us +162.244.44.0 - 162.244.47.255 ca +162.244.48.0 - 162.244.87.255 us +162.244.88.0 - 162.244.91.255 ca +162.244.92.0 - 162.244.119.255 us +162.244.120.0 - 162.244.123.255 ca +162.244.124.0 - 162.244.167.255 us +162.244.168.0 - 162.244.171.255 pr +162.244.172.0 - 162.244.207.255 us +162.244.208.0 - 162.244.211.255 ca +162.244.212.0 - 162.244.227.255 us +162.244.228.0 - 162.244.231.255 ca +162.244.232.0 - 162.244.247.255 us +162.244.248.0 - 162.244.251.255 ca +162.244.252.0 - 162.245.55.255 us +162.245.56.0 - 162.245.59.255 ca +162.245.60.0 - 162.245.75.255 us +162.245.76.0 - 162.245.79.255 vc +162.245.80.0 - 162.245.143.255 us +162.245.144.0 - 162.245.147.255 ca +162.245.148.0 - 162.245.151.255 us +162.245.152.0 - 162.245.155.255 gd +162.245.156.0 - 162.245.207.255 us +162.245.208.0 - 162.245.215.255 ca +162.245.216.0 - 162.245.239.255 us +162.245.240.0 - 162.245.255.255 ca +162.246.0.0 - 162.246.3.255 jm +162.246.4.0 - 162.246.7.255 us +162.246.8.0 - 162.246.15.255 ca +162.246.16.0 - 162.246.51.255 us +162.246.52.0 - 162.246.55.255 ca +162.246.56.0 - 162.246.103.255 us +162.246.104.0 - 162.246.111.255 bb +162.246.112.0 - 162.246.127.255 us +162.246.128.0 - 162.246.131.255 ca +162.246.132.0 - 162.246.155.255 us +162.246.156.0 - 162.246.159.255 ca +162.246.160.0 - 162.246.171.255 us +162.246.172.0 - 162.246.175.255 pr +162.246.176.0 - 162.246.183.255 us +162.246.184.0 - 162.246.184.255 gb +162.246.185.0 - 162.247.11.255 us +162.247.12.0 - 162.247.23.255 ca +162.247.24.0 - 162.247.31.255 vi +162.247.32.0 - 162.247.35.255 us +162.247.36.0 - 162.247.39.255 ca +162.247.40.0 - 162.247.40.255 a2 +162.247.41.0 - 162.247.41.255 us +162.247.42.0 - 162.247.43.255 a2 +162.247.44.0 - 162.247.46.255 us +162.247.47.0 - 162.247.47.255 a2 +162.247.48.0 - 162.247.91.255 us +162.247.92.0 - 162.247.95.255 ca +162.247.96.0 - 162.247.103.255 vg +162.247.104.0 - 162.247.111.255 us +162.247.112.0 - 162.247.127.255 ca +162.247.128.0 - 162.247.167.255 us +162.247.168.0 - 162.247.171.255 ca +162.247.172.0 - 162.247.219.255 us +162.247.220.0 - 162.247.223.255 ky +162.247.224.0 - 162.247.231.255 ca +162.247.232.0 - 162.248.7.255 us +162.248.8.0 - 162.248.11.255 ca +162.248.12.0 - 162.248.31.255 us +162.248.32.0 - 162.248.39.255 ca +162.248.40.0 - 162.248.43.255 us +162.248.44.0 - 162.248.47.255 pr +162.248.48.0 - 162.248.119.255 us +162.248.120.0 - 162.248.127.255 ca +162.248.128.0 - 162.248.139.255 us +162.248.140.0 - 162.248.143.255 ca +162.248.144.0 - 162.248.151.255 us +162.248.152.0 - 162.248.171.255 ca +162.248.172.0 - 162.248.175.255 us +162.248.176.0 - 162.248.183.255 ca +162.248.184.0 - 162.248.219.255 us +162.248.220.0 - 162.248.221.255 ca +162.248.222.0 - 162.249.7.255 us +162.249.8.0 - 162.249.11.255 ca +162.249.12.0 - 162.249.39.255 us +162.249.40.0 - 162.249.43.255 ca +162.249.44.0 - 162.249.87.255 us +162.249.88.0 - 162.249.95.255 ca +162.249.96.0 - 162.249.127.255 us +162.249.128.0 - 162.249.135.255 ky +162.249.136.0 - 162.249.159.255 us +162.249.160.0 - 162.249.163.255 ca +162.249.164.0 - 162.249.235.255 us +162.249.236.0 - 162.249.239.255 ca +162.249.240.0 - 162.250.11.255 us +162.250.12.0 - 162.250.15.255 ca +162.250.16.0 - 162.250.43.255 us +162.250.44.0 - 162.250.47.255 ca +162.250.48.0 - 162.250.145.255 us +162.250.146.0 - 162.250.146.63 it +162.250.146.64 - 162.250.146.255 us +162.250.147.0 - 162.250.147.255 it +162.250.148.0 - 162.250.167.255 us +162.250.168.0 - 162.250.175.255 ca +162.250.176.0 - 162.250.187.255 us +162.250.188.0 - 162.250.199.255 ca +162.250.200.0 - 162.250.219.255 us +162.250.220.0 - 162.250.223.255 ca +162.250.224.0 - 162.251.15.255 us +162.251.16.0 - 162.251.19.255 ca +162.251.20.0 - 162.251.23.255 vg +162.251.24.0 - 162.251.59.255 us +162.251.60.0 - 162.251.63.255 ca +162.251.64.0 - 162.251.71.255 us +162.251.72.0 - 162.251.79.255 ca +162.251.80.0 - 162.251.87.255 vg +162.251.88.0 - 162.251.119.255 us +162.251.120.0 - 162.251.120.255 ca +162.251.121.0 - 162.251.121.31 us +162.251.121.32 - 162.251.123.255 ca +162.251.124.0 - 162.251.191.255 us +162.251.192.0 - 162.251.199.255 ca +162.251.200.0 - 162.252.43.255 us +162.252.44.0 - 162.252.47.255 ca +162.252.48.0 - 162.252.58.255 us +162.252.59.0 - 162.252.59.255 gb +162.252.60.0 - 162.252.91.255 us +162.252.92.0 - 162.252.95.255 ca +162.252.96.0 - 162.252.111.255 us +162.252.112.0 - 162.252.119.255 ca +162.252.120.0 - 162.252.131.255 us +162.252.132.0 - 162.252.135.255 ca +162.252.136.0 - 162.252.183.255 us +162.252.184.0 - 162.252.187.255 ca +162.252.188.0 - 162.252.191.255 ag +162.252.192.0 - 162.252.215.255 us +162.252.216.0 - 162.252.223.255 ca +162.252.224.0 - 162.252.239.255 us +162.252.240.0 - 162.252.243.255 ca +162.252.244.0 - 162.252.251.255 us +162.252.252.0 - 162.252.255.255 ca +162.253.0.0 - 162.253.7.255 us +162.253.8.0 - 162.253.11.255 ca +162.253.12.0 - 162.253.51.255 us +162.253.52.0 - 162.253.55.255 ca +162.253.56.0 - 162.253.99.255 us +162.253.100.0 - 162.253.103.255 dm +162.253.104.0 - 162.253.127.255 us +162.253.128.0 - 162.253.131.255 ca +162.253.132.0 - 162.253.135.255 us +162.253.136.0 - 162.253.143.255 ca +162.253.144.0 - 162.253.167.255 us +162.253.168.0 - 162.253.171.255 vi +162.253.172.0 - 162.253.207.255 us +162.253.208.0 - 162.253.215.255 ca +162.253.216.0 - 162.253.247.255 us +162.253.248.0 - 162.253.255.255 ca +162.254.0.0 - 162.254.39.255 us +162.254.40.0 - 162.254.43.255 ca +162.254.44.0 - 162.254.85.255 us +162.254.86.0 - 162.254.86.15 lu +162.254.86.16 - 162.254.131.255 us +162.254.132.0 - 162.254.135.255 ca +162.254.136.0 - 162.254.171.255 us +162.254.172.0 - 162.254.175.255 ca +162.254.176.0 - 162.254.195.255 us +162.254.196.0 - 162.254.196.255 gb +162.254.197.0 - 162.254.197.255 de +162.254.198.0 - 162.254.198.255 se +162.254.199.0 - 162.255.51.255 us +162.255.52.0 - 162.255.55.255 ca +162.255.56.0 - 162.255.111.255 us +162.255.112.0 - 162.255.115.255 ca +162.255.116.0 - 162.255.143.255 us +162.255.144.0 - 162.255.147.255 vg +162.255.148.0 - 162.255.151.255 ca +162.255.152.0 - 162.255.175.255 us +162.255.176.0 - 162.255.179.255 ca +162.255.180.0 - 162.255.203.255 us +162.255.204.0 - 162.255.215.255 ca +162.255.216.0 - 162.255.223.255 bm +162.255.224.0 - 162.255.227.255 us +162.255.228.0 - 162.255.231.255 ca +162.255.232.0 - 162.255.247.255 us +162.255.248.0 - 162.255.255.255 ca 163.0.0.0 - 163.0.255.255 cn 163.1.0.0 - 163.1.255.255 gb 163.2.0.0 - 163.2.255.255 us @@ -71512,7 +56714,95 @@ 163.33.0.0 - 163.33.255.255 us 163.34.0.0 - 163.34.255.255 no 163.35.0.0 - 163.41.255.255 us -163.42.0.0 - 163.61.255.255 jp +163.42.0.0 - 163.44.95.255 jp +163.44.96.0 - 163.44.127.255 us +163.44.128.0 - 163.44.159.255 sg +163.44.160.0 - 163.47.3.255 jp +163.47.4.0 - 163.47.7.255 cn +163.47.8.0 - 163.47.11.255 sg +163.47.12.0 - 163.47.15.255 in +163.47.16.0 - 163.47.18.255 au +163.47.19.0 - 163.47.19.255 jp +163.47.20.0 - 163.47.20.255 au +163.47.21.0 - 163.47.21.255 nz +163.47.23.0 - 163.47.31.255 jp +163.47.32.0 - 163.47.39.255 bd +163.47.40.0 - 163.47.43.255 au +163.47.44.0 - 163.47.45.255 hk +163.47.47.0 - 163.47.59.255 au +163.47.60.0 - 163.47.63.255 us +163.47.64.0 - 163.47.75.255 au +163.47.76.0 - 163.47.87.255 bd +163.47.88.0 - 163.47.91.255 my +163.47.92.0 - 163.47.103.255 au +163.47.104.0 - 163.47.107.255 nz +163.47.108.0 - 163.47.111.255 au +163.47.112.0 - 163.47.115.255 nz +163.47.116.0 - 163.47.127.255 au +163.47.128.0 - 163.47.131.255 nz +163.47.132.0 - 163.47.139.255 au +163.47.140.0 - 163.47.143.255 in +163.47.144.0 - 163.47.147.255 bd +163.47.148.0 - 163.47.151.255 np +163.47.152.0 - 163.47.155.255 in +163.47.156.0 - 163.47.159.255 bd +163.47.160.0 - 163.47.163.255 af +163.47.164.0 - 163.47.167.255 nz +163.47.168.0 - 163.47.171.255 au +163.47.172.0 - 163.47.175.255 kh +163.47.176.0 - 163.47.176.255 sg +163.47.177.0 - 163.47.177.255 hk +163.47.178.0 - 163.47.178.255 gb +163.47.179.0 - 163.47.179.255 us +163.47.180.0 - 163.47.183.255 au +163.47.184.0 - 163.47.191.255 nz +163.47.192.0 - 163.47.195.255 my +163.47.196.0 - 163.47.199.255 au +163.47.200.0 - 163.47.201.255 my +163.47.202.0 - 163.47.202.255 au +163.47.203.0 - 163.47.203.255 my +163.47.204.0 - 163.47.207.255 nz +163.47.208.0 - 163.47.215.255 in +163.47.216.0 - 163.47.219.255 au +163.47.220.0 - 163.47.223.255 nz +163.47.224.0 - 163.47.227.255 nc +163.47.228.0 - 163.47.247.255 nz +163.47.248.0 - 163.47.251.255 nc +163.47.252.0 - 163.47.255.255 au +163.48.0.0 - 163.51.255.255 jp +163.53.0.0 - 163.53.15.255 cn +163.53.16.0 - 163.53.19.255 hk +163.53.20.0 - 163.53.23.255 au +163.53.24.0 - 163.53.27.255 np +163.53.28.0 - 163.53.31.255 kh +163.53.32.0 - 163.53.35.255 au +163.53.36.0 - 163.53.67.255 cn +163.53.68.0 - 163.53.71.255 au +163.53.72.0 - 163.53.87.255 in +163.53.88.0 - 163.53.139.255 cn +163.53.140.0 - 163.53.143.255 bd +163.53.144.0 - 163.53.147.255 au +163.53.148.0 - 163.53.151.255 bd +163.53.152.0 - 163.53.155.255 my +163.53.156.0 - 163.53.159.255 kr +163.53.160.0 - 163.53.175.255 cn +163.53.176.0 - 163.53.179.255 in +163.53.180.0 - 163.53.183.255 bd +163.53.184.0 - 163.53.187.255 id +163.53.188.0 - 163.53.191.255 cn +163.53.192.0 - 163.53.195.255 id +163.53.196.0 - 163.53.199.255 kh +163.53.200.0 - 163.53.215.255 in +163.53.216.0 - 163.53.219.255 hk +163.53.220.0 - 163.53.223.255 cn +163.53.224.0 - 163.53.227.255 hk +163.53.228.0 - 163.53.235.255 au +163.53.236.0 - 163.53.239.255 pk +163.53.240.0 - 163.53.243.255 cn +163.53.244.0 - 163.53.247.255 mo +163.53.248.0 - 163.53.251.255 au +163.53.252.0 - 163.53.255.255 in +163.54.0.0 - 163.60.255.255 jp 163.62.0.0 - 163.116.255.255 fr 163.117.0.0 - 163.117.255.255 es 163.118.0.0 - 163.118.255.255 us @@ -71524,7 +56814,6 @@ 163.124.0.0 - 163.124.255.255 us 163.125.0.0 - 163.125.255.255 cn 163.126.0.0 - 163.126.255.255 us -163.127.0.0 - 163.128.255.255 au 163.129.0.0 - 163.129.255.255 us 163.130.0.0 - 163.141.255.255 jp 163.142.0.0 - 163.142.255.255 cn @@ -71534,8 +56823,10 @@ 163.153.0.0 - 163.154.255.255 us 163.155.0.0 - 163.155.255.255 ca 163.156.0.0 - 163.156.255.255 gb -163.157.0.0 - 163.157.255.255 se -163.158.0.0 - 163.158.255.255 de +163.157.0.0 - 163.157.253.255 se +163.157.254.0 - 163.157.254.255 eu +163.157.255.0 - 163.157.255.255 se +163.158.0.0 - 163.158.255.255 nl 163.159.0.0 - 163.159.255.255 si 163.160.0.0 - 163.160.255.255 gb 163.161.0.0 - 163.161.255.255 ch @@ -71546,7 +56837,9 @@ 163.165.192.0 - 163.165.255.255 de 163.166.0.0 - 163.167.255.255 gb 163.168.0.0 - 163.168.255.255 ch -163.169.0.0 - 163.172.255.255 gb +163.169.0.0 - 163.172.17.113 gb +163.172.17.114 - 163.172.17.114 fr +163.172.17.115 - 163.172.255.255 gb 163.173.0.0 - 163.173.255.255 fr 163.174.0.0 - 163.174.255.255 no 163.175.0.0 - 163.175.255.255 nl @@ -71572,16 +56865,26 @@ 163.232.0.0 - 163.233.255.255 au 163.234.0.0 - 163.238.255.255 us 163.239.0.0 - 163.239.255.255 kr -163.240.0.0 - 163.246.255.255 us +163.240.0.0 - 163.244.61.255 us +163.244.62.0 - 163.244.63.255 eu +163.244.64.0 - 163.244.245.255 us +163.244.246.0 - 163.244.246.255 cn +163.244.247.0 - 163.246.255.255 us 163.247.0.0 - 163.247.255.255 cl 163.248.0.0 - 163.249.255.255 us 163.250.0.0 - 163.250.255.255 cl -163.251.0.0 - 163.254.255.255 us +163.251.0.0 - 163.251.159.255 us +163.251.160.0 - 163.251.160.255 gu +163.251.161.0 - 163.254.255.255 us 163.255.0.0 - 163.255.255.255 kr 164.0.0.0 - 164.0.255.255 kz 164.1.0.0 - 164.2.255.255 fr -164.3.0.0 - 164.3.255.255 at -164.4.0.0 - 164.4.255.255 se +164.3.0.0 - 164.3.219.255 at +164.3.220.0 - 164.3.220.255 us +164.3.221.0 - 164.3.255.255 at +164.4.0.0 - 164.4.17.31 se +164.4.17.32 - 164.4.17.33 eu +164.4.17.34 - 164.4.255.255 se 164.5.0.0 - 164.5.255.255 fi 164.6.0.0 - 164.6.255.255 gb 164.7.0.0 - 164.7.255.255 fr @@ -71598,10 +56901,11 @@ 164.38.0.0 - 164.39.255.255 gb 164.40.0.0 - 164.40.127.255 kz 164.40.128.0 - 164.40.159.255 nl -164.40.160.0 - 164.40.167.255 de +164.40.160.0 - 164.40.165.255 de +164.40.166.0 - 164.40.166.255 us +164.40.167.0 - 164.40.167.255 de 164.40.168.0 - 164.40.175.255 sk 164.40.176.0 - 164.40.183.255 se -164.40.184.0 - 164.40.191.255 pl 164.40.192.0 - 164.40.207.255 de 164.40.208.0 - 164.40.223.255 gb 164.40.224.0 - 164.40.231.255 ba @@ -71618,12 +56922,10 @@ 164.49.0.0 - 164.52.255.255 us 164.53.0.0 - 164.53.255.255 au 164.54.0.0 - 164.58.255.255 us -164.59.0.0 - 164.59.255.255 de -164.60.0.0 - 164.60.255.255 fr -164.61.0.0 - 164.61.255.255 de -164.62.0.0 - 164.62.255.255 us -164.63.0.0 - 164.63.255.255 gb -164.64.0.0 - 164.68.255.255 us +164.59.0.0 - 164.61.209.255 de +164.61.210.0 - 164.61.210.255 eu +164.61.211.0 - 164.61.255.255 de +164.62.0.0 - 164.68.255.255 us 164.69.0.0 - 164.71.255.255 jp 164.72.0.0 - 164.72.255.255 us 164.73.0.0 - 164.73.255.255 uy @@ -71631,8 +56933,8 @@ 164.75.0.0 - 164.75.255.255 au 164.76.0.0 - 164.76.255.255 us 164.77.0.0 - 164.77.182.255 cl -164.77.183.0 - 164.77.186.255 pe -164.77.187.0 - 164.77.255.255 cl +164.77.183.0 - 164.77.185.255 pe +164.77.186.0 - 164.77.255.255 cl 164.78.0.0 - 164.78.255.255 sg 164.79.0.0 - 164.79.255.255 us 164.80.0.0 - 164.80.255.255 au @@ -71641,7 +56943,9 @@ 164.85.0.0 - 164.85.255.255 br 164.86.0.0 - 164.87.255.255 us 164.88.0.0 - 164.88.255.255 za -164.89.0.0 - 164.95.255.255 us +164.89.0.0 - 164.90.127.255 us +164.90.128.0 - 164.90.128.255 gb +164.90.129.0 - 164.95.255.255 us 164.96.0.0 - 164.96.255.255 cl 164.97.0.0 - 164.97.255.255 au 164.98.0.0 - 164.98.255.255 cl @@ -71658,23 +56962,54 @@ 164.116.0.0 - 164.123.255.255 us 164.124.0.0 - 164.125.255.255 kr 164.126.0.0 - 164.127.255.255 pl -164.128.0.0 - 164.128.122.175 ch -164.128.122.176 - 164.128.122.179 li -164.128.122.180 - 164.128.122.187 ch -164.128.122.188 - 164.128.122.191 li -164.128.122.192 - 164.128.125.79 ch -164.128.125.80 - 164.128.125.83 gb -164.128.125.84 - 164.128.166.31 ch -164.128.166.32 - 164.128.166.35 li -164.128.166.36 - 164.128.255.255 ch -164.129.0.0 - 164.129.255.255 fr +164.128.0.0 - 164.128.255.255 ch +164.129.0.0 - 164.129.0.255 fr +164.129.1.0 - 164.129.1.255 eu +164.129.2.0 - 164.129.255.255 fr 164.130.0.0 - 164.130.255.255 it -164.131.0.0 - 164.131.255.255 fr -164.132.0.0 - 164.132.255.255 it +164.131.0.0 - 164.132.22.159 fr +164.132.22.160 - 164.132.22.175 gb +164.132.22.176 - 164.132.26.7 fr +164.132.26.8 - 164.132.26.11 pt +164.132.26.12 - 164.132.73.47 fr +164.132.73.48 - 164.132.73.63 pt +164.132.73.64 - 164.132.121.74 fr +164.132.121.75 - 164.132.121.75 es +164.132.121.76 - 164.132.140.246 fr +164.132.140.247 - 164.132.140.247 pl +164.132.140.248 - 164.132.143.87 fr +164.132.143.88 - 164.132.143.88 de +164.132.143.89 - 164.132.144.168 fr +164.132.144.169 - 164.132.144.169 cz +164.132.144.170 - 164.132.145.39 fr +164.132.145.40 - 164.132.145.43 gb +164.132.145.44 - 164.132.159.71 fr +164.132.159.72 - 164.132.159.75 gb +164.132.159.76 - 164.132.255.255 fr 164.133.0.0 - 164.133.255.255 de 164.134.0.0 - 164.134.255.255 gb 164.135.0.0 - 164.135.255.255 se 164.136.0.0 - 164.137.255.255 gb +164.138.0.0 - 164.138.15.255 ru +164.138.16.0 - 164.138.23.255 ir +164.138.24.0 - 164.138.31.255 nl +164.138.32.0 - 164.138.39.255 ru +164.138.40.0 - 164.138.47.255 kz +164.138.48.0 - 164.138.55.255 it +164.138.56.0 - 164.138.63.255 fr +164.138.64.0 - 164.138.79.255 ch +164.138.80.0 - 164.138.87.255 gb +164.138.88.0 - 164.138.95.255 ru +164.138.104.0 - 164.138.111.255 be +164.138.112.0 - 164.138.127.255 il +164.138.128.0 - 164.138.191.255 ir +164.138.192.0 - 164.138.199.255 de +164.138.200.0 - 164.138.215.255 es +164.138.216.0 - 164.138.223.255 bg +164.138.224.0 - 164.138.231.255 gb +164.138.232.0 - 164.138.239.255 iq +164.138.240.0 - 164.138.247.255 fr +164.138.248.0 - 164.138.255.255 nl 164.139.0.0 - 164.139.255.255 de 164.140.0.0 - 164.140.255.255 nl 164.141.0.0 - 164.141.255.255 fi @@ -71682,7 +57017,9 @@ 164.143.0.0 - 164.143.247.255 gb 164.143.248.0 - 164.143.251.255 us 164.143.252.0 - 164.143.255.255 gb -164.144.0.0 - 164.145.255.255 us +164.144.0.0 - 164.144.123.0 us +164.144.123.1 - 164.144.123.1 eu +164.144.123.2 - 164.145.255.255 us 164.146.0.0 - 164.151.255.255 za 164.152.0.0 - 164.154.255.255 us 164.155.0.0 - 164.155.255.255 za @@ -71707,8 +57044,9 @@ 164.215.56.0 - 164.215.63.255 ir 164.215.64.0 - 164.215.95.255 ru 164.215.96.0 - 164.215.103.255 az -164.215.104.0 - 164.215.105.255 fr -164.215.106.0 - 164.215.111.255 gb +164.215.104.0 - 164.215.109.255 gb +164.215.110.0 - 164.215.110.255 us +164.215.111.0 - 164.215.111.255 gb 164.215.112.0 - 164.215.127.255 cz 164.215.128.0 - 164.215.255.255 ir 164.216.0.0 - 164.255.255.255 us @@ -71718,29 +57056,56 @@ 165.8.0.0 - 165.11.255.255 za 165.12.0.0 - 165.12.255.255 au 165.13.0.0 - 165.13.255.255 us -165.14.0.0 - 165.15.255.255 jp -165.17.0.0 - 165.18.255.255 jp +165.14.0.0 - 165.14.255.255 jp 165.19.0.0 - 165.20.255.255 us 165.21.0.0 - 165.21.255.255 sg 165.22.0.0 - 165.22.255.255 us 165.23.0.0 - 165.23.255.255 ca 165.24.0.0 - 165.24.255.255 us 165.25.0.0 - 165.25.255.255 za -165.26.0.0 - 165.30.255.255 us +165.26.0.0 - 165.26.216.63 us +165.26.216.64 - 165.26.216.127 be +165.26.216.128 - 165.30.255.255 us 165.31.0.0 - 165.31.255.255 au -165.32.0.0 - 165.66.255.255 us -165.67.0.0 - 165.67.255.255 au -165.68.0.0 - 165.68.255.255 us +165.32.0.0 - 165.41.255.255 us +165.42.0.0 - 165.43.255.255 in +165.44.0.0 - 165.48.255.255 us +165.50.0.0 - 165.51.255.255 tn +165.52.0.0 - 165.55.255.255 za +165.56.0.0 - 165.63.255.255 zm +165.64.0.0 - 165.68.255.255 us 165.69.0.0 - 165.69.255.255 au -165.70.0.0 - 165.75.255.255 us +165.70.0.0 - 165.71.255.255 us +165.72.0.0 - 165.72.199.255 cz +165.72.200.0 - 165.72.200.255 eu +165.72.201.0 - 165.72.255.255 cz +165.74.0.0 - 165.75.255.255 us 165.76.0.0 - 165.76.255.255 jp -165.77.0.0 - 165.77.255.255 us -165.78.0.0 - 165.78.255.255 ca -165.79.0.0 - 165.83.255.255 us -165.84.0.0 - 165.84.255.255 nz +165.77.0.0 - 165.83.255.255 us +165.84.0.0 - 165.84.127.255 nz +165.84.128.0 - 165.84.191.255 hk +165.84.192.0 - 165.84.207.255 in +165.84.208.0 - 165.84.223.255 nz +165.84.224.0 - 165.84.224.255 gb +165.84.225.0 - 165.84.227.255 us +165.84.228.0 - 165.84.228.255 gb +165.84.229.0 - 165.84.230.255 us +165.84.231.0 - 165.84.231.255 gb +165.84.232.0 - 165.84.239.255 jp +165.84.240.0 - 165.84.255.255 in 165.85.0.0 - 165.85.255.255 us 165.86.0.0 - 165.86.255.255 au -165.87.0.0 - 165.92.255.255 us +165.87.0.0 - 165.89.255.255 us +165.90.0.0 - 165.90.31.255 ke +165.90.32.0 - 165.90.63.255 za +165.90.64.0 - 165.90.95.255 mz +165.90.96.0 - 165.90.127.255 cv +165.90.128.0 - 165.90.191.255 re +165.90.192.0 - 165.90.207.255 za +165.90.208.0 - 165.90.223.255 ml +165.90.224.0 - 165.90.239.255 za +165.90.240.0 - 165.90.255.255 ng +165.91.0.0 - 165.92.255.255 us 165.93.0.0 - 165.93.255.255 jp 165.94.0.0 - 165.95.255.255 us 165.96.0.0 - 165.96.255.255 jp @@ -71754,7 +57119,15 @@ 165.115.0.0 - 165.115.255.255 ca 165.116.0.0 - 165.117.255.255 us 165.118.0.0 - 165.118.255.255 au -165.119.0.0 - 165.131.255.255 us +165.119.0.0 - 165.119.255.255 us +165.120.0.0 - 165.120.255.255 gb +165.121.0.0 - 165.125.177.255 us +165.125.178.0 - 165.125.178.255 eu +165.125.179.0 - 165.125.180.255 us +165.125.181.0 - 165.125.181.255 au +165.125.182.0 - 165.129.11.14 us +165.129.11.15 - 165.129.11.15 eu +165.129.11.16 - 165.131.255.255 us 165.132.0.0 - 165.133.255.255 kr 165.134.0.0 - 165.140.255.255 us 165.141.0.0 - 165.141.255.255 kr @@ -71763,12 +57136,10 @@ 165.150.0.0 - 165.153.255.255 us 165.154.0.0 - 165.154.255.255 ca 165.155.0.0 - 165.164.255.255 us -165.165.0.0 - 165.165.11.255 za -165.165.12.0 - 165.165.15.255 sz -165.165.16.0 - 165.165.19.255 za -165.165.20.0 - 165.165.23.255 sz -165.165.24.0 - 165.165.255.255 za -165.166.0.0 - 165.177.255.255 us +165.165.0.0 - 165.165.255.255 za +165.166.0.0 - 165.168.255.255 us +165.169.0.0 - 165.169.255.255 re +165.170.0.0 - 165.177.255.255 us 165.178.0.0 - 165.178.255.255 ca 165.179.0.0 - 165.179.255.255 us 165.180.0.0 - 165.180.255.255 za @@ -71780,94 +57151,97 @@ 165.187.0.0 - 165.187.255.255 au 165.188.0.0 - 165.190.255.255 us 165.191.0.0 - 165.191.255.255 au -165.192.0.0 - 165.193.58.223 us -165.193.58.224 - 165.193.58.255 ca -165.193.59.0 - 165.193.81.63 us -165.193.81.64 - 165.193.81.79 ca -165.193.81.80 - 165.193.126.15 us -165.193.126.16 - 165.193.126.23 gb -165.193.126.24 - 165.193.143.255 us +165.192.0.0 - 165.193.143.255 us 165.193.144.0 - 165.193.144.255 gb -165.193.145.0 - 165.193.145.63 us -165.193.145.64 - 165.193.145.95 fr -165.193.145.96 - 165.193.145.111 it -165.193.145.112 - 165.193.145.119 gb -165.193.145.120 - 165.193.145.127 us -165.193.145.128 - 165.193.145.159 gb -165.193.145.160 - 165.193.147.103 us -165.193.147.104 - 165.193.147.159 gb -165.193.147.160 - 165.193.147.255 us +165.193.145.0 - 165.193.147.255 us 165.193.148.0 - 165.193.149.255 gb 165.193.150.0 - 165.193.150.255 us -165.193.151.0 - 165.193.152.127 gb -165.193.152.128 - 165.193.153.127 us -165.193.153.128 - 165.193.153.159 gb -165.193.153.160 - 165.193.153.191 us -165.193.153.192 - 165.193.153.199 gb -165.193.153.200 - 165.193.153.207 us -165.193.153.208 - 165.193.153.215 de -165.193.153.216 - 165.193.155.255 us +165.193.151.0 - 165.193.151.255 gb +165.193.152.0 - 165.193.155.255 us 165.193.156.0 - 165.193.156.255 gb 165.193.157.0 - 165.193.158.255 fr 165.193.159.0 - 165.193.159.255 us 165.193.160.0 - 165.193.161.255 gb -165.193.162.0 - 165.193.163.63 us -165.193.163.64 - 165.193.163.111 gb -165.193.163.112 - 165.193.163.127 us -165.193.163.128 - 165.193.163.143 gb -165.193.163.144 - 165.193.163.159 fr -165.193.163.160 - 165.193.163.191 us -165.193.163.192 - 165.193.163.223 gb -165.193.163.224 - 165.193.163.255 us -165.193.164.0 - 165.193.168.239 gb -165.193.168.240 - 165.193.169.255 us +165.193.162.0 - 165.193.163.255 us +165.193.164.0 - 165.193.167.255 gb +165.193.168.0 - 165.193.169.255 us 165.193.170.0 - 165.193.171.255 gb -165.193.172.0 - 165.193.172.31 us -165.193.172.32 - 165.193.172.71 gb -165.193.172.72 - 165.193.172.127 us -165.193.172.128 - 165.193.173.255 gb +165.193.172.0 - 165.193.172.255 us +165.193.173.0 - 165.193.173.255 gb 165.193.174.0 - 165.193.174.255 us 165.193.175.0 - 165.193.175.255 gb -165.193.176.0 - 165.193.176.23 pl -165.193.176.24 - 165.193.200.79 us -165.193.200.80 - 165.193.200.95 ca -165.193.200.96 - 165.193.202.255 us -165.193.203.0 - 165.193.203.31 gb -165.193.203.32 - 165.193.205.151 us -165.193.205.152 - 165.193.205.159 gb -165.193.205.160 - 165.193.212.215 us -165.193.212.216 - 165.193.212.223 bm -165.193.212.224 - 165.193.219.159 us -165.193.219.160 - 165.193.219.223 bm -165.193.219.224 - 165.193.220.255 us -165.193.221.0 - 165.193.221.31 bm -165.193.221.32 - 165.193.222.207 us -165.193.222.208 - 165.193.222.215 ca -165.193.222.216 - 165.193.229.191 us -165.193.229.192 - 165.193.229.255 my -165.193.230.0 - 165.193.233.79 us -165.193.233.80 - 165.193.233.87 my -165.193.233.88 - 165.193.249.135 us -165.193.249.136 - 165.193.249.143 gb -165.193.249.144 - 165.193.255.255 us +165.193.176.0 - 165.193.178.255 us +165.193.179.0 - 165.193.179.255 gb +165.193.180.0 - 165.193.255.255 us 165.194.0.0 - 165.194.255.255 kr -165.195.0.0 - 165.201.255.255 us +165.195.0.0 - 165.197.215.255 us +165.197.216.0 - 165.197.219.255 gb +165.197.220.0 - 165.197.223.255 de +165.197.224.0 - 165.201.255.255 us 165.202.0.0 - 165.202.255.255 hk -165.203.0.0 - 165.204.255.255 us +165.203.0.0 - 165.204.54.255 us +165.204.55.0 - 165.204.55.255 ca +165.204.56.0 - 165.204.71.255 us +165.204.72.0 - 165.204.72.255 de +165.204.73.0 - 165.204.77.255 us +165.204.78.0 - 165.204.78.255 eu +165.204.79.0 - 165.204.79.255 us +165.204.80.0 - 165.204.83.255 my +165.204.84.0 - 165.204.255.255 us 165.205.0.0 - 165.205.255.255 nz 165.206.0.0 - 165.208.255.255 us 165.209.0.0 - 165.209.255.255 th 165.212.0.0 - 165.212.255.255 us 165.213.0.0 - 165.213.255.255 kr -165.214.0.0 - 165.219.255.255 us +165.214.0.0 - 165.215.163.255 us +165.215.164.0 - 165.215.167.255 gb +165.215.168.0 - 165.219.255.255 us 165.220.0.0 - 165.220.255.255 ph 165.221.0.0 - 165.221.255.255 us 165.222.0.0 - 165.222.255.255 ch -165.223.0.0 - 165.227.255.255 us +165.223.0.0 - 165.225.35.255 us +165.225.36.0 - 165.225.36.70 ca +165.225.36.71 - 165.225.36.71 us +165.225.36.72 - 165.225.37.255 ca +165.225.38.0 - 165.225.63.255 us +165.225.64.0 - 165.225.64.255 dk +165.225.65.0 - 165.225.65.255 us +165.225.66.0 - 165.225.66.255 ru +165.225.67.0 - 165.225.67.255 us +165.225.68.0 - 165.225.68.255 se +165.225.69.0 - 165.225.69.255 us +165.225.70.0 - 165.225.71.255 ch +165.225.72.0 - 165.225.74.255 de +165.225.75.0 - 165.225.75.255 us +165.225.76.0 - 165.225.79.255 fr +165.225.80.0 - 165.225.83.255 gb +165.225.84.0 - 165.225.95.255 us +165.225.96.0 - 165.225.97.255 hk +165.225.98.0 - 165.225.98.255 au +165.225.99.0 - 165.225.99.255 us +165.225.100.0 - 165.225.101.255 jp +165.225.102.0 - 165.225.102.255 tw +165.225.103.0 - 165.225.103.255 us +165.225.104.0 - 165.225.105.255 in +165.225.106.0 - 165.227.255.255 us 165.228.0.0 - 165.228.255.255 au 165.229.0.0 - 165.229.255.255 kr 165.230.0.0 - 165.230.255.255 us -165.231.0.0 - 165.231.255.255 gn +165.231.0.0 - 165.231.15.255 sc +165.231.16.0 - 165.231.31.255 ca +165.231.32.0 - 165.231.47.255 gb +165.231.48.0 - 165.231.63.255 us +165.231.64.0 - 165.231.79.255 de +165.231.80.0 - 165.231.95.255 fr +165.231.96.0 - 165.231.111.255 nl +165.231.112.0 - 165.231.127.255 no +165.231.128.0 - 165.231.143.255 se +165.231.144.0 - 165.231.159.255 ru +165.231.160.0 - 165.231.175.255 ee +165.231.176.0 - 165.231.191.255 jp +165.231.192.0 - 165.231.223.255 us +165.231.224.0 - 165.231.239.255 it +165.231.240.0 - 165.231.255.255 in 165.232.0.0 - 165.232.255.255 us 165.233.0.0 - 165.233.255.255 za 165.234.0.0 - 165.239.255.255 us @@ -71876,53 +57250,29 @@ 165.243.0.0 - 165.244.255.255 kr 165.245.0.0 - 165.245.255.255 us 165.246.0.0 - 165.246.255.255 kr -165.247.0.0 - 166.7.255.255 us -166.8.0.0 - 166.15.255.255 ch +165.247.0.0 - 165.254.254.255 us +165.254.255.0 - 165.254.255.255 nl +165.255.0.0 - 165.255.255.255 za +166.0.0.0 - 166.11.255.255 us +166.12.0.0 - 166.15.255.255 ch 166.16.0.0 - 166.47.255.255 us -166.49.0.0 - 166.49.3.47 us -166.49.3.48 - 166.49.3.55 gb -166.49.3.56 - 166.49.6.7 us -166.49.6.8 - 166.49.6.23 gb -166.49.6.24 - 166.49.6.47 us -166.49.6.48 - 166.49.6.63 gb -166.49.6.64 - 166.49.6.71 ch -166.49.6.72 - 166.49.6.79 gb -166.49.6.80 - 166.49.16.47 us -166.49.16.48 - 166.49.16.55 gb -166.49.16.56 - 166.49.20.39 us -166.49.20.40 - 166.49.20.47 ca -166.49.20.48 - 166.49.22.15 us -166.49.22.16 - 166.49.22.23 gb -166.49.22.24 - 166.49.24.31 us -166.49.24.32 - 166.49.24.47 sg -166.49.24.48 - 166.49.37.255 us -166.49.38.0 - 166.49.38.7 gb -166.49.38.8 - 166.49.38.63 us -166.49.38.64 - 166.49.38.71 gb -166.49.38.72 - 166.49.48.39 us -166.49.48.40 - 166.49.48.47 gb -166.49.48.48 - 166.49.56.15 us -166.49.56.16 - 166.49.56.31 sg -166.49.56.32 - 166.49.62.15 us -166.49.62.16 - 166.49.62.31 ca -166.49.62.32 - 166.49.73.55 us -166.49.73.56 - 166.49.73.63 gb -166.49.73.64 - 166.49.93.255 us -166.49.94.0 - 166.49.94.7 jp -166.49.94.8 - 166.49.127.255 us +166.48.0.0 - 166.48.255.255 ca +166.49.0.0 - 166.49.127.255 us 166.49.128.0 - 166.49.255.255 gb -166.50.0.0 - 166.63.255.255 us +166.50.0.0 - 166.62.127.255 us +166.62.128.0 - 166.62.255.255 ca +166.63.0.0 - 166.63.211.255 us +166.63.212.0 - 166.63.212.255 gb +166.63.213.0 - 166.63.255.255 us 166.64.0.0 - 166.64.255.255 au 166.65.0.0 - 166.65.255.255 nz 166.66.0.0 - 166.74.255.255 us 166.75.0.0 - 166.75.255.255 cl -166.76.0.0 - 166.77.255.255 us +166.76.0.0 - 166.78.255.255 us 166.79.0.0 - 166.79.255.255 kr 166.80.0.0 - 166.80.255.255 us 166.81.0.0 - 166.81.255.255 hk -166.82.0.0 - 166.82.72.255 us -166.82.73.0 - 166.82.73.255 aq -166.82.74.0 - 166.82.255.255 us +166.82.0.0 - 166.82.255.255 us 166.83.0.0 - 166.83.255.255 nz 166.84.0.0 - 166.84.255.255 us 166.85.0.0 - 166.85.255.255 za @@ -71933,7 +57283,6 @@ 166.101.0.0 - 166.102.255.255 us 166.103.0.0 - 166.104.255.255 kr 166.105.0.0 - 166.105.255.255 us -166.106.0.0 - 166.106.255.255 nz 166.107.0.0 - 166.109.255.255 us 166.110.0.0 - 166.110.255.255 cl 166.111.0.0 - 166.111.255.255 cn @@ -71945,7 +57294,17 @@ 166.121.0.0 - 166.121.255.255 sg 166.122.0.0 - 166.124.255.255 us 166.125.0.0 - 166.125.255.255 kr -166.126.0.0 - 167.10.255.255 us +166.126.0.0 - 166.179.226.255 us +166.179.227.0 - 166.179.227.255 nz +166.179.228.0 - 166.179.230.255 us +166.179.231.0 - 166.179.231.255 nz +166.179.232.0 - 166.210.224.255 us +166.210.225.0 - 166.210.225.255 co +166.210.226.0 - 166.255.255.255 us +167.0.0.0 - 167.0.255.255 co +167.1.0.0 - 167.9.5.10 us +167.9.5.11 - 167.9.5.11 eu +167.9.5.12 - 167.10.255.255 us 167.11.0.0 - 167.11.255.255 ca 167.12.0.0 - 167.16.255.255 us 167.17.0.0 - 167.17.255.255 ca @@ -71954,19 +57313,87 @@ 167.29.0.0 - 167.29.255.255 us 167.30.0.0 - 167.30.255.255 au 167.31.0.0 - 167.31.255.255 us -167.32.0.0 - 167.63.255.255 ca -167.64.0.0 - 167.73.255.255 us +167.32.0.0 - 167.55.255.255 ca +167.56.0.0 - 167.63.255.255 uy +167.64.0.0 - 167.64.71.255 us +167.64.72.0 - 167.64.72.255 gb +167.64.73.0 - 167.73.255.255 us 167.74.0.0 - 167.74.255.255 ca 167.75.0.0 - 167.80.255.255 us 167.81.0.0 - 167.81.255.255 nl -167.82.0.0 - 167.91.255.255 us +167.82.0.0 - 167.83.8.255 us +167.83.9.0 - 167.83.9.255 eu +167.83.10.0 - 167.83.97.255 us +167.83.98.0 - 167.83.99.255 ap +167.83.100.0 - 167.83.144.255 us +167.83.145.0 - 167.83.145.255 au +167.83.146.0 - 167.88.15.255 us +167.88.16.0 - 167.88.47.255 ca +167.88.48.0 - 167.88.96.255 us +167.88.97.0 - 167.88.97.255 it +167.88.98.0 - 167.88.98.255 qa +167.88.99.0 - 167.88.99.255 in +167.88.100.0 - 167.88.100.255 ae +167.88.101.0 - 167.88.101.255 es +167.88.102.0 - 167.88.103.255 cn +167.88.104.0 - 167.88.104.255 jp +167.88.105.0 - 167.88.105.255 ro +167.88.106.0 - 167.88.106.255 fr +167.88.107.0 - 167.88.107.255 pt +167.88.108.0 - 167.88.108.255 at +167.88.109.0 - 167.88.109.255 mt +167.88.110.0 - 167.88.110.255 gr +167.88.111.0 - 167.88.111.255 sa +167.88.112.0 - 167.88.127.255 us +167.88.128.0 - 167.88.143.255 ca +167.88.144.0 - 167.88.175.255 us +167.88.176.0 - 167.88.191.255 ca +167.88.192.0 - 167.91.255.255 us 167.92.0.0 - 167.92.255.255 ca 167.93.0.0 - 167.102.255.255 us 167.103.0.0 - 167.103.255.255 au 167.104.0.0 - 167.107.255.255 us +167.108.0.0 - 167.108.255.255 uy 167.109.0.0 - 167.110.255.255 us 167.111.0.0 - 167.111.255.255 sa -167.112.0.0 - 167.122.255.255 us +167.112.0.0 - 167.113.255.255 us +167.114.0.0 - 167.114.11.33 ca +167.114.11.34 - 167.114.11.34 us +167.114.11.35 - 167.114.31.255 ca +167.114.32.0 - 167.114.32.255 us +167.114.33.0 - 167.114.38.179 ca +167.114.38.180 - 167.114.38.183 us +167.114.38.184 - 167.114.43.191 ca +167.114.43.192 - 167.114.43.223 fr +167.114.43.224 - 167.114.60.39 ca +167.114.60.40 - 167.114.60.47 us +167.114.60.48 - 167.114.64.92 ca +167.114.64.93 - 167.114.64.93 us +167.114.64.94 - 167.114.81.63 ca +167.114.81.64 - 167.114.81.79 us +167.114.81.80 - 167.114.85.43 ca +167.114.85.44 - 167.114.85.47 us +167.114.85.48 - 167.114.99.212 ca +167.114.99.213 - 167.114.99.213 us +167.114.99.214 - 167.114.100.47 ca +167.114.100.48 - 167.114.100.48 us +167.114.100.49 - 167.114.100.115 ca +167.114.100.116 - 167.114.100.116 us +167.114.100.117 - 167.114.123.47 ca +167.114.123.48 - 167.114.123.48 us +167.114.123.49 - 167.114.143.31 ca +167.114.143.32 - 167.114.143.47 us +167.114.143.48 - 167.114.165.183 ca +167.114.165.184 - 167.114.165.191 us +167.114.165.192 - 167.114.196.255 ca +167.114.197.0 - 167.114.197.15 us +167.114.197.16 - 167.114.214.47 ca +167.114.214.48 - 167.114.214.55 us +167.114.214.56 - 167.114.223.255 ca +167.114.224.0 - 167.114.255.255 fr +167.115.0.0 - 167.115.255.255 us +167.116.0.0 - 167.116.255.255 uy +167.117.0.0 - 167.122.255.255 us 167.123.0.0 - 167.123.255.255 au 167.124.0.0 - 167.124.255.255 us 167.125.0.0 - 167.125.255.255 ca @@ -71977,11 +57404,18 @@ 167.134.0.0 - 167.134.255.255 ve 167.135.0.0 - 167.138.255.255 us 167.139.0.0 - 167.139.255.255 cn -167.140.0.0 - 167.148.255.255 us +167.140.0.0 - 167.146.255.255 us +167.147.0.0 - 167.147.255.255 ca +167.148.0.0 - 167.148.255.255 us 167.149.0.0 - 167.149.255.255 ch 167.150.0.0 - 167.156.255.255 us 167.157.0.0 - 167.157.255.255 bo -167.158.0.0 - 167.161.255.255 us +167.158.0.0 - 167.160.39.255 us +167.160.40.0 - 167.160.43.255 de +167.160.44.0 - 167.160.47.255 us +167.160.48.0 - 167.160.55.255 in +167.160.56.0 - 167.160.63.255 gb +167.160.64.0 - 167.161.255.255 us 167.162.0.0 - 167.162.255.255 au 167.163.0.0 - 167.167.255.255 us 167.168.0.0 - 167.168.255.255 ch @@ -71993,85 +57427,213 @@ 167.176.0.0 - 167.178.255.255 us 167.179.0.0 - 167.179.255.255 nz 167.180.0.0 - 167.188.255.255 us -167.189.0.0 - 167.189.255.255 au -167.190.0.0 - 167.202.255.255 us +167.189.0.0 - 167.189.255.255 cn +167.190.0.0 - 167.191.252.255 us +167.191.253.0 - 167.191.253.255 eu +167.191.254.0 - 167.202.191.255 us +167.202.192.0 - 167.202.223.255 nl +167.202.224.0 - 167.202.255.255 us 167.203.0.0 - 167.203.255.255 gb 167.204.0.0 - 167.204.255.255 us 167.205.0.0 - 167.205.255.255 id -167.206.0.0 - 167.216.131.255 us -167.216.132.0 - 167.216.133.255 il -167.216.134.0 - 167.216.135.255 us -167.216.136.0 - 167.216.139.255 il -167.216.140.0 - 167.216.140.127 gb -167.216.140.128 - 167.216.140.143 us -167.216.140.144 - 167.216.142.15 gb -167.216.142.16 - 167.216.142.31 il -167.216.142.32 - 167.216.142.71 gb -167.216.142.72 - 167.216.142.127 il -167.216.142.128 - 167.216.142.191 gb -167.216.142.192 - 167.216.142.255 il -167.216.143.0 - 167.216.143.255 us -167.216.144.0 - 167.216.146.127 fr -167.216.146.128 - 167.216.146.159 gb -167.216.146.160 - 167.216.146.255 il -167.216.147.0 - 167.216.147.63 gb -167.216.147.64 - 167.216.159.255 il -167.216.160.0 - 167.216.160.31 us -167.216.160.32 - 167.216.193.127 il -167.216.193.128 - 167.216.193.143 us -167.216.193.144 - 167.216.193.191 il -167.216.193.192 - 167.216.195.255 us -167.216.196.0 - 167.216.196.127 il -167.216.196.128 - 167.216.196.159 de -167.216.196.160 - 167.216.199.255 il -167.216.200.0 - 167.216.200.31 us -167.216.200.32 - 167.216.200.191 il -167.216.200.192 - 167.216.200.199 us -167.216.200.200 - 167.216.202.255 il -167.216.203.0 - 167.216.203.63 us -167.216.203.64 - 167.216.203.95 il -167.216.203.96 - 167.216.203.111 us -167.216.203.112 - 167.216.205.31 il -167.216.205.32 - 167.216.205.63 us -167.216.205.64 - 167.216.205.111 il -167.216.205.112 - 167.216.205.127 us -167.216.205.128 - 167.216.207.15 il -167.216.207.16 - 167.216.207.31 us -167.216.207.32 - 167.216.208.255 il -167.216.209.0 - 167.216.209.15 us -167.216.209.16 - 167.216.209.63 il -167.216.209.64 - 167.216.209.127 us -167.216.209.128 - 167.216.210.95 il -167.216.210.96 - 167.216.210.103 gb -167.216.210.104 - 167.216.223.255 il -167.216.224.0 - 167.216.224.15 ie -167.216.224.16 - 167.216.232.255 il -167.216.233.0 - 167.216.233.255 us -167.216.234.0 - 167.216.247.159 il -167.216.247.160 - 167.216.247.191 us -167.216.247.192 - 167.216.251.215 il -167.216.251.216 - 167.216.251.223 us -167.216.251.224 - 167.216.251.231 il -167.216.251.232 - 167.216.252.63 us -167.216.252.64 - 167.216.255.255 il -167.217.0.0 - 167.226.255.255 us +167.206.0.0 - 167.216.140.255 us +167.216.141.0 - 167.216.141.255 gb +167.216.142.0 - 167.216.146.159 us +167.216.146.160 - 167.216.146.191 gb +167.216.146.192 - 167.216.148.127 us +167.216.148.128 - 167.216.148.159 gb +167.216.148.160 - 167.219.47.255 us +167.219.48.0 - 167.219.48.255 in +167.219.49.0 - 167.220.191.255 us +167.220.192.0 - 167.220.195.255 ie +167.220.196.0 - 167.220.199.255 gb +167.220.200.0 - 167.220.200.255 ie +167.220.201.0 - 167.220.201.255 gb +167.220.202.0 - 167.220.223.255 us +167.220.224.0 - 167.220.228.255 sg +167.220.229.0 - 167.220.229.255 jp +167.220.230.0 - 167.220.230.255 in +167.220.231.0 - 167.220.231.255 au +167.220.232.0 - 167.220.235.255 jp +167.220.236.0 - 167.220.239.255 in +167.220.240.0 - 167.220.243.255 au +167.220.244.0 - 167.220.247.255 cn +167.220.248.0 - 167.220.255.255 sg +167.221.0.0 - 167.226.255.255 us 167.227.0.0 - 167.227.255.255 ca -167.228.0.0 - 167.251.255.255 us +167.228.0.0 - 167.232.232.255 us +167.232.233.0 - 167.232.233.255 ap +167.232.234.0 - 167.232.239.255 us +167.232.240.0 - 167.232.240.255 eu +167.232.241.0 - 167.236.63.255 us +167.236.64.0 - 167.236.127.255 nl +167.236.128.0 - 167.236.247.255 us +167.236.248.0 - 167.236.248.255 eu +167.236.249.0 - 167.246.62.255 us +167.246.63.0 - 167.246.63.255 ca +167.246.64.0 - 167.247.14.255 us +167.247.15.0 - 167.247.15.255 ap +167.247.16.0 - 167.247.79.255 us +167.247.80.0 - 167.247.83.10 gb +167.247.83.11 - 167.247.83.11 eu +167.247.83.12 - 167.247.87.255 gb +167.247.88.0 - 167.247.219.9 us +167.247.219.10 - 167.247.219.10 ap +167.247.219.11 - 167.248.255.255 us +167.249.0.0 - 167.249.7.255 br +167.249.8.0 - 167.249.11.255 pe +167.249.12.0 - 167.249.19.255 br +167.249.20.0 - 167.249.23.255 sv +167.249.24.0 - 167.249.31.255 br +167.249.32.0 - 167.249.35.255 ve +167.249.36.0 - 167.249.39.255 br +167.249.40.0 - 167.249.43.255 co +167.249.44.0 - 167.249.47.255 ar +167.249.48.0 - 167.249.51.255 br +167.249.52.0 - 167.249.55.255 ar +167.249.56.0 - 167.249.115.255 br +167.249.116.0 - 167.249.119.255 mx +167.249.120.0 - 167.249.191.255 br +167.249.192.0 - 167.249.199.255 ar +167.249.200.0 - 167.249.203.255 bz +167.249.204.0 - 167.249.215.255 br +167.249.216.0 - 167.249.219.255 ar +167.249.220.0 - 167.249.251.255 br +167.249.252.0 - 167.249.255.255 mx +167.250.0.0 - 167.250.3.255 br +167.250.4.0 - 167.250.7.255 ar +167.250.8.0 - 167.250.35.255 br +167.250.36.0 - 167.250.39.255 py +167.250.40.0 - 167.250.47.255 br +167.250.48.0 - 167.250.51.255 ve +167.250.52.0 - 167.250.55.255 cl +167.250.56.0 - 167.250.75.255 br +167.250.76.0 - 167.250.79.255 mx +167.250.80.0 - 167.250.107.255 br +167.250.108.0 - 167.250.111.255 hn +167.250.112.0 - 167.250.115.255 pa +167.250.116.0 - 167.250.119.255 ar +167.250.120.0 - 167.250.123.255 co +167.250.124.0 - 167.250.131.255 br +167.250.132.0 - 167.250.135.255 cl +167.250.136.0 - 167.250.167.255 br +167.250.168.0 - 167.250.171.255 ar +167.250.172.0 - 167.250.179.255 br +167.250.180.0 - 167.250.183.255 ec +167.250.184.0 - 167.250.191.255 br +167.250.192.0 - 167.250.195.255 cr +167.250.196.0 - 167.250.203.255 br +167.250.204.0 - 167.250.207.255 pe +167.250.208.0 - 167.250.211.255 ar +167.250.212.0 - 167.250.215.255 hn +167.250.216.0 - 167.250.219.255 br +167.250.220.0 - 167.250.223.255 gt +167.250.224.0 - 167.250.255.255 br +167.251.0.0 - 167.251.255.255 us 167.252.0.0 - 167.252.255.255 ar 167.253.0.0 - 167.255.255.255 us -168.1.0.0 - 168.1.255.255 ch -168.2.0.0 - 168.69.255.255 us +168.0.0.0 - 168.0.11.255 br +168.0.12.0 - 168.0.15.255 pe +168.0.16.0 - 168.0.55.255 br +168.0.56.0 - 168.0.59.255 ar +168.0.60.0 - 168.0.83.255 br +168.0.84.0 - 168.0.87.255 sx +168.0.88.0 - 168.0.183.255 br +168.0.184.0 - 168.0.187.255 ar +168.0.188.0 - 168.0.199.255 br +168.0.200.0 - 168.0.207.255 ar +168.0.208.0 - 168.0.211.255 br +168.0.212.0 - 168.0.215.255 hn +168.0.216.0 - 168.0.219.255 br +168.0.220.0 - 168.0.223.255 mx +168.0.224.0 - 168.0.243.255 br +168.0.244.0 - 168.0.247.255 co +168.0.248.0 - 168.0.255.255 br +168.1.0.0 - 168.1.127.255 au +168.1.128.0 - 168.61.55.255 us +168.61.56.0 - 168.61.63.255 nl +168.61.64.0 - 168.61.79.255 us +168.61.80.0 - 168.61.84.141 ie +168.61.84.142 - 168.61.84.142 us +168.61.84.143 - 168.61.95.255 ie +168.61.96.0 - 168.61.103.255 hk +168.61.104.0 - 168.61.127.255 ie +168.61.128.0 - 168.62.32.191 us +168.62.32.192 - 168.62.32.255 sg +168.62.33.0 - 168.62.34.255 us +168.62.35.0 - 168.62.35.255 sg +168.62.36.0 - 168.62.255.255 us +168.63.0.0 - 168.63.31.255 nl +168.63.32.0 - 168.63.87.255 ie +168.63.88.0 - 168.63.89.255 us +168.63.90.0 - 168.63.91.63 sg +168.63.91.64 - 168.63.91.255 us +168.63.92.0 - 168.63.95.255 ie +168.63.96.0 - 168.63.120.118 nl +168.63.120.119 - 168.63.120.119 gb +168.63.120.120 - 168.63.121.70 nl +168.63.121.71 - 168.63.121.71 ie +168.63.121.72 - 168.63.127.255 nl +168.63.128.0 - 168.63.156.95 hk +168.63.156.96 - 168.63.156.111 ie +168.63.156.112 - 168.63.159.255 hk +168.63.160.0 - 168.63.191.255 sg +168.63.192.0 - 168.63.223.255 hk +168.63.224.0 - 168.63.255.255 sg +168.64.0.0 - 168.65.65.229 us +168.65.65.230 - 168.65.65.230 eu +168.65.65.231 - 168.69.255.255 us 168.70.0.0 - 168.70.255.255 hk 168.71.0.0 - 168.75.255.255 us 168.76.0.0 - 168.76.255.255 za 168.77.0.0 - 168.77.255.255 pa 168.78.0.0 - 168.78.255.255 kr -168.79.0.0 - 168.79.255.255 jp -168.80.0.0 - 168.81.255.255 za +168.80.0.0 - 168.80.31.255 za +168.80.32.0 - 168.81.31.255 sc +168.81.32.0 - 168.81.63.255 za +168.81.64.0 - 168.81.255.255 sc 168.82.0.0 - 168.82.255.255 us 168.83.0.0 - 168.83.255.255 ar -168.84.0.0 - 168.88.255.255 us +168.84.0.0 - 168.87.3.32 us +168.87.3.33 - 168.87.3.33 eu +168.87.3.34 - 168.87.70.255 us +168.87.71.0 - 168.87.71.255 au +168.87.72.0 - 168.88.69.255 us +168.88.70.0 - 168.88.70.255 gb +168.88.71.0 - 168.88.71.255 us +168.88.72.0 - 168.88.72.255 ca +168.88.73.0 - 168.88.255.255 us 168.89.0.0 - 168.89.255.255 za +168.90.0.0 - 168.90.7.255 br +168.90.8.0 - 168.90.11.255 ar +168.90.12.0 - 168.90.15.255 co +168.90.16.0 - 168.90.67.255 br +168.90.68.0 - 168.90.71.255 mx +168.90.72.0 - 168.90.75.255 ar +168.90.76.0 - 168.90.83.255 br +168.90.84.0 - 168.90.87.255 ar +168.90.88.0 - 168.90.91.255 br +168.90.92.0 - 168.90.95.255 ve +168.90.96.0 - 168.90.99.255 hn +168.90.100.0 - 168.90.107.255 br +168.90.108.0 - 168.90.111.255 hn +168.90.112.0 - 168.90.127.255 br +168.90.128.0 - 168.90.131.255 ar +168.90.132.0 - 168.90.155.255 br +168.90.156.0 - 168.90.159.255 cl +168.90.160.0 - 168.90.163.255 ar +168.90.164.0 - 168.90.175.255 br +168.90.176.0 - 168.90.179.255 py +168.90.180.0 - 168.90.195.255 br +168.90.196.0 - 168.90.199.255 hn +168.90.200.0 - 168.90.219.255 br +168.90.220.0 - 168.90.223.255 cl +168.90.224.0 - 168.90.231.255 br +168.90.232.0 - 168.90.235.255 cl +168.90.236.0 - 168.90.243.255 br +168.90.244.0 - 168.90.247.255 bz +168.90.248.0 - 168.90.251.255 br +168.90.252.0 - 168.90.255.255 ar 168.91.0.0 - 168.94.255.255 us 168.95.0.0 - 168.95.255.255 tw 168.96.0.0 - 168.96.255.255 ar @@ -72083,12 +57645,41 @@ 168.115.0.0 - 168.115.255.255 kr 168.116.0.0 - 168.119.255.255 us 168.120.0.0 - 168.120.255.255 th +168.121.0.0 - 168.121.31.255 br +168.121.32.0 - 168.121.39.255 ar +168.121.40.0 - 168.121.43.255 br +168.121.44.0 - 168.121.51.255 pe +168.121.52.0 - 168.121.55.255 br +168.121.56.0 - 168.121.59.255 ar +168.121.60.0 - 168.121.63.255 mx +168.121.64.0 - 168.121.79.255 br +168.121.80.0 - 168.121.83.255 cl +168.121.84.0 - 168.121.87.255 sr +168.121.88.0 - 168.121.115.255 br +168.121.116.0 - 168.121.119.255 ar +168.121.120.0 - 168.121.127.255 br +168.121.128.0 - 168.121.131.255 pa +168.121.132.0 - 168.121.183.255 br +168.121.184.0 - 168.121.187.255 uy +168.121.188.0 - 168.121.207.255 br +168.121.208.0 - 168.121.215.255 ar +168.121.216.0 - 168.121.219.255 br +168.121.220.0 - 168.121.223.255 pe +168.121.224.0 - 168.121.235.255 br +168.121.236.0 - 168.121.239.255 pe +168.121.240.0 - 168.121.247.255 mx +168.121.248.0 - 168.121.255.255 br 168.122.0.0 - 168.122.255.255 us 168.123.0.0 - 168.123.255.255 gu 168.124.0.0 - 168.125.255.255 us 168.126.0.0 - 168.126.255.255 kr -168.127.0.0 - 168.127.255.255 us -168.128.0.0 - 168.128.255.255 za +168.127.0.0 - 168.128.7.255 us +168.128.8.0 - 168.128.15.255 de +168.128.16.0 - 168.128.31.255 us +168.128.32.0 - 168.128.39.255 au +168.128.40.0 - 168.128.47.255 nl +168.128.48.0 - 168.128.55.255 au +168.128.56.0 - 168.128.255.255 za 168.129.0.0 - 168.129.255.255 us 168.130.0.0 - 168.130.255.255 au 168.131.0.0 - 168.131.255.255 kr @@ -72100,132 +57691,559 @@ 168.140.0.0 - 168.140.255.255 au 168.141.0.0 - 168.141.255.255 us 168.142.0.0 - 168.142.255.255 za -168.143.0.0 - 168.143.113.255 us -168.143.114.0 - 168.143.114.255 a1 -168.143.115.0 - 168.143.117.127 us -168.143.117.128 - 168.143.117.255 a1 -168.143.118.0 - 168.143.119.255 us -168.143.120.0 - 168.143.120.127 a1 -168.143.120.128 - 168.143.123.63 us -168.143.123.64 - 168.143.123.127 a1 -168.143.123.128 - 168.143.185.175 us -168.143.185.176 - 168.143.185.191 a1 -168.143.185.192 - 168.143.185.207 us -168.143.185.208 - 168.143.185.223 a1 -168.143.185.224 - 168.143.255.255 us +168.143.0.0 - 168.143.255.255 us 168.144.0.0 - 168.144.255.255 ca 168.145.0.0 - 168.151.255.255 us -168.152.0.0 - 168.153.255.255 au +168.152.0.0 - 168.153.0.255 au +168.153.1.0 - 168.153.1.255 in +168.153.2.0 - 168.153.106.255 au +168.153.107.0 - 168.153.108.255 us +168.153.109.0 - 168.153.255.255 au 168.154.0.0 - 168.154.255.255 kr 168.155.0.0 - 168.155.255.255 za -168.156.0.0 - 168.159.255.255 us +168.156.0.0 - 168.159.143.255 us +168.159.144.0 - 168.159.144.255 cn +168.159.145.0 - 168.159.159.255 us +168.159.160.0 - 168.159.160.255 in +168.159.161.0 - 168.159.191.255 us +168.159.192.0 - 168.159.192.255 au +168.159.193.0 - 168.159.255.255 us 168.160.0.0 - 168.160.255.255 cn -168.161.0.0 - 168.162.255.255 us +168.161.0.0 - 168.161.96.255 us +168.161.97.0 - 168.161.97.255 hk +168.161.98.0 - 168.161.199.255 us +168.161.200.0 - 168.161.200.255 gb +168.161.201.0 - 168.161.201.255 us +168.161.202.0 - 168.161.203.255 gb +168.161.204.0 - 168.162.255.255 us 168.163.0.0 - 168.163.255.255 ch 168.164.0.0 - 168.164.255.255 za 168.165.0.0 - 168.165.255.255 mx 168.166.0.0 - 168.166.255.255 us -168.167.0.0 - 168.167.255.255 bw -168.168.0.0 - 168.171.255.255 us +168.167.0.0 - 168.167.253.255 bw +168.167.254.0 - 168.167.254.255 au +168.167.255.0 - 168.167.255.255 bw +168.168.0.0 - 168.168.32.255 us +168.168.33.0 - 168.168.33.249 gb +168.168.33.250 - 168.168.33.250 eu +168.168.33.251 - 168.168.33.255 gb +168.168.34.0 - 168.168.42.255 us +168.168.43.0 - 168.168.43.255 eu +168.168.44.0 - 168.171.255.255 us 168.172.0.0 - 168.172.255.255 za 168.173.0.0 - 168.175.255.255 us 168.176.0.0 - 168.176.255.255 co -168.177.0.0 - 168.185.255.255 us +168.177.0.0 - 168.180.255.255 us +168.181.0.0 - 168.181.7.255 br +168.181.8.0 - 168.181.11.255 pe +168.181.12.0 - 168.181.23.255 br +168.181.24.0 - 168.181.27.255 ar +168.181.28.0 - 168.181.43.255 br +168.181.44.0 - 168.181.47.255 ar +168.181.48.0 - 168.181.51.255 br +168.181.52.0 - 168.181.55.255 hn +168.181.60.0 - 168.181.67.255 br +168.181.72.0 - 168.181.75.255 ar +168.181.80.0 - 168.181.115.255 br +168.181.120.0 - 168.181.123.255 hn +168.181.128.0 - 168.181.159.255 br +168.181.160.0 - 168.181.163.255 cr +168.181.164.0 - 168.181.175.255 br +168.181.176.0 - 168.181.179.255 ar +168.181.180.0 - 168.181.183.255 br +168.181.184.0 - 168.181.187.255 ar +168.181.188.0 - 168.181.191.255 br +168.181.200.0 - 168.181.203.255 br +168.181.204.0 - 168.181.211.255 ar +168.181.212.0 - 168.181.227.255 br +168.181.228.0 - 168.181.231.255 hn +168.181.232.0 - 168.181.235.255 br +168.181.248.0 - 168.181.255.255 br +168.182.0.0 - 168.183.83.255 us +168.183.84.0 - 168.183.84.255 eu +168.183.85.0 - 168.185.255.255 us 168.186.0.0 - 168.186.255.255 au -168.187.0.0 - 168.187.255.255 kw +168.187.0.0 - 168.187.10.255 kw +168.187.11.0 - 168.187.11.255 us +168.187.12.0 - 168.187.102.255 kw +168.187.103.0 - 168.187.103.255 us +168.187.104.0 - 168.187.110.255 kw +168.187.111.0 - 168.187.111.255 us +168.187.112.0 - 168.187.255.255 kw 168.188.0.0 - 168.188.255.255 kr 168.189.0.0 - 168.193.255.255 us 168.198.0.0 - 168.198.255.255 au 168.199.0.0 - 168.201.255.255 us 168.202.0.0 - 168.202.255.255 it 168.203.0.0 - 168.204.255.255 us +168.205.0.0 - 168.205.3.255 ar +168.205.8.0 - 168.205.11.255 pa +168.205.32.0 - 168.205.35.255 br 168.206.0.0 - 168.206.255.255 za 168.207.0.0 - 168.208.255.255 us -168.209.0.0 - 168.210.255.255 za -168.212.0.0 - 168.215.119.255 us -168.215.120.0 - 168.215.120.255 a2 -168.215.121.0 - 168.216.255.255 us +168.209.0.0 - 168.211.255.255 za +168.212.0.0 - 168.216.255.255 us 168.217.0.0 - 168.217.255.255 au 168.218.0.0 - 168.218.255.255 us 168.219.0.0 - 168.219.255.255 kr -168.220.0.0 - 168.225.255.255 us +168.220.0.0 - 168.224.159.255 us +168.224.160.0 - 168.224.160.255 eu +168.224.161.0 - 168.225.255.255 us 168.226.0.0 - 168.226.255.255 ar -168.229.0.0 - 168.230.255.255 us +168.229.0.0 - 168.230.239.255 us +168.230.240.0 - 168.230.240.255 gb +168.230.241.0 - 168.230.255.255 us 168.231.0.0 - 168.231.255.255 cl 168.233.0.0 - 168.233.255.255 us 168.234.0.0 - 168.234.255.255 gt -168.235.0.0 - 168.235.63.255 us -168.236.0.0 - 168.242.255.255 us +168.235.0.0 - 168.235.76.197 us +168.235.76.198 - 168.235.76.198 mx +168.235.76.199 - 168.235.143.255 us +168.235.144.0 - 168.235.159.255 ca +168.235.160.0 - 168.235.223.255 us +168.235.224.0 - 168.235.239.255 ca +168.235.240.0 - 168.242.255.255 us 168.243.0.0 - 168.243.255.255 sv 168.244.0.0 - 168.247.255.255 us 168.248.0.0 - 168.249.255.255 kr 168.250.0.0 - 168.251.255.255 us 168.252.0.0 - 168.252.255.255 au +168.253.0.0 - 168.253.31.255 lr +168.253.32.0 - 168.253.63.255 zw +168.253.64.0 - 168.253.95.255 za +168.253.96.0 - 168.253.111.255 dz +168.253.112.0 - 168.253.119.255 ng +168.253.120.0 - 168.253.127.255 za +168.253.128.0 - 168.253.168.255 re +168.253.169.0 - 168.253.171.255 yt +168.253.172.0 - 168.253.174.255 re +168.253.175.0 - 168.253.175.255 yt +168.253.176.0 - 168.253.191.255 re +168.253.192.0 - 168.253.207.255 za +168.253.208.0 - 168.253.215.255 ng +168.253.216.0 - 168.253.223.255 za +168.253.224.0 - 168.253.255.255 mw 168.254.0.0 - 168.254.255.255 us 168.255.0.0 - 168.255.255.255 mx -169.0.0.0 - 169.31.255.255 us -169.32.0.0 - 169.63.255.255 ch -169.64.0.0 - 169.71.49.255 us -169.71.50.0 - 169.71.50.255 gb -169.71.51.0 - 169.128.255.255 us +169.0.0.0 - 169.1.255.255 za +169.2.0.0 - 169.31.255.255 us +169.32.0.0 - 169.37.255.255 ch +169.38.0.0 - 169.38.70.255 us +169.38.71.0 - 169.38.71.7 in +169.38.71.8 - 169.38.255.255 us +169.39.0.0 - 169.39.255.255 ch +169.40.0.0 - 169.40.255.255 us +169.41.0.0 - 169.43.255.255 ch +169.44.0.0 - 169.44.255.255 us +169.45.0.0 - 169.48.255.255 nl +169.49.0.0 - 169.49.255.255 ch +169.50.0.0 - 169.51.255.255 us +169.52.0.0 - 169.52.255.255 ch +169.53.0.0 - 169.53.166.191 us +169.53.166.192 - 169.53.166.207 kr +169.53.166.208 - 169.53.188.255 us +169.53.189.0 - 169.53.189.255 ca +169.53.190.0 - 169.53.227.31 us +169.53.227.32 - 169.53.227.63 at +169.53.227.64 - 169.53.253.191 us +169.53.253.192 - 169.53.253.207 ec +169.53.253.208 - 169.54.63.255 us +169.54.64.0 - 169.54.127.255 ca +169.54.128.0 - 169.54.164.63 us +169.54.164.64 - 169.54.164.79 hk +169.54.164.80 - 169.54.197.111 us +169.54.197.112 - 169.54.197.127 au +169.54.197.128 - 169.54.211.63 us +169.54.211.64 - 169.54.211.95 au +169.54.211.96 - 169.54.214.31 us +169.54.214.32 - 169.54.214.47 gb +169.54.214.48 - 169.54.226.127 us +169.54.226.128 - 169.54.226.143 ca +169.54.226.144 - 169.54.227.175 us +169.54.227.176 - 169.54.227.191 ca +169.54.227.192 - 169.55.31.191 us +169.55.31.192 - 169.55.31.207 br +169.55.31.208 - 169.55.33.95 us +169.55.33.96 - 169.55.33.111 gb +169.55.33.112 - 169.55.39.79 us +169.55.39.80 - 169.55.39.95 pe +169.55.39.96 - 169.56.255.255 us +169.57.0.0 - 169.57.127.255 mx +169.57.128.0 - 169.57.255.255 br +169.58.0.0 - 169.63.255.255 ch +169.64.0.0 - 169.128.255.255 us 169.129.0.0 - 169.129.255.255 za 169.130.0.0 - 169.139.255.255 us 169.140.0.0 - 169.140.255.255 kr -169.141.0.0 - 169.157.255.255 us -169.158.0.0 - 169.158.255.255 cu -169.160.0.0 - 169.200.255.255 us -169.201.0.0 - 169.201.255.255 au +169.141.0.0 - 169.143.243.255 us +169.143.244.0 - 169.143.247.255 eu +169.143.248.0 - 169.145.41.255 us +169.145.42.0 - 169.145.42.255 ca +169.145.43.0 - 169.145.196.255 us +169.145.197.0 - 169.145.197.255 ap +169.145.198.0 - 169.148.255.255 us +169.149.0.0 - 169.149.255.255 sg +169.150.0.0 - 169.157.255.255 us +169.158.0.0 - 169.158.199.255 cu +169.158.200.0 - 169.158.200.255 eu +169.158.201.0 - 169.158.255.255 cu +169.159.0.0 - 169.159.63.255 ga +169.159.64.0 - 169.159.127.255 ng +169.159.128.0 - 169.159.207.255 za +169.159.208.0 - 169.159.223.255 cd +169.160.0.0 - 169.196.71.255 us +169.196.72.0 - 169.196.79.255 gb +169.196.80.0 - 169.196.195.255 us +169.196.196.0 - 169.196.199.255 gb +169.196.200.0 - 169.197.63.255 us +169.198.0.0 - 169.200.255.255 us 169.202.0.0 - 169.202.255.255 za 169.203.0.0 - 169.207.255.255 us -169.208.0.0 - 169.211.0.255 kr -169.211.1.0 - 169.211.1.255 cn -169.211.2.0 - 169.211.3.255 kr -169.211.4.0 - 169.211.4.255 id -169.211.5.0 - 169.211.5.255 vn -169.211.6.0 - 169.221.255.255 kr -169.222.0.0 - 169.222.0.255 au -169.222.1.0 - 169.222.255.255 kr -169.223.0.0 - 169.223.255.255 cn -169.224.0.0 - 169.253.255.255 us +169.208.0.0 - 169.223.255.255 kr +169.224.0.0 - 169.238.255.255 us +169.239.0.0 - 169.239.3.255 tz +169.239.4.0 - 169.239.11.255 za +169.239.12.0 - 169.239.15.255 cv +169.239.16.0 - 169.239.19.255 ng +169.239.20.0 - 169.239.23.255 sc +169.239.24.0 - 169.239.27.255 zw +169.239.28.0 - 169.239.31.255 za +169.239.32.0 - 169.239.35.255 ao +169.239.36.0 - 169.239.39.255 eg +169.239.40.0 - 169.239.43.255 cm +169.239.44.0 - 169.239.47.255 za +169.239.48.0 - 169.239.51.255 ng +169.239.52.0 - 169.239.55.255 gh +169.239.56.0 - 169.239.59.255 dz +169.239.60.0 - 169.239.63.255 za +169.239.64.0 - 169.239.67.255 ci +169.239.68.0 - 169.239.71.255 za +169.239.72.0 - 169.239.75.255 cd +169.239.76.0 - 169.239.79.255 ao +169.239.80.0 - 169.239.87.255 za +169.239.88.0 - 169.239.91.255 ug +169.239.92.0 - 169.239.95.255 ly +169.239.96.0 - 169.239.99.255 cf +169.239.100.0 - 169.239.103.255 ml +169.239.104.0 - 169.239.107.255 mz +169.239.108.0 - 169.239.111.255 ao +169.239.112.0 - 169.239.115.255 gq +169.239.116.0 - 169.239.119.255 ly +169.239.120.0 - 169.239.123.255 td +169.239.124.0 - 169.239.131.255 za +169.239.132.0 - 169.239.135.255 ao +169.239.136.0 - 169.239.139.255 sn +169.239.140.0 - 169.239.143.255 mu +169.239.144.0 - 169.239.147.255 mz +169.239.148.0 - 169.239.151.255 ga +169.239.152.0 - 169.239.155.255 sc +169.239.156.0 - 169.239.159.255 cd +169.239.160.0 - 169.239.163.255 ke +169.239.164.0 - 169.239.167.255 za +169.239.168.0 - 169.239.175.255 ke +169.239.176.0 - 169.239.187.255 za +169.239.188.0 - 169.239.195.255 ng +169.239.196.0 - 169.239.199.255 za +169.239.200.0 - 169.239.207.255 sc +169.239.208.0 - 169.239.211.255 za +169.239.212.0 - 169.239.215.255 cd +169.239.216.0 - 169.239.227.255 za +169.240.0.0 - 169.253.255.255 us +169.255.0.0 - 169.255.3.255 za +169.255.4.0 - 169.255.7.255 cm +169.255.8.0 - 169.255.11.255 ke +169.255.12.0 - 169.255.15.255 za +169.255.16.0 - 169.255.19.255 gh +169.255.20.0 - 169.255.23.255 za +169.255.24.0 - 169.255.27.255 ss +169.255.28.0 - 169.255.39.255 za +169.255.40.0 - 169.255.43.255 ng +169.255.44.0 - 169.255.47.255 za +169.255.48.0 - 169.255.51.255 tz +169.255.52.0 - 169.255.55.255 mw +169.255.56.0 - 169.255.63.255 za +169.255.64.0 - 169.255.67.255 cd +169.255.68.0 - 169.255.71.255 tn +169.255.72.0 - 169.255.75.255 cg +169.255.76.0 - 169.255.79.255 za +169.255.80.0 - 169.255.83.255 bw +169.255.84.0 - 169.255.87.255 eg +169.255.88.0 - 169.255.91.255 ao +169.255.92.0 - 169.255.95.255 tn +169.255.96.0 - 169.255.99.255 ke +169.255.100.0 - 169.255.103.255 ss +169.255.104.0 - 169.255.107.255 ke +169.255.108.0 - 169.255.111.255 ly +169.255.112.0 - 169.255.115.255 tz +169.255.116.0 - 169.255.119.255 za +169.255.120.0 - 169.255.123.255 cg +169.255.124.0 - 169.255.127.255 ng +169.255.128.0 - 169.255.131.255 za +169.255.132.0 - 169.255.135.255 mz +169.255.136.0 - 169.255.139.255 sd +169.255.140.0 - 169.255.143.255 ng +169.255.144.0 - 169.255.147.255 za +169.255.148.0 - 169.255.151.255 ga +169.255.152.0 - 169.255.155.255 td +169.255.156.0 - 169.255.159.255 ly +169.255.160.0 - 169.255.163.255 mu +169.255.164.0 - 169.255.175.255 za +169.255.176.0 - 169.255.179.255 ma +169.255.180.0 - 169.255.183.255 ng +169.255.184.0 - 169.255.187.255 tz +169.255.188.0 - 169.255.191.255 cd +169.255.192.0 - 169.255.199.255 za +169.255.200.0 - 169.255.203.255 ke +169.255.204.0 - 169.255.207.255 cd +169.255.208.0 - 169.255.211.255 ng +169.255.212.0 - 169.255.215.255 ke +169.255.216.0 - 169.255.223.255 za +169.255.224.0 - 169.255.227.255 ng +169.255.228.0 - 169.255.235.255 za +169.255.236.0 - 169.255.239.255 ng +169.255.240.0 - 169.255.255.255 za 170.0.0.0 - 170.17.255.255 us 170.18.0.0 - 170.18.255.255 cl 170.19.0.0 - 170.24.255.255 us 170.25.0.0 - 170.25.255.255 mx -170.26.0.0 - 170.37.255.255 us +170.26.0.0 - 170.32.255.255 us +170.33.0.0 - 170.33.255.255 my +170.34.0.0 - 170.37.203.255 us +170.37.204.0 - 170.37.204.255 nl +170.37.205.0 - 170.37.255.255 us 170.38.0.0 - 170.38.255.255 my 170.40.0.0 - 170.50.255.255 us -170.51.0.0 - 170.51.255.255 ar -170.52.0.0 - 170.59.255.255 us +170.51.0.0 - 170.51.60.255 py +170.51.61.0 - 170.51.63.255 ar +170.51.64.0 - 170.51.73.255 uy +170.51.74.0 - 170.51.74.255 ar +170.51.75.0 - 170.51.127.255 uy +170.51.128.0 - 170.51.255.255 ar +170.52.0.0 - 170.54.159.255 us +170.54.160.0 - 170.54.160.255 eu +170.54.161.0 - 170.59.255.255 us 170.60.0.0 - 170.60.255.255 ch -170.61.0.0 - 170.65.255.255 us +170.61.0.0 - 170.61.235.255 us +170.61.236.0 - 170.61.239.255 gb +170.61.240.0 - 170.65.203.255 us +170.65.204.0 - 170.65.204.255 br +170.65.205.0 - 170.65.205.255 us +170.65.206.0 - 170.65.206.255 br +170.65.207.0 - 170.65.217.255 us +170.65.218.0 - 170.65.218.255 ph +170.65.219.0 - 170.65.255.255 us 170.66.0.0 - 170.66.255.255 br 170.67.0.0 - 170.69.255.255 us 170.70.0.0 - 170.70.255.255 mx -170.71.0.0 - 170.79.255.255 us -170.84.0.0 - 170.94.255.255 us -170.95.0.0 - 170.95.255.255 sg -170.96.0.0 - 170.104.255.255 us +170.71.0.0 - 170.75.159.255 us +170.75.160.0 - 170.75.175.255 ca +170.75.176.0 - 170.77.255.255 us +170.85.0.0 - 170.86.14.255 us +170.86.15.0 - 170.86.15.255 eu +170.86.16.0 - 170.104.255.255 us 170.105.0.0 - 170.105.255.255 jp -170.106.0.0 - 170.154.255.255 us +170.106.0.0 - 170.136.114.255 us +170.136.115.0 - 170.136.115.255 gb +170.136.116.0 - 170.146.13.255 us +170.146.14.0 - 170.146.14.255 ca +170.146.15.0 - 170.146.149.255 us +170.146.150.0 - 170.146.150.255 ca +170.146.151.0 - 170.148.68.255 us +170.148.69.0 - 170.148.69.255 sg +170.148.70.0 - 170.148.95.255 us +170.148.96.0 - 170.148.96.255 ap +170.148.97.0 - 170.148.98.255 us +170.148.99.0 - 170.148.99.255 ap +170.148.100.0 - 170.148.143.255 us +170.148.144.0 - 170.148.144.255 au +170.148.145.0 - 170.148.197.255 us +170.148.198.0 - 170.148.198.255 gb +170.148.199.0 - 170.148.214.255 us +170.148.215.0 - 170.148.215.255 gb +170.148.216.0 - 170.149.255.255 us +170.151.0.0 - 170.154.255.255 us 170.155.0.0 - 170.155.255.255 ar 170.156.0.0 - 170.156.255.255 us 170.157.0.0 - 170.157.255.255 au -170.158.0.0 - 170.168.255.255 us +170.158.0.0 - 170.162.32.255 us +170.162.33.0 - 170.162.33.255 eu +170.162.34.0 - 170.167.195.159 us +170.167.195.160 - 170.167.195.191 ca +170.167.195.192 - 170.168.255.255 us 170.169.0.0 - 170.169.255.255 mx 170.170.0.0 - 170.174.255.255 us 170.175.0.0 - 170.175.255.255 ca 170.176.0.0 - 170.178.255.255 us -170.179.0.0 - 170.179.255.255 sg -170.180.0.0 - 170.205.63.255 us +170.179.0.0 - 170.179.255.255 cn +170.180.0.0 - 170.194.15.255 us +170.194.16.0 - 170.194.16.255 nl +170.194.17.0 - 170.194.31.255 us +170.194.32.0 - 170.194.32.255 gb +170.194.33.0 - 170.205.63.255 us 170.205.64.0 - 170.205.191.255 be 170.205.192.0 - 170.209.255.255 us 170.210.0.0 - 170.210.255.255 ar 170.211.0.0 - 170.235.255.255 us -170.236.0.0 - 170.236.179.255 ch -170.236.180.0 - 170.236.180.255 at -170.236.181.0 - 170.237.255.255 ch +170.236.0.0 - 170.237.255.255 ch 170.240.0.0 - 170.243.255.255 us -170.248.0.0 - 170.253.255.255 us +170.248.0.0 - 170.248.1.255 in +170.248.2.0 - 170.248.3.255 br +170.248.4.0 - 170.248.4.255 us +170.248.5.0 - 170.248.5.127 mx +170.248.5.128 - 170.248.5.255 in +170.248.6.0 - 170.248.7.255 mx +170.248.8.0 - 170.248.10.255 us +170.248.11.0 - 170.248.11.255 cl +170.248.12.0 - 170.248.13.255 in +170.248.14.0 - 170.248.15.255 us +170.248.16.0 - 170.248.17.255 ph +170.248.18.0 - 170.248.19.255 br +170.248.20.0 - 170.248.40.255 us +170.248.41.0 - 170.248.41.255 gb +170.248.42.0 - 170.248.43.255 in +170.248.44.0 - 170.248.45.255 us +170.248.46.0 - 170.248.47.255 in +170.248.48.0 - 170.248.77.255 us +170.248.78.0 - 170.248.78.255 br +170.248.79.0 - 170.248.79.255 us +170.248.80.0 - 170.248.81.255 br +170.248.82.0 - 170.248.83.255 us +170.248.84.0 - 170.248.85.255 br +170.248.86.0 - 170.248.86.255 ph +170.248.87.0 - 170.248.87.255 ar +170.248.88.0 - 170.248.119.255 us +170.248.120.0 - 170.248.121.255 br +170.248.122.0 - 170.248.123.255 ar +170.248.124.0 - 170.248.125.255 pl +170.248.126.0 - 170.248.136.255 us +170.248.137.0 - 170.248.137.255 mu +170.248.138.0 - 170.248.139.255 in +170.248.140.0 - 170.248.141.255 us +170.248.142.0 - 170.248.142.255 au +170.248.143.0 - 170.248.144.255 us +170.248.145.0 - 170.248.145.255 pl +170.248.146.0 - 170.248.147.255 jp +170.248.148.0 - 170.248.152.255 us +170.248.153.0 - 170.248.153.255 tr +170.248.154.0 - 170.248.154.255 ph +170.248.155.0 - 170.248.155.255 in +170.248.156.0 - 170.248.159.255 ph +170.248.160.0 - 170.248.171.255 in +170.248.172.0 - 170.248.189.255 us +170.248.190.0 - 170.248.191.255 in +170.248.192.0 - 170.248.207.255 us +170.248.208.0 - 170.248.209.255 ar +170.248.210.0 - 170.248.225.255 us +170.248.226.0 - 170.248.226.255 br +170.248.227.0 - 170.250.255.255 us +170.251.0.0 - 170.251.7.255 in +170.251.8.0 - 170.251.9.255 br +170.251.10.0 - 170.251.11.255 in +170.251.12.0 - 170.251.19.255 us +170.251.20.0 - 170.251.21.255 in +170.251.22.0 - 170.251.22.255 us +170.251.23.0 - 170.251.23.255 ro +170.251.24.0 - 170.251.35.255 us +170.251.36.0 - 170.251.36.255 gb +170.251.37.0 - 170.251.37.255 ph +170.251.38.0 - 170.251.39.255 gb +170.251.40.0 - 170.251.47.255 in +170.251.48.0 - 170.251.49.255 ph +170.251.50.0 - 170.251.59.255 us +170.251.60.0 - 170.251.62.255 in +170.251.63.0 - 170.251.63.63 de +170.251.63.64 - 170.251.63.127 in +170.251.63.128 - 170.251.63.255 us +170.251.64.0 - 170.251.67.255 nl +170.251.68.0 - 170.251.68.255 in +170.251.69.0 - 170.251.75.255 us +170.251.76.0 - 170.251.77.255 fr +170.251.78.0 - 170.251.79.255 es +170.251.80.0 - 170.251.83.255 de +170.251.84.0 - 170.251.85.255 ph +170.251.86.0 - 170.251.89.255 us +170.251.90.0 - 170.251.91.255 in +170.251.92.0 - 170.251.93.255 fr +170.251.94.0 - 170.251.95.255 au +170.251.96.0 - 170.251.97.255 fr +170.251.98.0 - 170.251.99.255 cr +170.251.100.0 - 170.251.101.255 es +170.251.102.0 - 170.251.102.255 us +170.251.103.0 - 170.251.104.127 es +170.251.104.128 - 170.251.104.191 in +170.251.104.192 - 170.251.104.255 es +170.251.105.0 - 170.251.105.255 ph +170.251.106.0 - 170.251.106.255 us +170.251.107.0 - 170.251.108.255 de +170.251.109.0 - 170.251.109.255 ph +170.251.110.0 - 170.251.111.255 in +170.251.112.0 - 170.251.112.255 ph +170.251.113.0 - 170.251.115.255 se +170.251.116.0 - 170.251.116.255 pl +170.251.117.0 - 170.251.127.255 es +170.251.128.0 - 170.251.131.255 au +170.251.132.0 - 170.251.136.255 us +170.251.137.0 - 170.251.137.255 au +170.251.138.0 - 170.251.138.255 us +170.251.139.0 - 170.251.139.255 in +170.251.140.0 - 170.251.141.255 us +170.251.142.0 - 170.251.143.255 in +170.251.144.0 - 170.251.145.255 us +170.251.146.0 - 170.251.147.255 ph +170.251.148.0 - 170.251.148.255 us +170.251.149.0 - 170.251.151.255 in +170.251.152.0 - 170.251.153.255 us +170.251.154.0 - 170.251.157.255 in +170.251.158.0 - 170.251.159.255 us +170.251.160.0 - 170.251.160.255 ph +170.251.161.0 - 170.251.161.255 au +170.251.162.0 - 170.251.163.255 us +170.251.164.0 - 170.251.164.127 ph +170.251.164.128 - 170.251.164.191 us +170.251.164.192 - 170.251.165.255 ph +170.251.166.0 - 170.251.167.255 us +170.251.168.0 - 170.251.169.255 ph +170.251.170.0 - 170.251.171.255 in +170.251.172.0 - 170.251.173.255 us +170.251.174.0 - 170.251.176.191 in +170.251.176.192 - 170.251.176.255 es +170.251.177.0 - 170.251.177.255 id +170.251.178.0 - 170.251.178.31 in +170.251.178.32 - 170.251.178.95 us +170.251.178.96 - 170.251.178.127 in +170.251.178.128 - 170.251.179.255 us +170.251.180.0 - 170.251.181.255 de +170.251.182.0 - 170.251.183.255 us +170.251.184.0 - 170.251.185.255 ph +170.251.186.0 - 170.251.187.255 in +170.251.188.0 - 170.251.191.255 es +170.251.192.0 - 170.252.31.255 us +170.252.32.0 - 170.252.36.255 de +170.252.37.0 - 170.252.37.127 us +170.252.37.128 - 170.252.39.255 de +170.252.40.0 - 170.252.63.255 us +170.252.64.0 - 170.252.71.255 gb +170.252.72.0 - 170.252.72.255 eu +170.252.73.0 - 170.252.79.255 gb +170.252.80.0 - 170.252.80.255 eu +170.252.81.0 - 170.252.87.255 de +170.252.88.0 - 170.252.101.255 gb +170.252.102.0 - 170.252.105.255 us +170.252.106.0 - 170.252.107.255 gb +170.252.108.0 - 170.252.109.255 us +170.252.110.0 - 170.252.113.255 gb +170.252.114.0 - 170.252.115.255 us +170.252.116.0 - 170.252.127.32 gb +170.252.127.33 - 170.252.127.33 se +170.252.127.34 - 170.252.127.255 gb +170.252.128.0 - 170.252.135.255 ph +170.252.136.0 - 170.252.143.255 au +170.252.144.0 - 170.252.160.0 ph +170.252.160.1 - 170.252.160.1 ap +170.252.160.2 - 170.252.184.255 ph +170.252.185.0 - 170.252.186.255 au +170.252.187.0 - 170.252.191.255 ph +170.252.192.0 - 170.253.255.255 us 170.255.0.0 - 170.255.255.255 be 171.0.0.0 - 171.1.255.255 sg 171.2.0.0 - 171.3.255.255 jp @@ -72233,15 +58251,11 @@ 171.8.0.0 - 171.15.255.255 cn 171.16.0.0 - 171.16.255.255 fr 171.17.0.0 - 171.17.255.255 de -171.18.0.0 - 171.18.16.255 fr -171.18.17.0 - 171.18.17.255 es -171.18.18.0 - 171.18.20.255 fr -171.18.21.0 - 171.18.21.31 es -171.18.21.32 - 171.18.23.255 fr -171.18.24.0 - 171.18.31.255 de -171.18.32.0 - 171.18.47.255 fr -171.18.48.0 - 171.18.49.255 sg -171.18.50.0 - 171.18.255.255 fr +171.18.0.0 - 171.18.23.255 fr +171.18.24.0 - 171.18.26.255 de +171.18.27.0 - 171.18.27.255 be +171.18.28.0 - 171.18.31.255 de +171.18.32.0 - 171.18.255.255 fr 171.19.0.0 - 171.19.255.255 hu 171.20.0.0 - 171.20.255.255 dk 171.21.0.0 - 171.21.255.255 nl @@ -72251,12 +58265,60 @@ 171.25.0.0 - 171.25.127.255 ch 171.25.128.0 - 171.25.159.255 se 171.25.160.0 - 171.25.163.255 no +171.25.164.0 - 171.25.167.255 ru +171.25.168.0 - 171.25.175.255 ua +171.25.176.0 - 171.25.176.255 cz +171.25.177.0 - 171.25.177.255 ru +171.25.178.0 - 171.25.178.255 de +171.25.179.0 - 171.25.179.255 nl +171.25.180.0 - 171.25.181.255 hu +171.25.182.0 - 171.25.183.255 pl +171.25.184.0 - 171.25.190.255 ru +171.25.191.0 - 171.25.191.255 it +171.25.192.0 - 171.25.192.255 pl +171.25.193.0 - 171.25.193.255 se +171.25.194.0 - 171.25.195.255 ru +171.25.196.0 - 171.25.199.255 pl +171.25.200.0 - 171.25.201.255 gb +171.25.202.0 - 171.25.203.255 ru +171.25.204.0 - 171.25.207.255 ua +171.25.208.0 - 171.25.211.255 fr +171.25.212.0 - 171.25.215.255 ru +171.25.216.0 - 171.25.216.255 pl +171.25.217.0 - 171.25.217.255 be +171.25.218.0 - 171.25.219.255 lv +171.25.220.0 - 171.25.222.255 cz +171.25.223.0 - 171.25.223.255 ro +171.25.224.0 - 171.25.224.255 kw +171.25.225.0 - 171.25.225.255 de +171.25.226.0 - 171.25.227.255 pl +171.25.228.0 - 171.25.228.255 dk +171.25.229.0 - 171.25.229.255 be +171.25.230.0 - 171.25.231.255 pl +171.25.232.0 - 171.25.235.255 ru +171.25.236.0 - 171.25.239.255 ua +171.25.240.0 - 171.25.240.255 cz +171.25.241.0 - 171.25.241.255 ua +171.25.242.0 - 171.25.255.255 ru 171.26.0.0 - 171.26.255.255 be 171.27.0.0 - 171.27.255.255 ch 171.28.0.0 - 171.30.255.255 gb 171.31.0.0 - 171.31.255.255 hu 171.32.0.0 - 171.32.255.255 se 171.33.0.0 - 171.33.63.255 ch +171.33.64.0 - 171.33.127.255 fr +171.33.128.0 - 171.33.135.255 nl +171.33.136.0 - 171.33.143.255 cz +171.33.144.0 - 171.33.146.63 gb +171.33.146.64 - 171.33.151.255 nl +171.33.152.0 - 171.33.159.255 fr +171.33.160.0 - 171.33.175.255 gb +171.33.176.0 - 171.33.191.255 de +171.33.192.0 - 171.33.223.255 gb +171.33.224.0 - 171.33.231.255 nl +171.33.232.0 - 171.33.239.255 es +171.33.240.0 - 171.33.247.255 bh +171.33.248.0 - 171.33.255.255 ru 171.34.0.0 - 171.47.255.255 cn 171.48.0.0 - 171.63.255.255 in 171.64.0.0 - 171.75.255.255 us @@ -72264,11 +58326,159 @@ 171.80.0.0 - 171.95.255.255 cn 171.96.0.0 - 171.103.255.255 th 171.104.0.0 - 171.127.255.255 cn -171.128.0.0 - 171.206.255.255 us +171.128.0.0 - 171.159.47.255 us +171.159.48.0 - 171.159.48.255 gb +171.159.49.0 - 171.161.47.255 us +171.161.48.0 - 171.161.49.255 ap +171.161.50.0 - 171.161.55.255 us +171.161.56.0 - 171.161.56.255 in +171.161.57.0 - 171.191.255.255 us +171.192.0.0 - 171.192.0.255 gb +171.192.1.0 - 171.206.255.255 us 171.207.0.0 - 171.207.255.255 sg 171.208.0.0 - 171.223.255.255 cn 171.224.0.0 - 171.255.255.255 vn -172.128.0.0 - 172.140.255.255 us +172.0.0.0 - 172.15.10.255 us +172.15.11.0 - 172.15.11.187 de +172.15.11.188 - 172.15.11.188 us +172.15.11.189 - 172.15.11.232 de +172.15.11.233 - 172.15.11.233 us +172.15.11.234 - 172.15.11.255 de +172.15.12.0 - 172.15.255.255 us +172.32.0.0 - 172.81.175.255 us +172.81.176.0 - 172.81.183.255 ca +172.81.184.0 - 172.82.4.255 us +172.82.5.0 - 172.82.5.255 es +172.82.6.0 - 172.82.14.255 us +172.82.15.0 - 172.82.15.255 fr +172.82.16.0 - 172.82.255.255 us +172.85.0.0 - 172.85.79.255 us +172.85.80.0 - 172.85.87.255 ca +172.85.88.0 - 172.85.119.255 us +172.85.120.0 - 172.85.123.255 pr +172.85.124.0 - 172.85.127.255 ca +172.85.128.0 - 172.86.183.255 us +172.86.184.0 - 172.86.223.255 ca +172.86.224.0 - 172.86.239.255 us +172.86.240.0 - 172.86.247.255 ca +172.86.248.0 - 172.87.79.255 us +172.87.80.0 - 172.87.95.255 ca +172.87.96.0 - 172.93.79.255 us +172.93.80.0 - 172.93.95.255 ca +172.93.96.0 - 172.93.123.255 us +172.93.124.0 - 172.93.127.255 ca +172.93.128.0 - 172.93.255.255 us +172.94.0.0 - 172.94.2.255 se +172.94.3.0 - 172.94.6.255 gb +172.94.7.0 - 172.94.8.255 se +172.94.9.0 - 172.94.9.255 gb +172.94.10.0 - 172.94.13.255 fr +172.94.14.0 - 172.94.18.255 de +172.94.19.0 - 172.94.20.255 ch +172.94.21.0 - 172.94.23.255 nl +172.94.24.0 - 172.94.24.255 sg +172.94.25.0 - 172.94.26.255 my +172.94.27.0 - 172.94.28.255 jp +172.94.29.0 - 172.94.30.255 bn +172.94.31.0 - 172.94.32.255 ph +172.94.33.0 - 172.94.34.255 th +172.94.35.0 - 172.94.35.255 sg +172.94.36.0 - 172.94.49.255 us +172.94.50.0 - 172.94.54.255 nl +172.94.55.0 - 172.94.56.255 se +172.94.57.0 - 172.94.57.255 lu +172.94.58.0 - 172.94.63.255 us +172.94.64.0 - 172.94.64.255 es +172.94.65.0 - 172.94.65.255 tr +172.94.66.0 - 172.94.66.255 ro +172.94.67.0 - 172.94.81.255 us +172.94.82.0 - 172.94.83.255 kr +172.94.84.0 - 172.94.85.255 au +172.94.86.0 - 172.94.87.255 jp +172.94.88.0 - 172.94.89.255 sg +172.94.90.0 - 172.94.115.255 us +172.94.116.0 - 172.94.116.255 ca +172.94.117.0 - 172.96.7.255 us +172.96.8.0 - 172.96.15.255 ca +172.96.16.0 - 172.96.39.255 us +172.96.40.0 - 172.96.47.255 ca +172.96.48.0 - 172.96.191.255 us +172.96.192.0 - 172.96.255.255 ca +172.97.0.0 - 172.97.7.255 us +172.97.8.0 - 172.97.15.255 ca +172.97.16.0 - 172.97.47.255 us +172.97.48.0 - 172.97.55.255 ca +172.97.56.0 - 172.97.59.255 us +172.97.60.0 - 172.97.63.255 ca +172.97.64.0 - 172.97.119.255 us +172.97.120.0 - 172.97.123.255 ca +172.97.124.0 - 172.97.127.255 us +172.97.128.0 - 172.97.255.255 ca +172.98.0.0 - 172.98.66.255 us +172.98.67.0 - 172.98.67.255 ca +172.98.68.0 - 172.98.143.255 us +172.98.144.0 - 172.98.160.255 ca +172.98.161.0 - 172.98.162.255 us +172.98.163.0 - 172.98.163.255 ca +172.98.164.0 - 172.98.168.255 us +172.98.169.0 - 172.98.169.255 nl +172.98.170.0 - 172.98.178.255 us +172.98.179.0 - 172.98.179.255 nl +172.98.180.0 - 172.98.181.255 us +172.98.182.0 - 172.98.183.255 ca +172.98.184.0 - 172.99.7.255 us +172.99.8.0 - 172.99.11.255 ca +172.99.12.0 - 172.99.19.255 us +172.99.20.0 - 172.99.31.255 ca +172.99.32.0 - 172.102.15.255 us +172.102.16.0 - 172.102.31.255 ca +172.102.32.0 - 172.102.213.255 us +172.102.214.0 - 172.102.214.255 ca +172.102.215.0 - 172.102.217.255 us +172.102.218.0 - 172.102.218.255 ca +172.102.219.0 - 172.102.223.255 us +172.102.224.0 - 172.102.227.255 vi +172.102.228.0 - 172.102.231.255 ca +172.102.232.0 - 172.103.47.255 us +172.103.48.0 - 172.103.63.255 ca +172.103.64.0 - 172.103.127.255 us +172.103.128.0 - 172.103.255.255 ca +172.104.0.0 - 172.110.63.255 us +172.110.64.0 - 172.110.79.255 ca +172.110.80.0 - 172.111.127.255 us +172.111.128.0 - 172.111.128.255 sc +172.111.129.0 - 172.111.129.255 pa +172.111.130.0 - 172.111.130.255 sa +172.111.131.0 - 172.111.131.255 pe +172.111.132.0 - 172.111.132.255 co +172.111.133.0 - 172.111.133.255 ve +172.111.134.0 - 172.111.134.255 us +172.111.135.0 - 172.111.135.255 ca +172.111.136.0 - 172.111.137.255 it +172.111.138.0 - 172.111.138.255 id +172.111.139.0 - 172.111.139.255 us +172.111.140.0 - 172.111.141.255 cn +172.111.142.0 - 172.111.143.255 hk +172.111.144.0 - 172.111.145.255 it +172.111.146.0 - 172.111.147.255 jp +172.111.148.0 - 172.111.149.255 ae +172.111.150.0 - 172.111.151.255 us +172.111.152.0 - 172.111.152.255 jo +172.111.153.0 - 172.111.154.255 gb +172.111.155.0 - 172.111.156.255 au +172.111.157.0 - 172.111.157.255 ca +172.111.158.0 - 172.111.159.255 us +172.111.160.0 - 172.111.160.255 ca +172.111.161.0 - 172.111.161.255 au +172.111.162.0 - 172.111.162.255 ca +172.111.163.0 - 172.111.164.255 au +172.111.165.0 - 172.111.167.255 gb +172.111.168.0 - 172.111.168.255 hk +172.111.169.0 - 172.111.169.255 mx +172.111.170.0 - 172.111.170.255 mt +172.111.171.0 - 172.121.255.255 us +172.122.0.0 - 172.123.255.255 ca +172.124.0.0 - 172.140.255.255 us 172.141.0.0 - 172.143.255.255 gb 172.144.0.0 - 172.146.204.255 us 172.146.205.0 - 172.146.205.255 ar @@ -72277,13 +58487,18 @@ 172.153.0.0 - 172.157.255.255 us 172.158.0.0 - 172.158.255.255 de 172.159.0.0 - 172.159.255.255 gb -172.160.0.0 - 172.172.255.255 us +172.160.0.0 - 172.162.13.187 us +172.162.13.188 - 172.162.13.188 de +172.162.13.189 - 172.164.0.224 us +172.164.0.225 - 172.164.0.225 ca +172.164.0.226 - 172.172.255.255 us 172.173.0.0 - 172.174.255.255 de 172.175.0.0 - 172.175.255.255 us 172.176.0.0 - 172.183.255.255 de 172.184.0.0 - 172.187.255.255 fr 172.188.0.0 - 172.189.255.255 gb -172.190.0.0 - 172.199.255.255 us +172.190.0.0 - 172.191.255.255 us +172.192.0.0 - 172.199.255.255 au 172.200.0.0 - 172.203.255.255 gb 172.204.0.0 - 172.204.255.255 fr 172.205.0.0 - 172.205.127.255 vn @@ -72293,115 +58508,70 @@ 172.209.0.0 - 172.209.255.255 gb 172.210.0.0 - 172.211.255.255 fr 172.212.0.0 - 172.216.255.255 gb +172.217.0.0 - 172.217.255.255 us +172.218.0.0 - 172.219.255.255 ca +172.220.0.0 - 172.245.11.167 us +172.245.11.168 - 172.245.11.175 ca +172.245.11.176 - 172.255.255.255 us 173.0.0.0 - 173.0.15.255 a1 -173.0.16.0 - 173.0.48.119 us -173.0.48.120 - 173.0.48.121 bd -173.0.48.122 - 173.0.49.24 us -173.0.49.25 - 173.0.49.26 lk -173.0.49.27 - 173.0.49.74 us -173.0.49.75 - 173.0.49.77 bd -173.0.49.78 - 173.0.51.44 us -173.0.51.45 - 173.0.51.46 au -173.0.51.47 - 173.0.52.215 us -173.0.52.216 - 173.0.52.217 au -173.0.52.218 - 173.0.53.24 us -173.0.53.25 - 173.0.53.26 au -173.0.53.27 - 173.0.53.82 us -173.0.53.83 - 173.0.53.85 al -173.0.53.86 - 173.0.53.101 us -173.0.53.102 - 173.0.53.103 au -173.0.53.104 - 173.0.56.21 us -173.0.56.22 - 173.0.56.24 bd -173.0.56.25 - 173.0.56.84 us -173.0.56.85 - 173.0.56.86 lk -173.0.56.87 - 173.0.56.109 us -173.0.56.110 - 173.0.56.110 lk -173.0.56.111 - 173.0.56.130 us -173.0.56.131 - 173.0.56.132 bd -173.0.56.133 - 173.0.57.68 us -173.0.57.69 - 173.0.57.71 in -173.0.57.72 - 173.0.57.147 us -173.0.57.148 - 173.0.57.149 bd -173.0.57.150 - 173.0.59.84 us -173.0.59.85 - 173.0.59.86 lk -173.0.59.87 - 173.0.59.177 us -173.0.59.178 - 173.0.59.178 bd -173.0.59.179 - 173.0.59.180 us -173.0.59.181 - 173.0.59.181 bd -173.0.59.182 - 173.0.61.39 us -173.0.61.40 - 173.0.61.48 ru -173.0.61.49 - 173.0.61.78 us -173.0.61.79 - 173.0.61.89 ru -173.0.61.90 - 173.0.65.255 us -173.0.66.0 - 173.0.66.63 cy -173.0.66.64 - 173.0.133.255 us -173.0.134.0 - 173.0.135.255 in -173.0.136.0 - 173.0.191.255 us +173.0.16.0 - 173.0.70.255 us +173.0.71.0 - 173.0.71.255 cw +173.0.72.0 - 173.0.191.255 us 173.0.192.0 - 173.0.223.255 ca 173.0.224.0 - 173.31.255.255 us 173.32.0.0 - 173.35.255.255 ca -173.36.0.0 - 173.44.34.95 us -173.44.34.96 - 173.44.34.127 ru -173.44.34.128 - 173.44.135.255 us -173.44.136.0 - 173.44.138.255 ca -173.44.139.0 - 173.44.141.255 us -173.44.142.0 - 173.44.143.255 ca -173.44.144.0 - 173.44.144.255 us -173.44.145.0 - 173.44.146.255 ca -173.44.147.0 - 173.44.150.255 us -173.44.151.0 - 173.44.151.255 ca -173.44.152.0 - 173.44.155.255 us -173.44.156.0 - 173.44.156.128 ca -173.44.156.129 - 173.44.167.255 us -173.44.168.0 - 173.44.169.255 ca -173.44.170.0 - 173.44.171.223 us -173.44.171.224 - 173.44.171.255 cr -173.44.172.0 - 173.44.179.255 us -173.44.180.0 - 173.44.180.255 ca -173.44.181.0 - 173.44.192.223 us -173.44.192.224 - 173.44.192.231 cr -173.44.192.232 - 173.44.192.255 us -173.44.193.0 - 173.44.193.31 cr -173.44.193.32 - 173.44.198.255 us -173.44.199.0 - 173.44.199.255 ca -173.44.200.0 - 173.44.203.255 us -173.44.204.0 - 173.44.206.255 ca -173.44.207.0 - 173.44.208.255 us -173.44.209.0 - 173.44.214.255 ca -173.44.215.0 - 173.44.222.255 us -173.44.223.0 - 173.44.223.255 ca -173.44.224.0 - 173.45.0.255 us -173.45.1.0 - 173.45.1.255 tw -173.45.2.0 - 173.45.31.255 us +173.36.0.0 - 173.38.207.255 us +173.38.208.0 - 173.38.208.168 gb +173.38.208.169 - 173.38.208.169 us +173.38.208.170 - 173.38.209.8 gb +173.38.209.9 - 173.38.209.9 nl +173.38.209.10 - 173.38.209.255 gb +173.38.210.0 - 173.38.219.255 us +173.38.220.0 - 173.38.220.31 gb +173.38.220.32 - 173.38.220.39 eu +173.38.220.40 - 173.38.220.255 gb +173.38.221.0 - 173.39.119.255 us +173.39.120.0 - 173.39.121.255 sg +173.39.122.0 - 173.44.12.255 us +173.44.13.0 - 173.44.13.255 au +173.44.14.0 - 173.44.18.255 us +173.44.19.0 - 173.44.19.255 jp +173.44.20.0 - 173.44.23.255 us +173.44.24.0 - 173.44.24.255 ph +173.44.25.0 - 173.44.26.255 us +173.44.27.0 - 173.44.27.255 nz +173.44.28.0 - 173.44.177.255 us +173.44.178.0 - 173.44.179.255 ca +173.44.180.0 - 173.44.233.255 us +173.44.234.0 - 173.44.234.255 ca +173.44.235.0 - 173.44.248.239 us +173.44.248.240 - 173.44.248.247 cn +173.44.248.248 - 173.45.31.255 us 173.45.32.0 - 173.45.32.255 gb -173.45.33.0 - 173.45.83.231 us -173.45.83.232 - 173.45.83.239 ae -173.45.83.240 - 173.45.99.143 us -173.45.99.144 - 173.45.99.151 ae -173.45.99.152 - 173.45.152.255 us +173.45.33.0 - 173.45.152.255 us 173.45.153.0 - 173.45.153.255 de -173.45.154.0 - 173.45.165.255 us -173.45.166.0 - 173.45.169.255 ca -173.45.170.0 - 173.45.171.63 us -173.45.171.64 - 173.45.171.127 cy -173.45.171.128 - 173.45.171.255 us -173.45.172.0 - 173.45.172.127 pa -173.45.172.128 - 173.45.255.255 us +173.45.154.0 - 173.45.255.255 us 173.46.0.0 - 173.46.31.255 ca 173.46.32.0 - 173.175.255.255 us 173.176.0.0 - 173.183.255.255 ca -173.184.0.0 - 173.195.47.255 us +173.184.0.0 - 173.192.251.255 us +173.192.252.0 - 173.192.252.255 nl +173.192.253.0 - 173.192.253.255 us +173.192.254.0 - 173.192.254.255 sg +173.192.255.0 - 173.194.90.255 us +173.194.91.0 - 173.194.91.255 cl +173.194.92.0 - 173.194.92.255 nl +173.194.93.0 - 173.194.95.255 us +173.194.96.0 - 173.194.96.255 ie +173.194.97.0 - 173.194.97.255 us +173.194.98.0 - 173.194.98.255 fi +173.194.99.0 - 173.195.47.255 us 173.195.48.0 - 173.195.63.255 ca -173.195.64.0 - 173.195.143.255 us -173.195.144.0 - 173.195.144.63 pl -173.195.144.64 - 173.195.144.255 us -173.195.145.0 - 173.195.145.63 pl -173.195.145.64 - 173.195.145.255 us -173.195.146.0 - 173.195.146.63 pl -173.195.146.64 - 173.199.63.255 us +173.195.64.0 - 173.199.63.255 us 173.199.64.0 - 173.199.64.255 nl 173.199.65.0 - 173.199.65.255 ca -173.199.66.0 - 173.199.67.255 us +173.199.66.0 - 173.199.66.255 us +173.199.67.0 - 173.199.67.255 ru 173.199.68.0 - 173.199.71.255 dk 173.199.72.0 - 173.199.79.255 gb 173.199.80.0 - 173.199.81.255 au @@ -72409,322 +58579,31 @@ 173.199.83.0 - 173.199.83.255 pl 173.199.84.0 - 173.199.104.255 us 173.199.105.0 - 173.199.105.255 de -173.199.106.0 - 173.199.107.255 us -173.199.108.0 - 173.199.112.7 nl -173.199.112.8 - 173.203.12.31 us -173.203.12.32 - 173.203.12.39 in -173.203.12.40 - 173.203.12.119 us -173.203.12.120 - 173.203.12.127 za -173.203.12.128 - 173.203.12.183 us -173.203.12.184 - 173.203.12.191 mx -173.203.12.192 - 173.203.12.223 us -173.203.12.224 - 173.203.12.231 ca -173.203.12.232 - 173.203.13.167 us -173.203.13.168 - 173.203.13.175 au -173.203.13.176 - 173.203.15.63 us -173.203.15.64 - 173.203.15.79 br -173.203.15.80 - 173.203.16.175 us -173.203.16.176 - 173.203.16.191 gb -173.203.16.192 - 173.203.17.31 us -173.203.17.32 - 173.203.17.63 gb -173.203.17.64 - 173.203.17.95 us -173.203.17.96 - 173.203.17.127 ca -173.203.17.128 - 173.203.18.55 us -173.203.18.56 - 173.203.18.63 de -173.203.18.64 - 173.203.19.15 us -173.203.19.16 - 173.203.19.23 gb -173.203.19.24 - 173.203.20.111 us -173.203.20.112 - 173.203.20.119 gb -173.203.20.120 - 173.203.21.111 us -173.203.21.112 - 173.203.21.127 nz -173.203.21.128 - 173.203.21.143 gb -173.203.21.144 - 173.203.21.191 us -173.203.21.192 - 173.203.21.223 gb -173.203.21.224 - 173.203.22.23 us -173.203.22.24 - 173.203.22.31 ca -173.203.22.32 - 173.203.22.87 us -173.203.22.88 - 173.203.22.95 kw -173.203.22.96 - 173.203.23.127 us -173.203.23.128 - 173.203.23.135 gb -173.203.23.136 - 173.203.23.239 us -173.203.23.240 - 173.203.23.247 mx -173.203.23.248 - 173.203.24.39 us -173.203.24.40 - 173.203.24.47 gb -173.203.24.48 - 173.203.24.55 us -173.203.24.56 - 173.203.24.63 gb -173.203.24.64 - 173.203.24.111 us -173.203.24.112 - 173.203.24.119 ie -173.203.24.120 - 173.203.25.127 us -173.203.25.128 - 173.203.25.191 gb -173.203.25.192 - 173.203.26.71 us -173.203.26.72 - 173.203.26.79 gr -173.203.26.80 - 173.203.27.7 us -173.203.27.8 - 173.203.27.15 bb -173.203.27.16 - 173.203.27.23 us -173.203.27.24 - 173.203.27.31 bb -173.203.27.32 - 173.203.27.151 us -173.203.27.152 - 173.203.27.159 ca -173.203.27.160 - 173.203.27.207 us -173.203.27.208 - 173.203.27.215 br -173.203.27.216 - 173.203.31.55 us -173.203.31.56 - 173.203.31.63 br -173.203.31.64 - 173.203.31.143 us -173.203.31.144 - 173.203.31.151 ca -173.203.31.152 - 173.203.31.167 je -173.203.31.168 - 173.203.31.199 us -173.203.31.200 - 173.203.31.207 mx -173.203.31.208 - 173.203.34.223 us -173.203.34.224 - 173.203.34.255 ca -173.203.35.0 - 173.203.40.255 us -173.203.41.0 - 173.203.41.7 in -173.203.41.8 - 173.203.41.39 us -173.203.41.40 - 173.203.41.47 gb -173.203.41.48 - 173.203.41.79 us -173.203.41.80 - 173.203.41.87 de -173.203.41.88 - 173.203.42.87 us -173.203.42.88 - 173.203.42.95 sg -173.203.42.96 - 173.203.42.111 in -173.203.42.112 - 173.203.42.247 us -173.203.42.248 - 173.203.42.255 kw -173.203.43.0 - 173.203.45.95 us -173.203.45.96 - 173.203.45.111 ca -173.203.45.112 - 173.203.45.143 je -173.203.45.144 - 173.203.128.15 us -173.203.128.16 - 173.203.128.31 mx -173.203.128.32 - 173.203.128.63 us -173.203.128.64 - 173.203.128.79 br -173.203.128.80 - 173.203.129.63 us -173.203.129.64 - 173.203.129.79 nz -173.203.129.80 - 173.203.129.143 us -173.203.129.144 - 173.203.129.159 nz -173.203.129.160 - 173.203.130.79 us -173.203.130.80 - 173.203.130.95 ca -173.203.130.96 - 173.203.131.15 us -173.203.131.16 - 173.203.131.31 ca -173.203.131.32 - 173.203.131.255 us -173.203.132.0 - 173.203.132.7 gb -173.203.132.8 - 173.203.132.15 us -173.203.132.16 - 173.203.132.23 ae -173.203.132.24 - 173.203.132.71 us -173.203.132.72 - 173.203.132.79 mx -173.203.132.80 - 173.203.132.87 us -173.203.132.88 - 173.203.132.95 mx -173.203.132.96 - 173.203.132.167 us -173.203.132.168 - 173.203.132.175 ca -173.203.132.176 - 173.203.132.183 us -173.203.132.184 - 173.203.132.191 ar -173.203.132.192 - 173.203.132.231 us -173.203.132.232 - 173.203.132.239 il -173.203.132.240 - 173.203.133.79 us -173.203.133.80 - 173.203.133.87 mx -173.203.133.88 - 173.203.133.127 us -173.203.133.128 - 173.203.133.135 ca -173.203.133.136 - 173.203.133.175 us -173.203.133.176 - 173.203.133.183 pe -173.203.133.184 - 173.203.133.207 us -173.203.133.208 - 173.203.133.215 au -173.203.133.216 - 173.203.134.15 us -173.203.134.16 - 173.203.134.23 il -173.203.134.24 - 173.203.134.151 us -173.203.134.152 - 173.203.134.159 br -173.203.134.160 - 173.203.134.167 us -173.203.134.168 - 173.203.134.175 au -173.203.134.176 - 173.203.134.231 us -173.203.134.232 - 173.203.134.239 gb -173.203.134.240 - 173.203.135.79 us -173.203.135.80 - 173.203.135.87 ca -173.203.135.88 - 173.203.135.183 us -173.203.135.184 - 173.203.135.191 br -173.203.135.192 - 173.203.135.231 us -173.203.135.232 - 173.203.135.239 br -173.203.135.240 - 173.203.136.159 us -173.203.136.160 - 173.203.136.167 mx -173.203.136.168 - 173.203.137.199 us -173.203.137.200 - 173.203.137.207 ca -173.203.137.208 - 173.203.137.215 mx -173.203.137.216 - 173.203.138.39 us -173.203.138.40 - 173.203.138.47 ca -173.203.138.48 - 173.203.138.55 in -173.203.138.56 - 173.203.138.223 us -173.203.138.224 - 173.203.138.231 il -173.203.138.232 - 173.203.139.7 us -173.203.139.8 - 173.203.139.15 mx -173.203.139.16 - 173.203.139.111 us -173.203.139.112 - 173.203.139.119 in -173.203.139.120 - 173.203.139.135 us -173.203.139.136 - 173.203.139.143 mx -173.203.139.144 - 173.203.140.63 us -173.203.140.64 - 173.203.140.95 in -173.203.140.96 - 173.203.142.159 us -173.203.142.160 - 173.203.142.191 br -173.203.142.192 - 173.203.143.159 us -173.203.143.160 - 173.203.143.191 ph -173.203.143.192 - 173.203.143.223 us -173.203.143.224 - 173.203.143.255 ca -173.203.144.0 - 173.203.144.7 us -173.203.144.8 - 173.203.144.15 es -173.203.144.16 - 173.203.144.127 us -173.203.144.128 - 173.203.144.135 gb -173.203.144.136 - 173.203.144.143 us -173.203.144.144 - 173.203.144.151 gb -173.203.144.152 - 173.203.144.159 je -173.203.144.160 - 173.203.144.175 us -173.203.144.176 - 173.203.144.183 mx -173.203.144.184 - 173.203.145.31 us -173.203.145.32 - 173.203.145.39 th -173.203.145.40 - 173.203.145.135 us -173.203.145.136 - 173.203.145.143 th -173.203.145.144 - 173.203.145.239 us -173.203.145.240 - 173.203.145.247 jp -173.203.145.248 - 173.203.146.39 us -173.203.146.40 - 173.203.146.47 in -173.203.146.48 - 173.203.146.223 us -173.203.146.224 - 173.203.146.239 pr -173.203.146.240 - 173.203.146.255 ca -173.203.147.0 - 173.203.147.95 us -173.203.147.96 - 173.203.147.103 ca -173.203.147.104 - 173.203.147.127 us -173.203.147.128 - 173.203.147.135 ar -173.203.147.136 - 173.203.147.247 us -173.203.147.248 - 173.203.147.255 nz -173.203.148.0 - 173.203.148.167 us -173.203.148.168 - 173.203.148.175 au -173.203.148.176 - 173.203.148.207 us -173.203.148.208 - 173.203.148.215 au -173.203.148.216 - 173.203.149.95 us -173.203.149.96 - 173.203.149.103 gb -173.203.149.104 - 173.203.149.199 us -173.203.149.200 - 173.203.149.207 ph -173.203.149.208 - 173.203.149.223 us -173.203.149.224 - 173.203.149.231 in -173.203.149.232 - 173.203.150.55 us -173.203.150.56 - 173.203.150.63 th -173.203.150.64 - 173.203.150.87 us -173.203.150.88 - 173.203.150.103 bg -173.203.150.104 - 173.203.150.135 us -173.203.150.136 - 173.203.150.143 ca -173.203.150.144 - 173.203.150.159 us -173.203.150.160 - 173.203.150.167 ca -173.203.150.168 - 173.203.150.175 us -173.203.150.176 - 173.203.150.183 cl -173.203.150.184 - 173.203.151.71 us -173.203.151.72 - 173.203.151.79 il -173.203.151.80 - 173.203.151.119 us -173.203.151.120 - 173.203.151.127 gb -173.203.151.128 - 173.203.151.247 us -173.203.151.248 - 173.203.151.255 il -173.203.152.0 - 173.203.154.79 us -173.203.154.80 - 173.203.154.87 mx -173.203.154.88 - 173.203.155.15 us -173.203.155.16 - 173.203.155.23 br -173.203.155.24 - 173.203.155.135 us -173.203.155.136 - 173.203.155.143 il -173.203.155.144 - 173.203.156.207 us -173.203.156.208 - 173.203.156.215 aw -173.203.156.216 - 173.203.156.239 us -173.203.156.240 - 173.203.156.247 aw -173.203.156.248 - 173.203.157.7 us -173.203.157.8 - 173.203.157.15 ca -173.203.157.16 - 173.203.157.47 us -173.203.157.48 - 173.203.157.55 ca -173.203.157.56 - 173.203.157.183 us -173.203.157.184 - 173.203.157.191 au -173.203.157.192 - 173.203.158.87 us -173.203.158.88 - 173.203.158.95 za -173.203.158.96 - 173.203.159.15 us -173.203.159.16 - 173.203.159.23 ph -173.203.159.24 - 173.203.159.119 us -173.203.159.120 - 173.203.159.127 ru -173.203.159.128 - 173.203.160.55 us -173.203.160.56 - 173.203.160.63 ca -173.203.160.64 - 173.203.160.71 gb -173.203.160.72 - 173.203.160.103 us -173.203.160.104 - 173.203.160.111 br -173.203.160.112 - 173.203.160.159 us -173.203.160.160 - 173.203.160.175 ca -173.203.160.176 - 173.203.160.191 id -173.203.160.192 - 173.203.162.135 us -173.203.162.136 - 173.203.162.143 cn -173.203.162.144 - 173.203.162.167 us -173.203.162.168 - 173.203.162.175 pe -173.203.162.176 - 173.203.164.215 us -173.203.164.216 - 173.203.164.223 br -173.203.164.224 - 173.203.165.103 us -173.203.165.104 - 173.203.165.111 cn -173.203.165.112 - 173.203.165.175 us -173.203.165.176 - 173.203.165.183 ca -173.203.165.184 - 173.203.166.7 us -173.203.166.8 - 173.203.166.15 ca -173.203.166.16 - 173.203.166.87 us -173.203.166.88 - 173.203.166.95 nz -173.203.166.96 - 173.203.166.119 us -173.203.166.120 - 173.203.166.127 gb -173.203.166.128 - 173.203.166.135 us -173.203.166.136 - 173.203.166.143 nz -173.203.166.144 - 173.203.166.175 us -173.203.166.176 - 173.203.166.183 co -173.203.166.184 - 173.203.167.127 us -173.203.167.128 - 173.203.167.135 gb -173.203.167.136 - 173.203.168.191 us -173.203.168.192 - 173.203.168.207 ph -173.203.168.208 - 173.203.168.255 us -173.203.169.0 - 173.203.169.15 br -173.203.169.16 - 173.203.174.15 us -173.203.174.16 - 173.203.174.31 it -173.203.174.32 - 173.203.174.103 us -173.203.174.104 - 173.203.174.111 in -173.203.174.112 - 173.203.174.143 us -173.203.174.144 - 173.203.174.151 in -173.203.174.152 - 173.203.174.175 us -173.203.174.176 - 173.203.174.183 ca -173.203.174.184 - 173.203.174.247 us -173.203.174.248 - 173.203.174.255 ca -173.203.175.0 - 173.203.176.39 us -173.203.176.40 - 173.203.176.47 gb -173.203.176.48 - 173.203.176.55 us -173.203.176.56 - 173.203.176.63 za -173.203.176.64 - 173.203.176.207 us -173.203.176.208 - 173.203.176.215 ca -173.203.176.216 - 173.203.176.223 us -173.203.176.224 - 173.203.176.231 pt -173.203.176.232 - 173.203.177.31 us -173.203.177.32 - 173.203.177.39 ca -173.203.177.40 - 173.203.177.71 us -173.203.177.72 - 173.203.177.79 ca -173.203.177.80 - 173.203.177.119 us -173.203.177.120 - 173.203.177.127 il -173.203.177.128 - 173.203.178.207 us -173.203.178.208 - 173.203.178.215 ca -173.203.178.216 - 173.203.179.95 us -173.203.179.96 - 173.203.179.103 ca -173.203.179.104 - 173.203.179.183 us -173.203.179.184 - 173.203.179.191 ca -173.203.179.192 - 173.203.179.247 us -173.203.179.248 - 173.203.179.255 de -173.203.180.0 - 173.203.188.167 us -173.203.188.168 - 173.203.188.175 gb -173.203.188.176 - 173.203.189.87 us -173.203.189.88 - 173.203.189.103 ca -173.203.189.104 - 173.203.191.63 us -173.203.191.64 - 173.203.191.127 in -173.203.191.128 - 173.203.232.223 us -173.203.232.224 - 173.203.232.255 il -173.203.233.0 - 173.205.255.255 us +173.199.106.0 - 173.199.106.255 us +173.199.107.0 - 173.199.107.255 de +173.199.108.0 - 173.199.112.11 nl +173.199.112.12 - 173.199.112.31 us +173.199.112.32 - 173.199.112.47 nl +173.199.112.48 - 173.199.112.63 us +173.199.112.64 - 173.199.112.87 nl +173.199.112.88 - 173.199.112.159 us +173.199.112.160 - 173.199.112.175 nl +173.199.112.176 - 173.199.112.223 us +173.199.112.224 - 173.199.112.239 nl +173.199.112.240 - 173.203.128.69 us +173.203.128.70 - 173.203.128.70 mx +173.203.128.71 - 173.205.5.47 us +173.205.5.48 - 173.205.5.63 ca +173.205.5.64 - 173.205.255.255 us 173.206.0.0 - 173.206.255.255 ca -173.207.0.0 - 173.208.45.159 us -173.208.45.160 - 173.208.45.167 ca -173.208.45.168 - 173.208.45.239 us -173.208.45.240 - 173.208.45.247 ca -173.208.45.248 - 173.208.57.255 us -173.208.58.0 - 173.208.58.15 za -173.208.58.16 - 173.208.110.207 us -173.208.110.208 - 173.208.110.215 lk -173.208.110.216 - 173.208.120.247 us -173.208.120.248 - 173.208.120.255 ca -173.208.121.0 - 173.208.121.255 us -173.208.122.0 - 173.208.122.255 gb -173.208.123.0 - 173.209.31.255 us -173.209.32.0 - 173.209.63.255 ca +173.207.0.0 - 173.209.31.255 us +173.209.32.0 - 173.209.46.207 ca +173.209.46.208 - 173.209.46.215 us +173.209.46.216 - 173.209.49.223 ca +173.209.49.224 - 173.209.49.231 us +173.209.49.232 - 173.209.53.55 ca +173.209.53.56 - 173.209.53.63 us +173.209.53.64 - 173.209.63.255 ca 173.209.64.0 - 173.209.111.255 us 173.209.112.0 - 173.209.159.255 ca 173.209.160.0 - 173.210.127.255 us @@ -72733,280 +58612,120 @@ 173.211.128.0 - 173.211.191.255 pr 173.211.192.0 - 173.212.63.255 us 173.212.64.0 - 173.212.191.255 ca -173.212.192.0 - 173.213.63.255 us -173.213.64.0 - 173.213.64.255 ca -173.213.65.0 - 173.213.66.127 us -173.213.66.128 - 173.213.66.159 ca -173.213.66.160 - 173.213.66.191 us -173.213.66.192 - 173.213.66.223 ca -173.213.66.224 - 173.213.74.7 us -173.213.74.8 - 173.213.74.15 ca -173.213.74.16 - 173.213.74.63 us -173.213.74.64 - 173.213.74.127 ca -173.213.74.128 - 173.213.76.47 us -173.213.76.48 - 173.213.76.55 de -173.213.76.56 - 173.213.76.63 cn -173.213.76.64 - 173.213.76.71 gb -173.213.76.72 - 173.213.76.207 us -173.213.76.208 - 173.213.76.215 gb -173.213.76.216 - 173.213.76.223 th -173.213.76.224 - 173.213.76.239 us -173.213.76.240 - 173.213.76.247 sg -173.213.76.248 - 173.213.88.79 us -173.213.88.80 - 173.213.88.95 ca -173.213.88.96 - 173.213.88.111 us -173.213.88.112 - 173.213.88.127 ca -173.213.88.128 - 173.213.88.223 us -173.213.88.224 - 173.213.88.231 ca -173.213.88.232 - 173.213.92.31 us -173.213.92.32 - 173.213.92.63 ca -173.213.92.64 - 173.213.92.111 us -173.213.92.112 - 173.213.92.119 my -173.213.92.120 - 173.213.92.255 us -173.213.93.0 - 173.213.95.255 ca -173.213.96.0 - 173.213.97.255 us -173.213.98.0 - 173.213.98.255 ca -173.213.99.0 - 173.213.101.222 us -173.213.101.223 - 173.213.101.255 ca -173.213.102.0 - 173.213.123.255 us -173.213.124.0 - 173.213.127.255 ca -173.213.128.0 - 173.213.239.255 us -173.213.240.0 - 173.213.255.255 a1 -173.214.0.0 - 173.214.127.255 us +173.212.192.0 - 173.212.229.255 us +173.212.230.0 - 173.212.230.255 gb +173.212.231.0 - 173.214.127.255 us 173.214.128.0 - 173.214.143.255 ca -173.214.144.0 - 173.214.185.50 us -173.214.185.51 - 173.214.185.120 au -173.214.185.121 - 173.215.127.255 us +173.214.144.0 - 173.215.127.255 us 173.215.128.0 - 173.215.255.255 pr -173.216.0.0 - 173.224.114.63 us -173.224.114.64 - 173.224.114.127 br -173.224.114.128 - 173.224.114.223 us -173.224.114.224 - 173.224.114.255 tr -173.224.115.0 - 173.224.115.31 us -173.224.115.32 - 173.224.115.63 tr -173.224.115.64 - 173.224.115.95 us -173.224.115.96 - 173.224.115.127 gb -173.224.115.128 - 173.224.115.159 ua -173.224.115.160 - 173.224.115.223 us -173.224.115.224 - 173.224.115.255 nz -173.224.116.0 - 173.224.116.95 us -173.224.116.96 - 173.224.116.127 br -173.224.116.128 - 173.224.116.191 us -173.224.116.192 - 173.224.116.223 ar -173.224.116.224 - 173.224.116.255 de -173.224.117.0 - 173.224.117.31 br -173.224.117.32 - 173.224.117.63 us -173.224.117.64 - 173.224.117.95 br -173.224.117.96 - 173.224.117.223 us -173.224.117.224 - 173.224.117.255 br -173.224.118.0 - 173.224.123.95 us -173.224.123.96 - 173.224.123.127 ua -173.224.123.128 - 173.224.123.159 br -173.224.123.160 - 173.224.123.191 us -173.224.123.192 - 173.224.123.223 ru -173.224.123.224 - 173.224.124.63 us -173.224.124.64 - 173.224.124.95 ru -173.224.124.96 - 173.224.124.127 br -173.224.124.128 - 173.224.213.65 us -173.224.213.66 - 173.224.213.127 sg -173.224.213.128 - 173.224.217.161 us -173.224.217.162 - 173.224.217.174 sg -173.224.217.175 - 173.224.217.217 us -173.224.217.218 - 173.224.217.222 sg -173.224.217.223 - 173.224.223.255 us -173.224.224.0 - 173.224.225.127 ca -173.224.225.128 - 173.224.225.255 a2 -173.224.226.0 - 173.224.226.127 ca -173.224.226.128 - 173.224.239.255 a2 +173.216.0.0 - 173.222.95.255 us +173.222.96.0 - 173.222.99.255 nl +173.222.100.0 - 173.222.107.255 us +173.222.108.0 - 173.222.109.255 nl +173.222.110.0 - 173.222.127.255 us +173.222.128.0 - 173.222.132.255 nl +173.222.133.0 - 173.222.161.255 us +173.222.162.0 - 173.222.163.255 nl +173.222.164.0 - 173.222.199.255 us +173.222.200.0 - 173.222.203.255 nl +173.222.204.0 - 173.222.207.255 us +173.222.208.0 - 173.222.211.255 nl +173.222.212.0 - 173.223.9.255 us +173.223.10.0 - 173.223.11.255 nl +173.223.12.0 - 173.223.21.255 us +173.223.22.0 - 173.223.23.255 nl +173.223.24.0 - 173.223.27.255 us +173.223.28.0 - 173.223.31.255 nl +173.223.32.0 - 173.223.105.255 us +173.223.106.0 - 173.223.107.255 nl +173.223.108.0 - 173.223.127.255 us +173.223.128.0 - 173.223.129.255 nl +173.223.130.0 - 173.223.130.255 us +173.223.131.0 - 173.223.131.255 nl +173.223.132.0 - 173.223.155.255 us +173.223.156.0 - 173.223.159.255 nl +173.223.160.0 - 173.223.175.255 us +173.223.176.0 - 173.223.191.255 nl +173.223.192.0 - 173.224.115.33 us +173.224.115.34 - 173.224.115.34 bz +173.224.115.35 - 173.224.126.134 us +173.224.126.135 - 173.224.126.135 ua +173.224.126.136 - 173.224.126.166 us +173.224.126.167 - 173.224.126.168 ua +173.224.126.169 - 173.224.127.142 us +173.224.127.143 - 173.224.127.143 ua +173.224.127.144 - 173.224.127.255 us +173.224.128.0 - 173.224.143.255 ca +173.224.144.0 - 173.224.223.255 us +173.224.224.0 - 173.224.239.255 a2 173.224.240.0 - 173.224.255.255 ca -173.225.0.0 - 173.225.24.223 us -173.225.24.224 - 173.225.24.255 ca -173.225.25.0 - 173.225.25.63 us -173.225.25.64 - 173.225.25.95 hk -173.225.25.96 - 173.225.207.255 us +173.225.0.0 - 173.225.207.255 us 173.225.208.0 - 173.225.223.255 ky 173.225.224.0 - 173.225.239.255 us -173.225.240.0 - 173.225.250.255 jm +173.225.240.0 - 173.225.248.255 jm +173.225.249.0 - 173.225.249.63 ag +173.225.249.64 - 173.225.249.127 vg +173.225.249.128 - 173.225.249.255 ag +173.225.250.0 - 173.225.250.255 jm 173.225.251.0 - 173.225.251.255 bb -173.225.252.0 - 173.225.255.255 jm +173.225.252.0 - 173.225.254.121 jm +173.225.254.122 - 173.225.254.122 tc +173.225.254.123 - 173.225.255.255 jm 173.226.0.0 - 173.228.191.255 us 173.228.192.0 - 173.228.255.255 pr 173.229.0.0 - 173.230.159.255 us 173.230.160.0 - 173.230.191.255 ca -173.230.192.0 - 173.231.0.255 us +173.230.192.0 - 173.230.240.207 us +173.230.240.208 - 173.230.240.215 co +173.230.240.216 - 173.231.0.255 us 173.231.1.0 - 173.231.1.255 gb 173.231.2.0 - 173.231.95.255 us 173.231.96.0 - 173.231.127.255 ca -173.231.128.0 - 173.231.192.255 us -173.231.193.0 - 173.231.195.127 cn -173.231.195.128 - 173.231.195.255 us -173.231.196.0 - 173.231.200.127 cn -173.231.200.128 - 173.231.200.255 us -173.231.201.0 - 173.231.203.127 cn -173.231.203.128 - 173.231.203.255 us -173.231.204.0 - 173.231.204.127 ru -173.231.204.128 - 173.231.204.255 cn -173.231.205.0 - 173.231.205.127 gb -173.231.205.128 - 173.231.205.255 az -173.231.206.0 - 173.231.206.127 cn -173.231.206.128 - 173.231.206.255 us -173.231.207.0 - 173.231.207.127 cn -173.231.207.128 - 173.231.207.255 pa -173.231.208.0 - 173.231.208.127 cn -173.231.208.128 - 173.231.210.127 us -173.231.210.128 - 173.231.211.255 cn -173.231.212.0 - 173.231.212.255 us -173.231.213.0 - 173.231.213.127 cr -173.231.213.128 - 173.231.214.127 cn -173.231.214.128 - 173.231.214.255 in +173.231.128.0 - 173.231.193.255 us +173.231.194.0 - 173.231.194.255 cn +173.231.195.0 - 173.231.195.255 us +173.231.196.0 - 173.231.199.255 cn +173.231.200.0 - 173.231.200.255 us +173.231.201.0 - 173.231.201.255 cn +173.231.202.0 - 173.231.214.255 us 173.231.215.0 - 173.231.215.255 au -173.231.216.0 - 173.231.216.255 cn -173.231.217.0 - 173.231.217.127 nz -173.231.217.128 - 173.231.218.255 us -173.231.219.0 - 173.231.219.127 cn -173.231.219.128 - 173.231.219.255 pa +173.231.216.0 - 173.231.219.255 us 173.231.220.0 - 173.231.221.255 gb -173.231.222.0 - 173.231.222.127 fi -173.231.222.128 - 173.231.222.255 my +173.231.222.0 - 173.231.222.255 us 173.231.223.0 - 173.231.223.255 cn -173.231.224.0 - 173.231.224.127 th -173.231.224.128 - 173.231.224.255 mx +173.231.224.0 - 173.231.224.255 us 173.231.225.0 - 173.231.225.255 de -173.231.226.0 - 173.231.226.127 us -173.231.226.128 - 173.231.226.255 sg -173.231.227.0 - 173.231.227.127 gb -173.231.227.128 - 173.231.228.255 cn -173.231.229.0 - 173.231.229.127 us -173.231.229.128 - 173.231.229.255 hu -173.231.230.0 - 173.231.231.127 cn -173.231.231.128 - 173.231.231.255 fr -173.231.232.0 - 173.231.232.127 us -173.231.232.128 - 173.231.233.255 cn -173.231.234.0 - 173.231.234.127 no -173.231.234.128 - 173.231.235.127 us -173.231.235.128 - 173.231.235.255 cn -173.231.236.0 - 173.231.236.255 us -173.231.237.0 - 173.231.237.127 cn -173.231.237.128 - 173.231.238.255 us -173.231.239.0 - 173.231.239.127 cn -173.231.239.128 - 173.231.240.255 us -173.231.241.0 - 173.231.241.127 ph -173.231.241.128 - 173.231.243.127 us -173.231.243.128 - 173.231.243.255 hk -173.231.244.0 - 173.231.244.127 us -173.231.244.128 - 173.231.244.255 cn -173.231.245.0 - 173.231.246.127 us -173.231.246.128 - 173.231.246.255 my -173.231.247.0 - 173.231.247.127 ca -173.231.247.128 - 173.231.247.255 gi +173.231.226.0 - 173.231.227.255 us +173.231.228.0 - 173.231.228.255 cn +173.231.229.0 - 173.231.229.255 us +173.231.230.0 - 173.231.230.255 cn +173.231.231.0 - 173.231.232.255 us +173.231.233.0 - 173.231.233.255 cn +173.231.234.0 - 173.231.247.255 us 173.231.248.0 - 173.231.249.255 gb -173.231.250.0 - 173.231.250.127 ca -173.231.250.128 - 173.231.251.255 cn -173.231.252.0 - 173.231.252.127 za -173.231.252.128 - 173.231.252.255 pk -173.231.253.0 - 173.231.253.127 cn -173.231.253.128 - 173.232.1.255 us -173.232.2.0 - 173.232.2.255 ca -173.232.3.0 - 173.232.11.255 us -173.232.12.0 - 173.232.13.255 ca -173.232.14.0 - 173.232.19.126 us -173.232.19.127 - 173.232.35.255 ca -173.232.36.0 - 173.232.36.255 us -173.232.37.0 - 173.232.37.31 ca -173.232.37.32 - 173.232.48.255 us -173.232.49.0 - 173.232.50.255 ca -173.232.51.0 - 173.232.51.255 us -173.232.52.0 - 173.232.55.255 ca -173.232.56.0 - 173.232.70.255 us -173.232.71.0 - 173.232.72.255 ca -173.232.73.0 - 173.232.74.255 us -173.232.75.0 - 173.232.75.255 ca -173.232.76.0 - 173.232.76.255 us -173.232.77.0 - 173.232.80.255 ca -173.232.81.0 - 173.232.88.255 us -173.232.89.0 - 173.232.90.255 ca -173.232.91.0 - 173.232.108.255 us -173.232.109.0 - 173.232.109.255 ca -173.232.110.0 - 173.232.118.255 us -173.232.119.0 - 173.232.121.255 ca -173.232.122.0 - 173.232.126.255 us -173.232.127.0 - 173.232.127.255 ca -173.232.128.0 - 173.232.128.255 us -173.232.129.0 - 173.232.130.255 ca -173.232.131.0 - 173.232.154.255 us -173.232.155.0 - 173.232.172.255 ca -173.232.173.0 - 173.232.174.255 us +173.231.250.0 - 173.232.51.255 us +173.232.52.0 - 173.232.52.255 ca +173.232.53.0 - 173.232.144.255 us +173.232.145.0 - 173.232.146.255 ca +173.232.147.0 - 173.232.149.95 us +173.232.149.96 - 173.232.149.103 cn +173.232.149.104 - 173.232.161.255 us +173.232.162.0 - 173.232.162.255 ca +173.232.163.0 - 173.232.174.255 us 173.232.175.0 - 173.232.175.255 ca -173.232.176.0 - 173.232.186.255 us +173.232.176.0 - 173.232.183.255 us +173.232.184.0 - 173.232.184.255 ca +173.232.185.0 - 173.232.186.255 us 173.232.187.0 - 173.232.187.255 ca -173.232.188.0 - 173.232.200.255 us -173.232.201.0 - 173.232.201.255 ca -173.232.202.0 - 173.232.207.255 us -173.232.208.0 - 173.232.208.255 de -173.232.209.0 - 173.232.217.255 us -173.232.218.0 - 173.232.219.255 ca -173.232.220.0 - 173.232.232.255 us -173.232.233.0 - 173.232.233.255 ca -173.232.234.0 - 173.232.239.255 us -173.232.240.0 - 173.232.240.255 ca -173.232.241.0 - 173.232.247.255 us -173.232.248.0 - 173.232.248.255 ca -173.232.249.0 - 173.232.249.31 cr -173.232.249.32 - 173.234.8.111 us -173.234.8.112 - 173.234.8.119 ca -173.234.8.120 - 173.234.9.167 us -173.234.9.168 - 173.234.9.175 ca -173.234.9.176 - 173.234.31.255 us -173.234.32.0 - 173.234.32.7 ca -173.234.32.8 - 173.234.32.247 us -173.234.32.248 - 173.234.32.255 ca -173.234.33.0 - 173.234.33.55 us -173.234.33.56 - 173.234.33.63 ca -173.234.33.64 - 173.234.33.127 us -173.234.33.128 - 173.234.33.135 ca -173.234.33.136 - 173.234.33.239 us -173.234.33.240 - 173.234.33.247 ca -173.234.33.248 - 173.234.43.111 us -173.234.43.112 - 173.234.43.119 ca -173.234.43.120 - 173.234.43.135 us -173.234.43.136 - 173.234.43.143 ca -173.234.43.144 - 173.234.43.239 us -173.234.43.240 - 173.234.43.247 ca -173.234.43.248 - 173.234.60.79 us -173.234.60.80 - 173.234.60.87 ca -173.234.60.88 - 173.234.63.7 us -173.234.63.8 - 173.234.63.15 ca -173.234.63.16 - 173.234.69.55 us -173.234.69.56 - 173.234.69.63 lk -173.234.69.64 - 173.234.69.127 us -173.234.69.128 - 173.234.69.191 lk -173.234.69.192 - 173.234.77.175 us -173.234.77.176 - 173.234.77.183 lk -173.234.77.184 - 173.234.85.23 us -173.234.85.24 - 173.234.85.31 ro -173.234.85.32 - 173.234.117.127 us -173.234.117.128 - 173.234.117.143 ca -173.234.117.144 - 173.234.117.151 us -173.234.117.152 - 173.234.117.159 ca -173.234.117.160 - 173.234.117.231 us -173.234.117.232 - 173.234.117.247 ca -173.234.117.248 - 173.234.140.95 us -173.234.140.96 - 173.234.140.111 ca -173.234.140.112 - 173.234.157.159 us -173.234.157.160 - 173.234.157.167 ca -173.234.157.168 - 173.234.159.255 us -173.234.160.0 - 173.234.160.255 gb -173.234.161.0 - 173.234.163.159 us -173.234.163.160 - 173.234.163.167 ca -173.234.163.168 - 173.234.188.255 us +173.232.188.0 - 173.232.199.255 us +173.232.200.0 - 173.232.200.255 ca +173.232.201.0 - 173.232.207.255 us +173.232.208.0 - 173.232.208.255 ca +173.232.209.0 - 173.232.225.255 us +173.232.226.0 - 173.232.226.255 ca +173.232.227.0 - 173.234.188.255 us 173.234.189.0 - 173.234.189.255 ca -173.234.190.0 - 173.234.233.31 us -173.234.233.32 - 173.234.233.55 ca -173.234.233.56 - 173.234.233.79 us -173.234.233.80 - 173.234.233.95 ca -173.234.233.96 - 173.234.250.255 us -173.234.251.0 - 173.234.251.255 be -173.234.252.0 - 173.237.95.255 us +173.234.190.0 - 173.237.95.255 us 173.237.96.0 - 173.237.127.255 ca 173.237.128.0 - 173.237.207.255 us 173.237.208.0 - 173.237.223.255 ca @@ -73014,26 +58733,24 @@ 173.237.240.0 - 173.238.255.255 ca 173.239.0.0 - 173.239.127.255 us 173.239.128.0 - 173.239.191.255 ca -173.239.192.0 - 173.240.49.127 us -173.240.49.128 - 173.240.49.191 ca -173.240.49.192 - 173.240.51.223 us -173.240.51.224 - 173.240.51.239 ca -173.240.51.240 - 173.240.56.207 us -173.240.56.208 - 173.240.56.223 ca -173.240.56.224 - 173.240.175.255 us +173.239.192.0 - 173.239.206.255 us +173.239.207.0 - 173.239.207.255 mx +173.239.208.0 - 173.240.2.255 us +173.240.3.0 - 173.240.3.255 ca +173.240.4.0 - 173.240.175.255 us 173.240.176.0 - 173.240.191.255 ca 173.240.192.0 - 173.241.31.255 us 173.241.32.0 - 173.241.47.255 ca 173.241.48.0 - 173.241.95.255 us 173.241.96.0 - 173.241.111.255 ca 173.241.112.0 - 173.241.131.255 us -173.241.132.0 - 173.241.133.127 ca -173.241.133.128 - 173.241.134.31 us -173.241.134.32 - 173.241.134.47 gb -173.241.134.48 - 173.241.134.255 us +173.241.132.0 - 173.241.132.255 ca +173.241.133.0 - 173.241.134.255 us 173.241.135.0 - 173.241.135.255 cr 173.241.136.0 - 173.241.143.255 gb -173.241.144.0 - 173.242.207.255 us +173.241.144.0 - 173.241.240.232 us +173.241.240.233 - 173.241.240.233 gb +173.241.240.234 - 173.242.207.255 us 173.242.208.0 - 173.242.223.255 ca 173.242.224.0 - 173.243.31.255 us 173.243.32.0 - 173.243.47.255 ca @@ -73041,78 +58758,52 @@ 173.243.80.0 - 173.243.90.255 pr 173.243.91.0 - 173.243.92.255 us 173.243.93.0 - 173.243.95.255 pr -173.243.96.0 - 173.243.127.255 us -173.243.128.0 - 173.243.143.255 ca -173.243.144.0 - 173.243.191.255 us +173.243.96.0 - 173.243.191.255 us 173.243.192.0 - 173.243.207.255 ca -173.243.208.0 - 173.244.42.191 us -173.244.42.192 - 173.244.42.255 gb -173.244.43.0 - 173.244.79.255 us +173.243.208.0 - 173.244.54.255 us +173.244.55.0 - 173.244.55.255 ca +173.244.56.0 - 173.244.79.255 us 173.244.80.0 - 173.244.86.255 ca 173.244.87.0 - 173.244.87.255 us -173.244.88.0 - 173.244.95.255 ca +173.244.88.0 - 173.244.91.255 ca +173.244.92.0 - 173.244.93.255 us +173.244.94.0 - 173.244.95.255 ca 173.244.96.0 - 173.244.111.255 us 173.244.112.0 - 173.244.127.255 ca -173.244.128.0 - 173.245.0.255 us -173.245.1.0 - 173.245.1.135 ca -173.245.1.136 - 173.245.1.255 us -173.245.2.0 - 173.245.2.31 ca -173.245.2.32 - 173.245.68.15 us -173.245.68.16 - 173.245.68.23 cn -173.245.68.24 - 173.245.68.47 us -173.245.68.48 - 173.245.68.55 pk -173.245.68.56 - 173.245.71.255 us -173.245.72.0 - 173.245.72.7 cn -173.245.72.8 - 173.245.72.23 us -173.245.72.24 - 173.245.72.31 cn -173.245.72.32 - 173.245.72.39 us -173.245.72.40 - 173.245.72.47 cn -173.245.72.48 - 173.245.72.71 us -173.245.72.72 - 173.245.72.79 au -173.245.72.80 - 173.245.72.95 cn -173.245.72.96 - 173.245.78.31 us -173.245.78.32 - 173.245.78.39 cn -173.245.78.40 - 173.245.78.47 us -173.245.78.48 - 173.245.78.79 cn -173.245.78.80 - 173.245.78.95 us -173.245.78.96 - 173.245.78.111 cn -173.245.78.112 - 173.245.78.159 us -173.245.78.160 - 173.245.78.223 cn -173.245.78.224 - 173.245.78.255 us -173.245.79.0 - 173.245.79.31 kr -173.245.79.32 - 173.245.79.63 cn -173.245.79.64 - 173.245.79.71 us -173.245.79.72 - 173.245.79.79 id -173.245.79.80 - 173.245.82.127 us -173.245.82.128 - 173.245.83.31 cn -173.245.83.32 - 173.245.83.63 us -173.245.83.64 - 173.245.83.87 cn -173.245.83.88 - 173.245.83.95 us -173.245.83.96 - 173.245.83.191 cn -173.245.83.192 - 173.245.83.231 us -173.245.83.232 - 173.245.83.255 cn -173.245.84.0 - 173.245.85.255 a1 -173.245.86.0 - 173.245.86.15 us +173.244.128.0 - 173.245.48.255 us +173.245.49.0 - 173.245.49.255 fr +173.245.50.0 - 173.245.50.255 us +173.245.51.0 - 173.245.51.255 de +173.245.52.0 - 173.245.52.255 us +173.245.53.0 - 173.245.53.255 nl +173.245.54.0 - 173.245.61.255 us +173.245.62.0 - 173.245.62.255 hk +173.245.63.0 - 173.245.86.15 us 173.245.86.16 - 173.245.86.23 ca -173.245.86.24 - 173.245.255.255 us +173.245.86.24 - 173.245.216.255 us +173.245.217.0 - 173.245.217.255 jp +173.245.218.0 - 173.245.255.255 us 173.246.0.0 - 173.246.31.255 ca 173.246.32.0 - 173.246.63.255 us -173.246.64.0 - 173.246.95.255 ca -173.246.96.0 - 173.247.207.255 us +173.246.64.0 - 173.246.93.255 ca +173.246.94.0 - 173.246.94.255 us +173.246.95.0 - 173.246.95.255 ca +173.246.96.0 - 173.246.127.255 us +173.246.128.0 - 173.246.159.255 ca +173.246.160.0 - 173.247.31.255 us +173.247.32.0 - 173.247.63.255 ca +173.247.64.0 - 173.247.127.255 us +173.247.128.0 - 173.247.159.255 ca +173.247.160.0 - 173.247.207.255 us 173.247.208.0 - 173.247.223.255 ca 173.247.224.0 - 173.248.191.255 us 173.248.192.0 - 173.248.255.255 ca -173.249.0.0 - 173.249.153.0 us -173.249.153.1 - 173.249.156.255 gb +173.249.0.0 - 173.249.152.255 us +173.249.153.0 - 173.249.156.255 gb 173.249.157.0 - 173.249.199.255 us 173.249.200.0 - 173.249.201.255 ua 173.249.202.0 - 173.249.203.255 es -173.249.204.0 - 173.249.204.127 us -173.249.204.128 - 173.249.204.255 pl -173.249.205.0 - 173.249.205.127 ca -173.249.205.128 - 173.249.205.255 jm -173.249.206.0 - 173.249.206.127 gr -173.249.206.128 - 173.249.206.255 de +173.249.204.0 - 173.249.206.255 us 173.249.207.0 - 173.249.207.255 cn 173.249.208.0 - 173.249.223.255 ca 173.249.224.0 - 173.249.255.255 us @@ -73121,1290 +58812,113 @@ 173.252.0.0 - 173.252.63.255 ca 173.252.64.0 - 173.252.143.255 us 173.252.144.0 - 173.252.144.255 ca -173.252.145.0 - 173.252.183.255 us -173.252.184.0 - 173.252.184.31 ca -173.252.184.32 - 173.252.184.47 us -173.252.184.48 - 173.252.184.111 ca -173.252.184.112 - 173.252.184.167 us -173.252.184.168 - 173.252.184.175 ca -173.252.184.176 - 173.252.184.183 us -173.252.184.184 - 173.252.184.255 ca -173.252.185.0 - 173.252.187.31 us -173.252.187.32 - 173.252.187.255 ca -173.252.188.0 - 173.253.95.255 us +173.252.145.0 - 173.252.184.7 us +173.252.184.8 - 173.252.184.15 ca +173.252.184.16 - 173.252.184.63 us +173.252.184.64 - 173.252.184.71 ca +173.252.184.72 - 173.252.187.47 us +173.252.187.48 - 173.252.187.63 ca +173.252.187.64 - 173.252.187.175 us +173.252.187.176 - 173.252.187.223 ca +173.252.187.224 - 173.252.190.127 us +173.252.190.128 - 173.252.190.159 ca +173.252.190.160 - 173.252.191.119 us +173.252.191.120 - 173.252.191.127 ca +173.252.191.128 - 173.252.191.159 us +173.252.191.160 - 173.252.191.191 ca +173.252.191.192 - 173.253.63.255 us +173.253.64.0 - 173.253.71.255 cn +173.253.72.0 - 173.253.79.255 in +173.253.80.0 - 173.253.95.255 cn 173.253.96.0 - 173.253.97.255 mx -173.253.98.0 - 173.253.112.7 cn -173.253.112.8 - 173.253.112.47 us -173.253.112.48 - 173.253.112.55 pk -173.253.112.56 - 173.253.112.63 es -173.253.112.64 - 173.253.112.71 cn -173.253.112.72 - 173.253.112.79 tr -173.253.112.80 - 173.253.112.87 in -173.253.112.88 - 173.253.112.95 us -173.253.112.96 - 173.253.112.103 br -173.253.112.104 - 173.253.112.111 in -173.253.112.112 - 173.253.112.119 ca -173.253.112.120 - 173.253.112.127 us -173.253.112.128 - 173.253.112.135 au -173.253.112.136 - 173.253.112.143 us -173.253.112.144 - 173.253.112.151 br -173.253.112.152 - 173.253.112.175 us -173.253.112.176 - 173.253.112.183 br -173.253.112.184 - 173.253.112.191 us -173.253.112.192 - 173.253.112.199 br -173.253.112.200 - 173.253.112.215 us -173.253.112.216 - 173.253.112.223 es -173.253.112.224 - 173.253.112.231 ca -173.253.112.232 - 173.253.112.239 tw -173.253.112.240 - 173.253.112.247 ie -173.253.112.248 - 173.253.112.255 ca -173.253.113.0 - 173.253.113.7 us -173.253.113.8 - 173.253.113.15 cn -173.253.113.16 - 173.253.113.23 us -173.253.113.24 - 173.253.113.31 ru -173.253.113.32 - 173.253.113.39 br -173.253.113.40 - 173.253.113.47 pl -173.253.113.48 - 173.253.113.55 cn -173.253.113.56 - 173.253.113.63 il -173.253.113.64 - 173.253.113.71 us -173.253.113.72 - 173.253.113.79 ca -173.253.113.80 - 173.253.113.95 cn -173.253.113.96 - 173.253.113.103 cm -173.253.113.104 - 173.253.113.111 br -173.253.113.112 - 173.253.113.119 us -173.253.113.120 - 173.253.113.127 hk -173.253.113.128 - 173.253.113.135 us -173.253.113.136 - 173.253.113.143 in -173.253.113.144 - 173.253.113.151 ca -173.253.113.152 - 173.253.113.183 us -173.253.113.184 - 173.253.113.191 tr -173.253.113.192 - 173.253.113.199 us -173.253.113.200 - 173.253.113.207 ae -173.253.113.208 - 173.253.113.215 us -173.253.113.216 - 173.253.113.223 cn -173.253.113.224 - 173.253.113.231 us -173.253.113.232 - 173.253.113.239 pk -173.253.113.240 - 173.253.113.247 in -173.253.113.248 - 173.253.113.255 jm -173.253.114.0 - 173.253.114.7 us -173.253.114.8 - 173.253.114.15 ca -173.253.114.16 - 173.253.114.23 us -173.253.114.24 - 173.253.114.31 ca -173.253.114.32 - 173.253.114.39 pr -173.253.114.40 - 173.253.114.47 us -173.253.114.48 - 173.253.114.55 gb -173.253.114.56 - 173.253.114.63 ca -173.253.114.64 - 173.253.114.79 us -173.253.114.80 - 173.253.114.87 cn +173.253.98.0 - 173.253.111.255 cn +173.253.112.0 - 173.253.114.87 us 173.253.114.88 - 173.253.114.95 au -173.253.114.96 - 173.253.114.111 us -173.253.114.112 - 173.253.114.119 sg -173.253.114.120 - 173.253.114.127 us -173.253.114.128 - 173.253.114.135 cn -173.253.114.136 - 173.253.114.143 br -173.253.114.144 - 173.253.114.151 ro -173.253.114.152 - 173.253.114.159 my -173.253.114.160 - 173.253.114.175 us -173.253.114.176 - 173.253.114.183 ru -173.253.114.184 - 173.253.114.199 us -173.253.114.200 - 173.253.114.207 cm -173.253.114.208 - 173.253.114.215 cn -173.253.114.216 - 173.253.114.223 us -173.253.114.224 - 173.253.114.231 br -173.253.114.232 - 173.253.114.255 us -173.253.115.0 - 173.253.115.7 br -173.253.115.8 - 173.253.115.15 cn -173.253.115.16 - 173.253.115.79 us -173.253.115.80 - 173.253.115.87 br -173.253.115.88 - 173.253.115.95 in -173.253.115.96 - 173.253.115.103 cn -173.253.115.104 - 173.253.115.111 us -173.253.115.112 - 173.253.115.119 pl -173.253.115.120 - 173.253.115.135 in -173.253.115.136 - 173.253.115.143 au -173.253.115.144 - 173.253.115.151 cn -173.253.115.152 - 173.253.115.159 in -173.253.115.160 - 173.253.115.167 us -173.253.115.168 - 173.253.115.175 cn -173.253.115.176 - 173.253.115.183 in -173.253.115.184 - 173.253.115.191 cm -173.253.115.192 - 173.253.115.199 my -173.253.115.200 - 173.253.115.231 us -173.253.115.232 - 173.253.115.239 au -173.253.115.240 - 173.253.115.247 cn -173.253.115.248 - 173.253.115.255 my -173.253.116.0 - 173.253.116.31 us -173.253.116.32 - 173.253.116.39 in -173.253.116.40 - 173.253.116.47 jm -173.253.116.48 - 173.253.116.55 us -173.253.116.56 - 173.253.116.63 ru -173.253.116.64 - 173.253.116.71 no -173.253.116.72 - 173.253.116.79 pr -173.253.116.80 - 173.253.116.103 us -173.253.116.104 - 173.253.116.111 hk -173.253.116.112 - 173.253.116.119 in -173.253.116.120 - 173.253.116.127 cr -173.253.116.128 - 173.253.116.143 no -173.253.116.144 - 173.253.116.151 us -173.253.116.152 - 173.253.116.159 ca -173.253.116.160 - 173.253.116.167 cn -173.253.116.168 - 173.253.116.199 us -173.253.116.200 - 173.253.116.207 cn -173.253.116.208 - 173.253.116.215 do -173.253.116.216 - 173.253.116.223 sg -173.253.116.224 - 173.253.116.239 us -173.253.116.240 - 173.253.116.255 cn -173.253.117.0 - 173.253.117.7 us -173.253.117.8 - 173.253.117.15 za -173.253.117.16 - 173.253.117.39 us -173.253.117.40 - 173.253.117.47 ru -173.253.117.48 - 173.253.117.63 us -173.253.117.64 - 173.253.117.71 do -173.253.117.72 - 173.253.117.87 us -173.253.117.88 - 173.253.117.103 cn -173.253.117.104 - 173.253.117.111 us -173.253.117.112 - 173.253.117.119 cn -173.253.117.120 - 173.253.117.127 us -173.253.117.128 - 173.253.117.135 cn -173.253.117.136 - 173.253.117.143 af -173.253.117.144 - 173.253.117.151 cn -173.253.117.152 - 173.253.117.159 us -173.253.117.160 - 173.253.117.167 in -173.253.117.168 - 173.253.117.175 bz -173.253.117.176 - 173.253.117.183 us -173.253.117.184 - 173.253.117.191 cn -173.253.117.192 - 173.253.117.199 ca -173.253.117.200 - 173.253.117.207 us -173.253.117.208 - 173.253.117.215 cn -173.253.117.216 - 173.253.117.223 br -173.253.117.224 - 173.253.117.231 us -173.253.117.232 - 173.253.117.239 jm -173.253.117.240 - 173.253.117.247 gb -173.253.117.248 - 173.253.117.255 us -173.253.118.0 - 173.253.118.7 pr -173.253.118.8 - 173.253.118.15 us -173.253.118.16 - 173.253.118.23 gb -173.253.118.24 - 173.253.118.31 br -173.253.118.32 - 173.253.118.47 us -173.253.118.48 - 173.253.118.55 es -173.253.118.56 - 173.253.118.71 gb -173.253.118.72 - 173.253.118.87 cn -173.253.118.88 - 173.253.118.111 us -173.253.118.112 - 173.253.118.119 br -173.253.118.120 - 173.253.118.143 us -173.253.118.144 - 173.253.118.151 br -173.253.118.152 - 173.253.118.159 tr -173.253.118.160 - 173.253.118.175 us -173.253.118.176 - 173.253.118.183 cn -173.253.118.184 - 173.253.118.191 au -173.253.118.192 - 173.253.118.207 us -173.253.118.208 - 173.253.118.215 gb -173.253.118.216 - 173.253.118.223 us -173.253.118.224 - 173.253.118.231 vn -173.253.118.232 - 173.253.118.255 us -173.253.119.0 - 173.253.119.7 ca -173.253.119.8 - 173.253.119.15 us -173.253.119.16 - 173.253.119.23 cn -173.253.119.24 - 173.253.119.31 us -173.253.119.32 - 173.253.119.39 ca -173.253.119.40 - 173.253.119.47 cn -173.253.119.48 - 173.253.119.55 us -173.253.119.56 - 173.253.119.63 cn -173.253.119.64 - 173.253.119.71 ar -173.253.119.72 - 173.253.119.87 us -173.253.119.88 - 173.253.119.95 tr -173.253.119.96 - 173.253.119.103 us -173.253.119.104 - 173.253.119.119 cn -173.253.119.120 - 173.253.119.127 ae -173.253.119.128 - 173.253.119.135 vn -173.253.119.136 - 173.253.119.143 cn -173.253.119.144 - 173.253.119.167 us -173.253.119.168 - 173.253.119.175 cn -173.253.119.176 - 173.253.119.183 qa -173.253.119.184 - 173.253.119.191 pk -173.253.119.192 - 173.253.119.199 tw -173.253.119.200 - 173.253.119.223 us -173.253.119.224 - 173.253.119.231 ca -173.253.119.232 - 173.253.119.239 us -173.253.119.240 - 173.253.119.247 ca -173.253.119.248 - 173.253.120.7 us -173.253.120.8 - 173.253.120.15 cn -173.253.120.16 - 173.253.120.39 us -173.253.120.40 - 173.253.120.47 br -173.253.120.48 - 173.253.120.127 us -173.253.120.128 - 173.253.120.135 in -173.253.120.136 - 173.253.120.143 us -173.253.120.144 - 173.253.120.151 br -173.253.120.152 - 173.253.120.199 us -173.253.120.200 - 173.253.120.207 br -173.253.120.208 - 173.253.121.159 us -173.253.121.160 - 173.253.121.167 es -173.253.121.168 - 173.253.122.95 us -173.253.122.96 - 173.253.122.103 br -173.253.122.104 - 173.253.124.63 us -173.253.124.64 - 173.253.124.71 br -173.253.124.72 - 173.253.124.199 us -173.253.124.200 - 173.253.124.207 ca -173.253.124.208 - 173.253.124.223 us -173.253.124.224 - 173.253.124.231 br -173.253.124.232 - 173.253.125.167 us -173.253.125.168 - 173.253.125.175 cn -173.253.125.176 - 173.254.192.31 us -173.254.192.32 - 173.254.192.39 de -173.254.192.40 - 173.254.192.143 us -173.254.192.144 - 173.254.192.151 au -173.254.192.152 - 173.255.1.23 us -173.255.1.24 - 173.255.1.31 pe -173.255.1.32 - 173.255.1.47 us -173.255.1.48 - 173.255.1.55 pe -173.255.1.56 - 173.255.1.63 au -173.255.1.64 - 173.255.1.79 br -173.255.1.80 - 173.255.1.87 us -173.255.1.88 - 173.255.1.95 in -173.255.1.96 - 173.255.1.103 tr -173.255.1.104 - 173.255.1.111 es -173.255.1.112 - 173.255.1.127 us -173.255.1.128 - 173.255.1.135 jp -173.255.1.136 - 173.255.1.143 in -173.255.1.144 - 173.255.1.159 th -173.255.1.160 - 173.255.1.183 us -173.255.1.184 - 173.255.1.191 nl -173.255.1.192 - 173.255.1.223 us -173.255.1.224 - 173.255.1.231 br -173.255.1.232 - 173.255.1.247 us -173.255.1.248 - 173.255.1.255 fr -173.255.2.0 - 173.255.2.39 us -173.255.2.40 - 173.255.2.47 jp -173.255.2.48 - 173.255.2.55 us -173.255.2.56 - 173.255.2.63 cn -173.255.2.64 - 173.255.2.79 us -173.255.2.80 - 173.255.2.95 jp -173.255.2.96 - 173.255.2.103 us -173.255.2.104 - 173.255.2.111 ph -173.255.2.112 - 173.255.2.119 jp -173.255.2.120 - 173.255.2.135 us -173.255.2.136 - 173.255.2.143 cn -173.255.2.144 - 173.255.2.151 mx -173.255.2.152 - 173.255.2.167 us -173.255.2.168 - 173.255.2.175 in -173.255.2.176 - 173.255.2.191 us -173.255.2.192 - 173.255.2.199 gb -173.255.2.200 - 173.255.2.207 br -173.255.2.208 - 173.255.2.215 ar -173.255.2.216 - 173.255.2.239 us -173.255.2.240 - 173.255.2.255 sg -173.255.3.0 - 173.255.3.47 us -173.255.3.48 - 173.255.3.55 au -173.255.3.56 - 173.255.3.63 ch -173.255.3.64 - 173.255.3.87 us -173.255.3.88 - 173.255.3.95 gr -173.255.3.96 - 173.255.3.103 br -173.255.3.104 - 173.255.3.119 us -173.255.3.120 - 173.255.3.127 ph -173.255.3.128 - 173.255.3.151 us -173.255.3.152 - 173.255.3.159 nz -173.255.3.160 - 173.255.3.239 us -173.255.3.240 - 173.255.3.247 tr -173.255.3.248 - 173.255.3.255 us -173.255.4.0 - 173.255.4.7 in -173.255.4.8 - 173.255.4.15 cl -173.255.4.16 - 173.255.4.23 tr -173.255.4.24 - 173.255.4.31 us -173.255.4.32 - 173.255.4.39 pl -173.255.4.40 - 173.255.4.47 us -173.255.4.48 - 173.255.4.55 cl -173.255.4.56 - 173.255.4.63 br -173.255.4.64 - 173.255.4.71 au -173.255.4.72 - 173.255.4.79 tr -173.255.4.80 - 173.255.4.87 us -173.255.4.88 - 173.255.4.95 au -173.255.4.96 - 173.255.4.111 us -173.255.4.112 - 173.255.4.119 za -173.255.4.120 - 173.255.4.239 us -173.255.4.240 - 173.255.4.247 il -173.255.4.248 - 173.255.4.255 tw -173.255.5.0 - 173.255.5.15 us -173.255.5.16 - 173.255.5.23 br -173.255.5.24 - 173.255.5.31 us -173.255.5.32 - 173.255.5.39 br -173.255.5.40 - 173.255.5.63 us -173.255.5.64 - 173.255.5.71 es -173.255.5.72 - 173.255.5.79 it -173.255.5.80 - 173.255.5.87 cn -173.255.5.88 - 173.255.5.127 us -173.255.5.128 - 173.255.5.135 br -173.255.5.136 - 173.255.5.151 us -173.255.5.152 - 173.255.5.159 br -173.255.5.160 - 173.255.5.207 us -173.255.5.208 - 173.255.5.215 br -173.255.5.216 - 173.255.6.71 us -173.255.6.72 - 173.255.6.79 br -173.255.6.80 - 173.255.15.255 us +173.253.114.96 - 173.253.125.7 us +173.253.125.8 - 173.253.125.15 gb +173.253.125.16 - 173.255.15.255 us 173.255.16.0 - 173.255.31.255 ca 173.255.32.0 - 173.255.63.255 us 173.255.64.0 - 173.255.79.255 ca -173.255.80.0 - 173.255.125.31 us -173.255.125.32 - 173.255.125.63 be -173.255.125.64 - 173.255.143.255 us +173.255.80.0 - 173.255.135.139 us +173.255.135.140 - 173.255.135.147 nl +173.255.135.148 - 173.255.136.163 us +173.255.136.164 - 173.255.136.167 nl +173.255.136.168 - 173.255.143.255 us 173.255.144.0 - 173.255.159.255 ca 173.255.160.0 - 173.255.255.255 us 174.0.0.0 - 174.7.255.255 ca -174.8.0.0 - 174.34.129.63 us -174.34.129.64 - 174.34.129.71 in -174.34.129.72 - 174.34.129.135 us -174.34.129.136 - 174.34.129.143 in -174.34.129.144 - 174.34.131.71 us -174.34.131.72 - 174.34.131.79 in -174.34.131.80 - 174.34.131.127 us -174.34.131.128 - 174.34.131.255 in -174.34.132.0 - 174.34.133.175 us -174.34.133.176 - 174.34.133.183 ca -174.34.133.184 - 174.34.134.103 us -174.34.134.104 - 174.34.134.111 ca -174.34.134.112 - 174.34.135.15 us -174.34.135.16 - 174.34.135.23 id -174.34.135.24 - 174.34.135.63 us -174.34.135.64 - 174.34.135.71 ca -174.34.135.72 - 174.34.141.255 us -174.34.142.0 - 174.34.142.255 gb -174.34.143.0 - 174.34.155.119 us -174.34.155.120 - 174.34.155.127 gb -174.34.155.128 - 174.34.155.207 us -174.34.155.208 - 174.34.155.215 id -174.34.155.216 - 174.34.158.175 us -174.34.158.176 - 174.34.158.183 gb -174.34.158.184 - 174.34.172.63 us -174.34.172.64 - 174.34.172.71 ca -174.34.172.72 - 174.34.175.111 us -174.34.175.112 - 174.34.175.119 se -174.34.175.120 - 174.34.177.231 us -174.34.177.232 - 174.34.177.247 ca -174.34.177.248 - 174.34.185.215 us -174.34.185.216 - 174.34.185.223 ca -174.34.185.224 - 174.34.190.255 us +174.8.0.0 - 174.34.190.255 us 174.34.191.0 - 174.34.191.255 ca -174.34.192.0 - 174.35.127.255 us +174.34.192.0 - 174.35.3.255 us +174.35.4.0 - 174.35.5.255 de +174.35.6.0 - 174.35.45.255 us +174.35.46.0 - 174.35.46.255 de +174.35.47.0 - 174.35.49.255 us +174.35.50.0 - 174.35.50.255 ca +174.35.51.0 - 174.35.61.255 us +174.35.62.0 - 174.35.63.255 de +174.35.64.0 - 174.35.64.255 nl +174.35.65.0 - 174.35.65.255 us +174.35.66.0 - 174.35.66.255 fr +174.35.67.0 - 174.35.67.255 nl +174.35.68.0 - 174.35.68.255 us +174.35.69.0 - 174.35.69.255 fr +174.35.70.0 - 174.35.70.255 us +174.35.71.0 - 174.35.71.255 de +174.35.72.0 - 174.35.81.255 us +174.35.82.0 - 174.35.82.255 it +174.35.83.0 - 174.35.86.255 us +174.35.87.0 - 174.35.87.255 br +174.35.88.0 - 174.35.88.255 ar +174.35.89.0 - 174.35.89.255 us +174.35.90.0 - 174.35.90.255 mx +174.35.91.0 - 174.35.91.255 us +174.35.92.0 - 174.35.92.255 cl +174.35.93.0 - 174.35.93.255 br +174.35.94.0 - 174.35.94.255 co +174.35.95.0 - 174.35.127.255 us 174.35.128.0 - 174.35.255.255 ca 174.36.0.0 - 174.87.255.255 us 174.88.0.0 - 174.95.255.255 ca 174.96.0.0 - 174.111.255.255 us 174.112.0.0 - 174.119.255.255 ca -174.120.0.0 - 174.120.47.95 us -174.120.47.96 - 174.120.47.103 ch -174.120.47.104 - 174.120.204.47 us -174.120.204.48 - 174.120.204.55 ch -174.120.204.56 - 174.120.214.159 us -174.120.214.160 - 174.120.214.167 ch -174.120.214.168 - 174.122.45.255 us +174.120.0.0 - 174.122.45.255 us 174.122.46.0 - 174.122.47.255 ae -174.122.48.0 - 174.122.91.255 us -174.122.92.0 - 174.122.93.255 ae -174.122.94.0 - 174.132.97.15 us -174.132.97.16 - 174.132.97.23 ch -174.132.97.24 - 174.136.96.47 us -174.136.96.48 - 174.136.96.63 ph -174.136.96.64 - 174.136.96.95 us -174.136.96.96 - 174.136.96.103 ru -174.136.96.104 - 174.136.96.167 us -174.136.96.168 - 174.136.96.175 jp -174.136.96.176 - 174.136.97.31 us -174.136.97.32 - 174.136.97.39 nl -174.136.97.40 - 174.136.97.207 us -174.136.97.208 - 174.136.97.215 jp -174.136.97.216 - 174.136.97.239 us -174.136.97.240 - 174.136.97.247 ca -174.136.97.248 - 174.136.98.103 us -174.136.98.104 - 174.136.98.111 nz -174.136.98.112 - 174.136.98.127 jp -174.136.98.128 - 174.136.98.143 us -174.136.98.144 - 174.136.98.159 jp -174.136.98.160 - 174.136.99.79 us -174.136.99.80 - 174.136.99.95 nz -174.136.99.96 - 174.136.99.135 us -174.136.99.136 - 174.136.99.143 ca -174.136.99.144 - 174.136.100.7 us -174.136.100.8 - 174.136.100.23 ca -174.136.100.24 - 174.136.100.135 us -174.136.100.136 - 174.136.100.143 mq -174.136.100.144 - 174.136.100.151 ca -174.136.100.152 - 174.136.101.143 us -174.136.101.144 - 174.136.101.151 se -174.136.101.152 - 174.136.103.63 us -174.136.103.64 - 174.136.103.71 au -174.136.103.72 - 174.136.103.207 us -174.136.103.208 - 174.136.103.215 mx -174.136.103.216 - 174.136.104.39 us -174.136.104.40 - 174.136.104.47 ph -174.136.104.48 - 174.136.104.63 us -174.136.104.64 - 174.136.104.71 ru -174.136.104.72 - 174.136.104.103 us -174.136.104.104 - 174.136.104.111 ca -174.136.104.112 - 174.136.104.167 us -174.136.104.168 - 174.136.104.175 nz -174.136.104.176 - 174.136.104.199 us -174.136.104.200 - 174.136.104.207 cn -174.136.104.208 - 174.136.105.39 us -174.136.105.40 - 174.136.105.47 tr -174.136.105.48 - 174.136.105.111 us -174.136.105.112 - 174.136.105.119 jp -174.136.105.120 - 174.136.105.191 us -174.136.105.192 - 174.136.105.207 ca -174.136.105.208 - 174.136.106.39 us -174.136.106.40 - 174.136.106.47 au -174.136.106.48 - 174.136.106.159 us -174.136.106.160 - 174.136.106.175 ph -174.136.106.176 - 174.136.106.183 ca -174.136.106.184 - 174.136.106.199 us -174.136.106.200 - 174.136.106.207 ca -174.136.106.208 - 174.136.107.95 us -174.136.107.96 - 174.136.107.103 za -174.136.107.104 - 174.136.107.135 us -174.136.107.136 - 174.136.107.143 au -174.136.107.144 - 174.136.108.79 us -174.136.108.80 - 174.136.108.95 za -174.136.108.96 - 174.136.108.103 jp -174.136.108.104 - 174.136.108.255 us -174.136.109.0 - 174.136.109.7 es -174.136.109.8 - 174.136.109.135 us -174.136.109.136 - 174.136.109.143 nl -174.136.109.144 - 174.136.109.159 cn -174.136.109.160 - 174.136.110.143 us -174.136.110.144 - 174.136.110.159 mx -174.136.110.160 - 174.136.110.255 us -174.136.111.0 - 174.136.111.7 ca -174.136.111.8 - 174.136.111.23 us -174.136.111.24 - 174.136.111.31 ca -174.136.111.32 - 174.136.111.255 us +174.122.48.0 - 174.127.87.255 us +174.127.88.0 - 174.127.88.255 sg +174.127.89.0 - 174.133.115.255 us +174.133.116.0 - 174.133.119.255 sg +174.133.120.0 - 174.136.105.191 us +174.136.105.192 - 174.136.105.199 vn +174.136.105.200 - 174.136.111.255 us 174.136.112.0 - 174.136.127.255 ca -174.136.128.0 - 174.137.16.15 us -174.137.16.16 - 174.137.16.31 ca -174.137.16.32 - 174.137.17.255 us -174.137.18.0 - 174.137.19.255 ca -174.137.20.0 - 174.137.47.255 us -174.137.48.0 - 174.137.48.95 ca -174.137.48.96 - 174.137.48.103 us -174.137.48.104 - 174.137.48.111 ca -174.137.48.112 - 174.137.48.119 us -174.137.48.120 - 174.137.48.247 ca -174.137.48.248 - 174.137.48.255 us -174.137.49.0 - 174.137.52.255 ca -174.137.53.0 - 174.137.53.199 us -174.137.53.200 - 174.137.54.247 ca -174.137.54.248 - 174.137.54.255 ru -174.137.55.0 - 174.137.55.255 ca -174.137.56.0 - 174.137.56.255 us -174.137.57.0 - 174.137.63.255 ca +174.136.128.0 - 174.136.201.255 us +174.136.202.0 - 174.136.202.255 au +174.136.203.0 - 174.136.208.255 us +174.136.209.0 - 174.136.209.255 jp +174.136.210.0 - 174.136.219.255 us +174.136.220.0 - 174.136.220.255 nz +174.136.221.0 - 174.136.225.255 us +174.136.226.0 - 174.136.226.255 ph +174.136.227.0 - 174.137.47.255 us +174.137.48.0 - 174.137.63.255 ca 174.137.64.0 - 174.137.184.255 us 174.137.185.0 - 174.137.186.255 ca 174.137.187.0 - 174.137.191.255 us -174.137.192.0 - 174.137.193.255 ca -174.137.194.0 - 174.137.194.7 us -174.137.194.8 - 174.137.194.23 ca -174.137.194.24 - 174.137.194.31 us -174.137.194.32 - 174.137.194.111 ca -174.137.194.112 - 174.137.194.119 us -174.137.194.120 - 174.137.194.143 ca -174.137.194.144 - 174.137.194.151 us -174.137.194.152 - 174.137.194.175 ca -174.137.194.176 - 174.137.194.191 us -174.137.194.192 - 174.137.195.63 ca -174.137.195.64 - 174.137.195.71 us -174.137.195.72 - 174.137.195.79 ca -174.137.195.80 - 174.137.195.87 us -174.137.195.88 - 174.137.195.127 ca -174.137.195.128 - 174.137.195.159 us -174.137.195.160 - 174.137.195.223 ca -174.137.195.224 - 174.137.195.231 us -174.137.195.232 - 174.137.196.7 ca -174.137.196.8 - 174.137.196.15 us -174.137.196.16 - 174.137.196.23 ca -174.137.196.24 - 174.137.196.31 us -174.137.196.32 - 174.137.196.95 ca -174.137.196.96 - 174.137.196.111 us -174.137.196.112 - 174.137.196.135 ca -174.137.196.136 - 174.137.196.143 nl -174.137.196.144 - 174.137.196.167 ca -174.137.196.168 - 174.137.196.183 us -174.137.196.184 - 174.137.196.191 ca -174.137.196.192 - 174.137.196.199 us -174.137.196.200 - 174.137.196.207 ca -174.137.196.208 - 174.137.196.231 us -174.137.196.232 - 174.137.198.55 ca -174.137.198.56 - 174.137.198.71 us -174.137.198.72 - 174.137.198.79 ca -174.137.198.80 - 174.137.198.127 us -174.137.198.128 - 174.137.198.159 ca -174.137.198.160 - 174.137.198.167 us -174.137.198.168 - 174.137.198.175 ca -174.137.198.176 - 174.137.199.7 us -174.137.199.8 - 174.137.199.23 ca -174.137.199.24 - 174.137.199.47 us -174.137.199.48 - 174.137.199.95 ca -174.137.199.96 - 174.137.199.143 us -174.137.199.144 - 174.137.199.183 ca -174.137.199.184 - 174.137.199.255 us -174.137.200.0 - 174.137.200.255 ca -174.137.201.0 - 174.137.201.7 us -174.137.201.8 - 174.137.201.31 ca -174.137.201.32 - 174.137.201.55 us -174.137.201.56 - 174.137.201.87 ca -174.137.201.88 - 174.137.201.95 us -174.137.201.96 - 174.137.201.103 ca -174.137.201.104 - 174.137.201.151 us -174.137.201.152 - 174.137.201.159 ca -174.137.201.160 - 174.137.201.175 us -174.137.201.176 - 174.137.201.199 ca -174.137.201.200 - 174.137.201.215 us -174.137.201.216 - 174.137.201.231 ca -174.137.201.232 - 174.137.201.239 us -174.137.201.240 - 174.137.201.255 ca -174.137.202.0 - 174.137.202.7 us -174.137.202.8 - 174.137.203.39 ca -174.137.203.40 - 174.137.203.47 us -174.137.203.48 - 174.137.203.71 ca -174.137.203.72 - 174.137.203.79 us -174.137.203.80 - 174.137.203.127 ca -174.137.203.128 - 174.137.203.135 us -174.137.203.136 - 174.137.203.191 ca -174.137.203.192 - 174.137.203.207 us -174.137.203.208 - 174.137.204.15 ca -174.137.204.16 - 174.137.204.23 us -174.137.204.24 - 174.137.204.55 ca -174.137.204.56 - 174.137.204.71 us -174.137.204.72 - 174.137.204.119 ca -174.137.204.120 - 174.137.204.127 us -174.137.204.128 - 174.137.204.167 ca -174.137.204.168 - 174.137.204.175 us -174.137.204.176 - 174.137.217.191 ca -174.137.217.192 - 174.137.217.207 us -174.137.217.208 - 174.137.217.215 ca -174.137.217.216 - 174.137.217.239 us -174.137.217.240 - 174.137.218.151 ca -174.137.218.152 - 174.137.218.159 us -174.137.218.160 - 174.137.218.175 ca -174.137.218.176 - 174.137.218.183 us -174.137.218.184 - 174.137.218.239 ca -174.137.218.240 - 174.137.218.247 us -174.137.218.248 - 174.137.219.55 ca -174.137.219.56 - 174.137.219.63 us -174.137.219.64 - 174.137.219.95 ca -174.137.219.96 - 174.137.219.103 us -174.137.219.104 - 174.137.219.247 ca -174.137.219.248 - 174.137.219.255 us -174.137.220.0 - 174.137.220.143 ca -174.137.220.144 - 174.137.220.151 nl -174.137.220.152 - 174.137.220.215 ca -174.137.220.216 - 174.137.220.223 us -174.137.220.224 - 174.137.220.247 ca -174.137.220.248 - 174.137.220.255 us -174.137.221.0 - 174.137.221.15 ca -174.137.221.16 - 174.137.221.23 us -174.137.221.24 - 174.137.221.31 ca -174.137.221.32 - 174.137.221.39 us -174.137.221.40 - 174.137.221.55 ca -174.137.221.56 - 174.137.221.63 us -174.137.221.64 - 174.137.221.135 ca -174.137.221.136 - 174.137.221.151 us -174.137.221.152 - 174.137.221.159 ca -174.137.221.160 - 174.137.221.175 us -174.137.221.176 - 174.137.221.199 ca -174.137.221.200 - 174.137.221.207 us -174.137.221.208 - 174.137.223.39 ca -174.137.223.40 - 174.137.223.47 us -174.137.223.48 - 174.137.223.79 ca -174.137.223.80 - 174.137.223.87 us -174.137.223.88 - 174.137.224.87 ca -174.137.224.88 - 174.137.224.95 us -174.137.224.96 - 174.137.225.151 ca -174.137.225.152 - 174.137.225.159 us -174.137.225.160 - 174.137.225.207 ca -174.137.225.208 - 174.137.225.255 us -174.137.226.0 - 174.137.226.71 ca -174.137.226.72 - 174.137.226.79 us -174.137.226.80 - 174.137.228.207 ca -174.137.228.208 - 174.137.228.215 us -174.137.228.216 - 174.137.229.135 ca -174.137.229.136 - 174.137.229.143 us -174.137.229.144 - 174.137.229.199 ca -174.137.229.200 - 174.137.229.207 us -174.137.229.208 - 174.137.230.7 ca -174.137.230.8 - 174.137.230.23 us -174.137.230.24 - 174.137.230.55 ca -174.137.230.56 - 174.137.230.175 us -174.137.230.176 - 174.137.230.183 ca -174.137.230.184 - 174.137.231.31 us -174.137.231.32 - 174.137.231.39 ca -174.137.231.40 - 174.137.231.47 us -174.137.231.48 - 174.137.231.143 ca -174.137.231.144 - 174.137.231.151 us -174.137.231.152 - 174.137.231.159 ca -174.137.231.160 - 174.137.231.215 us -174.137.231.216 - 174.137.231.231 ca -174.137.231.232 - 174.137.232.31 us -174.137.232.32 - 174.137.232.39 ca -174.137.232.40 - 174.137.232.63 us -174.137.232.64 - 174.137.232.71 ca -174.137.232.72 - 174.137.232.183 us -174.137.232.184 - 174.137.232.191 ca -174.137.232.192 - 174.137.232.199 nl -174.137.232.200 - 174.137.232.231 ca -174.137.232.232 - 174.137.232.239 us -174.137.232.240 - 174.137.233.7 ca -174.137.233.8 - 174.137.233.39 us -174.137.233.40 - 174.137.233.71 ca -174.137.233.72 - 174.137.233.135 us -174.137.233.136 - 174.137.233.143 ca -174.137.233.144 - 174.137.233.255 us -174.137.234.0 - 174.137.234.255 ca -174.137.235.0 - 174.137.235.23 us -174.137.235.24 - 174.137.235.31 ca -174.137.235.32 - 174.137.235.71 us -174.137.235.72 - 174.137.235.87 ca -174.137.235.88 - 174.137.235.119 us -174.137.235.120 - 174.137.235.135 ca -174.137.235.136 - 174.137.235.143 us -174.137.235.144 - 174.137.235.159 ca -174.137.235.160 - 174.137.235.183 us -174.137.235.184 - 174.137.235.191 ca -174.137.235.192 - 174.137.235.215 us -174.137.235.216 - 174.137.236.63 ca -174.137.236.64 - 174.137.236.71 us -174.137.236.72 - 174.137.236.87 ca -174.137.236.88 - 174.137.236.95 us -174.137.236.96 - 174.137.236.143 ca -174.137.236.144 - 174.137.236.151 us -174.137.236.152 - 174.137.236.167 ca -174.137.236.168 - 174.137.236.175 us -174.137.236.176 - 174.137.236.183 ca -174.137.236.184 - 174.137.236.191 us -174.137.236.192 - 174.137.236.199 ca -174.137.236.200 - 174.137.236.207 us -174.137.236.208 - 174.137.237.15 ca -174.137.237.16 - 174.137.237.23 us -174.137.237.24 - 174.137.237.79 ca -174.137.237.80 - 174.137.237.87 us -174.137.237.88 - 174.137.237.159 ca -174.137.237.160 - 174.137.237.167 us -174.137.237.168 - 174.137.237.231 ca -174.137.237.232 - 174.137.237.239 us -174.137.237.240 - 174.137.238.111 ca -174.137.238.112 - 174.137.238.127 us -174.137.238.128 - 174.137.239.255 ca -174.137.240.0 - 174.137.240.7 us -174.137.240.8 - 174.137.240.23 ca -174.137.240.24 - 174.137.240.39 us -174.137.240.40 - 174.137.240.143 ca -174.137.240.144 - 174.137.240.151 us -174.137.240.152 - 174.137.241.7 ca -174.137.241.8 - 174.137.241.15 us -174.137.241.16 - 174.137.241.55 ca -174.137.241.56 - 174.137.241.63 us -174.137.241.64 - 174.137.241.103 ca -174.137.241.104 - 174.137.241.111 us -174.137.241.112 - 174.137.242.103 ca -174.137.242.104 - 174.137.242.111 us -174.137.242.112 - 174.137.242.159 ca -174.137.242.160 - 174.137.242.167 us -174.137.242.168 - 174.137.242.223 ca -174.137.242.224 - 174.137.243.7 us -174.137.243.8 - 174.137.243.47 ca -174.137.243.48 - 174.137.243.95 us -174.137.243.96 - 174.137.243.143 ca -174.137.243.144 - 174.137.243.231 us -174.137.243.232 - 174.137.243.239 ca -174.137.243.240 - 174.137.244.55 us -174.137.244.56 - 174.137.244.63 ca -174.137.244.64 - 174.137.244.119 us -174.137.244.120 - 174.137.244.127 ca -174.137.244.128 - 174.137.244.199 us -174.137.244.200 - 174.137.244.215 ca -174.137.244.216 - 174.137.244.231 us -174.137.244.232 - 174.137.244.247 ca -174.137.244.248 - 174.137.244.255 us -174.137.245.0 - 174.137.245.7 ca -174.137.245.8 - 174.137.245.167 us -174.137.245.168 - 174.137.245.175 ca -174.137.245.176 - 174.137.245.183 us -174.137.245.184 - 174.137.246.39 ca -174.137.246.40 - 174.137.246.47 us -174.137.246.48 - 174.137.246.175 ca -174.137.246.176 - 174.137.246.191 us -174.137.246.192 - 174.137.246.207 ca -174.137.246.208 - 174.137.246.223 us -174.137.246.224 - 174.137.247.31 ca -174.137.247.32 - 174.137.247.55 us -174.137.247.56 - 174.137.247.87 ca -174.137.247.88 - 174.137.247.95 us -174.137.247.96 - 174.137.247.119 ca -174.137.247.120 - 174.137.247.167 us -174.137.247.168 - 174.137.247.175 ca -174.137.247.176 - 174.137.247.239 us -174.137.247.240 - 174.137.247.247 ca -174.137.247.248 - 174.137.247.255 us -174.137.248.0 - 174.137.248.167 ca -174.137.248.168 - 174.137.248.175 us -174.137.248.176 - 174.137.248.191 ca -174.137.248.192 - 174.137.248.199 us -174.137.248.200 - 174.137.251.7 ca -174.137.251.8 - 174.137.251.15 us -174.137.251.16 - 174.137.251.63 ca -174.137.251.64 - 174.137.251.71 us -174.137.251.72 - 174.137.251.95 ca -174.137.251.96 - 174.137.251.103 us -174.137.251.104 - 174.137.252.199 ca -174.137.252.200 - 174.137.252.207 us -174.137.252.208 - 174.137.253.7 ca -174.137.253.8 - 174.137.253.15 us -174.137.253.16 - 174.137.253.95 ca -174.137.253.96 - 174.137.253.103 us -174.137.253.104 - 174.137.253.111 ca -174.137.253.112 - 174.137.253.127 us -174.137.253.128 - 174.137.253.175 ca -174.137.253.176 - 174.137.253.207 us -174.137.253.208 - 174.137.253.231 ca -174.137.253.232 - 174.137.253.239 us -174.137.253.240 - 174.137.255.87 ca -174.137.255.88 - 174.137.255.95 us -174.137.255.96 - 174.137.255.255 ca +174.137.192.0 - 174.137.255.255 ca 174.138.0.0 - 174.138.127.255 us 174.138.128.0 - 174.138.143.255 ca -174.138.144.0 - 174.138.152.255 us -174.138.153.0 - 174.138.153.255 do -174.138.154.0 - 174.138.160.7 us -174.138.160.8 - 174.138.160.15 br -174.138.160.16 - 174.138.162.39 us -174.138.162.40 - 174.138.162.47 au -174.138.162.48 - 174.138.163.31 us -174.138.163.32 - 174.138.163.47 gb -174.138.163.48 - 174.138.163.63 cn -174.138.163.64 - 174.138.168.79 us -174.138.168.80 - 174.138.168.95 ru -174.138.168.96 - 174.138.170.63 us -174.138.170.64 - 174.138.170.71 ru -174.138.170.72 - 174.138.170.103 us -174.138.170.104 - 174.138.170.111 au -174.138.170.112 - 174.138.173.127 us -174.138.173.128 - 174.138.173.143 ru -174.138.173.144 - 174.138.191.255 us +174.138.144.0 - 174.138.159.255 hk +174.138.160.0 - 174.138.191.255 us 174.138.192.0 - 174.138.223.255 ca -174.138.224.0 - 174.139.116.167 us -174.139.116.168 - 174.139.116.183 cn -174.139.116.184 - 174.140.175.255 us +174.138.224.0 - 174.140.175.255 us 174.140.176.0 - 174.140.191.255 ca 174.140.192.0 - 174.141.255.255 us -174.142.0.0 - 174.142.45.87 ca -174.142.45.88 - 174.142.45.95 hu -174.142.45.96 - 174.142.67.95 ca -174.142.67.96 - 174.142.67.103 pe -174.142.67.104 - 174.142.113.47 ca -174.142.113.48 - 174.142.113.63 fr -174.142.113.64 - 174.142.147.215 ca -174.142.147.216 - 174.142.147.223 hu -174.142.147.224 - 174.142.164.55 ca -174.142.164.56 - 174.142.164.63 sy -174.142.164.64 - 174.142.211.247 ca -174.142.211.248 - 174.142.211.255 us -174.142.212.0 - 174.142.255.255 ca -174.143.0.0 - 174.143.0.55 us -174.143.0.56 - 174.143.0.71 no -174.143.0.72 - 174.143.0.111 us -174.143.0.112 - 174.143.0.119 gb -174.143.0.120 - 174.143.1.79 us -174.143.1.80 - 174.143.1.87 ca -174.143.1.88 - 174.143.1.223 us -174.143.1.224 - 174.143.1.231 ca -174.143.1.232 - 174.143.2.71 us -174.143.2.72 - 174.143.2.79 ca -174.143.2.80 - 174.143.5.239 us -174.143.5.240 - 174.143.6.15 gb -174.143.6.16 - 174.143.7.47 us -174.143.7.48 - 174.143.7.63 ca -174.143.7.64 - 174.143.8.191 us -174.143.8.192 - 174.143.10.191 bd -174.143.10.192 - 174.143.11.95 us -174.143.11.96 - 174.143.11.127 gb -174.143.11.128 - 174.143.12.79 us -174.143.12.80 - 174.143.12.87 vg -174.143.12.88 - 174.143.13.55 us -174.143.13.56 - 174.143.13.63 il -174.143.13.64 - 174.143.13.95 us -174.143.13.96 - 174.143.13.103 mx -174.143.13.104 - 174.143.13.143 us -174.143.13.144 - 174.143.13.151 in -174.143.13.152 - 174.143.14.7 us -174.143.14.8 - 174.143.14.15 ca -174.143.14.16 - 174.143.14.23 gb -174.143.14.24 - 174.143.14.119 us -174.143.14.120 - 174.143.14.127 gb -174.143.14.128 - 174.143.15.207 us -174.143.15.208 - 174.143.15.215 ca -174.143.15.216 - 174.143.15.231 us -174.143.15.232 - 174.143.15.239 il -174.143.15.240 - 174.143.16.23 us -174.143.16.24 - 174.143.16.31 za -174.143.16.32 - 174.143.16.47 us -174.143.16.48 - 174.143.16.55 za -174.143.16.56 - 174.143.17.7 us -174.143.17.8 - 174.143.17.15 ca -174.143.17.16 - 174.143.17.111 us -174.143.17.112 - 174.143.17.119 bb -174.143.17.120 - 174.143.17.207 us -174.143.17.208 - 174.143.17.223 gb -174.143.17.224 - 174.143.17.255 us -174.143.18.0 - 174.143.18.7 ca -174.143.18.8 - 174.143.19.39 us -174.143.19.40 - 174.143.19.47 au -174.143.19.48 - 174.143.19.135 us -174.143.19.136 - 174.143.19.143 gb -174.143.19.144 - 174.143.19.183 us -174.143.19.184 - 174.143.19.191 gb -174.143.19.192 - 174.143.19.223 us -174.143.19.224 - 174.143.19.231 ca -174.143.19.232 - 174.143.19.247 us -174.143.19.248 - 174.143.19.255 ca -174.143.20.0 - 174.143.20.63 us -174.143.20.64 - 174.143.20.95 ca -174.143.20.96 - 174.143.21.127 us -174.143.21.128 - 174.143.21.191 ca -174.143.21.192 - 174.143.32.31 us -174.143.32.32 - 174.143.32.39 gb -174.143.32.40 - 174.143.33.55 us -174.143.33.56 - 174.143.33.63 gb -174.143.33.64 - 174.143.33.79 ca -174.143.33.80 - 174.143.33.191 us -174.143.33.192 - 174.143.33.199 my -174.143.33.200 - 174.143.34.47 us -174.143.34.48 - 174.143.34.55 au -174.143.34.56 - 174.143.37.159 us -174.143.37.160 - 174.143.37.175 za -174.143.37.176 - 174.143.38.63 us -174.143.38.64 - 174.143.38.79 in -174.143.38.80 - 174.143.38.239 us -174.143.38.240 - 174.143.38.255 il -174.143.39.0 - 174.143.39.143 us -174.143.39.144 - 174.143.39.159 ca -174.143.39.160 - 174.143.40.151 us -174.143.40.152 - 174.143.40.159 in -174.143.40.160 - 174.143.40.167 us -174.143.40.168 - 174.143.40.175 jp -174.143.40.176 - 174.143.41.167 us -174.143.41.168 - 174.143.41.175 in -174.143.41.176 - 174.143.41.223 us -174.143.41.224 - 174.143.41.231 gb -174.143.41.232 - 174.143.42.247 us -174.143.42.248 - 174.143.42.255 il -174.143.43.0 - 174.143.43.7 us -174.143.43.8 - 174.143.43.15 gb -174.143.43.16 - 174.143.43.31 us -174.143.43.32 - 174.143.43.39 il -174.143.43.40 - 174.143.43.127 us -174.143.43.128 - 174.143.43.135 gb -174.143.43.136 - 174.143.43.143 us -174.143.43.144 - 174.143.43.159 ca -174.143.43.160 - 174.143.43.239 us -174.143.43.240 - 174.143.43.247 ca -174.143.43.248 - 174.143.44.63 us -174.143.44.64 - 174.143.44.95 in -174.143.44.96 - 174.143.46.63 us -174.143.46.64 - 174.143.46.95 bd -174.143.46.96 - 174.143.47.127 us -174.143.47.128 - 174.143.47.159 ca -174.143.47.160 - 174.143.50.103 us -174.143.50.104 - 174.143.50.111 in -174.143.50.112 - 174.143.50.119 ca -174.143.50.120 - 174.143.50.151 us -174.143.50.152 - 174.143.50.159 fr -174.143.50.160 - 174.143.50.199 us -174.143.50.200 - 174.143.50.207 se -174.143.50.208 - 174.143.51.15 us -174.143.51.16 - 174.143.51.23 gb -174.143.51.24 - 174.143.51.71 us -174.143.51.72 - 174.143.51.79 in -174.143.51.80 - 174.143.51.151 us -174.143.51.152 - 174.143.51.159 nl -174.143.51.160 - 174.143.52.71 us -174.143.52.72 - 174.143.52.79 au -174.143.52.80 - 174.143.53.55 us -174.143.53.56 - 174.143.53.63 za -174.143.53.64 - 174.143.53.191 us -174.143.53.192 - 174.143.53.199 gb -174.143.53.200 - 174.143.54.79 us -174.143.54.80 - 174.143.54.87 gb -174.143.54.88 - 174.143.54.159 us -174.143.54.160 - 174.143.54.167 gb -174.143.54.168 - 174.143.55.239 us -174.143.55.240 - 174.143.55.247 fr -174.143.55.248 - 174.143.55.255 gb -174.143.56.0 - 174.143.56.255 us -174.143.57.0 - 174.143.57.15 ca -174.143.57.16 - 174.143.57.79 us -174.143.57.80 - 174.143.57.87 ae -174.143.57.88 - 174.143.57.111 us -174.143.57.112 - 174.143.57.119 nz -174.143.57.120 - 174.143.57.127 in -174.143.57.128 - 174.143.57.223 us -174.143.57.224 - 174.143.57.231 ca -174.143.57.232 - 174.143.58.95 us -174.143.58.96 - 174.143.58.103 gb -174.143.58.104 - 174.143.58.151 us -174.143.58.152 - 174.143.58.159 au -174.143.58.160 - 174.143.58.247 us -174.143.58.248 - 174.143.58.255 cn -174.143.59.0 - 174.143.60.31 us -174.143.60.32 - 174.143.60.47 nz -174.143.60.48 - 174.143.60.111 us -174.143.60.112 - 174.143.60.127 gb -174.143.60.128 - 174.143.60.207 us -174.143.60.208 - 174.143.60.223 ca -174.143.60.224 - 174.143.61.79 us -174.143.61.80 - 174.143.61.111 ca -174.143.61.112 - 174.143.62.135 us -174.143.62.136 - 174.143.62.143 ca -174.143.62.144 - 174.143.62.159 us -174.143.62.160 - 174.143.62.167 mx -174.143.62.168 - 174.143.63.135 us -174.143.63.136 - 174.143.63.143 ca -174.143.63.144 - 174.143.64.191 us -174.143.64.192 - 174.143.64.199 au -174.143.64.200 - 174.143.64.215 us -174.143.64.216 - 174.143.64.223 no -174.143.64.224 - 174.143.64.239 us -174.143.64.240 - 174.143.64.247 nz -174.143.64.248 - 174.143.65.127 us -174.143.65.128 - 174.143.65.135 ca -174.143.65.136 - 174.143.65.255 us -174.143.66.0 - 174.143.66.7 cy -174.143.66.8 - 174.143.66.15 ca -174.143.66.16 - 174.143.66.23 us -174.143.66.24 - 174.143.66.31 ca -174.143.66.32 - 174.143.66.175 us -174.143.66.176 - 174.143.66.183 nl -174.143.66.184 - 174.143.66.191 us -174.143.66.192 - 174.143.66.199 ca -174.143.66.200 - 174.143.67.95 us -174.143.67.96 - 174.143.67.103 mx -174.143.67.104 - 174.143.68.71 us -174.143.68.72 - 174.143.68.79 au -174.143.68.80 - 174.143.68.151 us -174.143.68.152 - 174.143.68.159 au -174.143.68.160 - 174.143.70.23 us -174.143.70.24 - 174.143.70.31 au -174.143.70.32 - 174.143.70.39 us -174.143.70.40 - 174.143.70.47 za -174.143.70.48 - 174.143.70.79 us -174.143.70.80 - 174.143.70.87 ca -174.143.70.88 - 174.143.73.255 us -174.143.74.0 - 174.143.74.15 ca -174.143.74.16 - 174.143.74.255 us -174.143.75.0 - 174.143.75.15 hu -174.143.75.16 - 174.143.75.47 ca -174.143.75.48 - 174.143.75.175 us -174.143.75.176 - 174.143.75.191 in -174.143.75.192 - 174.143.76.143 us -174.143.76.144 - 174.143.76.151 mx -174.143.76.152 - 174.143.76.183 us -174.143.76.184 - 174.143.76.191 au -174.143.76.192 - 174.143.76.215 us -174.143.76.216 - 174.143.76.223 gb -174.143.76.224 - 174.143.77.31 us -174.143.77.32 - 174.143.77.39 ca -174.143.77.40 - 174.143.77.111 us -174.143.77.112 - 174.143.77.119 au -174.143.77.120 - 174.143.77.127 gb -174.143.77.128 - 174.143.77.151 us -174.143.77.152 - 174.143.77.159 au -174.143.77.160 - 174.143.77.223 us -174.143.77.224 - 174.143.77.231 gb -174.143.77.232 - 174.143.77.239 ie -174.143.77.240 - 174.143.78.183 us -174.143.78.184 - 174.143.78.191 au -174.143.78.192 - 174.143.78.215 us -174.143.78.216 - 174.143.78.223 au -174.143.78.224 - 174.143.78.231 il -174.143.78.232 - 174.143.78.239 gb -174.143.78.240 - 174.143.79.7 us -174.143.79.8 - 174.143.79.15 tw -174.143.79.16 - 174.143.79.31 us -174.143.79.32 - 174.143.79.39 in -174.143.79.40 - 174.143.79.87 us -174.143.79.88 - 174.143.79.95 gb -174.143.79.96 - 174.143.84.47 us -174.143.84.48 - 174.143.84.55 gb -174.143.84.56 - 174.143.84.63 us -174.143.84.64 - 174.143.84.71 ca -174.143.84.72 - 174.143.84.143 us -174.143.84.144 - 174.143.84.151 au -174.143.84.152 - 174.143.85.15 us -174.143.85.16 - 174.143.85.23 ca -174.143.85.24 - 174.143.85.39 us -174.143.85.40 - 174.143.85.47 hk -174.143.85.48 - 174.143.85.191 us -174.143.85.192 - 174.143.85.199 gb -174.143.85.200 - 174.143.85.207 ca -174.143.85.208 - 174.143.85.215 us -174.143.85.216 - 174.143.85.223 il -174.143.85.224 - 174.143.85.247 us -174.143.85.248 - 174.143.85.255 gb -174.143.86.0 - 174.143.87.7 us -174.143.87.8 - 174.143.87.15 mx -174.143.87.16 - 174.143.87.103 us -174.143.87.104 - 174.143.87.111 gb -174.143.87.112 - 174.143.87.143 us -174.143.87.144 - 174.143.87.151 gb -174.143.87.152 - 174.143.87.159 il -174.143.87.160 - 174.143.87.167 us -174.143.87.168 - 174.143.87.175 jp -174.143.87.176 - 174.143.87.191 us -174.143.87.192 - 174.143.87.199 ca -174.143.87.200 - 174.143.88.127 us -174.143.88.128 - 174.143.88.191 bd -174.143.88.192 - 174.143.90.255 us -174.143.91.0 - 174.143.91.31 ca -174.143.91.32 - 174.143.92.7 us -174.143.92.8 - 174.143.92.23 gb -174.143.92.24 - 174.143.92.111 us -174.143.92.112 - 174.143.92.119 mx -174.143.92.120 - 174.143.92.127 hu -174.143.92.128 - 174.143.93.39 us -174.143.93.40 - 174.143.93.47 gb -174.143.93.48 - 174.143.93.71 us -174.143.93.72 - 174.143.93.79 au -174.143.93.80 - 174.143.93.95 us -174.143.93.96 - 174.143.93.103 ca -174.143.93.104 - 174.143.93.199 us -174.143.93.200 - 174.143.93.207 ca -174.143.93.208 - 174.143.94.15 us -174.143.94.16 - 174.143.94.23 ca -174.143.94.24 - 174.143.94.127 us -174.143.94.128 - 174.143.94.135 mx -174.143.94.136 - 174.143.94.255 us -174.143.95.0 - 174.143.95.7 sg -174.143.95.8 - 174.143.95.15 us -174.143.95.16 - 174.143.95.23 ca -174.143.95.24 - 174.143.95.191 us -174.143.95.192 - 174.143.95.199 mx -174.143.95.200 - 174.143.95.223 us -174.143.95.224 - 174.143.95.231 il -174.143.95.232 - 174.143.96.47 us -174.143.96.48 - 174.143.96.55 ca -174.143.96.56 - 174.143.96.63 au -174.143.96.64 - 174.143.96.79 us -174.143.96.80 - 174.143.96.87 fr -174.143.96.88 - 174.143.96.143 us -174.143.96.144 - 174.143.96.151 sg -174.143.96.152 - 174.143.96.167 us -174.143.96.168 - 174.143.96.175 in -174.143.96.176 - 174.143.96.223 us -174.143.96.224 - 174.143.96.231 no -174.143.96.232 - 174.143.96.247 us -174.143.96.248 - 174.143.96.255 mx -174.143.97.0 - 174.143.97.159 us -174.143.97.160 - 174.143.97.167 gb -174.143.97.168 - 174.143.98.47 us -174.143.98.48 - 174.143.98.55 in -174.143.98.56 - 174.143.98.79 us -174.143.98.80 - 174.143.98.87 ca -174.143.98.88 - 174.143.98.199 us -174.143.98.200 - 174.143.98.207 in -174.143.98.208 - 174.143.100.223 us -174.143.100.224 - 174.143.100.239 ca -174.143.100.240 - 174.143.100.255 us -174.143.101.0 - 174.143.101.15 ca -174.143.101.16 - 174.143.101.31 us -174.143.101.32 - 174.143.101.47 ca -174.143.101.48 - 174.143.101.111 us +174.142.0.0 - 174.142.255.255 ca +174.143.0.0 - 174.143.101.111 us 174.143.101.112 - 174.143.101.127 ca -174.143.101.128 - 174.143.102.79 us -174.143.102.80 - 174.143.102.95 in -174.143.102.96 - 174.143.102.239 us -174.143.102.240 - 174.143.102.255 gb -174.143.103.0 - 174.143.104.23 us -174.143.104.24 - 174.143.104.31 il -174.143.104.32 - 174.143.104.39 ca -174.143.104.40 - 174.143.104.103 us -174.143.104.104 - 174.143.104.111 gb -174.143.104.112 - 174.143.105.79 us -174.143.105.80 - 174.143.105.87 ch -174.143.105.88 - 174.143.105.135 us -174.143.105.136 - 174.143.105.143 ca -174.143.105.144 - 174.143.106.111 us -174.143.106.112 - 174.143.106.119 ca -174.143.106.120 - 174.143.106.127 us -174.143.106.128 - 174.143.106.135 cn -174.143.106.136 - 174.143.106.143 us -174.143.106.144 - 174.143.106.151 ca -174.143.106.152 - 174.143.106.175 us -174.143.106.176 - 174.143.106.183 in -174.143.106.184 - 174.143.107.15 us -174.143.107.16 - 174.143.107.23 vg -174.143.107.24 - 174.143.107.31 us -174.143.107.32 - 174.143.107.39 in -174.143.107.40 - 174.143.107.215 us -174.143.107.216 - 174.143.107.223 gb -174.143.107.224 - 174.143.108.23 us -174.143.108.24 - 174.143.108.31 mx -174.143.108.32 - 174.143.108.55 us -174.143.108.56 - 174.143.108.63 ph -174.143.108.64 - 174.143.108.79 us -174.143.108.80 - 174.143.108.87 ca -174.143.108.88 - 174.143.108.231 us -174.143.108.232 - 174.143.108.239 in -174.143.108.240 - 174.143.108.247 us -174.143.108.248 - 174.143.108.255 ie -174.143.109.0 - 174.143.109.55 us -174.143.109.56 - 174.143.109.63 in -174.143.109.64 - 174.143.109.71 us -174.143.109.72 - 174.143.109.79 in -174.143.109.80 - 174.143.109.135 us -174.143.109.136 - 174.143.109.143 il -174.143.109.144 - 174.143.109.167 us -174.143.109.168 - 174.143.109.175 ca -174.143.109.176 - 174.143.109.207 us -174.143.109.208 - 174.143.109.215 za -174.143.109.216 - 174.143.111.15 us -174.143.111.16 - 174.143.111.23 au -174.143.111.24 - 174.143.111.167 us -174.143.111.168 - 174.143.111.175 br -174.143.111.176 - 174.143.111.183 gb -174.143.111.184 - 174.143.111.215 us -174.143.111.216 - 174.143.111.223 au -174.143.111.224 - 174.143.113.31 us -174.143.113.32 - 174.143.113.39 ca -174.143.113.40 - 174.143.113.215 us -174.143.113.216 - 174.143.113.223 ca -174.143.113.224 - 174.143.114.63 us -174.143.114.64 - 174.143.114.71 se -174.143.114.72 - 174.143.114.111 us -174.143.114.112 - 174.143.114.119 ca -174.143.114.120 - 174.143.114.239 us -174.143.114.240 - 174.143.114.247 nz -174.143.114.248 - 174.143.115.255 us -174.143.116.0 - 174.143.116.7 il -174.143.116.8 - 174.143.116.79 us -174.143.116.80 - 174.143.116.87 bg -174.143.116.88 - 174.143.116.111 us -174.143.116.112 - 174.143.116.119 ca -174.143.116.120 - 174.143.118.47 us -174.143.118.48 - 174.143.118.55 ca -174.143.118.56 - 174.143.120.31 us -174.143.120.32 - 174.143.120.39 in -174.143.120.40 - 174.143.120.95 us -174.143.120.96 - 174.143.120.103 be -174.143.120.104 - 174.143.120.143 us -174.143.120.144 - 174.143.120.151 in -174.143.120.152 - 174.143.120.167 us -174.143.120.168 - 174.143.120.175 in -174.143.120.176 - 174.143.120.255 us -174.143.121.0 - 174.143.121.7 gb -174.143.121.8 - 174.143.121.151 us -174.143.121.152 - 174.143.121.159 ca -174.143.121.160 - 174.143.121.167 in -174.143.121.168 - 174.143.121.247 us -174.143.121.248 - 174.143.121.255 mx -174.143.122.0 - 174.143.123.127 us -174.143.123.128 - 174.143.123.135 ca -174.143.123.136 - 174.143.126.39 us -174.143.126.40 - 174.143.126.47 gb -174.143.126.48 - 174.143.126.127 us -174.143.126.128 - 174.143.126.135 ca -174.143.126.136 - 174.143.126.191 us -174.143.126.192 - 174.143.126.199 gb -174.143.126.200 - 174.143.127.23 us -174.143.127.24 - 174.143.127.31 ca -174.143.127.32 - 174.143.132.63 us -174.143.132.64 - 174.143.132.127 ca -174.143.132.128 - 174.143.133.103 us -174.143.133.104 - 174.143.133.111 id -174.143.133.112 - 174.143.138.39 us -174.143.138.40 - 174.143.138.47 in -174.143.138.48 - 174.143.160.127 us -174.143.160.128 - 174.143.160.191 bd -174.143.160.192 - 174.143.160.223 us -174.143.160.224 - 174.143.160.255 bd -174.143.161.0 - 174.143.161.31 us -174.143.161.32 - 174.143.161.127 bd -174.143.161.128 - 174.143.161.159 us -174.143.161.160 - 174.143.161.191 bd -174.143.161.192 - 174.143.164.39 us -174.143.164.40 - 174.143.164.47 za -174.143.164.48 - 174.143.164.55 il -174.143.164.56 - 174.143.164.71 us -174.143.164.72 - 174.143.164.79 ro -174.143.164.80 - 174.143.164.87 gr -174.143.164.88 - 174.143.164.95 in -174.143.164.96 - 174.143.164.135 us -174.143.164.136 - 174.143.164.143 jp -174.143.164.144 - 174.143.164.159 us -174.143.164.160 - 174.143.164.167 in -174.143.164.168 - 174.143.164.199 us -174.143.164.200 - 174.143.164.207 ca -174.143.164.208 - 174.143.164.231 us -174.143.164.232 - 174.143.164.239 gb -174.143.164.240 - 174.143.165.79 us -174.143.165.80 - 174.143.165.87 bo -174.143.165.88 - 174.143.167.103 us -174.143.167.104 - 174.143.167.111 cz -174.143.167.112 - 174.143.167.127 us -174.143.167.128 - 174.143.167.135 in -174.143.167.136 - 174.143.167.167 us -174.143.167.168 - 174.143.167.175 au -174.143.167.176 - 174.143.167.223 us -174.143.167.224 - 174.143.167.231 il -174.143.167.232 - 174.143.190.23 us -174.143.190.24 - 174.143.190.31 ca -174.143.190.32 - 174.143.190.55 us -174.143.190.56 - 174.143.190.63 nz -174.143.190.64 - 174.143.190.71 us -174.143.190.72 - 174.143.190.79 nz -174.143.190.80 - 174.143.190.111 us -174.143.190.112 - 174.143.190.119 gb -174.143.190.120 - 174.143.192.255 us -174.143.193.0 - 174.143.193.7 ca -174.143.193.8 - 174.143.193.15 us -174.143.193.16 - 174.143.193.23 pk -174.143.193.24 - 174.143.193.183 us -174.143.193.184 - 174.143.193.191 za -174.143.193.192 - 174.143.193.239 us -174.143.193.240 - 174.143.193.255 gb -174.143.194.0 - 174.143.198.63 us -174.143.198.64 - 174.143.198.95 no -174.143.198.96 - 174.143.216.143 us -174.143.216.144 - 174.143.216.159 gb -174.143.216.160 - 174.143.216.207 us -174.143.216.208 - 174.143.216.223 ca -174.143.216.224 - 174.143.217.95 us -174.143.217.96 - 174.143.217.111 il -174.143.217.112 - 174.143.217.175 us -174.143.217.176 - 174.143.217.191 in -174.143.217.192 - 174.143.218.63 us -174.143.218.64 - 174.143.218.79 mx -174.143.218.80 - 174.143.220.207 us -174.143.220.208 - 174.143.220.223 gb -174.143.220.224 - 174.143.222.95 us -174.143.222.96 - 174.143.222.111 gb -174.143.222.112 - 174.143.222.127 us -174.143.222.128 - 174.143.222.143 gb -174.143.222.144 - 174.143.223.207 us -174.143.223.208 - 174.143.223.223 ca -174.143.223.224 - 174.143.224.63 us -174.143.224.64 - 174.143.224.95 gb -174.143.224.96 - 174.143.227.127 us -174.143.227.128 - 174.143.227.159 gb -174.143.227.160 - 174.143.227.191 us -174.143.227.192 - 174.143.227.223 gb -174.143.227.224 - 174.143.228.255 us -174.143.229.0 - 174.143.229.15 gb -174.143.229.16 - 174.143.229.175 us -174.143.229.176 - 174.143.229.191 sg -174.143.229.192 - 174.143.230.47 us -174.143.230.48 - 174.143.230.63 gb -174.143.230.64 - 174.143.230.191 us -174.143.230.192 - 174.143.230.207 au -174.143.230.208 - 174.143.230.223 us -174.143.230.224 - 174.143.230.239 gb -174.143.230.240 - 174.143.231.223 us -174.143.231.224 - 174.143.231.239 au -174.143.231.240 - 174.255.255.255 us +174.143.101.128 - 174.255.255.255 us 175.0.0.0 - 175.27.255.255 cn 175.28.0.0 - 175.28.3.255 kh 175.28.4.0 - 175.28.7.255 jp @@ -74419,17 +58933,33 @@ 175.30.0.0 - 175.31.255.255 cn 175.32.0.0 - 175.39.255.255 au 175.40.0.0 - 175.40.255.255 in -175.41.0.0 - 175.41.15.255 kr +175.41.0.0 - 175.41.0.255 ph +175.41.1.0 - 175.41.1.255 id +175.41.2.0 - 175.41.2.255 ae +175.41.3.0 - 175.41.4.255 sg +175.41.5.0 - 175.41.5.255 iq +175.41.6.0 - 175.41.6.255 au +175.41.7.0 - 175.41.8.255 in +175.41.9.0 - 175.41.12.255 hk +175.41.13.0 - 175.41.13.255 il +175.41.14.0 - 175.41.14.255 eg +175.41.15.0 - 175.41.15.255 in 175.41.16.0 - 175.41.31.255 hk 175.41.32.0 - 175.41.39.255 jp 175.41.40.0 - 175.41.47.255 au 175.41.48.0 - 175.41.63.255 tw 175.41.64.0 - 175.41.127.255 jp -175.41.128.0 - 175.41.191.255 sg +175.41.128.0 - 175.41.132.255 sg +175.41.133.0 - 175.41.133.255 ap +175.41.134.0 - 175.41.191.255 sg 175.41.192.0 - 175.41.255.255 jp 175.42.0.0 - 175.44.255.255 cn 175.45.0.0 - 175.45.63.255 hk -175.45.64.0 - 175.45.135.255 au +175.45.64.0 - 175.45.95.255 au +175.45.96.0 - 175.45.96.255 nz +175.45.97.0 - 175.45.101.255 au +175.45.102.0 - 175.45.102.255 nz +175.45.103.0 - 175.45.135.255 au 175.45.136.0 - 175.45.143.255 jp 175.45.144.0 - 175.45.159.255 au 175.45.160.0 - 175.45.167.255 kr @@ -74442,7 +58972,9 @@ 175.96.0.0 - 175.99.255.255 tw 175.100.0.0 - 175.100.127.255 kh 175.100.128.0 - 175.100.163.255 in -175.100.164.0 - 175.100.167.255 hk +175.100.164.0 - 175.100.164.255 hk +175.100.165.0 - 175.100.165.255 us +175.100.166.0 - 175.100.167.255 hk 175.100.168.0 - 175.100.191.255 in 175.100.192.0 - 175.100.207.255 hk 175.100.208.0 - 175.100.255.255 jp @@ -74474,9 +59006,15 @@ 175.111.96.0 - 175.111.99.255 hk 175.111.100.0 - 175.111.103.255 nz 175.111.104.0 - 175.111.107.255 sg +175.111.108.0 - 175.111.111.255 cn 175.111.112.0 - 175.111.119.255 id 175.111.120.0 - 175.111.127.255 jp -175.111.128.0 - 175.111.191.255 pk +175.111.128.0 - 175.111.143.255 in +175.111.144.0 - 175.111.175.255 cn +175.111.176.0 - 175.111.179.255 au +175.111.180.0 - 175.111.183.255 in +175.111.184.0 - 175.111.187.255 cn +175.111.188.0 - 175.111.191.255 in 175.111.192.0 - 175.111.255.255 tw 175.112.0.0 - 175.127.255.255 kr 175.128.0.0 - 175.135.255.255 jp @@ -74487,7 +59025,8 @@ 175.158.0.0 - 175.158.31.255 kr 175.158.32.0 - 175.158.63.255 id 175.158.64.0 - 175.158.95.255 in -175.158.96.0 - 175.158.99.255 bd +175.158.96.0 - 175.158.99.255 cn +175.158.100.0 - 175.158.103.255 hk 175.158.104.0 - 175.158.111.255 au 175.158.112.0 - 175.158.127.255 jp 175.158.128.0 - 175.158.191.255 nc @@ -74497,14 +59036,34 @@ 175.176.0.0 - 175.176.127.255 ph 175.176.128.0 - 175.176.143.255 kr 175.176.144.0 - 175.176.151.255 to +175.176.152.0 - 175.176.155.255 hk +175.176.156.0 - 175.176.159.255 cn 175.176.160.0 - 175.176.167.255 id -175.176.168.0 - 175.176.175.255 sg +175.176.168.0 - 175.176.169.255 jp +175.176.170.0 - 175.176.170.255 sg +175.176.171.0 - 175.176.171.15 hk +175.176.171.16 - 175.176.171.111 sg +175.176.171.112 - 175.176.171.119 hk +175.176.171.120 - 175.176.171.127 sg +175.176.171.128 - 175.176.171.159 hk +175.176.171.160 - 175.176.171.255 sg +175.176.172.0 - 175.176.172.15 hk +175.176.172.16 - 175.176.173.255 sg +175.176.174.0 - 175.176.174.15 jp +175.176.174.16 - 175.176.175.255 sg +175.176.176.0 - 175.176.179.255 cn +175.176.180.0 - 175.176.183.255 hk +175.176.184.0 - 175.176.187.255 in +175.176.188.0 - 175.176.191.255 cn 175.176.192.0 - 175.176.195.255 in 175.176.196.0 - 175.176.199.255 jp 175.176.200.0 - 175.176.215.255 au 175.176.216.0 - 175.176.219.255 nz 175.176.220.0 - 175.176.223.255 th -175.176.224.0 - 175.176.255.255 hk +175.176.224.0 - 175.176.243.255 hk +175.176.244.0 - 175.176.244.255 au +175.176.245.0 - 175.176.245.255 af +175.176.246.0 - 175.176.255.255 hk 175.177.0.0 - 175.177.255.255 jp 175.178.0.0 - 175.178.255.255 cn 175.179.0.0 - 175.179.255.255 jp @@ -74520,29 +59079,22 @@ 175.192.0.0 - 175.255.255.255 kr 176.0.0.0 - 176.7.255.255 de 176.8.0.0 - 176.8.255.255 ua -176.9.0.0 - 176.9.218.207 de -176.9.218.208 - 176.9.218.215 it -176.9.218.216 - 176.9.227.239 de -176.9.227.240 - 176.9.227.247 es -176.9.227.248 - 176.9.228.23 de -176.9.228.24 - 176.9.228.31 ch -176.9.228.32 - 176.9.239.239 de -176.9.239.240 - 176.9.239.255 it -176.9.240.0 - 176.9.246.215 de -176.9.246.216 - 176.9.246.223 it -176.9.246.224 - 176.9.251.87 de -176.9.251.88 - 176.9.251.95 it -176.9.251.96 - 176.9.255.255 de +176.9.0.0 - 176.9.75.42 de +176.9.75.43 - 176.9.75.43 a1 +176.9.75.44 - 176.9.255.255 de 176.10.0.0 - 176.10.31.255 it 176.10.32.0 - 176.10.39.255 is 176.10.40.0 - 176.10.47.255 sk 176.10.48.0 - 176.10.55.255 de 176.10.56.0 - 176.10.63.255 it 176.10.64.0 - 176.10.79.255 es -176.10.80.0 - 176.10.80.135 gb -176.10.80.136 - 176.10.80.255 eu +176.10.80.0 - 176.10.80.255 eu 176.10.81.0 - 176.10.81.15 gb -176.10.81.16 - 176.10.87.255 eu +176.10.81.16 - 176.10.81.255 eu +176.10.82.0 - 176.10.83.255 gb +176.10.84.0 - 176.10.85.255 eu +176.10.86.0 - 176.10.86.255 gb +176.10.87.0 - 176.10.87.255 eu 176.10.88.0 - 176.10.95.255 be 176.10.96.0 - 176.10.127.255 ch 176.10.128.0 - 176.10.227.63 se @@ -74554,7 +59106,9 @@ 176.12.80.0 - 176.12.87.255 es 176.12.88.0 - 176.12.95.255 it 176.12.96.0 - 176.12.103.255 ru -176.12.104.0 - 176.12.111.255 gb +176.12.104.0 - 176.12.107.137 gb +176.12.107.138 - 176.12.107.139 ie +176.12.107.140 - 176.12.111.255 gb 176.12.112.0 - 176.12.127.255 cz 176.12.128.0 - 176.13.255.255 il 176.14.0.0 - 176.15.255.255 ru @@ -74568,1793 +59122,245 @@ 176.28.88.0 - 176.28.127.255 es 176.28.128.0 - 176.29.255.255 jo 176.30.0.0 - 176.30.255.255 tr -176.31.0.0 - 176.31.31.255 fr -176.31.32.0 - 176.31.32.3 es -176.31.32.4 - 176.31.32.7 nl -176.31.32.8 - 176.31.32.15 de -176.31.32.16 - 176.31.32.51 fr -176.31.32.52 - 176.31.32.55 gb -176.31.32.56 - 176.31.32.63 fr -176.31.32.64 - 176.31.32.79 pl -176.31.32.80 - 176.31.32.95 gb -176.31.32.96 - 176.31.32.127 fr -176.31.32.128 - 176.31.32.135 es -176.31.32.136 - 176.31.32.139 pt -176.31.32.140 - 176.31.32.143 pl -176.31.32.144 - 176.31.32.159 fr -176.31.32.160 - 176.31.32.191 de -176.31.32.192 - 176.31.32.255 gb -176.31.33.0 - 176.31.33.191 fr -176.31.33.192 - 176.31.33.199 gb -176.31.33.200 - 176.31.33.203 pl -176.31.33.204 - 176.31.33.207 de -176.31.33.208 - 176.31.33.223 fr -176.31.33.224 - 176.31.34.31 de -176.31.34.32 - 176.31.34.39 nl -176.31.34.40 - 176.31.34.47 es -176.31.34.48 - 176.31.34.51 pl -176.31.34.52 - 176.31.34.55 it -176.31.34.56 - 176.31.34.63 fr -176.31.34.64 - 176.31.34.79 it -176.31.34.80 - 176.31.34.95 es -176.31.34.96 - 176.31.34.111 fr -176.31.34.112 - 176.31.34.115 cz -176.31.34.116 - 176.31.34.119 be -176.31.34.120 - 176.31.34.127 ch -176.31.34.128 - 176.31.34.255 pl -176.31.35.0 - 176.31.35.255 gb -176.31.36.0 - 176.31.36.7 pl -176.31.36.8 - 176.31.36.11 fr -176.31.36.12 - 176.31.36.15 gb -176.31.36.16 - 176.31.36.31 fr -176.31.36.32 - 176.31.36.39 gb -176.31.36.40 - 176.31.36.43 fr -176.31.36.44 - 176.31.36.47 es -176.31.36.48 - 176.31.36.83 fr -176.31.36.84 - 176.31.36.87 ie -176.31.36.88 - 176.31.36.127 fr -176.31.36.128 - 176.31.36.255 pl -176.31.37.0 - 176.31.37.63 pt -176.31.37.64 - 176.31.37.127 fr -176.31.37.128 - 176.31.37.159 de -176.31.37.160 - 176.31.37.163 fr -176.31.37.164 - 176.31.37.167 pl -176.31.37.168 - 176.31.37.171 fr -176.31.37.172 - 176.31.37.175 it -176.31.37.176 - 176.31.37.191 ch -176.31.37.192 - 176.31.37.223 fr -176.31.37.224 - 176.31.37.227 pl -176.31.37.228 - 176.31.37.231 fr -176.31.37.232 - 176.31.37.235 pl -176.31.37.236 - 176.31.37.255 de -176.31.38.0 - 176.31.38.31 fr -176.31.38.32 - 176.31.38.39 cz -176.31.38.40 - 176.31.38.43 ch -176.31.38.44 - 176.31.38.47 de -176.31.38.48 - 176.31.38.51 es -176.31.38.52 - 176.31.38.55 fr -176.31.38.56 - 176.31.38.63 de -176.31.38.64 - 176.31.38.127 fr -176.31.38.128 - 176.31.38.159 de -176.31.38.160 - 176.31.38.167 fr -176.31.38.168 - 176.31.38.175 pt -176.31.38.176 - 176.31.38.191 fr -176.31.38.192 - 176.31.38.223 de -176.31.38.224 - 176.31.38.239 es -176.31.38.240 - 176.31.38.243 pt -176.31.38.244 - 176.31.38.247 be -176.31.38.248 - 176.31.38.251 fr -176.31.38.252 - 176.31.38.255 es -176.31.39.0 - 176.31.39.31 fr -176.31.39.32 - 176.31.39.35 gb -176.31.39.36 - 176.31.39.51 fr -176.31.39.52 - 176.31.39.55 pl -176.31.39.56 - 176.31.39.59 de -176.31.39.60 - 176.31.39.95 fr -176.31.39.96 - 176.31.39.127 es -176.31.39.128 - 176.31.39.131 fr -176.31.39.132 - 176.31.39.135 de -176.31.39.136 - 176.31.39.143 fr -176.31.39.144 - 176.31.39.159 fi -176.31.39.160 - 176.31.39.175 fr -176.31.39.176 - 176.31.39.183 nl -176.31.39.184 - 176.31.39.191 fr -176.31.39.192 - 176.31.39.223 gb -176.31.39.224 - 176.31.40.47 fr -176.31.40.48 - 176.31.40.63 it -176.31.40.64 - 176.31.40.111 fr -176.31.40.112 - 176.31.40.127 be -176.31.40.128 - 176.31.40.143 fr -176.31.40.144 - 176.31.40.151 gb -176.31.40.152 - 176.31.40.191 pl -176.31.40.192 - 176.31.40.207 ie -176.31.40.208 - 176.31.40.255 fr -176.31.41.0 - 176.31.41.7 gb -176.31.41.8 - 176.31.41.15 pl -176.31.41.16 - 176.31.41.79 fr -176.31.41.80 - 176.31.41.83 pt -176.31.41.84 - 176.31.41.87 fr -176.31.41.88 - 176.31.41.91 de -176.31.41.92 - 176.31.41.95 fr -176.31.41.96 - 176.31.41.127 be -176.31.41.128 - 176.31.41.207 fr -176.31.41.208 - 176.31.41.215 de -176.31.41.216 - 176.31.41.255 fr -176.31.42.0 - 176.31.42.255 nl -176.31.43.0 - 176.31.43.7 fr -176.31.43.8 - 176.31.43.11 es -176.31.43.12 - 176.31.43.15 gb -176.31.43.16 - 176.31.43.31 fr -176.31.43.32 - 176.31.43.35 de -176.31.43.36 - 176.31.43.39 fr -176.31.43.40 - 176.31.43.47 pl -176.31.43.48 - 176.31.43.51 gb -176.31.43.52 - 176.31.43.55 fr -176.31.43.56 - 176.31.43.59 gb -176.31.43.60 - 176.31.43.63 ch -176.31.43.64 - 176.31.43.159 fr -176.31.43.160 - 176.31.43.183 es -176.31.43.184 - 176.31.43.191 fr -176.31.43.192 - 176.31.43.199 ch -176.31.43.200 - 176.31.43.207 de -176.31.43.208 - 176.31.43.215 gb -176.31.43.216 - 176.31.43.219 de -176.31.43.220 - 176.31.43.223 es -176.31.43.224 - 176.31.43.247 fr -176.31.43.248 - 176.31.43.251 pl -176.31.43.252 - 176.31.43.255 ie -176.31.44.0 - 176.31.44.95 fr -176.31.44.96 - 176.31.44.127 gb -176.31.44.128 - 176.31.44.175 fr -176.31.44.176 - 176.31.44.179 pt -176.31.44.180 - 176.31.44.183 es -176.31.44.184 - 176.31.44.187 gb -176.31.44.188 - 176.31.44.191 es -176.31.44.192 - 176.31.44.207 fr -176.31.44.208 - 176.31.44.215 cz -176.31.44.216 - 176.31.44.223 fr -176.31.44.224 - 176.31.44.255 es -176.31.45.0 - 176.31.45.31 fr -176.31.45.32 - 176.31.45.47 pl -176.31.45.48 - 176.31.45.55 fr -176.31.45.56 - 176.31.45.59 ch -176.31.45.60 - 176.31.45.63 fr -176.31.45.64 - 176.31.45.67 de -176.31.45.68 - 176.31.45.71 it -176.31.45.72 - 176.31.45.75 fr -176.31.45.76 - 176.31.45.79 ch -176.31.45.80 - 176.31.45.95 es -176.31.45.96 - 176.31.45.103 fr -176.31.45.104 - 176.31.45.107 de -176.31.45.108 - 176.31.45.111 pl -176.31.45.112 - 176.31.45.119 fr -176.31.45.120 - 176.31.45.123 de -176.31.45.124 - 176.31.45.127 es -176.31.45.128 - 176.31.45.131 pl -176.31.45.132 - 176.31.45.135 fr -176.31.45.136 - 176.31.45.143 ie -176.31.45.144 - 176.31.45.163 fr -176.31.45.164 - 176.31.45.167 cz -176.31.45.168 - 176.31.45.191 fr -176.31.45.192 - 176.31.45.223 gb -176.31.45.224 - 176.31.45.239 fr -176.31.45.240 - 176.31.45.255 gb -176.31.46.0 - 176.31.46.11 fr -176.31.46.12 - 176.31.46.15 de -176.31.46.16 - 176.31.46.39 gb -176.31.46.40 - 176.31.46.47 pt -176.31.46.48 - 176.31.46.63 es -176.31.46.64 - 176.31.46.79 fr -176.31.46.80 - 176.31.46.95 be -176.31.46.96 - 176.31.46.127 gb -176.31.46.128 - 176.31.46.131 pl -176.31.46.132 - 176.31.46.135 fr -176.31.46.136 - 176.31.46.139 es -176.31.46.140 - 176.31.46.143 de -176.31.46.144 - 176.31.46.147 fr -176.31.46.148 - 176.31.46.151 ie +176.31.0.0 - 176.31.1.59 fr +176.31.1.60 - 176.31.1.63 de +176.31.1.64 - 176.31.1.191 fr +176.31.1.192 - 176.31.1.255 es +176.31.2.0 - 176.31.5.15 fr +176.31.5.16 - 176.31.5.19 de +176.31.5.20 - 176.31.9.63 fr +176.31.9.64 - 176.31.9.79 es +176.31.9.80 - 176.31.10.63 fr +176.31.10.64 - 176.31.10.67 es +176.31.10.68 - 176.31.10.223 fr +176.31.10.224 - 176.31.10.239 gb +176.31.10.240 - 176.31.13.103 fr +176.31.13.104 - 176.31.13.107 es +176.31.13.108 - 176.31.13.191 fr +176.31.13.192 - 176.31.13.199 nl +176.31.13.200 - 176.31.14.99 fr +176.31.14.100 - 176.31.14.103 es +176.31.14.104 - 176.31.14.167 fr +176.31.14.168 - 176.31.14.171 nl +176.31.14.172 - 176.31.14.187 fr +176.31.14.188 - 176.31.14.191 es +176.31.14.192 - 176.31.15.63 fr +176.31.15.64 - 176.31.15.67 es +176.31.15.68 - 176.31.17.47 fr +176.31.17.48 - 176.31.17.51 es +176.31.17.52 - 176.31.17.175 fr +176.31.17.176 - 176.31.17.179 es +176.31.17.180 - 176.31.20.3 fr +176.31.20.4 - 176.31.20.7 it +176.31.20.8 - 176.31.20.11 es +176.31.20.12 - 176.31.20.23 fr +176.31.20.24 - 176.31.20.27 es +176.31.20.28 - 176.31.24.23 fr +176.31.24.24 - 176.31.24.31 de +176.31.24.32 - 176.31.25.127 fr +176.31.25.128 - 176.31.25.159 it +176.31.25.160 - 176.31.29.79 fr +176.31.29.80 - 176.31.29.83 de +176.31.29.84 - 176.31.30.83 fr +176.31.30.84 - 176.31.30.87 it +176.31.30.88 - 176.31.30.115 fr +176.31.30.116 - 176.31.30.119 nl +176.31.30.120 - 176.31.31.183 fr +176.31.31.184 - 176.31.31.184 es +176.31.31.185 - 176.31.31.191 fr +176.31.31.192 - 176.31.31.255 es +176.31.32.0 - 176.31.32.19 fr +176.31.32.20 - 176.31.32.23 de +176.31.32.24 - 176.31.32.51 fr +176.31.32.52 - 176.31.32.55 de +176.31.32.56 - 176.31.33.103 fr +176.31.33.104 - 176.31.33.111 it +176.31.33.112 - 176.31.34.59 fr +176.31.34.60 - 176.31.34.63 es +176.31.34.64 - 176.31.34.187 fr +176.31.34.188 - 176.31.34.191 de +176.31.34.192 - 176.31.35.143 fr +176.31.35.144 - 176.31.35.159 nl +176.31.35.160 - 176.31.36.31 fr +176.31.36.32 - 176.31.36.39 be +176.31.36.40 - 176.31.37.143 fr +176.31.37.144 - 176.31.37.147 es +176.31.37.148 - 176.31.39.191 fr +176.31.39.192 - 176.31.39.207 es +176.31.39.208 - 176.31.41.31 fr +176.31.41.32 - 176.31.41.39 pt +176.31.41.40 - 176.31.41.215 fr +176.31.41.216 - 176.31.41.219 ch +176.31.41.220 - 176.31.43.251 fr +176.31.43.252 - 176.31.43.255 es +176.31.44.0 - 176.31.44.3 de +176.31.44.4 - 176.31.46.11 fr +176.31.46.12 - 176.31.46.15 pl +176.31.46.16 - 176.31.46.147 fr +176.31.46.148 - 176.31.46.151 nl 176.31.46.152 - 176.31.46.159 fr -176.31.46.160 - 176.31.46.175 pl -176.31.46.176 - 176.31.46.179 fr -176.31.46.180 - 176.31.46.183 it -176.31.46.184 - 176.31.46.187 gb -176.31.46.188 - 176.31.46.199 fr -176.31.46.200 - 176.31.46.203 pl -176.31.46.204 - 176.31.46.207 es -176.31.46.208 - 176.31.46.223 gb -176.31.46.224 - 176.31.46.227 es -176.31.46.228 - 176.31.46.231 cz -176.31.46.232 - 176.31.46.239 ch -176.31.46.240 - 176.31.46.255 fi -176.31.47.0 - 176.31.48.31 gb -176.31.48.32 - 176.31.48.47 fr -176.31.48.48 - 176.31.48.63 es -176.31.48.64 - 176.31.48.79 fr -176.31.48.80 - 176.31.48.83 pl -176.31.48.84 - 176.31.48.87 nl -176.31.48.88 - 176.31.48.91 fr -176.31.48.92 - 176.31.48.95 gb -176.31.48.96 - 176.31.48.127 pl -176.31.48.128 - 176.31.48.143 gb -176.31.48.144 - 176.31.48.147 pl -176.31.48.148 - 176.31.48.151 fr -176.31.48.152 - 176.31.48.159 pl -176.31.48.160 - 176.31.48.175 fr -176.31.48.176 - 176.31.48.179 pl -176.31.48.180 - 176.31.48.183 fr -176.31.48.184 - 176.31.48.187 nl -176.31.48.188 - 176.31.48.191 pt -176.31.48.192 - 176.31.48.223 fr -176.31.48.224 - 176.31.48.227 gb -176.31.48.228 - 176.31.49.255 fr -176.31.50.0 - 176.31.50.3 pl -176.31.50.4 - 176.31.50.7 fr -176.31.50.8 - 176.31.50.11 nl -176.31.50.12 - 176.31.50.15 lt -176.31.50.16 - 176.31.50.19 pl -176.31.50.20 - 176.31.50.27 it -176.31.50.28 - 176.31.50.47 gb -176.31.50.48 - 176.31.50.51 fr -176.31.50.52 - 176.31.50.59 es -176.31.50.60 - 176.31.50.63 nl -176.31.50.64 - 176.31.50.95 it -176.31.50.96 - 176.31.50.99 de -176.31.50.100 - 176.31.50.103 pl -176.31.50.104 - 176.31.50.107 fr -176.31.50.108 - 176.31.50.143 pl -176.31.50.144 - 176.31.50.147 gb -176.31.50.148 - 176.31.50.151 it -176.31.50.152 - 176.31.50.159 ie -176.31.50.160 - 176.31.50.175 fr -176.31.50.176 - 176.31.50.179 pt -176.31.50.180 - 176.31.50.183 es -176.31.50.184 - 176.31.50.191 fr -176.31.50.192 - 176.31.50.199 ch -176.31.50.200 - 176.31.50.203 it -176.31.50.204 - 176.31.50.207 fr -176.31.50.208 - 176.31.50.223 ch -176.31.50.224 - 176.31.50.231 de -176.31.50.232 - 176.31.50.239 es -176.31.50.240 - 176.31.50.255 fr -176.31.51.0 - 176.31.51.3 nl -176.31.51.4 - 176.31.51.7 pl -176.31.51.8 - 176.31.63.255 fr -176.31.64.0 - 176.31.64.3 pl -176.31.64.4 - 176.31.64.31 fr -176.31.64.32 - 176.31.64.39 de -176.31.64.40 - 176.31.64.71 fr -176.31.64.72 - 176.31.64.75 it -176.31.64.76 - 176.31.64.79 fr -176.31.64.80 - 176.31.64.83 es -176.31.64.84 - 176.31.64.95 fr -176.31.64.96 - 176.31.64.99 cz -176.31.64.100 - 176.31.64.103 gb -176.31.64.104 - 176.31.64.107 cz -176.31.64.108 - 176.31.64.111 it -176.31.64.112 - 176.31.64.119 fr -176.31.64.120 - 176.31.64.123 es -176.31.64.124 - 176.31.64.127 ch -176.31.64.128 - 176.31.64.135 fr -176.31.64.136 - 176.31.64.143 be -176.31.64.144 - 176.31.64.151 fr -176.31.64.152 - 176.31.64.155 nl -176.31.64.156 - 176.31.64.159 it -176.31.64.160 - 176.31.64.163 gb -176.31.64.164 - 176.31.64.167 de -176.31.64.168 - 176.31.64.175 it -176.31.64.176 - 176.31.64.183 nl -176.31.64.184 - 176.31.64.187 es -176.31.64.188 - 176.31.64.191 de -176.31.64.192 - 176.31.64.195 es -176.31.64.196 - 176.31.64.199 ie -176.31.64.200 - 176.31.64.203 gb -176.31.64.204 - 176.31.64.207 es -176.31.64.208 - 176.31.64.223 fr -176.31.64.224 - 176.31.64.247 pl -176.31.64.248 - 176.31.64.255 it -176.31.65.0 - 176.31.65.7 de -176.31.65.8 - 176.31.65.15 it -176.31.65.16 - 176.31.65.31 be -176.31.65.32 - 176.31.65.79 fr -176.31.65.80 - 176.31.65.95 de -176.31.65.96 - 176.31.65.99 fr -176.31.65.100 - 176.31.65.103 gb -176.31.65.104 - 176.31.65.107 nl -176.31.65.108 - 176.31.65.111 pl -176.31.65.112 - 176.31.65.115 fr -176.31.65.116 - 176.31.65.119 ch -176.31.65.120 - 176.31.65.123 gb -176.31.65.124 - 176.31.65.127 ie -176.31.65.128 - 176.31.65.159 de -176.31.65.160 - 176.31.65.191 fr -176.31.65.192 - 176.31.65.223 ie -176.31.65.224 - 176.31.65.255 fr -176.31.66.0 - 176.31.66.3 it -176.31.66.4 - 176.31.66.7 gb -176.31.66.8 - 176.31.66.11 de -176.31.66.12 - 176.31.66.15 ch -176.31.66.16 - 176.31.66.31 pl -176.31.66.32 - 176.31.66.47 fr -176.31.66.48 - 176.31.66.55 gb -176.31.66.56 - 176.31.66.63 be -176.31.66.64 - 176.31.66.71 de -176.31.66.72 - 176.31.66.87 gb -176.31.66.88 - 176.31.66.95 fr -176.31.66.96 - 176.31.66.111 it -176.31.66.112 - 176.31.66.115 gb -176.31.66.116 - 176.31.66.119 pt -176.31.66.120 - 176.31.66.127 pl -176.31.66.128 - 176.31.66.191 ie -176.31.66.192 - 176.31.66.223 fr -176.31.66.224 - 176.31.66.239 be -176.31.66.240 - 176.31.67.127 fr -176.31.67.128 - 176.31.67.131 es -176.31.67.132 - 176.31.67.143 gb -176.31.67.144 - 176.31.67.147 fr -176.31.67.148 - 176.31.67.151 gb -176.31.67.152 - 176.31.67.155 fr -176.31.67.156 - 176.31.67.159 pl -176.31.67.160 - 176.31.67.207 fr -176.31.67.208 - 176.31.67.215 ie -176.31.67.216 - 176.31.67.219 gb -176.31.67.220 - 176.31.67.255 fr -176.31.68.0 - 176.31.68.67 gb -176.31.68.68 - 176.31.68.71 be -176.31.68.72 - 176.31.68.79 es -176.31.68.80 - 176.31.68.87 nl -176.31.68.88 - 176.31.68.95 gb -176.31.68.96 - 176.31.68.127 de -176.31.68.128 - 176.31.68.159 pl -176.31.68.160 - 176.31.68.191 fr -176.31.68.192 - 176.31.68.207 ie -176.31.68.208 - 176.31.68.211 gb -176.31.68.212 - 176.31.68.223 fr -176.31.68.224 - 176.31.68.231 pl -176.31.68.232 - 176.31.68.239 gb -176.31.68.240 - 176.31.69.7 fr -176.31.69.8 - 176.31.69.15 gb -176.31.69.16 - 176.31.69.23 pl -176.31.69.24 - 176.31.69.47 gb -176.31.69.48 - 176.31.69.51 es -176.31.69.52 - 176.31.69.55 it -176.31.69.56 - 176.31.69.59 nl -176.31.69.60 - 176.31.69.63 es -176.31.69.64 - 176.31.69.67 it -176.31.69.68 - 176.31.69.71 gb -176.31.69.72 - 176.31.69.79 de -176.31.69.80 - 176.31.69.87 gb -176.31.69.88 - 176.31.69.99 fr -176.31.69.100 - 176.31.69.103 gb -176.31.69.104 - 176.31.69.107 it -176.31.69.108 - 176.31.69.111 fr -176.31.69.112 - 176.31.69.127 ie -176.31.69.128 - 176.31.69.159 gb -176.31.69.160 - 176.31.69.175 fr +176.31.46.160 - 176.31.46.163 es +176.31.46.164 - 176.31.46.247 fr +176.31.46.248 - 176.31.46.251 it +176.31.46.252 - 176.31.50.87 fr +176.31.50.88 - 176.31.50.91 es +176.31.50.92 - 176.31.50.239 fr +176.31.50.240 - 176.31.50.243 es +176.31.50.244 - 176.31.52.39 fr +176.31.52.40 - 176.31.52.47 it +176.31.52.48 - 176.31.52.95 fr +176.31.52.96 - 176.31.52.99 de +176.31.52.100 - 176.31.52.123 fr +176.31.52.124 - 176.31.52.127 fi +176.31.52.128 - 176.31.53.95 fr +176.31.53.96 - 176.31.53.99 es +176.31.53.100 - 176.31.53.243 fr +176.31.53.244 - 176.31.53.247 es +176.31.53.248 - 176.31.53.251 fr +176.31.53.252 - 176.31.53.255 es +176.31.54.0 - 176.31.54.163 fr +176.31.54.164 - 176.31.54.164 es +176.31.54.165 - 176.31.60.79 fr +176.31.60.80 - 176.31.60.83 es +176.31.60.84 - 176.31.62.111 fr +176.31.62.112 - 176.31.62.115 it +176.31.62.116 - 176.31.62.163 fr +176.31.62.164 - 176.31.62.167 es +176.31.62.168 - 176.31.63.67 fr +176.31.63.68 - 176.31.63.71 de +176.31.63.72 - 176.31.63.107 fr +176.31.63.108 - 176.31.63.111 es +176.31.63.112 - 176.31.64.87 fr +176.31.64.88 - 176.31.64.91 de +176.31.64.92 - 176.31.66.71 fr +176.31.66.72 - 176.31.66.79 gb +176.31.66.80 - 176.31.66.87 nl +176.31.66.88 - 176.31.67.127 fr +176.31.67.128 - 176.31.67.131 de +176.31.67.132 - 176.31.68.23 fr +176.31.68.24 - 176.31.68.27 it +176.31.68.28 - 176.31.68.199 fr +176.31.68.200 - 176.31.68.203 it +176.31.68.204 - 176.31.68.227 fr +176.31.68.228 - 176.31.68.231 es +176.31.68.232 - 176.31.69.175 fr 176.31.69.176 - 176.31.69.183 be -176.31.69.184 - 176.31.69.187 de -176.31.69.188 - 176.31.69.191 fr -176.31.69.192 - 176.31.69.223 es -176.31.69.224 - 176.31.69.227 gb -176.31.69.228 - 176.31.69.231 pl -176.31.69.232 - 176.31.69.239 gb -176.31.69.240 - 176.31.69.247 fr -176.31.69.248 - 176.31.69.255 es -176.31.70.0 - 176.31.71.255 de -176.31.72.0 - 176.31.72.31 fr -176.31.72.32 - 176.31.72.39 es -176.31.72.40 - 176.31.72.43 it -176.31.72.44 - 176.31.72.47 es -176.31.72.48 - 176.31.72.55 fr -176.31.72.56 - 176.31.72.59 es -176.31.72.60 - 176.31.72.63 pl -176.31.72.64 - 176.31.72.71 fr -176.31.72.72 - 176.31.72.75 it -176.31.72.76 - 176.31.72.79 pl -176.31.72.80 - 176.31.72.95 ie -176.31.72.96 - 176.31.72.111 fr -176.31.72.112 - 176.31.72.115 ie -176.31.72.116 - 176.31.72.119 it -176.31.72.120 - 176.31.72.127 ie -176.31.72.128 - 176.31.72.159 gb -176.31.72.160 - 176.31.73.159 pl -176.31.73.160 - 176.31.73.191 pt -176.31.73.192 - 176.31.73.199 pl -176.31.73.200 - 176.31.73.203 fr -176.31.73.204 - 176.31.73.207 es -176.31.73.208 - 176.31.73.223 fr -176.31.73.224 - 176.31.73.255 es -176.31.74.0 - 176.31.74.15 fi -176.31.74.16 - 176.31.74.31 es -176.31.74.32 - 176.31.74.47 fr -176.31.74.48 - 176.31.74.55 nl -176.31.74.56 - 176.31.74.63 es -176.31.74.64 - 176.31.74.71 fr -176.31.74.72 - 176.31.74.79 pl -176.31.74.80 - 176.31.74.87 fr -176.31.74.88 - 176.31.74.95 pl -176.31.74.96 - 176.31.74.127 it -176.31.74.128 - 176.31.74.143 fr -176.31.74.144 - 176.31.74.151 gb -176.31.74.152 - 176.31.74.155 es -176.31.74.156 - 176.31.74.167 de -176.31.74.168 - 176.31.74.199 gb -176.31.74.200 - 176.31.74.203 fr -176.31.74.204 - 176.31.74.207 nl -176.31.74.208 - 176.31.75.71 fr -176.31.75.72 - 176.31.75.75 pl -176.31.75.76 - 176.31.75.79 es -176.31.75.80 - 176.31.75.87 de -176.31.75.88 - 176.31.75.95 fr -176.31.75.96 - 176.31.75.99 it -176.31.75.100 - 176.31.75.107 fr -176.31.75.108 - 176.31.75.111 es -176.31.75.112 - 176.31.75.127 fr -176.31.75.128 - 176.31.75.191 it -176.31.75.192 - 176.31.76.3 es -176.31.76.4 - 176.31.76.7 pl -176.31.76.8 - 176.31.76.15 gb -176.31.76.16 - 176.31.76.23 es -176.31.76.24 - 176.31.76.63 fr -176.31.76.64 - 176.31.76.95 es -176.31.76.96 - 176.31.76.111 fr -176.31.76.112 - 176.31.76.119 ch -176.31.76.120 - 176.31.76.127 fi -176.31.76.128 - 176.31.76.151 de -176.31.76.152 - 176.31.76.159 gb -176.31.76.160 - 176.31.76.167 pl -176.31.76.168 - 176.31.76.171 es -176.31.76.172 - 176.31.76.175 de -176.31.76.176 - 176.31.76.207 fr -176.31.76.208 - 176.31.76.211 es -176.31.76.212 - 176.31.76.219 pl -176.31.76.220 - 176.31.76.223 gb -176.31.76.224 - 176.31.77.127 fr -176.31.77.128 - 176.31.77.159 pl -176.31.77.160 - 176.31.77.163 de -176.31.77.164 - 176.31.77.167 gb -176.31.77.168 - 176.31.77.175 fr -176.31.77.176 - 176.31.77.179 pl -176.31.77.180 - 176.31.77.183 de -176.31.77.184 - 176.31.77.191 fr -176.31.77.192 - 176.31.77.199 gb -176.31.77.200 - 176.31.77.207 pl -176.31.77.208 - 176.31.77.215 fr -176.31.77.216 - 176.31.77.219 fi -176.31.77.220 - 176.31.77.223 pl -176.31.77.224 - 176.31.77.247 es -176.31.77.248 - 176.31.77.251 de -176.31.77.252 - 176.31.78.31 pl -176.31.78.32 - 176.31.78.35 fr -176.31.78.36 - 176.31.78.39 cz -176.31.78.40 - 176.31.78.43 es -176.31.78.44 - 176.31.78.47 pl -176.31.78.48 - 176.31.78.51 pt -176.31.78.52 - 176.31.78.55 lt -176.31.78.56 - 176.31.78.59 fr -176.31.78.60 - 176.31.78.63 de -176.31.78.64 - 176.31.78.67 ie -176.31.78.68 - 176.31.78.71 nl -176.31.78.72 - 176.31.78.75 ch -176.31.78.76 - 176.31.78.83 gb -176.31.78.84 - 176.31.78.87 pt -176.31.78.88 - 176.31.78.91 pl -176.31.78.92 - 176.31.78.95 fr -176.31.78.96 - 176.31.78.99 it -176.31.78.100 - 176.31.78.103 fr -176.31.78.104 - 176.31.78.111 be -176.31.78.112 - 176.31.78.115 fr -176.31.78.116 - 176.31.78.119 cz -176.31.78.120 - 176.31.78.127 de -176.31.78.128 - 176.31.78.159 fr -176.31.78.160 - 176.31.78.183 pl -176.31.78.184 - 176.31.78.187 cz -176.31.78.188 - 176.31.78.195 es -176.31.78.196 - 176.31.78.199 fr -176.31.78.200 - 176.31.78.211 es -176.31.78.212 - 176.31.78.215 gb -176.31.78.216 - 176.31.78.219 fr -176.31.78.220 - 176.31.78.223 gb -176.31.78.224 - 176.31.78.251 fr -176.31.78.252 - 176.31.78.255 es -176.31.79.0 - 176.31.79.23 fr -176.31.79.24 - 176.31.79.31 pl -176.31.79.32 - 176.31.79.51 fr -176.31.79.52 - 176.31.79.55 pl -176.31.79.56 - 176.31.79.63 nl -176.31.79.64 - 176.31.79.71 gb -176.31.79.72 - 176.31.79.75 pl -176.31.79.76 - 176.31.79.79 de -176.31.79.80 - 176.31.79.83 be -176.31.79.84 - 176.31.79.87 es -176.31.79.88 - 176.31.79.95 de -176.31.79.96 - 176.31.79.127 es -176.31.79.128 - 176.31.79.159 fr -176.31.79.160 - 176.31.79.175 gb -176.31.79.176 - 176.31.79.179 ch -176.31.79.180 - 176.31.79.187 de -176.31.79.188 - 176.31.79.191 gb -176.31.79.192 - 176.31.79.211 fr -176.31.79.212 - 176.31.79.215 gb -176.31.79.216 - 176.31.79.239 fr -176.31.79.240 - 176.31.79.255 ie -176.31.80.0 - 176.31.80.127 fr -176.31.80.128 - 176.31.80.131 es -176.31.80.132 - 176.31.80.135 fr -176.31.80.136 - 176.31.80.139 es -176.31.80.140 - 176.31.80.143 gb -176.31.80.144 - 176.31.80.151 fr -176.31.80.152 - 176.31.80.155 cz -176.31.80.156 - 176.31.80.159 fr -176.31.80.160 - 176.31.80.163 ie -176.31.80.164 - 176.31.80.167 fr -176.31.80.168 - 176.31.80.179 pl -176.31.80.180 - 176.31.80.183 ch -176.31.80.184 - 176.31.80.187 gb -176.31.80.188 - 176.31.80.255 es -176.31.81.0 - 176.31.81.7 ie -176.31.81.8 - 176.31.81.35 fr -176.31.81.36 - 176.31.81.39 ie -176.31.81.40 - 176.31.81.43 de -176.31.81.44 - 176.31.81.63 gb -176.31.81.64 - 176.31.81.71 fr -176.31.81.72 - 176.31.81.75 ie -176.31.81.76 - 176.31.81.79 be -176.31.81.80 - 176.31.81.83 es -176.31.81.84 - 176.31.81.87 cz -176.31.81.88 - 176.31.81.95 nl -176.31.81.96 - 176.31.81.99 pl -176.31.81.100 - 176.31.81.111 fr -176.31.81.112 - 176.31.81.115 it -176.31.81.116 - 176.31.81.119 pl -176.31.81.120 - 176.31.81.123 ch -176.31.81.124 - 176.31.81.127 fr -176.31.81.128 - 176.31.81.191 gb -176.31.81.192 - 176.31.82.31 de -176.31.82.32 - 176.31.82.35 es -176.31.82.36 - 176.31.82.39 fi -176.31.82.40 - 176.31.82.43 fr -176.31.82.44 - 176.31.82.47 ie -176.31.82.48 - 176.31.82.79 fr -176.31.82.80 - 176.31.82.95 pl -176.31.82.96 - 176.31.82.99 fr -176.31.82.100 - 176.31.82.103 de -176.31.82.104 - 176.31.82.107 es -176.31.82.108 - 176.31.82.111 lt -176.31.82.112 - 176.31.82.119 nl -176.31.82.120 - 176.31.82.127 ch -176.31.82.128 - 176.31.82.143 pl -176.31.82.144 - 176.31.82.147 be -176.31.82.148 - 176.31.82.151 gb -176.31.82.152 - 176.31.82.159 fr -176.31.82.160 - 176.31.82.167 pt -176.31.82.168 - 176.31.82.175 be -176.31.82.176 - 176.31.82.183 es -176.31.82.184 - 176.31.82.187 gb -176.31.82.188 - 176.31.82.191 fi -176.31.82.192 - 176.31.82.207 pl -176.31.82.208 - 176.31.82.231 fr -176.31.82.232 - 176.31.82.239 gb -176.31.82.240 - 176.31.82.255 fr -176.31.83.0 - 176.31.83.31 pl -176.31.83.32 - 176.31.83.39 it -176.31.83.40 - 176.31.83.47 pl -176.31.83.48 - 176.31.83.55 be -176.31.83.56 - 176.31.83.63 ie -176.31.83.64 - 176.31.83.71 ch -176.31.83.72 - 176.31.83.75 pl -176.31.83.76 - 176.31.83.79 it -176.31.83.80 - 176.31.83.95 fr -176.31.83.96 - 176.31.83.111 es -176.31.83.112 - 176.31.83.127 pl -176.31.83.128 - 176.31.83.143 fi -176.31.83.144 - 176.31.83.147 nl -176.31.83.148 - 176.31.83.151 es -176.31.83.152 - 176.31.83.159 it -176.31.83.160 - 176.31.83.191 de -176.31.83.192 - 176.31.83.223 fr -176.31.83.224 - 176.31.83.255 nl -176.31.84.0 - 176.31.84.47 fr -176.31.84.48 - 176.31.84.51 nl -176.31.84.52 - 176.31.84.55 gb -176.31.84.56 - 176.31.84.59 nl -176.31.84.60 - 176.31.84.63 es -176.31.84.64 - 176.31.84.127 fr -176.31.84.128 - 176.31.84.135 cz -176.31.84.136 - 176.31.84.175 fr -176.31.84.176 - 176.31.84.179 es -176.31.84.180 - 176.31.84.183 fr -176.31.84.184 - 176.31.84.199 it -176.31.84.200 - 176.31.84.207 nl -176.31.84.208 - 176.31.84.211 de -176.31.84.212 - 176.31.84.215 gb -176.31.84.216 - 176.31.85.15 fr -176.31.85.16 - 176.31.85.23 ch -176.31.85.24 - 176.31.85.27 pl -176.31.85.28 - 176.31.85.31 fr -176.31.85.32 - 176.31.85.47 nl -176.31.85.48 - 176.31.85.67 fr -176.31.85.68 - 176.31.85.71 gb -176.31.85.72 - 176.31.85.79 fr -176.31.85.80 - 176.31.85.95 gb -176.31.85.96 - 176.31.85.127 de -176.31.85.128 - 176.31.85.143 pl -176.31.85.144 - 176.31.85.203 fr -176.31.85.204 - 176.31.85.207 de -176.31.85.208 - 176.31.85.211 it -176.31.85.212 - 176.31.85.215 pl -176.31.85.216 - 176.31.85.239 fr -176.31.85.240 - 176.31.85.247 ch -176.31.85.248 - 176.31.85.251 ie -176.31.85.252 - 176.31.85.255 cz -176.31.86.0 - 176.31.86.127 es -176.31.86.128 - 176.31.86.223 de -176.31.86.224 - 176.31.86.239 pl -176.31.86.240 - 176.31.86.247 be -176.31.86.248 - 176.31.86.251 pt -176.31.86.252 - 176.31.86.255 gb -176.31.87.0 - 176.31.87.127 pt -176.31.87.128 - 176.31.87.159 de -176.31.87.160 - 176.31.87.191 be -176.31.87.192 - 176.31.87.223 it -176.31.87.224 - 176.31.87.239 fr -176.31.87.240 - 176.31.87.243 it -176.31.87.244 - 176.31.87.247 fr -176.31.87.248 - 176.31.87.251 de -176.31.87.252 - 176.31.88.15 fr -176.31.88.16 - 176.31.88.19 lt -176.31.88.20 - 176.31.88.23 pl -176.31.88.24 - 176.31.88.27 gb -176.31.88.28 - 176.31.88.31 es -176.31.88.32 - 176.31.88.63 ie -176.31.88.64 - 176.31.88.103 fr -176.31.88.104 - 176.31.88.107 de -176.31.88.108 - 176.31.88.111 nl -176.31.88.112 - 176.31.88.115 fr -176.31.88.116 - 176.31.88.119 gb -176.31.88.120 - 176.31.88.127 pt -176.31.88.128 - 176.31.88.191 pl -176.31.88.192 - 176.31.88.255 fr -176.31.89.0 - 176.31.89.63 es -176.31.89.64 - 176.31.89.127 pt -176.31.89.128 - 176.31.89.159 pl -176.31.89.160 - 176.31.89.175 de -176.31.89.176 - 176.31.89.183 pl -176.31.89.184 - 176.31.89.191 nl -176.31.89.192 - 176.31.89.255 pl -176.31.90.0 - 176.31.90.15 fr -176.31.90.16 - 176.31.90.31 ch -176.31.90.32 - 176.31.90.35 de -176.31.90.36 - 176.31.90.47 pt -176.31.90.48 - 176.31.90.51 es -176.31.90.52 - 176.31.90.59 fr -176.31.90.60 - 176.31.90.63 gb -176.31.90.64 - 176.31.90.127 de -176.31.90.128 - 176.31.91.7 fr -176.31.91.8 - 176.31.91.19 gb -176.31.91.20 - 176.31.91.23 it -176.31.91.24 - 176.31.91.31 fr -176.31.91.32 - 176.31.91.39 es -176.31.91.40 - 176.31.91.43 be -176.31.91.44 - 176.31.91.63 pl -176.31.91.64 - 176.31.91.127 pt -176.31.91.128 - 176.31.91.191 es -176.31.91.192 - 176.31.91.207 pl -176.31.91.208 - 176.31.91.223 fr -176.31.91.224 - 176.31.91.231 pl -176.31.91.232 - 176.31.91.239 fr -176.31.91.240 - 176.31.91.255 be -176.31.92.0 - 176.31.92.15 pl -176.31.92.16 - 176.31.92.23 nl -176.31.92.24 - 176.31.92.27 es -176.31.92.28 - 176.31.92.31 ch -176.31.92.32 - 176.31.92.39 fr -176.31.92.40 - 176.31.92.47 nl -176.31.92.48 - 176.31.92.55 de -176.31.92.56 - 176.31.92.63 nl -176.31.92.64 - 176.31.92.79 ch -176.31.92.80 - 176.31.92.95 pl -176.31.92.96 - 176.31.92.127 lt -176.31.92.128 - 176.31.92.131 ch -176.31.92.132 - 176.31.92.135 be -176.31.92.136 - 176.31.92.143 lt -176.31.92.144 - 176.31.92.159 fr -176.31.92.160 - 176.31.92.175 fi -176.31.92.176 - 176.31.92.179 fr -176.31.92.180 - 176.31.92.183 es -176.31.92.184 - 176.31.92.187 nl -176.31.92.188 - 176.31.92.191 de -176.31.92.192 - 176.31.92.223 pl -176.31.92.224 - 176.31.92.255 fr -176.31.93.0 - 176.31.93.255 gb -176.31.94.0 - 176.31.94.255 it -176.31.95.0 - 176.31.95.47 fr -176.31.95.48 - 176.31.95.63 pt -176.31.95.64 - 176.31.95.95 fr -176.31.95.96 - 176.31.95.103 nl -176.31.95.104 - 176.31.95.107 fr -176.31.95.108 - 176.31.95.111 gb -176.31.95.112 - 176.31.95.127 nl -176.31.95.128 - 176.31.95.159 de -176.31.95.160 - 176.31.95.167 fr -176.31.95.168 - 176.31.95.171 ie -176.31.95.172 - 176.31.95.175 gb -176.31.95.176 - 176.31.95.183 fr -176.31.95.184 - 176.31.95.187 de -176.31.95.188 - 176.31.95.191 gb -176.31.95.192 - 176.31.95.239 fr -176.31.95.240 - 176.31.95.255 fi -176.31.96.0 - 176.31.128.3 fr -176.31.128.4 - 176.31.128.7 it -176.31.128.8 - 176.31.128.11 fr -176.31.128.12 - 176.31.128.15 pl -176.31.128.16 - 176.31.128.31 gb -176.31.128.32 - 176.31.128.95 fr -176.31.128.96 - 176.31.128.127 es -176.31.128.128 - 176.31.128.219 fr -176.31.128.220 - 176.31.128.223 es -176.31.128.224 - 176.31.128.255 fr -176.31.129.0 - 176.31.129.3 pl -176.31.129.4 - 176.31.129.7 ch -176.31.129.8 - 176.31.129.11 fi -176.31.129.12 - 176.31.129.35 fr -176.31.129.36 - 176.31.129.39 it -176.31.129.40 - 176.31.129.43 pl -176.31.129.44 - 176.31.129.47 gb -176.31.129.48 - 176.31.129.55 fr -176.31.129.56 - 176.31.129.63 de -176.31.129.64 - 176.31.129.127 es -176.31.129.128 - 176.31.129.143 fr -176.31.129.144 - 176.31.129.159 fi -176.31.129.160 - 176.31.129.191 fr -176.31.129.192 - 176.31.129.195 pl -176.31.129.196 - 176.31.129.199 gb -176.31.129.200 - 176.31.129.207 fr -176.31.129.208 - 176.31.129.211 nl -176.31.129.212 - 176.31.129.215 gb -176.31.129.216 - 176.31.129.223 es -176.31.129.224 - 176.31.129.239 fr -176.31.129.240 - 176.31.129.247 pl -176.31.129.248 - 176.31.130.7 fr -176.31.130.8 - 176.31.130.15 pl -176.31.130.16 - 176.31.130.31 de -176.31.130.32 - 176.31.130.95 fr -176.31.130.96 - 176.31.130.111 it -176.31.130.112 - 176.31.130.115 gb -176.31.130.116 - 176.31.130.119 pl -176.31.130.120 - 176.31.130.127 gb -176.31.130.128 - 176.31.130.131 es -176.31.130.132 - 176.31.130.135 fr -176.31.130.136 - 176.31.130.139 pl -176.31.130.140 - 176.31.130.143 es -176.31.130.144 - 176.31.130.147 fr -176.31.130.148 - 176.31.130.151 es -176.31.130.152 - 176.31.130.155 be -176.31.130.156 - 176.31.130.159 es -176.31.130.160 - 176.31.130.163 fr -176.31.130.164 - 176.31.130.167 de -176.31.130.168 - 176.31.130.175 gb -176.31.130.176 - 176.31.130.191 fr -176.31.130.192 - 176.31.130.255 ie -176.31.131.0 - 176.31.131.31 gb -176.31.131.32 - 176.31.131.39 fr -176.31.131.40 - 176.31.131.43 nl -176.31.131.44 - 176.31.131.47 ch -176.31.131.48 - 176.31.131.127 fr -176.31.131.128 - 176.31.131.191 be -176.31.131.192 - 176.31.131.223 es -176.31.131.224 - 176.31.132.15 fr -176.31.132.16 - 176.31.132.31 lt -176.31.132.32 - 176.31.132.55 fr -176.31.132.56 - 176.31.132.63 it -176.31.132.64 - 176.31.132.103 gb -176.31.132.104 - 176.31.132.111 pt -176.31.132.112 - 176.31.132.127 fr -176.31.132.128 - 176.31.132.143 gb -176.31.132.144 - 176.31.132.147 fr -176.31.132.148 - 176.31.132.151 be -176.31.132.152 - 176.31.132.155 fr -176.31.132.156 - 176.31.132.159 it -176.31.132.160 - 176.31.132.191 fr -176.31.132.192 - 176.31.132.195 ie -176.31.132.196 - 176.31.132.199 fr -176.31.132.200 - 176.31.132.203 it -176.31.132.204 - 176.31.132.211 gb -176.31.132.212 - 176.31.132.215 nl -176.31.132.216 - 176.31.132.219 pl -176.31.132.220 - 176.31.132.231 gb -176.31.132.232 - 176.31.132.235 ch -176.31.132.236 - 176.31.132.239 de -176.31.132.240 - 176.31.132.255 es -176.31.133.0 - 176.31.133.15 nl -176.31.133.16 - 176.31.133.23 fr -176.31.133.24 - 176.31.133.27 es -176.31.133.28 - 176.31.133.31 gb -176.31.133.32 - 176.31.133.63 pl -176.31.133.64 - 176.31.133.127 fr -176.31.133.128 - 176.31.133.191 ie -176.31.133.192 - 176.31.133.199 fr -176.31.133.200 - 176.31.133.207 es -176.31.133.208 - 176.31.133.223 fr -176.31.133.224 - 176.31.133.239 pl -176.31.133.240 - 176.31.134.63 fr -176.31.134.64 - 176.31.134.127 pl -176.31.134.128 - 176.31.134.131 fr -176.31.134.132 - 176.31.134.135 pl -176.31.134.136 - 176.31.134.143 fr -176.31.134.144 - 176.31.134.147 es -176.31.134.148 - 176.31.134.151 fr -176.31.134.152 - 176.31.134.159 es -176.31.134.160 - 176.31.134.231 fr -176.31.134.232 - 176.31.134.239 es -176.31.134.240 - 176.31.134.251 pl -176.31.134.252 - 176.31.135.255 fr -176.31.136.0 - 176.31.136.63 es -176.31.136.64 - 176.31.136.103 fr -176.31.136.104 - 176.31.136.111 it -176.31.136.112 - 176.31.136.115 es -176.31.136.116 - 176.31.136.119 lt -176.31.136.120 - 176.31.136.123 fr -176.31.136.124 - 176.31.136.127 pl -176.31.136.128 - 176.31.136.135 es -176.31.136.136 - 176.31.136.139 fr -176.31.136.140 - 176.31.136.143 es -176.31.136.144 - 176.31.136.159 pl -176.31.136.160 - 176.31.136.163 be -176.31.136.164 - 176.31.136.167 de -176.31.136.168 - 176.31.136.171 es -176.31.136.172 - 176.31.136.175 gb -176.31.136.176 - 176.31.136.179 it -176.31.136.180 - 176.31.136.187 fr -176.31.136.188 - 176.31.136.191 de -176.31.136.192 - 176.31.136.223 it -176.31.136.224 - 176.31.136.239 nl -176.31.136.240 - 176.31.136.243 be -176.31.136.244 - 176.31.136.251 fr -176.31.136.252 - 176.31.137.255 pl -176.31.138.0 - 176.31.138.15 es -176.31.138.16 - 176.31.138.19 pl -176.31.138.20 - 176.31.138.23 fr -176.31.138.24 - 176.31.138.27 gb -176.31.138.28 - 176.31.138.31 fr -176.31.138.32 - 176.31.138.39 fi -176.31.138.40 - 176.31.138.47 pl -176.31.138.48 - 176.31.138.127 fr -176.31.138.128 - 176.31.138.131 pl -176.31.138.132 - 176.31.138.135 cz -176.31.138.136 - 176.31.138.139 pl -176.31.138.140 - 176.31.138.147 gb -176.31.138.148 - 176.31.138.151 fr -176.31.138.152 - 176.31.138.155 pl -176.31.138.156 - 176.31.138.159 ie -176.31.138.160 - 176.31.138.175 pt -176.31.138.176 - 176.31.138.183 lt -176.31.138.184 - 176.31.138.191 es -176.31.138.192 - 176.31.138.255 ie -176.31.139.0 - 176.31.139.127 gb -176.31.139.128 - 176.31.139.135 es -176.31.139.136 - 176.31.139.139 pt -176.31.139.140 - 176.31.139.143 it -176.31.139.144 - 176.31.139.151 fr -176.31.139.152 - 176.31.139.159 pt -176.31.139.160 - 176.31.139.167 pl -176.31.139.168 - 176.31.139.191 gb -176.31.139.192 - 176.31.139.207 ch -176.31.139.208 - 176.31.139.215 gb -176.31.139.216 - 176.31.139.219 it -176.31.139.220 - 176.31.139.223 pl -176.31.139.224 - 176.31.139.255 pt -176.31.140.0 - 176.31.140.31 fr -176.31.140.32 - 176.31.140.47 it -176.31.140.48 - 176.31.140.51 fr -176.31.140.52 - 176.31.140.55 ie -176.31.140.56 - 176.31.140.59 gb -176.31.140.60 - 176.31.140.63 nl -176.31.140.64 - 176.31.140.79 ch -176.31.140.80 - 176.31.140.95 it -176.31.140.96 - 176.31.140.99 pl -176.31.140.100 - 176.31.140.103 pt -176.31.140.104 - 176.31.140.111 fr -176.31.140.112 - 176.31.140.127 es -176.31.140.128 - 176.31.140.191 ie -176.31.140.192 - 176.31.140.223 fr -176.31.140.224 - 176.31.140.227 ie -176.31.140.228 - 176.31.140.231 es -176.31.140.232 - 176.31.140.235 pl -176.31.140.236 - 176.31.140.239 es -176.31.140.240 - 176.31.140.255 ie -176.31.141.0 - 176.31.141.23 fr -176.31.141.24 - 176.31.141.27 ie -176.31.141.28 - 176.31.141.31 pl -176.31.141.32 - 176.31.141.95 fr -176.31.141.96 - 176.31.141.127 es -176.31.141.128 - 176.31.141.255 ie -176.31.142.0 - 176.31.142.15 it -176.31.142.16 - 176.31.142.31 fr -176.31.142.32 - 176.31.142.39 pl -176.31.142.40 - 176.31.142.43 es -176.31.142.44 - 176.31.142.47 it -176.31.142.48 - 176.31.142.51 de -176.31.142.52 - 176.31.142.55 pl -176.31.142.56 - 176.31.142.59 fr -176.31.142.60 - 176.31.142.63 ie -176.31.142.64 - 176.31.142.71 pt -176.31.142.72 - 176.31.142.75 ie -176.31.142.76 - 176.31.142.79 pl -176.31.142.80 - 176.31.142.95 ie -176.31.142.96 - 176.31.142.111 pt -176.31.142.112 - 176.31.142.127 es -176.31.142.128 - 176.31.142.159 de -176.31.142.160 - 176.31.142.191 es -176.31.142.192 - 176.31.142.207 pl -176.31.142.208 - 176.31.142.223 ie -176.31.142.224 - 176.31.142.255 it -176.31.143.0 - 176.31.143.31 nl -176.31.143.32 - 176.31.143.63 gb -176.31.143.64 - 176.31.143.95 de -176.31.143.96 - 176.31.143.111 ie -176.31.143.112 - 176.31.143.143 pl -176.31.143.144 - 176.31.143.175 fr -176.31.143.176 - 176.31.143.183 es -176.31.143.184 - 176.31.143.187 de -176.31.143.188 - 176.31.143.191 ie -176.31.143.192 - 176.31.143.199 gb -176.31.143.200 - 176.31.143.203 fr -176.31.143.204 - 176.31.143.207 gb -176.31.143.208 - 176.31.143.223 it -176.31.143.224 - 176.31.143.239 fr -176.31.143.240 - 176.31.143.243 nl -176.31.143.244 - 176.31.143.247 de -176.31.143.248 - 176.31.143.251 it -176.31.143.252 - 176.31.143.255 nl -176.31.144.0 - 176.31.144.255 es -176.31.145.0 - 176.31.145.63 ie -176.31.145.64 - 176.31.145.67 es -176.31.145.68 - 176.31.145.71 pt -176.31.145.72 - 176.31.145.75 gb -176.31.145.76 - 176.31.145.79 cz -176.31.145.80 - 176.31.145.95 ie -176.31.145.96 - 176.31.145.111 fr -176.31.145.112 - 176.31.145.119 es -176.31.145.120 - 176.31.145.143 fr -176.31.145.144 - 176.31.145.159 es -176.31.145.160 - 176.31.145.191 de -176.31.145.192 - 176.31.145.223 es -176.31.145.224 - 176.31.145.239 fr -176.31.145.240 - 176.31.145.255 gb -176.31.146.0 - 176.31.146.15 fr -176.31.146.16 - 176.31.146.19 it -176.31.146.20 - 176.31.146.23 pt -176.31.146.24 - 176.31.146.35 fr -176.31.146.36 - 176.31.146.47 de -176.31.146.48 - 176.31.146.63 fr -176.31.146.64 - 176.31.146.71 pl -176.31.146.72 - 176.31.146.95 be -176.31.146.96 - 176.31.146.111 pt -176.31.146.112 - 176.31.146.115 fr -176.31.146.116 - 176.31.146.119 nl -176.31.146.120 - 176.31.146.127 pt -176.31.146.128 - 176.31.146.227 fr -176.31.146.228 - 176.31.146.231 de -176.31.146.232 - 176.31.146.235 es -176.31.146.236 - 176.31.146.239 pl -176.31.146.240 - 176.31.146.255 es -176.31.147.0 - 176.31.147.3 fr -176.31.147.4 - 176.31.147.7 es -176.31.147.8 - 176.31.147.11 pl -176.31.147.12 - 176.31.147.15 es -176.31.147.16 - 176.31.147.47 fr -176.31.147.48 - 176.31.147.51 es -176.31.147.52 - 176.31.147.59 fr -176.31.147.60 - 176.31.147.63 cz -176.31.147.64 - 176.31.147.79 gb -176.31.147.80 - 176.31.147.127 fr -176.31.147.128 - 176.31.147.159 it -176.31.147.160 - 176.31.147.191 gb -176.31.147.192 - 176.31.147.223 nl -176.31.147.224 - 176.31.147.231 fr -176.31.147.232 - 176.31.147.239 it -176.31.147.240 - 176.31.147.255 gb -176.31.148.0 - 176.31.148.31 de -176.31.148.32 - 176.31.148.39 fr -176.31.148.40 - 176.31.148.55 it -176.31.148.56 - 176.31.148.63 de -176.31.148.64 - 176.31.148.127 fr -176.31.148.128 - 176.31.148.135 es -176.31.148.136 - 176.31.148.143 nl -176.31.148.144 - 176.31.148.159 fr -176.31.148.160 - 176.31.148.175 ch -176.31.148.176 - 176.31.148.183 fr -176.31.148.184 - 176.31.148.187 gb -176.31.148.188 - 176.31.148.191 de -176.31.148.192 - 176.31.148.255 fr -176.31.149.0 - 176.31.149.31 pl -176.31.149.32 - 176.31.149.63 gb -176.31.149.64 - 176.31.149.127 pl -176.31.149.128 - 176.31.149.159 de -176.31.149.160 - 176.31.149.175 fr -176.31.149.176 - 176.31.149.179 pl -176.31.149.180 - 176.31.149.183 gb -176.31.149.184 - 176.31.149.187 es -176.31.149.188 - 176.31.149.255 pl -176.31.150.0 - 176.31.150.31 de -176.31.150.32 - 176.31.150.63 fr -176.31.150.64 - 176.31.150.71 gb -176.31.150.72 - 176.31.150.79 fr -176.31.150.80 - 176.31.150.95 de -176.31.150.96 - 176.31.150.99 es -176.31.150.100 - 176.31.150.103 fr -176.31.150.104 - 176.31.150.119 pl -176.31.150.120 - 176.31.150.135 ie -176.31.150.136 - 176.31.150.139 pl -176.31.150.140 - 176.31.150.143 ie -176.31.150.144 - 176.31.150.151 de -176.31.150.152 - 176.31.150.155 fr -176.31.150.156 - 176.31.150.159 es -176.31.150.160 - 176.31.150.191 pt -176.31.150.192 - 176.31.150.199 be -176.31.150.200 - 176.31.150.207 es -176.31.150.208 - 176.31.150.223 fr -176.31.150.224 - 176.31.150.239 ie -176.31.150.240 - 176.31.150.243 gb -176.31.150.244 - 176.31.151.31 fr -176.31.151.32 - 176.31.151.39 de -176.31.151.40 - 176.31.151.47 pl -176.31.151.48 - 176.31.151.63 ch -176.31.151.64 - 176.31.151.127 fr -176.31.151.128 - 176.31.151.135 pl -176.31.151.136 - 176.31.151.139 fr -176.31.151.140 - 176.31.151.143 ie -176.31.151.144 - 176.31.151.151 fr -176.31.151.152 - 176.31.151.155 it -176.31.151.156 - 176.31.151.159 fi -176.31.151.160 - 176.31.151.191 pt -176.31.151.192 - 176.31.151.195 gb -176.31.151.196 - 176.31.151.199 fr -176.31.151.200 - 176.31.151.203 gb -176.31.151.204 - 176.31.151.223 fr -176.31.151.224 - 176.31.151.255 de -176.31.152.0 - 176.31.152.255 cz -176.31.153.0 - 176.31.153.63 ie -176.31.153.64 - 176.31.154.11 fr -176.31.154.12 - 176.31.154.15 gb -176.31.154.16 - 176.31.154.31 fr -176.31.154.32 - 176.31.154.63 ch -176.31.154.64 - 176.31.154.87 fr -176.31.154.88 - 176.31.154.111 es -176.31.154.112 - 176.31.154.127 fr -176.31.154.128 - 176.31.154.135 it -176.31.154.136 - 176.31.154.139 fr -176.31.154.140 - 176.31.154.143 ie -176.31.154.144 - 176.31.154.159 gb -176.31.154.160 - 176.31.154.175 fr -176.31.154.176 - 176.31.154.183 pl -176.31.154.184 - 176.31.154.191 fr -176.31.154.192 - 176.31.154.255 pl -176.31.155.0 - 176.31.155.11 fr -176.31.155.12 - 176.31.155.15 it -176.31.155.16 - 176.31.155.31 nl -176.31.155.32 - 176.31.155.47 fr -176.31.155.48 - 176.31.155.51 ie -176.31.155.52 - 176.31.155.55 fr -176.31.155.56 - 176.31.155.59 es -176.31.155.60 - 176.31.155.63 pt -176.31.155.64 - 176.31.155.95 de -176.31.155.96 - 176.31.155.111 fr -176.31.155.112 - 176.31.155.119 ch -176.31.155.120 - 176.31.155.123 fr -176.31.155.124 - 176.31.155.127 gb -176.31.155.128 - 176.31.156.3 fr -176.31.156.4 - 176.31.156.7 gb -176.31.156.8 - 176.31.156.31 fr -176.31.156.32 - 176.31.156.47 pt -176.31.156.48 - 176.31.156.55 fr +176.31.69.184 - 176.31.72.191 fr +176.31.72.192 - 176.31.73.127 gb +176.31.73.128 - 176.31.73.195 fr +176.31.73.196 - 176.31.73.199 nl +176.31.73.200 - 176.31.75.95 fr +176.31.75.96 - 176.31.75.99 de +176.31.75.100 - 176.31.78.107 fr +176.31.78.108 - 176.31.78.111 nl +176.31.78.112 - 176.31.78.207 fr +176.31.78.208 - 176.31.78.215 nl +176.31.78.216 - 176.31.85.111 fr +176.31.85.112 - 176.31.85.115 es +176.31.85.116 - 176.31.86.111 fr +176.31.86.112 - 176.31.86.123 es +176.31.86.124 - 176.31.87.243 fr +176.31.87.244 - 176.31.87.247 de +176.31.87.248 - 176.31.88.32 fr +176.31.88.33 - 176.31.88.33 nl +176.31.88.34 - 176.31.91.71 fr +176.31.91.72 - 176.31.91.75 es +176.31.91.76 - 176.31.91.255 fr +176.31.92.0 - 176.31.92.15 de +176.31.92.16 - 176.31.95.143 fr +176.31.95.144 - 176.31.95.151 nl +176.31.95.152 - 176.31.95.155 fr +176.31.95.156 - 176.31.95.159 es +176.31.95.160 - 176.31.95.187 fr +176.31.95.188 - 176.31.95.191 es +176.31.95.192 - 176.31.129.215 fr +176.31.129.216 - 176.31.129.219 it +176.31.129.220 - 176.31.130.163 fr +176.31.130.164 - 176.31.130.167 es +176.31.130.168 - 176.31.132.83 fr +176.31.132.84 - 176.31.132.87 de +176.31.132.88 - 176.31.132.91 fr +176.31.132.92 - 176.31.132.95 es +176.31.132.96 - 176.31.132.103 fr +176.31.132.104 - 176.31.132.107 es +176.31.132.108 - 176.31.134.243 fr +176.31.134.244 - 176.31.134.247 es +176.31.134.248 - 176.31.138.155 fr +176.31.138.156 - 176.31.138.159 nl +176.31.138.160 - 176.31.145.67 fr +176.31.145.68 - 176.31.145.71 it +176.31.145.72 - 176.31.145.159 fr +176.31.145.160 - 176.31.145.191 es +176.31.145.192 - 176.31.146.35 fr +176.31.146.36 - 176.31.146.39 es +176.31.146.40 - 176.31.147.59 fr +176.31.147.60 - 176.31.147.63 es +176.31.147.64 - 176.31.149.95 fr +176.31.149.96 - 176.31.149.127 es +176.31.149.128 - 176.31.156.55 fr 176.31.156.56 - 176.31.156.63 it -176.31.156.64 - 176.31.156.67 nl -176.31.156.68 - 176.31.156.71 gb -176.31.156.72 - 176.31.156.79 pl -176.31.156.80 - 176.31.156.83 fr -176.31.156.84 - 176.31.156.87 gb -176.31.156.88 - 176.31.156.95 fr -176.31.156.96 - 176.31.156.103 es -176.31.156.104 - 176.31.156.107 nl -176.31.156.108 - 176.31.156.119 pl -176.31.156.120 - 176.31.156.123 gb -176.31.156.124 - 176.31.156.127 fr -176.31.156.128 - 176.31.156.195 gb -176.31.156.196 - 176.31.156.199 pl -176.31.156.200 - 176.31.156.211 fr -176.31.156.212 - 176.31.156.215 de -176.31.156.216 - 176.31.156.219 fr -176.31.156.220 - 176.31.156.223 pl -176.31.156.224 - 176.31.156.255 gb -176.31.157.0 - 176.31.157.3 pl -176.31.157.4 - 176.31.157.7 gb -176.31.157.8 - 176.31.157.11 de -176.31.157.12 - 176.31.157.15 pl -176.31.157.16 - 176.31.157.19 gb -176.31.157.20 - 176.31.157.23 pl -176.31.157.24 - 176.31.157.39 fr -176.31.157.40 - 176.31.157.43 nl -176.31.157.44 - 176.31.157.47 fr -176.31.157.48 - 176.31.157.63 ie -176.31.157.64 - 176.31.157.95 pt -176.31.157.96 - 176.31.157.99 pl -176.31.157.100 - 176.31.157.103 es -176.31.157.104 - 176.31.157.111 fr -176.31.157.112 - 176.31.157.119 de -176.31.157.120 - 176.31.157.131 fr -176.31.157.132 - 176.31.157.143 gb -176.31.157.144 - 176.31.157.151 es -176.31.157.152 - 176.31.157.159 de -176.31.157.160 - 176.31.157.191 gb -176.31.157.192 - 176.31.157.223 lt -176.31.157.224 - 176.31.158.63 fr -176.31.158.64 - 176.31.158.127 es -176.31.158.128 - 176.31.158.131 pl -176.31.158.132 - 176.31.158.135 pt -176.31.158.136 - 176.31.158.139 fr -176.31.158.140 - 176.31.158.143 de -176.31.158.144 - 176.31.158.159 fr -176.31.158.160 - 176.31.158.167 it -176.31.158.168 - 176.31.158.191 fr -176.31.158.192 - 176.31.158.223 fi -176.31.158.224 - 176.31.191.255 fr -176.31.192.0 - 176.31.192.3 de -176.31.192.4 - 176.31.192.15 gb -176.31.192.16 - 176.31.192.47 fr -176.31.192.48 - 176.31.192.51 pl -176.31.192.52 - 176.31.192.55 gb -176.31.192.56 - 176.31.192.59 de -176.31.192.60 - 176.31.192.63 fr -176.31.192.64 - 176.31.192.79 pl -176.31.192.80 - 176.31.192.83 gb -176.31.192.84 - 176.31.192.91 es -176.31.192.92 - 176.31.192.95 pl -176.31.192.96 - 176.31.192.111 ie -176.31.192.112 - 176.31.192.119 fr -176.31.192.120 - 176.31.192.123 pl -176.31.192.124 - 176.31.192.127 es -176.31.192.128 - 176.31.194.255 fr -176.31.195.0 - 176.31.195.31 de -176.31.195.32 - 176.31.195.47 gb -176.31.195.48 - 176.31.195.51 fr -176.31.195.52 - 176.31.195.55 pl -176.31.195.56 - 176.31.195.59 be -176.31.195.60 - 176.31.195.63 cz -176.31.195.64 - 176.31.195.79 es -176.31.195.80 - 176.31.195.83 be -176.31.195.84 - 176.31.195.87 es -176.31.195.88 - 176.31.195.91 fr -176.31.195.92 - 176.31.195.95 it -176.31.195.96 - 176.31.195.115 fr -176.31.195.116 - 176.31.195.119 pl -176.31.195.120 - 176.31.195.143 fr -176.31.195.144 - 176.31.195.151 de -176.31.195.152 - 176.31.195.155 ch -176.31.195.156 - 176.31.195.159 gb -176.31.195.160 - 176.31.195.191 fr -176.31.195.192 - 176.31.195.207 pt -176.31.195.208 - 176.31.195.255 fr -176.31.196.0 - 176.31.196.15 es -176.31.196.16 - 176.31.196.23 fr -176.31.196.24 - 176.31.196.31 pl -176.31.196.32 - 176.31.196.79 fr -176.31.196.80 - 176.31.196.87 gb -176.31.196.88 - 176.31.196.95 fr -176.31.196.96 - 176.31.196.111 ie -176.31.196.112 - 176.31.196.115 es -176.31.196.116 - 176.31.196.127 ie -176.31.196.128 - 176.31.196.131 pl -176.31.196.132 - 176.31.196.135 gb -176.31.196.136 - 176.31.196.139 es -176.31.196.140 - 176.31.196.143 de -176.31.196.144 - 176.31.196.147 es -176.31.196.148 - 176.31.196.151 pt -176.31.196.152 - 176.31.196.155 ie -176.31.196.156 - 176.31.196.159 fr -176.31.196.160 - 176.31.196.191 pl -176.31.196.192 - 176.31.198.3 fr -176.31.198.4 - 176.31.198.7 pl -176.31.198.8 - 176.31.198.15 de -176.31.198.16 - 176.31.198.31 fr -176.31.198.32 - 176.31.198.63 de -176.31.198.64 - 176.31.198.95 gb -176.31.198.96 - 176.31.198.99 es -176.31.198.100 - 176.31.198.115 pl -176.31.198.116 - 176.31.198.119 fr -176.31.198.120 - 176.31.198.127 pl -176.31.198.128 - 176.31.199.11 fr -176.31.199.12 - 176.31.199.15 de -176.31.199.16 - 176.31.199.31 it -176.31.199.32 - 176.31.199.63 fr -176.31.199.64 - 176.31.199.95 be -176.31.199.96 - 176.31.199.99 ie -176.31.199.100 - 176.31.199.103 es -176.31.199.104 - 176.31.199.111 fr -176.31.199.112 - 176.31.199.127 gb -176.31.199.128 - 176.31.199.255 de -176.31.200.0 - 176.31.202.23 fr -176.31.202.24 - 176.31.202.31 pl -176.31.202.32 - 176.31.202.47 fr -176.31.202.48 - 176.31.202.63 pl -176.31.202.64 - 176.31.202.103 fr -176.31.202.104 - 176.31.202.115 pl -176.31.202.116 - 176.31.202.119 nl -176.31.202.120 - 176.31.202.123 pl -176.31.202.124 - 176.31.202.191 fr -176.31.202.192 - 176.31.202.223 de -176.31.202.224 - 176.31.202.239 fr -176.31.202.240 - 176.31.202.247 es -176.31.202.248 - 176.31.202.255 fr -176.31.203.0 - 176.31.203.31 de -176.31.203.32 - 176.31.203.35 nl -176.31.203.36 - 176.31.203.39 pl -176.31.203.40 - 176.31.203.47 fr -176.31.203.48 - 176.31.203.63 pl -176.31.203.64 - 176.31.203.79 it -176.31.203.80 - 176.31.203.95 fr -176.31.203.96 - 176.31.203.127 es -176.31.203.128 - 176.31.203.159 fr -176.31.203.160 - 176.31.203.191 de -176.31.203.192 - 176.31.203.199 fr -176.31.203.200 - 176.31.203.203 pl -176.31.203.204 - 176.31.203.207 nl -176.31.203.208 - 176.31.203.215 de -176.31.203.216 - 176.31.203.219 fi -176.31.203.220 - 176.31.203.231 fr -176.31.203.232 - 176.31.203.235 it -176.31.203.236 - 176.31.203.239 pl -176.31.203.240 - 176.31.203.247 it -176.31.203.248 - 176.31.203.251 gb -176.31.203.252 - 176.31.203.255 pl -176.31.204.0 - 176.31.204.255 gb -176.31.205.0 - 176.31.205.255 fr -176.31.206.0 - 176.31.206.7 es -176.31.206.8 - 176.31.206.19 fr -176.31.206.20 - 176.31.206.23 pl -176.31.206.24 - 176.31.206.47 ie -176.31.206.48 - 176.31.206.51 nl -176.31.206.52 - 176.31.206.55 fr -176.31.206.56 - 176.31.206.59 gb -176.31.206.60 - 176.31.206.63 es -176.31.206.64 - 176.31.206.127 fr -176.31.206.128 - 176.31.206.191 nl -176.31.206.192 - 176.31.206.199 gb -176.31.206.200 - 176.31.206.223 fr -176.31.206.224 - 176.31.206.255 pt -176.31.207.0 - 176.31.207.3 be -176.31.207.4 - 176.31.207.7 fr -176.31.207.8 - 176.31.207.15 gb -176.31.207.16 - 176.31.207.23 es -176.31.207.24 - 176.31.207.27 fr -176.31.207.28 - 176.31.207.31 pl -176.31.207.32 - 176.31.207.47 fr -176.31.207.48 - 176.31.207.51 pl -176.31.207.52 - 176.31.207.55 gb -176.31.207.56 - 176.31.207.63 fr -176.31.207.64 - 176.31.207.95 ie -176.31.207.96 - 176.31.207.127 fi -176.31.207.128 - 176.31.207.175 ie -176.31.207.176 - 176.31.207.191 gb -176.31.207.192 - 176.31.207.195 fr -176.31.207.196 - 176.31.207.199 it -176.31.207.200 - 176.31.207.203 fr -176.31.207.204 - 176.31.207.207 pl -176.31.207.208 - 176.31.207.231 fr -176.31.207.232 - 176.31.207.235 de -176.31.207.236 - 176.31.207.239 lt -176.31.207.240 - 176.31.207.243 fr -176.31.207.244 - 176.31.207.247 pl -176.31.207.248 - 176.31.208.39 fr -176.31.208.40 - 176.31.208.43 pl -176.31.208.44 - 176.31.208.47 fr -176.31.208.48 - 176.31.208.63 pl -176.31.208.64 - 176.31.208.95 ie -176.31.208.96 - 176.31.208.99 pl -176.31.208.100 - 176.31.208.103 de -176.31.208.104 - 176.31.208.107 gb -176.31.208.108 - 176.31.208.111 pl -176.31.208.112 - 176.31.208.127 ie -176.31.208.128 - 176.31.208.159 fr -176.31.208.160 - 176.31.208.167 pl -176.31.208.168 - 176.31.208.171 fr -176.31.208.172 - 176.31.208.175 nl -176.31.208.176 - 176.31.208.183 it -176.31.208.184 - 176.31.208.187 de -176.31.208.188 - 176.31.208.191 fi -176.31.208.192 - 176.31.208.195 nl -176.31.208.196 - 176.31.208.199 gb -176.31.208.200 - 176.31.208.215 fr -176.31.208.216 - 176.31.208.219 gb -176.31.208.220 - 176.31.208.223 pl -176.31.208.224 - 176.31.209.47 fr -176.31.209.48 - 176.31.209.55 gb -176.31.209.56 - 176.31.209.63 fr -176.31.209.64 - 176.31.209.67 pl -176.31.209.68 - 176.31.209.71 de -176.31.209.72 - 176.31.209.79 nl -176.31.209.80 - 176.31.209.95 fr -176.31.209.96 - 176.31.209.127 es -176.31.209.128 - 176.31.209.159 fr -176.31.209.160 - 176.31.209.175 pl -176.31.209.176 - 176.31.209.191 fr -176.31.209.192 - 176.31.209.223 pl -176.31.209.224 - 176.31.209.247 fr -176.31.209.248 - 176.31.209.255 de -176.31.210.0 - 176.31.210.71 es -176.31.210.72 - 176.31.210.75 nl -176.31.210.76 - 176.31.210.79 gb -176.31.210.80 - 176.31.210.95 fr -176.31.210.96 - 176.31.210.99 lt -176.31.210.100 - 176.31.210.103 gb -176.31.210.104 - 176.31.210.111 it -176.31.210.112 - 176.31.210.127 fr -176.31.210.128 - 176.31.210.151 pl -176.31.210.152 - 176.31.210.159 fr -176.31.210.160 - 176.31.210.191 pl -176.31.210.192 - 176.31.210.195 es -176.31.210.196 - 176.31.210.199 it -176.31.210.200 - 176.31.210.207 fr -176.31.210.208 - 176.31.210.223 pt -176.31.210.224 - 176.31.210.231 pl -176.31.210.232 - 176.31.210.235 de -176.31.210.236 - 176.31.210.239 es -176.31.210.240 - 176.31.210.247 fr -176.31.210.248 - 176.31.210.255 be -176.31.211.0 - 176.31.211.3 es -176.31.211.4 - 176.31.211.7 be -176.31.211.8 - 176.31.211.11 fr -176.31.211.12 - 176.31.211.15 pt -176.31.211.16 - 176.31.211.23 es -176.31.211.24 - 176.31.211.31 fr -176.31.211.32 - 176.31.211.63 pt -176.31.211.64 - 176.31.211.127 ie -176.31.211.128 - 176.31.211.255 pt -176.31.212.0 - 176.31.212.3 it -176.31.212.4 - 176.31.212.7 ch -176.31.212.8 - 176.31.212.15 es -176.31.212.16 - 176.31.212.31 fr -176.31.212.32 - 176.31.212.47 pl -176.31.212.48 - 176.31.212.95 ie -176.31.212.96 - 176.31.212.127 gb -176.31.212.128 - 176.31.212.135 it -176.31.212.136 - 176.31.212.139 fr -176.31.212.140 - 176.31.212.143 gb -176.31.212.144 - 176.31.212.147 es -176.31.212.148 - 176.31.212.151 nl -176.31.212.152 - 176.31.212.155 pl -176.31.212.156 - 176.31.212.159 es -176.31.212.160 - 176.31.212.175 fr -176.31.212.176 - 176.31.212.191 pl -176.31.212.192 - 176.31.212.207 fr -176.31.212.208 - 176.31.212.215 ie -176.31.212.216 - 176.31.212.219 cz -176.31.212.220 - 176.31.212.223 nl -176.31.212.224 - 176.31.212.243 fr -176.31.212.244 - 176.31.212.247 be -176.31.212.248 - 176.31.212.255 fr -176.31.213.0 - 176.31.213.7 fi -176.31.213.8 - 176.31.213.15 nl -176.31.213.16 - 176.31.213.31 fr -176.31.213.32 - 176.31.213.63 pt -176.31.213.64 - 176.31.213.71 fr -176.31.213.72 - 176.31.213.75 pl -176.31.213.76 - 176.31.213.79 ie -176.31.213.80 - 176.31.213.87 pl -176.31.213.88 - 176.31.213.127 es -176.31.213.128 - 176.31.213.191 fr -176.31.213.192 - 176.31.213.223 es -176.31.213.224 - 176.31.213.231 fr -176.31.213.232 - 176.31.213.235 de -176.31.213.236 - 176.31.213.239 ie -176.31.213.240 - 176.31.213.243 gb -176.31.213.244 - 176.31.213.247 nl -176.31.213.248 - 176.31.213.251 lt -176.31.213.252 - 176.31.213.255 de -176.31.214.0 - 176.31.214.159 pt -176.31.214.160 - 176.31.214.163 es -176.31.214.164 - 176.31.214.167 fr -176.31.214.168 - 176.31.214.171 es -176.31.214.172 - 176.31.214.175 de -176.31.214.176 - 176.31.214.223 ie -176.31.214.224 - 176.31.214.227 de -176.31.214.228 - 176.31.214.231 it -176.31.214.232 - 176.31.214.239 fr -176.31.214.240 - 176.31.214.255 be -176.31.215.0 - 176.31.215.31 pt -176.31.215.32 - 176.31.215.47 fr -176.31.215.48 - 176.31.215.55 gb -176.31.215.56 - 176.31.215.59 pl -176.31.215.60 - 176.31.215.63 de -176.31.215.64 - 176.31.215.95 it -176.31.215.96 - 176.31.215.111 gb -176.31.215.112 - 176.31.215.123 fr -176.31.215.124 - 176.31.215.127 de -176.31.215.128 - 176.31.215.191 ie -176.31.215.192 - 176.31.215.223 de -176.31.215.224 - 176.31.215.227 gb -176.31.215.228 - 176.31.215.231 it -176.31.215.232 - 176.31.216.31 fr -176.31.216.32 - 176.31.216.47 de -176.31.216.48 - 176.31.216.55 pl -176.31.216.56 - 176.31.216.59 fr -176.31.216.60 - 176.31.216.63 es -176.31.216.64 - 176.31.216.79 pl -176.31.216.80 - 176.31.216.95 cz -176.31.216.96 - 176.31.216.99 es -176.31.216.100 - 176.31.216.103 pl -176.31.216.104 - 176.31.216.107 fr -176.31.216.108 - 176.31.216.111 gb -176.31.216.112 - 176.31.216.127 fr -176.31.216.128 - 176.31.216.131 pl -176.31.216.132 - 176.31.216.135 gb -176.31.216.136 - 176.31.216.143 de -176.31.216.144 - 176.31.216.159 ch -176.31.216.160 - 176.31.216.191 gb -176.31.216.192 - 176.31.216.223 es -176.31.216.224 - 176.31.216.231 nl -176.31.216.232 - 176.31.216.235 pl -176.31.216.236 - 176.31.216.239 fr -176.31.216.240 - 176.31.216.255 de -176.31.217.0 - 176.31.218.15 fr -176.31.218.16 - 176.31.218.19 pt -176.31.218.20 - 176.31.218.23 fr -176.31.218.24 - 176.31.218.31 de -176.31.218.32 - 176.31.218.63 fr -176.31.218.64 - 176.31.218.79 es -176.31.218.80 - 176.31.218.83 be -176.31.218.84 - 176.31.218.87 es -176.31.218.88 - 176.31.218.95 pt -176.31.218.96 - 176.31.218.99 pl -176.31.218.100 - 176.31.218.107 fr -176.31.218.108 - 176.31.218.111 pl -176.31.218.112 - 176.31.218.143 fr -176.31.218.144 - 176.31.218.155 de -176.31.218.156 - 176.31.218.159 pt -176.31.218.160 - 176.31.218.175 pl -176.31.218.176 - 176.31.218.191 nl -176.31.218.192 - 176.31.218.207 fr -176.31.218.208 - 176.31.218.211 pl -176.31.218.212 - 176.31.218.215 de -176.31.218.216 - 176.31.218.223 fr -176.31.218.224 - 176.31.218.227 gb -176.31.218.228 - 176.31.218.231 pl -176.31.218.232 - 176.31.218.235 fr -176.31.218.236 - 176.31.218.239 pl -176.31.218.240 - 176.31.219.31 fr -176.31.219.32 - 176.31.219.47 ie -176.31.219.48 - 176.31.219.83 fr -176.31.219.84 - 176.31.219.87 a1 -176.31.219.88 - 176.31.219.95 it -176.31.219.96 - 176.31.219.123 fr -176.31.219.124 - 176.31.219.127 pl -176.31.219.128 - 176.31.220.11 fr -176.31.220.12 - 176.31.220.15 de -176.31.220.16 - 176.31.220.31 pt -176.31.220.32 - 176.31.220.39 lt -176.31.220.40 - 176.31.220.43 fr -176.31.220.44 - 176.31.220.47 pl -176.31.220.48 - 176.31.220.55 fr -176.31.220.56 - 176.31.220.59 it -176.31.220.60 - 176.31.220.63 gb -176.31.220.64 - 176.31.220.79 fr -176.31.220.80 - 176.31.220.83 nl -176.31.220.84 - 176.31.220.87 fr -176.31.220.88 - 176.31.220.95 pl -176.31.220.96 - 176.31.220.111 fr -176.31.220.112 - 176.31.220.127 it -176.31.220.128 - 176.31.220.143 fr -176.31.220.144 - 176.31.220.151 es -176.31.220.152 - 176.31.220.159 fr -176.31.220.160 - 176.31.220.191 pt -176.31.220.192 - 176.31.220.255 fr -176.31.221.0 - 176.31.221.255 es -176.31.222.0 - 176.31.222.7 ch -176.31.222.8 - 176.31.222.11 fr -176.31.222.12 - 176.31.222.31 nl -176.31.222.32 - 176.31.222.35 gb -176.31.222.36 - 176.31.222.47 fr -176.31.222.48 - 176.31.222.95 ie -176.31.222.96 - 176.31.222.111 fr -176.31.222.112 - 176.31.222.115 gb -176.31.222.116 - 176.31.222.119 de -176.31.222.120 - 176.31.222.127 gb -176.31.222.128 - 176.31.222.143 be -176.31.222.144 - 176.31.222.159 fi -176.31.222.160 - 176.31.222.167 pl -176.31.222.168 - 176.31.222.171 it -176.31.222.172 - 176.31.222.175 fr -176.31.222.176 - 176.31.222.191 it -176.31.222.192 - 176.31.222.223 pl -176.31.222.224 - 176.31.222.231 fr -176.31.222.232 - 176.31.222.239 ie -176.31.222.240 - 176.31.222.243 it -176.31.222.244 - 176.31.222.247 pl -176.31.222.248 - 176.31.222.255 es -176.31.223.0 - 176.31.223.43 fr -176.31.223.44 - 176.31.223.47 gb -176.31.223.48 - 176.31.223.63 fr -176.31.223.64 - 176.31.223.127 ie -176.31.223.128 - 176.31.223.135 fr -176.31.223.136 - 176.31.223.143 ie -176.31.223.144 - 176.31.223.159 it -176.31.223.160 - 176.31.223.163 es -176.31.223.164 - 176.31.223.167 pl -176.31.223.168 - 176.31.223.171 fr -176.31.223.172 - 176.31.223.175 gb -176.31.223.176 - 176.31.223.179 de -176.31.223.180 - 176.31.223.183 gb -176.31.223.184 - 176.31.223.191 fr -176.31.223.192 - 176.31.223.195 de -176.31.223.196 - 176.31.223.199 pl -176.31.223.200 - 176.31.223.211 fr -176.31.223.212 - 176.31.223.219 gb -176.31.223.220 - 176.31.223.223 pl -176.31.223.224 - 176.31.255.255 fr +176.31.156.64 - 176.31.157.43 fr +176.31.157.44 - 176.31.157.47 cz +176.31.157.48 - 176.31.157.51 fr +176.31.157.52 - 176.31.157.55 ch +176.31.157.56 - 176.31.159.79 fr +176.31.159.80 - 176.31.159.83 es +176.31.159.84 - 176.31.177.97 fr +176.31.177.98 - 176.31.177.99 pt +176.31.177.100 - 176.31.192.15 fr +176.31.192.16 - 176.31.192.19 es +176.31.192.20 - 176.31.192.55 fr +176.31.192.56 - 176.31.192.59 it +176.31.192.60 - 176.31.192.63 es +176.31.192.64 - 176.31.192.119 fr +176.31.192.120 - 176.31.192.123 es +176.31.192.124 - 176.31.206.63 fr +176.31.206.64 - 176.31.206.79 gb +176.31.206.80 - 176.31.207.31 fr +176.31.207.32 - 176.31.207.39 de +176.31.207.40 - 176.31.211.231 fr +176.31.211.232 - 176.31.211.235 es +176.31.211.236 - 176.31.215.199 fr +176.31.215.200 - 176.31.215.203 es +176.31.215.204 - 176.31.215.215 fr +176.31.215.216 - 176.31.215.219 es +176.31.215.220 - 176.31.216.175 fr +176.31.216.176 - 176.31.216.179 pl +176.31.216.180 - 176.31.216.235 fr +176.31.216.236 - 176.31.216.239 es +176.31.216.240 - 176.31.219.123 fr +176.31.219.124 - 176.31.219.127 es +176.31.219.128 - 176.31.223.187 fr +176.31.223.188 - 176.31.223.191 es +176.31.223.192 - 176.31.255.255 fr 176.32.0.0 - 176.32.15.255 ua 176.32.16.0 - 176.32.31.255 it 176.32.32.0 - 176.32.39.255 ru 176.32.40.0 - 176.32.47.255 de 176.32.48.0 - 176.32.55.255 es 176.32.56.0 - 176.32.63.255 it -176.32.64.0 - 176.32.71.255 nl -176.32.72.0 - 176.32.79.255 ie -176.32.80.0 - 176.32.87.255 gb -176.32.88.0 - 176.32.95.255 de -176.32.96.0 - 176.32.123.255 ie -176.32.124.0 - 176.32.125.255 nl -176.32.126.0 - 176.32.127.255 ie +176.32.64.0 - 176.32.95.255 jp +176.32.96.0 - 176.32.103.255 us +176.32.104.0 - 176.32.111.255 ie +176.32.112.0 - 176.32.123.255 us +176.32.124.0 - 176.32.124.255 ie +176.32.125.0 - 176.32.125.127 us +176.32.125.128 - 176.32.127.255 ie 176.32.128.0 - 176.32.159.255 ru 176.32.160.0 - 176.32.175.255 pl 176.32.176.0 - 176.32.191.255 ru 176.32.192.0 - 176.32.199.255 am 176.32.200.0 - 176.32.207.255 hu -176.32.208.0 - 176.32.208.242 de -176.32.208.243 - 176.32.208.246 pl -176.32.208.247 - 176.32.208.250 de -176.32.208.251 - 176.32.208.254 pl -176.32.208.255 - 176.32.209.255 de -176.32.210.0 - 176.32.210.3 ro -176.32.210.4 - 176.32.210.7 de -176.32.210.8 - 176.32.210.11 tr -176.32.210.12 - 176.32.210.15 de -176.32.210.16 - 176.32.210.19 tr -176.32.210.20 - 176.32.210.35 de -176.32.210.36 - 176.32.210.39 tr -176.32.210.40 - 176.32.210.59 de -176.32.210.60 - 176.32.210.63 tr -176.32.210.64 - 176.32.210.83 de -176.32.210.84 - 176.32.210.87 tr -176.32.210.88 - 176.32.210.107 de -176.32.210.108 - 176.32.210.111 tr -176.32.210.112 - 176.32.210.119 de -176.32.210.120 - 176.32.210.123 ro -176.32.210.124 - 176.32.210.135 de -176.32.210.136 - 176.32.210.143 tr -176.32.210.144 - 176.32.210.163 de -176.32.210.164 - 176.32.210.167 tr -176.32.210.168 - 176.32.210.187 de -176.32.210.188 - 176.32.210.191 tr -176.32.210.192 - 176.32.210.211 de -176.32.210.212 - 176.32.210.215 tr -176.32.210.216 - 176.32.210.219 de -176.32.210.220 - 176.32.210.223 gr -176.32.210.224 - 176.32.210.235 de -176.32.210.236 - 176.32.210.239 tr -176.32.210.240 - 176.32.210.243 de -176.32.210.244 - 176.32.210.247 tr -176.32.210.248 - 176.32.211.3 de -176.32.211.4 - 176.32.211.7 tr -176.32.211.8 - 176.32.211.9 de -176.32.211.10 - 176.32.211.13 gr -176.32.211.14 - 176.32.211.25 de -176.32.211.26 - 176.32.211.29 tr -176.32.211.30 - 176.32.211.35 de -176.32.211.36 - 176.32.211.39 tr -176.32.211.40 - 176.32.211.59 de -176.32.211.60 - 176.32.211.63 tr -176.32.211.64 - 176.32.211.83 de -176.32.211.84 - 176.32.211.87 tr -176.32.211.88 - 176.32.211.107 de -176.32.211.108 - 176.32.211.111 tr -176.32.211.112 - 176.32.211.130 de -176.32.211.131 - 176.32.211.134 ro -176.32.211.135 - 176.32.211.135 de -176.32.211.136 - 176.32.211.139 tr -176.32.211.140 - 176.32.211.146 de -176.32.211.147 - 176.32.211.150 tr -176.32.211.151 - 176.32.211.229 de -176.32.211.230 - 176.32.211.233 gr -176.32.211.234 - 176.32.211.245 de -176.32.211.246 - 176.32.211.249 tr -176.32.211.250 - 176.32.212.7 de -176.32.212.8 - 176.32.212.11 ro -176.32.212.12 - 176.32.212.23 de -176.32.212.24 - 176.32.212.27 tr -176.32.212.28 - 176.32.212.107 de -176.32.212.108 - 176.32.212.111 gr -176.32.212.112 - 176.32.212.123 de -176.32.212.124 - 176.32.212.127 tr -176.32.212.128 - 176.32.212.207 de -176.32.212.208 - 176.32.212.211 gr -176.32.212.212 - 176.32.212.223 de -176.32.212.224 - 176.32.212.227 tr -176.32.212.228 - 176.32.213.7 de -176.32.213.8 - 176.32.213.11 gr -176.32.213.12 - 176.32.213.23 de -176.32.213.24 - 176.32.213.27 tr -176.32.213.28 - 176.32.213.31 gr -176.32.213.32 - 176.32.213.43 de -176.32.213.44 - 176.32.213.47 tr -176.32.213.48 - 176.32.213.107 de -176.32.213.108 - 176.32.213.111 gr -176.32.213.112 - 176.32.213.123 de -176.32.213.124 - 176.32.213.127 tr -176.32.213.128 - 176.32.213.177 de -176.32.213.178 - 176.32.213.181 ro -176.32.213.182 - 176.32.213.193 de -176.32.213.194 - 176.32.213.197 tr -176.32.213.198 - 176.32.213.207 de -176.32.213.208 - 176.32.213.211 ro -176.32.213.212 - 176.32.213.223 de -176.32.213.224 - 176.32.213.227 tr -176.32.213.228 - 176.32.213.239 de -176.32.213.240 - 176.32.213.243 ro -176.32.213.244 - 176.32.213.255 de -176.32.214.0 - 176.32.214.3 gr -176.32.214.4 - 176.32.214.9 de -176.32.214.10 - 176.32.214.13 es -176.32.214.14 - 176.32.214.15 de -176.32.214.16 - 176.32.214.19 tr -176.32.214.20 - 176.32.214.89 de -176.32.214.90 - 176.32.214.93 gr -176.32.214.94 - 176.32.214.105 de -176.32.214.106 - 176.32.214.106 tr -176.32.214.107 - 176.32.214.156 de -176.32.214.157 - 176.32.214.160 es -176.32.214.161 - 176.32.214.199 de -176.32.214.200 - 176.32.214.203 ro -176.32.214.204 - 176.32.214.215 de -176.32.214.216 - 176.32.214.219 tr -176.32.214.220 - 176.32.214.239 de -176.32.214.240 - 176.32.214.243 tr -176.32.214.244 - 176.32.215.19 de -176.32.215.20 - 176.32.215.23 ro -176.32.215.24 - 176.32.215.35 de -176.32.215.36 - 176.32.215.39 tr -176.32.215.40 - 176.32.215.139 de -176.32.215.140 - 176.32.215.143 gr -176.32.215.144 - 176.32.215.155 de -176.32.215.156 - 176.32.215.159 tr -176.32.215.160 - 176.32.215.219 de -176.32.215.220 - 176.32.215.223 tr -176.32.215.224 - 176.32.215.233 de -176.32.215.234 - 176.32.215.237 tr -176.32.215.238 - 176.32.215.249 de -176.32.215.250 - 176.32.215.253 ro -176.32.215.254 - 176.32.216.7 de -176.32.216.8 - 176.32.216.11 gr -176.32.216.12 - 176.32.216.15 de -176.32.216.16 - 176.32.216.19 es -176.32.216.20 - 176.32.216.23 de -176.32.216.24 - 176.32.216.27 tr -176.32.216.28 - 176.32.216.99 de -176.32.216.100 - 176.32.216.103 tr -176.32.216.104 - 176.32.216.107 de -176.32.216.108 - 176.32.216.111 ro -176.32.216.112 - 176.32.216.123 de -176.32.216.124 - 176.32.216.127 tr -176.32.216.128 - 176.32.216.190 de -176.32.216.191 - 176.32.216.194 es -176.32.216.195 - 176.32.216.207 de -176.32.216.208 - 176.32.216.211 gr -176.32.216.212 - 176.32.216.223 de -176.32.216.224 - 176.32.216.227 tr -176.32.216.228 - 176.32.216.255 de -176.32.217.0 - 176.32.217.3 tr -176.32.217.4 - 176.32.217.7 de -176.32.217.8 - 176.32.217.11 ro -176.32.217.12 - 176.32.217.23 de -176.32.217.24 - 176.32.217.27 tr -176.32.217.28 - 176.32.217.119 de -176.32.217.120 - 176.32.217.123 fr -176.32.217.124 - 176.32.217.127 tr -176.32.217.128 - 176.32.217.131 fr -176.32.217.132 - 176.32.217.151 gb -176.32.217.152 - 176.32.217.155 fr -176.32.217.156 - 176.32.217.223 de -176.32.217.224 - 176.32.217.227 tr -176.32.217.228 - 176.32.218.3 de -176.32.218.4 - 176.32.218.7 tr -176.32.218.8 - 176.32.218.27 de -176.32.218.28 - 176.32.218.31 tr -176.32.218.32 - 176.32.218.51 de -176.32.218.52 - 176.32.218.55 tr -176.32.218.56 - 176.32.218.75 de -176.32.218.76 - 176.32.218.79 tr -176.32.218.80 - 176.32.218.99 de -176.32.218.100 - 176.32.218.103 tr -176.32.218.104 - 176.32.218.123 de -176.32.218.124 - 176.32.218.127 tr -176.32.218.128 - 176.32.218.147 de -176.32.218.148 - 176.32.218.151 tr -176.32.218.152 - 176.32.218.170 de -176.32.218.171 - 176.32.218.174 tr -176.32.218.175 - 176.32.218.194 de -176.32.218.195 - 176.32.218.198 tr -176.32.218.199 - 176.32.218.218 de -176.32.218.219 - 176.32.218.222 tr -176.32.218.223 - 176.32.218.242 de -176.32.218.243 - 176.32.218.246 tr -176.32.218.247 - 176.32.219.3 de -176.32.219.4 - 176.32.219.7 tr -176.32.219.8 - 176.32.219.27 de -176.32.219.28 - 176.32.219.31 tr -176.32.219.32 - 176.32.219.51 de -176.32.219.52 - 176.32.219.55 tr -176.32.219.56 - 176.32.219.75 de -176.32.219.76 - 176.32.219.79 tr -176.32.219.80 - 176.32.219.99 de -176.32.219.100 - 176.32.219.103 tr -176.32.219.104 - 176.32.219.123 de -176.32.219.124 - 176.32.219.127 tr -176.32.219.128 - 176.32.219.147 de -176.32.219.148 - 176.32.219.151 tr -176.32.219.152 - 176.32.219.171 de -176.32.219.172 - 176.32.219.175 tr -176.32.219.176 - 176.32.219.195 de -176.32.219.196 - 176.32.219.199 tr -176.32.219.200 - 176.32.219.219 de -176.32.219.220 - 176.32.219.223 tr -176.32.219.224 - 176.32.219.243 de -176.32.219.244 - 176.32.219.247 tr -176.32.219.248 - 176.32.220.3 de -176.32.220.4 - 176.32.220.7 tr -176.32.220.8 - 176.32.220.27 de -176.32.220.28 - 176.32.220.31 tr -176.32.220.32 - 176.32.220.51 de -176.32.220.52 - 176.32.220.55 tr -176.32.220.56 - 176.32.220.59 de -176.32.220.60 - 176.32.220.75 gb -176.32.220.76 - 176.32.220.79 tr -176.32.220.80 - 176.32.220.95 gb -176.32.220.96 - 176.32.220.99 de -176.32.220.100 - 176.32.220.103 tr -176.32.220.104 - 176.32.220.115 gb -176.32.220.116 - 176.32.220.123 fr -176.32.220.124 - 176.32.220.127 tr -176.32.220.128 - 176.32.220.135 fr -176.32.220.136 - 176.32.220.147 de -176.32.220.148 - 176.32.220.151 tr -176.32.220.152 - 176.32.220.171 de -176.32.220.172 - 176.32.220.175 tr -176.32.220.176 - 176.32.220.195 de -176.32.220.196 - 176.32.220.199 tr -176.32.220.200 - 176.32.220.219 de -176.32.220.220 - 176.32.220.223 tr -176.32.220.224 - 176.32.220.243 de -176.32.220.244 - 176.32.220.247 tr -176.32.220.248 - 176.32.220.255 de -176.32.221.0 - 176.32.221.79 gb -176.32.221.80 - 176.32.221.159 de -176.32.221.160 - 176.32.221.199 fr -176.32.221.200 - 176.32.221.255 de -176.32.222.0 - 176.32.222.7 ro -176.32.222.8 - 176.32.223.255 de +176.32.208.0 - 176.32.223.255 de 176.32.224.0 - 176.32.231.255 gb 176.32.232.0 - 176.32.239.255 de 176.32.240.0 - 176.32.247.255 ru 176.32.248.0 - 176.32.255.255 es 176.33.0.0 - 176.33.255.255 tr -176.34.0.0 - 176.34.31.255 fr -176.34.32.0 - 176.34.63.255 nl -176.34.64.0 - 176.34.127.255 ie -176.34.128.0 - 176.34.191.255 nl -176.34.192.0 - 176.34.199.255 ie -176.34.200.0 - 176.34.207.255 nl -176.34.208.0 - 176.34.215.255 ie -176.34.216.0 - 176.34.223.255 fr -176.34.224.0 - 176.34.255.255 nl +176.34.0.0 - 176.34.37.14 jp +176.34.37.15 - 176.34.37.15 ie +176.34.37.16 - 176.34.63.255 jp +176.34.64.0 - 176.34.255.255 ie 176.35.0.0 - 176.35.255.255 gb 176.36.0.0 - 176.39.255.255 ua 176.40.0.0 - 176.43.255.255 tr @@ -76363,12 +59369,16 @@ 176.46.128.0 - 176.46.159.255 ir 176.46.160.0 - 176.46.191.255 gb 176.46.192.0 - 176.46.255.255 ch -176.47.0.0 - 176.47.255.255 ua +176.47.0.0 - 176.47.255.255 sa 176.48.0.0 - 176.52.127.255 ru 176.52.128.0 - 176.52.159.255 si 176.52.160.0 - 176.52.175.255 es -176.52.176.0 - 176.52.183.255 se -176.52.184.0 - 176.52.191.255 fr +176.52.176.0 - 176.52.183.255 jo +176.52.184.0 - 176.52.184.255 fr +176.52.185.0 - 176.52.185.255 ro +176.52.186.0 - 176.52.186.255 gb +176.52.187.0 - 176.52.187.255 de +176.52.188.0 - 176.52.191.255 fr 176.52.192.0 - 176.52.207.255 de 176.52.208.0 - 176.52.215.255 gb 176.52.216.0 - 176.52.223.255 ie @@ -76376,23 +59386,26 @@ 176.52.240.0 - 176.52.247.255 de 176.52.248.0 - 176.52.255.255 es 176.53.0.0 - 176.53.127.255 tr -176.53.128.0 - 176.53.255.255 ru +176.53.192.0 - 176.53.255.255 ru 176.54.0.0 - 176.55.255.255 tr 176.56.0.0 - 176.56.31.255 ru 176.56.32.0 - 176.56.39.255 lv -176.56.40.0 - 176.56.47.255 nl 176.56.48.0 - 176.56.55.255 ru 176.56.56.0 - 176.56.63.255 gb 176.56.64.0 - 176.56.127.255 es 176.56.128.0 - 176.56.143.255 ch 176.56.144.0 - 176.56.159.255 ir -176.56.160.0 - 176.56.174.255 ru -176.56.175.0 - 176.56.175.255 gb -176.56.176.0 - 176.56.183.255 ru +176.56.160.0 - 176.56.167.255 nl +176.56.168.0 - 176.56.171.255 cy +176.56.172.0 - 176.56.172.255 ch +176.56.173.0 - 176.56.173.255 nl +176.56.174.0 - 176.56.174.255 ch +176.56.175.0 - 176.56.175.255 ru +176.56.176.0 - 176.56.179.255 nl +176.56.180.0 - 176.56.180.255 gb +176.56.181.0 - 176.56.183.255 ru 176.56.184.0 - 176.56.187.255 nl -176.56.188.0 - 176.56.188.255 ru -176.56.189.0 - 176.56.189.255 fr -176.56.190.0 - 176.56.191.255 nl +176.56.188.0 - 176.56.191.255 ru 176.56.192.0 - 176.56.223.255 gb 176.56.224.0 - 176.56.239.255 nl 176.56.240.0 - 176.56.255.255 se @@ -76400,17 +59413,16 @@ 176.57.32.0 - 176.57.39.255 fr 176.57.40.0 - 176.57.47.255 lv 176.57.48.0 - 176.57.63.255 ua -176.57.64.0 - 176.57.71.255 fr 176.57.72.0 - 176.57.79.255 ru 176.57.80.0 - 176.57.87.255 fr -176.57.88.0 - 176.57.95.255 me +176.57.88.0 - 176.57.95.255 hr 176.57.96.0 - 176.57.111.255 es 176.57.112.0 - 176.57.127.255 it 176.57.128.0 - 176.57.191.255 de 176.57.192.0 - 176.57.199.255 se 176.57.200.0 - 176.57.207.255 es 176.57.208.0 - 176.57.223.255 ru -176.57.224.0 - 176.57.239.255 ch +176.57.224.0 - 176.57.239.255 is 176.57.240.0 - 176.57.247.255 fr 176.57.248.0 - 176.58.7.255 gb 176.58.8.0 - 176.58.15.255 es @@ -76422,26 +59434,26 @@ 176.58.88.0 - 176.58.88.255 gb 176.58.89.0 - 176.58.89.255 nl 176.58.90.0 - 176.58.90.255 fr -176.58.91.0 - 176.58.95.255 eu +176.58.91.0 - 176.58.91.255 eu +176.58.92.0 - 176.58.92.255 gb +176.58.93.0 - 176.58.93.255 nl +176.58.94.0 - 176.58.94.255 fr +176.58.95.0 - 176.58.95.255 eu 176.58.96.0 - 176.58.127.255 gb 176.58.128.0 - 176.58.255.255 gr 176.59.0.0 - 176.59.255.255 ru 176.60.0.0 - 176.60.255.255 by 176.61.0.0 - 176.61.127.255 ie 176.61.128.0 - 176.61.135.255 nl -176.61.136.0 - 176.61.139.255 se +176.61.136.0 - 176.61.137.255 se +176.61.138.0 - 176.61.138.127 gb +176.61.138.128 - 176.61.139.255 se 176.61.140.0 - 176.61.143.255 us 176.61.144.0 - 176.61.151.255 pt -176.61.152.0 - 176.61.155.255 us -176.61.156.0 - 176.61.159.255 dk -176.61.160.0 - 176.61.160.95 ba -176.61.160.96 - 176.61.160.127 at -176.61.160.128 - 176.61.161.15 ba -176.61.161.16 - 176.61.161.31 at -176.61.161.32 - 176.61.161.63 ba -176.61.161.64 - 176.61.161.127 at -176.61.161.128 - 176.61.163.255 ba -176.61.164.0 - 176.61.191.255 at +176.61.152.0 - 176.61.159.255 hr +176.61.160.0 - 176.61.176.255 ba +176.61.177.0 - 176.61.179.255 at +176.61.180.0 - 176.61.191.255 ba 176.61.192.0 - 176.61.255.255 sk 176.62.0.0 - 176.62.47.255 hr 176.62.48.0 - 176.62.63.255 it @@ -76450,8 +59462,7 @@ 176.62.136.0 - 176.62.143.255 be 176.62.144.0 - 176.62.151.255 ir 176.62.152.0 - 176.62.159.255 it -176.62.160.0 - 176.62.169.255 be -176.62.170.0 - 176.62.175.255 nl +176.62.160.0 - 176.62.175.255 be 176.62.176.0 - 176.62.191.255 ru 176.62.192.0 - 176.62.199.255 nl 176.62.200.0 - 176.62.207.255 dk @@ -76467,216 +59478,30 @@ 176.65.72.0 - 176.65.79.255 lu 176.65.80.0 - 176.65.95.255 it 176.65.96.0 - 176.65.127.255 ru -176.65.128.0 - 176.65.171.255 de -176.65.172.0 - 176.65.183.255 ch -176.65.184.0 - 176.65.218.248 de -176.65.218.249 - 176.65.218.254 at -176.65.218.255 - 176.65.219.248 de -176.65.219.249 - 176.65.219.254 at -176.65.219.255 - 176.65.220.248 de -176.65.220.249 - 176.65.220.254 at -176.65.220.255 - 176.65.221.248 de -176.65.221.249 - 176.65.221.254 at -176.65.221.255 - 176.65.222.248 de -176.65.222.249 - 176.65.222.254 at -176.65.222.255 - 176.65.223.248 de -176.65.223.249 - 176.65.223.254 at -176.65.223.255 - 176.65.224.248 de -176.65.224.249 - 176.65.224.254 at -176.65.224.255 - 176.65.225.248 de -176.65.225.249 - 176.65.225.254 at -176.65.225.255 - 176.65.226.248 de -176.65.226.249 - 176.65.226.254 at -176.65.226.255 - 176.65.227.248 de -176.65.227.249 - 176.65.227.254 at -176.65.227.255 - 176.65.228.248 de -176.65.228.249 - 176.65.228.254 at -176.65.228.255 - 176.65.229.248 de -176.65.229.249 - 176.65.229.254 at -176.65.229.255 - 176.65.230.248 de -176.65.230.249 - 176.65.230.254 at -176.65.230.255 - 176.65.231.248 de -176.65.231.249 - 176.65.231.254 at -176.65.231.255 - 176.65.232.248 de -176.65.232.249 - 176.65.232.254 at -176.65.232.255 - 176.65.233.248 de -176.65.233.249 - 176.65.233.254 at -176.65.233.255 - 176.65.234.248 de -176.65.234.249 - 176.65.234.254 at -176.65.234.255 - 176.65.235.248 de -176.65.235.249 - 176.65.235.254 at -176.65.235.255 - 176.65.236.248 de -176.65.236.249 - 176.65.236.254 at -176.65.236.255 - 176.65.237.248 de -176.65.237.249 - 176.65.237.254 at -176.65.237.255 - 176.65.238.248 de -176.65.238.249 - 176.65.238.254 at -176.65.238.255 - 176.65.239.248 de -176.65.239.249 - 176.65.239.254 at -176.65.239.255 - 176.65.240.248 de -176.65.240.249 - 176.65.240.254 at -176.65.240.255 - 176.65.241.248 de -176.65.241.249 - 176.65.241.254 at -176.65.241.255 - 176.65.242.248 de -176.65.242.249 - 176.65.242.254 at -176.65.242.255 - 176.65.243.248 de -176.65.243.249 - 176.65.243.254 at -176.65.243.255 - 176.65.244.248 de -176.65.244.249 - 176.65.244.254 at -176.65.244.255 - 176.65.245.248 de -176.65.245.249 - 176.65.245.254 at -176.65.245.255 - 176.65.246.248 de -176.65.246.249 - 176.65.246.254 at -176.65.246.255 - 176.65.247.248 de -176.65.247.249 - 176.65.247.254 at -176.65.247.255 - 176.65.248.248 de -176.65.248.249 - 176.65.248.254 at -176.65.248.255 - 176.65.249.248 de -176.65.249.249 - 176.65.249.254 at -176.65.249.255 - 176.65.250.248 de -176.65.250.249 - 176.65.250.254 at -176.65.250.255 - 176.65.251.248 de -176.65.251.249 - 176.65.251.254 at -176.65.251.255 - 176.65.252.248 de -176.65.252.249 - 176.65.252.254 at -176.65.252.255 - 176.65.253.248 de -176.65.253.249 - 176.65.253.254 at -176.65.253.255 - 176.65.254.248 de -176.65.254.249 - 176.65.254.254 at -176.65.254.255 - 176.65.255.255 de +176.65.128.0 - 176.65.159.255 de +176.65.160.0 - 176.65.255.255 ir 176.66.0.0 - 176.66.255.255 at 176.67.0.0 - 176.67.31.255 ua 176.67.32.0 - 176.67.47.255 lv 176.67.48.0 - 176.67.55.255 ru 176.67.56.0 - 176.67.63.255 ps 176.67.64.0 - 176.67.79.255 ir -176.67.80.0 - 176.67.80.15 gb -176.67.80.16 - 176.67.80.19 ie -176.67.80.20 - 176.67.80.23 dk -176.67.80.24 - 176.67.80.27 ch -176.67.80.28 - 176.67.80.60 br -176.67.80.61 - 176.67.81.63 us -176.67.81.64 - 176.67.81.79 ca -176.67.81.80 - 176.67.81.95 mx -176.67.81.96 - 176.67.81.111 br -176.67.81.112 - 176.67.81.127 ar -176.67.81.128 - 176.67.81.143 bs -176.67.81.144 - 176.67.81.159 ve -176.67.81.160 - 176.67.81.175 au -176.67.81.176 - 176.67.81.191 jp -176.67.81.192 - 176.67.81.207 hk -176.67.81.208 - 176.67.81.223 ru -176.67.81.224 - 176.67.81.239 kr -176.67.81.240 - 176.67.81.255 tw -176.67.82.0 - 176.67.82.255 us -176.67.83.0 - 176.67.83.3 gb -176.67.83.4 - 176.67.83.7 br -176.67.83.8 - 176.67.83.11 ca -176.67.83.12 - 176.67.83.255 us -176.67.84.0 - 176.67.84.31 gb -176.67.84.32 - 176.67.84.35 pl -176.67.84.36 - 176.67.84.39 kr -176.67.84.40 - 176.67.84.43 br -176.67.84.44 - 176.67.84.47 eg -176.67.84.48 - 176.67.84.51 za -176.67.84.52 - 176.67.84.55 is -176.67.84.56 - 176.67.84.59 ca -176.67.84.60 - 176.67.84.63 il -176.67.84.64 - 176.67.84.67 de -176.67.84.68 - 176.67.84.71 ar -176.67.84.72 - 176.67.84.75 nz -176.67.84.76 - 176.67.84.79 de -176.67.84.80 - 176.67.84.95 no -176.67.84.96 - 176.67.84.111 se -176.67.84.112 - 176.67.84.119 fi -176.67.84.120 - 176.67.84.127 ee -176.67.84.128 - 176.67.84.135 lv -176.67.84.136 - 176.67.84.143 lt -176.67.84.144 - 176.67.84.151 by -176.67.84.152 - 176.67.84.159 ua -176.67.84.160 - 176.67.84.167 ro -176.67.84.168 - 176.67.84.175 bg -176.67.84.176 - 176.67.84.183 gr -176.67.84.184 - 176.67.84.191 tr -176.67.84.192 - 176.67.84.195 at -176.67.84.196 - 176.67.84.199 it -176.67.84.200 - 176.67.84.207 ch -176.67.84.208 - 176.67.84.211 lu -176.67.84.212 - 176.67.84.215 be -176.67.84.216 - 176.67.84.219 nl -176.67.84.220 - 176.67.84.235 dk -176.67.84.236 - 176.67.84.239 fr -176.67.84.240 - 176.67.84.243 us -176.67.84.244 - 176.67.84.247 es -176.67.84.248 - 176.67.84.251 pt -176.67.84.252 - 176.67.84.255 au -176.67.85.0 - 176.67.85.3 ru -176.67.85.4 - 176.67.85.11 ie -176.67.85.12 - 176.67.85.15 jp -176.67.85.16 - 176.67.86.0 us -176.67.86.1 - 176.67.86.3 al -176.67.86.4 - 176.67.86.7 ad -176.67.86.8 - 176.67.86.11 ar -176.67.86.12 - 176.67.86.15 au -176.67.86.16 - 176.67.86.19 by -176.67.86.20 - 176.67.86.23 be -176.67.86.24 - 176.67.86.27 ba -176.67.86.28 - 176.67.86.31 br -176.67.86.32 - 176.67.86.35 bg -176.67.86.36 - 176.67.86.39 cl -176.67.86.40 - 176.67.86.43 cn -176.67.86.44 - 176.67.86.47 co -176.67.86.48 - 176.67.86.51 cr -176.67.86.52 - 176.67.86.55 hr -176.67.86.56 - 176.67.86.59 cy -176.67.86.60 - 176.67.86.63 cz -176.67.86.64 - 176.67.86.67 dk -176.67.86.68 - 176.67.86.71 eg -176.67.86.72 - 176.67.86.75 ee -176.67.86.76 - 176.67.86.79 fj -176.67.86.80 - 176.67.86.83 fi -176.67.86.84 - 176.67.86.87 fr -176.67.86.88 - 176.67.86.91 ge -176.67.86.92 - 176.67.86.95 de -176.67.86.96 - 176.67.86.99 gr -176.67.86.100 - 176.67.86.103 hk -176.67.86.104 - 176.67.86.107 hu -176.67.86.108 - 176.67.86.111 is -176.67.86.112 - 176.67.86.115 in -176.67.86.116 - 176.67.86.119 ie -176.67.86.120 - 176.67.86.123 il -176.67.86.124 - 176.67.86.127 it -176.67.86.128 - 176.67.86.131 jp -176.67.86.132 - 176.67.86.135 kr -176.67.86.136 - 176.67.86.139 lv -176.67.86.140 - 176.67.86.143 li -176.67.86.144 - 176.67.86.147 lt -176.67.86.148 - 176.67.86.151 lu -176.67.86.152 - 176.67.86.155 mk -176.67.86.156 - 176.67.86.159 my -176.67.86.160 - 176.67.86.163 mx -176.67.86.164 - 176.67.86.167 nl -176.67.86.168 - 176.67.86.171 nz -176.67.86.172 - 176.67.86.175 no -176.67.86.176 - 176.67.86.179 us -176.67.86.180 - 176.67.86.183 mt +176.67.80.0 - 176.67.84.247 us +176.67.84.248 - 176.67.84.248 pt +176.67.84.249 - 176.67.86.183 us 176.67.86.184 - 176.67.86.187 rs -176.67.86.188 - 176.67.86.252 gb -176.67.86.253 - 176.67.86.255 us -176.67.87.0 - 176.67.87.3 au -176.67.87.4 - 176.67.87.7 us -176.67.87.8 - 176.67.87.11 se -176.67.87.12 - 176.67.87.15 fr -176.67.87.16 - 176.67.87.19 za -176.67.87.20 - 176.67.87.23 ch -176.67.87.24 - 176.67.87.27 de -176.67.87.28 - 176.67.87.31 pl -176.67.87.32 - 176.67.87.63 gb -176.67.87.64 - 176.67.87.255 us +176.67.86.188 - 176.67.87.255 us 176.67.88.0 - 176.67.95.255 fr 176.67.96.0 - 176.67.127.255 ps 176.67.128.0 - 176.67.159.255 fr -176.67.160.0 - 176.67.183.255 gb +176.67.160.0 - 176.67.167.255 gb +176.67.168.0 - 176.67.168.63 fr +176.67.168.64 - 176.67.168.127 gb +176.67.168.128 - 176.67.168.255 fr +176.67.169.0 - 176.67.169.255 de +176.67.170.0 - 176.67.171.255 gb +176.67.172.0 - 176.67.172.255 fr +176.67.173.0 - 176.67.183.255 gb 176.67.184.0 - 176.67.191.255 dk 176.67.192.0 - 176.67.223.255 rs 176.67.224.0 - 176.67.231.255 cz @@ -76732,20 +59557,23 @@ 176.97.16.0 - 176.97.31.255 pl 176.97.32.0 - 176.97.47.255 ru 176.97.48.0 - 176.97.55.255 pl -176.97.56.0 - 176.97.63.255 ro -176.97.64.0 - 176.97.79.255 ua +176.97.56.0 - 176.97.63.255 ua +176.97.64.0 - 176.97.79.255 gb 176.97.80.0 - 176.97.95.255 pl 176.97.96.0 - 176.97.111.255 ru 176.97.112.0 - 176.97.127.255 ua 176.97.128.0 - 176.97.135.255 ru 176.97.136.0 - 176.97.143.255 pl -176.97.144.0 - 176.97.159.255 ro +176.97.144.0 - 176.97.151.255 ro +176.97.152.0 - 176.97.155.255 gb +176.97.156.0 - 176.97.157.255 cy +176.97.158.0 - 176.97.158.255 at +176.97.159.0 - 176.97.159.255 fr 176.97.160.0 - 176.97.223.255 ru 176.97.224.0 - 176.97.239.255 ro 176.97.240.0 - 176.97.247.255 cz 176.97.248.0 - 176.97.255.255 pl 176.98.0.0 - 176.98.31.255 ua -176.98.32.0 - 176.98.47.255 ro 176.98.48.0 - 176.98.55.255 ua 176.98.56.0 - 176.98.63.255 ro 176.98.64.0 - 176.98.95.255 ua @@ -76755,9 +59583,13 @@ 176.98.160.0 - 176.98.167.255 de 176.98.168.0 - 176.98.191.255 ru 176.98.192.0 - 176.98.255.255 kz -176.99.0.0 - 176.99.255.255 de +176.99.0.0 - 176.99.15.255 ru +176.99.16.0 - 176.99.31.255 sa +176.99.32.0 - 176.99.47.255 ro +176.99.48.0 - 176.99.55.255 pl +176.99.56.0 - 176.99.255.255 ru 176.100.0.0 - 176.100.31.255 ua -176.100.32.0 - 176.100.39.255 de +176.100.32.0 - 176.100.39.255 eu 176.100.40.0 - 176.100.47.255 ru 176.100.48.0 - 176.100.55.255 ro 176.100.56.0 - 176.100.63.255 ua @@ -76767,7 +59599,7 @@ 176.100.200.0 - 176.100.215.255 es 176.100.216.0 - 176.100.223.255 ru 176.100.224.0 - 176.100.239.255 es -176.101.0.0 - 176.101.15.255 ua +176.100.240.0 - 176.101.15.255 ru 176.101.16.0 - 176.101.31.255 es 176.101.32.0 - 176.101.55.255 ir 176.101.56.0 - 176.101.71.255 ru @@ -76778,12 +59610,11 @@ 176.101.128.0 - 176.101.143.255 pl 176.101.144.0 - 176.101.159.255 cz 176.101.160.0 - 176.101.167.255 pl -176.101.168.0 - 176.101.175.255 ro 176.101.176.0 - 176.101.183.255 sk 176.101.184.0 - 176.101.223.255 ua 176.101.224.0 - 176.101.255.255 ru -176.102.0.0 - 176.102.63.255 fr -176.102.64.0 - 176.102.71.255 gb +176.102.0.0 - 176.102.63.255 ua +176.102.64.0 - 176.102.71.255 nl 176.102.72.0 - 176.102.79.255 cz 176.102.80.0 - 176.102.95.255 pl 176.102.96.0 - 176.102.119.255 sk @@ -76794,6 +59625,332 @@ 176.102.176.0 - 176.102.191.255 pl 176.102.192.0 - 176.102.223.255 ua 176.102.224.0 - 176.102.255.255 ir +176.103.0.0 - 176.103.31.255 ua +176.103.32.0 - 176.103.47.255 pl +176.103.48.0 - 176.103.71.255 ua +176.103.72.0 - 176.103.79.255 pl +176.103.80.0 - 176.103.111.255 ru +176.103.112.0 - 176.103.119.255 ua +176.103.120.0 - 176.103.127.255 ro +176.103.128.0 - 176.103.159.255 eu +176.103.160.0 - 176.103.175.255 pl +176.103.176.0 - 176.103.199.255 lv +176.103.200.0 - 176.103.215.255 ua +176.103.216.0 - 176.103.223.255 rs +176.103.224.0 - 176.103.239.255 ua +176.103.240.0 - 176.103.247.255 ro +176.103.248.0 - 176.103.255.255 it +176.104.0.0 - 176.104.103.255 ua +176.104.104.0 - 176.104.111.255 rs +176.104.112.0 - 176.104.119.255 pl +176.104.120.0 - 176.104.167.255 ru +176.104.168.0 - 176.104.175.255 ua +176.104.176.0 - 176.104.183.255 pl +176.104.184.0 - 176.104.191.255 ua +176.104.192.0 - 176.104.223.255 ru +176.104.224.0 - 176.105.127.255 ua +176.105.128.0 - 176.105.143.255 pl +176.105.160.0 - 176.105.223.255 ua +176.106.0.0 - 176.106.7.255 ua +176.106.8.0 - 176.106.31.255 ru +176.106.32.0 - 176.106.39.255 pl +176.106.40.0 - 176.106.47.255 ps +176.106.48.0 - 176.106.63.255 lv +176.106.64.0 - 176.106.95.255 ru +176.106.96.0 - 176.106.103.255 lv +176.106.104.0 - 176.106.111.255 pl +176.106.112.0 - 176.106.119.255 gb +176.106.120.0 - 176.106.127.255 rs +176.106.128.0 - 176.106.159.255 ru +176.106.160.0 - 176.106.183.255 lv +176.106.184.0 - 176.106.191.255 sk +176.106.192.0 - 176.106.223.255 ua +176.106.224.0 - 176.106.231.255 il +176.106.232.0 - 176.107.15.255 ru +176.107.16.0 - 176.107.31.255 sk +176.107.32.0 - 176.107.47.255 pl +176.107.48.0 - 176.107.63.255 ua +176.107.64.0 - 176.107.79.255 ro +176.107.80.0 - 176.107.87.255 ru +176.107.88.0 - 176.107.95.255 ua +176.107.96.0 - 176.107.103.255 ru +176.107.104.0 - 176.107.119.255 pl +176.107.120.0 - 176.107.127.255 cz +176.107.128.0 - 176.107.159.255 ua +176.107.160.0 - 176.107.167.255 ru +176.107.168.0 - 176.107.175.255 pl +176.107.176.0 - 176.107.199.255 ua +176.107.200.0 - 176.107.255.255 ru +176.108.0.0 - 176.108.31.255 ua +176.108.32.0 - 176.108.47.255 rs +176.108.48.0 - 176.108.55.255 ru +176.108.56.0 - 176.108.63.255 ba +176.108.64.0 - 176.108.95.255 kz +176.108.96.0 - 176.108.127.255 ua +176.108.128.0 - 176.108.135.255 pl +176.108.136.0 - 176.108.183.255 ru +176.108.184.0 - 176.108.191.255 ua +176.108.192.0 - 176.108.223.255 ru +176.108.224.0 - 176.108.231.255 ro +176.108.232.0 - 176.108.239.255 ua +176.108.240.0 - 176.109.7.255 ru +176.109.8.0 - 176.109.15.255 ua +176.109.16.0 - 176.109.47.255 ru +176.109.48.0 - 176.109.55.255 pl +176.109.56.0 - 176.109.63.255 sk +176.109.64.0 - 176.109.127.255 ru +176.109.128.0 - 176.109.135.255 pl +176.109.136.0 - 176.109.143.255 rs +176.109.144.0 - 176.109.159.255 ru +176.109.160.0 - 176.109.167.255 pl +176.109.168.0 - 176.110.63.255 ua +176.110.64.0 - 176.110.95.255 ru +176.110.96.0 - 176.110.99.255 it +176.110.100.0 - 176.110.100.255 sa +176.110.101.0 - 176.110.101.255 ru +176.110.102.0 - 176.110.103.255 ua +176.110.104.0 - 176.110.104.255 nl +176.110.105.0 - 176.110.105.255 fr +176.110.106.0 - 176.110.107.255 ro +176.110.108.0 - 176.110.111.255 ir +176.110.112.0 - 176.110.115.255 ro +176.110.116.0 - 176.110.117.255 no +176.110.118.0 - 176.110.118.255 gb +176.110.119.0 - 176.110.119.255 kw +176.110.120.0 - 176.110.143.255 ru +176.110.144.0 - 176.110.159.255 pl +176.110.160.0 - 176.110.215.255 ru +176.110.216.0 - 176.110.223.255 ro +176.110.224.0 - 176.110.255.255 ru +176.111.0.0 - 176.111.7.255 ro +176.111.8.0 - 176.111.15.255 ru +176.111.16.0 - 176.111.31.255 pl +176.111.32.0 - 176.111.63.255 ua +176.111.64.0 - 176.111.79.255 ru +176.111.80.0 - 176.111.95.255 ua +176.111.96.0 - 176.111.103.255 ru +176.111.104.0 - 176.111.111.255 pt +176.111.112.0 - 176.111.159.255 pl +176.111.160.0 - 176.111.167.255 ro +176.111.176.0 - 176.111.191.255 ua +176.111.192.0 - 176.111.207.255 no +176.111.208.0 - 176.111.215.255 ru +176.111.216.0 - 176.111.223.255 ch +176.111.224.0 - 176.111.239.255 pl +176.111.240.0 - 176.111.247.255 ua +176.111.248.0 - 176.111.255.255 ru +176.112.0.0 - 176.112.31.255 ua +176.112.32.0 - 176.112.71.255 ru +176.112.72.0 - 176.112.79.255 pl +176.112.80.0 - 176.112.87.255 ro +176.112.88.0 - 176.112.111.255 ru +176.112.112.0 - 176.112.119.255 pl +176.112.120.0 - 176.112.127.255 ua +176.112.128.0 - 176.112.175.255 ru +176.112.176.0 - 176.112.191.255 sk +176.112.192.0 - 176.112.223.255 ir +176.112.224.0 - 176.113.63.255 ru +176.113.96.0 - 176.113.111.255 ro +176.113.112.0 - 176.113.127.255 ru +176.113.128.0 - 176.113.143.255 tj +176.113.144.0 - 176.113.175.255 ua +176.113.176.0 - 176.113.191.255 ro +176.113.192.0 - 176.113.207.255 pl +176.113.208.0 - 176.114.15.255 ua +176.114.16.0 - 176.114.55.255 ru +176.114.56.0 - 176.114.63.255 ro +176.114.64.0 - 176.114.95.255 ru +176.114.96.0 - 176.114.111.255 ro +176.114.112.0 - 176.114.231.255 ru +176.114.232.0 - 176.114.239.255 pl +176.114.240.0 - 176.114.255.255 cz +176.115.0.0 - 176.115.31.255 pl +176.115.32.0 - 176.115.79.255 ru +176.115.80.0 - 176.115.87.255 pl +176.115.88.0 - 176.115.95.255 ru +176.115.96.0 - 176.115.103.255 ua +176.115.104.0 - 176.115.167.255 ru +176.115.168.0 - 176.115.175.255 it +176.115.176.0 - 176.115.223.255 ru +176.115.224.0 - 176.115.239.255 ro +176.115.240.0 - 176.115.255.255 pl +176.116.0.0 - 176.116.31.255 ru +176.116.32.0 - 176.116.47.255 ro +176.116.48.0 - 176.116.63.255 ru +176.116.64.0 - 176.116.95.255 ua +176.116.96.0 - 176.116.127.255 sk +176.116.128.0 - 176.116.135.255 ro +176.116.136.0 - 176.116.143.255 ru +176.116.144.0 - 176.116.144.255 bg +176.116.145.0 - 176.116.145.255 nl +176.116.146.0 - 176.116.147.255 ua +176.116.148.0 - 176.116.151.255 pl +176.116.152.0 - 176.116.191.255 ru +176.116.192.0 - 176.116.199.255 ua +176.116.200.0 - 176.116.207.255 pl +176.116.208.0 - 176.116.223.255 ru +176.116.224.0 - 176.116.239.255 ro +176.116.240.0 - 176.117.55.255 ru +176.117.56.0 - 176.117.63.255 nl +176.117.64.0 - 176.117.95.255 ua +176.117.96.0 - 176.117.103.255 tr +176.117.104.0 - 176.117.111.255 de +176.117.112.0 - 176.117.159.255 ru +176.117.160.0 - 176.117.191.255 ua +176.117.192.0 - 176.118.31.255 ru +176.118.40.0 - 176.118.55.255 ua +176.118.56.0 - 176.118.63.255 ro +176.118.64.0 - 176.118.79.255 ru +176.118.80.0 - 176.118.95.255 ro +176.118.96.0 - 176.118.111.255 sk +176.118.112.0 - 176.118.135.255 ru +176.118.136.0 - 176.118.143.255 pl +176.118.144.0 - 176.118.151.255 ua +176.118.152.0 - 176.118.159.255 by +176.118.200.0 - 176.118.207.255 ro +176.118.208.0 - 176.118.255.255 ru +176.119.0.0 - 176.119.15.255 ua +176.119.16.0 - 176.119.23.255 ru +176.119.24.0 - 176.119.31.255 ua +176.119.32.0 - 176.119.63.255 pl +176.119.64.0 - 176.119.127.255 ua +176.119.160.0 - 176.119.223.255 ru +176.119.224.0 - 176.119.231.255 kz +176.119.232.0 - 176.119.239.255 ua +176.119.240.0 - 176.119.247.255 ru +176.119.248.0 - 176.119.255.255 ps +176.120.0.0 - 176.120.15.255 ru +176.120.16.0 - 176.120.23.255 us +176.120.24.0 - 176.120.31.255 ru +176.120.32.0 - 176.120.63.255 ua +176.120.64.0 - 176.120.95.255 ru +176.120.96.0 - 176.120.119.255 ua +176.120.120.0 - 176.120.127.255 pl +176.120.128.0 - 176.120.159.255 fr +176.120.160.0 - 176.120.167.255 at +176.120.168.0 - 176.120.175.255 es +176.120.176.0 - 176.120.255.255 ru +176.121.0.0 - 176.121.15.255 ua +176.121.16.0 - 176.121.23.255 ru +176.121.24.0 - 176.121.47.255 ro +176.121.48.0 - 176.121.63.255 ru +176.121.64.0 - 176.121.71.255 es +176.121.72.0 - 176.121.79.255 ua +176.121.80.0 - 176.121.87.255 pl +176.121.88.0 - 176.121.95.255 no +176.121.96.0 - 176.121.111.255 ro +176.121.112.0 - 176.121.127.255 pl +176.121.128.0 - 176.121.191.255 ru +176.121.192.0 - 176.121.207.255 ua +176.121.208.0 - 176.121.223.255 ru +176.121.224.0 - 176.121.255.255 ua +176.122.0.0 - 176.122.31.255 ru +176.122.32.0 - 176.122.47.255 cz +176.122.48.0 - 176.122.79.255 ru +176.122.80.0 - 176.122.87.255 kz +176.122.88.0 - 176.122.191.255 ua +176.122.192.0 - 176.122.193.255 gb +176.122.194.0 - 176.122.195.255 ch +176.122.196.0 - 176.122.198.255 it +176.122.199.0 - 176.122.199.255 pl +176.122.200.0 - 176.122.207.255 ru +176.122.210.0 - 176.122.211.255 ir +176.122.212.0 - 176.122.239.255 pl +176.122.240.0 - 176.122.243.255 de +176.122.244.0 - 176.122.245.255 pl +176.122.246.0 - 176.122.246.255 gb +176.122.247.0 - 176.122.255.255 ru +176.123.0.0 - 176.123.31.255 md +176.123.32.0 - 176.123.47.255 gb +176.123.48.0 - 176.123.48.255 de +176.123.49.0 - 176.123.49.255 ru +176.123.50.0 - 176.123.50.255 gb +176.123.51.0 - 176.123.51.255 de +176.123.52.0 - 176.123.53.255 gb +176.123.54.0 - 176.123.55.255 de +176.123.56.0 - 176.123.56.255 ru +176.123.57.0 - 176.123.57.255 hr +176.123.58.0 - 176.123.59.255 gb +176.123.60.0 - 176.123.61.255 pl +176.123.62.0 - 176.123.62.255 gb +176.123.63.0 - 176.123.63.255 fr +176.123.64.0 - 176.123.127.255 ir +176.123.128.0 - 176.123.207.255 ru +176.123.208.0 - 176.123.215.255 rs +176.123.216.0 - 176.123.219.255 ru +176.123.220.0 - 176.123.221.255 ua +176.123.222.0 - 176.123.222.255 gb +176.123.223.0 - 176.123.223.255 pl +176.123.224.0 - 176.123.255.255 kg +176.124.0.0 - 176.124.31.255 ua +176.124.64.0 - 176.124.67.255 ir +176.124.68.0 - 176.124.70.255 gb +176.124.71.0 - 176.124.71.255 nl +176.124.72.0 - 176.124.95.255 ro +176.124.96.0 - 176.124.103.255 am +176.124.104.0 - 176.124.111.255 ro +176.124.112.0 - 176.124.113.255 gb +176.124.114.0 - 176.124.127.255 ru +176.124.128.0 - 176.124.135.255 ua +176.124.136.0 - 176.124.137.255 ru +176.124.138.0 - 176.124.139.255 ua +176.124.140.0 - 176.124.143.255 pl +176.124.144.0 - 176.124.147.255 ru +176.124.148.0 - 176.124.148.255 se +176.124.149.0 - 176.124.149.255 de +176.124.150.0 - 176.124.171.255 ru +176.124.172.0 - 176.124.183.255 ro +176.124.184.0 - 176.124.187.255 cz +176.124.188.0 - 176.124.189.255 ru +176.124.190.0 - 176.124.190.255 pl +176.124.191.0 - 176.124.191.255 gb +176.124.192.0 - 176.124.223.255 ru +176.124.224.0 - 176.124.225.255 se +176.124.226.0 - 176.124.227.255 ru +176.124.228.0 - 176.124.239.255 ua +176.124.240.0 - 176.124.245.255 pl +176.124.246.0 - 176.124.246.255 ie +176.124.247.0 - 176.124.247.255 ee +176.124.248.0 - 176.124.248.255 ru +176.124.249.0 - 176.124.249.255 at +176.124.250.0 - 176.124.251.255 se +176.124.252.0 - 176.124.252.255 pt +176.124.253.0 - 176.124.255.255 nl +176.125.0.0 - 176.125.31.255 ro +176.125.32.0 - 176.125.63.255 ua +176.125.64.0 - 176.126.36.255 ru +176.126.37.0 - 176.126.37.255 ie +176.126.38.0 - 176.126.38.255 gr +176.126.39.0 - 176.126.39.255 at +176.126.40.0 - 176.126.55.255 ru +176.126.56.0 - 176.126.59.255 pl +176.126.60.0 - 176.126.63.255 ua +176.126.64.0 - 176.126.67.255 nl +176.126.68.0 - 176.126.68.255 hk +176.126.69.0 - 176.126.69.255 au +176.126.70.0 - 176.126.70.255 br +176.126.71.0 - 176.126.72.255 hk +176.126.73.0 - 176.126.77.255 nl +176.126.78.0 - 176.126.78.255 gb +176.126.79.0 - 176.126.85.255 nl +176.126.86.0 - 176.126.86.255 in +176.126.87.0 - 176.126.95.255 nl +176.126.96.0 - 176.126.159.255 ua +176.126.160.0 - 176.126.160.255 se +176.126.161.0 - 176.126.161.255 ru +176.126.162.0 - 176.126.163.255 ua +176.126.164.0 - 176.126.167.255 kg +176.126.168.0 - 176.126.191.255 ro +176.126.192.0 - 176.126.194.255 gb +176.126.195.0 - 176.126.215.255 ro +176.126.216.0 - 176.126.219.255 de +176.126.220.0 - 176.126.223.255 ro +176.126.224.0 - 176.126.231.255 gb +176.126.232.0 - 176.126.239.255 ro +176.126.240.0 - 176.126.247.255 gb +176.126.248.0 - 176.126.251.255 pl +176.126.252.0 - 176.126.255.255 ro +176.127.0.0 - 176.127.255.255 ch 176.128.0.0 - 176.191.255.255 fr 176.192.0.0 - 176.197.255.255 ru 176.198.0.0 - 176.199.255.255 de @@ -76802,12 +59959,14 @@ 176.204.0.0 - 176.205.255.255 ae 176.206.0.0 - 176.207.255.255 it 176.208.0.0 - 176.215.255.255 ru -176.216.0.0 - 176.220.255.255 tr +176.216.0.0 - 176.220.235.255 tr +176.220.236.0 - 176.220.239.255 in +176.220.240.0 - 176.220.255.255 tr 176.221.0.0 - 176.221.15.255 ru 176.221.16.0 - 176.221.31.255 ir 176.221.32.0 - 176.221.39.255 pt 176.221.40.0 - 176.221.47.255 de -176.221.48.0 - 176.221.55.255 ua +176.221.48.0 - 176.221.55.255 it 176.221.56.0 - 176.221.63.255 gb 176.221.64.0 - 176.221.71.255 ir 176.221.72.0 - 176.221.79.255 rs @@ -76820,7 +59979,8 @@ 176.222.24.0 - 176.222.31.255 es 176.222.32.0 - 176.222.47.255 hr 176.222.48.0 - 176.222.63.255 fr -176.222.64.0 - 176.222.127.255 ro +176.222.64.0 - 176.222.95.255 es +176.222.96.0 - 176.222.127.255 se 176.222.128.0 - 176.222.191.255 kz 176.222.192.0 - 176.222.207.255 ru 176.222.208.0 - 176.222.215.255 fr @@ -76828,20 +59988,38 @@ 176.222.224.0 - 176.222.231.255 cz 176.222.232.0 - 176.222.239.255 dk 176.222.240.0 - 176.222.255.255 ru -176.223.0.0 - 176.223.255.255 ro +176.223.0.0 - 176.223.66.255 ro +176.223.67.0 - 176.223.67.255 es +176.223.68.0 - 176.223.71.255 ro +176.223.72.0 - 176.223.79.255 kz +176.223.80.0 - 176.223.87.255 ir +176.223.88.0 - 176.223.91.255 nl +176.223.92.0 - 176.223.107.255 ro +176.223.108.0 - 176.223.108.255 gb +176.223.109.0 - 176.223.110.255 ro +176.223.111.0 - 176.223.111.255 ch +176.223.112.0 - 176.223.115.255 ro +176.223.116.0 - 176.223.118.255 gb +176.223.119.0 - 176.223.119.255 ie +176.223.120.0 - 176.223.143.255 ro +176.223.144.0 - 176.223.159.255 md +176.223.160.0 - 176.223.161.255 gb +176.223.162.0 - 176.223.164.255 ro +176.223.165.0 - 176.223.165.255 de +176.223.166.0 - 176.223.255.255 ro 176.224.0.0 - 176.225.255.255 sa 176.226.0.0 - 176.226.127.255 hu 176.226.128.0 - 176.226.255.255 ru 176.227.0.0 - 176.227.127.255 tr -176.227.128.0 - 176.227.135.255 gb -176.227.136.0 - 176.227.143.255 a2 +176.227.128.0 - 176.227.138.127 gb +176.227.138.128 - 176.227.138.255 eu +176.227.139.0 - 176.227.143.255 gb 176.227.144.0 - 176.227.159.255 es 176.227.160.0 - 176.227.167.255 pl 176.227.168.0 - 176.227.175.255 it 176.227.176.0 - 176.227.191.255 ru 176.227.192.0 - 176.227.223.255 gb 176.227.224.0 - 176.227.239.255 cy -176.227.240.0 - 176.227.247.255 gb 176.227.248.0 - 176.227.255.255 cz 176.228.0.0 - 176.231.255.255 il 176.232.0.0 - 176.240.255.255 tr @@ -76849,32 +60027,57 @@ 176.241.64.0 - 176.241.71.255 iq 176.241.72.0 - 176.241.79.255 pl 176.241.80.0 - 176.241.95.255 iq +176.241.96.0 - 176.241.103.255 ru +176.241.104.0 - 176.241.111.255 ua +176.241.112.0 - 176.241.116.255 il +176.241.117.0 - 176.241.119.255 us +176.241.120.0 - 176.241.127.255 fr +176.241.128.0 - 176.241.159.255 ua +176.241.160.0 - 176.241.175.255 de +176.241.176.0 - 176.241.183.255 bh +176.241.184.0 - 176.241.191.255 sa +176.241.192.0 - 176.241.231.255 ru +176.241.232.0 - 176.241.239.255 no +176.241.240.0 - 176.241.247.255 pl +176.241.248.0 - 176.241.250.31 fr +176.241.250.32 - 176.241.250.63 ch +176.241.250.64 - 176.241.250.95 gb +176.241.250.96 - 176.241.250.127 be +176.241.250.128 - 176.241.251.31 fr +176.241.251.32 - 176.241.251.63 ch +176.241.251.64 - 176.241.251.95 gb +176.241.251.96 - 176.241.251.127 be +176.241.251.128 - 176.241.255.255 fr +176.242.0.0 - 176.247.255.255 it 176.248.0.0 - 176.255.255.255 gb -177.0.0.0 - 177.127.255.255 br +177.0.0.0 - 177.91.247.255 br +177.91.248.0 - 177.91.255.255 pe +177.92.0.0 - 177.223.255.255 br +177.224.0.0 - 177.234.127.255 mx +177.234.128.0 - 177.234.131.255 ar +177.234.132.0 - 177.234.135.255 br +177.234.136.0 - 177.234.138.255 hn +177.234.139.0 - 177.234.139.15 us +177.234.139.16 - 177.234.143.255 hn +177.234.144.0 - 177.234.191.255 br +177.234.192.0 - 177.234.255.255 ec +177.235.0.0 - 177.235.255.255 br +177.236.0.0 - 177.249.255.255 mx +177.250.0.0 - 177.251.255.255 py +177.252.0.0 - 177.255.255.255 co 178.0.0.0 - 178.15.255.255 de 178.16.0.0 - 178.16.15.255 im -178.16.16.0 - 178.16.31.255 lv +178.16.16.0 - 178.16.26.255 lv +178.16.27.0 - 178.16.27.255 a1 +178.16.28.0 - 178.16.31.255 lv 178.16.32.0 - 178.16.47.255 lt 178.16.48.0 - 178.16.63.255 de 178.16.64.0 - 178.16.79.255 no -178.16.80.0 - 178.16.95.255 ua +178.16.80.0 - 178.16.88.255 ua +178.16.89.0 - 178.16.95.255 ru 178.16.96.0 - 178.16.127.255 pl 178.16.128.0 - 178.16.143.255 bg -178.16.144.0 - 178.16.156.255 ru -178.16.157.0 - 178.16.157.71 kz -178.16.157.72 - 178.16.157.75 ru -178.16.157.76 - 178.16.157.115 kz -178.16.157.116 - 178.16.157.119 ru -178.16.157.120 - 178.16.157.123 kz -178.16.157.124 - 178.16.157.131 ru -178.16.157.132 - 178.16.157.143 kz -178.16.157.144 - 178.16.157.151 ru -178.16.157.152 - 178.16.157.163 kz -178.16.157.164 - 178.16.157.167 ru -178.16.157.168 - 178.16.157.175 kz -178.16.157.176 - 178.16.157.191 ru -178.16.157.192 - 178.16.157.255 kz -178.16.158.0 - 178.16.159.255 ru +178.16.144.0 - 178.16.159.255 ru 178.16.160.0 - 178.16.175.255 fr 178.16.176.0 - 178.16.191.255 fi 178.16.192.0 - 178.16.207.255 ie @@ -76890,53 +60093,41 @@ 178.17.112.0 - 178.17.127.255 hr 178.17.128.0 - 178.17.143.255 ru 178.17.144.0 - 178.17.159.255 no -178.17.160.0 - 178.17.175.255 md +178.17.160.0 - 178.17.162.167 md +178.17.162.168 - 178.17.162.175 aq +178.17.162.176 - 178.17.175.255 md 178.17.176.0 - 178.17.207.255 ru 178.17.208.0 - 178.17.223.255 jo -178.17.224.0 - 178.17.237.255 a2 -178.17.238.0 - 178.17.238.255 ke -178.17.239.0 - 178.17.239.255 a2 +178.17.224.0 - 178.17.224.255 de +178.17.225.0 - 178.17.231.255 a2 +178.17.232.0 - 178.17.232.255 de +178.17.233.0 - 178.17.237.255 us +178.17.238.0 - 178.17.239.255 de 178.17.240.0 - 178.17.255.255 gb 178.18.0.0 - 178.18.15.255 ru 178.18.16.0 - 178.18.19.255 us -178.18.20.0 - 178.18.31.255 nl +178.18.20.0 - 178.18.25.255 nl +178.18.26.0 - 178.18.29.255 us +178.18.30.0 - 178.18.31.255 nl 178.18.32.0 - 178.18.47.255 md 178.18.48.0 - 178.18.63.255 fr 178.18.64.0 - 178.18.79.255 sk 178.18.80.0 - 178.18.95.255 nl 178.18.96.0 - 178.18.111.255 ru -178.18.112.0 - 178.18.127.255 gb +178.18.112.0 - 178.18.112.255 ae +178.18.113.0 - 178.18.127.255 gb 178.18.128.0 - 178.18.143.255 nl -178.18.144.0 - 178.18.148.255 de -178.18.149.0 - 178.18.149.23 cy -178.18.149.24 - 178.18.149.35 se -178.18.149.36 - 178.18.159.255 de +178.18.144.0 - 178.18.159.255 de 178.18.160.0 - 178.18.175.255 at 178.18.176.0 - 178.18.191.255 fr 178.18.192.0 - 178.18.207.255 tr 178.18.208.0 - 178.18.239.255 ru -178.18.240.0 - 178.18.240.255 de -178.18.241.0 - 178.18.241.7 pa -178.18.241.8 - 178.18.241.15 cz -178.18.241.16 - 178.18.241.23 es -178.18.241.24 - 178.18.241.31 it -178.18.241.32 - 178.18.241.39 fr -178.18.241.40 - 178.18.241.47 us -178.18.241.48 - 178.18.241.55 dk -178.18.241.56 - 178.18.241.63 se -178.18.241.64 - 178.18.241.71 ru -178.18.241.72 - 178.18.241.79 gb -178.18.241.80 - 178.18.241.87 mx -178.18.241.88 - 178.18.241.95 br -178.18.241.96 - 178.18.241.103 pl -178.18.241.104 - 178.18.253.255 de -178.18.254.0 - 178.18.255.255 us +178.18.240.0 - 178.18.255.255 de 178.19.0.0 - 178.19.15.255 fr 178.19.16.0 - 178.19.31.255 lt 178.19.32.0 - 178.19.47.255 es 178.19.48.0 - 178.19.63.255 is -178.19.64.0 - 178.19.65.255 us -178.19.66.0 - 178.19.79.255 de +178.19.64.0 - 178.19.79.255 de 178.19.80.0 - 178.19.95.255 ru 178.19.96.0 - 178.19.111.255 pl 178.19.112.0 - 178.19.127.255 nl @@ -76946,11 +60137,8 @@ 178.19.192.0 - 178.19.207.255 fo 178.19.208.0 - 178.19.239.255 de 178.19.240.0 - 178.19.255.255 ru -178.20.0.0 - 178.20.12.127 de -178.20.12.128 - 178.20.12.143 at -178.20.12.144 - 178.20.15.255 de +178.20.0.0 - 178.20.15.255 de 178.20.16.0 - 178.20.23.255 ba -178.20.24.0 - 178.20.31.255 gb 178.20.32.0 - 178.20.39.255 it 178.20.40.0 - 178.20.47.255 ru 178.20.48.0 - 178.20.55.255 fr @@ -76972,9 +60160,8 @@ 178.20.184.0 - 178.20.191.255 jo 178.20.192.0 - 178.20.199.255 gb 178.20.200.0 - 178.20.207.255 rs -178.20.208.0 - 178.20.215.255 pt 178.20.216.0 - 178.20.223.255 dk -178.20.224.0 - 178.20.231.255 gb +178.20.224.0 - 178.20.231.255 tr 178.20.232.0 - 178.20.239.255 ru 178.20.240.0 - 178.20.247.255 fr 178.20.248.0 - 178.20.255.255 nl @@ -76987,7 +60174,9 @@ 178.21.48.0 - 178.21.55.255 hu 178.21.56.0 - 178.21.63.255 es 178.21.64.0 - 178.21.71.255 ru -178.21.72.0 - 178.21.87.255 se +178.21.72.0 - 178.21.87.6 se +178.21.87.7 - 178.21.87.7 dk +178.21.87.8 - 178.21.87.255 se 178.21.88.0 - 178.21.95.255 dk 178.21.96.0 - 178.21.103.255 it 178.21.104.0 - 178.21.111.255 es @@ -77010,11 +60199,7 @@ 178.21.240.0 - 178.21.247.255 ee 178.21.248.0 - 178.21.255.255 dk 178.22.0.0 - 178.22.7.255 fr -178.22.8.0 - 178.22.8.255 gb -178.22.9.0 - 178.22.9.255 de -178.22.10.0 - 178.22.10.255 us -178.22.11.0 - 178.22.11.255 gb -178.22.12.0 - 178.22.15.255 tr +178.22.8.0 - 178.22.15.255 tr 178.22.16.0 - 178.22.23.255 gb 178.22.24.0 - 178.22.31.255 ch 178.22.32.0 - 178.22.39.255 iq @@ -77077,3894 +60262,350 @@ 178.23.240.0 - 178.23.247.255 dk 178.23.248.0 - 178.23.255.255 it 178.24.0.0 - 178.27.255.255 de -178.28.0.0 - 178.31.255.255 se -178.32.0.0 - 178.32.0.3 ch -178.32.0.4 - 178.32.0.7 gb -178.32.0.8 - 178.32.0.15 ch -178.32.0.16 - 178.32.0.47 fr -178.32.0.48 - 178.32.0.63 de -178.32.0.64 - 178.32.0.95 it -178.32.0.96 - 178.32.0.191 fr -178.32.0.192 - 178.32.0.207 pl -178.32.0.208 - 178.32.0.215 fr -178.32.0.216 - 178.32.0.219 fi -178.32.0.220 - 178.32.0.239 fr -178.32.0.240 - 178.32.0.243 pl -178.32.0.244 - 178.32.0.247 be -178.32.0.248 - 178.32.0.255 fr -178.32.1.0 - 178.32.1.31 it -178.32.1.32 - 178.32.1.39 fr -178.32.1.40 - 178.32.1.47 pl -178.32.1.48 - 178.32.1.55 it -178.32.1.56 - 178.32.1.63 es -178.32.1.64 - 178.32.1.75 pl -178.32.1.76 - 178.32.1.79 be -178.32.1.80 - 178.32.1.83 fr -178.32.1.84 - 178.32.1.87 es -178.32.1.88 - 178.32.1.95 fr -178.32.1.96 - 178.32.1.111 pl -178.32.1.112 - 178.32.1.115 nl -178.32.1.116 - 178.32.1.119 ch -178.32.1.120 - 178.32.1.123 de -178.32.1.124 - 178.32.1.127 it -178.32.1.128 - 178.32.1.135 fr -178.32.1.136 - 178.32.1.139 es -178.32.1.140 - 178.32.1.143 pt -178.32.1.144 - 178.32.1.147 pl -178.32.1.148 - 178.32.1.151 es -178.32.1.152 - 178.32.1.191 fr -178.32.1.192 - 178.32.1.207 gb -178.32.1.208 - 178.32.1.211 fr -178.32.1.212 - 178.32.1.215 be -178.32.1.216 - 178.32.1.219 fr -178.32.1.220 - 178.32.1.227 gb -178.32.1.228 - 178.32.1.231 de -178.32.1.232 - 178.32.1.239 fr -178.32.1.240 - 178.32.1.243 it -178.32.1.244 - 178.32.3.31 fr -178.32.3.32 - 178.32.3.63 es -178.32.3.64 - 178.32.3.71 cz -178.32.3.72 - 178.32.3.79 es -178.32.3.80 - 178.32.3.95 gb -178.32.3.96 - 178.32.3.127 fr -178.32.3.128 - 178.32.3.135 pl -178.32.3.136 - 178.32.3.139 de -178.32.3.140 - 178.32.3.143 gb -178.32.3.144 - 178.32.3.151 es -178.32.3.152 - 178.32.3.159 de -178.32.3.160 - 178.32.3.191 fr -178.32.3.192 - 178.32.3.215 pl -178.32.3.216 - 178.32.3.219 fr -178.32.3.220 - 178.32.3.223 es -178.32.3.224 - 178.32.3.255 de -178.32.4.0 - 178.32.4.23 pl -178.32.4.24 - 178.32.4.27 de -178.32.4.28 - 178.32.4.31 gb -178.32.4.32 - 178.32.4.47 pl -178.32.4.48 - 178.32.4.51 gb -178.32.4.52 - 178.32.4.63 fr -178.32.4.64 - 178.32.4.71 pl -178.32.4.72 - 178.32.4.79 pt -178.32.4.80 - 178.32.5.15 fr -178.32.5.16 - 178.32.5.19 pl -178.32.5.20 - 178.32.5.23 fr -178.32.5.24 - 178.32.5.27 it -178.32.5.28 - 178.32.5.31 fr -178.32.5.32 - 178.32.5.35 nl -178.32.5.36 - 178.32.5.39 it -178.32.5.40 - 178.32.5.43 lt -178.32.5.44 - 178.32.5.47 gb -178.32.5.48 - 178.32.5.95 fr -178.32.5.96 - 178.32.5.115 gb -178.32.5.116 - 178.32.5.119 ie -178.32.5.120 - 178.32.5.127 gb -178.32.5.128 - 178.32.5.143 pt -178.32.5.144 - 178.32.5.147 cz -178.32.5.148 - 178.32.5.151 be -178.32.5.152 - 178.32.5.155 gb -178.32.5.156 - 178.32.5.159 be -178.32.5.160 - 178.32.5.175 pl -178.32.5.176 - 178.32.5.191 de -178.32.5.192 - 178.32.5.207 es -178.32.5.208 - 178.32.5.231 pl -178.32.5.232 - 178.32.5.239 es -178.32.5.240 - 178.32.6.255 fr -178.32.7.0 - 178.32.7.15 de -178.32.7.16 - 178.32.7.47 fr -178.32.7.48 - 178.32.7.51 cz -178.32.7.52 - 178.32.7.55 de -178.32.7.56 - 178.32.7.63 fr -178.32.7.64 - 178.32.7.95 be -178.32.7.96 - 178.32.7.147 fr -178.32.7.148 - 178.32.7.155 es -178.32.7.156 - 178.32.7.159 it -178.32.7.160 - 178.32.7.163 ch -178.32.7.164 - 178.32.7.167 pl -178.32.7.168 - 178.32.7.171 gb -178.32.7.172 - 178.32.7.175 pl -178.32.7.176 - 178.32.7.191 fr -178.32.7.192 - 178.32.7.255 gb -178.32.8.0 - 178.32.8.255 fr -178.32.9.0 - 178.32.9.15 be -178.32.9.16 - 178.32.9.19 fr -178.32.9.20 - 178.32.9.23 pl -178.32.9.24 - 178.32.10.7 fr -178.32.10.8 - 178.32.10.11 cz -178.32.10.12 - 178.32.10.15 fr -178.32.10.16 - 178.32.10.31 pt -178.32.10.32 - 178.32.10.39 fr -178.32.10.40 - 178.32.10.43 fi -178.32.10.44 - 178.32.10.47 nl -178.32.10.48 - 178.32.10.255 fr -178.32.11.0 - 178.32.12.7 es -178.32.12.8 - 178.32.12.15 fr -178.32.12.16 - 178.32.12.23 lt -178.32.12.24 - 178.32.12.31 fr -178.32.12.32 - 178.32.12.47 gb -178.32.12.48 - 178.32.12.63 es -178.32.12.64 - 178.32.12.67 gb -178.32.12.68 - 178.32.12.83 be -178.32.12.84 - 178.32.12.87 de -178.32.12.88 - 178.32.12.95 ie -178.32.12.96 - 178.32.12.99 de -178.32.12.100 - 178.32.12.103 gb -178.32.12.104 - 178.32.12.111 cz -178.32.12.112 - 178.32.12.127 fr -178.32.12.128 - 178.32.12.255 es -178.32.13.0 - 178.32.13.3 pl -178.32.13.4 - 178.32.13.15 de -178.32.13.16 - 178.32.13.39 pl -178.32.13.40 - 178.32.13.71 fr -178.32.13.72 - 178.32.13.79 pl -178.32.13.80 - 178.32.13.95 fr -178.32.13.96 - 178.32.13.99 pl -178.32.13.100 - 178.32.13.103 fr -178.32.13.104 - 178.32.13.107 es -178.32.13.108 - 178.32.13.111 pl -178.32.13.112 - 178.32.13.191 fr -178.32.13.192 - 178.32.13.199 es -178.32.13.200 - 178.32.13.211 fr -178.32.13.212 - 178.32.13.215 gb -178.32.13.216 - 178.32.13.223 it -178.32.13.224 - 178.32.13.239 fr -178.32.13.240 - 178.32.13.255 es -178.32.14.0 - 178.32.16.255 de -178.32.17.0 - 178.32.17.15 fr -178.32.17.16 - 178.32.17.31 gb -178.32.17.32 - 178.32.17.255 de -178.32.18.0 - 178.32.18.63 pl -178.32.18.64 - 178.32.18.67 it -178.32.18.68 - 178.32.18.71 fr -178.32.18.72 - 178.32.18.79 be -178.32.18.80 - 178.32.18.83 fr -178.32.18.84 - 178.32.18.87 es -178.32.18.88 - 178.32.18.91 gb -178.32.18.92 - 178.32.18.99 fr -178.32.18.100 - 178.32.18.111 pl -178.32.18.112 - 178.32.18.115 fr -178.32.18.116 - 178.32.18.119 lt -178.32.18.120 - 178.32.18.127 nl -178.32.18.128 - 178.32.18.191 pl -178.32.18.192 - 178.32.18.255 fr -178.32.19.0 - 178.32.19.255 pl -178.32.20.0 - 178.32.20.255 de -178.32.21.0 - 178.32.21.127 it -178.32.21.128 - 178.32.21.255 fr -178.32.22.0 - 178.32.24.127 de -178.32.24.128 - 178.32.24.179 pl -178.32.24.180 - 178.32.24.183 it -178.32.24.184 - 178.32.24.191 pl -178.32.24.192 - 178.32.24.199 de -178.32.24.200 - 178.32.24.203 gb -178.32.24.204 - 178.32.24.215 fr -178.32.24.216 - 178.32.24.223 it -178.32.24.224 - 178.32.24.255 gb -178.32.25.0 - 178.32.25.127 de -178.32.25.128 - 178.32.25.255 es -178.32.26.0 - 178.32.26.255 de -178.32.27.0 - 178.32.27.3 gb -178.32.27.4 - 178.32.27.7 fr -178.32.27.8 - 178.32.27.31 pl -178.32.27.32 - 178.32.27.35 gb -178.32.27.36 - 178.32.27.39 fr -178.32.27.40 - 178.32.27.47 pl -178.32.27.48 - 178.32.27.51 de -178.32.27.52 - 178.32.27.63 es -178.32.27.64 - 178.32.27.95 fr +178.28.0.0 - 178.31.138.255 se +178.31.139.0 - 178.31.139.127 de +178.31.139.128 - 178.31.255.255 se +178.32.0.0 - 178.32.1.219 fr +178.32.1.220 - 178.32.1.223 es +178.32.1.224 - 178.32.4.223 fr +178.32.4.224 - 178.32.4.239 it +178.32.4.240 - 178.32.6.127 fr +178.32.6.128 - 178.32.6.159 es +178.32.6.160 - 178.32.10.48 fr +178.32.10.49 - 178.32.10.49 fi +178.32.10.50 - 178.32.11.255 fr +178.32.12.0 - 178.32.12.7 es +178.32.12.8 - 178.32.19.255 fr +178.32.20.0 - 178.32.20.3 de +178.32.20.4 - 178.32.20.151 fr +178.32.20.152 - 178.32.20.152 ie +178.32.20.153 - 178.32.27.95 fr 178.32.27.96 - 178.32.27.127 es -178.32.27.128 - 178.32.27.159 gb -178.32.27.160 - 178.32.27.179 it -178.32.27.180 - 178.32.27.187 de -178.32.27.188 - 178.32.27.191 nl -178.32.27.192 - 178.32.27.255 gb -178.32.28.0 - 178.32.28.15 fr -178.32.28.16 - 178.32.28.47 pl -178.32.28.48 - 178.32.28.63 es -178.32.28.64 - 178.32.28.127 fr -178.32.28.128 - 178.32.28.131 pt -178.32.28.132 - 178.32.28.135 pl -178.32.28.136 - 178.32.28.139 es -178.32.28.140 - 178.32.28.239 fr -178.32.28.240 - 178.32.28.255 gb -178.32.29.0 - 178.32.29.31 pl -178.32.29.32 - 178.32.29.63 fr -178.32.29.64 - 178.32.29.79 pl -178.32.29.80 - 178.32.29.95 de -178.32.29.96 - 178.32.29.99 fr -178.32.29.100 - 178.32.29.103 de -178.32.29.104 - 178.32.29.111 es -178.32.29.112 - 178.32.29.127 fr -178.32.29.128 - 178.32.29.143 pl -178.32.29.144 - 178.32.29.151 gb -178.32.29.152 - 178.32.29.159 fr -178.32.29.160 - 178.32.29.175 pl -178.32.29.176 - 178.32.29.179 fr -178.32.29.180 - 178.32.29.183 pl +178.32.27.128 - 178.32.28.31 fr +178.32.28.32 - 178.32.28.47 es +178.32.28.48 - 178.32.29.183 fr 178.32.29.184 - 178.32.29.191 es -178.32.29.192 - 178.32.29.223 fr -178.32.29.224 - 178.32.30.255 gb -178.32.31.0 - 178.32.31.43 fr -178.32.31.44 - 178.32.31.47 pl -178.32.31.48 - 178.32.31.95 fr -178.32.31.96 - 178.32.31.103 es -178.32.31.104 - 178.32.31.107 ch -178.32.31.108 - 178.32.31.111 cz -178.32.31.112 - 178.32.31.127 fr -178.32.31.128 - 178.32.31.159 de -178.32.31.160 - 178.32.31.191 it -178.32.31.192 - 178.32.31.207 be -178.32.31.208 - 178.32.31.223 gb -178.32.31.224 - 178.32.31.255 ch -178.32.32.0 - 178.32.39.255 fr +178.32.29.192 - 178.32.39.255 fr 178.32.40.0 - 178.32.47.255 be 178.32.48.0 - 178.32.63.255 gb -178.32.64.0 - 178.32.64.3 fr -178.32.64.4 - 178.32.64.7 pl -178.32.64.8 - 178.32.64.11 ch -178.32.64.12 - 178.32.64.15 fr -178.32.64.16 - 178.32.64.31 de -178.32.64.32 - 178.32.64.47 fr -178.32.64.48 - 178.32.64.63 it -178.32.64.64 - 178.32.64.71 pl -178.32.64.72 - 178.32.64.79 ch -178.32.64.80 - 178.32.64.83 es -178.32.64.84 - 178.32.64.91 fr -178.32.64.92 - 178.32.64.127 pl -178.32.64.128 - 178.32.65.15 fr -178.32.65.16 - 178.32.65.31 it -178.32.65.32 - 178.32.65.35 gb -178.32.65.36 - 178.32.65.39 fi -178.32.65.40 - 178.32.65.43 es -178.32.65.44 - 178.32.65.55 fr -178.32.65.56 - 178.32.65.59 gb -178.32.65.60 - 178.32.65.63 es -178.32.65.64 - 178.32.65.79 fr -178.32.65.80 - 178.32.65.83 cz -178.32.65.84 - 178.32.65.91 fr -178.32.65.92 - 178.32.65.95 gb -178.32.65.96 - 178.32.65.127 de -178.32.65.128 - 178.32.65.159 fr -178.32.65.160 - 178.32.65.191 pl -178.32.65.192 - 178.32.65.255 fr -178.32.66.0 - 178.32.66.255 gb -178.32.67.0 - 178.32.67.7 fr -178.32.67.8 - 178.32.67.11 nl -178.32.67.12 - 178.32.67.15 es -178.32.67.16 - 178.32.67.255 fr -178.32.68.0 - 178.32.68.7 pl -178.32.68.8 - 178.32.68.11 de -178.32.68.12 - 178.32.68.15 gb -178.32.68.16 - 178.32.68.31 ie -178.32.68.32 - 178.32.68.43 fr -178.32.68.44 - 178.32.68.47 es -178.32.68.48 - 178.32.68.63 ch -178.32.68.64 - 178.32.68.67 gb -178.32.68.68 - 178.32.68.71 es -178.32.68.72 - 178.32.68.75 de -178.32.68.76 - 178.32.68.79 fr -178.32.68.80 - 178.32.68.95 gb -178.32.68.96 - 178.32.68.103 fr -178.32.68.104 - 178.32.68.111 es +178.32.64.0 - 178.32.65.79 fr +178.32.65.80 - 178.32.65.87 nl +178.32.65.88 - 178.32.68.111 fr 178.32.68.112 - 178.32.68.119 it -178.32.68.120 - 178.32.68.143 pl -178.32.68.144 - 178.32.68.159 fr -178.32.68.160 - 178.32.68.163 ie -178.32.68.164 - 178.32.68.167 fr -178.32.68.168 - 178.32.68.171 pl -178.32.68.172 - 178.32.68.175 fr -178.32.68.176 - 178.32.68.191 pl -178.32.68.192 - 178.32.68.215 fr -178.32.68.216 - 178.32.68.223 de -178.32.68.224 - 178.32.68.227 gb -178.32.68.228 - 178.32.68.231 pl -178.32.68.232 - 178.32.68.235 fr -178.32.68.236 - 178.32.68.239 es -178.32.68.240 - 178.32.68.243 lt -178.32.68.244 - 178.32.68.247 gb -178.32.68.248 - 178.32.68.251 fr -178.32.68.252 - 178.32.68.255 pl -178.32.69.0 - 178.32.69.255 es -178.32.70.0 - 178.32.70.15 fr -178.32.70.16 - 178.32.70.19 gb -178.32.70.20 - 178.32.70.23 pl -178.32.70.24 - 178.32.70.27 es -178.32.70.28 - 178.32.70.31 pl -178.32.70.32 - 178.32.70.63 fr -178.32.70.64 - 178.32.70.79 es -178.32.70.80 - 178.32.70.83 gb -178.32.70.84 - 178.32.70.95 fr -178.32.70.96 - 178.32.70.111 cz -178.32.70.112 - 178.32.70.119 fr -178.32.70.120 - 178.32.70.123 it -178.32.70.124 - 178.32.70.127 ch -178.32.70.128 - 178.32.70.159 gb -178.32.70.160 - 178.32.70.163 es -178.32.70.164 - 178.32.70.167 de -178.32.70.168 - 178.32.70.171 it -178.32.70.172 - 178.32.70.175 pl -178.32.70.176 - 178.32.70.191 fr -178.32.70.192 - 178.32.70.195 es -178.32.70.196 - 178.32.70.199 fr -178.32.70.200 - 178.32.70.207 de -178.32.70.208 - 178.32.70.211 fr -178.32.70.212 - 178.32.70.215 es -178.32.70.216 - 178.32.70.223 pl -178.32.70.224 - 178.32.70.227 es -178.32.70.228 - 178.32.70.231 pl -178.32.70.232 - 178.32.70.239 fr -178.32.70.240 - 178.32.70.247 gb -178.32.70.248 - 178.32.70.251 nl -178.32.70.252 - 178.32.70.255 gb -178.32.71.0 - 178.32.71.63 fr -178.32.71.64 - 178.32.71.79 it -178.32.71.80 - 178.32.71.83 gb -178.32.71.84 - 178.32.71.87 fr -178.32.71.88 - 178.32.71.95 es -178.32.71.96 - 178.32.71.119 pl -178.32.71.120 - 178.32.71.191 fr -178.32.71.192 - 178.32.71.223 es -178.32.71.224 - 178.32.71.239 nl -178.32.71.240 - 178.32.71.255 fr -178.32.72.0 - 178.32.72.31 de -178.32.72.32 - 178.32.72.63 fr -178.32.72.64 - 178.32.72.75 pl -178.32.72.76 - 178.32.72.79 de -178.32.72.80 - 178.32.72.87 fr -178.32.72.88 - 178.32.72.91 de -178.32.72.92 - 178.32.72.95 fr -178.32.72.96 - 178.32.72.99 pl -178.32.72.100 - 178.32.72.103 cz -178.32.72.104 - 178.32.72.111 fr -178.32.72.112 - 178.32.72.115 gb -178.32.72.116 - 178.32.72.127 es -178.32.72.128 - 178.32.72.159 gb -178.32.72.160 - 178.32.72.163 fr -178.32.72.164 - 178.32.72.167 cz -178.32.72.168 - 178.32.72.175 fr -178.32.72.176 - 178.32.72.191 pl -178.32.72.192 - 178.32.72.207 fr -178.32.72.208 - 178.32.72.211 be -178.32.72.212 - 178.32.72.215 pl -178.32.72.216 - 178.32.72.223 fr -178.32.72.224 - 178.32.72.239 es -178.32.72.240 - 178.32.72.243 fr -178.32.72.244 - 178.32.72.247 nl -178.32.72.248 - 178.32.72.255 pl -178.32.73.0 - 178.32.73.35 fr -178.32.73.36 - 178.32.73.39 gb -178.32.73.40 - 178.32.73.47 pl -178.32.73.48 - 178.32.73.51 fr -178.32.73.52 - 178.32.73.55 gb -178.32.73.56 - 178.32.73.79 fr -178.32.73.80 - 178.32.73.87 pl -178.32.73.88 - 178.32.73.255 fr -178.32.74.0 - 178.32.74.3 gb -178.32.74.4 - 178.32.74.7 de -178.32.74.8 - 178.32.74.31 pl +178.32.68.120 - 178.32.68.127 pl +178.32.68.128 - 178.32.70.15 fr +178.32.70.16 - 178.32.70.19 es +178.32.70.20 - 178.32.70.167 fr +178.32.70.168 - 178.32.70.171 pl +178.32.70.172 - 178.32.71.87 fr +178.32.71.88 - 178.32.71.91 es +178.32.71.92 - 178.32.72.31 fr +178.32.72.32 - 178.32.72.63 pt +178.32.72.64 - 178.32.74.31 fr 178.32.74.32 - 178.32.74.47 pt -178.32.74.48 - 178.32.74.63 gb -178.32.74.64 - 178.32.74.71 it -178.32.74.72 - 178.32.74.79 pt -178.32.74.80 - 178.32.74.135 fr -178.32.74.136 - 178.32.74.143 de -178.32.74.144 - 178.32.74.211 fr -178.32.74.212 - 178.32.74.215 pt -178.32.74.216 - 178.32.74.223 fr -178.32.74.224 - 178.32.74.255 pl -178.32.75.0 - 178.32.75.63 de -178.32.75.64 - 178.32.75.127 fr -178.32.75.128 - 178.32.75.131 es -178.32.75.132 - 178.32.75.143 pl -178.32.75.144 - 178.32.75.159 de -178.32.75.160 - 178.32.75.191 gb -178.32.75.192 - 178.32.75.199 nl -178.32.75.200 - 178.32.75.203 fr -178.32.75.204 - 178.32.75.207 nl -178.32.75.208 - 178.32.75.223 fr -178.32.75.224 - 178.32.75.227 nl -178.32.75.228 - 178.32.75.235 es -178.32.75.236 - 178.32.75.255 fr -178.32.76.0 - 178.32.76.31 pl -178.32.76.32 - 178.32.76.47 de -178.32.76.48 - 178.32.76.199 fr -178.32.76.200 - 178.32.76.203 it -178.32.76.204 - 178.32.76.207 pt -178.32.76.208 - 178.32.76.223 pl -178.32.76.224 - 178.32.76.239 it -178.32.76.240 - 178.32.76.243 pl -178.32.76.244 - 178.32.76.251 fr -178.32.76.252 - 178.32.76.255 pl -178.32.77.0 - 178.32.77.63 ch -178.32.77.64 - 178.32.77.79 fr -178.32.77.80 - 178.32.77.83 ch -178.32.77.84 - 178.32.77.87 de -178.32.77.88 - 178.32.77.91 es -178.32.77.92 - 178.32.77.95 gb -178.32.77.96 - 178.32.77.99 it -178.32.77.100 - 178.32.77.103 nl -178.32.77.104 - 178.32.77.111 fr -178.32.77.112 - 178.32.77.119 it -178.32.77.120 - 178.32.77.123 pt -178.32.77.124 - 178.32.77.127 be -178.32.77.128 - 178.32.77.159 fi -178.32.77.160 - 178.32.77.163 pl -178.32.77.164 - 178.32.77.167 ie -178.32.77.168 - 178.32.77.171 cz -178.32.77.172 - 178.32.77.175 lt -178.32.77.176 - 178.32.77.179 fr -178.32.77.180 - 178.32.77.183 pl -178.32.77.184 - 178.32.77.187 es -178.32.77.188 - 178.32.77.191 pt -178.32.77.192 - 178.32.77.207 pl -178.32.77.208 - 178.32.77.211 de -178.32.77.212 - 178.32.77.247 fr -178.32.77.248 - 178.32.77.255 gb -178.32.78.0 - 178.32.78.15 fr -178.32.78.16 - 178.32.78.19 es -178.32.78.20 - 178.32.78.23 gb -178.32.78.24 - 178.32.78.27 es -178.32.78.28 - 178.32.78.31 gb -178.32.78.32 - 178.32.78.47 fr -178.32.78.48 - 178.32.78.55 it -178.32.78.56 - 178.32.78.127 fr -178.32.78.128 - 178.32.78.131 de -178.32.78.132 - 178.32.78.135 pl -178.32.78.136 - 178.32.78.139 gb -178.32.78.140 - 178.32.78.143 be -178.32.78.144 - 178.32.78.151 fr -178.32.78.152 - 178.32.78.155 de -178.32.78.156 - 178.32.78.159 fr -178.32.78.160 - 178.32.78.163 pl -178.32.78.164 - 178.32.78.175 de -178.32.78.176 - 178.32.78.179 es -178.32.78.180 - 178.32.78.183 it -178.32.78.184 - 178.32.78.187 fr -178.32.78.188 - 178.32.78.191 nl -178.32.78.192 - 178.32.78.223 pl -178.32.78.224 - 178.32.78.231 it -178.32.78.232 - 178.32.78.243 de -178.32.78.244 - 178.32.78.247 fr -178.32.78.248 - 178.32.78.251 pl -178.32.78.252 - 178.32.78.255 gb -178.32.79.0 - 178.32.79.15 pl -178.32.79.16 - 178.32.79.27 fr -178.32.79.28 - 178.32.79.31 pl -178.32.79.32 - 178.32.79.35 ch -178.32.79.36 - 178.32.79.47 de -178.32.79.48 - 178.32.79.55 fr -178.32.79.56 - 178.32.79.59 es -178.32.79.60 - 178.32.79.63 pl -178.32.79.64 - 178.32.79.83 fr -178.32.79.84 - 178.32.79.87 es -178.32.79.88 - 178.32.79.91 it -178.32.79.92 - 178.32.79.95 nl -178.32.79.96 - 178.32.79.111 fr -178.32.79.112 - 178.32.79.127 gb -178.32.79.128 - 178.32.80.7 pl -178.32.80.8 - 178.32.80.11 it -178.32.80.12 - 178.32.80.15 pl -178.32.80.16 - 178.32.80.39 fr -178.32.80.40 - 178.32.80.43 pl -178.32.80.44 - 178.32.80.47 gb -178.32.80.48 - 178.32.80.51 es -178.32.80.52 - 178.32.80.63 fr -178.32.80.64 - 178.32.80.71 pl -178.32.80.72 - 178.32.80.75 it -178.32.80.76 - 178.32.80.79 nl -178.32.80.80 - 178.32.80.87 es -178.32.80.88 - 178.32.80.91 pl -178.32.80.92 - 178.32.80.95 es -178.32.80.96 - 178.32.80.111 pl -178.32.80.112 - 178.32.80.119 fr -178.32.80.120 - 178.32.80.123 pl -178.32.80.124 - 178.32.80.223 fr -178.32.80.224 - 178.32.80.227 de -178.32.80.228 - 178.32.80.231 nl -178.32.80.232 - 178.32.80.239 fr -178.32.80.240 - 178.32.80.243 it -178.32.80.244 - 178.32.80.247 de -178.32.80.248 - 178.32.80.251 gb -178.32.80.252 - 178.32.80.255 fr -178.32.81.0 - 178.32.81.127 es -178.32.81.128 - 178.32.81.159 gb -178.32.81.160 - 178.32.81.191 de -178.32.81.192 - 178.32.81.223 nl -178.32.81.224 - 178.32.81.251 fr -178.32.81.252 - 178.32.81.255 de -178.32.82.0 - 178.32.82.7 fr -178.32.82.8 - 178.32.82.11 it -178.32.82.12 - 178.32.82.15 be -178.32.82.16 - 178.32.82.143 fr -178.32.82.144 - 178.32.82.151 it -178.32.82.152 - 178.32.82.159 fr -178.32.82.160 - 178.32.82.175 pl -178.32.82.176 - 178.32.82.183 gb -178.32.82.184 - 178.32.82.187 pl -178.32.82.188 - 178.32.82.195 fr -178.32.82.196 - 178.32.82.203 pl -178.32.82.204 - 178.32.82.207 de -178.32.82.208 - 178.32.82.223 fr -178.32.82.224 - 178.32.82.231 be -178.32.82.232 - 178.32.82.255 fr -178.32.83.0 - 178.32.83.255 be -178.32.84.0 - 178.32.84.3 it -178.32.84.4 - 178.32.84.7 fr -178.32.84.8 - 178.32.84.15 es -178.32.84.16 - 178.32.84.19 gb -178.32.84.20 - 178.32.84.23 es -178.32.84.24 - 178.32.84.27 fr -178.32.84.28 - 178.32.84.31 pl -178.32.84.32 - 178.32.84.39 nl -178.32.84.40 - 178.32.84.43 fr -178.32.84.44 - 178.32.84.47 es -178.32.84.48 - 178.32.84.55 fr -178.32.84.56 - 178.32.84.63 es -178.32.84.64 - 178.32.84.95 nl -178.32.84.96 - 178.32.84.99 pl -178.32.84.100 - 178.32.84.103 de -178.32.84.104 - 178.32.84.107 fr -178.32.84.108 - 178.32.84.119 gb -178.32.84.120 - 178.32.84.123 es -178.32.84.124 - 178.32.84.127 ch -178.32.84.128 - 178.32.84.147 fr -178.32.84.148 - 178.32.84.151 pl -178.32.84.152 - 178.32.84.155 ie -178.32.84.156 - 178.32.84.159 ch -178.32.84.160 - 178.32.84.175 pl -178.32.84.176 - 178.32.84.179 gb -178.32.84.180 - 178.32.84.211 fr -178.32.84.212 - 178.32.84.215 pl -178.32.84.216 - 178.32.84.219 fr -178.32.84.220 - 178.32.84.227 de -178.32.84.228 - 178.32.84.231 it -178.32.84.232 - 178.32.84.235 pt -178.32.84.236 - 178.32.84.239 fr -178.32.84.240 - 178.32.84.255 be -178.32.85.0 - 178.32.85.255 fr -178.32.86.0 - 178.32.86.7 de -178.32.86.8 - 178.32.86.11 pl -178.32.86.12 - 178.32.86.15 fr -178.32.86.16 - 178.32.86.31 gb -178.32.86.32 - 178.32.86.35 pl -178.32.86.36 - 178.32.86.43 gb -178.32.86.44 - 178.32.86.47 fr -178.32.86.48 - 178.32.86.63 pl -178.32.86.64 - 178.32.86.95 de -178.32.86.96 - 178.32.86.127 fr -178.32.86.128 - 178.32.86.131 be -178.32.86.132 - 178.32.86.143 fr -178.32.86.144 - 178.32.86.159 de -178.32.86.160 - 178.32.86.175 fr -178.32.86.176 - 178.32.86.187 gb -178.32.86.188 - 178.32.86.207 fr -178.32.86.208 - 178.32.86.211 de -178.32.86.212 - 178.32.86.215 es -178.32.86.216 - 178.32.86.219 de -178.32.86.220 - 178.32.86.223 fr -178.32.86.224 - 178.32.86.255 pl -178.32.87.0 - 178.32.87.35 fr -178.32.87.36 - 178.32.87.43 pl -178.32.87.44 - 178.32.87.47 gb -178.32.87.48 - 178.32.87.67 fr -178.32.87.68 - 178.32.87.71 de -178.32.87.72 - 178.32.87.75 fr -178.32.87.76 - 178.32.87.79 gb -178.32.87.80 - 178.32.87.127 fr +178.32.74.48 - 178.32.74.107 fr +178.32.74.108 - 178.32.74.111 es +178.32.74.112 - 178.32.82.155 fr +178.32.82.156 - 178.32.82.159 es +178.32.82.160 - 178.32.87.43 fr +178.32.87.44 - 178.32.87.47 es +178.32.87.48 - 178.32.87.127 fr 178.32.87.128 - 178.32.87.135 ie 178.32.87.136 - 178.32.87.143 lt -178.32.87.144 - 178.32.87.147 pt -178.32.87.148 - 178.32.87.151 it -178.32.87.152 - 178.32.87.155 gb -178.32.87.156 - 178.32.87.159 pl -178.32.87.160 - 178.32.87.183 fr -178.32.87.184 - 178.32.87.187 es -178.32.87.188 - 178.32.87.191 cz -178.32.87.192 - 178.32.87.223 pl -178.32.87.224 - 178.32.88.143 fr -178.32.88.144 - 178.32.88.147 es -178.32.88.148 - 178.32.88.151 pl -178.32.88.152 - 178.32.88.155 fr -178.32.88.156 - 178.32.88.159 pl -178.32.88.160 - 178.32.88.171 fr -178.32.88.172 - 178.32.88.175 gb -178.32.88.176 - 178.32.88.179 it -178.32.88.180 - 178.32.88.183 pl -178.32.88.184 - 178.32.88.223 fr -178.32.88.224 - 178.32.88.227 de -178.32.88.228 - 178.32.88.231 fr -178.32.88.232 - 178.32.88.235 pl -178.32.88.236 - 178.32.88.239 gb -178.32.88.240 - 178.32.88.255 ie -178.32.89.0 - 178.32.89.143 fr -178.32.89.144 - 178.32.89.159 de -178.32.89.160 - 178.32.89.167 fr -178.32.89.168 - 178.32.89.171 it -178.32.89.172 - 178.32.89.175 nl -178.32.89.176 - 178.32.89.191 es -178.32.89.192 - 178.32.89.207 gb -178.32.89.208 - 178.32.89.223 fr -178.32.89.224 - 178.32.89.227 de -178.32.89.228 - 178.32.89.235 pl -178.32.89.236 - 178.32.89.239 es -178.32.89.240 - 178.32.89.243 fr -178.32.89.244 - 178.32.89.247 it -178.32.89.248 - 178.32.90.139 fr -178.32.90.140 - 178.32.90.143 pl -178.32.90.144 - 178.32.90.147 it -178.32.90.148 - 178.32.90.151 es -178.32.90.152 - 178.32.90.155 fr -178.32.90.156 - 178.32.90.159 gb -178.32.90.160 - 178.32.90.175 de -178.32.90.176 - 178.32.90.179 fr -178.32.90.180 - 178.32.90.183 gb -178.32.90.184 - 178.32.90.187 es -178.32.90.188 - 178.32.90.191 pl -178.32.90.192 - 178.32.90.255 es -178.32.91.0 - 178.32.91.15 pl -178.32.91.16 - 178.32.91.19 fr -178.32.91.20 - 178.32.91.23 de -178.32.91.24 - 178.32.91.27 fi -178.32.91.28 - 178.32.91.31 fr -178.32.91.32 - 178.32.91.47 es -178.32.91.48 - 178.32.91.51 fr -178.32.91.52 - 178.32.91.55 ch -178.32.91.56 - 178.32.91.59 fr -178.32.91.60 - 178.32.91.63 gb -178.32.91.64 - 178.32.91.67 it -178.32.91.68 - 178.32.91.71 lt -178.32.91.72 - 178.32.91.75 pt -178.32.91.76 - 178.32.91.79 pl -178.32.91.80 - 178.32.92.63 fr +178.32.87.144 - 178.32.88.231 fr +178.32.88.232 - 178.32.88.235 nl +178.32.88.236 - 178.32.89.227 fr +178.32.89.228 - 178.32.89.231 it +178.32.89.232 - 178.32.89.239 fr +178.32.89.240 - 178.32.89.243 es +178.32.89.244 - 178.32.92.63 fr 178.32.92.64 - 178.32.92.67 es -178.32.92.68 - 178.32.92.71 ie -178.32.92.72 - 178.32.92.83 fr -178.32.92.84 - 178.32.92.87 es -178.32.92.88 - 178.32.92.127 fr -178.32.92.128 - 178.32.92.143 de -178.32.92.144 - 178.32.92.147 it -178.32.92.148 - 178.32.92.191 fr -178.32.92.192 - 178.32.92.211 de -178.32.92.212 - 178.32.92.215 pl -178.32.92.216 - 178.32.92.223 fr -178.32.92.224 - 178.32.92.239 it -178.32.92.240 - 178.32.92.243 es -178.32.92.244 - 178.32.92.247 gb -178.32.92.248 - 178.32.92.251 pt -178.32.92.252 - 178.32.92.255 de -178.32.93.0 - 178.32.93.15 ch -178.32.93.16 - 178.32.93.31 pt -178.32.93.32 - 178.32.93.47 gb -178.32.93.48 - 178.32.93.71 fr -178.32.93.72 - 178.32.93.75 nl -178.32.93.76 - 178.32.93.95 fr -178.32.93.96 - 178.32.93.99 de -178.32.93.100 - 178.32.93.103 pl -178.32.93.104 - 178.32.93.107 pt -178.32.93.108 - 178.32.93.111 gb -178.32.93.112 - 178.32.93.115 it -178.32.93.116 - 178.32.93.119 es -178.32.93.120 - 178.32.93.123 fr -178.32.93.124 - 178.32.93.127 gb -178.32.93.128 - 178.32.93.131 fr -178.32.93.132 - 178.32.93.135 gb -178.32.93.136 - 178.32.93.139 cz -178.32.93.140 - 178.32.93.143 it -178.32.93.144 - 178.32.93.151 es -178.32.93.152 - 178.32.93.159 gb -178.32.93.160 - 178.32.93.163 es -178.32.93.164 - 178.32.93.167 gb -178.32.93.168 - 178.32.93.175 de -178.32.93.176 - 178.32.93.179 pl -178.32.93.180 - 178.32.93.183 es -178.32.93.184 - 178.32.93.191 fr -178.32.93.192 - 178.32.93.207 pl -178.32.93.208 - 178.32.93.211 fr -178.32.93.212 - 178.32.93.215 es -178.32.93.216 - 178.32.93.223 fr -178.32.93.224 - 178.32.93.239 it -178.32.93.240 - 178.32.93.247 cz -178.32.93.248 - 178.32.93.255 gb -178.32.94.0 - 178.32.95.127 fr -178.32.95.128 - 178.32.95.191 pl -178.32.95.192 - 178.32.95.195 fr -178.32.95.196 - 178.32.95.207 nl -178.32.95.208 - 178.32.95.211 pl -178.32.95.212 - 178.32.95.219 fr -178.32.95.220 - 178.32.95.223 pl -178.32.95.224 - 178.32.95.239 nl -178.32.95.240 - 178.32.135.255 fr +178.32.92.68 - 178.32.93.151 fr +178.32.93.152 - 178.32.93.155 es +178.32.93.156 - 178.32.95.139 fr +178.32.95.140 - 178.32.95.143 cz +178.32.95.144 - 178.32.95.178 fr +178.32.95.179 - 178.32.95.179 be +178.32.95.180 - 178.32.135.255 fr 178.32.136.0 - 178.32.143.255 it -178.32.144.0 - 178.32.159.255 fr -178.32.160.0 - 178.32.160.7 es -178.32.160.8 - 178.32.160.19 fr -178.32.160.20 - 178.32.160.31 es -178.32.160.32 - 178.32.160.47 pl -178.32.160.48 - 178.32.160.71 fr -178.32.160.72 - 178.32.160.79 pl -178.32.160.80 - 178.32.160.87 fr -178.32.160.88 - 178.32.160.91 cz -178.32.160.92 - 178.32.160.95 gb -178.32.160.96 - 178.32.160.203 fr -178.32.160.204 - 178.32.160.207 gb -178.32.160.208 - 178.32.160.215 pl -178.32.160.216 - 178.32.160.219 nl -178.32.160.220 - 178.32.160.223 pl -178.32.160.224 - 178.32.160.239 fr -178.32.160.240 - 178.32.160.247 es -178.32.160.248 - 178.32.160.251 gb -178.32.160.252 - 178.32.160.255 fr -178.32.161.0 - 178.32.161.3 nl -178.32.161.4 - 178.32.161.7 de -178.32.161.8 - 178.32.161.15 pl -178.32.161.16 - 178.32.161.19 ie -178.32.161.20 - 178.32.161.23 pl -178.32.161.24 - 178.32.161.27 es -178.32.161.28 - 178.32.161.31 nl -178.32.161.32 - 178.32.161.47 fr -178.32.161.48 - 178.32.161.55 es -178.32.161.56 - 178.32.161.59 pt -178.32.161.60 - 178.32.161.63 cz -178.32.161.64 - 178.32.161.71 pl -178.32.161.72 - 178.32.161.75 es -178.32.161.76 - 178.32.161.79 pl -178.32.161.80 - 178.32.161.111 gb -178.32.161.112 - 178.32.161.115 fr -178.32.161.116 - 178.32.161.123 pl -178.32.161.124 - 178.32.161.127 lt -178.32.161.128 - 178.32.161.143 pl -178.32.161.144 - 178.32.161.159 cz -178.32.161.160 - 178.32.161.163 de -178.32.161.164 - 178.32.161.167 gb -178.32.161.168 - 178.32.161.171 de -178.32.161.172 - 178.32.161.215 fr -178.32.161.216 - 178.32.161.219 de -178.32.161.220 - 178.32.161.223 lt -178.32.161.224 - 178.32.162.19 fr -178.32.162.20 - 178.32.162.23 be -178.32.162.24 - 178.32.162.27 fr -178.32.162.28 - 178.32.162.31 pl -178.32.162.32 - 178.32.162.35 ie -178.32.162.36 - 178.32.162.39 pl -178.32.162.40 - 178.32.162.43 es -178.32.162.44 - 178.32.162.47 pl -178.32.162.48 - 178.32.162.55 es -178.32.162.56 - 178.32.162.63 pl -178.32.162.64 - 178.32.162.79 fr -178.32.162.80 - 178.32.162.83 pl -178.32.162.84 - 178.32.162.87 fr -178.32.162.88 - 178.32.162.95 es -178.32.162.96 - 178.32.162.127 gb -178.32.162.128 - 178.32.162.159 fr -178.32.162.160 - 178.32.162.163 ie -178.32.162.164 - 178.32.162.191 pl -178.32.162.192 - 178.32.162.195 fr -178.32.162.196 - 178.32.162.199 nl -178.32.162.200 - 178.32.162.207 de -178.32.162.208 - 178.32.162.211 es -178.32.162.212 - 178.32.162.223 de -178.32.162.224 - 178.32.162.227 fr -178.32.162.228 - 178.32.162.231 nl -178.32.162.232 - 178.32.162.239 fr -178.32.162.240 - 178.32.162.243 gb -178.32.162.244 - 178.32.162.247 nl -178.32.162.248 - 178.32.162.255 pl -178.32.163.0 - 178.32.163.7 be -178.32.163.8 - 178.32.163.15 de -178.32.163.16 - 178.32.163.23 gb -178.32.163.24 - 178.32.163.31 fr -178.32.163.32 - 178.32.163.39 es -178.32.163.40 - 178.32.163.47 pl -178.32.163.48 - 178.32.163.55 es -178.32.163.56 - 178.32.163.99 fr -178.32.163.100 - 178.32.163.103 be -178.32.163.104 - 178.32.163.119 fr -178.32.163.120 - 178.32.163.127 de -178.32.163.128 - 178.32.164.127 fr -178.32.164.128 - 178.32.164.143 pl -178.32.164.144 - 178.32.164.151 fr -178.32.164.152 - 178.32.164.155 de -178.32.164.156 - 178.32.164.159 fr -178.32.164.160 - 178.32.164.183 gb -178.32.164.184 - 178.32.164.191 fr -178.32.164.192 - 178.32.165.31 pl -178.32.165.32 - 178.32.165.39 de -178.32.165.40 - 178.32.165.47 es -178.32.165.48 - 178.32.165.55 gb -178.32.165.56 - 178.32.165.63 de -178.32.165.64 - 178.32.165.95 pt -178.32.165.96 - 178.32.165.111 es -178.32.165.112 - 178.32.165.123 it -178.32.165.124 - 178.32.165.127 fr -178.32.165.128 - 178.32.165.143 ie -178.32.165.144 - 178.32.165.151 de -178.32.165.152 - 178.32.165.155 gb -178.32.165.156 - 178.32.165.159 pt -178.32.165.160 - 178.32.165.163 de -178.32.165.164 - 178.32.165.167 gb -178.32.165.168 - 178.32.165.171 fr -178.32.165.172 - 178.32.165.175 ie -178.32.165.176 - 178.32.165.179 fr -178.32.165.180 - 178.32.165.183 es -178.32.165.184 - 178.32.165.191 fr -178.32.165.192 - 178.32.165.199 it -178.32.165.200 - 178.32.165.207 nl -178.32.165.208 - 178.32.165.211 es -178.32.165.212 - 178.32.165.255 gb -178.32.166.0 - 178.32.166.15 de -178.32.166.16 - 178.32.166.31 fr -178.32.166.32 - 178.32.166.35 pt -178.32.166.36 - 178.32.166.39 pl -178.32.166.40 - 178.32.166.47 nl -178.32.166.48 - 178.32.166.67 fr -178.32.166.68 - 178.32.166.71 pt -178.32.166.72 - 178.32.166.79 es -178.32.166.80 - 178.32.166.91 fr -178.32.166.92 - 178.32.166.95 pl -178.32.166.96 - 178.32.166.111 de -178.32.166.112 - 178.32.166.127 fr -178.32.166.128 - 178.32.166.143 es -178.32.166.144 - 178.32.166.147 pl -178.32.166.148 - 178.32.166.191 fr -178.32.166.192 - 178.32.166.255 pl -178.32.167.0 - 178.32.167.31 gb -178.32.167.32 - 178.32.167.39 cz -178.32.167.40 - 178.32.167.43 pt -178.32.167.44 - 178.32.167.47 pl -178.32.167.48 - 178.32.167.51 pt -178.32.167.52 - 178.32.167.75 pl -178.32.167.76 - 178.32.167.79 gb -178.32.167.80 - 178.32.167.87 pl -178.32.167.88 - 178.32.167.91 es -178.32.167.92 - 178.32.167.95 fr -178.32.167.96 - 178.32.167.111 sn -178.32.167.112 - 178.32.167.119 fr -178.32.167.120 - 178.32.167.123 pl -178.32.167.124 - 178.32.167.127 fr -178.32.167.128 - 178.32.167.159 pl -178.32.167.160 - 178.32.167.191 it -178.32.167.192 - 178.32.167.239 fr -178.32.167.240 - 178.32.167.255 pl -178.32.168.0 - 178.32.168.167 fr -178.32.168.168 - 178.32.168.175 pl -178.32.168.176 - 178.32.168.223 fr -178.32.168.224 - 178.32.168.239 pl -178.32.168.240 - 178.32.168.255 fr -178.32.169.0 - 178.32.169.15 es -178.32.169.16 - 178.32.169.19 gb -178.32.169.20 - 178.32.169.23 pl -178.32.169.24 - 178.32.169.27 fr -178.32.169.28 - 178.32.169.31 gb -178.32.169.32 - 178.32.169.63 fr -178.32.169.64 - 178.32.169.95 pt -178.32.169.96 - 178.32.169.103 fr -178.32.169.104 - 178.32.169.107 gb -178.32.169.108 - 178.32.169.127 fr -178.32.169.128 - 178.32.169.143 lt -178.32.169.144 - 178.32.169.159 pl -178.32.169.160 - 178.32.169.175 ie -178.32.169.176 - 178.32.169.191 pl -178.32.169.192 - 178.32.169.207 fr -178.32.169.208 - 178.32.169.223 ie -178.32.169.224 - 178.32.169.255 pl -178.32.170.0 - 178.32.170.15 fr -178.32.170.16 - 178.32.170.31 pl -178.32.170.32 - 178.32.170.47 it -178.32.170.48 - 178.32.170.63 fr -178.32.170.64 - 178.32.170.127 be -178.32.170.128 - 178.32.170.135 it -178.32.170.136 - 178.32.170.143 nl -178.32.170.144 - 178.32.170.147 de -178.32.170.148 - 178.32.170.151 ch -178.32.170.152 - 178.32.170.159 fr -178.32.170.160 - 178.32.170.191 pl -178.32.170.192 - 178.32.170.207 it -178.32.170.208 - 178.32.170.215 fi -178.32.170.216 - 178.32.170.223 pt -178.32.170.224 - 178.32.170.227 es -178.32.170.228 - 178.32.170.231 it -178.32.170.232 - 178.32.170.235 gb -178.32.170.236 - 178.32.170.239 pl -178.32.170.240 - 178.32.171.63 fr -178.32.171.64 - 178.32.171.79 pl -178.32.171.80 - 178.32.171.95 es -178.32.171.96 - 178.32.171.103 fr -178.32.171.104 - 178.32.171.111 it -178.32.171.112 - 178.32.171.127 fr -178.32.171.128 - 178.32.171.143 gb -178.32.171.144 - 178.32.171.183 fr -178.32.171.184 - 178.32.171.191 nl -178.32.171.192 - 178.32.171.207 gb -178.32.171.208 - 178.32.171.211 it -178.32.171.212 - 178.32.171.215 be -178.32.171.216 - 178.32.171.223 fr -178.32.171.224 - 178.32.171.231 pl -178.32.171.232 - 178.32.171.235 fr -178.32.171.236 - 178.32.171.239 pl -178.32.171.240 - 178.32.171.255 gb -178.32.172.0 - 178.32.172.31 es -178.32.172.32 - 178.32.172.39 pl -178.32.172.40 - 178.32.172.43 de -178.32.172.44 - 178.32.172.51 fr +178.32.144.0 - 178.32.144.115 fr +178.32.144.116 - 178.32.144.119 de +178.32.144.120 - 178.32.144.123 fr +178.32.144.124 - 178.32.144.127 de +178.32.144.128 - 178.32.146.27 fr +178.32.146.28 - 178.32.146.31 es +178.32.146.32 - 178.32.148.239 fr +178.32.148.240 - 178.32.148.247 de +178.32.148.248 - 178.32.149.47 fr +178.32.149.48 - 178.32.149.63 gb +178.32.149.64 - 178.32.150.77 fr +178.32.150.78 - 178.32.150.78 es +178.32.150.79 - 178.32.150.207 fr +178.32.150.208 - 178.32.150.223 es +178.32.150.224 - 178.32.158.63 fr +178.32.158.64 - 178.32.158.95 de +178.32.158.96 - 178.32.159.15 fr +178.32.159.16 - 178.32.159.31 it +178.32.159.32 - 178.32.160.15 fr +178.32.160.16 - 178.32.160.19 cz +178.32.160.20 - 178.32.161.211 fr +178.32.161.212 - 178.32.161.215 es +178.32.161.216 - 178.32.166.243 fr +178.32.166.244 - 178.32.166.247 pt +178.32.166.248 - 178.32.168.223 fr +178.32.168.224 - 178.32.168.239 gb +178.32.168.240 - 178.32.172.51 fr 178.32.172.52 - 178.32.172.55 pl -178.32.172.56 - 178.32.172.59 gb -178.32.172.60 - 178.32.172.63 pl -178.32.172.64 - 178.32.172.127 fr -178.32.172.128 - 178.32.172.135 gb -178.32.172.136 - 178.32.172.159 fr -178.32.172.160 - 178.32.172.163 pt -178.32.172.164 - 178.32.172.167 lt -178.32.172.168 - 178.32.172.171 pt -178.32.172.172 - 178.32.172.175 pl -178.32.172.176 - 178.32.172.191 nl -178.32.172.192 - 178.32.172.199 fr -178.32.172.200 - 178.32.172.203 nl -178.32.172.204 - 178.32.172.207 lt -178.32.172.208 - 178.32.172.223 be -178.32.172.224 - 178.32.172.239 fr -178.32.172.240 - 178.32.172.243 pl -178.32.172.244 - 178.32.172.247 ie -178.32.172.248 - 178.32.172.255 fr -178.32.173.0 - 178.32.173.15 pl -178.32.173.16 - 178.32.173.23 gb -178.32.173.24 - 178.32.173.31 pt -178.32.173.32 - 178.32.173.63 fr -178.32.173.64 - 178.32.173.67 gb -178.32.173.68 - 178.32.173.71 cz -178.32.173.72 - 178.32.173.79 fr -178.32.173.80 - 178.32.173.95 ie -178.32.173.96 - 178.32.173.111 fr -178.32.173.112 - 178.32.173.127 pl -178.32.173.128 - 178.32.173.143 fr -178.32.173.144 - 178.32.173.159 pl -178.32.173.160 - 178.32.173.175 gb -178.32.173.176 - 178.32.173.179 fr -178.32.173.180 - 178.32.173.183 es -178.32.173.184 - 178.32.173.187 fr -178.32.173.188 - 178.32.173.191 es -178.32.173.192 - 178.32.173.195 be -178.32.173.196 - 178.32.173.199 it -178.32.173.200 - 178.32.173.207 fr -178.32.173.208 - 178.32.173.211 gb -178.32.173.212 - 178.32.173.223 fr -178.32.173.224 - 178.32.173.247 pl -178.32.173.248 - 178.32.173.251 fr -178.32.173.252 - 178.32.173.255 gb -178.32.174.0 - 178.32.174.7 es -178.32.174.8 - 178.32.174.15 fr -178.32.174.16 - 178.32.174.31 ie -178.32.174.32 - 178.32.174.35 fr -178.32.174.36 - 178.32.174.39 de -178.32.174.40 - 178.32.174.47 ie -178.32.174.48 - 178.32.174.51 it -178.32.174.52 - 178.32.174.55 fr -178.32.174.56 - 178.32.174.63 pt -178.32.174.64 - 178.32.174.67 pl -178.32.174.68 - 178.32.174.71 de -178.32.174.72 - 178.32.174.75 es -178.32.174.76 - 178.32.174.79 it -178.32.174.80 - 178.32.174.87 be -178.32.174.88 - 178.32.174.91 pl -178.32.174.92 - 178.32.174.95 es -178.32.174.96 - 178.32.174.143 pl -178.32.174.144 - 178.32.174.147 fr -178.32.174.148 - 178.32.174.155 gb -178.32.174.156 - 178.32.174.175 pl -178.32.174.176 - 178.32.174.179 it -178.32.174.180 - 178.32.174.183 pt -178.32.174.184 - 178.32.174.199 es -178.32.174.200 - 178.32.174.203 fr -178.32.174.204 - 178.32.174.207 es -178.32.174.208 - 178.32.174.255 fr -178.32.175.0 - 178.32.175.15 pl -178.32.175.16 - 178.32.175.23 fr -178.32.175.24 - 178.32.175.31 pt -178.32.175.32 - 178.32.175.47 fr -178.32.175.48 - 178.32.175.63 es -178.32.175.64 - 178.32.175.71 be -178.32.175.72 - 178.32.175.75 es -178.32.175.76 - 178.32.175.79 pl -178.32.175.80 - 178.32.175.95 ie -178.32.175.96 - 178.32.175.103 de -178.32.175.104 - 178.32.175.111 pl -178.32.175.112 - 178.32.175.115 de -178.32.175.116 - 178.32.175.127 pl -178.32.175.128 - 178.32.175.175 fr -178.32.175.176 - 178.32.175.179 pl -178.32.175.180 - 178.32.175.183 gb -178.32.175.184 - 178.32.175.195 fr -178.32.175.196 - 178.32.175.199 gb -178.32.175.200 - 178.32.175.203 de -178.32.175.204 - 178.32.175.207 fr -178.32.175.208 - 178.32.175.215 fi -178.32.175.216 - 178.32.175.223 es -178.32.175.224 - 178.32.175.243 fr -178.32.175.244 - 178.32.175.247 gb -178.32.175.248 - 178.32.175.251 es -178.32.175.252 - 178.32.175.255 pl -178.32.176.0 - 178.32.176.15 fr -178.32.176.16 - 178.32.176.19 de -178.32.176.20 - 178.32.176.23 fr -178.32.176.24 - 178.32.176.31 es -178.32.176.32 - 178.32.176.35 pl -178.32.176.36 - 178.32.176.39 fr -178.32.176.40 - 178.32.176.43 es -178.32.176.44 - 178.32.176.55 pl -178.32.176.56 - 178.32.176.63 it -178.32.176.64 - 178.32.176.79 fr -178.32.176.80 - 178.32.176.87 es -178.32.176.88 - 178.32.176.91 fr -178.32.176.92 - 178.32.176.95 gb -178.32.176.96 - 178.32.176.103 pl -178.32.176.104 - 178.32.176.107 es -178.32.176.108 - 178.32.176.111 fr -178.32.176.112 - 178.32.176.119 es -178.32.176.120 - 178.32.176.127 be -178.32.176.128 - 178.32.176.131 de -178.32.176.132 - 178.32.176.139 fr -178.32.176.140 - 178.32.176.143 pl -178.32.176.144 - 178.32.176.151 fr -178.32.176.152 - 178.32.176.155 de -178.32.176.156 - 178.32.176.167 fr -178.32.176.168 - 178.32.176.175 it -178.32.176.176 - 178.32.176.191 pl -178.32.176.192 - 178.32.176.207 fr -178.32.176.208 - 178.32.176.223 be -178.32.176.224 - 178.32.176.227 pl -178.32.176.228 - 178.32.176.231 fr -178.32.176.232 - 178.32.176.235 pt -178.32.176.236 - 178.32.176.247 gb -178.32.176.248 - 178.32.176.251 de -178.32.176.252 - 178.32.176.255 lt -178.32.177.0 - 178.32.177.255 pl -178.32.178.0 - 178.32.178.255 fr -178.32.179.0 - 178.32.179.255 ie -178.32.180.0 - 178.32.180.255 de -178.32.181.0 - 178.32.181.3 be -178.32.181.4 - 178.32.181.11 fr -178.32.181.12 - 178.32.181.15 ch -178.32.181.16 - 178.32.181.43 fr -178.32.181.44 - 178.32.181.47 es -178.32.181.48 - 178.32.181.75 fr -178.32.181.76 - 178.32.181.79 lt -178.32.181.80 - 178.32.181.95 fr -178.32.181.96 - 178.32.181.111 ie -178.32.181.112 - 178.32.181.115 it -178.32.181.116 - 178.32.181.119 fr -178.32.181.120 - 178.32.181.127 de -178.32.181.128 - 178.32.181.159 fr -178.32.181.160 - 178.32.181.163 de -178.32.181.164 - 178.32.181.167 pt -178.32.181.168 - 178.32.181.175 fr -178.32.181.176 - 178.32.181.191 pl -178.32.181.192 - 178.32.181.223 fr -178.32.181.224 - 178.32.181.239 es -178.32.181.240 - 178.32.181.243 gb -178.32.181.244 - 178.32.181.247 fr -178.32.181.248 - 178.32.181.251 it -178.32.181.252 - 178.32.181.255 de -178.32.182.0 - 178.32.183.31 fr -178.32.183.32 - 178.32.183.39 pl -178.32.183.40 - 178.32.183.43 fr -178.32.183.44 - 178.32.183.47 es -178.32.183.48 - 178.32.183.95 fr -178.32.183.96 - 178.32.183.107 gb -178.32.183.108 - 178.32.183.115 es -178.32.183.116 - 178.32.183.119 fr -178.32.183.120 - 178.32.183.123 es -178.32.183.124 - 178.32.183.127 gb -178.32.183.128 - 178.32.183.191 fr -178.32.183.192 - 178.32.183.199 es -178.32.183.200 - 178.32.183.207 it -178.32.183.208 - 178.32.183.215 pl -178.32.183.216 - 178.32.184.255 fr -178.32.185.0 - 178.32.185.3 nl -178.32.185.4 - 178.32.185.7 fr -178.32.185.8 - 178.32.185.11 de -178.32.185.12 - 178.32.185.15 fr -178.32.185.16 - 178.32.185.23 es -178.32.185.24 - 178.32.185.27 fr -178.32.185.28 - 178.32.185.31 nl -178.32.185.32 - 178.32.185.63 es -178.32.185.64 - 178.32.185.95 fr -178.32.185.96 - 178.32.185.111 de -178.32.185.112 - 178.32.185.127 fr -178.32.185.128 - 178.32.185.143 gb -178.32.185.144 - 178.32.185.159 fi -178.32.185.160 - 178.32.185.163 es -178.32.185.164 - 178.32.185.167 ie -178.32.185.168 - 178.32.185.171 it -178.32.185.172 - 178.32.185.207 fr -178.32.185.208 - 178.32.185.215 pt -178.32.185.216 - 178.32.185.219 pl -178.32.185.220 - 178.32.185.223 gb -178.32.185.224 - 178.32.186.39 fr -178.32.186.40 - 178.32.186.43 gb -178.32.186.44 - 178.32.186.47 fr -178.32.186.48 - 178.32.186.63 it -178.32.186.64 - 178.32.186.67 fi -178.32.186.68 - 178.32.186.71 fr -178.32.186.72 - 178.32.186.79 pl -178.32.186.80 - 178.32.186.95 fr -178.32.186.96 - 178.32.186.111 pl -178.32.186.112 - 178.32.186.115 de -178.32.186.116 - 178.32.186.119 pl -178.32.186.120 - 178.32.186.123 de -178.32.186.124 - 178.32.186.127 pl -178.32.186.128 - 178.32.186.131 de -178.32.186.132 - 178.32.186.135 pl -178.32.186.136 - 178.32.186.139 fr -178.32.186.140 - 178.32.186.143 pt -178.32.186.144 - 178.32.186.159 fr -178.32.186.160 - 178.32.186.163 es -178.32.186.164 - 178.32.186.167 gb -178.32.186.168 - 178.32.186.175 fr -178.32.186.176 - 178.32.186.183 nl -178.32.186.184 - 178.32.186.187 pl -178.32.186.188 - 178.32.186.191 it -178.32.186.192 - 178.32.186.223 pt -178.32.186.224 - 178.32.186.239 gb -178.32.186.240 - 178.32.186.255 be -178.32.187.0 - 178.32.187.3 es -178.32.187.4 - 178.32.187.7 gb -178.32.187.8 - 178.32.187.11 pl -178.32.187.12 - 178.32.187.15 gb -178.32.187.16 - 178.32.187.31 fr -178.32.187.32 - 178.32.187.47 gb -178.32.187.48 - 178.32.187.55 es -178.32.187.56 - 178.32.187.67 nl -178.32.187.68 - 178.32.187.71 ch -178.32.187.72 - 178.32.187.191 fr -178.32.187.192 - 178.32.187.195 de -178.32.187.196 - 178.32.187.199 gb -178.32.187.200 - 178.32.187.203 es -178.32.187.204 - 178.32.187.207 ie -178.32.187.208 - 178.32.187.223 fr -178.32.187.224 - 178.32.187.239 fi -178.32.187.240 - 178.32.187.247 fr -178.32.187.248 - 178.32.187.251 it -178.32.187.252 - 178.32.187.255 es -178.32.188.0 - 178.32.188.19 fr -178.32.188.20 - 178.32.188.23 it -178.32.188.24 - 178.32.188.27 es -178.32.188.28 - 178.32.188.31 fr -178.32.188.32 - 178.32.188.63 nl -178.32.188.64 - 178.32.188.159 pl -178.32.188.160 - 178.32.188.175 fr -178.32.188.176 - 178.32.188.191 ie -178.32.188.192 - 178.32.188.207 pl -178.32.188.208 - 178.32.188.215 es -178.32.188.216 - 178.32.188.219 fr -178.32.188.220 - 178.32.188.223 gb -178.32.188.224 - 178.32.188.239 fr -178.32.188.240 - 178.32.188.255 gb -178.32.189.0 - 178.32.189.63 fr -178.32.189.64 - 178.32.189.67 es -178.32.189.68 - 178.32.189.71 pl -178.32.189.72 - 178.32.189.75 lt -178.32.189.76 - 178.32.189.79 fr -178.32.189.80 - 178.32.189.95 gb -178.32.189.96 - 178.32.189.111 fr -178.32.189.112 - 178.32.189.119 pt -178.32.189.120 - 178.32.189.123 es -178.32.189.124 - 178.32.189.127 fr -178.32.189.128 - 178.32.189.159 pl -178.32.189.160 - 178.32.189.191 es -178.32.189.192 - 178.32.189.195 ie -178.32.189.196 - 178.32.189.199 pl -178.32.189.200 - 178.32.189.207 es -178.32.189.208 - 178.32.189.211 gb -178.32.189.212 - 178.32.189.215 pt -178.32.189.216 - 178.32.189.219 de -178.32.189.220 - 178.32.189.239 fr -178.32.189.240 - 178.32.189.243 de -178.32.189.244 - 178.32.189.247 gb -178.32.189.248 - 178.32.189.255 es -178.32.190.0 - 178.32.190.7 pl -178.32.190.8 - 178.32.190.11 es -178.32.190.12 - 178.32.190.15 gb -178.32.190.16 - 178.32.190.31 pl -178.32.190.32 - 178.32.190.47 es -178.32.190.48 - 178.32.190.55 fr -178.32.190.56 - 178.32.190.63 de -178.32.190.64 - 178.32.190.79 es -178.32.190.80 - 178.32.190.95 fr -178.32.190.96 - 178.32.190.127 pt -178.32.190.128 - 178.32.190.131 es -178.32.190.132 - 178.32.190.135 nl -178.32.190.136 - 178.32.190.139 fr -178.32.190.140 - 178.32.190.143 es -178.32.190.144 - 178.32.190.159 fr -178.32.190.160 - 178.32.190.167 gb -178.32.190.168 - 178.32.190.171 nl -178.32.190.172 - 178.32.190.175 es -178.32.190.176 - 178.32.190.183 gb -178.32.190.184 - 178.32.190.223 fr -178.32.190.224 - 178.32.191.127 pl -178.32.191.128 - 178.32.191.255 es -178.32.192.0 - 178.32.195.255 fr -178.32.196.0 - 178.32.196.255 tn -178.32.197.0 - 178.32.199.255 fr +178.32.172.56 - 178.32.173.187 fr +178.32.173.188 - 178.32.173.191 de +178.32.173.192 - 178.32.173.195 fr +178.32.173.196 - 178.32.173.199 pt +178.32.173.200 - 178.32.174.167 fr +178.32.174.168 - 178.32.174.175 nl +178.32.174.176 - 178.32.177.159 fr +178.32.177.160 - 178.32.177.163 es +178.32.177.164 - 178.32.177.183 fr +178.32.177.184 - 178.32.177.187 es +178.32.177.188 - 178.32.178.67 fr +178.32.178.68 - 178.32.178.71 nl +178.32.178.72 - 178.32.178.135 fr +178.32.178.136 - 178.32.178.143 nl +178.32.178.144 - 178.32.178.239 fr +178.32.178.240 - 178.32.178.247 it +178.32.178.248 - 178.32.180.203 fr +178.32.180.204 - 178.32.180.207 nl +178.32.180.208 - 178.32.180.239 fr +178.32.180.240 - 178.32.180.243 de +178.32.180.244 - 178.32.185.11 fr +178.32.185.12 - 178.32.185.15 mt +178.32.185.16 - 178.32.187.7 fr +178.32.187.8 - 178.32.187.11 de +178.32.187.12 - 178.32.187.203 fr +178.32.187.204 - 178.32.187.207 es +178.32.187.208 - 178.32.189.195 fr +178.32.189.196 - 178.32.189.199 es +178.32.189.200 - 178.32.191.187 fr +178.32.191.188 - 178.32.191.190 it +178.32.191.191 - 178.32.191.191 be +178.32.191.192 - 178.32.191.223 es +178.32.191.224 - 178.32.193.143 fr +178.32.193.144 - 178.32.193.147 nl +178.32.193.148 - 178.32.193.243 fr +178.32.193.244 - 178.32.193.244 es +178.32.193.245 - 178.32.199.255 fr 178.32.200.0 - 178.32.207.255 pl -178.32.208.0 - 178.32.224.31 fr -178.32.224.32 - 178.32.224.39 es -178.32.224.40 - 178.32.224.47 fr -178.32.224.48 - 178.32.224.63 pl -178.32.224.64 - 178.32.224.107 de -178.32.224.108 - 178.32.224.119 fr -178.32.224.120 - 178.32.224.123 de -178.32.224.124 - 178.32.224.127 fr -178.32.224.128 - 178.32.224.159 pl -178.32.224.160 - 178.32.224.175 ie -178.32.224.176 - 178.32.224.191 fr -178.32.224.192 - 178.32.224.195 de -178.32.224.196 - 178.32.224.199 fr -178.32.224.200 - 178.32.224.207 de -178.32.224.208 - 178.32.224.223 fr -178.32.224.224 - 178.32.224.255 es -178.32.225.0 - 178.32.225.143 fr -178.32.225.144 - 178.32.225.147 pl -178.32.225.148 - 178.32.225.151 fr -178.32.225.152 - 178.32.225.159 it -178.32.225.160 - 178.32.225.167 pl -178.32.225.168 - 178.32.225.175 it -178.32.225.176 - 178.32.225.179 pt -178.32.225.180 - 178.32.225.187 pl -178.32.225.188 - 178.32.225.207 fr -178.32.225.208 - 178.32.225.215 pl -178.32.225.216 - 178.32.225.223 de -178.32.225.224 - 178.32.225.255 pl -178.32.226.0 - 178.32.226.7 nl -178.32.226.8 - 178.32.226.15 de -178.32.226.16 - 178.32.226.31 fr -178.32.226.32 - 178.32.226.63 pl -178.32.226.64 - 178.32.226.95 es -178.32.226.96 - 178.32.226.103 pl -178.32.226.104 - 178.32.226.111 nl -178.32.226.112 - 178.32.226.119 ie -178.32.226.120 - 178.32.226.123 fr -178.32.226.124 - 178.32.226.127 ch -178.32.226.128 - 178.32.226.143 it -178.32.226.144 - 178.32.226.159 pl -178.32.226.160 - 178.32.226.167 de -178.32.226.168 - 178.32.226.175 es -178.32.226.176 - 178.32.226.179 ch -178.32.226.180 - 178.32.226.183 de -178.32.226.184 - 178.32.226.207 gb -178.32.226.208 - 178.32.226.215 de -178.32.226.216 - 178.32.226.223 nl -178.32.226.224 - 178.32.226.227 fr -178.32.226.228 - 178.32.226.231 cz -178.32.226.232 - 178.32.226.235 fi -178.32.226.236 - 178.32.226.239 it -178.32.226.240 - 178.32.226.243 pt -178.32.226.244 - 178.32.226.247 gb -178.32.226.248 - 178.32.226.255 de -178.32.227.0 - 178.32.227.19 gb -178.32.227.20 - 178.32.227.23 fr -178.32.227.24 - 178.32.227.31 nl -178.32.227.32 - 178.32.227.35 ie -178.32.227.36 - 178.32.227.39 lt -178.32.227.40 - 178.32.227.43 pl -178.32.227.44 - 178.32.227.47 es -178.32.227.48 - 178.32.227.51 ch -178.32.227.52 - 178.32.227.63 pl -178.32.227.64 - 178.32.227.79 it -178.32.227.80 - 178.32.227.83 gb -178.32.227.84 - 178.32.227.91 it -178.32.227.92 - 178.32.227.95 de -178.32.227.96 - 178.32.227.111 fr -178.32.227.112 - 178.32.227.119 pl -178.32.227.120 - 178.32.227.127 gb -178.32.227.128 - 178.32.227.135 be -178.32.227.136 - 178.32.227.139 de -178.32.227.140 - 178.32.227.143 pl -178.32.227.144 - 178.32.227.159 es -178.32.227.160 - 178.32.227.191 ie -178.32.227.192 - 178.32.227.195 fr -178.32.227.196 - 178.32.227.199 be -178.32.227.200 - 178.32.227.203 fr -178.32.227.204 - 178.32.227.207 lt -178.32.227.208 - 178.32.227.211 de -178.32.227.212 - 178.32.227.215 be -178.32.227.216 - 178.32.227.223 fr -178.32.227.224 - 178.32.227.255 ie -178.32.228.0 - 178.32.228.255 fr -178.32.229.0 - 178.32.229.31 es -178.32.229.32 - 178.32.229.47 it -178.32.229.48 - 178.32.229.63 be -178.32.229.64 - 178.32.229.79 pl -178.32.229.80 - 178.32.229.83 fr -178.32.229.84 - 178.32.229.87 nl -178.32.229.88 - 178.32.229.91 es -178.32.229.92 - 178.32.229.95 de -178.32.229.96 - 178.32.229.111 fr -178.32.229.112 - 178.32.229.115 de -178.32.229.116 - 178.32.229.119 ie -178.32.229.120 - 178.32.229.123 fr -178.32.229.124 - 178.32.229.127 pl -178.32.229.128 - 178.32.229.159 gb -178.32.229.160 - 178.32.229.175 be -178.32.229.176 - 178.32.229.191 de -178.32.229.192 - 178.32.229.223 pl -178.32.229.224 - 178.32.229.255 es -178.32.230.0 - 178.32.230.15 de -178.32.230.16 - 178.32.230.19 pl -178.32.230.20 - 178.32.230.23 de -178.32.230.24 - 178.32.230.31 pl -178.32.230.32 - 178.32.230.39 nl -178.32.230.40 - 178.32.230.43 es -178.32.230.44 - 178.32.230.47 gb -178.32.230.48 - 178.32.230.63 be -178.32.230.64 - 178.32.230.127 pl -178.32.230.128 - 178.32.230.159 fr -178.32.230.160 - 178.32.230.191 gb -178.32.230.192 - 178.32.230.199 it -178.32.230.200 - 178.32.230.207 pl -178.32.230.208 - 178.32.230.223 nl -178.32.230.224 - 178.32.230.231 pl -178.32.230.232 - 178.32.231.31 fr -178.32.231.32 - 178.32.231.35 pt -178.32.231.36 - 178.32.231.39 es -178.32.231.40 - 178.32.231.43 gb -178.32.231.44 - 178.32.231.51 pl -178.32.231.52 - 178.32.231.55 es -178.32.231.56 - 178.32.231.63 pl -178.32.231.64 - 178.32.231.79 es -178.32.231.80 - 178.32.231.95 fr -178.32.231.96 - 178.32.231.111 es -178.32.231.112 - 178.32.231.115 fi -178.32.231.116 - 178.32.231.119 pl -178.32.231.120 - 178.32.231.123 ie -178.32.231.124 - 178.32.231.127 fr -178.32.231.128 - 178.32.231.131 gb -178.32.231.132 - 178.32.231.135 de -178.32.231.136 - 178.32.231.143 nl -178.32.231.144 - 178.32.231.147 be -178.32.231.148 - 178.32.231.151 pl -178.32.231.152 - 178.32.231.159 de -178.32.231.160 - 178.32.231.183 fr -178.32.231.184 - 178.32.231.191 pl -178.32.231.192 - 178.32.231.199 fr -178.32.231.200 - 178.32.231.203 de -178.32.231.204 - 178.32.231.207 fi -178.32.231.208 - 178.32.231.223 it -178.32.231.224 - 178.32.231.239 ie -178.32.231.240 - 178.32.231.243 cz -178.32.231.244 - 178.32.231.247 fr -178.32.231.248 - 178.32.231.251 de -178.32.231.252 - 178.32.231.255 pl -178.32.232.0 - 178.32.232.63 fr -178.32.232.64 - 178.32.232.127 pt -178.32.232.128 - 178.32.232.143 nl -178.32.232.144 - 178.32.232.191 fr -178.32.232.192 - 178.32.232.223 pl -178.32.232.224 - 178.32.232.227 de -178.32.232.228 - 178.32.232.231 es -178.32.232.232 - 178.32.232.235 pl -178.32.232.236 - 178.32.232.239 cz -178.32.232.240 - 178.32.232.255 pl -178.32.233.0 - 178.32.233.79 fr -178.32.233.80 - 178.32.233.83 fi -178.32.233.84 - 178.32.233.87 gb -178.32.233.88 - 178.32.233.91 fr -178.32.233.92 - 178.32.233.111 pl -178.32.233.112 - 178.32.233.119 fr -178.32.233.120 - 178.32.233.127 es -178.32.233.128 - 178.32.233.135 fr -178.32.233.136 - 178.32.233.143 pl -178.32.233.144 - 178.32.233.159 fr -178.32.233.160 - 178.32.233.163 lt -178.32.233.164 - 178.32.233.167 nl -178.32.233.168 - 178.32.233.175 be -178.32.233.176 - 178.32.233.191 nl -178.32.233.192 - 178.32.233.223 be -178.32.233.224 - 178.32.233.227 pt -178.32.233.228 - 178.32.233.231 be -178.32.233.232 - 178.32.233.235 de -178.32.233.236 - 178.32.233.239 pl -178.32.233.240 - 178.32.233.255 fr -178.32.234.0 - 178.32.234.63 pt -178.32.234.64 - 178.32.234.127 pl -178.32.234.128 - 178.32.234.159 de -178.32.234.160 - 178.32.234.175 ch -178.32.234.176 - 178.32.234.179 pl -178.32.234.180 - 178.32.234.183 gb -178.32.234.184 - 178.32.234.187 fr -178.32.234.188 - 178.32.234.191 pl -178.32.234.192 - 178.32.234.223 fi -178.32.234.224 - 178.32.234.255 pl -178.32.235.0 - 178.32.236.15 fr -178.32.236.16 - 178.32.236.31 de -178.32.236.32 - 178.32.236.47 nl -178.32.236.48 - 178.32.236.51 fr -178.32.236.52 - 178.32.236.55 gb -178.32.236.56 - 178.32.236.59 pl -178.32.236.60 - 178.32.236.63 es -178.32.236.64 - 178.32.236.79 ie -178.32.236.80 - 178.32.236.83 fi -178.32.236.84 - 178.32.236.87 cz -178.32.236.88 - 178.32.236.95 pl -178.32.236.96 - 178.32.236.111 de -178.32.236.112 - 178.32.236.127 pl -178.32.236.128 - 178.32.236.191 fr -178.32.236.192 - 178.32.236.207 gb -178.32.236.208 - 178.32.236.239 fr -178.32.236.240 - 178.32.236.247 de -178.32.236.248 - 178.32.236.251 es -178.32.236.252 - 178.32.236.255 de -178.32.237.0 - 178.32.237.127 fr -178.32.237.128 - 178.32.237.135 nl -178.32.237.136 - 178.32.237.139 fr -178.32.237.140 - 178.32.237.147 gb -178.32.237.148 - 178.32.237.151 ie -178.32.237.152 - 178.32.237.159 fi -178.32.237.160 - 178.32.237.175 fr -178.32.237.176 - 178.32.237.179 ie -178.32.237.180 - 178.32.237.183 it -178.32.237.184 - 178.32.237.187 es -178.32.237.188 - 178.32.237.191 pt -178.32.237.192 - 178.32.237.207 ie -178.32.237.208 - 178.32.237.211 ch -178.32.237.212 - 178.32.237.215 pl -178.32.237.216 - 178.32.237.219 ch -178.32.237.220 - 178.32.237.223 pl -178.32.237.224 - 178.32.237.239 es -178.32.237.240 - 178.32.237.247 fr -178.32.237.248 - 178.32.237.251 es -178.32.237.252 - 178.32.237.255 de -178.32.238.0 - 178.32.238.15 pl -178.32.238.16 - 178.32.238.31 fr -178.32.238.32 - 178.32.238.63 pl -178.32.238.64 - 178.32.238.71 fr -178.32.238.72 - 178.32.238.75 de -178.32.238.76 - 178.32.238.79 pl -178.32.238.80 - 178.32.238.103 fr -178.32.238.104 - 178.32.238.111 nl -178.32.238.112 - 178.32.238.127 fr +178.32.208.0 - 178.32.226.79 fr +178.32.226.80 - 178.32.226.95 es +178.32.226.96 - 178.32.226.207 fr +178.32.226.208 - 178.32.226.215 nl +178.32.226.216 - 178.32.227.17 fr +178.32.227.18 - 178.32.227.18 gb +178.32.227.19 - 178.32.227.24 fr +178.32.227.25 - 178.32.227.25 nl +178.32.227.26 - 178.32.229.191 fr +178.32.229.192 - 178.32.229.223 cz +178.32.229.224 - 178.32.231.119 fr +178.32.231.120 - 178.32.231.123 es +178.32.231.124 - 178.32.232.135 fr +178.32.232.136 - 178.32.232.139 it +178.32.232.140 - 178.32.233.167 fr +178.32.233.168 - 178.32.233.175 it +178.32.233.176 - 178.32.236.35 fr +178.32.236.36 - 178.32.236.39 pl +178.32.236.40 - 178.32.237.207 fr +178.32.237.208 - 178.32.237.211 es +178.32.237.212 - 178.32.238.127 fr 178.32.238.128 - 178.32.238.191 de -178.32.238.192 - 178.32.238.195 es -178.32.238.196 - 178.32.238.199 be -178.32.238.200 - 178.32.238.203 gb -178.32.238.204 - 178.32.238.207 pl -178.32.238.208 - 178.32.238.223 fr -178.32.238.224 - 178.32.238.255 es -178.32.239.0 - 178.32.239.11 fr -178.32.239.12 - 178.32.239.15 de -178.32.239.16 - 178.32.239.47 gb -178.32.239.48 - 178.32.239.55 de -178.32.239.56 - 178.32.239.63 nl -178.32.239.64 - 178.32.239.67 fr -178.32.239.68 - 178.32.239.71 ch -178.32.239.72 - 178.32.239.75 fi -178.32.239.76 - 178.32.239.79 be -178.32.239.80 - 178.32.239.83 ie -178.32.239.84 - 178.32.239.87 lt -178.32.239.88 - 178.32.239.91 pl -178.32.239.92 - 178.32.239.95 es -178.32.239.96 - 178.32.239.99 it -178.32.239.100 - 178.32.239.103 cz -178.32.239.104 - 178.32.239.107 nl -178.32.239.108 - 178.32.239.111 pl -178.32.239.112 - 178.32.239.127 fr -178.32.239.128 - 178.32.239.131 pl -178.32.239.132 - 178.32.239.135 ch -178.32.239.136 - 178.32.239.175 fr -178.32.239.176 - 178.32.239.191 ie -178.32.239.192 - 178.32.239.199 pl -178.32.239.200 - 178.32.239.207 es -178.32.239.208 - 178.32.239.231 de -178.32.239.232 - 178.32.239.235 pl -178.32.239.236 - 178.32.239.239 es -178.32.239.240 - 178.32.239.247 gb -178.32.239.248 - 178.32.239.251 es -178.32.239.252 - 178.32.239.255 gb -178.32.240.0 - 178.32.240.31 fr -178.32.240.32 - 178.32.240.35 nl -178.32.240.36 - 178.32.240.63 gb -178.32.240.64 - 178.32.240.67 es -178.32.240.68 - 178.32.240.71 nl -178.32.240.72 - 178.32.240.79 pl -178.32.240.80 - 178.32.240.87 de -178.32.240.88 - 178.32.240.91 it -178.32.240.92 - 178.32.240.111 pl -178.32.240.112 - 178.32.240.115 de -178.32.240.116 - 178.32.240.119 lt -178.32.240.120 - 178.32.240.127 es -178.32.240.128 - 178.32.240.131 pl -178.32.240.132 - 178.32.240.143 es -178.32.240.144 - 178.32.240.159 nl -178.32.240.160 - 178.32.240.175 fr -178.32.240.176 - 178.32.240.191 pl -178.32.240.192 - 178.32.241.79 fr -178.32.241.80 - 178.32.241.87 pt -178.32.241.88 - 178.32.241.95 pl -178.32.241.96 - 178.32.241.99 es -178.32.241.100 - 178.32.241.103 pl -178.32.241.104 - 178.32.241.119 fr -178.32.241.120 - 178.32.241.127 pl -178.32.241.128 - 178.32.241.175 fr -178.32.241.176 - 178.32.241.191 nl -178.32.241.192 - 178.32.241.199 it -178.32.241.200 - 178.32.241.203 pl -178.32.241.204 - 178.32.241.223 fr -178.32.241.224 - 178.32.241.239 nl -178.32.241.240 - 178.32.241.255 fi -178.32.242.0 - 178.32.243.63 fr -178.32.243.64 - 178.32.243.95 de -178.32.243.96 - 178.32.243.111 fr -178.32.243.112 - 178.32.243.119 es -178.32.243.120 - 178.32.243.123 it -178.32.243.124 - 178.32.243.127 nl -178.32.243.128 - 178.32.243.131 fr -178.32.243.132 - 178.32.243.135 ch -178.32.243.136 - 178.32.243.139 pl -178.32.243.140 - 178.32.243.143 ie -178.32.243.144 - 178.32.243.179 fr -178.32.243.180 - 178.32.243.199 pl -178.32.243.200 - 178.32.243.207 be -178.32.243.208 - 178.32.243.211 fr -178.32.243.212 - 178.32.243.215 be -178.32.243.216 - 178.32.243.223 fr -178.32.243.224 - 178.32.243.255 es -178.32.244.0 - 178.32.244.63 ie -178.32.244.64 - 178.32.244.79 es -178.32.244.80 - 178.32.244.95 fr -178.32.244.96 - 178.32.244.127 pl -178.32.244.128 - 178.32.244.159 fr -178.32.244.160 - 178.32.244.163 pt -178.32.244.164 - 178.32.244.167 de -178.32.244.168 - 178.32.244.175 pl -178.32.244.176 - 178.32.244.191 gb -178.32.244.192 - 178.32.244.223 es -178.32.244.224 - 178.32.244.239 gb -178.32.244.240 - 178.32.244.247 pl -178.32.244.248 - 178.32.244.251 fi -178.32.244.252 - 178.32.244.255 de -178.32.245.0 - 178.32.245.95 fr -178.32.245.96 - 178.32.245.99 pl -178.32.245.100 - 178.32.245.103 de -178.32.245.104 - 178.32.245.107 es -178.32.245.108 - 178.32.245.111 pt -178.32.245.112 - 178.32.245.115 fr -178.32.245.116 - 178.32.245.119 es -178.32.245.120 - 178.32.245.123 fr -178.32.245.124 - 178.32.245.127 gb -178.32.245.128 - 178.32.245.131 be -178.32.245.132 - 178.32.245.135 es -178.32.245.136 - 178.32.245.139 pl -178.32.245.140 - 178.32.245.143 gb -178.32.245.144 - 178.32.245.147 de -178.32.245.148 - 178.32.245.151 es -178.32.245.152 - 178.32.245.159 pl -178.32.245.160 - 178.32.245.223 fr -178.32.245.224 - 178.32.245.239 pl -178.32.245.240 - 178.32.245.243 fr -178.32.245.244 - 178.32.245.247 pl -178.32.245.248 - 178.32.245.251 ch -178.32.245.252 - 178.32.246.27 pl -178.32.246.28 - 178.32.246.63 fr -178.32.246.64 - 178.32.246.67 de -178.32.246.68 - 178.32.246.71 pt -178.32.246.72 - 178.32.246.79 gb -178.32.246.80 - 178.32.246.95 fr -178.32.246.96 - 178.32.246.127 pt -178.32.246.128 - 178.32.246.159 fr -178.32.246.160 - 178.32.246.167 pl -178.32.246.168 - 178.32.246.175 es -178.32.246.176 - 178.32.246.191 fr -178.32.246.192 - 178.32.246.223 es -178.32.246.224 - 178.32.246.247 pl -178.32.246.248 - 178.32.246.251 de -178.32.246.252 - 178.32.247.31 fr -178.32.247.32 - 178.32.247.47 pl -178.32.247.48 - 178.32.247.127 fr -178.32.247.128 - 178.32.247.131 pt -178.32.247.132 - 178.32.247.135 fr -178.32.247.136 - 178.32.247.143 be -178.32.247.144 - 178.32.247.151 fr -178.32.247.152 - 178.32.247.155 es -178.32.247.156 - 178.32.247.159 fr -178.32.247.160 - 178.32.247.191 cz -178.32.247.192 - 178.32.247.255 fr -178.32.248.0 - 178.32.248.63 nl -178.32.248.64 - 178.32.248.95 fr -178.32.248.96 - 178.32.248.107 pl -178.32.248.108 - 178.32.248.111 de -178.32.248.112 - 178.32.248.119 pl -178.32.248.120 - 178.32.248.123 es -178.32.248.124 - 178.32.248.127 pt -178.32.248.128 - 178.32.248.159 fr -178.32.248.160 - 178.32.248.167 pl -178.32.248.168 - 178.32.248.175 fr -178.32.248.176 - 178.32.248.179 it -178.32.248.180 - 178.32.248.183 fr -178.32.248.184 - 178.32.248.187 cz -178.32.248.188 - 178.32.248.223 be -178.32.248.224 - 178.32.248.227 de -178.32.248.228 - 178.32.248.231 es -178.32.248.232 - 178.32.248.235 pl -178.32.248.236 - 178.32.248.239 es -178.32.248.240 - 178.32.248.255 pl -178.32.249.0 - 178.32.249.31 de -178.32.249.32 - 178.32.249.47 fr -178.32.249.48 - 178.32.249.55 pl -178.32.249.56 - 178.32.249.63 es -178.32.249.64 - 178.32.249.95 fr -178.32.249.96 - 178.32.249.111 pl -178.32.249.112 - 178.32.249.115 fi -178.32.249.116 - 178.32.249.119 ch -178.32.249.120 - 178.32.249.127 it -178.32.249.128 - 178.32.249.131 es -178.32.249.132 - 178.32.249.135 nl -178.32.249.136 - 178.32.249.143 ie -178.32.249.144 - 178.32.249.159 pl -178.32.249.160 - 178.32.249.255 fr -178.32.250.0 - 178.32.250.3 de -178.32.250.4 - 178.32.250.7 es -178.32.250.8 - 178.32.250.15 fr -178.32.250.16 - 178.32.250.31 es -178.32.250.32 - 178.32.250.63 fr -178.32.250.64 - 178.32.250.95 es -178.32.250.96 - 178.32.250.99 fr -178.32.250.100 - 178.32.250.103 it -178.32.250.104 - 178.32.250.111 pl -178.32.250.112 - 178.32.250.127 gb -178.32.250.128 - 178.32.250.135 pl -178.32.250.136 - 178.32.250.139 de -178.32.250.140 - 178.32.250.143 es -178.32.250.144 - 178.32.250.147 pt -178.32.250.148 - 178.32.250.151 de -178.32.250.152 - 178.32.250.155 ch -178.32.250.156 - 178.32.250.159 pl -178.32.250.160 - 178.32.250.175 fr -178.32.250.176 - 178.32.250.191 gb -178.32.250.192 - 178.32.250.207 fr -178.32.250.208 - 178.32.250.211 pl -178.32.250.212 - 178.32.250.215 de -178.32.250.216 - 178.32.250.219 gb -178.32.250.220 - 178.32.250.223 pl -178.32.250.224 - 178.32.250.239 fr -178.32.250.240 - 178.32.250.243 ch -178.32.250.244 - 178.32.250.247 fr -178.32.250.248 - 178.32.250.255 pl -178.32.251.0 - 178.32.251.63 ie -178.32.251.64 - 178.32.251.79 gb -178.32.251.80 - 178.32.251.95 pl -178.32.251.96 - 178.32.251.111 gb -178.32.251.112 - 178.32.251.115 be -178.32.251.116 - 178.32.251.119 es -178.32.251.120 - 178.32.251.255 fr -178.32.252.0 - 178.32.252.31 be -178.32.252.32 - 178.32.252.63 pt -178.32.252.64 - 178.32.252.79 it -178.32.252.80 - 178.32.252.95 gb -178.32.252.96 - 178.32.252.127 es -178.32.252.128 - 178.32.252.143 be -178.32.252.144 - 178.32.252.159 ch -178.32.252.160 - 178.32.252.191 gb -178.32.252.192 - 178.32.252.223 de -178.32.252.224 - 178.32.252.255 fr -178.32.253.0 - 178.32.253.7 ie -178.32.253.8 - 178.32.253.11 fr -178.32.253.12 - 178.32.253.15 de -178.32.253.16 - 178.32.253.31 fr -178.32.253.32 - 178.32.253.47 gb -178.32.253.48 - 178.32.253.63 be -178.32.253.64 - 178.32.253.79 it -178.32.253.80 - 178.32.253.83 es -178.32.253.84 - 178.32.253.87 pt -178.32.253.88 - 178.32.253.91 be -178.32.253.92 - 178.32.253.95 pl -178.32.253.96 - 178.32.253.127 fr -178.32.253.128 - 178.32.253.131 pl -178.32.253.132 - 178.32.253.139 de -178.32.253.140 - 178.32.253.143 es -178.32.253.144 - 178.32.253.147 gb -178.32.253.148 - 178.32.253.151 fr -178.32.253.152 - 178.32.253.155 pl -178.32.253.156 - 178.32.253.159 ie -178.32.253.160 - 178.32.253.175 fr -178.32.253.176 - 178.32.253.183 de -178.32.253.184 - 178.32.253.191 fr -178.32.253.192 - 178.32.253.195 de -178.32.253.196 - 178.32.253.199 gb -178.32.253.200 - 178.32.253.203 pl -178.32.253.204 - 178.32.253.207 ch -178.32.253.208 - 178.32.253.223 fr -178.32.253.224 - 178.32.253.255 pt -178.32.254.0 - 178.32.254.63 pl -178.32.254.64 - 178.32.254.127 ie -178.32.254.128 - 178.32.254.139 es -178.32.254.140 - 178.32.254.143 pl -178.32.254.144 - 178.32.254.159 es -178.32.254.160 - 178.32.254.195 pl -178.32.254.196 - 178.32.254.207 fr -178.32.254.208 - 178.32.254.223 pl -178.32.254.224 - 178.32.254.239 fr -178.32.254.240 - 178.32.254.247 de -178.32.254.248 - 178.32.254.251 es -178.32.254.252 - 178.32.255.7 fr -178.32.255.8 - 178.32.255.11 es -178.32.255.12 - 178.33.0.7 fr -178.33.0.8 - 178.33.0.11 be -178.33.0.12 - 178.33.0.19 it -178.33.0.20 - 178.33.0.23 pl -178.33.0.24 - 178.33.0.27 ch -178.33.0.28 - 178.33.0.31 pl -178.33.0.32 - 178.33.0.47 de -178.33.0.48 - 178.33.0.63 fr -178.33.0.64 - 178.33.0.67 gb -178.33.0.68 - 178.33.0.71 de -178.33.0.72 - 178.33.0.75 es -178.33.0.76 - 178.33.0.79 pl -178.33.0.80 - 178.33.0.95 fr -178.33.0.96 - 178.33.0.103 es -178.33.0.104 - 178.33.0.107 fr -178.33.0.108 - 178.33.0.111 gb -178.33.0.112 - 178.33.0.127 fr -178.33.0.128 - 178.33.0.143 pl -178.33.0.144 - 178.33.0.147 fr -178.33.0.148 - 178.33.0.151 es -178.33.0.152 - 178.33.0.191 fr -178.33.0.192 - 178.33.0.199 de -178.33.0.200 - 178.33.0.203 fr -178.33.0.204 - 178.33.0.207 nl -178.33.0.208 - 178.33.0.255 fr -178.33.1.0 - 178.33.1.31 pt -178.33.1.32 - 178.33.1.39 pl -178.33.1.40 - 178.33.1.47 de -178.33.1.48 - 178.33.1.51 it -178.33.1.52 - 178.33.1.55 nl -178.33.1.56 - 178.33.1.59 it -178.33.1.60 - 178.33.1.67 fr -178.33.1.68 - 178.33.1.71 be -178.33.1.72 - 178.33.1.75 ch -178.33.1.76 - 178.33.1.79 es -178.33.1.80 - 178.33.1.83 fr -178.33.1.84 - 178.33.1.87 gb -178.33.1.88 - 178.33.1.91 ie -178.33.1.92 - 178.33.1.95 it -178.33.1.96 - 178.33.1.111 fr -178.33.1.112 - 178.33.1.127 it -178.33.1.128 - 178.33.1.131 pl -178.33.1.132 - 178.33.1.139 fr -178.33.1.140 - 178.33.1.143 de -178.33.1.144 - 178.33.1.147 fr -178.33.1.148 - 178.33.1.151 pl -178.33.1.152 - 178.33.1.155 fr -178.33.1.156 - 178.33.1.175 gb -178.33.1.176 - 178.33.1.191 ie -178.33.1.192 - 178.33.1.199 es -178.33.1.200 - 178.33.1.203 fr -178.33.1.204 - 178.33.1.207 de -178.33.1.208 - 178.33.1.211 es -178.33.1.212 - 178.33.1.215 fr -178.33.1.216 - 178.33.1.219 es -178.33.1.220 - 178.33.1.223 de -178.33.1.224 - 178.33.1.231 it -178.33.1.232 - 178.33.1.235 gb -178.33.1.236 - 178.33.1.239 pt -178.33.1.240 - 178.33.1.247 it -178.33.1.248 - 178.33.1.251 fr -178.33.1.252 - 178.33.1.255 it -178.33.2.0 - 178.33.2.63 de -178.33.2.64 - 178.33.2.67 gb -178.33.2.68 - 178.33.2.71 fr -178.33.2.72 - 178.33.2.79 ch -178.33.2.80 - 178.33.2.83 fr -178.33.2.84 - 178.33.2.87 gb -178.33.2.88 - 178.33.2.91 es -178.33.2.92 - 178.33.2.111 ie -178.33.2.112 - 178.33.2.119 fr -178.33.2.120 - 178.33.2.191 pl -178.33.2.192 - 178.33.2.207 fr -178.33.2.208 - 178.33.2.211 be -178.33.2.212 - 178.33.2.219 pl -178.33.2.220 - 178.33.2.227 es -178.33.2.228 - 178.33.2.231 fr -178.33.2.232 - 178.33.2.235 es -178.33.2.236 - 178.33.2.239 gb -178.33.2.240 - 178.33.2.255 es -178.33.3.0 - 178.33.3.15 pl -178.33.3.16 - 178.33.3.23 de -178.33.3.24 - 178.33.3.31 be -178.33.3.32 - 178.33.3.47 fr -178.33.3.48 - 178.33.3.51 de -178.33.3.52 - 178.33.3.55 be -178.33.3.56 - 178.33.3.63 pl -178.33.3.64 - 178.33.3.67 fr -178.33.3.68 - 178.33.3.71 pl -178.33.3.72 - 178.33.3.75 fr -178.33.3.76 - 178.33.3.79 de -178.33.3.80 - 178.33.3.95 fr -178.33.3.96 - 178.33.3.127 nl -178.33.3.128 - 178.33.3.131 pl -178.33.3.132 - 178.33.3.135 cz -178.33.3.136 - 178.33.3.143 fr -178.33.3.144 - 178.33.3.151 gb -178.33.3.152 - 178.33.3.155 fr -178.33.3.156 - 178.33.3.159 de -178.33.3.160 - 178.33.3.163 es -178.33.3.164 - 178.33.3.167 pl -178.33.3.168 - 178.33.3.175 fr -178.33.3.176 - 178.33.3.191 es -178.33.3.192 - 178.33.3.199 fr -178.33.3.200 - 178.33.3.207 it -178.33.3.208 - 178.33.3.223 be -178.33.3.224 - 178.33.3.231 pl -178.33.3.232 - 178.33.3.239 gb -178.33.3.240 - 178.33.3.247 fr -178.33.3.248 - 178.33.3.255 es -178.33.4.0 - 178.33.4.47 fr -178.33.4.48 - 178.33.4.55 pl -178.33.4.56 - 178.33.4.59 fr -178.33.4.60 - 178.33.4.63 de -178.33.4.64 - 178.33.4.95 fr -178.33.4.96 - 178.33.4.99 be -178.33.4.100 - 178.33.4.103 fr -178.33.4.104 - 178.33.4.111 es -178.33.4.112 - 178.33.4.127 fr -178.33.4.128 - 178.33.4.143 pl -178.33.4.144 - 178.33.4.147 pt -178.33.4.148 - 178.33.4.155 fr -178.33.4.156 - 178.33.4.159 es -178.33.4.160 - 178.33.4.183 fr -178.33.4.184 - 178.33.4.191 gb -178.33.4.192 - 178.33.4.207 es -178.33.4.208 - 178.33.4.223 fr -178.33.4.224 - 178.33.5.7 pl -178.33.5.8 - 178.33.5.11 ch -178.33.5.12 - 178.33.5.15 cz -178.33.5.16 - 178.33.5.19 fr -178.33.5.20 - 178.33.5.23 de -178.33.5.24 - 178.33.5.39 pl -178.33.5.40 - 178.33.5.63 fr -178.33.5.64 - 178.33.5.127 pt -178.33.5.128 - 178.33.5.191 gb -178.33.5.192 - 178.33.5.255 it -178.33.6.0 - 178.33.6.7 de -178.33.6.8 - 178.33.6.11 cz -178.33.6.12 - 178.33.6.15 de -178.33.6.16 - 178.33.6.31 pl -178.33.6.32 - 178.33.6.39 gb -178.33.6.40 - 178.33.6.47 de -178.33.6.48 - 178.33.6.51 fr -178.33.6.52 - 178.33.6.63 gb -178.33.6.64 - 178.33.6.95 fr -178.33.6.96 - 178.33.6.127 pt -178.33.6.128 - 178.33.6.175 fr -178.33.6.176 - 178.33.6.183 gb -178.33.6.184 - 178.33.6.199 fr -178.33.6.200 - 178.33.6.203 pl -178.33.6.204 - 178.33.6.207 pt -178.33.6.208 - 178.33.6.223 de -178.33.6.224 - 178.33.6.239 pl -178.33.6.240 - 178.33.6.247 gb -178.33.6.248 - 178.33.6.255 fr -178.33.7.0 - 178.33.7.15 gb -178.33.7.16 - 178.33.7.19 de -178.33.7.20 - 178.33.7.23 fr -178.33.7.24 - 178.33.7.31 es -178.33.7.32 - 178.33.7.55 fr -178.33.7.56 - 178.33.7.59 de -178.33.7.60 - 178.33.7.63 pl -178.33.7.64 - 178.33.7.127 nl -178.33.7.128 - 178.33.7.191 fr -178.33.7.192 - 178.33.7.223 it -178.33.7.224 - 178.33.7.255 pl -178.33.8.0 - 178.33.8.95 fr -178.33.8.96 - 178.33.8.99 de -178.33.8.100 - 178.33.8.103 it -178.33.8.104 - 178.33.8.107 be -178.33.8.108 - 178.33.8.111 it -178.33.8.112 - 178.33.8.127 de -178.33.8.128 - 178.33.8.159 fr -178.33.8.160 - 178.33.8.167 be -178.33.8.168 - 178.33.8.171 es -178.33.8.172 - 178.33.8.175 de -178.33.8.176 - 178.33.8.179 ch -178.33.8.180 - 178.33.8.183 it -178.33.8.184 - 178.33.8.187 ch -178.33.8.188 - 178.33.8.191 pl -178.33.8.192 - 178.33.8.219 fr -178.33.8.220 - 178.33.8.223 gb -178.33.8.224 - 178.33.8.227 pl -178.33.8.228 - 178.33.8.231 de -178.33.8.232 - 178.33.8.235 es -178.33.8.236 - 178.33.9.3 fr -178.33.9.4 - 178.33.9.7 fi -178.33.9.8 - 178.33.9.11 gb -178.33.9.12 - 178.33.9.15 pl -178.33.9.16 - 178.33.9.27 fr -178.33.9.28 - 178.33.9.63 nl -178.33.9.64 - 178.33.9.67 pl -178.33.9.68 - 178.33.9.71 fr -178.33.9.72 - 178.33.9.75 gb -178.33.9.76 - 178.33.9.95 fr -178.33.9.96 - 178.33.9.103 es -178.33.9.104 - 178.33.9.107 pl -178.33.9.108 - 178.33.9.111 gb -178.33.9.112 - 178.33.9.135 fr -178.33.9.136 - 178.33.9.143 pl -178.33.9.144 - 178.33.9.179 fr -178.33.9.180 - 178.33.9.183 gb -178.33.9.184 - 178.33.9.187 cz -178.33.9.188 - 178.33.9.191 it -178.33.9.192 - 178.33.9.255 fr -178.33.10.0 - 178.33.10.15 it -178.33.10.16 - 178.33.10.19 ie -178.33.10.20 - 178.33.10.23 gb -178.33.10.24 - 178.33.10.31 it -178.33.10.32 - 178.33.10.55 fr -178.33.10.56 - 178.33.10.63 de -178.33.10.64 - 178.33.10.71 pl -178.33.10.72 - 178.33.10.79 it -178.33.10.80 - 178.33.10.83 es -178.33.10.84 - 178.33.10.87 gb -178.33.10.88 - 178.33.10.91 fr -178.33.10.92 - 178.33.10.95 be -178.33.10.96 - 178.33.10.127 nl -178.33.10.128 - 178.33.10.143 fr -178.33.10.144 - 178.33.10.159 es -178.33.10.160 - 178.33.10.163 fr -178.33.10.164 - 178.33.10.179 de -178.33.10.180 - 178.33.10.183 fr -178.33.10.184 - 178.33.10.191 de -178.33.10.192 - 178.33.10.207 fr -178.33.10.208 - 178.33.10.211 pl -178.33.10.212 - 178.33.10.223 it -178.33.10.224 - 178.33.10.231 fr -178.33.10.232 - 178.33.10.239 pl -178.33.10.240 - 178.33.10.243 de -178.33.10.244 - 178.33.10.247 it -178.33.10.248 - 178.33.10.255 fr -178.33.11.0 - 178.33.11.3 it -178.33.11.4 - 178.33.11.11 pl -178.33.11.12 - 178.33.11.15 gb -178.33.11.16 - 178.33.11.31 es -178.33.11.32 - 178.33.11.35 de -178.33.11.36 - 178.33.11.39 cz -178.33.11.40 - 178.33.11.43 fr -178.33.11.44 - 178.33.11.47 de -178.33.11.48 - 178.33.11.63 pl -178.33.11.64 - 178.33.11.71 es -178.33.11.72 - 178.33.11.79 fr -178.33.11.80 - 178.33.11.127 pl -178.33.11.128 - 178.33.11.135 es -178.33.11.136 - 178.33.11.139 pl -178.33.11.140 - 178.33.11.147 fr -178.33.11.148 - 178.33.11.151 gb -178.33.11.152 - 178.33.11.159 be -178.33.11.160 - 178.33.11.191 cz -178.33.11.192 - 178.33.11.223 nl -178.33.11.224 - 178.33.11.255 es -178.33.12.0 - 178.33.12.3 fr -178.33.12.4 - 178.33.12.7 es -178.33.12.8 - 178.33.12.31 fr -178.33.12.32 - 178.33.12.35 it -178.33.12.36 - 178.33.12.39 fr -178.33.12.40 - 178.33.12.43 fi -178.33.12.44 - 178.33.12.47 lt -178.33.12.48 - 178.33.12.51 gb -178.33.12.52 - 178.33.12.55 fr -178.33.12.56 - 178.33.12.63 pl -178.33.12.64 - 178.33.12.79 fr -178.33.12.80 - 178.33.12.95 pl -178.33.12.96 - 178.33.12.99 es -178.33.12.100 - 178.33.12.103 fr -178.33.12.104 - 178.33.12.111 gb -178.33.12.112 - 178.33.12.115 fr -178.33.12.116 - 178.33.12.119 gb -178.33.12.120 - 178.33.12.191 fr -178.33.12.192 - 178.33.12.195 de -178.33.12.196 - 178.33.12.199 gb -178.33.12.200 - 178.33.12.207 pl -178.33.12.208 - 178.33.12.223 fr -178.33.12.224 - 178.33.12.227 it -178.33.12.228 - 178.33.12.255 fr -178.33.13.0 - 178.33.13.31 pl -178.33.13.32 - 178.33.13.43 fr -178.33.13.44 - 178.33.13.47 nl -178.33.13.48 - 178.33.13.51 gb -178.33.13.52 - 178.33.13.55 de -178.33.13.56 - 178.33.13.59 pt -178.33.13.60 - 178.33.13.63 be -178.33.13.64 - 178.33.13.95 fr -178.33.13.96 - 178.33.13.127 it -178.33.13.128 - 178.33.13.159 be -178.33.13.160 - 178.33.13.191 ie -178.33.13.192 - 178.33.13.223 pl -178.33.13.224 - 178.33.13.239 fr -178.33.13.240 - 178.33.13.255 pl -178.33.14.0 - 178.33.14.31 fr -178.33.14.32 - 178.33.14.39 pl -178.33.14.40 - 178.33.14.47 fr -178.33.14.48 - 178.33.14.51 es -178.33.14.52 - 178.33.14.55 lt -178.33.14.56 - 178.33.14.127 fr -178.33.14.128 - 178.33.14.223 pl -178.33.14.224 - 178.33.14.255 gb -178.33.15.0 - 178.33.15.3 pl -178.33.15.4 - 178.33.15.7 it -178.33.15.8 - 178.33.15.11 gb -178.33.15.12 - 178.33.15.15 pl -178.33.15.16 - 178.33.15.31 fr -178.33.15.32 - 178.33.15.39 pl -178.33.15.40 - 178.33.15.47 it -178.33.15.48 - 178.33.15.95 fr -178.33.15.96 - 178.33.15.103 pl -178.33.15.104 - 178.33.15.107 fr -178.33.15.108 - 178.33.15.111 pl -178.33.15.112 - 178.33.15.127 fr -178.33.15.128 - 178.33.15.191 pl -178.33.15.192 - 178.33.15.199 ie -178.33.15.200 - 178.33.15.203 gb -178.33.15.204 - 178.33.15.211 fr -178.33.15.212 - 178.33.15.215 gb -178.33.15.216 - 178.33.16.255 fr -178.33.17.0 - 178.33.17.63 pl -178.33.17.64 - 178.33.17.67 fr -178.33.17.68 - 178.33.17.71 cz -178.33.17.72 - 178.33.17.87 fr -178.33.17.88 - 178.33.17.95 gb -178.33.17.96 - 178.33.17.175 fr -178.33.17.176 - 178.33.17.183 de -178.33.17.184 - 178.33.17.187 pl -178.33.17.188 - 178.33.17.191 gb -178.33.17.192 - 178.33.17.195 nl -178.33.17.196 - 178.33.17.199 es -178.33.17.200 - 178.33.17.203 de -178.33.17.204 - 178.33.17.207 fr -178.33.17.208 - 178.33.17.211 be -178.33.17.212 - 178.33.17.215 it -178.33.17.216 - 178.33.17.223 pl -178.33.17.224 - 178.33.17.231 de -178.33.17.232 - 178.33.17.239 fr -178.33.17.240 - 178.33.17.243 nl -178.33.17.244 - 178.33.17.251 de -178.33.17.252 - 178.33.17.255 fr -178.33.18.0 - 178.33.18.3 pl -178.33.18.4 - 178.33.18.7 gb -178.33.18.8 - 178.33.18.15 it -178.33.18.16 - 178.33.18.31 fr -178.33.18.32 - 178.33.18.63 gb -178.33.18.64 - 178.33.18.79 es -178.33.18.80 - 178.33.18.87 de -178.33.18.88 - 178.33.18.91 gb -178.33.18.92 - 178.33.18.111 fr -178.33.18.112 - 178.33.18.143 pl -178.33.18.144 - 178.33.18.159 fr -178.33.18.160 - 178.33.18.167 it -178.33.18.168 - 178.33.18.171 fr -178.33.18.172 - 178.33.18.175 pl -178.33.18.176 - 178.33.18.179 gb -178.33.18.180 - 178.33.18.183 es -178.33.18.184 - 178.33.18.187 it -178.33.18.188 - 178.33.18.191 fr -178.33.18.192 - 178.33.18.207 pt -178.33.18.208 - 178.33.18.255 gb -178.33.19.0 - 178.33.19.31 pl -178.33.19.32 - 178.33.19.47 fr -178.33.19.48 - 178.33.19.55 es -178.33.19.56 - 178.33.19.59 pl -178.33.19.60 - 178.33.19.63 fr -178.33.19.64 - 178.33.19.95 ch -178.33.19.96 - 178.33.19.127 ie -178.33.19.128 - 178.33.19.143 pl -178.33.19.144 - 178.33.19.151 gb -178.33.19.152 - 178.33.19.155 ch -178.33.19.156 - 178.33.19.159 fr -178.33.19.160 - 178.33.19.191 gb -178.33.19.192 - 178.33.19.195 fr -178.33.19.196 - 178.33.19.199 de -178.33.19.200 - 178.33.19.207 es -178.33.19.208 - 178.33.19.223 fr -178.33.19.224 - 178.33.19.227 be -178.33.19.228 - 178.33.19.239 fr -178.33.19.240 - 178.33.19.247 lt -178.33.19.248 - 178.33.19.251 gb -178.33.19.252 - 178.33.19.255 es -178.33.20.0 - 178.33.20.31 fr -178.33.20.32 - 178.33.20.47 pl -178.33.20.48 - 178.33.20.51 it -178.33.20.52 - 178.33.20.55 gb -178.33.20.56 - 178.33.20.59 fr -178.33.20.60 - 178.33.20.63 de -178.33.20.64 - 178.33.20.79 fr -178.33.20.80 - 178.33.20.83 pl -178.33.20.84 - 178.33.20.87 it -178.33.20.88 - 178.33.20.95 fr -178.33.20.96 - 178.33.20.127 it -178.33.20.128 - 178.33.20.143 fr -178.33.20.144 - 178.33.20.147 de -178.33.20.148 - 178.33.20.159 fr -178.33.20.160 - 178.33.20.179 pl -178.33.20.180 - 178.33.20.183 fr -178.33.20.184 - 178.33.20.191 nl -178.33.20.192 - 178.33.20.199 pl -178.33.20.200 - 178.33.20.203 es -178.33.20.204 - 178.33.20.211 fr -178.33.20.212 - 178.33.20.215 gb -178.33.20.216 - 178.33.20.223 fr -178.33.20.224 - 178.33.20.227 de -178.33.20.228 - 178.33.21.11 fr -178.33.21.12 - 178.33.21.15 it -178.33.21.16 - 178.33.21.31 fr -178.33.21.32 - 178.33.21.39 pl -178.33.21.40 - 178.33.21.63 fr -178.33.21.64 - 178.33.21.67 nl -178.33.21.68 - 178.33.21.71 es -178.33.21.72 - 178.33.21.75 fr -178.33.21.76 - 178.33.21.79 pl -178.33.21.80 - 178.33.21.83 be -178.33.21.84 - 178.33.21.87 es -178.33.21.88 - 178.33.21.95 pt -178.33.21.96 - 178.33.21.119 gb -178.33.21.120 - 178.33.21.127 pl -178.33.21.128 - 178.33.21.135 gb -178.33.21.136 - 178.33.21.139 es -178.33.21.140 - 178.33.21.143 de -178.33.21.144 - 178.33.21.151 pt -178.33.21.152 - 178.33.21.155 fr -178.33.21.156 - 178.33.21.159 es -178.33.21.160 - 178.33.21.175 fr -178.33.21.176 - 178.33.21.191 pl -178.33.21.192 - 178.33.21.255 fr -178.33.22.0 - 178.33.22.63 pl -178.33.22.64 - 178.33.22.67 fr -178.33.22.68 - 178.33.22.71 es -178.33.22.72 - 178.33.22.79 de -178.33.22.80 - 178.33.22.83 es -178.33.22.84 - 178.33.22.87 de -178.33.22.88 - 178.33.22.111 fr -178.33.22.112 - 178.33.22.127 de -178.33.22.128 - 178.33.22.131 pl -178.33.22.132 - 178.33.22.143 es -178.33.22.144 - 178.33.22.175 fr -178.33.22.176 - 178.33.22.183 es -178.33.22.184 - 178.33.22.187 fr -178.33.22.188 - 178.33.22.191 lt -178.33.22.192 - 178.33.22.195 es -178.33.22.196 - 178.33.22.199 pl -178.33.22.200 - 178.33.22.203 gb -178.33.22.204 - 178.33.22.207 nl -178.33.22.208 - 178.33.22.211 fi -178.33.22.212 - 178.33.22.215 de -178.33.22.216 - 178.33.22.219 ch -178.33.22.220 - 178.33.22.223 cz -178.33.22.224 - 178.33.22.227 fr -178.33.22.228 - 178.33.22.231 gb -178.33.22.232 - 178.33.22.235 fr -178.33.22.236 - 178.33.22.239 pl -178.33.22.240 - 178.33.22.247 it -178.33.22.248 - 178.33.22.251 gb -178.33.22.252 - 178.33.22.255 nl -178.33.23.0 - 178.33.23.127 fr -178.33.23.128 - 178.33.23.159 es -178.33.23.160 - 178.33.23.167 de -178.33.23.168 - 178.33.23.171 fr -178.33.23.172 - 178.33.23.175 es -178.33.23.176 - 178.33.23.183 pt -178.33.23.184 - 178.33.23.195 fr -178.33.23.196 - 178.33.23.199 cz -178.33.23.200 - 178.33.23.203 nl -178.33.23.204 - 178.33.23.211 fr -178.33.23.212 - 178.33.23.215 es -178.33.23.216 - 178.33.23.247 fr -178.33.23.248 - 178.33.23.251 de -178.33.23.252 - 178.33.23.255 ch -178.33.24.0 - 178.33.24.3 fr -178.33.24.4 - 178.33.24.7 es -178.33.24.8 - 178.33.24.11 fr -178.33.24.12 - 178.33.24.15 pl -178.33.24.16 - 178.33.24.23 nl -178.33.24.24 - 178.33.24.27 fr -178.33.24.28 - 178.33.24.31 pl -178.33.24.32 - 178.33.24.47 pt -178.33.24.48 - 178.33.24.51 pl -178.33.24.52 - 178.33.24.63 fr -178.33.24.64 - 178.33.24.71 es -178.33.24.72 - 178.33.24.79 it -178.33.24.80 - 178.33.24.83 de -178.33.24.84 - 178.33.24.87 fr -178.33.24.88 - 178.33.24.95 es -178.33.24.96 - 178.33.24.99 fr -178.33.24.100 - 178.33.24.103 pt -178.33.24.104 - 178.33.24.107 fr -178.33.24.108 - 178.33.24.111 ch -178.33.24.112 - 178.33.24.127 fr -178.33.24.128 - 178.33.24.191 pl -178.33.24.192 - 178.33.24.223 fr -178.33.24.224 - 178.33.24.227 ch -178.33.24.228 - 178.33.24.231 de -178.33.24.232 - 178.33.24.235 fr -178.33.24.236 - 178.33.24.239 de -178.33.24.240 - 178.33.25.15 gb -178.33.25.16 - 178.33.25.19 it -178.33.25.20 - 178.33.25.31 fr -178.33.25.32 - 178.33.25.39 gb -178.33.25.40 - 178.33.25.47 pl -178.33.25.48 - 178.33.25.63 ie -178.33.25.64 - 178.33.25.95 fr -178.33.25.96 - 178.33.25.111 es -178.33.25.112 - 178.33.25.135 fr -178.33.25.136 - 178.33.25.139 pt -178.33.25.140 - 178.33.25.143 fr -178.33.25.144 - 178.33.25.147 es -178.33.25.148 - 178.33.25.155 fr -178.33.25.156 - 178.33.25.159 de -178.33.25.160 - 178.33.25.167 fr -178.33.25.168 - 178.33.25.171 de -178.33.25.172 - 178.33.25.187 fr -178.33.25.188 - 178.33.25.191 de -178.33.25.192 - 178.33.25.203 fr -178.33.25.204 - 178.33.25.207 es -178.33.25.208 - 178.33.25.223 gb -178.33.25.224 - 178.33.26.87 fr -178.33.26.88 - 178.33.26.91 es -178.33.26.92 - 178.33.26.103 fr -178.33.26.104 - 178.33.26.107 it -178.33.26.108 - 178.33.26.111 pl -178.33.26.112 - 178.33.26.127 it -178.33.26.128 - 178.33.26.159 fr -178.33.26.160 - 178.33.26.175 pt -178.33.26.176 - 178.33.26.191 de -178.33.26.192 - 178.33.26.199 gb -178.33.26.200 - 178.33.26.207 ie -178.33.26.208 - 178.33.26.223 fr -178.33.26.224 - 178.33.26.231 es -178.33.26.232 - 178.33.26.235 ch -178.33.26.236 - 178.33.26.239 pl -178.33.26.240 - 178.33.26.255 fr -178.33.27.0 - 178.33.27.31 es -178.33.27.32 - 178.33.27.47 pl -178.33.27.48 - 178.33.27.51 de -178.33.27.52 - 178.33.27.55 pl -178.33.27.56 - 178.33.27.63 fr -178.33.27.64 - 178.33.27.67 ie -178.33.27.68 - 178.33.27.79 fr -178.33.27.80 - 178.33.27.83 ie -178.33.27.84 - 178.33.27.87 it -178.33.27.88 - 178.33.27.91 es -178.33.27.92 - 178.33.27.95 pl -178.33.27.96 - 178.33.27.111 fr -178.33.27.112 - 178.33.27.115 it -178.33.27.116 - 178.33.27.123 fr -178.33.27.124 - 178.33.27.127 de -178.33.27.128 - 178.33.27.159 fr -178.33.27.160 - 178.33.27.163 es -178.33.27.164 - 178.33.27.171 fr -178.33.27.172 - 178.33.27.179 gb -178.33.27.180 - 178.33.27.183 ie -178.33.27.184 - 178.33.27.191 es -178.33.27.192 - 178.33.27.199 fr -178.33.27.200 - 178.33.27.203 gb -178.33.27.204 - 178.33.27.207 fr -178.33.27.208 - 178.33.27.223 es -178.33.27.224 - 178.33.27.231 fr -178.33.27.232 - 178.33.27.239 pl -178.33.27.240 - 178.33.27.255 es -178.33.28.0 - 178.33.28.31 fr -178.33.28.32 - 178.33.28.35 pl -178.33.28.36 - 178.33.28.39 fr -178.33.28.40 - 178.33.28.55 pl -178.33.28.56 - 178.33.28.63 es -178.33.28.64 - 178.33.28.95 fr -178.33.28.96 - 178.33.28.127 gb -178.33.28.128 - 178.33.28.143 fr -178.33.28.144 - 178.33.28.159 es -178.33.28.160 - 178.33.28.239 fr -178.33.28.240 - 178.33.28.255 pl -178.33.29.0 - 178.33.29.63 fr -178.33.29.64 - 178.33.29.95 de -178.33.29.96 - 178.33.29.111 fr -178.33.29.112 - 178.33.29.115 ch -178.33.29.116 - 178.33.29.119 it -178.33.29.120 - 178.33.29.123 gb -178.33.29.124 - 178.33.29.127 de -178.33.29.128 - 178.33.29.159 gb -178.33.29.160 - 178.33.29.175 es -178.33.29.176 - 178.33.29.179 fr -178.33.29.180 - 178.33.29.183 es -178.33.29.184 - 178.33.29.187 be -178.33.29.188 - 178.33.29.191 gb -178.33.29.192 - 178.33.29.255 fi -178.33.30.0 - 178.33.30.7 fr -178.33.30.8 - 178.33.30.11 pl -178.33.30.12 - 178.33.30.15 fr -178.33.30.16 - 178.33.30.23 pl -178.33.30.24 - 178.33.30.63 es -178.33.30.64 - 178.33.30.127 pl -178.33.30.128 - 178.33.30.143 es -178.33.30.144 - 178.33.30.159 pl -178.33.30.160 - 178.33.30.163 de -178.33.30.164 - 178.33.30.167 pl -178.33.30.168 - 178.33.30.175 it -178.33.30.176 - 178.33.30.179 fr -178.33.30.180 - 178.33.30.191 pl -178.33.30.192 - 178.33.30.211 fr -178.33.30.212 - 178.33.30.215 de -178.33.30.216 - 178.33.30.223 fr -178.33.30.224 - 178.33.30.255 gb -178.33.31.0 - 178.33.31.255 fr +178.32.238.192 - 178.32.239.97 fr +178.32.239.98 - 178.32.239.98 it +178.32.239.99 - 178.32.245.51 fr +178.32.245.52 - 178.32.245.55 pl +178.32.245.56 - 178.32.248.63 fr +178.32.248.64 - 178.32.248.79 gb +178.32.248.80 - 178.32.249.47 fr +178.32.249.48 - 178.32.249.51 es +178.32.249.52 - 178.32.252.123 fr +178.32.252.124 - 178.32.252.127 nl +178.32.252.128 - 178.32.255.63 fr +178.32.255.64 - 178.32.255.95 de +178.32.255.96 - 178.33.0.27 fr +178.33.0.28 - 178.33.0.31 es +178.33.0.32 - 178.33.1.139 fr +178.33.1.140 - 178.33.1.143 nl +178.33.1.144 - 178.33.2.159 fr +178.33.2.160 - 178.33.2.175 nl +178.33.2.176 - 178.33.3.71 fr +178.33.3.72 - 178.33.3.75 it +178.33.3.76 - 178.33.5.191 fr +178.33.5.192 - 178.33.5.223 es +178.33.5.224 - 178.33.9.71 fr +178.33.9.72 - 178.33.9.75 pl +178.33.9.76 - 178.33.10.51 fr +178.33.10.52 - 178.33.10.55 lt +178.33.10.56 - 178.33.11.223 fr +178.33.11.224 - 178.33.11.239 de +178.33.11.240 - 178.33.22.135 fr +178.33.22.136 - 178.33.22.139 gb +178.33.22.140 - 178.33.22.235 fr +178.33.22.236 - 178.33.22.239 es +178.33.22.240 - 178.33.25.211 fr +178.33.25.212 - 178.33.25.215 it +178.33.25.216 - 178.33.27.159 fr +178.33.27.160 - 178.33.27.167 pt +178.33.27.168 - 178.33.28.95 fr +178.33.28.96 - 178.33.28.127 nl +178.33.28.128 - 178.33.31.255 fr 178.33.32.0 - 178.33.39.255 de 178.33.40.0 - 178.33.47.255 fr 178.33.48.0 - 178.33.55.255 pl -178.33.56.0 - 178.33.63.255 fr -178.33.64.0 - 178.33.64.3 gb -178.33.64.4 - 178.33.64.79 fr -178.33.64.80 - 178.33.64.83 es -178.33.64.84 - 178.33.64.87 gb -178.33.64.88 - 178.33.64.95 pl -178.33.64.96 - 178.33.64.111 fr -178.33.64.112 - 178.33.64.131 pl -178.33.64.132 - 178.33.64.135 fr -178.33.64.136 - 178.33.64.143 fi -178.33.64.144 - 178.33.64.147 de -178.33.64.148 - 178.33.64.159 fr -178.33.64.160 - 178.33.64.191 es -178.33.64.192 - 178.33.64.211 gb -178.33.64.212 - 178.33.64.215 it -178.33.64.216 - 178.33.64.219 de -178.33.64.220 - 178.33.64.223 fr -178.33.64.224 - 178.33.64.255 pt -178.33.65.0 - 178.33.65.255 fr -178.33.66.0 - 178.33.66.3 de -178.33.66.4 - 178.33.66.7 lt -178.33.66.8 - 178.33.66.15 es -178.33.66.16 - 178.33.66.23 fr -178.33.66.24 - 178.33.66.31 cz -178.33.66.32 - 178.33.66.35 pl -178.33.66.36 - 178.33.66.43 gb +178.33.56.0 - 178.33.64.223 fr +178.33.64.224 - 178.33.64.239 de +178.33.64.240 - 178.33.66.43 fr 178.33.66.44 - 178.33.66.47 es -178.33.66.48 - 178.33.66.51 gb -178.33.66.52 - 178.33.66.55 it -178.33.66.56 - 178.33.66.79 fr -178.33.66.80 - 178.33.66.95 it -178.33.66.96 - 178.33.66.127 fr -178.33.66.128 - 178.33.66.131 es -178.33.66.132 - 178.33.66.135 fr -178.33.66.136 - 178.33.66.143 es -178.33.66.144 - 178.33.66.159 fr -178.33.66.160 - 178.33.66.163 fi -178.33.66.164 - 178.33.66.167 de -178.33.66.168 - 178.33.66.171 ie -178.33.66.172 - 178.33.66.179 fr -178.33.66.180 - 178.33.66.183 fi -178.33.66.184 - 178.33.66.187 fr -178.33.66.188 - 178.33.66.191 es -178.33.66.192 - 178.33.66.195 de -178.33.66.196 - 178.33.66.199 pl -178.33.66.200 - 178.33.66.207 es -178.33.66.208 - 178.33.66.223 fr -178.33.66.224 - 178.33.66.227 lt -178.33.66.228 - 178.33.66.231 pt -178.33.66.232 - 178.33.66.235 cz -178.33.66.236 - 178.33.66.239 nl +178.33.66.48 - 178.33.66.239 fr 178.33.66.240 - 178.33.66.255 de -178.33.67.0 - 178.33.67.3 es -178.33.67.4 - 178.33.67.7 it -178.33.67.8 - 178.33.67.11 cz -178.33.67.12 - 178.33.67.15 fr -178.33.67.16 - 178.33.67.19 it -178.33.67.20 - 178.33.67.31 gb -178.33.67.32 - 178.33.67.63 fr -178.33.67.64 - 178.33.67.71 ch -178.33.67.72 - 178.33.67.75 es -178.33.67.76 - 178.33.67.79 de -178.33.67.80 - 178.33.67.95 gb -178.33.67.96 - 178.33.67.127 ie -178.33.67.128 - 178.33.67.159 fi -178.33.67.160 - 178.33.67.191 fr -178.33.67.192 - 178.33.67.195 cz -178.33.67.196 - 178.33.67.199 it -178.33.67.200 - 178.33.67.207 fr -178.33.67.208 - 178.33.67.255 pl -178.33.68.0 - 178.33.68.31 ie -178.33.68.32 - 178.33.68.47 fr -178.33.68.48 - 178.33.68.59 pl -178.33.68.60 - 178.33.68.63 es -178.33.68.64 - 178.33.68.83 gb -178.33.68.84 - 178.33.68.87 ie -178.33.68.88 - 178.33.68.91 de -178.33.68.92 - 178.33.68.95 fr -178.33.68.96 - 178.33.68.127 de -178.33.68.128 - 178.33.68.191 fr -178.33.68.192 - 178.33.68.207 gb -178.33.68.208 - 178.33.68.255 fr -178.33.69.0 - 178.33.69.255 gb -178.33.70.0 - 178.33.71.255 pl -178.33.72.0 - 178.33.72.15 fr -178.33.72.16 - 178.33.72.79 pl -178.33.72.80 - 178.33.72.87 gb -178.33.72.88 - 178.33.72.91 fr -178.33.72.92 - 178.33.72.95 de -178.33.72.96 - 178.33.72.127 fr -178.33.72.128 - 178.33.72.255 pl -178.33.73.0 - 178.33.73.15 fr -178.33.73.16 - 178.33.73.23 es -178.33.73.24 - 178.33.73.27 it -178.33.73.28 - 178.33.73.31 de -178.33.73.32 - 178.33.73.63 fr -178.33.73.64 - 178.33.73.127 fi -178.33.73.128 - 178.33.73.255 es -178.33.74.0 - 178.33.74.63 pt -178.33.74.64 - 178.33.74.95 be -178.33.74.96 - 178.33.74.159 es -178.33.74.160 - 178.33.75.87 pl -178.33.75.88 - 178.33.75.91 be -178.33.75.92 - 178.33.75.95 es -178.33.75.96 - 178.33.75.99 nl -178.33.75.100 - 178.33.75.103 fr -178.33.75.104 - 178.33.75.107 ch -178.33.75.108 - 178.33.75.111 be -178.33.75.112 - 178.33.75.115 gb -178.33.75.116 - 178.33.75.119 de -178.33.75.120 - 178.33.75.127 es -178.33.75.128 - 178.33.75.207 fr -178.33.75.208 - 178.33.75.223 it -178.33.75.224 - 178.33.75.243 fr -178.33.75.244 - 178.33.75.247 es -178.33.75.248 - 178.33.75.255 de -178.33.76.0 - 178.33.76.15 fr -178.33.76.16 - 178.33.76.23 de -178.33.76.24 - 178.33.76.63 fr -178.33.76.64 - 178.33.76.71 pl -178.33.76.72 - 178.33.76.79 fr -178.33.76.80 - 178.33.76.87 ie -178.33.76.88 - 178.33.76.91 es -178.33.76.92 - 178.33.76.95 fr -178.33.76.96 - 178.33.76.111 es -178.33.76.112 - 178.33.76.119 fr -178.33.76.120 - 178.33.76.123 es -178.33.76.124 - 178.33.76.127 gb -178.33.76.128 - 178.33.76.135 fr -178.33.76.136 - 178.33.76.143 de -178.33.76.144 - 178.33.76.159 pl -178.33.76.160 - 178.33.76.191 gb -178.33.76.192 - 178.33.76.255 fr -178.33.77.0 - 178.33.77.15 pl -178.33.77.16 - 178.33.77.19 gb -178.33.77.20 - 178.33.77.23 fr -178.33.77.24 - 178.33.77.27 de -178.33.77.28 - 178.33.77.31 pl -178.33.77.32 - 178.33.77.63 fr -178.33.77.64 - 178.33.77.79 gb -178.33.77.80 - 178.33.77.87 de -178.33.77.88 - 178.33.77.95 pl -178.33.77.96 - 178.33.77.103 de -178.33.77.104 - 178.33.77.107 fr -178.33.77.108 - 178.33.77.111 it -178.33.77.112 - 178.33.77.127 fr -178.33.77.128 - 178.33.77.143 pl -178.33.77.144 - 178.33.77.147 de -178.33.77.148 - 178.33.77.155 es -178.33.77.156 - 178.33.77.207 fr -178.33.77.208 - 178.33.77.223 be -178.33.77.224 - 178.33.77.239 fr -178.33.77.240 - 178.33.77.247 gb -178.33.77.248 - 178.33.77.251 ie -178.33.77.252 - 178.33.77.255 lt -178.33.78.0 - 178.33.78.23 fr -178.33.78.24 - 178.33.78.63 pl -178.33.78.64 - 178.33.78.67 de -178.33.78.68 - 178.33.78.71 es -178.33.78.72 - 178.33.78.75 pt -178.33.78.76 - 178.33.78.79 pl -178.33.78.80 - 178.33.78.83 it -178.33.78.84 - 178.33.78.87 es -178.33.78.88 - 178.33.78.91 de -178.33.78.92 - 178.33.78.95 fr -178.33.78.96 - 178.33.78.103 nl -178.33.78.104 - 178.33.78.107 de -178.33.78.108 - 178.33.78.255 fr -178.33.79.0 - 178.33.79.31 de -178.33.79.32 - 178.33.79.39 pl -178.33.79.40 - 178.33.79.47 de -178.33.79.48 - 178.33.79.51 fr -178.33.79.52 - 178.33.79.55 pl -178.33.79.56 - 178.33.79.63 es -178.33.79.64 - 178.33.79.71 fr -178.33.79.72 - 178.33.79.79 it -178.33.79.80 - 178.33.79.91 pl -178.33.79.92 - 178.33.79.95 pt -178.33.79.96 - 178.33.79.99 lt -178.33.79.100 - 178.33.79.103 ie -178.33.79.104 - 178.33.79.115 fr -178.33.79.116 - 178.33.79.119 es -178.33.79.120 - 178.33.79.127 fr -178.33.79.128 - 178.33.79.143 gb -178.33.79.144 - 178.33.79.163 fr -178.33.79.164 - 178.33.79.167 pl -178.33.79.168 - 178.33.79.171 de -178.33.79.172 - 178.33.79.175 fr -178.33.79.176 - 178.33.79.191 gb -178.33.79.192 - 178.33.79.223 pl -178.33.79.224 - 178.33.79.231 gb -178.33.79.232 - 178.33.79.235 ie -178.33.79.236 - 178.33.79.239 de -178.33.79.240 - 178.33.79.243 nl -178.33.79.244 - 178.33.79.247 fr -178.33.79.248 - 178.33.79.251 de -178.33.79.252 - 178.33.79.255 pt -178.33.80.0 - 178.33.80.3 es -178.33.80.4 - 178.33.80.7 pl -178.33.80.8 - 178.33.80.15 es -178.33.80.16 - 178.33.80.51 fr -178.33.80.52 - 178.33.80.55 ie -178.33.80.56 - 178.33.80.59 es -178.33.80.60 - 178.33.80.63 de -178.33.80.64 - 178.33.80.67 es -178.33.80.68 - 178.33.80.79 fr -178.33.80.80 - 178.33.80.95 gb -178.33.80.96 - 178.33.80.131 fr -178.33.80.132 - 178.33.80.135 es -178.33.80.136 - 178.33.80.139 de -178.33.80.140 - 178.33.80.143 pl -178.33.80.144 - 178.33.80.159 es -178.33.80.160 - 178.33.80.207 fr -178.33.80.208 - 178.33.80.211 es -178.33.80.212 - 178.33.80.215 de +178.33.67.0 - 178.33.72.11 fr +178.33.72.12 - 178.33.72.15 it +178.33.72.16 - 178.33.73.63 fr +178.33.73.64 - 178.33.73.127 gb +178.33.73.128 - 178.33.75.79 fr +178.33.75.80 - 178.33.75.87 es +178.33.75.88 - 178.33.79.87 fr +178.33.79.88 - 178.33.79.95 nl +178.33.79.96 - 178.33.79.167 fr +178.33.79.168 - 178.33.79.171 nl +178.33.79.172 - 178.33.80.107 fr +178.33.80.108 - 178.33.80.111 es +178.33.80.112 - 178.33.80.215 fr 178.33.80.216 - 178.33.80.223 es -178.33.80.224 - 178.33.80.227 pl -178.33.80.228 - 178.33.80.231 nl -178.33.80.232 - 178.33.80.235 lt -178.33.80.236 - 178.33.80.239 gb -178.33.80.240 - 178.33.80.255 fr -178.33.81.0 - 178.33.81.31 pt -178.33.81.32 - 178.33.81.63 es -178.33.81.64 - 178.33.81.95 de -178.33.81.96 - 178.33.81.111 pl -178.33.81.112 - 178.33.81.127 fr -178.33.81.128 - 178.33.81.135 it -178.33.81.136 - 178.33.81.139 es -178.33.81.140 - 178.33.81.143 pl -178.33.81.144 - 178.33.81.191 ie -178.33.81.192 - 178.33.81.199 gb -178.33.81.200 - 178.33.81.203 nl -178.33.81.204 - 178.33.81.207 be -178.33.81.208 - 178.33.81.223 es -178.33.81.224 - 178.33.81.255 fr -178.33.82.0 - 178.33.82.31 gb -178.33.82.32 - 178.33.82.51 es -178.33.82.52 - 178.33.82.55 it -178.33.82.56 - 178.33.82.59 pl -178.33.82.60 - 178.33.82.63 fr -178.33.82.64 - 178.33.82.79 ie -178.33.82.80 - 178.33.82.87 fr -178.33.82.88 - 178.33.82.91 ie -178.33.82.92 - 178.33.82.95 de -178.33.82.96 - 178.33.82.99 fr -178.33.82.100 - 178.33.82.103 ie -178.33.82.104 - 178.33.82.107 gb -178.33.82.108 - 178.33.82.111 fr -178.33.82.112 - 178.33.82.135 gb -178.33.82.136 - 178.33.82.139 pl -178.33.82.140 - 178.33.82.143 fr -178.33.82.144 - 178.33.82.159 ie -178.33.82.160 - 178.33.82.175 gb -178.33.82.176 - 178.33.82.223 fr -178.33.82.224 - 178.33.82.255 de -178.33.83.0 - 178.33.83.15 gb -178.33.83.16 - 178.33.83.31 fr -178.33.83.32 - 178.33.83.39 gb -178.33.83.40 - 178.33.83.47 nl -178.33.83.48 - 178.33.83.51 pl -178.33.83.52 - 178.33.83.55 fr -178.33.83.56 - 178.33.83.63 gb -178.33.83.64 - 178.33.83.67 de -178.33.83.68 - 178.33.83.71 it -178.33.83.72 - 178.33.83.75 gb -178.33.83.76 - 178.33.83.79 es -178.33.83.80 - 178.33.83.83 de -178.33.83.84 - 178.33.83.87 gb -178.33.83.88 - 178.33.83.91 es -178.33.83.92 - 178.33.83.95 de -178.33.83.96 - 178.33.83.99 nl -178.33.83.100 - 178.33.83.103 es -178.33.83.104 - 178.33.83.111 fr -178.33.83.112 - 178.33.83.127 it -178.33.83.128 - 178.33.83.255 fr -178.33.84.0 - 178.33.84.3 be -178.33.84.4 - 178.33.84.7 pl -178.33.84.8 - 178.33.84.31 fr -178.33.84.32 - 178.33.84.63 de -178.33.84.64 - 178.33.84.95 ie -178.33.84.96 - 178.33.84.115 fr -178.33.84.116 - 178.33.84.119 pl -178.33.84.120 - 178.33.84.123 gb -178.33.84.124 - 178.33.84.127 fr -178.33.84.128 - 178.33.84.131 de -178.33.84.132 - 178.33.84.143 fr -178.33.84.144 - 178.33.84.147 es -178.33.84.148 - 178.33.84.151 fr -178.33.84.152 - 178.33.84.155 pl -178.33.84.156 - 178.33.84.159 gb -178.33.84.160 - 178.33.84.223 fr -178.33.84.224 - 178.33.84.227 de -178.33.84.228 - 178.33.84.231 fr -178.33.84.232 - 178.33.84.239 gb -178.33.84.240 - 178.33.84.255 es -178.33.85.0 - 178.33.85.15 fr -178.33.85.16 - 178.33.85.23 pl -178.33.85.24 - 178.33.85.27 ch -178.33.85.28 - 178.33.85.31 gb -178.33.85.32 - 178.33.85.63 fr -178.33.85.64 - 178.33.85.99 fi -178.33.85.100 - 178.33.85.103 be -178.33.85.104 - 178.33.85.111 fr -178.33.85.112 - 178.33.85.127 fi -178.33.85.128 - 178.33.85.135 pl -178.33.85.136 - 178.33.85.151 fr -178.33.85.152 - 178.33.85.155 pl -178.33.85.156 - 178.33.85.159 pt -178.33.85.160 - 178.33.85.223 fr -178.33.85.224 - 178.33.85.255 nl -178.33.86.0 - 178.33.86.7 it -178.33.86.8 - 178.33.86.11 gb -178.33.86.12 - 178.33.86.15 de -178.33.86.16 - 178.33.86.19 ie -178.33.86.20 - 178.33.86.23 pt -178.33.86.24 - 178.33.86.27 es -178.33.86.28 - 178.33.86.47 fr -178.33.86.48 - 178.33.86.55 pl -178.33.86.56 - 178.33.86.95 fr -178.33.86.96 - 178.33.86.99 gb -178.33.86.100 - 178.33.86.111 pl -178.33.86.112 - 178.33.86.127 es -178.33.86.128 - 178.33.86.143 lt -178.33.86.144 - 178.33.86.159 it -178.33.86.160 - 178.33.86.163 pl -178.33.86.164 - 178.33.86.167 fr -178.33.86.168 - 178.33.86.171 es -178.33.86.172 - 178.33.86.179 de -178.33.86.180 - 178.33.86.187 gb -178.33.86.188 - 178.33.86.191 de -178.33.86.192 - 178.33.86.199 pl +178.33.80.224 - 178.33.81.15 fr +178.33.81.16 - 178.33.81.19 es +178.33.81.20 - 178.33.84.59 fr +178.33.84.60 - 178.33.84.63 cz +178.33.84.64 - 178.33.86.199 fr 178.33.86.200 - 178.33.86.207 gb -178.33.86.208 - 178.33.86.223 it +178.33.86.208 - 178.33.86.223 fr 178.33.86.224 - 178.33.86.231 gb -178.33.86.232 - 178.33.86.235 de -178.33.86.236 - 178.33.86.239 fr -178.33.86.240 - 178.33.86.255 pl -178.33.87.0 - 178.33.87.3 it -178.33.87.4 - 178.33.87.7 nl -178.33.87.8 - 178.33.87.11 pt -178.33.87.12 - 178.33.87.15 ch -178.33.87.16 - 178.33.87.23 de -178.33.87.24 - 178.33.87.31 fr -178.33.87.32 - 178.33.87.47 pl -178.33.87.48 - 178.33.87.127 fr -178.33.87.128 - 178.33.87.159 fi -178.33.87.160 - 178.33.87.175 fr -178.33.87.176 - 178.33.87.183 es -178.33.87.184 - 178.33.87.187 fr -178.33.87.188 - 178.33.87.191 gb -178.33.87.192 - 178.33.87.199 it -178.33.87.200 - 178.33.87.223 fr -178.33.87.224 - 178.33.87.239 lt -178.33.87.240 - 178.33.87.255 fr -178.33.88.0 - 178.33.88.15 pl -178.33.88.16 - 178.33.88.39 fr -178.33.88.40 - 178.33.88.43 de -178.33.88.44 - 178.33.88.95 fr -178.33.88.96 - 178.33.88.103 pl -178.33.88.104 - 178.33.88.107 fr -178.33.88.108 - 178.33.88.111 de -178.33.88.112 - 178.33.88.119 es -178.33.88.120 - 178.33.88.123 fr -178.33.88.124 - 178.33.88.127 pl -178.33.88.128 - 178.33.88.135 es -178.33.88.136 - 178.33.88.143 de -178.33.88.144 - 178.33.88.159 fr -178.33.88.160 - 178.33.88.191 es -178.33.88.192 - 178.33.88.223 fr -178.33.88.224 - 178.33.88.227 de -178.33.88.228 - 178.33.88.231 pl -178.33.88.232 - 178.33.88.235 gb -178.33.88.236 - 178.33.88.239 fi -178.33.88.240 - 178.33.88.255 be -178.33.89.0 - 178.33.89.15 gb -178.33.89.16 - 178.33.89.19 ch -178.33.89.20 - 178.33.89.23 gb -178.33.89.24 - 178.33.89.27 es -178.33.89.28 - 178.33.89.31 pt -178.33.89.32 - 178.33.89.35 gb -178.33.89.36 - 178.33.89.39 pl -178.33.89.40 - 178.33.89.47 gb -178.33.89.48 - 178.33.89.63 nl -178.33.89.64 - 178.33.89.79 gb -178.33.89.80 - 178.33.89.83 fr -178.33.89.84 - 178.33.89.87 gb -178.33.89.88 - 178.33.89.111 fr -178.33.89.112 - 178.33.89.115 ch -178.33.89.116 - 178.33.89.123 de -178.33.89.124 - 178.33.89.127 fr -178.33.89.128 - 178.33.89.143 gb -178.33.89.144 - 178.33.89.159 ie -178.33.89.160 - 178.33.89.175 fr -178.33.89.176 - 178.33.89.179 de -178.33.89.180 - 178.33.90.15 fr -178.33.90.16 - 178.33.90.31 nl -178.33.90.32 - 178.33.90.63 pl -178.33.90.64 - 178.33.90.95 fr -178.33.90.96 - 178.33.90.127 ie -178.33.90.128 - 178.33.90.131 de -178.33.90.132 - 178.33.90.135 pl -178.33.90.136 - 178.33.90.147 fr -178.33.90.148 - 178.33.90.151 gb -178.33.90.152 - 178.33.90.191 fr -178.33.90.192 - 178.33.90.195 es -178.33.90.196 - 178.33.90.203 fr -178.33.90.204 - 178.33.90.207 ch -178.33.90.208 - 178.33.90.215 fr -178.33.90.216 - 178.33.90.219 pt -178.33.90.220 - 178.33.90.223 gb -178.33.90.224 - 178.33.90.227 es -178.33.90.228 - 178.33.90.231 pl -178.33.90.232 - 178.33.90.235 lt -178.33.90.236 - 178.33.90.239 cz -178.33.90.240 - 178.33.90.247 pl -178.33.90.248 - 178.33.90.255 es -178.33.91.0 - 178.33.91.255 de -178.33.92.0 - 178.33.92.7 it -178.33.92.8 - 178.33.92.15 pl -178.33.92.16 - 178.33.92.47 fr -178.33.92.48 - 178.33.92.51 ie -178.33.92.52 - 178.33.92.55 nl -178.33.92.56 - 178.33.92.63 pl -178.33.92.64 - 178.33.92.159 fr -178.33.92.160 - 178.33.92.163 de -178.33.92.164 - 178.33.92.167 es -178.33.92.168 - 178.33.92.175 pt -178.33.92.176 - 178.33.92.179 pl -178.33.92.180 - 178.33.92.183 fr -178.33.92.184 - 178.33.92.191 it -178.33.92.192 - 178.33.92.199 pl -178.33.92.200 - 178.33.92.207 de -178.33.92.208 - 178.33.92.239 fr -178.33.92.240 - 178.33.92.255 fi -178.33.93.0 - 178.33.93.31 fr -178.33.93.32 - 178.33.93.63 pl -178.33.93.64 - 178.33.93.71 de -178.33.93.72 - 178.33.93.75 nl -178.33.93.76 - 178.33.93.79 ie -178.33.93.80 - 178.33.93.83 es -178.33.93.84 - 178.33.93.87 fr -178.33.93.88 - 178.33.93.91 pl -178.33.93.92 - 178.33.93.95 gb -178.33.93.96 - 178.33.93.103 fr -178.33.93.104 - 178.33.93.107 gb -178.33.93.108 - 178.33.93.111 pl -178.33.93.112 - 178.33.93.127 fr -178.33.93.128 - 178.33.93.131 de -178.33.93.132 - 178.33.93.135 gb -178.33.93.136 - 178.33.93.139 fr -178.33.93.140 - 178.33.93.143 pl -178.33.93.144 - 178.33.93.159 fr -178.33.93.160 - 178.33.93.163 de -178.33.93.164 - 178.33.93.207 fr -178.33.93.208 - 178.33.93.227 pl -178.33.93.228 - 178.33.93.231 be -178.33.93.232 - 178.33.93.239 gb -178.33.93.240 - 178.33.93.243 es -178.33.93.244 - 178.33.93.247 ie -178.33.93.248 - 178.33.93.255 fr -178.33.94.0 - 178.33.94.47 es -178.33.94.48 - 178.33.94.59 pl -178.33.94.60 - 178.33.94.71 gb -178.33.94.72 - 178.33.94.79 es -178.33.94.80 - 178.33.94.87 pt -178.33.94.88 - 178.33.94.91 fr -178.33.94.92 - 178.33.94.95 pl -178.33.94.96 - 178.33.94.111 ie -178.33.94.112 - 178.33.94.119 fr -178.33.94.120 - 178.33.94.123 pt -178.33.94.124 - 178.33.94.127 gb -178.33.94.128 - 178.33.94.143 ie -178.33.94.144 - 178.33.94.151 ch -178.33.94.152 - 178.33.94.155 pl -178.33.94.156 - 178.33.94.159 ie -178.33.94.160 - 178.33.94.191 fr -178.33.94.192 - 178.33.94.199 pl -178.33.94.200 - 178.33.94.203 de -178.33.94.204 - 178.33.94.227 pl -178.33.94.228 - 178.33.94.251 fr -178.33.94.252 - 178.33.94.255 gb -178.33.95.0 - 178.33.111.255 fr +178.33.86.232 - 178.33.86.235 es +178.33.86.236 - 178.33.89.167 fr +178.33.89.168 - 178.33.89.171 nl +178.33.89.172 - 178.33.94.75 fr +178.33.94.76 - 178.33.94.79 pt +178.33.94.80 - 178.33.111.255 fr 178.33.112.0 - 178.33.119.255 es -178.33.120.0 - 178.33.128.31 fr -178.33.128.32 - 178.33.128.63 gb -178.33.128.64 - 178.33.128.67 es -178.33.128.68 - 178.33.128.71 it -178.33.128.72 - 178.33.128.79 fr -178.33.128.80 - 178.33.128.99 pl -178.33.128.100 - 178.33.128.103 cz -178.33.128.104 - 178.33.128.107 es -178.33.128.108 - 178.33.128.111 de -178.33.128.112 - 178.33.128.115 fr -178.33.128.116 - 178.33.128.119 gb -178.33.128.120 - 178.33.128.123 pl -178.33.128.124 - 178.33.128.127 es -178.33.128.128 - 178.33.129.47 fr -178.33.129.48 - 178.33.129.51 gb -178.33.129.52 - 178.33.129.55 de -178.33.129.56 - 178.33.129.59 fr -178.33.129.60 - 178.33.129.63 gb -178.33.129.64 - 178.33.129.95 be -178.33.129.96 - 178.33.129.111 pl -178.33.129.112 - 178.33.129.115 de -178.33.129.116 - 178.33.129.119 pl -178.33.129.120 - 178.33.129.127 fr -178.33.129.128 - 178.33.129.143 be -178.33.129.144 - 178.33.129.203 fr -178.33.129.204 - 178.33.129.207 pl -178.33.129.208 - 178.33.129.215 fr -178.33.129.216 - 178.33.129.219 gb -178.33.129.220 - 178.33.129.255 fr -178.33.130.0 - 178.33.130.3 cz -178.33.130.4 - 178.33.130.11 gb -178.33.130.12 - 178.33.130.15 nl -178.33.130.16 - 178.33.130.19 fr -178.33.130.20 - 178.33.130.23 de -178.33.130.24 - 178.33.130.31 pl -178.33.130.32 - 178.33.130.35 it -178.33.130.36 - 178.33.130.39 fr -178.33.130.40 - 178.33.130.43 de -178.33.130.44 - 178.33.130.47 es -178.33.130.48 - 178.33.130.55 pl -178.33.130.56 - 178.33.130.63 es -178.33.130.64 - 178.33.130.67 fr -178.33.130.68 - 178.33.130.71 de -178.33.130.72 - 178.33.130.75 es -178.33.130.76 - 178.33.130.87 fr -178.33.130.88 - 178.33.130.91 de -178.33.130.92 - 178.33.130.95 es -178.33.130.96 - 178.33.130.127 fr -178.33.130.128 - 178.33.130.191 pl -178.33.130.192 - 178.33.130.207 fr -178.33.130.208 - 178.33.130.215 gb -178.33.130.216 - 178.33.130.219 de -178.33.130.220 - 178.33.130.223 pt -178.33.130.224 - 178.33.130.231 pl -178.33.130.232 - 178.33.130.235 fr -178.33.130.236 - 178.33.130.251 pl -178.33.130.252 - 178.33.130.255 it -178.33.131.0 - 178.33.131.11 pl -178.33.131.12 - 178.33.131.35 fr -178.33.131.36 - 178.33.131.39 de -178.33.131.40 - 178.33.131.43 fr -178.33.131.44 - 178.33.131.47 pl -178.33.131.48 - 178.33.131.63 de -178.33.131.64 - 178.33.131.79 es -178.33.131.80 - 178.33.131.87 pl -178.33.131.88 - 178.33.131.91 es -178.33.131.92 - 178.33.131.95 de -178.33.131.96 - 178.33.131.103 pl -178.33.131.104 - 178.33.131.111 be -178.33.131.112 - 178.33.131.115 es -178.33.131.116 - 178.33.131.123 fr -178.33.131.124 - 178.33.131.127 gb -178.33.131.128 - 178.33.131.159 fr -178.33.131.160 - 178.33.131.167 pl -178.33.131.168 - 178.33.131.175 gb -178.33.131.176 - 178.33.131.179 fr -178.33.131.180 - 178.33.131.183 de -178.33.131.184 - 178.33.131.191 it -178.33.131.192 - 178.33.132.3 fr -178.33.132.4 - 178.33.132.7 de -178.33.132.8 - 178.33.132.15 fr -178.33.132.16 - 178.33.132.31 es -178.33.132.32 - 178.33.132.47 fr -178.33.132.48 - 178.33.132.63 gb -178.33.132.64 - 178.33.132.127 es -178.33.132.128 - 178.33.132.159 fr -178.33.132.160 - 178.33.132.175 be -178.33.132.176 - 178.33.132.183 es -178.33.132.184 - 178.33.132.191 de -178.33.132.192 - 178.33.132.203 fr -178.33.132.204 - 178.33.132.207 de -178.33.132.208 - 178.33.132.215 gb -178.33.132.216 - 178.33.133.31 fr -178.33.133.32 - 178.33.133.47 pt -178.33.133.48 - 178.33.133.51 de -178.33.133.52 - 178.33.133.59 fr -178.33.133.60 - 178.33.133.63 gb -178.33.133.64 - 178.33.133.79 fr -178.33.133.80 - 178.33.133.95 it -178.33.133.96 - 178.33.133.127 nl -178.33.133.128 - 178.33.133.131 de -178.33.133.132 - 178.33.133.135 ch -178.33.133.136 - 178.33.133.143 de -178.33.133.144 - 178.33.133.151 pl -178.33.133.152 - 178.33.133.159 fr -178.33.133.160 - 178.33.133.163 gb -178.33.133.164 - 178.33.133.167 it -178.33.133.168 - 178.33.133.175 ie -178.33.133.176 - 178.33.133.183 es -178.33.133.184 - 178.33.133.187 pl -178.33.133.188 - 178.33.133.191 gb -178.33.133.192 - 178.33.133.207 be -178.33.133.208 - 178.33.133.223 ch -178.33.133.224 - 178.33.133.239 be -178.33.133.240 - 178.33.133.255 de -178.33.134.0 - 178.33.134.3 it -178.33.134.4 - 178.33.134.23 fr -178.33.134.24 - 178.33.134.27 es -178.33.134.28 - 178.33.134.63 fr -178.33.134.64 - 178.33.134.79 ch -178.33.134.80 - 178.33.134.99 fr -178.33.134.100 - 178.33.134.103 pt -178.33.134.104 - 178.33.134.107 fr -178.33.134.108 - 178.33.134.111 es -178.33.134.112 - 178.33.134.127 fr -178.33.134.128 - 178.33.134.147 es -178.33.134.148 - 178.33.134.163 fr -178.33.134.164 - 178.33.134.167 nl -178.33.134.168 - 178.33.134.171 gb -178.33.134.172 - 178.33.134.175 it -178.33.134.176 - 178.33.134.179 be -178.33.134.180 - 178.33.134.183 ch -178.33.134.184 - 178.33.134.215 fr -178.33.134.216 - 178.33.134.219 es -178.33.134.220 - 178.33.134.223 pl -178.33.134.224 - 178.33.134.239 fr -178.33.134.240 - 178.33.134.243 be -178.33.134.244 - 178.33.134.247 de -178.33.134.248 - 178.33.134.251 es -178.33.134.252 - 178.33.134.255 it -178.33.135.0 - 178.33.135.31 pl -178.33.135.32 - 178.33.135.35 nl -178.33.135.36 - 178.33.135.39 fr -178.33.135.40 - 178.33.135.43 gb -178.33.135.44 - 178.33.135.47 fr -178.33.135.48 - 178.33.135.51 de -178.33.135.52 - 178.33.135.55 es -178.33.135.56 - 178.33.135.63 fr -178.33.135.64 - 178.33.135.67 be -178.33.135.68 - 178.33.135.71 de -178.33.135.72 - 178.33.135.79 pl -178.33.135.80 - 178.33.135.83 ch -178.33.135.84 - 178.33.135.87 fr -178.33.135.88 - 178.33.135.91 nl -178.33.135.92 - 178.33.135.95 fr -178.33.135.96 - 178.33.135.111 es -178.33.135.112 - 178.33.135.119 fr -178.33.135.120 - 178.33.135.123 es -178.33.135.124 - 178.33.135.127 cz -178.33.135.128 - 178.33.135.159 fr -178.33.135.160 - 178.33.135.171 pl -178.33.135.172 - 178.33.135.191 fr -178.33.135.192 - 178.33.135.199 de -178.33.135.200 - 178.33.135.203 pl -178.33.135.204 - 178.33.135.207 be -178.33.135.208 - 178.33.135.211 cz -178.33.135.212 - 178.33.135.215 gb -178.33.135.216 - 178.33.135.239 pl -178.33.135.240 - 178.33.135.243 fr -178.33.135.244 - 178.33.135.247 fi -178.33.135.248 - 178.33.135.251 fr -178.33.135.252 - 178.33.135.255 es -178.33.136.0 - 178.33.136.3 gb +178.33.120.0 - 178.33.128.67 fr +178.33.128.68 - 178.33.128.71 es +178.33.128.72 - 178.33.129.39 fr +178.33.129.40 - 178.33.129.47 be +178.33.129.48 - 178.33.129.111 fr +178.33.129.112 - 178.33.129.115 es +178.33.129.116 - 178.33.130.87 fr +178.33.130.88 - 178.33.130.91 nl +178.33.130.92 - 178.33.130.147 fr +178.33.130.148 - 178.33.130.151 cz +178.33.130.152 - 178.33.136.3 fr 178.33.136.4 - 178.33.136.7 de -178.33.136.8 - 178.33.136.11 ch -178.33.136.12 - 178.33.136.15 de -178.33.136.16 - 178.33.136.47 fr -178.33.136.48 - 178.33.136.51 pl -178.33.136.52 - 178.33.136.55 de -178.33.136.56 - 178.33.136.59 fi -178.33.136.60 - 178.33.136.63 ch -178.33.136.64 - 178.33.136.67 gb -178.33.136.68 - 178.33.136.71 fr -178.33.136.72 - 178.33.136.75 nl -178.33.136.76 - 178.33.136.79 pl -178.33.136.80 - 178.33.136.95 fr -178.33.136.96 - 178.33.136.103 pl -178.33.136.104 - 178.33.136.111 fr -178.33.136.112 - 178.33.136.115 gb -178.33.136.116 - 178.33.136.119 es -178.33.136.120 - 178.33.137.47 fr -178.33.137.48 - 178.33.137.63 it -178.33.137.64 - 178.33.137.127 es -178.33.137.128 - 178.33.137.159 de -178.33.137.160 - 178.33.137.191 cz -178.33.137.192 - 178.33.137.195 fi -178.33.137.196 - 178.33.137.199 fr -178.33.137.200 - 178.33.137.203 lt -178.33.137.204 - 178.33.137.207 pl -178.33.137.208 - 178.33.137.223 fr -178.33.137.224 - 178.33.137.231 pl -178.33.137.232 - 178.33.137.235 es -178.33.137.236 - 178.33.137.239 fr -178.33.137.240 - 178.33.137.247 pl -178.33.137.248 - 178.33.137.251 fr -178.33.137.252 - 178.33.138.31 es -178.33.138.32 - 178.33.138.63 fr -178.33.138.64 - 178.33.138.71 de -178.33.138.72 - 178.33.138.75 nl -178.33.138.76 - 178.33.138.79 lt -178.33.138.80 - 178.33.138.87 de -178.33.138.88 - 178.33.138.95 es -178.33.138.96 - 178.33.138.127 fr -178.33.138.128 - 178.33.138.131 pt -178.33.138.132 - 178.33.138.135 fi -178.33.138.136 - 178.33.138.139 gb -178.33.138.140 - 178.33.138.147 fr -178.33.138.148 - 178.33.138.163 de -178.33.138.164 - 178.33.138.167 fr -178.33.138.168 - 178.33.138.171 cz -178.33.138.172 - 178.33.138.175 gb -178.33.138.176 - 178.33.138.187 fr -178.33.138.188 - 178.33.138.191 pl -178.33.138.192 - 178.33.138.255 be -178.33.139.0 - 178.33.139.63 ch -178.33.139.64 - 178.33.139.127 cz -178.33.139.128 - 178.33.139.199 de -178.33.139.200 - 178.33.139.203 pl -178.33.139.204 - 178.33.139.215 fr -178.33.139.216 - 178.33.139.219 it -178.33.139.220 - 178.33.139.223 pl -178.33.139.224 - 178.33.139.239 de -178.33.139.240 - 178.33.139.243 fr -178.33.139.244 - 178.33.139.247 ch -178.33.139.248 - 178.33.139.255 de -178.33.140.0 - 178.33.140.31 fr -178.33.140.32 - 178.33.140.35 pl -178.33.140.36 - 178.33.140.39 lt -178.33.140.40 - 178.33.140.47 ch -178.33.140.48 - 178.33.140.63 de -178.33.140.64 - 178.33.140.71 gb -178.33.140.72 - 178.33.140.91 fr -178.33.140.92 - 178.33.140.95 pl -178.33.140.96 - 178.33.140.127 fr -178.33.140.128 - 178.33.140.207 gb -178.33.140.208 - 178.33.140.215 ch -178.33.140.216 - 178.33.140.219 pl -178.33.140.220 - 178.33.140.227 gb -178.33.140.228 - 178.33.140.231 fr -178.33.140.232 - 178.33.140.235 pl -178.33.140.236 - 178.33.140.239 gb -178.33.140.240 - 178.33.140.255 fr -178.33.141.0 - 178.33.141.3 it -178.33.141.4 - 178.33.141.11 fr -178.33.141.12 - 178.33.141.15 it -178.33.141.16 - 178.33.141.19 fr -178.33.141.20 - 178.33.141.23 es -178.33.141.24 - 178.33.141.31 pl -178.33.141.32 - 178.33.141.47 es -178.33.141.48 - 178.33.141.63 de -178.33.141.64 - 178.33.141.67 es -178.33.141.68 - 178.33.141.71 fr -178.33.141.72 - 178.33.141.75 es -178.33.141.76 - 178.33.141.79 pl -178.33.141.80 - 178.33.141.83 fr -178.33.141.84 - 178.33.141.87 ie -178.33.141.88 - 178.33.141.91 fi -178.33.141.92 - 178.33.141.95 pl -178.33.141.96 - 178.33.141.147 fr -178.33.141.148 - 178.33.141.151 pl -178.33.141.152 - 178.33.141.167 de -178.33.141.168 - 178.33.141.171 gb -178.33.141.172 - 178.33.141.175 nl -178.33.141.176 - 178.33.141.179 pl -178.33.141.180 - 178.33.141.183 fr -178.33.141.184 - 178.33.141.187 es -178.33.141.188 - 178.33.141.191 pl -178.33.141.192 - 178.33.141.199 de -178.33.141.200 - 178.33.141.207 gb -178.33.141.208 - 178.33.141.215 fr -178.33.141.216 - 178.33.141.219 be -178.33.141.220 - 178.33.141.223 pl -178.33.141.224 - 178.33.141.231 fr -178.33.141.232 - 178.33.141.239 it -178.33.141.240 - 178.33.141.255 fr -178.33.142.0 - 178.33.142.15 be -178.33.142.16 - 178.33.142.39 fr -178.33.142.40 - 178.33.142.47 gb -178.33.142.48 - 178.33.142.63 pl -178.33.142.64 - 178.33.142.67 ch -178.33.142.68 - 178.33.142.71 be -178.33.142.72 - 178.33.142.75 pt -178.33.142.76 - 178.33.142.79 fr -178.33.142.80 - 178.33.142.91 pl -178.33.142.92 - 178.33.142.95 fr -178.33.142.96 - 178.33.142.127 de -178.33.142.128 - 178.33.142.255 es -178.33.143.0 - 178.33.143.191 fr -178.33.143.192 - 178.33.143.203 pl -178.33.143.204 - 178.33.143.215 be -178.33.143.216 - 178.33.143.239 pl -178.33.143.240 - 178.33.143.255 pt -178.33.144.0 - 178.33.144.15 de -178.33.144.16 - 178.33.144.23 gb -178.33.144.24 - 178.33.144.31 ie -178.33.144.32 - 178.33.144.35 pl -178.33.144.36 - 178.33.144.39 fr -178.33.144.40 - 178.33.144.43 de -178.33.144.44 - 178.33.144.47 gb -178.33.144.48 - 178.33.144.55 fr -178.33.144.56 - 178.33.144.63 fi -178.33.144.64 - 178.33.144.127 de -178.33.144.128 - 178.33.144.159 gb -178.33.144.160 - 178.33.144.163 fr -178.33.144.164 - 178.33.144.167 pl -178.33.144.168 - 178.33.144.175 gb -178.33.144.176 - 178.33.144.179 ch -178.33.144.180 - 178.33.144.183 de -178.33.144.184 - 178.33.144.187 pl -178.33.144.188 - 178.33.144.191 fr -178.33.144.192 - 178.33.144.227 es -178.33.144.228 - 178.33.145.15 fr -178.33.145.16 - 178.33.145.19 pl -178.33.145.20 - 178.33.145.23 fr -178.33.145.24 - 178.33.145.27 gb -178.33.145.28 - 178.33.145.31 cz -178.33.145.32 - 178.33.145.35 pl -178.33.145.36 - 178.33.145.39 gb -178.33.145.40 - 178.33.145.47 fr -178.33.145.48 - 178.33.145.55 it -178.33.145.56 - 178.33.145.59 de -178.33.145.60 - 178.33.145.63 fr -178.33.145.64 - 178.33.145.67 pl -178.33.145.68 - 178.33.145.71 es -178.33.145.72 - 178.33.145.75 pl -178.33.145.76 - 178.33.145.79 a1 -178.33.145.80 - 178.33.145.95 fr -178.33.145.96 - 178.33.145.99 pl -178.33.145.100 - 178.33.145.103 de -178.33.145.104 - 178.33.145.111 fr -178.33.145.112 - 178.33.145.115 es -178.33.145.116 - 178.33.145.119 fr -178.33.145.120 - 178.33.145.127 es -178.33.145.128 - 178.33.145.191 gb -178.33.145.192 - 178.33.145.207 fr -178.33.145.208 - 178.33.145.223 es -178.33.145.224 - 178.33.145.255 pl -178.33.146.0 - 178.33.146.15 fr -178.33.146.16 - 178.33.146.23 es -178.33.146.24 - 178.33.146.31 fr -178.33.146.32 - 178.33.146.127 es -178.33.146.128 - 178.33.146.135 pl -178.33.146.136 - 178.33.146.143 fr -178.33.146.144 - 178.33.146.151 es -178.33.146.152 - 178.33.146.155 de -178.33.146.156 - 178.33.146.159 es +178.33.136.8 - 178.33.137.131 fr +178.33.137.132 - 178.33.137.132 pt +178.33.137.133 - 178.33.138.163 fr +178.33.138.164 - 178.33.138.167 nl +178.33.138.168 - 178.33.146.159 fr 178.33.146.160 - 178.33.146.175 gb -178.33.146.176 - 178.33.146.191 pl -178.33.146.192 - 178.33.146.207 gb -178.33.146.208 - 178.33.146.211 fr -178.33.146.212 - 178.33.146.215 de -178.33.146.216 - 178.33.146.255 fr -178.33.147.0 - 178.33.147.7 es -178.33.147.8 - 178.33.147.15 pt -178.33.147.16 - 178.33.147.19 gb -178.33.147.20 - 178.33.147.23 pl -178.33.147.24 - 178.33.147.31 pt -178.33.147.32 - 178.33.147.63 fi -178.33.147.64 - 178.33.147.95 fr -178.33.147.96 - 178.33.147.127 pl -178.33.147.128 - 178.33.147.159 fr -178.33.147.160 - 178.33.147.163 de -178.33.147.164 - 178.33.147.167 fr -178.33.147.168 - 178.33.147.175 it -178.33.147.176 - 178.33.147.183 pt -178.33.147.184 - 178.33.147.191 gb -178.33.147.192 - 178.33.147.211 es -178.33.147.212 - 178.33.147.215 fr -178.33.147.216 - 178.33.147.227 pl -178.33.147.228 - 178.33.147.231 fr -178.33.147.232 - 178.33.147.235 de -178.33.147.236 - 178.33.147.239 es -178.33.147.240 - 178.33.147.243 fr -178.33.147.244 - 178.33.147.251 de -178.33.147.252 - 178.33.148.7 fr -178.33.148.8 - 178.33.148.15 pl -178.33.148.16 - 178.33.148.23 es -178.33.148.24 - 178.33.148.27 fr -178.33.148.28 - 178.33.148.31 pl -178.33.148.32 - 178.33.148.39 fr -178.33.148.40 - 178.33.148.43 gb -178.33.148.44 - 178.33.148.47 es -178.33.148.48 - 178.33.148.127 fr -178.33.148.128 - 178.33.148.143 gb -178.33.148.144 - 178.33.148.147 de -178.33.148.148 - 178.33.148.151 fr -178.33.148.152 - 178.33.148.155 gb -178.33.148.156 - 178.33.148.159 pl -178.33.148.160 - 178.33.148.191 fr -178.33.148.192 - 178.33.148.223 es -178.33.148.224 - 178.33.149.7 pl -178.33.149.8 - 178.33.149.11 fr -178.33.149.12 - 178.33.149.15 de -178.33.149.16 - 178.33.149.31 fr -178.33.149.32 - 178.33.149.47 ch -178.33.149.48 - 178.33.149.51 fr -178.33.149.52 - 178.33.149.63 de -178.33.149.64 - 178.33.149.87 fr -178.33.149.88 - 178.33.149.91 de -178.33.149.92 - 178.33.149.95 gb -178.33.149.96 - 178.33.149.103 de -178.33.149.104 - 178.33.149.107 es -178.33.149.108 - 178.33.149.111 fr -178.33.149.112 - 178.33.149.115 de -178.33.149.116 - 178.33.149.159 fr -178.33.149.160 - 178.33.149.163 de -178.33.149.164 - 178.33.149.167 es -178.33.149.168 - 178.33.149.175 pl -178.33.149.176 - 178.33.149.223 fr -178.33.149.224 - 178.33.149.231 de -178.33.149.232 - 178.33.149.235 it -178.33.149.236 - 178.33.149.243 pl -178.33.149.244 - 178.33.149.247 fr -178.33.149.248 - 178.33.149.251 pl -178.33.149.252 - 178.33.150.15 fr -178.33.150.16 - 178.33.150.19 es -178.33.150.20 - 178.33.150.23 it -178.33.150.24 - 178.33.150.27 fr -178.33.150.28 - 178.33.150.39 de -178.33.150.40 - 178.33.150.43 fr -178.33.150.44 - 178.33.150.47 es -178.33.150.48 - 178.33.150.63 fr -178.33.150.64 - 178.33.150.95 de -178.33.150.96 - 178.33.150.127 fr -178.33.150.128 - 178.33.150.159 es -178.33.150.160 - 178.33.150.191 de -178.33.150.192 - 178.33.150.255 fr -178.33.151.0 - 178.33.151.15 de -178.33.151.16 - 178.33.151.23 fr -178.33.151.24 - 178.33.151.31 nl -178.33.151.32 - 178.33.151.39 fr -178.33.151.40 - 178.33.151.43 gb -178.33.151.44 - 178.33.151.47 de -178.33.151.48 - 178.33.151.63 fr -178.33.151.64 - 178.33.151.67 es -178.33.151.68 - 178.33.151.71 fr -178.33.151.72 - 178.33.151.79 pl -178.33.151.80 - 178.33.151.127 fr -178.33.151.128 - 178.33.151.131 es -178.33.151.132 - 178.33.151.135 pl -178.33.151.136 - 178.33.151.139 be -178.33.151.140 - 178.33.151.143 de -178.33.151.144 - 178.33.151.151 fr -178.33.151.152 - 178.33.151.155 cz -178.33.151.156 - 178.33.151.175 fr -178.33.151.176 - 178.33.151.179 it -178.33.151.180 - 178.33.151.183 de -178.33.151.184 - 178.33.151.187 fr -178.33.151.188 - 178.33.151.191 de -178.33.151.192 - 178.33.151.195 fr -178.33.151.196 - 178.33.151.199 pl -178.33.151.200 - 178.33.151.203 lt -178.33.151.204 - 178.33.151.207 fi -178.33.151.208 - 178.33.151.223 gb -178.33.151.224 - 178.33.151.239 fr -178.33.151.240 - 178.33.151.243 es -178.33.151.244 - 178.33.151.247 be -178.33.151.248 - 178.33.151.251 fr -178.33.151.252 - 178.33.151.255 es -178.33.152.0 - 178.33.152.63 pl -178.33.152.64 - 178.33.152.67 es -178.33.152.68 - 178.33.152.71 fr -178.33.152.72 - 178.33.152.75 ie -178.33.152.76 - 178.33.152.95 gb -178.33.152.96 - 178.33.152.111 pl -178.33.152.112 - 178.33.152.127 es -178.33.152.128 - 178.33.152.191 gb -178.33.152.192 - 178.33.152.223 lt -178.33.152.224 - 178.33.152.231 it -178.33.152.232 - 178.33.152.235 de -178.33.152.236 - 178.33.152.239 be -178.33.152.240 - 178.33.152.243 gb -178.33.152.244 - 178.33.152.247 es -178.33.152.248 - 178.33.152.251 pl -178.33.152.252 - 178.33.153.3 es -178.33.153.4 - 178.33.153.7 nl -178.33.153.8 - 178.33.153.15 fr -178.33.153.16 - 178.33.153.23 ch -178.33.153.24 - 178.33.153.31 es -178.33.153.32 - 178.33.153.47 pt -178.33.153.48 - 178.33.153.63 es -178.33.153.64 - 178.33.153.135 fr -178.33.153.136 - 178.33.153.139 de -178.33.153.140 - 178.33.153.143 fr -178.33.153.144 - 178.33.153.147 ie -178.33.153.148 - 178.33.153.159 es -178.33.153.160 - 178.33.153.223 fr -178.33.153.224 - 178.33.153.231 be -178.33.153.232 - 178.33.153.235 fr -178.33.153.236 - 178.33.153.239 de -178.33.153.240 - 178.33.153.243 es -178.33.153.244 - 178.33.153.255 fr -178.33.154.0 - 178.33.154.7 nl -178.33.154.8 - 178.33.154.11 pl -178.33.154.12 - 178.33.154.15 de -178.33.154.16 - 178.33.154.19 es -178.33.154.20 - 178.33.154.23 gb -178.33.154.24 - 178.33.154.31 fr -178.33.154.32 - 178.33.154.39 de -178.33.154.40 - 178.33.154.43 pt -178.33.154.44 - 178.33.154.47 gb -178.33.154.48 - 178.33.154.55 nl -178.33.154.56 - 178.33.154.59 fi -178.33.154.60 - 178.33.154.63 it -178.33.154.64 - 178.33.154.127 fi -178.33.154.128 - 178.33.154.135 pl -178.33.154.136 - 178.33.154.139 fr -178.33.154.140 - 178.33.154.143 it -178.33.154.144 - 178.33.154.167 fr -178.33.154.168 - 178.33.154.171 pl -178.33.154.172 - 178.33.154.175 de -178.33.154.176 - 178.33.154.255 fr -178.33.155.0 - 178.33.155.3 pt -178.33.155.4 - 178.33.155.7 nl -178.33.155.8 - 178.33.155.15 fr -178.33.155.16 - 178.33.155.19 de -178.33.155.20 - 178.33.155.23 es -178.33.155.24 - 178.33.155.31 ie -178.33.155.32 - 178.33.155.35 pt -178.33.155.36 - 178.33.155.39 it -178.33.155.40 - 178.33.155.43 fr -178.33.155.44 - 178.33.155.47 ie -178.33.155.48 - 178.33.155.51 gb -178.33.155.52 - 178.33.155.55 fr -178.33.155.56 - 178.33.155.59 gb -178.33.155.60 - 178.33.155.63 ie -178.33.155.64 - 178.33.155.131 es -178.33.155.132 - 178.33.155.135 de -178.33.155.136 - 178.33.155.139 fr -178.33.155.140 - 178.33.155.143 de -178.33.155.144 - 178.33.155.147 ch -178.33.155.148 - 178.33.155.151 it -178.33.155.152 - 178.33.155.155 fr -178.33.155.156 - 178.33.155.159 be -178.33.155.160 - 178.33.155.175 fi -178.33.155.176 - 178.33.155.179 de -178.33.155.180 - 178.33.155.183 es -178.33.155.184 - 178.33.155.187 it -178.33.155.188 - 178.33.155.191 es -178.33.155.192 - 178.33.155.199 fr -178.33.155.200 - 178.33.155.203 nl -178.33.155.204 - 178.33.155.207 es -178.33.155.208 - 178.33.155.223 fr -178.33.155.224 - 178.33.155.231 es -178.33.155.232 - 178.33.155.239 fr -178.33.155.240 - 178.33.155.243 it -178.33.155.244 - 178.33.155.247 fr -178.33.155.248 - 178.33.155.251 gb -178.33.155.252 - 178.33.155.255 pl -178.33.156.0 - 178.33.156.15 gb -178.33.156.16 - 178.33.156.23 nl -178.33.156.24 - 178.33.156.27 pl -178.33.156.28 - 178.33.156.31 ie -178.33.156.32 - 178.33.156.39 de -178.33.156.40 - 178.33.156.43 gb -178.33.156.44 - 178.33.156.51 fr -178.33.156.52 - 178.33.156.55 it -178.33.156.56 - 178.33.156.63 fr -178.33.156.64 - 178.33.156.95 it -178.33.156.96 - 178.33.156.111 ie -178.33.156.112 - 178.33.156.119 es -178.33.156.120 - 178.33.156.123 de -178.33.156.124 - 178.33.156.127 pl -178.33.156.128 - 178.33.156.135 ie -178.33.156.136 - 178.33.156.139 es -178.33.156.140 - 178.33.156.143 gb -178.33.156.144 - 178.33.156.151 fr -178.33.156.152 - 178.33.156.155 gb -178.33.156.156 - 178.33.156.167 fr -178.33.156.168 - 178.33.156.175 pl -178.33.156.176 - 178.33.156.183 nl -178.33.156.184 - 178.33.156.191 fr -178.33.156.192 - 178.33.156.195 gb -178.33.156.196 - 178.33.156.199 es -178.33.156.200 - 178.33.156.203 gb -178.33.156.204 - 178.33.156.223 fr -178.33.156.224 - 178.33.156.231 be -178.33.156.232 - 178.33.156.239 fr -178.33.156.240 - 178.33.156.255 pl -178.33.157.0 - 178.33.157.95 fr -178.33.157.96 - 178.33.157.103 gb -178.33.157.104 - 178.33.157.107 es -178.33.157.108 - 178.33.157.115 pl -178.33.157.116 - 178.33.157.119 de -178.33.157.120 - 178.33.157.123 fr -178.33.157.124 - 178.33.157.127 pt -178.33.157.128 - 178.33.157.143 pl -178.33.157.144 - 178.33.157.147 lt -178.33.157.148 - 178.33.157.151 gb -178.33.157.152 - 178.33.157.159 fr -178.33.157.160 - 178.33.157.191 es -178.33.157.192 - 178.33.157.195 nl -178.33.157.196 - 178.33.157.199 cz -178.33.157.200 - 178.33.157.203 it -178.33.157.204 - 178.33.157.207 es -178.33.157.208 - 178.33.157.211 fr -178.33.157.212 - 178.33.157.215 de -178.33.157.216 - 178.33.157.219 be -178.33.157.220 - 178.33.157.239 fr -178.33.157.240 - 178.33.157.255 de -178.33.158.0 - 178.33.158.15 es -178.33.158.16 - 178.33.158.71 fr +178.33.146.176 - 178.33.149.235 fr +178.33.149.236 - 178.33.149.239 gb +178.33.149.240 - 178.33.154.127 fr +178.33.154.128 - 178.33.154.131 ch +178.33.154.132 - 178.33.154.143 fr +178.33.154.144 - 178.33.154.159 de +178.33.154.160 - 178.33.154.167 fr +178.33.154.168 - 178.33.154.171 es +178.33.154.172 - 178.33.155.203 fr +178.33.155.204 - 178.33.155.207 nl +178.33.155.208 - 178.33.155.239 fr +178.33.155.240 - 178.33.155.243 nl +178.33.155.244 - 178.33.155.251 fr +178.33.155.252 - 178.33.155.255 es +178.33.156.0 - 178.33.156.23 fr +178.33.156.24 - 178.33.156.27 es +178.33.156.28 - 178.33.158.71 fr 178.33.158.72 - 178.33.158.79 pl -178.33.158.80 - 178.33.158.95 fr -178.33.158.96 - 178.33.158.127 ch -178.33.158.128 - 178.33.158.159 fr -178.33.158.160 - 178.33.158.167 pt -178.33.158.168 - 178.33.158.175 es -178.33.158.176 - 178.33.158.191 fr -178.33.158.192 - 178.33.158.223 es -178.33.158.224 - 178.33.158.239 gb -178.33.158.240 - 178.33.158.247 fr -178.33.158.248 - 178.33.158.251 de -178.33.158.252 - 178.33.158.255 be -178.33.159.0 - 178.33.159.31 fr +178.33.158.80 - 178.33.159.31 fr 178.33.159.32 - 178.33.159.63 gb -178.33.159.64 - 178.33.159.95 fr -178.33.159.96 - 178.33.159.127 lt -178.33.159.128 - 178.33.159.131 gb -178.33.159.132 - 178.33.159.135 de -178.33.159.136 - 178.33.159.143 pl -178.33.159.144 - 178.33.159.175 fr +178.33.159.64 - 178.33.159.175 fr 178.33.159.176 - 178.33.159.179 es -178.33.159.180 - 178.33.159.183 lt -178.33.159.184 - 178.33.159.207 fr -178.33.159.208 - 178.33.159.215 es -178.33.159.216 - 178.33.159.219 pl -178.33.159.220 - 178.33.159.223 ie -178.33.159.224 - 178.33.159.255 es -178.33.160.0 - 178.33.191.255 fr -178.33.192.0 - 178.33.192.7 pl -178.33.192.8 - 178.33.192.15 fr -178.33.192.16 - 178.33.192.23 pl -178.33.192.24 - 178.33.192.31 fr -178.33.192.32 - 178.33.192.63 gb -178.33.192.64 - 178.33.192.67 de -178.33.192.68 - 178.33.192.71 pl -178.33.192.72 - 178.33.192.95 fr -178.33.192.96 - 178.33.192.127 de -178.33.192.128 - 178.33.192.131 it -178.33.192.132 - 178.33.192.135 fr -178.33.192.136 - 178.33.192.139 be -178.33.192.140 - 178.33.192.143 es -178.33.192.144 - 178.33.192.147 gb -178.33.192.148 - 178.33.192.151 fi -178.33.192.152 - 178.33.192.155 fr -178.33.192.156 - 178.33.192.159 pl -178.33.192.160 - 178.33.192.163 nl -178.33.192.164 - 178.33.192.191 fr -178.33.192.192 - 178.33.192.199 it -178.33.192.200 - 178.33.192.203 pl -178.33.192.204 - 178.33.192.207 de -178.33.192.208 - 178.33.192.239 fr -178.33.192.240 - 178.33.192.247 pl -178.33.192.248 - 178.33.192.251 fr -178.33.192.252 - 178.33.192.255 de -178.33.193.0 - 178.33.194.31 fr -178.33.194.32 - 178.33.194.39 de -178.33.194.40 - 178.33.194.47 fr -178.33.194.48 - 178.33.194.55 es -178.33.194.56 - 178.33.194.63 gb -178.33.194.64 - 178.33.194.79 fr -178.33.194.80 - 178.33.194.83 es -178.33.194.84 - 178.33.194.87 de -178.33.194.88 - 178.33.194.91 be -178.33.194.92 - 178.33.194.95 fr -178.33.194.96 - 178.33.194.111 pl -178.33.194.112 - 178.33.194.119 nl -178.33.194.120 - 178.33.194.127 pl -178.33.194.128 - 178.33.194.143 fr -178.33.194.144 - 178.33.194.163 pl -178.33.194.164 - 178.33.194.167 fr -178.33.194.168 - 178.33.194.175 be -178.33.194.176 - 178.33.194.179 fi -178.33.194.180 - 178.33.194.199 fr -178.33.194.200 - 178.33.194.203 be -178.33.194.204 - 178.33.194.207 es -178.33.194.208 - 178.33.194.223 fr -178.33.194.224 - 178.33.194.239 ie -178.33.194.240 - 178.33.194.243 pt -178.33.194.244 - 178.33.194.247 be -178.33.194.248 - 178.33.194.255 pl -178.33.195.0 - 178.33.195.3 es -178.33.195.4 - 178.33.195.7 fr -178.33.195.8 - 178.33.195.11 es -178.33.195.12 - 178.33.195.19 pl -178.33.195.20 - 178.33.195.23 fr -178.33.195.24 - 178.33.195.31 fi -178.33.195.32 - 178.33.195.39 ch -178.33.195.40 - 178.33.195.47 es -178.33.195.48 - 178.33.195.55 fr -178.33.195.56 - 178.33.195.59 lt -178.33.195.60 - 178.33.195.95 nl -178.33.195.96 - 178.33.195.159 fr -178.33.195.160 - 178.33.195.191 be -178.33.195.192 - 178.33.195.195 fr -178.33.195.196 - 178.33.195.199 es -178.33.195.200 - 178.33.195.203 fr -178.33.195.204 - 178.33.195.207 de -178.33.195.208 - 178.33.195.223 gb -178.33.195.224 - 178.33.195.231 es -178.33.195.232 - 178.33.195.235 pl -178.33.195.236 - 178.33.195.239 de -178.33.195.240 - 178.33.195.243 be -178.33.195.244 - 178.33.195.247 pl -178.33.195.248 - 178.33.195.255 cz -178.33.196.0 - 178.33.196.15 de -178.33.196.16 - 178.33.196.31 es -178.33.196.32 - 178.33.196.67 fr -178.33.196.68 - 178.33.196.71 es -178.33.196.72 - 178.33.196.75 gb -178.33.196.76 - 178.33.196.79 cz -178.33.196.80 - 178.33.196.87 pl -178.33.196.88 - 178.33.196.91 es -178.33.196.92 - 178.33.196.95 it -178.33.196.96 - 178.33.196.115 es -178.33.196.116 - 178.33.196.119 de -178.33.196.120 - 178.33.196.127 pl -178.33.196.128 - 178.33.196.159 gb -178.33.196.160 - 178.33.196.175 pl -178.33.196.176 - 178.33.196.179 fi -178.33.196.180 - 178.33.196.183 fr -178.33.196.184 - 178.33.196.227 pl -178.33.196.228 - 178.33.197.31 fr -178.33.197.32 - 178.33.197.63 de -178.33.197.64 - 178.33.197.67 gb -178.33.197.68 - 178.33.197.71 pt -178.33.197.72 - 178.33.197.75 ie -178.33.197.76 - 178.33.197.79 gb -178.33.197.80 - 178.33.197.83 nl -178.33.197.84 - 178.33.197.95 fr -178.33.197.96 - 178.33.197.127 pl -178.33.197.128 - 178.33.197.159 fr -178.33.197.160 - 178.33.197.191 pl -178.33.197.192 - 178.33.197.195 de -178.33.197.196 - 178.33.197.199 es -178.33.197.200 - 178.33.197.203 pl -178.33.197.204 - 178.33.197.207 fr -178.33.197.208 - 178.33.197.223 be -178.33.197.224 - 178.33.198.127 fr -178.33.198.128 - 178.33.198.159 lt -178.33.198.160 - 178.33.198.175 fr -178.33.198.176 - 178.33.198.191 ie -178.33.198.192 - 178.33.198.223 fr -178.33.198.224 - 178.33.198.239 pl -178.33.198.240 - 178.33.198.243 de -178.33.198.244 - 178.33.198.247 fi -178.33.198.248 - 178.33.198.251 de -178.33.198.252 - 178.33.198.255 pl -178.33.199.0 - 178.33.199.3 fr -178.33.199.4 - 178.33.199.7 pl -178.33.199.8 - 178.33.199.15 fr -178.33.199.16 - 178.33.199.23 pl -178.33.199.24 - 178.33.199.27 nl -178.33.199.28 - 178.33.199.31 it -178.33.199.32 - 178.33.199.35 ie -178.33.199.36 - 178.33.199.43 gb -178.33.199.44 - 178.33.199.47 fr -178.33.199.48 - 178.33.199.51 de -178.33.199.52 - 178.33.199.55 pl -178.33.199.56 - 178.33.199.59 gb -178.33.199.60 - 178.33.199.63 de -178.33.199.64 - 178.33.199.127 pl -178.33.199.128 - 178.33.199.191 es -178.33.199.192 - 178.33.199.255 fi -178.33.200.0 - 178.33.200.63 ie -178.33.200.64 - 178.33.200.127 lt -178.33.200.128 - 178.33.200.191 nl -178.33.200.192 - 178.33.200.255 pl -178.33.201.0 - 178.33.201.63 gb -178.33.201.64 - 178.33.201.127 fr -178.33.201.128 - 178.33.201.135 pl -178.33.201.136 - 178.33.201.139 it -178.33.201.140 - 178.33.201.143 pt -178.33.201.144 - 178.33.201.155 fr -178.33.201.156 - 178.33.201.159 gb -178.33.201.160 - 178.33.201.175 fr -178.33.201.176 - 178.33.201.191 ch -178.33.201.192 - 178.33.201.239 fr -178.33.201.240 - 178.33.201.255 it -178.33.202.0 - 178.33.202.35 fr -178.33.202.36 - 178.33.202.39 be -178.33.202.40 - 178.33.202.43 gb -178.33.202.44 - 178.33.202.47 nl -178.33.202.48 - 178.33.202.51 ch -178.33.202.52 - 178.33.202.55 fr -178.33.202.56 - 178.33.202.59 nl -178.33.202.60 - 178.33.202.63 pl -178.33.202.64 - 178.33.202.87 gb -178.33.202.88 - 178.33.202.91 pl -178.33.202.92 - 178.33.202.95 gb -178.33.202.96 - 178.33.202.127 fr -178.33.202.128 - 178.33.202.159 gb -178.33.202.160 - 178.33.202.163 be -178.33.202.164 - 178.33.202.167 pl -178.33.202.168 - 178.33.202.191 fr -178.33.202.192 - 178.33.202.207 gb -178.33.202.208 - 178.33.202.211 nl -178.33.202.212 - 178.33.202.215 lt -178.33.202.216 - 178.33.202.223 fr -178.33.202.224 - 178.33.202.255 es -178.33.203.0 - 178.33.203.31 pl -178.33.203.32 - 178.33.203.35 de -178.33.203.36 - 178.33.203.47 pl -178.33.203.48 - 178.33.203.159 fr -178.33.203.160 - 178.33.203.191 lt -178.33.203.192 - 178.33.203.255 pl -178.33.204.0 - 178.33.205.15 fr -178.33.205.16 - 178.33.205.47 ie -178.33.205.48 - 178.33.205.63 es -178.33.205.64 - 178.33.205.75 fr -178.33.205.76 - 178.33.205.79 pl -178.33.205.80 - 178.33.205.83 de -178.33.205.84 - 178.33.205.87 pl -178.33.205.88 - 178.33.205.91 de -178.33.205.92 - 178.33.205.95 pl -178.33.205.96 - 178.33.205.107 fr -178.33.205.108 - 178.33.205.111 it -178.33.205.112 - 178.33.205.115 de -178.33.205.116 - 178.33.205.119 pl -178.33.205.120 - 178.33.205.127 gb -178.33.205.128 - 178.33.205.191 fr -178.33.205.192 - 178.33.205.255 es -178.33.206.0 - 178.33.207.255 it -178.33.208.0 - 178.33.208.3 fr -178.33.208.4 - 178.33.208.7 es -178.33.208.8 - 178.33.208.11 gb -178.33.208.12 - 178.33.208.15 fr -178.33.208.16 - 178.33.208.31 ie -178.33.208.32 - 178.33.208.55 fr -178.33.208.56 - 178.33.208.59 de -178.33.208.60 - 178.33.208.63 pl -178.33.208.64 - 178.33.208.67 de -178.33.208.68 - 178.33.208.71 pl -178.33.208.72 - 178.33.208.95 fr -178.33.208.96 - 178.33.208.131 es -178.33.208.132 - 178.33.208.135 fi -178.33.208.136 - 178.33.208.139 de -178.33.208.140 - 178.33.208.143 be -178.33.208.144 - 178.33.208.151 es -178.33.208.152 - 178.33.208.159 ie -178.33.208.160 - 178.33.208.191 gb -178.33.208.192 - 178.33.208.207 es -178.33.208.208 - 178.33.208.211 nl -178.33.208.212 - 178.33.208.215 it -178.33.208.216 - 178.33.208.219 pl -178.33.208.220 - 178.33.208.239 fr -178.33.208.240 - 178.33.208.243 pl -178.33.208.244 - 178.33.208.255 fr -178.33.209.0 - 178.33.209.63 gb -178.33.209.64 - 178.33.209.71 de -178.33.209.72 - 178.33.209.79 pl -178.33.209.80 - 178.33.209.95 fr -178.33.209.96 - 178.33.209.111 de -178.33.209.112 - 178.33.209.119 gb +178.33.159.180 - 178.33.159.255 fr +178.33.160.0 - 178.33.160.242 es +178.33.160.243 - 178.33.160.243 fr +178.33.160.244 - 178.33.167.255 es +178.33.168.0 - 178.33.168.215 fr +178.33.168.216 - 178.33.168.219 es +178.33.168.220 - 178.33.169.38 fr +178.33.169.39 - 178.33.169.39 gb +178.33.169.40 - 178.33.169.63 fr +178.33.169.64 - 178.33.169.127 de +178.33.169.128 - 178.33.173.19 fr +178.33.173.20 - 178.33.173.23 es +178.33.173.24 - 178.33.173.111 fr +178.33.173.112 - 178.33.173.127 de +178.33.173.128 - 178.33.178.179 fr +178.33.178.180 - 178.33.178.183 it +178.33.178.184 - 178.33.179.239 fr +178.33.179.240 - 178.33.179.255 be +178.33.180.0 - 178.33.180.183 fr +178.33.180.184 - 178.33.180.191 nl +178.33.180.192 - 178.33.181.59 fr +178.33.181.60 - 178.33.181.63 es +178.33.181.64 - 178.33.182.127 fr +178.33.182.128 - 178.33.182.191 be +178.33.182.192 - 178.33.183.51 fr +178.33.183.52 - 178.33.183.55 es +178.33.183.56 - 178.33.189.7 fr +178.33.189.8 - 178.33.189.11 de +178.33.189.12 - 178.33.189.31 fr +178.33.189.32 - 178.33.189.39 pt +178.33.189.40 - 178.33.191.175 fr +178.33.191.176 - 178.33.191.179 de +178.33.191.180 - 178.33.192.71 fr +178.33.192.72 - 178.33.192.75 es +178.33.192.76 - 178.33.195.47 fr +178.33.195.48 - 178.33.195.55 pt +178.33.195.56 - 178.33.196.195 fr +178.33.196.196 - 178.33.196.199 es +178.33.196.200 - 178.33.196.227 fr +178.33.196.228 - 178.33.196.231 es +178.33.196.232 - 178.33.198.159 fr +178.33.198.160 - 178.33.198.175 it +178.33.198.176 - 178.33.199.123 fr +178.33.199.124 - 178.33.199.127 de +178.33.199.128 - 178.33.201.31 fr +178.33.201.32 - 178.33.201.63 nl +178.33.201.64 - 178.33.201.211 fr +178.33.201.212 - 178.33.201.215 es +178.33.201.216 - 178.33.201.223 nl +178.33.201.224 - 178.33.208.255 fr +178.33.209.0 - 178.33.209.63 es +178.33.209.64 - 178.33.209.119 fr 178.33.209.120 - 178.33.209.127 fi 178.33.209.128 - 178.33.209.143 fr 178.33.209.144 - 178.33.209.159 nl 178.33.209.160 - 178.33.209.175 de -178.33.209.176 - 178.33.209.191 fr -178.33.209.192 - 178.33.209.223 gb -178.33.209.224 - 178.33.209.231 pl -178.33.209.232 - 178.33.209.255 gb -178.33.210.0 - 178.33.210.15 pl -178.33.210.16 - 178.33.210.23 fr -178.33.210.24 - 178.33.210.27 de -178.33.210.28 - 178.33.210.39 fr -178.33.210.40 - 178.33.210.43 cz -178.33.210.44 - 178.33.210.55 fr -178.33.210.56 - 178.33.210.63 pl -178.33.210.64 - 178.33.210.79 fr -178.33.210.80 - 178.33.210.95 es -178.33.210.96 - 178.33.210.99 fr -178.33.210.100 - 178.33.210.103 de -178.33.210.104 - 178.33.210.127 fr -178.33.210.128 - 178.33.210.131 be -178.33.210.132 - 178.33.210.135 fr -178.33.210.136 - 178.33.210.143 es -178.33.210.144 - 178.33.210.147 gb -178.33.210.148 - 178.33.210.151 de -178.33.210.152 - 178.33.210.155 pl -178.33.210.156 - 178.33.210.159 gb -178.33.210.160 - 178.33.210.163 fr -178.33.210.164 - 178.33.210.175 pl -178.33.210.176 - 178.33.210.179 es -178.33.210.180 - 178.33.210.183 lt -178.33.210.184 - 178.33.210.187 pl -178.33.210.188 - 178.33.210.191 gb -178.33.210.192 - 178.33.210.199 fr -178.33.210.200 - 178.33.210.203 pl -178.33.210.204 - 178.33.210.207 cz -178.33.210.208 - 178.33.210.223 be -178.33.210.224 - 178.33.211.19 fr -178.33.211.20 - 178.33.211.23 pl -178.33.211.24 - 178.33.211.27 es -178.33.211.28 - 178.33.211.31 pl -178.33.211.32 - 178.33.211.35 gb -178.33.211.36 - 178.33.211.39 fr -178.33.211.40 - 178.33.211.43 cz -178.33.211.44 - 178.33.211.47 lt -178.33.211.48 - 178.33.211.51 pl -178.33.211.52 - 178.33.211.55 gb -178.33.211.56 - 178.33.211.63 pl -178.33.211.64 - 178.33.211.79 fr -178.33.211.80 - 178.33.211.83 pt -178.33.211.84 - 178.33.211.87 gb -178.33.211.88 - 178.33.211.91 be -178.33.211.92 - 178.33.211.111 pl -178.33.211.112 - 178.33.211.131 fr -178.33.211.132 - 178.33.211.135 nl -178.33.211.136 - 178.33.211.139 es -178.33.211.140 - 178.33.211.143 pt -178.33.211.144 - 178.33.211.151 pl -178.33.211.152 - 178.33.211.191 fr -178.33.211.192 - 178.33.211.223 pl -178.33.211.224 - 178.33.211.239 fr -178.33.211.240 - 178.33.211.251 es -178.33.211.252 - 178.33.211.255 lt -178.33.212.0 - 178.33.213.3 gb -178.33.213.4 - 178.33.213.7 pl -178.33.213.8 - 178.33.213.11 nl -178.33.213.12 - 178.33.213.15 fi -178.33.213.16 - 178.33.213.19 fr -178.33.213.20 - 178.33.213.23 cz -178.33.213.24 - 178.33.213.27 de -178.33.213.28 - 178.33.213.31 lt -178.33.213.32 - 178.33.213.63 fr -178.33.213.64 - 178.33.213.79 pl -178.33.213.80 - 178.33.213.83 fr -178.33.213.84 - 178.33.213.87 pl -178.33.213.88 - 178.33.213.95 gb -178.33.213.96 - 178.33.213.99 pl -178.33.213.100 - 178.33.213.103 pt -178.33.213.104 - 178.33.213.111 pl -178.33.213.112 - 178.33.213.127 fr -178.33.213.128 - 178.33.213.159 pl -178.33.213.160 - 178.33.213.179 fr -178.33.213.180 - 178.33.213.183 it -178.33.213.184 - 178.33.213.191 fr -178.33.213.192 - 178.33.213.207 ie -178.33.213.208 - 178.33.213.211 ch -178.33.213.212 - 178.33.213.215 a1 -178.33.213.216 - 178.33.213.223 fr -178.33.213.224 - 178.33.213.239 pl -178.33.213.240 - 178.33.214.63 fr -178.33.214.64 - 178.33.214.95 de -178.33.214.96 - 178.33.214.107 es -178.33.214.108 - 178.33.214.111 lt -178.33.214.112 - 178.33.214.127 pl -178.33.214.128 - 178.33.214.159 de -178.33.214.160 - 178.33.214.175 pl -178.33.214.176 - 178.33.214.191 ie -178.33.214.192 - 178.33.214.207 fr -178.33.214.208 - 178.33.214.223 pl -178.33.214.224 - 178.33.214.231 fr -178.33.214.232 - 178.33.214.243 pl -178.33.214.244 - 178.33.214.247 de -178.33.214.248 - 178.33.215.255 nl -178.33.216.0 - 178.33.216.159 fr -178.33.216.160 - 178.33.216.167 gb -178.33.216.168 - 178.33.216.175 fr -178.33.216.176 - 178.33.216.179 pt -178.33.216.180 - 178.33.216.191 pl -178.33.216.192 - 178.33.216.255 fi -178.33.217.0 - 178.33.217.15 gb -178.33.217.16 - 178.33.217.19 pl -178.33.217.20 - 178.33.217.23 de -178.33.217.24 - 178.33.217.31 fr -178.33.217.32 - 178.33.217.127 be -178.33.217.128 - 178.33.217.135 pl -178.33.217.136 - 178.33.217.143 pt -178.33.217.144 - 178.33.217.147 fr -178.33.217.148 - 178.33.217.151 nl -178.33.217.152 - 178.33.217.155 lt -178.33.217.156 - 178.33.217.159 pl +178.33.209.176 - 178.33.212.175 fr +178.33.212.176 - 178.33.212.183 gb +178.33.212.184 - 178.33.213.99 fr +178.33.213.100 - 178.33.213.103 it +178.33.213.104 - 178.33.217.159 fr 178.33.217.160 - 178.33.217.175 gb -178.33.217.176 - 178.33.217.223 fr -178.33.217.224 - 178.33.217.255 pl -178.33.218.0 - 178.33.218.67 fr -178.33.218.68 - 178.33.218.71 pt -178.33.218.72 - 178.33.218.79 gb -178.33.218.80 - 178.33.218.99 fr -178.33.218.100 - 178.33.218.103 es -178.33.218.104 - 178.33.218.111 fr -178.33.218.112 - 178.33.218.115 nl -178.33.218.116 - 178.33.218.119 ch -178.33.218.120 - 178.33.218.123 fi -178.33.218.124 - 178.33.218.131 pt -178.33.218.132 - 178.33.218.135 gb -178.33.218.136 - 178.33.218.139 de -178.33.218.140 - 178.33.218.143 lt -178.33.218.144 - 178.33.218.159 pl -178.33.218.160 - 178.33.218.191 fr -178.33.218.192 - 178.33.218.207 pl -178.33.218.208 - 178.33.218.239 fr -178.33.218.240 - 178.33.218.243 cz -178.33.218.244 - 178.33.218.247 pl -178.33.218.248 - 178.33.218.255 fr -178.33.219.0 - 178.33.219.255 ie -178.33.220.0 - 178.33.220.31 fr -178.33.220.32 - 178.33.220.43 gb -178.33.220.44 - 178.33.220.47 fr -178.33.220.48 - 178.33.220.63 pl -178.33.220.64 - 178.33.220.67 cz -178.33.220.68 - 178.33.220.71 fi -178.33.220.72 - 178.33.220.79 pl -178.33.220.80 - 178.33.220.99 fr -178.33.220.100 - 178.33.220.103 be -178.33.220.104 - 178.33.220.111 fr -178.33.220.112 - 178.33.220.115 nl -178.33.220.116 - 178.33.220.119 gb -178.33.220.120 - 178.33.220.127 ie -178.33.220.128 - 178.33.220.135 pt -178.33.220.136 - 178.33.220.143 gb -178.33.220.144 - 178.33.220.151 es -178.33.220.152 - 178.33.220.159 de -178.33.220.160 - 178.33.220.191 fr -178.33.220.192 - 178.33.220.207 lt -178.33.220.208 - 178.33.220.211 fr -178.33.220.212 - 178.33.220.215 pl -178.33.220.216 - 178.33.220.219 fr -178.33.220.220 - 178.33.220.223 nl -178.33.220.224 - 178.33.221.255 fr -178.33.222.0 - 178.33.222.31 be -178.33.222.32 - 178.33.222.47 ie -178.33.222.48 - 178.33.222.51 fr -178.33.222.52 - 178.33.222.55 pl -178.33.222.56 - 178.33.222.63 fr -178.33.222.64 - 178.33.222.95 be -178.33.222.96 - 178.33.222.175 fr -178.33.222.176 - 178.33.222.191 fi -178.33.222.192 - 178.33.222.207 fr -178.33.222.208 - 178.33.222.211 pl -178.33.222.212 - 178.33.222.215 gb -178.33.222.216 - 178.33.222.219 pl -178.33.222.220 - 178.33.222.223 gb -178.33.222.224 - 178.33.222.227 es -178.33.222.228 - 178.33.222.231 lt -178.33.222.232 - 178.33.222.235 de -178.33.222.236 - 178.33.222.247 fr -178.33.222.248 - 178.33.222.251 gb -178.33.222.252 - 178.33.222.255 it -178.33.223.0 - 178.33.223.51 fr -178.33.223.52 - 178.33.223.55 be -178.33.223.56 - 178.33.223.63 es -178.33.223.64 - 178.33.223.79 fr -178.33.223.80 - 178.33.223.83 it -178.33.223.84 - 178.33.223.87 pl -178.33.223.88 - 178.33.223.95 es -178.33.223.96 - 178.33.223.127 fr -178.33.223.128 - 178.33.223.135 de -178.33.223.136 - 178.33.223.143 gb -178.33.223.144 - 178.33.223.159 fr -178.33.223.160 - 178.33.223.163 ie -178.33.223.164 - 178.33.223.167 gb -178.33.223.168 - 178.33.223.171 nl -178.33.223.172 - 178.33.223.175 ch -178.33.223.176 - 178.33.223.179 de -178.33.223.180 - 178.33.223.183 es -178.33.223.184 - 178.33.223.247 fr -178.33.223.248 - 178.33.223.255 gb -178.33.224.0 - 178.33.255.255 fr +178.33.217.176 - 178.33.220.103 fr +178.33.220.104 - 178.33.220.111 nl +178.33.220.112 - 178.33.220.215 fr +178.33.220.216 - 178.33.220.219 de +178.33.220.220 - 178.33.222.55 fr +178.33.222.56 - 178.33.222.59 ie +178.33.222.60 - 178.33.222.175 fr +178.33.222.176 - 178.33.222.191 es +178.33.222.192 - 178.33.223.143 fr +178.33.223.144 - 178.33.223.159 gb +178.33.223.160 - 178.33.255.255 fr 178.34.0.0 - 178.35.255.255 ru 178.36.0.0 - 178.37.255.255 pl 178.38.0.0 - 178.39.255.255 ch @@ -80972,36 +60613,31 @@ 178.42.0.0 - 178.43.255.255 pl 178.44.0.0 - 178.47.255.255 ru 178.48.0.0 - 178.48.255.255 hu -178.49.0.0 - 178.49.255.255 ru +178.49.0.0 - 178.49.127.255 ru +178.49.128.0 - 178.49.128.255 co +178.49.129.0 - 178.49.129.255 ru +178.49.130.0 - 178.49.131.255 co +178.49.132.0 - 178.49.255.255 ru 178.50.0.0 - 178.51.255.255 be 178.52.0.0 - 178.52.255.255 sy 178.53.0.0 - 178.53.255.255 kw 178.54.0.0 - 178.54.255.255 ua 178.55.0.0 - 178.55.255.255 fi 178.56.0.0 - 178.56.255.255 pl -178.57.0.0 - 178.57.255.255 ru +178.57.0.0 - 178.57.65.255 ru +178.57.66.0 - 178.57.66.127 kz +178.57.66.128 - 178.57.66.255 us +178.57.67.0 - 178.57.67.127 kz +178.57.67.128 - 178.57.255.255 ru 178.58.0.0 - 178.58.255.255 si 178.59.0.0 - 178.59.255.255 gr 178.60.0.0 - 178.60.255.255 es 178.61.0.0 - 178.61.255.255 kw -178.62.0.0 - 178.62.255.255 ru -178.63.0.0 - 178.63.173.151 de -178.63.173.152 - 178.63.173.159 it -178.63.173.160 - 178.63.174.255 de -178.63.175.0 - 178.63.175.63 it -178.63.175.64 - 178.63.178.31 de -178.63.178.32 - 178.63.178.39 it -178.63.178.40 - 178.63.203.63 de -178.63.203.64 - 178.63.203.127 es -178.63.203.128 - 178.63.214.31 de -178.63.214.32 - 178.63.214.39 it -178.63.214.40 - 178.63.216.191 de -178.63.216.192 - 178.63.216.223 rs -178.63.216.224 - 178.63.239.255 de -178.63.240.0 - 178.63.240.31 eg -178.63.240.32 - 178.63.244.255 de -178.63.245.0 - 178.63.245.31 pl -178.63.245.32 - 178.63.255.255 de +178.62.0.0 - 178.62.127.255 gb +178.62.128.0 - 178.62.255.255 nl +178.63.0.0 - 178.63.9.154 de +178.63.9.155 - 178.63.9.155 hr +178.63.9.156 - 178.63.255.255 de 178.64.0.0 - 178.71.255.255 ru 178.72.0.0 - 178.72.15.255 se 178.72.16.0 - 178.72.31.255 dk @@ -81012,177 +60648,11 @@ 178.73.0.0 - 178.73.63.255 pl 178.73.64.0 - 178.73.127.255 sa 178.73.128.0 - 178.73.191.255 fr -178.73.192.0 - 178.73.195.255 a1 -178.73.196.0 - 178.73.197.255 se -178.73.198.0 - 178.73.198.63 a1 -178.73.198.64 - 178.73.203.255 se -178.73.204.0 - 178.73.211.255 a1 -178.73.212.0 - 178.73.223.255 se -178.73.224.0 - 178.73.224.31 gb -178.73.224.32 - 178.73.224.47 nl -178.73.224.48 - 178.73.224.63 de -178.73.224.64 - 178.73.224.79 dk -178.73.224.80 - 178.73.224.95 es -178.73.224.96 - 178.73.224.99 fr -178.73.224.100 - 178.73.224.255 se -178.73.225.0 - 178.73.225.31 gb -178.73.225.32 - 178.73.225.47 nl -178.73.225.48 - 178.73.225.63 de -178.73.225.64 - 178.73.225.79 dk -178.73.225.80 - 178.73.225.95 es -178.73.225.96 - 178.73.225.99 fr -178.73.225.100 - 178.73.225.255 se -178.73.226.0 - 178.73.226.31 gb -178.73.226.32 - 178.73.226.47 nl -178.73.226.48 - 178.73.226.63 de -178.73.226.64 - 178.73.226.79 dk -178.73.226.80 - 178.73.226.95 es -178.73.226.96 - 178.73.226.99 fr -178.73.226.100 - 178.73.226.255 se -178.73.227.0 - 178.73.227.31 gb -178.73.227.32 - 178.73.227.47 nl -178.73.227.48 - 178.73.227.63 de -178.73.227.64 - 178.73.227.79 dk -178.73.227.80 - 178.73.227.95 es -178.73.227.96 - 178.73.227.99 fr -178.73.227.100 - 178.73.227.255 se -178.73.228.0 - 178.73.228.31 gb -178.73.228.32 - 178.73.228.47 nl -178.73.228.48 - 178.73.228.63 de -178.73.228.64 - 178.73.228.79 dk -178.73.228.80 - 178.73.228.95 es -178.73.228.96 - 178.73.228.99 fr -178.73.228.100 - 178.73.228.255 se -178.73.229.0 - 178.73.229.31 gb -178.73.229.32 - 178.73.229.47 nl -178.73.229.48 - 178.73.229.63 de -178.73.229.64 - 178.73.229.79 dk -178.73.229.80 - 178.73.229.95 es -178.73.229.96 - 178.73.229.99 fr -178.73.229.100 - 178.73.229.255 se -178.73.230.0 - 178.73.230.31 gb -178.73.230.32 - 178.73.230.47 nl -178.73.230.48 - 178.73.230.63 de -178.73.230.64 - 178.73.230.79 dk -178.73.230.80 - 178.73.230.95 es -178.73.230.96 - 178.73.230.99 fr -178.73.230.100 - 178.73.230.255 se -178.73.231.0 - 178.73.231.31 gb -178.73.231.32 - 178.73.231.47 nl -178.73.231.48 - 178.73.231.63 de -178.73.231.64 - 178.73.231.79 dk -178.73.231.80 - 178.73.231.95 es -178.73.231.96 - 178.73.231.99 fr -178.73.231.100 - 178.73.231.255 se -178.73.232.0 - 178.73.232.31 gb -178.73.232.32 - 178.73.232.47 nl -178.73.232.48 - 178.73.232.63 de -178.73.232.64 - 178.73.232.79 dk -178.73.232.80 - 178.73.232.95 es -178.73.232.96 - 178.73.232.99 fr -178.73.232.100 - 178.73.232.255 se -178.73.233.0 - 178.73.233.31 gb -178.73.233.32 - 178.73.233.47 nl -178.73.233.48 - 178.73.233.63 de -178.73.233.64 - 178.73.233.79 dk -178.73.233.80 - 178.73.233.95 es -178.73.233.96 - 178.73.233.99 fr -178.73.233.100 - 178.73.233.255 se -178.73.234.0 - 178.73.234.31 gb -178.73.234.32 - 178.73.234.47 nl -178.73.234.48 - 178.73.234.63 de -178.73.234.64 - 178.73.234.79 dk -178.73.234.80 - 178.73.234.95 es -178.73.234.96 - 178.73.234.99 fr -178.73.234.100 - 178.73.234.255 se -178.73.235.0 - 178.73.235.31 gb -178.73.235.32 - 178.73.235.47 nl -178.73.235.48 - 178.73.235.63 de -178.73.235.64 - 178.73.235.79 dk -178.73.235.80 - 178.73.235.95 es -178.73.235.96 - 178.73.235.99 fr -178.73.235.100 - 178.73.235.255 se -178.73.236.0 - 178.73.236.31 gb -178.73.236.32 - 178.73.236.47 nl -178.73.236.48 - 178.73.236.63 de -178.73.236.64 - 178.73.236.79 dk -178.73.236.80 - 178.73.236.95 es -178.73.236.96 - 178.73.236.99 fr -178.73.236.100 - 178.73.236.255 se -178.73.237.0 - 178.73.237.31 gb -178.73.237.32 - 178.73.237.47 nl -178.73.237.48 - 178.73.237.63 de -178.73.237.64 - 178.73.237.79 dk -178.73.237.80 - 178.73.237.95 es -178.73.237.96 - 178.73.237.99 fr -178.73.237.100 - 178.73.237.255 se -178.73.238.0 - 178.73.238.31 gb -178.73.238.32 - 178.73.238.47 nl -178.73.238.48 - 178.73.238.63 de -178.73.238.64 - 178.73.238.79 dk -178.73.238.80 - 178.73.238.95 es -178.73.238.96 - 178.73.238.99 fr -178.73.238.100 - 178.73.238.255 se -178.73.239.0 - 178.73.239.31 gb -178.73.239.32 - 178.73.239.47 nl -178.73.239.48 - 178.73.239.63 de -178.73.239.64 - 178.73.239.79 dk -178.73.239.80 - 178.73.239.95 es -178.73.239.96 - 178.73.239.99 fr -178.73.239.100 - 178.73.239.255 se -178.73.240.0 - 178.73.240.31 gb -178.73.240.32 - 178.73.240.47 nl -178.73.240.48 - 178.73.240.63 de -178.73.240.64 - 178.73.240.79 dk -178.73.240.80 - 178.73.240.95 es -178.73.240.96 - 178.73.240.99 fr -178.73.240.100 - 178.73.240.255 se -178.73.241.0 - 178.73.241.31 gb -178.73.241.32 - 178.73.241.47 nl -178.73.241.48 - 178.73.241.63 de -178.73.241.64 - 178.73.241.79 dk -178.73.241.80 - 178.73.241.95 es -178.73.241.96 - 178.73.241.99 fr -178.73.241.100 - 178.73.241.255 se -178.73.242.0 - 178.73.242.31 gb -178.73.242.32 - 178.73.242.47 nl -178.73.242.48 - 178.73.242.63 de -178.73.242.64 - 178.73.242.79 dk -178.73.242.80 - 178.73.242.95 es -178.73.242.96 - 178.73.242.99 fr -178.73.242.100 - 178.73.242.255 se -178.73.243.0 - 178.73.243.31 gb -178.73.243.32 - 178.73.243.47 nl -178.73.243.48 - 178.73.243.63 de -178.73.243.64 - 178.73.243.79 dk -178.73.243.80 - 178.73.243.95 es -178.73.243.96 - 178.73.243.99 fr -178.73.243.100 - 178.73.243.255 se -178.73.244.0 - 178.73.244.31 gb -178.73.244.32 - 178.73.244.47 nl -178.73.244.48 - 178.73.244.63 de -178.73.244.64 - 178.73.244.79 dk -178.73.244.80 - 178.73.244.95 es -178.73.244.96 - 178.73.244.99 fr -178.73.244.100 - 178.73.244.255 se -178.73.245.0 - 178.73.245.31 gb -178.73.245.32 - 178.73.245.47 nl -178.73.245.48 - 178.73.245.63 de -178.73.245.64 - 178.73.245.79 dk -178.73.245.80 - 178.73.245.95 es -178.73.245.96 - 178.73.245.99 fr -178.73.245.100 - 178.73.245.255 se -178.73.246.0 - 178.73.246.31 gb -178.73.246.32 - 178.73.246.47 nl -178.73.246.48 - 178.73.246.63 de -178.73.246.64 - 178.73.246.79 dk -178.73.246.80 - 178.73.246.95 es -178.73.246.96 - 178.73.246.99 fr -178.73.246.100 - 178.73.246.255 se +178.73.192.0 - 178.73.198.239 se +178.73.198.240 - 178.73.198.243 es +178.73.198.244 - 178.73.246.255 se 178.73.247.0 - 178.73.247.255 fi -178.73.248.0 - 178.73.248.191 dk -178.73.248.192 - 178.73.248.255 it -178.73.249.0 - 178.73.255.255 se +178.73.248.0 - 178.73.255.255 se 178.74.0.0 - 178.74.63.255 no 178.74.64.0 - 178.74.191.255 ru 178.74.192.0 - 178.74.255.255 ua @@ -81191,7 +60661,23 @@ 178.75.192.0 - 178.75.255.255 bg 178.76.0.0 - 178.76.63.255 az 178.76.64.0 - 178.76.127.255 md -178.76.128.0 - 178.76.191.255 de +178.76.128.0 - 178.76.131.255 de +178.76.132.0 - 178.76.133.255 us +178.76.134.0 - 178.76.140.255 de +178.76.141.0 - 178.76.141.255 us +178.76.142.0 - 178.76.146.255 de +178.76.147.0 - 178.76.147.255 us +178.76.148.0 - 178.76.149.255 de +178.76.150.0 - 178.76.153.255 us +178.76.154.0 - 178.76.159.255 de +178.76.160.0 - 178.76.160.255 us +178.76.161.0 - 178.76.165.255 de +178.76.166.0 - 178.76.166.255 us +178.76.167.0 - 178.76.179.255 de +178.76.180.0 - 178.76.180.255 us +178.76.181.0 - 178.76.183.255 de +178.76.184.0 - 178.76.185.255 us +178.76.186.0 - 178.76.191.255 de 178.76.192.0 - 178.76.255.255 ru 178.77.0.0 - 178.77.63.255 ba 178.77.64.0 - 178.77.127.255 de @@ -81203,36 +60689,12 @@ 178.78.192.0 - 178.78.255.255 se 178.79.0.0 - 178.79.63.255 rs 178.79.64.0 - 178.79.127.255 si -178.79.128.0 - 178.79.193.255 gb -178.79.194.0 - 178.79.255.255 it +178.79.128.0 - 178.79.191.255 gb +178.79.192.0 - 178.79.255.255 it 178.80.0.0 - 178.81.255.255 sa 178.82.0.0 - 178.83.255.255 ch 178.84.0.0 - 178.85.255.255 nl -178.86.0.0 - 178.86.1.7 ua -178.86.1.8 - 178.86.1.15 na -178.86.1.16 - 178.86.2.7 ua -178.86.2.8 - 178.86.2.15 de -178.86.2.16 - 178.86.3.183 ua -178.86.3.184 - 178.86.3.191 na -178.86.3.192 - 178.86.5.15 ua -178.86.5.16 - 178.86.5.23 ru -178.86.5.24 - 178.86.7.199 ua -178.86.7.200 - 178.86.7.207 gl -178.86.7.208 - 178.86.8.0 ua -178.86.8.1 - 178.86.8.7 jp -178.86.8.8 - 178.86.8.15 ua -178.86.8.16 - 178.86.8.159 jp -178.86.8.160 - 178.86.8.167 ua -178.86.8.168 - 178.86.8.254 jp -178.86.8.255 - 178.86.10.255 ua -178.86.11.0 - 178.86.11.255 jp -178.86.12.0 - 178.86.14.255 ua -178.86.15.0 - 178.86.15.255 jp -178.86.16.0 - 178.86.20.255 ua -178.86.21.0 - 178.86.21.255 jp -178.86.22.0 - 178.86.22.255 ua -178.86.23.0 - 178.86.23.255 jp -178.86.24.0 - 178.87.255.255 ua +178.86.0.0 - 178.87.255.255 sa 178.88.0.0 - 178.91.255.255 kz 178.92.0.0 - 178.95.255.255 ua 178.96.0.0 - 178.111.255.255 gb @@ -81249,8 +60711,7 @@ 178.132.48.0 - 178.132.55.255 tr 178.132.56.0 - 178.132.63.255 es 178.132.64.0 - 178.132.71.255 de -178.132.72.0 - 178.132.72.255 mt -178.132.73.0 - 178.132.79.255 se +178.132.72.0 - 178.132.79.255 se 178.132.80.0 - 178.132.87.255 bg 178.132.88.0 - 178.132.95.255 it 178.132.96.0 - 178.132.103.255 ru @@ -81259,7 +60720,9 @@ 178.132.192.0 - 178.132.199.255 es 178.132.200.0 - 178.132.207.255 ru 178.132.208.0 - 178.132.215.255 nl -178.132.216.0 - 178.132.223.255 al +178.132.216.0 - 178.132.216.65 al +178.132.216.66 - 178.132.216.66 rs +178.132.216.67 - 178.132.223.255 al 178.132.224.0 - 178.132.239.255 dk 178.132.240.0 - 178.132.247.255 de 178.132.248.0 - 178.132.255.255 se @@ -81289,119 +60752,27 @@ 178.157.128.0 - 178.157.191.255 ru 178.157.192.0 - 178.157.255.255 dk 178.158.0.0 - 178.158.255.255 ua -178.159.0.0 - 178.159.15.255 nl +178.159.0.0 - 178.159.15.255 gb 178.159.16.0 - 178.159.31.255 ru 178.159.32.0 - 178.159.47.255 ua 178.159.48.0 - 178.159.63.255 ru 178.159.64.0 - 178.159.79.255 ro 178.159.80.0 - 178.159.95.255 ru -178.159.96.0 - 178.159.127.255 ua +178.159.96.0 - 178.159.112.255 ua +178.159.113.0 - 178.159.127.255 ru 178.159.128.0 - 178.159.143.255 pl 178.159.144.0 - 178.159.159.255 ro 178.159.160.0 - 178.159.175.255 pl 178.159.176.0 - 178.159.191.255 ua 178.159.192.0 - 178.159.207.255 pl 178.159.208.0 - 178.159.239.255 ua -178.159.240.0 - 178.159.255.255 ru +178.159.240.0 - 178.159.247.255 by +178.159.248.0 - 178.159.255.255 ru 178.160.0.0 - 178.160.127.255 hr 178.160.128.0 - 178.160.255.255 am 178.161.0.0 - 178.161.127.255 kw 178.161.128.0 - 178.162.127.255 ru -178.162.128.0 - 178.162.131.127 de -178.162.131.128 - 178.162.131.255 us -178.162.132.0 - 178.162.132.255 bz -178.162.133.0 - 178.162.134.63 de -178.162.134.64 - 178.162.134.127 bz -178.162.134.128 - 178.162.134.191 by -178.162.134.192 - 178.162.134.255 ru -178.162.135.0 - 178.162.136.31 de -178.162.136.32 - 178.162.136.63 ca -178.162.136.64 - 178.162.136.191 de -178.162.136.192 - 178.162.136.255 ru -178.162.137.0 - 178.162.137.31 de -178.162.137.32 - 178.162.137.95 ru -178.162.137.96 - 178.162.137.223 ua -178.162.137.224 - 178.162.138.31 de -178.162.138.32 - 178.162.138.159 ua -178.162.138.160 - 178.162.138.223 ru -178.162.138.224 - 178.162.138.255 de -178.162.139.0 - 178.162.139.255 cn -178.162.140.0 - 178.162.143.255 de -178.162.144.0 - 178.162.144.127 ua -178.162.144.128 - 178.162.145.63 de -178.162.145.64 - 178.162.145.127 ca -178.162.145.128 - 178.162.145.255 ua -178.162.146.0 - 178.162.146.63 de -178.162.146.64 - 178.162.146.255 ru -178.162.147.0 - 178.162.148.191 de -178.162.148.192 - 178.162.148.255 il -178.162.149.0 - 178.162.149.127 in -178.162.149.128 - 178.162.149.255 de -178.162.150.0 - 178.162.150.255 gb -178.162.151.0 - 178.162.152.255 de -178.162.153.0 - 178.162.153.255 ru -178.162.154.0 - 178.162.154.127 de -178.162.154.128 - 178.162.154.255 ca -178.162.155.0 - 178.162.156.255 de -178.162.157.0 - 178.162.157.255 bz -178.162.158.0 - 178.162.158.255 tr -178.162.159.0 - 178.162.163.63 de -178.162.163.64 - 178.162.163.127 ru -178.162.163.128 - 178.162.163.191 de -178.162.163.192 - 178.162.163.255 ru -178.162.164.0 - 178.162.164.23 de -178.162.164.24 - 178.162.164.31 nl -178.162.164.32 - 178.162.164.63 ca -178.162.164.64 - 178.162.164.127 ru -178.162.164.128 - 178.162.166.255 de -178.162.167.0 - 178.162.167.255 bz -178.162.168.0 - 178.162.168.255 ca -178.162.169.0 - 178.162.169.63 de -178.162.169.64 - 178.162.169.127 ru -178.162.169.128 - 178.162.169.255 de -178.162.170.0 - 178.162.170.255 bz -178.162.171.0 - 178.162.171.127 gb -178.162.171.128 - 178.162.172.63 de -178.162.172.64 - 178.162.172.127 gr -178.162.172.128 - 178.162.172.255 gb -178.162.173.0 - 178.162.173.255 bz -178.162.174.0 - 178.162.175.255 de -178.162.176.0 - 178.162.176.255 tr -178.162.177.0 - 178.162.177.63 de -178.162.177.64 - 178.162.177.127 tr -178.162.177.128 - 178.162.177.255 ru -178.162.178.0 - 178.162.183.127 de -178.162.183.128 - 178.162.183.255 lt -178.162.184.0 - 178.162.184.63 de -178.162.184.64 - 178.162.184.127 ru -178.162.184.128 - 178.162.184.255 lt -178.162.185.0 - 178.162.186.63 de -178.162.186.64 - 178.162.186.127 ru -178.162.186.128 - 178.162.223.255 de -178.162.224.0 - 178.162.225.255 gb -178.162.226.0 - 178.162.226.255 tr -178.162.227.0 - 178.162.228.63 de -178.162.228.64 - 178.162.228.255 us -178.162.229.0 - 178.162.230.255 de -178.162.231.0 - 178.162.231.255 ca -178.162.232.0 - 178.162.232.47 de -178.162.232.48 - 178.162.232.63 se -178.162.232.64 - 178.162.232.127 de -178.162.232.128 - 178.162.232.191 ca -178.162.232.192 - 178.162.237.127 de -178.162.237.128 - 178.162.237.191 gb -178.162.237.192 - 178.162.238.31 de -178.162.238.32 - 178.162.238.95 nl -178.162.238.96 - 178.162.238.159 sg -178.162.238.160 - 178.162.240.31 de -178.162.240.32 - 178.162.240.63 tr -178.162.240.64 - 178.162.240.127 de -178.162.240.128 - 178.162.241.255 bz -178.162.242.0 - 178.162.242.63 de -178.162.242.64 - 178.162.242.191 in -178.162.242.192 - 178.162.245.255 de -178.162.246.0 - 178.162.246.255 tr -178.162.247.0 - 178.162.255.255 de +178.162.128.0 - 178.162.255.255 de 178.163.0.0 - 178.163.127.255 ru 178.163.128.0 - 178.163.255.255 by 178.164.0.0 - 178.164.127.255 no @@ -81415,20 +60786,52 @@ 178.168.128.0 - 178.168.255.255 by 178.169.0.0 - 178.169.127.255 ru 178.169.128.0 - 178.169.255.255 bg -178.170.0.0 - 178.170.4.255 fr -178.170.5.0 - 178.170.5.63 bh -178.170.5.64 - 178.170.127.255 fr -178.170.128.0 - 178.170.165.255 ru -178.170.166.0 - 178.170.166.255 ua -178.170.167.0 - 178.171.127.255 ru +178.170.0.0 - 178.170.81.255 fr +178.170.82.0 - 178.170.82.255 gb +178.170.83.0 - 178.170.83.255 es +178.170.84.0 - 178.170.84.255 it +178.170.85.0 - 178.170.85.255 de +178.170.86.0 - 178.170.87.255 pt +178.170.88.0 - 178.170.88.255 de +178.170.89.0 - 178.170.89.255 it +178.170.90.0 - 178.170.90.255 es +178.170.91.0 - 178.170.91.255 gb +178.170.92.0 - 178.170.108.129 fr +178.170.108.130 - 178.170.108.130 it +178.170.108.131 - 178.170.108.131 es +178.170.108.132 - 178.170.108.132 de +178.170.108.133 - 178.170.108.133 pt +178.170.108.134 - 178.170.108.134 be +178.170.108.135 - 178.170.108.135 lu +178.170.108.136 - 178.170.108.136 at +178.170.108.137 - 178.170.108.137 nl +178.170.108.138 - 178.170.108.138 ie +178.170.108.139 - 178.170.117.163 fr +178.170.117.164 - 178.170.117.164 gb +178.170.117.165 - 178.170.127.255 fr +178.170.128.0 - 178.170.135.255 de +178.170.136.0 - 178.170.137.255 nl +178.170.138.0 - 178.170.138.255 mt +178.170.139.0 - 178.170.139.255 us +178.170.140.0 - 178.170.140.255 uy +178.170.141.0 - 178.170.142.255 in +178.170.143.0 - 178.170.143.255 pk +178.170.144.0 - 178.170.144.255 it +178.170.145.0 - 178.170.145.255 be +178.170.146.0 - 178.170.146.255 no +178.170.147.0 - 178.170.147.255 nl +178.170.148.0 - 178.170.151.255 de +178.170.152.0 - 178.170.155.255 nl +178.170.156.0 - 178.170.159.255 tr +178.170.160.0 - 178.171.127.255 ru 178.171.128.0 - 178.171.255.255 sy 178.172.0.0 - 178.172.127.255 si 178.172.128.0 - 178.172.255.255 by 178.173.0.0 - 178.173.127.255 ru 178.173.128.0 - 178.173.255.255 ir -178.174.0.0 - 178.174.127.255 de +178.174.0.0 - 178.174.127.255 ch 178.174.128.0 - 178.174.255.255 se -178.175.0.0 - 178.175.127.255 rs +178.175.0.0 - 178.175.127.255 al 178.175.128.0 - 178.175.255.255 md 178.176.0.0 - 178.179.255.255 ru 178.180.0.0 - 178.183.255.255 pl @@ -81438,23 +60841,13 @@ 178.200.0.0 - 178.203.255.255 de 178.204.0.0 - 178.207.255.255 ru 178.208.0.0 - 178.208.31.255 fr -178.208.32.0 - 178.208.38.31 be -178.208.38.32 - 178.208.38.47 gb -178.208.38.48 - 178.208.38.63 be -178.208.38.64 - 178.208.38.79 cz -178.208.38.80 - 178.208.38.95 nl -178.208.38.96 - 178.208.50.255 be -178.208.51.0 - 178.208.51.7 fr -178.208.51.8 - 178.208.51.15 be -178.208.51.16 - 178.208.51.255 nl -178.208.52.0 - 178.208.58.255 be -178.208.59.0 - 178.208.63.255 nl +178.208.32.0 - 178.208.51.13 nl +178.208.51.14 - 178.208.51.14 be +178.208.51.15 - 178.208.63.255 nl 178.208.64.0 - 178.208.95.255 ru 178.208.96.0 - 178.208.127.255 de 178.208.128.0 - 178.208.159.255 ru -178.208.160.0 - 178.208.175.255 gb -178.208.176.0 - 178.208.183.255 us -178.208.184.0 - 178.208.191.255 gb +178.208.160.0 - 178.208.191.255 gb 178.208.192.0 - 178.208.223.255 gi 178.208.224.0 - 178.208.255.255 ru 178.209.0.0 - 178.209.31.255 ba @@ -81500,14 +60893,22 @@ 178.212.216.0 - 178.212.223.255 pl 178.212.224.0 - 178.212.231.255 ru 178.212.232.0 - 178.212.247.255 ua -178.212.248.0 - 178.212.255.255 ro +178.212.248.0 - 178.212.251.255 ru +178.212.252.0 - 178.212.253.255 lv +178.212.254.0 - 178.212.254.255 ch +178.212.255.0 - 178.212.255.255 de 178.213.0.0 - 178.213.7.255 ua 178.213.8.0 - 178.213.39.255 ru 178.213.40.0 - 178.213.47.255 cz 178.213.48.0 - 178.213.55.255 lv 178.213.56.0 - 178.213.63.255 pl 178.213.64.0 - 178.213.71.255 fr -178.213.72.0 - 178.213.87.255 ru +178.213.72.0 - 178.213.72.255 pl +178.213.73.0 - 178.213.73.255 gb +178.213.74.0 - 178.213.74.255 de +178.213.75.0 - 178.213.75.255 ru +178.213.76.0 - 178.213.77.255 de +178.213.78.0 - 178.213.87.255 ru 178.213.88.0 - 178.213.103.255 pl 178.213.104.0 - 178.213.111.255 ua 178.213.112.0 - 178.213.119.255 ru @@ -81536,12 +60937,12 @@ 178.215.64.0 - 178.215.127.255 ru 178.215.128.0 - 178.215.143.255 gb 178.215.144.0 - 178.215.159.255 ru -178.215.160.0 - 178.215.175.255 ua +178.215.160.0 - 178.215.191.255 ua 178.215.192.0 - 178.215.207.255 pl 178.215.208.0 - 178.215.223.255 ps 178.215.224.0 - 178.216.23.255 ua 178.216.24.0 - 178.216.31.255 pl -178.216.32.0 - 178.216.39.255 ua +178.216.32.0 - 178.216.39.255 ru 178.216.40.0 - 178.216.47.255 pl 178.216.48.0 - 178.216.55.255 se 178.216.56.0 - 178.216.63.255 si @@ -81573,7 +60974,6 @@ 178.217.32.0 - 178.217.39.255 pl 178.217.40.0 - 178.217.79.255 ru 178.217.80.0 - 178.217.87.255 nl -178.217.88.0 - 178.217.95.255 ro 178.217.96.0 - 178.217.111.255 ru 178.217.112.0 - 178.217.119.255 pl 178.217.120.0 - 178.217.127.255 ru @@ -81584,11 +60984,14 @@ 178.217.160.0 - 178.217.167.255 ua 178.217.168.0 - 178.217.175.255 kg 178.217.176.0 - 178.217.183.255 ru -178.217.184.0 - 178.217.199.255 pl +178.217.184.0 - 178.217.184.66 pl +178.217.184.67 - 178.217.184.67 pt +178.217.184.68 - 178.217.185.121 pl +178.217.185.122 - 178.217.185.122 pt +178.217.185.123 - 178.217.199.255 pl 178.217.200.0 - 178.217.215.255 ua 178.217.216.0 - 178.217.223.255 pl 178.217.224.0 - 178.217.231.255 ru -178.217.232.0 - 178.217.239.255 ro 178.217.240.0 - 178.217.247.255 cz 178.217.248.0 - 178.217.255.255 pl 178.218.0.0 - 178.218.63.255 ru @@ -81597,20 +61000,18 @@ 178.218.128.0 - 178.218.143.255 ro 178.218.144.0 - 178.218.159.255 ru 178.218.160.0 - 178.218.175.255 hr -178.218.176.0 - 178.218.207.255 ro +178.218.176.0 - 178.218.191.255 sa +178.218.200.0 - 178.218.207.255 uz 178.218.208.0 - 178.218.223.255 ru 178.218.224.0 - 178.218.239.255 pl -178.218.240.0 - 178.218.255.255 ua 178.219.0.0 - 178.219.15.255 rs 178.219.16.0 - 178.219.31.255 pl 178.219.32.0 - 178.219.47.255 ru 178.219.48.0 - 178.219.63.255 am -178.219.64.0 - 178.219.79.255 a2 +178.219.64.0 - 178.219.79.255 it 178.219.80.0 - 178.219.95.255 ua 178.219.96.0 - 178.219.143.255 pl -178.219.144.0 - 178.219.159.255 ru -178.219.160.0 - 178.219.175.255 ua -178.219.176.0 - 178.219.191.255 ru +178.219.144.0 - 178.219.191.255 ru 178.219.192.0 - 178.219.207.255 ua 178.219.208.0 - 178.219.223.255 ru 178.219.224.0 - 178.219.239.255 ir @@ -81625,57 +61026,14 @@ 178.236.16.0 - 178.236.31.255 ru 178.236.32.0 - 178.236.47.255 ir 178.236.48.0 - 178.236.63.255 ge -178.236.64.0 - 178.236.65.63 se -178.236.65.64 - 178.236.65.159 gb -178.236.65.160 - 178.236.65.191 us -178.236.65.192 - 178.236.70.0 se -178.236.70.1 - 178.236.70.32 us -178.236.70.33 - 178.236.70.63 se -178.236.70.64 - 178.236.70.127 de -178.236.70.128 - 178.236.70.191 gb -178.236.70.192 - 178.236.71.0 se -178.236.71.1 - 178.236.71.32 us -178.236.71.33 - 178.236.71.63 se -178.236.71.64 - 178.236.71.127 de -178.236.71.128 - 178.236.71.191 gb -178.236.71.192 - 178.236.76.0 se -178.236.76.1 - 178.236.76.32 gb -178.236.76.33 - 178.236.76.95 se -178.236.76.96 - 178.236.76.127 gb -178.236.76.128 - 178.236.76.159 it -178.236.76.160 - 178.236.76.191 fr -178.236.76.192 - 178.236.76.223 us -178.236.76.224 - 178.236.76.231 se -178.236.76.232 - 178.236.76.239 it -178.236.76.240 - 178.236.77.0 se -178.236.77.1 - 178.236.77.32 gb -178.236.77.33 - 178.236.77.95 se -178.236.77.96 - 178.236.77.127 gb -178.236.77.128 - 178.236.77.159 it -178.236.77.160 - 178.236.77.191 fr -178.236.77.192 - 178.236.77.223 us -178.236.77.224 - 178.236.77.231 se -178.236.77.232 - 178.236.77.239 it -178.236.77.240 - 178.236.78.0 se -178.236.78.1 - 178.236.78.32 gb -178.236.78.33 - 178.236.78.95 se -178.236.78.96 - 178.236.78.127 gb -178.236.78.128 - 178.236.78.159 it -178.236.78.160 - 178.236.78.191 fr -178.236.78.192 - 178.236.78.223 us -178.236.78.224 - 178.236.78.255 it -178.236.79.0 - 178.236.79.31 gb -178.236.79.32 - 178.236.79.95 se -178.236.79.96 - 178.236.79.127 gb -178.236.79.128 - 178.236.79.159 it -178.236.79.160 - 178.236.79.191 fr -178.236.79.192 - 178.236.79.223 us -178.236.79.224 - 178.236.79.255 se +178.236.64.0 - 178.236.79.255 se 178.236.80.0 - 178.236.95.255 ba 178.236.96.0 - 178.236.111.255 ru 178.236.112.0 - 178.236.127.255 es -178.236.128.0 - 178.236.137.255 ru -178.236.138.0 - 178.236.139.255 gb +178.236.128.0 - 178.236.135.255 ru +178.236.136.0 - 178.236.137.222 gb +178.236.137.223 - 178.236.137.223 ru +178.236.137.224 - 178.236.139.255 gb 178.236.140.0 - 178.236.143.255 ru 178.236.144.0 - 178.236.159.255 gb 178.236.160.0 - 178.236.175.255 it @@ -81686,120 +61044,32 @@ 178.236.200.0 - 178.236.203.255 ee 178.236.204.0 - 178.236.207.255 lt 178.236.208.0 - 178.236.223.255 ru -178.236.224.0 - 178.236.225.255 fr -178.236.226.0 - 178.236.226.3 us -178.236.226.4 - 178.236.226.7 cn -178.236.226.8 - 178.236.226.11 jp -178.236.226.12 - 178.236.226.15 de -178.236.226.16 - 178.236.226.19 fr -178.236.226.20 - 178.236.226.23 gb -178.236.226.24 - 178.236.226.27 br -178.236.226.28 - 178.236.226.31 it -178.236.226.32 - 178.236.226.35 fr -178.236.226.36 - 178.236.226.39 in -178.236.226.40 - 178.236.226.43 ru -178.236.226.44 - 178.236.226.47 es -178.236.226.48 - 178.236.226.51 au -178.236.226.52 - 178.236.226.55 mx -178.236.226.56 - 178.236.226.59 kr -178.236.226.60 - 178.236.226.63 fr -178.236.226.64 - 178.236.226.67 tr -178.236.226.68 - 178.236.226.71 id -178.236.226.72 - 178.236.226.75 ch -178.236.226.76 - 178.236.226.79 pl -178.236.226.80 - 178.236.226.83 be -178.236.226.84 - 178.236.226.87 se -178.236.226.88 - 178.236.226.91 sa -178.236.226.92 - 178.236.226.95 tw -178.236.226.96 - 178.236.226.99 sj -178.236.226.100 - 178.236.226.103 at -178.236.226.104 - 178.236.226.107 ar -178.236.226.108 - 178.236.226.111 za -178.236.226.112 - 178.236.226.115 ir -178.236.226.116 - 178.236.226.119 th -178.236.226.120 - 178.236.226.123 dk -178.236.226.124 - 178.236.226.127 gr -178.236.226.128 - 178.236.226.131 ae -178.236.226.132 - 178.236.226.135 ve -178.236.226.136 - 178.236.226.139 cd -178.236.226.140 - 178.236.226.143 fi -178.236.226.144 - 178.236.226.147 my -178.236.226.148 - 178.236.226.151 pt -178.236.226.152 - 178.236.226.155 hk -178.236.226.156 - 178.236.226.159 sg -178.236.226.160 - 178.236.226.163 eg -178.236.226.164 - 178.236.226.167 ng -178.236.226.168 - 178.236.226.171 il -178.236.226.172 - 178.236.226.175 ie -178.236.226.176 - 178.236.226.179 cl -178.236.226.180 - 178.236.226.183 cz -178.236.226.184 - 178.236.226.187 ph -178.236.226.188 - 178.236.226.191 pk -178.236.226.192 - 178.236.226.195 ro -178.236.226.196 - 178.236.226.199 dz -178.236.226.200 - 178.236.226.203 pe -178.236.226.204 - 178.236.226.207 nz -178.236.226.208 - 178.236.226.211 kz -178.236.226.212 - 178.236.226.215 ua -178.236.226.216 - 178.236.226.219 kw -178.236.226.220 - 178.236.226.223 qa -178.236.226.224 - 178.236.226.227 hu -178.236.226.228 - 178.236.226.231 bd -178.236.226.232 - 178.236.226.235 vn -178.236.226.236 - 178.236.226.239 ma -178.236.226.240 - 178.236.226.243 sk -178.236.226.244 - 178.236.226.247 ao -178.236.226.248 - 178.236.226.251 iq -178.236.226.252 - 178.236.226.255 ly -178.236.227.0 - 178.236.227.255 ru -178.236.228.0 - 178.236.228.0 fr -178.236.228.1 - 178.236.229.31 sa -178.236.229.32 - 178.236.229.32 fr -178.236.229.33 - 178.236.229.128 ir -178.236.229.129 - 178.236.229.255 ye -178.236.230.0 - 178.236.230.63 ir -178.236.230.64 - 178.236.230.255 fr -178.236.231.0 - 178.236.231.255 ru -178.236.232.0 - 178.236.232.255 it -178.236.233.0 - 178.236.233.255 fr -178.236.234.0 - 178.236.234.255 de -178.236.235.0 - 178.236.235.255 es -178.236.236.0 - 178.236.236.255 gr -178.236.237.0 - 178.236.237.255 pl -178.236.238.0 - 178.236.238.255 pt -178.236.239.0 - 178.236.239.255 ro +178.236.224.0 - 178.236.239.255 fr 178.236.240.0 - 178.236.255.255 ru 178.237.0.0 - 178.237.15.255 it 178.237.16.0 - 178.237.31.255 ru -178.237.32.0 - 178.237.32.255 se -178.237.33.0 - 178.237.33.127 nl -178.237.33.128 - 178.237.33.159 us -178.237.33.160 - 178.237.34.255 nl -178.237.35.0 - 178.237.38.255 be -178.237.39.0 - 178.237.39.47 nl -178.237.39.48 - 178.237.39.63 us -178.237.39.64 - 178.237.39.79 ie -178.237.39.80 - 178.237.39.95 us -178.237.39.96 - 178.237.47.255 nl +178.237.32.0 - 178.237.47.255 nl 178.237.48.0 - 178.237.63.255 bh 178.237.64.0 - 178.237.79.255 az 178.237.80.0 - 178.237.95.255 ch 178.237.96.0 - 178.237.111.255 fr 178.237.112.0 - 178.237.127.255 gb 178.237.128.0 - 178.237.159.255 es -178.237.160.0 - 178.237.175.255 gb +178.237.160.0 - 178.237.168.255 gb +178.237.169.0 - 178.237.169.255 au +178.237.170.0 - 178.237.170.255 gb +178.237.171.0 - 178.237.171.255 au +178.237.172.0 - 178.237.175.255 gb 178.237.176.0 - 178.237.207.255 ru 178.237.208.0 - 178.237.223.255 rs 178.237.224.0 - 178.237.239.255 es 178.237.240.0 - 178.237.255.255 ru -178.238.0.0 - 178.238.15.255 by 178.238.16.0 - 178.238.31.255 ru 178.238.32.0 - 178.238.47.255 cz 178.238.48.0 - 178.238.63.255 it 178.238.64.0 - 178.238.79.255 kz 178.238.80.0 - 178.238.95.255 gb -178.238.96.0 - 178.238.103.255 nl -178.238.104.0 - 178.238.111.255 be +178.238.96.0 - 178.238.111.255 nl 178.238.112.0 - 178.238.127.255 ru 178.238.128.0 - 178.238.159.255 gb 178.238.160.0 - 178.238.175.255 ch @@ -81810,9 +61080,9 @@ 178.238.240.0 - 178.239.15.255 pl 178.239.16.0 - 178.239.31.255 ba 178.239.32.0 - 178.239.47.255 it -178.239.48.0 - 178.239.49.191 nl -178.239.49.192 - 178.239.49.207 us -178.239.49.208 - 178.239.63.255 nl +178.239.48.0 - 178.239.53.151 nl +178.239.53.152 - 178.239.53.159 mt +178.239.53.160 - 178.239.63.255 nl 178.239.64.0 - 178.239.79.255 de 178.239.80.0 - 178.239.111.255 gb 178.239.112.0 - 178.239.127.255 bg @@ -81822,9 +61092,7 @@ 178.239.176.0 - 178.239.191.255 it 178.239.192.0 - 178.239.207.255 fi 178.239.208.0 - 178.239.223.255 es -178.239.224.0 - 178.239.225.255 bg -178.239.226.0 - 178.239.226.255 rs -178.239.227.0 - 178.239.239.255 bg +178.239.224.0 - 178.239.239.255 bg 178.239.240.0 - 178.239.255.255 es 178.240.0.0 - 178.247.255.255 tr 178.248.0.0 - 178.248.7.255 ru @@ -81838,22 +61106,11 @@ 178.248.64.0 - 178.248.71.255 ru 178.248.72.0 - 178.248.79.255 pl 178.248.80.0 - 178.248.87.255 ru -178.248.88.0 - 178.248.88.7 gb -178.248.88.8 - 178.248.88.47 it -178.248.88.48 - 178.248.88.63 gb -178.248.88.64 - 178.248.88.79 it -178.248.88.80 - 178.248.88.87 gb -178.248.88.88 - 178.248.88.111 it -178.248.88.112 - 178.248.88.127 gb -178.248.88.128 - 178.248.88.143 it -178.248.88.144 - 178.248.88.183 gb -178.248.88.184 - 178.248.88.199 it -178.248.88.200 - 178.248.88.207 gb -178.248.88.208 - 178.248.95.255 it +178.248.88.0 - 178.248.95.255 it 178.248.96.0 - 178.248.103.255 no -178.248.104.0 - 178.248.113.247 gb -178.248.113.248 - 178.248.113.255 us -178.248.114.0 - 178.248.119.255 gb +178.248.104.0 - 178.248.116.255 gb +178.248.117.0 - 178.248.117.255 sa +178.248.118.0 - 178.248.119.255 gb 178.248.120.0 - 178.248.127.255 no 178.248.128.0 - 178.248.135.255 gb 178.248.136.0 - 178.248.143.255 ee @@ -81873,17 +61130,13 @@ 178.249.0.0 - 178.249.7.255 de 178.249.8.0 - 178.249.15.255 es 178.249.16.0 - 178.249.23.255 ge -178.249.24.0 - 178.249.24.143 de -178.249.24.144 - 178.249.24.151 ch -178.249.24.152 - 178.249.27.127 de -178.249.27.128 - 178.249.27.159 us -178.249.27.160 - 178.249.31.255 de +178.249.24.0 - 178.249.31.255 de 178.249.32.0 - 178.249.39.255 lv 178.249.40.0 - 178.249.47.255 gb 178.249.48.0 - 178.249.55.255 dk 178.249.56.0 - 178.249.79.255 ru -178.249.80.0 - 178.249.86.255 de -178.249.87.0 - 178.249.87.255 ch +178.249.80.0 - 178.249.87.255 de +178.249.88.0 - 178.249.95.255 pl 178.249.96.0 - 178.249.99.255 gb 178.249.100.0 - 178.249.103.255 nl 178.249.104.0 - 178.249.111.255 il @@ -81893,14 +61146,14 @@ 178.249.136.0 - 178.249.143.255 de 178.249.144.0 - 178.249.151.255 se 178.249.152.0 - 178.249.159.255 nl -178.249.160.0 - 178.249.167.255 de +178.249.160.0 - 178.249.167.255 fr 178.249.168.0 - 178.249.175.255 mk 178.249.176.0 - 178.249.183.255 kw 178.249.184.0 - 178.249.191.255 it 178.249.192.0 - 178.249.199.255 lu 178.249.200.0 - 178.249.207.255 it 178.249.208.0 - 178.249.215.255 cz -178.249.216.0 - 178.249.239.255 it +178.249.216.0 - 178.249.231.255 it 178.249.240.0 - 178.249.247.255 ru 178.249.248.0 - 178.249.255.255 nl 178.250.0.0 - 178.250.7.255 fr @@ -81910,11 +61163,7 @@ 178.250.32.0 - 178.250.39.255 lt 178.250.40.0 - 178.250.47.255 pl 178.250.48.0 - 178.250.55.255 gb -178.250.56.0 - 178.250.56.143 li -178.250.56.144 - 178.250.56.159 ch -178.250.56.160 - 178.250.57.31 li -178.250.57.32 - 178.250.57.63 us -178.250.57.64 - 178.250.63.255 li +178.250.56.0 - 178.250.63.255 li 178.250.64.0 - 178.250.71.255 it 178.250.72.0 - 178.250.79.255 gb 178.250.80.0 - 178.250.87.255 de @@ -81927,11 +61176,7 @@ 178.250.136.0 - 178.250.143.255 rs 178.250.144.0 - 178.250.151.255 nl 178.250.152.0 - 178.250.159.255 ru -178.250.160.0 - 178.250.168.199 de -178.250.168.200 - 178.250.168.207 nl -178.250.168.208 - 178.250.168.255 de -178.250.169.0 - 178.250.169.7 nl -178.250.169.8 - 178.250.175.255 de +178.250.160.0 - 178.250.175.255 de 178.250.176.0 - 178.250.183.255 gb 178.250.184.0 - 178.250.191.255 ro 178.250.192.0 - 178.250.199.255 nl @@ -81946,8 +61191,8 @@ 178.251.16.0 - 178.251.23.255 fr 178.251.24.0 - 178.251.31.255 nl 178.251.32.0 - 178.251.39.255 gb -178.251.40.0 - 178.251.46.255 tr -178.251.47.0 - 178.251.55.255 de +178.251.40.0 - 178.251.47.255 tr +178.251.48.0 - 178.251.55.255 de 178.251.56.0 - 178.251.63.255 fi 178.251.64.0 - 178.251.71.255 at 178.251.72.0 - 178.251.79.255 it @@ -81960,9 +61205,11 @@ 178.251.128.0 - 178.251.135.255 se 178.251.136.0 - 178.251.143.255 ru 178.251.144.0 - 178.251.159.255 fi -178.251.160.0 - 178.251.163.175 lu -178.251.163.176 - 178.251.163.191 us -178.251.163.192 - 178.251.167.255 lu +178.251.160.0 - 178.251.160.119 be +178.251.160.120 - 178.251.160.123 lu +178.251.160.124 - 178.251.165.95 be +178.251.165.96 - 178.251.165.111 lu +178.251.165.112 - 178.251.167.255 be 178.251.168.0 - 178.251.183.255 gb 178.251.184.0 - 178.251.191.255 cz 178.251.192.0 - 178.251.199.255 nl @@ -81986,14 +61233,9 @@ 178.254.128.0 - 178.254.191.255 rs 178.254.192.0 - 178.254.255.255 bg 178.255.0.0 - 178.255.7.255 de -178.255.8.0 - 178.255.8.255 mt -178.255.9.0 - 178.255.9.255 fi -178.255.10.0 - 178.255.10.63 ee -178.255.10.64 - 178.255.10.255 ph +178.255.8.0 - 178.255.10.255 ee 178.255.11.0 - 178.255.11.255 il -178.255.12.0 - 178.255.13.255 ee -178.255.14.0 - 178.255.14.255 gi -178.255.15.0 - 178.255.15.255 ee +178.255.12.0 - 178.255.15.255 ee 178.255.16.0 - 178.255.23.255 de 178.255.24.0 - 178.255.31.255 nl 178.255.32.0 - 178.255.39.255 ro @@ -82001,44 +61243,750 @@ 178.255.48.0 - 178.255.55.255 nl 178.255.56.0 - 178.255.71.255 gb 178.255.72.0 - 178.255.79.255 it -178.255.80.0 - 178.255.95.255 gb +178.255.80.0 - 178.255.85.255 gb +178.255.86.0 - 178.255.86.7 us +178.255.86.8 - 178.255.86.11 in +178.255.86.12 - 178.255.86.255 us +178.255.87.0 - 178.255.95.255 gb 178.255.96.0 - 178.255.103.255 fr 178.255.104.0 - 178.255.111.255 es -178.255.112.0 - 178.255.119.255 it 178.255.120.0 - 178.255.127.255 ru 178.255.128.0 - 178.255.135.255 fr 178.255.136.0 - 178.255.143.255 de 178.255.144.0 - 178.255.151.255 no -178.255.152.0 - 178.255.154.15 at -178.255.154.16 - 178.255.154.31 cz -178.255.154.32 - 178.255.155.63 at -178.255.155.64 - 178.255.155.127 it -178.255.155.128 - 178.255.155.255 at -178.255.156.0 - 178.255.156.15 cz -178.255.156.16 - 178.255.159.255 at +178.255.152.0 - 178.255.152.255 at +178.255.153.0 - 178.255.153.255 ch +178.255.154.0 - 178.255.154.255 cz +178.255.155.0 - 178.255.155.255 it +178.255.156.0 - 178.255.159.255 at 178.255.160.0 - 178.255.167.255 fr 178.255.168.0 - 178.255.175.255 cz 178.255.176.0 - 178.255.183.255 ua 178.255.184.0 - 178.255.191.255 it -178.255.192.0 - 178.255.199.12 nl -178.255.199.13 - 178.255.199.13 us -178.255.199.14 - 178.255.199.19 nl -178.255.199.20 - 178.255.199.21 us -178.255.199.22 - 178.255.199.255 nl -178.255.200.0 - 178.255.207.255 ru +178.255.192.0 - 178.255.199.255 nl +178.255.200.0 - 178.255.200.255 ru +178.255.201.0 - 178.255.207.255 nl 178.255.208.0 - 178.255.215.255 fr 178.255.216.0 - 178.255.223.255 it 178.255.224.0 - 178.255.231.255 es 178.255.232.0 - 178.255.239.255 ru 178.255.240.0 - 178.255.247.255 it 178.255.248.0 - 178.255.255.255 ru +179.0.0.0 - 179.0.1.255 ar +179.0.2.0 - 179.0.3.255 cl +179.0.4.0 - 179.0.7.255 ar +179.0.8.0 - 179.0.8.255 cl +179.0.9.0 - 179.0.10.255 co +179.0.11.0 - 179.0.11.255 ar +179.0.12.0 - 179.0.13.255 sv +179.0.14.0 - 179.0.14.255 ar +179.0.15.0 - 179.0.15.255 co +179.0.16.0 - 179.0.19.255 cl +179.0.20.0 - 179.0.23.255 cr +179.0.24.0 - 179.0.24.255 co +179.0.25.0 - 179.0.25.255 ar +179.0.26.0 - 179.0.26.255 py +179.0.27.0 - 179.0.27.255 co +179.0.28.0 - 179.0.28.255 tt +179.0.29.0 - 179.0.29.255 co +179.0.30.0 - 179.0.30.255 bo +179.0.31.0 - 179.0.31.255 hn +179.0.32.0 - 179.0.32.255 mx +179.0.33.0 - 179.0.33.255 cr +179.0.34.0 - 179.0.34.255 mx +179.0.35.0 - 179.0.38.255 cr +179.0.39.0 - 179.0.44.255 mx +179.0.45.0 - 179.0.46.255 cr +179.0.47.0 - 179.0.50.255 mx +179.0.51.0 - 179.0.51.255 cr +179.0.52.0 - 179.0.53.255 mx +179.0.54.0 - 179.0.56.255 cr +179.0.57.0 - 179.0.60.255 mx +179.0.61.0 - 179.0.62.255 cr +179.0.63.0 - 179.0.63.255 mx +179.0.64.0 - 179.0.65.255 hn +179.0.66.0 - 179.0.67.255 pa +179.0.68.0 - 179.0.69.255 hn +179.0.70.0 - 179.0.72.255 pa +179.0.73.0 - 179.0.73.255 hn +179.0.74.0 - 179.0.76.255 pa +179.0.77.0 - 179.0.77.255 hn +179.0.78.0 - 179.0.78.255 pa +179.0.79.0 - 179.0.85.255 hn +179.0.86.0 - 179.0.88.255 pa +179.0.89.0 - 179.0.95.255 hn +179.0.96.0 - 179.0.96.255 pa +179.0.97.0 - 179.0.98.255 gt +179.0.99.0 - 179.0.99.255 pa +179.0.100.0 - 179.0.102.255 gt +179.0.103.0 - 179.0.104.255 pa +179.0.105.0 - 179.0.105.255 gt +179.0.106.0 - 179.0.107.255 pa +179.0.108.0 - 179.0.111.255 gt +179.0.112.0 - 179.0.117.255 sv +179.0.118.0 - 179.0.119.255 pa +179.0.120.0 - 179.0.120.255 sv +179.0.121.0 - 179.0.121.255 pa +179.0.122.0 - 179.0.127.255 sv +179.0.128.0 - 179.0.128.255 cl +179.0.129.0 - 179.0.129.255 ec +179.0.130.0 - 179.0.145.255 ar +179.0.146.0 - 179.0.146.255 co +179.0.147.0 - 179.0.151.255 ar +179.0.152.0 - 179.0.152.255 cl +179.0.153.0 - 179.0.153.255 pe +179.0.154.0 - 179.0.154.255 co +179.0.155.0 - 179.0.155.255 cl +179.0.156.0 - 179.0.159.255 uy +179.0.160.0 - 179.0.191.255 cr +179.0.192.0 - 179.0.192.255 gt +179.0.193.0 - 179.0.193.255 ar +179.0.194.0 - 179.0.195.255 pa +179.0.196.0 - 179.0.199.255 tt +179.0.200.0 - 179.0.201.255 pa +179.0.202.0 - 179.0.202.255 cr +179.0.203.0 - 179.0.203.255 ar +179.0.204.0 - 179.0.204.255 ec +179.0.205.0 - 179.0.205.255 co +179.0.206.0 - 179.0.207.255 br +179.0.208.0 - 179.0.223.255 cr +179.0.224.0 - 179.0.255.255 ar +179.1.0.0 - 179.1.255.255 co +179.2.0.0 - 179.4.255.255 cl +179.5.0.0 - 179.5.255.255 sv +179.6.0.0 - 179.7.255.255 pe +179.8.0.0 - 179.9.255.255 cl +179.10.0.0 - 179.11.255.255 br +179.12.0.0 - 179.15.255.255 co +179.16.0.0 - 179.17.255.255 br +179.18.0.0 - 179.19.255.255 co +179.20.0.0 - 179.23.255.255 ve +179.24.0.0 - 179.31.255.255 uy +179.32.0.0 - 179.33.255.255 co +179.34.0.0 - 179.35.255.255 br +179.36.0.0 - 179.41.255.255 ar +179.42.0.0 - 179.42.4.255 pa +179.42.5.0 - 179.42.5.255 co +179.42.6.0 - 179.42.21.255 pa +179.42.22.0 - 179.42.22.255 co +179.42.23.0 - 179.42.27.255 pa +179.42.28.0 - 179.42.28.255 co +179.42.29.0 - 179.42.34.255 pa +179.42.35.0 - 179.42.35.255 co +179.42.36.0 - 179.42.49.255 pa +179.42.50.0 - 179.42.51.255 co +179.42.52.0 - 179.42.53.255 pa +179.42.54.0 - 179.42.54.255 co +179.42.55.0 - 179.42.61.255 pa +179.42.62.0 - 179.42.62.255 co +179.42.63.0 - 179.42.63.255 pa +179.42.64.0 - 179.42.67.255 co +179.42.68.0 - 179.42.68.255 pa +179.42.69.0 - 179.42.69.255 co +179.42.70.0 - 179.42.73.255 pa +179.42.74.0 - 179.42.75.255 co +179.42.76.0 - 179.42.76.255 pa +179.42.77.0 - 179.42.80.255 co +179.42.81.0 - 179.42.81.255 pa +179.42.82.0 - 179.42.84.255 co +179.42.85.0 - 179.42.87.255 pa +179.42.88.0 - 179.42.94.255 co +179.42.95.0 - 179.42.96.255 pa +179.42.97.0 - 179.42.102.255 co +179.42.103.0 - 179.42.104.255 pa +179.42.105.0 - 179.42.105.255 co +179.42.106.0 - 179.42.106.255 pa +179.42.107.0 - 179.42.107.255 co +179.42.108.0 - 179.42.110.255 pa +179.42.111.0 - 179.42.115.255 co +179.42.116.0 - 179.42.118.255 pa +179.42.119.0 - 179.42.121.255 co +179.42.122.0 - 179.42.122.255 pa +179.42.123.0 - 179.42.127.255 co +179.42.128.0 - 179.42.143.255 pa +179.42.144.0 - 179.42.144.255 co +179.42.145.0 - 179.42.145.255 pa +179.42.146.0 - 179.42.146.255 co +179.42.147.0 - 179.42.147.255 pa +179.42.148.0 - 179.42.148.255 co +179.42.149.0 - 179.42.150.255 pa +179.42.151.0 - 179.42.151.255 co +179.42.152.0 - 179.42.152.255 pa +179.42.153.0 - 179.42.153.255 co +179.42.154.0 - 179.42.154.255 pa +179.42.155.0 - 179.42.159.255 co +179.42.160.0 - 179.42.171.255 ar +179.42.172.0 - 179.42.175.255 co +179.42.176.0 - 179.42.191.255 ar +179.42.192.0 - 179.42.255.255 bz +179.43.0.0 - 179.43.63.255 cr +179.43.64.0 - 179.43.79.255 ar +179.43.80.0 - 179.43.99.255 pe +179.43.100.0 - 179.43.103.255 ar +179.43.104.0 - 179.43.111.255 co +179.43.112.0 - 179.43.127.255 ar +179.43.128.0 - 179.43.191.255 ch +179.43.192.0 - 179.43.255.255 do +179.44.0.0 - 179.47.255.255 ve +179.48.0.0 - 179.48.0.255 pa +179.48.1.0 - 179.48.1.255 ni +179.48.2.0 - 179.48.4.255 pa +179.48.5.0 - 179.48.5.255 ni +179.48.6.0 - 179.48.14.255 pa +179.48.15.0 - 179.48.15.255 ni +179.48.16.0 - 179.48.23.255 pa +179.48.24.0 - 179.48.24.255 ni +179.48.25.0 - 179.48.31.255 pa +179.48.32.0 - 179.48.32.255 ni +179.48.33.0 - 179.48.33.255 pa +179.48.34.0 - 179.48.34.255 ni +179.48.35.0 - 179.48.40.255 pa +179.48.41.0 - 179.48.41.255 ni +179.48.42.0 - 179.48.45.255 pa +179.48.46.0 - 179.48.46.255 ni +179.48.47.0 - 179.48.62.255 pa +179.48.63.0 - 179.48.63.255 ni +179.48.64.0 - 179.48.73.255 cr +179.48.74.0 - 179.48.75.255 pa +179.48.76.0 - 179.48.78.255 cr +179.48.79.0 - 179.48.79.255 pa +179.48.80.0 - 179.48.80.255 cr +179.48.81.0 - 179.48.81.255 pa +179.48.82.0 - 179.48.84.255 cr +179.48.85.0 - 179.48.85.255 pa +179.48.86.0 - 179.48.90.255 cr +179.48.91.0 - 179.48.92.255 pa +179.48.93.0 - 179.48.95.255 cr +179.48.96.0 - 179.48.113.255 pa +179.48.114.0 - 179.48.114.255 cr +179.48.115.0 - 179.48.159.255 pa +179.48.160.0 - 179.48.161.255 cr +179.48.162.0 - 179.48.164.255 pa +179.48.165.0 - 179.48.168.255 cr +179.48.169.0 - 179.48.169.255 pa +179.48.170.0 - 179.48.175.255 cr +179.48.176.0 - 179.48.176.255 pa +179.48.177.0 - 179.48.179.255 cr +179.48.180.0 - 179.48.180.255 pa +179.48.181.0 - 179.48.184.255 cr +179.48.185.0 - 179.48.186.255 pa +179.48.187.0 - 179.48.188.255 cr +179.48.189.0 - 179.48.189.255 pa +179.48.190.0 - 179.48.190.255 cr +179.48.191.0 - 179.48.208.255 pa +179.48.209.0 - 179.48.210.255 cr +179.48.211.0 - 179.48.211.255 pa +179.48.212.0 - 179.48.213.255 cr +179.48.214.0 - 179.48.214.255 pa +179.48.215.0 - 179.48.217.255 cr +179.48.218.0 - 179.48.218.255 pa +179.48.219.0 - 179.48.219.255 cr +179.48.220.0 - 179.48.220.255 pa +179.48.221.0 - 179.48.223.255 cr +179.48.224.0 - 179.48.239.255 pa +179.48.240.0 - 179.48.246.255 ni +179.48.247.0 - 179.48.247.255 pa +179.48.248.0 - 179.48.251.255 cr +179.48.252.0 - 179.48.255.255 ar +179.49.0.0 - 179.49.63.255 ec +179.49.64.0 - 179.49.71.255 pe +179.49.72.0 - 179.49.79.255 ar +179.49.80.0 - 179.49.95.255 do +179.49.96.0 - 179.49.111.255 ar +179.49.112.0 - 179.49.119.255 hn +179.49.120.0 - 179.49.127.255 ar +179.49.128.0 - 179.50.127.255 co +179.50.128.0 - 179.50.255.255 cr +179.51.0.0 - 179.51.63.255 sv +179.51.64.0 - 179.51.79.255 do +179.51.80.0 - 179.51.95.255 ar +179.51.96.0 - 179.51.127.255 co +179.51.128.0 - 179.51.141.255 cr +179.51.142.0 - 179.51.142.255 mx +179.51.143.0 - 179.51.164.255 cr +179.51.165.0 - 179.51.165.255 mx +179.51.166.0 - 179.51.166.255 cr +179.51.167.0 - 179.51.167.255 mx +179.51.168.0 - 179.51.169.255 cr +179.51.170.0 - 179.51.170.255 mx +179.51.171.0 - 179.51.190.255 cr +179.51.191.0 - 179.51.191.255 mx +179.51.192.0 - 179.51.193.255 pa +179.51.194.0 - 179.51.196.255 cr +179.51.197.0 - 179.51.197.255 pa +179.51.198.0 - 179.51.204.255 cr +179.51.205.0 - 179.51.205.255 pa +179.51.206.0 - 179.51.208.255 cr +179.51.209.0 - 179.51.209.255 ni +179.51.210.0 - 179.51.212.255 cr +179.51.213.0 - 179.51.215.255 ni +179.51.216.0 - 179.51.223.255 cr +179.51.224.0 - 179.51.251.255 ar +179.51.252.0 - 179.51.255.255 bz +179.52.0.0 - 179.53.255.255 do +179.54.0.0 - 179.55.255.255 br +179.56.0.0 - 179.57.255.255 cl +179.58.0.0 - 179.59.255.255 bo +179.60.0.0 - 179.60.31.255 ar +179.60.32.0 - 179.60.47.255 co +179.60.48.0 - 179.60.63.255 ec +179.60.64.0 - 179.60.95.255 cl +179.60.96.0 - 179.60.111.255 ar +179.60.112.0 - 179.60.127.255 bo +179.60.128.0 - 179.60.143.255 pa +179.60.144.0 - 179.60.145.255 nl +179.60.146.0 - 179.60.149.255 ru +179.60.150.0 - 179.60.150.255 ve +179.60.151.0 - 179.60.151.255 ir +179.60.152.0 - 179.60.159.255 ar +179.60.160.0 - 179.60.167.255 cr +179.60.168.0 - 179.60.175.255 ar +179.60.176.0 - 179.60.178.71 hn +179.60.178.72 - 179.60.178.79 in +179.60.178.80 - 179.60.182.231 hn +179.60.182.232 - 179.60.182.239 mx +179.60.182.240 - 179.60.183.215 hn +179.60.183.216 - 179.60.183.223 ph +179.60.183.224 - 179.60.183.255 hn +179.60.184.0 - 179.60.191.255 ar +179.60.192.0 - 179.60.195.255 us +179.60.196.0 - 179.60.203.255 ar +179.60.204.0 - 179.60.207.255 pe +179.60.208.0 - 179.60.211.255 ar +179.60.212.0 - 179.60.215.255 tt +179.60.216.0 - 179.60.223.255 ar +179.60.224.0 - 179.60.227.255 pe +179.60.228.0 - 179.60.239.255 ar +179.60.240.0 - 179.60.243.255 co +179.60.244.0 - 179.60.247.255 ec +179.60.248.0 - 179.61.11.255 ar +179.61.12.0 - 179.61.15.255 cl +179.61.16.0 - 179.61.95.255 ar +179.61.96.0 - 179.61.111.255 cl +179.61.112.0 - 179.61.127.255 co +179.61.128.0 - 179.61.128.15 cl +179.61.128.16 - 179.61.128.31 de +179.61.128.32 - 179.61.128.255 cl +179.61.129.0 - 179.61.129.255 us +179.61.130.0 - 179.61.130.15 cl +179.61.130.16 - 179.61.130.31 de +179.61.130.32 - 179.61.130.255 cl +179.61.131.0 - 179.61.131.255 us +179.61.132.0 - 179.61.132.15 cl +179.61.132.16 - 179.61.132.31 de +179.61.132.32 - 179.61.132.127 cl +179.61.132.128 - 179.61.133.255 us +179.61.134.0 - 179.61.134.15 cl +179.61.134.16 - 179.61.134.31 de +179.61.134.32 - 179.61.134.255 cl +179.61.135.0 - 179.61.135.255 us +179.61.136.0 - 179.61.136.15 cl +179.61.136.16 - 179.61.136.31 de +179.61.136.32 - 179.61.136.127 cl +179.61.136.128 - 179.61.137.255 us +179.61.138.0 - 179.61.138.15 cl +179.61.138.16 - 179.61.138.31 de +179.61.138.32 - 179.61.138.255 cl +179.61.139.0 - 179.61.139.255 us +179.61.140.0 - 179.61.140.15 cl +179.61.140.16 - 179.61.140.31 de +179.61.140.32 - 179.61.140.127 cl +179.61.140.128 - 179.61.141.255 us +179.61.142.0 - 179.61.142.15 cl +179.61.142.16 - 179.61.142.31 de +179.61.142.32 - 179.61.142.255 cl +179.61.143.0 - 179.61.143.255 us +179.61.144.0 - 179.61.144.127 de +179.61.144.128 - 179.61.144.255 us +179.61.145.0 - 179.61.145.15 es +179.61.145.16 - 179.61.145.63 de +179.61.145.64 - 179.61.145.127 gb +179.61.145.128 - 179.61.146.255 de +179.61.147.0 - 179.61.147.15 hr +179.61.147.16 - 179.61.147.63 de +179.61.147.64 - 179.61.147.127 gb +179.61.147.128 - 179.61.148.127 de +179.61.148.128 - 179.61.148.255 us +179.61.149.0 - 179.61.149.15 ie +179.61.149.16 - 179.61.149.63 de +179.61.149.64 - 179.61.149.127 gb +179.61.149.128 - 179.61.149.255 us +179.61.150.0 - 179.61.150.255 de +179.61.151.0 - 179.61.151.15 be +179.61.151.16 - 179.61.151.63 de +179.61.151.64 - 179.61.151.127 gb +179.61.151.128 - 179.61.152.127 de +179.61.152.128 - 179.61.152.255 us +179.61.153.0 - 179.61.153.15 gb +179.61.153.16 - 179.61.153.63 de +179.61.153.64 - 179.61.153.127 gb +179.61.153.128 - 179.61.154.255 de +179.61.155.0 - 179.61.155.15 gb +179.61.155.16 - 179.61.155.63 de +179.61.155.64 - 179.61.155.127 gb +179.61.155.128 - 179.61.155.255 us +179.61.156.0 - 179.61.156.127 de +179.61.156.128 - 179.61.156.255 us +179.61.157.0 - 179.61.157.15 ru +179.61.157.16 - 179.61.157.63 de +179.61.157.64 - 179.61.157.127 gb +179.61.157.128 - 179.61.158.255 de +179.61.159.0 - 179.61.159.15 hr +179.61.159.16 - 179.61.159.63 de +179.61.159.64 - 179.61.159.127 gb +179.61.159.128 - 179.61.160.127 de +179.61.160.128 - 179.61.160.255 us +179.61.161.0 - 179.61.161.15 ie +179.61.161.16 - 179.61.161.31 us +179.61.161.32 - 179.61.161.63 de +179.61.161.64 - 179.61.161.79 gb +179.61.161.80 - 179.61.161.127 de +179.61.161.128 - 179.61.161.255 us +179.61.162.0 - 179.61.162.255 de +179.61.163.0 - 179.61.163.15 gb +179.61.163.16 - 179.61.163.63 de +179.61.163.64 - 179.61.163.79 gb +179.61.163.80 - 179.61.164.127 de +179.61.164.128 - 179.61.164.255 us +179.61.165.0 - 179.61.165.15 gb +179.61.165.16 - 179.61.165.63 de +179.61.165.64 - 179.61.165.79 gb +179.61.165.80 - 179.61.166.255 de +179.61.167.0 - 179.61.167.15 es +179.61.167.16 - 179.61.167.63 de +179.61.167.64 - 179.61.167.79 gb +179.61.167.80 - 179.61.167.127 de +179.61.167.128 - 179.61.167.255 us +179.61.168.0 - 179.61.168.127 de +179.61.168.128 - 179.61.168.255 us +179.61.169.0 - 179.61.169.15 nl +179.61.169.16 - 179.61.169.63 de +179.61.169.64 - 179.61.169.79 gb +179.61.169.80 - 179.61.170.255 de +179.61.171.0 - 179.61.171.15 gb +179.61.171.16 - 179.61.172.127 de +179.61.172.128 - 179.61.172.255 us +179.61.173.0 - 179.61.173.15 es +179.61.173.16 - 179.61.173.127 de +179.61.173.128 - 179.61.173.255 us +179.61.174.0 - 179.61.174.255 de +179.61.175.0 - 179.61.175.15 sk +179.61.175.16 - 179.61.176.127 de +179.61.176.128 - 179.61.176.255 us +179.61.177.0 - 179.61.177.15 se +179.61.177.16 - 179.61.178.255 de +179.61.179.0 - 179.61.179.15 gb +179.61.179.16 - 179.61.179.127 de +179.61.179.128 - 179.61.179.255 us +179.61.180.0 - 179.61.180.127 de +179.61.180.128 - 179.61.180.255 us +179.61.181.0 - 179.61.181.15 dk +179.61.181.16 - 179.61.182.255 de +179.61.183.0 - 179.61.183.15 tr +179.61.183.16 - 179.61.184.127 de +179.61.184.128 - 179.61.184.255 us +179.61.185.0 - 179.61.185.15 gb +179.61.185.16 - 179.61.185.127 de +179.61.185.128 - 179.61.185.255 us +179.61.186.0 - 179.61.186.255 de +179.61.187.0 - 179.61.187.15 es +179.61.187.16 - 179.61.188.127 de +179.61.188.128 - 179.61.188.255 us +179.61.189.0 - 179.61.189.15 au +179.61.189.16 - 179.61.190.127 de +179.61.190.128 - 179.61.190.255 us +179.61.191.0 - 179.61.191.15 gr +179.61.191.16 - 179.61.191.127 de +179.61.191.128 - 179.61.191.255 us +179.61.192.0 - 179.61.192.255 qa +179.61.193.0 - 179.61.193.255 cl +179.61.194.0 - 179.61.194.127 us +179.61.194.128 - 179.61.194.255 cl +179.61.195.0 - 179.61.196.255 us +179.61.197.0 - 179.61.197.255 cl +179.61.198.0 - 179.61.198.255 mx +179.61.199.0 - 179.61.199.255 cl +179.61.200.0 - 179.61.201.255 de +179.61.202.0 - 179.61.202.255 us +179.61.203.0 - 179.61.203.255 es +179.61.204.0 - 179.61.205.15 cl +179.61.205.16 - 179.61.205.31 us +179.61.205.32 - 179.61.205.33 br +179.61.205.34 - 179.61.205.35 cl +179.61.205.36 - 179.61.205.63 br +179.61.205.64 - 179.61.206.255 cl +179.61.207.0 - 179.61.207.31 fr +179.61.207.32 - 179.61.207.63 be +179.61.207.64 - 179.61.207.255 cl +179.61.208.0 - 179.61.208.255 us +179.61.209.0 - 179.61.209.127 br +179.61.209.128 - 179.61.209.159 is +179.61.209.160 - 179.61.209.191 nz +179.61.209.192 - 179.61.210.255 br +179.61.211.0 - 179.61.211.31 no +179.61.211.32 - 179.61.211.63 se +179.61.211.64 - 179.61.211.255 br +179.61.212.0 - 179.61.212.31 no +179.61.212.32 - 179.61.212.63 nz +179.61.212.64 - 179.61.213.127 br +179.61.213.128 - 179.61.213.159 nl +179.61.213.160 - 179.61.213.191 fr +179.61.213.192 - 179.61.214.127 br +179.61.214.128 - 179.61.214.159 fi +179.61.214.160 - 179.61.214.191 nl +179.61.214.192 - 179.61.214.255 br +179.61.215.0 - 179.61.215.31 is +179.61.215.32 - 179.61.215.63 it +179.61.215.64 - 179.61.215.255 br +179.61.216.0 - 179.61.216.255 us +179.61.217.0 - 179.61.217.255 br +179.61.218.0 - 179.61.219.255 us +179.61.220.0 - 179.61.220.255 gb +179.61.221.0 - 179.61.221.31 nz +179.61.221.32 - 179.61.221.63 be +179.61.221.64 - 179.61.222.127 br +179.61.222.128 - 179.61.222.159 se +179.61.222.160 - 179.61.222.191 fr +179.61.222.192 - 179.61.223.255 br +179.61.224.0 - 179.61.227.255 in +179.61.228.0 - 179.61.228.255 br +179.61.229.0 - 179.61.231.255 us +179.61.232.0 - 179.61.232.255 br +179.61.233.0 - 179.61.235.255 us +179.61.236.0 - 179.61.236.255 br +179.61.237.0 - 179.61.237.255 us +179.61.238.0 - 179.61.238.255 br +179.61.239.0 - 179.61.239.255 us +179.61.240.0 - 179.61.241.127 br +179.61.241.128 - 179.61.241.159 it +179.61.241.160 - 179.61.241.191 is +179.61.241.192 - 179.61.241.255 br +179.61.242.0 - 179.61.242.255 us +179.61.243.0 - 179.61.243.31 nl +179.61.243.32 - 179.61.243.63 au +179.61.243.64 - 179.61.243.255 br +179.61.244.0 - 179.61.244.31 be +179.61.244.32 - 179.61.244.63 no +179.61.244.64 - 179.61.244.255 br +179.61.245.0 - 179.61.245.255 us +179.61.246.0 - 179.61.246.255 br +179.61.247.0 - 179.61.247.31 se +179.61.247.32 - 179.61.247.63 nl +179.61.247.64 - 179.61.249.127 br +179.61.249.128 - 179.61.249.159 nz +179.61.249.160 - 179.61.249.191 it +179.61.249.192 - 179.61.249.255 br +179.61.250.0 - 179.61.250.255 au +179.61.251.0 - 179.61.251.255 ie +179.61.252.0 - 179.61.252.255 jo +179.61.253.0 - 179.61.253.255 kw +179.61.254.0 - 179.61.255.255 br +179.62.0.0 - 179.62.255.255 ar +179.63.0.0 - 179.63.68.255 cr +179.63.69.0 - 179.63.70.255 pa +179.63.71.0 - 179.63.74.255 cr +179.63.75.0 - 179.63.76.255 pa +179.63.77.0 - 179.63.79.255 cr +179.63.80.0 - 179.63.80.255 pa +179.63.81.0 - 179.63.84.255 cr +179.63.85.0 - 179.63.85.255 pa +179.63.86.0 - 179.63.87.255 cr +179.63.88.0 - 179.63.88.255 pa +179.63.89.0 - 179.63.90.255 cr +179.63.91.0 - 179.63.92.255 pa +179.63.93.0 - 179.63.94.255 cr +179.63.95.0 - 179.63.95.255 pa +179.63.96.0 - 179.63.112.255 cr +179.63.113.0 - 179.63.114.255 pa +179.63.115.0 - 179.63.117.255 cr +179.63.118.0 - 179.63.118.255 pa +179.63.119.0 - 179.63.119.255 cr +179.63.120.0 - 179.63.122.255 pa +179.63.123.0 - 179.63.127.255 cr +179.63.128.0 - 179.63.132.255 pa +179.63.133.0 - 179.63.134.255 cr +179.63.135.0 - 179.63.135.255 pa +179.63.136.0 - 179.63.137.255 cr +179.63.138.0 - 179.63.139.255 pa +179.63.140.0 - 179.63.141.255 cr +179.63.142.0 - 179.63.143.255 pa +179.63.144.0 - 179.63.144.255 cr +179.63.145.0 - 179.63.146.255 mx +179.63.147.0 - 179.63.150.255 cr +179.63.151.0 - 179.63.151.255 mx +179.63.152.0 - 179.63.155.255 cr +179.63.156.0 - 179.63.156.255 pa +179.63.157.0 - 179.63.158.255 cr +179.63.159.0 - 179.63.159.255 pa +179.63.160.0 - 179.63.163.255 cr +179.63.164.0 - 179.63.164.255 mx +179.63.165.0 - 179.63.167.255 cr +179.63.168.0 - 179.63.169.255 mx +179.63.170.0 - 179.63.170.255 cr +179.63.171.0 - 179.63.171.255 mx +179.63.172.0 - 179.63.172.255 cr +179.63.173.0 - 179.63.173.255 mx +179.63.174.0 - 179.63.178.255 cr +179.63.179.0 - 179.63.179.255 mx +179.63.180.0 - 179.63.180.255 cr +179.63.181.0 - 179.63.181.255 mx +179.63.182.0 - 179.63.191.255 cr +179.63.192.0 - 179.63.199.255 pa +179.63.200.0 - 179.63.215.255 ar +179.63.216.0 - 179.63.223.255 bz +179.63.224.0 - 179.63.235.255 cl +179.63.236.0 - 179.63.243.255 ar +179.63.244.0 - 179.63.247.255 cl +179.63.248.0 - 179.63.251.255 ar +179.63.252.0 - 179.63.255.255 hn +179.64.0.0 - 179.255.255.255 br 180.0.0.0 - 180.63.255.255 jp 180.64.0.0 - 180.71.255.255 kr 180.72.0.0 - 180.75.255.255 my 180.76.0.0 - 180.79.255.255 cn 180.80.0.0 - 180.83.255.255 kr 180.84.0.0 - 180.86.255.255 cn -180.87.0.0 - 180.87.255.255 in +180.87.0.0 - 180.87.4.127 in +180.87.4.128 - 180.87.4.255 hk +180.87.5.0 - 180.87.5.127 in +180.87.5.128 - 180.87.5.255 cn +180.87.6.0 - 180.87.6.255 hk +180.87.7.0 - 180.87.9.255 in +180.87.10.0 - 180.87.10.19 hk +180.87.10.20 - 180.87.10.23 cn +180.87.10.24 - 180.87.10.31 in +180.87.10.32 - 180.87.10.143 hk +180.87.10.144 - 180.87.10.255 in +180.87.11.0 - 180.87.11.7 gu +180.87.11.8 - 180.87.11.255 in +180.87.12.0 - 180.87.12.255 sg +180.87.13.0 - 180.87.13.255 hk +180.87.14.0 - 180.87.14.255 in +180.87.15.0 - 180.87.23.255 sg +180.87.24.0 - 180.87.24.159 in +180.87.24.160 - 180.87.24.175 sg +180.87.24.176 - 180.87.25.255 in +180.87.26.0 - 180.87.26.255 sg +180.87.27.0 - 180.87.27.255 hk +180.87.28.0 - 180.87.29.255 in +180.87.30.0 - 180.87.30.11 jp +180.87.30.12 - 180.87.30.255 in +180.87.31.0 - 180.87.31.255 hk +180.87.32.0 - 180.87.39.255 in +180.87.40.0 - 180.87.47.255 sg +180.87.48.0 - 180.87.48.15 in +180.87.48.16 - 180.87.48.31 sg +180.87.48.32 - 180.87.48.95 in +180.87.48.96 - 180.87.49.11 sg +180.87.49.12 - 180.87.49.15 in +180.87.49.16 - 180.87.49.23 sg +180.87.49.24 - 180.87.63.255 in +180.87.64.0 - 180.87.66.31 sg +180.87.66.32 - 180.87.66.39 in +180.87.66.40 - 180.87.66.47 sg +180.87.66.48 - 180.87.66.79 in +180.87.66.80 - 180.87.66.95 sg +180.87.66.96 - 180.87.71.255 in +180.87.72.0 - 180.87.74.63 sg +180.87.74.64 - 180.87.74.127 in +180.87.74.128 - 180.87.74.255 sg +180.87.75.0 - 180.87.79.255 in +180.87.80.0 - 180.87.80.255 ph +180.87.81.0 - 180.87.81.255 in +180.87.82.0 - 180.87.82.255 ph +180.87.83.0 - 180.87.88.15 in +180.87.88.16 - 180.87.88.63 sg +180.87.88.64 - 180.87.88.255 in +180.87.89.0 - 180.87.89.255 jp +180.87.90.0 - 180.87.90.255 sg +180.87.91.0 - 180.87.96.255 in +180.87.97.0 - 180.87.97.31 sg +180.87.97.32 - 180.87.97.47 in +180.87.97.48 - 180.87.97.51 ca +180.87.97.52 - 180.87.97.55 in +180.87.97.56 - 180.87.97.63 th +180.87.97.64 - 180.87.97.127 sg +180.87.97.128 - 180.87.97.159 my +180.87.97.160 - 180.87.97.191 sg +180.87.97.192 - 180.87.97.255 ca +180.87.98.0 - 180.87.98.255 sg +180.87.99.0 - 180.87.99.31 in +180.87.99.32 - 180.87.99.39 sg +180.87.99.40 - 180.87.99.255 in +180.87.100.0 - 180.87.100.255 sg +180.87.101.0 - 180.87.112.255 in +180.87.113.0 - 180.87.114.255 hk +180.87.115.0 - 180.87.115.79 au +180.87.115.80 - 180.87.115.255 in +180.87.116.0 - 180.87.117.255 au +180.87.118.0 - 180.87.118.255 jp +180.87.119.0 - 180.87.120.7 in +180.87.120.8 - 180.87.120.15 au +180.87.120.16 - 180.87.122.3 in +180.87.122.4 - 180.87.122.23 hk +180.87.122.24 - 180.87.122.255 in +180.87.123.0 - 180.87.123.255 hk +180.87.124.0 - 180.87.124.167 sg +180.87.124.168 - 180.87.124.255 in +180.87.125.0 - 180.87.125.255 sg +180.87.126.0 - 180.87.128.255 in +180.87.129.0 - 180.87.129.255 hk +180.87.130.0 - 180.87.130.15 au +180.87.130.16 - 180.87.130.31 in +180.87.130.32 - 180.87.130.63 au +180.87.130.64 - 180.87.130.127 in +180.87.130.128 - 180.87.130.255 my +180.87.131.0 - 180.87.143.31 in +180.87.143.32 - 180.87.143.63 my +180.87.143.64 - 180.87.143.255 in +180.87.144.0 - 180.87.144.255 hk +180.87.145.0 - 180.87.145.255 my +180.87.146.0 - 180.87.146.127 in +180.87.146.128 - 180.87.146.135 hk +180.87.146.136 - 180.87.146.143 in +180.87.146.144 - 180.87.146.159 hk +180.87.146.160 - 180.87.147.135 in +180.87.147.136 - 180.87.147.143 sg +180.87.147.144 - 180.87.147.255 in +180.87.148.0 - 180.87.148.255 sg +180.87.149.0 - 180.87.149.127 in +180.87.149.128 - 180.87.149.135 hk +180.87.149.136 - 180.87.150.255 in +180.87.151.0 - 180.87.151.7 sg +180.87.151.8 - 180.87.151.127 in +180.87.151.128 - 180.87.151.159 au +180.87.151.160 - 180.87.151.255 in +180.87.152.0 - 180.87.152.111 sg +180.87.152.112 - 180.87.152.127 hk +180.87.152.128 - 180.87.152.255 sg +180.87.153.0 - 180.87.153.255 hk +180.87.154.0 - 180.87.154.255 in +180.87.155.0 - 180.87.155.255 jp +180.87.156.0 - 180.87.157.95 my +180.87.157.96 - 180.87.160.255 in +180.87.161.0 - 180.87.161.15 hk +180.87.161.16 - 180.87.161.31 in +180.87.161.32 - 180.87.161.47 hk +180.87.161.48 - 180.87.161.255 in +180.87.162.0 - 180.87.163.255 hk +180.87.164.0 - 180.87.164.255 sg +180.87.165.0 - 180.87.181.255 in +180.87.182.0 - 180.87.182.255 sg +180.87.183.0 - 180.87.183.255 au +180.87.184.0 - 180.87.184.159 in +180.87.184.160 - 180.87.184.175 sg +180.87.184.176 - 180.87.184.223 in +180.87.184.224 - 180.87.184.255 sg +180.87.185.0 - 180.87.185.31 hk +180.87.185.32 - 180.87.185.63 in +180.87.185.64 - 180.87.185.95 sg +180.87.185.96 - 180.87.185.207 in +180.87.185.208 - 180.87.185.215 sg +180.87.185.216 - 180.87.185.219 us +180.87.185.220 - 180.87.185.223 sg +180.87.185.224 - 180.87.189.255 in +180.87.190.0 - 180.87.191.255 hk +180.87.192.0 - 180.87.255.255 in 180.88.0.0 - 180.91.255.255 cn 180.92.0.0 - 180.92.15.255 tw 180.92.16.0 - 180.92.63.255 jp @@ -82057,13 +62005,25 @@ 180.92.240.0 - 180.92.255.255 kr 180.93.0.0 - 180.93.255.255 vn 180.94.0.0 - 180.94.31.255 ph +180.94.32.0 - 180.94.35.255 in 180.94.36.0 - 180.94.39.255 ph 180.94.40.0 - 180.94.47.255 jp -180.94.48.0 - 180.94.55.255 hk +180.94.48.0 - 180.94.55.255 au 180.94.56.0 - 180.94.63.255 cn -180.94.64.0 - 180.94.95.255 af +180.94.64.0 - 180.94.72.255 af +180.94.73.0 - 180.94.73.255 us +180.94.74.0 - 180.94.78.255 af +180.94.79.0 - 180.94.80.255 us +180.94.81.0 - 180.94.81.255 af +180.94.82.0 - 180.94.82.255 us +180.94.83.0 - 180.94.84.255 af +180.94.85.0 - 180.94.85.255 us +180.94.86.0 - 180.94.90.255 af +180.94.91.0 - 180.94.91.255 us +180.94.92.0 - 180.94.95.255 af 180.94.96.0 - 180.94.111.255 cn 180.94.112.0 - 180.94.119.255 au +180.94.120.0 - 180.94.127.255 cn 180.94.128.0 - 180.94.191.255 mo 180.94.192.0 - 180.94.215.255 jp 180.94.216.0 - 180.94.219.255 sg @@ -82084,7 +62044,21 @@ 180.131.148.0 - 180.131.151.255 la 180.131.152.0 - 180.131.159.255 jp 180.131.160.0 - 180.131.191.255 hk -180.131.192.0 - 180.131.255.255 jp +180.131.192.0 - 180.131.211.255 jp +180.131.212.0 - 180.131.215.255 us +180.131.216.0 - 180.131.217.255 jp +180.131.218.0 - 180.131.218.255 us +180.131.219.0 - 180.131.219.255 jp +180.131.220.0 - 180.131.223.255 us +180.131.224.0 - 180.131.224.255 jp +180.131.225.0 - 180.131.227.255 us +180.131.228.0 - 180.131.232.255 jp +180.131.233.0 - 180.131.235.255 us +180.131.236.0 - 180.131.239.255 jp +180.131.240.0 - 180.131.240.255 us +180.131.241.0 - 180.131.243.255 jp +180.131.244.0 - 180.131.249.255 us +180.131.250.0 - 180.131.255.255 jp 180.132.0.0 - 180.135.255.255 kr 180.136.0.0 - 180.143.255.255 cn 180.144.0.0 - 180.147.255.255 jp @@ -82115,7 +62089,6 @@ 180.149.201.0 - 180.149.201.255 au 180.149.202.0 - 180.149.207.255 jp 180.149.208.0 - 180.149.223.255 pk -180.149.224.0 - 180.149.239.255 au 180.149.240.0 - 180.149.247.255 in 180.149.248.0 - 180.149.251.255 au 180.149.252.0 - 180.149.255.255 hk @@ -82138,6 +62111,7 @@ 180.178.72.0 - 180.178.79.255 sg 180.178.80.0 - 180.178.91.255 jp 180.178.92.0 - 180.178.111.255 id +180.178.112.0 - 180.178.119.255 cn 180.178.120.0 - 180.178.123.255 au 180.178.124.0 - 180.178.127.255 kh 180.178.128.0 - 180.178.191.255 pk @@ -82152,7 +62126,9 @@ 180.188.204.0 - 180.188.207.255 au 180.188.208.0 - 180.188.223.255 jp 180.188.224.0 - 180.188.255.255 in -180.189.0.0 - 180.189.63.255 jp +180.189.0.0 - 180.189.15.255 jp +180.189.16.0 - 180.189.31.255 au +180.189.32.0 - 180.189.63.255 jp 180.189.64.0 - 180.189.127.255 kr 180.189.128.0 - 180.189.135.255 jp 180.189.136.0 - 180.189.147.255 au @@ -82179,8 +62155,9 @@ 180.210.192.0 - 180.210.199.255 kr 180.210.200.0 - 180.210.207.255 sg 180.210.208.0 - 180.210.211.255 nz -180.210.212.0 - 180.210.215.255 au +180.210.212.0 - 180.210.215.255 cn 180.210.216.0 - 180.210.219.255 th +180.210.220.0 - 180.210.223.255 bd 180.210.224.0 - 180.210.255.255 cn 180.211.0.0 - 180.211.63.255 kr 180.211.64.0 - 180.211.71.255 in @@ -82212,10 +62189,11 @@ 180.222.32.0 - 180.222.63.255 jp 180.222.64.0 - 180.222.71.255 nz 180.222.72.0 - 180.222.95.255 jp -180.222.96.0 - 180.222.119.255 in -180.222.120.0 - 180.222.127.255 jp +180.222.96.0 - 180.222.127.255 in 180.222.128.0 - 180.222.135.255 sg -180.222.136.0 - 180.222.143.255 af +180.222.136.0 - 180.222.141.255 af +180.222.142.0 - 180.222.142.255 us +180.222.143.0 - 180.222.143.255 af 180.222.144.0 - 180.222.159.255 th 180.222.160.0 - 180.222.175.255 au 180.222.176.0 - 180.222.191.255 jp @@ -82231,11 +62209,14 @@ 180.232.0.0 - 180.232.255.255 ph 180.233.0.0 - 180.233.95.255 cn 180.233.96.0 - 180.233.111.255 jp -180.233.112.0 - 180.233.119.255 hk +180.233.112.0 - 180.233.115.255 sg +180.233.116.0 - 180.233.116.255 kr +180.233.117.0 - 180.233.119.255 hk 180.233.120.0 - 180.233.123.255 in 180.233.124.0 - 180.233.131.255 au 180.233.132.0 - 180.233.143.255 jp -180.233.144.0 - 180.233.151.255 my +180.233.144.0 - 180.233.147.255 cn +180.233.148.0 - 180.233.151.255 in 180.233.152.0 - 180.233.159.255 id 180.233.160.0 - 180.233.191.255 hk 180.233.192.0 - 180.233.255.255 kr @@ -82244,37 +62225,559 @@ 180.235.64.0 - 180.235.95.255 cn 180.235.96.0 - 180.235.103.255 jp 180.235.104.0 - 180.235.111.255 au +180.235.112.0 - 180.235.115.255 cn +180.235.116.0 - 180.235.119.255 mm +180.235.120.0 - 180.235.123.255 in +180.235.124.0 - 180.235.127.255 jp 180.235.128.0 - 180.235.131.255 au 180.235.132.0 - 180.235.135.255 hk -180.235.140.0 - 180.235.147.255 jp +180.235.136.0 - 180.235.136.255 nl +180.235.137.0 - 180.235.147.255 jp 180.235.148.0 - 180.235.151.255 id -180.235.152.0 - 180.235.152.255 sg -180.235.153.0 - 180.235.153.255 in -180.235.154.0 - 180.235.155.255 hk +180.235.152.0 - 180.235.155.255 sg 180.235.156.0 - 180.235.159.255 au 180.235.160.0 - 180.235.191.255 mn 180.235.192.0 - 180.235.223.255 au 180.235.224.0 - 180.235.255.255 jp 180.236.0.0 - 180.239.255.255 kr 180.240.0.0 - 180.240.127.255 id -180.240.128.0 - 180.240.255.255 sg +180.240.128.0 - 180.240.178.255 sg +180.240.179.0 - 180.240.179.255 us +180.240.180.0 - 180.240.255.255 sg 180.241.0.0 - 180.254.255.255 id 180.255.0.0 - 180.255.255.255 sg 181.0.0.0 - 181.16.255.255 ar -181.17.0.0 - 181.17.255.255 ve -181.20.0.0 - 181.23.255.255 ar -181.28.0.0 - 181.31.255.255 ar +181.17.0.0 - 181.19.255.255 ve +181.20.0.0 - 181.31.255.255 ar +181.32.0.0 - 181.33.255.255 co +181.34.0.0 - 181.35.255.255 ve 181.36.0.0 - 181.37.255.255 do +181.38.0.0 - 181.38.255.255 pa +181.39.0.0 - 181.39.255.255 ec 181.40.0.0 - 181.40.255.255 py -181.42.0.0 - 181.42.255.255 cl -181.48.0.0 - 181.55.255.255 co -181.64.0.0 - 181.65.255.255 pe -181.80.0.0 - 181.95.255.255 ar +181.41.0.0 - 181.41.31.255 pa +181.41.32.0 - 181.41.63.255 us +181.41.64.0 - 181.41.127.255 gy +181.41.128.0 - 181.41.129.255 us +181.41.130.0 - 181.41.130.255 nl +181.41.131.0 - 181.41.131.255 us +181.41.132.0 - 181.41.135.255 pa +181.41.136.0 - 181.41.139.255 us +181.41.140.0 - 181.41.159.255 pa +181.41.160.0 - 181.41.191.255 us +181.41.192.0 - 181.41.193.255 cl +181.41.194.0 - 181.41.194.255 br +181.41.195.0 - 181.41.195.255 us +181.41.196.0 - 181.41.198.255 br +181.41.199.0 - 181.41.200.255 us +181.41.201.0 - 181.41.201.255 br +181.41.202.0 - 181.41.202.255 us +181.41.203.0 - 181.41.203.255 cl +181.41.204.0 - 181.41.204.255 us +181.41.205.0 - 181.41.205.255 br +181.41.206.0 - 181.41.208.255 us +181.41.209.0 - 181.41.209.15 cl +181.41.209.16 - 181.41.209.31 sg +181.41.209.32 - 181.41.209.137 cl +181.41.209.138 - 181.41.209.139 us +181.41.209.140 - 181.41.209.143 sg +181.41.209.144 - 181.41.209.159 cl +181.41.209.160 - 181.41.209.163 us +181.41.209.164 - 181.41.209.165 sg +181.41.209.166 - 181.41.209.255 cl +181.41.210.0 - 181.41.212.255 br +181.41.213.0 - 181.41.213.255 us +181.41.214.0 - 181.41.214.255 br +181.41.215.0 - 181.41.216.255 us +181.41.217.0 - 181.41.217.255 br +181.41.218.0 - 181.41.218.255 us +181.41.219.0 - 181.41.220.191 br +181.41.220.192 - 181.41.220.255 sg +181.41.221.0 - 181.41.221.191 br +181.41.221.192 - 181.41.221.255 sg +181.41.222.0 - 181.41.223.255 br +181.41.224.0 - 181.41.255.255 ar +181.42.0.0 - 181.43.255.255 cl +181.44.0.0 - 181.47.255.255 ar +181.48.0.0 - 181.63.255.255 co +181.64.0.0 - 181.67.255.255 pe +181.68.0.0 - 181.71.255.255 co +181.72.0.0 - 181.75.255.255 cl +181.76.0.0 - 181.77.255.255 br +181.78.0.0 - 181.79.128.255 ar +181.79.129.0 - 181.79.129.255 us +181.79.130.0 - 181.111.255.255 ar +181.112.0.0 - 181.113.255.255 ec +181.114.0.0 - 181.114.31.255 gt +181.114.32.0 - 181.114.55.255 ar +181.114.56.0 - 181.114.59.255 hn +181.114.60.0 - 181.114.63.255 ar +181.114.64.0 - 181.114.127.255 bo +181.114.128.0 - 181.114.159.255 ar +181.114.160.0 - 181.114.191.255 bo +181.114.192.0 - 181.114.231.255 ar +181.114.232.0 - 181.114.239.255 cl +181.114.240.0 - 181.114.255.255 bz +181.115.0.0 - 181.115.127.255 hn +181.115.128.0 - 181.115.255.255 bo +181.116.0.0 - 181.118.31.255 ar +181.118.32.0 - 181.118.33.255 cy +181.118.34.0 - 181.118.63.255 pa +181.118.64.0 - 181.118.143.255 ar +181.118.144.0 - 181.118.159.255 co +181.118.160.0 - 181.118.175.255 cl +181.118.176.0 - 181.119.29.255 ar +181.119.30.0 - 181.119.30.127 co +181.119.30.128 - 181.119.111.255 ar +181.119.112.0 - 181.119.112.255 us +181.119.113.0 - 181.119.114.255 ar +181.119.115.0 - 181.119.127.255 us +181.119.128.0 - 181.119.255.255 ar +181.120.0.0 - 181.127.255.255 py 181.128.0.0 - 181.159.255.255 co +181.160.0.0 - 181.163.255.255 cl +181.164.0.0 - 181.171.255.255 ar +181.172.0.0 - 181.173.255.255 cl +181.174.0.0 - 181.174.63.255 co +181.174.64.0 - 181.174.127.255 gt +181.174.128.0 - 181.174.159.255 ar +181.174.160.0 - 181.174.163.255 py +181.174.164.0 - 181.174.167.255 pa +181.174.168.0 - 181.174.171.255 cr +181.174.172.0 - 181.174.183.255 ar +181.174.184.0 - 181.174.191.255 es +181.174.192.0 - 181.174.207.255 ar +181.174.208.0 - 181.174.220.255 cr +181.174.221.0 - 181.174.222.255 pa +181.174.223.0 - 181.174.255.255 cr +181.175.0.0 - 181.175.255.255 ec +181.176.0.0 - 181.176.255.255 pe +181.177.0.0 - 181.177.63.255 ar +181.177.64.0 - 181.177.64.255 bz +181.177.65.0 - 181.177.65.191 hn +181.177.65.192 - 181.177.65.199 es +181.177.65.200 - 181.177.67.255 hn +181.177.68.0 - 181.177.68.223 bz +181.177.68.224 - 181.177.68.239 es +181.177.68.240 - 181.177.75.175 bz +181.177.75.176 - 181.177.75.183 ca +181.177.75.184 - 181.177.83.191 bz +181.177.83.192 - 181.177.83.207 ca +181.177.83.208 - 181.177.89.47 bz +181.177.89.48 - 181.177.89.55 us +181.177.89.56 - 181.177.91.223 bz +181.177.91.224 - 181.177.91.239 br +181.177.91.240 - 181.177.101.111 bz +181.177.101.112 - 181.177.101.127 ca +181.177.101.128 - 181.177.102.215 bz +181.177.102.216 - 181.177.102.223 ca +181.177.102.224 - 181.177.106.199 bz +181.177.106.200 - 181.177.106.207 nl +181.177.106.208 - 181.177.109.159 bz +181.177.109.160 - 181.177.109.175 nl +181.177.109.176 - 181.177.113.23 bz +181.177.113.24 - 181.177.113.31 cr +181.177.113.32 - 181.177.113.167 bz +181.177.113.168 - 181.177.113.175 cr +181.177.113.176 - 181.177.115.63 bz +181.177.115.64 - 181.177.115.79 us +181.177.115.80 - 181.177.117.63 bz +181.177.117.64 - 181.177.117.71 us +181.177.117.72 - 181.177.123.151 bz +181.177.123.152 - 181.177.123.159 ca +181.177.123.160 - 181.177.124.255 bz +181.177.125.0 - 181.177.125.15 ca +181.177.125.16 - 181.177.125.135 bz +181.177.125.136 - 181.177.125.143 ca +181.177.125.144 - 181.177.126.71 bz +181.177.126.72 - 181.177.126.79 cr +181.177.126.80 - 181.177.127.255 bz +181.177.128.0 - 181.177.191.255 bo +181.177.192.0 - 181.177.215.255 ar +181.177.216.0 - 181.177.219.255 gy +181.177.220.0 - 181.177.223.255 cl +181.177.224.0 - 181.177.255.255 pe +181.178.0.0 - 181.179.255.255 pa +181.180.0.0 - 181.187.255.255 ve +181.188.0.0 - 181.188.127.255 tt +181.188.128.0 - 181.188.191.255 bo +181.188.192.0 - 181.188.255.255 ec +181.189.0.0 - 181.189.61.255 cr +181.189.62.0 - 181.189.62.255 mx +181.189.63.0 - 181.189.127.255 cr +181.189.128.0 - 181.189.159.255 gt +181.189.160.0 - 181.189.175.255 ar +181.189.176.0 - 181.189.191.255 sv +181.189.192.0 - 181.189.223.255 ar +181.189.224.0 - 181.189.255.255 hn +181.190.0.0 - 181.190.255.255 cl +181.191.0.0 - 181.191.243.255 pa +181.191.244.0 - 181.191.247.255 us +181.191.248.0 - 181.191.255.255 pa +181.192.0.0 - 181.192.95.255 ar +181.192.96.0 - 181.192.127.255 bz +181.192.128.0 - 181.192.255.255 co +181.193.0.0 - 181.193.146.255 cr +181.193.147.0 - 181.193.147.255 ni +181.193.148.0 - 181.195.255.255 cr +181.196.0.0 - 181.196.255.255 ec +181.197.0.0 - 181.197.191.255 pa +181.197.192.0 - 181.197.255.255 ar +181.198.0.0 - 181.199.127.255 ec +181.199.128.0 - 181.199.143.255 pe +181.199.144.0 - 181.199.175.255 ar +181.199.176.0 - 181.199.191.255 hn +181.199.192.0 - 181.199.223.255 es +181.199.224.0 - 181.199.255.255 pa +181.200.0.0 - 181.203.255.255 cl +181.204.0.0 - 181.207.255.255 co +181.208.0.0 - 181.208.255.255 ve +181.209.0.0 - 181.209.127.255 ar +181.209.128.0 - 181.209.255.255 gt +181.210.0.0 - 181.210.255.255 hn +181.211.0.0 - 181.211.255.255 ec +181.212.0.0 - 181.212.255.255 cl +181.213.0.0 - 181.213.255.255 br +181.214.0.0 - 181.214.0.15 jp +181.214.0.16 - 181.214.0.255 br +181.214.1.0 - 181.214.1.255 us +181.214.2.0 - 181.214.2.15 ie +181.214.2.16 - 181.214.2.31 us +181.214.2.32 - 181.214.2.255 br +181.214.3.0 - 181.214.3.255 us +181.214.4.0 - 181.214.4.15 sg +181.214.4.16 - 181.214.4.255 br +181.214.5.0 - 181.214.5.255 us +181.214.6.0 - 181.214.6.15 dk +181.214.6.16 - 181.214.6.255 br +181.214.7.0 - 181.214.7.255 us +181.214.8.0 - 181.214.8.15 fr +181.214.8.16 - 181.214.8.255 br +181.214.9.0 - 181.214.9.255 us +181.214.10.0 - 181.214.10.15 at +181.214.10.16 - 181.214.10.255 br +181.214.11.0 - 181.214.11.255 us +181.214.12.0 - 181.214.12.15 pe +181.214.12.16 - 181.214.12.255 br +181.214.13.0 - 181.214.13.255 us +181.214.14.0 - 181.214.14.15 kr +181.214.14.16 - 181.214.14.255 br +181.214.15.0 - 181.214.15.255 us +181.214.16.0 - 181.214.16.15 it +181.214.16.16 - 181.214.16.255 br +181.214.17.0 - 181.214.17.255 us +181.214.18.0 - 181.214.18.15 jp +181.214.18.16 - 181.214.18.255 br +181.214.19.0 - 181.214.19.255 us +181.214.20.0 - 181.214.20.15 au +181.214.20.16 - 181.214.20.255 br +181.214.21.0 - 181.214.21.255 us +181.214.22.0 - 181.214.22.15 nl +181.214.22.16 - 181.214.22.255 br +181.214.23.0 - 181.214.23.255 us +181.214.24.0 - 181.214.24.15 hk +181.214.24.16 - 181.214.24.255 br +181.214.25.0 - 181.214.25.255 us +181.214.26.0 - 181.214.26.15 it +181.214.26.16 - 181.214.26.255 br +181.214.27.0 - 181.214.27.255 us +181.214.28.0 - 181.214.28.15 ch +181.214.28.16 - 181.214.28.255 br +181.214.29.0 - 181.214.29.255 us +181.214.30.0 - 181.214.30.15 fr +181.214.30.16 - 181.214.30.255 br +181.214.31.0 - 181.214.31.255 us +181.214.32.0 - 181.214.32.15 at +181.214.32.16 - 181.214.32.127 br +181.214.32.128 - 181.214.32.255 us +181.214.33.0 - 181.214.33.127 de +181.214.33.128 - 181.214.33.255 br +181.214.34.0 - 181.214.34.15 th +181.214.34.16 - 181.214.34.255 br +181.214.35.0 - 181.214.35.255 nl +181.214.36.0 - 181.214.36.15 es +181.214.36.16 - 181.214.36.255 br +181.214.37.0 - 181.214.37.255 us +181.214.38.0 - 181.214.38.15 fr +181.214.38.16 - 181.214.38.127 br +181.214.38.128 - 181.214.39.255 us +181.214.40.0 - 181.214.40.15 au +181.214.40.16 - 181.214.40.255 br +181.214.41.0 - 181.214.41.255 us +181.214.42.0 - 181.214.42.15 ee +181.214.42.16 - 181.214.42.255 br +181.214.43.0 - 181.214.43.255 us +181.214.44.0 - 181.214.44.15 fr +181.214.44.16 - 181.214.44.63 br +181.214.44.64 - 181.214.45.255 us +181.214.46.0 - 181.214.46.15 pl +181.214.46.16 - 181.214.46.255 br +181.214.47.0 - 181.214.47.255 us +181.214.48.0 - 181.214.48.15 lv +181.214.48.16 - 181.214.48.255 br +181.214.49.0 - 181.214.49.255 us +181.214.50.0 - 181.214.50.255 nl +181.214.51.0 - 181.214.51.255 br +181.214.52.0 - 181.214.52.255 us +181.214.53.0 - 181.214.53.255 gb +181.214.54.0 - 181.214.54.255 br +181.214.55.0 - 181.214.55.255 es +181.214.56.0 - 181.214.203.255 us +181.214.204.0 - 181.214.204.255 br +181.214.205.0 - 181.214.205.255 pe +181.214.206.0 - 181.214.211.255 us +181.214.212.0 - 181.214.212.255 co +181.214.213.0 - 181.214.213.255 cl +181.214.214.0 - 181.214.255.255 us +181.215.0.0 - 181.215.0.15 no +181.215.0.16 - 181.215.0.255 br +181.215.1.0 - 181.215.1.255 us +181.215.2.0 - 181.215.2.15 kr +181.215.2.16 - 181.215.2.255 br +181.215.3.0 - 181.215.3.255 ar +181.215.4.0 - 181.215.4.15 at +181.215.4.16 - 181.215.4.255 br +181.215.5.0 - 181.215.5.255 us +181.215.6.0 - 181.215.6.15 my +181.215.6.16 - 181.215.6.255 br +181.215.7.0 - 181.215.7.255 us +181.215.8.0 - 181.215.8.15 at +181.215.8.16 - 181.215.8.127 br +181.215.8.128 - 181.215.9.255 us +181.215.10.0 - 181.215.10.15 cz +181.215.10.16 - 181.215.10.255 br +181.215.11.0 - 181.215.11.255 us +181.215.12.0 - 181.215.12.15 au +181.215.12.16 - 181.215.12.255 br +181.215.13.0 - 181.215.13.255 us +181.215.14.0 - 181.215.14.15 my +181.215.14.16 - 181.215.14.255 br +181.215.15.0 - 181.215.15.255 us +181.215.16.0 - 181.215.16.15 lv +181.215.16.16 - 181.215.16.255 br +181.215.17.0 - 181.215.17.255 us +181.215.18.0 - 181.215.18.15 hk +181.215.18.16 - 181.215.18.255 br +181.215.19.0 - 181.215.19.255 us +181.215.20.0 - 181.215.20.15 sg +181.215.20.16 - 181.215.20.255 br +181.215.21.0 - 181.215.21.255 us +181.215.22.0 - 181.215.22.15 ee +181.215.22.16 - 181.215.22.255 br +181.215.23.0 - 181.215.23.255 us +181.215.24.0 - 181.215.24.15 my +181.215.24.16 - 181.215.24.255 br +181.215.25.0 - 181.215.25.255 us +181.215.26.0 - 181.215.26.15 hk +181.215.26.16 - 181.215.26.255 br +181.215.27.0 - 181.215.27.255 us +181.215.28.0 - 181.215.28.15 nl +181.215.28.16 - 181.215.28.255 br +181.215.29.0 - 181.215.29.255 us +181.215.30.0 - 181.215.30.15 tr +181.215.30.16 - 181.215.30.255 br +181.215.31.0 - 181.215.31.255 us +181.215.32.0 - 181.215.32.15 es +181.215.32.16 - 181.215.32.255 br +181.215.33.0 - 181.215.33.255 us +181.215.34.0 - 181.215.34.15 kr +181.215.34.16 - 181.215.34.255 br +181.215.35.0 - 181.215.35.255 us +181.215.36.0 - 181.215.36.15 fr +181.215.36.16 - 181.215.36.255 br +181.215.37.0 - 181.215.37.255 us +181.215.38.0 - 181.215.38.15 my +181.215.38.16 - 181.215.38.255 br +181.215.39.0 - 181.215.39.255 us +181.215.40.0 - 181.215.40.15 th +181.215.40.16 - 181.215.40.255 br +181.215.41.0 - 181.215.41.255 us +181.215.42.0 - 181.215.42.15 au +181.215.42.16 - 181.215.42.255 br +181.215.43.0 - 181.215.43.255 us +181.215.44.0 - 181.215.44.15 hk +181.215.44.16 - 181.215.44.255 br +181.215.45.0 - 181.215.45.255 us +181.215.46.0 - 181.215.46.15 kr +181.215.46.16 - 181.215.46.255 br +181.215.47.0 - 181.215.47.255 us +181.215.48.0 - 181.215.48.15 tr +181.215.48.16 - 181.215.48.255 br +181.215.49.0 - 181.215.132.255 us +181.215.133.0 - 181.215.133.15 al +181.215.133.16 - 181.215.133.31 ad +181.215.133.32 - 181.215.133.47 ai +181.215.133.48 - 181.215.133.63 ag +181.215.133.64 - 181.215.133.79 ar +181.215.133.80 - 181.215.133.95 am +181.215.133.96 - 181.215.133.111 az +181.215.133.112 - 181.215.133.127 bs +181.215.133.128 - 181.215.133.255 us +181.215.134.0 - 181.215.134.15 bb +181.215.134.16 - 181.215.134.31 by +181.215.134.32 - 181.215.134.47 bz +181.215.134.48 - 181.215.134.63 bm +181.215.134.64 - 181.215.134.79 bo +181.215.134.80 - 181.215.134.95 ba +181.215.134.96 - 181.215.134.111 vg +181.215.134.112 - 181.215.134.127 ky +181.215.134.128 - 181.215.134.255 us +181.215.135.0 - 181.215.135.15 cn +181.215.135.16 - 181.215.135.31 co +181.215.135.32 - 181.215.135.47 gg +181.215.135.48 - 181.215.135.63 cu +181.215.135.64 - 181.215.135.79 cy +181.215.135.80 - 181.215.135.95 dk +181.215.135.96 - 181.215.135.111 do +181.215.135.112 - 181.215.135.127 ec +181.215.135.128 - 181.215.135.255 us +181.215.136.0 - 181.215.136.15 eg +181.215.136.16 - 181.215.136.23 gq +181.215.136.24 - 181.215.136.31 nz +181.215.136.32 - 181.215.136.47 gf +181.215.136.48 - 181.215.136.63 pf +181.215.136.64 - 181.215.136.79 ge +181.215.136.80 - 181.215.136.95 sv +181.215.136.96 - 181.215.136.111 gd +181.215.136.112 - 181.215.136.127 gt +181.215.136.128 - 181.215.136.255 us +181.215.137.0 - 181.215.137.15 hn +181.215.137.16 - 181.215.137.31 ir +181.215.137.32 - 181.215.137.47 jm +181.215.137.48 - 181.215.137.63 jo +181.215.137.64 - 181.215.137.79 kg +181.215.137.80 - 181.215.137.95 lb +181.215.137.96 - 181.215.137.111 li +181.215.137.112 - 181.215.137.127 mg +181.215.137.128 - 181.215.137.255 us +181.215.138.0 - 181.215.138.15 mt +181.215.138.16 - 181.215.138.31 mq +181.215.138.32 - 181.215.138.39 mu +181.215.138.40 - 181.215.138.47 cl +181.215.138.48 - 181.215.138.63 mx +181.215.138.64 - 181.215.138.79 mc +181.215.138.80 - 181.215.138.95 me +181.215.138.96 - 181.215.138.111 nc +181.215.138.112 - 181.215.138.127 ni +181.215.138.128 - 181.215.139.255 us +181.215.140.0 - 181.215.140.15 om +181.215.140.16 - 181.215.140.31 pk +181.215.140.32 - 181.215.140.47 pe +181.215.140.48 - 181.215.140.63 ph +181.215.140.64 - 181.215.140.79 pr +181.215.140.80 - 181.215.140.95 qa +181.215.140.96 - 181.215.140.103 lc +181.215.140.104 - 181.215.140.111 in +181.215.140.112 - 181.215.140.127 rs +181.215.140.128 - 181.215.140.255 us +181.215.141.0 - 181.215.141.15 sc +181.215.141.16 - 181.215.141.31 si +181.215.141.32 - 181.215.141.47 kr +181.215.141.48 - 181.215.141.63 lk +181.215.141.64 - 181.215.141.79 tw +181.215.141.80 - 181.215.141.87 tt +181.215.141.88 - 181.215.141.95 cr +181.215.141.96 - 181.215.141.111 uy +181.215.141.112 - 181.215.141.127 ve +181.215.141.128 - 181.215.141.255 us +181.215.142.0 - 181.215.142.63 nz +181.215.142.64 - 181.215.142.127 no +181.215.142.128 - 181.215.143.255 us +181.215.144.0 - 181.215.144.63 nl +181.215.144.64 - 181.215.144.127 se +181.215.144.128 - 181.215.145.255 us +181.215.146.0 - 181.215.146.63 is +181.215.146.64 - 181.215.146.127 fr +181.215.146.128 - 181.215.147.255 us +181.215.148.0 - 181.215.148.63 be +181.215.148.64 - 181.215.148.127 nz +181.215.148.128 - 181.215.151.255 us +181.215.152.0 - 181.215.152.63 nl +181.215.152.64 - 181.215.152.127 fi +181.215.152.128 - 181.215.153.255 us +181.215.154.0 - 181.215.154.31 dk +181.215.154.32 - 181.215.255.255 us +181.216.0.0 - 181.223.255.255 br +181.224.0.0 - 181.224.63.255 cr +181.224.64.0 - 181.224.64.255 pa +181.224.65.0 - 181.224.65.255 cr +181.224.66.0 - 181.224.71.255 pa +181.224.72.0 - 181.224.72.255 cr +181.224.73.0 - 181.224.76.255 pa +181.224.77.0 - 181.224.80.255 cr +181.224.81.0 - 181.224.81.255 pa +181.224.82.0 - 181.224.90.255 cr +181.224.91.0 - 181.224.91.255 pa +181.224.92.0 - 181.224.95.255 cr +181.224.96.0 - 181.224.127.255 ar +181.224.128.0 - 181.224.130.255 us +181.224.131.0 - 181.224.131.255 nl +181.224.132.0 - 181.224.134.255 us +181.224.135.0 - 181.224.135.255 nl +181.224.136.0 - 181.224.151.255 us +181.224.152.0 - 181.224.153.255 nl +181.224.154.0 - 181.224.159.255 pa +181.224.160.0 - 181.224.163.255 co +181.224.164.0 - 181.224.167.255 ar +181.224.168.0 - 181.224.171.255 do +181.224.172.0 - 181.224.175.255 ec +181.224.176.0 - 181.224.191.255 ar +181.224.192.0 - 181.224.199.255 cr +181.224.200.0 - 181.224.203.255 pe +181.224.204.0 - 181.224.207.255 do +181.224.208.0 - 181.224.215.255 ar +181.224.216.0 - 181.224.223.255 cr +181.224.224.0 - 181.224.255.255 pe +181.225.0.0 - 181.225.31.255 ar +181.225.32.0 - 181.225.63.255 ve +181.225.64.0 - 181.225.111.255 co +181.225.112.0 - 181.225.127.255 cl +181.225.128.0 - 181.225.135.255 sv +181.225.136.0 - 181.225.139.255 ar +181.225.140.0 - 181.225.151.255 cl +181.225.152.0 - 181.225.159.255 ar +181.225.160.0 - 181.225.191.255 pe +181.225.192.0 - 181.225.223.255 ar +181.225.224.0 - 181.225.254.255 cu +181.225.255.0 - 181.225.255.255 hu +181.226.0.0 - 181.226.255.255 cl +181.227.0.0 - 181.227.255.255 bo +181.228.0.0 - 181.231.255.255 ar +181.232.0.0 - 181.232.127.255 co +181.232.128.0 - 181.233.66.255 cr +181.233.67.0 - 181.233.67.255 pa +181.233.68.0 - 181.233.72.255 cr +181.233.73.0 - 181.233.73.255 pa +181.233.74.0 - 181.233.74.255 cr +181.233.75.0 - 181.233.75.255 pa +181.233.76.0 - 181.233.76.255 cr +181.233.77.0 - 181.233.77.255 pa +181.233.78.0 - 181.233.87.255 cr +181.233.88.0 - 181.233.88.255 pa +181.233.89.0 - 181.233.91.255 cr +181.233.92.0 - 181.233.92.255 pa +181.233.93.0 - 181.233.97.255 cr +181.233.98.0 - 181.233.98.255 pa +181.233.99.0 - 181.233.100.255 cr +181.233.101.0 - 181.233.102.255 pa +181.233.103.0 - 181.233.108.255 cr +181.233.109.0 - 181.233.109.255 pa +181.233.110.0 - 181.233.110.255 cr +181.233.111.0 - 181.233.111.255 pa +181.233.112.0 - 181.233.117.255 cr +181.233.118.0 - 181.233.118.255 pa +181.233.119.0 - 181.233.147.255 cr +181.233.148.0 - 181.233.151.255 br +181.233.152.0 - 181.233.191.255 cr +181.233.192.0 - 181.233.255.255 pe +181.234.0.0 - 181.237.255.255 co +181.238.0.0 - 181.239.255.255 ar +181.240.0.0 - 181.255.255.255 co 182.0.0.0 - 182.15.255.255 id 182.16.0.0 - 182.16.127.255 hk 182.16.128.0 - 182.16.139.255 ph 182.16.140.0 - 182.16.143.255 sg +182.16.144.0 - 182.16.151.255 cn 182.16.152.0 - 182.16.155.255 nz 182.16.156.0 - 182.16.159.255 bd 182.16.160.0 - 182.16.191.255 id @@ -82313,6 +62816,7 @@ 182.49.0.0 - 182.50.15.255 cn 182.50.16.0 - 182.50.63.255 kr 182.50.64.0 - 182.50.67.255 np +182.50.68.0 - 182.50.71.255 in 182.50.72.0 - 182.50.75.255 ws 182.50.76.0 - 182.50.79.255 sg 182.50.80.0 - 182.50.95.255 th @@ -82329,17 +62833,21 @@ 182.51.0.0 - 182.51.255.255 cn 182.52.0.0 - 182.53.255.255 th 182.54.0.0 - 182.54.127.255 cn -182.54.128.0 - 182.54.159.255 ph 182.54.160.0 - 182.54.175.255 nz 182.54.176.0 - 182.54.191.255 jp 182.54.192.0 - 182.54.223.255 my 182.54.224.0 - 182.54.227.255 au 182.54.228.0 - 182.54.231.255 sg -182.54.232.0 - 182.54.234.255 au +182.54.232.0 - 182.54.232.255 au +182.54.233.0 - 182.54.233.255 eu +182.54.234.0 - 182.54.234.255 us 182.54.235.0 - 182.54.235.255 es -182.54.236.0 - 182.54.239.255 au +182.54.236.0 - 182.54.236.255 il +182.54.237.0 - 182.54.237.255 gb +182.54.238.0 - 182.54.238.255 us +182.54.239.0 - 182.54.239.255 sg 182.54.240.0 - 182.54.243.255 jp -182.54.244.0 - 182.54.247.255 hk +182.54.244.0 - 182.54.247.255 cn 182.54.248.0 - 182.54.255.255 jp 182.55.0.0 - 182.55.255.255 sg 182.56.0.0 - 182.60.255.255 in @@ -82365,7 +62873,13 @@ 182.160.128.0 - 182.160.191.255 au 182.160.192.0 - 182.160.255.255 jp 182.161.0.0 - 182.161.31.255 lk -182.161.32.0 - 182.161.63.255 my +182.161.32.0 - 182.161.35.255 au +182.161.36.0 - 182.161.43.255 hk +182.161.44.0 - 182.161.47.255 au +182.161.48.0 - 182.161.51.255 sg +182.161.52.0 - 182.161.55.255 in +182.161.56.0 - 182.161.59.255 nz +182.161.60.0 - 182.161.63.255 hk 182.161.64.0 - 182.161.71.255 jp 182.161.72.0 - 182.161.75.255 sg 182.161.76.0 - 182.161.79.255 jp @@ -82378,7 +62892,10 @@ 182.172.0.0 - 182.172.255.255 kr 182.173.0.0 - 182.173.63.255 tw 182.173.64.0 - 182.173.67.255 in -182.173.68.0 - 182.173.71.255 tw +182.173.68.0 - 182.173.68.255 vg +182.173.69.0 - 182.173.69.255 jp +182.173.70.0 - 182.173.70.255 vn +182.173.71.0 - 182.173.71.255 vg 182.173.72.0 - 182.173.75.255 my 182.173.76.0 - 182.173.79.255 hk 182.173.80.0 - 182.173.127.255 kr @@ -82401,8 +62918,7 @@ 182.237.4.0 - 182.237.7.255 au 182.237.8.0 - 182.237.19.255 in 182.237.20.0 - 182.237.23.255 vn -182.237.24.0 - 182.237.27.255 in -182.237.28.0 - 182.237.31.255 ph +182.237.24.0 - 182.237.31.255 cn 182.237.32.0 - 182.237.127.255 kr 182.237.128.0 - 182.237.191.255 in 182.237.192.0 - 182.237.255.255 kr @@ -82425,7 +62941,6 @@ 182.255.20.0 - 182.255.23.255 my 182.255.24.0 - 182.255.27.255 hk 182.255.28.0 - 182.255.31.255 au -182.255.32.0 - 182.255.63.255 ph 182.255.64.0 - 182.255.79.255 jp 182.255.80.0 - 182.255.127.255 au 182.255.128.0 - 182.255.255.255 kr @@ -82433,9 +62948,10 @@ 183.72.0.0 - 183.77.255.255 jp 183.78.0.0 - 183.78.127.255 my 183.78.128.0 - 183.78.159.255 kr -183.78.160.0 - 183.78.167.255 in +183.78.160.0 - 183.78.167.255 cn 183.78.168.0 - 183.78.171.255 my 183.78.172.0 - 183.78.175.255 au +183.78.176.0 - 183.78.179.255 hk 183.78.180.0 - 183.78.183.255 cn 183.78.184.0 - 183.78.187.255 in 183.78.188.0 - 183.78.191.255 jp @@ -82447,7 +62963,7 @@ 183.81.152.0 - 183.81.159.255 id 183.81.160.0 - 183.81.167.255 my 183.81.168.0 - 183.81.171.255 mn -183.81.172.0 - 183.81.175.255 th +183.81.172.0 - 183.81.175.255 cn 183.81.176.0 - 183.81.179.255 jp 183.81.180.0 - 183.81.183.255 cn 183.81.184.0 - 183.81.191.255 kh @@ -82479,8 +62995,15 @@ 183.128.0.0 - 183.170.255.255 cn 183.171.0.0 - 183.171.255.255 my 183.172.0.0 - 183.175.255.255 cn -183.176.0.0 - 183.177.63.255 jp -183.177.64.0 - 183.177.95.255 hk +183.176.0.0 - 183.177.55.255 jp +183.177.56.0 - 183.177.63.255 au +183.177.64.0 - 183.177.67.255 tw +183.177.68.0 - 183.177.71.255 kr +183.177.72.0 - 183.177.79.255 sg +183.177.80.0 - 183.177.81.255 hk +183.177.82.0 - 183.177.83.255 sg +183.177.84.0 - 183.177.87.255 jp +183.177.88.0 - 183.177.95.255 hk 183.177.96.0 - 183.177.111.255 mn 183.177.112.0 - 183.177.119.255 ph 183.177.120.0 - 183.177.123.255 au @@ -82490,308 +63013,9086 @@ 183.180.0.0 - 183.181.255.255 jp 183.182.0.0 - 183.182.31.255 cn 183.182.32.0 - 183.182.63.255 jp -183.182.64.0 - 183.182.79.255 ph -183.182.80.0 - 183.182.83.255 hk +183.182.64.0 - 183.182.79.255 bz +183.182.80.0 - 183.182.81.7 hk +183.182.81.8 - 183.182.81.8 sg +183.182.81.9 - 183.182.81.231 hk +183.182.81.232 - 183.182.81.239 sg +183.182.81.240 - 183.182.83.255 hk 183.182.84.0 - 183.182.91.255 in 183.182.92.0 - 183.182.95.255 id 183.182.96.0 - 183.182.127.255 la 183.182.128.0 - 183.183.255.255 jp 183.184.0.0 - 183.255.255.255 cn -184.0.0.0 - 184.63.255.255 us +184.0.0.0 - 184.21.255.255 us +184.22.0.0 - 184.22.95.255 th +184.22.96.0 - 184.22.111.255 us +184.22.112.0 - 184.22.223.255 th +184.22.224.0 - 184.24.95.255 us +184.24.96.0 - 184.24.97.255 nl +184.24.98.0 - 184.24.98.255 us +184.24.99.0 - 184.24.111.255 nl +184.24.112.0 - 184.24.191.255 us +184.24.192.0 - 184.24.207.255 nl +184.24.208.0 - 184.25.31.255 us +184.25.32.0 - 184.25.47.255 nl +184.25.48.0 - 184.25.106.255 us +184.25.107.0 - 184.25.107.255 nl +184.25.108.0 - 184.25.157.255 us +184.25.158.0 - 184.25.159.255 nl +184.25.160.0 - 184.25.215.255 us +184.25.216.0 - 184.25.219.255 nl +184.25.220.0 - 184.25.253.255 us +184.25.254.0 - 184.25.254.255 au +184.25.255.0 - 184.26.159.255 us +184.26.160.0 - 184.26.160.255 nl +184.26.161.0 - 184.26.164.255 us +184.26.165.0 - 184.26.165.255 nl +184.26.166.0 - 184.27.31.255 us +184.27.32.0 - 184.27.35.255 nl +184.27.36.0 - 184.27.135.255 us +184.27.136.0 - 184.27.139.255 nl +184.27.140.0 - 184.27.194.255 us +184.27.195.0 - 184.27.195.255 nl +184.27.196.0 - 184.27.205.255 us +184.27.206.0 - 184.27.207.255 nl +184.27.208.0 - 184.27.209.255 us +184.27.210.0 - 184.27.211.255 nl +184.27.212.0 - 184.28.53.255 us +184.28.54.0 - 184.28.57.255 nl +184.28.58.0 - 184.28.59.255 us +184.28.60.0 - 184.28.61.255 nl +184.28.62.0 - 184.28.73.255 us +184.28.74.0 - 184.28.77.255 nl +184.28.78.0 - 184.28.79.255 us +184.28.80.0 - 184.28.81.255 nl +184.28.82.0 - 184.28.82.255 us +184.28.83.0 - 184.28.83.255 nl +184.28.84.0 - 184.28.91.255 us +184.28.92.0 - 184.28.93.255 nl +184.28.94.0 - 184.28.97.255 us +184.28.98.0 - 184.28.99.255 nl +184.28.100.0 - 184.28.100.255 us +184.28.101.0 - 184.28.106.255 nl +184.28.107.0 - 184.28.147.255 us +184.28.148.0 - 184.28.151.255 nl +184.28.152.0 - 184.28.179.255 us +184.28.180.0 - 184.28.181.255 nl +184.28.182.0 - 184.29.63.255 us +184.29.64.0 - 184.29.67.255 nl +184.29.68.0 - 184.30.95.255 us +184.30.96.0 - 184.30.111.255 nl +184.30.112.0 - 184.30.207.255 us +184.30.208.0 - 184.30.223.255 nl +184.30.224.0 - 184.31.79.255 us +184.31.80.0 - 184.31.95.255 nl +184.31.96.0 - 184.50.29.255 us +184.50.30.0 - 184.50.31.255 nl +184.50.32.0 - 184.50.94.255 us +184.50.95.0 - 184.50.95.255 nl +184.50.96.0 - 184.50.159.255 us +184.50.160.0 - 184.50.175.255 nl +184.50.176.0 - 184.51.145.255 us +184.51.146.0 - 184.51.146.255 nl +184.51.147.0 - 184.51.147.255 us +184.51.148.0 - 184.51.149.255 nl +184.51.150.0 - 184.51.153.255 us +184.51.154.0 - 184.51.154.127 ca +184.51.154.128 - 184.51.198.255 us +184.51.199.0 - 184.51.199.255 kr +184.51.200.0 - 184.51.201.255 us +184.51.202.0 - 184.51.202.255 in +184.51.203.0 - 184.51.253.255 us +184.51.254.0 - 184.51.255.255 nl +184.52.0.0 - 184.63.255.255 us 184.64.0.0 - 184.71.255.255 ca 184.72.0.0 - 184.75.127.255 us 184.75.128.0 - 184.75.143.255 ca 184.75.144.0 - 184.75.207.255 us 184.75.208.0 - 184.75.223.255 ca -184.75.224.0 - 184.93.255.255 us +184.75.224.0 - 184.81.255.255 us +184.82.0.0 - 184.82.255.255 th +184.83.0.0 - 184.84.181.255 us +184.84.182.0 - 184.84.182.255 nl +184.84.183.0 - 184.84.211.255 us +184.84.212.0 - 184.84.215.255 nl +184.84.216.0 - 184.84.220.255 us +184.84.221.0 - 184.84.221.255 au +184.84.222.0 - 184.84.233.255 us +184.84.234.0 - 184.84.235.255 nl +184.84.236.0 - 184.84.237.255 us +184.84.238.0 - 184.84.238.255 au +184.84.239.0 - 184.84.255.255 us +184.85.0.0 - 184.85.15.255 nl +184.85.16.0 - 184.85.143.255 us +184.85.144.0 - 184.85.159.255 nl +184.85.160.0 - 184.85.175.255 us +184.85.176.0 - 184.85.191.255 nl +184.85.192.0 - 184.85.222.255 us +184.85.223.0 - 184.85.223.255 nl +184.85.224.0 - 184.85.241.255 us +184.85.242.0 - 184.85.243.255 nl +184.85.244.0 - 184.85.247.255 us +184.85.248.0 - 184.85.248.255 nl +184.85.249.0 - 184.85.250.255 us +184.85.251.0 - 184.85.251.255 nl +184.85.252.0 - 184.85.255.255 us +184.86.0.0 - 184.86.15.255 nl +184.86.16.0 - 184.86.47.255 us +184.86.48.0 - 184.86.63.255 nl +184.86.64.0 - 184.86.79.255 us +184.86.80.0 - 184.86.83.255 nl +184.86.84.0 - 184.86.87.255 us +184.86.88.0 - 184.86.91.255 nl +184.86.92.0 - 184.86.99.255 us +184.86.100.0 - 184.86.101.255 nl +184.86.102.0 - 184.86.107.255 us +184.86.108.0 - 184.86.111.255 nl +184.86.112.0 - 184.86.175.255 us +184.86.176.0 - 184.86.191.255 nl +184.86.192.0 - 184.86.207.255 us +184.86.208.0 - 184.86.209.255 nl +184.86.210.0 - 184.86.222.255 us +184.86.223.0 - 184.86.223.255 au +184.86.224.0 - 184.86.231.255 nl +184.86.232.0 - 184.86.235.255 us +184.86.236.0 - 184.86.239.255 nl +184.86.240.0 - 184.87.175.255 us +184.87.176.0 - 184.87.193.255 nl +184.87.194.0 - 184.87.215.255 us +184.87.216.0 - 184.87.223.255 nl +184.87.224.0 - 184.93.255.255 us 184.94.0.0 - 184.94.127.255 ca 184.94.128.0 - 184.94.175.255 us 184.94.176.0 - 184.94.191.255 ca 184.94.192.0 - 184.94.255.255 us 184.95.0.0 - 184.95.15.255 pr -184.95.16.0 - 184.95.32.7 us -184.95.32.8 - 184.95.32.15 au -184.95.32.16 - 184.95.33.175 us -184.95.33.176 - 184.95.33.183 au -184.95.33.184 - 184.95.35.95 us -184.95.35.96 - 184.95.35.127 cn -184.95.35.128 - 184.95.37.87 us -184.95.37.88 - 184.95.37.95 au -184.95.37.96 - 184.95.46.135 us -184.95.46.136 - 184.95.46.143 br -184.95.46.144 - 184.95.47.23 us -184.95.47.24 - 184.95.47.31 au -184.95.47.32 - 184.95.48.47 us -184.95.48.48 - 184.95.48.55 au -184.95.48.56 - 184.95.49.223 us -184.95.49.224 - 184.95.49.231 au -184.95.49.232 - 184.95.53.95 us -184.95.53.96 - 184.95.53.103 au -184.95.53.104 - 184.95.54.23 us -184.95.54.24 - 184.95.54.31 au -184.95.54.32 - 184.95.57.119 us -184.95.57.120 - 184.95.57.143 au -184.95.57.144 - 184.95.57.159 us -184.95.57.160 - 184.95.57.175 au -184.95.57.176 - 184.95.57.223 us -184.95.57.224 - 184.95.57.231 au -184.95.57.232 - 184.95.58.215 us -184.95.58.216 - 184.95.58.223 au -184.95.58.224 - 184.95.59.63 us -184.95.59.64 - 184.95.59.71 au -184.95.59.72 - 184.95.59.119 us -184.95.59.120 - 184.95.59.127 au -184.95.59.128 - 184.95.62.63 us -184.95.62.64 - 184.95.62.87 au -184.95.62.88 - 184.95.62.143 us -184.95.62.144 - 184.95.62.151 au -184.95.62.152 - 184.95.191.255 us +184.95.16.0 - 184.95.191.255 us 184.95.192.0 - 184.95.255.255 ca -184.96.0.0 - 184.105.202.255 us -184.105.203.0 - 184.105.203.63 cn -184.105.203.64 - 184.105.203.111 us -184.105.203.112 - 184.105.203.127 cn -184.105.203.128 - 184.105.203.199 us -184.105.203.200 - 184.105.203.207 cn -184.105.203.208 - 184.106.0.199 us -184.106.0.200 - 184.106.0.207 ar -184.106.0.208 - 184.106.1.159 us -184.106.1.160 - 184.106.1.167 au -184.106.1.168 - 184.106.1.207 us -184.106.1.208 - 184.106.1.215 ca -184.106.1.216 - 184.106.2.7 us -184.106.2.8 - 184.106.2.15 ca -184.106.2.16 - 184.106.2.55 us -184.106.2.56 - 184.106.2.63 ca -184.106.2.64 - 184.106.2.103 us -184.106.2.104 - 184.106.2.111 au -184.106.2.112 - 184.106.2.159 us -184.106.2.160 - 184.106.2.175 au -184.106.2.176 - 184.106.3.31 us -184.106.3.32 - 184.106.3.39 gb -184.106.3.40 - 184.106.3.111 us -184.106.3.112 - 184.106.3.119 ca -184.106.3.120 - 184.106.3.127 gb -184.106.3.128 - 184.106.3.239 us -184.106.3.240 - 184.106.3.247 gb -184.106.3.248 - 184.106.4.63 us -184.106.4.64 - 184.106.4.79 gb -184.106.4.80 - 184.106.4.95 ca -184.106.4.96 - 184.106.7.127 us -184.106.7.128 - 184.106.7.143 ie -184.106.7.144 - 184.106.7.191 us -184.106.7.192 - 184.106.7.199 au -184.106.7.200 - 184.106.7.215 us -184.106.7.216 - 184.106.7.223 mx -184.106.7.224 - 184.106.9.31 us -184.106.9.32 - 184.106.9.79 ca -184.106.9.80 - 184.106.9.239 us -184.106.9.240 - 184.106.9.255 ca -184.106.10.0 - 184.106.10.23 us -184.106.10.24 - 184.106.10.31 il -184.106.10.32 - 184.106.12.71 us -184.106.12.72 - 184.106.12.79 be -184.106.12.80 - 184.106.12.255 us -184.106.13.0 - 184.106.13.7 ca -184.106.13.8 - 184.106.13.15 us -184.106.13.16 - 184.106.13.23 ca -184.106.13.24 - 184.106.13.223 us -184.106.13.224 - 184.106.13.231 ca -184.106.13.232 - 184.106.14.31 us -184.106.14.32 - 184.106.14.39 gb -184.106.14.40 - 184.106.14.87 us -184.106.14.88 - 184.106.14.95 au -184.106.14.96 - 184.106.15.103 us -184.106.15.104 - 184.106.15.111 ca -184.106.15.112 - 184.106.15.223 us -184.106.15.224 - 184.106.15.231 mx -184.106.15.232 - 184.106.16.7 us -184.106.16.8 - 184.106.16.11 mx -184.106.16.12 - 184.106.16.65 us -184.106.16.66 - 184.106.16.67 il -184.106.16.68 - 184.106.16.89 us -184.106.16.90 - 184.106.16.91 fr -184.106.16.92 - 184.106.19.135 us -184.106.19.136 - 184.106.19.143 ca -184.106.19.144 - 184.106.20.71 us -184.106.20.72 - 184.106.20.79 gb -184.106.20.80 - 184.106.20.231 us -184.106.20.232 - 184.106.20.239 ca -184.106.20.240 - 184.106.21.127 us -184.106.21.128 - 184.106.21.159 ca -184.106.21.160 - 184.106.21.255 us -184.106.22.0 - 184.106.22.15 ca -184.106.22.16 - 184.106.22.159 us -184.106.22.160 - 184.106.22.191 ca -184.106.22.192 - 184.106.22.255 us -184.106.23.0 - 184.106.23.15 ca -184.106.23.16 - 184.106.30.19 us -184.106.30.20 - 184.106.30.23 ca -184.106.30.24 - 184.106.30.47 us -184.106.30.48 - 184.106.30.51 mx -184.106.30.52 - 184.106.30.135 us -184.106.30.136 - 184.106.30.139 ca -184.106.30.140 - 184.106.30.235 us -184.106.30.236 - 184.106.30.239 ca -184.106.30.240 - 184.106.31.63 us -184.106.31.64 - 184.106.31.79 gb -184.106.31.80 - 184.106.32.55 us -184.106.32.56 - 184.106.32.63 au -184.106.32.64 - 184.106.32.191 us -184.106.32.192 - 184.106.32.199 gb -184.106.32.200 - 184.106.34.95 us -184.106.34.96 - 184.106.34.103 ca -184.106.34.104 - 184.106.34.223 us -184.106.34.224 - 184.106.34.231 ie -184.106.34.232 - 184.106.35.79 us -184.106.35.80 - 184.106.35.87 ca -184.106.35.88 - 184.106.40.239 us -184.106.40.240 - 184.106.40.255 gb -184.106.41.0 - 184.106.43.95 us -184.106.43.96 - 184.106.43.103 kw -184.106.43.104 - 184.106.44.55 us -184.106.44.56 - 184.106.44.57 ca -184.106.44.58 - 184.106.44.61 us -184.106.44.62 - 184.106.44.63 mx -184.106.44.64 - 184.106.44.79 us -184.106.44.80 - 184.106.44.81 ca -184.106.44.82 - 184.106.44.141 us -184.106.44.142 - 184.106.44.143 mx -184.106.44.144 - 184.106.45.239 us -184.106.45.240 - 184.106.45.243 au -184.106.45.244 - 184.106.49.87 us -184.106.49.88 - 184.106.49.95 ca -184.106.49.96 - 184.106.56.15 us -184.106.56.16 - 184.106.56.31 ca -184.106.56.32 - 184.106.56.47 us -184.106.56.48 - 184.106.56.55 mx -184.106.56.56 - 184.106.56.111 us -184.106.56.112 - 184.106.56.119 ie -184.106.56.120 - 184.106.56.135 us -184.106.56.136 - 184.106.56.139 ca -184.106.56.140 - 184.106.56.235 us -184.106.56.236 - 184.106.56.239 mx -184.106.56.240 - 184.106.62.71 us -184.106.62.72 - 184.106.62.75 gb -184.106.62.76 - 184.106.88.71 us -184.106.88.72 - 184.106.88.75 au -184.106.88.76 - 184.106.88.79 il -184.106.88.80 - 184.106.124.63 us -184.106.124.64 - 184.106.124.127 de -184.106.124.128 - 184.106.124.159 us -184.106.124.160 - 184.106.124.191 gb -184.106.124.192 - 184.106.255.255 us -184.107.0.0 - 184.107.255.255 ca +184.96.0.0 - 184.105.70.255 us +184.105.71.0 - 184.105.71.255 ca +184.105.72.0 - 184.105.77.255 us +184.105.78.0 - 184.105.78.255 pr +184.105.79.0 - 184.105.80.24 us +184.105.80.25 - 184.105.80.25 at +184.105.80.26 - 184.105.80.93 us +184.105.80.94 - 184.105.80.94 de +184.105.80.95 - 184.105.80.152 us +184.105.80.153 - 184.105.80.153 fr +184.105.80.154 - 184.105.81.52 us +184.105.81.53 - 184.105.81.53 at +184.105.81.54 - 184.105.179.255 us +184.105.180.0 - 184.105.180.255 ca +184.105.181.0 - 184.105.213.233 us +184.105.213.234 - 184.105.213.234 cz +184.105.213.235 - 184.105.222.133 us +184.105.222.134 - 184.105.222.134 at +184.105.222.135 - 184.106.255.255 us +184.107.0.0 - 184.107.12.135 ca +184.107.12.136 - 184.107.12.143 bd +184.107.12.144 - 184.107.49.119 ca +184.107.49.120 - 184.107.49.127 gi +184.107.49.128 - 184.107.83.15 ca +184.107.83.16 - 184.107.83.23 dz +184.107.83.24 - 184.107.99.223 ca +184.107.99.224 - 184.107.99.231 co +184.107.99.232 - 184.107.225.55 ca +184.107.225.56 - 184.107.225.63 us +184.107.225.64 - 184.107.255.255 ca 184.108.0.0 - 184.143.255.255 us 184.144.0.0 - 184.151.255.255 ca 184.152.0.0 - 184.159.255.255 us 184.160.0.0 - 184.163.255.255 ca 184.164.0.0 - 184.169.47.255 us 184.169.48.0 - 184.169.63.255 ca -184.169.64.0 - 184.169.255.255 us +184.169.64.0 - 184.169.64.255 us +184.169.65.0 - 184.169.67.255 se +184.169.68.0 - 184.169.69.255 sg +184.169.70.0 - 184.169.77.255 us +184.169.78.0 - 184.169.78.255 nl +184.169.79.0 - 184.169.79.255 de +184.169.80.0 - 184.169.80.255 fr +184.169.81.0 - 184.169.81.255 gb +184.169.82.0 - 184.169.82.255 il +184.169.83.0 - 184.169.83.255 au +184.169.84.0 - 184.169.84.255 jp +184.169.85.0 - 184.169.87.255 es +184.169.88.0 - 184.169.88.255 hk +184.169.89.0 - 184.169.90.255 in +184.169.91.0 - 184.169.91.255 nl +184.169.92.0 - 184.169.92.255 de +184.169.93.0 - 184.169.93.255 fr +184.169.94.0 - 184.169.94.255 eu +184.169.95.0 - 184.169.95.255 se +184.169.96.0 - 184.169.255.255 us 184.170.0.0 - 184.170.63.255 jm 184.170.64.0 - 184.170.127.255 us 184.170.128.0 - 184.170.143.255 ca -184.170.144.0 - 184.171.162.31 us -184.171.162.32 - 184.171.162.39 mv -184.171.162.40 - 184.171.191.255 us +184.170.144.0 - 184.171.191.255 us 184.171.192.0 - 184.171.223.255 ca -184.171.224.0 - 184.172.0.7 us -184.172.0.8 - 184.172.0.15 kw -184.172.0.16 - 184.172.2.143 us -184.172.2.144 - 184.172.2.151 pa -184.172.2.152 - 184.172.5.95 us -184.172.5.96 - 184.172.5.127 eg -184.172.5.128 - 184.172.6.31 us -184.172.6.32 - 184.172.6.39 pa -184.172.6.40 - 184.172.6.239 us -184.172.6.240 - 184.172.6.247 pa -184.172.6.248 - 184.172.7.215 us -184.172.7.216 - 184.172.7.223 au -184.172.7.224 - 184.172.24.207 us -184.172.24.208 - 184.172.24.215 in -184.172.24.216 - 184.172.25.63 us -184.172.25.64 - 184.172.25.95 br -184.172.25.96 - 184.172.30.95 us -184.172.30.96 - 184.172.30.103 au -184.172.30.104 - 184.172.32.215 us -184.172.32.216 - 184.172.32.223 br -184.172.32.224 - 184.172.34.135 us -184.172.34.136 - 184.172.34.143 br -184.172.34.144 - 184.172.37.87 us -184.172.37.88 - 184.172.37.95 au -184.172.37.96 - 184.172.40.47 us -184.172.40.48 - 184.172.40.55 in -184.172.40.56 - 184.172.43.175 us -184.172.43.176 - 184.172.43.191 nl -184.172.43.192 - 184.172.43.207 us -184.172.43.208 - 184.172.43.215 nl -184.172.43.216 - 184.172.61.199 us -184.172.61.200 - 184.172.61.207 pl -184.172.61.208 - 184.172.162.255 us -184.172.163.0 - 184.172.163.31 in -184.172.163.32 - 184.172.165.191 us -184.172.165.192 - 184.172.165.199 bd -184.172.165.200 - 184.172.165.207 us -184.172.165.208 - 184.172.165.215 bd -184.172.165.216 - 184.172.167.7 us -184.172.167.8 - 184.172.167.15 bd -184.172.167.16 - 184.172.170.223 us -184.172.170.224 - 184.172.170.255 eg -184.172.171.0 - 184.172.181.239 us -184.172.181.240 - 184.172.181.247 cn -184.172.181.248 - 184.172.200.15 us -184.172.200.16 - 184.172.200.23 hk -184.172.200.24 - 184.172.201.79 us -184.172.201.80 - 184.172.201.87 cl -184.172.201.88 - 184.172.210.255 us -184.172.211.0 - 184.172.211.7 bd -184.172.211.8 - 184.172.219.47 us -184.172.219.48 - 184.172.219.55 ma -184.172.219.56 - 184.172.220.47 us -184.172.220.48 - 184.172.220.55 my -184.172.220.56 - 184.172.222.207 us -184.172.222.208 - 184.172.222.215 br -184.172.222.216 - 184.173.78.95 us -184.173.78.96 - 184.173.78.111 in -184.173.78.112 - 184.173.78.191 us -184.173.78.192 - 184.173.78.199 au -184.173.78.200 - 184.173.79.255 us -184.173.80.0 - 184.173.80.7 mx -184.173.80.8 - 184.173.100.119 us -184.173.100.120 - 184.173.100.127 br -184.173.100.128 - 184.173.101.167 us -184.173.101.168 - 184.173.101.175 jo -184.173.101.176 - 184.173.111.39 us -184.173.111.40 - 184.173.111.47 mx -184.173.111.48 - 184.173.117.159 us -184.173.117.160 - 184.173.117.191 br -184.173.117.192 - 184.173.122.159 us -184.173.122.160 - 184.173.122.191 br -184.173.122.192 - 184.173.125.183 us -184.173.125.184 - 184.173.125.191 gb -184.173.125.192 - 184.173.125.255 us -184.173.126.0 - 184.173.126.31 ar -184.173.126.32 - 184.173.135.15 us -184.173.135.16 - 184.173.135.31 in -184.173.135.32 - 184.173.140.143 us -184.173.140.144 - 184.173.140.159 lt -184.173.140.160 - 184.173.166.207 us -184.173.166.208 - 184.173.166.215 sa -184.173.166.216 - 184.173.174.255 us -184.173.175.0 - 184.173.175.7 es -184.173.175.8 - 184.174.255.255 us +184.171.224.0 - 184.173.255.255 us +184.174.0.0 - 184.174.15.255 pk +184.174.16.0 - 184.174.255.255 us 184.175.0.0 - 184.175.63.255 ca -184.175.64.0 - 184.175.75.255 us +184.175.64.0 - 184.175.70.255 us +184.175.71.0 - 184.175.74.255 ca +184.175.75.0 - 184.175.75.255 us 184.175.76.0 - 184.175.76.255 ca -184.175.77.0 - 184.175.99.255 us -184.175.100.0 - 184.175.100.63 in -184.175.100.64 - 184.175.104.255 us +184.175.77.0 - 184.175.104.255 us 184.175.105.0 - 184.175.105.255 ca 184.175.106.0 - 184.175.119.255 us 184.175.120.0 - 184.175.120.255 ca 184.175.121.0 - 184.255.255.255 us -185.0.0.0 - 185.63.255.255 eu +185.1.0.0 - 185.1.0.255 ru +185.1.1.0 - 185.1.1.255 ps +185.1.2.0 - 185.1.3.255 fr +185.1.4.0 - 185.1.7.255 pl +185.1.8.0 - 185.1.8.255 ae +185.1.9.0 - 185.1.11.255 pl +185.1.12.0 - 185.1.12.255 no +185.1.13.0 - 185.1.13.255 ru +185.1.14.0 - 185.1.14.255 fr +185.1.15.0 - 185.1.15.255 ae +185.1.16.0 - 185.1.16.255 ua +185.1.17.0 - 185.1.17.255 pl +185.1.18.0 - 185.1.18.255 de +185.1.19.0 - 185.1.19.255 ru +185.1.20.0 - 185.1.20.255 es +185.1.21.0 - 185.1.21.255 at +185.1.22.0 - 185.1.22.255 pl +185.1.23.0 - 185.1.23.255 ru +185.1.24.0 - 185.1.24.255 hu +185.1.25.0 - 185.1.25.255 cz +185.1.26.0 - 185.1.26.255 fr +185.1.27.0 - 185.1.27.255 rs +185.1.28.0 - 185.1.28.255 fr +185.1.29.0 - 185.1.29.255 pl +185.1.30.0 - 185.1.30.255 bg +185.1.31.0 - 185.1.31.255 at +185.1.32.0 - 185.1.32.255 nl +185.1.33.0 - 185.1.33.255 gb +185.1.34.0 - 185.1.34.255 sk +185.1.35.0 - 185.1.35.255 de +185.1.36.0 - 185.1.36.255 ro +185.1.37.0 - 185.1.37.255 pl +185.1.38.0 - 185.1.38.255 fr +185.1.39.0 - 185.1.39.255 ua +185.1.40.0 - 185.1.40.255 bg +185.1.41.0 - 185.1.41.255 ru +185.1.42.0 - 185.1.42.255 pl +185.1.43.0 - 185.1.43.255 at +185.1.44.0 - 185.1.44.255 me +185.1.45.0 - 185.1.45.255 md +185.1.46.0 - 185.1.46.255 it +185.1.47.0 - 185.1.47.255 fr +185.1.48.0 - 185.1.48.255 de +185.1.49.0 - 185.1.49.255 ru +185.1.50.0 - 185.1.51.255 ua +185.1.52.0 - 185.1.52.255 ru +185.1.53.0 - 185.1.53.255 gb +185.1.54.0 - 185.1.54.255 de +185.1.55.0 - 185.1.55.255 no +185.1.56.0 - 185.1.56.255 bg +185.1.57.0 - 185.1.57.255 dk +185.1.58.0 - 185.1.58.255 de +185.1.59.0 - 185.1.59.255 bg +185.1.60.0 - 185.1.61.255 de +185.1.62.0 - 185.1.63.255 ua +185.1.64.0 - 185.1.64.255 ru +185.1.65.0 - 185.1.65.255 no +185.1.66.0 - 185.1.66.255 fr +185.1.67.0 - 185.1.67.255 ru +185.1.68.0 - 185.1.68.255 es +185.2.0.0 - 185.2.3.255 ch +185.2.4.0 - 185.2.7.255 it +185.2.8.0 - 185.2.11.255 de +185.2.12.0 - 185.2.15.255 ir +185.2.16.0 - 185.2.19.255 de +185.2.20.0 - 185.2.23.255 ch +185.2.24.0 - 185.2.27.255 nl +185.2.28.0 - 185.2.28.255 se +185.2.29.0 - 185.2.31.255 nl +185.2.32.0 - 185.2.32.255 de +185.2.33.0 - 185.2.35.255 ru +185.2.36.0 - 185.2.39.255 pl +185.2.40.0 - 185.2.41.255 cz +185.2.42.0 - 185.2.42.255 sk +185.2.43.0 - 185.2.43.127 cz +185.2.43.128 - 185.2.43.159 sk +185.2.43.160 - 185.2.43.255 cz +185.2.44.0 - 185.2.51.255 nl +185.2.52.0 - 185.2.55.255 be +185.2.56.0 - 185.2.59.255 de +185.2.60.0 - 185.2.63.255 pl +185.2.64.0 - 185.2.67.255 ie +185.2.68.0 - 185.2.71.255 es +185.2.72.0 - 185.2.75.255 ru +185.2.76.0 - 185.2.79.255 pl +185.2.80.0 - 185.2.83.255 nl +185.2.84.0 - 185.2.87.255 pt +185.2.88.0 - 185.2.91.255 ru +185.2.92.0 - 185.2.95.255 be +185.2.96.0 - 185.2.99.255 cy +185.2.100.0 - 185.2.103.255 de +185.2.104.0 - 185.2.107.255 ru +185.2.108.0 - 185.2.111.255 ua +185.2.112.0 - 185.2.115.255 pl +185.2.116.0 - 185.2.123.255 de +185.2.124.0 - 185.2.127.255 ru +185.2.128.0 - 185.2.131.255 es +185.2.132.0 - 185.2.135.255 de +185.2.136.0 - 185.2.139.255 gb +185.2.140.0 - 185.2.143.255 de +185.2.144.0 - 185.2.147.255 it +185.2.148.0 - 185.2.149.255 nl +185.2.150.0 - 185.2.151.255 es +185.2.152.0 - 185.2.155.255 se +185.2.156.0 - 185.2.159.255 at +185.2.160.0 - 185.2.163.255 de +185.2.164.0 - 185.2.171.255 gb +185.2.172.0 - 185.2.175.255 nl +185.2.176.0 - 185.2.176.255 tr +185.2.177.0 - 185.2.177.255 ae +185.2.178.0 - 185.2.178.255 ar +185.2.179.0 - 185.2.179.255 at +185.2.180.0 - 185.2.183.255 de +185.2.184.0 - 185.2.187.255 ru +185.2.188.0 - 185.2.191.255 mk +185.2.192.0 - 185.2.199.255 gb +185.2.200.0 - 185.2.203.255 de +185.2.204.0 - 185.2.207.255 gb +185.2.208.0 - 185.2.211.255 bg +185.2.212.0 - 185.2.215.255 ua +185.2.216.0 - 185.2.223.255 gb +185.2.224.0 - 185.2.227.255 kz +185.2.228.0 - 185.2.228.255 lt +185.2.229.0 - 185.2.229.255 se +185.2.230.0 - 185.2.230.7 lt +185.2.230.8 - 185.2.230.31 se +185.2.230.32 - 185.2.230.159 lt +185.2.230.160 - 185.2.231.255 se +185.2.232.0 - 185.2.235.255 sa +185.2.236.0 - 185.2.239.255 gb +185.2.240.0 - 185.2.243.255 nl +185.2.244.0 - 185.2.247.255 qa +185.2.248.0 - 185.2.251.255 de +185.2.252.0 - 185.2.255.255 fr +185.3.0.0 - 185.3.7.255 no +185.3.8.0 - 185.3.11.255 cz +185.3.12.0 - 185.3.15.255 dk +185.3.16.0 - 185.3.19.255 ru +185.3.20.0 - 185.3.23.255 lb +185.3.24.0 - 185.3.27.255 fr +185.3.28.0 - 185.3.31.255 eu +185.3.32.0 - 185.3.35.255 ru +185.3.36.0 - 185.3.39.255 it +185.3.40.0 - 185.3.43.255 de +185.3.44.0 - 185.3.47.255 lu +185.3.48.0 - 185.3.51.255 se +185.3.52.0 - 185.3.55.255 je +185.3.56.0 - 185.3.59.255 tr +185.3.60.0 - 185.3.63.255 pl +185.3.64.0 - 185.3.67.255 fr +185.3.68.0 - 185.3.71.255 ru +185.3.72.0 - 185.3.79.255 gb +185.3.80.0 - 185.3.83.255 de +185.3.84.0 - 185.3.90.255 gb +185.3.91.0 - 185.3.91.255 eu +185.3.92.0 - 185.3.95.255 gb +185.3.96.0 - 185.3.99.255 de +185.3.100.0 - 185.3.103.255 gg +185.3.104.0 - 185.3.107.255 nl +185.3.108.0 - 185.3.111.255 it +185.3.112.0 - 185.3.115.255 pl +185.3.116.0 - 185.3.119.255 es +185.3.120.0 - 185.3.121.255 bh +185.3.122.0 - 185.3.122.255 sa +185.3.123.0 - 185.3.123.255 bh +185.3.124.0 - 185.3.127.255 ir +185.3.128.0 - 185.3.131.255 fr +185.3.132.0 - 185.3.135.255 se +185.3.136.0 - 185.3.139.255 hu +185.3.140.0 - 185.3.143.255 ru +185.3.144.0 - 185.3.147.255 il +185.3.148.0 - 185.3.151.255 ua +185.3.152.0 - 185.3.155.255 ae +185.3.156.0 - 185.3.159.255 cz +185.3.160.0 - 185.3.163.255 be +185.3.164.0 - 185.3.167.255 gb +185.3.168.0 - 185.3.171.255 fr +185.3.172.0 - 185.3.175.255 ru +185.3.176.0 - 185.3.179.255 nl +185.3.180.0 - 185.3.183.255 ru +185.3.184.0 - 185.3.187.255 de +185.3.188.0 - 185.3.191.255 am +185.3.192.0 - 185.3.195.255 hr +185.3.196.0 - 185.3.199.255 fr +185.3.200.0 - 185.3.203.255 ir +185.3.204.0 - 185.3.211.255 nl +185.3.212.0 - 185.3.215.255 ir +185.3.216.0 - 185.3.219.255 be +185.3.220.0 - 185.3.223.255 gr +185.3.224.0 - 185.3.227.255 pl +185.3.228.0 - 185.3.231.255 lt +185.3.232.0 - 185.3.235.255 de +185.3.236.0 - 185.3.239.255 es +185.3.240.0 - 185.3.243.255 ru +185.3.244.0 - 185.3.247.255 hu +185.3.248.0 - 185.3.251.255 de +185.3.252.0 - 185.3.255.255 it +185.4.0.0 - 185.4.3.255 ir +185.4.4.0 - 185.4.7.255 gb +185.4.8.0 - 185.4.11.255 se +185.4.12.0 - 185.4.15.255 gb +185.4.16.0 - 185.4.19.255 ir +185.4.20.0 - 185.4.23.255 fr +185.4.24.0 - 185.4.27.255 gb +185.4.28.0 - 185.4.31.255 ir +185.4.32.0 - 185.4.35.255 es +185.4.36.0 - 185.4.39.255 no +185.4.40.0 - 185.4.43.255 ua +185.4.44.0 - 185.4.47.255 fr +185.4.48.0 - 185.4.51.255 gb +185.4.52.0 - 185.4.55.255 ad +185.4.56.0 - 185.4.59.255 ru +185.4.60.0 - 185.4.63.255 fr +185.4.64.0 - 185.4.67.255 ru +185.4.68.0 - 185.4.71.255 tr +185.4.72.0 - 185.4.75.255 ee +185.4.76.0 - 185.4.79.255 fr +185.4.80.0 - 185.4.83.255 bg +185.4.84.0 - 185.4.87.255 sy +185.4.88.0 - 185.4.91.255 gr +185.4.92.0 - 185.4.95.255 es +185.4.96.0 - 185.4.103.255 gb +185.4.104.0 - 185.4.107.255 ir +185.4.108.0 - 185.4.111.255 ru +185.4.112.0 - 185.4.115.255 nl +185.4.116.0 - 185.4.119.255 gb +185.4.120.0 - 185.4.123.255 at +185.4.124.0 - 185.4.127.255 fr +185.4.128.0 - 185.4.131.255 gb +185.4.132.0 - 185.4.135.255 gr +185.4.136.0 - 185.4.139.255 dk +185.4.140.0 - 185.4.143.255 it +185.4.144.0 - 185.4.147.255 ru +185.4.148.0 - 185.4.148.255 nl +185.4.149.0 - 185.4.149.255 hr +185.4.150.0 - 185.4.151.255 nl +185.4.152.0 - 185.4.155.255 it +185.4.156.0 - 185.4.159.255 gb +185.4.160.0 - 185.4.163.255 uz +185.4.164.0 - 185.4.167.255 gb +185.4.168.0 - 185.4.171.255 ch +185.4.172.0 - 185.4.175.255 no +185.4.176.0 - 185.4.183.255 ru +185.4.184.0 - 185.4.191.255 es +185.4.192.0 - 185.4.195.255 ie +185.4.196.0 - 185.4.199.255 gb +185.4.200.0 - 185.4.203.255 cz +185.4.204.0 - 185.4.207.255 ru +185.4.208.0 - 185.4.211.255 tr +185.4.212.0 - 185.4.215.255 pl +185.4.216.0 - 185.4.219.255 dk +185.4.220.0 - 185.4.223.255 ir +185.4.224.0 - 185.4.227.255 tr +185.4.228.0 - 185.4.231.255 fi +185.4.232.0 - 185.4.235.255 de +185.4.236.0 - 185.4.239.255 ua +185.4.240.0 - 185.4.243.255 gb +185.4.244.0 - 185.4.247.255 es +185.4.248.0 - 185.4.251.255 fr +185.4.252.0 - 185.4.255.255 lb +185.5.0.0 - 185.5.3.255 gb +185.5.4.0 - 185.5.7.255 mk +185.5.8.0 - 185.5.15.255 de +185.5.16.0 - 185.5.19.255 ru +185.5.20.0 - 185.5.23.255 se +185.5.24.0 - 185.5.31.255 de +185.5.32.0 - 185.5.35.255 ch +185.5.36.0 - 185.5.39.255 gb +185.5.40.0 - 185.5.43.255 ru +185.5.44.0 - 185.5.44.255 se +185.5.45.0 - 185.5.45.255 lu +185.5.46.0 - 185.5.47.255 se +185.5.48.0 - 185.5.51.255 mt +185.5.52.0 - 185.5.55.255 lt +185.5.56.0 - 185.5.59.255 ch +185.5.60.0 - 185.5.63.255 it +185.5.64.0 - 185.5.67.255 gb +185.5.68.0 - 185.5.71.255 cz +185.5.72.0 - 185.5.75.255 eu +185.5.76.0 - 185.5.79.255 gr +185.5.80.0 - 185.5.83.255 de +185.5.84.0 - 185.5.87.255 es +185.5.88.0 - 185.5.91.255 gb +185.5.92.0 - 185.5.95.255 it +185.5.96.0 - 185.5.99.255 pl +185.5.100.0 - 185.5.103.255 de +185.5.104.0 - 185.5.107.255 ua +185.5.108.0 - 185.5.111.255 fr +185.5.112.0 - 185.5.115.255 it +185.5.116.0 - 185.5.119.255 bg +185.5.120.0 - 185.5.123.255 nl +185.5.124.0 - 185.5.127.255 es +185.5.128.0 - 185.5.131.255 ru +185.5.132.0 - 185.5.135.255 nl +185.5.136.0 - 185.5.143.255 ru +185.5.144.0 - 185.5.147.255 gb +185.5.148.0 - 185.5.151.255 ru +185.5.152.0 - 185.5.155.255 sa +185.5.156.0 - 185.5.159.255 ir +185.5.160.0 - 185.5.163.255 ru +185.5.164.0 - 185.5.167.255 dk +185.5.168.0 - 185.5.171.255 de +185.5.172.0 - 185.5.175.255 ro +185.5.176.0 - 185.5.179.255 tr +185.5.180.0 - 185.5.183.255 it +185.5.184.0 - 185.5.187.255 ch +185.5.188.0 - 185.5.191.255 gb +185.5.192.0 - 185.5.195.255 ru +185.5.196.0 - 185.5.203.255 it +185.5.204.0 - 185.5.207.255 ru +185.5.208.0 - 185.5.211.255 it +185.5.212.0 - 185.5.215.255 fr +185.5.216.0 - 185.5.219.255 pl +185.5.220.0 - 185.5.223.255 ps +185.5.224.0 - 185.5.227.255 cz +185.5.228.0 - 185.5.231.255 hu +185.5.232.0 - 185.5.235.255 no +185.5.236.0 - 185.5.239.255 es +185.5.240.0 - 185.5.243.255 ie +185.5.244.0 - 185.5.247.255 it +185.5.248.0 - 185.5.251.255 ru +185.5.252.0 - 185.5.255.255 ua +185.6.0.0 - 185.6.3.255 pl +185.6.4.0 - 185.6.7.255 es +185.6.8.0 - 185.6.11.255 se +185.6.12.0 - 185.6.15.255 ru +185.6.16.0 - 185.6.19.255 ps +185.6.20.0 - 185.6.23.255 mk +185.6.24.0 - 185.6.27.255 by +185.6.28.0 - 185.6.31.255 pl +185.6.32.0 - 185.6.35.255 es +185.6.36.0 - 185.6.39.255 ie +185.6.40.0 - 185.6.43.255 uz +185.6.44.0 - 185.6.47.255 ru +185.6.48.0 - 185.6.51.255 nl +185.6.52.0 - 185.6.55.255 pl +185.6.56.0 - 185.6.59.255 ps +185.6.60.0 - 185.6.63.255 fr +185.6.64.0 - 185.6.67.255 il +185.6.68.0 - 185.6.71.255 de +185.6.72.0 - 185.6.75.255 it +185.6.76.0 - 185.6.79.255 gr +185.6.80.0 - 185.6.83.255 ru +185.6.84.0 - 185.6.87.255 nl +185.6.88.0 - 185.6.91.255 it +185.6.92.0 - 185.6.95.255 fr +185.6.96.0 - 185.6.99.255 de +185.6.100.0 - 185.6.103.255 hu +185.6.104.0 - 185.6.107.255 ba +185.6.108.0 - 185.6.111.255 nl +185.6.112.0 - 185.6.115.255 pl +185.6.116.0 - 185.6.119.255 ru +185.6.120.0 - 185.6.123.255 de +185.6.124.0 - 185.6.127.255 ru +185.6.128.0 - 185.6.131.255 de +185.6.132.0 - 185.6.135.255 gb +185.6.136.0 - 185.6.139.255 hu +185.6.140.0 - 185.6.143.255 fr +185.6.144.0 - 185.6.147.255 de +185.6.148.0 - 185.6.151.255 lb +185.6.152.0 - 185.6.155.255 gb +185.6.156.0 - 185.6.159.255 hu +185.6.160.0 - 185.6.163.255 nl +185.6.164.0 - 185.6.167.255 ru +185.6.168.0 - 185.6.171.255 ch +185.6.172.0 - 185.6.175.255 ru +185.6.176.0 - 185.6.179.255 ee +185.6.180.0 - 185.6.183.255 fi +185.6.184.0 - 185.6.187.255 ua +185.6.188.0 - 185.6.191.255 rs +185.6.192.0 - 185.6.195.255 it +185.6.196.0 - 185.6.199.255 gb +185.6.200.0 - 185.6.203.255 es +185.6.204.0 - 185.6.207.255 nl +185.6.208.0 - 185.6.215.255 fr +185.6.216.0 - 185.6.219.255 ru +185.6.220.0 - 185.6.223.255 om +185.6.224.0 - 185.6.227.255 gb +185.6.228.0 - 185.6.231.255 ru +185.6.232.0 - 185.6.235.255 lu +185.6.236.0 - 185.6.239.255 ru +185.6.240.0 - 185.6.243.255 it +185.6.244.0 - 185.6.251.255 ru +185.6.252.0 - 185.6.255.255 de +185.7.0.0 - 185.7.3.255 tr +185.7.4.0 - 185.7.7.255 fr +185.7.8.0 - 185.7.11.255 bh +185.7.12.0 - 185.7.15.255 fr +185.7.16.0 - 185.7.19.255 at +185.7.20.0 - 185.7.27.255 cz +185.7.28.0 - 185.7.31.255 ru +185.7.32.0 - 185.7.33.255 se +185.7.34.0 - 185.7.35.255 nl +185.7.36.0 - 185.7.39.255 fr +185.7.40.0 - 185.7.43.255 ru +185.7.44.0 - 185.7.47.255 cz +185.7.48.0 - 185.7.51.255 ru +185.7.52.0 - 185.7.55.255 hr +185.7.56.0 - 185.7.59.255 de +185.7.60.0 - 185.7.63.255 no +185.7.64.0 - 185.7.67.255 fr +185.7.68.0 - 185.7.71.255 nl +185.7.72.0 - 185.7.75.255 fr +185.7.76.0 - 185.7.79.255 nl +185.7.80.0 - 185.7.83.255 gb +185.7.84.0 - 185.7.87.255 ru +185.7.88.0 - 185.7.91.255 gb +185.7.92.0 - 185.7.95.255 ru +185.7.96.0 - 185.7.99.255 gb +185.7.100.0 - 185.7.103.255 fr +185.7.104.0 - 185.7.107.255 pl +185.7.108.0 - 185.7.111.255 fr +185.7.112.0 - 185.7.115.255 it +185.7.116.0 - 185.7.119.255 ru +185.7.120.0 - 185.7.123.255 ps +185.7.124.0 - 185.7.127.255 at +185.7.128.0 - 185.7.131.255 lb +185.7.132.0 - 185.7.143.255 no +185.7.144.0 - 185.7.147.255 ru +185.7.148.0 - 185.7.151.255 gb +185.7.152.0 - 185.7.155.255 ru +185.7.156.0 - 185.7.159.255 cy +185.7.160.0 - 185.7.163.255 fr +185.7.164.0 - 185.7.167.255 gb +185.7.168.0 - 185.7.171.255 pl +185.7.172.0 - 185.7.175.255 ru +185.7.176.0 - 185.7.179.255 tr +185.7.180.0 - 185.7.183.255 ru +185.7.184.0 - 185.7.187.255 ie +185.7.188.0 - 185.7.191.255 gb +185.7.192.0 - 185.7.195.255 no +185.7.196.0 - 185.7.199.255 de +185.7.200.0 - 185.7.203.255 ru +185.7.204.0 - 185.7.207.255 bg +185.7.208.0 - 185.7.211.255 de +185.7.212.0 - 185.7.215.255 fr +185.7.216.0 - 185.7.219.255 bg +185.7.220.0 - 185.7.223.255 no +185.7.224.0 - 185.7.231.255 gb +185.7.232.0 - 185.7.235.255 ru +185.7.236.0 - 185.7.239.255 lv +185.7.240.0 - 185.7.243.255 fr +185.7.244.0 - 185.7.247.255 gb +185.7.248.0 - 185.7.251.255 nl +185.7.252.0 - 185.7.255.255 ee +185.8.0.0 - 185.8.3.255 am +185.8.4.0 - 185.8.7.255 ru +185.8.8.0 - 185.8.11.255 de +185.8.12.0 - 185.8.15.255 tr +185.8.16.0 - 185.8.19.255 no +185.8.20.0 - 185.8.23.255 ru +185.8.24.0 - 185.8.27.255 it +185.8.28.0 - 185.8.31.255 fr +185.8.32.0 - 185.8.35.255 tr +185.8.36.0 - 185.8.39.255 it +185.8.40.0 - 185.8.43.255 ua +185.8.44.0 - 185.8.47.255 be +185.8.48.0 - 185.8.51.255 fr +185.8.52.0 - 185.8.55.255 be +185.8.56.0 - 185.8.59.255 cz +185.8.60.0 - 185.8.63.255 lv +185.8.64.0 - 185.8.67.255 fr +185.8.68.0 - 185.8.71.255 md +185.8.72.0 - 185.8.75.255 hu +185.8.76.0 - 185.8.79.255 fr +185.8.80.0 - 185.8.83.255 se +185.8.84.0 - 185.8.87.255 de +185.8.88.0 - 185.8.95.255 gb +185.8.96.0 - 185.8.99.255 es +185.8.100.0 - 185.8.103.255 se +185.8.104.0 - 185.8.107.255 lt +185.8.108.0 - 185.8.111.255 gb +185.8.112.0 - 185.8.115.255 ie +185.8.116.0 - 185.8.119.255 de +185.8.120.0 - 185.8.123.255 it +185.8.124.0 - 185.8.127.255 ru +185.8.128.0 - 185.8.131.255 tr +185.8.132.0 - 185.8.135.255 gb +185.8.136.0 - 185.8.139.255 de +185.8.140.0 - 185.8.143.255 es +185.8.144.0 - 185.8.147.255 fr +185.8.148.0 - 185.8.151.255 it +185.8.152.0 - 185.8.155.255 ro +185.8.156.0 - 185.8.159.255 ru +185.8.160.0 - 185.8.167.255 cz +185.8.168.0 - 185.8.171.255 de +185.8.172.0 - 185.8.175.255 ir +185.8.176.0 - 185.8.179.255 nl +185.8.180.0 - 185.8.183.255 ru +185.8.184.0 - 185.8.187.255 at +185.8.188.0 - 185.8.191.255 cz +185.8.192.0 - 185.8.195.255 ie +185.8.196.0 - 185.8.199.255 it +185.8.200.0 - 185.8.203.255 ru +185.8.204.0 - 185.8.207.255 gb +185.8.208.0 - 185.8.211.255 ch +185.8.212.0 - 185.8.215.255 uz +185.8.216.0 - 185.8.223.255 ru +185.8.224.0 - 185.8.231.255 de +185.8.232.0 - 185.8.235.255 kz +185.8.236.0 - 185.8.239.255 cz +185.8.240.0 - 185.8.247.255 es +185.8.248.0 - 185.8.251.255 no +185.8.252.0 - 185.8.255.255 fr +185.9.0.0 - 185.9.3.255 se +185.9.4.0 - 185.9.7.255 dk +185.9.8.0 - 185.9.11.255 fi +185.9.12.0 - 185.9.15.255 de +185.9.16.0 - 185.9.18.255 gb +185.9.19.0 - 185.9.19.255 at +185.9.20.0 - 185.9.23.255 fr +185.9.24.0 - 185.9.27.255 dk +185.9.28.0 - 185.9.31.255 de +185.9.32.0 - 185.9.35.255 gb +185.9.36.0 - 185.9.39.255 tr +185.9.40.0 - 185.9.43.255 ua +185.9.44.0 - 185.9.47.255 al +185.9.48.0 - 185.9.51.255 gb +185.9.52.0 - 185.9.55.255 it +185.9.56.0 - 185.9.59.255 pl +185.9.60.0 - 185.9.63.255 se +185.9.64.0 - 185.9.67.255 de +185.9.68.0 - 185.9.71.255 iq +185.9.72.0 - 185.9.87.255 ru +185.9.88.0 - 185.9.91.255 no +185.9.92.0 - 185.9.95.255 gb +185.9.96.0 - 185.9.99.255 fr +185.9.100.0 - 185.9.103.255 mt +185.9.104.0 - 185.9.111.255 de +185.9.112.0 - 185.9.115.255 sk +185.9.116.0 - 185.9.119.255 cz +185.9.120.0 - 185.9.120.255 kz +185.9.121.0 - 185.9.121.255 ru +185.9.122.0 - 185.9.123.255 kz +185.9.124.0 - 185.9.127.255 pl +185.9.128.0 - 185.9.131.255 de +185.9.132.0 - 185.9.135.255 at +185.9.136.0 - 185.9.139.255 lb +185.9.140.0 - 185.9.143.255 dk +185.9.144.0 - 185.9.147.255 ru +185.9.148.0 - 185.9.151.255 it +185.9.152.0 - 185.9.155.255 fr +185.9.156.0 - 185.9.159.255 tr +185.9.160.0 - 185.9.163.255 ru +185.9.164.0 - 185.9.167.255 se +185.9.168.0 - 185.9.171.255 us +185.9.172.0 - 185.9.175.255 gb +185.9.176.0 - 185.9.183.255 de +185.9.184.0 - 185.9.187.255 ru +185.9.188.0 - 185.9.191.255 lu +185.9.192.0 - 185.9.195.255 es +185.9.196.0 - 185.9.199.255 kw +185.9.200.0 - 185.9.207.255 ru +185.9.208.0 - 185.9.211.255 it +185.9.212.0 - 185.9.215.255 gi +185.9.216.0 - 185.9.219.255 de +185.9.220.0 - 185.9.223.255 tr +185.9.224.0 - 185.9.227.255 de +185.9.228.0 - 185.9.231.255 ru +185.9.232.0 - 185.9.235.255 gb +185.9.236.0 - 185.9.243.255 us +185.9.244.0 - 185.9.247.255 ro +185.9.248.0 - 185.9.251.255 fr +185.9.252.0 - 185.9.255.255 nl +185.10.0.0 - 185.10.3.255 ru +185.10.4.0 - 185.10.7.255 il +185.10.8.0 - 185.10.11.255 dk +185.10.12.0 - 185.10.15.255 gb +185.10.16.0 - 185.10.19.255 fr +185.10.20.0 - 185.10.23.255 md +185.10.24.0 - 185.10.27.255 pl +185.10.28.0 - 185.10.31.255 no +185.10.32.0 - 185.10.35.255 it +185.10.36.0 - 185.10.39.255 de +185.10.40.0 - 185.10.43.255 hr +185.10.44.0 - 185.10.47.255 ru +185.10.48.0 - 185.10.51.255 nl +185.10.52.0 - 185.10.55.255 ch +185.10.56.0 - 185.10.58.126 nl +185.10.58.127 - 185.10.58.130 se +185.10.58.131 - 185.10.59.255 nl +185.10.60.0 - 185.10.63.255 ru +185.10.64.0 - 185.10.67.255 il +185.10.68.0 - 185.10.71.255 de +185.10.72.0 - 185.10.75.255 ir +185.10.76.0 - 185.10.79.255 it +185.10.80.0 - 185.10.87.255 es +185.10.88.0 - 185.10.91.255 gb +185.10.92.0 - 185.10.95.255 de +185.10.96.0 - 185.10.99.255 nl +185.10.100.0 - 185.10.103.255 gb +185.10.104.0 - 185.10.107.255 eu +185.10.108.0 - 185.10.111.255 de +185.10.112.0 - 185.10.115.255 sa +185.10.116.0 - 185.10.119.255 ie +185.10.120.0 - 185.10.123.255 pl +185.10.124.0 - 185.10.127.255 hu +185.10.128.0 - 185.10.131.255 ru +185.10.132.0 - 185.10.135.255 se +185.10.136.0 - 185.10.139.255 ru +185.10.140.0 - 185.10.143.255 rs +185.10.144.0 - 185.10.147.255 gb +185.10.148.0 - 185.10.151.255 de +185.10.152.0 - 185.10.155.255 ru +185.10.156.0 - 185.10.167.255 nl +185.10.168.0 - 185.10.171.255 es +185.10.172.0 - 185.10.175.255 ru +185.10.176.0 - 185.10.179.255 fr +185.10.180.0 - 185.10.187.255 ru +185.10.188.0 - 185.10.191.255 it +185.10.192.0 - 185.10.195.255 de +185.10.196.0 - 185.10.199.255 fi +185.10.200.0 - 185.10.203.255 gb +185.10.204.0 - 185.10.207.255 rs +185.10.208.0 - 185.10.211.255 ua +185.10.212.0 - 185.10.215.255 dk +185.10.216.0 - 185.10.219.255 jo +185.10.220.0 - 185.10.223.255 dk +185.10.224.0 - 185.10.227.255 ch +185.10.228.0 - 185.10.235.255 nl +185.10.236.0 - 185.10.239.255 cz +185.10.240.0 - 185.10.243.255 ly +185.10.244.0 - 185.10.247.255 de +185.10.248.0 - 185.10.251.255 es +185.10.252.0 - 185.10.255.255 fr +185.11.0.0 - 185.11.3.255 no +185.11.4.0 - 185.11.7.255 ru +185.11.8.0 - 185.11.11.255 ye +185.11.12.0 - 185.11.15.255 tr +185.11.16.0 - 185.11.19.255 de +185.11.20.0 - 185.11.23.255 it +185.11.24.0 - 185.11.27.255 lt +185.11.28.0 - 185.11.31.255 ua +185.11.32.0 - 185.11.35.255 ru +185.11.36.0 - 185.11.39.255 gb +185.11.40.0 - 185.11.40.255 cy +185.11.41.0 - 185.11.41.255 lu +185.11.42.0 - 185.11.43.255 cy +185.11.44.0 - 185.11.47.255 il +185.11.48.0 - 185.11.51.255 ru +185.11.52.0 - 185.11.55.255 it +185.11.56.0 - 185.11.59.255 ch +185.11.60.0 - 185.11.63.255 ru +185.11.64.0 - 185.11.67.255 ie +185.11.68.0 - 185.11.71.255 ir +185.11.72.0 - 185.11.75.255 ru +185.11.76.0 - 185.11.79.255 by +185.11.80.0 - 185.11.83.255 ua +185.11.84.0 - 185.11.87.255 at +185.11.88.0 - 185.11.91.255 ir +185.11.92.0 - 185.11.95.255 gb +185.11.96.0 - 185.11.99.255 se +185.11.100.0 - 185.11.103.255 pl +185.11.104.0 - 185.11.107.255 gb +185.11.108.0 - 185.11.111.255 pl +185.11.112.0 - 185.11.115.255 se +185.11.116.0 - 185.11.119.255 es +185.11.120.0 - 185.11.123.255 sa +185.11.124.0 - 185.11.127.255 us +185.11.128.0 - 185.11.131.255 pl +185.11.132.0 - 185.11.135.255 ru +185.11.136.0 - 185.11.139.255 de +185.11.140.0 - 185.11.143.255 gb +185.11.144.0 - 185.11.147.255 nl +185.11.148.0 - 185.11.151.255 ru +185.11.152.0 - 185.11.155.255 it +185.11.156.0 - 185.11.159.255 de +185.11.160.0 - 185.11.163.255 fr +185.11.164.0 - 185.11.167.255 pt +185.11.168.0 - 185.11.171.255 ch +185.11.172.0 - 185.11.175.255 hu +185.11.176.0 - 185.11.179.255 ir +185.11.180.0 - 185.11.183.255 no +185.11.184.0 - 185.11.187.255 gb +185.11.188.0 - 185.11.191.255 fr +185.11.192.0 - 185.11.195.255 it +185.11.196.0 - 185.11.199.255 ru +185.11.200.0 - 185.11.203.255 es +185.11.204.0 - 185.11.207.255 gb +185.11.208.0 - 185.11.211.255 fi +185.11.212.0 - 185.11.215.255 tr +185.11.216.0 - 185.11.219.255 fr +185.11.220.0 - 185.11.223.255 es +185.11.224.0 - 185.11.227.255 it +185.11.228.0 - 185.11.231.255 ru +185.11.232.0 - 185.11.235.255 it +185.11.236.0 - 185.11.239.255 es +185.11.240.0 - 185.11.243.255 gb +185.11.244.0 - 185.11.247.255 ru +185.11.248.0 - 185.11.251.255 tr +185.11.252.0 - 185.11.255.255 de +185.12.0.0 - 185.12.3.255 fr +185.12.4.0 - 185.12.7.255 ch +185.12.8.0 - 185.12.11.255 ua +185.12.12.0 - 185.12.15.255 nl +185.12.16.0 - 185.12.19.255 az +185.12.20.0 - 185.12.23.255 pl +185.12.24.0 - 185.12.27.255 iq +185.12.28.0 - 185.12.31.255 ru +185.12.32.0 - 185.12.35.255 fr +185.12.36.0 - 185.12.39.255 gb +185.12.40.0 - 185.12.43.255 me +185.12.44.0 - 185.12.47.255 ch +185.12.48.0 - 185.12.51.255 fr +185.12.52.0 - 185.12.55.255 ru +185.12.56.0 - 185.12.59.255 no +185.12.60.0 - 185.12.63.255 ir +185.12.64.0 - 185.12.67.255 de +185.12.68.0 - 185.12.71.255 ru +185.12.72.0 - 185.12.75.255 no +185.12.76.0 - 185.12.79.255 ba +185.12.80.0 - 185.12.83.255 ie +185.12.84.0 - 185.12.87.255 ru +185.12.88.0 - 185.12.91.255 de +185.12.92.0 - 185.12.95.255 ru +185.12.96.0 - 185.12.99.255 fr +185.12.100.0 - 185.12.103.255 ir +185.12.104.0 - 185.12.107.255 es +185.12.108.0 - 185.12.111.255 tr +185.12.112.0 - 185.12.115.255 ua +185.12.116.0 - 185.12.119.255 pt +185.12.120.0 - 185.12.123.255 nl +185.12.124.0 - 185.12.127.255 ru +185.12.128.0 - 185.12.131.255 ch +185.12.132.0 - 185.12.135.255 nl +185.12.136.0 - 185.12.139.255 gb +185.12.140.0 - 185.12.143.255 ua +185.12.144.0 - 185.12.147.255 nl +185.12.148.0 - 185.12.148.223 se +185.12.148.224 - 185.12.148.255 nl +185.12.149.0 - 185.12.149.223 se +185.12.149.224 - 185.12.149.255 nl +185.12.150.0 - 185.12.151.255 se +185.12.152.0 - 185.12.155.255 ru +185.12.156.0 - 185.12.159.255 ie +185.12.160.0 - 185.12.163.255 gb +185.12.164.0 - 185.12.167.255 sa +185.12.168.0 - 185.12.171.255 ba +185.12.172.0 - 185.12.175.255 sa +185.12.176.0 - 185.12.179.255 de +185.12.180.0 - 185.12.183.255 at +185.12.184.0 - 185.12.187.255 ps +185.12.188.0 - 185.12.195.255 gb +185.12.196.0 - 185.12.199.255 cz +185.12.200.0 - 185.12.203.255 gb +185.12.204.0 - 185.12.207.255 fr +185.12.208.0 - 185.12.211.255 ru +185.12.212.0 - 185.12.219.255 nl +185.12.220.0 - 185.12.223.255 lb +185.12.224.0 - 185.12.227.255 tr +185.12.228.0 - 185.12.231.255 ru +185.12.232.0 - 185.12.235.255 gb +185.12.236.0 - 185.12.239.255 ee +185.12.240.0 - 185.12.243.255 nl +185.12.244.0 - 185.12.247.255 jo +185.12.248.0 - 185.12.251.255 se +185.12.252.0 - 185.13.3.255 ru +185.13.4.0 - 185.13.7.255 ua +185.13.8.0 - 185.13.11.255 rs +185.13.12.0 - 185.13.15.255 gb +185.13.16.0 - 185.13.19.255 ee +185.13.20.0 - 185.13.23.255 kz +185.13.24.0 - 185.13.27.255 ru +185.13.28.0 - 185.13.31.255 de +185.13.32.0 - 185.13.35.255 ru +185.13.36.0 - 185.13.39.255 fr +185.13.40.0 - 185.13.43.255 gb +185.13.44.0 - 185.13.47.255 ru +185.13.48.0 - 185.13.51.255 gb +185.13.52.0 - 185.13.55.255 si +185.13.56.0 - 185.13.59.255 tr +185.13.60.0 - 185.13.63.255 es +185.13.64.0 - 185.13.67.255 fr +185.13.68.0 - 185.13.71.255 de +185.13.72.0 - 185.13.75.255 gb +185.13.76.0 - 185.13.79.255 es +185.13.80.0 - 185.13.83.255 gb +185.13.84.0 - 185.13.87.255 jo +185.13.88.0 - 185.13.91.255 lu +185.13.92.0 - 185.13.95.255 no +185.13.96.0 - 185.13.99.255 se +185.13.100.0 - 185.13.103.255 fr +185.13.104.0 - 185.13.106.191 gb +185.13.106.192 - 185.13.106.199 ch +185.13.106.200 - 185.13.111.255 gb +185.13.112.0 - 185.13.123.255 ru +185.13.124.0 - 185.13.127.255 no +185.13.128.0 - 185.13.131.255 fr +185.13.132.0 - 185.13.139.255 ru +185.13.140.0 - 185.13.143.255 gb +185.13.144.0 - 185.13.147.255 pl +185.13.148.0 - 185.13.151.255 de +185.13.152.0 - 185.13.155.255 lv +185.13.156.0 - 185.13.159.255 de +185.13.160.0 - 185.13.163.255 ru +185.13.164.0 - 185.13.167.255 it +185.13.168.0 - 185.13.175.255 pl +185.13.176.0 - 185.13.179.255 ru +185.13.180.0 - 185.13.183.255 fr +185.13.184.0 - 185.13.187.255 pl +185.13.188.0 - 185.13.191.255 gb +185.13.192.0 - 185.13.195.255 il +185.13.196.0 - 185.13.199.255 am +185.13.200.0 - 185.13.203.255 es +185.13.204.0 - 185.13.207.255 gb +185.13.208.0 - 185.13.211.255 de +185.13.212.0 - 185.13.219.255 fr +185.13.220.0 - 185.13.223.255 it +185.13.224.0 - 185.13.227.255 nl +185.13.228.0 - 185.13.231.255 ir +185.13.232.0 - 185.13.235.255 pl +185.13.236.0 - 185.13.239.255 mk +185.13.240.0 - 185.13.243.255 ba +185.13.244.0 - 185.13.247.255 gb +185.13.248.0 - 185.13.251.255 ua +185.13.252.0 - 185.13.255.255 it +185.14.0.0 - 185.14.3.255 fr +185.14.4.0 - 185.14.7.255 ru +185.14.8.0 - 185.14.11.255 it +185.14.12.0 - 185.14.15.255 de +185.14.16.0 - 185.14.19.255 ua +185.14.20.0 - 185.14.23.255 tr +185.14.24.0 - 185.14.27.255 es +185.14.28.0 - 185.14.31.255 nl +185.14.32.0 - 185.14.35.255 ru +185.14.36.0 - 185.14.39.255 es +185.14.40.0 - 185.14.47.255 ru +185.14.48.0 - 185.14.51.255 de +185.14.52.0 - 185.14.55.255 at +185.14.56.0 - 185.14.59.255 es +185.14.60.0 - 185.14.63.255 gb +185.14.64.0 - 185.14.67.255 tr +185.14.68.0 - 185.14.71.255 ru +185.14.72.0 - 185.14.75.255 pl +185.14.76.0 - 185.14.79.255 it +185.14.80.0 - 185.14.83.255 ir +185.14.84.0 - 185.14.87.255 gb +185.14.88.0 - 185.14.91.255 ru +185.14.92.0 - 185.14.95.255 de +185.14.96.0 - 185.14.99.255 cy +185.14.100.0 - 185.14.103.255 kz +185.14.104.0 - 185.14.107.255 fr +185.14.108.0 - 185.14.111.255 ch +185.14.112.0 - 185.14.115.255 pl +185.14.116.0 - 185.14.119.255 sk +185.14.120.0 - 185.14.123.255 fr +185.14.124.0 - 185.14.127.255 ba +185.14.128.0 - 185.14.131.255 fr +185.14.132.0 - 185.14.135.255 jo +185.14.136.0 - 185.14.147.255 gb +185.14.148.0 - 185.14.151.255 pl +185.14.152.0 - 185.14.155.255 gb +185.14.156.0 - 185.14.159.255 ch +185.14.160.0 - 185.14.163.255 ir +185.14.164.0 - 185.14.167.255 gb +185.14.168.0 - 185.14.171.255 nl +185.14.172.0 - 185.14.175.255 tr +185.14.176.0 - 185.14.183.255 fr +185.14.184.0 - 185.14.187.255 nl +185.14.188.0 - 185.14.191.255 cz +185.14.192.0 - 185.14.192.255 ua +185.14.193.0 - 185.14.193.255 ca +185.14.194.0 - 185.14.194.127 gb +185.14.194.128 - 185.14.194.255 ru +185.14.195.0 - 185.14.195.255 ua +185.14.196.0 - 185.14.199.255 sa +185.14.200.0 - 185.14.203.255 gr +185.14.204.0 - 185.14.207.255 mk +185.14.208.0 - 185.14.215.255 gb +185.14.216.0 - 185.14.219.255 ee +185.14.220.0 - 185.14.223.255 gb +185.14.224.0 - 185.14.227.255 cz +185.14.228.0 - 185.14.231.255 fr +185.14.232.0 - 185.14.235.255 cz +185.14.236.0 - 185.14.239.255 it +185.14.240.0 - 185.14.243.255 se +185.14.244.0 - 185.14.247.255 fr +185.14.248.0 - 185.14.251.255 iq +185.14.252.0 - 185.14.255.255 cz +185.15.0.0 - 185.15.3.255 pl +185.15.4.0 - 185.15.7.255 ua +185.15.8.0 - 185.15.11.255 de +185.15.12.0 - 185.15.15.255 nl +185.15.16.0 - 185.15.19.255 fr +185.15.20.0 - 185.15.23.255 pt +185.15.24.0 - 185.15.27.255 fr +185.15.28.0 - 185.15.31.255 hr +185.15.32.0 - 185.15.33.255 gb +185.15.34.0 - 185.15.35.255 ie +185.15.36.0 - 185.15.39.255 de +185.15.40.0 - 185.15.43.255 tr +185.15.44.0 - 185.15.47.255 pl +185.15.48.0 - 185.15.52.255 fr +185.15.53.0 - 185.15.53.255 gb +185.15.54.0 - 185.15.55.255 fr +185.15.56.0 - 185.15.59.255 nl +185.15.60.0 - 185.15.63.255 ru +185.15.64.0 - 185.15.67.255 ba +185.15.68.0 - 185.15.71.255 fr +185.15.72.0 - 185.15.75.255 dk +185.15.76.0 - 185.15.79.255 es +185.15.80.0 - 185.15.83.255 pl +185.15.84.0 - 185.15.91.255 ru +185.15.92.0 - 185.15.95.255 de +185.15.96.0 - 185.15.99.255 ru +185.15.100.0 - 185.15.103.255 es +185.15.104.0 - 185.15.107.255 gb +185.15.108.0 - 185.15.111.255 cz +185.15.112.0 - 185.15.115.255 ge +185.15.116.0 - 185.15.119.255 ru +185.15.120.0 - 185.15.123.255 se +185.15.124.0 - 185.15.127.255 dk +185.15.128.0 - 185.15.131.255 fr +185.15.132.0 - 185.15.135.255 pl +185.15.136.0 - 185.15.139.255 ae +185.15.140.0 - 185.15.143.255 fr +185.15.144.0 - 185.15.147.255 cz +185.15.148.0 - 185.15.151.255 es +185.15.152.0 - 185.15.155.255 no +185.15.156.0 - 185.15.159.255 by +185.15.160.0 - 185.15.163.255 it +185.15.164.0 - 185.15.167.255 nl +185.15.168.0 - 185.15.171.255 it +185.15.172.0 - 185.15.175.255 ru +185.15.176.0 - 185.15.187.255 de +185.15.188.0 - 185.15.191.255 ru +185.15.192.0 - 185.15.195.255 de +185.15.196.0 - 185.15.199.255 tr +185.15.200.0 - 185.15.203.255 ch +185.15.204.0 - 185.15.207.255 gb +185.15.208.0 - 185.15.211.255 ru +185.15.212.0 - 185.15.215.255 fi +185.15.216.0 - 185.15.219.255 no +185.15.220.0 - 185.15.223.255 nl +185.15.224.0 - 185.15.227.255 gb +185.15.228.0 - 185.15.231.255 ch +185.15.232.0 - 185.15.235.255 pl +185.15.236.0 - 185.15.239.255 at +185.15.240.0 - 185.15.243.255 gb +185.15.244.0 - 185.15.247.255 de +185.15.248.0 - 185.15.251.255 nl +185.15.252.0 - 185.15.255.255 cz +185.16.0.0 - 185.16.3.255 gb +185.16.4.0 - 185.16.7.255 kw +185.16.8.0 - 185.16.11.255 ru +185.16.12.0 - 185.16.15.255 ba +185.16.16.0 - 185.16.19.255 dk +185.16.20.0 - 185.16.23.255 nl +185.16.24.0 - 185.16.27.255 iq +185.16.28.0 - 185.16.31.255 ua +185.16.32.0 - 185.16.39.255 pl +185.16.40.0 - 185.16.43.255 gb +185.16.44.0 - 185.16.51.255 fr +185.16.52.0 - 185.16.55.255 at +185.16.56.0 - 185.16.59.255 ru +185.16.60.0 - 185.16.63.255 de +185.16.64.0 - 185.16.67.255 ru +185.16.68.0 - 185.16.68.255 gb +185.16.69.0 - 185.16.70.255 je +185.16.71.0 - 185.16.71.255 gb +185.16.72.0 - 185.16.75.255 de +185.16.76.0 - 185.16.79.255 at +185.16.80.0 - 185.16.83.255 gi +185.16.84.0 - 185.16.87.255 se +185.16.88.0 - 185.16.91.255 il +185.16.92.0 - 185.16.95.255 se +185.16.96.0 - 185.16.99.255 fi +185.16.100.0 - 185.16.107.255 ru +185.16.108.0 - 185.16.111.255 de +185.16.112.0 - 185.16.115.255 at +185.16.116.0 - 185.16.119.255 ru +185.16.120.0 - 185.16.123.255 es +185.16.124.0 - 185.16.127.255 ua +185.16.128.0 - 185.16.131.255 pl +185.16.132.0 - 185.16.135.255 it +185.16.136.0 - 185.16.139.255 ru +185.16.140.0 - 185.16.143.255 dk +185.16.144.0 - 185.16.147.255 pl +185.16.148.0 - 185.16.151.255 cy +185.16.152.0 - 185.16.155.255 gb +185.16.156.0 - 185.16.159.255 dk +185.16.160.0 - 185.16.163.255 gb +185.16.164.0 - 185.16.167.255 gr +185.16.168.0 - 185.16.171.255 fi +185.16.172.0 - 185.16.175.255 ch +185.16.176.0 - 185.16.179.255 ru +185.16.180.0 - 185.16.183.255 cz +185.16.184.0 - 185.16.187.255 de +185.16.188.0 - 185.16.191.255 at +185.16.192.0 - 185.16.195.255 mt +185.16.196.0 - 185.16.199.255 de +185.16.200.0 - 185.16.203.255 se +185.16.204.0 - 185.16.207.255 gb +185.16.208.0 - 185.16.211.255 es +185.16.212.0 - 185.16.215.255 ru +185.16.216.0 - 185.16.219.255 us +185.16.220.0 - 185.16.223.255 fr +185.16.224.0 - 185.16.227.255 gb +185.16.228.0 - 185.16.231.255 ua +185.16.232.0 - 185.16.235.255 ir +185.16.236.0 - 185.16.239.255 tr +185.16.240.0 - 185.16.243.255 be +185.16.244.0 - 185.16.247.255 ru +185.16.248.0 - 185.16.251.255 es +185.16.252.0 - 185.16.255.255 fr +185.17.0.0 - 185.17.3.255 ru +185.17.4.0 - 185.17.7.255 de +185.17.8.0 - 185.17.11.255 ru +185.17.12.0 - 185.17.15.255 at +185.17.16.0 - 185.17.19.255 ru +185.17.20.0 - 185.17.23.255 it +185.17.24.0 - 185.17.27.255 gb +185.17.28.0 - 185.17.31.255 ru +185.17.32.0 - 185.17.35.255 de +185.17.36.0 - 185.17.39.255 ru +185.17.40.0 - 185.17.43.255 pl +185.17.44.0 - 185.17.47.255 dk +185.17.48.0 - 185.17.51.255 it +185.17.52.0 - 185.17.55.255 dk +185.17.56.0 - 185.17.59.255 fr +185.17.60.0 - 185.17.63.255 nl +185.17.64.0 - 185.17.67.255 ru +185.17.68.0 - 185.17.71.255 ch +185.17.72.0 - 185.17.75.255 nl +185.17.76.0 - 185.17.79.255 ru +185.17.80.0 - 185.17.83.255 nl +185.17.84.0 - 185.17.91.255 ru +185.17.92.0 - 185.17.95.255 no +185.17.100.0 - 185.17.103.255 cz +185.17.104.0 - 185.17.107.255 it +185.17.108.0 - 185.17.111.255 fr +185.17.112.0 - 185.17.115.255 tr +185.17.116.0 - 185.17.119.255 cz +185.17.120.0 - 185.17.123.255 ru +185.17.124.0 - 185.17.127.255 ua +185.17.128.0 - 185.17.135.255 ru +185.17.136.0 - 185.17.139.255 tr +185.17.140.0 - 185.17.143.255 ru +185.17.144.0 - 185.17.147.255 de +185.17.148.0 - 185.17.151.255 gb +185.17.152.0 - 185.17.155.255 ru +185.17.156.0 - 185.17.159.255 it +185.17.160.0 - 185.17.163.255 pl +185.17.164.0 - 185.17.167.255 gb +185.17.168.0 - 185.17.171.255 ru +185.17.172.0 - 185.17.175.255 gb +185.17.176.0 - 185.17.179.255 ch +185.17.180.0 - 185.17.183.255 gb +185.17.184.0 - 185.17.187.255 nl +185.17.188.0 - 185.17.191.255 rs +185.17.192.0 - 185.17.195.255 dk +185.17.196.0 - 185.17.199.255 gb +185.17.200.0 - 185.17.203.255 ru +185.17.204.0 - 185.17.207.255 de +185.17.208.0 - 185.17.211.255 ch +185.17.212.0 - 185.17.215.255 cz +185.17.216.0 - 185.17.219.255 dk +185.17.220.0 - 185.17.223.255 va +185.17.224.0 - 185.17.227.255 md +185.17.228.0 - 185.17.231.255 pt +185.17.232.0 - 185.17.235.255 ps +185.17.236.0 - 185.17.243.255 fr +185.17.244.0 - 185.17.247.255 de +185.17.248.0 - 185.17.251.255 fr +185.17.252.0 - 185.17.255.255 gb +185.18.0.0 - 185.18.3.255 dk +185.18.4.0 - 185.18.7.255 ru +185.18.8.0 - 185.18.11.255 nl +185.18.12.0 - 185.18.15.255 rs +185.18.16.0 - 185.18.19.255 es +185.18.20.0 - 185.18.23.255 ru +185.18.24.0 - 185.18.27.255 it +185.18.28.0 - 185.18.31.255 cz +185.18.32.0 - 185.18.35.255 gb +185.18.36.0 - 185.18.39.255 de +185.18.40.0 - 185.18.43.255 al +185.18.44.0 - 185.18.47.255 ru +185.18.48.0 - 185.18.51.255 gb +185.18.52.0 - 185.18.55.255 de +185.18.56.0 - 185.18.59.255 bg +185.18.60.0 - 185.18.63.255 hr +185.18.64.0 - 185.18.67.255 sk +185.18.68.0 - 185.18.71.255 pl +185.18.72.0 - 185.18.75.255 am +185.18.76.0 - 185.18.79.255 fi +185.18.80.0 - 185.18.83.255 fr +185.18.84.0 - 185.18.87.255 se +185.18.88.0 - 185.18.91.255 ru +185.18.92.0 - 185.18.95.255 de +185.18.96.0 - 185.18.99.255 fr +185.18.100.0 - 185.18.103.255 de +185.18.104.0 - 185.18.107.255 be +185.18.108.0 - 185.18.119.255 ru +185.18.120.0 - 185.18.123.255 gb +185.18.124.0 - 185.18.127.255 ru +185.18.128.0 - 185.18.131.255 de +185.18.132.0 - 185.18.135.255 pl +185.18.136.0 - 185.18.139.255 gb +185.18.140.0 - 185.18.143.255 pl +185.18.144.0 - 185.18.147.255 gb +185.18.148.0 - 185.18.151.255 be +185.18.152.0 - 185.18.155.255 ba +185.18.156.0 - 185.18.159.255 pt +185.18.160.0 - 185.18.163.255 ee +185.18.164.0 - 185.18.167.255 se +185.18.168.0 - 185.18.171.255 fr +185.18.172.0 - 185.18.175.255 ch +185.18.176.0 - 185.18.179.255 pl +185.18.180.0 - 185.18.183.255 at +185.18.184.0 - 185.18.186.5 cy +185.18.186.6 - 185.18.186.6 us +185.18.186.7 - 185.18.186.7 cy +185.18.186.8 - 185.18.186.11 us +185.18.186.12 - 185.18.186.33 cy +185.18.186.34 - 185.18.186.34 us +185.18.186.35 - 185.18.186.35 cy +185.18.186.36 - 185.18.186.43 us +185.18.186.44 - 185.18.187.5 cy +185.18.187.6 - 185.18.187.6 gb +185.18.187.7 - 185.18.187.7 cy +185.18.187.8 - 185.18.187.11 gb +185.18.187.12 - 185.18.187.63 cy +185.18.187.64 - 185.18.187.77 de +185.18.187.78 - 185.18.187.79 us +185.18.187.80 - 185.18.187.80 cy +185.18.187.81 - 185.18.187.83 de +185.18.187.84 - 185.18.187.255 cy +185.18.188.0 - 185.18.191.255 gl +185.18.192.0 - 185.18.195.255 se +185.18.196.0 - 185.18.199.255 es +185.18.200.0 - 185.18.203.255 ru +185.18.204.0 - 185.18.207.255 il +185.18.208.0 - 185.18.211.255 fr +185.18.212.0 - 185.18.215.255 ir +185.18.216.0 - 185.18.219.255 gb +185.18.220.0 - 185.18.221.255 nl +185.18.222.0 - 185.18.223.255 in +185.18.224.0 - 185.18.227.255 ro +185.18.228.0 - 185.18.231.255 bg +185.18.232.0 - 185.18.235.255 it +185.18.236.0 - 185.18.239.255 nl +185.18.240.0 - 185.18.243.255 it +185.18.244.0 - 185.18.247.255 az +185.18.248.0 - 185.18.251.255 es +185.18.252.0 - 185.18.255.255 kz +185.19.0.0 - 185.19.3.255 cz +185.19.4.0 - 185.19.7.255 ua +185.19.8.0 - 185.19.11.255 de +185.19.12.0 - 185.19.19.255 gb +185.19.20.0 - 185.19.23.255 ru +185.19.24.0 - 185.19.27.255 es +185.19.28.0 - 185.19.31.255 ch +185.19.32.0 - 185.19.39.255 de +185.19.40.0 - 185.19.43.255 gb +185.19.44.0 - 185.19.47.255 gr +185.19.48.0 - 185.19.51.255 fr +185.19.52.0 - 185.19.55.255 de +185.19.56.0 - 185.19.59.255 nl +185.19.60.0 - 185.19.63.255 de +185.19.64.0 - 185.19.67.255 no +185.19.68.0 - 185.19.71.255 es +185.19.72.0 - 185.19.75.255 sk +185.19.76.0 - 185.19.79.255 kw +185.19.80.0 - 185.19.83.255 tr +185.19.84.0 - 185.19.87.255 ch +185.19.88.0 - 185.19.91.255 gb +185.19.92.0 - 185.19.95.255 tr +185.19.96.0 - 185.19.99.255 ge +185.19.100.0 - 185.19.101.243 nl +185.19.101.244 - 185.19.101.244 de +185.19.101.245 - 185.19.103.255 nl +185.19.104.0 - 185.19.107.255 sc +185.19.108.0 - 185.19.111.255 gb +185.19.112.0 - 185.19.115.255 jo +185.19.116.0 - 185.19.119.255 pl +185.19.120.0 - 185.19.123.255 ch +185.19.124.0 - 185.19.127.255 sy +185.19.128.0 - 185.19.131.255 it +185.19.132.0 - 185.19.135.255 dk +185.19.136.0 - 185.19.139.255 fr +185.19.140.0 - 185.19.143.255 it +185.19.144.0 - 185.19.151.255 gb +185.19.152.0 - 185.19.155.255 tr +185.19.156.0 - 185.19.159.255 es +185.19.160.0 - 185.19.163.255 fr +185.19.164.0 - 185.19.167.255 it +185.19.168.0 - 185.19.171.255 ru +185.19.172.0 - 185.19.175.255 de +185.19.176.0 - 185.19.179.255 ru +185.19.180.0 - 185.19.183.255 be +185.19.184.0 - 185.19.187.255 it +185.19.188.0 - 185.19.191.255 es +185.19.192.0 - 185.19.195.255 kz +185.19.196.0 - 185.19.199.255 de +185.19.200.0 - 185.19.203.255 gb +185.19.204.0 - 185.19.207.255 ru +185.19.208.0 - 185.19.211.255 gb +185.19.212.0 - 185.19.215.255 nz +185.19.216.0 - 185.19.219.255 de +185.19.220.0 - 185.19.223.255 ps +185.19.224.0 - 185.19.227.255 fr +185.19.228.0 - 185.19.231.255 jo +185.19.232.0 - 185.19.235.255 de +185.19.236.0 - 185.19.239.255 nl +185.19.240.0 - 185.19.243.255 fr +185.19.244.0 - 185.19.247.255 ua +185.19.248.0 - 185.19.255.255 se +185.20.0.0 - 185.20.7.255 gb +185.20.8.0 - 185.20.11.255 fr +185.20.12.0 - 185.20.15.255 se +185.20.16.0 - 185.20.19.255 fr +185.20.20.0 - 185.20.23.255 pl +185.20.24.0 - 185.20.27.255 iq +185.20.28.0 - 185.20.31.255 hr +185.20.32.0 - 185.20.35.255 gb +185.20.36.0 - 185.20.39.255 cy +185.20.40.0 - 185.20.43.255 fr +185.20.44.0 - 185.20.47.255 ru +185.20.48.0 - 185.20.55.255 gb +185.20.56.0 - 185.20.59.255 ee +185.20.60.0 - 185.20.63.255 gb +185.20.64.0 - 185.20.71.255 it +185.20.72.0 - 185.20.75.255 sa +185.20.76.0 - 185.20.83.255 ru +185.20.84.0 - 185.20.87.255 fr +185.20.88.0 - 185.20.91.255 bg +185.20.92.0 - 185.20.95.255 im +185.20.96.0 - 185.20.99.255 gb +185.20.100.0 - 185.20.103.255 ee +185.20.104.0 - 185.20.107.255 no +185.20.108.0 - 185.20.111.255 es +185.20.112.0 - 185.20.115.255 by +185.20.116.0 - 185.20.119.255 es +185.20.120.0 - 185.20.123.255 kg +185.20.124.0 - 185.20.127.255 kz +185.20.128.0 - 185.20.131.255 gb +185.20.132.0 - 185.20.135.255 ru +185.20.136.0 - 185.20.139.255 fi +185.20.140.0 - 185.20.143.255 dk +185.20.144.0 - 185.20.147.255 ch +185.20.148.0 - 185.20.148.0 a2 +185.20.148.1 - 185.20.151.254 pl +185.20.151.255 - 185.20.151.255 a2 +185.20.152.0 - 185.20.155.255 sa +185.20.156.0 - 185.20.159.255 bg +185.20.160.0 - 185.20.163.255 ir +185.20.164.0 - 185.20.167.255 gb +185.20.168.0 - 185.20.171.255 no +185.20.172.0 - 185.20.175.255 pl +185.20.176.0 - 185.20.183.255 ru +185.20.184.0 - 185.20.187.255 ua +185.20.188.0 - 185.20.191.255 de +185.20.192.0 - 185.20.195.255 es +185.20.196.0 - 185.20.199.255 cz +185.20.200.0 - 185.20.203.255 ch +185.20.204.0 - 185.20.207.255 dk +185.20.208.0 - 185.20.211.255 ch +185.20.212.0 - 185.20.215.255 cy +185.20.216.0 - 185.20.219.255 ua +185.20.220.0 - 185.20.223.255 nl +185.20.224.0 - 185.20.227.255 ru +185.20.228.0 - 185.20.235.255 de +185.20.236.0 - 185.20.239.255 at +185.20.240.0 - 185.20.243.255 dk +185.20.244.0 - 185.20.247.255 no +185.20.248.0 - 185.20.255.255 gb +185.21.0.0 - 185.21.3.255 fi +185.21.4.0 - 185.21.7.255 tr +185.21.8.0 - 185.21.11.255 il +185.21.12.0 - 185.21.15.255 gb +185.21.16.0 - 185.21.19.255 is +185.21.20.0 - 185.21.23.255 gb +185.21.24.0 - 185.21.27.255 it +185.21.28.0 - 185.21.31.255 de +185.21.32.0 - 185.21.35.255 es +185.21.36.0 - 185.21.39.255 pl +185.21.40.0 - 185.21.43.255 dk +185.21.44.0 - 185.21.47.255 es +185.21.48.0 - 185.21.51.255 fr +185.21.52.0 - 185.21.63.255 nl +185.21.64.0 - 185.21.67.255 ru +185.21.68.0 - 185.21.71.255 ir +185.21.72.0 - 185.21.75.255 it +185.21.76.0 - 185.21.79.255 ir +185.21.80.0 - 185.21.83.255 fr +185.21.84.0 - 185.21.87.255 pl +185.21.88.0 - 185.21.91.255 se +185.21.92.0 - 185.21.95.255 ro +185.21.96.0 - 185.21.99.255 hr +185.21.100.0 - 185.21.103.255 de +185.21.104.0 - 185.21.107.255 fr +185.21.108.0 - 185.21.111.255 gb +185.21.112.0 - 185.21.115.255 fr +185.21.116.0 - 185.21.119.255 sm +185.21.120.0 - 185.21.123.255 ps +185.21.124.0 - 185.21.127.255 de +185.21.128.0 - 185.21.131.255 fr +185.21.132.0 - 185.21.135.255 gb +185.21.136.0 - 185.21.139.255 iq +185.21.140.0 - 185.21.143.255 ru +185.21.144.0 - 185.21.147.255 se +185.21.148.0 - 185.21.151.255 pl +185.21.152.0 - 185.21.155.255 fr +185.21.156.0 - 185.21.159.255 ru +185.21.160.0 - 185.21.163.255 cz +185.21.164.0 - 185.21.167.255 de +185.21.168.0 - 185.21.171.255 nl +185.21.172.0 - 185.21.175.255 it +185.21.176.0 - 185.21.179.255 ua +185.21.180.0 - 185.21.183.255 ro +185.21.184.0 - 185.21.191.255 nl +185.21.192.0 - 185.21.195.255 fr +185.21.196.0 - 185.21.199.255 cz +185.21.200.0 - 185.21.203.255 nl +185.21.204.0 - 185.21.207.255 tr +185.21.208.0 - 185.21.211.255 gb +185.21.212.0 - 185.21.215.255 gp +185.21.216.0 - 185.21.219.255 gb +185.21.220.0 - 185.21.223.255 cz +185.21.224.0 - 185.21.227.255 de +185.21.228.0 - 185.21.231.255 fr +185.21.232.0 - 185.21.235.255 dk +185.21.236.0 - 185.21.239.255 at +185.21.240.0 - 185.21.243.255 nl +185.21.244.0 - 185.21.247.255 de +185.21.248.0 - 185.21.251.255 it +185.21.252.0 - 185.21.255.255 am +185.22.0.0 - 185.22.3.255 ro +185.22.4.0 - 185.22.7.255 nl +185.22.8.0 - 185.22.11.255 pl +185.22.12.0 - 185.22.15.255 nl +185.22.16.0 - 185.22.19.255 ua +185.22.20.0 - 185.22.23.255 at +185.22.24.0 - 185.22.27.255 ru +185.22.28.0 - 185.22.31.255 ir +185.22.32.0 - 185.22.35.255 lb +185.22.36.0 - 185.22.39.255 it +185.22.40.0 - 185.22.43.255 gb +185.22.44.0 - 185.22.47.255 de +185.22.48.0 - 185.22.51.255 fr +185.22.52.0 - 185.22.55.255 ch +185.22.56.0 - 185.22.59.255 tr +185.22.60.0 - 185.22.63.255 ru +185.22.64.0 - 185.22.67.255 kz +185.22.68.0 - 185.22.71.255 de +185.22.72.0 - 185.22.75.255 dk +185.22.76.0 - 185.22.83.255 gb +185.22.84.0 - 185.22.87.255 it +185.22.88.0 - 185.22.91.255 rs +185.22.92.0 - 185.22.95.255 es +185.22.96.0 - 185.22.99.255 cz +185.22.100.0 - 185.22.103.255 tr +185.22.104.0 - 185.22.107.255 ch +185.22.108.0 - 185.22.111.255 fr +185.22.112.0 - 185.22.115.255 pl +185.22.116.0 - 185.22.119.255 fr +185.22.120.0 - 185.22.123.255 no +185.22.124.0 - 185.22.127.255 cz +185.22.128.0 - 185.22.131.255 fr +185.22.132.0 - 185.22.135.255 fi +185.22.136.0 - 185.22.139.255 pl +185.22.140.0 - 185.22.143.255 de +185.22.144.0 - 185.22.147.255 rs +185.22.148.0 - 185.22.151.255 de +185.22.152.0 - 185.22.155.255 ru +185.22.156.0 - 185.22.159.255 ie +185.22.160.0 - 185.22.163.255 tr +185.22.164.0 - 185.22.167.255 gb +185.22.168.0 - 185.22.171.255 fr +185.22.172.0 - 185.22.175.255 ru +185.22.176.0 - 185.22.179.255 sk +185.22.180.0 - 185.22.183.255 ru +185.22.184.0 - 185.22.187.255 tr +185.22.188.0 - 185.22.195.255 nl +185.22.196.0 - 185.22.199.255 fr +185.22.200.0 - 185.22.203.255 es +185.22.204.0 - 185.22.207.255 ru +185.22.208.0 - 185.22.211.255 gb +185.22.212.0 - 185.22.215.255 sk +185.22.216.0 - 185.22.219.255 fr +185.22.220.0 - 185.22.223.255 de +185.22.224.0 - 185.22.227.255 gb +185.22.228.0 - 185.22.231.255 it +185.22.232.0 - 185.22.235.255 ru +185.22.236.0 - 185.22.239.255 cz +185.22.240.0 - 185.22.243.255 gb +185.22.244.0 - 185.22.247.255 at +185.22.248.0 - 185.22.251.255 tr +185.22.252.0 - 185.22.255.255 ch +185.23.0.0 - 185.23.3.255 at +185.23.4.0 - 185.23.7.255 gb +185.23.8.0 - 185.23.11.255 ru +185.23.12.0 - 185.23.15.255 pl +185.23.16.0 - 185.23.19.255 lt +185.23.20.0 - 185.23.23.255 pl +185.23.24.0 - 185.23.27.255 nl +185.23.28.0 - 185.23.31.255 it +185.23.32.0 - 185.23.35.255 ru +185.23.36.0 - 185.23.39.255 es +185.23.40.0 - 185.23.43.255 fr +185.23.44.0 - 185.23.47.255 ie +185.23.48.0 - 185.23.51.255 ge +185.23.52.0 - 185.23.63.255 gb +185.23.64.0 - 185.23.67.255 ru +185.23.68.0 - 185.23.71.255 es +185.23.72.0 - 185.23.75.255 tr +185.23.76.0 - 185.23.79.255 sa +185.23.80.0 - 185.23.83.255 ru +185.23.84.0 - 185.23.87.255 it +185.23.88.0 - 185.23.91.255 gr +185.23.92.0 - 185.23.95.255 fr +185.23.96.0 - 185.23.99.255 a2 +185.23.100.0 - 185.23.103.255 gb +185.23.104.0 - 185.23.107.255 ua +185.23.108.0 - 185.23.111.255 hu +185.23.112.0 - 185.23.115.255 sk +185.23.116.0 - 185.23.119.255 gb +185.23.120.0 - 185.23.123.255 es +185.23.124.0 - 185.23.127.255 sa +185.23.128.0 - 185.23.131.255 ir +185.23.132.0 - 185.23.139.255 fr +185.23.140.0 - 185.23.143.255 nl +185.23.144.0 - 185.23.147.255 no +185.23.148.0 - 185.23.151.255 pl +185.23.152.0 - 185.23.155.255 iq +185.23.156.0 - 185.23.159.255 de +185.23.160.0 - 185.23.163.255 lv +185.23.164.0 - 185.23.167.255 ua +185.23.168.0 - 185.23.171.255 gr +185.23.172.0 - 185.23.175.255 il +185.23.176.0 - 185.23.183.255 gb +185.23.184.0 - 185.23.187.255 sy +185.23.188.0 - 185.23.191.255 fr +185.23.192.0 - 185.23.195.255 es +185.23.196.0 - 185.23.199.255 ae +185.23.200.0 - 185.23.203.255 tj +185.23.204.0 - 185.23.204.255 se +185.23.205.0 - 185.23.207.255 no +185.23.208.0 - 185.23.211.255 de +185.23.212.0 - 185.23.215.255 nl +185.23.216.0 - 185.23.219.255 dk +185.23.220.0 - 185.23.223.255 es +185.23.224.0 - 185.23.227.255 de +185.23.228.0 - 185.23.231.255 ru +185.23.232.0 - 185.23.235.255 gb +185.23.236.0 - 185.23.243.255 de +185.23.244.0 - 185.23.247.255 be +185.23.248.0 - 185.23.251.255 nl +185.23.252.0 - 185.23.255.255 gb +185.24.0.0 - 185.24.3.255 is +185.24.4.0 - 185.24.7.255 es +185.24.8.0 - 185.24.11.255 cz +185.24.12.0 - 185.24.15.255 gb +185.24.16.0 - 185.24.19.255 fr +185.24.20.0 - 185.24.23.255 cz +185.24.24.0 - 185.24.27.255 pl +185.24.28.0 - 185.24.31.255 fr +185.24.32.0 - 185.24.35.255 al +185.24.36.0 - 185.24.39.255 si +185.24.40.0 - 185.24.47.255 ru +185.24.48.0 - 185.24.51.255 nl +185.24.52.0 - 185.24.59.255 ru +185.24.60.0 - 185.24.63.255 sy +185.24.64.0 - 185.24.67.255 gb +185.24.68.0 - 185.24.71.255 de +185.24.72.0 - 185.24.75.255 gb +185.24.76.0 - 185.24.79.255 il +185.24.80.0 - 185.24.87.255 gb +185.24.88.0 - 185.24.91.255 pl +185.24.92.0 - 185.24.95.255 ru +185.24.96.0 - 185.24.99.255 gb +185.24.100.0 - 185.24.100.255 by +185.24.101.0 - 185.24.101.255 sk +185.24.102.0 - 185.24.103.255 at +185.24.104.0 - 185.24.107.255 it +185.24.108.0 - 185.24.115.255 ru +185.24.116.0 - 185.24.119.255 it +185.24.120.0 - 185.24.123.255 gb +185.24.124.0 - 185.24.127.255 tr +185.24.128.0 - 185.24.131.255 jo +185.24.132.0 - 185.24.135.255 nl +185.24.136.0 - 185.24.139.255 ir +185.24.140.0 - 185.24.147.255 fr +185.24.148.0 - 185.24.151.255 ir +185.24.152.0 - 185.24.159.255 fr +185.24.160.0 - 185.24.163.255 gb +185.24.164.0 - 185.24.167.255 pl +185.24.168.0 - 185.24.171.255 dk +185.24.172.0 - 185.24.175.255 nl +185.24.176.0 - 185.24.183.255 ru +185.24.184.0 - 185.24.184.0 fr +185.24.184.1 - 185.24.184.1 re +185.24.184.2 - 185.24.187.255 fr +185.24.188.0 - 185.24.191.255 no +185.24.192.0 - 185.24.195.255 fr +185.24.196.0 - 185.24.203.255 pl +185.24.204.0 - 185.24.207.255 il +185.24.208.0 - 185.24.211.255 ba +185.24.212.0 - 185.24.215.255 ru +185.24.216.0 - 185.24.219.255 pl +185.24.220.0 - 185.24.227.255 nl +185.24.228.0 - 185.24.231.255 ir +185.24.232.0 - 185.24.235.255 ie +185.24.236.0 - 185.24.239.255 cz +185.24.240.0 - 185.24.243.255 nl +185.24.244.0 - 185.24.247.255 ru +185.24.248.0 - 185.24.251.255 nl +185.24.252.0 - 185.24.255.255 ir +185.25.0.0 - 185.25.0.127 vn +185.25.0.128 - 185.25.0.255 no +185.25.1.0 - 185.25.1.255 fi +185.25.2.0 - 185.25.2.255 ru +185.25.3.0 - 185.25.3.255 il +185.25.4.0 - 185.25.11.255 ru +185.25.12.0 - 185.25.15.255 qa +185.25.16.0 - 185.25.19.255 ru +185.25.20.0 - 185.25.23.255 gr +185.25.24.0 - 185.25.27.255 es +185.25.28.0 - 185.25.31.255 ch +185.25.32.0 - 185.25.35.255 gb +185.25.36.0 - 185.25.39.255 de +185.25.40.0 - 185.25.43.255 fr +185.25.44.0 - 185.25.47.255 se +185.25.48.0 - 185.25.51.255 lt +185.25.52.0 - 185.25.55.255 gr +185.25.56.0 - 185.25.59.255 gb +185.25.60.0 - 185.25.63.255 ru +185.25.64.0 - 185.25.67.255 gb +185.25.68.0 - 185.25.71.255 ru +185.25.72.0 - 185.25.75.255 it +185.25.76.0 - 185.25.79.255 fi +185.25.80.0 - 185.25.83.255 nl +185.25.84.0 - 185.25.84.255 a1 +185.25.85.0 - 185.25.86.255 us +185.25.87.0 - 185.25.87.255 a1 +185.25.88.0 - 185.25.91.255 ru +185.25.92.0 - 185.25.95.255 ch +185.25.96.0 - 185.25.99.255 de +185.25.100.0 - 185.25.103.255 tr +185.25.104.0 - 185.25.107.255 ae +185.25.108.0 - 185.25.111.255 pl +185.25.112.0 - 185.25.115.255 es +185.25.116.0 - 185.25.119.255 ua +185.25.120.0 - 185.25.123.255 pl +185.25.124.0 - 185.25.127.255 at +185.25.128.0 - 185.25.131.255 it +185.25.132.0 - 185.25.135.255 de +185.25.136.0 - 185.25.139.255 it +185.25.140.0 - 185.25.143.255 dk +185.25.144.0 - 185.25.147.255 gb +185.25.148.0 - 185.25.151.255 pl +185.25.152.0 - 185.25.155.255 ru +185.25.156.0 - 185.25.159.255 fr +185.25.160.0 - 185.25.163.255 be +185.25.164.0 - 185.25.167.255 de +185.25.168.0 - 185.25.171.255 be +185.25.172.0 - 185.25.175.255 gb +185.25.176.0 - 185.25.179.255 ru +185.25.180.0 - 185.25.181.255 se +185.25.182.0 - 185.25.182.255 at +185.25.183.0 - 185.25.183.255 ae +185.25.184.0 - 185.25.187.255 cz +185.25.188.0 - 185.25.191.255 gb +185.25.192.0 - 185.25.195.255 ch +185.25.196.0 - 185.25.199.255 es +185.25.200.0 - 185.25.203.255 fi +185.25.204.0 - 185.25.207.255 it +185.25.208.0 - 185.25.211.255 gb +185.25.212.0 - 185.25.215.255 dk +185.25.216.0 - 185.25.219.255 pl +185.25.220.0 - 185.25.223.255 gb +185.25.224.0 - 185.25.227.255 ch +185.25.228.0 - 185.25.231.255 nl +185.25.232.0 - 185.25.235.255 it +185.25.236.0 - 185.25.247.255 gb +185.25.248.0 - 185.25.251.255 sk +185.25.252.0 - 185.25.255.255 is +185.26.0.0 - 185.26.1.255 bg +185.26.2.0 - 185.26.2.255 fr +185.26.3.0 - 185.26.3.255 bg +185.26.4.0 - 185.26.7.255 es +185.26.8.0 - 185.26.11.255 se +185.26.12.0 - 185.26.19.255 gb +185.26.20.0 - 185.26.23.255 be +185.26.24.0 - 185.26.27.255 a2 +185.26.28.0 - 185.26.31.255 ru +185.26.32.0 - 185.26.35.255 ir +185.26.36.0 - 185.26.39.255 de +185.26.40.0 - 185.26.47.255 ru +185.26.48.0 - 185.26.51.255 fi +185.26.52.0 - 185.26.55.255 ru +185.26.56.0 - 185.26.59.255 nl +185.26.60.0 - 185.26.63.255 dk +185.26.64.0 - 185.26.67.255 it +185.26.68.0 - 185.26.71.255 tr +185.26.72.0 - 185.26.75.255 ru +185.26.76.0 - 185.26.83.255 de +185.26.84.0 - 185.26.87.255 sa +185.26.88.0 - 185.26.91.255 fr +185.26.92.0 - 185.26.95.255 gb +185.26.96.0 - 185.26.99.255 de +185.26.100.0 - 185.26.103.255 ru +185.26.104.0 - 185.26.107.255 fr +185.26.108.0 - 185.26.111.255 nl +185.26.112.0 - 185.26.115.255 ru +185.26.116.0 - 185.26.119.255 rs +185.26.120.0 - 185.26.123.255 ru +185.26.124.0 - 185.26.125.255 lu +185.26.126.0 - 185.26.127.255 fr +185.26.128.0 - 185.26.131.255 no +185.26.132.0 - 185.26.135.255 lt +185.26.136.0 - 185.26.139.255 es +185.26.140.0 - 185.26.143.255 it +185.26.144.0 - 185.26.147.255 tr +185.26.148.0 - 185.26.151.255 gb +185.26.152.0 - 185.26.155.255 je +185.26.156.0 - 185.26.159.255 de +185.26.160.0 - 185.26.163.255 lu +185.26.164.0 - 185.26.167.255 no +185.26.168.0 - 185.26.171.255 ru +185.26.172.0 - 185.26.175.255 rs +185.26.176.0 - 185.26.179.255 ba +185.26.180.0 - 185.26.180.255 za +185.26.181.0 - 185.26.183.50 eu +185.26.183.51 - 185.26.183.51 ru +185.26.183.52 - 185.26.183.255 eu +185.26.184.0 - 185.26.187.255 az +185.26.188.0 - 185.26.191.255 at +185.26.192.0 - 185.26.195.255 ru +185.26.196.0 - 185.26.199.255 it +185.26.200.0 - 185.26.203.255 de +185.26.204.0 - 185.26.207.255 ru +185.26.208.0 - 185.26.211.255 ir +185.26.212.0 - 185.26.215.255 nl +185.26.216.0 - 185.26.219.255 ru +185.26.220.0 - 185.26.223.255 fr +185.26.224.0 - 185.26.227.255 es +185.26.228.0 - 185.26.231.255 gb +185.26.232.0 - 185.26.235.255 ir +185.26.236.0 - 185.26.237.255 at +185.26.238.0 - 185.26.238.255 nl +185.26.239.0 - 185.26.239.255 fr +185.26.240.0 - 185.26.243.255 gb +185.26.244.0 - 185.26.247.255 us +185.26.248.0 - 185.26.251.255 fr +185.26.252.0 - 185.26.255.255 de +185.27.0.0 - 185.27.3.255 dk +185.27.4.0 - 185.27.7.255 ch +185.27.8.0 - 185.27.11.255 de +185.27.12.0 - 185.27.15.255 ua +185.27.16.0 - 185.27.19.255 nl +185.27.20.0 - 185.27.23.255 gb +185.27.24.0 - 185.27.27.255 no +185.27.28.0 - 185.27.35.255 nl +185.27.36.0 - 185.27.39.255 is +185.27.40.0 - 185.27.43.255 nl +185.27.44.0 - 185.27.51.255 ru +185.27.52.0 - 185.27.55.255 pl +185.27.56.0 - 185.27.59.255 mt +185.27.60.0 - 185.27.63.255 hu +185.27.64.0 - 185.27.67.255 li +185.27.68.0 - 185.27.71.255 kz +185.27.72.0 - 185.27.75.255 it +185.27.76.0 - 185.27.79.255 fr +185.27.80.0 - 185.27.83.255 ru +185.27.84.0 - 185.27.87.255 de +185.27.88.0 - 185.27.91.255 om +185.27.92.0 - 185.27.95.255 lv +185.27.96.0 - 185.27.99.255 se +185.27.100.0 - 185.27.103.255 ru +185.27.104.0 - 185.27.107.255 il +185.27.108.0 - 185.27.111.255 ch +185.27.112.0 - 185.27.115.255 dk +185.27.116.0 - 185.27.119.255 eg +185.27.120.0 - 185.27.123.255 at +185.27.124.0 - 185.27.127.255 es +185.27.128.0 - 185.27.131.255 rs +185.27.132.0 - 185.27.135.255 gb +185.27.136.0 - 185.27.139.255 es +185.27.140.0 - 185.27.143.255 nl +185.27.144.0 - 185.27.147.255 gb +185.27.148.0 - 185.27.151.255 ru +185.27.152.0 - 185.27.159.255 de +185.27.160.0 - 185.27.163.255 ru +185.27.164.0 - 185.27.171.255 se +185.27.172.0 - 185.27.175.255 nl +185.27.176.0 - 185.27.179.255 gb +185.27.180.0 - 185.27.183.255 de +185.27.184.0 - 185.27.187.255 ch +185.27.188.0 - 185.27.191.255 pl +185.27.192.0 - 185.27.195.255 ru +185.27.196.0 - 185.27.199.255 gb +185.27.200.0 - 185.27.203.255 es +185.27.204.0 - 185.27.207.255 dk +185.27.208.0 - 185.27.211.255 ru +185.27.212.0 - 185.27.215.255 de +185.27.216.0 - 185.27.219.255 iq +185.27.220.0 - 185.27.223.255 sa +185.27.224.0 - 185.27.227.255 fr +185.27.228.0 - 185.27.231.255 us +185.27.232.0 - 185.27.235.255 se +185.27.236.0 - 185.27.239.255 nl +185.27.240.0 - 185.27.243.255 se +185.27.244.0 - 185.27.247.255 gb +185.27.248.0 - 185.27.249.255 nl +185.27.250.0 - 185.27.250.255 us +185.27.251.0 - 185.27.251.255 nl +185.27.252.0 - 185.27.255.255 de +185.28.0.0 - 185.28.3.255 tr +185.28.4.0 - 185.28.7.255 de +185.28.8.0 - 185.28.11.255 si +185.28.12.0 - 185.28.15.255 gb +185.28.16.0 - 185.28.19.255 pl +185.28.20.0 - 185.28.23.255 us +185.28.24.0 - 185.28.35.255 gb +185.28.36.0 - 185.28.37.255 be +185.28.38.0 - 185.28.38.255 nl +185.28.39.0 - 185.28.39.255 be +185.28.40.0 - 185.28.43.255 fr +185.28.44.0 - 185.28.47.255 gb +185.28.48.0 - 185.28.51.255 es +185.28.52.0 - 185.28.55.255 it +185.28.56.0 - 185.28.59.255 nl +185.28.60.0 - 185.28.63.255 tr +185.28.64.0 - 185.28.67.255 eu +185.28.68.0 - 185.28.68.255 nl +185.28.69.0 - 185.28.69.255 de +185.28.70.0 - 185.28.71.255 us +185.28.72.0 - 185.28.75.255 im +185.28.76.0 - 185.28.79.255 de +185.28.80.0 - 185.28.83.255 it +185.28.84.0 - 185.28.87.255 nl +185.28.88.0 - 185.28.95.255 gb +185.28.96.0 - 185.28.99.255 de +185.28.100.0 - 185.28.102.255 cz +185.28.103.0 - 185.28.103.255 sk +185.28.104.0 - 185.28.107.255 md +185.28.108.0 - 185.28.111.255 ua +185.28.112.0 - 185.28.115.255 gb +185.28.116.0 - 185.28.119.255 pl +185.28.120.0 - 185.28.121.255 ee +185.28.122.0 - 185.28.122.255 pl +185.28.123.0 - 185.28.123.255 ee +185.28.124.0 - 185.28.127.255 sk +185.28.128.0 - 185.28.131.255 no +185.28.132.0 - 185.28.135.255 tr +185.28.136.0 - 185.28.139.255 se +185.28.140.0 - 185.28.143.255 es +185.28.144.0 - 185.28.147.255 sk +185.28.148.0 - 185.28.151.255 nl +185.28.152.0 - 185.28.155.255 il +185.28.156.0 - 185.28.159.255 de +185.28.160.0 - 185.28.163.255 tr +185.28.164.0 - 185.28.167.255 gb +185.28.168.0 - 185.28.171.255 es +185.28.172.0 - 185.28.175.255 de +185.28.176.0 - 185.28.179.255 pl +185.28.180.0 - 185.28.183.255 nl +185.28.184.0 - 185.28.187.255 de +185.28.188.0 - 185.28.188.35 us +185.28.188.36 - 185.28.188.63 nl +185.28.188.64 - 185.28.188.95 us +185.28.188.96 - 185.28.188.255 nl +185.28.189.0 - 185.28.190.164 us +185.28.190.165 - 185.28.190.165 nl +185.28.190.166 - 185.28.190.255 us +185.28.191.0 - 185.28.191.15 nl +185.28.191.16 - 185.28.191.255 us +185.28.192.0 - 185.28.195.255 cz +185.28.196.0 - 185.28.199.255 ie +185.28.200.0 - 185.28.207.255 gb +185.28.208.0 - 185.28.211.255 de +185.28.212.0 - 185.28.215.255 gb +185.28.216.0 - 185.28.219.255 es +185.28.220.0 - 185.28.227.255 nl +185.28.228.0 - 185.28.231.255 de +185.28.232.0 - 185.28.235.255 fr +185.28.236.0 - 185.28.239.255 ua +185.28.240.0 - 185.28.243.255 gb +185.28.244.0 - 185.28.247.255 fi +185.28.248.0 - 185.28.251.255 pl +185.28.252.0 - 185.29.3.255 gb +185.29.4.0 - 185.29.7.255 be +185.29.8.0 - 185.29.9.255 se +185.29.10.0 - 185.29.10.255 lv +185.29.11.0 - 185.29.11.255 nl +185.29.12.0 - 185.29.15.255 pl +185.29.16.0 - 185.29.19.255 si +185.29.20.0 - 185.29.23.255 se +185.29.24.0 - 185.29.27.255 gr +185.29.28.0 - 185.29.31.255 de +185.29.32.0 - 185.29.43.255 fr +185.29.44.0 - 185.29.47.255 gb +185.29.48.0 - 185.29.51.255 fr +185.29.52.0 - 185.29.59.255 ru +185.29.60.0 - 185.29.63.255 be +185.29.64.0 - 185.29.67.255 fr +185.29.68.0 - 185.29.71.255 es +185.29.72.0 - 185.29.75.255 it +185.29.76.0 - 185.29.79.255 dk +185.29.80.0 - 185.29.83.255 hu +185.29.84.0 - 185.29.87.255 pl +185.29.88.0 - 185.29.91.255 at +185.29.92.0 - 185.29.95.255 sa +185.29.96.0 - 185.29.99.255 it +185.29.100.0 - 185.29.103.255 rs +185.29.104.0 - 185.29.107.255 it +185.29.108.0 - 185.29.111.255 nl +185.29.112.0 - 185.29.115.255 se +185.29.116.0 - 185.29.119.255 de +185.29.120.0 - 185.29.123.255 tr +185.29.124.0 - 185.29.131.255 ru +185.29.132.0 - 185.29.139.255 gb +185.29.140.0 - 185.29.143.255 ba +185.29.144.0 - 185.29.147.255 it +185.29.148.0 - 185.29.151.255 fr +185.29.152.0 - 185.29.155.255 ch +185.29.156.0 - 185.29.159.255 sk +185.29.160.0 - 185.29.163.255 it +185.29.164.0 - 185.29.164.255 no +185.29.165.0 - 185.29.165.255 be +185.29.166.0 - 185.29.166.127 at +185.29.166.128 - 185.29.166.191 fi +185.29.166.192 - 185.29.166.255 pt +185.29.167.0 - 185.29.167.63 tr +185.29.167.64 - 185.29.167.127 pl +185.29.167.128 - 185.29.167.191 cz +185.29.167.192 - 185.29.167.255 lt +185.29.168.0 - 185.29.171.255 de +185.29.172.0 - 185.29.179.255 gb +185.29.180.0 - 185.29.183.255 fr +185.29.184.0 - 185.29.187.255 kg +185.29.188.0 - 185.29.191.255 de +185.29.192.0 - 185.29.195.255 tr +185.29.196.0 - 185.29.199.255 is +185.29.200.0 - 185.29.203.255 nl +185.29.204.0 - 185.29.207.255 it +185.29.208.0 - 185.29.211.255 gb +185.29.212.0 - 185.29.215.255 es +185.29.216.0 - 185.29.219.255 de +185.29.220.0 - 185.29.223.255 ir +185.29.224.0 - 185.29.231.255 gb +185.29.232.0 - 185.29.235.255 fr +185.29.236.0 - 185.29.239.255 ua +185.29.240.0 - 185.29.243.255 de +185.29.244.0 - 185.29.247.255 fr +185.29.248.0 - 185.29.251.255 it +185.29.252.0 - 185.29.255.255 ua +185.30.0.0 - 185.30.3.255 ru +185.30.4.0 - 185.30.7.255 ir +185.30.8.0 - 185.30.11.255 gb +185.30.12.0 - 185.30.19.255 ru +185.30.20.0 - 185.30.23.255 us +185.30.24.0 - 185.30.27.255 gb +185.30.28.0 - 185.30.31.255 fr +185.30.32.0 - 185.30.35.255 de +185.30.36.0 - 185.30.39.255 lb +185.30.40.0 - 185.30.43.255 ru +185.30.44.0 - 185.30.47.255 it +185.30.48.0 - 185.30.51.255 fr +185.30.52.0 - 185.30.55.255 be +185.30.56.0 - 185.30.59.255 nl +185.30.60.0 - 185.30.71.255 it +185.30.72.0 - 185.30.75.255 ie +185.30.76.0 - 185.30.79.255 ir +185.30.80.0 - 185.30.83.255 it +185.30.84.0 - 185.30.87.255 ua +185.30.88.0 - 185.30.91.255 az +185.30.92.0 - 185.30.95.255 fr +185.30.96.0 - 185.30.99.255 ru +185.30.100.0 - 185.30.103.255 dk +185.30.104.0 - 185.30.107.255 ru +185.30.108.0 - 185.30.115.255 it +185.30.116.0 - 185.30.119.255 ru +185.30.120.0 - 185.30.123.255 sk +185.30.124.0 - 185.30.127.255 pl +185.30.128.0 - 185.30.135.255 fr +185.30.136.0 - 185.30.139.255 si +185.30.140.0 - 185.30.143.255 es +185.30.144.0 - 185.30.147.255 al +185.30.148.0 - 185.30.151.255 sa +185.30.152.0 - 185.30.155.255 se +185.30.156.0 - 185.30.159.255 de +185.30.160.0 - 185.30.163.255 dk +185.30.164.0 - 185.30.167.255 nl +185.30.168.0 - 185.30.171.255 gb +185.30.172.0 - 185.30.175.255 lu +185.30.176.0 - 185.30.179.255 nl +185.30.180.0 - 185.30.183.255 it +185.30.184.0 - 185.30.187.255 is +185.30.188.0 - 185.30.191.255 it +185.30.192.0 - 185.30.195.255 ru +185.30.196.0 - 185.30.199.255 es +185.30.200.0 - 185.30.203.255 ua +185.30.204.0 - 185.30.207.255 nl +185.30.208.0 - 185.30.211.255 fr +185.30.212.0 - 185.30.215.255 gb +185.30.216.0 - 185.30.219.255 fr +185.30.220.0 - 185.30.223.255 ru +185.30.224.0 - 185.30.227.255 no +185.30.228.0 - 185.30.231.255 ru +185.30.232.0 - 185.30.235.255 fr +185.30.236.0 - 185.30.239.255 nl +185.30.240.0 - 185.30.247.255 es +185.30.248.0 - 185.30.251.255 jo +185.30.252.0 - 185.30.255.255 be +185.31.0.0 - 185.31.3.255 fr +185.31.4.0 - 185.31.5.255 de +185.31.6.0 - 185.31.6.255 hu +185.31.7.0 - 185.31.7.255 de +185.31.8.0 - 185.31.11.255 nl +185.31.12.0 - 185.31.15.255 gb +185.31.16.0 - 185.31.19.255 eu +185.31.20.0 - 185.31.23.255 es +185.31.24.0 - 185.31.27.255 pl +185.31.28.0 - 185.31.31.255 at +185.31.32.0 - 185.31.35.255 rs +185.31.36.0 - 185.31.39.255 cz +185.31.40.0 - 185.31.43.255 fr +185.31.44.0 - 185.31.47.255 lv +185.31.48.0 - 185.31.51.255 pl +185.31.52.0 - 185.31.55.255 at +185.31.56.0 - 185.31.56.255 it +185.31.57.0 - 185.31.57.255 us +185.31.58.0 - 185.31.58.255 sg +185.31.59.0 - 185.31.59.255 br +185.31.60.0 - 185.31.63.255 de +185.31.64.0 - 185.31.67.255 it +185.31.68.0 - 185.31.71.255 fi +185.31.72.0 - 185.31.75.255 kz +185.31.76.0 - 185.31.79.255 dk +185.31.80.0 - 185.31.83.255 pl +185.31.84.0 - 185.31.87.255 ua +185.31.88.0 - 185.31.91.255 pl +185.31.92.0 - 185.31.95.255 ee +185.31.96.0 - 185.31.99.255 ie +185.31.100.0 - 185.31.103.255 ch +185.31.104.0 - 185.31.107.255 es +185.31.108.0 - 185.31.119.255 ru +185.31.120.0 - 185.31.123.255 bg +185.31.124.0 - 185.31.127.255 ir +185.31.128.0 - 185.31.131.255 us +185.31.132.0 - 185.31.135.255 ru +185.31.136.0 - 185.31.139.255 fi +185.31.140.0 - 185.31.143.255 se +185.31.144.0 - 185.31.147.255 nl +185.31.148.0 - 185.31.151.255 fr +185.31.152.0 - 185.31.155.255 gb +185.31.156.0 - 185.31.159.255 pt +185.31.160.0 - 185.31.167.255 ru +185.31.168.0 - 185.31.171.255 gb +185.31.172.0 - 185.31.175.255 nl +185.31.176.0 - 185.31.179.255 dk +185.31.180.0 - 185.31.183.255 ch +185.31.184.0 - 185.31.187.255 pl +185.31.188.0 - 185.31.191.255 ae +185.31.192.0 - 185.31.193.255 nl +185.31.194.0 - 185.31.195.255 ru +185.31.196.0 - 185.31.199.255 se +185.31.200.0 - 185.31.203.255 nl +185.31.204.0 - 185.31.207.255 gb +185.31.208.0 - 185.31.211.255 de +185.31.212.0 - 185.31.215.255 at +185.31.216.0 - 185.31.219.255 pl +185.31.220.0 - 185.31.223.255 im +185.31.224.0 - 185.31.227.255 gb +185.31.228.0 - 185.31.231.255 nl +185.31.232.0 - 185.31.235.255 gb +185.31.236.0 - 185.31.239.255 es +185.31.240.0 - 185.31.243.255 ee +185.31.244.0 - 185.31.247.255 nl +185.31.248.0 - 185.31.251.255 ch +185.31.252.0 - 185.31.255.255 gb +185.32.0.0 - 185.32.3.255 md +185.32.4.0 - 185.32.7.255 pl +185.32.8.0 - 185.32.11.255 se +185.32.12.0 - 185.32.15.255 tr +185.32.16.0 - 185.32.19.255 es +185.32.20.0 - 185.32.23.255 al +185.32.24.0 - 185.32.27.255 ro +185.32.28.0 - 185.32.31.255 es +185.32.32.0 - 185.32.35.255 de +185.32.36.0 - 185.32.39.255 pt +185.32.40.0 - 185.32.43.255 gb +185.32.44.0 - 185.32.47.255 az +185.32.48.0 - 185.32.51.255 pl +185.32.52.0 - 185.32.55.255 gb +185.32.56.0 - 185.32.59.255 ru +185.32.60.0 - 185.32.63.255 ua +185.32.64.0 - 185.32.64.255 cz +185.32.65.0 - 185.32.66.255 ru +185.32.67.0 - 185.32.67.255 cz +185.32.68.0 - 185.32.71.255 ru +185.32.72.0 - 185.32.75.255 gb +185.32.76.0 - 185.32.76.255 us +185.32.77.0 - 185.32.79.255 gb +185.32.80.0 - 185.32.83.255 de +185.32.84.0 - 185.32.87.255 ru +185.32.88.0 - 185.32.91.255 no +185.32.92.0 - 185.32.95.255 ie +185.32.96.0 - 185.32.103.255 fr +185.32.104.0 - 185.32.111.255 gb +185.32.112.0 - 185.32.115.255 il +185.32.116.0 - 185.32.119.255 de +185.32.120.0 - 185.32.123.255 ru +185.32.124.0 - 185.32.127.255 ch +185.32.128.0 - 185.32.131.255 ir +185.32.132.0 - 185.32.135.255 ru +185.32.136.0 - 185.32.139.255 es +185.32.140.0 - 185.32.143.255 nl +185.32.144.0 - 185.32.147.255 pl +185.32.148.0 - 185.32.151.255 iq +185.32.152.0 - 185.32.155.255 ie +185.32.156.0 - 185.32.159.255 pl +185.32.160.0 - 185.32.163.255 cz +185.32.164.0 - 185.32.167.255 ru +185.32.168.0 - 185.32.171.255 be +185.32.172.0 - 185.32.175.255 ba +185.32.176.0 - 185.32.179.255 il +185.32.180.0 - 185.32.180.255 es +185.32.181.0 - 185.32.183.255 cz +185.32.184.0 - 185.32.187.255 ru +185.32.188.0 - 185.32.191.255 pt +185.32.192.0 - 185.32.195.255 eu +185.32.196.0 - 185.32.199.255 se +185.32.200.0 - 185.32.200.39 gb +185.32.200.40 - 185.32.200.47 it +185.32.200.48 - 185.32.203.135 gb +185.32.203.136 - 185.32.203.143 it +185.32.203.144 - 185.32.203.151 gb +185.32.203.152 - 185.32.203.159 it +185.32.203.160 - 185.32.203.247 gb +185.32.203.248 - 185.32.203.255 it +185.32.204.0 - 185.32.207.255 se +185.32.208.0 - 185.32.211.255 fr +185.32.212.0 - 185.32.215.255 ch +185.32.216.0 - 185.32.219.255 fr +185.32.220.0 - 185.32.223.255 ch +185.32.224.0 - 185.32.227.255 by +185.32.228.0 - 185.32.231.255 gr +185.32.232.0 - 185.32.235.255 nl +185.32.236.0 - 185.32.237.255 lu +185.32.238.0 - 185.32.238.255 be +185.32.239.0 - 185.32.239.255 lu +185.32.240.0 - 185.32.243.255 nl +185.32.244.0 - 185.32.247.255 de +185.32.248.0 - 185.32.251.255 ru +185.32.252.0 - 185.32.255.255 ie +185.33.0.0 - 185.33.3.255 ad +185.33.4.0 - 185.33.7.255 gb +185.33.8.0 - 185.33.11.255 at +185.33.12.0 - 185.33.15.255 fr +185.33.16.0 - 185.33.19.255 lu +185.33.20.0 - 185.33.23.255 ch +185.33.24.0 - 185.33.27.255 fr +185.33.28.0 - 185.33.31.255 jo +185.33.32.0 - 185.33.35.255 al +185.33.36.0 - 185.33.39.255 pl +185.33.40.0 - 185.33.43.255 fr +185.33.44.0 - 185.33.47.255 iq +185.33.48.0 - 185.33.51.255 si +185.33.52.0 - 185.33.55.255 hu +185.33.56.0 - 185.33.59.255 it +185.33.60.0 - 185.33.63.255 tr +185.33.64.0 - 185.33.67.255 es +185.33.68.0 - 185.33.71.255 nl +185.33.72.0 - 185.33.75.255 fi +185.33.76.0 - 185.33.79.255 gb +185.33.80.0 - 185.33.83.255 hu +185.33.84.0 - 185.33.85.255 gb +185.33.86.0 - 185.33.86.31 de +185.33.86.32 - 185.33.87.255 gb +185.33.88.0 - 185.33.91.255 fr +185.33.92.0 - 185.33.95.255 gb +185.33.96.0 - 185.33.99.255 fi +185.33.100.0 - 185.33.103.255 us +185.33.104.0 - 185.33.107.255 md +185.33.108.0 - 185.33.111.255 tr +185.33.112.0 - 185.33.115.255 lb +185.33.116.0 - 185.33.119.255 nl +185.33.120.0 - 185.33.123.255 ru +185.33.124.0 - 185.33.127.255 kw +185.33.128.0 - 185.33.131.255 tr +185.33.132.0 - 185.33.135.255 es +185.33.136.0 - 185.33.139.255 cz +185.33.140.0 - 185.33.143.255 ua +185.33.144.0 - 185.33.146.255 cz +185.33.147.0 - 185.33.147.255 hu +185.33.148.0 - 185.33.151.255 gb +185.33.152.0 - 185.33.155.255 nl +185.33.156.0 - 185.33.159.255 cz +185.33.160.0 - 185.33.163.255 ru +185.33.164.0 - 185.33.167.255 nl +185.33.168.0 - 185.33.168.255 ps +185.33.169.0 - 185.33.171.255 us +185.33.172.0 - 185.33.175.255 sa +185.33.176.0 - 185.33.179.255 bh +185.33.180.0 - 185.33.183.255 de +185.33.184.0 - 185.33.187.255 gb +185.33.188.0 - 185.33.191.255 de +185.33.192.0 - 185.33.195.255 gb +185.33.196.0 - 185.33.203.255 ru +185.33.204.0 - 185.33.207.255 de +185.33.208.0 - 185.33.211.255 gb +185.33.212.0 - 185.33.215.255 fr +185.33.216.0 - 185.33.219.255 de +185.33.220.0 - 185.33.223.255 eu +185.33.224.0 - 185.33.227.255 ch +185.33.228.0 - 185.33.231.255 ru +185.33.232.0 - 185.33.235.255 cy +185.33.236.0 - 185.33.239.255 ru +185.33.240.0 - 185.33.243.255 gb +185.33.244.0 - 185.33.247.255 ru +185.33.248.0 - 185.33.251.255 ch +185.33.252.0 - 185.33.255.255 at +185.34.0.0 - 185.34.3.255 de +185.34.4.0 - 185.34.7.255 no +185.34.8.0 - 185.34.11.255 gb +185.34.12.0 - 185.34.15.255 dk +185.34.16.0 - 185.34.19.255 iq +185.34.20.0 - 185.34.23.255 ru +185.34.24.0 - 185.34.27.255 lv +185.34.28.0 - 185.34.31.255 pl +185.34.32.0 - 185.34.35.255 fr +185.34.36.0 - 185.34.39.255 it +185.34.40.0 - 185.34.40.255 nl +185.34.41.0 - 185.34.41.127 us +185.34.41.128 - 185.34.41.255 ae +185.34.42.0 - 185.34.43.127 us +185.34.43.128 - 185.34.43.255 de +185.34.44.0 - 185.34.47.255 gb +185.34.48.0 - 185.34.51.255 pl +185.34.52.0 - 185.34.55.255 nl +185.34.56.0 - 185.34.56.15 pl +185.34.56.16 - 185.34.56.31 fr +185.34.56.32 - 185.34.56.47 ch +185.34.56.48 - 185.34.56.63 de +185.34.56.64 - 185.34.56.79 cz +185.34.56.80 - 185.34.56.95 it +185.34.56.96 - 185.34.56.111 nl +185.34.56.112 - 185.34.63.255 gb +185.34.64.0 - 185.34.71.255 nl +185.34.72.0 - 185.34.75.255 az +185.34.76.0 - 185.34.79.255 pl +185.34.80.0 - 185.34.83.255 gb +185.34.84.0 - 185.34.87.255 it +185.34.88.0 - 185.34.91.255 de +185.34.92.0 - 185.34.95.255 rs +185.34.96.0 - 185.34.99.255 gb +185.34.100.0 - 185.34.103.255 az +185.34.104.0 - 185.34.111.255 ie +185.34.112.0 - 185.34.115.255 de +185.34.116.0 - 185.34.119.255 gb +185.34.120.0 - 185.34.123.255 ie +185.34.124.0 - 185.34.127.255 gb +185.34.128.0 - 185.34.131.255 tr +185.34.132.0 - 185.34.135.255 dk +185.34.136.0 - 185.34.136.255 nl +185.34.137.0 - 185.34.139.255 it +185.34.140.0 - 185.34.143.255 fr +185.34.144.0 - 185.34.147.255 nl +185.34.148.0 - 185.34.151.255 li +185.34.152.0 - 185.34.155.255 ru +185.34.156.0 - 185.34.159.255 nl +185.34.160.0 - 185.34.163.255 ir +185.34.164.0 - 185.34.167.255 gb +185.34.168.0 - 185.34.171.255 nl +185.34.172.0 - 185.34.175.255 gb +185.34.176.0 - 185.34.179.255 nl +185.34.180.0 - 185.34.183.255 ru +185.34.184.0 - 185.34.187.255 de +185.34.188.0 - 185.34.191.255 nl +185.34.192.0 - 185.34.195.255 es +185.34.196.0 - 185.34.199.255 de +185.34.200.0 - 185.34.203.255 nl +185.34.204.0 - 185.34.207.255 it +185.34.208.0 - 185.34.211.255 gb +185.34.212.0 - 185.34.215.255 de +185.34.216.0 - 185.34.223.255 nl +185.34.224.0 - 185.34.227.255 ua +185.34.228.0 - 185.34.229.129 bh +185.34.229.130 - 185.34.229.130 us +185.34.229.131 - 185.34.231.255 bh +185.34.232.0 - 185.34.235.255 gb +185.34.236.0 - 185.34.239.255 pl +185.34.240.0 - 185.34.247.255 ru +185.34.248.0 - 185.34.255.255 gb +185.35.0.0 - 185.35.7.255 ru +185.35.8.0 - 185.35.11.255 ua +185.35.12.0 - 185.35.15.255 de +185.35.16.0 - 185.35.19.255 kz +185.35.20.0 - 185.35.23.255 tr +185.35.24.0 - 185.35.27.255 gb +185.35.28.0 - 185.35.31.255 ch +185.35.32.0 - 185.35.35.255 nl +185.35.36.0 - 185.35.47.255 ru +185.35.48.0 - 185.35.51.255 gb +185.35.52.0 - 185.35.55.255 be +185.35.56.0 - 185.35.59.255 gb +185.35.60.0 - 185.35.63.255 ch +185.35.64.0 - 185.35.67.255 fr +185.35.68.0 - 185.35.71.255 lv +185.35.72.0 - 185.35.75.255 gb +185.35.76.0 - 185.35.76.255 nl +185.35.77.0 - 185.35.77.255 gb +185.35.78.0 - 185.35.78.255 us +185.35.79.0 - 185.35.79.255 gb +185.35.80.0 - 185.35.83.255 no +185.35.84.0 - 185.35.87.255 se +185.35.88.0 - 185.35.91.255 gb +185.35.92.0 - 185.35.95.255 es +185.35.96.0 - 185.35.99.255 nl +185.35.100.0 - 185.35.103.255 ua +185.35.104.0 - 185.35.107.255 ae +185.35.108.0 - 185.35.111.255 de +185.35.112.0 - 185.35.115.255 nl +185.35.116.0 - 185.35.123.255 ru +185.35.124.0 - 185.35.127.255 gb +185.35.128.0 - 185.35.131.255 ru +185.35.132.0 - 185.35.135.255 de +185.35.136.0 - 185.35.139.255 nl +185.35.140.0 - 185.35.143.255 es +185.35.144.0 - 185.35.147.255 de +185.35.148.0 - 185.35.151.255 gb +185.35.152.0 - 185.35.155.255 at +185.35.156.0 - 185.35.159.255 ba +185.35.160.0 - 185.35.163.255 ru +185.35.164.0 - 185.35.167.255 be +185.35.168.0 - 185.35.171.255 ru +185.35.172.0 - 185.35.175.255 be +185.35.176.0 - 185.35.179.255 bg +185.35.180.0 - 185.35.183.255 at +185.35.184.0 - 185.35.187.255 no +185.35.188.0 - 185.35.191.255 es +185.35.192.0 - 185.35.195.255 ru +185.35.196.0 - 185.35.199.255 pl +185.35.200.0 - 185.35.200.255 se +185.35.201.0 - 185.35.203.255 no +185.35.204.0 - 185.35.207.255 fr +185.35.208.0 - 185.35.211.255 de +185.35.212.0 - 185.35.215.255 no +185.35.216.0 - 185.35.219.255 de +185.35.220.0 - 185.35.223.255 ru +185.35.224.0 - 185.35.227.255 ch +185.35.228.0 - 185.35.231.255 gb +185.35.232.0 - 185.35.235.255 de +185.35.236.0 - 185.35.239.255 se +185.35.240.0 - 185.35.243.255 de +185.35.244.0 - 185.35.247.255 is +185.35.248.0 - 185.35.251.255 gb +185.35.252.0 - 185.35.255.255 ch +185.36.0.0 - 185.36.3.255 es +185.36.4.0 - 185.36.7.255 be +185.36.8.0 - 185.36.11.255 gb +185.36.12.0 - 185.36.15.255 fr +185.36.16.0 - 185.36.19.255 at +185.36.20.0 - 185.36.20.255 eu +185.36.21.0 - 185.36.21.255 de +185.36.22.0 - 185.36.23.255 eu +185.36.24.0 - 185.36.27.255 gb +185.36.28.0 - 185.36.31.255 no +185.36.32.0 - 185.36.35.255 gb +185.36.36.0 - 185.36.39.255 am +185.36.40.0 - 185.36.43.255 nl +185.36.44.0 - 185.36.47.255 de +185.36.48.0 - 185.36.51.255 no +185.36.52.0 - 185.36.55.255 it +185.36.56.0 - 185.36.59.255 ua +185.36.60.0 - 185.36.63.255 ru +185.36.64.0 - 185.36.67.255 it +185.36.68.0 - 185.36.71.255 ba +185.36.72.0 - 185.36.75.255 it +185.36.76.0 - 185.36.83.255 gb +185.36.84.0 - 185.36.87.255 ba +185.36.88.0 - 185.36.91.255 bh +185.36.92.0 - 185.36.95.255 ro +185.36.96.0 - 185.36.99.255 fi +185.36.100.0 - 185.36.100.144 nl +185.36.100.145 - 185.36.100.145 a1 +185.36.100.146 - 185.36.103.255 nl +185.36.104.0 - 185.36.107.255 ru +185.36.108.0 - 185.36.111.255 gb +185.36.112.0 - 185.36.115.255 nl +185.36.116.0 - 185.36.123.255 de +185.36.124.0 - 185.36.127.255 no +185.36.128.0 - 185.36.131.255 it +185.36.132.0 - 185.36.135.255 nl +185.36.136.0 - 185.36.139.255 de +185.36.140.0 - 185.36.143.255 no +185.36.144.0 - 185.36.147.255 es +185.36.148.0 - 185.36.151.255 ax +185.36.152.0 - 185.36.155.255 pl +185.36.156.0 - 185.36.159.255 ru +185.36.160.0 - 185.36.163.255 cz +185.36.164.0 - 185.36.167.255 be +185.36.168.0 - 185.36.171.255 pl +185.36.172.0 - 185.36.175.255 ru +185.36.176.0 - 185.36.179.255 kw +185.36.180.0 - 185.36.183.255 lu +185.36.184.0 - 185.36.187.255 dk +185.36.188.0 - 185.36.191.255 ua +185.36.192.0 - 185.36.195.255 ir +185.36.196.0 - 185.36.199.255 ua +185.36.200.0 - 185.36.203.255 az +185.36.204.0 - 185.36.211.255 es +185.36.212.0 - 185.36.215.255 no +185.36.216.0 - 185.36.219.255 fr +185.36.220.0 - 185.36.227.255 ch +185.36.228.0 - 185.36.231.255 ru +185.36.232.0 - 185.36.235.255 gr +185.36.236.0 - 185.36.239.255 mt +185.36.240.0 - 185.36.240.255 se +185.36.241.0 - 185.36.243.255 no +185.36.244.0 - 185.36.247.255 ge +185.36.248.0 - 185.36.251.255 gb +185.36.252.0 - 185.36.255.255 ro +185.37.0.0 - 185.37.3.255 ch +185.37.4.0 - 185.37.7.255 nl +185.37.8.0 - 185.37.11.255 be +185.37.12.0 - 185.37.15.255 ps +185.37.16.0 - 185.37.19.255 de +185.37.20.0 - 185.37.23.255 nl +185.37.24.0 - 185.37.27.255 rs +185.37.28.0 - 185.37.31.255 fr +185.37.32.0 - 185.37.35.255 me +185.37.36.0 - 185.37.39.255 us +185.37.40.0 - 185.37.43.255 fr +185.37.44.0 - 185.37.47.255 it +185.37.48.0 - 185.37.51.255 ru +185.37.52.0 - 185.37.55.255 ir +185.37.56.0 - 185.37.63.255 ru +185.37.64.0 - 185.37.71.255 nl +185.37.72.0 - 185.37.75.255 ch +185.37.76.0 - 185.37.79.255 gb +185.37.80.0 - 185.37.83.255 it +185.37.84.0 - 185.37.87.255 dk +185.37.88.0 - 185.37.91.255 iq +185.37.92.0 - 185.37.95.255 it +185.37.96.0 - 185.37.99.255 qa +185.37.100.0 - 185.37.100.255 ba +185.37.101.0 - 185.37.101.255 ru +185.37.102.0 - 185.37.102.255 ro +185.37.103.0 - 185.37.103.255 tr +185.37.104.0 - 185.37.107.255 at +185.37.108.0 - 185.37.111.255 qa +185.37.112.0 - 185.37.115.255 pl +185.37.116.0 - 185.37.119.255 it +185.37.120.0 - 185.37.123.255 ie +185.37.124.0 - 185.37.127.255 nl +185.37.128.0 - 185.37.131.255 ru +185.37.132.0 - 185.37.135.255 fi +185.37.136.0 - 185.37.139.255 de +185.37.140.0 - 185.37.140.255 dk +185.37.141.0 - 185.37.143.255 se +185.37.144.0 - 185.37.147.255 de +185.37.148.0 - 185.37.151.255 il +185.37.152.0 - 185.37.155.255 de +185.37.156.0 - 185.37.159.255 fr +185.37.160.0 - 185.37.163.255 iq +185.37.164.0 - 185.37.167.255 ru +185.37.168.0 - 185.37.171.255 rs +185.37.172.0 - 185.37.179.255 gb +185.37.180.0 - 185.37.183.255 it +185.37.184.0 - 185.37.187.255 tr +185.37.188.0 - 185.37.191.255 ru +185.37.192.0 - 185.37.195.255 ua +185.37.196.0 - 185.37.199.255 gb +185.37.200.0 - 185.37.203.255 at +185.37.204.0 - 185.37.207.255 it +185.37.208.0 - 185.37.211.255 pt +185.37.212.0 - 185.37.215.255 es +185.37.216.0 - 185.37.219.255 gb +185.37.220.0 - 185.37.220.255 fr +185.37.221.0 - 185.37.221.31 hk +185.37.221.32 - 185.37.221.63 sg +185.37.221.64 - 185.37.221.95 jp +185.37.221.96 - 185.37.221.159 us +185.37.221.160 - 185.37.221.175 fr +185.37.221.176 - 185.37.221.191 hk +185.37.221.192 - 185.37.221.223 fr +185.37.221.224 - 185.37.221.239 us +185.37.221.240 - 185.37.221.255 fr +185.37.222.0 - 185.37.222.255 us +185.37.223.0 - 185.37.223.47 fr +185.37.223.48 - 185.37.223.63 au +185.37.223.64 - 185.37.223.95 fr +185.37.223.96 - 185.37.223.127 us +185.37.223.128 - 185.37.223.255 jp +185.37.224.0 - 185.37.231.255 es +185.37.232.0 - 185.37.235.255 is +185.37.236.0 - 185.37.239.255 gb +185.37.240.0 - 185.37.243.255 sk +185.37.244.0 - 185.37.247.255 nl +185.37.248.0 - 185.37.251.255 de +185.37.252.0 - 185.37.255.255 ch +185.38.0.0 - 185.38.3.255 fi +185.38.4.0 - 185.38.7.255 at +185.38.8.0 - 185.38.11.255 de +185.38.12.0 - 185.38.15.255 nl +185.38.16.0 - 185.38.19.255 ru +185.38.20.0 - 185.38.23.255 fr +185.38.24.0 - 185.38.27.255 dk +185.38.28.0 - 185.38.31.255 lb +185.38.32.0 - 185.38.39.255 gb +185.38.40.0 - 185.38.43.255 de +185.38.44.0 - 185.38.47.255 gb +185.38.48.0 - 185.38.55.255 de +185.38.56.0 - 185.38.59.255 lv +185.38.60.0 - 185.38.63.255 ie +185.38.64.0 - 185.38.67.255 ch +185.38.68.0 - 185.38.71.255 no +185.38.72.0 - 185.38.75.255 ua +185.38.76.0 - 185.38.76.255 de +185.38.77.0 - 185.38.77.255 us +185.38.78.0 - 185.38.79.255 de +185.38.80.0 - 185.38.83.255 gb +185.38.84.0 - 185.38.87.255 ru +185.38.88.0 - 185.38.91.255 nl +185.38.92.0 - 185.38.95.255 fr +185.38.96.0 - 185.38.99.255 gb +185.38.100.0 - 185.38.103.255 nl +185.38.104.0 - 185.38.107.255 gb +185.38.108.0 - 185.38.108.255 a2 +185.38.109.0 - 185.38.111.255 cz +185.38.112.0 - 185.38.115.255 gb +185.38.116.0 - 185.38.119.255 de +185.38.120.0 - 185.38.123.255 no +185.38.124.0 - 185.38.127.255 hu +185.38.128.0 - 185.38.131.255 es +185.38.132.0 - 185.38.135.255 gb +185.38.136.0 - 185.38.139.255 it +185.38.140.0 - 185.38.143.255 pt +185.38.144.0 - 185.38.147.255 ba +185.38.148.0 - 185.38.151.255 gb +185.38.152.0 - 185.38.159.255 nl +185.38.160.0 - 185.38.163.255 ru +185.38.164.0 - 185.38.167.255 lt +185.38.168.0 - 185.38.171.255 at +185.38.172.0 - 185.38.175.255 dk +185.38.176.0 - 185.38.179.255 hr +185.38.180.0 - 185.38.183.255 dk +185.38.184.0 - 185.38.187.255 me +185.38.188.0 - 185.38.191.255 cz +185.38.192.0 - 185.38.195.255 al +185.38.196.0 - 185.38.199.255 fr +185.38.200.0 - 185.38.200.255 nl +185.38.201.0 - 185.38.201.255 us +185.38.202.0 - 185.38.202.255 gb +185.38.203.0 - 185.38.203.255 nl +185.38.204.0 - 185.38.207.255 ru +185.38.208.0 - 185.38.211.255 ua +185.38.212.0 - 185.38.215.255 iq +185.38.216.0 - 185.38.219.255 ua +185.38.220.0 - 185.38.227.255 pl +185.38.228.0 - 185.38.231.255 gb +185.38.232.0 - 185.38.235.255 nl +185.38.236.0 - 185.38.239.255 no +185.38.240.0 - 185.38.243.255 ru +185.38.244.0 - 185.38.247.255 gb +185.38.248.0 - 185.38.251.255 pl +185.38.252.0 - 185.38.255.255 it +185.39.0.0 - 185.39.3.255 ba +185.39.4.0 - 185.39.7.255 ru +185.39.8.0 - 185.39.11.255 ch +185.39.12.0 - 185.39.15.255 de +185.39.16.0 - 185.39.19.255 ru +185.39.20.0 - 185.39.23.255 de +185.39.24.0 - 185.39.27.255 it +185.39.28.0 - 185.39.31.255 ua +185.39.32.0 - 185.39.35.255 ch +185.39.36.0 - 185.39.39.255 sa +185.39.40.0 - 185.39.43.255 es +185.39.44.0 - 185.39.47.255 nl +185.39.48.0 - 185.39.51.255 de +185.39.52.0 - 185.39.52.140 nl +185.39.52.141 - 185.39.52.141 be +185.39.52.142 - 185.39.54.255 nl +185.39.55.0 - 185.39.55.7 gb +185.39.55.8 - 185.39.55.15 at +185.39.55.16 - 185.39.55.79 nl +185.39.55.80 - 185.39.55.87 gb +185.39.55.88 - 185.39.55.95 at +185.39.55.96 - 185.39.55.107 nl +185.39.55.108 - 185.39.55.159 gb +185.39.55.160 - 185.39.55.255 nl +185.39.56.0 - 185.39.59.255 de +185.39.60.0 - 185.39.63.255 es +185.39.64.0 - 185.39.67.255 de +185.39.68.0 - 185.39.71.255 es +185.39.72.0 - 185.39.75.255 ua +185.39.76.0 - 185.39.79.255 iq +185.39.80.0 - 185.39.83.255 ru +185.39.84.0 - 185.39.91.255 de +185.39.92.0 - 185.39.95.255 ch +185.39.96.0 - 185.39.99.255 es +185.39.100.0 - 185.39.103.255 it +185.39.104.0 - 185.39.111.255 de +185.39.112.0 - 185.39.119.255 ru +185.39.120.0 - 185.39.123.255 nl +185.39.124.0 - 185.39.127.255 se +185.39.128.0 - 185.39.131.255 fi +185.39.132.0 - 185.39.135.255 ru +185.39.136.0 - 185.39.139.255 es +185.39.140.0 - 185.39.143.255 fr +185.39.144.0 - 185.39.147.255 se +185.39.148.0 - 185.39.151.255 ru +185.39.152.0 - 185.39.155.255 lu +185.39.156.0 - 185.39.159.255 fr +185.39.160.0 - 185.39.163.255 pl +185.39.164.0 - 185.39.167.255 ie +185.39.168.0 - 185.39.171.255 fr +185.39.172.0 - 185.39.175.255 at +185.39.176.0 - 185.39.179.255 de +185.39.180.0 - 185.39.183.255 ir +185.39.184.0 - 185.39.187.255 fi +185.39.188.0 - 185.39.191.255 it +185.39.192.0 - 185.39.195.255 ru +185.39.196.0 - 185.39.199.255 ua +185.39.200.0 - 185.39.203.255 no +185.39.204.0 - 185.39.207.255 ru +185.39.208.0 - 185.39.211.255 pt +185.39.212.0 - 185.39.215.255 no +185.39.216.0 - 185.39.219.255 fr +185.39.220.0 - 185.39.223.255 de +185.39.224.0 - 185.39.227.255 ua +185.39.228.0 - 185.39.231.255 ch +185.39.232.0 - 185.39.239.255 gb +185.39.240.0 - 185.39.243.255 it +185.39.244.0 - 185.39.251.255 gb +185.39.252.0 - 185.39.255.255 de +185.40.0.0 - 185.40.7.255 ru +185.40.8.0 - 185.40.11.255 gb +185.40.12.0 - 185.40.19.255 it +185.40.20.0 - 185.40.23.255 hu +185.40.24.0 - 185.40.27.255 gb +185.40.28.0 - 185.40.31.255 ru +185.40.32.0 - 185.40.35.255 az +185.40.36.0 - 185.40.39.255 es +185.40.40.0 - 185.40.43.255 ru +185.40.44.0 - 185.40.47.255 dk +185.40.48.0 - 185.40.51.255 ua +185.40.52.0 - 185.40.55.255 at +185.40.56.0 - 185.40.59.255 nl +185.40.60.0 - 185.40.63.255 lu +185.40.64.0 - 185.40.67.255 ie +185.40.68.0 - 185.40.71.255 be +185.40.72.0 - 185.40.75.255 tr +185.40.76.0 - 185.40.79.255 ru +185.40.80.0 - 185.40.83.255 cz +185.40.84.0 - 185.40.87.255 tr +185.40.88.0 - 185.40.91.255 fi +185.40.92.0 - 185.40.99.255 nl +185.40.100.0 - 185.40.103.255 fr +185.40.104.0 - 185.40.107.255 ru +185.40.108.0 - 185.40.111.255 nl +185.40.112.0 - 185.40.115.255 pl +185.40.116.0 - 185.40.119.255 de +185.40.120.0 - 185.40.123.255 is +185.40.124.0 - 185.40.127.255 gb +185.40.128.0 - 185.40.131.255 ru +185.40.132.0 - 185.40.134.2 de +185.40.134.3 - 185.40.134.3 ch +185.40.134.4 - 185.40.135.255 de +185.40.136.0 - 185.40.139.255 hu +185.40.140.0 - 185.40.143.255 gb +185.40.144.0 - 185.40.151.255 es +185.40.152.0 - 185.40.155.255 ru +185.40.156.0 - 185.40.159.255 az +185.40.160.0 - 185.40.163.255 de +185.40.164.0 - 185.40.167.255 bg +185.40.168.0 - 185.40.171.255 at +185.40.172.0 - 185.40.175.255 de +185.40.176.0 - 185.40.179.255 az +185.40.184.0 - 185.40.187.255 se +185.40.188.0 - 185.40.191.255 me +185.40.192.0 - 185.40.195.255 ps +185.40.196.0 - 185.40.199.255 pl +185.40.200.0 - 185.40.203.255 fi +185.40.204.0 - 185.40.207.255 gb +185.40.208.0 - 185.40.211.255 lb +185.40.212.0 - 185.40.215.255 it +185.40.216.0 - 185.40.219.255 ch +185.40.220.0 - 185.40.223.255 it +185.40.224.0 - 185.40.227.255 ir +185.40.228.0 - 185.40.231.255 pl +185.40.232.0 - 185.40.232.255 fr +185.40.233.0 - 185.40.233.255 nl +185.40.234.0 - 185.40.234.255 de +185.40.235.0 - 185.40.235.255 ro +185.40.236.0 - 185.40.239.255 ee +185.40.240.0 - 185.40.243.255 ir +185.40.244.0 - 185.40.251.255 de +185.40.252.0 - 185.40.255.255 nl +185.41.0.0 - 185.41.3.255 ir +185.41.4.0 - 185.41.7.255 fr +185.41.8.0 - 185.41.11.255 gb +185.41.12.0 - 185.41.15.255 de +185.41.16.0 - 185.41.19.255 no +185.41.20.0 - 185.41.23.255 ua +185.41.24.0 - 185.41.27.255 gb +185.41.28.0 - 185.41.31.255 fr +185.41.32.0 - 185.41.35.255 it +185.41.36.0 - 185.41.39.255 nl +185.41.40.0 - 185.41.43.255 ru +185.41.44.0 - 185.41.44.223 gb +185.41.44.224 - 185.41.44.224 es +185.41.44.225 - 185.41.44.225 nl +185.41.44.226 - 185.41.44.226 fr +185.41.44.227 - 185.41.44.229 gb +185.41.44.230 - 185.41.44.230 ie +185.41.44.231 - 185.41.45.255 gb +185.41.46.0 - 185.41.46.50 de +185.41.46.51 - 185.41.46.51 cz +185.41.46.52 - 185.41.46.53 de +185.41.46.54 - 185.41.46.54 it +185.41.46.55 - 185.41.46.55 de +185.41.46.56 - 185.41.46.56 cz +185.41.46.57 - 185.41.46.57 be +185.41.46.58 - 185.41.46.58 pl +185.41.46.59 - 185.41.46.59 fr +185.41.46.60 - 185.41.46.60 ie +185.41.46.61 - 185.41.46.61 it +185.41.46.62 - 185.41.46.62 pl +185.41.46.63 - 185.41.46.63 ie +185.41.46.64 - 185.41.46.103 de +185.41.46.104 - 185.41.46.104 fr +185.41.46.105 - 185.41.46.114 de +185.41.46.115 - 185.41.46.115 fr +185.41.46.116 - 185.41.46.255 de +185.41.47.0 - 185.41.47.255 gb +185.41.48.0 - 185.41.51.255 nl +185.41.52.0 - 185.41.55.255 cz +185.41.56.0 - 185.41.63.255 de +185.41.64.0 - 185.41.67.255 no +185.41.68.0 - 185.41.71.255 pl +185.41.72.0 - 185.41.75.255 it +185.41.76.0 - 185.41.79.255 ch +185.41.80.0 - 185.41.83.255 pl +185.41.84.0 - 185.41.87.255 sy +185.41.88.0 - 185.41.91.255 it +185.41.92.0 - 185.41.95.255 pl +185.41.96.0 - 185.41.99.255 es +185.41.100.0 - 185.41.103.255 ru +185.41.104.0 - 185.41.111.255 de +185.41.112.0 - 185.41.115.255 ru +185.41.116.0 - 185.41.119.255 pt +185.41.120.0 - 185.41.123.255 ru +185.41.124.0 - 185.41.127.255 nl +185.41.128.0 - 185.41.131.255 pl +185.41.132.0 - 185.41.135.255 ch +185.41.136.0 - 185.41.147.255 nl +185.41.148.0 - 185.41.151.255 se +185.41.152.0 - 185.41.155.255 fr +185.41.156.0 - 185.41.159.255 ge +185.41.160.0 - 185.41.163.255 ru +185.41.164.0 - 185.41.167.255 it +185.41.168.0 - 185.41.171.255 ru +185.41.172.0 - 185.41.175.255 se +185.41.176.0 - 185.41.179.255 si +185.41.180.0 - 185.41.183.255 fr +185.41.184.0 - 185.41.187.255 ru +185.41.188.0 - 185.41.191.255 gb +185.41.192.0 - 185.41.195.255 ua +185.41.196.0 - 185.41.199.255 ru +185.41.200.0 - 185.41.203.255 az +185.41.204.0 - 185.41.207.255 ru +185.41.208.0 - 185.41.211.255 cy +185.41.212.0 - 185.41.215.255 it +185.41.216.0 - 185.41.219.255 kw +185.41.220.0 - 185.41.235.255 gb +185.41.236.0 - 185.41.239.255 be +185.41.240.0 - 185.41.243.255 no +185.41.244.0 - 185.41.247.255 es +185.41.248.0 - 185.41.251.255 fr +185.41.252.0 - 185.41.255.255 it +185.42.0.0 - 185.42.3.255 gb +185.42.4.0 - 185.42.7.255 sk +185.42.8.0 - 185.42.11.255 nl +185.42.12.0 - 185.42.15.255 ru +185.42.16.0 - 185.42.19.255 gb +185.42.20.0 - 185.42.23.255 es +185.42.24.0 - 185.42.27.255 ir +185.42.28.0 - 185.42.31.255 fr +185.42.32.0 - 185.42.35.255 cy +185.42.36.0 - 185.42.39.255 mk +185.42.40.0 - 185.42.43.255 ua +185.42.44.0 - 185.42.47.255 pl +185.42.48.0 - 185.42.51.255 ru +185.42.52.0 - 185.42.55.255 gb +185.42.56.0 - 185.42.59.255 nl +185.42.60.0 - 185.42.63.255 ru +185.42.64.0 - 185.42.67.255 gb +185.42.68.0 - 185.42.75.255 nl +185.42.76.0 - 185.42.83.255 ru +185.42.84.0 - 185.42.87.255 nl +185.42.88.0 - 185.42.95.255 ru +185.42.96.0 - 185.42.99.255 tj +185.42.100.0 - 185.42.103.255 eu +185.42.104.0 - 185.42.107.255 es +185.42.108.0 - 185.42.111.255 ru +185.42.112.0 - 185.42.119.255 fr +185.42.120.0 - 185.42.123.255 es +185.42.124.0 - 185.42.127.255 ru +185.42.128.0 - 185.42.131.255 ua +185.42.132.0 - 185.42.135.255 fr +185.42.136.0 - 185.42.139.255 se +185.42.140.0 - 185.42.143.255 ae +185.42.144.0 - 185.42.147.255 ru +185.42.148.0 - 185.42.155.255 gb +185.42.156.0 - 185.42.159.255 ru +185.42.160.0 - 185.42.163.255 it +185.42.164.0 - 185.42.167.255 ru +185.42.168.0 - 185.42.171.255 no +185.42.172.0 - 185.42.175.255 tr +185.42.176.0 - 185.42.179.255 fr +185.42.180.0 - 185.42.183.255 ru +185.42.184.0 - 185.42.187.255 pl +185.42.188.0 - 185.42.191.255 fr +185.42.192.0 - 185.42.195.255 iq +185.42.196.0 - 185.42.203.255 nl +185.42.204.0 - 185.42.207.255 eu +185.42.208.0 - 185.42.211.255 gr +185.42.212.0 - 185.42.215.255 ir +185.42.216.0 - 185.42.219.255 lu +185.42.220.0 - 185.42.223.255 gb +185.42.224.0 - 185.42.227.255 ir +185.42.228.0 - 185.42.231.255 ru +185.42.232.0 - 185.42.235.255 fr +185.42.236.0 - 185.42.239.255 gb +185.42.240.0 - 185.42.243.255 es +185.42.244.0 - 185.42.251.255 ch +185.42.252.0 - 185.42.255.255 de +185.43.0.0 - 185.43.3.255 be +185.43.4.0 - 185.43.5.146 de +185.43.5.147 - 185.43.5.147 ru +185.43.5.148 - 185.43.5.255 de +185.43.6.0 - 185.43.6.255 ru +185.43.7.0 - 185.43.7.255 de +185.43.8.0 - 185.43.11.255 ru +185.43.12.0 - 185.43.15.255 at +185.43.16.0 - 185.43.19.255 it +185.43.20.0 - 185.43.23.255 nl +185.43.24.0 - 185.43.31.255 de +185.43.32.0 - 185.43.35.255 gb +185.43.36.0 - 185.43.39.255 fr +185.43.40.0 - 185.43.43.255 gb +185.43.44.0 - 185.43.47.255 fr +185.43.48.0 - 185.43.51.255 gb +185.43.52.0 - 185.43.55.255 de +185.43.56.0 - 185.43.59.255 bg +185.43.60.0 - 185.43.63.255 fr +185.43.64.0 - 185.43.67.255 nl +185.43.68.0 - 185.43.71.255 fr +185.43.72.0 - 185.43.75.255 es +185.43.76.0 - 185.43.79.255 gb +185.43.80.0 - 185.43.83.255 nl +185.43.84.0 - 185.43.87.255 ru +185.43.88.0 - 185.43.91.255 fi +185.43.92.0 - 185.43.95.255 ru +185.43.96.0 - 185.43.99.255 gb +185.43.100.0 - 185.43.103.255 ru +185.43.104.0 - 185.43.107.255 ee +185.43.108.0 - 185.43.108.255 us +185.43.109.0 - 185.43.111.255 gb +185.43.112.0 - 185.43.115.255 sk +185.43.116.0 - 185.43.119.255 de +185.43.120.0 - 185.43.123.255 fi +185.43.124.0 - 185.43.127.255 be +185.43.128.0 - 185.43.131.255 gb +185.43.132.0 - 185.43.135.255 cz +185.43.136.0 - 185.43.139.255 pl +185.43.140.0 - 185.43.143.255 dk +185.43.144.0 - 185.43.147.255 gb +185.43.148.0 - 185.43.151.255 it +185.43.152.0 - 185.43.155.255 be +185.43.156.0 - 185.43.159.255 gb +185.43.160.0 - 185.43.163.255 pl +185.43.164.0 - 185.43.167.255 it +185.43.168.0 - 185.43.171.255 de +185.43.172.0 - 185.43.175.255 hu +185.43.176.0 - 185.43.179.255 de +185.43.180.0 - 185.43.183.255 es +185.43.184.0 - 185.43.187.255 gb +185.43.188.0 - 185.43.191.255 az +185.43.192.0 - 185.43.195.255 ie +185.43.196.0 - 185.43.199.255 ru +185.43.200.0 - 185.43.203.255 ch +185.43.204.0 - 185.43.207.255 hu +185.43.208.0 - 185.43.211.255 gb +185.43.212.0 - 185.43.215.255 nl +185.43.216.0 - 185.43.219.255 gb +185.43.220.0 - 185.43.223.255 cz +185.43.224.0 - 185.43.227.255 ua +185.43.228.0 - 185.43.231.255 tr +185.43.232.0 - 185.43.235.255 ie +185.43.236.0 - 185.43.239.255 ua +185.43.240.0 - 185.43.243.255 fr +185.43.244.0 - 185.43.247.255 ch +185.43.248.0 - 185.43.251.255 ua +185.43.252.0 - 185.43.255.255 es +185.44.0.0 - 185.44.3.255 ru +185.44.4.0 - 185.44.7.255 de +185.44.8.0 - 185.44.15.255 ru +185.44.16.0 - 185.44.19.255 es +185.44.20.0 - 185.44.23.255 ch +185.44.24.0 - 185.44.31.255 es +185.44.32.0 - 185.44.35.255 de +185.44.36.0 - 185.44.39.255 ir +185.44.40.0 - 185.44.47.255 fr +185.44.48.0 - 185.44.55.255 at +185.44.56.0 - 185.44.59.255 lu +185.44.60.0 - 185.44.63.255 es +185.44.64.0 - 185.44.67.255 ir +185.44.68.0 - 185.44.71.255 ru +185.44.72.0 - 185.44.75.255 lt +185.44.76.0 - 185.44.76.255 gb +185.44.77.0 - 185.44.77.255 fr +185.44.78.0 - 185.44.79.255 gb +185.44.80.0 - 185.44.83.255 ch +185.44.84.0 - 185.44.87.255 ua +185.44.88.0 - 185.44.91.255 fr +185.44.92.0 - 185.44.95.255 nl +185.44.96.0 - 185.44.99.255 no +185.44.100.0 - 185.44.103.255 ir +185.44.104.0 - 185.44.111.255 de +185.44.112.0 - 185.44.115.255 ir +185.44.116.0 - 185.44.116.63 bg +185.44.116.64 - 185.44.116.127 ge +185.44.116.128 - 185.44.116.255 bg +185.44.117.0 - 185.44.117.255 ge +185.44.118.0 - 185.44.119.255 bg +185.44.120.0 - 185.44.123.255 ru +185.44.124.0 - 185.44.127.255 bg +185.44.128.0 - 185.44.131.255 nl +185.44.132.0 - 185.44.135.255 de +185.44.136.0 - 185.44.139.255 nl +185.44.140.0 - 185.44.143.255 fr +185.44.144.0 - 185.44.147.255 gr +185.44.148.0 - 185.44.151.255 de +185.44.152.0 - 185.44.155.255 lb +185.44.156.0 - 185.44.159.255 li +185.44.160.0 - 185.44.163.255 nl +185.44.164.0 - 185.44.167.255 ru +185.44.168.0 - 185.44.171.255 nl +185.44.172.0 - 185.44.175.255 pl +185.44.176.0 - 185.44.179.255 de +185.44.180.0 - 185.44.183.255 it +185.44.184.0 - 185.44.187.255 se +185.44.188.0 - 185.44.191.255 cz +185.44.192.0 - 185.44.195.255 tr +185.44.196.0 - 185.44.199.255 ch +185.44.200.0 - 185.44.200.255 de +185.44.201.0 - 185.44.201.16 us +185.44.201.17 - 185.44.201.17 de +185.44.201.18 - 185.44.201.159 us +185.44.201.160 - 185.44.201.160 de +185.44.201.161 - 185.44.201.255 us +185.44.202.0 - 185.44.203.255 de +185.44.204.0 - 185.44.211.255 at +185.44.212.0 - 185.44.215.255 it +185.44.216.0 - 185.44.219.255 pl +185.44.220.0 - 185.44.223.255 it +185.44.224.0 - 185.44.227.255 nl +185.44.228.0 - 185.44.231.255 am +185.44.232.0 - 185.44.235.255 es +185.44.236.0 - 185.44.239.255 ru +185.44.240.0 - 185.44.243.255 is +185.44.244.0 - 185.44.247.255 nl +185.44.248.0 - 185.45.4.63 gb +185.45.4.64 - 185.45.4.95 ie +185.45.4.96 - 185.45.4.127 de +185.45.4.128 - 185.45.4.159 gb +185.45.4.160 - 185.45.4.191 fr +185.45.4.192 - 185.45.7.255 gb +185.45.8.0 - 185.45.11.255 ie +185.45.12.0 - 185.45.15.255 ro +185.45.16.0 - 185.45.19.255 de +185.45.20.0 - 185.45.23.255 dk +185.45.24.0 - 185.45.27.255 gb +185.45.28.0 - 185.45.31.255 nl +185.45.32.0 - 185.45.35.255 fr +185.45.36.0 - 185.45.39.255 no +185.45.40.0 - 185.45.43.255 sm +185.45.44.0 - 185.45.47.255 nl +185.45.48.0 - 185.45.51.255 dk +185.45.52.0 - 185.45.55.255 be +185.45.56.0 - 185.45.59.255 cz +185.45.60.0 - 185.45.63.255 ru +185.45.64.0 - 185.45.67.255 bg +185.45.68.0 - 185.45.68.255 it +185.45.69.0 - 185.45.71.255 sm +185.45.72.0 - 185.45.75.255 es +185.45.76.0 - 185.45.79.255 is +185.45.80.0 - 185.45.83.255 ru +185.45.84.0 - 185.45.87.255 se +185.45.88.0 - 185.45.91.255 de +185.45.92.0 - 185.45.95.255 ru +185.45.96.0 - 185.45.99.255 gb +185.45.100.0 - 185.45.103.255 ru +185.45.104.0 - 185.45.107.255 ie +185.45.108.0 - 185.45.115.255 de +185.45.116.0 - 185.45.119.255 nl +185.45.120.0 - 185.45.123.255 se +185.45.124.0 - 185.45.127.255 cz +185.45.128.0 - 185.45.131.255 se +185.45.132.0 - 185.45.135.255 de +185.45.136.0 - 185.45.139.255 cz +185.45.140.0 - 185.45.143.255 ee +185.45.144.0 - 185.45.147.255 ru +185.45.148.0 - 185.45.151.255 dk +185.45.152.0 - 185.45.155.255 bg +185.45.156.0 - 185.45.159.255 ae +185.45.160.0 - 185.45.163.255 gb +185.45.164.0 - 185.45.167.255 es +185.45.168.0 - 185.45.171.255 gb +185.45.172.0 - 185.45.175.255 fr +185.45.176.0 - 185.45.179.255 no +185.45.180.0 - 185.45.183.255 fr +185.45.184.0 - 185.45.187.255 dk +185.45.188.0 - 185.45.191.255 ir +185.45.192.0 - 185.45.195.255 nl +185.45.196.0 - 185.45.199.255 hu +185.45.200.0 - 185.45.203.255 cz +185.45.204.0 - 185.45.207.255 de +185.45.208.0 - 185.45.211.255 it +185.45.212.0 - 185.45.215.255 at +185.45.216.0 - 185.45.219.255 pl +185.45.220.0 - 185.45.227.255 gb +185.45.228.0 - 185.45.231.255 fr +185.45.232.0 - 185.45.235.255 at +185.45.236.0 - 185.45.239.255 ch +185.45.240.0 - 185.45.243.255 de +185.45.244.0 - 185.45.247.255 ua +185.45.248.0 - 185.45.251.255 de +185.45.252.0 - 185.45.255.255 fr +185.46.0.0 - 185.46.3.255 ir +185.46.4.0 - 185.46.7.255 gr +185.46.8.0 - 185.46.19.255 ru +185.46.20.0 - 185.46.23.255 ee +185.46.24.0 - 185.46.27.255 it +185.46.28.0 - 185.46.31.255 nl +185.46.32.0 - 185.46.35.255 hr +185.46.36.0 - 185.46.39.255 dk +185.46.40.0 - 185.46.43.255 tr +185.46.44.0 - 185.46.51.255 ru +185.46.52.0 - 185.46.55.255 tr +185.46.56.0 - 185.46.59.255 ch +185.46.60.0 - 185.46.63.255 md +185.46.64.0 - 185.46.67.255 nl +185.46.68.0 - 185.46.71.255 it +185.46.72.0 - 185.46.75.255 ie +185.46.76.0 - 185.46.79.255 be +185.46.80.0 - 185.46.84.127 ch +185.46.84.128 - 185.46.84.255 pl +185.46.85.0 - 185.46.85.255 us +185.46.86.0 - 185.46.86.127 hk +185.46.86.128 - 185.46.86.255 cn +185.46.87.0 - 185.46.87.127 ru +185.46.87.128 - 185.46.87.255 jp +185.46.88.0 - 185.46.95.255 ch +185.46.96.0 - 185.46.99.255 ru +185.46.100.0 - 185.46.103.255 it +185.46.104.0 - 185.46.107.255 pl +185.46.108.0 - 185.46.111.255 ir +185.46.112.0 - 185.46.115.255 gb +185.46.116.0 - 185.46.119.255 nl +185.46.120.0 - 185.46.123.255 us +185.46.124.0 - 185.46.127.255 es +185.46.128.0 - 185.46.131.255 de +185.46.132.0 - 185.46.135.255 no +185.46.136.0 - 185.46.139.255 de +185.46.140.0 - 185.46.143.255 it +185.46.144.0 - 185.46.147.255 kw +185.46.148.0 - 185.46.151.255 ua +185.46.152.0 - 185.46.152.255 kz +185.46.153.0 - 185.46.155.255 ru +185.46.156.0 - 185.46.159.255 nl +185.46.160.0 - 185.46.163.255 bg +185.46.164.0 - 185.46.167.255 fr +185.46.168.0 - 185.46.171.255 pl +185.46.172.0 - 185.46.175.255 gb +185.46.176.0 - 185.46.179.255 ge +185.46.180.0 - 185.46.183.255 nl +185.46.184.0 - 185.46.187.255 ru +185.46.188.0 - 185.46.191.255 ua +185.46.192.0 - 185.46.195.255 nl +185.46.196.0 - 185.46.199.255 ru +185.46.200.0 - 185.46.203.255 gb +185.46.204.0 - 185.46.207.255 pl +185.46.208.0 - 185.46.211.255 gb +185.46.212.0 - 185.46.212.255 nl +185.46.213.0 - 185.46.215.255 ch +185.46.216.0 - 185.46.219.255 ir +185.46.220.0 - 185.46.223.255 ua +185.46.224.0 - 185.46.227.255 no +185.46.228.0 - 185.46.231.255 fr +185.46.232.0 - 185.46.235.255 nl +185.46.236.0 - 185.46.239.255 ua +185.46.240.0 - 185.46.247.255 pl +185.46.248.0 - 185.46.251.255 ua +185.46.252.0 - 185.46.255.255 ie +185.47.0.0 - 185.47.3.255 nl +185.47.4.0 - 185.47.7.255 az +185.47.8.0 - 185.47.11.255 lv +185.47.12.0 - 185.47.19.255 es +185.47.20.0 - 185.47.23.255 nl +185.47.24.0 - 185.47.27.255 ch +185.47.28.0 - 185.47.31.255 be +185.47.32.0 - 185.47.35.255 es +185.47.36.0 - 185.47.39.255 ru +185.47.40.0 - 185.47.43.255 no +185.47.44.0 - 185.47.47.255 de +185.47.48.0 - 185.47.51.255 ir +185.47.52.0 - 185.47.55.255 ru +185.47.56.0 - 185.47.59.255 mk +185.47.60.0 - 185.47.63.255 nl +185.47.64.0 - 185.47.67.255 pl +185.47.68.0 - 185.47.71.255 be +185.47.72.0 - 185.47.75.255 gb +185.47.76.0 - 185.47.79.255 fi +185.47.80.0 - 185.47.83.255 fr +185.47.84.0 - 185.47.87.255 us +185.47.88.0 - 185.47.91.255 rs +185.47.92.0 - 185.47.95.255 lv +185.47.96.0 - 185.47.99.255 it +185.47.100.0 - 185.47.103.255 nl +185.47.104.0 - 185.47.107.255 gb +185.47.108.0 - 185.47.111.255 it +185.47.112.0 - 185.47.115.255 nl +185.47.116.0 - 185.47.119.255 gb +185.47.120.0 - 185.47.123.255 nl +185.47.124.0 - 185.47.127.255 de +185.47.128.0 - 185.47.131.255 es +185.47.132.0 - 185.47.135.255 nl +185.47.136.0 - 185.47.139.255 it +185.47.140.0 - 185.47.143.255 de +185.47.144.0 - 185.47.147.255 ie +185.47.148.0 - 185.47.151.255 be +185.47.152.0 - 185.47.152.255 by +185.47.153.0 - 185.47.159.255 ru +185.47.160.0 - 185.47.163.255 hu +185.47.164.0 - 185.47.167.255 se +185.47.168.0 - 185.47.171.255 nl +185.47.172.0 - 185.47.175.255 il +185.47.176.0 - 185.47.179.255 cz +185.47.180.0 - 185.47.183.255 iq +185.47.184.0 - 185.47.187.255 hu +185.47.188.0 - 185.47.191.255 al +185.47.192.0 - 185.47.195.255 se +185.47.196.0 - 185.47.203.255 nl +185.47.204.0 - 185.47.207.255 ru +185.47.208.0 - 185.47.211.255 rs +185.47.212.0 - 185.47.215.255 es +185.47.216.0 - 185.47.219.255 gb +185.47.220.0 - 185.47.223.255 cz +185.47.224.0 - 185.47.227.255 nl +185.47.228.0 - 185.47.231.255 it +185.47.232.0 - 185.47.235.255 de +185.47.236.0 - 185.47.239.255 nl +185.47.240.0 - 185.47.243.255 fr +185.47.244.0 - 185.47.247.255 es +185.47.248.0 - 185.47.251.255 no +185.47.252.0 - 185.47.255.255 fr +185.48.0.0 - 185.48.3.255 de +185.48.4.0 - 185.48.7.255 at +185.48.8.0 - 185.48.11.255 pl +185.48.12.0 - 185.48.15.255 be +185.48.16.0 - 185.48.19.255 ru +185.48.20.0 - 185.48.23.255 cz +185.48.24.0 - 185.48.27.255 tr +185.48.28.0 - 185.48.31.255 pl +185.48.32.0 - 185.48.35.255 it +185.48.36.0 - 185.48.39.255 ru +185.48.40.0 - 185.48.43.255 hu +185.48.44.0 - 185.48.51.255 fr +185.48.52.0 - 185.48.55.255 it +185.48.56.0 - 185.48.59.255 nl +185.48.60.0 - 185.48.63.255 je +185.48.64.0 - 185.48.67.255 ae +185.48.68.0 - 185.48.71.255 nl +185.48.72.0 - 185.48.75.255 ru +185.48.76.0 - 185.48.78.255 im +185.48.79.0 - 185.48.79.255 gb +185.48.80.0 - 185.48.83.255 se +185.48.84.0 - 185.48.91.255 es +185.48.92.0 - 185.48.95.255 de +185.48.96.0 - 185.48.99.255 it +185.48.100.0 - 185.48.103.255 nl +185.48.104.0 - 185.48.107.255 de +185.48.108.0 - 185.48.111.255 gb +185.48.112.0 - 185.48.115.255 ru +185.48.116.0 - 185.48.119.255 de +185.48.120.0 - 185.48.123.255 ie +185.48.124.0 - 185.48.127.255 kz +185.48.128.0 - 185.48.131.255 pl +185.48.132.0 - 185.48.135.255 fr +185.48.136.0 - 185.48.139.255 kg +185.48.140.0 - 185.48.143.255 it +185.48.144.0 - 185.48.147.255 ch +185.48.148.0 - 185.48.151.255 kz +185.48.152.0 - 185.48.155.255 dk +185.48.156.0 - 185.48.159.255 de +185.48.160.0 - 185.48.167.255 gb +185.48.168.0 - 185.48.171.255 pl +185.48.172.0 - 185.48.175.255 ba +185.48.176.0 - 185.48.179.255 pl +185.48.180.0 - 185.48.183.255 tr +185.48.184.0 - 185.48.187.255 ru +185.48.188.0 - 185.48.191.255 kw +185.48.192.0 - 185.48.195.255 es +185.48.196.0 - 185.48.199.255 ua +185.48.200.0 - 185.48.203.255 fr +185.48.204.0 - 185.48.211.255 de +185.48.212.0 - 185.48.215.255 tr +185.48.216.0 - 185.48.227.255 de +185.48.228.0 - 185.48.231.255 ch +185.48.232.0 - 185.48.235.255 pl +185.48.236.0 - 185.48.239.255 ru +185.48.240.0 - 185.48.243.255 am +185.48.244.0 - 185.48.247.255 de +185.48.248.0 - 185.48.251.255 sk +185.48.252.0 - 185.48.255.255 fr +185.49.0.0 - 185.49.3.255 si +185.49.4.0 - 185.49.7.255 no +185.49.8.0 - 185.49.11.255 it +185.49.12.0 - 185.49.15.255 pl +185.49.16.0 - 185.49.19.255 de +185.49.20.0 - 185.49.23.255 fr +185.49.24.0 - 185.49.27.255 al +185.49.28.0 - 185.49.31.255 pl +185.49.32.0 - 185.49.43.255 gb +185.49.44.0 - 185.49.47.255 tr +185.49.48.0 - 185.49.51.255 nl +185.49.52.0 - 185.49.55.255 at +185.49.56.0 - 185.49.59.255 it +185.49.60.0 - 185.49.63.255 ie +185.49.64.0 - 185.49.67.255 ru +185.49.68.0 - 185.49.71.255 de +185.49.72.0 - 185.49.75.255 gb +185.49.76.0 - 185.49.79.255 de +185.49.80.0 - 185.49.80.255 nl +185.49.81.0 - 185.49.81.127 gb +185.49.81.128 - 185.49.81.147 eu +185.49.81.148 - 185.49.81.148 gb +185.49.81.149 - 185.49.81.167 eu +185.49.81.168 - 185.49.81.168 gb +185.49.81.169 - 185.49.81.191 eu +185.49.81.192 - 185.49.81.255 gb +185.49.82.0 - 185.49.83.255 nl +185.49.84.0 - 185.49.87.255 ir +185.49.88.0 - 185.49.91.255 bg +185.49.92.0 - 185.49.95.255 gb +185.49.96.0 - 185.49.99.255 ir +185.49.100.0 - 185.49.103.255 de +185.49.104.0 - 185.49.107.255 ir +185.49.108.0 - 185.49.111.255 ru +185.49.112.0 - 185.49.115.255 gb +185.49.116.0 - 185.49.119.255 si +185.49.120.0 - 185.49.123.255 nl +185.49.124.0 - 185.49.127.255 gb +185.49.128.0 - 185.49.131.255 tr +185.49.132.0 - 185.49.135.255 se +185.49.136.0 - 185.49.139.255 de +185.49.140.0 - 185.49.147.255 nl +185.49.148.0 - 185.49.151.255 pl +185.49.152.0 - 185.49.155.255 ch +185.49.156.0 - 185.49.159.255 es +185.49.160.0 - 185.49.163.255 bh +185.49.164.0 - 185.49.167.255 ge +185.49.168.0 - 185.49.171.255 es +185.49.172.0 - 185.49.175.255 gb +185.49.176.0 - 185.49.179.255 at +185.49.180.0 - 185.49.183.255 be +185.49.184.0 - 185.49.187.255 es +185.49.188.0 - 185.49.191.255 cz +185.49.192.0 - 185.49.195.255 es +185.49.196.0 - 185.49.199.255 no +185.49.200.0 - 185.49.203.255 pl +185.49.204.0 - 185.49.207.255 it +185.49.208.0 - 185.49.211.255 fr +185.49.212.0 - 185.49.215.255 it +185.49.216.0 - 185.49.219.255 gb +185.49.220.0 - 185.49.223.255 ch +185.49.224.0 - 185.49.227.255 es +185.49.228.0 - 185.49.239.255 gb +185.49.240.0 - 185.49.243.255 ru +185.49.244.0 - 185.49.247.255 lu +185.49.248.0 - 185.49.251.255 it +185.49.252.0 - 185.49.255.255 dk +185.50.0.0 - 185.50.3.255 by +185.50.4.0 - 185.50.7.255 md +185.50.8.0 - 185.50.11.255 ru +185.50.12.0 - 185.50.15.255 hr +185.50.16.0 - 185.50.23.255 gb +185.50.24.0 - 185.50.27.255 ru +185.50.28.0 - 185.50.31.255 hu +185.50.32.0 - 185.50.35.255 fr +185.50.36.0 - 185.50.36.255 se +185.50.37.0 - 185.50.39.255 ir +185.50.40.0 - 185.50.43.255 se +185.50.44.0 - 185.50.47.255 es +185.50.48.0 - 185.50.51.255 pl +185.50.52.0 - 185.50.55.255 fr +185.50.56.0 - 185.50.59.255 ba +185.50.60.0 - 185.50.63.255 nl +185.50.64.0 - 185.50.67.255 fr +185.50.68.0 - 185.50.71.255 tr +185.50.72.0 - 185.50.79.255 fr +185.50.80.0 - 185.50.83.255 ru +185.50.84.0 - 185.50.87.255 be +185.50.88.0 - 185.50.91.255 fi +185.50.92.0 - 185.50.95.255 nl +185.50.96.0 - 185.50.99.255 ee +185.50.100.0 - 185.50.103.255 ie +185.50.104.0 - 185.50.107.255 br +185.50.108.0 - 185.50.111.255 it +185.50.112.0 - 185.50.115.255 fr +185.50.116.0 - 185.50.119.255 es +185.50.120.0 - 185.50.123.255 de +185.50.124.0 - 185.50.127.255 cz +185.50.128.0 - 185.50.131.255 fr +185.50.132.0 - 185.50.135.255 cy +185.50.136.0 - 185.50.139.255 ru +185.50.140.0 - 185.50.143.255 de +185.50.144.0 - 185.50.147.255 es +185.50.148.0 - 185.50.148.255 ua +185.50.149.0 - 185.50.149.255 cz +185.50.150.0 - 185.50.150.255 ru +185.50.151.0 - 185.50.151.255 sk +185.50.152.0 - 185.50.155.255 cz +185.50.156.0 - 185.50.159.255 ru +185.50.160.0 - 185.50.163.255 gb +185.50.164.0 - 185.50.167.255 pl +185.50.168.0 - 185.50.171.255 es +185.50.172.0 - 185.50.175.255 nl +185.50.176.0 - 185.50.179.255 es +185.50.180.0 - 185.50.183.255 al +185.50.184.0 - 185.50.187.255 rs +185.50.188.0 - 185.50.191.255 ch +185.50.192.0 - 185.50.195.255 de +185.50.196.0 - 185.50.199.255 es +185.50.200.0 - 185.50.203.255 ru +185.50.204.0 - 185.50.207.255 es +185.50.208.0 - 185.50.211.255 nl +185.50.212.0 - 185.50.215.255 sk +185.50.216.0 - 185.50.219.255 ru +185.50.220.0 - 185.50.227.255 ch +185.50.228.0 - 185.50.231.255 cz +185.50.232.0 - 185.50.235.255 at +185.50.236.0 - 185.50.239.255 ch +185.50.240.0 - 185.50.243.255 gb +185.50.244.0 - 185.50.247.255 fi +185.50.248.0 - 185.50.251.255 ua +185.50.252.0 - 185.50.255.255 fr +185.51.0.0 - 185.51.3.255 se +185.51.4.0 - 185.51.7.255 us +185.51.8.0 - 185.51.11.255 at +185.51.12.0 - 185.51.15.255 it +185.51.16.0 - 185.51.19.255 ge +185.51.20.0 - 185.51.23.255 ru +185.51.24.0 - 185.51.27.255 cy +185.51.28.0 - 185.51.31.255 cz +185.51.32.0 - 185.51.35.255 de +185.51.36.0 - 185.51.39.255 tr +185.51.40.0 - 185.51.43.255 ir +185.51.44.0 - 185.51.47.255 es +185.51.48.0 - 185.51.59.255 nl +185.51.60.0 - 185.51.63.255 ru +185.51.64.0 - 185.51.67.255 hu +185.51.68.0 - 185.51.71.255 ch +185.51.72.0 - 185.51.75.255 ie +185.51.76.0 - 185.51.79.255 dk +185.51.80.0 - 185.51.83.255 gb +185.51.84.0 - 185.51.87.255 de +185.51.88.0 - 185.51.91.255 pl +185.51.92.0 - 185.51.95.255 pt +185.51.96.0 - 185.51.99.255 pl +185.51.100.0 - 185.51.103.255 ge +185.51.104.0 - 185.51.107.255 ie +185.51.108.0 - 185.51.111.255 es +185.51.112.0 - 185.51.115.255 tr +185.51.116.0 - 185.51.119.255 pl +185.51.120.0 - 185.51.123.255 it +185.51.124.0 - 185.51.127.255 ru +185.51.128.0 - 185.51.131.255 at +185.51.132.0 - 185.51.135.255 gr +185.51.136.0 - 185.51.139.255 it +185.51.140.0 - 185.51.143.255 ru +185.51.144.0 - 185.51.144.53 fr +185.51.144.54 - 185.51.144.54 se +185.51.144.55 - 185.51.146.105 fr +185.51.146.106 - 185.51.146.106 se +185.51.146.107 - 185.51.147.255 fr +185.51.148.0 - 185.51.151.255 nl +185.51.152.0 - 185.51.155.255 ae +185.51.156.0 - 185.51.159.255 ru +185.51.160.0 - 185.51.163.255 es +185.51.164.0 - 185.51.167.255 tr +185.51.168.0 - 185.51.171.255 it +185.51.172.0 - 185.51.175.255 gb +185.51.176.0 - 185.51.179.255 fr +185.51.180.0 - 185.51.183.255 pl +185.51.184.0 - 185.51.187.255 de +185.51.188.0 - 185.51.191.255 hu +185.51.192.0 - 185.51.195.255 nl +185.51.196.0 - 185.51.199.255 at +185.51.200.0 - 185.51.203.255 ir +185.51.204.0 - 185.51.207.255 sa +185.51.208.0 - 185.51.211.255 ru +185.51.212.0 - 185.51.215.255 jo +185.51.216.0 - 185.51.219.255 fr +185.51.220.0 - 185.51.223.255 iq +185.51.224.0 - 185.51.227.255 se +185.51.228.0 - 185.51.231.255 cz +185.51.232.0 - 185.51.235.255 no +185.51.236.0 - 185.51.239.255 mt +185.51.240.0 - 185.51.243.255 cz +185.51.244.0 - 185.51.247.255 nl +185.51.248.0 - 185.51.251.255 cz +185.51.252.0 - 185.51.255.255 gb +185.52.0.0 - 185.52.7.255 nl +185.52.8.0 - 185.52.11.255 it +185.52.12.0 - 185.52.15.255 nl +185.52.16.0 - 185.52.19.255 es +185.52.20.0 - 185.52.23.255 at +185.52.24.0 - 185.52.27.255 gb +185.52.28.0 - 185.52.31.255 ru +185.52.32.0 - 185.52.35.255 fr +185.52.36.0 - 185.52.39.255 gb +185.52.40.0 - 185.52.43.255 no +185.52.44.0 - 185.52.47.255 fr +185.52.48.0 - 185.52.51.255 bg +185.52.52.0 - 185.52.55.255 nl +185.52.56.0 - 185.52.59.255 ru +185.52.60.0 - 185.52.63.255 nl +185.52.64.0 - 185.52.67.255 it +185.52.68.0 - 185.52.79.255 ru +185.52.80.0 - 185.52.83.255 ge +185.52.84.0 - 185.52.87.255 fr +185.52.88.0 - 185.52.91.255 cy +185.52.92.0 - 185.52.95.255 ie +185.52.96.0 - 185.52.99.255 cz +185.52.100.0 - 185.52.103.255 iq +185.52.104.0 - 185.52.107.255 nl +185.52.108.0 - 185.52.111.255 gb +185.52.112.0 - 185.52.115.255 it +185.52.116.0 - 185.52.119.255 iq +185.52.120.0 - 185.52.121.255 at +185.52.122.0 - 185.52.122.255 de +185.52.123.0 - 185.52.123.255 at +185.52.124.0 - 185.52.127.255 fr +185.52.128.0 - 185.52.131.255 az +185.52.132.0 - 185.52.135.255 ru +185.52.136.0 - 185.52.139.255 us +185.52.140.0 - 185.52.143.255 ru +185.52.144.0 - 185.52.151.255 gb +185.52.152.0 - 185.52.155.255 ru +185.52.156.0 - 185.52.159.255 se +185.52.160.0 - 185.52.163.255 de +185.52.164.0 - 185.52.167.255 fi +185.52.168.0 - 185.52.171.255 pl +185.52.172.0 - 185.52.175.255 cz +185.52.176.0 - 185.52.179.255 nl +185.52.180.0 - 185.52.183.255 se +185.52.184.0 - 185.52.191.255 at +185.52.192.0 - 185.52.195.255 pl +185.52.196.0 - 185.52.203.255 gb +185.52.204.0 - 185.52.207.255 bg +185.52.208.0 - 185.52.215.255 nl +185.52.216.0 - 185.52.219.255 it +185.52.220.0 - 185.52.223.255 gb +185.52.224.0 - 185.52.227.255 nl +185.52.228.0 - 185.52.231.255 tr +185.52.232.0 - 185.52.235.255 sy +185.52.236.0 - 185.52.239.255 nl +185.52.240.0 - 185.52.243.255 it +185.52.244.0 - 185.52.251.255 de +185.52.252.0 - 185.52.255.255 gb +185.53.0.0 - 185.53.3.255 it +185.53.4.0 - 185.53.7.255 cz +185.53.8.0 - 185.53.11.255 nl +185.53.12.0 - 185.53.15.255 si +185.53.16.0 - 185.53.19.255 gb +185.53.20.0 - 185.53.23.255 ru +185.53.24.0 - 185.53.27.255 fr +185.53.28.0 - 185.53.31.255 gb +185.53.32.0 - 185.53.35.255 ie +185.53.36.0 - 185.53.39.255 it +185.53.40.0 - 185.53.47.255 de +185.53.48.0 - 185.53.51.255 nl +185.53.52.0 - 185.53.55.255 ae +185.53.56.0 - 185.53.59.255 gb +185.53.60.0 - 185.53.63.255 tr +185.53.64.0 - 185.53.67.255 se +185.53.68.0 - 185.53.71.255 it +185.53.72.0 - 185.53.75.255 by +185.53.76.0 - 185.53.79.255 ua +185.53.80.0 - 185.53.83.255 fr +185.53.84.0 - 185.53.87.255 fi +185.53.88.0 - 185.53.91.255 nl +185.53.92.0 - 185.53.95.255 gb +185.53.96.0 - 185.53.99.255 pl +185.53.100.0 - 185.53.103.255 al +185.53.104.0 - 185.53.107.255 kg +185.53.108.0 - 185.53.111.255 at +185.53.112.0 - 185.53.115.255 rs +185.53.116.0 - 185.53.119.255 no +185.53.120.0 - 185.53.123.255 it +185.53.124.0 - 185.53.127.255 pl +185.53.128.0 - 185.53.131.255 nl +185.53.132.0 - 185.53.135.255 pl +185.53.136.0 - 185.53.139.255 fr +185.53.140.0 - 185.53.143.255 de +185.53.144.0 - 185.53.147.255 pl +185.53.148.0 - 185.53.151.255 it +185.53.152.0 - 185.53.155.255 pl +185.53.156.0 - 185.53.159.255 de +185.53.160.0 - 185.53.163.255 nl +185.53.164.0 - 185.53.167.255 se +185.53.168.0 - 185.53.171.255 de +185.53.172.0 - 185.53.175.255 gb +185.53.176.0 - 185.53.179.255 de +185.53.180.0 - 185.53.183.255 at +185.53.184.0 - 185.53.187.255 fr +185.53.188.0 - 185.53.191.255 no +185.53.192.0 - 185.53.195.255 it +185.53.196.0 - 185.53.203.255 ro +185.53.204.0 - 185.53.207.255 de +185.53.208.0 - 185.53.211.255 il +185.53.212.0 - 185.53.215.255 se +185.53.216.0 - 185.53.223.255 de +185.53.224.0 - 185.53.227.255 gb +185.53.228.0 - 185.53.231.255 kg +185.53.232.0 - 185.53.235.255 ru +185.53.236.0 - 185.53.236.15 ie +185.53.236.16 - 185.53.236.255 nl +185.53.237.0 - 185.53.237.255 gb +185.53.238.0 - 185.53.239.255 nl +185.53.240.0 - 185.53.243.255 om +185.53.244.0 - 185.53.247.255 sa +185.53.248.0 - 185.53.251.255 nl +185.53.252.0 - 185.53.255.255 it +185.54.0.0 - 185.54.3.255 es +185.54.4.0 - 185.54.7.255 ch +185.54.8.0 - 185.54.11.255 fr +185.54.12.0 - 185.54.15.255 lt +185.54.16.0 - 185.54.19.255 ae +185.54.20.0 - 185.54.23.255 ru +185.54.24.0 - 185.54.27.255 ge +185.54.28.0 - 185.54.31.255 no +185.54.32.0 - 185.54.35.255 it +185.54.36.0 - 185.54.39.255 fr +185.54.40.0 - 185.54.43.255 ru +185.54.44.0 - 185.54.47.255 nl +185.54.48.0 - 185.54.51.255 ru +185.54.52.0 - 185.54.59.255 pl +185.54.60.0 - 185.54.63.255 lb +185.54.64.0 - 185.54.67.255 gb +185.54.68.0 - 185.54.71.255 de +185.54.72.0 - 185.54.75.255 gb +185.54.76.0 - 185.54.79.255 de +185.54.80.0 - 185.54.83.255 ch +185.54.84.0 - 185.54.87.255 gb +185.54.88.0 - 185.54.91.255 tr +185.54.92.0 - 185.54.95.255 nl +185.54.96.0 - 185.54.99.255 lb +185.54.100.0 - 185.54.103.255 pl +185.54.104.0 - 185.54.107.255 ie +185.54.108.0 - 185.54.111.255 de +185.54.112.0 - 185.54.115.255 nl +185.54.116.0 - 185.54.123.255 de +185.54.124.0 - 185.54.127.255 gb +185.54.128.0 - 185.54.131.255 si +185.54.132.0 - 185.54.135.255 sy +185.54.136.0 - 185.54.139.255 ru +185.54.140.0 - 185.54.143.255 nl +185.54.144.0 - 185.54.147.255 at +185.54.148.0 - 185.54.151.255 de +185.54.152.0 - 185.54.155.255 it +185.54.156.0 - 185.54.159.255 iq +185.54.160.0 - 185.54.161.255 cy +185.54.162.0 - 185.54.162.255 nl +185.54.163.0 - 185.54.163.255 be +185.54.164.0 - 185.54.167.255 iq +185.54.168.0 - 185.54.171.255 gb +185.54.172.0 - 185.54.175.255 ch +185.54.176.0 - 185.54.179.255 ru +185.54.180.0 - 185.54.183.255 nl +185.54.184.0 - 185.54.187.255 pl +185.54.188.0 - 185.54.191.255 de +185.54.192.0 - 185.54.195.255 es +185.54.196.0 - 185.54.199.255 se +185.54.200.0 - 185.54.203.255 gb +185.54.204.0 - 185.54.207.255 nl +185.54.208.0 - 185.54.211.255 at +185.54.212.0 - 185.54.215.255 it +185.54.216.0 - 185.54.219.255 nl +185.54.220.0 - 185.54.223.255 eu +185.54.224.0 - 185.54.227.255 ie +185.54.228.0 - 185.54.231.255 nl +185.54.232.0 - 185.54.235.255 de +185.54.236.0 - 185.54.239.255 ru +185.54.240.0 - 185.54.243.255 de +185.54.244.0 - 185.54.247.255 ru +185.54.248.0 - 185.54.251.255 be +185.54.252.0 - 185.54.255.255 kg +185.55.0.0 - 185.55.3.255 ru +185.55.4.0 - 185.55.7.255 ro +185.55.8.0 - 185.55.11.255 se +185.55.12.0 - 185.55.15.255 hu +185.55.16.0 - 185.55.19.255 gb +185.55.20.0 - 185.55.23.255 nl +185.55.24.0 - 185.55.27.255 at +185.55.28.0 - 185.55.31.255 gr +185.55.32.0 - 185.55.35.255 fi +185.55.36.0 - 185.55.39.255 az +185.55.40.0 - 185.55.43.255 ru +185.55.44.0 - 185.55.47.255 al +185.55.48.0 - 185.55.51.255 ee +185.55.52.0 - 185.55.55.255 nl +185.55.56.0 - 185.55.59.255 es +185.55.60.0 - 185.55.63.255 gb +185.55.64.0 - 185.55.67.255 pl +185.55.68.0 - 185.55.75.255 de +185.55.76.0 - 185.55.79.255 gb +185.55.80.0 - 185.55.83.255 it +185.55.84.0 - 185.55.87.255 fi +185.55.88.0 - 185.55.91.255 it +185.55.92.0 - 185.55.95.255 be +185.55.96.0 - 185.55.99.255 fr +185.55.100.0 - 185.55.103.255 de +185.55.104.0 - 185.55.107.255 no +185.55.108.0 - 185.55.115.255 nl +185.55.116.0 - 185.55.127.255 de +185.55.128.0 - 185.55.131.255 nl +185.55.132.0 - 185.55.135.255 gb +185.55.136.0 - 185.55.139.255 nl +185.55.140.0 - 185.55.143.255 ro +185.55.144.0 - 185.55.147.255 fr +185.55.148.0 - 185.55.151.255 al +185.55.152.0 - 185.55.155.255 de +185.55.156.0 - 185.55.159.255 ch +185.55.160.0 - 185.55.163.255 gb +185.55.164.0 - 185.55.167.255 fr +185.55.168.0 - 185.55.171.255 it +185.55.172.0 - 185.55.175.255 ru +185.55.176.0 - 185.55.179.255 fi +185.55.180.0 - 185.55.183.255 de +185.55.184.0 - 185.55.187.255 iq +185.55.188.0 - 185.55.191.255 gb +185.55.192.0 - 185.55.195.255 de +185.55.196.0 - 185.55.199.255 dk +185.55.200.0 - 185.55.207.255 ie +185.55.208.0 - 185.55.211.255 a1 +185.55.212.0 - 185.55.215.255 it +185.55.216.0 - 185.55.219.255 es +185.55.220.0 - 185.55.223.255 de +185.55.224.0 - 185.55.227.255 ir +185.55.228.0 - 185.55.231.255 bg +185.55.232.0 - 185.55.235.255 de +185.55.236.0 - 185.55.239.255 at +185.55.240.0 - 185.55.243.255 de +185.55.244.0 - 185.55.247.255 fr +185.55.248.0 - 185.55.251.255 es +185.55.252.0 - 185.55.255.255 gb +185.56.0.0 - 185.56.3.255 it +185.56.4.0 - 185.56.7.255 gb +185.56.8.0 - 185.56.11.255 it +185.56.12.0 - 185.56.15.255 is +185.56.16.0 - 185.56.19.255 ua +185.56.20.0 - 185.56.23.255 gb +185.56.24.0 - 185.56.27.255 ch +185.56.28.0 - 185.56.35.255 nl +185.56.36.0 - 185.56.39.255 pl +185.56.40.0 - 185.56.47.255 gb +185.56.48.0 - 185.56.51.255 fr +185.56.52.0 - 185.56.55.255 nl +185.56.56.0 - 185.56.59.255 dk +185.56.60.0 - 185.56.63.255 nl +185.56.64.0 - 185.56.71.255 gb +185.56.72.0 - 185.56.75.255 il +185.56.76.0 - 185.56.79.255 es +185.56.80.0 - 185.56.83.255 nl +185.56.84.0 - 185.56.85.29 bg +185.56.85.30 - 185.56.85.30 us +185.56.85.31 - 185.56.87.255 bg +185.56.88.0 - 185.56.91.255 ae +185.56.92.0 - 185.56.99.255 ir +185.56.100.0 - 185.56.103.255 dk +185.56.104.0 - 185.56.107.255 de +185.56.108.0 - 185.56.111.255 es +185.56.112.0 - 185.56.115.255 de +185.56.116.0 - 185.56.119.255 ru +185.56.120.0 - 185.56.123.255 it +185.56.124.0 - 185.56.127.255 at +185.56.128.0 - 185.56.135.255 de +185.56.136.0 - 185.56.136.100 mt +185.56.136.101 - 185.56.136.101 nl +185.56.136.102 - 185.56.136.252 mt +185.56.136.253 - 185.56.136.254 nl +185.56.136.255 - 185.56.137.7 mt +185.56.137.8 - 185.56.137.8 nl +185.56.137.9 - 185.56.137.9 mt +185.56.137.10 - 185.56.137.10 nl +185.56.137.11 - 185.56.139.255 mt +185.56.140.0 - 185.56.143.255 a2 +185.56.144.0 - 185.56.147.255 nl +185.56.148.0 - 185.56.151.255 de +185.56.152.0 - 185.56.155.255 fr +185.56.156.0 - 185.56.159.255 it +185.56.160.0 - 185.56.160.255 fr +185.56.161.0 - 185.56.161.63 de +185.56.161.64 - 185.56.161.95 bs +185.56.161.96 - 185.56.161.127 vg +185.56.161.128 - 185.56.161.239 nl +185.56.161.240 - 185.56.161.255 ua +185.56.162.0 - 185.56.162.15 cl +185.56.162.16 - 185.56.162.31 es +185.56.162.32 - 185.56.162.47 ro +185.56.162.48 - 185.56.162.63 in +185.56.162.64 - 185.56.162.255 nl +185.56.163.0 - 185.56.163.15 pe +185.56.163.16 - 185.56.163.31 pk +185.56.163.32 - 185.56.163.47 fj +185.56.163.48 - 185.56.163.79 pa +185.56.163.80 - 185.56.163.95 be +185.56.163.96 - 185.56.163.111 il +185.56.163.112 - 185.56.163.127 cn +185.56.163.128 - 185.56.163.143 br +185.56.163.144 - 185.56.163.159 kp +185.56.163.160 - 185.56.163.175 hk +185.56.163.176 - 185.56.163.191 is +185.56.163.192 - 185.56.163.207 us +185.56.163.208 - 185.56.163.223 pl +185.56.163.224 - 185.56.163.255 fr +185.56.164.0 - 185.56.167.255 dk +185.56.168.0 - 185.56.171.255 it +185.56.172.0 - 185.56.175.255 pl +185.56.176.0 - 185.56.179.255 fr +185.56.180.0 - 185.56.183.255 es +185.56.184.0 - 185.56.187.255 no +185.56.188.0 - 185.56.191.255 pl +185.56.192.0 - 185.56.195.255 iq +185.56.196.0 - 185.56.199.255 sa +185.56.200.0 - 185.56.203.255 gb +185.56.204.0 - 185.56.207.255 fr +185.56.208.0 - 185.56.211.255 pl +185.56.212.0 - 185.56.215.255 se +185.56.216.0 - 185.56.219.255 it +185.56.220.0 - 185.56.221.255 rs +185.56.222.0 - 185.56.223.255 si +185.56.224.0 - 185.56.227.255 nl +185.56.228.0 - 185.56.231.255 de +185.56.232.0 - 185.56.235.255 us +185.56.236.0 - 185.56.239.255 tr +185.56.240.0 - 185.56.243.255 fr +185.56.244.0 - 185.56.247.255 pl +185.56.248.0 - 185.56.251.255 mk +185.56.252.0 - 185.56.255.255 mt +185.57.0.0 - 185.57.3.255 de +185.57.4.0 - 185.57.7.255 se +185.57.8.0 - 185.57.11.255 nl +185.57.12.0 - 185.57.15.255 fr +185.57.16.0 - 185.57.19.255 si +185.57.20.0 - 185.57.23.255 it +185.57.24.0 - 185.57.27.255 de +185.57.28.0 - 185.57.31.255 ru +185.57.32.0 - 185.57.43.255 gb +185.57.44.0 - 185.57.47.255 md +185.57.48.0 - 185.57.51.255 at +185.57.52.0 - 185.57.55.255 fr +185.57.56.0 - 185.57.63.255 nl +185.57.64.0 - 185.57.67.255 tr +185.57.68.0 - 185.57.71.255 am +185.57.72.0 - 185.57.75.255 kz +185.57.76.0 - 185.57.79.255 gb +185.57.80.0 - 185.57.83.255 ro +185.57.84.0 - 185.57.87.255 se +185.57.88.0 - 185.57.91.255 de +185.57.92.0 - 185.57.95.255 gb +185.57.96.0 - 185.57.99.255 nl +185.57.100.0 - 185.57.103.255 gb +185.57.104.0 - 185.57.107.255 se +185.57.108.0 - 185.57.111.255 it +185.57.112.0 - 185.57.119.255 ie +185.57.120.0 - 185.57.123.255 jo +185.57.124.0 - 185.57.127.255 fr +185.57.128.0 - 185.57.131.255 be +185.57.132.0 - 185.57.135.255 ir +185.57.136.0 - 185.57.139.255 se +185.57.140.0 - 185.57.143.255 nl +185.57.144.0 - 185.57.147.255 si +185.57.148.0 - 185.57.151.255 fr +185.57.152.0 - 185.57.159.255 gb +185.57.160.0 - 185.57.163.255 gl +185.57.164.0 - 185.57.167.255 ir +185.57.168.0 - 185.57.171.255 se +185.57.172.0 - 185.57.175.255 nl +185.57.176.0 - 185.57.179.255 at +185.57.180.0 - 185.57.183.255 fi +185.57.184.0 - 185.57.187.255 de +185.57.188.0 - 185.57.191.255 gb +185.57.192.0 - 185.57.199.255 es +185.57.200.0 - 185.57.203.255 ir +185.57.204.0 - 185.57.207.255 es +185.57.208.0 - 185.57.211.255 it +185.57.212.0 - 185.57.215.255 je +185.57.216.0 - 185.57.219.255 de +185.57.220.0 - 185.57.223.255 fr +185.57.224.0 - 185.57.227.255 si +185.57.228.0 - 185.57.229.255 cz +185.57.230.0 - 185.57.231.255 ru +185.57.232.0 - 185.57.235.255 it +185.57.236.0 - 185.57.239.255 ru +185.57.240.0 - 185.57.243.255 de +185.57.244.0 - 185.57.247.255 tr +185.57.248.0 - 185.57.251.255 ru +185.57.252.0 - 185.57.255.255 no +185.58.0.0 - 185.58.3.255 de +185.58.4.0 - 185.58.7.255 it +185.58.8.0 - 185.58.11.255 fr +185.58.12.0 - 185.58.15.255 iq +185.58.16.0 - 185.58.19.255 ie +185.58.20.0 - 185.58.23.255 bg +185.58.24.0 - 185.58.27.255 gb +185.58.28.0 - 185.58.31.255 de +185.58.32.0 - 185.58.35.255 fi +185.58.36.0 - 185.58.39.255 de +185.58.40.0 - 185.58.43.255 cz +185.58.44.0 - 185.58.47.255 it +185.58.48.0 - 185.58.51.255 pl +185.58.52.0 - 185.58.55.255 at +185.58.56.0 - 185.58.59.255 nl +185.58.60.0 - 185.58.63.255 dk +185.58.64.0 - 185.58.67.255 lt +185.58.68.0 - 185.58.71.255 no +185.58.72.0 - 185.58.75.255 hr +185.58.76.0 - 185.58.79.255 se +185.58.80.0 - 185.58.83.255 pt +185.58.84.0 - 185.58.91.255 gb +185.58.92.0 - 185.58.95.255 ba +185.58.96.0 - 185.58.99.255 be +185.58.100.0 - 185.58.103.255 sk +185.58.104.0 - 185.58.107.255 it +185.58.108.0 - 185.58.111.255 de +185.58.112.0 - 185.58.115.255 ru +185.58.116.0 - 185.58.123.255 it +185.58.124.0 - 185.58.127.255 ru +185.58.128.0 - 185.58.131.255 ch +185.58.132.0 - 185.58.135.255 it +185.58.136.0 - 185.58.139.255 no +185.58.140.0 - 185.58.143.255 jp +185.58.144.0 - 185.58.147.255 se +185.58.148.0 - 185.58.151.255 nl +185.58.152.0 - 185.58.155.255 ru +185.58.156.0 - 185.58.159.255 de +185.58.160.0 - 185.58.163.255 pl +185.58.164.0 - 185.58.167.255 gb +185.58.168.0 - 185.58.171.255 de +185.58.172.0 - 185.58.175.255 es +185.58.176.0 - 185.58.179.255 gb +185.58.180.0 - 185.58.183.255 si +185.58.184.0 - 185.58.187.255 fr +185.58.188.0 - 185.58.191.255 ru +185.58.192.0 - 185.58.195.255 it +185.58.196.0 - 185.58.199.255 es +185.58.200.0 - 185.58.203.255 lb +185.58.204.0 - 185.58.207.255 ru +185.58.208.0 - 185.58.211.255 es +185.58.212.0 - 185.58.215.255 dk +185.58.216.0 - 185.58.223.255 ru +185.58.224.0 - 185.58.227.255 gb +185.58.228.0 - 185.58.231.255 fr +185.58.232.0 - 185.58.235.255 ie +185.58.236.0 - 185.58.239.255 nl +185.58.240.0 - 185.58.243.255 ir +185.58.244.0 - 185.58.247.255 tr +185.58.248.0 - 185.58.255.255 ru +185.59.0.0 - 185.59.3.255 cz +185.59.4.0 - 185.59.7.255 pl +185.59.8.0 - 185.59.11.255 fr +185.59.12.0 - 185.59.15.255 de +185.59.16.0 - 185.59.19.255 be +185.59.20.0 - 185.59.23.255 it +185.59.24.0 - 185.59.27.255 si +185.59.28.0 - 185.59.31.255 tr +185.59.32.0 - 185.59.35.255 ee +185.59.36.0 - 185.59.39.255 nl +185.59.40.0 - 185.59.43.255 fr +185.59.44.0 - 185.59.47.255 tr +185.59.48.0 - 185.59.51.255 es +185.59.52.0 - 185.59.55.255 ch +185.59.56.0 - 185.59.59.255 ru +185.59.60.0 - 185.59.63.255 gb +185.59.64.0 - 185.59.67.255 es +185.59.68.0 - 185.59.71.255 am +185.59.72.0 - 185.59.75.255 tr +185.59.76.0 - 185.59.79.255 nl +185.59.80.0 - 185.59.83.255 it +185.59.84.0 - 185.59.87.255 ae +185.59.88.0 - 185.59.91.255 pl +185.59.92.0 - 185.59.95.255 gb +185.59.96.0 - 185.59.103.255 de +185.59.104.0 - 185.59.107.255 dk +185.59.108.0 - 185.59.111.255 pl +185.59.112.0 - 185.59.115.255 ir +185.59.116.0 - 185.59.119.255 fi +185.59.120.0 - 185.59.123.255 cz +185.59.124.0 - 185.59.127.255 gb +185.59.128.0 - 185.59.131.255 de +185.59.132.0 - 185.59.135.255 it +185.59.136.0 - 185.59.143.255 ru +185.59.144.0 - 185.59.147.255 cz +185.59.148.0 - 185.59.151.255 gb +185.59.152.0 - 185.59.155.255 it +185.59.156.0 - 185.59.159.255 ua +185.59.160.0 - 185.59.163.255 pl +185.59.164.0 - 185.59.167.255 it +185.59.168.0 - 185.59.171.255 be +185.59.172.0 - 185.59.175.255 ru +185.59.176.0 - 185.59.183.255 gb +185.59.184.0 - 185.59.187.255 sk +185.59.188.0 - 185.59.191.255 sa +185.59.192.0 - 185.59.195.255 ru +185.59.196.0 - 185.59.199.255 be +185.59.200.0 - 185.59.203.255 de +185.59.204.0 - 185.59.207.255 gb +185.59.208.0 - 185.59.211.255 cz +185.59.212.0 - 185.59.215.255 no +185.59.216.0 - 185.59.219.255 ru +185.59.220.0 - 185.59.220.255 de +185.59.221.0 - 185.59.221.255 gb +185.59.222.0 - 185.59.222.255 nl +185.59.223.0 - 185.59.223.255 us +185.59.224.0 - 185.59.227.255 pl +185.59.228.0 - 185.59.231.255 dk +185.59.232.0 - 185.59.235.255 ru +185.59.236.0 - 185.59.239.255 no +185.59.240.0 - 185.59.243.255 ro +185.59.244.0 - 185.59.247.255 ru +185.59.248.0 - 185.59.251.255 de +185.59.252.0 - 185.59.255.255 lv +185.60.0.0 - 185.60.3.255 de +185.60.4.0 - 185.60.7.255 gb +185.60.8.0 - 185.60.11.255 fr +185.60.12.0 - 185.60.15.255 ru +185.60.16.0 - 185.60.23.255 de +185.60.24.0 - 185.60.27.255 fr +185.60.28.0 - 185.60.31.255 gb +185.60.32.0 - 185.60.35.255 ir +185.60.36.0 - 185.60.39.255 de +185.60.40.0 - 185.60.43.255 es +185.60.44.0 - 185.60.51.255 ru +185.60.52.0 - 185.60.55.255 ch +185.60.56.0 - 185.60.59.255 de +185.60.60.0 - 185.60.63.255 nl +185.60.64.0 - 185.60.67.255 bg +185.60.68.0 - 185.60.71.255 hu +185.60.72.0 - 185.60.79.255 de +185.60.80.0 - 185.60.80.255 gb +185.60.81.0 - 185.60.83.255 nl +185.60.84.0 - 185.60.84.255 de +185.60.85.0 - 185.60.85.255 dk +185.60.86.0 - 185.60.86.255 ro +185.60.87.0 - 185.60.87.255 pl +185.60.88.0 - 185.60.91.255 im +185.60.92.0 - 185.60.95.255 fr +185.60.96.0 - 185.60.99.255 de +185.60.100.0 - 185.60.103.255 hu +185.60.104.0 - 185.60.107.255 cz +185.60.108.0 - 185.60.115.255 fr +185.60.116.0 - 185.60.119.255 si +185.60.120.0 - 185.60.123.255 gb +185.60.124.0 - 185.60.127.255 ie +185.60.128.0 - 185.60.131.255 se +185.60.132.0 - 185.60.135.255 ru +185.60.136.0 - 185.60.139.255 ir +185.60.140.0 - 185.60.143.255 it +185.60.144.0 - 185.60.147.255 ch +185.60.148.0 - 185.60.151.255 fr +185.60.152.0 - 185.60.155.255 ru +185.60.156.0 - 185.60.159.255 nl +185.60.160.0 - 185.60.163.255 dk +185.60.164.0 - 185.60.167.255 fr +185.60.168.0 - 185.60.171.255 il +185.60.172.0 - 185.60.175.255 no +185.60.176.0 - 185.60.179.255 fr +185.60.180.0 - 185.60.183.255 ch +185.60.184.0 - 185.60.187.255 pl +185.60.188.0 - 185.60.195.255 it +185.60.196.0 - 185.60.199.255 de +185.60.200.0 - 185.60.203.255 ae +185.60.204.0 - 185.60.207.255 dk +185.60.208.0 - 185.60.211.255 de +185.60.212.0 - 185.60.215.255 ru +185.60.216.0 - 185.60.219.255 ie +185.60.220.0 - 185.60.223.255 gb +185.60.224.0 - 185.60.227.255 tr +185.60.228.0 - 185.60.231.255 pl +185.60.232.0 - 185.60.235.255 fr +185.60.236.0 - 185.60.239.255 cy +185.60.240.0 - 185.60.243.255 it +185.60.244.0 - 185.60.247.255 pl +185.60.248.0 - 185.60.251.255 de +185.60.252.0 - 185.60.255.255 nl +185.61.0.0 - 185.61.3.255 ie +185.61.4.0 - 185.61.7.255 pl +185.61.8.0 - 185.61.11.255 de +185.61.12.0 - 185.61.15.255 it +185.61.16.0 - 185.61.19.255 sk +185.61.20.0 - 185.61.23.255 ps +185.61.24.0 - 185.61.27.255 ru +185.61.28.0 - 185.61.35.255 de +185.61.36.0 - 185.61.39.255 ru +185.61.40.0 - 185.61.43.255 at +185.61.44.0 - 185.61.47.255 tr +185.61.48.0 - 185.61.51.255 lb +185.61.52.0 - 185.61.55.255 nl +185.61.56.0 - 185.61.59.255 rs +185.61.60.0 - 185.61.63.255 ie +185.61.64.0 - 185.61.67.255 lt +185.61.68.0 - 185.61.71.255 nl +185.61.72.0 - 185.61.75.255 be +185.61.76.0 - 185.61.79.255 ru +185.61.80.0 - 185.61.83.255 es +185.61.84.0 - 185.61.87.255 cz +185.61.88.0 - 185.61.91.255 gb +185.61.92.0 - 185.61.95.255 ru +185.61.96.0 - 185.61.99.255 gb +185.61.100.0 - 185.61.103.255 de +185.61.104.0 - 185.61.107.255 by +185.61.108.0 - 185.61.111.255 se +185.61.112.0 - 185.61.115.255 gb +185.61.116.0 - 185.61.119.255 fr +185.61.120.0 - 185.61.123.255 de +185.61.124.0 - 185.61.127.255 es +185.61.128.0 - 185.61.131.255 ru +185.61.132.0 - 185.61.135.255 gb +185.61.136.0 - 185.61.139.255 ua +185.61.140.0 - 185.61.143.255 gb +185.61.144.0 - 185.61.147.255 fr +185.61.148.0 - 185.61.149.255 lv +185.61.150.0 - 185.61.151.255 se +185.61.152.0 - 185.61.155.255 gb +185.61.156.0 - 185.61.159.255 ua +185.61.160.0 - 185.61.163.255 fr +185.61.164.0 - 185.61.167.255 gb +185.61.168.0 - 185.61.171.255 it +185.61.172.0 - 185.61.175.255 ru +185.61.176.0 - 185.61.179.255 fr +185.61.180.0 - 185.61.183.255 it +185.61.184.0 - 185.61.191.255 fr +185.61.192.0 - 185.61.195.255 ru +185.61.196.0 - 185.61.199.255 nl +185.61.200.0 - 185.61.203.255 ps +185.61.204.0 - 185.61.207.255 es +185.61.208.0 - 185.61.215.255 gb +185.61.216.0 - 185.61.223.255 ru +185.61.224.0 - 185.61.227.255 nl +185.61.228.0 - 185.61.231.255 cz +185.61.232.0 - 185.61.235.255 fi +185.61.236.0 - 185.61.239.255 se +185.61.240.0 - 185.61.243.255 cy +185.61.244.0 - 185.61.247.255 pl +185.61.248.0 - 185.61.251.255 eu +185.61.252.0 - 185.61.255.255 ru +185.62.0.0 - 185.62.3.255 it +185.62.4.0 - 185.62.7.255 be +185.62.8.0 - 185.62.11.255 cz +185.62.12.0 - 185.62.19.255 nl +185.62.20.0 - 185.62.23.255 es +185.62.24.0 - 185.62.27.255 de +185.62.28.0 - 185.62.31.255 it +185.62.32.0 - 185.62.35.255 sm +185.62.36.0 - 185.62.39.255 mt +185.62.40.0 - 185.62.43.255 fr +185.62.44.0 - 185.62.47.255 gb +185.62.48.0 - 185.62.55.255 it +185.62.56.0 - 185.62.59.255 nl +185.62.60.0 - 185.62.63.255 is +185.62.64.0 - 185.62.67.255 de +185.62.68.0 - 185.62.71.255 nl +185.62.72.0 - 185.62.75.255 hr +185.62.76.0 - 185.62.79.255 gb +185.62.80.0 - 185.62.83.255 ch +185.62.84.0 - 185.62.87.255 gb +185.62.88.0 - 185.62.91.255 de +185.62.92.0 - 185.62.95.255 pl +185.62.96.0 - 185.62.99.255 lv +185.62.100.0 - 185.62.103.255 ru +185.62.104.0 - 185.62.107.255 ch +185.62.108.0 - 185.62.111.255 cz +185.62.112.0 - 185.62.115.255 rs +185.62.116.0 - 185.62.116.255 gb +185.62.117.0 - 185.62.119.255 nl +185.62.120.0 - 185.62.123.255 il +185.62.124.0 - 185.62.127.255 de +185.62.128.0 - 185.62.131.255 hu +185.62.132.0 - 185.62.135.255 rs +185.62.136.0 - 185.62.139.255 us +185.62.140.0 - 185.62.143.255 no +185.62.144.0 - 185.62.151.255 de +185.62.152.0 - 185.62.155.255 bg +185.62.156.0 - 185.62.159.255 gb +185.62.160.0 - 185.62.163.255 no +185.62.164.0 - 185.62.167.255 ie +185.62.168.0 - 185.62.171.255 ch +185.62.172.0 - 185.62.175.255 al +185.62.176.0 - 185.62.179.255 sa +185.62.180.0 - 185.62.183.255 pl +185.62.184.0 - 185.62.187.255 fr +185.62.188.0 - 185.62.191.255 nl +185.62.192.0 - 185.62.195.255 ru +185.62.196.0 - 185.62.199.255 lv +185.62.200.0 - 185.62.203.255 ru +185.62.204.0 - 185.62.207.255 se +185.62.208.0 - 185.62.211.255 nl +185.62.212.0 - 185.62.219.255 gb +185.62.220.0 - 185.62.231.255 fr +185.62.232.0 - 185.62.235.255 ir +185.62.236.0 - 185.62.239.255 bg +185.62.240.0 - 185.62.243.255 it +185.62.244.0 - 185.62.247.255 de +185.62.248.0 - 185.62.251.255 it +185.62.252.0 - 185.62.255.255 se +185.63.0.0 - 185.63.3.255 at +185.63.4.0 - 185.63.7.255 ro +185.63.8.0 - 185.63.11.255 de +185.63.12.0 - 185.63.15.255 it +185.63.16.0 - 185.63.19.255 hu +185.63.20.0 - 185.63.23.255 nl +185.63.24.0 - 185.63.27.255 cz +185.63.28.0 - 185.63.31.255 es +185.63.32.0 - 185.63.35.255 ua +185.63.36.0 - 185.63.39.255 ch +185.63.40.0 - 185.63.43.255 it +185.63.44.0 - 185.63.47.255 hu +185.63.48.0 - 185.63.51.255 fr +185.63.52.0 - 185.63.55.255 it +185.63.56.0 - 185.63.59.255 nl +185.63.60.0 - 185.63.63.255 ru +185.63.64.0 - 185.63.67.255 ch +185.63.68.0 - 185.63.71.255 nl +185.63.72.0 - 185.63.72.255 se +185.63.73.0 - 185.63.79.255 mt +185.63.80.0 - 185.63.83.255 gb +185.63.84.0 - 185.63.87.255 pl +185.63.88.0 - 185.63.91.255 it +185.63.92.0 - 185.63.95.255 fr +185.63.96.0 - 185.63.99.255 cz +185.63.100.0 - 185.63.103.255 it +185.63.104.0 - 185.63.107.255 cz +185.63.108.0 - 185.63.111.255 pl +185.63.112.0 - 185.63.115.255 ru +185.63.116.0 - 185.63.119.255 nl +185.63.120.0 - 185.63.123.255 fr +185.63.124.0 - 185.63.131.255 de +185.63.132.0 - 185.63.135.255 it +185.63.136.0 - 185.63.139.255 ro +185.63.140.0 - 185.63.143.255 gb +185.63.144.0 - 185.63.147.255 us +185.63.148.0 - 185.63.151.255 ch +185.63.152.0 - 185.63.155.255 nl +185.63.156.0 - 185.63.159.255 sk +185.63.160.0 - 185.63.163.255 it +185.63.164.0 - 185.63.167.255 nl +185.63.168.0 - 185.63.171.255 it +185.63.172.0 - 185.63.175.255 fr +185.63.176.0 - 185.63.179.255 al +185.63.180.0 - 185.63.183.255 pt +185.63.184.0 - 185.63.187.255 im +185.63.188.0 - 185.63.191.255 ru +185.63.192.0 - 185.63.195.255 fr +185.63.196.0 - 185.63.199.255 ru +185.63.200.0 - 185.63.203.255 pl +185.63.204.0 - 185.63.207.255 de +185.63.208.0 - 185.63.211.255 no +185.63.212.0 - 185.63.215.255 de +185.63.216.0 - 185.63.219.255 ru +185.63.220.0 - 185.63.223.255 gb +185.63.224.0 - 185.63.227.255 uz +185.63.228.0 - 185.63.231.255 it +185.63.232.0 - 185.63.235.255 sa +185.63.236.0 - 185.63.239.255 ir +185.63.244.0 - 185.63.247.255 nl +185.63.248.0 - 185.63.251.255 at +185.63.252.0 - 185.63.255.255 nl +185.64.0.0 - 185.64.3.255 me +185.64.4.0 - 185.64.7.255 be +185.64.8.0 - 185.64.11.255 il +185.64.12.0 - 185.64.15.255 gb +185.64.16.0 - 185.64.19.255 ie +185.64.20.0 - 185.64.23.255 bg +185.64.24.0 - 185.64.27.255 om +185.64.28.0 - 185.64.31.255 pl +185.64.32.0 - 185.64.35.255 nl +185.64.36.0 - 185.64.39.255 gb +185.64.40.0 - 185.64.43.255 cz +185.64.44.0 - 185.64.47.255 ru +185.64.48.0 - 185.64.51.255 at +185.64.52.0 - 185.64.55.255 ru +185.64.56.0 - 185.64.59.255 ro +185.64.60.0 - 185.64.63.255 at +185.64.64.0 - 185.64.67.255 be +185.64.68.0 - 185.64.71.255 it +185.64.72.0 - 185.64.75.255 se +185.64.76.0 - 185.64.79.255 ae +185.64.80.0 - 185.64.83.255 tr +185.64.84.0 - 185.64.87.255 mk +185.64.88.0 - 185.64.91.255 gb +185.64.92.0 - 185.64.95.255 ro +185.64.96.0 - 185.64.99.255 de +185.64.100.0 - 185.64.103.255 ru +185.64.104.0 - 185.64.107.254 us +185.64.107.255 - 185.64.107.255 lt +185.64.108.0 - 185.64.111.255 nl +185.64.112.0 - 185.64.115.255 de +185.64.116.0 - 185.64.119.255 ch +185.64.120.0 - 185.64.123.255 nl +185.64.124.0 - 185.64.127.255 de +185.64.128.0 - 185.64.131.255 fr +185.64.132.0 - 185.64.135.255 hr +185.64.136.0 - 185.64.139.255 nl +185.64.140.0 - 185.64.140.255 gb +185.64.141.0 - 185.64.141.255 nl +185.64.142.0 - 185.64.143.255 ie +185.64.144.0 - 185.64.147.255 de +185.64.148.0 - 185.64.151.255 fr +185.64.152.0 - 185.64.155.255 at +185.64.156.0 - 185.64.159.255 de +185.64.160.0 - 185.64.163.255 us +185.64.164.0 - 185.64.167.255 at +185.64.168.0 - 185.64.171.255 de +185.64.172.0 - 185.64.175.255 rs +185.64.176.0 - 185.64.179.255 ir +185.64.180.0 - 185.64.183.255 be +185.64.184.0 - 185.64.187.255 ch +185.64.188.0 - 185.64.191.255 gb +185.64.192.0 - 185.64.195.255 nl +185.64.196.0 - 185.64.199.255 ch +185.64.200.0 - 185.64.203.255 kw +185.64.204.0 - 185.64.207.255 it +185.64.208.0 - 185.64.211.255 ru +185.64.212.0 - 185.64.215.255 gb +185.64.216.0 - 185.64.223.255 cz +185.64.224.0 - 185.64.227.255 gb +185.64.228.0 - 185.64.231.255 ru +185.64.232.0 - 185.64.235.255 es +185.64.236.0 - 185.64.239.255 md +185.64.240.0 - 185.64.243.255 es +185.64.244.0 - 185.64.255.255 gb +185.65.0.0 - 185.65.3.255 lu +185.65.4.0 - 185.65.7.255 de +185.65.8.0 - 185.65.11.255 hu +185.65.12.0 - 185.65.23.255 ru +185.65.24.0 - 185.65.27.255 gb +185.65.28.0 - 185.65.31.255 fr +185.65.32.0 - 185.65.35.255 gb +185.65.36.0 - 185.65.39.255 lv +185.65.40.0 - 185.65.43.255 gb +185.65.44.0 - 185.65.47.255 it +185.65.48.0 - 185.65.51.255 lt +185.65.52.0 - 185.65.55.255 nl +185.65.56.0 - 185.65.59.255 fr +185.65.60.0 - 185.65.63.255 ch +185.65.64.0 - 185.65.67.255 es +185.65.68.0 - 185.65.71.255 tr +185.65.72.0 - 185.65.75.255 be +185.65.76.0 - 185.65.79.255 cz +185.65.80.0 - 185.65.83.255 fr +185.65.84.0 - 185.65.87.255 gb +185.65.88.0 - 185.65.91.255 at +185.65.92.0 - 185.65.95.255 cz +185.65.96.0 - 185.65.99.255 fr +185.65.100.0 - 185.65.111.255 gb +185.65.112.0 - 185.65.115.255 fr +185.65.116.0 - 185.65.119.255 dk +185.65.120.0 - 185.65.123.255 ba +185.65.124.0 - 185.65.127.255 nl +185.65.128.0 - 185.65.131.255 gb +185.65.132.0 - 185.65.135.255 se +185.65.136.0 - 185.65.139.255 ru +185.65.140.0 - 185.65.143.255 se +185.65.144.0 - 185.65.147.255 gb +185.65.148.0 - 185.65.151.255 ru +185.65.152.0 - 185.65.155.255 no +185.65.156.0 - 185.65.159.255 es +185.65.160.0 - 185.65.163.255 lv +185.65.164.0 - 185.65.167.255 gb +185.65.168.0 - 185.65.171.255 ch +185.65.172.0 - 185.65.175.255 ru +185.65.176.0 - 185.65.179.255 se +185.65.180.0 - 185.65.183.255 be +185.65.184.0 - 185.65.187.255 es +185.65.188.0 - 185.65.191.255 se +185.65.192.0 - 185.65.199.255 de +185.65.200.0 - 185.65.201.255 lt +185.65.202.0 - 185.65.203.255 ru +185.65.204.0 - 185.65.207.255 tr +185.65.208.0 - 185.65.211.255 de +185.65.212.0 - 185.65.215.255 nl +185.65.216.0 - 185.65.219.255 it +185.65.220.0 - 185.65.223.255 sk +185.65.224.0 - 185.65.227.255 fr +185.65.228.0 - 185.65.231.255 ba +185.65.232.0 - 185.65.235.255 at +185.65.236.0 - 185.65.239.255 gb +185.65.240.0 - 185.65.243.255 de +185.65.244.0 - 185.65.247.255 ua +185.65.248.0 - 185.65.251.255 fr +185.65.252.0 - 185.65.255.255 iq +185.66.0.0 - 185.66.3.255 dk +185.66.4.0 - 185.66.7.255 gb +185.66.8.0 - 185.66.11.255 us +185.66.12.0 - 185.66.15.255 ru +185.66.16.0 - 185.66.19.255 ae +185.66.20.0 - 185.66.23.255 gb +185.66.24.0 - 185.66.27.255 it +185.66.28.0 - 185.66.31.255 ru +185.66.32.0 - 185.66.35.255 gb +185.66.36.0 - 185.66.39.255 cz +185.66.40.0 - 185.66.47.255 es +185.66.48.0 - 185.66.51.255 at +185.66.52.0 - 185.66.55.255 hu +185.66.56.0 - 185.66.59.255 es +185.66.60.0 - 185.66.63.255 ch +185.66.64.0 - 185.66.67.255 de +185.66.68.0 - 185.66.71.255 by +185.66.72.0 - 185.66.75.255 es +185.66.76.0 - 185.66.79.255 de +185.66.80.0 - 185.66.83.255 nl +185.66.84.0 - 185.66.87.255 ru +185.66.88.0 - 185.66.91.255 gb +185.66.92.0 - 185.66.95.255 nl +185.66.96.0 - 185.66.99.255 lu +185.66.100.0 - 185.66.103.255 fr +185.66.104.0 - 185.66.107.255 nl +185.66.108.0 - 185.66.111.255 ch +185.66.112.0 - 185.66.119.255 gb +185.66.120.0 - 185.66.123.255 pl +185.66.124.0 - 185.66.127.255 tr +185.66.128.0 - 185.66.131.255 al +185.66.132.0 - 185.66.135.255 de +185.66.136.0 - 185.66.139.255 ro +185.66.140.0 - 185.66.143.255 nl +185.66.144.0 - 185.66.147.255 ru +185.66.148.0 - 185.66.151.255 si +185.66.152.0 - 185.66.155.255 fr +185.66.156.0 - 185.66.159.255 ch +185.66.160.0 - 185.66.163.255 cy +185.66.164.0 - 185.66.167.255 gb +185.66.168.0 - 185.66.171.255 nl +185.66.172.0 - 185.66.175.255 es +185.66.176.0 - 185.66.179.255 de +185.66.180.0 - 185.66.183.255 gb +185.66.184.0 - 185.66.187.255 dk +185.66.188.0 - 185.66.191.255 cz +185.66.192.0 - 185.66.199.255 de +185.66.200.0 - 185.66.203.255 sk +185.66.204.0 - 185.66.211.255 gb +185.66.212.0 - 185.66.215.255 pl +185.66.216.0 - 185.66.219.255 ru +185.66.220.0 - 185.66.223.255 de +185.66.224.0 - 185.66.231.255 ir +185.66.232.0 - 185.66.235.255 fr +185.66.236.0 - 185.66.239.255 de +185.66.240.0 - 185.66.243.255 eu +185.66.244.0 - 185.66.247.255 de +185.66.248.0 - 185.66.251.255 nl +185.66.252.0 - 185.66.255.255 kg +185.67.0.0 - 185.67.0.255 nl +185.67.1.0 - 185.67.3.255 ua +185.67.4.0 - 185.67.7.255 nl +185.67.8.0 - 185.67.11.255 pl +185.67.12.0 - 185.67.15.255 ir +185.67.16.0 - 185.67.19.255 no +185.67.20.0 - 185.67.23.255 ie +185.67.24.0 - 185.67.27.255 de +185.67.28.0 - 185.67.31.255 es +185.67.32.0 - 185.67.35.255 tr +185.67.36.0 - 185.67.39.255 de +185.67.40.0 - 185.67.43.255 no +185.67.44.0 - 185.67.47.255 nl +185.67.48.0 - 185.67.51.255 gb +185.67.52.0 - 185.67.55.255 ru +185.67.56.0 - 185.67.59.255 se +185.67.60.0 - 185.67.67.255 nl +185.67.68.0 - 185.67.71.255 pl +185.67.72.0 - 185.67.75.255 fr +185.67.76.0 - 185.67.79.255 es +185.67.80.0 - 185.67.83.255 fi +185.67.84.0 - 185.67.87.255 is +185.67.88.0 - 185.67.91.255 fr +185.67.92.0 - 185.67.95.255 ru +185.67.96.0 - 185.67.99.255 es +185.67.100.0 - 185.67.103.255 ir +185.67.104.0 - 185.67.107.255 es +185.67.108.0 - 185.67.111.255 at +185.67.112.0 - 185.67.115.255 es +185.67.116.0 - 185.67.119.255 no +185.67.120.0 - 185.67.127.255 tr +185.67.128.0 - 185.67.131.255 dk +185.67.132.0 - 185.67.135.255 cz +185.67.136.0 - 185.67.139.255 br +185.67.140.0 - 185.67.143.255 gb +185.67.144.0 - 185.67.155.255 fr +185.67.156.0 - 185.67.159.255 de +185.67.160.0 - 185.67.163.255 ru +185.67.164.0 - 185.67.164.255 gb +185.67.165.0 - 185.67.166.255 us +185.67.167.0 - 185.67.167.255 gb +185.67.168.0 - 185.67.171.255 ru +185.67.172.0 - 185.67.175.255 at +185.67.176.0 - 185.67.179.255 al +185.67.180.0 - 185.67.183.255 is +185.67.184.0 - 185.67.187.255 gb +185.67.188.0 - 185.67.191.255 cz +185.67.192.0 - 185.67.199.255 ch +185.67.200.0 - 185.67.203.255 nl +185.67.204.0 - 185.67.207.255 tr +185.67.208.0 - 185.67.211.255 es +185.67.212.0 - 185.67.215.255 ir +185.67.216.0 - 185.67.219.255 pl +185.67.220.0 - 185.67.223.255 de +185.67.224.0 - 185.67.227.255 nl +185.67.228.0 - 185.67.231.255 at +185.67.232.0 - 185.67.235.255 gb +185.67.236.0 - 185.67.239.255 it +185.67.240.0 - 185.67.243.255 lt +185.67.244.0 - 185.67.247.255 ru +185.67.248.0 - 185.67.251.255 gb +185.67.252.0 - 185.67.255.255 cz +185.68.0.0 - 185.68.3.255 gb +185.68.4.0 - 185.68.7.255 at +185.68.8.0 - 185.68.11.255 ge +185.68.12.0 - 185.68.15.255 pl +185.68.16.0 - 185.68.19.255 ua +185.68.20.0 - 185.68.23.255 ru +185.68.24.0 - 185.68.27.255 pl +185.68.28.0 - 185.68.31.255 cz +185.68.32.0 - 185.68.35.255 ch +185.68.36.0 - 185.68.39.255 lt +185.68.40.0 - 185.68.43.255 de +185.68.44.0 - 185.68.47.255 lu +185.68.48.0 - 185.68.51.255 me +185.68.52.0 - 185.68.55.255 ch +185.68.56.0 - 185.68.59.255 fi +185.68.60.0 - 185.68.63.255 rs +185.68.64.0 - 185.68.67.255 ch +185.68.68.0 - 185.68.71.255 cz +185.68.72.0 - 185.68.75.255 hu +185.68.76.0 - 185.68.79.255 de +185.68.80.0 - 185.68.83.255 ae +185.68.84.0 - 185.68.87.255 gb +185.68.88.0 - 185.68.91.255 nl +185.68.92.0 - 185.68.95.255 ru +185.68.96.0 - 185.68.99.255 nl +185.68.100.0 - 185.68.103.255 ru +185.68.104.0 - 185.68.107.255 gb +185.68.108.0 - 185.68.111.255 es +185.68.112.0 - 185.68.115.255 gb +185.68.116.0 - 185.68.119.255 ru +185.68.120.0 - 185.68.123.255 ro +185.68.124.0 - 185.68.127.255 de +185.68.128.0 - 185.68.131.255 cy +185.68.132.0 - 185.68.135.255 hr +185.68.136.0 - 185.68.139.255 de +185.68.140.0 - 185.68.143.255 gb +185.68.144.0 - 185.68.147.255 ru +185.68.148.0 - 185.68.151.255 fr +185.68.152.0 - 185.68.155.255 ru +185.68.156.0 - 185.68.159.255 de +185.68.160.0 - 185.68.163.255 nl +185.68.164.0 - 185.68.167.255 cz +185.68.168.0 - 185.68.171.255 no +185.68.172.0 - 185.68.175.255 nl +185.68.176.0 - 185.68.179.255 it +185.68.180.0 - 185.68.183.255 nl +185.68.184.0 - 185.68.187.255 ru +185.68.188.0 - 185.68.191.255 ro +185.68.192.0 - 185.68.195.255 it +185.68.196.0 - 185.68.199.255 nl +185.68.200.0 - 185.68.203.255 gb +185.68.204.0 - 185.68.207.255 ch +185.68.208.0 - 185.68.211.255 ee +185.68.212.0 - 185.68.219.255 cz +185.68.220.0 - 185.68.223.255 tr +185.68.224.0 - 185.68.231.255 fr +185.68.232.0 - 185.68.235.255 gb +185.68.236.0 - 185.68.239.255 ch +185.68.240.0 - 185.68.243.255 nl +185.68.244.0 - 185.68.247.255 ru +185.68.248.0 - 185.68.251.255 gb +185.68.252.0 - 185.68.255.255 de +185.69.0.0 - 185.69.3.255 pl +185.69.4.0 - 185.69.7.255 iq +185.69.8.0 - 185.69.11.255 es +185.69.12.0 - 185.69.19.255 gb +185.69.20.0 - 185.69.23.255 pl +185.69.24.0 - 185.69.27.255 lv +185.69.28.0 - 185.69.31.255 ba +185.69.32.0 - 185.69.35.255 nl +185.69.36.0 - 185.69.39.255 fi +185.69.40.0 - 185.69.43.255 ch +185.69.44.0 - 185.69.47.255 se +185.69.48.0 - 185.69.51.255 sk +185.69.52.0 - 185.69.55.255 lt +185.69.56.0 - 185.69.59.255 ro +185.69.60.0 - 185.69.63.255 nl +185.69.64.0 - 185.69.67.255 gb +185.69.68.0 - 185.69.71.255 cz +185.69.72.0 - 185.69.75.255 fi +185.69.76.0 - 185.69.79.255 fr +185.69.80.0 - 185.69.83.255 ru +185.69.84.0 - 185.69.87.255 gb +185.69.88.0 - 185.69.91.255 nl +185.69.92.0 - 185.69.95.255 ch +185.69.96.0 - 185.69.99.255 hu +185.69.100.0 - 185.69.103.255 nl +185.69.104.0 - 185.69.107.255 sk +185.69.108.0 - 185.69.111.255 ir +185.69.112.0 - 185.69.115.255 nl +185.69.116.0 - 185.69.117.255 gb +185.69.118.0 - 185.69.118.255 es +185.69.119.0 - 185.69.119.255 gb +185.69.120.0 - 185.69.123.255 ir +185.69.124.0 - 185.69.127.255 ru +185.69.128.0 - 185.69.131.255 eu +185.69.132.0 - 185.69.135.255 ru +185.69.136.0 - 185.69.139.255 ch +185.69.140.0 - 185.69.143.255 fi +185.69.144.0 - 185.69.147.255 gb +185.69.148.0 - 185.69.151.255 si +185.69.152.0 - 185.69.155.255 ua +185.69.156.0 - 185.69.159.255 nl +185.69.160.0 - 185.69.163.255 at +185.69.164.0 - 185.69.167.255 be +185.69.168.0 - 185.69.171.255 se +185.69.172.0 - 185.69.175.255 ge +185.69.176.0 - 185.69.183.255 de +185.69.184.0 - 185.69.187.255 tm +185.69.188.0 - 185.69.191.255 it +185.69.192.0 - 185.69.199.255 pl +185.69.200.0 - 185.69.203.255 de +185.69.204.0 - 185.69.207.255 nl +185.69.208.0 - 185.69.211.255 sa +185.69.212.0 - 185.69.215.255 ie +185.69.216.0 - 185.69.219.255 lu +185.69.220.0 - 185.69.223.255 ru +185.69.224.0 - 185.69.227.255 lu +185.69.228.0 - 185.69.231.255 fr +185.69.232.0 - 185.69.235.255 nl +185.69.236.0 - 185.69.239.255 at +185.69.240.0 - 185.69.243.255 ro +185.69.244.0 - 185.69.247.255 at +185.69.248.0 - 185.69.251.255 fr +185.69.252.0 - 185.69.255.255 es +185.70.0.0 - 185.70.3.255 sk +185.70.4.0 - 185.70.7.255 nl +185.70.8.0 - 185.70.11.255 gb +185.70.12.0 - 185.70.15.255 by +185.70.16.0 - 185.70.19.255 ua +185.70.20.0 - 185.70.23.255 de +185.70.24.0 - 185.70.27.255 cz +185.70.28.0 - 185.70.31.255 ie +185.70.32.0 - 185.70.35.255 gb +185.70.36.0 - 185.70.39.255 pl +185.70.40.0 - 185.70.43.255 ch +185.70.44.0 - 185.70.47.255 be +185.70.48.0 - 185.70.51.255 ch +185.70.52.0 - 185.70.55.255 ge +185.70.56.0 - 185.70.59.255 gb +185.70.60.0 - 185.70.63.255 ir +185.70.64.0 - 185.70.67.255 nl +185.70.68.0 - 185.70.71.255 ch +185.70.72.0 - 185.70.75.255 be +185.70.76.0 - 185.70.79.255 gr +185.70.80.0 - 185.70.83.255 li +185.70.84.0 - 185.70.87.255 tr +185.70.88.0 - 185.70.91.255 gb +185.70.92.0 - 185.70.95.255 es +185.70.96.0 - 185.70.99.255 tr +185.70.100.0 - 185.70.103.255 pt +185.70.104.0 - 185.70.107.255 ru +185.70.108.0 - 185.70.111.255 ua +185.70.112.0 - 185.70.115.255 nl +185.70.116.0 - 185.70.119.255 kz +185.70.120.0 - 185.70.123.255 de +185.70.124.0 - 185.70.127.255 se +185.70.128.0 - 185.70.131.255 ua +185.70.132.0 - 185.70.135.255 gb +185.70.136.0 - 185.70.139.255 es +185.70.140.0 - 185.70.143.255 tr +185.70.144.0 - 185.70.147.255 de +185.70.148.0 - 185.70.151.255 it +185.70.152.0 - 185.70.155.255 es +185.70.156.0 - 185.70.163.255 gb +185.70.164.0 - 185.70.167.255 ru +185.70.168.0 - 185.70.171.255 gb +185.70.172.0 - 185.70.175.255 es +185.70.176.0 - 185.70.179.255 fr +185.70.180.0 - 185.70.183.255 pl +185.70.184.0 - 185.70.187.255 nl +185.70.188.0 - 185.70.191.255 md +185.70.192.0 - 185.70.195.255 gb +185.70.196.0 - 185.70.199.255 ir +185.70.200.0 - 185.70.203.255 it +185.70.204.0 - 185.70.207.255 de +185.70.208.0 - 185.70.215.255 nl +185.70.216.0 - 185.70.219.255 cz +185.70.220.0 - 185.70.223.255 de +185.70.224.0 - 185.70.227.255 lb +185.70.228.0 - 185.70.239.255 nl +185.70.240.0 - 185.70.243.255 gb +185.70.244.0 - 185.70.247.255 ch +185.70.248.0 - 185.70.251.255 il +185.70.252.0 - 185.70.255.255 gb +185.71.0.0 - 185.71.3.255 us +185.71.4.0 - 185.71.7.255 de +185.71.8.0 - 185.71.11.255 it +185.71.12.0 - 185.71.19.255 ch +185.71.20.0 - 185.71.23.255 pl +185.71.24.0 - 185.71.27.255 gb +185.71.28.0 - 185.71.31.255 es +185.71.32.0 - 185.71.35.255 de +185.71.36.0 - 185.71.39.255 gb +185.71.40.0 - 185.71.43.255 cz +185.71.44.0 - 185.71.47.255 it +185.71.48.0 - 185.71.51.255 gb +185.71.52.0 - 185.71.55.255 ru +185.71.56.0 - 185.71.59.255 lu +185.71.60.0 - 185.71.63.255 nl +185.71.64.0 - 185.71.71.255 ru +185.71.72.0 - 185.71.75.255 gb +185.71.76.0 - 185.71.83.255 ru +185.71.84.0 - 185.71.87.255 de +185.71.88.0 - 185.71.91.255 ro +185.71.92.0 - 185.71.95.255 de +185.71.96.0 - 185.71.99.255 ru +185.71.100.0 - 185.71.103.255 gb +185.71.104.0 - 185.71.107.255 hu +185.71.108.0 - 185.71.111.255 gb +185.71.112.0 - 185.71.115.255 ch +185.71.116.0 - 185.71.119.255 tr +185.71.120.0 - 185.71.127.255 de +185.71.128.0 - 185.71.131.255 lv +185.71.132.0 - 185.71.135.255 ye +185.71.136.0 - 185.71.139.255 gb +185.71.140.0 - 185.71.143.255 ps +185.71.144.0 - 185.71.147.255 ru +185.71.148.0 - 185.71.151.255 fr +185.71.152.0 - 185.71.155.255 ir +185.71.156.0 - 185.71.159.255 fr +185.71.160.0 - 185.71.163.255 ie +185.71.164.0 - 185.71.167.255 at +185.71.168.0 - 185.71.171.255 de +185.71.172.0 - 185.71.175.255 si +185.71.176.0 - 185.71.179.255 se +185.71.180.0 - 185.71.183.255 al +185.71.184.0 - 185.71.187.255 gb +185.71.188.0 - 185.71.191.255 fr +185.71.192.0 - 185.71.195.255 ir +185.71.196.0 - 185.71.199.255 ru +185.71.200.0 - 185.71.203.255 es +185.71.204.0 - 185.71.207.255 ae +185.71.208.0 - 185.71.211.255 no +185.71.212.0 - 185.71.215.255 ru +185.71.216.0 - 185.71.219.255 cy +185.71.220.0 - 185.71.227.255 nl +185.71.228.0 - 185.71.231.255 de +185.71.232.0 - 185.71.235.255 cz +185.71.236.0 - 185.71.239.255 hr +185.71.240.0 - 185.71.243.255 pl +185.71.244.0 - 185.71.247.255 it +185.71.248.0 - 185.71.251.255 de +185.71.252.0 - 185.71.255.255 at +185.72.0.0 - 185.72.3.255 ch +185.72.4.0 - 185.72.7.255 fr +185.72.8.0 - 185.72.11.255 ru +185.72.12.0 - 185.72.15.255 es +185.72.16.0 - 185.72.19.255 hu +185.72.20.0 - 185.72.23.255 ch +185.72.24.0 - 185.72.27.255 ir +185.72.28.0 - 185.72.31.255 si +185.72.32.0 - 185.72.35.255 pl +185.72.36.0 - 185.72.39.255 dk +185.72.40.0 - 185.72.43.255 it +185.72.44.0 - 185.72.47.255 es +185.72.48.0 - 185.72.51.255 ua +185.72.52.0 - 185.72.55.255 es +185.72.56.0 - 185.72.59.255 bg +185.72.60.0 - 185.72.63.255 si +185.72.64.0 - 185.72.67.255 ch +185.72.68.0 - 185.72.71.255 de +185.72.72.0 - 185.72.75.255 at +185.72.76.0 - 185.72.79.255 it +185.72.80.0 - 185.72.83.255 fr +185.72.84.0 - 185.72.87.255 lv +185.72.88.0 - 185.72.91.255 fr +185.72.92.0 - 185.72.95.255 gb +185.72.96.0 - 185.72.99.255 no +185.72.100.0 - 185.72.103.255 jo +185.72.104.0 - 185.72.107.255 si +185.72.108.0 - 185.72.111.255 gb +185.72.112.0 - 185.72.115.255 es +185.72.116.0 - 185.72.119.255 fi +185.72.120.0 - 185.72.127.255 nl +185.72.128.0 - 185.72.131.255 gb +185.72.132.0 - 185.72.135.255 nl +185.72.136.0 - 185.72.139.255 at +185.72.140.0 - 185.72.143.255 dk +185.72.144.0 - 185.72.147.255 ru +185.72.148.0 - 185.72.151.255 gr +185.72.152.0 - 185.72.155.255 pt +185.72.156.0 - 185.72.159.255 us +185.72.160.0 - 185.72.167.255 nl +185.72.168.0 - 185.72.171.255 be +185.72.172.0 - 185.72.175.255 gb +185.72.176.0 - 185.72.179.255 ro +185.72.180.0 - 185.72.183.255 nl +185.72.184.0 - 185.72.187.255 pl +185.72.188.0 - 185.72.191.255 ru +185.72.192.0 - 185.72.195.255 ch +185.72.196.0 - 185.72.199.255 pl +185.72.200.0 - 185.72.203.255 de +185.72.204.0 - 185.72.207.255 lv +185.72.208.0 - 185.72.211.255 dk +185.72.212.0 - 185.72.215.255 es +185.72.216.0 - 185.72.219.255 lb +185.72.220.0 - 185.72.223.255 no +185.72.224.0 - 185.72.231.255 ru +185.72.232.0 - 185.72.235.255 de +185.72.236.0 - 185.72.239.255 ch +185.72.240.0 - 185.72.243.255 ro +185.72.244.0 - 185.72.247.255 de +185.72.248.0 - 185.72.251.255 fr +185.72.252.0 - 185.72.255.255 tr +185.73.0.0 - 185.73.3.255 ir +185.73.4.0 - 185.73.7.255 si +185.73.8.0 - 185.73.11.255 gb +185.73.12.0 - 185.73.15.255 no +185.73.16.0 - 185.73.19.255 ru +185.73.20.0 - 185.73.23.255 de +185.73.24.0 - 185.73.27.255 no +185.73.28.0 - 185.73.35.255 nl +185.73.36.0 - 185.73.39.255 gb +185.73.40.0 - 185.73.43.255 gr +185.73.44.0 - 185.73.47.255 gb +185.73.48.0 - 185.73.51.255 de +185.73.52.0 - 185.73.55.255 fr +185.73.56.0 - 185.73.59.255 bg +185.73.60.0 - 185.73.63.255 pl +185.73.64.0 - 185.73.67.255 gb +185.73.68.0 - 185.73.71.255 ee +185.73.72.0 - 185.73.75.255 dk +185.73.76.0 - 185.73.79.255 ir +185.73.80.0 - 185.73.83.255 de +185.73.84.0 - 185.73.87.255 gb +185.73.88.0 - 185.73.91.255 pl +185.73.92.0 - 185.73.95.255 nl +185.73.96.0 - 185.73.99.255 es +185.73.100.0 - 185.73.111.255 cz +185.73.112.0 - 185.73.115.255 ir +185.73.116.0 - 185.73.123.255 ch +185.73.124.0 - 185.73.127.255 nl +185.73.128.0 - 185.73.131.255 tr +185.73.132.0 - 185.73.135.255 ee +185.73.136.0 - 185.73.139.255 it +185.73.140.0 - 185.73.143.255 gb +185.73.144.0 - 185.73.147.255 nl +185.73.148.0 - 185.73.155.255 gb +185.73.156.0 - 185.73.159.255 li +185.73.160.0 - 185.73.163.255 cz +185.73.164.0 - 185.73.167.255 it +185.73.168.0 - 185.73.179.255 es +185.73.180.0 - 185.73.183.255 ru +185.73.184.0 - 185.73.187.255 gb +185.73.188.0 - 185.73.191.255 es +185.73.192.0 - 185.73.195.255 ru +185.73.196.0 - 185.73.199.255 dk +185.73.200.0 - 185.73.203.255 tr +185.73.204.0 - 185.73.207.255 fr +185.73.208.0 - 185.73.211.255 pl +185.73.212.0 - 185.73.219.255 ru +185.73.220.0 - 185.73.223.255 nl +185.73.224.0 - 185.73.227.255 cz +185.73.228.0 - 185.73.231.255 pl +185.73.232.0 - 185.73.235.255 fr +185.73.236.0 - 185.73.239.255 bg +185.73.240.0 - 185.73.243.255 ch +185.73.244.0 - 185.73.251.255 it +185.73.252.0 - 185.73.255.255 fr +185.74.0.0 - 185.74.3.255 at +185.74.4.0 - 185.74.7.255 uz +185.74.8.0 - 185.74.11.255 fr +185.74.12.0 - 185.74.15.255 de +185.74.16.0 - 185.74.19.255 es +185.74.20.0 - 185.74.23.255 tr +185.74.24.0 - 185.74.27.255 gb +185.74.28.0 - 185.74.31.255 ch +185.74.32.0 - 185.74.35.255 fr +185.74.36.0 - 185.74.39.255 it +185.74.40.0 - 185.74.43.255 fr +185.74.44.0 - 185.74.47.255 us +185.74.48.0 - 185.74.51.255 dk +185.74.52.0 - 185.74.55.255 fr +185.74.56.0 - 185.74.59.255 im +185.74.60.0 - 185.74.63.255 cz +185.74.64.0 - 185.74.67.255 de +185.74.68.0 - 185.74.71.255 ch +185.74.72.0 - 185.74.75.255 gi +185.74.76.0 - 185.74.79.255 nl +185.74.80.0 - 185.74.83.255 es +185.74.84.0 - 185.74.87.255 pl +185.74.88.0 - 185.74.91.255 rs +185.74.92.0 - 185.74.95.255 ge +185.74.96.0 - 185.74.99.255 fr +185.74.100.0 - 185.74.103.255 uz +185.74.104.0 - 185.74.107.255 ru +185.74.108.0 - 185.74.163.255 ch +185.74.164.0 - 185.74.167.255 ir +185.74.168.0 - 185.74.171.255 gb +185.74.172.0 - 185.74.175.255 ru +185.74.176.0 - 185.74.179.255 gb +185.74.180.0 - 185.74.183.255 de +185.74.184.0 - 185.74.187.255 ru +185.74.188.0 - 185.74.191.255 it +185.74.192.0 - 185.74.195.255 es +185.74.196.0 - 185.74.199.255 sk +185.74.200.0 - 185.74.203.255 fr +185.74.204.0 - 185.74.207.255 cz +185.74.208.0 - 185.74.211.255 fo +185.74.212.0 - 185.74.215.255 ch +185.74.216.0 - 185.74.219.255 de +185.74.220.0 - 185.74.223.255 ru +185.74.224.0 - 185.74.227.255 de +185.74.228.0 - 185.74.231.255 ru +185.74.232.0 - 185.74.239.255 gb +185.74.240.0 - 185.74.243.255 es +185.74.244.0 - 185.74.247.255 de +185.74.248.0 - 185.74.251.255 it +185.74.252.0 - 185.74.255.255 cz +185.75.0.0 - 185.75.3.255 pl +185.75.4.0 - 185.75.7.255 ru +185.75.8.0 - 185.75.11.255 at +185.75.12.0 - 185.75.15.255 es +185.75.16.0 - 185.75.19.255 sa +185.75.20.0 - 185.75.23.255 es +185.75.24.0 - 185.75.27.255 de +185.75.28.0 - 185.75.31.255 gb +185.75.32.0 - 185.75.35.255 ch +185.75.36.0 - 185.75.39.255 pl +185.75.40.0 - 185.75.43.255 se +185.75.44.0 - 185.75.47.255 ru +185.75.48.0 - 185.75.51.255 bg +185.75.52.0 - 185.75.55.255 ro +185.75.56.0 - 185.75.59.255 rs +185.75.60.0 - 185.75.63.255 gb +185.75.64.0 - 185.75.67.255 ru +185.75.68.0 - 185.75.71.255 fr +185.75.72.0 - 185.75.75.255 de +185.75.76.0 - 185.75.79.255 nl +185.75.80.0 - 185.75.83.255 gi +185.75.84.0 - 185.75.91.255 ru +185.75.92.0 - 185.75.95.255 gb +185.75.96.0 - 185.75.99.255 iq +185.75.100.0 - 185.75.103.255 de +185.75.104.0 - 185.75.107.255 gb +185.75.108.0 - 185.75.111.255 it +185.75.112.0 - 185.75.115.255 nl +185.75.116.0 - 185.75.119.255 cz +185.75.120.0 - 185.75.123.255 gb +185.75.124.0 - 185.75.127.255 fr +185.75.128.0 - 185.75.131.255 fi +185.75.132.0 - 185.75.135.255 ru +185.75.136.0 - 185.75.139.255 cz +185.75.140.0 - 185.75.143.255 fr +185.75.144.0 - 185.75.147.255 ie +185.75.148.0 - 185.75.151.255 de +185.75.152.0 - 185.75.155.255 ch +185.75.156.0 - 185.75.159.255 nl +185.75.160.0 - 185.75.163.255 pl +185.75.164.0 - 185.75.167.255 de +185.75.168.0 - 185.75.171.255 nl +185.75.172.0 - 185.75.175.255 gb +185.75.176.0 - 185.75.179.255 es +185.75.180.0 - 185.75.183.255 ru +185.75.184.0 - 185.75.187.255 de +185.75.188.0 - 185.75.190.255 ru +185.75.191.0 - 185.75.191.255 kz +185.75.192.0 - 185.75.195.255 hu +185.75.196.0 - 185.75.199.255 ir +185.75.200.0 - 185.75.203.255 ru +185.75.204.0 - 185.75.207.255 ir +185.75.208.0 - 185.75.211.255 nl +185.75.212.0 - 185.75.215.255 gb +185.75.216.0 - 185.75.219.255 at +185.75.220.0 - 185.75.223.255 nl +185.75.224.0 - 185.75.227.255 fr +185.75.228.0 - 185.75.231.255 de +185.75.232.0 - 185.75.235.255 cz +185.75.236.0 - 185.75.239.255 lv +185.75.240.0 - 185.75.240.191 gb +185.75.240.192 - 185.75.240.255 at +185.75.241.0 - 185.75.243.255 gb +185.75.244.0 - 185.75.247.255 nl +185.75.248.0 - 185.75.251.255 ru +185.75.252.0 - 185.75.255.255 nl +185.76.0.0 - 185.76.3.255 fr +185.76.4.0 - 185.76.7.255 pt +185.76.8.0 - 185.76.11.255 cz +185.76.12.0 - 185.76.15.255 ua +185.76.16.0 - 185.76.19.255 nl +185.76.20.0 - 185.76.27.255 fr +185.76.28.0 - 185.76.31.255 ro +185.76.32.0 - 185.76.35.255 iq +185.76.36.0 - 185.76.39.255 gb +185.76.40.0 - 185.76.43.255 de +185.76.44.0 - 185.76.51.255 gb +185.76.52.0 - 185.76.55.255 ro +185.76.56.0 - 185.76.59.255 it +185.76.60.0 - 185.76.63.255 ro +185.76.64.0 - 185.76.67.255 se +185.76.68.0 - 185.76.71.255 ua +185.76.72.0 - 185.76.75.255 nl +185.76.76.0 - 185.76.79.255 es +185.76.80.0 - 185.76.83.255 ru +185.76.84.0 - 185.76.87.255 no +185.76.88.0 - 185.76.91.255 nl +185.76.92.0 - 185.76.95.255 gb +185.76.96.0 - 185.76.99.255 de +185.76.100.0 - 185.76.103.255 it +185.76.104.0 - 185.76.107.255 pl +185.76.108.0 - 185.76.111.255 ru +185.76.112.0 - 185.76.115.255 fr +185.76.116.0 - 185.76.119.255 de +185.76.120.0 - 185.76.123.255 fr +185.76.124.0 - 185.76.127.255 nl +185.76.128.0 - 185.76.131.255 ae +185.76.132.0 - 185.76.135.255 nl +185.76.136.0 - 185.76.139.255 sa +185.76.140.0 - 185.76.143.255 tr +185.76.144.0 - 185.76.147.255 ru +185.76.148.0 - 185.76.151.255 gb +185.76.152.0 - 185.76.155.255 tr +185.76.156.0 - 185.76.167.255 de +185.76.168.0 - 185.76.171.255 nl +185.76.172.0 - 185.76.175.255 de +185.76.176.0 - 185.76.179.255 lb +185.76.180.0 - 185.76.183.255 ch +185.76.184.0 - 185.76.187.255 gb +185.76.188.0 - 185.76.191.255 de +185.76.192.0 - 185.76.195.255 fr +185.76.196.0 - 185.76.203.255 tr +185.76.204.0 - 185.76.207.255 ae +185.76.208.0 - 185.76.211.255 gb +185.76.212.0 - 185.76.219.255 es +185.76.220.0 - 185.76.223.255 ru +185.76.224.0 - 185.76.231.255 ie +185.76.232.0 - 185.76.235.255 ru +185.76.236.0 - 185.76.239.255 nl +185.76.240.0 - 185.76.243.255 ru +185.76.244.0 - 185.76.247.255 mt +185.76.248.0 - 185.76.251.255 ir +185.76.252.0 - 185.76.255.255 ru +185.77.0.0 - 185.77.3.255 tr +185.77.4.0 - 185.77.7.255 gb +185.77.8.0 - 185.77.11.255 ru +185.77.12.0 - 185.77.15.255 be +185.77.16.0 - 185.77.19.255 ru +185.77.20.0 - 185.77.23.255 gb +185.77.24.0 - 185.77.27.255 nl +185.77.28.0 - 185.77.31.255 ge +185.77.32.0 - 185.77.35.255 it +185.77.36.0 - 185.77.39.255 gr +185.77.40.0 - 185.77.43.255 tr +185.77.44.0 - 185.77.47.255 li +185.77.48.0 - 185.77.51.255 it +185.77.52.0 - 185.77.55.255 li +185.77.56.0 - 185.77.59.255 gb +185.77.60.0 - 185.77.63.255 be +185.77.64.0 - 185.77.64.23 gb +185.77.64.24 - 185.77.64.31 it +185.77.64.32 - 185.77.65.87 gb +185.77.65.88 - 185.77.65.95 it +185.77.65.96 - 185.77.67.255 gb +185.77.68.0 - 185.77.71.255 ch +185.77.72.0 - 185.77.75.255 gb +185.77.76.0 - 185.77.79.255 pl +185.77.80.0 - 185.77.83.255 gb +185.77.84.0 - 185.77.87.255 it +185.77.88.0 - 185.77.91.255 tr +185.77.92.0 - 185.77.95.255 ch +185.77.96.0 - 185.77.99.255 lt +185.77.100.0 - 185.77.103.255 ua +185.77.104.0 - 185.77.107.255 de +185.77.108.0 - 185.77.111.255 at +185.77.112.0 - 185.77.115.255 fr +185.77.116.0 - 185.77.119.255 no +185.77.120.0 - 185.77.123.255 nl +185.77.124.0 - 185.77.127.255 bg +185.77.128.0 - 185.77.131.255 nl +185.77.132.0 - 185.77.135.255 es +185.77.136.0 - 185.77.139.255 ru +185.77.140.0 - 185.77.143.255 gb +185.77.144.0 - 185.77.147.255 sk +185.77.148.0 - 185.77.151.255 ru +185.77.152.0 - 185.77.155.255 gb +185.77.156.0 - 185.77.159.255 es +185.77.160.0 - 185.77.163.255 it +185.77.164.0 - 185.77.164.127 sg +185.77.164.128 - 185.77.164.255 my +185.77.165.0 - 185.77.165.127 sg +185.77.165.128 - 185.77.165.255 my +185.77.166.0 - 185.77.166.127 sg +185.77.166.128 - 185.77.166.255 id +185.77.167.0 - 185.77.167.127 sg +185.77.167.128 - 185.77.167.255 id +185.77.168.0 - 185.77.171.255 es +185.77.172.0 - 185.77.175.255 gb +185.77.176.0 - 185.77.179.255 es +185.77.180.0 - 185.77.183.255 fr +185.77.184.0 - 185.77.187.255 es +185.77.188.0 - 185.77.191.255 nl +185.77.192.0 - 185.77.195.255 am +185.77.196.0 - 185.77.199.255 be +185.77.200.0 - 185.77.203.255 gb +185.77.204.0 - 185.77.207.255 ru +185.77.208.0 - 185.77.211.255 nl +185.77.212.0 - 185.77.215.255 be +185.77.216.0 - 185.77.223.255 ru +185.77.224.0 - 185.77.227.255 va +185.77.228.0 - 185.77.243.255 ru +185.77.244.0 - 185.77.247.255 fi +185.77.248.0 - 185.77.251.255 ro +185.77.252.0 - 185.77.255.255 at +185.78.0.0 - 185.78.3.255 es +185.78.4.0 - 185.78.11.255 gb +185.78.12.0 - 185.78.15.255 cz +185.78.16.0 - 185.78.19.255 it +185.78.20.0 - 185.78.23.255 ir +185.78.24.0 - 185.78.27.255 es +185.78.28.0 - 185.78.35.255 ru +185.78.36.0 - 185.78.39.255 bg +185.78.40.0 - 185.78.40.255 de +185.78.41.0 - 185.78.41.15 nl +185.78.41.16 - 185.78.41.31 be +185.78.41.32 - 185.78.41.47 gb +185.78.41.48 - 185.78.41.63 dk +185.78.41.64 - 185.78.41.79 es +185.78.41.80 - 185.78.41.95 it +185.78.41.96 - 185.78.41.111 fr +185.78.41.112 - 185.78.41.127 at +185.78.41.128 - 185.78.41.143 ch +185.78.41.144 - 185.78.41.159 us +185.78.41.160 - 185.78.43.255 de +185.78.44.0 - 185.78.47.255 ee +185.78.48.0 - 185.78.51.255 it +185.78.52.0 - 185.78.55.255 gb +185.78.56.0 - 185.78.59.255 cz +185.78.60.0 - 185.78.63.255 de +185.78.64.0 - 185.78.67.255 it +185.78.68.0 - 185.78.71.255 no +185.78.72.0 - 185.78.75.255 pl +185.78.76.0 - 185.78.79.255 ru +185.78.80.0 - 185.78.83.255 fr +185.78.84.0 - 185.78.87.255 tr +185.78.88.0 - 185.78.91.255 gb +185.78.92.0 - 185.78.95.255 ru +185.78.96.0 - 185.78.99.255 nl +185.78.100.0 - 185.78.103.255 cz +185.78.104.0 - 185.78.107.255 ir +185.78.108.0 - 185.78.119.255 ru +185.78.120.0 - 185.78.127.255 ch +185.78.128.0 - 185.78.131.255 cy +185.78.132.0 - 185.78.135.255 pl +185.78.136.0 - 185.78.139.255 uz +185.78.140.0 - 185.78.143.255 fr +185.78.144.0 - 185.78.147.255 am +185.78.148.0 - 185.78.151.255 pl +185.78.152.0 - 185.78.155.255 sk +185.78.156.0 - 185.78.159.255 fr +185.78.160.0 - 185.78.163.255 nl +185.78.164.0 - 185.78.171.255 gb +185.78.172.0 - 185.78.175.255 se +185.78.176.0 - 185.78.179.255 de +185.78.180.0 - 185.78.183.255 be +185.78.184.0 - 185.78.187.255 de +185.78.188.0 - 185.78.191.255 ch +185.78.192.0 - 185.78.195.255 gb +185.78.196.0 - 185.78.199.255 nl +185.78.200.0 - 185.78.203.255 ru +185.78.204.0 - 185.78.207.255 gb +185.78.208.0 - 185.78.211.255 no +185.78.212.0 - 185.78.215.255 es +185.78.216.0 - 185.78.219.255 gb +185.78.220.0 - 185.78.223.255 gr +185.78.224.0 - 185.78.227.255 al +185.78.228.0 - 185.78.231.255 no +185.78.232.0 - 185.78.233.255 ua +185.78.234.0 - 185.78.235.255 tj +185.78.236.0 - 185.78.239.255 ru +185.78.240.0 - 185.78.243.255 si +185.78.244.0 - 185.78.247.255 ae +185.78.248.0 - 185.78.251.255 nl +185.78.252.0 - 185.78.255.255 de +185.79.0.0 - 185.79.3.255 am +185.79.4.0 - 185.79.7.255 es +185.79.8.0 - 185.79.11.255 nl +185.79.12.0 - 185.79.15.255 tr +185.79.16.0 - 185.79.19.255 by +185.79.20.0 - 185.79.23.255 es +185.79.24.0 - 185.79.27.255 de +185.79.28.0 - 185.79.31.255 es +185.79.32.0 - 185.79.35.255 pl +185.79.36.0 - 185.79.39.255 es +185.79.40.0 - 185.79.43.255 nl +185.79.44.0 - 185.79.47.255 de +185.79.48.0 - 185.79.51.255 ru +185.79.52.0 - 185.79.55.255 it +185.79.56.0 - 185.79.59.255 gb +185.79.60.0 - 185.79.63.255 ir +185.79.64.0 - 185.79.67.255 de +185.79.68.0 - 185.79.71.255 ru +185.79.72.0 - 185.79.75.255 de +185.79.76.0 - 185.79.79.255 ru +185.79.80.0 - 185.79.83.255 nl +185.79.84.0 - 185.79.87.255 no +185.79.88.0 - 185.79.91.255 ch +185.79.92.0 - 185.79.95.255 hu +185.79.96.0 - 185.79.99.255 ir +185.79.100.0 - 185.79.103.255 ru +185.79.104.0 - 185.79.107.255 ch +185.79.108.0 - 185.79.115.255 gb +185.79.116.0 - 185.79.119.255 ru +185.79.120.0 - 185.79.123.255 bg +185.79.124.0 - 185.79.127.255 de +185.79.128.0 - 185.79.131.255 es +185.79.132.0 - 185.79.139.255 ru +185.79.140.0 - 185.79.143.255 gb +185.79.144.0 - 185.79.147.255 es +185.79.148.0 - 185.79.151.255 fr +185.79.152.0 - 185.79.155.255 nl +185.79.156.0 - 185.79.159.255 ir +185.79.160.0 - 185.79.163.255 nl +185.79.164.0 - 185.79.167.255 se +185.79.168.0 - 185.79.171.255 de +185.79.172.0 - 185.79.175.255 es +185.79.176.0 - 185.79.179.255 gb +185.79.180.0 - 185.79.183.255 ch +185.79.184.0 - 185.79.187.255 gb +185.79.188.0 - 185.79.191.255 gr +185.79.192.0 - 185.79.195.255 fr +185.79.196.0 - 185.79.199.255 de +185.79.200.0 - 185.79.207.255 ch +185.79.208.0 - 185.79.211.255 de +185.79.212.0 - 185.79.215.255 kz +185.79.216.0 - 185.79.219.255 de +185.79.220.0 - 185.79.223.255 fr +185.79.224.0 - 185.79.227.255 pt +185.79.228.0 - 185.79.231.255 ba +185.79.232.0 - 185.79.235.255 ch +185.79.236.0 - 185.79.239.255 ru +185.79.240.0 - 185.79.243.255 pl +185.79.244.0 - 185.79.247.255 lt +185.79.248.0 - 185.79.251.255 sa +185.79.252.0 - 185.79.255.255 ch +185.80.0.0 - 185.80.3.255 bg +185.80.4.0 - 185.80.7.255 es +185.80.8.0 - 185.80.11.255 nl +185.80.12.0 - 185.80.15.255 gb +185.80.16.0 - 185.80.19.255 fr +185.80.20.0 - 185.80.23.255 tr +185.80.24.0 - 185.80.27.255 jo +185.80.28.0 - 185.80.31.255 ru +185.80.32.0 - 185.80.35.255 pl +185.80.36.0 - 185.80.39.255 nl +185.80.40.0 - 185.80.43.255 iq +185.80.44.0 - 185.80.47.255 ye +185.80.48.0 - 185.80.51.255 hu +185.80.52.0 - 185.80.55.255 nl +185.80.56.0 - 185.80.59.255 pl +185.80.60.0 - 185.80.63.255 no +185.80.64.0 - 185.80.67.255 ch +185.80.68.0 - 185.80.71.255 rs +185.80.72.0 - 185.80.75.255 tr +185.80.76.0 - 185.80.79.255 pt +185.80.80.0 - 185.80.87.255 gb +185.80.88.0 - 185.80.91.255 ch +185.80.92.0 - 185.80.95.255 de +185.80.96.0 - 185.80.99.255 me +185.80.100.0 - 185.80.103.255 ru +185.80.104.0 - 185.80.107.255 jo +185.80.108.0 - 185.80.111.255 il +185.80.112.0 - 185.80.119.255 gb +185.80.120.0 - 185.80.123.255 de +185.80.124.0 - 185.80.127.255 lu +185.80.128.0 - 185.80.131.255 lt +185.80.132.0 - 185.80.135.255 gb +185.80.136.0 - 185.80.139.255 tr +185.80.140.0 - 185.80.143.255 ye +185.80.144.0 - 185.80.147.255 de +185.80.148.0 - 185.80.151.255 ru +185.80.152.0 - 185.80.155.255 ua +185.80.156.0 - 185.80.159.255 no +185.80.160.0 - 185.80.163.255 pl +185.80.164.0 - 185.80.167.255 mk +185.80.168.0 - 185.80.171.255 de +185.80.172.0 - 185.80.175.255 az +185.80.176.0 - 185.80.179.255 gb +185.80.180.0 - 185.80.183.255 no +185.80.184.0 - 185.80.187.255 de +185.80.188.0 - 185.80.191.255 at +185.80.192.0 - 185.80.195.255 hr +185.80.196.0 - 185.80.199.255 ir +185.80.200.0 - 185.80.203.255 us +185.80.204.0 - 185.80.207.255 ru +185.80.208.0 - 185.80.211.255 se +185.80.212.0 - 185.80.215.255 pl +185.80.216.0 - 185.80.219.255 se +185.80.220.0 - 185.80.220.10 gb +185.80.220.11 - 185.80.220.11 nl +185.80.220.12 - 185.80.220.18 gb +185.80.220.19 - 185.80.220.19 nl +185.80.220.20 - 185.80.223.255 gb +185.80.224.0 - 185.80.227.255 al +185.80.228.0 - 185.80.231.255 ru +185.80.232.0 - 185.80.235.255 nl +185.80.236.0 - 185.80.239.255 lv +185.80.240.0 - 185.80.243.255 at +185.80.244.0 - 185.80.247.255 nl +185.80.248.0 - 185.80.251.255 ru +185.80.252.0 - 185.80.255.255 se +185.81.0.0 - 185.81.7.255 it +185.81.8.0 - 185.81.11.255 nl +185.81.12.0 - 185.81.15.255 no +185.81.16.0 - 185.81.19.255 gb +185.81.20.0 - 185.81.23.255 hu +185.81.24.0 - 185.81.27.255 ru +185.81.28.0 - 185.81.31.255 si +185.81.32.0 - 185.81.35.255 tr +185.81.36.0 - 185.81.39.255 dk +185.81.40.0 - 185.81.43.255 ir +185.81.44.0 - 185.81.47.255 fr +185.81.48.0 - 185.81.51.255 lv +185.81.52.0 - 185.81.55.255 fr +185.81.56.0 - 185.81.59.255 pl +185.81.60.0 - 185.81.63.255 rs +185.81.64.0 - 185.81.67.255 ru +185.81.68.0 - 185.81.71.255 fi +185.81.72.0 - 185.81.75.255 ie +185.81.76.0 - 185.81.79.255 es +185.81.80.0 - 185.81.87.255 az +185.81.88.0 - 185.81.91.255 au +185.81.92.0 - 185.81.95.255 ge +185.81.96.0 - 185.81.99.255 ir +185.81.100.0 - 185.81.103.255 de +185.81.104.0 - 185.81.107.255 pl +185.81.108.0 - 185.81.111.255 se +185.81.112.0 - 185.81.113.255 gb +185.81.114.0 - 185.81.115.255 nl +185.81.116.0 - 185.81.119.255 dk +185.81.120.0 - 185.81.127.255 es +185.81.128.0 - 185.81.131.255 lv +185.81.132.0 - 185.81.135.255 es +185.81.136.0 - 185.81.136.15 nl +185.81.136.16 - 185.81.136.23 gb +185.81.136.24 - 185.81.136.31 at +185.81.136.32 - 185.81.136.39 dk +185.81.136.40 - 185.81.136.47 se +185.81.136.48 - 185.81.136.55 is +185.81.136.56 - 185.81.136.127 nl +185.81.136.128 - 185.81.136.191 gb +185.81.136.192 - 185.81.137.55 nl +185.81.137.56 - 185.81.137.63 ie +185.81.137.64 - 185.81.138.15 nl +185.81.138.16 - 185.81.138.23 gb +185.81.138.24 - 185.81.138.31 at +185.81.138.32 - 185.81.138.39 dk +185.81.138.40 - 185.81.138.47 se +185.81.138.48 - 185.81.138.55 ie +185.81.138.56 - 185.81.138.56 it +185.81.138.57 - 185.81.138.127 nl +185.81.138.128 - 185.81.138.191 be +185.81.138.192 - 185.81.139.15 nl +185.81.139.16 - 185.81.139.23 dk +185.81.139.24 - 185.81.139.31 se +185.81.139.32 - 185.81.139.39 it +185.81.139.40 - 185.81.139.47 dk +185.81.139.48 - 185.81.139.55 se +185.81.139.56 - 185.81.139.63 ie +185.81.139.64 - 185.81.139.255 nl +185.81.140.0 - 185.81.143.255 lb +185.81.144.0 - 185.81.147.255 ru +185.81.148.0 - 185.81.151.255 de +185.81.152.0 - 185.81.155.255 tr +185.81.156.0 - 185.81.159.255 fr +185.81.160.0 - 185.81.163.255 gb +185.81.164.0 - 185.81.167.255 ro +185.81.168.0 - 185.81.171.255 gb +185.81.172.0 - 185.81.175.255 ru +185.81.176.0 - 185.81.179.255 gb +185.81.180.0 - 185.81.183.255 es +185.81.184.0 - 185.81.187.255 ru +185.81.188.0 - 185.81.195.255 gb +185.81.196.0 - 185.81.199.255 gr +185.81.200.0 - 185.81.203.255 fr +185.81.204.0 - 185.81.215.255 at +185.81.216.0 - 185.81.219.255 az +185.81.220.0 - 185.81.223.255 ru +185.81.224.0 - 185.81.227.255 be +185.81.228.0 - 185.81.231.255 hr +185.81.232.0 - 185.81.235.255 gb +185.81.236.0 - 185.81.239.255 tr +185.81.240.0 - 185.81.243.255 at +185.81.244.0 - 185.81.247.255 gb +185.81.248.0 - 185.81.251.255 ru +185.81.252.0 - 185.81.255.255 gb +185.82.0.0 - 185.82.3.255 it +185.82.4.0 - 185.82.7.255 de +185.82.8.0 - 185.82.11.255 gb +185.82.12.0 - 185.82.15.255 ru +185.82.16.0 - 185.82.19.255 at +185.82.20.0 - 185.82.23.255 de +185.82.24.0 - 185.82.27.255 ru +185.82.28.0 - 185.82.31.255 ir +185.82.32.0 - 185.82.35.255 lb +185.82.36.0 - 185.82.39.255 bg +185.82.40.0 - 185.82.43.255 de +185.82.44.0 - 185.82.47.255 ie +185.82.48.0 - 185.82.51.255 gi +185.82.52.0 - 185.82.55.255 il +185.82.56.0 - 185.82.59.255 es +185.82.60.0 - 185.82.63.255 gb +185.82.64.0 - 185.82.67.255 ir +185.82.68.0 - 185.82.71.255 il +185.82.72.0 - 185.82.75.255 ie +185.82.76.0 - 185.82.79.255 gb +185.82.80.0 - 185.82.83.255 es +185.82.84.0 - 185.82.87.255 de +185.82.88.0 - 185.82.91.255 nl +185.82.92.0 - 185.82.95.255 lt +185.82.96.0 - 185.82.99.255 lb +185.82.100.0 - 185.82.103.255 ch +185.82.104.0 - 185.82.111.255 rs +185.82.112.0 - 185.82.115.255 it +185.82.116.0 - 185.82.119.255 sa +185.82.120.0 - 185.82.123.255 at +185.82.124.0 - 185.82.127.255 nl +185.82.128.0 - 185.82.131.255 ch +185.82.132.0 - 185.82.135.255 it +185.82.136.0 - 185.82.139.255 ir +185.82.140.0 - 185.82.143.255 nl +185.82.144.0 - 185.82.147.255 fi +185.82.148.0 - 185.82.151.255 fr +185.82.152.0 - 185.82.155.255 nl +185.82.156.0 - 185.82.159.255 gb +185.82.160.0 - 185.82.163.255 de +185.82.164.0 - 185.82.167.255 ir +185.82.168.0 - 185.82.171.255 it +185.82.172.0 - 185.82.175.255 ro +185.82.176.0 - 185.82.179.255 ru +185.82.180.0 - 185.82.183.255 ir +185.82.184.0 - 185.82.195.255 nl +185.82.196.0 - 185.82.199.255 gb +185.82.200.0 - 185.82.203.255 nl +185.82.204.0 - 185.82.207.255 ch +185.82.208.0 - 185.82.211.255 nl +185.82.212.0 - 185.82.215.255 cz +185.82.216.0 - 185.82.219.255 bg +185.82.220.0 - 185.82.223.255 tr +185.82.224.0 - 185.82.227.255 it +185.82.228.0 - 185.82.231.255 dk +185.82.232.0 - 185.82.235.255 hu +185.82.236.0 - 185.82.239.255 cz +185.82.240.0 - 185.82.243.255 ie +185.82.244.0 - 185.82.247.255 gb +185.82.248.0 - 185.82.251.255 pl +185.82.252.0 - 185.82.255.255 tr +185.83.0.0 - 185.83.3.255 ru +185.83.4.0 - 185.83.7.255 ee +185.83.8.0 - 185.83.11.255 nl +185.83.12.0 - 185.83.15.255 gb +185.83.16.0 - 185.83.23.255 no +185.83.24.0 - 185.83.27.255 fr +185.83.28.0 - 185.83.31.255 ir +185.83.32.0 - 185.83.35.255 nl +185.83.36.0 - 185.83.39.255 ge +185.83.40.0 - 185.83.43.255 gb +185.83.44.0 - 185.83.47.255 pl +185.83.48.0 - 185.83.51.255 be +185.83.52.0 - 185.83.55.255 gb +185.83.56.0 - 185.83.59.255 cz +185.83.60.0 - 185.83.63.255 ch +185.83.64.0 - 185.83.67.255 gb +185.83.68.0 - 185.83.71.255 fr +185.83.72.0 - 185.83.83.255 ir +185.83.84.0 - 185.83.87.255 gb +185.83.88.0 - 185.83.91.255 ir +185.83.92.0 - 185.83.95.255 se +185.83.96.0 - 185.83.99.255 fr +185.83.100.0 - 185.83.103.255 gb +185.83.104.0 - 185.83.107.255 es +185.83.108.0 - 185.83.111.255 ch +185.83.112.0 - 185.83.115.255 ir +185.83.116.0 - 185.83.119.255 fi +185.83.120.0 - 185.83.123.255 gb +185.83.124.0 - 185.83.127.255 az +185.83.128.0 - 185.83.131.255 gb +185.83.132.0 - 185.83.135.255 es +185.83.136.0 - 185.83.139.255 be +185.83.140.0 - 185.83.143.255 de +185.83.144.0 - 185.83.147.255 tr +185.83.148.0 - 185.83.151.255 gi +185.83.152.0 - 185.83.155.255 gb +185.83.156.0 - 185.83.159.255 us +185.83.160.0 - 185.83.163.255 es +185.83.164.0 - 185.83.167.255 no +185.83.168.0 - 185.83.171.255 gb +185.83.172.0 - 185.83.175.255 it +185.83.176.0 - 185.83.179.255 gb +185.83.180.0 - 185.83.187.255 ir +185.83.188.0 - 185.83.191.255 fr +185.83.192.0 - 185.83.195.255 no +185.83.196.0 - 185.83.203.255 ir +185.83.204.0 - 185.83.207.255 fi +185.83.208.0 - 185.83.211.255 ir +185.83.212.0 - 185.83.215.255 pt +185.83.216.0 - 185.83.219.255 nl +185.83.220.0 - 185.83.223.255 il +185.83.224.0 - 185.83.227.255 hu +185.83.228.0 - 185.83.231.255 de +185.83.232.0 - 185.83.235.255 ie +185.83.236.0 - 185.83.239.255 fr +185.83.240.0 - 185.83.243.255 ru +185.83.244.0 - 185.83.247.255 tr +185.83.248.0 - 185.83.251.255 pt +185.83.252.0 - 185.83.255.255 mk +185.84.0.0 - 185.84.3.255 nl +185.84.4.0 - 185.84.7.255 ch +185.84.8.0 - 185.84.11.255 ie +185.84.12.0 - 185.84.17.255 gb +185.84.18.0 - 185.84.18.255 fr +185.84.19.0 - 185.84.19.255 gb +185.84.20.0 - 185.84.23.255 de +185.84.24.0 - 185.84.27.255 be +185.84.28.0 - 185.84.31.255 se +185.84.32.0 - 185.84.35.255 ru +185.84.36.0 - 185.84.39.255 no +185.84.40.0 - 185.84.43.255 ru +185.84.44.0 - 185.84.47.255 es +185.84.48.0 - 185.84.51.255 ae +185.84.52.0 - 185.84.55.255 se +185.84.56.0 - 185.84.59.255 de +185.84.60.0 - 185.84.63.255 dk +185.84.64.0 - 185.84.67.255 ro +185.84.68.0 - 185.84.71.255 iq +185.84.72.0 - 185.84.75.255 nl +185.84.76.0 - 185.84.79.255 ch +185.84.80.0 - 185.84.83.255 de +185.84.84.0 - 185.84.87.255 gb +185.84.88.0 - 185.84.91.255 it +185.84.92.0 - 185.84.95.255 gb +185.84.96.0 - 185.84.99.255 it +185.84.100.0 - 185.84.103.255 si +185.84.104.0 - 185.84.107.255 lb +185.84.108.0 - 185.84.111.255 ru +185.84.112.0 - 185.84.115.255 fr +185.84.116.0 - 185.84.119.255 es +185.84.120.0 - 185.84.123.255 de +185.84.124.0 - 185.84.127.255 gr +185.84.128.0 - 185.84.131.255 es +185.84.132.0 - 185.84.135.255 dk +185.84.136.0 - 185.84.139.255 pl +185.84.140.0 - 185.84.143.255 nl +185.84.144.0 - 185.84.147.255 ba +185.84.148.0 - 185.84.151.255 ua +185.84.152.0 - 185.84.155.255 cz +185.84.156.0 - 185.84.159.255 ru +185.84.160.0 - 185.84.163.255 ir +185.84.164.0 - 185.84.167.255 sa +185.84.168.0 - 185.84.171.255 it +185.84.172.0 - 185.84.175.255 ru +185.84.176.0 - 185.84.179.255 it +185.84.180.0 - 185.84.183.255 tr +185.84.184.0 - 185.84.191.255 ru +185.84.192.0 - 185.84.195.255 ch +185.84.196.0 - 185.84.199.255 nl +185.84.200.0 - 185.84.203.255 gb +185.84.204.0 - 185.84.207.255 es +185.84.208.0 - 185.84.211.255 ch +185.84.212.0 - 185.84.215.255 se +185.84.216.0 - 185.84.219.255 de +185.84.220.0 - 185.84.223.255 ir +185.84.224.0 - 185.84.227.255 lb +185.84.228.0 - 185.84.231.255 it +185.84.232.0 - 185.84.235.255 cz +185.84.236.0 - 185.84.239.255 sy +185.84.240.0 - 185.84.243.255 se +185.84.244.0 - 185.84.247.255 ru +185.84.248.0 - 185.84.251.255 se +185.84.252.0 - 185.84.255.255 ie +185.85.0.0 - 185.85.3.255 de +185.85.4.0 - 185.85.7.255 dk +185.85.8.0 - 185.85.15.255 ru +185.85.16.0 - 185.85.19.255 nl +185.85.20.0 - 185.85.27.255 it +185.85.28.0 - 185.85.35.255 at +185.85.36.0 - 185.85.39.255 sk +185.85.40.0 - 185.85.43.255 gb +185.85.44.0 - 185.85.47.255 dk +185.85.48.0 - 185.85.51.255 de +185.85.52.0 - 185.85.55.255 fi +185.85.56.0 - 185.85.63.255 gb +185.85.64.0 - 185.85.67.255 at +185.85.68.0 - 185.85.71.255 ir +185.85.72.0 - 185.85.75.255 tr +185.85.76.0 - 185.85.79.255 fr +185.85.80.0 - 185.85.83.255 nl +185.85.84.0 - 185.85.91.255 gb +185.85.92.0 - 185.85.95.255 cz +185.85.96.0 - 185.85.99.255 gb +185.85.100.0 - 185.85.103.255 se +185.85.104.0 - 185.85.107.255 tr +185.85.108.0 - 185.85.111.255 ch +185.85.112.0 - 185.85.115.255 nl +185.85.116.0 - 185.85.119.255 gb +185.85.120.0 - 185.85.123.255 ru +185.85.124.0 - 185.85.127.255 ch +185.85.128.0 - 185.85.131.255 no +185.85.132.0 - 185.85.135.255 de +185.85.136.0 - 185.85.139.255 ir +185.85.140.0 - 185.85.143.255 nl +185.85.144.0 - 185.85.147.255 ch +185.85.148.0 - 185.85.151.255 si +185.85.152.0 - 185.85.155.255 al +185.85.156.0 - 185.85.159.255 se +185.85.160.0 - 185.85.163.255 de +185.85.164.0 - 185.85.167.255 cz +185.85.168.0 - 185.85.171.255 ch +185.85.172.0 - 185.85.175.255 be +185.85.176.0 - 185.85.183.255 ro +185.85.184.0 - 185.85.187.255 gb +185.85.188.0 - 185.85.191.255 tr +185.85.192.0 - 185.85.195.255 it +185.85.196.0 - 185.85.199.255 ua +185.85.200.0 - 185.85.203.255 ro +185.85.204.0 - 185.85.207.255 tr +185.85.208.0 - 185.85.211.255 ir +185.85.212.0 - 185.85.215.255 it +185.85.216.0 - 185.85.219.255 ru +185.85.220.0 - 185.85.223.255 de +185.85.224.0 - 185.85.227.255 fr +185.85.228.0 - 185.85.231.255 ch +185.85.232.0 - 185.85.235.255 fr +185.85.236.0 - 185.85.239.255 tr +185.85.240.0 - 185.85.243.255 fr +185.85.244.0 - 185.85.247.255 gb +185.85.248.0 - 185.85.251.255 ch +185.85.252.0 - 185.85.255.255 it +185.86.0.0 - 185.86.3.255 ua +185.86.4.0 - 185.86.7.255 tr +185.86.8.0 - 185.86.11.255 es +185.86.12.0 - 185.86.15.255 tr +185.86.16.0 - 185.86.19.255 be +185.86.20.0 - 185.86.23.255 gb +185.86.24.0 - 185.86.27.255 at +185.86.28.0 - 185.86.31.255 ch +185.86.32.0 - 185.86.35.255 es +185.86.36.0 - 185.86.39.255 ir +185.86.40.0 - 185.86.41.255 il +185.86.42.0 - 185.86.43.255 it +185.86.44.0 - 185.86.47.255 mt +185.86.48.0 - 185.86.55.255 fr +185.86.56.0 - 185.86.59.255 ua +185.86.60.0 - 185.86.63.255 sm +185.86.64.0 - 185.86.67.255 ro +185.86.68.0 - 185.86.71.255 dk +185.86.72.0 - 185.86.75.255 es +185.86.76.0 - 185.86.79.255 ua +185.86.80.0 - 185.86.83.255 tr +185.86.84.0 - 185.86.87.255 it +185.86.88.0 - 185.86.91.255 fr +185.86.92.0 - 185.86.95.255 ru +185.86.96.0 - 185.86.99.255 cz +185.86.100.0 - 185.86.107.255 se +185.86.108.0 - 185.86.111.255 gb +185.86.112.0 - 185.86.127.255 ru +185.86.128.0 - 185.86.131.255 it +185.86.132.0 - 185.86.135.255 ru +185.86.136.0 - 185.86.139.255 fr +185.86.140.0 - 185.86.143.255 ps +185.86.144.0 - 185.86.147.255 ru +185.86.148.0 - 185.86.150.255 se +185.86.151.0 - 185.86.151.255 gb +185.86.152.0 - 185.86.155.255 tr +185.86.156.0 - 185.86.159.255 de +185.86.160.0 - 185.86.163.255 lb +185.86.164.0 - 185.86.167.255 tr +185.86.168.0 - 185.86.171.255 fr +185.86.172.0 - 185.86.175.255 de +185.86.176.0 - 185.86.179.255 fr +185.86.180.0 - 185.86.183.255 ir +185.86.184.0 - 185.86.184.162 gb +185.86.184.163 - 185.86.184.163 es +185.86.184.164 - 185.86.184.191 gb +185.86.184.192 - 185.86.184.255 es +185.86.185.0 - 185.86.185.255 gb +185.86.186.0 - 185.86.186.127 es +185.86.186.128 - 185.86.187.255 gb +185.86.188.0 - 185.86.191.255 de +185.86.192.0 - 185.86.195.255 am +185.86.196.0 - 185.86.199.255 fr +185.86.200.0 - 185.86.203.255 it +185.86.204.0 - 185.86.207.255 il +185.86.208.0 - 185.86.215.255 es +185.86.216.0 - 185.86.219.255 gb +185.86.220.0 - 185.86.223.255 is +185.86.224.0 - 185.86.231.255 ch +185.86.232.0 - 185.86.235.255 de +185.86.236.0 - 185.86.239.255 mk +185.86.240.0 - 185.86.243.255 rs +185.86.244.0 - 185.86.247.255 tr +185.86.248.0 - 185.86.251.255 es +185.86.252.0 - 185.86.255.255 fr +185.87.0.0 - 185.87.3.255 de +185.87.4.0 - 185.87.7.255 be +185.87.8.0 - 185.87.11.255 nl +185.87.12.0 - 185.87.15.255 gb +185.87.16.0 - 185.87.19.255 at +185.87.20.0 - 185.87.23.255 de +185.87.24.0 - 185.87.27.255 tr +185.87.28.0 - 185.87.31.255 it +185.87.32.0 - 185.87.35.255 gb +185.87.36.0 - 185.87.47.255 ad +185.87.48.0 - 185.87.51.255 ru +185.87.52.0 - 185.87.55.255 no +185.87.56.0 - 185.87.63.255 gb +185.87.64.0 - 185.87.67.255 lb +185.87.68.0 - 185.87.71.255 it +185.87.72.0 - 185.87.75.255 de +185.87.76.0 - 185.87.79.255 it +185.87.80.0 - 185.87.83.255 dk +185.87.84.0 - 185.87.87.255 es +185.87.88.0 - 185.87.95.255 fr +185.87.96.0 - 185.87.99.255 es +185.87.100.0 - 185.87.103.255 fr +185.87.104.0 - 185.87.107.255 nl +185.87.108.0 - 185.87.111.255 fi +185.87.112.0 - 185.87.115.255 ch +185.87.116.0 - 185.87.119.255 nl +185.87.120.0 - 185.87.123.255 tr +185.87.124.0 - 185.87.127.255 be +185.87.128.0 - 185.87.131.255 es +185.87.132.0 - 185.87.135.255 de +185.87.136.0 - 185.87.139.255 pl +185.87.140.0 - 185.87.143.255 cz +185.87.144.0 - 185.87.147.255 pl +185.87.148.0 - 185.87.151.255 gb +185.87.152.0 - 185.87.159.255 nl +185.87.160.0 - 185.87.163.255 il +185.87.164.0 - 185.87.167.255 se +185.87.168.0 - 185.87.171.255 lb +185.87.172.0 - 185.87.175.255 tr +185.87.176.0 - 185.87.179.255 de +185.87.180.0 - 185.87.183.255 ir +185.87.184.0 - 185.87.187.255 nl +185.87.188.0 - 185.87.191.255 es +185.87.192.0 - 185.87.199.255 ru +185.87.200.0 - 185.87.203.255 nl +185.87.204.0 - 185.87.207.255 lv +185.87.208.0 - 185.87.215.255 gb +185.87.216.0 - 185.87.219.255 ee +185.87.220.0 - 185.87.223.255 gb +185.87.224.0 - 185.87.227.255 de +185.87.228.0 - 185.87.231.255 fr +185.87.232.0 - 185.87.235.255 pl +185.87.236.0 - 185.87.239.255 at +185.87.240.0 - 185.87.243.255 it +185.87.244.0 - 185.87.247.255 fi +185.87.248.0 - 185.87.251.255 nl +185.87.252.0 - 185.87.255.255 tr +185.88.0.0 - 185.88.3.255 es +185.88.4.0 - 185.88.7.255 tr +185.88.8.0 - 185.88.11.255 ru +185.88.12.0 - 185.88.15.255 cz +185.88.16.0 - 185.88.19.255 pt +185.88.20.0 - 185.88.23.255 gr +185.88.24.0 - 185.88.27.255 iq +185.88.28.0 - 185.88.31.255 ro +185.88.32.0 - 185.88.35.255 kg +185.88.36.0 - 185.88.39.255 ru +185.88.40.0 - 185.88.43.255 no +185.88.44.0 - 185.88.47.255 gb +185.88.48.0 - 185.88.51.255 ir +185.88.52.0 - 185.88.55.255 es +185.88.56.0 - 185.88.59.255 gb +185.88.60.0 - 185.88.63.255 de +185.88.64.0 - 185.88.67.255 nl +185.88.68.0 - 185.88.71.255 es +185.88.72.0 - 185.88.75.255 cz +185.88.76.0 - 185.88.79.255 ch +185.88.80.0 - 185.88.83.255 ps +185.88.84.0 - 185.88.87.255 it +185.88.88.0 - 185.88.91.255 ps +185.88.92.0 - 185.88.95.255 de +185.88.96.0 - 185.88.103.255 ru +185.88.104.0 - 185.88.107.255 fr +185.88.108.0 - 185.88.111.255 gb +185.88.112.0 - 185.88.115.255 se +185.88.116.0 - 185.88.119.255 ch +185.88.120.0 - 185.88.123.255 be +185.88.124.0 - 185.88.127.255 ru +185.88.128.0 - 185.88.131.255 ro +185.88.132.0 - 185.88.135.255 nl +185.88.136.0 - 185.88.139.255 se +185.88.140.0 - 185.88.143.255 nl +185.88.144.0 - 185.88.147.255 de +185.88.148.0 - 185.88.151.255 nl +185.88.152.0 - 185.88.155.255 ir +185.88.156.0 - 185.88.163.255 ru +185.88.164.0 - 185.88.167.255 nl +185.88.168.0 - 185.88.171.255 it +185.88.172.0 - 185.88.175.255 tr +185.88.176.0 - 185.88.179.255 ir +185.88.180.0 - 185.88.183.255 nl +185.88.184.0 - 185.88.187.255 it +185.88.188.0 - 185.88.191.255 nl +185.88.192.0 - 185.88.195.255 gb +185.88.196.0 - 185.88.199.255 fr +185.88.200.0 - 185.88.203.255 es +185.88.204.0 - 185.88.207.255 it +185.88.208.0 - 185.88.211.255 ru +185.88.212.0 - 185.88.215.255 de +185.88.216.0 - 185.88.219.255 gb +185.88.220.0 - 185.88.227.255 de +185.88.228.0 - 185.88.231.255 fo +185.88.232.0 - 185.88.235.255 es +185.88.236.0 - 185.88.239.255 ch +185.88.240.0 - 185.88.243.255 it +185.88.244.0 - 185.88.247.255 de +185.88.248.0 - 185.88.251.255 cz +185.88.252.0 - 185.88.255.255 ir +185.89.0.0 - 185.89.3.255 no +185.89.4.0 - 185.89.7.255 nl +185.89.8.0 - 185.89.15.255 ru +185.89.16.0 - 185.89.19.255 nl +185.89.20.0 - 185.89.23.255 us +185.89.24.0 - 185.89.27.255 de +185.89.28.0 - 185.89.31.255 es +185.89.32.0 - 185.89.35.255 gb +185.89.36.0 - 185.89.39.255 de +185.89.40.0 - 185.89.43.255 ru +185.89.44.0 - 185.89.47.255 it +185.89.48.0 - 185.89.51.255 lv +185.89.52.0 - 185.89.55.255 fi +185.89.56.0 - 185.89.59.255 de +185.89.60.0 - 185.89.63.255 es +185.89.64.0 - 185.89.67.255 pl +185.89.68.0 - 185.89.71.255 fr +185.89.72.0 - 185.89.75.255 ie +185.89.76.0 - 185.89.78.255 nl +185.89.79.0 - 185.89.79.255 ru +185.89.80.0 - 185.89.83.255 nl +185.89.84.0 - 185.89.87.255 lb +185.89.88.0 - 185.89.91.255 iq +185.89.92.0 - 185.89.95.255 no +185.89.96.0 - 185.89.99.255 us +185.89.100.0 - 185.89.100.127 de +185.89.100.128 - 185.89.100.255 eu +185.89.101.0 - 185.89.101.255 ru +185.89.102.0 - 185.89.103.255 ua +185.89.104.0 - 185.89.111.255 ru +185.89.112.0 - 185.89.115.255 ir +185.89.116.0 - 185.89.119.255 cz +185.89.120.0 - 185.89.123.255 gb +185.89.124.0 - 185.89.127.255 iq +185.89.128.0 - 185.89.131.255 fr +185.89.132.0 - 185.89.135.255 nl +185.89.136.0 - 185.89.139.255 mt +185.89.140.0 - 185.89.143.255 gb +185.89.144.0 - 185.89.147.255 ch +185.89.148.0 - 185.89.151.255 at +185.89.152.0 - 185.89.155.255 nl +185.89.156.0 - 185.89.159.255 al +185.89.160.0 - 185.89.163.255 at +185.89.164.0 - 185.89.171.255 fr +185.89.172.0 - 185.89.175.255 nl +185.89.176.0 - 185.89.179.255 pl +185.89.180.0 - 185.89.183.255 it +185.89.184.0 - 185.89.187.255 pl +185.89.188.0 - 185.89.191.255 ch +185.89.192.0 - 185.89.195.255 pt +185.89.196.0 - 185.89.199.255 de +185.89.200.0 - 185.89.203.255 ch +185.89.204.0 - 185.89.207.255 gb +185.89.208.0 - 185.89.211.255 de +185.89.212.0 - 185.89.215.255 hr +185.89.216.0 - 185.89.216.255 us +185.89.217.0 - 185.89.217.255 nl +185.89.218.0 - 185.89.218.255 sg +185.89.219.0 - 185.89.219.255 hk +185.89.220.0 - 185.89.223.255 fr +185.89.224.0 - 185.89.231.255 de +185.89.232.0 - 185.89.235.255 be +185.89.236.0 - 185.89.239.255 mt +185.89.240.0 - 185.89.243.255 ro +185.89.244.0 - 185.89.247.255 mk +185.89.248.0 - 185.89.251.255 nl +185.89.252.0 - 185.89.255.255 ch +185.90.0.0 - 185.90.3.255 gb +185.90.4.0 - 185.90.7.255 tr +185.90.8.0 - 185.90.11.255 it +185.90.12.0 - 185.90.15.255 gb +185.90.16.0 - 185.90.19.255 sa +185.90.20.0 - 185.90.23.255 at +185.90.24.0 - 185.90.27.255 se +185.90.28.0 - 185.90.31.255 es +185.90.32.0 - 185.90.35.255 gb +185.90.36.0 - 185.90.39.255 ch +185.90.40.0 - 185.90.43.255 at +185.90.44.0 - 185.90.47.255 cy +185.90.48.0 - 185.90.51.255 de +185.90.52.0 - 185.90.55.255 dk +185.90.56.0 - 185.90.59.255 pt +185.90.60.0 - 185.90.60.255 gb +185.90.61.0 - 185.90.61.255 fi +185.90.62.0 - 185.90.62.255 de +185.90.63.0 - 185.90.63.255 ca +185.90.64.0 - 185.90.67.255 dk +185.90.68.0 - 185.90.71.255 it +185.90.72.0 - 185.90.75.255 kz +185.90.76.0 - 185.90.79.255 ie +185.90.80.0 - 185.90.83.255 tr +185.90.84.0 - 185.90.87.255 hu +185.90.88.0 - 185.90.91.255 sa +185.90.92.0 - 185.90.95.255 at +185.90.96.0 - 185.90.99.255 fr +185.90.100.0 - 185.90.103.255 ru +185.90.104.0 - 185.90.107.255 iq +185.90.108.0 - 185.90.111.255 ch +185.90.112.0 - 185.90.115.255 dk +185.90.116.0 - 185.90.119.255 it +185.90.120.0 - 185.90.123.255 gb +185.90.124.0 - 185.90.127.255 ps +185.90.128.0 - 185.90.131.255 de +185.90.132.0 - 185.90.135.255 rs +185.90.136.0 - 185.90.139.255 nl +185.90.140.0 - 185.90.143.255 gb +185.90.144.0 - 185.90.147.255 ru +185.90.148.0 - 185.90.151.255 es +185.90.152.0 - 185.90.155.255 ch +185.90.156.0 - 185.90.163.255 de +185.90.164.0 - 185.90.167.255 sk +185.90.168.0 - 185.90.171.255 lb +185.90.172.0 - 185.90.175.255 de +185.90.176.0 - 185.90.179.255 se +185.90.180.0 - 185.90.183.255 no +185.90.184.0 - 185.90.187.255 be +185.90.188.0 - 185.90.191.255 it +185.90.192.0 - 185.90.195.255 gb +185.90.196.0 - 185.90.199.255 nl +185.90.200.0 - 185.90.203.255 de +185.90.204.0 - 185.90.211.255 es +185.90.212.0 - 185.90.215.255 no +185.90.216.0 - 185.90.219.255 gb +185.90.220.0 - 185.90.223.255 nl +185.90.224.0 - 185.90.227.255 ru +185.90.228.0 - 185.90.235.255 de +185.90.236.0 - 185.90.239.255 hu +185.90.240.0 - 185.90.243.255 tr +185.90.244.0 - 185.90.246.255 de +185.90.247.0 - 185.90.247.255 us +185.90.248.0 - 185.90.251.255 az +185.90.252.0 - 185.90.255.255 es +185.91.0.0 - 185.91.3.255 mt +185.91.4.0 - 185.91.7.255 de +185.91.8.0 - 185.91.11.255 gb +185.91.12.0 - 185.91.15.255 nl +185.91.16.0 - 185.91.19.255 iq +185.91.20.0 - 185.91.23.255 gb +185.91.24.0 - 185.91.27.255 de +185.91.28.0 - 185.91.31.255 nl +185.91.32.0 - 185.91.35.255 at +185.91.36.0 - 185.91.39.255 fr +185.91.40.0 - 185.91.43.255 gb +185.91.44.0 - 185.91.51.255 de +185.91.52.0 - 185.91.55.255 ru +185.91.56.0 - 185.91.63.255 it +185.91.64.0 - 185.91.67.255 no +185.91.68.0 - 185.91.71.255 es +185.91.72.0 - 185.91.75.255 ua +185.91.76.0 - 185.91.79.255 gb +185.91.80.0 - 185.91.83.255 at +185.91.84.0 - 185.91.87.255 gb +185.91.88.0 - 185.91.91.255 fr +185.91.92.0 - 185.91.95.255 nl +185.91.96.0 - 185.91.99.255 lb +185.91.100.0 - 185.91.103.255 gb +185.91.104.0 - 185.91.107.255 de +185.91.108.0 - 185.91.111.255 es +185.91.112.0 - 185.91.115.255 gb +185.91.116.0 - 185.91.119.255 cz +185.91.120.0 - 185.91.131.255 gb +185.91.132.0 - 185.91.135.255 kg +185.91.136.0 - 185.91.139.255 es +185.91.140.0 - 185.91.143.255 hu +185.91.144.0 - 185.91.147.255 at +185.91.148.0 - 185.91.151.255 it +185.91.152.0 - 185.91.155.255 no +185.91.156.0 - 185.91.159.255 ba +185.91.160.0 - 185.91.163.255 it +185.91.164.0 - 185.91.171.255 cz +185.91.172.0 - 185.91.183.255 ru +185.91.184.0 - 185.91.187.255 hu +185.91.188.0 - 185.91.191.255 it +185.91.192.0 - 185.91.195.255 es +185.91.196.0 - 185.91.199.255 de +185.91.200.0 - 185.91.203.255 sk +185.91.204.0 - 185.91.207.255 cz +185.91.208.0 - 185.91.211.255 az +185.91.212.0 - 185.91.215.255 pl +185.91.216.0 - 185.91.219.255 gb +185.91.220.0 - 185.91.227.255 fr +185.91.228.0 - 185.91.231.255 es +185.91.232.0 - 185.91.235.255 fr +185.91.236.0 - 185.91.239.255 gb +185.91.240.0 - 185.91.243.255 it +185.91.244.0 - 185.91.247.255 de +185.91.248.0 - 185.91.251.255 nl +185.91.252.0 - 185.91.255.255 ru +185.92.0.0 - 185.92.3.255 tr +185.92.4.0 - 185.92.11.255 ir +185.92.12.0 - 185.92.15.255 tr +185.92.16.0 - 185.92.19.255 nl +185.92.20.0 - 185.92.23.255 fr +185.92.24.0 - 185.92.27.255 gb +185.92.28.0 - 185.92.31.255 ir +185.92.32.0 - 185.92.35.255 ru +185.92.36.0 - 185.92.39.255 fr +185.92.40.0 - 185.92.43.255 ir +185.92.44.0 - 185.92.47.255 es +185.92.48.0 - 185.92.51.255 pl +185.92.52.0 - 185.92.55.255 no +185.92.56.0 - 185.92.59.255 ge +185.92.60.0 - 185.92.63.255 nl +185.92.64.0 - 185.92.67.255 ch +185.92.68.0 - 185.92.75.255 nl +185.92.76.0 - 185.92.79.255 de +185.92.80.0 - 185.92.83.255 es +185.92.84.0 - 185.92.87.255 am +185.92.88.0 - 185.92.91.255 sy +185.92.92.0 - 185.92.95.255 es +185.92.96.0 - 185.92.99.255 pt +185.92.100.0 - 185.92.103.255 at +185.92.104.0 - 185.92.107.255 it +185.92.108.0 - 185.92.111.255 es +185.92.112.0 - 185.92.115.255 fi +185.92.116.0 - 185.92.119.255 hu +185.92.120.0 - 185.92.121.255 de +185.92.122.0 - 185.92.122.255 gb +185.92.123.0 - 185.92.123.255 de +185.92.124.0 - 185.92.127.255 gb +185.92.128.0 - 185.92.131.255 ie +185.92.132.0 - 185.92.135.255 bg +185.92.136.0 - 185.92.139.255 ua +185.92.140.0 - 185.92.143.255 ru +185.92.144.0 - 185.92.147.255 ua +185.92.148.0 - 185.92.151.255 nl +185.92.152.0 - 185.92.155.255 de +185.92.156.0 - 185.92.159.255 pl +185.92.160.0 - 185.92.163.255 de +185.92.164.0 - 185.92.167.255 it +185.92.168.0 - 185.92.171.255 de +185.92.172.0 - 185.92.175.255 gb +185.92.176.0 - 185.92.179.255 si +185.92.180.0 - 185.92.183.255 de +185.92.184.0 - 185.92.187.255 ru +185.92.188.0 - 185.92.191.255 de +185.92.192.0 - 185.92.195.255 ro +185.92.196.0 - 185.92.199.255 be +185.92.200.0 - 185.92.203.255 at +185.92.204.0 - 185.92.207.255 de +185.92.208.0 - 185.92.211.255 ch +185.92.212.0 - 185.92.215.255 tr +185.92.216.0 - 185.92.219.255 cz +185.92.220.0 - 185.92.223.255 nl +185.92.224.0 - 185.92.227.255 az +185.92.228.0 - 185.92.228.255 si +185.92.229.0 - 185.92.229.255 se +185.92.230.0 - 185.92.235.255 si +185.92.236.0 - 185.92.239.255 es +185.92.240.0 - 185.92.243.255 dk +185.92.244.0 - 185.92.247.255 es +185.92.248.0 - 185.92.251.255 pl +185.92.252.0 - 185.92.255.255 gb +185.93.0.0 - 185.93.0.255 us +185.93.1.0 - 185.93.3.255 cz +185.93.4.0 - 185.93.7.255 fr +185.93.8.0 - 185.93.11.255 at +185.93.12.0 - 185.93.15.255 nl +185.93.16.0 - 185.93.19.255 be +185.93.20.0 - 185.93.23.255 gl +185.93.24.0 - 185.93.27.255 nl +185.93.28.0 - 185.93.31.255 gb +185.93.32.0 - 185.93.34.255 pl +185.93.35.0 - 185.93.35.255 ru +185.93.36.0 - 185.93.39.255 fr +185.93.40.0 - 185.93.43.255 ru +185.93.44.0 - 185.93.47.255 es +185.93.48.0 - 185.93.51.255 fi +185.93.52.0 - 185.93.55.255 tr +185.93.56.0 - 185.93.59.255 de +185.93.60.0 - 185.93.63.255 cz +185.93.64.0 - 185.93.67.255 hu +185.93.68.0 - 185.93.71.255 tr +185.93.72.0 - 185.93.75.255 pl +185.93.76.0 - 185.93.79.255 nl +185.93.80.0 - 185.93.83.255 es +185.93.84.0 - 185.93.87.255 dk +185.93.88.0 - 185.93.91.255 gb +185.93.92.0 - 185.93.95.255 pl +185.93.96.0 - 185.93.99.255 ro +185.93.100.0 - 185.93.103.255 rs +185.93.104.0 - 185.93.107.255 si +185.93.108.0 - 185.93.111.255 ru +185.93.112.0 - 185.93.115.255 es +185.93.116.0 - 185.93.119.255 de +185.93.120.0 - 185.93.123.255 es +185.93.124.0 - 185.93.127.255 uz +185.93.128.0 - 185.93.131.255 fr +185.93.132.0 - 185.93.135.255 pl +185.93.136.0 - 185.93.143.255 de +185.93.144.0 - 185.93.147.255 it +185.93.148.0 - 185.93.151.255 ie +185.93.152.0 - 185.93.155.255 es +185.93.156.0 - 185.93.159.255 is +185.93.160.0 - 185.93.163.255 se +185.93.164.0 - 185.93.167.255 ir +185.93.168.0 - 185.93.175.255 gb +185.93.176.0 - 185.93.179.255 it +185.93.180.0 - 185.93.180.79 gb +185.93.180.80 - 185.93.180.95 de +185.93.180.96 - 185.93.180.127 gb +185.93.180.128 - 185.93.180.143 de +185.93.180.144 - 185.93.180.255 gb +185.93.181.0 - 185.93.181.15 fr +185.93.181.16 - 185.93.181.31 gb +185.93.181.32 - 185.93.181.39 it +185.93.181.40 - 185.93.181.63 gb +185.93.181.64 - 185.93.181.71 es +185.93.181.72 - 185.93.181.135 gb +185.93.181.136 - 185.93.181.143 de +185.93.181.144 - 185.93.181.191 es +185.93.181.192 - 185.93.181.255 gb +185.93.182.0 - 185.93.182.255 es +185.93.183.0 - 185.93.183.255 it +185.93.184.0 - 185.93.187.255 ua +185.93.188.0 - 185.93.191.255 de +185.93.192.0 - 185.93.195.255 dk +185.93.196.0 - 185.93.199.255 ae +185.93.200.0 - 185.93.203.255 de +185.93.204.0 - 185.93.207.255 it +185.93.208.0 - 185.93.211.255 ru +185.93.212.0 - 185.93.215.255 at +185.93.216.0 - 185.93.223.255 ch +185.93.224.0 - 185.93.227.255 es +185.93.228.0 - 185.93.231.255 gb +185.93.232.0 - 185.93.235.255 es +185.93.236.0 - 185.93.239.255 de +185.93.240.0 - 185.93.243.255 pl +185.93.244.0 - 185.93.247.255 ae +185.93.248.0 - 185.93.251.255 tr +185.93.252.0 - 185.93.255.255 ru +185.94.0.0 - 185.94.3.255 lu +185.94.4.0 - 185.94.7.255 cz +185.94.8.0 - 185.94.11.255 ch +185.94.12.0 - 185.94.15.255 se +185.94.16.0 - 185.94.16.255 it +185.94.17.0 - 185.94.18.255 gb +185.94.19.0 - 185.94.19.255 de +185.94.20.0 - 185.94.23.255 it +185.94.24.0 - 185.94.27.255 de +185.94.28.0 - 185.94.28.255 us +185.94.29.0 - 185.94.29.255 nl +185.94.30.0 - 185.94.30.255 ca +185.94.31.0 - 185.94.31.0 gb +185.94.31.1 - 185.94.31.1 us +185.94.31.2 - 185.94.31.4 gb +185.94.31.5 - 185.94.31.5 it +185.94.31.6 - 185.94.31.8 gb +185.94.31.9 - 185.94.31.9 us +185.94.31.10 - 185.94.31.11 gb +185.94.31.12 - 185.94.31.12 hk +185.94.31.13 - 185.94.31.39 gb +185.94.31.40 - 185.94.31.40 mx +185.94.31.41 - 185.94.31.79 gb +185.94.31.80 - 185.94.31.80 sg +185.94.31.81 - 185.94.31.95 gb +185.94.31.96 - 185.94.31.96 us +185.94.31.97 - 185.94.31.99 gb +185.94.31.100 - 185.94.31.100 us +185.94.31.101 - 185.94.31.191 gb +185.94.31.192 - 185.94.31.192 hk +185.94.31.193 - 185.94.31.203 gb +185.94.31.204 - 185.94.31.204 au +185.94.31.205 - 185.94.31.211 gb +185.94.31.212 - 185.94.31.212 au +185.94.31.213 - 185.94.31.251 gb +185.94.31.252 - 185.94.31.252 ca +185.94.31.253 - 185.94.31.255 gb +185.94.32.0 - 185.94.35.255 ru +185.94.36.0 - 185.94.39.255 de +185.94.40.0 - 185.94.43.255 be +185.94.44.0 - 185.94.47.255 ie +185.94.48.0 - 185.94.51.255 es +185.94.52.0 - 185.94.55.255 cz +185.94.56.0 - 185.94.59.255 fr +185.94.60.0 - 185.94.63.255 se +185.94.64.0 - 185.94.67.255 ru +185.94.68.0 - 185.94.71.255 pl +185.94.72.0 - 185.94.75.255 se +185.94.76.0 - 185.94.79.255 gi +185.94.80.0 - 185.94.83.255 it +185.94.84.0 - 185.94.87.255 nl +185.94.88.0 - 185.94.91.255 it +185.94.92.0 - 185.94.95.255 nl +185.94.96.0 - 185.94.99.255 ir +185.94.100.0 - 185.94.103.255 ch +185.94.104.0 - 185.94.107.255 de +185.94.108.0 - 185.94.111.255 ru +185.94.112.0 - 185.94.115.255 ee +185.94.116.0 - 185.94.119.255 gb +185.94.120.0 - 185.94.123.255 nl +185.94.124.0 - 185.94.127.255 gb +185.94.128.0 - 185.94.131.255 se +185.94.132.0 - 185.94.135.255 it +185.94.136.0 - 185.94.139.255 be +185.94.140.0 - 185.94.143.255 fr +185.94.144.0 - 185.94.151.255 ch +185.94.152.0 - 185.94.155.255 ru +185.94.156.0 - 185.94.159.255 sk +185.94.160.0 - 185.94.163.255 it +185.94.164.0 - 185.94.167.255 ru +185.94.168.0 - 185.94.171.255 nl +185.94.172.0 - 185.94.175.255 ru +185.94.176.0 - 185.94.179.255 gb +185.94.180.0 - 185.94.183.255 nl +185.94.184.0 - 185.94.187.255 gb +185.94.188.0 - 185.94.188.255 nl +185.94.189.0 - 185.94.189.255 fr +185.94.190.0 - 185.94.190.255 hu +185.94.191.0 - 185.94.195.255 gb +185.94.196.0 - 185.94.199.255 nl +185.94.200.0 - 185.94.203.255 ie +185.94.204.0 - 185.94.207.255 gb +185.94.208.0 - 185.94.211.255 nl +185.94.212.0 - 185.94.219.255 ua +185.94.220.0 - 185.94.223.255 fr +185.94.224.0 - 185.94.227.255 ru +185.94.228.0 - 185.94.231.255 fr +185.94.232.0 - 185.94.235.255 gb +185.94.236.0 - 185.94.239.255 nl +185.94.240.0 - 185.94.243.255 no +185.94.244.0 - 185.94.247.255 nl +185.94.248.0 - 185.94.251.255 es +185.94.252.0 - 185.94.255.255 de +185.95.0.0 - 185.95.3.255 tr +185.95.4.0 - 185.95.7.255 kw +185.95.8.0 - 185.95.11.255 fr +185.95.12.0 - 185.95.15.255 ru +185.95.16.0 - 185.95.19.255 gb +185.95.20.0 - 185.95.23.255 ua +185.95.24.0 - 185.95.27.255 ru +185.95.28.0 - 185.95.31.255 nl +185.95.32.0 - 185.95.35.255 de +185.95.36.0 - 185.95.39.255 it +185.95.40.0 - 185.95.43.255 ie +185.95.44.0 - 185.95.47.255 nl +185.95.48.0 - 185.95.51.255 gb +185.95.52.0 - 185.95.55.255 it +185.95.56.0 - 185.95.59.255 es +185.95.60.0 - 185.95.63.255 ir +185.95.64.0 - 185.95.67.255 be +185.95.68.0 - 185.95.71.255 nl +185.95.72.0 - 185.95.75.255 be +185.95.76.0 - 185.95.79.255 gb +185.95.80.0 - 185.95.83.255 de +185.95.84.0 - 185.95.87.255 tr +185.95.88.0 - 185.95.95.255 se +185.95.96.0 - 185.95.99.255 de +185.95.100.0 - 185.95.107.255 ru +185.95.108.0 - 185.95.111.255 gb +185.95.112.0 - 185.95.115.255 de +185.95.116.0 - 185.95.119.255 cz +185.95.120.0 - 185.95.123.255 tr +185.95.124.0 - 185.95.127.255 lb +185.95.128.0 - 185.95.131.255 de +185.95.132.0 - 185.95.139.255 it +185.95.140.0 - 185.95.143.255 sa +185.95.144.0 - 185.95.147.255 it +185.95.148.0 - 185.95.151.255 se +185.95.152.0 - 185.95.155.255 ir +185.95.156.0 - 185.95.159.255 bg +185.95.160.0 - 185.95.163.255 se +185.95.164.0 - 185.95.167.255 nl +185.95.168.0 - 185.95.171.255 tr +185.95.172.0 - 185.95.175.255 gb +185.95.176.0 - 185.95.179.255 nl +185.95.180.0 - 185.95.183.255 ir +185.95.184.0 - 185.95.187.255 iq +185.95.188.0 - 185.95.191.255 ru +185.95.192.0 - 185.95.195.255 de +185.95.196.0 - 185.95.199.255 pl +185.95.200.0 - 185.95.203.255 de +185.95.204.0 - 185.95.207.255 iq +185.95.208.0 - 185.95.211.255 at +185.95.212.0 - 185.95.215.255 de +185.95.216.0 - 185.95.219.255 ch +185.95.220.0 - 185.95.223.255 pt +185.95.224.0 - 185.95.227.255 it +185.95.228.0 - 185.95.231.255 ru +185.95.232.0 - 185.95.243.255 it +185.95.244.0 - 185.95.247.255 gb +185.95.248.0 - 185.95.251.255 bg +185.95.252.0 - 185.95.255.255 lb +185.96.0.0 - 185.96.3.255 ru +185.96.4.0 - 185.96.7.255 nl +185.96.8.0 - 185.96.11.255 pl +185.96.12.0 - 185.96.15.255 de +185.96.16.0 - 185.96.19.255 gb +185.96.20.0 - 185.96.23.255 it +185.96.24.0 - 185.96.27.255 es +185.96.28.0 - 185.96.31.255 nl +185.96.32.0 - 185.96.35.255 gr +185.96.36.0 - 185.96.39.255 ru +185.96.40.0 - 185.96.43.255 no +185.96.44.0 - 185.96.47.255 nl +185.96.48.0 - 185.96.51.255 gb +185.96.52.0 - 185.96.55.255 tr +185.96.56.0 - 185.96.59.255 de +185.96.60.0 - 185.96.67.255 gb +185.96.68.0 - 185.96.71.255 jo +185.96.72.0 - 185.96.75.255 no +185.96.76.0 - 185.96.79.255 ch +185.96.80.0 - 185.96.87.255 ru +185.96.88.0 - 185.96.91.255 dk +185.96.92.0 - 185.96.95.255 gb +185.96.96.0 - 185.96.99.255 it +185.96.100.0 - 185.96.103.255 at +185.96.104.0 - 185.96.107.255 fr +185.96.108.0 - 185.96.111.255 ir +185.96.112.0 - 185.96.115.255 tr +185.96.116.0 - 185.96.119.255 it +185.96.120.0 - 185.96.123.255 pl +185.96.124.0 - 185.96.127.255 az +185.96.128.0 - 185.96.131.255 it +185.96.132.0 - 185.96.135.255 ru +185.96.136.0 - 185.96.139.255 ae +185.96.140.0 - 185.96.143.255 nl +185.96.144.0 - 185.96.147.255 se +185.96.148.0 - 185.96.151.255 nl +185.96.152.0 - 185.96.155.255 se +185.96.156.0 - 185.96.159.255 fr +185.96.160.0 - 185.96.163.255 ro +185.96.164.0 - 185.96.167.255 bg +185.96.168.0 - 185.96.171.255 tr +185.96.172.0 - 185.96.175.255 pt +185.96.176.0 - 185.96.179.255 md +185.96.180.0 - 185.96.183.255 dk +185.96.184.0 - 185.96.187.255 fr +185.96.188.0 - 185.96.191.255 ua +185.96.192.0 - 185.96.195.255 tr +185.96.196.0 - 185.96.199.255 de +185.96.200.0 - 185.96.203.255 gb +185.96.204.0 - 185.96.207.255 it +185.96.208.0 - 185.96.211.255 rs +185.96.212.0 - 185.96.215.255 de +185.96.216.0 - 185.96.219.255 it +185.96.220.0 - 185.96.223.255 gb +185.96.224.0 - 185.96.227.255 qa +185.96.228.0 - 185.96.231.255 kw +185.96.232.0 - 185.96.235.255 es +185.96.236.0 - 185.96.239.255 de +185.96.240.0 - 185.96.243.255 ir +185.96.244.0 - 185.96.247.255 gb +185.96.248.0 - 185.96.251.255 se +185.96.252.0 - 185.96.255.255 bg +185.97.0.0 - 185.97.3.255 ru +185.97.4.0 - 185.97.7.255 de +185.97.8.0 - 185.97.11.255 tr +185.97.12.0 - 185.97.15.255 it +185.97.16.0 - 185.97.19.255 pl +185.97.20.0 - 185.97.23.255 gb +185.97.24.0 - 185.97.27.255 cz +185.97.28.0 - 185.97.31.255 gb +185.97.32.0 - 185.97.35.255 se +185.97.36.0 - 185.97.39.255 ee +185.97.40.0 - 185.97.43.255 de +185.97.44.0 - 185.97.47.255 lt +185.97.48.0 - 185.97.51.255 lb +185.97.52.0 - 185.97.55.255 si +185.97.56.0 - 185.97.59.255 ru +185.97.60.0 - 185.97.63.255 gb +185.97.64.0 - 185.97.67.255 ps +185.97.68.0 - 185.97.71.255 si +185.97.72.0 - 185.97.75.255 bg +185.97.76.0 - 185.97.79.255 ru +185.97.80.0 - 185.97.80.255 ie +185.97.81.0 - 185.97.81.83 gb +185.97.81.84 - 185.97.81.87 ie +185.97.81.88 - 185.97.81.255 gb +185.97.82.0 - 185.97.83.255 ie +185.97.84.0 - 185.97.87.255 fr +185.97.88.0 - 185.97.91.255 se +185.97.92.0 - 185.97.95.255 lb +185.97.96.0 - 185.97.99.255 de +185.97.100.0 - 185.97.100.255 fr +185.97.101.0 - 185.97.103.255 ch +185.97.104.0 - 185.97.107.255 lb +185.97.108.0 - 185.97.111.255 it +185.97.112.0 - 185.97.115.255 kz +185.97.116.0 - 185.97.119.255 ir +185.97.120.0 - 185.97.123.255 it +185.97.124.0 - 185.97.124.255 il +185.97.125.0 - 185.97.125.255 ps +185.97.126.0 - 185.97.127.255 il +185.97.128.0 - 185.97.131.255 se +185.97.132.0 - 185.97.135.255 ps +185.97.136.0 - 185.97.139.255 ch +185.97.140.0 - 185.97.143.255 fr +185.97.144.0 - 185.97.147.255 gb +185.97.148.0 - 185.97.151.255 lt +185.97.152.0 - 185.97.155.255 gb +185.97.156.0 - 185.97.159.255 it +185.97.160.0 - 185.97.163.255 gb +185.97.164.0 - 185.97.167.255 ru +185.97.168.0 - 185.97.171.255 es +185.97.172.0 - 185.97.175.255 de +185.97.176.0 - 185.97.176.255 be +185.97.177.0 - 185.97.183.255 de +185.97.184.0 - 185.97.187.255 fr +185.97.188.0 - 185.97.199.255 no +185.97.200.0 - 185.97.203.255 ru +185.97.204.0 - 185.97.207.255 fr +185.97.208.0 - 185.97.211.255 hu +185.97.212.0 - 185.97.212.255 lt +185.97.213.0 - 185.97.213.255 gb +185.97.214.0 - 185.97.214.255 se +185.97.215.0 - 185.97.215.255 no +185.97.216.0 - 185.97.223.255 it +185.97.224.0 - 185.97.227.255 de +185.97.228.0 - 185.97.231.255 nl +185.97.232.0 - 185.97.235.255 it +185.97.236.0 - 185.97.239.255 ie +185.97.240.0 - 185.97.243.255 de +185.97.244.0 - 185.97.247.255 be +185.97.248.0 - 185.97.251.255 ee +185.97.252.0 - 185.97.255.255 ru +185.98.0.0 - 185.98.3.255 ba +185.98.4.0 - 185.98.7.255 kz +185.98.8.0 - 185.98.11.255 it +185.98.12.0 - 185.98.15.255 hr +185.98.16.0 - 185.98.19.255 es +185.98.20.0 - 185.98.23.255 fr +185.98.24.0 - 185.98.27.255 iq +185.98.28.0 - 185.98.31.255 ch +185.98.32.0 - 185.98.35.255 es +185.98.36.0 - 185.98.39.255 dk +185.98.40.0 - 185.98.43.255 ru +185.98.44.0 - 185.98.47.255 gb +185.98.48.0 - 185.98.51.255 de +185.98.52.0 - 185.98.55.255 nl +185.98.56.0 - 185.98.59.255 de +185.98.60.0 - 185.98.63.255 tr +185.98.64.0 - 185.98.67.255 fr +185.98.68.0 - 185.98.71.255 at +185.98.72.0 - 185.98.75.255 ch +185.98.76.0 - 185.98.79.255 kz +185.98.80.0 - 185.98.87.255 ru +185.98.88.0 - 185.98.88.255 kz +185.98.89.0 - 185.98.91.255 ru +185.98.92.0 - 185.98.95.255 de +185.98.96.0 - 185.98.99.255 dk +185.98.100.0 - 185.98.103.255 nl +185.98.104.0 - 185.98.106.255 eu +185.98.107.0 - 185.98.107.255 cy +185.98.108.0 - 185.98.111.255 gb +185.98.112.0 - 185.98.115.255 ir +185.98.116.0 - 185.98.119.255 fr +185.98.120.0 - 185.98.123.255 ch +185.98.124.0 - 185.98.127.255 nl +185.98.128.0 - 185.98.131.255 fr +185.98.132.0 - 185.98.135.255 gr +185.98.136.0 - 185.98.139.255 tr +185.98.140.0 - 185.98.143.255 de +185.98.144.0 - 185.98.147.255 nl +185.98.148.0 - 185.98.151.255 gb +185.98.152.0 - 185.98.155.255 ch +185.98.156.0 - 185.98.159.255 se +185.98.160.0 - 185.98.163.255 gb +185.98.164.0 - 185.98.167.255 it +185.98.168.0 - 185.98.183.255 gb +185.98.184.0 - 185.98.187.255 de +185.98.188.0 - 185.98.191.255 gb +185.98.192.0 - 185.98.195.255 se +185.98.196.0 - 185.98.203.255 gb +185.98.204.0 - 185.98.207.255 lb +185.98.208.0 - 185.98.211.255 sk +185.98.212.0 - 185.98.215.255 gb +185.98.216.0 - 185.98.219.255 tr +185.98.220.0 - 185.98.227.255 jo +185.98.228.0 - 185.98.231.255 fi +185.98.232.0 - 185.98.235.255 es +185.98.236.0 - 185.98.243.255 de +185.98.244.0 - 185.98.247.255 se +185.98.248.0 - 185.98.251.255 pt +185.98.252.0 - 185.98.255.255 tr +185.99.0.0 - 185.99.3.255 ba +185.99.4.0 - 185.99.15.255 ru +185.99.16.0 - 185.99.19.255 lb +185.99.20.0 - 185.99.23.255 tr +185.99.24.0 - 185.99.24.15 pl +185.99.24.16 - 185.99.24.31 gb +185.99.24.32 - 185.99.24.47 de +185.99.24.48 - 185.99.24.255 gb +185.99.25.0 - 185.99.25.15 es +185.99.25.16 - 185.99.25.31 gb +185.99.25.32 - 185.99.25.47 nl +185.99.25.48 - 185.99.25.255 gb +185.99.26.0 - 185.99.26.15 es +185.99.26.16 - 185.99.26.31 gb +185.99.26.32 - 185.99.26.47 nl +185.99.26.48 - 185.99.26.255 gb +185.99.27.0 - 185.99.27.15 pl +185.99.27.16 - 185.99.27.31 gb +185.99.27.32 - 185.99.27.47 de +185.99.27.48 - 185.99.27.255 gb +185.99.28.0 - 185.99.31.255 ru +185.99.32.0 - 185.99.35.255 lb +185.99.36.0 - 185.99.39.255 se +185.99.40.0 - 185.99.43.255 fr +185.99.44.0 - 185.99.47.255 ps +185.99.48.0 - 185.99.51.255 be +185.99.52.0 - 185.99.59.255 de +185.99.60.0 - 185.99.63.255 es +185.99.64.0 - 185.99.71.255 cz +185.99.72.0 - 185.99.75.255 at +185.99.76.0 - 185.99.79.255 gb +185.99.80.0 - 185.99.83.255 at +185.99.84.0 - 185.99.87.255 gb +185.99.88.0 - 185.99.91.255 ro +185.99.92.0 - 185.99.95.255 ru +185.99.96.0 - 185.99.99.255 nl +185.99.100.0 - 185.99.103.255 ro +185.99.104.0 - 185.99.107.255 pl +185.99.108.0 - 185.99.111.255 ie +185.99.112.0 - 185.99.115.255 fr +185.99.116.0 - 185.99.119.255 cz +185.99.120.0 - 185.99.123.255 dk +185.99.124.0 - 185.99.127.255 kz +185.99.128.0 - 185.99.131.255 nl +185.99.132.0 - 185.99.133.255 nz +185.99.134.0 - 185.99.134.124 gb +185.99.134.125 - 185.99.134.125 nl +185.99.134.126 - 185.99.134.255 gb +185.99.135.0 - 185.99.135.99 by +185.99.135.100 - 185.99.135.100 br +185.99.135.101 - 185.99.135.255 by +185.99.136.0 - 185.99.139.255 ie +185.99.140.0 - 185.99.143.255 rs +185.99.144.0 - 185.99.147.255 de +185.99.148.0 - 185.99.151.255 fr +185.99.152.0 - 185.99.155.255 ru +185.99.156.0 - 185.99.159.255 ua +185.99.160.0 - 185.99.163.255 ru +185.99.164.0 - 185.99.167.255 gb +185.99.168.0 - 185.99.171.255 ru +185.99.172.0 - 185.99.175.255 pl +185.99.176.0 - 185.99.179.255 cz +185.99.180.0 - 185.99.183.255 us +185.99.184.0 - 185.99.187.255 nl +185.99.188.0 - 185.99.191.255 se +185.99.192.0 - 185.99.195.255 pl +185.99.196.0 - 185.99.199.255 it +185.99.200.0 - 185.99.203.255 gb +185.99.204.0 - 185.99.207.255 nl +185.99.208.0 - 185.99.211.255 de +185.99.212.0 - 185.99.215.255 ir +185.99.216.0 - 185.99.219.255 fr +185.99.220.0 - 185.99.223.255 lb +185.99.224.0 - 185.99.227.255 it +185.99.228.0 - 185.99.231.255 de +185.99.232.0 - 185.99.235.255 pt +185.99.236.0 - 185.99.239.255 gb +185.99.240.0 - 185.99.243.255 es +185.99.244.0 - 185.99.247.255 gb +185.99.248.0 - 185.99.251.255 ge +185.99.252.0 - 185.99.255.255 pt +185.100.0.0 - 185.100.3.255 ch +185.100.4.0 - 185.100.7.255 fr +185.100.8.0 - 185.100.11.255 de +185.100.12.0 - 185.100.19.255 it +185.100.20.0 - 185.100.23.255 iq +185.100.24.0 - 185.100.27.255 ru +185.100.28.0 - 185.100.31.255 fr +185.100.32.0 - 185.100.35.255 it +185.100.36.0 - 185.100.39.255 nl +185.100.40.0 - 185.100.43.255 us +185.100.44.0 - 185.100.47.255 ir +185.100.48.0 - 185.100.51.255 de +185.100.52.0 - 185.100.59.255 ru +185.100.60.0 - 185.100.63.255 gb +185.100.64.0 - 185.100.67.255 kz +185.100.68.0 - 185.100.71.255 gb +185.100.72.0 - 185.100.75.255 es +185.100.76.0 - 185.100.79.255 ge +185.100.80.0 - 185.100.83.255 it +185.100.84.0 - 185.100.85.255 ro +185.100.86.0 - 185.100.86.255 fi +185.100.87.0 - 185.100.87.255 ro +185.100.88.0 - 185.100.91.255 es +185.100.92.0 - 185.100.95.255 cz +185.100.96.0 - 185.100.99.255 kw +185.100.100.0 - 185.100.107.255 ru +185.100.108.0 - 185.100.127.255 it +185.100.128.0 - 185.100.131.255 nl +185.100.132.0 - 185.100.135.255 lu +185.100.136.0 - 185.100.139.255 es +185.100.140.0 - 185.100.143.255 nl +185.100.144.0 - 185.100.147.255 at +185.100.148.0 - 185.100.151.255 gb +185.100.152.0 - 185.100.155.255 sa +185.100.156.0 - 185.100.159.255 ru +185.100.160.0 - 185.100.163.255 de +185.100.164.0 - 185.100.167.255 it +185.100.168.0 - 185.100.171.255 lb +185.100.172.0 - 185.100.175.255 gb +185.100.176.0 - 185.100.179.255 it +185.100.180.0 - 185.100.183.255 es +185.100.184.0 - 185.100.187.255 fr +185.100.188.0 - 185.100.191.255 gb +185.100.192.0 - 185.100.195.255 nl +185.100.196.0 - 185.100.199.255 cz +185.100.200.0 - 185.100.203.255 lb +185.100.204.0 - 185.100.207.255 no +185.100.208.0 - 185.100.211.255 ae +185.100.212.0 - 185.100.212.255 gb +185.100.213.0 - 185.100.213.255 ie +185.100.214.0 - 185.100.214.255 gb +185.100.215.0 - 185.100.215.255 ie +185.100.216.0 - 185.100.219.255 lb +185.100.220.0 - 185.100.222.255 de +185.100.223.0 - 185.100.223.0 sa +185.100.223.1 - 185.100.223.255 de +185.100.224.0 - 185.100.227.255 kz +185.100.228.0 - 185.100.231.255 pl +185.100.232.0 - 185.100.235.255 nl +185.100.236.0 - 185.100.239.255 it +185.100.240.0 - 185.100.243.255 at +185.100.244.0 - 185.100.247.255 mk +185.100.248.0 - 185.100.251.255 gb +185.100.252.0 - 185.100.255.255 it +185.101.0.0 - 185.101.3.255 no +185.101.4.0 - 185.101.7.255 de +185.101.8.0 - 185.101.11.255 li +185.101.12.0 - 185.101.15.255 gb +185.101.16.0 - 185.101.19.255 lb +185.101.20.0 - 185.101.27.255 ru +185.101.28.0 - 185.101.31.255 fr +185.101.32.0 - 185.101.35.255 no +185.101.36.0 - 185.101.39.255 it +185.101.40.0 - 185.101.43.255 nl +185.101.44.0 - 185.101.47.255 gb +185.101.48.0 - 185.101.51.255 li +185.101.52.0 - 185.101.55.255 de +185.101.56.0 - 185.101.59.255 se +185.101.60.0 - 185.101.63.255 nl +185.101.64.0 - 185.101.67.255 fr +185.101.68.0 - 185.101.69.255 ru +185.101.70.0 - 185.101.70.255 us +185.101.71.0 - 185.101.71.255 ru +185.101.72.0 - 185.101.75.255 pl +185.101.76.0 - 185.101.83.255 gb +185.101.84.0 - 185.101.87.255 ie +185.101.88.0 - 185.101.91.255 dk +185.101.92.0 - 185.101.95.255 de +185.101.96.0 - 185.101.96.255 nl +185.101.97.0 - 185.101.97.255 us +185.101.98.0 - 185.101.99.255 nl +185.101.100.0 - 185.101.103.255 de +185.101.104.0 - 185.101.107.255 ro +185.101.108.0 - 185.101.111.255 nl +185.101.112.0 - 185.101.115.255 de +185.101.116.0 - 185.101.119.255 ch +185.101.120.0 - 185.101.123.255 gb +185.101.124.0 - 185.101.127.255 is +185.101.128.0 - 185.101.131.255 pl +185.101.132.0 - 185.101.135.255 de +185.101.136.0 - 185.101.139.255 ge +185.101.140.0 - 185.101.143.255 sk +185.101.144.0 - 185.101.147.255 be +185.101.148.0 - 185.101.151.255 gb +185.101.152.0 - 185.101.155.255 dk +185.101.156.0 - 185.101.159.255 ch +185.101.160.0 - 185.101.167.255 es +185.101.168.0 - 185.101.171.255 ro +185.101.172.0 - 185.101.175.255 de +185.101.176.0 - 185.101.179.255 pt +185.101.180.0 - 185.101.183.255 fr +185.101.184.0 - 185.101.187.255 de +185.101.188.0 - 185.101.191.255 pl +185.101.192.0 - 185.101.195.255 gb +185.101.196.0 - 185.101.199.255 nl +185.101.200.0 - 185.101.207.255 ru +185.101.208.0 - 185.101.211.255 fr +185.101.212.0 - 185.101.215.255 it +185.101.216.0 - 185.101.219.255 ru +185.101.220.0 - 185.101.223.255 cz +185.101.224.0 - 185.101.227.255 gb +185.101.228.0 - 185.101.231.255 ir +185.101.232.0 - 185.101.235.255 pl +185.101.236.0 - 185.101.239.255 ru +185.101.240.0 - 185.101.243.255 ie +185.101.244.0 - 185.101.247.255 ru +185.101.248.0 - 185.101.251.255 de +185.101.252.0 - 185.101.255.255 ru +185.102.0.0 - 185.102.3.255 il +185.102.4.0 - 185.102.11.255 ru +185.102.12.0 - 185.102.15.255 at +185.102.16.0 - 185.102.19.255 se +185.102.20.0 - 185.102.23.255 cz +185.102.24.0 - 185.102.27.255 nl +185.102.28.0 - 185.102.31.255 no +185.102.32.0 - 185.102.35.255 se +185.102.36.0 - 185.102.39.255 tr +185.102.40.0 - 185.102.43.255 it +185.102.44.0 - 185.102.47.255 nl +185.102.48.0 - 185.102.51.255 ro +185.102.52.0 - 185.102.55.255 no +185.102.56.0 - 185.102.67.255 de +185.102.68.0 - 185.102.71.255 nl +185.102.72.0 - 185.102.75.255 kz +185.102.76.0 - 185.102.79.255 cz +185.102.80.0 - 185.102.83.255 fr +185.102.84.0 - 185.102.87.255 gb +185.102.88.0 - 185.102.91.255 ua +185.102.92.0 - 185.102.95.255 de +185.102.96.0 - 185.102.99.255 cz +185.102.100.0 - 185.102.103.255 se +185.102.104.0 - 185.102.107.255 de +185.102.108.0 - 185.102.111.255 no +185.102.112.0 - 185.102.117.255 ru +185.102.118.0 - 185.102.119.255 kz +185.102.120.0 - 185.102.123.255 ru +185.102.124.0 - 185.102.127.255 rs +185.102.128.0 - 185.102.131.255 ru +185.102.132.0 - 185.102.135.255 gb +185.102.136.0 - 185.102.139.255 ru +185.102.140.0 - 185.102.143.255 it +185.102.144.0 - 185.102.147.255 ge +185.102.148.0 - 185.102.151.255 gb +185.102.152.0 - 185.102.155.255 de +185.102.156.0 - 185.102.159.255 ro +185.102.160.0 - 185.102.163.255 fr +185.102.164.0 - 185.102.167.255 ua +185.102.168.0 - 185.102.175.255 nl +185.102.176.0 - 185.102.179.255 fr +185.102.180.0 - 185.102.183.255 ru +185.102.184.0 - 185.102.187.255 ua +185.102.188.0 - 185.102.191.255 pl +185.102.192.0 - 185.102.203.255 gb +185.102.204.0 - 185.102.211.255 es +185.102.212.0 - 185.102.215.255 se +185.102.216.0 - 185.102.219.255 us +185.102.220.0 - 185.102.223.255 gb +185.102.224.0 - 185.102.227.255 de +185.102.228.0 - 185.102.231.255 at +185.102.232.0 - 185.102.235.255 fi +185.102.236.0 - 185.102.239.255 rs +185.102.240.0 - 185.102.243.255 de +185.102.244.0 - 185.102.251.255 gb +185.102.252.0 - 185.102.255.255 de +185.103.0.0 - 185.103.3.255 lu +185.103.4.0 - 185.103.7.255 gb +185.103.8.0 - 185.103.11.255 es +185.103.12.0 - 185.103.15.255 lb +185.103.16.0 - 185.103.19.255 nl +185.103.20.0 - 185.103.23.255 lb +185.103.24.0 - 185.103.27.255 ru +185.103.28.0 - 185.103.31.255 hk +185.103.32.0 - 185.103.39.255 nl +185.103.40.0 - 185.103.43.255 ua +185.103.44.0 - 185.103.47.255 de +185.103.48.0 - 185.103.51.255 se +185.103.52.0 - 185.103.55.255 it +185.103.56.0 - 185.103.59.255 nl +185.103.60.0 - 185.103.63.255 ru +185.103.64.0 - 185.103.67.255 fr +185.103.68.0 - 185.103.71.255 ru +185.103.72.0 - 185.103.75.255 de +185.103.76.0 - 185.103.79.255 nl +185.103.80.0 - 185.103.83.255 it +185.103.84.0 - 185.103.87.255 ir +185.103.88.0 - 185.103.91.255 lb +185.103.92.0 - 185.103.95.255 de +185.103.96.0 - 185.103.99.255 gb +185.103.100.0 - 185.103.103.255 ru +185.103.104.0 - 185.103.107.255 ie +185.103.108.0 - 185.103.111.255 ru +185.103.112.0 - 185.103.115.255 it +185.103.116.0 - 185.103.119.255 gb +185.103.120.0 - 185.103.123.255 dk +185.103.124.0 - 185.103.127.255 es +185.103.128.0 - 185.103.131.255 ir +185.103.132.0 - 185.103.135.255 ru +185.103.136.0 - 185.103.139.255 rs +185.103.140.0 - 185.103.143.255 fr +185.103.144.0 - 185.103.147.255 sk +185.103.148.0 - 185.103.151.255 es +185.103.152.0 - 185.103.155.255 pl +185.103.156.0 - 185.103.159.255 lu +185.103.160.0 - 185.103.167.255 ru +185.103.168.0 - 185.103.171.255 kz +185.103.172.0 - 185.103.175.255 nl +185.103.176.0 - 185.103.179.255 kz +185.103.180.0 - 185.103.183.255 es +185.103.184.0 - 185.103.187.255 kz +185.103.188.0 - 185.103.191.255 se +185.103.192.0 - 185.103.195.255 de +185.103.196.0 - 185.103.199.255 tr +185.103.200.0 - 185.103.203.255 nl +185.103.204.0 - 185.103.207.255 es +185.103.208.0 - 185.103.215.255 se +185.103.216.0 - 185.103.219.255 hr +185.103.220.0 - 185.103.223.255 gb +185.103.224.0 - 185.103.227.255 de +185.103.228.0 - 185.103.230.255 gb +185.103.231.0 - 185.103.231.255 se +185.103.232.0 - 185.103.235.255 de +185.103.236.0 - 185.103.239.255 nl +185.103.240.0 - 185.103.243.255 se +185.103.244.0 - 185.103.251.255 ir +185.103.252.0 - 185.103.253.255 ru +185.103.254.0 - 185.103.255.255 ua +185.104.0.0 - 185.104.3.255 gr +185.104.4.0 - 185.104.7.255 ru +185.104.8.0 - 185.104.11.255 nl +185.104.12.0 - 185.104.15.255 ru +185.104.16.0 - 185.104.19.255 ch +185.104.20.0 - 185.104.23.255 tr +185.104.24.0 - 185.104.27.255 it +185.104.28.0 - 185.104.31.255 nl +185.104.32.0 - 185.104.43.255 ro +185.104.44.0 - 185.104.47.255 gb +185.104.48.0 - 185.104.55.255 ro +185.104.56.0 - 185.104.59.255 qa +185.104.60.0 - 185.104.63.255 es +185.104.64.0 - 185.104.67.255 pl +185.104.68.0 - 185.104.71.255 lb +185.104.72.0 - 185.104.75.255 de +185.104.76.0 - 185.104.79.255 fr +185.104.80.0 - 185.104.83.255 gb +185.104.84.0 - 185.104.87.255 ch +185.104.88.0 - 185.104.91.255 de +185.104.92.0 - 185.104.95.255 ru +185.104.96.0 - 185.104.99.255 gb +185.104.100.0 - 185.104.103.255 nl +185.104.104.0 - 185.104.107.255 ru +185.104.108.0 - 185.104.111.255 lu +185.104.112.0 - 185.104.115.255 ua +185.104.116.0 - 185.104.119.255 it +185.104.120.0 - 185.104.123.255 gb +185.104.124.0 - 185.104.127.255 it +185.104.128.0 - 185.104.139.255 nl +185.104.140.0 - 185.104.143.255 de +185.104.144.0 - 185.104.147.255 gr +185.104.148.0 - 185.104.151.255 ru +185.104.152.0 - 185.104.155.255 es +185.104.156.0 - 185.104.156.255 iq +185.104.157.0 - 185.104.157.255 us +185.104.158.0 - 185.104.159.255 iq +185.104.160.0 - 185.104.163.255 de +185.104.164.0 - 185.104.167.255 es +185.104.168.0 - 185.104.171.255 ro +185.104.172.0 - 185.104.175.255 ru +185.104.176.0 - 185.104.179.255 lt +185.104.180.0 - 185.104.183.255 ro +185.104.184.0 - 185.104.187.255 gb +185.104.188.0 - 185.104.191.255 nl +185.104.192.0 - 185.104.195.255 ir +185.104.196.0 - 185.104.199.255 ro +185.104.200.0 - 185.104.203.255 gg +185.104.204.0 - 185.104.207.255 de +185.104.208.0 - 185.104.211.255 no +185.104.212.0 - 185.104.215.255 ua +185.104.216.0 - 185.104.219.255 gb +185.104.220.0 - 185.104.223.255 gi +185.104.224.0 - 185.104.227.255 at +185.104.228.0 - 185.104.235.255 ir +185.104.236.0 - 185.104.239.255 es +185.104.240.0 - 185.104.243.255 ir +185.104.244.0 - 185.104.247.255 lb +185.104.248.0 - 185.104.251.255 ru +185.104.252.0 - 185.104.255.255 lb +185.105.0.0 - 185.105.3.255 dk +185.105.4.0 - 185.105.7.255 ro +185.105.8.0 - 185.105.11.255 pl +185.105.12.0 - 185.105.19.255 es +185.105.20.0 - 185.105.23.255 at +185.105.24.0 - 185.105.27.255 es +185.105.28.0 - 185.105.31.255 fr +185.105.32.0 - 185.105.39.255 ro +185.105.40.0 - 185.105.43.255 de +185.105.44.0 - 185.105.51.255 ru +185.105.52.0 - 185.105.55.255 be +185.105.56.0 - 185.105.59.255 gb +185.105.60.0 - 185.105.63.255 se +185.105.64.0 - 185.105.67.255 gb +185.105.68.0 - 185.105.71.255 tr +185.105.72.0 - 185.105.75.255 gb +185.105.76.0 - 185.105.79.255 nl +185.105.80.0 - 185.105.83.255 be +185.105.84.0 - 185.105.87.255 ro +185.105.88.0 - 185.105.91.255 ua +185.105.92.0 - 185.105.95.255 it +185.105.96.0 - 185.105.99.255 gb +185.105.100.0 - 185.105.103.255 ru +185.105.104.0 - 185.105.107.255 it +185.105.108.0 - 185.105.111.255 ua +185.105.112.0 - 185.105.115.255 de +185.105.116.0 - 185.105.119.255 ua +185.105.120.0 - 185.105.123.255 ir +185.105.124.0 - 185.105.127.255 gb +185.105.128.0 - 185.105.131.255 it +185.105.132.0 - 185.105.135.255 ch +185.105.136.0 - 185.105.139.255 fr +185.105.140.0 - 185.105.143.255 pl +185.105.144.0 - 185.105.147.255 ch +185.105.148.0 - 185.105.151.255 ge +185.105.152.0 - 185.105.155.255 fr +185.105.156.0 - 185.105.159.255 be +185.105.160.0 - 185.105.163.255 cz +185.105.164.0 - 185.105.167.255 gb +185.105.168.0 - 185.105.171.255 ru +185.105.172.0 - 185.105.175.255 cy +185.105.176.0 - 185.105.179.255 il +185.105.180.0 - 185.105.183.255 cz +185.105.184.0 - 185.105.187.255 ir +185.105.188.0 - 185.105.191.255 ro +185.105.192.0 - 185.105.195.255 nl +185.105.196.0 - 185.105.199.255 az +185.105.200.0 - 185.105.203.255 be +185.105.204.0 - 185.105.207.255 nl +185.105.208.0 - 185.105.215.255 it +185.105.216.0 - 185.105.222.15 nl +185.105.222.16 - 185.105.222.31 de +185.105.222.32 - 185.105.223.255 nl +185.105.224.0 - 185.105.227.255 ru +185.105.228.0 - 185.105.231.255 tj +185.105.232.0 - 185.105.235.255 es +185.105.236.0 - 185.105.236.255 ir +185.105.237.0 - 185.105.237.31 ae +185.105.237.32 - 185.105.239.255 ir +185.105.240.0 - 185.105.243.255 it +185.105.244.0 - 185.105.247.255 se +185.105.248.0 - 185.105.251.255 nl +185.105.252.0 - 185.105.255.255 de +185.106.0.0 - 185.106.7.255 es +185.106.8.0 - 185.106.11.255 de +185.106.12.0 - 185.106.15.255 iq +185.106.16.0 - 185.106.19.255 gr +185.106.20.0 - 185.106.23.255 tr +185.106.24.0 - 185.106.27.255 lu +185.106.28.0 - 185.106.31.255 iq +185.106.32.0 - 185.106.35.255 il +185.106.36.0 - 185.106.39.255 es +185.106.40.0 - 185.106.43.255 ru +185.106.44.0 - 185.106.47.255 es +185.106.48.0 - 185.106.51.255 at +185.106.52.0 - 185.106.55.255 nl +185.106.56.0 - 185.106.59.255 it +185.106.60.0 - 185.106.63.255 cz +185.106.64.0 - 185.106.67.255 ch +185.106.68.0 - 185.106.71.255 be +185.106.72.0 - 185.106.75.255 nl +185.106.76.0 - 185.106.79.255 de +185.106.80.0 - 185.106.83.255 ro +185.106.84.0 - 185.106.87.255 de +185.106.88.0 - 185.106.91.255 ie +185.106.92.0 - 185.106.95.255 ru +185.106.96.0 - 185.106.99.255 hu +185.106.100.0 - 185.106.103.255 cy +185.106.104.0 - 185.106.107.255 ru +185.106.108.0 - 185.106.111.255 at +185.106.112.0 - 185.106.115.255 hu +185.106.116.0 - 185.106.119.255 iq +185.106.120.0 - 185.106.121.255 nl +185.106.122.0 - 185.106.122.255 ro +185.106.123.0 - 185.106.123.255 nl +185.106.124.0 - 185.106.127.255 ad +185.106.132.0 - 185.106.135.255 pl +185.106.136.0 - 185.106.139.255 ir +185.106.140.0 - 185.106.143.255 rs +185.106.144.0 - 185.106.147.255 ir +185.106.148.0 - 185.106.151.255 de +185.106.152.0 - 185.106.155.255 nl +185.106.156.0 - 185.106.159.255 kz +185.106.160.0 - 185.106.163.255 at +185.106.164.0 - 185.106.167.255 de +185.106.168.0 - 185.106.171.255 re +185.106.172.0 - 185.106.175.255 ru +185.106.176.0 - 185.106.179.255 gb +185.106.180.0 - 185.106.183.255 se +185.106.184.0 - 185.106.187.255 de +185.106.188.0 - 185.106.191.255 at +185.106.192.0 - 185.106.195.255 ps +185.106.196.0 - 185.106.199.255 ru +185.106.200.0 - 185.106.203.255 ir +185.106.204.0 - 185.106.207.255 ru +185.106.208.0 - 185.106.211.255 tr +185.106.212.0 - 185.106.215.255 at +185.106.216.0 - 185.106.219.255 fr +185.106.220.0 - 185.106.223.255 es +185.106.224.0 - 185.106.227.255 nl +185.106.228.0 - 185.106.231.255 ir +185.106.232.0 - 185.106.235.255 de +185.106.236.0 - 185.106.239.255 be +185.106.240.0 - 185.106.243.255 nl +185.106.244.0 - 185.106.247.255 de +185.106.248.0 - 185.106.251.255 at +185.106.252.0 - 185.106.255.255 de +185.107.0.0 - 185.107.3.255 es +185.107.4.0 - 185.107.7.255 de +185.107.8.0 - 185.107.11.255 gb +185.107.12.0 - 185.107.15.255 dk +185.107.16.0 - 185.107.19.255 es +185.107.20.0 - 185.107.23.255 de +185.107.24.0 - 185.107.27.255 nl +185.107.28.0 - 185.107.35.255 ir +185.107.36.0 - 185.107.47.255 nl +185.107.48.0 - 185.107.51.255 lb +185.107.52.0 - 185.107.55.255 de +185.107.56.0 - 185.107.59.255 nl +185.107.60.0 - 185.107.63.255 is +185.107.64.0 - 185.107.67.255 pl +185.107.68.0 - 185.107.71.255 nl +185.107.72.0 - 185.107.75.255 ru +185.107.76.0 - 185.107.79.255 qa +185.107.80.0 - 185.107.83.255 nl +185.107.84.0 - 185.107.87.255 fr +185.107.88.0 - 185.107.95.255 nl +185.107.96.0 - 185.107.99.255 de +185.107.100.0 - 185.107.103.255 nl +185.107.104.0 - 185.107.111.255 es +185.107.112.0 - 185.107.123.255 nl +185.107.124.0 - 185.107.131.255 ru +185.107.132.0 - 185.107.135.255 tr +185.107.136.0 - 185.107.139.255 ru +185.107.140.0 - 185.107.143.255 pl +185.107.144.0 - 185.107.151.255 it +185.107.152.0 - 185.107.155.255 es +185.107.156.0 - 185.107.159.255 ru +185.107.160.0 - 185.107.163.255 es +185.107.164.0 - 185.107.167.255 ru +185.107.168.0 - 185.107.171.255 dk +185.107.172.0 - 185.107.175.255 kz +185.107.176.0 - 185.107.179.255 dk +185.107.180.0 - 185.107.187.255 it +185.107.188.0 - 185.107.191.255 nl +185.107.192.0 - 185.107.195.255 de +185.107.196.0 - 185.107.199.255 gb +185.107.200.0 - 185.107.203.255 dk +185.107.204.0 - 185.107.207.255 it +185.107.208.0 - 185.107.211.255 be +185.107.212.0 - 185.107.215.255 nl +185.107.216.0 - 185.107.219.255 mk +185.107.220.0 - 185.107.223.255 de +185.107.224.0 - 185.107.227.255 nl +185.107.228.0 - 185.107.231.255 gb +185.107.232.0 - 185.107.235.255 fr +185.107.236.0 - 185.107.239.255 it +185.107.240.0 - 185.107.243.255 ru +185.107.244.0 - 185.107.251.255 ir +185.107.252.0 - 185.107.255.255 ua +185.108.0.0 - 185.108.7.255 ru +185.108.8.0 - 185.108.11.255 de +185.108.12.0 - 185.108.15.255 gb +185.108.16.0 - 185.108.23.255 ru +185.108.24.0 - 185.108.27.255 ps +185.108.28.0 - 185.108.31.255 cz +185.108.32.0 - 185.108.35.255 fr +185.108.36.0 - 185.108.39.255 md +185.108.40.0 - 185.108.43.255 ie +185.108.44.0 - 185.108.47.255 gb +185.108.48.0 - 185.108.51.255 pl +185.108.52.0 - 185.108.59.255 gb +185.108.60.0 - 185.108.63.255 cz +185.108.64.0 - 185.108.67.255 lv +185.108.68.0 - 185.108.71.255 pl +185.108.72.0 - 185.108.79.255 de +185.108.80.0 - 185.108.83.255 il +185.108.84.0 - 185.108.91.255 ru +185.108.92.0 - 185.108.95.255 gb +185.108.96.0 - 185.108.99.255 ir +185.108.100.0 - 185.108.103.255 dk +185.108.104.0 - 185.108.107.255 pt +185.108.108.0 - 185.108.111.255 dk +185.108.112.0 - 185.108.115.255 ro +185.108.116.0 - 185.108.119.255 nl +185.108.120.0 - 185.108.123.255 cz +185.108.124.0 - 185.108.127.255 tr +185.108.128.0 - 185.108.131.255 ie +185.108.132.0 - 185.108.135.255 gb +185.108.136.0 - 185.108.139.255 md +185.108.140.0 - 185.108.143.255 bg +185.108.144.0 - 185.108.147.255 md +185.108.148.0 - 185.108.151.255 tr +185.108.152.0 - 185.108.155.255 md +185.108.156.0 - 185.108.159.255 tr +185.108.160.0 - 185.108.163.255 ru +185.108.164.0 - 185.108.167.255 ir +185.108.168.0 - 185.108.171.255 gb +185.108.172.0 - 185.108.175.255 de +185.108.176.0 - 185.108.179.255 gb +185.108.180.0 - 185.108.183.255 md +185.108.184.0 - 185.108.187.255 de +185.108.188.0 - 185.108.191.255 bg +185.108.192.0 - 185.108.199.255 ru +185.108.200.0 - 185.108.203.255 at +185.108.204.0 - 185.108.207.255 es +185.108.208.0 - 185.108.211.255 ru +185.108.212.0 - 185.108.215.255 ua +185.108.216.0 - 185.108.219.255 de +185.108.220.0 - 185.108.223.255 ru +185.108.224.0 - 185.108.227.255 nl +185.108.228.0 - 185.108.231.255 de +185.108.232.0 - 185.108.235.255 gb +185.108.236.0 - 185.108.239.255 fr +185.108.240.0 - 185.108.243.255 sa +185.108.244.0 - 185.108.247.255 ch +185.108.248.0 - 185.108.251.255 lu +185.108.252.0 - 185.108.255.255 dk +185.109.0.0 - 185.109.3.255 ch +185.109.4.0 - 185.109.7.255 ie +185.109.8.0 - 185.109.11.255 gb +185.109.12.0 - 185.109.15.255 dk +185.109.16.0 - 185.109.19.255 ie +185.109.20.0 - 185.109.23.255 ru +185.109.24.0 - 185.109.27.255 it +185.109.28.0 - 185.109.31.255 tr +185.109.32.0 - 185.109.35.255 de +185.109.36.0 - 185.109.39.255 ch +185.109.40.0 - 185.109.51.255 gb +185.109.52.0 - 185.109.55.255 ua +185.109.56.0 - 185.109.59.255 it +185.109.60.0 - 185.109.63.255 ir +185.109.64.0 - 185.109.67.255 dk +185.109.68.0 - 185.109.71.255 it +185.109.72.0 - 185.109.75.255 ir +185.109.76.0 - 185.109.79.255 dk +185.109.80.0 - 185.109.83.255 ir +185.109.84.0 - 185.109.87.255 se +185.109.88.0 - 185.109.91.255 dk +185.109.92.0 - 185.109.95.255 gb +185.109.96.0 - 185.109.99.255 nl +185.109.100.0 - 185.109.103.255 is +185.109.104.0 - 185.109.107.255 gb +185.109.108.0 - 185.109.111.255 de +185.109.112.0 - 185.109.115.255 ru +185.109.116.0 - 185.109.119.255 gb +185.109.120.0 - 185.109.123.255 jo +185.109.124.0 - 185.109.127.255 gb +185.109.128.0 - 185.109.131.255 ir +185.109.132.0 - 185.109.135.255 dk +185.109.136.0 - 185.109.143.255 gb +185.109.144.0 - 185.109.147.255 nl +185.109.148.0 - 185.109.151.255 il +185.109.152.0 - 185.109.155.255 pt +185.109.156.0 - 185.109.159.255 de +185.109.160.0 - 185.109.163.255 nl +185.109.164.0 - 185.109.167.255 ch +185.109.168.0 - 185.109.171.255 gb +185.109.172.0 - 185.109.175.255 fr +185.109.176.0 - 185.109.179.255 sa +185.109.180.0 - 185.109.183.255 de +185.109.184.0 - 185.109.191.255 it +185.109.192.0 - 185.109.195.255 jo +185.109.196.0 - 185.109.199.255 de +185.109.200.0 - 185.109.203.255 fr +185.109.204.0 - 185.109.211.255 ua +185.109.212.0 - 185.109.215.255 ro +185.109.216.0 - 185.109.219.255 pl +185.109.220.0 - 185.109.223.255 it +185.109.224.0 - 185.109.227.255 ie +185.109.228.0 - 185.109.231.255 gb +185.109.232.0 - 185.109.235.255 nl +185.109.236.0 - 185.109.239.255 de +185.109.240.0 - 185.109.243.255 ch +185.109.244.0 - 185.109.251.255 ir +185.109.252.0 - 185.109.255.255 ro +185.110.0.0 - 185.110.3.255 gb +185.110.4.0 - 185.110.7.255 pl +185.110.8.0 - 185.110.11.255 ru +185.110.12.0 - 185.110.15.255 de +185.110.16.0 - 185.110.19.255 es +185.110.20.0 - 185.110.23.255 it +185.110.24.0 - 185.110.27.255 ro +185.110.28.0 - 185.110.31.255 ir +185.110.32.0 - 185.110.35.255 de +185.110.36.0 - 185.110.39.255 gg +185.110.40.0 - 185.110.43.255 de +185.110.44.0 - 185.110.47.255 ru +185.110.48.0 - 185.110.51.255 pl +185.110.52.0 - 185.110.55.255 gb +185.110.56.0 - 185.110.59.255 ru +185.110.60.0 - 185.110.63.255 bg +185.110.64.0 - 185.110.71.255 es +185.110.72.0 - 185.110.75.255 ch +185.110.76.0 - 185.110.79.255 es +185.110.80.0 - 185.110.83.255 dk +185.110.84.0 - 185.110.87.255 fr +185.110.88.0 - 185.110.91.255 ch +185.110.92.0 - 185.110.95.255 nl +185.110.96.0 - 185.110.99.255 fr +185.110.100.0 - 185.110.103.255 ch +185.110.104.0 - 185.110.107.255 sy +185.110.108.0 - 185.110.111.255 il +185.110.112.0 - 185.110.115.255 nl +185.110.116.0 - 185.110.119.255 it +185.110.120.0 - 185.110.123.255 at +185.110.124.0 - 185.110.127.255 de +185.110.128.0 - 185.110.132.255 ru +185.110.133.0 - 185.110.135.255 ua +185.110.136.0 - 185.110.139.255 at +185.110.140.0 - 185.110.147.255 sk +185.110.148.0 - 185.110.151.255 no +185.110.152.0 - 185.110.155.255 de +185.110.156.0 - 185.110.163.255 es +185.110.164.0 - 185.110.167.255 ge +185.110.168.0 - 185.110.171.255 ru +185.110.172.0 - 185.110.175.255 nl +185.110.176.0 - 185.110.183.255 gb +185.110.184.0 - 185.110.187.255 ch +185.110.188.0 - 185.110.191.255 gb +185.110.192.0 - 185.110.195.255 fr +185.110.196.0 - 185.110.199.255 ch +185.110.200.0 - 185.110.203.255 nl +185.110.204.0 - 185.110.207.255 cz +185.110.208.0 - 185.110.211.255 ru +185.110.212.0 - 185.110.215.255 es +185.110.216.0 - 185.110.219.255 ir +185.110.220.0 - 185.110.223.255 ch +185.110.224.0 - 185.110.227.255 es +185.110.228.0 - 185.110.231.255 ir +185.110.232.0 - 185.110.235.255 sa +185.110.236.0 - 185.110.239.255 ir +185.110.240.0 - 185.110.243.255 tr +185.110.244.0 - 185.110.247.255 ir +185.110.248.0 - 185.110.251.255 gb +185.110.252.0 - 185.110.255.255 ir +185.111.0.0 - 185.111.3.255 es +185.111.4.0 - 185.111.7.255 lb +185.111.8.0 - 185.111.15.255 ir +185.111.16.0 - 185.111.19.255 fr +185.111.20.0 - 185.111.23.255 gb +185.111.24.0 - 185.111.27.255 ru +185.111.28.0 - 185.111.31.255 nl +185.111.32.0 - 185.111.35.255 de +185.111.36.0 - 185.111.39.255 is +185.111.40.0 - 185.111.43.255 ir +185.111.44.0 - 185.111.47.255 fr +185.111.48.0 - 185.111.51.255 ua +185.111.52.0 - 185.111.59.255 fr +185.111.60.0 - 185.111.63.255 de +185.111.64.0 - 185.111.67.255 ir +185.111.68.0 - 185.111.71.255 az +185.111.72.0 - 185.111.75.255 nl +185.111.76.0 - 185.111.79.255 it +185.111.80.0 - 185.111.83.255 nl +185.111.84.0 - 185.111.87.255 ru +185.111.88.0 - 185.111.91.255 hu +185.111.92.0 - 185.111.95.255 ua +185.111.96.0 - 185.111.99.255 cz +185.111.100.0 - 185.111.103.255 ru +185.111.104.0 - 185.111.107.255 kz +185.111.108.0 - 185.111.111.255 cz +185.111.112.0 - 185.111.115.255 ie +185.111.116.0 - 185.111.119.255 ua +185.111.120.0 - 185.111.123.255 nl +185.111.124.0 - 185.111.127.255 at +185.111.128.0 - 185.111.131.255 ir +185.111.132.0 - 185.111.135.255 pl +185.111.136.0 - 185.111.139.255 ir +185.111.140.0 - 185.111.143.255 ie +185.111.144.0 - 185.111.147.255 at +185.111.148.0 - 185.111.151.255 es +185.111.152.0 - 185.111.155.255 se +185.111.156.0 - 185.111.159.255 ch +185.111.160.0 - 185.111.163.255 lb +185.111.164.0 - 185.111.167.255 ua +185.111.168.0 - 185.111.171.255 de +185.111.172.0 - 185.111.175.255 dk +185.111.176.0 - 185.111.179.255 ch +185.111.180.0 - 185.111.183.255 lt +185.111.184.0 - 185.111.187.255 es +185.111.188.0 - 185.111.191.255 hr +185.111.192.0 - 185.111.195.255 de +185.111.196.0 - 185.111.199.255 be +185.111.200.0 - 185.111.203.255 nl +185.111.204.0 - 185.111.207.255 be +185.111.208.0 - 185.111.211.255 hu +185.111.212.0 - 185.111.215.255 bg +185.111.216.0 - 185.111.219.255 ru +185.111.220.0 - 185.111.223.255 de +185.111.224.0 - 185.111.227.255 gb +185.111.228.0 - 185.111.228.0 es +185.111.228.1 - 185.111.228.255 fr +185.111.229.0 - 185.111.231.255 es +185.111.232.0 - 185.111.235.255 tr +185.111.236.0 - 185.111.239.255 fr +185.111.240.0 - 185.111.243.255 se +185.111.244.0 - 185.111.247.255 tr +185.111.248.0 - 185.111.251.255 it +185.111.252.0 - 185.112.3.255 es +185.112.4.0 - 185.112.7.255 it +185.112.8.0 - 185.112.11.255 ch +185.112.12.0 - 185.112.15.255 ua +185.112.16.0 - 185.112.19.255 fr +185.112.20.0 - 185.112.23.255 rs +185.112.24.0 - 185.112.27.255 no +185.112.28.0 - 185.112.31.255 cz +185.112.32.0 - 185.112.39.255 ir +185.112.40.0 - 185.112.43.255 pl +185.112.44.0 - 185.112.47.255 de +185.112.48.0 - 185.112.51.255 li +185.112.52.0 - 185.112.55.255 ch +185.112.56.0 - 185.112.59.255 ru +185.112.60.0 - 185.112.63.255 it +185.112.64.0 - 185.112.67.255 nl +185.112.68.0 - 185.112.71.255 de +185.112.72.0 - 185.112.75.255 ch +185.112.76.0 - 185.112.79.255 es +185.112.80.0 - 185.112.83.255 ru +185.112.84.0 - 185.112.95.255 it +185.112.96.0 - 185.112.99.255 gb +185.112.100.0 - 185.112.103.255 ru +185.112.104.0 - 185.112.107.255 om +185.112.108.0 - 185.112.111.255 nl +185.112.112.0 - 185.112.115.255 se +185.112.116.0 - 185.112.119.255 pl +185.112.120.0 - 185.112.123.255 ua +185.112.124.0 - 185.112.127.255 de +185.112.128.0 - 185.112.131.255 ir +185.112.132.0 - 185.112.135.255 ch +185.112.136.0 - 185.112.139.255 se +185.112.140.0 - 185.112.141.255 ru +185.112.142.0 - 185.112.143.255 ua +185.112.144.0 - 185.112.147.255 is +185.112.148.0 - 185.112.151.255 ir +185.112.152.0 - 185.112.155.255 de +185.112.156.0 - 185.112.159.255 hu +185.112.160.0 - 185.112.163.255 gb +185.112.164.0 - 185.112.167.255 cz +185.112.168.0 - 185.112.171.255 ir +185.112.172.0 - 185.112.175.255 ua +185.112.176.0 - 185.112.179.255 de +185.112.180.0 - 185.112.183.255 pl +185.112.184.0 - 185.112.187.255 ro +185.112.188.0 - 185.112.191.255 iq +185.112.192.0 - 185.112.195.255 az +185.112.196.0 - 185.112.199.255 it +185.112.200.0 - 185.112.203.255 ye +185.112.204.0 - 185.112.207.255 is +185.112.208.0 - 185.112.211.255 dk +185.112.212.0 - 185.112.215.255 it +185.112.216.0 - 185.112.219.255 de +185.112.220.0 - 185.112.223.255 gb +185.112.224.0 - 185.112.227.255 ru +185.112.228.0 - 185.112.231.255 fr +185.112.232.0 - 185.112.235.255 iq +185.112.236.0 - 185.112.239.255 ru +185.112.240.0 - 185.112.251.255 gb +185.112.252.0 - 185.112.255.255 de +185.113.0.0 - 185.113.3.255 gb +185.113.4.0 - 185.113.7.255 de +185.113.8.0 - 185.113.11.255 tr +185.113.12.0 - 185.113.15.255 ru +185.113.16.0 - 185.113.19.255 gb +185.113.20.0 - 185.113.23.255 ch +185.113.24.0 - 185.113.27.255 gb +185.113.28.0 - 185.113.31.255 ru +185.113.32.0 - 185.113.35.255 pl +185.113.36.0 - 185.113.39.255 kz +185.113.40.0 - 185.113.43.255 es +185.113.44.0 - 185.113.47.255 sk +185.113.48.0 - 185.113.51.255 fr +185.113.52.0 - 185.113.55.255 nl +185.113.56.0 - 185.113.59.255 ir +185.113.60.0 - 185.113.63.255 gb +185.113.64.0 - 185.113.67.255 fr +185.113.68.0 - 185.113.71.255 gb +185.113.72.0 - 185.113.79.255 ru +185.113.80.0 - 185.113.83.255 gb +185.113.84.0 - 185.113.91.255 nl +185.113.92.0 - 185.113.95.255 gb +185.113.96.0 - 185.113.99.255 se +185.113.100.0 - 185.113.103.255 at +185.113.104.0 - 185.113.107.255 ir +185.113.108.0 - 185.113.111.255 ru +185.113.112.0 - 185.113.115.255 ir +185.113.116.0 - 185.113.119.255 ru +185.113.120.0 - 185.113.127.255 de +185.113.128.0 - 185.113.131.255 gb +185.113.132.0 - 185.113.135.255 kz +185.113.136.0 - 185.113.139.255 ru +185.113.140.0 - 185.113.143.255 pt +185.113.144.0 - 185.113.147.255 de +185.113.148.0 - 185.113.155.255 ir +185.113.156.0 - 185.113.159.255 pt +185.113.160.0 - 185.113.163.255 fr +185.113.164.0 - 185.113.167.255 de +185.113.168.0 - 185.113.171.255 lv +185.113.172.0 - 185.113.175.255 nl +185.113.176.0 - 185.113.179.255 se +185.113.180.0 - 185.113.183.255 gb +185.113.184.0 - 185.113.187.255 es +185.113.188.0 - 185.113.191.255 gb +185.113.192.0 - 185.113.195.255 es +185.113.196.0 - 185.113.199.255 nl +185.113.200.0 - 185.113.203.255 ru +185.113.204.0 - 185.113.207.255 gb +185.113.208.0 - 185.113.211.255 ru +185.113.212.0 - 185.113.215.255 nl +185.113.216.0 - 185.113.219.255 gb +185.113.220.0 - 185.113.223.255 tr +185.113.224.0 - 185.113.227.255 nl +185.113.228.0 - 185.113.231.255 dk +185.113.232.0 - 185.113.235.255 ie +185.113.236.0 - 185.113.239.255 es +185.113.240.0 - 185.113.243.255 gb +185.113.244.0 - 185.113.247.255 ru +185.113.248.0 - 185.113.251.255 ie +185.113.252.0 - 185.113.255.255 ee +185.114.0.0 - 185.114.3.255 it +185.114.4.0 - 185.114.11.255 fr +185.114.12.0 - 185.114.19.255 de +185.114.20.0 - 185.114.23.255 tr +185.114.24.0 - 185.114.39.255 nl +185.114.40.0 - 185.114.43.255 de +185.114.44.0 - 185.114.47.255 dk +185.114.48.0 - 185.114.51.255 be +185.114.52.0 - 185.114.55.255 ro +185.114.56.0 - 185.114.59.255 no +185.114.60.0 - 185.114.63.255 nl +185.114.64.0 - 185.114.67.255 es +185.114.68.0 - 185.114.71.255 sa +185.114.72.0 - 185.114.75.255 ir +185.114.76.0 - 185.114.79.255 nl +185.114.80.0 - 185.114.83.255 it +185.114.84.0 - 185.114.87.255 ro +185.114.88.0 - 185.114.91.255 lb +185.114.92.0 - 185.114.95.255 pl +185.114.96.0 - 185.114.99.255 gb +185.114.100.0 - 185.114.103.255 fr +185.114.104.0 - 185.114.107.255 se +185.114.108.0 - 185.114.111.255 it +185.114.112.0 - 185.114.115.255 al +185.114.116.0 - 185.114.119.255 it +185.114.120.0 - 185.114.123.255 il +185.114.124.0 - 185.114.127.255 de +185.114.128.0 - 185.114.131.255 fr +185.114.132.0 - 185.114.135.255 de +185.114.136.0 - 185.114.139.255 ua +185.114.140.0 - 185.114.143.255 nl +185.114.144.0 - 185.114.147.255 si +185.114.148.0 - 185.114.151.255 gb +185.114.152.0 - 185.114.155.255 us +185.114.156.0 - 185.114.159.255 nl +185.114.160.0 - 185.114.163.255 ie +185.114.164.0 - 185.114.167.255 nl +185.114.168.0 - 185.114.171.255 de +185.114.172.0 - 185.114.175.255 es +185.114.176.0 - 185.114.179.255 ee +185.114.180.0 - 185.114.183.255 bg +185.114.184.0 - 185.114.187.255 nl +185.114.188.0 - 185.114.191.255 ir +185.114.192.0 - 185.114.195.255 tr +185.114.196.0 - 185.114.199.255 nl +185.114.200.0 - 185.114.203.255 de +185.114.204.0 - 185.114.207.255 gb +185.114.208.0 - 185.114.211.255 ch +185.114.212.0 - 185.114.223.255 de +185.114.224.0 - 185.114.224.255 gb +185.114.225.0 - 185.114.225.255 nl +185.114.226.0 - 185.114.226.255 at +185.114.227.0 - 185.114.231.255 gb +185.114.232.0 - 185.114.235.255 it +185.114.236.0 - 185.114.239.255 nl +185.114.240.0 - 185.114.243.255 sy +185.114.244.0 - 185.114.247.255 ru +185.114.248.0 - 185.114.251.255 se +185.114.252.0 - 185.114.255.255 lb +185.115.0.0 - 185.115.3.255 cz +185.115.4.0 - 185.115.7.255 ge +185.115.8.0 - 185.115.11.255 cz +185.115.12.0 - 185.115.15.255 mt +185.115.16.0 - 185.115.19.255 fi +185.115.20.0 - 185.115.23.255 hu +185.115.24.0 - 185.115.27.255 de +185.115.28.0 - 185.115.31.255 ro +185.115.32.0 - 185.115.35.255 nl +185.115.36.0 - 185.115.39.255 ua +185.115.40.0 - 185.115.43.255 tr +185.115.44.0 - 185.115.47.255 pl +185.115.48.0 - 185.115.51.255 de +185.115.52.0 - 185.115.55.255 es +185.115.56.0 - 185.115.59.255 hr +185.115.60.0 - 185.115.63.255 gb +185.115.64.0 - 185.115.67.255 ro +185.115.68.0 - 185.115.71.255 gb +185.115.72.0 - 185.115.75.255 cz +185.115.76.0 - 185.115.79.255 ir +185.115.80.0 - 185.115.83.255 de +185.115.84.0 - 185.115.87.255 gb +185.115.88.0 - 185.115.91.255 nl +185.115.92.0 - 185.115.95.255 ro +185.115.96.0 - 185.115.99.255 ru +185.115.100.0 - 185.115.103.255 lb +185.115.104.0 - 185.115.107.255 de +185.115.108.0 - 185.115.111.255 gb +185.115.112.0 - 185.115.115.255 pl +185.115.116.0 - 185.115.123.255 gb +185.115.124.0 - 185.115.125.255 de +185.115.126.0 - 185.115.131.255 gb +185.115.132.0 - 185.115.135.255 it +185.115.136.0 - 185.115.139.255 ge +185.115.140.0 - 185.115.143.255 ru +185.115.144.0 - 185.115.147.255 nl +185.115.148.0 - 185.115.151.255 ir +185.115.152.0 - 185.115.155.255 pl +185.115.156.0 - 185.115.163.255 ru +185.115.164.0 - 185.115.171.255 ir +185.115.172.0 - 185.115.179.255 de +185.115.180.0 - 185.115.183.255 cz +185.115.184.0 - 185.115.187.255 at +185.115.188.0 - 185.115.191.255 fr +185.115.192.0 - 185.115.195.255 de +185.115.196.0 - 185.115.203.255 gb +185.115.204.0 - 185.115.207.255 gr +185.115.208.0 - 185.115.211.255 tr +185.115.212.0 - 185.115.215.255 il +185.115.216.0 - 185.115.219.255 be +185.115.220.0 - 185.115.223.255 ro +185.115.224.0 - 185.115.227.255 il +185.115.228.0 - 185.115.231.255 gb +185.115.232.0 - 185.115.235.255 es +185.115.236.0 - 185.115.239.255 de +185.115.240.0 - 185.115.240.255 fi +185.115.241.0 - 185.115.241.255 fr +185.115.242.0 - 185.115.242.255 ch +185.115.243.0 - 185.115.243.255 nl +185.115.244.0 - 185.115.255.255 no +185.116.0.0 - 185.116.3.255 it +185.116.4.0 - 185.116.7.255 no +185.116.8.0 - 185.116.11.255 dk +185.116.12.0 - 185.116.15.255 nl +185.116.16.0 - 185.116.19.255 de +185.116.20.0 - 185.116.27.255 ir +185.116.28.0 - 185.116.31.255 at +185.116.32.0 - 185.116.35.255 fi +185.116.36.0 - 185.116.39.255 de +185.116.40.0 - 185.116.47.255 nl +185.116.48.0 - 185.116.51.255 cz +185.116.52.0 - 185.116.59.255 gb +185.116.60.0 - 185.116.63.255 be +185.116.64.0 - 185.116.67.255 ie +185.116.68.0 - 185.116.71.255 gb +185.116.72.0 - 185.116.75.255 be +185.116.76.0 - 185.116.79.255 cz +185.116.80.0 - 185.116.83.255 nl +185.116.84.0 - 185.116.87.255 it +185.116.88.0 - 185.116.91.255 fr +185.116.92.0 - 185.116.95.255 bg +185.116.96.0 - 185.116.99.255 at +185.116.100.0 - 185.116.103.255 il +185.116.104.0 - 185.116.107.255 fr +185.116.108.0 - 185.116.115.255 gb +185.116.116.0 - 185.116.119.255 lb +185.116.120.0 - 185.116.123.255 se +185.116.124.0 - 185.116.127.255 nl +185.116.128.0 - 185.116.135.255 fr +185.116.136.0 - 185.116.139.255 pl +185.116.140.0 - 185.116.143.255 kz +185.116.144.0 - 185.116.147.255 nl +185.116.148.0 - 185.116.151.255 dk +185.116.152.0 - 185.116.155.255 tr +185.116.156.0 - 185.116.159.255 de +185.116.160.0 - 185.116.163.255 ir +185.116.164.0 - 185.116.167.255 nl +185.116.168.0 - 185.116.171.255 ie +185.116.172.0 - 185.116.175.255 gb +185.116.176.0 - 185.116.179.255 fr +185.116.180.0 - 185.116.183.255 es +185.116.184.0 - 185.116.191.255 dk +185.116.192.0 - 185.116.195.255 kz +185.116.196.0 - 185.116.203.255 ru +185.116.204.0 - 185.116.207.255 bg +185.116.208.0 - 185.116.211.255 de +185.116.212.0 - 185.116.215.255 gb +185.116.216.0 - 185.116.219.255 nl +185.116.220.0 - 185.116.223.255 de +185.116.224.0 - 185.116.227.255 sa +185.116.228.0 - 185.116.231.255 ru +185.116.232.0 - 185.116.235.255 de +185.116.236.0 - 185.116.236.223 gb +185.116.236.224 - 185.116.236.255 at +185.116.237.0 - 185.116.239.255 gb +185.116.240.0 - 185.116.243.255 no +185.116.244.0 - 185.116.251.255 de +185.116.252.0 - 185.116.255.255 pl +185.117.0.0 - 185.117.3.255 my +185.117.4.0 - 185.117.7.255 nl +185.117.8.0 - 185.117.11.255 iq +185.117.12.0 - 185.117.13.255 ch +185.117.14.0 - 185.117.15.255 de +185.117.16.0 - 185.117.19.255 fr +185.117.20.0 - 185.117.21.255 gb +185.117.22.0 - 185.117.22.255 fr +185.117.23.0 - 185.117.23.255 gb +185.117.24.0 - 185.117.27.255 nl +185.117.28.0 - 185.117.31.255 ru +185.117.32.0 - 185.117.35.255 gr +185.117.36.0 - 185.117.39.255 fr +185.117.40.0 - 185.117.43.255 at +185.117.44.0 - 185.117.47.255 es +185.117.48.0 - 185.117.51.255 ir +185.117.52.0 - 185.117.55.255 de +185.117.56.0 - 185.117.63.255 fr +185.117.64.0 - 185.117.67.255 ee +185.117.68.0 - 185.117.71.255 ae +185.117.72.0 - 185.117.72.255 nl +185.117.73.0 - 185.117.73.255 ro +185.117.74.0 - 185.117.79.255 nl +185.117.80.0 - 185.117.83.255 bg +185.117.84.0 - 185.117.87.255 pl +185.117.88.0 - 185.117.91.255 nl +185.117.92.0 - 185.117.95.255 fr +185.117.96.0 - 185.117.99.255 ir +185.117.100.0 - 185.117.103.255 ua +185.117.104.0 - 185.117.107.255 se +185.117.108.0 - 185.117.111.255 nl +185.117.112.0 - 185.117.115.255 gb +185.117.116.0 - 185.117.119.255 ru +185.117.120.0 - 185.117.123.255 tr +185.117.124.0 - 185.117.127.255 nl +185.117.128.0 - 185.117.131.255 sa +185.117.132.0 - 185.117.135.255 cy +185.117.136.0 - 185.117.139.255 ir +185.117.140.0 - 185.117.143.255 ua +185.117.144.0 - 185.117.147.255 ru +185.117.148.0 - 185.117.151.255 kg +185.117.152.0 - 185.117.159.255 ru +185.117.160.0 - 185.117.163.255 de +185.117.164.0 - 185.117.167.255 li +185.117.168.0 - 185.117.171.255 ch +185.117.172.0 - 185.117.179.255 es +185.117.180.0 - 185.117.183.255 de +185.117.184.0 - 185.117.187.255 it +185.117.188.0 - 185.117.191.255 bg +185.117.192.0 - 185.117.195.255 no +185.117.196.0 - 185.117.203.255 gb +185.117.204.0 - 185.117.207.255 ir +185.117.208.0 - 185.117.211.255 nl +185.117.212.0 - 185.117.215.255 de +185.117.216.0 - 185.117.219.255 it +185.117.220.0 - 185.117.223.255 fi +185.117.224.0 - 185.117.227.255 lb +185.117.228.0 - 185.117.231.255 de +185.117.232.0 - 185.117.235.255 ru +185.117.236.0 - 185.117.239.255 gb +185.117.240.0 - 185.117.243.255 ua +185.117.244.0 - 185.117.247.255 ru +185.117.248.0 - 185.118.3.255 de +185.118.4.0 - 185.118.7.255 ro +185.118.8.0 - 185.118.11.255 iq +185.118.12.0 - 185.118.15.255 ir +185.118.16.0 - 185.118.19.255 fr +185.118.20.0 - 185.118.23.255 de +185.118.24.0 - 185.118.27.255 lb +185.118.28.0 - 185.118.31.255 gb +185.118.32.0 - 185.118.35.255 is +185.118.36.0 - 185.118.39.255 se +185.118.40.0 - 185.118.43.255 dk +185.118.44.0 - 185.118.47.255 iq +185.118.48.0 - 185.118.51.255 az +185.118.52.0 - 185.118.59.255 es +185.118.60.0 - 185.118.63.255 nl +185.118.64.0 - 185.118.67.255 ru +185.118.68.0 - 185.118.71.255 fr +185.118.72.0 - 185.118.75.255 it +185.118.76.0 - 185.118.79.255 lv +185.118.80.0 - 185.118.83.255 cz +185.118.84.0 - 185.118.87.255 ge +185.118.88.0 - 185.118.91.255 nl +185.118.92.0 - 185.118.95.255 fr +185.118.96.0 - 185.118.99.255 iq +185.118.100.0 - 185.118.103.255 de +185.118.104.0 - 185.118.111.255 us +185.118.112.0 - 185.118.115.255 pt +185.118.116.0 - 185.118.119.255 fr +185.118.120.0 - 185.118.123.255 sa +185.118.124.0 - 185.118.127.255 nl +185.118.128.0 - 185.118.131.255 iq +185.118.132.0 - 185.118.135.255 nl +185.118.136.0 - 185.118.139.255 ir +185.118.140.0 - 185.118.143.255 tr +185.118.144.0 - 185.118.147.255 de +185.118.148.0 - 185.118.151.255 al +185.118.152.0 - 185.118.155.255 ir +185.118.156.0 - 185.118.159.255 es +185.118.160.0 - 185.118.163.255 ee +185.118.164.0 - 185.118.167.255 ru +185.118.168.0 - 185.118.171.255 rs +185.118.172.0 - 185.118.175.255 de +185.118.180.0 - 185.118.183.255 dk +185.118.184.0 - 185.118.187.255 it +185.118.188.0 - 185.118.191.255 es +185.118.192.0 - 185.118.195.255 tr +185.118.196.0 - 185.118.199.255 de +185.118.200.0 - 185.118.203.255 ro +185.118.204.0 - 185.118.207.255 ie +185.118.208.0 - 185.118.211.255 de +185.118.212.0 - 185.118.215.255 pl +185.118.216.0 - 185.118.219.255 lu +185.118.220.0 - 185.118.223.255 lb +185.118.224.0 - 185.118.227.255 fi +185.118.228.0 - 185.118.231.255 ie +185.118.232.0 - 185.118.235.255 fi +185.118.236.0 - 185.118.239.255 us +185.118.240.0 - 185.118.243.255 bg +185.118.244.0 - 185.118.247.255 at +185.118.248.0 - 185.118.251.255 dk +185.118.252.0 - 185.118.255.255 il +185.119.0.0 - 185.119.3.255 ru +185.119.4.0 - 185.119.7.255 ir +185.119.8.0 - 185.119.11.255 de +185.119.12.0 - 185.119.15.255 pl +185.119.16.0 - 185.119.19.255 de +185.119.20.0 - 185.119.23.255 gb +185.119.24.0 - 185.119.27.255 fr +185.119.28.0 - 185.119.31.255 nl +185.119.32.0 - 185.119.35.255 de +185.119.36.0 - 185.119.39.255 ch +185.119.40.0 - 185.119.43.255 us +185.119.44.0 - 185.119.47.255 at +185.119.48.0 - 185.119.51.255 es +185.119.52.0 - 185.119.55.255 gb +185.119.56.0 - 185.119.59.255 ru +185.119.60.0 - 185.119.63.255 gb +185.119.64.0 - 185.119.67.255 ru +185.119.68.0 - 185.119.71.255 gb +185.119.72.0 - 185.119.75.255 de +185.119.76.0 - 185.119.79.255 ua +185.119.80.0 - 185.119.83.255 tr +185.119.84.0 - 185.119.87.255 ch +185.119.88.0 - 185.119.91.255 rs +185.119.92.0 - 185.119.95.255 de +185.119.96.0 - 185.119.99.255 cz +185.119.100.0 - 185.119.103.255 se +185.119.104.0 - 185.119.107.255 ch +185.119.108.0 - 185.119.111.255 gb +185.119.112.0 - 185.119.115.255 es +185.119.116.0 - 185.119.119.255 at +185.119.120.0 - 185.119.123.255 pl +185.119.124.0 - 185.119.127.255 is +185.119.128.0 - 185.119.131.255 fi +185.119.132.0 - 185.119.135.255 gb +185.119.136.0 - 185.119.139.255 de +185.119.140.0 - 185.119.147.255 gb +185.119.148.0 - 185.119.151.255 pl +185.119.152.0 - 185.119.155.255 gb +185.119.156.0 - 185.119.159.255 be +185.119.160.0 - 185.119.163.255 at +185.119.164.0 - 185.119.167.255 ir +185.119.168.0 - 185.119.171.255 fr +185.119.172.0 - 185.119.175.255 gb +185.119.176.0 - 185.119.179.255 ch +185.119.180.0 - 185.119.183.255 hu +185.119.184.0 - 185.119.187.255 pl +185.119.188.0 - 185.119.195.255 nl +185.119.196.0 - 185.119.207.255 fr +185.119.208.0 - 185.119.211.255 pl +185.119.212.0 - 185.119.215.255 ua +185.119.216.0 - 185.119.219.255 cz +185.119.220.0 - 185.119.223.255 nl +185.119.224.0 - 185.119.231.255 it +185.119.232.0 - 185.119.235.255 gb +185.119.236.0 - 185.119.239.255 es +185.119.240.0 - 185.119.243.255 ir +185.119.244.0 - 185.119.247.255 it +185.119.248.0 - 185.119.251.255 es +185.119.252.0 - 185.119.253.255 gb +185.119.254.0 - 185.119.254.255 nl +185.119.255.0 - 185.120.4.255 gb +185.120.5.0 - 185.120.5.255 nl +185.120.6.0 - 185.120.6.255 se +185.120.7.0 - 185.120.7.255 gb +185.120.8.0 - 185.120.11.255 ro +185.120.12.0 - 185.120.15.255 gb +185.120.16.0 - 185.120.19.255 ro +185.120.20.0 - 185.120.21.255 gb +185.120.22.0 - 185.120.23.255 fr +185.120.24.0 - 185.120.27.255 no +185.120.28.0 - 185.120.31.255 lb +185.120.32.0 - 185.120.34.255 gb +185.120.35.0 - 185.120.35.255 nl +185.120.36.0 - 185.120.39.255 al +185.120.40.0 - 185.120.43.255 it +185.120.44.0 - 185.120.47.255 es +185.120.48.0 - 185.120.51.255 fi +185.120.52.0 - 185.120.55.255 gb +185.120.56.0 - 185.120.59.255 ru +185.120.60.0 - 185.120.63.255 de +185.120.64.0 - 185.120.67.255 pl +185.120.68.0 - 185.120.71.255 cz +185.120.72.0 - 185.120.75.255 gb +185.120.76.0 - 185.120.79.255 kz +185.120.80.0 - 185.120.83.255 it +185.120.84.0 - 185.120.87.255 es +185.120.88.0 - 185.120.91.255 ru +185.120.92.0 - 185.120.95.255 mk +185.120.96.0 - 185.120.99.255 gi +185.120.100.0 - 185.120.103.255 no +185.120.104.0 - 185.120.107.255 es +185.120.108.0 - 185.120.111.255 ae +185.120.112.0 - 185.120.115.255 es +185.120.116.0 - 185.120.119.255 gb +185.120.120.0 - 185.120.123.255 ir +185.120.124.0 - 185.120.127.255 il +185.120.128.0 - 185.120.131.255 gb +185.120.132.0 - 185.120.135.255 ua +185.120.136.0 - 185.120.139.255 ir +185.120.140.0 - 185.120.143.255 ch +185.120.144.0 - 185.120.147.255 ro +185.120.148.0 - 185.120.151.255 de +185.120.152.0 - 185.120.155.255 gb +185.120.156.0 - 185.120.159.255 de +185.120.160.0 - 185.120.163.255 ir +185.120.164.0 - 185.120.167.255 be +185.120.168.0 - 185.120.171.255 ir +185.120.172.0 - 185.120.175.255 gb +185.120.176.0 - 185.120.179.255 fr +185.120.180.0 - 185.120.183.255 ru +185.120.184.0 - 185.120.187.255 cy +185.120.188.0 - 185.120.191.255 ru +185.120.192.0 - 185.120.203.255 ir +185.120.204.0 - 185.120.207.255 gb +185.120.208.0 - 185.120.251.255 ir +185.120.252.0 - 185.120.255.255 ru +185.121.0.0 - 185.121.3.255 tj +185.121.4.0 - 185.121.7.255 gb +185.121.8.0 - 185.121.11.255 nl +185.121.12.0 - 185.121.15.255 ad +185.121.16.0 - 185.121.19.255 gb +185.121.20.0 - 185.121.23.255 cy +185.121.24.0 - 185.121.27.255 gb +185.121.28.0 - 185.121.31.255 se +185.121.32.0 - 185.121.39.255 it +185.121.40.0 - 185.121.43.255 at +185.121.44.0 - 185.121.47.255 se +185.121.48.0 - 185.121.51.255 hr +185.121.52.0 - 185.121.55.255 at +185.121.56.0 - 185.121.59.255 ir +185.121.60.0 - 185.121.63.255 dk +185.121.64.0 - 185.121.67.255 sk +185.121.68.0 - 185.121.71.255 de +185.121.72.0 - 185.121.75.255 ru +185.121.76.0 - 185.121.79.255 gb +185.121.80.0 - 185.121.83.255 kz +185.121.84.0 - 185.121.87.255 ru +185.121.88.0 - 185.121.91.255 gb +185.121.92.0 - 185.121.95.255 nl +185.121.96.0 - 185.121.99.255 de +185.121.100.0 - 185.121.103.255 it +185.121.104.0 - 185.121.111.255 ua +185.121.112.0 - 185.121.115.255 nl +185.121.116.0 - 185.121.119.255 ua +185.121.120.0 - 185.121.123.255 md +185.121.124.0 - 185.121.127.255 tr +185.121.128.0 - 185.121.131.255 ir +185.121.132.0 - 185.121.135.255 gb +185.121.136.0 - 185.121.139.255 de +185.121.140.0 - 185.121.143.255 fr +185.121.144.0 - 185.121.147.255 gb +185.121.148.0 - 185.121.151.255 it +185.121.152.0 - 185.121.155.255 bg +185.121.156.0 - 185.121.159.255 it +185.121.160.0 - 185.121.163.255 no +185.121.164.0 - 185.121.167.255 nl +185.121.168.0 - 185.121.169.255 nz +185.121.170.0 - 185.121.170.255 nl +185.121.171.0 - 185.121.171.255 gb +185.121.172.0 - 185.121.175.255 dk +185.121.176.0 - 185.121.177.255 is +185.121.178.0 - 185.121.178.255 gb +185.121.179.0 - 185.121.179.255 is +185.121.180.0 - 185.121.183.255 nl +185.121.184.0 - 185.121.187.255 sy +185.121.188.0 - 185.121.191.255 nl +185.121.192.0 - 185.121.199.255 de +185.121.200.0 - 185.121.203.255 hr +185.121.204.0 - 185.121.207.255 se +185.121.208.0 - 185.121.211.255 it +185.121.212.0 - 185.121.215.255 de +185.121.216.0 - 185.121.219.255 fi +185.121.220.0 - 185.121.223.255 gb +185.121.224.0 - 185.121.227.255 nl +185.121.228.0 - 185.121.231.255 iq +185.121.232.0 - 185.121.235.255 es +185.121.236.0 - 185.121.239.255 am +185.121.240.0 - 185.121.247.255 ru +185.121.248.0 - 185.121.251.255 gb +185.121.252.0 - 185.121.255.255 sa +185.122.0.0 - 185.122.3.255 gb +185.122.4.0 - 185.122.7.255 de +185.122.8.0 - 185.122.11.255 il +185.122.12.0 - 185.122.15.255 tr +185.122.16.0 - 185.122.19.255 gb +185.122.20.0 - 185.122.23.255 nl +185.122.24.0 - 185.122.27.255 it +185.122.28.0 - 185.122.31.255 ru +185.122.32.0 - 185.122.35.255 kz +185.122.36.0 - 185.122.38.255 gb +185.122.39.0 - 185.122.39.255 tr +185.122.40.0 - 185.122.43.255 cz +185.122.44.0 - 185.122.47.255 it +185.122.48.0 - 185.122.51.255 ch +185.122.52.0 - 185.122.55.255 sk +185.122.56.0 - 185.122.59.255 gb +185.122.60.0 - 185.122.63.255 pl +185.122.64.0 - 185.122.71.255 gb +185.122.72.0 - 185.122.75.255 se +185.122.76.0 - 185.122.79.255 ch +185.122.80.0 - 185.122.83.255 ir +185.122.84.0 - 185.122.87.255 de +185.122.88.0 - 185.122.91.255 pl +185.122.92.0 - 185.122.95.255 lb +185.122.96.0 - 185.122.99.255 pl +185.122.100.0 - 185.122.103.255 fr +185.122.104.0 - 185.122.107.255 pl +185.122.108.0 - 185.122.111.255 fi +185.122.112.0 - 185.122.115.255 no +185.122.116.0 - 185.122.119.255 nl +185.122.120.0 - 185.122.123.255 sa +185.122.124.0 - 185.122.131.255 gb +185.122.132.0 - 185.122.135.255 ie +185.122.136.0 - 185.122.139.255 pl +185.122.140.0 - 185.122.140.255 lt +185.122.141.0 - 185.122.141.255 gb +185.122.142.0 - 185.122.142.255 lt +185.122.143.0 - 185.122.143.255 gb +185.122.144.0 - 185.122.151.255 pl +185.122.152.0 - 185.122.159.255 nl +185.122.160.0 - 185.122.163.255 fr +185.122.164.0 - 185.122.171.255 nl +185.122.172.0 - 185.122.175.255 pl +185.122.176.0 - 185.122.179.255 ru +185.122.180.0 - 185.122.183.255 de +185.122.184.0 - 185.122.187.255 es +185.122.188.0 - 185.122.191.255 dk +185.122.192.0 - 185.122.195.255 nl +185.122.196.0 - 185.122.199.255 no +185.122.200.0 - 185.122.203.255 tr +185.122.204.0 - 185.122.215.255 gb +185.122.216.0 - 185.122.219.255 cz +185.122.220.0 - 185.122.223.255 ro +185.122.224.0 - 185.122.227.255 it +185.122.228.0 - 185.122.231.255 al +185.122.232.0 - 185.122.235.255 gb +185.122.236.0 - 185.122.239.255 ch +185.122.240.0 - 185.122.243.255 de +185.122.244.0 - 185.122.247.255 ch +185.122.248.0 - 185.122.251.255 be +185.122.252.0 - 185.122.255.255 iq +185.123.0.0 - 185.123.3.255 tr +185.123.4.0 - 185.123.7.255 gb +185.123.8.0 - 185.123.11.255 it +185.123.12.0 - 185.123.15.255 ru +185.123.16.0 - 185.123.19.255 kz +185.123.20.0 - 185.123.23.255 sa +185.123.24.0 - 185.123.27.255 fr +185.123.28.0 - 185.123.31.255 gp +185.123.32.0 - 185.123.35.255 no +185.123.36.0 - 185.123.39.255 it +185.123.40.0 - 185.123.43.255 kz +185.123.44.0 - 185.123.47.255 ua +185.123.48.0 - 185.123.51.255 pl +185.123.52.0 - 185.123.55.255 ee +185.123.56.0 - 185.123.59.255 es +185.123.60.0 - 185.123.63.255 nl +185.123.64.0 - 185.123.71.255 ir +185.123.72.0 - 185.123.75.255 fr +185.123.76.0 - 185.123.79.255 ru +185.123.80.0 - 185.123.83.255 gb +185.123.84.0 - 185.123.87.255 fr +185.123.88.0 - 185.123.91.255 de +185.123.92.0 - 185.123.95.255 no +185.123.96.0 - 185.123.99.255 gb +185.123.100.0 - 185.123.107.255 tr +185.123.108.0 - 185.123.111.255 at +185.123.112.0 - 185.123.115.255 gb +185.123.116.0 - 185.123.119.255 fi +185.123.120.0 - 185.123.123.255 es +185.123.124.0 - 185.123.127.255 pl +185.123.128.0 - 185.123.131.255 cz +185.123.132.0 - 185.123.135.255 fi +185.123.136.0 - 185.123.139.255 es +185.123.140.0 - 185.123.143.255 ro +185.123.144.0 - 185.123.159.255 gb +185.123.160.0 - 185.123.163.255 pl +185.123.164.0 - 185.123.167.255 ru +185.123.168.0 - 185.123.171.255 ie +185.123.172.0 - 185.123.175.255 ru +185.123.176.0 - 185.123.179.255 at +185.123.180.0 - 185.123.183.255 fr +185.123.184.0 - 185.123.187.255 by +185.123.188.0 - 185.123.191.255 bg +185.123.192.0 - 185.123.195.255 ru +185.123.196.0 - 185.123.199.255 is +185.123.200.0 - 185.123.207.255 es +185.123.208.0 - 185.123.211.255 ir +185.123.212.0 - 185.123.215.255 it +185.123.216.0 - 185.123.219.255 lu +185.123.220.0 - 185.123.223.255 ro +185.123.224.0 - 185.123.227.255 de +185.123.228.0 - 185.123.231.255 se +185.123.232.0 - 185.123.235.255 it +185.123.236.0 - 185.123.243.255 gb +185.123.244.0 - 185.123.247.255 ro +185.123.248.0 - 185.124.3.255 gb +185.124.4.0 - 185.124.7.255 es +185.124.8.0 - 185.124.11.255 ua +185.124.12.0 - 185.124.15.255 ru +185.124.16.0 - 185.124.19.255 de +185.124.20.0 - 185.124.31.255 es +185.124.32.0 - 185.124.35.255 ro +185.124.36.0 - 185.124.39.255 es +185.124.40.0 - 185.124.43.255 ru +185.124.44.0 - 185.124.47.255 it +185.124.48.0 - 185.124.51.255 de +185.124.52.0 - 185.124.55.255 no +185.124.56.0 - 185.124.63.255 gb +185.124.64.0 - 185.124.75.255 de +185.124.76.0 - 185.124.79.255 no +185.124.80.0 - 185.124.83.255 cz +185.124.84.0 - 185.124.87.255 tr +185.124.88.0 - 185.124.95.255 fi +185.124.96.0 - 185.124.99.255 no +185.124.100.0 - 185.124.111.255 es +185.124.112.0 - 185.124.115.255 ir +185.124.116.0 - 185.124.119.255 pl +185.124.120.0 - 185.124.123.255 de +185.124.124.0 - 185.124.127.255 pt +185.124.128.0 - 185.124.131.255 pl +185.124.132.0 - 185.124.135.255 ch +185.124.136.0 - 185.124.143.255 es +185.124.144.0 - 185.124.147.255 at +185.124.148.0 - 185.124.151.255 iq +185.124.152.0 - 185.124.155.255 ru +185.124.156.0 - 185.124.159.255 ir +185.124.160.0 - 185.124.163.255 gb +185.124.164.0 - 185.124.167.255 ru +185.124.168.0 - 185.124.171.255 ua +185.124.172.0 - 185.124.175.255 ir +185.124.176.0 - 185.124.179.255 ru +185.124.180.0 - 185.124.183.255 it +185.124.184.0 - 185.124.187.255 pl +185.124.188.0 - 185.124.191.255 ru +185.124.192.0 - 185.124.199.255 de +185.124.200.0 - 185.124.203.255 nl +185.124.204.0 - 185.124.207.255 ie +185.124.208.0 - 185.124.211.255 ru +185.124.212.0 - 185.124.215.255 lb +185.124.216.0 - 185.124.219.255 fr +185.124.220.0 - 185.124.223.255 de +185.124.224.0 - 185.124.227.255 fr +185.124.228.0 - 185.124.231.255 ru +185.124.232.0 - 185.124.235.255 de +185.124.236.0 - 185.124.239.255 fr +185.124.240.0 - 185.124.243.255 ch +185.124.244.0 - 185.124.247.255 lb +185.124.248.0 - 185.124.251.255 ro +185.124.252.0 - 185.124.255.255 it +185.125.0.0 - 185.125.3.255 de +185.125.4.0 - 185.125.7.255 pl +185.125.8.0 - 185.125.11.255 nl +185.125.12.0 - 185.125.15.255 il +185.125.16.0 - 185.125.19.255 ru +185.125.20.0 - 185.125.23.255 ir +185.125.24.0 - 185.125.27.255 sa +185.125.28.0 - 185.125.31.255 fi +185.125.32.0 - 185.125.35.255 tr +185.125.36.0 - 185.125.39.255 ru +185.125.40.0 - 185.125.43.255 nl +185.125.44.0 - 185.125.47.255 kz +185.125.48.0 - 185.125.51.255 ru +185.125.52.0 - 185.125.55.255 fr +185.125.56.0 - 185.125.59.255 ru +185.125.60.0 - 185.125.63.255 rs +185.125.64.0 - 185.125.67.255 gb +185.125.68.0 - 185.125.71.255 it +185.125.72.0 - 185.125.75.255 ru +185.125.76.0 - 185.125.79.255 es +185.125.80.0 - 185.125.83.255 dk +185.125.84.0 - 185.125.87.255 es +185.125.88.0 - 185.125.91.255 kz +185.125.92.0 - 185.125.95.255 de +185.125.96.0 - 185.125.99.255 dk +185.125.100.0 - 185.125.103.255 ru +185.125.104.0 - 185.125.107.255 gb +185.125.108.0 - 185.125.111.255 ro +185.125.112.0 - 185.125.115.255 ru +185.125.116.0 - 185.125.119.255 nl +185.125.120.0 - 185.125.123.255 ba +185.125.124.0 - 185.125.127.255 pl +185.125.128.0 - 185.125.131.255 cz +185.125.132.0 - 185.125.135.255 pl +185.125.136.0 - 185.125.139.255 ru +185.125.140.0 - 185.125.143.255 gb +185.125.144.0 - 185.125.147.255 it +185.125.148.0 - 185.125.159.255 lb +185.125.160.0 - 185.125.163.255 no +185.125.164.0 - 185.125.167.255 ch +185.125.168.0 - 185.125.171.255 no +185.125.172.0 - 185.125.175.255 de +185.125.176.0 - 185.125.179.255 rs +185.125.180.0 - 185.125.183.255 lu +185.125.184.0 - 185.125.187.255 us +185.125.188.0 - 185.125.191.255 gb +185.125.192.0 - 185.125.195.255 ru +185.125.196.0 - 185.125.199.255 ch +185.125.200.0 - 185.125.203.255 ru +185.125.204.0 - 185.125.207.255 de +185.125.208.0 - 185.125.211.255 at +185.125.212.0 - 185.125.215.255 ch +185.125.216.0 - 185.125.219.255 ru +185.125.220.0 - 185.125.223.255 dk +185.125.224.0 - 185.125.224.1 de +185.125.224.2 - 185.125.224.2 gb +185.125.224.3 - 185.125.224.3 pl +185.125.224.4 - 185.125.224.4 fr +185.125.224.5 - 185.125.224.5 nl +185.125.224.6 - 185.125.224.6 at +185.125.224.7 - 185.125.224.7 it +185.125.224.8 - 185.125.224.8 ch +185.125.224.9 - 185.125.224.9 cz +185.125.224.10 - 185.125.224.10 dk +185.125.224.11 - 185.125.227.255 de +185.125.228.0 - 185.125.231.255 ru +185.125.232.0 - 185.125.239.255 nl +185.125.240.0 - 185.125.243.255 is +185.125.244.0 - 185.126.19.255 ir +185.126.20.0 - 185.126.23.255 at +185.126.24.0 - 185.126.27.255 gb +185.126.28.0 - 185.126.31.255 de +185.126.32.0 - 185.126.35.255 ae +185.126.36.0 - 185.126.39.255 no +185.126.40.0 - 185.126.43.255 ir +185.126.44.0 - 185.126.47.255 lb +185.126.48.0 - 185.126.51.255 be +185.126.52.0 - 185.126.55.255 dk +185.126.56.0 - 185.126.59.255 nl +185.126.60.0 - 185.126.63.255 is +185.126.64.0 - 185.126.67.255 nl +185.126.68.0 - 185.126.79.255 ro +185.126.80.0 - 185.126.83.255 es +185.126.84.0 - 185.126.87.255 ru +185.126.88.0 - 185.126.91.255 pt +185.126.92.0 - 185.126.95.255 ru +185.126.96.0 - 185.126.99.255 es +185.126.100.0 - 185.126.103.255 de +185.126.104.0 - 185.126.107.255 es +185.126.108.0 - 185.126.111.255 dk +185.126.112.0 - 185.126.115.255 ua +185.126.116.0 - 185.126.119.255 ro +185.126.120.0 - 185.126.123.255 nl +185.126.124.0 - 185.126.127.255 ir +185.126.128.0 - 185.126.131.255 ru +185.126.132.0 - 185.126.135.255 ir +185.126.136.0 - 185.126.139.255 gb +185.126.140.0 - 185.126.143.255 it +185.126.144.0 - 185.126.147.255 ir +185.126.148.0 - 185.126.151.255 gb +185.126.152.0 - 185.126.155.255 dk +185.126.156.0 - 185.126.159.255 ir +185.126.160.0 - 185.126.167.255 gb +185.126.168.0 - 185.126.171.255 de +185.126.172.0 - 185.126.175.255 gb +185.126.176.0 - 185.126.179.255 tr +185.126.180.0 - 185.126.183.255 ru +185.126.184.0 - 185.126.187.255 no +185.126.188.0 - 185.126.191.255 pl +185.126.192.0 - 185.126.195.255 ru +185.126.196.0 - 185.126.199.255 sk +185.126.200.0 - 185.126.203.255 ir +185.126.204.0 - 185.126.207.255 it +185.126.208.0 - 185.126.211.255 at +185.126.212.0 - 185.126.215.255 de +185.126.216.0 - 185.126.219.255 tr +185.126.220.0 - 185.126.223.255 ch +185.126.224.0 - 185.126.227.255 gb +185.126.228.0 - 185.126.235.255 fr +185.126.236.0 - 185.126.239.255 gb +185.126.240.0 - 185.126.243.255 de +185.126.244.0 - 185.126.247.255 fr +185.126.248.0 - 185.126.251.255 gb +185.126.252.0 - 185.126.255.255 ua +185.127.0.0 - 185.127.3.255 lt +185.127.4.0 - 185.127.7.255 fr +185.127.8.0 - 185.127.11.255 il +185.127.12.0 - 185.127.15.255 nl +185.127.16.0 - 185.127.19.255 gb +185.127.20.0 - 185.127.23.255 pl +185.127.24.0 - 185.127.27.255 ru +185.127.28.0 - 185.127.31.255 de +185.127.32.0 - 185.127.39.255 it +185.127.40.0 - 185.127.43.255 no +185.127.44.0 - 185.127.47.255 gb +185.127.48.0 - 185.127.51.255 dk +185.127.52.0 - 185.127.55.255 es +185.127.56.0 - 185.127.59.255 gb +185.127.60.0 - 185.127.63.255 fi +185.127.64.0 - 185.127.67.255 am +185.127.68.0 - 185.127.71.255 gb +185.127.72.0 - 185.127.75.255 fi +185.127.76.0 - 185.127.79.255 gb +185.127.80.0 - 185.127.83.255 fr +185.127.84.0 - 185.127.87.255 fi +185.127.88.0 - 185.127.91.255 dk +185.127.92.0 - 185.127.95.255 gb +185.127.96.0 - 185.127.99.255 dk +185.127.100.0 - 185.127.103.255 no +185.127.104.0 - 185.127.111.255 nl +185.127.112.0 - 185.127.115.255 ch +185.127.116.0 - 185.127.119.255 es +185.127.120.0 - 185.127.123.255 pl +185.127.124.0 - 185.127.127.255 lb +185.127.128.0 - 185.127.131.255 es +185.127.132.0 - 185.127.135.255 it +185.127.136.0 - 185.127.139.255 nl +185.127.140.0 - 185.127.143.255 gb +185.127.144.0 - 185.127.147.255 es +185.127.148.0 - 185.127.151.255 ru +185.127.152.0 - 185.127.159.255 gb +185.127.160.0 - 185.127.163.255 pt +185.127.164.0 - 185.127.167.255 ru +185.127.168.0 - 185.127.171.255 no +185.127.172.0 - 185.127.175.255 ch +185.127.176.0 - 185.127.179.255 ir +185.127.180.0 - 185.127.183.255 lb +185.127.184.0 - 185.127.187.255 nl +185.127.188.0 - 185.127.191.255 lb +185.127.192.0 - 185.127.195.255 gb +185.127.196.0 - 185.127.199.255 it +185.127.200.0 - 185.127.203.255 nl +185.127.204.0 - 185.127.207.255 ch +185.127.208.0 - 185.127.211.255 de +185.127.212.0 - 185.127.215.255 it +185.127.216.0 - 185.127.219.255 rs +185.127.220.0 - 185.127.223.255 it +185.127.224.0 - 185.127.227.255 ru +185.127.228.0 - 185.127.231.255 se +185.127.232.0 - 185.127.235.255 ir +185.127.236.0 - 185.127.239.255 it +185.127.240.0 - 185.127.243.255 fr +185.127.244.0 - 185.127.247.255 ua +185.127.248.0 - 185.127.251.255 gb +185.127.252.0 - 185.127.255.255 no +185.128.0.0 - 185.128.3.255 se +185.128.4.0 - 185.128.7.255 ru +185.128.8.0 - 185.128.11.255 ua +185.128.12.0 - 185.128.15.255 es +185.128.16.0 - 185.128.19.255 fi +185.128.20.0 - 185.128.23.255 pl +185.128.24.0 - 185.128.27.255 ae +185.128.28.0 - 185.128.31.255 it +185.128.32.0 - 185.128.35.255 nl +185.128.36.0 - 185.128.39.255 iq +185.128.40.0 - 185.128.43.255 ch +185.128.44.0 - 185.128.47.255 de +185.128.48.0 - 185.128.51.255 ir +185.128.52.0 - 185.128.55.255 es +185.128.56.0 - 185.128.59.255 gb +185.128.60.0 - 185.128.63.255 es +185.128.64.0 - 185.128.67.255 nl +185.128.68.0 - 185.128.71.255 de +185.128.72.0 - 185.128.75.255 dk +185.128.76.0 - 185.128.79.255 it +185.128.80.0 - 185.128.83.255 ir +185.128.84.0 - 185.128.87.255 ru +185.128.88.0 - 185.128.91.255 nl +185.128.92.0 - 185.128.95.255 ua +185.128.96.0 - 185.128.99.255 ro +185.128.100.0 - 185.128.103.255 dk +185.128.104.0 - 185.128.107.255 ru +185.128.108.0 - 185.128.111.255 de +185.128.112.0 - 185.128.115.255 tr +185.128.116.0 - 185.128.123.255 de +185.128.124.0 - 185.128.127.255 lb +185.128.128.0 - 185.128.131.255 es +185.128.132.0 - 185.128.135.255 gb +185.128.136.0 - 185.128.139.255 ir +185.128.140.0 - 185.128.143.255 fr +185.128.144.0 - 185.128.147.255 no +185.128.148.0 - 185.128.151.255 it +185.128.152.0 - 185.128.155.255 ir +185.128.156.0 - 185.128.159.255 pl +185.128.160.0 - 185.128.163.255 fi +185.128.164.0 - 185.128.167.255 ir +185.128.168.0 - 185.128.171.255 es +185.128.172.0 - 185.128.175.255 ch +185.128.176.0 - 185.128.179.255 gb +185.128.180.0 - 185.128.183.255 sy +185.128.184.0 - 185.128.187.255 nl +185.128.188.0 - 185.128.191.255 de +185.128.192.0 - 185.128.195.255 es +185.128.196.0 - 185.128.199.255 ru +185.128.200.0 - 185.128.203.255 by +185.128.204.0 - 185.128.211.255 gb +185.128.212.0 - 185.128.215.255 ru +185.128.216.0 - 185.128.219.255 de +185.128.220.0 - 185.128.227.255 gb +185.128.228.0 - 185.128.231.255 hu +185.128.232.0 - 185.128.235.255 ua +185.128.236.0 - 185.128.239.255 fr +185.128.240.0 - 185.128.243.255 ro +185.128.244.0 - 185.128.247.255 at +185.128.248.0 - 185.128.251.255 si +185.128.252.0 - 185.128.255.255 fi +185.129.0.0 - 185.129.3.255 az +185.129.4.0 - 185.129.7.255 iq +185.129.8.0 - 185.129.11.255 gb +185.129.12.0 - 185.129.15.255 hr +185.129.16.0 - 185.129.19.255 tr +185.129.20.0 - 185.129.23.255 gb +185.129.24.0 - 185.129.27.255 no +185.129.28.0 - 185.129.31.255 es +185.129.32.0 - 185.129.35.255 pl +185.129.36.0 - 185.129.39.255 ro +185.129.40.0 - 185.129.43.255 es +185.129.44.0 - 185.129.47.255 fr +185.129.48.0 - 185.129.51.255 kz +185.129.52.0 - 185.129.55.255 ch +185.129.56.0 - 185.129.59.255 ru +185.129.60.0 - 185.129.63.255 dk +185.129.64.0 - 185.129.67.255 no +185.129.68.0 - 185.129.71.255 nl +185.129.72.0 - 185.129.75.255 gb +185.129.76.0 - 185.129.79.255 pl +185.129.80.0 - 185.129.83.255 ir +185.129.84.0 - 185.129.87.255 de +185.129.88.0 - 185.129.91.255 it +185.129.92.0 - 185.129.95.255 az +185.129.96.0 - 185.129.103.255 ru +185.129.104.0 - 185.129.107.255 es +185.129.108.0 - 185.129.111.255 ir +185.129.112.0 - 185.129.115.255 pl +185.129.116.0 - 185.129.119.255 ir +185.129.120.0 - 185.129.123.255 rs +185.129.124.0 - 185.129.127.255 ir +185.129.128.0 - 185.129.131.255 ua +185.129.132.0 - 185.129.135.255 ie +185.129.136.0 - 185.129.139.255 cz +185.129.140.0 - 185.129.143.255 ir +185.129.144.0 - 185.129.147.255 ru +185.129.148.0 - 185.129.151.255 lv +185.129.152.0 - 185.129.155.255 fi +185.129.156.0 - 185.129.159.255 no +185.129.160.0 - 185.129.163.255 gb +185.129.164.0 - 185.129.167.255 fr +185.129.168.0 - 185.129.171.255 ir +185.129.172.0 - 185.129.175.255 at +185.129.176.0 - 185.129.179.255 gb +185.129.180.0 - 185.129.183.255 de +185.129.184.0 - 185.129.191.255 ir +185.129.192.0 - 185.129.195.255 kz +185.129.196.0 - 185.129.203.255 ir +185.129.204.0 - 185.129.207.255 ru +185.129.208.0 - 185.129.211.255 gb +185.129.212.0 - 185.129.219.255 ir +185.129.220.0 - 185.129.227.255 gb +185.129.228.0 - 185.129.243.255 ir +185.129.244.0 - 185.129.247.255 de +185.129.248.0 - 185.129.251.255 es +185.129.252.0 - 185.129.255.255 de +185.130.0.0 - 185.130.3.255 se +185.130.4.0 - 185.130.7.255 lt +185.130.8.0 - 185.130.11.255 de +185.130.12.0 - 185.130.15.255 is +185.130.16.0 - 185.130.19.255 hr +185.130.20.0 - 185.130.23.255 de +185.130.24.0 - 185.130.31.255 es +185.130.32.0 - 185.130.35.255 de +185.130.36.0 - 185.130.43.255 gb +185.130.44.0 - 185.130.47.255 pl +185.130.48.0 - 185.130.51.255 iq +185.130.52.0 - 185.130.55.255 ua +185.130.56.0 - 185.130.59.255 ru +185.130.60.0 - 185.130.63.255 iq +185.130.64.0 - 185.130.67.255 fi +185.130.68.0 - 185.130.71.255 no +185.130.72.0 - 185.130.75.255 nl +185.130.76.0 - 185.130.79.255 ir +185.130.80.0 - 185.130.83.255 ru +185.130.84.0 - 185.130.87.255 il +185.130.88.0 - 185.130.91.255 ru +185.130.92.0 - 185.130.95.255 gb +185.130.96.0 - 185.130.99.255 dk +185.130.100.0 - 185.130.103.255 gb +185.130.104.0 - 185.130.107.255 ru +185.130.108.0 - 185.130.111.255 pl +185.130.112.0 - 185.130.115.255 ru +185.130.116.0 - 185.130.119.255 fr +185.130.120.0 - 185.130.123.255 ua +185.130.124.0 - 185.130.127.255 rs +185.130.128.0 - 185.130.131.255 be +185.130.132.0 - 185.130.135.255 mk +185.130.136.0 - 185.130.139.255 lb +185.130.140.0 - 185.130.143.255 ch +185.130.144.0 - 185.130.147.255 es +185.130.148.0 - 185.130.151.255 be +185.130.152.0 - 185.130.155.255 es +185.130.156.0 - 185.130.159.255 gb +185.130.160.0 - 185.130.163.255 dk +185.130.164.0 - 185.130.167.255 se +185.130.168.0 - 185.130.175.255 nl +185.130.176.0 - 185.130.179.255 hu +185.130.180.0 - 185.130.183.255 pl +185.130.184.0 - 185.130.187.255 de +185.130.188.0 - 185.130.191.255 dk +185.130.192.0 - 185.130.195.255 de +185.130.196.0 - 185.130.199.255 gb +185.130.200.0 - 185.130.203.255 es +185.130.204.0 - 185.130.207.255 de +185.130.208.0 - 185.130.211.255 pl +185.130.212.0 - 185.130.215.255 ru +185.130.216.0 - 185.130.219.255 es +185.130.220.0 - 185.130.223.255 sk +185.130.224.0 - 185.130.231.255 nl +185.130.232.0 - 185.130.235.255 ru +185.130.236.0 - 185.130.239.255 us +185.130.240.0 - 185.130.243.255 nl +185.130.244.0 - 185.130.247.255 no +185.130.248.0 - 185.130.251.255 ru +185.130.252.0 - 185.130.255.255 at +185.131.0.0 - 185.131.3.255 lu +185.131.4.0 - 185.131.7.255 ch +185.131.8.0 - 185.131.11.255 gb +185.131.12.0 - 185.131.15.255 es +185.131.16.0 - 185.131.19.255 it +185.131.20.0 - 185.131.23.255 se +185.131.24.0 - 185.131.27.255 nl +185.131.28.0 - 185.131.31.255 ir +185.131.32.0 - 185.131.35.255 pl +185.131.36.0 - 185.131.39.255 lb +185.131.40.0 - 185.131.47.255 fr +185.131.48.0 - 185.131.51.255 tr +185.131.52.0 - 185.131.55.255 es +185.131.56.0 - 185.131.59.255 ae +185.131.60.0 - 185.131.63.255 cz +185.131.64.0 - 185.131.67.255 nl +185.131.68.0 - 185.131.71.255 ee +185.131.72.0 - 185.131.75.255 de +185.131.76.0 - 185.131.79.255 sa +185.131.80.0 - 185.131.83.255 fr +185.131.84.0 - 185.131.95.255 ir +185.131.96.0 - 185.131.99.255 sa +185.131.100.0 - 185.131.103.255 ir +185.131.104.0 - 185.131.107.255 ru +185.131.108.0 - 185.131.119.255 ir +185.131.120.0 - 185.131.123.255 de +185.131.124.0 - 185.131.131.255 ir +185.131.132.0 - 185.131.135.255 es +185.131.136.0 - 185.131.143.255 ir +185.131.144.0 - 185.131.147.255 ae +185.131.148.0 - 185.131.159.255 ir +185.131.160.0 - 185.131.163.255 it +185.131.164.0 - 185.131.171.255 ir +185.131.172.0 - 185.131.175.255 ru +185.131.176.0 - 185.131.179.255 ae +185.131.180.0 - 185.131.183.255 ru +185.131.184.0 - 185.131.187.255 es +185.131.188.0 - 185.131.191.255 iq +185.131.192.0 - 185.131.195.255 fr +185.131.196.0 - 185.131.199.255 de +185.131.200.0 - 185.131.207.255 gb +185.131.208.0 - 185.131.211.255 tr +185.131.212.0 - 185.131.215.255 it +185.131.216.0 - 185.131.219.255 fi +185.131.220.0 - 185.131.223.255 fr +185.131.224.0 - 185.131.227.255 pl +185.131.228.0 - 185.131.235.255 gb +185.131.236.0 - 185.131.239.255 de +185.131.240.0 - 185.131.243.255 pl +185.131.244.0 - 185.131.247.255 cz +185.131.248.0 - 185.131.255.255 it +185.132.0.0 - 185.132.3.255 ua +185.132.4.0 - 185.132.7.255 bg +185.132.8.0 - 185.132.15.255 gb +185.132.16.0 - 185.132.19.255 ch +185.132.20.0 - 185.132.23.255 ru +185.132.24.0 - 185.132.27.255 de +185.132.28.0 - 185.132.31.255 ru +185.132.32.0 - 185.132.35.255 de +185.132.36.0 - 185.132.43.255 gb +185.132.44.0 - 185.132.47.255 de +185.132.48.0 - 185.132.51.255 lt +185.132.52.0 - 185.132.55.255 pl +185.132.56.0 - 185.132.59.255 it +185.132.60.0 - 185.132.63.255 lu +185.132.64.0 - 185.132.67.255 fr +185.132.68.0 - 185.132.71.255 it +185.132.72.0 - 185.132.75.255 fr +185.132.76.0 - 185.132.79.255 gb +185.132.80.0 - 185.132.83.255 ir +185.132.84.0 - 185.132.87.255 gb +185.132.88.0 - 185.132.91.255 es +185.132.92.0 - 185.132.95.255 al +185.132.96.0 - 185.132.99.255 at +185.132.100.0 - 185.132.103.255 fr +185.132.104.0 - 185.132.107.255 fi +185.132.108.0 - 185.132.111.255 ro +185.132.112.0 - 185.132.115.255 cz +185.132.116.0 - 185.132.119.255 fr +185.132.120.0 - 185.132.127.255 tr +185.132.128.0 - 185.132.131.255 ch +185.132.132.0 - 185.132.135.255 ae +185.132.136.0 - 185.132.143.255 es +185.132.144.0 - 185.132.147.255 rs +185.132.148.0 - 185.132.151.255 lb +185.132.152.0 - 185.132.155.255 gb +185.132.156.0 - 185.132.159.255 il +185.132.160.0 - 185.132.163.255 me +185.132.164.0 - 185.132.171.255 ae +185.132.172.0 - 185.132.175.255 ro +185.132.176.0 - 185.132.179.255 ae +185.132.180.0 - 185.132.183.255 nl +185.132.184.0 - 185.132.195.255 ae +185.132.196.0 - 185.132.199.255 ru +185.132.200.0 - 185.132.203.255 ae +185.132.204.0 - 185.132.207.255 kw +185.132.208.0 - 185.132.211.255 de +185.132.212.0 - 185.132.215.255 ir +185.132.216.0 - 185.132.219.255 se +185.132.220.0 - 185.132.227.255 de +185.132.228.0 - 185.132.231.255 it +185.132.232.0 - 185.132.235.255 rs +185.132.236.0 - 185.132.239.255 nl +185.132.240.0 - 185.132.243.255 ru +185.132.244.0 - 185.132.247.255 gb +185.132.248.0 - 185.132.251.255 ps +185.132.252.0 - 185.132.255.255 nl +185.133.0.0 - 185.133.3.255 ru +185.133.4.0 - 185.133.7.255 es +185.133.8.0 - 185.133.15.255 de +185.133.16.0 - 185.133.19.255 eg +185.133.20.0 - 185.133.23.255 bg +185.133.24.0 - 185.133.27.255 de +185.133.28.0 - 185.133.31.255 ch +185.133.32.0 - 185.133.39.255 nl +185.133.40.0 - 185.133.43.255 ru +185.133.44.0 - 185.133.51.255 ch +185.133.52.0 - 185.133.55.255 fr +185.133.56.0 - 185.133.59.255 cz +185.133.60.0 - 185.133.63.255 sk +185.133.64.0 - 185.133.67.255 ro +185.133.68.0 - 185.133.71.255 se +185.133.72.0 - 185.133.73.255 nl +185.133.74.0 - 185.133.74.255 gb +185.133.75.0 - 185.133.75.255 nl +185.133.76.0 - 185.133.79.255 pt +185.133.80.0 - 185.133.83.255 fr +185.133.84.0 - 185.133.87.255 sa +185.133.88.0 - 185.133.91.255 pl +185.133.92.0 - 185.133.95.255 it +185.133.96.0 - 185.133.99.255 es +185.133.100.0 - 185.133.103.255 cz +185.133.104.0 - 185.133.107.255 de +185.133.108.0 - 185.133.111.255 nl +185.133.112.0 - 185.133.115.255 de +185.133.116.0 - 185.133.119.255 fr +185.133.120.0 - 185.133.123.255 es +185.133.124.0 - 185.133.127.255 kw +185.133.128.0 - 185.133.131.255 fr +185.133.132.0 - 185.133.135.255 hr +185.133.136.0 - 185.133.139.255 cz +185.133.140.0 - 185.133.143.255 no +185.133.144.0 - 185.133.147.255 cz +185.133.148.0 - 185.133.151.255 nl +185.133.152.0 - 185.133.155.255 ir +185.133.156.0 - 185.133.159.255 gb +185.133.160.0 - 185.133.163.255 pl +185.133.164.0 - 185.133.167.255 ir +185.133.168.0 - 185.133.171.255 gb +185.133.172.0 - 185.133.175.255 de +185.133.176.0 - 185.133.179.255 gb +185.133.180.0 - 185.133.183.255 sa +185.133.184.0 - 185.133.187.255 si +185.133.188.0 - 185.133.191.255 cz +185.133.192.0 - 185.133.195.255 gb +185.133.196.0 - 185.133.199.255 cz +185.133.200.0 - 185.133.203.255 es +185.133.204.0 - 185.133.207.255 se +185.133.208.0 - 185.133.211.255 ch +185.133.212.0 - 185.133.215.255 ir +185.133.216.0 - 185.133.219.255 it +185.133.220.0 - 185.133.223.255 gb +185.133.224.0 - 185.133.227.255 iq +185.133.228.0 - 185.133.231.255 ru +185.133.232.0 - 185.133.235.255 fr +185.133.236.0 - 185.133.239.255 de +185.133.240.0 - 185.133.243.255 cz +185.133.244.0 - 185.133.247.255 ae +185.133.248.0 - 185.133.251.255 gb +185.133.252.0 - 185.133.255.255 us +185.134.0.0 - 185.134.3.255 cz +185.134.4.0 - 185.134.7.255 de +185.134.8.0 - 185.134.11.255 it +185.134.12.0 - 185.134.19.255 se +185.134.20.0 - 185.134.23.255 de +185.134.24.0 - 185.134.27.255 be +185.134.28.0 - 185.134.31.255 dk +185.134.32.0 - 185.134.39.255 ru +185.134.40.0 - 185.134.43.255 es +185.134.44.0 - 185.134.47.255 de +185.134.48.0 - 185.134.51.255 gb +185.134.52.0 - 185.134.55.255 it +185.134.56.0 - 185.134.59.255 nl +185.134.60.0 - 185.134.63.255 cz +185.134.64.0 - 185.134.67.255 nl +185.134.68.0 - 185.134.71.255 it +185.134.72.0 - 185.134.75.255 ru +185.134.76.0 - 185.134.79.255 lu +185.134.80.0 - 185.134.83.255 hu +185.134.84.0 - 185.134.87.255 de +185.134.88.0 - 185.134.91.255 fi +185.134.92.0 - 185.134.95.255 se +185.134.96.0 - 185.134.99.255 ir +185.134.100.0 - 185.134.103.255 fi +185.134.104.0 - 185.134.107.255 gb +185.134.108.0 - 185.134.111.255 de +185.134.112.0 - 185.134.115.255 gr +185.134.116.0 - 185.134.119.255 cy +185.134.120.0 - 185.134.123.255 ru +185.134.124.0 - 185.134.127.255 no +185.134.128.0 - 185.134.131.255 de +185.134.132.0 - 185.134.135.255 sy +185.134.136.0 - 185.134.139.255 es +185.134.140.0 - 185.134.143.255 it +185.134.144.0 - 185.134.147.255 ie +185.134.148.0 - 185.134.151.255 ru +185.134.152.0 - 185.134.155.255 it +185.134.156.0 - 185.134.159.255 fr +185.134.160.0 - 185.134.163.255 cz +185.134.164.0 - 185.134.167.255 ch +185.134.168.0 - 185.134.171.255 tj +185.134.172.0 - 185.134.175.255 ge +185.134.176.0 - 185.134.179.255 lb +185.134.180.0 - 185.134.183.255 gb +185.134.184.0 - 185.134.187.255 tr +185.134.188.0 - 185.134.191.255 sk +185.134.192.0 - 185.134.195.255 bg +185.134.196.0 - 185.134.199.255 gb +185.134.200.0 - 185.134.207.255 ru +185.134.208.0 - 185.134.211.255 nl +185.134.212.0 - 185.134.215.255 sk +185.134.216.0 - 185.134.219.255 nl +185.134.220.0 - 185.134.223.255 de +185.134.224.0 - 185.134.227.255 gb +185.134.228.0 - 185.134.231.255 bg +185.134.232.0 - 185.134.235.255 ru +185.134.236.0 - 185.134.239.255 kz +185.134.240.0 - 185.134.243.255 de +185.134.244.0 - 185.134.247.255 no +185.134.248.0 - 185.134.251.255 nl +185.134.252.0 - 185.134.255.255 dk +185.135.0.0 - 185.135.3.255 pl +185.135.4.0 - 185.135.7.255 cz +185.135.8.0 - 185.135.11.255 de +185.135.12.0 - 185.135.15.255 be +185.135.16.0 - 185.135.19.255 at +185.135.20.0 - 185.135.23.255 cz +185.135.24.0 - 185.135.27.255 de +185.135.28.0 - 185.135.31.255 ir +185.135.32.0 - 185.135.35.255 de +185.135.36.0 - 185.135.39.255 gb +185.135.40.0 - 185.135.47.255 tr +185.135.48.0 - 185.135.51.255 sy +185.135.52.0 - 185.135.55.255 de +185.135.56.0 - 185.135.59.255 gb +185.135.60.0 - 185.135.63.255 dk +185.135.64.0 - 185.135.67.255 ro +185.135.68.0 - 185.135.71.255 iq +185.135.72.0 - 185.135.79.255 ir +185.135.80.0 - 185.135.83.255 ru +185.135.84.0 - 185.135.87.255 ir +185.135.88.0 - 185.135.91.255 pl +185.135.92.0 - 185.135.95.255 it +185.135.96.0 - 185.135.99.255 cy +185.135.100.0 - 185.135.103.255 it +185.135.104.0 - 185.135.107.255 gb +185.135.108.0 - 185.135.111.255 tr +185.135.112.0 - 185.135.115.255 it +185.135.116.0 - 185.135.119.255 es +185.135.120.0 - 185.135.123.255 pl +185.135.124.0 - 185.135.127.255 fr +185.135.128.0 - 185.135.131.255 gb +185.135.132.0 - 185.135.135.255 cz +185.135.136.0 - 185.135.139.255 ch +185.135.140.0 - 185.135.143.255 be +185.135.144.0 - 185.135.147.255 cz +185.135.148.0 - 185.135.151.255 ru +185.135.152.0 - 185.135.155.255 us +185.135.156.0 - 185.135.159.255 de +185.135.160.0 - 185.135.163.255 fr +185.135.164.0 - 185.135.171.255 gb +185.135.172.0 - 185.135.175.255 ru +185.135.176.0 - 185.135.179.255 fr +185.135.180.0 - 185.135.183.255 ru +185.135.184.0 - 185.135.187.255 bg +185.135.188.0 - 185.135.191.255 iq +185.135.192.0 - 185.135.195.255 pl +185.135.196.0 - 185.135.199.255 cz +185.135.200.0 - 185.135.203.255 jo +185.135.204.0 - 185.135.207.255 es +185.135.208.0 - 185.135.215.255 gb +185.135.216.0 - 185.135.219.255 fr +185.135.220.0 - 185.135.223.255 tr +185.135.224.0 - 185.135.227.255 pl +185.135.228.0 - 185.135.231.255 ir +185.135.232.0 - 185.135.235.255 ru +185.135.236.0 - 185.135.239.255 fr +185.135.240.0 - 185.135.243.255 nl +185.135.244.0 - 185.135.247.255 gb +185.135.248.0 - 185.135.251.255 lu +185.135.252.0 - 185.135.255.255 us +185.136.0.0 - 185.136.7.255 nl +185.136.8.0 - 185.136.11.255 ro +185.136.12.0 - 185.136.15.255 kz +185.136.16.0 - 185.136.19.255 md +185.136.20.0 - 185.136.20.255 se +185.136.21.0 - 185.136.21.255 fi +185.136.22.0 - 185.136.22.255 dk +185.136.23.0 - 185.136.23.255 no +185.136.24.0 - 185.136.27.255 de +185.136.28.0 - 185.136.31.255 es +185.136.32.0 - 185.136.35.255 ru +185.136.36.0 - 185.136.39.255 fi +185.136.40.0 - 185.136.43.255 fr +185.136.44.0 - 185.136.47.255 il +185.136.48.0 - 185.136.51.255 no +185.136.52.0 - 185.136.55.255 pt +185.136.56.0 - 185.136.59.255 tr +185.136.60.0 - 185.136.63.255 at +185.136.64.0 - 185.136.67.255 nl +185.136.68.0 - 185.136.75.255 gb +185.136.76.0 - 185.136.79.255 ru +185.136.80.0 - 185.136.83.255 at +185.136.84.0 - 185.136.87.255 tr +185.136.88.0 - 185.136.91.255 es +185.136.92.0 - 185.136.95.255 pl +185.136.96.0 - 185.136.96.255 us +185.136.97.0 - 185.136.99.255 bg +185.136.100.0 - 185.136.103.255 ir +185.136.104.0 - 185.136.107.255 gb +185.136.108.0 - 185.136.111.255 cz +185.136.112.0 - 185.136.115.255 de +185.136.116.0 - 185.136.119.255 dk +185.136.120.0 - 185.136.123.255 ch +185.136.124.0 - 185.136.127.255 it +185.136.128.0 - 185.136.131.255 no +185.136.132.0 - 185.136.135.255 pl +185.136.136.0 - 185.136.139.255 it +185.136.140.0 - 185.136.143.255 de +185.136.144.0 - 185.136.147.255 sy +185.136.148.0 - 185.136.151.255 iq +185.136.152.0 - 185.136.155.255 pl +185.136.156.0 - 185.136.159.255 gb +185.136.160.0 - 185.136.163.255 de +185.136.164.0 - 185.136.171.255 gb +185.136.172.0 - 185.136.175.255 ir +185.136.176.0 - 185.136.179.255 ro +185.136.180.0 - 185.136.183.255 ir +185.136.184.0 - 185.136.187.255 us +185.136.188.0 - 185.136.191.255 nl +185.136.192.0 - 185.136.195.255 ir +185.136.196.0 - 185.136.203.255 cz +185.136.204.0 - 185.136.207.255 tr +185.136.208.0 - 185.136.211.255 be +185.136.212.0 - 185.136.215.255 at +185.136.216.0 - 185.136.219.255 es +185.136.220.0 - 185.136.223.255 ir +185.136.224.0 - 185.136.227.255 pl +185.136.228.0 - 185.136.231.255 at +185.136.232.0 - 185.136.235.255 gb +185.136.236.0 - 185.136.239.255 nl +185.136.240.0 - 185.136.243.255 iq +185.136.244.0 - 185.136.251.255 gb +185.136.252.0 - 185.136.255.255 ie +185.137.0.0 - 185.137.3.255 gb +185.137.4.0 - 185.137.7.255 no +185.137.8.0 - 185.137.11.255 gb +185.137.12.0 - 185.137.15.255 de +185.137.16.0 - 185.137.19.255 nl +185.137.20.0 - 185.137.23.255 ie +185.137.24.0 - 185.137.27.255 ir +185.137.28.0 - 185.137.31.255 de +185.137.32.0 - 185.137.35.255 nl +185.137.36.0 - 185.137.39.255 ua +185.137.40.0 - 185.137.43.255 be +185.137.44.0 - 185.137.47.255 es +185.137.48.0 - 185.137.51.255 pl +185.137.52.0 - 185.137.59.255 es +185.137.60.0 - 185.137.63.255 ir +185.137.64.0 - 185.137.67.255 eu +185.137.68.0 - 185.137.71.255 es +185.137.72.0 - 185.137.75.255 fr +185.137.76.0 - 185.137.79.255 ru +185.137.80.0 - 185.137.83.255 nl +185.137.84.0 - 185.137.87.255 it +185.137.88.0 - 185.137.91.255 tr +185.137.92.0 - 185.137.95.255 de +185.137.96.0 - 185.137.99.255 lu +185.137.100.0 - 185.137.107.255 es +185.137.108.0 - 185.137.111.255 ir +185.137.112.0 - 185.137.115.255 dk +185.137.116.0 - 185.137.119.255 by +185.137.120.0 - 185.137.123.255 de +185.137.124.0 - 185.137.127.255 cz +185.137.128.0 - 185.137.131.255 gb +185.137.132.0 - 185.137.135.255 ro +185.137.136.0 - 185.137.139.255 de +185.137.140.0 - 185.137.143.255 es +185.137.144.0 - 185.137.147.255 cz +185.137.148.0 - 185.137.151.255 pl +185.137.152.0 - 185.137.155.255 es +185.137.156.0 - 185.137.159.255 ro +185.137.160.0 - 185.137.163.255 ru +185.137.164.0 - 185.137.167.255 ch +185.137.168.0 - 185.137.171.255 de +185.137.172.0 - 185.137.175.255 ch +185.137.176.0 - 185.137.179.255 ru +185.137.180.0 - 185.137.181.255 gb +185.137.182.0 - 185.137.183.255 nl +185.137.184.0 - 185.137.187.255 de +185.137.188.0 - 185.137.191.255 se +185.137.192.0 - 185.137.199.255 gb +185.137.200.0 - 185.137.203.255 nl +185.137.204.0 - 185.137.207.255 it +185.137.208.0 - 185.137.211.255 nl +185.137.212.0 - 185.137.215.255 tr +185.137.216.0 - 185.137.219.255 ua +185.137.220.0 - 185.137.223.255 gb +185.137.224.0 - 185.137.227.255 it +185.137.228.0 - 185.137.231.255 fr +185.137.232.0 - 185.137.235.255 ru +185.137.236.0 - 185.137.239.255 ch +185.137.240.0 - 185.137.243.255 gb +185.137.244.0 - 185.137.247.255 sa +185.137.248.0 - 185.137.251.255 pl +185.137.252.0 - 185.137.255.255 fr +185.138.0.0 - 185.138.3.255 us +185.138.4.0 - 185.138.7.255 de +185.138.8.0 - 185.138.11.255 ru +185.138.12.0 - 185.138.15.255 az +185.138.16.0 - 185.138.19.255 es +185.138.20.0 - 185.138.23.255 ch +185.138.24.0 - 185.138.27.255 de +185.138.28.0 - 185.138.31.255 es +185.138.32.0 - 185.138.35.255 no +185.138.36.0 - 185.138.39.255 it +185.138.40.0 - 185.138.43.255 gr +185.138.44.0 - 185.138.47.255 cz +185.138.48.0 - 185.138.51.255 fi +185.138.52.0 - 185.138.55.255 de +185.138.56.0 - 185.138.59.255 nl +185.138.60.0 - 185.138.63.255 gb +185.138.64.0 - 185.138.67.255 se +185.138.68.0 - 185.138.71.255 cz +185.138.72.0 - 185.138.75.255 no +185.138.76.0 - 185.138.79.255 ua +185.138.80.0 - 185.138.83.255 nl +185.138.84.0 - 185.138.87.255 tr +185.138.88.0 - 185.138.91.255 ru +185.138.92.0 - 185.138.95.255 es +185.138.96.0 - 185.138.99.255 be +185.138.100.0 - 185.138.103.255 kg +185.138.104.0 - 185.138.107.255 fr +185.138.108.0 - 185.138.111.255 cz +185.138.112.0 - 185.138.115.255 ie +185.138.116.0 - 185.138.119.255 fr +185.138.120.0 - 185.138.123.255 iq +185.138.124.0 - 185.138.127.255 at +185.138.128.0 - 185.138.131.255 ru +185.138.132.0 - 185.138.135.255 gb +185.138.136.0 - 185.138.143.255 de +185.138.144.0 - 185.138.147.255 dk +185.138.148.0 - 185.138.151.255 fr +185.138.152.0 - 185.138.159.255 gb +185.138.160.0 - 185.138.163.255 ru +185.138.164.0 - 185.138.167.255 de +185.138.168.0 - 185.138.171.255 il +185.138.172.0 - 185.138.175.255 is +185.138.176.0 - 185.138.179.255 bg +185.138.180.0 - 185.138.183.255 ru +185.138.184.0 - 185.138.187.255 kg +185.138.188.0 - 185.138.191.255 cz +185.138.192.0 - 185.138.199.255 gb +185.138.200.0 - 185.138.207.255 ru +185.138.208.0 - 185.138.211.255 nl +185.138.212.0 - 185.138.215.255 ru +185.138.216.0 - 185.138.219.255 it +185.138.220.0 - 185.138.223.255 cz +185.138.224.0 - 185.138.227.255 pl +185.138.228.0 - 185.138.231.255 ua +185.138.232.0 - 185.138.235.255 gb +185.138.236.0 - 185.138.239.255 pl +185.138.240.0 - 185.138.243.255 nl +185.138.244.0 - 185.138.247.255 cz +185.138.248.0 - 185.138.251.255 nl +185.138.252.0 - 185.138.255.255 ru +185.139.0.0 - 185.139.3.255 de +185.139.4.0 - 185.139.7.255 bg +185.139.8.0 - 185.139.11.255 sa +185.139.12.0 - 185.139.15.255 lb +185.139.16.0 - 185.139.19.255 pl +185.139.20.0 - 185.139.23.255 fr +185.139.24.0 - 185.139.27.255 gb +185.139.28.0 - 185.139.31.255 it +185.139.32.0 - 185.139.35.255 de +185.139.36.0 - 185.139.39.255 gb +185.139.40.0 - 185.139.43.255 pl +185.139.44.0 - 185.139.47.255 be +185.139.48.0 - 185.139.51.255 it +185.139.52.0 - 185.139.55.255 ua +185.139.56.0 - 185.139.59.255 ge +185.139.60.0 - 185.139.63.255 es +185.139.64.0 - 185.139.67.255 ir +185.139.68.0 - 185.139.71.255 ro +185.139.72.0 - 185.139.75.255 ch +185.139.76.0 - 185.139.79.255 de +185.139.80.0 - 185.139.87.255 dk +185.139.88.0 - 185.139.91.255 no +185.139.92.0 - 185.139.99.255 de +185.139.100.0 - 185.139.103.255 dk +185.139.104.0 - 185.139.107.255 it +185.139.108.0 - 185.139.111.255 ru +185.139.112.0 - 185.139.115.255 de +185.139.116.0 - 185.139.119.255 ge +185.139.120.0 - 185.139.123.255 sa +185.139.124.0 - 185.139.127.255 pl +185.139.128.0 - 185.139.131.255 us +185.139.132.0 - 185.139.135.255 fr +185.139.136.0 - 185.139.139.255 uz +185.139.140.0 - 185.139.147.255 gb +185.139.148.0 - 185.139.151.255 nl +185.139.152.0 - 185.139.155.255 no +185.139.156.0 - 185.139.159.255 de +185.139.160.0 - 185.139.167.255 no +185.139.168.0 - 185.139.171.255 fi +185.139.172.0 - 185.139.175.255 no +185.139.176.0 - 185.139.179.255 es +185.139.180.0 - 185.139.183.255 it +185.139.184.0 - 185.139.187.255 ch +185.139.188.0 - 185.139.191.255 no +185.139.192.0 - 185.139.195.255 es +185.139.196.0 - 185.139.199.255 tr +185.139.200.0 - 185.139.203.255 ua +185.139.204.0 - 185.139.207.255 de +185.139.208.0 - 185.139.211.255 at +185.139.212.0 - 185.139.215.255 ru +185.139.216.0 - 185.139.219.255 cz +185.139.220.0 - 185.139.223.255 jo +185.139.224.0 - 185.139.227.255 sk +185.139.228.0 - 185.139.231.255 il +185.139.232.0 - 185.139.235.255 dk +185.139.236.0 - 185.139.239.255 de +185.139.240.0 - 185.139.243.255 il +185.139.244.0 - 185.139.251.255 fr +185.139.252.0 - 185.139.255.255 ee +185.140.0.0 - 185.140.3.255 dk +185.140.4.0 - 185.140.7.255 ir +185.140.8.0 - 185.140.11.255 gb +185.140.12.0 - 185.140.15.255 ir +185.140.16.0 - 185.140.19.255 gb +185.140.20.0 - 185.140.23.255 nl +185.140.24.0 - 185.140.27.255 pl +185.140.28.0 - 185.140.31.255 sk +185.140.32.0 - 185.140.35.255 es +185.140.36.0 - 185.140.39.255 de +185.140.40.0 - 185.140.43.255 sk +185.140.44.0 - 185.140.47.255 fr +185.140.48.0 - 185.140.51.255 us +185.140.52.0 - 185.140.55.255 se +185.140.56.0 - 185.140.59.255 ir +185.140.60.0 - 185.140.67.255 es +185.140.68.0 - 185.140.71.255 fr +185.140.72.0 - 185.140.75.255 nl +185.140.76.0 - 185.140.79.255 pl +185.140.80.0 - 185.140.83.255 gb +185.140.84.0 - 185.140.87.255 at +185.140.88.0 - 185.140.91.255 ch +185.140.92.0 - 185.140.95.255 ie +185.140.96.0 - 185.140.99.255 ae +185.140.100.0 - 185.140.103.255 pl +185.140.104.0 - 185.140.107.255 de +185.140.108.0 - 185.140.111.255 hu +185.140.112.0 - 185.140.115.255 at +185.140.116.0 - 185.140.119.255 se +185.140.120.0 - 185.140.123.255 pl +185.140.124.0 - 185.140.127.255 tr +185.140.128.0 - 185.140.131.255 fr +185.140.132.0 - 185.140.135.255 ru +185.140.136.0 - 185.140.139.255 fr +185.140.140.0 - 185.140.143.255 at +185.140.144.0 - 185.140.147.255 gb +185.140.148.0 - 185.140.151.255 ru +185.140.152.0 - 185.140.155.255 it +185.140.156.0 - 185.140.159.255 nl +185.140.160.0 - 185.140.163.255 ru +185.140.164.0 - 185.140.167.255 nl +185.140.168.0 - 185.140.171.255 it +185.140.172.0 - 185.140.179.255 us +185.140.180.0 - 185.140.183.255 ps +185.140.184.0 - 185.140.187.255 nl +185.140.188.0 - 185.140.191.255 es +185.140.192.0 - 185.140.195.255 iq +185.140.196.0 - 185.140.199.255 fr +185.140.200.0 - 185.140.207.255 de +185.140.208.0 - 185.140.211.255 ru +185.140.212.0 - 185.140.219.255 es +185.140.220.0 - 185.140.223.255 fi +185.140.224.0 - 185.140.227.255 nl +185.140.228.0 - 185.140.231.255 lt +185.140.232.0 - 185.140.235.255 ir +185.140.236.0 - 185.140.239.255 cz +185.140.240.0 - 185.140.243.255 ir +185.140.244.0 - 185.140.247.255 cz +185.151.114.238 - 185.151.114.238 ca 186.0.0.0 - 186.0.127.255 co 186.0.128.0 - 186.0.143.255 ar 186.0.144.0 - 186.0.151.255 ec @@ -82799,7 +72100,9 @@ 186.0.156.0 - 186.0.159.255 bo 186.0.160.0 - 186.0.187.255 ar 186.0.188.0 - 186.0.191.255 py -186.0.192.0 - 186.0.255.255 ar +186.0.192.0 - 186.0.215.255 ar +186.0.216.0 - 186.0.216.255 cl +186.0.217.0 - 186.0.255.255 ar 186.1.0.0 - 186.1.63.255 ni 186.1.64.0 - 186.1.127.255 do 186.1.128.0 - 186.1.159.255 pa @@ -82809,12 +72112,27 @@ 186.1.248.0 - 186.1.255.255 co 186.2.0.0 - 186.2.127.255 bo 186.2.128.0 - 186.2.159.255 hn -186.2.192.0 - 186.2.223.255 py +186.2.160.0 - 186.2.166.255 ru +186.2.167.0 - 186.2.167.255 bz +186.2.168.0 - 186.2.168.255 ec +186.2.169.0 - 186.2.175.255 bz +186.2.176.0 - 186.2.191.255 cw +186.2.192.0 - 186.2.239.255 py +186.2.240.0 - 186.2.243.255 cr +186.2.244.0 - 186.2.247.255 gf +186.2.251.0 - 186.2.251.255 bz +186.2.252.0 - 186.2.255.255 cl 186.3.0.0 - 186.3.255.255 ec 186.4.0.0 - 186.4.63.255 cr 186.4.64.0 - 186.4.127.255 ar 186.4.128.0 - 186.5.127.255 ec -186.5.128.0 - 186.5.159.255 pa +186.5.128.0 - 186.5.128.255 pa +186.5.129.0 - 186.5.129.63 cr +186.5.129.64 - 186.5.159.255 pa +186.5.160.0 - 186.5.175.255 cr +186.5.176.0 - 186.5.231.255 ar +186.5.232.0 - 186.5.239.255 cl +186.5.240.0 - 186.5.255.255 ar 186.6.0.0 - 186.7.255.255 do 186.8.0.0 - 186.8.255.255 uy 186.9.0.0 - 186.11.255.255 cl @@ -82826,37 +72144,112 @@ 186.20.0.0 - 186.21.255.255 cl 186.22.0.0 - 186.23.255.255 ar 186.24.0.0 - 186.26.63.255 ve -186.26.64.0 - 186.26.111.255 ar +186.26.64.0 - 186.26.95.255 us +186.26.96.0 - 186.26.103.255 ar +186.26.104.0 - 186.26.111.255 us 186.26.112.0 - 186.26.127.255 cr 186.26.128.0 - 186.26.255.255 ve -186.27.0.0 - 186.27.63.255 bo -186.28.0.0 - 186.31.255.255 co -186.32.0.0 - 186.32.63.255 gt -186.32.64.0 - 186.32.95.255 sv -186.32.96.0 - 186.32.255.255 gt +186.27.0.0 - 186.27.127.255 bo +186.27.128.0 - 186.31.255.255 co +186.32.0.0 - 186.32.63.255 cr +186.32.64.0 - 186.32.127.255 sv +186.32.128.0 - 186.32.159.255 hn +186.32.160.0 - 186.32.223.255 cr +186.32.224.0 - 186.32.247.255 hn +186.32.248.0 - 186.32.255.255 sv +186.33.0.0 - 186.33.7.255 us +186.33.8.0 - 186.33.13.255 ar +186.33.14.0 - 186.33.15.255 us +186.33.16.0 - 186.33.17.255 ar +186.33.18.0 - 186.33.19.255 us +186.33.20.0 - 186.33.23.255 ar +186.33.24.0 - 186.33.25.255 us +186.33.26.0 - 186.33.27.255 ar +186.33.28.0 - 186.33.31.255 us +186.33.32.0 - 186.33.35.255 ar +186.33.36.0 - 186.33.37.255 us +186.33.38.0 - 186.33.39.255 ar +186.33.40.0 - 186.33.41.255 us +186.33.42.0 - 186.33.43.255 ar +186.33.44.0 - 186.33.44.255 us +186.33.45.0 - 186.33.48.255 ar +186.33.49.0 - 186.33.52.255 us +186.33.53.0 - 186.33.55.255 ar +186.33.56.0 - 186.33.56.255 us +186.33.57.0 - 186.33.57.255 ar +186.33.58.0 - 186.33.59.255 us +186.33.60.0 - 186.33.60.255 ar +186.33.61.0 - 186.33.61.255 us +186.33.62.0 - 186.33.63.255 ar +186.33.64.0 - 186.33.127.255 do +186.33.128.0 - 186.33.191.255 ec +186.33.192.0 - 186.33.255.255 ar 186.34.0.0 - 186.37.255.255 cl 186.38.0.0 - 186.39.255.255 ar 186.40.0.0 - 186.41.255.255 cl 186.42.0.0 - 186.42.255.255 ec 186.43.0.0 - 186.43.127.255 co -186.43.128.0 - 186.43.191.255 ec +186.43.128.0 - 186.43.255.255 ec 186.44.0.0 - 186.45.255.255 tt 186.46.0.0 - 186.47.255.255 ec 186.48.0.0 - 186.55.255.255 uy -186.56.0.0 - 186.64.127.255 ar +186.56.0.0 - 186.64.103.255 ar +186.64.104.0 - 186.64.111.255 gt +186.64.112.0 - 186.64.123.255 cl +186.64.124.0 - 186.64.127.255 pe 186.64.128.0 - 186.64.255.255 cr 186.65.0.0 - 186.65.63.255 ec +186.65.64.0 - 186.65.71.255 ar +186.65.72.0 - 186.65.79.255 cl +186.65.80.0 - 186.65.87.255 ar +186.65.88.0 - 186.65.91.255 bz +186.65.92.0 - 186.65.95.255 cr +186.65.96.0 - 186.65.103.255 ar +186.65.104.0 - 186.65.107.255 pa +186.65.108.0 - 186.65.111.255 ar +186.65.112.0 - 186.65.115.15 hn +186.65.115.16 - 186.65.115.31 cm +186.65.115.32 - 186.65.117.207 hn +186.65.117.208 - 186.65.117.223 ph +186.65.117.224 - 186.65.121.111 hn +186.65.121.112 - 186.65.121.127 vn +186.65.121.128 - 186.65.124.127 hn +186.65.124.128 - 186.65.124.143 fr +186.65.124.144 - 186.65.127.255 hn 186.65.128.0 - 186.65.255.255 cl 186.66.0.0 - 186.66.255.255 ec 186.67.0.0 - 186.67.255.255 cl 186.68.0.0 - 186.71.255.255 ec -186.72.0.0 - 186.72.255.255 co -186.73.0.0 - 186.75.255.255 pa +186.72.0.0 - 186.75.255.255 pa 186.76.0.0 - 186.77.255.255 ni 186.78.0.0 - 186.79.255.255 cl 186.80.0.0 - 186.87.255.255 co 186.88.0.0 - 186.95.255.255 ve -186.96.0.0 - 186.96.255.255 ar +186.96.0.0 - 186.96.8.127 ar +186.96.8.128 - 186.96.8.255 us +186.96.9.0 - 186.96.16.127 ar +186.96.16.128 - 186.96.16.255 us +186.96.17.0 - 186.96.18.255 ar +186.96.19.0 - 186.96.19.127 us +186.96.19.128 - 186.96.26.127 ar +186.96.26.128 - 186.96.26.255 us +186.96.27.0 - 186.96.27.127 ar +186.96.27.128 - 186.96.27.255 us +186.96.28.0 - 186.96.29.255 ar +186.96.30.0 - 186.96.30.127 us +186.96.30.128 - 186.96.34.255 ar +186.96.35.0 - 186.96.35.127 us +186.96.35.128 - 186.96.40.127 ar +186.96.40.128 - 186.96.40.255 us +186.96.41.0 - 186.96.63.255 ar +186.96.64.0 - 186.96.76.255 ve +186.96.77.0 - 186.96.77.255 pa +186.96.78.0 - 186.96.79.255 ve +186.96.80.0 - 186.96.95.255 cr +186.96.96.0 - 186.96.111.255 pa +186.96.112.0 - 186.96.127.255 us +186.96.128.0 - 186.96.251.255 ar +186.96.252.0 - 186.96.255.255 hn 186.97.0.0 - 186.99.255.255 co 186.100.0.0 - 186.100.255.255 ar 186.101.0.0 - 186.101.255.255 ec @@ -82866,49 +72259,85 @@ 186.112.0.0 - 186.119.255.255 co 186.120.0.0 - 186.120.255.255 do 186.121.0.0 - 186.121.127.255 co -186.122.0.0 - 186.127.255.255 ar -186.128.0.0 - 186.128.255.255 uy -186.129.0.0 - 186.143.255.255 ar +186.121.128.0 - 186.121.191.255 ar +186.121.192.0 - 186.121.255.255 bo +186.122.0.0 - 186.143.255.255 ar 186.144.0.0 - 186.147.255.255 co 186.148.0.0 - 186.148.63.255 cl -186.148.128.0 - 186.148.159.255 ar -186.148.160.0 - 186.148.199.255 pa +186.148.64.0 - 186.148.87.255 ar +186.148.88.0 - 186.148.95.255 do +186.148.96.0 - 186.148.111.255 pa +186.148.112.0 - 186.148.159.255 ar +186.148.160.0 - 186.148.161.255 cy +186.148.162.0 - 186.148.199.255 pa 186.148.200.0 - 186.148.207.255 ar 186.148.208.0 - 186.148.211.255 cl 186.148.212.0 - 186.148.215.255 cr -186.148.216.0 - 186.148.223.255 an -186.148.224.0 - 186.148.255.255 ar -186.149.0.0 - 186.149.255.255 do +186.148.216.0 - 186.148.219.255 aw +186.148.220.0 - 186.148.223.255 cw +186.148.224.0 - 186.148.227.255 ar +186.148.228.0 - 186.148.230.255 ru +186.148.231.0 - 186.148.231.255 br +186.148.232.0 - 186.148.255.255 ar +186.149.0.0 - 186.150.255.255 do 186.151.0.0 - 186.151.255.255 gt 186.152.0.0 - 186.153.255.255 ar -186.154.0.0 - 186.154.255.255 co -186.156.0.0 - 186.156.127.255 cl -186.157.0.0 - 186.157.255.255 ar +186.154.0.0 - 186.155.255.255 co +186.156.0.0 - 186.156.255.255 cl +186.157.0.0 - 186.158.255.255 ar +186.159.0.0 - 186.159.95.255 co +186.159.96.0 - 186.159.111.255 bq +186.159.112.0 - 186.159.115.255 co +186.159.116.0 - 186.159.119.255 pa +186.159.120.0 - 186.159.127.255 ar +186.159.128.0 - 186.159.255.255 cr 186.160.0.0 - 186.163.255.255 pe 186.164.0.0 - 186.167.255.255 ve 186.168.0.0 - 186.171.255.255 co 186.172.0.0 - 186.175.255.255 cl -186.176.0.0 - 186.177.255.255 cr +186.176.0.0 - 186.177.191.255 cr +186.177.192.0 - 186.177.255.255 ar 186.178.0.0 - 186.178.255.255 ec +186.179.0.0 - 186.179.63.255 hn +186.179.64.0 - 186.179.79.255 cr +186.179.80.0 - 186.179.95.255 cl +186.179.96.0 - 186.179.111.255 co +186.179.112.0 - 186.179.127.255 pa +186.179.128.0 - 186.179.255.255 sr 186.180.0.0 - 186.181.255.255 co -186.182.0.0 - 186.182.255.255 ar +186.182.0.0 - 186.183.127.255 ar +186.183.128.0 - 186.183.255.255 co 186.184.0.0 - 186.188.127.255 ve 186.188.128.0 - 186.188.255.255 pa 186.189.0.0 - 186.189.255.255 ar 186.190.0.0 - 186.190.127.255 ht 186.190.128.0 - 186.190.207.255 ar -186.190.208.0 - 186.190.231.255 pa -186.190.232.0 - 186.190.235.255 an +186.190.208.0 - 186.190.223.255 pa +186.190.224.0 - 186.190.225.255 cy +186.190.226.0 - 186.190.231.255 pa +186.190.232.0 - 186.190.235.255 cw 186.190.236.0 - 186.190.239.255 cl -186.190.240.0 - 186.190.255.255 an +186.190.240.0 - 186.190.255.255 cw 186.191.0.0 - 186.191.255.255 ar -186.192.0.0 - 187.127.255.255 br -187.128.0.0 - 187.255.255.255 mx +186.192.0.0 - 186.194.139.255 br +186.194.140.0 - 186.194.143.255 mx +186.194.144.0 - 186.250.151.255 br +186.250.152.0 - 186.250.155.255 ar +186.250.156.0 - 187.49.247.255 br +187.49.248.0 - 187.49.255.255 cr +187.50.0.0 - 187.127.255.255 br +187.128.0.0 - 187.179.255.255 mx +187.180.0.0 - 187.183.255.255 br +187.184.0.0 - 187.191.95.255 mx +187.191.96.0 - 187.191.127.255 br +187.191.128.0 - 187.254.255.255 mx +187.255.0.0 - 187.255.255.255 br 188.0.0.0 - 188.0.31.255 ru 188.0.32.0 - 188.0.39.255 pl 188.0.40.0 - 188.0.47.255 ru 188.0.48.0 - 188.0.63.255 ee -188.0.64.0 - 188.0.159.255 ua +188.0.64.0 - 188.0.127.255 ua +188.0.128.0 - 188.0.159.255 kz 188.0.160.0 - 188.0.223.255 ru 188.0.224.0 - 188.0.255.255 md 188.1.0.0 - 188.1.255.255 de @@ -82916,34 +72345,37 @@ 188.3.0.0 - 188.3.255.255 tr 188.4.0.0 - 188.4.255.255 gr 188.5.0.0 - 188.5.255.255 be -188.6.0.0 - 188.6.255.255 hu +188.6.0.0 - 188.6.240.255 hu +188.6.241.0 - 188.6.241.255 bg +188.6.242.0 - 188.6.255.255 hu 188.7.0.0 - 188.7.255.255 fr 188.8.0.0 - 188.15.255.255 it 188.16.0.0 - 188.19.255.255 ru -188.20.0.0 - 188.21.52.155 at -188.21.52.156 - 188.21.52.159 es -188.21.52.160 - 188.23.255.255 at +188.20.0.0 - 188.23.255.255 at 188.24.0.0 - 188.27.255.255 ro 188.28.0.0 - 188.31.255.255 gb 188.32.0.0 - 188.32.255.255 ru 188.33.0.0 - 188.33.255.255 pl 188.34.0.0 - 188.34.255.255 ir 188.35.0.0 - 188.35.255.255 ru -188.36.0.0 - 188.36.247.255 hu -188.36.248.0 - 188.36.248.255 ro -188.36.249.0 - 188.36.255.255 hu +188.36.0.0 - 188.36.255.255 hu 188.37.0.0 - 188.37.255.255 pt 188.38.0.0 - 188.38.255.255 tr 188.39.0.0 - 188.39.255.255 gb -188.40.0.0 - 188.40.208.143 de -188.40.208.144 - 188.40.208.159 nl -188.40.208.160 - 188.40.217.151 de -188.40.217.152 - 188.40.217.159 it -188.40.217.160 - 188.40.254.255 de -188.40.255.0 - 188.40.255.31 ch -188.40.255.32 - 188.40.255.255 de +188.40.0.0 - 188.40.255.255 de 188.41.0.0 - 188.41.255.255 tr -188.42.0.0 - 188.42.255.255 lu +188.42.0.0 - 188.42.215.255 lu +188.42.216.0 - 188.42.223.255 sg +188.42.224.0 - 188.42.231.255 nl +188.42.232.0 - 188.42.239.255 lu +188.42.240.0 - 188.42.251.255 us +188.42.252.0 - 188.42.252.255 sg +188.42.253.0 - 188.42.253.21 cn +188.42.253.22 - 188.42.253.22 sg +188.42.253.23 - 188.42.253.255 cn +188.42.254.0 - 188.42.255.127 sg +188.42.255.128 - 188.42.255.191 cn +188.42.255.192 - 188.42.255.255 sg 188.43.0.0 - 188.43.255.255 ru 188.44.0.0 - 188.44.31.255 mk 188.44.32.0 - 188.44.63.255 ru @@ -82955,21 +72387,20 @@ 188.47.0.0 - 188.47.255.255 pl 188.48.0.0 - 188.55.255.255 sa 188.56.0.0 - 188.59.255.255 tr -188.60.0.0 - 188.63.255.255 ch +188.60.0.0 - 188.60.85.20 ch +188.60.85.21 - 188.60.85.21 se +188.60.85.22 - 188.63.255.255 ch 188.64.0.0 - 188.64.7.255 fi 188.64.8.0 - 188.64.15.255 az 188.64.16.0 - 188.64.23.255 de 188.64.24.0 - 188.64.31.255 si 188.64.32.0 - 188.64.39.255 gb -188.64.40.0 - 188.64.40.255 de -188.64.41.0 - 188.64.41.15 us -188.64.41.16 - 188.64.45.255 de -188.64.46.0 - 188.64.46.143 nl -188.64.46.144 - 188.64.47.255 de +188.64.40.0 - 188.64.47.255 de 188.64.48.0 - 188.64.55.255 be 188.64.56.0 - 188.64.63.255 de 188.64.64.0 - 188.64.71.255 nl 188.64.72.0 - 188.64.79.255 be +188.64.80.0 - 188.64.87.255 pl 188.64.88.0 - 188.64.95.255 it 188.64.96.0 - 188.64.103.255 il 188.64.104.0 - 188.64.111.255 si @@ -82998,27 +72429,7 @@ 188.65.48.0 - 188.65.55.255 ru 188.65.56.0 - 188.65.63.255 gb 188.65.64.0 - 188.65.71.255 ru -188.65.72.0 - 188.65.72.127 at -188.65.72.128 - 188.65.72.255 gb -188.65.73.0 - 188.65.73.31 at -188.65.73.32 - 188.65.73.39 de -188.65.73.40 - 188.65.73.55 at -188.65.73.56 - 188.65.73.63 de -188.65.73.64 - 188.65.73.111 at -188.65.73.112 - 188.65.73.159 de -188.65.73.160 - 188.65.73.223 at -188.65.73.224 - 188.65.73.231 de -188.65.73.232 - 188.65.74.39 at -188.65.74.40 - 188.65.74.47 de -188.65.74.48 - 188.65.74.255 at -188.65.75.0 - 188.65.75.15 de -188.65.75.16 - 188.65.75.39 at -188.65.75.40 - 188.65.75.47 de -188.65.75.48 - 188.65.75.63 at -188.65.75.64 - 188.65.75.95 de -188.65.75.96 - 188.65.77.127 at -188.65.77.128 - 188.65.77.159 de -188.65.77.160 - 188.65.79.255 at +188.65.72.0 - 188.65.79.255 at 188.65.80.0 - 188.65.87.255 it 188.65.88.0 - 188.65.95.255 es 188.65.96.0 - 188.65.103.255 gb @@ -83032,12 +72443,11 @@ 188.65.160.0 - 188.65.167.255 nl 188.65.168.0 - 188.65.175.255 fr 188.65.176.0 - 188.65.183.255 gb -188.65.184.0 - 188.65.185.255 mt -188.65.186.0 - 188.65.186.31 nl -188.65.186.32 - 188.65.186.63 mt -188.65.186.64 - 188.65.186.95 ie -188.65.186.96 - 188.65.191.223 mt -188.65.191.224 - 188.65.191.255 ie +188.65.184.0 - 188.65.189.255 mt +188.65.190.0 - 188.65.190.71 nl +188.65.190.72 - 188.65.190.79 ie +188.65.190.80 - 188.65.190.255 nl +188.65.191.0 - 188.65.191.255 mt 188.65.192.0 - 188.65.199.255 nl 188.65.200.0 - 188.65.207.255 de 188.65.208.0 - 188.65.215.255 ru @@ -83048,72 +72458,67 @@ 188.66.0.0 - 188.66.7.255 ee 188.66.8.0 - 188.66.15.255 be 188.66.16.0 - 188.66.23.255 nl -188.66.24.0 - 188.66.39.255 ru +188.66.32.0 - 188.66.39.255 ru 188.66.40.0 - 188.66.47.255 de -188.66.48.0 - 188.66.63.255 eu 188.66.64.0 - 188.66.127.255 gb 188.66.128.0 - 188.66.255.255 om 188.67.0.0 - 188.67.255.255 fi -188.68.0.0 - 188.68.255.255 ru +188.68.0.0 - 188.68.31.255 ru +188.68.32.0 - 188.68.63.255 de +188.68.64.0 - 188.68.163.255 ru +188.68.164.0 - 188.68.167.255 gb +188.68.168.0 - 188.68.223.255 ru +188.68.224.0 - 188.68.255.255 pl 188.69.0.0 - 188.69.255.255 lt -188.70.0.0 - 188.71.255.255 kw +188.70.0.0 - 188.71.244.255 kw +188.71.245.0 - 188.71.245.255 us +188.71.246.0 - 188.71.255.255 kw 188.72.0.0 - 188.72.63.255 iq -188.72.64.0 - 188.72.127.255 ru +188.72.64.0 - 188.72.70.255 ru +188.72.71.0 - 188.72.71.255 nl +188.72.72.0 - 188.72.95.255 ru +188.72.96.0 - 188.72.96.127 nl +188.72.96.128 - 188.72.96.255 cz +188.72.97.0 - 188.72.97.255 gb +188.72.98.0 - 188.72.98.255 nl +188.72.99.0 - 188.72.99.255 gb +188.72.100.0 - 188.72.100.255 nl +188.72.101.0 - 188.72.101.255 ua +188.72.102.0 - 188.72.102.255 ie +188.72.103.0 - 188.72.103.255 ae +188.72.104.0 - 188.72.104.255 de +188.72.105.0 - 188.72.105.255 gb +188.72.106.0 - 188.72.106.255 nl +188.72.107.0 - 188.72.107.255 fr +188.72.108.0 - 188.72.108.255 pl +188.72.109.0 - 188.72.109.255 it +188.72.110.0 - 188.72.110.255 md +188.72.111.0 - 188.72.111.255 ee +188.72.112.0 - 188.72.112.255 sk +188.72.113.0 - 188.72.113.255 es +188.72.114.0 - 188.72.114.255 at +188.72.115.0 - 188.72.115.255 ro +188.72.116.0 - 188.72.116.255 lt +188.72.117.0 - 188.72.117.255 nl +188.72.118.0 - 188.72.118.255 al +188.72.119.0 - 188.72.119.255 cy +188.72.120.0 - 188.72.123.255 it +188.72.124.0 - 188.72.124.255 de +188.72.125.0 - 188.72.125.255 hu +188.72.126.0 - 188.72.126.255 de +188.72.127.0 - 188.72.127.127 nl +188.72.127.128 - 188.72.127.255 no 188.72.128.0 - 188.72.191.255 az -188.72.192.0 - 188.72.192.255 de -188.72.193.0 - 188.72.193.255 be +188.72.192.0 - 188.72.193.255 de 188.72.194.0 - 188.72.194.255 gb 188.72.195.0 - 188.72.197.255 tr -188.72.198.0 - 188.72.198.255 hk -188.72.199.0 - 188.72.199.31 de -188.72.199.32 - 188.72.199.63 bz -188.72.199.64 - 188.72.199.127 de -188.72.199.128 - 188.72.199.191 ro -188.72.199.192 - 188.72.202.255 de -188.72.203.0 - 188.72.203.255 ca -188.72.204.0 - 188.72.213.255 de -188.72.214.0 - 188.72.214.255 hk -188.72.215.0 - 188.72.218.255 de -188.72.219.0 - 188.72.219.255 ca -188.72.220.0 - 188.72.220.31 de -188.72.220.32 - 188.72.220.63 gb -188.72.220.64 - 188.72.220.127 ru -188.72.220.128 - 188.72.220.191 de -188.72.220.192 - 188.72.220.255 ru +188.72.198.0 - 188.72.220.255 de 188.72.221.0 - 188.72.221.255 pl -188.72.222.0 - 188.72.223.127 de -188.72.223.128 - 188.72.223.255 gb -188.72.224.0 - 188.72.224.127 de -188.72.224.128 - 188.72.224.255 ru -188.72.225.0 - 188.72.227.255 de +188.72.222.0 - 188.72.227.255 de 188.72.228.0 - 188.72.228.255 gb -188.72.229.0 - 188.72.234.63 de -188.72.234.64 - 188.72.234.127 ru -188.72.234.128 - 188.72.235.63 de -188.72.235.64 - 188.72.235.127 ru -188.72.235.128 - 188.72.235.191 mk -188.72.235.192 - 188.72.235.255 ae -188.72.236.0 - 188.72.238.127 de -188.72.238.128 - 188.72.238.255 in -188.72.239.0 - 188.72.243.95 de -188.72.243.96 - 188.72.243.159 ru -188.72.243.160 - 188.72.243.223 de -188.72.243.224 - 188.72.243.255 bz -188.72.244.0 - 188.72.244.63 de -188.72.244.64 - 188.72.244.127 ru -188.72.244.128 - 188.72.244.191 de -188.72.244.192 - 188.72.244.255 ua -188.72.245.0 - 188.72.246.31 de -188.72.246.32 - 188.72.246.95 cz -188.72.246.96 - 188.72.246.159 ru -188.72.246.160 - 188.72.246.255 de +188.72.229.0 - 188.72.246.255 de 188.72.247.0 - 188.72.247.255 us -188.72.248.0 - 188.72.248.127 in -188.72.248.128 - 188.72.248.255 bz -188.72.249.0 - 188.72.249.255 es -188.72.250.0 - 188.72.250.255 de -188.72.251.0 - 188.72.251.255 ca -188.72.252.0 - 188.72.255.255 de +188.72.248.0 - 188.72.255.255 de 188.73.0.0 - 188.73.63.255 fr 188.73.64.0 - 188.73.127.255 de 188.73.128.0 - 188.73.191.255 ru @@ -83141,10 +72546,9 @@ 188.92.72.0 - 188.92.79.255 lv 188.92.80.0 - 188.92.87.255 no 188.92.88.0 - 188.92.95.255 gb -188.92.96.0 - 188.92.103.255 it +188.92.96.0 - 188.92.103.255 cz 188.92.104.0 - 188.92.111.255 ru 188.92.112.0 - 188.92.119.255 de -188.92.120.0 - 188.92.127.255 it 188.92.128.0 - 188.92.135.255 de 188.92.136.0 - 188.92.143.255 gb 188.92.144.0 - 188.92.151.255 ch @@ -83152,26 +72556,12 @@ 188.92.160.0 - 188.92.167.255 ee 188.92.168.0 - 188.92.175.255 se 188.92.176.0 - 188.92.183.255 ru -188.92.184.0 - 188.92.184.255 a2 -188.92.185.0 - 188.92.185.255 de -188.92.186.0 - 188.92.186.255 a2 -188.92.187.0 - 188.92.187.79 ly -188.92.187.80 - 188.92.187.255 a2 -188.92.188.0 - 188.92.188.127 ly -188.92.188.128 - 188.92.189.239 a2 -188.92.189.240 - 188.92.189.247 it -188.92.189.248 - 188.92.190.175 a2 -188.92.190.176 - 188.92.190.255 it -188.92.191.0 - 188.92.191.255 a2 +188.92.184.0 - 188.92.191.255 it 188.92.192.0 - 188.92.199.255 ru 188.92.200.0 - 188.92.207.255 de 188.92.208.0 - 188.92.215.255 ge 188.92.216.0 - 188.92.223.255 ru -188.92.224.0 - 188.92.225.255 ch -188.92.226.0 - 188.92.226.7 de -188.92.226.8 - 188.92.226.31 ch -188.92.226.32 - 188.92.226.39 fr -188.92.226.40 - 188.92.231.255 ch +188.92.224.0 - 188.92.231.255 ch 188.92.232.0 - 188.92.239.255 gb 188.92.240.0 - 188.92.247.255 ru 188.92.248.0 - 188.92.255.255 se @@ -83201,10 +72591,7 @@ 188.93.200.0 - 188.93.207.255 hu 188.93.208.0 - 188.93.215.255 ru 188.93.216.0 - 188.93.223.255 de -188.93.224.0 - 188.93.234.255 pt -188.93.235.0 - 188.93.236.63 es -188.93.236.64 - 188.93.236.79 pt -188.93.236.80 - 188.93.239.255 es +188.93.224.0 - 188.93.239.255 pt 188.93.240.0 - 188.93.247.255 ru 188.93.248.0 - 188.93.255.255 at 188.94.0.0 - 188.94.7.255 fr @@ -83229,17 +72616,10 @@ 188.94.152.0 - 188.94.159.255 kz 188.94.160.0 - 188.94.175.255 ru 188.94.176.0 - 188.94.183.255 ch -188.94.184.0 - 188.94.199.255 it +188.94.192.0 - 188.94.199.255 it 188.94.200.0 - 188.94.207.255 fr 188.94.208.0 - 188.94.215.255 ru -188.94.216.0 - 188.94.217.207 no -188.94.217.208 - 188.94.217.215 se -188.94.217.216 - 188.94.217.223 au -188.94.217.224 - 188.94.218.255 no -188.94.219.0 - 188.94.219.31 co -188.94.219.32 - 188.94.222.239 no -188.94.222.240 - 188.94.222.247 pa -188.94.222.248 - 188.94.223.255 no +188.94.216.0 - 188.94.223.255 no 188.94.224.0 - 188.94.231.255 ru 188.94.232.0 - 188.94.239.255 cz 188.94.240.0 - 188.94.247.255 gb @@ -83253,16 +72633,14 @@ 188.95.64.0 - 188.95.71.255 jo 188.95.72.0 - 188.95.79.255 it 188.95.80.0 - 188.95.87.255 gb -188.95.88.0 - 188.95.103.255 nl +188.95.96.0 - 188.95.103.255 nl 188.95.104.0 - 188.95.111.255 ru 188.95.112.0 - 188.95.119.255 es 188.95.120.0 - 188.95.127.255 cz 188.95.128.0 - 188.95.135.255 gb 188.95.136.0 - 188.95.143.255 nl 188.95.144.0 - 188.95.151.255 tr -188.95.152.0 - 188.95.156.79 ua -188.95.156.80 - 188.95.156.95 de -188.95.156.96 - 188.95.159.255 ua +188.95.152.0 - 188.95.159.255 ua 188.95.160.0 - 188.95.167.255 sa 188.95.168.0 - 188.95.175.255 nl 188.95.176.0 - 188.95.183.255 rs @@ -83282,38 +72660,67 @@ 188.113.64.0 - 188.113.127.255 no 188.113.128.0 - 188.113.191.255 ru 188.113.192.0 - 188.113.255.255 uz -188.114.0.0 - 188.114.127.255 ru +188.114.0.0 - 188.114.63.255 ru +188.114.64.0 - 188.114.95.255 pl +188.114.96.0 - 188.114.99.255 br +188.114.100.0 - 188.114.103.255 it +188.114.104.0 - 188.114.104.255 us +188.114.105.0 - 188.114.105.255 eu +188.114.106.0 - 188.114.106.255 us +188.114.107.0 - 188.114.107.255 eu +188.114.108.0 - 188.114.111.255 es +188.114.112.0 - 188.114.119.255 gb +188.114.120.0 - 188.114.127.255 iq 188.114.128.0 - 188.114.191.255 dk -188.114.192.0 - 188.114.255.255 ru +188.114.192.0 - 188.114.201.255 ru +188.114.202.0 - 188.114.203.255 ua +188.114.204.0 - 188.114.205.255 ru +188.114.206.0 - 188.114.223.255 ua +188.114.224.0 - 188.114.251.7 ru +188.114.251.8 - 188.114.251.8 se +188.114.251.9 - 188.114.255.255 ru 188.115.0.0 - 188.115.63.255 lu -188.115.64.0 - 188.115.127.255 fr +188.115.64.0 - 188.115.103.255 fr +188.115.104.0 - 188.115.104.255 gp +188.115.105.0 - 188.115.105.255 fr +188.115.106.0 - 188.115.107.255 gp +188.115.108.0 - 188.115.108.255 fr +188.115.109.0 - 188.115.109.255 gp +188.115.110.0 - 188.115.113.255 fr +188.115.114.0 - 188.115.114.255 gf +188.115.115.0 - 188.115.121.255 fr +188.115.122.0 - 188.115.122.255 mq +188.115.123.0 - 188.115.127.255 fr 188.115.128.0 - 188.115.191.255 ua 188.115.192.0 - 188.115.255.255 am -188.116.0.0 - 188.116.63.255 pl +188.116.0.0 - 188.116.35.255 pl +188.116.36.0 - 188.116.36.255 a1 +188.116.37.0 - 188.116.63.255 pl 188.116.64.0 - 188.116.127.255 cz 188.116.128.0 - 188.116.191.255 ru 188.116.192.0 - 188.116.255.255 bh 188.117.0.0 - 188.117.63.255 fi 188.117.64.0 - 188.117.127.255 sa 188.117.128.0 - 188.117.191.255 pl -188.117.192.0 - 188.117.199.255 mk -188.117.200.0 - 188.117.200.255 at -188.117.201.0 - 188.117.207.255 mk -188.117.208.0 - 188.117.208.127 at -188.117.208.128 - 188.117.219.255 mk -188.117.220.0 - 188.117.220.255 at -188.117.221.0 - 188.117.235.255 mk -188.117.236.0 - 188.117.255.255 at +188.117.192.0 - 188.117.199.255 rs +188.117.200.0 - 188.117.223.255 at +188.117.224.0 - 188.117.239.255 rs +188.117.240.0 - 188.117.240.255 at +188.117.241.0 - 188.117.241.255 mk +188.117.242.0 - 188.117.255.255 at 188.118.0.0 - 188.118.63.255 be 188.118.64.0 - 188.118.127.255 ir 188.118.128.0 - 188.118.191.255 de 188.118.192.0 - 188.118.255.255 at 188.119.0.0 - 188.119.63.255 tr -188.119.64.0 - 188.119.127.255 sa 188.119.128.0 - 188.119.191.255 ro 188.119.192.0 - 188.119.255.255 es 188.120.0.0 - 188.120.31.255 sk -188.120.32.0 - 188.120.63.255 ru +188.120.32.0 - 188.120.33.255 tr +188.120.34.0 - 188.120.35.255 nl +188.120.36.0 - 188.120.39.255 tr +188.120.40.0 - 188.120.47.255 nl +188.120.48.0 - 188.120.63.255 ru 188.120.64.0 - 188.120.95.255 dk 188.120.96.0 - 188.120.127.255 rs 188.120.128.0 - 188.120.159.255 il @@ -83327,17 +72734,15 @@ 188.121.160.0 - 188.121.191.255 sk 188.121.192.0 - 188.121.223.255 ge 188.121.224.0 - 188.121.227.255 fr -188.121.228.0 - 188.121.251.255 nl -188.121.252.0 - 188.121.252.127 fr -188.121.252.128 - 188.121.252.191 nl -188.121.252.192 - 188.121.252.255 fr -188.121.253.0 - 188.121.255.255 nl +188.121.228.0 - 188.121.252.127 nl +188.121.252.128 - 188.121.252.191 fr +188.121.252.192 - 188.121.255.255 nl 188.122.0.0 - 188.122.31.255 pl 188.122.32.0 - 188.122.63.255 gb 188.122.64.0 - 188.122.67.255 nl 188.122.68.0 - 188.122.69.255 de 188.122.70.0 - 188.122.95.255 nl -188.122.96.0 - 188.122.127.255 es +188.122.96.0 - 188.122.127.255 ir 188.122.128.0 - 188.122.159.255 se 188.122.160.0 - 188.122.191.255 ru 188.122.192.0 - 188.122.223.255 cz @@ -83360,12 +72765,10 @@ 188.124.224.0 - 188.124.255.255 ru 188.125.0.0 - 188.125.31.255 hr 188.125.32.0 - 188.125.63.255 pl -188.125.64.0 - 188.125.71.255 ir +188.125.64.0 - 188.125.71.255 ie 188.125.72.0 - 188.125.79.255 ch -188.125.80.0 - 188.125.87.255 ir -188.125.88.0 - 188.125.93.255 gb -188.125.94.0 - 188.125.94.255 nl -188.125.95.0 - 188.125.95.255 de +188.125.80.0 - 188.125.87.255 ie +188.125.88.0 - 188.125.95.255 gb 188.125.96.0 - 188.125.127.255 it 188.125.128.0 - 188.125.159.255 pl 188.125.160.0 - 188.125.191.255 tr @@ -83373,9 +72776,9 @@ 188.125.224.0 - 188.125.255.255 pl 188.126.0.0 - 188.126.31.255 bg 188.126.32.0 - 188.126.63.255 ru -188.126.64.0 - 188.126.71.255 se -188.126.72.0 - 188.126.95.255 a1 -188.126.96.0 - 188.126.127.255 be +188.126.64.0 - 188.126.95.255 se +188.126.96.0 - 188.126.119.255 nl +188.126.120.0 - 188.126.127.255 be 188.126.128.0 - 188.126.159.255 ir 188.126.160.0 - 188.126.191.255 de 188.126.192.0 - 188.126.223.255 no @@ -83387,22 +72790,21 @@ 188.127.128.0 - 188.127.159.255 hu 188.127.160.0 - 188.127.191.255 es 188.127.192.0 - 188.127.223.255 fi -188.127.224.0 - 188.127.253.63 ru -188.127.253.64 - 188.127.253.95 pl -188.127.253.96 - 188.128.127.255 ru +188.127.224.0 - 188.128.127.255 ru 188.128.128.0 - 188.128.255.255 pl 188.129.0.0 - 188.129.127.255 hr 188.129.128.0 - 188.129.255.255 ge 188.130.0.0 - 188.130.127.255 fr -188.130.128.0 - 188.130.175.255 ru +188.130.128.0 - 188.130.155.255 ru +188.130.156.0 - 188.130.159.255 kz +188.130.160.0 - 188.130.175.255 ru 188.130.176.0 - 188.130.179.255 ua -188.130.180.0 - 188.130.191.255 ru +188.130.180.0 - 188.130.181.255 md +188.130.182.0 - 188.130.182.255 ie +188.130.183.0 - 188.130.183.255 es +188.130.184.0 - 188.130.191.255 ru 188.130.192.0 - 188.130.223.255 ua -188.130.224.0 - 188.130.248.255 ru -188.130.249.0 - 188.130.249.255 uz -188.130.250.0 - 188.130.250.255 ru -188.130.251.0 - 188.130.251.255 ua -188.130.252.0 - 188.130.255.255 ru +188.130.224.0 - 188.130.255.255 ru 188.131.0.0 - 188.131.127.255 md 188.131.128.0 - 188.131.255.255 ru 188.132.0.0 - 188.132.127.255 sa @@ -83416,238 +72818,19 @@ 188.136.128.0 - 188.136.255.255 ir 188.137.0.0 - 188.137.127.255 pl 188.137.128.0 - 188.137.255.255 bh -188.138.0.0 - 188.138.3.255 de -188.138.4.0 - 188.138.4.31 in -188.138.4.32 - 188.138.4.63 dk -188.138.4.64 - 188.138.4.95 us -188.138.4.96 - 188.138.4.127 bg -188.138.4.128 - 188.138.4.159 de -188.138.4.160 - 188.138.4.223 br -188.138.4.224 - 188.138.4.255 us -188.138.5.0 - 188.138.5.31 br -188.138.5.32 - 188.138.5.95 us -188.138.5.96 - 188.138.5.159 de -188.138.5.160 - 188.138.5.191 us -188.138.5.192 - 188.138.5.223 nl -188.138.5.224 - 188.138.5.255 ru -188.138.6.0 - 188.138.6.31 tr -188.138.6.32 - 188.138.6.127 de -188.138.6.128 - 188.138.6.159 ma -188.138.6.160 - 188.138.6.191 nl -188.138.6.192 - 188.138.6.223 th -188.138.6.224 - 188.138.6.255 ru -188.138.7.0 - 188.138.7.31 tr -188.138.7.32 - 188.138.7.63 ma -188.138.7.64 - 188.138.7.95 cy -188.138.7.96 - 188.138.7.127 de -188.138.7.128 - 188.138.7.159 br -188.138.7.160 - 188.138.7.191 de -188.138.7.192 - 188.138.7.255 us -188.138.8.0 - 188.138.12.31 de -188.138.12.32 - 188.138.12.63 ru -188.138.12.64 - 188.138.12.95 br -188.138.12.96 - 188.138.12.159 us -188.138.12.160 - 188.138.12.191 cy -188.138.12.192 - 188.138.12.223 pl -188.138.12.224 - 188.138.12.255 ru -188.138.13.0 - 188.138.13.31 gr -188.138.13.32 - 188.138.13.63 br -188.138.13.64 - 188.138.13.95 us -188.138.13.96 - 188.138.13.127 ma -188.138.13.128 - 188.138.13.159 us -188.138.13.160 - 188.138.13.191 am -188.138.13.192 - 188.138.13.223 ru -188.138.13.224 - 188.138.13.255 ma -188.138.14.0 - 188.138.14.31 us -188.138.14.32 - 188.138.14.63 ma -188.138.14.64 - 188.138.14.127 de -188.138.14.128 - 188.138.14.159 cl -188.138.14.160 - 188.138.14.191 ru -188.138.14.192 - 188.138.14.223 de -188.138.14.224 - 188.138.14.255 us -188.138.15.0 - 188.138.15.31 pl -188.138.15.32 - 188.138.15.63 us -188.138.15.64 - 188.138.15.95 de -188.138.15.96 - 188.138.15.127 hu -188.138.15.128 - 188.138.15.159 ru -188.138.15.160 - 188.138.15.191 de -188.138.15.192 - 188.138.15.223 es -188.138.15.224 - 188.138.15.255 us -188.138.16.0 - 188.138.19.255 de -188.138.20.0 - 188.138.20.31 us -188.138.20.32 - 188.138.20.63 ru -188.138.20.64 - 188.138.20.95 pl -188.138.20.96 - 188.138.20.127 ru -188.138.20.128 - 188.138.20.159 br -188.138.20.160 - 188.138.20.191 de -188.138.20.192 - 188.138.20.223 ar -188.138.20.224 - 188.138.21.31 de -188.138.21.32 - 188.138.21.63 ar -188.138.21.64 - 188.138.21.95 us -188.138.21.96 - 188.138.21.127 br -188.138.21.128 - 188.138.21.159 ma -188.138.21.160 - 188.138.21.191 au -188.138.21.192 - 188.138.21.223 de -188.138.21.224 - 188.138.21.255 ru -188.138.22.0 - 188.138.22.31 tr -188.138.22.32 - 188.138.22.63 it -188.138.22.64 - 188.138.22.127 de -188.138.22.128 - 188.138.22.191 us -188.138.22.192 - 188.138.22.223 de -188.138.22.224 - 188.138.23.31 br -188.138.23.32 - 188.138.23.63 ro -188.138.23.64 - 188.138.23.95 de -188.138.23.96 - 188.138.23.127 hu -188.138.23.128 - 188.138.23.159 in -188.138.23.160 - 188.138.23.191 us -188.138.23.192 - 188.138.23.223 de -188.138.23.224 - 188.138.23.255 ru -188.138.24.0 - 188.138.27.255 de -188.138.28.0 - 188.138.28.31 ru -188.138.28.32 - 188.138.28.63 gr -188.138.28.64 - 188.138.28.95 us -188.138.28.96 - 188.138.28.127 br -188.138.28.128 - 188.138.28.159 de -188.138.28.160 - 188.138.28.191 ua -188.138.28.192 - 188.138.28.223 us -188.138.28.224 - 188.138.28.255 tr -188.138.29.0 - 188.138.29.31 au -188.138.29.32 - 188.138.29.95 ru -188.138.29.96 - 188.138.29.127 tr -188.138.29.128 - 188.138.29.159 sa -188.138.29.160 - 188.138.29.191 br -188.138.29.192 - 188.138.29.223 at -188.138.29.224 - 188.138.29.255 de -188.138.30.0 - 188.138.30.31 us -188.138.30.32 - 188.138.30.63 br -188.138.30.64 - 188.138.30.95 dk -188.138.30.96 - 188.138.30.127 ru -188.138.30.128 - 188.138.30.159 tr -188.138.30.160 - 188.138.30.223 de -188.138.30.224 - 188.138.30.255 us -188.138.31.0 - 188.138.31.31 tr -188.138.31.32 - 188.138.31.63 de -188.138.31.64 - 188.138.31.95 us -188.138.31.96 - 188.138.31.127 ma -188.138.31.128 - 188.138.31.159 de -188.138.31.160 - 188.138.31.191 us -188.138.31.192 - 188.138.31.223 gr -188.138.31.224 - 188.138.36.31 de -188.138.36.32 - 188.138.36.63 ru -188.138.36.64 - 188.138.36.95 us -188.138.36.96 - 188.138.36.159 de -188.138.36.160 - 188.138.36.191 ua -188.138.36.192 - 188.138.36.223 de -188.138.36.224 - 188.138.36.255 es -188.138.37.0 - 188.138.37.31 ru -188.138.37.32 - 188.138.37.63 tr -188.138.37.64 - 188.138.37.95 cz -188.138.37.96 - 188.138.37.127 za -188.138.37.128 - 188.138.37.159 de -188.138.37.160 - 188.138.37.191 ru -188.138.37.192 - 188.138.37.223 de -188.138.37.224 - 188.138.37.255 us -188.138.38.0 - 188.138.38.31 it -188.138.38.32 - 188.138.38.63 ro -188.138.38.64 - 188.138.38.159 de -188.138.38.160 - 188.138.38.191 us -188.138.38.192 - 188.138.38.223 bg -188.138.38.224 - 188.138.38.255 hr -188.138.39.0 - 188.138.39.31 de -188.138.39.32 - 188.138.39.63 br -188.138.39.64 - 188.138.39.95 gr -188.138.39.96 - 188.138.39.127 br -188.138.39.128 - 188.138.39.159 de -188.138.39.160 - 188.138.39.191 ma -188.138.39.192 - 188.138.39.223 ch -188.138.39.224 - 188.138.39.255 us -188.138.40.0 - 188.138.44.31 de -188.138.44.32 - 188.138.44.63 ro -188.138.44.64 - 188.138.44.95 br -188.138.44.96 - 188.138.44.127 de -188.138.44.128 - 188.138.44.159 us -188.138.44.160 - 188.138.45.31 br -188.138.45.32 - 188.138.45.63 us -188.138.45.64 - 188.138.45.95 tr -188.138.45.96 - 188.138.45.127 us -188.138.45.128 - 188.138.45.159 fr -188.138.45.160 - 188.138.45.191 us -188.138.45.192 - 188.138.45.223 de -188.138.45.224 - 188.138.45.255 nl -188.138.46.0 - 188.138.46.31 fr -188.138.46.32 - 188.138.46.63 us -188.138.46.64 - 188.138.46.95 de -188.138.46.96 - 188.138.46.127 us -188.138.46.128 - 188.138.46.159 ma -188.138.46.160 - 188.138.46.191 ru -188.138.46.192 - 188.138.46.223 de -188.138.46.224 - 188.138.46.255 ma -188.138.47.0 - 188.138.47.31 dk -188.138.47.32 - 188.138.47.63 lv -188.138.47.64 - 188.138.47.95 br -188.138.47.96 - 188.138.47.127 de -188.138.47.128 - 188.138.47.159 gr -188.138.47.160 - 188.138.47.191 de -188.138.47.192 - 188.138.47.223 ru -188.138.47.224 - 188.138.47.255 br -188.138.48.0 - 188.138.52.63 de -188.138.52.64 - 188.138.52.95 in -188.138.52.96 - 188.138.52.127 gb -188.138.52.128 - 188.138.52.159 ru -188.138.52.160 - 188.138.52.191 dk -188.138.52.192 - 188.138.52.223 de -188.138.52.224 - 188.138.52.255 be -188.138.53.0 - 188.138.53.31 bd -188.138.53.32 - 188.138.53.63 ma -188.138.53.64 - 188.138.53.95 ru -188.138.53.96 - 188.138.53.127 ma -188.138.53.128 - 188.138.53.159 de -188.138.53.160 - 188.138.53.191 us -188.138.53.192 - 188.138.53.223 ru -188.138.53.224 - 188.138.53.255 us -188.138.54.0 - 188.138.54.31 de -188.138.54.32 - 188.138.54.63 br -188.138.54.64 - 188.138.54.95 de -188.138.54.96 - 188.138.54.127 us -188.138.54.128 - 188.138.54.159 bd -188.138.54.160 - 188.138.54.191 pl -188.138.54.192 - 188.138.54.223 se -188.138.54.224 - 188.138.54.255 gb -188.138.55.0 - 188.138.55.31 ru -188.138.55.32 - 188.138.55.63 de -188.138.55.64 - 188.138.55.95 nl -188.138.55.96 - 188.138.55.127 br -188.138.55.128 - 188.138.55.159 tw -188.138.55.160 - 188.138.55.191 ca -188.138.55.192 - 188.138.55.223 tr -188.138.55.224 - 188.138.55.255 ru -188.138.56.0 - 188.138.60.31 de -188.138.60.32 - 188.138.60.95 us -188.138.60.96 - 188.138.60.127 bg -188.138.60.128 - 188.138.60.159 ru -188.138.60.160 - 188.138.60.191 cy -188.138.60.192 - 188.138.60.223 us -188.138.60.224 - 188.138.61.63 de -188.138.61.64 - 188.138.61.95 ug -188.138.61.96 - 188.138.61.127 ru -188.138.61.128 - 188.138.61.159 de -188.138.61.160 - 188.138.61.191 ro -188.138.61.192 - 188.138.61.223 in -188.138.61.224 - 188.138.62.31 de -188.138.62.32 - 188.138.62.63 gb -188.138.62.64 - 188.138.62.95 ru -188.138.62.96 - 188.138.62.127 us -188.138.62.128 - 188.138.62.159 gr -188.138.62.160 - 188.138.62.223 ma -188.138.62.224 - 188.138.62.255 de -188.138.63.0 - 188.138.63.31 br -188.138.63.32 - 188.138.63.63 de -188.138.63.64 - 188.138.63.95 pl -188.138.63.96 - 188.138.63.127 eg -188.138.63.128 - 188.138.63.191 br -188.138.63.192 - 188.138.63.223 se -188.138.63.224 - 188.138.63.255 th -188.138.64.0 - 188.138.127.255 de +188.138.0.0 - 188.138.16.255 de +188.138.17.0 - 188.138.17.255 fr +188.138.18.0 - 188.138.24.255 de +188.138.25.0 - 188.138.25.255 fr +188.138.26.0 - 188.138.38.223 de +188.138.38.224 - 188.138.38.255 ae +188.138.39.0 - 188.138.94.99 de +188.138.94.100 - 188.138.94.100 gr +188.138.94.101 - 188.138.101.102 de +188.138.101.103 - 188.138.101.103 fr +188.138.101.104 - 188.138.101.241 de +188.138.101.242 - 188.138.101.242 fr +188.138.101.243 - 188.138.127.255 de 188.138.128.0 - 188.138.255.255 md 188.139.0.0 - 188.139.127.255 sa 188.139.128.0 - 188.139.255.255 sy @@ -83669,958 +72852,185 @@ 188.161.0.0 - 188.161.255.255 ps 188.162.0.0 - 188.162.255.255 ru 188.163.0.0 - 188.163.255.255 ua -188.164.0.0 - 188.164.255.255 ru +188.164.0.0 - 188.164.0.223 za +188.164.0.224 - 188.164.0.255 ie +188.164.1.0 - 188.164.127.255 gb +188.164.128.0 - 188.164.135.255 it +188.164.136.0 - 188.164.143.255 ru +188.164.144.0 - 188.164.151.255 pl +188.164.152.0 - 188.164.159.255 am +188.164.160.0 - 188.164.191.255 ru +188.164.192.0 - 188.164.199.255 es +188.164.200.0 - 188.164.207.255 gr +188.164.208.0 - 188.164.215.255 ru +188.164.216.0 - 188.164.223.255 al +188.164.224.0 - 188.164.231.255 gb +188.164.232.0 - 188.164.239.255 de +188.164.240.0 - 188.164.247.255 pl +188.164.248.0 - 188.164.255.255 nl 188.165.0.0 - 188.165.7.255 ie 188.165.8.0 - 188.165.15.255 fr 188.165.16.0 - 188.165.23.255 pl -188.165.24.0 - 188.165.31.255 lt -188.165.32.0 - 188.165.63.255 fr -188.165.64.0 - 188.165.64.3 pl -188.165.64.4 - 188.165.64.7 pt -188.165.64.8 - 188.165.64.15 es -188.165.64.16 - 188.165.64.47 fr -188.165.64.48 - 188.165.64.51 es -188.165.64.52 - 188.165.64.63 pl -188.165.64.64 - 188.165.64.67 it -188.165.64.68 - 188.165.64.71 gb -188.165.64.72 - 188.165.64.75 be -188.165.64.76 - 188.165.64.79 cz -188.165.64.80 - 188.165.64.95 es -188.165.64.96 - 188.165.64.127 gb -188.165.64.128 - 188.165.65.95 fr -188.165.65.96 - 188.165.65.111 be -188.165.65.112 - 188.165.66.95 fr -188.165.66.96 - 188.165.66.99 es -188.165.66.100 - 188.165.66.103 gb -188.165.66.104 - 188.165.66.119 fr -188.165.66.120 - 188.165.66.123 nl +188.165.24.0 - 188.165.30.21 lt +188.165.30.22 - 188.165.30.22 fr +188.165.30.23 - 188.165.31.255 lt +188.165.32.0 - 188.165.37.185 fr +188.165.37.186 - 188.165.37.186 es +188.165.37.187 - 188.165.65.39 fr +188.165.65.40 - 188.165.65.43 nl +188.165.65.44 - 188.165.66.123 fr 188.165.66.124 - 188.165.66.127 it -188.165.66.128 - 188.165.66.255 de -188.165.67.0 - 188.165.67.255 fr -188.165.68.0 - 188.165.68.63 pl -188.165.68.64 - 188.165.68.95 es -188.165.68.96 - 188.165.68.127 de -188.165.68.128 - 188.165.68.131 fr -188.165.68.132 - 188.165.68.135 de -188.165.68.136 - 188.165.68.143 gb -188.165.68.144 - 188.165.68.163 fr -188.165.68.164 - 188.165.68.167 es -188.165.68.168 - 188.165.68.171 gb -188.165.68.172 - 188.165.68.179 es -188.165.68.180 - 188.165.68.183 de -188.165.68.184 - 188.165.68.187 it -188.165.68.188 - 188.165.68.191 fr -188.165.68.192 - 188.165.68.195 be -188.165.68.196 - 188.165.68.199 pl -188.165.68.200 - 188.165.69.31 fr -188.165.69.32 - 188.165.69.35 es -188.165.69.36 - 188.165.69.39 be -188.165.69.40 - 188.165.69.127 fr -188.165.69.128 - 188.165.69.255 gb -188.165.70.0 - 188.165.71.255 be -188.165.72.0 - 188.165.72.255 fr -188.165.73.0 - 188.165.74.95 gb -188.165.74.96 - 188.165.74.103 fr -188.165.74.104 - 188.165.74.111 it -188.165.74.112 - 188.165.74.115 de -188.165.74.116 - 188.165.74.119 pl -188.165.74.120 - 188.165.74.127 fr -188.165.74.128 - 188.165.74.131 pt -188.165.74.132 - 188.165.74.139 de -188.165.74.140 - 188.165.74.159 fr -188.165.74.160 - 188.165.74.163 nl -188.165.74.164 - 188.165.74.167 de -188.165.74.168 - 188.165.74.171 pl -188.165.74.172 - 188.165.74.175 fr -188.165.74.176 - 188.165.74.179 it -188.165.74.180 - 188.165.74.183 fr -188.165.74.184 - 188.165.74.187 es -188.165.74.188 - 188.165.74.191 fr -188.165.74.192 - 188.165.74.199 pt -188.165.74.200 - 188.165.74.203 de -188.165.74.204 - 188.165.74.207 nl -188.165.74.208 - 188.165.74.223 fr -188.165.74.224 - 188.165.74.227 pl -188.165.74.228 - 188.165.74.231 fr -188.165.74.232 - 188.165.74.239 pl -188.165.74.240 - 188.165.74.255 be -188.165.75.0 - 188.165.75.15 fr -188.165.75.16 - 188.165.75.23 pl -188.165.75.24 - 188.165.75.27 gb -188.165.75.28 - 188.165.75.31 ch -188.165.75.32 - 188.165.75.47 es -188.165.75.48 - 188.165.75.79 fr -188.165.75.80 - 188.165.75.87 pl -188.165.75.88 - 188.165.75.91 it -188.165.75.92 - 188.165.75.95 gb -188.165.75.96 - 188.165.75.111 fr -188.165.75.112 - 188.165.75.115 ie -188.165.75.116 - 188.165.75.123 fr -188.165.75.124 - 188.165.75.127 gb -188.165.75.128 - 188.165.75.143 fr -188.165.75.144 - 188.165.75.147 es -188.165.75.148 - 188.165.75.191 fr -188.165.75.192 - 188.165.75.207 gb -188.165.75.208 - 188.165.75.223 pl -188.165.75.224 - 188.165.75.255 fr -188.165.76.0 - 188.165.77.255 be -188.165.78.0 - 188.165.78.255 gb -188.165.79.0 - 188.165.79.127 de -188.165.79.128 - 188.165.79.135 es -188.165.79.136 - 188.165.79.139 fr -188.165.79.140 - 188.165.79.163 pl -188.165.79.164 - 188.165.79.167 es -188.165.79.168 - 188.165.79.175 fr -188.165.79.176 - 188.165.79.179 es -188.165.79.180 - 188.165.79.183 cz -188.165.79.184 - 188.165.79.191 pl -188.165.79.192 - 188.165.79.207 es -188.165.79.208 - 188.165.79.215 it -188.165.79.216 - 188.165.79.223 pl -188.165.79.224 - 188.165.79.239 es -188.165.79.240 - 188.165.79.243 gb -188.165.79.244 - 188.165.79.247 es -188.165.79.248 - 188.165.79.251 fr -188.165.79.252 - 188.165.79.255 es -188.165.80.0 - 188.165.80.15 be -188.165.80.16 - 188.165.80.31 ie -188.165.80.32 - 188.165.80.63 nl -188.165.80.64 - 188.165.80.95 fr -188.165.80.96 - 188.165.80.127 gb -188.165.80.128 - 188.165.80.159 fr -188.165.80.160 - 188.165.80.175 es -188.165.80.176 - 188.165.80.183 pl -188.165.80.184 - 188.165.80.187 fi -188.165.80.188 - 188.165.80.195 gb -188.165.80.196 - 188.165.80.207 fr -188.165.80.208 - 188.165.80.223 es -188.165.80.224 - 188.165.80.231 gb -188.165.80.232 - 188.165.80.255 es -188.165.81.0 - 188.165.81.255 fr -188.165.82.0 - 188.165.82.191 de -188.165.82.192 - 188.165.82.199 gb -188.165.82.200 - 188.165.82.223 fr -188.165.82.224 - 188.165.82.255 de -188.165.83.0 - 188.165.83.175 pl -188.165.83.176 - 188.165.83.191 fr -188.165.83.192 - 188.165.83.223 pl -188.165.83.224 - 188.165.83.227 es -188.165.83.228 - 188.165.83.231 it -188.165.83.232 - 188.165.83.239 fr -188.165.83.240 - 188.165.83.247 be -188.165.83.248 - 188.165.83.251 nl -188.165.83.252 - 188.165.84.7 fr -188.165.84.8 - 188.165.84.15 pl -188.165.84.16 - 188.165.84.19 be -188.165.84.20 - 188.165.84.23 cz -188.165.84.24 - 188.165.84.31 nl -188.165.84.32 - 188.165.84.39 gb -188.165.84.40 - 188.165.84.43 de -188.165.84.44 - 188.165.84.63 fr -188.165.84.64 - 188.165.84.111 gb +188.165.66.128 - 188.165.68.123 fr +188.165.68.124 - 188.165.68.127 it +188.165.68.128 - 188.165.80.167 fr +188.165.80.168 - 188.165.80.175 nl +188.165.80.176 - 188.165.84.111 fr 188.165.84.112 - 188.165.84.119 pl -188.165.84.120 - 188.165.84.123 fr -188.165.84.124 - 188.165.84.131 es -188.165.84.132 - 188.165.84.135 gb -188.165.84.136 - 188.165.84.139 fr -188.165.84.140 - 188.165.84.143 ch -188.165.84.144 - 188.165.84.159 pl -188.165.84.160 - 188.165.84.223 fr -188.165.84.224 - 188.165.84.255 de -188.165.85.0 - 188.165.85.15 nl -188.165.85.16 - 188.165.85.23 ch -188.165.85.24 - 188.165.85.31 fr -188.165.85.32 - 188.165.85.47 pl -188.165.85.48 - 188.165.85.63 fr -188.165.85.64 - 188.165.85.67 cz -188.165.85.68 - 188.165.85.71 it -188.165.85.72 - 188.165.85.79 de -188.165.85.80 - 188.165.85.87 es -188.165.85.88 - 188.165.85.95 fr -188.165.85.96 - 188.165.85.99 de -188.165.85.100 - 188.165.85.103 pl -188.165.85.104 - 188.165.85.107 es -188.165.85.108 - 188.165.85.111 ie -188.165.85.112 - 188.165.85.127 fr -188.165.85.128 - 188.165.85.191 de -188.165.85.192 - 188.165.85.207 es -188.165.85.208 - 188.165.85.223 fr -188.165.85.224 - 188.165.85.255 pt -188.165.86.0 - 188.165.86.127 fr -188.165.86.128 - 188.165.86.143 es -188.165.86.144 - 188.165.86.151 fr -188.165.86.152 - 188.165.86.155 nl -188.165.86.156 - 188.165.86.159 fr -188.165.86.160 - 188.165.86.175 gb -188.165.86.176 - 188.165.86.179 de -188.165.86.180 - 188.165.86.183 be -188.165.86.184 - 188.165.86.191 fr -188.165.86.192 - 188.165.86.255 de -188.165.87.0 - 188.165.87.255 es -188.165.88.0 - 188.165.88.255 fr -188.165.89.0 - 188.165.89.127 it -188.165.89.128 - 188.165.89.143 gb -188.165.89.144 - 188.165.89.175 fr -188.165.89.176 - 188.165.89.191 es -188.165.89.192 - 188.165.89.255 fr -188.165.90.0 - 188.165.90.63 lt -188.165.90.64 - 188.165.90.127 pl -188.165.90.128 - 188.165.90.159 fr -188.165.90.160 - 188.165.90.167 ch +188.165.84.120 - 188.165.86.160 fr +188.165.86.161 - 188.165.86.167 gb +188.165.86.168 - 188.165.86.169 fr +188.165.86.170 - 188.165.86.171 gb +188.165.86.172 - 188.165.86.172 fr +188.165.86.173 - 188.165.86.173 gb +188.165.86.174 - 188.165.90.167 fr 188.165.90.168 - 188.165.90.175 cz -188.165.90.176 - 188.165.90.239 fr -188.165.90.240 - 188.165.91.31 pl -188.165.91.32 - 188.165.91.35 nl -188.165.91.36 - 188.165.91.39 gb -188.165.91.40 - 188.165.91.47 pl -188.165.91.48 - 188.165.91.51 it -188.165.91.52 - 188.165.91.55 nl -188.165.91.56 - 188.165.91.59 be -188.165.91.60 - 188.165.91.63 pl -188.165.91.64 - 188.165.91.79 be -188.165.91.80 - 188.165.91.95 fr -188.165.91.96 - 188.165.91.99 pl -188.165.91.100 - 188.165.91.103 de -188.165.91.104 - 188.165.91.107 es -188.165.91.108 - 188.165.91.115 fr -188.165.91.116 - 188.165.91.119 gb -188.165.91.120 - 188.165.91.123 fr -188.165.91.124 - 188.165.91.127 gb -188.165.91.128 - 188.165.91.159 pl -188.165.91.160 - 188.165.91.167 fr -188.165.91.168 - 188.165.91.171 pl -188.165.91.172 - 188.165.91.175 ie -188.165.91.176 - 188.165.91.191 fr -188.165.91.192 - 188.165.91.223 pl -188.165.91.224 - 188.165.91.227 fr -188.165.91.228 - 188.165.91.231 gb -188.165.91.232 - 188.165.91.239 it -188.165.91.240 - 188.165.93.255 es -188.165.94.0 - 188.165.94.151 fr -188.165.94.152 - 188.165.94.159 de -188.165.94.160 - 188.165.94.163 it -188.165.94.164 - 188.165.94.167 gb -188.165.94.168 - 188.165.94.175 fr -188.165.94.176 - 188.165.94.191 es -188.165.94.192 - 188.165.94.255 de -188.165.95.0 - 188.165.95.3 fr -188.165.95.4 - 188.165.95.7 ie -188.165.95.8 - 188.165.95.31 fr -188.165.95.32 - 188.165.95.39 pl -188.165.95.40 - 188.165.95.47 ch -188.165.95.48 - 188.165.95.55 nl -188.165.95.56 - 188.165.95.63 pl -188.165.95.64 - 188.165.95.71 es -188.165.95.72 - 188.165.95.75 nl -188.165.95.76 - 188.165.95.79 pl -188.165.95.80 - 188.165.95.111 fr -188.165.95.112 - 188.165.95.127 gb -188.165.95.128 - 188.165.95.131 pl -188.165.95.132 - 188.165.95.135 es -188.165.95.136 - 188.165.95.139 fr -188.165.95.140 - 188.165.95.143 es -188.165.95.144 - 188.165.95.147 pl -188.165.95.148 - 188.165.95.151 it -188.165.95.152 - 188.165.95.175 gb -188.165.95.176 - 188.165.95.191 lt -188.165.95.192 - 188.165.95.199 pt -188.165.95.200 - 188.165.95.207 fi -188.165.95.208 - 188.165.95.211 it -188.165.95.212 - 188.165.95.215 es -188.165.95.216 - 188.165.95.223 de -188.165.95.224 - 188.165.95.255 pl -188.165.96.0 - 188.165.102.223 fr -188.165.102.224 - 188.165.102.239 de -188.165.102.240 - 188.165.103.63 fr -188.165.103.64 - 188.165.103.127 gb -188.165.103.128 - 188.165.112.127 fr -188.165.112.128 - 188.165.112.191 it -188.165.112.192 - 188.165.112.207 ch -188.165.112.208 - 188.165.112.235 fr -188.165.112.236 - 188.165.112.239 gb -188.165.112.240 - 188.165.113.31 fr -188.165.113.32 - 188.165.113.47 pl -188.165.113.48 - 188.165.113.63 fr -188.165.113.64 - 188.165.113.159 de -188.165.113.160 - 188.165.113.255 es -188.165.114.0 - 188.165.114.15 fr -188.165.114.16 - 188.165.114.23 es -188.165.114.24 - 188.165.114.31 pl -188.165.114.32 - 188.165.114.63 gb -188.165.114.64 - 188.165.114.71 it -188.165.114.72 - 188.165.114.75 fr -188.165.114.76 - 188.165.114.79 it -188.165.114.80 - 188.165.114.95 es -188.165.114.96 - 188.165.114.111 be -188.165.114.112 - 188.165.114.127 pl -188.165.114.128 - 188.165.114.143 es -188.165.114.144 - 188.165.114.151 de -188.165.114.152 - 188.165.114.155 pl -188.165.114.156 - 188.165.114.223 fr -188.165.114.224 - 188.165.114.231 de -188.165.114.232 - 188.165.114.255 gb -188.165.115.0 - 188.165.115.255 es -188.165.116.0 - 188.165.116.19 fr -188.165.116.20 - 188.165.116.23 lt -188.165.116.24 - 188.165.116.31 fr -188.165.116.32 - 188.165.116.63 de -188.165.116.64 - 188.165.116.95 pt -188.165.116.96 - 188.165.116.127 es -188.165.116.128 - 188.165.116.143 fr -188.165.116.144 - 188.165.116.147 ch -188.165.116.148 - 188.165.116.151 lt -188.165.116.152 - 188.165.116.159 pl -188.165.116.160 - 188.165.116.175 de -188.165.116.176 - 188.165.116.183 fr -188.165.116.184 - 188.165.116.191 gb -188.165.116.192 - 188.165.116.255 fr -188.165.117.0 - 188.165.118.3 de -188.165.118.4 - 188.165.118.7 fr -188.165.118.8 - 188.165.118.11 lt -188.165.118.12 - 188.165.118.15 nl -188.165.118.16 - 188.165.118.39 fr -188.165.118.40 - 188.165.118.43 it -188.165.118.44 - 188.165.118.47 gb -188.165.118.48 - 188.165.118.63 fr -188.165.118.64 - 188.165.118.67 es -188.165.118.68 - 188.165.118.71 it -188.165.118.72 - 188.165.118.75 cz -188.165.118.76 - 188.165.118.79 lt -188.165.118.80 - 188.165.118.83 pl -188.165.118.84 - 188.165.118.103 fr -188.165.118.104 - 188.165.118.111 pl -188.165.118.112 - 188.165.118.127 gb -188.165.118.128 - 188.165.118.131 de -188.165.118.132 - 188.165.118.135 pl -188.165.118.136 - 188.165.118.139 gb -188.165.118.140 - 188.165.118.143 de -188.165.118.144 - 188.165.118.159 pl -188.165.118.160 - 188.165.118.179 fr -188.165.118.180 - 188.165.118.183 es -188.165.118.184 - 188.165.118.187 ch -188.165.118.188 - 188.165.118.191 it -188.165.118.192 - 188.165.118.207 pl -188.165.118.208 - 188.165.118.211 nl -188.165.118.212 - 188.165.118.215 gb -188.165.118.216 - 188.165.118.223 fr -188.165.118.224 - 188.165.118.255 de -188.165.119.0 - 188.165.119.63 pl -188.165.119.64 - 188.165.119.79 de -188.165.119.80 - 188.165.119.87 es -188.165.119.88 - 188.165.119.111 de -188.165.119.112 - 188.165.119.115 fr -188.165.119.116 - 188.165.119.127 pl -188.165.119.128 - 188.165.119.131 lt -188.165.119.132 - 188.165.119.135 fr -188.165.119.136 - 188.165.119.139 ch -188.165.119.140 - 188.165.119.147 it -188.165.119.148 - 188.165.119.159 pl -188.165.119.160 - 188.165.119.163 es -188.165.119.164 - 188.165.119.167 gb -188.165.119.168 - 188.165.119.187 pl -188.165.119.188 - 188.165.119.191 es -188.165.119.192 - 188.165.119.207 fr -188.165.119.208 - 188.165.119.211 ch -188.165.119.212 - 188.165.119.215 fr -188.165.119.216 - 188.165.119.223 pl -188.165.119.224 - 188.165.119.255 es -188.165.120.0 - 188.165.120.31 gb -188.165.120.32 - 188.165.120.63 es -188.165.120.64 - 188.165.120.143 fr -188.165.120.144 - 188.165.120.151 pl -188.165.120.152 - 188.165.120.159 fr -188.165.120.160 - 188.165.120.167 es -188.165.120.168 - 188.165.120.171 gb -188.165.120.172 - 188.165.120.175 de -188.165.120.176 - 188.165.120.191 pl -188.165.120.192 - 188.165.120.195 es -188.165.120.196 - 188.165.120.199 pt -188.165.120.200 - 188.165.120.207 pl -188.165.120.208 - 188.165.120.223 gb -188.165.120.224 - 188.165.120.231 fr -188.165.120.232 - 188.165.120.235 es -188.165.120.236 - 188.165.120.239 de -188.165.120.240 - 188.165.120.255 pl -188.165.121.0 - 188.165.121.127 fr -188.165.121.128 - 188.165.121.143 de -188.165.121.144 - 188.165.121.151 pl -188.165.121.152 - 188.165.121.255 fr -188.165.122.0 - 188.165.122.31 de -188.165.122.32 - 188.165.122.39 fr -188.165.122.40 - 188.165.122.47 pl -188.165.122.48 - 188.165.122.51 cz -188.165.122.52 - 188.165.122.83 fr -188.165.122.84 - 188.165.122.87 es -188.165.122.88 - 188.165.122.95 gb -188.165.122.96 - 188.165.122.99 de -188.165.122.100 - 188.165.122.107 it -188.165.122.108 - 188.165.122.119 fr -188.165.122.120 - 188.165.122.123 pl -188.165.122.124 - 188.165.122.191 fr -188.165.122.192 - 188.165.122.223 de -188.165.122.224 - 188.165.122.239 gb -188.165.122.240 - 188.165.122.247 it -188.165.122.248 - 188.165.122.255 pl -188.165.123.0 - 188.165.123.15 es -188.165.123.16 - 188.165.123.23 fr -188.165.123.24 - 188.165.123.27 de -188.165.123.28 - 188.165.123.47 fr -188.165.123.48 - 188.165.123.63 de -188.165.123.64 - 188.165.123.95 be -188.165.123.96 - 188.165.123.111 it -188.165.123.112 - 188.165.123.119 nl -188.165.123.120 - 188.165.123.127 es -188.165.123.128 - 188.165.123.159 de -188.165.123.160 - 188.165.123.191 gb -188.165.123.192 - 188.165.123.195 es -188.165.123.196 - 188.165.123.199 it -188.165.123.200 - 188.165.123.203 fr -188.165.123.204 - 188.165.123.207 gb -188.165.123.208 - 188.165.123.227 pl -188.165.123.228 - 188.165.123.231 it -188.165.123.232 - 188.165.123.239 be -188.165.123.240 - 188.165.123.247 pl -188.165.123.248 - 188.165.123.255 es -188.165.124.0 - 188.165.124.15 pl -188.165.124.16 - 188.165.124.23 fr -188.165.124.24 - 188.165.124.27 cz -188.165.124.28 - 188.165.124.31 de -188.165.124.32 - 188.165.124.35 es -188.165.124.36 - 188.165.124.63 fr -188.165.124.64 - 188.165.124.67 pl -188.165.124.68 - 188.165.124.71 es -188.165.124.72 - 188.165.124.79 fr -188.165.124.80 - 188.165.124.95 ie -188.165.124.96 - 188.165.124.111 es -188.165.124.112 - 188.165.124.127 gb -188.165.124.128 - 188.165.124.159 it -188.165.124.160 - 188.165.124.175 es -188.165.124.176 - 188.165.124.179 fr -188.165.124.180 - 188.165.124.183 es -188.165.124.184 - 188.165.124.187 gb -188.165.124.188 - 188.165.124.207 de -188.165.124.208 - 188.165.124.215 be -188.165.124.216 - 188.165.124.219 de -188.165.124.220 - 188.165.124.223 pt -188.165.124.224 - 188.165.124.239 fr -188.165.124.240 - 188.165.124.255 nl -188.165.125.0 - 188.165.125.31 fr -188.165.125.32 - 188.165.125.47 es -188.165.125.48 - 188.165.125.63 fr -188.165.125.64 - 188.165.125.95 gb -188.165.125.96 - 188.165.125.103 es -188.165.125.104 - 188.165.125.111 de -188.165.125.112 - 188.165.125.143 fr -188.165.125.144 - 188.165.125.151 de -188.165.125.152 - 188.165.125.155 gb -188.165.125.156 - 188.165.125.159 pt -188.165.125.160 - 188.165.125.163 fi -188.165.125.164 - 188.165.125.191 fr -188.165.125.192 - 188.165.125.199 pl -188.165.125.200 - 188.165.125.203 fr -188.165.125.204 - 188.165.125.207 de -188.165.125.208 - 188.165.125.211 nl -188.165.125.212 - 188.165.125.215 de -188.165.125.216 - 188.165.125.231 es -188.165.125.232 - 188.165.125.235 de -188.165.125.236 - 188.165.125.239 es -188.165.125.240 - 188.165.125.243 fr -188.165.125.244 - 188.165.125.247 es -188.165.125.248 - 188.165.125.255 pl -188.165.126.0 - 188.165.126.15 nl -188.165.126.16 - 188.165.126.31 fr -188.165.126.32 - 188.165.126.63 de -188.165.126.64 - 188.165.126.127 pl -188.165.126.128 - 188.165.126.135 gb -188.165.126.136 - 188.165.126.143 pl -188.165.126.144 - 188.165.126.147 pt -188.165.126.148 - 188.165.126.151 fr -188.165.126.152 - 188.165.126.155 ie -188.165.126.156 - 188.165.126.223 fr -188.165.126.224 - 188.165.126.231 pl -188.165.126.232 - 188.165.126.235 ch -188.165.126.236 - 188.165.126.239 cz -188.165.126.240 - 188.165.127.63 fr -188.165.127.64 - 188.165.127.67 be -188.165.127.68 - 188.165.127.71 pl -188.165.127.72 - 188.165.127.79 fr -188.165.127.80 - 188.165.127.87 es -188.165.127.88 - 188.165.127.95 pt -188.165.127.96 - 188.165.127.111 gb -188.165.127.112 - 188.165.127.127 fr -188.165.127.128 - 188.165.127.143 pl -188.165.127.144 - 188.165.127.155 fr -188.165.127.156 - 188.165.127.159 nl -188.165.127.160 - 188.165.127.163 fr -188.165.127.164 - 188.165.127.167 es -188.165.127.168 - 188.165.127.191 fr -188.165.127.192 - 188.165.135.255 es +188.165.90.176 - 188.165.91.47 fr +188.165.91.48 - 188.165.91.55 nl +188.165.91.56 - 188.165.91.239 fr +188.165.91.240 - 188.165.91.255 es +188.165.92.0 - 188.165.95.143 fr +188.165.95.144 - 188.165.95.147 it +188.165.95.148 - 188.165.112.175 fr +188.165.112.176 - 188.165.112.191 pt +188.165.112.192 - 188.165.115.63 fr +188.165.115.64 - 188.165.115.95 de +188.165.115.96 - 188.165.117.247 fr +188.165.117.248 - 188.165.117.255 de +188.165.118.0 - 188.165.118.7 fr +188.165.118.8 - 188.165.118.11 es +188.165.118.12 - 188.165.118.183 fr +188.165.118.184 - 188.165.118.187 de +188.165.118.188 - 188.165.119.203 fr +188.165.119.204 - 188.165.119.207 nl +188.165.119.208 - 188.165.120.19 fr +188.165.120.20 - 188.165.120.23 de +188.165.120.24 - 188.165.120.31 fr +188.165.120.32 - 188.165.120.63 pt +188.165.120.64 - 188.165.120.75 fr +188.165.120.76 - 188.165.120.79 nl +188.165.120.80 - 188.165.122.111 fr +188.165.122.112 - 188.165.122.115 es +188.165.122.116 - 188.165.123.15 fr +188.165.123.16 - 188.165.123.19 es +188.165.123.20 - 188.165.126.167 fr +188.165.126.168 - 188.165.126.171 es +188.165.126.172 - 188.165.127.255 fr +188.165.128.0 - 188.165.135.255 es 188.165.136.0 - 188.165.143.255 fi -188.165.144.0 - 188.165.144.127 fr -188.165.144.128 - 188.165.144.159 gb -188.165.144.160 - 188.165.144.175 fr -188.165.144.176 - 188.165.144.183 it -188.165.144.184 - 188.165.144.191 pl -188.165.144.192 - 188.165.144.223 es -188.165.144.224 - 188.165.144.243 fr -188.165.144.244 - 188.165.144.247 pl -188.165.144.248 - 188.165.144.255 fr -188.165.145.0 - 188.165.145.127 es -188.165.145.128 - 188.165.145.135 nl -188.165.145.136 - 188.165.145.139 pt -188.165.145.140 - 188.165.145.143 de -188.165.145.144 - 188.165.145.175 it -188.165.145.176 - 188.165.145.183 es -188.165.145.184 - 188.165.145.191 pl -188.165.145.192 - 188.165.145.255 fr -188.165.146.0 - 188.165.146.255 es -188.165.147.0 - 188.165.147.255 fr -188.165.148.0 - 188.165.148.31 de -188.165.148.32 - 188.165.148.35 fr -188.165.148.36 - 188.165.148.39 de -188.165.148.40 - 188.165.148.47 fr -188.165.148.48 - 188.165.148.63 pl -188.165.148.64 - 188.165.148.79 gb -188.165.148.80 - 188.165.148.255 fr -188.165.149.0 - 188.165.150.255 pl -188.165.151.0 - 188.165.151.127 fr -188.165.151.128 - 188.165.151.131 pl -188.165.151.132 - 188.165.151.135 nl -188.165.151.136 - 188.165.151.139 es -188.165.151.140 - 188.165.151.143 it -188.165.151.144 - 188.165.151.147 gb -188.165.151.148 - 188.165.151.151 fr -188.165.151.152 - 188.165.151.155 ie -188.165.151.156 - 188.165.151.159 lt -188.165.151.160 - 188.165.151.191 de -188.165.151.192 - 188.165.151.195 pt -188.165.151.196 - 188.165.151.199 cz -188.165.151.200 - 188.165.151.203 ie -188.165.151.204 - 188.165.151.207 gb -188.165.151.208 - 188.165.151.223 de -188.165.151.224 - 188.165.151.243 fr -188.165.151.244 - 188.165.151.247 pl -188.165.151.248 - 188.165.151.255 de -188.165.152.0 - 188.165.152.31 gb -188.165.152.32 - 188.165.152.47 ie -188.165.152.48 - 188.165.152.55 pt -188.165.152.56 - 188.165.152.59 nl +188.165.144.0 - 188.165.145.63 fr +188.165.145.64 - 188.165.145.71 es +188.165.145.72 - 188.165.145.135 fr +188.165.145.136 - 188.165.145.139 de +188.165.145.140 - 188.165.149.31 fr +188.165.149.32 - 188.165.149.63 gb +188.165.149.64 - 188.165.149.127 fr +188.165.149.128 - 188.165.149.255 gb +188.165.150.0 - 188.165.150.7 fr +188.165.150.8 - 188.165.150.11 nl +188.165.150.12 - 188.165.151.131 fr +188.165.151.132 - 188.165.151.135 es +188.165.151.136 - 188.165.152.59 fr 188.165.152.60 - 188.165.152.63 be -188.165.152.64 - 188.165.152.95 pl -188.165.152.96 - 188.165.152.111 cz -188.165.152.112 - 188.165.152.119 fr -188.165.152.120 - 188.165.152.123 pl -188.165.152.124 - 188.165.152.135 es -188.165.152.136 - 188.165.152.139 pl -188.165.152.140 - 188.165.152.143 de -188.165.152.144 - 188.165.152.175 fr -188.165.152.176 - 188.165.152.183 es -188.165.152.184 - 188.165.152.187 fr -188.165.152.188 - 188.165.152.223 gb -188.165.152.224 - 188.165.152.239 fr -188.165.152.240 - 188.165.152.243 lt -188.165.152.244 - 188.165.152.247 es -188.165.152.248 - 188.165.152.251 pl -188.165.152.252 - 188.165.153.255 fr -188.165.154.0 - 188.165.154.255 pl -188.165.155.0 - 188.165.155.15 de -188.165.155.16 - 188.165.155.31 fr -188.165.155.32 - 188.165.155.47 ie -188.165.155.48 - 188.165.155.95 fr -188.165.155.96 - 188.165.155.127 de -188.165.155.128 - 188.165.155.147 fr -188.165.155.148 - 188.165.155.151 de -188.165.155.152 - 188.165.155.155 es -188.165.155.156 - 188.165.155.159 pl -188.165.155.160 - 188.165.155.175 ie -188.165.155.176 - 188.165.155.255 fr -188.165.156.0 - 188.165.156.63 ie -188.165.156.64 - 188.165.156.95 gb -188.165.156.96 - 188.165.156.127 de -188.165.156.128 - 188.165.156.227 fr -188.165.156.228 - 188.165.156.231 gb -188.165.156.232 - 188.165.156.235 pl -188.165.156.236 - 188.165.156.239 fr -188.165.156.240 - 188.165.156.255 gb -188.165.157.0 - 188.165.157.31 ie -188.165.157.32 - 188.165.157.47 be -188.165.157.48 - 188.165.157.51 pl -188.165.157.52 - 188.165.157.55 de -188.165.157.56 - 188.165.157.59 es -188.165.157.60 - 188.165.157.63 de -188.165.157.64 - 188.165.157.95 es -188.165.157.96 - 188.165.157.99 nl -188.165.157.100 - 188.165.157.103 be -188.165.157.104 - 188.165.157.107 fi -188.165.157.108 - 188.165.157.111 gb -188.165.157.112 - 188.165.157.119 fr -188.165.157.120 - 188.165.157.123 de -188.165.157.124 - 188.165.157.127 es -188.165.157.128 - 188.165.157.131 pl -188.165.157.132 - 188.165.157.135 es -188.165.157.136 - 188.165.157.139 fr -188.165.157.140 - 188.165.157.143 pl -188.165.157.144 - 188.165.157.159 it -188.165.157.160 - 188.165.157.163 nl -188.165.157.164 - 188.165.157.167 ch -188.165.157.168 - 188.165.157.171 it -188.165.157.172 - 188.165.157.175 gb -188.165.157.176 - 188.165.157.183 fr -188.165.157.184 - 188.165.157.187 ie -188.165.157.188 - 188.165.157.191 pt -188.165.157.192 - 188.165.157.223 fr -188.165.157.224 - 188.165.157.255 gb -188.165.158.0 - 188.165.158.63 pl -188.165.158.64 - 188.165.158.71 fr -188.165.158.72 - 188.165.158.75 gb -188.165.158.76 - 188.165.158.79 es -188.165.158.80 - 188.165.158.111 fr -188.165.158.112 - 188.165.158.119 es -188.165.158.120 - 188.165.158.127 ch -188.165.158.128 - 188.165.158.135 fr -188.165.158.136 - 188.165.158.143 ch -188.165.158.144 - 188.165.158.151 es -188.165.158.152 - 188.165.158.155 gb -188.165.158.156 - 188.165.158.159 fr -188.165.158.160 - 188.165.158.191 it -188.165.158.192 - 188.165.158.195 gb -188.165.158.196 - 188.165.158.199 fr -188.165.158.200 - 188.165.158.223 pl -188.165.158.224 - 188.165.159.31 fr -188.165.159.32 - 188.165.159.39 pl -188.165.159.40 - 188.165.159.71 fr -188.165.159.72 - 188.165.159.75 be -188.165.159.76 - 188.165.159.79 ch -188.165.159.80 - 188.165.159.83 it -188.165.159.84 - 188.165.159.87 pl -188.165.159.88 - 188.165.159.95 gb -188.165.159.96 - 188.165.159.135 fr -188.165.159.136 - 188.165.159.139 gb -188.165.159.140 - 188.165.159.159 fr -188.165.159.160 - 188.165.159.163 nl -188.165.159.164 - 188.165.159.167 fr -188.165.159.168 - 188.165.159.171 gb +188.165.152.64 - 188.165.152.79 fr +188.165.152.80 - 188.165.152.87 nl +188.165.152.88 - 188.165.152.247 fr +188.165.152.248 - 188.165.152.251 nl +188.165.152.252 - 188.165.157.173 fr +188.165.157.174 - 188.165.157.175 it +188.165.157.176 - 188.165.159.171 fr 188.165.159.172 - 188.165.159.175 lt -188.165.159.176 - 188.165.159.239 fr -188.165.159.240 - 188.165.159.255 be -188.165.160.0 - 188.165.160.3 it -188.165.160.4 - 188.165.160.7 fr -188.165.160.8 - 188.165.160.15 pl -188.165.160.16 - 188.165.160.63 fr -188.165.160.64 - 188.165.160.127 de -188.165.160.128 - 188.165.160.255 gb -188.165.161.0 - 188.165.161.191 de -188.165.161.192 - 188.165.161.195 fr -188.165.161.196 - 188.165.161.199 it -188.165.161.200 - 188.165.161.203 ch -188.165.161.204 - 188.165.161.207 fr -188.165.161.208 - 188.165.161.215 nl -188.165.161.216 - 188.165.161.219 fr -188.165.161.220 - 188.165.161.223 pl -188.165.161.224 - 188.165.161.239 es -188.165.161.240 - 188.165.161.247 pl -188.165.161.248 - 188.165.161.255 cz -188.165.162.0 - 188.165.162.255 es -188.165.163.0 - 188.165.163.19 fr -188.165.163.20 - 188.165.163.23 it -188.165.163.24 - 188.165.163.27 de -188.165.163.28 - 188.165.163.31 fr -188.165.163.32 - 188.165.163.127 be -188.165.163.128 - 188.165.163.191 de -188.165.163.192 - 188.165.163.207 fr -188.165.163.208 - 188.165.163.223 es -188.165.163.224 - 188.165.163.239 ch -188.165.163.240 - 188.165.163.243 es -188.165.163.244 - 188.165.163.251 fr -188.165.163.252 - 188.165.163.255 ch -188.165.164.0 - 188.165.164.255 gb -188.165.165.0 - 188.165.165.31 fr -188.165.165.32 - 188.165.165.63 de -188.165.165.64 - 188.165.165.127 nl -188.165.165.128 - 188.165.165.191 be -188.165.165.192 - 188.165.165.211 fr -188.165.165.212 - 188.165.165.223 de -188.165.165.224 - 188.165.165.239 gb -188.165.165.240 - 188.165.165.243 de -188.165.165.244 - 188.165.166.15 fr -188.165.166.16 - 188.165.166.31 it -188.165.166.32 - 188.165.166.35 cz -188.165.166.36 - 188.165.166.39 gb -188.165.166.40 - 188.165.166.43 nl -188.165.166.44 - 188.165.166.47 fr -188.165.166.48 - 188.165.166.51 ie -188.165.166.52 - 188.165.166.55 pl -188.165.166.56 - 188.165.166.63 fr -188.165.166.64 - 188.165.166.95 pl -188.165.166.96 - 188.165.166.111 it -188.165.166.112 - 188.165.166.127 fr -188.165.166.128 - 188.165.166.135 pl -188.165.166.136 - 188.165.166.147 fr -188.165.166.148 - 188.165.166.151 fi -188.165.166.152 - 188.165.166.155 fr -188.165.166.156 - 188.165.166.159 de -188.165.166.160 - 188.165.166.191 fr -188.165.166.192 - 188.165.166.223 gb -188.165.166.224 - 188.165.166.255 it -188.165.167.0 - 188.165.168.255 es -188.165.169.0 - 188.165.169.95 de -188.165.169.96 - 188.165.169.103 gb -188.165.169.104 - 188.165.169.107 fr +188.165.159.176 - 188.165.163.15 fr +188.165.163.16 - 188.165.163.23 it +188.165.163.24 - 188.165.169.107 fr 188.165.169.108 - 188.165.169.111 es -188.165.169.112 - 188.165.169.127 de -188.165.169.128 - 188.165.169.191 pl -188.165.169.192 - 188.165.169.199 fr -188.165.169.200 - 188.165.169.203 es -188.165.169.204 - 188.165.169.207 de -188.165.169.208 - 188.165.169.239 pl -188.165.169.240 - 188.165.169.243 gb -188.165.169.244 - 188.165.169.247 fr -188.165.169.248 - 188.165.169.251 be -188.165.169.252 - 188.165.170.7 cz -188.165.170.8 - 188.165.170.15 gb -188.165.170.16 - 188.165.170.31 fr -188.165.170.32 - 188.165.170.47 ie -188.165.170.48 - 188.165.170.55 be -188.165.170.56 - 188.165.170.59 pl -188.165.170.60 - 188.165.170.63 ch -188.165.170.64 - 188.165.170.95 ie -188.165.170.96 - 188.165.170.127 es -188.165.170.128 - 188.165.170.159 de -188.165.170.160 - 188.165.170.175 gb -188.165.170.176 - 188.165.170.191 fr -188.165.170.192 - 188.165.170.223 gb -188.165.170.224 - 188.165.170.239 de -188.165.170.240 - 188.165.170.247 gb -188.165.170.248 - 188.165.170.255 fr -188.165.171.0 - 188.165.171.31 de -188.165.171.32 - 188.165.171.39 pl -188.165.171.40 - 188.165.171.43 fr -188.165.171.44 - 188.165.171.47 es -188.165.171.48 - 188.165.171.51 pl -188.165.171.52 - 188.165.171.55 gb -188.165.171.56 - 188.165.171.59 fr -188.165.171.60 - 188.165.171.63 de -188.165.171.64 - 188.165.171.79 gb -188.165.171.80 - 188.165.171.87 fr -188.165.171.88 - 188.165.171.91 de -188.165.171.92 - 188.165.171.111 fr -188.165.171.112 - 188.165.171.115 gb -188.165.171.116 - 188.165.171.119 fr -188.165.171.120 - 188.165.171.127 pl -188.165.171.128 - 188.165.173.255 fr -188.165.174.0 - 188.165.174.31 pl -188.165.174.32 - 188.165.174.51 fr -188.165.174.52 - 188.165.174.55 pl -188.165.174.56 - 188.165.174.59 pt +188.165.169.112 - 188.165.170.95 fr +188.165.170.96 - 188.165.170.127 gb +188.165.170.128 - 188.165.172.255 fr +188.165.173.0 - 188.165.173.101 gb +188.165.173.102 - 188.165.173.102 it +188.165.173.103 - 188.165.173.127 gb +188.165.173.128 - 188.165.173.191 fr +188.165.173.192 - 188.165.173.223 es +188.165.173.224 - 188.165.174.59 fr 188.165.174.60 - 188.165.174.63 de -188.165.174.64 - 188.165.174.67 be -188.165.174.68 - 188.165.174.75 gb -188.165.174.76 - 188.165.174.79 de -188.165.174.80 - 188.165.174.83 fr -188.165.174.84 - 188.165.174.127 pl -188.165.174.128 - 188.165.174.135 fr -188.165.174.136 - 188.165.174.139 pl -188.165.174.140 - 188.165.174.143 it -188.165.174.144 - 188.165.174.159 pl -188.165.174.160 - 188.165.174.191 fr -188.165.174.192 - 188.165.174.223 gb -188.165.174.224 - 188.165.174.255 fr -188.165.175.0 - 188.165.175.255 gb -188.165.176.0 - 188.165.176.63 ch -188.165.176.64 - 188.165.176.127 gb -188.165.176.128 - 188.165.176.195 it -188.165.176.196 - 188.165.176.239 es -188.165.176.240 - 188.165.176.247 gb -188.165.176.248 - 188.165.176.251 nl -188.165.176.252 - 188.165.176.255 fr -188.165.177.0 - 188.165.177.255 es -188.165.178.0 - 188.165.178.47 fi -188.165.178.48 - 188.165.178.63 pl -188.165.178.64 - 188.165.178.79 gb -188.165.178.80 - 188.165.178.83 pl -188.165.178.84 - 188.165.178.87 de -188.165.178.88 - 188.165.178.103 pl -188.165.178.104 - 188.165.178.115 es -188.165.178.116 - 188.165.178.119 pt -188.165.178.120 - 188.165.178.123 be -188.165.178.124 - 188.165.178.135 pl -188.165.178.136 - 188.165.178.139 nl -188.165.178.140 - 188.165.178.143 es -188.165.178.144 - 188.165.178.159 pl -188.165.178.160 - 188.165.178.191 fr -188.165.178.192 - 188.165.178.207 pl -188.165.178.208 - 188.165.178.223 es -188.165.178.224 - 188.165.178.227 de -188.165.178.228 - 188.165.178.231 pl -188.165.178.232 - 188.165.178.235 es -188.165.178.236 - 188.165.178.255 pl -188.165.179.0 - 188.165.179.63 fr -188.165.179.64 - 188.165.179.67 es -188.165.179.68 - 188.165.179.71 pt -188.165.179.72 - 188.165.179.75 pl -188.165.179.76 - 188.165.179.79 nl -188.165.179.80 - 188.165.179.95 gb -188.165.179.96 - 188.165.179.111 nl -188.165.179.112 - 188.165.179.119 de -188.165.179.120 - 188.165.179.139 pl -188.165.179.140 - 188.165.179.143 es -188.165.179.144 - 188.165.179.151 pl -188.165.179.152 - 188.165.179.159 es -188.165.179.160 - 188.165.179.191 fr -188.165.179.192 - 188.165.179.223 pt -188.165.179.224 - 188.165.179.255 pl -188.165.180.0 - 188.165.180.3 nl -188.165.180.4 - 188.165.180.7 gb -188.165.180.8 - 188.165.180.11 fr -188.165.180.12 - 188.165.180.15 gb -188.165.180.16 - 188.165.180.31 fr -188.165.180.32 - 188.165.180.63 gb -188.165.180.64 - 188.165.180.87 fr -188.165.180.88 - 188.165.180.95 pl -188.165.180.96 - 188.165.180.103 fr -188.165.180.104 - 188.165.180.111 es -188.165.180.112 - 188.165.180.127 ie -188.165.180.128 - 188.165.180.131 gb -188.165.180.132 - 188.165.180.135 de -188.165.180.136 - 188.165.180.143 pt -188.165.180.144 - 188.165.180.151 fi -188.165.180.152 - 188.165.180.159 pl -188.165.180.160 - 188.165.180.167 es +188.165.174.64 - 188.165.180.15 fr +188.165.180.16 - 188.165.180.31 be +188.165.180.32 - 188.165.180.167 fr 188.165.180.168 - 188.165.180.175 it -188.165.180.176 - 188.165.180.179 fr -188.165.180.180 - 188.165.180.183 ie -188.165.180.184 - 188.165.180.187 gb -188.165.180.188 - 188.165.180.191 fr -188.165.180.192 - 188.165.180.199 de -188.165.180.200 - 188.165.180.203 fr -188.165.180.204 - 188.165.180.207 pl -188.165.180.208 - 188.165.180.215 fr -188.165.180.216 - 188.165.180.219 pl -188.165.180.220 - 188.165.180.223 es -188.165.180.224 - 188.165.180.239 de -188.165.180.240 - 188.165.180.255 pl -188.165.181.0 - 188.165.181.15 fr -188.165.181.16 - 188.165.181.19 es -188.165.181.20 - 188.165.181.23 fr -188.165.181.24 - 188.165.181.31 de -188.165.181.32 - 188.165.181.47 it -188.165.181.48 - 188.165.181.63 pt -188.165.181.64 - 188.165.181.75 fr -188.165.181.76 - 188.165.181.95 de -188.165.181.96 - 188.165.181.127 pl -188.165.181.128 - 188.165.181.255 fr -188.165.182.0 - 188.165.182.31 ch -188.165.182.32 - 188.165.182.47 fr -188.165.182.48 - 188.165.182.63 pl -188.165.182.64 - 188.165.182.127 fr -188.165.182.128 - 188.165.182.143 de -188.165.182.144 - 188.165.182.159 cz -188.165.182.160 - 188.165.182.175 pt -188.165.182.176 - 188.165.182.191 cz -188.165.182.192 - 188.165.182.195 it -188.165.182.196 - 188.165.182.199 es -188.165.182.200 - 188.165.182.207 fr -188.165.182.208 - 188.165.182.223 ch -188.165.182.224 - 188.165.182.255 cz -188.165.183.0 - 188.165.183.255 fr -188.165.184.0 - 188.165.184.63 pl -188.165.184.64 - 188.165.184.95 de -188.165.184.96 - 188.165.184.127 es -188.165.184.128 - 188.165.184.255 fr -188.165.185.0 - 188.165.185.255 pl -188.165.186.0 - 188.165.186.31 gb -188.165.186.32 - 188.165.186.63 it -188.165.186.64 - 188.165.186.79 lt -188.165.186.80 - 188.165.186.95 pt -188.165.186.96 - 188.165.186.111 nl -188.165.186.112 - 188.165.186.127 pl -188.165.186.128 - 188.165.186.159 fr -188.165.186.160 - 188.165.186.175 gb -188.165.186.176 - 188.165.186.207 fr -188.165.186.208 - 188.165.186.211 gb -188.165.186.212 - 188.165.186.215 nl -188.165.186.216 - 188.165.186.219 de -188.165.186.220 - 188.165.186.223 gb -188.165.186.224 - 188.165.186.239 it -188.165.186.240 - 188.165.186.243 de -188.165.186.244 - 188.165.186.247 be -188.165.186.248 - 188.165.186.251 ch -188.165.186.252 - 188.165.186.255 cz -188.165.187.0 - 188.165.187.127 de -188.165.187.128 - 188.165.187.135 fr -188.165.187.136 - 188.165.187.143 nl -188.165.187.144 - 188.165.187.147 fr -188.165.187.148 - 188.165.187.159 es -188.165.187.160 - 188.165.187.191 it -188.165.187.192 - 188.165.187.207 gb -188.165.187.208 - 188.165.187.223 fr -188.165.187.224 - 188.165.187.227 de -188.165.187.228 - 188.165.187.231 es -188.165.187.232 - 188.165.187.235 gb -188.165.187.236 - 188.165.187.239 de -188.165.187.240 - 188.165.187.255 fr -188.165.188.0 - 188.165.188.255 it -188.165.189.0 - 188.165.189.127 fr -188.165.189.128 - 188.165.189.131 pt -188.165.189.132 - 188.165.189.135 pl -188.165.189.136 - 188.165.189.139 gb -188.165.189.140 - 188.165.189.143 fr -188.165.189.144 - 188.165.189.159 es -188.165.189.160 - 188.165.189.175 fr -188.165.189.176 - 188.165.189.191 ie -188.165.189.192 - 188.165.189.223 pt -188.165.189.224 - 188.165.189.227 it -188.165.189.228 - 188.165.189.231 fi -188.165.189.232 - 188.165.189.235 pl -188.165.189.236 - 188.165.189.239 fr -188.165.189.240 - 188.165.189.247 pt -188.165.189.248 - 188.165.190.255 pl -188.165.191.0 - 188.165.191.7 pt -188.165.191.8 - 188.165.191.11 pl -188.165.191.12 - 188.165.191.15 gb -188.165.191.16 - 188.165.191.31 fr -188.165.191.32 - 188.165.191.39 es -188.165.191.40 - 188.165.191.55 pl -188.165.191.56 - 188.165.191.59 fr -188.165.191.60 - 188.165.191.63 de -188.165.191.64 - 188.165.191.79 gb -188.165.191.80 - 188.165.191.103 fr -188.165.191.104 - 188.165.191.107 be -188.165.191.108 - 188.165.191.159 fr -188.165.191.160 - 188.165.191.163 pl -188.165.191.164 - 188.165.191.167 gb -188.165.191.168 - 188.165.191.175 pl -188.165.191.176 - 188.165.191.191 nl -188.165.191.192 - 188.165.191.215 fr -188.165.191.216 - 188.165.191.223 pl -188.165.191.224 - 188.165.191.231 de -188.165.191.232 - 188.165.191.239 fr -188.165.191.240 - 188.165.191.255 de -188.165.192.0 - 188.165.255.255 fr -188.166.0.0 - 188.166.255.255 ru +188.165.180.176 - 188.165.255.255 fr +188.166.0.0 - 188.166.143.255 nl +188.166.144.0 - 188.166.159.255 gb +188.166.160.0 - 188.166.167.255 nl +188.166.168.0 - 188.166.175.255 gb +188.166.176.0 - 188.166.191.255 sg +188.166.192.0 - 188.166.207.255 nl +188.166.208.0 - 188.166.255.255 sg 188.167.0.0 - 188.167.255.255 sk 188.168.0.0 - 188.168.255.255 ru 188.169.0.0 - 188.169.255.255 ge -188.170.0.0 - 188.170.255.255 ro +188.170.0.0 - 188.170.255.255 ru 188.171.0.0 - 188.171.255.255 es -188.172.0.0 - 188.173.255.255 ro +188.172.0.0 - 188.172.111.255 mt +188.172.112.0 - 188.172.127.255 de +188.172.128.0 - 188.172.143.255 ie +188.172.144.0 - 188.172.191.255 gb +188.172.192.0 - 188.172.197.255 at +188.172.198.0 - 188.172.198.255 gb +188.172.199.0 - 188.172.199.255 at +188.172.200.0 - 188.172.200.255 jp +188.172.201.0 - 188.172.201.255 hk +188.172.202.0 - 188.172.202.255 jp +188.172.203.0 - 188.172.207.255 at +188.172.208.0 - 188.172.208.255 tw +188.172.209.0 - 188.172.209.255 au +188.172.210.0 - 188.172.210.255 kr +188.172.211.0 - 188.172.211.255 hk +188.172.212.0 - 188.172.213.255 ca +188.172.214.0 - 188.172.215.255 us +188.172.216.0 - 188.172.216.255 br +188.172.217.0 - 188.172.217.255 za +188.172.218.0 - 188.172.218.255 it +188.172.219.0 - 188.172.219.255 nl +188.172.220.0 - 188.172.220.255 at +188.172.221.0 - 188.172.221.255 ca +188.172.222.0 - 188.172.255.255 at +188.173.0.0 - 188.173.255.255 ro 188.174.0.0 - 188.174.255.255 de 188.175.0.0 - 188.175.255.255 cz -188.176.0.0 - 188.183.255.255 dk +188.176.0.0 - 188.180.98.83 dk +188.180.98.84 - 188.180.98.87 us +188.180.98.88 - 188.183.255.255 dk 188.184.0.0 - 188.185.255.255 ch 188.186.0.0 - 188.187.255.255 ru 188.188.0.0 - 188.189.255.255 be 188.190.0.0 - 188.190.127.255 ua 188.190.128.0 - 188.190.159.255 ru 188.190.160.0 - 188.190.255.255 ua -188.191.0.0 - 188.191.15.255 ru -188.191.16.0 - 188.191.47.255 ua +188.191.0.0 - 188.191.19.255 ru +188.191.20.0 - 188.191.20.255 ua +188.191.21.0 - 188.191.28.255 ru +188.191.29.0 - 188.191.29.255 ua +188.191.30.0 - 188.191.31.255 ru +188.191.32.0 - 188.191.47.255 ua 188.191.48.0 - 188.191.63.255 cz 188.191.64.0 - 188.191.79.255 ua 188.191.80.0 - 188.191.95.255 ru 188.191.96.0 - 188.191.111.255 ua 188.191.112.0 - 188.191.127.255 ru -188.191.128.0 - 188.191.143.255 ro +188.191.128.0 - 188.191.129.255 pl +188.191.130.0 - 188.191.131.255 cz +188.191.132.0 - 188.191.135.255 gb +188.191.136.0 - 188.191.143.255 ro 188.191.144.0 - 188.191.151.255 ua 188.191.152.0 - 188.191.159.255 gb 188.191.160.0 - 188.191.175.255 ru @@ -84635,34 +73045,241 @@ 188.191.248.0 - 188.191.255.255 ro 188.192.0.0 - 188.195.255.255 de 188.196.0.0 - 188.199.255.255 si -188.200.0.0 - 188.205.169.79 nl -188.205.169.80 - 188.205.169.87 a2 -188.205.169.88 - 188.207.255.255 nl -188.208.0.0 - 188.209.239.255 ro -188.209.240.0 - 188.209.255.255 md -188.210.0.0 - 188.210.237.255 ro -188.210.238.0 - 188.210.238.255 cy -188.210.239.0 - 188.213.79.255 ro -188.213.80.0 - 188.213.95.255 md -188.213.96.0 - 188.214.211.255 ro -188.214.212.0 - 188.214.213.255 de -188.214.214.0 - 188.215.0.255 ro -188.215.1.0 - 188.215.1.255 cy -188.215.2.0 - 188.215.29.255 ro -188.215.30.0 - 188.215.30.255 cy -188.215.31.0 - 188.215.65.255 ro +188.200.0.0 - 188.207.255.255 nl +188.208.0.0 - 188.208.19.255 ro +188.208.20.0 - 188.208.23.255 es +188.208.24.0 - 188.208.39.255 ro +188.208.40.0 - 188.208.40.127 nl +188.208.40.128 - 188.208.47.255 ro +188.208.48.0 - 188.208.55.255 gb +188.208.56.0 - 188.208.63.255 md +188.208.64.0 - 188.208.95.255 ir +188.208.96.0 - 188.208.101.255 ro +188.208.102.0 - 188.208.102.127 kr +188.208.102.128 - 188.208.102.255 ph +188.208.103.0 - 188.208.108.255 ro +188.208.109.0 - 188.208.109.255 gb +188.208.110.0 - 188.208.110.255 ro +188.208.111.0 - 188.208.111.255 gb +188.208.112.0 - 188.208.115.255 md +188.208.116.0 - 188.208.119.255 ro +188.208.120.0 - 188.208.127.255 md +188.208.128.0 - 188.208.143.255 ro +188.208.144.0 - 188.208.191.255 ir +188.208.192.0 - 188.208.195.255 md +188.208.196.0 - 188.208.199.255 ro +188.208.200.0 - 188.208.215.255 md +188.208.216.0 - 188.208.218.255 ro +188.208.219.0 - 188.208.219.255 es +188.208.220.0 - 188.208.223.255 gb +188.208.224.0 - 188.208.255.255 ir +188.209.0.0 - 188.209.7.255 md +188.209.8.0 - 188.209.47.255 ir +188.209.48.0 - 188.209.63.255 nl +188.209.64.0 - 188.209.79.255 ir +188.209.80.0 - 188.209.95.255 it +188.209.96.0 - 188.209.111.255 ro +188.209.112.0 - 188.209.115.255 es +188.209.116.0 - 188.209.119.255 ro +188.209.120.0 - 188.209.127.255 gb +188.209.128.0 - 188.209.207.255 ir +188.209.208.0 - 188.209.223.255 ro +188.209.224.0 - 188.209.255.255 md +188.210.0.0 - 188.210.3.255 de +188.210.4.0 - 188.210.6.255 us +188.210.7.0 - 188.210.13.255 de +188.210.14.0 - 188.210.14.255 us +188.210.15.0 - 188.210.17.255 de +188.210.18.0 - 188.210.18.255 us +188.210.19.0 - 188.210.31.255 de +188.210.32.0 - 188.210.32.255 us +188.210.33.0 - 188.210.63.255 de +188.210.64.0 - 188.210.79.255 ir +188.210.80.0 - 188.210.91.255 ro +188.210.92.0 - 188.210.92.255 be +188.210.93.0 - 188.210.93.255 nl +188.210.94.0 - 188.210.95.255 de +188.210.96.0 - 188.210.207.255 ir +188.210.208.0 - 188.210.211.255 ch +188.210.212.0 - 188.210.212.255 ro +188.210.213.0 - 188.210.213.255 de +188.210.214.0 - 188.210.214.255 us +188.210.215.0 - 188.210.215.255 ro +188.210.216.0 - 188.210.219.255 es +188.210.220.0 - 188.210.223.255 pl +188.210.224.0 - 188.210.231.255 ro +188.210.232.0 - 188.210.235.255 md +188.210.236.0 - 188.210.251.255 ro +188.210.252.0 - 188.210.253.255 gb +188.210.254.0 - 188.210.254.255 ro +188.210.255.0 - 188.210.255.255 gb +188.211.0.0 - 188.211.15.255 ir +188.211.16.0 - 188.211.25.255 ro +188.211.26.0 - 188.211.26.127 in +188.211.26.128 - 188.211.26.255 kr +188.211.27.0 - 188.211.31.255 ro +188.211.32.0 - 188.211.159.255 ir +188.211.160.0 - 188.211.160.255 us +188.211.161.0 - 188.211.162.255 ro +188.211.163.0 - 188.211.163.255 ua +188.211.164.0 - 188.211.167.255 ro +188.211.168.0 - 188.211.175.255 md +188.211.176.0 - 188.211.223.255 ir +188.211.224.0 - 188.211.238.255 ro +188.211.239.0 - 188.211.239.255 nl +188.211.240.0 - 188.211.247.255 se +188.211.248.0 - 188.212.3.255 ro +188.212.4.0 - 188.212.4.255 md +188.212.5.0 - 188.212.5.255 ro +188.212.6.0 - 188.212.7.255 ir +188.212.8.0 - 188.212.15.255 md +188.212.16.0 - 188.212.19.255 es +188.212.20.0 - 188.212.20.255 be +188.212.21.0 - 188.212.21.255 ro +188.212.22.0 - 188.212.22.255 us +188.212.23.0 - 188.212.23.255 gb +188.212.24.0 - 188.212.31.255 md +188.212.32.0 - 188.212.32.255 tr +188.212.33.0 - 188.212.39.255 ro +188.212.40.0 - 188.212.47.255 md +188.212.48.0 - 188.212.95.255 ir +188.212.96.0 - 188.212.107.255 ro +188.212.108.0 - 188.212.109.255 se +188.212.110.0 - 188.212.111.255 ro +188.212.112.0 - 188.212.115.255 md +188.212.116.0 - 188.212.119.255 be +188.212.120.0 - 188.212.156.255 ro +188.212.157.0 - 188.212.157.255 md +188.212.158.0 - 188.212.159.255 ro +188.212.160.0 - 188.212.191.255 ir +188.212.192.0 - 188.212.207.255 ro +188.212.208.0 - 188.212.247.255 ir +188.212.248.0 - 188.212.249.255 ro +188.212.250.0 - 188.212.250.255 gb +188.212.251.0 - 188.213.7.255 ro +188.213.8.0 - 188.213.15.255 es +188.213.16.0 - 188.213.23.255 ro +188.213.24.0 - 188.213.31.255 fr +188.213.32.0 - 188.213.39.255 ro +188.213.40.0 - 188.213.47.255 it +188.213.48.0 - 188.213.51.255 ro +188.213.52.0 - 188.213.55.255 md +188.213.56.0 - 188.213.63.255 es +188.213.64.0 - 188.213.79.255 ir +188.213.80.0 - 188.213.83.255 es +188.213.84.0 - 188.213.95.255 md +188.213.96.0 - 188.213.127.255 ir +188.213.128.0 - 188.213.134.255 ro +188.213.135.0 - 188.213.135.255 gb +188.213.136.0 - 188.213.136.255 it +188.213.137.0 - 188.213.138.255 ro +188.213.139.0 - 188.213.139.255 it +188.213.140.0 - 188.213.143.255 fr +188.213.144.0 - 188.213.159.255 ir +188.213.160.0 - 188.213.175.255 it +188.213.176.0 - 188.213.199.255 ir +188.213.200.0 - 188.213.203.255 ro +188.213.204.0 - 188.213.204.255 mx +188.213.205.0 - 188.213.205.255 ro +188.213.206.0 - 188.213.207.255 gb +188.213.208.0 - 188.213.211.255 md +188.213.212.0 - 188.213.213.255 ro +188.213.214.0 - 188.213.215.255 gb +188.213.216.0 - 188.213.217.255 ro +188.213.218.0 - 188.213.218.127 in +188.213.218.128 - 188.213.218.255 cn +188.213.219.0 - 188.213.223.255 ro +188.213.224.0 - 188.213.231.255 nl +188.213.232.0 - 188.213.233.255 ro +188.213.234.0 - 188.213.235.255 cz +188.213.236.0 - 188.213.240.255 ro +188.213.241.0 - 188.213.241.255 md +188.213.242.0 - 188.213.242.255 ro +188.213.243.0 - 188.213.243.255 nl +188.213.244.0 - 188.213.247.255 md +188.213.248.0 - 188.213.255.255 gb +188.214.0.0 - 188.214.8.255 ro +188.214.9.0 - 188.214.9.255 ua +188.214.10.0 - 188.214.11.255 ro +188.214.12.0 - 188.214.12.255 sg +188.214.13.0 - 188.214.14.255 ro +188.214.15.0 - 188.214.15.255 ua +188.214.16.0 - 188.214.23.255 ro +188.214.24.0 - 188.214.25.255 fr +188.214.26.0 - 188.214.49.255 ro +188.214.50.0 - 188.214.50.255 sg +188.214.51.0 - 188.214.53.255 ro +188.214.54.0 - 188.214.54.255 it +188.214.55.0 - 188.214.59.255 ro +188.214.60.0 - 188.214.63.255 md +188.214.64.0 - 188.214.79.255 ir +188.214.80.0 - 188.214.89.255 ro +188.214.90.0 - 188.214.91.255 gb +188.214.92.0 - 188.214.92.255 ro +188.214.93.0 - 188.214.93.255 de +188.214.94.0 - 188.214.95.255 gb +188.214.96.0 - 188.214.99.255 md +188.214.100.0 - 188.214.103.255 fr +188.214.104.0 - 188.214.111.255 ro +188.214.112.0 - 188.214.119.255 es +188.214.120.0 - 188.214.121.255 ir +188.214.122.0 - 188.214.127.255 ro +188.214.128.0 - 188.214.135.255 lt +188.214.136.0 - 188.214.143.255 ro +188.214.144.0 - 188.214.147.255 md +188.214.148.0 - 188.214.159.255 ro +188.214.160.0 - 188.214.191.255 ir +188.214.192.0 - 188.214.197.255 ro +188.214.198.0 - 188.214.198.255 gb +188.214.199.0 - 188.214.199.255 ro +188.214.200.0 - 188.214.207.255 md +188.214.208.0 - 188.214.215.255 ro +188.214.216.0 - 188.214.223.255 ir +188.214.224.0 - 188.214.225.255 es +188.214.226.0 - 188.214.227.255 ro +188.214.228.0 - 188.214.231.255 md +188.214.232.0 - 188.214.239.255 ir +188.214.240.0 - 188.214.243.255 es +188.214.244.0 - 188.215.17.255 ro +188.215.18.0 - 188.215.19.255 cz +188.215.20.0 - 188.215.20.255 nl +188.215.21.0 - 188.215.21.255 us +188.215.22.0 - 188.215.22.255 ro +188.215.23.0 - 188.215.23.255 fr +188.215.24.0 - 188.215.33.255 ro +188.215.34.0 - 188.215.34.255 th +188.215.35.0 - 188.215.55.255 ro +188.215.56.0 - 188.215.63.255 es +188.215.64.0 - 188.215.65.255 ro 188.215.66.0 - 188.215.67.255 md -188.215.68.0 - 188.215.255.255 ro +188.215.68.0 - 188.215.119.255 ro +188.215.120.0 - 188.215.127.255 ps +188.215.128.0 - 188.215.143.255 ir +188.215.144.0 - 188.215.159.255 ro +188.215.160.0 - 188.215.223.255 ir +188.215.224.0 - 188.215.229.255 ro +188.215.230.0 - 188.215.230.127 fr +188.215.230.128 - 188.215.230.255 ro +188.215.231.0 - 188.215.231.255 gr +188.215.232.0 - 188.215.235.255 ro +188.215.236.0 - 188.215.243.255 md +188.215.244.0 - 188.215.248.255 ro +188.215.249.0 - 188.215.249.255 md +188.215.250.0 - 188.215.251.255 ro +188.215.252.0 - 188.215.255.255 md 188.216.0.0 - 188.219.255.255 it 188.220.0.0 - 188.223.255.255 gb 188.224.0.0 - 188.224.127.255 fr 188.224.128.0 - 188.224.255.255 ro 188.225.0.0 - 188.225.127.255 ru -188.225.128.0 - 188.225.255.255 ps -188.226.0.0 - 188.227.127.255 ru +188.225.128.0 - 188.225.253.255 ps +188.225.254.0 - 188.225.254.255 il +188.225.255.0 - 188.225.255.255 ps +188.226.0.0 - 188.226.127.255 ru +188.226.128.0 - 188.226.255.255 nl +188.227.0.0 - 188.227.127.255 ru 188.227.128.0 - 188.227.159.255 cz 188.227.160.0 - 188.227.191.255 gb -188.227.192.0 - 188.227.199.255 gr 188.227.200.0 - 188.227.207.255 nl 188.227.208.0 - 188.227.223.255 az 188.227.224.0 - 188.227.231.255 hu @@ -84675,50 +73292,59 @@ 188.229.128.0 - 188.229.255.255 sy 188.230.0.0 - 188.230.127.255 ua 188.230.128.0 - 188.230.255.255 si -188.231.0.0 - 188.231.36.255 kw -188.231.37.0 - 188.231.37.31 om -188.231.37.32 - 188.231.38.15 kw -188.231.38.16 - 188.231.38.23 iq -188.231.38.24 - 188.231.38.31 sa -188.231.38.32 - 188.231.38.71 kw -188.231.38.72 - 188.231.38.79 iq -188.231.38.80 - 188.231.38.143 sa -188.231.38.144 - 188.231.38.151 sd -188.231.38.152 - 188.231.38.159 sa -188.231.38.160 - 188.231.39.159 kw -188.231.39.160 - 188.231.39.175 iq -188.231.39.176 - 188.231.92.15 kw -188.231.92.16 - 188.231.92.31 sa -188.231.92.32 - 188.231.92.255 kw -188.231.93.0 - 188.231.93.7 iq -188.231.93.8 - 188.231.93.23 sa -188.231.93.24 - 188.231.93.31 kw -188.231.93.32 - 188.231.93.63 sa -188.231.93.64 - 188.231.93.71 kw -188.231.93.72 - 188.231.93.79 sa -188.231.93.80 - 188.231.93.87 sd -188.231.93.88 - 188.231.94.255 kw -188.231.95.0 - 188.231.95.15 iq -188.231.95.16 - 188.231.99.255 kw -188.231.100.0 - 188.231.100.255 us -188.231.101.0 - 188.231.127.255 kw +188.231.0.0 - 188.231.33.255 kw +188.231.34.0 - 188.231.34.255 us +188.231.35.0 - 188.231.95.255 kw +188.231.96.0 - 188.231.115.255 gb +188.231.116.0 - 188.231.127.255 kw 188.231.128.0 - 188.231.255.255 ua 188.232.0.0 - 188.235.255.255 ru 188.236.0.0 - 188.236.255.255 kw 188.237.0.0 - 188.237.255.255 md 188.238.0.0 - 188.238.255.255 fi 188.239.0.0 - 188.239.255.255 ua -188.240.0.0 - 188.240.71.255 ro -188.240.72.0 - 188.240.75.255 md -188.240.76.0 - 188.240.87.255 ro -188.240.88.0 - 188.240.88.255 de -188.240.89.0 - 188.240.111.255 ro -188.240.112.0 - 188.240.127.255 md -188.240.128.0 - 188.240.233.255 ro -188.240.234.0 - 188.240.234.255 gb -188.240.235.0 - 188.241.38.255 ro -188.241.39.0 - 188.241.39.255 se -188.241.40.0 - 188.241.255.255 ro +188.240.0.0 - 188.240.23.255 ro +188.240.24.0 - 188.240.31.255 nl +188.240.32.0 - 188.240.35.255 ro +188.240.36.0 - 188.240.36.255 es +188.240.37.0 - 188.240.68.255 ro +188.240.69.0 - 188.240.69.255 it +188.240.70.0 - 188.240.70.255 md +188.240.71.0 - 188.240.95.255 ro +188.240.96.0 - 188.240.127.255 md +188.240.128.0 - 188.240.143.255 ro +188.240.144.0 - 188.240.159.255 se +188.240.160.0 - 188.240.191.255 gb +188.240.192.0 - 188.240.195.255 es +188.240.196.0 - 188.240.196.255 ir +188.240.197.0 - 188.240.203.255 ro +188.240.204.0 - 188.240.207.255 es +188.240.208.0 - 188.240.210.255 ro +188.240.211.0 - 188.240.211.127 cn +188.240.211.128 - 188.240.211.255 tw +188.240.212.0 - 188.240.212.255 ir +188.240.213.0 - 188.240.221.255 ro +188.240.222.0 - 188.240.223.255 se +188.240.224.0 - 188.240.235.255 ro +188.240.236.0 - 188.240.239.255 es +188.240.240.0 - 188.241.11.255 ro +188.241.12.0 - 188.241.12.255 gb +188.241.13.0 - 188.241.23.255 ro +188.241.24.0 - 188.241.31.255 pl +188.241.32.0 - 188.241.38.255 ro +188.241.39.0 - 188.241.39.255 bz +188.241.40.0 - 188.241.47.255 gb +188.241.48.0 - 188.241.64.255 ro +188.241.65.0 - 188.241.65.255 nl +188.241.66.0 - 188.241.67.255 ro +188.241.68.0 - 188.241.68.255 se +188.241.69.0 - 188.241.95.255 ro +188.241.96.0 - 188.241.103.255 es +188.241.104.0 - 188.241.159.255 ro +188.241.160.0 - 188.241.175.255 se +188.241.176.0 - 188.241.192.255 ro +188.241.193.0 - 188.241.193.255 nl +188.241.194.0 - 188.241.255.255 ro 188.242.0.0 - 188.244.15.255 ru 188.244.16.0 - 188.244.31.255 md 188.244.32.0 - 188.244.47.255 ru @@ -84735,17 +73361,22 @@ 188.246.96.0 - 188.246.127.255 cz 188.246.128.0 - 188.246.159.255 pl 188.246.160.0 - 188.246.191.255 ru -188.246.192.0 - 188.246.197.255 gb -188.246.198.0 - 188.246.198.15 ba -188.246.198.16 - 188.246.223.255 gb +188.246.192.0 - 188.246.223.255 gb 188.246.224.0 - 188.246.255.255 ru 188.247.0.0 - 188.247.31.255 sy 188.247.32.0 - 188.247.63.255 ru -188.247.64.0 - 188.247.95.255 jo +188.247.64.0 - 188.247.67.255 jo +188.247.68.0 - 188.247.68.255 us +188.247.69.0 - 188.247.92.41 jo +188.247.92.42 - 188.247.92.42 us +188.247.92.43 - 188.247.95.255 jo 188.247.96.0 - 188.247.127.255 ua -188.247.128.0 - 188.247.231.255 ro -188.247.232.0 - 188.247.232.255 sk -188.247.233.0 - 188.247.255.255 ro +188.247.128.0 - 188.247.135.255 ro +188.247.136.0 - 188.247.159.255 es +188.247.160.0 - 188.247.167.255 ro +188.247.168.0 - 188.247.175.255 es +188.247.176.0 - 188.247.223.255 kz +188.247.224.0 - 188.247.255.255 ro 188.248.0.0 - 188.249.255.255 sa 188.250.0.0 - 188.251.255.255 pt 188.252.0.0 - 188.252.127.255 pl @@ -84757,10 +73388,11 @@ 188.255.0.0 - 188.255.127.255 ru 188.255.128.0 - 188.255.255.255 rs 189.0.0.0 - 189.127.255.255 br -189.128.0.0 - 189.128.1.255 uy -189.128.2.0 - 189.128.2.255 mx -189.128.3.0 - 189.128.7.255 uy -189.128.8.0 - 189.255.255.255 mx +189.128.0.0 - 189.201.195.255 mx +189.201.196.0 - 189.201.223.255 br +189.201.224.0 - 189.201.231.255 mx +189.201.232.0 - 189.201.239.255 br +189.201.240.0 - 189.255.255.255 mx 190.0.0.0 - 190.0.63.255 co 190.0.64.0 - 190.0.95.255 do 190.0.96.0 - 190.0.127.255 ar @@ -84772,51 +73404,131 @@ 190.0.240.0 - 190.0.247.255 co 190.0.248.0 - 190.0.255.255 bo 190.1.0.0 - 190.1.63.255 ar -190.1.64.0 - 190.1.95.255 co +190.1.64.0 - 190.1.73.255 co +190.1.74.0 - 190.1.75.255 ve +190.1.76.0 - 190.1.95.255 co 190.1.96.0 - 190.1.127.255 ar 190.1.128.0 - 190.1.255.255 co 190.2.0.0 - 190.2.63.255 ar -190.2.64.0 - 190.2.79.255 py +190.2.72.0 - 190.2.79.255 br 190.2.80.0 - 190.2.87.255 ar 190.2.88.0 - 190.2.95.255 cl 190.2.96.0 - 190.2.127.255 ar -190.2.128.0 - 190.2.191.255 an +190.2.128.0 - 190.2.159.255 cw +190.2.160.0 - 190.2.171.255 aw +190.2.172.0 - 190.2.183.255 cw +190.2.184.0 - 190.2.184.255 co +190.2.185.0 - 190.2.191.255 cw 190.2.192.0 - 190.2.207.255 py -190.2.208.0 - 190.2.215.255 pa +190.2.208.0 - 190.2.209.255 cy +190.2.210.0 - 190.2.215.255 pa +190.2.216.0 - 190.2.223.255 cr 190.2.224.0 - 190.2.239.255 pa 190.2.240.0 - 190.3.159.255 ar 190.3.160.0 - 190.3.167.255 co 190.3.168.0 - 190.3.183.255 cl 190.3.184.0 - 190.3.191.255 bo 190.3.192.0 - 190.3.255.255 co -190.4.0.0 - 190.4.13.211 gt -190.4.13.212 - 190.4.13.215 hn -190.4.13.216 - 190.4.63.255 gt -190.4.64.0 - 190.4.79.255 an +190.4.0.0 - 190.4.0.127 hn +190.4.0.128 - 190.4.0.157 gt +190.4.0.158 - 190.4.0.158 hn +190.4.0.159 - 190.4.9.31 gt +190.4.9.32 - 190.4.9.39 hn +190.4.9.40 - 190.4.9.55 gt +190.4.9.56 - 190.4.9.63 hn +190.4.9.64 - 190.4.9.119 gt +190.4.9.120 - 190.4.9.127 hn +190.4.9.128 - 190.4.11.47 gt +190.4.11.48 - 190.4.11.63 hn +190.4.11.64 - 190.4.13.71 gt +190.4.13.72 - 190.4.13.79 hn +190.4.13.80 - 190.4.13.199 gt +190.4.13.200 - 190.4.13.207 hn +190.4.13.208 - 190.4.18.7 gt +190.4.18.8 - 190.4.18.15 hn +190.4.18.16 - 190.4.26.7 gt +190.4.26.8 - 190.4.26.15 hn +190.4.26.16 - 190.4.28.127 gt +190.4.28.128 - 190.4.28.191 hn +190.4.28.192 - 190.4.30.99 gt +190.4.30.100 - 190.4.30.103 hn +190.4.30.104 - 190.4.31.87 gt +190.4.31.88 - 190.4.31.95 hn +190.4.31.96 - 190.4.33.15 gt +190.4.33.16 - 190.4.33.23 hn +190.4.33.24 - 190.4.36.163 gt +190.4.36.164 - 190.4.36.167 hn +190.4.36.168 - 190.4.38.143 gt +190.4.38.144 - 190.4.38.151 hn +190.4.38.152 - 190.4.38.215 gt +190.4.38.216 - 190.4.38.223 hn +190.4.38.224 - 190.4.39.231 gt +190.4.39.232 - 190.4.39.235 hn +190.4.39.236 - 190.4.40.127 gt +190.4.40.128 - 190.4.40.255 hn +190.4.41.0 - 190.4.43.191 gt +190.4.43.192 - 190.4.43.207 hn +190.4.43.208 - 190.4.44.223 gt +190.4.44.224 - 190.4.44.231 hn +190.4.44.232 - 190.4.45.69 gt +190.4.45.70 - 190.4.45.70 hn +190.4.45.71 - 190.4.45.127 gt +190.4.45.128 - 190.4.45.131 hn +190.4.45.132 - 190.4.47.127 gt +190.4.47.128 - 190.4.47.255 hn +190.4.48.0 - 190.4.49.243 gt +190.4.49.244 - 190.4.49.247 hn +190.4.49.248 - 190.4.50.127 gt +190.4.50.128 - 190.4.50.255 hn +190.4.51.0 - 190.4.51.255 gt +190.4.52.0 - 190.4.52.255 hn +190.4.53.0 - 190.4.53.135 gt +190.4.53.136 - 190.4.53.143 hn +190.4.53.144 - 190.4.57.207 gt +190.4.57.208 - 190.4.57.211 hn +190.4.57.212 - 190.4.57.255 gt +190.4.58.0 - 190.4.58.255 hn +190.4.59.0 - 190.4.59.191 gt +190.4.59.192 - 190.4.59.255 hn +190.4.60.0 - 190.4.60.255 gt +190.4.61.0 - 190.4.61.127 hn +190.4.61.128 - 190.4.62.255 gt +190.4.63.0 - 190.4.63.255 hn +190.4.64.0 - 190.4.66.46 bq +190.4.66.47 - 190.4.66.47 cw +190.4.66.48 - 190.4.79.255 bq 190.4.80.0 - 190.4.87.255 cl 190.4.88.0 - 190.4.95.255 cr 190.4.96.0 - 190.4.111.255 cl 190.4.112.0 - 190.4.127.255 ar -190.4.128.0 - 190.4.191.255 an +190.4.128.0 - 190.4.191.255 cw 190.4.192.0 - 190.4.255.255 cl 190.5.0.0 - 190.5.31.255 ar 190.5.32.0 - 190.5.63.255 cl 190.5.64.0 - 190.5.127.255 hn 190.5.128.0 - 190.5.159.255 sv +190.5.160.0 - 190.5.191.255 ar 190.5.192.0 - 190.5.207.255 co +190.5.208.0 - 190.5.215.255 cr +190.5.216.0 - 190.5.223.255 ar 190.5.224.0 - 190.5.255.255 pa 190.6.0.0 - 190.6.63.255 ve 190.6.64.0 - 190.6.95.255 cu -190.6.96.0 - 190.6.127.255 ar +190.6.96.0 - 190.6.119.255 ar +190.6.120.0 - 190.6.127.255 cl 190.6.128.0 - 190.6.159.255 do 190.6.160.0 - 190.6.191.255 co 190.6.192.0 - 190.6.207.255 hn 190.6.208.0 - 190.6.223.255 ar 190.6.224.0 - 190.6.239.255 tt -190.6.240.0 - 190.7.63.255 ar -190.7.64.0 - 190.7.159.255 co +190.6.240.0 - 190.7.28.215 ar +190.7.28.216 - 190.7.28.223 de +190.7.28.224 - 190.7.63.255 ar +190.7.64.0 - 190.7.87.107 co +190.7.87.108 - 190.7.87.111 pe +190.7.87.112 - 190.7.159.255 co 190.7.160.0 - 190.7.175.255 cr -190.7.176.0 - 190.7.191.255 ar +190.7.176.0 - 190.7.191.255 br 190.7.192.0 - 190.7.223.255 cr 190.7.224.0 - 190.8.31.255 ar 190.8.32.0 - 190.8.47.255 do @@ -84824,15 +73536,26 @@ 190.8.64.0 - 190.8.127.255 cl 190.8.128.0 - 190.8.159.255 pe 190.8.160.0 - 190.8.163.255 pa -190.8.164.0 - 190.8.167.255 ve +190.8.164.0 - 190.8.169.255 ve +190.8.170.0 - 190.8.170.255 us +190.8.171.0 - 190.8.171.255 ve +190.8.172.0 - 190.8.175.255 pe 190.8.176.0 - 190.8.179.255 co 190.8.180.0 - 190.8.183.255 ec 190.8.184.0 - 190.8.191.255 ar -190.8.192.0 - 190.8.255.255 co +190.8.192.0 - 190.8.207.255 co +190.8.208.0 - 190.8.208.127 cl +190.8.208.128 - 190.8.255.255 co 190.9.0.0 - 190.9.31.255 ar -190.9.32.0 - 190.9.33.127 ve +190.9.32.0 - 190.9.33.127 mx 190.9.33.128 - 190.9.33.255 co -190.9.34.0 - 190.9.47.255 ve +190.9.34.0 - 190.9.34.255 mx +190.9.35.0 - 190.9.35.255 pa +190.9.36.0 - 190.9.36.255 mx +190.9.37.0 - 190.9.38.127 pa +190.9.38.128 - 190.9.38.255 mx +190.9.39.0 - 190.9.39.255 br +190.9.40.0 - 190.9.47.255 mx 190.9.48.0 - 190.9.55.255 pa 190.9.56.0 - 190.9.63.255 cl 190.9.64.0 - 190.9.127.255 co @@ -84850,52 +73573,54 @@ 190.12.64.0 - 190.12.95.255 pe 190.12.96.0 - 190.12.127.255 ar 190.12.128.0 - 190.12.159.255 co -190.12.160.0 - 190.12.203.255 ar -190.12.204.0 - 190.12.205.255 us -190.12.206.0 - 190.12.217.255 ar -190.12.218.0 - 190.12.218.255 us -190.12.219.0 - 190.12.229.255 ar -190.12.230.0 - 190.12.230.255 us -190.12.231.0 - 190.12.232.255 ar -190.12.233.0 - 190.12.233.255 us -190.12.234.0 - 190.12.255.255 ar +190.12.160.0 - 190.12.209.127 ar +190.12.209.128 - 190.12.209.255 us +190.12.210.0 - 190.12.213.127 ar +190.12.213.128 - 190.12.213.255 us +190.12.214.0 - 190.12.218.127 ar +190.12.218.128 - 190.12.218.255 us +190.12.219.0 - 190.12.228.255 ar +190.12.229.0 - 190.12.229.127 us +190.12.229.128 - 190.12.232.255 ar +190.12.233.0 - 190.12.233.127 us +190.12.233.128 - 190.12.235.127 ar +190.12.235.128 - 190.12.235.255 us +190.12.236.0 - 190.12.237.127 ar +190.12.237.128 - 190.12.237.255 us +190.12.238.0 - 190.12.255.255 ar 190.13.0.0 - 190.13.63.255 co 190.13.64.0 - 190.13.79.255 cl -190.13.80.0 - 190.13.87.255 pa +190.13.80.0 - 190.13.81.255 cy +190.13.82.0 - 190.13.87.255 pa 190.13.88.0 - 190.13.95.255 ar 190.13.96.0 - 190.13.111.255 co 190.13.112.0 - 190.13.115.255 ar 190.13.116.0 - 190.13.119.255 cl -190.13.120.0 - 190.13.127.255 an +190.13.120.0 - 190.13.127.255 cw 190.13.128.0 - 190.13.191.255 cl 190.13.192.0 - 190.13.207.255 co 190.13.208.0 - 190.14.35.255 ar 190.14.36.0 - 190.14.39.255 pa 190.14.40.0 - 190.14.47.255 ar 190.14.48.0 - 190.14.63.255 cl -190.14.64.0 - 190.14.68.255 ar -190.14.69.0 - 190.14.69.255 cl -190.14.70.0 - 190.14.80.255 ar -190.14.81.0 - 190.14.81.255 cl -190.14.82.0 - 190.14.83.255 ar -190.14.84.0 - 190.14.84.255 cl -190.14.85.0 - 190.14.91.255 ar -190.14.92.0 - 190.14.92.255 cl -190.14.93.0 - 190.14.127.255 ar +190.14.64.0 - 190.14.127.255 bo 190.14.128.0 - 190.14.143.255 gt 190.14.144.0 - 190.14.151.255 ar 190.14.152.0 - 190.14.155.255 cr 190.14.156.0 - 190.14.191.255 ar 190.14.192.0 - 190.14.223.255 pa 190.14.224.0 - 190.15.31.255 co +190.15.32.0 - 190.15.63.255 br 190.15.64.0 - 190.15.79.255 hn -190.15.80.0 - 190.15.127.255 ar +190.15.80.0 - 190.15.95.255 ar +190.15.96.0 - 190.15.111.255 br +190.15.112.0 - 190.15.127.255 ar 190.15.128.0 - 190.15.143.255 ec 190.15.144.0 - 190.15.159.255 cu 190.15.160.0 - 190.15.191.255 ve 190.15.192.0 - 190.19.255.255 ar 190.20.0.0 - 190.22.255.255 cl -190.23.0.0 - 190.23.127.255 py +190.23.0.0 - 190.23.255.255 py 190.24.0.0 - 190.29.255.255 co 190.30.0.0 - 190.31.255.255 ar 190.32.0.0 - 190.35.255.255 pa @@ -84908,48 +73633,121 @@ 190.52.48.0 - 190.52.55.255 bo 190.52.56.0 - 190.52.63.255 ar 190.52.64.0 - 190.52.79.255 ec -190.52.96.0 - 190.52.111.255 co -190.52.112.0 - 190.52.127.255 pe +190.52.80.0 - 190.52.95.255 ar +190.52.96.0 - 190.52.111.255 ve +190.52.112.0 - 190.52.115.255 pe +190.52.116.0 - 190.52.116.31 mx +190.52.116.32 - 190.52.117.95 pe +190.52.117.96 - 190.52.117.127 co +190.52.117.128 - 190.52.117.255 pe +190.52.118.0 - 190.52.125.255 mx +190.52.126.0 - 190.52.127.255 pe 190.52.128.0 - 190.52.191.255 py 190.52.192.0 - 190.52.207.255 ec +190.52.208.0 - 190.52.223.255 ar 190.52.224.0 - 190.52.255.255 do -190.53.0.0 - 190.53.34.255 sv -190.53.35.0 - 190.53.39.255 ni -190.53.40.0 - 190.53.47.255 sv +190.53.0.0 - 190.53.31.255 sv +190.53.32.0 - 190.53.43.255 ni +190.53.44.0 - 190.53.45.255 sv +190.53.46.0 - 190.53.47.255 ni 190.53.48.0 - 190.53.95.255 hn 190.53.96.0 - 190.53.191.255 sv -190.53.192.0 - 190.53.207.255 hn -190.53.208.0 - 190.53.255.255 sv +190.53.192.0 - 190.53.255.255 hn 190.54.0.0 - 190.54.255.255 cl 190.55.0.0 - 190.55.255.255 ar 190.56.0.0 - 190.56.255.255 gt -190.57.0.0 - 190.57.79.255 sv -190.57.80.0 - 190.57.109.255 gt -190.57.110.0 - 190.57.111.255 sv -190.57.112.0 - 190.57.113.255 gt -190.57.114.0 - 190.57.115.255 sv -190.57.116.0 - 190.57.123.255 gt -190.57.124.0 - 190.57.127.255 sv +190.57.0.0 - 190.57.127.255 sv 190.57.128.0 - 190.57.191.255 ec 190.57.192.0 - 190.57.255.255 ar 190.58.0.0 - 190.59.255.255 tt -190.60.0.0 - 190.60.19.255 mx -190.60.20.0 - 190.60.21.255 co -190.60.22.0 - 190.60.22.255 mx -190.60.23.0 - 190.60.31.255 co +190.60.0.0 - 190.60.1.63 co +190.60.1.64 - 190.60.1.127 pr +190.60.1.128 - 190.60.15.255 co +190.60.16.0 - 190.60.16.31 mx +190.60.16.32 - 190.60.17.255 co +190.60.18.0 - 190.60.19.255 cl +190.60.20.0 - 190.60.28.255 co +190.60.29.0 - 190.60.30.255 pe +190.60.31.0 - 190.60.31.255 co 190.60.32.0 - 190.60.63.255 ve -190.60.64.0 - 190.60.127.255 co -190.60.128.0 - 190.60.133.255 ar -190.60.134.0 - 190.60.136.79 co -190.60.136.80 - 190.60.136.87 ar -190.60.136.88 - 190.60.136.255 co -190.60.137.0 - 190.60.137.255 ar -190.60.138.0 - 190.60.138.255 co -190.60.139.0 - 190.60.139.255 ar -190.60.140.0 - 190.61.12.255 co -190.61.13.0 - 190.61.13.255 ar -190.61.14.0 - 190.61.255.255 co +190.60.64.0 - 190.60.65.63 cl +190.60.65.64 - 190.60.65.95 ve +190.60.65.96 - 190.60.127.255 cl +190.60.128.0 - 190.60.134.255 co +190.60.135.0 - 190.60.135.255 ar +190.60.136.0 - 190.60.173.255 co +190.60.174.0 - 190.60.174.191 ar +190.60.174.192 - 190.60.175.255 co +190.60.176.0 - 190.60.181.255 us +190.60.182.0 - 190.60.183.255 co +190.60.184.0 - 190.60.190.255 us +190.60.191.0 - 190.61.0.255 co +190.61.1.0 - 190.61.1.255 py +190.61.2.0 - 190.61.4.255 co +190.61.5.0 - 190.61.5.255 ar +190.61.6.0 - 190.61.7.255 co +190.61.8.0 - 190.61.15.255 cl +190.61.16.0 - 190.61.17.255 co +190.61.18.0 - 190.61.31.255 cl +190.61.32.0 - 190.61.35.255 us +190.61.36.0 - 190.61.36.255 ar +190.61.37.0 - 190.61.38.255 us +190.61.39.0 - 190.61.39.255 ar +190.61.40.0 - 190.61.46.255 us +190.61.47.0 - 190.61.48.255 ar +190.61.49.0 - 190.61.49.255 us +190.61.50.0 - 190.61.52.255 ar +190.61.53.0 - 190.61.53.255 us +190.61.54.0 - 190.61.55.255 ar +190.61.56.0 - 190.61.63.255 us +190.61.64.0 - 190.61.65.255 ar +190.61.66.0 - 190.61.66.255 us +190.61.67.0 - 190.61.71.255 ar +190.61.72.0 - 190.61.77.255 co +190.61.78.0 - 190.61.95.255 us +190.61.96.0 - 190.61.105.255 cl +190.61.106.0 - 190.61.106.255 us +190.61.107.0 - 190.61.107.255 co +190.61.108.0 - 190.61.127.255 us +190.61.128.0 - 190.61.131.255 cl +190.61.132.0 - 190.61.139.255 us +190.61.140.0 - 190.61.140.255 co +190.61.141.0 - 190.61.142.255 us +190.61.143.0 - 190.61.143.255 co +190.61.144.0 - 190.61.147.255 us +190.61.148.0 - 190.61.151.255 co +190.61.152.0 - 190.61.199.255 cl +190.61.200.0 - 190.61.209.255 ar +190.61.210.0 - 190.61.219.255 cl +190.61.220.0 - 190.61.220.255 ar +190.61.221.0 - 190.61.221.255 cl +190.61.222.0 - 190.61.222.255 co +190.61.223.0 - 190.61.223.255 cl +190.61.224.0 - 190.61.224.255 ar +190.61.225.0 - 190.61.225.255 cl +190.61.226.0 - 190.61.226.255 ar +190.61.227.0 - 190.61.227.255 cl +190.61.228.0 - 190.61.228.255 ar +190.61.229.0 - 190.61.230.255 co +190.61.231.0 - 190.61.231.255 cl +190.61.232.0 - 190.61.236.255 co +190.61.237.0 - 190.61.237.255 cl +190.61.238.0 - 190.61.238.255 co +190.61.239.0 - 190.61.240.255 cl +190.61.241.0 - 190.61.241.255 ar +190.61.242.0 - 190.61.242.255 cl +190.61.243.0 - 190.61.243.255 ar +190.61.244.0 - 190.61.244.255 cl +190.61.245.0 - 190.61.245.255 co +190.61.246.0 - 190.61.246.255 ar +190.61.247.0 - 190.61.247.255 co +190.61.248.0 - 190.61.248.255 cl +190.61.249.0 - 190.61.249.255 ar +190.61.250.0 - 190.61.255.63 co +190.61.255.64 - 190.61.255.127 us +190.61.255.128 - 190.61.255.255 co 190.62.0.0 - 190.62.255.255 sv +190.63.0.0 - 190.63.255.255 ec 190.64.0.0 - 190.64.255.255 uy 190.65.0.0 - 190.71.255.255 co 190.72.0.0 - 190.79.255.255 ve @@ -84957,15 +73755,105 @@ 190.80.128.0 - 190.80.255.255 do 190.81.0.0 - 190.81.255.255 pe 190.82.0.0 - 190.82.255.255 cl -190.83.0.0 - 190.83.127.255 co 190.83.128.0 - 190.83.255.255 tt 190.84.0.0 - 190.85.255.255 co 190.86.0.0 - 190.87.255.255 sv -190.88.0.0 - 190.89.255.255 an -190.90.0.0 - 190.90.255.255 co +190.88.0.0 - 190.89.255.255 cw +190.90.0.0 - 190.90.14.223 co +190.90.14.224 - 190.90.14.231 us +190.90.14.232 - 190.90.23.143 co +190.90.23.144 - 190.90.23.159 pe +190.90.23.160 - 190.90.38.255 co +190.90.39.0 - 190.90.39.255 ec +190.90.40.0 - 190.90.51.255 co +190.90.52.0 - 190.90.53.255 ec +190.90.54.0 - 190.90.78.255 co +190.90.79.0 - 190.90.79.255 ec +190.90.80.0 - 190.90.89.255 co +190.90.90.0 - 190.90.90.255 ec +190.90.91.0 - 190.90.101.255 co +190.90.102.0 - 190.90.102.255 ec +190.90.103.0 - 190.90.118.255 co +190.90.119.0 - 190.90.120.255 ec +190.90.121.0 - 190.90.136.255 co +190.90.137.0 - 190.90.141.255 ec +190.90.142.0 - 190.90.143.255 co +190.90.144.0 - 190.90.144.255 ec +190.90.145.0 - 190.90.145.255 co +190.90.146.0 - 190.90.147.255 ec +190.90.148.0 - 190.90.186.255 co +190.90.187.0 - 190.90.187.255 ec +190.90.188.0 - 190.90.204.255 co +190.90.205.0 - 190.90.205.255 ec +190.90.206.0 - 190.90.206.255 co +190.90.207.0 - 190.90.211.255 ec +190.90.212.0 - 190.90.213.255 co +190.90.214.0 - 190.90.215.255 ec +190.90.216.0 - 190.90.219.255 co +190.90.220.0 - 190.90.220.255 ec +190.90.221.0 - 190.90.221.255 co +190.90.222.0 - 190.90.223.255 us +190.90.224.0 - 190.90.232.255 co +190.90.233.0 - 190.90.235.255 ec +190.90.236.0 - 190.90.240.255 co +190.90.241.0 - 190.90.241.255 ec +190.90.242.0 - 190.90.254.255 co +190.90.255.0 - 190.90.255.255 ec 190.91.0.0 - 190.91.255.255 cl -190.92.0.0 - 190.92.127.255 hn -190.92.128.0 - 190.92.255.255 ar +190.92.0.0 - 190.92.87.127 hn +190.92.87.128 - 190.92.87.255 gt +190.92.88.0 - 190.92.95.255 hn +190.92.96.0 - 190.92.111.255 ar +190.92.112.0 - 190.92.127.255 cu +190.92.128.0 - 190.92.135.255 ar +190.92.136.0 - 190.92.138.255 us +190.92.139.0 - 190.92.139.255 ar +190.92.140.0 - 190.92.142.255 us +190.92.143.0 - 190.92.143.255 ar +190.92.144.0 - 190.92.150.255 us +190.92.151.0 - 190.92.151.255 ar +190.92.152.0 - 190.92.163.255 us +190.92.164.0 - 190.92.164.255 ar +190.92.165.0 - 190.92.165.255 us +190.92.166.0 - 190.92.167.127 ar +190.92.167.128 - 190.92.167.255 us +190.92.168.0 - 190.92.169.127 ar +190.92.169.128 - 190.92.170.255 us +190.92.171.0 - 190.92.172.255 ar +190.92.173.0 - 190.92.175.255 us +190.92.176.0 - 190.92.179.255 ar +190.92.180.0 - 190.92.180.255 us +190.92.181.0 - 190.92.181.63 ar +190.92.181.64 - 190.92.181.127 us +190.92.181.128 - 190.92.181.191 ar +190.92.181.192 - 190.92.187.255 us +190.92.188.0 - 190.92.189.127 ar +190.92.189.128 - 190.92.194.255 us +190.92.195.0 - 190.92.195.255 ar +190.92.196.0 - 190.92.196.255 us +190.92.197.0 - 190.92.197.255 ar +190.92.198.0 - 190.92.199.255 us +190.92.200.0 - 190.92.200.255 ar +190.92.201.0 - 190.92.205.127 us +190.92.205.128 - 190.92.205.255 ar +190.92.206.0 - 190.92.206.255 us +190.92.207.0 - 190.92.207.127 ar +190.92.207.128 - 190.92.207.255 us +190.92.208.0 - 190.92.209.255 ar +190.92.210.0 - 190.92.210.255 us +190.92.211.0 - 190.92.211.255 ar +190.92.212.0 - 190.92.212.127 us +190.92.212.128 - 190.92.213.127 ar +190.92.213.128 - 190.92.215.127 us +190.92.215.128 - 190.92.215.255 ar +190.92.216.0 - 190.92.216.127 us +190.92.216.128 - 190.92.218.255 ar +190.92.219.0 - 190.92.219.127 us +190.92.219.128 - 190.92.220.127 ar +190.92.220.128 - 190.92.220.255 us +190.92.221.0 - 190.92.221.127 ar +190.92.221.128 - 190.92.221.255 us +190.92.222.0 - 190.92.255.255 ar 190.93.0.0 - 190.93.31.255 tt 190.93.32.0 - 190.93.35.255 pa 190.93.36.0 - 190.93.39.255 gy @@ -84974,10 +73862,15 @@ 190.93.48.0 - 190.93.63.255 ar 190.93.64.0 - 190.93.127.255 tt 190.93.128.0 - 190.93.159.255 co -190.93.160.0 - 190.93.175.255 cr +190.93.160.0 - 190.93.167.255 cr +190.93.168.0 - 190.93.170.255 us +190.93.171.0 - 190.93.175.255 cr 190.93.176.0 - 190.93.191.255 py 190.93.192.0 - 190.93.223.255 ar 190.93.224.0 - 190.93.239.255 cl +190.93.240.0 - 190.93.243.255 cr +190.93.244.0 - 190.93.245.255 us +190.93.246.0 - 190.93.255.255 cr 190.94.0.0 - 190.94.127.255 do 190.94.128.0 - 190.94.159.255 ec 190.94.160.0 - 190.94.191.255 ar @@ -84985,57 +73878,93 @@ 190.95.0.0 - 190.95.127.255 cl 190.95.128.0 - 190.95.255.255 ec 190.96.0.0 - 190.96.95.255 cl -190.96.96.0 - 190.96.103.255 ec +190.96.96.0 - 190.96.111.255 ec 190.96.112.0 - 190.96.127.255 ar 190.96.128.0 - 190.96.255.255 co 190.97.0.0 - 190.97.63.255 ar 190.97.64.0 - 190.97.95.255 co 190.97.96.0 - 190.97.111.255 tt -190.97.112.0 - 190.97.119.255 an +190.97.112.0 - 190.97.119.255 bq +190.97.120.0 - 190.97.127.255 ar 190.97.128.0 - 190.97.159.255 co 190.97.160.0 - 190.97.167.255 pa +190.97.168.0 - 190.97.171.255 cl 190.97.176.0 - 190.97.191.255 hn 190.97.192.0 - 190.97.223.255 co +190.97.224.0 - 190.97.255.255 ve 190.98.0.0 - 190.98.127.255 sr -190.98.128.0 - 190.98.131.255 gt -190.98.132.0 - 190.98.135.255 ar -190.98.136.0 - 190.98.136.255 pe -190.98.137.0 - 190.98.143.255 ar +190.98.128.0 - 190.98.128.255 gt +190.98.129.0 - 190.98.129.255 nl +190.98.130.0 - 190.98.130.63 gt +190.98.130.64 - 190.98.130.127 pe +190.98.130.128 - 190.98.130.255 gt +190.98.131.0 - 190.98.131.255 br +190.98.132.0 - 190.98.135.255 pe +190.98.136.0 - 190.98.139.255 ni +190.98.140.0 - 190.98.140.255 ar +190.98.141.0 - 190.98.141.7 br +190.98.141.8 - 190.98.141.255 ar +190.98.142.0 - 190.98.142.127 br +190.98.142.128 - 190.98.142.255 co +190.98.143.0 - 190.98.143.255 ar 190.98.144.0 - 190.98.159.255 br -190.98.160.0 - 190.98.191.255 ar +190.98.160.0 - 190.98.163.255 ar +190.98.164.0 - 190.98.165.255 gt +190.98.166.0 - 190.98.166.255 br +190.98.167.0 - 190.98.167.255 gt +190.98.168.0 - 190.98.169.255 br +190.98.170.0 - 190.98.181.255 ar +190.98.182.0 - 190.98.191.255 cr 190.98.192.0 - 190.98.255.255 cl -190.99.0.0 - 190.99.15.255 ni -190.99.16.0 - 190.99.63.255 gt +190.99.0.0 - 190.99.23.255 hn +190.99.24.0 - 190.99.63.255 sv 190.99.64.0 - 190.99.71.255 ar 190.99.72.0 - 190.99.79.255 ec 190.99.80.0 - 190.99.87.255 ar 190.99.88.0 - 190.99.91.255 cl 190.99.92.0 - 190.99.95.255 bo 190.99.96.0 - 190.99.111.255 uy +190.99.112.0 - 190.99.115.255 ar +190.99.116.0 - 190.99.119.255 gt +190.99.120.0 - 190.99.127.255 cr 190.99.128.0 - 190.99.255.255 co 190.100.0.0 - 190.101.255.255 cl -190.102.0.0 - 190.102.31.255 an +190.102.0.0 - 190.102.31.255 sx 190.102.32.0 - 190.102.47.255 cr 190.102.48.0 - 190.102.55.255 bo 190.102.56.0 - 190.102.63.255 pa 190.102.64.0 - 190.102.95.255 ht +190.102.96.0 - 190.102.127.255 us 190.102.128.0 - 190.102.159.255 pe -190.102.192.0 - 190.102.223.255 co +190.102.160.0 - 190.102.223.255 co 190.102.224.0 - 190.102.255.255 cl -190.103.0.0 - 190.103.15.255 ar -190.103.32.0 - 190.103.63.255 ve +190.103.0.0 - 190.103.27.255 ar +190.103.28.0 - 190.103.63.255 ve 190.103.64.0 - 190.103.79.255 bo -190.103.96.0 - 190.103.127.255 co +190.103.80.0 - 190.103.95.255 ar +190.103.96.0 - 190.103.109.23 co +190.103.109.24 - 190.103.109.31 pe +190.103.109.32 - 190.103.127.255 co 190.103.128.0 - 190.103.143.255 ar -190.103.172.0 - 190.103.179.255 ar -190.103.188.0 - 190.103.191.255 cr +190.103.144.0 - 190.103.159.255 cl +190.103.160.0 - 190.103.175.255 br +190.103.176.0 - 190.103.179.255 ar +190.103.180.0 - 190.103.183.255 do +190.103.184.0 - 190.103.187.255 us +190.103.188.0 - 190.103.188.255 ca +190.103.189.0 - 190.103.189.255 cr +190.103.190.0 - 190.103.190.255 us +190.103.191.0 - 190.103.191.255 cr 190.103.192.0 - 190.103.255.255 ar 190.104.0.0 - 190.104.31.255 bo -190.104.64.0 - 190.104.79.255 ar +190.104.32.0 - 190.104.95.255 ar 190.104.96.0 - 190.104.111.255 aw +190.104.112.0 - 190.104.127.255 gt 190.104.128.0 - 190.104.191.255 py -190.105.0.0 - 190.105.127.255 ar -190.105.128.0 - 190.105.143.255 hn +190.104.192.0 - 190.105.127.255 ar +190.105.128.0 - 190.105.133.255 hn +190.105.134.0 - 190.105.134.255 us +190.105.135.0 - 190.105.143.255 hn 190.105.144.0 - 190.105.151.255 ar 190.105.152.0 - 190.105.155.255 pa 190.105.156.0 - 190.105.159.255 gy @@ -85043,77 +73972,189 @@ 190.105.168.0 - 190.105.171.255 pa 190.105.172.0 - 190.105.175.255 ht 190.105.176.0 - 190.105.191.255 ar -190.105.192.0 - 190.105.195.255 an -190.105.196.0 - 190.105.207.255 ar -190.105.224.0 - 190.105.239.255 ar +190.105.192.0 - 190.105.195.255 cw +190.105.196.0 - 190.105.228.255 ar +190.105.229.0 - 190.105.229.255 co +190.105.230.0 - 190.105.238.255 ar +190.105.239.0 - 190.105.239.255 cl 190.105.240.0 - 190.105.255.255 pe 190.106.0.0 - 190.106.31.255 ni +190.106.32.0 - 190.106.47.255 ar +190.106.48.0 - 190.106.63.255 ni 190.106.64.0 - 190.106.79.255 cr +190.106.80.0 - 190.106.87.255 ar +190.106.88.0 - 190.106.95.255 bz 190.106.96.0 - 190.106.111.255 ar -190.106.128.0 - 190.106.138.255 ar -190.106.139.0 - 190.106.139.255 us -190.106.140.0 - 190.106.176.255 ar -190.106.177.0 - 190.106.177.255 us -190.106.178.0 - 190.106.187.255 ar +190.106.112.0 - 190.106.119.255 do +190.106.120.0 - 190.106.133.255 ar +190.106.134.0 - 190.106.134.255 mx +190.106.135.0 - 190.106.135.255 ar +190.106.136.0 - 190.106.143.255 mx +190.106.144.0 - 190.106.163.255 ar +190.106.164.0 - 190.106.165.255 us +190.106.166.0 - 190.106.168.255 ar +190.106.169.0 - 190.106.169.255 us +190.106.170.0 - 190.106.171.255 ar +190.106.172.0 - 190.106.173.255 us +190.106.174.0 - 190.106.176.255 ar +190.106.177.0 - 190.106.181.255 us +190.106.182.0 - 190.106.183.255 ar +190.106.184.0 - 190.106.184.255 us +190.106.185.0 - 190.106.185.255 ar +190.106.186.0 - 190.106.186.255 us +190.106.187.0 - 190.106.187.255 ar 190.106.188.0 - 190.106.188.255 us 190.106.189.0 - 190.106.191.255 ar +190.106.192.0 - 190.106.223.255 gt +190.106.224.0 - 190.106.239.255 pa +190.106.240.0 - 190.106.255.255 bo 190.107.0.0 - 190.107.15.255 cu +190.107.16.0 - 190.107.31.255 co 190.107.32.0 - 190.107.63.255 bo -190.107.64.0 - 190.107.79.255 ec +190.107.64.0 - 190.107.87.255 ec +190.107.88.0 - 190.107.94.255 cr +190.107.95.0 - 190.107.95.255 us 190.107.96.0 - 190.107.127.255 ar 190.107.128.0 - 190.107.159.255 hn 190.107.160.0 - 190.107.175.255 pa +190.107.176.0 - 190.107.179.255 cl +190.107.180.0 - 190.107.183.255 pe +190.107.184.0 - 190.107.191.255 ar +190.107.192.0 - 190.107.207.255 br +190.107.208.0 - 190.107.211.255 ni +190.107.212.0 - 190.107.223.255 ar 190.107.224.0 - 190.107.231.255 cl 190.107.232.0 - 190.107.239.255 ec 190.107.240.0 - 190.107.247.255 ar -190.107.248.0 - 190.107.255.255 an +190.107.248.0 - 190.107.255.255 bq 190.108.0.0 - 190.108.31.255 uy +190.108.32.0 - 190.108.63.255 ar 190.108.64.0 - 190.108.71.255 ec 190.108.72.0 - 190.108.75.255 cr -190.108.80.0 - 190.108.87.255 pe +190.108.76.0 - 190.108.79.255 ar +190.108.80.0 - 190.108.95.255 pe +190.108.96.0 - 190.108.127.255 br 190.108.128.0 - 190.108.191.255 cl 190.108.192.0 - 190.108.195.255 ar -190.108.196.0 - 190.108.207.255 gy +190.108.196.0 - 190.108.215.255 gy +190.108.216.0 - 190.108.219.255 ar +190.108.220.0 - 190.108.223.255 cr 190.108.224.0 - 190.108.255.255 ar -190.109.16.0 - 190.109.31.255 ar -190.109.64.0 - 190.109.95.255 pa -190.109.128.0 - 190.109.191.255 co +190.109.0.0 - 190.109.15.255 pa +190.109.16.0 - 190.109.63.255 ar +190.109.64.0 - 190.109.87.255 br +190.109.88.0 - 190.109.91.255 pa +190.109.92.0 - 190.109.95.255 mx +190.109.96.0 - 190.109.191.255 co 190.109.192.0 - 190.109.223.255 hn +190.109.224.0 - 190.109.255.255 bo 190.110.0.0 - 190.110.63.255 do 190.110.64.0 - 190.110.95.255 co -190.110.128.0 - 190.110.175.255 cl +190.110.96.0 - 190.110.111.255 cl +190.110.112.0 - 190.110.119.255 ar +190.110.120.0 - 190.110.175.255 cl 190.110.176.0 - 190.110.191.255 ar 190.110.192.0 - 190.110.223.255 ec 190.110.224.0 - 190.110.255.255 ar -190.111.0.0 - 190.111.31.255 gt +190.111.0.0 - 190.111.29.255 gt +190.111.30.0 - 190.111.30.127 ni +190.111.30.128 - 190.111.31.255 gt +190.111.32.0 - 190.111.55.255 ar +190.111.56.0 - 190.111.57.255 us +190.111.58.0 - 190.111.59.255 ar +190.111.60.0 - 190.111.60.255 us +190.111.61.0 - 190.111.61.255 ar +190.111.62.0 - 190.111.63.255 us 190.111.64.0 - 190.111.95.255 ec 190.111.96.0 - 190.111.111.255 pa 190.111.112.0 - 190.111.119.255 ar 190.111.120.0 - 190.111.123.255 ve 190.111.124.0 - 190.111.127.255 ar -190.111.128.0 - 190.111.191.255 pa +190.111.128.0 - 190.111.128.255 pa +190.111.129.0 - 190.111.129.127 cw +190.111.129.128 - 190.111.145.255 pa +190.111.146.0 - 190.111.146.127 us +190.111.146.128 - 190.111.150.255 pa +190.111.151.0 - 190.111.151.127 us +190.111.151.128 - 190.111.153.127 pa +190.111.153.128 - 190.111.153.255 gb +190.111.154.0 - 190.111.155.255 pa +190.111.156.0 - 190.111.156.127 us +190.111.156.128 - 190.111.191.255 pa 190.111.192.0 - 190.112.47.255 ar 190.112.48.0 - 190.112.51.255 cl 190.112.52.0 - 190.112.55.255 uy 190.112.56.0 - 190.112.127.255 ar -190.112.128.0 - 190.112.191.255 co -190.112.192.0 - 190.112.207.255 uy -190.112.224.0 - 190.112.255.255 an +190.112.128.0 - 190.112.175.255 co +190.112.176.0 - 190.112.191.255 ar +190.112.192.0 - 190.112.195.255 us +190.112.196.0 - 190.112.199.255 ar +190.112.200.0 - 190.112.201.255 us +190.112.202.0 - 190.112.202.255 uy +190.112.203.0 - 190.112.203.255 us +190.112.204.0 - 190.112.207.255 br +190.112.208.0 - 190.112.215.255 py +190.112.216.0 - 190.112.219.255 ar +190.112.220.0 - 190.112.223.255 cr +190.112.224.0 - 190.112.255.255 cw 190.113.0.0 - 190.113.31.255 cl -190.113.64.0 - 190.113.79.255 ar +190.113.32.0 - 190.113.32.255 cr +190.113.33.0 - 190.113.37.255 ni +190.113.38.0 - 190.113.41.255 cr +190.113.42.0 - 190.113.42.255 ni +190.113.43.0 - 190.113.44.255 cr +190.113.45.0 - 190.113.46.255 ni +190.113.47.0 - 190.113.47.255 cr +190.113.48.0 - 190.113.51.255 ni +190.113.52.0 - 190.113.53.255 cr +190.113.54.0 - 190.113.54.255 ni +190.113.55.0 - 190.113.56.255 cr +190.113.57.0 - 190.113.57.255 ni +190.113.58.0 - 190.113.60.255 cr +190.113.61.0 - 190.113.61.255 ni +190.113.62.0 - 190.113.62.255 cr +190.113.63.0 - 190.113.63.255 ni +190.113.64.0 - 190.113.79.255 do +190.113.80.0 - 190.113.87.255 cr +190.113.88.0 - 190.113.91.255 gt +190.113.92.0 - 190.113.95.255 py 190.113.96.0 - 190.113.127.255 cr 190.113.128.0 - 190.113.191.255 ar 190.113.192.0 - 190.113.223.255 pe -190.114.0.0 - 190.114.31.255 ve -190.114.64.0 - 190.114.159.255 ar -190.114.192.0 - 190.114.223.255 ar +190.113.224.0 - 190.113.239.255 ar +190.113.240.0 - 190.113.243.255 do +190.113.244.0 - 190.113.247.255 cl +190.113.248.0 - 190.113.255.255 cr +190.114.0.0 - 190.114.0.255 mx +190.114.1.0 - 190.114.1.255 pa +190.114.2.0 - 190.114.2.255 ve +190.114.3.0 - 190.114.31.255 pa +190.114.32.0 - 190.114.63.255 cl +190.114.64.0 - 190.114.223.255 ar 190.114.224.0 - 190.114.231.255 py +190.114.232.0 - 190.114.239.255 ar 190.114.240.0 - 190.114.247.255 ve -190.115.0.0 - 190.115.15.255 gt +190.114.248.0 - 190.114.251.255 pe +190.114.252.0 - 190.114.255.255 cl +190.115.0.0 - 190.115.7.215 gt +190.115.7.216 - 190.115.7.223 pr +190.115.7.224 - 190.115.15.255 gt +190.115.16.0 - 190.115.28.140 bz +190.115.28.141 - 190.115.28.141 ru +190.115.28.142 - 190.115.31.255 bz 190.115.32.0 - 190.115.63.255 ar 190.115.64.0 - 190.115.95.255 pa -190.115.128.0 - 190.115.191.255 ht +190.115.96.0 - 190.115.104.255 cr +190.115.105.0 - 190.115.105.255 pa +190.115.106.0 - 190.115.107.255 cr +190.115.108.0 - 190.115.108.255 pa +190.115.109.0 - 190.115.111.255 cr +190.115.112.0 - 190.115.127.255 ar +190.115.128.0 - 190.115.177.255 ht +190.115.178.0 - 190.115.178.255 do +190.115.179.0 - 190.115.191.255 ht 190.115.192.0 - 190.115.223.255 ar +190.115.224.0 - 190.115.255.255 co 190.116.0.0 - 190.119.255.255 pe 190.120.0.0 - 190.120.31.255 sv 190.120.48.0 - 190.120.63.255 ar @@ -85122,60 +74163,112 @@ 190.120.128.0 - 190.120.143.255 co 190.120.144.0 - 190.120.159.255 ar 190.120.160.0 - 190.120.175.255 cl +190.120.176.0 - 190.120.191.255 ar 190.120.192.0 - 190.120.223.255 ht 190.120.224.0 - 190.120.239.255 pa +190.120.240.0 - 190.120.243.255 cr +190.120.244.0 - 190.120.247.255 ar +190.120.248.0 - 190.120.255.255 ve 190.121.0.0 - 190.121.127.255 cl 190.121.128.0 - 190.121.159.255 co 190.121.160.0 - 190.121.175.255 py +190.121.176.0 - 190.121.191.255 ar 190.121.192.0 - 190.121.207.255 gt +190.121.208.0 - 190.121.223.255 cw 190.121.224.0 - 190.121.239.255 ve -190.121.240.0 - 190.121.255.255 an -190.122.0.0 - 190.122.79.255 ar +190.121.240.0 - 190.121.255.255 cw +190.122.0.0 - 190.122.95.255 ar 190.122.96.0 - 190.122.127.255 do -190.122.128.0 - 190.122.143.255 ar +190.122.128.0 - 190.122.159.255 ar 190.122.160.0 - 190.122.175.255 pa -190.122.192.0 - 190.122.255.255 ar +190.122.176.0 - 190.122.179.255 sv +190.122.180.0 - 190.122.183.255 ar +190.122.184.0 - 190.122.187.255 gt +190.122.188.0 - 190.122.191.255 pa +190.122.192.0 - 190.122.215.255 ar +190.122.216.0 - 190.122.223.255 ve +190.122.224.0 - 190.122.255.255 ar 190.123.0.0 - 190.123.15.255 ec -190.123.32.0 - 190.123.47.255 pa +190.123.16.0 - 190.123.17.255 bq +190.123.18.0 - 190.123.18.255 ai +190.123.19.0 - 190.123.19.255 bq +190.123.20.0 - 190.123.23.255 cw +190.123.24.0 - 190.123.31.255 hn +190.123.32.0 - 190.123.32.255 us +190.123.33.0 - 190.123.34.255 pa +190.123.35.0 - 190.123.35.127 us +190.123.35.128 - 190.123.35.159 hn +190.123.35.160 - 190.123.37.255 us +190.123.38.0 - 190.123.47.255 pa 190.123.48.0 - 190.123.63.255 ec 190.123.64.0 - 190.123.79.255 cl -190.123.96.0 - 190.123.123.255 ar +190.123.80.0 - 190.123.123.255 ar 190.123.124.0 - 190.123.127.255 bo 190.123.128.0 - 190.123.143.255 cr -190.123.160.0 - 190.123.175.255 ve -190.123.192.0 - 190.123.255.255 pa -190.124.0.0 - 190.124.15.255 ar +190.123.144.0 - 190.123.159.255 ar +190.123.160.0 - 190.123.191.255 ve +190.123.192.0 - 190.123.207.255 pa +190.123.208.0 - 190.123.211.207 hn +190.123.211.208 - 190.123.211.215 us +190.123.211.216 - 190.123.213.31 hn +190.123.213.32 - 190.123.213.47 us +190.123.213.48 - 190.123.214.239 hn +190.123.214.240 - 190.123.214.255 ca +190.123.215.0 - 190.123.215.119 hn +190.123.215.120 - 190.123.215.127 de +190.123.215.128 - 190.123.215.207 hn +190.123.215.208 - 190.123.215.223 us +190.123.215.224 - 190.123.217.87 hn +190.123.217.88 - 190.123.217.95 de +190.123.217.96 - 190.123.219.127 hn +190.123.219.128 - 190.123.219.135 ca +190.123.219.136 - 190.123.223.255 hn +190.123.224.0 - 190.123.239.255 pa +190.123.240.0 - 190.124.15.255 ar +190.124.16.0 - 190.124.23.255 hn +190.124.24.0 - 190.124.27.255 cl +190.124.28.0 - 190.124.31.255 ve 190.124.32.0 - 190.124.39.255 ni -190.124.40.0 - 190.124.47.255 bz +190.124.40.0 - 190.124.42.127 bz +190.124.42.128 - 190.124.42.255 us +190.124.43.0 - 190.124.43.127 bz +190.124.43.128 - 190.124.44.127 us +190.124.44.128 - 190.124.45.127 bz +190.124.45.128 - 190.124.45.255 us +190.124.46.0 - 190.124.47.255 bz 190.124.48.0 - 190.124.55.255 pe 190.124.56.0 - 190.124.63.255 ar 190.124.64.0 - 190.124.95.255 do 190.124.96.0 - 190.124.127.255 co 190.124.128.0 - 190.124.159.255 ar 190.124.160.0 - 190.124.167.255 hn +190.124.168.0 - 190.124.175.255 ar +190.124.176.0 - 190.124.191.255 br 190.124.192.0 - 190.124.215.255 ar -190.124.216.0 - 190.124.219.255 an +190.124.216.0 - 190.124.219.255 sx 190.124.220.0 - 190.124.223.255 gy 190.124.224.0 - 190.124.243.255 ar 190.124.244.0 - 190.124.251.255 cr 190.124.252.0 - 190.124.255.255 ar -190.125.0.0 - 190.127.255.255 co -190.128.0.0 - 190.128.7.255 uy -190.128.8.0 - 190.128.127.255 co +190.125.0.0 - 190.128.127.255 co 190.128.128.0 - 190.128.255.255 py 190.129.0.0 - 190.129.255.255 bo 190.130.0.0 - 190.130.63.255 hn 190.130.64.0 - 190.130.127.255 co 190.130.128.0 - 190.131.191.255 ec -190.131.192.0 - 190.131.255.255 co +190.131.192.0 - 190.131.234.23 co +190.131.234.24 - 190.131.234.31 cw +190.131.234.32 - 190.131.255.255 co 190.132.0.0 - 190.135.255.255 uy 190.136.0.0 - 190.137.160.255 ar 190.137.161.0 - 190.137.161.255 uy 190.137.162.0 - 190.139.255.255 ar -190.140.0.0 - 190.141.255.255 pa +190.140.0.0 - 190.140.110.191 pa +190.140.110.192 - 190.140.110.207 pg +190.140.110.208 - 190.141.255.255 pa 190.142.0.0 - 190.142.255.255 ve 190.143.0.0 - 190.143.127.255 co -190.143.128.0 - 190.143.191.255 gt +190.143.128.0 - 190.143.255.255 gt 190.144.0.0 - 190.147.255.255 co 190.148.0.0 - 190.149.255.255 gt 190.150.0.0 - 190.150.255.255 sv @@ -85195,30 +74288,57 @@ 190.166.0.0 - 190.167.255.255 do 190.168.0.0 - 190.170.255.255 ve 190.171.0.0 - 190.171.63.255 cr +190.171.64.0 - 190.171.95.255 co +190.171.96.0 - 190.171.127.255 cr 190.171.128.0 - 190.171.191.255 cl -190.172.0.0 - 190.180.129.255 ar -190.180.130.0 - 190.180.131.255 us -190.180.132.0 - 190.180.255.255 ar +190.171.192.0 - 190.171.255.255 bo +190.172.0.0 - 190.179.255.255 ar +190.180.0.0 - 190.180.127.255 bo +190.180.128.0 - 190.180.143.255 br +190.180.144.0 - 190.180.147.255 ar +190.180.148.0 - 190.180.151.255 br +190.180.152.0 - 190.180.159.255 ar +190.180.160.0 - 190.180.191.255 br +190.180.192.0 - 190.180.255.255 cl 190.181.0.0 - 190.181.63.255 bo 190.181.64.0 - 190.181.127.255 ar 190.181.128.0 - 190.181.191.255 ni +190.181.192.0 - 190.181.255.255 hn 190.182.0.0 - 190.182.127.255 co -190.183.0.0 - 190.183.255.255 ar +190.182.128.0 - 190.183.255.255 ar 190.184.0.0 - 190.184.127.255 ni -190.184.192.0 - 190.184.255.255 ar -190.185.0.0 - 190.185.127.255 an +190.184.128.0 - 190.184.191.255 co +190.184.192.0 - 190.184.195.255 ar +190.184.196.0 - 190.184.199.127 cr +190.184.199.128 - 190.184.199.255 us +190.184.200.0 - 190.184.207.255 co +190.184.208.0 - 190.184.215.255 ar +190.184.216.0 - 190.184.219.255 ec +190.184.220.0 - 190.184.255.255 ar +190.185.0.0 - 190.185.63.255 cw +190.185.64.0 - 190.185.95.255 sx +190.185.96.0 - 190.185.99.255 cr +190.185.100.0 - 190.185.107.255 ar +190.185.108.0 - 190.185.127.255 hn 190.185.128.0 - 190.185.255.255 ar 190.186.0.0 - 190.186.255.255 bo 190.187.0.0 - 190.187.255.255 pe 190.188.0.0 - 190.195.255.255 ar 190.196.0.0 - 190.196.191.255 cl 190.196.192.0 - 190.196.207.255 ht +190.196.208.0 - 190.196.223.255 cl 190.196.224.0 - 190.196.239.255 ar +190.196.240.0 - 190.196.247.255 ec +190.196.248.0 - 190.196.255.255 ar 190.197.0.0 - 190.197.127.255 bz 190.197.128.0 - 190.197.255.255 ar 190.198.0.0 - 190.207.255.255 ve 190.208.0.0 - 190.209.255.255 cl -190.210.0.0 - 190.210.255.255 ar +190.210.0.0 - 190.210.5.255 ar +190.210.6.0 - 190.210.6.127 us +190.210.6.128 - 190.210.31.255 ar +190.210.32.0 - 190.210.32.255 us +190.210.33.0 - 190.210.255.255 ar 190.211.0.0 - 190.211.63.255 cl 190.211.64.0 - 190.211.91.255 ar 190.211.92.0 - 190.211.127.255 cr @@ -85227,127 +74347,723 @@ 190.211.140.0 - 190.211.143.255 co 190.211.144.0 - 190.211.159.255 ar 190.211.160.0 - 190.211.175.255 cl +190.211.176.0 - 190.211.191.255 do 190.211.192.0 - 190.211.223.255 ar 190.211.224.0 - 190.211.239.255 bo 190.211.240.0 - 190.211.243.255 py 190.211.244.0 - 190.211.247.255 ar 190.211.248.0 - 190.211.251.255 cl -190.211.252.0 - 190.211.255.255 pa +190.211.252.0 - 190.211.252.255 ch +190.211.253.0 - 190.211.253.255 de +190.211.254.0 - 190.211.254.255 gb +190.211.255.0 - 190.211.255.255 nl 190.212.0.0 - 190.212.255.255 ni 190.213.0.0 - 190.213.255.255 tt 190.214.0.0 - 190.214.255.255 ec -190.215.0.0 - 190.215.127.255 cl -190.216.0.0 - 190.216.191.255 ar +190.215.0.0 - 190.215.255.255 cl +190.216.0.0 - 190.216.95.255 ar +190.216.96.0 - 190.216.111.255 ec +190.216.112.0 - 190.216.127.255 pe +190.216.128.0 - 190.216.143.255 co +190.216.144.0 - 190.216.151.255 cl +190.216.152.0 - 190.216.159.255 co +190.216.160.0 - 190.216.191.255 pe 190.216.192.0 - 190.216.207.255 co -190.216.208.0 - 190.216.239.255 ar -190.216.240.0 - 190.216.255.255 ve -190.217.0.0 - 190.217.127.255 ar +190.216.208.0 - 190.216.223.255 ec +190.216.224.0 - 190.216.252.255 ve +190.216.253.0 - 190.216.253.255 us +190.216.254.0 - 190.217.7.255 ve +190.217.8.0 - 190.217.50.255 ar +190.217.51.0 - 190.217.51.255 co +190.217.52.0 - 190.217.127.255 ar 190.217.128.0 - 190.217.255.255 cl 190.218.0.0 - 190.219.255.255 pa -190.220.0.0 - 190.221.255.255 ar +190.220.0.0 - 190.220.152.127 ar +190.220.152.128 - 190.220.152.143 cw +190.220.152.144 - 190.221.255.255 ar 190.222.0.0 - 190.223.255.255 pe 190.224.0.0 - 190.231.255.255 ar 190.232.0.0 - 190.239.255.255 pe 190.240.0.0 - 190.240.255.255 co -190.241.0.0 - 190.241.43.255 cr -190.241.44.0 - 190.241.44.255 co -190.241.45.0 - 190.241.45.255 cr -190.241.46.0 - 190.241.47.127 co -190.241.47.128 - 190.241.255.255 cr -190.242.0.0 - 190.242.2.255 ni +190.241.0.0 - 190.241.112.255 cr +190.241.113.0 - 190.241.113.127 co +190.241.113.128 - 190.241.255.255 cr +190.242.0.0 - 190.242.2.255 co 190.242.3.0 - 190.242.3.255 pa -190.242.4.0 - 190.242.5.255 ni +190.242.4.0 - 190.242.5.255 co 190.242.6.0 - 190.242.6.255 pa -190.242.7.0 - 190.242.7.255 ni +190.242.7.0 - 190.242.7.255 co 190.242.8.0 - 190.242.15.255 pa -190.242.16.0 - 190.242.19.255 ni +190.242.16.0 - 190.242.19.255 co 190.242.20.0 - 190.242.21.255 pa -190.242.22.0 - 190.242.31.255 ni -190.242.32.0 - 190.242.63.255 co +190.242.22.0 - 190.242.23.255 co +190.242.24.0 - 190.242.27.255 hn +190.242.28.0 - 190.242.29.255 gt +190.242.30.0 - 190.242.30.255 pa +190.242.31.0 - 190.242.31.255 co +190.242.32.0 - 190.242.35.255 bz +190.242.36.0 - 190.242.49.255 co +190.242.50.0 - 190.242.53.255 gt +190.242.54.0 - 190.242.55.255 co +190.242.56.0 - 190.242.57.255 gt +190.242.58.0 - 190.242.63.255 co 190.242.64.0 - 190.242.71.255 pa -190.242.72.0 - 190.243.255.255 co +190.242.72.0 - 190.242.87.255 co +190.242.88.0 - 190.242.88.255 cr +190.242.89.0 - 190.242.101.255 co +190.242.102.0 - 190.242.102.255 do +190.242.103.0 - 190.242.119.255 co +190.242.120.0 - 190.242.123.255 sv +190.242.124.0 - 190.242.128.255 co +190.242.129.0 - 190.242.130.255 pa +190.242.131.0 - 190.242.131.255 co +190.242.132.0 - 190.242.133.255 do +190.242.134.0 - 190.242.139.255 co +190.242.140.0 - 190.242.140.255 pa +190.242.141.0 - 190.242.147.255 co +190.242.148.0 - 190.242.151.255 sv +190.242.152.0 - 190.242.154.255 co +190.242.155.0 - 190.242.155.255 cr +190.242.156.0 - 190.243.255.255 co 190.244.0.0 - 190.247.255.255 ar 190.248.0.0 - 190.255.255.255 co -192.0.32.0 - 192.0.47.255 us -192.1.0.0 - 192.2.255.255 us -192.4.0.0 - 192.5.27.255 us -192.5.28.0 - 192.5.31.255 gb -192.5.32.0 - 192.5.35.255 us +191.0.0.0 - 191.63.255.255 br +191.64.0.0 - 191.79.255.255 co +191.80.0.0 - 191.85.255.255 ar +191.86.0.0 - 191.87.255.255 br +191.88.0.0 - 191.95.255.255 co +191.96.0.0 - 191.96.0.255 us +191.96.1.0 - 191.96.1.255 mx +191.96.2.0 - 191.96.2.255 ar +191.96.3.0 - 191.96.3.255 us +191.96.4.0 - 191.96.8.255 br +191.96.9.0 - 191.96.9.15 it +191.96.9.16 - 191.96.9.31 us +191.96.9.32 - 191.96.9.47 br +191.96.9.48 - 191.96.9.63 us +191.96.9.64 - 191.96.9.255 br +191.96.10.0 - 191.96.10.255 cl +191.96.11.0 - 191.96.11.15 kr +191.96.11.16 - 191.96.11.32 cl +191.96.11.33 - 191.96.11.33 br +191.96.11.34 - 191.96.11.39 cl +191.96.11.40 - 191.96.11.47 us +191.96.11.48 - 191.96.11.63 br +191.96.11.64 - 191.96.12.255 cl +191.96.13.0 - 191.96.13.15 gr +191.96.13.16 - 191.96.13.39 cl +191.96.13.40 - 191.96.13.47 us +191.96.13.48 - 191.96.13.255 cl +191.96.14.0 - 191.96.14.255 us +191.96.15.0 - 191.96.15.15 th +191.96.15.16 - 191.96.15.31 us +191.96.15.32 - 191.96.15.255 cl +191.96.16.0 - 191.96.16.255 us +191.96.17.0 - 191.96.17.15 tr +191.96.17.16 - 191.96.17.127 cl +191.96.17.128 - 191.96.18.255 us +191.96.19.0 - 191.96.19.15 be +191.96.19.16 - 191.96.19.127 br +191.96.19.128 - 191.96.19.255 us +191.96.20.0 - 191.96.20.31 nz +191.96.20.32 - 191.96.20.63 is +191.96.20.64 - 191.96.20.255 cl +191.96.21.0 - 191.96.21.255 us +191.96.22.0 - 191.96.22.15 ru +191.96.22.16 - 191.96.22.31 us +191.96.22.32 - 191.96.22.255 cl +191.96.23.0 - 191.96.23.255 us +191.96.24.0 - 191.96.24.15 it +191.96.24.16 - 191.96.25.255 br +191.96.26.0 - 191.96.26.15 se +191.96.26.16 - 191.96.26.255 br +191.96.27.0 - 191.96.27.255 us +191.96.28.0 - 191.96.28.15 ch +191.96.28.16 - 191.96.28.255 cl +191.96.29.0 - 191.96.31.255 us +191.96.32.0 - 191.96.32.255 br +191.96.33.0 - 191.96.33.15 jp +191.96.33.16 - 191.96.33.127 br +191.96.33.128 - 191.96.35.255 us +191.96.36.0 - 191.96.37.255 cl +191.96.38.0 - 191.96.48.255 us +191.96.49.0 - 191.96.49.255 sg +191.96.50.0 - 191.96.62.255 us +191.96.63.0 - 191.96.63.15 my +191.96.63.16 - 191.96.63.31 us +191.96.63.32 - 191.96.64.255 cl +191.96.65.0 - 191.96.65.255 us +191.96.66.0 - 191.96.66.255 de +191.96.67.0 - 191.96.67.255 ru +191.96.68.0 - 191.96.74.255 us +191.96.75.0 - 191.96.75.255 gh +191.96.76.0 - 191.96.94.255 us +191.96.95.0 - 191.96.95.15 ie +191.96.95.16 - 191.96.95.31 us +191.96.95.32 - 191.96.95.255 cl +191.96.96.0 - 191.96.97.255 us +191.96.98.0 - 191.96.98.255 cl +191.96.99.0 - 191.96.99.15 se +191.96.99.16 - 191.96.99.255 br +191.96.100.0 - 191.96.100.255 cl +191.96.101.0 - 191.96.101.255 us +191.96.102.0 - 191.96.102.255 es +191.96.103.0 - 191.96.103.255 cl +191.96.104.0 - 191.96.104.255 us +191.96.105.0 - 191.96.105.255 cl +191.96.106.0 - 191.96.106.255 us +191.96.107.0 - 191.96.107.255 cl +191.96.108.0 - 191.96.110.255 us +191.96.111.0 - 191.96.111.255 my +191.96.112.0 - 191.96.112.255 nl +191.96.113.0 - 191.96.114.255 us +191.96.115.0 - 191.96.115.255 nl +191.96.116.0 - 191.96.122.255 us +191.96.123.0 - 191.96.123.15 th +191.96.123.16 - 191.96.123.255 cl +191.96.124.0 - 191.96.127.255 us +191.96.128.0 - 191.96.128.255 cl +191.96.129.0 - 191.96.130.255 us +191.96.131.0 - 191.96.131.255 br +191.96.132.0 - 191.96.132.15 pl +191.96.132.16 - 191.96.132.255 br +191.96.133.0 - 191.96.134.255 us +191.96.135.0 - 191.96.135.15 no +191.96.135.16 - 191.96.136.255 br +191.96.137.0 - 191.96.137.15 it +191.96.137.16 - 191.96.137.255 br +191.96.138.0 - 191.96.138.255 us +191.96.139.0 - 191.96.139.15 ch +191.96.139.16 - 191.96.139.255 br +191.96.140.0 - 191.96.140.255 us +191.96.141.0 - 191.96.142.255 cl +191.96.143.0 - 191.96.143.255 us +191.96.144.0 - 191.96.144.255 cl +191.96.145.0 - 191.96.145.255 us +191.96.146.0 - 191.96.147.255 cl +191.96.148.0 - 191.96.164.255 us +191.96.165.0 - 191.96.167.255 cl +191.96.168.0 - 191.96.168.255 us +191.96.169.0 - 191.96.169.15 tr +191.96.169.16 - 191.96.169.255 cl +191.96.170.0 - 191.96.170.255 us +191.96.171.0 - 191.96.171.15 jp +191.96.171.16 - 191.96.171.255 cl +191.96.172.0 - 191.96.172.255 us +191.96.173.0 - 191.96.173.15 jp +191.96.173.16 - 191.96.173.255 cl +191.96.174.0 - 191.96.174.255 us +191.96.175.0 - 191.96.175.15 be +191.96.175.16 - 191.96.176.255 cl +191.96.177.0 - 191.96.179.255 us +191.96.180.0 - 191.96.180.255 br +191.96.181.0 - 191.96.181.15 au +191.96.181.16 - 191.96.181.255 cl +191.96.182.0 - 191.96.182.255 us +191.96.183.0 - 191.96.183.15 gr +191.96.183.16 - 191.96.183.23 sg +191.96.183.24 - 191.96.184.255 cl +191.96.185.0 - 191.96.187.255 us +191.96.188.0 - 191.96.188.255 cl +191.96.189.0 - 191.96.190.255 us +191.96.191.0 - 191.96.192.255 cl +191.96.193.0 - 191.96.194.255 us +191.96.195.0 - 191.96.195.255 cl +191.96.196.0 - 191.96.201.255 us +191.96.202.0 - 191.96.202.255 cl +191.96.203.0 - 191.96.203.255 us +191.96.204.0 - 191.96.205.255 cl +191.96.206.0 - 191.96.206.255 us +191.96.207.0 - 191.96.209.255 cl +191.96.210.0 - 191.96.210.255 us +191.96.211.0 - 191.96.211.255 cl +191.96.212.0 - 191.96.214.255 us +191.96.215.0 - 191.96.215.255 cl +191.96.216.0 - 191.96.219.255 us +191.96.220.0 - 191.96.220.255 cl +191.96.221.0 - 191.96.223.255 us +191.96.224.0 - 191.96.224.255 cl +191.96.225.0 - 191.96.229.255 us +191.96.230.0 - 191.96.230.255 cl +191.96.231.0 - 191.96.231.255 es +191.96.232.0 - 191.96.232.255 us +191.96.233.0 - 191.96.233.255 cl +191.96.234.0 - 191.96.237.255 us +191.96.238.0 - 191.96.238.255 cl +191.96.239.0 - 191.96.244.255 us +191.96.245.0 - 191.96.245.255 cl +191.96.246.0 - 191.96.246.255 us +191.96.247.0 - 191.96.247.95 cl +191.96.247.96 - 191.96.247.111 au +191.96.247.112 - 191.96.247.127 cl +191.96.247.128 - 191.96.247.143 us +191.96.247.144 - 191.96.247.255 cl +191.96.248.0 - 191.96.248.1 us +191.96.248.2 - 191.96.248.127 cl +191.96.248.128 - 191.96.248.255 br +191.96.249.0 - 191.96.249.255 cl +191.96.250.0 - 191.96.251.255 us +191.96.252.0 - 191.96.252.255 cl +191.96.253.0 - 191.96.253.255 us +191.96.254.0 - 191.96.254.255 cl +191.96.255.0 - 191.96.255.255 us +191.97.0.0 - 191.97.15.255 pa +191.97.16.0 - 191.97.19.255 ve +191.97.20.0 - 191.97.23.255 pa +191.97.24.0 - 191.97.47.255 ar +191.97.48.0 - 191.97.63.255 pe +191.97.64.0 - 191.97.67.255 ec +191.97.68.0 - 191.97.79.255 ar +191.97.80.0 - 191.97.87.255 bz +191.97.88.0 - 191.97.95.255 do +191.97.96.0 - 191.97.99.255 ar +191.97.100.0 - 191.97.103.255 pe +191.97.104.0 - 191.97.107.255 do +191.97.108.0 - 191.97.119.255 ar +191.97.120.0 - 191.97.127.255 py +191.97.128.0 - 191.97.247.255 ar +191.97.248.0 - 191.97.251.255 us +191.97.252.0 - 191.97.255.255 ar +191.98.0.0 - 191.98.127.255 co +191.98.128.0 - 191.98.191.255 pe +191.98.192.0 - 191.98.195.255 gt +191.98.196.0 - 191.98.199.255 pa +191.98.200.0 - 191.98.207.255 cl +191.98.208.0 - 191.98.215.255 do +191.98.216.0 - 191.98.223.255 ar +191.98.224.0 - 191.98.255.255 ni +191.99.0.0 - 191.100.255.255 ec +191.101.0.0 - 191.101.15.255 us +191.101.16.0 - 191.101.16.255 nl +191.101.17.0 - 191.101.17.255 de +191.101.18.0 - 191.101.18.27 us +191.101.18.28 - 191.101.18.57 br +191.101.18.58 - 191.101.19.31 us +191.101.19.32 - 191.101.19.63 nz +191.101.19.64 - 191.101.19.255 us +191.101.20.0 - 191.101.21.255 nl +191.101.22.0 - 191.101.22.255 gb +191.101.23.0 - 191.101.23.255 fr +191.101.24.0 - 191.101.25.255 us +191.101.26.0 - 191.101.26.255 nl +191.101.27.0 - 191.101.27.255 es +191.101.28.0 - 191.101.28.255 nl +191.101.29.0 - 191.101.29.255 us +191.101.30.0 - 191.101.30.255 dk +191.101.31.0 - 191.101.31.255 nl +191.101.32.0 - 191.101.32.255 us +191.101.33.0 - 191.101.33.255 cl +191.101.34.0 - 191.101.35.255 lt +191.101.36.0 - 191.101.47.255 us +191.101.48.0 - 191.101.48.255 gb +191.101.49.0 - 191.101.49.255 ng +191.101.50.0 - 191.101.51.255 us +191.101.52.0 - 191.101.52.255 gb +191.101.53.0 - 191.101.53.255 cl +191.101.54.0 - 191.101.55.255 ch +191.101.56.0 - 191.101.58.255 us +191.101.59.0 - 191.101.59.255 gb +191.101.60.0 - 191.101.60.255 sg +191.101.61.0 - 191.101.62.255 us +191.101.63.0 - 191.101.63.255 hk +191.101.64.0 - 191.101.64.15 ru +191.101.64.16 - 191.101.64.63 cl +191.101.64.64 - 191.101.64.79 gb +191.101.64.80 - 191.101.64.127 de +191.101.64.128 - 191.101.64.255 cl +191.101.65.0 - 191.101.65.255 de +191.101.66.0 - 191.101.66.15 nl +191.101.66.16 - 191.101.66.63 de +191.101.66.64 - 191.101.66.79 gb +191.101.66.80 - 191.101.66.255 de +191.101.67.0 - 191.101.67.15 cl +191.101.67.16 - 191.101.67.31 de +191.101.67.32 - 191.101.67.127 cl +191.101.67.128 - 191.101.67.255 by +191.101.68.0 - 191.101.68.15 at +191.101.68.16 - 191.101.68.63 cl +191.101.68.64 - 191.101.68.79 gb +191.101.68.80 - 191.101.68.95 de +191.101.68.96 - 191.101.68.127 cl +191.101.68.128 - 191.101.68.255 de +191.101.69.0 - 191.101.69.15 cl +191.101.69.16 - 191.101.69.31 de +191.101.69.32 - 191.101.69.255 cl +191.101.70.0 - 191.101.70.15 gb +191.101.70.16 - 191.101.70.63 cl +191.101.70.64 - 191.101.70.79 gb +191.101.70.80 - 191.101.70.95 de +191.101.70.96 - 191.101.71.15 cl +191.101.71.16 - 191.101.71.31 de +191.101.71.32 - 191.101.71.127 cl +191.101.71.128 - 191.101.71.255 ge +191.101.72.0 - 191.101.72.15 th +191.101.72.16 - 191.101.72.63 de +191.101.72.64 - 191.101.72.79 gb +191.101.72.80 - 191.101.73.255 de +191.101.74.0 - 191.101.74.15 fr +191.101.74.16 - 191.101.74.31 de +191.101.74.32 - 191.101.74.127 cl +191.101.74.128 - 191.101.75.255 de +191.101.76.0 - 191.101.76.15 pl +191.101.76.16 - 191.101.76.31 de +191.101.76.32 - 191.101.77.15 cl +191.101.77.16 - 191.101.77.31 de +191.101.77.32 - 191.101.77.255 cl +191.101.78.0 - 191.101.78.15 gb +191.101.78.16 - 191.101.79.255 de +191.101.80.0 - 191.101.80.15 es +191.101.80.16 - 191.101.80.127 de +191.101.80.128 - 191.101.80.255 us +191.101.81.0 - 191.101.81.255 de +191.101.82.0 - 191.101.82.15 be +191.101.82.16 - 191.101.83.255 de +191.101.84.0 - 191.101.84.15 dk +191.101.84.16 - 191.101.85.255 de +191.101.86.0 - 191.101.86.15 gb +191.101.86.16 - 191.101.86.127 de +191.101.86.128 - 191.101.86.255 us +191.101.87.0 - 191.101.87.255 de +191.101.88.0 - 191.101.88.15 gb +191.101.88.16 - 191.101.89.255 de +191.101.90.0 - 191.101.90.15 gr +191.101.90.16 - 191.101.91.255 de +191.101.92.0 - 191.101.92.15 tr +191.101.92.16 - 191.101.92.127 de +191.101.92.128 - 191.101.92.255 us +191.101.93.0 - 191.101.93.255 de +191.101.94.0 - 191.101.94.15 fi +191.101.94.16 - 191.101.95.255 de +191.101.96.0 - 191.101.96.15 ru +191.101.96.16 - 191.101.97.255 de +191.101.98.0 - 191.101.98.15 be +191.101.98.16 - 191.101.98.127 de +191.101.98.128 - 191.101.98.255 us +191.101.99.0 - 191.101.99.255 de +191.101.100.0 - 191.101.100.15 sk +191.101.100.16 - 191.101.101.255 de +191.101.102.0 - 191.101.102.15 hr +191.101.102.16 - 191.101.103.255 de +191.101.104.0 - 191.101.104.15 cz +191.101.104.16 - 191.101.104.127 de +191.101.104.128 - 191.101.104.255 us +191.101.105.0 - 191.101.105.255 de +191.101.106.0 - 191.101.106.15 hr +191.101.106.16 - 191.101.107.255 de +191.101.108.0 - 191.101.108.15 es +191.101.108.16 - 191.101.109.255 de +191.101.110.0 - 191.101.110.15 gb +191.101.110.16 - 191.101.110.127 de +191.101.110.128 - 191.101.110.255 us +191.101.111.0 - 191.101.111.255 de +191.101.112.0 - 191.101.112.15 gb +191.101.112.16 - 191.101.116.15 de +191.101.116.16 - 191.101.116.63 gb +191.101.116.64 - 191.101.116.127 cl +191.101.116.128 - 191.101.116.255 gb +191.101.117.0 - 191.101.117.15 cl +191.101.117.16 - 191.101.117.31 de +191.101.117.32 - 191.101.117.255 cl +191.101.118.0 - 191.101.118.255 us +191.101.119.0 - 191.101.119.15 cl +191.101.119.16 - 191.101.119.31 de +191.101.119.32 - 191.101.119.255 cl +191.101.120.0 - 191.101.120.255 us +191.101.121.0 - 191.101.121.15 cl +191.101.121.16 - 191.101.121.31 de +191.101.121.32 - 191.101.121.255 cl +191.101.122.0 - 191.101.122.255 de +191.101.123.0 - 191.101.123.15 cl +191.101.123.16 - 191.101.123.31 de +191.101.123.32 - 191.101.123.255 cl +191.101.124.0 - 191.101.126.31 de +191.101.126.32 - 191.101.126.63 gb +191.101.126.64 - 191.101.126.127 de +191.101.126.128 - 191.101.126.255 gb +191.101.127.0 - 191.101.127.15 cl +191.101.127.16 - 191.101.127.31 de +191.101.127.32 - 191.101.127.255 cl +191.101.128.0 - 191.101.134.255 us +191.101.135.0 - 191.101.135.255 sg +191.101.136.0 - 191.101.145.255 au +191.101.146.0 - 191.101.149.255 us +191.101.150.0 - 191.101.151.255 es +191.101.152.0 - 191.101.177.255 us +191.101.178.0 - 191.101.179.255 cl +191.101.180.0 - 191.101.180.255 gb +191.101.181.0 - 191.101.181.255 lt +191.101.182.0 - 191.101.182.255 us +191.101.183.0 - 191.101.183.255 cl +191.101.184.0 - 191.101.189.255 us +191.101.190.0 - 191.101.190.255 ru +191.101.191.0 - 191.101.197.255 us +191.101.198.0 - 191.101.198.255 ve +191.101.199.0 - 191.101.199.255 ec +191.101.200.0 - 191.101.200.255 bo +191.101.201.0 - 191.101.201.255 uy +191.101.202.0 - 191.101.240.255 us +191.101.241.0 - 191.101.241.255 cl +191.101.242.0 - 191.101.242.255 sg +191.101.243.0 - 191.101.243.255 nl +191.101.244.0 - 191.101.244.255 cl +191.101.245.0 - 191.101.255.255 us +191.102.0.0 - 191.102.15.255 co +191.102.16.0 - 191.102.31.255 ar +191.102.32.0 - 191.102.35.255 cl +191.102.36.0 - 191.102.39.255 cr +191.102.40.0 - 191.102.47.255 ar +191.102.48.0 - 191.102.55.255 ni +191.102.56.0 - 191.102.59.255 cr +191.102.60.0 - 191.102.127.255 co +191.102.128.0 - 191.102.128.255 hn +191.102.129.0 - 191.102.129.31 uy +191.102.129.32 - 191.102.152.207 hn +191.102.152.208 - 191.102.152.223 nl +191.102.152.224 - 191.102.191.255 hn +191.102.192.0 - 191.102.239.255 co +191.102.240.0 - 191.102.243.255 do +191.102.244.0 - 191.103.63.255 ar +191.103.64.0 - 191.103.95.255 hn +191.103.96.0 - 191.103.111.255 ar +191.103.112.0 - 191.103.127.255 ni +191.103.128.0 - 191.111.255.255 co +191.112.0.0 - 191.119.255.255 cl +191.120.0.0 - 191.123.255.255 br +191.124.0.0 - 191.127.255.255 cl +191.128.0.0 - 191.143.255.255 br +191.144.0.0 - 191.159.255.255 co +191.160.0.0 - 191.232.2.7 br +191.232.2.8 - 191.232.2.15 us +191.232.2.16 - 191.232.4.83 br +191.232.4.84 - 191.232.4.84 us +191.232.4.85 - 191.232.79.255 br +191.232.80.0 - 191.232.80.63 us +191.232.80.64 - 191.232.80.127 br +191.232.80.128 - 191.232.80.255 us +191.232.81.0 - 191.232.82.127 br +191.232.82.128 - 191.232.82.255 us +191.232.83.0 - 191.233.31.255 br +191.233.32.0 - 191.233.63.255 jp +191.233.64.0 - 191.233.127.255 nl +191.233.128.0 - 191.233.143.255 br +191.233.144.0 - 191.233.144.255 us +191.233.145.0 - 191.233.167.255 br +191.233.168.0 - 191.233.183.255 us +191.233.184.0 - 191.234.0.63 br +191.234.0.64 - 191.234.0.71 hk +191.234.0.72 - 191.234.0.255 br +191.234.1.0 - 191.234.1.255 us +191.234.2.0 - 191.234.3.255 hk +191.234.4.0 - 191.234.7.255 br +191.234.8.0 - 191.234.11.255 us +191.234.12.0 - 191.234.13.255 nl +191.234.14.0 - 191.234.15.255 ie +191.234.16.0 - 191.234.31.255 hk +191.234.32.0 - 191.234.63.255 us +191.234.64.0 - 191.234.65.255 br +191.234.66.0 - 191.234.66.15 us +191.234.66.16 - 191.234.66.127 br +191.234.66.128 - 191.234.67.15 us +191.234.67.16 - 191.234.71.255 br +191.234.72.0 - 191.234.73.255 us +191.234.74.0 - 191.234.75.255 br +191.234.76.0 - 191.234.77.255 sg +191.234.78.0 - 191.234.79.255 us +191.234.80.0 - 191.234.97.255 br +191.234.98.0 - 191.234.127.255 nl +191.234.128.0 - 191.234.135.255 us +191.234.136.0 - 191.234.137.255 br +191.234.138.0 - 191.234.139.255 jp +191.234.140.0 - 191.234.142.31 hk +191.234.142.32 - 191.234.142.47 jp +191.234.142.48 - 191.234.147.255 hk +191.234.148.0 - 191.234.157.255 br +191.234.158.0 - 191.234.159.255 us +191.234.160.0 - 191.234.223.255 br +191.234.224.0 - 191.234.227.255 nl +191.234.228.0 - 191.234.231.255 br +191.234.232.0 - 191.234.235.255 us +191.234.236.0 - 191.234.239.255 br +191.234.240.0 - 191.234.247.255 us +191.234.248.0 - 191.234.251.255 br +191.234.252.0 - 191.234.252.255 au +191.234.253.0 - 191.234.255.255 br +191.235.0.0 - 191.235.7.255 us +191.235.8.0 - 191.235.11.255 nl +191.235.12.0 - 191.235.15.255 ie +191.235.16.0 - 191.235.127.255 br +191.235.128.0 - 191.235.255.255 ie +191.236.0.0 - 191.237.191.255 us +191.237.192.0 - 191.237.223.255 ie +191.237.224.0 - 191.237.231.255 us +191.237.232.0 - 191.237.235.255 nl +191.237.236.0 - 191.237.237.255 jp +191.237.238.0 - 191.237.238.255 hk +191.237.239.0 - 191.237.239.255 br +191.237.240.0 - 191.237.241.255 jp +191.237.242.0 - 191.237.243.255 br +191.237.244.0 - 191.237.247.255 us +191.237.248.0 - 191.237.255.255 br +191.238.0.0 - 191.238.63.255 us +191.238.64.0 - 191.238.65.255 sg +191.238.66.0 - 191.238.67.255 au +191.238.68.0 - 191.238.69.255 jp +191.238.70.0 - 191.238.79.255 us +191.238.80.0 - 191.238.95.255 jp +191.238.96.0 - 191.238.127.255 ie +191.238.128.0 - 191.239.63.255 us +191.239.64.0 - 191.239.95.255 au +191.239.96.0 - 191.239.159.255 jp +191.239.160.0 - 191.239.195.255 au +191.239.196.0 - 191.239.197.15 us +191.239.197.16 - 191.239.199.255 br +191.239.200.0 - 191.239.203.255 nl +191.239.204.0 - 191.239.207.255 br +191.239.208.0 - 191.239.223.255 ie +191.239.224.0 - 191.239.239.255 us +191.239.240.0 - 191.255.141.68 br +191.255.141.69 - 191.255.141.69 us +191.255.141.70 - 191.255.255.255 br +192.0.0.8 - 192.0.0.255 us +192.0.3.0 - 192.0.3.255 us +192.0.4.0 - 192.0.7.255 ky +192.0.8.0 - 192.0.67.255 us +192.0.68.0 - 192.0.68.255 au +192.0.69.0 - 192.0.69.255 de +192.0.70.0 - 192.0.70.255 us +192.0.71.0 - 192.0.71.255 sg +192.0.72.0 - 192.0.127.255 us +192.0.128.0 - 192.0.255.255 ca +192.1.0.0 - 192.1.168.253 us +192.1.168.254 - 192.1.168.254 dz +192.1.168.255 - 192.2.231.255 us +192.2.232.0 - 192.2.232.255 ru +192.2.233.0 - 192.3.183.247 us +192.3.183.248 - 192.3.183.255 ca +192.3.184.0 - 192.5.27.255 us +192.5.28.0 - 192.5.30.255 gb +192.5.31.0 - 192.5.35.255 us 192.5.36.0 - 192.5.36.255 se 192.5.37.0 - 192.5.49.255 us 192.5.50.0 - 192.5.50.255 se -192.5.52.0 - 192.5.56.255 us -192.5.59.0 - 192.5.59.255 fr +192.5.51.0 - 192.5.58.255 us +192.5.59.0 - 192.5.59.255 nl +192.5.60.0 - 192.5.60.255 us 192.5.61.0 - 192.5.62.255 fr 192.5.63.0 - 192.5.89.255 us -192.5.90.0 - 192.5.90.255 kr +192.5.90.0 - 192.5.90.255 au 192.5.91.0 - 192.5.95.255 us 192.5.96.0 - 192.5.96.255 ca -192.5.97.0 - 192.5.97.255 it -192.5.98.0 - 192.5.141.255 us -192.5.142.0 - 192.5.142.255 fr +192.5.97.0 - 192.5.97.255 nl +192.5.98.0 - 192.5.98.73 us +192.5.98.74 - 192.5.98.74 jp +192.5.98.75 - 192.5.141.255 us +192.5.142.0 - 192.5.142.255 nl 192.5.143.0 - 192.5.143.255 us 192.5.144.0 - 192.5.144.255 ca -192.5.145.0 - 192.5.145.255 de +192.5.145.0 - 192.5.145.255 nl 192.5.146.0 - 192.5.161.255 us -192.5.162.0 - 192.5.162.255 at +192.5.162.0 - 192.5.162.255 nl 192.5.163.0 - 192.5.203.255 us 192.5.204.0 - 192.5.205.255 ca 192.5.206.0 - 192.5.215.255 us -192.5.216.0 - 192.5.216.255 jp +192.5.216.0 - 192.5.216.255 au 192.5.217.0 - 192.5.238.255 us 192.5.239.0 - 192.5.239.255 gb 192.5.240.0 - 192.5.240.255 au -192.5.242.0 - 192.5.253.255 us -192.5.254.0 - 192.5.254.255 gb +192.5.241.0 - 192.5.246.141 us +192.5.246.142 - 192.5.246.142 ap +192.5.246.143 - 192.5.253.255 us +192.5.254.0 - 192.5.254.255 nl +192.5.255.0 - 192.5.255.255 us 192.6.0.0 - 192.6.0.255 gb -192.6.1.0 - 192.6.83.255 us -192.6.84.0 - 192.6.84.255 nl -192.6.85.0 - 192.6.148.255 us +192.6.1.0 - 192.6.110.255 us +192.6.111.0 - 192.6.111.255 fr +192.6.112.0 - 192.6.148.255 us 192.6.149.0 - 192.6.149.255 au -192.6.150.0 - 192.11.255.255 us +192.6.150.0 - 192.6.177.255 us +192.6.178.0 - 192.6.178.255 eu +192.6.179.0 - 192.8.31.255 us +192.8.32.0 - 192.8.43.255 in +192.8.44.0 - 192.8.159.255 us +192.8.160.0 - 192.8.176.255 in +192.8.177.0 - 192.8.178.255 us +192.8.179.0 - 192.8.180.255 in +192.8.181.0 - 192.8.181.255 us +192.8.182.0 - 192.8.182.255 in +192.8.183.0 - 192.8.183.255 us +192.8.184.0 - 192.8.255.255 in +192.9.0.0 - 192.9.111.255 us +192.9.112.0 - 192.9.112.255 eu +192.9.113.0 - 192.10.255.255 us +192.11.0.0 - 192.11.69.255 fr +192.11.70.0 - 192.11.70.255 us +192.11.71.0 - 192.11.153.255 fr +192.11.154.0 - 192.11.154.255 us +192.11.155.0 - 192.11.184.255 fr +192.11.185.0 - 192.11.185.255 eu +192.11.186.0 - 192.11.224.255 fr +192.11.225.0 - 192.11.225.255 ap +192.11.226.0 - 192.11.230.255 fr +192.11.231.0 - 192.11.231.255 us +192.11.232.0 - 192.11.255.255 fr +192.12.0.0 - 192.12.0.255 ca 192.12.1.0 - 192.12.1.255 gb -192.12.3.0 - 192.12.44.255 us +192.12.2.0 - 192.12.46.255 us 192.12.47.0 - 192.12.47.255 it 192.12.48.0 - 192.12.53.255 us 192.12.54.0 - 192.12.54.255 nl -192.12.56.0 - 192.12.61.255 us +192.12.55.0 - 192.12.61.255 us 192.12.62.0 - 192.12.62.255 ca 192.12.63.0 - 192.12.71.255 us -192.12.72.0 - 192.12.73.255 gb +192.12.72.0 - 192.12.72.255 gb +192.12.73.0 - 192.12.73.255 nl 192.12.74.0 - 192.12.75.255 us 192.12.76.0 - 192.12.76.255 au 192.12.77.0 - 192.12.77.255 it 192.12.78.0 - 192.12.80.255 us -192.12.81.0 - 192.12.81.255 de +192.12.81.0 - 192.12.81.255 nl 192.12.82.0 - 192.12.95.255 us 192.12.96.0 - 192.12.96.255 fr 192.12.97.0 - 192.12.97.255 us 192.12.98.0 - 192.12.98.255 ca -192.12.99.0 - 192.12.99.255 gb -192.12.100.0 - 192.12.103.255 us -192.12.108.0 - 192.12.127.255 us +192.12.99.0 - 192.12.99.255 nl +192.12.100.0 - 192.12.111.255 us +192.12.120.0 - 192.12.128.255 us 192.12.129.0 - 192.12.129.255 ca -192.12.130.0 - 192.12.171.255 us -192.12.173.0 - 192.12.173.255 us +192.12.130.0 - 192.12.173.255 us 192.12.174.0 - 192.12.183.255 ca 192.12.184.0 - 192.12.191.255 us 192.12.192.0 - 192.12.194.255 it 192.12.195.0 - 192.12.214.255 us 192.12.215.0 - 192.12.215.255 ca 192.12.216.0 - 192.12.216.255 us -192.12.217.0 - 192.12.218.255 ch -192.12.220.0 - 192.12.230.255 us -192.12.231.0 - 192.12.231.255 gb -192.12.232.0 - 192.12.232.255 pt +192.12.217.0 - 192.12.218.255 nl +192.12.219.0 - 192.12.230.255 us +192.12.231.0 - 192.12.232.255 nl 192.12.233.0 - 192.12.234.255 us 192.12.235.0 - 192.12.235.255 se 192.12.236.0 - 192.12.246.255 us 192.12.247.0 - 192.12.247.255 ch -192.12.248.0 - 192.15.255.255 us -192.16.64.0 - 192.16.122.255 us +192.12.248.0 - 192.16.1.255 us +192.16.2.0 - 192.16.2.255 au +192.16.3.0 - 192.16.3.255 us +192.16.4.0 - 192.16.5.255 jp +192.16.6.0 - 192.16.13.255 us +192.16.14.0 - 192.16.15.255 it +192.16.16.0 - 192.16.21.255 us +192.16.22.0 - 192.16.23.255 pl +192.16.24.0 - 192.16.27.255 us +192.16.28.0 - 192.16.29.255 gb +192.16.30.0 - 192.16.40.255 us +192.16.41.0 - 192.16.42.255 br +192.16.43.0 - 192.16.51.255 us +192.16.52.0 - 192.16.53.255 nl +192.16.54.0 - 192.16.55.255 us +192.16.56.0 - 192.16.57.255 jp +192.16.58.0 - 192.16.122.255 us 192.16.123.0 - 192.16.136.255 se -192.16.137.0 - 192.16.137.255 eu +192.16.137.0 - 192.16.137.255 de 192.16.138.0 - 192.16.154.255 se 192.16.155.0 - 192.16.166.255 ch 192.16.167.0 - 192.16.177.255 us @@ -85357,99 +75073,160 @@ 192.16.183.0 - 192.16.202.255 nl 192.16.203.0 - 192.16.204.255 us 192.16.205.0 - 192.16.255.255 ca -192.17.0.0 - 192.18.194.255 us -192.18.195.0 - 192.18.195.255 gb -192.18.196.0 - 192.25.18.255 us -192.25.19.0 - 192.25.19.255 de -192.25.20.0 - 192.25.21.255 us -192.25.22.0 - 192.25.22.255 gb -192.25.23.0 - 192.25.32.255 us +192.17.0.0 - 192.18.3.255 us +192.18.4.0 - 192.18.4.255 eu +192.18.5.0 - 192.18.7.255 us +192.18.8.0 - 192.18.8.255 eu +192.18.9.0 - 192.18.16.255 us +192.18.17.0 - 192.18.17.255 ap +192.18.18.0 - 192.18.194.255 us +192.18.195.0 - 192.18.195.255 nl +192.18.196.0 - 192.18.239.255 us +192.18.240.0 - 192.18.240.255 eu +192.18.241.0 - 192.19.208.255 us +192.19.209.0 - 192.19.209.255 jp +192.19.210.0 - 192.19.211.255 sg +192.19.212.0 - 192.19.212.255 us +192.19.213.0 - 192.19.213.255 de +192.19.214.0 - 192.20.245.255 us +192.20.246.0 - 192.20.246.255 ap +192.20.247.0 - 192.20.250.255 us +192.20.251.0 - 192.20.251.255 ap +192.20.252.0 - 192.23.34.255 us +192.23.35.0 - 192.23.35.255 ap +192.23.36.0 - 192.23.167.255 us +192.23.168.0 - 192.23.168.255 ap +192.23.169.0 - 192.25.18.255 us +192.25.19.0 - 192.25.19.255 eu +192.25.20.0 - 192.25.32.255 us 192.25.33.0 - 192.25.33.255 ca -192.25.34.0 - 192.25.104.255 us +192.25.34.0 - 192.25.41.255 us +192.25.42.0 - 192.25.42.255 ap +192.25.43.0 - 192.25.47.255 us +192.25.48.0 - 192.25.48.255 ap +192.25.49.0 - 192.25.104.255 us 192.25.105.0 - 192.25.105.255 ca 192.25.106.0 - 192.26.27.255 us 192.26.28.0 - 192.26.44.255 ch 192.26.45.0 - 192.26.45.255 gb 192.26.46.0 - 192.26.47.255 ch 192.26.48.0 - 192.26.90.255 us -192.26.91.0 - 192.26.91.255 jp +192.26.91.0 - 192.26.91.255 au 192.26.92.0 - 192.26.92.255 us -192.26.93.0 - 192.26.94.255 jp +192.26.93.0 - 192.26.93.255 jp +192.26.94.0 - 192.26.94.255 au 192.26.95.0 - 192.26.95.255 us 192.26.96.0 - 192.26.96.255 jp -192.26.97.0 - 192.26.97.255 us -192.26.100.0 - 192.26.103.255 us -192.26.104.0 - 192.26.135.255 fi -192.26.136.0 - 192.26.136.255 us -192.26.144.0 - 192.26.153.255 us +192.26.97.0 - 192.26.104.255 us +192.26.105.0 - 192.26.128.255 fi +192.26.129.0 - 192.26.132.255 us +192.26.133.0 - 192.26.135.255 fi +192.26.136.0 - 192.26.153.255 us 192.26.154.0 - 192.26.173.255 nl 192.26.174.0 - 192.26.193.255 de 192.26.194.0 - 192.26.209.255 us 192.26.210.0 - 192.26.212.255 ca 192.26.213.0 - 192.26.214.255 us -192.26.215.0 - 192.26.230.255 au -192.26.231.0 - 192.26.231.255 pt +192.26.216.0 - 192.26.230.255 au +192.26.231.0 - 192.26.231.255 nl 192.26.232.0 - 192.26.232.255 au 192.26.233.0 - 192.26.233.255 us -192.26.234.0 - 192.26.234.255 gb +192.26.234.0 - 192.26.234.255 nl 192.26.235.0 - 192.26.235.255 ca 192.26.236.0 - 192.26.236.255 pt -192.26.237.0 - 192.26.237.255 eu -192.26.238.0 - 192.26.238.255 at +192.26.237.0 - 192.26.238.255 at 192.26.239.0 - 192.26.239.255 pt -192.26.240.0 - 192.30.127.255 us +192.26.240.0 - 192.28.64.255 us +192.28.65.0 - 192.28.65.255 eu +192.28.66.0 - 192.28.119.255 us +192.28.120.0 - 192.28.123.255 au +192.28.124.0 - 192.28.124.255 gb +192.28.125.0 - 192.30.39.255 us +192.30.40.0 - 192.30.43.255 pr +192.30.44.0 - 192.30.51.255 us +192.30.52.0 - 192.30.52.255 ca +192.30.53.0 - 192.30.87.255 us +192.30.88.0 - 192.30.89.255 ca +192.30.90.0 - 192.30.96.255 us +192.30.97.0 - 192.30.99.255 ca +192.30.100.0 - 192.30.123.255 us +192.30.124.0 - 192.30.124.255 ai +192.30.125.0 - 192.30.141.255 us 192.30.142.0 - 192.30.142.255 ca -192.30.147.0 - 192.30.148.255 us +192.30.143.0 - 192.30.148.255 us 192.30.149.0 - 192.30.149.255 ca -192.30.191.0 - 192.30.191.255 us -192.30.200.0 - 192.30.200.255 us +192.30.150.0 - 192.30.175.255 us +192.30.176.0 - 192.30.179.255 gb +192.30.180.0 - 192.30.201.255 us 192.30.202.0 - 192.30.202.255 ca -192.30.206.0 - 192.30.209.255 us +192.30.203.0 - 192.30.225.255 us 192.30.226.0 - 192.30.226.255 ca +192.30.227.0 - 192.30.231.255 us +192.30.232.0 - 192.30.239.255 ca 192.30.240.0 - 192.31.5.255 us 192.31.6.0 - 192.31.6.255 ca 192.31.7.0 - 192.31.13.255 us 192.31.14.0 - 192.31.14.255 de -192.31.16.0 - 192.31.22.255 us +192.31.15.0 - 192.31.22.255 us 192.31.23.0 - 192.31.23.255 be 192.31.24.0 - 192.31.25.255 us -192.31.26.0 - 192.31.26.255 gb -192.31.27.0 - 192.31.27.255 fr +192.31.26.0 - 192.31.27.255 nl 192.31.28.0 - 192.31.30.255 us -192.31.31.0 - 192.31.31.255 gb -192.31.32.0 - 192.31.39.255 us +192.31.31.0 - 192.31.31.255 nl +192.31.32.0 - 192.31.36.255 us +192.31.37.0 - 192.31.37.255 au +192.31.38.0 - 192.31.39.255 us 192.31.40.0 - 192.31.40.255 be -192.31.41.0 - 192.31.48.255 us +192.31.41.0 - 192.31.51.255 us +192.31.52.0 - 192.31.55.255 ca +192.31.56.0 - 192.31.61.255 us 192.31.62.0 - 192.31.62.255 gb 192.31.63.0 - 192.31.101.255 us -192.31.102.0 - 192.31.102.255 de -192.31.104.0 - 192.31.115.255 us -192.31.116.0 - 192.31.127.255 jp -192.31.144.0 - 192.31.164.255 us +192.31.102.0 - 192.31.102.255 nl +192.31.103.0 - 192.31.115.255 us +192.31.116.0 - 192.31.124.255 jp +192.31.125.0 - 192.31.165.255 us 192.31.166.0 - 192.31.171.255 nl -192.31.172.0 - 192.31.179.255 us +192.31.172.0 - 192.31.176.255 us +192.31.177.0 - 192.31.177.255 ca +192.31.178.0 - 192.31.179.255 us 192.31.180.0 - 192.31.180.255 ca -192.31.181.0 - 192.31.181.255 us -192.31.191.0 - 192.31.196.255 us +192.31.181.0 - 192.31.196.255 us 192.31.197.0 - 192.31.206.255 jp -192.31.207.0 - 192.31.207.255 us -192.31.209.0 - 192.31.210.255 us -192.31.211.0 - 192.31.211.255 fr -192.31.212.0 - 192.31.223.255 us -192.31.224.0 - 192.31.224.255 ca -192.31.225.0 - 192.31.227.255 us +192.31.207.0 - 192.31.210.255 us +192.31.211.0 - 192.31.211.255 nl +192.31.212.0 - 192.31.227.255 us +192.31.228.0 - 192.31.228.255 ca 192.31.229.0 - 192.31.230.255 us 192.31.231.0 - 192.31.231.255 nl -192.31.232.0 - 192.31.251.255 us +192.31.232.0 - 192.31.250.255 us +192.31.251.0 - 192.31.251.255 ca 192.31.252.0 - 192.31.252.255 fr -192.31.253.0 - 192.31.254.255 us -192.32.0.0 - 192.33.9.255 us -192.33.10.0 - 192.33.10.255 za -192.33.12.0 - 192.33.14.255 us -192.33.15.0 - 192.33.15.255 fr +192.31.253.0 - 192.32.34.127 us +192.32.34.128 - 192.32.34.159 ie +192.32.34.160 - 192.32.40.15 us +192.32.40.16 - 192.32.40.47 gb +192.32.40.48 - 192.32.40.167 us +192.32.40.168 - 192.32.40.175 ie +192.32.40.176 - 192.32.42.167 us +192.32.42.168 - 192.32.42.175 ie +192.32.42.176 - 192.32.43.23 us +192.32.43.24 - 192.32.43.31 nl +192.32.43.32 - 192.32.43.111 us +192.32.43.112 - 192.32.43.135 ie +192.32.43.136 - 192.32.43.143 us +192.32.43.144 - 192.32.43.151 ie +192.32.43.152 - 192.32.43.191 nl +192.32.43.192 - 192.32.51.23 us +192.32.51.24 - 192.32.51.31 sg +192.32.51.32 - 192.33.9.255 us +192.33.10.0 - 192.33.10.255 mu +192.33.11.0 - 192.33.14.255 us +192.33.15.0 - 192.33.15.255 nl 192.33.16.0 - 192.33.16.255 gb -192.33.19.0 - 192.33.23.255 us -192.33.32.0 - 192.33.35.255 us +192.33.17.0 - 192.33.29.255 us +192.33.30.0 - 192.33.30.255 de +192.33.31.0 - 192.33.35.255 us 192.33.36.0 - 192.33.36.255 nl 192.33.37.0 - 192.33.86.255 us 192.33.87.0 - 192.33.111.255 ch @@ -85458,64 +75235,85 @@ 192.33.115.0 - 192.33.117.255 us 192.33.118.0 - 192.33.127.255 ch 192.33.128.0 - 192.33.129.255 us -192.33.130.0 - 192.33.130.255 gb -192.33.131.0 - 192.33.131.255 nl -192.33.134.0 - 192.33.134.255 us +192.33.130.0 - 192.33.131.255 nl +192.33.132.0 - 192.33.134.255 us 192.33.135.0 - 192.33.135.255 jp 192.33.136.0 - 192.33.142.255 us -192.33.143.0 - 192.33.182.255 fr +192.33.143.0 - 192.33.143.255 nl +192.33.144.0 - 192.33.145.255 fr +192.33.146.0 - 192.33.146.255 us +192.33.147.0 - 192.33.166.255 fr +192.33.167.0 - 192.33.168.255 us +192.33.169.0 - 192.33.171.255 fr +192.33.172.0 - 192.33.175.255 a2 +192.33.176.0 - 192.33.182.255 fr 192.33.183.0 - 192.33.191.255 us 192.33.192.0 - 192.33.231.255 ch 192.33.232.0 - 192.33.232.255 us 192.33.233.0 - 192.33.233.255 nl -192.33.234.0 - 192.33.251.255 us -192.33.253.0 - 192.33.253.255 us -192.33.254.0 - 192.33.254.255 de -192.34.19.0 - 192.34.19.255 gb -192.34.25.0 - 192.34.25.255 us -192.34.35.0 - 192.34.35.255 us -192.34.50.0 - 192.34.50.255 gb +192.33.234.0 - 192.33.253.255 us +192.33.254.0 - 192.33.254.255 nl +192.33.255.0 - 192.34.18.255 us +192.34.19.0 - 192.34.19.255 nl +192.34.20.0 - 192.34.25.255 us +192.34.26.0 - 192.34.27.255 ca +192.34.28.0 - 192.34.35.255 us +192.34.36.0 - 192.34.39.255 ca +192.34.40.0 - 192.34.49.255 us +192.34.50.0 - 192.34.50.255 nl +192.34.51.0 - 192.34.51.255 us +192.34.52.0 - 192.34.55.255 ca +192.34.56.0 - 192.34.69.255 us 192.34.70.0 - 192.34.70.255 ca -192.34.71.0 - 192.34.72.255 us -192.34.90.0 - 192.34.90.255 us +192.34.71.0 - 192.34.75.255 us +192.34.76.0 - 192.34.76.63 ca +192.34.76.64 - 192.34.76.79 us +192.34.76.80 - 192.34.79.255 ca +192.34.80.0 - 192.34.91.255 us +192.34.92.0 - 192.34.95.255 ca +192.34.96.0 - 192.34.106.255 us 192.34.107.0 - 192.34.107.255 se +192.34.108.0 - 192.34.115.255 us 192.34.116.0 - 192.34.116.255 nl -192.34.145.0 - 192.34.145.255 us -192.34.169.0 - 192.34.169.255 us +192.34.118.0 - 192.34.178.255 us 192.34.179.0 - 192.34.179.255 fi -192.34.180.0 - 192.34.199.255 ca -192.34.212.0 - 192.34.215.255 us -192.34.224.0 - 192.34.255.255 us -192.35.0.0 - 192.35.19.255 de +192.34.180.0 - 192.34.180.255 us +192.34.181.0 - 192.34.195.255 ca +192.34.196.0 - 192.34.198.255 us +192.34.199.0 - 192.34.199.255 ca +192.34.200.0 - 192.34.215.255 us +192.34.216.0 - 192.34.231.255 ca +192.34.232.0 - 192.34.255.255 us +192.35.0.0 - 192.35.17.15 de +192.35.17.16 - 192.35.17.16 ch +192.35.17.17 - 192.35.19.255 de 192.35.20.0 - 192.35.58.255 us 192.35.59.0 - 192.35.59.255 au -192.35.60.0 - 192.35.60.255 us -192.35.62.0 - 192.35.62.255 us +192.35.60.0 - 192.35.62.255 us 192.35.63.0 - 192.35.72.255 de 192.35.73.0 - 192.35.89.255 us -192.35.90.0 - 192.35.90.255 de +192.35.90.0 - 192.35.90.255 nl 192.35.91.0 - 192.35.93.255 us -192.35.94.0 - 192.35.94.255 gb +192.35.94.0 - 192.35.94.255 nl 192.35.95.0 - 192.35.107.255 us -192.35.108.0 - 192.35.108.255 gb +192.35.108.0 - 192.35.108.255 nl 192.35.109.0 - 192.35.129.255 us 192.35.130.0 - 192.35.133.255 nl 192.35.134.0 - 192.35.137.255 us 192.35.138.0 - 192.35.138.255 gb -192.35.140.0 - 192.35.143.255 us +192.35.139.0 - 192.35.143.255 us 192.35.144.0 - 192.35.144.255 ca 192.35.145.0 - 192.35.145.255 us -192.35.146.0 - 192.35.146.255 it +192.35.146.0 - 192.35.146.255 nl 192.35.147.0 - 192.35.148.255 us 192.35.149.0 - 192.35.153.255 de 192.35.154.0 - 192.35.171.255 us 192.35.172.0 - 192.35.172.255 gb -192.35.173.0 - 192.35.180.255 us -192.35.182.0 - 192.35.182.255 us +192.35.173.0 - 192.35.182.255 us 192.35.183.0 - 192.35.192.255 nl 192.35.193.0 - 192.35.196.255 us 192.35.197.0 - 192.35.198.255 gb -192.35.204.0 - 192.35.204.255 us +192.35.199.0 - 192.35.204.255 us 192.35.205.0 - 192.35.206.255 gb 192.35.207.0 - 192.35.207.255 ie 192.35.208.0 - 192.35.228.255 us @@ -85523,10 +75321,11 @@ 192.35.230.0 - 192.35.239.255 us 192.35.240.0 - 192.35.244.255 at 192.35.245.0 - 192.35.245.255 us -192.35.246.0 - 192.35.246.255 pt -192.35.247.0 - 192.35.247.255 nl +192.35.246.0 - 192.35.246.4 nl +192.35.246.5 - 192.35.246.5 pt +192.35.246.6 - 192.35.247.255 nl 192.35.248.0 - 192.35.248.255 au -192.35.251.0 - 192.35.255.255 us +192.35.249.0 - 192.35.255.255 us 192.36.0.0 - 192.36.0.255 gb 192.36.1.0 - 192.36.3.255 se 192.36.4.0 - 192.36.4.255 gb @@ -85534,7 +75333,12 @@ 192.36.6.0 - 192.36.6.255 gb 192.36.7.0 - 192.36.16.255 se 192.36.17.0 - 192.36.17.255 us -192.36.18.0 - 192.36.65.255 se +192.36.18.0 - 192.36.37.255 se +192.36.38.0 - 192.36.39.255 at +192.36.40.0 - 192.36.55.255 se +192.36.56.0 - 192.36.56.255 at +192.36.57.0 - 192.36.57.255 is +192.36.58.0 - 192.36.65.255 se 192.36.66.0 - 192.36.67.255 gb 192.36.68.0 - 192.36.84.255 se 192.36.85.0 - 192.36.85.255 gb @@ -85546,8 +75350,10 @@ 192.36.102.0 - 192.36.102.255 no 192.36.103.0 - 192.36.104.255 se 192.36.105.0 - 192.36.105.255 gb -192.36.106.0 - 192.36.120.255 se -192.36.121.0 - 192.36.124.255 gb +192.36.106.0 - 192.36.109.255 se +192.36.110.0 - 192.36.110.255 fr +192.36.111.0 - 192.36.121.255 se +192.36.122.0 - 192.36.124.255 gb 192.36.125.0 - 192.36.127.255 se 192.36.128.0 - 192.36.128.255 no 192.36.129.0 - 192.36.140.255 se @@ -85557,7 +75363,8 @@ 192.36.168.0 - 192.36.168.255 de 192.36.169.0 - 192.36.169.255 se 192.36.170.0 - 192.36.170.255 es -192.36.171.0 - 192.36.178.255 se +192.36.171.0 - 192.36.176.255 se +192.36.177.0 - 192.36.178.255 fr 192.36.179.0 - 192.36.179.255 gb 192.36.180.0 - 192.36.193.255 se 192.36.194.0 - 192.36.194.255 us @@ -85569,7 +75376,10 @@ 192.36.209.0 - 192.36.209.255 gb 192.36.210.0 - 192.36.218.255 se 192.36.219.0 - 192.36.219.255 gb -192.36.220.0 - 192.36.239.255 se +192.36.220.0 - 192.36.232.255 se +192.36.233.0 - 192.36.233.255 de +192.36.234.0 - 192.36.234.255 fr +192.36.235.0 - 192.36.239.255 se 192.36.240.0 - 192.36.240.255 it 192.36.241.0 - 192.36.242.255 se 192.36.243.0 - 192.36.243.255 it @@ -85579,21 +75389,39 @@ 192.36.255.0 - 192.36.255.255 gb 192.37.0.0 - 192.37.255.255 ch 192.38.0.0 - 192.38.255.255 dk -192.39.0.0 - 192.39.165.255 us -192.39.166.0 - 192.39.166.255 at -192.39.167.0 - 192.40.63.255 us -192.40.65.0 - 192.40.65.255 us +192.39.0.0 - 192.40.31.255 us +192.40.32.0 - 192.40.39.255 ca +192.40.40.0 - 192.40.65.255 us +192.40.66.0 - 192.40.67.255 ca +192.40.68.0 - 192.40.68.255 us +192.40.69.0 - 192.40.69.255 ae +192.40.70.0 - 192.40.71.255 hr 192.40.72.0 - 192.40.79.255 fi -192.40.96.0 - 192.40.159.255 us -192.40.201.0 - 192.40.201.255 us +192.40.80.0 - 192.40.80.255 gb +192.40.81.0 - 192.40.81.255 ca +192.40.82.0 - 192.40.83.255 us +192.40.84.0 - 192.40.87.255 bm +192.40.88.0 - 192.40.88.255 no +192.40.89.0 - 192.40.89.255 dk +192.40.90.0 - 192.40.94.255 us +192.40.95.0 - 192.40.95.255 fi +192.40.96.0 - 192.40.103.255 ca +192.40.104.0 - 192.40.135.255 us +192.40.136.0 - 192.40.139.255 ca +192.40.140.0 - 192.40.141.255 us +192.40.142.0 - 192.40.142.255 ca +192.40.143.0 - 192.40.216.255 us 192.40.217.0 - 192.40.217.255 ca +192.40.218.0 - 192.40.227.255 us 192.40.228.0 - 192.40.228.255 fi -192.40.244.0 - 192.40.249.255 us +192.40.229.0 - 192.40.231.255 us +192.40.232.0 - 192.40.243.255 ca +192.40.244.0 - 192.40.253.255 us 192.40.254.0 - 192.40.254.255 ca -192.41.0.0 - 192.41.101.255 us +192.41.0.0 - 192.41.102.255 us 192.41.103.0 - 192.41.131.255 gb 192.41.132.0 - 192.41.136.255 ch -192.41.137.0 - 192.41.137.255 us +192.41.137.0 - 192.41.139.255 us 192.41.140.0 - 192.41.140.255 nl 192.41.141.0 - 192.41.145.255 ch 192.41.146.0 - 192.41.146.255 au @@ -85601,105 +75429,101 @@ 192.41.148.0 - 192.41.148.255 ca 192.41.149.0 - 192.41.160.255 ch 192.41.161.0 - 192.41.169.255 us -192.41.170.0 - 192.41.170.255 th -192.41.171.0 - 192.41.176.255 us +192.41.170.0 - 192.41.170.255 au +192.41.171.0 - 192.41.177.255 us 192.41.178.0 - 192.41.197.255 jp 192.41.198.0 - 192.41.199.255 us -192.41.201.0 - 192.41.201.255 ca +192.41.200.0 - 192.41.201.255 ca 192.41.202.0 - 192.41.202.255 us 192.41.203.0 - 192.41.203.255 au 192.41.204.0 - 192.41.205.255 us 192.41.206.0 - 192.41.206.255 id 192.41.207.0 - 192.41.209.255 us -192.41.210.0 - 192.41.210.255 gb +192.41.210.0 - 192.41.210.255 nl 192.41.211.0 - 192.41.215.255 us +192.41.216.0 - 192.41.216.255 nl 192.41.217.0 - 192.41.217.255 us -192.41.218.0 - 192.41.218.255 it -192.41.219.0 - 192.41.225.255 us +192.41.218.0 - 192.41.218.255 nl +192.41.219.0 - 192.41.226.255 us 192.41.227.0 - 192.41.227.255 de -192.41.228.0 - 192.41.255.255 us -192.42.1.0 - 192.42.1.255 de -192.42.3.0 - 192.42.4.255 us +192.41.228.0 - 192.42.0.255 us +192.42.1.0 - 192.42.1.255 nl +192.42.2.0 - 192.42.4.255 us 192.42.5.0 - 192.42.6.255 ca 192.42.7.0 - 192.42.41.255 us 192.42.42.0 - 192.42.47.255 ch 192.42.48.0 - 192.42.51.255 us 192.42.52.0 - 192.42.52.255 au -192.42.53.0 - 192.42.53.255 gb +192.42.53.0 - 192.42.53.255 nl 192.42.54.0 - 192.42.54.255 ca 192.42.55.0 - 192.42.59.255 us 192.42.60.0 - 192.42.62.255 au 192.42.63.0 - 192.42.64.255 de -192.42.65.0 - 192.42.65.255 no 192.42.66.0 - 192.42.67.255 us 192.42.68.0 - 192.42.68.255 ca -192.42.69.0 - 192.42.70.255 us -192.42.72.0 - 192.42.83.255 us -192.42.84.0 - 192.42.86.255 jp -192.42.87.0 - 192.42.87.255 gb +192.42.69.0 - 192.42.71.255 us +192.42.72.0 - 192.42.73.255 ca +192.42.74.0 - 192.42.83.255 us +192.42.87.0 - 192.42.87.255 nl 192.42.88.0 - 192.42.89.255 us 192.42.90.0 - 192.42.90.255 ca -192.42.91.0 - 192.42.95.255 us -192.42.97.0 - 192.42.98.255 us +192.42.91.0 - 192.42.98.255 us 192.42.99.0 - 192.42.99.255 za 192.42.100.0 - 192.42.100.255 gb 192.42.101.0 - 192.42.101.255 us -192.42.102.0 - 192.42.102.255 fr +192.42.102.0 - 192.42.102.255 nl 192.42.103.0 - 192.42.107.255 jp -192.42.108.0 - 192.42.111.255 us -192.42.112.0 - 192.42.132.255 nl +192.42.108.0 - 192.42.112.255 us +192.42.113.0 - 192.42.132.255 nl 192.42.133.0 - 192.42.142.255 us 192.42.143.0 - 192.42.143.255 de 192.42.144.0 - 192.42.150.255 us 192.42.151.0 - 192.42.151.255 au -192.42.152.0 - 192.42.175.255 us -192.42.179.0 - 192.42.179.255 us +192.42.152.0 - 192.42.179.255 us 192.42.180.0 - 192.42.201.255 ch 192.42.202.0 - 192.42.204.255 ca +192.42.205.0 - 192.42.205.255 us 192.42.206.0 - 192.42.206.255 ca 192.42.207.0 - 192.42.236.255 us 192.42.237.0 - 192.42.237.255 jp -192.42.238.0 - 192.42.252.255 us -192.42.253.0 - 192.42.253.255 de -192.42.254.0 - 192.42.254.255 us -192.43.0.0 - 192.43.161.255 us +192.42.238.0 - 192.43.161.255 us 192.43.162.0 - 192.43.171.255 se 192.43.172.0 - 192.43.173.255 us -192.43.174.0 - 192.43.174.255 jp +192.43.174.0 - 192.43.174.255 au 192.43.175.0 - 192.43.184.255 us 192.43.185.0 - 192.43.185.255 au -192.43.188.0 - 192.43.188.255 us -192.43.189.0 - 192.43.189.255 jp +192.43.186.0 - 192.43.188.255 us +192.43.189.0 - 192.43.189.255 au +192.43.190.0 - 192.43.190.255 ca 192.43.191.0 - 192.43.191.255 us 192.43.192.0 - 192.43.196.255 ch 192.43.197.0 - 192.43.197.255 us 192.43.198.0 - 192.43.198.255 au 192.43.199.0 - 192.43.200.255 us -192.43.201.0 - 192.43.202.255 jp -192.43.203.0 - 192.43.205.255 us +192.43.201.0 - 192.43.202.255 au +192.43.203.0 - 192.43.206.255 us 192.43.207.0 - 192.43.209.255 au 192.43.210.0 - 192.43.210.255 nl 192.43.211.0 - 192.43.211.255 us 192.43.212.0 - 192.43.212.255 nl -192.43.213.0 - 192.43.214.255 us -192.43.216.0 - 192.43.218.255 us +192.43.213.0 - 192.43.218.255 us 192.43.219.0 - 192.43.219.255 ca -192.43.220.0 - 192.43.223.255 us -192.43.225.0 - 192.43.225.255 us +192.43.220.0 - 192.43.225.255 us 192.43.226.0 - 192.43.229.255 au -192.43.234.0 - 192.43.234.255 gb -192.43.235.0 - 192.43.237.255 us +192.43.230.0 - 192.43.233.255 us +192.43.234.0 - 192.43.234.255 nl +192.43.235.0 - 192.43.238.255 us 192.43.239.0 - 192.43.239.255 au 192.43.240.0 - 192.43.255.255 us -192.44.0.0 - 192.44.40.255 de -192.44.41.0 - 192.44.80.255 fr +192.44.0.0 - 192.44.0.255 nl +192.44.1.0 - 192.44.40.255 de +192.44.41.0 - 192.44.67.255 fr +192.44.68.0 - 192.44.70.255 us +192.44.71.0 - 192.44.80.255 fr 192.44.81.0 - 192.44.90.255 de 192.44.91.0 - 192.44.239.255 us 192.44.240.0 - 192.44.251.255 se -192.44.252.0 - 192.46.69.255 us -192.46.70.0 - 192.46.70.255 fi -192.46.71.0 - 192.46.71.255 be -192.46.72.0 - 192.46.187.255 us +192.44.252.0 - 192.46.187.255 us 192.46.188.0 - 192.46.190.255 de 192.46.191.0 - 192.46.242.255 us 192.46.243.0 - 192.46.243.255 ca @@ -85707,176 +75531,188 @@ 192.47.0.0 - 192.47.241.255 jp 192.47.242.0 - 192.47.243.255 us 192.47.244.0 - 192.47.249.255 ch -192.47.250.0 - 192.48.30.255 us -192.48.31.0 - 192.48.31.255 de -192.48.32.0 - 192.48.104.255 us -192.48.106.0 - 192.48.106.255 us +192.47.250.0 - 192.47.252.255 us +192.47.253.0 - 192.47.253.255 ca +192.47.254.0 - 192.47.254.255 us +192.47.255.0 - 192.47.255.255 ca +192.48.0.0 - 192.48.7.255 us +192.48.8.0 - 192.48.8.255 au +192.48.9.0 - 192.48.9.255 us +192.48.10.0 - 192.48.10.255 au +192.48.11.0 - 192.48.30.255 us +192.48.31.0 - 192.48.31.255 nl +192.48.32.0 - 192.48.106.255 us 192.48.107.0 - 192.48.107.255 de 192.48.108.0 - 192.48.108.255 us 192.48.109.0 - 192.48.110.255 au -192.48.111.0 - 192.48.139.255 us +192.48.111.0 - 192.48.140.255 us 192.48.141.0 - 192.48.141.255 ca -192.48.143.0 - 192.48.144.255 us -192.48.145.0 - 192.48.145.255 de -192.48.146.0 - 192.48.223.255 us -192.48.224.0 - 192.48.224.255 de -192.48.225.0 - 192.48.229.255 us -192.48.231.0 - 192.48.231.255 de -192.48.232.0 - 192.48.232.255 us +192.48.142.0 - 192.48.144.255 us +192.48.145.0 - 192.48.145.255 nl +192.48.146.0 - 192.48.219.255 us +192.48.220.0 - 192.48.220.255 ca +192.48.221.0 - 192.48.223.255 us +192.48.224.0 - 192.48.224.255 nl +192.48.225.0 - 192.48.230.255 us +192.48.231.0 - 192.48.231.255 nl +192.48.232.0 - 192.48.233.255 us 192.48.234.0 - 192.48.234.255 ca -192.48.235.0 - 192.48.235.255 us -192.48.238.0 - 192.48.238.255 us -192.48.240.0 - 192.48.247.255 us +192.48.235.0 - 192.48.247.255 us 192.48.248.0 - 192.48.248.255 au 192.48.249.0 - 192.48.252.255 us -192.48.253.0 - 192.48.253.255 za -192.48.254.0 - 192.48.254.255 us +192.48.253.0 - 192.48.253.255 mu +192.48.254.0 - 192.48.255.255 us 192.49.0.0 - 192.49.255.255 fi 192.50.0.0 - 192.50.255.255 jp 192.51.0.0 - 192.51.15.255 no -192.51.16.0 - 192.51.255.255 jp +192.51.16.0 - 192.51.47.255 jp +192.51.48.0 - 192.51.48.255 us +192.51.49.0 - 192.51.191.255 jp +192.51.192.0 - 192.51.193.255 us +192.51.194.0 - 192.51.255.255 jp 192.52.0.0 - 192.52.50.255 de 192.52.51.0 - 192.52.71.255 us 192.52.72.0 - 192.52.73.255 au -192.52.76.0 - 192.52.107.255 us +192.52.74.0 - 192.52.107.255 us 192.52.108.0 - 192.52.108.255 ca -192.52.110.0 - 192.52.113.255 us -192.52.116.0 - 192.52.117.255 us -192.52.119.0 - 192.52.150.255 jp +192.52.109.0 - 192.52.119.255 us 192.52.151.0 - 192.52.151.255 us 192.52.152.0 - 192.52.152.255 nl -192.52.153.0 - 192.52.157.255 us +192.52.153.0 - 192.52.158.255 us 192.52.159.0 - 192.52.160.255 de 192.52.161.0 - 192.52.161.255 gb -192.52.163.0 - 192.52.165.255 us -192.52.170.0 - 192.52.170.255 us +192.52.162.0 - 192.52.170.255 us 192.52.171.0 - 192.52.176.255 au 192.52.177.0 - 192.52.184.255 us 192.52.185.0 - 192.52.185.255 au -192.52.186.0 - 192.52.187.255 us -192.52.192.0 - 192.52.195.255 us +192.52.186.0 - 192.52.195.255 us 192.52.196.0 - 192.52.197.255 au 192.52.198.0 - 192.52.220.255 us 192.52.221.0 - 192.52.223.255 nl 192.52.224.0 - 192.52.231.255 us -192.52.232.0 - 192.52.232.255 dz +192.52.232.0 - 192.52.232.255 nl 192.52.233.0 - 192.52.238.255 us 192.52.239.0 - 192.52.239.255 ca -192.52.240.0 - 192.52.249.255 us -192.52.252.0 - 192.52.252.255 us -192.52.253.0 - 192.52.253.255 gb -192.52.254.0 - 192.52.254.255 fr -192.53.0.0 - 192.53.0.255 us +192.52.240.0 - 192.52.252.255 us +192.52.253.0 - 192.52.254.255 nl +192.52.255.0 - 192.53.0.255 us 192.53.1.0 - 192.53.2.255 be 192.53.3.0 - 192.53.102.255 us -192.53.103.0 - 192.53.103.255 de -192.53.104.0 - 192.53.104.255 ch +192.53.103.0 - 192.53.104.255 nl 192.53.105.0 - 192.53.156.255 us 192.53.157.0 - 192.53.157.255 fi 192.53.158.0 - 192.54.30.255 us -192.54.31.0 - 192.54.80.255 de +192.54.31.0 - 192.54.46.255 de +192.54.47.0 - 192.54.47.255 gb +192.54.48.0 - 192.54.52.255 de +192.54.53.0 - 192.54.53.255 us +192.54.60.0 - 192.54.80.255 de 192.54.81.0 - 192.54.103.255 us -192.54.104.0 - 192.54.104.255 de +192.54.104.0 - 192.54.104.255 nl 192.54.105.0 - 192.54.106.255 au 192.54.107.0 - 192.54.112.255 us -192.54.113.0 - 192.54.113.255 de +192.54.113.0 - 192.54.113.255 nl 192.54.114.0 - 192.54.114.255 us 192.54.115.0 - 192.54.120.255 dk 192.54.121.0 - 192.54.121.255 ca 192.54.122.0 - 192.54.122.255 ch -192.54.124.0 - 192.54.124.255 us +192.54.123.0 - 192.54.124.255 us 192.54.125.0 - 192.54.128.255 de 192.54.129.0 - 192.54.129.255 us -192.54.130.0 - 192.54.130.255 nz +192.54.130.0 - 192.54.130.255 au 192.54.131.0 - 192.54.131.255 us -192.54.132.0 - 192.54.132.255 ch +192.54.132.0 - 192.54.132.255 nl 192.54.133.0 - 192.54.134.255 us 192.54.135.0 - 192.54.135.255 au +192.54.136.0 - 192.54.136.255 us 192.54.137.0 - 192.54.137.255 au 192.54.138.0 - 192.54.138.255 us 192.54.139.0 - 192.54.139.255 de -192.54.140.0 - 192.54.203.255 fr -192.54.204.0 - 192.54.204.255 eu +192.54.140.0 - 192.54.140.255 us +192.54.141.0 - 192.54.203.255 fr +192.54.204.0 - 192.54.204.255 il 192.54.205.0 - 192.54.219.255 fr +192.54.220.0 - 192.54.220.255 pl 192.54.221.0 - 192.54.221.255 de 192.54.222.0 - 192.54.224.255 us -192.54.225.0 - 192.54.225.255 se -192.54.226.0 - 192.54.226.255 us -192.54.228.0 - 192.54.241.255 us +192.54.225.0 - 192.54.225.255 nl +192.54.226.0 - 192.54.241.255 us 192.54.242.0 - 192.54.242.255 ca 192.54.243.0 - 192.54.243.255 us -192.54.244.0 - 192.54.244.255 ch -192.54.245.0 - 192.54.245.255 gb +192.54.244.0 - 192.54.245.255 nl 192.54.246.0 - 192.54.246.255 us -192.54.247.0 - 192.54.247.255 jp +192.54.247.0 - 192.54.247.255 au 192.54.248.0 - 192.54.250.255 us 192.54.251.0 - 192.54.251.255 au -192.54.253.0 - 192.54.253.255 us -192.54.254.0 - 192.54.254.255 de -192.55.0.0 - 192.55.83.255 us -192.55.84.0 - 192.55.84.255 de -192.55.86.0 - 192.55.88.255 us -192.55.89.0 - 192.55.89.255 de -192.55.90.0 - 192.55.95.255 us -192.55.97.0 - 192.55.97.255 us +192.54.252.0 - 192.54.253.255 us +192.54.254.0 - 192.54.254.255 nl +192.54.255.0 - 192.55.15.255 us +192.55.16.0 - 192.55.16.255 sg +192.55.17.0 - 192.55.17.255 us +192.55.18.0 - 192.55.18.255 th +192.55.19.0 - 192.55.36.255 us +192.55.37.0 - 192.55.37.255 eu +192.55.38.0 - 192.55.83.255 us +192.55.84.0 - 192.55.84.255 nl +192.55.85.0 - 192.55.88.255 us +192.55.89.0 - 192.55.89.255 nl +192.55.90.0 - 192.55.97.255 us 192.55.98.0 - 192.55.99.255 au 192.55.100.0 - 192.55.100.255 us 192.55.101.0 - 192.55.101.255 it -192.55.102.0 - 192.55.103.255 us +192.55.102.0 - 192.55.104.255 us 192.55.105.0 - 192.55.105.255 nl 192.55.106.0 - 192.55.108.255 us -192.55.109.0 - 192.55.109.255 eu -192.55.110.0 - 192.55.110.255 jp +192.55.109.0 - 192.55.109.255 pl +192.55.110.0 - 192.55.110.255 au 192.55.111.0 - 192.55.111.255 us 192.55.112.0 - 192.55.112.255 au 192.55.113.0 - 192.55.114.255 us 192.55.115.0 - 192.55.115.255 nl 192.55.116.0 - 192.55.117.255 us -192.55.118.0 - 192.55.118.255 jp -192.55.120.0 - 192.55.127.255 us +192.55.118.0 - 192.55.118.255 au +192.55.119.0 - 192.55.119.255 ca +192.55.120.0 - 192.55.128.255 us 192.55.129.0 - 192.55.129.255 nl +192.55.130.0 - 192.55.130.255 ca 192.55.131.0 - 192.55.131.255 us 192.55.132.0 - 192.55.132.255 gb -192.55.133.0 - 192.55.187.255 us -192.55.188.0 - 192.55.188.255 de +192.55.133.0 - 192.55.156.255 us +192.55.157.0 - 192.55.157.255 eu +192.55.158.0 - 192.55.187.255 us +192.55.188.0 - 192.55.188.255 nl 192.55.189.0 - 192.55.189.255 us 192.55.190.0 - 192.55.190.255 au -192.55.193.0 - 192.55.193.255 gb +192.55.191.0 - 192.55.192.255 us +192.55.193.0 - 192.55.193.255 nl 192.55.194.0 - 192.55.194.255 ca 192.55.195.0 - 192.55.196.255 us -192.55.197.0 - 192.55.197.255 de +192.55.197.0 - 192.55.197.255 nl 192.55.198.0 - 192.55.198.255 au -192.55.199.0 - 192.55.204.255 us +192.55.199.0 - 192.55.205.255 us 192.55.206.0 - 192.55.206.255 ca 192.55.207.0 - 192.55.208.255 us 192.55.209.0 - 192.55.209.255 au 192.55.210.0 - 192.55.211.255 us -192.55.212.0 - 192.55.212.255 gb -192.55.213.0 - 192.55.214.255 us +192.55.212.0 - 192.55.212.255 nl +192.55.213.0 - 192.55.215.255 us 192.55.216.0 - 192.55.216.255 ca -192.55.218.0 - 192.55.218.255 us +192.55.217.0 - 192.55.218.255 us 192.55.219.0 - 192.55.219.255 au 192.55.220.0 - 192.55.220.255 jp 192.55.221.0 - 192.55.223.255 us 192.55.224.0 - 192.55.224.255 ca -192.55.226.0 - 192.55.231.255 us +192.55.225.0 - 192.55.231.255 us 192.55.232.0 - 192.55.232.255 au 192.55.233.0 - 192.55.237.255 us -192.55.238.0 - 192.55.238.255 jp -192.55.239.0 - 192.55.240.255 us -192.55.243.0 - 192.55.243.255 ca -192.55.244.0 - 192.55.244.255 de -192.55.246.0 - 192.55.246.255 us -192.55.248.0 - 192.55.249.255 us -192.56.0.0 - 192.56.13.255 us +192.55.238.0 - 192.55.238.255 au +192.55.239.0 - 192.55.243.255 us +192.55.244.0 - 192.55.244.255 nl +192.55.245.0 - 192.56.13.255 us 192.56.14.0 - 192.56.14.255 at 192.56.15.0 - 192.56.50.255 us 192.56.51.0 - 192.56.51.255 ca -192.56.52.0 - 192.56.99.255 us -192.56.100.0 - 192.56.100.255 fi -192.56.101.0 - 192.56.127.255 us -192.56.128.0 - 192.56.128.255 fi -192.56.129.0 - 192.56.149.255 us +192.56.52.0 - 192.56.149.255 us 192.56.150.0 - 192.56.150.255 de 192.56.151.0 - 192.56.243.255 us 192.56.244.0 - 192.56.244.255 ca @@ -85884,173 +75720,210 @@ 192.58.9.0 - 192.58.18.255 jp 192.58.19.0 - 192.58.27.255 us 192.58.28.0 - 192.58.28.255 lu +192.58.29.0 - 192.58.29.255 ae +192.58.30.0 - 192.58.31.255 fi +192.58.32.0 - 192.58.35.255 bg 192.58.36.0 - 192.58.40.255 us -192.58.41.0 - 192.58.95.255 fi -192.58.96.0 - 192.58.101.255 jp -192.58.102.0 - 192.58.120.255 us +192.58.41.0 - 192.58.89.255 fi +192.58.90.0 - 192.58.120.255 us 192.58.121.0 - 192.58.121.255 ca -192.58.122.0 - 192.58.131.255 us -192.58.132.0 - 192.58.136.255 au -192.58.144.0 - 192.58.196.255 us +192.58.122.0 - 192.58.132.255 us +192.58.133.0 - 192.58.136.255 au +192.58.137.0 - 192.58.139.255 us +192.58.140.0 - 192.58.141.255 vc +192.58.142.0 - 192.58.142.255 lc +192.58.143.0 - 192.58.143.255 vc +192.58.144.0 - 192.58.193.255 us +192.58.194.0 - 192.58.194.255 ca +192.58.195.0 - 192.58.196.255 us 192.58.197.0 - 192.58.197.255 se -192.58.199.0 - 192.58.212.255 us +192.58.198.0 - 192.58.212.255 us 192.58.213.0 - 192.58.213.255 ca -192.58.215.0 - 192.58.217.255 us -192.58.218.0 - 192.58.218.255 it -192.58.220.0 - 192.58.226.255 us +192.58.214.0 - 192.58.217.255 us +192.58.218.0 - 192.58.218.255 nl +192.58.219.0 - 192.58.226.255 us 192.58.227.0 - 192.58.228.255 nl -192.58.229.0 - 192.58.244.255 us +192.58.229.0 - 192.58.229.255 es +192.58.230.0 - 192.58.244.255 us 192.58.245.0 - 192.58.245.255 ca -192.58.246.0 - 192.62.99.255 us +192.58.246.0 - 192.58.247.255 us +192.58.248.0 - 192.58.248.255 ap +192.58.249.0 - 192.62.99.255 us 192.62.100.0 - 192.62.100.255 gb -192.62.101.0 - 192.63.255.255 us -192.64.1.0 - 192.64.1.255 us -192.64.16.0 - 192.64.17.255 us -192.64.28.0 - 192.64.28.255 at -192.64.38.0 - 192.64.38.255 ca -192.64.44.0 - 192.64.45.255 eu -192.64.46.0 - 192.64.51.255 us -192.64.64.0 - 192.64.96.255 us +192.62.101.0 - 192.64.3.255 us +192.64.4.0 - 192.64.15.255 ca +192.64.16.0 - 192.64.27.255 us +192.64.28.0 - 192.64.28.255 nl +192.64.29.0 - 192.64.29.255 us +192.64.30.0 - 192.64.31.255 ca +192.64.32.0 - 192.64.35.255 us +192.64.36.0 - 192.64.43.255 ca +192.64.44.0 - 192.64.45.255 nl +192.64.46.0 - 192.64.55.255 us +192.64.56.0 - 192.64.63.255 ca +192.64.64.0 - 192.64.99.255 us 192.64.100.0 - 192.64.103.255 be -192.64.125.0 - 192.64.125.255 se -192.64.157.0 - 192.64.158.255 us -192.64.159.0 - 192.64.167.255 ca -192.64.198.0 - 192.64.198.255 us -192.64.202.0 - 192.64.202.255 de -192.64.203.0 - 192.64.205.255 us -192.64.224.0 - 192.64.239.255 us -192.65.0.0 - 192.65.49.255 us +192.64.104.0 - 192.64.119.255 us +192.64.120.0 - 192.64.122.255 ag +192.64.123.0 - 192.64.123.255 ms +192.64.124.0 - 192.64.124.255 us +192.64.125.0 - 192.64.125.255 nl +192.64.126.0 - 192.64.127.255 us +192.64.128.0 - 192.64.143.255 ca +192.64.144.0 - 192.64.155.255 us +192.64.156.0 - 192.64.156.255 ca +192.64.157.0 - 192.64.160.255 us +192.64.161.0 - 192.64.164.255 ca +192.64.165.0 - 192.64.191.255 us +192.64.192.0 - 192.64.197.255 ca +192.64.198.0 - 192.64.201.255 us +192.64.202.0 - 192.64.202.255 nl +192.64.203.0 - 192.64.204.255 hk +192.64.205.0 - 192.65.50.255 us 192.65.51.0 - 192.65.70.255 nl -192.65.71.0 - 192.65.80.255 us +192.65.71.0 - 192.65.81.255 us 192.65.82.0 - 192.65.91.255 au 192.65.92.0 - 192.65.94.255 ch 192.65.95.0 - 192.65.95.255 us 192.65.96.0 - 192.65.96.255 nl 192.65.97.0 - 192.65.129.255 us 192.65.130.0 - 192.65.130.255 au -192.65.131.0 - 192.65.131.255 it -192.65.132.0 - 192.65.132.255 gb -192.65.135.0 - 192.65.137.255 us -192.65.139.0 - 192.65.139.255 de +192.65.131.0 - 192.65.132.255 nl +192.65.133.0 - 192.65.138.255 us +192.65.139.0 - 192.65.139.255 nl 192.65.140.0 - 192.65.143.255 us 192.65.144.0 - 192.65.146.255 gb 192.65.147.0 - 192.65.151.255 us 192.65.152.0 - 192.65.152.255 ve 192.65.153.0 - 192.65.153.255 gb -192.65.168.0 - 192.65.175.255 us +192.65.154.0 - 192.65.159.255 us +192.65.160.0 - 192.65.167.255 bb +192.65.168.0 - 192.65.169.255 us +192.65.170.0 - 192.65.170.255 vi +192.65.171.0 - 192.65.175.255 us 192.65.176.0 - 192.65.176.255 pr -192.65.177.0 - 192.65.177.255 us -192.65.179.0 - 192.65.180.255 us +192.65.177.0 - 192.65.181.255 us 192.65.182.0 - 192.65.182.255 au 192.65.183.0 - 192.65.197.255 ch 192.65.198.0 - 192.65.216.255 us 192.65.217.0 - 192.65.217.255 au 192.65.218.0 - 192.65.218.255 us -192.65.219.0 - 192.65.231.255 gb -192.65.244.0 - 192.65.247.255 us -192.65.248.0 - 192.65.248.255 nz +192.65.219.0 - 192.65.228.255 gb +192.65.229.0 - 192.65.231.255 us +192.65.232.0 - 192.65.239.255 ca +192.65.240.0 - 192.65.247.255 us +192.65.248.0 - 192.65.248.255 au 192.65.249.0 - 192.65.249.255 us 192.65.250.0 - 192.65.250.255 au 192.65.251.0 - 192.65.255.255 us 192.66.0.0 - 192.66.255.255 dk +192.67.0.0 - 192.67.0.255 us 192.67.1.0 - 192.67.1.255 au +192.67.2.0 - 192.67.2.255 us 192.67.3.0 - 192.67.3.255 ie -192.67.4.0 - 192.67.4.255 gb -192.67.6.0 - 192.67.6.255 us -192.67.8.0 - 192.67.8.255 us +192.67.4.0 - 192.67.4.255 nl +192.67.5.0 - 192.67.8.255 us 192.67.9.0 - 192.67.9.255 ca -192.67.11.0 - 192.67.11.255 us +192.67.10.0 - 192.67.11.255 us 192.67.12.0 - 192.67.12.255 au -192.67.13.0 - 192.67.23.255 us +192.67.13.0 - 192.67.31.255 us +192.67.32.0 - 192.67.35.255 ca +192.67.36.0 - 192.67.38.255 us 192.67.39.0 - 192.67.39.255 gb -192.67.41.0 - 192.67.42.255 us -192.67.43.0 - 192.67.43.255 gb +192.67.40.0 - 192.67.42.255 us +192.67.43.0 - 192.67.43.255 nl 192.67.44.0 - 192.67.44.255 us 192.67.45.0 - 192.67.45.255 ca 192.67.46.0 - 192.67.46.255 us -192.67.47.0 - 192.67.47.255 gb +192.67.47.0 - 192.67.47.255 nl 192.67.48.0 - 192.67.49.255 us -192.67.50.0 - 192.67.50.255 gb +192.67.50.0 - 192.67.50.255 nl 192.67.51.0 - 192.67.51.255 us -192.67.52.0 - 192.67.52.255 gb -192.67.53.0 - 192.67.53.255 us -192.67.55.0 - 192.67.55.255 de +192.67.52.0 - 192.67.52.255 nl +192.67.53.0 - 192.67.54.255 us +192.67.55.0 - 192.67.55.255 nl 192.67.56.0 - 192.67.57.255 us -192.67.58.0 - 192.67.58.255 se +192.67.58.0 - 192.67.58.255 nl 192.67.59.0 - 192.67.75.255 us 192.67.76.0 - 192.67.76.255 pt 192.67.77.0 - 192.67.78.255 us -192.67.79.0 - 192.67.79.255 es +192.67.79.0 - 192.67.79.255 nl 192.67.80.0 - 192.67.83.255 us 192.67.84.0 - 192.67.85.255 au 192.67.86.0 - 192.67.86.255 us 192.67.87.0 - 192.67.87.255 gb -192.67.90.0 - 192.67.93.255 us -192.67.94.0 - 192.67.94.255 gb +192.67.88.0 - 192.67.93.255 us +192.67.94.0 - 192.67.94.255 nl 192.67.95.0 - 192.67.99.255 us 192.67.100.0 - 192.67.104.255 gb 192.67.105.0 - 192.67.106.255 ca 192.67.107.0 - 192.67.134.255 us 192.67.135.0 - 192.67.135.255 gb -192.67.136.0 - 192.67.159.255 us -192.67.165.0 - 192.67.166.255 us +192.67.136.0 - 192.67.166.255 us 192.67.167.0 - 192.67.167.255 de -192.67.168.0 - 192.67.168.255 nz +192.67.168.0 - 192.67.168.255 au +192.67.169.0 - 192.67.169.255 us 192.67.170.0 - 192.67.170.255 de 192.67.171.0 - 192.67.171.255 au -192.67.172.0 - 192.67.187.255 us -192.67.188.0 - 192.67.208.255 de +192.67.172.0 - 192.67.188.255 us +192.67.189.0 - 192.67.208.255 de 192.67.209.0 - 192.67.216.255 us 192.67.217.0 - 192.67.217.255 au 192.67.218.0 - 192.67.218.255 de 192.67.219.0 - 192.67.219.255 us 192.67.220.0 - 192.67.221.255 nl +192.67.222.0 - 192.67.222.255 ca 192.67.223.0 - 192.67.223.255 ie 192.67.224.0 - 192.67.247.255 us 192.67.248.0 - 192.67.248.255 au 192.67.249.0 - 192.67.249.255 gr -192.67.251.0 - 192.67.255.255 us +192.67.250.0 - 192.67.250.255 ca +192.67.251.0 - 192.67.254.255 us +192.67.255.0 - 192.67.255.255 ca 192.68.0.0 - 192.68.3.255 de 192.68.4.0 - 192.68.4.255 at 192.68.5.0 - 192.68.19.255 de 192.68.20.0 - 192.68.22.255 us -192.68.23.0 - 192.68.23.255 gb -192.68.24.0 - 192.68.28.255 us -192.68.30.0 - 192.68.30.255 us +192.68.23.0 - 192.68.23.255 nl +192.68.24.0 - 192.68.30.255 us 192.68.31.0 - 192.68.50.255 nl -192.68.51.0 - 192.68.51.255 eu +192.68.51.0 - 192.68.51.255 pl 192.68.52.0 - 192.68.52.255 us 192.68.53.0 - 192.68.74.255 ca 192.68.75.0 - 192.68.75.255 us 192.68.76.0 - 192.68.107.255 no 192.68.108.0 - 192.68.109.255 us -192.68.110.0 - 192.68.111.255 jp -192.68.112.0 - 192.68.127.255 us +192.68.110.0 - 192.68.111.255 au +192.68.112.0 - 192.68.130.255 us 192.68.131.0 - 192.68.131.255 ca 192.68.132.0 - 192.68.132.255 au 192.68.133.0 - 192.68.136.255 us 192.68.137.0 - 192.68.137.255 ca -192.68.138.0 - 192.68.138.255 tn +192.68.138.0 - 192.68.138.255 mu 192.68.139.0 - 192.68.139.255 au -192.68.140.0 - 192.68.148.255 us +192.68.140.0 - 192.68.150.255 us 192.68.151.0 - 192.68.153.255 gb -192.68.154.0 - 192.68.163.255 us -192.68.164.0 - 192.68.169.255 de +192.68.154.0 - 192.68.162.255 us +192.68.163.0 - 192.68.163.255 ca +192.68.164.0 - 192.68.164.255 us +192.68.165.0 - 192.68.169.255 de 192.68.170.0 - 192.68.170.255 gb 192.68.171.0 - 192.68.172.255 au 192.68.173.0 - 192.68.173.255 us -192.68.174.0 - 192.68.174.255 gb +192.68.174.0 - 192.68.174.255 nl 192.68.175.0 - 192.68.175.255 us -192.68.176.0 - 192.68.176.255 it -192.68.177.0 - 192.68.177.255 us +192.68.176.0 - 192.68.176.255 nl +192.68.177.0 - 192.68.178.255 us 192.68.179.0 - 192.68.179.255 au 192.68.180.0 - 192.68.181.255 us 192.68.182.0 - 192.68.182.255 nl 192.68.183.0 - 192.68.183.255 us 192.68.184.0 - 192.68.184.255 ca 192.68.185.0 - 192.68.185.255 us -192.68.186.0 - 192.68.186.255 pt -192.68.187.0 - 192.68.207.255 us +192.68.186.0 - 192.68.186.255 nl +192.68.187.0 - 192.68.187.255 us +192.68.188.0 - 192.68.188.255 ca +192.68.189.0 - 192.68.208.255 us 192.68.209.0 - 192.68.209.255 pt 192.68.210.0 - 192.68.210.255 us 192.68.211.0 - 192.68.215.255 de @@ -86062,32 +75935,42 @@ 192.68.225.0 - 192.68.228.255 us 192.68.229.0 - 192.68.229.255 ca 192.68.230.0 - 192.68.230.255 nl -192.68.231.0 - 192.68.233.255 us +192.68.231.0 - 192.68.234.255 us 192.68.235.0 - 192.68.249.255 jp 192.68.250.0 - 192.68.252.255 nl 192.68.253.0 - 192.68.253.255 us -192.68.254.0 - 192.68.254.255 de -192.69.0.0 - 192.69.63.255 us +192.68.254.0 - 192.68.254.255 nl +192.68.255.0 - 192.69.0.255 us +192.69.1.0 - 192.69.1.255 ca +192.69.2.0 - 192.69.39.255 us +192.69.40.0 - 192.69.43.255 ca +192.69.44.0 - 192.69.63.255 us 192.69.64.0 - 192.69.64.255 be +192.69.65.0 - 192.69.67.255 us +192.69.68.0 - 192.69.71.255 ca +192.69.72.0 - 192.69.73.255 us 192.69.74.0 - 192.69.74.255 ca -192.69.80.0 - 192.69.87.255 us +192.69.75.0 - 192.69.85.255 us +192.69.86.0 - 192.69.87.255 ca +192.69.88.0 - 192.69.100.255 us 192.69.101.0 - 192.69.101.255 ca -192.69.112.0 - 192.69.112.255 us +192.69.102.0 - 192.69.113.255 us +192.69.114.0 - 192.69.115.255 ca 192.69.116.0 - 192.69.116.255 au -192.69.117.0 - 192.69.117.255 us -192.69.128.0 - 192.69.143.255 us -192.69.144.0 - 192.69.159.255 ca -192.69.190.0 - 192.69.190.255 us -192.69.228.0 - 192.69.231.255 us +192.69.117.0 - 192.69.131.255 us +192.69.132.0 - 192.69.135.255 ca +192.69.136.0 - 192.69.148.255 us +192.69.149.0 - 192.69.158.255 ca +192.69.159.0 - 192.69.233.255 us 192.69.234.0 - 192.69.234.255 de -192.69.247.0 - 192.69.247.255 us -192.70.0.0 - 192.70.54.255 fr -192.70.55.0 - 192.70.55.255 us -192.70.56.0 - 192.70.119.255 fr +192.69.235.0 - 192.69.250.255 us +192.69.251.0 - 192.69.251.255 gb +192.69.252.0 - 192.69.255.255 us +192.70.0.0 - 192.70.119.255 fr 192.70.120.0 - 192.70.132.255 us 192.70.133.0 - 192.70.134.255 tr 192.70.135.0 - 192.70.135.255 au -192.70.136.0 - 192.70.136.255 it +192.70.136.0 - 192.70.136.255 nl 192.70.137.0 - 192.70.139.255 us 192.70.140.0 - 192.70.159.255 de 192.70.160.0 - 192.70.171.255 us @@ -86097,60 +75980,100 @@ 192.70.175.0 - 192.70.175.255 us 192.70.176.0 - 192.70.177.255 ca 192.70.178.0 - 192.70.178.255 us -192.70.179.0 - 192.70.183.255 jp +192.70.179.0 - 192.70.181.255 jp 192.70.184.0 - 192.70.215.255 us 192.70.216.0 - 192.70.216.255 au 192.70.217.0 - 192.70.218.255 us 192.70.219.0 - 192.70.219.255 au -192.70.220.0 - 192.70.223.255 us +192.70.220.0 - 192.70.220.255 ca +192.70.221.0 - 192.70.223.255 us 192.70.224.0 - 192.70.224.255 ca 192.70.225.0 - 192.70.236.255 us 192.70.237.0 - 192.70.237.255 za 192.70.238.0 - 192.70.241.255 us 192.70.242.0 - 192.70.242.255 gb -192.70.244.0 - 192.70.245.255 us -192.70.248.0 - 192.70.255.255 us -192.71.0.0 - 192.71.6.255 se -192.71.7.0 - 192.71.7.255 us -192.71.8.0 - 192.71.10.255 se +192.70.243.0 - 192.70.255.255 us +192.71.0.0 - 192.71.10.255 se 192.71.11.0 - 192.71.11.255 it -192.71.12.0 - 192.71.36.255 se +192.71.12.0 - 192.71.14.255 se +192.71.15.0 - 192.71.15.255 de +192.71.16.0 - 192.71.16.255 se +192.71.17.0 - 192.71.18.255 de +192.71.19.0 - 192.71.24.255 se +192.71.25.0 - 192.71.25.255 nl +192.71.26.0 - 192.71.27.255 at +192.71.28.0 - 192.71.31.255 se +192.71.32.0 - 192.71.32.255 no +192.71.33.0 - 192.71.33.255 se +192.71.34.0 - 192.71.34.255 dk +192.71.35.0 - 192.71.36.255 se 192.71.37.0 - 192.71.37.255 gb -192.71.38.0 - 192.71.104.255 se +192.71.38.0 - 192.71.53.255 se +192.71.54.0 - 192.71.55.255 fr +192.71.56.0 - 192.71.61.255 se +192.71.62.0 - 192.71.65.255 gb +192.71.66.0 - 192.71.92.255 se +192.71.93.0 - 192.71.93.255 nl +192.71.94.0 - 192.71.94.255 se +192.71.95.0 - 192.71.95.255 nl +192.71.96.0 - 192.71.104.255 se 192.71.105.0 - 192.71.105.255 it 192.71.106.0 - 192.71.137.255 se 192.71.138.0 - 192.71.138.255 de 192.71.139.0 - 192.71.142.255 se 192.71.143.0 - 192.71.143.255 dk -192.71.144.0 - 192.71.155.255 se +192.71.144.0 - 192.71.150.255 se +192.71.151.0 - 192.71.151.255 nl +192.71.152.0 - 192.71.152.255 se +192.71.153.0 - 192.71.153.255 nl +192.71.154.0 - 192.71.155.255 se 192.71.156.0 - 192.71.156.255 gb 192.71.157.0 - 192.71.164.255 se 192.71.165.0 - 192.71.165.255 gb 192.71.166.0 - 192.71.168.255 se 192.71.169.0 - 192.71.169.255 gb -192.71.170.0 - 192.71.176.255 se +192.71.170.0 - 192.71.174.255 se +192.71.175.0 - 192.71.175.255 in +192.71.176.0 - 192.71.176.255 se 192.71.177.0 - 192.71.177.255 gb 192.71.178.0 - 192.71.201.255 se 192.71.202.0 - 192.71.202.255 fr -192.71.203.0 - 192.71.211.255 se +192.71.203.0 - 192.71.210.255 se +192.71.211.0 - 192.71.211.255 im 192.71.212.0 - 192.71.212.255 it -192.71.213.0 - 192.71.221.255 se +192.71.213.0 - 192.71.213.255 es +192.71.214.0 - 192.71.217.255 se +192.71.218.0 - 192.71.218.255 is +192.71.219.0 - 192.71.221.255 se 192.71.222.0 - 192.71.222.255 us -192.71.223.0 - 192.71.229.255 se +192.71.223.0 - 192.71.226.255 se +192.71.227.0 - 192.71.227.255 us +192.71.228.0 - 192.71.229.255 se 192.71.230.0 - 192.71.230.255 us -192.71.231.0 - 192.71.233.255 se +192.71.231.0 - 192.71.232.255 se +192.71.233.0 - 192.71.233.255 ch 192.71.234.0 - 192.71.234.255 us -192.71.235.0 - 192.71.255.255 se -192.72.0.0 - 192.72.252.255 tw -192.72.253.0 - 192.72.254.255 us -192.73.0.0 - 192.73.4.255 us +192.71.235.0 - 192.71.243.255 se +192.71.244.0 - 192.71.244.255 il +192.71.245.0 - 192.71.245.255 it +192.71.246.0 - 192.71.246.255 se +192.71.247.0 - 192.71.247.255 at +192.71.248.0 - 192.71.248.22 se +192.71.248.23 - 192.71.248.23 eu +192.71.248.24 - 192.71.248.255 se +192.71.249.0 - 192.71.249.255 be +192.71.250.0 - 192.71.255.255 se +192.72.0.0 - 192.72.2.255 us +192.72.3.0 - 192.72.252.255 tw +192.72.253.0 - 192.73.4.255 us 192.73.5.0 - 192.73.5.255 ca 192.73.6.0 - 192.73.11.255 us 192.73.12.0 - 192.73.12.255 au -192.73.13.0 - 192.73.17.255 us -192.73.19.0 - 192.73.20.255 gb +192.73.13.0 - 192.73.18.255 us +192.73.19.0 - 192.73.20.255 nl 192.73.21.0 - 192.73.21.255 nz 192.73.22.0 - 192.73.22.255 au +192.73.23.0 - 192.73.23.255 us 192.73.24.0 - 192.73.25.255 id 192.73.26.0 - 192.73.33.255 us 192.73.34.0 - 192.73.34.255 de @@ -86160,26 +76083,52 @@ 192.73.67.0 - 192.73.225.255 us 192.73.226.0 - 192.73.226.255 be 192.73.227.0 - 192.73.228.255 us -192.73.229.0 - 192.73.229.255 gb -192.73.230.0 - 192.73.231.255 us -192.74.0.0 - 192.74.127.255 us -192.74.137.0 - 192.74.138.255 us +192.73.229.0 - 192.73.229.255 nl +192.73.230.0 - 192.73.254.255 us +192.73.255.0 - 192.73.255.255 at +192.74.0.0 - 192.74.138.255 us 192.74.139.0 - 192.74.208.255 au -192.74.209.0 - 192.74.219.255 us -192.75.0.0 - 192.75.65.255 ca +192.74.209.0 - 192.75.0.255 us +192.75.1.0 - 192.75.3.255 ca +192.75.4.0 - 192.75.4.255 us +192.75.5.0 - 192.75.10.255 ca +192.75.11.0 - 192.75.11.255 us +192.75.12.0 - 192.75.22.255 ca +192.75.23.0 - 192.75.23.255 us +192.75.24.0 - 192.75.61.255 ca +192.75.62.0 - 192.75.62.255 us +192.75.63.0 - 192.75.65.255 ca 192.75.66.0 - 192.75.66.255 us -192.75.67.0 - 192.75.191.255 ca -192.75.198.0 - 192.75.198.255 us -192.75.200.0 - 192.75.238.255 ca -192.75.239.0 - 192.75.239.255 us -192.75.240.0 - 192.75.255.255 ca -192.76.0.0 - 192.76.35.255 gb -192.76.36.0 - 192.76.119.255 us -192.76.121.0 - 192.76.121.255 us +192.75.67.0 - 192.75.105.255 ca +192.75.106.0 - 192.75.106.255 us +192.75.107.0 - 192.75.134.255 ca +192.75.135.0 - 192.75.137.255 us +192.75.138.0 - 192.75.143.255 ca +192.75.144.0 - 192.75.147.255 us +192.75.148.0 - 192.75.186.255 ca +192.75.187.0 - 192.75.187.255 pr +192.75.188.0 - 192.75.188.255 us +192.75.189.0 - 192.75.191.255 ca +192.75.192.0 - 192.75.199.255 us +192.75.200.0 - 192.75.208.255 ca +192.75.209.0 - 192.75.209.255 us +192.75.210.0 - 192.75.210.255 ca +192.75.211.0 - 192.75.211.255 us +192.75.212.0 - 192.75.235.255 ca +192.75.236.0 - 192.75.236.255 us +192.75.237.0 - 192.75.238.255 ca +192.75.240.0 - 192.75.254.255 ca +192.75.255.0 - 192.76.5.255 us +192.76.6.0 - 192.76.35.255 gb +192.76.36.0 - 192.76.121.255 us 192.76.122.0 - 192.76.122.255 au -192.76.123.0 - 192.76.137.255 de -192.76.138.0 - 192.76.138.255 eu -192.76.139.0 - 192.76.172.255 de +192.76.123.0 - 192.76.132.255 de +192.76.133.0 - 192.76.133.255 us +192.76.134.0 - 192.76.137.255 de +192.76.138.0 - 192.76.138.255 nl +192.76.139.0 - 192.76.163.255 de +192.76.165.0 - 192.76.165.255 ie +192.76.166.0 - 192.76.172.255 de 192.76.173.0 - 192.76.175.255 us 192.76.176.0 - 192.76.176.255 de 192.76.177.0 - 192.76.240.255 us @@ -86188,15 +76137,13 @@ 192.76.243.0 - 192.76.244.255 at 192.76.245.0 - 192.76.248.255 de 192.76.249.0 - 192.76.251.255 us -192.76.252.0 - 192.76.255.255 jp -192.77.0.0 - 192.77.7.255 us +192.76.255.0 - 192.77.7.255 us 192.77.8.0 - 192.77.8.255 au 192.77.9.0 - 192.77.10.255 us -192.77.11.0 - 192.77.11.255 ch +192.77.11.0 - 192.77.11.255 nl 192.77.12.0 - 192.77.16.255 us 192.77.17.0 - 192.77.17.255 au -192.77.18.0 - 192.77.19.255 us -192.77.23.0 - 192.77.45.255 us +192.77.18.0 - 192.77.45.255 us 192.77.46.0 - 192.77.75.255 ca 192.77.76.0 - 192.77.113.255 us 192.77.114.0 - 192.77.115.255 de @@ -86205,10 +76152,10 @@ 192.77.124.0 - 192.77.131.255 us 192.77.132.0 - 192.77.138.255 gb 192.77.139.0 - 192.77.139.255 us -192.77.140.0 - 192.77.141.255 es -192.77.142.0 - 192.78.109.255 us -192.78.110.0 - 192.78.111.255 de -192.78.112.0 - 192.78.115.255 us +192.77.140.0 - 192.77.141.255 nl +192.77.142.0 - 192.77.247.255 us +192.77.248.0 - 192.77.248.255 ro +192.77.249.0 - 192.78.115.255 us 192.78.116.0 - 192.78.116.255 ca 192.78.117.0 - 192.78.143.255 us 192.78.144.0 - 192.78.148.255 de @@ -86220,65 +76167,85 @@ 192.78.220.0 - 192.78.220.255 de 192.78.221.0 - 192.78.235.255 us 192.78.236.0 - 192.78.245.255 de -192.78.246.0 - 192.79.255.255 us -192.80.8.0 - 192.80.19.255 us -192.80.20.0 - 192.80.21.255 pt +192.78.246.0 - 192.80.19.255 us +192.80.20.0 - 192.80.20.255 nl +192.80.21.0 - 192.80.21.255 pt 192.80.22.0 - 192.80.23.255 us 192.80.24.0 - 192.80.24.255 cl -192.80.27.0 - 192.80.27.255 us -192.80.29.0 - 192.80.30.255 us +192.80.25.0 - 192.80.30.255 us 192.80.31.0 - 192.80.42.255 ch -192.80.43.0 - 192.80.44.255 us -192.80.46.0 - 192.80.46.255 gb +192.80.43.0 - 192.80.45.255 us +192.80.46.0 - 192.80.46.255 nl 192.80.47.0 - 192.80.50.255 us 192.80.51.0 - 192.80.51.255 de -192.80.52.0 - 192.80.95.255 us -192.80.207.0 - 192.80.208.255 us +192.80.52.0 - 192.80.79.255 us +192.80.80.0 - 192.80.80.255 ca +192.80.81.0 - 192.80.208.255 us 192.80.209.0 - 192.80.209.255 br -192.80.210.0 - 192.80.255.255 us -192.81.8.0 - 192.81.8.255 us -192.81.48.0 - 192.81.48.255 us +192.80.210.0 - 192.81.11.255 us +192.81.12.0 - 192.81.31.255 ca +192.81.32.0 - 192.81.51.255 us +192.81.52.0 - 192.81.57.255 ca +192.81.58.0 - 192.81.58.255 us 192.81.59.0 - 192.81.59.255 be -192.81.60.0 - 192.81.63.255 gb -192.81.64.0 - 192.81.79.255 us -192.81.85.0 - 192.81.85.255 ca -192.81.88.0 - 192.81.88.255 us -192.81.97.0 - 192.81.97.255 us +192.81.60.0 - 192.81.60.255 us +192.81.61.0 - 192.81.62.255 nl +192.81.63.0 - 192.81.65.255 us +192.81.66.0 - 192.81.66.255 ca +192.81.67.0 - 192.81.69.255 us +192.81.70.0 - 192.81.71.255 ca +192.81.72.0 - 192.81.73.255 vi +192.81.74.0 - 192.81.83.255 us +192.81.84.0 - 192.81.85.255 ca +192.81.86.0 - 192.81.88.255 us +192.81.89.0 - 192.81.89.255 ca +192.81.90.0 - 192.81.108.255 us 192.81.109.0 - 192.81.109.255 no -192.81.114.0 - 192.81.114.255 us +192.81.110.0 - 192.81.120.255 us 192.81.121.0 - 192.81.121.255 de +192.81.122.0 - 192.81.122.255 us 192.81.123.0 - 192.81.123.255 fi -192.81.141.0 - 192.81.141.255 us +192.81.124.0 - 192.81.159.255 us 192.81.160.0 - 192.81.160.255 fi -192.81.166.0 - 192.81.166.255 us +192.81.161.0 - 192.81.161.255 us +192.81.162.0 - 192.81.165.255 ca +192.81.166.0 - 192.81.167.255 us +192.81.168.0 - 192.81.175.255 ca +192.81.176.0 - 192.81.181.255 us 192.81.182.0 - 192.81.184.255 fi -192.81.190.0 - 192.81.190.255 us -192.81.192.0 - 192.81.192.255 us -192.81.194.0 - 192.81.194.255 se -192.81.230.0 - 192.81.230.255 de -192.81.234.0 - 192.81.234.255 gb -192.81.252.0 - 192.81.253.255 us -192.82.0.0 - 192.82.103.255 us +192.81.185.0 - 192.81.192.255 us +192.81.193.0 - 192.81.193.255 ca +192.81.194.0 - 192.81.194.255 nl +192.81.195.0 - 192.81.197.95 us +192.81.197.96 - 192.81.197.127 au +192.81.197.128 - 192.81.219.255 us +192.81.220.0 - 192.81.223.255 nl +192.81.224.0 - 192.81.227.255 ca +192.81.228.0 - 192.81.229.255 us +192.81.230.0 - 192.81.230.255 nl +192.81.231.0 - 192.81.233.255 us +192.81.234.0 - 192.81.234.255 nl +192.81.235.0 - 192.82.103.255 us 192.82.104.0 - 192.82.104.255 ca 192.82.105.0 - 192.82.116.255 us 192.82.117.0 - 192.82.117.255 ca 192.82.118.0 - 192.82.120.255 us -192.82.121.0 - 192.82.121.255 gb -192.82.123.0 - 192.82.123.255 us -192.82.124.0 - 192.82.124.255 ch +192.82.121.0 - 192.82.121.255 nl +192.82.122.0 - 192.82.123.255 us +192.82.124.0 - 192.82.124.255 nl 192.82.125.0 - 192.82.126.255 us 192.82.127.0 - 192.82.127.255 pt 192.82.128.0 - 192.82.131.255 ca -192.82.132.0 - 192.82.132.255 jp -192.82.139.0 - 192.82.139.255 us +192.82.132.0 - 192.82.132.255 au +192.82.133.0 - 192.82.139.255 us 192.82.140.0 - 192.82.140.255 au 192.82.141.0 - 192.82.141.255 us 192.82.142.0 - 192.82.142.255 za 192.82.143.0 - 192.82.143.255 au -192.82.147.0 - 192.82.149.255 us +192.82.144.0 - 192.82.149.255 us 192.82.150.0 - 192.82.150.255 ca -192.82.151.0 - 192.82.151.255 us -192.82.153.0 - 192.82.153.255 gb +192.82.151.0 - 192.82.152.255 us +192.82.153.0 - 192.82.153.255 nl 192.82.154.0 - 192.82.156.255 us 192.82.157.0 - 192.82.158.255 at 192.82.159.0 - 192.82.160.255 us @@ -86286,93 +76253,101 @@ 192.82.162.0 - 192.82.213.255 us 192.82.214.0 - 192.82.214.255 pt 192.82.215.0 - 192.82.219.255 us -192.82.220.0 - 192.82.221.255 it +192.82.220.0 - 192.82.221.255 nl 192.82.222.0 - 192.82.222.255 au 192.82.223.0 - 192.82.229.255 us 192.82.230.0 - 192.82.230.255 au 192.82.231.0 - 192.82.240.255 us -192.82.241.0 - 192.82.241.255 de -192.82.244.0 - 192.82.244.255 us +192.82.241.0 - 192.82.241.255 nl +192.82.242.0 - 192.82.255.255 us 192.83.0.0 - 192.83.100.255 fi 192.83.101.0 - 192.83.101.255 ca -192.83.102.0 - 192.83.102.255 gb -192.83.104.0 - 192.83.104.255 jp +192.83.102.0 - 192.83.102.255 nl +192.83.103.0 - 192.83.103.255 us +192.83.104.0 - 192.83.104.255 au 192.83.105.0 - 192.83.117.255 us 192.83.118.0 - 192.83.119.255 au 192.83.120.0 - 192.83.120.255 us 192.83.121.0 - 192.83.121.255 ca -192.83.122.0 - 192.83.122.255 cn -192.83.123.0 - 192.83.123.255 au -192.83.157.0 - 192.83.157.255 jp +192.83.122.0 - 192.83.123.255 au +192.83.124.0 - 192.83.127.255 us +192.83.128.0 - 192.83.128.255 ca +192.83.129.0 - 192.83.129.255 us +192.83.130.0 - 192.83.134.255 ca +192.83.135.0 - 192.83.137.255 us +192.83.138.0 - 192.83.143.255 ca +192.83.144.0 - 192.83.156.255 us +192.83.157.0 - 192.83.157.255 au 192.83.158.0 - 192.83.159.255 us 192.83.160.0 - 192.83.160.255 fr -192.83.161.0 - 192.83.163.255 us +192.83.161.0 - 192.83.164.255 us +192.83.165.0 - 192.83.165.255 pl 192.83.166.0 - 192.83.196.255 tw 192.83.197.0 - 192.83.197.255 us 192.83.198.0 - 192.83.198.255 au 192.83.199.0 - 192.83.199.255 us 192.83.200.0 - 192.83.200.255 gb +192.83.201.0 - 192.83.201.255 us 192.83.202.0 - 192.83.202.255 gb -192.83.203.0 - 192.83.204.255 us -192.83.206.0 - 192.83.206.255 us -192.83.207.0 - 192.83.216.255 gb -192.83.217.0 - 192.83.219.255 jp -192.83.220.0 - 192.83.221.255 us -192.83.223.0 - 192.83.223.255 ch +192.83.203.0 - 192.83.207.255 us +192.83.218.0 - 192.83.219.255 jp +192.83.220.0 - 192.83.222.255 us +192.83.223.0 - 192.83.223.255 nl 192.83.224.0 - 192.83.224.255 au 192.83.225.0 - 192.83.228.255 us -192.83.229.0 - 192.83.229.255 de -192.83.230.0 - 192.83.230.255 jp +192.83.229.0 - 192.83.229.255 nl +192.83.230.0 - 192.83.230.255 us 192.83.231.0 - 192.83.231.255 au 192.83.232.0 - 192.83.236.255 us 192.83.237.0 - 192.83.238.255 au 192.83.239.0 - 192.83.246.255 us 192.83.247.0 - 192.83.247.255 ca -192.83.248.0 - 192.83.255.255 us -192.84.2.0 - 192.84.3.255 us +192.83.248.0 - 192.84.4.255 us 192.84.5.0 - 192.84.5.255 gb -192.84.7.0 - 192.84.11.255 us +192.84.6.0 - 192.84.11.255 us 192.84.12.0 - 192.84.12.255 mx 192.84.13.0 - 192.84.13.255 pt 192.84.14.0 - 192.84.14.255 us -192.84.15.0 - 192.84.15.255 pt -192.84.16.0 - 192.84.26.255 us +192.84.15.0 - 192.84.15.255 nl +192.84.16.0 - 192.84.23.255 us +192.84.25.0 - 192.84.26.255 us 192.84.27.0 - 192.84.27.255 at 192.84.28.0 - 192.84.29.255 us 192.84.30.0 - 192.84.30.255 nl 192.84.31.0 - 192.84.31.255 us -192.84.32.0 - 192.84.33.255 no -192.84.40.0 - 192.84.47.255 us -192.84.55.0 - 192.84.61.255 us -192.84.62.0 - 192.84.62.255 pt -192.84.63.0 - 192.84.70.255 us -192.84.71.0 - 192.84.73.255 jp +192.84.32.0 - 192.84.33.255 nl +192.84.34.0 - 192.84.61.255 us +192.84.62.0 - 192.84.62.255 nl +192.84.63.0 - 192.84.71.255 us 192.84.74.0 - 192.84.74.255 us 192.84.75.0 - 192.84.84.255 gb 192.84.85.0 - 192.84.86.255 us -192.84.87.0 - 192.84.87.255 it +192.84.87.0 - 192.84.87.255 nl 192.84.88.0 - 192.84.88.255 us 192.84.89.0 - 192.84.89.255 au 192.84.90.0 - 192.84.90.255 si 192.84.91.0 - 192.84.92.255 hr -192.84.93.0 - 192.84.104.255 si +192.84.93.0 - 192.84.99.255 si +192.84.100.0 - 192.84.100.255 us +192.84.101.0 - 192.84.104.255 si 192.84.105.0 - 192.84.106.255 hr 192.84.107.0 - 192.84.109.255 si -192.84.111.0 - 192.84.125.255 us +192.84.110.0 - 192.84.126.255 us 192.84.127.0 - 192.84.156.255 it 192.84.157.0 - 192.84.165.255 us -192.84.166.0 - 192.84.166.255 ch +192.84.166.0 - 192.84.166.255 nl 192.84.167.0 - 192.84.172.255 us 192.84.173.0 - 192.84.173.255 gb -192.84.174.0 - 192.84.174.255 us -192.84.176.0 - 192.84.207.255 fi +192.84.174.0 - 192.84.175.255 us +192.84.176.0 - 192.84.202.255 fi +192.84.203.0 - 192.84.203.255 eu +192.84.204.0 - 192.84.207.255 fi 192.84.208.0 - 192.84.211.255 us 192.84.212.0 - 192.84.212.255 gb 192.84.213.0 - 192.84.218.255 us 192.84.219.0 - 192.84.219.255 au -192.84.220.0 - 192.84.220.255 de -192.84.221.0 - 192.84.221.255 at -192.84.222.0 - 192.84.224.255 us +192.84.220.0 - 192.84.221.255 nl +192.84.222.0 - 192.84.225.255 us 192.84.226.0 - 192.84.229.255 hu 192.84.230.0 - 192.84.230.255 au 192.84.231.0 - 192.84.236.255 us @@ -86384,158 +76359,149 @@ 192.84.245.0 - 192.84.247.255 de 192.84.248.0 - 192.84.252.255 us 192.84.253.0 - 192.84.253.255 nz -192.84.254.0 - 192.84.254.255 us -192.85.0.0 - 192.85.15.255 us +192.84.254.0 - 192.85.15.255 us 192.85.16.0 - 192.85.17.255 de 192.85.18.0 - 192.85.59.255 us 192.85.60.0 - 192.85.60.255 de 192.85.61.0 - 192.85.109.255 us -192.85.110.0 - 192.85.110.255 de -192.85.111.0 - 192.85.255.255 us +192.85.110.0 - 192.85.110.255 eu +192.85.111.0 - 192.86.0.255 us 192.86.1.0 - 192.86.1.255 ca 192.86.2.0 - 192.86.10.255 us 192.86.11.0 - 192.86.11.255 ru -192.86.12.0 - 192.86.12.255 nz +192.86.12.0 - 192.86.12.255 au 192.86.13.0 - 192.86.13.255 us -192.86.14.0 - 192.86.14.255 pl +192.86.14.0 - 192.86.14.255 nl 192.86.15.0 - 192.86.17.255 us -192.86.18.0 - 192.86.18.255 gb +192.86.18.0 - 192.86.18.255 nl 192.86.19.0 - 192.86.24.255 us -192.86.25.0 - 192.86.25.255 il +192.86.25.0 - 192.86.25.255 nl 192.86.26.0 - 192.86.26.255 us 192.86.27.0 - 192.86.27.255 gb 192.86.28.0 - 192.86.88.255 us -192.86.89.0 - 192.86.89.255 il +192.86.89.0 - 192.86.89.255 nl 192.86.90.0 - 192.86.124.255 us 192.86.125.0 - 192.86.126.255 nl 192.86.127.0 - 192.86.127.255 gb 192.86.128.0 - 192.86.128.255 us 192.86.129.0 - 192.86.129.255 au -192.86.131.0 - 192.86.131.255 us -192.86.132.0 - 192.86.133.255 sg -192.86.134.0 - 192.86.134.255 gb +192.86.130.0 - 192.86.131.255 us +192.86.132.0 - 192.86.133.255 au +192.86.134.0 - 192.86.134.255 nl 192.86.135.0 - 192.86.136.255 us -192.86.137.0 - 192.86.137.255 gb +192.86.137.0 - 192.86.137.255 nl 192.86.138.0 - 192.86.138.255 pt -192.86.139.0 - 192.86.159.255 us -192.86.162.0 - 192.86.162.255 us -192.86.163.0 - 192.86.163.255 de +192.86.139.0 - 192.86.162.255 us +192.86.163.0 - 192.86.163.255 nl 192.86.164.0 - 192.86.164.255 us 192.86.165.0 - 192.86.165.255 au -192.86.166.0 - 192.86.166.255 ch -192.86.167.0 - 192.86.167.255 fr +192.86.166.0 - 192.86.167.255 nl 192.86.168.0 - 192.86.168.255 us -192.86.169.0 - 192.86.169.255 gb +192.86.169.0 - 192.86.169.255 nl 192.86.170.0 - 192.86.253.255 us -192.86.254.0 - 192.86.254.255 se +192.86.254.0 - 192.86.254.255 nl +192.86.255.0 - 192.86.255.255 us 192.87.0.0 - 192.87.255.255 nl -192.88.1.0 - 192.88.1.255 ch +192.88.0.0 - 192.88.0.255 us +192.88.1.0 - 192.88.1.255 nl 192.88.2.0 - 192.88.3.255 us 192.88.4.0 - 192.88.4.255 de 192.88.5.0 - 192.88.5.255 us 192.88.6.0 - 192.88.7.255 au 192.88.8.0 - 192.88.8.255 us 192.88.9.0 - 192.88.10.255 gb -192.88.11.0 - 192.88.15.255 us +192.88.11.0 - 192.88.16.255 us 192.88.17.0 - 192.88.17.255 pt -192.88.21.0 - 192.88.22.255 us -192.88.23.0 - 192.88.24.255 at +192.88.18.0 - 192.88.22.255 us +192.88.23.0 - 192.88.24.255 nl 192.88.25.0 - 192.88.79.255 us -192.88.80.0 - 192.88.80.255 jp +192.88.80.0 - 192.88.80.255 au 192.88.81.0 - 192.88.82.255 us -192.88.83.0 - 192.88.84.255 gb +192.88.83.0 - 192.88.84.255 nl 192.88.85.0 - 192.88.85.255 nz 192.88.86.0 - 192.88.86.255 fi -192.88.87.0 - 192.88.95.255 us -192.88.97.0 - 192.88.98.255 de -192.88.102.0 - 192.88.102.255 jp +192.88.87.0 - 192.88.96.255 us +192.88.97.0 - 192.88.98.255 nl +192.88.100.0 - 192.88.100.255 us +192.88.101.0 - 192.88.102.255 au 192.88.103.0 - 192.88.107.255 us -192.88.108.0 - 192.88.108.255 de -192.88.110.0 - 192.88.117.255 us -192.88.118.0 - 192.88.118.255 gb -192.88.119.0 - 192.88.119.255 nz -192.88.120.0 - 192.88.120.255 us -192.88.122.0 - 192.88.122.255 us -192.88.123.0 - 192.88.123.255 pt -192.88.124.0 - 192.88.125.255 us -192.88.128.0 - 192.88.128.255 gb +192.88.108.0 - 192.88.108.255 nl +192.88.109.0 - 192.88.117.255 us +192.88.118.0 - 192.88.118.255 nl +192.88.119.0 - 192.88.119.255 au +192.88.120.0 - 192.88.122.255 us +192.88.123.0 - 192.88.123.255 nl +192.88.124.0 - 192.88.127.255 us +192.88.128.0 - 192.88.128.255 nl 192.88.129.0 - 192.88.129.255 us 192.88.130.0 - 192.88.130.255 gb 192.88.131.0 - 192.88.132.255 us 192.88.133.0 - 192.88.133.255 gb -192.88.136.0 - 192.88.177.255 us -192.88.184.0 - 192.88.185.255 us +192.88.134.0 - 192.88.135.255 ca +192.88.136.0 - 192.88.165.255 us +192.88.166.0 - 192.88.166.255 eu +192.88.167.0 - 192.88.167.255 ap +192.88.168.0 - 192.88.186.255 us 192.88.187.0 - 192.88.187.255 au 192.88.188.0 - 192.88.189.255 us -192.88.190.0 - 192.88.190.255 nz +192.88.190.0 - 192.88.190.255 au 192.88.191.0 - 192.88.195.255 us -192.88.196.0 - 192.88.196.255 it -192.88.197.0 - 192.88.197.255 us -192.88.199.0 - 192.88.237.255 us -192.88.238.0 - 192.88.238.255 gb -192.88.239.0 - 192.88.239.255 de +192.88.196.0 - 192.88.196.255 nl +192.88.197.0 - 192.88.203.255 us +192.88.204.0 - 192.88.204.255 nl +192.88.205.0 - 192.88.229.255 us +192.88.230.0 - 192.88.230.255 ap +192.88.231.0 - 192.88.237.255 us +192.88.238.0 - 192.88.239.255 nl 192.88.240.0 - 192.88.249.255 us -192.88.250.0 - 192.88.255.255 pt -192.89.0.0 - 192.89.3.7 fi -192.89.3.8 - 192.89.3.11 ax -192.89.3.12 - 192.89.9.255 fi -192.89.10.0 - 192.89.10.63 ax -192.89.10.64 - 192.89.53.255 fi -192.89.54.0 - 192.89.54.127 ax -192.89.54.128 - 192.89.54.171 fi -192.89.54.172 - 192.89.54.175 ax -192.89.54.176 - 192.89.98.255 fi -192.89.99.0 - 192.89.99.255 es -192.89.100.0 - 192.89.240.63 fi -192.89.240.64 - 192.89.240.95 ax -192.89.240.96 - 192.89.253.255 fi -192.89.254.0 - 192.89.254.255 ax -192.89.255.0 - 192.89.255.255 fi -192.90.0.0 - 192.91.139.255 us -192.91.140.0 - 192.91.141.255 lu +192.88.250.0 - 192.88.254.255 pt +192.88.255.0 - 192.88.255.255 us +192.89.0.0 - 192.89.255.255 fi +192.90.0.0 - 192.91.60.9 us +192.91.60.10 - 192.91.60.11 eu +192.91.60.12 - 192.91.139.255 us +192.91.140.0 - 192.91.141.255 nl 192.91.142.0 - 192.91.176.255 us -192.91.177.0 - 192.91.177.255 pt +192.91.177.0 - 192.91.177.255 nl 192.91.178.0 - 192.91.178.255 us 192.91.179.0 - 192.91.179.255 au 192.91.180.0 - 192.91.184.255 us 192.91.185.0 - 192.91.185.255 au -192.91.186.0 - 192.91.186.255 ru +192.91.186.0 - 192.91.186.255 nl 192.91.187.0 - 192.91.188.255 us 192.91.189.0 - 192.91.189.255 no 192.91.190.0 - 192.91.190.255 us 192.91.191.0 - 192.91.191.255 gb -192.91.192.0 - 192.91.197.255 us +192.91.192.0 - 192.91.198.255 us 192.91.199.0 - 192.91.199.255 gb -192.91.200.0 - 192.91.200.255 be 192.91.201.0 - 192.91.201.255 gb 192.91.202.0 - 192.91.209.255 us 192.91.210.0 - 192.91.210.255 ca -192.91.211.0 - 192.91.211.255 gb +192.91.211.0 - 192.91.211.255 nl 192.91.212.0 - 192.91.212.255 us 192.91.213.0 - 192.91.213.255 au 192.91.214.0 - 192.91.233.255 se -192.91.235.0 - 192.91.235.255 us +192.91.234.0 - 192.91.235.255 us 192.91.236.0 - 192.91.247.255 ch 192.91.248.0 - 192.91.253.255 us -192.91.254.0 - 192.91.254.255 hk -192.92.8.0 - 192.92.14.255 us -192.92.15.0 - 192.92.15.255 nz +192.91.254.0 - 192.91.254.255 au +192.91.255.0 - 192.92.14.255 us +192.92.15.0 - 192.92.15.255 au 192.92.16.0 - 192.92.74.255 us 192.92.75.0 - 192.92.75.255 fi 192.92.76.0 - 192.92.76.255 us 192.92.77.0 - 192.92.77.255 nl -192.92.78.0 - 192.92.84.255 us +192.92.78.0 - 192.92.85.255 us 192.92.86.0 - 192.92.86.255 fr -192.92.88.0 - 192.92.93.255 us -192.92.94.0 - 192.92.94.255 ie +192.92.87.0 - 192.92.93.255 us +192.92.94.0 - 192.92.94.255 eu 192.92.95.0 - 192.92.103.255 us 192.92.104.0 - 192.92.106.255 it 192.92.107.0 - 192.92.107.255 us -192.92.108.0 - 192.92.108.255 nl -192.92.109.0 - 192.92.109.255 gb +192.92.108.0 - 192.92.109.255 nl 192.92.110.0 - 192.92.115.255 us 192.92.116.0 - 192.92.116.255 fi -192.92.118.0 - 192.92.124.255 us +192.92.117.0 - 192.92.124.255 us 192.92.125.0 - 192.92.125.255 at 192.92.126.0 - 192.92.126.255 it 192.92.127.0 - 192.92.127.255 nl @@ -86549,205 +76515,354 @@ 192.92.136.0 - 192.92.137.255 nl 192.92.138.0 - 192.92.138.255 at 192.92.139.0 - 192.92.139.255 ch +192.92.140.0 - 192.92.140.255 us 192.92.141.0 - 192.92.141.255 at -192.92.142.0 - 192.92.154.255 pt +192.92.142.0 - 192.92.153.255 pt 192.92.155.0 - 192.92.156.255 gr -192.92.158.0 - 192.92.199.255 us -192.92.215.0 - 192.92.215.255 us -192.92.216.0 - 192.92.216.255 no +192.92.157.0 - 192.92.192.255 us +192.92.193.0 - 192.92.193.255 pr +192.92.194.0 - 192.92.215.255 us +192.92.216.0 - 192.92.216.255 nl 192.92.217.0 - 192.92.223.255 us 192.92.224.0 - 192.92.224.255 dk -192.92.225.0 - 192.92.235.255 us -192.93.0.0 - 192.93.161.255 fr -192.93.162.0 - 192.93.163.255 us -192.93.164.0 - 192.93.255.255 fr +192.92.225.0 - 192.92.255.255 us +192.93.0.0 - 192.93.162.255 fr +192.93.163.0 - 192.93.163.255 us +192.93.164.0 - 192.93.165.255 gb +192.93.166.0 - 192.93.255.255 fr 192.94.0.0 - 192.94.23.255 us 192.94.24.0 - 192.94.24.255 pt 192.94.25.0 - 192.94.27.255 us 192.94.28.0 - 192.94.28.255 at -192.94.29.0 - 192.94.40.255 us +192.94.29.0 - 192.94.30.255 us +192.94.31.0 - 192.94.31.255 eu +192.94.32.0 - 192.94.40.255 us 192.94.41.0 - 192.94.41.255 au -192.94.42.0 - 192.94.56.255 us +192.94.42.0 - 192.94.48.255 us +192.94.49.0 - 192.94.49.255 ca +192.94.50.0 - 192.94.56.255 us 192.94.57.0 - 192.94.57.255 at 192.94.58.0 - 192.94.58.255 gb 192.94.59.0 - 192.94.60.255 us -192.94.61.0 - 192.94.61.255 za +192.94.61.0 - 192.94.61.255 mu 192.94.62.0 - 192.94.64.255 au 192.94.65.0 - 192.94.66.255 us 192.94.67.0 - 192.94.68.255 gr -192.94.69.0 - 192.94.69.255 us -192.94.72.0 - 192.94.75.255 us -192.94.76.0 - 192.94.76.255 de -192.94.77.0 - 192.94.109.255 us -192.94.111.0 - 192.94.115.255 gb -192.94.116.0 - 192.94.116.255 us -192.94.117.0 - 192.94.117.255 gb +192.94.69.0 - 192.94.75.255 us +192.94.76.0 - 192.94.76.255 nl +192.94.77.0 - 192.94.110.255 us +192.94.111.0 - 192.94.117.255 gb 192.94.118.0 - 192.94.121.255 us 192.94.122.0 - 192.94.122.255 bn -192.94.123.0 - 192.94.123.255 us -192.94.125.0 - 192.94.125.255 us +192.94.123.0 - 192.94.125.255 us 192.94.126.0 - 192.94.126.255 ca 192.94.127.0 - 192.94.155.255 us 192.94.156.0 - 192.94.162.255 dk 192.94.163.0 - 192.94.163.255 es 192.94.164.0 - 192.94.168.255 us -192.94.169.0 - 192.94.169.255 nz +192.94.169.0 - 192.94.169.255 au 192.94.170.0 - 192.94.171.255 us -192.94.172.0 - 192.94.172.255 gb +192.94.172.0 - 192.94.172.255 nl 192.94.173.0 - 192.94.173.255 us -192.94.174.0 - 192.94.174.255 hk +192.94.174.0 - 192.94.174.255 au 192.94.175.0 - 192.94.199.255 fr 192.94.200.0 - 192.94.200.255 au -192.94.201.0 - 192.94.202.255 us -192.94.207.0 - 192.94.207.255 us +192.94.201.0 - 192.94.207.255 us 192.94.208.0 - 192.94.209.255 au -192.94.210.0 - 192.94.210.255 za +192.94.210.0 - 192.94.210.255 mu 192.94.211.0 - 192.94.211.255 us -192.94.212.0 - 192.94.212.255 it +192.94.212.0 - 192.94.212.255 nl 192.94.213.0 - 192.94.219.255 us -192.94.220.0 - 192.94.220.255 jp -192.94.221.0 - 192.94.221.255 ru +192.94.220.0 - 192.94.220.255 au +192.94.221.0 - 192.94.221.255 nl 192.94.222.0 - 192.94.225.255 us -192.94.226.0 - 192.94.226.255 eu +192.94.226.0 - 192.94.226.255 at 192.94.227.0 - 192.94.227.255 au 192.94.228.0 - 192.94.232.255 us -192.94.233.0 - 192.94.233.255 ch +192.94.233.0 - 192.94.233.255 ru 192.94.234.0 - 192.94.234.255 us 192.94.235.0 - 192.94.235.255 gb 192.94.236.0 - 192.94.237.255 us -192.94.238.0 - 192.94.238.255 jp -192.94.239.0 - 192.94.239.255 at -192.94.240.0 - 192.94.241.255 za +192.94.238.0 - 192.94.238.255 au +192.94.239.0 - 192.94.239.255 nl +192.94.240.0 - 192.94.241.255 mu 192.94.242.0 - 192.94.242.255 us 192.94.243.0 - 192.94.244.255 au 192.94.245.0 - 192.94.245.255 us -192.94.246.0 - 192.94.246.255 za -192.94.247.0 - 192.94.251.255 us +192.94.246.0 - 192.94.246.255 mu +192.94.247.0 - 192.94.250.255 us +192.94.251.0 - 192.94.251.255 ca +192.94.252.0 - 192.95.0.63 us +192.95.0.64 - 192.95.1.183 ca +192.95.1.184 - 192.95.1.187 us +192.95.1.188 - 192.95.3.215 ca +192.95.3.216 - 192.95.3.222 us +192.95.3.223 - 192.95.5.63 ca +192.95.5.64 - 192.95.5.95 us +192.95.5.96 - 192.95.8.63 ca +192.95.8.64 - 192.95.8.67 us +192.95.8.68 - 192.95.10.95 ca +192.95.10.96 - 192.95.10.127 us +192.95.10.128 - 192.95.12.223 ca +192.95.12.224 - 192.95.12.255 us +192.95.13.0 - 192.95.14.71 ca +192.95.14.72 - 192.95.14.75 us +192.95.14.76 - 192.95.15.255 ca +192.95.16.0 - 192.95.18.255 us +192.95.19.0 - 192.95.21.255 ca +192.95.22.0 - 192.95.23.255 us +192.95.24.0 - 192.95.29.185 ca +192.95.29.186 - 192.95.29.186 us +192.95.29.187 - 192.95.37.217 ca +192.95.37.218 - 192.95.37.218 us +192.95.37.219 - 192.95.37.255 ca +192.95.38.0 - 192.95.39.255 us +192.95.40.0 - 192.95.41.71 ca +192.95.41.72 - 192.95.41.75 us +192.95.41.76 - 192.95.50.255 ca +192.95.51.0 - 192.95.51.127 us +192.95.51.128 - 192.95.51.215 ca +192.95.51.216 - 192.95.51.219 us +192.95.51.220 - 192.95.53.187 ca +192.95.53.188 - 192.95.53.191 us +192.95.53.192 - 192.95.57.151 ca +192.95.57.152 - 192.95.57.159 us +192.95.57.160 - 192.95.63.255 ca 192.95.65.0 - 192.95.65.255 us -192.96.0.0 - 192.96.255.255 za -192.97.0.0 - 192.97.217.255 us +192.95.66.0 - 192.95.67.255 ca +192.95.68.0 - 192.95.127.255 us +192.95.128.0 - 192.96.0.255 ca +192.96.1.0 - 192.96.2.255 za +192.96.3.0 - 192.96.4.255 mu +192.96.5.0 - 192.96.5.255 za +192.96.6.0 - 192.96.10.255 mu +192.96.11.0 - 192.96.12.255 za +192.96.13.0 - 192.96.14.255 mu +192.96.15.0 - 192.96.15.255 za +192.96.16.0 - 192.96.16.255 mu +192.96.17.0 - 192.96.18.255 us +192.96.19.0 - 192.96.19.255 mu +192.96.20.0 - 192.96.21.255 za +192.96.22.0 - 192.96.22.255 mu +192.96.23.0 - 192.96.23.255 us +192.96.24.0 - 192.96.35.255 mu +192.96.36.0 - 192.96.36.255 us +192.96.37.0 - 192.96.37.255 mu +192.96.38.0 - 192.96.38.255 za +192.96.39.0 - 192.96.40.255 mu +192.96.41.0 - 192.96.42.255 us +192.96.43.0 - 192.96.43.255 mu +192.96.44.0 - 192.96.44.255 us +192.96.45.0 - 192.96.58.255 mu +192.96.59.0 - 192.96.59.255 us +192.96.60.0 - 192.96.61.255 mu +192.96.62.0 - 192.96.67.255 us +192.96.68.0 - 192.96.72.255 mu +192.96.73.0 - 192.96.73.255 us +192.96.74.0 - 192.96.77.255 mu +192.96.78.0 - 192.96.78.255 ca +192.96.79.0 - 192.96.95.255 mu +192.96.96.0 - 192.96.96.255 za +192.96.97.0 - 192.96.102.255 mu +192.96.103.0 - 192.96.103.255 us +192.96.104.0 - 192.96.135.255 mu +192.96.136.0 - 192.96.137.255 mf +192.96.138.0 - 192.96.155.255 mu +192.96.156.0 - 192.96.157.255 us +192.96.158.0 - 192.96.158.255 mu +192.96.159.0 - 192.96.163.255 us +192.96.164.0 - 192.96.167.255 mu +192.96.168.0 - 192.96.176.255 us +192.96.177.0 - 192.96.191.255 mu +192.96.192.0 - 192.96.192.255 us +192.96.193.0 - 192.96.195.255 mu +192.96.196.0 - 192.96.199.255 za +192.96.200.0 - 192.96.223.255 us +192.96.224.0 - 192.96.232.255 mu +192.96.233.0 - 192.96.233.255 us +192.96.234.0 - 192.96.243.255 mu +192.96.244.0 - 192.96.244.255 us +192.96.245.0 - 192.96.246.255 mu +192.96.247.0 - 192.96.249.255 za +192.96.250.0 - 192.96.254.255 mu +192.96.255.0 - 192.97.217.255 us 192.97.218.0 - 192.97.218.255 ca 192.97.219.0 - 192.97.255.255 us -192.98.0.0 - 192.98.45.255 fi -192.98.46.0 - 192.98.46.255 jp -192.98.47.0 - 192.98.48.255 fi -192.98.49.0 - 192.98.49.255 ee -192.98.50.0 - 192.98.255.255 fi -192.100.1.0 - 192.100.1.255 za -192.100.2.0 - 192.100.2.255 kr +192.98.0.0 - 192.98.255.255 fi +192.99.0.0 - 192.99.35.25 ca +192.99.35.26 - 192.99.35.26 us +192.99.35.27 - 192.99.40.255 ca +192.99.41.0 - 192.99.41.255 us +192.99.42.0 - 192.99.98.255 ca +192.99.99.0 - 192.99.99.255 us +192.99.100.0 - 192.99.134.195 ca +192.99.134.196 - 192.99.134.199 us +192.99.134.200 - 192.99.149.188 ca +192.99.149.189 - 192.99.149.189 us +192.99.149.190 - 192.99.164.255 ca +192.99.165.0 - 192.99.165.255 us +192.99.166.0 - 192.99.167.217 ca +192.99.167.218 - 192.99.167.218 us +192.99.167.219 - 192.99.191.223 ca +192.99.191.224 - 192.99.191.239 us +192.99.191.240 - 192.99.202.232 ca +192.99.202.233 - 192.99.202.234 us +192.99.202.235 - 192.99.202.255 ca +192.99.203.0 - 192.99.203.255 us +192.99.204.0 - 192.99.239.31 ca +192.99.239.32 - 192.99.239.63 us +192.99.239.64 - 192.99.250.223 ca +192.99.250.224 - 192.99.250.227 us +192.99.250.228 - 192.99.251.159 ca +192.99.251.160 - 192.99.251.175 us +192.99.251.176 - 192.99.251.191 ca +192.99.251.192 - 192.99.251.207 us +192.99.251.208 - 192.99.255.255 ca +192.100.0.0 - 192.100.0.255 us +192.100.1.0 - 192.100.1.255 mu +192.100.2.0 - 192.100.2.255 au 192.100.3.0 - 192.100.17.255 us 192.100.18.0 - 192.100.18.255 fr 192.100.19.0 - 192.100.21.255 us 192.100.22.0 - 192.100.22.255 au 192.100.23.0 - 192.100.25.255 at 192.100.26.0 - 192.100.51.255 us -192.100.52.0 - 192.100.52.255 gb -192.100.53.0 - 192.100.53.255 nz +192.100.52.0 - 192.100.52.255 nl +192.100.53.0 - 192.100.53.255 au 192.100.54.0 - 192.100.60.255 us 192.100.61.0 - 192.100.61.255 gb 192.100.62.0 - 192.100.62.255 us 192.100.63.0 - 192.100.63.255 no -192.100.64.0 - 192.100.71.255 us -192.100.76.0 - 192.100.76.255 us +192.100.64.0 - 192.100.76.255 us 192.100.77.0 - 192.100.77.255 th 192.100.78.0 - 192.100.78.255 gb 192.100.79.0 - 192.100.79.255 us 192.100.80.0 - 192.100.80.255 au -192.100.81.0 - 192.100.81.255 us -192.100.83.0 - 192.100.95.255 us +192.100.81.0 - 192.100.86.255 us +192.100.87.0 - 192.100.87.255 ca +192.100.88.0 - 192.100.95.255 us 192.100.96.0 - 192.100.98.255 de 192.100.99.0 - 192.100.99.255 gb 192.100.100.0 - 192.100.100.255 us 192.100.101.0 - 192.100.101.255 ca 192.100.102.0 - 192.100.103.255 fi 192.100.104.0 - 192.100.106.255 us -192.100.107.0 - 192.100.107.31 fi -192.100.107.32 - 192.100.107.63 gb -192.100.107.64 - 192.100.107.255 fi +192.100.107.0 - 192.100.107.255 fi 192.100.108.0 - 192.100.111.255 us -192.100.112.0 - 192.100.116.255 fi -192.100.117.0 - 192.100.117.255 in -192.100.118.0 - 192.100.133.255 fi +192.100.112.0 - 192.100.129.255 fi +192.100.130.0 - 192.100.130.255 eu +192.100.131.0 - 192.100.133.255 fi 192.100.134.0 - 192.100.134.255 us 192.100.135.0 - 192.100.135.255 my -192.100.136.0 - 192.100.140.255 gb +192.100.136.0 - 192.100.139.255 gb +192.100.140.0 - 192.100.140.255 my 192.100.141.0 - 192.100.143.255 us -192.100.144.0 - 192.100.144.255 gb +192.100.144.0 - 192.100.144.255 nl 192.100.145.0 - 192.100.153.255 us 192.100.154.0 - 192.100.154.255 gb -192.100.155.0 - 192.100.255.255 mx -192.101.1.0 - 192.101.1.255 es +192.100.155.0 - 192.100.156.255 mx +192.100.157.0 - 192.100.157.255 ar +192.100.158.0 - 192.100.170.255 mx +192.100.171.0 - 192.100.171.255 hn +192.100.172.0 - 192.100.176.255 mx +192.100.177.0 - 192.100.177.255 br +192.100.178.0 - 192.100.181.255 mx +192.100.182.0 - 192.100.182.255 cr +192.100.183.0 - 192.100.185.255 mx +192.100.186.0 - 192.100.187.255 ar +192.100.188.0 - 192.100.197.255 mx +192.100.198.0 - 192.100.198.255 br +192.100.199.0 - 192.100.205.255 mx +192.100.206.0 - 192.100.206.255 br +192.100.207.0 - 192.100.213.255 mx +192.100.214.0 - 192.100.215.255 br +192.100.216.0 - 192.100.227.255 mx +192.100.228.0 - 192.100.229.255 br +192.100.230.0 - 192.100.246.255 mx +192.100.247.0 - 192.100.248.255 br +192.100.249.0 - 192.100.250.255 mx +192.100.251.0 - 192.100.253.255 br +192.100.254.0 - 192.100.254.255 ar +192.100.255.0 - 192.100.255.255 us +192.101.0.0 - 192.101.0.255 ca +192.101.1.0 - 192.101.1.255 nl 192.101.2.0 - 192.101.3.255 us -192.101.4.0 - 192.101.4.255 ru -192.101.6.0 - 192.101.7.255 us -192.101.8.0 - 192.101.8.255 es +192.101.4.0 - 192.101.4.255 nl +192.101.5.0 - 192.101.7.255 us +192.101.8.0 - 192.101.8.255 nl +192.101.9.0 - 192.101.10.255 us 192.101.11.0 - 192.101.11.255 gb 192.101.12.0 - 192.101.15.255 us 192.101.16.0 - 192.101.16.255 nz 192.101.17.0 - 192.101.27.255 us -192.101.28.0 - 192.101.28.255 de -192.101.29.0 - 192.101.32.255 us +192.101.28.0 - 192.101.28.255 nl +192.101.29.0 - 192.101.33.255 us 192.101.34.0 - 192.101.34.255 gb 192.101.35.0 - 192.101.63.255 us -192.101.75.0 - 192.101.75.255 de +192.101.73.0 - 192.101.74.255 us +192.101.75.0 - 192.101.75.255 nl 192.101.76.0 - 192.101.80.255 us -192.101.81.0 - 192.101.90.255 nl +192.101.81.0 - 192.101.89.255 nl +192.101.90.0 - 192.101.90.255 br 192.101.91.0 - 192.101.91.255 th -192.101.92.0 - 192.101.110.255 us +192.101.92.0 - 192.101.109.255 us +192.101.110.0 - 192.101.110.255 gb 192.101.111.0 - 192.101.114.255 nl 192.101.115.0 - 192.101.117.255 us -192.101.118.0 - 192.101.118.255 pt +192.101.118.0 - 192.101.118.255 nl 192.101.119.0 - 192.101.133.255 us 192.101.134.0 - 192.101.134.255 au 192.101.135.0 - 192.101.136.255 us -192.101.137.0 - 192.101.137.255 gb -192.101.139.0 - 192.101.141.255 us -192.101.142.0 - 192.101.142.255 eg -192.101.143.0 - 192.101.159.255 us -192.101.160.0 - 192.101.168.255 es +192.101.137.0 - 192.101.137.255 nl +192.101.138.0 - 192.101.141.255 us +192.101.142.0 - 192.101.142.255 mu +192.101.143.0 - 192.101.151.55 us +192.101.151.56 - 192.101.151.56 ca +192.101.151.57 - 192.101.160.255 us +192.101.161.0 - 192.101.168.255 es 192.101.169.0 - 192.101.169.255 pr -192.101.170.0 - 192.101.170.255 be +192.101.170.0 - 192.101.170.255 nl 192.101.171.0 - 192.101.175.255 us -192.101.176.0 - 192.101.176.255 ch -192.101.177.0 - 192.101.178.255 us -192.101.179.0 - 192.101.180.255 de +192.101.176.0 - 192.101.176.255 nl +192.101.178.0 - 192.101.178.255 us +192.101.179.0 - 192.101.180.255 nl 192.101.181.0 - 192.101.182.255 us 192.101.183.0 - 192.101.183.255 au 192.101.184.0 - 192.101.191.255 us -192.101.192.0 - 192.101.192.255 fi +192.101.192.0 - 192.101.192.255 nl 192.101.193.0 - 192.101.196.255 us 192.101.197.0 - 192.101.198.255 de 192.101.199.0 - 192.101.251.255 us -192.101.252.0 - 192.101.252.255 be +192.101.252.0 - 192.101.252.255 nl 192.101.253.0 - 192.101.253.255 us 192.101.254.0 - 192.101.254.255 au -192.102.1.0 - 192.102.1.255 at +192.101.255.0 - 192.102.0.255 us +192.102.1.0 - 192.102.1.255 nl 192.102.2.0 - 192.102.5.255 us +192.102.6.0 - 192.102.7.255 ua 192.102.8.0 - 192.102.8.255 gb -192.102.9.0 - 192.102.9.255 za +192.102.9.0 - 192.102.9.255 mu 192.102.10.0 - 192.102.10.255 us 192.102.11.0 - 192.102.11.255 ca 192.102.12.0 - 192.102.16.255 us 192.102.17.0 - 192.102.17.255 at -192.102.18.0 - 192.102.32.255 fi -192.102.33.0 - 192.102.33.255 us -192.102.34.0 - 192.102.81.255 fi +192.102.18.0 - 192.102.81.255 fi 192.102.82.0 - 192.102.82.255 us -192.102.83.0 - 192.102.83.255 th +192.102.83.0 - 192.102.83.255 au 192.102.84.0 - 192.102.84.255 pe +192.102.85.0 - 192.102.85.255 us 192.102.88.0 - 192.102.88.255 us 192.102.89.0 - 192.102.89.255 de 192.102.90.0 - 192.102.91.255 us 192.102.92.0 - 192.102.92.255 nz 192.102.93.0 - 192.102.94.255 us -192.102.95.0 - 192.102.95.255 eu +192.102.95.0 - 192.102.95.255 ch 192.102.96.0 - 192.102.145.255 us 192.102.146.0 - 192.102.177.255 de 192.102.178.0 - 192.102.213.255 us -192.102.214.0 - 192.102.214.255 gb +192.102.214.0 - 192.102.214.255 nl 192.102.215.0 - 192.102.223.255 us -192.102.224.0 - 192.102.224.255 fr -192.102.225.0 - 192.102.225.255 pl +192.102.224.0 - 192.102.225.255 nl 192.102.226.0 - 192.102.226.255 us 192.102.227.0 - 192.102.228.255 gb 192.102.229.0 - 192.102.229.255 ru @@ -86756,94 +76871,95 @@ 192.102.240.0 - 192.102.249.255 us 192.102.250.0 - 192.102.251.255 au 192.102.252.0 - 192.102.253.255 us -192.103.1.0 - 192.103.1.255 us +192.102.254.0 - 192.102.255.255 ca +192.103.0.0 - 192.103.1.255 us 192.103.2.0 - 192.103.2.255 lu 192.103.3.0 - 192.103.6.255 us -192.103.7.0 - 192.103.7.255 fr -192.103.8.0 - 192.103.11.255 us -192.103.13.0 - 192.103.13.255 us +192.103.7.0 - 192.103.7.255 nl +192.103.8.0 - 192.103.13.255 us 192.103.14.0 - 192.103.14.255 ae 192.103.15.0 - 192.103.19.255 us 192.103.20.0 - 192.103.20.255 gr 192.103.21.0 - 192.103.22.255 us -192.103.23.0 - 192.103.23.255 de +192.103.23.0 - 192.103.23.255 nl 192.103.24.0 - 192.103.26.255 us 192.103.27.0 - 192.103.27.255 de 192.103.28.0 - 192.103.39.255 gb 192.103.40.0 - 192.103.40.255 de 192.103.41.0 - 192.103.41.255 us -192.103.42.0 - 192.103.43.255 jp +192.103.42.0 - 192.103.42.255 au +192.103.43.0 - 192.103.43.255 jp 192.103.44.0 - 192.103.45.255 us 192.103.46.0 - 192.103.46.255 au 192.103.47.0 - 192.103.84.255 us 192.103.85.0 - 192.103.116.255 fi 192.103.117.0 - 192.103.129.255 us 192.103.130.0 - 192.103.130.255 au +192.103.131.0 - 192.103.131.255 us 192.103.132.0 - 192.103.132.255 au 192.103.133.0 - 192.103.136.255 us 192.103.137.0 - 192.103.139.255 gb 192.103.140.0 - 192.103.146.255 us -192.103.147.0 - 192.103.147.255 pt +192.103.147.0 - 192.103.147.255 nl 192.103.148.0 - 192.104.14.255 us -192.104.15.0 - 192.104.15.255 kr -192.104.16.0 - 192.104.19.255 us -192.104.21.0 - 192.104.22.255 us -192.104.23.0 - 192.104.23.255 it +192.104.15.0 - 192.104.15.255 au +192.104.16.0 - 192.104.22.255 us +192.104.23.0 - 192.104.23.255 nl 192.104.24.0 - 192.104.27.255 us -192.104.28.0 - 192.104.29.255 gb +192.104.28.0 - 192.104.29.255 nl 192.104.30.0 - 192.104.34.255 us 192.104.35.0 - 192.104.37.255 pt +192.104.38.0 - 192.104.38.255 ca 192.104.39.0 - 192.104.39.255 us -192.104.40.0 - 192.104.40.255 jp +192.104.40.0 - 192.104.40.255 au 192.104.41.0 - 192.104.41.255 ch 192.104.42.0 - 192.104.42.255 us 192.104.43.0 - 192.104.45.255 au 192.104.46.0 - 192.104.47.255 us 192.104.48.0 - 192.104.48.255 pt -192.104.50.0 - 192.104.52.255 us +192.104.49.0 - 192.104.52.255 us 192.104.53.0 - 192.104.53.255 gb 192.104.54.0 - 192.104.54.255 us 192.104.55.0 - 192.104.56.255 nl 192.104.57.0 - 192.104.58.255 no 192.104.59.0 - 192.104.71.255 us 192.104.72.0 - 192.104.72.255 ch -192.104.74.0 - 192.104.76.255 us -192.104.77.0 - 192.104.77.255 de +192.104.73.0 - 192.104.76.255 us +192.104.77.0 - 192.104.77.255 nl 192.104.78.0 - 192.104.79.255 us -192.104.80.0 - 192.104.80.255 jp +192.104.80.0 - 192.104.80.255 au 192.104.81.0 - 192.104.81.255 us 192.104.82.0 - 192.104.82.255 gb -192.104.83.0 - 192.104.111.255 us -192.104.136.0 - 192.104.139.255 us +192.104.83.0 - 192.104.139.255 us 192.104.140.0 - 192.104.140.255 nl 192.104.141.0 - 192.104.141.255 us 192.104.142.0 - 192.104.142.255 nl 192.104.143.0 - 192.104.146.255 us 192.104.147.0 - 192.104.147.255 gr 192.104.148.0 - 192.104.153.255 us -192.104.154.0 - 192.104.154.255 ie -192.104.155.0 - 192.104.155.255 fr -192.104.156.0 - 192.104.159.255 us -192.104.163.0 - 192.104.166.255 us -192.104.167.0 - 192.104.168.255 be +192.104.154.0 - 192.104.155.255 nl +192.104.156.0 - 192.104.166.255 us +192.104.167.0 - 192.104.168.255 nl 192.104.169.0 - 192.104.171.255 us -192.104.172.0 - 192.104.172.255 jp +192.104.172.0 - 192.104.172.255 au 192.104.173.0 - 192.104.231.255 us 192.104.232.0 - 192.104.233.255 jp 192.104.234.0 - 192.104.237.255 us -192.104.238.0 - 192.104.238.255 gb -192.104.239.0 - 192.104.244.255 us +192.104.238.0 - 192.104.238.255 nl +192.104.239.0 - 192.104.242.255 us +192.104.243.0 - 192.104.243.255 ca +192.104.244.0 - 192.104.244.255 us 192.104.245.0 - 192.104.245.255 fr -192.104.246.0 - 192.104.247.255 jp +192.104.246.0 - 192.104.246.255 jp +192.104.247.0 - 192.104.247.255 au 192.104.248.0 - 192.104.248.255 dk 192.104.249.0 - 192.104.250.255 us -192.104.251.0 - 192.104.251.255 ch -192.104.252.0 - 192.104.252.255 nz -192.104.253.0 - 192.104.254.255 us -192.105.0.0 - 192.105.9.255 us -192.105.10.0 - 192.105.10.255 nz +192.104.251.0 - 192.104.251.255 nl +192.104.252.0 - 192.104.252.255 au +192.104.253.0 - 192.105.9.255 us +192.105.10.0 - 192.105.10.255 au 192.105.11.0 - 192.105.74.255 us -192.105.75.0 - 192.105.75.255 ru +192.105.75.0 - 192.105.75.255 nl 192.105.76.0 - 192.105.103.255 us 192.105.104.0 - 192.105.108.255 ca 192.105.109.0 - 192.105.169.255 us @@ -86854,13 +76970,12 @@ 192.105.254.0 - 192.105.254.255 gb 192.105.255.0 - 192.105.255.255 us 192.106.0.0 - 192.106.255.255 it -192.107.1.0 - 192.107.1.255 no -192.107.2.0 - 192.107.2.255 gb +192.107.0.0 - 192.107.0.255 us +192.107.1.0 - 192.107.2.255 nl 192.107.3.0 - 192.107.3.255 us 192.107.4.0 - 192.107.5.255 gb 192.107.7.0 - 192.107.8.255 us -192.107.9.0 - 192.107.9.255 au -192.107.10.0 - 192.107.10.255 nz +192.107.9.0 - 192.107.10.255 au 192.107.11.0 - 192.107.13.255 gb 192.107.14.0 - 192.107.48.255 us 192.107.50.0 - 192.107.50.255 us @@ -86870,9 +76985,11 @@ 192.107.104.0 - 192.107.104.255 ni 192.107.105.0 - 192.107.109.255 us 192.107.110.0 - 192.107.110.255 ie -192.107.112.0 - 192.107.113.255 nz -192.107.114.0 - 192.107.114.255 no -192.107.115.0 - 192.107.119.255 us +192.107.111.0 - 192.107.111.255 pr +192.107.112.0 - 192.107.112.255 au +192.107.113.0 - 192.107.113.255 nz +192.107.114.0 - 192.107.114.255 nl +192.107.115.0 - 192.107.121.255 us 192.107.122.0 - 192.107.122.255 pt 192.107.123.0 - 192.107.123.255 de 192.107.124.0 - 192.107.125.255 at @@ -86880,13 +76997,15 @@ 192.107.130.0 - 192.107.130.255 us 192.107.131.0 - 192.107.131.255 ca 192.107.132.0 - 192.107.132.255 de -192.107.134.0 - 192.107.134.255 us -192.107.144.0 - 192.107.167.255 us -192.107.168.0 - 192.107.168.255 gb +192.107.133.0 - 192.107.133.255 ca +192.107.134.0 - 192.107.143.255 us +192.107.144.0 - 192.107.144.255 ca +192.107.145.0 - 192.107.167.255 us +192.107.168.0 - 192.107.168.255 nl 192.107.169.0 - 192.107.170.255 us -192.107.171.0 - 192.107.172.255 nz +192.107.171.0 - 192.107.172.255 au 192.107.173.0 - 192.107.173.255 us -192.107.174.0 - 192.107.174.255 gb +192.107.174.0 - 192.107.174.255 nl 192.107.175.0 - 192.107.176.255 us 192.107.177.0 - 192.107.177.255 gr 192.107.178.0 - 192.107.178.255 gb @@ -86896,12 +77015,18 @@ 192.107.200.0 - 192.107.231.255 fi 192.107.232.0 - 192.107.233.255 at 192.107.234.0 - 192.107.234.255 us -192.107.235.0 - 192.107.236.255 de +192.107.235.0 - 192.107.236.255 nl 192.107.237.0 - 192.108.22.255 us -192.108.23.0 - 192.108.92.255 de +192.108.23.0 - 192.108.26.255 de +192.108.27.0 - 192.108.32.255 eu +192.108.33.0 - 192.108.33.255 de +192.108.34.0 - 192.108.34.255 eu +192.108.35.0 - 192.108.49.255 de +192.108.50.0 - 192.108.50.255 us +192.108.51.0 - 192.108.92.255 de 192.108.93.0 - 192.108.98.255 us 192.108.99.0 - 192.108.99.255 au -192.108.100.0 - 192.108.101.255 no +192.108.100.0 - 192.108.101.255 nl 192.108.102.0 - 192.108.106.255 us 192.108.107.0 - 192.108.108.255 se 192.108.109.0 - 192.108.112.255 us @@ -86913,14 +77038,15 @@ 192.108.122.0 - 192.108.124.255 us 192.108.125.0 - 192.108.125.255 sk 192.108.126.0 - 192.108.126.255 cz +192.108.127.0 - 192.108.127.255 us 192.108.128.0 - 192.108.129.255 cz 192.108.130.0 - 192.108.133.255 sk -192.108.134.0 - 192.108.136.255 cz +192.108.134.0 - 192.108.134.255 cz +192.108.135.0 - 192.108.135.255 sk +192.108.136.0 - 192.108.136.255 cz 192.108.137.0 - 192.108.145.255 sk 192.108.146.0 - 192.108.147.255 cz -192.108.148.0 - 192.108.149.255 sk -192.108.150.0 - 192.108.151.255 cz -192.108.152.0 - 192.108.153.255 sk +192.108.148.0 - 192.108.153.255 sk 192.108.154.0 - 192.108.154.255 cz 192.108.155.0 - 192.108.155.255 sk 192.108.156.0 - 192.108.156.255 cz @@ -86933,77 +77059,93 @@ 192.108.195.0 - 192.108.214.255 se 192.108.215.0 - 192.108.229.255 us 192.108.230.0 - 192.108.230.255 th -192.108.231.0 - 192.108.231.255 us -192.108.233.0 - 192.108.233.255 us +192.108.231.0 - 192.108.233.255 us 192.108.234.0 - 192.108.234.255 ch 192.108.235.0 - 192.108.237.255 us -192.108.238.0 - 192.108.238.255 at -192.108.240.0 - 192.108.255.255 us -192.109.0.0 - 192.109.139.255 de -192.109.140.0 - 192.109.148.255 fr -192.109.149.0 - 192.109.172.255 de -192.109.173.0 - 192.109.173.255 sg -192.109.174.0 - 192.109.190.255 de -192.109.191.0 - 192.109.193.255 at -192.109.194.0 - 192.109.194.255 in -192.109.195.0 - 192.109.203.255 de -192.109.204.0 - 192.109.204.255 be -192.109.205.0 - 192.109.213.255 de -192.109.214.0 - 192.109.215.255 ch -192.109.216.0 - 192.109.255.255 de -192.110.0.0 - 192.110.36.255 us -192.110.37.0 - 192.110.37.255 ca -192.110.38.0 - 192.110.84.255 us +192.108.238.0 - 192.108.238.255 nl +192.108.239.0 - 192.108.255.255 us +192.109.0.0 - 192.109.39.255 de +192.109.42.0 - 192.109.44.255 de +192.109.45.0 - 192.109.45.255 us +192.109.46.0 - 192.109.46.255 de +192.109.48.0 - 192.109.73.255 de +192.109.75.0 - 192.109.75.255 us +192.109.76.0 - 192.109.91.255 de +192.109.92.0 - 192.109.93.255 us +192.109.94.0 - 192.109.96.255 de +192.109.99.0 - 192.109.99.255 us +192.109.101.0 - 192.109.102.255 de +192.109.103.0 - 192.109.104.255 us +192.109.105.0 - 192.109.119.255 de +192.109.120.0 - 192.109.120.255 us +192.109.121.0 - 192.109.122.255 de +192.109.124.0 - 192.109.135.255 de +192.109.137.0 - 192.109.137.255 de +192.109.140.0 - 192.109.140.127 fr +192.109.140.128 - 192.109.140.159 eu +192.109.140.160 - 192.109.140.255 gb +192.109.141.0 - 192.109.142.255 fr +192.109.143.0 - 192.109.143.255 de +192.109.144.0 - 192.109.144.255 fr +192.109.145.0 - 192.109.145.255 us +192.109.146.0 - 192.109.146.255 in +192.109.147.0 - 192.109.147.255 br +192.109.148.0 - 192.109.148.255 fr +192.109.150.0 - 192.109.216.255 de +192.109.218.0 - 192.109.218.255 us +192.109.220.0 - 192.109.239.255 de +192.109.241.0 - 192.109.241.255 de +192.109.242.0 - 192.109.242.255 mu +192.109.246.0 - 192.109.255.255 de +192.110.0.0 - 192.110.84.255 us 192.110.85.0 - 192.110.85.255 ca 192.110.86.0 - 192.110.89.255 us 192.110.90.0 - 192.110.90.255 ca -192.110.91.0 - 192.110.94.255 us -192.110.95.0 - 192.110.95.255 ca -192.110.96.0 - 192.110.105.255 us +192.110.91.0 - 192.110.105.255 us 192.110.106.0 - 192.110.106.255 ca 192.110.107.0 - 192.110.115.255 us 192.110.116.0 - 192.110.116.255 ca -192.110.117.0 - 192.110.191.255 us -192.110.223.0 - 192.110.240.255 us +192.110.117.0 - 192.110.171.255 us +192.110.172.0 - 192.110.175.255 ca +192.110.176.0 - 192.110.240.255 us 192.110.241.0 - 192.110.241.255 gb 192.110.242.0 - 192.111.31.255 us 192.111.32.0 - 192.111.32.255 au -192.111.33.0 - 192.111.33.255 no -192.111.34.0 - 192.111.36.255 us -192.111.39.0 - 192.111.39.255 ie +192.111.33.0 - 192.111.33.255 nl +192.111.34.0 - 192.111.38.255 us +192.111.39.0 - 192.111.39.255 nl 192.111.40.0 - 192.111.43.255 us 192.111.44.0 - 192.111.44.255 cz 192.111.45.0 - 192.111.46.255 us -192.111.47.0 - 192.111.47.255 de -192.111.48.0 - 192.111.48.255 ch -192.111.49.0 - 192.111.53.255 us -192.111.86.0 - 192.111.87.255 us -192.111.88.0 - 192.111.88.255 gb +192.111.47.0 - 192.111.48.255 nl +192.111.49.0 - 192.111.87.255 us +192.111.88.0 - 192.111.88.255 nl 192.111.89.0 - 192.111.100.255 us -192.111.101.0 - 192.111.101.255 pt +192.111.101.0 - 192.111.101.255 nl 192.111.102.0 - 192.111.102.255 nz 192.111.103.0 - 192.111.103.255 ch -192.111.104.0 - 192.111.104.255 at +192.111.104.0 - 192.111.104.255 nl 192.111.105.0 - 192.111.105.255 au 192.111.106.0 - 192.111.123.255 us 192.111.124.0 - 192.111.125.255 no 192.111.126.0 - 192.111.126.255 us -192.111.127.0 - 192.111.127.255 de -192.111.160.0 - 192.111.228.255 us +192.111.127.0 - 192.111.127.255 nl +192.111.128.0 - 192.111.153.111 us +192.111.153.112 - 192.111.153.115 at +192.111.153.116 - 192.111.228.255 us 192.111.229.0 - 192.111.230.255 br 192.111.231.0 - 192.111.251.255 us 192.111.252.0 - 192.111.252.255 at -192.111.253.0 - 192.111.254.255 us -192.112.0.0 - 192.112.28.255 us +192.111.253.0 - 192.112.28.255 us +192.112.29.0 - 192.112.29.255 ca 192.112.30.0 - 192.112.32.255 pt -192.112.33.0 - 192.112.34.255 us -192.112.36.0 - 192.112.44.255 us -192.112.45.0 - 192.112.45.255 pt +192.112.33.0 - 192.112.44.255 us +192.112.45.0 - 192.112.45.255 nl 192.112.46.0 - 192.112.48.255 us -192.112.49.0 - 192.112.49.255 gb +192.112.49.0 - 192.112.49.255 nl 192.112.50.0 - 192.112.60.255 us 192.112.61.0 - 192.112.61.255 at -192.112.62.0 - 192.112.68.255 us +192.112.62.0 - 192.112.69.255 us 192.112.70.0 - 192.112.79.255 es 192.112.80.0 - 192.112.97.255 us 192.112.98.0 - 192.112.98.255 gb @@ -87012,44 +77154,29 @@ 192.112.101.0 - 192.112.203.255 us 192.112.204.0 - 192.112.204.255 fi 192.112.205.0 - 192.112.205.255 us -192.112.206.0 - 192.112.206.255 se +192.112.206.0 - 192.112.206.255 nl 192.112.207.0 - 192.112.207.255 us 192.112.208.0 - 192.112.208.255 de 192.112.209.0 - 192.112.212.255 us -192.112.213.0 - 192.112.213.255 de -192.112.214.0 - 192.112.214.255 ch +192.112.213.0 - 192.112.214.255 nl 192.112.215.0 - 192.112.215.255 au 192.112.216.0 - 192.112.246.255 us 192.112.247.0 - 192.112.247.255 es 192.112.248.0 - 192.112.253.255 us -192.112.254.0 - 192.112.254.255 ch +192.112.254.0 - 192.112.254.255 nl +192.112.255.0 - 192.112.255.255 us 192.113.0.0 - 192.113.255.255 nl -192.114.0.0 - 192.114.189.223 il -192.114.189.224 - 192.114.189.227 a2 -192.114.189.228 - 192.115.255.255 il -192.116.0.0 - 192.116.1.255 ps -192.116.2.0 - 192.116.5.255 il -192.116.6.0 - 192.116.7.255 ps -192.116.8.0 - 192.116.9.255 il -192.116.10.0 - 192.116.23.255 ps -192.116.24.0 - 192.116.72.255 il -192.116.73.0 - 192.116.73.255 a2 -192.116.74.0 - 192.116.84.255 il -192.116.85.0 - 192.116.85.255 a2 -192.116.86.0 - 192.116.87.255 il -192.116.88.0 - 192.116.88.255 a2 -192.116.89.0 - 192.116.118.255 il -192.116.119.0 - 192.116.119.255 a2 -192.116.120.0 - 192.116.142.255 il -192.116.143.0 - 192.116.143.255 a2 -192.116.144.0 - 192.116.231.227 il -192.116.231.228 - 192.116.231.231 a2 -192.116.231.232 - 192.118.255.255 il -192.119.0.0 - 192.120.8.255 us +192.114.0.0 - 192.114.71.12 il +192.114.71.13 - 192.114.71.13 ca +192.114.71.14 - 192.116.11.255 il +192.116.12.0 - 192.116.23.255 ps +192.116.24.0 - 192.118.255.255 il +192.119.0.0 - 192.119.0.255 ca +192.119.1.0 - 192.119.255.255 us +192.120.0.0 - 192.120.0.255 ca +192.120.1.0 - 192.120.8.255 us 192.120.9.0 - 192.120.15.255 au -192.120.16.0 - 192.120.46.255 us -192.120.47.0 - 192.120.49.255 fi -192.120.50.0 - 192.120.58.255 us +192.120.16.0 - 192.120.58.255 us 192.120.59.0 - 192.120.59.255 es 192.120.60.0 - 192.120.119.255 us 192.120.120.0 - 192.120.120.255 se @@ -87059,138 +77186,183 @@ 192.121.0.0 - 192.121.0.255 gb 192.121.1.0 - 192.121.1.255 se 192.121.2.0 - 192.121.2.255 es -192.121.3.0 - 192.121.24.255 se +192.121.3.0 - 192.121.15.255 se +192.121.16.0 - 192.121.17.255 nl +192.121.18.0 - 192.121.21.255 se +192.121.22.0 - 192.121.23.255 de +192.121.24.0 - 192.121.24.255 se 192.121.25.0 - 192.121.25.255 gb -192.121.26.0 - 192.121.35.255 se +192.121.26.0 - 192.121.30.255 se +192.121.31.0 - 192.121.31.255 es +192.121.32.0 - 192.121.34.255 se +192.121.35.0 - 192.121.35.255 dk 192.121.36.0 - 192.121.37.255 gb -192.121.38.0 - 192.121.52.255 se -192.121.53.0 - 192.121.53.255 jp -192.121.54.0 - 192.121.62.255 se -192.121.63.0 - 192.121.63.255 mt +192.121.38.0 - 192.121.38.255 no +192.121.39.0 - 192.121.45.255 se +192.121.46.0 - 192.121.47.255 it +192.121.48.0 - 192.121.63.255 se 192.121.64.0 - 192.121.65.255 gb -192.121.66.0 - 192.121.105.255 se +192.121.66.0 - 192.121.70.255 se +192.121.71.0 - 192.121.71.255 it +192.121.72.0 - 192.121.105.255 se 192.121.106.0 - 192.121.107.255 gb -192.121.108.0 - 192.121.131.255 se -192.121.132.0 - 192.121.132.255 gb -192.121.133.0 - 192.121.139.255 se -192.121.140.0 - 192.121.140.255 gb -192.121.141.0 - 192.121.175.255 se +192.121.108.0 - 192.121.111.255 se +192.121.112.0 - 192.121.113.255 gb +192.121.114.0 - 192.121.121.255 se +192.121.122.0 - 192.121.122.255 it +192.121.123.0 - 192.121.124.255 es +192.121.125.0 - 192.121.125.255 it +192.121.126.0 - 192.121.126.255 dk +192.121.127.0 - 192.121.146.255 se +192.121.147.0 - 192.121.149.255 fr +192.121.150.0 - 192.121.151.255 se +192.121.152.0 - 192.121.152.255 fr +192.121.153.0 - 192.121.154.255 se +192.121.155.0 - 192.121.155.255 nl +192.121.156.0 - 192.121.159.255 de +192.121.160.0 - 192.121.161.255 se +192.121.162.0 - 192.121.163.255 nl +192.121.164.0 - 192.121.165.255 se +192.121.166.0 - 192.121.167.255 gb +192.121.168.0 - 192.121.168.255 se +192.121.169.0 - 192.121.169.255 es +192.121.170.0 - 192.121.170.255 ch +192.121.171.0 - 192.121.171.255 it +192.121.172.0 - 192.121.175.255 se 192.121.176.0 - 192.121.177.255 gb 192.121.178.0 - 192.121.178.255 de 192.121.179.0 - 192.121.180.255 se 192.121.181.0 - 192.121.181.255 dk -192.121.182.0 - 192.121.186.255 se +192.121.182.0 - 192.121.183.255 se +192.121.184.0 - 192.121.184.255 es +192.121.185.0 - 192.121.186.255 nl 192.121.187.0 - 192.121.189.255 gb -192.121.190.0 - 192.121.195.255 se +192.121.190.0 - 192.121.190.255 se +192.121.191.0 - 192.121.191.255 it +192.121.192.0 - 192.121.195.255 se 192.121.196.0 - 192.121.197.255 gb -192.121.198.0 - 192.121.250.255 se -192.121.251.0 - 192.121.251.255 ee +192.121.198.0 - 192.121.219.255 se +192.121.220.0 - 192.121.220.255 it +192.121.221.0 - 192.121.224.255 se +192.121.225.0 - 192.121.225.255 de +192.121.226.0 - 192.121.250.255 se +192.121.251.0 - 192.121.251.255 de 192.121.252.0 - 192.121.255.255 se -192.122.0.0 - 192.122.95.255 gb -192.122.96.0 - 192.122.100.255 us -192.122.101.0 - 192.122.116.255 gb -192.122.117.0 - 192.122.117.255 us -192.122.118.0 - 192.122.130.255 gb +192.122.0.0 - 192.122.0.255 us +192.122.1.0 - 192.122.95.255 gb +192.122.96.0 - 192.122.99.255 us +192.122.100.0 - 192.122.130.255 gb 192.122.131.0 - 192.122.140.255 sg 192.122.141.0 - 192.122.146.255 gb -192.122.147.0 - 192.122.148.255 us +192.122.147.0 - 192.122.150.255 us 192.122.151.0 - 192.122.170.255 gb -192.122.171.0 - 192.122.171.255 nz +192.122.171.0 - 192.122.171.255 au 192.122.172.0 - 192.122.175.255 us 192.122.176.0 - 192.122.176.255 au 192.122.177.0 - 192.122.179.255 us -192.122.180.0 - 192.122.180.255 nz -192.122.181.0 - 192.122.209.255 us +192.122.180.0 - 192.122.180.255 au +192.122.181.0 - 192.122.205.255 us +192.122.206.0 - 192.122.206.255 ca +192.122.207.0 - 192.122.209.255 us 192.122.210.0 - 192.122.210.255 au 192.122.211.0 - 192.122.213.255 us 192.122.214.0 - 192.122.214.255 gb +192.122.215.0 - 192.122.215.255 us 192.122.216.0 - 192.122.234.255 ie 192.122.235.0 - 192.122.237.255 us 192.122.238.0 - 192.122.242.255 pt -192.122.243.0 - 192.122.253.255 us -192.122.254.0 - 192.122.254.255 no -192.123.0.0 - 192.124.9.255 us +192.122.243.0 - 192.124.9.255 us 192.124.10.0 - 192.124.14.255 au 192.124.15.0 - 192.124.23.255 us -192.124.24.0 - 192.124.24.255 nz +192.124.24.0 - 192.124.24.255 au 192.124.25.0 - 192.124.28.255 de +192.124.29.0 - 192.124.29.255 us +192.124.30.0 - 192.124.30.255 ca 192.124.31.0 - 192.124.31.255 us 192.124.32.0 - 192.124.32.255 at 192.124.33.0 - 192.124.38.255 us 192.124.39.0 - 192.124.39.255 be -192.124.40.0 - 192.124.43.255 us -192.124.45.0 - 192.124.45.255 us +192.124.40.0 - 192.124.45.255 us 192.124.46.0 - 192.124.46.255 gb 192.124.47.0 - 192.124.111.255 us -192.124.112.0 - 192.124.112.255 de +192.124.112.0 - 192.124.112.255 nl 192.124.113.0 - 192.124.114.255 us -192.124.115.0 - 192.124.115.255 de +192.124.115.0 - 192.124.115.255 nl 192.124.116.0 - 192.124.116.255 pl 192.124.117.0 - 192.124.117.255 au -192.124.118.0 - 192.124.118.255 us -192.124.120.0 - 192.124.151.255 us +192.124.118.0 - 192.124.151.255 us 192.124.152.0 - 192.124.152.255 au 192.124.153.0 - 192.124.153.255 us 192.124.154.0 - 192.124.154.255 cn -192.124.155.0 - 192.124.155.255 at -192.124.156.0 - 192.124.167.255 us -192.124.168.0 - 192.124.219.255 ru +192.124.155.0 - 192.124.155.255 nl +192.124.156.0 - 192.124.169.255 us +192.124.170.0 - 192.124.219.255 ru 192.124.220.0 - 192.124.234.255 us -192.124.235.0 - 192.125.255.255 de -192.126.0.0 - 192.126.64.255 fi -192.126.65.0 - 192.126.68.255 us -192.127.0.0 - 192.128.255.255 us -192.129.1.0 - 192.129.2.255 de -192.129.3.0 - 192.129.4.255 ro -192.129.5.0 - 192.129.52.255 de -192.129.53.0 - 192.129.53.255 nl -192.129.54.0 - 192.129.61.255 de +192.124.235.0 - 192.124.235.255 nl +192.124.236.0 - 192.124.236.255 us +192.124.237.0 - 192.124.245.255 de +192.124.246.0 - 192.124.246.255 us +192.124.247.0 - 192.124.248.255 nl +192.124.249.0 - 192.124.249.255 us +192.124.250.0 - 192.125.255.255 de +192.126.0.0 - 192.126.0.255 us +192.126.1.0 - 192.126.64.255 fi +192.126.65.0 - 192.128.2.255 us +192.128.3.0 - 192.128.3.255 gb +192.128.4.0 - 192.128.253.255 us +192.128.254.0 - 192.128.254.255 eu +192.128.255.0 - 192.129.0.255 us +192.129.1.0 - 192.129.61.255 de 192.129.62.0 - 192.129.79.255 us 192.129.80.0 - 192.129.80.255 at 192.129.81.0 - 192.129.86.255 us 192.129.87.0 - 192.129.87.255 tr 192.129.88.0 - 192.129.97.255 us 192.129.98.0 - 192.129.98.255 de -192.129.100.0 - 192.129.111.255 us -192.130.0.0 - 192.130.17.255 fi -192.130.18.0 - 192.130.18.255 be -192.130.19.0 - 192.130.73.223 fi -192.130.73.224 - 192.130.73.255 ax -192.130.74.0 - 192.130.196.127 fi -192.130.196.128 - 192.130.196.159 ax -192.130.196.160 - 192.130.247.255 fi -192.130.248.0 - 192.130.248.7 ax -192.130.248.8 - 192.130.255.255 fi +192.129.99.0 - 192.129.255.255 us +192.130.0.0 - 192.130.255.255 fi 192.131.0.0 - 192.131.12.255 us 192.131.13.0 - 192.131.13.255 au 192.131.14.0 - 192.131.19.255 us -192.131.20.0 - 192.131.20.255 de -192.131.22.0 - 192.131.24.255 us -192.131.25.0 - 192.131.26.255 se +192.131.20.0 - 192.131.20.255 nl +192.131.21.0 - 192.131.24.255 us +192.131.25.0 - 192.131.25.255 au +192.131.26.0 - 192.131.26.255 nl 192.131.27.0 - 192.131.30.255 au -192.131.31.0 - 192.131.78.255 us -192.131.79.0 - 192.131.79.255 gb -192.131.80.0 - 192.131.87.255 us -192.131.89.0 - 192.131.89.255 gb +192.131.31.0 - 192.131.31.255 us +192.131.32.0 - 192.131.39.255 jm +192.131.40.0 - 192.131.43.255 us +192.131.44.0 - 192.131.44.255 ca +192.131.45.0 - 192.131.78.255 us +192.131.79.0 - 192.131.79.255 nl +192.131.80.0 - 192.131.88.255 us +192.131.89.0 - 192.131.89.255 nl 192.131.90.0 - 192.131.91.255 in 192.131.92.0 - 192.131.92.255 au 192.131.93.0 - 192.131.93.255 us 192.131.94.0 - 192.131.94.255 ca 192.131.95.0 - 192.131.95.255 us -192.131.96.0 - 192.131.96.255 fi +192.131.96.0 - 192.131.96.255 nl 192.131.97.0 - 192.131.97.255 ca 192.131.98.0 - 192.131.107.255 us -192.131.108.0 - 192.131.108.255 gb -192.131.109.0 - 192.131.109.255 us -192.131.111.0 - 192.131.131.255 us +192.131.108.0 - 192.131.108.255 nl +192.131.109.0 - 192.131.131.255 us 192.131.132.0 - 192.131.132.255 be 192.131.133.0 - 192.131.133.255 us +192.131.134.0 - 192.131.134.255 bl 192.131.135.0 - 192.131.135.255 us -192.131.136.0 - 192.131.142.255 ca -192.131.143.0 - 192.131.250.255 us +192.131.136.0 - 192.131.139.255 ca +192.131.143.0 - 192.131.151.255 us +192.131.152.0 - 192.131.152.255 au +192.131.153.0 - 192.131.210.255 us +192.131.211.0 - 192.131.211.255 ap +192.131.212.0 - 192.131.232.255 us +192.131.234.0 - 192.131.234.255 ca +192.131.235.0 - 192.131.250.255 us 192.131.251.0 - 192.131.252.255 au -192.131.253.0 - 192.131.254.255 us -192.132.0.0 - 192.132.7.255 us +192.131.253.0 - 192.131.255.255 us +192.132.0.0 - 192.132.0.255 ca +192.132.1.0 - 192.132.8.255 us 192.132.9.0 - 192.132.9.255 gb 192.132.10.0 - 192.132.10.255 it 192.132.11.0 - 192.132.11.255 no @@ -87198,10 +77370,10 @@ 192.132.15.0 - 192.132.15.255 kr 192.132.16.0 - 192.132.18.255 us 192.132.19.0 - 192.132.19.255 ca -192.132.20.0 - 192.132.27.255 us -192.132.29.0 - 192.132.29.255 us +192.132.20.0 - 192.132.30.255 us 192.132.31.0 - 192.132.31.255 jp -192.132.34.0 - 192.132.34.255 it +192.132.32.0 - 192.132.33.255 us +192.132.34.0 - 192.132.34.255 nl 192.132.35.0 - 192.132.35.255 br 192.132.36.0 - 192.132.40.255 us 192.132.41.0 - 192.132.41.255 au @@ -87211,7 +77383,7 @@ 192.132.55.0 - 192.132.55.255 pt 192.132.56.0 - 192.132.59.255 us 192.132.60.0 - 192.132.60.255 ca -192.132.64.0 - 192.132.92.255 us +192.132.61.0 - 192.132.92.255 us 192.132.93.0 - 192.132.93.255 au 192.132.94.0 - 192.132.98.255 us 192.132.99.0 - 192.132.99.255 gb @@ -87221,73 +77393,73 @@ 192.132.239.0 - 192.132.239.255 gb 192.132.240.0 - 192.132.240.255 us 192.132.241.0 - 192.132.241.255 ca -192.132.242.0 - 192.132.242.255 us -192.132.244.0 - 192.132.244.255 il -192.132.245.0 - 192.132.245.255 at +192.132.242.0 - 192.132.243.255 us +192.132.244.0 - 192.132.245.255 nl 192.132.246.0 - 192.132.246.255 us 192.132.247.0 - 192.132.251.255 kr 192.132.252.0 - 192.132.252.255 ch 192.132.253.0 - 192.132.253.255 au -192.132.254.0 - 192.132.254.255 us -192.133.0.0 - 192.133.9.255 us -192.133.10.0 - 192.133.10.255 th +192.132.254.0 - 192.132.255.255 us +192.133.0.0 - 192.133.1.255 ca +192.133.2.0 - 192.133.9.255 us +192.133.10.0 - 192.133.10.255 au 192.133.11.0 - 192.133.13.255 us 192.133.14.0 - 192.133.14.255 au -192.133.15.0 - 192.133.15.255 pt +192.133.15.0 - 192.133.15.255 nl 192.133.16.0 - 192.133.20.255 us 192.133.21.0 - 192.133.21.255 au 192.133.22.0 - 192.133.27.255 us 192.133.28.0 - 192.133.28.255 it 192.133.29.0 - 192.133.30.255 us -192.133.31.0 - 192.133.31.255 nz +192.133.31.0 - 192.133.31.255 au 192.133.32.0 - 192.133.32.255 no 192.133.33.0 - 192.133.35.255 us -192.133.36.0 - 192.133.36.255 il +192.133.36.0 - 192.133.36.255 nl 192.133.37.0 - 192.133.40.255 us 192.133.41.0 - 192.133.41.255 au -192.133.42.0 - 192.133.52.255 us +192.133.42.0 - 192.133.44.255 us +192.133.45.0 - 192.133.45.255 ca +192.133.46.0 - 192.133.52.255 us 192.133.53.0 - 192.133.53.255 nl 192.133.54.0 - 192.133.55.255 pt 192.133.56.0 - 192.133.57.255 us -192.133.58.0 - 192.133.58.255 gb +192.133.58.0 - 192.133.58.255 nl 192.133.59.0 - 192.133.63.255 us -192.133.64.0 - 192.133.64.255 no +192.133.64.0 - 192.133.64.255 nl 192.133.65.0 - 192.133.65.255 us -192.133.66.0 - 192.133.66.255 nz +192.133.66.0 - 192.133.66.255 au 192.133.67.0 - 192.133.67.255 sg -192.133.68.0 - 192.133.75.255 us -192.133.80.0 - 192.133.100.255 us -192.133.102.0 - 192.133.102.255 us -192.133.103.0 - 192.133.103.255 be -192.133.104.0 - 192.133.105.255 us +192.133.68.0 - 192.133.79.63 us +192.133.79.64 - 192.133.79.127 ca +192.133.79.128 - 192.133.107.255 us 192.133.108.0 - 192.133.108.255 pt 192.133.109.0 - 192.133.109.255 at 192.133.110.0 - 192.133.111.255 fi -192.133.116.0 - 192.133.120.255 us -192.133.121.0 - 192.133.121.255 se +192.133.112.0 - 192.133.120.255 us +192.133.121.0 - 192.133.121.255 nl 192.133.122.0 - 192.133.130.255 us 192.133.131.0 - 192.133.131.255 gb -192.133.132.0 - 192.133.135.255 us -192.133.144.0 - 192.133.243.255 us +192.133.132.0 - 192.133.243.255 us 192.133.244.0 - 192.133.244.255 gb -192.133.245.0 - 192.133.246.255 us -192.133.250.0 - 192.133.250.255 za -192.133.251.0 - 192.133.255.255 us +192.133.245.0 - 192.133.249.255 us +192.133.250.0 - 192.133.250.255 mu +192.133.251.0 - 192.133.254.255 us +192.133.255.0 - 192.133.255.255 ca 192.134.0.0 - 192.134.255.255 fr 192.135.0.0 - 192.135.6.255 us 192.135.7.0 - 192.135.7.255 de 192.135.8.0 - 192.135.37.255 it -192.135.38.0 - 192.135.38.255 us -192.135.40.0 - 192.135.45.255 us -192.135.46.0 - 192.135.46.255 no +192.135.38.0 - 192.135.45.255 us +192.135.46.0 - 192.135.46.255 nl 192.135.47.0 - 192.135.47.255 us 192.135.48.0 - 192.135.48.255 ca -192.135.49.0 - 192.135.49.255 us +192.135.49.0 - 192.135.50.255 us 192.135.51.0 - 192.135.51.255 de 192.135.52.0 - 192.135.53.255 gb -192.135.63.0 - 192.135.63.255 at +192.135.54.0 - 192.135.62.255 us +192.135.63.0 - 192.135.63.255 nl 192.135.64.0 - 192.135.65.255 us -192.135.66.0 - 192.135.66.255 gb +192.135.66.0 - 192.135.66.255 nl 192.135.67.0 - 192.135.67.255 us 192.135.68.0 - 192.135.68.255 gb 192.135.69.0 - 192.135.76.255 us @@ -87297,47 +77469,53 @@ 192.135.83.0 - 192.135.83.255 ca 192.135.84.0 - 192.135.88.255 us 192.135.89.0 - 192.135.89.255 jp -192.135.92.0 - 192.135.111.255 jp -192.135.112.0 - 192.135.128.255 us -192.135.129.0 - 192.135.129.255 pt +192.135.92.0 - 192.135.92.255 jp +192.135.93.0 - 192.135.93.255 us +192.135.94.0 - 192.135.94.255 jp +192.135.96.0 - 192.135.108.255 jp +192.135.109.0 - 192.135.109.255 us +192.135.110.0 - 192.135.111.255 pr +192.135.112.0 - 192.135.122.255 us +192.135.123.0 - 192.135.123.255 ca +192.135.124.0 - 192.135.128.255 us +192.135.129.0 - 192.135.129.255 nl 192.135.130.0 - 192.135.132.255 us -192.135.133.0 - 192.135.133.255 at +192.135.133.0 - 192.135.133.255 nl 192.135.134.0 - 192.135.142.255 us -192.135.143.0 - 192.135.143.255 no +192.135.143.0 - 192.135.143.255 nl 192.135.144.0 - 192.135.144.255 us 192.135.145.0 - 192.135.164.255 ch 192.135.165.0 - 192.135.165.255 it 192.135.166.0 - 192.135.166.255 gr 192.135.167.0 - 192.135.168.255 be 192.135.169.0 - 192.135.174.255 us -192.135.175.0 - 192.135.175.255 fr +192.135.175.0 - 192.135.175.255 nl 192.135.176.0 - 192.135.184.255 us -192.135.185.0 - 192.135.185.255 be +192.135.185.0 - 192.135.185.255 nl 192.135.186.0 - 192.135.186.255 us 192.135.187.0 - 192.135.187.255 pt -192.135.188.0 - 192.135.199.255 us -192.135.205.0 - 192.135.205.255 us +192.135.188.0 - 192.135.206.255 us 192.135.207.0 - 192.135.208.255 au 192.135.209.0 - 192.135.209.255 us 192.135.210.0 - 192.135.210.255 au -192.135.211.0 - 192.135.217.255 us -192.135.219.0 - 192.135.219.255 pt +192.135.211.0 - 192.135.218.255 us +192.135.219.0 - 192.135.219.255 nl 192.135.220.0 - 192.135.221.255 us 192.135.222.0 - 192.135.222.255 jp -192.135.224.0 - 192.135.224.255 us -192.135.225.0 - 192.135.225.255 ie -192.135.226.0 - 192.135.230.255 us +192.135.223.0 - 192.135.224.255 us +192.135.225.0 - 192.135.225.255 nl +192.135.226.0 - 192.135.229.255 us +192.135.230.0 - 192.135.230.255 ca 192.135.231.0 - 192.135.234.255 gb 192.135.235.0 - 192.135.252.255 us -192.135.253.0 - 192.135.253.255 no +192.135.253.0 - 192.135.253.255 nl 192.135.254.0 - 192.135.254.255 pl -192.136.0.0 - 192.136.6.255 us +192.135.255.0 - 192.136.6.255 us 192.136.7.0 - 192.136.7.255 mt 192.136.8.0 - 192.136.8.255 us 192.136.9.0 - 192.136.9.255 fi 192.136.10.0 - 192.136.17.255 us -192.136.18.0 - 192.136.18.255 gb -192.136.19.0 - 192.136.19.255 be +192.136.18.0 - 192.136.19.255 nl 192.136.20.0 - 192.136.22.255 us 192.136.23.0 - 192.136.23.255 nl 192.136.24.0 - 192.136.26.255 us @@ -87346,33 +77524,30 @@ 192.136.29.0 - 192.136.29.255 gb 192.136.30.0 - 192.136.30.255 fr 192.136.31.0 - 192.136.31.255 pt -192.136.32.0 - 192.136.35.255 us -192.136.37.0 - 192.136.38.255 us +192.136.32.0 - 192.136.38.255 us 192.136.39.0 - 192.136.39.255 au -192.136.40.0 - 192.136.40.255 gb -192.136.41.0 - 192.136.41.255 ch +192.136.40.0 - 192.136.41.255 nl 192.136.42.0 - 192.136.47.255 ni 192.136.48.0 - 192.136.48.255 us -192.136.49.0 - 192.136.49.255 pt +192.136.49.0 - 192.136.49.255 nl 192.136.50.0 - 192.136.50.255 us 192.136.51.0 - 192.136.51.255 nl 192.136.52.0 - 192.136.52.255 pt +192.136.53.0 - 192.136.53.255 ca 192.136.54.0 - 192.136.54.255 fr 192.136.55.0 - 192.136.57.255 bf 192.136.58.0 - 192.136.58.255 fr 192.136.59.0 - 192.136.59.255 pf 192.136.60.0 - 192.136.60.255 us -192.136.61.0 - 192.136.61.255 ru +192.136.61.0 - 192.136.61.255 nl 192.136.62.0 - 192.136.70.255 us -192.136.71.0 - 192.136.103.255 fi -192.136.104.0 - 192.136.112.255 us +192.136.71.0 - 192.136.102.255 fi +192.136.103.0 - 192.136.113.255 us 192.136.114.0 - 192.136.115.255 ca -192.136.119.0 - 192.136.140.255 us -192.136.141.0 - 192.136.143.255 in -192.136.144.0 - 192.136.153.255 us +192.136.116.0 - 192.136.153.255 us 192.136.154.0 - 192.136.155.255 gb 192.136.156.0 - 192.136.156.255 ch -192.137.0.0 - 192.137.23.255 us +192.136.157.0 - 192.137.23.255 us 192.137.24.0 - 192.137.24.255 ca 192.137.25.0 - 192.137.30.255 us 192.137.31.0 - 192.137.31.255 cn @@ -87414,8 +77589,7 @@ 192.137.161.0 - 192.137.164.255 se 192.137.165.0 - 192.137.167.255 us 192.137.168.0 - 192.137.168.255 ch -192.137.169.0 - 192.137.170.255 us -192.137.171.0 - 192.137.171.255 se +192.137.169.0 - 192.137.171.255 us 192.137.172.0 - 192.137.172.255 au 192.137.173.0 - 192.137.183.255 us 192.137.184.0 - 192.137.184.255 ch @@ -87434,63 +77608,85 @@ 192.137.236.0 - 192.137.242.255 ch 192.137.243.0 - 192.137.246.255 us 192.137.247.0 - 192.137.249.255 ca -192.137.250.0 - 192.137.255.255 us -192.138.0.0 - 192.138.15.255 gb -192.138.24.0 - 192.138.85.255 us -192.138.86.0 - 192.138.86.255 pt +192.137.250.0 - 192.138.0.255 us +192.138.1.0 - 192.138.8.255 gb +192.138.9.0 - 192.138.85.255 us +192.138.86.0 - 192.138.86.255 nl 192.138.87.0 - 192.138.99.255 us 192.138.100.0 - 192.138.100.255 au 192.138.101.0 - 192.138.104.255 us 192.138.105.0 - 192.138.108.255 no -192.138.109.0 - 192.138.117.255 se -192.138.118.0 - 192.138.125.255 sg -192.138.126.0 - 192.138.127.255 us -192.138.128.0 - 192.138.130.255 ca -192.138.131.0 - 192.138.154.255 us +192.138.109.0 - 192.138.119.255 se +192.138.126.0 - 192.138.154.255 us 192.138.155.0 - 192.138.155.255 no 192.138.156.0 - 192.138.158.255 gb 192.138.159.0 - 192.138.182.255 us -192.138.183.0 - 192.138.183.255 it +192.138.183.0 - 192.138.183.255 nl 192.138.184.0 - 192.138.184.255 us 192.138.185.0 - 192.138.186.255 ca 192.138.187.0 - 192.138.187.255 us -192.138.188.0 - 192.138.188.255 sg +192.138.188.0 - 192.138.188.255 au 192.138.189.0 - 192.138.191.255 us -192.138.192.0 - 192.138.192.255 gb +192.138.192.0 - 192.138.192.255 nl 192.138.193.0 - 192.138.203.255 us 192.138.204.0 - 192.138.204.255 pt -192.138.205.0 - 192.138.205.255 us -192.138.207.0 - 192.138.227.255 us +192.138.205.0 - 192.138.227.255 us 192.138.228.0 - 192.138.228.255 at 192.138.229.0 - 192.138.229.255 gb 192.138.230.0 - 192.138.232.255 ch 192.138.233.0 - 192.138.247.255 us 192.138.248.0 - 192.138.248.255 gb 192.138.249.0 - 192.138.250.255 us -192.138.251.0 - 192.138.251.255 nz -192.138.252.0 - 192.138.255.255 us -192.139.0.0 - 192.139.77.255 ca +192.138.251.0 - 192.138.251.255 au +192.138.252.0 - 192.139.0.255 us +192.139.1.0 - 192.139.2.255 ca +192.139.3.0 - 192.139.3.255 us +192.139.4.0 - 192.139.4.255 ca +192.139.5.0 - 192.139.5.255 us +192.139.6.0 - 192.139.17.255 ca +192.139.18.0 - 192.139.18.255 us +192.139.19.0 - 192.139.19.255 ca +192.139.20.0 - 192.139.20.255 us +192.139.21.0 - 192.139.61.255 ca +192.139.62.0 - 192.139.62.255 us +192.139.63.0 - 192.139.77.255 ca 192.139.78.0 - 192.139.78.255 fr -192.139.79.0 - 192.139.131.255 ca -192.139.132.0 - 192.139.137.255 us +192.139.79.0 - 192.139.117.255 ca +192.139.118.0 - 192.139.118.255 us +192.139.119.0 - 192.139.127.255 ca +192.139.128.0 - 192.139.128.255 us +192.139.129.0 - 192.139.130.255 ca +192.139.131.0 - 192.139.137.255 us 192.139.138.0 - 192.139.138.255 ca -192.139.140.0 - 192.139.255.255 ca +192.139.139.0 - 192.139.139.255 us +192.139.140.0 - 192.139.146.255 ca +192.139.147.0 - 192.139.147.255 us +192.139.148.0 - 192.139.188.255 ca +192.139.189.0 - 192.139.189.255 us +192.139.190.0 - 192.139.191.255 ca +192.139.192.0 - 192.139.192.255 mf +192.139.193.0 - 192.139.204.255 ca +192.139.205.0 - 192.139.205.255 us +192.139.206.0 - 192.139.254.255 ca +192.139.255.0 - 192.140.0.255 us 192.144.72.0 - 192.144.79.255 fr -192.146.0.0 - 192.146.116.255 us -192.146.117.0 - 192.146.117.255 dk -192.146.119.0 - 192.146.119.255 fr +192.145.224.0 - 192.146.116.255 us +192.146.117.0 - 192.146.117.255 nl +192.146.118.0 - 192.146.118.255 us +192.146.119.0 - 192.146.119.255 nl 192.146.120.0 - 192.146.122.255 us 192.146.123.0 - 192.146.123.255 gb 192.146.124.0 - 192.146.126.255 es -192.146.127.0 - 192.146.129.255 us -192.146.132.0 - 192.146.132.255 at +192.146.127.0 - 192.146.131.255 us +192.146.132.0 - 192.146.132.255 nl 192.146.133.0 - 192.146.133.255 nz 192.146.134.0 - 192.146.135.255 hu -192.146.136.0 - 192.146.136.255 gb +192.146.136.0 - 192.146.137.255 gb +192.146.140.0 - 192.146.141.255 ru 192.146.142.0 - 192.146.149.255 us -192.146.150.0 - 192.146.150.255 nz +192.146.150.0 - 192.146.150.255 au 192.146.151.0 - 192.146.151.255 us -192.146.152.0 - 192.146.152.255 fi +192.146.152.0 - 192.146.152.255 nl 192.146.153.0 - 192.146.155.255 us 192.146.156.0 - 192.146.156.255 ca 192.146.157.0 - 192.146.157.255 br @@ -87501,13 +77697,14 @@ 192.146.173.0 - 192.146.181.255 it 192.146.182.0 - 192.146.182.255 fr 192.146.183.0 - 192.146.183.255 us -192.146.184.0 - 192.146.184.255 jp -192.146.185.0 - 192.146.185.255 de -192.146.187.0 - 192.146.187.255 es +192.146.184.0 - 192.146.184.255 au +192.146.185.0 - 192.146.185.255 nl +192.146.186.0 - 192.146.186.255 us +192.146.187.0 - 192.146.187.255 nl 192.146.188.0 - 192.146.188.255 us 192.146.189.0 - 192.146.189.255 au -192.146.191.0 - 192.146.192.255 us -192.146.193.0 - 192.146.193.255 no +192.146.190.0 - 192.146.192.255 us +192.146.193.0 - 192.146.193.255 nl 192.146.194.0 - 192.146.199.255 us 192.146.200.0 - 192.146.200.255 au 192.146.201.0 - 192.146.203.255 us @@ -87515,27 +77712,26 @@ 192.146.205.0 - 192.146.217.255 us 192.146.218.0 - 192.146.219.255 nz 192.146.220.0 - 192.146.226.255 us -192.146.227.0 - 192.146.227.255 no -192.146.228.0 - 192.146.228.255 gb +192.146.227.0 - 192.146.228.255 nl 192.146.229.0 - 192.146.229.255 br +192.146.230.0 - 192.146.231.255 ca 192.146.232.0 - 192.146.232.255 au 192.146.233.0 - 192.146.234.255 fr 192.146.235.0 - 192.146.236.255 us 192.146.237.0 - 192.146.237.255 uy 192.146.238.0 - 192.146.239.255 no 192.146.240.0 - 192.146.241.255 us -192.146.242.0 - 192.146.242.255 it +192.146.242.0 - 192.146.242.255 nl 192.146.243.0 - 192.146.250.255 us 192.146.251.0 - 192.146.253.255 au -192.146.254.0 - 192.146.254.255 us -192.147.0.0 - 192.147.22.255 us +192.146.254.0 - 192.147.22.255 us 192.147.23.0 - 192.147.23.255 gb 192.147.24.0 - 192.147.33.255 us -192.147.34.0 - 192.147.34.255 is +192.147.34.0 - 192.147.34.255 nl 192.147.35.0 - 192.147.35.255 us -192.147.36.0 - 192.147.36.255 gb -192.147.38.0 - 192.147.41.255 us -192.147.42.0 - 192.147.42.255 pl +192.147.36.0 - 192.147.36.255 nl +192.147.37.0 - 192.147.41.255 us +192.147.42.0 - 192.147.42.255 nl 192.147.43.0 - 192.147.75.255 us 192.147.76.0 - 192.147.78.255 pt 192.147.79.0 - 192.147.79.255 fr @@ -87545,14 +77741,13 @@ 192.147.141.0 - 192.147.141.255 pl 192.147.142.0 - 192.147.147.255 us 192.147.149.0 - 192.147.149.255 us -192.147.150.0 - 192.147.150.255 gb -192.147.151.0 - 192.147.153.255 nz +192.147.150.0 - 192.147.150.255 nl 192.147.154.0 - 192.147.154.255 us -192.147.155.0 - 192.147.155.255 pt +192.147.155.0 - 192.147.155.255 nl 192.147.156.0 - 192.147.209.255 us 192.147.210.0 - 192.147.210.255 br 192.147.211.0 - 192.147.211.255 us -192.147.212.0 - 192.147.212.255 gb +192.147.212.0 - 192.147.212.255 nl 192.147.213.0 - 192.147.213.255 ca 192.147.214.0 - 192.147.214.255 us 192.147.215.0 - 192.147.216.255 fi @@ -87560,28 +77755,28 @@ 192.147.218.0 - 192.147.218.255 br 192.147.219.0 - 192.147.219.255 gb 192.147.220.0 - 192.147.227.255 us -192.147.228.0 - 192.147.228.255 gb +192.147.228.0 - 192.147.228.255 nl 192.147.229.0 - 192.147.230.255 us +192.147.231.0 - 192.147.231.255 lc 192.147.232.0 - 192.147.234.255 us 192.147.235.0 - 192.147.235.255 au 192.147.236.0 - 192.147.245.255 us 192.147.246.0 - 192.147.246.255 au -192.147.247.0 - 192.147.247.255 it +192.147.247.0 - 192.147.247.255 nl 192.147.248.0 - 192.147.250.255 us 192.147.251.0 - 192.147.251.255 eu 192.147.252.0 - 192.147.252.255 us 192.147.253.0 - 192.147.253.255 au -192.147.254.0 - 192.147.254.255 us -192.148.0.0 - 192.148.32.255 us +192.147.254.0 - 192.148.32.255 us 192.148.33.0 - 192.148.92.255 se 192.148.93.0 - 192.148.102.255 us -192.148.103.0 - 192.148.103.255 pt -192.148.104.0 - 192.148.111.255 us -192.148.112.0 - 192.148.165.255 au +192.148.103.0 - 192.148.103.255 nl +192.148.104.0 - 192.148.110.255 us +192.148.111.0 - 192.148.115.255 ca +192.148.116.0 - 192.148.165.255 au 192.148.166.0 - 192.148.166.255 ru 192.148.167.0 - 192.148.167.255 es -192.148.168.0 - 192.148.172.255 us -192.148.174.0 - 192.148.174.255 us +192.148.168.0 - 192.148.174.255 us 192.148.175.0 - 192.148.175.255 mx 192.148.176.0 - 192.148.176.255 us 192.148.177.0 - 192.148.186.255 gb @@ -87595,55 +77790,55 @@ 192.148.201.0 - 192.148.215.255 es 192.148.216.0 - 192.148.216.255 gb 192.148.217.0 - 192.148.217.255 ca -192.148.218.0 - 192.148.218.255 us -192.148.220.0 - 192.148.220.255 it -192.148.221.0 - 192.148.221.255 nz +192.148.218.0 - 192.148.219.255 us +192.148.220.0 - 192.148.220.255 nl +192.148.221.0 - 192.148.221.255 au 192.148.222.0 - 192.148.222.255 us 192.148.223.0 - 192.148.230.255 au -192.148.231.0 - 192.148.255.255 us -192.149.1.0 - 192.149.2.255 us +192.148.231.0 - 192.149.2.255 us 192.149.3.0 - 192.149.3.255 pl 192.149.4.0 - 192.149.4.255 us 192.149.5.0 - 192.149.5.255 fi 192.149.6.0 - 192.149.14.255 us -192.149.15.0 - 192.149.15.255 gb -192.149.16.0 - 192.149.16.255 us -192.149.18.0 - 192.149.18.255 us -192.149.19.0 - 192.149.19.255 es +192.149.15.0 - 192.149.15.255 nl +192.149.16.0 - 192.149.18.255 us +192.149.19.0 - 192.149.19.255 nl 192.149.20.0 - 192.149.20.255 au 192.149.21.0 - 192.149.22.255 us +192.149.23.0 - 192.149.23.255 ca 192.149.24.0 - 192.149.26.255 us -192.149.27.0 - 192.149.27.255 at +192.149.27.0 - 192.149.27.255 nl 192.149.28.0 - 192.149.28.255 us -192.149.29.0 - 192.149.29.255 se -192.149.30.0 - 192.149.33.255 nl +192.149.29.0 - 192.149.33.255 se 192.149.34.0 - 192.149.34.255 us 192.149.35.0 - 192.149.35.255 nl 192.149.36.0 - 192.149.36.255 au -192.149.37.0 - 192.149.38.255 us -192.149.40.0 - 192.149.40.255 us +192.149.37.0 - 192.149.40.255 us 192.149.41.0 - 192.149.41.255 fr 192.149.42.0 - 192.149.52.255 us 192.149.53.0 - 192.149.53.255 ca 192.149.54.0 - 192.149.54.255 au 192.149.55.0 - 192.149.56.255 us 192.149.57.0 - 192.149.57.255 gb +192.149.58.0 - 192.149.58.255 us 192.149.59.0 - 192.149.59.255 fr 192.149.60.0 - 192.149.60.255 gb -192.149.61.0 - 192.149.67.255 us -192.149.74.0 - 192.149.75.255 us +192.149.61.0 - 192.149.76.255 us 192.149.77.0 - 192.149.77.255 fr 192.149.78.0 - 192.149.79.255 no 192.149.80.0 - 192.149.80.255 ca -192.149.81.0 - 192.149.95.255 us -192.149.97.0 - 192.149.97.255 us +192.149.82.0 - 192.149.89.255 us +192.149.90.0 - 192.149.91.255 ca +192.149.92.0 - 192.149.97.255 us 192.149.98.0 - 192.149.98.255 ca 192.149.99.0 - 192.149.99.255 us 192.149.100.0 - 192.149.100.255 no 192.149.101.0 - 192.149.101.255 us 192.149.102.0 - 192.149.102.255 no -192.149.103.0 - 192.149.109.255 us -192.149.110.0 - 192.149.110.255 it +192.149.103.0 - 192.149.103.255 us +192.149.104.0 - 192.149.104.255 ca +192.149.105.0 - 192.149.109.255 us +192.149.110.0 - 192.149.110.255 nl 192.149.111.0 - 192.149.111.255 gb 192.149.112.0 - 192.149.116.255 us 192.149.117.0 - 192.149.117.255 gb @@ -87652,35 +77847,45 @@ 192.149.122.0 - 192.149.122.255 us 192.149.123.0 - 192.149.123.255 ca 192.149.124.0 - 192.149.125.255 us -192.149.126.0 - 192.149.126.255 de +192.149.126.0 - 192.149.126.255 nl 192.149.127.0 - 192.149.148.255 us 192.149.149.0 - 192.149.149.255 au 192.149.150.0 - 192.149.201.255 us 192.149.202.0 - 192.149.202.255 gu 192.149.203.0 - 192.149.208.255 us 192.149.209.0 - 192.149.209.255 jp -192.149.211.0 - 192.149.226.255 us +192.149.210.0 - 192.149.226.255 us 192.149.227.0 - 192.149.227.255 nl 192.149.228.0 - 192.149.231.255 us 192.149.232.0 - 192.149.232.255 at -192.149.233.0 - 192.149.233.255 us -192.149.235.0 - 192.149.237.255 us +192.149.233.0 - 192.149.237.255 us 192.149.238.0 - 192.149.238.255 gb -192.149.239.0 - 192.149.239.255 hk -192.149.240.0 - 192.150.56.255 us -192.150.58.0 - 192.150.82.255 se -192.150.83.0 - 192.150.83.255 eu +192.149.239.0 - 192.149.239.255 au +192.149.240.0 - 192.150.4.255 us +192.150.5.0 - 192.150.5.255 ca +192.150.6.0 - 192.150.7.255 us +192.150.8.0 - 192.150.8.255 eu +192.150.9.0 - 192.150.19.255 us +192.150.20.0 - 192.150.20.255 eu +192.150.21.0 - 192.150.57.255 us +192.150.58.0 - 192.150.72.255 se +192.150.73.0 - 192.150.74.255 us +192.150.75.0 - 192.150.75.255 se +192.150.76.0 - 192.150.76.255 nl +192.150.77.0 - 192.150.77.255 us +192.150.78.0 - 192.150.82.255 se +192.150.83.0 - 192.150.83.255 pl 192.150.84.0 - 192.150.84.255 se -192.150.87.0 - 192.150.88.255 us -192.150.89.0 - 192.150.89.255 gb +192.150.85.0 - 192.150.88.255 us +192.150.89.0 - 192.150.89.255 nl 192.150.90.0 - 192.150.91.255 ca -192.150.92.0 - 192.150.92.255 gb +192.150.92.0 - 192.150.92.255 nl 192.150.93.0 - 192.150.93.255 us 192.150.94.0 - 192.150.94.255 nl 192.150.95.0 - 192.150.95.255 us 192.150.96.0 - 192.150.96.255 au 192.150.97.0 - 192.150.103.255 us -192.150.104.0 - 192.150.104.255 pl +192.150.104.0 - 192.150.104.255 nl 192.150.105.0 - 192.150.105.255 us 192.150.106.0 - 192.150.106.255 gb 192.150.107.0 - 192.150.107.255 au @@ -87690,15 +77895,14 @@ 192.150.126.0 - 192.150.126.255 gt 192.150.127.0 - 192.150.128.255 us 192.150.129.0 - 192.150.139.255 au -192.150.140.0 - 192.150.140.255 gb -192.150.141.0 - 192.150.141.255 us -192.150.143.0 - 192.150.143.255 us -192.150.144.0 - 192.150.144.255 nz +192.150.140.0 - 192.150.140.255 nl +192.150.141.0 - 192.150.143.255 us +192.150.144.0 - 192.150.144.255 au 192.150.145.0 - 192.150.145.255 us -192.150.146.0 - 192.150.146.255 it -192.150.147.0 - 192.150.151.255 us -192.150.160.0 - 192.150.176.255 us +192.150.146.0 - 192.150.146.255 nl +192.150.147.0 - 192.150.176.255 us 192.150.177.0 - 192.150.184.255 gb +192.150.185.0 - 192.150.185.255 ca 192.150.186.0 - 192.150.187.255 us 192.150.188.0 - 192.150.188.255 no 192.150.189.0 - 192.150.190.255 de @@ -87714,21 +77918,18 @@ 192.150.203.0 - 192.150.203.255 at 192.150.204.0 - 192.150.204.255 gb 192.150.205.0 - 192.150.205.255 ru -192.150.206.0 - 192.150.206.255 us +192.150.206.0 - 192.150.207.255 us 192.150.208.0 - 192.150.208.255 gb 192.150.209.0 - 192.150.209.255 no -192.150.210.0 - 192.150.210.255 us -192.150.212.0 - 192.150.212.255 us -192.150.216.0 - 192.150.217.255 us -192.150.218.0 - 192.150.220.255 nz +192.150.210.0 - 192.150.217.255 us +192.150.218.0 - 192.150.219.255 nz 192.150.221.0 - 192.150.222.255 us 192.150.223.0 - 192.150.223.255 no 192.150.224.0 - 192.150.226.255 us 192.150.227.0 - 192.150.233.255 gb 192.150.234.0 - 192.150.237.255 au 192.150.238.0 - 192.150.238.255 hu -192.150.239.0 - 192.150.243.255 us -192.150.245.0 - 192.150.245.255 us +192.150.239.0 - 192.150.245.255 us 192.150.246.0 - 192.150.246.255 au 192.150.247.0 - 192.150.247.255 us 192.150.248.0 - 192.150.248.255 gb @@ -87736,17 +77937,23 @@ 192.150.252.0 - 192.150.252.255 no 192.150.253.0 - 192.150.253.255 us 192.150.254.0 - 192.150.254.255 no -192.151.0.0 - 192.151.108.255 us +192.150.255.0 - 192.151.108.255 us 192.151.109.0 - 192.151.109.255 ca 192.151.110.0 - 192.151.128.255 us -192.151.129.0 - 192.151.129.255 in +192.151.129.0 - 192.151.129.255 au +192.151.130.0 - 192.151.133.255 us +192.151.134.0 - 192.151.135.255 ca +192.151.136.0 - 192.151.207.255 us +192.151.208.0 - 192.151.239.255 cn +192.151.240.0 - 192.151.254.255 us +192.151.255.0 - 192.151.255.255 cn 192.152.0.0 - 192.152.5.255 us 192.152.6.0 - 192.152.6.255 no 192.152.7.0 - 192.152.13.255 us 192.152.14.0 - 192.152.14.255 gb 192.152.15.0 - 192.152.16.255 us 192.152.17.0 - 192.152.17.255 gb -192.152.18.0 - 192.152.21.255 us +192.152.18.0 - 192.152.25.255 us 192.152.26.0 - 192.152.27.255 de 192.152.28.0 - 192.152.41.255 us 192.152.42.0 - 192.152.42.255 fr @@ -87763,20 +77970,24 @@ 192.152.63.0 - 192.152.63.255 at 192.152.64.0 - 192.152.67.255 us 192.152.68.0 - 192.152.68.255 fi -192.152.69.0 - 192.152.69.255 jp -192.152.70.0 - 192.152.81.255 us +192.152.69.0 - 192.152.69.255 au +192.152.70.0 - 192.152.78.255 us +192.152.79.0 - 192.152.79.255 ca +192.152.80.0 - 192.152.81.255 us 192.152.82.0 - 192.152.82.255 de 192.152.83.0 - 192.152.85.255 us 192.152.86.0 - 192.152.87.255 au -192.152.88.0 - 192.152.96.255 us +192.152.88.0 - 192.152.90.255 us +192.152.91.0 - 192.152.91.255 ca +192.152.92.0 - 192.152.96.255 us 192.152.97.0 - 192.152.97.255 ca 192.152.98.0 - 192.152.98.255 ch 192.152.99.0 - 192.152.106.255 us 192.152.107.0 - 192.152.107.255 ca -192.152.108.0 - 192.152.109.255 us +192.152.108.0 - 192.152.110.255 us 192.152.111.0 - 192.152.111.255 no 192.152.112.0 - 192.152.112.255 gb -192.152.113.0 - 192.152.117.255 us +192.152.113.0 - 192.152.118.255 us 192.152.119.0 - 192.152.119.255 au 192.152.120.0 - 192.152.121.255 us 192.152.122.0 - 192.152.122.255 gb @@ -87790,8 +78001,10 @@ 192.152.146.0 - 192.152.146.255 au 192.152.147.0 - 192.152.150.255 us 192.152.151.0 - 192.152.151.255 de -192.152.154.0 - 192.152.155.255 us +192.152.152.0 - 192.152.155.255 us 192.152.156.0 - 192.152.156.255 gb +192.152.157.0 - 192.152.157.255 us +192.152.158.0 - 192.152.158.255 ca 192.152.159.0 - 192.152.163.255 us 192.152.164.0 - 192.152.164.255 pr 192.152.165.0 - 192.152.165.255 ca @@ -87801,15 +78014,17 @@ 192.152.174.0 - 192.152.174.255 pt 192.152.175.0 - 192.152.183.255 us 192.152.184.0 - 192.152.187.255 gb -192.152.188.0 - 192.152.191.255 us -192.152.194.0 - 192.152.194.255 us +192.152.188.0 - 192.152.194.255 us 192.152.195.0 - 192.152.195.255 ca 192.152.196.0 - 192.152.196.255 us 192.152.197.0 - 192.152.197.255 au 192.152.198.0 - 192.152.211.255 us -192.152.212.0 - 192.152.212.255 jp -192.152.215.0 - 192.152.240.255 us -192.152.241.0 - 192.152.241.255 gb +192.152.212.0 - 192.152.212.255 au +192.152.213.0 - 192.152.213.255 ca +192.152.214.0 - 192.152.223.255 us +192.152.224.0 - 192.152.224.255 ca +192.152.225.0 - 192.152.240.255 us +192.152.241.0 - 192.152.241.255 nl 192.152.242.0 - 192.152.243.255 us 192.152.244.0 - 192.152.244.255 gb 192.152.245.0 - 192.152.247.255 us @@ -87817,18 +78032,17 @@ 192.152.249.0 - 192.152.252.255 us 192.152.253.0 - 192.152.253.255 gb 192.152.254.0 - 192.152.254.255 at -192.153.1.0 - 192.153.1.255 us -192.153.2.0 - 192.153.3.255 gb +192.152.255.0 - 192.153.1.255 us +192.153.2.0 - 192.153.3.255 nl 192.153.4.0 - 192.153.8.255 us 192.153.9.0 - 192.153.9.255 au 192.153.10.0 - 192.153.11.255 us -192.153.12.0 - 192.153.12.255 gb 192.153.13.0 - 192.153.13.255 pt 192.153.14.0 - 192.153.17.255 us 192.153.18.0 - 192.153.19.255 hu 192.153.20.0 - 192.153.87.255 us 192.153.88.0 - 192.153.88.255 br -192.153.89.0 - 192.153.89.255 ch +192.153.89.0 - 192.153.89.255 nl 192.153.90.0 - 192.153.92.255 us 192.153.93.0 - 192.153.93.255 au 192.153.94.0 - 192.153.94.255 us @@ -87839,27 +78053,27 @@ 192.153.119.0 - 192.153.119.255 cl 192.153.120.0 - 192.153.120.255 br 192.153.121.0 - 192.153.126.255 us -192.153.127.0 - 192.153.127.255 pl +192.153.127.0 - 192.153.127.255 nl 192.153.128.0 - 192.153.152.255 us -192.153.153.0 - 192.153.153.255 gb +192.153.153.0 - 192.153.153.255 nl 192.153.154.0 - 192.153.154.255 us -192.153.155.0 - 192.153.155.255 br +192.153.155.0 - 192.153.155.255 mx 192.153.156.0 - 192.153.157.255 us 192.153.158.0 - 192.153.158.255 au 192.153.159.0 - 192.153.165.255 us -192.153.166.0 - 192.153.166.255 gb +192.153.166.0 - 192.153.166.255 nl 192.153.167.0 - 192.153.167.255 cr -192.153.168.0 - 192.153.168.255 be +192.153.168.0 - 192.153.168.255 nl 192.153.169.0 - 192.153.170.255 us -192.153.171.0 - 192.153.171.255 ru +192.153.171.0 - 192.153.171.255 nl 192.153.172.0 - 192.153.172.255 us 192.153.173.0 - 192.153.182.255 at -192.153.183.0 - 192.153.183.255 us +192.153.183.0 - 192.153.185.255 us +192.153.186.0 - 192.153.186.255 ca 192.153.187.0 - 192.153.187.255 us -192.153.188.0 - 192.153.188.255 se -192.153.189.0 - 192.153.189.255 gb +192.153.188.0 - 192.153.189.255 nl 192.153.190.0 - 192.153.193.255 us -192.153.194.0 - 192.153.194.255 no +192.153.194.0 - 192.153.194.255 nl 192.153.195.0 - 192.153.195.255 us 192.153.196.0 - 192.153.197.255 au 192.153.198.0 - 192.153.212.255 us @@ -87868,55 +78082,94 @@ 192.153.217.0 - 192.153.217.255 ca 192.153.218.0 - 192.153.219.255 us 192.153.220.0 - 192.153.220.255 ca -192.153.221.0 - 192.153.228.255 ph -192.153.229.0 - 192.153.250.255 us +192.153.224.0 - 192.153.250.255 us 192.153.251.0 - 192.153.251.255 nz -192.153.252.0 - 192.154.15.255 us -192.154.16.0 - 192.154.31.255 sg -192.154.32.0 - 192.154.131.255 us -192.155.0.0 - 192.155.7.255 no -192.155.8.0 - 192.155.71.255 us -192.155.128.0 - 192.155.159.255 us -192.156.0.0 - 192.156.131.255 us +192.153.252.0 - 192.154.12.255 us +192.154.13.0 - 192.154.13.255 ca +192.154.14.0 - 192.154.15.255 us +192.154.16.0 - 192.154.16.255 jp +192.154.17.0 - 192.154.23.255 sg +192.154.24.0 - 192.154.25.255 jp +192.154.26.0 - 192.154.27.255 us +192.154.28.0 - 192.154.31.255 ca +192.154.32.0 - 192.154.135.255 us +192.154.136.0 - 192.154.159.255 ca +192.154.160.0 - 192.154.199.255 us +192.154.200.0 - 192.154.200.255 tw +192.154.201.0 - 192.154.255.255 us +192.155.0.0 - 192.155.0.255 ca +192.155.1.0 - 192.155.6.255 no +192.155.7.0 - 192.155.68.255 us +192.155.69.0 - 192.155.69.255 ca +192.155.70.0 - 192.155.157.255 us +192.155.158.0 - 192.155.159.255 pr +192.155.160.0 - 192.156.111.255 us +192.156.112.0 - 192.156.112.255 ca +192.156.113.0 - 192.156.131.255 us 192.156.132.0 - 192.156.132.255 be 192.156.133.0 - 192.156.139.255 us -192.156.140.0 - 192.156.159.255 jp +192.156.140.0 - 192.156.151.255 jp +192.156.154.0 - 192.156.154.255 jp +192.156.157.0 - 192.156.157.255 us +192.156.158.0 - 192.156.158.255 jp +192.156.159.0 - 192.156.159.255 au 192.156.160.0 - 192.156.161.255 us 192.156.162.0 - 192.156.162.255 gb -192.156.163.0 - 192.156.163.255 us +192.156.163.0 - 192.156.164.255 us 192.156.165.0 - 192.156.165.255 nz 192.156.166.0 - 192.156.166.255 us 192.156.167.0 - 192.156.167.255 gb 192.156.168.0 - 192.156.173.255 us 192.156.174.0 - 192.156.174.255 ch -192.156.175.0 - 192.156.195.255 us -192.156.197.0 - 192.156.198.255 us +192.156.175.0 - 192.156.198.255 us 192.156.199.0 - 192.156.199.255 bm 192.156.200.0 - 192.156.206.255 us 192.156.207.0 - 192.156.208.255 au 192.156.209.0 - 192.156.209.255 us -192.156.210.0 - 192.156.210.255 pt +192.156.210.0 - 192.156.210.255 nl 192.156.211.0 - 192.156.212.255 us 192.156.213.0 - 192.156.213.255 it -192.156.214.0 - 192.156.224.255 us -192.156.225.0 - 192.156.225.255 nz +192.156.214.0 - 192.156.215.255 us +192.156.217.0 - 192.156.217.255 nl +192.156.218.0 - 192.156.219.255 us +192.156.220.0 - 192.156.220.255 au +192.156.221.0 - 192.156.224.255 us +192.156.225.0 - 192.156.225.255 au 192.156.226.0 - 192.156.226.255 us 192.156.227.0 - 192.156.227.255 be -192.156.228.0 - 192.156.231.255 us -192.156.234.0 - 192.156.234.255 us -192.156.239.0 - 192.156.239.255 gb -192.156.240.0 - 192.156.243.255 us +192.156.228.0 - 192.156.238.255 us +192.156.239.0 - 192.156.239.255 nl +192.156.240.0 - 192.156.247.255 us 192.156.248.0 - 192.156.248.255 lu 192.156.249.0 - 192.156.249.255 au -192.156.250.0 - 192.156.250.255 us -192.156.252.0 - 192.156.255.255 us -192.157.0.0 - 192.157.3.255 no -192.157.4.0 - 192.157.5.255 us +192.156.250.0 - 192.157.0.255 us +192.157.1.0 - 192.157.3.255 no +192.157.4.0 - 192.157.7.255 us 192.157.8.0 - 192.157.17.255 se -192.157.31.0 - 192.157.39.255 us -192.157.64.0 - 192.157.79.255 us +192.157.18.0 - 192.157.48.23 us +192.157.48.24 - 192.157.48.31 ca +192.157.48.32 - 192.157.48.207 us +192.157.48.208 - 192.157.48.215 ca +192.157.48.216 - 192.157.50.255 us +192.157.51.0 - 192.157.52.31 ca +192.157.52.32 - 192.157.52.255 us +192.157.53.0 - 192.157.53.255 in +192.157.54.0 - 192.157.54.23 us +192.157.54.24 - 192.157.54.39 ca +192.157.54.40 - 192.157.55.255 us +192.157.56.0 - 192.157.56.15 ca +192.157.56.16 - 192.157.56.23 us +192.157.56.24 - 192.157.56.31 ca +192.157.56.32 - 192.157.56.71 us +192.157.56.72 - 192.157.56.79 ca +192.157.56.80 - 192.157.57.255 us +192.157.58.0 - 192.157.58.15 ca +192.157.58.16 - 192.157.58.255 us +192.157.59.0 - 192.157.59.255 ca +192.157.60.0 - 192.157.95.255 us +192.157.96.0 - 192.157.127.255 ca 192.157.128.0 - 192.157.128.255 us -192.157.129.0 - 192.157.129.255 no +192.157.129.0 - 192.157.129.255 nl 192.157.130.0 - 192.157.137.255 us 192.157.138.0 - 192.157.138.255 jp 192.157.139.0 - 192.157.140.255 de @@ -87927,61 +78180,78 @@ 192.157.150.0 - 192.157.152.255 jp 192.157.153.0 - 192.157.153.255 ch 192.157.154.0 - 192.157.158.255 de -192.157.159.0 - 192.157.161.255 ca -192.157.162.0 - 192.157.162.255 hk -192.157.163.0 - 192.157.164.255 us -192.157.165.0 - 192.157.165.255 at -192.157.166.0 - 192.157.168.255 us +192.157.159.0 - 192.157.159.255 ca +192.157.160.0 - 192.157.161.255 us +192.157.162.0 - 192.157.162.255 au +192.157.163.0 - 192.157.163.255 us +192.157.164.0 - 192.157.164.255 ca +192.157.165.0 - 192.157.168.255 at 192.157.169.0 - 192.157.170.255 gb 192.157.171.0 - 192.157.171.255 de 192.157.172.0 - 192.157.172.255 gb 192.157.173.0 - 192.157.173.255 ca -192.157.174.0 - 192.157.174.255 gb +192.157.174.0 - 192.157.174.255 nl 192.157.175.0 - 192.157.175.255 us -192.157.176.0 - 192.157.176.255 gb +192.157.176.0 - 192.157.176.255 nl 192.157.177.0 - 192.157.184.255 us -192.157.185.0 - 192.157.185.255 it +192.157.185.0 - 192.157.185.255 nl 192.157.186.0 - 192.157.186.255 us -192.157.187.0 - 192.157.187.255 gb +192.157.187.0 - 192.157.187.255 nl 192.157.188.0 - 192.157.188.255 us -192.157.189.0 - 192.157.189.255 ch -192.157.190.0 - 192.157.190.255 za -192.157.191.0 - 192.157.191.255 hk -192.158.0.0 - 192.159.15.255 us -192.159.16.0 - 192.159.31.255 sg -192.159.32.0 - 192.159.39.255 us -192.159.70.0 - 192.159.70.255 fi +192.157.189.0 - 192.157.189.255 nl +192.157.190.0 - 192.157.190.255 mu +192.157.191.0 - 192.157.191.255 au +192.157.192.0 - 192.158.11.255 us +192.158.12.0 - 192.158.15.255 ca +192.158.16.0 - 192.158.33.255 us +192.158.34.0 - 192.158.34.255 gb +192.158.35.0 - 192.158.44.255 us +192.158.45.0 - 192.158.45.255 au +192.158.46.0 - 192.158.53.255 us +192.158.54.0 - 192.158.54.255 gb +192.158.55.0 - 192.158.61.255 us +192.158.62.0 - 192.158.63.255 pr +192.158.64.0 - 192.158.213.255 us +192.158.214.0 - 192.158.215.255 ca +192.158.216.0 - 192.158.240.255 us +192.158.241.0 - 192.158.241.255 sg +192.158.242.0 - 192.159.15.255 us +192.159.16.0 - 192.159.30.255 sg +192.159.31.0 - 192.159.69.255 us +192.159.70.0 - 192.159.70.255 nl 192.159.71.0 - 192.159.71.255 ca 192.159.72.0 - 192.159.72.255 us -192.159.73.0 - 192.159.73.255 gb +192.159.73.0 - 192.159.73.255 nl 192.159.74.0 - 192.159.76.255 us -192.159.77.0 - 192.159.77.255 it +192.159.77.0 - 192.159.77.255 nl 192.159.78.0 - 192.159.83.255 us -192.159.84.0 - 192.159.85.255 es +192.159.84.0 - 192.159.85.255 nl 192.159.86.0 - 192.159.89.255 us 192.159.90.0 - 192.159.90.255 be -192.159.92.0 - 192.159.92.255 us +192.159.91.0 - 192.159.93.255 us 192.159.94.0 - 192.159.94.255 ca -192.159.95.0 - 192.159.95.255 de +192.159.95.0 - 192.159.95.255 nl 192.159.96.0 - 192.159.98.255 us 192.159.99.0 - 192.159.103.255 gb 192.159.104.0 - 192.159.104.255 us 192.159.105.0 - 192.159.105.255 nl 192.159.106.0 - 192.159.107.255 us -192.159.108.0 - 192.159.108.255 no -192.159.109.0 - 192.159.109.255 ie +192.159.108.0 - 192.159.109.255 nl 192.159.110.0 - 192.159.110.255 us 192.159.111.0 - 192.159.111.255 ca 192.159.112.0 - 192.159.115.255 us 192.159.116.0 - 192.159.117.255 br -192.159.118.0 - 192.159.118.255 ie -192.159.121.0 - 192.159.121.255 fr -192.159.122.0 - 192.159.122.255 fi -192.159.128.0 - 192.159.143.255 us +192.159.118.0 - 192.159.118.255 nl +192.159.119.0 - 192.159.120.255 us +192.159.121.0 - 192.159.122.255 nl +192.159.123.0 - 192.159.191.255 us +192.159.192.0 - 192.159.255.255 ca 192.160.0.0 - 192.160.6.255 us 192.160.7.0 - 192.160.7.255 ca -192.160.8.0 - 192.160.14.255 us -192.160.15.0 - 192.160.15.255 si +192.160.8.0 - 192.160.9.255 us +192.160.10.0 - 192.160.10.255 gb +192.160.11.0 - 192.160.14.255 us +192.160.15.0 - 192.160.15.255 nl 192.160.16.0 - 192.160.16.255 au 192.160.17.0 - 192.160.18.255 us 192.160.19.0 - 192.160.19.255 au @@ -87989,49 +78259,49 @@ 192.160.21.0 - 192.160.21.255 tr 192.160.22.0 - 192.160.22.255 lu 192.160.23.0 - 192.160.23.255 no -192.160.25.0 - 192.160.26.255 us +192.160.24.0 - 192.160.26.255 us 192.160.27.0 - 192.160.27.255 it 192.160.28.0 - 192.160.28.255 us -192.160.29.0 - 192.160.29.255 pg +192.160.29.0 - 192.160.29.255 au 192.160.30.0 - 192.160.32.255 us -192.160.33.0 - 192.160.33.255 es +192.160.33.0 - 192.160.33.255 nl 192.160.35.0 - 192.160.36.255 us -192.160.37.0 - 192.160.37.255 it +192.160.37.0 - 192.160.37.255 nl 192.160.38.0 - 192.160.44.255 us 192.160.45.0 - 192.160.45.255 br -192.160.46.0 - 192.160.47.255 us -192.160.49.0 - 192.160.49.255 us +192.160.46.0 - 192.160.49.255 us 192.160.50.0 - 192.160.50.255 br 192.160.51.0 - 192.160.64.255 us -192.160.65.0 - 192.160.65.255 de -192.160.67.0 - 192.160.67.255 at +192.160.65.0 - 192.160.65.255 nl +192.160.66.0 - 192.160.66.255 us +192.160.67.0 - 192.160.67.255 nl 192.160.68.0 - 192.160.70.255 us 192.160.71.0 - 192.160.71.255 au 192.160.72.0 - 192.160.94.255 us 192.160.95.0 - 192.160.96.255 ch -192.160.97.0 - 192.160.105.255 us +192.160.97.0 - 192.160.101.255 us +192.160.102.0 - 192.160.102.255 ca +192.160.103.0 - 192.160.105.255 us 192.160.106.0 - 192.160.106.255 nl 192.160.107.0 - 192.160.108.255 us -192.160.109.0 - 192.160.109.255 gb -192.160.110.0 - 192.160.110.255 pl +192.160.109.0 - 192.160.110.255 nl 192.160.111.0 - 192.160.111.255 br 192.160.112.0 - 192.160.122.255 us -192.160.123.0 - 192.160.123.255 fr +192.160.123.0 - 192.160.123.255 nl 192.160.124.0 - 192.160.125.255 us -192.160.126.0 - 192.160.126.255 no +192.160.126.0 - 192.160.126.255 nl 192.160.127.0 - 192.160.127.255 us 192.160.128.0 - 192.160.128.255 br 192.160.129.0 - 192.160.141.255 us -192.160.142.0 - 192.160.142.255 de -192.160.143.0 - 192.160.143.255 gb +192.160.142.0 - 192.160.143.255 nl 192.160.144.0 - 192.160.151.255 us 192.160.152.0 - 192.160.152.255 nl 192.160.153.0 - 192.160.154.255 us 192.160.155.0 - 192.160.155.255 au 192.160.156.0 - 192.160.156.255 it 192.160.157.0 - 192.160.159.255 us -192.160.160.0 - 192.160.160.255 it -192.160.161.0 - 192.160.161.255 jp +192.160.160.0 - 192.160.160.255 nl +192.160.161.0 - 192.160.161.255 au 192.160.162.0 - 192.160.166.255 us 192.160.167.0 - 192.160.167.255 ca 192.160.168.0 - 192.160.168.255 us @@ -88043,25 +78313,32 @@ 192.160.180.0 - 192.160.187.255 us 192.160.188.0 - 192.160.188.255 br 192.160.189.0 - 192.160.193.255 us -192.160.194.0 - 192.160.195.255 gb +192.160.194.0 - 192.160.194.255 gb +192.160.195.0 - 192.160.195.255 nl 192.160.196.0 - 192.160.204.255 us 192.160.205.0 - 192.160.205.255 au 192.160.206.0 - 192.160.223.255 us -192.160.224.0 - 192.160.224.255 eu -192.160.225.0 - 192.160.225.255 no -192.160.226.0 - 192.160.226.255 nz +192.160.224.0 - 192.160.225.255 nl +192.160.226.0 - 192.160.226.255 au 192.160.227.0 - 192.160.228.255 us 192.160.229.0 - 192.160.229.255 au 192.160.230.0 - 192.160.230.255 us 192.160.231.0 - 192.160.232.255 at 192.160.233.0 - 192.160.233.255 ru 192.160.234.0 - 192.160.244.255 us -192.160.245.0 - 192.160.251.255 pt -192.160.252.0 - 192.160.252.255 il +192.160.245.0 - 192.160.249.255 pt +192.160.250.0 - 192.160.250.255 ky +192.160.251.0 - 192.160.251.255 pt +192.160.252.0 - 192.160.252.255 nl 192.160.253.0 - 192.160.254.255 us +192.160.255.0 - 192.160.255.255 ca 192.161.0.0 - 192.161.63.255 us -192.161.64.0 - 192.161.65.255 be +192.161.64.0 - 192.161.65.255 nl +192.161.66.0 - 192.161.91.255 us +192.161.92.0 - 192.161.95.255 cn +192.161.96.0 - 192.161.127.255 ca 192.161.128.0 - 192.161.129.255 nz +192.161.130.0 - 192.161.255.255 us 192.162.0.0 - 192.162.3.255 ru 192.162.4.0 - 192.162.7.255 no 192.162.8.0 - 192.162.11.255 ru @@ -88072,7 +78349,7 @@ 192.162.19.0 - 192.162.19.255 ua 192.162.20.0 - 192.162.23.255 ru 192.162.24.0 - 192.162.27.255 es -192.162.28.0 - 192.162.31.255 ro +192.162.28.0 - 192.162.31.255 ch 192.162.32.0 - 192.162.35.255 ua 192.162.36.0 - 192.162.43.255 ru 192.162.44.0 - 192.162.51.255 pl @@ -88104,9 +78381,8 @@ 192.162.172.0 - 192.162.179.255 pl 192.162.180.0 - 192.162.183.255 ru 192.162.184.0 - 192.162.187.255 ro -192.162.188.0 - 192.162.199.255 ru +192.162.188.0 - 192.162.195.255 ru 192.162.200.0 - 192.162.203.255 ua -192.162.204.0 - 192.162.207.255 ru 192.162.208.0 - 192.162.211.255 ua 192.162.212.0 - 192.162.215.255 ru 192.162.216.0 - 192.162.219.255 ie @@ -88118,8 +78394,13 @@ 192.162.240.0 - 192.162.247.255 ru 192.162.248.0 - 192.162.248.255 pl 192.162.249.0 - 192.162.255.255 ru -192.163.0.0 - 192.163.31.255 us +192.163.0.0 - 192.163.13.255 us +192.163.14.0 - 192.163.15.255 ap +192.163.16.0 - 192.163.19.255 us +192.163.20.0 - 192.163.20.255 ap +192.163.21.0 - 192.163.31.255 us 192.163.32.0 - 192.163.159.255 fi +192.163.160.0 - 192.163.255.255 us 192.164.0.0 - 192.164.255.255 at 192.165.0.0 - 192.165.0.255 se 192.165.1.0 - 192.165.1.255 dk @@ -88128,49 +78409,62 @@ 192.165.33.0 - 192.165.37.255 gb 192.165.38.0 - 192.165.39.255 se 192.165.40.0 - 192.165.40.255 gb -192.165.41.0 - 192.165.50.255 se +192.165.41.0 - 192.165.47.255 se +192.165.48.0 - 192.165.48.255 at +192.165.49.0 - 192.165.50.255 se 192.165.51.0 - 192.165.54.255 gb -192.165.55.0 - 192.165.83.255 se +192.165.55.0 - 192.165.55.255 us +192.165.56.0 - 192.165.66.255 se +192.165.67.0 - 192.165.67.255 it +192.165.68.0 - 192.165.83.255 se 192.165.84.0 - 192.165.84.255 ie -192.165.85.0 - 192.165.104.255 se +192.165.85.0 - 192.165.85.255 it +192.165.86.0 - 192.165.104.255 se 192.165.105.0 - 192.165.106.255 gb 192.165.107.0 - 192.165.107.255 se 192.165.108.0 - 192.165.108.255 no -192.165.109.0 - 192.165.159.255 se +192.165.109.0 - 192.165.112.255 se +192.165.113.0 - 192.165.113.255 pl +192.165.114.0 - 192.165.120.255 se +192.165.121.0 - 192.165.121.255 ch +192.165.122.0 - 192.165.122.255 se +192.165.123.0 - 192.165.123.255 es +192.165.124.0 - 192.165.159.255 se 192.165.160.0 - 192.165.163.255 gb 192.165.164.0 - 192.165.170.255 se 192.165.171.0 - 192.165.172.255 gb 192.165.173.0 - 192.165.173.255 se 192.165.174.0 - 192.165.174.255 de -192.165.175.0 - 192.165.184.255 se -192.165.185.0 - 192.165.187.255 gb +192.165.175.0 - 192.165.185.255 se +192.165.186.0 - 192.165.187.255 gb 192.165.188.0 - 192.165.195.255 se 192.165.196.0 - 192.165.196.255 es 192.165.197.0 - 192.165.200.255 se 192.165.201.0 - 192.165.201.255 it -192.165.202.0 - 192.165.209.255 se -192.165.210.0 - 192.165.211.255 gb -192.165.212.0 - 192.165.212.255 us -192.165.213.0 - 192.165.215.255 gb -192.165.216.0 - 192.165.217.255 ch -192.165.218.0 - 192.165.219.255 us +192.165.202.0 - 192.165.213.235 se +192.165.213.236 - 192.165.213.236 eu +192.165.213.237 - 192.165.213.255 se +192.165.214.0 - 192.165.214.255 ap +192.165.215.0 - 192.165.219.255 se 192.165.220.0 - 192.165.223.255 gb -192.165.224.0 - 192.165.227.255 se -192.165.228.0 - 192.165.228.255 it -192.165.229.0 - 192.165.230.255 se +192.165.224.0 - 192.165.230.255 se 192.165.231.0 - 192.165.231.255 fr 192.165.232.0 - 192.165.238.255 se 192.165.239.0 - 192.165.239.255 ie 192.165.240.0 - 192.165.242.255 gb -192.165.243.0 - 192.165.255.255 se -192.166.0.0 - 192.166.11.255 de +192.165.243.0 - 192.165.246.255 se +192.165.247.0 - 192.165.247.0 dk +192.165.247.1 - 192.165.247.1 eu +192.165.247.2 - 192.165.247.255 dk +192.165.248.0 - 192.165.255.255 se +192.166.0.0 - 192.166.7.255 de 192.166.12.0 - 192.166.15.255 ru -192.166.16.0 - 192.166.95.255 de -192.166.96.0 - 192.166.99.255 ro +192.166.16.0 - 192.166.31.255 de +192.166.48.0 - 192.166.95.255 de +192.166.96.0 - 192.166.99.255 nl 192.166.100.0 - 192.166.103.255 ua 192.166.104.0 - 192.166.111.255 de 192.166.112.0 - 192.166.113.255 ua -192.166.114.0 - 192.166.115.255 de 192.166.116.0 - 192.166.119.255 ru 192.166.120.0 - 192.166.121.255 pl 192.166.122.0 - 192.166.122.255 ro @@ -88179,56 +78473,86 @@ 192.166.136.0 - 192.166.139.255 gb 192.166.140.0 - 192.166.143.255 fr 192.166.144.0 - 192.166.145.255 ua -192.166.146.0 - 192.166.201.255 de +192.166.146.0 - 192.166.147.255 de +192.166.148.0 - 192.166.151.255 es +192.166.152.0 - 192.166.201.255 de 192.166.202.0 - 192.166.203.255 pl -192.166.204.0 - 192.166.215.255 de +192.166.208.0 - 192.166.215.255 de 192.166.216.0 - 192.166.219.255 pl -192.166.220.0 - 192.166.231.255 de 192.166.232.0 - 192.166.239.255 ru -192.166.240.0 - 192.166.254.255 de +192.166.253.0 - 192.166.254.255 de 192.166.255.0 - 192.166.255.255 pl 192.167.0.0 - 192.167.255.255 it 192.169.0.0 - 192.169.31.255 us -192.169.32.0 - 192.169.47.255 sg -192.169.64.0 - 192.169.65.255 us -192.170.0.0 - 192.170.57.255 us -192.170.58.0 - 192.170.60.255 au -192.170.61.0 - 192.170.128.255 us -192.171.0.0 - 192.171.5.255 eu -192.171.7.0 - 192.171.17.255 us -192.171.64.0 - 192.171.127.255 us -192.171.128.0 - 192.171.255.255 gb -192.172.0.0 - 192.172.223.255 us -192.172.225.0 - 192.172.226.255 us -192.172.227.0 - 192.172.243.255 jp -192.172.245.0 - 192.172.246.255 jp +192.169.32.0 - 192.169.41.255 sg +192.169.42.0 - 192.170.157.255 us +192.170.158.0 - 192.170.159.255 sg +192.170.160.0 - 192.171.0.255 us +192.171.1.0 - 192.171.4.255 eu +192.171.5.0 - 192.171.5.255 it +192.171.6.0 - 192.171.31.255 us +192.171.32.0 - 192.171.63.255 ca +192.171.64.0 - 192.171.113.255 us +192.171.114.0 - 192.171.115.255 ca +192.171.116.0 - 192.171.119.255 us +192.171.120.0 - 192.171.127.255 bb +192.171.128.0 - 192.171.199.255 gb +192.171.200.0 - 192.172.226.255 us +192.172.227.0 - 192.172.231.255 jp +192.172.232.0 - 192.172.232.255 au +192.172.233.0 - 192.172.233.255 us +192.172.234.0 - 192.172.239.255 jp +192.172.240.0 - 192.172.240.255 us +192.172.241.0 - 192.172.243.255 jp 192.172.247.0 - 192.172.249.255 us 192.172.250.0 - 192.172.250.255 ca 192.172.251.0 - 192.172.252.255 us -192.172.253.0 - 192.172.253.255 lu +192.172.253.0 - 192.172.253.255 nl 192.172.254.0 - 192.172.254.255 ca -192.173.0.0 - 192.173.7.255 gb -192.173.8.0 - 192.173.15.255 us -192.173.16.0 - 192.173.31.255 nz -192.173.32.0 - 192.173.63.255 us +192.172.255.0 - 192.173.0.255 us +192.173.1.0 - 192.173.4.255 gb +192.173.5.0 - 192.173.15.255 us +192.173.16.0 - 192.173.24.255 nz +192.173.25.0 - 192.173.27.255 us +192.173.28.0 - 192.173.31.255 ca +192.173.32.0 - 192.173.127.255 us 192.173.128.0 - 192.173.135.255 gb -192.174.0.0 - 192.174.63.255 us -192.174.64.0 - 192.174.71.255 at +192.173.136.0 - 192.174.3.255 us +192.174.4.0 - 192.174.7.255 ca +192.174.8.0 - 192.174.63.255 us +192.174.64.0 - 192.174.68.255 at +192.174.69.0 - 192.174.127.255 us 192.174.128.0 - 192.174.255.255 jp -192.175.0.0 - 192.175.31.255 us -192.175.32.0 - 192.175.47.255 fi -192.175.48.0 - 192.175.48.255 us -192.175.64.0 - 192.175.95.255 us +192.175.0.0 - 192.175.5.255 us +192.175.6.0 - 192.175.7.255 ca +192.175.8.0 - 192.175.31.255 us +192.175.32.0 - 192.175.36.255 fi +192.175.37.0 - 192.175.37.255 fr +192.175.38.0 - 192.175.39.255 ch +192.175.40.0 - 192.175.43.255 gb +192.175.44.0 - 192.175.47.255 fi +192.175.48.0 - 192.175.87.255 us +192.175.88.0 - 192.175.116.183 ca +192.175.116.184 - 192.175.116.191 us +192.175.116.192 - 192.175.127.255 ca 192.175.128.0 - 192.175.255.255 us -192.176.0.0 - 192.176.58.255 se +192.176.0.0 - 192.176.23.255 se +192.176.24.0 - 192.176.24.255 no +192.176.25.0 - 192.176.25.255 se +192.176.26.0 - 192.176.26.255 no +192.176.27.0 - 192.176.28.255 de +192.176.29.0 - 192.176.58.255 se 192.176.59.0 - 192.176.59.255 ie -192.176.60.0 - 192.176.136.255 se +192.176.60.0 - 192.176.126.255 se +192.176.127.0 - 192.176.127.255 dk +192.176.128.0 - 192.176.136.255 se 192.176.137.0 - 192.176.137.255 de 192.176.138.0 - 192.176.166.255 se 192.176.167.0 - 192.176.167.255 dk 192.176.168.0 - 192.176.168.255 se 192.176.169.0 - 192.176.169.255 ie -192.176.170.0 - 192.176.174.255 se +192.176.170.0 - 192.176.173.255 se +192.176.174.0 - 192.176.174.255 dk 192.176.175.0 - 192.176.175.255 it 192.176.176.0 - 192.176.203.255 se 192.176.204.0 - 192.176.205.255 gb @@ -88237,12 +78561,31 @@ 192.176.208.0 - 192.176.235.255 se 192.176.236.0 - 192.176.236.255 ie 192.176.237.0 - 192.176.255.255 se -192.184.4.0 - 192.184.4.255 us -192.187.0.0 - 192.187.15.255 us -192.187.16.0 - 192.187.31.255 es -192.187.32.0 - 192.187.95.255 us -192.187.128.0 - 192.188.7.255 us -192.188.10.0 - 192.188.10.255 pt +192.177.0.0 - 192.184.15.255 us +192.184.16.0 - 192.184.31.255 ca +192.184.32.0 - 192.186.63.255 us +192.186.64.0 - 192.186.127.255 ca +192.186.128.0 - 192.186.141.255 us +192.186.142.0 - 192.186.142.255 gb +192.186.143.0 - 192.186.149.255 us +192.186.150.0 - 192.186.150.63 it +192.186.150.64 - 192.186.160.63 us +192.186.160.64 - 192.186.160.127 lv +192.186.160.128 - 192.186.160.255 us +192.186.161.0 - 192.186.161.63 ua +192.186.161.64 - 192.186.161.255 us +192.186.162.0 - 192.186.163.255 ca +192.186.164.0 - 192.186.169.255 us +192.186.170.0 - 192.186.170.255 hu +192.186.171.0 - 192.186.171.63 bg +192.186.171.64 - 192.187.15.255 us +192.187.16.0 - 192.187.25.255 es +192.187.26.0 - 192.187.27.255 us +192.187.28.0 - 192.187.31.255 ca +192.187.32.0 - 192.188.1.255 us +192.188.2.0 - 192.188.2.255 ca +192.188.3.0 - 192.188.9.255 us +192.188.10.0 - 192.188.10.255 nl 192.188.11.0 - 192.188.11.255 br 192.188.12.0 - 192.188.42.255 us 192.188.43.0 - 192.188.43.255 nz @@ -88251,17 +78594,23 @@ 192.188.63.0 - 192.188.64.255 gb 192.188.65.0 - 192.188.65.255 fr 192.188.66.0 - 192.188.68.255 us -192.188.69.0 - 192.188.69.255 gb +192.188.69.0 - 192.188.69.255 nl 192.188.70.0 - 192.188.70.255 us 192.188.71.0 - 192.188.71.255 nz 192.188.72.0 - 192.188.72.255 us -192.188.73.0 - 192.188.92.255 jp -192.188.93.0 - 192.188.94.255 us +192.188.73.0 - 192.188.79.255 jp +192.188.84.0 - 192.188.84.255 us +192.188.85.0 - 192.188.87.255 jp +192.188.88.0 - 192.188.88.255 ca +192.188.89.0 - 192.188.90.255 au +192.188.91.0 - 192.188.91.255 us +192.188.92.0 - 192.188.92.255 jp +192.188.93.0 - 192.188.95.255 us 192.188.96.0 - 192.188.96.255 gb 192.188.97.0 - 192.188.100.255 us 192.188.101.0 - 192.188.101.255 au 192.188.102.0 - 192.188.104.255 us -192.188.105.0 - 192.188.105.255 no +192.188.105.0 - 192.188.105.255 nl 192.188.106.0 - 192.188.106.255 us 192.188.107.0 - 192.188.107.255 au 192.188.108.0 - 192.188.114.255 us @@ -88269,20 +78618,19 @@ 192.188.116.0 - 192.188.116.255 ru 192.188.117.0 - 192.188.117.255 gb 192.188.118.0 - 192.188.120.255 us -192.188.121.0 - 192.188.121.255 at -192.188.122.0 - 192.188.122.255 gb -192.188.124.0 - 192.188.124.255 us -192.188.125.0 - 192.188.125.255 gb +192.188.121.0 - 192.188.122.255 nl +192.188.123.0 - 192.188.124.255 us +192.188.125.0 - 192.188.125.255 nl 192.188.126.0 - 192.188.126.255 us -192.188.127.0 - 192.188.127.255 ie +192.188.127.0 - 192.188.127.255 nl 192.188.128.0 - 192.188.128.255 au -192.188.129.0 - 192.188.129.255 gb +192.188.129.0 - 192.188.129.255 nl 192.188.130.0 - 192.188.131.255 us -192.188.132.0 - 192.188.132.255 gb +192.188.132.0 - 192.188.132.255 nl 192.188.133.0 - 192.188.135.255 us -192.188.136.0 - 192.188.136.255 de +192.188.136.0 - 192.188.136.255 nl 192.188.137.0 - 192.188.144.255 us -192.188.145.0 - 192.188.145.255 gb +192.188.145.0 - 192.188.145.255 nl 192.188.146.0 - 192.188.150.255 us 192.188.151.0 - 192.188.151.255 au 192.188.152.0 - 192.188.156.255 us @@ -88309,29 +78657,28 @@ 192.188.238.0 - 192.188.240.255 us 192.188.241.0 - 192.188.241.255 nz 192.188.242.0 - 192.188.247.255 hu -192.188.248.0 - 192.188.248.255 be -192.188.249.0 - 192.188.250.255 us -192.188.252.0 - 192.188.255.255 us -192.189.1.0 - 192.189.1.255 gb -192.189.3.0 - 192.189.7.255 us +192.188.248.0 - 192.189.0.255 us +192.189.1.0 - 192.189.1.255 nl +192.189.2.0 - 192.189.7.255 us 192.189.8.0 - 192.189.11.255 gb -192.189.13.0 - 192.189.13.255 us -192.189.14.0 - 192.189.14.255 de -192.189.15.0 - 192.189.20.255 us +192.189.12.0 - 192.189.13.255 us +192.189.14.0 - 192.189.14.255 nl +192.189.15.0 - 192.189.21.255 us 192.189.22.0 - 192.189.22.255 ca -192.189.23.0 - 192.189.23.255 gb +192.189.23.0 - 192.189.23.255 nl 192.189.24.0 - 192.189.24.255 jp -192.189.30.0 - 192.189.33.255 us -192.189.34.0 - 192.189.34.255 nz +192.189.25.0 - 192.189.33.255 us +192.189.34.0 - 192.189.34.255 au 192.189.35.0 - 192.189.35.255 us -192.189.41.0 - 192.189.41.255 gb +192.189.36.0 - 192.189.39.255 ca +192.189.40.0 - 192.189.40.255 us +192.189.41.0 - 192.189.41.255 nl 192.189.42.0 - 192.189.50.255 us -192.189.51.0 - 192.189.51.255 at -192.189.52.0 - 192.189.52.255 gb +192.189.51.0 - 192.189.52.255 nl 192.189.53.0 - 192.189.53.255 us 192.189.54.0 - 192.189.54.255 au -192.189.55.0 - 192.189.55.255 gb -192.189.56.0 - 192.189.65.255 us +192.189.55.0 - 192.189.55.255 nl +192.189.56.0 - 192.189.64.255 us 192.189.66.0 - 192.189.66.255 fr 192.189.67.0 - 192.189.68.255 ca 192.189.69.0 - 192.189.69.255 gb @@ -88339,59 +78686,62 @@ 192.189.71.0 - 192.189.72.255 us 192.189.73.0 - 192.189.73.255 nl 192.189.74.0 - 192.189.74.255 us -192.189.75.0 - 192.189.75.255 za -192.189.76.0 - 192.189.76.255 de -192.189.77.0 - 192.189.77.255 us -192.189.79.0 - 192.189.93.255 us +192.189.75.0 - 192.189.75.255 mu +192.189.76.0 - 192.189.76.255 nl +192.189.77.0 - 192.189.93.255 us 192.189.94.0 - 192.189.94.255 au 192.189.95.0 - 192.189.118.255 us 192.189.119.0 - 192.189.119.255 gb 192.189.120.0 - 192.189.135.255 us 192.189.136.0 - 192.189.136.255 au 192.189.137.0 - 192.189.138.255 us -192.189.139.0 - 192.189.140.255 ga +192.189.139.0 - 192.189.140.255 mu 192.189.141.0 - 192.189.147.255 us 192.189.148.0 - 192.189.148.255 au 192.189.149.0 - 192.189.150.255 us -192.189.151.0 - 192.189.151.255 de -192.189.154.0 - 192.189.154.255 it +192.189.151.0 - 192.189.151.255 nl +192.189.152.0 - 192.189.153.255 us +192.189.154.0 - 192.189.154.255 nl 192.189.155.0 - 192.189.156.255 us -192.189.157.0 - 192.189.157.255 gb +192.189.157.0 - 192.189.157.255 nl 192.189.158.0 - 192.189.158.255 us 192.189.159.0 - 192.189.159.255 au -192.189.160.0 - 192.189.160.255 gb +192.189.160.0 - 192.189.160.255 nl 192.189.161.0 - 192.189.165.255 us 192.189.166.0 - 192.189.170.255 gb -192.189.171.0 - 192.189.199.255 us -192.189.202.0 - 192.189.203.255 gb -192.189.204.0 - 192.189.207.255 us +192.189.171.0 - 192.189.201.255 us +192.189.202.0 - 192.189.203.255 nl +192.189.204.0 - 192.189.204.255 ca +192.189.205.0 - 192.189.207.255 us 192.189.208.0 - 192.189.211.255 au 192.189.212.0 - 192.189.222.255 us 192.189.223.0 - 192.189.223.255 ph 192.189.224.0 - 192.189.228.255 us -192.189.229.0 - 192.189.233.255 au -192.189.234.0 - 192.189.247.255 us -192.189.249.0 - 192.189.250.255 us -192.189.251.0 - 192.189.251.255 de -192.189.252.0 - 192.190.29.255 us -192.190.30.0 - 192.190.31.255 br -192.190.32.0 - 192.190.41.255 us -192.190.44.0 - 192.190.44.255 gb +192.189.229.0 - 192.189.229.255 au +192.189.232.0 - 192.189.250.255 us +192.189.251.0 - 192.189.251.255 nl +192.189.252.0 - 192.189.255.255 us +192.190.0.0 - 192.190.0.255 ca +192.190.1.0 - 192.190.29.255 us +192.190.30.0 - 192.190.30.255 mx +192.190.31.0 - 192.190.31.255 br +192.190.32.0 - 192.190.43.255 us +192.190.44.0 - 192.190.44.255 nl 192.190.45.0 - 192.190.57.255 us -192.190.58.0 - 192.190.59.255 no +192.190.58.0 - 192.190.59.255 nl 192.190.60.0 - 192.190.60.255 us 192.190.61.0 - 192.190.61.255 au 192.190.62.0 - 192.190.63.255 us -192.190.64.0 - 192.190.64.255 gb +192.190.64.0 - 192.190.64.255 nl 192.190.65.0 - 192.190.65.255 us 192.190.66.0 - 192.190.66.255 au -192.190.67.0 - 192.190.67.255 gb +192.190.67.0 - 192.190.67.255 nl 192.190.68.0 - 192.190.68.255 us 192.190.69.0 - 192.190.69.255 fr 192.190.70.0 - 192.190.74.255 us 192.190.75.0 - 192.190.75.255 ca -192.190.76.0 - 192.190.79.255 us -192.190.95.0 - 192.190.95.255 no +192.190.76.0 - 192.190.94.255 us +192.190.95.0 - 192.190.95.255 nl 192.190.96.0 - 192.190.107.255 us 192.190.108.0 - 192.190.108.255 nz 192.190.109.0 - 192.190.128.255 us @@ -88401,21 +78751,21 @@ 192.190.174.0 - 192.190.174.255 pt 192.190.175.0 - 192.190.179.255 us 192.190.180.0 - 192.190.181.255 au -192.190.182.0 - 192.190.183.255 gb -192.190.184.0 - 192.190.187.255 us +192.190.182.0 - 192.190.183.255 nl +192.190.184.0 - 192.190.189.255 us 192.190.190.0 - 192.190.193.255 no 192.190.194.0 - 192.190.200.255 us 192.190.201.0 - 192.190.202.255 gb 192.190.203.0 - 192.190.203.255 us -192.190.204.0 - 192.190.205.255 sg +192.190.204.0 - 192.190.205.255 au +192.190.206.0 - 192.190.207.255 us 192.190.208.0 - 192.190.215.255 au -192.190.216.0 - 192.190.219.255 us -192.190.224.0 - 192.190.232.255 us +192.190.216.0 - 192.190.232.255 us 192.190.233.0 - 192.190.236.255 fr 192.190.237.0 - 192.190.239.255 us 192.190.240.0 - 192.190.240.255 gb 192.190.241.0 - 192.190.241.255 us -192.190.242.0 - 192.190.242.255 fr +192.190.242.0 - 192.190.242.255 nl 192.190.243.0 - 192.190.246.255 us 192.190.247.0 - 192.190.249.255 gb 192.190.250.0 - 192.191.1.255 us @@ -88460,9 +78810,7 @@ 192.191.196.0 - 192.191.196.255 pr 192.191.197.0 - 192.191.199.255 us 192.191.200.0 - 192.191.200.255 ca -192.191.201.0 - 192.191.216.255 us -192.191.217.0 - 192.191.217.255 ca -192.191.218.0 - 192.191.224.255 us +192.191.201.0 - 192.191.224.255 us 192.191.225.0 - 192.191.225.255 ca 192.191.226.0 - 192.191.226.255 us 192.191.227.0 - 192.191.227.255 ca @@ -88472,51 +78820,53 @@ 192.191.233.0 - 192.191.233.255 ca 192.191.234.0 - 192.191.234.255 us 192.191.235.0 - 192.191.235.255 ca -192.191.236.0 - 192.191.236.255 us -192.191.237.0 - 192.191.237.255 ca -192.191.238.0 - 192.191.255.255 us +192.191.236.0 - 192.191.255.255 us 192.192.0.0 - 192.192.255.255 tw -192.193.0.0 - 192.193.255.255 us -192.194.0.0 - 192.194.160.255 fi -192.194.161.0 - 192.194.161.255 gb -192.194.162.0 - 192.194.201.255 fi -192.194.202.0 - 192.194.202.255 de -192.194.203.0 - 192.194.214.111 fi -192.194.214.112 - 192.194.214.127 ax -192.194.214.128 - 192.194.243.75 fi -192.194.243.76 - 192.194.243.79 ax -192.194.243.80 - 192.194.255.255 fi +192.193.0.0 - 192.193.0.255 us +192.193.1.0 - 192.193.2.255 au +192.193.3.0 - 192.193.115.255 us +192.193.116.0 - 192.193.116.127 gb +192.193.116.128 - 192.193.116.191 eu +192.193.116.192 - 192.193.116.255 gb +192.193.117.0 - 192.193.131.255 us +192.193.132.0 - 192.193.132.255 ap +192.193.133.0 - 192.193.159.255 us +192.193.160.0 - 192.193.160.255 ap +192.193.161.0 - 192.193.163.255 us +192.193.164.0 - 192.193.164.255 ap +192.193.165.0 - 192.193.244.255 us +192.193.245.0 - 192.193.245.255 eu +192.193.246.0 - 192.193.255.255 us +192.194.0.0 - 192.194.255.255 fi +192.195.0.0 - 192.195.0.255 us 192.195.1.0 - 192.195.1.255 gb 192.195.2.0 - 192.195.2.255 au -192.195.6.0 - 192.195.7.255 us -192.195.8.0 - 192.195.8.255 ru +192.195.3.0 - 192.195.3.255 ca +192.195.4.0 - 192.195.7.255 us +192.195.8.0 - 192.195.8.255 nl 192.195.9.0 - 192.195.9.255 us 192.195.10.0 - 192.195.10.255 au 192.195.11.0 - 192.195.11.255 us 192.195.12.0 - 192.195.14.255 nz -192.195.15.0 - 192.195.31.255 us -192.195.33.0 - 192.195.33.255 us +192.195.15.0 - 192.195.33.255 us 192.195.34.0 - 192.195.34.255 au -192.195.35.0 - 192.195.35.255 us -192.195.37.0 - 192.195.38.255 us +192.195.35.0 - 192.195.38.255 us 192.195.39.0 - 192.195.40.255 kr 192.195.41.0 - 192.195.41.255 us 192.195.42.0 - 192.195.42.255 ie 192.195.43.0 - 192.195.43.255 gb 192.195.44.0 - 192.195.55.255 au -192.195.56.0 - 192.195.57.255 mx -192.195.58.0 - 192.195.71.255 us -192.195.72.0 - 192.195.72.255 pl -192.195.73.0 - 192.195.76.255 us -192.195.80.0 - 192.195.97.255 us -192.195.98.0 - 192.195.98.255 de +192.195.56.0 - 192.195.71.255 us +192.195.72.0 - 192.195.72.255 nl +192.195.73.0 - 192.195.97.255 us +192.195.98.0 - 192.195.98.255 nl 192.195.99.0 - 192.195.101.255 us 192.195.102.0 - 192.195.102.255 au 192.195.103.0 - 192.195.104.255 us 192.195.105.0 - 192.195.105.255 gb -192.195.106.0 - 192.195.106.255 pl -192.195.107.0 - 192.195.108.255 us -192.195.110.0 - 192.195.110.255 it +192.195.106.0 - 192.195.106.255 nl +192.195.107.0 - 192.195.109.255 us +192.195.110.0 - 192.195.110.255 nl 192.195.111.0 - 192.195.111.255 us 192.195.112.0 - 192.195.112.255 au 192.195.113.0 - 192.195.115.255 us @@ -88525,62 +78875,108 @@ 192.195.134.0 - 192.195.148.255 se 192.195.149.0 - 192.195.151.255 us 192.195.152.0 - 192.195.152.255 au -192.195.153.0 - 192.195.169.255 us +192.195.153.0 - 192.195.166.255 us +192.195.167.0 - 192.195.167.255 gb +192.195.168.0 - 192.195.169.255 us 192.195.170.0 - 192.195.170.255 au 192.195.171.0 - 192.195.182.255 us -192.195.183.0 - 192.195.183.255 nl -192.195.184.0 - 192.195.184.255 de +192.195.183.0 - 192.195.184.255 nl 192.195.185.0 - 192.195.185.255 us -192.195.186.0 - 192.195.186.255 nz +192.195.186.0 - 192.195.186.255 au 192.195.187.0 - 192.195.194.255 us -192.195.195.0 - 192.195.195.255 pt +192.195.195.0 - 192.195.195.255 nl 192.195.196.0 - 192.195.196.255 us 192.195.197.0 - 192.195.197.255 au -192.195.198.0 - 192.195.218.255 us +192.195.198.0 - 192.195.202.255 us +192.195.203.0 - 192.195.203.255 ca +192.195.204.0 - 192.195.218.255 us 192.195.219.0 - 192.195.219.255 nz 192.195.220.0 - 192.195.232.255 us 192.195.233.0 - 192.195.233.255 au 192.195.234.0 - 192.195.235.255 us -192.195.236.0 - 192.195.236.255 gb +192.195.236.0 - 192.195.236.255 nl 192.195.237.0 - 192.195.237.255 br -192.195.238.0 - 192.195.255.255 us -192.196.0.0 - 192.196.255.255 fr -192.197.0.0 - 192.197.106.255 ca -192.197.107.0 - 192.197.107.255 us -192.197.108.0 - 192.197.143.255 ca +192.195.238.0 - 192.195.250.255 us +192.195.251.0 - 192.195.251.255 ca +192.195.252.0 - 192.195.254.255 us +192.195.255.0 - 192.195.255.255 ca +192.196.0.0 - 192.196.0.255 us +192.196.1.0 - 192.196.155.255 fr +192.196.156.0 - 192.196.226.71 us +192.196.226.72 - 192.196.226.79 gb +192.196.226.80 - 192.196.235.7 us +192.196.235.8 - 192.196.235.15 au +192.196.235.16 - 192.196.236.239 us +192.196.236.240 - 192.196.236.247 gb +192.196.236.248 - 192.196.255.255 us +192.197.0.0 - 192.197.57.255 ca +192.197.58.0 - 192.197.59.255 us +192.197.60.0 - 192.197.88.255 ca +192.197.89.0 - 192.197.89.255 us +192.197.90.0 - 192.197.91.255 ca +192.197.92.0 - 192.197.93.255 us +192.197.94.0 - 192.197.112.255 ca +192.197.113.0 - 192.197.113.255 us +192.197.114.0 - 192.197.121.255 ca +192.197.122.0 - 192.197.123.255 us +192.197.124.0 - 192.197.143.255 ca 192.197.144.0 - 192.197.147.255 us 192.197.148.0 - 192.197.155.255 ca 192.197.156.0 - 192.197.160.255 us 192.197.161.0 - 192.197.198.255 ca 192.197.199.0 - 192.197.200.255 us -192.197.201.0 - 192.197.212.127 ca -192.197.212.128 - 192.197.213.127 a1 -192.197.213.128 - 192.197.219.255 ca +192.197.201.0 - 192.197.206.255 ca +192.197.207.0 - 192.197.207.255 us +192.197.208.0 - 192.197.219.255 ca 192.197.220.0 - 192.197.224.255 us -192.197.225.0 - 192.197.255.255 ca -192.198.4.0 - 192.198.7.255 us -192.198.8.0 - 192.198.15.255 br -192.198.16.0 - 192.198.79.255 us -192.198.128.0 - 192.198.191.255 us -192.199.0.0 - 192.199.15.255 us +192.197.225.0 - 192.197.244.255 ca +192.197.245.0 - 192.197.245.255 us +192.197.246.0 - 192.197.254.255 ca +192.197.255.0 - 192.198.7.255 us +192.198.8.0 - 192.198.13.255 br +192.198.14.0 - 192.198.14.255 ar +192.198.15.0 - 192.198.15.255 br +192.198.16.0 - 192.198.99.39 us +192.198.99.40 - 192.198.99.47 ca +192.198.99.48 - 192.198.100.255 us +192.198.101.0 - 192.198.101.255 ca +192.198.102.0 - 192.198.103.255 us +192.198.104.0 - 192.198.104.127 ca +192.198.104.128 - 192.198.110.255 us +192.198.111.0 - 192.198.111.191 es +192.198.111.192 - 192.198.119.255 us +192.198.120.0 - 192.198.120.255 eg +192.198.121.0 - 192.198.145.255 us +192.198.146.0 - 192.198.147.255 my +192.198.148.0 - 192.198.150.255 us +192.198.151.0 - 192.198.151.255 eu +192.198.152.0 - 192.198.255.255 us +192.199.0.0 - 192.199.0.255 ca +192.199.1.0 - 192.199.11.255 us +192.199.12.0 - 192.199.15.255 ca 192.199.16.0 - 192.199.31.255 pt 192.199.32.0 - 192.199.47.255 au +192.199.48.0 - 192.199.63.255 ca 192.199.64.0 - 192.199.191.255 us -192.200.0.0 - 192.200.63.255 us +192.199.192.0 - 192.199.207.255 ca +192.199.208.0 - 192.200.23.255 us +192.200.24.0 - 192.200.24.255 cn +192.200.25.0 - 192.200.25.255 mt +192.200.26.0 - 192.200.26.255 de +192.200.27.0 - 192.200.27.255 pa +192.200.28.0 - 192.200.28.255 us +192.200.29.0 - 192.200.29.255 in +192.200.30.0 - 192.200.63.255 us 192.200.64.0 - 192.200.79.255 nz -192.200.128.0 - 192.200.135.255 us -192.201.0.0 - 192.201.9.167 us -192.201.9.168 - 192.201.9.175 na -192.201.9.176 - 192.201.12.231 us -192.201.12.232 - 192.201.12.239 na -192.201.12.240 - 192.203.36.255 us -192.203.38.0 - 192.203.39.255 au +192.200.80.0 - 192.202.255.255 us +192.203.0.0 - 192.203.0.255 pr +192.203.1.0 - 192.203.36.255 us +192.203.37.0 - 192.203.37.255 tc 192.203.40.0 - 192.203.79.255 us 192.203.80.0 - 192.203.80.255 ru -192.203.81.0 - 192.203.95.255 nz -192.203.96.0 - 192.203.97.255 us -192.203.99.0 - 192.203.99.255 nz -192.203.104.0 - 192.203.105.255 us +192.203.96.0 - 192.203.98.255 us +192.203.99.0 - 192.203.99.255 au +192.203.100.0 - 192.203.105.255 us 192.203.106.0 - 192.203.107.255 ca 192.203.108.0 - 192.203.109.255 fi 192.203.110.0 - 192.203.137.255 us @@ -88593,71 +78989,75 @@ 192.203.159.0 - 192.203.175.255 us 192.203.176.0 - 192.203.176.255 au 192.203.177.0 - 192.203.177.255 mx -192.203.178.0 - 192.203.182.255 us -192.203.183.0 - 192.203.185.255 hk -192.203.186.0 - 192.203.192.255 us +192.203.178.0 - 192.203.192.255 us 192.203.193.0 - 192.203.193.255 au 192.203.194.0 - 192.203.196.255 us 192.203.197.0 - 192.203.197.255 ca 192.203.198.0 - 192.203.202.255 us 192.203.203.0 - 192.203.203.255 ca 192.203.204.0 - 192.203.207.255 us -192.203.208.0 - 192.203.209.255 nz +192.203.208.0 - 192.203.209.255 au 192.203.210.0 - 192.203.212.255 us 192.203.213.0 - 192.203.213.255 au 192.203.214.0 - 192.203.215.255 us -192.203.216.0 - 192.203.216.255 nz -192.203.217.0 - 192.203.218.255 us -192.203.220.0 - 192.203.226.255 us -192.203.227.0 - 192.203.227.255 sa +192.203.216.0 - 192.203.216.255 au +192.203.217.0 - 192.203.226.255 us +192.203.227.0 - 192.203.227.255 nl 192.203.228.0 - 192.203.231.255 us -192.203.232.0 - 192.203.232.255 mo +192.203.232.0 - 192.203.232.255 au 192.203.233.0 - 192.203.234.255 us 192.203.235.0 - 192.203.235.255 au -192.203.236.0 - 192.203.246.255 us +192.203.236.0 - 192.203.238.255 us +192.203.239.0 - 192.203.239.255 ca +192.203.240.0 - 192.203.246.255 us 192.203.247.0 - 192.203.247.255 th -192.203.248.0 - 192.204.63.255 us -192.204.64.0 - 192.204.79.255 a1 -192.204.80.0 - 192.205.255.255 us +192.203.248.0 - 192.206.0.255 us 192.206.1.0 - 192.206.1.255 ca 192.206.2.0 - 192.206.3.255 us +192.206.4.0 - 192.206.7.255 ca 192.206.8.0 - 192.206.27.255 us 192.206.28.0 - 192.206.28.255 ca -192.206.29.0 - 192.206.71.255 us -192.206.74.0 - 192.206.76.255 us +192.206.29.0 - 192.206.53.255 us +192.206.54.0 - 192.206.55.255 ca +192.206.56.0 - 192.206.76.255 us 192.206.77.0 - 192.206.81.255 gb 192.206.82.0 - 192.206.85.255 us -192.206.86.0 - 192.206.86.255 il -192.206.87.0 - 192.206.91.255 us -192.206.92.0 - 192.206.95.255 ca -192.206.96.0 - 192.206.101.255 us -192.206.102.0 - 192.206.102.255 hk +192.206.86.0 - 192.206.86.255 nl +192.206.87.0 - 192.206.92.255 us +192.206.93.0 - 192.206.94.255 ca +192.206.95.0 - 192.206.101.255 us +192.206.102.0 - 192.206.102.255 au 192.206.103.0 - 192.206.107.255 us 192.206.108.0 - 192.206.108.255 au -192.206.109.0 - 192.206.109.255 us -192.206.112.0 - 192.206.116.255 us +192.206.109.0 - 192.206.116.255 us 192.206.117.0 - 192.206.117.255 au 192.206.118.0 - 192.206.143.255 us 192.206.144.0 - 192.206.151.255 ca 192.206.152.0 - 192.206.157.255 nz 192.206.158.0 - 192.206.180.255 us 192.206.181.0 - 192.206.181.255 ca -192.206.182.0 - 192.206.182.255 us -192.206.184.0 - 192.206.216.255 us +192.206.182.0 - 192.206.216.255 us 192.206.217.0 - 192.206.218.255 ca 192.206.219.0 - 192.206.221.255 us 192.206.222.0 - 192.206.226.255 il -192.206.227.0 - 192.207.30.255 us +192.206.227.0 - 192.207.11.255 us +192.207.12.0 - 192.207.12.255 ca +192.207.13.0 - 192.207.13.255 us +192.207.14.0 - 192.207.14.255 nl +192.207.15.0 - 192.207.30.255 us 192.207.31.0 - 192.207.31.255 nl 192.207.32.0 - 192.207.32.255 us 192.207.33.0 - 192.207.33.255 au +192.207.34.0 - 192.207.35.255 us 192.207.36.0 - 192.207.36.255 au 192.207.37.0 - 192.207.39.255 us 192.207.40.0 - 192.207.42.255 ec 192.207.43.0 - 192.207.47.255 us 192.207.48.0 - 192.207.48.255 pr -192.207.50.0 - 192.207.63.255 us -192.207.64.0 - 192.207.64.255 th +192.207.49.0 - 192.207.59.255 us +192.207.60.0 - 192.207.61.255 ca +192.207.62.0 - 192.207.63.255 us +192.207.64.0 - 192.207.64.255 au 192.207.65.0 - 192.207.68.255 ec 192.207.69.0 - 192.207.75.255 us 192.207.76.0 - 192.207.76.255 ca @@ -88672,13 +79072,13 @@ 192.207.122.0 - 192.207.137.255 us 192.207.138.0 - 192.207.138.255 ca 192.207.139.0 - 192.207.140.255 us -192.207.141.0 - 192.207.141.255 gb -192.207.142.0 - 192.207.142.255 lu +192.207.141.0 - 192.207.142.255 nl 192.207.143.0 - 192.207.143.255 nz 192.207.144.0 - 192.207.145.255 us 192.207.146.0 - 192.207.146.255 cl 192.207.147.0 - 192.207.150.255 us -192.207.151.0 - 192.207.158.255 au +192.207.151.0 - 192.207.153.255 au +192.207.156.0 - 192.207.158.255 au 192.207.159.0 - 192.207.160.255 us 192.207.161.0 - 192.207.161.255 au 192.207.162.0 - 192.207.164.255 us @@ -88699,31 +79099,57 @@ 192.207.244.0 - 192.207.244.255 ec 192.207.245.0 - 192.207.247.255 us 192.207.248.0 - 192.207.248.255 au -192.207.249.0 - 192.207.251.255 us -192.207.253.0 - 192.207.253.255 us -192.207.254.0 - 192.207.254.255 th -192.208.0.0 - 192.208.15.255 ca -192.208.16.0 - 192.208.159.255 us -192.209.0.0 - 192.209.255.255 us -192.210.0.0 - 192.210.15.255 ca -192.210.32.0 - 192.210.47.255 us -192.210.64.0 - 192.210.127.255 ca -192.211.0.0 - 192.211.127.255 us -192.212.0.0 - 192.212.255.255 us +192.207.249.0 - 192.207.253.255 us +192.207.254.0 - 192.207.254.255 au +192.207.255.0 - 192.208.0.255 us +192.208.1.0 - 192.208.15.255 ca +192.208.16.0 - 192.210.0.255 us +192.210.1.0 - 192.210.10.255 ca +192.210.11.0 - 192.210.63.255 us +192.210.64.0 - 192.210.131.255 ca +192.210.132.0 - 192.210.151.255 us +192.210.152.0 - 192.210.155.255 ca +192.210.156.0 - 192.210.220.23 us +192.210.220.24 - 192.210.220.31 gb +192.210.220.32 - 192.210.223.255 us +192.210.224.0 - 192.210.225.255 ca +192.210.226.0 - 192.211.45.255 us +192.211.46.0 - 192.211.47.255 ca +192.211.48.0 - 192.211.123.255 us +192.211.124.0 - 192.211.127.255 ca +192.211.128.0 - 192.212.255.255 us 192.213.0.0 - 192.213.0.255 ca -192.213.1.0 - 192.216.31.255 us +192.213.1.0 - 192.214.99.255 us +192.214.100.0 - 192.214.103.255 ca +192.214.104.0 - 192.214.111.255 us +192.214.112.0 - 192.214.127.255 bb +192.214.128.0 - 192.214.255.255 ca +192.215.0.0 - 192.216.31.255 us 192.216.32.0 - 192.216.33.255 ve -192.216.34.0 - 192.216.140.127 us -192.216.140.128 - 192.216.140.135 br -192.216.140.136 - 192.217.255.255 us +192.216.34.0 - 192.217.255.255 us 192.218.0.0 - 192.218.255.255 jp -192.219.0.0 - 192.219.255.255 ca -192.220.0.0 - 192.221.255.255 us -192.222.0.0 - 192.222.15.255 ca -192.222.16.0 - 192.222.127.255 us -192.223.0.0 - 192.223.63.255 us +192.219.0.0 - 192.219.254.255 ca +192.219.255.0 - 192.221.143.255 us +192.221.144.0 - 192.221.144.0 de +192.221.144.1 - 192.221.151.255 us +192.221.152.0 - 192.221.152.255 gb +192.221.153.0 - 192.221.153.255 us +192.221.154.0 - 192.221.154.255 gb +192.221.155.0 - 192.222.0.255 us +192.222.1.0 - 192.222.8.255 ca +192.222.9.0 - 192.222.101.255 us +192.222.102.0 - 192.222.103.255 ca +192.222.104.0 - 192.222.127.255 us +192.222.128.0 - 192.222.255.255 ca +192.223.0.0 - 192.223.11.255 us +192.223.12.0 - 192.223.15.255 ca +192.223.16.0 - 192.223.63.255 us 192.223.64.0 - 192.223.127.255 br -192.223.128.0 - 192.224.2.255 us +192.223.128.0 - 192.223.142.255 us +192.223.143.0 - 192.223.143.255 ap +192.223.144.0 - 192.223.145.255 us +192.223.146.0 - 192.223.146.255 au +192.223.147.0 - 192.224.2.255 us 192.224.3.0 - 192.224.3.255 ca 192.224.4.0 - 192.224.12.255 us 192.224.13.0 - 192.224.13.255 ca @@ -88739,9 +79165,7 @@ 192.224.54.0 - 192.224.54.255 ca 192.224.55.0 - 192.224.60.255 us 192.224.61.0 - 192.224.61.255 pr -192.224.62.0 - 192.224.77.255 us -192.224.78.0 - 192.224.78.255 ca -192.224.79.0 - 192.224.80.255 us +192.224.62.0 - 192.224.80.255 us 192.224.81.0 - 192.224.81.255 ca 192.224.82.0 - 192.224.84.255 us 192.224.85.0 - 192.224.86.255 ca @@ -88750,10 +79174,10 @@ 192.224.93.0 - 192.224.93.255 us 192.224.94.0 - 192.224.94.255 ca 192.224.95.0 - 192.224.103.255 us -192.224.104.0 - 192.224.106.255 ca -192.224.107.0 - 192.224.120.255 us -192.224.121.0 - 192.224.121.255 ca -192.224.122.0 - 192.224.122.255 us +192.224.104.0 - 192.224.104.255 ca +192.224.105.0 - 192.224.105.255 us +192.224.106.0 - 192.224.106.255 ca +192.224.107.0 - 192.224.122.255 us 192.224.123.0 - 192.224.124.255 ca 192.224.125.0 - 192.224.125.255 us 192.224.126.0 - 192.224.126.255 ca @@ -88762,8 +79186,8 @@ 192.224.142.0 - 192.224.157.255 us 192.224.158.0 - 192.224.158.255 ca 192.224.159.0 - 192.224.160.255 us -192.224.161.0 - 192.224.162.255 ca -192.224.163.0 - 192.224.170.255 us +192.224.161.0 - 192.224.161.255 ca +192.224.162.0 - 192.224.170.255 us 192.224.171.0 - 192.224.174.255 ca 192.224.175.0 - 192.224.175.255 us 192.224.176.0 - 192.224.176.255 ca @@ -88777,9 +79201,7 @@ 192.224.211.0 - 192.224.211.255 ca 192.224.212.0 - 192.224.213.255 us 192.224.214.0 - 192.224.214.255 ca -192.224.215.0 - 192.224.218.255 us -192.224.219.0 - 192.224.219.255 ca -192.224.220.0 - 192.224.220.255 us +192.224.215.0 - 192.224.220.255 us 192.224.221.0 - 192.224.221.255 ca 192.224.222.0 - 192.224.226.255 us 192.224.227.0 - 192.224.227.255 ca @@ -88791,43 +79213,98 @@ 192.224.246.0 - 192.224.246.255 ca 192.224.247.0 - 192.224.253.255 us 192.224.254.0 - 192.224.254.255 ca -192.224.255.0 - 192.226.31.255 us +192.224.255.0 - 192.224.255.255 us +192.225.0.0 - 192.225.0.255 ca +192.225.1.0 - 192.225.99.255 us +192.225.100.0 - 192.225.101.255 ca +192.225.102.0 - 192.225.103.255 us +192.225.104.0 - 192.225.105.255 ca +192.225.106.0 - 192.225.107.255 us +192.225.108.0 - 192.225.109.255 ca +192.225.110.0 - 192.226.31.255 us 192.226.32.0 - 192.226.63.255 ca 192.226.64.0 - 192.226.127.255 us -192.227.0.0 - 192.227.15.255 ph -192.227.16.0 - 192.227.127.255 us -192.228.0.0 - 192.228.31.255 ca -192.228.32.0 - 192.228.95.255 us +192.226.128.0 - 192.226.255.255 ca +192.227.0.0 - 192.227.0.255 us +192.227.1.0 - 192.227.15.255 ph +192.227.16.0 - 192.227.147.255 us +192.227.148.0 - 192.227.155.255 ca +192.227.156.0 - 192.227.156.255 us +192.227.157.0 - 192.227.157.127 ca +192.227.157.128 - 192.227.158.255 us +192.227.159.0 - 192.227.159.157 ca +192.227.159.158 - 192.227.159.158 us +192.227.159.159 - 192.227.159.255 ca +192.227.160.0 - 192.227.239.191 us +192.227.239.192 - 192.227.239.255 ie +192.227.240.0 - 192.228.0.255 us +192.228.1.0 - 192.228.31.255 ca +192.228.32.0 - 192.228.127.255 us 192.228.128.0 - 192.228.255.255 my -192.229.0.0 - 192.229.63.255 us -192.230.0.0 - 192.230.15.255 us -192.230.16.0 - 192.230.31.255 nz -192.231.0.0 - 192.231.14.255 us +192.229.0.0 - 192.229.16.255 us +192.229.17.0 - 192.229.18.112 eu +192.229.18.113 - 192.229.23.255 us +192.229.24.0 - 192.229.31.255 ca +192.229.32.0 - 192.229.133.255 us +192.229.134.0 - 192.229.135.255 de +192.229.136.0 - 192.229.137.255 es +192.229.138.0 - 192.229.153.255 us +192.229.154.0 - 192.229.154.255 hk +192.229.155.0 - 192.229.158.255 us +192.229.159.0 - 192.229.159.255 de +192.229.160.0 - 192.229.163.255 us +192.229.164.0 - 192.229.165.255 fr +192.229.166.0 - 192.229.167.255 au +192.229.168.0 - 192.229.173.255 us +192.229.174.0 - 192.229.177.255 in +192.229.178.0 - 192.229.189.255 us +192.229.190.0 - 192.229.191.255 sg +192.229.192.0 - 192.229.211.255 us +192.229.212.0 - 192.229.212.255 ec +192.229.213.0 - 192.229.213.255 co +192.229.214.0 - 192.229.225.255 us +192.229.226.0 - 192.229.226.255 gb +192.229.227.0 - 192.230.15.255 us +192.230.32.0 - 192.230.51.255 us +192.230.52.0 - 192.230.52.255 mo +192.230.53.0 - 192.230.53.255 gh +192.230.54.0 - 192.230.54.255 gr +192.230.55.0 - 192.230.55.255 qa +192.230.56.0 - 192.230.60.255 us +192.230.61.0 - 192.230.61.255 gb +192.230.62.0 - 192.230.81.255 us +192.230.82.0 - 192.230.82.255 es +192.230.83.0 - 192.231.4.255 us +192.231.5.0 - 192.231.5.255 ca +192.231.6.0 - 192.231.14.255 us 192.231.15.0 - 192.231.15.255 nz 192.231.16.0 - 192.231.33.255 us 192.231.34.0 - 192.231.34.255 au -192.231.36.0 - 192.231.58.255 us +192.231.35.0 - 192.231.35.255 us +192.231.36.0 - 192.231.36.255 bs +192.231.37.0 - 192.231.58.255 us 192.231.59.0 - 192.231.59.255 au -192.231.60.0 - 192.231.64.255 us +192.231.60.0 - 192.231.65.255 us 192.231.66.0 - 192.231.66.255 ca -192.231.67.0 - 192.231.67.255 at +192.231.67.0 - 192.231.67.255 nl 192.231.68.0 - 192.231.76.255 us 192.231.77.0 - 192.231.77.255 au 192.231.78.0 - 192.231.81.255 us -192.231.82.0 - 192.231.82.255 de -192.231.83.0 - 192.231.83.255 us -192.231.86.0 - 192.231.88.255 us +192.231.82.0 - 192.231.82.255 nl +192.231.83.0 - 192.231.88.255 us 192.231.89.0 - 192.231.89.255 ca 192.231.90.0 - 192.231.91.255 us 192.231.92.0 - 192.231.97.255 pr 192.231.98.0 - 192.231.109.255 us 192.231.110.0 - 192.231.110.255 cl 192.231.111.0 - 192.231.113.255 us -192.231.114.0 - 192.231.121.255 br +192.231.114.0 - 192.231.115.255 br +192.231.116.0 - 192.231.119.255 co +192.231.120.0 - 192.231.121.255 br 192.231.122.0 - 192.231.126.255 us 192.231.127.0 - 192.231.127.255 au -192.231.128.0 - 192.231.133.255 us -192.231.135.0 - 192.231.137.255 au +192.231.128.0 - 192.231.134.255 us +192.231.135.0 - 192.231.136.255 au 192.231.138.0 - 192.231.139.255 us 192.231.140.0 - 192.231.140.255 cl 192.231.141.0 - 192.231.143.255 us @@ -88839,8 +79316,10 @@ 192.231.172.0 - 192.231.174.255 ca 192.231.175.0 - 192.231.176.255 br 192.231.177.0 - 192.231.182.255 us -192.231.183.0 - 192.231.183.255 nz -192.231.184.0 - 192.231.192.255 us +192.231.183.0 - 192.231.183.255 au +192.231.184.0 - 192.231.187.255 us +192.231.188.0 - 192.231.188.255 ca +192.231.189.0 - 192.231.192.255 us 192.231.193.0 - 192.231.193.255 au 192.231.194.0 - 192.231.202.255 us 192.231.203.0 - 192.231.203.255 au @@ -88850,25 +79329,36 @@ 192.231.216.0 - 192.231.216.255 au 192.231.217.0 - 192.231.217.255 us 192.231.218.0 - 192.231.218.255 au -192.231.219.0 - 192.231.246.255 us +192.231.219.0 - 192.231.236.255 us +192.231.237.0 - 192.231.237.255 mu +192.231.238.0 - 192.231.246.255 us 192.231.247.0 - 192.231.247.255 ca -192.231.248.0 - 192.231.248.255 nz -192.231.252.0 - 192.231.253.255 us -192.231.254.0 - 192.231.254.255 za -192.232.0.0 - 192.232.31.255 us -192.232.32.0 - 192.232.63.255 au -192.232.64.0 - 192.232.127.255 us +192.231.248.0 - 192.231.248.255 au +192.231.249.0 - 192.231.253.255 us +192.231.254.0 - 192.231.254.255 mu +192.231.255.0 - 192.232.31.255 us +192.232.64.0 - 192.232.68.255 us +192.232.69.0 - 192.232.69.255 ap +192.232.70.0 - 192.232.78.255 us +192.232.79.0 - 192.232.79.255 eu +192.232.80.0 - 192.232.127.255 us 192.232.128.0 - 192.232.159.255 au -192.233.0.0 - 192.234.22.255 us +192.232.160.0 - 192.233.255.255 us +192.234.0.0 - 192.234.0.255 ca +192.234.1.0 - 192.234.22.255 us 192.234.23.0 - 192.234.23.255 ca 192.234.24.0 - 192.234.57.255 us -192.234.58.0 - 192.234.58.255 jp +192.234.58.0 - 192.234.58.255 au 192.234.59.0 - 192.234.97.255 us 192.234.98.0 - 192.234.98.255 ca 192.234.99.0 - 192.234.170.255 us 192.234.171.0 - 192.234.171.255 ca -192.234.172.0 - 192.234.220.255 us -192.234.222.0 - 192.234.222.255 us +192.234.172.0 - 192.234.191.255 us +192.234.194.0 - 192.234.195.255 us +192.234.196.0 - 192.234.199.255 ca +192.234.200.0 - 192.234.203.255 us +192.234.204.0 - 192.234.204.255 ca +192.234.205.0 - 192.234.222.255 us 192.234.223.0 - 192.234.229.255 ca 192.234.230.0 - 192.234.230.255 us 192.234.231.0 - 192.234.231.255 au @@ -88876,8 +79366,13 @@ 192.234.245.0 - 192.234.245.255 au 192.234.246.0 - 192.234.253.255 us 192.234.254.0 - 192.234.254.255 ca -192.235.0.0 - 192.235.63.255 us -192.236.0.0 - 192.236.63.255 us +192.234.255.0 - 192.235.47.255 us +192.235.48.0 - 192.235.63.255 bb +192.235.64.0 - 192.235.127.255 us +192.235.128.0 - 192.235.255.255 ca +192.236.0.0 - 192.236.11.255 us +192.236.12.0 - 192.236.15.255 ca +192.236.16.0 - 192.236.255.255 us 192.237.0.0 - 192.237.31.255 ca 192.237.32.0 - 192.237.67.255 us 192.237.68.0 - 192.237.69.255 hk @@ -88886,23 +79381,14 @@ 192.237.73.0 - 192.237.73.255 de 192.237.74.0 - 192.237.75.255 us 192.237.76.0 - 192.237.76.255 ca -192.237.77.0 - 192.237.79.255 us -192.237.80.0 - 192.237.80.255 de +192.237.77.0 - 192.237.80.255 us 192.237.81.0 - 192.237.82.255 gb 192.237.83.0 - 192.237.88.255 us 192.237.89.0 - 192.237.89.255 fr 192.237.90.0 - 192.237.90.255 ch -192.237.91.0 - 192.237.94.31 us -192.237.94.32 - 192.237.94.47 nl -192.237.94.48 - 192.237.94.159 us -192.237.94.160 - 192.237.94.191 nl -192.237.94.192 - 192.237.94.255 us +192.237.91.0 - 192.237.94.255 us 192.237.95.0 - 192.237.96.255 es -192.237.97.0 - 192.237.98.127 us -192.237.98.128 - 192.237.98.159 be -192.237.98.160 - 192.237.98.255 us -192.237.99.0 - 192.237.99.63 lu -192.237.99.64 - 192.237.104.255 us +192.237.97.0 - 192.237.104.255 us 192.237.105.0 - 192.237.106.255 it 192.237.107.0 - 192.237.109.255 us 192.237.110.0 - 192.237.110.255 de @@ -88914,21 +79400,40 @@ 192.237.119.0 - 192.237.119.255 jp 192.237.120.0 - 192.237.120.255 us 192.237.121.0 - 192.237.124.255 gb -192.237.125.0 - 192.237.127.255 us -192.238.0.0 - 192.238.15.255 ch -192.238.16.0 - 192.238.23.255 us -192.238.32.0 - 192.238.127.255 us -192.239.0.0 - 192.240.15.255 us +192.237.125.0 - 192.238.0.255 us +192.238.1.0 - 192.238.10.255 ch +192.238.11.0 - 192.238.15.255 ca +192.238.16.0 - 192.238.20.255 us +192.238.21.0 - 192.238.21.255 a1 +192.238.22.0 - 192.240.15.255 us 192.240.16.0 - 192.240.31.255 au -192.240.32.0 - 192.240.47.255 us -192.240.64.0 - 192.240.95.255 us -192.240.128.0 - 192.240.159.255 us -192.241.0.0 - 192.241.63.255 us -192.242.0.0 - 192.243.15.255 us +192.240.32.0 - 192.240.162.39 us +192.240.162.40 - 192.240.162.47 nl +192.240.162.48 - 192.240.191.255 us +192.240.192.0 - 192.240.192.255 gb +192.240.193.0 - 192.240.244.255 us +192.240.245.0 - 192.240.245.255 gb +192.240.246.0 - 192.241.71.255 us +192.241.72.0 - 192.241.72.255 ca +192.241.73.0 - 192.241.94.255 us +192.241.95.0 - 192.241.95.255 ch +192.241.96.0 - 192.241.106.255 us +192.241.107.0 - 192.241.107.255 fr +192.241.108.0 - 192.241.118.255 us +192.241.119.0 - 192.241.119.255 gb +192.241.120.0 - 192.241.125.255 us +192.241.126.0 - 192.241.126.255 tr +192.241.127.0 - 192.241.127.127 ca +192.241.127.128 - 192.242.156.175 us +192.242.156.176 - 192.242.156.191 cr +192.242.156.192 - 192.243.15.255 us 192.243.16.0 - 192.243.19.255 es 192.243.20.0 - 192.243.23.255 au -192.243.32.0 - 192.243.39.255 us -192.243.128.0 - 192.243.255.255 us +192.243.24.0 - 192.243.123.255 us +192.243.124.0 - 192.243.127.255 nl +192.243.128.0 - 192.243.213.255 us +192.243.214.0 - 192.243.215.255 ca +192.243.216.0 - 192.243.255.255 us 192.244.0.0 - 192.244.255.255 jp 192.245.0.0 - 192.245.10.255 us 192.245.11.0 - 192.245.11.255 au @@ -88936,74 +79441,96 @@ 192.245.13.0 - 192.245.14.255 au 192.245.15.0 - 192.245.23.255 us 192.245.24.0 - 192.245.24.255 ca -192.245.25.0 - 192.245.33.255 us -192.245.34.0 - 192.245.35.255 au +192.245.25.0 - 192.245.29.255 us +192.245.30.0 - 192.245.30.255 br +192.245.31.0 - 192.245.33.255 us 192.245.36.0 - 192.245.36.255 nz 192.245.37.0 - 192.245.50.255 us 192.245.51.0 - 192.245.51.255 ca 192.245.52.0 - 192.245.57.255 us 192.245.58.0 - 192.245.59.255 sg 192.245.60.0 - 192.245.60.255 cl -192.245.61.0 - 192.245.72.255 us -192.245.73.0 - 192.245.80.255 nz -192.245.81.0 - 192.245.90.255 us +192.245.61.0 - 192.245.90.255 us 192.245.91.0 - 192.245.91.255 ca 192.245.92.0 - 192.245.93.255 us -192.245.94.0 - 192.245.94.255 nz +192.245.94.0 - 192.245.94.255 au 192.245.95.0 - 192.245.104.255 us 192.245.105.0 - 192.245.112.255 au 192.245.113.0 - 192.245.120.255 us 192.245.121.0 - 192.245.121.255 bo 192.245.122.0 - 192.245.147.255 us -192.245.148.0 - 192.245.148.255 dz +192.245.148.0 - 192.245.148.255 mu 192.245.149.0 - 192.245.151.255 us 192.245.152.0 - 192.245.152.255 ua 192.245.153.0 - 192.245.154.255 us -192.245.155.0 - 192.245.155.255 hk -192.245.156.0 - 192.245.156.255 us -192.245.160.0 - 192.245.168.255 us -192.245.169.0 - 192.245.169.255 pl +192.245.155.0 - 192.245.155.255 au +192.245.156.0 - 192.245.159.255 us +192.245.160.0 - 192.245.161.255 ca +192.245.162.0 - 192.245.168.255 us +192.245.169.0 - 192.245.169.255 nl 192.245.170.0 - 192.245.171.255 us 192.245.172.0 - 192.245.172.255 ca -192.245.173.0 - 192.245.180.255 us -192.245.182.0 - 192.245.182.255 us +192.245.173.0 - 192.245.182.255 us 192.245.183.0 - 192.245.183.255 ca 192.245.184.0 - 192.245.184.255 us 192.245.185.0 - 192.245.185.255 nz -192.245.186.0 - 192.245.191.255 us +192.245.187.0 - 192.245.191.255 us 192.245.192.0 - 192.245.192.255 au -192.245.194.0 - 192.245.195.255 us -192.245.196.0 - 192.245.196.255 hk +192.245.193.0 - 192.245.194.255 us +192.245.196.0 - 192.245.196.255 au 192.245.197.0 - 192.245.207.255 us -192.245.208.0 - 192.245.208.255 hk +192.245.208.0 - 192.245.208.255 au 192.245.209.0 - 192.245.209.255 us 192.245.210.0 - 192.245.217.255 au 192.245.218.0 - 192.245.218.255 us -192.245.219.0 - 192.245.219.255 au -192.245.220.0 - 192.245.220.255 nz +192.245.219.0 - 192.245.220.255 au 192.245.221.0 - 192.245.224.255 us -192.245.225.0 - 192.245.225.255 gb +192.245.225.0 - 192.245.225.255 nl 192.245.226.0 - 192.245.227.255 us 192.245.228.0 - 192.245.228.255 ca 192.245.229.0 - 192.245.248.255 us 192.245.249.0 - 192.245.251.255 kr -192.245.252.0 - 192.246.6.255 us -192.246.7.0 - 192.246.7.255 au -192.246.8.0 - 192.246.72.255 us +192.245.252.0 - 192.246.72.255 us 192.246.73.0 - 192.246.73.255 au 192.246.74.0 - 192.246.255.255 us -192.247.0.0 - 192.247.15.255 gb -192.247.16.0 - 192.247.95.255 us -192.247.128.0 - 192.247.255.255 us +192.247.0.0 - 192.247.0.255 ca +192.247.1.0 - 192.247.10.255 gb +192.247.11.0 - 192.247.11.255 us +192.247.12.0 - 192.247.15.255 ca +192.247.16.0 - 192.247.255.255 us 192.248.0.0 - 192.248.127.255 lk 192.248.128.0 - 192.249.15.255 us 192.249.16.0 - 192.249.31.255 kr -192.249.32.0 - 192.249.63.255 us +192.249.32.0 - 192.249.39.2 us +192.249.39.3 - 192.249.39.3 eu +192.249.39.4 - 192.249.40.255 us +192.249.41.0 - 192.249.41.2 sg +192.249.41.3 - 192.249.41.3 us +192.249.41.4 - 192.249.41.31 sg +192.249.41.32 - 192.249.41.255 au +192.249.42.0 - 192.249.95.255 us +192.249.96.0 - 192.249.111.255 ca +192.249.112.0 - 192.249.127.255 us +192.249.128.0 - 192.249.255.255 ca 192.250.0.0 - 192.250.15.255 us -192.250.22.0 - 192.250.23.255 us +192.250.16.0 - 192.250.19.255 ca +192.250.20.0 - 192.250.23.255 us 192.250.24.0 - 192.250.28.255 ca -192.250.30.0 - 192.250.191.255 us -192.251.0.0 - 192.251.25.255 us +192.250.29.0 - 192.250.48.255 us +192.250.49.0 - 192.250.49.255 ap +192.250.50.0 - 192.250.97.255 us +192.250.98.0 - 192.250.98.41 gb +192.250.98.42 - 192.250.98.43 eu +192.250.98.44 - 192.250.98.255 gb +192.250.99.0 - 192.250.146.255 us +192.250.147.0 - 192.250.147.255 au +192.250.148.0 - 192.250.171.255 us +192.250.172.0 - 192.250.172.255 in +192.250.173.0 - 192.250.177.255 us +192.250.178.0 - 192.250.179.255 in +192.250.180.0 - 192.250.255.255 us +192.251.0.0 - 192.251.0.255 ca +192.251.1.0 - 192.251.25.255 us 192.251.26.0 - 192.251.30.255 ca 192.251.31.0 - 192.251.38.255 us 192.251.39.0 - 192.251.39.255 cl @@ -89023,47 +79550,123 @@ 192.251.195.0 - 192.251.195.255 au 192.251.196.0 - 192.251.196.255 ca 192.251.197.0 - 192.251.197.255 us +192.251.198.0 - 192.251.199.255 ca +192.251.200.0 - 192.251.200.255 us 192.251.201.0 - 192.251.201.255 au 192.251.202.0 - 192.251.202.255 gh 192.251.203.0 - 192.251.203.255 us 192.251.204.0 - 192.251.207.255 au 192.251.208.0 - 192.251.225.255 us -192.251.226.0 - 192.251.226.255 de -192.251.227.0 - 192.251.228.255 th -192.251.229.0 - 192.251.229.255 au +192.251.226.0 - 192.251.226.255 nl 192.251.231.0 - 192.251.231.255 ca -192.251.232.0 - 192.251.239.255 us -192.252.0.0 - 192.255.255.255 us -193.0.0.0 - 193.0.15.255 nl -193.0.16.0 - 193.0.16.255 gb -193.0.17.0 - 193.0.31.255 nl +192.251.232.0 - 192.252.127.255 us +192.252.128.0 - 192.252.143.255 ca +192.252.144.0 - 192.252.159.255 us +192.252.160.0 - 192.252.175.255 ca +192.252.176.0 - 192.252.223.255 us +192.252.224.0 - 192.252.239.255 ca +192.252.240.0 - 192.253.203.255 us +192.253.204.0 - 192.253.223.255 ca +192.253.224.0 - 192.253.239.255 us +192.253.240.0 - 192.253.240.255 hk +192.253.241.0 - 192.253.241.255 gb +192.253.242.0 - 192.253.242.127 us +192.253.242.128 - 192.253.242.255 au +192.253.243.0 - 192.253.246.255 us +192.253.247.0 - 192.253.247.127 kr +192.253.247.128 - 192.253.247.255 jp +192.253.248.0 - 192.253.248.255 au +192.253.249.0 - 192.253.249.127 ph +192.253.249.128 - 192.253.249.255 vn +192.253.250.0 - 192.253.250.255 is +192.253.251.0 - 192.253.251.255 sg +192.253.252.0 - 192.253.252.255 de +192.253.253.0 - 192.253.253.127 kr +192.253.253.128 - 192.253.253.255 jp +192.253.254.0 - 192.253.254.127 th +192.253.254.128 - 192.253.254.255 tw +192.253.255.0 - 192.253.255.127 sg +192.253.255.128 - 192.253.255.255 my +192.254.0.0 - 192.254.95.255 us +192.254.96.0 - 192.254.111.255 pr +192.254.112.0 - 192.255.69.255 us +192.255.70.0 - 192.255.70.255 nl +192.255.71.0 - 192.255.79.255 us +192.255.80.0 - 192.255.80.255 ve +192.255.81.0 - 192.255.81.255 ag +192.255.82.0 - 192.255.82.255 pe +192.255.83.0 - 192.255.83.255 bs +192.255.84.0 - 192.255.84.255 py +192.255.85.0 - 192.255.85.255 jm +192.255.86.0 - 192.255.86.255 gy +192.255.87.0 - 192.255.87.255 ni +192.255.88.0 - 192.255.88.255 ec +192.255.89.0 - 192.255.89.255 bb +192.255.90.0 - 192.255.90.255 sr +192.255.91.0 - 192.255.91.255 bz +192.255.92.0 - 192.255.92.255 bo +192.255.93.0 - 192.255.93.255 de +192.255.94.0 - 192.255.94.255 sv +192.255.95.0 - 192.255.95.255 ht +192.255.96.0 - 192.255.107.255 us +192.255.108.0 - 192.255.108.255 de +192.255.109.0 - 192.255.255.255 us +193.0.0.0 - 193.0.23.255 nl +193.0.24.0 - 193.0.31.255 ro 193.0.32.0 - 193.0.55.255 ch 193.0.56.0 - 193.0.60.255 dk 193.0.61.0 - 193.0.61.255 ua 193.0.62.0 - 193.0.62.255 fr 193.0.63.0 - 193.0.63.255 de -193.0.64.0 - 193.0.127.255 pl -193.0.128.0 - 193.0.223.255 fr +193.0.64.0 - 193.0.128.255 pl +193.0.129.0 - 193.0.135.255 ru +193.0.136.0 - 193.0.141.255 lv +193.0.142.0 - 193.0.143.255 ua +193.0.144.0 - 193.0.144.255 pl +193.0.145.0 - 193.0.145.255 ru +193.0.148.0 - 193.0.155.255 ru +193.0.156.0 - 193.0.156.255 ir +193.0.157.0 - 193.0.157.255 it +193.0.158.0 - 193.0.159.255 gb +193.0.160.0 - 193.0.160.255 nl +193.0.161.0 - 193.0.161.255 dk +193.0.162.0 - 193.0.163.255 kz +193.0.164.0 - 193.0.165.255 fi +193.0.166.0 - 193.0.175.255 ru +193.0.176.0 - 193.0.177.255 gb +193.0.178.0 - 193.0.179.255 ru +193.0.180.0 - 193.0.183.255 ch +193.0.184.0 - 193.0.185.255 ru +193.0.186.0 - 193.0.187.255 de +193.0.188.0 - 193.0.188.255 at +193.0.189.0 - 193.0.189.255 gb +193.0.190.0 - 193.0.190.255 ro +193.0.191.0 - 193.0.191.255 gb +193.0.192.0 - 193.0.197.255 pl +193.0.198.0 - 193.0.198.255 ru +193.0.199.0 - 193.0.199.255 de +193.0.200.0 - 193.0.203.255 ru +193.0.204.0 - 193.0.207.255 ua +193.0.208.0 - 193.0.211.255 pl +193.0.213.0 - 193.0.213.255 bg +193.0.214.0 - 193.0.215.255 ru +193.0.216.0 - 193.0.221.255 ua +193.0.222.0 - 193.0.222.255 no +193.0.223.0 - 193.0.223.255 ua 193.0.224.0 - 193.0.224.255 ch 193.0.225.0 - 193.0.225.255 ro 193.0.226.0 - 193.0.226.255 hu -193.0.227.0 - 193.0.228.255 ua -193.0.229.0 - 193.0.229.255 gb -193.0.230.0 - 193.0.230.255 at +193.0.228.0 - 193.0.228.255 ua 193.0.231.0 - 193.0.231.255 cz 193.0.232.0 - 193.0.233.255 ch -193.0.234.0 - 193.0.234.255 gb -193.0.235.0 - 193.0.235.255 se 193.0.236.0 - 193.0.236.255 pl 193.0.237.0 - 193.0.237.255 ch -193.0.238.0 - 193.0.238.255 de -193.0.239.0 - 193.0.239.255 gb +193.0.238.0 - 193.0.238.255 eu 193.0.240.0 - 193.0.240.255 ua 193.0.241.0 - 193.0.241.255 es 193.0.242.0 - 193.0.242.255 pl 193.0.243.0 - 193.0.243.255 dk 193.0.244.0 - 193.0.244.255 si -193.0.245.0 - 193.0.245.255 fr 193.0.246.0 - 193.0.246.255 de 193.0.247.0 - 193.0.247.255 ua 193.0.248.0 - 193.0.248.255 de @@ -89076,9 +79679,7 @@ 193.0.255.0 - 193.0.255.255 gb 193.1.0.0 - 193.1.255.255 ie 193.2.0.0 - 193.2.255.255 si -193.3.0.0 - 193.3.8.255 dk -193.3.9.0 - 193.3.11.255 us -193.3.12.0 - 193.3.255.255 dk +193.3.0.0 - 193.3.255.255 dk 193.4.0.0 - 193.4.255.255 is 193.5.0.0 - 193.5.25.255 ch 193.5.26.0 - 193.5.27.255 li @@ -89086,36 +79687,47 @@ 193.6.0.0 - 193.6.255.255 hu 193.7.0.0 - 193.7.159.255 de 193.7.160.0 - 193.7.167.255 ru -193.7.168.0 - 193.7.255.255 de +193.7.168.0 - 193.7.191.255 de +193.7.224.0 - 193.7.255.255 de 193.8.0.0 - 193.8.0.255 ru -193.8.1.0 - 193.8.56.255 ch +193.8.8.0 - 193.8.11.255 ch +193.8.16.0 - 193.8.31.255 ch +193.8.32.0 - 193.8.35.255 se +193.8.36.0 - 193.8.39.255 dk +193.8.40.0 - 193.8.44.255 ch +193.8.45.0 - 193.8.45.255 pl +193.8.46.0 - 193.8.47.255 ua +193.8.48.0 - 193.8.56.255 ch 193.8.57.0 - 193.8.57.255 pl 193.8.58.0 - 193.8.60.255 ch 193.8.61.0 - 193.8.61.255 pl -193.8.62.0 - 193.8.73.255 ch +193.8.64.0 - 193.8.71.255 ch 193.8.74.0 - 193.8.75.255 ru 193.8.76.0 - 193.8.77.255 ch 193.8.78.0 - 193.8.79.255 ua -193.8.80.0 - 193.8.85.255 ch 193.8.86.0 - 193.8.87.255 cz -193.8.88.0 - 193.8.125.255 ch +193.8.88.0 - 193.8.119.255 ch 193.8.126.0 - 193.8.126.255 se -193.8.127.0 - 193.8.138.255 ch +193.8.128.0 - 193.8.137.255 ch 193.8.139.0 - 193.8.139.255 ir 193.8.140.0 - 193.8.181.255 ch 193.8.182.0 - 193.8.183.255 pl -193.8.184.0 - 193.8.200.255 ch -193.8.202.0 - 193.8.202.255 ch +193.8.188.0 - 193.8.189.255 de +193.8.190.0 - 193.8.200.255 ch +193.8.201.0 - 193.8.201.255 ua 193.8.203.0 - 193.8.203.255 ru -193.8.204.0 - 193.8.245.255 ch +193.8.204.0 - 193.8.204.255 ch +193.8.208.0 - 193.8.239.255 ch +193.8.245.0 - 193.8.245.255 ch 193.8.246.0 - 193.8.246.255 lt -193.8.247.0 - 193.8.249.255 ch +193.8.248.0 - 193.8.248.255 ch 193.8.250.0 - 193.8.250.255 sa 193.8.251.0 - 193.8.255.255 ch 193.9.0.0 - 193.9.7.255 gb 193.9.8.0 - 193.9.11.255 be 193.9.12.0 - 193.9.12.255 si -193.9.13.0 - 193.9.15.255 gb +193.9.13.0 - 193.9.13.255 eu +193.9.14.0 - 193.9.14.255 gb 193.9.16.0 - 193.9.16.255 bg 193.9.17.0 - 193.9.17.255 ru 193.9.18.0 - 193.9.18.255 de @@ -89127,29 +79739,14 @@ 193.9.24.0 - 193.9.24.255 ch 193.9.25.0 - 193.9.25.255 pl 193.9.26.0 - 193.9.27.255 hu -193.9.28.0 - 193.9.28.255 ua -193.9.29.0 - 193.9.31.255 hu -193.9.32.0 - 193.9.47.255 de -193.9.48.0 - 193.9.53.255 nl -193.9.54.0 - 193.9.54.255 se -193.9.55.0 - 193.9.57.255 nl -193.9.58.0 - 193.9.59.255 se -193.9.60.0 - 193.9.63.255 nl -193.9.64.0 - 193.9.111.255 eu -193.9.112.0 - 193.9.112.255 fi -193.9.113.0 - 193.9.113.255 fr -193.9.114.0 - 193.9.114.255 it -193.9.115.0 - 193.9.115.255 nl -193.9.116.0 - 193.9.116.255 no -193.9.117.0 - 193.9.117.255 se -193.9.118.0 - 193.9.118.255 dk -193.9.119.0 - 193.9.119.255 gb +193.9.28.0 - 193.9.28.255 us +193.9.64.0 - 193.9.111.255 se 193.9.120.0 - 193.9.120.255 lv 193.9.121.0 - 193.9.121.255 pl 193.9.122.0 - 193.9.122.255 ch 193.9.123.0 - 193.9.123.255 pl 193.9.124.0 - 193.9.127.255 hu -193.9.128.0 - 193.9.147.255 eu +193.9.128.0 - 193.9.147.255 lu 193.9.148.0 - 193.9.151.255 gr 193.9.152.0 - 193.9.157.255 gb 193.9.158.0 - 193.9.158.255 ua @@ -89159,25 +79756,77 @@ 193.9.249.0 - 193.9.249.255 ru 193.9.250.0 - 193.9.251.255 ua 193.9.252.0 - 193.9.253.255 at -193.9.254.0 - 193.9.254.255 dk -193.9.255.0 - 193.9.255.255 at -193.10.0.0 - 193.10.67.255 se -193.10.68.0 - 193.10.68.255 dk -193.10.69.0 - 193.10.253.255 se -193.10.254.0 - 193.10.254.255 dk -193.10.255.0 - 193.12.23.255 se -193.12.24.0 - 193.12.25.255 it -193.12.26.0 - 193.12.47.127 se -193.12.47.128 - 193.12.47.191 gb -193.12.47.192 - 193.15.255.255 se -193.16.0.0 - 193.16.0.255 ch -193.16.1.0 - 193.16.42.255 de +193.9.254.0 - 193.9.254.255 gb +193.10.0.0 - 193.12.51.255 se +193.12.52.0 - 193.12.59.255 nl +193.12.60.0 - 193.12.67.255 se +193.12.68.0 - 193.12.71.255 nl +193.12.72.0 - 193.12.127.255 se +193.12.128.0 - 193.12.135.255 hr +193.12.136.0 - 193.12.167.255 se +193.12.168.0 - 193.12.171.255 nl +193.12.172.0 - 193.12.191.255 se +193.12.192.0 - 193.12.195.255 nl +193.12.196.0 - 193.12.227.255 se +193.12.228.0 - 193.12.231.255 nl +193.12.232.0 - 193.13.23.255 se +193.13.24.0 - 193.13.31.255 hr +193.13.32.0 - 193.13.43.255 se +193.13.44.0 - 193.13.51.255 nl +193.13.52.0 - 193.13.127.255 se +193.13.128.0 - 193.13.131.255 nl +193.13.132.0 - 193.13.151.255 se +193.13.152.0 - 193.13.159.255 nl +193.13.160.0 - 193.13.167.255 se +193.13.168.0 - 193.13.175.255 nl +193.13.176.0 - 193.13.183.255 se +193.13.184.0 - 193.13.187.255 nl +193.13.188.0 - 193.13.191.255 se +193.13.192.0 - 193.13.199.255 hr +193.13.200.0 - 193.13.215.255 se +193.13.216.0 - 193.13.219.255 nl +193.13.220.0 - 193.13.223.255 se +193.13.224.0 - 193.13.227.255 nl +193.13.228.0 - 193.13.231.255 se +193.13.232.0 - 193.13.239.255 hr +193.13.240.0 - 193.13.243.255 nl +193.13.244.0 - 193.13.251.255 se +193.13.252.0 - 193.13.255.255 nl +193.14.0.0 - 193.14.83.255 se +193.14.84.0 - 193.14.87.255 nl +193.14.88.0 - 193.14.183.255 se +193.14.184.0 - 193.14.191.255 hr +193.14.192.0 - 193.14.215.255 se +193.14.216.0 - 193.14.223.255 hr +193.14.224.0 - 193.14.239.255 se +193.14.240.0 - 193.14.247.255 hr +193.14.248.0 - 193.15.3.255 se +193.15.4.0 - 193.15.7.255 nl +193.15.8.0 - 193.15.31.255 se +193.15.32.0 - 193.15.39.255 hr +193.15.40.0 - 193.15.59.255 se +193.15.60.0 - 193.15.63.255 nl +193.15.64.0 - 193.15.79.255 se +193.15.80.0 - 193.15.83.255 nl +193.15.84.0 - 193.15.87.255 se +193.15.88.0 - 193.15.91.255 nl +193.15.92.0 - 193.15.127.255 se +193.15.128.0 - 193.15.135.255 hr +193.15.136.0 - 193.15.143.255 se +193.15.144.0 - 193.15.151.255 hr +193.15.152.0 - 193.15.159.255 se +193.15.160.0 - 193.15.167.255 hr +193.15.168.0 - 193.15.255.255 se +193.16.0.0 - 193.16.31.255 de 193.16.43.0 - 193.16.43.255 es 193.16.44.0 - 193.16.44.255 ch -193.16.45.0 - 193.16.47.255 ua +193.16.45.0 - 193.16.45.255 ua +193.16.46.0 - 193.16.46.255 hu +193.16.47.0 - 193.16.47.255 ua 193.16.48.0 - 193.16.95.255 de -193.16.96.0 - 193.16.96.255 mt -193.16.98.0 - 193.16.98.255 de +193.16.96.0 - 193.16.96.255 gb +193.16.97.0 - 193.16.97.255 de +193.16.98.0 - 193.16.98.255 ru 193.16.99.0 - 193.16.99.255 pl 193.16.100.0 - 193.16.100.255 nl 193.16.101.0 - 193.16.101.255 ua @@ -89185,14 +79834,11 @@ 193.16.103.0 - 193.16.103.255 pt 193.16.104.0 - 193.16.104.255 cz 193.16.105.0 - 193.16.105.255 ua -193.16.106.0 - 193.16.106.255 ru 193.16.107.0 - 193.16.107.255 pl 193.16.108.0 - 193.16.108.255 gb 193.16.109.0 - 193.16.109.255 si -193.16.110.0 - 193.16.110.255 fr 193.16.111.0 - 193.16.111.255 md 193.16.112.0 - 193.16.143.255 de -193.16.144.0 - 193.16.145.255 gb 193.16.146.0 - 193.16.146.255 dk 193.16.147.0 - 193.16.147.255 il 193.16.148.0 - 193.16.148.255 ro @@ -89202,7 +79848,6 @@ 193.16.153.0 - 193.16.153.255 es 193.16.154.0 - 193.16.154.255 nl 193.16.155.0 - 193.16.155.255 at -193.16.156.0 - 193.16.156.255 fr 193.16.157.0 - 193.16.157.255 bg 193.16.158.0 - 193.16.158.255 ua 193.16.159.0 - 193.16.159.255 fr @@ -89210,23 +79855,22 @@ 193.16.208.0 - 193.16.210.255 ru 193.16.211.0 - 193.16.211.255 ch 193.16.212.0 - 193.16.212.255 de -193.16.213.0 - 193.16.213.255 ro 193.16.214.0 - 193.16.215.255 at 193.16.216.0 - 193.16.216.255 es 193.16.217.0 - 193.16.217.255 ch 193.16.218.0 - 193.16.218.255 ro 193.16.219.0 - 193.16.219.255 gr 193.16.220.0 - 193.16.220.255 ch -193.16.221.0 - 193.16.221.255 ro 193.16.222.0 - 193.16.228.255 de 193.16.229.0 - 193.16.229.255 pl 193.16.230.0 - 193.16.231.255 de +193.16.232.0 - 193.16.232.255 ru 193.16.233.0 - 193.16.233.255 ua 193.16.234.0 - 193.16.234.255 nl -193.16.235.0 - 193.16.236.255 de +193.16.235.0 - 193.16.235.255 de 193.16.237.0 - 193.16.237.255 at 193.16.238.0 - 193.16.238.255 il -193.16.239.0 - 193.16.240.255 pl +193.16.240.0 - 193.16.240.255 pl 193.16.241.0 - 193.16.241.255 ch 193.16.242.0 - 193.16.242.255 at 193.16.243.0 - 193.16.243.255 es @@ -89238,33 +79882,31 @@ 193.16.255.0 - 193.16.255.255 pl 193.17.0.0 - 193.17.0.255 pt 193.17.1.0 - 193.17.1.255 si -193.17.2.0 - 193.17.11.255 de +193.17.2.0 - 193.17.2.255 de +193.17.8.0 - 193.17.11.255 de 193.17.12.0 - 193.17.12.255 gb 193.17.13.0 - 193.17.13.255 cz 193.17.14.0 - 193.17.14.255 pl -193.17.15.0 - 193.17.15.255 fr 193.17.16.0 - 193.17.18.255 de 193.17.19.0 - 193.17.19.255 fr -193.17.20.0 - 193.17.39.255 de -193.17.40.0 - 193.17.40.255 pt +193.17.20.0 - 193.17.27.255 de 193.17.41.0 - 193.17.41.255 pl 193.17.42.0 - 193.17.42.255 il 193.17.43.0 - 193.17.43.255 ru +193.17.44.0 - 193.17.44.255 ua 193.17.45.0 - 193.17.45.255 it 193.17.46.0 - 193.17.46.255 ua 193.17.47.0 - 193.17.47.255 cz 193.17.48.0 - 193.17.51.255 de 193.17.52.0 - 193.17.52.255 ru 193.17.53.0 - 193.17.53.255 jo -193.17.54.0 - 193.17.55.255 pl -193.17.56.0 - 193.17.63.255 de -193.17.64.0 - 193.17.64.255 ch +193.17.54.0 - 193.17.54.255 pl +193.17.60.0 - 193.17.63.255 de 193.17.65.0 - 193.17.65.255 gb 193.17.66.0 - 193.17.66.255 es 193.17.67.0 - 193.17.67.255 se 193.17.68.0 - 193.17.68.255 il 193.17.69.0 - 193.17.69.255 ua -193.17.70.0 - 193.17.70.255 ro 193.17.71.0 - 193.17.71.255 pl 193.17.72.0 - 193.17.72.255 se 193.17.73.0 - 193.17.73.255 fr @@ -89274,32 +79916,32 @@ 193.17.77.0 - 193.17.77.255 de 193.17.78.0 - 193.17.78.255 md 193.17.79.0 - 193.17.79.255 li -193.17.80.0 - 193.17.83.255 de 193.17.84.0 - 193.17.84.255 pl 193.17.85.0 - 193.17.85.255 ch -193.17.86.0 - 193.17.127.255 de +193.17.88.0 - 193.17.95.255 de +193.17.96.0 - 193.17.111.255 us +193.17.112.0 - 193.17.119.255 de +193.17.120.0 - 193.17.127.255 sg 193.17.128.0 - 193.17.169.255 gb 193.17.170.0 - 193.17.170.255 ru 193.17.171.0 - 193.17.171.255 de 193.17.172.0 - 193.17.172.255 pl 193.17.173.0 - 193.17.173.255 by +193.17.174.0 - 193.17.174.255 pl 193.17.175.0 - 193.17.175.255 hu -193.17.176.0 - 193.17.178.255 de -193.17.179.0 - 193.17.179.255 be -193.17.180.0 - 193.17.183.255 de +193.17.178.0 - 193.17.178.255 de 193.17.184.0 - 193.17.184.255 pl 193.17.185.0 - 193.17.186.255 de 193.17.187.0 - 193.17.187.255 gb -193.17.188.0 - 193.17.188.255 dk -193.17.189.0 - 193.17.191.255 de 193.17.192.0 - 193.17.192.255 fr -193.17.193.0 - 193.17.193.255 de 193.17.194.0 - 193.17.194.255 ch 193.17.195.0 - 193.17.195.255 ro 193.17.196.0 - 193.17.196.255 fr 193.17.197.0 - 193.17.197.255 de 193.17.198.0 - 193.17.198.255 fr -193.17.199.0 - 193.17.201.255 ch +193.17.199.0 - 193.17.199.255 ch +193.17.200.0 - 193.17.200.255 pl +193.17.201.0 - 193.17.201.255 ch 193.17.202.0 - 193.17.202.255 se 193.17.203.0 - 193.17.203.255 pl 193.17.204.0 - 193.17.205.255 de @@ -89312,30 +79954,26 @@ 193.17.212.0 - 193.17.212.255 pl 193.17.213.0 - 193.17.213.255 ua 193.17.214.0 - 193.17.214.255 pl -193.17.215.0 - 193.17.215.255 cm 193.17.216.0 - 193.17.217.255 ua 193.17.218.0 - 193.17.218.255 se 193.17.219.0 - 193.17.219.255 de -193.17.220.0 - 193.17.220.255 ro 193.17.221.0 - 193.17.221.255 de 193.17.222.0 - 193.17.222.255 at 193.17.223.0 - 193.17.223.255 pl -193.17.224.0 - 193.17.224.255 de 193.17.225.0 - 193.17.225.255 ro 193.17.226.0 - 193.17.226.255 gb 193.17.227.0 - 193.17.227.255 si -193.17.228.0 - 193.17.228.255 ua 193.17.229.0 - 193.17.229.255 bg 193.17.230.0 - 193.17.230.255 de -193.17.231.0 - 193.17.231.255 fi 193.17.232.0 - 193.17.247.255 de 193.17.248.0 - 193.17.251.255 cz 193.17.252.0 - 193.17.252.255 at -193.17.253.0 - 193.17.253.255 ua -193.17.254.0 - 193.19.63.255 de +193.17.254.0 - 193.17.254.255 de +193.18.0.0 - 193.18.91.255 de +193.18.92.0 - 193.18.92.255 us +193.18.93.0 - 193.19.63.255 de 193.19.64.0 - 193.19.65.255 no 193.19.66.0 - 193.19.71.255 ru -193.19.72.0 - 193.19.73.255 pl 193.19.74.0 - 193.19.75.255 ua 193.19.76.0 - 193.19.77.255 fr 193.19.78.0 - 193.19.79.255 de @@ -89346,26 +79984,22 @@ 193.19.90.0 - 193.19.91.255 sa 193.19.92.0 - 193.19.93.255 at 193.19.94.0 - 193.19.95.255 ch -193.19.96.0 - 193.19.97.255 ua 193.19.98.0 - 193.19.99.255 gb 193.19.100.0 - 193.19.101.255 ua 193.19.102.0 - 193.19.103.255 ru 193.19.104.0 - 193.19.105.255 pl -193.19.106.0 - 193.19.107.255 ro 193.19.108.0 - 193.19.111.255 ua 193.19.112.0 - 193.19.113.255 lu 193.19.114.0 - 193.19.115.255 de -193.19.116.0 - 193.19.117.255 ru -193.19.118.0 - 193.19.119.255 ua -193.19.120.0 - 193.19.121.255 ru +193.19.116.0 - 193.19.121.255 ru 193.19.122.0 - 193.19.125.255 pl 193.19.126.0 - 193.19.127.255 ru -193.19.128.0 - 193.19.131.255 ir -193.19.132.0 - 193.19.135.255 ua +193.19.132.0 - 193.19.135.255 ru 193.19.136.0 - 193.19.139.255 fi 193.19.140.0 - 193.19.143.255 pl -193.19.144.0 - 193.19.147.255 ua -193.19.148.0 - 193.19.151.255 kw +193.19.144.0 - 193.19.145.255 ir +193.19.146.0 - 193.19.146.255 se +193.19.147.0 - 193.19.147.255 bg 193.19.152.0 - 193.19.155.255 ua 193.19.156.0 - 193.19.159.255 gb 193.19.160.0 - 193.19.163.255 de @@ -89375,38 +80009,34 @@ 193.19.176.0 - 193.19.179.255 cz 193.19.180.0 - 193.19.183.255 de 193.19.184.0 - 193.19.187.255 ua -193.19.188.0 - 193.19.191.255 sa +193.19.188.0 - 193.19.191.255 gb 193.19.192.0 - 193.19.195.255 ro 193.19.196.0 - 193.19.199.255 gb -193.19.200.0 - 193.19.207.255 ua 193.19.208.0 - 193.19.211.255 fr 193.19.212.0 - 193.19.215.255 pl 193.19.216.0 - 193.19.219.255 fr -193.19.220.0 - 193.19.223.255 si +193.19.220.0 - 193.19.223.255 hr 193.19.224.0 - 193.19.227.255 nl 193.19.228.0 - 193.19.231.255 ua 193.19.232.0 - 193.19.235.255 eg 193.19.236.0 - 193.19.239.255 de -193.19.240.0 - 193.19.247.255 ua -193.19.248.0 - 193.19.251.255 fr -193.19.252.0 - 193.19.255.255 ua +193.19.240.0 - 193.19.255.255 ua 193.20.0.0 - 193.22.4.255 de 193.22.5.0 - 193.22.5.255 pl 193.22.6.0 - 193.22.6.255 ru 193.22.7.0 - 193.22.7.255 fr -193.22.8.0 - 193.22.27.255 de +193.22.8.0 - 193.22.11.255 de +193.22.16.0 - 193.22.19.255 de 193.22.28.0 - 193.22.28.255 pl 193.22.29.0 - 193.22.29.255 de 193.22.30.0 - 193.22.30.255 cy 193.22.31.0 - 193.22.31.255 hr 193.22.32.0 - 193.22.79.255 de -193.22.80.0 - 193.22.80.255 il 193.22.81.0 - 193.22.81.255 pl 193.22.82.0 - 193.22.82.255 at 193.22.83.0 - 193.22.83.255 pl 193.22.84.0 - 193.22.84.255 ua 193.22.85.0 - 193.22.85.255 at -193.22.86.0 - 193.22.86.255 fi 193.22.87.0 - 193.22.87.255 gb 193.22.88.0 - 193.22.88.255 ru 193.22.89.0 - 193.22.89.255 gb @@ -89416,58 +80046,52 @@ 193.22.93.0 - 193.22.93.255 ro 193.22.94.0 - 193.22.94.255 no 193.22.95.0 - 193.22.95.255 ro -193.22.96.0 - 193.22.101.255 de +193.22.100.0 - 193.22.101.255 de 193.22.102.0 - 193.22.102.255 ch 193.22.103.0 - 193.22.103.255 bg -193.22.104.0 - 193.22.106.255 de 193.22.107.0 - 193.22.107.255 fr 193.22.108.0 - 193.22.118.255 de 193.22.119.0 - 193.22.119.255 es -193.22.120.0 - 193.22.137.255 de -193.22.138.0 - 193.22.138.255 ua -193.22.139.0 - 193.22.139.255 fr +193.22.120.0 - 193.22.127.255 de 193.22.140.0 - 193.22.140.255 ua -193.22.141.0 - 193.22.141.255 ro 193.22.142.0 - 193.22.142.255 ch 193.22.143.0 - 193.22.143.255 fr -193.22.144.0 - 193.22.164.255 de +193.22.160.0 - 193.22.164.255 de 193.22.165.0 - 193.22.165.255 es 193.22.166.0 - 193.22.167.255 de -193.22.168.0 - 193.22.168.255 gb 193.22.169.0 - 193.22.169.255 pl -193.22.170.0 - 193.22.170.255 at 193.22.171.0 - 193.22.171.255 ch 193.22.172.0 - 193.22.172.255 kw 193.22.173.0 - 193.22.173.255 ro 193.22.174.0 - 193.22.174.255 de 193.22.175.0 - 193.22.175.255 pl -193.22.176.0 - 193.22.223.255 de -193.22.224.0 - 193.22.239.255 be -193.22.240.0 - 193.22.241.255 de +193.22.176.0 - 193.22.204.255 de +193.22.205.0 - 193.22.205.255 eu +193.22.206.0 - 193.22.223.255 de 193.22.242.0 - 193.22.242.255 ru -193.22.243.0 - 193.22.245.255 gb -193.22.246.0 - 193.22.247.255 de +193.22.243.0 - 193.22.243.255 gb +193.22.245.0 - 193.22.245.255 gb 193.22.248.0 - 193.22.248.255 bg 193.22.249.0 - 193.22.249.255 sa 193.22.250.0 - 193.22.250.255 no 193.22.251.0 - 193.22.251.255 de 193.22.252.0 - 193.22.252.255 pl -193.22.253.0 - 193.22.255.255 de -193.23.0.0 - 193.23.0.255 ua -193.23.1.0 - 193.23.47.255 de +193.22.253.0 - 193.22.253.255 de +193.22.254.0 - 193.22.254.255 ch +193.22.255.0 - 193.23.15.255 de +193.23.32.0 - 193.23.42.255 de +193.23.43.0 - 193.23.43.255 ap +193.23.44.0 - 193.23.45.255 de 193.23.48.0 - 193.23.48.255 pl 193.23.49.0 - 193.23.49.255 si -193.23.50.0 - 193.23.50.255 lt 193.23.51.0 - 193.23.51.255 pl 193.23.52.0 - 193.23.52.255 bg 193.23.53.0 - 193.23.53.255 ua 193.23.54.0 - 193.23.54.255 pl -193.23.55.0 - 193.23.55.255 se 193.23.56.0 - 193.23.56.255 de 193.23.57.0 - 193.23.57.255 se 193.23.58.0 - 193.23.58.255 ua 193.23.59.0 - 193.23.59.255 lt -193.23.60.0 - 193.23.60.255 ua 193.23.61.0 - 193.23.61.255 pl 193.23.62.0 - 193.23.62.255 si 193.23.63.0 - 193.23.63.255 pl @@ -89477,17 +80101,13 @@ 193.23.115.0 - 193.23.115.255 be 193.23.116.0 - 193.23.116.255 gb 193.23.117.0 - 193.23.117.255 se -193.23.118.0 - 193.23.118.255 gr 193.23.119.0 - 193.23.119.255 de 193.23.120.0 - 193.23.120.255 gb 193.23.121.0 - 193.23.121.255 fr 193.23.122.0 - 193.23.122.255 ua 193.23.123.0 - 193.23.123.255 fr 193.23.124.0 - 193.23.124.255 gb -193.23.125.0 - 193.23.125.255 pl -193.23.126.0 - 193.23.126.255 ru -193.23.127.0 - 193.23.127.255 fr -193.23.128.0 - 193.23.135.255 de +193.23.132.0 - 193.23.135.255 de 193.23.136.0 - 193.23.136.255 gb 193.23.137.0 - 193.23.137.255 si 193.23.138.0 - 193.23.139.255 hu @@ -89495,32 +80115,33 @@ 193.23.141.0 - 193.23.141.255 gb 193.23.142.0 - 193.23.142.255 ru 193.23.143.0 - 193.23.143.255 nl -193.23.144.0 - 193.23.155.255 de +193.23.148.0 - 193.23.155.255 de 193.23.156.0 - 193.23.156.255 tr 193.23.157.0 - 193.23.157.255 ua 193.23.158.0 - 193.23.158.255 fr 193.23.159.0 - 193.23.159.255 no 193.23.160.0 - 193.23.171.255 de 193.23.172.0 - 193.23.172.255 se -193.23.173.0 - 193.23.173.255 dk 193.23.174.0 - 193.23.174.255 pl 193.23.175.0 - 193.23.175.255 ua -193.23.176.0 - 193.23.179.255 de 193.23.180.0 - 193.23.180.255 sa 193.23.181.0 - 193.23.181.255 ua 193.23.182.0 - 193.23.182.255 hr 193.23.183.0 - 193.23.183.255 ua -193.23.184.0 - 193.23.223.255 de +193.23.184.0 - 193.23.214.255 de +193.23.215.0 - 193.23.215.255 us +193.23.216.0 - 193.23.223.255 de 193.23.224.0 - 193.23.224.255 gb 193.23.225.0 - 193.23.225.255 ua 193.23.226.0 - 193.23.226.255 de 193.23.227.0 - 193.23.227.255 fr 193.23.228.0 - 193.23.228.255 se 193.23.229.0 - 193.23.229.255 no -193.23.230.0 - 193.23.254.255 de +193.23.230.0 - 193.23.252.255 de +193.23.254.0 - 193.23.254.255 de 193.23.255.0 - 193.23.255.255 dk -193.24.0.0 - 193.24.0.255 ro -193.24.1.0 - 193.24.13.255 de +193.24.0.0 - 193.24.7.255 de +193.24.12.0 - 193.24.12.255 de 193.24.14.0 - 193.24.14.255 pl 193.24.15.0 - 193.24.23.255 de 193.24.24.0 - 193.24.24.255 pl @@ -89530,74 +80151,70 @@ 193.24.28.0 - 193.24.28.255 gb 193.24.29.0 - 193.24.29.255 it 193.24.30.0 - 193.24.30.255 ua -193.24.31.0 - 193.24.31.255 ro 193.24.32.0 - 193.24.63.255 de -193.24.64.0 - 193.24.71.255 fi +193.24.64.0 - 193.24.65.255 fi +193.24.66.0 - 193.24.66.255 us +193.24.67.0 - 193.24.67.255 fi +193.24.68.0 - 193.24.68.255 eu +193.24.69.0 - 193.24.71.255 fi 193.24.72.0 - 193.24.191.255 de 193.24.192.0 - 193.24.195.255 ch 193.24.196.0 - 193.24.199.255 ru 193.24.200.0 - 193.24.207.255 pl 193.24.208.0 - 193.24.211.255 de -193.24.212.0 - 193.24.215.255 fr 193.24.216.0 - 193.24.219.255 de 193.24.220.0 - 193.24.223.255 ua -193.24.224.0 - 193.24.227.255 de -193.24.228.0 - 193.24.231.255 fr -193.24.232.0 - 193.24.235.255 ru -193.24.236.0 - 193.24.239.255 de +193.24.224.0 - 193.24.239.255 de 193.24.240.0 - 193.24.243.255 bg 193.24.244.0 - 193.24.247.255 pl -193.24.248.0 - 193.24.251.255 si +193.24.248.0 - 193.24.249.255 si +193.24.250.0 - 193.24.250.255 cz +193.24.251.0 - 193.24.251.255 si 193.24.252.0 - 193.24.255.255 de 193.25.0.0 - 193.25.7.255 pl 193.25.8.0 - 193.25.15.255 ru -193.25.16.0 - 193.25.95.255 de -193.25.96.0 - 193.25.97.255 be +193.25.16.0 - 193.25.47.255 de +193.25.48.0 - 193.25.63.255 nl +193.25.64.0 - 193.25.95.255 de 193.25.98.0 - 193.25.99.255 at -193.25.100.0 - 193.25.101.255 se +193.25.100.0 - 193.25.101.255 de 193.25.102.0 - 193.25.103.255 ch -193.25.104.0 - 193.25.105.255 ro -193.25.106.0 - 193.25.107.255 ua -193.25.108.0 - 193.25.109.255 pl -193.25.110.0 - 193.25.113.255 ro +193.25.104.0 - 193.25.113.255 ro 193.25.114.0 - 193.25.115.255 de 193.25.116.0 - 193.25.117.255 gb 193.25.118.0 - 193.25.119.255 de 193.25.120.0 - 193.25.121.255 ua -193.25.122.0 - 193.25.123.255 de 193.25.124.0 - 193.25.125.255 tr 193.25.126.0 - 193.25.127.255 se 193.25.128.0 - 193.25.159.255 de 193.25.160.0 - 193.25.161.255 pl 193.25.162.0 - 193.25.163.255 bg 193.25.164.0 - 193.25.165.255 pt -193.25.166.0 - 193.25.169.255 pl -193.25.170.0 - 193.25.175.255 de +193.25.166.0 - 193.25.167.255 pl +193.25.168.0 - 193.25.175.255 de 193.25.176.0 - 193.25.177.255 ua 193.25.178.0 - 193.25.179.255 it 193.25.180.0 - 193.25.181.255 ua 193.25.182.0 - 193.25.183.255 de 193.25.184.0 - 193.25.185.255 pl -193.25.186.0 - 193.25.189.255 gb +193.25.186.0 - 193.25.187.255 gb 193.25.190.0 - 193.25.191.255 ru 193.25.192.0 - 193.25.192.255 es 193.25.193.0 - 193.25.193.255 pl -193.25.194.0 - 193.25.195.255 fr -193.25.196.0 - 193.25.196.255 it +193.25.195.0 - 193.25.195.255 fr 193.25.197.0 - 193.25.197.255 fr -193.25.198.0 - 193.25.198.255 eu +193.25.198.0 - 193.25.198.45 eu +193.25.198.46 - 193.25.198.46 gb +193.25.198.47 - 193.25.198.255 eu 193.25.199.0 - 193.25.199.255 at -193.25.200.0 - 193.25.219.255 de +193.25.200.0 - 193.25.215.255 de 193.25.220.0 - 193.25.220.255 hr 193.25.221.0 - 193.25.221.255 ru -193.25.222.0 - 193.25.223.255 pl -193.25.224.0 - 193.25.254.255 de -193.25.255.0 - 193.25.255.255 ua -193.26.0.0 - 193.26.0.255 ru +193.25.222.0 - 193.25.222.255 pl +193.25.224.0 - 193.25.255.255 de 193.26.1.0 - 193.26.1.255 nl -193.26.2.0 - 193.26.2.255 ru 193.26.3.0 - 193.26.3.255 ua -193.26.4.0 - 193.26.4.255 ch +193.26.4.0 - 193.26.4.255 gb 193.26.5.0 - 193.26.5.255 de 193.26.6.0 - 193.26.6.255 se 193.26.7.0 - 193.26.7.255 ro @@ -89605,17 +80222,13 @@ 193.26.9.0 - 193.26.9.255 nl 193.26.10.0 - 193.26.10.255 ro 193.26.11.0 - 193.26.11.255 fr -193.26.12.0 - 193.26.12.255 de 193.26.13.0 - 193.26.13.255 ua -193.26.14.0 - 193.26.14.255 bg 193.26.15.0 - 193.26.15.255 de 193.26.16.0 - 193.26.16.255 ru 193.26.17.0 - 193.26.17.255 se 193.26.18.0 - 193.26.18.255 by -193.26.19.0 - 193.26.19.255 fr +193.26.19.0 - 193.26.19.255 ru 193.26.20.0 - 193.26.20.255 ua -193.26.21.0 - 193.26.21.255 pl -193.26.22.0 - 193.26.22.255 de 193.26.23.0 - 193.26.23.255 gb 193.26.24.0 - 193.26.24.255 de 193.26.25.0 - 193.26.25.255 pl @@ -89633,51 +80246,43 @@ 193.26.130.0 - 193.26.130.255 ch 193.26.131.0 - 193.26.131.255 pl 193.26.132.0 - 193.26.132.255 dk -193.26.133.0 - 193.26.133.255 gb 193.26.134.0 - 193.26.134.255 ua 193.26.135.0 - 193.26.135.255 ru -193.26.136.0 - 193.26.207.255 de -193.26.208.0 - 193.26.208.255 ru +193.26.136.0 - 193.26.147.255 de +193.26.160.0 - 193.26.207.255 de 193.26.209.0 - 193.26.209.255 ua -193.26.210.0 - 193.26.211.255 pl -193.26.212.0 - 193.26.212.255 ru -193.26.213.0 - 193.26.213.255 gb 193.26.214.0 - 193.26.214.255 ru -193.26.215.0 - 193.26.215.255 pl 193.26.216.0 - 193.26.216.255 bg 193.26.217.0 - 193.26.217.255 ru 193.26.218.0 - 193.26.218.255 dk -193.26.219.0 - 193.26.219.255 ro 193.26.220.0 - 193.26.220.255 si 193.26.221.0 - 193.26.221.255 se -193.26.222.0 - 193.26.223.255 gb +193.26.222.0 - 193.26.222.255 gb 193.26.224.0 - 193.26.255.255 de 193.27.0.0 - 193.27.0.255 nl -193.27.1.0 - 193.27.1.255 gb +193.27.1.0 - 193.27.1.255 ie 193.27.2.0 - 193.27.3.255 dk 193.27.4.0 - 193.27.4.255 fr 193.27.5.0 - 193.27.6.255 pl 193.27.7.0 - 193.27.7.255 sa -193.27.8.0 - 193.27.8.255 pl 193.27.9.0 - 193.27.9.255 es -193.27.10.0 - 193.27.10.255 fr 193.27.11.0 - 193.27.11.255 pt -193.27.12.0 - 193.27.39.255 de +193.27.16.0 - 193.27.23.255 de 193.27.40.0 - 193.27.40.255 at 193.27.41.0 - 193.27.41.255 ru 193.27.42.0 - 193.27.42.255 gb 193.27.43.0 - 193.27.43.255 ch 193.27.44.0 - 193.27.44.255 dk -193.27.45.0 - 193.27.45.255 ch 193.27.46.0 - 193.27.46.255 de -193.27.47.0 - 193.27.47.255 fr +193.27.47.0 - 193.27.47.255 es 193.27.48.0 - 193.27.63.255 de -193.27.64.0 - 193.27.65.255 eu +193.27.64.0 - 193.27.64.63 gb +193.27.64.64 - 193.27.65.255 eu 193.27.66.0 - 193.27.67.255 de 193.27.68.0 - 193.27.69.255 fr 193.27.70.0 - 193.27.71.255 ro -193.27.72.0 - 193.27.73.255 lv -193.27.74.0 - 193.27.77.255 ch +193.27.72.0 - 193.27.73.255 nl +193.27.74.0 - 193.27.75.255 ch 193.27.78.0 - 193.27.79.255 fr 193.27.80.0 - 193.27.81.255 ua 193.27.82.0 - 193.27.83.255 pl @@ -89702,31 +80307,29 @@ 193.27.214.0 - 193.27.215.255 ru 193.27.216.0 - 193.27.217.255 dk 193.27.218.0 - 193.27.219.255 ch -193.27.220.0 - 193.27.221.255 de -193.27.222.0 - 193.27.225.255 ru +193.27.220.0 - 193.27.220.253 de +193.27.220.254 - 193.27.220.254 eu +193.27.220.255 - 193.27.221.255 de +193.27.222.0 - 193.27.223.255 ru 193.27.226.0 - 193.27.227.255 ch -193.27.228.0 - 193.27.229.255 se -193.27.230.0 - 193.27.233.255 ru -193.27.234.0 - 193.27.235.255 ua +193.27.230.0 - 193.27.231.255 ru 193.27.236.0 - 193.27.241.255 ru 193.27.242.0 - 193.27.243.255 ua 193.27.244.0 - 193.27.245.255 at -193.27.246.0 - 193.27.249.255 ru 193.27.250.0 - 193.27.251.255 dk 193.27.252.0 - 193.27.253.255 de 193.27.254.0 - 193.27.255.255 se 193.28.0.0 - 193.28.0.255 pl -193.28.1.0 - 193.28.5.255 de +193.28.5.0 - 193.28.5.255 de 193.28.6.0 - 193.28.6.255 ru -193.28.7.0 - 193.28.7.255 de 193.28.8.0 - 193.28.8.255 sk 193.28.9.0 - 193.28.10.255 sa 193.28.11.0 - 193.28.11.255 de 193.28.12.0 - 193.28.12.255 at 193.28.13.0 - 193.28.13.255 nl -193.28.14.0 - 193.28.41.255 de +193.28.15.0 - 193.28.35.255 de +193.28.40.0 - 193.28.41.255 de 193.28.42.0 - 193.28.42.255 ch -193.28.43.0 - 193.28.43.255 se 193.28.44.0 - 193.28.44.255 ru 193.28.45.0 - 193.28.45.255 gb 193.28.46.0 - 193.28.46.255 ru @@ -89737,19 +80340,15 @@ 193.28.86.0 - 193.28.86.255 hu 193.28.87.0 - 193.28.87.255 ca 193.28.88.0 - 193.28.88.255 de -193.28.89.0 - 193.28.89.255 gb -193.28.90.0 - 193.28.90.255 de -193.28.91.0 - 193.28.91.255 at +193.28.89.0 - 193.28.89.255 fi +193.28.90.0 - 193.28.91.255 de 193.28.92.0 - 193.28.92.255 ua -193.28.93.0 - 193.28.93.255 pl 193.28.94.0 - 193.28.94.255 sa 193.28.95.0 - 193.28.95.255 it 193.28.96.0 - 193.28.143.255 de -193.28.144.0 - 193.28.144.255 nl 193.28.145.0 - 193.28.145.255 de 193.28.146.0 - 193.28.146.255 si 193.28.147.0 - 193.28.147.255 dk -193.28.148.0 - 193.28.148.255 pl 193.28.149.0 - 193.28.149.255 dk 193.28.150.0 - 193.28.150.255 de 193.28.151.0 - 193.28.151.255 ro @@ -89760,13 +80359,14 @@ 193.28.156.0 - 193.28.156.255 ua 193.28.157.0 - 193.28.157.255 it 193.28.158.0 - 193.28.158.255 pl +193.28.159.0 - 193.28.159.255 se 193.28.160.0 - 193.28.175.255 de 193.28.176.0 - 193.28.176.255 gb 193.28.177.0 - 193.28.177.255 ua -193.28.178.0 - 193.28.179.255 gb +193.28.178.0 - 193.28.178.255 eu +193.28.179.0 - 193.28.179.255 cz 193.28.180.0 - 193.28.180.255 de -193.28.181.0 - 193.28.181.255 ir -193.28.182.0 - 193.28.182.255 gb +193.28.181.0 - 193.28.181.255 ru 193.28.183.0 - 193.28.183.255 fr 193.28.184.0 - 193.28.184.255 ua 193.28.185.0 - 193.28.185.255 ch @@ -89775,11 +80375,9 @@ 193.28.188.0 - 193.28.188.255 ch 193.28.189.0 - 193.28.189.255 pl 193.28.190.0 - 193.28.190.255 ru -193.28.191.0 - 193.28.191.255 fr 193.28.192.0 - 193.28.199.255 de 193.28.200.0 - 193.28.200.255 ua 193.28.201.0 - 193.28.201.255 gb -193.28.202.0 - 193.28.202.255 cz 193.28.203.0 - 193.28.203.255 fi 193.28.204.0 - 193.28.204.255 at 193.28.205.0 - 193.28.205.255 fr @@ -89789,8 +80387,7 @@ 193.28.225.0 - 193.28.225.255 tr 193.28.226.0 - 193.28.226.255 pl 193.28.227.0 - 193.28.227.255 dk -193.28.228.0 - 193.28.228.255 de -193.28.229.0 - 193.28.229.255 at +193.28.228.0 - 193.28.229.255 de 193.28.230.0 - 193.28.230.255 pl 193.28.231.0 - 193.28.231.255 hu 193.28.232.0 - 193.28.232.255 gb @@ -89798,21 +80395,19 @@ 193.28.234.0 - 193.28.234.255 ru 193.28.235.0 - 193.28.235.255 fr 193.28.236.0 - 193.28.236.255 no -193.28.237.0 - 193.28.237.255 gb 193.28.238.0 - 193.28.238.255 de 193.28.239.0 - 193.28.239.255 ru 193.28.240.0 - 193.28.249.255 de 193.28.250.0 - 193.28.250.255 bg 193.28.251.0 - 193.28.251.255 de -193.28.252.0 - 193.28.252.255 pl -193.28.253.0 - 193.28.253.255 ru 193.28.254.0 - 193.28.254.255 ee -193.28.255.0 - 193.28.255.255 gb 193.29.0.0 - 193.29.15.255 de 193.29.16.0 - 193.29.16.255 ua -193.29.17.0 - 193.29.38.255 de +193.29.19.0 - 193.29.19.255 ru +193.29.22.0 - 193.29.27.255 de +193.29.38.0 - 193.29.38.255 de 193.29.39.0 - 193.29.39.255 lt -193.29.40.0 - 193.29.47.255 de +193.29.43.0 - 193.29.43.255 de 193.29.48.0 - 193.29.48.255 pl 193.29.49.0 - 193.29.49.255 hu 193.29.50.0 - 193.29.50.255 sa @@ -89821,14 +80416,13 @@ 193.29.53.0 - 193.29.53.255 kz 193.29.54.0 - 193.29.54.255 de 193.29.55.0 - 193.29.55.255 bg -193.29.56.0 - 193.29.127.255 de -193.29.128.0 - 193.29.128.255 ua -193.29.129.0 - 193.29.129.255 fr -193.29.130.0 - 193.29.138.255 de +193.29.64.0 - 193.29.138.255 de 193.29.139.0 - 193.29.139.255 nl -193.29.140.0 - 193.29.186.255 de +193.29.140.0 - 193.29.176.255 de +193.29.186.0 - 193.29.186.255 de 193.29.187.0 - 193.29.187.255 at -193.29.188.0 - 193.29.199.255 de +193.29.188.0 - 193.29.188.255 de +193.29.192.0 - 193.29.199.255 de 193.29.200.0 - 193.29.200.255 ua 193.29.201.0 - 193.29.201.255 dk 193.29.202.0 - 193.29.202.255 es @@ -89841,20 +80435,24 @@ 193.29.221.0 - 193.29.221.255 be 193.29.222.0 - 193.29.222.255 fr 193.29.223.0 - 193.29.223.255 gb -193.29.224.0 - 193.29.254.255 de +193.29.224.0 - 193.29.247.255 de +193.29.250.0 - 193.29.250.255 de +193.29.252.0 - 193.29.253.255 de 193.29.255.0 - 193.29.255.255 pl 193.30.0.0 - 193.30.0.255 no -193.30.1.0 - 193.30.23.255 de +193.30.3.0 - 193.30.4.255 de +193.30.16.0 - 193.30.23.255 de 193.30.24.0 - 193.30.27.255 gb -193.30.28.0 - 193.30.38.255 de +193.30.28.0 - 193.30.28.255 ro +193.30.29.0 - 193.30.29.255 de +193.30.30.0 - 193.30.31.255 nl +193.30.36.0 - 193.30.38.255 de 193.30.39.0 - 193.30.39.255 ru -193.30.40.0 - 193.30.40.255 ua 193.30.41.0 - 193.30.41.255 gb 193.30.42.0 - 193.30.42.255 de -193.30.43.0 - 193.30.43.255 si -193.30.44.0 - 193.30.107.255 de +193.30.44.0 - 193.30.95.255 de +193.30.104.0 - 193.30.107.255 de 193.30.108.0 - 193.30.108.255 gb -193.30.109.0 - 193.30.109.255 pl 193.30.110.0 - 193.30.110.255 be 193.30.111.0 - 193.30.111.255 gb 193.30.112.0 - 193.30.140.255 de @@ -89864,43 +80462,78 @@ 193.30.144.0 - 193.30.159.255 de 193.30.160.0 - 193.30.160.255 pl 193.30.161.0 - 193.30.161.255 il -193.30.162.0 - 193.30.162.255 gb 193.30.163.0 - 193.30.163.255 at 193.30.164.0 - 193.30.164.255 hu -193.30.165.0 - 193.30.165.255 de -193.30.166.0 - 193.30.166.255 gb 193.30.167.0 - 193.30.167.255 ch 193.30.168.0 - 193.30.223.255 de 193.30.224.0 - 193.30.227.255 fr 193.30.228.0 - 193.30.231.255 bg -193.30.232.0 - 193.30.235.255 gb +193.30.232.0 - 193.30.232.0 gb +193.30.232.1 - 193.30.232.1 eu +193.30.232.2 - 193.30.235.255 gb 193.30.236.0 - 193.30.239.255 ru 193.30.240.0 - 193.30.247.255 ua 193.30.248.0 - 193.30.251.255 rs -193.30.252.0 - 193.30.255.255 de +193.30.252.0 - 193.30.252.255 gb +193.30.253.0 - 193.30.253.255 ua +193.30.254.0 - 193.30.255.255 gb 193.31.0.0 - 193.31.0.255 ru -193.31.1.0 - 193.31.13.255 de +193.31.1.0 - 193.31.3.255 de +193.31.7.0 - 193.31.11.255 de 193.31.14.0 - 193.31.14.255 at -193.31.15.0 - 193.31.15.255 dk -193.31.16.0 - 193.31.251.255 de +193.31.18.0 - 193.31.19.255 de +193.31.60.0 - 193.31.63.255 de +193.31.80.0 - 193.31.95.255 de +193.31.128.0 - 193.31.191.255 de +193.31.192.0 - 193.31.199.255 ru +193.31.200.0 - 193.31.207.255 kz +193.31.208.0 - 193.31.247.255 de 193.31.252.0 - 193.31.253.255 ch -193.31.254.0 - 193.31.255.255 de -193.32.0.0 - 193.32.11.255 gb +193.32.3.0 - 193.32.3.82 gb +193.32.3.83 - 193.32.3.83 eu +193.32.3.84 - 193.32.3.255 gb +193.32.6.0 - 193.32.7.255 gb +193.32.9.0 - 193.32.9.255 gb 193.32.12.0 - 193.32.15.255 ua -193.32.16.0 - 193.32.18.255 gb +193.32.17.0 - 193.32.18.255 gb 193.32.19.0 - 193.32.19.255 nl 193.32.20.0 - 193.32.20.255 ru 193.32.21.0 - 193.32.21.255 ua -193.32.22.0 - 193.32.35.255 gb +193.32.22.0 - 193.32.22.255 gb +193.32.24.0 - 193.32.27.255 gb +193.32.30.0 - 193.32.30.63 gb +193.32.30.64 - 193.32.30.79 eu +193.32.30.80 - 193.32.35.255 gb 193.32.36.0 - 193.32.37.255 pl -193.32.38.0 - 193.32.99.255 gb +193.32.38.0 - 193.32.49.255 gb +193.32.50.0 - 193.32.50.255 pl +193.32.51.0 - 193.32.51.255 at +193.32.52.0 - 193.32.52.255 lv +193.32.53.0 - 193.32.53.255 tr +193.32.54.0 - 193.32.54.255 ru +193.32.55.0 - 193.32.55.255 tr +193.32.56.0 - 193.32.56.255 cz +193.32.57.0 - 193.32.57.255 ua +193.32.58.0 - 193.32.58.255 ro +193.32.59.0 - 193.32.59.255 pl +193.32.60.0 - 193.32.63.255 ru +193.32.64.0 - 193.32.64.255 de +193.32.65.0 - 193.32.65.255 dk +193.32.66.0 - 193.32.67.255 gb +193.32.68.0 - 193.32.68.12 eu +193.32.68.13 - 193.32.68.13 ua +193.32.68.14 - 193.32.71.255 eu +193.32.72.0 - 193.32.79.255 es +193.32.80.0 - 193.32.81.255 ir +193.32.82.0 - 193.32.83.255 gb +193.32.88.0 - 193.32.91.255 gb 193.32.100.0 - 193.32.100.255 ro -193.32.101.0 - 193.32.101.255 ie -193.32.102.0 - 193.32.255.255 gb -193.33.0.0 - 193.33.1.255 it +193.32.101.0 - 193.32.101.255 gb +193.32.103.0 - 193.32.127.255 gb +193.32.248.0 - 193.32.255.255 gb +193.33.0.0 - 193.33.1.255 pl 193.33.2.0 - 193.33.3.255 es 193.33.4.0 - 193.33.5.255 pl -193.33.6.0 - 193.33.7.255 ro 193.33.8.0 - 193.33.9.255 pl 193.33.10.0 - 193.33.11.255 ru 193.33.12.0 - 193.33.13.255 fr @@ -89915,7 +80548,7 @@ 193.33.32.0 - 193.33.33.255 ro 193.33.34.0 - 193.33.35.255 pl 193.33.36.0 - 193.33.37.255 fr -193.33.38.0 - 193.33.41.255 ru +193.33.38.0 - 193.33.39.255 ru 193.33.42.0 - 193.33.43.255 pl 193.33.44.0 - 193.33.45.255 ua 193.33.46.0 - 193.33.47.255 fr @@ -89923,23 +80556,18 @@ 193.33.50.0 - 193.33.51.255 nl 193.33.52.0 - 193.33.53.255 be 193.33.54.0 - 193.33.55.255 ua -193.33.56.0 - 193.33.57.255 ro +193.33.56.0 - 193.33.57.255 fr 193.33.58.0 - 193.33.59.255 pl 193.33.60.0 - 193.33.61.255 nl 193.33.62.0 - 193.33.63.255 ru 193.33.64.0 - 193.33.65.255 ua -193.33.66.0 - 193.33.67.255 ro 193.33.68.0 - 193.33.69.255 ru -193.33.70.0 - 193.33.71.63 nl -193.33.71.64 - 193.33.71.95 cr -193.33.71.96 - 193.33.71.255 nl +193.33.70.0 - 193.33.71.255 nl 193.33.72.0 - 193.33.73.255 gb 193.33.74.0 - 193.33.75.255 ru 193.33.76.0 - 193.33.77.255 gb 193.33.78.0 - 193.33.79.255 fr -193.33.80.0 - 193.33.85.255 ru -193.33.86.0 - 193.33.87.255 ua -193.33.88.0 - 193.33.89.255 ru +193.33.80.0 - 193.33.89.255 ru 193.33.90.0 - 193.33.91.255 ro 193.33.92.0 - 193.33.93.255 md 193.33.94.0 - 193.33.95.255 ro @@ -89948,10 +80576,8 @@ 193.33.100.0 - 193.33.101.255 ru 193.33.102.0 - 193.33.103.255 ae 193.33.104.0 - 193.33.105.255 ua -193.33.106.0 - 193.33.107.255 ro 193.33.108.0 - 193.33.109.255 gb 193.33.110.0 - 193.33.111.255 pl -193.33.112.0 - 193.33.113.255 gb 193.33.114.0 - 193.33.115.255 at 193.33.116.0 - 193.33.117.255 gb 193.33.118.0 - 193.33.119.255 ro @@ -89959,12 +80585,9 @@ 193.33.124.0 - 193.33.125.255 pl 193.33.126.0 - 193.33.127.255 cz 193.33.128.0 - 193.33.129.255 ch -193.33.130.0 - 193.33.131.255 ro -193.33.132.0 - 193.33.133.255 hu +193.33.132.0 - 193.33.133.255 ru 193.33.134.0 - 193.33.135.255 nl -193.33.136.0 - 193.33.137.255 ro 193.33.138.0 - 193.33.139.255 gb -193.33.140.0 - 193.33.141.255 ro 193.33.142.0 - 193.33.143.255 ch 193.33.144.0 - 193.33.145.255 ru 193.33.146.0 - 193.33.147.255 gb @@ -89975,9 +80598,8 @@ 193.33.156.0 - 193.33.157.255 gb 193.33.158.0 - 193.33.159.255 de 193.33.160.0 - 193.33.161.255 ru -193.33.162.0 - 193.33.165.255 ro -193.33.166.0 - 193.33.167.255 ru -193.33.168.0 - 193.33.169.255 fr +193.33.166.0 - 193.33.166.255 ru +193.33.167.0 - 193.33.169.255 fr 193.33.170.0 - 193.33.171.255 gb 193.33.172.0 - 193.33.173.255 ae 193.33.174.0 - 193.33.177.255 pl @@ -89993,7 +80615,6 @@ 193.33.198.0 - 193.33.199.255 gb 193.33.200.0 - 193.33.201.255 ro 193.33.202.0 - 193.33.203.255 ua -193.33.204.0 - 193.33.205.255 ru 193.33.206.0 - 193.33.207.255 ua 193.33.208.0 - 193.33.209.255 nl 193.33.210.0 - 193.33.211.255 at @@ -90010,11 +80631,11 @@ 193.33.234.0 - 193.33.235.255 il 193.33.236.0 - 193.33.237.255 ua 193.33.238.0 - 193.33.239.255 ch -193.33.240.0 - 193.33.243.255 ru +193.33.240.0 - 193.33.241.255 ru 193.33.244.0 - 193.33.245.255 gb 193.33.246.0 - 193.33.247.255 se 193.33.248.0 - 193.33.249.255 gb -193.33.250.0 - 193.33.253.255 ro +193.33.250.0 - 193.33.251.255 ro 193.33.254.0 - 193.33.255.255 gb 193.34.0.0 - 193.34.3.255 pl 193.34.4.0 - 193.34.7.255 nl @@ -90024,20 +80645,23 @@ 193.34.24.0 - 193.34.31.255 de 193.34.32.0 - 193.34.35.255 fr 193.34.36.0 - 193.34.39.255 us -193.34.40.0 - 193.34.43.255 fi +193.34.40.0 - 193.34.40.255 eu +193.34.41.0 - 193.34.43.255 fi 193.34.44.0 - 193.34.47.255 pl -193.34.48.0 - 193.34.51.255 de +193.34.48.0 - 193.34.49.255 gb +193.34.50.0 - 193.34.51.255 de 193.34.52.0 - 193.34.55.255 pl 193.34.56.0 - 193.34.59.255 il 193.34.60.0 - 193.34.63.255 ua 193.34.64.0 - 193.34.67.255 rs 193.34.68.0 - 193.34.71.255 de -193.34.72.0 - 193.34.79.255 ua +193.34.72.0 - 193.34.75.255 ua 193.34.80.0 - 193.34.83.255 ie 193.34.84.0 - 193.34.87.255 lt 193.34.88.0 - 193.34.91.255 be 193.34.92.0 - 193.34.99.255 ua -193.34.100.0 - 193.34.103.255 de +193.34.100.0 - 193.34.100.255 eu +193.34.101.0 - 193.34.103.255 de 193.34.104.0 - 193.34.107.255 fo 193.34.108.0 - 193.34.111.255 ro 193.34.112.0 - 193.34.115.255 pl @@ -90072,24 +80696,21 @@ 193.34.184.0 - 193.34.185.255 ru 193.34.186.0 - 193.34.187.255 gb 193.34.188.0 - 193.34.189.255 ch -193.34.190.0 - 193.34.191.255 eu +193.34.190.0 - 193.34.191.255 ru 193.34.192.0 - 193.34.192.127 de +193.34.192.128 - 193.34.192.255 se 193.34.193.0 - 193.34.193.127 pl -193.34.193.128 - 193.34.193.255 ua -193.34.194.0 - 193.34.194.127 gb -193.34.194.128 - 193.34.194.255 ru 193.34.195.0 - 193.34.195.127 gb 193.34.195.128 - 193.34.196.127 pl -193.34.196.128 - 193.34.196.255 fr 193.34.197.0 - 193.34.197.127 pl -193.34.197.128 - 193.34.197.255 ir +193.34.197.128 - 193.34.197.255 fr 193.34.198.0 - 193.34.198.127 jo 193.34.198.128 - 193.34.198.255 pl 193.34.199.0 - 193.34.199.127 nl +193.34.199.128 - 193.34.199.255 no 193.34.200.0 - 193.34.200.127 de 193.34.200.128 - 193.34.200.255 ua 193.34.201.0 - 193.34.201.127 ro -193.34.201.128 - 193.34.201.255 ru 193.34.202.0 - 193.34.202.255 se 193.34.203.0 - 193.34.203.127 ua 193.34.203.128 - 193.34.204.255 pl @@ -90102,12 +80723,28 @@ 193.34.220.0 - 193.34.223.255 pl 193.34.224.0 - 193.34.255.255 gb 193.35.0.0 - 193.35.0.255 ro -193.35.1.0 - 193.35.24.255 gb +193.35.8.0 - 193.35.15.255 gb 193.35.25.0 - 193.35.25.255 ua -193.35.26.0 - 193.35.95.255 gb -193.35.96.0 - 193.35.98.255 ru +193.35.32.0 - 193.35.35.255 ru +193.35.36.0 - 193.35.36.255 pl +193.35.37.0 - 193.35.37.255 eu +193.35.38.0 - 193.35.39.255 ru +193.35.40.0 - 193.35.40.255 bg +193.35.41.0 - 193.35.41.255 pl +193.35.42.0 - 193.35.43.255 ru +193.35.44.0 - 193.35.45.255 es +193.35.46.0 - 193.35.46.255 bg +193.35.47.0 - 193.35.47.255 pl +193.35.48.0 - 193.35.51.255 ru +193.35.52.0 - 193.35.55.255 no +193.35.56.0 - 193.35.59.255 gb +193.35.60.0 - 193.35.60.255 pl +193.35.62.0 - 193.35.62.255 ir +193.35.63.0 - 193.35.63.255 ru +193.35.64.0 - 193.35.79.255 gb +193.35.96.0 - 193.35.97.255 ru 193.35.99.0 - 193.35.99.255 pl -193.35.100.0 - 193.35.101.255 ru +193.35.100.0 - 193.35.100.255 ru 193.35.102.0 - 193.35.107.255 cz 193.35.108.0 - 193.35.108.255 ro 193.35.109.0 - 193.35.109.255 ru @@ -90115,7 +80752,9 @@ 193.35.111.0 - 193.35.111.255 si 193.35.112.0 - 193.35.255.255 gb 193.36.0.0 - 193.36.0.255 tr -193.36.1.0 - 193.36.31.255 gb +193.36.1.0 - 193.36.1.255 de +193.36.2.0 - 193.36.2.255 gb +193.36.4.0 - 193.36.31.255 gb 193.36.32.0 - 193.36.32.255 ch 193.36.33.0 - 193.36.33.255 de 193.36.34.0 - 193.36.34.255 gb @@ -90130,32 +80769,31 @@ 193.36.44.0 - 193.36.44.255 ro 193.36.45.0 - 193.36.45.255 fr 193.36.46.0 - 193.36.46.255 de -193.36.47.0 - 193.36.175.255 gb +193.36.47.0 - 193.36.47.255 gb +193.36.64.0 - 193.36.175.255 gb 193.36.176.0 - 193.36.176.255 il 193.36.177.0 - 193.36.177.255 nl 193.36.178.0 - 193.36.178.255 no -193.36.179.0 - 193.36.179.255 nl -193.36.180.0 - 193.36.180.255 de -193.36.181.0 - 193.36.181.255 ch 193.36.182.0 - 193.36.182.255 fr 193.36.183.0 - 193.36.183.255 pl 193.36.184.0 - 193.36.184.255 tr -193.36.185.0 - 193.36.185.255 gb 193.36.186.0 - 193.36.186.255 nl 193.36.187.0 - 193.36.188.255 de 193.36.189.0 - 193.36.189.255 at 193.36.190.0 - 193.36.190.255 pt 193.36.191.0 - 193.36.191.255 no -193.36.192.0 - 193.36.225.255 gb +193.36.192.0 - 193.36.223.255 ro 193.36.226.0 - 193.36.226.255 at -193.36.227.0 - 193.36.227.255 de -193.36.228.0 - 193.36.228.255 ro 193.36.229.0 - 193.36.229.255 nl -193.36.230.0 - 193.37.127.255 gb +193.36.230.0 - 193.36.230.255 gb +193.36.240.0 - 193.37.31.255 gb +193.37.35.0 - 193.37.35.255 gb +193.37.36.0 - 193.37.39.255 de +193.37.64.0 - 193.37.127.255 gb 193.37.128.0 - 193.37.130.255 il 193.37.131.0 - 193.37.132.255 de 193.37.133.0 - 193.37.133.255 ua -193.37.134.0 - 193.37.134.255 eu +193.37.134.0 - 193.37.134.255 ru 193.37.135.0 - 193.37.135.255 tr 193.37.136.0 - 193.37.136.255 ro 193.37.137.0 - 193.37.137.255 ru @@ -90173,19 +80811,22 @@ 193.37.151.0 - 193.37.152.255 de 193.37.153.0 - 193.37.153.255 pt 193.37.154.0 - 193.37.154.255 tr -193.37.155.0 - 193.37.155.255 nl 193.37.156.0 - 193.37.156.255 ua 193.37.157.0 - 193.37.157.255 ru -193.37.158.0 - 193.37.158.255 gb +193.37.158.0 - 193.37.158.255 de 193.37.159.0 - 193.37.159.255 ch -193.37.160.0 - 193.37.235.255 gb +193.37.160.0 - 193.37.191.255 gb +193.37.224.0 - 193.37.231.255 gb 193.37.236.0 - 193.37.236.255 ch 193.37.237.0 - 193.37.237.255 gb 193.37.238.0 - 193.37.238.255 bg 193.37.239.0 - 193.37.239.255 nl -193.37.240.0 - 193.38.47.255 gb +193.37.240.0 - 193.37.247.255 gb +193.38.0.0 - 193.38.31.255 se 193.38.48.0 - 193.38.48.255 pl -193.38.49.0 - 193.39.65.255 gb +193.38.49.0 - 193.38.49.255 gb +193.38.52.0 - 193.38.52.255 gb +193.38.56.0 - 193.39.65.255 gb 193.39.66.0 - 193.39.66.255 ro 193.39.67.0 - 193.39.67.255 gb 193.39.68.0 - 193.39.68.255 de @@ -90198,23 +80839,27 @@ 193.39.75.0 - 193.39.77.255 ua 193.39.78.0 - 193.39.78.255 ru 193.39.79.0 - 193.39.79.255 il -193.39.80.0 - 193.39.111.255 gb +193.39.80.0 - 193.39.87.255 gb +193.39.96.0 - 193.39.111.255 gb 193.39.112.0 - 193.39.112.255 nl 193.39.113.0 - 193.39.113.255 ru 193.39.114.0 - 193.39.114.255 ua -193.39.115.0 - 193.39.115.255 us +193.39.115.0 - 193.39.115.255 de 193.39.116.0 - 193.39.116.255 ru 193.39.117.0 - 193.39.117.255 ro 193.39.118.0 - 193.39.118.255 ua 193.39.119.0 - 193.39.119.255 ro 193.39.120.0 - 193.39.135.255 se -193.39.136.0 - 193.39.138.255 gb +193.39.136.0 - 193.39.136.255 gb 193.39.139.0 - 193.39.139.255 dk -193.39.140.0 - 193.39.199.255 gb +193.39.140.0 - 193.39.141.255 gb +193.39.144.0 - 193.39.191.255 gb 193.39.200.0 - 193.39.207.255 de -193.39.208.0 - 193.39.247.255 gb +193.39.208.0 - 193.39.215.255 gb +193.39.224.0 - 193.39.239.255 gb +193.39.247.0 - 193.39.247.255 gb 193.39.248.0 - 193.39.249.255 ru -193.39.250.0 - 193.39.255.255 gb +193.39.251.0 - 193.39.251.255 gb 193.40.0.0 - 193.40.255.255 ee 193.41.0.0 - 193.41.1.255 gb 193.41.2.0 - 193.41.3.255 tr @@ -90225,52 +80870,39 @@ 193.41.14.0 - 193.41.15.255 es 193.41.16.0 - 193.41.23.255 be 193.41.24.0 - 193.41.31.255 es -193.41.32.0 - 193.41.32.255 se 193.41.33.0 - 193.41.33.255 lv -193.41.34.0 - 193.41.34.255 gb 193.41.35.0 - 193.41.36.255 si 193.41.37.0 - 193.41.37.255 de -193.41.38.0 - 193.41.38.255 ua -193.41.39.0 - 193.41.39.255 no 193.41.40.0 - 193.41.40.255 lt 193.41.41.0 - 193.41.41.255 at 193.41.42.0 - 193.41.42.255 be 193.41.43.0 - 193.41.43.255 es -193.41.44.0 - 193.41.44.255 fr +193.41.44.0 - 193.41.44.255 pl 193.41.45.0 - 193.41.45.255 lv 193.41.46.0 - 193.41.46.255 es -193.41.47.0 - 193.41.47.255 fr 193.41.48.0 - 193.41.51.255 ua -193.41.52.0 - 193.41.55.255 de 193.41.56.0 - 193.41.59.255 gr 193.41.60.0 - 193.41.63.255 ua 193.41.64.0 - 193.41.67.255 bg -193.41.68.0 - 193.41.70.255 nl 193.41.71.0 - 193.41.75.255 fr 193.41.76.0 - 193.41.79.255 ru 193.41.80.0 - 193.41.80.255 ua 193.41.81.0 - 193.41.81.255 lt -193.41.82.0 - 193.41.82.255 de 193.41.83.0 - 193.41.83.255 fr 193.41.84.0 - 193.41.85.255 it 193.41.86.0 - 193.41.86.255 ru -193.41.87.0 - 193.41.87.255 de 193.41.88.0 - 193.41.88.255 ua 193.41.89.0 - 193.41.89.255 si 193.41.90.0 - 193.41.90.255 ch -193.41.91.0 - 193.41.91.255 it -193.41.92.0 - 193.41.92.255 gb -193.41.93.0 - 193.41.93.255 de +193.41.93.0 - 193.41.93.255 ru 193.41.94.0 - 193.41.94.255 at 193.41.95.0 - 193.41.95.255 fr 193.41.96.0 - 193.41.103.255 gb 193.41.104.0 - 193.41.111.255 ch 193.41.112.0 - 193.41.113.255 pl -193.41.114.0 - 193.41.115.255 pt 193.41.116.0 - 193.41.117.255 de 193.41.118.0 - 193.41.119.255 se 193.41.120.0 - 193.41.121.255 de -193.41.122.0 - 193.41.123.255 ro 193.41.124.0 - 193.41.125.255 de 193.41.126.0 - 193.41.127.255 ro 193.41.128.0 - 193.41.131.255 ua @@ -90282,35 +80914,33 @@ 193.41.146.0 - 193.41.147.255 dz 193.41.148.0 - 193.41.149.255 ch 193.41.150.0 - 193.41.151.255 gr -193.41.152.0 - 193.41.155.255 gb +193.41.152.0 - 193.41.153.255 gb 193.41.156.0 - 193.41.157.255 dk 193.41.158.0 - 193.41.159.255 be 193.41.160.0 - 193.41.163.255 es 193.41.164.0 - 193.41.167.255 gb 193.41.168.0 - 193.41.171.255 se +193.41.172.0 - 193.41.175.255 pl 193.41.176.0 - 193.41.179.255 it 193.41.180.0 - 193.41.181.255 fr 193.41.182.0 - 193.41.183.255 bg 193.41.184.0 - 193.41.187.255 ua 193.41.188.0 - 193.41.191.255 bg -193.41.192.0 - 193.41.192.255 ua 193.41.193.0 - 193.41.193.255 ch 193.41.194.0 - 193.41.194.255 fr 193.41.195.0 - 193.41.195.255 lv -193.41.196.0 - 193.41.196.255 us +193.41.196.0 - 193.41.196.255 de 193.41.197.0 - 193.41.197.255 lt 193.41.198.0 - 193.41.198.255 it -193.41.199.0 - 193.41.200.255 de +193.41.200.0 - 193.41.200.255 de 193.41.201.0 - 193.41.201.255 at 193.41.202.0 - 193.41.202.255 il 193.41.203.0 - 193.41.203.255 ru -193.41.204.0 - 193.41.204.255 lv 193.41.205.0 - 193.41.205.255 it 193.41.206.0 - 193.41.206.255 ro 193.41.207.0 - 193.41.207.255 at 193.41.208.0 - 193.41.209.255 il 193.41.210.0 - 193.41.211.255 pl -193.41.212.0 - 193.41.213.255 de 193.41.214.0 - 193.41.215.255 se 193.41.216.0 - 193.41.217.255 ro 193.41.218.0 - 193.41.219.255 ua @@ -90318,7 +80948,6 @@ 193.41.222.0 - 193.41.223.255 fr 193.41.224.0 - 193.41.224.255 se 193.41.225.0 - 193.41.225.255 tr -193.41.226.0 - 193.41.226.255 ru 193.41.227.0 - 193.41.227.255 es 193.41.228.0 - 193.41.228.255 at 193.41.229.0 - 193.41.229.255 gr @@ -90327,14 +80956,14 @@ 193.41.233.0 - 193.41.233.255 be 193.41.234.0 - 193.41.234.255 es 193.41.235.0 - 193.41.236.255 it -193.41.237.0 - 193.41.237.255 lu 193.41.238.0 - 193.41.238.255 fr 193.41.239.0 - 193.41.239.255 ua 193.41.240.0 - 193.41.243.255 es 193.41.244.0 - 193.41.251.255 ro 193.41.252.0 - 193.41.255.255 de -193.42.0.0 - 193.42.0.255 ie -193.42.1.0 - 193.42.141.255 it +193.42.0.0 - 193.42.127.255 it +193.42.132.0 - 193.42.135.255 it +193.42.138.0 - 193.42.141.255 it 193.42.142.0 - 193.42.142.255 ru 193.42.143.0 - 193.42.143.255 es 193.42.144.0 - 193.42.144.255 gb @@ -90342,72 +80971,68 @@ 193.42.146.0 - 193.42.146.255 ch 193.42.147.0 - 193.42.147.255 pl 193.42.148.0 - 193.42.148.255 ua -193.42.149.0 - 193.42.149.255 ru 193.42.150.0 - 193.42.151.255 fr 193.42.152.0 - 193.42.152.255 gb 193.42.153.0 - 193.42.154.255 pl 193.42.155.0 - 193.42.155.255 de -193.42.156.0 - 193.42.156.255 bg -193.42.157.0 - 193.42.157.255 ua +193.42.156.0 - 193.42.156.255 ua +193.42.157.0 - 193.42.157.255 ru 193.42.158.0 - 193.42.158.255 ch 193.42.159.0 - 193.42.159.255 se 193.42.160.0 - 193.42.209.255 it -193.42.210.0 - 193.42.210.255 gb 193.42.211.0 - 193.42.211.255 pl 193.42.212.0 - 193.42.212.255 nl 193.42.213.0 - 193.42.213.255 fr -193.42.214.0 - 193.42.214.255 gr -193.42.215.0 - 193.42.215.255 sa +193.42.215.0 - 193.42.215.255 se 193.42.216.0 - 193.42.216.255 tr -193.42.217.0 - 193.42.217.255 gb 193.42.218.0 - 193.42.218.255 pl -193.42.219.0 - 193.42.219.255 fr 193.42.220.0 - 193.42.220.255 sa 193.42.221.0 - 193.42.221.255 de 193.42.222.0 - 193.42.222.255 hu 193.42.223.0 - 193.42.223.255 kw -193.42.224.0 - 193.42.227.255 it 193.42.228.0 - 193.42.231.255 pl -193.42.232.0 - 193.42.247.255 it -193.42.248.0 - 193.42.255.255 nl -193.43.0.64 - 193.43.0.95 ru -193.43.0.96 - 193.43.24.255 it +193.42.232.0 - 193.42.239.255 it +193.42.248.0 - 193.42.252.3 nl +193.42.252.4 - 193.42.252.4 eu +193.42.252.5 - 193.42.255.255 nl +193.43.0.0 - 193.43.0.63 fr +193.43.0.64 - 193.43.0.95 cy +193.43.0.96 - 193.43.0.127 gb +193.43.0.128 - 193.43.0.255 pl +193.43.1.0 - 193.43.7.255 it +193.43.12.0 - 193.43.13.255 pl +193.43.15.0 - 193.43.19.255 it +193.43.24.0 - 193.43.24.255 it 193.43.25.0 - 193.43.25.255 fr 193.43.26.0 - 193.43.26.255 bg 193.43.27.0 - 193.43.27.255 ch -193.43.28.0 - 193.43.28.255 it 193.43.29.0 - 193.43.29.255 de -193.43.30.0 - 193.43.63.255 it -193.43.64.0 - 193.43.64.255 gb -193.43.65.0 - 193.43.76.255 it +193.43.32.0 - 193.43.63.255 it +193.43.73.0 - 193.43.73.255 it +193.43.76.0 - 193.43.76.255 it 193.43.77.0 - 193.43.77.255 pl 193.43.78.0 - 193.43.78.255 ru -193.43.79.0 - 193.43.79.255 gb 193.43.80.0 - 193.43.87.255 it 193.43.88.0 - 193.43.89.255 nl 193.43.90.0 - 193.43.90.255 pl -193.43.91.0 - 193.43.92.255 nl +193.43.92.0 - 193.43.92.255 nl 193.43.93.0 - 193.43.93.255 ch -193.43.94.0 - 193.43.94.255 gb 193.43.95.0 - 193.43.95.255 ua -193.43.96.0 - 193.43.101.255 it +193.43.96.0 - 193.43.97.255 it +193.43.101.0 - 193.43.101.255 it 193.43.102.0 - 193.43.103.255 va 193.43.104.0 - 193.43.124.255 it 193.43.125.0 - 193.43.125.255 gb -193.43.126.0 - 193.43.126.255 it 193.43.127.0 - 193.43.127.255 ru 193.43.128.0 - 193.43.131.255 va 193.43.132.0 - 193.43.133.255 it -193.43.134.0 - 193.43.134.255 ru -193.43.135.0 - 193.43.143.255 it +193.43.136.0 - 193.43.143.255 it 193.43.144.0 - 193.43.144.255 pl -193.43.145.0 - 193.43.147.255 it 193.43.148.0 - 193.43.148.255 pl -193.43.149.0 - 193.43.149.255 it 193.43.150.0 - 193.43.150.255 nl 193.43.151.0 - 193.43.151.255 se 193.43.152.0 - 193.43.157.255 ch -193.43.158.0 - 193.43.159.255 at +193.43.158.0 - 193.43.158.255 at 193.43.160.0 - 193.43.179.255 it 193.43.180.0 - 193.43.180.255 ru 193.43.181.0 - 193.43.181.255 pl @@ -90415,11 +81040,11 @@ 193.43.183.0 - 193.43.183.255 ch 193.43.184.0 - 193.43.207.255 it 193.43.208.0 - 193.43.209.255 ru -193.43.210.0 - 193.43.211.255 cz +193.43.210.0 - 193.43.211.255 ua 193.43.212.0 - 193.43.213.255 at 193.43.214.0 - 193.43.215.255 fr 193.43.216.0 - 193.43.217.255 dk -193.43.218.0 - 193.43.219.255 gr +193.43.218.0 - 193.43.219.255 nl 193.43.220.0 - 193.43.221.255 de 193.43.222.0 - 193.43.227.255 ua 193.43.228.0 - 193.43.231.255 pl @@ -90428,34 +81053,28 @@ 193.43.240.0 - 193.43.243.255 pl 193.43.244.0 - 193.43.247.255 il 193.43.248.0 - 193.43.255.255 ua -193.44.0.0 - 193.45.1.7 se -193.45.1.8 - 193.45.1.15 ie -193.45.1.16 - 193.45.1.31 se -193.45.1.32 - 193.45.1.63 us -193.45.1.64 - 193.45.10.127 se +193.44.0.0 - 193.45.10.127 se 193.45.10.128 - 193.45.10.255 de 193.45.11.0 - 193.45.14.255 se 193.45.15.0 - 193.45.15.255 gb -193.45.16.0 - 193.45.38.255 se -193.45.39.0 - 193.45.39.7 fi -193.45.39.8 - 193.45.65.255 se -193.45.66.0 - 193.45.66.255 gb -193.45.67.0 - 193.45.141.255 se -193.45.142.0 - 193.45.142.7 pl -193.45.142.8 - 193.45.255.255 se -193.46.0.0 - 193.46.1.255 at -193.46.2.0 - 193.46.2.255 de -193.46.3.0 - 193.46.45.255 at +193.45.16.0 - 193.45.36.127 se +193.45.36.128 - 193.45.36.255 gb +193.45.37.0 - 193.45.255.255 se +193.46.1.0 - 193.46.1.255 at +193.46.2.0 - 193.46.2.255 ru +193.46.3.0 - 193.46.3.255 fr +193.46.4.0 - 193.46.19.255 at +193.46.40.0 - 193.46.45.255 at 193.46.46.0 - 193.46.46.255 ua 193.46.47.0 - 193.46.47.255 pl -193.46.48.0 - 193.46.59.255 at +193.46.48.0 - 193.46.55.255 at +193.46.58.0 - 193.46.59.255 at 193.46.60.0 - 193.46.60.255 ru 193.46.61.0 - 193.46.61.255 gb 193.46.62.0 - 193.46.63.255 de 193.46.64.0 - 193.46.64.255 il 193.46.65.0 - 193.46.65.255 ru 193.46.66.0 - 193.46.66.255 ua -193.46.67.0 - 193.46.67.255 de 193.46.68.0 - 193.46.68.255 pl 193.46.69.0 - 193.46.69.255 dk 193.46.70.0 - 193.46.70.255 ro @@ -90466,8 +81085,6 @@ 193.46.75.0 - 193.46.75.255 si 193.46.76.0 - 193.46.76.255 gb 193.46.77.0 - 193.46.77.255 ru -193.46.78.0 - 193.46.78.255 be -193.46.79.0 - 193.46.79.255 dk 193.46.80.0 - 193.46.80.255 nl 193.46.81.0 - 193.46.81.255 ua 193.46.82.0 - 193.46.82.255 de @@ -90479,15 +81096,14 @@ 193.46.89.0 - 193.46.89.255 ua 193.46.90.0 - 193.46.90.255 gb 193.46.91.0 - 193.46.91.255 ro -193.46.92.0 - 193.46.179.255 at +193.46.92.0 - 193.46.175.255 at 193.46.180.0 - 193.46.180.255 it 193.46.181.0 - 193.46.181.255 pl 193.46.182.0 - 193.46.182.255 de 193.46.183.0 - 193.46.183.255 gb 193.46.184.0 - 193.46.184.255 de 193.46.185.0 - 193.46.187.255 pl -193.46.188.0 - 193.46.199.255 at -193.46.200.0 - 193.46.200.255 gb +193.46.188.0 - 193.46.191.255 at 193.46.201.0 - 193.46.202.255 ua 193.46.203.0 - 193.46.203.255 fr 193.46.204.0 - 193.46.205.255 gb @@ -90495,28 +81111,25 @@ 193.46.207.0 - 193.46.208.255 ru 193.46.209.0 - 193.46.209.255 at 193.46.210.0 - 193.46.210.255 ua -193.46.211.0 - 193.46.211.255 ru +193.46.212.0 - 193.46.212.255 pl 193.46.213.0 - 193.46.213.255 ru -193.46.214.0 - 193.46.214.255 be 193.46.215.0 - 193.46.215.255 de -193.46.216.0 - 193.46.220.255 at 193.46.221.0 - 193.46.221.255 gb -193.46.222.0 - 193.46.231.255 at -193.46.232.0 - 193.46.232.255 gr -193.46.233.0 - 193.46.235.255 at +193.46.224.0 - 193.46.231.255 at +193.46.234.0 - 193.46.235.255 at 193.46.236.0 - 193.46.236.255 lv 193.46.237.0 - 193.46.237.255 pl 193.46.238.0 - 193.46.238.255 es 193.46.239.0 - 193.46.239.255 de -193.46.240.0 - 193.46.255.255 at +193.46.248.0 - 193.46.255.255 at 193.47.0.0 - 193.47.0.255 fr -193.47.1.0 - 193.47.69.255 ch -193.47.70.0 - 193.47.70.255 ua +193.47.1.0 - 193.47.7.255 ch +193.47.8.0 - 193.47.8.255 ap +193.47.9.0 - 193.47.31.255 ch 193.47.71.0 - 193.47.71.255 dk 193.47.72.0 - 193.47.72.255 ro 193.47.73.0 - 193.47.73.255 de 193.47.74.0 - 193.47.74.255 bg -193.47.75.0 - 193.47.75.255 ro 193.47.76.0 - 193.47.76.255 es 193.47.77.0 - 193.47.77.255 de 193.47.78.0 - 193.47.79.255 nl @@ -90526,7 +81139,6 @@ 193.47.83.0 - 193.47.83.255 gb 193.47.84.0 - 193.47.84.255 es 193.47.85.0 - 193.47.85.255 ua -193.47.86.0 - 193.47.86.255 es 193.47.87.0 - 193.47.87.255 ru 193.47.88.0 - 193.47.98.255 ch 193.47.99.0 - 193.47.100.255 de @@ -90540,13 +81152,13 @@ 193.47.140.0 - 193.47.140.255 ch 193.47.141.0 - 193.47.141.255 fr 193.47.142.0 - 193.47.142.255 dk -193.47.143.0 - 193.47.143.255 be +193.47.143.0 - 193.47.143.255 eu 193.47.144.0 - 193.47.144.255 ro +193.47.145.0 - 193.47.145.255 es 193.47.146.0 - 193.47.146.255 ru 193.47.147.0 - 193.47.147.255 gb 193.47.148.0 - 193.47.148.255 ru 193.47.149.0 - 193.47.149.255 ch -193.47.150.0 - 193.47.150.255 fr 193.47.151.0 - 193.47.151.255 pl 193.47.152.0 - 193.47.152.255 de 193.47.153.0 - 193.47.153.255 ch @@ -90556,7 +81168,7 @@ 193.47.161.0 - 193.47.161.255 de 193.47.162.0 - 193.47.162.255 ro 193.47.163.0 - 193.47.163.255 pl -193.47.164.0 - 193.47.164.255 es +193.47.164.0 - 193.47.164.255 gb 193.47.165.0 - 193.47.165.255 il 193.47.166.0 - 193.47.166.255 ua 193.47.167.0 - 193.47.167.255 se @@ -90566,60 +81178,71 @@ 193.47.186.0 - 193.47.186.255 dk 193.47.187.0 - 193.47.187.255 de 193.47.188.0 - 193.47.188.255 nl -193.47.189.0 - 193.47.189.255 fr +193.47.189.0 - 193.47.189.255 ua 193.47.190.0 - 193.47.190.255 ch 193.47.191.0 - 193.47.191.255 dk -193.47.192.0 - 193.47.245.255 ch +193.47.192.0 - 193.47.239.255 ch 193.47.246.0 - 193.47.246.255 hr 193.47.247.0 - 193.47.247.255 pl 193.47.248.0 - 193.47.248.255 il 193.47.249.0 - 193.47.249.255 ro 193.47.250.0 - 193.47.255.255 ch 193.48.0.0 - 193.52.255.255 fr -193.53.0.0 - 193.53.0.255 ch -193.53.1.0 - 193.53.21.255 be +193.53.3.0 - 193.53.4.255 be +193.53.6.0 - 193.53.6.255 gb +193.53.8.0 - 193.53.21.255 be 193.53.22.0 - 193.53.22.255 pt 193.53.23.0 - 193.53.23.255 de 193.53.24.0 - 193.53.33.255 se -193.53.34.0 - 193.53.35.255 be -193.53.36.0 - 193.53.36.255 gb -193.53.37.0 - 193.53.79.255 be +193.53.34.0 - 193.53.34.255 be +193.53.36.0 - 193.53.39.255 be +193.53.40.0 - 193.53.44.255 se +193.53.45.0 - 193.53.79.255 be 193.53.80.0 - 193.53.80.255 at -193.53.81.0 - 193.53.82.255 be 193.53.83.0 - 193.53.83.255 ua 193.53.84.0 - 193.53.84.255 se 193.53.85.0 - 193.53.85.255 dk 193.53.86.0 - 193.53.86.255 be -193.53.87.0 - 193.53.87.255 ro 193.53.88.0 - 193.53.88.255 no 193.53.89.0 - 193.53.89.255 ua -193.53.90.0 - 193.53.92.255 be +193.53.92.0 - 193.53.92.255 be 193.53.93.0 - 193.53.93.255 de 193.53.94.0 - 193.53.95.255 gb -193.53.96.0 - 193.53.98.255 be -193.53.99.0 - 193.53.100.255 eu -193.53.101.0 - 193.53.104.255 be -193.53.105.0 - 193.53.105.255 gr +193.53.99.0 - 193.53.99.0 gb +193.53.99.1 - 193.53.99.255 eu +193.53.100.0 - 193.53.100.0 gb +193.53.100.1 - 193.53.100.255 eu +193.53.101.0 - 193.53.102.255 be +193.53.106.0 - 193.53.106.255 rs 193.53.107.0 - 193.53.124.255 be 193.53.125.0 - 193.53.125.255 nl -193.53.126.0 - 193.53.254.255 be +193.53.128.0 - 193.53.248.255 be 193.53.255.0 - 193.53.255.255 pl -193.54.0.0 - 193.57.255.255 fr -193.58.0.0 - 193.58.0.39 gb -193.58.0.40 - 193.58.0.47 ru +193.54.0.0 - 193.56.63.255 fr +193.56.80.0 - 193.56.103.255 fr +193.56.106.0 - 193.56.106.255 se +193.56.108.0 - 193.56.191.255 fr +193.56.193.0 - 193.56.193.255 fr +193.56.202.0 - 193.56.202.255 ru +193.56.203.0 - 193.56.203.255 re +193.56.208.0 - 193.57.15.255 fr +193.57.20.0 - 193.57.20.255 de +193.57.24.0 - 193.57.27.255 fr +193.57.32.0 - 193.57.96.255 fr +193.57.97.0 - 193.57.97.255 de +193.57.104.0 - 193.57.255.255 fr +193.58.0.0 - 193.58.0.47 cy 193.58.0.48 - 193.58.0.55 eu 193.58.0.56 - 193.58.0.63 gb -193.58.0.64 - 193.58.0.127 pt +193.58.0.64 - 193.58.0.255 cy 193.58.1.0 - 193.58.63.255 be 193.58.64.0 - 193.58.69.255 gb 193.58.70.0 - 193.58.71.255 gr 193.58.72.0 - 193.58.79.255 cz -193.58.80.0 - 193.58.154.255 be +193.58.80.0 - 193.58.143.255 be +193.58.148.0 - 193.58.149.255 be 193.58.155.0 - 193.58.155.255 ch -193.58.156.0 - 193.58.172.255 be -193.58.173.0 - 193.58.185.255 ch -193.58.186.0 - 193.58.187.255 gr -193.58.188.0 - 193.58.191.255 gb +193.58.156.0 - 193.58.175.255 be 193.58.192.0 - 193.58.197.255 sk 193.58.198.0 - 193.58.199.255 gb 193.58.200.0 - 193.58.203.255 de @@ -90633,30 +81256,27 @@ 193.58.234.0 - 193.58.234.255 gr 193.58.235.0 - 193.58.235.255 gb 193.58.236.0 - 193.58.236.255 tr -193.58.237.0 - 193.58.237.255 ru 193.58.238.0 - 193.58.238.255 se 193.58.239.0 - 193.58.239.255 it -193.58.240.0 - 193.58.240.255 de 193.58.241.0 - 193.58.241.255 no 193.58.242.0 - 193.58.242.255 ch 193.58.243.0 - 193.58.243.255 ro 193.58.244.0 - 193.58.245.255 de 193.58.246.0 - 193.58.246.255 ua 193.58.247.0 - 193.58.247.255 fr -193.58.248.0 - 193.58.248.255 ua -193.58.249.0 - 193.58.249.255 pl 193.58.250.0 - 193.58.250.255 no 193.58.251.0 - 193.58.251.255 ru 193.58.252.0 - 193.58.252.255 hr 193.58.253.0 - 193.58.253.255 de -193.58.254.0 - 193.58.254.255 ua 193.58.255.0 - 193.58.255.255 by 193.59.0.0 - 193.59.255.255 pl 193.60.0.0 - 193.63.255.255 gb 193.64.0.0 - 193.66.255.255 fi -193.67.0.0 - 193.67.3.103 nl -193.67.3.104 - 193.67.3.111 de -193.67.3.112 - 193.67.255.255 nl +193.67.0.0 - 193.67.102.255 nl +193.67.103.0 - 193.67.103.255 eu +193.67.104.0 - 193.67.127.1 nl +193.67.127.2 - 193.67.127.2 eu +193.67.127.3 - 193.67.255.255 nl 193.68.0.0 - 193.68.31.255 bg 193.68.32.0 - 193.68.63.255 hu 193.68.64.0 - 193.68.95.255 lv @@ -90665,39 +81285,23 @@ 193.70.0.0 - 193.70.255.255 it 193.71.0.0 - 193.71.255.255 no 193.72.0.0 - 193.73.255.255 ch -193.74.0.0 - 193.74.229.255 be -193.74.230.0 - 193.74.231.255 nl -193.74.232.0 - 193.74.255.255 be +193.74.0.0 - 193.74.255.255 be 193.75.0.0 - 193.75.127.255 no 193.75.128.0 - 193.75.255.255 be 193.76.0.0 - 193.76.255.255 it 193.77.0.0 - 193.77.255.255 si -193.78.0.0 - 193.78.141.255 nl -193.78.142.0 - 193.78.142.255 it -193.78.143.0 - 193.79.143.183 nl -193.79.143.184 - 193.79.143.191 gb -193.79.143.192 - 193.79.170.63 nl -193.79.170.64 - 193.79.170.71 no -193.79.170.72 - 193.79.170.143 nl -193.79.170.144 - 193.79.170.151 pt -193.79.170.152 - 193.79.255.255 nl -193.80.0.0 - 193.80.203.255 at -193.80.204.0 - 193.80.204.255 si -193.80.205.0 - 193.81.255.255 at -193.82.0.0 - 193.82.254.255 gb -193.82.255.0 - 193.82.255.255 mt -193.83.0.0 - 193.83.7.199 at -193.83.7.200 - 193.83.7.215 nl -193.83.7.216 - 193.83.255.255 at +193.78.0.0 - 193.79.255.255 nl +193.80.0.0 - 193.81.255.255 at +193.82.0.0 - 193.82.255.255 gb +193.83.0.0 - 193.83.255.255 at 193.84.0.0 - 193.84.0.255 gb -193.84.1.0 - 193.84.7.255 cz +193.84.7.0 - 193.84.7.255 cz 193.84.8.0 - 193.84.8.255 ru 193.84.9.0 - 193.84.9.255 nl -193.84.10.0 - 193.84.15.255 cz -193.84.16.0 - 193.84.16.255 gb +193.84.10.0 - 193.84.10.255 cz +193.84.12.0 - 193.84.15.255 cz 193.84.17.0 - 193.84.17.255 ua 193.84.18.0 - 193.84.18.255 fr -193.84.19.0 - 193.84.19.255 ua 193.84.20.0 - 193.84.20.255 de 193.84.21.0 - 193.84.21.255 gr 193.84.22.0 - 193.84.23.255 ua @@ -90706,10 +81310,9 @@ 193.84.26.0 - 193.84.26.255 ie 193.84.27.0 - 193.84.27.255 dk 193.84.28.0 - 193.84.28.255 at -193.84.29.0 - 193.84.29.255 ch -193.84.30.0 - 193.84.30.255 de +193.84.29.0 - 193.84.29.255 pl 193.84.31.0 - 193.84.31.255 ru -193.84.32.0 - 193.84.49.255 cz +193.84.32.0 - 193.84.47.255 cz 193.84.50.0 - 193.84.50.255 ua 193.84.51.0 - 193.84.51.255 gb 193.84.52.0 - 193.84.52.255 at @@ -90722,55 +81325,43 @@ 193.84.67.0 - 193.84.67.255 nl 193.84.68.0 - 193.84.68.255 cz 193.84.69.0 - 193.84.69.255 ro -193.84.70.0 - 193.84.70.255 cz 193.84.71.0 - 193.84.71.255 pl 193.84.72.0 - 193.84.72.255 ua 193.84.73.0 - 193.84.73.255 fr -193.84.74.0 - 193.84.74.255 pl 193.84.75.0 - 193.84.75.255 se -193.84.76.0 - 193.84.77.255 ua -193.84.78.0 - 193.84.78.255 gb +193.84.76.0 - 193.84.76.255 ru +193.84.77.0 - 193.84.77.255 ua 193.84.79.0 - 193.84.79.255 pl 193.84.80.0 - 193.84.83.255 cz 193.84.84.0 - 193.84.84.255 be -193.84.85.0 - 193.84.85.255 gb 193.84.86.0 - 193.84.86.255 bg 193.84.87.0 - 193.84.87.255 gb -193.84.88.0 - 193.84.88.255 ru 193.84.89.0 - 193.84.89.255 fr -193.84.90.0 - 193.84.90.255 ua 193.84.91.0 - 193.84.91.255 de -193.84.92.0 - 193.84.93.255 cz 193.84.94.0 - 193.84.94.255 at 193.84.95.0 - 193.84.95.255 de 193.84.96.0 - 193.84.111.255 cz 193.84.112.0 - 193.84.112.255 at -193.84.113.0 - 193.84.113.255 ch -193.84.114.0 - 193.84.114.255 cz -193.84.115.0 - 193.84.115.255 ro -193.84.116.0 - 193.84.141.255 cz +193.84.116.0 - 193.84.117.255 cz +193.84.128.0 - 193.84.129.255 cz 193.84.142.0 - 193.84.142.255 gb -193.84.143.0 - 193.84.143.255 ch +193.84.143.0 - 193.84.143.255 nl 193.84.144.0 - 193.84.175.255 cz 193.84.176.0 - 193.84.176.255 nl 193.84.177.0 - 193.84.177.255 fr 193.84.178.0 - 193.84.178.255 de -193.84.179.0 - 193.84.179.255 pl -193.84.180.0 - 193.84.181.255 de +193.84.181.0 - 193.84.181.255 de 193.84.182.0 - 193.84.182.255 pl 193.84.183.0 - 193.84.183.255 md 193.84.184.0 - 193.84.184.255 lv 193.84.185.0 - 193.84.185.255 ro 193.84.186.0 - 193.84.186.255 cz -193.84.187.0 - 193.84.187.255 fr -193.84.188.0 - 193.84.223.255 cz +193.84.192.0 - 193.84.223.255 cz 193.84.224.0 - 193.84.239.255 gb -193.84.240.0 - 193.84.245.255 cz +193.84.245.0 - 193.84.245.255 cz 193.84.246.0 - 193.84.246.255 pl -193.84.247.0 - 193.84.249.255 cz -193.84.250.0 - 193.84.250.255 gb 193.84.251.0 - 193.84.251.255 gr -193.84.252.0 - 193.84.254.255 cz +193.84.252.0 - 193.84.252.255 cz 193.84.255.0 - 193.84.255.255 ru 193.85.0.0 - 193.86.255.255 cz 193.87.0.0 - 193.87.255.255 sk @@ -90784,12 +81375,10 @@ 193.91.128.0 - 193.91.255.255 no 193.92.0.0 - 193.92.255.255 gr 193.93.0.0 - 193.93.3.255 de -193.93.4.0 - 193.93.7.255 gb 193.93.8.0 - 193.93.11.255 fr 193.93.12.0 - 193.93.19.255 ua 193.93.20.0 - 193.93.23.255 ch 193.93.24.0 - 193.93.27.255 bg -193.93.28.0 - 193.93.31.255 de 193.93.32.0 - 193.93.39.255 gb 193.93.40.0 - 193.93.43.255 ro 193.93.44.0 - 193.93.47.255 gb @@ -90800,7 +81389,7 @@ 193.93.68.0 - 193.93.71.255 pl 193.93.72.0 - 193.93.75.255 sk 193.93.76.0 - 193.93.79.255 ua -193.93.80.0 - 193.93.87.255 gb +193.93.84.0 - 193.93.87.255 gb 193.93.88.0 - 193.93.95.255 pl 193.93.96.0 - 193.93.99.255 a2 193.93.100.0 - 193.93.103.255 ua @@ -90832,43 +81421,21 @@ 193.93.220.0 - 193.93.223.255 no 193.93.224.0 - 193.93.227.255 gb 193.93.228.0 - 193.93.231.255 ua -193.93.232.0 - 193.93.239.255 ru +193.93.236.0 - 193.93.239.255 ru 193.93.240.0 - 193.93.243.255 de 193.93.244.0 - 193.93.247.255 ru 193.93.248.0 - 193.93.255.255 no -193.94.0.0 - 193.94.15.127 fi -193.94.15.128 - 193.94.15.191 ax -193.94.15.192 - 193.94.255.255 fi +193.94.0.0 - 193.94.255.255 fi 193.95.0.0 - 193.95.127.255 tn -193.95.128.0 - 193.95.145.95 ie -193.95.145.96 - 193.95.145.103 es -193.95.145.104 - 193.95.153.255 ie -193.95.154.0 - 193.95.154.127 lu -193.95.154.128 - 193.95.171.191 ie -193.95.171.192 - 193.95.171.255 us -193.95.172.0 - 193.95.176.23 ie -193.95.176.24 - 193.95.176.31 us -193.95.176.32 - 193.95.176.63 ie -193.95.176.64 - 193.95.176.71 gb -193.95.176.72 - 193.95.178.39 ie -193.95.178.40 - 193.95.178.47 gb -193.95.178.48 - 193.95.178.103 ie -193.95.178.104 - 193.95.178.111 us -193.95.178.112 - 193.95.190.111 ie -193.95.190.112 - 193.95.190.119 gb -193.95.190.120 - 193.95.191.127 ie -193.95.191.128 - 193.95.191.191 us -193.95.191.192 - 193.95.191.255 ie +193.95.128.0 - 193.95.191.255 ie 193.95.192.0 - 193.95.255.255 si -193.96.0.0 - 193.97.190.255 de -193.97.191.0 - 193.97.191.255 gb -193.97.192.0 - 193.100.139.255 de -193.100.140.0 - 193.100.141.255 ch -193.100.142.0 - 193.103.161.255 de -193.103.162.0 - 193.103.163.255 ca -193.103.164.0 - 193.103.235.255 de -193.103.236.0 - 193.103.237.255 ca -193.103.238.0 - 193.103.255.255 de +193.96.0.0 - 193.96.193.255 de +193.96.194.0 - 193.96.194.255 eu +193.96.195.0 - 193.98.107.255 de +193.98.108.0 - 193.98.108.255 eu +193.98.109.0 - 193.99.212.255 de +193.99.213.0 - 193.99.213.255 eu +193.99.214.0 - 193.103.255.255 de 193.104.0.0 - 193.104.0.255 es 193.104.1.0 - 193.104.1.255 at 193.104.2.0 - 193.104.2.255 pl @@ -90881,7 +81448,6 @@ 193.104.9.0 - 193.104.9.255 de 193.104.10.0 - 193.104.10.255 si 193.104.11.0 - 193.104.11.255 ru -193.104.12.0 - 193.104.12.255 pa 193.104.13.0 - 193.104.13.255 tr 193.104.14.0 - 193.104.14.255 ru 193.104.15.0 - 193.104.15.255 gb @@ -90908,7 +81474,6 @@ 193.104.38.0 - 193.104.38.255 fi 193.104.39.0 - 193.104.39.255 fr 193.104.40.0 - 193.104.40.255 sa -193.104.41.0 - 193.104.41.255 md 193.104.42.0 - 193.104.42.255 ch 193.104.43.0 - 193.104.43.255 dk 193.104.44.0 - 193.104.44.255 il @@ -90933,19 +81498,16 @@ 193.104.64.0 - 193.104.64.255 ru 193.104.65.0 - 193.104.65.255 at 193.104.66.0 - 193.104.66.255 de -193.104.67.0 - 193.104.67.255 ua 193.104.68.0 - 193.104.68.255 rs 193.104.69.0 - 193.104.70.255 ru 193.104.71.0 - 193.104.71.255 pl 193.104.72.0 - 193.104.72.255 fr 193.104.73.0 - 193.104.73.255 ro -193.104.74.0 - 193.104.74.255 gb -193.104.75.0 - 193.104.75.255 ru +193.104.74.0 - 193.104.75.255 ru 193.104.76.0 - 193.104.76.255 cy 193.104.77.0 - 193.104.77.255 il 193.104.78.0 - 193.104.78.255 gb 193.104.79.0 - 193.104.79.255 bg -193.104.80.0 - 193.104.80.255 tr 193.104.81.0 - 193.104.81.255 gb 193.104.82.0 - 193.104.82.255 at 193.104.83.0 - 193.104.83.255 dk @@ -90956,8 +81518,7 @@ 193.104.88.0 - 193.104.88.255 pl 193.104.89.0 - 193.104.89.255 gb 193.104.90.0 - 193.104.90.255 de -193.104.91.0 - 193.104.93.255 gb -193.104.94.0 - 193.104.94.255 ru +193.104.91.0 - 193.104.92.255 gb 193.104.95.0 - 193.104.95.255 de 193.104.96.0 - 193.104.96.255 ua 193.104.97.0 - 193.104.97.255 ru @@ -90972,10 +81533,9 @@ 193.104.106.0 - 193.104.106.255 ro 193.104.107.0 - 193.104.108.255 gb 193.104.109.0 - 193.104.109.255 tr -193.104.110.0 - 193.104.110.255 cz 193.104.111.0 - 193.104.111.255 nl 193.104.112.0 - 193.104.112.255 se -193.104.113.0 - 193.104.113.255 a1 +193.104.113.0 - 193.104.113.255 gb 193.104.114.0 - 193.104.114.255 dk 193.104.115.0 - 193.104.115.255 il 193.104.116.0 - 193.104.116.255 ch @@ -90991,7 +81551,7 @@ 193.104.126.0 - 193.104.126.255 gb 193.104.127.0 - 193.104.128.255 ru 193.104.129.0 - 193.104.129.255 nl -193.104.130.0 - 193.104.130.255 tr +193.104.130.0 - 193.104.130.255 ru 193.104.131.0 - 193.104.131.255 gb 193.104.132.0 - 193.104.132.255 ch 193.104.133.0 - 193.104.133.255 ua @@ -91000,7 +81560,7 @@ 193.104.136.0 - 193.104.136.255 ie 193.104.137.0 - 193.104.137.255 it 193.104.138.0 - 193.104.138.255 tr -193.104.139.0 - 193.104.139.255 nl +193.104.139.0 - 193.104.139.255 ru 193.104.140.0 - 193.104.140.255 gb 193.104.141.0 - 193.104.143.255 ru 193.104.144.0 - 193.104.144.255 gb @@ -91008,10 +81568,10 @@ 193.104.146.0 - 193.104.146.255 de 193.104.147.0 - 193.104.147.255 il 193.104.148.0 - 193.104.148.255 ch +193.104.149.0 - 193.104.149.255 ru 193.104.150.0 - 193.104.150.255 ro 193.104.151.0 - 193.104.151.255 it 193.104.152.0 - 193.104.152.255 gb -193.104.153.0 - 193.104.153.255 mc 193.104.154.0 - 193.104.154.255 pl 193.104.155.0 - 193.104.155.255 de 193.104.156.0 - 193.104.156.255 pl @@ -91033,7 +81593,6 @@ 193.104.173.0 - 193.104.173.255 ro 193.104.174.0 - 193.104.174.255 de 193.104.175.0 - 193.104.175.255 gb -193.104.176.0 - 193.104.176.255 kz 193.104.177.0 - 193.104.177.255 ru 193.104.178.0 - 193.104.178.255 ua 193.104.179.0 - 193.104.179.255 gb @@ -91046,12 +81605,12 @@ 193.104.188.0 - 193.104.188.255 fi 193.104.189.0 - 193.104.189.255 ua 193.104.190.0 - 193.104.191.255 ru -193.104.192.0 - 193.104.193.255 nl +193.104.192.0 - 193.104.192.255 nl +193.104.193.0 - 193.104.193.255 be 193.104.194.0 - 193.104.194.255 de 193.104.195.0 - 193.104.195.255 ru 193.104.196.0 - 193.104.196.255 fi 193.104.197.0 - 193.104.197.255 ru -193.104.198.0 - 193.104.198.255 gb 193.104.199.0 - 193.104.199.255 fr 193.104.200.0 - 193.104.200.255 gr 193.104.201.0 - 193.104.201.255 tr @@ -91061,22 +81620,20 @@ 193.104.205.0 - 193.104.205.255 fr 193.104.206.0 - 193.104.206.255 lt 193.104.207.0 - 193.104.207.255 ru -193.104.208.0 - 193.104.210.255 ua -193.104.211.0 - 193.104.211.255 ch +193.104.208.0 - 193.104.211.255 ua 193.104.212.0 - 193.104.212.255 ir 193.104.213.0 - 193.104.213.255 ua 193.104.214.0 - 193.104.214.255 se -193.104.215.0 - 193.104.215.255 ie +193.104.215.0 - 193.104.215.255 eu 193.104.216.0 - 193.104.216.255 de -193.104.217.0 - 193.104.217.255 fi +193.104.217.0 - 193.104.217.255 se 193.104.218.0 - 193.104.218.255 es 193.104.219.0 - 193.104.219.255 fr 193.104.220.0 - 193.104.220.255 de 193.104.221.0 - 193.104.221.255 pl -193.104.222.0 - 193.104.222.255 li 193.104.223.0 - 193.104.223.255 it 193.104.224.0 - 193.104.227.255 ru -193.104.228.0 - 193.104.228.255 gb +193.104.228.0 - 193.104.228.255 dk 193.104.229.0 - 193.104.229.255 jo 193.104.230.0 - 193.104.230.255 ru 193.104.231.0 - 193.104.231.255 fr @@ -91100,7 +81657,7 @@ 193.104.249.0 - 193.104.249.255 ua 193.104.250.0 - 193.104.250.255 it 193.104.251.0 - 193.104.251.255 pl -193.104.252.0 - 193.104.252.255 nl +193.104.253.0 - 193.104.253.255 ru 193.104.254.0 - 193.104.254.255 cz 193.104.255.0 - 193.104.255.255 nl 193.105.0.0 - 193.105.0.255 de @@ -91117,23 +81674,22 @@ 193.105.11.0 - 193.105.11.255 ru 193.105.12.0 - 193.105.12.255 nl 193.105.13.0 - 193.105.13.255 gb +193.105.14.0 - 193.105.14.255 ru 193.105.15.0 - 193.105.15.255 be -193.105.16.0 - 193.105.16.255 ru +193.105.16.0 - 193.105.16.255 pl 193.105.17.0 - 193.105.17.255 de 193.105.18.0 - 193.105.18.255 fr 193.105.19.0 - 193.105.19.255 de 193.105.20.0 - 193.105.20.255 pl -193.105.21.0 - 193.105.21.255 ro +193.105.21.0 - 193.105.21.255 us 193.105.22.0 - 193.105.22.255 si 193.105.23.0 - 193.105.23.255 hr 193.105.24.0 - 193.105.24.255 pl 193.105.25.0 - 193.105.25.255 nl 193.105.26.0 - 193.105.26.255 fr 193.105.27.0 - 193.105.27.255 ru -193.105.28.0 - 193.105.28.255 ro 193.105.29.0 - 193.105.29.255 pl 193.105.30.0 - 193.105.30.255 ua -193.105.31.0 - 193.105.31.255 ro 193.105.32.0 - 193.105.32.255 pl 193.105.33.0 - 193.105.33.255 nl 193.105.34.0 - 193.105.34.255 es @@ -91180,25 +81736,21 @@ 193.105.78.0 - 193.105.78.255 ro 193.105.79.0 - 193.105.79.255 it 193.105.80.0 - 193.105.80.255 gr -193.105.81.0 - 193.105.81.255 fr 193.105.82.0 - 193.105.82.255 by 193.105.83.0 - 193.105.83.255 md -193.105.84.0 - 193.105.84.255 gb 193.105.85.0 - 193.105.85.255 gr 193.105.86.0 - 193.105.86.255 at -193.105.87.0 - 193.105.88.255 de +193.105.87.0 - 193.105.87.255 de 193.105.89.0 - 193.105.89.255 sa 193.105.90.0 - 193.105.90.255 fr 193.105.91.0 - 193.105.91.255 ro 193.105.92.0 - 193.105.92.255 ua 193.105.93.0 - 193.105.94.255 ru -193.105.95.0 - 193.105.95.255 nl -193.105.96.0 - 193.105.96.255 ru 193.105.97.0 - 193.105.97.255 fi 193.105.98.0 - 193.105.98.255 gb 193.105.99.0 - 193.105.99.255 il 193.105.100.0 - 193.105.100.255 ru -193.105.101.0 - 193.105.102.255 nl +193.105.101.0 - 193.105.101.255 nl 193.105.103.0 - 193.105.103.255 de 193.105.104.0 - 193.105.104.255 gb 193.105.105.0 - 193.105.105.255 de @@ -91216,7 +81768,6 @@ 193.105.117.0 - 193.105.118.255 ru 193.105.119.0 - 193.105.119.255 sa 193.105.120.0 - 193.105.120.255 gb -193.105.121.0 - 193.105.121.255 ua 193.105.122.0 - 193.105.122.255 pl 193.105.123.0 - 193.105.123.255 fi 193.105.124.0 - 193.105.124.255 ua @@ -91227,7 +81778,7 @@ 193.105.129.0 - 193.105.129.255 pl 193.105.130.0 - 193.105.130.255 se 193.105.131.0 - 193.105.131.255 at -193.105.132.0 - 193.105.132.255 ua +193.105.132.0 - 193.105.132.255 ru 193.105.133.0 - 193.105.133.255 be 193.105.134.0 - 193.105.134.255 se 193.105.135.0 - 193.105.135.255 ua @@ -91236,7 +81787,6 @@ 193.105.138.0 - 193.105.138.255 se 193.105.139.0 - 193.105.139.255 de 193.105.140.0 - 193.105.140.255 ro -193.105.141.0 - 193.105.141.255 ru 193.105.142.0 - 193.105.142.255 sk 193.105.143.0 - 193.105.143.255 pl 193.105.144.0 - 193.105.144.255 nl @@ -91245,28 +81795,26 @@ 193.105.147.0 - 193.105.147.255 de 193.105.148.0 - 193.105.148.255 bg 193.105.149.0 - 193.105.149.255 dk -193.105.150.0 - 193.105.150.255 nl -193.105.151.0 - 193.105.151.255 bg +193.105.150.0 - 193.105.150.255 gb 193.105.152.0 - 193.105.152.255 ua 193.105.153.0 - 193.105.153.255 at -193.105.154.0 - 193.105.154.255 eu +193.105.154.0 - 193.105.154.255 ru 193.105.155.0 - 193.105.155.255 lv 193.105.156.0 - 193.105.156.255 ru 193.105.157.0 - 193.105.159.255 cz 193.105.160.0 - 193.105.160.255 fi 193.105.161.0 - 193.105.161.255 ch -193.105.162.0 - 193.105.162.255 gb 193.105.163.0 - 193.105.163.255 rs 193.105.164.0 - 193.105.164.255 ua 193.105.165.0 - 193.105.165.255 nl 193.105.166.0 - 193.105.166.255 lv 193.105.167.0 - 193.105.167.255 pl 193.105.168.0 - 193.105.168.255 de -193.105.169.0 - 193.105.169.255 ua +193.105.169.0 - 193.105.169.255 ru 193.105.170.0 - 193.105.170.255 gb 193.105.171.0 - 193.105.171.255 us 193.105.172.0 - 193.105.172.255 gb -193.105.173.0 - 193.105.173.255 us +193.105.173.0 - 193.105.173.255 nl 193.105.174.0 - 193.105.175.255 ru 193.105.176.0 - 193.105.177.255 ro 193.105.178.0 - 193.105.178.255 pl @@ -91275,7 +81823,6 @@ 193.105.181.0 - 193.105.181.255 at 193.105.182.0 - 193.105.182.255 gb 193.105.183.0 - 193.105.183.255 nl -193.105.184.0 - 193.105.184.255 ru 193.105.185.0 - 193.105.185.255 ro 193.105.186.0 - 193.105.186.255 fr 193.105.187.0 - 193.105.187.255 nl @@ -91294,18 +81841,15 @@ 193.105.201.0 - 193.105.201.255 ua 193.105.202.0 - 193.105.202.255 pl 193.105.203.0 - 193.105.203.255 il -193.105.204.0 - 193.105.206.255 at -193.105.207.0 - 193.105.207.255 kz -193.105.208.0 - 193.105.208.255 tr +193.105.204.0 - 193.105.207.255 at 193.105.209.0 - 193.105.209.255 gb 193.105.210.0 - 193.105.210.255 ua 193.105.211.0 - 193.105.211.255 tr 193.105.212.0 - 193.105.212.255 gb 193.105.213.0 - 193.105.213.255 ru 193.105.214.0 - 193.105.214.255 at -193.105.215.0 - 193.105.215.255 ro +193.105.215.0 - 193.105.215.255 nl 193.105.216.0 - 193.105.216.255 ua -193.105.217.0 - 193.105.217.255 fr 193.105.218.0 - 193.105.218.255 gb 193.105.219.0 - 193.105.219.255 ua 193.105.220.0 - 193.105.220.255 dk @@ -91331,7 +81875,6 @@ 193.105.241.0 - 193.105.241.255 nl 193.105.242.0 - 193.105.242.255 pl 193.105.243.0 - 193.105.243.255 tr -193.105.244.0 - 193.105.244.255 ro 193.105.245.0 - 193.105.245.255 ru 193.105.246.0 - 193.105.247.255 de 193.105.248.0 - 193.105.248.255 pl @@ -91345,9 +81888,8 @@ 193.106.8.0 - 193.106.11.255 fi 193.106.12.0 - 193.106.15.255 gb 193.106.16.0 - 193.106.19.255 de -193.106.20.0 - 193.106.23.255 pl 193.106.24.0 - 193.106.31.255 ua -193.106.32.0 - 193.106.35.255 eu +193.106.32.0 - 193.106.35.255 ru 193.106.36.0 - 193.106.39.255 fr 193.106.40.0 - 193.106.43.255 ru 193.106.44.0 - 193.106.47.255 ro @@ -91372,13 +81914,13 @@ 193.106.144.0 - 193.106.147.255 ua 193.106.148.0 - 193.106.151.255 ru 193.106.152.0 - 193.106.159.255 pl -193.106.160.0 - 193.106.163.255 ua +193.106.160.0 - 193.106.163.255 ru 193.106.164.0 - 193.106.167.255 dk 193.106.168.0 - 193.106.175.255 ru 193.106.176.0 - 193.106.179.255 es 193.106.180.0 - 193.106.183.255 it 193.106.184.0 - 193.106.187.255 ua -193.106.188.0 - 193.106.191.255 ro +193.106.188.0 - 193.106.191.255 ru 193.106.192.0 - 193.106.195.255 pl 193.106.196.0 - 193.106.199.255 iq 193.106.200.0 - 193.106.203.255 ua @@ -91403,7 +81945,9 @@ 193.107.4.0 - 193.107.7.255 rs 193.107.8.0 - 193.107.11.255 pl 193.107.12.0 - 193.107.15.255 ru -193.107.16.0 - 193.107.19.255 sc +193.107.16.0 - 193.107.17.70 sc +193.107.17.71 - 193.107.17.71 a1 +193.107.17.72 - 193.107.19.255 sc 193.107.20.0 - 193.107.23.255 ru 193.107.24.0 - 193.107.27.255 ua 193.107.28.0 - 193.107.31.255 no @@ -91416,14 +81960,14 @@ 193.107.60.0 - 193.107.67.255 ru 193.107.68.0 - 193.107.71.255 bg 193.107.72.0 - 193.107.75.255 ua -193.107.76.0 - 193.107.79.255 se 193.107.80.0 - 193.107.83.255 ua 193.107.84.0 - 193.107.87.255 is 193.107.88.0 - 193.107.91.255 pl 193.107.92.0 - 193.107.95.255 ru 193.107.96.0 - 193.107.99.255 md 193.107.100.0 - 193.107.103.255 ru -193.107.104.0 - 193.107.115.255 ua +193.107.104.0 - 193.107.111.255 ua +193.107.112.0 - 193.107.115.255 ru 193.107.116.0 - 193.107.119.255 gb 193.107.120.0 - 193.107.123.255 de 193.107.124.0 - 193.107.127.255 fr @@ -91436,12 +81980,10 @@ 193.107.164.0 - 193.107.167.255 pl 193.107.168.0 - 193.107.179.255 ua 193.107.180.0 - 193.107.183.255 ru -193.107.184.0 - 193.107.187.255 ua 193.107.188.0 - 193.107.195.255 ru 193.107.196.0 - 193.107.199.255 pl 193.107.200.0 - 193.107.203.255 ua 193.107.204.0 - 193.107.207.255 gb -193.107.208.0 - 193.107.211.255 ua 193.107.212.0 - 193.107.215.255 pl 193.107.216.0 - 193.107.219.255 ru 193.107.220.0 - 193.107.223.255 nl @@ -91456,12 +81998,10 @@ 193.108.17.0 - 193.108.17.255 be 193.108.18.0 - 193.108.18.255 gb 193.108.19.0 - 193.108.19.255 de -193.108.20.0 - 193.108.21.255 fr +193.108.21.0 - 193.108.21.255 fr 193.108.22.0 - 193.108.22.255 at 193.108.23.0 - 193.108.23.255 gh 193.108.24.0 - 193.108.24.255 bg -193.108.25.0 - 193.108.25.255 it -193.108.26.0 - 193.108.26.255 ch 193.108.27.0 - 193.108.27.255 nl 193.108.28.0 - 193.108.28.255 gh 193.108.29.0 - 193.108.29.255 lv @@ -91473,20 +82013,20 @@ 193.108.38.0 - 193.108.39.255 ua 193.108.40.0 - 193.108.41.255 at 193.108.42.0 - 193.108.43.255 se -193.108.44.0 - 193.108.51.255 ua +193.108.44.0 - 193.108.45.255 ua +193.108.48.0 - 193.108.51.255 ua 193.108.52.0 - 193.108.55.255 ro 193.108.56.0 - 193.108.59.255 ua 193.108.60.0 - 193.108.63.255 it 193.108.64.0 - 193.108.71.255 eu 193.108.72.0 - 193.108.87.255 gb 193.108.88.0 - 193.108.95.255 eu -193.108.96.0 - 193.108.97.255 gb 193.108.98.0 - 193.108.99.255 nl 193.108.100.0 - 193.108.101.255 at 193.108.102.0 - 193.108.105.255 ua 193.108.106.0 - 193.108.109.255 cz 193.108.110.0 - 193.108.111.255 fr -193.108.112.0 - 193.108.123.255 ua +193.108.116.0 - 193.108.123.255 ua 193.108.124.0 - 193.108.127.255 pl 193.108.128.0 - 193.108.129.255 ua 193.108.130.0 - 193.108.131.255 ru @@ -91510,42 +82050,35 @@ 193.108.174.0 - 193.108.175.255 es 193.108.176.0 - 193.108.176.255 de 193.108.177.0 - 193.108.177.255 pl -193.108.178.0 - 193.108.178.255 fr 193.108.179.0 - 193.108.179.255 de 193.108.180.0 - 193.108.180.255 fr 193.108.181.0 - 193.108.181.255 de 193.108.182.0 - 193.108.182.255 ru -193.108.183.0 - 193.108.183.255 at 193.108.184.0 - 193.108.184.255 de 193.108.185.0 - 193.108.185.255 lv 193.108.186.0 - 193.108.186.255 it 193.108.187.0 - 193.108.187.255 ch -193.108.188.0 - 193.108.190.255 dk +193.108.188.0 - 193.108.189.255 lu +193.108.190.0 - 193.108.190.255 dk 193.108.191.0 - 193.108.192.255 gb 193.108.193.0 - 193.108.193.255 de 193.108.194.0 - 193.108.194.255 pl 193.108.195.0 - 193.108.195.255 il 193.108.196.0 - 193.108.196.255 se -193.108.197.0 - 193.108.198.255 fr +193.108.197.0 - 193.108.197.255 fr 193.108.199.0 - 193.108.200.255 gb 193.108.201.0 - 193.108.201.255 be 193.108.202.0 - 193.108.202.255 pl 193.108.203.0 - 193.108.203.255 fr 193.108.204.0 - 193.108.205.255 it -193.108.206.0 - 193.108.206.255 pl -193.108.207.0 - 193.108.207.255 ru -193.108.208.0 - 193.108.208.255 no 193.108.209.0 - 193.108.209.255 ua 193.108.210.0 - 193.108.210.255 nl -193.108.211.0 - 193.108.211.255 il 193.108.212.0 - 193.108.212.255 at 193.108.213.0 - 193.108.213.255 tr 193.108.214.0 - 193.108.214.255 ug -193.108.215.0 - 193.108.215.255 be 193.108.216.0 - 193.108.216.255 fr 193.108.217.0 - 193.108.217.255 de 193.108.218.0 - 193.108.218.255 gb -193.108.219.0 - 193.108.219.255 eu 193.108.220.0 - 193.108.220.255 pl 193.108.221.0 - 193.108.221.255 gb 193.108.222.0 - 193.108.222.255 de @@ -91553,11 +82086,10 @@ 193.108.224.0 - 193.108.225.255 dk 193.108.226.0 - 193.108.227.255 ua 193.108.228.0 - 193.108.229.255 pl -193.108.230.0 - 193.108.231.255 ru 193.108.232.0 - 193.108.233.255 ch -193.108.234.0 - 193.108.235.255 ro 193.108.236.0 - 193.108.237.255 ua -193.108.238.0 - 193.108.239.255 ro +193.108.238.0 - 193.108.238.255 nl +193.108.239.0 - 193.108.239.255 se 193.108.240.0 - 193.108.243.255 ua 193.108.244.0 - 193.108.247.255 gb 193.108.248.0 - 193.108.251.255 ua @@ -91565,7 +82097,6 @@ 193.109.0.0 - 193.109.3.255 fr 193.109.4.0 - 193.109.7.255 de 193.109.8.0 - 193.109.11.255 ua -193.109.12.0 - 193.109.15.255 ru 193.109.16.0 - 193.109.31.255 is 193.109.32.0 - 193.109.47.255 it 193.109.48.0 - 193.109.49.255 ch @@ -91573,35 +82104,29 @@ 193.109.52.0 - 193.109.53.255 ch 193.109.54.0 - 193.109.55.255 bg 193.109.56.0 - 193.109.57.255 dk -193.109.58.0 - 193.109.59.255 lu -193.109.60.0 - 193.109.61.255 se +193.109.58.0 - 193.109.59.255 pl +193.109.60.0 - 193.109.60.255 ru +193.109.61.0 - 193.109.61.255 bg 193.109.62.0 - 193.109.63.255 be -193.109.64.0 - 193.109.65.255 de 193.109.66.0 - 193.109.67.255 ke 193.109.68.0 - 193.109.71.255 ru 193.109.72.0 - 193.109.73.255 be 193.109.74.0 - 193.109.75.255 at 193.109.76.0 - 193.109.77.255 ru -193.109.78.0 - 193.109.79.255 tz 193.109.80.0 - 193.109.80.255 ua -193.109.81.0 - 193.109.81.255 gb +193.109.81.0 - 193.109.81.255 sa 193.109.82.0 - 193.109.82.255 il 193.109.83.0 - 193.109.83.255 gb -193.109.84.0 - 193.109.84.255 ua -193.109.85.0 - 193.109.85.255 lv 193.109.86.0 - 193.109.86.255 se 193.109.87.0 - 193.109.87.255 fr 193.109.88.0 - 193.109.88.255 at 193.109.89.0 - 193.109.89.255 ru 193.109.90.0 - 193.109.90.255 it -193.109.91.0 - 193.109.92.255 pl +193.109.91.0 - 193.109.91.255 pl 193.109.93.0 - 193.109.93.255 pt -193.109.94.0 - 193.109.94.255 gb 193.109.95.0 - 193.109.95.255 ch 193.109.96.0 - 193.109.99.255 de -193.109.100.0 - 193.109.103.255 ua 193.109.104.0 - 193.109.107.255 it -193.109.108.0 - 193.109.111.255 ua 193.109.112.0 - 193.109.112.255 it 193.109.113.0 - 193.109.113.255 de 193.109.114.0 - 193.109.114.255 ru @@ -91610,7 +82135,7 @@ 193.109.117.0 - 193.109.117.255 sk 193.109.118.0 - 193.109.118.255 ua 193.109.119.0 - 193.109.119.255 fr -193.109.120.0 - 193.109.121.255 es +193.109.121.0 - 193.109.121.255 es 193.109.122.0 - 193.109.122.255 nl 193.109.123.0 - 193.109.123.255 pl 193.109.124.0 - 193.109.124.255 si @@ -91620,7 +82145,6 @@ 193.109.130.0 - 193.109.131.255 lu 193.109.132.0 - 193.109.133.255 de 193.109.134.0 - 193.109.135.255 tr -193.109.136.0 - 193.109.137.255 nl 193.109.138.0 - 193.109.139.255 de 193.109.140.0 - 193.109.141.255 at 193.109.142.0 - 193.109.143.255 fr @@ -91637,36 +82161,32 @@ 193.109.210.0 - 193.109.210.255 no 193.109.211.0 - 193.109.211.255 lv 193.109.212.0 - 193.109.212.255 pl -193.109.213.0 - 193.109.213.255 gr 193.109.214.0 - 193.109.214.255 de 193.109.215.0 - 193.109.215.255 kw 193.109.216.0 - 193.109.216.255 ua -193.109.217.0 - 193.109.217.255 no 193.109.218.0 - 193.109.218.255 sa -193.109.219.0 - 193.109.220.255 gb -193.109.221.0 - 193.109.223.255 de -193.109.224.0 - 193.109.224.255 fr -193.109.225.0 - 193.109.226.255 pl +193.109.220.0 - 193.109.220.255 gb +193.109.222.0 - 193.109.223.255 de +193.109.225.0 - 193.109.225.255 pl 193.109.227.0 - 193.109.227.255 si 193.109.228.0 - 193.109.228.255 be -193.109.229.0 - 193.109.230.255 es +193.109.229.0 - 193.109.229.255 es 193.109.231.0 - 193.109.231.255 de 193.109.232.0 - 193.109.232.255 at 193.109.233.0 - 193.109.233.255 it 193.109.234.0 - 193.109.234.255 be 193.109.235.0 - 193.109.235.255 lt -193.109.236.0 - 193.109.239.255 de +193.109.236.0 - 193.109.238.255 de +193.109.239.0 - 193.109.239.255 pl 193.109.240.0 - 193.109.241.255 ua 193.109.242.0 - 193.109.243.255 de 193.109.244.0 - 193.109.245.255 pl -193.109.246.0 - 193.109.247.255 vg +193.109.246.0 - 193.109.247.255 ru 193.109.248.0 - 193.109.249.255 ua 193.109.250.0 - 193.109.251.255 fr 193.109.252.0 - 193.109.253.255 hu 193.109.254.0 - 193.109.255.255 gb -193.110.0.0 - 193.110.1.255 ru -193.110.2.0 - 193.110.3.255 ng -193.110.4.0 - 193.110.5.255 ru +193.110.4.0 - 193.110.5.255 gb 193.110.6.0 - 193.110.7.255 de 193.110.8.0 - 193.110.9.255 lv 193.110.10.0 - 193.110.11.255 at @@ -91677,25 +82197,27 @@ 193.110.28.0 - 193.110.31.255 at 193.110.32.0 - 193.110.39.255 fi 193.110.40.0 - 193.110.47.255 de -193.110.48.0 - 193.110.55.255 il +193.110.48.0 - 193.110.53.255 nl +193.110.54.0 - 193.110.54.255 eu +193.110.55.0 - 193.110.55.255 nl 193.110.56.0 - 193.110.63.255 hu 193.110.64.0 - 193.110.67.255 fi 193.110.68.0 - 193.110.71.255 de 193.110.72.0 - 193.110.79.255 ua 193.110.80.0 - 193.110.80.255 pl 193.110.81.0 - 193.110.81.255 be -193.110.82.0 - 193.110.82.255 bg 193.110.83.0 - 193.110.83.255 it 193.110.84.0 - 193.110.84.255 dk -193.110.85.0 - 193.110.85.255 ch +193.110.85.0 - 193.110.85.44 ch +193.110.85.45 - 193.110.85.45 eu +193.110.85.46 - 193.110.85.255 ch 193.110.86.0 - 193.110.86.255 gr 193.110.87.0 - 193.110.87.255 dk 193.110.88.0 - 193.110.88.255 gb 193.110.89.0 - 193.110.89.255 ua 193.110.90.0 - 193.110.90.255 de -193.110.91.0 - 193.110.91.255 gb +193.110.91.0 - 193.110.91.255 ru 193.110.92.0 - 193.110.92.255 be -193.110.93.0 - 193.110.93.255 gb 193.110.94.0 - 193.110.94.255 at 193.110.95.0 - 193.110.95.255 ch 193.110.96.0 - 193.110.99.255 pl @@ -91711,23 +82233,16 @@ 193.110.128.0 - 193.110.128.255 es 193.110.129.0 - 193.110.129.255 at 193.110.130.0 - 193.110.130.255 be -193.110.131.0 - 193.110.131.255 ch 193.110.132.0 - 193.110.132.255 bg 193.110.133.0 - 193.110.133.255 de -193.110.134.0 - 193.110.134.255 ua -193.110.135.0 - 193.110.135.255 gb -193.110.136.0 - 193.110.136.255 at 193.110.137.0 - 193.110.137.255 pl 193.110.138.0 - 193.110.138.255 gb 193.110.139.0 - 193.110.139.255 de -193.110.140.0 - 193.110.141.255 fr +193.110.140.0 - 193.110.140.255 fr 193.110.142.0 - 193.110.142.255 pl -193.110.143.0 - 193.110.143.255 gb 193.110.144.0 - 193.110.144.255 ua 193.110.145.0 - 193.110.145.255 si -193.110.146.0 - 193.110.146.255 fr -193.110.147.0 - 193.110.147.255 nl -193.110.148.0 - 193.110.148.255 fr +193.110.146.0 - 193.110.147.255 nl 193.110.149.0 - 193.110.149.255 gb 193.110.150.0 - 193.110.150.255 de 193.110.151.0 - 193.110.151.255 it @@ -91737,7 +82252,6 @@ 193.110.155.0 - 193.110.155.255 mt 193.110.156.0 - 193.110.156.255 ua 193.110.157.0 - 193.110.157.255 nl -193.110.158.0 - 193.110.158.255 be 193.110.159.0 - 193.110.159.255 bg 193.110.160.0 - 193.110.163.255 ua 193.110.164.0 - 193.110.165.255 lv @@ -91754,7 +82268,6 @@ 193.110.190.0 - 193.110.191.255 be 193.110.192.0 - 193.110.195.255 de 193.110.196.0 - 193.110.199.255 dk -193.110.200.0 - 193.110.203.255 it 193.110.204.0 - 193.110.207.255 de 193.110.208.0 - 193.110.215.255 tr 193.110.216.0 - 193.110.223.255 bg @@ -91766,7 +82279,6 @@ 193.110.248.0 - 193.110.255.255 be 193.111.0.0 - 193.111.1.255 ua 193.111.2.0 - 193.111.3.255 ru -193.111.4.0 - 193.111.5.255 gb 193.111.6.0 - 193.111.9.255 ua 193.111.10.0 - 193.111.11.255 tj 193.111.12.0 - 193.111.13.255 be @@ -91778,8 +82290,6 @@ 193.111.24.0 - 193.111.25.255 gb 193.111.26.0 - 193.111.27.255 pl 193.111.28.0 - 193.111.29.255 gb -193.111.30.0 - 193.111.31.255 pl -193.111.32.0 - 193.111.32.255 nl 193.111.33.0 - 193.111.33.255 gb 193.111.34.0 - 193.111.34.255 de 193.111.35.0 - 193.111.35.255 gb @@ -91788,11 +82298,9 @@ 193.111.41.0 - 193.111.41.255 pl 193.111.42.0 - 193.111.42.255 pt 193.111.43.0 - 193.111.44.255 de -193.111.45.0 - 193.111.45.255 fi 193.111.46.0 - 193.111.46.255 it 193.111.47.0 - 193.111.47.255 at 193.111.48.0 - 193.111.51.255 ua -193.111.52.0 - 193.111.55.255 lu 193.111.56.0 - 193.111.59.255 de 193.111.60.0 - 193.111.63.255 ua 193.111.64.0 - 193.111.65.255 fi @@ -91800,40 +82308,30 @@ 193.111.68.0 - 193.111.69.255 ro 193.111.70.0 - 193.111.73.255 it 193.111.74.0 - 193.111.75.255 gb -193.111.76.0 - 193.111.77.255 tj -193.111.78.0 - 193.111.79.255 it -193.111.80.0 - 193.111.80.255 fr 193.111.81.0 - 193.111.81.255 nl -193.111.82.0 - 193.111.82.255 gb +193.111.82.0 - 193.111.82.255 ie 193.111.83.0 - 193.111.83.255 ua 193.111.84.0 - 193.111.84.255 gb 193.111.85.0 - 193.111.85.255 ua -193.111.86.0 - 193.111.86.255 gb -193.111.88.0 - 193.111.88.255 de +193.111.87.0 - 193.111.87.255 at 193.111.89.0 - 193.111.89.255 bg -193.111.90.0 - 193.111.90.255 fr -193.111.91.0 - 193.111.92.255 ru +193.111.92.0 - 193.111.92.255 ru 193.111.93.0 - 193.111.93.255 fi -193.111.94.0 - 193.111.94.255 dk +193.111.94.0 - 193.111.94.255 nl 193.111.95.0 - 193.111.95.255 be 193.111.96.0 - 193.111.99.255 sk 193.111.100.0 - 193.111.103.255 de 193.111.104.0 - 193.111.107.255 se 193.111.108.0 - 193.111.113.255 de 193.111.114.0 - 193.111.115.255 ua -193.111.116.0 - 193.111.117.255 ru 193.111.118.0 - 193.111.119.255 fi 193.111.120.0 - 193.111.121.255 ro 193.111.122.0 - 193.111.123.255 es -193.111.124.0 - 193.111.125.255 se 193.111.126.0 - 193.111.127.255 ua 193.111.128.0 - 193.111.135.255 cz -193.111.136.0 - 193.111.143.255 gb +193.111.136.0 - 193.111.143.255 de 193.111.144.0 - 193.111.147.255 pl -193.111.148.0 - 193.111.151.255 it -193.111.152.0 - 193.111.155.255 se 193.111.156.0 - 193.111.159.255 ua -193.111.160.0 - 193.111.160.255 it 193.111.161.0 - 193.111.161.255 ro 193.111.162.0 - 193.111.162.255 dk 193.111.163.0 - 193.111.163.255 de @@ -91841,19 +82339,15 @@ 193.111.165.0 - 193.111.165.255 se 193.111.166.0 - 193.111.166.255 pl 193.111.167.0 - 193.111.167.255 de -193.111.168.0 - 193.111.168.255 gb -193.111.169.0 - 193.111.170.255 de -193.111.171.0 - 193.111.171.255 ie +193.111.169.0 - 193.111.169.255 de 193.111.172.0 - 193.111.172.255 nl 193.111.173.0 - 193.111.173.255 ua -193.111.174.0 - 193.111.174.255 pl 193.111.175.0 - 193.111.175.255 de 193.111.176.0 - 193.111.179.255 ru -193.111.180.0 - 193.111.187.255 gb +193.111.184.0 - 193.111.187.255 gb 193.111.188.0 - 193.111.191.255 ua 193.111.192.0 - 193.111.193.255 si 193.111.194.0 - 193.111.195.255 bg -193.111.196.0 - 193.111.197.255 ch 193.111.198.0 - 193.111.199.255 de 193.111.200.0 - 193.111.201.255 gb 193.111.202.0 - 193.111.203.255 ch @@ -91862,154 +82356,88 @@ 193.111.220.0 - 193.111.223.255 si 193.111.224.0 - 193.111.224.255 hu 193.111.225.0 - 193.111.225.255 be -193.111.226.0 - 193.111.227.255 gb -193.111.228.0 - 193.111.228.255 be -193.111.229.0 - 193.111.229.255 ro +193.111.227.0 - 193.111.227.255 gb +193.111.228.0 - 193.111.228.255 nl 193.111.230.0 - 193.111.231.255 gb 193.111.232.0 - 193.111.232.255 ro -193.111.233.0 - 193.111.233.255 de -193.111.234.0 - 193.111.234.255 gb -193.111.235.0 - 193.111.235.255 be 193.111.236.0 - 193.111.236.255 pl 193.111.237.0 - 193.111.238.255 de 193.111.239.0 - 193.111.243.255 ua 193.111.244.0 - 193.111.247.255 lv -193.111.248.0 - 193.111.251.255 ua 193.111.252.0 - 193.111.255.255 ru 193.112.0.0 - 193.119.255.255 gb -193.120.0.0 - 193.120.5.255 ie -193.120.6.0 - 193.120.6.31 gb -193.120.6.32 - 193.120.44.31 ie -193.120.44.32 - 193.120.44.63 us -193.120.44.64 - 193.120.84.191 ie -193.120.84.192 - 193.120.84.255 us -193.120.85.0 - 193.120.100.31 ie -193.120.100.32 - 193.120.100.39 us -193.120.100.40 - 193.120.106.247 ie -193.120.106.248 - 193.120.106.255 gb -193.120.107.0 - 193.120.108.63 ie -193.120.108.64 - 193.120.108.95 us -193.120.108.96 - 193.120.114.119 ie -193.120.114.120 - 193.120.114.127 gb -193.120.114.128 - 193.120.117.31 ie -193.120.117.32 - 193.120.117.47 us -193.120.117.48 - 193.120.126.79 ie -193.120.126.80 - 193.120.126.87 gb -193.120.126.88 - 193.120.136.7 ie -193.120.136.8 - 193.120.136.15 gb -193.120.136.16 - 193.120.137.47 ie -193.120.137.48 - 193.120.137.55 gb -193.120.137.56 - 193.120.140.39 ie -193.120.140.40 - 193.120.140.47 gb -193.120.140.48 - 193.120.140.55 ie -193.120.140.56 - 193.120.140.63 gb -193.120.140.64 - 193.120.140.183 ie -193.120.140.184 - 193.120.140.191 gb -193.120.140.192 - 193.120.144.87 ie -193.120.144.88 - 193.120.144.95 fr -193.120.144.96 - 193.120.144.215 ie -193.120.144.216 - 193.120.144.223 gb -193.120.144.224 - 193.120.145.71 ie -193.120.145.72 - 193.120.145.79 gb -193.120.145.80 - 193.120.153.191 ie -193.120.153.192 - 193.120.153.255 gb -193.120.154.0 - 193.120.166.63 ie -193.120.166.64 - 193.120.166.127 us -193.120.166.128 - 193.120.171.47 ie -193.120.171.48 - 193.120.171.63 gb -193.120.171.64 - 193.120.204.224 ie -193.120.204.225 - 193.120.204.230 in -193.120.204.231 - 193.120.211.255 ie -193.120.212.0 - 193.120.212.255 be -193.120.213.0 - 193.120.218.143 ie -193.120.218.144 - 193.120.218.159 us -193.120.218.160 - 193.120.225.39 ie -193.120.225.40 - 193.120.225.47 gb -193.120.225.48 - 193.120.225.63 ie -193.120.225.64 - 193.120.225.71 gb -193.120.225.72 - 193.120.225.79 ie -193.120.225.80 - 193.120.225.87 gb -193.120.225.88 - 193.120.225.143 ie -193.120.225.144 - 193.120.225.159 gb -193.120.225.160 - 193.120.236.159 ie -193.120.236.160 - 193.120.236.223 gb -193.120.236.224 - 193.120.238.23 ie -193.120.238.24 - 193.120.238.31 us -193.120.238.32 - 193.120.250.255 ie +193.120.0.0 - 193.120.191.255 ie +193.120.192.0 - 193.120.195.255 gb +193.120.196.0 - 193.120.250.255 ie 193.120.251.0 - 193.120.251.255 gb 193.120.252.0 - 193.120.255.255 ie 193.121.0.0 - 193.121.255.255 be -193.122.0.0 - 193.123.143.127 gb -193.123.143.128 - 193.123.143.143 de -193.123.143.144 - 193.123.255.255 gb -193.124.0.0 - 193.124.47.255 ru -193.124.48.0 - 193.124.48.255 ua -193.124.49.0 - 193.124.53.255 ru -193.124.54.0 - 193.124.54.255 ua -193.124.55.0 - 193.124.72.255 ru -193.124.73.0 - 193.124.73.255 ua -193.124.74.0 - 193.125.255.255 ru +193.122.0.0 - 193.123.255.255 gb +193.124.0.0 - 193.124.135.255 ru +193.124.136.0 - 193.124.143.255 de +193.124.144.0 - 193.124.243.255 ru +193.124.244.0 - 193.124.247.255 de +193.124.248.0 - 193.125.255.255 ru 193.126.0.0 - 193.126.255.255 pt -193.127.0.0 - 193.127.11.255 es -193.127.12.0 - 193.127.12.255 eu -193.127.13.0 - 193.127.15.255 es -193.127.16.0 - 193.127.97.255 eu -193.127.98.0 - 193.127.98.255 es -193.127.99.0 - 193.127.100.255 eu +193.127.0.0 - 193.127.100.255 eu 193.127.101.0 - 193.127.104.255 es -193.127.105.0 - 193.127.192.247 eu -193.127.192.248 - 193.127.193.255 gb -193.127.194.0 - 193.127.205.255 eu -193.127.206.0 - 193.127.207.255 es +193.127.105.0 - 193.127.175.255 eu +193.127.176.0 - 193.127.177.1 es +193.127.177.2 - 193.127.177.2 pt +193.127.177.3 - 193.127.191.255 es +193.127.192.0 - 193.127.192.255 eu +193.127.193.0 - 193.127.193.255 es +193.127.194.0 - 193.127.199.255 eu +193.127.200.0 - 193.127.200.255 es +193.127.201.0 - 193.127.207.255 eu 193.127.208.0 - 193.127.215.255 gb -193.127.216.0 - 193.127.255.255 eu -193.128.0.0 - 193.128.104.39 gb -193.128.104.40 - 193.128.104.47 lv -193.128.104.48 - 193.128.107.199 gb -193.128.107.200 - 193.128.107.207 se -193.128.107.208 - 193.130.60.159 gb -193.130.60.160 - 193.130.60.175 a2 -193.130.60.176 - 193.131.99.255 gb +193.127.216.0 - 193.127.239.255 eu +193.127.240.0 - 193.127.243.255 gb +193.127.244.0 - 193.127.255.255 eu +193.128.0.0 - 193.130.96.255 gb +193.130.97.0 - 193.130.97.255 eu +193.130.98.0 - 193.131.99.255 gb 193.131.100.0 - 193.131.103.255 hu 193.131.104.0 - 193.133.255.255 gb -193.134.0.0 - 193.135.255.255 ch +193.134.0.0 - 193.134.161.255 ch +193.134.162.0 - 193.134.162.255 us +193.134.163.0 - 193.134.170.34 ch +193.134.170.35 - 193.134.170.35 eu +193.134.170.36 - 193.135.255.255 ch 193.136.0.0 - 193.137.255.255 pt 193.138.0.0 - 193.138.0.255 at -193.138.1.0 - 193.138.5.255 si +193.138.1.0 - 193.138.3.255 si 193.138.6.0 - 193.138.7.255 no 193.138.8.0 - 193.138.8.255 ee 193.138.9.0 - 193.138.9.255 si -193.138.10.0 - 193.138.28.255 de +193.138.10.0 - 193.138.27.255 de 193.138.29.0 - 193.138.29.255 ch 193.138.30.0 - 193.138.30.255 lt 193.138.31.0 - 193.138.31.255 de 193.138.32.0 - 193.138.63.255 si 193.138.64.0 - 193.138.64.255 fr -193.138.65.0 - 193.138.65.255 gr +193.138.65.0 - 193.138.65.255 pl 193.138.66.0 - 193.138.66.255 de 193.138.67.0 - 193.138.67.255 bg 193.138.68.0 - 193.138.68.255 de 193.138.69.0 - 193.138.69.255 ch 193.138.70.0 - 193.138.70.255 ru 193.138.71.0 - 193.138.71.255 se -193.138.72.0 - 193.138.72.255 us 193.138.73.0 - 193.138.73.255 ch 193.138.74.0 - 193.138.74.255 se -193.138.75.0 - 193.138.75.255 gb 193.138.76.0 - 193.138.76.255 dk -193.138.77.0 - 193.138.77.255 ua +193.138.77.0 - 193.138.77.255 lv 193.138.78.0 - 193.138.78.255 cz 193.138.79.0 - 193.138.79.255 ru 193.138.80.0 - 193.138.81.255 de 193.138.82.0 - 193.138.82.255 ru 193.138.83.0 - 193.138.83.255 ch 193.138.84.0 - 193.138.84.255 ua -193.138.85.0 - 193.138.85.255 ro 193.138.86.0 - 193.138.86.255 gb 193.138.87.0 - 193.138.87.255 ua 193.138.88.0 - 193.138.88.255 de 193.138.89.0 - 193.138.89.255 ru -193.138.90.0 - 193.138.90.255 fr +193.138.90.0 - 193.138.90.255 nl 193.138.91.0 - 193.138.91.255 de 193.138.92.0 - 193.138.92.255 il 193.138.93.0 - 193.138.93.255 ua @@ -92028,17 +82456,14 @@ 193.138.108.0 - 193.138.108.255 de 193.138.109.0 - 193.138.109.255 se 193.138.110.0 - 193.138.110.255 pl -193.138.111.0 - 193.138.111.255 ie -193.138.112.0 - 193.138.113.255 de -193.138.114.0 - 193.138.114.255 ua +193.138.112.0 - 193.138.114.152 de +193.138.114.153 - 193.138.114.153 eu +193.138.114.154 - 193.138.114.255 de 193.138.115.0 - 193.138.115.255 dk -193.138.116.0 - 193.138.116.255 ru +193.138.116.0 - 193.138.116.255 tr 193.138.117.0 - 193.138.117.255 de 193.138.118.0 - 193.138.118.255 pl 193.138.119.0 - 193.138.119.255 de -193.138.120.0 - 193.138.120.255 gb -193.138.121.0 - 193.138.121.255 nl -193.138.122.0 - 193.138.122.255 ua 193.138.123.0 - 193.138.123.255 at 193.138.124.0 - 193.138.124.255 dk 193.138.125.0 - 193.138.125.255 hu @@ -92050,11 +82475,9 @@ 193.138.144.0 - 193.138.147.255 ua 193.138.148.0 - 193.138.151.255 ru 193.138.152.0 - 193.138.155.255 cz -193.138.156.0 - 193.138.159.255 nl +193.138.156.0 - 193.138.159.255 de 193.138.160.0 - 193.138.163.255 it 193.138.164.0 - 193.138.167.255 de -193.138.168.0 - 193.138.171.255 ro -193.138.172.0 - 193.138.175.255 lv 193.138.176.0 - 193.138.179.255 ru 193.138.180.0 - 193.138.183.255 de 193.138.184.0 - 193.138.187.255 ua @@ -92071,291 +82494,67 @@ 193.138.240.0 - 193.138.243.255 pl 193.138.244.0 - 193.138.247.255 ua 193.138.248.0 - 193.138.251.255 nl -193.138.252.0 - 193.138.255.255 de 193.139.0.0 - 193.139.255.255 fr 193.140.0.0 - 193.140.255.255 tr 193.141.0.0 - 193.141.3.255 de -193.141.4.0 - 193.141.4.63 nl -193.141.4.64 - 193.141.4.71 de -193.141.4.72 - 193.141.4.79 nl -193.141.4.80 - 193.141.4.87 de -193.141.4.88 - 193.141.6.127 nl -193.141.6.128 - 193.141.6.135 de -193.141.6.136 - 193.141.10.191 nl -193.141.10.192 - 193.141.10.199 de -193.141.10.200 - 193.141.10.215 nl -193.141.10.216 - 193.141.10.223 de -193.141.10.224 - 193.141.14.119 nl -193.141.14.120 - 193.141.14.127 de -193.141.14.128 - 193.141.15.7 nl -193.141.15.8 - 193.141.15.15 de -193.141.15.16 - 193.141.15.71 nl -193.141.15.72 - 193.141.15.79 de -193.141.15.80 - 193.141.16.183 nl -193.141.16.184 - 193.141.16.191 de -193.141.16.192 - 193.141.17.55 nl -193.141.17.56 - 193.141.17.63 de -193.141.17.64 - 193.141.18.7 nl -193.141.18.8 - 193.141.18.15 de -193.141.18.16 - 193.141.18.127 nl -193.141.18.128 - 193.141.18.143 de -193.141.18.144 - 193.141.18.223 nl -193.141.18.224 - 193.141.18.231 de -193.141.18.232 - 193.141.19.31 nl -193.141.19.32 - 193.141.19.39 de -193.141.19.40 - 193.141.19.47 nl -193.141.19.48 - 193.141.19.55 de -193.141.19.56 - 193.141.19.231 nl -193.141.19.232 - 193.141.19.239 de -193.141.19.240 - 193.141.19.255 nl -193.141.20.0 - 193.141.27.255 de -193.141.28.0 - 193.141.37.223 nl -193.141.37.224 - 193.141.37.231 de -193.141.37.232 - 193.141.38.7 nl -193.141.38.8 - 193.141.38.15 de -193.141.38.16 - 193.141.38.119 nl -193.141.38.120 - 193.141.38.127 de -193.141.38.128 - 193.141.39.255 nl -193.141.40.0 - 193.141.46.255 de -193.141.47.0 - 193.141.48.103 nl -193.141.48.104 - 193.141.48.111 de -193.141.48.112 - 193.141.48.159 nl -193.141.48.160 - 193.141.48.167 de -193.141.48.168 - 193.141.52.47 nl -193.141.52.48 - 193.141.52.55 de -193.141.52.56 - 193.141.52.255 nl -193.141.53.0 - 193.141.67.255 de -193.141.68.0 - 193.141.68.207 nl -193.141.68.208 - 193.141.68.215 de -193.141.68.216 - 193.141.69.55 nl -193.141.69.56 - 193.141.69.63 de -193.141.69.64 - 193.141.70.31 nl -193.141.70.32 - 193.141.70.39 de -193.141.70.40 - 193.141.72.239 nl -193.141.72.240 - 193.141.72.247 de -193.141.72.248 - 193.141.72.255 nl -193.141.73.0 - 193.141.73.7 de -193.141.73.8 - 193.141.73.199 nl -193.141.73.200 - 193.141.73.207 de -193.141.73.208 - 193.141.74.231 nl -193.141.74.232 - 193.141.74.239 de -193.141.74.240 - 193.141.75.199 nl -193.141.75.200 - 193.141.75.207 de -193.141.75.208 - 193.141.78.103 nl -193.141.78.104 - 193.141.78.111 de -193.141.78.112 - 193.141.79.111 nl -193.141.79.112 - 193.141.79.119 de -193.141.79.120 - 193.141.79.135 nl -193.141.79.136 - 193.141.79.143 de -193.141.79.144 - 193.141.80.167 nl -193.141.80.168 - 193.141.80.175 de -193.141.80.176 - 193.141.80.183 nl -193.141.80.184 - 193.141.80.191 de -193.141.80.192 - 193.141.85.71 nl -193.141.85.72 - 193.141.85.79 de -193.141.85.80 - 193.141.85.215 nl -193.141.85.216 - 193.141.85.223 de -193.141.85.224 - 193.141.87.127 nl -193.141.87.128 - 193.141.87.135 de -193.141.87.136 - 193.141.89.239 nl -193.141.89.240 - 193.141.89.247 de -193.141.89.248 - 193.141.90.55 nl -193.141.90.56 - 193.141.90.63 de -193.141.90.64 - 193.141.90.255 nl -193.141.91.0 - 193.141.110.255 de -193.141.111.0 - 193.141.113.183 nl -193.141.113.184 - 193.141.113.191 de -193.141.113.192 - 193.141.114.223 nl -193.141.114.224 - 193.141.114.231 de -193.141.114.232 - 193.141.116.103 nl -193.141.116.104 - 193.141.116.111 de -193.141.116.112 - 193.141.119.23 nl -193.141.119.24 - 193.141.119.31 de -193.141.119.32 - 193.141.120.255 nl -193.141.121.0 - 193.141.121.255 de -193.141.122.0 - 193.141.122.23 nl -193.141.122.24 - 193.141.122.39 de -193.141.122.40 - 193.141.122.71 nl -193.141.122.72 - 193.141.122.79 de -193.141.122.80 - 193.141.123.111 nl -193.141.123.112 - 193.141.123.119 de -193.141.123.120 - 193.141.124.255 nl -193.141.125.0 - 193.141.127.255 de -193.141.128.0 - 193.141.130.71 nl -193.141.130.72 - 193.141.130.87 de -193.141.130.88 - 193.141.131.71 nl -193.141.131.72 - 193.141.131.79 de -193.141.131.80 - 193.141.131.127 nl -193.141.131.128 - 193.141.131.135 de -193.141.131.136 - 193.141.131.151 nl -193.141.131.152 - 193.141.131.159 de -193.141.131.160 - 193.141.136.23 nl -193.141.136.24 - 193.141.136.31 de -193.141.136.32 - 193.141.138.255 nl -193.141.139.0 - 193.141.143.255 de -193.141.144.0 - 193.141.144.127 nl -193.141.144.128 - 193.141.144.135 de -193.141.144.136 - 193.141.144.151 nl -193.141.144.152 - 193.141.144.159 de -193.141.144.160 - 193.141.146.167 nl -193.141.146.168 - 193.141.146.175 de -193.141.146.176 - 193.141.149.39 nl -193.141.149.40 - 193.141.149.47 de -193.141.149.48 - 193.141.149.119 nl -193.141.149.120 - 193.141.149.127 de -193.141.149.128 - 193.141.149.159 nl -193.141.149.160 - 193.141.149.167 de -193.141.149.168 - 193.141.149.255 nl -193.141.150.0 - 193.141.150.7 de -193.141.150.8 - 193.141.150.191 nl -193.141.150.192 - 193.141.150.199 de -193.141.150.200 - 193.141.155.55 nl -193.141.155.56 - 193.141.155.63 de -193.141.155.64 - 193.141.156.63 nl -193.141.156.64 - 193.141.156.71 de -193.141.156.72 - 193.141.156.111 nl -193.141.156.112 - 193.141.156.119 de -193.141.156.120 - 193.141.158.47 nl -193.141.158.48 - 193.141.158.55 de -193.141.158.56 - 193.141.158.215 nl -193.141.158.216 - 193.141.158.223 de -193.141.158.224 - 193.141.159.23 nl -193.141.159.24 - 193.141.159.31 de -193.141.159.32 - 193.141.159.47 nl -193.141.159.48 - 193.141.159.55 de -193.141.159.56 - 193.141.160.39 nl -193.141.160.40 - 193.141.160.47 de -193.141.160.48 - 193.141.160.95 nl -193.141.160.96 - 193.141.160.103 de -193.141.160.104 - 193.141.164.223 nl -193.141.164.224 - 193.141.164.231 de -193.141.164.232 - 193.141.167.71 nl -193.141.167.72 - 193.141.167.79 de -193.141.167.80 - 193.141.168.183 nl -193.141.168.184 - 193.141.168.191 de -193.141.168.192 - 193.141.170.199 nl -193.141.170.200 - 193.141.170.207 de -193.141.170.208 - 193.141.174.87 nl -193.141.174.88 - 193.141.174.95 de -193.141.174.96 - 193.141.175.255 nl -193.141.176.0 - 193.141.231.255 de -193.141.232.0 - 193.141.232.135 nl -193.141.232.136 - 193.141.232.143 de -193.141.232.144 - 193.141.234.175 nl -193.141.234.176 - 193.141.234.183 de -193.141.234.184 - 193.141.235.191 nl -193.141.235.192 - 193.141.235.199 de -193.141.235.200 - 193.141.237.71 nl -193.141.237.72 - 193.141.237.79 de -193.141.237.80 - 193.141.238.159 nl -193.141.238.160 - 193.141.238.167 de -193.141.238.168 - 193.141.243.111 nl -193.141.243.112 - 193.141.243.119 de -193.141.243.120 - 193.141.243.151 nl -193.141.243.152 - 193.141.243.159 de -193.141.243.160 - 193.141.244.231 nl -193.141.244.232 - 193.141.244.247 de -193.141.244.248 - 193.141.245.15 nl -193.141.245.16 - 193.141.245.23 de -193.141.245.24 - 193.141.245.215 nl -193.141.245.216 - 193.141.245.223 de -193.141.245.224 - 193.141.246.55 nl -193.141.246.56 - 193.141.246.63 de -193.141.246.64 - 193.141.246.71 nl -193.141.246.72 - 193.141.246.87 de -193.141.246.88 - 193.141.246.183 nl -193.141.246.184 - 193.141.246.191 de -193.141.246.192 - 193.141.246.207 nl -193.141.246.208 - 193.141.246.215 de -193.141.246.216 - 193.141.247.87 nl -193.141.247.88 - 193.141.247.103 de -193.141.247.104 - 193.141.247.175 nl -193.141.247.176 - 193.141.247.183 de -193.141.247.184 - 193.141.248.31 nl -193.141.248.32 - 193.141.248.39 de -193.141.248.40 - 193.141.248.47 nl -193.141.248.48 - 193.141.248.55 de -193.141.248.56 - 193.141.248.143 nl -193.141.248.144 - 193.141.248.151 de -193.141.248.152 - 193.141.248.167 nl -193.141.248.168 - 193.141.248.191 de -193.141.248.192 - 193.141.248.207 nl -193.141.248.208 - 193.141.248.215 de -193.141.248.216 - 193.141.248.247 nl -193.141.248.248 - 193.141.248.255 de -193.141.249.0 - 193.141.249.63 nl -193.141.249.64 - 193.141.249.71 de -193.141.249.72 - 193.141.250.39 nl -193.141.250.40 - 193.141.250.47 de -193.141.250.48 - 193.141.250.111 nl -193.141.250.112 - 193.141.250.119 de -193.141.250.120 - 193.141.250.151 nl -193.141.250.152 - 193.141.250.159 de -193.141.250.160 - 193.141.251.23 nl -193.141.251.24 - 193.141.251.31 de -193.141.251.32 - 193.141.251.55 nl -193.141.251.56 - 193.141.251.63 de -193.141.251.64 - 193.141.251.71 nl -193.141.251.72 - 193.141.251.79 de -193.141.251.80 - 193.141.252.95 nl -193.141.252.96 - 193.141.252.103 de -193.141.252.104 - 193.141.252.215 nl -193.141.252.216 - 193.141.252.223 de -193.141.252.224 - 193.141.253.79 nl -193.141.253.80 - 193.141.253.87 de -193.141.253.88 - 193.141.254.127 nl -193.141.254.128 - 193.141.254.135 de -193.141.254.136 - 193.141.254.191 nl -193.141.254.192 - 193.141.254.199 de -193.141.254.200 - 193.141.255.183 nl -193.141.255.184 - 193.141.255.191 de -193.141.255.192 - 193.141.255.255 nl +193.141.4.0 - 193.141.26.255 nl +193.141.27.0 - 193.141.27.255 de +193.141.28.0 - 193.141.39.255 nl +193.141.40.0 - 193.141.43.255 de +193.141.44.0 - 193.141.95.255 nl +193.141.96.0 - 193.141.97.255 de +193.141.98.0 - 193.141.181.255 nl +193.141.182.0 - 193.141.182.255 de +193.141.183.0 - 193.141.183.255 nl +193.141.184.0 - 193.141.187.255 de +193.141.188.0 - 193.141.191.255 nl +193.141.192.0 - 193.141.219.35 de +193.141.219.36 - 193.141.219.36 eu +193.141.219.37 - 193.141.223.255 de +193.141.224.0 - 193.141.255.255 nl 193.142.0.0 - 193.142.0.255 bg -193.142.1.0 - 193.142.18.255 fi +193.142.1.0 - 193.142.2.255 fi +193.142.4.0 - 193.142.17.255 fi 193.142.19.0 - 193.142.19.255 am -193.142.20.0 - 193.142.29.255 fi -193.142.30.0 - 193.142.30.255 no +193.142.23.0 - 193.142.27.255 fi +193.142.30.0 - 193.142.30.255 ir 193.142.31.0 - 193.142.31.255 ru -193.142.32.0 - 193.142.52.255 fi +193.142.50.0 - 193.142.51.255 fi 193.142.53.0 - 193.142.53.255 de -193.142.54.0 - 193.142.55.255 fi +193.142.55.0 - 193.142.55.255 fi 193.142.56.0 - 193.142.57.255 ru -193.142.58.0 - 193.142.60.255 fi -193.142.61.0 - 193.142.61.255 at +193.142.61.0 - 193.142.61.255 se 193.142.62.0 - 193.142.62.255 ch -193.142.63.0 - 193.142.96.255 fi +193.142.64.0 - 193.142.96.255 fi 193.142.97.0 - 193.142.97.255 de 193.142.98.0 - 193.142.99.255 fi 193.142.100.0 - 193.142.100.255 no 193.142.101.0 - 193.142.102.255 fi 193.142.103.0 - 193.142.103.255 dk -193.142.104.0 - 193.142.107.255 fi +193.142.104.0 - 193.142.107.255 de 193.142.108.0 - 193.142.110.255 no 193.142.111.0 - 193.142.111.255 ch 193.142.112.0 - 193.142.113.255 pl 193.142.114.0 - 193.142.114.255 ua 193.142.115.0 - 193.142.115.255 pl 193.142.116.0 - 193.142.116.255 si -193.142.117.0 - 193.142.119.255 gb +193.142.118.0 - 193.142.119.255 gb 193.142.120.0 - 193.142.123.255 fi 193.142.124.0 - 193.142.124.255 ua 193.142.125.0 - 193.142.125.255 ch -193.142.126.0 - 193.142.126.255 fi 193.142.127.0 - 193.142.127.255 de -193.142.128.0 - 193.142.144.255 fi +193.142.136.0 - 193.142.143.255 fi 193.142.145.0 - 193.142.145.255 hu -193.142.146.0 - 193.142.148.255 fi 193.142.149.0 - 193.142.149.255 si 193.142.150.0 - 193.142.150.255 fi 193.142.151.0 - 193.142.151.255 il -193.142.152.0 - 193.142.152.255 fi 193.142.153.0 - 193.142.153.255 hu -193.142.154.0 - 193.142.156.255 fi 193.142.157.0 - 193.142.157.255 de 193.142.158.0 - 193.142.158.255 fr 193.142.159.0 - 193.142.159.255 ua 193.142.160.0 - 193.142.175.255 se -193.142.176.0 - 193.142.207.255 fi +193.142.176.0 - 193.142.191.255 fi +193.142.204.0 - 193.142.204.255 fi 193.142.208.0 - 193.142.208.255 ro 193.142.209.0 - 193.142.209.255 hu 193.142.210.0 - 193.142.210.255 pl @@ -92370,68 +82569,64 @@ 193.142.220.0 - 193.142.220.255 gb 193.142.221.0 - 193.142.221.255 ua 193.142.222.0 - 193.142.222.255 sa -193.142.223.0 - 193.142.223.255 de -193.142.224.0 - 193.142.242.255 fi +193.142.224.0 - 193.142.240.255 fi 193.142.243.0 - 193.142.243.255 pl 193.142.244.0 - 193.142.244.255 se 193.142.245.0 - 193.142.245.255 gb 193.142.246.0 - 193.142.246.255 ru -193.142.247.0 - 193.142.255.255 fi +193.142.247.0 - 193.142.247.255 fi +193.142.248.0 - 193.142.248.255 ro +193.142.250.0 - 193.142.250.255 ro +193.142.251.0 - 193.142.252.255 fi 193.143.0.0 - 193.143.0.255 ru -193.143.1.0 - 193.143.76.255 fi +193.143.4.0 - 193.143.5.255 fi +193.143.8.0 - 193.143.15.255 fi +193.143.19.0 - 193.143.19.255 fi +193.143.32.0 - 193.143.32.255 eu +193.143.33.0 - 193.143.63.255 fi +193.143.70.0 - 193.143.75.255 fi 193.143.77.0 - 193.143.77.255 pl -193.143.78.0 - 193.143.91.255 fi +193.143.79.0 - 193.143.91.255 fi 193.143.92.0 - 193.143.92.255 ru -193.143.93.0 - 193.143.97.255 fi +193.143.93.0 - 193.143.95.255 fi 193.143.98.0 - 193.143.98.255 ru 193.143.99.0 - 193.143.118.255 fi 193.143.119.0 - 193.143.119.255 ru 193.143.120.0 - 193.143.120.255 ro 193.143.121.0 - 193.143.121.255 pl 193.143.122.0 - 193.143.122.255 de -193.143.123.0 - 193.143.225.255 fi +193.143.124.0 - 193.143.223.255 fi +193.143.225.0 - 193.143.225.255 fi 193.143.226.0 - 193.143.226.255 tr -193.143.227.0 - 193.143.248.255 fi +193.143.228.0 - 193.143.247.255 fi 193.143.249.0 - 193.143.249.255 it -193.143.250.0 - 193.143.255.255 fi +193.143.252.0 - 193.143.255.255 fi 193.144.0.0 - 193.147.255.255 es 193.148.0.0 - 193.148.0.255 ro -193.148.1.0 - 193.148.5.255 es +193.148.2.0 - 193.148.4.255 es 193.148.6.0 - 193.148.7.255 fr -193.148.8.0 - 193.148.10.255 es -193.148.11.0 - 193.148.11.255 gb -193.148.12.0 - 193.148.14.255 es 193.148.15.0 - 193.148.15.255 ru -193.148.16.0 - 193.148.37.255 es +193.148.24.0 - 193.148.37.255 es 193.148.38.0 - 193.148.39.255 it -193.148.40.0 - 193.148.43.255 es 193.148.44.0 - 193.148.44.255 ru 193.148.45.0 - 193.148.45.255 be 193.148.46.0 - 193.148.46.255 sk -193.148.47.0 - 193.148.47.255 ru -193.148.48.0 - 193.148.55.255 ch -193.148.56.0 - 193.148.61.255 es -193.148.62.0 - 193.148.63.255 ch -193.148.64.0 - 193.148.159.255 es +193.148.96.0 - 193.148.159.255 es 193.148.160.0 - 193.148.191.255 de 193.148.192.0 - 193.149.7.255 es 193.149.8.0 - 193.149.15.255 de -193.149.16.0 - 193.149.31.255 es -193.149.32.0 - 193.149.47.63 de -193.149.47.64 - 193.149.47.255 ie -193.149.48.0 - 193.149.63.255 de -193.149.64.0 - 193.149.95.255 gb -193.149.96.0 - 193.149.127.255 fr +193.149.32.0 - 193.149.63.255 de +193.149.64.0 - 193.149.79.255 us +193.149.80.0 - 193.149.87.255 nl +193.149.88.0 - 193.149.95.255 ie +193.149.96.0 - 193.149.105.6 fr +193.149.105.7 - 193.149.105.7 eu +193.149.105.8 - 193.149.127.255 fr 193.149.128.0 - 193.149.191.255 dk -193.149.192.0 - 193.149.194.255 be -193.149.195.0 - 193.149.195.255 ch -193.149.196.0 - 193.149.207.255 be -193.149.208.0 - 193.149.213.255 ch -193.149.214.0 - 193.149.216.255 de -193.149.217.0 - 193.149.219.255 at -193.149.220.0 - 193.149.224.255 be -193.149.225.0 - 193.149.227.255 ch -193.149.228.0 - 193.149.231.255 be +193.149.192.0 - 193.149.199.255 eu +193.149.200.0 - 193.149.207.255 be +193.149.208.0 - 193.149.211.255 ch +193.149.212.0 - 193.149.231.255 eu 193.149.232.0 - 193.149.239.255 ch 193.149.240.0 - 193.149.255.255 be 193.150.0.0 - 193.150.1.255 ru @@ -92441,7 +82636,8 @@ 193.150.8.0 - 193.150.11.255 gb 193.150.12.0 - 193.150.15.255 cz 193.150.16.0 - 193.150.19.255 es -193.150.20.0 - 193.150.21.255 ch +193.150.20.0 - 193.150.20.255 ru +193.150.21.0 - 193.150.21.255 pl 193.150.22.0 - 193.150.23.255 no 193.150.24.0 - 193.150.25.255 cz 193.150.26.0 - 193.150.27.255 gb @@ -92461,7 +82657,7 @@ 193.150.60.0 - 193.150.63.255 it 193.150.64.0 - 193.150.64.255 de 193.150.65.0 - 193.150.65.255 ru -193.150.66.0 - 193.150.66.255 gb +193.150.66.0 - 193.150.66.255 se 193.150.67.0 - 193.150.67.255 bg 193.150.68.0 - 193.150.68.255 ru 193.150.69.0 - 193.150.69.255 pl @@ -92491,10 +82687,7 @@ 193.150.152.0 - 193.150.164.255 nl 193.150.165.0 - 193.150.165.255 pl 193.150.166.0 - 193.150.167.255 de -193.150.168.0 - 193.150.168.255 pl 193.150.169.0 - 193.150.169.255 fr -193.150.170.0 - 193.150.170.255 es -193.150.171.0 - 193.150.171.255 de 193.150.172.0 - 193.150.173.255 gr 193.150.174.0 - 193.150.179.255 at 193.150.180.0 - 193.150.191.255 gb @@ -92513,7 +82706,8 @@ 193.151.44.0 - 193.151.47.255 de 193.151.48.0 - 193.151.55.255 pl 193.151.56.0 - 193.151.59.255 ua -193.151.60.0 - 193.151.63.255 at +193.151.60.0 - 193.151.61.255 de +193.151.62.0 - 193.151.63.255 at 193.151.64.0 - 193.151.71.255 pl 193.151.72.0 - 193.151.75.255 nl 193.151.76.0 - 193.151.79.255 pl @@ -92527,96 +82721,91 @@ 193.151.112.0 - 193.151.115.255 pl 193.151.116.0 - 193.151.119.255 hu 193.151.120.0 - 193.151.127.255 gb -193.151.128.0 - 193.151.239.255 fr +193.151.128.0 - 193.151.159.255 ir +193.151.160.0 - 193.151.191.255 ua +193.151.192.0 - 193.151.239.255 ru 193.151.240.0 - 193.151.247.255 ua 193.151.248.0 - 193.151.251.255 de 193.151.252.0 - 193.151.255.255 ua 193.152.0.0 - 193.153.255.255 es -193.154.0.0 - 193.154.2.79 at -193.154.2.80 - 193.154.2.87 hu -193.154.2.88 - 193.154.255.255 at -193.155.0.0 - 193.155.236.31 de -193.155.236.32 - 193.155.236.39 pl -193.155.236.40 - 193.155.255.255 de -193.156.0.0 - 193.156.33.255 no -193.156.34.0 - 193.156.34.255 pk -193.156.35.0 - 193.157.255.255 no -193.158.0.0 - 193.158.56.31 de -193.158.56.32 - 193.158.56.39 pl -193.158.56.40 - 193.158.58.15 de -193.158.58.16 - 193.158.58.23 at -193.158.58.24 - 193.158.58.31 ch -193.158.58.32 - 193.158.58.39 at -193.158.58.40 - 193.158.58.47 nl -193.158.58.48 - 193.158.58.95 de -193.158.58.96 - 193.158.58.103 be -193.158.58.104 - 193.159.255.255 de +193.154.0.0 - 193.154.255.255 at +193.155.0.0 - 193.155.255.255 de +193.156.0.0 - 193.157.255.255 no +193.158.0.0 - 193.159.255.255 de 193.160.0.0 - 193.160.0.255 fr -193.160.1.0 - 193.160.11.255 no +193.160.1.0 - 193.160.7.255 no +193.160.9.0 - 193.160.9.255 no 193.160.12.0 - 193.160.13.255 ru -193.160.14.0 - 193.160.32.255 no -193.160.33.0 - 193.160.33.255 us +193.160.16.0 - 193.160.31.255 no +193.160.33.0 - 193.160.33.255 il 193.160.34.0 - 193.160.38.255 no 193.160.39.0 - 193.160.39.255 de -193.160.40.0 - 193.160.96.255 no +193.160.40.0 - 193.160.63.255 no 193.160.97.0 - 193.160.97.255 ua 193.160.98.0 - 193.160.99.255 at -193.160.100.0 - 193.160.130.255 no +193.160.103.0 - 193.160.127.255 no 193.160.131.0 - 193.160.131.255 ru -193.160.132.0 - 193.160.143.255 no -193.160.144.0 - 193.160.144.255 de -193.160.145.0 - 193.160.145.255 dk -193.160.146.0 - 193.160.157.255 no +193.160.132.0 - 193.160.133.255 no +193.160.136.0 - 193.160.139.255 no +193.160.148.0 - 193.160.151.255 no +193.160.156.0 - 193.160.157.255 no 193.160.158.0 - 193.160.158.255 ru -193.160.159.0 - 193.160.159.255 bg 193.160.160.0 - 193.160.203.255 no 193.160.204.0 - 193.160.205.255 ru -193.160.206.0 - 193.160.223.255 no +193.160.206.0 - 193.160.207.255 se 193.160.224.0 - 193.160.227.255 ua 193.160.228.0 - 193.160.231.255 ru -193.160.232.0 - 193.160.254.255 no +193.160.239.0 - 193.160.239.255 se +193.160.248.0 - 193.160.252.255 no 193.160.255.0 - 193.160.255.255 ru 193.161.0.0 - 193.161.0.255 ro -193.161.1.0 - 193.161.11.255 no 193.161.12.0 - 193.161.15.255 ua 193.161.16.0 - 193.161.83.255 no 193.161.84.0 - 193.161.87.255 cz -193.161.88.0 - 193.161.191.255 no +193.161.88.0 - 193.161.175.255 no +193.161.176.0 - 193.161.191.255 se 193.161.192.0 - 193.161.192.255 bg 193.161.193.0 - 193.161.193.255 ru -193.161.194.0 - 193.161.254.255 no -193.161.255.0 - 193.161.255.255 ua -193.162.0.0 - 193.162.73.255 dk -193.162.74.0 - 193.162.74.255 gb -193.162.75.0 - 193.163.255.255 dk +193.161.194.0 - 193.161.195.255 no +193.161.207.0 - 193.161.255.255 no +193.162.0.0 - 193.162.18.255 dk +193.162.19.0 - 193.162.19.255 us +193.162.20.0 - 193.162.20.255 dk +193.162.21.0 - 193.162.21.255 ap +193.162.22.0 - 193.162.25.255 dk +193.162.26.0 - 193.162.26.0 eu +193.162.26.1 - 193.162.26.14 dk +193.162.26.15 - 193.162.26.15 us +193.162.26.16 - 193.163.135.255 dk +193.163.136.0 - 193.163.136.255 eu +193.163.137.0 - 193.163.247.255 dk +193.163.248.0 - 193.163.248.29 eu +193.163.248.30 - 193.163.248.30 dk +193.163.248.31 - 193.163.248.255 eu +193.163.249.0 - 193.163.255.255 dk 193.164.0.0 - 193.164.0.255 pt -193.164.1.0 - 193.164.6.255 pl -193.164.7.0 - 193.164.7.255 nl 193.164.8.0 - 193.164.8.255 de 193.164.9.0 - 193.164.9.255 tr -193.164.10.0 - 193.164.11.255 gb +193.164.11.0 - 193.164.11.255 gb 193.164.12.0 - 193.164.12.255 fr 193.164.13.0 - 193.164.14.255 gb 193.164.15.0 - 193.164.15.255 at -193.164.16.0 - 193.164.31.255 pl 193.164.32.0 - 193.164.91.255 se 193.164.92.0 - 193.164.95.255 ua 193.164.96.0 - 193.164.128.255 gb 193.164.129.0 - 193.164.129.255 pl 193.164.130.0 - 193.164.130.255 ua -193.164.131.0 - 193.164.135.255 de -193.164.136.0 - 193.164.136.255 ro +193.164.131.0 - 193.164.133.255 de +193.164.136.0 - 193.164.136.127 si +193.164.136.128 - 193.164.136.255 ro 193.164.137.0 - 193.164.141.255 si 193.164.142.0 - 193.164.142.255 pl -193.164.143.0 - 193.164.143.255 gb +193.164.143.0 - 193.164.143.255 de 193.164.144.0 - 193.164.144.255 nl 193.164.145.0 - 193.164.145.255 ch 193.164.146.0 - 193.164.146.255 ru 193.164.147.0 - 193.164.147.255 es -193.164.148.0 - 193.164.148.255 fr -193.164.149.0 - 193.164.149.255 ua -193.164.150.0 - 193.164.151.255 fr -193.164.152.0 - 193.164.152.255 ro +193.164.148.0 - 193.164.151.255 fr 193.164.153.0 - 193.164.153.255 fr 193.164.154.0 - 193.164.154.255 de 193.164.155.0 - 193.164.155.255 dk @@ -92624,8 +82813,18 @@ 193.164.157.0 - 193.164.157.255 pl 193.164.158.0 - 193.164.158.255 be 193.164.159.0 - 193.164.159.255 de -193.164.160.0 - 193.164.163.231 gb -193.164.163.232 - 193.164.179.191 eu +193.164.160.0 - 193.164.161.255 gb +193.164.162.0 - 193.164.162.255 eu +193.164.163.0 - 193.164.163.23 gb +193.164.163.24 - 193.164.163.31 eu +193.164.163.32 - 193.164.163.87 gb +193.164.163.88 - 193.164.163.95 eu +193.164.163.96 - 193.164.163.119 gb +193.164.163.120 - 193.164.163.135 eu +193.164.163.136 - 193.164.163.143 gb +193.164.163.144 - 193.164.163.159 eu +193.164.163.160 - 193.164.163.255 gb +193.164.164.0 - 193.164.179.191 eu 193.164.179.192 - 193.164.180.191 gb 193.164.180.192 - 193.164.188.255 eu 193.164.189.0 - 193.164.189.255 gb @@ -92638,40 +82837,34 @@ 193.164.200.0 - 193.164.201.255 ru 193.164.202.0 - 193.164.203.255 fr 193.164.204.0 - 193.164.205.255 ru -193.164.206.0 - 193.164.209.255 gb +193.164.206.0 - 193.164.207.255 gb 193.164.210.0 - 193.164.211.255 lv 193.164.212.0 - 193.164.213.255 de 193.164.214.0 - 193.164.215.255 ru 193.164.216.0 - 193.164.217.255 nl 193.164.218.0 - 193.164.219.255 cz 193.164.220.0 - 193.164.221.255 us -193.164.222.0 - 193.164.223.255 bg 193.164.224.0 - 193.164.225.255 at 193.164.226.0 - 193.164.227.255 gr -193.164.228.0 - 193.164.232.95 fr -193.164.232.96 - 193.164.232.127 ua -193.164.232.128 - 193.164.232.159 ru -193.164.232.160 - 193.164.232.191 hr +193.164.228.0 - 193.164.232.127 fr +193.164.232.160 - 193.164.232.191 cy 193.164.232.192 - 193.164.232.223 fr -193.164.232.224 - 193.164.232.255 gb 193.164.233.0 - 193.164.233.255 ch 193.164.234.0 - 193.164.241.255 at 193.164.242.0 - 193.164.243.255 gb 193.164.244.0 - 193.164.245.255 ch 193.164.246.0 - 193.164.247.255 de -193.164.248.0 - 193.164.251.255 dk 193.164.252.0 - 193.164.253.255 gb 193.164.254.0 - 193.164.255.255 pl 193.165.0.0 - 193.165.255.255 cz 193.166.0.0 - 193.167.255.255 fi 193.168.0.0 - 193.168.0.255 de -193.168.1.0 - 193.168.5.255 lu +193.168.1.0 - 193.168.2.255 lu 193.168.6.0 - 193.168.7.255 de -193.168.8.0 - 193.168.49.255 lu +193.168.8.0 - 193.168.47.255 lu 193.168.50.0 - 193.168.50.255 fr -193.168.51.0 - 193.168.53.255 lu 193.168.54.0 - 193.168.54.255 pl -193.168.55.0 - 193.168.127.255 lu +193.168.56.0 - 193.168.127.255 lu 193.168.128.0 - 193.168.255.255 de 193.169.0.0 - 193.169.1.255 ru 193.169.2.0 - 193.169.3.255 ch @@ -92683,7 +82876,8 @@ 193.169.16.0 - 193.169.17.255 hu 193.169.18.0 - 193.169.19.255 pl 193.169.20.0 - 193.169.21.255 ro -193.169.22.0 - 193.169.29.255 ru +193.169.22.0 - 193.169.25.255 ru +193.169.28.0 - 193.169.29.255 ru 193.169.30.0 - 193.169.31.255 gi 193.169.32.0 - 193.169.39.255 ru 193.169.40.0 - 193.169.41.255 nl @@ -92691,7 +82885,8 @@ 193.169.44.0 - 193.169.45.255 ru 193.169.46.0 - 193.169.47.255 fr 193.169.48.0 - 193.169.49.255 si -193.169.50.0 - 193.169.51.255 eu +193.169.50.0 - 193.169.50.255 tr +193.169.51.0 - 193.169.51.255 nl 193.169.52.0 - 193.169.53.255 ru 193.169.54.0 - 193.169.55.255 de 193.169.56.0 - 193.169.57.255 it @@ -92717,7 +82912,6 @@ 193.169.100.0 - 193.169.101.255 fi 193.169.102.0 - 193.169.103.255 ru 193.169.104.0 - 193.169.105.255 il -193.169.106.0 - 193.169.107.255 ru 193.169.108.0 - 193.169.109.255 nl 193.169.110.0 - 193.169.111.255 ru 193.169.112.0 - 193.169.117.255 pl @@ -92744,7 +82938,6 @@ 193.169.164.0 - 193.169.165.255 se 193.169.166.0 - 193.169.167.255 lv 193.169.168.0 - 193.169.169.255 de -193.169.170.0 - 193.169.171.255 ro 193.169.172.0 - 193.169.179.255 ru 193.169.180.0 - 193.169.181.255 de 193.169.182.0 - 193.169.183.255 cz @@ -92764,7 +82957,6 @@ 193.169.212.0 - 193.169.213.255 de 193.169.214.0 - 193.169.215.255 ua 193.169.216.0 - 193.169.217.255 gb -193.169.218.0 - 193.169.219.255 ua 193.169.220.0 - 193.169.223.255 ru 193.169.224.0 - 193.169.225.255 gb 193.169.226.0 - 193.169.229.255 ru @@ -92772,71 +82964,63 @@ 193.169.232.0 - 193.169.233.255 pl 193.169.234.0 - 193.169.235.255 ru 193.169.236.0 - 193.169.237.255 gb -193.169.238.0 - 193.169.239.255 ru 193.169.240.0 - 193.169.241.255 ua 193.169.242.0 - 193.169.243.255 it -193.169.244.0 - 193.169.245.255 ua +193.169.244.0 - 193.169.245.255 nl 193.169.246.0 - 193.169.247.255 il -193.169.248.0 - 193.169.251.255 ru +193.169.248.0 - 193.169.249.255 ru 193.169.252.0 - 193.169.253.255 ua 193.169.254.0 - 193.169.255.255 gb 193.170.0.0 - 193.171.255.255 at -193.172.0.0 - 193.172.11.63 nl -193.172.11.64 - 193.172.11.79 bg -193.172.11.80 - 193.172.59.159 nl -193.172.59.160 - 193.172.59.175 bg -193.172.59.176 - 193.172.215.191 nl -193.172.215.192 - 193.172.215.223 bg -193.172.215.224 - 193.173.37.207 nl -193.173.37.208 - 193.173.37.223 bg -193.173.37.224 - 193.173.255.255 nl -193.174.0.0 - 193.174.3.255 de -193.174.4.0 - 193.174.4.255 it -193.174.5.0 - 193.175.194.127 de +193.172.0.0 - 193.172.18.255 nl +193.172.19.0 - 193.172.19.255 eu +193.172.20.0 - 193.172.149.255 nl +193.172.150.0 - 193.172.150.255 eu +193.172.151.0 - 193.173.255.255 nl +193.174.0.0 - 193.175.194.127 de 193.175.194.128 - 193.175.194.191 ua 193.175.194.192 - 193.175.255.255 de 193.176.0.0 - 193.176.0.255 pt -193.176.1.0 - 193.176.2.255 nl 193.176.3.0 - 193.176.3.255 gb -193.176.4.0 - 193.176.55.255 nl +193.176.4.0 - 193.176.15.255 nl +193.176.32.0 - 193.176.55.255 nl 193.176.56.0 - 193.176.60.255 gb -193.176.61.0 - 193.176.144.255 nl +193.176.61.0 - 193.176.61.255 nl +193.176.63.0 - 193.176.63.255 nl +193.176.96.0 - 193.176.111.255 nl +193.176.128.0 - 193.176.144.255 nl 193.176.145.0 - 193.176.145.255 ru 193.176.146.0 - 193.176.146.255 se -193.176.147.0 - 193.176.147.255 ua +193.176.147.0 - 193.176.147.255 ru 193.176.148.0 - 193.176.208.255 nl 193.176.209.0 - 193.176.209.255 fr -193.176.210.0 - 193.176.246.255 nl +193.176.216.0 - 193.176.239.255 nl 193.176.247.0 - 193.176.247.255 at 193.176.248.0 - 193.176.251.255 ua 193.176.252.0 - 193.176.252.255 ru -193.176.253.0 - 193.177.255.255 nl +193.176.253.0 - 193.176.253.255 nl +193.176.255.0 - 193.177.255.255 nl 193.178.0.0 - 193.178.31.255 ie 193.178.32.0 - 193.178.32.255 gb -193.178.33.0 - 193.178.33.255 ie 193.178.34.0 - 193.178.34.255 ua 193.178.35.0 - 193.178.35.255 se -193.178.36.0 - 193.178.42.255 ie -193.178.43.0 - 193.178.43.255 ch -193.178.44.0 - 193.178.59.255 ie +193.178.40.0 - 193.178.41.255 ie +193.178.53.0 - 193.178.53.255 ie 193.178.60.0 - 193.178.63.255 se -193.178.64.0 - 193.178.116.255 ie +193.178.64.0 - 193.178.111.255 ie +193.178.114.0 - 193.178.114.255 ie +193.178.116.0 - 193.178.116.255 ie 193.178.117.0 - 193.178.117.255 pl 193.178.118.0 - 193.178.118.255 ru 193.178.119.0 - 193.178.119.255 hu -193.178.120.0 - 193.178.123.255 gb -193.178.124.0 - 193.178.127.255 ua -193.178.128.0 - 193.178.130.255 se +193.178.129.0 - 193.178.130.255 se 193.178.131.0 - 193.178.131.255 ru 193.178.132.0 - 193.178.132.255 pl 193.178.133.0 - 193.178.133.255 fi 193.178.134.0 - 193.178.134.255 fr 193.178.135.0 - 193.178.135.255 ru -193.178.136.0 - 193.178.138.255 fr -193.178.139.0 - 193.178.139.255 gb -193.178.140.0 - 193.178.140.255 fr +193.178.136.0 - 193.178.140.255 fr 193.178.141.0 - 193.178.141.255 ro -193.178.142.0 - 193.178.142.255 de 193.178.143.0 - 193.178.143.255 pl 193.178.144.0 - 193.178.147.255 ua 193.178.148.0 - 193.178.149.255 at @@ -92854,41 +83038,34 @@ 193.178.166.0 - 193.178.166.255 bg 193.178.167.0 - 193.178.167.255 pl 193.178.168.0 - 193.178.168.255 hu -193.178.169.0 - 193.178.170.255 de 193.178.171.0 - 193.178.171.255 at -193.178.172.0 - 193.178.172.255 ua 193.178.173.0 - 193.178.173.255 gb -193.178.174.0 - 193.178.174.255 be 193.178.175.0 - 193.178.175.255 dk 193.178.176.0 - 193.178.183.255 lv 193.178.184.0 - 193.178.184.255 at 193.178.185.0 - 193.178.185.255 de -193.178.186.0 - 193.178.186.255 fr +193.178.186.0 - 193.178.186.255 nl 193.178.187.0 - 193.178.187.255 ua 193.178.188.0 - 193.178.188.255 si 193.178.189.0 - 193.178.189.255 nl 193.178.190.0 - 193.178.191.255 ua 193.178.192.0 - 193.178.195.255 lv -193.178.196.0 - 193.178.199.255 de 193.178.200.0 - 193.178.203.255 ir 193.178.204.0 - 193.178.207.255 it 193.178.208.0 - 193.178.208.255 at 193.178.209.0 - 193.178.209.255 be -193.178.210.0 - 193.178.212.255 fr +193.178.210.0 - 193.178.211.255 fr 193.178.213.0 - 193.178.214.255 pl -193.178.215.0 - 193.178.215.255 gb +193.178.215.0 - 193.178.215.255 ru 193.178.216.0 - 193.178.216.255 it 193.178.217.0 - 193.178.217.255 gb -193.178.218.0 - 193.178.218.255 tr 193.178.219.0 - 193.178.219.255 lu -193.178.220.0 - 193.178.220.255 il -193.178.221.0 - 193.178.221.255 se +193.178.221.0 - 193.178.221.255 ru 193.178.222.0 - 193.178.222.255 bg 193.178.223.0 - 193.178.223.255 gb 193.178.224.0 - 193.178.225.255 ro 193.178.226.0 - 193.178.227.255 de 193.178.228.0 - 193.178.229.255 ua -193.178.230.0 - 193.178.231.255 it 193.178.232.0 - 193.178.233.255 lv 193.178.234.0 - 193.178.235.255 it 193.178.236.0 - 193.178.237.255 ua @@ -92908,53 +83085,68 @@ 193.180.120.0 - 193.180.120.255 gb 193.180.121.0 - 193.180.121.255 se 193.180.122.0 - 193.180.122.255 it -193.180.123.0 - 193.180.176.255 se +193.180.123.0 - 193.180.123.255 dk +193.180.124.0 - 193.180.176.255 se 193.180.177.0 - 193.180.177.255 at 193.180.178.0 - 193.180.178.255 au 193.180.179.0 - 193.180.181.255 se 193.180.182.0 - 193.180.183.255 de 193.180.184.0 - 193.180.200.255 se 193.180.201.0 - 193.180.201.255 gb -193.180.202.0 - 193.180.235.255 se +193.180.202.0 - 193.180.216.255 se +193.180.217.0 - 193.180.217.255 us +193.180.218.0 - 193.180.219.255 se +193.180.220.0 - 193.180.223.255 nl +193.180.224.0 - 193.180.235.255 se 193.180.236.0 - 193.180.237.255 de 193.180.238.0 - 193.180.242.255 se 193.180.243.0 - 193.180.243.255 be 193.180.244.0 - 193.180.245.255 de -193.180.246.0 - 193.180.246.255 be -193.180.247.0 - 193.180.247.255 se +193.180.246.0 - 193.180.247.255 se 193.180.248.0 - 193.180.249.255 de 193.180.250.0 - 193.180.250.255 be 193.180.251.0 - 193.180.251.255 se 193.180.252.0 - 193.180.252.255 es -193.180.253.0 - 193.181.2.255 se -193.181.3.0 - 193.181.7.255 gb -193.181.8.0 - 193.181.14.255 se +193.180.253.0 - 193.180.254.255 se +193.180.255.0 - 193.180.255.255 fr +193.181.0.0 - 193.181.2.255 se +193.181.3.0 - 193.181.3.255 gb +193.181.4.0 - 193.181.12.255 se +193.181.13.0 - 193.181.13.255 dk +193.181.14.0 - 193.181.14.255 se 193.181.15.0 - 193.181.15.255 de -193.181.16.0 - 193.181.24.255 se +193.181.16.0 - 193.181.19.255 nl +193.181.20.0 - 193.181.24.255 se 193.181.25.0 - 193.181.25.255 no -193.181.26.0 - 193.181.26.255 se +193.181.26.0 - 193.181.26.255 us 193.181.27.0 - 193.181.27.255 no 193.181.28.0 - 193.181.29.255 se 193.181.30.0 - 193.181.30.255 gb -193.181.31.0 - 193.181.179.255 se -193.181.180.0 - 193.181.185.255 gb -193.181.186.0 - 193.181.239.255 se +193.181.31.0 - 193.181.177.255 se +193.181.178.0 - 193.181.179.255 nl +193.181.180.0 - 193.181.233.255 se +193.181.234.0 - 193.181.234.255 no +193.181.235.0 - 193.181.239.255 se 193.181.240.0 - 193.181.240.255 au 193.181.241.0 - 193.181.241.255 se -193.181.242.0 - 193.181.242.255 au +193.181.242.0 - 193.181.242.255 be 193.181.243.0 - 193.181.252.255 se 193.181.253.0 - 193.181.254.255 ca -193.181.255.0 - 193.182.2.255 se -193.182.3.0 - 193.182.3.255 gb -193.182.4.0 - 193.182.6.255 se -193.182.7.0 - 193.182.7.255 gb +193.181.255.0 - 193.181.255.255 no +193.182.0.0 - 193.182.3.255 se +193.182.4.0 - 193.182.5.255 nl +193.182.6.0 - 193.182.7.255 se 193.182.8.0 - 193.182.15.255 us -193.182.16.0 - 193.182.117.255 se +193.182.16.0 - 193.182.17.255 it +193.182.18.0 - 193.182.21.255 se +193.182.22.0 - 193.182.23.255 de +193.182.24.0 - 193.182.117.255 se 193.182.118.0 - 193.182.119.255 de 193.182.120.0 - 193.182.120.255 ca 193.182.121.0 - 193.182.121.255 se 193.182.122.0 - 193.182.122.255 nl -193.182.123.0 - 193.182.145.255 se +193.182.123.0 - 193.182.143.255 se +193.182.144.0 - 193.182.145.255 il 193.182.146.0 - 193.182.146.255 gb 193.182.147.0 - 193.182.147.255 se 193.182.148.0 - 193.182.151.255 fr @@ -92987,39 +83179,40 @@ 193.183.45.0 - 193.183.45.255 gb 193.183.46.0 - 193.183.56.255 se 193.183.57.0 - 193.183.58.255 ch -193.183.59.0 - 193.183.134.255 se +193.183.59.0 - 193.183.63.255 se +193.183.64.0 - 193.183.67.255 de +193.183.68.0 - 193.183.71.255 se +193.183.72.0 - 193.183.73.255 de +193.183.74.0 - 193.183.75.255 se +193.183.76.0 - 193.183.77.255 fi +193.183.78.0 - 193.183.81.255 se +193.183.82.0 - 193.183.82.255 nl +193.183.83.0 - 193.183.85.255 se +193.183.86.0 - 193.183.87.255 de +193.183.88.0 - 193.183.97.255 se +193.183.98.0 - 193.183.99.255 it +193.183.100.0 - 193.183.103.255 fr +193.183.104.0 - 193.183.107.255 se +193.183.108.0 - 193.183.111.255 de +193.183.112.0 - 193.183.119.255 se +193.183.120.0 - 193.183.123.255 fr +193.183.124.0 - 193.183.134.255 se 193.183.135.0 - 193.183.135.255 dk 193.183.136.0 - 193.183.137.255 de 193.183.138.0 - 193.183.138.255 dk 193.183.139.0 - 193.183.139.255 us 193.183.140.0 - 193.183.143.255 se -193.183.144.0 - 193.183.144.255 hk +193.183.144.0 - 193.183.144.255 ap 193.183.145.0 - 193.183.154.255 se 193.183.155.0 - 193.183.155.255 us 193.183.156.0 - 193.183.165.255 se 193.183.166.0 - 193.183.169.255 es -193.183.170.0 - 193.183.182.255 se +193.183.170.0 - 193.183.171.255 se +193.183.172.0 - 193.183.173.255 gb +193.183.174.0 - 193.183.182.255 se 193.183.183.0 - 193.183.184.255 fr 193.183.185.0 - 193.183.255.255 se -193.184.0.0 - 193.184.1.67 fi -193.184.1.68 - 193.184.1.71 ax -193.184.1.72 - 193.184.87.59 fi -193.184.87.60 - 193.184.87.63 ax -193.184.87.64 - 193.184.247.167 fi -193.184.247.168 - 193.184.247.171 ax -193.184.247.172 - 193.185.67.11 fi -193.185.67.12 - 193.185.67.15 ax -193.185.67.16 - 193.185.67.71 fi -193.185.67.72 - 193.185.67.75 ax -193.185.67.76 - 193.185.220.31 fi -193.185.220.32 - 193.185.220.47 se -193.185.220.48 - 193.185.236.191 fi -193.185.236.192 - 193.185.236.223 ax -193.185.236.224 - 193.185.237.63 fi -193.185.237.64 - 193.185.237.127 se -193.185.237.128 - 193.185.253.167 fi -193.185.253.168 - 193.185.253.171 ax -193.185.253.172 - 193.185.255.255 fi +193.184.0.0 - 193.185.255.255 fi 193.186.0.0 - 193.186.0.255 at 193.186.1.0 - 193.186.1.255 ru 193.186.2.0 - 193.186.2.255 il @@ -93029,9 +83222,9 @@ 193.186.7.0 - 193.186.7.255 de 193.186.8.0 - 193.186.8.255 fr 193.186.9.0 - 193.186.9.255 ua -193.186.10.0 - 193.186.11.255 ro +193.186.10.0 - 193.186.10.255 ro 193.186.12.0 - 193.186.12.255 de -193.186.13.0 - 193.186.14.255 gb +193.186.13.0 - 193.186.13.255 gb 193.186.15.0 - 193.186.15.255 ua 193.186.16.0 - 193.186.31.255 at 193.186.32.0 - 193.186.32.255 hu @@ -93041,26 +83234,39 @@ 193.186.36.0 - 193.186.37.255 nl 193.186.38.0 - 193.186.38.255 bg 193.186.39.0 - 193.186.39.255 pl -193.186.40.0 - 193.186.161.255 at +193.186.40.0 - 193.186.159.255 at +193.186.161.0 - 193.186.161.255 at 193.186.162.0 - 193.186.162.255 gb 193.186.163.0 - 193.186.163.255 gr -193.186.164.0 - 193.186.207.255 at +193.186.164.0 - 193.186.191.255 at 193.186.208.0 - 193.186.208.255 tr 193.186.209.0 - 193.186.209.255 at 193.186.210.0 - 193.186.210.255 gb -193.186.211.0 - 193.186.254.255 at +193.186.212.0 - 193.186.252.255 at +193.186.254.0 - 193.186.254.255 at 193.186.255.0 - 193.186.255.255 pl 193.187.0.0 - 193.187.0.255 eu -193.187.1.0 - 193.187.254.255 at +193.187.2.0 - 193.187.51.255 at +193.187.52.0 - 193.187.53.255 pl +193.187.54.0 - 193.187.54.255 lb +193.187.55.0 - 193.187.55.255 gb +193.187.56.0 - 193.187.63.255 sk +193.187.64.0 - 193.187.71.255 pl +193.187.72.0 - 193.187.72.255 gb +193.187.73.0 - 193.187.73.255 ru +193.187.74.0 - 193.187.75.255 it +193.187.76.0 - 193.187.76.255 ua +193.187.77.0 - 193.187.77.255 de +193.187.78.0 - 193.187.79.255 ua +193.187.80.0 - 193.187.83.255 ru +193.187.84.0 - 193.187.159.255 at +193.187.192.0 - 193.187.254.255 at 193.187.255.0 - 193.187.255.255 ru 193.188.0.0 - 193.188.0.255 pl -193.188.1.0 - 193.188.3.255 sa 193.188.4.0 - 193.188.5.255 gb 193.188.6.0 - 193.188.6.255 ae 193.188.7.0 - 193.188.7.255 ma -193.188.8.0 - 193.188.11.255 om 193.188.12.0 - 193.188.13.255 bh -193.188.14.0 - 193.188.31.255 sa 193.188.32.0 - 193.188.47.255 mt 193.188.48.0 - 193.188.63.255 kw 193.188.64.0 - 193.188.95.255 jo @@ -93072,31 +83278,29 @@ 193.188.134.112 - 193.188.134.119 ch 193.188.134.120 - 193.188.134.127 se 193.188.134.128 - 193.188.134.135 dk +193.188.134.144 - 193.188.134.159 fr 193.188.134.160 - 193.188.134.167 pl -193.188.134.192 - 193.188.134.255 gb +193.188.134.168 - 193.188.134.199 cy 193.188.135.0 - 193.188.136.255 lb 193.188.137.0 - 193.188.137.255 hu -193.188.138.0 - 193.188.139.255 lb 193.188.140.0 - 193.188.141.255 hu 193.188.142.0 - 193.188.153.255 kw 193.188.154.0 - 193.188.155.255 de 193.188.156.0 - 193.188.157.255 se 193.188.158.0 - 193.188.159.255 de 193.188.160.0 - 193.188.191.255 kw -193.188.192.0 - 193.188.194.255 hu -193.188.195.0 - 193.188.195.255 gb +193.188.192.0 - 193.188.195.255 hu 193.188.196.0 - 193.188.197.255 de 193.188.198.0 - 193.188.199.255 pl -193.188.200.0 - 193.188.200.255 sa -193.188.201.0 - 193.188.203.255 se +193.188.200.0 - 193.188.203.255 se 193.188.204.0 - 193.188.207.255 gb -193.188.208.0 - 193.188.223.255 at +193.188.208.0 - 193.188.212.255 at +193.188.213.0 - 193.188.213.255 ap +193.188.214.0 - 193.188.223.255 at 193.188.224.0 - 193.188.247.255 ch 193.188.248.0 - 193.188.248.255 se 193.188.249.0 - 193.188.249.255 fr 193.188.250.0 - 193.188.250.255 de -193.188.251.0 - 193.188.251.255 fr -193.188.252.0 - 193.188.252.255 jo 193.188.253.0 - 193.188.253.255 pl 193.188.254.0 - 193.188.254.255 ua 193.188.255.0 - 193.188.255.255 fr @@ -93110,22 +83314,20 @@ 193.189.78.0 - 193.189.79.255 de 193.189.80.0 - 193.189.81.255 gb 193.189.82.0 - 193.189.83.255 de -193.189.84.0 - 193.189.85.255 at 193.189.86.0 - 193.189.87.255 lt 193.189.88.0 - 193.189.89.255 ru -193.189.90.0 - 193.189.91.255 fr 193.189.92.0 - 193.189.93.255 dk 193.189.94.0 - 193.189.95.255 de 193.189.96.0 - 193.189.97.255 ua 193.189.98.0 - 193.189.99.255 ro -193.189.100.0 - 193.189.101.255 de -193.189.102.0 - 193.189.103.255 nl +193.189.100.0 - 193.189.101.255 se +193.189.102.0 - 193.189.102.255 nl +193.189.103.0 - 193.189.103.255 pl 193.189.104.0 - 193.189.105.255 fr 193.189.106.0 - 193.189.111.255 de 193.189.112.0 - 193.189.113.255 it 193.189.114.0 - 193.189.115.255 de 193.189.116.0 - 193.189.117.255 pl -193.189.118.0 - 193.189.119.255 no 193.189.120.0 - 193.189.121.255 ru 193.189.122.0 - 193.189.123.255 ir 193.189.124.0 - 193.189.125.255 fr @@ -93135,39 +83337,28 @@ 193.189.134.0 - 193.189.134.255 nl 193.189.135.0 - 193.189.135.255 be 193.189.136.0 - 193.189.136.255 at -193.189.137.0 - 193.189.137.255 de -193.189.138.0 - 193.189.139.255 nl +193.189.137.0 - 193.189.137.255 si +193.189.138.0 - 193.189.138.255 ru +193.189.139.0 - 193.189.139.255 nl 193.189.140.0 - 193.189.141.255 gb 193.189.142.0 - 193.189.142.255 tr 193.189.143.0 - 193.189.143.255 fr 193.189.144.0 - 193.189.144.255 lt -193.189.145.0 - 193.189.145.255 no 193.189.146.0 - 193.189.146.255 at 193.189.147.0 - 193.189.147.255 be 193.189.148.0 - 193.189.148.255 jo 193.189.149.0 - 193.189.149.255 nl 193.189.150.0 - 193.189.159.255 de -193.189.160.0 - 193.189.177.31 si -193.189.177.32 - 193.189.177.47 at -193.189.177.48 - 193.189.191.255 si -193.189.192.0 - 193.189.212.255 ch -193.189.213.0 - 193.189.213.7 de -193.189.213.8 - 193.189.223.255 ch -193.189.224.0 - 193.189.244.127 de -193.189.244.128 - 193.189.244.143 at -193.189.244.144 - 193.189.255.255 de +193.189.160.0 - 193.189.191.255 si +193.189.192.0 - 193.189.223.255 ch +193.189.224.0 - 193.189.255.255 de 193.190.0.0 - 193.191.255.255 be 193.192.0.0 - 193.192.0.255 nl -193.192.1.0 - 193.192.11.255 pt -193.192.12.0 - 193.192.12.127 ie -193.192.12.128 - 193.192.12.255 at +193.192.4.0 - 193.192.11.255 pt +193.192.12.128 - 193.192.12.255 cy 193.192.13.0 - 193.192.13.255 gb 193.192.14.0 - 193.192.14.255 de -193.192.15.0 - 193.192.15.31 ie -193.192.15.32 - 193.192.15.63 nl 193.192.15.64 - 193.192.15.127 hr -193.192.15.128 - 193.192.15.191 ru -193.192.15.192 - 193.192.15.255 no 193.192.16.0 - 193.192.31.255 ch 193.192.32.0 - 193.192.35.255 gb 193.192.36.0 - 193.192.37.255 ua @@ -93184,20 +83375,17 @@ 193.192.64.0 - 193.192.95.255 gb 193.192.96.0 - 193.192.127.255 tr 193.192.128.0 - 193.192.159.255 ru -193.192.160.0 - 193.192.188.255 pl -193.192.189.0 - 193.192.189.255 us -193.192.190.0 - 193.192.191.255 pl +193.192.160.0 - 193.192.191.255 pl 193.192.192.0 - 193.192.223.255 gb 193.192.224.0 - 193.192.255.255 ch 193.193.0.0 - 193.193.31.255 it -193.193.32.0 - 193.193.63.255 eu +193.193.32.0 - 193.193.36.255 gb +193.193.37.0 - 193.193.63.255 eu 193.193.64.0 - 193.193.95.255 pl 193.193.96.0 - 193.193.127.255 gb 193.193.128.0 - 193.193.159.255 ch -193.193.160.0 - 193.193.160.255 no 193.193.161.0 - 193.193.161.255 nl -193.193.162.0 - 193.193.164.255 bg -193.193.165.0 - 193.193.165.255 nl +193.193.165.0 - 193.193.165.255 ua 193.193.166.0 - 193.193.167.255 de 193.193.168.0 - 193.193.168.255 pl 193.193.169.0 - 193.193.169.255 gb @@ -93206,7 +83394,6 @@ 193.193.172.0 - 193.193.173.255 it 193.193.174.0 - 193.193.180.255 de 193.193.181.0 - 193.193.181.255 pl -193.193.182.0 - 193.193.182.255 bg 193.193.183.0 - 193.193.183.255 it 193.193.184.0 - 193.193.185.255 gr 193.193.186.0 - 193.193.187.255 ru @@ -93232,22 +83419,16 @@ 193.194.123.0 - 193.194.123.255 pl 193.194.124.0 - 193.194.127.255 ua 193.194.128.0 - 193.194.128.255 gh -193.194.129.0 - 193.194.129.255 it -193.194.130.0 - 193.194.131.255 ro +193.194.129.0 - 193.194.129.255 eu 193.194.132.0 - 193.194.135.255 fr -193.194.136.0 - 193.194.137.255 de +193.194.136.0 - 193.194.136.255 de 193.194.138.0 - 193.194.139.255 ch 193.194.140.0 - 193.194.141.255 bg -193.194.142.0 - 193.194.145.255 de +193.194.144.0 - 193.194.145.255 de 193.194.146.0 - 193.194.146.255 at -193.194.147.0 - 193.194.147.175 gb -193.194.147.176 - 193.194.147.191 ie -193.194.147.192 - 193.194.147.255 gb 193.194.148.0 - 193.194.149.255 de -193.194.150.0 - 193.194.151.255 gb 193.194.152.0 - 193.194.152.255 fr 193.194.153.0 - 193.194.154.255 ru -193.194.155.0 - 193.194.155.255 pt 193.194.156.0 - 193.194.156.255 bg 193.194.157.0 - 193.194.157.255 de 193.194.158.0 - 193.194.158.255 be @@ -93256,34 +83437,24 @@ 193.194.192.0 - 193.194.255.255 se 193.195.0.0 - 193.195.255.255 gb 193.196.0.0 - 193.197.255.255 de -193.198.0.0 - 193.198.40.255 hr -193.198.41.0 - 193.198.41.31 ba -193.198.41.32 - 193.198.255.255 hr +193.198.0.0 - 193.198.255.255 hr 193.199.0.0 - 193.199.255.255 fi -193.200.0.0 - 193.200.0.255 si -193.200.1.0 - 193.200.2.255 bg 193.200.3.0 - 193.200.3.255 it 193.200.4.0 - 193.200.4.255 fr 193.200.5.0 - 193.200.5.255 ch 193.200.6.0 - 193.200.6.255 at 193.200.7.0 - 193.200.7.255 es -193.200.8.0 - 193.200.8.255 bg 193.200.9.0 - 193.200.9.255 sk 193.200.10.0 - 193.200.10.255 ru 193.200.11.0 - 193.200.11.255 se -193.200.12.0 - 193.200.12.255 bg -193.200.13.0 - 193.200.13.255 vg -193.200.14.0 - 193.200.17.255 bg +193.200.14.0 - 193.200.15.255 bg 193.200.18.0 - 193.200.18.255 ru 193.200.19.0 - 193.200.19.255 ro 193.200.20.0 - 193.200.20.255 pl 193.200.21.0 - 193.200.21.255 ru 193.200.22.0 - 193.200.22.255 ua 193.200.23.0 - 193.200.23.255 be -193.200.24.0 - 193.200.24.255 bg 193.200.25.0 - 193.200.25.255 gb -193.200.26.0 - 193.200.26.255 dk -193.200.27.0 - 193.200.27.255 gb 193.200.28.0 - 193.200.28.255 bg 193.200.29.0 - 193.200.29.255 fr 193.200.30.0 - 193.200.30.255 il @@ -93295,20 +83466,14 @@ 193.200.42.0 - 193.200.43.255 fr 193.200.44.0 - 193.200.45.255 dk 193.200.46.0 - 193.200.47.255 pl -193.200.48.0 - 193.200.49.255 ch 193.200.50.0 - 193.200.51.255 pl -193.200.52.0 - 193.200.53.255 fr 193.200.54.0 - 193.200.55.255 ru -193.200.56.0 - 193.200.57.255 nl 193.200.58.0 - 193.200.59.255 fr 193.200.60.0 - 193.200.61.255 be -193.200.62.0 - 193.200.63.255 ru 193.200.64.0 - 193.200.65.255 ua 193.200.66.0 - 193.200.67.255 pl 193.200.68.0 - 193.200.69.255 ua 193.200.70.0 - 193.200.71.255 nl -193.200.72.0 - 193.200.73.255 de -193.200.74.0 - 193.200.75.255 se 193.200.76.0 - 193.200.77.255 ua 193.200.78.0 - 193.200.79.255 ch 193.200.80.0 - 193.200.81.255 gb @@ -93319,9 +83484,7 @@ 193.200.90.0 - 193.200.91.255 dk 193.200.92.0 - 193.200.93.255 no 193.200.94.0 - 193.200.95.255 ru -193.200.96.0 - 193.200.97.255 de -193.200.98.0 - 193.200.101.255 gb -193.200.102.0 - 193.200.103.255 ro +193.200.96.0 - 193.200.103.255 gb 193.200.104.0 - 193.200.105.255 dk 193.200.106.0 - 193.200.107.255 de 193.200.108.0 - 193.200.109.255 pl @@ -93334,11 +83497,9 @@ 193.200.126.0 - 193.200.127.255 ro 193.200.128.0 - 193.200.128.255 de 193.200.129.0 - 193.200.129.255 ru -193.200.130.0 - 193.200.130.255 am 193.200.131.0 - 193.200.131.255 lv 193.200.132.0 - 193.200.132.255 nl 193.200.133.0 - 193.200.133.255 pl -193.200.134.0 - 193.200.134.255 tr 193.200.135.0 - 193.200.135.255 be 193.200.136.0 - 193.200.136.255 hu 193.200.137.0 - 193.200.138.255 de @@ -93352,26 +83513,20 @@ 193.200.146.0 - 193.200.146.255 pl 193.200.147.0 - 193.200.147.255 nl 193.200.148.0 - 193.200.148.255 se -193.200.149.0 - 193.200.149.255 ru 193.200.150.0 - 193.200.150.255 eu 193.200.151.0 - 193.200.151.255 ua -193.200.152.0 - 193.200.152.255 hu 193.200.153.0 - 193.200.153.255 nl 193.200.154.0 - 193.200.154.255 de 193.200.155.0 - 193.200.155.255 ie 193.200.156.0 - 193.200.156.255 de 193.200.157.0 - 193.200.157.255 ch 193.200.158.0 - 193.200.158.255 gb -193.200.159.0 - 193.200.159.255 ch 193.200.160.0 - 193.200.160.255 de 193.200.161.0 - 193.200.161.255 ua 193.200.162.0 - 193.200.162.255 de -193.200.163.0 - 193.200.163.255 pl 193.200.164.0 - 193.200.164.255 nl 193.200.165.0 - 193.200.166.255 ro -193.200.167.0 - 193.200.167.255 ua 193.200.168.0 - 193.200.168.255 ru -193.200.169.0 - 193.200.169.255 ua 193.200.170.0 - 193.200.170.255 tr 193.200.171.0 - 193.200.171.255 fr 193.200.172.0 - 193.200.172.255 de @@ -93382,7 +83537,7 @@ 193.200.178.0 - 193.200.178.255 nl 193.200.179.0 - 193.200.179.255 ua 193.200.180.0 - 193.200.180.255 tr -193.200.181.0 - 193.200.182.255 fr +193.200.182.0 - 193.200.182.255 fr 193.200.183.0 - 193.200.183.255 ua 193.200.184.0 - 193.200.184.255 fr 193.200.185.0 - 193.200.185.255 be @@ -93392,9 +83547,7 @@ 193.200.190.0 - 193.200.190.255 ua 193.200.191.0 - 193.200.192.255 gb 193.200.193.0 - 193.200.193.255 de -193.200.194.0 - 193.200.194.255 es 193.200.195.0 - 193.200.195.255 de -193.200.196.0 - 193.200.196.255 jo 193.200.197.0 - 193.200.197.255 pl 193.200.198.0 - 193.200.198.255 nl 193.200.199.0 - 193.200.199.255 ru @@ -93414,11 +83567,9 @@ 193.200.213.0 - 193.200.213.255 it 193.200.214.0 - 193.200.214.255 nl 193.200.215.0 - 193.200.216.255 pl -193.200.217.0 - 193.200.217.255 ch 193.200.218.0 - 193.200.218.255 de 193.200.219.0 - 193.200.219.255 ua 193.200.220.0 - 193.200.220.255 ch -193.200.221.0 - 193.200.221.255 ru 193.200.222.0 - 193.200.222.255 fr 193.200.223.0 - 193.200.223.255 ch 193.200.224.0 - 193.200.224.255 lv @@ -93431,25 +83582,20 @@ 193.200.232.0 - 193.200.234.255 pl 193.200.235.0 - 193.200.235.255 no 193.200.236.0 - 193.200.236.255 ch -193.200.237.0 - 193.200.237.255 de -193.200.238.0 - 193.200.238.255 ru -193.200.239.0 - 193.200.239.255 ua +193.200.237.0 - 193.200.237.255 bg +193.200.239.0 - 193.200.239.255 ru 193.200.240.0 - 193.200.241.255 de 193.200.242.0 - 193.200.242.255 ro 193.200.243.0 - 193.200.243.255 es -193.200.244.0 - 193.200.244.255 ro 193.200.245.0 - 193.200.245.255 gb -193.200.246.0 - 193.200.246.255 ua 193.200.247.0 - 193.200.247.255 sa 193.200.248.0 - 193.200.248.255 ua 193.200.249.0 - 193.200.249.255 de 193.200.250.0 - 193.200.250.255 dk -193.200.251.0 - 193.200.251.255 ru -193.200.252.0 - 193.200.252.255 ro 193.200.253.0 - 193.200.253.255 de -193.200.254.0 - 193.200.254.255 at +193.200.254.0 - 193.200.254.255 ro 193.200.255.0 - 193.200.255.255 ua -193.201.0.0 - 193.201.7.255 it +193.201.0.0 - 193.201.7.255 fr 193.201.8.0 - 193.201.15.255 de 193.201.16.0 - 193.201.17.255 se 193.201.18.0 - 193.201.19.255 pl @@ -93462,9 +83608,7 @@ 193.201.32.0 - 193.201.32.255 lt 193.201.33.0 - 193.201.33.255 ch 193.201.34.0 - 193.201.34.255 pl -193.201.35.0 - 193.201.35.255 dk 193.201.36.0 - 193.201.36.255 pl -193.201.37.0 - 193.201.38.255 de 193.201.39.0 - 193.201.39.255 dk 193.201.40.0 - 193.201.40.255 it 193.201.41.0 - 193.201.41.255 at @@ -93472,17 +83616,14 @@ 193.201.43.0 - 193.201.43.255 se 193.201.44.0 - 193.201.44.255 ro 193.201.45.0 - 193.201.45.255 si -193.201.46.0 - 193.201.46.255 gr 193.201.47.0 - 193.201.47.255 gb 193.201.48.0 - 193.201.51.255 nl 193.201.52.0 - 193.201.55.255 de -193.201.56.0 - 193.201.59.255 it 193.201.60.0 - 193.201.63.255 ua 193.201.64.0 - 193.201.65.255 gb 193.201.66.0 - 193.201.67.255 lv 193.201.68.0 - 193.201.69.255 be 193.201.70.0 - 193.201.71.255 gb -193.201.72.0 - 193.201.73.255 de 193.201.74.0 - 193.201.75.255 no 193.201.76.0 - 193.201.77.255 fr 193.201.78.0 - 193.201.79.255 cz @@ -93491,69 +83632,59 @@ 193.201.88.0 - 193.201.91.255 ru 193.201.92.0 - 193.201.95.255 de 193.201.96.0 - 193.201.97.255 se -193.201.98.0 - 193.201.100.255 ua +193.201.98.0 - 193.201.98.255 ua +193.201.100.0 - 193.201.100.255 ua 193.201.101.0 - 193.201.101.255 si 193.201.102.0 - 193.201.102.255 at 193.201.103.0 - 193.201.103.255 fr 193.201.104.0 - 193.201.104.255 nl +193.201.105.0 - 193.201.105.255 ua 193.201.106.0 - 193.201.106.255 at 193.201.107.0 - 193.201.108.255 es 193.201.109.0 - 193.201.109.255 si 193.201.110.0 - 193.201.110.255 cz 193.201.111.0 - 193.201.111.255 ru -193.201.112.0 - 193.201.113.255 de -193.201.114.0 - 193.201.115.255 bg 193.201.116.0 - 193.201.117.255 ua 193.201.118.0 - 193.201.119.255 ru 193.201.120.0 - 193.201.121.255 gb 193.201.122.0 - 193.201.123.255 ch 193.201.124.0 - 193.201.125.255 gb -193.201.126.0 - 193.201.127.255 ru 193.201.128.0 - 193.201.131.255 cy 193.201.132.0 - 193.201.135.255 gb 193.201.136.0 - 193.201.139.255 pl -193.201.140.0 - 193.201.143.255 ua +193.201.140.0 - 193.201.143.255 bg 193.201.144.0 - 193.201.144.127 pl 193.201.144.128 - 193.201.145.127 fi -193.201.145.128 - 193.201.145.255 se 193.201.146.0 - 193.201.146.127 fr 193.201.146.128 - 193.201.146.255 ro 193.201.147.0 - 193.201.147.63 se 193.201.147.64 - 193.201.147.95 nl 193.201.147.96 - 193.201.147.127 fr 193.201.147.128 - 193.201.147.159 ua -193.201.147.160 - 193.201.147.191 ch -193.201.147.192 - 193.201.147.255 gb -193.201.148.0 - 193.201.148.127 de -193.201.148.128 - 193.201.148.191 gb +193.201.147.160 - 193.201.147.191 cy +193.201.147.224 - 193.201.147.255 gb +193.201.148.0 - 193.201.148.63 cy +193.201.148.64 - 193.201.148.127 de 193.201.148.192 - 193.201.148.255 nl -193.201.149.0 - 193.201.149.63 fr 193.201.149.64 - 193.201.149.127 pl -193.201.149.128 - 193.201.149.191 lv -193.201.149.192 - 193.201.149.255 tr +193.201.149.192 - 193.201.149.255 cy 193.201.150.0 - 193.201.150.63 gb -193.201.150.128 - 193.201.150.191 fi -193.201.150.192 - 193.201.150.255 ua -193.201.151.0 - 193.201.151.63 fr -193.201.151.64 - 193.201.151.127 af -193.201.151.128 - 193.201.151.191 ru +193.201.150.64 - 193.201.150.191 cy +193.201.151.0 - 193.201.151.63 cy 193.201.151.192 - 193.201.151.255 de 193.201.152.0 - 193.201.152.127 ru 193.201.152.128 - 193.201.152.255 ua 193.201.153.0 - 193.201.154.127 gb 193.201.154.128 - 193.201.154.255 ro -193.201.155.0 - 193.201.155.127 si 193.201.155.128 - 193.201.155.255 il 193.201.156.0 - 193.201.156.127 ua 193.201.156.128 - 193.201.156.255 se -193.201.157.0 - 193.201.157.127 tr -193.201.157.128 - 193.201.157.255 gb -193.201.158.128 - 193.201.158.255 li -193.201.159.0 - 193.201.159.127 fi +193.201.157.0 - 193.201.157.127 cy +193.201.158.0 - 193.201.158.255 ro 193.201.159.128 - 193.201.159.255 ru 193.201.160.0 - 193.201.160.255 gb 193.201.161.0 - 193.201.161.255 ro -193.201.162.0 - 193.201.162.255 be +193.201.162.0 - 193.201.162.255 nl 193.201.163.0 - 193.201.163.255 gb 193.201.164.0 - 193.201.164.255 pl 193.201.165.0 - 193.201.165.255 si @@ -93566,14 +83697,11 @@ 193.201.175.0 - 193.201.175.255 ua 193.201.176.0 - 193.201.183.255 de 193.201.184.0 - 193.201.191.255 gb -193.201.192.0 - 193.201.193.255 ua -193.201.194.0 - 193.201.195.255 fr 193.201.196.0 - 193.201.197.255 gb 193.201.198.0 - 193.201.199.255 ua 193.201.200.0 - 193.201.201.255 gb -193.201.202.0 - 193.201.203.255 de 193.201.204.0 - 193.201.205.255 gb -193.201.206.0 - 193.201.211.255 ua +193.201.206.0 - 193.201.207.255 ua 193.201.212.0 - 193.201.215.255 si 193.201.216.0 - 193.201.219.255 ua 193.201.220.0 - 193.201.223.255 no @@ -93582,30 +83710,24 @@ 193.201.232.0 - 193.201.235.255 ro 193.201.236.0 - 193.201.239.255 de 193.201.240.0 - 193.201.243.255 bg -193.201.244.0 - 193.201.247.255 dk -193.201.248.0 - 193.201.251.255 fr -193.201.252.0 - 193.201.255.255 us -193.202.0.0 - 193.202.0.255 de +193.201.252.0 - 193.201.255.255 eu +193.202.0.0 - 193.202.0.255 be 193.202.1.0 - 193.202.7.255 gb -193.202.8.0 - 193.202.15.255 be 193.202.16.0 - 193.202.16.255 de 193.202.17.0 - 193.202.17.255 be 193.202.18.0 - 193.202.18.255 tr -193.202.19.0 - 193.202.19.255 ua +193.202.19.0 - 193.202.19.255 dk 193.202.20.0 - 193.202.20.255 de 193.202.21.0 - 193.202.21.255 ua 193.202.22.0 - 193.202.22.255 ro 193.202.23.0 - 193.202.23.255 nl -193.202.24.0 - 193.202.30.255 de -193.202.31.0 - 193.202.31.255 gb +193.202.24.0 - 193.202.31.255 de 193.202.32.0 - 193.202.39.255 nl -193.202.40.0 - 193.202.45.255 eu 193.202.46.0 - 193.202.61.255 ch 193.202.62.0 - 193.202.63.255 gb 193.202.64.0 - 193.202.73.255 be -193.202.74.0 - 193.202.79.255 fr -193.202.80.0 - 193.202.90.255 ch -193.202.91.0 - 193.202.95.255 fr +193.202.76.0 - 193.202.79.255 fr +193.202.88.0 - 193.202.95.255 fr 193.202.96.0 - 193.202.104.255 nl 193.202.105.0 - 193.202.106.255 gb 193.202.107.0 - 193.202.107.255 nl @@ -93613,7 +83735,6 @@ 193.202.109.0 - 193.202.109.255 nl 193.202.110.0 - 193.202.110.255 dk 193.202.111.0 - 193.202.111.255 fr -193.202.112.0 - 193.202.112.255 nl 193.202.113.0 - 193.202.113.255 gb 193.202.114.0 - 193.202.114.255 pl 193.202.115.0 - 193.202.115.255 no @@ -93627,43 +83748,34 @@ 193.202.123.0 - 193.202.123.255 at 193.202.124.0 - 193.202.124.255 de 193.202.125.0 - 193.202.126.255 fr -193.202.127.0 - 193.202.191.255 de +193.202.127.0 - 193.202.175.255 de +193.202.176.0 - 193.202.183.255 us +193.202.184.0 - 193.202.191.255 sg 193.202.192.0 - 193.202.239.255 gb 193.202.240.0 - 193.202.254.255 li -193.202.255.0 - 193.202.255.255 ch -193.203.0.0 - 193.203.0.255 at -193.203.1.0 - 193.203.1.255 mk -193.203.2.0 - 193.203.3.255 rs -193.203.4.0 - 193.203.4.255 mk +193.202.255.0 - 193.202.255.255 eu +193.203.0.0 - 193.203.1.255 at 193.203.5.0 - 193.203.5.255 gb 193.203.6.0 - 193.203.7.255 rs -193.203.8.0 - 193.203.15.255 eu -193.203.16.0 - 193.203.17.255 si 193.203.18.0 - 193.203.19.255 rs 193.203.20.0 - 193.203.21.255 gb -193.203.22.0 - 193.203.22.255 rs -193.203.23.0 - 193.203.23.255 ch -193.203.24.0 - 193.203.25.255 rs -193.203.26.0 - 193.203.27.255 eu -193.203.28.0 - 193.203.29.255 rs -193.203.30.0 - 193.203.31.255 ch +193.203.23.0 - 193.203.23.255 rs +193.203.26.0 - 193.203.27.255 rs 193.203.32.0 - 193.203.35.255 fr 193.203.36.0 - 193.203.43.255 ru 193.203.44.0 - 193.203.47.255 pl 193.203.48.0 - 193.203.51.255 ua -193.203.52.0 - 193.203.55.255 hu 193.203.56.0 - 193.203.59.255 pl 193.203.60.0 - 193.203.63.255 ru -193.203.64.0 - 193.203.90.191 gb -193.203.90.192 - 193.203.90.255 fr -193.203.91.0 - 193.203.95.255 gb -193.203.96.0 - 193.203.97.255 fr +193.203.64.0 - 193.203.96.247 gb +193.203.96.248 - 193.203.96.249 fr +193.203.96.250 - 193.203.96.255 gb +193.203.97.0 - 193.203.97.255 fr 193.203.98.0 - 193.203.99.255 pl 193.203.100.0 - 193.203.103.255 ru 193.203.104.0 - 193.203.105.255 ch 193.203.106.0 - 193.203.107.255 pt 193.203.108.0 - 193.203.109.255 fr -193.203.110.0 - 193.203.111.255 ua 193.203.112.0 - 193.203.113.255 ru 193.203.114.0 - 193.203.115.255 ro 193.203.116.0 - 193.203.117.255 gb @@ -93683,154 +83795,99 @@ 193.203.206.0 - 193.203.209.255 pl 193.203.210.0 - 193.203.211.255 gb 193.203.212.0 - 193.203.213.255 fr -193.203.214.0 - 193.203.215.255 ro 193.203.216.0 - 193.203.217.255 at 193.203.218.0 - 193.203.219.255 ua 193.203.220.0 - 193.203.221.255 nl 193.203.222.0 - 193.203.223.255 pl -193.203.224.0 - 193.203.224.255 mk 193.203.225.0 - 193.203.226.255 nl 193.203.227.0 - 193.203.227.255 ro 193.203.228.0 - 193.203.235.255 it 193.203.236.0 - 193.203.237.255 ua 193.203.238.0 - 193.203.239.255 de 193.203.240.0 - 193.203.255.255 gb -193.204.0.0 - 193.207.139.223 it -193.207.139.224 - 193.207.139.231 ch -193.207.139.232 - 193.207.255.255 it -193.208.0.0 - 193.208.105.255 fi -193.208.106.0 - 193.208.106.255 no -193.208.107.0 - 193.208.149.255 fi -193.208.150.0 - 193.208.150.255 nl -193.208.151.0 - 193.208.158.255 fi -193.208.159.0 - 193.208.159.255 be -193.208.160.0 - 193.209.21.255 fi -193.209.22.0 - 193.209.22.255 dk -193.209.23.0 - 193.209.29.255 fi -193.209.30.0 - 193.209.30.255 se -193.209.31.0 - 193.209.40.255 fi -193.209.41.0 - 193.209.41.7 nl -193.209.41.8 - 193.209.41.15 fi -193.209.41.16 - 193.209.41.31 nl -193.209.41.32 - 193.209.134.255 fi -193.209.135.0 - 193.209.135.255 ch -193.209.136.0 - 193.209.136.255 nl -193.209.137.0 - 193.209.255.255 fi -193.210.0.0 - 193.210.0.255 nl -193.210.1.0 - 193.210.5.135 fi -193.210.5.136 - 193.210.5.143 ax -193.210.5.144 - 193.210.34.255 fi -193.210.35.0 - 193.210.35.255 de -193.210.36.0 - 193.210.70.255 fi -193.210.71.0 - 193.210.71.255 gb -193.210.72.0 - 193.210.117.255 fi -193.210.118.0 - 193.210.118.255 gb -193.210.119.0 - 193.210.146.255 fi -193.210.147.0 - 193.210.147.255 be -193.210.148.0 - 193.210.159.255 fi -193.210.160.0 - 193.210.194.255 be -193.210.195.0 - 193.210.196.255 lu -193.210.197.0 - 193.210.207.255 be -193.210.208.0 - 193.211.76.255 fi -193.211.77.0 - 193.211.77.255 fr -193.211.78.0 - 193.211.78.255 ch -193.211.79.0 - 193.211.255.255 fi -193.212.0.0 - 193.212.122.215 no -193.212.122.216 - 193.212.122.223 se -193.212.122.224 - 193.212.123.183 no -193.212.123.184 - 193.212.123.191 nl -193.212.123.192 - 193.213.210.71 no -193.213.210.72 - 193.213.210.79 se -193.213.210.80 - 193.216.37.255 no -193.216.38.0 - 193.216.63.255 se -193.216.64.0 - 193.216.72.255 no -193.216.73.0 - 193.216.73.255 se -193.216.74.0 - 193.216.77.255 no -193.216.78.0 - 193.216.79.255 se -193.216.80.0 - 193.216.80.255 no -193.216.81.0 - 193.216.119.255 se -193.216.120.0 - 193.216.121.255 no -193.216.122.0 - 193.216.126.255 se -193.216.127.0 - 193.216.127.255 no -193.216.128.0 - 193.216.150.255 se -193.216.151.0 - 193.216.151.255 no -193.216.152.0 - 193.216.183.255 se -193.216.184.0 - 193.216.184.255 no -193.216.185.0 - 193.216.208.255 se -193.216.209.0 - 193.216.209.255 no -193.216.210.0 - 193.216.215.255 se -193.216.216.0 - 193.216.218.255 no -193.216.219.0 - 193.216.235.255 se -193.216.236.0 - 193.216.236.255 no -193.216.237.0 - 193.216.243.255 se -193.216.244.0 - 193.216.244.255 no -193.216.245.0 - 193.216.249.255 se -193.216.250.0 - 193.216.252.255 no -193.216.253.0 - 193.216.254.255 se -193.216.255.0 - 193.216.255.255 no -193.217.0.0 - 193.217.35.255 se -193.217.36.0 - 193.217.63.255 no -193.217.64.0 - 193.217.79.255 se -193.217.80.0 - 193.217.87.255 no -193.217.88.0 - 193.217.203.255 se -193.217.204.0 - 193.217.209.255 no -193.217.210.0 - 193.217.215.255 se -193.217.216.0 - 193.217.217.255 no -193.217.218.0 - 193.217.243.255 se -193.217.244.0 - 193.217.245.255 no -193.217.246.0 - 193.217.255.255 se +193.204.0.0 - 193.207.255.255 it +193.208.0.0 - 193.211.255.255 fi +193.212.0.0 - 193.216.31.255 no +193.216.32.0 - 193.216.35.255 se +193.216.36.0 - 193.216.68.255 nl +193.216.69.0 - 193.216.75.255 se +193.216.76.0 - 193.216.79.255 hr +193.216.80.0 - 193.216.80.255 se +193.216.81.0 - 193.216.119.255 nl +193.216.120.0 - 193.216.125.255 se +193.216.126.0 - 193.216.126.255 no +193.216.127.0 - 193.216.127.255 se +193.216.128.0 - 193.216.147.255 hr +193.216.148.0 - 193.216.151.255 se +193.216.152.0 - 193.216.171.255 hr +193.216.172.0 - 193.216.173.255 se +193.216.174.0 - 193.216.183.255 hr +193.216.184.0 - 193.216.184.255 se +193.216.185.0 - 193.216.191.255 no +193.216.192.0 - 193.216.207.255 nl +193.216.208.0 - 193.216.217.255 no +193.216.218.0 - 193.216.219.255 se +193.216.220.0 - 193.216.243.255 no +193.216.244.0 - 193.216.255.255 se +193.217.0.0 - 193.217.32.128 nl +193.217.32.129 - 193.217.35.255 se +193.217.36.0 - 193.217.95.255 no +193.217.96.0 - 193.217.127.255 nl +193.217.128.0 - 193.217.207.255 no +193.217.208.0 - 193.217.209.255 se +193.217.210.0 - 193.217.243.255 hr +193.217.244.0 - 193.217.247.255 se +193.217.248.0 - 193.217.255.255 lt 193.218.0.0 - 193.218.0.255 bg -193.218.1.0 - 193.218.6.255 gr -193.218.7.0 - 193.218.7.255 sk +193.218.1.0 - 193.218.7.255 gr 193.218.8.0 - 193.218.15.255 fr -193.218.16.0 - 193.218.32.255 de -193.218.33.0 - 193.218.93.255 gr +193.218.16.0 - 193.218.31.255 de +193.218.32.0 - 193.218.72.255 gr +193.218.73.0 - 193.218.73.255 de +193.218.74.0 - 193.218.93.255 gr 193.218.94.0 - 193.218.94.255 si 193.218.95.0 - 193.218.95.255 de 193.218.96.0 - 193.218.97.255 gr 193.218.98.0 - 193.218.98.255 hu 193.218.99.0 - 193.218.99.255 gb 193.218.100.0 - 193.218.104.255 ch -193.218.105.0 - 193.218.105.255 fr 193.218.106.0 - 193.218.112.255 gr 193.218.113.0 - 193.218.113.255 tr -193.218.114.0 - 193.218.114.255 mq +193.218.114.0 - 193.218.114.255 gp 193.218.115.0 - 193.218.115.255 pl 193.218.116.0 - 193.218.117.255 at -193.218.118.0 - 193.218.118.255 ua -193.218.119.0 - 193.218.119.255 gr +193.218.118.0 - 193.218.118.255 ru 193.218.120.0 - 193.218.120.255 cz -193.218.121.0 - 193.218.125.255 gr +193.218.122.0 - 193.218.122.255 gr +193.218.124.0 - 193.218.125.255 gr 193.218.126.0 - 193.218.127.255 pl 193.218.128.0 - 193.218.131.255 no 193.218.132.0 - 193.218.135.255 pl 193.218.136.0 - 193.218.143.255 ru -193.218.144.0 - 193.218.147.255 ua +193.218.144.0 - 193.218.147.255 de 193.218.148.0 - 193.218.155.255 pl 193.218.156.0 - 193.218.159.255 ua 193.218.160.0 - 193.218.175.255 gb -193.218.176.0 - 193.218.183.255 ru +193.218.176.0 - 193.218.179.255 pl +193.218.180.0 - 193.218.183.255 ru 193.218.184.0 - 193.218.187.255 ua 193.218.188.0 - 193.218.191.255 ru 193.218.192.0 - 193.218.199.255 be -193.218.200.0 - 193.218.200.255 tr -193.218.201.0 - 193.218.201.255 gr -193.218.203.0 - 193.218.204.255 gr +193.218.202.0 - 193.218.202.255 de 193.218.205.0 - 193.218.205.63 gb -193.218.205.64 - 193.218.205.127 ir -193.218.205.128 - 193.218.205.191 lu -193.218.205.192 - 193.218.205.223 gb +193.218.205.64 - 193.218.205.223 cy 193.218.205.224 - 193.218.205.255 ch 193.218.206.0 - 193.218.206.255 se 193.218.207.0 - 193.218.207.15 no -193.218.207.16 - 193.218.207.63 de +193.218.207.16 - 193.218.207.63 ch 193.218.207.64 - 193.218.207.79 ie +193.218.207.80 - 193.218.207.127 cy 193.218.207.128 - 193.218.207.255 il 193.218.208.0 - 193.218.221.255 de -193.218.222.0 - 193.218.222.255 gb 193.218.223.0 - 193.218.255.255 gr -193.219.0.0 - 193.219.0.255 gb -193.219.1.0 - 193.219.14.255 lt +193.219.0.0 - 193.219.4.255 lt +193.219.5.0 - 193.219.6.255 eu +193.219.8.0 - 193.219.14.255 lt 193.219.15.0 - 193.219.15.255 de 193.219.16.0 - 193.219.27.255 dk 193.219.28.0 - 193.219.28.255 pl @@ -93840,9 +83897,7 @@ 193.219.96.0 - 193.219.96.255 es 193.219.97.0 - 193.219.97.255 gb 193.219.98.0 - 193.219.98.255 be -193.219.99.0 - 193.219.99.255 ua 193.219.100.0 - 193.219.100.255 si -193.219.101.0 - 193.219.101.255 ru 193.219.102.0 - 193.219.102.255 it 193.219.103.0 - 193.219.103.255 es 193.219.104.0 - 193.219.104.255 ru @@ -93860,7 +83915,6 @@ 193.219.118.0 - 193.219.118.255 gb 193.219.119.0 - 193.219.119.255 ro 193.219.120.0 - 193.219.120.255 gb -193.219.121.0 - 193.219.121.255 si 193.219.122.0 - 193.219.122.255 gb 193.219.123.0 - 193.219.123.255 be 193.219.124.0 - 193.219.124.255 ua @@ -93868,408 +83922,43 @@ 193.219.126.0 - 193.219.126.255 pl 193.219.127.0 - 193.219.127.255 ru 193.219.128.0 - 193.219.191.255 lt -193.219.192.0 - 193.219.201.255 no -193.219.202.0 - 193.219.203.255 lt -193.219.204.0 - 193.219.205.31 no -193.219.205.32 - 193.219.205.47 ng -193.219.205.48 - 193.219.205.63 bj -193.219.205.64 - 193.219.205.159 no -193.219.205.160 - 193.219.205.191 ng -193.219.205.192 - 193.219.205.207 no -193.219.205.208 - 193.219.205.223 cd -193.219.205.224 - 193.219.205.239 gh -193.219.205.240 - 193.219.205.255 no -193.219.206.0 - 193.219.206.255 gn -193.219.207.0 - 193.219.207.15 ml -193.219.207.16 - 193.219.207.95 no -193.219.207.96 - 193.219.207.127 gq -193.219.207.128 - 193.219.207.255 no -193.219.208.0 - 193.219.208.7 mw -193.219.208.8 - 193.219.208.15 lt -193.219.208.16 - 193.219.208.23 gn -193.219.208.24 - 193.219.208.31 lt -193.219.208.32 - 193.219.208.47 gn -193.219.208.48 - 193.219.208.55 lt -193.219.208.56 - 193.219.208.63 gn -193.219.208.64 - 193.219.208.71 bi -193.219.208.72 - 193.219.208.95 lt -193.219.208.96 - 193.219.208.159 no -193.219.208.160 - 193.219.208.191 lt -193.219.208.192 - 193.219.208.207 af -193.219.208.208 - 193.219.208.255 lt -193.219.209.0 - 193.219.209.31 so -193.219.209.32 - 193.219.209.63 lt -193.219.209.64 - 193.219.209.95 cf -193.219.209.96 - 193.219.209.127 so -193.219.209.128 - 193.219.209.159 ng -193.219.209.160 - 193.219.209.175 so -193.219.209.176 - 193.219.209.223 lt -193.219.209.224 - 193.219.209.255 so -193.219.210.0 - 193.219.210.7 ng -193.219.210.8 - 193.219.210.15 ke -193.219.210.16 - 193.219.210.23 lr -193.219.210.24 - 193.219.210.31 cm -193.219.210.32 - 193.219.210.39 lr -193.219.210.40 - 193.219.210.47 ci -193.219.210.48 - 193.219.210.191 lt -193.219.210.192 - 193.219.210.207 tz -193.219.210.208 - 193.219.210.215 mr -193.219.210.216 - 193.219.211.15 lt -193.219.211.16 - 193.219.211.23 sd -193.219.211.24 - 193.219.211.63 lt -193.219.211.64 - 193.219.211.71 ke -193.219.211.72 - 193.219.211.79 lt -193.219.211.80 - 193.219.211.87 ug -193.219.211.88 - 193.219.211.95 lt -193.219.211.96 - 193.219.211.103 ug -193.219.211.104 - 193.219.211.111 zw -193.219.211.112 - 193.219.211.127 tz -193.219.211.128 - 193.219.211.135 bw -193.219.211.136 - 193.219.211.143 lt -193.219.211.144 - 193.219.211.159 ug -193.219.211.160 - 193.219.211.175 cd -193.219.211.176 - 193.219.211.191 lt -193.219.211.192 - 193.219.211.207 so -193.219.211.208 - 193.219.211.215 lt -193.219.211.216 - 193.219.211.255 so -193.219.212.0 - 193.219.212.31 td -193.219.212.32 - 193.219.212.63 lt -193.219.212.64 - 193.219.212.127 bi -193.219.212.128 - 193.219.212.159 lt -193.219.212.160 - 193.219.212.167 gh -193.219.212.168 - 193.219.212.175 bf -193.219.212.176 - 193.219.212.183 ng -193.219.212.184 - 193.219.212.255 lt -193.219.213.0 - 193.219.213.15 ma -193.219.213.16 - 193.219.213.31 lt -193.219.213.32 - 193.219.213.47 ao -193.219.213.48 - 193.219.213.127 lt -193.219.213.128 - 193.219.213.135 lr -193.219.213.136 - 193.219.213.151 ng -193.219.213.152 - 193.219.213.159 lt -193.219.213.160 - 193.219.213.175 bi -193.219.213.176 - 193.219.213.191 lt -193.219.213.192 - 193.219.213.223 bi -193.219.213.224 - 193.219.216.15 lt -193.219.216.16 - 193.219.216.23 bw -193.219.216.24 - 193.219.216.63 lt -193.219.216.64 - 193.219.216.95 bi -193.219.216.96 - 193.219.216.127 lt -193.219.216.128 - 193.219.216.255 bi -193.219.217.0 - 193.219.217.127 zw -193.219.217.128 - 193.219.219.191 lt -193.219.219.192 - 193.219.219.231 cd -193.219.219.232 - 193.219.219.239 lt -193.219.219.240 - 193.219.219.255 cd -193.219.220.0 - 193.219.220.255 lt -193.219.221.0 - 193.219.221.31 bi -193.219.221.32 - 193.219.221.63 lt -193.219.221.64 - 193.219.221.95 ng -193.219.221.96 - 193.219.221.127 lt -193.219.221.128 - 193.219.221.135 gh -193.219.221.136 - 193.219.221.159 lt -193.219.221.160 - 193.219.221.175 ng -193.219.221.176 - 193.219.221.191 lt -193.219.221.192 - 193.219.221.207 mr -193.219.221.208 - 193.219.221.231 lt -193.219.221.232 - 193.219.221.239 cd -193.219.221.240 - 193.219.221.247 lt -193.219.221.248 - 193.219.221.255 cd -193.219.222.0 - 193.219.231.255 lt -193.219.232.0 - 193.219.232.7 gh -193.219.232.8 - 193.219.232.47 lt -193.219.232.48 - 193.219.232.63 mr -193.219.232.64 - 193.219.232.127 lt -193.219.232.128 - 193.219.232.135 gh -193.219.232.136 - 193.219.232.143 lt -193.219.232.144 - 193.219.232.159 er -193.219.232.160 - 193.219.232.175 tz -193.219.232.176 - 193.219.232.183 gh -193.219.232.184 - 193.219.232.191 ne -193.219.232.192 - 193.219.233.255 lt -193.219.234.0 - 193.219.234.39 iq -193.219.234.40 - 193.219.234.47 lt -193.219.234.48 - 193.219.234.55 iq -193.219.234.56 - 193.219.234.63 lt -193.219.234.64 - 193.219.234.79 iq -193.219.234.80 - 193.219.234.95 lt -193.219.234.96 - 193.219.234.119 iq -193.219.234.120 - 193.219.234.127 lt -193.219.234.128 - 193.219.234.159 iq -193.219.234.160 - 193.219.234.175 lt -193.219.234.176 - 193.219.234.183 iq -193.219.234.184 - 193.219.234.191 be -193.219.234.192 - 193.219.234.255 iq -193.219.235.0 - 193.219.236.255 lt -193.219.237.0 - 193.219.237.31 gb -193.219.237.32 - 193.219.237.223 lt -193.219.237.224 - 193.219.237.255 cm -193.219.238.0 - 193.219.241.127 lt -193.219.241.128 - 193.219.241.159 gn -193.219.241.160 - 193.219.241.191 lt -193.219.241.192 - 193.219.241.255 gn -193.219.242.0 - 193.219.242.255 lt -193.219.243.0 - 193.219.243.7 iq -193.219.243.8 - 193.219.243.183 af -193.219.243.184 - 193.219.243.191 lt -193.219.243.192 - 193.219.243.239 af -193.219.243.240 - 193.219.244.255 lt -193.219.245.0 - 193.219.245.63 ng -193.219.245.64 - 193.219.245.143 lt -193.219.245.144 - 193.219.245.159 zm -193.219.245.160 - 193.219.246.191 lt -193.219.246.192 - 193.219.246.255 jo -193.219.247.0 - 193.219.247.255 lt -193.219.248.0 - 193.219.248.63 jo -193.219.248.64 - 193.219.248.127 lt -193.219.248.128 - 193.219.248.159 jo -193.219.248.160 - 193.219.248.255 lt -193.219.249.0 - 193.219.249.31 ke -193.219.249.32 - 193.219.249.255 lt -193.219.250.0 - 193.219.250.15 zm -193.219.250.16 - 193.219.250.31 lt -193.219.250.32 - 193.219.250.47 sl -193.219.250.48 - 193.219.250.63 lt -193.219.250.64 - 193.219.250.95 sl -193.219.250.96 - 193.219.250.127 cd -193.219.250.128 - 193.219.250.143 lt -193.219.250.144 - 193.219.250.175 gn -193.219.250.176 - 193.219.250.239 lt -193.219.250.240 - 193.219.250.255 zm -193.219.251.0 - 193.219.251.31 lt -193.219.251.32 - 193.219.251.95 gh -193.219.251.96 - 193.219.252.255 lt -193.219.253.0 - 193.219.253.39 iq -193.219.253.40 - 193.219.253.79 lt -193.219.253.80 - 193.219.253.87 iq -193.219.253.88 - 193.219.253.95 lt -193.219.253.96 - 193.219.253.103 iq -193.219.253.104 - 193.219.253.191 lt -193.219.253.192 - 193.219.253.215 iq -193.219.253.216 - 193.219.253.223 lt -193.219.253.224 - 193.219.253.231 iq -193.219.253.232 - 193.219.254.15 lt -193.219.254.16 - 193.219.254.23 gb -193.219.254.24 - 193.219.254.47 iq -193.219.254.48 - 193.219.254.95 lt -193.219.254.96 - 193.219.254.127 iq -193.219.254.128 - 193.219.254.255 lt -193.219.255.0 - 193.219.255.63 iq -193.219.255.64 - 193.219.255.79 gb -193.219.255.80 - 193.219.255.95 lt -193.219.255.96 - 193.219.255.111 iq -193.219.255.112 - 193.219.255.119 af -193.219.255.120 - 193.219.255.231 lt -193.219.255.232 - 193.219.255.239 iq -193.219.255.240 - 193.220.1.255 lt -193.220.2.0 - 193.220.11.255 no -193.220.12.0 - 193.220.15.255 lt -193.220.16.0 - 193.220.16.15 gn -193.220.16.16 - 193.220.16.31 lt -193.220.16.32 - 193.220.16.47 ga -193.220.16.48 - 193.220.16.95 lt -193.220.16.96 - 193.220.16.111 ne -193.220.16.112 - 193.220.17.63 lt -193.220.17.64 - 193.220.17.255 so -193.220.18.0 - 193.220.18.127 td -193.220.18.128 - 193.220.18.255 lt -193.220.19.0 - 193.220.19.71 ao -193.220.19.72 - 193.220.19.79 lt -193.220.19.80 - 193.220.19.103 ao -193.220.19.104 - 193.220.19.255 lt -193.220.20.0 - 193.220.20.255 a2 -193.220.21.0 - 193.220.23.255 lt -193.220.24.0 - 193.220.25.255 mz -193.220.26.0 - 193.220.27.255 lt -193.220.28.0 - 193.220.29.255 mw -193.220.30.0 - 193.220.30.15 ao -193.220.30.16 - 193.220.30.63 lt -193.220.30.64 - 193.220.30.95 ao -193.220.30.96 - 193.220.30.127 lt -193.220.30.128 - 193.220.30.159 ke -193.220.30.160 - 193.220.36.255 lt -193.220.37.0 - 193.220.37.255 bj -193.220.38.0 - 193.220.38.127 ne -193.220.38.128 - 193.220.38.175 lt -193.220.38.176 - 193.220.38.183 bf -193.220.38.184 - 193.220.38.199 lt -193.220.38.200 - 193.220.38.207 bf -193.220.38.208 - 193.220.38.223 bj -193.220.38.224 - 193.220.38.255 lt -193.220.39.0 - 193.220.39.255 gn -193.220.40.0 - 193.220.41.255 mw -193.220.42.0 - 193.220.43.255 lt -193.220.44.0 - 193.220.44.255 so -193.220.45.0 - 193.220.45.255 lr -193.220.46.0 - 193.220.46.15 mw -193.220.46.16 - 193.220.46.63 lt -193.220.46.64 - 193.220.46.79 mw -193.220.46.80 - 193.220.46.191 lt -193.220.46.192 - 193.220.46.207 mw -193.220.46.208 - 193.220.50.255 lt -193.220.51.0 - 193.220.51.255 so -193.220.52.0 - 193.220.52.255 mz -193.220.53.0 - 193.220.54.255 lt -193.220.55.0 - 193.220.55.15 gh -193.220.55.16 - 193.220.55.23 tz -193.220.55.24 - 193.220.55.31 lt -193.220.55.32 - 193.220.55.55 gh -193.220.55.56 - 193.220.55.63 ml -193.220.55.64 - 193.220.55.71 gn -193.220.55.72 - 193.220.55.79 sl -193.220.55.80 - 193.220.56.255 lt -193.220.57.0 - 193.220.57.31 tz -193.220.57.32 - 193.220.57.47 lt -193.220.57.48 - 193.220.57.63 bw -193.220.57.64 - 193.220.57.79 ml -193.220.57.80 - 193.220.57.95 lt -193.220.57.96 - 193.220.57.103 tz -193.220.57.104 - 193.220.57.111 lt -193.220.57.112 - 193.220.57.119 cf -193.220.57.120 - 193.220.57.127 mz -193.220.57.128 - 193.220.57.143 cd -193.220.57.144 - 193.220.57.175 bf -193.220.57.176 - 193.220.57.215 gn -193.220.57.216 - 193.220.57.255 cd -193.220.58.0 - 193.220.58.255 tz -193.220.59.0 - 193.220.59.143 gh -193.220.59.144 - 193.220.59.159 mr -193.220.59.160 - 193.220.59.175 gh -193.220.59.176 - 193.220.59.191 cd -193.220.59.192 - 193.220.59.207 bw -193.220.59.208 - 193.220.59.223 bf -193.220.59.224 - 193.220.59.255 lt -193.220.60.0 - 193.220.60.255 tz -193.220.61.0 - 193.220.61.15 gn -193.220.61.16 - 193.220.61.47 ml -193.220.61.48 - 193.220.61.63 bf -193.220.61.64 - 193.220.61.79 lt -193.220.61.80 - 193.220.61.95 zm -193.220.61.96 - 193.220.61.111 lt -193.220.61.112 - 193.220.61.127 zm -193.220.61.128 - 193.220.61.159 gn -193.220.61.160 - 193.220.61.175 lr -193.220.61.176 - 193.220.61.191 sl -193.220.61.192 - 193.220.61.223 lt -193.220.61.224 - 193.220.61.255 er -193.220.62.0 - 193.220.63.255 lt -193.220.64.0 - 193.220.65.255 ng -193.220.66.0 - 193.220.67.255 lt -193.220.68.0 - 193.220.68.255 tr -193.220.69.0 - 193.220.69.255 lt -193.220.70.0 - 193.220.70.255 cm -193.220.71.0 - 193.220.71.255 lt -193.220.72.0 - 193.220.72.15 bj -193.220.72.16 - 193.220.72.223 lt -193.220.72.224 - 193.220.72.231 sn -193.220.72.232 - 193.220.72.247 lt -193.220.72.248 - 193.220.72.255 sn -193.220.73.0 - 193.220.73.95 so -193.220.73.96 - 193.220.73.255 lt -193.220.74.0 - 193.220.74.63 so -193.220.74.64 - 193.220.74.255 lt -193.220.75.0 - 193.220.75.63 so -193.220.75.64 - 193.220.92.127 lt -193.220.92.128 - 193.220.92.191 tz -193.220.92.192 - 193.220.95.255 lt -193.220.96.0 - 193.220.96.79 gn -193.220.96.80 - 193.220.101.239 lt -193.220.101.240 - 193.220.101.255 no -193.220.102.0 - 193.220.103.255 lt -193.220.104.0 - 193.220.107.255 no -193.220.108.0 - 193.220.108.255 se +193.219.192.0 - 193.219.197.255 no +193.219.198.0 - 193.219.199.255 fr +193.219.200.0 - 193.219.203.255 no +193.219.204.0 - 193.219.235.255 fr +193.219.236.0 - 193.219.236.255 us +193.219.237.0 - 193.219.255.255 fr +193.220.0.0 - 193.220.15.255 no +193.220.16.0 - 193.220.30.33 fr +193.220.30.34 - 193.220.30.34 ao +193.220.30.35 - 193.220.31.255 fr +193.220.32.0 - 193.220.35.255 no +193.220.36.0 - 193.220.108.255 fr 193.220.109.0 - 193.220.109.255 no -193.220.110.0 - 193.220.111.255 se -193.220.112.0 - 193.220.112.255 cn -193.220.113.0 - 193.220.113.79 ch -193.220.113.80 - 193.220.113.87 dk -193.220.113.88 - 193.220.113.255 lt -193.220.114.0 - 193.220.114.255 ch -193.220.115.0 - 193.220.115.255 lt -193.220.116.0 - 193.220.117.255 no -193.220.118.0 - 193.220.118.7 et -193.220.118.8 - 193.220.118.31 lt -193.220.118.32 - 193.220.118.47 iq -193.220.118.48 - 193.220.118.63 lt -193.220.118.64 - 193.220.118.95 no -193.220.118.96 - 193.220.118.255 lt -193.220.119.0 - 193.220.119.255 ch -193.220.120.0 - 193.220.120.255 lt -193.220.121.0 - 193.220.121.23 gm -193.220.121.24 - 193.220.121.47 gw -193.220.121.48 - 193.220.121.71 gn -193.220.121.72 - 193.220.121.95 sl -193.220.121.96 - 193.220.121.111 lr -193.220.121.112 - 193.220.121.255 lt -193.220.122.0 - 193.220.122.15 no -193.220.122.16 - 193.220.122.127 lt -193.220.122.128 - 193.220.122.159 no -193.220.122.160 - 193.220.122.255 lt -193.220.123.0 - 193.220.123.31 no -193.220.123.32 - 193.220.123.39 lt -193.220.123.40 - 193.220.123.47 no -193.220.123.48 - 193.220.123.63 gb -193.220.123.64 - 193.220.123.79 nl -193.220.123.80 - 193.220.123.95 no -193.220.123.96 - 193.220.123.119 nl -193.220.123.120 - 193.220.123.127 no -193.220.123.128 - 193.220.123.131 nl -193.220.123.132 - 193.220.123.135 lt -193.220.123.136 - 193.220.123.143 nl -193.220.123.144 - 193.220.123.175 lt -193.220.123.176 - 193.220.123.255 no -193.220.124.0 - 193.220.124.135 lt -193.220.124.136 - 193.220.124.143 mw -193.220.124.144 - 193.220.124.151 zm -193.220.124.152 - 193.220.124.159 sd -193.220.124.160 - 193.220.124.255 lt -193.220.125.0 - 193.220.125.127 td -193.220.125.128 - 193.220.126.255 lt -193.220.127.0 - 193.220.127.31 ng -193.220.127.32 - 193.220.127.127 lt -193.220.127.128 - 193.220.127.151 ng -193.220.127.152 - 193.220.132.255 lt -193.220.133.0 - 193.220.133.255 iq -193.220.134.0 - 193.220.134.255 lt -193.220.135.0 - 193.220.135.127 ng -193.220.135.128 - 193.220.136.255 lt -193.220.137.0 - 193.220.137.127 bi -193.220.137.128 - 193.220.156.255 lt -193.220.157.0 - 193.220.157.31 af -193.220.157.32 - 193.220.157.47 us -193.220.157.48 - 193.220.157.63 lt -193.220.157.64 - 193.220.157.127 iq -193.220.157.128 - 193.220.157.255 lt -193.220.158.0 - 193.220.159.255 no -193.220.160.0 - 193.220.170.255 lt -193.220.171.0 - 193.220.175.255 no -193.220.176.0 - 193.220.176.255 gh -193.220.177.0 - 193.220.177.31 lt -193.220.177.32 - 193.220.177.63 gh -193.220.177.64 - 193.220.177.127 lt -193.220.177.128 - 193.220.177.255 gh -193.220.178.0 - 193.220.207.255 lt -193.220.208.0 - 193.220.211.255 so -193.220.212.0 - 193.220.235.255 lt -193.220.236.0 - 193.220.237.255 mz -193.220.238.0 - 193.220.243.255 lt -193.220.244.0 - 193.220.245.255 kw -193.220.246.0 - 193.220.247.255 lt -193.220.248.0 - 193.220.255.255 kw +193.220.110.0 - 193.220.113.255 fr +193.220.114.0 - 193.220.114.255 dk +193.220.115.0 - 193.220.124.191 fr +193.220.124.192 - 193.220.124.199 ss +193.220.124.200 - 193.220.159.255 fr +193.220.160.0 - 193.220.191.255 no +193.220.192.0 - 193.220.207.255 nl +193.220.208.0 - 193.220.215.255 no +193.220.216.0 - 193.220.223.255 fr +193.220.224.0 - 193.220.255.255 no 193.221.0.0 - 193.221.15.255 be -193.221.16.0 - 193.221.37.255 se -193.221.38.0 - 193.221.38.255 hu -193.221.39.0 - 193.221.57.255 se -193.221.58.0 - 193.221.58.255 de -193.221.59.0 - 193.221.74.255 se -193.221.75.0 - 193.221.76.255 us -193.221.77.0 - 193.221.81.255 se -193.221.82.0 - 193.221.83.255 eu -193.221.84.0 - 193.221.86.255 gb -193.221.87.0 - 193.221.87.255 be -193.221.88.0 - 193.221.88.255 gb -193.221.89.0 - 193.221.89.255 be -193.221.90.0 - 193.221.92.255 gb +193.221.16.0 - 193.221.38.255 se +193.221.39.0 - 193.221.39.255 au +193.221.40.0 - 193.221.54.255 se +193.221.55.0 - 193.221.55.255 gb +193.221.56.0 - 193.221.58.255 se +193.221.59.0 - 193.221.59.255 eu +193.221.60.0 - 193.221.74.255 se +193.221.75.0 - 193.221.75.255 us +193.221.76.0 - 193.221.81.255 se +193.221.82.0 - 193.221.83.255 ro +193.221.84.0 - 193.221.89.255 gb +193.221.90.0 - 193.221.90.255 ap +193.221.91.0 - 193.221.92.255 gb 193.221.93.0 - 193.221.95.255 ch 193.221.96.0 - 193.221.111.255 fr 193.221.112.0 - 193.221.112.255 si @@ -94280,36 +83969,33 @@ 193.221.117.0 - 193.221.117.255 fr 193.221.118.0 - 193.221.118.255 gb 193.221.119.0 - 193.221.119.255 se -193.221.120.0 - 193.221.120.255 fr 193.221.121.0 - 193.221.121.255 eu 193.221.122.0 - 193.221.122.255 pl -193.221.123.0 - 193.221.123.255 be 193.221.124.0 - 193.221.124.255 dk 193.221.125.0 - 193.221.125.255 nl 193.221.126.0 - 193.221.126.255 pl 193.221.127.0 - 193.221.127.255 de 193.221.128.0 - 193.221.159.255 nl 193.221.160.0 - 193.221.191.255 be -193.221.192.0 - 193.221.207.255 gb -193.221.208.0 - 193.221.211.255 ie -193.221.212.0 - 193.221.217.255 nl 193.221.218.0 - 193.221.218.255 ci -193.221.219.0 - 193.221.255.255 be +193.221.224.0 - 193.221.255.255 be 193.222.0.0 - 193.222.47.255 ch -193.222.48.0 - 193.222.51.255 ro +193.222.48.0 - 193.222.49.255 ru +193.222.50.0 - 193.222.50.255 gb +193.222.51.0 - 193.222.51.255 ir 193.222.52.0 - 193.222.55.255 ua 193.222.56.0 - 193.222.56.255 de 193.222.57.0 - 193.222.57.255 ro 193.222.58.0 - 193.222.58.255 ru -193.222.59.0 - 193.222.60.255 ch +193.222.59.0 - 193.222.59.255 ch 193.222.61.0 - 193.222.61.255 gb 193.222.62.0 - 193.222.62.255 ru 193.222.63.0 - 193.222.63.255 ro -193.222.64.0 - 193.222.107.255 ch +193.222.64.0 - 193.222.95.255 ch +193.222.106.0 - 193.222.107.255 ch 193.222.108.0 - 193.222.108.255 fr 193.222.109.0 - 193.222.109.255 ru 193.222.110.0 - 193.222.110.255 se -193.222.111.0 - 193.222.111.255 ua 193.222.112.0 - 193.222.127.255 li 193.222.128.0 - 193.222.128.255 fr 193.222.129.0 - 193.222.129.255 il @@ -94325,33 +84011,30 @@ 193.222.139.0 - 193.222.139.255 at 193.222.140.0 - 193.222.140.255 ua 193.222.141.0 - 193.222.141.255 se -193.222.142.0 - 193.222.189.255 ch +193.222.144.0 - 193.222.187.255 ch 193.222.190.0 - 193.222.190.255 nl 193.222.191.0 - 193.222.191.255 ru 193.222.192.0 - 193.222.253.255 ch 193.222.254.0 - 193.222.254.255 es 193.222.255.0 - 193.222.255.255 ch 193.223.0.0 - 193.223.0.255 pl -193.223.1.0 - 193.223.67.255 ch +193.223.1.0 - 193.223.63.255 ch 193.223.68.0 - 193.223.68.255 ru -193.223.69.0 - 193.223.75.255 ch 193.223.76.0 - 193.223.76.255 tr 193.223.77.0 - 193.223.77.255 de 193.223.78.0 - 193.223.79.255 gb -193.223.80.0 - 193.223.97.255 ch +193.223.80.0 - 193.223.95.255 ch 193.223.98.0 - 193.223.98.255 ua 193.223.99.0 - 193.223.99.255 dk -193.223.100.0 - 193.223.100.255 nl +193.223.100.0 - 193.223.100.255 ae 193.223.101.0 - 193.223.101.255 ro 193.223.102.0 - 193.223.102.255 ch -193.223.103.0 - 193.223.103.255 at -193.223.104.0 - 193.223.255.255 ch +193.223.109.0 - 193.223.109.255 ch +193.223.112.0 - 193.223.255.255 ch 193.224.0.0 - 193.225.255.255 hu 193.226.0.0 - 193.226.63.255 ro -193.226.64.0 - 193.226.71.255 md -193.226.72.0 - 193.226.73.255 ro -193.226.74.0 - 193.226.79.255 md -193.226.80.0 - 193.226.191.255 ro +193.226.64.0 - 193.226.65.255 md +193.226.66.0 - 193.226.191.255 ro 193.226.192.0 - 193.226.255.255 hu 193.227.0.0 - 193.227.63.255 eg 193.227.64.0 - 193.227.95.255 it @@ -94361,37 +84044,30 @@ 193.227.100.0 - 193.227.100.255 pl 193.227.101.0 - 193.227.101.255 ch 193.227.102.0 - 193.227.102.255 lt -193.227.103.0 - 193.227.103.255 be 193.227.104.0 - 193.227.104.255 it 193.227.105.0 - 193.227.105.255 pl 193.227.106.0 - 193.227.106.255 gb 193.227.107.0 - 193.227.107.255 fr 193.227.108.0 - 193.227.108.255 at -193.227.109.0 - 193.227.110.255 ro +193.227.110.0 - 193.227.110.255 ro 193.227.111.0 - 193.227.111.255 gb 193.227.112.0 - 193.227.112.255 pl 193.227.113.0 - 193.227.113.255 at -193.227.114.0 - 193.227.114.255 mt 193.227.115.0 - 193.227.115.255 ua 193.227.116.0 - 193.227.116.255 pl 193.227.117.0 - 193.227.117.255 de 193.227.118.0 - 193.227.118.255 gb 193.227.119.0 - 193.227.120.255 ua -193.227.121.0 - 193.227.121.255 nl -193.227.122.0 - 193.227.122.255 ch 193.227.123.0 - 193.227.123.255 pl 193.227.124.0 - 193.227.124.255 de -193.227.125.0 - 193.227.125.255 ru 193.227.126.0 - 193.227.126.255 se 193.227.127.0 - 193.227.127.255 sa 193.227.128.0 - 193.227.128.255 eg -193.227.129.0 - 193.227.129.255 hu 193.227.130.0 - 193.227.130.255 fr 193.227.131.0 - 193.227.131.255 pl 193.227.132.0 - 193.227.132.255 es 193.227.133.0 - 193.227.133.255 fr 193.227.134.0 - 193.227.134.255 ru -193.227.135.0 - 193.227.135.255 no 193.227.136.0 - 193.227.143.255 fr 193.227.144.0 - 193.227.159.255 de 193.227.160.0 - 193.227.191.255 lb @@ -94408,11 +84084,9 @@ 193.227.228.0 - 193.227.229.255 fr 193.227.230.0 - 193.227.231.255 ua 193.227.232.0 - 193.227.233.255 ru -193.227.234.0 - 193.227.235.255 eu -193.227.236.0 - 193.227.237.255 ro +193.227.234.0 - 193.227.235.255 de 193.227.238.0 - 193.227.239.255 pt 193.227.240.0 - 193.227.241.255 ru -193.227.242.0 - 193.227.243.255 ro 193.227.244.0 - 193.227.247.255 gb 193.227.248.0 - 193.227.249.255 fr 193.227.250.0 - 193.227.251.255 ua @@ -94421,16 +84095,13 @@ 193.228.0.0 - 193.228.0.255 at 193.228.1.0 - 193.228.1.255 gb 193.228.2.0 - 193.228.2.255 ua -193.228.3.0 - 193.228.139.255 at -193.228.140.0 - 193.228.140.255 pl +193.228.4.0 - 193.228.9.255 at +193.228.16.0 - 193.228.127.255 at 193.228.141.0 - 193.228.141.255 gb -193.228.142.0 - 193.228.142.255 ru 193.228.143.0 - 193.228.143.255 se 193.228.144.0 - 193.228.144.255 de -193.228.145.0 - 193.228.145.255 ro 193.228.146.0 - 193.228.146.255 de 193.228.147.0 - 193.228.147.255 fr -193.228.148.0 - 193.228.148.255 ua 193.228.149.0 - 193.228.150.255 de 193.228.151.0 - 193.228.151.255 si 193.228.152.0 - 193.228.152.255 bg @@ -94439,28 +84110,30 @@ 193.228.155.0 - 193.228.155.255 gb 193.228.156.0 - 193.228.156.255 fr 193.228.157.0 - 193.228.157.255 se -193.228.158.0 - 193.228.158.255 at -193.228.159.0 - 193.228.159.255 ru -193.228.160.0 - 193.228.173.255 at +193.228.158.0 - 193.228.159.255 ru +193.228.170.0 - 193.228.171.255 at 193.228.174.0 - 193.228.174.255 pl -193.228.175.0 - 193.228.233.255 at +193.228.176.0 - 193.228.192.255 at +193.228.196.0 - 193.228.199.255 ch +193.228.200.0 - 193.228.223.255 at +193.228.227.0 - 193.228.227.255 at +193.228.232.0 - 193.228.233.255 at 193.228.234.0 - 193.228.234.255 cz -193.228.235.0 - 193.228.255.255 at +193.228.235.0 - 193.228.239.255 at +193.228.240.0 - 193.228.255.255 de 193.229.0.0 - 193.229.255.255 fi -193.230.0.0 - 193.231.255.255 ro -193.232.0.0 - 193.232.64.255 ru -193.232.65.0 - 193.232.65.255 ua -193.232.66.0 - 193.232.91.255 ru +193.230.0.0 - 193.230.247.255 ro +193.230.248.0 - 193.230.248.255 md +193.230.249.0 - 193.231.255.255 ro +193.232.0.0 - 193.232.91.255 ru 193.232.92.0 - 193.232.92.255 by -193.232.93.0 - 193.232.159.255 ru -193.232.160.0 - 193.232.160.255 de -193.232.161.0 - 193.232.227.255 ru -193.232.228.0 - 193.232.229.255 am -193.232.230.0 - 193.232.247.255 ru +193.232.93.0 - 193.232.247.255 ru 193.232.248.0 - 193.232.251.255 by 193.232.252.0 - 193.233.255.255 ru 193.234.0.0 - 193.234.0.255 pl -193.234.1.0 - 193.234.166.255 se +193.234.1.0 - 193.234.164.255 se +193.234.165.0 - 193.234.165.255 gb +193.234.166.0 - 193.234.166.255 se 193.234.167.0 - 193.234.167.255 it 193.234.168.0 - 193.234.178.255 se 193.234.179.0 - 193.234.179.255 no @@ -94468,32 +84141,45 @@ 193.234.196.0 - 193.234.197.255 fr 193.234.198.0 - 193.234.198.255 se 193.234.199.0 - 193.234.201.255 fr -193.234.202.0 - 193.234.234.255 se +193.234.202.0 - 193.234.222.255 se +193.234.223.0 - 193.234.223.255 gb +193.234.224.0 - 193.234.225.255 it +193.234.226.0 - 193.234.231.255 se +193.234.232.0 - 193.234.232.255 gb +193.234.233.0 - 193.234.234.255 se 193.234.235.0 - 193.234.236.255 fr 193.234.237.0 - 193.234.237.255 se 193.234.238.0 - 193.234.238.255 fr 193.234.239.0 - 193.234.239.255 it 193.234.240.0 - 193.234.243.255 se 193.234.244.0 - 193.234.245.255 it -193.234.246.0 - 193.234.249.255 se +193.234.246.0 - 193.234.246.255 se +193.234.247.0 - 193.234.247.255 eu +193.234.248.0 - 193.234.249.255 se 193.234.250.0 - 193.234.250.255 it 193.234.251.0 - 193.234.251.255 jp 193.234.252.0 - 193.234.255.255 se 193.235.0.0 - 193.235.0.255 pl -193.235.1.0 - 193.235.23.255 se +193.235.1.0 - 193.235.7.123 se +193.235.7.124 - 193.235.7.124 eu +193.235.7.125 - 193.235.23.255 se 193.235.24.0 - 193.235.24.255 gb -193.235.25.0 - 193.235.29.255 se -193.235.30.0 - 193.235.30.255 no -193.235.31.0 - 193.235.33.255 se +193.235.25.0 - 193.235.31.255 se +193.235.32.0 - 193.235.32.255 us +193.235.33.0 - 193.235.33.255 se 193.235.34.0 - 193.235.34.255 us 193.235.35.0 - 193.235.49.255 se -193.235.50.0 - 193.235.51.255 gb -193.235.52.0 - 193.235.95.255 se +193.235.50.0 - 193.235.50.255 gb +193.235.51.0 - 193.235.61.255 se +193.235.62.0 - 193.235.62.255 gb +193.235.63.0 - 193.235.95.255 se 193.235.96.0 - 193.235.96.255 de 193.235.97.0 - 193.235.99.255 se 193.235.100.0 - 193.235.101.255 jp 193.235.102.0 - 193.235.102.255 es -193.235.103.0 - 193.235.114.255 se +193.235.103.0 - 193.235.105.255 se +193.235.106.0 - 193.235.106.255 be +193.235.107.0 - 193.235.114.255 se 193.235.115.0 - 193.235.115.255 de 193.235.116.0 - 193.235.118.255 se 193.235.119.0 - 193.235.119.255 gb @@ -94505,38 +84191,44 @@ 193.235.127.0 - 193.235.127.255 no 193.235.128.0 - 193.235.143.255 se 193.235.144.0 - 193.235.144.255 fr -193.235.145.0 - 193.235.156.255 se +193.235.145.0 - 193.235.145.255 se +193.235.146.0 - 193.235.146.255 cl +193.235.147.0 - 193.235.147.255 nl +193.235.148.0 - 193.235.156.255 se 193.235.157.0 - 193.235.158.255 no 193.235.159.0 - 193.235.193.255 se 193.235.194.0 - 193.235.194.255 no 193.235.195.0 - 193.235.196.255 se 193.235.197.0 - 193.235.197.255 gb -193.235.198.0 - 193.235.202.255 se +193.235.198.0 - 193.235.198.255 eu +193.235.199.0 - 193.235.199.255 se +193.235.200.0 - 193.235.200.0 nl +193.235.200.1 - 193.235.202.255 se 193.235.203.0 - 193.235.203.255 us 193.235.204.0 - 193.235.205.255 se 193.235.206.0 - 193.235.206.255 us 193.235.207.0 - 193.235.222.255 se 193.235.223.0 - 193.235.223.255 it -193.235.224.0 - 193.235.224.255 us -193.235.225.0 - 193.235.226.255 se +193.235.224.0 - 193.235.226.255 se 193.235.227.0 - 193.235.227.255 pl 193.235.228.0 - 193.235.229.255 se 193.235.230.0 - 193.235.231.255 us 193.235.232.0 - 193.235.235.255 gb -193.235.236.0 - 193.235.255.255 se -193.236.0.0 - 193.236.7.255 ao -193.236.8.0 - 193.236.255.255 pt +193.235.236.0 - 193.235.237.255 se +193.235.238.0 - 193.235.239.255 nl +193.235.240.0 - 193.235.255.255 se +193.236.0.0 - 193.236.255.255 pt 193.237.0.0 - 193.237.255.255 gb -193.238.0.0 - 193.238.3.255 ro 193.238.4.0 - 193.238.7.255 fi 193.238.8.0 - 193.238.11.255 de 193.238.12.0 - 193.238.19.255 pl 193.238.20.0 - 193.238.23.255 ua -193.238.24.0 - 193.238.27.255 nl +193.238.24.0 - 193.238.24.255 pl +193.238.25.0 - 193.238.25.255 tr +193.238.26.0 - 193.238.27.255 de 193.238.28.0 - 193.238.31.255 ng 193.238.32.0 - 193.238.39.255 ua 193.238.40.0 - 193.238.43.255 pl -193.238.44.0 - 193.238.47.255 ua 193.238.48.0 - 193.238.51.255 ru 193.238.52.0 - 193.238.55.255 es 193.238.56.0 - 193.238.59.255 ro @@ -94554,7 +84246,6 @@ 193.238.108.0 - 193.238.111.255 ua 193.238.112.0 - 193.238.115.255 gr 193.238.116.0 - 193.238.119.255 ua -193.238.120.0 - 193.238.123.255 ru 193.238.124.0 - 193.238.127.255 de 193.238.128.0 - 193.238.135.255 ru 193.238.136.0 - 193.238.139.255 it @@ -94570,29 +84261,25 @@ 193.238.180.0 - 193.238.183.255 pl 193.238.184.0 - 193.238.187.255 dk 193.238.188.0 - 193.238.191.255 il -193.238.192.0 - 193.238.195.255 ua 193.238.196.0 - 193.238.199.255 de 193.238.200.0 - 193.238.203.255 pl 193.238.204.0 - 193.238.207.255 li 193.238.208.0 - 193.238.211.255 il 193.238.212.0 - 193.238.223.255 lv 193.238.224.0 - 193.238.227.255 ua -193.238.228.0 - 193.238.231.255 fr +193.238.228.0 - 193.238.231.255 de 193.238.232.0 - 193.238.235.255 gb -193.238.236.0 - 193.238.239.255 no 193.238.240.0 - 193.238.243.255 nl -193.238.244.0 - 193.238.247.255 ro 193.238.248.0 - 193.238.251.255 nl 193.238.252.0 - 193.238.255.255 de 193.239.0.0 - 193.239.3.255 cz -193.239.4.0 - 193.239.7.255 eu +193.239.4.0 - 193.239.7.255 de 193.239.8.0 - 193.239.11.255 gb 193.239.12.0 - 193.239.15.255 es 193.239.16.0 - 193.239.19.255 de 193.239.20.0 - 193.239.23.255 ch 193.239.24.0 - 193.239.27.255 ua 193.239.28.0 - 193.239.31.255 de -193.239.32.0 - 193.239.35.255 gb 193.239.36.0 - 193.239.39.255 pl 193.239.40.0 - 193.239.43.255 at 193.239.44.0 - 193.239.47.255 pl @@ -94603,7 +84290,6 @@ 193.239.68.0 - 193.239.75.255 ua 193.239.76.0 - 193.239.79.255 fr 193.239.80.0 - 193.239.83.255 pl -193.239.84.0 - 193.239.87.255 ru 193.239.88.0 - 193.239.95.255 nl 193.239.96.0 - 193.239.99.255 dk 193.239.100.0 - 193.239.103.255 pl @@ -94615,35 +84301,31 @@ 193.239.124.0 - 193.239.127.255 pl 193.239.128.0 - 193.239.129.255 ua 193.239.130.0 - 193.239.131.255 ro +193.239.132.0 - 193.239.132.255 nl +193.239.133.0 - 193.239.133.255 ru 193.239.134.0 - 193.239.135.255 ro 193.239.136.0 - 193.239.137.255 pl 193.239.138.0 - 193.239.141.255 ro 193.239.142.0 - 193.239.143.255 ua 193.239.144.0 - 193.239.145.255 pl -193.239.146.0 - 193.239.147.255 ro 193.239.148.0 - 193.239.149.255 hu -193.239.150.0 - 193.239.151.255 ru 193.239.152.0 - 193.239.153.255 ua -193.239.154.0 - 193.239.155.255 no 193.239.156.0 - 193.239.157.255 de 193.239.158.0 - 193.239.159.255 ro -193.239.160.0 - 193.239.161.255 gb -193.239.162.0 - 193.239.165.255 de -193.239.166.0 - 193.239.167.255 ro +193.239.160.0 - 193.239.167.255 de 193.239.168.0 - 193.239.169.255 dk 193.239.170.0 - 193.239.171.255 ua 193.239.172.0 - 193.239.173.255 ro 193.239.174.0 - 193.239.175.255 gb 193.239.176.0 - 193.239.177.255 dk -193.239.178.0 - 193.239.181.255 ua +193.239.180.0 - 193.239.181.255 ua 193.239.182.0 - 193.239.183.255 md -193.239.184.0 - 193.239.185.255 gr +193.239.184.0 - 193.239.184.255 pl +193.239.185.0 - 193.239.185.255 de 193.239.186.0 - 193.239.187.255 nl 193.239.188.0 - 193.239.189.255 at -193.239.190.0 - 193.239.191.255 ro 193.239.192.0 - 193.239.193.255 fr 193.239.194.0 - 193.239.195.255 ro -193.239.196.0 - 193.239.197.255 de 193.239.198.0 - 193.239.199.255 fr 193.239.200.0 - 193.239.201.255 ch 193.239.202.0 - 193.239.203.255 nl @@ -94658,19 +84340,105 @@ 193.239.224.0 - 193.239.225.255 pl 193.239.226.0 - 193.239.227.255 at 193.239.228.0 - 193.239.229.255 ua -193.239.230.0 - 193.239.233.255 ro +193.239.230.0 - 193.239.231.255 ro +193.239.232.0 - 193.239.232.255 se +193.239.233.0 - 193.239.233.255 ru 193.239.234.0 - 193.239.235.255 ua -193.239.236.0 - 193.239.237.255 ro 193.239.238.0 - 193.239.239.255 ua 193.239.240.0 - 193.239.241.255 fr 193.239.242.0 - 193.239.243.255 ru -193.239.244.0 - 193.239.245.255 pl 193.239.246.0 - 193.239.247.255 ro 193.239.248.0 - 193.239.249.255 at 193.239.250.0 - 193.239.251.255 ua 193.239.252.0 - 193.239.253.255 ro 193.239.254.0 - 193.239.255.255 ua -193.240.0.0 - 193.240.255.255 gb +193.240.0.0 - 193.240.0.255 de +193.240.1.0 - 193.240.25.95 gb +193.240.25.96 - 193.240.25.103 pl +193.240.25.104 - 193.240.25.111 at +193.240.25.112 - 193.240.25.119 gb +193.240.25.120 - 193.240.25.127 hu +193.240.25.128 - 193.240.27.255 gb +193.240.28.0 - 193.240.28.63 fr +193.240.28.64 - 193.240.28.71 cz +193.240.28.72 - 193.240.28.73 be +193.240.28.74 - 193.240.28.74 us +193.240.28.75 - 193.240.28.79 be +193.240.28.80 - 193.240.28.255 fr +193.240.29.0 - 193.240.39.255 gb +193.240.40.0 - 193.240.40.111 se +193.240.40.112 - 193.240.40.127 ru +193.240.40.128 - 193.240.40.248 se +193.240.40.249 - 193.240.40.249 gb +193.240.40.250 - 193.240.40.255 se +193.240.41.0 - 193.240.51.31 gb +193.240.51.32 - 193.240.51.63 ch +193.240.51.64 - 193.240.51.127 gb +193.240.51.128 - 193.240.51.128 us +193.240.51.129 - 193.240.57.63 gb +193.240.57.64 - 193.240.57.79 se +193.240.57.80 - 193.240.57.87 dk +193.240.57.88 - 193.240.57.95 ie +193.240.57.96 - 193.240.57.103 at +193.240.57.104 - 193.240.57.111 ch +193.240.57.112 - 193.240.57.119 fi +193.240.57.120 - 193.240.57.127 gb +193.240.57.128 - 193.240.57.191 it +193.240.57.192 - 193.240.57.255 de +193.240.58.0 - 193.240.113.255 gb +193.240.114.0 - 193.240.114.255 fr +193.240.115.0 - 193.240.117.127 gb +193.240.117.128 - 193.240.117.191 es +193.240.117.192 - 193.240.121.255 gb +193.240.122.0 - 193.240.122.255 it +193.240.123.0 - 193.240.123.127 ch +193.240.123.128 - 193.240.123.255 gb +193.240.124.0 - 193.240.124.255 se +193.240.125.0 - 193.240.131.255 gb +193.240.132.0 - 193.240.132.63 es +193.240.132.64 - 193.240.132.127 fr +193.240.132.128 - 193.240.132.159 gb +193.240.132.160 - 193.240.132.175 nl +193.240.132.176 - 193.240.132.191 be +193.240.132.192 - 193.240.132.255 tr +193.240.133.0 - 193.240.137.63 gb +193.240.137.64 - 193.240.137.127 nl +193.240.137.128 - 193.240.141.191 gb +193.240.141.192 - 193.240.141.251 ie +193.240.141.252 - 193.240.141.255 de +193.240.142.0 - 193.240.142.31 gb +193.240.142.32 - 193.240.142.63 de +193.240.142.64 - 193.240.143.255 gb +193.240.144.0 - 193.240.144.255 se +193.240.145.0 - 193.240.145.117 gb +193.240.145.118 - 193.240.145.118 de +193.240.145.119 - 193.240.154.231 gb +193.240.154.232 - 193.240.154.232 de +193.240.154.233 - 193.240.155.191 gb +193.240.155.192 - 193.240.155.255 ie +193.240.156.0 - 193.240.157.41 gb +193.240.157.42 - 193.240.157.42 de +193.240.157.43 - 193.240.159.31 gb +193.240.159.32 - 193.240.159.63 de +193.240.159.64 - 193.240.160.231 gb +193.240.160.232 - 193.240.160.239 de +193.240.160.240 - 193.240.162.255 gb +193.240.163.0 - 193.240.163.255 de +193.240.164.0 - 193.240.168.247 gb +193.240.168.248 - 193.240.168.255 de +193.240.169.0 - 193.240.171.79 gb +193.240.171.80 - 193.240.171.87 fr +193.240.171.88 - 193.240.172.239 gb +193.240.172.240 - 193.240.172.247 it +193.240.172.248 - 193.240.173.191 gb +193.240.173.192 - 193.240.173.207 de +193.240.173.208 - 193.240.175.31 gb +193.240.175.32 - 193.240.175.47 de +193.240.175.48 - 193.240.183.55 gb +193.240.183.56 - 193.240.183.63 fr +193.240.183.64 - 193.240.183.95 gb +193.240.183.96 - 193.240.183.111 de +193.240.183.112 - 193.240.255.255 gb 193.241.0.0 - 193.241.255.255 se 193.242.0.0 - 193.242.0.255 gb 193.242.1.0 - 193.242.79.255 fr @@ -94678,17 +84446,14 @@ 193.242.96.0 - 193.242.96.255 gb 193.242.97.0 - 193.242.97.255 nl 193.242.98.0 - 193.242.98.255 es -193.242.99.0 - 193.242.99.255 gb 193.242.100.0 - 193.242.100.255 pl 193.242.101.0 - 193.242.101.255 be 193.242.102.0 - 193.242.102.255 gb 193.242.103.0 - 193.242.103.255 se 193.242.104.0 - 193.242.104.255 ro 193.242.105.0 - 193.242.105.255 ch -193.242.106.0 - 193.242.106.255 de 193.242.107.0 - 193.242.107.255 dk 193.242.108.0 - 193.242.108.255 nl -193.242.109.0 - 193.242.109.255 se 193.242.110.0 - 193.242.110.255 gb 193.242.111.0 - 193.242.111.255 ie 193.242.112.0 - 193.242.112.255 de @@ -94705,231 +84470,163 @@ 193.242.124.0 - 193.242.124.255 pt 193.242.125.0 - 193.242.125.255 nl 193.242.126.0 - 193.242.126.255 fi -193.242.127.0 - 193.242.127.255 ru -193.242.128.0 - 193.242.191.255 be -193.242.192.0 - 193.242.223.255 fr +193.242.127.0 - 193.242.133.255 ru +193.242.134.0 - 193.242.134.255 at +193.242.135.0 - 193.242.135.255 ru +193.242.136.0 - 193.242.139.255 pl +193.242.140.0 - 193.242.140.255 gb +193.242.141.0 - 193.242.141.255 hr +193.242.142.0 - 193.242.143.255 pl +193.242.144.0 - 193.242.144.255 md +193.242.145.0 - 193.242.145.255 ru +193.242.146.0 - 193.242.147.255 pl +193.242.148.0 - 193.242.151.255 ru +193.242.152.0 - 193.242.152.255 pl +193.242.153.0 - 193.242.153.255 ru +193.242.154.0 - 193.242.154.255 si +193.242.155.0 - 193.242.155.255 dk +193.242.156.0 - 193.242.163.255 ua +193.242.164.0 - 193.242.165.255 es +193.242.166.0 - 193.242.166.255 ua +193.242.167.0 - 193.242.167.255 ru +193.242.168.0 - 193.242.169.255 pl +193.242.170.0 - 193.242.171.255 ru +193.242.172.0 - 193.242.172.255 pl +193.242.173.0 - 193.242.173.255 ru +193.242.174.0 - 193.242.175.255 fr +193.242.176.0 - 193.242.179.255 ru +193.242.180.0 - 193.242.181.255 cz +193.242.182.0 - 193.242.182.255 se +193.242.183.0 - 193.242.183.255 nl +193.242.184.0 - 193.242.187.255 se +193.242.188.0 - 193.242.189.255 es +193.242.190.0 - 193.242.191.255 ru +193.242.192.0 - 193.242.192.255 fr +193.242.193.0 - 193.242.193.255 ru +193.242.194.0 - 193.242.195.255 ir +193.242.196.0 - 193.242.199.255 ro +193.242.200.0 - 193.242.207.255 ru +193.242.208.0 - 193.242.209.255 ir +193.242.210.0 - 193.242.211.255 nl +193.242.212.0 - 193.242.213.255 pl +193.242.214.0 - 193.242.214.255 cy +193.242.215.0 - 193.242.215.255 pl +193.242.216.0 - 193.242.217.255 ru +193.242.218.0 - 193.242.219.255 ch +193.242.220.0 - 193.242.223.255 il 193.242.224.0 - 193.242.239.255 gb 193.242.240.0 - 193.242.255.255 gr 193.243.0.0 - 193.243.131.255 gb 193.243.132.0 - 193.243.133.255 md -193.243.134.0 - 193.243.135.255 se 193.243.136.0 - 193.243.137.255 be 193.243.138.0 - 193.243.139.255 ru 193.243.140.0 - 193.243.141.255 si 193.243.142.0 - 193.243.143.255 pl 193.243.144.0 - 193.243.145.255 se 193.243.146.0 - 193.243.149.255 pl -193.243.150.0 - 193.243.151.255 de 193.243.152.0 - 193.243.153.255 ua -193.243.154.0 - 193.243.155.255 gr +193.243.154.0 - 193.243.155.255 pl 193.243.156.0 - 193.243.159.255 ua -193.243.160.0 - 193.243.161.255 de +193.243.160.0 - 193.243.160.255 de 193.243.162.0 - 193.243.163.255 at -193.243.164.0 - 193.243.165.255 nl -193.243.166.0 - 193.243.166.255 ru 193.243.167.0 - 193.243.167.255 ua 193.243.168.0 - 193.243.171.255 rs 193.243.172.0 - 193.243.175.255 ru -193.243.176.0 - 193.243.182.255 gb -193.243.183.0 - 193.243.183.63 no -193.243.183.64 - 193.243.183.127 se -193.243.183.128 - 193.243.183.191 il -193.243.183.192 - 193.243.183.255 se +193.243.176.0 - 193.243.181.255 gb +193.243.183.0 - 193.243.183.255 se 193.243.184.0 - 193.243.191.255 de 193.243.192.0 - 193.243.223.255 tr 193.243.224.0 - 193.243.255.255 gb -193.244.0.0 - 193.245.31.255 be -193.245.32.0 - 193.245.39.255 cz -193.245.40.0 - 193.245.71.255 be -193.245.72.0 - 193.245.95.255 hu -193.245.96.0 - 193.245.255.255 be -193.246.0.0 - 193.246.125.255 ch -193.246.126.0 - 193.246.126.255 li -193.246.127.0 - 193.246.205.255 ch -193.246.206.0 - 193.246.206.255 li -193.246.207.0 - 193.247.255.255 ch -193.248.0.0 - 193.251.129.255 fr -193.251.130.0 - 193.251.131.39 ci -193.251.131.40 - 193.251.131.47 fr -193.251.131.48 - 193.251.131.59 ci -193.251.131.60 - 193.251.131.60 fr -193.251.131.61 - 193.251.131.61 ci -193.251.131.62 - 193.251.131.62 fr -193.251.131.63 - 193.251.131.95 ci -193.251.131.96 - 193.251.131.99 fr -193.251.131.100 - 193.251.131.127 ci -193.251.131.128 - 193.251.133.255 fr -193.251.134.0 - 193.251.134.15 ch -193.251.134.16 - 193.251.134.31 us -193.251.134.32 - 193.251.134.63 gb -193.251.134.64 - 193.251.134.127 fr -193.251.134.128 - 193.251.134.143 ch -193.251.134.144 - 193.251.134.159 fr -193.251.134.160 - 193.251.134.191 ch -193.251.134.192 - 193.251.134.207 fr -193.251.134.208 - 193.251.134.239 us -193.251.134.240 - 193.251.134.255 hk -193.251.135.0 - 193.251.135.255 a2 -193.251.136.0 - 193.251.136.159 km -193.251.136.160 - 193.251.136.223 fr -193.251.136.224 - 193.251.136.255 km -193.251.137.0 - 193.251.137.123 cf -193.251.137.124 - 193.251.137.255 fr -193.251.138.0 - 193.251.138.251 ci -193.251.138.252 - 193.251.138.255 fr -193.251.139.0 - 193.251.139.47 lb -193.251.139.48 - 193.251.139.55 fr -193.251.139.56 - 193.251.139.255 lb -193.251.140.0 - 193.251.141.111 fr +193.244.0.0 - 193.245.255.255 be +193.246.0.0 - 193.247.255.255 ch +193.248.0.0 - 193.248.1.255 re +193.248.2.0 - 193.248.3.255 gp +193.248.4.0 - 193.248.5.255 yt +193.248.6.0 - 193.248.14.255 fr +193.248.15.0 - 193.248.16.255 yt +193.248.17.0 - 193.248.17.255 gf +193.248.18.0 - 193.248.18.255 mq +193.248.19.0 - 193.248.20.255 fr +193.248.21.0 - 193.248.24.255 yt +193.248.25.0 - 193.248.26.255 fr +193.248.27.0 - 193.248.28.255 yt +193.248.29.0 - 193.248.41.255 fr +193.248.42.0 - 193.248.42.255 re +193.248.43.0 - 193.248.83.255 fr +193.248.84.0 - 193.248.87.255 yt +193.248.88.0 - 193.251.141.111 fr 193.251.141.112 - 193.251.141.127 mg -193.251.141.128 - 193.251.142.255 fr -193.251.143.0 - 193.251.143.255 dj -193.251.144.0 - 193.251.144.255 dz -193.251.145.0 - 193.251.145.21 fr -193.251.145.22 - 193.251.145.23 mr -193.251.145.24 - 193.251.145.25 fr -193.251.145.26 - 193.251.145.26 mr -193.251.145.27 - 193.251.145.29 fr -193.251.145.30 - 193.251.145.31 mr -193.251.145.32 - 193.251.145.63 fr +193.251.141.128 - 193.251.145.63 fr 193.251.145.64 - 193.251.145.95 mr -193.251.145.96 - 193.251.145.99 fr -193.251.145.100 - 193.251.145.111 mr -193.251.145.112 - 193.251.145.119 fr -193.251.145.120 - 193.251.145.175 mr -193.251.145.176 - 193.251.145.191 fr -193.251.145.192 - 193.251.145.223 mr -193.251.145.224 - 193.251.145.255 fr -193.251.146.0 - 193.251.146.255 mr -193.251.147.0 - 193.251.147.255 td -193.251.148.0 - 193.251.148.255 fr -193.251.149.0 - 193.251.149.255 cf -193.251.150.0 - 193.251.151.255 fr -193.251.152.0 - 193.251.152.255 dz -193.251.153.0 - 193.251.153.255 gq -193.251.154.0 - 193.251.154.255 fr +193.251.145.96 - 193.251.145.103 fr +193.251.145.104 - 193.251.145.111 mr +193.251.145.112 - 193.251.145.143 fr +193.251.145.144 - 193.251.145.159 mr +193.251.145.160 - 193.251.154.255 fr 193.251.155.0 - 193.251.155.127 cm -193.251.155.128 - 193.251.155.255 fr -193.251.156.0 - 193.251.157.255 lb -193.251.158.0 - 193.251.158.255 fr -193.251.159.0 - 193.251.159.255 ci -193.251.160.0 - 193.251.160.139 gp -193.251.160.140 - 193.251.160.143 fr -193.251.160.144 - 193.251.160.151 gp -193.251.160.152 - 193.251.160.159 fr -193.251.160.160 - 193.251.160.255 gp -193.251.161.0 - 193.251.161.255 ci -193.251.162.0 - 193.251.165.63 gp -193.251.165.64 - 193.251.165.255 fr -193.251.166.0 - 193.251.166.15 lb -193.251.166.16 - 193.251.166.23 fr -193.251.166.24 - 193.251.166.83 lb -193.251.166.84 - 193.251.166.87 fr -193.251.166.88 - 193.251.166.255 lb -193.251.167.0 - 193.251.167.111 dj -193.251.167.112 - 193.251.167.255 fr -193.251.168.0 - 193.251.168.255 ci +193.251.155.128 - 193.251.159.255 fr +193.251.160.0 - 193.251.160.69 gp +193.251.160.70 - 193.251.160.127 fr +193.251.160.128 - 193.251.160.139 gp +193.251.160.140 - 193.251.160.159 fr +193.251.160.160 - 193.251.160.170 gp +193.251.160.171 - 193.251.160.191 fr +193.251.160.192 - 193.251.160.226 gp +193.251.160.227 - 193.251.161.255 fr +193.251.162.0 - 193.251.162.255 gp +193.251.163.0 - 193.251.163.255 mq +193.251.164.0 - 193.251.165.63 gp +193.251.165.64 - 193.251.166.255 fr +193.251.167.0 - 193.251.167.7 dj +193.251.167.8 - 193.251.167.79 fr +193.251.167.80 - 193.251.167.87 dj +193.251.167.88 - 193.251.168.255 fr 193.251.169.0 - 193.251.169.255 dz -193.251.170.0 - 193.251.171.255 lb -193.251.172.0 - 193.251.172.255 fr -193.251.173.0 - 193.251.173.15 ci -193.251.173.16 - 193.251.173.255 fr -193.251.174.0 - 193.251.175.223 dz -193.251.175.224 - 193.251.217.255 fr -193.251.218.0 - 193.251.219.255 gq -193.251.220.0 - 193.251.220.255 ne +193.251.170.0 - 193.251.220.255 fr 193.251.221.0 - 193.251.221.31 mq -193.251.221.32 - 193.251.221.255 fr -193.251.222.0 - 193.251.223.255 gq -193.251.224.0 - 193.251.224.215 dj -193.251.224.216 - 193.251.227.3 fr -193.251.227.4 - 193.251.227.23 ne -193.251.227.24 - 193.251.227.39 fr -193.251.227.40 - 193.251.227.71 ne -193.251.227.72 - 193.251.227.84 fr -193.251.227.85 - 193.251.227.85 ne -193.251.227.86 - 193.251.227.95 fr -193.251.227.96 - 193.251.227.96 ne -193.251.227.97 - 193.251.227.104 fr -193.251.227.105 - 193.251.227.105 ne -193.251.227.106 - 193.251.227.107 fr -193.251.227.108 - 193.251.227.115 ne -193.251.227.116 - 193.251.227.119 fr -193.251.227.120 - 193.251.227.183 ne -193.251.227.184 - 193.251.227.191 fr -193.251.227.192 - 193.251.227.223 ne -193.251.227.224 - 193.251.227.227 fr -193.251.227.228 - 193.251.228.255 ne -193.251.229.0 - 193.252.15.255 fr -193.252.16.0 - 193.252.17.255 gb -193.252.18.0 - 193.252.23.91 fr -193.252.23.92 - 193.252.23.92 ug -193.252.23.93 - 193.252.23.93 ch -193.252.23.94 - 193.252.23.94 ro -193.252.23.95 - 193.252.127.255 fr -193.252.128.0 - 193.252.128.255 us -193.252.129.0 - 193.252.129.255 ir -193.252.130.0 - 193.252.130.255 us -193.252.131.0 - 193.252.131.255 ir -193.252.132.0 - 193.252.132.255 us -193.252.133.0 - 193.252.133.255 fr -193.252.134.0 - 193.252.134.255 us -193.252.135.0 - 193.252.136.255 ir -193.252.137.0 - 193.252.137.255 hk -193.252.138.0 - 193.252.138.255 fr -193.252.139.0 - 193.252.139.255 hk -193.252.140.0 - 193.252.144.255 fr -193.252.145.0 - 193.252.145.255 hk -193.252.146.0 - 193.252.146.255 fr -193.252.147.0 - 193.252.147.255 hk -193.252.148.0 - 193.252.154.255 fr -193.252.155.0 - 193.252.155.255 at -193.252.156.0 - 193.252.228.255 fr -193.252.229.0 - 193.252.229.159 do -193.252.229.160 - 193.253.157.255 fr -193.253.158.0 - 193.253.159.255 us -193.253.160.0 - 193.253.255.255 fr -193.254.0.0 - 193.254.0.63 dk -193.254.0.64 - 193.254.0.255 gb -193.254.1.0 - 193.254.3.255 al +193.251.221.32 - 193.251.223.100 fr +193.251.223.101 - 193.251.223.101 gq +193.251.223.102 - 193.253.95.255 fr +193.253.96.0 - 193.253.109.255 re +193.253.110.0 - 193.253.111.255 yt +193.253.112.0 - 193.253.112.255 fr +193.253.113.0 - 193.253.125.255 re +193.253.126.0 - 193.253.127.255 yt +193.253.128.0 - 193.253.255.255 fr +193.254.0.0 - 193.254.3.255 al 193.254.4.0 - 193.254.7.255 se -193.254.8.0 - 193.254.17.255 ch 193.254.18.0 - 193.254.23.127 de 193.254.23.128 - 193.254.23.255 dk -193.254.24.0 - 193.254.26.255 it -193.254.27.0 - 193.254.28.255 gb +193.254.24.0 - 193.254.27.255 it 193.254.29.0 - 193.254.29.255 bg 193.254.30.0 - 193.254.30.255 de 193.254.31.0 - 193.254.31.255 gb -193.254.32.0 - 193.254.63.255 ro -193.254.64.0 - 193.254.107.255 eu -193.254.108.0 - 193.254.108.255 de -193.254.109.0 - 193.254.127.255 eu +193.254.32.0 - 193.254.47.255 es +193.254.48.0 - 193.254.63.255 gb +193.254.64.0 - 193.254.127.255 eu 193.254.128.0 - 193.254.191.255 de 193.254.192.0 - 193.254.193.255 se 193.254.194.0 - 193.254.195.255 gb 193.254.196.0 - 193.254.197.255 ua -193.254.198.0 - 193.254.199.255 us +193.254.198.0 - 193.254.199.255 eu 193.254.200.0 - 193.254.201.255 gr 193.254.202.0 - 193.254.203.255 de -193.254.204.0 - 193.254.205.255 ru 193.254.206.0 - 193.254.207.255 il 193.254.208.0 - 193.254.209.255 ru 193.254.210.0 - 193.254.211.255 gb 193.254.212.0 - 193.254.213.255 de 193.254.214.0 - 193.254.215.255 nl -193.254.216.0 - 193.254.221.255 ua +193.254.216.0 - 193.254.217.255 ua +193.254.220.0 - 193.254.221.255 ua 193.254.222.0 - 193.254.223.255 gr 193.254.224.0 - 193.254.227.255 ru 193.254.228.0 - 193.254.229.255 tr 193.254.230.0 - 193.254.231.255 ro 193.254.232.0 - 193.254.233.255 ua -193.254.234.0 - 193.254.235.255 ro 193.254.236.0 - 193.254.237.255 de 193.254.238.0 - 193.254.239.255 pl 193.254.240.0 - 193.254.241.255 it 193.254.242.0 - 193.254.243.255 ro -193.254.244.0 - 193.254.245.255 fr 193.254.246.0 - 193.254.247.255 pl 193.254.248.0 - 193.254.249.255 ru 193.254.250.0 - 193.254.251.255 kz @@ -94960,8 +84657,23 @@ 194.0.32.0 - 194.0.32.255 bg 194.0.33.0 - 194.0.35.255 es 194.0.36.0 - 194.0.36.255 fr -194.0.38.0 - 194.0.41.255 tk +194.0.37.0 - 194.0.37.255 be +194.0.38.0 - 194.0.39.1 eu +194.0.39.2 - 194.0.39.2 tk +194.0.39.3 - 194.0.41.255 eu 194.0.42.0 - 194.0.42.255 lu +194.0.43.0 - 194.0.44.255 be +194.0.45.0 - 194.0.45.255 sk +194.0.46.0 - 194.0.47.255 dk +194.0.48.0 - 194.0.50.255 lv +194.0.51.0 - 194.0.51.255 ee +194.0.52.0 - 194.0.57.255 ua +194.0.58.0 - 194.0.58.255 gb +194.0.59.0 - 194.0.59.255 se +194.0.60.0 - 194.0.60.255 kz +194.0.61.0 - 194.0.61.255 se +194.0.62.0 - 194.0.62.255 pl +194.0.63.0 - 194.0.63.255 at 194.0.64.0 - 194.0.67.255 se 194.0.68.0 - 194.0.71.255 ru 194.0.72.0 - 194.0.75.255 at @@ -94971,10 +84683,8 @@ 194.0.88.0 - 194.0.91.255 ua 194.0.92.0 - 194.0.95.255 de 194.0.96.0 - 194.0.103.255 pl -194.0.104.0 - 194.0.107.255 ua 194.0.108.0 - 194.0.111.255 kz 194.0.112.0 - 194.0.115.255 ru -194.0.116.0 - 194.0.119.255 ua 194.0.120.0 - 194.0.123.255 ru 194.0.124.0 - 194.0.127.255 ro 194.0.128.0 - 194.0.128.255 pl @@ -94982,15 +84692,12 @@ 194.0.130.0 - 194.0.130.255 tr 194.0.131.0 - 194.0.131.255 ua 194.0.132.0 - 194.0.132.255 dk -194.0.133.0 - 194.0.133.255 it 194.0.134.0 - 194.0.134.255 se 194.0.135.0 - 194.0.135.255 de 194.0.136.0 - 194.0.136.255 ru 194.0.137.0 - 194.0.137.255 ch 194.0.138.0 - 194.0.138.255 ua -194.0.139.0 - 194.0.139.255 gb 194.0.140.0 - 194.0.140.255 it -194.0.141.0 - 194.0.141.255 ru 194.0.142.0 - 194.0.142.255 tr 194.0.143.0 - 194.0.143.255 de 194.0.144.0 - 194.0.145.255 ru @@ -95005,7 +84712,7 @@ 194.0.155.0 - 194.0.155.255 dk 194.0.156.0 - 194.0.156.255 gb 194.0.157.0 - 194.0.157.255 ua -194.0.158.0 - 194.0.159.255 gb +194.0.158.0 - 194.0.158.255 gb 194.0.160.0 - 194.0.160.255 lt 194.0.161.0 - 194.0.161.255 dk 194.0.162.0 - 194.0.162.255 ru @@ -95014,27 +84721,23 @@ 194.0.165.0 - 194.0.165.255 de 194.0.166.0 - 194.0.166.255 fr 194.0.167.0 - 194.0.167.255 pl -194.0.168.0 - 194.0.168.255 ch 194.0.169.0 - 194.0.169.255 no 194.0.170.0 - 194.0.170.255 nl 194.0.171.0 - 194.0.171.255 pl 194.0.172.0 - 194.0.172.255 ch -194.0.173.0 - 194.0.175.255 be +194.0.173.0 - 194.0.173.255 ro +194.0.174.0 - 194.0.175.255 si 194.0.176.0 - 194.0.176.255 fr 194.0.177.0 - 194.0.177.255 ro 194.0.178.0 - 194.0.178.255 tr 194.0.179.0 - 194.0.179.255 fr -194.0.180.0 - 194.0.180.255 de 194.0.181.0 - 194.0.181.255 pl 194.0.182.0 - 194.0.184.255 de 194.0.185.0 - 194.0.185.255 gr -194.0.186.0 - 194.0.186.255 pl 194.0.187.0 - 194.0.187.255 ua -194.0.188.0 - 194.0.188.255 de -194.0.189.0 - 194.0.190.255 ro +194.0.190.0 - 194.0.190.255 ro 194.0.191.0 - 194.0.191.255 si 194.0.192.0 - 194.0.192.255 no -194.0.193.0 - 194.0.193.255 gb 194.0.194.0 - 194.0.194.255 nl 194.0.195.0 - 194.0.195.255 fr 194.0.196.0 - 194.0.196.255 ie @@ -95048,46 +84751,36 @@ 194.0.204.0 - 194.0.204.255 ro 194.0.205.0 - 194.0.205.255 be 194.0.206.0 - 194.0.206.255 ua -194.0.207.0 - 194.0.207.255 lv 194.0.208.0 - 194.0.208.255 de 194.0.209.0 - 194.0.209.255 ru 194.0.210.0 - 194.0.210.255 gb 194.0.211.0 - 194.0.211.255 pl -194.0.212.0 - 194.0.212.255 ch -194.0.213.0 - 194.0.213.255 fr +194.0.212.0 - 194.0.213.255 ch 194.0.214.0 - 194.0.214.255 gb -194.0.215.0 - 194.0.215.255 no +194.0.215.0 - 194.0.215.255 nl 194.0.216.0 - 194.0.216.255 de 194.0.217.0 - 194.0.217.255 se 194.0.218.0 - 194.0.218.255 ua -194.0.219.0 - 194.0.219.255 gb +194.0.219.0 - 194.0.219.255 ru 194.0.220.0 - 194.0.220.255 pl -194.0.221.0 - 194.0.221.255 md 194.0.222.0 - 194.0.222.255 at -194.0.223.0 - 194.0.223.255 gb 194.0.224.0 - 194.0.224.255 hr 194.0.225.0 - 194.0.225.255 ru 194.0.226.0 - 194.0.226.255 ie -194.0.227.0 - 194.0.227.255 ge -194.0.228.0 - 194.0.228.255 de 194.0.229.0 - 194.0.229.255 ch 194.0.230.0 - 194.0.230.255 at -194.0.231.0 - 194.0.231.255 ru 194.0.232.0 - 194.0.232.255 de 194.0.233.0 - 194.0.233.255 pl 194.0.234.0 - 194.0.234.255 be 194.0.235.0 - 194.0.235.255 bg -194.0.236.0 - 194.0.236.255 dk +194.0.236.0 - 194.0.236.255 eu 194.0.237.0 - 194.0.237.255 ua 194.0.238.0 - 194.0.239.255 gb 194.0.240.0 - 194.0.240.255 pl 194.0.241.0 - 194.0.241.255 ie 194.0.242.0 - 194.0.242.255 lv -194.0.243.0 - 194.0.243.255 gb -194.0.244.0 - 194.0.244.255 pl -194.0.245.0 - 194.0.245.255 ru 194.0.246.0 - 194.0.246.255 se -194.0.247.0 - 194.0.248.255 de +194.0.247.0 - 194.0.247.255 de 194.0.249.0 - 194.0.249.255 fr 194.0.250.0 - 194.0.250.255 nl 194.0.251.0 - 194.0.251.255 pl @@ -95106,25 +84799,27 @@ 194.1.153.0 - 194.1.153.255 pl 194.1.154.0 - 194.1.154.255 se 194.1.155.0 - 194.1.155.255 de -194.1.156.0 - 194.1.157.255 sk +194.1.156.0 - 194.1.156.255 ru +194.1.157.0 - 194.1.157.255 sk 194.1.158.0 - 194.1.158.255 at -194.1.159.0 - 194.1.159.255 sk +194.1.159.0 - 194.1.159.255 ua 194.1.160.0 - 194.1.160.255 it 194.1.161.0 - 194.1.161.255 ru 194.1.162.0 - 194.1.163.255 ch 194.1.164.0 - 194.1.166.255 gb 194.1.167.0 - 194.1.167.255 ro -194.1.168.0 - 194.1.168.255 sk +194.1.168.0 - 194.1.168.255 ru 194.1.169.0 - 194.1.169.255 ro -194.1.170.0 - 194.1.175.255 sk +194.1.170.0 - 194.1.171.255 ru +194.1.172.0 - 194.1.175.255 sk 194.1.176.0 - 194.1.176.255 de -194.1.177.0 - 194.1.177.255 ua -194.1.178.0 - 194.1.179.255 ro +194.1.178.0 - 194.1.178.255 ro 194.1.180.0 - 194.1.180.255 gb 194.1.181.0 - 194.1.181.255 de 194.1.182.0 - 194.1.182.255 gb 194.1.183.0 - 194.1.183.255 be -194.1.184.0 - 194.1.189.255 sk +194.1.185.0 - 194.1.185.255 sk +194.1.188.0 - 194.1.189.255 cz 194.1.190.0 - 194.1.190.255 ch 194.1.191.0 - 194.1.191.255 sk 194.1.192.0 - 194.1.192.255 dk @@ -95137,7 +84832,7 @@ 194.1.199.0 - 194.1.199.255 pl 194.1.200.0 - 194.1.200.255 dk 194.1.201.0 - 194.1.201.255 pl -194.1.202.0 - 194.1.202.255 de +194.1.202.0 - 194.1.202.255 ru 194.1.203.0 - 194.1.203.255 fr 194.1.204.0 - 194.1.204.255 nl 194.1.205.0 - 194.1.205.255 be @@ -95147,60 +84842,45 @@ 194.1.209.0 - 194.1.209.255 ee 194.1.210.0 - 194.1.210.255 gb 194.1.211.0 - 194.1.212.255 se -194.1.213.0 - 194.1.219.255 sk +194.1.213.0 - 194.1.214.255 ru +194.1.215.0 - 194.1.216.255 sk +194.1.217.0 - 194.1.217.255 pl +194.1.219.0 - 194.1.219.255 dk 194.1.220.0 - 194.1.221.255 ua -194.1.222.0 - 194.1.245.255 sk +194.1.222.0 - 194.1.231.255 sk +194.1.232.0 - 194.1.243.255 ru +194.1.245.0 - 194.1.245.255 ch 194.1.246.0 - 194.1.246.255 pl -194.1.247.0 - 194.1.254.255 sk +194.1.247.0 - 194.1.247.255 se +194.1.248.0 - 194.1.251.255 ru +194.1.252.0 - 194.1.254.255 pl 194.1.255.0 - 194.1.255.255 hr -194.2.0.0 - 194.2.59.199 fr -194.2.59.200 - 194.2.59.207 gb -194.2.59.208 - 194.2.105.143 fr -194.2.105.144 - 194.2.105.151 gb -194.2.105.152 - 194.2.190.7 fr -194.2.190.8 - 194.2.190.15 a2 -194.2.190.16 - 194.3.71.46 fr -194.3.71.47 - 194.3.71.47 be -194.3.71.48 - 194.3.91.245 fr -194.3.91.246 - 194.3.91.246 a2 -194.3.91.247 - 194.3.117.255 fr -194.3.118.0 - 194.3.118.255 a2 -194.3.119.0 - 194.3.160.176 fr -194.3.160.177 - 194.3.160.177 lb -194.3.160.178 - 194.4.175.255 fr -194.4.176.0 - 194.4.176.255 sg -194.4.177.0 - 194.5.50.255 fr +194.2.0.0 - 194.2.200.204 fr +194.2.200.205 - 194.2.200.205 nl +194.2.200.206 - 194.2.200.245 fr +194.2.200.246 - 194.2.200.246 nl +194.2.200.247 - 194.3.151.255 fr +194.3.152.0 - 194.3.152.255 mq +194.3.153.0 - 194.5.39.255 fr 194.5.51.0 - 194.5.51.255 de -194.5.52.0 - 194.5.62.255 fr +194.5.55.0 - 194.5.55.255 fr 194.5.63.0 - 194.5.63.255 de -194.5.64.0 - 194.5.86.255 fr +194.5.64.0 - 194.5.67.255 fr +194.5.72.0 - 194.5.73.255 fr +194.5.74.0 - 194.5.77.255 eu +194.5.80.0 - 194.5.81.255 fr 194.5.87.0 - 194.5.87.255 hr -194.5.88.0 - 194.5.252.255 fr +194.5.88.0 - 194.5.89.255 fr +194.5.96.0 - 194.5.207.255 fr +194.5.232.0 - 194.5.239.255 fr 194.5.253.0 - 194.5.253.255 de -194.5.254.0 - 194.5.255.255 fr 194.6.0.0 - 194.6.1.255 gb 194.6.2.0 - 194.6.2.15 eu 194.6.2.16 - 194.6.2.79 gb 194.6.2.80 - 194.6.2.127 eu 194.6.2.128 - 194.6.2.191 gb 194.6.2.192 - 194.6.2.207 eu -194.6.2.208 - 194.6.4.7 gb -194.6.4.8 - 194.6.4.15 eu -194.6.4.16 - 194.6.4.23 gb -194.6.4.24 - 194.6.4.55 eu -194.6.4.56 - 194.6.4.63 gb -194.6.4.64 - 194.6.4.71 eu -194.6.4.72 - 194.6.4.103 gb -194.6.4.104 - 194.6.4.127 eu -194.6.4.128 - 194.6.4.135 gb -194.6.4.136 - 194.6.4.167 eu -194.6.4.168 - 194.6.4.175 gb -194.6.4.176 - 194.6.4.183 eu -194.6.4.184 - 194.6.4.191 gb -194.6.4.192 - 194.6.4.231 eu -194.6.4.232 - 194.6.4.239 gb -194.6.4.240 - 194.6.4.255 eu -194.6.5.0 - 194.6.7.255 gb +194.6.2.208 - 194.6.7.255 gb 194.6.8.0 - 194.6.8.31 eu 194.6.8.32 - 194.6.8.63 gb 194.6.8.64 - 194.6.8.79 eu @@ -95270,7 +84950,6 @@ 194.6.229.0 - 194.6.229.255 pt 194.6.230.0 - 194.6.230.255 ro 194.6.231.0 - 194.6.233.255 ua -194.6.234.0 - 194.6.234.255 de 194.6.235.0 - 194.6.235.255 gb 194.6.236.0 - 194.6.236.255 se 194.6.237.0 - 194.6.237.255 si @@ -95282,173 +84961,30 @@ 194.6.243.0 - 194.6.243.255 se 194.6.244.0 - 194.6.244.255 gb 194.6.245.0 - 194.6.246.255 pl -194.6.247.0 - 194.6.247.255 it 194.6.248.0 - 194.6.248.255 gb 194.6.249.0 - 194.6.249.255 de 194.6.250.0 - 194.6.250.255 at -194.6.251.0 - 194.6.252.255 se 194.6.253.0 - 194.6.253.255 es -194.6.254.0 - 194.6.254.255 gb 194.6.255.0 - 194.6.255.255 qa -194.7.0.0 - 194.7.19.159 be -194.7.19.160 - 194.7.19.191 lu -194.7.19.192 - 194.7.27.31 be -194.7.27.32 - 194.7.27.63 lu -194.7.27.64 - 194.7.27.87 be -194.7.27.88 - 194.7.27.95 lu -194.7.27.96 - 194.7.27.119 be -194.7.27.120 - 194.7.27.127 lu -194.7.27.128 - 194.7.30.255 be -194.7.31.0 - 194.7.31.31 lu -194.7.31.32 - 194.7.34.95 be -194.7.34.96 - 194.7.34.127 lu -194.7.34.128 - 194.7.34.255 be -194.7.35.0 - 194.7.35.15 lu -194.7.35.16 - 194.7.35.31 be -194.7.35.32 - 194.7.35.47 lu -194.7.35.48 - 194.7.36.255 be -194.7.37.0 - 194.7.37.255 lu -194.7.38.0 - 194.7.39.95 be -194.7.39.96 - 194.7.39.127 lu -194.7.39.128 - 194.7.41.143 be -194.7.41.144 - 194.7.41.159 lu -194.7.41.160 - 194.7.44.15 be -194.7.44.16 - 194.7.44.31 lu -194.7.44.32 - 194.7.44.159 be -194.7.44.160 - 194.7.44.191 lu -194.7.44.192 - 194.7.47.127 be -194.7.47.128 - 194.7.47.191 lu -194.7.47.192 - 194.7.54.7 be -194.7.54.8 - 194.7.54.15 fr -194.7.54.16 - 194.7.54.47 be -194.7.54.48 - 194.7.54.63 lu -194.7.54.64 - 194.7.63.63 be -194.7.63.64 - 194.7.63.95 lu -194.7.63.96 - 194.7.66.47 be -194.7.66.48 - 194.7.66.55 lu -194.7.66.56 - 194.7.66.159 be -194.7.66.160 - 194.7.66.191 lu -194.7.66.192 - 194.7.66.199 be -194.7.66.200 - 194.7.66.207 dk -194.7.66.208 - 194.7.68.255 be -194.7.69.0 - 194.7.69.255 lu -194.7.70.0 - 194.7.80.63 be -194.7.80.64 - 194.7.80.79 lu -194.7.80.80 - 194.7.80.191 be -194.7.80.192 - 194.7.80.223 lu -194.7.80.224 - 194.7.83.15 be -194.7.83.16 - 194.7.83.23 lu -194.7.83.24 - 194.7.83.191 be -194.7.83.192 - 194.7.83.223 lu -194.7.83.224 - 194.7.84.159 be -194.7.84.160 - 194.7.84.175 lu -194.7.84.176 - 194.7.84.183 be -194.7.84.184 - 194.7.84.187 lu -194.7.84.188 - 194.7.89.31 be -194.7.89.32 - 194.7.89.95 lu -194.7.89.96 - 194.7.94.79 be -194.7.94.80 - 194.7.94.95 lu -194.7.94.96 - 194.7.96.63 be -194.7.96.64 - 194.7.96.95 us -194.7.96.96 - 194.7.101.31 be -194.7.101.32 - 194.7.101.63 lu -194.7.101.64 - 194.7.102.239 be -194.7.102.240 - 194.7.102.255 lu -194.7.103.0 - 194.7.124.31 be -194.7.124.32 - 194.7.124.63 fr -194.7.124.64 - 194.7.129.127 be -194.7.129.128 - 194.7.129.159 lu -194.7.129.160 - 194.7.137.127 be -194.7.137.128 - 194.7.137.159 lu -194.7.137.160 - 194.7.138.223 be -194.7.138.224 - 194.7.138.255 lu -194.7.139.0 - 194.7.139.95 be -194.7.139.96 - 194.7.139.127 lu -194.7.139.128 - 194.7.141.95 be -194.7.141.96 - 194.7.141.127 lu -194.7.141.128 - 194.7.141.159 be -194.7.141.160 - 194.7.141.191 lu -194.7.141.192 - 194.7.146.191 be -194.7.146.192 - 194.7.146.223 fr -194.7.146.224 - 194.7.148.31 be -194.7.148.32 - 194.7.148.63 lu -194.7.148.64 - 194.7.148.127 be -194.7.148.128 - 194.7.148.159 lu -194.7.148.160 - 194.7.148.239 be -194.7.148.240 - 194.7.148.255 lu -194.7.149.0 - 194.7.150.191 be -194.7.150.192 - 194.7.150.199 lu -194.7.150.200 - 194.7.153.131 be -194.7.153.132 - 194.7.153.135 lu -194.7.153.136 - 194.7.153.223 be -194.7.153.224 - 194.7.153.239 lu -194.7.153.240 - 194.7.156.15 be -194.7.156.16 - 194.7.156.31 lu -194.7.156.32 - 194.7.157.159 be -194.7.157.160 - 194.7.157.191 lu -194.7.157.192 - 194.7.157.239 be -194.7.157.240 - 194.7.157.255 lu -194.7.158.0 - 194.7.160.23 be -194.7.160.24 - 194.7.160.31 lu -194.7.160.32 - 194.7.161.159 be -194.7.161.160 - 194.7.161.167 lu -194.7.161.168 - 194.7.161.175 be -194.7.161.176 - 194.7.161.183 lu -194.7.161.184 - 194.7.166.255 be -194.7.167.0 - 194.7.167.31 lu -194.7.167.32 - 194.7.168.95 be -194.7.168.96 - 194.7.168.127 lu -194.7.168.128 - 194.7.174.215 be -194.7.174.216 - 194.7.174.223 lu -194.7.174.224 - 194.7.176.215 be -194.7.176.216 - 194.7.176.219 lu -194.7.176.220 - 194.7.178.15 be -194.7.178.16 - 194.7.178.31 lu -194.7.178.32 - 194.7.183.31 be -194.7.183.32 - 194.7.183.63 lu -194.7.183.64 - 194.7.185.79 be -194.7.185.80 - 194.7.185.87 dk -194.7.185.88 - 194.7.185.95 lu -194.7.185.96 - 194.7.186.7 be -194.7.186.8 - 194.7.186.15 lu -194.7.186.16 - 194.7.195.159 be -194.7.195.160 - 194.7.195.223 lu -194.7.195.224 - 194.7.195.255 be -194.7.196.0 - 194.7.196.255 lu -194.7.197.0 - 194.7.201.31 be -194.7.201.32 - 194.7.201.63 lu -194.7.201.64 - 194.7.201.159 be -194.7.201.160 - 194.7.201.175 lu -194.7.201.176 - 194.7.203.255 be -194.7.204.0 - 194.7.205.255 lu -194.7.206.0 - 194.7.206.7 be -194.7.206.8 - 194.7.206.31 lu -194.7.206.32 - 194.7.206.223 be -194.7.206.224 - 194.7.206.231 lu -194.7.206.232 - 194.7.208.79 be -194.7.208.80 - 194.7.208.95 lu -194.7.208.96 - 194.7.209.151 be +194.7.0.0 - 194.7.161.146 be +194.7.161.147 - 194.7.161.147 eu +194.7.161.148 - 194.7.209.151 be 194.7.209.152 - 194.7.209.159 lu -194.7.209.160 - 194.7.227.247 be -194.7.227.248 - 194.7.227.255 hu -194.7.228.0 - 194.7.242.195 be -194.7.242.196 - 194.7.242.199 lu -194.7.242.200 - 194.7.255.255 be +194.7.209.160 - 194.7.255.255 be 194.8.0.0 - 194.8.0.255 de 194.8.1.0 - 194.8.3.255 lv 194.8.4.0 - 194.8.4.255 bg -194.8.5.0 - 194.8.13.255 lv +194.8.5.0 - 194.8.11.255 lv 194.8.14.0 - 194.8.14.255 pl 194.8.15.0 - 194.8.15.255 ch 194.8.16.0 - 194.8.27.255 lv -194.8.28.0 - 194.8.28.255 gb 194.8.29.0 - 194.8.29.255 se 194.8.30.0 - 194.8.30.255 pt 194.8.31.0 - 194.8.31.255 se 194.8.32.0 - 194.8.44.255 lv 194.8.45.0 - 194.8.46.255 pl 194.8.47.0 - 194.8.47.255 ru -194.8.48.0 - 194.8.49.255 gb +194.8.49.0 - 194.8.49.255 eu 194.8.50.0 - 194.8.50.255 fr 194.8.51.0 - 194.8.51.255 ua 194.8.52.0 - 194.8.52.255 be @@ -95457,7 +84993,6 @@ 194.8.55.0 - 194.8.55.255 ru 194.8.56.0 - 194.8.56.255 ua 194.8.57.0 - 194.8.58.255 de -194.8.59.0 - 194.8.59.255 ua 194.8.60.0 - 194.8.60.255 bg 194.8.61.0 - 194.8.61.255 at 194.8.62.0 - 194.8.62.255 be @@ -95470,7 +85005,6 @@ 194.8.78.0 - 194.8.79.255 ch 194.8.80.0 - 194.8.83.255 ro 194.8.84.0 - 194.8.85.255 ru -194.8.86.0 - 194.8.87.255 de 194.8.88.0 - 194.8.89.255 il 194.8.90.0 - 194.8.91.255 de 194.8.92.0 - 194.8.93.255 gb @@ -95495,16 +85029,13 @@ 194.8.250.0 - 194.8.251.255 fr 194.8.252.0 - 194.8.253.255 cz 194.8.254.0 - 194.8.255.255 gb -194.9.0.0 - 194.9.1.255 lu 194.9.2.0 - 194.9.3.255 ru 194.9.4.0 - 194.9.5.255 de 194.9.6.0 - 194.9.7.255 bg -194.9.8.0 - 194.9.9.255 se 194.9.10.0 - 194.9.11.255 de 194.9.12.0 - 194.9.13.255 mc 194.9.14.0 - 194.9.15.255 ua 194.9.16.0 - 194.9.17.255 pl -194.9.18.0 - 194.9.19.255 ru 194.9.20.0 - 194.9.21.255 cy 194.9.22.0 - 194.9.23.255 ro 194.9.24.0 - 194.9.25.255 pl @@ -95523,230 +85054,169 @@ 194.9.50.0 - 194.9.51.255 ua 194.9.52.0 - 194.9.53.255 pl 194.9.54.0 - 194.9.55.255 ch -194.9.56.0 - 194.9.57.255 ro 194.9.58.0 - 194.9.59.255 at 194.9.60.0 - 194.9.61.255 ro 194.9.62.0 - 194.9.63.255 fr 194.9.64.0 - 194.9.65.255 ke -194.9.66.0 - 194.9.67.255 pl +194.9.66.0 - 194.9.68.255 pl +194.9.69.0 - 194.9.69.255 ru 194.9.70.0 - 194.9.71.255 ua 194.9.72.0 - 194.9.73.255 de 194.9.74.0 - 194.9.75.255 se 194.9.76.0 - 194.9.77.255 gb 194.9.78.0 - 194.9.79.255 pl -194.9.80.0 - 194.9.81.255 gb 194.9.82.0 - 194.9.83.255 ke 194.9.84.0 - 194.9.85.255 nl 194.9.86.0 - 194.9.89.255 de 194.9.90.0 - 194.9.93.255 ro 194.9.94.0 - 194.9.116.255 se 194.9.117.0 - 194.9.119.255 de -194.9.120.0 - 194.9.123.255 ch +194.9.120.0 - 194.9.120.255 ch +194.9.121.0 - 194.9.121.255 eu +194.9.122.0 - 194.9.123.255 ch 194.9.124.0 - 194.9.166.255 de 194.9.167.0 - 194.9.167.255 ro 194.9.168.0 - 194.9.169.255 de 194.9.170.0 - 194.9.170.255 lv 194.9.171.0 - 194.9.171.255 uz -194.9.172.0 - 194.9.173.255 gb -194.9.174.0 - 194.9.174.255 tr 194.9.175.0 - 194.9.175.255 lv -194.9.176.0 - 194.9.179.255 be 194.9.180.0 - 194.9.181.255 at 194.9.182.0 - 194.9.183.255 de -194.9.184.0 - 194.9.187.255 fr 194.9.188.0 - 194.9.191.255 gb 194.9.192.0 - 194.9.207.255 de +194.9.212.0 - 194.9.215.255 lv 194.9.220.0 - 194.9.221.255 it -194.9.222.0 - 194.9.222.255 fr 194.9.223.0 - 194.9.223.255 pl 194.9.224.0 - 194.9.239.255 ru -194.9.240.0 - 194.10.4.255 gb -194.10.5.0 - 194.10.5.255 nl -194.10.6.0 - 194.10.6.255 de -194.10.7.0 - 194.10.7.255 gb -194.10.8.0 - 194.10.43.255 eu -194.10.44.0 - 194.10.44.255 gb -194.10.45.0 - 194.10.55.255 eu -194.10.56.0 - 194.10.57.255 be -194.10.58.0 - 194.10.58.255 gb -194.10.59.0 - 194.10.59.255 fr -194.10.60.0 - 194.10.61.255 de -194.10.62.0 - 194.10.67.255 fr -194.10.68.0 - 194.10.127.255 eu -194.10.128.0 - 194.10.129.255 gb -194.10.130.0 - 194.10.131.255 eu -194.10.132.0 - 194.10.133.255 gb -194.10.134.0 - 194.10.134.255 de -194.10.135.0 - 194.10.135.255 dk -194.10.136.0 - 194.10.137.255 at -194.10.138.0 - 194.10.138.255 de -194.10.139.0 - 194.10.139.255 hu -194.10.140.0 - 194.10.140.255 be -194.10.141.0 - 194.10.141.255 eu -194.10.142.0 - 194.10.142.255 gb -194.10.143.0 - 194.10.143.255 be -194.10.144.0 - 194.10.144.255 gb -194.10.145.0 - 194.10.145.255 be -194.10.146.0 - 194.10.146.255 nl -194.10.147.0 - 194.10.147.255 be -194.10.148.0 - 194.10.148.255 gb -194.10.149.0 - 194.10.149.255 ch -194.10.150.0 - 194.10.150.255 be -194.10.151.0 - 194.10.151.255 no -194.10.152.0 - 194.10.161.255 gb -194.10.162.0 - 194.10.162.255 ie -194.10.163.0 - 194.10.163.255 nl -194.10.164.0 - 194.10.164.255 gb -194.10.165.0 - 194.10.165.255 ch -194.10.166.0 - 194.10.167.255 gb -194.10.168.0 - 194.10.183.255 eu -194.10.184.0 - 194.10.184.255 gb -194.10.185.0 - 194.10.185.191 be -194.10.185.192 - 194.10.185.207 fr -194.10.185.208 - 194.10.185.215 be -194.10.185.216 - 194.10.185.223 fr -194.10.185.224 - 194.10.185.247 be -194.10.185.248 - 194.10.185.255 eu -194.10.186.0 - 194.10.186.255 gb -194.10.187.0 - 194.10.191.255 de -194.10.192.0 - 194.10.192.255 pl -194.10.193.0 - 194.10.193.255 nl -194.10.194.0 - 194.10.194.255 ch -194.10.195.0 - 194.10.195.255 at +194.9.240.0 - 194.9.252.224 gb +194.9.252.225 - 194.9.252.225 eu +194.9.252.226 - 194.9.253.224 gb +194.9.253.225 - 194.9.253.225 eu +194.9.253.226 - 194.10.3.255 gb +194.10.4.0 - 194.10.63.255 eu +194.10.64.0 - 194.10.67.255 fr +194.10.68.0 - 194.10.151.255 eu +194.10.152.0 - 194.10.159.255 gb +194.10.160.0 - 194.10.187.255 eu +194.10.188.0 - 194.10.191.255 de +194.10.192.0 - 194.10.195.255 eu 194.10.196.0 - 194.10.199.255 fr -194.10.200.0 - 194.10.200.255 be -194.10.201.0 - 194.10.201.255 eu -194.10.202.0 - 194.10.203.255 gb -194.10.204.0 - 194.10.204.255 be -194.10.205.0 - 194.10.205.255 gb -194.10.206.0 - 194.10.206.255 be -194.10.207.0 - 194.10.207.255 gb +194.10.200.0 - 194.10.207.255 eu 194.10.208.0 - 194.10.211.255 at -194.10.212.0 - 194.10.213.95 de -194.10.213.96 - 194.10.213.255 gb -194.10.214.0 - 194.10.215.255 de -194.10.216.0 - 194.10.223.255 eu +194.10.212.0 - 194.10.223.255 eu 194.10.224.0 - 194.10.239.255 gb -194.10.240.0 - 194.10.243.255 eu -194.10.244.0 - 194.10.244.255 be -194.10.245.0 - 194.10.245.255 de -194.10.246.0 - 194.10.246.255 fr -194.10.247.0 - 194.10.247.255 gb +194.10.240.0 - 194.10.247.255 eu 194.10.248.0 - 194.10.255.255 fr 194.11.0.0 - 194.11.15.255 ch -194.11.16.0 - 194.11.16.255 ru -194.11.17.0 - 194.11.19.255 gb -194.11.20.0 - 194.11.21.255 ru +194.11.16.0 - 194.11.19.255 gb 194.11.22.0 - 194.11.22.255 pl 194.11.23.0 - 194.11.23.255 pt 194.11.24.0 - 194.11.24.255 pl -194.11.25.0 - 194.11.25.255 pt 194.11.26.0 - 194.11.26.255 fr 194.11.27.0 - 194.11.27.255 at 194.11.28.0 - 194.11.28.255 ua 194.11.29.0 - 194.11.29.255 ru -194.11.30.0 - 194.11.169.255 ch +194.11.30.0 - 194.11.78.255 ch +194.11.79.0 - 194.11.79.255 eu +194.11.80.0 - 194.11.169.255 ch 194.11.170.0 - 194.11.170.255 de 194.11.171.0 - 194.11.171.255 at -194.11.172.0 - 194.11.199.255 ch -194.11.200.0 - 194.11.201.255 de -194.11.202.0 - 194.11.223.255 ch -194.11.224.0 - 194.11.224.255 be -194.11.225.0 - 194.11.246.255 ch +194.11.172.0 - 194.11.223.255 ch +194.11.225.0 - 194.11.225.255 ua +194.11.227.0 - 194.11.229.255 ch +194.11.232.0 - 194.11.243.255 ch +194.11.246.0 - 194.11.246.255 ch 194.11.247.0 - 194.11.247.255 ru -194.11.248.0 - 194.11.255.255 ch -194.12.0.0 - 194.12.31.255 se +194.11.252.0 - 194.11.254.131 de +194.11.254.132 - 194.11.254.132 eu +194.11.254.133 - 194.11.254.255 de +194.12.0.0 - 194.12.15.255 gb +194.12.16.0 - 194.12.31.255 ch 194.12.32.0 - 194.12.47.255 cz -194.12.48.0 - 194.12.63.255 se +194.12.48.0 - 194.12.63.255 cy 194.12.64.0 - 194.12.127.255 ua 194.12.128.0 - 194.12.191.255 ch 194.12.192.0 - 194.12.223.255 de 194.12.224.0 - 194.12.255.255 bg -194.13.0.0 - 194.13.110.255 nl +194.13.0.0 - 194.13.107.255 nl 194.13.111.0 - 194.13.111.255 gr -194.13.112.0 - 194.13.134.255 nl +194.13.112.0 - 194.13.133.255 nl 194.13.135.0 - 194.13.135.255 de -194.13.136.0 - 194.13.255.255 nl -194.14.0.0 - 194.14.4.255 se -194.14.5.0 - 194.14.5.255 gb -194.14.6.0 - 194.14.51.255 se +194.13.142.0 - 194.13.255.255 nl +194.14.0.0 - 194.14.8.255 se +194.14.9.0 - 194.14.9.255 eu +194.14.10.0 - 194.14.27.255 se +194.14.28.0 - 194.14.29.255 fr +194.14.30.0 - 194.14.51.255 se 194.14.52.0 - 194.14.52.255 es -194.14.53.0 - 194.14.105.255 se +194.14.53.0 - 194.14.73.255 se +194.14.74.0 - 194.14.75.255 ch +194.14.76.0 - 194.14.84.255 se +194.14.85.0 - 194.14.85.255 no +194.14.86.0 - 194.14.86.255 se +194.14.87.0 - 194.14.87.255 it +194.14.88.0 - 194.14.105.255 se 194.14.106.0 - 194.14.107.255 us 194.14.108.0 - 194.14.108.255 es 194.14.109.0 - 194.14.130.255 se 194.14.131.0 - 194.14.131.255 gb -194.14.132.0 - 194.14.164.255 se -194.14.165.0 - 194.14.165.255 gb -194.14.166.0 - 194.14.176.255 se -194.14.177.0 - 194.14.177.255 sg -194.14.178.0 - 194.14.178.255 se +194.14.132.0 - 194.14.178.255 se 194.14.179.0 - 194.14.179.255 it 194.14.180.0 - 194.14.180.255 de -194.14.181.0 - 194.14.187.255 se -194.14.188.0 - 194.14.189.255 dk -194.14.190.0 - 194.14.255.255 se -194.15.0.0 - 194.15.111.255 de +194.14.181.0 - 194.14.181.255 us +194.14.182.0 - 194.14.187.255 se +194.14.188.0 - 194.14.188.255 dk +194.14.189.0 - 194.14.216.255 se +194.14.217.0 - 194.14.217.255 li +194.14.218.0 - 194.14.253.255 se +194.14.254.0 - 194.14.255.255 be +194.15.0.0 - 194.15.31.255 de +194.15.64.0 - 194.15.111.255 de 194.15.112.0 - 194.15.115.255 ua 194.15.116.0 - 194.15.119.255 ru 194.15.120.0 - 194.15.124.255 pl -194.15.125.0 - 194.15.125.255 ru -194.15.126.0 - 194.15.127.255 ua -194.15.128.0 - 194.15.140.255 de +194.15.125.0 - 194.15.127.255 ru +194.15.128.0 - 194.15.139.255 de 194.15.141.0 - 194.15.141.255 se -194.15.142.0 - 194.15.146.255 de +194.15.142.0 - 194.15.145.255 de 194.15.147.0 - 194.15.147.255 ua -194.15.148.0 - 194.15.211.255 de +194.15.148.0 - 194.15.151.255 de +194.15.156.0 - 194.15.211.255 de 194.15.212.0 - 194.15.212.255 se 194.15.213.0 - 194.15.213.255 es -194.15.214.0 - 194.15.227.255 de -194.15.228.0 - 194.15.229.255 ch -194.15.230.0 - 194.15.230.255 de -194.15.231.0 - 194.15.231.255 ch +194.15.214.0 - 194.15.223.255 de +194.15.228.0 - 194.15.231.255 ch 194.15.232.0 - 194.15.255.255 de -194.16.0.0 - 194.16.89.47 se -194.16.89.48 - 194.16.89.51 dk -194.16.89.52 - 194.17.59.63 se -194.17.59.64 - 194.17.59.71 dk -194.17.59.72 - 194.18.255.255 se -194.19.0.0 - 194.19.127.255 no -194.19.128.0 - 194.19.193.255 dk -194.19.194.0 - 194.19.194.255 se -194.19.195.0 - 194.19.199.255 dk -194.19.200.0 - 194.19.201.255 se -194.19.202.0 - 194.19.223.255 dk -194.19.224.0 - 194.19.245.255 lv -194.19.246.0 - 194.19.246.31 ru -194.19.246.32 - 194.19.246.39 lv -194.19.246.40 - 194.19.246.255 ru -194.19.247.0 - 194.19.255.255 lv -194.20.0.0 - 194.21.33.255 it -194.21.34.0 - 194.21.35.255 se -194.21.36.0 - 194.21.121.255 it -194.21.122.0 - 194.21.122.255 sm -194.21.123.0 - 194.21.255.255 it -194.22.0.0 - 194.22.1.255 se -194.22.2.0 - 194.22.2.255 nl -194.22.3.0 - 194.22.7.255 se -194.22.8.0 - 194.22.16.255 nl -194.22.17.0 - 194.22.31.255 se +194.16.0.0 - 194.17.208.220 se +194.17.208.221 - 194.17.208.221 eu +194.17.208.222 - 194.18.255.255 se +194.19.0.0 - 194.19.69.255 no +194.19.70.0 - 194.19.70.255 se +194.19.71.0 - 194.19.102.255 no +194.19.103.0 - 194.19.103.255 se +194.19.104.0 - 194.19.127.255 no +194.19.128.0 - 194.19.223.255 dk +194.19.224.0 - 194.19.255.255 lv +194.20.0.0 - 194.21.255.255 it +194.22.0.0 - 194.22.7.255 se +194.22.8.0 - 194.22.15.255 nl +194.22.16.0 - 194.22.31.255 se 194.22.32.0 - 194.22.47.255 de 194.22.48.0 - 194.22.63.255 se 194.22.64.0 - 194.22.95.255 no -194.22.96.0 - 194.23.226.255 se -194.23.227.0 - 194.23.227.255 de -194.23.228.0 - 194.23.255.255 se -194.24.0.0 - 194.24.127.255 ch +194.22.96.0 - 194.23.255.255 se +194.24.0.0 - 194.24.1.255 ch +194.24.2.0 - 194.24.2.255 eu +194.24.3.0 - 194.24.127.255 ch 194.24.128.0 - 194.24.159.255 at 194.24.160.0 - 194.24.161.255 de -194.24.162.0 - 194.24.163.255 ua 194.24.164.0 - 194.24.165.255 pl 194.24.166.0 - 194.24.167.255 gb 194.24.168.0 - 194.24.169.255 tr 194.24.170.0 - 194.24.171.255 gr 194.24.172.0 - 194.24.173.255 de 194.24.174.0 - 194.24.175.255 pl -194.24.176.0 - 194.24.179.255 ro +194.24.178.0 - 194.24.179.255 ro 194.24.180.0 - 194.24.181.255 pl 194.24.182.0 - 194.24.187.255 ua 194.24.188.0 - 194.24.189.255 gb @@ -95756,7 +85226,6 @@ 194.24.226.0 - 194.24.227.255 gr 194.24.228.0 - 194.24.229.255 fr 194.24.230.0 - 194.24.231.255 de -194.24.232.0 - 194.24.233.255 gb 194.24.234.0 - 194.24.235.255 ro 194.24.236.0 - 194.24.237.255 ua 194.24.238.0 - 194.24.239.255 pl @@ -95765,37 +85234,19 @@ 194.24.244.0 - 194.24.245.255 pl 194.24.246.0 - 194.24.247.255 ua 194.24.248.0 - 194.24.249.255 rs -194.24.250.0 - 194.24.251.255 gb 194.24.252.0 - 194.24.253.255 no 194.24.254.0 - 194.24.255.255 gb -194.25.0.0 - 194.25.35.239 de -194.25.35.240 - 194.25.35.247 gb -194.25.35.248 - 194.25.99.79 de -194.25.99.80 - 194.25.99.87 gb -194.25.99.88 - 194.25.111.135 de -194.25.111.136 - 194.25.111.143 us -194.25.111.144 - 194.25.118.63 de -194.25.118.64 - 194.25.118.79 es -194.25.118.80 - 194.25.119.167 de -194.25.119.168 - 194.25.119.175 it -194.25.119.176 - 194.25.131.223 de -194.25.131.224 - 194.25.131.231 be -194.25.131.232 - 194.25.255.255 de -194.26.0.0 - 194.26.12.239 nl -194.26.12.240 - 194.26.12.247 fr -194.26.12.248 - 194.26.21.255 nl +194.25.0.0 - 194.25.101.255 de +194.25.102.0 - 194.25.102.255 eu +194.25.103.0 - 194.25.255.255 de +194.26.0.0 - 194.26.21.255 nl 194.26.22.0 - 194.26.23.255 gr 194.26.24.0 - 194.26.24.255 be -194.26.25.0 - 194.26.25.255 de -194.26.26.0 - 194.26.113.255 nl -194.26.114.0 - 194.26.114.255 gb -194.26.115.0 - 194.26.116.255 nl -194.26.117.0 - 194.26.117.255 gb -194.26.118.0 - 194.26.157.255 nl +194.26.26.0 - 194.26.26.255 ch +194.26.28.0 - 194.26.28.255 nl +194.26.32.0 - 194.26.157.255 nl 194.26.158.0 - 194.26.159.255 de -194.26.160.0 - 194.26.175.255 nl -194.26.176.0 - 194.26.183.255 de -194.26.184.0 - 194.26.255.255 nl +194.26.160.0 - 194.26.255.255 nl 194.27.0.0 - 194.27.255.255 tr 194.28.0.0 - 194.28.3.255 fi 194.28.4.0 - 194.28.7.255 ua @@ -95808,7 +85259,6 @@ 194.28.32.0 - 194.28.35.255 pl 194.28.36.0 - 194.28.39.255 ua 194.28.40.0 - 194.28.43.255 pl -194.28.44.0 - 194.28.47.255 ua 194.28.48.0 - 194.28.51.255 pl 194.28.52.0 - 194.28.55.255 ua 194.28.56.0 - 194.28.59.255 ru @@ -95821,7 +85271,7 @@ 194.28.100.0 - 194.28.103.255 ua 194.28.104.0 - 194.28.107.255 pl 194.28.108.0 - 194.28.111.255 si -194.28.112.0 - 194.28.115.255 md +194.28.112.0 - 194.28.115.255 nl 194.28.116.0 - 194.28.119.255 it 194.28.120.0 - 194.28.123.255 se 194.28.124.0 - 194.28.127.255 gb @@ -95845,41 +85295,30 @@ 194.28.220.0 - 194.28.223.255 pl 194.28.224.0 - 194.28.227.255 ru 194.28.228.0 - 194.28.231.255 pl -194.28.232.0 - 194.28.235.255 ro +194.28.232.0 - 194.28.235.255 lt 194.28.236.0 - 194.28.243.255 ru 194.28.244.0 - 194.28.247.255 gb 194.28.248.0 - 194.28.255.255 dk 194.29.0.0 - 194.29.31.255 ch 194.29.32.0 - 194.29.47.255 il 194.29.48.0 - 194.29.51.255 gr -194.29.52.0 - 194.29.55.255 it -194.29.56.0 - 194.29.59.255 ch +194.29.56.0 - 194.29.59.255 de 194.29.60.0 - 194.29.63.255 ua -194.29.64.0 - 194.29.66.255 be -194.29.67.0 - 194.29.67.255 gb -194.29.68.0 - 194.29.69.255 it +194.29.64.0 - 194.29.69.255 eu 194.29.70.0 - 194.29.70.255 nl 194.29.71.0 - 194.29.71.255 gb -194.29.72.0 - 194.29.72.255 de +194.29.72.0 - 194.29.72.255 eu 194.29.73.0 - 194.29.73.255 nl -194.29.74.0 - 194.29.77.255 gb -194.29.78.0 - 194.29.78.255 nl -194.29.79.0 - 194.29.79.255 fr -194.29.80.0 - 194.29.80.255 de -194.29.81.0 - 194.29.81.255 be -194.29.82.0 - 194.29.83.255 gb -194.29.84.0 - 194.29.96.255 eu -194.29.97.0 - 194.29.98.255 be -194.29.99.0 - 194.29.99.255 at -194.29.100.0 - 194.29.101.255 gr -194.29.102.0 - 194.29.113.255 eu -194.29.114.0 - 194.29.114.255 at -194.29.115.0 - 194.29.115.255 eu -194.29.116.0 - 194.29.117.255 at -194.29.118.0 - 194.29.119.255 se -194.29.120.0 - 194.29.120.255 de -194.29.121.0 - 194.29.127.255 eu +194.29.74.0 - 194.29.74.255 gb +194.29.75.0 - 194.29.97.255 eu +194.29.98.0 - 194.29.98.255 be +194.29.99.0 - 194.29.117.255 eu +194.29.118.0 - 194.29.118.255 se +194.29.119.0 - 194.29.127.255 eu 194.29.128.0 - 194.29.183.255 pl +194.29.184.0 - 194.29.184.255 de +194.29.185.0 - 194.29.185.255 hu +194.29.186.0 - 194.29.187.255 ru 194.29.188.0 - 194.29.191.255 de 194.29.192.0 - 194.29.199.255 fi 194.29.200.0 - 194.29.203.255 no @@ -95893,11 +85332,9 @@ 194.30.0.0 - 194.30.127.255 es 194.30.128.0 - 194.30.159.255 cy 194.30.160.0 - 194.30.160.255 nl -194.30.161.0 - 194.30.161.255 ro 194.30.162.0 - 194.30.162.255 de 194.30.163.0 - 194.30.163.255 ua 194.30.164.0 - 194.30.164.255 pl -194.30.165.0 - 194.30.165.255 ru 194.30.166.0 - 194.30.166.255 gb 194.30.167.0 - 194.30.167.255 de 194.30.168.0 - 194.30.168.255 ro @@ -95907,40 +85344,99 @@ 194.30.172.0 - 194.30.172.255 ua 194.30.173.0 - 194.30.174.255 de 194.30.175.0 - 194.30.175.255 nl -194.30.176.0 - 194.30.176.255 ch -194.30.177.0 - 194.30.177.255 ro -194.30.178.0 - 194.30.178.255 de +194.30.178.0 - 194.30.178.255 gr 194.30.179.0 - 194.30.179.255 pl 194.30.180.0 - 194.30.180.255 de -194.30.181.0 - 194.30.181.255 ch +194.30.181.0 - 194.30.181.169 ch +194.30.181.170 - 194.30.181.170 eu +194.30.181.171 - 194.30.181.255 ch 194.30.182.0 - 194.30.182.255 nl -194.30.183.0 - 194.30.183.255 de 194.30.184.0 - 194.30.184.255 gb 194.30.185.0 - 194.30.185.255 de 194.30.186.0 - 194.30.186.255 gb 194.30.187.0 - 194.30.187.255 sk 194.30.188.0 - 194.30.188.255 nl -194.30.189.0 - 194.30.189.255 dk +194.30.189.0 - 194.30.189.255 gb 194.30.190.0 - 194.30.190.255 ru 194.30.191.0 - 194.30.191.255 at 194.30.192.0 - 194.30.255.255 gr -194.31.0.0 - 194.31.206.255 de +194.31.0.0 - 194.31.31.255 de +194.31.32.0 - 194.31.38.255 pl +194.31.39.0 - 194.31.39.255 no +194.31.40.0 - 194.31.41.255 pl +194.31.42.0 - 194.31.42.255 md +194.31.43.0 - 194.31.43.255 pl +194.31.44.0 - 194.31.47.255 ua +194.31.48.0 - 194.31.49.255 pl +194.31.50.0 - 194.31.51.255 gb +194.31.56.0 - 194.31.56.255 ee +194.31.57.0 - 194.31.57.255 kw +194.31.58.0 - 194.31.58.255 il +194.31.59.0 - 194.31.59.255 ru +194.31.60.0 - 194.31.60.255 pl +194.31.61.0 - 194.31.61.255 is +194.31.62.0 - 194.31.62.255 gb +194.31.63.0 - 194.31.63.255 pl +194.31.64.0 - 194.31.127.255 de +194.31.192.0 - 194.31.203.255 de +194.31.206.0 - 194.31.206.255 de 194.31.207.0 - 194.31.207.255 ch 194.31.208.0 - 194.31.231.255 de 194.31.232.0 - 194.31.232.255 ru -194.31.233.0 - 194.31.255.255 de -194.32.0.0 - 194.32.149.255 gb -194.32.150.0 - 194.32.151.255 se -194.32.152.0 - 194.33.11.255 gb -194.33.12.0 - 194.33.12.255 ua +194.31.233.0 - 194.31.235.255 de +194.31.238.0 - 194.31.238.255 de +194.31.240.0 - 194.31.247.255 de +194.31.248.0 - 194.31.249.255 ua +194.31.250.0 - 194.31.251.255 ru +194.31.252.0 - 194.31.252.255 pl +194.31.253.0 - 194.31.253.255 ru +194.31.254.0 - 194.31.254.255 ch +194.32.0.0 - 194.32.79.255 gb +194.32.82.0 - 194.32.82.255 gb +194.32.84.0 - 194.32.85.255 tr +194.32.86.0 - 194.32.87.255 ru +194.32.150.0 - 194.32.150.255 rs +194.32.151.0 - 194.32.151.255 se +194.32.160.0 - 194.32.223.255 gb +194.33.0.0 - 194.33.7.255 gb +194.33.11.0 - 194.33.11.255 gb +194.33.12.0 - 194.33.12.255 si 194.33.13.0 - 194.33.13.255 gb 194.33.14.0 - 194.33.14.255 ro 194.33.15.0 - 194.33.15.255 ua -194.33.16.0 - 194.33.16.255 gb -194.33.17.0 - 194.33.19.255 de -194.33.20.0 - 194.33.179.255 gb -194.33.180.0 - 194.33.181.255 ua -194.33.182.0 - 194.33.182.255 fr +194.33.17.0 - 194.33.17.255 eu +194.33.18.0 - 194.33.19.255 de +194.33.24.0 - 194.33.63.255 gb +194.33.64.0 - 194.33.67.255 ro +194.33.68.0 - 194.33.68.255 sa +194.33.69.0 - 194.33.69.255 hu +194.33.70.0 - 194.33.71.255 sa +194.33.72.0 - 194.33.77.255 pl +194.33.78.0 - 194.33.78.255 fr +194.33.79.0 - 194.33.79.255 ru +194.33.80.0 - 194.33.80.255 se +194.33.81.0 - 194.33.82.255 ru +194.33.83.0 - 194.33.83.255 pl +194.33.84.0 - 194.33.87.255 ru +194.33.92.0 - 194.33.95.255 ru +194.33.96.0 - 194.33.96.255 nl +194.33.97.0 - 194.33.97.255 ru +194.33.98.0 - 194.33.99.255 ch +194.33.100.0 - 194.33.103.255 ro +194.33.104.0 - 194.33.107.255 ir +194.33.108.0 - 194.33.108.255 at +194.33.109.0 - 194.33.109.255 gb +194.33.110.0 - 194.33.110.255 ru +194.33.111.0 - 194.33.111.255 pl +194.33.112.0 - 194.33.113.255 nl +194.33.114.0 - 194.33.114.255 ru +194.33.115.0 - 194.33.115.255 de +194.33.116.0 - 194.33.119.255 pl +194.33.120.0 - 194.33.121.255 de +194.33.122.0 - 194.33.127.255 ir +194.33.128.0 - 194.33.179.255 gb +194.33.180.0 - 194.33.180.255 ru +194.33.181.0 - 194.33.181.255 ua 194.33.183.0 - 194.33.183.255 gb 194.33.184.0 - 194.33.184.255 hu 194.33.185.0 - 194.33.185.255 pl @@ -95951,13 +85447,25 @@ 194.33.191.0 - 194.33.191.255 ru 194.33.192.0 - 194.34.11.255 gb 194.34.12.0 - 194.34.12.255 bg -194.34.13.0 - 194.34.197.255 gb +194.34.13.0 - 194.34.63.255 gb +194.34.64.0 - 194.34.95.255 au +194.34.96.0 - 194.34.191.255 gb 194.34.198.0 - 194.34.198.255 pl -194.34.199.0 - 194.35.255.255 gb +194.34.200.0 - 194.34.223.255 gb +194.35.0.0 - 194.35.72.255 gb +194.35.74.0 - 194.35.74.255 ro +194.35.79.0 - 194.35.95.255 gb +194.35.128.0 - 194.35.255.255 gb 194.36.0.0 - 194.36.0.255 dk -194.36.1.0 - 194.36.21.255 gb +194.36.1.0 - 194.36.15.255 gb +194.36.16.0 - 194.36.17.255 ru +194.36.18.0 - 194.36.18.255 de +194.36.19.0 - 194.36.19.255 ru +194.36.20.0 - 194.36.20.255 de +194.36.21.0 - 194.36.21.255 gb 194.36.22.0 - 194.36.22.255 fr -194.36.23.0 - 194.36.159.255 gb +194.36.23.0 - 194.36.23.255 gb +194.36.48.0 - 194.36.159.255 gb 194.36.160.0 - 194.36.160.255 tr 194.36.161.0 - 194.36.161.255 ru 194.36.162.0 - 194.36.162.255 ee @@ -95965,90 +85473,80 @@ 194.36.164.0 - 194.36.164.255 sa 194.36.165.0 - 194.36.165.255 pl 194.36.166.0 - 194.36.166.255 fr -194.36.167.0 - 194.36.167.255 bg 194.36.168.0 - 194.36.168.255 pl -194.36.169.0 - 194.36.223.255 gb +194.36.208.0 - 194.36.223.255 gb 194.36.224.0 - 194.36.239.255 lu 194.36.240.0 - 194.36.255.255 gb -194.37.0.0 - 194.37.247.255 at +194.37.0.0 - 194.37.79.255 at +194.37.84.0 - 194.37.87.255 de +194.37.96.0 - 194.37.247.255 at 194.37.248.0 - 194.37.248.255 ua 194.37.249.0 - 194.37.249.255 se -194.37.250.0 - 194.37.251.255 at 194.37.252.0 - 194.37.252.255 it -194.37.253.0 - 194.37.254.255 at +194.37.253.0 - 194.37.253.255 at 194.37.255.0 - 194.37.255.255 de -194.38.0.0 - 194.38.63.255 se 194.38.64.0 - 194.38.95.255 ch 194.38.96.0 - 194.38.127.255 hu 194.38.128.0 - 194.38.159.255 pt -194.38.160.0 - 194.38.162.159 ch -194.38.162.160 - 194.38.162.167 es -194.38.162.168 - 194.38.255.255 ch -194.39.0.0 - 194.39.83.255 de +194.38.160.0 - 194.38.255.255 ch +194.39.0.0 - 194.39.81.255 de 194.39.84.0 - 194.39.84.255 pt 194.39.85.0 - 194.39.85.255 si 194.39.86.0 - 194.39.140.255 de -194.39.141.0 - 194.39.141.255 be -194.39.142.0 - 194.39.143.255 gb -194.39.144.0 - 194.39.186.255 de -194.39.187.0 - 194.39.187.255 ch -194.39.188.0 - 194.39.206.255 de -194.39.207.0 - 194.39.207.255 fr -194.39.208.0 - 194.39.255.255 de -194.40.0.0 - 194.40.255.255 ch +194.39.141.0 - 194.39.141.255 eu +194.39.143.0 - 194.39.143.255 gb +194.39.144.0 - 194.39.183.255 de +194.39.184.0 - 194.39.184.255 nl +194.39.185.0 - 194.39.186.255 de +194.39.188.0 - 194.39.195.255 de +194.39.214.0 - 194.39.214.255 de +194.39.218.0 - 194.39.218.255 eu +194.39.219.0 - 194.39.255.255 de +194.40.0.0 - 194.40.203.255 ch +194.40.204.0 - 194.40.207.255 ro +194.40.208.0 - 194.40.209.255 it +194.40.210.0 - 194.40.210.255 ro +194.40.211.0 - 194.40.211.255 si +194.40.212.0 - 194.40.255.255 ch 194.41.0.0 - 194.41.0.255 de -194.41.1.0 - 194.41.1.255 gb 194.41.2.0 - 194.41.3.255 se 194.41.4.0 - 194.41.7.255 it -194.41.8.0 - 194.41.8.255 eu 194.41.9.0 - 194.41.9.255 it -194.41.10.0 - 194.41.11.255 gb -194.41.16.0 - 194.41.31.255 fi -194.41.32.0 - 194.41.32.255 es -194.41.33.0 - 194.41.33.255 fi -194.41.34.0 - 194.41.35.255 de -194.41.36.0 - 194.41.36.255 eu -194.41.37.0 - 194.41.39.255 de -194.41.40.0 - 194.41.40.255 nl -194.41.41.0 - 194.41.42.255 se -194.41.43.0 - 194.41.52.255 gb -194.41.53.0 - 194.41.54.255 nl -194.41.55.0 - 194.41.55.255 se -194.41.56.0 - 194.41.56.255 gb +194.41.12.0 - 194.41.15.255 pl +194.41.16.0 - 194.41.19.255 fi +194.41.20.0 - 194.41.21.255 sg +194.41.22.0 - 194.41.31.255 fi +194.41.39.0 - 194.41.39.255 de 194.41.57.0 - 194.41.57.255 de -194.41.58.0 - 194.41.58.255 fi -194.41.59.0 - 194.41.59.255 fr -194.41.60.0 - 194.41.61.255 eu +194.41.60.0 - 194.41.61.255 gb 194.41.62.0 - 194.41.62.255 nl 194.41.63.0 - 194.41.95.255 ch 194.41.96.0 - 194.41.111.255 be -194.41.112.0 - 194.41.120.255 ch -194.41.121.0 - 194.41.127.255 nl -194.41.128.0 - 194.41.228.247 ch -194.41.228.248 - 194.41.228.255 dk -194.41.229.0 - 194.41.255.255 ch +194.41.128.0 - 194.41.255.255 ch 194.42.0.0 - 194.42.39.255 cy 194.42.40.0 - 194.42.40.255 pl 194.42.41.0 - 194.42.42.255 it 194.42.43.0 - 194.42.43.255 pt 194.42.44.0 - 194.42.45.255 ro -194.42.46.0 - 194.42.46.255 de -194.42.47.0 - 194.42.47.127 dk -194.42.47.128 - 194.42.47.255 de +194.42.46.0 - 194.42.47.255 de 194.42.48.0 - 194.42.48.255 ch 194.42.49.0 - 194.42.49.255 dk 194.42.50.0 - 194.42.54.255 gr 194.42.55.0 - 194.42.55.31 de -194.42.55.32 - 194.42.55.127 ch -194.42.55.128 - 194.42.55.159 es +194.42.55.32 - 194.42.55.159 cy 194.42.55.160 - 194.42.55.191 se 194.42.55.192 - 194.42.55.223 de 194.42.55.224 - 194.42.55.255 dk 194.42.56.0 - 194.42.63.255 ie -194.42.64.0 - 194.42.95.255 gb -194.42.96.0 - 194.42.97.255 mw +194.42.64.0 - 194.42.75.7 gb +194.42.75.8 - 194.42.75.31 be +194.42.75.32 - 194.42.75.95 gb +194.42.75.96 - 194.42.75.103 be +194.42.75.104 - 194.42.79.92 gb +194.42.79.93 - 194.42.79.93 se +194.42.79.94 - 194.42.95.255 gb 194.42.98.0 - 194.42.99.255 lu -194.42.100.0 - 194.42.105.255 ro +194.42.100.0 - 194.42.103.255 ro 194.42.106.0 - 194.42.107.255 ua 194.42.108.0 - 194.42.109.255 de 194.42.110.0 - 194.42.111.255 pl @@ -96058,21 +85556,10 @@ 194.42.122.0 - 194.42.123.255 nl 194.42.124.0 - 194.42.125.255 gb 194.42.126.0 - 194.42.127.255 ro -194.42.128.0 - 194.42.147.255 cy -194.42.148.0 - 194.42.148.3 gr -194.42.148.4 - 194.42.148.7 cy -194.42.148.8 - 194.42.148.23 gr -194.42.148.24 - 194.42.148.63 cy -194.42.148.64 - 194.42.148.127 gr -194.42.148.128 - 194.42.148.191 cy -194.42.148.192 - 194.42.148.223 gr -194.42.148.224 - 194.42.159.255 cy +194.42.128.0 - 194.42.159.255 cy 194.42.160.0 - 194.42.162.127 ch -194.42.162.128 - 194.42.162.255 be -194.42.163.0 - 194.42.163.255 gb -194.42.164.0 - 194.42.164.255 it -194.42.165.0 - 194.42.170.255 be -194.42.171.0 - 194.42.175.255 at +194.42.162.128 - 194.42.171.255 eu +194.42.172.0 - 194.42.175.255 at 194.42.176.0 - 194.42.191.255 de 194.42.192.0 - 194.42.207.255 ua 194.42.208.0 - 194.42.209.255 be @@ -96086,800 +85573,29 @@ 194.42.220.0 - 194.42.223.255 nl 194.42.224.0 - 194.43.255.255 gb 194.44.0.0 - 194.44.255.255 ua -194.45.0.0 - 194.45.7.255 de -194.45.8.0 - 194.45.9.239 nl -194.45.9.240 - 194.45.9.247 de -194.45.9.248 - 194.45.11.255 nl -194.45.12.0 - 194.45.13.255 de -194.45.14.0 - 194.45.14.119 nl -194.45.14.120 - 194.45.14.127 de -194.45.14.128 - 194.45.19.255 nl -194.45.20.0 - 194.45.27.255 de -194.45.28.0 - 194.45.31.159 nl -194.45.31.160 - 194.45.31.167 de -194.45.31.168 - 194.45.32.255 nl -194.45.33.0 - 194.45.56.255 de -194.45.57.0 - 194.45.57.7 nl -194.45.57.8 - 194.45.57.15 de -194.45.57.16 - 194.45.58.79 nl -194.45.58.80 - 194.45.58.87 de -194.45.58.88 - 194.45.58.239 nl -194.45.58.240 - 194.45.58.247 de -194.45.58.248 - 194.45.61.31 nl -194.45.61.32 - 194.45.61.39 de -194.45.61.40 - 194.45.61.231 nl -194.45.61.232 - 194.45.61.239 de -194.45.61.240 - 194.45.62.223 nl -194.45.62.224 - 194.45.62.231 de -194.45.62.232 - 194.45.68.95 nl -194.45.68.96 - 194.45.68.103 de -194.45.68.104 - 194.45.68.215 nl -194.45.68.216 - 194.45.68.223 de -194.45.68.224 - 194.45.68.239 nl -194.45.68.240 - 194.45.68.247 de -194.45.68.248 - 194.45.69.231 nl -194.45.69.232 - 194.45.69.239 de -194.45.69.240 - 194.45.69.255 nl -194.45.70.0 - 194.45.71.255 de -194.45.72.0 - 194.45.72.15 nl -194.45.72.16 - 194.45.72.23 de -194.45.72.24 - 194.45.72.151 nl -194.45.72.152 - 194.45.72.159 de -194.45.72.160 - 194.45.72.199 nl -194.45.72.200 - 194.45.72.207 de -194.45.72.208 - 194.45.73.135 nl -194.45.73.136 - 194.45.73.143 de -194.45.73.144 - 194.45.74.47 nl -194.45.74.48 - 194.45.74.55 de -194.45.74.56 - 194.45.74.95 nl -194.45.74.96 - 194.45.74.103 de -194.45.74.104 - 194.45.75.231 nl -194.45.75.232 - 194.45.75.239 de -194.45.75.240 - 194.45.75.255 nl +194.45.0.0 - 194.45.3.255 de +194.45.4.0 - 194.45.45.255 nl +194.45.46.0 - 194.45.46.255 fr +194.45.47.0 - 194.45.47.255 nl +194.45.48.0 - 194.45.48.255 de +194.45.49.0 - 194.45.51.255 nl +194.45.52.0 - 194.45.55.255 de +194.45.56.0 - 194.45.75.255 nl 194.45.76.0 - 194.45.79.255 de -194.45.80.0 - 194.45.80.159 nl -194.45.80.160 - 194.45.80.167 de -194.45.80.168 - 194.45.80.175 nl -194.45.80.176 - 194.45.80.183 de -194.45.80.184 - 194.45.80.239 nl -194.45.80.240 - 194.45.80.247 de -194.45.80.248 - 194.45.80.255 nl -194.45.81.0 - 194.45.81.7 de -194.45.81.8 - 194.45.81.23 nl -194.45.81.24 - 194.45.81.31 de -194.45.81.32 - 194.45.81.103 nl -194.45.81.104 - 194.45.81.111 de -194.45.81.112 - 194.45.81.183 nl -194.45.81.184 - 194.45.81.191 de -194.45.81.192 - 194.45.81.255 nl -194.45.82.0 - 194.45.82.7 de -194.45.82.8 - 194.45.82.55 nl -194.45.82.56 - 194.45.82.63 de -194.45.82.64 - 194.45.82.135 nl -194.45.82.136 - 194.45.82.143 de -194.45.82.144 - 194.45.82.215 nl -194.45.82.216 - 194.45.82.223 de -194.45.82.224 - 194.45.83.87 nl -194.45.83.88 - 194.45.83.95 de -194.45.83.96 - 194.45.83.199 nl -194.45.83.200 - 194.45.83.207 de -194.45.83.208 - 194.45.84.87 nl -194.45.84.88 - 194.45.84.95 de -194.45.84.96 - 194.45.84.103 nl -194.45.84.104 - 194.45.84.111 de -194.45.84.112 - 194.45.84.127 nl -194.45.84.128 - 194.45.84.135 de -194.45.84.136 - 194.45.84.143 nl -194.45.84.144 - 194.45.84.151 de -194.45.84.152 - 194.45.84.207 nl -194.45.84.208 - 194.45.84.215 de -194.45.84.216 - 194.45.84.231 nl -194.45.84.232 - 194.45.84.239 de -194.45.84.240 - 194.45.85.135 nl -194.45.85.136 - 194.45.85.151 de -194.45.85.152 - 194.45.85.247 nl -194.45.85.248 - 194.45.85.255 de -194.45.86.0 - 194.45.86.159 nl -194.45.86.160 - 194.45.86.167 de -194.45.86.168 - 194.45.86.175 nl -194.45.86.176 - 194.45.86.183 de -194.45.86.184 - 194.45.86.207 nl -194.45.86.208 - 194.45.86.223 de -194.45.86.224 - 194.45.86.239 nl -194.45.86.240 - 194.45.86.247 de -194.45.86.248 - 194.45.87.55 nl -194.45.87.56 - 194.45.87.63 de -194.45.87.64 - 194.45.88.71 nl -194.45.88.72 - 194.45.88.79 de -194.45.88.80 - 194.45.88.87 nl -194.45.88.88 - 194.45.88.95 de -194.45.88.96 - 194.45.88.159 nl -194.45.88.160 - 194.45.88.167 de -194.45.88.168 - 194.45.89.15 nl -194.45.89.16 - 194.45.89.23 de -194.45.89.24 - 194.45.89.63 nl -194.45.89.64 - 194.45.89.79 de -194.45.89.80 - 194.45.89.95 nl -194.45.89.96 - 194.45.89.103 de -194.45.89.104 - 194.45.89.167 nl -194.45.89.168 - 194.45.89.175 de -194.45.89.176 - 194.45.89.215 nl -194.45.89.216 - 194.45.89.223 de -194.45.89.224 - 194.45.90.7 nl -194.45.90.8 - 194.45.90.15 de -194.45.90.16 - 194.45.90.39 nl -194.45.90.40 - 194.45.90.47 de -194.45.90.48 - 194.45.90.71 nl -194.45.90.72 - 194.45.90.79 de -194.45.90.80 - 194.45.90.103 nl -194.45.90.104 - 194.45.90.119 de -194.45.90.120 - 194.45.91.79 nl -194.45.91.80 - 194.45.91.87 de -194.45.91.88 - 194.45.91.175 nl -194.45.91.176 - 194.45.91.183 de -194.45.91.184 - 194.45.91.207 nl -194.45.91.208 - 194.45.91.223 de -194.45.91.224 - 194.45.92.7 nl -194.45.92.8 - 194.45.92.15 de -194.45.92.16 - 194.45.92.31 nl -194.45.92.32 - 194.45.92.39 de -194.45.92.40 - 194.45.92.47 nl -194.45.92.48 - 194.45.92.55 de -194.45.92.56 - 194.45.92.151 nl -194.45.92.152 - 194.45.92.159 de -194.45.92.160 - 194.45.92.207 nl -194.45.92.208 - 194.45.92.215 de -194.45.92.216 - 194.45.92.223 nl -194.45.92.224 - 194.45.92.231 de -194.45.92.232 - 194.45.93.87 nl -194.45.93.88 - 194.45.93.103 de -194.45.93.104 - 194.45.93.255 nl -194.45.94.0 - 194.45.107.255 de -194.45.108.0 - 194.45.108.63 nl -194.45.108.64 - 194.45.108.71 de -194.45.108.72 - 194.45.108.135 nl -194.45.108.136 - 194.45.108.151 de -194.45.108.152 - 194.45.108.215 nl -194.45.108.216 - 194.45.108.223 de -194.45.108.224 - 194.45.108.247 nl -194.45.108.248 - 194.45.108.255 de -194.45.109.0 - 194.45.109.79 nl -194.45.109.80 - 194.45.109.87 de -194.45.109.88 - 194.45.110.159 nl -194.45.110.160 - 194.45.110.167 de -194.45.110.168 - 194.45.110.191 nl -194.45.110.192 - 194.45.110.199 de -194.45.110.200 - 194.45.110.223 nl -194.45.110.224 - 194.45.110.239 de -194.45.110.240 - 194.45.111.71 nl -194.45.111.72 - 194.45.111.79 de -194.45.111.80 - 194.45.111.199 nl -194.45.111.200 - 194.45.111.207 de -194.45.111.208 - 194.45.112.39 nl -194.45.112.40 - 194.45.112.55 de -194.45.112.56 - 194.45.112.103 nl -194.45.112.104 - 194.45.112.111 de -194.45.112.112 - 194.45.112.119 nl -194.45.112.120 - 194.45.112.135 de -194.45.112.136 - 194.45.112.223 nl -194.45.112.224 - 194.45.112.239 de -194.45.112.240 - 194.45.113.191 nl -194.45.113.192 - 194.45.113.199 de -194.45.113.200 - 194.45.114.31 nl -194.45.114.32 - 194.45.114.39 de -194.45.114.40 - 194.45.114.63 nl -194.45.114.64 - 194.45.114.71 de -194.45.114.72 - 194.45.114.127 nl -194.45.114.128 - 194.45.114.135 de -194.45.114.136 - 194.45.114.167 nl -194.45.114.168 - 194.45.114.175 de -194.45.114.176 - 194.45.114.215 nl -194.45.114.216 - 194.45.114.223 de -194.45.114.224 - 194.45.115.47 nl -194.45.115.48 - 194.45.115.55 de -194.45.115.56 - 194.45.115.103 nl -194.45.115.104 - 194.45.115.111 de -194.45.115.112 - 194.45.115.159 nl -194.45.115.160 - 194.45.115.175 de -194.45.115.176 - 194.45.115.183 nl -194.45.115.184 - 194.45.115.191 de -194.45.115.192 - 194.45.116.135 nl -194.45.116.136 - 194.45.116.143 de -194.45.116.144 - 194.45.116.159 nl -194.45.116.160 - 194.45.116.167 de -194.45.116.168 - 194.45.116.207 nl -194.45.116.208 - 194.45.116.215 de -194.45.116.216 - 194.45.117.111 nl -194.45.117.112 - 194.45.117.119 de -194.45.117.120 - 194.45.117.159 nl -194.45.117.160 - 194.45.117.175 de -194.45.117.176 - 194.45.117.183 nl -194.45.117.184 - 194.45.117.191 de -194.45.117.192 - 194.45.118.23 nl -194.45.118.24 - 194.45.118.31 de -194.45.118.32 - 194.45.118.39 nl -194.45.118.40 - 194.45.118.47 de -194.45.118.48 - 194.45.118.55 nl -194.45.118.56 - 194.45.118.63 de -194.45.118.64 - 194.45.118.183 nl -194.45.118.184 - 194.45.118.191 de -194.45.118.192 - 194.45.119.159 nl -194.45.119.160 - 194.45.119.183 de -194.45.119.184 - 194.45.119.247 nl -194.45.119.248 - 194.45.119.255 de -194.45.120.0 - 194.45.120.47 nl -194.45.120.48 - 194.45.120.55 de -194.45.120.56 - 194.45.120.103 nl -194.45.120.104 - 194.45.120.119 de -194.45.120.120 - 194.45.120.127 nl -194.45.120.128 - 194.45.120.135 de -194.45.120.136 - 194.45.120.143 nl -194.45.120.144 - 194.45.120.159 de -194.45.120.160 - 194.45.120.231 nl -194.45.120.232 - 194.45.120.239 de -194.45.120.240 - 194.45.121.15 nl -194.45.121.16 - 194.45.121.23 de -194.45.121.24 - 194.45.121.39 nl -194.45.121.40 - 194.45.121.47 de -194.45.121.48 - 194.45.121.95 nl -194.45.121.96 - 194.45.121.103 de -194.45.121.104 - 194.45.121.167 nl -194.45.121.168 - 194.45.121.175 de -194.45.121.176 - 194.45.121.231 nl -194.45.121.232 - 194.45.121.239 de -194.45.121.240 - 194.45.122.7 nl -194.45.122.8 - 194.45.122.15 de -194.45.122.16 - 194.45.122.47 nl -194.45.122.48 - 194.45.122.55 de -194.45.122.56 - 194.45.122.103 nl -194.45.122.104 - 194.45.122.111 de -194.45.122.112 - 194.45.122.175 nl -194.45.122.176 - 194.45.122.183 de -194.45.122.184 - 194.45.122.239 nl -194.45.122.240 - 194.45.122.247 de -194.45.122.248 - 194.45.123.47 nl -194.45.123.48 - 194.45.123.55 de -194.45.123.56 - 194.45.123.143 nl -194.45.123.144 - 194.45.123.151 de -194.45.123.152 - 194.45.124.23 nl -194.45.124.24 - 194.45.124.31 de -194.45.124.32 - 194.45.124.71 nl -194.45.124.72 - 194.45.124.79 de -194.45.124.80 - 194.45.124.95 nl -194.45.124.96 - 194.45.124.103 de -194.45.124.104 - 194.45.124.159 nl -194.45.124.160 - 194.45.124.167 de -194.45.124.168 - 194.45.124.191 nl -194.45.124.192 - 194.45.124.199 de -194.45.124.200 - 194.45.125.31 nl -194.45.125.32 - 194.45.125.47 de -194.45.125.48 - 194.45.125.127 nl -194.45.125.128 - 194.45.125.135 de -194.45.125.136 - 194.45.125.255 nl -194.45.126.0 - 194.45.127.255 de -194.45.128.0 - 194.45.128.47 nl -194.45.128.48 - 194.45.128.55 de -194.45.128.56 - 194.45.128.87 nl -194.45.128.88 - 194.45.128.95 de -194.45.128.96 - 194.45.128.111 nl -194.45.128.112 - 194.45.128.127 de -194.45.128.128 - 194.45.128.159 nl -194.45.128.160 - 194.45.128.167 de -194.45.128.168 - 194.45.128.231 nl -194.45.128.232 - 194.45.128.239 de -194.45.128.240 - 194.45.129.127 nl -194.45.129.128 - 194.45.129.135 de -194.45.129.136 - 194.45.129.167 nl -194.45.129.168 - 194.45.129.175 de -194.45.129.176 - 194.45.129.199 nl -194.45.129.200 - 194.45.129.215 de -194.45.129.216 - 194.45.130.55 nl -194.45.130.56 - 194.45.130.63 de -194.45.130.64 - 194.45.130.87 nl -194.45.130.88 - 194.45.130.95 de -194.45.130.96 - 194.45.130.103 nl -194.45.130.104 - 194.45.130.111 de -194.45.130.112 - 194.45.130.143 nl -194.45.130.144 - 194.45.130.151 de -194.45.130.152 - 194.45.131.31 nl -194.45.131.32 - 194.45.131.39 de -194.45.131.40 - 194.45.131.95 nl -194.45.131.96 - 194.45.131.103 de -194.45.131.104 - 194.45.131.119 nl -194.45.131.120 - 194.45.131.135 de -194.45.131.136 - 194.45.131.151 nl -194.45.131.152 - 194.45.131.159 de -194.45.131.160 - 194.45.131.247 nl -194.45.131.248 - 194.45.131.255 de -194.45.132.0 - 194.45.132.47 nl -194.45.132.48 - 194.45.132.55 de -194.45.132.56 - 194.45.132.135 nl -194.45.132.136 - 194.45.132.143 de -194.45.132.144 - 194.45.132.239 nl -194.45.132.240 - 194.45.132.247 de -194.45.132.248 - 194.45.133.79 nl -194.45.133.80 - 194.45.133.87 de -194.45.133.88 - 194.45.133.175 nl -194.45.133.176 - 194.45.133.183 de -194.45.133.184 - 194.45.133.255 nl -194.45.134.0 - 194.45.135.255 de -194.45.136.0 - 194.45.136.15 nl -194.45.136.16 - 194.45.136.31 de -194.45.136.32 - 194.45.136.87 nl -194.45.136.88 - 194.45.136.95 de -194.45.136.96 - 194.45.136.103 nl -194.45.136.104 - 194.45.136.111 de -194.45.136.112 - 194.45.136.159 nl -194.45.136.160 - 194.45.136.167 de -194.45.136.168 - 194.45.137.151 nl -194.45.137.152 - 194.45.137.159 de -194.45.137.160 - 194.45.137.191 nl -194.45.137.192 - 194.45.137.199 de -194.45.137.200 - 194.45.138.135 nl -194.45.138.136 - 194.45.138.159 de -194.45.138.160 - 194.45.138.191 nl -194.45.138.192 - 194.45.138.199 de -194.45.138.200 - 194.45.138.239 nl -194.45.138.240 - 194.45.138.247 de -194.45.138.248 - 194.45.139.39 nl -194.45.139.40 - 194.45.139.47 de -194.45.139.48 - 194.45.139.191 nl -194.45.139.192 - 194.45.139.199 de -194.45.139.200 - 194.45.140.15 nl -194.45.140.16 - 194.45.140.23 de -194.45.140.24 - 194.45.140.63 nl -194.45.140.64 - 194.45.140.71 de -194.45.140.72 - 194.45.140.119 nl -194.45.140.120 - 194.45.140.127 de -194.45.140.128 - 194.45.140.191 nl -194.45.140.192 - 194.45.140.199 de -194.45.140.200 - 194.45.141.143 nl -194.45.141.144 - 194.45.141.159 de -194.45.141.160 - 194.45.141.255 nl -194.45.142.0 - 194.45.155.255 de -194.45.156.0 - 194.45.156.111 nl -194.45.156.112 - 194.45.156.119 de -194.45.156.120 - 194.45.156.255 nl -194.45.157.0 - 194.45.157.7 de -194.45.157.8 - 194.45.158.71 nl -194.45.158.72 - 194.45.158.79 de -194.45.158.80 - 194.45.158.95 nl -194.45.158.96 - 194.45.158.103 de -194.45.158.104 - 194.45.158.231 nl -194.45.158.232 - 194.45.158.239 de -194.45.158.240 - 194.45.158.247 nl -194.45.158.248 - 194.45.158.255 de -194.45.159.0 - 194.45.160.39 nl -194.45.160.40 - 194.45.160.47 de -194.45.160.48 - 194.45.160.55 nl -194.45.160.56 - 194.45.160.63 de -194.45.160.64 - 194.45.160.87 nl -194.45.160.88 - 194.45.160.95 de -194.45.160.96 - 194.45.160.111 nl -194.45.160.112 - 194.45.160.119 de -194.45.160.120 - 194.45.160.167 nl -194.45.160.168 - 194.45.160.175 de -194.45.160.176 - 194.45.161.55 nl -194.45.161.56 - 194.45.161.63 de -194.45.161.64 - 194.45.161.119 nl -194.45.161.120 - 194.45.161.127 de -194.45.161.128 - 194.45.161.215 nl -194.45.161.216 - 194.45.161.223 de -194.45.161.224 - 194.45.162.15 nl -194.45.162.16 - 194.45.162.23 de -194.45.162.24 - 194.45.162.103 nl -194.45.162.104 - 194.45.162.111 de -194.45.162.112 - 194.45.162.127 nl -194.45.162.128 - 194.45.162.135 de -194.45.162.136 - 194.45.163.71 nl -194.45.163.72 - 194.45.163.79 de -194.45.163.80 - 194.45.163.159 nl -194.45.163.160 - 194.45.163.167 de -194.45.163.168 - 194.45.163.255 nl -194.45.164.0 - 194.45.169.255 de -194.45.170.0 - 194.45.170.87 nl -194.45.170.88 - 194.45.170.95 de -194.45.170.96 - 194.45.170.191 nl -194.45.170.192 - 194.45.170.199 de -194.45.170.200 - 194.45.170.239 nl -194.45.170.240 - 194.45.170.247 de -194.45.170.248 - 194.45.171.15 nl -194.45.171.16 - 194.45.171.31 de -194.45.171.32 - 194.45.171.47 nl -194.45.171.48 - 194.45.171.55 de -194.45.171.56 - 194.45.171.95 nl -194.45.171.96 - 194.45.171.103 de -194.45.171.104 - 194.45.171.191 nl -194.45.171.192 - 194.45.171.199 de -194.45.171.200 - 194.45.172.39 nl -194.45.172.40 - 194.45.172.47 de -194.45.172.48 - 194.45.172.143 nl -194.45.172.144 - 194.45.172.167 de -194.45.172.168 - 194.45.172.247 nl -194.45.172.248 - 194.45.172.255 de -194.45.173.0 - 194.45.173.79 nl -194.45.173.80 - 194.45.173.87 de -194.45.173.88 - 194.45.173.103 nl -194.45.173.104 - 194.45.173.111 de -194.45.173.112 - 194.45.173.127 nl -194.45.173.128 - 194.45.173.135 de -194.45.173.136 - 194.45.174.199 nl -194.45.174.200 - 194.45.174.207 de -194.45.174.208 - 194.45.174.231 nl -194.45.174.232 - 194.45.174.239 de -194.45.174.240 - 194.45.175.7 nl -194.45.175.8 - 194.45.175.15 de -194.45.175.16 - 194.45.175.23 nl -194.45.175.24 - 194.45.175.31 de -194.45.175.32 - 194.45.175.79 nl -194.45.175.80 - 194.45.175.95 de -194.45.175.96 - 194.45.175.127 nl -194.45.175.128 - 194.45.175.135 de -194.45.175.136 - 194.45.175.183 nl -194.45.175.184 - 194.45.175.191 de -194.45.175.192 - 194.45.175.231 nl -194.45.175.232 - 194.45.175.239 de -194.45.175.240 - 194.45.176.207 nl -194.45.176.208 - 194.45.176.215 de -194.45.176.216 - 194.45.176.255 nl -194.45.177.0 - 194.45.177.7 de -194.45.177.8 - 194.45.177.23 nl -194.45.177.24 - 194.45.177.31 de -194.45.177.32 - 194.45.177.39 nl -194.45.177.40 - 194.45.177.47 de -194.45.177.48 - 194.45.177.151 nl -194.45.177.152 - 194.45.177.159 de -194.45.177.160 - 194.45.178.183 nl -194.45.178.184 - 194.45.178.199 de -194.45.178.200 - 194.45.179.23 nl -194.45.179.24 - 194.45.179.31 de -194.45.179.32 - 194.45.179.103 nl -194.45.179.104 - 194.45.179.111 de -194.45.179.112 - 194.45.179.135 nl -194.45.179.136 - 194.45.179.151 de -194.45.179.152 - 194.45.179.199 nl -194.45.179.200 - 194.45.179.207 de -194.45.179.208 - 194.45.179.255 nl -194.45.180.0 - 194.45.185.255 de -194.45.186.0 - 194.45.186.23 nl -194.45.186.24 - 194.45.186.31 de -194.45.186.32 - 194.45.186.87 nl -194.45.186.88 - 194.45.186.95 de -194.45.186.96 - 194.45.186.127 nl -194.45.186.128 - 194.45.186.135 de -194.45.186.136 - 194.45.187.87 nl -194.45.187.88 - 194.45.187.95 de -194.45.187.96 - 194.45.187.151 nl -194.45.187.152 - 194.45.187.159 de -194.45.187.160 - 194.45.187.215 nl -194.45.187.216 - 194.45.187.223 de -194.45.187.224 - 194.45.187.255 nl -194.45.188.0 - 194.45.188.7 de -194.45.188.8 - 194.45.188.71 nl -194.45.188.72 - 194.45.188.79 de -194.45.188.80 - 194.45.188.183 nl -194.45.188.184 - 194.45.188.191 de -194.45.188.192 - 194.45.189.79 nl -194.45.189.80 - 194.45.189.87 de -194.45.189.88 - 194.45.189.143 nl -194.45.189.144 - 194.45.189.151 de -194.45.189.152 - 194.45.189.167 nl -194.45.189.168 - 194.45.189.175 de -194.45.189.176 - 194.45.190.87 nl -194.45.190.88 - 194.45.190.103 de -194.45.190.104 - 194.45.190.135 nl -194.45.190.136 - 194.45.190.143 de -194.45.190.144 - 194.45.191.15 nl -194.45.191.16 - 194.45.191.23 de -194.45.191.24 - 194.45.191.71 nl -194.45.191.72 - 194.45.191.79 de -194.45.191.80 - 194.45.191.103 nl -194.45.191.104 - 194.45.191.111 de -194.45.191.112 - 194.45.191.127 nl -194.45.191.128 - 194.45.191.135 de -194.45.191.136 - 194.45.191.151 nl -194.45.191.152 - 194.45.191.159 de -194.45.191.160 - 194.45.191.167 nl -194.45.191.168 - 194.45.191.175 de -194.45.191.176 - 194.45.191.239 nl -194.45.191.240 - 194.45.191.247 de -194.45.191.248 - 194.45.193.7 nl -194.45.193.8 - 194.45.193.15 de -194.45.193.16 - 194.45.193.47 nl -194.45.193.48 - 194.45.193.55 de -194.45.193.56 - 194.45.193.71 nl -194.45.193.72 - 194.45.193.79 de -194.45.193.80 - 194.45.193.151 nl -194.45.193.152 - 194.45.193.159 de -194.45.193.160 - 194.45.193.231 nl -194.45.193.232 - 194.45.193.239 de -194.45.193.240 - 194.45.194.127 nl -194.45.194.128 - 194.45.194.135 de -194.45.194.136 - 194.45.194.207 nl -194.45.194.208 - 194.45.194.215 de -194.45.194.216 - 194.45.194.255 nl -194.45.195.0 - 194.45.195.7 de -194.45.195.8 - 194.45.195.15 nl -194.45.195.16 - 194.45.195.31 de -194.45.195.32 - 194.45.195.111 nl -194.45.195.112 - 194.45.195.119 de -194.45.195.120 - 194.45.195.135 nl -194.45.195.136 - 194.45.195.143 de -194.45.195.144 - 194.45.195.167 nl -194.45.195.168 - 194.45.195.183 de -194.45.195.184 - 194.45.195.255 nl -194.45.196.0 - 194.45.201.255 de -194.45.202.0 - 194.45.202.7 nl -194.45.202.8 - 194.45.202.15 de -194.45.202.16 - 194.45.202.39 nl -194.45.202.40 - 194.45.202.47 de -194.45.202.48 - 194.45.202.231 nl -194.45.202.232 - 194.45.202.247 de -194.45.202.248 - 194.45.203.119 nl -194.45.203.120 - 194.45.203.127 de -194.45.203.128 - 194.45.203.143 nl -194.45.203.144 - 194.45.203.151 de -194.45.203.152 - 194.45.204.7 nl -194.45.204.8 - 194.45.204.15 de -194.45.204.16 - 194.45.204.31 nl -194.45.204.32 - 194.45.204.39 de -194.45.204.40 - 194.45.204.143 nl -194.45.204.144 - 194.45.204.151 de -194.45.204.152 - 194.45.204.231 nl -194.45.204.232 - 194.45.204.239 de -194.45.204.240 - 194.45.205.63 nl -194.45.205.64 - 194.45.205.71 de -194.45.205.72 - 194.45.205.111 nl -194.45.205.112 - 194.45.205.119 de -194.45.205.120 - 194.45.205.135 nl -194.45.205.136 - 194.45.205.143 de -194.45.205.144 - 194.45.205.207 nl -194.45.205.208 - 194.45.205.215 de -194.45.205.216 - 194.45.206.31 nl -194.45.206.32 - 194.45.206.39 de -194.45.206.40 - 194.45.206.79 nl -194.45.206.80 - 194.45.206.87 de -194.45.206.88 - 194.45.206.135 nl -194.45.206.136 - 194.45.206.143 de -194.45.206.144 - 194.45.206.159 nl -194.45.206.160 - 194.45.206.167 de -194.45.206.168 - 194.45.206.183 nl -194.45.206.184 - 194.45.206.191 de -194.45.206.192 - 194.45.206.215 nl -194.45.206.216 - 194.45.206.239 de -194.45.206.240 - 194.45.206.255 nl -194.45.207.0 - 194.45.207.7 de -194.45.207.8 - 194.45.207.15 nl -194.45.207.16 - 194.45.207.23 de -194.45.207.24 - 194.45.207.87 nl -194.45.207.88 - 194.45.207.95 de -194.45.207.96 - 194.45.207.175 nl -194.45.207.176 - 194.45.207.191 de -194.45.207.192 - 194.45.207.223 nl -194.45.207.224 - 194.45.207.231 de -194.45.207.232 - 194.45.207.255 nl -194.45.208.0 - 194.45.217.255 de -194.45.218.0 - 194.45.218.255 nl -194.45.219.0 - 194.45.219.7 de -194.45.219.8 - 194.45.219.63 nl -194.45.219.64 - 194.45.219.71 de -194.45.219.72 - 194.45.219.95 nl -194.45.219.96 - 194.45.219.103 de -194.45.219.104 - 194.45.219.255 nl -194.45.220.0 - 194.45.220.15 de -194.45.220.16 - 194.45.220.31 nl -194.45.220.32 - 194.45.220.39 de -194.45.220.40 - 194.45.220.71 nl -194.45.220.72 - 194.45.220.87 de -194.45.220.88 - 194.45.221.63 nl -194.45.221.64 - 194.45.221.71 de -194.45.221.72 - 194.45.221.79 nl -194.45.221.80 - 194.45.221.95 de -194.45.221.96 - 194.45.221.119 nl -194.45.221.120 - 194.45.221.127 de -194.45.221.128 - 194.45.221.135 nl -194.45.221.136 - 194.45.221.143 de -194.45.221.144 - 194.45.221.207 nl -194.45.221.208 - 194.45.221.215 de -194.45.221.216 - 194.45.222.223 nl -194.45.222.224 - 194.45.222.231 de -194.45.222.232 - 194.45.223.159 nl -194.45.223.160 - 194.45.223.167 de -194.45.223.168 - 194.45.223.223 nl -194.45.223.224 - 194.45.223.231 de -194.45.223.232 - 194.45.223.247 nl -194.45.223.248 - 194.45.223.255 de -194.45.224.0 - 194.45.224.15 nl -194.45.224.16 - 194.45.224.23 de -194.45.224.24 - 194.45.224.47 nl -194.45.224.48 - 194.45.224.55 de -194.45.224.56 - 194.45.224.63 nl -194.45.224.64 - 194.45.224.71 de -194.45.224.72 - 194.45.224.191 nl -194.45.224.192 - 194.45.224.199 de -194.45.224.200 - 194.45.224.255 nl -194.45.225.0 - 194.45.225.7 de -194.45.225.8 - 194.45.225.23 nl -194.45.225.24 - 194.45.225.31 de -194.45.225.32 - 194.45.225.79 nl -194.45.225.80 - 194.45.225.87 de -194.45.225.88 - 194.45.225.183 nl -194.45.225.184 - 194.45.225.199 de -194.45.225.200 - 194.45.225.215 nl -194.45.225.216 - 194.45.225.223 de -194.45.225.224 - 194.45.225.239 nl -194.45.225.240 - 194.45.225.247 de -194.45.225.248 - 194.45.225.255 nl -194.45.226.0 - 194.45.227.255 de -194.45.228.0 - 194.45.228.111 nl -194.45.228.112 - 194.45.228.119 de -194.45.228.120 - 194.45.229.47 nl -194.45.229.48 - 194.45.229.55 de -194.45.229.56 - 194.45.229.79 nl -194.45.229.80 - 194.45.229.87 de -194.45.229.88 - 194.45.229.103 nl -194.45.229.104 - 194.45.229.111 de -194.45.229.112 - 194.45.229.231 nl -194.45.229.232 - 194.45.229.239 de -194.45.229.240 - 194.45.230.7 nl -194.45.230.8 - 194.45.230.15 de -194.45.230.16 - 194.45.230.63 nl -194.45.230.64 - 194.45.230.71 de -194.45.230.72 - 194.45.230.95 nl -194.45.230.96 - 194.45.230.111 de -194.45.230.112 - 194.45.230.167 nl -194.45.230.168 - 194.45.230.175 de -194.45.230.176 - 194.45.230.191 nl -194.45.230.192 - 194.45.230.199 de -194.45.230.200 - 194.45.230.215 nl -194.45.230.216 - 194.45.230.223 de -194.45.230.224 - 194.45.231.15 nl -194.45.231.16 - 194.45.231.23 de -194.45.231.24 - 194.45.231.71 nl -194.45.231.72 - 194.45.231.79 de -194.45.231.80 - 194.45.231.87 nl -194.45.231.88 - 194.45.231.95 de -194.45.231.96 - 194.45.231.255 nl -194.45.232.0 - 194.45.237.255 de -194.45.238.0 - 194.45.238.23 nl -194.45.238.24 - 194.45.238.31 de -194.45.238.32 - 194.45.238.47 nl -194.45.238.48 - 194.45.238.55 de -194.45.238.56 - 194.45.238.87 nl -194.45.238.88 - 194.45.238.95 de -194.45.238.96 - 194.45.238.207 nl -194.45.238.208 - 194.45.238.215 de -194.45.238.216 - 194.45.238.239 nl -194.45.238.240 - 194.45.238.247 de -194.45.238.248 - 194.45.239.31 nl -194.45.239.32 - 194.45.239.39 de -194.45.239.40 - 194.45.239.47 nl -194.45.239.48 - 194.45.239.55 de -194.45.239.56 - 194.45.239.111 nl -194.45.239.112 - 194.45.239.119 de -194.45.239.120 - 194.45.239.183 nl -194.45.239.184 - 194.45.239.199 de -194.45.239.200 - 194.45.240.15 nl -194.45.240.16 - 194.45.240.39 de -194.45.240.40 - 194.45.240.159 nl -194.45.240.160 - 194.45.240.175 de -194.45.240.176 - 194.45.240.199 nl -194.45.240.200 - 194.45.240.207 de -194.45.240.208 - 194.45.240.247 nl -194.45.240.248 - 194.45.240.255 de -194.45.241.0 - 194.45.241.127 nl -194.45.241.128 - 194.45.241.135 de -194.45.241.136 - 194.45.241.183 nl -194.45.241.184 - 194.45.241.199 de -194.45.241.200 - 194.45.241.255 nl -194.45.242.0 - 194.45.242.15 de -194.45.242.16 - 194.45.242.23 nl -194.45.242.24 - 194.45.242.31 de -194.45.242.32 - 194.45.242.39 nl -194.45.242.40 - 194.45.242.47 de -194.45.242.48 - 194.45.242.71 nl -194.45.242.72 - 194.45.242.79 de -194.45.242.80 - 194.45.242.175 nl -194.45.242.176 - 194.45.242.183 de -194.45.242.184 - 194.45.242.247 nl -194.45.242.248 - 194.45.242.255 de -194.45.243.0 - 194.45.243.23 nl -194.45.243.24 - 194.45.243.31 de -194.45.243.32 - 194.45.243.39 nl -194.45.243.40 - 194.45.243.55 de -194.45.243.56 - 194.45.243.95 nl -194.45.243.96 - 194.45.243.103 de -194.45.243.104 - 194.45.243.127 nl -194.45.243.128 - 194.45.243.143 de -194.45.243.144 - 194.45.244.15 nl -194.45.244.16 - 194.45.244.23 de -194.45.244.24 - 194.45.244.39 nl -194.45.244.40 - 194.45.244.47 de -194.45.244.48 - 194.45.244.135 nl -194.45.244.136 - 194.45.244.143 de -194.45.244.144 - 194.45.244.215 nl -194.45.244.216 - 194.45.244.223 de -194.45.244.224 - 194.45.244.239 nl -194.45.244.240 - 194.45.244.255 de -194.45.245.0 - 194.45.245.87 nl -194.45.245.88 - 194.45.245.95 de -194.45.245.96 - 194.45.245.119 nl -194.45.245.120 - 194.45.245.127 de -194.45.245.128 - 194.45.245.135 nl -194.45.245.136 - 194.45.245.143 de -194.45.245.144 - 194.45.245.151 nl -194.45.245.152 - 194.45.245.159 de -194.45.245.160 - 194.45.245.207 nl -194.45.245.208 - 194.45.245.215 de -194.45.245.216 - 194.45.246.95 nl -194.45.246.96 - 194.45.246.103 de -194.45.246.104 - 194.45.246.127 nl -194.45.246.128 - 194.45.246.135 de -194.45.246.136 - 194.45.246.143 nl -194.45.246.144 - 194.45.246.159 de -194.45.246.160 - 194.45.246.191 nl -194.45.246.192 - 194.45.246.199 de -194.45.246.200 - 194.45.246.207 nl -194.45.246.208 - 194.45.246.215 de -194.45.246.216 - 194.45.247.127 nl -194.45.247.128 - 194.45.247.135 de -194.45.247.136 - 194.45.247.143 nl -194.45.247.144 - 194.45.247.151 de -194.45.247.152 - 194.45.247.231 nl -194.45.247.232 - 194.45.247.239 de -194.45.247.240 - 194.45.247.247 nl -194.45.247.248 - 194.45.247.255 de -194.45.248.0 - 194.45.248.95 nl -194.45.248.96 - 194.45.248.103 de -194.45.248.104 - 194.45.248.207 nl -194.45.248.208 - 194.45.248.215 de -194.45.248.216 - 194.45.249.15 nl -194.45.249.16 - 194.45.249.23 de -194.45.249.24 - 194.45.249.159 nl -194.45.249.160 - 194.45.249.167 de -194.45.249.168 - 194.45.250.63 nl -194.45.250.64 - 194.45.250.71 de -194.45.250.72 - 194.45.250.143 nl -194.45.250.144 - 194.45.250.151 de -194.45.250.152 - 194.45.250.191 nl -194.45.250.192 - 194.45.250.199 de -194.45.250.200 - 194.45.251.111 nl -194.45.251.112 - 194.45.251.119 de -194.45.251.120 - 194.45.251.135 nl -194.45.251.136 - 194.45.251.151 de -194.45.251.152 - 194.45.251.159 nl -194.45.251.160 - 194.45.251.167 de -194.45.251.168 - 194.45.251.239 nl -194.45.251.240 - 194.45.251.247 de -194.45.251.248 - 194.45.252.15 nl -194.45.252.16 - 194.45.252.23 de -194.45.252.24 - 194.45.253.47 nl -194.45.253.48 - 194.45.253.55 de -194.45.253.56 - 194.45.253.127 nl -194.45.253.128 - 194.45.253.135 de -194.45.253.136 - 194.45.253.159 nl -194.45.253.160 - 194.45.253.167 de -194.45.253.168 - 194.45.254.47 nl -194.45.254.48 - 194.45.254.55 de -194.45.254.56 - 194.45.254.87 nl -194.45.254.88 - 194.45.254.95 de -194.45.254.96 - 194.45.255.47 nl -194.45.255.48 - 194.45.255.55 de -194.45.255.56 - 194.45.255.207 nl -194.45.255.208 - 194.45.255.215 de -194.45.255.216 - 194.45.255.255 nl -194.46.0.0 - 194.46.127.255 gb -194.46.128.0 - 194.46.129.255 ie -194.46.130.0 - 194.46.135.255 gb -194.46.136.0 - 194.46.139.255 ie -194.46.140.0 - 194.46.159.255 gb -194.46.160.0 - 194.46.255.255 ie +194.45.80.0 - 194.45.93.255 nl +194.45.94.0 - 194.45.94.255 de +194.45.95.0 - 194.45.143.255 nl +194.45.144.0 - 194.45.151.255 de +194.45.152.0 - 194.45.207.255 nl +194.45.208.0 - 194.45.215.255 de +194.45.216.0 - 194.45.255.255 nl +194.46.0.0 - 194.46.191.255 gb +194.46.192.0 - 194.46.255.255 ie 194.47.0.0 - 194.47.255.255 se 194.48.0.0 - 194.48.0.255 at 194.48.1.0 - 194.48.1.255 se -194.48.2.0 - 194.48.174.255 at -194.48.175.0 - 194.48.175.255 ua -194.48.176.0 - 194.48.203.255 at +194.48.2.0 - 194.48.2.255 at +194.48.4.0 - 194.48.203.255 at 194.48.204.0 - 194.48.204.255 gb 194.48.205.0 - 194.48.205.255 se 194.48.206.0 - 194.48.206.255 bg @@ -96887,7 +85603,6 @@ 194.48.208.0 - 194.48.208.255 fr 194.48.209.0 - 194.48.209.255 ua 194.48.210.0 - 194.48.210.255 gb -194.48.211.0 - 194.48.211.255 de 194.48.212.0 - 194.48.212.255 ua 194.48.213.0 - 194.48.213.255 se 194.48.214.0 - 194.48.214.255 nl @@ -96896,20 +85611,33 @@ 194.48.217.0 - 194.48.217.255 gb 194.48.218.0 - 194.48.218.255 ru 194.48.219.0 - 194.48.219.255 pl -194.48.220.0 - 194.48.240.255 at +194.48.236.0 - 194.48.240.255 at 194.48.241.0 - 194.48.241.255 cz -194.48.242.0 - 194.48.255.255 at -194.49.0.0 - 194.49.49.255 de +194.48.243.0 - 194.48.243.255 at +194.48.254.0 - 194.48.254.255 at +194.49.0.0 - 194.49.15.255 de +194.49.19.0 - 194.49.19.255 de +194.49.21.0 - 194.49.21.255 ch +194.49.22.0 - 194.49.49.255 de 194.49.50.0 - 194.49.51.255 ru -194.49.52.0 - 194.49.255.255 de -194.50.0.0 - 194.50.0.255 ua -194.50.1.0 - 194.50.5.255 cz +194.49.54.0 - 194.49.54.255 de +194.49.60.0 - 194.49.95.255 de +194.49.110.0 - 194.49.110.255 de +194.49.112.0 - 194.49.119.255 de +194.49.120.0 - 194.49.123.255 ru +194.49.124.0 - 194.49.124.255 pl +194.49.125.0 - 194.49.125.255 de +194.49.126.0 - 194.49.126.255 tr +194.49.127.0 - 194.49.127.255 ru +194.49.128.0 - 194.49.255.255 de +194.50.2.0 - 194.50.2.255 cz 194.50.6.0 - 194.50.6.255 ru -194.50.7.0 - 194.50.8.255 ro +194.50.7.0 - 194.50.7.255 ro 194.50.9.0 - 194.50.9.255 ua 194.50.10.0 - 194.50.10.255 ru 194.50.11.0 - 194.50.11.255 ro -194.50.12.0 - 194.50.27.255 cz +194.50.24.0 - 194.50.24.255 ru +194.50.26.0 - 194.50.27.255 cz 194.50.28.0 - 194.50.28.255 at 194.50.29.0 - 194.50.29.255 fr 194.50.30.0 - 194.50.32.255 gb @@ -96924,18 +85652,14 @@ 194.50.42.0 - 194.50.43.255 gr 194.50.44.0 - 194.50.44.255 ro 194.50.45.0 - 194.50.45.255 ch -194.50.46.0 - 194.50.46.255 gb 194.50.47.0 - 194.50.47.255 de -194.50.48.0 - 194.50.48.255 nl 194.50.49.0 - 194.50.49.255 pl 194.50.50.0 - 194.50.50.255 ro 194.50.51.0 - 194.50.51.255 ua -194.50.52.0 - 194.50.52.255 gb 194.50.53.0 - 194.50.53.255 pl 194.50.54.0 - 194.50.56.255 gb 194.50.57.0 - 194.50.57.255 dk 194.50.58.0 - 194.50.58.255 de -194.50.59.0 - 194.50.59.255 gb 194.50.60.0 - 194.50.60.255 fr 194.50.61.0 - 194.50.61.255 pl 194.50.62.0 - 194.50.62.255 be @@ -96943,16 +85667,12 @@ 194.50.64.0 - 194.50.67.255 cz 194.50.68.0 - 194.50.70.255 de 194.50.71.0 - 194.50.71.255 il -194.50.72.0 - 194.50.72.255 ro -194.50.73.0 - 194.50.73.255 bg -194.50.74.0 - 194.50.74.255 fr 194.50.75.0 - 194.50.75.255 pl 194.50.76.0 - 194.50.76.255 bg 194.50.77.0 - 194.50.78.255 fr 194.50.79.0 - 194.50.79.255 ua 194.50.80.0 - 194.50.80.255 gb 194.50.81.0 - 194.50.81.255 ua -194.50.82.0 - 194.50.82.255 nl 194.50.83.0 - 194.50.83.255 pl 194.50.84.0 - 194.50.84.255 tr 194.50.85.0 - 194.50.85.255 ua @@ -96962,9 +85682,7 @@ 194.50.89.0 - 194.50.89.255 pl 194.50.90.0 - 194.50.90.255 gb 194.50.91.0 - 194.50.91.255 be -194.50.92.0 - 194.50.92.255 fr 194.50.93.0 - 194.50.93.255 de -194.50.94.0 - 194.50.94.255 gb 194.50.95.0 - 194.50.95.255 fr 194.50.96.0 - 194.50.96.255 nl 194.50.97.0 - 194.50.97.255 be @@ -96979,12 +85697,11 @@ 194.50.108.0 - 194.50.108.255 gb 194.50.109.0 - 194.50.109.255 at 194.50.110.0 - 194.50.110.255 pl -194.50.111.0 - 194.50.111.255 lt 194.50.112.0 - 194.50.112.255 nl 194.50.113.0 - 194.50.113.255 de 194.50.114.0 - 194.50.114.255 ua 194.50.115.0 - 194.50.115.255 at -194.50.116.0 - 194.50.116.255 ua +194.50.116.0 - 194.50.116.255 ru 194.50.117.0 - 194.50.117.255 pl 194.50.118.0 - 194.50.118.255 gb 194.50.119.0 - 194.50.119.255 ua @@ -96996,7 +85713,18 @@ 194.50.125.0 - 194.50.125.255 ua 194.50.126.0 - 194.50.126.255 ro 194.50.127.0 - 194.50.127.255 fr -194.50.128.0 - 194.50.159.255 cz +194.50.128.0 - 194.50.131.255 ru +194.50.132.0 - 194.50.135.255 pl +194.50.136.0 - 194.50.138.255 si +194.50.139.0 - 194.50.139.255 ru +194.50.140.0 - 194.50.140.255 se +194.50.141.0 - 194.50.143.255 ru +194.50.144.0 - 194.50.147.255 ua +194.50.148.0 - 194.50.150.255 ru +194.50.151.0 - 194.50.151.255 at +194.50.152.0 - 194.50.152.255 ru +194.50.153.0 - 194.50.154.255 gb +194.50.155.0 - 194.50.159.255 pl 194.50.160.0 - 194.50.160.255 de 194.50.161.0 - 194.50.161.255 ua 194.50.162.0 - 194.50.162.255 de @@ -97007,8 +85735,6 @@ 194.50.167.0 - 194.50.167.255 ua 194.50.168.0 - 194.50.168.255 fi 194.50.169.0 - 194.50.169.255 ua -194.50.170.0 - 194.50.170.255 ro -194.50.171.0 - 194.50.171.255 dk 194.50.172.0 - 194.50.172.255 ch 194.50.173.0 - 194.50.173.255 at 194.50.174.0 - 194.50.174.255 ro @@ -97017,48 +85743,37 @@ 194.50.177.0 - 194.50.177.255 be 194.50.178.0 - 194.50.178.255 ch 194.50.179.0 - 194.50.179.255 tr -194.50.180.0 - 194.50.180.255 pl 194.50.181.0 - 194.50.181.255 se 194.50.182.0 - 194.50.182.255 de 194.50.183.0 - 194.50.183.255 ae -194.50.184.0 - 194.50.184.255 se -194.50.185.0 - 194.50.185.255 gb 194.50.186.0 - 194.50.186.255 pl 194.50.187.0 - 194.50.187.255 de -194.50.188.0 - 194.50.190.255 cz 194.50.191.0 - 194.50.191.255 de 194.50.192.0 - 194.50.207.255 cz 194.50.208.0 - 194.50.208.255 dk -194.50.209.0 - 194.50.213.255 cz +194.50.210.0 - 194.50.211.255 cz 194.50.214.0 - 194.50.214.255 pl 194.50.215.0 - 194.50.240.255 cz 194.50.241.0 - 194.50.241.255 ua -194.50.242.0 - 194.50.251.255 cz +194.50.242.0 - 194.50.242.255 cz +194.50.248.0 - 194.50.249.255 cz 194.50.252.0 - 194.50.252.255 pl -194.50.253.0 - 194.50.253.255 at 194.50.254.0 - 194.50.254.255 ua 194.50.255.0 - 194.50.255.255 ru -194.51.0.0 - 194.51.25.255 fr -194.51.26.0 - 194.51.26.255 mc -194.51.27.0 - 194.51.162.255 fr -194.51.163.0 - 194.51.163.255 bj -194.51.164.0 - 194.51.176.255 fr -194.51.177.0 - 194.51.177.255 es -194.51.178.0 - 194.51.255.255 fr -194.52.0.0 - 194.52.170.255 se -194.52.171.0 - 194.52.175.255 no -194.52.176.0 - 194.52.244.255 se -194.52.245.0 - 194.52.245.255 no -194.52.246.0 - 194.52.246.255 se -194.52.247.0 - 194.52.249.255 no -194.52.250.0 - 194.52.255.255 se -194.53.0.0 - 194.53.75.255 nl +194.51.0.0 - 194.51.255.255 fr +194.52.0.0 - 194.52.167.255 se +194.52.168.0 - 194.52.175.255 no +194.52.176.0 - 194.52.239.255 se +194.52.240.0 - 194.52.255.255 no +194.53.0.0 - 194.53.63.255 nl +194.53.72.0 - 194.53.75.255 nl 194.53.76.0 - 194.53.79.255 fr -194.53.80.0 - 194.53.171.255 nl +194.53.80.0 - 194.53.135.255 nl +194.53.160.0 - 194.53.171.255 nl 194.53.172.0 - 194.53.172.255 be 194.53.173.0 - 194.53.174.255 nl 194.53.175.0 - 194.53.175.255 gb -194.53.176.0 - 194.53.255.255 nl +194.53.192.0 - 194.53.255.255 nl 194.54.0.0 - 194.54.7.255 de 194.54.8.0 - 194.54.11.255 gb 194.54.12.0 - 194.54.15.255 ru @@ -97068,53 +85783,55 @@ 194.54.64.0 - 194.54.67.255 ru 194.54.68.0 - 194.54.71.255 no 194.54.72.0 - 194.54.75.255 de -194.54.76.0 - 194.54.83.255 ua +194.54.80.0 - 194.54.83.255 ua 194.54.84.0 - 194.54.87.255 pl 194.54.88.0 - 194.54.91.255 ua 194.54.92.0 - 194.54.95.255 de 194.54.96.0 - 194.54.127.255 no 194.54.128.0 - 194.54.131.255 ro 194.54.132.0 - 194.54.135.255 ru -194.54.136.0 - 194.54.139.255 no 194.54.140.0 - 194.54.143.255 bg 194.54.144.0 - 194.54.147.255 nl 194.54.148.0 - 194.54.151.255 ru 194.54.152.0 - 194.54.163.255 ua 194.54.164.0 - 194.54.167.255 se 194.54.168.0 - 194.54.171.255 il -194.54.172.0 - 194.54.175.255 im +194.54.172.0 - 194.54.172.11 im +194.54.172.12 - 194.54.172.12 gb +194.54.172.13 - 194.54.175.255 im 194.54.176.0 - 194.54.179.255 ru 194.54.180.0 - 194.54.183.255 rs 194.54.184.0 - 194.54.187.255 ua 194.54.188.0 - 194.54.191.255 pl 194.54.192.0 - 194.54.255.255 kw -194.55.0.0 - 194.55.168.255 de +194.55.0.0 - 194.55.163.255 de 194.55.169.0 - 194.55.169.255 ro -194.55.170.0 - 194.55.255.255 de -194.56.0.0 - 194.56.206.26 ch -194.56.206.27 - 194.56.206.27 fr -194.56.206.28 - 194.56.210.255 ch +194.55.170.0 - 194.55.170.255 de +194.55.172.0 - 194.55.255.255 de +194.56.0.0 - 194.56.143.255 ch +194.56.144.0 - 194.56.147.255 li +194.56.152.0 - 194.56.191.255 ch +194.56.200.0 - 194.56.210.255 ch 194.56.211.0 - 194.56.211.255 pl -194.56.212.0 - 194.56.213.255 ch 194.56.214.0 - 194.56.214.255 de 194.56.215.0 - 194.56.215.255 il -194.56.216.0 - 194.56.220.255 ch +194.56.218.0 - 194.56.220.255 ch 194.56.221.0 - 194.56.221.255 de -194.56.222.0 - 194.56.255.255 ch +194.56.224.0 - 194.56.255.255 ch 194.57.0.0 - 194.57.255.255 fr 194.58.0.0 - 194.58.255.255 ru -194.59.0.0 - 194.59.175.255 de -194.59.176.0 - 194.59.176.255 ru +194.59.0.0 - 194.59.163.255 de +194.59.169.0 - 194.59.169.255 de +194.59.172.0 - 194.59.172.255 eu +194.59.173.0 - 194.59.175.255 de 194.59.177.0 - 194.59.178.255 at 194.59.179.0 - 194.59.179.255 de 194.59.180.0 - 194.59.180.255 fr -194.59.181.0 - 194.59.181.255 de 194.59.182.0 - 194.59.182.255 si 194.59.183.0 - 194.59.183.255 de 194.59.184.0 - 194.59.184.255 ru 194.59.185.0 - 194.59.185.255 si 194.59.186.0 - 194.59.186.255 ru -194.59.187.0 - 194.59.187.255 de 194.59.188.0 - 194.59.188.255 gb 194.59.189.0 - 194.59.255.255 de 194.60.0.0 - 194.60.63.255 gb @@ -97127,21 +85844,19 @@ 194.60.73.0 - 194.60.73.255 tr 194.60.74.0 - 194.60.74.255 si 194.60.75.0 - 194.60.75.255 no -194.60.76.0 - 194.60.76.255 es 194.60.77.0 - 194.60.77.255 ua 194.60.78.0 - 194.60.78.255 de 194.60.79.0 - 194.60.79.255 pl 194.60.80.0 - 194.60.80.255 se 194.60.81.0 - 194.60.81.255 ch 194.60.82.0 - 194.60.82.255 ro -194.60.83.0 - 194.60.135.255 gb -194.60.136.0 - 194.60.143.255 de -194.60.144.0 - 194.60.203.255 gb +194.60.83.0 - 194.60.85.255 gb +194.60.88.0 - 194.60.195.255 gb +194.60.203.0 - 194.60.203.255 gb 194.60.204.0 - 194.60.204.255 de -194.60.205.0 - 194.60.205.255 gb 194.60.206.0 - 194.60.206.255 be 194.60.207.0 - 194.60.207.255 nl -194.60.208.0 - 194.60.216.255 gb +194.60.216.0 - 194.60.216.255 gb 194.60.217.0 - 194.60.217.255 ch 194.60.218.0 - 194.60.225.255 gb 194.60.226.0 - 194.60.227.255 pl @@ -97149,113 +85864,105 @@ 194.60.232.0 - 194.60.235.255 kz 194.60.236.0 - 194.60.239.255 ru 194.60.240.0 - 194.60.241.255 fr -194.60.242.0 - 194.60.242.255 ru +194.60.242.0 - 194.60.242.255 ua 194.60.243.0 - 194.60.243.255 dk 194.60.244.0 - 194.60.249.255 ru 194.60.250.0 - 194.60.250.255 ge 194.60.251.0 - 194.60.251.255 pl 194.60.252.0 - 194.60.255.255 ua -194.61.0.0 - 194.61.95.255 gb +194.61.32.0 - 194.61.47.255 gb +194.61.48.0 - 194.61.51.255 cz +194.61.52.0 - 194.61.56.255 ru +194.61.57.0 - 194.61.57.255 pl +194.61.58.0 - 194.61.58.255 mk +194.61.59.0 - 194.61.59.255 nl +194.61.60.0 - 194.61.63.255 ru +194.61.64.0 - 194.61.65.255 nl +194.61.66.0 - 194.61.66.255 pl +194.61.67.0 - 194.61.67.255 ru +194.61.68.0 - 194.61.71.255 pl +194.61.78.0 - 194.61.79.255 gb +194.61.92.0 - 194.61.95.255 gb 194.61.96.0 - 194.61.111.255 lu -194.61.112.0 - 194.61.157.255 gb +194.61.122.0 - 194.61.123.255 gb +194.61.144.0 - 194.61.151.255 gb 194.61.158.0 - 194.61.158.255 se -194.61.159.0 - 194.61.255.255 gb +194.61.160.0 - 194.61.255.255 gb 194.62.0.0 - 194.62.0.255 ru -194.62.1.0 - 194.62.21.255 gb +194.62.7.0 - 194.62.15.255 gb +194.62.20.0 - 194.62.21.255 gb 194.62.22.0 - 194.62.22.255 ro 194.62.23.0 - 194.62.23.255 de 194.62.24.0 - 194.62.63.255 gb 194.62.64.0 - 194.62.64.255 by -194.62.65.0 - 194.62.232.255 gb -194.62.233.0 - 194.62.233.255 ru +194.62.65.0 - 194.62.65.255 gb +194.62.68.0 - 194.62.223.255 gb +194.62.232.0 - 194.62.232.255 gb 194.62.234.0 - 194.62.234.255 fr 194.62.235.0 - 194.62.235.255 gb 194.62.236.0 - 194.62.236.255 de 194.62.237.0 - 194.62.237.255 at -194.62.238.0 - 194.63.127.255 gb +194.62.238.0 - 194.62.239.255 gb +194.63.0.0 - 194.63.127.255 gb 194.63.128.0 - 194.63.135.255 pl 194.63.136.0 - 194.63.139.255 bg -194.63.140.0 - 194.63.147.255 ru +194.63.140.0 - 194.63.143.255 ru 194.63.148.0 - 194.63.151.255 ch -194.63.152.0 - 194.63.155.255 ro 194.63.156.0 - 194.63.159.255 ru 194.63.160.0 - 194.63.247.255 gr 194.63.248.0 - 194.63.255.255 no -194.64.0.0 - 194.64.124.127 de -194.64.124.128 - 194.64.124.159 be -194.64.124.160 - 194.64.190.255 de -194.64.191.0 - 194.64.191.3 es -194.64.191.4 - 194.64.224.103 de -194.64.224.104 - 194.64.224.107 es -194.64.224.108 - 194.64.225.87 de -194.64.225.88 - 194.64.225.91 es -194.64.225.92 - 194.64.226.87 de -194.64.226.88 - 194.64.226.95 gb -194.64.226.96 - 194.64.226.135 de -194.64.226.136 - 194.64.226.139 es -194.64.226.140 - 194.64.227.119 de -194.64.227.120 - 194.64.227.123 es -194.64.227.124 - 194.64.227.231 de -194.64.227.232 - 194.64.227.239 it -194.64.227.240 - 194.64.234.207 de -194.64.234.208 - 194.64.234.215 gb -194.64.234.216 - 194.64.239.55 de -194.64.239.56 - 194.64.239.63 it -194.64.239.64 - 194.64.241.127 de -194.64.241.128 - 194.64.241.131 es -194.64.241.132 - 194.64.255.255 de +194.64.0.0 - 194.64.255.255 de 194.65.0.0 - 194.65.255.255 pt 194.66.0.0 - 194.66.255.255 gb -194.67.0.0 - 194.67.191.255 ru -194.67.192.0 - 194.67.193.255 by -194.67.194.0 - 194.67.204.255 ru -194.67.205.0 - 194.67.206.255 tm +194.67.0.0 - 194.67.206.255 ru 194.67.207.0 - 194.67.210.255 kz -194.67.211.0 - 194.67.212.255 tj +194.67.211.0 - 194.67.212.255 ru 194.67.213.0 - 194.67.215.255 az -194.67.216.0 - 194.67.217.255 uz -194.67.218.0 - 194.67.219.255 am -194.67.220.0 - 194.67.220.255 ru -194.67.221.0 - 194.67.222.255 kz -194.67.223.0 - 194.67.223.255 de -194.67.224.0 - 194.67.255.255 ru -194.68.0.0 - 194.68.1.255 se -194.68.2.0 - 194.68.2.255 ch -194.68.3.0 - 194.68.5.255 se +194.67.216.0 - 194.67.220.255 ru +194.67.221.0 - 194.67.221.255 kz +194.67.222.0 - 194.67.255.255 ru +194.68.0.0 - 194.68.5.255 se 194.68.6.0 - 194.68.6.255 fr -194.68.7.0 - 194.68.27.255 se +194.68.7.0 - 194.68.25.255 se +194.68.26.0 - 194.68.27.255 at 194.68.28.0 - 194.68.31.255 us -194.68.32.0 - 194.68.45.255 se +194.68.32.0 - 194.68.39.255 se +194.68.40.0 - 194.68.43.255 it +194.68.44.0 - 194.68.44.255 li +194.68.45.0 - 194.68.45.255 se 194.68.46.0 - 194.68.46.255 gb -194.68.47.0 - 194.68.86.255 se +194.68.47.0 - 194.68.48.255 se +194.68.49.0 - 194.68.49.255 gb +194.68.50.0 - 194.68.56.34 se +194.68.56.35 - 194.68.56.35 eu +194.68.56.36 - 194.68.62.255 se +194.68.63.0 - 194.68.63.255 eu +194.68.64.0 - 194.68.86.255 se 194.68.87.0 - 194.68.87.255 es -194.68.88.0 - 194.68.102.255 se +194.68.88.0 - 194.68.95.255 se +194.68.96.0 - 194.68.96.255 dk +194.68.97.0 - 194.68.102.255 se 194.68.103.0 - 194.68.103.255 dk -194.68.104.0 - 194.68.115.255 se -194.68.116.0 - 194.68.116.255 sg -194.68.117.0 - 194.68.128.255 se -194.68.129.0 - 194.68.129.255 fr -194.68.130.0 - 194.68.155.255 se +194.68.104.0 - 194.68.111.255 se +194.68.112.0 - 194.68.113.255 de +194.68.114.0 - 194.68.155.255 se 194.68.156.0 - 194.68.156.255 es -194.68.157.0 - 194.68.168.255 se -194.68.169.0 - 194.68.169.255 jp -194.68.170.0 - 194.68.172.255 se +194.68.157.0 - 194.68.172.255 se 194.68.173.0 - 194.68.173.255 us 194.68.174.0 - 194.68.175.255 se 194.68.176.0 - 194.68.179.255 us -194.68.180.0 - 194.68.180.255 se -194.68.181.0 - 194.68.181.255 jp -194.68.182.0 - 194.68.184.255 se +194.68.180.0 - 194.68.184.255 se 194.68.185.0 - 194.68.185.255 us 194.68.186.0 - 194.68.187.255 se 194.68.188.0 - 194.68.188.255 us 194.68.189.0 - 194.68.192.255 se 194.68.193.0 - 194.68.193.255 gb -194.68.194.0 - 194.68.212.255 se +194.68.194.0 - 194.68.211.255 se +194.68.212.0 - 194.68.212.255 no 194.68.213.0 - 194.68.213.255 us -194.68.214.0 - 194.68.218.255 se -194.68.219.0 - 194.68.219.255 it -194.68.220.0 - 194.68.238.255 se +194.68.214.0 - 194.68.224.255 se +194.68.225.0 - 194.68.225.255 li +194.68.226.0 - 194.68.238.255 se 194.68.239.0 - 194.68.239.255 gb 194.68.240.0 - 194.68.255.255 se 194.69.0.0 - 194.69.0.255 de @@ -97263,98 +85970,24 @@ 194.69.2.0 - 194.69.5.255 ch 194.69.6.0 - 194.69.15.255 se 194.69.16.0 - 194.69.31.255 nl -194.69.32.0 - 194.69.32.255 fr -194.69.33.0 - 194.69.35.255 dk -194.69.36.0 - 194.69.37.255 de -194.69.38.0 - 194.69.41.255 eu -194.69.42.0 - 194.69.43.255 gb -194.69.44.0 - 194.69.59.255 eu +194.69.32.0 - 194.69.59.255 eu 194.69.60.0 - 194.69.63.255 ch -194.69.64.0 - 194.69.64.39 gb -194.69.64.40 - 194.69.64.47 be -194.69.64.48 - 194.69.64.71 gb -194.69.64.72 - 194.69.64.79 fr -194.69.64.80 - 194.69.64.95 gb -194.69.64.96 - 194.69.64.127 be -194.69.64.128 - 194.69.64.231 gb -194.69.64.232 - 194.69.64.239 be -194.69.64.240 - 194.69.64.255 gb -194.69.65.0 - 194.69.65.63 ch -194.69.65.64 - 194.69.65.71 gb -194.69.65.72 - 194.69.65.79 at -194.69.65.80 - 194.69.65.135 gb -194.69.65.136 - 194.69.65.143 dk -194.69.65.144 - 194.69.65.151 gb -194.69.65.152 - 194.69.65.159 it -194.69.65.160 - 194.69.65.199 gb -194.69.65.200 - 194.69.65.207 fr -194.69.65.208 - 194.69.67.15 gb -194.69.67.16 - 194.69.67.31 it -194.69.67.32 - 194.69.67.47 gb -194.69.67.48 - 194.69.67.55 se -194.69.67.56 - 194.69.67.63 dk -194.69.67.64 - 194.69.67.71 fr -194.69.67.72 - 194.69.67.159 gb -194.69.67.160 - 194.69.67.175 de -194.69.67.176 - 194.69.67.215 gb -194.69.67.216 - 194.69.67.223 dk -194.69.67.224 - 194.69.67.247 gb -194.69.67.248 - 194.69.67.255 be -194.69.68.0 - 194.69.68.7 gb -194.69.68.8 - 194.69.68.15 be -194.69.68.16 - 194.69.68.23 dk -194.69.68.24 - 194.69.68.71 gb -194.69.68.72 - 194.69.68.79 be -194.69.68.80 - 194.69.68.111 gb -194.69.68.112 - 194.69.68.127 lu -194.69.68.128 - 194.69.68.143 gb -194.69.68.144 - 194.69.68.151 ch -194.69.68.152 - 194.69.68.167 gb -194.69.68.168 - 194.69.68.175 dk -194.69.68.176 - 194.69.69.35 gb -194.69.69.36 - 194.69.69.39 nl -194.69.69.40 - 194.69.69.111 gb -194.69.69.112 - 194.69.69.115 fr -194.69.69.116 - 194.69.70.15 gb -194.69.70.16 - 194.69.70.23 fr -194.69.70.24 - 194.69.70.71 gb -194.69.70.72 - 194.69.70.79 by -194.69.70.80 - 194.69.70.179 gb -194.69.70.180 - 194.69.70.183 nl -194.69.70.184 - 194.69.70.203 gb -194.69.70.204 - 194.69.70.207 be -194.69.70.208 - 194.69.70.247 gb -194.69.70.248 - 194.69.70.255 at -194.69.71.0 - 194.69.72.255 gb -194.69.73.0 - 194.69.73.7 fr -194.69.73.8 - 194.69.73.167 gb -194.69.73.168 - 194.69.73.175 nl -194.69.73.176 - 194.69.127.255 gb +194.69.64.0 - 194.69.102.190 gb +194.69.102.191 - 194.69.102.191 us +194.69.102.192 - 194.69.127.255 gb 194.69.128.0 - 194.69.143.255 de -194.69.144.0 - 194.69.146.255 gb -194.69.147.0 - 194.69.147.255 jp -194.69.148.0 - 194.69.148.255 us -194.69.149.0 - 194.69.159.255 gb +194.69.144.0 - 194.69.145.255 gb +194.69.146.0 - 194.69.146.255 eu +194.69.147.0 - 194.69.159.255 gb 194.69.160.0 - 194.69.167.255 ch -194.69.168.0 - 194.69.168.255 gb -194.69.169.0 - 194.69.169.255 ie -194.69.170.0 - 194.69.170.255 ch -194.69.171.0 - 194.69.175.255 eu -194.69.176.0 - 194.69.176.255 se -194.69.177.0 - 194.69.177.255 de -194.69.178.0 - 194.69.179.255 ch -194.69.180.0 - 194.69.180.255 se -194.69.181.0 - 194.69.183.255 ch +194.69.168.0 - 194.69.183.255 eu 194.69.184.0 - 194.69.191.255 nl 194.69.192.0 - 194.69.193.255 it 194.69.194.0 - 194.69.195.255 fr 194.69.196.0 - 194.69.197.255 ch 194.69.198.0 - 194.69.199.255 ie -194.69.200.0 - 194.69.202.255 no -194.69.203.0 - 194.69.203.255 gb 194.69.204.0 - 194.69.204.255 nl 194.69.205.0 - 194.69.205.255 de -194.69.206.0 - 194.69.206.255 tr 194.69.207.0 - 194.69.207.255 pl 194.69.208.0 - 194.69.223.255 no 194.69.224.0 - 194.69.255.255 es @@ -97363,127 +85996,50 @@ 194.71.9.0 - 194.71.9.255 it 194.71.10.0 - 194.71.19.255 se 194.71.20.0 - 194.71.20.255 es -194.71.21.0 - 194.71.94.255 se +194.71.21.0 - 194.71.21.255 se +194.71.22.0 - 194.71.23.255 no +194.71.24.0 - 194.71.84.255 se +194.71.85.0 - 194.71.85.255 eu +194.71.86.0 - 194.71.94.255 se 194.71.95.0 - 194.71.95.255 it -194.71.96.0 - 194.71.106.255 se -194.71.107.0 - 194.71.107.255 de -194.71.108.0 - 194.71.110.255 se -194.71.111.0 - 194.71.111.255 gb -194.71.112.0 - 194.71.125.255 se -194.71.126.0 - 194.71.126.255 kh -194.71.127.0 - 194.71.147.255 se +194.71.96.0 - 194.71.129.255 se +194.71.130.0 - 194.71.130.255 li +194.71.131.0 - 194.71.147.255 se 194.71.148.0 - 194.71.151.255 us 194.71.152.0 - 194.71.182.255 se 194.71.183.0 - 194.71.183.255 dk 194.71.184.0 - 194.71.186.255 se 194.71.187.0 - 194.71.187.255 es -194.71.188.0 - 194.71.231.255 se -194.71.232.0 - 194.71.235.255 gb -194.71.236.0 - 194.71.255.255 se -194.72.0.0 - 194.72.32.255 gb -194.72.33.0 - 194.72.33.255 es -194.72.34.0 - 194.72.35.255 gb -194.72.36.0 - 194.72.36.255 ch -194.72.37.0 - 194.72.37.255 gb -194.72.38.0 - 194.72.38.255 es -194.72.39.0 - 194.72.51.255 gb -194.72.52.0 - 194.72.52.255 im -194.72.53.0 - 194.72.66.255 gb -194.72.67.0 - 194.72.67.255 es -194.72.68.0 - 194.72.76.255 gb -194.72.77.0 - 194.72.77.255 es -194.72.78.0 - 194.72.78.255 gb -194.72.79.0 - 194.72.79.255 es -194.72.80.0 - 194.72.87.255 gb -194.72.88.0 - 194.72.89.255 nl -194.72.90.0 - 194.72.167.255 gb +194.71.188.0 - 194.71.201.255 se +194.71.202.0 - 194.71.203.255 es +194.71.204.0 - 194.71.223.255 se +194.71.224.0 - 194.71.224.255 in +194.71.225.0 - 194.71.225.255 nl +194.71.226.0 - 194.71.226.255 se +194.71.227.0 - 194.71.227.255 li +194.71.228.0 - 194.71.245.255 se +194.71.246.0 - 194.71.247.255 dk +194.71.248.0 - 194.71.255.255 se +194.72.0.0 - 194.72.167.255 gb 194.72.168.0 - 194.72.175.255 nl -194.72.176.0 - 194.72.183.255 gb -194.72.184.0 - 194.72.185.255 lb -194.72.186.0 - 194.72.223.255 gb -194.72.224.0 - 194.72.224.255 es -194.72.225.0 - 194.72.249.255 gb -194.72.250.0 - 194.72.250.255 es -194.72.251.0 - 194.73.48.31 gb -194.73.48.32 - 194.73.48.39 es -194.73.48.40 - 194.73.49.223 gb -194.73.49.224 - 194.73.49.255 es -194.73.50.0 - 194.73.51.159 gb -194.73.51.160 - 194.73.51.175 ir -194.73.51.176 - 194.73.67.255 gb -194.73.68.0 - 194.73.69.255 es -194.73.70.0 - 194.73.91.255 gb -194.73.92.0 - 194.73.93.255 es -194.73.94.0 - 194.73.95.255 it -194.73.96.0 - 194.73.127.255 gb -194.73.128.0 - 194.73.128.255 es -194.73.129.0 - 194.73.137.255 gb -194.73.138.0 - 194.73.138.255 fr -194.73.139.0 - 194.73.142.255 gb -194.73.143.0 - 194.73.143.255 im -194.73.144.0 - 194.73.144.255 gb -194.73.145.0 - 194.73.145.255 ie -194.73.146.0 - 194.73.196.255 gb -194.73.197.0 - 194.73.197.255 de -194.73.198.0 - 194.73.198.255 gb -194.73.199.0 - 194.73.199.255 de -194.73.200.0 - 194.73.201.255 gb -194.73.202.0 - 194.73.202.255 fr -194.73.203.0 - 194.73.218.255 gb -194.73.219.0 - 194.73.219.255 de -194.73.220.0 - 194.73.249.255 gb -194.73.250.0 - 194.73.251.255 ch -194.73.252.0 - 194.74.2.255 gb -194.74.3.0 - 194.74.3.255 es -194.74.4.0 - 194.74.9.255 gb -194.74.10.0 - 194.74.10.255 im -194.74.11.0 - 194.74.14.255 gb -194.74.15.0 - 194.74.15.255 de -194.74.16.0 - 194.74.23.255 gb -194.74.24.0 - 194.74.24.255 es -194.74.25.0 - 194.74.31.255 gb -194.74.32.0 - 194.74.32.255 es -194.74.33.0 - 194.74.35.255 gb -194.74.36.0 - 194.74.36.255 be -194.74.37.0 - 194.74.38.255 gb -194.74.39.0 - 194.74.39.255 de -194.74.40.0 - 194.74.41.255 gb -194.74.42.0 - 194.74.42.255 es -194.74.43.0 - 194.74.43.255 gb -194.74.44.0 - 194.74.45.255 es -194.74.46.0 - 194.74.49.255 gb -194.74.50.0 - 194.74.50.255 be -194.74.51.0 - 194.74.79.255 gb -194.74.80.0 - 194.74.81.255 nl -194.74.82.0 - 194.74.82.255 gb -194.74.83.0 - 194.74.87.255 nl -194.74.88.0 - 194.74.106.255 gb -194.74.107.0 - 194.74.107.255 be -194.74.108.0 - 194.74.109.255 gb -194.74.110.0 - 194.74.110.159 be -194.74.110.160 - 194.74.110.191 gb -194.74.110.192 - 194.74.110.255 be -194.74.111.0 - 194.74.120.255 gb -194.74.121.0 - 194.74.121.255 ch -194.74.122.0 - 194.75.2.255 gb -194.75.3.0 - 194.75.3.31 es -194.75.3.32 - 194.75.5.255 gb -194.75.6.0 - 194.75.6.255 es -194.75.7.0 - 194.75.25.255 gb -194.75.26.0 - 194.75.28.31 de -194.75.28.32 - 194.75.58.47 gb -194.75.58.48 - 194.75.58.55 je -194.75.58.56 - 194.75.222.255 gb -194.75.223.0 - 194.75.223.255 fr -194.75.224.0 - 194.75.255.255 gb -194.76.0.0 - 194.76.209.255 de +194.72.176.0 - 194.75.255.255 gb +194.76.0.0 - 194.76.199.255 de +194.76.208.0 - 194.76.209.255 de 194.76.210.0 - 194.76.210.255 at -194.76.211.0 - 194.76.238.255 de +194.76.211.0 - 194.76.223.255 de +194.76.228.0 - 194.76.235.255 de 194.76.239.0 - 194.76.239.255 at -194.76.240.0 - 194.77.100.47 de -194.77.100.48 - 194.77.100.55 gb -194.77.100.56 - 194.77.255.255 de -194.78.0.0 - 194.78.255.255 be +194.76.242.0 - 194.76.243.255 de +194.76.244.0 - 194.76.245.255 ro +194.76.246.0 - 194.76.246.255 no +194.76.247.0 - 194.76.247.255 ie +194.76.253.0 - 194.76.253.255 de +194.77.0.0 - 194.77.255.255 de +194.78.0.0 - 194.78.6.255 be +194.78.7.0 - 194.78.7.255 eu +194.78.8.0 - 194.78.35.194 be +194.78.35.195 - 194.78.35.195 eu +194.78.35.196 - 194.78.255.255 be 194.79.0.0 - 194.79.3.255 de 194.79.4.0 - 194.79.7.255 ru 194.79.8.0 - 194.79.11.255 ua @@ -97491,12 +86047,16 @@ 194.79.16.0 - 194.79.19.255 fi 194.79.20.0 - 194.79.23.255 ua 194.79.24.0 - 194.79.27.255 pl -194.79.28.0 - 194.79.31.255 gb +194.79.28.0 - 194.79.29.255 gb +194.79.30.0 - 194.79.30.31 nl +194.79.30.32 - 194.79.30.63 gb +194.79.30.64 - 194.79.30.95 eu +194.79.30.96 - 194.79.30.103 de +194.79.30.104 - 194.79.31.127 eu +194.79.31.128 - 194.79.31.255 gb 194.79.32.0 - 194.79.35.255 ru -194.79.36.0 - 194.79.39.255 de 194.79.40.0 - 194.79.43.255 rs 194.79.44.0 - 194.79.47.255 ru -194.79.48.0 - 194.79.51.255 fr 194.79.52.0 - 194.79.55.255 cz 194.79.56.0 - 194.79.59.255 it 194.79.60.0 - 194.79.63.255 ua @@ -97511,17 +86071,7 @@ 194.79.252.0 - 194.79.253.255 gr 194.79.254.0 - 194.79.255.255 nl 194.80.0.0 - 194.83.255.255 gb -194.84.0.0 - 194.84.14.255 ru -194.84.15.0 - 194.84.15.255 kz -194.84.16.0 - 194.84.74.63 ru -194.84.74.64 - 194.84.74.255 by -194.84.75.0 - 194.84.144.255 ru -194.84.145.0 - 194.84.145.255 by -194.84.146.0 - 194.85.11.255 ru -194.85.12.0 - 194.85.12.255 az -194.85.13.0 - 194.85.15.255 ru -194.85.16.0 - 194.85.20.255 kz -194.85.21.0 - 194.85.253.255 ru +194.84.0.0 - 194.85.253.255 ru 194.85.254.0 - 194.85.255.255 by 194.86.0.0 - 194.86.255.255 fi 194.87.0.0 - 194.87.255.255 ru @@ -97531,24 +86081,14 @@ 194.88.3.0 - 194.88.3.255 pl 194.88.4.0 - 194.88.4.255 ie 194.88.5.0 - 194.88.5.255 dk -194.88.6.0 - 194.88.6.255 ro -194.88.7.0 - 194.88.7.255 ch 194.88.8.0 - 194.88.8.255 at 194.88.9.0 - 194.88.9.255 ch 194.88.10.0 - 194.88.10.255 de -194.88.11.0 - 194.88.11.255 ru -194.88.12.0 - 194.88.12.255 pl -194.88.13.0 - 194.88.13.255 de -194.88.14.0 - 194.88.14.255 ru -194.88.15.0 - 194.88.15.255 es +194.88.14.0 - 194.88.15.255 ru 194.88.16.0 - 194.88.26.255 de 194.88.27.0 - 194.88.27.255 gb -194.88.28.0 - 194.88.31.255 se -194.88.32.0 - 194.88.48.255 hu -194.88.49.0 - 194.88.49.31 ro -194.88.49.32 - 194.88.49.95 hu -194.88.49.96 - 194.88.49.103 ro -194.88.49.104 - 194.88.63.255 hu +194.88.28.0 - 194.88.31.255 ch +194.88.32.0 - 194.88.63.255 hu 194.88.64.0 - 194.88.95.255 gb 194.88.96.0 - 194.88.127.255 be 194.88.128.0 - 194.88.129.255 pl @@ -97580,7 +86120,6 @@ 194.88.218.0 - 194.88.221.255 ua 194.88.222.0 - 194.88.223.255 fr 194.88.224.0 - 194.88.225.255 pl -194.88.226.0 - 194.88.227.255 ro 194.88.228.0 - 194.88.229.255 bg 194.88.230.0 - 194.88.231.255 nl 194.88.232.0 - 194.88.235.255 se @@ -97592,29 +86131,12 @@ 194.88.246.0 - 194.88.247.255 fr 194.88.248.0 - 194.88.249.255 ro 194.88.250.0 - 194.88.251.255 bg -194.88.252.0 - 194.88.253.255 ru 194.88.254.0 - 194.88.255.255 se -194.89.0.0 - 194.89.3.255 fi -194.89.4.0 - 194.89.4.255 de -194.89.5.0 - 194.89.5.255 dk -194.89.6.0 - 194.89.52.255 fi -194.89.53.0 - 194.89.53.255 es -194.89.54.0 - 194.89.217.255 fi -194.89.218.0 - 194.89.218.255 es -194.89.219.0 - 194.89.219.255 gb -194.89.220.0 - 194.89.220.255 fi -194.89.221.0 - 194.89.222.255 de -194.89.223.0 - 194.89.223.255 it -194.89.224.0 - 194.89.255.255 fi +194.89.0.0 - 194.89.255.255 fi 194.90.0.0 - 194.90.255.255 il -194.91.0.0 - 194.91.220.255 it -194.91.221.0 - 194.91.221.15 be -194.91.221.16 - 194.91.255.255 it +194.91.0.0 - 194.91.255.255 it 194.92.0.0 - 194.92.255.255 pl -194.93.0.0 - 194.93.3.255 dk -194.93.4.0 - 194.93.4.255 gb -194.93.5.0 - 194.93.72.255 dk -194.93.73.0 - 194.93.75.255 se +194.93.72.0 - 194.93.75.255 se 194.93.76.0 - 194.93.79.255 at 194.93.80.0 - 194.93.91.255 se 194.93.92.0 - 194.93.95.255 es @@ -97624,60 +86146,74 @@ 194.93.101.0 - 194.93.102.255 nl 194.93.103.0 - 194.93.111.255 de 194.93.112.0 - 194.93.122.255 ch -194.93.123.0 - 194.93.123.255 de +194.93.123.128 - 194.93.123.255 de 194.93.124.0 - 194.93.127.255 pl 194.93.128.0 - 194.93.159.255 gb 194.93.160.0 - 194.93.191.255 ua -194.93.192.0 - 194.95.255.255 de +194.93.192.0 - 194.93.249.255 it +194.93.250.0 - 194.93.250.255 us +194.93.251.0 - 194.93.255.255 it +194.94.0.0 - 194.95.255.255 de 194.96.0.0 - 194.96.255.255 at 194.97.0.0 - 194.97.51.191 de 194.97.51.192 - 194.97.51.255 us -194.97.52.0 - 194.97.131.255 de -194.97.132.0 - 194.97.132.255 ch -194.97.133.0 - 194.97.144.227 de -194.97.144.228 - 194.97.144.231 at -194.97.144.232 - 194.97.144.247 de -194.97.144.248 - 194.97.144.255 at -194.97.145.0 - 194.97.255.255 de -194.98.0.0 - 194.98.255.255 fr -194.99.0.0 - 194.99.115.255 de +194.97.52.0 - 194.97.255.255 de +194.98.0.0 - 194.98.11.255 fr +194.98.12.0 - 194.98.12.255 eu +194.98.13.0 - 194.98.39.255 fr +194.98.40.0 - 194.98.40.255 eu +194.98.41.0 - 194.98.42.18 fr +194.98.42.19 - 194.98.42.19 eu +194.98.42.20 - 194.98.42.255 fr +194.98.43.0 - 194.98.43.255 af +194.98.44.0 - 194.98.143.197 fr +194.98.143.198 - 194.98.143.198 eu +194.98.143.199 - 194.98.255.255 fr +194.99.0.0 - 194.99.39.255 de +194.99.48.0 - 194.99.49.0 de +194.99.49.1 - 194.99.49.1 eu +194.99.49.2 - 194.99.49.255 de +194.99.52.0 - 194.99.111.255 de +194.99.113.0 - 194.99.113.255 de 194.99.116.0 - 194.99.116.255 ru 194.99.117.0 - 194.99.117.255 pl 194.99.118.0 - 194.99.255.255 de -194.100.0.0 - 194.100.48.255 fi -194.100.49.0 - 194.100.49.127 ax -194.100.49.128 - 194.100.255.255 fi +194.100.0.0 - 194.100.255.255 fi 194.101.0.0 - 194.102.31.255 gb -194.102.32.0 - 194.102.151.255 ro -194.102.152.0 - 194.102.153.191 md -194.102.153.192 - 194.102.255.255 ro +194.102.32.0 - 194.102.255.255 ro 194.103.0.0 - 194.103.6.255 se 194.103.7.0 - 194.103.7.255 gb -194.103.8.0 - 194.103.9.255 se -194.103.10.0 - 194.103.10.255 us -194.103.11.0 - 194.103.12.255 se +194.103.8.0 - 194.103.8.255 se +194.103.9.0 - 194.103.9.255 gb +194.103.10.0 - 194.103.10.255 se +194.103.11.0 - 194.103.11.255 gb +194.103.12.0 - 194.103.12.255 se 194.103.13.0 - 194.103.13.255 us -194.103.14.0 - 194.103.35.255 se -194.103.36.0 - 194.103.39.255 sg -194.103.40.0 - 194.103.156.255 se -194.103.157.0 - 194.103.157.255 it -194.103.158.0 - 194.103.255.255 se +194.103.14.0 - 194.103.15.255 se +194.103.16.0 - 194.103.16.255 nl +194.103.17.0 - 194.103.17.255 se +194.103.18.0 - 194.103.18.255 us +194.103.19.0 - 194.103.32.255 se +194.103.33.0 - 194.103.33.255 gb +194.103.34.0 - 194.103.35.255 se +194.103.36.0 - 194.103.39.255 gb +194.103.40.0 - 194.103.93.255 se +194.103.94.0 - 194.103.94.255 dk +194.103.95.0 - 194.103.255.255 se 194.104.0.0 - 194.104.255.255 nl 194.105.0.0 - 194.105.31.255 ro 194.105.32.0 - 194.105.47.255 mt 194.105.48.0 - 194.105.55.255 it 194.105.56.0 - 194.105.56.255 lv 194.105.57.0 - 194.105.57.255 it -194.105.58.0 - 194.105.58.255 gb -194.105.59.0 - 194.105.59.255 it -194.105.60.0 - 194.105.60.255 dk 194.105.61.0 - 194.105.61.255 it -194.105.62.0 - 194.105.95.255 gb +194.105.64.0 - 194.105.95.255 gb 194.105.96.0 - 194.105.103.255 de 194.105.104.0 - 194.105.111.255 ro -194.105.112.0 - 194.105.119.255 gb -194.105.120.0 - 194.105.127.255 eu -194.105.128.0 - 194.105.129.255 nl +194.105.112.0 - 194.105.113.239 gb +194.105.113.240 - 194.105.113.243 eu +194.105.113.244 - 194.105.119.255 gb +194.105.120.0 - 194.105.129.255 nl 194.105.130.0 - 194.105.131.255 ru 194.105.132.0 - 194.105.133.255 pl 194.105.134.0 - 194.105.135.255 gb @@ -97686,11 +86222,12 @@ 194.105.140.0 - 194.105.143.255 ro 194.105.144.0 - 194.105.145.255 ua 194.105.146.0 - 194.105.147.255 de -194.105.148.0 - 194.105.151.255 nl +194.105.148.0 - 194.105.148.255 ru +194.105.149.0 - 194.105.149.255 gb +194.105.150.0 - 194.105.151.255 nl 194.105.152.0 - 194.105.153.255 fr 194.105.154.0 - 194.105.155.255 gb 194.105.156.0 - 194.105.157.255 ru -194.105.158.0 - 194.105.159.255 ch 194.105.160.0 - 194.105.191.255 gb 194.105.192.0 - 194.105.223.255 ru 194.105.224.0 - 194.105.255.255 is @@ -97702,9 +86239,10 @@ 194.106.160.0 - 194.106.191.255 rs 194.106.192.0 - 194.106.193.255 pl 194.106.194.0 - 194.106.197.255 ru -194.106.198.0 - 194.106.198.255 ir +194.106.198.0 - 194.106.198.41 gb +194.106.198.42 - 194.106.198.43 nl +194.106.198.44 - 194.106.199.255 gb 194.106.200.0 - 194.106.201.255 pl -194.106.202.0 - 194.106.203.255 ru 194.106.204.0 - 194.106.205.255 ro 194.106.206.0 - 194.106.207.255 de 194.106.208.0 - 194.106.209.255 ua @@ -97713,7 +86251,9 @@ 194.106.214.0 - 194.106.215.255 pl 194.106.216.0 - 194.106.219.255 ua 194.106.220.0 - 194.106.223.255 gb -194.106.224.0 - 194.107.15.255 at +194.106.224.0 - 194.106.237.255 at +194.106.238.0 - 194.106.239.255 fr +194.106.240.0 - 194.107.15.255 at 194.107.16.0 - 194.107.16.255 gb 194.107.17.0 - 194.107.17.255 ru 194.107.18.0 - 194.107.18.255 pl @@ -97722,9 +86262,12 @@ 194.107.21.0 - 194.107.21.255 ru 194.107.22.0 - 194.107.22.255 tr 194.107.23.0 - 194.107.23.255 ru -194.107.24.0 - 194.107.79.255 at +194.107.24.0 - 194.107.51.255 at +194.107.52.0 - 194.107.55.255 de +194.107.56.0 - 194.107.71.255 at 194.107.80.0 - 194.107.80.255 ru -194.107.81.0 - 194.107.94.255 at +194.107.81.0 - 194.107.91.255 at +194.107.93.0 - 194.107.94.255 at 194.107.95.0 - 194.107.95.255 de 194.107.96.0 - 194.107.111.255 at 194.107.112.0 - 194.107.112.255 ro @@ -97737,121 +86280,59 @@ 194.107.119.0 - 194.107.119.255 se 194.107.120.0 - 194.107.120.255 pl 194.107.121.0 - 194.107.121.255 nl +194.107.122.0 - 194.107.122.255 ro 194.107.123.0 - 194.107.123.255 be -194.107.124.0 - 194.107.124.255 pl -194.107.125.0 - 194.107.125.255 ru +194.107.124.0 - 194.107.124.255 ru 194.107.126.0 - 194.107.126.255 fr 194.107.127.0 - 194.107.127.255 pt 194.107.128.0 - 194.107.255.255 at -194.108.0.0 - 194.108.39.175 cz -194.108.39.176 - 194.108.39.179 cr -194.108.39.180 - 194.108.255.255 cz +194.108.0.0 - 194.108.255.255 cz 194.109.0.0 - 194.109.255.255 nl 194.110.0.0 - 194.110.0.255 se -194.110.1.0 - 194.110.17.255 fi +194.110.6.0 - 194.110.6.255 ua 194.110.18.0 - 194.110.18.255 ru -194.110.19.0 - 194.110.24.255 fi +194.110.23.0 - 194.110.24.255 fi 194.110.25.0 - 194.110.25.255 de 194.110.26.0 - 194.110.26.255 pl -194.110.27.0 - 194.110.27.255 fi -194.110.28.0 - 194.110.28.255 nl -194.110.29.0 - 194.110.65.255 fi +194.110.31.0 - 194.110.63.255 fi +194.110.64.0 - 194.110.65.255 pl 194.110.66.0 - 194.110.66.255 ru 194.110.67.0 - 194.110.67.255 nl 194.110.68.0 - 194.110.68.255 ro 194.110.69.0 - 194.110.69.255 fr 194.110.70.0 - 194.110.70.255 se 194.110.71.0 - 194.110.71.255 it -194.110.72.0 - 194.110.72.255 sa 194.110.73.0 - 194.110.73.255 gr -194.110.74.0 - 194.110.74.255 ro 194.110.75.0 - 194.110.75.255 gb 194.110.76.0 - 194.110.76.255 pt 194.110.77.0 - 194.110.77.255 pl 194.110.78.0 - 194.110.78.255 at 194.110.79.0 - 194.110.79.255 ua -194.110.80.0 - 194.110.95.255 fi 194.110.96.0 - 194.110.111.255 se -194.110.112.0 - 194.110.115.255 fi 194.110.116.0 - 194.110.116.255 pl -194.110.117.0 - 194.110.125.255 fi 194.110.126.0 - 194.110.126.255 ua 194.110.127.0 - 194.110.127.255 pl 194.110.128.0 - 194.110.128.255 ch 194.110.129.0 - 194.110.129.255 ua -194.110.130.0 - 194.110.132.255 fi 194.110.133.0 - 194.110.133.255 de -194.110.134.0 - 194.110.135.255 fi 194.110.136.0 - 194.110.136.255 dk -194.110.137.0 - 194.110.149.255 fi +194.110.142.0 - 194.110.142.255 fi 194.110.150.0 - 194.110.150.255 tr 194.110.151.0 - 194.110.151.255 be -194.110.152.0 - 194.110.159.255 fi -194.110.160.0 - 194.110.163.255 us +194.110.152.0 - 194.110.153.255 ru +194.110.154.0 - 194.110.154.255 fr +194.110.155.0 - 194.110.155.255 ae +194.110.156.0 - 194.110.159.255 de +194.110.160.0 - 194.110.163.255 nl 194.110.164.0 - 194.110.167.255 fr -194.110.168.0 - 194.110.176.127 fi -194.110.176.128 - 194.110.176.199 ax -194.110.176.200 - 194.110.176.203 fi -194.110.176.204 - 194.110.176.207 ax -194.110.176.208 - 194.110.176.223 fi -194.110.176.224 - 194.110.177.15 ax -194.110.177.16 - 194.110.177.63 fi -194.110.177.64 - 194.110.177.111 ax -194.110.177.112 - 194.110.177.255 fi -194.110.178.0 - 194.110.178.15 ax -194.110.178.16 - 194.110.178.23 fi -194.110.178.24 - 194.110.178.31 ax -194.110.178.32 - 194.110.178.95 fi -194.110.178.96 - 194.110.178.135 ax -194.110.178.136 - 194.110.178.143 fi -194.110.178.144 - 194.110.178.159 ax -194.110.178.160 - 194.110.178.255 fi -194.110.179.0 - 194.110.179.35 ax -194.110.179.36 - 194.110.179.95 fi -194.110.179.96 - 194.110.179.103 ax -194.110.179.104 - 194.110.179.111 fi -194.110.179.112 - 194.110.179.119 ax -194.110.179.120 - 194.110.179.127 fi -194.110.179.128 - 194.110.179.143 ax -194.110.179.144 - 194.110.179.151 fi -194.110.179.152 - 194.110.179.159 ax -194.110.179.160 - 194.110.179.255 fi -194.110.180.0 - 194.110.181.255 ax -194.110.182.0 - 194.110.182.31 fi -194.110.182.32 - 194.110.182.95 ax -194.110.182.96 - 194.110.182.255 fi -194.110.183.0 - 194.110.183.255 ax -194.110.184.0 - 194.110.184.159 fi -194.110.184.160 - 194.110.184.171 ax -194.110.184.172 - 194.110.184.173 fi -194.110.184.174 - 194.110.184.183 ax -194.110.184.184 - 194.110.185.63 fi -194.110.185.64 - 194.110.185.83 ax -194.110.185.84 - 194.110.185.87 fi -194.110.185.88 - 194.110.185.111 ax -194.110.185.112 - 194.110.185.143 fi -194.110.185.144 - 194.110.185.159 ax -194.110.185.160 - 194.110.185.191 fi -194.110.185.192 - 194.110.185.207 ax -194.110.185.208 - 194.110.185.239 fi -194.110.185.240 - 194.110.185.255 ax -194.110.186.0 - 194.110.186.127 fi -194.110.186.128 - 194.110.186.143 ax -194.110.186.144 - 194.110.186.175 fi -194.110.186.176 - 194.110.186.179 ax -194.110.186.180 - 194.110.186.183 fi -194.110.186.184 - 194.110.186.191 ax -194.110.186.192 - 194.110.186.239 fi -194.110.186.240 - 194.110.191.255 ax +194.110.176.0 - 194.110.191.255 ax 194.110.192.0 - 194.110.192.255 fr -194.110.193.0 - 194.110.193.255 ru -194.110.194.0 - 194.110.194.255 gb +194.110.194.0 - 194.110.194.255 il 194.110.195.0 - 194.110.195.255 no 194.110.196.0 - 194.110.196.255 de 194.110.197.0 - 194.110.197.255 gb 194.110.198.0 - 194.110.198.255 gr 194.110.199.0 - 194.110.199.255 si -194.110.200.0 - 194.110.200.255 pl 194.110.201.0 - 194.110.201.255 es 194.110.202.0 - 194.110.202.255 ru 194.110.203.0 - 194.110.204.255 gb @@ -97859,14 +86340,13 @@ 194.110.206.0 - 194.110.206.255 dk 194.110.207.0 - 194.110.208.255 fr 194.110.209.0 - 194.110.209.255 gb -194.110.210.0 - 194.110.210.255 ua 194.110.211.0 - 194.110.211.255 nl 194.110.212.0 - 194.110.212.255 ro 194.110.213.0 - 194.110.213.255 tr 194.110.214.0 - 194.110.214.255 nl 194.110.215.0 - 194.110.215.255 gb 194.110.216.0 - 194.110.216.255 rs -194.110.217.0 - 194.110.217.255 de +194.110.217.0 - 194.110.217.255 lu 194.110.218.0 - 194.110.218.255 gr 194.110.219.0 - 194.110.219.255 ua 194.110.220.0 - 194.110.220.255 lt @@ -97881,56 +86361,16 @@ 194.110.242.0 - 194.110.242.255 ch 194.110.243.0 - 194.110.244.255 gb 194.110.245.0 - 194.110.245.255 fr -194.110.246.0 - 194.110.247.255 de -194.110.248.0 - 194.110.248.255 ua 194.110.249.0 - 194.110.249.255 il 194.110.250.0 - 194.110.250.255 gb 194.110.251.0 - 194.110.251.255 ru 194.110.252.0 - 194.110.252.255 ua 194.110.253.0 - 194.110.253.255 ru -194.110.254.0 - 194.110.254.255 ua 194.110.255.0 - 194.110.255.255 ru -194.111.0.0 - 194.111.162.255 fi -194.111.163.0 - 194.111.163.255 ax -194.111.164.0 - 194.111.174.255 fi -194.111.175.0 - 194.111.175.255 nl -194.111.176.0 - 194.111.211.255 fi -194.111.212.0 - 194.111.212.255 ru -194.111.213.0 - 194.111.232.255 fi -194.111.233.0 - 194.111.233.255 se -194.111.234.0 - 194.111.236.255 fi -194.111.237.0 - 194.111.237.255 ru -194.111.238.0 - 194.111.255.255 fi -194.112.0.0 - 194.112.1.255 ax -194.112.2.0 - 194.112.2.255 fi -194.112.3.0 - 194.112.6.127 ax -194.112.6.128 - 194.112.6.191 fi -194.112.6.192 - 194.112.8.23 ax -194.112.8.24 - 194.112.8.31 fi -194.112.8.32 - 194.112.8.63 ax -194.112.8.64 - 194.112.8.159 fi -194.112.8.160 - 194.112.8.175 ax -194.112.8.176 - 194.112.8.183 fi -194.112.8.184 - 194.112.8.199 ax -194.112.8.200 - 194.112.8.215 fi -194.112.8.216 - 194.112.8.223 ax -194.112.8.224 - 194.112.8.255 fi -194.112.9.0 - 194.112.9.127 ax -194.112.9.128 - 194.112.9.191 fi -194.112.9.192 - 194.112.10.127 ax -194.112.10.128 - 194.112.10.135 fi -194.112.10.136 - 194.112.10.159 ax -194.112.10.160 - 194.112.10.255 fi -194.112.11.0 - 194.112.11.255 ax -194.112.12.0 - 194.112.12.255 fi -194.112.13.0 - 194.112.13.31 ax -194.112.13.32 - 194.112.13.47 fi -194.112.13.48 - 194.112.13.63 ax -194.112.13.64 - 194.112.13.127 fi -194.112.13.128 - 194.112.13.255 ax -194.112.14.0 - 194.112.14.7 fi -194.112.14.8 - 194.112.14.255 ax -194.112.15.0 - 194.112.15.255 fi +194.111.0.0 - 194.111.255.255 fi +194.112.0.0 - 194.112.8.191 ax +194.112.8.192 - 194.112.8.199 se +194.112.8.200 - 194.112.15.255 ax 194.112.16.0 - 194.112.31.255 de 194.112.32.0 - 194.112.63.255 gb 194.112.64.0 - 194.112.68.255 eu @@ -97954,7 +86394,7 @@ 194.112.100.80 - 194.112.100.95 de 194.112.100.96 - 194.112.100.127 eu 194.112.100.128 - 194.112.100.255 de -194.112.101.0 - 194.112.101.255 eu +194.112.101.0 - 194.112.101.255 gb 194.112.102.0 - 194.112.104.255 de 194.112.105.0 - 194.112.107.255 eu 194.112.108.0 - 194.112.108.255 de @@ -97966,7 +86406,8 @@ 194.112.113.64 - 194.112.113.255 de 194.112.114.0 - 194.112.114.31 fr 194.112.114.32 - 194.112.114.39 de -194.112.114.40 - 194.112.114.255 fr +194.112.114.40 - 194.112.114.47 eu +194.112.114.48 - 194.112.114.255 fr 194.112.115.0 - 194.112.115.255 eu 194.112.116.0 - 194.112.116.255 de 194.112.117.0 - 194.112.120.255 eu @@ -97983,22 +86424,27 @@ 194.112.127.216 - 194.112.127.223 de 194.112.127.224 - 194.112.127.255 eu 194.112.128.0 - 194.112.255.255 at -194.113.0.0 - 194.113.153.255 de +194.113.0.0 - 194.113.57.255 de +194.113.59.0 - 194.113.59.255 eu +194.113.60.0 - 194.113.60.255 de +194.113.64.0 - 194.113.143.255 de +194.113.148.0 - 194.113.149.255 de 194.113.154.0 - 194.113.154.255 at -194.113.155.0 - 194.113.164.255 de +194.113.160.0 - 194.113.163.255 de 194.113.165.0 - 194.113.165.255 ro -194.113.166.0 - 194.114.127.255 de +194.113.168.0 - 194.113.168.255 de +194.113.171.0 - 194.113.171.255 nl +194.113.173.0 - 194.113.173.255 de +194.113.176.0 - 194.114.127.255 de 194.114.128.0 - 194.114.131.255 ru -194.114.132.0 - 194.114.139.255 ua +194.114.132.0 - 194.114.135.255 ua 194.114.140.0 - 194.114.143.255 se 194.114.144.0 - 194.114.144.255 md 194.114.145.0 - 194.114.145.255 fr 194.114.146.0 - 194.114.147.255 il 194.114.148.0 - 194.114.151.255 pl 194.114.152.0 - 194.114.255.255 se -194.115.0.0 - 194.115.125.255 de -194.115.126.0 - 194.115.126.255 nl -194.115.127.0 - 194.115.255.255 de +194.115.0.0 - 194.115.255.255 de 194.116.0.0 - 194.116.127.255 it 194.116.128.0 - 194.116.129.255 de 194.116.130.0 - 194.116.135.255 pl @@ -98010,7 +86456,6 @@ 194.116.148.0 - 194.116.149.255 fr 194.116.150.0 - 194.116.151.255 ch 194.116.152.0 - 194.116.153.255 es -194.116.154.0 - 194.116.155.255 de 194.116.156.0 - 194.116.157.255 se 194.116.158.0 - 194.116.159.255 at 194.116.160.0 - 194.116.161.255 gb @@ -98021,7 +86466,6 @@ 194.116.168.0 - 194.116.168.255 gr 194.116.169.0 - 194.116.169.255 ru 194.116.170.0 - 194.116.171.255 ua -194.116.172.0 - 194.116.173.255 de 194.116.174.0 - 194.116.175.255 gb 194.116.176.0 - 194.116.177.255 fr 194.116.178.0 - 194.116.179.255 dk @@ -98030,7 +86474,6 @@ 194.116.184.0 - 194.116.185.255 es 194.116.186.0 - 194.116.187.255 de 194.116.188.0 - 194.116.189.255 ee -194.116.190.0 - 194.116.191.255 ro 194.116.192.0 - 194.116.193.255 pl 194.116.194.0 - 194.116.195.255 ua 194.116.196.0 - 194.116.197.255 ch @@ -98041,2616 +86484,151 @@ 194.116.206.0 - 194.116.209.255 de 194.116.210.0 - 194.116.211.255 ch 194.116.212.0 - 194.116.213.255 se -194.116.214.0 - 194.116.215.255 gb -194.116.216.0 - 194.116.217.255 ro 194.116.218.0 - 194.116.219.255 fr 194.116.220.0 - 194.116.221.255 nl 194.116.222.0 - 194.116.223.255 dk 194.116.224.0 - 194.116.225.255 at 194.116.226.0 - 194.116.227.255 il -194.116.228.0 - 194.116.229.255 ua 194.116.230.0 - 194.116.231.255 il 194.116.232.0 - 194.116.233.255 ua 194.116.234.0 - 194.116.235.255 de -194.116.236.0 - 194.116.237.255 ro 194.116.238.0 - 194.116.239.255 ua 194.116.240.0 - 194.116.241.255 es 194.116.242.0 - 194.116.243.255 at 194.116.244.0 - 194.116.245.255 ua 194.116.246.0 - 194.116.247.255 ro -194.116.248.0 - 194.116.253.255 pl +194.116.252.0 - 194.116.253.255 pl 194.116.254.0 - 194.116.255.255 gb 194.117.0.0 - 194.117.49.255 pt -194.117.50.0 - 194.117.50.127 ua 194.117.50.128 - 194.117.50.255 ru 194.117.51.0 - 194.117.51.255 ae +194.117.52.0 - 194.117.52.127 cy 194.117.52.128 - 194.117.52.255 dk -194.117.53.0 - 194.117.53.127 sn 194.117.53.128 - 194.117.53.255 no 194.117.54.0 - 194.117.54.127 de 194.117.54.128 - 194.117.54.255 gb -194.117.55.0 - 194.117.55.127 ua 194.117.55.128 - 194.117.55.255 ro 194.117.56.0 - 194.117.63.255 iq 194.117.64.0 - 194.117.95.255 ru -194.117.96.0 - 194.117.96.15 de -194.117.96.16 - 194.117.96.19 fr -194.117.96.20 - 194.117.96.23 de -194.117.96.24 - 194.117.96.27 nl -194.117.96.28 - 194.117.96.31 at -194.117.96.32 - 194.117.96.39 de -194.117.96.40 - 194.117.96.43 at -194.117.96.44 - 194.117.96.55 de -194.117.96.56 - 194.117.96.59 it -194.117.96.60 - 194.117.96.75 de -194.117.96.76 - 194.117.96.79 at -194.117.96.80 - 194.117.96.83 it -194.117.96.84 - 194.117.96.87 be -194.117.96.88 - 194.117.96.99 de -194.117.96.100 - 194.117.96.103 fr -194.117.96.104 - 194.117.96.119 de -194.117.96.120 - 194.117.96.123 nl -194.117.96.124 - 194.117.96.139 de -194.117.96.140 - 194.117.96.143 se -194.117.96.144 - 194.117.96.147 us -194.117.96.148 - 194.117.96.159 de -194.117.96.160 - 194.117.96.163 nl -194.117.96.164 - 194.117.96.164 es -194.117.96.165 - 194.117.96.166 ch -194.117.96.167 - 194.117.96.167 es -194.117.96.168 - 194.117.96.171 nl -194.117.96.172 - 194.117.96.175 gb -194.117.96.176 - 194.117.96.179 nl -194.117.96.180 - 194.117.96.183 fr -194.117.96.184 - 194.117.96.187 gb -194.117.96.188 - 194.117.96.195 de -194.117.96.196 - 194.117.96.199 fr -194.117.96.200 - 194.117.96.203 gb -194.117.96.204 - 194.117.96.207 de -194.117.96.208 - 194.117.96.211 nl -194.117.96.212 - 194.117.96.215 de -194.117.96.216 - 194.117.96.219 us -194.117.96.220 - 194.117.96.223 de -194.117.96.224 - 194.117.96.227 es -194.117.96.228 - 194.117.96.231 de -194.117.96.232 - 194.117.96.235 be -194.117.96.236 - 194.117.96.239 ch -194.117.96.240 - 194.117.96.243 ae -194.117.96.244 - 194.117.96.251 de -194.117.96.252 - 194.117.96.255 lu -194.117.97.0 - 194.117.97.11 de -194.117.97.12 - 194.117.97.15 ch -194.117.97.16 - 194.117.97.19 de -194.117.97.20 - 194.117.97.23 fr -194.117.97.24 - 194.117.97.31 de -194.117.97.32 - 194.117.97.35 it -194.117.97.36 - 194.117.97.47 de -194.117.97.48 - 194.117.97.51 ch -194.117.97.52 - 194.117.97.63 de -194.117.97.64 - 194.117.97.67 ca -194.117.97.68 - 194.117.97.71 gb -194.117.97.72 - 194.117.97.79 de -194.117.97.80 - 194.117.97.83 ch -194.117.97.84 - 194.117.97.91 de -194.117.97.92 - 194.117.97.95 us -194.117.97.96 - 194.117.97.99 de -194.117.97.100 - 194.117.97.103 nl -194.117.97.104 - 194.117.97.107 hu -194.117.97.108 - 194.117.97.115 de -194.117.97.116 - 194.117.97.119 dk -194.117.97.120 - 194.117.97.127 de -194.117.97.128 - 194.117.97.131 ca -194.117.97.132 - 194.117.97.135 at -194.117.97.136 - 194.117.97.143 us -194.117.97.144 - 194.117.97.147 de -194.117.97.148 - 194.117.97.151 ch -194.117.97.152 - 194.117.97.155 fr -194.117.97.156 - 194.117.97.159 ch -194.117.97.160 - 194.117.97.167 us -194.117.97.168 - 194.117.97.171 ca -194.117.97.172 - 194.117.97.175 tr -194.117.97.176 - 194.117.97.183 de -194.117.97.184 - 194.117.97.187 es -194.117.97.188 - 194.117.97.207 de -194.117.97.208 - 194.117.97.211 gb -194.117.97.212 - 194.117.97.215 it -194.117.97.216 - 194.117.97.219 es -194.117.97.220 - 194.117.97.227 de -194.117.97.228 - 194.117.97.231 fr -194.117.97.232 - 194.117.97.235 cl -194.117.97.236 - 194.117.97.243 us -194.117.97.244 - 194.117.97.247 de -194.117.97.248 - 194.117.97.251 it -194.117.97.252 - 194.117.97.255 at -194.117.98.0 - 194.117.98.3 us -194.117.98.4 - 194.117.98.7 de -194.117.98.8 - 194.117.98.11 us -194.117.98.12 - 194.117.98.23 nl -194.117.98.24 - 194.117.98.31 de +194.117.96.0 - 194.117.98.31 de 194.117.98.32 - 194.117.98.35 it -194.117.98.36 - 194.117.98.39 pt -194.117.98.40 - 194.117.98.43 de -194.117.98.44 - 194.117.98.47 gb -194.117.98.48 - 194.117.98.59 de -194.117.98.60 - 194.117.98.63 ca -194.117.98.64 - 194.117.98.67 de -194.117.98.68 - 194.117.98.71 us -194.117.98.72 - 194.117.98.75 de -194.117.98.76 - 194.117.98.79 us -194.117.98.80 - 194.117.98.87 de -194.117.98.88 - 194.117.98.91 gb -194.117.98.92 - 194.117.98.95 at -194.117.98.96 - 194.117.98.103 de -194.117.98.104 - 194.117.98.107 ch -194.117.98.108 - 194.117.98.115 de -194.117.98.116 - 194.117.98.119 ch -194.117.98.120 - 194.117.98.123 us -194.117.98.124 - 194.117.98.131 de -194.117.98.132 - 194.117.98.135 dk -194.117.98.136 - 194.117.98.139 de -194.117.98.140 - 194.117.98.143 at -194.117.98.144 - 194.117.98.147 de -194.117.98.148 - 194.117.98.151 it -194.117.98.152 - 194.117.98.155 fr -194.117.98.156 - 194.117.98.159 us -194.117.98.160 - 194.117.98.163 fr -194.117.98.164 - 194.117.98.167 gb -194.117.98.168 - 194.117.98.171 de -194.117.98.172 - 194.117.98.175 fr -194.117.98.176 - 194.117.98.179 de -194.117.98.180 - 194.117.98.187 ca -194.117.98.188 - 194.117.98.195 de -194.117.98.196 - 194.117.98.199 at -194.117.98.200 - 194.117.98.203 us -194.117.98.204 - 194.117.98.207 de -194.117.98.208 - 194.117.98.211 it -194.117.98.212 - 194.117.98.219 de -194.117.98.220 - 194.117.98.223 it -194.117.98.224 - 194.117.98.227 nl -194.117.98.228 - 194.117.98.231 lb -194.117.98.232 - 194.117.98.235 de -194.117.98.236 - 194.117.98.239 ch -194.117.98.240 - 194.117.98.243 pt -194.117.98.244 - 194.117.98.247 lu -194.117.98.248 - 194.117.98.251 de -194.117.98.252 - 194.117.98.255 ca -194.117.99.0 - 194.117.99.3 de -194.117.99.4 - 194.117.99.7 at -194.117.99.8 - 194.117.99.15 de -194.117.99.16 - 194.117.99.19 lu -194.117.99.20 - 194.117.99.23 at -194.117.99.24 - 194.117.99.27 pt -194.117.99.28 - 194.117.99.31 us -194.117.99.32 - 194.117.99.35 de -194.117.99.36 - 194.117.99.39 fr -194.117.99.40 - 194.117.99.43 hu -194.117.99.44 - 194.117.99.47 de -194.117.99.48 - 194.117.99.51 us -194.117.99.52 - 194.117.99.55 de -194.117.99.56 - 194.117.99.59 ar -194.117.99.60 - 194.117.99.63 us -194.117.99.64 - 194.117.99.67 es -194.117.99.68 - 194.117.99.71 bm -194.117.99.72 - 194.117.99.75 de -194.117.99.76 - 194.117.99.79 it -194.117.99.80 - 194.117.99.83 gb -194.117.99.84 - 194.117.99.87 us -194.117.99.88 - 194.117.99.91 de -194.117.99.92 - 194.117.99.95 at -194.117.99.96 - 194.117.99.115 de -194.117.99.116 - 194.117.99.119 gb -194.117.99.120 - 194.117.99.123 de -194.117.99.124 - 194.117.99.127 us -194.117.99.128 - 194.117.99.131 nl -194.117.99.132 - 194.117.99.139 de -194.117.99.140 - 194.117.99.143 be -194.117.99.144 - 194.117.99.147 de -194.117.99.148 - 194.117.99.155 es -194.117.99.156 - 194.117.99.159 de -194.117.99.160 - 194.117.99.167 fr -194.117.99.168 - 194.117.99.175 de -194.117.99.176 - 194.117.99.179 us -194.117.99.180 - 194.117.99.183 es -194.117.99.184 - 194.117.99.191 de -194.117.99.192 - 194.117.99.195 fr -194.117.99.196 - 194.117.99.199 it -194.117.99.200 - 194.117.99.203 nl -194.117.99.204 - 194.117.99.207 ch -194.117.99.208 - 194.117.99.211 de -194.117.99.212 - 194.117.99.215 us -194.117.99.216 - 194.117.99.235 de -194.117.99.236 - 194.117.99.239 at -194.117.99.240 - 194.117.99.243 es -194.117.99.244 - 194.117.99.247 us -194.117.99.248 - 194.117.99.251 de -194.117.99.252 - 194.117.99.255 fr -194.117.100.0 - 194.117.100.107 jp -194.117.100.108 - 194.117.100.111 kr -194.117.100.112 - 194.117.100.255 jp -194.117.101.0 - 194.117.101.1 de -194.117.101.2 - 194.117.101.6 us -194.117.101.7 - 194.117.101.8 ca -194.117.101.9 - 194.117.101.11 us -194.117.101.12 - 194.117.101.12 ve -194.117.101.13 - 194.117.101.13 us -194.117.101.14 - 194.117.101.14 ca -194.117.101.15 - 194.117.101.44 us -194.117.101.45 - 194.117.101.45 cn -194.117.101.46 - 194.117.101.54 us -194.117.101.55 - 194.117.101.55 cn -194.117.101.56 - 194.117.101.66 us -194.117.101.67 - 194.117.101.67 de -194.117.101.68 - 194.117.101.68 us -194.117.101.69 - 194.117.101.69 de -194.117.101.70 - 194.117.101.71 us -194.117.101.72 - 194.117.101.72 ca -194.117.101.73 - 194.117.101.76 us -194.117.101.77 - 194.117.101.77 ca -194.117.101.78 - 194.117.101.85 us -194.117.101.86 - 194.117.101.86 de -194.117.101.87 - 194.117.101.95 us -194.117.101.96 - 194.117.101.96 ca -194.117.101.97 - 194.117.101.98 us -194.117.101.99 - 194.117.101.99 de -194.117.101.100 - 194.117.101.110 us -194.117.101.111 - 194.117.101.111 ca -194.117.101.112 - 194.117.101.114 us -194.117.101.115 - 194.117.101.115 ca -194.117.101.116 - 194.117.101.186 us -194.117.101.187 - 194.117.101.187 de -194.117.101.188 - 194.117.101.191 us -194.117.101.192 - 194.117.101.192 ca -194.117.101.193 - 194.117.101.216 us -194.117.101.217 - 194.117.101.217 ca -194.117.101.218 - 194.117.101.219 ar -194.117.101.220 - 194.117.101.220 ca -194.117.101.221 - 194.117.102.1 de -194.117.102.2 - 194.117.102.7 us -194.117.102.8 - 194.117.102.8 ca -194.117.102.9 - 194.117.102.43 us -194.117.102.44 - 194.117.102.44 de -194.117.102.45 - 194.117.102.53 us -194.117.102.54 - 194.117.102.54 pr -194.117.102.55 - 194.117.102.57 us -194.117.102.58 - 194.117.102.127 de +194.117.98.36 - 194.117.101.4 de +194.117.101.5 - 194.117.101.5 us +194.117.101.6 - 194.117.101.124 de +194.117.101.125 - 194.117.101.125 us +194.117.101.126 - 194.117.101.213 de +194.117.101.214 - 194.117.101.214 us +194.117.101.215 - 194.117.102.2 de +194.117.102.3 - 194.117.102.3 us +194.117.102.4 - 194.117.102.4 de +194.117.102.5 - 194.117.102.5 us +194.117.102.6 - 194.117.102.24 de +194.117.102.25 - 194.117.102.25 us +194.117.102.26 - 194.117.102.49 de +194.117.102.50 - 194.117.102.50 us +194.117.102.51 - 194.117.102.53 de +194.117.102.54 - 194.117.102.54 us +194.117.102.55 - 194.117.102.127 de 194.117.102.128 - 194.117.102.131 us -194.117.102.132 - 194.117.102.175 de -194.117.102.176 - 194.117.102.179 us -194.117.102.180 - 194.117.102.203 de -194.117.102.204 - 194.117.102.207 us -194.117.102.208 - 194.117.102.235 de -194.117.102.236 - 194.117.102.239 us -194.117.102.240 - 194.117.102.243 de -194.117.102.244 - 194.117.102.255 us -194.117.103.0 - 194.117.103.1 de -194.117.103.2 - 194.117.103.2 tw -194.117.103.3 - 194.117.103.3 in -194.117.103.4 - 194.117.103.4 sg -194.117.103.5 - 194.117.103.5 in -194.117.103.6 - 194.117.103.6 sg -194.117.103.7 - 194.117.103.7 de -194.117.103.8 - 194.117.103.8 sg -194.117.103.9 - 194.117.103.9 in -194.117.103.10 - 194.117.103.11 tw -194.117.103.12 - 194.117.103.12 my -194.117.103.13 - 194.117.103.14 id -194.117.103.15 - 194.117.103.15 tw -194.117.103.16 - 194.117.103.16 sg -194.117.103.17 - 194.117.103.17 tw -194.117.103.18 - 194.117.103.18 my -194.117.103.19 - 194.117.103.19 tw -194.117.103.20 - 194.117.103.20 sg -194.117.103.21 - 194.117.103.21 tw -194.117.103.22 - 194.117.103.23 sg -194.117.103.24 - 194.117.103.25 tw -194.117.103.26 - 194.117.103.26 sg -194.117.103.27 - 194.117.103.27 id -194.117.103.28 - 194.117.103.29 sg -194.117.103.30 - 194.117.103.30 hk -194.117.103.31 - 194.117.103.32 sg -194.117.103.33 - 194.117.103.34 my -194.117.103.35 - 194.117.103.42 sg -194.117.103.43 - 194.117.103.43 cn -194.117.103.44 - 194.117.103.46 sg -194.117.103.47 - 194.117.103.47 in -194.117.103.48 - 194.117.103.48 my -194.117.103.49 - 194.117.103.49 sg -194.117.103.50 - 194.117.103.50 my -194.117.103.51 - 194.117.103.51 sg -194.117.103.52 - 194.117.103.52 my -194.117.103.53 - 194.117.103.53 sg -194.117.103.54 - 194.117.103.54 my -194.117.103.55 - 194.117.103.55 tw -194.117.103.56 - 194.117.103.57 my -194.117.103.58 - 194.117.103.58 cn -194.117.103.59 - 194.117.103.59 sg +194.117.102.132 - 194.117.103.59 de 194.117.103.60 - 194.117.103.60 gb -194.117.103.61 - 194.117.103.64 sg -194.117.103.65 - 194.117.103.65 in -194.117.103.66 - 194.117.103.77 sg -194.117.103.78 - 194.117.103.79 cn -194.117.103.80 - 194.117.103.80 tw -194.117.103.81 - 194.117.103.81 in -194.117.103.82 - 194.117.103.82 sg -194.117.103.83 - 194.117.103.83 my -194.117.103.84 - 194.117.103.84 sg -194.117.103.85 - 194.117.103.85 my -194.117.103.86 - 194.117.103.86 sg -194.117.103.87 - 194.117.103.87 tw -194.117.103.88 - 194.117.103.88 in -194.117.103.89 - 194.117.103.91 sg -194.117.103.92 - 194.117.103.92 my -194.117.103.93 - 194.117.103.93 sg -194.117.103.94 - 194.117.103.94 in -194.117.103.95 - 194.117.103.95 my -194.117.103.96 - 194.117.103.99 sg -194.117.103.100 - 194.117.103.100 tw -194.117.103.101 - 194.117.103.103 sg -194.117.103.104 - 194.117.103.104 my -194.117.103.105 - 194.117.103.105 sg -194.117.103.106 - 194.117.103.107 my -194.117.103.108 - 194.117.103.110 sg -194.117.103.111 - 194.117.103.111 hk -194.117.103.112 - 194.117.103.113 sg -194.117.103.114 - 194.117.103.114 my -194.117.103.115 - 194.117.103.118 sg -194.117.103.119 - 194.117.103.119 my -194.117.103.120 - 194.117.103.120 cn -194.117.103.121 - 194.117.103.121 in -194.117.103.122 - 194.117.103.122 my -194.117.103.123 - 194.117.103.123 cn -194.117.103.124 - 194.117.103.124 hk -194.117.103.125 - 194.117.103.126 my -194.117.103.127 - 194.117.103.127 th -194.117.103.128 - 194.117.103.128 sg -194.117.103.129 - 194.117.103.129 ph -194.117.103.130 - 194.117.103.130 in +194.117.103.61 - 194.117.103.67 de +194.117.103.68 - 194.117.103.68 sg +194.117.103.69 - 194.117.103.76 de +194.117.103.77 - 194.117.103.77 sg +194.117.103.78 - 194.117.103.130 de 194.117.103.131 - 194.117.103.131 sg -194.117.103.132 - 194.117.103.132 tw -194.117.103.133 - 194.117.103.133 in -194.117.103.134 - 194.117.103.134 th -194.117.103.135 - 194.117.103.135 tw -194.117.103.136 - 194.117.103.136 bn -194.117.103.137 - 194.117.103.137 tw -194.117.103.138 - 194.117.103.138 sg -194.117.103.139 - 194.117.103.141 my -194.117.103.142 - 194.117.103.142 in -194.117.103.143 - 194.117.103.144 sg -194.117.103.145 - 194.117.103.146 my -194.117.103.147 - 194.117.103.147 in -194.117.103.148 - 194.117.103.149 my -194.117.103.150 - 194.117.103.150 cn -194.117.103.151 - 194.117.103.152 sg -194.117.103.153 - 194.117.103.153 tw -194.117.103.154 - 194.117.103.155 cn -194.117.103.156 - 194.117.103.156 tw -194.117.103.157 - 194.117.103.158 sg -194.117.103.159 - 194.117.103.159 ph -194.117.103.160 - 194.117.103.166 sg -194.117.103.167 - 194.117.103.167 my -194.117.103.168 - 194.117.103.168 sg -194.117.103.169 - 194.117.103.169 in -194.117.103.170 - 194.117.103.170 sg -194.117.103.171 - 194.117.103.171 my -194.117.103.172 - 194.117.103.172 in +194.117.103.132 - 194.117.103.161 de +194.117.103.162 - 194.117.103.162 sg +194.117.103.163 - 194.117.103.172 de 194.117.103.173 - 194.117.103.173 sg -194.117.103.174 - 194.117.103.175 my -194.117.103.176 - 194.117.103.178 sg -194.117.103.179 - 194.117.103.179 my -194.117.103.180 - 194.117.103.180 in -194.117.103.181 - 194.117.103.181 cn -194.117.103.182 - 194.117.103.182 sg -194.117.103.183 - 194.117.103.183 hk -194.117.103.184 - 194.117.103.184 tw -194.117.103.185 - 194.117.103.185 de -194.117.103.186 - 194.117.103.186 sg -194.117.103.187 - 194.117.103.187 my -194.117.103.188 - 194.117.103.188 sg -194.117.103.189 - 194.117.103.189 cn -194.117.103.190 - 194.117.103.190 tw -194.117.103.191 - 194.117.103.191 sg -194.117.103.192 - 194.117.103.192 my +194.117.103.174 - 194.117.103.192 de 194.117.103.193 - 194.117.103.193 sg -194.117.103.194 - 194.117.103.194 tw -194.117.103.195 - 194.117.103.195 cn -194.117.103.196 - 194.117.103.196 my -194.117.103.197 - 194.117.103.197 sg -194.117.103.198 - 194.117.103.198 my -194.117.103.199 - 194.117.103.201 sg -194.117.103.202 - 194.117.103.202 my -194.117.103.203 - 194.117.103.203 sg -194.117.103.204 - 194.117.103.204 my -194.117.103.205 - 194.117.103.205 sg -194.117.103.206 - 194.117.103.206 cn -194.117.103.207 - 194.117.103.208 sg -194.117.103.209 - 194.117.103.209 ph -194.117.103.210 - 194.117.103.210 sg -194.117.103.211 - 194.117.103.211 my -194.117.103.212 - 194.117.103.212 in -194.117.103.213 - 194.117.103.214 sg -194.117.103.215 - 194.117.103.215 cn -194.117.103.216 - 194.117.103.216 my -194.117.103.217 - 194.117.103.217 sg -194.117.103.218 - 194.117.103.219 cn -194.117.103.220 - 194.117.103.220 in +194.117.103.194 - 194.117.103.199 de +194.117.103.200 - 194.117.103.200 sg +194.117.103.201 - 194.117.103.220 de 194.117.103.221 - 194.117.103.221 sg -194.117.103.222 - 194.117.103.222 in -194.117.103.223 - 194.117.103.223 my -194.117.103.224 - 194.117.103.224 sg -194.117.103.225 - 194.117.103.225 my -194.117.103.226 - 194.117.103.226 tw -194.117.103.227 - 194.117.103.227 sg -194.117.103.228 - 194.117.103.228 my -194.117.103.229 - 194.117.103.229 sg -194.117.103.230 - 194.117.103.230 cn -194.117.103.231 - 194.117.103.231 in -194.117.103.232 - 194.117.103.232 sg -194.117.103.233 - 194.117.103.233 my -194.117.103.234 - 194.117.103.234 sg -194.117.103.235 - 194.117.103.235 my -194.117.103.236 - 194.117.103.238 in -194.117.103.239 - 194.117.103.239 sg -194.117.103.240 - 194.117.103.240 my -194.117.103.241 - 194.117.103.241 sg -194.117.103.242 - 194.117.103.242 my -194.117.103.243 - 194.117.103.243 in -194.117.103.244 - 194.117.103.244 sg -194.117.103.245 - 194.117.103.246 in -194.117.103.247 - 194.117.103.247 sg -194.117.103.248 - 194.117.103.250 in -194.117.103.251 - 194.117.103.252 my -194.117.103.253 - 194.117.103.254 sg -194.117.103.255 - 194.117.103.255 de -194.117.104.0 - 194.117.104.15 au -194.117.104.16 - 194.117.104.19 nz -194.117.104.20 - 194.117.104.23 au -194.117.104.24 - 194.117.104.27 nz -194.117.104.28 - 194.117.104.31 au -194.117.104.32 - 194.117.104.35 nz -194.117.104.36 - 194.117.104.127 au -194.117.104.128 - 194.117.104.131 nz -194.117.104.132 - 194.117.104.155 au -194.117.104.156 - 194.117.104.159 nz -194.117.104.160 - 194.117.104.223 au -194.117.104.224 - 194.117.104.227 nz -194.117.104.228 - 194.117.104.255 au -194.117.105.0 - 194.117.105.135 de -194.117.105.136 - 194.117.105.139 dk -194.117.105.140 - 194.117.106.39 de -194.117.106.40 - 194.117.106.63 jp -194.117.106.64 - 194.117.106.143 de -194.117.106.144 - 194.117.106.255 jp -194.117.107.0 - 194.117.107.1 de -194.117.107.2 - 194.117.107.15 us -194.117.107.16 - 194.117.107.16 co -194.117.107.17 - 194.117.107.17 us -194.117.107.18 - 194.117.107.19 de -194.117.107.20 - 194.117.107.21 us -194.117.107.22 - 194.117.107.25 de -194.117.107.26 - 194.117.107.28 us -194.117.107.29 - 194.117.107.29 de -194.117.107.30 - 194.117.107.34 us -194.117.107.35 - 194.117.107.35 de -194.117.107.36 - 194.117.107.36 us -194.117.107.37 - 194.117.107.37 br -194.117.107.38 - 194.117.107.49 us -194.117.107.50 - 194.117.107.50 pr -194.117.107.51 - 194.117.107.57 us -194.117.107.58 - 194.117.107.60 mx -194.117.107.61 - 194.117.107.64 us -194.117.107.65 - 194.117.107.67 br -194.117.107.68 - 194.117.107.68 us -194.117.107.69 - 194.117.107.69 br -194.117.107.70 - 194.117.107.71 us -194.117.107.72 - 194.117.107.72 ca -194.117.107.73 - 194.117.107.73 us -194.117.107.74 - 194.117.107.74 br -194.117.107.75 - 194.117.107.75 us -194.117.107.76 - 194.117.107.76 mx -194.117.107.77 - 194.117.107.77 br -194.117.107.78 - 194.117.107.79 us -194.117.107.80 - 194.117.107.80 br -194.117.107.81 - 194.117.107.82 us -194.117.107.83 - 194.117.107.84 de -194.117.107.85 - 194.117.107.86 br -194.117.107.87 - 194.117.107.87 mx -194.117.107.88 - 194.117.107.132 us -194.117.107.133 - 194.117.107.133 br -194.117.107.134 - 194.117.107.159 us -194.117.107.160 - 194.117.107.160 de -194.117.107.161 - 194.117.107.166 us -194.117.107.167 - 194.117.107.167 de -194.117.107.168 - 194.117.107.177 us -194.117.107.178 - 194.117.107.178 de -194.117.107.179 - 194.117.107.181 us -194.117.107.182 - 194.117.107.182 mx -194.117.107.183 - 194.117.107.183 br -194.117.107.184 - 194.117.107.184 mx -194.117.107.185 - 194.117.107.193 us -194.117.107.194 - 194.117.107.197 br -194.117.107.198 - 194.117.107.201 us -194.117.107.202 - 194.117.107.202 br -194.117.107.203 - 194.117.107.205 us -194.117.107.206 - 194.117.107.206 de -194.117.107.207 - 194.117.107.214 us -194.117.107.215 - 194.117.107.255 de -194.117.108.0 - 194.117.108.3 mu -194.117.108.4 - 194.117.108.7 us -194.117.108.8 - 194.117.108.11 it -194.117.108.12 - 194.117.108.15 us -194.117.108.16 - 194.117.108.19 de -194.117.108.20 - 194.117.108.23 nl -194.117.108.24 - 194.117.108.31 de -194.117.108.32 - 194.117.108.39 nl -194.117.108.40 - 194.117.108.43 fr -194.117.108.44 - 194.117.108.47 ar -194.117.108.48 - 194.117.108.51 fr -194.117.108.52 - 194.117.108.55 se -194.117.108.56 - 194.117.108.59 de -194.117.108.60 - 194.117.108.63 mx -194.117.108.64 - 194.117.108.67 us -194.117.108.68 - 194.117.108.71 br -194.117.108.72 - 194.117.108.75 de -194.117.108.76 - 194.117.108.79 fr -194.117.108.80 - 194.117.108.83 ch -194.117.108.84 - 194.117.108.87 de -194.117.108.88 - 194.117.108.91 es -194.117.108.92 - 194.117.108.95 de -194.117.108.96 - 194.117.108.99 it -194.117.108.100 - 194.117.108.103 de -194.117.108.104 - 194.117.108.107 fr -194.117.108.108 - 194.117.108.111 nl -194.117.108.112 - 194.117.108.119 de -194.117.108.120 - 194.117.108.123 us -194.117.108.124 - 194.117.108.131 at -194.117.108.132 - 194.117.108.135 nl -194.117.108.136 - 194.117.108.139 us -194.117.108.140 - 194.117.108.143 se -194.117.108.144 - 194.117.108.151 de -194.117.108.152 - 194.117.108.155 ch -194.117.108.156 - 194.117.108.159 de -194.117.108.160 - 194.117.108.163 us -194.117.108.164 - 194.117.108.167 es -194.117.108.168 - 194.117.108.171 it -194.117.108.172 - 194.117.108.175 gb -194.117.108.176 - 194.117.108.179 de -194.117.108.180 - 194.117.108.183 us -194.117.108.184 - 194.117.108.187 fr -194.117.108.188 - 194.117.108.195 de -194.117.108.196 - 194.117.108.199 fr -194.117.108.200 - 194.117.108.203 de -194.117.108.204 - 194.117.108.207 es -194.117.108.208 - 194.117.108.215 de +194.117.103.222 - 194.117.103.252 de +194.117.103.253 - 194.117.103.253 sg +194.117.103.254 - 194.117.104.107 de +194.117.104.108 - 194.117.104.111 au +194.117.104.112 - 194.117.104.195 de +194.117.104.196 - 194.117.104.199 au +194.117.104.200 - 194.117.104.235 de +194.117.104.236 - 194.117.104.239 au +194.117.104.240 - 194.117.107.49 de +194.117.107.50 - 194.117.107.50 us +194.117.107.51 - 194.117.107.101 de +194.117.107.102 - 194.117.107.102 us +194.117.107.103 - 194.117.107.197 de +194.117.107.198 - 194.117.107.198 us +194.117.107.199 - 194.117.108.215 de 194.117.108.216 - 194.117.108.219 us -194.117.108.220 - 194.117.108.223 it -194.117.108.224 - 194.117.108.227 mx -194.117.108.228 - 194.117.108.231 ch -194.117.108.232 - 194.117.108.235 nl -194.117.108.236 - 194.117.108.239 de -194.117.108.240 - 194.117.108.243 fr -194.117.108.244 - 194.117.108.247 de -194.117.108.248 - 194.117.108.251 us -194.117.108.252 - 194.117.108.255 de -194.117.109.0 - 194.117.109.7 us -194.117.109.8 - 194.117.109.11 de -194.117.109.12 - 194.117.109.39 us -194.117.109.40 - 194.117.109.55 de -194.117.109.56 - 194.117.109.71 us -194.117.109.72 - 194.117.109.75 br -194.117.109.76 - 194.117.109.87 us -194.117.109.88 - 194.117.109.91 ie -194.117.109.92 - 194.117.109.111 de -194.117.109.112 - 194.117.109.115 us -194.117.109.116 - 194.117.109.119 de -194.117.109.120 - 194.117.109.163 us -194.117.109.164 - 194.117.109.167 br -194.117.109.168 - 194.117.109.171 de -194.117.109.172 - 194.117.109.175 br -194.117.109.176 - 194.117.109.195 us -194.117.109.196 - 194.117.109.199 de -194.117.109.200 - 194.117.109.203 br -194.117.109.204 - 194.117.109.255 us -194.117.110.0 - 194.117.110.7 de -194.117.110.8 - 194.117.110.11 be -194.117.110.12 - 194.117.110.15 de -194.117.110.16 - 194.117.110.31 ae -194.117.110.32 - 194.117.110.35 us -194.117.110.36 - 194.117.110.39 ie -194.117.110.40 - 194.117.110.43 fr -194.117.110.44 - 194.117.110.47 de -194.117.110.48 - 194.117.110.63 ro -194.117.110.64 - 194.117.110.79 de -194.117.110.80 - 194.117.110.95 tr -194.117.110.96 - 194.117.110.99 be -194.117.110.100 - 194.117.110.103 nl -194.117.110.104 - 194.117.110.107 pl -194.117.110.108 - 194.117.110.111 be -194.117.110.112 - 194.117.110.115 de -194.117.110.116 - 194.117.110.119 sa -194.117.110.120 - 194.117.110.127 cy -194.117.110.128 - 194.117.110.143 gr -194.117.110.144 - 194.117.110.159 de -194.117.110.160 - 194.117.110.175 fr -194.117.110.176 - 194.117.110.187 us -194.117.110.188 - 194.117.110.191 hu -194.117.110.192 - 194.117.110.199 de -194.117.110.200 - 194.117.110.207 bg -194.117.110.208 - 194.117.110.215 sg -194.117.110.216 - 194.117.110.239 de -194.117.110.240 - 194.117.110.243 es -194.117.110.244 - 194.117.110.247 fr -194.117.110.248 - 194.117.110.251 de -194.117.110.252 - 194.117.110.255 fr -194.117.111.0 - 194.117.111.7 de -194.117.111.8 - 194.117.111.11 ch -194.117.111.12 - 194.117.111.15 de -194.117.111.16 - 194.117.111.23 il -194.117.111.24 - 194.117.111.27 pe -194.117.111.28 - 194.117.111.31 us -194.117.111.32 - 194.117.111.35 de -194.117.111.36 - 194.117.111.39 pl -194.117.111.40 - 194.117.111.43 us -194.117.111.44 - 194.117.111.47 de -194.117.111.48 - 194.117.111.51 fr -194.117.111.52 - 194.117.111.55 de -194.117.111.56 - 194.117.111.59 dk -194.117.111.60 - 194.117.111.63 nl -194.117.111.64 - 194.117.111.71 us -194.117.111.72 - 194.117.111.75 de -194.117.111.76 - 194.117.111.79 be -194.117.111.80 - 194.117.111.83 nl -194.117.111.84 - 194.117.111.87 de -194.117.111.88 - 194.117.111.91 fr -194.117.111.92 - 194.117.111.95 de -194.117.111.96 - 194.117.111.99 gb -194.117.111.100 - 194.117.111.103 ar -194.117.111.104 - 194.117.111.107 us -194.117.111.108 - 194.117.111.111 be -194.117.111.112 - 194.117.111.115 ch -194.117.111.116 - 194.117.111.123 us -194.117.111.124 - 194.117.111.127 be -194.117.111.128 - 194.117.111.131 gr -194.117.111.132 - 194.117.111.139 de -194.117.111.140 - 194.117.111.143 gb -194.117.111.144 - 194.117.111.147 es -194.117.111.148 - 194.117.111.151 de -194.117.111.152 - 194.117.111.155 at -194.117.111.156 - 194.117.111.159 pt -194.117.111.160 - 194.117.111.163 de -194.117.111.164 - 194.117.111.167 us -194.117.111.168 - 194.117.111.171 gb -194.117.111.172 - 194.117.111.175 na -194.117.111.176 - 194.117.111.179 us -194.117.111.180 - 194.117.111.183 cl -194.117.111.184 - 194.117.111.191 fr -194.117.111.192 - 194.117.111.195 gr -194.117.111.196 - 194.117.111.199 se -194.117.111.200 - 194.117.111.203 fr +194.117.108.220 - 194.117.109.3 de +194.117.109.4 - 194.117.109.7 us +194.117.109.8 - 194.117.111.203 de 194.117.111.204 - 194.117.111.207 us -194.117.111.208 - 194.117.111.211 it -194.117.111.212 - 194.117.111.215 es -194.117.111.216 - 194.117.111.219 nl -194.117.111.220 - 194.117.111.223 de -194.117.111.224 - 194.117.111.227 us -194.117.111.228 - 194.117.111.235 de -194.117.111.236 - 194.117.111.239 us -194.117.111.240 - 194.117.111.243 de +194.117.111.208 - 194.117.111.243 de 194.117.111.244 - 194.117.111.247 ca -194.117.111.248 - 194.117.111.251 be -194.117.111.252 - 194.117.112.3 de -194.117.112.4 - 194.117.112.7 za -194.117.112.8 - 194.117.112.11 us -194.117.112.12 - 194.117.112.15 do -194.117.112.16 - 194.117.112.19 us -194.117.112.20 - 194.117.112.27 de -194.117.112.28 - 194.117.112.31 be -194.117.112.32 - 194.117.112.35 de -194.117.112.36 - 194.117.112.39 it -194.117.112.40 - 194.117.112.43 nl -194.117.112.44 - 194.117.112.51 de -194.117.112.52 - 194.117.112.55 es -194.117.112.56 - 194.117.112.63 de -194.117.112.64 - 194.117.112.67 ar -194.117.112.68 - 194.117.112.75 us -194.117.112.76 - 194.117.112.79 pt -194.117.112.80 - 194.117.112.83 us -194.117.112.84 - 194.117.112.87 de -194.117.112.88 - 194.117.112.99 us -194.117.112.100 - 194.117.112.103 sk -194.117.112.104 - 194.117.112.107 de -194.117.112.108 - 194.117.112.111 at -194.117.112.112 - 194.117.112.115 es -194.117.112.116 - 194.117.112.123 de -194.117.112.124 - 194.117.112.127 us -194.117.112.128 - 194.117.112.131 de -194.117.112.132 - 194.117.112.135 ch -194.117.112.136 - 194.117.112.139 es -194.117.112.140 - 194.117.112.143 us -194.117.112.144 - 194.117.112.147 it -194.117.112.148 - 194.117.112.151 at -194.117.112.152 - 194.117.112.155 de -194.117.112.156 - 194.117.112.159 at -194.117.112.160 - 194.117.112.167 de -194.117.112.168 - 194.117.112.171 ca -194.117.112.172 - 194.117.112.175 dk -194.117.112.176 - 194.117.112.179 sk -194.117.112.180 - 194.117.112.183 de +194.117.111.248 - 194.117.112.183 de 194.117.112.184 - 194.117.112.187 ca -194.117.112.188 - 194.117.112.195 us -194.117.112.196 - 194.117.112.199 de -194.117.112.200 - 194.117.112.203 us -194.117.112.204 - 194.117.112.207 be -194.117.112.208 - 194.117.112.211 us -194.117.112.212 - 194.117.112.215 de -194.117.112.216 - 194.117.112.219 ch -194.117.112.220 - 194.117.112.223 de -194.117.112.224 - 194.117.112.227 us -194.117.112.228 - 194.117.112.231 de -194.117.112.232 - 194.117.112.235 gb -194.117.112.236 - 194.117.112.239 mx -194.117.112.240 - 194.117.112.243 de -194.117.112.244 - 194.117.112.247 il -194.117.112.248 - 194.117.112.251 us -194.117.112.252 - 194.117.112.255 de -194.117.113.0 - 194.117.113.3 dk -194.117.113.4 - 194.117.113.7 ar -194.117.113.8 - 194.117.113.11 it -194.117.113.12 - 194.117.113.15 fr -194.117.113.16 - 194.117.113.23 de -194.117.113.24 - 194.117.113.27 us -194.117.113.28 - 194.117.113.31 de -194.117.113.32 - 194.117.113.43 us -194.117.113.44 - 194.117.113.47 es +194.117.112.188 - 194.117.113.47 de 194.117.113.48 - 194.117.113.51 gb -194.117.113.52 - 194.117.113.59 de -194.117.113.60 - 194.117.113.63 nl -194.117.113.64 - 194.117.113.67 sk -194.117.113.68 - 194.117.113.71 gb -194.117.113.72 - 194.117.113.75 tr -194.117.113.76 - 194.117.113.79 nl -194.117.113.80 - 194.117.113.83 us -194.117.113.84 - 194.117.113.91 de -194.117.113.92 - 194.117.113.95 dk -194.117.113.96 - 194.117.113.99 de -194.117.113.100 - 194.117.113.103 za -194.117.113.104 - 194.117.113.107 us -194.117.113.108 - 194.117.113.111 fr -194.117.113.112 - 194.117.113.123 us -194.117.113.124 - 194.117.113.127 gb -194.117.113.128 - 194.117.113.131 se -194.117.113.132 - 194.117.113.135 de -194.117.113.136 - 194.117.113.139 nl -194.117.113.140 - 194.117.113.143 it -194.117.113.144 - 194.117.113.147 de -194.117.113.148 - 194.117.113.151 fr -194.117.113.152 - 194.117.113.155 es -194.117.113.156 - 194.117.113.163 de -194.117.113.164 - 194.117.113.171 us -194.117.113.172 - 194.117.113.175 fr -194.117.113.176 - 194.117.113.179 it -194.117.113.180 - 194.117.113.183 fr -194.117.113.184 - 194.117.113.187 us -194.117.113.188 - 194.117.113.191 de -194.117.113.192 - 194.117.113.195 ca -194.117.113.196 - 194.117.113.199 de -194.117.113.200 - 194.117.113.203 ch -194.117.113.204 - 194.117.113.207 be -194.117.113.208 - 194.117.113.211 es -194.117.113.212 - 194.117.113.215 de -194.117.113.216 - 194.117.113.219 us -194.117.113.220 - 194.117.113.223 es -194.117.113.224 - 194.117.113.227 dk -194.117.113.228 - 194.117.113.235 us -194.117.113.236 - 194.117.113.239 de -194.117.113.240 - 194.117.113.243 it -194.117.113.244 - 194.117.113.247 us -194.117.113.248 - 194.117.113.251 es -194.117.113.252 - 194.117.113.255 de -194.117.114.0 - 194.117.114.3 ca -194.117.114.4 - 194.117.114.7 tr -194.117.114.8 - 194.117.114.27 de -194.117.114.28 - 194.117.114.31 lu -194.117.114.32 - 194.117.114.39 de -194.117.114.40 - 194.117.114.43 it -194.117.114.44 - 194.117.114.47 de -194.117.114.48 - 194.117.114.51 ch -194.117.114.52 - 194.117.114.55 us -194.117.114.56 - 194.117.114.59 es -194.117.114.60 - 194.117.114.63 de -194.117.114.64 - 194.117.114.67 us -194.117.114.68 - 194.117.114.83 de -194.117.114.84 - 194.117.114.87 fr -194.117.114.88 - 194.117.114.91 de -194.117.114.92 - 194.117.114.95 hu -194.117.114.96 - 194.117.114.99 sk -194.117.114.100 - 194.117.114.103 fr -194.117.114.104 - 194.117.114.107 de -194.117.114.108 - 194.117.114.111 nl -194.117.114.112 - 194.117.114.115 ch -194.117.114.116 - 194.117.114.119 de -194.117.114.120 - 194.117.114.123 us -194.117.114.124 - 194.117.114.127 at -194.117.114.128 - 194.117.114.135 de -194.117.114.136 - 194.117.114.139 at -194.117.114.140 - 194.117.114.151 de -194.117.114.152 - 194.117.114.155 nl -194.117.114.156 - 194.117.114.171 de -194.117.114.172 - 194.117.114.175 us -194.117.114.176 - 194.117.114.179 be -194.117.114.180 - 194.117.114.183 de -194.117.114.184 - 194.117.114.187 fr -194.117.114.188 - 194.117.114.195 de -194.117.114.196 - 194.117.114.199 it -194.117.114.200 - 194.117.114.203 gb -194.117.114.204 - 194.117.114.207 de -194.117.114.208 - 194.117.114.211 ca -194.117.114.212 - 194.117.114.215 de -194.117.114.216 - 194.117.114.219 ch -194.117.114.220 - 194.117.114.223 de -194.117.114.224 - 194.117.114.235 fr -194.117.114.236 - 194.117.114.239 dk -194.117.114.240 - 194.117.114.243 us -194.117.114.244 - 194.117.114.247 gb -194.117.114.248 - 194.117.115.3 de -194.117.115.4 - 194.117.115.7 us -194.117.115.8 - 194.117.115.11 de -194.117.115.12 - 194.117.115.15 at -194.117.115.16 - 194.117.115.19 pt -194.117.115.20 - 194.117.115.27 fr -194.117.115.28 - 194.117.115.31 nl -194.117.115.32 - 194.117.115.35 de -194.117.115.36 - 194.117.115.39 be -194.117.115.40 - 194.117.115.51 de -194.117.115.52 - 194.117.115.55 es -194.117.115.56 - 194.117.115.75 de -194.117.115.76 - 194.117.115.79 sk -194.117.115.80 - 194.117.115.91 de -194.117.115.92 - 194.117.115.95 fr -194.117.115.96 - 194.117.115.99 ch -194.117.115.100 - 194.117.115.103 es -194.117.115.104 - 194.117.115.107 us -194.117.115.108 - 194.117.115.111 fr -194.117.115.112 - 194.117.115.115 nl -194.117.115.116 - 194.117.115.119 de -194.117.115.120 - 194.117.115.131 us -194.117.115.132 - 194.117.115.135 it -194.117.115.136 - 194.117.115.139 gb -194.117.115.140 - 194.117.115.143 pl -194.117.115.144 - 194.117.115.147 gb -194.117.115.148 - 194.117.115.151 us -194.117.115.152 - 194.117.115.155 es -194.117.115.156 - 194.117.115.159 at -194.117.115.160 - 194.117.115.163 us -194.117.115.164 - 194.117.115.167 kw -194.117.115.168 - 194.117.115.171 be -194.117.115.172 - 194.117.115.175 gb -194.117.115.176 - 194.117.115.183 de -194.117.115.184 - 194.117.115.187 ca -194.117.115.188 - 194.117.115.191 us -194.117.115.192 - 194.117.115.195 ar -194.117.115.196 - 194.117.115.199 es -194.117.115.200 - 194.117.115.203 de -194.117.115.204 - 194.117.115.207 gb -194.117.115.208 - 194.117.115.211 gr -194.117.115.212 - 194.117.115.215 nl -194.117.115.216 - 194.117.115.219 us -194.117.115.220 - 194.117.115.223 nl -194.117.115.224 - 194.117.115.227 de -194.117.115.228 - 194.117.115.231 fr -194.117.115.232 - 194.117.115.235 bm -194.117.115.236 - 194.117.115.239 us -194.117.115.240 - 194.117.115.243 dk -194.117.115.244 - 194.117.115.247 it -194.117.115.248 - 194.117.115.251 fr -194.117.115.252 - 194.117.115.255 de +194.117.113.52 - 194.117.115.255 de 194.117.116.0 - 194.117.116.3 es -194.117.116.4 - 194.117.116.7 hu -194.117.116.8 - 194.117.116.15 us -194.117.116.16 - 194.117.116.19 hu -194.117.116.20 - 194.117.116.23 de -194.117.116.24 - 194.117.116.27 ca -194.117.116.28 - 194.117.116.31 us -194.117.116.32 - 194.117.116.35 ch -194.117.116.36 - 194.117.116.43 de -194.117.116.44 - 194.117.116.47 pl -194.117.116.48 - 194.117.116.51 lu -194.117.116.52 - 194.117.116.55 es +194.117.116.4 - 194.117.116.55 de 194.117.116.56 - 194.117.116.59 us -194.117.116.60 - 194.117.116.63 fr -194.117.116.64 - 194.117.116.67 at -194.117.116.68 - 194.117.116.71 us -194.117.116.72 - 194.117.116.75 fr -194.117.116.76 - 194.117.116.87 de -194.117.116.88 - 194.117.116.91 ch -194.117.116.92 - 194.117.116.95 de -194.117.116.96 - 194.117.116.99 us -194.117.116.100 - 194.117.116.103 sa -194.117.116.104 - 194.117.116.107 dk -194.117.116.108 - 194.117.116.115 de -194.117.116.116 - 194.117.116.119 us -194.117.116.120 - 194.117.116.127 de -194.117.116.128 - 194.117.116.131 ch -194.117.116.132 - 194.117.116.135 be -194.117.116.136 - 194.117.116.139 ar -194.117.116.140 - 194.117.116.143 pt -194.117.116.144 - 194.117.116.155 de -194.117.116.156 - 194.117.116.159 at -194.117.116.160 - 194.117.116.163 hu -194.117.116.164 - 194.117.116.167 fr -194.117.116.168 - 194.117.116.171 se -194.117.116.172 - 194.117.116.175 nl -194.117.116.176 - 194.117.116.187 de -194.117.116.188 - 194.117.116.191 es -194.117.116.192 - 194.117.116.195 fr -194.117.116.196 - 194.117.116.199 ch -194.117.116.200 - 194.117.116.207 us -194.117.116.208 - 194.117.116.211 de -194.117.116.212 - 194.117.116.215 it -194.117.116.216 - 194.117.116.231 de -194.117.116.232 - 194.117.116.235 us -194.117.116.236 - 194.117.116.239 de -194.117.116.240 - 194.117.116.243 br -194.117.116.244 - 194.117.116.247 us -194.117.116.248 - 194.117.116.251 ca -194.117.116.252 - 194.117.117.3 be -194.117.117.4 - 194.117.117.7 nl -194.117.117.8 - 194.117.117.11 de -194.117.117.12 - 194.117.117.15 no -194.117.117.16 - 194.117.117.19 ca -194.117.117.20 - 194.117.117.23 fr -194.117.117.24 - 194.117.117.27 gb -194.117.117.28 - 194.117.117.31 ch -194.117.117.32 - 194.117.117.35 nl -194.117.117.36 - 194.117.117.39 it -194.117.117.40 - 194.117.117.43 de -194.117.117.44 - 194.117.117.47 us -194.117.117.48 - 194.117.117.51 it -194.117.117.52 - 194.117.117.55 de -194.117.117.56 - 194.117.117.59 fr -194.117.117.60 - 194.117.117.63 ch -194.117.117.64 - 194.117.117.67 at -194.117.117.68 - 194.117.117.71 ve -194.117.117.72 - 194.117.117.75 de -194.117.117.76 - 194.117.117.79 gb -194.117.117.80 - 194.117.117.87 de -194.117.117.88 - 194.117.117.91 nl -194.117.117.92 - 194.117.117.103 us -194.117.117.104 - 194.117.117.107 nl -194.117.117.108 - 194.117.117.119 de -194.117.117.120 - 194.117.117.123 fr -194.117.117.124 - 194.117.117.127 de -194.117.117.128 - 194.117.117.131 nl -194.117.117.132 - 194.117.117.135 fr -194.117.117.136 - 194.117.117.139 it -194.117.117.140 - 194.117.117.143 gb -194.117.117.144 - 194.117.117.159 de -194.117.117.160 - 194.117.117.163 at -194.117.117.164 - 194.117.117.167 nl -194.117.117.168 - 194.117.117.171 br -194.117.117.172 - 194.117.117.175 nl -194.117.117.176 - 194.117.117.183 ch -194.117.117.184 - 194.117.117.191 de -194.117.117.192 - 194.117.117.195 us -194.117.117.196 - 194.117.117.199 ve -194.117.117.200 - 194.117.117.203 de +194.117.116.60 - 194.117.117.203 de 194.117.117.204 - 194.117.117.207 ca -194.117.117.208 - 194.117.117.211 cz -194.117.117.212 - 194.117.117.215 gb -194.117.117.216 - 194.117.117.219 de -194.117.117.220 - 194.117.117.223 us -194.117.117.224 - 194.117.117.227 gb -194.117.117.228 - 194.117.117.231 fr -194.117.117.232 - 194.117.117.235 be -194.117.117.236 - 194.117.117.239 ch -194.117.117.240 - 194.117.117.243 ca -194.117.117.244 - 194.117.117.251 us -194.117.117.252 - 194.117.117.255 de -194.117.118.0 - 194.117.118.3 gb -194.117.118.4 - 194.117.118.7 us -194.117.118.8 - 194.117.118.11 ch -194.117.118.12 - 194.117.118.15 es -194.117.118.16 - 194.117.118.19 gb -194.117.118.20 - 194.117.118.23 de -194.117.118.24 - 194.117.118.27 gb -194.117.118.28 - 194.117.118.31 de -194.117.118.32 - 194.117.118.35 ca +194.117.117.208 - 194.117.118.35 de 194.117.118.36 - 194.117.118.39 us -194.117.118.40 - 194.117.118.43 tr -194.117.118.44 - 194.117.118.47 hu -194.117.118.48 - 194.117.118.59 de -194.117.118.60 - 194.117.118.67 us -194.117.118.68 - 194.117.118.71 it -194.117.118.72 - 194.117.118.75 us -194.117.118.76 - 194.117.118.79 de -194.117.118.80 - 194.117.118.83 gb -194.117.118.84 - 194.117.118.87 ch -194.117.118.88 - 194.117.118.91 us -194.117.118.92 - 194.117.118.95 de -194.117.118.96 - 194.117.118.99 us -194.117.118.100 - 194.117.118.103 hu -194.117.118.104 - 194.117.118.107 de -194.117.118.108 - 194.117.118.111 us -194.117.118.112 - 194.117.118.115 de -194.117.118.116 - 194.117.118.119 ca -194.117.118.120 - 194.117.118.131 de -194.117.118.132 - 194.117.118.135 us -194.117.118.136 - 194.117.118.139 ca -194.117.118.140 - 194.117.118.143 de -194.117.118.144 - 194.117.118.147 it -194.117.118.148 - 194.117.118.163 de -194.117.118.164 - 194.117.118.167 nl -194.117.118.168 - 194.117.118.175 de -194.117.118.176 - 194.117.118.179 us -194.117.118.180 - 194.117.118.183 fr -194.117.118.184 - 194.117.118.187 it -194.117.118.188 - 194.117.118.191 pe -194.117.118.192 - 194.117.118.195 ch -194.117.118.196 - 194.117.118.203 de -194.117.118.204 - 194.117.118.207 se -194.117.118.208 - 194.117.118.211 at -194.117.118.212 - 194.117.118.215 de -194.117.118.216 - 194.117.118.219 nl -194.117.118.220 - 194.117.118.223 is -194.117.118.224 - 194.117.118.231 de -194.117.118.232 - 194.117.118.239 ch -194.117.118.240 - 194.117.118.243 de -194.117.118.244 - 194.117.118.247 ke -194.117.118.248 - 194.117.119.1 de -194.117.119.2 - 194.117.119.2 es -194.117.119.3 - 194.117.119.3 sa -194.117.119.4 - 194.117.119.4 tr -194.117.119.5 - 194.117.119.5 fr -194.117.119.6 - 194.117.119.8 de -194.117.119.9 - 194.117.119.9 at -194.117.119.10 - 194.117.119.10 de -194.117.119.11 - 194.117.119.11 hu -194.117.119.12 - 194.117.119.12 pt -194.117.119.13 - 194.117.119.13 sa -194.117.119.14 - 194.117.119.14 pt -194.117.119.15 - 194.117.119.15 de -194.117.119.16 - 194.117.119.16 pl -194.117.119.17 - 194.117.119.17 ke -194.117.119.18 - 194.117.119.18 tr -194.117.119.19 - 194.117.119.19 de -194.117.119.20 - 194.117.119.20 tr -194.117.119.21 - 194.117.119.21 zw -194.117.119.22 - 194.117.119.22 tr -194.117.119.23 - 194.117.119.23 de -194.117.119.24 - 194.117.119.24 tr -194.117.119.25 - 194.117.119.25 pl -194.117.119.26 - 194.117.119.26 it -194.117.119.27 - 194.117.119.27 tr -194.117.119.28 - 194.117.119.28 de -194.117.119.29 - 194.117.119.29 ae -194.117.119.30 - 194.117.119.33 de -194.117.119.34 - 194.117.119.34 tr -194.117.119.35 - 194.117.119.35 de -194.117.119.36 - 194.117.119.36 no -194.117.119.37 - 194.117.119.37 na -194.117.119.38 - 194.117.119.38 de -194.117.119.39 - 194.117.119.39 sa -194.117.119.40 - 194.117.119.40 na -194.117.119.41 - 194.117.119.41 ao -194.117.119.42 - 194.117.119.42 na -194.117.119.43 - 194.117.119.43 cy -194.117.119.44 - 194.117.119.44 de -194.117.119.45 - 194.117.119.45 pt -194.117.119.46 - 194.117.119.46 cy -194.117.119.47 - 194.117.119.47 gr -194.117.119.48 - 194.117.119.48 ch -194.117.119.49 - 194.117.119.49 hu -194.117.119.50 - 194.117.119.50 fr -194.117.119.51 - 194.117.119.51 sk -194.117.119.52 - 194.117.119.52 es -194.117.119.53 - 194.117.119.53 tr -194.117.119.54 - 194.117.119.54 es -194.117.119.55 - 194.117.119.55 tr -194.117.119.56 - 194.117.119.57 hu -194.117.119.58 - 194.117.119.58 tr -194.117.119.59 - 194.117.119.59 de -194.117.119.60 - 194.117.119.60 fr -194.117.119.61 - 194.117.119.63 tr -194.117.119.64 - 194.117.119.65 de -194.117.119.66 - 194.117.119.66 gr -194.117.119.67 - 194.117.119.67 fr -194.117.119.68 - 194.117.119.68 kz -194.117.119.69 - 194.117.119.69 ua -194.117.119.70 - 194.117.119.70 sa -194.117.119.71 - 194.117.119.71 de -194.117.119.72 - 194.117.119.72 pl -194.117.119.73 - 194.117.119.73 tr -194.117.119.74 - 194.117.119.74 de -194.117.119.75 - 194.117.119.75 cu -194.117.119.76 - 194.117.119.76 tr -194.117.119.77 - 194.117.119.77 de -194.117.119.78 - 194.117.119.78 it -194.117.119.79 - 194.117.119.79 il -194.117.119.80 - 194.117.119.80 tr -194.117.119.81 - 194.117.119.81 zw -194.117.119.82 - 194.117.119.82 sa -194.117.119.83 - 194.117.119.83 fr -194.117.119.84 - 194.117.119.84 zw -194.117.119.85 - 194.117.119.85 sk -194.117.119.86 - 194.117.119.86 tr -194.117.119.87 - 194.117.119.87 kz -194.117.119.88 - 194.117.119.88 es -194.117.119.89 - 194.117.119.89 pl -194.117.119.90 - 194.117.119.91 fr -194.117.119.92 - 194.117.119.92 gr -194.117.119.93 - 194.117.119.94 tr -194.117.119.95 - 194.117.119.95 de -194.117.119.96 - 194.117.119.96 tr -194.117.119.97 - 194.117.119.97 de -194.117.119.98 - 194.117.119.98 mz -194.117.119.99 - 194.117.119.100 tr -194.117.119.101 - 194.117.119.101 cn -194.117.119.102 - 194.117.119.102 es -194.117.119.103 - 194.117.119.103 pl -194.117.119.104 - 194.117.119.104 mz -194.117.119.105 - 194.117.119.105 pl -194.117.119.106 - 194.117.119.106 es -194.117.119.107 - 194.117.119.107 pt -194.117.119.108 - 194.117.119.108 tr -194.117.119.109 - 194.117.119.109 na -194.117.119.110 - 194.117.119.110 de -194.117.119.111 - 194.117.119.112 za -194.117.119.113 - 194.117.119.114 na -194.117.119.115 - 194.117.119.127 de -194.117.119.128 - 194.117.119.131 es -194.117.119.132 - 194.117.119.135 nl -194.117.119.136 - 194.117.119.139 fr -194.117.119.140 - 194.117.119.143 se -194.117.119.144 - 194.117.119.147 gb -194.117.119.148 - 194.117.119.151 es -194.117.119.152 - 194.117.119.155 fr -194.117.119.156 - 194.117.119.159 it -194.117.119.160 - 194.117.119.163 fr -194.117.119.164 - 194.117.119.167 de -194.117.119.168 - 194.117.119.171 it -194.117.119.172 - 194.117.119.175 ch -194.117.119.176 - 194.117.119.179 es -194.117.119.180 - 194.117.119.183 de -194.117.119.184 - 194.117.119.187 it -194.117.119.188 - 194.117.119.191 es -194.117.119.192 - 194.117.119.195 ch -194.117.119.196 - 194.117.119.219 de -194.117.119.220 - 194.117.119.223 es -194.117.119.224 - 194.117.119.227 pt +194.117.118.40 - 194.117.119.227 de 194.117.119.228 - 194.117.119.231 es 194.117.119.232 - 194.117.119.239 de 194.117.119.240 - 194.117.119.243 gb -194.117.119.244 - 194.117.119.247 be -194.117.119.248 - 194.117.119.251 es -194.117.119.252 - 194.117.119.255 gb -194.117.120.0 - 194.117.120.1 de -194.117.120.2 - 194.117.120.2 pl -194.117.120.3 - 194.117.120.7 de -194.117.120.8 - 194.117.120.8 it -194.117.120.9 - 194.117.120.9 ch -194.117.120.10 - 194.117.120.10 pt -194.117.120.11 - 194.117.120.11 de -194.117.120.12 - 194.117.120.12 dk -194.117.120.13 - 194.117.120.13 be -194.117.120.14 - 194.117.120.14 at -194.117.120.15 - 194.117.120.15 tr -194.117.120.16 - 194.117.120.16 ch -194.117.120.17 - 194.117.120.17 dk -194.117.120.18 - 194.117.120.18 fr -194.117.120.19 - 194.117.120.19 de -194.117.120.20 - 194.117.120.20 fr -194.117.120.21 - 194.117.120.22 de -194.117.120.23 - 194.117.120.24 fr -194.117.120.25 - 194.117.120.25 de -194.117.120.26 - 194.117.120.26 fr -194.117.120.27 - 194.117.120.27 ch -194.117.120.28 - 194.117.120.28 pt -194.117.120.29 - 194.117.120.30 de -194.117.120.31 - 194.117.120.31 hu -194.117.120.32 - 194.117.120.32 de -194.117.120.33 - 194.117.120.33 no -194.117.120.34 - 194.117.120.34 ch -194.117.120.35 - 194.117.120.35 de -194.117.120.36 - 194.117.120.37 ch -194.117.120.38 - 194.117.120.38 pt -194.117.120.39 - 194.117.120.40 fr -194.117.120.41 - 194.117.120.41 de -194.117.120.42 - 194.117.120.42 ch -194.117.120.43 - 194.117.120.43 de -194.117.120.44 - 194.117.120.45 fr -194.117.120.46 - 194.117.120.46 ae -194.117.120.47 - 194.117.120.47 de -194.117.120.48 - 194.117.120.48 ae -194.117.120.49 - 194.117.120.49 za -194.117.120.50 - 194.117.120.50 de -194.117.120.51 - 194.117.120.51 it -194.117.120.52 - 194.117.120.52 gr -194.117.120.53 - 194.117.120.53 ch +194.117.119.244 - 194.117.120.53 de 194.117.120.54 - 194.117.120.54 es -194.117.120.55 - 194.117.120.55 hu -194.117.120.56 - 194.117.120.57 de -194.117.120.58 - 194.117.120.58 it -194.117.120.59 - 194.117.120.60 de -194.117.120.61 - 194.117.120.61 pt -194.117.120.62 - 194.117.120.62 hu -194.117.120.63 - 194.117.120.63 de -194.117.120.64 - 194.117.120.64 gb -194.117.120.65 - 194.117.120.65 de -194.117.120.66 - 194.117.120.66 it -194.117.120.67 - 194.117.120.67 cz -194.117.120.68 - 194.117.120.68 fi -194.117.120.69 - 194.117.120.70 gb -194.117.120.71 - 194.117.120.76 de -194.117.120.77 - 194.117.120.77 es -194.117.120.78 - 194.117.120.78 pl -194.117.120.79 - 194.117.120.79 se -194.117.120.80 - 194.117.120.80 sa -194.117.120.81 - 194.117.120.81 de -194.117.120.82 - 194.117.120.82 at -194.117.120.83 - 194.117.120.83 fr -194.117.120.84 - 194.117.120.85 de -194.117.120.86 - 194.117.120.86 ch -194.117.120.87 - 194.117.120.87 sa -194.117.120.88 - 194.117.120.88 fr -194.117.120.89 - 194.117.120.89 it -194.117.120.90 - 194.117.120.90 no -194.117.120.91 - 194.117.120.92 fr -194.117.120.93 - 194.117.120.93 pt -194.117.120.94 - 194.117.120.94 ch -194.117.120.95 - 194.117.120.95 hu -194.117.120.96 - 194.117.120.96 re -194.117.120.97 - 194.117.120.97 at -194.117.120.98 - 194.117.120.98 pt -194.117.120.99 - 194.117.120.99 it -194.117.120.100 - 194.117.120.101 de -194.117.120.102 - 194.117.120.102 za -194.117.120.103 - 194.117.120.103 de -194.117.120.104 - 194.117.120.104 se -194.117.120.105 - 194.117.120.105 fr -194.117.120.106 - 194.117.120.106 it -194.117.120.107 - 194.117.120.107 de -194.117.120.108 - 194.117.120.108 at -194.117.120.109 - 194.117.120.109 pt -194.117.120.110 - 194.117.120.111 de -194.117.120.112 - 194.117.120.112 za -194.117.120.113 - 194.117.120.113 de -194.117.120.114 - 194.117.120.114 tr -194.117.120.115 - 194.117.120.115 fr -194.117.120.116 - 194.117.120.116 il -194.117.120.117 - 194.117.120.117 de -194.117.120.118 - 194.117.120.118 se -194.117.120.119 - 194.117.120.119 it -194.117.120.120 - 194.117.120.120 de -194.117.120.121 - 194.117.120.121 gb -194.117.120.122 - 194.117.120.122 hu -194.117.120.123 - 194.117.120.123 es -194.117.120.124 - 194.117.120.124 cy -194.117.120.125 - 194.117.120.129 de -194.117.120.130 - 194.117.120.130 fr -194.117.120.131 - 194.117.120.131 hu -194.117.120.132 - 194.117.120.132 de -194.117.120.133 - 194.117.120.133 fr -194.117.120.134 - 194.117.120.134 de -194.117.120.135 - 194.117.120.135 es -194.117.120.136 - 194.117.120.136 de -194.117.120.137 - 194.117.120.137 fr -194.117.120.138 - 194.117.120.138 hu -194.117.120.139 - 194.117.120.140 de -194.117.120.141 - 194.117.120.142 ch -194.117.120.143 - 194.117.120.143 dk -194.117.120.144 - 194.117.120.144 de -194.117.120.145 - 194.117.120.145 dk -194.117.120.146 - 194.117.120.146 it -194.117.120.147 - 194.117.120.147 fr -194.117.120.148 - 194.117.120.148 de -194.117.120.149 - 194.117.120.149 ch -194.117.120.150 - 194.117.120.151 fr -194.117.120.152 - 194.117.120.152 hu -194.117.120.153 - 194.117.120.153 hr -194.117.120.154 - 194.117.120.154 se -194.117.120.155 - 194.117.120.155 de -194.117.120.156 - 194.117.120.156 ch -194.117.120.157 - 194.117.120.157 de +194.117.120.55 - 194.117.120.68 de +194.117.120.69 - 194.117.120.69 gb +194.117.120.70 - 194.117.120.157 de 194.117.120.158 - 194.117.120.158 fr -194.117.120.159 - 194.117.120.159 de -194.117.120.160 - 194.117.120.160 pt -194.117.120.161 - 194.117.120.164 de -194.117.120.165 - 194.117.120.165 ch -194.117.120.166 - 194.117.120.166 se -194.117.120.167 - 194.117.120.167 za -194.117.120.168 - 194.117.120.168 fr -194.117.120.169 - 194.117.120.169 it -194.117.120.170 - 194.117.120.170 pt -194.117.120.171 - 194.117.120.171 it -194.117.120.172 - 194.117.120.172 pt -194.117.120.173 - 194.117.120.173 nl -194.117.120.174 - 194.117.120.177 de -194.117.120.178 - 194.117.120.178 se -194.117.120.179 - 194.117.120.179 pt -194.117.120.180 - 194.117.120.183 de -194.117.120.184 - 194.117.120.184 ch -194.117.120.185 - 194.117.120.185 nl -194.117.120.186 - 194.117.120.186 qa -194.117.120.187 - 194.117.120.187 fr -194.117.120.188 - 194.117.120.188 es -194.117.120.189 - 194.117.120.190 de -194.117.120.191 - 194.117.120.191 es -194.117.120.192 - 194.117.120.192 nl -194.117.120.193 - 194.117.120.193 es -194.117.120.194 - 194.117.120.194 de -194.117.120.195 - 194.117.120.195 fr -194.117.120.196 - 194.117.120.200 de -194.117.120.201 - 194.117.120.201 hu -194.117.120.202 - 194.117.120.202 de -194.117.120.203 - 194.117.120.203 fi -194.117.120.204 - 194.117.120.204 hu -194.117.120.205 - 194.117.120.206 de -194.117.120.207 - 194.117.120.207 at -194.117.120.208 - 194.117.120.208 nl -194.117.120.209 - 194.117.120.210 de -194.117.120.211 - 194.117.120.211 fr -194.117.120.212 - 194.117.120.212 es -194.117.120.213 - 194.117.120.213 fr -194.117.120.214 - 194.117.120.214 de -194.117.120.215 - 194.117.120.215 pl -194.117.120.216 - 194.117.120.216 hu -194.117.120.217 - 194.117.120.217 pl -194.117.120.218 - 194.117.120.218 se -194.117.120.219 - 194.117.120.219 de -194.117.120.220 - 194.117.120.220 gb -194.117.120.221 - 194.117.120.221 de +194.117.120.159 - 194.117.120.221 de 194.117.120.222 - 194.117.120.222 it -194.117.120.223 - 194.117.120.224 de -194.117.120.225 - 194.117.120.226 fr -194.117.120.227 - 194.117.120.227 dk -194.117.120.228 - 194.117.120.228 ru -194.117.120.229 - 194.117.120.230 fr -194.117.120.231 - 194.117.120.231 hu -194.117.120.232 - 194.117.120.232 de -194.117.120.233 - 194.117.120.233 tr -194.117.120.234 - 194.117.120.234 fr -194.117.120.235 - 194.117.121.2 de -194.117.121.3 - 194.117.121.3 ch -194.117.121.4 - 194.117.121.4 pt -194.117.121.5 - 194.117.121.5 se -194.117.121.6 - 194.117.121.7 de -194.117.121.8 - 194.117.121.8 it -194.117.121.9 - 194.117.121.9 kw -194.117.121.10 - 194.117.121.10 fr -194.117.121.11 - 194.117.121.12 de -194.117.121.13 - 194.117.121.13 es -194.117.121.14 - 194.117.121.14 fi -194.117.121.15 - 194.117.121.15 gr -194.117.121.16 - 194.117.121.16 de -194.117.121.17 - 194.117.121.17 it -194.117.121.18 - 194.117.121.18 es -194.117.121.19 - 194.117.121.19 hu -194.117.121.20 - 194.117.121.28 de -194.117.121.29 - 194.117.121.29 se -194.117.121.30 - 194.117.121.30 tr -194.117.121.31 - 194.117.121.31 es -194.117.121.32 - 194.117.121.32 fr -194.117.121.33 - 194.117.121.33 de -194.117.121.34 - 194.117.121.34 hu -194.117.121.35 - 194.117.121.35 de -194.117.121.36 - 194.117.121.36 hu -194.117.121.37 - 194.117.121.37 de -194.117.121.38 - 194.117.121.38 fr -194.117.121.39 - 194.117.121.39 pl -194.117.121.40 - 194.117.121.40 an -194.117.121.41 - 194.117.121.41 at -194.117.121.42 - 194.117.121.42 es -194.117.121.43 - 194.117.121.43 sa -194.117.121.44 - 194.117.121.44 ch -194.117.121.45 - 194.117.121.45 gb -194.117.121.46 - 194.117.121.47 de -194.117.121.48 - 194.117.121.48 pt -194.117.121.49 - 194.117.121.49 de -194.117.121.50 - 194.117.121.50 ch -194.117.121.51 - 194.117.121.51 de -194.117.121.52 - 194.117.121.52 es -194.117.121.53 - 194.117.121.53 de -194.117.121.54 - 194.117.121.54 at -194.117.121.55 - 194.117.121.55 fr -194.117.121.56 - 194.117.121.56 pt -194.117.121.57 - 194.117.121.57 cz -194.117.121.58 - 194.117.121.58 es -194.117.121.59 - 194.117.121.59 fr -194.117.121.60 - 194.117.121.61 es -194.117.121.62 - 194.117.121.63 de -194.117.121.64 - 194.117.121.64 pl -194.117.121.65 - 194.117.121.65 de -194.117.121.66 - 194.117.121.66 es -194.117.121.67 - 194.117.121.67 de -194.117.121.68 - 194.117.121.68 sk -194.117.121.69 - 194.117.121.69 be -194.117.121.70 - 194.117.121.70 tr -194.117.121.71 - 194.117.121.71 at -194.117.121.72 - 194.117.121.72 es -194.117.121.73 - 194.117.121.73 dk -194.117.121.74 - 194.117.121.74 at -194.117.121.75 - 194.117.121.75 de -194.117.121.76 - 194.117.121.76 it -194.117.121.77 - 194.117.121.78 de -194.117.121.79 - 194.117.121.79 fr -194.117.121.80 - 194.117.121.81 de -194.117.121.82 - 194.117.121.82 sk -194.117.121.83 - 194.117.121.83 pl -194.117.121.84 - 194.117.121.84 ch -194.117.121.85 - 194.117.121.85 hu -194.117.121.86 - 194.117.121.86 it -194.117.121.87 - 194.117.121.87 fr -194.117.121.88 - 194.117.121.88 gb -194.117.121.89 - 194.117.121.89 es -194.117.121.90 - 194.117.121.90 ch -194.117.121.91 - 194.117.121.91 it -194.117.121.92 - 194.117.121.92 be -194.117.121.93 - 194.117.121.93 de -194.117.121.94 - 194.117.121.94 fr -194.117.121.95 - 194.117.121.95 es -194.117.121.96 - 194.117.121.96 tr -194.117.121.97 - 194.117.121.97 gb -194.117.121.98 - 194.117.121.98 at -194.117.121.99 - 194.117.121.99 ch -194.117.121.100 - 194.117.121.100 pl -194.117.121.101 - 194.117.121.101 tr -194.117.121.102 - 194.117.121.102 ch -194.117.121.103 - 194.117.121.103 de -194.117.121.104 - 194.117.121.104 li +194.117.120.223 - 194.117.121.104 de 194.117.121.105 - 194.117.121.105 es -194.117.121.106 - 194.117.121.106 it -194.117.121.107 - 194.117.121.107 es -194.117.121.108 - 194.117.121.108 it -194.117.121.109 - 194.117.121.109 de -194.117.121.110 - 194.117.121.110 ch -194.117.121.111 - 194.117.121.111 fr -194.117.121.112 - 194.117.121.112 it -194.117.121.113 - 194.117.121.114 pt -194.117.121.115 - 194.117.121.115 es -194.117.121.116 - 194.117.121.129 de -194.117.121.130 - 194.117.121.130 fr -194.117.121.131 - 194.117.121.132 de -194.117.121.133 - 194.117.121.133 it -194.117.121.134 - 194.117.121.134 fr -194.117.121.135 - 194.117.121.135 at -194.117.121.136 - 194.117.121.136 nl -194.117.121.137 - 194.117.121.137 sk -194.117.121.138 - 194.117.121.138 it -194.117.121.139 - 194.117.121.139 pt -194.117.121.140 - 194.117.121.140 pl -194.117.121.141 - 194.117.121.141 sk -194.117.121.142 - 194.117.121.143 de -194.117.121.144 - 194.117.121.144 hu -194.117.121.145 - 194.117.121.145 es -194.117.121.146 - 194.117.121.146 sk -194.117.121.147 - 194.117.121.147 se -194.117.121.148 - 194.117.121.148 fr -194.117.121.149 - 194.117.121.149 dk -194.117.121.150 - 194.117.121.150 ch -194.117.121.151 - 194.117.121.151 fr -194.117.121.152 - 194.117.121.152 gr -194.117.121.153 - 194.117.121.153 it -194.117.121.154 - 194.117.121.154 se -194.117.121.155 - 194.117.121.155 fr -194.117.121.156 - 194.117.121.156 de -194.117.121.157 - 194.117.121.159 fr -194.117.121.160 - 194.117.121.160 pt -194.117.121.161 - 194.117.121.161 ie -194.117.121.162 - 194.117.121.162 de -194.117.121.163 - 194.117.121.163 dk -194.117.121.164 - 194.117.121.164 de -194.117.121.165 - 194.117.121.165 at -194.117.121.166 - 194.117.121.166 fr -194.117.121.167 - 194.117.121.167 ch -194.117.121.168 - 194.117.121.168 tr -194.117.121.169 - 194.117.121.169 hu -194.117.121.170 - 194.117.121.170 cy -194.117.121.171 - 194.117.121.171 es -194.117.121.172 - 194.117.121.172 de -194.117.121.173 - 194.117.121.174 es -194.117.121.175 - 194.117.121.175 pt -194.117.121.176 - 194.117.121.176 pl -194.117.121.177 - 194.117.121.177 es -194.117.121.178 - 194.117.121.178 it -194.117.121.179 - 194.117.121.179 sk -194.117.121.180 - 194.117.121.180 fr -194.117.121.181 - 194.117.121.181 cz -194.117.121.182 - 194.117.121.182 de -194.117.121.183 - 194.117.121.183 ch -194.117.121.184 - 194.117.121.184 es -194.117.121.185 - 194.117.121.186 it -194.117.121.187 - 194.117.121.187 es -194.117.121.188 - 194.117.121.188 pt -194.117.121.189 - 194.117.121.189 pl -194.117.121.190 - 194.117.121.190 ma -194.117.121.191 - 194.117.121.191 es -194.117.121.192 - 194.117.121.193 tr -194.117.121.194 - 194.117.121.194 de -194.117.121.195 - 194.117.121.195 pt -194.117.121.196 - 194.117.121.196 no -194.117.121.197 - 194.117.121.197 gr -194.117.121.198 - 194.117.121.198 de -194.117.121.199 - 194.117.121.199 gb -194.117.121.200 - 194.117.121.200 pt -194.117.121.201 - 194.117.121.201 fr -194.117.121.202 - 194.117.121.202 pt -194.117.121.203 - 194.117.121.203 pl -194.117.121.204 - 194.117.121.204 hu -194.117.121.205 - 194.117.121.205 cy -194.117.121.206 - 194.117.121.206 it -194.117.121.207 - 194.117.121.207 hu -194.117.121.208 - 194.117.121.208 pl -194.117.121.209 - 194.117.121.209 de -194.117.121.210 - 194.117.121.210 it -194.117.121.211 - 194.117.121.211 es -194.117.121.212 - 194.117.121.212 de -194.117.121.213 - 194.117.121.214 gr -194.117.121.215 - 194.117.121.215 ch -194.117.121.216 - 194.117.121.216 hu -194.117.121.217 - 194.117.121.217 tr -194.117.121.218 - 194.117.121.218 ch -194.117.121.219 - 194.117.121.219 fr -194.117.121.220 - 194.117.121.220 pl -194.117.121.221 - 194.117.121.221 lb -194.117.121.222 - 194.117.122.3 de -194.117.122.4 - 194.117.122.5 ch -194.117.122.6 - 194.117.122.7 de -194.117.122.8 - 194.117.122.8 fr -194.117.122.9 - 194.117.122.9 li -194.117.122.10 - 194.117.122.12 de -194.117.122.13 - 194.117.122.13 fr -194.117.122.14 - 194.117.122.14 de -194.117.122.15 - 194.117.122.15 at -194.117.122.16 - 194.117.122.16 nl -194.117.122.17 - 194.117.122.17 de -194.117.122.18 - 194.117.122.18 ch -194.117.122.19 - 194.117.122.19 gb -194.117.122.20 - 194.117.122.20 it -194.117.122.21 - 194.117.122.22 fr -194.117.122.23 - 194.117.122.24 de -194.117.122.25 - 194.117.122.25 nl -194.117.122.26 - 194.117.122.26 at -194.117.122.27 - 194.117.122.27 de -194.117.122.28 - 194.117.122.28 gb -194.117.122.29 - 194.117.122.29 de -194.117.122.30 - 194.117.122.30 at -194.117.122.31 - 194.117.122.33 de -194.117.122.34 - 194.117.122.34 gr -194.117.122.35 - 194.117.122.38 de -194.117.122.39 - 194.117.122.39 nl -194.117.122.40 - 194.117.122.40 dk -194.117.122.41 - 194.117.122.42 fr -194.117.122.43 - 194.117.122.45 de -194.117.122.46 - 194.117.122.46 at -194.117.122.47 - 194.117.122.47 de -194.117.122.48 - 194.117.122.48 nl -194.117.122.49 - 194.117.122.49 fr -194.117.122.50 - 194.117.122.50 gb -194.117.122.51 - 194.117.122.51 se -194.117.122.52 - 194.117.122.52 gb -194.117.122.53 - 194.117.122.53 de -194.117.122.54 - 194.117.122.54 it -194.117.122.55 - 194.117.122.56 de -194.117.122.57 - 194.117.122.57 se -194.117.122.58 - 194.117.122.61 de -194.117.122.62 - 194.117.122.62 dk -194.117.122.63 - 194.117.122.63 bh -194.117.122.64 - 194.117.122.64 nl -194.117.122.65 - 194.117.122.65 fr -194.117.122.66 - 194.117.122.66 de -194.117.122.67 - 194.117.122.67 nl -194.117.122.68 - 194.117.122.72 de -194.117.122.73 - 194.117.122.73 at -194.117.122.74 - 194.117.122.76 de -194.117.122.77 - 194.117.122.77 nl -194.117.122.78 - 194.117.122.78 at -194.117.122.79 - 194.117.122.79 pt -194.117.122.80 - 194.117.122.80 dk -194.117.122.81 - 194.117.122.81 gb -194.117.122.82 - 194.117.122.83 de -194.117.122.84 - 194.117.122.84 ch -194.117.122.85 - 194.117.122.87 de -194.117.122.88 - 194.117.122.89 ch -194.117.122.90 - 194.117.122.90 nl -194.117.122.91 - 194.117.122.91 gb -194.117.122.92 - 194.117.122.92 nl -194.117.122.93 - 194.117.122.93 de -194.117.122.94 - 194.117.122.94 be -194.117.122.95 - 194.117.122.95 si -194.117.122.96 - 194.117.122.97 de -194.117.122.98 - 194.117.122.98 ie -194.117.122.99 - 194.117.122.99 de -194.117.122.100 - 194.117.122.100 it -194.117.122.101 - 194.117.122.101 se -194.117.122.102 - 194.117.122.104 de -194.117.122.105 - 194.117.122.105 at -194.117.122.106 - 194.117.122.106 de -194.117.122.107 - 194.117.122.107 fr -194.117.122.108 - 194.117.122.108 de -194.117.122.109 - 194.117.122.109 pt -194.117.122.110 - 194.117.122.110 se -194.117.122.111 - 194.117.122.113 nl -194.117.122.114 - 194.117.122.115 de -194.117.122.116 - 194.117.122.116 ch -194.117.122.117 - 194.117.122.118 de -194.117.122.119 - 194.117.122.119 nl -194.117.122.120 - 194.117.122.120 es -194.117.122.121 - 194.117.122.121 de -194.117.122.122 - 194.117.122.122 be -194.117.122.123 - 194.117.122.123 de -194.117.122.124 - 194.117.122.124 no -194.117.122.125 - 194.117.122.125 ch -194.117.122.126 - 194.117.122.126 gb -194.117.122.127 - 194.117.122.132 de -194.117.122.133 - 194.117.122.133 it -194.117.122.134 - 194.117.122.134 de -194.117.122.135 - 194.117.122.135 nl -194.117.122.136 - 194.117.122.136 ch -194.117.122.137 - 194.117.122.137 pt -194.117.122.138 - 194.117.122.138 nl -194.117.122.139 - 194.117.122.139 gb -194.117.122.140 - 194.117.122.140 ie -194.117.122.141 - 194.117.122.141 nl -194.117.122.142 - 194.117.122.142 de -194.117.122.143 - 194.117.122.144 fr -194.117.122.145 - 194.117.122.145 nl -194.117.122.146 - 194.117.122.149 de -194.117.122.150 - 194.117.122.150 gb +194.117.121.106 - 194.117.122.150 de 194.117.122.151 - 194.117.122.151 at 194.117.122.152 - 194.117.122.152 ch -194.117.122.153 - 194.117.122.153 at -194.117.122.154 - 194.117.122.154 de -194.117.122.155 - 194.117.122.155 fr -194.117.122.156 - 194.117.122.159 de -194.117.122.160 - 194.117.122.160 nl -194.117.122.161 - 194.117.122.161 no -194.117.122.162 - 194.117.122.163 nl -194.117.122.164 - 194.117.122.164 de -194.117.122.165 - 194.117.122.165 nl -194.117.122.166 - 194.117.122.166 es -194.117.122.167 - 194.117.122.167 ch -194.117.122.168 - 194.117.122.168 se -194.117.122.169 - 194.117.122.169 dk -194.117.122.170 - 194.117.122.170 it -194.117.122.171 - 194.117.122.171 de -194.117.122.172 - 194.117.122.174 ch -194.117.122.175 - 194.117.122.176 de -194.117.122.177 - 194.117.122.177 nl -194.117.122.178 - 194.117.122.179 de -194.117.122.180 - 194.117.122.180 ch -194.117.122.181 - 194.117.122.181 de -194.117.122.182 - 194.117.122.182 es -194.117.122.183 - 194.117.122.183 at -194.117.122.184 - 194.117.122.188 de -194.117.122.189 - 194.117.122.189 at -194.117.122.190 - 194.117.122.190 dk -194.117.122.191 - 194.117.122.191 de -194.117.122.192 - 194.117.122.192 nl -194.117.122.193 - 194.117.122.193 ch -194.117.122.194 - 194.117.122.194 dk -194.117.122.195 - 194.117.122.195 fr -194.117.122.196 - 194.117.122.196 de -194.117.122.197 - 194.117.122.197 it -194.117.122.198 - 194.117.122.198 de -194.117.122.199 - 194.117.122.199 at -194.117.122.200 - 194.117.122.200 nl -194.117.122.201 - 194.117.122.202 de -194.117.122.203 - 194.117.122.203 gb -194.117.122.204 - 194.117.122.204 de -194.117.122.205 - 194.117.122.205 nl -194.117.122.206 - 194.117.122.208 de -194.117.122.209 - 194.117.122.209 gb -194.117.122.210 - 194.117.122.210 fr -194.117.122.211 - 194.117.122.211 it -194.117.122.212 - 194.117.122.214 de -194.117.122.215 - 194.117.122.215 ch -194.117.122.216 - 194.117.122.217 fr -194.117.122.218 - 194.117.122.218 it -194.117.122.219 - 194.117.122.219 de -194.117.122.220 - 194.117.122.220 es -194.117.122.221 - 194.117.122.221 fr -194.117.122.222 - 194.117.122.222 es -194.117.122.223 - 194.117.122.226 de -194.117.122.227 - 194.117.122.227 ch -194.117.122.228 - 194.117.122.228 be -194.117.122.229 - 194.117.122.229 de -194.117.122.230 - 194.117.122.230 it -194.117.122.231 - 194.117.122.231 es -194.117.122.232 - 194.117.122.232 lu -194.117.122.233 - 194.117.122.233 ch -194.117.122.234 - 194.117.122.234 it -194.117.122.235 - 194.117.122.235 nl -194.117.122.236 - 194.117.122.236 ch -194.117.122.237 - 194.117.122.237 it -194.117.122.238 - 194.117.122.238 fr -194.117.122.239 - 194.117.122.240 de -194.117.122.241 - 194.117.122.241 ch -194.117.122.242 - 194.117.122.242 fr -194.117.122.243 - 194.117.122.243 de -194.117.122.244 - 194.117.122.244 it -194.117.122.245 - 194.117.122.245 fr -194.117.122.246 - 194.117.122.247 gb -194.117.122.248 - 194.117.122.248 es -194.117.122.249 - 194.117.122.249 fr -194.117.122.250 - 194.117.122.250 gb -194.117.122.251 - 194.117.122.251 de -194.117.122.252 - 194.117.122.252 dk -194.117.122.253 - 194.117.122.253 ch -194.117.122.254 - 194.117.122.254 it -194.117.122.255 - 194.117.123.1 de -194.117.123.2 - 194.117.123.2 es -194.117.123.3 - 194.117.123.3 it -194.117.123.4 - 194.117.123.4 at -194.117.123.5 - 194.117.123.5 fr -194.117.123.6 - 194.117.123.6 de -194.117.123.7 - 194.117.123.7 lu -194.117.123.8 - 194.117.123.11 de -194.117.123.12 - 194.117.123.12 it -194.117.123.13 - 194.117.123.13 ch -194.117.123.14 - 194.117.123.14 gr -194.117.123.15 - 194.117.123.16 de -194.117.123.17 - 194.117.123.17 es -194.117.123.18 - 194.117.123.18 fr -194.117.123.19 - 194.117.123.19 de -194.117.123.20 - 194.117.123.20 fr -194.117.123.21 - 194.117.123.21 il -194.117.123.22 - 194.117.123.26 de -194.117.123.27 - 194.117.123.27 nl -194.117.123.28 - 194.117.123.28 at -194.117.123.29 - 194.117.123.29 nl -194.117.123.30 - 194.117.123.30 es -194.117.123.31 - 194.117.123.35 de -194.117.123.36 - 194.117.123.36 nl -194.117.123.37 - 194.117.123.38 de -194.117.123.39 - 194.117.123.39 gb -194.117.123.40 - 194.117.123.40 ch -194.117.123.41 - 194.117.123.41 no -194.117.123.42 - 194.117.123.42 de -194.117.123.43 - 194.117.123.43 it -194.117.123.44 - 194.117.123.45 es -194.117.123.46 - 194.117.123.47 de -194.117.123.48 - 194.117.123.48 nl -194.117.123.49 - 194.117.123.49 de -194.117.123.50 - 194.117.123.50 fr -194.117.123.51 - 194.117.123.51 nl -194.117.123.52 - 194.117.123.52 de -194.117.123.53 - 194.117.123.53 es -194.117.123.54 - 194.117.123.54 de -194.117.123.55 - 194.117.123.55 fr -194.117.123.56 - 194.117.123.56 de -194.117.123.57 - 194.117.123.57 fr -194.117.123.58 - 194.117.123.58 de -194.117.123.59 - 194.117.123.59 fr -194.117.123.60 - 194.117.123.60 de -194.117.123.61 - 194.117.123.63 ch -194.117.123.64 - 194.117.123.64 de -194.117.123.65 - 194.117.123.65 it -194.117.123.66 - 194.117.123.66 ch -194.117.123.67 - 194.117.123.67 es -194.117.123.68 - 194.117.123.70 de -194.117.123.71 - 194.117.123.71 fr -194.117.123.72 - 194.117.123.74 de -194.117.123.75 - 194.117.123.75 at -194.117.123.76 - 194.117.123.76 nl -194.117.123.77 - 194.117.123.77 de -194.117.123.78 - 194.117.123.78 lu -194.117.123.79 - 194.117.123.79 dk -194.117.123.80 - 194.117.123.80 ch +194.117.122.153 - 194.117.123.80 de 194.117.123.81 - 194.117.123.81 it -194.117.123.82 - 194.117.123.82 es -194.117.123.83 - 194.117.123.83 de -194.117.123.84 - 194.117.123.84 ch -194.117.123.85 - 194.117.123.85 es -194.117.123.86 - 194.117.123.87 it -194.117.123.88 - 194.117.123.88 fr -194.117.123.89 - 194.117.123.89 gb -194.117.123.90 - 194.117.123.90 de -194.117.123.91 - 194.117.123.91 be -194.117.123.92 - 194.117.123.92 de -194.117.123.93 - 194.117.123.93 gb -194.117.123.94 - 194.117.123.95 de -194.117.123.96 - 194.117.123.96 nl -194.117.123.97 - 194.117.123.97 hu -194.117.123.98 - 194.117.123.98 fr -194.117.123.99 - 194.117.123.104 de -194.117.123.105 - 194.117.123.105 es -194.117.123.106 - 194.117.123.108 de -194.117.123.109 - 194.117.123.109 no -194.117.123.110 - 194.117.123.110 de -194.117.123.111 - 194.117.123.111 it -194.117.123.112 - 194.117.123.115 de -194.117.123.116 - 194.117.123.116 nl -194.117.123.117 - 194.117.123.119 de -194.117.123.120 - 194.117.123.120 be -194.117.123.121 - 194.117.123.121 fr -194.117.123.122 - 194.117.123.122 de -194.117.123.123 - 194.117.123.123 nl -194.117.123.124 - 194.117.123.124 dk -194.117.123.125 - 194.117.123.129 de -194.117.123.130 - 194.117.123.130 gb -194.117.123.131 - 194.117.123.132 de -194.117.123.133 - 194.117.123.134 nl -194.117.123.135 - 194.117.123.135 fr -194.117.123.136 - 194.117.123.136 de -194.117.123.137 - 194.117.123.138 fr -194.117.123.139 - 194.117.123.139 nl -194.117.123.140 - 194.117.123.140 it -194.117.123.141 - 194.117.123.145 de -194.117.123.146 - 194.117.123.146 at -194.117.123.147 - 194.117.123.148 de -194.117.123.149 - 194.117.123.149 nl -194.117.123.150 - 194.117.123.150 fr -194.117.123.151 - 194.117.123.151 de -194.117.123.152 - 194.117.123.152 it -194.117.123.153 - 194.117.123.153 us -194.117.123.154 - 194.117.123.157 de -194.117.123.158 - 194.117.123.158 ch -194.117.123.159 - 194.117.123.160 de -194.117.123.161 - 194.117.123.161 ch -194.117.123.162 - 194.117.123.162 fr -194.117.123.163 - 194.117.123.163 de +194.117.123.82 - 194.117.123.163 de 194.117.123.164 - 194.117.123.164 nl -194.117.123.165 - 194.117.123.165 de -194.117.123.166 - 194.117.123.167 dk -194.117.123.168 - 194.117.123.168 it -194.117.123.169 - 194.117.123.169 de -194.117.123.170 - 194.117.123.170 es -194.117.123.171 - 194.117.123.171 it -194.117.123.172 - 194.117.123.172 de -194.117.123.173 - 194.117.123.173 nl -194.117.123.174 - 194.117.123.174 de -194.117.123.175 - 194.117.123.175 es -194.117.123.176 - 194.117.123.176 de -194.117.123.177 - 194.117.123.177 fr -194.117.123.178 - 194.117.123.178 de -194.117.123.179 - 194.117.123.179 it -194.117.123.180 - 194.117.123.180 no -194.117.123.181 - 194.117.123.185 de -194.117.123.186 - 194.117.123.186 be -194.117.123.187 - 194.117.123.189 de -194.117.123.190 - 194.117.123.190 fr -194.117.123.191 - 194.117.123.191 de -194.117.123.192 - 194.117.123.192 it -194.117.123.193 - 194.117.123.194 de -194.117.123.195 - 194.117.123.195 es -194.117.123.196 - 194.117.123.196 de -194.117.123.197 - 194.117.123.197 es -194.117.123.198 - 194.117.123.199 de -194.117.123.200 - 194.117.123.200 at -194.117.123.201 - 194.117.123.203 de -194.117.123.204 - 194.117.123.204 dk -194.117.123.205 - 194.117.123.205 se -194.117.123.206 - 194.117.123.208 de -194.117.123.209 - 194.117.123.209 fr -194.117.123.210 - 194.117.123.214 de -194.117.123.215 - 194.117.123.215 dk -194.117.123.216 - 194.117.123.216 de -194.117.123.217 - 194.117.123.217 gr -194.117.123.218 - 194.117.123.219 ch +194.117.123.165 - 194.117.123.219 de 194.117.123.220 - 194.117.123.220 nl -194.117.123.221 - 194.117.123.221 es -194.117.123.222 - 194.117.123.223 de -194.117.123.224 - 194.117.123.224 dk -194.117.123.225 - 194.117.123.225 es -194.117.123.226 - 194.117.123.226 nl -194.117.123.227 - 194.117.123.228 fr -194.117.123.229 - 194.117.123.229 hu -194.117.123.230 - 194.117.123.230 nl -194.117.123.231 - 194.117.123.231 de -194.117.123.232 - 194.117.123.232 fr -194.117.123.233 - 194.117.123.233 es -194.117.123.234 - 194.117.123.234 de -194.117.123.235 - 194.117.123.235 nl -194.117.123.236 - 194.117.123.236 ch -194.117.123.237 - 194.117.123.237 de -194.117.123.238 - 194.117.123.238 pt -194.117.123.239 - 194.117.123.239 no -194.117.123.240 - 194.117.123.240 nl -194.117.123.241 - 194.117.123.241 de -194.117.123.242 - 194.117.123.242 dk -194.117.123.243 - 194.117.123.243 no -194.117.123.244 - 194.117.123.246 it -194.117.123.247 - 194.117.123.247 de -194.117.123.248 - 194.117.123.248 it -194.117.123.249 - 194.117.123.249 ch -194.117.123.250 - 194.117.123.251 de -194.117.123.252 - 194.117.123.252 ch -194.117.123.253 - 194.117.123.253 fr -194.117.123.254 - 194.117.124.1 de -194.117.124.2 - 194.117.124.2 pt -194.117.124.3 - 194.117.124.6 de -194.117.124.7 - 194.117.124.7 ch -194.117.124.8 - 194.117.124.8 de -194.117.124.9 - 194.117.124.9 fr -194.117.124.10 - 194.117.124.10 ch -194.117.124.11 - 194.117.124.11 gb -194.117.124.12 - 194.117.124.12 de -194.117.124.13 - 194.117.124.13 it -194.117.124.14 - 194.117.124.14 de -194.117.124.15 - 194.117.124.15 nl -194.117.124.16 - 194.117.124.17 fr -194.117.124.18 - 194.117.124.18 de -194.117.124.19 - 194.117.124.19 ch -194.117.124.20 - 194.117.124.20 at -194.117.124.21 - 194.117.124.21 fr -194.117.124.22 - 194.117.124.25 de -194.117.124.26 - 194.117.124.26 nl -194.117.124.27 - 194.117.124.27 dk -194.117.124.28 - 194.117.124.29 de -194.117.124.30 - 194.117.124.30 dk -194.117.124.31 - 194.117.124.31 no -194.117.124.32 - 194.117.124.33 de -194.117.124.34 - 194.117.124.34 fr -194.117.124.35 - 194.117.124.35 nl -194.117.124.36 - 194.117.124.36 ch -194.117.124.37 - 194.117.124.37 it -194.117.124.38 - 194.117.124.39 de -194.117.124.40 - 194.117.124.40 nl -194.117.124.41 - 194.117.124.42 de -194.117.124.43 - 194.117.124.43 gb -194.117.124.44 - 194.117.124.44 de -194.117.124.45 - 194.117.124.45 ie -194.117.124.46 - 194.117.124.46 gb -194.117.124.47 - 194.117.124.50 de -194.117.124.51 - 194.117.124.51 es -194.117.124.52 - 194.117.124.53 de -194.117.124.54 - 194.117.124.54 ch -194.117.124.55 - 194.117.124.55 de -194.117.124.56 - 194.117.124.56 dk -194.117.124.57 - 194.117.124.59 de -194.117.124.60 - 194.117.124.60 es -194.117.124.61 - 194.117.124.61 de -194.117.124.62 - 194.117.124.62 se -194.117.124.63 - 194.117.124.66 de -194.117.124.67 - 194.117.124.67 it -194.117.124.68 - 194.117.124.69 fr -194.117.124.70 - 194.117.124.70 gb -194.117.124.71 - 194.117.124.73 de -194.117.124.74 - 194.117.124.74 it -194.117.124.75 - 194.117.124.77 de -194.117.124.78 - 194.117.124.78 it -194.117.124.79 - 194.117.124.79 de -194.117.124.80 - 194.117.124.80 at -194.117.124.81 - 194.117.124.81 dk -194.117.124.82 - 194.117.124.82 it -194.117.124.83 - 194.117.124.83 gr -194.117.124.84 - 194.117.124.84 es -194.117.124.85 - 194.117.124.85 de -194.117.124.86 - 194.117.124.86 it -194.117.124.87 - 194.117.124.88 de -194.117.124.89 - 194.117.124.89 gb -194.117.124.90 - 194.117.124.92 de -194.117.124.93 - 194.117.124.93 ch -194.117.124.94 - 194.117.124.95 de -194.117.124.96 - 194.117.124.96 it -194.117.124.97 - 194.117.124.102 de -194.117.124.103 - 194.117.124.103 it -194.117.124.104 - 194.117.124.105 nl -194.117.124.106 - 194.117.124.106 gb -194.117.124.107 - 194.117.124.107 ch -194.117.124.108 - 194.117.124.109 de -194.117.124.110 - 194.117.124.111 gb -194.117.124.112 - 194.117.124.112 de -194.117.124.113 - 194.117.124.113 ch -194.117.124.114 - 194.117.124.114 be -194.117.124.115 - 194.117.124.115 ch -194.117.124.116 - 194.117.124.116 gb -194.117.124.117 - 194.117.124.117 be -194.117.124.118 - 194.117.124.118 it -194.117.124.119 - 194.117.124.120 de -194.117.124.121 - 194.117.124.121 li -194.117.124.122 - 194.117.124.122 it -194.117.124.123 - 194.117.124.123 de -194.117.124.124 - 194.117.124.124 at -194.117.124.125 - 194.117.124.129 de -194.117.124.130 - 194.117.124.130 it -194.117.124.131 - 194.117.124.132 de -194.117.124.133 - 194.117.124.133 ch -194.117.124.134 - 194.117.124.134 de -194.117.124.135 - 194.117.124.135 be -194.117.124.136 - 194.117.124.138 de -194.117.124.139 - 194.117.124.139 es -194.117.124.140 - 194.117.124.142 it -194.117.124.143 - 194.117.124.143 de -194.117.124.144 - 194.117.124.144 gb -194.117.124.145 - 194.117.124.147 de -194.117.124.148 - 194.117.124.148 hu -194.117.124.149 - 194.117.124.149 fr -194.117.124.150 - 194.117.124.153 de -194.117.124.154 - 194.117.124.154 fr -194.117.124.155 - 194.117.124.155 es -194.117.124.156 - 194.117.124.157 de -194.117.124.158 - 194.117.124.158 gb -194.117.124.159 - 194.117.124.159 gr -194.117.124.160 - 194.117.124.161 de -194.117.124.162 - 194.117.124.162 ch -194.117.124.163 - 194.117.124.166 de -194.117.124.167 - 194.117.124.168 nl -194.117.124.169 - 194.117.124.169 de -194.117.124.170 - 194.117.124.170 be -194.117.124.171 - 194.117.124.175 de -194.117.124.176 - 194.117.124.176 gb -194.117.124.177 - 194.117.124.178 de -194.117.124.179 - 194.117.124.179 it -194.117.124.180 - 194.117.124.180 de -194.117.124.181 - 194.117.124.181 ch -194.117.124.182 - 194.117.124.183 de -194.117.124.184 - 194.117.124.184 it -194.117.124.185 - 194.117.124.185 be -194.117.124.186 - 194.117.124.186 gb -194.117.124.187 - 194.117.124.187 at -194.117.124.188 - 194.117.124.188 ch -194.117.124.189 - 194.117.124.189 it -194.117.124.190 - 194.117.124.192 de -194.117.124.193 - 194.117.124.193 il -194.117.124.194 - 194.117.124.194 dk -194.117.124.195 - 194.117.124.195 fr -194.117.124.196 - 194.117.124.196 ie -194.117.124.197 - 194.117.124.198 de -194.117.124.199 - 194.117.124.199 se -194.117.124.200 - 194.117.124.200 de -194.117.124.201 - 194.117.124.201 be -194.117.124.202 - 194.117.124.202 gb -194.117.124.203 - 194.117.124.203 de -194.117.124.204 - 194.117.124.204 gb -194.117.124.205 - 194.117.124.205 se -194.117.124.206 - 194.117.124.206 nl -194.117.124.207 - 194.117.124.207 ch -194.117.124.208 - 194.117.124.208 no -194.117.124.209 - 194.117.124.213 de -194.117.124.214 - 194.117.124.214 ch -194.117.124.215 - 194.117.124.215 de -194.117.124.216 - 194.117.124.216 nl -194.117.124.217 - 194.117.124.217 fr -194.117.124.218 - 194.117.124.218 de -194.117.124.219 - 194.117.124.219 za -194.117.124.220 - 194.117.124.220 de -194.117.124.221 - 194.117.124.221 it -194.117.124.222 - 194.117.124.223 de -194.117.124.224 - 194.117.124.224 nl -194.117.124.225 - 194.117.124.225 de -194.117.124.226 - 194.117.124.226 gr -194.117.124.227 - 194.117.124.228 de -194.117.124.229 - 194.117.124.229 it -194.117.124.230 - 194.117.124.230 gb -194.117.124.231 - 194.117.124.231 nl -194.117.124.232 - 194.117.124.232 de -194.117.124.233 - 194.117.124.233 fr -194.117.124.234 - 194.117.124.234 de -194.117.124.235 - 194.117.124.236 fr -194.117.124.237 - 194.117.124.238 de -194.117.124.239 - 194.117.124.240 it -194.117.124.241 - 194.117.124.241 de -194.117.124.242 - 194.117.124.242 gb -194.117.124.243 - 194.117.124.244 de -194.117.124.245 - 194.117.124.245 se -194.117.124.246 - 194.117.124.246 fr -194.117.124.247 - 194.117.124.247 nl -194.117.124.248 - 194.117.124.249 de -194.117.124.250 - 194.117.124.250 si -194.117.124.251 - 194.117.124.251 de -194.117.124.252 - 194.117.124.252 es -194.117.124.253 - 194.117.124.253 nl -194.117.124.254 - 194.117.125.1 de -194.117.125.2 - 194.117.125.2 no -194.117.125.3 - 194.117.125.3 es -194.117.125.4 - 194.117.125.4 gb -194.117.125.5 - 194.117.125.6 de -194.117.125.7 - 194.117.125.7 ch -194.117.125.8 - 194.117.125.8 es -194.117.125.9 - 194.117.125.9 nl -194.117.125.10 - 194.117.125.10 at -194.117.125.11 - 194.117.125.12 de -194.117.125.13 - 194.117.125.13 si -194.117.125.14 - 194.117.125.14 nl -194.117.125.15 - 194.117.125.15 hu -194.117.125.16 - 194.117.125.16 de -194.117.125.17 - 194.117.125.17 lu -194.117.125.18 - 194.117.125.18 de -194.117.125.19 - 194.117.125.20 gb -194.117.125.21 - 194.117.125.21 es -194.117.125.22 - 194.117.125.22 de -194.117.125.23 - 194.117.125.23 at -194.117.125.24 - 194.117.125.24 fr -194.117.125.25 - 194.117.125.25 it -194.117.125.26 - 194.117.125.26 gb -194.117.125.27 - 194.117.125.27 de -194.117.125.28 - 194.117.125.28 nl -194.117.125.29 - 194.117.125.29 de -194.117.125.30 - 194.117.125.30 gb -194.117.125.31 - 194.117.125.31 de -194.117.125.32 - 194.117.125.32 no -194.117.125.33 - 194.117.125.37 de -194.117.125.38 - 194.117.125.38 es +194.117.123.221 - 194.117.124.67 de +194.117.124.68 - 194.117.124.68 fr +194.117.124.69 - 194.117.125.38 de 194.117.125.39 - 194.117.125.39 nl -194.117.125.40 - 194.117.125.40 ch -194.117.125.41 - 194.117.125.41 nl -194.117.125.42 - 194.117.125.42 de -194.117.125.43 - 194.117.125.43 nl -194.117.125.44 - 194.117.125.44 pt -194.117.125.45 - 194.117.125.46 fr -194.117.125.47 - 194.117.125.48 de -194.117.125.49 - 194.117.125.49 dk -194.117.125.50 - 194.117.125.51 de -194.117.125.52 - 194.117.125.52 nl -194.117.125.53 - 194.117.125.53 it -194.117.125.54 - 194.117.125.54 dk -194.117.125.55 - 194.117.125.55 it -194.117.125.56 - 194.117.125.57 de -194.117.125.58 - 194.117.125.58 be -194.117.125.59 - 194.117.125.60 de -194.117.125.61 - 194.117.125.61 es -194.117.125.62 - 194.117.125.62 it -194.117.125.63 - 194.117.125.63 at -194.117.125.64 - 194.117.125.64 it -194.117.125.65 - 194.117.125.65 de -194.117.125.66 - 194.117.125.66 it -194.117.125.67 - 194.117.125.67 hu -194.117.125.68 - 194.117.125.69 de -194.117.125.70 - 194.117.125.71 fr -194.117.125.72 - 194.117.125.72 de -194.117.125.73 - 194.117.125.73 nl -194.117.125.74 - 194.117.125.74 lu -194.117.125.75 - 194.117.125.75 de -194.117.125.76 - 194.117.125.76 lu -194.117.125.77 - 194.117.125.77 de -194.117.125.78 - 194.117.125.78 ch -194.117.125.79 - 194.117.125.79 es -194.117.125.80 - 194.117.125.80 ch -194.117.125.81 - 194.117.125.81 gb -194.117.125.82 - 194.117.125.82 fr -194.117.125.83 - 194.117.125.85 nl -194.117.125.86 - 194.117.125.86 at -194.117.125.87 - 194.117.125.87 fr -194.117.125.88 - 194.117.125.91 de -194.117.125.92 - 194.117.125.92 ch -194.117.125.93 - 194.117.125.93 nl -194.117.125.94 - 194.117.125.95 de -194.117.125.96 - 194.117.125.96 gb -194.117.125.97 - 194.117.125.97 de -194.117.125.98 - 194.117.125.98 at -194.117.125.99 - 194.117.125.99 es -194.117.125.100 - 194.117.125.100 de -194.117.125.101 - 194.117.125.101 be -194.117.125.102 - 194.117.125.104 de -194.117.125.105 - 194.117.125.105 at -194.117.125.106 - 194.117.125.108 de -194.117.125.109 - 194.117.125.109 at -194.117.125.110 - 194.117.125.111 de -194.117.125.112 - 194.117.125.112 be -194.117.125.113 - 194.117.125.114 es -194.117.125.115 - 194.117.125.115 ch -194.117.125.116 - 194.117.125.116 it -194.117.125.117 - 194.117.125.118 de -194.117.125.119 - 194.117.125.120 ch -194.117.125.121 - 194.117.125.121 de -194.117.125.122 - 194.117.125.122 at -194.117.125.123 - 194.117.125.123 dk -194.117.125.124 - 194.117.125.124 de -194.117.125.125 - 194.117.125.125 nl -194.117.125.126 - 194.117.125.126 fr -194.117.125.127 - 194.117.125.129 de -194.117.125.130 - 194.117.125.130 gb -194.117.125.131 - 194.117.125.131 ch -194.117.125.132 - 194.117.125.132 de -194.117.125.133 - 194.117.125.133 fr -194.117.125.134 - 194.117.125.134 at -194.117.125.135 - 194.117.125.135 de -194.117.125.136 - 194.117.125.136 ch -194.117.125.137 - 194.117.125.137 de -194.117.125.138 - 194.117.125.138 fr -194.117.125.139 - 194.117.125.139 nl -194.117.125.140 - 194.117.125.140 fr -194.117.125.141 - 194.117.125.141 se -194.117.125.142 - 194.117.125.146 de -194.117.125.147 - 194.117.125.147 no -194.117.125.148 - 194.117.125.148 fr -194.117.125.149 - 194.117.125.149 de -194.117.125.150 - 194.117.125.150 ch -194.117.125.151 - 194.117.125.154 de -194.117.125.155 - 194.117.125.155 it -194.117.125.156 - 194.117.125.159 de -194.117.125.160 - 194.117.125.160 it -194.117.125.161 - 194.117.125.161 be -194.117.125.162 - 194.117.125.162 nl -194.117.125.163 - 194.117.125.166 de -194.117.125.167 - 194.117.125.167 gb -194.117.125.168 - 194.117.125.168 at -194.117.125.169 - 194.117.125.169 fr -194.117.125.170 - 194.117.125.170 ch -194.117.125.171 - 194.117.125.172 de -194.117.125.173 - 194.117.125.173 it -194.117.125.174 - 194.117.125.174 de -194.117.125.175 - 194.117.125.176 it -194.117.125.177 - 194.117.125.177 de -194.117.125.178 - 194.117.125.178 fr -194.117.125.179 - 194.117.125.179 ch -194.117.125.180 - 194.117.125.181 at -194.117.125.182 - 194.117.125.183 gb -194.117.125.184 - 194.117.125.192 de -194.117.125.193 - 194.117.125.193 fr -194.117.125.194 - 194.117.125.194 nl -194.117.125.195 - 194.117.125.195 es -194.117.125.196 - 194.117.125.200 de -194.117.125.201 - 194.117.125.201 hu -194.117.125.202 - 194.117.125.202 de -194.117.125.203 - 194.117.125.203 nl -194.117.125.204 - 194.117.125.204 de -194.117.125.205 - 194.117.125.206 nl -194.117.125.207 - 194.117.125.207 es -194.117.125.208 - 194.117.125.208 gb -194.117.125.209 - 194.117.125.209 de -194.117.125.210 - 194.117.125.210 be -194.117.125.211 - 194.117.125.211 de -194.117.125.212 - 194.117.125.213 ch -194.117.125.214 - 194.117.125.214 gb -194.117.125.215 - 194.117.125.216 de -194.117.125.217 - 194.117.125.217 es -194.117.125.218 - 194.117.125.218 de -194.117.125.219 - 194.117.125.219 at -194.117.125.220 - 194.117.125.220 nl -194.117.125.221 - 194.117.125.221 hu -194.117.125.222 - 194.117.125.222 ch -194.117.125.223 - 194.117.125.223 nl -194.117.125.224 - 194.117.125.224 de -194.117.125.225 - 194.117.125.225 fr -194.117.125.226 - 194.117.125.226 dk -194.117.125.227 - 194.117.125.227 gb -194.117.125.228 - 194.117.125.228 de -194.117.125.229 - 194.117.125.229 ch -194.117.125.230 - 194.117.125.230 de -194.117.125.231 - 194.117.125.231 lu -194.117.125.232 - 194.117.125.236 de -194.117.125.237 - 194.117.125.237 is -194.117.125.238 - 194.117.125.239 de -194.117.125.240 - 194.117.125.240 ch -194.117.125.241 - 194.117.125.243 de -194.117.125.244 - 194.117.125.244 nl -194.117.125.245 - 194.117.125.245 no -194.117.125.246 - 194.117.125.246 be -194.117.125.247 - 194.117.125.247 nl -194.117.125.248 - 194.117.125.248 de -194.117.125.249 - 194.117.125.249 fr -194.117.125.250 - 194.117.125.250 de -194.117.125.251 - 194.117.125.251 se -194.117.125.252 - 194.117.125.252 de -194.117.125.253 - 194.117.125.253 gb -194.117.125.254 - 194.117.126.1 de -194.117.126.2 - 194.117.126.3 fr -194.117.126.4 - 194.117.126.4 de -194.117.126.5 - 194.117.126.5 ch -194.117.126.6 - 194.117.126.7 de -194.117.126.8 - 194.117.126.8 at -194.117.126.9 - 194.117.126.9 hu -194.117.126.10 - 194.117.126.11 de -194.117.126.12 - 194.117.126.12 gb -194.117.126.13 - 194.117.126.14 de -194.117.126.15 - 194.117.126.15 gr -194.117.126.16 - 194.117.126.16 fr -194.117.126.17 - 194.117.126.17 nl -194.117.126.18 - 194.117.126.20 de -194.117.126.21 - 194.117.126.21 lu -194.117.126.22 - 194.117.126.22 ch -194.117.126.23 - 194.117.126.24 es -194.117.126.25 - 194.117.126.27 de -194.117.126.28 - 194.117.126.28 nl -194.117.126.29 - 194.117.126.29 at -194.117.126.30 - 194.117.126.30 de -194.117.126.31 - 194.117.126.31 ch -194.117.126.32 - 194.117.126.36 de -194.117.126.37 - 194.117.126.37 se -194.117.126.38 - 194.117.126.42 de -194.117.126.43 - 194.117.126.43 fr -194.117.126.44 - 194.117.126.45 de -194.117.126.46 - 194.117.126.46 gb -194.117.126.47 - 194.117.126.50 de -194.117.126.51 - 194.117.126.51 at -194.117.126.52 - 194.117.126.57 de -194.117.126.58 - 194.117.126.58 it -194.117.126.59 - 194.117.126.59 dk -194.117.126.60 - 194.117.126.60 de -194.117.126.61 - 194.117.126.61 nl -194.117.126.62 - 194.117.126.63 de -194.117.126.64 - 194.117.126.64 be -194.117.126.65 - 194.117.126.65 fr -194.117.126.66 - 194.117.126.67 de -194.117.126.68 - 194.117.126.68 es -194.117.126.69 - 194.117.126.69 it -194.117.126.70 - 194.117.126.72 de -194.117.126.73 - 194.117.126.73 fr -194.117.126.74 - 194.117.126.74 de -194.117.126.75 - 194.117.126.75 hu -194.117.126.76 - 194.117.126.76 de -194.117.126.77 - 194.117.126.77 nl -194.117.126.78 - 194.117.126.78 ch -194.117.126.79 - 194.117.126.81 de -194.117.126.82 - 194.117.126.82 ch -194.117.126.83 - 194.117.126.83 de -194.117.126.84 - 194.117.126.84 it -194.117.126.85 - 194.117.126.85 be -194.117.126.86 - 194.117.126.87 de -194.117.126.88 - 194.117.126.88 at -194.117.126.89 - 194.117.126.89 de -194.117.126.90 - 194.117.126.90 gb -194.117.126.91 - 194.117.126.91 es -194.117.126.92 - 194.117.126.92 de -194.117.126.93 - 194.117.126.93 es -194.117.126.94 - 194.117.126.102 de -194.117.126.103 - 194.117.126.103 fr -194.117.126.104 - 194.117.126.104 nl -194.117.126.105 - 194.117.126.106 de -194.117.126.107 - 194.117.126.107 ch -194.117.126.108 - 194.117.126.108 at -194.117.126.109 - 194.117.126.112 de -194.117.126.113 - 194.117.126.113 ch -194.117.126.114 - 194.117.126.115 de -194.117.126.116 - 194.117.126.116 fr -194.117.126.117 - 194.117.126.117 de -194.117.126.118 - 194.117.126.118 nl -194.117.126.119 - 194.117.126.123 de -194.117.126.124 - 194.117.126.124 nl -194.117.126.125 - 194.117.126.129 de -194.117.126.130 - 194.117.126.130 be -194.117.126.131 - 194.117.126.133 de -194.117.126.134 - 194.117.126.134 fr -194.117.126.135 - 194.117.126.137 de -194.117.126.138 - 194.117.126.138 fr -194.117.126.139 - 194.117.126.139 be -194.117.126.140 - 194.117.126.140 nl -194.117.126.141 - 194.117.126.143 de -194.117.126.144 - 194.117.126.144 es -194.117.126.145 - 194.117.126.146 de -194.117.126.147 - 194.117.126.147 be -194.117.126.148 - 194.117.126.148 de -194.117.126.149 - 194.117.126.149 dk -194.117.126.150 - 194.117.126.150 ch -194.117.126.151 - 194.117.126.157 de -194.117.126.158 - 194.117.126.158 gb -194.117.126.159 - 194.117.126.159 de -194.117.126.160 - 194.117.126.160 ch -194.117.126.161 - 194.117.126.161 gb -194.117.126.162 - 194.117.126.162 de -194.117.126.163 - 194.117.126.163 lu -194.117.126.164 - 194.117.126.165 de -194.117.126.166 - 194.117.126.166 nl -194.117.126.167 - 194.117.126.167 ch -194.117.126.168 - 194.117.126.168 de -194.117.126.169 - 194.117.126.169 at -194.117.126.170 - 194.117.126.170 de -194.117.126.171 - 194.117.126.171 gb -194.117.126.172 - 194.117.126.172 rs -194.117.126.173 - 194.117.126.173 gb -194.117.126.174 - 194.117.126.176 de -194.117.126.177 - 194.117.126.177 lu -194.117.126.178 - 194.117.126.179 de -194.117.126.180 - 194.117.126.180 nl -194.117.126.181 - 194.117.126.185 de -194.117.126.186 - 194.117.126.186 nl -194.117.126.187 - 194.117.126.187 ch -194.117.126.188 - 194.117.126.188 de -194.117.126.189 - 194.117.126.190 gb -194.117.126.191 - 194.117.126.191 si -194.117.126.192 - 194.117.126.194 de -194.117.126.195 - 194.117.126.195 nl -194.117.126.196 - 194.117.126.199 de -194.117.126.200 - 194.117.126.200 it -194.117.126.201 - 194.117.126.201 de -194.117.126.202 - 194.117.126.202 at -194.117.126.203 - 194.117.126.204 de -194.117.126.205 - 194.117.126.206 fr -194.117.126.207 - 194.117.126.208 de -194.117.126.209 - 194.117.126.209 ch -194.117.126.210 - 194.117.126.210 de -194.117.126.211 - 194.117.126.211 no -194.117.126.212 - 194.117.126.212 it -194.117.126.213 - 194.117.126.213 fr -194.117.126.214 - 194.117.126.215 de -194.117.126.216 - 194.117.126.216 fr -194.117.126.217 - 194.117.126.217 nl -194.117.126.218 - 194.117.126.218 ch -194.117.126.219 - 194.117.126.220 de -194.117.126.221 - 194.117.126.221 be -194.117.126.222 - 194.117.126.222 de -194.117.126.223 - 194.117.126.223 at -194.117.126.224 - 194.117.126.225 de -194.117.126.226 - 194.117.126.226 gb -194.117.126.227 - 194.117.126.232 de -194.117.126.233 - 194.117.126.233 it -194.117.126.234 - 194.117.126.234 de -194.117.126.235 - 194.117.126.235 dk -194.117.126.236 - 194.117.126.237 de -194.117.126.238 - 194.117.126.238 gb -194.117.126.239 - 194.117.126.239 at -194.117.126.240 - 194.117.126.240 be -194.117.126.241 - 194.117.126.241 de -194.117.126.242 - 194.117.126.242 it -194.117.126.243 - 194.117.126.244 de -194.117.126.245 - 194.117.126.245 be -194.117.126.246 - 194.117.126.253 de -194.117.126.254 - 194.117.126.254 es -194.117.126.255 - 194.117.127.5 de -194.117.127.6 - 194.117.127.6 at -194.117.127.7 - 194.117.127.7 nl -194.117.127.8 - 194.117.127.8 fr -194.117.127.9 - 194.117.127.11 de -194.117.127.12 - 194.117.127.12 fr -194.117.127.13 - 194.117.127.13 at -194.117.127.14 - 194.117.127.18 de -194.117.127.19 - 194.117.127.19 it -194.117.127.20 - 194.117.127.20 gb -194.117.127.21 - 194.117.127.22 de -194.117.127.23 - 194.117.127.23 gb -194.117.127.24 - 194.117.127.26 de -194.117.127.27 - 194.117.127.27 es -194.117.127.28 - 194.117.127.30 de -194.117.127.31 - 194.117.127.31 it -194.117.127.32 - 194.117.127.33 de -194.117.127.34 - 194.117.127.34 no -194.117.127.35 - 194.117.127.36 de -194.117.127.37 - 194.117.127.37 fr -194.117.127.38 - 194.117.127.44 de -194.117.127.45 - 194.117.127.45 nl -194.117.127.46 - 194.117.127.46 de -194.117.127.47 - 194.117.127.47 nl -194.117.127.48 - 194.117.127.48 de -194.117.127.49 - 194.117.127.49 ch -194.117.127.50 - 194.117.127.50 it -194.117.127.51 - 194.117.127.51 de -194.117.127.52 - 194.117.127.52 fr -194.117.127.53 - 194.117.127.53 es -194.117.127.54 - 194.117.127.54 de -194.117.127.55 - 194.117.127.55 se -194.117.127.56 - 194.117.127.56 de -194.117.127.57 - 194.117.127.57 fr -194.117.127.58 - 194.117.127.58 pt -194.117.127.59 - 194.117.127.59 de -194.117.127.60 - 194.117.127.60 fi -194.117.127.61 - 194.117.127.61 ch -194.117.127.62 - 194.117.127.62 de -194.117.127.63 - 194.117.127.63 no -194.117.127.64 - 194.117.127.65 de -194.117.127.66 - 194.117.127.66 nl -194.117.127.67 - 194.117.127.67 gb -194.117.127.68 - 194.117.127.69 de -194.117.127.70 - 194.117.127.70 nl -194.117.127.71 - 194.117.127.71 gb -194.117.127.72 - 194.117.127.73 de -194.117.127.74 - 194.117.127.74 gb -194.117.127.75 - 194.117.127.77 de -194.117.127.78 - 194.117.127.78 ch -194.117.127.79 - 194.117.127.84 de -194.117.127.85 - 194.117.127.85 fr -194.117.127.86 - 194.117.127.87 de -194.117.127.88 - 194.117.127.88 hu -194.117.127.89 - 194.117.127.90 de -194.117.127.91 - 194.117.127.91 es -194.117.127.92 - 194.117.127.92 nl -194.117.127.93 - 194.117.127.93 be -194.117.127.94 - 194.117.127.98 de -194.117.127.99 - 194.117.127.99 ie -194.117.127.100 - 194.117.127.101 de -194.117.127.102 - 194.117.127.102 se -194.117.127.103 - 194.117.127.104 de -194.117.127.105 - 194.117.127.105 se -194.117.127.106 - 194.117.127.106 de -194.117.127.107 - 194.117.127.107 hu -194.117.127.108 - 194.117.127.108 de -194.117.127.109 - 194.117.127.109 pl -194.117.127.110 - 194.117.127.110 de -194.117.127.111 - 194.117.127.111 nl -194.117.127.112 - 194.117.127.115 de -194.117.127.116 - 194.117.127.116 ch -194.117.127.117 - 194.117.127.118 de -194.117.127.119 - 194.117.127.119 nl -194.117.127.120 - 194.117.127.120 de -194.117.127.121 - 194.117.127.121 nl -194.117.127.122 - 194.117.127.122 de -194.117.127.123 - 194.117.127.123 nl -194.117.127.124 - 194.117.127.125 de -194.117.127.126 - 194.117.127.126 ch -194.117.127.127 - 194.117.127.132 de -194.117.127.133 - 194.117.127.133 be -194.117.127.134 - 194.117.127.136 de -194.117.127.137 - 194.117.127.137 gb -194.117.127.138 - 194.117.127.139 de -194.117.127.140 - 194.117.127.140 fr -194.117.127.141 - 194.117.127.141 nl -194.117.127.142 - 194.117.127.142 de -194.117.127.143 - 194.117.127.143 ch -194.117.127.144 - 194.117.127.144 dk -194.117.127.145 - 194.117.127.145 de -194.117.127.146 - 194.117.127.146 it -194.117.127.147 - 194.117.127.147 be -194.117.127.148 - 194.117.127.148 es -194.117.127.149 - 194.117.127.149 de -194.117.127.150 - 194.117.127.150 ch -194.117.127.151 - 194.117.127.154 de +194.117.125.40 - 194.117.125.255 de +194.117.126.0 - 194.117.126.255 eu +194.117.127.0 - 194.117.127.154 de 194.117.127.155 - 194.117.127.155 gb -194.117.127.156 - 194.117.127.157 de -194.117.127.158 - 194.117.127.158 ch -194.117.127.159 - 194.117.127.165 de -194.117.127.166 - 194.117.127.166 fr -194.117.127.167 - 194.117.127.167 ch -194.117.127.168 - 194.117.127.168 no -194.117.127.169 - 194.117.127.172 de -194.117.127.173 - 194.117.127.173 lu -194.117.127.174 - 194.117.127.174 de -194.117.127.175 - 194.117.127.176 it -194.117.127.177 - 194.117.127.177 de -194.117.127.178 - 194.117.127.178 at -194.117.127.179 - 194.117.127.183 de -194.117.127.184 - 194.117.127.184 nl -194.117.127.185 - 194.117.127.185 fr -194.117.127.186 - 194.117.127.186 nl -194.117.127.187 - 194.117.127.187 de -194.117.127.188 - 194.117.127.188 it -194.117.127.189 - 194.117.127.189 nl +194.117.127.156 - 194.117.127.189 de 194.117.127.190 - 194.117.127.190 it -194.117.127.191 - 194.117.127.191 at -194.117.127.192 - 194.117.127.192 dk -194.117.127.193 - 194.117.127.193 de -194.117.127.194 - 194.117.127.194 gb -194.117.127.195 - 194.117.127.196 de -194.117.127.197 - 194.117.127.197 es -194.117.127.198 - 194.117.127.201 de -194.117.127.202 - 194.117.127.202 fr -194.117.127.203 - 194.117.127.203 it -194.117.127.204 - 194.117.127.204 de -194.117.127.205 - 194.117.127.205 ch -194.117.127.206 - 194.117.127.206 de -194.117.127.207 - 194.117.127.207 gb -194.117.127.208 - 194.117.127.208 de -194.117.127.209 - 194.117.127.209 nl -194.117.127.210 - 194.117.127.212 de -194.117.127.213 - 194.117.127.213 ch -194.117.127.214 - 194.117.127.214 de -194.117.127.215 - 194.117.127.215 dk -194.117.127.216 - 194.117.127.216 de -194.117.127.217 - 194.117.127.217 ch -194.117.127.218 - 194.117.127.218 de -194.117.127.219 - 194.117.127.219 nl -194.117.127.220 - 194.117.127.220 is -194.117.127.221 - 194.117.127.221 at -194.117.127.222 - 194.117.127.224 de -194.117.127.225 - 194.117.127.225 ch -194.117.127.226 - 194.117.127.226 de -194.117.127.227 - 194.117.127.227 gb -194.117.127.228 - 194.117.127.228 de -194.117.127.229 - 194.117.127.229 gb -194.117.127.230 - 194.117.127.231 ch -194.117.127.232 - 194.117.127.235 de -194.117.127.236 - 194.117.127.236 es -194.117.127.237 - 194.117.127.237 de -194.117.127.238 - 194.117.127.238 at -194.117.127.239 - 194.117.127.239 de -194.117.127.240 - 194.117.127.240 gb -194.117.127.241 - 194.117.127.241 fr -194.117.127.242 - 194.117.127.242 es -194.117.127.243 - 194.117.127.243 gb -194.117.127.244 - 194.117.127.244 de -194.117.127.245 - 194.117.127.245 at -194.117.127.246 - 194.117.127.246 es -194.117.127.247 - 194.117.127.247 nl -194.117.127.248 - 194.117.127.248 de -194.117.127.249 - 194.117.127.250 it -194.117.127.251 - 194.117.127.251 ch -194.117.127.252 - 194.117.127.252 gb -194.117.127.253 - 194.117.127.253 it -194.117.127.254 - 194.117.127.254 es -194.117.127.255 - 194.117.127.255 de +194.117.127.191 - 194.117.127.255 de 194.117.128.0 - 194.117.159.255 gb 194.117.160.0 - 194.117.191.255 se 194.117.192.0 - 194.117.223.255 fr -194.117.224.0 - 194.117.225.255 de 194.117.226.0 - 194.117.227.255 gb 194.117.228.0 - 194.117.229.255 pl 194.117.230.0 - 194.117.231.255 ro 194.117.232.0 - 194.117.233.255 dk -194.117.234.0 - 194.117.239.255 ro +194.117.234.0 - 194.117.235.255 vg +194.117.236.0 - 194.117.237.255 ro 194.117.240.0 - 194.117.241.255 pl 194.117.242.0 - 194.117.243.255 ro 194.117.244.0 - 194.117.247.255 fr 194.117.248.0 - 194.117.249.255 gb -194.117.250.0 - 194.117.251.255 de 194.117.252.0 - 194.117.253.255 ua 194.117.254.0 - 194.117.255.255 de 194.118.0.0 - 194.118.255.255 at @@ -100659,166 +86637,71 @@ 194.119.192.0 - 194.119.223.255 it 194.119.224.0 - 194.119.255.255 be 194.120.0.0 - 194.120.15.255 nl -194.120.16.0 - 194.120.17.255 de -194.120.18.0 - 194.120.21.255 nl -194.120.22.0 - 194.120.24.255 de -194.120.25.0 - 194.120.39.255 nl +194.120.16.0 - 194.120.16.255 eu +194.120.17.0 - 194.120.22.255 nl +194.120.23.0 - 194.120.23.255 de +194.120.24.0 - 194.120.39.255 nl 194.120.40.0 - 194.120.40.255 de -194.120.41.0 - 194.120.42.255 nl -194.120.43.0 - 194.120.43.255 de -194.120.44.0 - 194.120.54.255 nl -194.120.55.0 - 194.120.55.255 de -194.120.56.0 - 194.120.65.255 nl -194.120.66.0 - 194.120.66.255 de -194.120.67.0 - 194.120.79.255 nl -194.120.80.0 - 194.120.105.255 de -194.120.106.0 - 194.120.108.255 nl -194.120.109.0 - 194.120.111.255 de -194.120.112.0 - 194.120.115.255 nl -194.120.116.0 - 194.120.116.255 de -194.120.117.0 - 194.120.118.255 nl -194.120.119.0 - 194.120.119.255 de -194.120.120.0 - 194.120.125.255 nl -194.120.126.0 - 194.120.126.255 de -194.120.127.0 - 194.120.132.255 nl -194.120.133.0 - 194.120.133.255 de -194.120.134.0 - 194.120.143.255 nl -194.120.144.0 - 194.120.144.255 de -194.120.145.0 - 194.120.149.255 nl -194.120.150.0 - 194.120.150.255 de -194.120.151.0 - 194.120.162.255 nl -194.120.163.0 - 194.120.164.255 de -194.120.165.0 - 194.120.169.255 nl -194.120.170.0 - 194.120.171.255 de -194.120.172.0 - 194.120.172.255 nl -194.120.173.0 - 194.120.173.255 de -194.120.174.0 - 194.120.181.255 nl +194.120.41.0 - 194.120.79.255 nl +194.120.80.0 - 194.120.83.255 de +194.120.84.0 - 194.120.84.8 eu +194.120.84.9 - 194.120.84.9 ch +194.120.84.10 - 194.120.84.255 eu +194.120.85.0 - 194.120.87.255 de +194.120.88.0 - 194.120.88.255 eu +194.120.89.0 - 194.120.103.255 de +194.120.104.0 - 194.120.181.255 nl 194.120.182.0 - 194.120.184.255 de -194.120.185.0 - 194.120.188.255 nl -194.120.189.0 - 194.120.189.255 de -194.120.190.0 - 194.120.191.255 nl +194.120.185.0 - 194.120.191.255 nl 194.120.192.0 - 194.120.223.255 de -194.120.224.0 - 194.120.229.255 nl -194.120.230.0 - 194.120.231.255 de -194.120.232.0 - 194.120.233.255 nl -194.120.234.0 - 194.120.234.255 de -194.120.235.0 - 194.120.248.95 nl -194.120.248.96 - 194.120.248.127 de -194.120.248.128 - 194.120.248.255 nl -194.120.249.0 - 194.120.249.255 de -194.120.250.0 - 194.120.255.255 nl -194.121.0.0 - 194.121.0.255 de -194.121.1.0 - 194.121.1.255 nl -194.121.2.0 - 194.121.2.255 de -194.121.3.0 - 194.121.10.255 nl -194.121.11.0 - 194.121.11.255 de -194.121.12.0 - 194.121.20.255 nl -194.121.21.0 - 194.121.21.255 de -194.121.22.0 - 194.121.25.255 nl -194.121.26.0 - 194.121.26.255 de -194.121.27.0 - 194.121.45.255 nl -194.121.46.0 - 194.121.46.255 de -194.121.47.0 - 194.121.47.255 nl -194.121.48.0 - 194.121.51.255 de -194.121.52.0 - 194.121.55.255 nl -194.121.56.0 - 194.121.56.255 de -194.121.57.0 - 194.121.58.255 nl -194.121.59.0 - 194.121.59.255 de -194.121.60.0 - 194.121.61.255 nl -194.121.62.0 - 194.121.63.255 de -194.121.64.0 - 194.121.65.255 nl -194.121.66.0 - 194.121.66.255 de -194.121.67.0 - 194.121.89.255 nl -194.121.90.0 - 194.121.90.255 de -194.121.91.0 - 194.121.103.255 nl -194.121.104.0 - 194.121.105.255 de -194.121.106.0 - 194.121.122.255 nl -194.121.123.0 - 194.121.123.255 de -194.121.124.0 - 194.121.171.255 nl +194.120.224.0 - 194.121.50.255 nl +194.121.51.0 - 194.121.51.255 de +194.121.52.0 - 194.121.171.255 nl 194.121.172.0 - 194.121.175.255 de -194.121.176.0 - 194.121.202.255 nl -194.121.203.0 - 194.121.203.255 de -194.121.204.0 - 194.121.219.255 nl -194.121.220.0 - 194.121.220.7 de -194.121.220.8 - 194.121.253.255 nl -194.121.254.0 - 194.121.255.255 de -194.122.0.0 - 194.122.76.63 nl -194.122.76.64 - 194.122.76.255 de -194.122.77.0 - 194.122.83.255 nl -194.122.84.0 - 194.122.84.255 de -194.122.85.0 - 194.122.130.255 nl -194.122.131.0 - 194.122.131.255 de -194.122.132.0 - 194.122.223.255 nl +194.121.176.0 - 194.122.223.255 nl 194.122.224.0 - 194.122.253.255 de -194.122.254.0 - 194.123.7.0 nl -194.123.7.1 - 194.123.7.1 de -194.123.7.2 - 194.123.121.255 nl -194.123.122.0 - 194.123.122.63 de -194.123.122.64 - 194.123.122.95 nl -194.123.122.96 - 194.123.122.127 de -194.123.122.128 - 194.123.122.191 nl -194.123.122.192 - 194.123.122.207 de -194.123.122.208 - 194.123.122.211 nl -194.123.122.212 - 194.123.122.215 de -194.123.122.216 - 194.123.122.243 nl -194.123.122.244 - 194.123.122.244 de -194.123.122.245 - 194.123.122.245 nl -194.123.122.246 - 194.123.122.249 de -194.123.122.250 - 194.123.163.255 nl -194.123.164.0 - 194.123.164.255 de -194.123.165.0 - 194.123.255.255 nl -194.124.0.0 - 194.124.228.255 ch +194.122.254.0 - 194.123.255.255 nl +194.124.0.0 - 194.124.187.255 ch +194.124.188.0 - 194.124.191.255 li +194.124.192.0 - 194.124.227.255 ch 194.124.229.0 - 194.124.229.255 de 194.124.230.0 - 194.124.255.255 ch 194.125.0.0 - 194.125.223.255 ie 194.125.224.0 - 194.125.227.255 ua -194.125.228.0 - 194.125.231.255 gb 194.125.232.0 - 194.125.235.255 tr 194.125.236.0 - 194.125.239.255 ru 194.125.240.0 - 194.125.241.255 lv 194.125.242.0 - 194.125.243.255 it 194.125.244.0 - 194.125.245.255 ua 194.125.246.0 - 194.125.247.255 gb -194.125.248.0 - 194.125.249.255 ua -194.125.250.0 - 194.125.251.255 ch 194.125.252.0 - 194.125.253.255 gr 194.125.254.0 - 194.125.255.255 ru 194.126.0.0 - 194.126.31.255 lb -194.126.32.0 - 194.126.36.191 kw -194.126.36.192 - 194.126.36.255 iq -194.126.37.0 - 194.126.40.255 kw -194.126.41.0 - 194.126.41.255 lb -194.126.42.0 - 194.126.63.255 kw +194.126.32.0 - 194.126.63.255 kw 194.126.64.0 - 194.126.95.255 gb 194.126.96.0 - 194.126.127.255 ee 194.126.128.0 - 194.126.129.255 fr 194.126.130.0 - 194.126.130.255 nl -194.126.131.0 - 194.126.132.255 de -194.126.133.0 - 194.126.135.255 nl 194.126.136.0 - 194.126.143.255 lb 194.126.144.0 - 194.126.145.255 ch 194.126.146.0 - 194.126.147.255 ro 194.126.148.0 - 194.126.149.255 it 194.126.150.0 - 194.126.151.255 se -194.126.152.0 - 194.126.153.255 ro -194.126.154.0 - 194.126.155.255 it 194.126.156.0 - 194.126.157.255 fr 194.126.158.0 - 194.126.159.255 de -194.126.160.0 - 194.126.163.255 ro 194.126.164.0 - 194.126.167.255 pl 194.126.168.0 - 194.126.171.255 ru 194.126.172.0 - 194.126.175.255 nl -194.126.176.0 - 194.126.179.255 ro 194.126.180.0 - 194.126.183.255 ua 194.126.184.0 - 194.126.187.255 ro 194.126.188.0 - 194.126.191.255 ch 194.126.192.0 - 194.126.192.255 dk 194.126.193.0 - 194.126.193.255 nl -194.126.194.0 - 194.126.196.255 de +194.126.195.0 - 194.126.196.255 de 194.126.197.0 - 194.126.197.255 si -194.126.198.0 - 194.126.199.255 de +194.126.198.0 - 194.126.198.255 de +194.126.199.0 - 194.126.199.255 lv 194.126.200.0 - 194.126.201.255 ch -194.126.202.0 - 194.126.202.255 ro 194.126.203.0 - 194.126.203.255 ru 194.126.204.0 - 194.126.204.255 ua 194.126.205.0 - 194.126.205.255 ro @@ -100830,24 +86713,20 @@ 194.126.211.0 - 194.126.211.255 no 194.126.212.0 - 194.126.212.255 fi 194.126.213.0 - 194.126.214.255 hr -194.126.215.0 - 194.126.215.255 es 194.126.216.0 - 194.126.216.255 pl 194.126.217.0 - 194.126.217.255 fr 194.126.218.0 - 194.126.218.255 ch -194.126.219.0 - 194.126.219.255 ru 194.126.220.0 - 194.126.220.255 ro 194.126.221.0 - 194.126.222.255 pl 194.126.223.0 - 194.126.223.255 dk 194.126.224.0 - 194.126.224.255 ua 194.126.225.0 - 194.126.225.255 es -194.126.226.0 - 194.126.226.255 fr -194.126.227.0 - 194.126.227.255 ro +194.126.226.0 - 194.126.226.255 eu 194.126.228.0 - 194.126.228.255 de 194.126.229.0 - 194.126.229.255 pl 194.126.230.0 - 194.126.230.255 tr 194.126.231.0 - 194.126.231.255 sa 194.126.232.0 - 194.126.232.255 pl -194.126.233.0 - 194.126.233.255 fr 194.126.234.0 - 194.126.234.255 dk 194.126.235.0 - 194.126.235.255 nl 194.126.236.0 - 194.126.236.255 fr @@ -100858,177 +86737,130 @@ 194.126.241.0 - 194.126.241.255 nl 194.126.242.0 - 194.126.243.255 de 194.126.244.0 - 194.126.244.255 ro -194.126.245.0 - 194.126.245.255 fr 194.126.246.0 - 194.126.246.255 de 194.126.247.0 - 194.126.247.255 gb 194.126.248.0 - 194.126.248.255 at 194.126.249.0 - 194.126.249.255 se 194.126.250.0 - 194.126.250.255 dk -194.126.251.0 - 194.126.251.255 ru 194.126.252.0 - 194.126.252.255 lt -194.126.253.0 - 194.126.253.255 ro +194.126.253.0 - 194.126.253.255 gb 194.126.254.0 - 194.126.254.255 pl 194.126.255.0 - 194.126.255.255 gr -194.127.0.0 - 194.127.135.255 de +194.127.0.0 - 194.127.4.30 de +194.127.4.31 - 194.127.4.31 fr +194.127.4.32 - 194.127.4.40 de +194.127.4.41 - 194.127.4.41 gb +194.127.4.42 - 194.127.71.255 de +194.127.72.0 - 194.127.72.255 eu +194.127.73.0 - 194.127.135.255 de 194.127.136.0 - 194.127.137.255 pl 194.127.138.0 - 194.127.138.255 de 194.127.139.0 - 194.127.139.255 at 194.127.140.0 - 194.127.255.255 de 194.128.0.0 - 194.131.255.255 gb -194.132.0.0 - 194.132.22.255 se +194.132.0.0 - 194.132.10.255 se +194.132.11.0 - 194.132.11.255 no +194.132.12.0 - 194.132.22.255 se 194.132.23.0 - 194.132.23.255 es -194.132.24.0 - 194.132.25.255 gb -194.132.26.0 - 194.132.106.255 se +194.132.24.0 - 194.132.30.255 se +194.132.31.0 - 194.132.31.255 it +194.132.32.0 - 194.132.49.255 se +194.132.50.0 - 194.132.51.255 nl +194.132.52.0 - 194.132.60.255 se +194.132.61.0 - 194.132.61.255 ch +194.132.62.0 - 194.132.63.255 de +194.132.64.0 - 194.132.106.255 se 194.132.107.0 - 194.132.107.255 de 194.132.108.0 - 194.132.112.255 se 194.132.113.0 - 194.132.113.255 fr -194.132.114.0 - 194.132.120.255 se -194.132.121.0 - 194.132.121.255 ae -194.132.122.0 - 194.132.151.255 se -194.132.152.0 - 194.132.155.255 sg -194.132.156.0 - 194.132.161.255 se -194.132.162.0 - 194.132.162.255 sg -194.132.163.0 - 194.132.175.255 se -194.132.176.0 - 194.132.179.255 jp -194.132.180.0 - 194.132.183.255 se -194.132.184.0 - 194.132.184.255 jp -194.132.185.0 - 194.132.185.255 au -194.132.186.0 - 194.132.186.255 se +194.132.114.0 - 194.132.114.255 se +194.132.115.0 - 194.132.115.255 gb +194.132.116.0 - 194.132.151.255 se +194.132.152.0 - 194.132.152.95 sg +194.132.152.96 - 194.132.152.127 us +194.132.152.128 - 194.132.153.31 sg +194.132.153.32 - 194.132.153.63 us +194.132.153.64 - 194.132.155.255 sg +194.132.156.0 - 194.132.175.255 se +194.132.176.0 - 194.132.177.191 jp +194.132.177.192 - 194.132.177.223 gb +194.132.177.224 - 194.132.178.31 jp +194.132.178.32 - 194.132.178.63 gb +194.132.178.64 - 194.132.178.191 jp +194.132.178.192 - 194.132.178.255 gb +194.132.179.0 - 194.132.179.191 jp +194.132.179.192 - 194.132.179.223 gb +194.132.179.224 - 194.132.179.255 jp +194.132.180.0 - 194.132.186.255 se 194.132.187.0 - 194.132.187.255 es 194.132.188.0 - 194.132.195.255 se -194.132.196.0 - 194.132.199.255 jp -194.132.200.0 - 194.132.255.255 se -194.133.0.0 - 194.133.6.255 eu -194.133.7.0 - 194.133.7.255 gb -194.133.8.0 - 194.133.9.255 eu -194.133.10.0 - 194.133.10.127 us -194.133.10.128 - 194.133.10.191 gb -194.133.10.192 - 194.133.10.207 eu -194.133.10.208 - 194.133.10.255 gb -194.133.11.0 - 194.133.13.255 eu -194.133.14.0 - 194.133.14.255 fr -194.133.15.0 - 194.133.15.255 gb -194.133.16.0 - 194.133.19.255 eu -194.133.20.0 - 194.133.20.29 gb -194.133.20.30 - 194.133.20.31 eu -194.133.20.32 - 194.133.20.127 gb -194.133.20.128 - 194.133.20.191 us -194.133.20.192 - 194.133.20.207 gb -194.133.20.208 - 194.133.20.215 ir -194.133.20.216 - 194.133.20.223 gb -194.133.20.224 - 194.133.20.239 de -194.133.20.240 - 194.133.21.255 gb -194.133.22.0 - 194.133.27.31 eu -194.133.27.32 - 194.133.27.63 de -194.133.27.64 - 194.133.27.95 eu -194.133.27.96 - 194.133.27.163 de -194.133.27.164 - 194.133.27.167 eu -194.133.27.168 - 194.133.27.175 de -194.133.27.176 - 194.133.27.191 eu -194.133.27.192 - 194.133.27.255 de -194.133.28.0 - 194.133.30.255 eu -194.133.31.0 - 194.133.31.127 eg -194.133.31.128 - 194.133.40.255 eu -194.133.41.0 - 194.133.41.127 de -194.133.41.128 - 194.133.41.255 us -194.133.42.0 - 194.133.42.255 eu -194.133.43.0 - 194.133.43.255 us -194.133.44.0 - 194.133.52.255 eu -194.133.53.0 - 194.133.53.31 gb -194.133.53.32 - 194.133.53.47 ie -194.133.53.48 - 194.133.53.71 gb -194.133.53.72 - 194.133.53.79 fr -194.133.53.80 - 194.133.53.87 gb -194.133.53.88 - 194.133.53.127 us -194.133.53.128 - 194.133.54.7 gb -194.133.54.8 - 194.133.54.15 be -194.133.54.16 - 194.133.54.47 gb -194.133.54.48 - 194.133.54.63 us -194.133.54.64 - 194.133.54.255 gb -194.133.55.0 - 194.133.58.255 eu -194.133.59.0 - 194.133.59.255 gb -194.133.60.0 - 194.133.61.255 eu -194.133.62.0 - 194.133.62.247 gb -194.133.62.248 - 194.133.66.255 eu -194.133.67.0 - 194.133.67.255 us -194.133.68.0 - 194.133.79.255 eu -194.133.80.0 - 194.133.80.255 us -194.133.81.0 - 194.133.81.255 gb -194.133.82.0 - 194.133.83.255 eu -194.133.84.0 - 194.133.84.255 us -194.133.85.0 - 194.133.86.255 gb -194.133.87.0 - 194.133.87.255 fr -194.133.88.0 - 194.133.88.31 ir -194.133.88.32 - 194.133.91.255 eu -194.133.92.0 - 194.133.92.15 gb -194.133.92.16 - 194.133.93.255 eu -194.133.94.0 - 194.133.94.255 fr -194.133.95.0 - 194.133.95.255 us -194.133.96.0 - 194.133.104.255 eu -194.133.105.0 - 194.133.106.255 de -194.133.107.0 - 194.133.115.127 eu -194.133.115.128 - 194.133.115.255 de -194.133.116.0 - 194.133.121.255 eu -194.133.122.0 - 194.133.122.255 zw -194.133.123.0 - 194.133.123.255 de -194.133.124.0 - 194.133.124.255 eu -194.133.125.0 - 194.133.125.255 fr -194.133.126.0 - 194.133.133.255 eu -194.133.134.0 - 194.133.134.255 gb -194.133.135.0 - 194.133.137.255 eu -194.133.138.0 - 194.133.138.15 de -194.133.138.16 - 194.133.138.31 eu -194.133.138.32 - 194.133.138.255 de -194.133.139.0 - 194.133.163.255 eu -194.133.164.0 - 194.133.164.255 tr -194.133.165.0 - 194.133.171.255 eu -194.133.172.0 - 194.133.172.255 tr -194.133.173.0 - 194.133.173.255 gb -194.133.174.0 - 194.133.176.255 eu -194.133.177.0 - 194.133.177.31 gb -194.133.177.32 - 194.133.239.255 eu -194.133.240.0 - 194.133.240.255 tr -194.133.241.0 - 194.133.243.255 eu -194.133.244.0 - 194.133.244.255 tr -194.133.245.0 - 194.133.247.255 gb -194.133.248.0 - 194.133.250.255 eu -194.133.251.0 - 194.133.251.255 tr -194.133.252.0 - 194.133.253.255 eu -194.133.254.0 - 194.133.254.15 tr -194.133.254.16 - 194.133.255.255 eu +194.132.196.0 - 194.132.197.255 jp +194.132.198.0 - 194.132.198.15 gb +194.132.198.16 - 194.132.198.111 jp +194.132.198.112 - 194.132.198.127 gb +194.132.198.128 - 194.132.198.143 jp +194.132.198.144 - 194.132.198.159 gb +194.132.198.160 - 194.132.199.255 jp +194.132.200.0 - 194.132.203.255 se +194.132.204.0 - 194.132.207.255 gb +194.132.208.0 - 194.132.255.255 se +194.133.0.0 - 194.133.26.255 gb +194.133.27.0 - 194.133.27.255 de +194.133.28.0 - 194.133.59.255 gb +194.133.60.0 - 194.133.61.255 be +194.133.62.0 - 194.133.63.255 gb +194.133.64.0 - 194.133.64.255 es +194.133.65.0 - 194.133.68.255 gb +194.133.69.0 - 194.133.69.255 ru +194.133.70.0 - 194.133.95.255 gb +194.133.96.0 - 194.133.115.255 de +194.133.116.0 - 194.133.116.255 za +194.133.117.0 - 194.133.191.255 de +194.133.192.0 - 194.133.255.255 us 194.134.0.0 - 194.134.255.255 nl -194.135.0.0 - 194.135.255.255 ru -194.136.0.0 - 194.137.6.255 fi -194.137.7.0 - 194.137.7.255 se -194.137.8.0 - 194.137.25.255 fi -194.137.26.0 - 194.137.27.255 be -194.137.28.0 - 194.137.33.191 fi -194.137.33.192 - 194.137.33.255 ru -194.137.34.0 - 194.137.60.255 fi -194.137.61.0 - 194.137.61.255 be -194.137.62.0 - 194.137.62.255 fi -194.137.63.0 - 194.137.63.255 be -194.137.64.0 - 194.137.132.223 fi -194.137.132.224 - 194.137.132.239 se -194.137.132.240 - 194.137.135.255 fi -194.137.136.0 - 194.137.136.255 be -194.137.137.0 - 194.137.221.211 fi -194.137.221.212 - 194.137.221.215 ax -194.137.221.216 - 194.137.227.255 fi -194.137.228.0 - 194.137.228.255 es -194.137.229.0 - 194.137.229.255 nl -194.137.230.0 - 194.137.255.255 fi -194.138.0.0 - 194.139.255.255 de +194.135.0.0 - 194.135.0.255 ru +194.135.1.0 - 194.135.2.255 ua +194.135.3.0 - 194.135.15.255 ru +194.135.16.0 - 194.135.18.255 ua +194.135.19.0 - 194.135.19.255 ru +194.135.20.0 - 194.135.20.255 ua +194.135.21.0 - 194.135.22.255 ru +194.135.23.0 - 194.135.24.255 ua +194.135.25.0 - 194.135.31.255 ru +194.135.32.0 - 194.135.34.255 ua +194.135.35.0 - 194.135.35.255 ru +194.135.36.0 - 194.135.37.255 ua +194.135.38.0 - 194.135.38.255 ru +194.135.39.0 - 194.135.39.255 ua +194.135.40.0 - 194.135.43.255 ru +194.135.44.0 - 194.135.45.255 ua +194.135.46.0 - 194.135.79.255 ru +194.135.80.0 - 194.135.95.35 lt +194.135.95.36 - 194.135.95.36 ru +194.135.95.37 - 194.135.95.255 lt +194.135.96.0 - 194.135.127.255 ru +194.135.128.0 - 194.135.131.255 de +194.135.132.0 - 194.135.151.255 ru +194.135.152.0 - 194.135.191.255 az +194.135.192.0 - 194.135.199.255 ru +194.135.200.0 - 194.135.207.255 de +194.135.208.0 - 194.135.255.255 ru +194.136.0.0 - 194.137.255.255 fi +194.138.0.0 - 194.138.11.255 de +194.138.12.0 - 194.138.12.255 at +194.138.13.0 - 194.138.38.255 de +194.138.39.0 - 194.138.39.47 gb +194.138.39.48 - 194.138.242.255 de +194.138.243.0 - 194.138.243.255 sg +194.138.244.0 - 194.139.255.255 de 194.140.0.0 - 194.140.95.255 es 194.140.96.0 - 194.140.127.255 de 194.140.128.0 - 194.140.191.255 es 194.140.192.0 - 194.140.223.255 hu -194.140.224.0 - 194.140.224.255 at 194.140.225.0 - 194.140.225.255 fr 194.140.226.0 - 194.140.226.255 gb 194.140.227.0 - 194.140.227.255 tr 194.140.228.0 - 194.140.228.255 ua -194.140.229.0 - 194.140.229.255 ru 194.140.230.0 - 194.140.230.255 nl 194.140.231.0 - 194.140.231.255 de 194.140.232.0 - 194.140.232.255 pt @@ -101036,37 +86868,21 @@ 194.140.234.0 - 194.140.234.255 ie 194.140.235.0 - 194.140.235.255 ro 194.140.236.0 - 194.140.236.255 dk -194.140.237.0 - 194.140.237.255 ua 194.140.238.0 - 194.140.238.255 pt 194.140.239.0 - 194.140.239.255 ua 194.140.240.0 - 194.140.240.255 se 194.140.241.0 - 194.140.241.255 pl -194.140.242.0 - 194.140.242.255 gb 194.140.243.0 - 194.140.244.255 se 194.140.245.0 - 194.140.245.255 ro 194.140.246.0 - 194.140.246.255 nl 194.140.247.0 - 194.140.247.255 fr 194.140.248.0 - 194.140.248.255 hu -194.140.249.0 - 194.140.249.255 gb 194.140.250.0 - 194.140.250.255 pl 194.140.251.0 - 194.140.253.255 gb 194.140.254.0 - 194.140.254.255 at 194.140.255.0 - 194.140.255.255 pl 194.141.0.0 - 194.141.255.255 bg -194.142.0.0 - 194.142.24.127 fi -194.142.24.128 - 194.142.24.135 ax -194.142.24.136 - 194.142.53.255 fi -194.142.54.0 - 194.142.54.255 gb -194.142.55.0 - 194.142.151.255 fi -194.142.152.0 - 194.142.152.255 de -194.142.153.0 - 194.142.153.255 nl -194.142.154.0 - 194.142.154.255 fi -194.142.155.0 - 194.142.155.255 be -194.142.156.0 - 194.142.168.247 fi -194.142.168.248 - 194.142.168.255 ax -194.142.169.0 - 194.142.184.255 fi -194.142.185.0 - 194.142.185.255 se -194.142.186.0 - 194.142.255.255 fi +194.142.0.0 - 194.142.255.255 fi 194.143.0.0 - 194.143.127.255 no 194.143.128.0 - 194.143.129.255 md 194.143.130.0 - 194.143.131.255 nl @@ -101088,37 +86904,28 @@ 194.145.0.0 - 194.145.31.255 gb 194.145.32.0 - 194.145.52.255 fi 194.145.53.0 - 194.145.58.255 fr -194.145.59.0 - 194.145.62.255 pt +194.145.59.0 - 194.145.62.255 de 194.145.63.0 - 194.145.63.255 bg 194.145.64.0 - 194.145.95.255 de 194.145.96.0 - 194.145.111.255 pl -194.145.112.0 - 194.145.112.255 fr -194.145.113.0 - 194.145.113.255 it 194.145.114.0 - 194.145.114.255 de -194.145.115.0 - 194.145.115.255 ch -194.145.116.0 - 194.145.116.255 pl +194.145.115.0 - 194.145.115.255 eu 194.145.117.0 - 194.145.117.255 ua 194.145.118.0 - 194.145.118.255 de 194.145.119.0 - 194.145.119.255 nl 194.145.120.0 - 194.145.120.255 ro 194.145.121.0 - 194.145.121.255 pt 194.145.122.0 - 194.145.124.255 de -194.145.125.0 - 194.145.125.255 se 194.145.126.0 - 194.145.126.255 gb -194.145.127.0 - 194.145.127.255 gr 194.145.128.0 - 194.145.135.255 ie -194.145.136.0 - 194.145.139.255 sk 194.145.140.0 - 194.145.141.255 es -194.145.142.0 - 194.145.143.255 de 194.145.144.0 - 194.145.144.255 fr 194.145.145.0 - 194.145.145.255 se 194.145.146.0 - 194.145.146.255 de 194.145.147.0 - 194.145.149.255 gb 194.145.150.0 - 194.145.151.255 de -194.145.152.0 - 194.145.152.255 gb 194.145.153.0 - 194.145.153.255 rs 194.145.154.0 - 194.145.154.255 fr -194.145.155.0 - 194.145.155.255 ro 194.145.156.0 - 194.145.156.255 hu 194.145.157.0 - 194.145.157.255 ch 194.145.158.0 - 194.145.158.255 ru @@ -101139,9 +86946,7 @@ 194.145.202.0 - 194.145.203.255 ua 194.145.204.0 - 194.145.205.255 pl 194.145.206.0 - 194.145.207.255 sk -194.145.208.0 - 194.145.209.255 cy -194.145.210.0 - 194.145.211.255 gb -194.145.212.0 - 194.145.213.255 ru +194.145.208.0 - 194.145.209.255 bz 194.145.214.0 - 194.145.217.255 ua 194.145.218.0 - 194.145.219.255 de 194.145.220.0 - 194.145.221.255 ua @@ -101163,49 +86968,45 @@ 194.145.244.0 - 194.145.247.255 nl 194.145.248.0 - 194.145.251.255 se 194.145.252.0 - 194.145.255.255 de -194.146.0.0 - 194.146.93.255 fr -194.146.94.0 - 194.146.95.255 gb -194.146.96.0 - 194.146.104.255 fr -194.146.105.0 - 194.146.108.255 se +194.146.16.0 - 194.146.31.255 fr +194.146.37.0 - 194.146.37.255 de +194.146.46.0 - 194.146.46.255 fr +194.146.48.0 - 194.146.81.255 fr +194.146.94.0 - 194.146.95.255 eu +194.146.96.0 - 194.146.99.255 fr +194.146.104.0 - 194.146.108.255 se 194.146.109.0 - 194.146.109.255 hr 194.146.110.0 - 194.146.110.255 ua 194.146.111.0 - 194.146.111.255 ch 194.146.112.0 - 194.146.112.255 ua 194.146.113.0 - 194.146.113.255 ru -194.146.114.0 - 194.146.114.255 it -194.146.115.0 - 194.146.116.255 ru +194.146.115.0 - 194.146.115.255 ru 194.146.117.0 - 194.146.117.255 se 194.146.118.0 - 194.146.118.255 de 194.146.119.0 - 194.146.119.255 ru 194.146.120.0 - 194.146.120.255 pl 194.146.121.0 - 194.146.121.255 be 194.146.122.0 - 194.146.122.255 ru -194.146.124.0 - 194.146.124.255 de +194.146.123.0 - 194.146.123.255 pl 194.146.125.0 - 194.146.125.255 ro -194.146.126.0 - 194.146.126.255 ch 194.146.127.0 - 194.146.127.255 nl 194.146.128.0 - 194.146.131.255 pl 194.146.132.0 - 194.146.143.255 ua 194.146.144.0 - 194.146.147.255 de 194.146.148.0 - 194.146.151.255 ir 194.146.152.0 - 194.146.155.255 lb -194.146.156.0 - 194.146.159.255 ua 194.146.160.0 - 194.146.163.255 ru -194.146.164.0 - 194.146.167.255 ir 194.146.168.0 - 194.146.171.255 se 194.146.172.0 - 194.146.175.255 fr 194.146.176.0 - 194.146.179.255 de 194.146.180.0 - 194.146.183.255 ua 194.146.184.0 - 194.146.187.255 at 194.146.188.0 - 194.146.191.255 ua -194.146.192.0 - 194.146.195.255 gb 194.146.196.0 - 194.146.199.255 ua 194.146.200.0 - 194.146.203.255 ru -194.146.204.0 - 194.146.207.255 pa 194.146.208.0 - 194.146.211.255 de 194.146.212.0 - 194.146.215.255 ch 194.146.216.0 - 194.146.219.255 pl -194.146.220.0 - 194.146.223.255 ua 194.146.224.0 - 194.146.227.255 fr 194.146.228.0 - 194.146.231.255 ua 194.146.232.0 - 194.146.235.255 bg @@ -101213,31 +87014,43 @@ 194.146.240.0 - 194.146.243.255 ru 194.146.244.0 - 194.146.247.255 no 194.146.248.0 - 194.146.255.255 pl -194.147.0.0 - 194.147.67.255 ch +194.147.0.0 - 194.147.63.255 ch +194.147.66.0 - 194.147.66.255 ch 194.147.68.0 - 194.147.69.255 li -194.147.70.0 - 194.147.126.255 ch -194.147.127.0 - 194.147.127.255 fr -194.147.128.0 - 194.147.132.255 ch +194.147.70.0 - 194.147.70.255 ch +194.147.72.0 - 194.147.104.255 ch +194.147.108.0 - 194.147.108.255 pl +194.147.112.0 - 194.147.113.255 ch +194.147.132.0 - 194.147.132.255 ch 194.147.133.0 - 194.147.133.255 de -194.147.134.0 - 194.147.195.255 ch +194.147.134.0 - 194.147.135.255 ch +194.147.140.0 - 194.147.143.255 ch +194.147.151.0 - 194.147.151.255 ch +194.147.160.0 - 194.147.163.255 ch +194.147.168.0 - 194.147.169.255 ch +194.147.171.0 - 194.147.171.255 at +194.147.173.0 - 194.147.173.255 ch +194.147.176.0 - 194.147.195.255 ch 194.147.196.0 - 194.147.207.255 li -194.147.208.0 - 194.148.14.255 ch -194.148.15.0 - 194.148.15.255 li -194.148.16.0 - 194.148.28.127 ch -194.148.28.128 - 194.148.28.159 li -194.148.28.160 - 194.148.57.255 ch -194.148.58.0 - 194.148.58.255 us -194.148.59.0 - 194.148.255.255 ch -194.149.0.0 - 194.149.63.255 hu +194.147.208.0 - 194.147.240.255 ch +194.147.245.0 - 194.147.245.255 ch +194.147.246.0 - 194.147.247.255 ru +194.147.248.0 - 194.147.248.255 pl +194.147.249.0 - 194.147.249.255 ru +194.147.254.0 - 194.147.254.255 ch +194.148.0.0 - 194.148.255.255 ch +194.149.0.0 - 194.149.46.255 hu +194.149.47.0 - 194.149.47.255 bg +194.149.48.0 - 194.149.50.255 hu +194.149.51.0 - 194.149.51.255 bg +194.149.52.0 - 194.149.63.255 hu 194.149.64.0 - 194.149.71.255 ru 194.149.72.0 - 194.149.75.255 es 194.149.76.0 - 194.149.79.255 ie 194.149.80.0 - 194.149.87.255 nl 194.149.88.0 - 194.149.88.255 pl -194.149.89.0 - 194.149.89.255 gb -194.149.90.0 - 194.149.91.255 ru +194.149.90.0 - 194.149.90.255 ru 194.149.92.0 - 194.149.92.255 ua -194.149.93.0 - 194.149.93.255 ru 194.149.94.0 - 194.149.94.255 fr 194.149.95.0 - 194.149.95.255 ru 194.149.96.0 - 194.149.127.255 cz @@ -101252,81 +87065,48 @@ 194.149.238.0 - 194.149.239.255 dk 194.149.240.0 - 194.149.240.255 pl 194.149.241.0 - 194.149.241.255 de -194.149.242.0 - 194.149.242.255 fr +194.149.242.0 - 194.149.242.255 ru 194.149.243.0 - 194.149.243.255 be 194.149.244.0 - 194.149.244.255 it 194.149.245.0 - 194.149.255.255 de -194.150.0.0 - 194.150.7.255 gb -194.150.8.0 - 194.150.8.247 fr -194.150.8.248 - 194.150.8.255 gb -194.150.9.0 - 194.150.11.79 fr -194.150.11.80 - 194.150.11.127 gb -194.150.11.128 - 194.150.11.191 fr -194.150.11.192 - 194.150.11.255 gb -194.150.12.0 - 194.150.13.255 nl -194.150.14.0 - 194.150.14.7 gb -194.150.14.8 - 194.150.14.31 nl -194.150.14.32 - 194.150.15.255 gb -194.150.16.0 - 194.150.16.255 nl -194.150.17.0 - 194.150.17.255 se -194.150.18.0 - 194.150.19.255 gb -194.150.20.0 - 194.150.21.55 ch -194.150.21.56 - 194.150.21.63 gb -194.150.21.64 - 194.150.21.95 ch -194.150.21.96 - 194.150.21.127 gb -194.150.21.128 - 194.150.21.143 ch -194.150.21.144 - 194.150.21.159 gb -194.150.21.160 - 194.150.21.191 ch -194.150.21.192 - 194.150.23.255 gb -194.150.24.0 - 194.150.24.31 de -194.150.24.32 - 194.150.24.127 gb -194.150.24.128 - 194.150.24.255 de -194.150.25.0 - 194.150.25.255 gb -194.150.26.0 - 194.150.27.255 de -194.150.28.0 - 194.150.28.255 us -194.150.29.0 - 194.150.30.255 gb -194.150.31.0 - 194.150.31.255 us -194.150.32.0 - 194.150.32.255 pl -194.150.33.0 - 194.150.33.255 gb -194.150.34.0 - 194.150.35.47 be -194.150.35.48 - 194.150.39.255 gb -194.150.40.0 - 194.150.40.31 fr -194.150.40.32 - 194.150.42.255 gb -194.150.43.0 - 194.150.43.255 fr -194.150.44.0 - 194.150.46.255 gb -194.150.47.0 - 194.150.47.255 de -194.150.48.0 - 194.150.48.255 gb -194.150.49.0 - 194.150.49.255 fr -194.150.50.0 - 194.150.53.255 gb -194.150.54.0 - 194.150.54.15 gi -194.150.54.16 - 194.150.54.255 gb -194.150.55.0 - 194.150.55.255 mt -194.150.56.0 - 194.150.62.255 gb -194.150.63.0 - 194.150.63.255 nl +194.150.0.0 - 194.150.8.127 gb +194.150.8.128 - 194.150.8.255 fr +194.150.9.0 - 194.150.10.163 gb +194.150.10.164 - 194.150.10.167 fr +194.150.10.168 - 194.150.17.255 gb +194.150.18.0 - 194.150.18.255 se +194.150.19.0 - 194.150.23.71 gb +194.150.23.72 - 194.150.23.79 ch +194.150.23.80 - 194.150.23.143 gb +194.150.23.144 - 194.150.23.145 ch +194.150.23.146 - 194.150.29.255 gb +194.150.30.0 - 194.150.30.255 us +194.150.31.0 - 194.150.35.127 gb +194.150.35.128 - 194.150.35.255 be +194.150.36.0 - 194.150.55.255 gb +194.150.56.0 - 194.150.56.31 us +194.150.56.32 - 194.150.63.255 gb 194.150.64.0 - 194.150.67.255 ee -194.150.68.0 - 194.150.71.255 gr -194.150.72.0 - 194.150.79.255 ua +194.150.72.0 - 194.150.75.255 ua 194.150.80.0 - 194.150.83.255 de 194.150.84.0 - 194.150.87.255 ro 194.150.88.0 - 194.150.91.255 ru -194.150.92.0 - 194.150.95.255 ua 194.150.96.0 - 194.150.103.255 pl 194.150.104.0 - 194.150.107.255 ru 194.150.108.0 - 194.150.115.255 dk 194.150.116.0 - 194.150.119.255 bg 194.150.120.0 - 194.150.123.255 gb -194.150.124.0 - 194.150.159.255 ru +194.150.128.0 - 194.150.159.255 ru 194.150.160.0 - 194.150.161.255 ch 194.150.162.0 - 194.150.163.255 it 194.150.164.0 - 194.150.165.255 ru 194.150.166.0 - 194.150.167.255 pl -194.150.168.0 - 194.150.169.255 eu +194.150.168.0 - 194.150.169.255 de 194.150.170.0 - 194.150.171.255 pl 194.150.172.0 - 194.150.173.255 de 194.150.174.0 - 194.150.175.255 ua 194.150.176.0 - 194.150.177.255 gb 194.150.178.0 - 194.150.179.255 ru -194.150.180.0 - 194.150.181.255 bg 194.150.182.0 - 194.150.183.255 gb 194.150.184.0 - 194.150.185.255 pl 194.150.186.0 - 194.150.187.255 ro @@ -101337,12 +87117,10 @@ 194.150.198.0 - 194.150.199.255 ch 194.150.200.0 - 194.150.201.255 gb 194.150.202.0 - 194.150.203.255 ru -194.150.204.0 - 194.150.205.255 ua 194.150.206.0 - 194.150.207.255 pl 194.150.208.0 - 194.150.209.255 nl 194.150.210.0 - 194.150.211.255 de 194.150.212.0 - 194.150.213.255 no -194.150.214.0 - 194.150.215.255 se 194.150.216.0 - 194.150.217.255 ro 194.150.218.0 - 194.150.219.255 il 194.150.220.0 - 194.150.221.255 ua @@ -101351,7 +87129,6 @@ 194.150.226.0 - 194.150.229.255 de 194.150.230.0 - 194.150.231.255 pl 194.150.232.0 - 194.150.233.255 ua -194.150.234.0 - 194.150.235.255 ru 194.150.236.0 - 194.150.237.255 fr 194.150.238.0 - 194.150.239.255 pl 194.150.240.0 - 194.150.241.255 de @@ -101362,7 +87139,11 @@ 194.150.250.0 - 194.150.251.255 pl 194.150.252.0 - 194.150.253.255 gb 194.150.254.0 - 194.150.255.255 ru -194.151.0.0 - 194.151.255.255 nl +194.151.0.0 - 194.151.75.193 nl +194.151.75.194 - 194.151.75.194 eu +194.151.75.195 - 194.151.86.68 nl +194.151.86.69 - 194.151.86.69 eu +194.151.86.70 - 194.151.255.255 nl 194.152.0.0 - 194.152.31.255 si 194.152.32.0 - 194.152.33.255 lv 194.152.34.0 - 194.152.35.255 ru @@ -101370,14 +87151,14 @@ 194.152.38.0 - 194.152.39.255 dk 194.152.40.0 - 194.152.41.255 gb 194.152.42.0 - 194.152.43.255 ro -194.152.44.0 - 194.152.45.255 nl +194.152.44.0 - 194.152.45.255 ae 194.152.46.0 - 194.152.47.255 pl 194.152.48.0 - 194.152.49.255 it 194.152.50.0 - 194.152.51.255 pl -194.152.52.0 - 194.152.53.255 ru +194.152.52.0 - 194.152.52.255 lu +194.152.53.0 - 194.152.53.255 pl 194.152.54.0 - 194.152.55.255 de 194.152.56.0 - 194.152.57.255 pl -194.152.58.0 - 194.152.59.255 fi 194.152.60.0 - 194.152.61.255 pl 194.152.62.0 - 194.152.63.255 ru 194.152.64.0 - 194.152.95.255 gb @@ -101387,14 +87168,11 @@ 194.152.192.0 - 194.152.255.255 hr 194.153.0.0 - 194.153.31.255 gb 194.153.32.0 - 194.153.71.255 se -194.153.72.0 - 194.153.72.255 no -194.153.73.0 - 194.153.73.255 it -194.153.74.0 - 194.153.77.255 gb +194.153.74.0 - 194.153.75.255 gb 194.153.78.0 - 194.153.78.255 nl 194.153.79.0 - 194.153.79.255 lv -194.153.80.0 - 194.153.80.255 fr 194.153.81.0 - 194.153.82.255 gr -194.153.83.0 - 194.153.83.255 ch +194.153.83.0 - 194.153.83.255 eu 194.153.84.0 - 194.153.84.255 se 194.153.85.0 - 194.153.85.255 mt 194.153.86.0 - 194.153.87.255 de @@ -101406,13 +87184,12 @@ 194.153.95.0 - 194.153.95.255 pl 194.153.96.0 - 194.153.96.255 ch 194.153.97.0 - 194.153.97.255 fr -194.153.98.0 - 194.153.98.255 at -194.153.99.0 - 194.153.99.255 it +194.153.98.0 - 194.153.98.255 ie 194.153.100.0 - 194.153.100.255 de 194.153.101.0 - 194.153.101.255 il -194.153.102.0 - 194.153.103.255 it 194.153.104.0 - 194.153.105.255 de -194.153.106.0 - 194.153.107.255 gb +194.153.106.0 - 194.153.106.255 gb +194.153.107.0 - 194.153.107.255 pl 194.153.108.0 - 194.153.110.255 fr 194.153.111.0 - 194.153.111.255 at 194.153.112.0 - 194.153.112.255 ru @@ -101427,7 +87204,7 @@ 194.153.130.0 - 194.153.130.255 de 194.153.131.0 - 194.153.131.255 it 194.153.132.0 - 194.153.132.255 pt -194.153.133.0 - 194.153.134.255 pl +194.153.134.0 - 194.153.134.255 pl 194.153.135.0 - 194.153.135.255 lv 194.153.136.0 - 194.153.144.255 gb 194.153.145.0 - 194.153.145.255 bg @@ -101435,34 +87212,24 @@ 194.153.148.0 - 194.153.149.255 ua 194.153.150.0 - 194.153.152.127 de 194.153.152.128 - 194.153.152.255 gb -194.153.153.0 - 194.153.153.127 ug 194.153.153.128 - 194.153.153.255 ae 194.153.154.0 - 194.153.154.127 gb 194.153.154.128 - 194.153.154.255 no -194.153.155.0 - 194.153.155.127 us -194.153.155.128 - 194.153.155.255 ru 194.153.156.0 - 194.153.156.63 dk -194.153.156.192 - 194.153.156.255 gb -194.153.157.0 - 194.153.157.31 fr -194.153.157.32 - 194.153.157.63 es -194.153.157.64 - 194.153.157.95 ie -194.153.157.96 - 194.153.157.127 no +194.153.156.64 - 194.153.156.255 cy 194.153.157.128 - 194.153.157.159 ch 194.153.157.160 - 194.153.157.191 li -194.153.158.0 - 194.153.158.127 fr +194.153.157.192 - 194.153.157.255 cy 194.153.158.128 - 194.153.158.255 ru 194.153.159.0 - 194.153.159.63 pl 194.153.159.64 - 194.153.159.127 fi -194.153.159.128 - 194.153.159.191 be -194.153.159.192 - 194.153.159.255 se 194.153.160.0 - 194.153.167.255 de 194.153.168.0 - 194.153.169.255 gb -194.153.170.0 - 194.153.170.255 pl 194.153.171.0 - 194.153.171.255 lv 194.153.172.0 - 194.153.175.255 it 194.153.176.0 - 194.153.183.255 ch -194.153.184.0 - 194.153.185.255 de -194.153.186.0 - 194.153.186.255 eu +194.153.184.0 - 194.153.184.255 gb +194.153.186.0 - 194.153.186.255 de 194.153.187.0 - 194.153.187.255 it 194.153.188.0 - 194.153.189.255 ch 194.153.190.0 - 194.153.191.255 de @@ -101477,20 +87244,50 @@ 194.154.0.0 - 194.154.63.255 gb 194.154.64.0 - 194.154.95.255 ru 194.154.96.0 - 194.154.127.255 gb -194.154.128.0 - 194.154.141.255 cy -194.154.142.0 - 194.154.142.255 gb -194.154.143.0 - 194.154.159.255 cy +194.154.128.0 - 194.154.159.255 cy 194.154.160.0 - 194.154.191.255 gb -194.154.192.0 - 194.154.194.191 lu -194.154.194.192 - 194.154.194.207 sa -194.154.194.208 - 194.154.223.255 lu +194.154.192.0 - 194.154.223.255 lu 194.154.224.0 - 194.154.255.255 sk 194.155.0.0 - 194.155.255.255 gb -194.156.0.0 - 194.156.201.255 de +194.156.0.0 - 194.156.7.255 de +194.156.16.0 - 194.156.23.255 de +194.156.24.0 - 194.156.24.255 fr +194.156.25.0 - 194.156.25.255 de +194.156.32.0 - 194.156.47.255 de +194.156.48.0 - 194.156.48.255 eu +194.156.49.0 - 194.156.59.255 de +194.156.60.0 - 194.156.63.255 hk +194.156.128.0 - 194.156.159.255 de +194.156.161.0 - 194.156.161.255 de +194.156.165.0 - 194.156.165.255 tr +194.156.168.0 - 194.156.175.255 de +194.156.184.0 - 194.156.191.255 de +194.156.196.0 - 194.156.197.255 de 194.156.202.0 - 194.156.203.255 fr -194.156.204.0 - 194.156.255.255 de +194.156.206.0 - 194.156.206.255 de +194.156.208.0 - 194.156.255.255 de 194.157.0.0 - 194.157.255.255 fi -194.158.0.0 - 194.158.31.255 ch +194.158.0.0 - 194.158.0.255 ch +194.158.1.0 - 194.158.1.255 be +194.158.2.0 - 194.158.13.63 ch +194.158.13.64 - 194.158.13.127 nl +194.158.13.128 - 194.158.15.167 ch +194.158.15.168 - 194.158.15.175 nl +194.158.15.176 - 194.158.20.255 ch +194.158.21.0 - 194.158.21.7 be +194.158.21.8 - 194.158.21.31 ch +194.158.21.32 - 194.158.21.47 be +194.158.21.48 - 194.158.21.151 ch +194.158.21.152 - 194.158.21.159 be +194.158.21.160 - 194.158.24.255 ch +194.158.25.0 - 194.158.25.255 gb +194.158.26.0 - 194.158.27.47 ch +194.158.27.48 - 194.158.27.51 ie +194.158.27.52 - 194.158.27.255 ch +194.158.28.0 - 194.158.28.255 gb +194.158.29.0 - 194.158.29.204 ch +194.158.29.205 - 194.158.29.205 gb +194.158.29.206 - 194.158.31.255 ch 194.158.32.0 - 194.158.63.255 mt 194.158.64.0 - 194.158.95.255 ad 194.158.96.0 - 194.158.127.255 fr @@ -101498,109 +87295,61 @@ 194.158.160.0 - 194.158.191.255 nl 194.158.192.0 - 194.158.223.255 by 194.158.224.0 - 194.158.255.255 ch -194.159.0.0 - 194.159.64.255 gb -194.159.65.0 - 194.159.65.255 fr -194.159.66.0 - 194.159.71.255 gb -194.159.72.0 - 194.159.73.255 nl -194.159.74.0 - 194.159.223.255 gb -194.159.224.0 - 194.159.231.255 nl -194.159.232.0 - 194.159.255.255 gb +194.159.0.0 - 194.159.255.255 gb 194.160.0.0 - 194.160.255.255 sk -194.161.0.0 - 194.161.35.255 gb -194.161.36.0 - 194.161.36.255 de -194.161.37.0 - 194.161.37.255 gb -194.161.38.0 - 194.161.38.255 ch -194.161.39.0 - 194.161.39.95 at -194.161.39.96 - 194.161.39.127 eu -194.161.39.128 - 194.161.39.255 fr -194.161.40.0 - 194.161.40.255 gb -194.161.41.0 - 194.161.41.255 de -194.161.42.0 - 194.161.47.255 gb -194.161.48.0 - 194.161.63.255 de -194.161.64.0 - 194.161.83.255 fr -194.161.84.0 - 194.161.84.255 be -194.161.85.0 - 194.161.85.255 fr -194.161.86.0 - 194.161.93.255 de -194.161.94.0 - 194.161.95.255 fr -194.161.96.0 - 194.161.100.255 be -194.161.101.0 - 194.161.101.255 fr -194.161.102.0 - 194.161.102.255 de -194.161.103.0 - 194.161.103.255 be -194.161.104.0 - 194.161.107.255 nl -194.161.108.0 - 194.161.108.255 be -194.161.109.0 - 194.161.111.255 nl -194.161.112.0 - 194.161.112.255 ch -194.161.113.0 - 194.161.113.255 gb -194.161.114.0 - 194.161.115.255 ch +194.161.0.0 - 194.161.11.255 gb +194.161.12.0 - 194.161.19.255 eu +194.161.20.0 - 194.161.23.255 gb +194.161.24.0 - 194.161.27.255 eu +194.161.28.0 - 194.161.35.255 gb +194.161.36.0 - 194.161.43.255 eu +194.161.44.0 - 194.161.47.255 gb +194.161.48.0 - 194.161.55.255 eu +194.161.56.0 - 194.161.63.255 de +194.161.64.0 - 194.161.67.255 fr +194.161.68.0 - 194.161.71.255 eu +194.161.72.0 - 194.161.79.255 fr +194.161.80.0 - 194.161.115.255 eu 194.161.116.0 - 194.161.119.255 gb 194.161.120.0 - 194.161.127.255 it 194.161.128.0 - 194.161.135.255 es -194.161.136.0 - 194.161.136.63 eu -194.161.136.64 - 194.161.136.255 be -194.161.137.0 - 194.161.137.255 hu -194.161.138.0 - 194.161.139.255 dk -194.161.140.0 - 194.161.140.255 at -194.161.141.0 - 194.161.141.255 es -194.161.142.0 - 194.161.142.255 se -194.161.143.0 - 194.161.148.255 dk -194.161.149.0 - 194.161.149.255 il -194.161.150.0 - 194.161.150.255 se -194.161.151.0 - 194.161.151.255 de -194.161.152.0 - 194.161.153.255 dk -194.161.154.0 - 194.161.154.255 gb -194.161.155.0 - 194.161.175.255 de -194.161.176.0 - 194.161.176.255 it -194.161.177.0 - 194.161.183.255 gb -194.161.184.0 - 194.161.190.255 nl -194.161.191.0 - 194.161.199.255 gb -194.161.200.0 - 194.161.201.255 ch -194.161.202.0 - 194.161.207.255 gb -194.161.208.0 - 194.161.215.255 de -194.161.216.0 - 194.161.219.255 nl -194.161.220.0 - 194.161.223.255 eu -194.161.224.0 - 194.161.255.255 gb -194.162.0.0 - 194.162.82.191 de -194.162.82.192 - 194.162.82.199 a2 -194.162.82.200 - 194.162.85.7 de -194.162.85.8 - 194.162.85.15 a2 -194.162.85.16 - 194.163.10.15 de -194.163.10.16 - 194.163.10.31 at -194.163.10.32 - 194.163.11.255 de -194.163.12.0 - 194.163.12.255 at -194.163.13.0 - 194.163.20.127 de -194.163.20.128 - 194.163.20.131 es -194.163.20.132 - 194.163.253.15 de -194.163.253.16 - 194.163.253.19 es -194.163.253.20 - 194.163.253.23 de -194.163.253.24 - 194.163.253.31 se -194.163.253.32 - 194.163.253.47 de -194.163.253.48 - 194.163.253.55 se -194.163.253.56 - 194.163.255.255 de -194.164.0.0 - 194.164.161.255 gb -194.164.162.0 - 194.164.163.255 ae -194.164.164.0 - 194.164.212.255 gb -194.164.213.0 - 194.164.213.255 a2 -194.164.214.0 - 194.164.255.255 gb +194.161.136.0 - 194.161.143.255 eu +194.161.144.0 - 194.161.147.255 dk +194.161.148.0 - 194.161.155.255 eu +194.161.156.0 - 194.161.175.255 de +194.161.176.0 - 194.161.179.255 eu +194.161.180.0 - 194.161.183.255 gb +194.161.184.0 - 194.161.187.255 nl +194.161.188.0 - 194.161.191.255 eu +194.161.192.0 - 194.161.201.255 gb +194.161.202.0 - 194.161.215.255 eu +194.161.216.0 - 194.161.216.255 nl +194.161.217.0 - 194.161.217.255 eu +194.161.218.0 - 194.161.218.255 nl +194.161.219.0 - 194.161.223.255 eu +194.161.224.0 - 194.161.239.255 gb +194.161.240.0 - 194.161.247.255 eu +194.161.248.0 - 194.161.255.255 gb +194.162.0.0 - 194.163.255.255 de +194.164.0.0 - 194.164.255.255 gb 194.165.0.0 - 194.165.3.255 ru -194.165.4.0 - 194.165.7.255 ua +194.165.6.0 - 194.165.7.255 ua 194.165.8.0 - 194.165.9.255 pl -194.165.10.0 - 194.165.11.255 ru 194.165.12.0 - 194.165.13.255 gb 194.165.14.0 - 194.165.15.255 fr -194.165.16.0 - 194.165.25.255 ru -194.165.26.0 - 194.165.27.255 hu +194.165.16.0 - 194.165.17.255 mc +194.165.18.0 - 194.165.25.255 ru 194.165.28.0 - 194.165.29.255 gb 194.165.30.0 - 194.165.31.255 ru 194.165.32.0 - 194.165.32.255 se 194.165.33.0 - 194.165.33.255 ch -194.165.34.0 - 194.165.35.255 nl +194.165.34.0 - 194.165.34.255 nl 194.165.36.0 - 194.165.36.255 it 194.165.37.0 - 194.165.37.255 ie -194.165.38.0 - 194.165.38.255 dk 194.165.39.0 - 194.165.39.255 md 194.165.40.0 - 194.165.40.255 de 194.165.41.0 - 194.165.41.255 pl -194.165.42.0 - 194.165.42.255 nl +194.165.42.0 - 194.165.42.255 gb 194.165.43.0 - 194.165.43.255 fr 194.165.44.0 - 194.165.44.255 ch 194.165.45.0 - 194.165.45.255 ru @@ -101613,9 +87362,8 @@ 194.165.52.0 - 194.165.52.255 at 194.165.53.0 - 194.165.53.255 ru 194.165.54.0 - 194.165.54.255 pl -194.165.55.0 - 194.165.56.255 dk +194.165.55.0 - 194.165.55.255 dk 194.165.57.0 - 194.165.57.255 cz -194.165.58.0 - 194.165.58.255 ru 194.165.59.0 - 194.165.59.255 se 194.165.60.0 - 194.165.60.255 gb 194.165.61.0 - 194.165.61.255 ru @@ -101623,26 +87371,26 @@ 194.165.64.0 - 194.165.95.255 nl 194.165.96.0 - 194.165.127.255 si 194.165.128.0 - 194.165.159.255 jo -194.165.160.0 - 194.165.191.47 ie -194.165.191.48 - 194.165.191.63 us -194.165.191.64 - 194.165.191.255 ie +194.165.160.0 - 194.165.191.255 ie 194.165.192.0 - 194.165.223.255 gb 194.165.224.0 - 194.165.255.255 se 194.166.0.0 - 194.166.255.255 at 194.167.0.0 - 194.167.255.255 fr 194.168.0.0 - 194.168.135.255 gb 194.168.136.0 - 194.168.136.255 us -194.168.137.0 - 194.169.124.255 gb +194.168.137.0 - 194.169.47.255 gb +194.169.50.0 - 194.169.50.255 gb +194.169.52.0 - 194.169.52.255 de +194.169.64.0 - 194.169.79.255 gb +194.169.96.0 - 194.169.119.255 gb +194.169.124.0 - 194.169.124.255 gb 194.169.125.0 - 194.169.125.255 pt 194.169.126.0 - 194.169.127.255 pl -194.169.128.0 - 194.169.182.255 gb +194.169.128.0 - 194.169.179.255 gb 194.169.183.0 - 194.169.183.255 fr -194.169.184.0 - 194.169.190.255 gb 194.169.191.0 - 194.169.191.255 ro 194.169.192.0 - 194.169.192.255 de -194.169.193.0 - 194.169.193.255 ua 194.169.194.0 - 194.169.195.255 gb -194.169.196.0 - 194.169.196.255 ie 194.169.197.0 - 194.169.197.255 gb 194.169.198.0 - 194.169.198.255 de 194.169.199.0 - 194.169.199.255 ch @@ -101656,34 +87404,29 @@ 194.169.210.0 - 194.169.210.255 ua 194.169.211.0 - 194.169.211.255 de 194.169.212.0 - 194.169.212.255 ro -194.169.213.0 - 194.169.213.255 pl 194.169.214.0 - 194.169.214.255 fr 194.169.215.0 - 194.169.215.255 pt -194.169.216.0 - 194.169.216.255 de -194.169.217.0 - 194.169.218.255 gb +194.169.216.0 - 194.169.217.255 de +194.169.218.0 - 194.169.218.255 gb 194.169.219.0 - 194.169.219.255 ch 194.169.220.0 - 194.169.220.255 pl 194.169.221.0 - 194.169.221.255 gb 194.169.222.0 - 194.169.222.255 de -194.169.223.0 - 194.169.223.255 ro 194.169.224.0 - 194.169.224.255 cz 194.169.225.0 - 194.169.225.255 se 194.169.226.0 - 194.169.229.255 pl -194.169.230.0 - 194.169.230.255 ru 194.169.231.0 - 194.169.231.255 bg 194.169.232.0 - 194.169.232.255 gr 194.169.233.0 - 194.169.233.255 ro 194.169.234.0 - 194.169.234.255 gb 194.169.235.0 - 194.169.235.255 ro -194.169.236.0 - 194.169.237.255 pl +194.169.236.0 - 194.169.236.255 pl 194.169.238.0 - 194.169.238.255 ua 194.169.239.0 - 194.169.239.255 de 194.169.240.0 - 194.169.240.255 fr 194.169.241.0 - 194.169.241.255 pl -194.169.242.0 - 194.169.242.255 ru 194.169.243.0 - 194.169.243.255 se 194.169.244.0 - 194.169.244.255 gb -194.169.245.0 - 194.169.245.255 eu 194.169.246.0 - 194.169.246.255 at 194.169.247.0 - 194.169.247.255 ru 194.169.248.0 - 194.169.248.255 nl @@ -101691,26 +87434,27 @@ 194.169.250.0 - 194.169.250.255 ru 194.169.251.0 - 194.169.251.255 de 194.169.252.0 - 194.169.252.255 cz -194.169.253.0 - 194.169.253.255 tr -194.169.254.0 - 194.169.255.255 gb +194.169.254.0 - 194.169.254.255 gb +194.169.255.0 - 194.169.255.255 ru 194.170.0.0 - 194.170.255.255 ae 194.171.0.0 - 194.171.255.255 nl -194.172.0.0 - 194.172.84.223 de -194.172.84.224 - 194.172.84.239 gb -194.172.84.240 - 194.176.31.255 de +194.172.0.0 - 194.173.19.255 de +194.173.20.0 - 194.173.20.255 eu +194.173.21.0 - 194.174.64.255 de +194.174.65.0 - 194.174.65.255 eu +194.174.66.0 - 194.175.242.255 de +194.175.243.0 - 194.175.243.255 eu +194.175.244.0 - 194.176.31.255 de 194.176.32.0 - 194.176.63.255 lt 194.176.64.0 - 194.176.95.255 gb 194.176.96.0 - 194.176.96.255 ru 194.176.97.0 - 194.176.97.255 ua -194.176.98.0 - 194.176.98.255 es -194.176.99.0 - 194.176.99.255 gb 194.176.100.0 - 194.176.100.255 ru 194.176.101.0 - 194.176.102.255 pl 194.176.103.0 - 194.176.103.255 fi 194.176.104.0 - 194.176.104.255 ch 194.176.105.0 - 194.176.105.255 gb 194.176.106.0 - 194.176.106.255 de -194.176.107.0 - 194.176.107.255 gb 194.176.108.0 - 194.176.108.255 kw 194.176.109.0 - 194.176.109.255 ch 194.176.110.0 - 194.176.110.255 be @@ -101720,18 +87464,15 @@ 194.176.114.0 - 194.176.114.255 ru 194.176.115.0 - 194.176.115.255 ro 194.176.116.0 - 194.176.116.255 ch -194.176.117.0 - 194.176.117.255 ua 194.176.118.0 - 194.176.118.255 ru 194.176.119.0 - 194.176.119.255 es -194.176.120.0 - 194.176.122.255 de -194.176.123.0 - 194.176.123.255 dk +194.176.120.0 - 194.176.123.255 de 194.176.124.0 - 194.176.125.255 gb 194.176.126.0 - 194.176.126.255 it 194.176.127.0 - 194.176.127.255 fr -194.176.128.0 - 194.176.128.255 gb -194.176.129.0 - 194.176.144.255 eu -194.176.145.0 - 194.176.149.239 gb -194.176.149.240 - 194.176.150.255 eu +194.176.128.0 - 194.176.144.255 eu +194.176.145.0 - 194.176.149.223 gb +194.176.149.224 - 194.176.150.255 eu 194.176.151.0 - 194.176.153.159 gb 194.176.153.160 - 194.176.153.175 eu 194.176.153.176 - 194.176.153.183 gb @@ -101748,7 +87489,9 @@ 194.176.154.224 - 194.176.154.231 eu 194.176.154.232 - 194.176.154.239 gb 194.176.154.240 - 194.176.154.255 eu -194.176.155.0 - 194.176.159.255 gb +194.176.155.0 - 194.176.155.255 gb +194.176.156.0 - 194.176.157.255 eu +194.176.158.0 - 194.176.159.255 gb 194.176.160.0 - 194.176.191.255 ro 194.176.192.0 - 194.176.223.255 gb 194.176.224.0 - 194.176.255.255 hu @@ -101760,68 +87503,49 @@ 194.177.20.0 - 194.177.23.255 ru 194.177.24.0 - 194.177.27.255 ua 194.177.28.0 - 194.177.31.255 pl -194.177.32.0 - 194.177.33.151 fr -194.177.33.152 - 194.177.33.154 nl -194.177.33.155 - 194.177.36.255 fr -194.177.37.0 - 194.177.37.79 lu -194.177.37.80 - 194.177.59.255 fr -194.177.60.0 - 194.177.62.255 nl -194.177.63.0 - 194.177.63.255 fr +194.177.32.0 - 194.177.63.255 fr 194.177.64.0 - 194.177.127.255 it 194.177.128.0 - 194.177.159.255 at 194.177.160.0 - 194.177.191.255 gb 194.177.192.0 - 194.177.223.255 gr 194.177.224.0 - 194.177.255.255 gl -194.178.0.0 - 194.178.111.79 nl -194.178.111.80 - 194.178.111.95 gb -194.178.111.96 - 194.178.255.255 nl +194.178.0.0 - 194.178.107.255 nl +194.178.108.0 - 194.178.108.255 se +194.178.109.0 - 194.178.255.255 nl 194.179.0.0 - 194.179.127.255 es 194.179.128.0 - 194.179.255.255 it -194.180.0.0 - 194.180.159.239 de +194.180.0.0 - 194.180.156.255 de 194.180.159.240 - 194.180.159.255 gb -194.180.160.0 - 194.180.226.151 de +194.180.160.0 - 194.180.223.255 de 194.180.226.152 - 194.180.226.159 ee -194.180.226.160 - 194.180.255.255 de +194.180.232.0 - 194.180.255.255 de 194.181.0.0 - 194.181.255.255 pl 194.182.0.0 - 194.182.255.255 dk 194.183.0.0 - 194.183.31.255 it 194.183.32.0 - 194.183.63.255 pl -194.183.64.0 - 194.183.91.255 sm -194.183.92.0 - 194.183.92.255 it -194.183.93.0 - 194.183.95.255 sm -194.183.96.0 - 194.183.101.255 gb -194.183.102.0 - 194.183.103.255 nl -194.183.104.0 - 194.183.108.255 gb -194.183.109.0 - 194.183.109.255 nl -194.183.110.0 - 194.183.111.79 gb -194.183.111.80 - 194.183.111.95 nl -194.183.111.96 - 194.183.120.103 gb -194.183.120.104 - 194.183.120.111 nl -194.183.120.112 - 194.183.121.255 gb -194.183.122.0 - 194.183.122.255 nl -194.183.123.0 - 194.183.127.255 gb +194.183.64.0 - 194.183.95.255 sm +194.183.96.0 - 194.183.96.255 gb +194.183.97.0 - 194.183.98.127 es +194.183.98.128 - 194.183.100.255 gb +194.183.101.0 - 194.183.101.31 cz +194.183.101.32 - 194.183.121.131 gb +194.183.121.132 - 194.183.121.132 nl +194.183.121.133 - 194.183.123.159 gb +194.183.123.160 - 194.183.123.163 nl +194.183.123.164 - 194.183.127.255 gb 194.183.128.0 - 194.183.159.255 at 194.183.160.0 - 194.183.191.255 ua 194.183.192.0 - 194.183.223.255 fr -194.183.224.0 - 194.183.242.207 be -194.183.242.208 - 194.183.242.215 fr -194.183.242.216 - 194.183.247.255 be +194.183.224.0 - 194.183.247.255 be 194.183.248.0 - 194.183.251.255 lu 194.183.252.0 - 194.183.255.255 be 194.184.0.0 - 194.185.255.255 it -194.186.0.0 - 194.186.152.255 ru -194.186.153.0 - 194.186.153.255 ua -194.186.154.0 - 194.186.236.79 ru -194.186.236.80 - 194.186.236.87 kz -194.186.236.88 - 194.186.245.255 ru -194.186.246.0 - 194.186.246.255 kz -194.186.247.0 - 194.186.255.255 ru +194.186.0.0 - 194.186.255.255 ru 194.187.0.0 - 194.187.15.255 no 194.187.16.0 - 194.187.19.255 de 194.187.20.0 - 194.187.23.255 ro -194.187.24.0 - 194.187.31.255 ua +194.187.28.0 - 194.187.31.255 ua 194.187.32.0 - 194.187.35.255 gb -194.187.36.0 - 194.187.39.255 ru 194.187.40.0 - 194.187.43.255 pl 194.187.44.0 - 194.187.47.255 nl 194.187.48.0 - 194.187.51.255 ua @@ -101839,9 +87563,11 @@ 194.187.96.0 - 194.187.99.255 nl 194.187.100.0 - 194.187.103.255 lv 194.187.104.0 - 194.187.111.255 ua -194.187.112.0 - 194.187.115.255 de +194.187.112.0 - 194.187.112.255 de +194.187.113.0 - 194.187.115.0 be +194.187.115.1 - 194.187.115.1 eu +194.187.115.2 - 194.187.115.255 be 194.187.116.0 - 194.187.119.255 pl -194.187.120.0 - 194.187.123.255 ro 194.187.124.0 - 194.187.127.255 it 194.187.128.0 - 194.187.131.255 ua 194.187.132.0 - 194.187.135.255 bg @@ -101851,12 +87577,11 @@ 194.187.148.0 - 194.187.155.255 ua 194.187.156.0 - 194.187.159.255 ch 194.187.160.0 - 194.187.167.255 de -194.187.168.0 - 194.187.171.255 pl +194.187.168.0 - 194.187.171.255 fr 194.187.172.0 - 194.187.175.255 it 194.187.176.0 - 194.187.179.255 at 194.187.180.0 - 194.187.183.255 pl 194.187.184.0 - 194.187.187.255 de -194.187.188.0 - 194.187.191.255 ro 194.187.192.0 - 194.187.195.255 fr 194.187.196.0 - 194.187.199.255 ru 194.187.200.0 - 194.187.203.255 pl @@ -101867,505 +87592,122 @@ 194.187.220.0 - 194.187.223.255 de 194.187.224.0 - 194.187.227.255 fr 194.187.228.0 - 194.187.231.255 ua -194.187.232.0 - 194.187.235.255 gb +194.187.232.0 - 194.187.235.255 fi 194.187.236.0 - 194.187.239.255 pl 194.187.240.0 - 194.187.243.255 de 194.187.244.0 - 194.187.247.255 kz -194.187.248.0 - 194.187.251.255 gb +194.187.248.0 - 194.187.248.255 eu +194.187.249.0 - 194.187.249.15 fr +194.187.249.16 - 194.187.249.127 eu +194.187.249.128 - 194.187.249.163 fr +194.187.249.164 - 194.187.249.255 eu +194.187.250.0 - 194.187.250.127 de +194.187.250.128 - 194.187.250.191 nl +194.187.250.192 - 194.187.250.247 gb +194.187.250.248 - 194.187.250.251 nl +194.187.250.252 - 194.187.251.7 be +194.187.251.8 - 194.187.251.15 eu +194.187.251.16 - 194.187.251.23 de +194.187.251.24 - 194.187.251.63 eu +194.187.251.64 - 194.187.251.71 gb +194.187.251.72 - 194.187.251.255 eu 194.187.252.0 - 194.187.255.255 it -194.188.0.0 - 194.188.64.255 fi -194.188.65.0 - 194.188.67.255 ax -194.188.68.0 - 194.188.255.255 fi +194.188.0.0 - 194.188.255.255 fi 194.189.0.0 - 194.189.255.255 gb 194.190.0.0 - 194.190.255.255 ru 194.191.0.0 - 194.191.255.255 ch -194.192.0.0 - 194.192.250.63 dk -194.192.250.64 - 194.192.250.127 ch -194.192.250.128 - 194.192.255.255 dk +194.192.0.0 - 194.192.22.32 dk +194.192.22.33 - 194.192.22.33 eu +194.192.22.34 - 194.192.255.255 dk 194.193.0.0 - 194.193.255.255 gb -194.194.0.0 - 194.194.0.255 de -194.194.1.0 - 194.194.16.255 gb -194.194.17.0 - 194.194.17.255 ie -194.194.18.0 - 194.194.18.255 de -194.194.19.0 - 194.194.40.255 gb -194.194.41.0 - 194.194.41.255 at -194.194.42.0 - 194.194.43.255 fr -194.194.44.0 - 194.194.53.255 de -194.194.54.0 - 194.194.54.31 gb -194.194.54.32 - 194.194.54.63 de -194.194.54.64 - 194.194.54.95 gb -194.194.54.96 - 194.194.54.127 za -194.194.54.128 - 194.194.55.255 gb -194.194.56.0 - 194.194.57.255 de -194.194.58.0 - 194.194.58.255 il -194.194.59.0 - 194.194.59.255 gb -194.194.60.0 - 194.194.60.255 at -194.194.61.0 - 194.194.61.191 ch -194.194.61.192 - 194.194.61.223 eu -194.194.61.224 - 194.194.61.255 ch -194.194.62.0 - 194.194.63.255 gb -194.194.64.0 - 194.194.73.255 fr -194.194.74.0 - 194.194.75.255 gb +194.194.0.0 - 194.194.27.255 eu +194.194.28.0 - 194.194.39.255 gb +194.194.40.0 - 194.194.67.255 eu +194.194.68.0 - 194.194.71.255 fr +194.194.72.0 - 194.194.75.255 eu 194.194.76.0 - 194.194.79.255 fr -194.194.80.0 - 194.194.93.255 de -194.194.94.0 - 194.194.95.255 gb -194.194.96.0 - 194.194.119.255 de -194.194.120.0 - 194.194.127.255 eu -194.194.128.0 - 194.194.131.255 de -194.194.132.0 - 194.194.137.255 fr -194.194.138.0 - 194.194.138.255 gb -194.194.139.0 - 194.194.139.255 fr +194.194.80.0 - 194.194.83.255 de +194.194.84.0 - 194.194.87.255 eu +194.194.88.0 - 194.194.91.255 de +194.194.92.0 - 194.194.103.255 eu +194.194.104.0 - 194.194.107.255 de +194.194.108.0 - 194.194.111.255 eu +194.194.112.0 - 194.194.115.255 de +194.194.116.0 - 194.194.131.255 eu +194.194.132.0 - 194.194.135.255 fr +194.194.136.0 - 194.194.139.255 eu 194.194.140.0 - 194.194.143.255 at -194.194.144.0 - 194.194.157.255 fr -194.194.158.0 - 194.194.158.191 rs -194.194.158.192 - 194.194.158.223 eu -194.194.158.224 - 194.194.158.239 fr -194.194.158.240 - 194.194.158.255 at -194.194.159.0 - 194.194.175.255 fr -194.194.176.0 - 194.194.180.255 nl -194.194.181.0 - 194.194.181.255 gb -194.194.182.0 - 194.194.186.255 nl -194.194.187.0 - 194.194.189.255 gb -194.194.190.0 - 194.194.190.255 ch -194.194.191.0 - 194.194.191.255 de -194.194.192.0 - 194.194.192.255 it -194.194.193.0 - 194.194.193.255 at -194.194.194.0 - 194.194.196.255 gb -194.194.197.0 - 194.194.197.255 de -194.194.198.0 - 194.194.198.127 it -194.194.198.128 - 194.194.198.255 de -194.194.199.0 - 194.194.199.255 fr -194.194.200.0 - 194.194.202.255 es -194.194.203.0 - 194.194.203.255 de -194.194.204.0 - 194.194.205.255 es -194.194.206.0 - 194.194.207.255 fr -194.194.208.0 - 194.194.208.255 be -194.194.209.0 - 194.194.209.255 de -194.194.210.0 - 194.194.215.255 gb -194.194.216.0 - 194.194.220.255 dk -194.194.221.0 - 194.194.221.255 nl -194.194.222.0 - 194.194.223.255 dk -194.194.224.0 - 194.194.225.255 at -194.194.226.0 - 194.194.226.255 se -194.194.227.0 - 194.194.227.255 no -194.194.228.0 - 194.194.230.255 at -194.194.231.0 - 194.194.231.255 nl -194.194.232.0 - 194.194.235.255 dk -194.194.236.0 - 194.194.237.255 de -194.194.238.0 - 194.194.238.255 fr -194.194.239.0 - 194.194.239.127 eu -194.194.239.128 - 194.194.239.255 za -194.194.240.0 - 194.194.240.255 fi -194.194.241.0 - 194.194.242.255 gb -194.194.243.0 - 194.194.243.255 no -194.194.244.0 - 194.194.244.255 gb -194.194.245.0 - 194.194.245.255 no -194.194.246.0 - 194.194.247.255 il -194.194.248.0 - 194.194.248.255 no -194.194.249.0 - 194.194.249.255 at -194.194.250.0 - 194.194.251.255 il -194.194.252.0 - 194.194.253.255 ch -194.194.254.0 - 194.194.255.255 at -194.195.0.0 - 194.195.8.255 de -194.195.9.0 - 194.195.9.31 gb -194.195.9.32 - 194.195.246.127 de -194.195.246.128 - 194.195.246.159 gb -194.195.246.160 - 194.195.255.255 de -194.196.0.0 - 194.196.1.255 gb -194.196.2.0 - 194.196.2.255 fr -194.196.3.0 - 194.196.3.255 be -194.196.4.0 - 194.196.4.255 nl -194.196.5.0 - 194.196.5.255 be -194.196.6.0 - 194.196.6.255 es -194.196.7.0 - 194.196.7.255 ru -194.196.8.0 - 194.196.9.79 de -194.196.9.80 - 194.196.9.95 eu -194.196.9.96 - 194.196.9.159 de -194.196.9.160 - 194.196.9.167 eu -194.196.9.168 - 194.196.9.255 de -194.196.10.0 - 194.196.10.255 eu -194.196.11.0 - 194.196.11.31 de -194.196.11.32 - 194.196.11.95 eu -194.196.11.96 - 194.196.11.255 de -194.196.12.0 - 194.196.12.255 it -194.196.13.0 - 194.196.13.255 eu -194.196.14.0 - 194.196.14.255 it -194.196.15.0 - 194.196.15.255 hu -194.196.16.0 - 194.196.16.255 cz -194.196.17.0 - 194.196.17.255 dk -194.196.18.0 - 194.196.18.143 be -194.196.18.144 - 194.196.18.151 eu -194.196.18.152 - 194.196.18.191 be -194.196.18.192 - 194.196.18.223 eu -194.196.18.224 - 194.196.18.255 be -194.196.19.0 - 194.196.19.255 gr -194.196.20.0 - 194.196.21.255 gb -194.196.22.0 - 194.196.22.255 sk -194.196.23.0 - 194.196.23.15 it -194.196.23.16 - 194.196.23.31 eu -194.196.23.32 - 194.196.23.95 fr -194.196.23.96 - 194.196.23.111 eu -194.196.23.112 - 194.196.23.207 it -194.196.23.208 - 194.196.23.223 gb -194.196.23.224 - 194.196.23.239 eu -194.196.23.240 - 194.196.23.255 it +194.194.144.0 - 194.194.147.255 eu +194.194.148.0 - 194.194.151.255 fr +194.194.152.0 - 194.194.159.255 eu +194.194.160.0 - 194.194.167.255 fr +194.194.168.0 - 194.194.171.255 eu +194.194.172.0 - 194.194.175.255 fr +194.194.176.0 - 194.194.215.255 eu +194.194.216.0 - 194.194.219.255 dk +194.194.220.0 - 194.194.255.255 eu +194.195.0.0 - 194.195.255.255 de +194.196.0.0 - 194.196.9.143 eu +194.196.9.144 - 194.196.9.147 gb +194.196.9.148 - 194.196.13.111 eu +194.196.13.112 - 194.196.13.127 fr +194.196.13.128 - 194.196.19.255 eu +194.196.20.0 - 194.196.23.247 gb +194.196.23.248 - 194.196.23.255 it 194.196.24.0 - 194.196.25.255 gb -194.196.26.0 - 194.196.27.255 de -194.196.28.0 - 194.196.28.255 eu -194.196.29.0 - 194.196.29.127 be -194.196.29.128 - 194.196.29.255 eu -194.196.30.0 - 194.196.30.255 it -194.196.31.0 - 194.196.31.255 be -194.196.32.0 - 194.196.34.15 no -194.196.34.16 - 194.196.34.63 eu -194.196.34.64 - 194.196.34.191 no -194.196.34.192 - 194.196.35.255 eu -194.196.36.0 - 194.196.36.255 gb -194.196.37.0 - 194.196.37.127 eu -194.196.37.128 - 194.196.37.255 gb -194.196.38.0 - 194.196.38.255 eu -194.196.39.0 - 194.196.41.255 gb -194.196.42.0 - 194.196.42.255 eu -194.196.43.0 - 194.196.43.255 be -194.196.44.0 - 194.196.45.255 eu -194.196.46.0 - 194.196.46.47 za -194.196.46.48 - 194.196.46.63 eu -194.196.46.64 - 194.196.46.79 za -194.196.46.80 - 194.196.46.95 eu -194.196.46.96 - 194.196.46.255 za -194.196.47.0 - 194.196.47.255 at -194.196.48.0 - 194.196.48.255 eu -194.196.49.0 - 194.196.49.191 it -194.196.49.192 - 194.196.49.255 eu -194.196.50.0 - 194.196.50.63 es -194.196.50.64 - 194.196.50.255 eu -194.196.51.0 - 194.196.51.255 es -194.196.52.0 - 194.196.52.255 be -194.196.53.0 - 194.196.53.255 dk -194.196.54.0 - 194.196.55.255 cz -194.196.56.0 - 194.196.56.255 nl -194.196.57.0 - 194.196.57.255 gb -194.196.58.0 - 194.196.58.255 ch -194.196.59.0 - 194.196.59.255 gb -194.196.60.0 - 194.196.60.255 ch -194.196.61.0 - 194.196.61.255 it -194.196.62.0 - 194.196.62.255 gr -194.196.63.0 - 194.196.63.255 eu -194.196.64.0 - 194.196.64.255 ie -194.196.65.0 - 194.196.65.255 eu -194.196.66.0 - 194.196.66.255 gb -194.196.67.0 - 194.196.67.255 se -194.196.68.0 - 194.196.68.255 gb -194.196.69.0 - 194.196.69.255 no -194.196.70.0 - 194.196.70.255 si -194.196.71.0 - 194.196.71.255 be -194.196.72.0 - 194.196.72.15 ru -194.196.72.16 - 194.196.72.31 eu -194.196.72.32 - 194.196.72.47 ru -194.196.72.48 - 194.196.72.63 eu -194.196.72.64 - 194.196.72.95 ru -194.196.72.96 - 194.196.72.127 eu -194.196.72.128 - 194.196.72.255 ru -194.196.73.0 - 194.196.73.255 gb -194.196.74.0 - 194.196.74.255 eu -194.196.75.0 - 194.196.75.255 be -194.196.76.0 - 194.196.76.255 de -194.196.77.0 - 194.196.77.255 si -194.196.78.0 - 194.196.78.7 eu -194.196.78.8 - 194.196.78.15 be -194.196.78.16 - 194.196.78.23 eu -194.196.78.24 - 194.196.78.31 be -194.196.78.32 - 194.196.78.47 fr -194.196.78.48 - 194.196.78.55 gb -194.196.78.56 - 194.196.78.127 be -194.196.78.128 - 194.196.79.255 eu -194.196.80.0 - 194.196.80.255 gb -194.196.81.0 - 194.196.81.255 de -194.196.82.0 - 194.196.82.255 dk -194.196.83.0 - 194.196.87.255 eu -194.196.88.0 - 194.196.88.255 gb -194.196.89.0 - 194.196.89.255 si -194.196.90.0 - 194.196.90.255 de -194.196.91.0 - 194.196.91.127 eu -194.196.91.128 - 194.196.91.143 bg -194.196.91.144 - 194.196.91.159 gb -194.196.91.160 - 194.196.91.175 eu -194.196.91.176 - 194.196.91.191 be -194.196.91.192 - 194.196.91.223 fr -194.196.91.224 - 194.196.91.255 gb -194.196.92.0 - 194.196.92.255 de -194.196.93.0 - 194.196.93.255 nl -194.196.94.0 - 194.196.94.255 ru -194.196.95.0 - 194.196.95.191 de -194.196.95.192 - 194.196.96.255 eu -194.196.97.0 - 194.196.98.255 nl -194.196.99.0 - 194.196.99.15 eu -194.196.99.16 - 194.196.99.63 at -194.196.99.64 - 194.196.99.159 eu -194.196.99.160 - 194.196.99.191 at -194.196.99.192 - 194.196.99.223 eu -194.196.99.224 - 194.196.99.255 at -194.196.100.0 - 194.196.101.255 gb -194.196.102.0 - 194.196.102.255 de -194.196.103.0 - 194.196.103.255 eu -194.196.104.0 - 194.196.104.255 fr -194.196.105.0 - 194.196.105.255 eu -194.196.106.0 - 194.196.106.255 gb -194.196.107.0 - 194.196.107.255 eu -194.196.108.0 - 194.196.108.255 de -194.196.109.0 - 194.196.109.255 pt -194.196.110.0 - 194.196.110.255 gb -194.196.111.0 - 194.196.112.255 eu -194.196.113.0 - 194.196.113.255 gb -194.196.114.0 - 194.196.116.255 eu -194.196.117.0 - 194.196.117.255 sk -194.196.118.0 - 194.196.119.255 gb -194.196.120.0 - 194.196.121.255 it -194.196.122.0 - 194.196.122.255 dk -194.196.123.0 - 194.196.125.255 eu -194.196.126.0 - 194.196.126.255 hu -194.196.127.0 - 194.196.127.15 ro -194.196.127.16 - 194.196.127.31 eu -194.196.127.32 - 194.196.127.95 ro -194.196.127.96 - 194.196.127.191 eu -194.196.127.192 - 194.196.127.223 ro -194.196.127.224 - 194.196.128.255 eu -194.196.129.0 - 194.196.129.255 gb -194.196.130.0 - 194.196.130.255 it -194.196.131.0 - 194.196.131.255 eu -194.196.132.0 - 194.196.133.255 ch -194.196.134.0 - 194.196.134.255 eu -194.196.135.0 - 194.196.135.255 it -194.196.136.0 - 194.196.137.255 eu -194.196.138.0 - 194.196.138.255 ch -194.196.139.0 - 194.196.139.31 es -194.196.139.32 - 194.196.139.47 eu -194.196.139.48 - 194.196.139.127 es -194.196.139.128 - 194.196.141.255 eu -194.196.142.0 - 194.196.142.255 sk -194.196.143.0 - 194.196.143.15 gb -194.196.143.16 - 194.196.143.31 eu -194.196.143.32 - 194.196.143.111 gb -194.196.143.112 - 194.196.143.127 eu -194.196.143.128 - 194.196.143.255 gb -194.196.144.0 - 194.196.144.23 es -194.196.144.24 - 194.196.144.31 eu -194.196.144.32 - 194.196.144.63 es -194.196.144.64 - 194.196.144.199 eu -194.196.144.200 - 194.196.144.215 es -194.196.144.216 - 194.196.144.223 eu -194.196.144.224 - 194.196.144.255 es -194.196.145.0 - 194.196.147.255 eu -194.196.148.0 - 194.196.148.31 ie -194.196.148.32 - 194.196.148.39 eu -194.196.148.40 - 194.196.148.47 gb -194.196.148.48 - 194.196.148.63 eu -194.196.148.64 - 194.196.148.103 ie -194.196.148.104 - 194.196.148.111 gb -194.196.148.112 - 194.196.148.143 ie -194.196.148.144 - 194.196.148.159 eu -194.196.148.160 - 194.196.148.255 ie -194.196.149.0 - 194.196.149.223 it -194.196.149.224 - 194.196.149.255 eu -194.196.150.0 - 194.196.151.255 gb -194.196.152.0 - 194.196.152.255 de -194.196.153.0 - 194.196.153.255 eu -194.196.154.0 - 194.196.154.255 gb -194.196.155.0 - 194.196.155.31 sk -194.196.155.32 - 194.196.155.159 eu -194.196.155.160 - 194.196.155.175 sk -194.196.155.176 - 194.196.155.191 eu -194.196.155.192 - 194.196.155.239 sk -194.196.155.240 - 194.196.155.247 eu -194.196.155.248 - 194.196.155.255 sk -194.196.156.0 - 194.196.159.255 eu -194.196.160.0 - 194.196.160.255 gb -194.196.161.0 - 194.196.161.15 eu -194.196.161.16 - 194.196.161.31 gr -194.196.161.32 - 194.196.161.79 eu -194.196.161.80 - 194.196.161.87 gr -194.196.161.88 - 194.196.161.95 eu -194.196.161.96 - 194.196.161.255 gr -194.196.162.0 - 194.196.162.15 gb -194.196.162.16 - 194.196.162.31 eu -194.196.162.32 - 194.196.162.111 gb -194.196.162.112 - 194.196.162.143 eu -194.196.162.144 - 194.196.164.255 gb -194.196.165.0 - 194.196.165.255 nl -194.196.166.0 - 194.196.167.47 gb -194.196.167.48 - 194.196.167.63 eu -194.196.167.64 - 194.196.167.255 gb +194.196.26.0 - 194.196.35.255 eu +194.196.36.0 - 194.196.39.255 gb +194.196.40.0 - 194.196.90.255 eu +194.196.91.0 - 194.196.91.255 gb +194.196.92.0 - 194.196.99.15 eu +194.196.99.16 - 194.196.99.31 at +194.196.99.32 - 194.196.127.103 eu +194.196.127.104 - 194.196.127.111 ro +194.196.127.112 - 194.196.127.223 eu +194.196.127.224 - 194.196.127.231 ro +194.196.127.232 - 194.196.127.239 eu +194.196.127.240 - 194.196.127.255 ro +194.196.128.0 - 194.196.144.79 eu +194.196.144.80 - 194.196.144.143 es +194.196.144.144 - 194.196.148.47 eu +194.196.148.48 - 194.196.148.63 ie +194.196.148.64 - 194.196.159.255 eu +194.196.160.0 - 194.196.163.255 gb +194.196.164.0 - 194.196.165.255 eu +194.196.166.0 - 194.196.167.255 gb 194.196.168.0 - 194.196.175.255 eu -194.196.176.0 - 194.196.181.255 za -194.196.182.0 - 194.196.182.255 de -194.196.183.0 - 194.196.183.255 no -194.196.184.0 - 194.196.184.159 de -194.196.184.160 - 194.196.184.191 eu -194.196.184.192 - 194.196.184.255 de -194.196.185.0 - 194.196.185.255 eu -194.196.186.0 - 194.196.186.255 at -194.196.187.0 - 194.196.187.15 fr -194.196.187.16 - 194.196.187.23 eu -194.196.187.24 - 194.196.187.103 fr -194.196.187.104 - 194.196.187.111 eu -194.196.187.112 - 194.196.187.183 fr -194.196.187.184 - 194.196.187.191 eu -194.196.187.192 - 194.196.187.255 fr -194.196.188.0 - 194.196.189.95 de -194.196.189.96 - 194.196.189.127 eu -194.196.189.128 - 194.196.189.159 de -194.196.189.160 - 194.196.189.255 eu -194.196.190.0 - 194.196.190.159 de -194.196.190.160 - 194.196.190.207 eu -194.196.190.208 - 194.196.190.255 de -194.196.191.0 - 194.196.191.255 eu -194.196.192.0 - 194.196.192.15 nl -194.196.192.16 - 194.196.192.31 eu -194.196.192.32 - 194.196.192.47 gb -194.196.192.48 - 194.196.192.55 be -194.196.192.56 - 194.196.192.63 eu -194.196.192.64 - 194.196.192.95 be +194.196.176.0 - 194.196.179.255 za +194.196.180.0 - 194.196.192.95 eu 194.196.192.96 - 194.196.192.127 gb -194.196.192.128 - 194.196.192.191 be -194.196.192.192 - 194.196.192.223 eu -194.196.192.224 - 194.196.192.255 gb -194.196.193.0 - 194.196.194.255 be -194.196.195.0 - 194.196.195.255 eu -194.196.196.0 - 194.196.196.255 at -194.196.197.0 - 194.196.197.227 ch -194.196.197.228 - 194.196.197.231 eu -194.196.197.232 - 194.196.197.239 ch -194.196.197.240 - 194.196.197.255 eu -194.196.198.0 - 194.196.198.127 cy -194.196.198.128 - 194.196.198.255 ch -194.196.199.0 - 194.196.199.255 eu -194.196.200.0 - 194.196.200.255 gb -194.196.201.0 - 194.196.201.255 eu -194.196.202.0 - 194.196.202.7 hu -194.196.202.8 - 194.196.202.15 eu -194.196.202.16 - 194.196.202.39 hu -194.196.202.40 - 194.196.202.63 eu -194.196.202.64 - 194.196.202.95 hu -194.196.202.96 - 194.196.202.111 eu -194.196.202.112 - 194.196.202.127 hu -194.196.202.128 - 194.196.202.191 eu -194.196.202.192 - 194.196.202.207 hu -194.196.202.208 - 194.196.202.255 eu -194.196.203.0 - 194.196.204.183 gb -194.196.204.184 - 194.196.204.191 eu -194.196.204.192 - 194.196.205.255 gb -194.196.206.0 - 194.196.207.255 eu -194.196.208.0 - 194.196.209.255 fr -194.196.210.0 - 194.196.210.255 eu -194.196.211.0 - 194.196.211.255 nl -194.196.212.0 - 194.196.212.255 eu -194.196.213.0 - 194.196.213.255 be -194.196.214.0 - 194.196.214.255 eu -194.196.215.0 - 194.196.215.255 cz -194.196.216.0 - 194.196.217.255 sk -194.196.218.0 - 194.196.219.255 eu -194.196.220.0 - 194.196.220.31 fr -194.196.220.32 - 194.196.220.47 eu -194.196.220.48 - 194.196.220.223 fr -194.196.220.224 - 194.196.220.231 eu -194.196.220.232 - 194.196.220.255 fr -194.196.221.0 - 194.196.221.255 eu -194.196.222.0 - 194.196.222.95 fr -194.196.222.96 - 194.196.222.111 eu -194.196.222.112 - 194.196.222.183 fr -194.196.222.184 - 194.196.222.223 eu -194.196.222.224 - 194.196.222.255 fr -194.196.223.0 - 194.196.223.255 eu -194.196.224.0 - 194.196.224.255 be -194.196.225.0 - 194.196.228.7 eu -194.196.228.8 - 194.196.228.31 pl -194.196.228.32 - 194.196.228.63 eu -194.196.228.64 - 194.196.228.135 pl -194.196.228.136 - 194.196.228.191 eu -194.196.228.192 - 194.196.228.199 pl -194.196.228.200 - 194.196.228.207 eu -194.196.228.208 - 194.196.228.223 pl -194.196.228.224 - 194.196.228.239 eu -194.196.228.240 - 194.196.228.247 pl -194.196.228.248 - 194.196.230.79 eu -194.196.230.80 - 194.196.230.95 pl -194.196.230.96 - 194.196.232.31 eu -194.196.232.32 - 194.196.234.255 gb -194.196.235.0 - 194.196.235.255 de -194.196.236.0 - 194.196.237.255 nl -194.196.238.0 - 194.196.239.255 ch -194.196.240.0 - 194.196.245.255 eu -194.196.246.0 - 194.196.246.255 ie -194.196.247.0 - 194.196.248.255 de -194.196.249.0 - 194.196.249.255 se -194.196.250.0 - 194.196.250.255 eu -194.196.251.0 - 194.196.251.31 cz -194.196.251.32 - 194.196.251.111 eu -194.196.251.112 - 194.196.251.255 cz -194.196.252.0 - 194.196.252.255 eu -194.196.253.0 - 194.196.253.255 gb -194.196.254.0 - 194.196.254.255 fr -194.196.255.0 - 194.196.255.31 eu -194.196.255.32 - 194.196.255.255 fr +194.196.192.128 - 194.196.220.31 eu +194.196.220.32 - 194.196.220.47 fr +194.196.220.48 - 194.196.222.95 eu +194.196.222.96 - 194.196.222.111 fr +194.196.222.112 - 194.196.230.95 eu +194.196.230.96 - 194.196.230.127 pl +194.196.230.128 - 194.196.231.255 eu +194.196.232.0 - 194.196.233.255 gb +194.196.234.0 - 194.196.255.255 eu 194.197.0.0 - 194.197.3.255 fi 194.197.4.0 - 194.197.7.255 se -194.197.8.0 - 194.197.79.239 fi -194.197.79.240 - 194.197.79.243 lv -194.197.79.244 - 194.197.79.247 no -194.197.79.248 - 194.197.79.251 dk -194.197.79.252 - 194.197.79.255 se -194.197.80.0 - 194.197.83.255 fi -194.197.84.0 - 194.197.84.255 se -194.197.85.0 - 194.197.151.159 fi -194.197.151.160 - 194.197.151.191 ax -194.197.151.192 - 194.197.198.255 fi -194.197.199.0 - 194.197.199.255 be -194.197.200.0 - 194.197.200.63 fi +194.197.8.0 - 194.197.200.63 fi 194.197.200.64 - 194.197.200.95 se -194.197.200.96 - 194.197.200.159 fi -194.197.200.160 - 194.197.200.223 se -194.197.200.224 - 194.197.207.255 fi -194.197.208.0 - 194.197.208.255 ax -194.197.209.0 - 194.197.209.255 de -194.197.210.0 - 194.197.210.255 be -194.197.211.0 - 194.197.215.79 fi -194.197.215.80 - 194.197.215.83 ax -194.197.215.84 - 194.197.217.255 fi -194.197.218.0 - 194.197.218.255 nl -194.197.219.0 - 194.197.255.255 fi -194.198.0.0 - 194.198.17.255 se -194.198.18.0 - 194.198.19.255 no -194.198.20.0 - 194.198.22.255 se -194.198.23.0 - 194.198.23.255 no -194.198.24.0 - 194.198.29.255 se -194.198.30.0 - 194.198.30.255 no -194.198.31.0 - 194.198.31.255 se -194.198.32.0 - 194.198.32.255 no -194.198.33.0 - 194.198.38.15 se -194.198.38.16 - 194.198.38.31 no -194.198.38.32 - 194.198.38.63 se -194.198.38.64 - 194.198.38.95 no -194.198.38.96 - 194.198.39.15 se -194.198.39.16 - 194.198.39.31 no -194.198.39.32 - 194.198.40.31 se -194.198.40.32 - 194.198.40.47 no -194.198.40.48 - 194.198.40.79 se -194.198.40.80 - 194.198.40.95 no -194.198.40.96 - 194.198.40.111 se -194.198.40.112 - 194.198.40.143 no -194.198.40.144 - 194.198.120.255 se -194.198.121.0 - 194.198.121.255 no -194.198.122.0 - 194.198.122.255 se -194.198.123.0 - 194.198.123.255 no -194.198.124.0 - 194.198.147.255 se -194.198.148.0 - 194.198.148.255 dk -194.198.149.0 - 194.198.255.255 se -194.199.0.0 - 194.199.255.255 fr -194.200.0.0 - 194.201.252.255 gb -194.201.253.0 - 194.201.253.255 ke -194.201.254.0 - 194.203.255.255 gb +194.197.200.96 - 194.197.255.255 fi +194.198.0.0 - 194.198.255.255 se +194.199.0.0 - 194.199.92.255 fr +194.199.93.0 - 194.199.93.255 gp +194.199.94.0 - 194.199.97.255 fr +194.199.98.0 - 194.199.98.255 mq +194.199.99.0 - 194.199.255.255 fr +194.200.0.0 - 194.202.235.255 gb +194.202.236.0 - 194.202.236.255 eu +194.202.237.0 - 194.203.215.253 gb +194.203.215.254 - 194.203.215.254 eu +194.203.215.255 - 194.203.255.255 gb 194.204.0.0 - 194.204.63.255 ee -194.204.64.0 - 194.204.95.255 ch +194.204.64.0 - 194.204.70.2 ch +194.204.70.3 - 194.204.70.3 eu +194.204.70.4 - 194.204.95.255 ch 194.204.96.0 - 194.204.127.255 mt 194.204.128.0 - 194.204.191.255 pl 194.204.192.0 - 194.204.255.255 ma @@ -102394,14 +87736,16 @@ 194.205.33.0 - 194.205.38.255 eu 194.205.39.0 - 194.205.39.255 us 194.205.40.0 - 194.205.45.63 eu -194.205.45.64 - 194.205.46.255 gb +194.205.45.64 - 194.205.45.95 gb +194.205.45.96 - 194.205.45.191 eu +194.205.45.192 - 194.205.46.95 gb +194.205.46.96 - 194.205.46.127 eu +194.205.46.128 - 194.205.46.255 gb 194.205.47.0 - 194.205.48.255 eu 194.205.49.0 - 194.205.49.63 gb 194.205.49.64 - 194.205.49.191 eu 194.205.49.192 - 194.205.50.31 gb -194.205.50.32 - 194.205.57.255 eu -194.205.58.0 - 194.205.58.255 gb -194.205.59.0 - 194.205.63.255 eu +194.205.50.32 - 194.205.63.255 eu 194.205.64.0 - 194.205.64.31 gb 194.205.64.32 - 194.205.64.151 eu 194.205.64.152 - 194.205.64.191 gb @@ -102440,18 +87784,16 @@ 194.205.85.64 - 194.205.85.127 eu 194.205.85.128 - 194.205.85.255 gb 194.205.86.0 - 194.205.89.255 eu -194.205.90.0 - 194.205.90.23 gb -194.205.90.24 - 194.205.90.31 eu -194.205.90.32 - 194.205.90.63 gb -194.205.90.64 - 194.205.91.255 eu +194.205.90.0 - 194.205.90.31 gb +194.205.90.32 - 194.205.91.255 eu 194.205.92.0 - 194.205.92.23 gb -194.205.92.24 - 194.205.92.31 de -194.205.92.32 - 194.205.92.127 gb -194.205.92.128 - 194.205.92.135 de -194.205.92.136 - 194.205.93.255 gb -194.205.94.0 - 194.205.94.255 eu -194.205.95.0 - 194.205.95.255 gb -194.205.96.0 - 194.205.96.223 eu +194.205.92.24 - 194.205.92.31 eu +194.205.92.32 - 194.205.92.63 gb +194.205.92.64 - 194.205.92.135 eu +194.205.92.136 - 194.205.92.207 gb +194.205.92.208 - 194.205.92.215 eu +194.205.92.216 - 194.205.93.255 gb +194.205.94.0 - 194.205.96.223 eu 194.205.96.224 - 194.205.98.255 gb 194.205.99.0 - 194.205.99.31 eu 194.205.99.32 - 194.205.99.63 gb @@ -102479,11 +87821,7 @@ 194.205.109.192 - 194.205.110.127 gb 194.205.110.128 - 194.205.111.127 eu 194.205.111.128 - 194.205.111.191 gb -194.205.111.192 - 194.205.113.31 eu -194.205.113.32 - 194.205.113.63 gb -194.205.113.64 - 194.205.113.255 eu -194.205.114.0 - 194.205.114.63 gb -194.205.114.64 - 194.205.117.39 eu +194.205.111.192 - 194.205.117.39 eu 194.205.117.40 - 194.205.117.47 gb 194.205.117.48 - 194.205.117.55 eu 194.205.117.56 - 194.205.117.63 gb @@ -102491,9 +87829,7 @@ 194.205.120.0 - 194.205.120.255 gb 194.205.121.0 - 194.205.122.255 eu 194.205.123.0 - 194.205.124.255 gb -194.205.125.0 - 194.205.125.7 eu -194.205.125.8 - 194.205.125.23 gb -194.205.125.24 - 194.205.125.191 eu +194.205.125.0 - 194.205.125.191 eu 194.205.125.192 - 194.205.125.207 gb 194.205.125.208 - 194.205.130.255 eu 194.205.131.0 - 194.205.131.127 gb @@ -102508,51 +87844,45 @@ 194.205.143.240 - 194.205.143.255 gb 194.205.144.0 - 194.205.154.255 eu 194.205.155.0 - 194.205.155.79 gb -194.205.155.80 - 194.205.155.127 eu -194.205.155.128 - 194.205.155.143 gb -194.205.155.144 - 194.205.155.159 eu +194.205.155.80 - 194.205.155.159 eu 194.205.155.160 - 194.205.155.175 gb 194.205.155.176 - 194.205.156.175 eu 194.205.156.176 - 194.205.156.183 gb 194.205.156.184 - 194.205.160.79 eu 194.205.160.80 - 194.205.160.119 gb -194.205.160.120 - 194.205.160.127 eu -194.205.160.128 - 194.205.160.143 gb -194.205.160.144 - 194.205.160.151 eu +194.205.160.120 - 194.205.160.151 eu 194.205.160.152 - 194.205.160.175 gb 194.205.160.176 - 194.205.160.207 eu -194.205.160.208 - 194.205.160.239 gb +194.205.160.208 - 194.205.160.215 gb +194.205.160.216 - 194.205.160.223 eu +194.205.160.224 - 194.205.160.239 gb 194.205.160.240 - 194.205.164.127 eu 194.205.164.128 - 194.205.164.191 gb 194.205.164.192 - 194.205.164.255 eu 194.205.165.0 - 194.205.165.31 gb 194.205.165.32 - 194.205.165.63 eu 194.205.165.64 - 194.205.165.95 gb -194.205.165.96 - 194.205.165.239 eu -194.205.165.240 - 194.205.165.247 gb -194.205.165.248 - 194.205.166.135 eu +194.205.165.96 - 194.205.166.135 eu 194.205.166.136 - 194.205.166.139 gb 194.205.166.140 - 194.205.166.151 eu 194.205.166.152 - 194.205.166.159 it -194.205.166.160 - 194.205.166.175 eu -194.205.166.176 - 194.205.166.191 gb +194.205.166.160 - 194.205.166.183 eu +194.205.166.184 - 194.205.166.191 gb 194.205.166.192 - 194.205.166.207 eu 194.205.166.208 - 194.205.166.247 gb 194.205.166.248 - 194.205.170.255 eu 194.205.171.0 - 194.205.171.63 gb 194.205.171.64 - 194.205.171.127 eu 194.205.171.128 - 194.205.171.191 gb -194.205.171.192 - 194.205.173.191 eu -194.205.173.192 - 194.205.173.255 gb -194.205.174.0 - 194.205.174.191 eu +194.205.171.192 - 194.205.174.191 eu 194.205.174.192 - 194.205.174.199 gb 194.205.174.200 - 194.205.174.215 eu 194.205.174.216 - 194.205.174.223 gb 194.205.174.224 - 194.205.174.231 eu 194.205.174.232 - 194.205.174.247 gb 194.205.174.248 - 194.205.175.223 eu -194.205.175.224 - 194.205.175.239 gb -194.205.175.240 - 194.205.175.247 eu +194.205.175.224 - 194.205.175.231 gb +194.205.175.232 - 194.205.175.247 eu 194.205.175.248 - 194.205.176.255 gb 194.205.177.0 - 194.205.177.255 eu 194.205.178.0 - 194.205.178.31 gb @@ -102562,9 +87892,7 @@ 194.205.178.160 - 194.205.178.255 gb 194.205.179.0 - 194.205.179.31 eu 194.205.179.32 - 194.205.179.39 gb -194.205.179.40 - 194.205.179.47 eu -194.205.179.48 - 194.205.179.63 gb -194.205.179.64 - 194.205.184.47 eu +194.205.179.40 - 194.205.184.47 eu 194.205.184.48 - 194.205.184.63 gb 194.205.184.64 - 194.205.187.111 eu 194.205.187.112 - 194.205.187.127 gb @@ -102592,23 +87920,15 @@ 194.205.206.224 - 194.205.206.255 gb 194.205.207.0 - 194.205.207.175 eu 194.205.207.176 - 194.205.207.183 gb -194.205.207.184 - 194.205.209.255 eu -194.205.210.0 - 194.205.210.255 gb -194.205.211.0 - 194.205.217.15 eu -194.205.217.16 - 194.205.217.31 gb -194.205.217.32 - 194.205.217.159 eu -194.205.217.160 - 194.205.217.175 gb -194.205.217.176 - 194.205.218.255 eu -194.205.219.0 - 194.205.220.255 gb -194.205.221.0 - 194.205.223.39 eu -194.205.223.40 - 194.205.223.47 gb -194.205.223.48 - 194.205.223.55 eu -194.205.223.56 - 194.205.223.63 gb -194.205.223.64 - 194.205.226.63 eu +194.205.207.184 - 194.205.207.255 eu +194.205.208.0 - 194.205.223.255 gb +194.205.224.0 - 194.205.225.255 eu +194.205.226.0 - 194.205.226.31 gb +194.205.226.32 - 194.205.226.63 eu 194.205.226.64 - 194.205.226.71 gb 194.205.226.72 - 194.205.226.87 eu -194.205.226.88 - 194.205.226.103 gb -194.205.226.104 - 194.205.227.127 eu +194.205.226.88 - 194.205.226.95 gb +194.205.226.96 - 194.205.227.127 eu 194.205.227.128 - 194.205.227.255 gb 194.205.228.0 - 194.205.231.191 eu 194.205.231.192 - 194.205.231.255 gb @@ -102624,9 +87944,7 @@ 194.205.241.160 - 194.205.241.175 gb 194.205.241.176 - 194.205.241.191 eu 194.205.241.192 - 194.205.241.207 gb -194.205.241.208 - 194.205.242.31 eu -194.205.242.32 - 194.205.242.63 gb -194.205.242.64 - 194.205.242.127 eu +194.205.241.208 - 194.205.242.127 eu 194.205.242.128 - 194.205.242.159 gb 194.205.242.160 - 194.205.243.63 eu 194.205.243.64 - 194.205.243.127 gb @@ -102636,29 +87954,17 @@ 194.205.248.192 - 194.205.248.223 gb 194.205.248.224 - 194.205.254.255 eu 194.205.255.0 - 194.205.255.255 gb -194.206.0.0 - 194.206.215.255 fr -194.206.216.0 - 194.206.216.255 ch -194.206.217.0 - 194.206.255.255 fr +194.206.0.0 - 194.206.255.255 fr 194.207.0.0 - 194.207.255.255 gb -194.208.0.0 - 194.208.52.255 at -194.208.53.0 - 194.208.55.255 ch -194.208.56.0 - 194.208.58.255 at -194.208.59.0 - 194.208.64.255 ch -194.208.65.0 - 194.208.65.255 at -194.208.66.0 - 194.208.66.255 ch -194.208.67.0 - 194.208.68.255 at -194.208.69.0 - 194.208.69.255 ch -194.208.70.0 - 194.208.70.255 at -194.208.71.0 - 194.208.72.255 ch -194.208.73.0 - 194.208.255.255 at +194.208.0.0 - 194.208.59.255 at +194.208.60.0 - 194.208.63.255 ch +194.208.64.0 - 194.208.205.255 at +194.208.206.0 - 194.208.206.255 li +194.208.207.0 - 194.208.255.255 at 194.209.0.0 - 194.209.255.255 ch 194.210.0.0 - 194.210.255.255 pt 194.211.0.0 - 194.211.255.255 fi -194.212.0.0 - 194.212.118.55 cz -194.212.118.56 - 194.212.118.63 cr -194.212.118.64 - 194.212.213.223 cz -194.212.213.224 - 194.212.213.235 cr -194.212.213.236 - 194.212.255.255 cz +194.212.0.0 - 194.212.255.255 cz 194.213.0.0 - 194.213.0.255 de 194.213.1.0 - 194.213.1.255 pl 194.213.2.0 - 194.213.2.255 de @@ -102667,22 +87973,17 @@ 194.213.5.0 - 194.213.5.255 de 194.213.6.0 - 194.213.6.255 ro 194.213.7.0 - 194.213.7.255 ch -194.213.8.0 - 194.213.8.255 fr -194.213.9.0 - 194.213.10.255 lv +194.213.9.0 - 194.213.9.255 lv 194.213.11.0 - 194.213.11.255 at 194.213.12.0 - 194.213.12.255 ru -194.213.13.0 - 194.213.13.255 cz 194.213.14.0 - 194.213.14.255 be 194.213.15.0 - 194.213.15.255 nl 194.213.16.0 - 194.213.16.255 ro -194.213.17.0 - 194.213.17.255 pl -194.213.18.0 - 194.213.18.255 gr +194.213.18.0 - 194.213.18.255 gb 194.213.19.0 - 194.213.19.255 es -194.213.20.0 - 194.213.20.255 de 194.213.21.0 - 194.213.21.255 ru 194.213.22.0 - 194.213.22.255 pl 194.213.23.0 - 194.213.23.255 ua -194.213.24.0 - 194.213.24.255 kz 194.213.25.0 - 194.213.25.255 ru 194.213.26.0 - 194.213.26.255 pl 194.213.27.0 - 194.213.27.255 de @@ -102709,37 +88010,12 @@ 194.213.126.0 - 194.213.127.255 nl 194.213.128.0 - 194.213.191.255 no 194.213.192.0 - 194.213.255.255 cz -194.214.0.0 - 194.214.172.255 fr -194.214.173.0 - 194.214.173.255 a2 -194.214.174.0 - 194.214.252.255 fr -194.214.253.0 - 194.214.255.255 pf -194.215.0.0 - 194.215.23.31 fi -194.215.23.32 - 194.215.23.95 se -194.215.23.96 - 194.215.23.159 fi -194.215.23.160 - 194.215.23.191 se -194.215.23.192 - 194.215.42.255 fi -194.215.43.0 - 194.215.43.255 se -194.215.44.0 - 194.215.45.255 fi -194.215.46.0 - 194.215.46.255 se -194.215.47.0 - 194.215.106.239 fi -194.215.106.240 - 194.215.106.255 ax -194.215.107.0 - 194.215.179.255 fi -194.215.180.0 - 194.215.180.255 gb -194.215.181.0 - 194.215.196.255 fi -194.215.197.0 - 194.215.197.255 se -194.215.198.0 - 194.215.242.255 fi -194.215.243.0 - 194.215.243.255 ru -194.215.244.0 - 194.215.255.255 fi -194.216.0.0 - 194.217.219.255 gb -194.217.220.0 - 194.217.221.255 nl -194.217.222.0 - 194.217.255.255 gb -194.218.0.0 - 194.218.200.135 se -194.218.200.136 - 194.218.200.139 gb -194.218.200.140 - 194.218.217.39 se -194.218.217.40 - 194.218.217.47 gb -194.218.217.48 - 194.218.253.35 se -194.218.253.36 - 194.218.253.39 no -194.218.253.40 - 194.218.255.255 se +194.214.0.0 - 194.214.252.255 fr +194.214.253.0 - 194.214.253.255 pf +194.214.254.0 - 194.214.255.255 fr +194.215.0.0 - 194.215.255.255 fi +194.216.0.0 - 194.217.255.255 gb +194.218.0.0 - 194.218.255.255 se 194.219.0.0 - 194.219.255.255 gr 194.220.0.0 - 194.220.255.255 ru 194.221.0.0 - 194.221.4.255 eu @@ -102775,11 +88051,13 @@ 194.221.63.0 - 194.221.63.183 eu 194.221.63.184 - 194.221.63.191 ch 194.221.63.192 - 194.221.63.255 eu -194.221.64.0 - 194.221.65.127 gb -194.221.65.128 - 194.221.67.255 nl +194.221.64.0 - 194.221.65.255 gb +194.221.66.0 - 194.221.66.15 de +194.221.66.16 - 194.221.67.255 nl 194.221.68.0 - 194.221.68.255 gb 194.221.69.0 - 194.221.69.255 de -194.221.70.0 - 194.221.72.255 eu +194.221.70.0 - 194.221.70.255 fr +194.221.71.0 - 194.221.72.255 eu 194.221.73.0 - 194.221.73.255 de 194.221.74.0 - 194.221.74.255 gb 194.221.75.0 - 194.221.75.255 fr @@ -102790,15 +88068,19 @@ 194.221.80.64 - 194.221.80.255 eu 194.221.81.0 - 194.221.81.255 gb 194.221.82.0 - 194.221.83.255 eu -194.221.84.0 - 194.221.84.191 fr -194.221.84.192 - 194.221.84.223 eu +194.221.84.0 - 194.221.84.215 fr +194.221.84.216 - 194.221.84.223 eu 194.221.84.224 - 194.221.85.15 de 194.221.85.16 - 194.221.85.31 gb 194.221.85.32 - 194.221.85.95 de -194.221.85.96 - 194.221.85.191 eu +194.221.85.96 - 194.221.85.191 fr 194.221.85.192 - 194.221.85.207 de -194.221.85.208 - 194.221.85.223 fr -194.221.85.224 - 194.221.86.255 gb +194.221.85.208 - 194.221.85.215 eu +194.221.85.216 - 194.221.85.223 fr +194.221.85.224 - 194.221.85.224 gb +194.221.85.225 - 194.221.85.225 eu +194.221.85.226 - 194.221.85.255 gb +194.221.86.0 - 194.221.86.255 fr 194.221.87.0 - 194.221.87.255 de 194.221.88.0 - 194.221.89.255 eu 194.221.90.0 - 194.221.90.63 de @@ -102812,8 +88094,8 @@ 194.221.106.240 - 194.221.106.247 de 194.221.106.248 - 194.221.108.255 eu 194.221.109.0 - 194.221.109.255 de -194.221.110.0 - 194.221.110.39 gb -194.221.110.40 - 194.221.110.63 eu +194.221.110.0 - 194.221.110.55 gb +194.221.110.56 - 194.221.110.63 eu 194.221.110.64 - 194.221.110.127 gb 194.221.110.128 - 194.221.110.255 eu 194.221.111.0 - 194.221.112.255 es @@ -102829,7 +88111,9 @@ 194.221.119.32 - 194.221.119.63 de 194.221.119.64 - 194.221.119.95 eu 194.221.119.96 - 194.221.119.127 de -194.221.119.128 - 194.221.128.103 eu +194.221.119.128 - 194.221.119.255 eu +194.221.120.0 - 194.221.123.255 gb +194.221.124.0 - 194.221.128.103 eu 194.221.128.104 - 194.221.128.107 de 194.221.128.108 - 194.221.128.239 eu 194.221.128.240 - 194.221.128.247 de @@ -102879,9 +88163,7 @@ 194.221.230.0 - 194.221.230.255 de 194.221.231.0 - 194.221.231.159 eu 194.221.231.160 - 194.221.231.175 de -194.221.231.176 - 194.221.231.183 eu -194.221.231.184 - 194.221.231.187 de -194.221.231.188 - 194.221.231.255 eu +194.221.231.176 - 194.221.231.255 eu 194.221.232.0 - 194.221.233.255 de 194.221.234.0 - 194.221.247.255 eu 194.221.248.0 - 194.221.248.7 de @@ -102900,189 +88182,38 @@ 194.221.254.0 - 194.221.255.255 eu 194.222.0.0 - 194.223.255.255 gb 194.224.0.0 - 194.224.255.255 es -194.225.0.0 - 194.225.119.255 ir -194.225.120.0 - 194.225.120.255 ae -194.225.121.0 - 194.225.255.255 ir +194.225.0.0 - 194.225.255.255 ir 194.226.0.0 - 194.226.119.255 ru -194.226.120.0 - 194.226.126.255 by -194.226.127.0 - 194.226.255.255 ru +194.226.120.0 - 194.226.125.255 by +194.226.126.0 - 194.226.255.255 ru 194.227.0.0 - 194.227.255.255 gb -194.228.0.0 - 194.228.112.15 cz -194.228.112.16 - 194.228.112.31 cr -194.228.112.32 - 194.228.190.255 cz -194.228.191.0 - 194.228.191.255 gb -194.228.192.0 - 194.228.255.255 cz +194.228.0.0 - 194.228.255.255 cz 194.229.0.0 - 194.229.255.255 nl 194.230.0.0 - 194.230.255.255 ch -194.231.0.0 - 194.231.67.191 de -194.231.67.192 - 194.231.67.207 nl -194.231.67.208 - 194.231.255.255 de +194.231.0.0 - 194.231.255.255 de 194.232.0.0 - 194.232.255.255 at -194.233.0.0 - 194.233.48.111 de -194.233.48.112 - 194.233.48.115 es -194.233.48.116 - 194.233.111.183 de -194.233.111.184 - 194.233.111.187 es -194.233.111.188 - 194.233.198.255 de -194.233.199.0 - 194.233.199.31 gb -194.233.199.32 - 194.233.255.255 de -194.234.0.0 - 194.234.8.127 eu -194.234.8.128 - 194.234.8.255 dk -194.234.9.0 - 194.234.26.255 eu -194.234.27.0 - 194.234.27.255 dk -194.234.28.0 - 194.234.32.195 eu -194.234.32.196 - 194.234.32.199 dk -194.234.32.200 - 194.234.32.255 eu -194.234.33.0 - 194.234.33.255 dk -194.234.34.0 - 194.234.35.255 eu -194.234.36.0 - 194.234.36.255 dk -194.234.37.0 - 194.234.37.255 eu -194.234.38.0 - 194.234.39.255 dk -194.234.40.0 - 194.234.41.255 eu -194.234.42.0 - 194.234.42.255 dk -194.234.43.0 - 194.234.44.31 eu -194.234.44.32 - 194.234.44.63 dk -194.234.44.64 - 194.234.64.255 eu -194.234.65.0 - 194.234.65.255 no -194.234.66.0 - 194.234.68.255 eu -194.234.69.0 - 194.234.69.31 no -194.234.69.32 - 194.234.84.95 eu -194.234.84.96 - 194.234.84.127 no -194.234.84.128 - 194.234.84.159 eu -194.234.84.160 - 194.234.84.223 no -194.234.84.224 - 194.234.99.255 eu -194.234.100.0 - 194.234.101.255 no -194.234.102.0 - 194.234.104.255 eu -194.234.105.0 - 194.234.105.255 no -194.234.106.0 - 194.234.111.255 eu -194.234.112.0 - 194.234.114.255 no -194.234.115.0 - 194.234.122.255 eu -194.234.123.0 - 194.234.124.255 no -194.234.125.0 - 194.234.125.255 eu -194.234.126.0 - 194.234.127.255 no -194.234.128.0 - 194.234.140.255 fi -194.234.141.0 - 194.234.142.255 eu -194.234.143.0 - 194.234.153.31 fi -194.234.153.32 - 194.234.154.255 eu -194.234.155.0 - 194.234.157.255 fi -194.234.158.0 - 194.234.159.255 eu -194.234.160.0 - 194.234.161.255 dk -194.234.162.0 - 194.234.172.255 eu -194.234.173.0 - 194.234.173.255 dk -194.234.174.0 - 194.234.193.255 eu -194.234.194.0 - 194.234.194.255 no -194.234.195.0 - 194.234.199.255 eu -194.234.200.0 - 194.234.204.255 no -194.234.205.0 - 194.234.209.255 eu -194.234.210.0 - 194.234.210.255 no -194.234.211.0 - 194.234.213.255 eu -194.234.214.0 - 194.234.215.255 no -194.234.216.0 - 194.234.231.255 eu -194.234.232.0 - 194.234.232.255 no -194.234.233.0 - 194.234.235.255 eu -194.234.236.0 - 194.234.236.255 no -194.234.237.0 - 194.235.0.255 eu -194.235.1.0 - 194.235.1.255 ch -194.235.2.0 - 194.235.2.255 eu -194.235.3.0 - 194.235.3.255 ch -194.235.4.0 - 194.235.4.255 eu -194.235.5.0 - 194.235.5.255 ch -194.235.6.0 - 194.235.6.255 eu -194.235.7.0 - 194.235.10.255 ch -194.235.11.0 - 194.235.31.255 eu -194.235.32.0 - 194.235.32.255 be -194.235.33.0 - 194.235.35.255 eu -194.235.36.0 - 194.235.37.255 it -194.235.38.0 - 194.235.39.255 ch -194.235.40.0 - 194.235.43.63 eu -194.235.43.64 - 194.235.43.175 ch -194.235.43.176 - 194.235.62.255 eu -194.235.63.0 - 194.235.63.255 ch -194.235.64.0 - 194.235.74.255 eu -194.235.75.0 - 194.235.75.255 nl -194.235.76.0 - 194.235.79.255 eu -194.235.80.0 - 194.235.80.255 nl -194.235.81.0 - 194.235.85.255 eu -194.235.86.0 - 194.235.86.255 nl -194.235.87.0 - 194.235.95.255 eu -194.235.96.0 - 194.235.96.255 nl -194.235.97.0 - 194.235.98.31 eu -194.235.98.32 - 194.235.98.47 es -194.235.98.48 - 194.235.98.111 eu -194.235.98.112 - 194.235.98.127 es -194.235.98.128 - 194.235.101.255 eu -194.235.102.0 - 194.235.102.255 es -194.235.103.0 - 194.235.103.255 ch -194.235.104.0 - 194.235.104.255 eu -194.235.105.0 - 194.235.105.159 it -194.235.105.160 - 194.235.105.255 eu -194.235.106.0 - 194.235.106.255 ch -194.235.107.0 - 194.235.107.255 lu -194.235.108.0 - 194.235.108.255 eu -194.235.109.0 - 194.235.109.255 ro -194.235.110.0 - 194.235.110.255 nl -194.235.111.0 - 194.235.122.255 eu -194.235.123.0 - 194.235.124.255 nl -194.235.125.0 - 194.235.125.255 eu -194.235.126.0 - 194.235.127.255 nl -194.235.128.0 - 194.235.128.255 eu -194.235.129.0 - 194.235.130.135 pt -194.235.130.136 - 194.235.130.143 us -194.235.130.144 - 194.235.130.159 pt -194.235.130.160 - 194.235.130.175 eu -194.235.130.176 - 194.235.135.15 pt -194.235.135.16 - 194.235.135.95 eu -194.235.135.96 - 194.235.136.255 pt -194.235.137.0 - 194.235.137.255 eu -194.235.138.0 - 194.235.138.159 pt -194.235.138.160 - 194.235.138.191 eu -194.235.138.192 - 194.235.139.255 pt -194.235.140.0 - 194.235.140.31 eu -194.235.140.32 - 194.235.140.47 it -194.235.140.48 - 194.235.140.95 eu -194.235.140.96 - 194.235.140.111 it -194.235.140.112 - 194.235.140.127 eu -194.235.140.128 - 194.235.140.175 it -194.235.140.176 - 194.235.142.255 eu -194.235.143.0 - 194.235.143.255 ch -194.235.144.0 - 194.235.146.255 eu -194.235.147.0 - 194.235.147.255 ch -194.235.148.0 - 194.235.170.255 eu -194.235.171.0 - 194.235.171.255 ch -194.235.172.0 - 194.235.192.255 eu -194.235.193.0 - 194.235.194.255 lu -194.235.195.0 - 194.235.196.255 eu -194.235.197.0 - 194.235.198.95 lu -194.235.198.96 - 194.235.201.255 eu -194.235.202.0 - 194.235.202.255 lu -194.235.203.0 - 194.235.207.255 eu -194.235.208.0 - 194.235.208.255 lu -194.235.209.0 - 194.235.209.255 nl -194.235.210.0 - 194.235.211.255 eu -194.235.212.0 - 194.235.215.255 nl -194.235.216.0 - 194.235.223.255 eu -194.235.224.0 - 194.235.225.255 nl -194.235.226.0 - 194.235.226.255 eu -194.235.227.0 - 194.235.228.255 ch -194.235.229.0 - 194.235.237.255 eu -194.235.238.0 - 194.235.240.255 ro -194.235.241.0 - 194.235.243.255 eu -194.235.244.0 - 194.235.245.255 ro -194.235.246.0 - 194.235.246.255 eu -194.235.247.0 - 194.235.247.255 nl -194.235.248.0 - 194.235.249.255 ch -194.235.250.0 - 194.235.253.255 eu -194.235.254.0 - 194.235.254.255 ro -194.235.255.0 - 194.235.255.255 ch -194.236.0.0 - 194.236.6.15 se -194.236.6.16 - 194.236.6.19 no -194.236.6.20 - 194.237.226.127 se -194.237.226.128 - 194.237.226.135 no -194.237.226.136 - 194.237.255.255 se +194.233.0.0 - 194.233.255.255 de +194.234.0.0 - 194.234.63.255 eu +194.234.64.0 - 194.234.127.255 no +194.234.128.0 - 194.234.128.255 eu +194.234.129.0 - 194.234.134.255 fi +194.234.135.0 - 194.234.137.255 eu +194.234.138.0 - 194.234.140.255 fi +194.234.141.0 - 194.234.145.255 eu +194.234.146.0 - 194.234.149.255 fi +194.234.150.0 - 194.234.199.255 eu +194.234.200.0 - 194.234.203.255 no +194.234.204.0 - 194.235.95.255 eu +194.235.96.0 - 194.235.103.255 es +194.235.104.0 - 194.235.107.255 eu +194.235.108.0 - 194.235.111.255 nl +194.235.112.0 - 194.235.207.255 eu +194.235.208.0 - 194.235.239.255 nl +194.235.240.0 - 194.235.255.255 eu +194.236.0.0 - 194.237.255.255 se 194.238.0.0 - 194.238.255.255 gb 194.239.0.0 - 194.239.255.255 dk -194.240.0.0 - 194.240.53.255 fi -194.240.54.0 - 194.240.54.255 ax -194.240.55.0 - 194.241.255.255 fi +194.240.0.0 - 194.241.255.255 fi 194.242.0.0 - 194.242.1.255 pl 194.242.2.0 - 194.242.9.255 ru 194.242.10.0 - 194.242.11.255 no @@ -103091,31 +88222,25 @@ 194.242.16.0 - 194.242.17.255 at 194.242.18.0 - 194.242.19.255 nl 194.242.20.0 - 194.242.21.255 de -194.242.22.0 - 194.242.23.255 pl 194.242.24.0 - 194.242.25.255 il -194.242.26.0 - 194.242.31.255 ru +194.242.26.0 - 194.242.27.255 ru +194.242.30.0 - 194.242.31.255 ru 194.242.32.0 - 194.242.32.255 tr 194.242.33.0 - 194.242.33.255 ru 194.242.34.0 - 194.242.34.255 ch 194.242.35.0 - 194.242.35.255 at 194.242.36.0 - 194.242.36.255 si 194.242.37.0 - 194.242.37.255 at -194.242.38.0 - 194.242.38.255 dk 194.242.39.0 - 194.242.39.255 pl 194.242.40.0 - 194.242.40.255 dk 194.242.41.0 - 194.242.41.255 at 194.242.42.0 - 194.242.42.255 dk -194.242.43.0 - 194.242.45.255 fr -194.242.46.0 - 194.242.46.255 de -194.242.47.0 - 194.242.47.255 fr -194.242.48.0 - 194.242.49.255 it -194.242.50.0 - 194.242.50.255 dk -194.242.51.0 - 194.242.51.255 ch +194.242.43.0 - 194.242.47.255 fr +194.242.50.0 - 194.242.51.255 ch 194.242.52.0 - 194.242.52.255 pl 194.242.53.0 - 194.242.53.255 ua 194.242.54.0 - 194.242.54.255 nl 194.242.55.0 - 194.242.55.255 gb -194.242.56.0 - 194.242.56.255 es 194.242.57.0 - 194.242.57.255 ro 194.242.58.0 - 194.242.58.255 be 194.242.59.0 - 194.242.60.255 ua @@ -103133,30 +88258,31 @@ 194.242.160.0 - 194.242.191.255 fr 194.242.192.0 - 194.244.5.111 it 194.244.5.112 - 194.244.5.119 nl -194.244.5.120 - 194.244.41.159 it -194.244.41.160 - 194.244.41.175 ro -194.244.41.176 - 194.244.146.63 it -194.244.146.64 - 194.244.146.95 lu -194.244.146.96 - 194.244.255.255 it -194.245.0.0 - 194.246.39.95 de +194.244.5.120 - 194.244.255.255 it +194.245.0.0 - 194.245.255.255 de +194.246.0.0 - 194.246.3.255 it +194.246.4.0 - 194.246.4.255 hu +194.246.5.0 - 194.246.7.255 it +194.246.8.0 - 194.246.15.255 se +194.246.16.0 - 194.246.16.255 eu +194.246.17.0 - 194.246.31.255 it 194.246.39.96 - 194.246.39.127 pl 194.246.39.128 - 194.246.39.191 de -194.246.39.192 - 194.246.39.223 pl 194.246.39.224 - 194.246.39.255 nl -194.246.40.0 - 194.246.73.255 de +194.246.44.0 - 194.246.45.255 de +194.246.46.0 - 194.246.46.255 eu +194.246.47.0 - 194.246.73.255 de 194.246.74.0 - 194.246.75.255 ua 194.246.76.0 - 194.246.76.255 dk 194.246.77.0 - 194.246.77.255 ua 194.246.78.0 - 194.246.79.255 gb -194.246.80.0 - 194.246.95.255 de -194.246.96.0 - 194.246.96.255 us +194.246.84.0 - 194.246.87.255 de +194.246.96.0 - 194.246.96.255 at 194.246.97.0 - 194.246.97.255 ch 194.246.98.0 - 194.246.98.255 pl 194.246.99.0 - 194.246.99.255 ua -194.246.100.0 - 194.246.100.255 ch 194.246.101.0 - 194.246.101.255 fr 194.246.102.0 - 194.246.102.255 hu -194.246.103.0 - 194.246.103.255 ro 194.246.104.0 - 194.246.105.255 ua 194.246.106.0 - 194.246.107.255 pl 194.246.108.0 - 194.246.109.255 gb @@ -103181,8 +88307,7 @@ 194.247.26.0 - 194.247.27.255 fr 194.247.28.0 - 194.247.29.255 it 194.247.30.0 - 194.247.31.255 nl -194.247.32.0 - 194.247.32.255 ru -194.247.33.0 - 194.247.33.255 ua +194.247.32.0 - 194.247.33.255 ru 194.247.34.0 - 194.247.34.255 fr 194.247.35.0 - 194.247.35.255 ua 194.247.36.0 - 194.247.36.255 hu @@ -103195,7 +88320,7 @@ 194.247.43.0 - 194.247.45.255 fi 194.247.46.0 - 194.247.46.255 pl 194.247.47.0 - 194.247.47.255 at -194.247.48.0 - 194.247.48.255 lv +194.247.48.0 - 194.247.48.255 no 194.247.49.0 - 194.247.49.255 gb 194.247.50.0 - 194.247.50.255 am 194.247.51.0 - 194.247.51.255 ru @@ -103220,201 +88345,48 @@ 194.247.170.0 - 194.247.171.255 gb 194.247.172.0 - 194.247.179.255 ua 194.247.180.0 - 194.247.181.255 fr -194.247.182.0 - 194.247.183.255 ua 194.247.184.0 - 194.247.185.255 ru -194.247.186.0 - 194.247.187.255 ro 194.247.188.0 - 194.247.189.255 dk 194.247.190.0 - 194.247.191.255 ru -194.247.192.0 - 194.247.214.255 rs -194.247.215.0 - 194.247.215.127 cy -194.247.215.128 - 194.247.223.63 rs -194.247.223.64 - 194.247.223.67 ba -194.247.223.68 - 194.247.223.255 rs +194.247.192.0 - 194.247.223.255 rs 194.247.224.0 - 194.247.255.255 gb 194.248.0.0 - 194.248.255.255 no 194.249.0.0 - 194.249.255.255 si -194.250.0.0 - 194.250.143.255 fr -194.250.144.0 - 194.250.144.7 gb -194.250.144.8 - 194.250.255.255 fr -194.251.0.0 - 194.251.57.159 fi -194.251.57.160 - 194.251.57.191 ax -194.251.57.192 - 194.251.71.251 fi -194.251.71.252 - 194.251.71.255 ax -194.251.72.0 - 194.251.79.255 fi -194.251.80.0 - 194.251.80.255 se -194.251.81.0 - 194.251.198.223 fi -194.251.198.224 - 194.251.198.255 ru -194.251.199.0 - 194.251.200.47 fi +194.250.0.0 - 194.250.255.255 fr +194.251.0.0 - 194.251.200.47 fi 194.251.200.48 - 194.251.200.63 se -194.251.200.64 - 194.251.200.79 fi -194.251.200.80 - 194.251.200.95 se -194.251.200.96 - 194.251.238.255 fi -194.251.239.0 - 194.251.239.255 be -194.251.240.0 - 194.252.15.255 fi -194.252.16.0 - 194.252.16.127 ax -194.252.16.128 - 194.252.25.255 fi -194.252.26.0 - 194.252.27.255 ax -194.252.28.0 - 194.252.58.255 fi -194.252.59.0 - 194.252.59.255 de -194.252.60.0 - 194.252.113.127 fi -194.252.113.128 - 194.252.113.159 ax -194.252.113.160 - 194.252.255.255 fi -194.253.0.0 - 194.253.11.79 gb -194.253.11.80 - 194.253.11.87 at -194.253.11.88 - 194.253.11.95 gb -194.253.11.96 - 194.253.11.127 it -194.253.11.128 - 194.253.11.143 gb -194.253.11.144 - 194.253.11.159 za -194.253.11.160 - 194.253.11.191 it -194.253.11.192 - 194.253.11.223 eu -194.253.11.224 - 194.253.11.255 fr -194.253.12.0 - 194.253.20.255 gb -194.253.21.0 - 194.253.21.255 de -194.253.22.0 - 194.253.22.255 gb -194.253.23.0 - 194.253.23.255 nl -194.253.24.0 - 194.253.41.255 gb -194.253.42.0 - 194.253.42.255 ie -194.253.43.0 - 194.253.43.159 za -194.253.43.160 - 194.253.43.191 de -194.253.43.192 - 194.253.43.255 ch -194.253.44.0 - 194.253.44.255 gb -194.253.45.0 - 194.253.45.255 be -194.253.46.0 - 194.253.47.255 fr -194.253.48.0 - 194.253.48.255 se -194.253.49.0 - 194.253.49.255 be -194.253.50.0 - 194.253.50.255 gb -194.253.51.0 - 194.253.51.255 fr -194.253.52.0 - 194.253.52.255 de -194.253.53.0 - 194.253.53.255 be -194.253.54.0 - 194.253.55.255 de -194.253.56.0 - 194.253.57.255 gb -194.253.58.0 - 194.253.59.255 ch -194.253.60.0 - 194.253.61.255 be -194.253.62.0 - 194.253.62.63 gb -194.253.62.64 - 194.253.62.79 fr -194.253.62.80 - 194.253.62.95 it -194.253.62.96 - 194.253.62.127 fr -194.253.62.128 - 194.253.62.255 de -194.253.63.0 - 194.253.63.255 at -194.253.64.0 - 194.253.65.255 es -194.253.66.0 - 194.253.67.255 nl -194.253.68.0 - 194.253.70.255 be -194.253.71.0 - 194.253.71.255 se +194.251.200.64 - 194.252.255.255 fi +194.253.0.0 - 194.253.71.255 eu 194.253.72.0 - 194.253.79.255 gb -194.253.80.0 - 194.253.80.255 be -194.253.81.0 - 194.253.81.255 no -194.253.82.0 - 194.253.82.255 se -194.253.83.0 - 194.253.85.255 it -194.253.86.0 - 194.253.87.255 il -194.253.88.0 - 194.253.88.255 ch -194.253.89.0 - 194.253.89.255 be -194.253.90.0 - 194.253.91.255 gb -194.253.92.0 - 194.253.92.255 ch -194.253.93.0 - 194.253.93.255 be -194.253.94.0 - 194.253.94.255 gb -194.253.95.0 - 194.253.95.255 be -194.253.96.0 - 194.253.96.71 de -194.253.96.72 - 194.253.96.95 gb -194.253.96.96 - 194.253.96.127 es -194.253.96.128 - 194.253.96.255 nl -194.253.97.0 - 194.253.119.255 de -194.253.120.0 - 194.253.121.255 nl -194.253.122.0 - 194.253.122.255 no -194.253.123.0 - 194.253.123.255 de -194.253.124.0 - 194.253.124.255 fr -194.253.125.0 - 194.253.125.255 be -194.253.126.0 - 194.253.127.255 fr -194.253.128.0 - 194.253.129.255 at -194.253.130.0 - 194.253.130.255 dk -194.253.131.0 - 194.253.131.255 de -194.253.132.0 - 194.253.132.255 be -194.253.133.0 - 194.253.133.255 gb -194.253.134.0 - 194.253.134.255 de -194.253.135.0 - 194.253.135.255 gb -194.253.136.0 - 194.253.141.255 it -194.253.142.0 - 194.253.142.255 gb -194.253.143.0 - 194.253.143.255 nl -194.253.144.0 - 194.253.145.255 ch -194.253.146.0 - 194.253.146.63 fr -194.253.146.64 - 194.253.146.95 it -194.253.146.96 - 194.253.146.111 nl -194.253.146.112 - 194.253.146.127 fr -194.253.146.128 - 194.253.146.159 nl -194.253.146.160 - 194.253.146.191 za -194.253.146.192 - 194.253.146.255 gb -194.253.147.0 - 194.253.147.159 nl -194.253.147.160 - 194.253.147.191 de -194.253.147.192 - 194.253.147.255 it -194.253.148.0 - 194.253.149.255 de -194.253.150.0 - 194.253.150.255 gb -194.253.151.0 - 194.253.157.255 be -194.253.158.0 - 194.253.158.255 ch -194.253.159.0 - 194.253.159.255 de -194.253.160.0 - 194.253.166.255 dk -194.253.167.0 - 194.253.167.255 de -194.253.168.0 - 194.253.168.255 nl -194.253.169.0 - 194.253.169.127 za -194.253.169.128 - 194.253.169.143 gb -194.253.169.144 - 194.253.169.159 ie -194.253.169.160 - 194.253.169.191 gb -194.253.169.192 - 194.253.169.207 za -194.253.169.208 - 194.253.169.215 gb -194.253.169.216 - 194.253.169.223 za -194.253.169.224 - 194.253.169.255 de -194.253.170.0 - 194.253.174.255 nl -194.253.175.0 - 194.253.175.255 fr -194.253.176.0 - 194.253.176.255 es -194.253.177.0 - 194.253.177.255 at -194.253.178.0 - 194.253.178.255 za -194.253.179.0 - 194.253.179.255 ro -194.253.180.0 - 194.253.180.255 gb -194.253.181.0 - 194.253.183.255 at -194.253.184.0 - 194.253.184.255 de -194.253.185.0 - 194.253.185.255 at -194.253.186.0 - 194.253.186.255 de -194.253.187.0 - 194.253.187.255 fr -194.253.188.0 - 194.253.188.255 be -194.253.189.0 - 194.253.189.255 es -194.253.190.0 - 194.253.190.255 it -194.253.191.0 - 194.253.191.255 gb +194.253.80.0 - 194.253.111.255 eu +194.253.112.0 - 194.253.119.255 de +194.253.120.0 - 194.253.135.255 eu +194.253.136.0 - 194.253.139.255 it +194.253.140.0 - 194.253.191.255 eu 194.253.192.0 - 194.253.223.255 be -194.253.224.0 - 194.253.248.71 fr -194.253.248.72 - 194.253.248.79 it -194.253.248.80 - 194.253.248.95 ie -194.253.248.96 - 194.253.248.111 gb -194.253.248.112 - 194.253.248.127 be -194.253.248.128 - 194.253.248.191 gb -194.253.248.192 - 194.253.249.255 fr -194.253.250.0 - 194.253.251.255 gb -194.253.252.0 - 194.253.252.255 de -194.253.253.0 - 194.253.253.255 dk -194.253.254.0 - 194.253.255.255 de -194.254.0.0 - 194.254.0.255 pf -194.254.1.0 - 194.254.255.255 fr -194.255.0.0 - 194.255.15.255 dk -194.255.16.0 - 194.255.16.127 se -194.255.16.128 - 194.255.38.255 dk -194.255.39.0 - 194.255.39.7 se -194.255.39.8 - 194.255.39.95 dk -194.255.39.96 - 194.255.39.111 de -194.255.39.112 - 194.255.39.127 se -194.255.39.128 - 194.255.39.215 dk -194.255.39.216 - 194.255.39.223 se -194.255.39.224 - 194.255.255.255 dk +194.253.224.0 - 194.253.231.255 eu +194.253.232.0 - 194.253.239.255 fr +194.253.240.0 - 194.253.255.255 eu +194.254.0.0 - 194.254.255.255 fr +194.255.0.0 - 194.255.0.255 dk +194.255.1.0 - 194.255.1.255 se +194.255.2.0 - 194.255.84.255 dk +194.255.85.0 - 194.255.85.255 eu +194.255.86.0 - 194.255.255.255 dk 195.0.0.0 - 195.0.127.255 be 195.0.128.0 - 195.1.255.255 no 195.2.0.0 - 195.2.13.255 eu 195.2.14.0 - 195.2.14.255 us 195.2.15.0 - 195.2.15.255 gb -195.2.16.0 - 195.2.25.255 eu -195.2.26.0 - 195.2.26.255 gb +195.2.16.0 - 195.2.22.255 eu +195.2.23.0 - 195.2.23.255 ie +195.2.24.0 - 195.2.24.255 eu +195.2.25.0 - 195.2.26.255 gb 195.2.27.0 - 195.2.31.255 eu 195.2.32.0 - 195.2.39.255 gb 195.2.40.0 - 195.2.63.255 eu 195.2.64.0 - 195.2.95.255 ru -195.2.96.0 - 195.2.111.255 lv -195.2.112.0 - 195.2.112.255 ru -195.2.113.0 - 195.2.127.255 lv +195.2.96.0 - 195.2.127.255 lv 195.2.128.0 - 195.2.159.255 gb 195.2.160.0 - 195.2.191.255 de 195.2.192.0 - 195.2.195.255 ru @@ -103425,21 +88397,20 @@ 195.2.204.0 - 195.2.205.255 ua 195.2.206.0 - 195.2.207.255 ru 195.2.208.0 - 195.2.209.255 pl -195.2.210.0 - 195.2.217.255 ru +195.2.210.0 - 195.2.211.255 ru +195.2.214.0 - 195.2.217.255 ru 195.2.218.0 - 195.2.219.255 ro 195.2.220.0 - 195.2.221.255 at 195.2.222.0 - 195.2.223.255 pl 195.2.224.0 - 195.2.225.255 gb 195.2.226.0 - 195.2.227.255 ru -195.2.228.0 - 195.2.229.255 ch +195.2.228.0 - 195.2.229.255 us 195.2.230.0 - 195.2.231.255 kz 195.2.232.0 - 195.2.233.255 ru 195.2.234.0 - 195.2.235.255 gr 195.2.236.0 - 195.2.237.255 ua 195.2.238.0 - 195.2.241.255 ru -195.2.242.0 - 195.2.243.255 ua -195.2.244.0 - 195.2.244.127 nl -195.2.244.128 - 195.2.245.255 gb +195.2.244.0 - 195.2.245.255 gb 195.2.246.0 - 195.2.247.255 ro 195.2.248.0 - 195.2.249.255 nl 195.2.250.0 - 195.2.251.255 gb @@ -103448,7 +88419,6 @@ 195.3.0.0 - 195.3.63.255 fr 195.3.64.0 - 195.3.127.255 at 195.3.128.0 - 195.3.135.255 ua -195.3.136.0 - 195.3.139.255 gb 195.3.140.0 - 195.3.143.255 ru 195.3.144.0 - 195.3.147.255 lv 195.3.148.0 - 195.3.151.255 ua @@ -103457,7 +88427,7 @@ 195.3.160.0 - 195.3.163.255 it 195.3.164.0 - 195.3.167.255 nl 195.3.168.0 - 195.3.171.255 sk -195.3.172.0 - 195.3.175.255 gb +195.3.172.0 - 195.3.175.255 sa 195.3.176.0 - 195.3.179.255 nl 195.3.180.0 - 195.3.183.255 ru 195.3.184.0 - 195.3.187.255 gb @@ -103477,47 +88447,39 @@ 195.3.244.0 - 195.3.247.255 ua 195.3.248.0 - 195.3.251.255 de 195.3.252.0 - 195.3.255.255 ru -195.4.0.0 - 195.4.7.190 de -195.4.7.191 - 195.4.7.191 at -195.4.7.192 - 195.4.110.63 de -195.4.110.64 - 195.4.110.71 us -195.4.110.72 - 195.4.255.255 de +195.4.0.0 - 195.4.255.255 de 195.5.0.0 - 195.5.63.255 ua 195.5.64.0 - 195.5.95.255 es -195.5.96.0 - 195.5.97.255 ro 195.5.98.0 - 195.5.99.255 de 195.5.100.0 - 195.5.101.255 dk 195.5.102.0 - 195.5.103.255 lv 195.5.104.0 - 195.5.105.255 li 195.5.106.0 - 195.5.109.255 ua -195.5.110.0 - 195.5.111.255 nl +195.5.110.0 - 195.5.110.255 sk +195.5.111.0 - 195.5.111.255 se 195.5.112.0 - 195.5.113.255 no 195.5.114.0 - 195.5.115.255 ro 195.5.116.0 - 195.5.117.255 es 195.5.118.0 - 195.5.119.255 se -195.5.120.0 - 195.5.121.255 nl +195.5.120.0 - 195.5.121.255 de 195.5.122.0 - 195.5.123.255 gb 195.5.124.0 - 195.5.126.255 ua 195.5.127.0 - 195.5.159.255 ru -195.5.160.0 - 195.5.160.255 de -195.5.161.0 - 195.5.161.255 md +195.5.160.0 - 195.5.160.255 dk 195.5.162.0 - 195.5.162.255 ru 195.5.163.0 - 195.5.163.255 nl 195.5.164.0 - 195.5.165.255 si 195.5.166.0 - 195.5.166.255 no 195.5.167.0 - 195.5.167.255 gb -195.5.168.0 - 195.5.168.255 tr 195.5.169.0 - 195.5.169.255 gb -195.5.170.0 - 195.5.170.255 ru 195.5.171.0 - 195.5.171.255 ch 195.5.172.0 - 195.5.172.255 ie 195.5.173.0 - 195.5.173.255 lb 195.5.174.0 - 195.5.174.255 no 195.5.175.0 - 195.5.175.255 gb -195.5.176.0 - 195.5.176.255 pl 195.5.177.0 - 195.5.177.255 hu 195.5.178.0 - 195.5.178.255 ru -195.5.179.0 - 195.5.179.255 gb +195.5.179.0 - 195.5.179.255 ge 195.5.180.0 - 195.5.180.255 ch 195.5.181.0 - 195.5.182.255 pl 195.5.183.0 - 195.5.183.255 no @@ -103529,10 +88491,9 @@ 195.5.189.0 - 195.5.189.255 gb 195.5.190.0 - 195.5.190.255 se 195.5.191.0 - 195.5.191.255 de -195.5.192.0 - 195.6.106.61 fr -195.6.106.62 - 195.6.106.62 us -195.6.106.63 - 195.6.255.255 fr -195.7.0.0 - 195.7.15.255 ro +195.5.192.0 - 195.5.202.255 fr +195.5.203.0 - 195.5.203.255 us +195.5.204.0 - 195.6.255.255 fr 195.7.16.0 - 195.7.19.255 it 195.7.20.0 - 195.7.31.255 dk 195.7.32.0 - 195.7.63.255 ie @@ -103540,45 +88501,17 @@ 195.7.96.0 - 195.7.127.255 fr 195.7.128.0 - 195.7.159.255 nl 195.7.160.0 - 195.7.191.255 ru -195.7.192.0 - 195.7.194.95 gb -195.7.194.96 - 195.7.194.127 nl -195.7.194.128 - 195.7.209.127 gb -195.7.209.128 - 195.7.209.191 nl -195.7.209.192 - 195.7.211.255 gb -195.7.212.0 - 195.7.212.31 nl -195.7.212.32 - 195.7.212.95 gb -195.7.212.96 - 195.7.212.111 nl -195.7.212.112 - 195.7.255.255 gb -195.8.0.0 - 195.8.1.255 pt -195.8.2.0 - 195.8.4.255 cv -195.8.5.0 - 195.8.7.255 pt -195.8.8.0 - 195.8.8.255 st -195.8.9.0 - 195.8.12.255 pt -195.8.13.0 - 195.8.13.255 cv -195.8.14.0 - 195.8.15.255 pt -195.8.16.0 - 195.8.17.255 ao -195.8.18.0 - 195.8.19.255 st -195.8.20.0 - 195.8.20.127 ao -195.8.20.128 - 195.8.20.255 pt -195.8.21.0 - 195.8.21.15 gh -195.8.21.16 - 195.8.21.23 pt -195.8.21.24 - 195.8.21.31 ro -195.8.21.32 - 195.8.21.47 ni -195.8.21.48 - 195.8.21.95 ao -195.8.21.96 - 195.8.21.191 pt -195.8.21.192 - 195.8.21.255 an -195.8.22.0 - 195.8.22.255 pt -195.8.23.0 - 195.8.23.255 ao -195.8.24.0 - 195.8.30.255 pt -195.8.31.0 - 195.8.31.135 st -195.8.31.136 - 195.8.31.191 pt -195.8.31.192 - 195.8.31.207 st -195.8.31.208 - 195.8.31.255 pt +195.7.192.0 - 195.7.225.255 gb +195.7.226.0 - 195.7.226.127 ie +195.7.226.128 - 195.7.255.255 gb +195.8.0.0 - 195.8.23.255 pt +195.8.24.0 - 195.8.27.255 mr +195.8.28.0 - 195.8.31.255 pt 195.8.32.0 - 195.8.33.255 no 195.8.34.0 - 195.8.39.255 ru 195.8.40.0 - 195.8.43.255 ua 195.8.44.0 - 195.8.45.255 ru -195.8.46.0 - 195.8.49.255 ro +195.8.46.0 - 195.8.47.255 ro 195.8.50.0 - 195.8.51.255 am 195.8.52.0 - 195.8.53.255 pl 195.8.54.0 - 195.8.55.255 fi @@ -103586,29 +88519,23 @@ 195.8.58.0 - 195.8.59.255 pt 195.8.60.0 - 195.8.61.255 fi 195.8.62.0 - 195.8.63.255 ru -195.8.64.0 - 195.8.66.215 gb -195.8.66.216 - 195.8.66.223 fr -195.8.66.224 - 195.8.96.255 gb +195.8.64.0 - 195.8.96.255 gb 195.8.97.0 - 195.8.97.255 pl 195.8.98.0 - 195.8.98.255 se 195.8.99.0 - 195.8.99.255 pl 195.8.100.0 - 195.8.100.255 gb 195.8.101.0 - 195.8.101.255 pl -195.8.102.0 - 195.8.102.255 ru 195.8.103.0 - 195.8.103.255 gb 195.8.104.0 - 195.8.104.255 de 195.8.105.0 - 195.8.105.255 ro 195.8.106.0 - 195.8.107.255 pl 195.8.108.0 - 195.8.108.255 ch 195.8.109.0 - 195.8.109.255 tr -195.8.110.0 - 195.8.110.255 gb 195.8.111.0 - 195.8.111.255 fr -195.8.112.0 - 195.8.112.255 se 195.8.113.0 - 195.8.113.255 ch -195.8.114.0 - 195.8.114.255 at 195.8.115.0 - 195.8.115.255 lv -195.8.116.0 - 195.8.118.255 gb -195.8.119.0 - 195.8.120.255 ro +195.8.116.0 - 195.8.117.255 gb +195.8.120.0 - 195.8.120.255 ro 195.8.121.0 - 195.8.123.255 de 195.8.124.0 - 195.8.124.255 fr 195.8.125.0 - 195.8.126.255 gb @@ -103631,9 +88558,7 @@ 195.8.220.0 - 195.8.221.255 pl 195.8.222.0 - 195.8.223.255 bg 195.8.224.0 - 195.8.255.255 de -195.9.0.0 - 195.9.123.127 ru -195.9.123.128 - 195.9.123.191 ua -195.9.123.192 - 195.9.255.255 ru +195.9.0.0 - 195.9.255.255 ru 195.10.0.0 - 195.10.1.255 gb 195.10.2.0 - 195.10.3.127 es 195.10.3.128 - 195.10.3.143 it @@ -103642,8 +88567,8 @@ 195.10.3.160 - 195.10.3.167 nl 195.10.3.168 - 195.10.3.175 es 195.10.3.176 - 195.10.3.183 nl -195.10.3.184 - 195.10.3.207 gb -195.10.3.208 - 195.10.3.223 es +195.10.3.184 - 195.10.3.191 gb +195.10.3.192 - 195.10.3.223 es 195.10.3.224 - 195.10.3.239 cy 195.10.3.240 - 195.10.3.247 gb 195.10.3.248 - 195.10.3.255 es @@ -103661,12 +88586,7 @@ 195.10.4.192 - 195.10.4.231 it 195.10.4.232 - 195.10.4.247 eu 195.10.4.248 - 195.10.4.255 it -195.10.5.0 - 195.10.5.63 nl -195.10.5.64 - 195.10.5.71 de -195.10.5.72 - 195.10.5.79 nl -195.10.5.80 - 195.10.5.95 ru -195.10.5.96 - 195.10.5.127 eu -195.10.5.128 - 195.10.5.255 gb +195.10.5.0 - 195.10.5.255 nl 195.10.6.0 - 195.10.6.255 es 195.10.7.0 - 195.10.7.79 gb 195.10.7.80 - 195.10.7.135 fr @@ -103719,8 +88639,9 @@ 195.10.18.64 - 195.10.18.127 eu 195.10.18.128 - 195.10.18.191 be 195.10.18.192 - 195.10.18.215 de -195.10.18.216 - 195.10.18.223 be -195.10.18.224 - 195.10.19.255 eu +195.10.18.216 - 195.10.18.239 be +195.10.18.240 - 195.10.18.255 eu +195.10.19.0 - 195.10.19.255 gb 195.10.20.0 - 195.10.20.31 ch 195.10.20.32 - 195.10.20.255 eu 195.10.21.0 - 195.10.21.19 es @@ -103732,52 +88653,49 @@ 195.10.21.128 - 195.10.21.223 es 195.10.21.224 - 195.10.21.255 eu 195.10.22.0 - 195.10.23.255 gb -195.10.24.0 - 195.10.24.15 ru -195.10.24.16 - 195.10.24.47 de -195.10.24.48 - 195.10.24.63 eu +195.10.24.0 - 195.10.24.63 eu 195.10.24.64 - 195.10.24.95 de -195.10.24.96 - 195.10.24.255 eu +195.10.24.96 - 195.10.24.127 eu +195.10.24.128 - 195.10.24.255 gb 195.10.25.0 - 195.10.25.255 be 195.10.26.0 - 195.10.26.255 nl -195.10.27.0 - 195.10.27.255 eu +195.10.27.0 - 195.10.27.255 gb 195.10.28.0 - 195.10.28.255 fr 195.10.29.0 - 195.10.29.255 de 195.10.30.0 - 195.10.30.255 fr 195.10.31.0 - 195.10.33.255 gb -195.10.34.0 - 195.10.34.191 nl -195.10.34.192 - 195.10.34.255 eu +195.10.34.0 - 195.10.34.255 nl 195.10.35.0 - 195.10.35.7 se 195.10.35.8 - 195.10.35.15 no 195.10.35.16 - 195.10.35.23 se -195.10.35.24 - 195.10.35.255 eu +195.10.35.24 - 195.10.35.31 eu +195.10.35.32 - 195.10.35.55 se +195.10.35.56 - 195.10.35.255 eu 195.10.36.0 - 195.10.36.255 nl 195.10.37.0 - 195.10.37.255 gb 195.10.38.0 - 195.10.38.255 es 195.10.39.0 - 195.10.39.255 nl -195.10.40.0 - 195.10.40.255 de -195.10.41.0 - 195.10.41.39 gb +195.10.40.0 - 195.10.41.39 gb 195.10.41.40 - 195.10.41.47 eu 195.10.41.48 - 195.10.41.63 gb 195.10.41.64 - 195.10.41.255 eu 195.10.42.0 - 195.10.42.255 nl -195.10.43.0 - 195.10.43.255 gb -195.10.44.0 - 195.10.44.31 gi -195.10.44.32 - 195.10.44.63 eu -195.10.44.64 - 195.10.44.71 cy -195.10.44.72 - 195.10.44.79 eu -195.10.44.80 - 195.10.44.95 gb -195.10.44.96 - 195.10.44.255 eu -195.10.45.0 - 195.10.45.255 gb -195.10.46.0 - 195.10.46.127 gi -195.10.46.128 - 195.10.46.255 eu -195.10.47.0 - 195.10.49.255 gb +195.10.43.0 - 195.10.43.15 sg +195.10.43.16 - 195.10.43.31 eu +195.10.43.32 - 195.10.43.63 hk +195.10.43.64 - 195.10.43.255 eu +195.10.44.0 - 195.10.45.255 gb +195.10.46.0 - 195.10.47.255 eu +195.10.48.0 - 195.10.48.255 gb +195.10.49.0 - 195.10.49.255 eu 195.10.50.0 - 195.10.50.255 it -195.10.51.0 - 195.10.51.55 gb -195.10.51.56 - 195.10.51.255 it -195.10.52.0 - 195.10.52.255 eu +195.10.51.0 - 195.10.51.255 gb +195.10.52.0 - 195.10.52.63 eu +195.10.52.64 - 195.10.52.127 gb +195.10.52.128 - 195.10.52.255 it 195.10.53.0 - 195.10.55.255 fr 195.10.56.0 - 195.10.56.255 gb -195.10.57.0 - 195.10.57.255 nl +195.10.57.0 - 195.10.57.255 pt 195.10.58.0 - 195.10.58.31 us 195.10.58.32 - 195.10.58.183 gb 195.10.58.184 - 195.10.58.191 eu @@ -103796,65 +88714,7 @@ 195.10.63.128 - 195.10.63.191 nl 195.10.63.192 - 195.10.63.255 ch 195.10.64.0 - 195.10.95.255 lu -195.10.96.0 - 195.10.103.71 gb -195.10.103.72 - 195.10.103.127 im -195.10.103.128 - 195.10.103.191 gb -195.10.103.192 - 195.10.103.255 im -195.10.104.0 - 195.10.106.71 gb -195.10.106.72 - 195.10.106.79 im -195.10.106.80 - 195.10.106.87 gb -195.10.106.88 - 195.10.106.95 im -195.10.106.96 - 195.10.106.159 gb -195.10.106.160 - 195.10.106.183 im -195.10.106.184 - 195.10.107.255 gb -195.10.108.0 - 195.10.108.239 im -195.10.108.240 - 195.10.109.191 gb -195.10.109.192 - 195.10.109.255 gh -195.10.110.0 - 195.10.112.63 gb -195.10.112.64 - 195.10.112.95 im -195.10.112.96 - 195.10.112.127 gb -195.10.112.128 - 195.10.112.143 im -195.10.112.144 - 195.10.112.151 gb -195.10.112.152 - 195.10.112.159 im -195.10.112.160 - 195.10.112.183 gb -195.10.112.184 - 195.10.112.191 im -195.10.112.192 - 195.10.112.223 gb -195.10.112.224 - 195.10.112.255 im -195.10.113.0 - 195.10.113.110 gb -195.10.113.111 - 195.10.113.191 im -195.10.113.192 - 195.10.113.255 gb -195.10.114.0 - 195.10.114.191 im -195.10.114.192 - 195.10.116.39 gb -195.10.116.40 - 195.10.116.47 im -195.10.116.48 - 195.10.116.63 gb -195.10.116.64 - 195.10.117.159 im -195.10.117.160 - 195.10.117.175 gb -195.10.117.176 - 195.10.117.191 im -195.10.117.192 - 195.10.117.223 gb -195.10.117.224 - 195.10.118.31 im -195.10.118.32 - 195.10.118.47 gb -195.10.118.48 - 195.10.118.63 im -195.10.118.64 - 195.10.118.95 gb -195.10.118.96 - 195.10.118.255 im -195.10.119.0 - 195.10.120.7 gb -195.10.120.8 - 195.10.120.15 im -195.10.120.16 - 195.10.120.31 gb -195.10.120.32 - 195.10.120.63 im -195.10.120.64 - 195.10.120.127 gb -195.10.120.128 - 195.10.120.255 im -195.10.121.0 - 195.10.123.47 gb -195.10.123.48 - 195.10.123.63 im -195.10.123.64 - 195.10.123.71 gb -195.10.123.72 - 195.10.123.79 im -195.10.123.80 - 195.10.123.103 gb -195.10.123.104 - 195.10.123.111 im -195.10.123.112 - 195.10.123.143 gb -195.10.123.144 - 195.10.123.159 im -195.10.123.160 - 195.10.123.183 gb -195.10.123.184 - 195.10.123.191 im -195.10.123.192 - 195.10.123.207 gb -195.10.123.208 - 195.10.123.247 im -195.10.123.248 - 195.10.127.255 gb +195.10.96.0 - 195.10.127.255 im 195.10.128.0 - 195.10.191.255 fi 195.10.192.0 - 195.10.192.255 mt 195.10.193.0 - 195.10.193.255 bg @@ -103872,23 +88732,19 @@ 195.10.206.0 - 195.10.206.255 at 195.10.207.0 - 195.10.207.255 dk 195.10.208.0 - 195.10.208.255 de -195.10.209.0 - 195.10.209.255 gb 195.10.210.0 - 195.10.210.255 ua 195.10.211.0 - 195.10.211.255 se 195.10.212.0 - 195.10.212.255 nl 195.10.213.0 - 195.10.213.255 gb -195.10.214.0 - 195.10.214.255 se -195.10.215.0 - 195.10.215.255 gb +195.10.214.0 - 195.10.214.255 ru 195.10.216.0 - 195.10.216.255 lv 195.10.217.0 - 195.10.217.255 mt 195.10.218.0 - 195.10.218.255 ua -195.10.219.0 - 195.10.219.255 ro 195.10.220.0 - 195.10.220.255 il 195.10.221.0 - 195.10.221.255 gb -195.10.222.0 - 195.10.222.255 il -195.10.223.0 - 195.11.223.255 gb -195.11.224.0 - 195.11.255.255 nl -195.12.0.0 - 195.12.31.255 gb +195.10.223.0 - 195.11.60.255 gb +195.11.61.0 - 195.11.61.255 au +195.11.62.0 - 195.12.31.255 gb 195.12.32.0 - 195.12.35.255 pl 195.12.36.0 - 195.12.39.255 ua 195.12.40.0 - 195.12.47.255 ch @@ -103898,86 +88754,49 @@ 195.12.60.0 - 195.12.63.255 nl 195.12.64.0 - 195.12.95.255 ru 195.12.96.0 - 195.12.127.255 kz -195.12.128.0 - 195.12.128.127 sk -195.12.128.128 - 195.12.128.159 sr -195.12.128.160 - 195.12.128.175 sk -195.12.128.176 - 195.12.128.207 sr -195.12.128.208 - 195.12.128.215 sk -195.12.128.216 - 195.12.128.223 sr -195.12.128.224 - 195.12.129.31 sk -195.12.129.32 - 195.12.129.63 sr -195.12.129.64 - 195.12.129.159 sk -195.12.129.160 - 195.12.129.175 sr -195.12.129.176 - 195.12.129.191 sk -195.12.129.192 - 195.12.129.255 sr -195.12.130.0 - 195.12.135.71 sk -195.12.135.72 - 195.12.135.89 sr -195.12.135.90 - 195.12.159.255 sk +195.12.128.0 - 195.12.159.255 sk 195.12.160.0 - 195.12.191.255 lt 195.12.192.0 - 195.12.223.255 at 195.12.224.0 - 195.12.224.15 eu -195.12.224.16 - 195.12.224.31 gb -195.12.224.32 - 195.12.224.127 eu -195.12.224.128 - 195.12.224.191 gb -195.12.224.192 - 195.12.225.127 eu +195.12.224.16 - 195.12.224.23 gb +195.12.224.24 - 195.12.225.63 eu +195.12.225.64 - 195.12.225.95 pl +195.12.225.96 - 195.12.225.127 eu 195.12.225.128 - 195.12.225.255 nl -195.12.226.0 - 195.12.227.255 eu -195.12.228.0 - 195.12.228.31 gb -195.12.228.32 - 195.12.228.47 se -195.12.228.48 - 195.12.228.63 gb -195.12.228.64 - 195.12.228.111 de -195.12.228.112 - 195.12.228.119 gb -195.12.228.120 - 195.12.228.127 us -195.12.228.128 - 195.12.228.159 eu -195.12.228.160 - 195.12.228.191 se -195.12.228.192 - 195.12.228.255 eu -195.12.229.0 - 195.12.229.15 gb -195.12.229.16 - 195.12.229.127 eu -195.12.229.128 - 195.12.229.255 fr -195.12.230.0 - 195.12.230.15 eu -195.12.230.16 - 195.12.230.23 fr -195.12.230.24 - 195.12.230.127 eu +195.12.226.0 - 195.12.230.127 eu 195.12.230.128 - 195.12.230.191 gb -195.12.230.192 - 195.12.230.255 eu -195.12.231.0 - 195.12.231.127 se -195.12.231.128 - 195.12.232.63 eu -195.12.232.64 - 195.12.232.79 fr -195.12.232.80 - 195.12.232.95 eu -195.12.232.96 - 195.12.232.111 de -195.12.232.112 - 195.12.232.127 nl -195.12.232.128 - 195.12.232.255 fr -195.12.233.0 - 195.12.233.255 se -195.12.234.0 - 195.12.239.255 fr +195.12.230.192 - 195.12.232.127 eu +195.12.232.128 - 195.12.232.255 nl +195.12.233.0 - 195.12.235.255 eu +195.12.236.0 - 195.12.239.255 fr 195.12.240.0 - 195.12.243.255 de 195.12.244.0 - 195.12.247.255 nl 195.12.248.0 - 195.12.255.255 eu 195.13.0.0 - 195.13.31.255 be -195.13.32.0 - 195.13.37.127 fr -195.13.37.128 - 195.13.39.255 pl -195.13.40.0 - 195.13.45.255 de +195.13.32.0 - 195.13.37.255 fr +195.13.38.0 - 195.13.39.255 pl +195.13.40.0 - 195.13.43.255 de 195.13.46.0 - 195.13.46.127 pl 195.13.46.128 - 195.13.46.255 dk -195.13.47.0 - 195.13.47.255 ua 195.13.48.0 - 195.13.49.255 ro -195.13.50.0 - 195.13.51.255 gb +195.13.50.0 - 195.13.50.255 ru +195.13.51.0 - 195.13.51.255 gb 195.13.52.0 - 195.13.53.255 ch 195.13.54.0 - 195.13.55.255 se 195.13.56.0 - 195.13.57.255 be 195.13.58.0 - 195.13.59.255 fr -195.13.60.0 - 195.13.63.255 de -195.13.64.0 - 195.13.68.159 gb -195.13.68.160 - 195.13.68.175 il -195.13.68.176 - 195.13.127.255 gb +195.13.60.0 - 195.13.60.255 gb +195.13.61.0 - 195.13.63.255 de +195.13.64.0 - 195.13.127.255 gb 195.13.128.0 - 195.13.255.255 lv 195.14.0.0 - 195.14.0.255 fr 195.14.1.0 - 195.14.1.255 nl 195.14.2.0 - 195.14.2.255 ru 195.14.3.0 - 195.14.4.255 pl 195.14.5.0 - 195.14.5.255 fr -195.14.6.0 - 195.14.7.255 ro +195.14.6.0 - 195.14.6.255 ro 195.14.8.0 - 195.14.8.255 de 195.14.9.0 - 195.14.9.255 gr -195.14.10.0 - 195.14.10.255 gb 195.14.11.0 - 195.14.11.255 pl 195.14.12.0 - 195.14.12.255 ru 195.14.13.0 - 195.14.13.255 ro @@ -103989,24 +88808,20 @@ 195.14.19.0 - 195.14.19.255 sa 195.14.20.0 - 195.14.21.255 se 195.14.22.0 - 195.14.22.255 fr -195.14.23.0 - 195.14.23.255 gb -195.14.24.0 - 195.14.24.255 de +195.14.23.0 - 195.14.23.255 ch 195.14.25.0 - 195.14.25.255 se -195.14.26.0 - 195.14.26.255 ch -195.14.27.0 - 195.14.27.255 fr 195.14.28.0 - 195.14.28.255 it 195.14.29.0 - 195.14.29.255 nl -195.14.30.0 - 195.14.30.255 fr +195.14.30.0 - 195.14.30.255 pl 195.14.31.0 - 195.14.31.255 be 195.14.32.0 - 195.14.63.255 ru 195.14.64.0 - 195.14.95.255 gb 195.14.96.0 - 195.14.97.255 ru -195.14.98.0 - 195.14.99.255 us +195.14.98.0 - 195.14.99.255 nl 195.14.100.0 - 195.14.101.255 ru 195.14.102.0 - 195.14.103.255 it 195.14.104.0 - 195.14.109.255 ru 195.14.110.0 - 195.14.111.255 kw -195.14.112.0 - 195.14.113.255 ua 195.14.114.0 - 195.14.115.255 ru 195.14.116.0 - 195.14.117.255 pl 195.14.118.0 - 195.14.119.255 ru @@ -104016,110 +88831,23 @@ 195.14.128.0 - 195.14.159.255 cy 195.14.160.0 - 195.14.191.255 lt 195.14.192.0 - 195.14.255.255 de -195.15.0.0 - 195.15.24.255 ch -195.15.25.0 - 195.15.25.255 fr -195.15.26.0 - 195.15.28.59 ch -195.15.28.60 - 195.15.28.63 fr -195.15.28.64 - 195.15.49.31 ch -195.15.49.32 - 195.15.49.39 fr -195.15.49.40 - 195.15.49.175 ch -195.15.49.176 - 195.15.49.183 fr -195.15.49.184 - 195.15.51.255 ch -195.15.52.0 - 195.15.52.15 fr -195.15.52.16 - 195.15.57.27 ch -195.15.57.28 - 195.15.57.31 fr -195.15.57.32 - 195.15.58.239 ch -195.15.58.240 - 195.15.58.247 fr -195.15.58.248 - 195.15.59.143 ch -195.15.59.144 - 195.15.59.159 fr -195.15.59.160 - 195.15.64.55 ch -195.15.64.56 - 195.15.64.63 fr -195.15.64.64 - 195.15.109.15 ch -195.15.109.16 - 195.15.109.31 fr -195.15.109.32 - 195.15.127.207 ch -195.15.127.208 - 195.15.127.223 fr -195.15.127.224 - 195.15.255.255 ch +195.15.0.0 - 195.15.255.255 ch 195.16.0.0 - 195.16.31.255 be 195.16.32.0 - 195.16.63.255 ru -195.16.64.0 - 195.16.67.255 ro 195.16.68.0 - 195.16.71.255 de 195.16.72.0 - 195.16.75.255 ru 195.16.76.0 - 195.16.79.255 ua 195.16.80.0 - 195.16.83.255 de 195.16.84.0 - 195.16.87.255 nl -195.16.88.0 - 195.16.91.255 ua -195.16.92.0 - 195.16.110.127 ru -195.16.110.128 - 195.16.110.191 kz -195.16.110.192 - 195.16.127.255 ru +195.16.88.0 - 195.16.91.255 cz +195.16.92.0 - 195.16.127.255 ru 195.16.128.0 - 195.16.159.255 es -195.16.160.0 - 195.16.160.128 de -195.16.160.129 - 195.16.160.255 gb -195.16.161.0 - 195.16.162.255 de -195.16.163.0 - 195.16.169.255 gb -195.16.170.0 - 195.16.170.255 ie -195.16.171.0 - 195.16.171.255 sa -195.16.172.0 - 195.16.175.127 gb -195.16.175.128 - 195.16.175.143 fr -195.16.175.144 - 195.16.175.159 gb -195.16.175.160 - 195.16.175.255 de -195.16.176.0 - 195.16.177.127 gb -195.16.177.128 - 195.16.177.143 ch -195.16.177.144 - 195.16.177.175 gb -195.16.177.176 - 195.16.177.183 nl -195.16.177.184 - 195.16.177.223 gb -195.16.177.224 - 195.16.177.231 uz -195.16.177.232 - 195.16.181.255 gb -195.16.182.0 - 195.16.183.255 fr -195.16.184.0 - 195.16.184.255 gb -195.16.185.0 - 195.16.185.31 ch -195.16.185.32 - 195.16.185.191 gb -195.16.185.192 - 195.16.185.223 fr -195.16.185.224 - 195.16.185.255 gb -195.16.186.0 - 195.16.186.127 se -195.16.186.128 - 195.16.186.135 gb -195.16.186.136 - 195.16.186.143 ie -195.16.186.144 - 195.16.186.151 de -195.16.186.152 - 195.16.186.231 gb -195.16.186.232 - 195.16.186.239 nl -195.16.186.240 - 195.16.186.255 gb -195.16.187.0 - 195.16.187.63 se -195.16.187.64 - 195.16.187.95 fr -195.16.187.96 - 195.16.187.127 de -195.16.187.128 - 195.16.187.159 it -195.16.187.160 - 195.16.187.191 nl -195.16.187.192 - 195.16.187.223 dk -195.16.187.224 - 195.16.187.255 gb -195.16.188.0 - 195.16.188.127 fr -195.16.188.128 - 195.16.189.127 de -195.16.189.128 - 195.16.189.255 fr -195.16.190.0 - 195.16.190.127 es -195.16.190.128 - 195.16.190.255 gb -195.16.191.0 - 195.16.191.127 no -195.16.191.128 - 195.16.191.191 it -195.16.191.192 - 195.16.191.255 nl +195.16.160.0 - 195.16.162.217 gb +195.16.162.218 - 195.16.162.218 de +195.16.162.219 - 195.16.191.255 gb 195.16.192.0 - 195.16.223.255 fi 195.16.224.0 - 195.16.255.255 at -195.17.0.0 - 195.17.128.255 se -195.17.129.0 - 195.17.132.255 ie -195.17.133.0 - 195.17.133.255 se -195.17.134.0 - 195.17.139.255 ie -195.17.140.0 - 195.17.140.255 se -195.17.141.0 - 195.17.141.255 ie -195.17.142.0 - 195.17.159.255 se -195.17.160.0 - 195.17.160.255 gb -195.17.161.0 - 195.17.161.255 se -195.17.162.0 - 195.17.162.255 gb -195.17.163.0 - 195.17.163.255 se -195.17.164.0 - 195.17.166.255 gb -195.17.167.0 - 195.17.168.255 se -195.17.169.0 - 195.17.169.255 gb -195.17.170.0 - 195.17.171.7 se -195.17.171.8 - 195.17.171.15 gb -195.17.171.16 - 195.17.171.127 se -195.17.171.128 - 195.17.171.255 gb -195.17.172.0 - 195.17.245.31 se -195.17.245.32 - 195.17.245.39 ru -195.17.245.40 - 195.17.255.255 se +195.17.0.0 - 195.17.255.255 se 195.18.0.0 - 195.18.3.255 it 195.18.4.0 - 195.18.7.255 gb 195.18.8.0 - 195.18.11.255 il @@ -104136,14 +88864,12 @@ 195.20.12.0 - 195.20.15.255 fr 195.20.16.0 - 195.20.19.255 fi 195.20.20.0 - 195.20.27.255 bg -195.20.28.0 - 195.20.31.255 ua +195.20.28.0 - 195.20.31.255 ru 195.20.32.0 - 195.20.63.255 nl 195.20.64.0 - 195.20.95.255 de 195.20.96.0 - 195.20.97.255 ua -195.20.98.0 - 195.20.99.255 de 195.20.100.0 - 195.20.101.255 se -195.20.102.0 - 195.20.103.255 ua -195.20.104.0 - 195.20.105.255 fr +195.20.102.0 - 195.20.103.255 ru 195.20.106.0 - 195.20.107.255 ro 195.20.108.0 - 195.20.109.255 gb 195.20.110.0 - 195.20.111.255 pl @@ -104167,9 +88893,8 @@ 195.20.138.0 - 195.20.138.255 pl 195.20.139.0 - 195.20.139.255 at 195.20.140.0 - 195.20.140.255 ru -195.20.141.0 - 195.20.141.255 gb +195.20.141.0 - 195.20.141.255 dk 195.20.142.0 - 195.20.142.255 si -195.20.143.0 - 195.20.143.255 be 195.20.144.0 - 195.20.144.255 nl 195.20.145.0 - 195.20.145.255 ro 195.20.146.0 - 195.20.147.255 ch @@ -104185,15 +88910,11 @@ 195.20.157.0 - 195.20.157.255 ch 195.20.158.0 - 195.20.158.255 at 195.20.159.0 - 195.20.159.255 de -195.20.160.0 - 195.20.167.255 sk -195.20.168.0 - 195.20.169.255 nl -195.20.170.0 - 195.20.171.255 sk -195.20.172.0 - 195.20.173.255 cz -195.20.174.0 - 195.20.191.255 sk +195.20.160.0 - 195.20.191.255 sk 195.20.192.0 - 195.20.193.255 mc 195.20.194.0 - 195.20.197.255 ru 195.20.198.0 - 195.20.199.255 fr -195.20.200.0 - 195.20.201.255 gb +195.20.200.0 - 195.20.201.255 pl 195.20.202.0 - 195.20.203.255 ro 195.20.204.0 - 195.20.205.255 nl 195.20.206.0 - 195.20.207.255 se @@ -104205,12 +88926,8 @@ 195.20.218.0 - 195.20.219.255 pl 195.20.220.0 - 195.20.221.255 de 195.20.222.0 - 195.20.223.255 gb -195.20.224.0 - 195.20.247.63 de -195.20.247.64 - 195.20.247.79 gb -195.20.247.80 - 195.20.255.255 de -195.21.0.0 - 195.21.26.255 gb -195.21.27.0 - 195.21.27.255 de -195.21.28.0 - 195.21.255.255 gb +195.20.224.0 - 195.20.255.255 de +195.21.0.0 - 195.21.255.255 gb 195.22.0.0 - 195.22.31.255 pt 195.22.32.0 - 195.22.63.255 cz 195.22.64.0 - 195.22.95.255 se @@ -104220,8 +88937,10 @@ 195.22.108.0 - 195.22.115.255 ua 195.22.116.0 - 195.22.119.255 pl 195.22.120.0 - 195.22.120.255 ch -195.22.121.0 - 195.22.121.255 gb -195.22.122.0 - 195.22.123.255 ru +195.22.121.0 - 195.22.121.9 gb +195.22.121.10 - 195.22.121.10 eu +195.22.121.11 - 195.22.121.255 gb +195.22.123.0 - 195.22.123.255 ru 195.22.124.0 - 195.22.127.255 pl 195.22.128.0 - 195.22.129.255 gb 195.22.130.0 - 195.22.133.255 ua @@ -104232,45 +88951,11 @@ 195.22.142.0 - 195.22.143.255 de 195.22.144.0 - 195.22.145.255 fr 195.22.146.0 - 195.22.147.255 bg -195.22.148.0 - 195.22.149.255 il 195.22.150.0 - 195.22.151.255 gb -195.22.152.0 - 195.22.153.255 ua 195.22.154.0 - 195.22.155.255 gr -195.22.156.0 - 195.22.159.255 gb +195.22.158.0 - 195.22.159.255 gb 195.22.160.0 - 195.22.191.255 lt -195.22.192.0 - 195.22.192.255 it -195.22.193.0 - 195.22.193.255 gr -195.22.194.0 - 195.22.194.255 it -195.22.195.0 - 195.22.195.255 us -195.22.196.0 - 195.22.198.255 it -195.22.199.0 - 195.22.199.255 us -195.22.200.0 - 195.22.202.159 it -195.22.202.160 - 195.22.202.255 gr -195.22.203.0 - 195.22.205.255 it -195.22.206.0 - 195.22.206.255 us -195.22.207.0 - 195.22.207.63 ie -195.22.207.64 - 195.22.207.135 it -195.22.207.136 - 195.22.207.143 nl -195.22.207.144 - 195.22.207.159 gr -195.22.207.160 - 195.22.207.183 it -195.22.207.184 - 195.22.207.191 de -195.22.207.192 - 195.22.208.255 it -195.22.209.0 - 195.22.209.255 gb -195.22.210.0 - 195.22.210.255 fr -195.22.211.0 - 195.22.211.255 de -195.22.212.0 - 195.22.212.255 ch -195.22.213.0 - 195.22.213.255 nl -195.22.214.0 - 195.22.214.255 be -195.22.215.0 - 195.22.215.255 at -195.22.216.0 - 195.22.216.255 us -195.22.217.0 - 195.22.217.255 es -195.22.218.0 - 195.22.218.255 it -195.22.219.0 - 195.22.219.255 br -195.22.220.0 - 195.22.220.255 ar -195.22.221.0 - 195.22.221.255 cl -195.22.222.0 - 195.22.222.255 us -195.22.223.0 - 195.22.223.127 it -195.22.223.128 - 195.22.223.255 hk +195.22.192.0 - 195.22.223.255 it 195.22.224.0 - 195.22.255.255 md 195.23.0.0 - 195.23.255.255 pt 195.24.0.0 - 195.24.31.255 dk @@ -104296,32 +88981,22 @@ 195.24.250.0 - 195.24.251.255 eu 195.24.252.0 - 195.24.253.255 ua 195.24.254.0 - 195.24.255.255 ru -195.25.0.0 - 195.25.138.135 fr -195.25.138.136 - 195.25.138.143 de -195.25.138.144 - 195.25.174.55 fr -195.25.174.56 - 195.25.174.63 de -195.25.174.64 - 195.25.174.159 fr -195.25.174.160 - 195.25.174.167 mc -195.25.174.168 - 195.25.255.255 fr +195.25.0.0 - 195.25.255.255 fr 195.26.0.0 - 195.26.1.255 no 195.26.2.0 - 195.26.3.255 be 195.26.4.0 - 195.26.5.255 lu -195.26.6.0 - 195.26.7.255 ru -195.26.8.0 - 195.26.9.255 fr 195.26.10.0 - 195.26.11.255 se 195.26.12.0 - 195.26.13.255 pl 195.26.14.0 - 195.26.15.255 at 195.26.16.0 - 195.26.19.255 ua 195.26.20.0 - 195.26.21.255 lv 195.26.22.0 - 195.26.24.255 pl +195.26.25.0 - 195.26.25.255 cz 195.26.26.0 - 195.26.27.255 gb 195.26.28.0 - 195.26.29.255 se 195.26.30.0 - 195.26.31.255 ru -195.26.32.0 - 195.26.58.215 gb -195.26.58.216 - 195.26.58.223 us -195.26.58.224 - 195.26.63.255 gb +195.26.32.0 - 195.26.63.255 gb 195.26.64.0 - 195.26.67.255 ua -195.26.68.0 - 195.26.71.255 ru 195.26.72.0 - 195.26.79.255 pl 195.26.80.0 - 195.26.87.255 ua 195.26.88.0 - 195.26.91.255 gb @@ -104336,15 +89011,18 @@ 195.27.1.136 - 195.27.1.139 de 195.27.1.140 - 195.27.1.143 eu 195.27.1.144 - 195.27.1.199 de -195.27.1.200 - 195.27.2.159 eu +195.27.1.200 - 195.27.1.255 eu +195.27.2.0 - 195.27.2.127 de +195.27.2.128 - 195.27.2.159 eu 195.27.2.160 - 195.27.2.183 de -195.27.2.184 - 195.27.2.255 eu -195.27.3.0 - 195.27.3.63 ie +195.27.2.184 - 195.27.3.15 eu +195.27.3.16 - 195.27.3.63 ie 195.27.3.64 - 195.27.3.151 gb 195.27.3.152 - 195.27.3.159 eu 195.27.3.160 - 195.27.3.191 ie 195.27.3.192 - 195.27.3.223 gb -195.27.3.224 - 195.27.7.127 eu +195.27.3.224 - 195.27.3.255 ie +195.27.4.0 - 195.27.7.127 eu 195.27.7.128 - 195.27.7.255 de 195.27.8.0 - 195.27.10.47 gb 195.27.10.48 - 195.27.10.63 de @@ -104356,16 +89034,21 @@ 195.27.11.16 - 195.27.11.31 de 195.27.11.32 - 195.27.13.255 gb 195.27.14.0 - 195.27.14.7 ir -195.27.14.8 - 195.27.14.15 ie -195.27.14.16 - 195.27.14.23 gb +195.27.14.8 - 195.27.14.23 gb 195.27.14.24 - 195.27.14.47 ie 195.27.14.48 - 195.27.14.95 gb -195.27.14.96 - 195.27.14.119 ie -195.27.14.120 - 195.27.14.127 gb -195.27.14.128 - 195.27.14.255 ie +195.27.14.96 - 195.27.14.255 ie 195.27.15.0 - 195.27.17.255 gb 195.27.18.0 - 195.27.19.255 eu -195.27.20.0 - 195.27.20.255 gb +195.27.20.0 - 195.27.20.31 gb +195.27.20.32 - 195.27.20.39 eu +195.27.20.40 - 195.27.20.79 gb +195.27.20.80 - 195.27.20.95 eu +195.27.20.96 - 195.27.20.111 gb +195.27.20.112 - 195.27.20.115 eu +195.27.20.116 - 195.27.20.175 gb +195.27.20.176 - 195.27.20.191 eu +195.27.20.192 - 195.27.20.255 gb 195.27.21.0 - 195.27.21.63 de 195.27.21.64 - 195.27.21.127 gb 195.27.21.128 - 195.27.21.255 de @@ -104378,10 +89061,16 @@ 195.27.25.64 - 195.27.25.127 de 195.27.25.128 - 195.27.29.255 eu 195.27.30.0 - 195.27.31.255 de -195.27.32.0 - 195.27.32.255 eu -195.27.33.0 - 195.27.33.255 de -195.27.34.0 - 195.27.35.255 gb -195.27.36.0 - 195.27.36.127 eu +195.27.32.0 - 195.27.32.255 ae +195.27.33.0 - 195.27.33.255 eu +195.27.34.0 - 195.27.34.127 gb +195.27.34.128 - 195.27.34.135 eu +195.27.34.136 - 195.27.34.159 gb +195.27.34.160 - 195.27.34.215 eu +195.27.34.216 - 195.27.34.239 gb +195.27.34.240 - 195.27.35.63 eu +195.27.35.64 - 195.27.35.71 gb +195.27.35.72 - 195.27.36.127 eu 195.27.36.128 - 195.27.36.191 de 195.27.36.192 - 195.27.40.15 eu 195.27.40.16 - 195.27.40.31 de @@ -104399,19 +89088,29 @@ 195.27.52.16 - 195.27.52.39 de 195.27.52.40 - 195.27.52.51 gb 195.27.52.52 - 195.27.52.55 de -195.27.52.56 - 195.27.52.191 gb +195.27.52.56 - 195.27.52.63 gb +195.27.52.64 - 195.27.52.79 de +195.27.52.80 - 195.27.52.191 gb 195.27.52.192 - 195.27.52.207 gi -195.27.52.208 - 195.27.53.255 gb +195.27.52.208 - 195.27.52.223 gb +195.27.52.224 - 195.27.52.239 de +195.27.52.240 - 195.27.53.255 gb 195.27.54.0 - 195.27.55.255 eu -195.27.56.0 - 195.27.58.255 fr -195.27.59.0 - 195.27.59.255 de -195.27.60.0 - 195.27.61.255 eu +195.27.56.0 - 195.27.59.15 fr +195.27.59.16 - 195.27.60.69 eu +195.27.60.70 - 195.27.60.70 gb +195.27.60.71 - 195.27.60.81 eu +195.27.60.82 - 195.27.60.82 gb +195.27.60.83 - 195.27.60.255 eu +195.27.61.0 - 195.27.61.23 ae +195.27.61.24 - 195.27.61.255 eu 195.27.62.0 - 195.27.63.255 de 195.27.64.0 - 195.27.67.255 gb 195.27.68.0 - 195.27.70.255 de 195.27.71.0 - 195.27.71.255 eu 195.27.72.0 - 195.27.72.255 de -195.27.73.0 - 195.27.78.255 eu +195.27.73.0 - 195.27.77.255 eu +195.27.78.0 - 195.27.78.255 om 195.27.79.0 - 195.27.79.255 de 195.27.80.0 - 195.27.82.255 eu 195.27.83.0 - 195.27.84.255 de @@ -104433,9 +89132,9 @@ 195.27.102.224 - 195.27.102.255 de 195.27.103.0 - 195.27.103.31 eu 195.27.103.32 - 195.27.103.63 de -195.27.103.64 - 195.27.112.255 eu -195.27.113.0 - 195.27.115.255 de -195.27.116.0 - 195.27.130.15 eu +195.27.103.64 - 195.27.119.255 eu +195.27.120.0 - 195.27.123.255 gb +195.27.124.0 - 195.27.130.15 eu 195.27.130.16 - 195.27.130.31 de 195.27.130.32 - 195.27.130.143 eu 195.27.130.144 - 195.27.130.207 de @@ -104455,7 +89154,9 @@ 195.27.143.8 - 195.27.143.11 de 195.27.143.12 - 195.27.143.127 eu 195.27.143.128 - 195.27.143.191 de -195.27.143.192 - 195.27.148.127 eu +195.27.143.192 - 195.27.143.255 eu +195.27.144.0 - 195.27.147.255 gb +195.27.148.0 - 195.27.148.127 eu 195.27.148.128 - 195.27.148.255 de 195.27.149.0 - 195.27.149.255 eu 195.27.150.0 - 195.27.150.255 de @@ -104467,9 +89168,7 @@ 195.27.153.8 - 195.27.153.127 eu 195.27.153.128 - 195.27.153.255 fr 195.27.154.0 - 195.27.155.255 de -195.27.156.0 - 195.27.158.255 eu -195.27.159.0 - 195.27.159.127 de -195.27.159.128 - 195.27.159.255 eu +195.27.156.0 - 195.27.159.255 gb 195.27.160.0 - 195.27.160.15 de 195.27.160.16 - 195.27.161.255 eu 195.27.162.0 - 195.27.163.255 de @@ -104487,15 +89186,13 @@ 195.27.176.224 - 195.27.176.227 de 195.27.176.228 - 195.27.177.95 eu 195.27.177.96 - 195.27.177.151 de -195.27.177.152 - 195.27.177.239 eu -195.27.177.240 - 195.27.177.247 de -195.27.177.248 - 195.27.179.255 eu +195.27.177.152 - 195.27.179.255 eu 195.27.180.0 - 195.27.180.255 gb 195.27.181.0 - 195.27.181.255 nl 195.27.182.0 - 195.27.183.15 gb 195.27.183.16 - 195.27.183.127 de -195.27.183.128 - 195.27.183.255 gb -195.27.184.0 - 195.27.189.255 eu +195.27.183.128 - 195.27.187.255 gb +195.27.188.0 - 195.27.189.255 eu 195.27.190.0 - 195.27.191.63 de 195.27.191.64 - 195.27.191.255 eu 195.27.192.0 - 195.27.192.127 de @@ -104545,22 +89242,21 @@ 195.27.243.72 - 195.27.243.79 de 195.27.243.80 - 195.27.243.103 eu 195.27.243.104 - 195.27.243.111 de -195.27.243.112 - 195.27.243.127 eu +195.27.243.112 - 195.27.243.127 gb 195.27.243.128 - 195.27.243.255 de 195.27.244.0 - 195.27.247.255 eu 195.27.248.0 - 195.27.248.31 de 195.27.248.32 - 195.27.248.63 us 195.27.248.64 - 195.27.248.127 de -195.27.248.128 - 195.27.248.255 eu -195.27.249.0 - 195.27.249.127 de +195.27.248.128 - 195.27.249.31 eu +195.27.249.32 - 195.27.249.127 de 195.27.249.128 - 195.27.251.255 eu 195.27.252.0 - 195.27.252.255 de 195.27.253.0 - 195.27.254.255 eu 195.27.255.0 - 195.27.255.255 de +195.28.0.0 - 195.28.1.255 pl 195.28.2.0 - 195.28.5.255 ro -195.28.6.0 - 195.28.7.255 bg 195.28.8.0 - 195.28.9.255 ro -195.28.10.0 - 195.28.11.255 ru 195.28.12.0 - 195.28.13.255 de 195.28.14.0 - 195.28.15.255 ru 195.28.16.0 - 195.28.17.255 pl @@ -104577,54 +89273,58 @@ 195.28.162.0 - 195.28.163.255 ro 195.28.164.0 - 195.28.165.255 be 195.28.166.0 - 195.28.167.255 il -195.28.168.0 - 195.28.169.255 gb 195.28.170.0 - 195.28.171.255 pl 195.28.172.0 - 195.28.173.255 no 195.28.174.0 - 195.28.175.255 de 195.28.176.0 - 195.28.177.255 ro -195.28.178.0 - 195.28.179.255 pl 195.28.180.0 - 195.28.181.255 il +195.28.182.0 - 195.28.183.255 ua 195.28.184.0 - 195.28.185.255 ro 195.28.186.0 - 195.28.187.255 de 195.28.188.0 - 195.28.189.255 ro -195.28.190.0 - 195.28.191.255 at -195.28.192.0 - 195.28.199.255 gb -195.28.200.0 - 195.28.202.255 fr -195.28.203.0 - 195.28.223.255 gb +195.28.190.0 - 195.28.191.255 pl +195.28.192.0 - 195.28.223.255 fr 195.28.224.0 - 195.28.255.255 ch 195.29.0.0 - 195.29.255.255 hr 195.30.0.0 - 195.30.255.255 de 195.31.0.0 - 195.32.127.255 it 195.32.128.0 - 195.32.255.255 de -195.33.0.0 - 195.33.3.255 gb -195.33.4.0 - 195.33.4.7 ie -195.33.4.8 - 195.33.28.95 gb -195.33.28.96 - 195.33.28.103 dk -195.33.28.104 - 195.33.28.111 fr -195.33.28.112 - 195.33.28.119 es +195.33.0.0 - 195.33.0.75 nl +195.33.0.76 - 195.33.0.76 eu +195.33.0.77 - 195.33.28.103 nl +195.33.28.104 - 195.33.28.112 gb +195.33.28.113 - 195.33.28.119 es 195.33.28.120 - 195.33.28.127 de -195.33.28.128 - 195.33.28.143 gb +195.33.28.128 - 195.33.28.143 nl 195.33.28.144 - 195.33.28.151 pt 195.33.28.152 - 195.33.28.159 fi 195.33.28.160 - 195.33.28.167 no 195.33.28.168 - 195.33.28.175 cz -195.33.28.176 - 195.33.31.255 gb -195.33.32.0 - 195.33.32.255 nl -195.33.33.0 - 195.33.33.255 gb -195.33.34.0 - 195.33.47.255 nl +195.33.28.176 - 195.33.28.191 it +195.33.28.192 - 195.33.34.78 nl +195.33.34.79 - 195.33.34.80 eu +195.33.34.81 - 195.33.47.255 nl 195.33.48.0 - 195.33.63.255 gb -195.33.64.0 - 195.33.91.255 fr -195.33.92.0 - 195.33.92.255 jo -195.33.93.0 - 195.33.95.255 fr -195.33.96.0 - 195.33.127.255 gb -195.33.128.0 - 195.33.159.255 nl -195.33.160.0 - 195.33.191.255 de +195.33.64.0 - 195.33.95.255 fr +195.33.96.0 - 195.33.105.255 gb +195.33.106.0 - 195.33.106.255 eu +195.33.107.0 - 195.33.127.255 gb +195.33.128.0 - 195.33.128.255 nl +195.33.129.0 - 195.33.129.255 eu +195.33.130.0 - 195.33.130.255 nl +195.33.131.0 - 195.33.131.255 eu +195.33.132.0 - 195.33.139.255 nl +195.33.140.0 - 195.33.140.255 eu +195.33.141.0 - 195.33.159.255 nl +195.33.160.0 - 195.33.165.255 de +195.33.166.0 - 195.33.166.255 eu +195.33.167.0 - 195.33.191.255 de 195.33.192.0 - 195.33.255.255 tr -195.34.0.0 - 195.34.63.255 ru +195.34.0.0 - 195.34.27.255 ru +195.34.28.0 - 195.34.29.255 uz +195.34.30.0 - 195.34.63.255 ru 195.34.64.0 - 195.34.65.255 de -195.34.66.0 - 195.34.67.255 ro 195.34.68.0 - 195.34.69.255 sa -195.34.70.0 - 195.34.71.255 es 195.34.72.0 - 195.34.73.255 ch 195.34.74.0 - 195.34.75.255 ua 195.34.76.0 - 195.34.77.255 ro @@ -104639,12 +89339,10 @@ 195.34.94.0 - 195.34.95.255 ua 195.34.96.0 - 195.34.127.255 bg 195.34.128.0 - 195.34.159.255 at -195.34.160.0 - 195.34.179.63 de -195.34.179.64 - 195.34.179.79 pl -195.34.179.80 - 195.34.179.95 lv -195.34.179.96 - 195.34.191.255 de +195.34.160.0 - 195.34.191.255 de 195.34.192.0 - 195.34.195.255 ru -195.34.196.0 - 195.34.207.255 ua +195.34.196.0 - 195.34.199.255 ua +195.34.204.0 - 195.34.207.255 ua 195.34.208.0 - 195.34.211.255 pl 195.34.212.0 - 195.34.215.255 lt 195.34.216.0 - 195.34.219.255 pl @@ -104654,7 +89352,6 @@ 195.35.64.0 - 195.35.64.255 be 195.35.65.0 - 195.35.65.255 ua 195.35.66.0 - 195.35.66.255 pt -195.35.67.0 - 195.35.67.255 gb 195.35.68.0 - 195.35.71.255 ru 195.35.72.0 - 195.35.79.255 de 195.35.80.0 - 195.35.80.255 pl @@ -104662,29 +89359,25 @@ 195.35.82.0 - 195.35.83.255 se 195.35.84.0 - 195.35.84.255 bg 195.35.85.0 - 195.35.85.255 ps -195.35.86.0 - 195.35.86.255 se +195.35.86.0 - 195.35.86.255 ie 195.35.87.0 - 195.35.89.255 de 195.35.90.0 - 195.35.91.255 gb 195.35.92.0 - 195.35.95.255 gr 195.35.96.0 - 195.35.96.255 pt -195.35.97.0 - 195.35.97.255 se -195.35.98.0 - 195.35.98.255 de 195.35.99.0 - 195.35.99.255 it 195.35.100.0 - 195.35.101.255 se -195.35.102.0 - 195.35.102.255 ch 195.35.103.0 - 195.35.103.255 de -195.35.104.0 - 195.35.104.31 gb 195.35.104.32 - 195.35.104.63 at 195.35.104.64 - 195.35.104.255 it 195.35.105.0 - 195.35.105.255 gr 195.35.106.0 - 195.35.106.255 fr 195.35.107.0 - 195.35.107.255 lv -195.35.108.0 - 195.35.109.255 de +195.35.108.0 - 195.35.108.255 ru +195.35.109.0 - 195.35.109.255 no 195.35.110.0 - 195.35.111.255 be 195.35.112.0 - 195.35.113.255 gb +195.35.114.0 - 195.35.115.255 nl 195.35.116.0 - 195.35.117.255 ru -195.35.118.0 - 195.35.118.255 ro -195.35.119.0 - 195.35.119.255 ch 195.35.120.0 - 195.35.120.255 gb 195.35.121.0 - 195.35.121.255 ch 195.35.122.0 - 195.35.122.255 si @@ -104693,16 +89386,15 @@ 195.35.127.0 - 195.35.127.255 de 195.35.128.0 - 195.35.255.255 nl 195.36.0.0 - 195.36.63.255 it -195.36.64.0 - 195.36.127.255 de +195.36.64.0 - 195.36.95.255 de +195.36.96.0 - 195.36.103.255 gb +195.36.104.0 - 195.36.127.255 de 195.36.128.0 - 195.36.255.255 fr 195.37.0.0 - 195.37.255.255 de -195.38.0.0 - 195.38.7.255 se -195.38.8.0 - 195.38.11.255 de 195.38.12.0 - 195.38.15.255 pl 195.38.16.0 - 195.38.18.255 ua 195.38.19.0 - 195.38.19.255 gb 195.38.20.0 - 195.38.20.255 de -195.38.21.0 - 195.38.21.255 gb 195.38.22.0 - 195.38.22.255 kz 195.38.23.0 - 195.38.23.255 ru 195.38.24.0 - 195.38.27.255 de @@ -104716,21 +89408,22 @@ 195.38.160.0 - 195.38.191.255 kg 195.38.192.0 - 195.38.255.255 nl 195.39.0.0 - 195.39.127.255 cz -195.39.128.0 - 195.39.191.255 kw +195.39.128.0 - 195.39.147.255 kw +195.39.148.0 - 195.39.148.255 us +195.39.149.0 - 195.39.153.255 kw +195.39.154.0 - 195.39.154.255 us +195.39.155.0 - 195.39.191.255 kw 195.39.192.0 - 195.39.193.255 gb -195.39.194.0 - 195.39.195.255 de 195.39.196.0 - 195.39.197.255 ua 195.39.198.0 - 195.39.199.255 bg 195.39.200.0 - 195.39.201.255 at -195.39.202.0 - 195.39.205.255 gb 195.39.206.0 - 195.39.207.255 ru 195.39.208.0 - 195.39.209.255 ro 195.39.210.0 - 195.39.211.255 ua 195.39.212.0 - 195.39.213.255 bg -195.39.214.0 - 195.39.215.255 ua 195.39.216.0 - 195.39.217.255 pl 195.39.218.0 - 195.39.219.255 dz -195.39.220.0 - 195.39.223.255 de +195.39.222.0 - 195.39.223.255 de 195.39.224.0 - 195.39.225.255 tr 195.39.226.0 - 195.39.227.255 de 195.39.228.0 - 195.39.229.255 ru @@ -104738,24 +89431,14 @@ 195.39.232.0 - 195.39.233.255 ua 195.39.234.0 - 195.39.235.255 de 195.39.236.0 - 195.39.237.255 gr -195.39.238.0 - 195.39.238.255 gb 195.39.239.0 - 195.39.239.255 cz 195.39.240.0 - 195.39.243.255 ua 195.39.244.0 - 195.39.245.255 be -195.39.246.0 - 195.39.247.255 de 195.39.248.0 - 195.39.249.255 ua -195.39.250.0 - 195.39.251.255 fr -195.39.252.0 - 195.39.253.255 ua 195.39.254.0 - 195.39.255.255 nl -195.40.0.0 - 195.40.99.159 gb -195.40.99.160 - 195.40.99.191 fr -195.40.99.192 - 195.40.189.255 gb -195.40.190.0 - 195.40.190.255 a2 -195.40.191.0 - 195.40.255.255 gb +195.40.0.0 - 195.40.255.255 gb 195.41.0.0 - 195.41.255.255 dk -195.42.0.0 - 195.42.32.207 fr -195.42.32.208 - 195.42.32.223 ru -195.42.32.224 - 195.42.63.255 fr +195.42.0.0 - 195.42.63.255 fr 195.42.64.0 - 195.42.97.255 ru 195.42.98.0 - 195.42.99.255 pl 195.42.100.0 - 195.42.101.255 de @@ -104768,7 +89451,7 @@ 195.42.114.0 - 195.42.115.255 de 195.42.116.0 - 195.42.117.255 ro 195.42.118.0 - 195.42.119.255 ru -195.42.120.0 - 195.42.121.255 ie +195.42.120.0 - 195.42.121.255 de 195.42.122.0 - 195.42.123.255 ru 195.42.124.0 - 195.42.125.255 fr 195.42.126.0 - 195.42.127.255 ua @@ -104785,14 +89468,13 @@ 195.42.148.0 - 195.42.149.255 fr 195.42.150.0 - 195.42.151.255 dk 195.42.152.0 - 195.42.153.255 pl -195.42.154.0 - 195.42.191.255 ru +195.42.154.0 - 195.42.157.255 ru +195.42.160.0 - 195.42.191.255 ru 195.42.192.0 - 195.42.223.255 se 195.42.224.0 - 195.42.229.255 nl 195.42.230.0 - 195.42.230.255 at 195.42.231.0 - 195.42.231.255 fr -195.42.232.0 - 195.42.235.255 de 195.42.236.0 - 195.42.239.255 gb -195.42.240.0 - 195.42.248.255 nl 195.42.249.0 - 195.42.249.255 pl 195.42.250.0 - 195.42.251.255 fr 195.42.252.0 - 195.42.255.255 de @@ -104812,12 +89494,11 @@ 195.43.74.0 - 195.43.75.255 am 195.43.76.0 - 195.43.77.255 cz 195.43.78.0 - 195.43.79.255 dk -195.43.80.0 - 195.43.83.255 lv +195.43.82.0 - 195.43.83.255 lv 195.43.84.0 - 195.43.85.255 pl 195.43.86.0 - 195.43.87.255 ee 195.43.88.0 - 195.43.89.255 de -195.43.90.0 - 195.43.93.255 ru -195.43.94.0 - 195.43.95.255 sc +195.43.90.0 - 195.43.95.255 ru 195.43.96.0 - 195.43.127.255 lu 195.43.129.0 - 195.43.129.255 it 195.43.130.0 - 195.43.130.255 nl @@ -104831,7 +89512,7 @@ 195.43.138.0 - 195.43.138.255 nl 195.43.139.0 - 195.43.139.255 at 195.43.140.0 - 195.43.140.255 ch -195.43.141.0 - 195.43.141.255 li +195.43.141.0 - 195.43.141.255 de 195.43.142.0 - 195.43.143.255 pl 195.43.144.0 - 195.43.144.255 ru 195.43.145.0 - 195.43.145.255 no @@ -105002,7 +89683,9 @@ 195.44.192.0 - 195.44.193.63 eu 195.44.193.64 - 195.44.196.15 gb 195.44.196.16 - 195.44.196.31 eu -195.44.196.32 - 195.44.197.111 gb +195.44.196.32 - 195.44.197.63 gb +195.44.197.64 - 195.44.197.71 eu +195.44.197.72 - 195.44.197.111 gb 195.44.197.112 - 195.44.197.119 eu 195.44.197.120 - 195.44.197.159 gb 195.44.197.160 - 195.44.197.167 eu @@ -105019,7 +89702,9 @@ 195.45.0.0 - 195.45.255.255 it 195.46.0.0 - 195.46.31.255 gr 195.46.32.0 - 195.46.35.255 ua -195.46.36.0 - 195.46.39.255 nl +195.46.36.0 - 195.46.37.255 pl +195.46.38.0 - 195.46.38.255 nl +195.46.39.0 - 195.46.39.255 ru 195.46.40.0 - 195.46.43.255 pl 195.46.44.0 - 195.46.47.255 de 195.46.48.0 - 195.46.51.255 gb @@ -105031,9 +89716,9 @@ 195.46.128.0 - 195.46.159.255 tr 195.46.160.0 - 195.46.191.255 ru 195.46.192.0 - 195.46.223.255 fr -195.46.224.0 - 195.46.255.119 lu -195.46.255.120 - 195.46.255.127 a2 -195.46.255.128 - 195.46.255.255 lu +195.46.224.0 - 195.46.248.255 lu +195.46.249.0 - 195.46.249.255 eu +195.46.250.0 - 195.46.255.255 lu 195.47.0.0 - 195.47.127.255 cz 195.47.128.0 - 195.47.191.255 dk 195.47.192.0 - 195.47.192.255 ru @@ -105054,17 +89739,13 @@ 195.47.207.0 - 195.47.207.255 gb 195.47.208.0 - 195.47.208.255 gr 195.47.209.0 - 195.47.209.255 es -195.47.210.0 - 195.47.210.255 dk 195.47.211.0 - 195.47.211.255 si -195.47.212.0 - 195.47.212.255 ua 195.47.213.0 - 195.47.213.255 si 195.47.214.0 - 195.47.214.255 ro 195.47.215.0 - 195.47.215.255 be -195.47.216.0 - 195.47.216.255 dk 195.47.217.0 - 195.47.217.255 at -195.47.218.0 - 195.47.218.255 lt 195.47.219.0 - 195.47.219.255 ua -195.47.220.0 - 195.47.220.255 kz +195.47.220.0 - 195.47.220.255 ru 195.47.221.0 - 195.47.221.255 it 195.47.222.0 - 195.47.222.255 dk 195.47.223.0 - 195.47.223.255 gb @@ -105074,7 +89755,6 @@ 195.47.227.0 - 195.47.227.255 pl 195.47.228.0 - 195.47.228.255 si 195.47.229.0 - 195.47.229.255 de -195.47.230.0 - 195.47.230.255 dk 195.47.231.0 - 195.47.231.255 ch 195.47.232.0 - 195.47.232.255 it 195.47.233.0 - 195.47.233.255 gr @@ -105083,10 +89763,8 @@ 195.47.236.0 - 195.47.236.255 es 195.47.237.0 - 195.47.237.255 gb 195.47.238.0 - 195.47.238.255 se -195.47.239.0 - 195.47.239.255 pl 195.47.240.0 - 195.47.240.255 gb 195.47.241.0 - 195.47.241.255 fr -195.47.242.0 - 195.47.242.255 ro 195.47.243.0 - 195.47.243.255 si 195.47.244.0 - 195.47.244.255 gb 195.47.245.0 - 195.47.245.255 ch @@ -105094,14 +89772,12 @@ 195.47.247.0 - 195.47.247.255 dk 195.47.248.0 - 195.47.248.255 ua 195.47.249.0 - 195.47.249.255 de -195.47.250.0 - 195.47.250.255 tj 195.47.251.0 - 195.47.251.255 it 195.47.252.0 - 195.47.252.255 il 195.47.253.0 - 195.47.253.255 ua 195.47.254.0 - 195.47.254.255 se 195.47.255.0 - 195.47.255.255 kz 195.48.0.0 - 195.49.127.255 ch -195.49.128.0 - 195.49.131.255 ua 195.49.132.0 - 195.49.135.255 fr 195.49.136.0 - 195.49.139.255 de 195.49.140.0 - 195.49.143.255 fr @@ -105116,197 +89792,42 @@ 195.49.180.0 - 195.49.183.255 gb 195.49.184.0 - 195.49.187.255 ru 195.49.188.0 - 195.49.191.255 sk -195.49.192.0 - 195.49.199.255 ru -195.49.200.0 - 195.49.207.255 ua +195.49.192.0 - 195.49.205.255 ru +195.49.206.0 - 195.49.206.255 ua +195.49.207.0 - 195.49.207.255 ru 195.49.208.0 - 195.49.215.255 kz 195.49.216.0 - 195.49.223.255 tr 195.49.224.0 - 195.49.231.255 de -195.49.232.0 - 195.49.239.255 ro 195.49.240.0 - 195.49.247.255 se 195.49.248.0 - 195.49.255.255 ro 195.50.0.0 - 195.50.31.255 by 195.50.32.0 - 195.50.63.255 dk 195.50.64.0 - 195.50.127.255 gb 195.50.128.0 - 195.50.191.255 de -195.50.192.0 - 195.50.223.255 ee -195.50.224.0 - 195.50.255.255 ch -195.51.0.0 - 195.51.11.127 de -195.51.11.128 - 195.51.11.151 at -195.51.11.152 - 195.51.11.255 eu -195.51.12.0 - 195.51.39.255 de -195.51.40.0 - 195.51.41.255 eu -195.51.42.0 - 195.51.44.255 de -195.51.45.0 - 195.51.45.255 eu -195.51.46.0 - 195.51.47.255 de -195.51.48.0 - 195.51.48.255 fr -195.51.49.0 - 195.51.49.31 gb -195.51.49.32 - 195.51.49.63 de -195.51.49.64 - 195.51.49.191 fr -195.51.49.192 - 195.51.50.31 de -195.51.50.32 - 195.51.50.39 lu -195.51.50.40 - 195.51.50.47 gb -195.51.50.48 - 195.51.50.191 fr -195.51.50.192 - 195.51.50.255 nl -195.51.51.0 - 195.51.51.255 fr -195.51.52.0 - 195.51.52.31 de -195.51.52.32 - 195.51.52.63 it -195.51.52.64 - 195.51.52.127 fr -195.51.52.128 - 195.51.52.255 ro -195.51.53.0 - 195.51.53.255 fr -195.51.54.0 - 195.51.59.255 de -195.51.60.0 - 195.51.60.255 eu -195.51.61.0 - 195.51.63.255 de -195.51.64.0 - 195.51.67.127 nl -195.51.67.128 - 195.51.67.255 de -195.51.68.0 - 195.51.69.95 nl -195.51.69.96 - 195.51.69.191 gb -195.51.69.192 - 195.51.69.207 za -195.51.69.208 - 195.51.69.215 ch -195.51.69.216 - 195.51.69.223 gb -195.51.69.224 - 195.51.69.255 se -195.51.70.0 - 195.51.71.255 nl -195.51.72.0 - 195.51.75.255 be -195.51.76.0 - 195.51.77.191 ch -195.51.77.192 - 195.51.77.223 eu -195.51.77.224 - 195.51.77.255 ch -195.51.78.0 - 195.51.79.255 gb -195.51.80.0 - 195.51.87.255 be -195.51.88.0 - 195.51.91.95 za -195.51.91.96 - 195.51.91.111 be -195.51.91.112 - 195.51.91.119 gb -195.51.91.120 - 195.51.91.127 it -195.51.91.128 - 195.51.91.191 za -195.51.91.192 - 195.51.91.255 nl -195.51.92.0 - 195.51.92.255 eu +195.50.192.0 - 195.50.255.255 ee +195.51.0.0 - 195.51.15.255 eu +195.51.16.0 - 195.51.35.255 de +195.51.36.0 - 195.51.55.255 eu +195.51.56.0 - 195.51.59.255 de +195.51.60.0 - 195.51.83.255 eu +195.51.84.0 - 195.51.87.255 be +195.51.88.0 - 195.51.92.255 eu 195.51.93.0 - 195.51.95.255 nl -195.51.96.0 - 195.51.111.255 fr -195.51.112.0 - 195.51.113.127 es -195.51.113.128 - 195.51.113.191 ru -195.51.113.192 - 195.51.113.255 gb -195.51.114.0 - 195.51.115.255 es -195.51.116.0 - 195.51.116.255 eu -195.51.117.0 - 195.51.117.255 fr -195.51.118.0 - 195.51.119.255 be -195.51.120.0 - 195.51.127.255 it -195.51.128.0 - 195.51.130.255 gb -195.51.131.0 - 195.51.131.159 de -195.51.131.160 - 195.51.131.191 ch -195.51.131.192 - 195.51.131.223 za -195.51.131.224 - 195.51.131.255 be -195.51.132.0 - 195.51.142.255 gb -195.51.143.0 - 195.51.143.95 se -195.51.143.96 - 195.51.143.111 gb -195.51.143.112 - 195.51.143.127 eu -195.51.143.128 - 195.51.146.31 gb -195.51.146.32 - 195.51.146.39 be -195.51.146.40 - 195.51.146.47 ch -195.51.146.48 - 195.51.146.63 se -195.51.146.64 - 195.51.151.255 gb -195.51.152.0 - 195.51.152.127 eu -195.51.152.128 - 195.51.152.167 gb -195.51.152.168 - 195.51.152.175 fr -195.51.152.176 - 195.51.152.191 gb -195.51.152.192 - 195.51.152.255 eu -195.51.153.0 - 195.51.153.255 gb -195.51.154.0 - 195.51.154.255 de -195.51.155.0 - 195.51.155.255 it +195.51.96.0 - 195.51.103.255 eu +195.51.104.0 - 195.51.111.255 fr +195.51.112.0 - 195.51.155.255 eu 195.51.156.0 - 195.51.159.255 za -195.51.160.0 - 195.51.162.127 de -195.51.162.128 - 195.51.162.159 nl -195.51.162.160 - 195.51.162.167 de -195.51.162.168 - 195.51.162.175 it -195.51.162.176 - 195.51.167.255 de -195.51.168.0 - 195.51.175.255 fr +195.51.160.0 - 195.51.163.255 eu +195.51.164.0 - 195.51.167.255 de +195.51.168.0 - 195.51.171.255 fr +195.51.172.0 - 195.51.175.255 eu 195.51.176.0 - 195.51.191.255 nl -195.51.192.0 - 195.51.206.255 dk -195.51.207.0 - 195.51.207.31 se -195.51.207.32 - 195.51.207.63 fr -195.51.207.64 - 195.51.207.79 gb -195.51.207.80 - 195.51.207.95 be -195.51.207.96 - 195.51.207.127 gb -195.51.207.128 - 195.51.207.255 it -195.51.208.0 - 195.51.213.255 at -195.51.214.0 - 195.51.214.159 nl -195.51.214.160 - 195.51.214.175 be -195.51.214.176 - 195.51.214.191 gb -195.51.214.192 - 195.51.214.255 pt -195.51.215.0 - 195.51.215.127 at -195.51.215.128 - 195.51.215.255 nl -195.51.216.0 - 195.51.216.255 se -195.51.217.0 - 195.51.217.255 eu -195.51.218.0 - 195.51.221.255 se -195.51.222.0 - 195.51.222.255 gb -195.51.223.0 - 195.51.223.71 be -195.51.223.72 - 195.51.223.79 at -195.51.223.80 - 195.51.223.95 de -195.51.223.96 - 195.51.223.111 gb -195.51.223.112 - 195.51.223.127 fr -195.51.223.128 - 195.51.223.191 de -195.51.223.192 - 195.51.223.223 dk -195.51.223.224 - 195.51.223.255 se -195.51.224.0 - 195.51.224.255 ch -195.51.225.0 - 195.51.226.255 at -195.51.227.0 - 195.51.227.255 ch -195.51.228.0 - 195.51.228.7 gr -195.51.228.8 - 195.51.228.127 eu -195.51.228.128 - 195.51.228.135 be -195.51.228.136 - 195.51.228.143 eu -195.51.228.144 - 195.51.228.159 fr -195.51.228.160 - 195.51.228.175 be -195.51.228.176 - 195.51.228.183 gb -195.51.228.184 - 195.51.228.191 be -195.51.228.192 - 195.51.228.255 eu -195.51.229.0 - 195.51.229.199 ie -195.51.229.200 - 195.51.229.207 eu -195.51.229.208 - 195.51.229.255 ie -195.51.230.0 - 195.51.233.127 at -195.51.233.128 - 195.51.233.143 it -195.51.233.144 - 195.51.233.151 gb -195.51.233.152 - 195.51.233.159 za -195.51.233.160 - 195.51.233.167 eu -195.51.233.168 - 195.51.233.175 gb -195.51.233.176 - 195.51.233.183 de -195.51.233.184 - 195.51.233.191 gb -195.51.233.192 - 195.51.233.223 es -195.51.233.224 - 195.51.234.255 de -195.51.235.0 - 195.51.237.255 eu -195.51.238.0 - 195.51.238.63 be -195.51.238.64 - 195.51.238.127 es -195.51.238.128 - 195.51.238.191 gb -195.51.238.192 - 195.51.238.255 it -195.51.239.0 - 195.51.241.255 at -195.51.242.0 - 195.51.242.95 ch -195.51.242.96 - 195.51.242.127 dk -195.51.242.128 - 195.51.242.151 ch -195.51.242.152 - 195.51.242.159 eu -195.51.242.160 - 195.51.242.255 ch -195.51.243.0 - 195.51.243.63 by -195.51.243.64 - 195.51.243.255 eu -195.51.244.0 - 195.51.244.191 at -195.51.244.192 - 195.51.244.255 gb -195.51.245.0 - 195.51.245.255 za -195.51.246.0 - 195.51.246.255 be -195.51.247.0 - 195.51.247.191 gr -195.51.247.192 - 195.51.248.223 gb -195.51.248.224 - 195.51.248.239 ie -195.51.248.240 - 195.51.248.247 gb -195.51.248.248 - 195.51.248.255 nl -195.51.249.0 - 195.51.249.255 de -195.51.250.0 - 195.51.250.255 ch -195.51.251.0 - 195.51.251.31 de -195.51.251.32 - 195.51.251.63 fr -195.51.251.64 - 195.51.251.71 gb -195.51.251.72 - 195.51.251.79 be -195.51.251.80 - 195.51.251.95 nl -195.51.251.96 - 195.51.251.127 it -195.51.251.128 - 195.51.251.255 de -195.51.252.0 - 195.51.252.255 fr -195.51.253.0 - 195.51.254.255 be -195.51.255.0 - 195.51.255.127 gb -195.51.255.128 - 195.51.255.143 hu -195.51.255.144 - 195.51.255.159 fr -195.51.255.160 - 195.51.255.191 nl -195.51.255.192 - 195.51.255.255 gb +195.51.192.0 - 195.51.203.255 dk +195.51.204.0 - 195.51.207.255 eu +195.51.208.0 - 195.51.211.255 at +195.51.212.0 - 195.51.228.255 eu +195.51.229.0 - 195.51.229.127 ie +195.51.229.128 - 195.51.255.255 eu 195.52.0.0 - 195.52.255.255 de 195.53.0.0 - 195.53.255.255 es 195.54.0.0 - 195.54.33.255 ru @@ -105325,18 +89846,14 @@ 195.54.58.0 - 195.54.59.255 gb 195.54.60.0 - 195.54.61.255 it 195.54.62.0 - 195.54.63.255 fr -195.54.64.0 - 195.54.95.255 dk -195.54.96.0 - 195.54.158.127 se -195.54.158.128 - 195.54.158.255 dk -195.54.159.0 - 195.54.159.255 se -195.54.160.0 - 195.54.161.255 de +195.54.64.0 - 195.54.84.13 dk +195.54.84.14 - 195.54.84.14 eu +195.54.84.15 - 195.54.95.255 dk +195.54.96.0 - 195.54.159.255 se 195.54.162.0 - 195.54.163.255 ua 195.54.164.0 - 195.54.165.255 de -195.54.166.0 - 195.54.167.255 ua 195.54.168.0 - 195.54.169.255 pt -195.54.170.0 - 195.54.171.255 md 195.54.172.0 - 195.54.173.255 at -195.54.174.0 - 195.54.175.255 nl 195.54.176.0 - 195.54.177.255 ru 195.54.178.0 - 195.54.179.255 ge 195.54.180.0 - 195.54.181.255 kg @@ -105346,88 +89863,189 @@ 195.54.192.0 - 195.54.223.255 ru 195.54.224.0 - 195.54.255.255 gb 195.55.0.0 - 195.55.255.255 es -195.56.0.0 - 195.56.255.255 hu +195.56.0.0 - 195.56.76.255 hu +195.56.77.0 - 195.56.77.255 eu +195.56.78.0 - 195.56.139.255 hu +195.56.140.0 - 195.56.140.255 eu +195.56.141.0 - 195.56.255.255 hu 195.57.0.0 - 195.57.255.255 es -195.58.0.0 - 195.58.52.255 ru -195.58.53.0 - 195.58.53.255 tj -195.58.54.0 - 195.58.63.255 ru +195.58.0.0 - 195.58.63.255 ru 195.58.64.0 - 195.58.95.255 gb -195.58.96.0 - 195.58.96.103 se -195.58.96.104 - 195.58.96.107 no -195.58.96.108 - 195.58.127.255 se +195.58.96.0 - 195.58.127.255 se 195.58.128.0 - 195.58.159.255 gb 195.58.160.0 - 195.58.191.255 at 195.58.192.0 - 195.58.223.255 gb 195.58.224.0 - 195.58.255.255 ua 195.59.0.0 - 195.59.0.7 gb -195.59.0.8 - 195.59.0.31 eu -195.59.0.32 - 195.59.0.63 gb -195.59.0.64 - 195.59.0.127 eu -195.59.0.128 - 195.59.5.143 gb -195.59.5.144 - 195.59.7.255 eu -195.59.8.0 - 195.59.18.47 gb -195.59.18.48 - 195.59.18.63 eu +195.59.0.8 - 195.59.0.63 eu +195.59.0.64 - 195.59.0.95 gb +195.59.0.96 - 195.59.0.127 eu +195.59.0.128 - 195.59.3.207 gb +195.59.3.208 - 195.59.3.215 eu +195.59.3.216 - 195.59.3.223 gb +195.59.3.224 - 195.59.3.239 eu +195.59.3.240 - 195.59.6.31 gb +195.59.6.32 - 195.59.6.47 eu +195.59.6.48 - 195.59.6.63 gb +195.59.6.64 - 195.59.6.255 eu +195.59.7.0 - 195.59.10.255 gb +195.59.11.0 - 195.59.11.15 eu +195.59.11.16 - 195.59.15.15 gb +195.59.15.16 - 195.59.15.31 eu +195.59.15.32 - 195.59.15.131 gb +195.59.15.132 - 195.59.15.143 eu +195.59.15.144 - 195.59.18.15 gb +195.59.18.16 - 195.59.18.23 eu +195.59.18.24 - 195.59.18.55 gb +195.59.18.56 - 195.59.18.63 eu 195.59.18.64 - 195.59.18.95 gb -195.59.18.96 - 195.59.23.255 eu +195.59.18.96 - 195.59.18.255 eu +195.59.19.0 - 195.59.19.255 gb +195.59.20.0 - 195.59.23.255 eu 195.59.24.0 - 195.59.24.255 gb -195.59.25.0 - 195.59.25.127 eu -195.59.25.128 - 195.59.25.255 gb -195.59.26.0 - 195.59.26.191 eu +195.59.25.0 - 195.59.26.191 eu 195.59.26.192 - 195.59.26.231 gb 195.59.26.232 - 195.59.26.255 eu 195.59.27.0 - 195.59.27.255 gb 195.59.28.0 - 195.59.31.255 eu -195.59.32.0 - 195.59.35.127 gb -195.59.35.128 - 195.59.39.255 eu -195.59.40.0 - 195.59.61.99 gb -195.59.61.100 - 195.59.61.103 eu -195.59.61.104 - 195.59.61.255 gb -195.59.62.0 - 195.59.63.255 eu -195.59.64.0 - 195.59.65.255 gb -195.59.66.0 - 195.59.71.255 eu -195.59.72.0 - 195.59.74.31 gb -195.59.74.32 - 195.59.79.255 eu +195.59.32.0 - 195.59.35.255 gb +195.59.36.0 - 195.59.39.255 eu +195.59.40.0 - 195.59.49.255 gb +195.59.50.0 - 195.59.50.255 eu +195.59.51.0 - 195.59.58.63 gb +195.59.58.64 - 195.59.58.79 eu +195.59.58.80 - 195.59.58.255 gb +195.59.59.0 - 195.59.59.255 eu +195.59.60.0 - 195.59.68.255 gb +195.59.69.0 - 195.59.69.15 eu +195.59.69.16 - 195.59.69.31 gb +195.59.69.32 - 195.59.69.63 eu +195.59.69.64 - 195.59.69.127 gb +195.59.69.128 - 195.59.69.191 eu +195.59.69.192 - 195.59.70.159 gb +195.59.70.160 - 195.59.70.167 eu +195.59.70.168 - 195.59.70.171 gb +195.59.70.172 - 195.59.70.175 eu +195.59.70.176 - 195.59.74.35 gb +195.59.74.36 - 195.59.75.255 eu +195.59.76.0 - 195.59.78.15 gb +195.59.78.16 - 195.59.78.47 eu +195.59.78.48 - 195.59.78.63 gb +195.59.78.64 - 195.59.78.127 eu +195.59.78.128 - 195.59.78.255 gb +195.59.79.0 - 195.59.79.255 eu 195.59.80.0 - 195.59.81.255 gb 195.59.82.0 - 195.59.87.255 eu -195.59.88.0 - 195.59.91.111 gb +195.59.88.0 - 195.59.89.255 gb +195.59.90.0 - 195.59.90.15 eu +195.59.90.16 - 195.59.90.31 gb +195.59.90.32 - 195.59.90.63 eu +195.59.90.64 - 195.59.90.255 gb +195.59.91.0 - 195.59.91.15 eu +195.59.91.16 - 195.59.91.111 gb 195.59.91.112 - 195.59.95.255 eu -195.59.96.0 - 195.59.100.175 gb -195.59.100.176 - 195.59.100.183 fr -195.59.100.184 - 195.59.105.255 gb +195.59.96.0 - 195.59.103.95 gb +195.59.103.96 - 195.59.103.111 eu +195.59.103.112 - 195.59.105.255 gb 195.59.106.0 - 195.59.107.95 eu 195.59.107.96 - 195.59.107.127 gb -195.59.107.128 - 195.59.111.255 eu -195.59.112.0 - 195.59.118.175 gb -195.59.118.176 - 195.59.118.191 eu -195.59.118.192 - 195.59.129.255 gb +195.59.107.128 - 195.59.107.255 eu +195.59.108.0 - 195.59.109.15 gb +195.59.109.16 - 195.59.109.31 eu +195.59.109.32 - 195.59.109.63 gb +195.59.109.64 - 195.59.109.71 eu +195.59.109.72 - 195.59.109.79 gb +195.59.109.80 - 195.59.109.95 eu +195.59.109.96 - 195.59.109.119 gb +195.59.109.120 - 195.59.109.127 eu +195.59.109.128 - 195.59.109.131 gb +195.59.109.132 - 195.59.111.255 eu +195.59.112.0 - 195.59.122.255 gb +195.59.123.0 - 195.59.123.15 eu +195.59.123.16 - 195.59.127.151 gb +195.59.127.152 - 195.59.127.159 eu +195.59.127.160 - 195.59.129.255 gb 195.59.130.0 - 195.59.132.255 fk 195.59.133.0 - 195.59.135.255 gb 195.59.136.0 - 195.59.141.255 ie 195.59.142.0 - 195.59.142.127 gb -195.59.142.128 - 195.59.143.255 eu +195.59.142.128 - 195.59.142.143 ie +195.59.142.144 - 195.59.142.191 eu +195.59.142.192 - 195.59.142.199 gb +195.59.142.200 - 195.59.142.255 eu +195.59.143.0 - 195.59.143.255 ie 195.59.144.0 - 195.59.144.255 hk -195.59.145.0 - 195.59.155.99 gb +195.59.145.0 - 195.59.154.15 gb +195.59.154.16 - 195.59.154.23 eu +195.59.154.24 - 195.59.154.31 gb +195.59.154.32 - 195.59.154.47 eu +195.59.154.48 - 195.59.154.71 gb +195.59.154.72 - 195.59.154.79 eu +195.59.154.80 - 195.59.154.95 gb +195.59.154.96 - 195.59.154.98 eu +195.59.154.99 - 195.59.154.99 gb +195.59.154.100 - 195.59.154.100 eu +195.59.154.101 - 195.59.154.101 gb +195.59.154.102 - 195.59.154.107 eu +195.59.154.108 - 195.59.154.108 gb +195.59.154.109 - 195.59.154.127 eu +195.59.154.128 - 195.59.154.255 gb +195.59.155.0 - 195.59.155.31 eu +195.59.155.32 - 195.59.155.71 gb +195.59.155.72 - 195.59.155.79 eu +195.59.155.80 - 195.59.155.99 gb 195.59.155.100 - 195.59.155.103 eu -195.59.155.104 - 195.59.157.95 gb -195.59.157.96 - 195.59.157.111 ie -195.59.157.112 - 195.59.175.111 gb +195.59.155.104 - 195.59.155.211 gb +195.59.155.212 - 195.59.155.215 eu +195.59.155.216 - 195.59.175.111 gb 195.59.175.112 - 195.59.175.127 ie 195.59.175.128 - 195.59.175.191 gb 195.59.175.192 - 195.59.175.207 ie 195.59.175.208 - 195.59.175.223 gb 195.59.175.224 - 195.59.175.255 ie -195.59.176.0 - 195.59.177.15 gb -195.59.177.16 - 195.59.177.31 ie -195.59.177.32 - 195.59.194.207 gb -195.59.194.208 - 195.59.199.255 eu -195.59.200.0 - 195.59.200.51 gb -195.59.200.52 - 195.59.200.127 eu -195.59.200.128 - 195.59.200.255 gb -195.59.201.0 - 195.59.207.255 eu -195.59.208.0 - 195.59.208.87 gb -195.59.208.88 - 195.59.209.255 eu -195.59.210.0 - 195.59.210.63 gb -195.59.210.64 - 195.59.255.255 eu +195.59.176.0 - 195.59.200.7 gb +195.59.200.8 - 195.59.200.15 eu +195.59.200.16 - 195.59.200.95 gb +195.59.200.96 - 195.59.200.99 eu +195.59.200.100 - 195.59.202.255 gb +195.59.203.0 - 195.59.203.7 eu +195.59.203.8 - 195.59.203.79 gb +195.59.203.80 - 195.59.203.87 eu +195.59.203.88 - 195.59.203.167 gb +195.59.203.168 - 195.59.203.255 eu +195.59.204.0 - 195.59.204.255 gb +195.59.205.0 - 195.59.205.255 ua +195.59.206.0 - 195.59.206.255 gb +195.59.207.0 - 195.59.207.183 eu +195.59.207.184 - 195.59.207.191 gb +195.59.207.192 - 195.59.207.207 eu +195.59.207.208 - 195.59.207.223 gb +195.59.207.224 - 195.59.207.255 eu +195.59.208.0 - 195.59.210.63 gb +195.59.210.64 - 195.59.210.255 eu +195.59.211.0 - 195.59.212.255 gb +195.59.213.0 - 195.59.213.255 eu +195.59.214.0 - 195.59.223.255 gb +195.59.224.0 - 195.59.224.255 eu +195.59.225.0 - 195.59.225.255 gb +195.59.226.0 - 195.59.227.255 eu +195.59.228.0 - 195.59.228.255 gb +195.59.229.0 - 195.59.231.255 eu +195.59.232.0 - 195.59.233.255 gb +195.59.234.0 - 195.59.235.255 eu +195.59.236.0 - 195.59.236.255 gb +195.59.237.0 - 195.59.239.255 eu +195.59.240.0 - 195.59.242.63 gb +195.59.242.64 - 195.59.242.87 eu +195.59.242.88 - 195.59.242.95 gb +195.59.242.96 - 195.59.242.143 eu +195.59.242.144 - 195.59.242.159 gb +195.59.242.160 - 195.59.242.239 eu +195.59.242.240 - 195.59.242.240 gb +195.59.242.241 - 195.59.243.255 eu +195.59.244.0 - 195.59.247.255 gb +195.59.248.0 - 195.59.253.255 eu +195.59.254.0 - 195.59.255.255 cz 195.60.0.0 - 195.60.31.255 gb 195.60.32.0 - 195.60.63.255 de 195.60.64.0 - 195.60.65.255 pl @@ -105435,7 +90053,6 @@ 195.60.68.0 - 195.60.69.255 se 195.60.70.0 - 195.60.71.255 ua 195.60.72.0 - 195.60.79.255 ro -195.60.80.0 - 195.60.80.95 it 195.60.80.96 - 195.60.80.127 pl 195.60.80.128 - 195.60.80.159 am 195.60.80.160 - 195.60.80.191 pl @@ -105444,51 +90061,46 @@ 195.60.81.0 - 195.60.81.63 se 195.60.81.64 - 195.60.81.127 es 195.60.81.128 - 195.60.81.191 fi +195.60.81.192 - 195.60.82.63 cy 195.60.82.64 - 195.60.82.127 ie 195.60.82.128 - 195.60.82.191 nl 195.60.82.192 - 195.60.82.255 gb 195.60.83.0 - 195.60.83.31 pl -195.60.83.32 - 195.60.83.63 de +195.60.83.64 - 195.60.83.95 cy 195.60.83.96 - 195.60.83.127 ee 195.60.83.128 - 195.60.83.159 fr +195.60.83.160 - 195.60.83.191 cy 195.60.83.192 - 195.60.83.223 gb 195.60.83.224 - 195.60.83.255 nl -195.60.84.0 - 195.60.84.127 ru -195.60.84.128 - 195.60.85.127 gb -195.60.85.128 - 195.60.85.255 lv +195.60.84.0 - 195.60.84.127 cy +195.60.85.0 - 195.60.85.127 gb 195.60.86.0 - 195.60.86.255 gb 195.60.87.0 - 195.60.87.127 nl -195.60.87.128 - 195.60.87.255 gb -195.60.88.0 - 195.60.88.127 ch +195.60.87.128 - 195.60.87.255 cy 195.60.88.128 - 195.60.88.255 fr 195.60.89.0 - 195.60.89.127 cz 195.60.89.128 - 195.60.89.255 it 195.60.90.0 - 195.60.90.127 fi 195.60.90.128 - 195.60.90.255 dk 195.60.91.0 - 195.60.91.127 be -195.60.91.128 - 195.60.91.255 pl 195.60.92.0 - 195.60.92.63 se 195.60.92.64 - 195.60.92.127 at 195.60.92.128 - 195.60.92.191 pl 195.60.92.192 - 195.60.92.255 ua -195.60.93.64 - 195.60.93.127 es +195.60.93.0 - 195.60.93.63 cy 195.60.93.128 - 195.60.93.191 ch -195.60.93.192 - 195.60.93.255 dk +195.60.93.192 - 195.60.93.255 cy 195.60.94.0 - 195.60.94.127 pl -195.60.94.128 - 195.60.94.255 fr -195.60.95.0 - 195.60.95.127 pl +195.60.95.0 - 195.60.95.127 cy 195.60.95.128 - 195.60.95.255 gb -195.60.96.0 - 195.60.98.247 de -195.60.98.248 - 195.60.98.255 ch -195.60.99.0 - 195.60.127.255 de +195.60.96.0 - 195.60.127.255 de 195.60.128.0 - 195.60.159.255 it 195.60.160.0 - 195.60.161.255 dk 195.60.162.0 - 195.60.163.255 at 195.60.164.0 - 195.60.165.255 gb -195.60.166.0 - 195.60.167.255 ie -195.60.170.0 - 195.60.173.255 gb +195.60.168.0 - 195.60.169.255 ua +195.60.170.0 - 195.60.171.255 gb 195.60.174.0 - 195.60.175.255 ua -195.60.176.0 - 195.60.177.255 il 195.60.178.0 - 195.60.179.255 ro 195.60.180.0 - 195.60.181.255 de 195.60.182.0 - 195.60.183.255 se @@ -105498,7 +90110,7 @@ 195.60.190.0 - 195.60.191.255 it 195.60.192.0 - 195.60.195.255 ch 195.60.196.0 - 195.60.199.255 gb -195.60.200.0 - 195.60.207.255 ua +195.60.200.0 - 195.60.203.255 ua 195.60.208.0 - 195.60.211.255 de 195.60.212.0 - 195.60.215.255 nl 195.60.216.0 - 195.60.219.255 pl @@ -105510,171 +90122,11 @@ 195.60.244.0 - 195.60.247.255 ru 195.60.248.0 - 195.60.251.255 lv 195.60.252.0 - 195.60.255.255 fi -195.61.0.0 - 195.61.2.63 eu -195.61.2.64 - 195.61.2.127 es -195.61.2.128 - 195.61.3.7 eu -195.61.3.8 - 195.61.3.63 es -195.61.3.64 - 195.61.3.159 eu -195.61.3.160 - 195.61.3.175 es -195.61.3.176 - 195.61.3.183 eu -195.61.3.184 - 195.61.3.192 es -195.61.3.193 - 195.61.23.255 eu -195.61.24.0 - 195.61.24.255 es -195.61.25.0 - 195.61.25.255 eu -195.61.26.0 - 195.61.26.255 es -195.61.27.0 - 195.61.29.255 eu -195.61.30.0 - 195.61.30.255 es -195.61.31.0 - 195.61.31.255 eu -195.61.32.0 - 195.61.33.255 ch -195.61.34.0 - 195.61.34.63 eu -195.61.34.64 - 195.61.34.127 ch -195.61.34.128 - 195.61.34.255 de -195.61.35.0 - 195.61.35.255 ch -195.61.36.0 - 195.61.37.127 eu -195.61.37.128 - 195.61.37.207 ch -195.61.37.208 - 195.61.38.255 eu -195.61.39.0 - 195.61.39.255 ch -195.61.40.0 - 195.61.40.255 eu -195.61.41.0 - 195.61.41.255 ch -195.61.42.0 - 195.61.42.255 eu -195.61.43.0 - 195.61.43.255 ch -195.61.44.0 - 195.61.46.255 eu -195.61.47.0 - 195.61.48.255 ch -195.61.49.0 - 195.61.49.255 eu -195.61.50.0 - 195.61.51.255 ch -195.61.52.0 - 195.61.52.255 eu -195.61.53.0 - 195.61.56.255 ch -195.61.57.0 - 195.61.58.255 eu -195.61.59.0 - 195.61.61.255 ch -195.61.62.0 - 195.61.63.255 eu -195.61.64.0 - 195.61.64.255 pt -195.61.65.0 - 195.61.66.255 eu -195.61.67.0 - 195.61.67.127 pt -195.61.67.128 - 195.61.70.31 eu -195.61.70.32 - 195.61.70.127 pt -195.61.70.128 - 195.61.70.255 eu -195.61.71.0 - 195.61.71.63 pt -195.61.71.64 - 195.61.71.127 eu -195.61.71.128 - 195.61.74.255 pt -195.61.75.0 - 195.61.75.15 eu -195.61.75.16 - 195.61.75.31 pt -195.61.75.32 - 195.61.75.127 eu -195.61.75.128 - 195.61.75.131 pt -195.61.75.132 - 195.61.75.135 eu -195.61.75.136 - 195.61.75.143 pt -195.61.75.144 - 195.61.75.159 eu -195.61.75.160 - 195.61.75.175 pt -195.61.75.176 - 195.61.77.255 eu -195.61.78.0 - 195.61.79.63 pt -195.61.79.64 - 195.61.79.127 eu -195.61.79.128 - 195.61.79.191 pt -195.61.79.192 - 195.61.80.127 eu -195.61.80.128 - 195.61.81.175 pt -195.61.81.176 - 195.61.82.63 eu -195.61.82.64 - 195.61.82.127 pt -195.61.82.128 - 195.61.82.255 eu -195.61.83.0 - 195.61.83.255 pt -195.61.84.0 - 195.61.87.255 eu -195.61.88.0 - 195.61.88.63 pt -195.61.88.64 - 195.61.88.127 eu -195.61.88.128 - 195.61.88.151 pt -195.61.88.152 - 195.61.88.175 eu -195.61.88.176 - 195.61.88.223 pt -195.61.88.224 - 195.61.88.255 eu -195.61.89.0 - 195.61.89.127 pt -195.61.89.128 - 195.61.89.191 eu -195.61.89.192 - 195.61.89.207 pt -195.61.89.208 - 195.61.89.239 eu -195.61.89.240 - 195.61.92.255 pt -195.61.93.0 - 195.61.94.255 eu -195.61.95.0 - 195.61.95.255 pt -195.61.96.0 - 195.61.96.127 fr -195.61.96.128 - 195.61.96.191 nl -195.61.96.192 - 195.61.96.207 eu -195.61.96.208 - 195.61.96.223 nl -195.61.96.224 - 195.61.96.255 eu -195.61.97.0 - 195.61.97.55 nl -195.61.97.56 - 195.61.97.255 eu -195.61.98.0 - 195.61.98.255 nl -195.61.99.0 - 195.61.101.255 eu -195.61.102.0 - 195.61.103.127 nl -195.61.103.128 - 195.61.104.95 eu -195.61.104.96 - 195.61.104.231 nl -195.61.104.232 - 195.61.104.239 eu -195.61.104.240 - 195.61.104.255 nl -195.61.105.0 - 195.61.107.15 eu -195.61.107.16 - 195.61.107.39 nl -195.61.107.40 - 195.61.107.71 eu -195.61.107.72 - 195.61.107.79 nl -195.61.107.80 - 195.61.108.191 eu -195.61.108.192 - 195.61.108.255 nl -195.61.109.0 - 195.61.109.255 eu -195.61.110.0 - 195.61.110.255 nl -195.61.111.0 - 195.61.114.255 eu -195.61.115.0 - 195.61.115.31 nl -195.61.115.32 - 195.61.115.255 eu -195.61.116.0 - 195.61.116.15 nl -195.61.116.16 - 195.61.117.255 eu -195.61.118.0 - 195.61.118.255 nl -195.61.119.0 - 195.61.127.255 eu -195.61.128.0 - 195.61.129.15 be -195.61.129.16 - 195.61.129.255 eu -195.61.130.0 - 195.61.130.191 be -195.61.130.192 - 195.61.130.223 nl -195.61.130.224 - 195.61.130.255 eu -195.61.131.0 - 195.61.131.255 be -195.61.132.0 - 195.61.132.31 eu -195.61.132.32 - 195.61.132.47 be -195.61.132.48 - 195.61.132.103 eu -195.61.132.104 - 195.61.132.111 ch -195.61.132.112 - 195.61.132.127 eu -195.61.132.128 - 195.61.132.191 be -195.61.132.192 - 195.61.132.239 eu -195.61.132.240 - 195.61.132.247 be -195.61.132.248 - 195.61.132.255 eu -195.61.133.0 - 195.61.133.255 it -195.61.134.0 - 195.61.134.151 eu -195.61.134.152 - 195.61.134.159 be -195.61.134.160 - 195.61.134.255 eu -195.61.135.0 - 195.61.135.95 be -195.61.135.96 - 195.61.136.255 eu -195.61.137.0 - 195.61.141.255 be -195.61.142.0 - 195.61.142.255 eu -195.61.143.0 - 195.61.143.255 be -195.61.144.0 - 195.61.145.127 ro -195.61.145.128 - 195.61.146.255 eu -195.61.147.0 - 195.61.148.255 ro -195.61.149.0 - 195.61.150.127 eu -195.61.150.128 - 195.61.152.127 ro -195.61.152.128 - 195.61.152.255 eu -195.61.153.0 - 195.61.156.255 ro -195.61.157.0 - 195.61.157.31 be -195.61.157.32 - 195.61.157.255 eu -195.61.158.0 - 195.61.158.255 us -195.61.159.0 - 195.61.161.135 eu -195.61.161.136 - 195.61.161.143 at -195.61.161.144 - 195.61.172.255 eu -195.61.173.0 - 195.61.173.127 at -195.61.173.128 - 195.61.175.255 eu -195.61.176.0 - 195.61.176.255 at -195.61.177.0 - 195.61.191.255 eu -195.61.192.0 - 195.61.194.255 it -195.61.195.0 - 195.61.195.31 il -195.61.195.32 - 195.61.195.255 eu -195.61.196.0 - 195.61.198.255 it -195.61.199.0 - 195.61.199.255 eu -195.61.200.0 - 195.61.200.255 it -195.61.201.0 - 195.61.201.255 eu -195.61.202.0 - 195.61.202.255 it -195.61.203.0 - 195.61.210.255 eu -195.61.211.0 - 195.61.215.207 it -195.61.215.208 - 195.61.215.255 eu -195.61.216.0 - 195.61.217.255 it -195.61.218.0 - 195.61.223.255 eu -195.61.224.0 - 195.61.224.127 lu -195.61.224.128 - 195.61.226.255 eu -195.61.227.0 - 195.61.230.255 lu -195.61.231.0 - 195.61.255.255 eu +195.61.0.0 - 195.61.131.95 eu +195.61.131.96 - 195.61.131.111 be +195.61.131.112 - 195.61.226.255 eu +195.61.227.0 - 195.61.227.255 lu +195.61.228.0 - 195.61.255.255 eu 195.62.0.0 - 195.62.7.255 ru 195.62.8.0 - 195.62.11.255 gb 195.62.12.0 - 195.62.13.255 pl @@ -105682,12 +90134,12 @@ 195.62.16.0 - 195.62.17.255 sk 195.62.18.0 - 195.62.19.255 il 195.62.20.0 - 195.62.21.255 de -195.62.22.0 - 195.62.23.255 bg 195.62.24.0 - 195.62.25.255 ua 195.62.26.0 - 195.62.27.255 at 195.62.28.0 - 195.62.29.255 gb 195.62.30.0 - 195.62.31.255 il -195.62.32.0 - 195.62.35.255 ru +195.62.32.0 - 195.62.34.255 ru +195.62.35.0 - 195.62.35.255 tr 195.62.36.0 - 195.62.37.255 ua 195.62.38.0 - 195.62.39.255 ru 195.62.40.0 - 195.62.41.255 pl @@ -105708,7 +90160,6 @@ 195.62.80.0 - 195.62.81.255 de 195.62.82.0 - 195.62.83.255 nl 195.62.84.0 - 195.62.85.255 at -195.62.86.0 - 195.62.87.255 ru 195.62.88.0 - 195.62.89.255 ro 195.62.90.0 - 195.62.91.255 be 195.62.92.0 - 195.62.93.255 ru @@ -105719,10 +90170,11 @@ 195.62.192.0 - 195.62.223.255 gb 195.62.224.0 - 195.62.255.255 it 195.63.0.0 - 195.63.255.255 de -195.64.0.0 - 195.64.31.255 at +195.64.0.0 - 195.64.0.255 at +195.64.1.0 - 195.64.1.255 eu +195.64.2.0 - 195.64.31.255 at 195.64.32.0 - 195.64.95.255 nl 195.64.96.0 - 195.64.127.255 de -195.64.128.0 - 195.64.129.255 ro 195.64.130.0 - 195.64.131.255 pl 195.64.132.0 - 195.64.133.255 ro 195.64.134.0 - 195.64.135.255 ch @@ -105734,7 +90186,6 @@ 195.64.146.0 - 195.64.147.255 at 195.64.148.0 - 195.64.149.255 ua 195.64.150.0 - 195.64.151.255 pl -195.64.152.0 - 195.64.153.255 md 195.64.154.0 - 195.64.155.255 ua 195.64.156.0 - 195.64.157.255 ru 195.64.158.0 - 195.64.159.255 pl @@ -105742,7 +90193,7 @@ 195.64.162.0 - 195.64.163.255 ua 195.64.164.0 - 195.64.165.255 fr 195.64.166.0 - 195.64.167.255 ua -195.64.168.0 - 195.64.169.255 it +195.64.168.0 - 195.64.169.255 gb 195.64.170.0 - 195.64.171.255 rs 195.64.172.0 - 195.64.173.255 gr 195.64.174.0 - 195.64.175.255 pl @@ -105755,9 +90206,9 @@ 195.64.190.0 - 195.64.191.255 ua 195.64.192.0 - 195.64.223.255 ru 195.64.224.0 - 195.64.255.255 ua -195.65.0.0 - 195.65.4.223 ch -195.65.4.224 - 195.65.4.231 de -195.65.4.232 - 195.65.255.255 ch +195.65.0.0 - 195.65.86.255 ch +195.65.87.0 - 195.65.87.255 eu +195.65.88.0 - 195.65.255.255 ch 195.66.0.0 - 195.66.7.255 de 195.66.8.0 - 195.66.15.255 it 195.66.16.0 - 195.66.23.255 pl @@ -105765,7 +90216,8 @@ 195.66.32.0 - 195.66.63.255 se 195.66.64.0 - 195.66.64.255 lv 195.66.65.0 - 195.66.66.255 ua -195.66.67.0 - 195.66.68.255 pl +195.66.67.0 - 195.66.67.255 ru +195.66.68.0 - 195.66.68.255 pl 195.66.69.0 - 195.66.69.255 si 195.66.70.0 - 195.66.70.255 de 195.66.71.0 - 195.66.72.255 ru @@ -105782,7 +90234,6 @@ 195.66.84.0 - 195.66.84.255 ru 195.66.85.0 - 195.66.85.255 ch 195.66.86.0 - 195.66.86.255 pl -195.66.87.0 - 195.66.87.255 ru 195.66.88.0 - 195.66.88.255 pl 195.66.89.0 - 195.66.89.255 ru 195.66.90.0 - 195.66.90.255 nl @@ -105797,7 +90248,6 @@ 195.66.101.0 - 195.66.101.255 se 195.66.102.0 - 195.66.102.255 de 195.66.103.0 - 195.66.103.255 pl -195.66.104.0 - 195.66.104.255 ru 195.66.105.0 - 195.66.105.255 ua 195.66.106.0 - 195.66.106.255 ee 195.66.107.0 - 195.66.107.255 si @@ -105807,13 +90257,11 @@ 195.66.111.0 - 195.66.111.255 de 195.66.112.0 - 195.66.112.255 fr 195.66.113.0 - 195.66.113.255 ro -195.66.114.0 - 195.66.114.255 ua 195.66.115.0 - 195.66.115.255 be 195.66.116.0 - 195.66.116.255 pl 195.66.117.0 - 195.66.117.255 ru 195.66.118.0 - 195.66.118.255 il 195.66.119.0 - 195.66.119.255 fr -195.66.120.0 - 195.66.120.255 ua 195.66.121.0 - 195.66.122.255 de 195.66.123.0 - 195.66.123.255 ch 195.66.124.0 - 195.66.124.255 ro @@ -105822,7 +90270,9 @@ 195.66.127.0 - 195.66.127.255 pt 195.66.128.0 - 195.66.129.255 sa 195.66.130.0 - 195.66.131.255 se -195.66.132.0 - 195.66.133.255 us +195.66.132.0 - 195.66.132.95 us +195.66.132.96 - 195.66.132.127 gb +195.66.132.128 - 195.66.133.255 us 195.66.134.0 - 195.66.135.255 nl 195.66.136.0 - 195.66.141.255 ua 195.66.142.0 - 195.66.143.255 ro @@ -105830,573 +90280,56 @@ 195.66.146.0 - 195.66.147.255 ua 195.66.148.0 - 195.66.149.255 gb 195.66.150.0 - 195.66.151.255 es -195.66.152.0 - 195.66.153.255 ua 195.66.154.0 - 195.66.155.255 de 195.66.156.0 - 195.66.157.255 ua 195.66.158.0 - 195.66.159.255 gr -195.66.160.0 - 195.66.163.255 me -195.66.164.0 - 195.66.168.255 rs -195.66.169.0 - 195.66.171.15 me -195.66.171.16 - 195.66.171.31 rs -195.66.171.32 - 195.66.171.255 me -195.66.172.0 - 195.66.172.255 rs -195.66.173.0 - 195.66.181.95 me +195.66.160.0 - 195.66.165.255 me +195.66.166.0 - 195.66.168.255 rs +195.66.169.0 - 195.66.181.95 me 195.66.181.96 - 195.66.181.111 rs -195.66.181.112 - 195.66.182.63 me -195.66.182.64 - 195.66.182.71 rs -195.66.182.72 - 195.66.182.79 me -195.66.182.80 - 195.66.182.95 rs -195.66.182.96 - 195.66.182.207 me -195.66.182.208 - 195.66.182.223 rs -195.66.182.224 - 195.66.183.127 me -195.66.183.128 - 195.66.183.143 rs -195.66.183.144 - 195.66.183.159 me -195.66.183.160 - 195.66.183.191 rs -195.66.183.192 - 195.66.184.15 me -195.66.184.16 - 195.66.184.63 rs -195.66.184.64 - 195.66.184.95 me -195.66.184.96 - 195.66.184.111 rs -195.66.184.112 - 195.66.184.119 me -195.66.184.120 - 195.66.184.127 rs -195.66.184.128 - 195.66.184.255 me -195.66.185.0 - 195.66.185.63 rs -195.66.185.64 - 195.66.185.79 me -195.66.185.80 - 195.66.185.95 rs -195.66.185.96 - 195.66.185.159 me -195.66.185.160 - 195.66.185.167 rs -195.66.185.168 - 195.66.185.223 me -195.66.185.224 - 195.66.185.239 rs -195.66.185.240 - 195.66.186.127 me -195.66.186.128 - 195.66.186.159 rs -195.66.186.160 - 195.66.186.175 me -195.66.186.176 - 195.66.186.183 rs -195.66.186.184 - 195.66.191.255 me +195.66.181.112 - 195.66.191.255 me 195.66.192.0 - 195.66.223.255 ua 195.66.224.0 - 195.66.255.255 gb -195.67.0.0 - 195.67.255.255 se -195.68.0.0 - 195.68.2.7 fr -195.68.2.8 - 195.68.2.15 gb -195.68.2.16 - 195.68.2.71 fr -195.68.2.72 - 195.68.2.79 gb -195.68.2.80 - 195.68.2.111 fr -195.68.2.112 - 195.68.2.127 gb -195.68.2.128 - 195.68.2.175 fr -195.68.2.176 - 195.68.2.183 gb -195.68.2.184 - 195.68.2.255 fr -195.68.3.0 - 195.68.3.7 gb -195.68.3.8 - 195.68.3.135 fr -195.68.3.136 - 195.68.3.159 gb -195.68.3.160 - 195.68.4.183 fr -195.68.4.184 - 195.68.4.191 gb -195.68.4.192 - 195.68.4.223 fr -195.68.4.224 - 195.68.4.231 gb -195.68.4.232 - 195.68.5.39 fr -195.68.5.40 - 195.68.5.47 ie -195.68.5.48 - 195.68.5.95 fr -195.68.5.96 - 195.68.5.103 gb -195.68.5.104 - 195.68.5.183 fr -195.68.5.184 - 195.68.5.191 gb -195.68.5.192 - 195.68.5.255 fr -195.68.6.0 - 195.68.6.15 gb -195.68.6.16 - 195.68.6.95 fr -195.68.6.96 - 195.68.6.127 gb -195.68.6.128 - 195.68.6.143 fr -195.68.6.144 - 195.68.6.159 gb -195.68.6.160 - 195.68.6.191 fr -195.68.6.192 - 195.68.6.223 gb -195.68.6.224 - 195.68.7.23 fr -195.68.7.24 - 195.68.7.31 gb -195.68.7.32 - 195.68.7.55 fr -195.68.7.56 - 195.68.7.63 gb -195.68.7.64 - 195.68.7.199 fr -195.68.7.200 - 195.68.7.239 gb -195.68.7.240 - 195.68.8.239 fr -195.68.8.240 - 195.68.8.247 gb -195.68.8.248 - 195.68.9.7 fr -195.68.9.8 - 195.68.9.15 gb -195.68.9.16 - 195.68.11.7 fr -195.68.11.8 - 195.68.11.15 gb -195.68.11.16 - 195.68.11.31 fr -195.68.11.32 - 195.68.11.79 gb -195.68.11.80 - 195.68.11.127 fr -195.68.11.128 - 195.68.11.207 gb -195.68.11.208 - 195.68.12.63 fr -195.68.12.64 - 195.68.12.95 gb -195.68.12.96 - 195.68.12.127 fr -195.68.12.128 - 195.68.12.143 gb -195.68.12.144 - 195.68.12.159 fr -195.68.12.160 - 195.68.12.175 gb -195.68.12.176 - 195.68.12.191 fr -195.68.12.192 - 195.68.12.207 gb -195.68.12.208 - 195.68.12.223 fr -195.68.12.224 - 195.68.12.239 gb -195.68.12.240 - 195.68.13.47 fr -195.68.13.48 - 195.68.13.63 gb -195.68.13.64 - 195.68.13.79 fr -195.68.13.80 - 195.68.13.95 gb -195.68.13.96 - 195.68.13.143 fr -195.68.13.144 - 195.68.13.147 gb -195.68.13.148 - 195.68.13.151 fr -195.68.13.152 - 195.68.13.159 gb -195.68.13.160 - 195.68.13.223 fr -195.68.13.224 - 195.68.13.255 gb -195.68.14.0 - 195.68.14.175 fr -195.68.14.176 - 195.68.14.191 gb -195.68.14.192 - 195.68.15.143 fr -195.68.15.144 - 195.68.15.159 gb -195.68.15.160 - 195.68.15.199 fr -195.68.15.200 - 195.68.15.255 gb -195.68.16.0 - 195.68.17.95 fr -195.68.17.96 - 195.68.17.111 gb -195.68.17.112 - 195.68.17.127 fr -195.68.17.128 - 195.68.17.143 gb -195.68.17.144 - 195.68.17.175 fr -195.68.17.176 - 195.68.17.207 gb -195.68.17.208 - 195.68.17.223 fr -195.68.17.224 - 195.68.17.239 gb -195.68.17.240 - 195.68.18.63 fr -195.68.18.64 - 195.68.18.95 gb -195.68.18.96 - 195.68.18.199 fr -195.68.18.200 - 195.68.18.207 gb -195.68.18.208 - 195.68.18.247 fr -195.68.18.248 - 195.68.19.15 gb -195.68.19.16 - 195.68.19.63 fr -195.68.19.64 - 195.68.19.95 gb -195.68.19.96 - 195.68.19.111 fr -195.68.19.112 - 195.68.19.191 gb -195.68.19.192 - 195.68.20.255 fr -195.68.21.0 - 195.68.21.31 gb -195.68.21.32 - 195.68.21.41 fr -195.68.21.42 - 195.68.21.63 gb -195.68.21.64 - 195.68.21.79 fr -195.68.21.80 - 195.68.21.127 gb -195.68.21.128 - 195.68.21.191 fr -195.68.21.192 - 195.68.21.207 gb -195.68.21.208 - 195.68.23.79 fr -195.68.23.80 - 195.68.23.87 gb -195.68.23.88 - 195.68.23.103 fr -195.68.23.104 - 195.68.23.143 gb -195.68.23.144 - 195.68.23.183 fr -195.68.23.184 - 195.68.23.207 gb -195.68.23.208 - 195.68.23.223 fr -195.68.23.224 - 195.68.23.231 gb -195.68.23.232 - 195.68.23.239 fr -195.68.23.240 - 195.68.23.247 gb -195.68.23.248 - 195.68.24.7 fr -195.68.24.8 - 195.68.24.31 gb -195.68.24.32 - 195.68.24.111 fr -195.68.24.112 - 195.68.24.119 gb -195.68.24.120 - 195.68.24.127 fr -195.68.24.128 - 195.68.24.143 gb -195.68.24.144 - 195.68.24.151 fr -195.68.24.152 - 195.68.24.159 gb -195.68.24.160 - 195.68.24.207 fr -195.68.24.208 - 195.68.24.215 gb -195.68.24.216 - 195.68.24.247 fr -195.68.24.248 - 195.68.24.255 gb -195.68.25.0 - 195.68.26.183 fr -195.68.26.184 - 195.68.26.191 gb -195.68.26.192 - 195.68.27.23 fr -195.68.27.24 - 195.68.27.31 gb -195.68.27.32 - 195.68.27.143 fr -195.68.27.144 - 195.68.27.151 gb -195.68.27.152 - 195.68.27.199 fr -195.68.27.200 - 195.68.27.207 gb -195.68.27.208 - 195.68.27.223 fr -195.68.27.224 - 195.68.27.255 gb -195.68.28.0 - 195.68.28.143 fr -195.68.28.144 - 195.68.28.151 gb -195.68.28.152 - 195.68.28.207 fr -195.68.28.208 - 195.68.28.255 gb -195.68.29.0 - 195.68.29.111 fr -195.68.29.112 - 195.68.29.119 gb -195.68.29.120 - 195.68.31.87 fr -195.68.31.88 - 195.68.31.95 gb -195.68.31.96 - 195.68.32.55 fr -195.68.32.56 - 195.68.32.63 gb -195.68.32.64 - 195.68.32.87 fr -195.68.32.88 - 195.68.32.95 gb -195.68.32.96 - 195.68.33.15 fr -195.68.33.16 - 195.68.33.23 gb -195.68.33.24 - 195.68.33.111 fr -195.68.33.112 - 195.68.33.127 gb -195.68.33.128 - 195.68.33.199 fr -195.68.33.200 - 195.68.33.207 gb -195.68.33.208 - 195.68.33.239 fr -195.68.33.240 - 195.68.33.255 gb -195.68.34.0 - 195.68.34.183 fr -195.68.34.184 - 195.68.34.191 gb -195.68.34.192 - 195.68.34.207 fr -195.68.34.208 - 195.68.34.223 gb -195.68.34.224 - 195.68.34.231 fr -195.68.34.232 - 195.68.34.239 gb -195.68.34.240 - 195.68.34.247 fr -195.68.34.248 - 195.68.34.255 gb -195.68.35.0 - 195.68.35.39 fr -195.68.35.40 - 195.68.35.111 gb -195.68.35.112 - 195.68.35.127 fr -195.68.35.128 - 195.68.35.159 gb -195.68.35.160 - 195.68.35.223 fr -195.68.35.224 - 195.68.35.255 gb -195.68.36.0 - 195.68.36.7 fr -195.68.36.8 - 195.68.36.15 gb -195.68.36.16 - 195.68.36.199 fr -195.68.36.200 - 195.68.36.207 gb -195.68.36.208 - 195.68.36.247 fr -195.68.36.248 - 195.68.36.255 gb -195.68.37.0 - 195.68.37.31 fr -195.68.37.32 - 195.68.37.39 gb -195.68.37.40 - 195.68.37.63 fr -195.68.37.64 - 195.68.37.239 gb -195.68.37.240 - 195.68.39.175 fr -195.68.39.176 - 195.68.39.191 gb -195.68.39.192 - 195.68.39.207 fr -195.68.39.208 - 195.68.39.215 gb -195.68.39.216 - 195.68.40.63 fr -195.68.40.64 - 195.68.40.79 gb -195.68.40.80 - 195.68.40.135 fr -195.68.40.136 - 195.68.40.143 gb -195.68.40.144 - 195.68.40.151 fr -195.68.40.152 - 195.68.40.159 gb -195.68.40.160 - 195.68.43.143 fr -195.68.43.144 - 195.68.43.191 gb -195.68.43.192 - 195.68.45.23 fr -195.68.45.24 - 195.68.45.47 gb -195.68.45.48 - 195.68.45.63 fr -195.68.45.64 - 195.68.45.71 gb +195.67.0.0 - 195.67.86.255 se +195.67.87.0 - 195.67.87.255 dk +195.67.88.0 - 195.67.255.255 se +195.68.0.0 - 195.68.2.159 gb +195.68.2.160 - 195.68.2.167 fr +195.68.2.168 - 195.68.2.255 gb +195.68.3.0 - 195.68.3.255 fr +195.68.4.0 - 195.68.4.207 gb +195.68.4.208 - 195.68.4.223 fr +195.68.4.224 - 195.68.5.103 gb +195.68.5.104 - 195.68.5.111 es +195.68.5.112 - 195.68.45.71 gb 195.68.45.72 - 195.68.45.79 fr -195.68.45.80 - 195.68.45.87 gb -195.68.45.88 - 195.68.45.95 fr -195.68.45.96 - 195.68.45.103 gb -195.68.45.104 - 195.68.45.119 fr -195.68.45.120 - 195.68.45.127 gb -195.68.45.128 - 195.68.45.159 fr -195.68.45.160 - 195.68.45.191 gb -195.68.45.192 - 195.68.45.207 fr -195.68.45.208 - 195.68.45.239 gb -195.68.45.240 - 195.68.49.55 fr -195.68.49.56 - 195.68.49.63 gb -195.68.49.64 - 195.68.49.79 fr -195.68.49.80 - 195.68.49.87 gb -195.68.49.88 - 195.68.49.103 fr -195.68.49.104 - 195.68.49.111 gb -195.68.49.112 - 195.68.49.207 fr -195.68.49.208 - 195.68.49.239 gb -195.68.49.240 - 195.68.50.55 fr -195.68.50.56 - 195.68.50.79 gb -195.68.50.80 - 195.68.50.159 fr -195.68.50.160 - 195.68.50.167 gb -195.68.50.168 - 195.68.50.175 fr -195.68.50.176 - 195.68.50.207 gb -195.68.50.208 - 195.68.50.223 fr -195.68.50.224 - 195.68.50.239 gb -195.68.50.240 - 195.68.51.79 fr -195.68.51.80 - 195.68.51.95 gb -195.68.51.96 - 195.68.51.103 fr -195.68.51.104 - 195.68.51.159 gb -195.68.51.160 - 195.68.51.191 fr -195.68.51.192 - 195.68.51.199 gb -195.68.51.200 - 195.68.51.223 fr -195.68.51.224 - 195.68.52.47 gb -195.68.52.48 - 195.68.52.63 fr -195.68.52.64 - 195.68.52.111 gb -195.68.52.112 - 195.68.53.175 fr -195.68.53.176 - 195.68.53.191 gb -195.68.53.192 - 195.68.54.111 fr -195.68.54.112 - 195.68.54.127 gb -195.68.54.128 - 195.68.54.159 fr -195.68.54.160 - 195.68.54.191 gb -195.68.54.192 - 195.68.55.47 fr -195.68.55.48 - 195.68.55.95 gb -195.68.55.96 - 195.68.55.143 fr -195.68.55.144 - 195.68.55.159 gb -195.68.55.160 - 195.68.55.207 fr -195.68.55.208 - 195.68.55.223 gb -195.68.55.224 - 195.68.56.47 fr -195.68.56.48 - 195.68.56.63 gb -195.68.56.64 - 195.68.56.143 fr -195.68.56.144 - 195.68.56.159 gb -195.68.56.160 - 195.68.56.175 fr -195.68.56.176 - 195.68.56.207 gb -195.68.56.208 - 195.68.56.223 fr -195.68.56.224 - 195.68.56.239 gb -195.68.56.240 - 195.68.56.255 fr -195.68.57.0 - 195.68.57.71 gb -195.68.57.72 - 195.68.57.87 fr -195.68.57.88 - 195.68.57.95 gb -195.68.57.96 - 195.68.57.103 fr -195.68.57.104 - 195.68.57.127 gb -195.68.57.128 - 195.68.58.63 fr -195.68.58.64 - 195.68.58.95 gb -195.68.58.96 - 195.68.59.71 fr -195.68.59.72 - 195.68.59.79 gb -195.68.59.80 - 195.68.59.87 fr -195.68.59.88 - 195.68.59.95 gb -195.68.59.96 - 195.68.59.119 fr -195.68.59.120 - 195.68.59.127 gb -195.68.59.128 - 195.68.59.135 fr -195.68.59.136 - 195.68.59.143 gb -195.68.59.144 - 195.68.59.191 fr -195.68.59.192 - 195.68.59.199 gb -195.68.59.200 - 195.68.59.207 fr -195.68.59.208 - 195.68.59.215 gb -195.68.59.216 - 195.68.59.223 fr -195.68.59.224 - 195.68.59.255 gb -195.68.60.0 - 195.68.60.255 fr -195.68.61.0 - 195.68.61.15 gb -195.68.61.16 - 195.68.61.159 fr -195.68.61.160 - 195.68.61.175 gb -195.68.61.176 - 195.68.61.191 fr -195.68.61.192 - 195.68.61.223 gb -195.68.61.224 - 195.68.61.239 fr -195.68.61.240 - 195.68.61.255 gb -195.68.62.0 - 195.68.62.143 fr -195.68.62.144 - 195.68.62.159 gb -195.68.62.160 - 195.68.63.31 fr -195.68.63.32 - 195.68.63.95 gb -195.68.63.96 - 195.68.63.159 fr -195.68.63.160 - 195.68.63.191 gb -195.68.63.192 - 195.68.63.223 fr -195.68.63.224 - 195.68.64.15 gb -195.68.64.16 - 195.68.64.31 fr -195.68.64.32 - 195.68.64.47 gb -195.68.64.48 - 195.68.64.127 fr -195.68.64.128 - 195.68.64.143 gb -195.68.64.144 - 195.68.64.239 fr -195.68.64.240 - 195.68.64.255 gb -195.68.65.0 - 195.68.65.7 fr -195.68.65.8 - 195.68.65.31 gb -195.68.65.32 - 195.68.65.47 fr -195.68.65.48 - 195.68.65.55 gb -195.68.65.56 - 195.68.65.63 fr -195.68.65.64 - 195.68.65.95 gb -195.68.65.96 - 195.68.65.111 fr -195.68.65.112 - 195.68.65.127 gb -195.68.65.128 - 195.68.65.199 fr -195.68.65.200 - 195.68.65.207 gb -195.68.65.208 - 195.68.65.255 fr -195.68.66.0 - 195.68.66.31 gb -195.68.66.32 - 195.68.66.79 fr -195.68.66.80 - 195.68.66.95 gb -195.68.66.96 - 195.68.69.23 fr -195.68.69.24 - 195.68.69.31 gb -195.68.69.32 - 195.68.69.143 fr -195.68.69.144 - 195.68.69.151 gb -195.68.69.152 - 195.68.69.191 fr -195.68.69.192 - 195.68.69.207 gb -195.68.69.208 - 195.68.70.31 fr -195.68.70.32 - 195.68.70.63 gb -195.68.70.64 - 195.68.70.71 fr -195.68.70.72 - 195.68.70.103 gb -195.68.70.104 - 195.68.70.143 fr -195.68.70.144 - 195.68.70.191 gb -195.68.70.192 - 195.68.70.231 fr -195.68.70.232 - 195.68.70.255 gb -195.68.71.0 - 195.68.72.7 fr -195.68.72.8 - 195.68.72.15 gb -195.68.72.16 - 195.68.72.23 fr -195.68.72.24 - 195.68.72.47 gb -195.68.72.48 - 195.68.72.55 fr -195.68.72.56 - 195.68.72.63 gb -195.68.72.64 - 195.68.72.103 fr -195.68.72.104 - 195.68.72.111 gb -195.68.72.112 - 195.68.72.191 fr -195.68.72.192 - 195.68.72.207 gb -195.68.72.208 - 195.68.72.223 fr -195.68.72.224 - 195.68.72.255 gb -195.68.73.0 - 195.68.73.7 fr -195.68.73.8 - 195.68.73.47 gb -195.68.73.48 - 195.68.73.63 fr -195.68.73.64 - 195.68.73.87 gb -195.68.73.88 - 195.68.73.111 fr -195.68.73.112 - 195.68.73.159 gb -195.68.73.160 - 195.68.73.175 fr -195.68.73.176 - 195.68.73.223 gb -195.68.73.224 - 195.68.74.31 fr -195.68.74.32 - 195.68.74.47 gb -195.68.74.48 - 195.68.74.79 fr -195.68.74.80 - 195.68.74.95 gb -195.68.74.96 - 195.68.74.207 fr -195.68.74.208 - 195.68.74.223 gb -195.68.74.224 - 195.68.76.15 fr -195.68.76.16 - 195.68.76.95 gb -195.68.76.96 - 195.68.76.127 fr -195.68.76.128 - 195.68.76.143 gb -195.68.76.144 - 195.68.76.191 fr -195.68.76.192 - 195.68.76.207 gb -195.68.76.208 - 195.68.76.223 fr -195.68.76.224 - 195.68.76.255 gb -195.68.77.0 - 195.68.77.255 fr -195.68.78.0 - 195.68.78.119 gb -195.68.78.120 - 195.68.78.127 fr -195.68.78.128 - 195.68.78.159 gb -195.68.78.160 - 195.68.78.255 fr -195.68.79.0 - 195.68.79.31 gb -195.68.79.32 - 195.68.79.47 fr -195.68.79.48 - 195.68.79.63 gb -195.68.79.64 - 195.68.79.71 fr -195.68.79.72 - 195.68.79.79 gb -195.68.79.80 - 195.68.79.87 fr -195.68.79.88 - 195.68.79.95 gb -195.68.79.96 - 195.68.79.135 fr -195.68.79.136 - 195.68.79.159 gb -195.68.79.160 - 195.68.88.175 fr -195.68.88.176 - 195.68.88.183 de -195.68.88.184 - 195.68.89.31 fr -195.68.89.32 - 195.68.89.63 gb -195.68.89.64 - 195.68.89.239 fr -195.68.89.240 - 195.68.89.255 gb -195.68.90.0 - 195.68.90.63 fr -195.68.90.64 - 195.68.90.255 gb -195.68.91.0 - 195.68.92.7 fr -195.68.92.8 - 195.68.92.15 gb -195.68.92.16 - 195.68.92.79 fr -195.68.92.80 - 195.68.92.95 gb -195.68.92.96 - 195.68.92.239 fr -195.68.92.240 - 195.68.92.255 gb -195.68.93.0 - 195.68.94.71 fr -195.68.94.72 - 195.68.94.111 gb -195.68.94.112 - 195.68.94.255 fr -195.68.95.0 - 195.68.95.15 gb -195.68.95.16 - 195.68.95.71 fr -195.68.95.72 - 195.68.95.95 gb -195.68.95.96 - 195.68.95.159 fr -195.68.95.160 - 195.68.95.223 gb -195.68.95.224 - 195.68.96.15 fr -195.68.96.16 - 195.68.96.255 gb -195.68.97.0 - 195.68.98.7 fr -195.68.98.8 - 195.68.98.15 gb -195.68.98.16 - 195.68.98.47 fr -195.68.98.48 - 195.68.98.63 gb -195.68.98.64 - 195.68.98.79 fr -195.68.98.80 - 195.68.98.111 gb -195.68.98.112 - 195.68.98.143 fr -195.68.98.144 - 195.68.98.159 gb -195.68.98.160 - 195.68.98.191 fr -195.68.98.192 - 195.68.98.255 gb -195.68.99.0 - 195.68.99.7 fr -195.68.99.8 - 195.68.99.255 gb -195.68.100.0 - 195.68.100.39 fr -195.68.100.40 - 195.68.100.79 gb -195.68.100.80 - 195.68.100.111 fr -195.68.100.112 - 195.68.100.127 gb -195.68.100.128 - 195.68.100.159 fr -195.68.100.160 - 195.68.100.175 gb -195.68.100.176 - 195.68.100.223 fr -195.68.100.224 - 195.68.100.255 gb -195.68.101.0 - 195.68.103.31 fr -195.68.103.32 - 195.68.103.95 gb -195.68.103.96 - 195.68.103.127 fr -195.68.103.128 - 195.68.103.159 gb -195.68.103.160 - 195.68.103.223 fr -195.68.103.224 - 195.68.103.239 gb -195.68.103.240 - 195.68.104.39 fr -195.68.104.40 - 195.68.104.47 gb -195.68.104.48 - 195.68.104.127 fr -195.68.104.128 - 195.68.104.135 gb -195.68.104.136 - 195.68.104.199 fr -195.68.104.200 - 195.68.104.207 gb -195.68.104.208 - 195.68.104.247 fr -195.68.104.248 - 195.68.105.47 gb -195.68.105.48 - 195.68.105.95 fr -195.68.105.96 - 195.68.105.127 gb -195.68.105.128 - 195.68.105.143 fr -195.68.105.144 - 195.68.105.159 gb -195.68.105.160 - 195.68.105.191 fr -195.68.105.192 - 195.68.105.223 gb -195.68.105.224 - 195.68.106.175 fr -195.68.106.176 - 195.68.106.191 gb -195.68.106.192 - 195.68.107.15 fr -195.68.107.16 - 195.68.107.47 gb -195.68.107.48 - 195.68.107.111 fr -195.68.107.112 - 195.68.107.127 gb -195.68.107.128 - 195.68.107.239 fr -195.68.107.240 - 195.68.107.255 gb -195.68.108.0 - 195.68.108.63 fr -195.68.108.64 - 195.68.108.95 gb -195.68.108.96 - 195.68.108.175 fr -195.68.108.176 - 195.68.108.191 gb -195.68.108.192 - 195.68.109.23 fr -195.68.109.24 - 195.68.109.31 gb -195.68.109.32 - 195.68.109.47 fr -195.68.109.48 - 195.68.109.63 gb -195.68.109.64 - 195.68.109.79 fr -195.68.109.80 - 195.68.109.127 gb -195.68.109.128 - 195.68.110.31 fr -195.68.110.32 - 195.68.110.47 gb -195.68.110.48 - 195.68.110.111 fr -195.68.110.112 - 195.68.110.159 gb -195.68.110.160 - 195.68.110.191 fr -195.68.110.192 - 195.68.110.223 gb -195.68.110.224 - 195.68.110.239 fr -195.68.110.240 - 195.68.110.255 gb -195.68.111.0 - 195.68.111.63 fr -195.68.111.64 - 195.68.111.159 gb -195.68.111.160 - 195.68.111.191 fr -195.68.111.192 - 195.68.111.207 gb -195.68.111.208 - 195.68.111.223 fr -195.68.111.224 - 195.68.111.255 gb -195.68.112.0 - 195.68.114.23 fr -195.68.114.24 - 195.68.114.63 gb -195.68.114.64 - 195.68.114.79 fr -195.68.114.80 - 195.68.114.95 gb -195.68.114.96 - 195.68.120.23 fr -195.68.120.24 - 195.68.120.31 gb -195.68.120.32 - 195.68.120.63 fr -195.68.120.64 - 195.68.120.71 gb -195.68.120.72 - 195.68.120.79 fr -195.68.120.80 - 195.68.120.87 gb -195.68.120.88 - 195.68.120.191 fr -195.68.120.192 - 195.68.120.207 gb -195.68.120.208 - 195.68.120.223 fr -195.68.120.224 - 195.68.120.255 gb -195.68.121.0 - 195.68.121.63 fr -195.68.121.64 - 195.68.121.95 gb -195.68.121.96 - 195.68.121.127 fr -195.68.121.128 - 195.68.121.159 gb -195.68.121.160 - 195.68.121.191 fr -195.68.121.192 - 195.68.121.255 gb -195.68.122.0 - 195.68.122.15 fr -195.68.122.16 - 195.68.122.31 gb -195.68.122.32 - 195.68.122.63 fr -195.68.122.64 - 195.68.122.79 gb -195.68.122.80 - 195.68.122.127 fr -195.68.122.128 - 195.68.122.143 gb -195.68.122.144 - 195.68.122.159 fr -195.68.122.160 - 195.68.122.167 gb -195.68.122.168 - 195.68.122.191 fr -195.68.122.192 - 195.68.122.199 gb -195.68.122.200 - 195.68.122.223 fr -195.68.122.224 - 195.68.122.239 gb -195.68.122.240 - 195.68.123.135 fr -195.68.123.136 - 195.68.123.143 gb -195.68.123.144 - 195.68.123.167 fr -195.68.123.168 - 195.68.123.183 gb -195.68.123.184 - 195.68.123.199 fr -195.68.123.200 - 195.68.123.215 gb -195.68.123.216 - 195.68.123.231 fr -195.68.123.232 - 195.68.123.255 gb -195.68.124.0 - 195.68.124.39 fr -195.68.124.40 - 195.68.124.47 gb -195.68.124.48 - 195.68.124.79 fr -195.68.124.80 - 195.68.124.95 gb -195.68.124.96 - 195.68.124.143 fr -195.68.124.144 - 195.68.124.151 gb -195.68.124.152 - 195.68.124.167 fr -195.68.124.168 - 195.68.124.175 gb -195.68.124.176 - 195.68.124.231 fr -195.68.124.232 - 195.68.124.239 gb -195.68.124.240 - 195.68.125.15 fr -195.68.125.16 - 195.68.125.39 gb -195.68.125.40 - 195.68.125.63 fr -195.68.125.64 - 195.68.125.79 gb -195.68.125.80 - 195.68.125.199 fr -195.68.125.200 - 195.68.125.215 gb -195.68.125.216 - 195.68.125.247 fr -195.68.125.248 - 195.68.126.31 gb -195.68.126.32 - 195.68.126.95 fr -195.68.126.96 - 195.68.126.127 gb -195.68.126.128 - 195.68.127.255 fr +195.68.45.80 - 195.68.49.255 gb +195.68.50.0 - 195.68.50.255 fr +195.68.51.0 - 195.68.58.127 gb +195.68.58.128 - 195.68.58.255 fr +195.68.59.0 - 195.68.61.191 gb +195.68.61.192 - 195.68.61.255 fr +195.68.62.0 - 195.68.66.127 gb +195.68.66.128 - 195.68.66.143 fr +195.68.66.144 - 195.68.69.247 gb +195.68.69.248 - 195.68.69.255 fr +195.68.70.0 - 195.68.73.55 gb +195.68.73.56 - 195.68.73.63 fr +195.68.73.64 - 195.68.78.255 gb +195.68.79.0 - 195.68.79.255 fr +195.68.80.0 - 195.68.89.191 gb +195.68.89.192 - 195.68.89.255 fr +195.68.90.0 - 195.68.100.95 gb +195.68.100.96 - 195.68.100.111 fr +195.68.100.112 - 195.68.104.159 gb +195.68.104.160 - 195.68.104.175 fr +195.68.104.176 - 195.68.111.31 gb +195.68.111.32 - 195.68.111.47 fr +195.68.111.48 - 195.68.111.95 gb +195.68.111.96 - 195.68.111.111 fr +195.68.111.112 - 195.68.122.255 gb +195.68.123.0 - 195.68.123.255 fr +195.68.124.0 - 195.68.127.255 gb 195.68.128.0 - 195.68.191.255 ru 195.68.192.0 - 195.68.193.255 pl 195.68.194.0 - 195.68.195.255 fr @@ -106413,8 +90346,6 @@ 195.68.216.0 - 195.68.219.255 ua 195.68.220.0 - 195.68.221.255 gb 195.68.222.0 - 195.68.223.255 ua -195.68.224.0 - 195.68.225.255 gb -195.68.226.0 - 195.68.227.255 pl 195.68.228.0 - 195.68.229.255 gb 195.68.230.0 - 195.68.231.255 sk 195.68.232.0 - 195.68.233.255 pl @@ -106426,10 +90357,8 @@ 195.68.244.0 - 195.68.244.255 nl 195.68.245.0 - 195.68.245.255 ru 195.68.246.0 - 195.68.247.255 de -195.68.248.0 - 195.68.249.255 ua 195.68.250.0 - 195.68.251.255 fr 195.68.252.0 - 195.68.253.255 ru -195.68.254.0 - 195.68.255.255 gb 195.69.0.0 - 195.69.63.255 no 195.69.64.0 - 195.69.67.255 ru 195.69.68.0 - 195.69.71.255 it @@ -106440,7 +90369,6 @@ 195.69.88.0 - 195.69.91.255 lv 195.69.92.0 - 195.69.95.255 gb 195.69.96.0 - 195.69.99.255 si -195.69.100.0 - 195.69.103.255 ru 195.69.104.0 - 195.69.107.255 at 195.69.108.0 - 195.69.111.255 bg 195.69.112.0 - 195.69.115.255 de @@ -106448,8 +90376,7 @@ 195.69.120.0 - 195.69.123.255 bg 195.69.124.0 - 195.69.127.255 pl 195.69.128.0 - 195.69.131.255 dk -195.69.132.0 - 195.69.139.255 ua -195.69.140.0 - 195.69.143.255 kw +195.69.132.0 - 195.69.135.255 ua 195.69.144.0 - 195.69.147.255 nl 195.69.148.0 - 195.69.151.255 ru 195.69.152.0 - 195.69.155.255 gb @@ -106464,17 +90391,16 @@ 195.69.188.0 - 195.69.191.255 uz 195.69.192.0 - 195.69.195.255 at 195.69.196.0 - 195.69.203.255 ua +195.69.204.0 - 195.69.207.255 ru 195.69.208.0 - 195.69.211.255 pl 195.69.212.0 - 195.69.215.255 gb 195.69.216.0 - 195.69.219.255 ru 195.69.220.0 - 195.69.223.255 ua 195.69.224.0 - 195.69.227.255 nl -195.69.228.0 - 195.69.231.255 pl 195.69.232.0 - 195.69.235.255 nl 195.69.236.0 - 195.69.239.255 ru 195.69.240.0 - 195.69.243.255 de 195.69.244.0 - 195.69.251.255 ua -195.69.252.0 - 195.69.255.255 gb 195.70.0.0 - 195.70.31.255 ch 195.70.32.0 - 195.70.63.255 hu 195.70.64.0 - 195.70.95.255 gb @@ -106485,26 +90411,15 @@ 195.70.224.0 - 195.70.255.255 at 195.71.0.0 - 195.71.94.63 de 195.71.94.64 - 195.71.94.127 gb -195.71.94.128 - 195.71.123.95 de -195.71.123.96 - 195.71.123.103 fr -195.71.123.104 - 195.71.133.223 de -195.71.133.224 - 195.71.133.255 ro -195.71.134.0 - 195.71.152.191 de -195.71.152.192 - 195.71.152.199 fr -195.71.152.200 - 195.71.154.255 de -195.71.155.0 - 195.71.155.127 gb -195.71.155.128 - 195.71.155.223 de -195.71.155.224 - 195.71.155.239 fr -195.71.155.240 - 195.71.255.255 de +195.71.94.128 - 195.71.255.255 de 195.72.0.0 - 195.72.31.255 sk 195.72.32.0 - 195.72.63.255 gb -195.72.64.0 - 195.72.73.255 be -195.72.74.0 - 195.72.74.7 lu -195.72.74.8 - 195.72.95.255 be +195.72.64.0 - 195.72.95.255 be 195.72.96.0 - 195.72.111.255 de 195.72.112.0 - 195.72.112.255 bg 195.72.113.0 - 195.72.115.255 gb -195.72.116.0 - 195.72.127.255 il +195.72.116.0 - 195.72.123.255 il +195.72.124.0 - 195.72.127.255 nl 195.72.128.0 - 195.72.131.255 gb 195.72.132.0 - 195.72.135.255 at 195.72.136.0 - 195.72.139.255 pt @@ -106516,2025 +90431,7 @@ 195.72.160.0 - 195.72.191.255 gb 195.72.192.0 - 195.72.223.255 it 195.72.224.0 - 195.72.255.255 ru -195.73.0.0 - 195.73.0.23 nl -195.73.0.24 - 195.73.0.31 de -195.73.0.32 - 195.73.1.31 nl -195.73.1.32 - 195.73.1.39 de -195.73.1.40 - 195.73.1.151 nl -195.73.1.152 - 195.73.1.159 de -195.73.1.160 - 195.73.1.175 nl -195.73.1.176 - 195.73.1.191 de -195.73.1.192 - 195.73.1.231 nl -195.73.1.232 - 195.73.1.239 de -195.73.1.240 - 195.73.2.7 nl -195.73.2.8 - 195.73.2.15 de -195.73.2.16 - 195.73.2.63 nl -195.73.2.64 - 195.73.2.71 de -195.73.2.72 - 195.73.2.119 nl -195.73.2.120 - 195.73.2.127 de -195.73.2.128 - 195.73.2.215 nl -195.73.2.216 - 195.73.2.223 de -195.73.2.224 - 195.73.3.103 nl -195.73.3.104 - 195.73.3.111 de -195.73.3.112 - 195.73.3.175 nl -195.73.3.176 - 195.73.3.183 de -195.73.3.184 - 195.73.3.231 nl -195.73.3.232 - 195.73.3.239 de -195.73.3.240 - 195.73.4.111 nl -195.73.4.112 - 195.73.4.119 de -195.73.4.120 - 195.73.4.223 nl -195.73.4.224 - 195.73.4.231 de -195.73.4.232 - 195.73.5.7 nl -195.73.5.8 - 195.73.5.23 de -195.73.5.24 - 195.73.5.55 nl -195.73.5.56 - 195.73.5.63 de -195.73.5.64 - 195.73.5.143 nl -195.73.5.144 - 195.73.5.151 de -195.73.5.152 - 195.73.5.175 nl -195.73.5.176 - 195.73.5.191 de -195.73.5.192 - 195.73.5.239 nl -195.73.5.240 - 195.73.5.255 de -195.73.6.0 - 195.73.6.47 nl -195.73.6.48 - 195.73.6.55 de -195.73.6.56 - 195.73.6.63 nl -195.73.6.64 - 195.73.6.79 de -195.73.6.80 - 195.73.6.207 nl -195.73.6.208 - 195.73.6.215 de -195.73.6.216 - 195.73.6.255 nl -195.73.7.0 - 195.73.7.7 de -195.73.7.8 - 195.73.7.15 nl -195.73.7.16 - 195.73.7.23 de -195.73.7.24 - 195.73.7.31 nl -195.73.7.32 - 195.73.7.39 de -195.73.7.40 - 195.73.7.47 nl -195.73.7.48 - 195.73.7.55 de -195.73.7.56 - 195.73.7.191 nl -195.73.7.192 - 195.73.7.199 de -195.73.7.200 - 195.73.7.207 nl -195.73.7.208 - 195.73.7.215 de -195.73.7.216 - 195.73.7.247 nl -195.73.7.248 - 195.73.7.255 de -195.73.8.0 - 195.73.8.63 nl -195.73.8.64 - 195.73.8.71 de -195.73.8.72 - 195.73.8.95 nl -195.73.8.96 - 195.73.8.103 de -195.73.8.104 - 195.73.8.127 nl -195.73.8.128 - 195.73.8.151 de -195.73.8.152 - 195.73.8.167 nl -195.73.8.168 - 195.73.8.183 de -195.73.8.184 - 195.73.8.191 nl -195.73.8.192 - 195.73.8.199 de -195.73.8.200 - 195.73.8.215 nl -195.73.8.216 - 195.73.8.223 de -195.73.8.224 - 195.73.8.255 nl -195.73.9.0 - 195.73.10.7 de -195.73.10.8 - 195.73.10.23 nl -195.73.10.24 - 195.73.10.31 de -195.73.10.32 - 195.73.10.63 nl -195.73.10.64 - 195.73.10.71 de -195.73.10.72 - 195.73.10.95 nl -195.73.10.96 - 195.73.10.103 de -195.73.10.104 - 195.73.10.239 nl -195.73.10.240 - 195.73.10.247 de -195.73.10.248 - 195.73.10.255 nl -195.73.11.0 - 195.73.11.7 de -195.73.11.8 - 195.73.11.47 nl -195.73.11.48 - 195.73.11.55 de -195.73.11.56 - 195.73.11.151 nl -195.73.11.152 - 195.73.11.159 de -195.73.11.160 - 195.73.11.239 nl -195.73.11.240 - 195.73.11.255 de -195.73.12.0 - 195.73.12.71 nl -195.73.12.72 - 195.73.12.79 de -195.73.12.80 - 195.73.12.95 nl -195.73.12.96 - 195.73.12.103 de -195.73.12.104 - 195.73.12.151 nl -195.73.12.152 - 195.73.12.159 de -195.73.12.160 - 195.73.12.231 nl -195.73.12.232 - 195.73.12.239 de -195.73.12.240 - 195.73.12.255 nl -195.73.13.0 - 195.73.13.7 de -195.73.13.8 - 195.73.13.47 nl -195.73.13.48 - 195.73.13.55 de -195.73.13.56 - 195.73.13.87 nl -195.73.13.88 - 195.73.13.95 de -195.73.13.96 - 195.73.13.135 nl -195.73.13.136 - 195.73.13.143 de -195.73.13.144 - 195.73.13.151 nl -195.73.13.152 - 195.73.13.183 de -195.73.13.184 - 195.73.13.223 nl -195.73.13.224 - 195.73.13.231 de -195.73.13.232 - 195.73.14.63 nl -195.73.14.64 - 195.73.14.71 de -195.73.14.72 - 195.73.14.151 nl -195.73.14.152 - 195.73.14.159 de -195.73.14.160 - 195.73.14.175 nl -195.73.14.176 - 195.73.14.183 de -195.73.14.184 - 195.73.14.231 nl -195.73.14.232 - 195.73.14.239 de -195.73.14.240 - 195.73.15.135 nl -195.73.15.136 - 195.73.15.143 de -195.73.15.144 - 195.73.15.207 nl -195.73.15.208 - 195.73.15.215 de -195.73.15.216 - 195.73.15.239 nl -195.73.15.240 - 195.73.15.247 de -195.73.15.248 - 195.73.15.255 nl -195.73.16.0 - 195.73.16.15 de -195.73.16.16 - 195.73.16.71 nl -195.73.16.72 - 195.73.16.79 de -195.73.16.80 - 195.73.17.47 nl -195.73.17.48 - 195.73.17.55 de -195.73.17.56 - 195.73.17.127 nl -195.73.17.128 - 195.73.17.135 de -195.73.17.136 - 195.73.17.167 nl -195.73.17.168 - 195.73.17.183 de -195.73.17.184 - 195.73.17.223 nl -195.73.17.224 - 195.73.17.231 de -195.73.17.232 - 195.73.17.239 nl -195.73.17.240 - 195.73.17.247 de -195.73.17.248 - 195.73.18.7 nl -195.73.18.8 - 195.73.18.15 de -195.73.18.16 - 195.73.18.71 nl -195.73.18.72 - 195.73.18.79 de -195.73.18.80 - 195.73.19.55 nl -195.73.19.56 - 195.73.19.63 de -195.73.19.64 - 195.73.19.95 nl -195.73.19.96 - 195.73.19.103 de -195.73.19.104 - 195.73.19.111 nl -195.73.19.112 - 195.73.19.119 de -195.73.19.120 - 195.73.19.183 nl -195.73.19.184 - 195.73.19.191 de -195.73.19.192 - 195.73.19.247 nl -195.73.19.248 - 195.73.20.7 de -195.73.20.8 - 195.73.21.31 nl -195.73.21.32 - 195.73.21.39 de -195.73.21.40 - 195.73.21.79 nl -195.73.21.80 - 195.73.21.87 de -195.73.21.88 - 195.73.21.103 nl -195.73.21.104 - 195.73.21.111 de -195.73.21.112 - 195.73.21.215 nl -195.73.21.216 - 195.73.21.223 de -195.73.21.224 - 195.73.21.255 nl -195.73.22.0 - 195.73.22.7 de -195.73.22.8 - 195.73.22.71 nl -195.73.22.72 - 195.73.22.79 de -195.73.22.80 - 195.73.22.159 nl -195.73.22.160 - 195.73.22.167 de -195.73.22.168 - 195.73.22.231 nl -195.73.22.232 - 195.73.22.247 de -195.73.22.248 - 195.73.22.255 nl -195.73.23.0 - 195.73.23.7 de -195.73.23.8 - 195.73.23.23 nl -195.73.23.24 - 195.73.23.31 de -195.73.23.32 - 195.73.23.71 nl -195.73.23.72 - 195.73.23.79 de -195.73.23.80 - 195.73.23.191 nl -195.73.23.192 - 195.73.23.199 de -195.73.23.200 - 195.73.23.255 nl -195.73.24.0 - 195.73.24.7 de -195.73.24.8 - 195.73.24.151 nl -195.73.24.152 - 195.73.24.159 de -195.73.24.160 - 195.73.25.7 nl -195.73.25.8 - 195.73.25.15 de -195.73.25.16 - 195.73.25.111 nl -195.73.25.112 - 195.73.25.119 de -195.73.25.120 - 195.73.25.199 nl -195.73.25.200 - 195.73.25.207 de -195.73.25.208 - 195.73.25.255 nl -195.73.26.0 - 195.73.26.7 de -195.73.26.8 - 195.73.26.55 nl -195.73.26.56 - 195.73.26.63 de -195.73.26.64 - 195.73.26.87 nl -195.73.26.88 - 195.73.26.95 de -195.73.26.96 - 195.73.26.111 nl -195.73.26.112 - 195.73.26.119 de -195.73.26.120 - 195.73.26.159 nl -195.73.26.160 - 195.73.26.167 de -195.73.26.168 - 195.73.26.207 nl -195.73.26.208 - 195.73.26.215 de -195.73.26.216 - 195.73.26.223 nl -195.73.26.224 - 195.73.26.231 de -195.73.26.232 - 195.73.26.247 nl -195.73.26.248 - 195.73.27.7 de -195.73.27.8 - 195.73.27.23 nl -195.73.27.24 - 195.73.27.31 de -195.73.27.32 - 195.73.27.39 nl -195.73.27.40 - 195.73.27.63 de -195.73.27.64 - 195.73.27.71 nl -195.73.27.72 - 195.73.27.79 de -195.73.27.80 - 195.73.27.135 nl -195.73.27.136 - 195.73.27.143 de -195.73.27.144 - 195.73.27.159 nl -195.73.27.160 - 195.73.27.167 de -195.73.27.168 - 195.73.27.183 nl -195.73.27.184 - 195.73.27.191 de -195.73.27.192 - 195.73.28.15 nl -195.73.28.16 - 195.73.28.23 de -195.73.28.24 - 195.73.28.39 nl -195.73.28.40 - 195.73.28.47 de -195.73.28.48 - 195.73.28.95 nl -195.73.28.96 - 195.73.28.103 de -195.73.28.104 - 195.73.28.207 nl -195.73.28.208 - 195.73.28.215 de -195.73.28.216 - 195.73.29.7 nl -195.73.29.8 - 195.73.29.15 de -195.73.29.16 - 195.73.29.47 nl -195.73.29.48 - 195.73.29.79 de -195.73.29.80 - 195.73.29.95 nl -195.73.29.96 - 195.73.29.103 de -195.73.29.104 - 195.73.29.167 nl -195.73.29.168 - 195.73.29.175 de -195.73.29.176 - 195.73.30.135 nl -195.73.30.136 - 195.73.30.143 de -195.73.30.144 - 195.73.30.207 nl -195.73.30.208 - 195.73.30.215 de -195.73.30.216 - 195.73.30.239 nl -195.73.30.240 - 195.73.30.247 de -195.73.30.248 - 195.73.31.15 nl -195.73.31.16 - 195.73.31.23 de -195.73.31.24 - 195.73.31.31 nl -195.73.31.32 - 195.73.31.39 de -195.73.31.40 - 195.73.32.239 nl -195.73.32.240 - 195.73.32.247 de -195.73.32.248 - 195.73.33.135 nl -195.73.33.136 - 195.73.33.143 de -195.73.33.144 - 195.73.33.175 nl -195.73.33.176 - 195.73.33.183 de -195.73.33.184 - 195.73.33.207 nl -195.73.33.208 - 195.73.33.215 de -195.73.33.216 - 195.73.34.39 nl -195.73.34.40 - 195.73.34.47 de -195.73.34.48 - 195.73.34.79 nl -195.73.34.80 - 195.73.34.95 de -195.73.34.96 - 195.73.34.239 nl -195.73.34.240 - 195.73.34.247 de -195.73.34.248 - 195.73.34.255 nl -195.73.35.0 - 195.73.35.7 de -195.73.35.8 - 195.73.35.31 nl -195.73.35.32 - 195.73.35.39 de -195.73.35.40 - 195.73.35.79 nl -195.73.35.80 - 195.73.35.87 de -195.73.35.88 - 195.73.35.247 nl -195.73.35.248 - 195.73.35.255 de -195.73.36.0 - 195.73.36.55 nl -195.73.36.56 - 195.73.36.63 de -195.73.36.64 - 195.73.36.175 nl -195.73.36.176 - 195.73.36.183 de -195.73.36.184 - 195.73.36.207 nl -195.73.36.208 - 195.73.36.215 de -195.73.36.216 - 195.73.36.223 nl -195.73.36.224 - 195.73.36.231 de -195.73.36.232 - 195.73.37.239 nl -195.73.37.240 - 195.73.37.247 de -195.73.37.248 - 195.73.37.255 nl -195.73.38.0 - 195.73.38.7 de -195.73.38.8 - 195.73.38.31 nl -195.73.38.32 - 195.73.38.39 de -195.73.38.40 - 195.73.38.119 nl -195.73.38.120 - 195.73.38.127 de -195.73.38.128 - 195.73.38.143 nl -195.73.38.144 - 195.73.38.159 de -195.73.38.160 - 195.73.38.215 nl -195.73.38.216 - 195.73.38.223 de -195.73.38.224 - 195.73.38.239 nl -195.73.38.240 - 195.73.38.247 de -195.73.38.248 - 195.73.39.79 nl -195.73.39.80 - 195.73.39.87 de -195.73.39.88 - 195.73.39.151 nl -195.73.39.152 - 195.73.39.159 de -195.73.39.160 - 195.73.40.47 nl -195.73.40.48 - 195.73.40.55 de -195.73.40.56 - 195.73.40.71 nl -195.73.40.72 - 195.73.40.79 de -195.73.40.80 - 195.73.40.87 nl -195.73.40.88 - 195.73.40.95 de -195.73.40.96 - 195.73.40.103 nl -195.73.40.104 - 195.73.40.111 de -195.73.40.112 - 195.73.40.119 nl -195.73.40.120 - 195.73.40.135 de -195.73.40.136 - 195.73.40.159 nl -195.73.40.160 - 195.73.40.167 de -195.73.40.168 - 195.73.40.191 nl -195.73.40.192 - 195.73.40.199 de -195.73.40.200 - 195.73.40.215 nl -195.73.40.216 - 195.73.40.223 de -195.73.40.224 - 195.73.40.239 nl -195.73.40.240 - 195.73.40.247 de -195.73.40.248 - 195.73.41.31 nl -195.73.41.32 - 195.73.41.39 de -195.73.41.40 - 195.73.41.47 nl -195.73.41.48 - 195.73.41.55 de -195.73.41.56 - 195.73.41.63 nl -195.73.41.64 - 195.73.41.71 de -195.73.41.72 - 195.73.41.135 nl -195.73.41.136 - 195.73.41.143 de -195.73.41.144 - 195.73.41.223 nl -195.73.41.224 - 195.73.41.231 de -195.73.41.232 - 195.73.42.167 nl -195.73.42.168 - 195.73.42.175 de -195.73.42.176 - 195.73.43.23 nl -195.73.43.24 - 195.73.43.31 de -195.73.43.32 - 195.73.43.79 nl -195.73.43.80 - 195.73.43.87 de -195.73.43.88 - 195.73.43.143 nl -195.73.43.144 - 195.73.43.151 de -195.73.43.152 - 195.73.43.255 nl -195.73.44.0 - 195.73.44.7 de -195.73.44.8 - 195.73.44.143 nl -195.73.44.144 - 195.73.44.151 de -195.73.44.152 - 195.73.44.183 nl -195.73.44.184 - 195.73.44.191 de -195.73.44.192 - 195.73.44.255 nl -195.73.45.0 - 195.73.45.7 de -195.73.45.8 - 195.73.45.15 nl -195.73.45.16 - 195.73.45.23 de -195.73.45.24 - 195.73.45.63 nl -195.73.45.64 - 195.73.45.71 de -195.73.45.72 - 195.73.45.143 nl -195.73.45.144 - 195.73.45.167 de -195.73.45.168 - 195.73.45.175 nl -195.73.45.176 - 195.73.45.183 de -195.73.45.184 - 195.73.45.191 nl -195.73.45.192 - 195.73.45.199 de -195.73.45.200 - 195.73.46.15 nl -195.73.46.16 - 195.73.46.23 de -195.73.46.24 - 195.73.46.55 nl -195.73.46.56 - 195.73.46.63 de -195.73.46.64 - 195.73.46.119 nl -195.73.46.120 - 195.73.46.127 de -195.73.46.128 - 195.73.46.183 nl -195.73.46.184 - 195.73.46.191 de -195.73.46.192 - 195.73.47.15 nl -195.73.47.16 - 195.73.47.23 de -195.73.47.24 - 195.73.47.63 nl -195.73.47.64 - 195.73.47.71 de -195.73.47.72 - 195.73.47.79 nl -195.73.47.80 - 195.73.47.87 de -195.73.47.88 - 195.73.48.119 nl -195.73.48.120 - 195.73.48.127 de -195.73.48.128 - 195.73.48.151 nl -195.73.48.152 - 195.73.48.159 de -195.73.48.160 - 195.73.48.175 nl -195.73.48.176 - 195.73.48.183 de -195.73.48.184 - 195.73.49.7 nl -195.73.49.8 - 195.73.49.15 de -195.73.49.16 - 195.73.49.135 nl -195.73.49.136 - 195.73.49.143 de -195.73.49.144 - 195.73.50.47 nl -195.73.50.48 - 195.73.50.55 de -195.73.50.56 - 195.73.50.135 nl -195.73.50.136 - 195.73.50.143 de -195.73.50.144 - 195.73.50.159 nl -195.73.50.160 - 195.73.50.175 de -195.73.50.176 - 195.73.50.207 nl -195.73.50.208 - 195.73.50.215 de -195.73.50.216 - 195.73.51.23 nl -195.73.51.24 - 195.73.51.31 de -195.73.51.32 - 195.73.51.39 nl -195.73.51.40 - 195.73.51.47 de -195.73.51.48 - 195.73.51.111 nl -195.73.51.112 - 195.73.51.119 de -195.73.51.120 - 195.73.52.63 nl -195.73.52.64 - 195.73.52.79 de -195.73.52.80 - 195.73.52.87 nl -195.73.52.88 - 195.73.52.95 de -195.73.52.96 - 195.73.52.175 nl -195.73.52.176 - 195.73.52.183 de -195.73.52.184 - 195.73.53.15 nl -195.73.53.16 - 195.73.53.31 de -195.73.53.32 - 195.73.53.39 nl -195.73.53.40 - 195.73.53.63 de -195.73.53.64 - 195.73.53.71 nl -195.73.53.72 - 195.73.53.79 de -195.73.53.80 - 195.73.53.87 nl -195.73.53.88 - 195.73.53.95 de -195.73.53.96 - 195.73.53.151 nl -195.73.53.152 - 195.73.53.159 de -195.73.53.160 - 195.73.53.183 nl -195.73.53.184 - 195.73.53.191 de -195.73.53.192 - 195.73.53.247 nl -195.73.53.248 - 195.73.53.255 de -195.73.54.0 - 195.73.54.111 nl -195.73.54.112 - 195.73.54.119 de -195.73.54.120 - 195.73.54.191 nl -195.73.54.192 - 195.73.54.199 de -195.73.54.200 - 195.73.55.39 nl -195.73.55.40 - 195.73.55.55 de -195.73.55.56 - 195.73.55.71 nl -195.73.55.72 - 195.73.55.79 de -195.73.55.80 - 195.73.55.111 nl -195.73.55.112 - 195.73.55.119 de -195.73.55.120 - 195.73.55.215 nl -195.73.55.216 - 195.73.55.231 de -195.73.55.232 - 195.73.56.63 nl -195.73.56.64 - 195.73.56.71 de -195.73.56.72 - 195.73.56.79 nl -195.73.56.80 - 195.73.56.87 de -195.73.56.88 - 195.73.56.199 nl -195.73.56.200 - 195.73.56.207 de -195.73.56.208 - 195.73.57.7 nl -195.73.57.8 - 195.73.57.15 de -195.73.57.16 - 195.73.57.223 nl -195.73.57.224 - 195.73.57.231 de -195.73.57.232 - 195.73.58.39 nl -195.73.58.40 - 195.73.58.47 de -195.73.58.48 - 195.73.58.111 nl -195.73.58.112 - 195.73.58.119 de -195.73.58.120 - 195.73.58.183 nl -195.73.58.184 - 195.73.58.199 de -195.73.58.200 - 195.73.58.215 nl -195.73.58.216 - 195.73.58.223 de -195.73.58.224 - 195.73.58.255 nl -195.73.59.0 - 195.73.59.255 de -195.73.60.0 - 195.73.60.15 nl -195.73.60.16 - 195.73.60.23 de -195.73.60.24 - 195.73.60.39 nl -195.73.60.40 - 195.73.60.47 de -195.73.60.48 - 195.73.60.167 nl -195.73.60.168 - 195.73.60.175 de -195.73.60.176 - 195.73.60.191 nl -195.73.60.192 - 195.73.60.199 de -195.73.60.200 - 195.73.61.47 nl -195.73.61.48 - 195.73.61.63 de -195.73.61.64 - 195.73.61.71 nl -195.73.61.72 - 195.73.61.79 de -195.73.61.80 - 195.73.61.151 nl -195.73.61.152 - 195.73.61.159 de -195.73.61.160 - 195.73.62.55 nl -195.73.62.56 - 195.73.62.63 de -195.73.62.64 - 195.73.62.159 nl -195.73.62.160 - 195.73.62.167 de -195.73.62.168 - 195.73.62.175 nl -195.73.62.176 - 195.73.62.183 de -195.73.62.184 - 195.73.62.199 nl -195.73.62.200 - 195.73.62.207 de -195.73.62.208 - 195.73.62.223 nl -195.73.62.224 - 195.73.62.231 de -195.73.62.232 - 195.73.63.7 nl -195.73.63.8 - 195.73.63.15 de -195.73.63.16 - 195.73.63.39 nl -195.73.63.40 - 195.73.63.47 de -195.73.63.48 - 195.73.63.71 nl -195.73.63.72 - 195.73.63.79 de -195.73.63.80 - 195.73.63.127 nl -195.73.63.128 - 195.73.63.143 de -195.73.63.144 - 195.73.63.167 nl -195.73.63.168 - 195.73.63.175 de -195.73.63.176 - 195.73.64.23 nl -195.73.64.24 - 195.73.64.31 de -195.73.64.32 - 195.73.64.39 nl -195.73.64.40 - 195.73.64.47 de -195.73.64.48 - 195.73.64.151 nl -195.73.64.152 - 195.73.64.159 de -195.73.64.160 - 195.73.64.199 nl -195.73.64.200 - 195.73.64.215 de -195.73.64.216 - 195.73.65.15 nl -195.73.65.16 - 195.73.65.23 de -195.73.65.24 - 195.73.65.39 nl -195.73.65.40 - 195.73.65.47 de -195.73.65.48 - 195.73.65.223 nl -195.73.65.224 - 195.73.65.239 de -195.73.65.240 - 195.73.66.55 nl -195.73.66.56 - 195.73.66.63 de -195.73.66.64 - 195.73.66.71 nl -195.73.66.72 - 195.73.66.79 de -195.73.66.80 - 195.73.66.95 nl -195.73.66.96 - 195.73.66.103 de -195.73.66.104 - 195.73.66.135 nl -195.73.66.136 - 195.73.66.151 de -195.73.66.152 - 195.73.66.191 nl -195.73.66.192 - 195.73.66.199 de -195.73.66.200 - 195.73.67.71 nl -195.73.67.72 - 195.73.67.79 de -195.73.67.80 - 195.73.67.95 nl -195.73.67.96 - 195.73.67.103 de -195.73.67.104 - 195.73.67.191 nl -195.73.67.192 - 195.73.67.199 de -195.73.67.200 - 195.73.67.207 nl -195.73.67.208 - 195.73.67.215 de -195.73.67.216 - 195.73.67.231 nl -195.73.67.232 - 195.73.67.247 de -195.73.67.248 - 195.73.68.87 nl -195.73.68.88 - 195.73.68.103 de -195.73.68.104 - 195.73.68.119 nl -195.73.68.120 - 195.73.68.127 de -195.73.68.128 - 195.73.68.135 nl -195.73.68.136 - 195.73.68.151 de -195.73.68.152 - 195.73.68.247 nl -195.73.68.248 - 195.73.68.255 de -195.73.69.0 - 195.73.69.15 nl -195.73.69.16 - 195.73.69.23 de -195.73.69.24 - 195.73.69.39 nl -195.73.69.40 - 195.73.69.47 de -195.73.69.48 - 195.73.69.135 nl -195.73.69.136 - 195.73.69.143 de -195.73.69.144 - 195.73.69.223 nl -195.73.69.224 - 195.73.69.231 de -195.73.69.232 - 195.73.69.255 nl -195.73.70.0 - 195.73.70.7 de -195.73.70.8 - 195.73.70.215 nl -195.73.70.216 - 195.73.70.223 de -195.73.70.224 - 195.73.71.15 nl -195.73.71.16 - 195.73.71.23 de -195.73.71.24 - 195.73.71.87 nl -195.73.71.88 - 195.73.71.95 de -195.73.71.96 - 195.73.71.183 nl -195.73.71.184 - 195.73.71.191 de -195.73.71.192 - 195.73.72.23 nl -195.73.72.24 - 195.73.72.31 de -195.73.72.32 - 195.73.72.47 nl -195.73.72.48 - 195.73.72.55 de -195.73.72.56 - 195.73.72.71 nl -195.73.72.72 - 195.73.72.79 de -195.73.72.80 - 195.73.72.87 nl -195.73.72.88 - 195.73.72.95 de -195.73.72.96 - 195.73.72.103 nl -195.73.72.104 - 195.73.72.111 de -195.73.72.112 - 195.73.72.127 nl -195.73.72.128 - 195.73.72.135 de -195.73.72.136 - 195.73.72.159 nl -195.73.72.160 - 195.73.72.167 de -195.73.72.168 - 195.73.72.239 nl -195.73.72.240 - 195.73.72.247 de -195.73.72.248 - 195.73.73.71 nl -195.73.73.72 - 195.73.73.79 de -195.73.73.80 - 195.73.73.119 nl -195.73.73.120 - 195.73.73.127 de -195.73.73.128 - 195.73.73.151 nl -195.73.73.152 - 195.73.73.159 de -195.73.73.160 - 195.73.73.175 nl -195.73.73.176 - 195.73.73.183 de -195.73.73.184 - 195.73.73.239 nl -195.73.73.240 - 195.73.73.247 de -195.73.73.248 - 195.73.74.7 nl -195.73.74.8 - 195.73.74.15 de -195.73.74.16 - 195.73.74.31 nl -195.73.74.32 - 195.73.74.47 de -195.73.74.48 - 195.73.74.79 nl -195.73.74.80 - 195.73.74.87 de -195.73.74.88 - 195.73.74.135 nl -195.73.74.136 - 195.73.74.143 de -195.73.74.144 - 195.73.74.159 nl -195.73.74.160 - 195.73.74.167 de -195.73.74.168 - 195.73.74.183 nl -195.73.74.184 - 195.73.74.191 de -195.73.74.192 - 195.73.74.207 nl -195.73.74.208 - 195.73.74.215 de -195.73.74.216 - 195.73.75.47 nl -195.73.75.48 - 195.73.75.55 de -195.73.75.56 - 195.73.75.71 nl -195.73.75.72 - 195.73.75.79 de -195.73.75.80 - 195.73.75.111 nl -195.73.75.112 - 195.73.75.119 de -195.73.75.120 - 195.73.75.135 nl -195.73.75.136 - 195.73.75.143 de -195.73.75.144 - 195.73.75.167 nl -195.73.75.168 - 195.73.75.175 de -195.73.75.176 - 195.73.75.239 nl -195.73.75.240 - 195.73.75.255 de -195.73.76.0 - 195.73.76.39 nl -195.73.76.40 - 195.73.76.47 de -195.73.76.48 - 195.73.76.143 nl -195.73.76.144 - 195.73.76.159 de -195.73.76.160 - 195.73.77.39 nl -195.73.77.40 - 195.73.77.47 de -195.73.77.48 - 195.73.77.55 nl -195.73.77.56 - 195.73.77.63 de -195.73.77.64 - 195.73.77.103 nl -195.73.77.104 - 195.73.77.111 de -195.73.77.112 - 195.73.78.23 nl -195.73.78.24 - 195.73.78.31 de -195.73.78.32 - 195.73.78.39 nl -195.73.78.40 - 195.73.78.55 de -195.73.78.56 - 195.73.78.87 nl -195.73.78.88 - 195.73.78.95 de -195.73.78.96 - 195.73.78.127 nl -195.73.78.128 - 195.73.78.135 de -195.73.78.136 - 195.73.78.167 nl -195.73.78.168 - 195.73.78.175 de -195.73.78.176 - 195.73.78.183 nl -195.73.78.184 - 195.73.78.191 de -195.73.78.192 - 195.73.79.47 nl -195.73.79.48 - 195.73.79.55 de -195.73.79.56 - 195.73.79.127 nl -195.73.79.128 - 195.73.79.135 de -195.73.79.136 - 195.73.79.183 nl -195.73.79.184 - 195.73.79.191 de -195.73.79.192 - 195.73.79.207 nl -195.73.79.208 - 195.73.79.215 de -195.73.79.216 - 195.73.80.23 nl -195.73.80.24 - 195.73.80.39 de -195.73.80.40 - 195.73.81.63 nl -195.73.81.64 - 195.73.81.71 de -195.73.81.72 - 195.73.81.87 nl -195.73.81.88 - 195.73.81.95 de -195.73.81.96 - 195.73.81.159 nl -195.73.81.160 - 195.73.81.167 de -195.73.81.168 - 195.73.82.71 nl -195.73.82.72 - 195.73.82.79 de -195.73.82.80 - 195.73.83.103 nl -195.73.83.104 - 195.73.83.111 de -195.73.83.112 - 195.73.83.199 nl -195.73.83.200 - 195.73.83.207 de -195.73.83.208 - 195.73.84.7 nl -195.73.84.8 - 195.73.84.15 de -195.73.84.16 - 195.73.84.23 nl -195.73.84.24 - 195.73.84.31 de -195.73.84.32 - 195.73.84.39 nl -195.73.84.40 - 195.73.84.47 de -195.73.84.48 - 195.73.84.215 nl -195.73.84.216 - 195.73.84.223 de -195.73.84.224 - 195.73.84.231 nl -195.73.84.232 - 195.73.84.239 de -195.73.84.240 - 195.73.85.39 nl -195.73.85.40 - 195.73.85.47 de -195.73.85.48 - 195.73.85.63 nl -195.73.85.64 - 195.73.85.71 de -195.73.85.72 - 195.73.85.215 nl -195.73.85.216 - 195.73.85.223 de -195.73.85.224 - 195.73.86.31 nl -195.73.86.32 - 195.73.86.39 de -195.73.86.40 - 195.73.86.71 nl -195.73.86.72 - 195.73.86.79 de -195.73.86.80 - 195.73.86.111 nl -195.73.86.112 - 195.73.86.119 de -195.73.86.120 - 195.73.86.239 nl -195.73.86.240 - 195.73.86.247 de -195.73.86.248 - 195.73.87.63 nl -195.73.87.64 - 195.73.87.71 de -195.73.87.72 - 195.73.87.87 nl -195.73.87.88 - 195.73.87.95 de -195.73.87.96 - 195.73.87.103 nl -195.73.87.104 - 195.73.87.111 de -195.73.87.112 - 195.73.87.135 nl -195.73.87.136 - 195.73.87.159 de -195.73.87.160 - 195.73.87.183 nl -195.73.87.184 - 195.73.87.191 de -195.73.87.192 - 195.73.88.47 nl -195.73.88.48 - 195.73.88.55 de -195.73.88.56 - 195.73.88.79 nl -195.73.88.80 - 195.73.88.87 de -195.73.88.88 - 195.73.88.175 nl -195.73.88.176 - 195.73.88.191 de -195.73.88.192 - 195.73.88.199 nl -195.73.88.200 - 195.73.88.215 de -195.73.88.216 - 195.73.89.151 nl -195.73.89.152 - 195.73.89.159 de -195.73.89.160 - 195.73.90.7 nl -195.73.90.8 - 195.73.90.15 de -195.73.90.16 - 195.73.90.23 nl -195.73.90.24 - 195.73.90.31 de -195.73.90.32 - 195.73.90.95 nl -195.73.90.96 - 195.73.90.103 de -195.73.90.104 - 195.73.90.143 nl -195.73.90.144 - 195.73.90.151 de -195.73.90.152 - 195.73.90.255 nl -195.73.91.0 - 195.73.91.7 de -195.73.91.8 - 195.73.91.95 nl -195.73.91.96 - 195.73.91.111 de -195.73.91.112 - 195.73.92.7 nl -195.73.92.8 - 195.73.92.15 de -195.73.92.16 - 195.73.92.55 nl -195.73.92.56 - 195.73.92.63 de -195.73.92.64 - 195.73.92.135 nl -195.73.92.136 - 195.73.92.143 de -195.73.92.144 - 195.73.92.159 nl -195.73.92.160 - 195.73.92.167 de -195.73.92.168 - 195.73.92.191 nl -195.73.92.192 - 195.73.92.207 de -195.73.92.208 - 195.73.93.159 nl -195.73.93.160 - 195.73.93.167 de -195.73.93.168 - 195.73.93.191 nl -195.73.93.192 - 195.73.93.199 de -195.73.93.200 - 195.73.93.247 nl -195.73.93.248 - 195.73.93.255 de -195.73.94.0 - 195.73.94.15 nl -195.73.94.16 - 195.73.94.23 de -195.73.94.24 - 195.73.94.63 nl -195.73.94.64 - 195.73.94.79 de -195.73.94.80 - 195.73.94.103 nl -195.73.94.104 - 195.73.94.111 de -195.73.94.112 - 195.73.94.183 nl -195.73.94.184 - 195.73.94.207 de -195.73.94.208 - 195.73.94.231 nl -195.73.94.232 - 195.73.94.239 de -195.73.94.240 - 195.73.95.55 nl -195.73.95.56 - 195.73.95.63 de -195.73.95.64 - 195.73.95.79 nl -195.73.95.80 - 195.73.95.87 de -195.73.95.88 - 195.73.95.175 nl -195.73.95.176 - 195.73.95.183 de -195.73.95.184 - 195.73.96.175 nl -195.73.96.176 - 195.73.96.183 de -195.73.96.184 - 195.73.96.215 nl -195.73.96.216 - 195.73.96.223 de -195.73.96.224 - 195.73.96.231 nl -195.73.96.232 - 195.73.96.239 de -195.73.96.240 - 195.73.97.39 nl -195.73.97.40 - 195.73.97.47 de -195.73.97.48 - 195.73.97.63 nl -195.73.97.64 - 195.73.97.71 de -195.73.97.72 - 195.73.97.175 nl -195.73.97.176 - 195.73.97.183 de -195.73.97.184 - 195.73.97.239 nl -195.73.97.240 - 195.73.97.255 de -195.73.98.0 - 195.73.98.119 nl -195.73.98.120 - 195.73.98.135 de -195.73.98.136 - 195.73.98.255 nl -195.73.99.0 - 195.73.99.7 de -195.73.99.8 - 195.73.99.47 nl -195.73.99.48 - 195.73.99.55 de -195.73.99.56 - 195.73.99.87 nl -195.73.99.88 - 195.73.99.103 de -195.73.99.104 - 195.73.99.135 nl -195.73.99.136 - 195.73.99.143 de -195.73.99.144 - 195.73.99.159 nl -195.73.99.160 - 195.73.99.175 de -195.73.99.176 - 195.73.99.183 nl -195.73.99.184 - 195.73.99.191 de -195.73.99.192 - 195.73.100.7 nl -195.73.100.8 - 195.73.100.15 de -195.73.100.16 - 195.73.100.39 nl -195.73.100.40 - 195.73.100.47 de -195.73.100.48 - 195.73.100.71 nl -195.73.100.72 - 195.73.100.79 de -195.73.100.80 - 195.73.100.215 nl -195.73.100.216 - 195.73.100.223 de -195.73.100.224 - 195.73.100.231 nl -195.73.100.232 - 195.73.100.239 de -195.73.100.240 - 195.73.101.15 nl -195.73.101.16 - 195.73.101.23 de -195.73.101.24 - 195.73.101.55 nl -195.73.101.56 - 195.73.101.71 de -195.73.101.72 - 195.73.101.167 nl -195.73.101.168 - 195.73.101.175 de -195.73.101.176 - 195.73.102.95 nl -195.73.102.96 - 195.73.102.103 de -195.73.102.104 - 195.73.102.247 nl -195.73.102.248 - 195.73.102.255 de -195.73.103.0 - 195.73.103.7 nl -195.73.103.8 - 195.73.103.15 de -195.73.103.16 - 195.73.103.63 nl -195.73.103.64 - 195.73.103.71 de -195.73.103.72 - 195.73.103.95 nl -195.73.103.96 - 195.73.103.103 de -195.73.103.104 - 195.73.103.127 nl -195.73.103.128 - 195.73.103.135 de -195.73.103.136 - 195.73.103.167 nl -195.73.103.168 - 195.73.103.175 de -195.73.103.176 - 195.73.103.239 nl -195.73.103.240 - 195.73.103.247 de -195.73.103.248 - 195.73.104.207 nl -195.73.104.208 - 195.73.104.215 de -195.73.104.216 - 195.73.104.231 nl -195.73.104.232 - 195.73.104.239 de -195.73.104.240 - 195.73.105.63 nl -195.73.105.64 - 195.73.105.71 de -195.73.105.72 - 195.73.105.143 nl -195.73.105.144 - 195.73.105.151 de -195.73.105.152 - 195.73.105.215 nl -195.73.105.216 - 195.73.105.223 de -195.73.105.224 - 195.73.106.47 nl -195.73.106.48 - 195.73.106.55 de -195.73.106.56 - 195.73.106.143 nl -195.73.106.144 - 195.73.106.151 de -195.73.106.152 - 195.73.106.231 nl -195.73.106.232 - 195.73.106.239 de -195.73.106.240 - 195.73.106.247 nl -195.73.106.248 - 195.73.106.255 de -195.73.107.0 - 195.73.107.15 nl -195.73.107.16 - 195.73.107.23 de -195.73.107.24 - 195.73.107.63 nl -195.73.107.64 - 195.73.107.71 de -195.73.107.72 - 195.73.107.87 nl -195.73.107.88 - 195.73.107.95 de -195.73.107.96 - 195.73.107.111 nl -195.73.107.112 - 195.73.107.119 de -195.73.107.120 - 195.73.107.175 nl -195.73.107.176 - 195.73.107.183 de -195.73.107.184 - 195.73.107.231 nl -195.73.107.232 - 195.73.107.239 de -195.73.107.240 - 195.73.108.135 nl -195.73.108.136 - 195.73.108.151 de -195.73.108.152 - 195.73.108.183 nl -195.73.108.184 - 195.73.108.191 de -195.73.108.192 - 195.73.109.15 nl -195.73.109.16 - 195.73.109.31 de -195.73.109.32 - 195.73.109.111 nl -195.73.109.112 - 195.73.109.119 de -195.73.109.120 - 195.73.110.23 nl -195.73.110.24 - 195.73.110.31 de -195.73.110.32 - 195.73.110.119 nl -195.73.110.120 - 195.73.110.135 de -195.73.110.136 - 195.73.110.143 nl -195.73.110.144 - 195.73.110.151 de -195.73.110.152 - 195.73.110.191 nl -195.73.110.192 - 195.73.110.199 de -195.73.110.200 - 195.73.110.215 nl -195.73.110.216 - 195.73.110.223 de -195.73.110.224 - 195.73.110.231 nl -195.73.110.232 - 195.73.110.239 de -195.73.110.240 - 195.73.111.39 nl -195.73.111.40 - 195.73.111.47 de -195.73.111.48 - 195.73.111.71 nl -195.73.111.72 - 195.73.111.79 de -195.73.111.80 - 195.73.111.87 nl -195.73.111.88 - 195.73.111.95 de -195.73.111.96 - 195.73.111.191 nl -195.73.111.192 - 195.73.111.199 de -195.73.111.200 - 195.73.111.207 nl -195.73.111.208 - 195.73.111.215 de -195.73.111.216 - 195.73.111.255 nl -195.73.112.0 - 195.73.112.7 de -195.73.112.8 - 195.73.112.79 nl -195.73.112.80 - 195.73.112.95 de -195.73.112.96 - 195.73.112.143 nl -195.73.112.144 - 195.73.112.151 de -195.73.112.152 - 195.73.112.199 nl -195.73.112.200 - 195.73.112.223 de -195.73.112.224 - 195.73.113.7 nl -195.73.113.8 - 195.73.113.15 de -195.73.113.16 - 195.73.113.159 nl -195.73.113.160 - 195.73.113.167 de -195.73.113.168 - 195.73.113.199 nl -195.73.113.200 - 195.73.113.207 de -195.73.113.208 - 195.73.114.119 nl -195.73.114.120 - 195.73.114.135 de -195.73.114.136 - 195.73.114.167 nl -195.73.114.168 - 195.73.114.175 de -195.73.114.176 - 195.73.115.143 nl -195.73.115.144 - 195.73.115.151 de -195.73.115.152 - 195.73.115.231 nl -195.73.115.232 - 195.73.115.239 de -195.73.115.240 - 195.73.116.15 nl -195.73.116.16 - 195.73.116.23 de -195.73.116.24 - 195.73.116.55 nl -195.73.116.56 - 195.73.116.63 de -195.73.116.64 - 195.73.116.95 nl -195.73.116.96 - 195.73.116.111 de -195.73.116.112 - 195.73.116.223 nl -195.73.116.224 - 195.73.116.231 de -195.73.116.232 - 195.73.117.39 nl -195.73.117.40 - 195.73.117.47 de -195.73.117.48 - 195.73.117.55 nl -195.73.117.56 - 195.73.117.71 de -195.73.117.72 - 195.73.117.127 nl -195.73.117.128 - 195.73.117.135 de -195.73.117.136 - 195.73.117.143 nl -195.73.117.144 - 195.73.117.151 de -195.73.117.152 - 195.73.117.167 nl -195.73.117.168 - 195.73.117.175 de -195.73.117.176 - 195.73.117.207 nl -195.73.117.208 - 195.73.117.215 de -195.73.117.216 - 195.73.117.231 nl -195.73.117.232 - 195.73.117.239 de -195.73.117.240 - 195.73.117.255 nl -195.73.118.0 - 195.73.118.7 de -195.73.118.8 - 195.73.118.55 nl -195.73.118.56 - 195.73.118.71 de -195.73.118.72 - 195.73.119.15 nl -195.73.119.16 - 195.73.119.23 de -195.73.119.24 - 195.73.119.103 nl -195.73.119.104 - 195.73.119.111 de -195.73.119.112 - 195.73.119.119 nl -195.73.119.120 - 195.73.119.127 de -195.73.119.128 - 195.73.119.151 nl -195.73.119.152 - 195.73.119.159 de -195.73.119.160 - 195.73.119.167 nl -195.73.119.168 - 195.73.119.175 de -195.73.119.176 - 195.73.119.191 nl -195.73.119.192 - 195.73.119.199 de -195.73.119.200 - 195.73.119.239 nl -195.73.119.240 - 195.73.119.247 de -195.73.119.248 - 195.73.120.55 nl -195.73.120.56 - 195.73.120.63 de -195.73.120.64 - 195.73.120.127 nl -195.73.120.128 - 195.73.120.143 de -195.73.120.144 - 195.73.120.167 nl -195.73.120.168 - 195.73.120.175 de -195.73.120.176 - 195.73.121.79 nl -195.73.121.80 - 195.73.121.87 de -195.73.121.88 - 195.73.121.119 nl -195.73.121.120 - 195.73.121.127 de -195.73.121.128 - 195.73.122.199 nl -195.73.122.200 - 195.73.122.207 de -195.73.122.208 - 195.73.123.71 nl -195.73.123.72 - 195.73.123.79 de -195.73.123.80 - 195.73.123.175 nl -195.73.123.176 - 195.73.123.183 de -195.73.123.184 - 195.73.123.207 nl -195.73.123.208 - 195.73.123.215 de -195.73.123.216 - 195.73.124.23 nl -195.73.124.24 - 195.73.124.31 de -195.73.124.32 - 195.73.124.47 nl -195.73.124.48 - 195.73.124.55 de -195.73.124.56 - 195.73.124.71 nl -195.73.124.72 - 195.73.124.79 de -195.73.124.80 - 195.73.124.127 nl -195.73.124.128 - 195.73.124.135 de -195.73.124.136 - 195.73.124.175 nl -195.73.124.176 - 195.73.124.183 de -195.73.124.184 - 195.73.124.215 nl -195.73.124.216 - 195.73.124.223 de -195.73.124.224 - 195.73.124.231 nl -195.73.124.232 - 195.73.124.239 de -195.73.124.240 - 195.73.125.95 nl -195.73.125.96 - 195.73.125.103 de -195.73.125.104 - 195.73.125.183 nl -195.73.125.184 - 195.73.125.191 de -195.73.125.192 - 195.73.125.199 nl -195.73.125.200 - 195.73.125.207 de -195.73.125.208 - 195.73.126.15 nl -195.73.126.16 - 195.73.126.23 de -195.73.126.24 - 195.73.126.47 nl -195.73.126.48 - 195.73.126.55 de -195.73.126.56 - 195.73.126.223 nl -195.73.126.224 - 195.73.126.231 de -195.73.126.232 - 195.73.126.247 nl -195.73.126.248 - 195.73.126.255 de -195.73.127.0 - 195.73.127.103 nl -195.73.127.104 - 195.73.127.111 de -195.73.127.112 - 195.73.127.151 nl -195.73.127.152 - 195.73.127.159 de -195.73.127.160 - 195.73.127.167 nl -195.73.127.168 - 195.73.127.183 de -195.73.127.184 - 195.73.128.47 nl -195.73.128.48 - 195.73.128.55 de -195.73.128.56 - 195.73.128.127 nl -195.73.128.128 - 195.73.128.135 de -195.73.128.136 - 195.73.128.143 nl -195.73.128.144 - 195.73.128.151 de -195.73.128.152 - 195.73.129.55 nl -195.73.129.56 - 195.73.129.63 de -195.73.129.64 - 195.73.129.127 nl -195.73.129.128 - 195.73.129.135 de -195.73.129.136 - 195.73.129.167 nl -195.73.129.168 - 195.73.129.175 de -195.73.129.176 - 195.73.129.207 nl -195.73.129.208 - 195.73.129.215 de -195.73.129.216 - 195.73.129.255 nl -195.73.130.0 - 195.73.130.7 de -195.73.130.8 - 195.73.130.47 nl -195.73.130.48 - 195.73.130.55 de -195.73.130.56 - 195.73.130.151 nl -195.73.130.152 - 195.73.130.159 de -195.73.130.160 - 195.73.130.175 nl -195.73.130.176 - 195.73.130.183 de -195.73.130.184 - 195.73.130.199 nl -195.73.130.200 - 195.73.130.207 de -195.73.130.208 - 195.73.130.223 nl -195.73.130.224 - 195.73.130.239 de -195.73.130.240 - 195.73.130.247 nl -195.73.130.248 - 195.73.130.255 de -195.73.131.0 - 195.73.131.23 nl -195.73.131.24 - 195.73.131.31 de -195.73.131.32 - 195.73.131.39 nl -195.73.131.40 - 195.73.131.47 de -195.73.131.48 - 195.73.131.215 nl -195.73.131.216 - 195.73.131.223 de -195.73.131.224 - 195.73.132.63 nl -195.73.132.64 - 195.73.132.79 de -195.73.132.80 - 195.73.132.143 nl -195.73.132.144 - 195.73.132.151 de -195.73.132.152 - 195.73.132.183 nl -195.73.132.184 - 195.73.132.191 de -195.73.132.192 - 195.73.133.39 nl -195.73.133.40 - 195.73.133.63 de -195.73.133.64 - 195.73.133.127 nl -195.73.133.128 - 195.73.133.143 de -195.73.133.144 - 195.73.134.55 nl -195.73.134.56 - 195.73.134.63 de -195.73.134.64 - 195.73.134.127 nl -195.73.134.128 - 195.73.134.135 de -195.73.134.136 - 195.73.134.175 nl -195.73.134.176 - 195.73.134.183 de -195.73.134.184 - 195.73.134.231 nl -195.73.134.232 - 195.73.134.239 de -195.73.134.240 - 195.73.135.103 nl -195.73.135.104 - 195.73.135.111 de -195.73.135.112 - 195.73.135.207 nl -195.73.135.208 - 195.73.135.215 de -195.73.135.216 - 195.73.135.247 nl -195.73.135.248 - 195.73.135.255 de -195.73.136.0 - 195.73.136.31 nl -195.73.136.32 - 195.73.136.39 de -195.73.136.40 - 195.73.136.79 nl -195.73.136.80 - 195.73.136.87 de -195.73.136.88 - 195.73.136.127 nl -195.73.136.128 - 195.73.136.135 de -195.73.136.136 - 195.73.136.247 nl -195.73.136.248 - 195.73.136.255 de -195.73.137.0 - 195.73.137.39 nl -195.73.137.40 - 195.73.137.47 de -195.73.137.48 - 195.73.137.55 nl -195.73.137.56 - 195.73.137.63 de -195.73.137.64 - 195.73.137.151 nl -195.73.137.152 - 195.73.137.159 de -195.73.137.160 - 195.73.137.183 nl -195.73.137.184 - 195.73.137.191 de -195.73.137.192 - 195.73.138.23 nl -195.73.138.24 - 195.73.138.31 de -195.73.138.32 - 195.73.138.103 nl -195.73.138.104 - 195.73.138.111 de -195.73.138.112 - 195.73.138.191 nl -195.73.138.192 - 195.73.138.199 de -195.73.138.200 - 195.73.139.39 nl -195.73.139.40 - 195.73.139.47 de -195.73.139.48 - 195.73.139.95 nl -195.73.139.96 - 195.73.139.103 de -195.73.139.104 - 195.73.139.199 nl -195.73.139.200 - 195.73.139.207 de -195.73.139.208 - 195.73.139.255 nl -195.73.140.0 - 195.73.140.7 de -195.73.140.8 - 195.73.140.247 nl -195.73.140.248 - 195.73.141.7 de -195.73.141.8 - 195.73.141.15 nl -195.73.141.16 - 195.73.141.23 de -195.73.141.24 - 195.73.141.63 nl -195.73.141.64 - 195.73.141.71 de -195.73.141.72 - 195.73.141.103 nl -195.73.141.104 - 195.73.141.111 de -195.73.141.112 - 195.73.142.31 nl -195.73.142.32 - 195.73.142.39 de -195.73.142.40 - 195.73.142.87 nl -195.73.142.88 - 195.73.142.95 de -195.73.142.96 - 195.73.142.207 nl -195.73.142.208 - 195.73.142.215 de -195.73.142.216 - 195.73.142.231 nl -195.73.142.232 - 195.73.142.247 de -195.73.142.248 - 195.73.143.31 nl -195.73.143.32 - 195.73.143.39 de -195.73.143.40 - 195.73.143.127 nl -195.73.143.128 - 195.73.143.135 de -195.73.143.136 - 195.73.143.207 nl -195.73.143.208 - 195.73.143.215 de -195.73.143.216 - 195.73.143.247 nl -195.73.143.248 - 195.73.143.255 de -195.73.144.0 - 195.73.144.31 nl -195.73.144.32 - 195.73.144.39 de -195.73.144.40 - 195.73.144.119 nl -195.73.144.120 - 195.73.144.127 de -195.73.144.128 - 195.73.144.199 nl -195.73.144.200 - 195.73.144.207 de -195.73.144.208 - 195.73.144.239 nl -195.73.144.240 - 195.73.144.247 de -195.73.144.248 - 195.73.145.199 nl -195.73.145.200 - 195.73.145.223 de -195.73.145.224 - 195.73.145.239 nl -195.73.145.240 - 195.73.145.247 de -195.73.145.248 - 195.73.146.7 nl -195.73.146.8 - 195.73.146.15 de -195.73.146.16 - 195.73.146.111 nl -195.73.146.112 - 195.73.146.119 de -195.73.146.120 - 195.73.146.215 nl -195.73.146.216 - 195.73.146.223 de -195.73.146.224 - 195.73.146.247 nl -195.73.146.248 - 195.73.146.255 de -195.73.147.0 - 195.73.147.31 nl -195.73.147.32 - 195.73.147.39 de -195.73.147.40 - 195.73.147.55 nl -195.73.147.56 - 195.73.147.63 de -195.73.147.64 - 195.73.147.71 nl -195.73.147.72 - 195.73.147.79 de -195.73.147.80 - 195.73.147.103 nl -195.73.147.104 - 195.73.147.111 de -195.73.147.112 - 195.73.147.167 nl -195.73.147.168 - 195.73.147.175 de -195.73.147.176 - 195.73.147.191 nl -195.73.147.192 - 195.73.147.199 de -195.73.147.200 - 195.73.148.31 nl -195.73.148.32 - 195.73.148.39 de -195.73.148.40 - 195.73.148.79 nl -195.73.148.80 - 195.73.148.87 de -195.73.148.88 - 195.73.148.143 nl -195.73.148.144 - 195.73.148.151 de -195.73.148.152 - 195.73.148.159 nl -195.73.148.160 - 195.73.148.167 de -195.73.148.168 - 195.73.149.71 nl -195.73.149.72 - 195.73.149.79 de -195.73.149.80 - 195.73.149.111 nl -195.73.149.112 - 195.73.149.119 de -195.73.149.120 - 195.73.149.191 nl -195.73.149.192 - 195.73.149.199 de -195.73.149.200 - 195.73.149.215 nl -195.73.149.216 - 195.73.149.223 de -195.73.149.224 - 195.73.150.55 nl -195.73.150.56 - 195.73.150.63 de -195.73.150.64 - 195.73.150.79 nl -195.73.150.80 - 195.73.150.87 de -195.73.150.88 - 195.73.150.119 nl -195.73.150.120 - 195.73.150.127 de -195.73.150.128 - 195.73.150.167 nl -195.73.150.168 - 195.73.150.175 de -195.73.150.176 - 195.73.151.39 nl -195.73.151.40 - 195.73.151.47 de -195.73.151.48 - 195.73.151.55 nl -195.73.151.56 - 195.73.151.63 de -195.73.151.64 - 195.73.151.119 nl -195.73.151.120 - 195.73.151.127 de -195.73.151.128 - 195.73.152.39 nl -195.73.152.40 - 195.73.152.55 de -195.73.152.56 - 195.73.152.135 nl -195.73.152.136 - 195.73.152.143 de -195.73.152.144 - 195.73.152.191 nl -195.73.152.192 - 195.73.152.199 de -195.73.152.200 - 195.73.153.55 nl -195.73.153.56 - 195.73.153.63 de -195.73.153.64 - 195.73.154.15 nl -195.73.154.16 - 195.73.154.23 de -195.73.154.24 - 195.73.154.207 nl -195.73.154.208 - 195.73.154.215 de -195.73.154.216 - 195.73.154.247 nl -195.73.154.248 - 195.73.154.255 de -195.73.155.0 - 195.73.155.175 nl -195.73.155.176 - 195.73.155.183 de -195.73.155.184 - 195.73.155.199 nl -195.73.155.200 - 195.73.155.207 de -195.73.155.208 - 195.73.155.239 nl -195.73.155.240 - 195.73.155.247 de -195.73.155.248 - 195.73.156.63 nl -195.73.156.64 - 195.73.156.79 de -195.73.156.80 - 195.73.156.95 nl -195.73.156.96 - 195.73.156.103 de -195.73.156.104 - 195.73.156.111 nl -195.73.156.112 - 195.73.156.119 de -195.73.156.120 - 195.73.156.127 nl -195.73.156.128 - 195.73.156.135 de -195.73.156.136 - 195.73.156.143 nl -195.73.156.144 - 195.73.156.151 de -195.73.156.152 - 195.73.156.175 nl -195.73.156.176 - 195.73.156.183 de -195.73.156.184 - 195.73.156.231 nl -195.73.156.232 - 195.73.156.247 de -195.73.156.248 - 195.73.157.143 nl -195.73.157.144 - 195.73.157.159 de -195.73.157.160 - 195.73.157.167 nl -195.73.157.168 - 195.73.157.175 de -195.73.157.176 - 195.73.157.231 nl -195.73.157.232 - 195.73.157.239 de -195.73.157.240 - 195.73.158.79 nl -195.73.158.80 - 195.73.158.87 de -195.73.158.88 - 195.73.159.15 nl -195.73.159.16 - 195.73.159.23 de -195.73.159.24 - 195.73.159.103 nl -195.73.159.104 - 195.73.159.111 de -195.73.159.112 - 195.73.159.151 nl -195.73.159.152 - 195.73.159.159 de -195.73.159.160 - 195.73.159.167 nl -195.73.159.168 - 195.73.159.183 de -195.73.159.184 - 195.73.159.223 nl -195.73.159.224 - 195.73.159.231 de -195.73.159.232 - 195.73.160.79 nl -195.73.160.80 - 195.73.160.87 de -195.73.160.88 - 195.73.160.175 nl -195.73.160.176 - 195.73.160.191 de -195.73.160.192 - 195.73.161.31 nl -195.73.161.32 - 195.73.161.47 de -195.73.161.48 - 195.73.161.111 nl -195.73.161.112 - 195.73.161.119 de -195.73.161.120 - 195.73.161.199 nl -195.73.161.200 - 195.73.161.207 de -195.73.161.208 - 195.73.161.247 nl -195.73.161.248 - 195.73.161.255 de -195.73.162.0 - 195.73.162.143 nl -195.73.162.144 - 195.73.162.151 de -195.73.162.152 - 195.73.162.167 nl -195.73.162.168 - 195.73.162.175 de -195.73.162.176 - 195.73.163.63 nl -195.73.163.64 - 195.73.163.71 de -195.73.163.72 - 195.73.163.87 nl -195.73.163.88 - 195.73.163.95 de -195.73.163.96 - 195.73.163.103 nl -195.73.163.104 - 195.73.163.111 de -195.73.163.112 - 195.73.163.119 nl -195.73.163.120 - 195.73.163.135 de -195.73.163.136 - 195.73.163.143 nl -195.73.163.144 - 195.73.163.151 de -195.73.163.152 - 195.73.163.231 nl -195.73.163.232 - 195.73.163.239 de -195.73.163.240 - 195.73.164.15 nl -195.73.164.16 - 195.73.164.23 de -195.73.164.24 - 195.73.164.79 nl -195.73.164.80 - 195.73.164.95 de -195.73.164.96 - 195.73.164.127 nl -195.73.164.128 - 195.73.164.135 de -195.73.164.136 - 195.73.164.247 nl -195.73.164.248 - 195.73.164.255 de -195.73.165.0 - 195.73.165.39 nl -195.73.165.40 - 195.73.165.71 de -195.73.165.72 - 195.73.165.127 nl -195.73.165.128 - 195.73.165.135 de -195.73.165.136 - 195.73.165.183 nl -195.73.165.184 - 195.73.165.199 de -195.73.165.200 - 195.73.165.215 nl -195.73.165.216 - 195.73.165.223 de -195.73.165.224 - 195.73.166.39 nl -195.73.166.40 - 195.73.166.47 de -195.73.166.48 - 195.73.166.143 nl -195.73.166.144 - 195.73.166.151 de -195.73.166.152 - 195.73.167.63 nl -195.73.167.64 - 195.73.167.71 de -195.73.167.72 - 195.73.167.111 nl -195.73.167.112 - 195.73.167.119 de -195.73.167.120 - 195.73.167.199 nl -195.73.167.200 - 195.73.167.207 de -195.73.167.208 - 195.73.168.7 nl -195.73.168.8 - 195.73.168.15 de -195.73.168.16 - 195.73.168.23 nl -195.73.168.24 - 195.73.168.31 de -195.73.168.32 - 195.73.168.79 nl -195.73.168.80 - 195.73.168.87 de -195.73.168.88 - 195.73.168.111 nl -195.73.168.112 - 195.73.168.119 de -195.73.168.120 - 195.73.168.127 nl -195.73.168.128 - 195.73.168.135 de -195.73.168.136 - 195.73.168.143 nl -195.73.168.144 - 195.73.168.151 de -195.73.168.152 - 195.73.168.159 nl -195.73.168.160 - 195.73.168.167 de -195.73.168.168 - 195.73.168.183 nl -195.73.168.184 - 195.73.168.191 de -195.73.168.192 - 195.73.169.39 nl -195.73.169.40 - 195.73.169.47 de -195.73.169.48 - 195.73.169.55 nl -195.73.169.56 - 195.73.169.63 de -195.73.169.64 - 195.73.169.135 nl -195.73.169.136 - 195.73.169.143 de -195.73.169.144 - 195.73.169.215 nl -195.73.169.216 - 195.73.169.223 de -195.73.169.224 - 195.73.170.55 nl -195.73.170.56 - 195.73.170.71 de -195.73.170.72 - 195.73.170.111 nl -195.73.170.112 - 195.73.170.119 de -195.73.170.120 - 195.73.170.127 nl -195.73.170.128 - 195.73.170.135 de -195.73.170.136 - 195.73.171.7 nl -195.73.171.8 - 195.73.171.15 de -195.73.171.16 - 195.73.171.23 nl -195.73.171.24 - 195.73.171.31 de -195.73.171.32 - 195.73.171.55 nl -195.73.171.56 - 195.73.171.63 de -195.73.171.64 - 195.73.171.87 nl -195.73.171.88 - 195.73.171.95 de -195.73.171.96 - 195.73.171.111 nl -195.73.171.112 - 195.73.171.119 de -195.73.171.120 - 195.73.171.151 nl -195.73.171.152 - 195.73.171.159 de -195.73.171.160 - 195.73.171.167 nl -195.73.171.168 - 195.73.171.175 de -195.73.171.176 - 195.73.171.191 nl -195.73.171.192 - 195.73.171.199 de -195.73.171.200 - 195.73.171.223 nl -195.73.171.224 - 195.73.171.231 de -195.73.171.232 - 195.73.172.15 nl -195.73.172.16 - 195.73.172.23 de -195.73.172.24 - 195.73.172.103 nl -195.73.172.104 - 195.73.172.119 de -195.73.172.120 - 195.73.173.39 nl -195.73.173.40 - 195.73.173.47 de -195.73.173.48 - 195.73.173.143 nl -195.73.173.144 - 195.73.173.151 de -195.73.173.152 - 195.73.173.159 nl -195.73.173.160 - 195.73.173.167 de -195.73.173.168 - 195.73.173.215 nl -195.73.173.216 - 195.73.173.223 de -195.73.173.224 - 195.73.174.7 nl -195.73.174.8 - 195.73.174.15 de -195.73.174.16 - 195.73.174.111 nl -195.73.174.112 - 195.73.174.119 de -195.73.174.120 - 195.73.174.127 nl -195.73.174.128 - 195.73.174.135 de -195.73.174.136 - 195.73.174.143 nl -195.73.174.144 - 195.73.174.151 de -195.73.174.152 - 195.73.174.167 nl -195.73.174.168 - 195.73.174.175 de -195.73.174.176 - 195.73.174.255 nl -195.73.175.0 - 195.73.175.7 de -195.73.175.8 - 195.73.175.39 nl -195.73.175.40 - 195.73.175.47 de -195.73.175.48 - 195.73.175.151 nl -195.73.175.152 - 195.73.175.159 de -195.73.175.160 - 195.73.175.183 nl -195.73.175.184 - 195.73.175.191 de -195.73.175.192 - 195.73.176.55 nl -195.73.176.56 - 195.73.176.63 de -195.73.176.64 - 195.73.176.71 nl -195.73.176.72 - 195.73.176.79 de -195.73.176.80 - 195.73.176.95 nl -195.73.176.96 - 195.73.176.103 de -195.73.176.104 - 195.73.176.111 nl -195.73.176.112 - 195.73.176.119 de -195.73.176.120 - 195.73.176.127 nl -195.73.176.128 - 195.73.176.135 de -195.73.176.136 - 195.73.176.199 nl -195.73.176.200 - 195.73.176.207 de -195.73.176.208 - 195.73.176.255 nl -195.73.177.0 - 195.73.177.7 de -195.73.177.8 - 195.73.177.15 nl -195.73.177.16 - 195.73.177.23 de -195.73.177.24 - 195.73.177.39 nl -195.73.177.40 - 195.73.177.47 de -195.73.177.48 - 195.73.177.55 nl -195.73.177.56 - 195.73.177.63 de -195.73.177.64 - 195.73.177.95 nl -195.73.177.96 - 195.73.177.103 de -195.73.177.104 - 195.73.177.167 nl -195.73.177.168 - 195.73.177.175 de -195.73.177.176 - 195.73.177.183 nl -195.73.177.184 - 195.73.177.191 de -195.73.177.192 - 195.73.177.199 nl -195.73.177.200 - 195.73.177.207 de -195.73.177.208 - 195.73.178.15 nl -195.73.178.16 - 195.73.178.23 de -195.73.178.24 - 195.73.178.31 nl -195.73.178.32 - 195.73.178.39 de -195.73.178.40 - 195.73.178.47 nl -195.73.178.48 - 195.73.178.55 de -195.73.178.56 - 195.73.178.63 nl -195.73.178.64 - 195.73.178.71 de -195.73.178.72 - 195.73.178.79 nl -195.73.178.80 - 195.73.178.87 de -195.73.178.88 - 195.73.178.111 nl -195.73.178.112 - 195.73.178.119 de -195.73.178.120 - 195.73.178.135 nl -195.73.178.136 - 195.73.178.143 de -195.73.178.144 - 195.73.178.159 nl -195.73.178.160 - 195.73.178.167 de -195.73.178.168 - 195.73.178.191 nl -195.73.178.192 - 195.73.178.199 de -195.73.178.200 - 195.73.178.255 nl -195.73.179.0 - 195.73.179.7 de -195.73.179.8 - 195.73.179.127 nl -195.73.179.128 - 195.73.179.135 de -195.73.179.136 - 195.73.179.159 nl -195.73.179.160 - 195.73.179.167 de -195.73.179.168 - 195.73.179.175 nl -195.73.179.176 - 195.73.179.183 de -195.73.179.184 - 195.73.179.191 nl -195.73.179.192 - 195.73.179.199 de -195.73.179.200 - 195.73.179.239 nl -195.73.179.240 - 195.73.179.247 de -195.73.179.248 - 195.73.180.55 nl -195.73.180.56 - 195.73.180.63 de -195.73.180.64 - 195.73.180.71 nl -195.73.180.72 - 195.73.180.87 de -195.73.180.88 - 195.73.180.95 nl -195.73.180.96 - 195.73.180.103 de -195.73.180.104 - 195.73.180.111 nl -195.73.180.112 - 195.73.180.127 de -195.73.180.128 - 195.73.180.143 nl -195.73.180.144 - 195.73.180.159 de -195.73.180.160 - 195.73.180.183 nl -195.73.180.184 - 195.73.180.191 de -195.73.180.192 - 195.73.180.231 nl -195.73.180.232 - 195.73.180.239 de -195.73.180.240 - 195.73.180.247 nl -195.73.180.248 - 195.73.181.7 de -195.73.181.8 - 195.73.181.15 nl -195.73.181.16 - 195.73.181.31 de -195.73.181.32 - 195.73.181.55 nl -195.73.181.56 - 195.73.181.63 de -195.73.181.64 - 195.73.181.87 nl -195.73.181.88 - 195.73.181.95 de -195.73.181.96 - 195.73.182.47 nl -195.73.182.48 - 195.73.182.55 de -195.73.182.56 - 195.73.182.71 nl -195.73.182.72 - 195.73.182.87 de -195.73.182.88 - 195.73.182.143 nl -195.73.182.144 - 195.73.182.151 de -195.73.182.152 - 195.73.182.175 nl -195.73.182.176 - 195.73.182.183 de -195.73.182.184 - 195.73.183.95 nl -195.73.183.96 - 195.73.183.103 de -195.73.183.104 - 195.73.183.111 nl -195.73.183.112 - 195.73.183.119 de -195.73.183.120 - 195.73.183.127 nl -195.73.183.128 - 195.73.183.135 de -195.73.183.136 - 195.73.183.143 nl -195.73.183.144 - 195.73.183.159 de -195.73.183.160 - 195.73.183.183 nl -195.73.183.184 - 195.73.183.191 de -195.73.183.192 - 195.73.183.207 nl -195.73.183.208 - 195.73.183.215 de -195.73.183.216 - 195.73.183.223 nl -195.73.183.224 - 195.73.183.231 de -195.73.183.232 - 195.73.184.23 nl -195.73.184.24 - 195.73.184.31 de -195.73.184.32 - 195.73.184.167 nl -195.73.184.168 - 195.73.184.175 de -195.73.184.176 - 195.73.185.175 nl -195.73.185.176 - 195.73.185.183 de -195.73.185.184 - 195.73.185.207 nl -195.73.185.208 - 195.73.185.223 de -195.73.185.224 - 195.73.186.15 nl -195.73.186.16 - 195.73.186.23 de -195.73.186.24 - 195.73.186.111 nl -195.73.186.112 - 195.73.186.119 de -195.73.186.120 - 195.73.186.191 nl -195.73.186.192 - 195.73.186.199 de -195.73.186.200 - 195.73.187.39 nl -195.73.187.40 - 195.73.187.47 de -195.73.187.48 - 195.73.187.79 nl -195.73.187.80 - 195.73.187.87 de -195.73.187.88 - 195.73.187.111 nl -195.73.187.112 - 195.73.187.119 de -195.73.187.120 - 195.73.187.183 nl -195.73.187.184 - 195.73.187.191 de -195.73.187.192 - 195.73.187.215 nl -195.73.187.216 - 195.73.187.223 de -195.73.187.224 - 195.73.187.231 nl -195.73.187.232 - 195.73.187.239 de -195.73.187.240 - 195.73.188.15 nl -195.73.188.16 - 195.73.188.23 de -195.73.188.24 - 195.73.188.31 nl -195.73.188.32 - 195.73.188.39 de -195.73.188.40 - 195.73.188.55 nl -195.73.188.56 - 195.73.188.63 de -195.73.188.64 - 195.73.188.71 nl -195.73.188.72 - 195.73.188.79 de -195.73.188.80 - 195.73.188.199 nl -195.73.188.200 - 195.73.188.231 de -195.73.188.232 - 195.73.188.239 nl -195.73.188.240 - 195.73.188.247 de -195.73.188.248 - 195.73.189.63 nl -195.73.189.64 - 195.73.189.71 de -195.73.189.72 - 195.73.189.79 nl -195.73.189.80 - 195.73.189.95 de -195.73.189.96 - 195.73.189.159 nl -195.73.189.160 - 195.73.189.183 de -195.73.189.184 - 195.73.189.255 nl -195.73.190.0 - 195.73.190.15 de -195.73.190.16 - 195.73.190.63 nl -195.73.190.64 - 195.73.190.79 de -195.73.190.80 - 195.73.191.87 nl -195.73.191.88 - 195.73.191.95 de -195.73.191.96 - 195.73.191.151 nl -195.73.191.152 - 195.73.191.159 de -195.73.191.160 - 195.73.191.207 nl -195.73.191.208 - 195.73.191.215 de -195.73.191.216 - 195.73.191.239 nl -195.73.191.240 - 195.73.191.247 de -195.73.191.248 - 195.73.192.7 nl -195.73.192.8 - 195.73.192.23 de -195.73.192.24 - 195.73.192.31 nl -195.73.192.32 - 195.73.192.39 de -195.73.192.40 - 195.73.192.63 nl -195.73.192.64 - 195.73.192.71 de -195.73.192.72 - 195.73.192.127 nl -195.73.192.128 - 195.73.192.135 de -195.73.192.136 - 195.73.192.191 nl -195.73.192.192 - 195.73.192.199 de -195.73.192.200 - 195.73.193.31 nl -195.73.193.32 - 195.73.193.39 de -195.73.193.40 - 195.73.193.55 nl -195.73.193.56 - 195.73.193.63 de -195.73.193.64 - 195.73.193.71 nl -195.73.193.72 - 195.73.193.79 de -195.73.193.80 - 195.73.193.151 nl -195.73.193.152 - 195.73.193.159 de -195.73.193.160 - 195.73.193.255 nl -195.73.194.0 - 195.73.194.7 de -195.73.194.8 - 195.73.194.15 nl -195.73.194.16 - 195.73.194.31 de -195.73.194.32 - 195.73.194.47 nl -195.73.194.48 - 195.73.194.55 de -195.73.194.56 - 195.73.194.71 nl -195.73.194.72 - 195.73.194.79 de -195.73.194.80 - 195.73.194.111 nl -195.73.194.112 - 195.73.194.135 de -195.73.194.136 - 195.73.194.199 nl -195.73.194.200 - 195.73.194.207 de -195.73.194.208 - 195.73.195.23 nl -195.73.195.24 - 195.73.195.39 de -195.73.195.40 - 195.73.195.47 nl -195.73.195.48 - 195.73.195.55 de -195.73.195.56 - 195.73.195.175 nl -195.73.195.176 - 195.73.195.183 de -195.73.195.184 - 195.73.195.239 nl -195.73.195.240 - 195.73.195.247 de -195.73.195.248 - 195.73.196.15 nl -195.73.196.16 - 195.73.196.23 de -195.73.196.24 - 195.73.196.71 nl -195.73.196.72 - 195.73.196.79 de -195.73.196.80 - 195.73.196.111 nl -195.73.196.112 - 195.73.196.119 de -195.73.196.120 - 195.73.196.167 nl -195.73.196.168 - 195.73.196.175 de -195.73.196.176 - 195.73.197.39 nl -195.73.197.40 - 195.73.197.47 de -195.73.197.48 - 195.73.197.111 nl -195.73.197.112 - 195.73.197.119 de -195.73.197.120 - 195.73.197.135 nl -195.73.197.136 - 195.73.197.143 de -195.73.197.144 - 195.73.197.215 nl -195.73.197.216 - 195.73.197.223 de -195.73.197.224 - 195.73.197.255 nl -195.73.198.0 - 195.73.198.7 de -195.73.198.8 - 195.73.198.143 nl -195.73.198.144 - 195.73.198.151 de -195.73.198.152 - 195.73.198.183 nl -195.73.198.184 - 195.73.198.191 de -195.73.198.192 - 195.73.198.207 nl -195.73.198.208 - 195.73.198.215 de -195.73.198.216 - 195.73.199.47 nl -195.73.199.48 - 195.73.199.55 de -195.73.199.56 - 195.73.199.63 nl -195.73.199.64 - 195.73.199.71 de -195.73.199.72 - 195.73.199.87 nl -195.73.199.88 - 195.73.199.95 de -195.73.199.96 - 195.73.199.127 nl -195.73.199.128 - 195.73.199.135 de -195.73.199.136 - 195.73.199.159 nl -195.73.199.160 - 195.73.199.167 de -195.73.199.168 - 195.73.199.231 nl -195.73.199.232 - 195.73.199.239 de -195.73.199.240 - 195.73.200.71 nl -195.73.200.72 - 195.73.200.79 de -195.73.200.80 - 195.73.200.167 nl -195.73.200.168 - 195.73.200.183 de -195.73.200.184 - 195.73.200.231 nl -195.73.200.232 - 195.73.200.239 de -195.73.200.240 - 195.73.201.47 nl -195.73.201.48 - 195.73.201.55 de -195.73.201.56 - 195.73.201.199 nl -195.73.201.200 - 195.73.201.207 de -195.73.201.208 - 195.73.201.231 nl -195.73.201.232 - 195.73.201.239 de -195.73.201.240 - 195.73.201.255 nl -195.73.202.0 - 195.73.202.7 de -195.73.202.8 - 195.73.202.31 nl -195.73.202.32 - 195.73.202.39 de -195.73.202.40 - 195.73.202.47 nl -195.73.202.48 - 195.73.202.63 de -195.73.202.64 - 195.73.202.199 nl -195.73.202.200 - 195.73.202.207 de -195.73.202.208 - 195.73.203.183 nl -195.73.203.184 - 195.73.203.191 de -195.73.203.192 - 195.73.203.207 nl -195.73.203.208 - 195.73.203.215 de -195.73.203.216 - 195.73.203.231 nl -195.73.203.232 - 195.73.203.239 de -195.73.203.240 - 195.73.203.247 nl -195.73.203.248 - 195.73.204.7 de -195.73.204.8 - 195.73.204.39 nl -195.73.204.40 - 195.73.204.47 de -195.73.204.48 - 195.73.204.127 nl -195.73.204.128 - 195.73.204.143 de -195.73.204.144 - 195.73.204.223 nl -195.73.204.224 - 195.73.204.231 de -195.73.204.232 - 195.73.205.55 nl -195.73.205.56 - 195.73.205.63 de -195.73.205.64 - 195.73.205.71 nl -195.73.205.72 - 195.73.205.87 de -195.73.205.88 - 195.73.205.95 nl -195.73.205.96 - 195.73.205.103 de -195.73.205.104 - 195.73.205.143 nl -195.73.205.144 - 195.73.205.151 de -195.73.205.152 - 195.73.205.175 nl -195.73.205.176 - 195.73.205.183 de -195.73.205.184 - 195.73.205.255 nl -195.73.206.0 - 195.73.206.15 de -195.73.206.16 - 195.73.206.31 nl -195.73.206.32 - 195.73.206.39 de -195.73.206.40 - 195.73.206.79 nl -195.73.206.80 - 195.73.206.87 de -195.73.206.88 - 195.73.206.207 nl -195.73.206.208 - 195.73.206.215 de -195.73.206.216 - 195.73.206.231 nl -195.73.206.232 - 195.73.206.239 de -195.73.206.240 - 195.73.207.39 nl -195.73.207.40 - 195.73.207.47 de -195.73.207.48 - 195.73.207.87 nl -195.73.207.88 - 195.73.207.95 de -195.73.207.96 - 195.73.207.111 nl -195.73.207.112 - 195.73.207.119 de -195.73.207.120 - 195.73.207.231 nl -195.73.207.232 - 195.73.207.247 de -195.73.207.248 - 195.73.207.255 nl -195.73.208.0 - 195.73.208.15 de -195.73.208.16 - 195.73.208.79 nl -195.73.208.80 - 195.73.208.95 de -195.73.208.96 - 195.73.208.175 nl -195.73.208.176 - 195.73.208.191 de -195.73.208.192 - 195.73.208.199 nl -195.73.208.200 - 195.73.208.207 de -195.73.208.208 - 195.73.209.23 nl -195.73.209.24 - 195.73.209.31 de -195.73.209.32 - 195.73.209.63 nl -195.73.209.64 - 195.73.209.71 de -195.73.209.72 - 195.73.209.119 nl -195.73.209.120 - 195.73.209.127 de -195.73.209.128 - 195.73.209.167 nl -195.73.209.168 - 195.73.209.175 de -195.73.209.176 - 195.73.209.199 nl -195.73.209.200 - 195.73.209.207 de -195.73.209.208 - 195.73.210.39 nl -195.73.210.40 - 195.73.210.47 de -195.73.210.48 - 195.73.210.55 nl -195.73.210.56 - 195.73.210.63 de -195.73.210.64 - 195.73.210.87 nl -195.73.210.88 - 195.73.210.95 de -195.73.210.96 - 195.73.210.167 nl -195.73.210.168 - 195.73.210.175 de -195.73.210.176 - 195.73.210.183 nl -195.73.210.184 - 195.73.210.191 de -195.73.210.192 - 195.73.211.31 nl -195.73.211.32 - 195.73.211.39 de -195.73.211.40 - 195.73.211.55 nl -195.73.211.56 - 195.73.211.63 de -195.73.211.64 - 195.73.211.159 nl -195.73.211.160 - 195.73.211.175 de -195.73.211.176 - 195.73.211.223 nl -195.73.211.224 - 195.73.211.231 de -195.73.211.232 - 195.73.212.23 nl -195.73.212.24 - 195.73.212.31 de -195.73.212.32 - 195.73.212.47 nl -195.73.212.48 - 195.73.212.55 de -195.73.212.56 - 195.73.212.79 nl -195.73.212.80 - 195.73.212.87 de -195.73.212.88 - 195.73.212.127 nl -195.73.212.128 - 195.73.212.135 de -195.73.212.136 - 195.73.212.167 nl -195.73.212.168 - 195.73.212.175 de -195.73.212.176 - 195.73.212.223 nl -195.73.212.224 - 195.73.212.231 de -195.73.212.232 - 195.73.212.239 nl -195.73.212.240 - 195.73.212.247 de -195.73.212.248 - 195.73.213.31 nl -195.73.213.32 - 195.73.213.39 de -195.73.213.40 - 195.73.213.55 nl -195.73.213.56 - 195.73.213.63 de -195.73.213.64 - 195.73.213.95 nl -195.73.213.96 - 195.73.213.103 de -195.73.213.104 - 195.73.213.183 nl -195.73.213.184 - 195.73.213.199 de -195.73.213.200 - 195.73.213.231 nl -195.73.213.232 - 195.73.213.247 de -195.73.213.248 - 195.73.214.15 nl -195.73.214.16 - 195.73.214.23 de -195.73.214.24 - 195.73.214.63 nl -195.73.214.64 - 195.73.214.71 de -195.73.214.72 - 195.73.214.79 nl -195.73.214.80 - 195.73.214.87 de -195.73.214.88 - 195.73.214.175 nl -195.73.214.176 - 195.73.214.191 de -195.73.214.192 - 195.73.214.255 nl -195.73.215.0 - 195.73.215.7 de -195.73.215.8 - 195.73.215.31 nl -195.73.215.32 - 195.73.215.39 de -195.73.215.40 - 195.73.215.63 nl -195.73.215.64 - 195.73.215.71 de -195.73.215.72 - 195.73.215.111 nl -195.73.215.112 - 195.73.215.127 de -195.73.215.128 - 195.73.215.143 nl -195.73.215.144 - 195.73.215.151 de -195.73.215.152 - 195.73.215.183 nl -195.73.215.184 - 195.73.215.207 de -195.73.215.208 - 195.73.215.239 nl -195.73.215.240 - 195.73.215.247 de -195.73.215.248 - 195.73.216.39 nl -195.73.216.40 - 195.73.216.47 de -195.73.216.48 - 195.73.216.55 nl -195.73.216.56 - 195.73.216.63 de -195.73.216.64 - 195.73.216.71 nl -195.73.216.72 - 195.73.216.79 de -195.73.216.80 - 195.73.216.111 nl -195.73.216.112 - 195.73.216.119 de -195.73.216.120 - 195.73.216.175 nl -195.73.216.176 - 195.73.216.191 de -195.73.216.192 - 195.73.216.207 nl -195.73.216.208 - 195.73.216.223 de -195.73.216.224 - 195.73.216.239 nl -195.73.216.240 - 195.73.216.247 de -195.73.216.248 - 195.73.217.191 nl -195.73.217.192 - 195.73.217.207 de -195.73.217.208 - 195.73.217.231 nl -195.73.217.232 - 195.73.217.239 de -195.73.217.240 - 195.73.217.255 nl -195.73.218.0 - 195.73.218.7 de -195.73.218.8 - 195.73.218.159 nl -195.73.218.160 - 195.73.218.167 de -195.73.218.168 - 195.73.219.15 nl -195.73.219.16 - 195.73.219.23 de -195.73.219.24 - 195.73.219.31 nl -195.73.219.32 - 195.73.219.39 de -195.73.219.40 - 195.73.219.167 nl -195.73.219.168 - 195.73.219.175 de -195.73.219.176 - 195.73.219.223 nl -195.73.219.224 - 195.73.219.231 de -195.73.219.232 - 195.73.219.247 nl -195.73.219.248 - 195.73.219.255 de -195.73.220.0 - 195.73.220.175 nl -195.73.220.176 - 195.73.220.183 de -195.73.220.184 - 195.73.220.223 nl -195.73.220.224 - 195.73.220.247 de -195.73.220.248 - 195.73.221.47 nl -195.73.221.48 - 195.73.221.55 de -195.73.221.56 - 195.73.221.71 nl -195.73.221.72 - 195.73.221.87 de -195.73.221.88 - 195.73.221.111 nl -195.73.221.112 - 195.73.221.119 de -195.73.221.120 - 195.73.221.143 nl -195.73.221.144 - 195.73.221.151 de -195.73.221.152 - 195.73.221.159 nl -195.73.221.160 - 195.73.221.167 de -195.73.221.168 - 195.73.221.223 nl -195.73.221.224 - 195.73.221.231 de -195.73.221.232 - 195.73.221.247 nl -195.73.221.248 - 195.73.221.255 de -195.73.222.0 - 195.73.222.119 nl -195.73.222.120 - 195.73.222.127 de -195.73.222.128 - 195.73.222.175 nl -195.73.222.176 - 195.73.222.191 de -195.73.222.192 - 195.73.222.207 nl -195.73.222.208 - 195.73.222.215 de -195.73.222.216 - 195.73.222.231 nl -195.73.222.232 - 195.73.222.239 de -195.73.222.240 - 195.73.223.15 nl -195.73.223.16 - 195.73.223.23 de -195.73.223.24 - 195.73.223.31 nl -195.73.223.32 - 195.73.223.39 de -195.73.223.40 - 195.73.223.87 nl -195.73.223.88 - 195.73.223.111 de -195.73.223.112 - 195.73.223.119 nl -195.73.223.120 - 195.73.223.127 de -195.73.223.128 - 195.73.223.175 nl -195.73.223.176 - 195.73.223.183 de -195.73.223.184 - 195.73.223.223 nl -195.73.223.224 - 195.73.223.231 de -195.73.223.232 - 195.73.223.239 nl -195.73.223.240 - 195.73.223.247 de -195.73.223.248 - 195.73.223.255 nl -195.73.224.0 - 195.73.224.15 de -195.73.224.16 - 195.73.224.31 nl -195.73.224.32 - 195.73.224.39 de -195.73.224.40 - 195.73.224.87 nl -195.73.224.88 - 195.73.224.95 de -195.73.224.96 - 195.73.224.191 nl -195.73.224.192 - 195.73.224.215 de -195.73.224.216 - 195.73.224.247 nl -195.73.224.248 - 195.73.225.7 de -195.73.225.8 - 195.73.225.79 nl -195.73.225.80 - 195.73.225.87 de -195.73.225.88 - 195.73.225.111 nl -195.73.225.112 - 195.73.225.119 de -195.73.225.120 - 195.73.225.135 nl -195.73.225.136 - 195.73.225.143 de -195.73.225.144 - 195.73.225.167 nl -195.73.225.168 - 195.73.225.175 de -195.73.225.176 - 195.73.225.183 nl -195.73.225.184 - 195.73.225.191 de -195.73.225.192 - 195.73.225.231 nl -195.73.225.232 - 195.73.225.239 de -195.73.225.240 - 195.73.226.87 nl -195.73.226.88 - 195.73.226.95 de -195.73.226.96 - 195.73.226.175 nl -195.73.226.176 - 195.73.226.183 de -195.73.226.184 - 195.73.226.215 nl -195.73.226.216 - 195.73.226.223 de -195.73.226.224 - 195.73.227.135 nl -195.73.227.136 - 195.73.227.143 de -195.73.227.144 - 195.73.227.151 nl -195.73.227.152 - 195.73.227.159 de -195.73.227.160 - 195.73.227.167 nl -195.73.227.168 - 195.73.227.175 de -195.73.227.176 - 195.73.227.223 nl -195.73.227.224 - 195.73.227.255 de -195.73.228.0 - 195.73.228.63 nl -195.73.228.64 - 195.73.228.71 de -195.73.228.72 - 195.73.228.191 nl -195.73.228.192 - 195.73.228.207 de -195.73.228.208 - 195.73.229.23 nl -195.73.229.24 - 195.73.229.31 de -195.73.229.32 - 195.73.229.63 nl -195.73.229.64 - 195.73.229.79 de -195.73.229.80 - 195.73.229.111 nl -195.73.229.112 - 195.73.229.119 de -195.73.229.120 - 195.73.229.135 nl -195.73.229.136 - 195.73.229.143 de -195.73.229.144 - 195.73.229.151 nl -195.73.229.152 - 195.73.229.159 de -195.73.229.160 - 195.73.229.215 nl -195.73.229.216 - 195.73.229.223 de -195.73.229.224 - 195.73.230.23 nl -195.73.230.24 - 195.73.230.31 de -195.73.230.32 - 195.73.230.95 nl -195.73.230.96 - 195.73.230.103 de -195.73.230.104 - 195.73.230.111 nl -195.73.230.112 - 195.73.230.119 de -195.73.230.120 - 195.73.230.167 nl -195.73.230.168 - 195.73.230.175 de -195.73.230.176 - 195.73.230.215 nl -195.73.230.216 - 195.73.230.223 de -195.73.230.224 - 195.73.231.103 nl -195.73.231.104 - 195.73.231.111 de -195.73.231.112 - 195.73.231.119 nl -195.73.231.120 - 195.73.231.135 de -195.73.231.136 - 195.73.231.143 nl -195.73.231.144 - 195.73.231.151 de -195.73.231.152 - 195.73.231.159 nl -195.73.231.160 - 195.73.231.167 de -195.73.231.168 - 195.73.231.255 nl -195.73.232.0 - 195.73.232.7 de -195.73.232.8 - 195.73.232.199 nl -195.73.232.200 - 195.73.232.207 de -195.73.232.208 - 195.73.232.215 nl -195.73.232.216 - 195.73.232.223 de -195.73.232.224 - 195.73.232.255 nl -195.73.233.0 - 195.73.233.15 de -195.73.233.16 - 195.73.233.127 nl -195.73.233.128 - 195.73.233.135 de -195.73.233.136 - 195.73.233.167 nl -195.73.233.168 - 195.73.233.175 de -195.73.233.176 - 195.73.233.191 nl -195.73.233.192 - 195.73.233.199 de -195.73.233.200 - 195.73.233.215 nl -195.73.233.216 - 195.73.233.223 de -195.73.233.224 - 195.73.234.15 nl -195.73.234.16 - 195.73.234.23 de -195.73.234.24 - 195.73.234.63 nl -195.73.234.64 - 195.73.234.71 de -195.73.234.72 - 195.73.234.87 nl -195.73.234.88 - 195.73.234.95 de -195.73.234.96 - 195.73.234.127 nl -195.73.234.128 - 195.73.234.135 de -195.73.234.136 - 195.73.234.175 nl -195.73.234.176 - 195.73.234.183 de -195.73.234.184 - 195.73.234.239 nl -195.73.234.240 - 195.73.234.247 de -195.73.234.248 - 195.73.235.47 nl -195.73.235.48 - 195.73.235.55 de -195.73.235.56 - 195.73.235.127 nl -195.73.235.128 - 195.73.235.135 de -195.73.235.136 - 195.73.235.175 nl -195.73.235.176 - 195.73.235.183 de -195.73.235.184 - 195.73.235.207 nl -195.73.235.208 - 195.73.235.215 de -195.73.235.216 - 195.73.236.39 nl -195.73.236.40 - 195.73.236.47 de -195.73.236.48 - 195.73.236.63 nl -195.73.236.64 - 195.73.236.71 de -195.73.236.72 - 195.73.236.79 nl -195.73.236.80 - 195.73.236.95 de -195.73.236.96 - 195.73.236.111 nl -195.73.236.112 - 195.73.236.119 de -195.73.236.120 - 195.73.236.191 nl -195.73.236.192 - 195.73.236.199 de -195.73.236.200 - 195.73.236.255 nl -195.73.237.0 - 195.73.237.7 de -195.73.237.8 - 195.73.237.23 nl -195.73.237.24 - 195.73.237.39 de -195.73.237.40 - 195.73.237.55 nl -195.73.237.56 - 195.73.237.63 de -195.73.237.64 - 195.73.237.71 nl -195.73.237.72 - 195.73.237.87 de -195.73.237.88 - 195.73.237.135 nl -195.73.237.136 - 195.73.237.143 de -195.73.237.144 - 195.73.238.95 nl -195.73.238.96 - 195.73.238.103 de -195.73.238.104 - 195.73.238.127 nl -195.73.238.128 - 195.73.238.135 de -195.73.238.136 - 195.73.238.151 nl -195.73.238.152 - 195.73.238.175 de -195.73.238.176 - 195.73.238.207 nl -195.73.238.208 - 195.73.238.215 de -195.73.238.216 - 195.73.238.239 nl -195.73.238.240 - 195.73.238.247 de -195.73.238.248 - 195.73.239.7 nl -195.73.239.8 - 195.73.239.15 de -195.73.239.16 - 195.73.239.71 nl -195.73.239.72 - 195.73.239.79 de -195.73.239.80 - 195.73.239.87 nl -195.73.239.88 - 195.73.239.95 de -195.73.239.96 - 195.73.239.159 nl -195.73.239.160 - 195.73.239.167 de -195.73.239.168 - 195.73.239.175 nl -195.73.239.176 - 195.73.239.183 de -195.73.239.184 - 195.73.239.207 nl -195.73.239.208 - 195.73.239.215 de -195.73.239.216 - 195.73.239.223 nl -195.73.239.224 - 195.73.239.239 de -195.73.239.240 - 195.73.240.23 nl -195.73.240.24 - 195.73.240.31 de -195.73.240.32 - 195.73.240.47 nl -195.73.240.48 - 195.73.240.55 de -195.73.240.56 - 195.73.240.71 nl -195.73.240.72 - 195.73.240.79 de -195.73.240.80 - 195.73.240.95 nl -195.73.240.96 - 195.73.240.103 de -195.73.240.104 - 195.73.240.159 nl -195.73.240.160 - 195.73.240.167 de -195.73.240.168 - 195.73.241.15 nl -195.73.241.16 - 195.73.241.23 de -195.73.241.24 - 195.73.241.31 nl -195.73.241.32 - 195.73.241.39 de -195.73.241.40 - 195.73.241.63 nl -195.73.241.64 - 195.73.241.71 de -195.73.241.72 - 195.73.241.79 nl -195.73.241.80 - 195.73.241.87 de -195.73.241.88 - 195.73.241.103 nl -195.73.241.104 - 195.73.241.111 de -195.73.241.112 - 195.73.241.191 nl -195.73.241.192 - 195.73.241.199 de -195.73.241.200 - 195.73.241.207 nl -195.73.241.208 - 195.73.241.215 de -195.73.241.216 - 195.73.241.223 nl -195.73.241.224 - 195.73.241.247 de -195.73.241.248 - 195.73.242.39 nl -195.73.242.40 - 195.73.242.47 de -195.73.242.48 - 195.73.242.71 nl -195.73.242.72 - 195.73.242.79 de -195.73.242.80 - 195.73.242.87 nl -195.73.242.88 - 195.73.242.95 de -195.73.242.96 - 195.73.242.143 nl -195.73.242.144 - 195.73.242.151 de -195.73.242.152 - 195.73.242.167 nl -195.73.242.168 - 195.73.242.175 de -195.73.242.176 - 195.73.242.199 nl -195.73.242.200 - 195.73.242.207 de -195.73.242.208 - 195.73.243.23 nl -195.73.243.24 - 195.73.243.31 de -195.73.243.32 - 195.73.243.39 nl -195.73.243.40 - 195.73.243.47 de -195.73.243.48 - 195.73.243.55 nl -195.73.243.56 - 195.73.243.63 de -195.73.243.64 - 195.73.243.71 nl -195.73.243.72 - 195.73.243.79 de -195.73.243.80 - 195.73.243.111 nl -195.73.243.112 - 195.73.243.127 de -195.73.243.128 - 195.73.243.223 nl -195.73.243.224 - 195.73.243.231 de -195.73.243.232 - 195.73.244.87 nl -195.73.244.88 - 195.73.244.95 de -195.73.244.96 - 195.73.244.127 nl -195.73.244.128 - 195.73.244.135 de -195.73.244.136 - 195.73.244.255 nl -195.73.245.0 - 195.73.245.7 de -195.73.245.8 - 195.73.245.15 nl -195.73.245.16 - 195.73.245.23 de -195.73.245.24 - 195.73.245.55 nl -195.73.245.56 - 195.73.245.63 de -195.73.245.64 - 195.73.245.79 nl -195.73.245.80 - 195.73.245.87 de -195.73.245.88 - 195.73.245.111 nl -195.73.245.112 - 195.73.245.119 de -195.73.245.120 - 195.73.245.151 nl -195.73.245.152 - 195.73.245.159 de -195.73.245.160 - 195.73.246.175 nl -195.73.246.176 - 195.73.246.183 de -195.73.246.184 - 195.73.246.223 nl -195.73.246.224 - 195.73.246.231 de -195.73.246.232 - 195.73.246.255 nl -195.73.247.0 - 195.73.247.7 de -195.73.247.8 - 195.73.247.159 nl -195.73.247.160 - 195.73.247.167 de -195.73.247.168 - 195.73.247.239 nl -195.73.247.240 - 195.73.248.7 de -195.73.248.8 - 195.73.248.167 nl -195.73.248.168 - 195.73.248.175 de -195.73.248.176 - 195.73.248.199 nl -195.73.248.200 - 195.73.248.207 de -195.73.248.208 - 195.73.249.31 nl -195.73.249.32 - 195.73.249.39 de -195.73.249.40 - 195.73.249.71 nl -195.73.249.72 - 195.73.249.87 de -195.73.249.88 - 195.73.250.15 nl -195.73.250.16 - 195.73.250.23 de -195.73.250.24 - 195.73.250.79 nl -195.73.250.80 - 195.73.250.87 de -195.73.250.88 - 195.73.250.143 nl -195.73.250.144 - 195.73.250.151 de -195.73.250.152 - 195.73.251.175 nl -195.73.251.176 - 195.73.251.183 de -195.73.251.184 - 195.73.251.215 nl -195.73.251.216 - 195.73.251.231 de -195.73.251.232 - 195.73.251.255 nl -195.73.252.0 - 195.73.252.7 de -195.73.252.8 - 195.73.252.15 nl -195.73.252.16 - 195.73.252.23 de -195.73.252.24 - 195.73.252.183 nl -195.73.252.184 - 195.73.252.191 de -195.73.252.192 - 195.73.253.143 nl -195.73.253.144 - 195.73.253.151 de -195.73.253.152 - 195.73.253.159 nl -195.73.253.160 - 195.73.253.167 de -195.73.253.168 - 195.73.253.191 nl -195.73.253.192 - 195.73.253.199 de -195.73.253.200 - 195.73.254.15 nl -195.73.254.16 - 195.73.254.23 de -195.73.254.24 - 195.73.254.103 nl -195.73.254.104 - 195.73.254.111 de -195.73.254.112 - 195.73.254.135 nl -195.73.254.136 - 195.73.254.143 de -195.73.254.144 - 195.73.254.239 nl -195.73.254.240 - 195.73.254.247 de -195.73.254.248 - 195.73.255.31 nl -195.73.255.32 - 195.73.255.39 de -195.73.255.40 - 195.73.255.111 nl -195.73.255.112 - 195.73.255.119 de -195.73.255.120 - 195.73.255.231 nl -195.73.255.232 - 195.73.255.239 de -195.73.255.240 - 195.73.255.255 nl +195.73.0.0 - 195.73.255.255 nl 195.74.0.0 - 195.74.31.255 fi 195.74.32.0 - 195.74.35.255 dk 195.74.36.0 - 195.74.39.255 se @@ -108557,7 +90454,7 @@ 195.74.74.0 - 195.74.74.255 ru 195.74.75.0 - 195.74.75.255 it 195.74.76.0 - 195.74.76.255 cz -195.74.77.0 - 195.74.77.255 dk +195.74.77.0 - 195.74.77.255 no 195.74.78.0 - 195.74.78.255 ro 195.74.79.0 - 195.74.79.255 pl 195.74.80.0 - 195.74.80.255 fr @@ -108568,7 +90465,6 @@ 195.74.85.0 - 195.74.85.255 bg 195.74.86.0 - 195.74.86.255 de 195.74.87.0 - 195.74.87.255 nl -195.74.88.0 - 195.74.90.255 ru 195.74.91.0 - 195.74.92.255 pl 195.74.93.0 - 195.74.93.255 gb 195.74.94.0 - 195.74.94.255 de @@ -108578,457 +90474,60 @@ 195.74.175.0 - 195.74.191.255 eu 195.74.192.0 - 195.74.223.255 be 195.74.224.0 - 195.74.255.255 gr -195.75.0.0 - 195.75.0.255 eu -195.75.1.0 - 195.75.1.255 at -195.75.2.0 - 195.75.2.31 eu -195.75.2.32 - 195.75.2.63 at -195.75.2.64 - 195.75.3.15 eu -195.75.3.16 - 195.75.3.23 at -195.75.3.24 - 195.75.3.31 eu -195.75.3.32 - 195.75.3.47 at -195.75.3.48 - 195.75.3.55 eu -195.75.3.56 - 195.75.3.111 at -195.75.3.112 - 195.75.3.127 eu -195.75.3.128 - 195.75.3.191 at -195.75.3.192 - 195.75.3.207 eu -195.75.3.208 - 195.75.3.223 at -195.75.3.224 - 195.75.3.255 eu -195.75.4.0 - 195.75.5.255 at -195.75.6.0 - 195.75.7.159 eu -195.75.7.160 - 195.75.7.183 at -195.75.7.184 - 195.75.7.207 eu -195.75.7.208 - 195.75.7.255 at -195.75.8.0 - 195.75.8.255 eu -195.75.9.0 - 195.75.9.255 gb -195.75.10.0 - 195.75.10.135 eu -195.75.10.136 - 195.75.10.143 it -195.75.10.144 - 195.75.10.159 fr -195.75.10.160 - 195.75.10.175 eu -195.75.10.176 - 195.75.10.191 it -195.75.10.192 - 195.75.13.255 eu -195.75.14.0 - 195.75.14.135 it -195.75.14.136 - 195.75.14.143 eu -195.75.14.144 - 195.75.14.207 it -195.75.14.208 - 195.75.14.215 gb -195.75.14.216 - 195.75.14.255 it -195.75.15.0 - 195.75.15.255 eu -195.75.16.0 - 195.75.16.255 ch -195.75.17.0 - 195.75.19.255 eu -195.75.20.0 - 195.75.22.31 ch -195.75.22.32 - 195.75.23.111 eu -195.75.23.112 - 195.75.23.127 ch -195.75.23.128 - 195.75.23.255 eu -195.75.24.0 - 195.75.26.191 fr -195.75.26.192 - 195.75.26.223 eu -195.75.26.224 - 195.75.26.239 fr -195.75.26.240 - 195.75.26.247 eu -195.75.26.248 - 195.75.27.47 fr -195.75.27.48 - 195.75.27.111 eu -195.75.27.112 - 195.75.27.119 gb -195.75.27.120 - 195.75.27.127 eu -195.75.27.128 - 195.75.28.127 fr -195.75.28.128 - 195.75.28.159 eu -195.75.28.160 - 195.75.28.255 fr -195.75.29.0 - 195.75.29.255 eu -195.75.30.0 - 195.75.30.143 fr -195.75.30.144 - 195.75.30.151 eu -195.75.30.152 - 195.75.30.159 fr -195.75.30.160 - 195.75.30.191 eu -195.75.30.192 - 195.75.31.63 fr -195.75.31.64 - 195.75.31.79 eu -195.75.31.80 - 195.75.31.119 fr -195.75.31.120 - 195.75.31.143 eu -195.75.31.144 - 195.75.31.183 fr -195.75.31.184 - 195.75.31.199 eu -195.75.31.200 - 195.75.31.223 fr -195.75.31.224 - 195.75.31.255 eu -195.75.32.0 - 195.75.32.255 ru -195.75.33.0 - 195.75.33.255 eu -195.75.34.0 - 195.75.35.255 ru -195.75.36.0 - 195.75.39.255 eu -195.75.40.0 - 195.75.40.255 gr -195.75.41.0 - 195.75.41.255 eu -195.75.42.0 - 195.75.43.31 gr -195.75.43.32 - 195.75.43.63 eu -195.75.43.64 - 195.75.43.191 gr -195.75.43.192 - 195.75.43.255 eu -195.75.44.0 - 195.75.44.127 gr -195.75.44.128 - 195.75.44.255 eu -195.75.45.0 - 195.75.46.255 gr -195.75.47.0 - 195.75.47.31 eu -195.75.47.32 - 195.75.47.127 gr -195.75.47.128 - 195.75.47.255 eu -195.75.48.0 - 195.75.48.255 sk -195.75.49.0 - 195.75.51.255 eu +195.75.0.0 - 195.75.3.215 eu +195.75.3.216 - 195.75.3.223 at +195.75.3.224 - 195.75.9.255 eu +195.75.10.0 - 195.75.10.47 it +195.75.10.48 - 195.75.22.23 eu +195.75.22.24 - 195.75.22.31 nl +195.75.22.32 - 195.75.22.111 eu +195.75.22.112 - 195.75.22.143 ch +195.75.22.144 - 195.75.51.255 eu 195.75.52.0 - 195.75.55.255 gb -195.75.56.0 - 195.75.56.255 eu -195.75.57.0 - 195.75.57.255 gr -195.75.58.0 - 195.75.64.255 eu -195.75.65.0 - 195.75.65.255 cz -195.75.66.0 - 195.75.71.255 eu -195.75.72.0 - 195.75.73.255 nl -195.75.74.0 - 195.75.74.63 cz -195.75.74.64 - 195.75.74.95 eu -195.75.74.96 - 195.75.74.127 no -195.75.74.128 - 195.75.75.255 cz -195.75.76.0 - 195.75.76.71 gb -195.75.76.72 - 195.75.76.79 eu -195.75.76.80 - 195.75.77.15 gb -195.75.77.16 - 195.75.77.31 eu -195.75.77.32 - 195.75.77.95 gb -195.75.77.96 - 195.75.77.111 eu -195.75.77.112 - 195.75.77.119 gb -195.75.77.120 - 195.75.77.255 eu -195.75.78.0 - 195.75.80.31 gb -195.75.80.32 - 195.75.80.39 eu -195.75.80.40 - 195.75.81.79 gb -195.75.81.80 - 195.75.81.95 eu -195.75.81.96 - 195.75.81.159 gb -195.75.81.160 - 195.75.81.191 eu -195.75.81.192 - 195.75.86.31 gb -195.75.86.32 - 195.75.86.79 eu -195.75.86.80 - 195.75.86.135 gb -195.75.86.136 - 195.75.86.143 eu -195.75.86.144 - 195.75.90.79 gb -195.75.90.80 - 195.75.90.95 eu -195.75.90.96 - 195.75.90.143 gb -195.75.90.144 - 195.75.90.159 eu -195.75.90.160 - 195.75.90.183 gb -195.75.90.184 - 195.75.90.191 eu -195.75.90.192 - 195.75.91.147 gb -195.75.91.148 - 195.75.91.151 eu -195.75.91.152 - 195.75.91.215 gb -195.75.91.216 - 195.75.91.223 eu -195.75.91.224 - 195.75.94.255 gb -195.75.95.0 - 195.75.95.255 eu -195.75.96.0 - 195.75.96.255 de -195.75.97.0 - 195.75.97.63 eu -195.75.97.64 - 195.75.97.127 de -195.75.97.128 - 195.75.97.143 eu -195.75.97.144 - 195.75.97.159 de -195.75.97.160 - 195.75.97.191 eu -195.75.97.192 - 195.75.97.223 de -195.75.97.224 - 195.75.97.255 eu -195.75.98.0 - 195.75.98.191 de -195.75.98.192 - 195.75.98.199 eu -195.75.98.200 - 195.75.98.239 de -195.75.98.240 - 195.75.98.255 eu -195.75.99.0 - 195.75.99.255 de -195.75.100.0 - 195.75.100.127 gb -195.75.100.128 - 195.75.100.255 eu -195.75.101.0 - 195.75.101.255 gb -195.75.102.0 - 195.75.104.255 de -195.75.105.0 - 195.75.105.255 eu -195.75.106.0 - 195.75.106.47 de -195.75.106.48 - 195.75.106.63 eu -195.75.106.64 - 195.75.106.159 de -195.75.106.160 - 195.75.106.223 eu -195.75.106.224 - 195.75.107.47 de -195.75.107.48 - 195.75.107.79 eu -195.75.107.80 - 195.75.107.111 de -195.75.107.112 - 195.75.107.223 eu -195.75.107.224 - 195.75.108.31 de -195.75.108.32 - 195.75.108.63 ch -195.75.108.64 - 195.75.108.127 de -195.75.108.128 - 195.75.108.159 eu -195.75.108.160 - 195.75.108.255 de -195.75.109.0 - 195.75.109.255 eu -195.75.110.0 - 195.75.110.255 de -195.75.111.0 - 195.75.111.255 eu -195.75.112.0 - 195.75.112.31 de -195.75.112.32 - 195.75.112.63 fr -195.75.112.64 - 195.75.112.127 eu -195.75.112.128 - 195.75.112.191 de -195.75.112.192 - 195.75.112.255 eu -195.75.113.0 - 195.75.113.255 de -195.75.114.0 - 195.75.116.255 eu -195.75.117.0 - 195.75.127.255 de -195.75.128.0 - 195.75.128.143 za -195.75.128.144 - 195.75.128.159 eu -195.75.128.160 - 195.75.129.255 za -195.75.130.0 - 195.75.130.255 eu -195.75.131.0 - 195.75.131.31 za -195.75.131.32 - 195.75.131.47 eu -195.75.131.48 - 195.75.131.63 za -195.75.131.64 - 195.75.131.127 eu -195.75.131.128 - 195.75.131.191 za -195.75.131.192 - 195.75.131.215 eu -195.75.131.216 - 195.75.131.223 za -195.75.131.224 - 195.75.131.239 eu -195.75.131.240 - 195.75.132.47 za -195.75.132.48 - 195.75.132.63 eu -195.75.132.64 - 195.75.132.79 za -195.75.132.80 - 195.75.132.95 eu -195.75.132.96 - 195.75.132.255 za -195.75.133.0 - 195.75.133.255 eu -195.75.134.0 - 195.75.135.255 za -195.75.136.0 - 195.75.136.95 ch -195.75.136.96 - 195.75.136.255 eu -195.75.137.0 - 195.75.137.255 ch -195.75.138.0 - 195.75.139.255 eu -195.75.140.0 - 195.75.140.167 gb -195.75.140.168 - 195.75.140.191 eu -195.75.140.192 - 195.75.140.255 fr -195.75.141.0 - 195.75.141.255 gb -195.75.142.0 - 195.75.142.7 eu -195.75.142.8 - 195.75.142.255 gb -195.75.143.0 - 195.75.143.255 eu +195.75.56.0 - 195.75.72.23 eu +195.75.72.24 - 195.75.72.24 nl +195.75.72.25 - 195.75.72.29 eu +195.75.72.30 - 195.75.72.30 at +195.75.72.31 - 195.75.72.31 ch +195.75.72.32 - 195.75.106.47 eu +195.75.106.48 - 195.75.106.111 de +195.75.106.112 - 195.75.119.255 eu +195.75.120.0 - 195.75.127.255 de +195.75.128.0 - 195.75.143.255 eu 195.75.144.0 - 195.75.147.255 it -195.75.148.0 - 195.75.149.255 eu -195.75.150.0 - 195.75.150.31 it -195.75.150.32 - 195.75.150.63 eu -195.75.150.64 - 195.75.150.95 it -195.75.150.96 - 195.75.150.127 eu -195.75.150.128 - 195.75.150.191 gb -195.75.150.192 - 195.75.152.255 eu -195.75.153.0 - 195.75.154.31 za -195.75.154.32 - 195.75.154.79 eu -195.75.154.80 - 195.75.154.95 za -195.75.154.96 - 195.75.154.127 eu -195.75.154.128 - 195.75.154.175 za -195.75.154.176 - 195.75.154.191 eu -195.75.154.192 - 195.75.154.207 za -195.75.154.208 - 195.75.154.223 eu -195.75.154.224 - 195.75.155.191 za -195.75.155.192 - 195.75.155.199 eu -195.75.155.200 - 195.75.155.207 za -195.75.155.208 - 195.75.155.255 eu +195.75.148.0 - 195.75.155.255 eu 195.75.156.0 - 195.75.158.255 za -195.75.159.0 - 195.75.160.255 eu -195.75.161.0 - 195.75.161.15 ch -195.75.161.16 - 195.75.161.23 eu -195.75.161.24 - 195.75.161.31 ch -195.75.161.32 - 195.75.164.31 eu -195.75.164.32 - 195.75.164.63 ch -195.75.164.64 - 195.75.164.255 eu -195.75.165.0 - 195.75.165.255 ch -195.75.166.0 - 195.75.167.255 eu -195.75.168.0 - 195.75.168.255 es -195.75.169.0 - 195.75.175.255 eu -195.75.176.0 - 195.75.176.127 nl -195.75.176.128 - 195.75.176.255 eu -195.75.177.0 - 195.75.177.15 nl -195.75.177.16 - 195.75.177.23 eu -195.75.177.24 - 195.75.177.127 nl -195.75.177.128 - 195.75.177.159 eu -195.75.177.160 - 195.75.177.255 nl -195.75.178.0 - 195.75.178.15 eu -195.75.178.16 - 195.75.178.63 nl -195.75.178.64 - 195.75.178.127 eu -195.75.178.128 - 195.75.178.135 nl -195.75.178.136 - 195.75.178.207 eu -195.75.178.208 - 195.75.178.223 nl -195.75.178.224 - 195.75.178.239 eu -195.75.178.240 - 195.75.179.47 nl -195.75.179.48 - 195.75.179.63 eu -195.75.179.64 - 195.75.179.127 nl -195.75.179.128 - 195.75.179.159 eu -195.75.179.160 - 195.75.179.191 nl -195.75.179.192 - 195.75.179.207 eu -195.75.179.208 - 195.75.179.223 nl -195.75.179.224 - 195.75.179.255 eu -195.75.180.0 - 195.75.180.127 be -195.75.180.128 - 195.75.180.191 eu -195.75.180.192 - 195.75.180.255 be -195.75.181.0 - 195.75.181.255 eu -195.75.182.0 - 195.75.183.255 be -195.75.184.0 - 195.75.184.255 eu -195.75.185.0 - 195.75.186.255 dk -195.75.187.0 - 195.75.187.31 be -195.75.187.32 - 195.75.187.63 gb -195.75.187.64 - 195.75.187.223 be -195.75.187.224 - 195.75.187.231 eu -195.75.187.232 - 195.75.187.255 be -195.75.188.0 - 195.75.188.15 eu -195.75.188.16 - 195.75.188.143 se -195.75.188.144 - 195.75.188.159 eu -195.75.188.160 - 195.75.188.175 se -195.75.188.176 - 195.75.188.191 eu -195.75.188.192 - 195.75.188.255 se -195.75.189.0 - 195.75.189.63 eu -195.75.189.64 - 195.75.189.111 se -195.75.189.112 - 195.75.189.127 eu -195.75.189.128 - 195.75.189.223 se -195.75.189.224 - 195.75.189.239 eu -195.75.189.240 - 195.75.190.255 se -195.75.191.0 - 195.75.191.255 eu -195.75.192.0 - 195.75.192.15 ro -195.75.192.16 - 195.75.193.255 eu -195.75.194.0 - 195.75.199.255 nl -195.75.200.0 - 195.75.201.15 eu -195.75.201.16 - 195.75.201.135 no -195.75.201.136 - 195.75.201.143 eu -195.75.201.144 - 195.75.201.175 no -195.75.201.176 - 195.75.201.191 eu -195.75.201.192 - 195.75.201.255 no -195.75.202.0 - 195.75.202.31 eu -195.75.202.32 - 195.75.202.63 tr -195.75.202.64 - 195.75.202.159 eu -195.75.202.160 - 195.75.202.255 tr -195.75.203.0 - 195.75.203.255 eu -195.75.204.0 - 195.75.204.255 gb -195.75.205.0 - 195.75.205.55 pt -195.75.205.56 - 195.75.205.239 eu -195.75.205.240 - 195.75.205.255 pt -195.75.206.0 - 195.75.206.255 fi -195.75.207.0 - 195.75.207.191 eu -195.75.207.192 - 195.75.207.215 hr -195.75.207.216 - 195.75.207.223 pl -195.75.207.224 - 195.75.207.255 hr -195.75.208.0 - 195.75.209.255 eu -195.75.210.0 - 195.75.210.7 ch -195.75.210.8 - 195.75.210.15 eu -195.75.210.16 - 195.75.210.31 ch -195.75.210.32 - 195.75.210.63 eu -195.75.210.64 - 195.75.210.79 ch -195.75.210.80 - 195.75.210.255 eu -195.75.211.0 - 195.75.211.255 ch -195.75.212.0 - 195.75.213.255 eu -195.75.214.0 - 195.75.214.31 si -195.75.214.32 - 195.75.214.63 eu -195.75.214.64 - 195.75.214.95 si -195.75.214.96 - 195.75.214.111 eu -195.75.214.112 - 195.75.214.127 si -195.75.214.128 - 195.75.214.255 eu -195.75.215.0 - 195.75.215.255 si -195.75.216.0 - 195.75.216.127 pk -195.75.216.128 - 195.75.216.255 eu -195.75.217.0 - 195.75.217.127 pk -195.75.217.128 - 195.75.217.255 eu -195.75.218.0 - 195.75.218.95 be -195.75.218.96 - 195.75.218.111 gb -195.75.218.112 - 195.75.218.119 be -195.75.218.120 - 195.75.218.127 gb -195.75.218.128 - 195.75.218.223 be +195.75.159.0 - 195.75.179.223 eu +195.75.179.224 - 195.75.179.239 nl +195.75.179.240 - 195.75.188.255 eu +195.75.189.0 - 195.75.189.31 se +195.75.189.32 - 195.75.195.255 eu +195.75.196.0 - 195.75.199.255 nl +195.75.200.0 - 195.75.205.63 eu +195.75.205.64 - 195.75.205.95 pt +195.75.205.96 - 195.75.217.255 eu +195.75.218.0 - 195.75.218.63 gb +195.75.218.64 - 195.75.218.223 eu 195.75.218.224 - 195.75.218.231 gb -195.75.218.232 - 195.75.218.239 fr -195.75.218.240 - 195.75.219.15 be -195.75.219.16 - 195.75.219.63 eu -195.75.219.64 - 195.75.219.119 be -195.75.219.120 - 195.75.219.127 eu -195.75.219.128 - 195.75.219.135 be -195.75.219.136 - 195.75.219.143 eu -195.75.219.144 - 195.75.219.159 be -195.75.219.160 - 195.75.219.175 eu -195.75.219.176 - 195.75.219.183 be -195.75.219.184 - 195.75.219.191 eu -195.75.219.192 - 195.75.220.79 be -195.75.220.80 - 195.75.220.87 eu -195.75.220.88 - 195.75.220.95 be -195.75.220.96 - 195.75.220.127 eu -195.75.220.128 - 195.75.220.159 be -195.75.220.160 - 195.75.220.175 gb -195.75.220.176 - 195.75.220.191 eu -195.75.220.192 - 195.75.220.255 be -195.75.221.0 - 195.75.221.31 ie -195.75.221.32 - 195.75.221.39 eu -195.75.221.40 - 195.75.221.47 ie -195.75.221.48 - 195.75.221.63 eu -195.75.221.64 - 195.75.221.255 ie -195.75.222.0 - 195.75.222.15 tr -195.75.222.16 - 195.75.222.31 eu -195.75.222.32 - 195.75.222.127 tr -195.75.222.128 - 195.75.222.175 eu -195.75.222.176 - 195.75.222.199 tr -195.75.222.200 - 195.75.222.207 eu -195.75.222.208 - 195.75.222.223 tr -195.75.222.224 - 195.75.222.239 eu -195.75.222.240 - 195.75.222.255 tr -195.75.223.0 - 195.75.223.255 eu -195.75.224.0 - 195.75.227.15 nl -195.75.227.16 - 195.75.227.23 eu -195.75.227.24 - 195.75.227.63 nl -195.75.227.64 - 195.75.227.127 eu -195.75.227.128 - 195.75.235.255 nl -195.75.236.0 - 195.75.236.39 tr -195.75.236.40 - 195.75.236.47 eu -195.75.236.48 - 195.75.236.55 tr -195.75.236.56 - 195.75.236.119 eu -195.75.236.120 - 195.75.236.255 tr -195.75.237.0 - 195.75.237.31 hu -195.75.237.32 - 195.75.237.79 eu -195.75.237.80 - 195.75.237.95 hu -195.75.237.96 - 195.75.237.127 eu -195.75.237.128 - 195.75.237.191 hu -195.75.237.192 - 195.75.237.255 eu -195.75.238.0 - 195.75.238.127 tr -195.75.238.128 - 195.75.240.15 eu -195.75.240.16 - 195.75.240.31 gb -195.75.240.32 - 195.75.240.63 eu -195.75.240.64 - 195.75.240.127 ie -195.75.240.128 - 195.75.240.167 eu -195.75.240.168 - 195.75.240.191 ie -195.75.240.192 - 195.75.240.223 eu -195.75.240.224 - 195.75.240.255 ie -195.75.241.0 - 195.75.241.255 eu -195.75.242.0 - 195.75.242.143 gb -195.75.242.144 - 195.75.242.159 nl -195.75.242.160 - 195.75.242.191 gb -195.75.242.192 - 195.75.242.223 fr -195.75.242.224 - 195.75.243.15 eu -195.75.243.16 - 195.75.243.63 nl -195.75.243.64 - 195.75.243.95 eu -195.75.243.96 - 195.75.243.127 nl -195.75.243.128 - 195.75.243.159 eu -195.75.243.160 - 195.75.243.191 nl -195.75.243.192 - 195.75.243.255 eu -195.75.244.0 - 195.75.244.95 nl -195.75.244.96 - 195.75.244.103 eu -195.75.244.104 - 195.75.244.111 nl -195.75.244.112 - 195.75.244.127 eu -195.75.244.128 - 195.75.244.135 nl -195.75.244.136 - 195.75.244.231 eu -195.75.244.232 - 195.75.244.255 gb -195.75.245.0 - 195.75.245.23 ru -195.75.245.24 - 195.75.245.31 lv -195.75.245.32 - 195.75.245.63 ru -195.75.245.64 - 195.75.246.15 eu -195.75.246.16 - 195.75.246.23 fi -195.75.246.24 - 195.75.246.39 eu -195.75.246.40 - 195.75.246.47 fi -195.75.246.48 - 195.75.246.55 eu -195.75.246.56 - 195.75.246.63 fi -195.75.246.64 - 195.75.246.79 eu -195.75.246.80 - 195.75.246.159 fi -195.75.246.160 - 195.75.246.255 eu -195.75.247.0 - 195.75.247.255 pk -195.75.248.0 - 195.75.248.255 fi -195.75.249.0 - 195.75.249.255 eu -195.75.250.0 - 195.75.250.110 es -195.75.250.111 - 195.75.250.119 eu -195.75.250.120 - 195.75.250.191 es -195.75.250.192 - 195.75.251.7 eu -195.75.251.8 - 195.75.251.15 hr -195.75.251.16 - 195.75.251.63 eu -195.75.251.64 - 195.75.251.95 hu -195.75.251.96 - 195.75.251.111 eu -195.75.251.112 - 195.75.251.135 hu -195.75.251.136 - 195.75.251.159 eu -195.75.251.160 - 195.75.251.167 hu -195.75.251.168 - 195.75.251.255 eu -195.75.252.0 - 195.75.252.63 es -195.75.252.64 - 195.75.252.127 eu -195.75.252.128 - 195.75.252.159 es -195.75.252.160 - 195.75.253.63 eu -195.75.253.64 - 195.75.253.127 at -195.75.253.128 - 195.75.253.255 eu +195.75.218.232 - 195.75.227.255 eu +195.75.228.0 - 195.75.231.255 nl +195.75.232.0 - 195.75.251.175 eu +195.75.251.176 - 195.75.251.207 hu +195.75.251.208 - 195.75.253.255 eu 195.75.254.0 - 195.75.254.255 at -195.75.255.0 - 195.75.255.63 gr -195.75.255.64 - 195.75.255.255 eu +195.75.255.0 - 195.75.255.255 eu 195.76.0.0 - 195.77.255.255 es 195.78.0.0 - 195.78.31.255 mc 195.78.32.0 - 195.78.35.255 hr 195.78.36.0 - 195.78.37.255 se 195.78.38.0 - 195.78.39.255 ua 195.78.40.0 - 195.78.41.255 de -195.78.42.0 - 195.78.43.255 ro +195.78.42.0 - 195.78.43.255 ua 195.78.44.0 - 195.78.45.255 sk 195.78.46.0 - 195.78.47.255 at -195.78.48.0 - 195.78.49.255 pl 195.78.50.0 - 195.78.51.255 be 195.78.52.0 - 195.78.53.255 at -195.78.54.0 - 195.78.55.255 gb -195.78.56.0 - 195.78.59.255 ua +195.78.58.0 - 195.78.59.255 ua 195.78.60.0 - 195.78.61.255 ru 195.78.62.0 - 195.78.63.255 de 195.78.64.0 - 195.78.65.255 ro @@ -109052,7 +90551,7 @@ 195.78.102.0 - 195.78.103.255 ru 195.78.104.0 - 195.78.105.255 ua 195.78.106.0 - 195.78.107.255 ro -195.78.108.0 - 195.78.109.255 eu +195.78.108.0 - 195.78.109.255 cz 195.78.110.0 - 195.78.111.255 gb 195.78.112.0 - 195.78.113.255 ua 195.78.114.0 - 195.78.119.255 ru @@ -109071,375 +90570,24 @@ 195.78.244.0 - 195.78.247.255 ua 195.78.248.0 - 195.78.251.255 de 195.78.252.0 - 195.78.255.255 ua -195.79.0.0 - 195.79.1.15 at -195.79.1.16 - 195.79.1.31 dk -195.79.1.32 - 195.79.1.95 at -195.79.1.96 - 195.79.1.127 de -195.79.1.128 - 195.79.1.159 eu -195.79.1.160 - 195.79.1.175 gb -195.79.1.176 - 195.79.1.191 nl -195.79.1.192 - 195.79.1.223 fr -195.79.1.224 - 195.79.3.223 at -195.79.3.224 - 195.79.3.255 nl -195.79.4.0 - 195.79.5.127 at -195.79.5.128 - 195.79.5.191 eu -195.79.5.192 - 195.79.5.255 es -195.79.6.0 - 195.79.7.255 at -195.79.8.0 - 195.79.8.63 it -195.79.8.64 - 195.79.8.223 gb -195.79.8.224 - 195.79.8.255 eu -195.79.9.0 - 195.79.9.31 it -195.79.9.32 - 195.79.9.47 de -195.79.9.48 - 195.79.9.63 cz -195.79.9.64 - 195.79.9.95 nl -195.79.9.96 - 195.79.9.103 de -195.79.9.104 - 195.79.9.111 nl -195.79.9.112 - 195.79.9.191 dk -195.79.9.192 - 195.79.9.223 ch -195.79.9.224 - 195.79.9.247 gb -195.79.9.248 - 195.79.9.255 be -195.79.10.0 - 195.79.11.63 it -195.79.11.64 - 195.79.11.127 de -195.79.11.128 - 195.79.11.255 es -195.79.12.0 - 195.79.12.79 it -195.79.12.80 - 195.79.12.95 de -195.79.12.96 - 195.79.12.255 ru -195.79.13.0 - 195.79.13.143 nl -195.79.13.144 - 195.79.13.151 de -195.79.13.152 - 195.79.13.199 gb -195.79.13.200 - 195.79.13.207 it -195.79.13.208 - 195.79.13.223 gb -195.79.13.224 - 195.79.13.255 be -195.79.14.0 - 195.79.14.31 gb -195.79.14.32 - 195.79.14.63 es -195.79.14.64 - 195.79.14.95 gb -195.79.14.96 - 195.79.14.127 it -195.79.14.128 - 195.79.15.255 gb -195.79.16.0 - 195.79.17.31 ch -195.79.17.32 - 195.79.17.255 eu -195.79.18.0 - 195.79.18.79 ch -195.79.18.80 - 195.79.18.95 eu -195.79.18.96 - 195.79.22.31 ch -195.79.22.32 - 195.79.22.71 gb -195.79.22.72 - 195.79.22.79 de -195.79.22.80 - 195.79.22.95 nl -195.79.22.96 - 195.79.22.127 eu -195.79.22.128 - 195.79.22.255 ch -195.79.23.0 - 195.79.24.95 fr -195.79.24.96 - 195.79.24.111 it -195.79.24.112 - 195.79.24.127 cz -195.79.24.128 - 195.79.24.191 pt -195.79.24.192 - 195.79.24.207 si -195.79.24.208 - 195.79.24.223 sk -195.79.24.224 - 195.79.24.255 de -195.79.25.0 - 195.79.26.255 fr -195.79.27.0 - 195.79.27.255 eu -195.79.28.0 - 195.79.31.255 fr -195.79.32.0 - 195.79.32.79 ru -195.79.32.80 - 195.79.32.95 nl -195.79.32.96 - 195.79.32.127 gr -195.79.32.128 - 195.79.32.255 hu -195.79.33.0 - 195.79.33.159 at -195.79.33.160 - 195.79.33.191 de -195.79.33.192 - 195.79.33.223 hu -195.79.33.224 - 195.79.33.255 nl -195.79.34.0 - 195.79.34.255 eu -195.79.35.0 - 195.79.36.223 at -195.79.36.224 - 195.79.36.255 be -195.79.37.0 - 195.79.37.255 at -195.79.38.0 - 195.79.39.255 be -195.79.40.0 - 195.79.40.255 it -195.79.41.0 - 195.79.41.255 gr -195.79.42.0 - 195.79.42.79 dk -195.79.42.80 - 195.79.42.95 nl -195.79.42.96 - 195.79.42.127 dk -195.79.42.128 - 195.79.42.191 de -195.79.42.192 - 195.79.43.183 dk -195.79.43.184 - 195.79.43.191 eu -195.79.43.192 - 195.79.43.255 dk -195.79.44.0 - 195.79.45.63 gb -195.79.45.64 - 195.79.45.127 de -195.79.45.128 - 195.79.45.255 it -195.79.46.0 - 195.79.46.95 gb -195.79.46.96 - 195.79.46.111 be -195.79.46.112 - 195.79.46.127 nl -195.79.46.128 - 195.79.47.255 gb -195.79.48.0 - 195.79.53.255 ch -195.79.54.0 - 195.79.55.255 gb -195.79.56.0 - 195.79.56.151 at -195.79.56.152 - 195.79.56.159 gb -195.79.56.160 - 195.79.56.223 at -195.79.56.224 - 195.79.56.255 it -195.79.57.0 - 195.79.57.31 at -195.79.57.32 - 195.79.57.47 fr -195.79.57.48 - 195.79.57.63 eu -195.79.57.64 - 195.79.57.127 nl -195.79.57.128 - 195.79.57.255 de -195.79.58.0 - 195.79.58.31 be -195.79.58.32 - 195.79.58.63 de -195.79.58.64 - 195.79.59.255 be -195.79.60.0 - 195.79.61.71 nl -195.79.61.72 - 195.79.61.79 gb -195.79.61.80 - 195.79.61.95 fr -195.79.61.96 - 195.79.61.127 be -195.79.61.128 - 195.79.61.255 fr -195.79.62.0 - 195.79.62.95 gb -195.79.62.96 - 195.79.62.127 eu -195.79.62.128 - 195.79.64.191 gb -195.79.64.192 - 195.79.64.223 fr -195.79.64.224 - 195.79.64.239 gb -195.79.64.240 - 195.79.64.255 nl -195.79.65.0 - 195.79.65.71 gb -195.79.65.72 - 195.79.65.95 se -195.79.65.96 - 195.79.65.127 eu -195.79.65.128 - 195.79.65.191 il -195.79.65.192 - 195.79.65.255 at -195.79.66.0 - 195.79.72.159 gb -195.79.72.160 - 195.79.72.175 no -195.79.72.176 - 195.79.72.223 gb -195.79.72.224 - 195.79.72.255 it -195.79.73.0 - 195.79.73.223 gb -195.79.73.224 - 195.79.73.255 fi -195.79.74.0 - 195.79.76.31 gb -195.79.76.32 - 195.79.76.63 hu -195.79.76.64 - 195.79.80.47 gb -195.79.80.48 - 195.79.80.63 de -195.79.80.64 - 195.79.80.127 hu -195.79.80.128 - 195.79.80.255 de -195.79.81.0 - 195.79.83.63 gb -195.79.83.64 - 195.79.83.79 no -195.79.83.80 - 195.79.83.95 ru -195.79.83.96 - 195.79.83.127 gb -195.79.83.128 - 195.79.83.255 es -195.79.84.0 - 195.79.84.63 gb -195.79.84.64 - 195.79.84.95 nl -195.79.84.96 - 195.79.84.127 be -195.79.84.128 - 195.79.85.63 gb -195.79.85.64 - 195.79.85.95 se -195.79.85.96 - 195.79.85.127 fr -195.79.85.128 - 195.79.86.191 gb -195.79.86.192 - 195.79.86.255 de -195.79.87.0 - 195.79.88.127 gb -195.79.88.128 - 195.79.88.143 no -195.79.88.144 - 195.79.88.159 nl -195.79.88.160 - 195.79.88.191 gb -195.79.88.192 - 195.79.88.255 eu -195.79.89.0 - 195.79.89.255 gb -195.79.90.0 - 195.79.90.255 eu -195.79.91.0 - 195.79.91.63 gb -195.79.91.64 - 195.79.91.79 de -195.79.91.80 - 195.79.91.95 es -195.79.91.96 - 195.79.91.127 ch -195.79.91.128 - 195.79.95.255 gb -195.79.96.0 - 195.79.98.143 de -195.79.98.144 - 195.79.98.159 nl -195.79.98.160 - 195.79.98.191 de -195.79.98.192 - 195.79.98.223 ch -195.79.98.224 - 195.79.98.255 eu -195.79.99.0 - 195.79.104.127 de -195.79.104.128 - 195.79.104.191 es -195.79.104.192 - 195.79.107.63 de -195.79.107.64 - 195.79.107.127 gb -195.79.107.128 - 195.79.107.159 dk -195.79.107.160 - 195.79.107.255 fr -195.79.108.0 - 195.79.109.255 de -195.79.110.0 - 195.79.110.255 eu -195.79.111.0 - 195.79.111.63 de -195.79.111.64 - 195.79.111.79 gb -195.79.111.80 - 195.79.111.95 it -195.79.111.96 - 195.79.111.127 no -195.79.111.128 - 195.79.112.191 de -195.79.112.192 - 195.79.112.255 se -195.79.113.0 - 195.79.113.127 de -195.79.113.128 - 195.79.113.159 it -195.79.113.160 - 195.79.113.175 ch -195.79.113.176 - 195.79.113.191 gr -195.79.113.192 - 195.79.113.255 gb -195.79.114.0 - 195.79.115.63 de -195.79.115.64 - 195.79.115.79 dk -195.79.115.80 - 195.79.115.87 gb -195.79.115.88 - 195.79.115.95 be -195.79.115.96 - 195.79.115.127 it -195.79.115.128 - 195.79.115.255 eu -195.79.116.0 - 195.79.119.255 de -195.79.120.0 - 195.79.126.255 gb -195.79.127.0 - 195.79.127.7 fr -195.79.127.8 - 195.79.127.15 eu -195.79.127.16 - 195.79.127.39 fr -195.79.127.40 - 195.79.127.47 dk -195.79.127.48 - 195.79.127.63 be -195.79.127.64 - 195.79.127.103 fr -195.79.127.104 - 195.79.127.111 gb -195.79.127.112 - 195.79.127.127 nl -195.79.127.128 - 195.79.127.255 fr -195.79.128.0 - 195.79.129.255 za -195.79.130.0 - 195.79.130.63 nl -195.79.130.64 - 195.79.130.127 dk -195.79.130.128 - 195.79.130.191 nl -195.79.130.192 - 195.79.130.223 fr -195.79.130.224 - 195.79.130.255 at -195.79.131.0 - 195.79.132.255 nl -195.79.133.0 - 195.79.133.255 de -195.79.134.0 - 195.79.134.95 es -195.79.134.96 - 195.79.134.127 at -195.79.134.128 - 195.79.134.255 hu -195.79.135.0 - 195.79.135.255 de -195.79.136.0 - 195.79.136.15 es -195.79.136.16 - 195.79.136.31 de -195.79.136.32 - 195.79.136.63 ch -195.79.136.64 - 195.79.136.127 nl -195.79.136.128 - 195.79.138.127 es -195.79.138.128 - 195.79.138.191 eu -195.79.138.192 - 195.79.138.223 at -195.79.138.224 - 195.79.138.239 it -195.79.138.240 - 195.79.138.255 ch -195.79.139.0 - 195.79.139.95 es -195.79.139.96 - 195.79.139.127 fi -195.79.139.128 - 195.79.139.191 es -195.79.139.192 - 195.79.139.255 dk -195.79.140.0 - 195.79.141.255 es -195.79.142.0 - 195.79.142.127 eu -195.79.142.128 - 195.79.143.63 es -195.79.143.64 - 195.79.143.127 eu -195.79.143.128 - 195.79.143.255 es -195.79.144.0 - 195.79.144.127 nl -195.79.144.128 - 195.79.144.255 gb -195.79.145.0 - 195.79.147.191 nl -195.79.147.192 - 195.79.147.255 at -195.79.148.0 - 195.79.148.215 be -195.79.148.216 - 195.79.148.223 eu -195.79.148.224 - 195.79.151.255 be -195.79.152.0 - 195.79.154.159 dk -195.79.154.160 - 195.79.154.191 fi -195.79.154.192 - 195.79.154.207 dk -195.79.154.208 - 195.79.154.223 eu -195.79.154.224 - 195.79.154.255 ie -195.79.155.0 - 195.79.155.127 dk -195.79.155.128 - 195.79.155.159 de -195.79.155.160 - 195.79.155.191 fr -195.79.155.192 - 195.79.155.255 gb -195.79.156.0 - 195.79.156.143 se -195.79.156.144 - 195.79.156.159 gb -195.79.156.160 - 195.79.156.191 de -195.79.156.192 - 195.79.156.255 ch -195.79.157.0 - 195.79.158.191 se -195.79.158.192 - 195.79.158.255 nl -195.79.159.0 - 195.79.159.127 se -195.79.159.128 - 195.79.159.191 fr -195.79.159.192 - 195.79.159.223 dk -195.79.159.224 - 195.79.159.255 de -195.79.160.0 - 195.79.182.95 nl -195.79.182.96 - 195.79.182.191 fr -195.79.182.192 - 195.79.182.255 be -195.79.183.0 - 195.79.183.191 nl -195.79.183.192 - 195.79.183.255 fr -195.79.184.0 - 195.79.188.127 be -195.79.188.128 - 195.79.188.191 eu -195.79.188.192 - 195.79.188.207 fr -195.79.188.208 - 195.79.188.223 cz -195.79.188.224 - 195.79.188.255 es -195.79.189.0 - 195.79.189.127 be -195.79.189.128 - 195.79.189.191 gr -195.79.189.192 - 195.79.189.207 dk -195.79.189.208 - 195.79.189.223 gb -195.79.189.224 - 195.79.189.239 pt -195.79.189.240 - 195.79.189.255 ch -195.79.190.0 - 195.79.191.255 it -195.79.192.0 - 195.79.194.255 fr -195.79.195.0 - 195.79.195.255 eu -195.79.196.0 - 195.79.196.255 fr -195.79.197.0 - 195.79.197.255 no -195.79.198.0 - 195.79.198.255 ie -195.79.199.0 - 195.79.199.31 pt -195.79.199.32 - 195.79.199.47 gr -195.79.199.48 - 195.79.199.55 gb -195.79.199.56 - 195.79.199.63 ie -195.79.199.64 - 195.79.199.127 pt -195.79.199.128 - 195.79.199.159 be -195.79.199.160 - 195.79.199.191 pt -195.79.199.192 - 195.79.199.199 tr -195.79.199.200 - 195.79.199.207 pl -195.79.199.208 - 195.79.199.223 cz -195.79.199.224 - 195.79.199.255 it -195.79.200.0 - 195.79.200.127 il -195.79.200.128 - 195.79.200.159 nl -195.79.200.160 - 195.79.200.191 eu -195.79.200.192 - 195.79.200.255 gb -195.79.201.0 - 195.79.201.255 at -195.79.202.0 - 195.79.202.255 no -195.79.203.0 - 195.79.203.255 eu -195.79.204.0 - 195.79.204.127 hu -195.79.204.128 - 195.79.204.191 se -195.79.204.192 - 195.79.204.223 tr -195.79.204.224 - 195.79.204.255 be -195.79.205.0 - 195.79.206.159 at -195.79.206.160 - 195.79.206.191 de -195.79.206.192 - 195.79.206.255 be -195.79.207.0 - 195.79.208.63 fr -195.79.208.64 - 195.79.208.255 eu -195.79.209.0 - 195.79.211.255 fr -195.79.212.0 - 195.79.212.127 ie -195.79.212.128 - 195.79.212.159 de -195.79.212.160 - 195.79.212.191 eu -195.79.212.192 - 195.79.212.255 nl -195.79.213.0 - 195.79.213.255 no -195.79.214.0 - 195.79.214.191 fi -195.79.214.192 - 195.79.214.255 eu -195.79.215.0 - 195.79.215.63 fr -195.79.215.64 - 195.79.215.79 es -195.79.215.80 - 195.79.215.95 fr -195.79.215.96 - 195.79.215.111 es -195.79.215.112 - 195.79.215.127 nl -195.79.215.128 - 195.79.215.255 fr -195.79.216.0 - 195.79.216.255 it -195.79.217.0 - 195.79.217.95 es -195.79.217.96 - 195.79.217.111 fr -195.79.217.112 - 195.79.217.127 nl -195.79.217.128 - 195.79.217.159 it -195.79.217.160 - 195.79.217.183 nl -195.79.217.184 - 195.79.217.191 de -195.79.217.192 - 195.79.217.207 nl -195.79.217.208 - 195.79.217.255 gb -195.79.218.0 - 195.79.218.255 ie -195.79.219.0 - 195.79.219.255 hu -195.79.220.0 - 195.79.220.159 pk -195.79.220.160 - 195.79.220.223 it -195.79.220.224 - 195.79.220.255 nl -195.79.221.0 - 195.79.221.255 gb -195.79.222.0 - 195.79.222.31 pt -195.79.222.32 - 195.79.222.255 eu -195.79.223.0 - 195.79.227.255 gb -195.79.228.0 - 195.79.228.255 fr -195.79.229.0 - 195.79.229.191 gb -195.79.229.192 - 195.79.229.255 ie -195.79.230.0 - 195.79.231.135 fr -195.79.231.136 - 195.79.231.143 nl -195.79.231.144 - 195.79.231.151 be -195.79.231.152 - 195.79.231.159 fr -195.79.231.160 - 195.79.231.191 pl -195.79.231.192 - 195.79.231.255 fr -195.79.232.0 - 195.79.232.255 eu -195.79.233.0 - 195.79.233.143 nl -195.79.233.144 - 195.79.233.159 de -195.79.233.160 - 195.79.233.191 eu -195.79.233.192 - 195.79.233.223 dk -195.79.233.224 - 195.79.233.255 nl -195.79.234.0 - 195.79.239.255 be +195.79.0.0 - 195.79.47.255 eu +195.79.48.0 - 195.79.51.255 ch +195.79.52.0 - 195.79.91.255 eu +195.79.92.0 - 195.79.95.255 gb +195.79.96.0 - 195.79.99.255 eu +195.79.100.0 - 195.79.103.255 de +195.79.104.0 - 195.79.119.255 eu +195.79.120.0 - 195.79.123.255 gb +195.79.124.0 - 195.79.159.255 eu +195.79.160.0 - 195.79.179.255 nl +195.79.180.0 - 195.79.183.255 eu +195.79.184.0 - 195.79.187.255 be +195.79.188.0 - 195.79.214.31 eu +195.79.214.32 - 195.79.214.47 fi +195.79.214.48 - 195.79.235.255 eu +195.79.236.0 - 195.79.239.255 be 195.79.240.0 - 195.79.247.255 at -195.79.248.0 - 195.79.252.127 eu -195.79.252.128 - 195.79.252.255 gb -195.79.253.0 - 195.79.253.63 eu -195.79.253.64 - 195.79.253.127 gb -195.79.253.128 - 195.79.253.159 nl -195.79.253.160 - 195.79.253.223 at -195.79.253.224 - 195.79.253.239 pl -195.79.253.240 - 195.79.253.255 nl -195.79.254.0 - 195.79.254.255 de -195.79.255.0 - 195.79.255.31 nl -195.79.255.32 - 195.79.255.63 gb -195.79.255.64 - 195.79.255.95 fr -195.79.255.96 - 195.79.255.127 es -195.79.255.128 - 195.79.255.255 nl +195.79.248.0 - 195.79.255.255 eu 195.80.0.0 - 195.80.95.255 gb 195.80.96.0 - 195.80.127.255 ee 195.80.128.0 - 195.80.135.255 pl @@ -109457,235 +90605,104 @@ 195.80.227.0 - 195.80.227.255 kw 195.80.228.0 - 195.80.228.255 ru 195.80.229.0 - 195.80.229.255 pl -195.80.230.0 - 195.80.230.255 de -195.80.231.0 - 195.80.232.255 ua +195.80.232.0 - 195.80.232.255 ua 195.80.233.0 - 195.80.233.255 ch 195.80.234.0 - 195.80.234.255 at -195.80.235.0 - 195.80.235.255 ch +195.80.235.0 - 195.80.235.255 eu 195.80.236.0 - 195.80.237.255 pl 195.80.238.0 - 195.80.238.255 be 195.80.239.0 - 195.80.239.255 de 195.80.240.0 - 195.80.255.255 dk -195.81.0.0 - 195.81.3.255 nl -195.81.4.0 - 195.81.4.255 it -195.81.5.0 - 195.81.5.15 de -195.81.5.16 - 195.81.5.23 gb -195.81.5.24 - 195.81.5.47 de -195.81.5.48 - 195.81.5.63 gb -195.81.5.64 - 195.81.5.143 de -195.81.5.144 - 195.81.5.151 gb -195.81.5.152 - 195.81.5.167 de -195.81.5.168 - 195.81.5.191 gb -195.81.5.192 - 195.81.5.255 de -195.81.6.0 - 195.81.11.254 it -195.81.11.255 - 195.81.11.255 gb -195.81.12.0 - 195.81.12.255 nl -195.81.13.0 - 195.81.16.63 it -195.81.16.64 - 195.81.16.95 a2 -195.81.16.96 - 195.81.16.223 it -195.81.16.224 - 195.81.16.255 gb -195.81.17.0 - 195.81.17.255 nl -195.81.18.0 - 195.81.23.255 it -195.81.24.0 - 195.81.26.63 de -195.81.26.64 - 195.81.26.127 cz -195.81.26.128 - 195.81.27.31 de -195.81.27.32 - 195.81.27.63 gb -195.81.27.64 - 195.81.27.255 de -195.81.28.0 - 195.81.31.255 gb -195.81.32.0 - 195.81.34.127 es -195.81.34.128 - 195.81.34.255 gb -195.81.35.0 - 195.81.35.63 es -195.81.35.64 - 195.81.35.255 gb -195.81.36.0 - 195.81.36.255 nl -195.81.37.0 - 195.81.37.255 ch -195.81.38.0 - 195.81.39.255 nl -195.81.40.0 - 195.81.40.255 gb -195.81.41.0 - 195.81.41.255 dk -195.81.42.0 - 195.81.42.127 nl -195.81.42.128 - 195.81.42.143 gb -195.81.42.144 - 195.81.42.253 nl -195.81.42.254 - 195.81.46.223 gb -195.81.46.224 - 195.81.46.239 at -195.81.46.240 - 195.81.48.255 gb -195.81.49.0 - 195.81.49.255 bg -195.81.50.0 - 195.81.50.63 gb -195.81.50.64 - 195.81.50.95 fr -195.81.50.96 - 195.81.50.127 es -195.81.50.128 - 195.81.50.223 fr -195.81.50.224 - 195.81.50.255 gb -195.81.51.0 - 195.81.51.255 fr -195.81.52.0 - 195.81.53.255 es -195.81.54.0 - 195.81.54.63 tr -195.81.54.64 - 195.81.54.255 gb -195.81.55.0 - 195.81.55.255 tr -195.81.56.0 - 195.81.59.255 dk -195.81.60.0 - 195.81.61.63 de -195.81.61.64 - 195.81.61.127 gb -195.81.61.128 - 195.81.61.255 de -195.81.62.0 - 195.81.63.255 fr -195.81.64.0 - 195.81.69.127 it -195.81.69.128 - 195.81.69.191 gb -195.81.69.192 - 195.81.71.255 it -195.81.72.0 - 195.81.74.15 pl -195.81.74.16 - 195.81.74.255 gb -195.81.75.0 - 195.81.75.255 pl -195.81.76.0 - 195.81.79.255 gb -195.81.80.0 - 195.81.80.255 ro -195.81.81.0 - 195.81.83.159 de -195.81.83.160 - 195.81.83.175 gb -195.81.83.176 - 195.81.83.207 de -195.81.83.208 - 195.81.84.7 gb -195.81.84.8 - 195.81.84.15 de -195.81.84.16 - 195.81.84.31 gb -195.81.84.32 - 195.81.87.255 de -195.81.88.0 - 195.81.89.255 gb -195.81.90.0 - 195.81.91.255 it -195.81.92.0 - 195.81.95.255 gb -195.81.96.0 - 195.81.96.23 us -195.81.96.24 - 195.81.96.31 gb -195.81.96.32 - 195.81.96.111 us -195.81.96.112 - 195.81.96.255 gb -195.81.97.0 - 195.81.97.255 us -195.81.98.0 - 195.81.99.255 it -195.81.100.0 - 195.81.100.255 be -195.81.101.0 - 195.81.103.255 us -195.81.104.0 - 195.81.110.254 it -195.81.110.255 - 195.81.110.255 gb -195.81.111.0 - 195.81.118.255 it -195.81.119.0 - 195.81.119.255 cz -195.81.120.0 - 195.81.121.255 be -195.81.122.0 - 195.81.122.63 gb -195.81.122.64 - 195.81.122.79 se -195.81.122.80 - 195.81.122.95 be -195.81.122.96 - 195.81.122.127 gb -195.81.122.128 - 195.81.122.159 be -195.81.122.160 - 195.81.122.255 gb -195.81.123.0 - 195.81.125.127 be -195.81.125.128 - 195.81.126.127 gb -195.81.126.128 - 195.81.127.255 cz -195.81.128.0 - 195.81.128.95 ch -195.81.128.96 - 195.81.128.103 gb -195.81.128.104 - 195.81.129.95 ch -195.81.129.96 - 195.81.129.111 gb -195.81.129.112 - 195.81.129.215 ch -195.81.129.216 - 195.81.129.223 gb -195.81.129.224 - 195.81.130.255 ch -195.81.131.0 - 195.81.131.15 gb -195.81.131.16 - 195.81.134.199 ch -195.81.134.200 - 195.81.134.207 gb -195.81.134.208 - 195.81.135.255 ch -195.81.136.0 - 195.81.136.255 gb -195.81.137.0 - 195.81.140.127 ch -195.81.140.128 - 195.81.140.143 es -195.81.140.144 - 195.81.140.175 ch -195.81.140.176 - 195.81.140.183 gb -195.81.140.184 - 195.81.140.247 ch -195.81.140.248 - 195.81.140.255 gb -195.81.141.0 - 195.81.143.7 ch -195.81.143.8 - 195.81.143.15 gb -195.81.143.16 - 195.81.143.191 ch -195.81.143.192 - 195.81.143.255 gb -195.81.144.0 - 195.81.144.183 se -195.81.144.184 - 195.81.144.215 gb -195.81.144.216 - 195.81.144.239 se -195.81.144.240 - 195.81.144.255 gb -195.81.145.0 - 195.81.147.151 se -195.81.147.152 - 195.81.147.159 gb -195.81.147.160 - 195.81.147.191 no -195.81.147.192 - 195.81.149.255 se -195.81.150.0 - 195.81.150.63 gb -195.81.150.64 - 195.81.150.143 se -195.81.150.144 - 195.81.150.159 gb -195.81.150.160 - 195.81.150.191 se -195.81.150.192 - 195.81.150.255 gb -195.81.151.0 - 195.81.151.255 se -195.81.152.0 - 195.81.155.95 gb -195.81.155.96 - 195.81.155.103 es -195.81.155.104 - 195.81.155.255 gb -195.81.156.0 - 195.81.156.255 se -195.81.157.0 - 195.81.157.255 be -195.81.158.0 - 195.81.158.15 gb -195.81.158.16 - 195.81.158.19 be -195.81.158.20 - 195.81.158.255 gb -195.81.159.0 - 195.81.159.39 se -195.81.159.40 - 195.81.159.47 gb -195.81.159.48 - 195.81.159.55 se -195.81.159.56 - 195.81.159.63 gb -195.81.159.64 - 195.81.159.79 se -195.81.159.80 - 195.81.159.255 gb -195.81.160.0 - 195.81.160.127 nl -195.81.160.128 - 195.81.160.255 gb -195.81.161.0 - 195.81.161.71 nl -195.81.161.72 - 195.81.161.79 ch -195.81.161.80 - 195.81.163.75 nl -195.81.163.76 - 195.81.163.79 gb -195.81.163.80 - 195.81.164.31 nl -195.81.164.32 - 195.81.164.47 be -195.81.164.48 - 195.81.164.123 nl -195.81.164.124 - 195.81.164.127 gb -195.81.164.128 - 195.81.164.143 nl -195.81.164.144 - 195.81.164.159 be -195.81.164.160 - 195.81.164.167 gb -195.81.164.168 - 195.81.166.127 nl -195.81.166.128 - 195.81.166.143 ch -195.81.166.144 - 195.81.166.151 nl -195.81.166.152 - 195.81.166.159 gb -195.81.166.160 - 195.81.169.255 nl -195.81.170.0 - 195.81.171.255 gb -195.81.172.0 - 195.81.175.255 nl -195.81.176.0 - 195.81.183.231 it -195.81.183.232 - 195.81.183.239 gb -195.81.183.240 - 195.81.186.47 it -195.81.186.48 - 195.81.186.63 gb -195.81.186.64 - 195.81.186.207 it -195.81.186.208 - 195.81.186.208 gb -195.81.186.209 - 195.81.186.222 it -195.81.186.223 - 195.81.186.223 gb -195.81.186.224 - 195.81.188.255 it -195.81.189.0 - 195.81.189.63 us -195.81.189.64 - 195.81.189.159 it -195.81.189.160 - 195.81.189.175 gb -195.81.189.176 - 195.81.191.255 it -195.81.192.0 - 195.81.195.111 es -195.81.195.112 - 195.81.195.127 nl -195.81.195.128 - 195.81.195.255 gb -195.81.196.0 - 195.81.197.119 es -195.81.197.120 - 195.81.197.127 gb -195.81.197.128 - 195.81.197.207 es -195.81.197.208 - 195.81.197.215 gb -195.81.197.216 - 195.81.201.239 es -195.81.201.240 - 195.81.201.255 gb -195.81.202.0 - 195.81.202.31 es -195.81.202.32 - 195.81.202.39 gb -195.81.202.40 - 195.81.202.79 es -195.81.202.80 - 195.81.202.95 gb -195.81.202.96 - 195.81.204.127 es -195.81.204.128 - 195.81.204.255 gb -195.81.205.0 - 195.81.207.255 es -195.81.208.0 - 195.81.214.231 de -195.81.214.232 - 195.81.214.239 gb -195.81.214.240 - 195.81.217.95 de -195.81.217.96 - 195.81.217.99 gb -195.81.217.100 - 195.81.217.151 de -195.81.217.152 - 195.81.217.159 gb -195.81.217.160 - 195.81.217.191 de -195.81.217.192 - 195.81.217.207 gb -195.81.217.208 - 195.81.217.255 de -195.81.218.0 - 195.81.218.55 gb -195.81.218.56 - 195.81.218.59 dk -195.81.218.60 - 195.81.218.255 gb -195.81.219.0 - 195.81.222.255 de -195.81.223.0 - 195.81.226.39 fr -195.81.226.40 - 195.81.226.47 gb -195.81.226.48 - 195.81.226.55 fr -195.81.226.56 - 195.81.226.63 de -195.81.226.64 - 195.81.239.127 fr -195.81.239.128 - 195.81.255.255 gb +195.81.0.0 - 195.81.2.255 nl +195.81.3.0 - 195.81.3.255 eu +195.81.4.0 - 195.81.4.255 gb +195.81.5.0 - 195.81.5.255 eu +195.81.6.0 - 195.81.20.255 gb +195.81.21.0 - 195.81.23.255 it +195.81.24.0 - 195.81.32.31 gb +195.81.32.32 - 195.81.32.63 es +195.81.32.64 - 195.81.32.255 gb +195.81.33.0 - 195.81.33.255 es +195.81.34.0 - 195.81.36.207 gb +195.81.36.208 - 195.81.36.223 nl +195.81.36.224 - 195.81.42.95 gb +195.81.42.96 - 195.81.42.127 nl +195.81.42.128 - 195.81.58.43 gb +195.81.58.44 - 195.81.58.47 dk +195.81.58.48 - 195.81.63.147 gb +195.81.63.148 - 195.81.63.151 fr +195.81.63.152 - 195.81.64.127 gb +195.81.64.128 - 195.81.66.255 it +195.81.67.0 - 195.81.68.133 gb +195.81.68.134 - 195.81.68.134 it +195.81.68.135 - 195.81.70.255 gb +195.81.71.0 - 195.81.71.255 it +195.81.72.0 - 195.81.81.91 gb +195.81.81.92 - 195.81.81.95 de +195.81.81.96 - 195.81.82.121 gb +195.81.82.122 - 195.81.82.122 de +195.81.82.123 - 195.81.83.127 gb +195.81.83.128 - 195.81.83.143 de +195.81.83.144 - 195.81.96.63 gb +195.81.96.64 - 195.81.96.79 us +195.81.96.80 - 195.81.103.255 gb +195.81.104.0 - 195.81.107.255 it +195.81.108.0 - 195.81.109.255 gb +195.81.110.0 - 195.81.110.255 it +195.81.111.0 - 195.81.125.191 gb +195.81.125.192 - 195.81.125.255 be +195.81.126.0 - 195.81.129.111 gb +195.81.129.112 - 195.81.129.127 ch +195.81.129.128 - 195.81.129.223 gb +195.81.129.224 - 195.81.129.239 ch +195.81.129.240 - 195.81.140.237 gb +195.81.140.238 - 195.81.140.238 ch +195.81.140.239 - 195.81.142.253 gb +195.81.142.254 - 195.81.142.254 ch +195.81.142.255 - 195.81.143.223 gb +195.81.143.224 - 195.81.143.255 ch +195.81.144.0 - 195.81.144.255 gb +195.81.145.0 - 195.81.145.255 se +195.81.146.0 - 195.81.147.255 gb +195.81.148.0 - 195.81.148.255 se +195.81.149.0 - 195.81.163.77 gb +195.81.163.78 - 195.81.163.78 eu +195.81.163.79 - 195.81.163.255 gb +195.81.164.0 - 195.81.164.31 nl +195.81.164.32 - 195.81.178.63 gb +195.81.178.64 - 195.81.178.95 it +195.81.178.96 - 195.81.180.63 gb +195.81.180.64 - 195.81.180.95 it +195.81.180.96 - 195.81.180.255 gb +195.81.181.0 - 195.81.181.255 it +195.81.182.0 - 195.81.182.79 gb +195.81.182.80 - 195.81.182.87 it +195.81.182.88 - 195.81.182.159 gb +195.81.182.160 - 195.81.182.191 it +195.81.182.192 - 195.81.182.255 gb +195.81.183.0 - 195.81.184.255 it +195.81.185.0 - 195.81.201.239 gb +195.81.201.240 - 195.81.201.255 fr +195.81.202.0 - 195.81.203.231 gb +195.81.203.232 - 195.81.203.235 es +195.81.203.236 - 195.81.209.21 gb +195.81.209.22 - 195.81.209.22 de +195.81.209.23 - 195.81.210.79 gb +195.81.210.80 - 195.81.210.95 de +195.81.210.96 - 195.81.210.175 gb +195.81.210.176 - 195.81.210.183 de +195.81.210.184 - 195.81.210.191 gb +195.81.210.192 - 195.81.210.239 de +195.81.210.240 - 195.81.223.255 gb +195.81.224.0 - 195.81.224.255 fr +195.81.225.0 - 195.81.235.255 gb +195.81.236.0 - 195.81.236.255 fr +195.81.237.0 - 195.81.255.255 gb 195.82.0.0 - 195.82.31.255 kz 195.82.32.0 - 195.82.95.255 de 195.82.96.0 - 195.82.127.255 gb 195.82.128.0 - 195.82.129.255 il -195.82.130.0 - 195.82.133.255 ro +195.82.130.0 - 195.82.131.255 ro 195.82.134.0 - 195.82.137.255 ru 195.82.138.0 - 195.82.139.255 bh 195.82.140.0 - 195.82.147.255 ru @@ -109703,17 +90720,14 @@ 195.85.128.0 - 195.85.191.255 nl 195.85.192.0 - 195.85.192.255 si 195.85.193.0 - 195.85.193.255 gb -195.85.194.0 - 195.85.194.255 ro 195.85.195.0 - 195.85.196.255 pl -195.85.197.0 - 195.85.198.255 ua +195.85.198.0 - 195.85.198.255 ua 195.85.199.0 - 195.85.199.255 pl 195.85.200.0 - 195.85.200.255 es -195.85.201.0 - 195.85.201.255 ro 195.85.202.0 - 195.85.202.255 de 195.85.203.0 - 195.85.204.255 be -195.85.205.0 - 195.85.205.255 nl 195.85.206.0 - 195.85.206.255 ru -195.85.207.0 - 195.85.207.255 fr +195.85.208.0 - 195.85.208.255 ua 195.85.209.0 - 195.85.209.255 pl 195.85.210.0 - 195.85.210.255 de 195.85.211.0 - 195.85.211.255 ro @@ -109721,24 +90735,19 @@ 195.85.213.0 - 195.85.213.255 ru 195.85.214.0 - 195.85.214.255 ua 195.85.215.0 - 195.85.215.255 bg -195.85.216.0 - 195.85.216.255 ua 195.85.217.0 - 195.85.217.255 de -195.85.218.0 - 195.85.218.255 dk 195.85.219.0 - 195.85.219.255 ua 195.85.220.0 - 195.85.220.255 de 195.85.221.0 - 195.85.221.255 pt 195.85.222.0 - 195.85.222.255 de -195.85.223.0 - 195.85.223.255 ua 195.85.224.0 - 195.85.224.255 sa 195.85.225.0 - 195.85.225.255 ru -195.85.226.0 - 195.85.226.255 de 195.85.227.0 - 195.85.227.255 pl 195.85.228.0 - 195.85.228.255 it 195.85.229.0 - 195.85.229.255 de 195.85.230.0 - 195.85.230.255 pl 195.85.231.0 - 195.85.231.255 ru 195.85.232.0 - 195.85.232.255 gb -195.85.233.0 - 195.85.233.255 ua 195.85.234.0 - 195.85.236.255 ru 195.85.237.0 - 195.85.237.255 de 195.85.238.0 - 195.85.238.255 ru @@ -109747,23 +90756,21 @@ 195.85.241.0 - 195.85.241.255 pl 195.85.242.0 - 195.85.242.255 tr 195.85.243.0 - 195.85.243.255 pl -195.85.244.0 - 195.85.244.255 se 195.85.245.0 - 195.85.245.255 gb 195.85.246.0 - 195.85.246.255 be 195.85.247.0 - 195.85.247.255 fr -195.85.248.0 - 195.85.248.255 dk 195.85.249.0 - 195.85.249.255 pl 195.85.250.0 - 195.85.250.255 ua 195.85.251.0 - 195.85.251.255 dk 195.85.252.0 - 195.85.252.255 pl 195.85.253.0 - 195.85.253.255 dk -195.85.254.0 - 195.85.254.255 gg +195.85.254.0 - 195.85.254.255 de 195.85.255.0 - 195.85.255.255 tr -195.86.0.0 - 195.86.240.71 nl -195.86.240.72 - 195.86.240.79 de -195.86.240.80 - 195.86.255.255 nl +195.86.0.0 - 195.86.255.255 nl 195.87.0.0 - 195.87.255.255 tr -195.88.0.0 - 195.88.3.255 ru +195.88.0.0 - 195.88.1.255 ru +195.88.2.0 - 195.88.2.255 kz +195.88.3.0 - 195.88.3.255 ru 195.88.4.0 - 195.88.7.255 it 195.88.8.0 - 195.88.9.255 gb 195.88.10.0 - 195.88.11.255 at @@ -109773,7 +90780,6 @@ 195.88.18.0 - 195.88.19.255 nl 195.88.20.0 - 195.88.21.255 gb 195.88.22.0 - 195.88.23.255 ru -195.88.24.0 - 195.88.25.255 ro 195.88.26.0 - 195.88.27.255 ua 195.88.28.0 - 195.88.31.255 pl 195.88.32.0 - 195.88.33.255 nl @@ -109788,8 +90794,8 @@ 195.88.50.0 - 195.88.51.255 pl 195.88.52.0 - 195.88.53.255 ua 195.88.54.0 - 195.88.55.255 no -195.88.56.0 - 195.88.59.255 ru -195.88.60.0 - 195.88.61.255 ro +195.88.58.0 - 195.88.59.255 ru +195.88.60.0 - 195.88.61.255 de 195.88.62.0 - 195.88.63.255 ru 195.88.64.0 - 195.88.65.255 ro 195.88.66.0 - 195.88.67.255 am @@ -109808,7 +90814,7 @@ 195.88.94.0 - 195.88.95.255 fr 195.88.96.0 - 195.88.99.255 ro 195.88.100.0 - 195.88.101.255 gb -195.88.102.0 - 195.88.105.255 ru +195.88.102.0 - 195.88.103.255 ru 195.88.106.0 - 195.88.107.255 no 195.88.108.0 - 195.88.109.255 de 195.88.110.0 - 195.88.111.255 se @@ -109827,22 +90833,23 @@ 195.88.138.0 - 195.88.139.255 ua 195.88.140.0 - 195.88.141.255 bg 195.88.142.0 - 195.88.143.255 cz +195.88.144.0 - 195.88.145.255 pl 195.88.146.0 - 195.88.147.255 ru 195.88.148.0 - 195.88.149.255 es -195.88.150.0 - 195.88.151.255 gb 195.88.152.0 - 195.88.153.255 es 195.88.154.0 - 195.88.155.255 ru -195.88.156.0 - 195.88.157.255 nl +195.88.156.0 - 195.88.157.255 gb 195.88.158.0 - 195.88.159.255 ua 195.88.160.0 - 195.88.161.255 nl 195.88.162.0 - 195.88.163.255 gr 195.88.164.0 - 195.88.165.255 cz 195.88.166.0 - 195.88.167.255 at -195.88.168.0 - 195.88.169.255 pl 195.88.170.0 - 195.88.171.255 ru 195.88.172.0 - 195.88.175.255 ro 195.88.176.0 - 195.88.177.255 cy 195.88.178.0 - 195.88.179.255 ru +195.88.180.0 - 195.88.180.255 pl +195.88.181.0 - 195.88.181.255 ru 195.88.182.0 - 195.88.183.255 ro 195.88.184.0 - 195.88.185.255 ru 195.88.186.0 - 195.88.187.255 pl @@ -109851,20 +90858,15 @@ 195.88.194.0 - 195.88.195.255 fr 195.88.196.0 - 195.88.201.255 ru 195.88.202.0 - 195.88.203.255 nl -195.88.204.0 - 195.88.205.255 ro -195.88.206.0 - 195.88.211.255 ru +195.88.206.0 - 195.88.209.255 ru 195.88.212.0 - 195.88.213.255 hr 195.88.214.0 - 195.88.215.255 uz 195.88.216.0 - 195.88.217.255 rs -195.88.218.0 - 195.88.219.255 ro 195.88.220.0 - 195.88.221.255 ru 195.88.222.0 - 195.88.223.255 kw 195.88.224.0 - 195.88.225.255 ru -195.88.226.0 - 195.88.227.255 md 195.88.228.0 - 195.88.229.255 gb -195.88.230.0 - 195.88.231.255 ua 195.88.232.0 - 195.88.233.255 pl -195.88.234.0 - 195.88.235.255 il 195.88.236.0 - 195.88.237.255 gb 195.88.238.0 - 195.88.239.255 at 195.88.240.0 - 195.88.241.255 ru @@ -109877,27 +90879,34 @@ 195.88.254.0 - 195.88.255.255 am 195.89.0.0 - 195.89.19.255 gb 195.89.20.0 - 195.89.21.255 us -195.89.22.0 - 195.89.245.103 gb +195.89.22.0 - 195.89.51.255 gb +195.89.52.0 - 195.89.53.79 fr +195.89.53.80 - 195.89.53.255 gb +195.89.54.0 - 195.89.54.159 es +195.89.54.160 - 195.89.55.255 gb +195.89.56.0 - 195.89.56.255 de +195.89.57.0 - 195.89.57.239 it +195.89.57.240 - 195.89.57.248 gb +195.89.57.249 - 195.89.57.249 it +195.89.57.250 - 195.89.57.255 gb +195.89.58.0 - 195.89.58.63 ch +195.89.58.64 - 195.89.58.255 gb +195.89.59.0 - 195.89.59.255 nl +195.89.60.0 - 195.89.60.79 se +195.89.60.80 - 195.89.60.255 gb +195.89.61.0 - 195.89.61.31 de +195.89.61.32 - 195.89.245.95 gb +195.89.245.96 - 195.89.245.103 ie 195.89.245.104 - 195.89.245.111 dk 195.89.245.112 - 195.89.255.255 gb -195.90.0.0 - 195.90.5.255 de -195.90.6.0 - 195.90.6.255 ch -195.90.7.0 - 195.90.31.255 de -195.90.32.0 - 195.90.32.255 gb -195.90.33.0 - 195.90.33.255 us -195.90.34.0 - 195.90.35.255 fr -195.90.36.0 - 195.90.36.255 be -195.90.37.0 - 195.90.47.79 us -195.90.47.80 - 195.90.47.159 ca -195.90.47.160 - 195.90.63.255 us -195.90.64.0 - 195.90.67.95 nl -195.90.67.96 - 195.90.67.111 il -195.90.67.112 - 195.90.75.255 nl +195.90.0.0 - 195.90.31.255 de +195.90.32.0 - 195.90.63.255 us +195.90.64.0 - 195.90.75.255 nl 195.90.76.0 - 195.90.79.127 be 195.90.79.128 - 195.90.82.255 nl 195.90.83.0 - 195.90.86.255 be 195.90.87.0 - 195.90.95.255 nl -195.90.96.0 - 195.90.99.255 gb +195.90.96.0 - 195.90.97.255 gb 195.90.100.0 - 195.90.101.255 dk 195.90.102.0 - 195.90.103.255 pl 195.90.104.0 - 195.90.105.255 se @@ -109905,10 +90914,7 @@ 195.90.108.0 - 195.90.109.255 it 195.90.110.0 - 195.90.111.255 ro 195.90.112.0 - 195.90.113.255 ch -195.90.114.0 - 195.90.115.255 ro -195.90.116.0 - 195.90.117.255 ch -195.90.118.0 - 195.90.121.255 gb -195.90.122.0 - 195.90.123.255 ua +195.90.120.0 - 195.90.121.255 gb 195.90.124.0 - 195.90.125.255 ro 195.90.126.0 - 195.90.127.255 pl 195.90.128.0 - 195.90.191.255 ru @@ -109935,7 +90941,6 @@ 195.93.154.0 - 195.93.155.255 ua 195.93.156.0 - 195.93.157.255 gb 195.93.158.0 - 195.93.159.255 de -195.93.160.0 - 195.93.161.255 ua 195.93.162.0 - 195.93.163.255 pl 195.93.164.0 - 195.93.165.255 ru 195.93.166.0 - 195.93.167.255 de @@ -109943,24 +90948,20 @@ 195.93.170.0 - 195.93.171.255 es 195.93.172.0 - 195.93.173.255 ua 195.93.174.0 - 195.93.175.255 at -195.93.176.0 - 195.93.177.255 ro 195.93.178.0 - 195.93.179.255 pl 195.93.180.0 - 195.93.181.255 ru 195.93.182.0 - 195.93.183.255 de -195.93.184.0 - 195.93.185.255 ua 195.93.186.0 - 195.93.189.255 ru 195.93.190.0 - 195.93.191.255 ua 195.93.192.0 - 195.93.193.255 dk 195.93.194.0 - 195.93.195.255 at 195.93.196.0 - 195.93.197.255 eu -195.93.198.0 - 195.93.199.255 ro -195.93.200.0 - 195.93.201.255 de +195.93.198.0 - 195.93.201.255 de 195.93.202.0 - 195.93.203.255 pl 195.93.204.0 - 195.93.205.255 ua 195.93.206.0 - 195.93.207.255 ru -195.93.208.0 - 195.93.209.255 kz 195.93.210.0 - 195.93.211.255 es -195.93.212.0 - 195.93.215.255 ua +195.93.212.0 - 195.93.213.255 ua 195.93.216.0 - 195.93.217.255 cz 195.93.218.0 - 195.93.219.255 md 195.93.220.0 - 195.93.221.255 at @@ -109982,18 +90983,18 @@ 195.94.0.0 - 195.94.31.255 ye 195.94.32.0 - 195.94.63.255 ch 195.94.64.0 - 195.94.95.255 de -195.94.96.0 - 195.94.127.255 fi +195.94.96.0 - 195.94.107.255 fi +195.94.108.0 - 195.94.111.255 ch +195.94.112.0 - 195.94.127.255 gb 195.94.128.0 - 195.94.191.255 it 195.94.192.0 - 195.94.223.255 pl 195.94.224.0 - 195.94.255.255 ru 195.95.0.0 - 195.95.127.255 be -195.95.128.0 - 195.95.128.255 ro 195.95.129.0 - 195.95.129.255 pl -195.95.130.0 - 195.95.130.255 cm 195.95.131.0 - 195.95.131.255 gb 195.95.132.0 - 195.95.132.255 ch 195.95.133.0 - 195.95.133.255 gb -195.95.134.0 - 195.95.135.255 fr +195.95.135.0 - 195.95.135.255 fr 195.95.136.0 - 195.95.136.255 be 195.95.137.0 - 195.95.137.255 de 195.95.138.0 - 195.95.138.255 cy @@ -110008,12 +91009,11 @@ 195.95.147.0 - 195.95.147.255 ua 195.95.148.0 - 195.95.148.255 ch 195.95.149.0 - 195.95.149.255 tr -195.95.150.0 - 195.95.150.255 gb +195.95.150.0 - 195.95.150.255 nl 195.95.151.0 - 195.95.151.255 ua 195.95.152.0 - 195.95.152.255 ro 195.95.153.0 - 195.95.153.255 es 195.95.154.0 - 195.95.154.255 pl -195.95.155.0 - 195.95.155.255 ru 195.95.156.0 - 195.95.156.255 es 195.95.157.0 - 195.95.157.255 ua 195.95.158.0 - 195.95.158.255 si @@ -110030,7 +91030,7 @@ 195.95.172.0 - 195.95.172.255 dk 195.95.173.0 - 195.95.173.255 si 195.95.174.0 - 195.95.175.255 nl -195.95.176.0 - 195.95.176.255 at +195.95.176.0 - 195.95.176.255 pl 195.95.177.0 - 195.95.177.255 nl 195.95.178.0 - 195.95.178.255 ro 195.95.179.0 - 195.95.179.255 tr @@ -110039,7 +91039,6 @@ 195.95.182.0 - 195.95.182.255 pl 195.95.183.0 - 195.95.183.255 il 195.95.184.0 - 195.95.184.255 se -195.95.185.0 - 195.95.185.255 ua 195.95.186.0 - 195.95.186.255 pl 195.95.187.0 - 195.95.187.255 gb 195.95.188.0 - 195.95.188.255 pl @@ -110048,14 +91047,13 @@ 195.95.192.0 - 195.95.195.255 eu 195.95.196.0 - 195.95.197.255 be 195.95.198.0 - 195.95.199.255 nl -195.95.200.0 - 195.95.201.255 ru 195.95.202.0 - 195.95.203.255 ua 195.95.204.0 - 195.95.205.255 sk 195.95.206.0 - 195.95.207.255 ua 195.95.208.0 - 195.95.209.255 fi 195.95.210.0 - 195.95.211.255 ua 195.95.212.0 - 195.95.218.255 ru -195.95.219.0 - 195.95.219.255 ch +195.95.219.0 - 195.95.219.255 ae 195.95.220.0 - 195.95.221.255 de 195.95.222.0 - 195.95.223.255 ua 195.95.224.0 - 195.95.225.255 fr @@ -110067,30 +91065,15 @@ 195.95.236.0 - 195.95.237.255 pt 195.95.238.0 - 195.95.243.255 dk 195.95.244.0 - 195.95.249.255 nl -195.95.250.0 - 195.95.251.255 dk 195.95.252.0 - 195.95.253.255 ru 195.95.254.0 - 195.95.255.255 ro 195.96.0.0 - 195.96.31.255 at 195.96.32.0 - 195.96.63.255 de 195.96.64.0 - 195.96.95.255 ru 195.96.96.0 - 195.96.127.255 nl -195.96.128.0 - 195.96.128.31 a2 -195.96.128.32 - 195.96.128.63 it -195.96.128.64 - 195.96.139.15 a2 -195.96.139.16 - 195.96.139.31 ir -195.96.139.32 - 195.96.143.255 a2 -195.96.144.0 - 195.96.144.255 iq -195.96.145.0 - 195.96.145.31 lb -195.96.145.32 - 195.96.145.255 a2 -195.96.146.0 - 195.96.147.255 lb -195.96.148.0 - 195.96.148.255 iq -195.96.149.0 - 195.96.149.255 ir -195.96.150.0 - 195.96.151.255 iq -195.96.152.0 - 195.96.154.255 a2 -195.96.155.0 - 195.96.155.63 lb -195.96.155.64 - 195.96.157.255 a2 -195.96.158.0 - 195.96.158.255 iq -195.96.159.0 - 195.96.159.255 a2 +195.96.128.0 - 195.96.147.255 a2 +195.96.148.0 - 195.96.151.255 iq +195.96.152.0 - 195.96.159.255 a2 195.96.160.0 - 195.96.191.255 ru 195.96.192.0 - 195.96.223.255 it 195.96.224.0 - 195.96.255.255 bg @@ -110104,49 +91087,21 @@ 195.98.160.0 - 195.98.191.255 ru 195.98.192.0 - 195.98.223.255 de 195.98.224.0 - 195.98.255.255 fr -195.99.0.0 - 195.99.37.255 gb -195.99.38.0 - 195.99.39.255 nl -195.99.40.0 - 195.99.63.255 gb +195.99.0.0 - 195.99.63.255 gb 195.99.64.0 - 195.99.79.255 nl -195.99.80.0 - 195.99.225.255 gb -195.99.226.0 - 195.99.226.255 fr -195.99.227.0 - 195.99.255.255 gb -195.100.0.0 - 195.100.0.31 se -195.100.0.32 - 195.100.0.47 es -195.100.0.48 - 195.100.17.255 se -195.100.18.0 - 195.100.22.255 es -195.100.23.0 - 195.100.23.255 se -195.100.24.0 - 195.100.29.255 es -195.100.30.0 - 195.100.31.255 se -195.100.32.0 - 195.100.32.63 nl -195.100.32.64 - 195.100.35.255 se -195.100.36.0 - 195.100.36.7 de -195.100.36.8 - 195.100.36.215 se -195.100.36.216 - 195.100.36.223 de -195.100.36.224 - 195.100.55.255 se -195.100.56.0 - 195.100.57.255 nl -195.100.58.0 - 195.100.198.223 se -195.100.198.224 - 195.100.198.239 de -195.100.198.240 - 195.100.224.47 se -195.100.224.48 - 195.100.224.55 dk -195.100.224.56 - 195.100.224.111 se -195.100.224.112 - 195.100.224.127 dk -195.100.224.128 - 195.100.255.255 se -195.101.0.0 - 195.101.173.255 fr -195.101.174.0 - 195.101.174.255 gb -195.101.175.0 - 195.101.175.31 fr -195.101.175.32 - 195.101.175.63 gb -195.101.175.64 - 195.101.219.191 fr -195.101.219.192 - 195.101.219.255 mc -195.101.220.0 - 195.101.255.255 fr +195.99.80.0 - 195.99.255.255 gb +195.100.0.0 - 195.100.255.255 se +195.101.0.0 - 195.101.255.255 fr 195.102.0.0 - 195.102.255.255 gb 195.103.0.0 - 195.103.255.255 it 195.104.0.0 - 195.107.255.255 gb -195.108.0.0 - 195.109.172.215 nl -195.109.172.216 - 195.109.172.223 a2 -195.109.172.224 - 195.109.255.255 nl -195.110.0.0 - 195.110.1.255 ro -195.110.2.0 - 195.110.3.255 ru +195.108.0.0 - 195.108.0.255 nl +195.108.1.0 - 195.108.1.255 eu +195.108.2.0 - 195.109.62.255 nl +195.109.63.0 - 195.109.63.16 be +195.109.63.17 - 195.109.63.17 nl +195.109.63.18 - 195.109.63.255 be +195.109.64.0 - 195.109.255.255 nl 195.110.4.0 - 195.110.5.255 ro 195.110.6.0 - 195.110.7.255 ua 195.110.8.0 - 195.110.11.255 gb @@ -110154,7 +91109,6 @@ 195.110.14.0 - 195.110.15.255 de 195.110.16.0 - 195.110.17.255 dk 195.110.18.0 - 195.110.21.255 de -195.110.22.0 - 195.110.23.255 nl 195.110.24.0 - 195.110.25.255 bg 195.110.26.0 - 195.110.27.255 de 195.110.28.0 - 195.110.29.255 no @@ -110164,7 +91118,7 @@ 195.110.36.0 - 195.110.37.255 gb 195.110.38.0 - 195.110.39.255 ir 195.110.40.0 - 195.110.41.255 il -195.110.42.0 - 195.110.43.255 es +195.110.42.0 - 195.110.43.255 de 195.110.44.0 - 195.110.45.255 se 195.110.46.0 - 195.110.47.255 ru 195.110.48.0 - 195.110.51.255 pl @@ -110174,2468 +91128,143 @@ 195.110.58.0 - 195.110.59.255 lt 195.110.60.0 - 195.110.61.255 de 195.110.62.0 - 195.110.63.255 ru -195.110.64.0 - 195.110.65.255 gb -195.110.66.0 - 195.110.66.255 de -195.110.67.0 - 195.110.72.191 gb -195.110.72.192 - 195.110.72.223 nl -195.110.72.224 - 195.110.81.95 gb -195.110.81.96 - 195.110.81.127 lu -195.110.81.128 - 195.110.83.239 gb -195.110.83.240 - 195.110.83.255 fr -195.110.84.0 - 195.110.85.255 gb -195.110.86.0 - 195.110.86.127 us -195.110.86.128 - 195.110.93.47 gb -195.110.93.48 - 195.110.93.63 us -195.110.93.64 - 195.110.93.207 gb +195.110.64.0 - 195.110.93.207 gb 195.110.93.208 - 195.110.93.223 es 195.110.93.224 - 195.110.95.255 gb 195.110.96.0 - 195.110.159.255 it 195.110.160.0 - 195.110.191.255 gb 195.110.192.0 - 195.110.223.255 at 195.110.224.0 - 195.110.255.255 fr -195.111.0.0 - 195.111.132.255 hu -195.111.133.0 - 195.111.133.255 sk -195.111.134.0 - 195.111.255.255 hu +195.111.0.0 - 195.111.255.255 hu 195.112.0.0 - 195.112.63.255 gb 195.112.64.0 - 195.112.95.255 ch 195.112.96.0 - 195.112.127.255 ru 195.112.128.0 - 195.112.159.255 tr -195.112.160.0 - 195.112.160.7 de -195.112.160.8 - 195.112.160.11 dk -195.112.160.12 - 195.112.160.15 de -195.112.160.16 - 195.112.160.19 tr -195.112.160.20 - 195.112.160.39 de -195.112.160.40 - 195.112.160.43 gb -195.112.160.44 - 195.112.160.47 de -195.112.160.48 - 195.112.160.51 es -195.112.160.52 - 195.112.160.55 ch -195.112.160.56 - 195.112.160.59 de -195.112.160.60 - 195.112.160.63 nl -195.112.160.64 - 195.112.160.67 fr -195.112.160.68 - 195.112.160.71 nl -195.112.160.72 - 195.112.160.75 de -195.112.160.76 - 195.112.160.79 pt -195.112.160.80 - 195.112.160.83 es -195.112.160.84 - 195.112.160.87 nl -195.112.160.88 - 195.112.160.91 ch -195.112.160.92 - 195.112.160.95 de -195.112.160.96 - 195.112.160.107 it -195.112.160.108 - 195.112.160.111 fr -195.112.160.112 - 195.112.160.115 de -195.112.160.116 - 195.112.160.119 fr -195.112.160.120 - 195.112.160.123 de -195.112.160.124 - 195.112.160.127 fr -195.112.160.128 - 195.112.160.131 li -195.112.160.132 - 195.112.160.135 it -195.112.160.136 - 195.112.160.139 at -195.112.160.140 - 195.112.160.143 gr -195.112.160.144 - 195.112.160.151 ch -195.112.160.152 - 195.112.160.155 pl -195.112.160.156 - 195.112.160.163 fr -195.112.160.164 - 195.112.160.167 nl -195.112.160.168 - 195.112.160.171 at -195.112.160.172 - 195.112.160.175 fr -195.112.160.176 - 195.112.160.179 es -195.112.160.180 - 195.112.160.187 de -195.112.160.188 - 195.112.160.191 es -195.112.160.192 - 195.112.160.195 de -195.112.160.196 - 195.112.160.199 gb -195.112.160.200 - 195.112.160.203 de -195.112.160.204 - 195.112.160.211 fr -195.112.160.212 - 195.112.160.223 de -195.112.160.224 - 195.112.160.227 ch -195.112.160.228 - 195.112.160.231 de -195.112.160.232 - 195.112.160.235 nl -195.112.160.236 - 195.112.160.239 fr -195.112.160.240 - 195.112.160.243 de -195.112.160.244 - 195.112.160.247 es -195.112.160.248 - 195.112.160.251 dk -195.112.160.252 - 195.112.160.255 bh -195.112.161.0 - 195.112.161.7 fr -195.112.161.8 - 195.112.161.11 de -195.112.161.12 - 195.112.161.15 fr -195.112.161.16 - 195.112.161.31 de -195.112.161.32 - 195.112.161.35 at -195.112.161.36 - 195.112.161.39 gb -195.112.161.40 - 195.112.161.43 ch -195.112.161.44 - 195.112.161.47 de -195.112.161.48 - 195.112.161.51 ch -195.112.161.52 - 195.112.161.55 gb -195.112.161.56 - 195.112.161.59 de -195.112.161.60 - 195.112.161.63 fr -195.112.161.64 - 195.112.161.67 si -195.112.161.68 - 195.112.161.71 de -195.112.161.72 - 195.112.161.75 it -195.112.161.76 - 195.112.161.79 de -195.112.161.80 - 195.112.161.83 it -195.112.161.84 - 195.112.161.87 gb -195.112.161.88 - 195.112.161.91 es -195.112.161.92 - 195.112.161.95 fr -195.112.161.96 - 195.112.161.99 de -195.112.161.100 - 195.112.161.103 nl -195.112.161.104 - 195.112.161.111 de -195.112.161.112 - 195.112.161.115 ch -195.112.161.116 - 195.112.161.119 de -195.112.161.120 - 195.112.161.123 nl -195.112.161.124 - 195.112.161.127 es -195.112.161.128 - 195.112.161.131 nl -195.112.161.132 - 195.112.161.135 de -195.112.161.136 - 195.112.161.139 se -195.112.161.140 - 195.112.161.143 it -195.112.161.144 - 195.112.161.147 de -195.112.161.148 - 195.112.161.155 nl -195.112.161.156 - 195.112.161.159 fr -195.112.161.160 - 195.112.161.163 no -195.112.161.164 - 195.112.161.167 dk -195.112.161.168 - 195.112.161.187 de -195.112.161.188 - 195.112.161.191 hu -195.112.161.192 - 195.112.161.195 cy -195.112.161.196 - 195.112.161.199 fr -195.112.161.200 - 195.112.161.207 de -195.112.161.208 - 195.112.161.211 cz -195.112.161.212 - 195.112.161.215 de -195.112.161.216 - 195.112.161.219 gb -195.112.161.220 - 195.112.161.223 ch -195.112.161.224 - 195.112.161.227 de -195.112.161.228 - 195.112.161.231 dk -195.112.161.232 - 195.112.161.235 de -195.112.161.236 - 195.112.161.239 it -195.112.161.240 - 195.112.161.243 at -195.112.161.244 - 195.112.161.247 nl -195.112.161.248 - 195.112.161.251 dk -195.112.161.252 - 195.112.162.3 fr -195.112.162.4 - 195.112.162.7 de -195.112.162.8 - 195.112.162.11 nl -195.112.162.12 - 195.112.162.15 gb -195.112.162.16 - 195.112.162.19 de -195.112.162.20 - 195.112.162.23 gb -195.112.162.24 - 195.112.162.35 de -195.112.162.36 - 195.112.162.39 ch -195.112.162.40 - 195.112.162.43 gb -195.112.162.44 - 195.112.162.47 at -195.112.162.48 - 195.112.162.51 it -195.112.162.52 - 195.112.162.55 fr -195.112.162.56 - 195.112.162.59 no -195.112.162.60 - 195.112.162.63 de -195.112.162.64 - 195.112.162.67 ch -195.112.162.68 - 195.112.162.71 de -195.112.162.72 - 195.112.162.75 it -195.112.162.76 - 195.112.162.79 es -195.112.162.80 - 195.112.162.83 fr -195.112.162.84 - 195.112.162.91 de -195.112.162.92 - 195.112.162.95 ch -195.112.162.96 - 195.112.162.99 nl -195.112.162.100 - 195.112.162.103 be -195.112.162.104 - 195.112.162.107 es -195.112.162.108 - 195.112.162.111 ch -195.112.162.112 - 195.112.162.115 it -195.112.162.116 - 195.112.162.119 fr -195.112.162.120 - 195.112.162.127 de -195.112.162.128 - 195.112.162.131 ch -195.112.162.132 - 195.112.162.135 de -195.112.162.136 - 195.112.162.139 gb -195.112.162.140 - 195.112.162.143 fr -195.112.162.144 - 195.112.162.147 gb -195.112.162.148 - 195.112.162.151 se -195.112.162.152 - 195.112.162.155 gb -195.112.162.156 - 195.112.162.159 it -195.112.162.160 - 195.112.162.163 be -195.112.162.164 - 195.112.162.167 es -195.112.162.168 - 195.112.162.171 de -195.112.162.172 - 195.112.162.175 gr -195.112.162.176 - 195.112.162.179 de -195.112.162.180 - 195.112.162.183 it -195.112.162.184 - 195.112.162.191 gb -195.112.162.192 - 195.112.162.195 es -195.112.162.196 - 195.112.162.203 de -195.112.162.204 - 195.112.162.207 gb -195.112.162.208 - 195.112.162.211 it -195.112.162.212 - 195.112.162.215 fr -195.112.162.216 - 195.112.162.219 de -195.112.162.220 - 195.112.162.223 hu -195.112.162.224 - 195.112.162.227 ch -195.112.162.228 - 195.112.162.231 de -195.112.162.232 - 195.112.162.235 pt -195.112.162.236 - 195.112.162.239 de -195.112.162.240 - 195.112.162.247 it -195.112.162.248 - 195.112.162.251 de -195.112.162.252 - 195.112.162.255 nl -195.112.163.0 - 195.112.163.7 fr -195.112.163.8 - 195.112.163.11 es -195.112.163.12 - 195.112.163.15 de -195.112.163.16 - 195.112.163.23 fr -195.112.163.24 - 195.112.163.31 gb -195.112.163.32 - 195.112.163.39 de -195.112.163.40 - 195.112.163.43 sk -195.112.163.44 - 195.112.163.47 de -195.112.163.48 - 195.112.163.55 gb -195.112.163.56 - 195.112.163.59 ch -195.112.163.60 - 195.112.163.63 gr -195.112.163.64 - 195.112.163.67 it -195.112.163.68 - 195.112.163.71 de -195.112.163.72 - 195.112.163.75 fr -195.112.163.76 - 195.112.163.79 gb -195.112.163.80 - 195.112.163.87 de -195.112.163.88 - 195.112.163.91 be -195.112.163.92 - 195.112.163.95 de -195.112.163.96 - 195.112.163.99 nl -195.112.163.100 - 195.112.163.107 fr -195.112.163.108 - 195.112.163.111 at -195.112.163.112 - 195.112.163.115 fr -195.112.163.116 - 195.112.163.119 de -195.112.163.120 - 195.112.163.123 es -195.112.163.124 - 195.112.163.127 nl -195.112.163.128 - 195.112.163.131 ie -195.112.163.132 - 195.112.163.135 ru -195.112.163.136 - 195.112.163.139 es -195.112.163.140 - 195.112.163.143 nl -195.112.163.144 - 195.112.163.147 it -195.112.163.148 - 195.112.163.151 cy -195.112.163.152 - 195.112.163.155 de -195.112.163.156 - 195.112.163.159 hu -195.112.163.160 - 195.112.163.167 de -195.112.163.168 - 195.112.163.175 fr -195.112.163.176 - 195.112.163.183 de -195.112.163.184 - 195.112.163.187 es -195.112.163.188 - 195.112.163.195 de -195.112.163.196 - 195.112.163.199 ch -195.112.163.200 - 195.112.163.203 de -195.112.163.204 - 195.112.163.207 it -195.112.163.208 - 195.112.163.211 is -195.112.163.212 - 195.112.163.215 de -195.112.163.216 - 195.112.163.219 it -195.112.163.220 - 195.112.163.223 de -195.112.163.224 - 195.112.163.227 ch -195.112.163.228 - 195.112.163.231 fr -195.112.163.232 - 195.112.163.235 de -195.112.163.236 - 195.112.163.239 nl -195.112.163.240 - 195.112.163.251 de -195.112.163.252 - 195.112.163.255 nl -195.112.164.0 - 195.112.164.11 us -195.112.164.12 - 195.112.164.15 ar -195.112.164.16 - 195.112.164.19 es -195.112.164.20 - 195.112.164.47 us -195.112.164.48 - 195.112.164.51 gu -195.112.164.52 - 195.112.164.59 us -195.112.164.60 - 195.112.164.63 cl -195.112.164.64 - 195.112.164.123 us -195.112.164.124 - 195.112.164.127 br -195.112.164.128 - 195.112.164.135 ar -195.112.164.136 - 195.112.164.143 us -195.112.164.144 - 195.112.164.147 co -195.112.164.148 - 195.112.164.155 us -195.112.164.156 - 195.112.164.159 ar -195.112.164.160 - 195.112.164.171 us -195.112.164.172 - 195.112.164.175 mx -195.112.164.176 - 195.112.164.179 us -195.112.164.180 - 195.112.164.183 ar -195.112.164.184 - 195.112.164.187 us -195.112.164.188 - 195.112.164.191 ca -195.112.164.192 - 195.112.164.195 us -195.112.164.196 - 195.112.164.199 br -195.112.164.200 - 195.112.164.203 ca -195.112.164.204 - 195.112.164.215 us -195.112.164.216 - 195.112.164.219 br -195.112.164.220 - 195.112.164.243 us -195.112.164.244 - 195.112.164.247 br -195.112.164.248 - 195.112.164.255 us -195.112.165.0 - 195.112.165.3 de -195.112.165.4 - 195.112.165.7 gb -195.112.165.8 - 195.112.165.11 de -195.112.165.12 - 195.112.165.15 ch -195.112.165.16 - 195.112.165.23 de -195.112.165.24 - 195.112.165.27 zw -195.112.165.28 - 195.112.165.31 ie -195.112.165.32 - 195.112.165.35 gb -195.112.165.36 - 195.112.165.47 de -195.112.165.48 - 195.112.165.51 it -195.112.165.52 - 195.112.165.55 de -195.112.165.56 - 195.112.165.59 pl -195.112.165.60 - 195.112.165.67 de -195.112.165.68 - 195.112.165.71 dk -195.112.165.72 - 195.112.165.75 cy -195.112.165.76 - 195.112.165.79 de -195.112.165.80 - 195.112.165.83 pl -195.112.165.84 - 195.112.165.87 be -195.112.165.88 - 195.112.165.91 it -195.112.165.92 - 195.112.165.99 nl -195.112.165.100 - 195.112.165.103 de -195.112.165.104 - 195.112.165.107 ch -195.112.165.108 - 195.112.165.111 es -195.112.165.112 - 195.112.165.119 de -195.112.165.120 - 195.112.165.123 lu -195.112.165.124 - 195.112.165.131 nl -195.112.165.132 - 195.112.165.135 lu -195.112.165.136 - 195.112.165.139 fr -195.112.165.140 - 195.112.165.143 de -195.112.165.144 - 195.112.165.147 be -195.112.165.148 - 195.112.165.163 de -195.112.165.164 - 195.112.165.167 it -195.112.165.168 - 195.112.165.171 de -195.112.165.172 - 195.112.165.175 fr -195.112.165.176 - 195.112.165.179 pt -195.112.165.180 - 195.112.165.183 es -195.112.165.184 - 195.112.165.187 de -195.112.165.188 - 195.112.165.191 nl -195.112.165.192 - 195.112.165.195 it -195.112.165.196 - 195.112.165.199 lu -195.112.165.200 - 195.112.165.203 ao -195.112.165.204 - 195.112.165.207 nl -195.112.165.208 - 195.112.165.211 gb -195.112.165.212 - 195.112.165.215 de -195.112.165.216 - 195.112.165.219 dk +195.112.160.0 - 195.112.165.219 de 195.112.165.220 - 195.112.165.223 fr -195.112.165.224 - 195.112.165.239 de -195.112.165.240 - 195.112.165.243 gb -195.112.165.244 - 195.112.165.247 dk -195.112.165.248 - 195.112.165.251 de -195.112.165.252 - 195.112.165.255 ua -195.112.166.0 - 195.112.166.3 fr -195.112.166.4 - 195.112.166.7 de -195.112.166.8 - 195.112.166.11 fr -195.112.166.12 - 195.112.166.15 tr -195.112.166.16 - 195.112.166.19 it -195.112.166.20 - 195.112.166.23 gb -195.112.166.24 - 195.112.166.31 fr -195.112.166.32 - 195.112.166.35 gr -195.112.166.36 - 195.112.166.39 fr -195.112.166.40 - 195.112.166.43 de -195.112.166.44 - 195.112.166.47 fr -195.112.166.48 - 195.112.166.51 gr -195.112.166.52 - 195.112.166.55 tr -195.112.166.56 - 195.112.166.59 ke -195.112.166.60 - 195.112.166.63 tr -195.112.166.64 - 195.112.166.67 cy -195.112.166.68 - 195.112.166.75 tr -195.112.166.76 - 195.112.166.79 mc -195.112.166.80 - 195.112.166.83 de -195.112.166.84 - 195.112.166.87 at -195.112.166.88 - 195.112.166.91 ru -195.112.166.92 - 195.112.166.95 hu -195.112.166.96 - 195.112.166.99 gb -195.112.166.100 - 195.112.166.103 es -195.112.166.104 - 195.112.166.107 gr -195.112.166.108 - 195.112.166.111 de -195.112.166.112 - 195.112.166.115 fr -195.112.166.116 - 195.112.166.119 gr -195.112.166.120 - 195.112.166.123 es -195.112.166.124 - 195.112.166.127 it -195.112.166.128 - 195.112.166.131 gr -195.112.166.132 - 195.112.166.135 fr -195.112.166.136 - 195.112.166.139 be -195.112.166.140 - 195.112.166.143 de -195.112.166.144 - 195.112.166.147 es -195.112.166.148 - 195.112.166.151 de -195.112.166.152 - 195.112.166.155 es -195.112.166.156 - 195.112.166.159 gb -195.112.166.160 - 195.112.166.167 de -195.112.166.168 - 195.112.166.171 nl -195.112.166.172 - 195.112.166.175 de -195.112.166.176 - 195.112.166.179 hu -195.112.166.180 - 195.112.166.187 de -195.112.166.188 - 195.112.166.191 fr -195.112.166.192 - 195.112.166.195 it -195.112.166.196 - 195.112.166.199 be -195.112.166.200 - 195.112.166.203 ch -195.112.166.204 - 195.112.166.207 de -195.112.166.208 - 195.112.166.211 fr -195.112.166.212 - 195.112.166.215 gb -195.112.166.216 - 195.112.166.219 it -195.112.166.220 - 195.112.166.223 ch -195.112.166.224 - 195.112.166.227 es -195.112.166.228 - 195.112.166.231 it -195.112.166.232 - 195.112.166.235 es -195.112.166.236 - 195.112.166.239 de -195.112.166.240 - 195.112.166.243 pl -195.112.166.244 - 195.112.166.251 es -195.112.166.252 - 195.112.166.255 it -195.112.167.0 - 195.112.167.3 hk -195.112.167.4 - 195.112.167.7 my -195.112.167.8 - 195.112.167.11 th -195.112.167.12 - 195.112.167.19 sg -195.112.167.20 - 195.112.167.23 cn -195.112.167.24 - 195.112.167.27 sg -195.112.167.28 - 195.112.167.31 in -195.112.167.32 - 195.112.167.35 my -195.112.167.36 - 195.112.167.39 sg -195.112.167.40 - 195.112.167.43 tw -195.112.167.44 - 195.112.167.47 sg -195.112.167.48 - 195.112.167.51 my -195.112.167.52 - 195.112.167.55 sg -195.112.167.56 - 195.112.167.59 cn -195.112.167.60 - 195.112.167.63 my -195.112.167.64 - 195.112.167.67 tw -195.112.167.68 - 195.112.167.75 my -195.112.167.76 - 195.112.167.79 th -195.112.167.80 - 195.112.167.83 de -195.112.167.84 - 195.112.167.87 cn -195.112.167.88 - 195.112.167.91 sg -195.112.167.92 - 195.112.167.95 my -195.112.167.96 - 195.112.167.107 sg -195.112.167.108 - 195.112.167.111 id -195.112.167.112 - 195.112.167.155 sg -195.112.167.156 - 195.112.167.163 cn -195.112.167.164 - 195.112.167.167 tw -195.112.167.168 - 195.112.167.179 sg -195.112.167.180 - 195.112.167.187 my -195.112.167.188 - 195.112.167.191 sg -195.112.167.192 - 195.112.167.195 in -195.112.167.196 - 195.112.167.199 sg -195.112.167.200 - 195.112.167.203 my -195.112.167.204 - 195.112.167.223 sg -195.112.167.224 - 195.112.167.227 tw -195.112.167.228 - 195.112.167.231 bd -195.112.167.232 - 195.112.167.235 sg -195.112.167.236 - 195.112.167.239 in -195.112.167.240 - 195.112.167.247 my -195.112.167.248 - 195.112.167.251 in -195.112.167.252 - 195.112.167.255 ph -195.112.168.0 - 195.112.168.3 gr -195.112.168.4 - 195.112.168.7 ch -195.112.168.8 - 195.112.168.11 dk -195.112.168.12 - 195.112.168.15 fr -195.112.168.16 - 195.112.168.19 gb -195.112.168.20 - 195.112.168.23 ch -195.112.168.24 - 195.112.168.27 de -195.112.168.28 - 195.112.168.35 gb -195.112.168.36 - 195.112.168.51 de -195.112.168.52 - 195.112.168.55 pt -195.112.168.56 - 195.112.168.59 nl -195.112.168.60 - 195.112.168.63 gb -195.112.168.64 - 195.112.168.67 ch -195.112.168.68 - 195.112.168.71 de -195.112.168.72 - 195.112.168.75 ch -195.112.168.76 - 195.112.168.79 es -195.112.168.80 - 195.112.168.83 cy -195.112.168.84 - 195.112.168.87 de -195.112.168.88 - 195.112.168.91 fr -195.112.168.92 - 195.112.168.95 it -195.112.168.96 - 195.112.168.99 be -195.112.168.100 - 195.112.168.103 de -195.112.168.104 - 195.112.168.107 es -195.112.168.108 - 195.112.168.115 de -195.112.168.116 - 195.112.168.119 gb -195.112.168.120 - 195.112.168.123 ch -195.112.168.124 - 195.112.168.131 nl -195.112.168.132 - 195.112.168.135 de -195.112.168.136 - 195.112.168.139 it -195.112.168.140 - 195.112.168.143 fr -195.112.168.144 - 195.112.168.147 de -195.112.168.148 - 195.112.168.151 ch -195.112.168.152 - 195.112.168.155 it -195.112.168.156 - 195.112.168.159 de -195.112.168.160 - 195.112.168.163 nl -195.112.168.164 - 195.112.168.167 es -195.112.168.168 - 195.112.168.175 de -195.112.168.176 - 195.112.168.179 nl -195.112.168.180 - 195.112.168.187 de -195.112.168.188 - 195.112.168.195 gb +195.112.165.224 - 195.112.166.67 de +195.112.166.68 - 195.112.166.71 tr +195.112.166.72 - 195.112.167.151 de +195.112.167.152 - 195.112.167.155 sg +195.112.167.156 - 195.112.168.195 de 195.112.168.196 - 195.112.168.199 nl -195.112.168.200 - 195.112.168.203 gr -195.112.168.204 - 195.112.168.207 it -195.112.168.208 - 195.112.168.211 fr -195.112.168.212 - 195.112.168.215 gb -195.112.168.216 - 195.112.168.219 pt -195.112.168.220 - 195.112.168.223 fr -195.112.168.224 - 195.112.168.227 nl -195.112.168.228 - 195.112.168.231 ie -195.112.168.232 - 195.112.168.235 fr -195.112.168.236 - 195.112.168.239 nl -195.112.168.240 - 195.112.168.243 de -195.112.168.244 - 195.112.168.247 fr -195.112.168.248 - 195.112.168.251 it -195.112.168.252 - 195.112.168.252 ch -195.112.168.253 - 195.112.168.255 de -195.112.169.0 - 195.112.169.3 be -195.112.169.4 - 195.112.169.7 de -195.112.169.8 - 195.112.169.11 ch -195.112.169.12 - 195.112.169.15 de -195.112.169.16 - 195.112.169.27 ch -195.112.169.28 - 195.112.169.31 de -195.112.169.32 - 195.112.169.35 gb -195.112.169.36 - 195.112.169.39 de -195.112.169.40 - 195.112.169.43 gb -195.112.169.44 - 195.112.169.47 de -195.112.169.48 - 195.112.169.51 fr -195.112.169.52 - 195.112.169.55 de -195.112.169.56 - 195.112.169.59 es -195.112.169.60 - 195.112.169.63 fr -195.112.169.64 - 195.112.169.67 ch -195.112.169.68 - 195.112.169.71 fr -195.112.169.72 - 195.112.169.75 es -195.112.169.76 - 195.112.169.79 it -195.112.169.80 - 195.112.169.83 nl -195.112.169.84 - 195.112.169.87 fr -195.112.169.88 - 195.112.169.91 dk -195.112.169.92 - 195.112.169.95 fr -195.112.169.96 - 195.112.169.99 de -195.112.169.100 - 195.112.169.107 ch -195.112.169.108 - 195.112.169.115 es -195.112.169.116 - 195.112.169.119 de -195.112.169.120 - 195.112.169.123 ch -195.112.169.124 - 195.112.169.127 es -195.112.169.128 - 195.112.169.135 de -195.112.169.136 - 195.112.169.139 gb -195.112.169.140 - 195.112.169.143 de -195.112.169.144 - 195.112.169.147 at -195.112.169.148 - 195.112.169.155 fr -195.112.169.156 - 195.112.169.163 ch -195.112.169.164 - 195.112.169.171 de -195.112.169.172 - 195.112.169.175 it -195.112.169.176 - 195.112.169.179 fr -195.112.169.180 - 195.112.169.183 be -195.112.169.184 - 195.112.169.187 de -195.112.169.188 - 195.112.169.191 fr -195.112.169.192 - 195.112.169.195 es -195.112.169.196 - 195.112.169.199 pt -195.112.169.200 - 195.112.169.203 it -195.112.169.204 - 195.112.169.207 de -195.112.169.208 - 195.112.169.215 it -195.112.169.216 - 195.112.169.219 gb -195.112.169.220 - 195.112.169.223 be -195.112.169.224 - 195.112.169.227 ch -195.112.169.228 - 195.112.169.231 it -195.112.169.232 - 195.112.169.235 de -195.112.169.236 - 195.112.169.239 fr -195.112.169.240 - 195.112.169.247 it -195.112.169.248 - 195.112.169.255 fr -195.112.170.0 - 195.112.170.7 de -195.112.170.8 - 195.112.170.11 ch -195.112.170.12 - 195.112.170.19 nl -195.112.170.20 - 195.112.170.23 se -195.112.170.24 - 195.112.170.35 de -195.112.170.36 - 195.112.170.39 es -195.112.170.40 - 195.112.170.43 be -195.112.170.44 - 195.112.170.51 es -195.112.170.52 - 195.112.170.55 fr -195.112.170.56 - 195.112.170.59 de -195.112.170.60 - 195.112.170.67 fr -195.112.170.68 - 195.112.170.71 gb -195.112.170.72 - 195.112.170.75 es -195.112.170.76 - 195.112.170.79 de -195.112.170.80 - 195.112.170.87 fr -195.112.170.88 - 195.112.170.91 nl -195.112.170.92 - 195.112.170.95 de -195.112.170.96 - 195.112.170.99 gb -195.112.170.100 - 195.112.170.111 de -195.112.170.112 - 195.112.170.115 ch -195.112.170.116 - 195.112.170.119 gb -195.112.170.120 - 195.112.170.123 nl -195.112.170.124 - 195.112.170.131 de -195.112.170.132 - 195.112.170.135 dk -195.112.170.136 - 195.112.170.143 de -195.112.170.144 - 195.112.170.147 it -195.112.170.148 - 195.112.170.151 de -195.112.170.152 - 195.112.170.155 it -195.112.170.156 - 195.112.170.159 de -195.112.170.160 - 195.112.170.163 ch -195.112.170.164 - 195.112.170.167 it -195.112.170.168 - 195.112.170.175 de -195.112.170.176 - 195.112.170.179 ch -195.112.170.180 - 195.112.170.183 de -195.112.170.184 - 195.112.170.187 pt -195.112.170.188 - 195.112.170.191 nl -195.112.170.192 - 195.112.170.195 ch +195.112.168.200 - 195.112.170.195 de 195.112.170.196 - 195.112.170.199 gb -195.112.170.200 - 195.112.170.203 de -195.112.170.204 - 195.112.170.207 it -195.112.170.208 - 195.112.170.211 ch -195.112.170.212 - 195.112.170.215 es -195.112.170.216 - 195.112.170.219 be -195.112.170.220 - 195.112.170.223 de -195.112.170.224 - 195.112.170.227 it -195.112.170.228 - 195.112.170.231 fr -195.112.170.232 - 195.112.170.239 es -195.112.170.240 - 195.112.170.243 it -195.112.170.244 - 195.112.170.247 de -195.112.170.248 - 195.112.170.251 pt -195.112.170.252 - 195.112.171.3 de -195.112.171.4 - 195.112.171.7 nl -195.112.171.8 - 195.112.171.11 es -195.112.171.12 - 195.112.171.15 fr -195.112.171.16 - 195.112.171.19 nl -195.112.171.20 - 195.112.171.23 fr -195.112.171.24 - 195.112.171.27 it -195.112.171.28 - 195.112.171.31 dk -195.112.171.32 - 195.112.171.35 fr -195.112.171.36 - 195.112.171.39 it -195.112.171.40 - 195.112.171.43 fr -195.112.171.44 - 195.112.171.55 de -195.112.171.56 - 195.112.171.59 it -195.112.171.60 - 195.112.171.63 nl -195.112.171.64 - 195.112.171.67 pt -195.112.171.68 - 195.112.171.71 de -195.112.171.72 - 195.112.171.75 nl -195.112.171.76 - 195.112.171.79 ch -195.112.171.80 - 195.112.171.83 es -195.112.171.84 - 195.112.171.87 gb -195.112.171.88 - 195.112.171.95 de -195.112.171.96 - 195.112.171.99 it -195.112.171.100 - 195.112.171.103 fr -195.112.171.104 - 195.112.171.107 de -195.112.171.108 - 195.112.171.111 it -195.112.171.112 - 195.112.171.115 de -195.112.171.116 - 195.112.171.119 fr -195.112.171.120 - 195.112.171.123 es -195.112.171.124 - 195.112.171.131 de -195.112.171.132 - 195.112.171.135 gb -195.112.171.136 - 195.112.171.139 it -195.112.171.140 - 195.112.171.143 es -195.112.171.144 - 195.112.171.147 it -195.112.171.148 - 195.112.171.155 de -195.112.171.156 - 195.112.171.159 gb -195.112.171.160 - 195.112.171.163 be -195.112.171.164 - 195.112.171.167 dk -195.112.171.168 - 195.112.171.171 fr -195.112.171.172 - 195.112.171.179 de -195.112.171.180 - 195.112.171.183 dk -195.112.171.184 - 195.112.171.191 fr -195.112.171.192 - 195.112.171.199 de -195.112.171.200 - 195.112.171.203 be -195.112.171.204 - 195.112.171.207 nl -195.112.171.208 - 195.112.171.211 gb -195.112.171.212 - 195.112.171.215 de -195.112.171.216 - 195.112.171.223 it -195.112.171.224 - 195.112.171.227 pt -195.112.171.228 - 195.112.171.231 se -195.112.171.232 - 195.112.171.239 de -195.112.171.240 - 195.112.171.243 gb -195.112.171.244 - 195.112.171.247 at -195.112.171.248 - 195.112.171.251 it -195.112.171.252 - 195.112.171.255 fr -195.112.172.0 - 195.112.172.7 us -195.112.172.8 - 195.112.172.11 br -195.112.172.12 - 195.112.172.27 us -195.112.172.28 - 195.112.172.31 gu -195.112.172.32 - 195.112.172.35 br -195.112.172.36 - 195.112.172.59 us -195.112.172.60 - 195.112.172.63 co -195.112.172.64 - 195.112.172.71 us -195.112.172.72 - 195.112.172.75 mx -195.112.172.76 - 195.112.172.95 us -195.112.172.96 - 195.112.172.99 br -195.112.172.100 - 195.112.172.103 ar -195.112.172.104 - 195.112.172.119 us -195.112.172.120 - 195.112.172.123 co -195.112.172.124 - 195.112.172.135 us -195.112.172.136 - 195.112.172.139 ca -195.112.172.140 - 195.112.172.147 us -195.112.172.148 - 195.112.172.151 br -195.112.172.152 - 195.112.172.159 us -195.112.172.160 - 195.112.172.163 ar -195.112.172.164 - 195.112.172.187 us -195.112.172.188 - 195.112.172.191 ca -195.112.172.192 - 195.112.172.215 us -195.112.172.216 - 195.112.172.219 ve -195.112.172.220 - 195.112.172.223 br -195.112.172.224 - 195.112.172.235 us -195.112.172.236 - 195.112.172.239 de -195.112.172.240 - 195.112.172.243 cl -195.112.172.244 - 195.112.172.247 pe -195.112.172.248 - 195.112.172.255 us -195.112.173.0 - 195.112.173.3 ar -195.112.173.4 - 195.112.173.15 us -195.112.173.16 - 195.112.173.19 jm -195.112.173.20 - 195.112.173.35 us -195.112.173.36 - 195.112.173.39 br -195.112.173.40 - 195.112.173.51 us -195.112.173.52 - 195.112.173.55 mx -195.112.173.56 - 195.112.173.59 us -195.112.173.60 - 195.112.173.63 ca -195.112.173.64 - 195.112.173.147 us -195.112.173.148 - 195.112.173.151 de -195.112.173.152 - 195.112.173.155 us -195.112.173.156 - 195.112.173.159 pe -195.112.173.160 - 195.112.173.175 us -195.112.173.176 - 195.112.173.179 ca -195.112.173.180 - 195.112.173.199 us -195.112.173.200 - 195.112.173.203 br -195.112.173.204 - 195.112.173.211 us -195.112.173.212 - 195.112.173.215 ve -195.112.173.216 - 195.112.173.219 us -195.112.173.220 - 195.112.173.223 br -195.112.173.224 - 195.112.173.227 ca -195.112.173.228 - 195.112.173.231 us -195.112.173.232 - 195.112.173.235 ve -195.112.173.236 - 195.112.173.251 us -195.112.173.252 - 195.112.173.255 mx -195.112.174.0 - 195.112.174.39 us -195.112.174.40 - 195.112.174.43 ca -195.112.174.44 - 195.112.174.47 us -195.112.174.48 - 195.112.174.51 ca -195.112.174.52 - 195.112.174.123 us -195.112.174.124 - 195.112.174.127 cl -195.112.174.128 - 195.112.174.151 us -195.112.174.152 - 195.112.174.159 ar -195.112.174.160 - 195.112.174.195 us -195.112.174.196 - 195.112.174.199 ca -195.112.174.200 - 195.112.174.215 us -195.112.174.216 - 195.112.174.219 mx -195.112.174.220 - 195.112.174.247 us -195.112.174.248 - 195.112.174.251 co -195.112.174.252 - 195.112.174.255 us -195.112.175.0 - 195.112.175.3 gb -195.112.175.4 - 195.112.175.7 fr -195.112.175.8 - 195.112.175.11 de -195.112.175.12 - 195.112.175.19 gb -195.112.175.20 - 195.112.175.27 de -195.112.175.28 - 195.112.175.35 es -195.112.175.36 - 195.112.175.43 fr -195.112.175.44 - 195.112.175.47 es -195.112.175.48 - 195.112.175.51 de -195.112.175.52 - 195.112.175.59 it -195.112.175.60 - 195.112.175.63 de -195.112.175.64 - 195.112.175.67 fr -195.112.175.68 - 195.112.175.71 de -195.112.175.72 - 195.112.175.75 fr -195.112.175.76 - 195.112.175.79 ch -195.112.175.80 - 195.112.175.83 gr -195.112.175.84 - 195.112.175.87 ch -195.112.175.88 - 195.112.175.91 es -195.112.175.92 - 195.112.175.95 fr -195.112.175.96 - 195.112.175.99 de -195.112.175.100 - 195.112.175.103 ch -195.112.175.104 - 195.112.175.107 es -195.112.175.108 - 195.112.175.111 de -195.112.175.112 - 195.112.175.119 es -195.112.175.120 - 195.112.175.123 fr -195.112.175.124 - 195.112.175.127 de -195.112.175.128 - 195.112.175.131 es -195.112.175.132 - 195.112.175.135 be -195.112.175.136 - 195.112.175.139 es -195.112.175.140 - 195.112.175.143 be -195.112.175.144 - 195.112.175.147 pl -195.112.175.148 - 195.112.175.151 gb -195.112.175.152 - 195.112.175.155 ch -195.112.175.156 - 195.112.175.159 de -195.112.175.160 - 195.112.175.163 fr -195.112.175.164 - 195.112.175.167 de -195.112.175.168 - 195.112.175.171 gb -195.112.175.172 - 195.112.175.175 at -195.112.175.176 - 195.112.175.179 de -195.112.175.180 - 195.112.175.183 gb -195.112.175.184 - 195.112.175.187 ua +195.112.170.200 - 195.112.172.67 de +195.112.172.68 - 195.112.172.71 us +195.112.172.72 - 195.112.172.111 de +195.112.172.112 - 195.112.172.115 us +195.112.172.116 - 195.112.175.187 de 195.112.175.188 - 195.112.175.191 nl -195.112.175.192 - 195.112.175.195 gb -195.112.175.196 - 195.112.175.203 de -195.112.175.204 - 195.112.175.207 fr -195.112.175.208 - 195.112.175.211 de -195.112.175.212 - 195.112.175.215 it -195.112.175.216 - 195.112.175.219 ch -195.112.175.220 - 195.112.175.223 gb -195.112.175.224 - 195.112.175.227 de -195.112.175.228 - 195.112.175.231 fr -195.112.175.232 - 195.112.175.235 dk -195.112.175.236 - 195.112.175.239 it -195.112.175.240 - 195.112.175.251 de -195.112.175.252 - 195.112.175.255 ch -195.112.176.0 - 195.112.176.3 tw -195.112.176.4 - 195.112.176.19 au -195.112.176.20 - 195.112.176.23 nz -195.112.176.24 - 195.112.176.35 au -195.112.176.36 - 195.112.176.39 nz -195.112.176.40 - 195.112.176.47 au +195.112.175.192 - 195.112.176.47 de 195.112.176.48 - 195.112.176.51 nz -195.112.176.52 - 195.112.176.63 au -195.112.176.64 - 195.112.176.67 nz -195.112.176.68 - 195.112.176.83 au -195.112.176.84 - 195.112.176.87 nz -195.112.176.88 - 195.112.176.91 pg -195.112.176.92 - 195.112.176.147 au -195.112.176.148 - 195.112.176.151 nz -195.112.176.152 - 195.112.176.175 au -195.112.176.176 - 195.112.176.179 nz -195.112.176.180 - 195.112.176.191 au -195.112.176.192 - 195.112.176.195 nz -195.112.176.196 - 195.112.176.227 au -195.112.176.228 - 195.112.176.231 de -195.112.176.232 - 195.112.176.235 au -195.112.176.236 - 195.112.176.239 nz -195.112.176.240 - 195.112.176.247 au -195.112.176.248 - 195.112.176.255 de -195.112.177.0 - 195.112.177.3 sg -195.112.177.4 - 195.112.177.7 my -195.112.177.8 - 195.112.177.11 in -195.112.177.12 - 195.112.177.19 sg -195.112.177.20 - 195.112.177.23 cn -195.112.177.24 - 195.112.177.27 in -195.112.177.28 - 195.112.177.31 my -195.112.177.32 - 195.112.177.35 cn -195.112.177.36 - 195.112.177.43 my -195.112.177.44 - 195.112.177.47 th -195.112.177.48 - 195.112.177.51 sg -195.112.177.52 - 195.112.177.55 ph -195.112.177.56 - 195.112.177.75 in -195.112.177.76 - 195.112.177.79 tw -195.112.177.80 - 195.112.177.83 pk -195.112.177.84 - 195.112.177.87 my -195.112.177.88 - 195.112.177.91 tw -195.112.177.92 - 195.112.177.95 in -195.112.177.96 - 195.112.177.107 my -195.112.177.108 - 195.112.177.111 in -195.112.177.112 - 195.112.177.115 my -195.112.177.116 - 195.112.177.119 tw -195.112.177.120 - 195.112.177.123 sg -195.112.177.124 - 195.112.177.127 cn -195.112.177.128 - 195.112.177.131 tw -195.112.177.132 - 195.112.177.135 in -195.112.177.136 - 195.112.177.139 sg -195.112.177.140 - 195.112.177.143 tw -195.112.177.144 - 195.112.177.147 th -195.112.177.148 - 195.112.177.151 ph -195.112.177.152 - 195.112.177.163 sg -195.112.177.164 - 195.112.177.171 my -195.112.177.172 - 195.112.177.179 sg -195.112.177.180 - 195.112.177.183 my -195.112.177.184 - 195.112.177.187 in -195.112.177.188 - 195.112.177.191 my -195.112.177.192 - 195.112.177.203 sg -195.112.177.204 - 195.112.177.207 my -195.112.177.208 - 195.112.177.211 sg -195.112.177.212 - 195.112.177.215 hk -195.112.177.216 - 195.112.177.219 tw -195.112.177.220 - 195.112.177.223 de -195.112.177.224 - 195.112.177.227 sg -195.112.177.228 - 195.112.177.231 in +195.112.176.52 - 195.112.176.151 de +195.112.176.152 - 195.112.176.155 au +195.112.176.156 - 195.112.177.59 de +195.112.177.60 - 195.112.177.63 in +195.112.177.64 - 195.112.177.231 de 195.112.177.232 - 195.112.177.235 sg -195.112.177.236 - 195.112.177.239 tw -195.112.177.240 - 195.112.177.243 my -195.112.177.244 - 195.112.177.255 sg -195.112.178.0 - 195.112.178.1 de -195.112.178.2 - 195.112.178.2 gb -195.112.178.3 - 195.112.178.4 de -195.112.178.5 - 195.112.178.5 gb -195.112.178.6 - 195.112.178.6 it -195.112.178.7 - 195.112.178.7 de -195.112.178.8 - 195.112.178.8 ch -195.112.178.9 - 195.112.178.10 be -195.112.178.11 - 195.112.178.11 de -195.112.178.12 - 195.112.178.12 es -195.112.178.13 - 195.112.178.13 lu -195.112.178.14 - 195.112.178.14 gb -195.112.178.15 - 195.112.178.15 de -195.112.178.16 - 195.112.178.16 it -195.112.178.17 - 195.112.178.17 gb -195.112.178.18 - 195.112.178.19 de -195.112.178.20 - 195.112.178.20 nl -195.112.178.21 - 195.112.178.21 gb -195.112.178.22 - 195.112.178.22 de -195.112.178.23 - 195.112.178.23 es -195.112.178.24 - 195.112.178.28 de -195.112.178.29 - 195.112.178.29 gb -195.112.178.30 - 195.112.178.30 it -195.112.178.31 - 195.112.178.31 fr -195.112.178.32 - 195.112.178.33 ch -195.112.178.34 - 195.112.178.34 de -195.112.178.35 - 195.112.178.35 gb -195.112.178.36 - 195.112.178.36 de -195.112.178.37 - 195.112.178.37 gb -195.112.178.38 - 195.112.178.39 it -195.112.178.40 - 195.112.178.41 de -195.112.178.42 - 195.112.178.42 gb -195.112.178.43 - 195.112.178.43 nl -195.112.178.44 - 195.112.178.44 fr -195.112.178.45 - 195.112.178.45 ch -195.112.178.46 - 195.112.178.46 pl -195.112.178.47 - 195.112.178.47 fr -195.112.178.48 - 195.112.178.48 no -195.112.178.49 - 195.112.178.49 gb -195.112.178.50 - 195.112.178.51 de -195.112.178.52 - 195.112.178.52 be -195.112.178.53 - 195.112.178.53 de -195.112.178.54 - 195.112.178.54 ch -195.112.178.55 - 195.112.178.55 fr -195.112.178.56 - 195.112.178.56 de -195.112.178.57 - 195.112.178.58 gb -195.112.178.59 - 195.112.178.59 se -195.112.178.60 - 195.112.178.61 de -195.112.178.62 - 195.112.178.62 es -195.112.178.63 - 195.112.178.64 de -195.112.178.65 - 195.112.178.65 gr -195.112.178.66 - 195.112.178.66 si -195.112.178.67 - 195.112.178.67 it -195.112.178.68 - 195.112.178.69 de -195.112.178.70 - 195.112.178.70 es -195.112.178.71 - 195.112.178.71 it -195.112.178.72 - 195.112.178.72 us -195.112.178.73 - 195.112.178.73 ch -195.112.178.74 - 195.112.178.74 de -195.112.178.75 - 195.112.178.75 gb -195.112.178.76 - 195.112.178.76 it -195.112.178.77 - 195.112.178.77 gb -195.112.178.78 - 195.112.178.78 de -195.112.178.79 - 195.112.178.79 it -195.112.178.80 - 195.112.178.80 fr -195.112.178.81 - 195.112.178.81 gb -195.112.178.82 - 195.112.178.83 de -195.112.178.84 - 195.112.178.84 it -195.112.178.85 - 195.112.178.85 de -195.112.178.86 - 195.112.178.86 be -195.112.178.87 - 195.112.178.87 at -195.112.178.88 - 195.112.178.89 de -195.112.178.90 - 195.112.178.90 es -195.112.178.91 - 195.112.178.91 nl -195.112.178.92 - 195.112.178.93 de -195.112.178.94 - 195.112.178.94 ch -195.112.178.95 - 195.112.178.95 de -195.112.178.96 - 195.112.178.96 at -195.112.178.97 - 195.112.178.97 fr -195.112.178.98 - 195.112.178.98 dk -195.112.178.99 - 195.112.178.99 de -195.112.178.100 - 195.112.178.100 it -195.112.178.101 - 195.112.178.101 nl -195.112.178.102 - 195.112.178.104 de -195.112.178.105 - 195.112.178.105 nl -195.112.178.106 - 195.112.178.106 ru -195.112.178.107 - 195.112.178.107 fr -195.112.178.108 - 195.112.178.108 es -195.112.178.109 - 195.112.178.109 nl -195.112.178.110 - 195.112.178.110 it -195.112.178.111 - 195.112.178.111 ch -195.112.178.112 - 195.112.178.112 it -195.112.178.113 - 195.112.178.113 de -195.112.178.114 - 195.112.178.114 nl -195.112.178.115 - 195.112.178.115 at -195.112.178.116 - 195.112.178.117 de -195.112.178.118 - 195.112.178.118 es -195.112.178.119 - 195.112.178.119 fr -195.112.178.120 - 195.112.178.123 de -195.112.178.124 - 195.112.178.124 es -195.112.178.125 - 195.112.178.130 de -195.112.178.131 - 195.112.178.131 hu -195.112.178.132 - 195.112.178.132 de -195.112.178.133 - 195.112.178.133 es -195.112.178.134 - 195.112.178.134 gb -195.112.178.135 - 195.112.178.135 es -195.112.178.136 - 195.112.178.136 no -195.112.178.137 - 195.112.178.137 de -195.112.178.138 - 195.112.178.138 it -195.112.178.139 - 195.112.178.139 de -195.112.178.140 - 195.112.178.140 it -195.112.178.141 - 195.112.178.141 fr -195.112.178.142 - 195.112.178.143 de -195.112.178.144 - 195.112.178.144 es -195.112.178.145 - 195.112.178.145 gb -195.112.178.146 - 195.112.178.147 nl -195.112.178.148 - 195.112.178.148 de -195.112.178.149 - 195.112.178.149 it -195.112.178.150 - 195.112.178.150 ch -195.112.178.151 - 195.112.178.151 is -195.112.178.152 - 195.112.178.152 es -195.112.178.153 - 195.112.178.153 it -195.112.178.154 - 195.112.178.155 de -195.112.178.156 - 195.112.178.156 pl -195.112.178.157 - 195.112.178.157 de -195.112.178.158 - 195.112.178.158 nl -195.112.178.159 - 195.112.178.159 dk -195.112.178.160 - 195.112.178.161 de -195.112.178.162 - 195.112.178.162 ch -195.112.178.163 - 195.112.178.163 gb -195.112.178.164 - 195.112.178.164 de -195.112.178.165 - 195.112.178.165 nl -195.112.178.166 - 195.112.178.166 de -195.112.178.167 - 195.112.178.167 it -195.112.178.168 - 195.112.178.169 de -195.112.178.170 - 195.112.178.170 es -195.112.178.171 - 195.112.178.174 de -195.112.178.175 - 195.112.178.175 nl -195.112.178.176 - 195.112.178.176 gb -195.112.178.177 - 195.112.178.177 ch -195.112.178.178 - 195.112.178.179 nl -195.112.178.180 - 195.112.178.183 de -195.112.178.184 - 195.112.178.184 be -195.112.178.185 - 195.112.178.185 ie -195.112.178.186 - 195.112.178.187 de -195.112.178.188 - 195.112.178.188 gb -195.112.178.189 - 195.112.178.190 de -195.112.178.191 - 195.112.178.191 it -195.112.178.192 - 195.112.178.193 de -195.112.178.194 - 195.112.178.194 ch -195.112.178.195 - 195.112.178.195 de -195.112.178.196 - 195.112.178.196 ch -195.112.178.197 - 195.112.178.202 de -195.112.178.203 - 195.112.178.203 nl -195.112.178.204 - 195.112.178.204 de -195.112.178.205 - 195.112.178.205 gb -195.112.178.206 - 195.112.178.210 de -195.112.178.211 - 195.112.178.211 ch -195.112.178.212 - 195.112.178.212 nl -195.112.178.213 - 195.112.178.213 be -195.112.178.214 - 195.112.178.214 it -195.112.178.215 - 195.112.178.216 nl -195.112.178.217 - 195.112.178.217 de -195.112.178.218 - 195.112.178.218 ch -195.112.178.219 - 195.112.178.219 es -195.112.178.220 - 195.112.178.220 de -195.112.178.221 - 195.112.178.221 it -195.112.178.222 - 195.112.178.222 de -195.112.178.223 - 195.112.178.224 nl -195.112.178.225 - 195.112.178.226 de -195.112.178.227 - 195.112.178.227 be -195.112.178.228 - 195.112.178.228 at -195.112.178.229 - 195.112.178.229 ch -195.112.178.230 - 195.112.178.230 de -195.112.178.231 - 195.112.178.231 it -195.112.178.232 - 195.112.178.233 de -195.112.178.234 - 195.112.178.234 at -195.112.178.235 - 195.112.178.235 de -195.112.178.236 - 195.112.178.236 it -195.112.178.237 - 195.112.178.237 de -195.112.178.238 - 195.112.178.238 ch -195.112.178.239 - 195.112.178.239 de -195.112.178.240 - 195.112.178.240 fr -195.112.178.241 - 195.112.178.241 pt -195.112.178.242 - 195.112.178.243 nl -195.112.178.244 - 195.112.178.246 de -195.112.178.247 - 195.112.178.247 no -195.112.178.248 - 195.112.178.248 nl -195.112.178.249 - 195.112.178.249 at -195.112.178.250 - 195.112.178.250 es -195.112.178.251 - 195.112.178.252 it -195.112.178.253 - 195.112.179.1 de -195.112.179.2 - 195.112.179.2 be -195.112.179.3 - 195.112.179.3 fr -195.112.179.4 - 195.112.179.4 it -195.112.179.5 - 195.112.179.7 de -195.112.179.8 - 195.112.179.8 it -195.112.179.9 - 195.112.179.9 es -195.112.179.10 - 195.112.179.10 ch -195.112.179.11 - 195.112.179.11 be -195.112.179.12 - 195.112.179.14 ch -195.112.179.15 - 195.112.179.15 gb -195.112.179.16 - 195.112.179.16 de -195.112.179.17 - 195.112.179.17 gb -195.112.179.18 - 195.112.179.18 ch -195.112.179.19 - 195.112.179.21 de -195.112.179.22 - 195.112.179.22 ch -195.112.179.23 - 195.112.179.23 gb -195.112.179.24 - 195.112.179.26 de -195.112.179.27 - 195.112.179.27 ch -195.112.179.28 - 195.112.179.29 de -195.112.179.30 - 195.112.179.30 fr -195.112.179.31 - 195.112.179.31 de -195.112.179.32 - 195.112.179.32 it -195.112.179.33 - 195.112.179.33 de -195.112.179.34 - 195.112.179.34 nl -195.112.179.35 - 195.112.179.35 de -195.112.179.36 - 195.112.179.36 cz -195.112.179.37 - 195.112.179.37 it -195.112.179.38 - 195.112.179.38 de -195.112.179.39 - 195.112.179.40 es -195.112.179.41 - 195.112.179.41 fr -195.112.179.42 - 195.112.179.42 ch -195.112.179.43 - 195.112.179.43 de -195.112.179.44 - 195.112.179.44 ch -195.112.179.45 - 195.112.179.45 be -195.112.179.46 - 195.112.179.46 es -195.112.179.47 - 195.112.179.47 be -195.112.179.48 - 195.112.179.48 fr -195.112.179.49 - 195.112.179.49 de -195.112.179.50 - 195.112.179.50 dk -195.112.179.51 - 195.112.179.51 de -195.112.179.52 - 195.112.179.53 gb -195.112.179.54 - 195.112.179.54 es -195.112.179.55 - 195.112.179.55 nl -195.112.179.56 - 195.112.179.56 fr -195.112.179.57 - 195.112.179.57 it -195.112.179.58 - 195.112.179.58 de -195.112.179.59 - 195.112.179.59 es -195.112.179.60 - 195.112.179.60 de -195.112.179.61 - 195.112.179.61 fr -195.112.179.62 - 195.112.179.62 de -195.112.179.63 - 195.112.179.63 ch -195.112.179.64 - 195.112.179.64 it -195.112.179.65 - 195.112.179.65 de -195.112.179.66 - 195.112.179.66 be -195.112.179.67 - 195.112.179.67 si -195.112.179.68 - 195.112.179.68 fr -195.112.179.69 - 195.112.179.72 de -195.112.179.73 - 195.112.179.73 gb -195.112.179.74 - 195.112.179.74 it -195.112.179.75 - 195.112.179.75 at -195.112.179.76 - 195.112.179.76 de -195.112.179.77 - 195.112.179.77 it -195.112.179.78 - 195.112.179.80 de -195.112.179.81 - 195.112.179.81 ch -195.112.179.82 - 195.112.179.82 fr -195.112.179.83 - 195.112.179.83 ch -195.112.179.84 - 195.112.179.89 de -195.112.179.90 - 195.112.179.90 gb -195.112.179.91 - 195.112.179.93 de -195.112.179.94 - 195.112.179.94 pl -195.112.179.95 - 195.112.179.96 de -195.112.179.97 - 195.112.179.97 at -195.112.179.98 - 195.112.179.98 es -195.112.179.99 - 195.112.179.100 fr -195.112.179.101 - 195.112.179.101 de -195.112.179.102 - 195.112.179.103 ch -195.112.179.104 - 195.112.179.104 be -195.112.179.105 - 195.112.179.105 fr -195.112.179.106 - 195.112.179.106 ch -195.112.179.107 - 195.112.179.108 de -195.112.179.109 - 195.112.179.109 nl -195.112.179.110 - 195.112.179.111 de -195.112.179.112 - 195.112.179.112 nl -195.112.179.113 - 195.112.179.114 de -195.112.179.115 - 195.112.179.115 it -195.112.179.116 - 195.112.179.116 es -195.112.179.117 - 195.112.179.120 de -195.112.179.121 - 195.112.179.121 be -195.112.179.122 - 195.112.179.122 de -195.112.179.123 - 195.112.179.123 at -195.112.179.124 - 195.112.179.124 se -195.112.179.125 - 195.112.179.125 at -195.112.179.126 - 195.112.179.126 za -195.112.179.127 - 195.112.179.129 de -195.112.179.130 - 195.112.179.130 fr -195.112.179.131 - 195.112.179.131 de -195.112.179.132 - 195.112.179.132 fr -195.112.179.133 - 195.112.179.133 it -195.112.179.134 - 195.112.179.134 dk -195.112.179.135 - 195.112.179.135 gb -195.112.179.136 - 195.112.179.136 pt -195.112.179.137 - 195.112.179.137 es -195.112.179.138 - 195.112.179.138 ch -195.112.179.139 - 195.112.179.139 pt -195.112.179.140 - 195.112.179.140 ch -195.112.179.141 - 195.112.179.141 de -195.112.179.142 - 195.112.179.143 it -195.112.179.144 - 195.112.179.144 fr -195.112.179.145 - 195.112.179.145 at -195.112.179.146 - 195.112.179.146 gb -195.112.179.147 - 195.112.179.147 fr -195.112.179.148 - 195.112.179.148 be -195.112.179.149 - 195.112.179.149 ch -195.112.179.150 - 195.112.179.150 it -195.112.179.151 - 195.112.179.151 de -195.112.179.152 - 195.112.179.152 gb -195.112.179.153 - 195.112.179.154 de -195.112.179.155 - 195.112.179.155 be -195.112.179.156 - 195.112.179.156 fr -195.112.179.157 - 195.112.179.157 it -195.112.179.158 - 195.112.179.159 nl -195.112.179.160 - 195.112.179.160 fr -195.112.179.161 - 195.112.179.161 ch -195.112.179.162 - 195.112.179.162 be -195.112.179.163 - 195.112.179.163 it -195.112.179.164 - 195.112.179.164 es -195.112.179.165 - 195.112.179.165 nl -195.112.179.166 - 195.112.179.166 fr -195.112.179.167 - 195.112.179.167 es -195.112.179.168 - 195.112.179.169 de -195.112.179.170 - 195.112.179.170 ch -195.112.179.171 - 195.112.179.171 nl -195.112.179.172 - 195.112.179.172 fr -195.112.179.173 - 195.112.179.173 be -195.112.179.174 - 195.112.179.174 de -195.112.179.175 - 195.112.179.175 nl -195.112.179.176 - 195.112.179.177 de -195.112.179.178 - 195.112.179.178 se -195.112.179.179 - 195.112.179.183 de -195.112.179.184 - 195.112.179.184 es -195.112.179.185 - 195.112.179.185 be -195.112.179.186 - 195.112.179.186 es -195.112.179.187 - 195.112.179.187 de -195.112.179.188 - 195.112.179.188 nl -195.112.179.189 - 195.112.179.189 se -195.112.179.190 - 195.112.179.192 de -195.112.179.193 - 195.112.179.193 be -195.112.179.194 - 195.112.179.196 fr -195.112.179.197 - 195.112.179.197 nl -195.112.179.198 - 195.112.179.198 de -195.112.179.199 - 195.112.179.201 es -195.112.179.202 - 195.112.179.202 de -195.112.179.203 - 195.112.179.203 ch -195.112.179.204 - 195.112.179.205 de -195.112.179.206 - 195.112.179.206 se -195.112.179.207 - 195.112.179.207 fr -195.112.179.208 - 195.112.179.208 de -195.112.179.209 - 195.112.179.209 be -195.112.179.210 - 195.112.179.210 nl -195.112.179.211 - 195.112.179.211 de -195.112.179.212 - 195.112.179.212 gb -195.112.179.213 - 195.112.179.215 de -195.112.179.216 - 195.112.179.216 lu -195.112.179.217 - 195.112.179.217 de -195.112.179.218 - 195.112.179.218 it -195.112.179.219 - 195.112.179.219 de -195.112.179.220 - 195.112.179.220 ch -195.112.179.221 - 195.112.179.221 nl -195.112.179.222 - 195.112.179.222 gr -195.112.179.223 - 195.112.179.223 gb -195.112.179.224 - 195.112.179.224 de -195.112.179.225 - 195.112.179.226 ch -195.112.179.227 - 195.112.179.227 se -195.112.179.228 - 195.112.179.230 de -195.112.179.231 - 195.112.179.231 it -195.112.179.232 - 195.112.179.232 de -195.112.179.233 - 195.112.179.233 es -195.112.179.234 - 195.112.179.236 it -195.112.179.237 - 195.112.179.237 de -195.112.179.238 - 195.112.179.238 it -195.112.179.239 - 195.112.179.239 gb -195.112.179.240 - 195.112.179.240 ch -195.112.179.241 - 195.112.179.241 gb -195.112.179.242 - 195.112.179.242 it -195.112.179.243 - 195.112.179.244 de -195.112.179.245 - 195.112.179.245 ch -195.112.179.246 - 195.112.179.246 de -195.112.179.247 - 195.112.179.247 nl -195.112.179.248 - 195.112.179.249 de -195.112.179.250 - 195.112.179.250 fr -195.112.179.251 - 195.112.179.251 gb -195.112.179.252 - 195.112.179.252 es -195.112.179.253 - 195.112.180.3 de -195.112.180.4 - 195.112.180.4 es -195.112.180.5 - 195.112.180.5 fr -195.112.180.6 - 195.112.180.7 de -195.112.180.8 - 195.112.180.8 nl -195.112.180.9 - 195.112.180.10 de -195.112.180.11 - 195.112.180.11 es -195.112.180.12 - 195.112.180.12 fr -195.112.180.13 - 195.112.180.13 de -195.112.180.14 - 195.112.180.14 nl -195.112.180.15 - 195.112.180.15 ch -195.112.180.16 - 195.112.180.16 de -195.112.180.17 - 195.112.180.17 es -195.112.180.18 - 195.112.180.19 fr -195.112.180.20 - 195.112.180.20 it -195.112.180.21 - 195.112.180.21 de -195.112.180.22 - 195.112.180.22 dk -195.112.180.23 - 195.112.180.23 de -195.112.180.24 - 195.112.180.24 fr -195.112.180.25 - 195.112.180.25 it -195.112.180.26 - 195.112.180.28 de -195.112.180.29 - 195.112.180.29 es -195.112.180.30 - 195.112.180.30 nl -195.112.180.31 - 195.112.180.31 fr -195.112.180.32 - 195.112.180.33 de -195.112.180.34 - 195.112.180.34 fr -195.112.180.35 - 195.112.180.35 nl -195.112.180.36 - 195.112.180.36 de -195.112.180.37 - 195.112.180.38 ch -195.112.180.39 - 195.112.180.39 es -195.112.180.40 - 195.112.180.42 de -195.112.180.43 - 195.112.180.43 it -195.112.180.44 - 195.112.180.45 de -195.112.180.46 - 195.112.180.46 gb -195.112.180.47 - 195.112.180.47 de -195.112.180.48 - 195.112.180.48 fr -195.112.180.49 - 195.112.180.49 it -195.112.180.50 - 195.112.180.51 de -195.112.180.52 - 195.112.180.52 it -195.112.180.53 - 195.112.180.55 de -195.112.180.56 - 195.112.180.56 fr -195.112.180.57 - 195.112.180.57 de -195.112.180.58 - 195.112.180.58 it -195.112.180.59 - 195.112.180.60 de -195.112.180.61 - 195.112.180.61 gb -195.112.180.62 - 195.112.180.62 it -195.112.180.63 - 195.112.180.64 es -195.112.180.65 - 195.112.180.65 it -195.112.180.66 - 195.112.180.66 pt -195.112.180.67 - 195.112.180.67 dk -195.112.180.68 - 195.112.180.68 gb -195.112.180.69 - 195.112.180.69 ch -195.112.180.70 - 195.112.180.70 be -195.112.180.71 - 195.112.180.71 dk -195.112.180.72 - 195.112.180.72 fr -195.112.180.73 - 195.112.180.73 lu -195.112.180.74 - 195.112.180.74 at -195.112.180.75 - 195.112.180.76 de -195.112.180.77 - 195.112.180.77 pt -195.112.180.78 - 195.112.180.78 es +195.112.177.236 - 195.112.179.51 de +195.112.179.52 - 195.112.179.52 gb +195.112.179.53 - 195.112.180.78 de 195.112.180.79 - 195.112.180.79 be -195.112.180.80 - 195.112.180.82 de -195.112.180.83 - 195.112.180.84 fr -195.112.180.85 - 195.112.180.86 de -195.112.180.87 - 195.112.180.87 nl -195.112.180.88 - 195.112.180.88 be -195.112.180.89 - 195.112.180.89 de -195.112.180.90 - 195.112.180.90 nl -195.112.180.91 - 195.112.180.91 fr -195.112.180.92 - 195.112.180.92 gb -195.112.180.93 - 195.112.180.94 de -195.112.180.95 - 195.112.180.96 it -195.112.180.97 - 195.112.180.97 pt -195.112.180.98 - 195.112.180.98 es -195.112.180.99 - 195.112.180.99 pl -195.112.180.100 - 195.112.180.101 de -195.112.180.102 - 195.112.180.102 fr -195.112.180.103 - 195.112.180.103 at -195.112.180.104 - 195.112.180.105 it -195.112.180.106 - 195.112.180.106 de -195.112.180.107 - 195.112.180.107 pt -195.112.180.108 - 195.112.180.108 es -195.112.180.109 - 195.112.180.109 ch -195.112.180.110 - 195.112.180.111 de -195.112.180.112 - 195.112.180.112 gb -195.112.180.113 - 195.112.180.113 de -195.112.180.114 - 195.112.180.114 fr -195.112.180.115 - 195.112.180.115 de -195.112.180.116 - 195.112.180.117 gb -195.112.180.118 - 195.112.180.119 de -195.112.180.120 - 195.112.180.120 nl -195.112.180.121 - 195.112.180.121 de -195.112.180.122 - 195.112.180.123 es -195.112.180.124 - 195.112.180.124 fr -195.112.180.125 - 195.112.180.125 es -195.112.180.126 - 195.112.180.126 fr -195.112.180.127 - 195.112.180.127 es -195.112.180.128 - 195.112.180.128 ch -195.112.180.129 - 195.112.180.129 de -195.112.180.130 - 195.112.180.130 it -195.112.180.131 - 195.112.180.131 de -195.112.180.132 - 195.112.180.132 it -195.112.180.133 - 195.112.180.134 de -195.112.180.135 - 195.112.180.135 fr -195.112.180.136 - 195.112.180.137 de -195.112.180.138 - 195.112.180.138 fr -195.112.180.139 - 195.112.180.139 de -195.112.180.140 - 195.112.180.140 ch -195.112.180.141 - 195.112.180.142 gr -195.112.180.143 - 195.112.180.143 es -195.112.180.144 - 195.112.180.144 no -195.112.180.145 - 195.112.180.145 it -195.112.180.146 - 195.112.180.146 de -195.112.180.147 - 195.112.180.147 ch -195.112.180.148 - 195.112.180.148 es -195.112.180.149 - 195.112.180.149 gb -195.112.180.150 - 195.112.180.150 es -195.112.180.151 - 195.112.180.151 pl -195.112.180.152 - 195.112.180.152 it -195.112.180.153 - 195.112.180.153 de -195.112.180.154 - 195.112.180.155 fr -195.112.180.156 - 195.112.180.156 es -195.112.180.157 - 195.112.180.157 be -195.112.180.158 - 195.112.180.158 es -195.112.180.159 - 195.112.180.159 de -195.112.180.160 - 195.112.180.160 pl -195.112.180.161 - 195.112.180.161 ch -195.112.180.162 - 195.112.180.162 fr -195.112.180.163 - 195.112.180.163 it -195.112.180.164 - 195.112.180.164 nl -195.112.180.165 - 195.112.180.167 de -195.112.180.168 - 195.112.180.168 fr -195.112.180.169 - 195.112.180.169 de -195.112.180.170 - 195.112.180.170 fr -195.112.180.171 - 195.112.180.171 gb -195.112.180.172 - 195.112.180.172 de -195.112.180.173 - 195.112.180.173 gb -195.112.180.174 - 195.112.180.174 at -195.112.180.175 - 195.112.180.175 de -195.112.180.176 - 195.112.180.176 fr -195.112.180.177 - 195.112.180.177 it -195.112.180.178 - 195.112.180.178 nl -195.112.180.179 - 195.112.180.179 es -195.112.180.180 - 195.112.180.180 gb -195.112.180.181 - 195.112.180.181 nl -195.112.180.182 - 195.112.180.182 es -195.112.180.183 - 195.112.180.183 ua +195.112.180.80 - 195.112.180.183 de 195.112.180.184 - 195.112.180.184 nl -195.112.180.185 - 195.112.180.185 de -195.112.180.186 - 195.112.180.186 gb -195.112.180.187 - 195.112.180.187 es -195.112.180.188 - 195.112.180.188 be -195.112.180.189 - 195.112.180.190 de -195.112.180.191 - 195.112.180.191 it -195.112.180.192 - 195.112.180.192 de -195.112.180.193 - 195.112.180.193 gb -195.112.180.194 - 195.112.180.194 de -195.112.180.195 - 195.112.180.195 at -195.112.180.196 - 195.112.180.196 de -195.112.180.197 - 195.112.180.198 it -195.112.180.199 - 195.112.180.199 ch -195.112.180.200 - 195.112.180.200 de -195.112.180.201 - 195.112.180.201 gb -195.112.180.202 - 195.112.180.203 de -195.112.180.204 - 195.112.180.204 es -195.112.180.205 - 195.112.180.205 fr -195.112.180.206 - 195.112.180.206 de -195.112.180.207 - 195.112.180.207 se -195.112.180.208 - 195.112.180.208 dk -195.112.180.209 - 195.112.180.209 it -195.112.180.210 - 195.112.180.210 fr -195.112.180.211 - 195.112.180.213 de -195.112.180.214 - 195.112.180.214 ch -195.112.180.215 - 195.112.180.215 de -195.112.180.216 - 195.112.180.216 fr -195.112.180.217 - 195.112.180.217 de -195.112.180.218 - 195.112.180.218 ch -195.112.180.219 - 195.112.180.219 at -195.112.180.220 - 195.112.180.220 de -195.112.180.221 - 195.112.180.221 pt -195.112.180.222 - 195.112.180.223 de -195.112.180.224 - 195.112.180.224 it -195.112.180.225 - 195.112.180.225 gb -195.112.180.226 - 195.112.180.227 de -195.112.180.228 - 195.112.180.228 fr -195.112.180.229 - 195.112.180.232 de -195.112.180.233 - 195.112.180.233 es -195.112.180.234 - 195.112.180.234 de -195.112.180.235 - 195.112.180.235 es -195.112.180.236 - 195.112.180.236 de -195.112.180.237 - 195.112.180.237 nl -195.112.180.238 - 195.112.180.239 es -195.112.180.240 - 195.112.180.240 be -195.112.180.241 - 195.112.180.241 de -195.112.180.242 - 195.112.180.242 be -195.112.180.243 - 195.112.180.245 de -195.112.180.246 - 195.112.180.246 nl -195.112.180.247 - 195.112.180.249 de -195.112.180.250 - 195.112.180.250 it -195.112.180.251 - 195.112.181.1 de -195.112.181.2 - 195.112.181.2 be -195.112.181.3 - 195.112.181.3 de -195.112.181.4 - 195.112.181.4 ch -195.112.181.5 - 195.112.181.6 de -195.112.181.7 - 195.112.181.7 fr -195.112.181.8 - 195.112.181.8 gb -195.112.181.9 - 195.112.181.9 at -195.112.181.10 - 195.112.181.11 de -195.112.181.12 - 195.112.181.12 it -195.112.181.13 - 195.112.181.13 fr -195.112.181.14 - 195.112.181.16 de -195.112.181.17 - 195.112.181.17 li -195.112.181.18 - 195.112.181.18 at -195.112.181.19 - 195.112.181.19 fr -195.112.181.20 - 195.112.181.21 it -195.112.181.22 - 195.112.181.22 de -195.112.181.23 - 195.112.181.24 it -195.112.181.25 - 195.112.181.25 es -195.112.181.26 - 195.112.181.26 be -195.112.181.27 - 195.112.181.27 de -195.112.181.28 - 195.112.181.29 es -195.112.181.30 - 195.112.181.30 fr -195.112.181.31 - 195.112.181.31 hu -195.112.181.32 - 195.112.181.32 at -195.112.181.33 - 195.112.181.33 es -195.112.181.34 - 195.112.181.35 de -195.112.181.36 - 195.112.181.36 at -195.112.181.37 - 195.112.181.37 be -195.112.181.38 - 195.112.181.38 fr -195.112.181.39 - 195.112.181.39 de -195.112.181.40 - 195.112.181.40 ch -195.112.181.41 - 195.112.181.42 at -195.112.181.43 - 195.112.181.43 de -195.112.181.44 - 195.112.181.44 nl -195.112.181.45 - 195.112.181.45 es -195.112.181.46 - 195.112.181.46 gb -195.112.181.47 - 195.112.181.47 br -195.112.181.48 - 195.112.181.49 es -195.112.181.50 - 195.112.181.50 re -195.112.181.51 - 195.112.181.51 it -195.112.181.52 - 195.112.181.52 es -195.112.181.53 - 195.112.181.54 de -195.112.181.55 - 195.112.181.55 it -195.112.181.56 - 195.112.181.57 de -195.112.181.58 - 195.112.181.58 nl -195.112.181.59 - 195.112.181.59 ch -195.112.181.60 - 195.112.181.60 gb -195.112.181.61 - 195.112.181.61 il -195.112.181.62 - 195.112.181.62 it -195.112.181.63 - 195.112.181.63 de -195.112.181.64 - 195.112.181.64 it -195.112.181.65 - 195.112.181.65 de -195.112.181.66 - 195.112.181.66 fr -195.112.181.67 - 195.112.181.67 de -195.112.181.68 - 195.112.181.68 fr -195.112.181.69 - 195.112.181.69 de -195.112.181.70 - 195.112.181.70 at -195.112.181.71 - 195.112.181.72 de -195.112.181.73 - 195.112.181.73 fr -195.112.181.74 - 195.112.181.76 de -195.112.181.77 - 195.112.181.77 gb -195.112.181.78 - 195.112.181.78 be -195.112.181.79 - 195.112.181.79 ae -195.112.181.80 - 195.112.181.80 nl -195.112.181.81 - 195.112.181.81 es -195.112.181.82 - 195.112.181.82 de -195.112.181.83 - 195.112.181.83 be -195.112.181.84 - 195.112.181.84 gb -195.112.181.85 - 195.112.181.85 de -195.112.181.86 - 195.112.181.86 dk -195.112.181.87 - 195.112.181.87 be -195.112.181.88 - 195.112.181.88 nl -195.112.181.89 - 195.112.181.89 fr -195.112.181.90 - 195.112.181.90 de -195.112.181.91 - 195.112.181.91 be -195.112.181.92 - 195.112.181.92 it -195.112.181.93 - 195.112.181.93 ch -195.112.181.94 - 195.112.181.94 de -195.112.181.95 - 195.112.181.95 nl -195.112.181.96 - 195.112.181.97 de -195.112.181.98 - 195.112.181.98 nl -195.112.181.99 - 195.112.181.99 es -195.112.181.100 - 195.112.181.100 de -195.112.181.101 - 195.112.181.101 it -195.112.181.102 - 195.112.181.102 de -195.112.181.103 - 195.112.181.103 nl -195.112.181.104 - 195.112.181.104 de -195.112.181.105 - 195.112.181.105 pl -195.112.181.106 - 195.112.181.106 es -195.112.181.107 - 195.112.181.107 gb -195.112.181.108 - 195.112.181.108 gr -195.112.181.109 - 195.112.181.110 de -195.112.181.111 - 195.112.181.111 es -195.112.181.112 - 195.112.181.113 de -195.112.181.114 - 195.112.181.114 pl -195.112.181.115 - 195.112.181.115 fr -195.112.181.116 - 195.112.181.116 es -195.112.181.117 - 195.112.181.117 de -195.112.181.118 - 195.112.181.118 at -195.112.181.119 - 195.112.181.119 de -195.112.181.120 - 195.112.181.120 es -195.112.181.121 - 195.112.181.121 de -195.112.181.122 - 195.112.181.122 be -195.112.181.123 - 195.112.181.123 nl -195.112.181.124 - 195.112.181.125 de -195.112.181.126 - 195.112.181.126 it -195.112.181.127 - 195.112.181.127 ch -195.112.181.128 - 195.112.181.128 de -195.112.181.129 - 195.112.181.129 es -195.112.181.130 - 195.112.181.131 de -195.112.181.132 - 195.112.181.132 it -195.112.181.133 - 195.112.181.133 ch -195.112.181.134 - 195.112.181.134 it -195.112.181.135 - 195.112.181.135 dk -195.112.181.136 - 195.112.181.136 de -195.112.181.137 - 195.112.181.137 fr -195.112.181.138 - 195.112.181.140 de -195.112.181.141 - 195.112.181.142 fr -195.112.181.143 - 195.112.181.144 de -195.112.181.145 - 195.112.181.145 gb -195.112.181.146 - 195.112.181.146 de -195.112.181.147 - 195.112.181.147 it -195.112.181.148 - 195.112.181.148 ch -195.112.181.149 - 195.112.181.150 it -195.112.181.151 - 195.112.181.151 hu -195.112.181.152 - 195.112.181.153 de -195.112.181.154 - 195.112.181.154 fr -195.112.181.155 - 195.112.181.155 nl -195.112.181.156 - 195.112.181.157 fr -195.112.181.158 - 195.112.181.158 it -195.112.181.159 - 195.112.181.159 de -195.112.181.160 - 195.112.181.160 dk -195.112.181.161 - 195.112.181.161 de -195.112.181.162 - 195.112.181.162 es -195.112.181.163 - 195.112.181.163 fr -195.112.181.164 - 195.112.181.165 it -195.112.181.166 - 195.112.181.166 be -195.112.181.167 - 195.112.181.167 fr -195.112.181.168 - 195.112.181.168 at -195.112.181.169 - 195.112.181.170 de -195.112.181.171 - 195.112.181.171 nl -195.112.181.172 - 195.112.181.172 cy -195.112.181.173 - 195.112.181.173 de -195.112.181.174 - 195.112.181.174 es -195.112.181.175 - 195.112.181.175 ch -195.112.181.176 - 195.112.181.178 es +195.112.180.185 - 195.112.180.196 de +195.112.180.197 - 195.112.180.197 it +195.112.180.198 - 195.112.181.178 de 195.112.181.179 - 195.112.181.179 it -195.112.181.180 - 195.112.181.181 de -195.112.181.182 - 195.112.181.182 it -195.112.181.183 - 195.112.181.184 de -195.112.181.185 - 195.112.181.185 es -195.112.181.186 - 195.112.181.187 de -195.112.181.188 - 195.112.181.188 lu -195.112.181.189 - 195.112.181.189 it -195.112.181.190 - 195.112.181.190 be -195.112.181.191 - 195.112.181.191 fr -195.112.181.192 - 195.112.181.192 gb -195.112.181.193 - 195.112.181.193 ch -195.112.181.194 - 195.112.181.194 de -195.112.181.195 - 195.112.181.195 pt -195.112.181.196 - 195.112.181.196 ad -195.112.181.197 - 195.112.181.198 de -195.112.181.199 - 195.112.181.199 ch -195.112.181.200 - 195.112.181.201 it -195.112.181.202 - 195.112.181.202 es -195.112.181.203 - 195.112.181.204 de -195.112.181.205 - 195.112.181.205 pl -195.112.181.206 - 195.112.181.206 gb -195.112.181.207 - 195.112.181.207 de -195.112.181.208 - 195.112.181.208 gb -195.112.181.209 - 195.112.181.209 at -195.112.181.210 - 195.112.181.210 it -195.112.181.211 - 195.112.181.211 fr -195.112.181.212 - 195.112.181.212 ch -195.112.181.213 - 195.112.181.213 at -195.112.181.214 - 195.112.181.214 fr -195.112.181.215 - 195.112.181.215 pl -195.112.181.216 - 195.112.181.217 de -195.112.181.218 - 195.112.181.218 es -195.112.181.219 - 195.112.181.219 ch -195.112.181.220 - 195.112.181.222 de -195.112.181.223 - 195.112.181.223 it -195.112.181.224 - 195.112.181.225 de -195.112.181.226 - 195.112.181.226 es -195.112.181.227 - 195.112.181.227 de -195.112.181.228 - 195.112.181.228 es -195.112.181.229 - 195.112.181.231 de -195.112.181.232 - 195.112.181.232 ch -195.112.181.233 - 195.112.181.238 de -195.112.181.239 - 195.112.181.239 pl -195.112.181.240 - 195.112.181.241 de -195.112.181.242 - 195.112.181.242 fr -195.112.181.243 - 195.112.181.243 dk -195.112.181.244 - 195.112.181.245 ch -195.112.181.246 - 195.112.181.246 de -195.112.181.247 - 195.112.181.247 ad -195.112.181.248 - 195.112.181.248 de -195.112.181.249 - 195.112.181.249 es -195.112.181.250 - 195.112.181.252 de -195.112.181.253 - 195.112.181.253 pt -195.112.181.254 - 195.112.181.254 il -195.112.181.255 - 195.112.182.1 de -195.112.182.2 - 195.112.182.2 ch -195.112.182.3 - 195.112.182.3 de -195.112.182.4 - 195.112.182.5 es -195.112.182.6 - 195.112.182.7 de -195.112.182.8 - 195.112.182.8 gr -195.112.182.9 - 195.112.182.9 de -195.112.182.10 - 195.112.182.10 fr -195.112.182.11 - 195.112.182.11 sl -195.112.182.12 - 195.112.182.12 de -195.112.182.13 - 195.112.182.13 fr -195.112.182.14 - 195.112.182.14 de -195.112.182.15 - 195.112.182.15 nl -195.112.182.16 - 195.112.182.17 de -195.112.182.18 - 195.112.182.18 cy -195.112.182.19 - 195.112.182.19 de -195.112.182.20 - 195.112.182.20 fr -195.112.182.21 - 195.112.182.21 ch -195.112.182.22 - 195.112.182.22 be -195.112.182.23 - 195.112.182.23 es -195.112.182.24 - 195.112.182.24 de -195.112.182.25 - 195.112.182.25 cz -195.112.182.26 - 195.112.182.26 fr -195.112.182.27 - 195.112.182.27 ch -195.112.182.28 - 195.112.182.28 es -195.112.182.29 - 195.112.182.29 it -195.112.182.30 - 195.112.182.30 de -195.112.182.31 - 195.112.182.32 pt -195.112.182.33 - 195.112.182.33 fr -195.112.182.34 - 195.112.182.34 ch -195.112.182.35 - 195.112.182.36 de -195.112.182.37 - 195.112.182.37 gb -195.112.182.38 - 195.112.182.38 it -195.112.182.39 - 195.112.182.42 de -195.112.182.43 - 195.112.182.43 it -195.112.182.44 - 195.112.182.44 de -195.112.182.45 - 195.112.182.45 es -195.112.182.46 - 195.112.182.46 de -195.112.182.47 - 195.112.182.47 it -195.112.182.48 - 195.112.182.48 fr -195.112.182.49 - 195.112.182.49 it -195.112.182.50 - 195.112.182.50 hu -195.112.182.51 - 195.112.182.52 de -195.112.182.53 - 195.112.182.53 es -195.112.182.54 - 195.112.182.54 de -195.112.182.55 - 195.112.182.55 ie -195.112.182.56 - 195.112.182.56 de -195.112.182.57 - 195.112.182.57 lu -195.112.182.58 - 195.112.182.58 de -195.112.182.59 - 195.112.182.59 gb -195.112.182.60 - 195.112.182.60 de -195.112.182.61 - 195.112.182.61 dk -195.112.182.62 - 195.112.182.62 es -195.112.182.63 - 195.112.182.63 de -195.112.182.64 - 195.112.182.64 it -195.112.182.65 - 195.112.182.65 fr -195.112.182.66 - 195.112.182.66 de -195.112.182.67 - 195.112.182.67 gr -195.112.182.68 - 195.112.182.68 it -195.112.182.69 - 195.112.182.69 in -195.112.182.70 - 195.112.182.70 es -195.112.182.71 - 195.112.182.71 ma -195.112.182.72 - 195.112.182.72 gb -195.112.182.73 - 195.112.182.73 fr -195.112.182.74 - 195.112.182.74 de -195.112.182.75 - 195.112.182.75 at -195.112.182.76 - 195.112.182.76 de -195.112.182.77 - 195.112.182.77 sm -195.112.182.78 - 195.112.182.78 pl -195.112.182.79 - 195.112.182.79 de -195.112.182.80 - 195.112.182.80 ch -195.112.182.81 - 195.112.182.82 de -195.112.182.83 - 195.112.182.83 at -195.112.182.84 - 195.112.182.84 es -195.112.182.85 - 195.112.182.85 ch -195.112.182.86 - 195.112.182.86 es -195.112.182.87 - 195.112.182.87 us -195.112.182.88 - 195.112.182.88 be -195.112.182.89 - 195.112.182.89 it -195.112.182.90 - 195.112.182.91 gb -195.112.182.92 - 195.112.182.92 de -195.112.182.93 - 195.112.182.93 es -195.112.182.94 - 195.112.182.94 de -195.112.182.95 - 195.112.182.95 it -195.112.182.96 - 195.112.182.101 de -195.112.182.102 - 195.112.182.102 gb -195.112.182.103 - 195.112.182.103 fr -195.112.182.104 - 195.112.182.104 it -195.112.182.105 - 195.112.182.105 de -195.112.182.106 - 195.112.182.107 fr -195.112.182.108 - 195.112.182.108 be -195.112.182.109 - 195.112.182.109 gb -195.112.182.110 - 195.112.182.110 es -195.112.182.111 - 195.112.182.111 be -195.112.182.112 - 195.112.182.112 de -195.112.182.113 - 195.112.182.113 pl -195.112.182.114 - 195.112.182.114 nl -195.112.182.115 - 195.112.182.115 de -195.112.182.116 - 195.112.182.116 fr -195.112.182.117 - 195.112.182.118 de -195.112.182.119 - 195.112.182.119 it -195.112.182.120 - 195.112.182.120 dk -195.112.182.121 - 195.112.182.121 gb -195.112.182.122 - 195.112.182.122 it -195.112.182.123 - 195.112.182.123 es -195.112.182.124 - 195.112.182.124 it -195.112.182.125 - 195.112.182.125 ie -195.112.182.126 - 195.112.182.126 nl -195.112.182.127 - 195.112.182.127 fr -195.112.182.128 - 195.112.182.128 de -195.112.182.129 - 195.112.182.129 it -195.112.182.130 - 195.112.182.130 ch -195.112.182.131 - 195.112.182.131 il -195.112.182.132 - 195.112.182.137 de -195.112.182.138 - 195.112.182.138 pl -195.112.182.139 - 195.112.182.139 ch -195.112.182.140 - 195.112.182.140 de -195.112.182.141 - 195.112.182.141 it -195.112.182.142 - 195.112.182.144 de -195.112.182.145 - 195.112.182.145 be -195.112.182.146 - 195.112.182.146 nl -195.112.182.147 - 195.112.182.147 es -195.112.182.148 - 195.112.182.149 de -195.112.182.150 - 195.112.182.150 it -195.112.182.151 - 195.112.182.151 de -195.112.182.152 - 195.112.182.152 pl -195.112.182.153 - 195.112.182.153 es -195.112.182.154 - 195.112.182.154 it -195.112.182.155 - 195.112.182.155 gb -195.112.182.156 - 195.112.182.156 es -195.112.182.157 - 195.112.182.157 de -195.112.182.158 - 195.112.182.158 gb -195.112.182.159 - 195.112.182.159 it -195.112.182.160 - 195.112.182.160 de -195.112.182.161 - 195.112.182.161 fr -195.112.182.162 - 195.112.182.163 it -195.112.182.164 - 195.112.182.164 gb -195.112.182.165 - 195.112.182.165 hu -195.112.182.166 - 195.112.182.166 fr -195.112.182.167 - 195.112.182.167 de -195.112.182.168 - 195.112.182.169 it -195.112.182.170 - 195.112.182.170 de -195.112.182.171 - 195.112.182.171 pl -195.112.182.172 - 195.112.182.172 de -195.112.182.173 - 195.112.182.173 fr -195.112.182.174 - 195.112.182.174 es -195.112.182.175 - 195.112.182.176 fr -195.112.182.177 - 195.112.182.177 de -195.112.182.178 - 195.112.182.178 es -195.112.182.179 - 195.112.182.179 de -195.112.182.180 - 195.112.182.180 it -195.112.182.181 - 195.112.182.182 es -195.112.182.183 - 195.112.182.183 gb -195.112.182.184 - 195.112.182.184 de -195.112.182.185 - 195.112.182.185 pt -195.112.182.186 - 195.112.182.186 it -195.112.182.187 - 195.112.182.188 de -195.112.182.189 - 195.112.182.189 es -195.112.182.190 - 195.112.182.190 de -195.112.182.191 - 195.112.182.191 gr -195.112.182.192 - 195.112.182.195 de -195.112.182.196 - 195.112.182.196 dk -195.112.182.197 - 195.112.182.197 gb -195.112.182.198 - 195.112.182.198 nl -195.112.182.199 - 195.112.182.199 at -195.112.182.200 - 195.112.182.200 it -195.112.182.201 - 195.112.182.201 nl -195.112.182.202 - 195.112.182.202 lu -195.112.182.203 - 195.112.182.203 de -195.112.182.204 - 195.112.182.204 es -195.112.182.205 - 195.112.182.205 de -195.112.182.206 - 195.112.182.206 be -195.112.182.207 - 195.112.182.207 lu -195.112.182.208 - 195.112.182.209 de -195.112.182.210 - 195.112.182.210 fr -195.112.182.211 - 195.112.182.212 de -195.112.182.213 - 195.112.182.213 gb -195.112.182.214 - 195.112.182.214 dk -195.112.182.215 - 195.112.182.215 de -195.112.182.216 - 195.112.182.216 fr -195.112.182.217 - 195.112.182.220 de -195.112.182.221 - 195.112.182.221 ch -195.112.182.222 - 195.112.182.223 de -195.112.182.224 - 195.112.182.224 es -195.112.182.225 - 195.112.182.225 pl -195.112.182.226 - 195.112.182.226 es -195.112.182.227 - 195.112.182.227 be -195.112.182.228 - 195.112.182.228 it -195.112.182.229 - 195.112.182.229 de -195.112.182.230 - 195.112.182.230 gr -195.112.182.231 - 195.112.182.231 ch -195.112.182.232 - 195.112.182.232 de -195.112.182.233 - 195.112.182.233 dk -195.112.182.234 - 195.112.182.234 de -195.112.182.235 - 195.112.182.235 es -195.112.182.236 - 195.112.182.236 gb -195.112.182.237 - 195.112.182.237 de -195.112.182.238 - 195.112.182.238 es -195.112.182.239 - 195.112.182.239 de -195.112.182.240 - 195.112.182.240 at -195.112.182.241 - 195.112.182.241 nl -195.112.182.242 - 195.112.182.243 it -195.112.182.244 - 195.112.182.244 es -195.112.182.245 - 195.112.182.246 de -195.112.182.247 - 195.112.182.247 nl -195.112.182.248 - 195.112.182.248 it -195.112.182.249 - 195.112.182.249 at -195.112.182.250 - 195.112.182.251 de -195.112.182.252 - 195.112.182.253 ch -195.112.182.254 - 195.112.182.254 fr -195.112.182.255 - 195.112.183.1 de -195.112.183.2 - 195.112.183.2 gb -195.112.183.3 - 195.112.183.3 lu -195.112.183.4 - 195.112.183.6 de -195.112.183.7 - 195.112.183.7 nl -195.112.183.8 - 195.112.183.8 it -195.112.183.9 - 195.112.183.9 ch -195.112.183.10 - 195.112.183.10 nl -195.112.183.11 - 195.112.183.12 de -195.112.183.13 - 195.112.183.13 dk -195.112.183.14 - 195.112.183.14 it -195.112.183.15 - 195.112.183.15 is -195.112.183.16 - 195.112.183.16 pl -195.112.183.17 - 195.112.183.17 de -195.112.183.18 - 195.112.183.18 be -195.112.183.19 - 195.112.183.20 de -195.112.183.21 - 195.112.183.21 it -195.112.183.22 - 195.112.183.22 fr +195.112.181.180 - 195.112.183.22 de 195.112.183.23 - 195.112.183.23 at -195.112.183.24 - 195.112.183.25 ch -195.112.183.26 - 195.112.183.27 fr -195.112.183.28 - 195.112.183.28 de -195.112.183.29 - 195.112.183.29 it -195.112.183.30 - 195.112.183.30 de -195.112.183.31 - 195.112.183.31 fr -195.112.183.32 - 195.112.183.33 de -195.112.183.34 - 195.112.183.34 gr -195.112.183.35 - 195.112.183.35 fr -195.112.183.36 - 195.112.183.36 us -195.112.183.37 - 195.112.183.37 fr -195.112.183.38 - 195.112.183.38 gb -195.112.183.39 - 195.112.183.39 de -195.112.183.40 - 195.112.183.40 fr -195.112.183.41 - 195.112.183.41 de -195.112.183.42 - 195.112.183.42 fr -195.112.183.43 - 195.112.183.43 de -195.112.183.44 - 195.112.183.45 fr -195.112.183.46 - 195.112.183.46 nl -195.112.183.47 - 195.112.183.47 gb -195.112.183.48 - 195.112.183.48 be -195.112.183.49 - 195.112.183.49 it -195.112.183.50 - 195.112.183.50 de -195.112.183.51 - 195.112.183.51 be -195.112.183.52 - 195.112.183.52 at -195.112.183.53 - 195.112.183.53 it -195.112.183.54 - 195.112.183.54 de -195.112.183.55 - 195.112.183.55 it -195.112.183.56 - 195.112.183.58 de -195.112.183.59 - 195.112.183.59 es -195.112.183.60 - 195.112.183.60 be -195.112.183.61 - 195.112.183.61 fr -195.112.183.62 - 195.112.183.63 de -195.112.183.64 - 195.112.183.64 fr -195.112.183.65 - 195.112.183.65 it -195.112.183.66 - 195.112.183.66 gb -195.112.183.67 - 195.112.183.67 de -195.112.183.68 - 195.112.183.68 es -195.112.183.69 - 195.112.183.69 pl -195.112.183.70 - 195.112.183.70 de -195.112.183.71 - 195.112.183.71 dk -195.112.183.72 - 195.112.183.72 at -195.112.183.73 - 195.112.183.73 fr -195.112.183.74 - 195.112.183.75 es -195.112.183.76 - 195.112.183.76 de -195.112.183.77 - 195.112.183.77 gb -195.112.183.78 - 195.112.183.78 de -195.112.183.79 - 195.112.183.79 gb -195.112.183.80 - 195.112.183.80 de +195.112.183.24 - 195.112.183.80 de 195.112.183.81 - 195.112.183.81 gb -195.112.183.82 - 195.112.183.82 it -195.112.183.83 - 195.112.183.84 es -195.112.183.85 - 195.112.183.85 pt -195.112.183.86 - 195.112.183.86 nl -195.112.183.87 - 195.112.183.87 ch -195.112.183.88 - 195.112.183.88 it -195.112.183.89 - 195.112.183.89 de -195.112.183.90 - 195.112.183.90 it -195.112.183.91 - 195.112.183.91 ma -195.112.183.92 - 195.112.183.92 gr -195.112.183.93 - 195.112.183.94 de -195.112.183.95 - 195.112.183.95 at -195.112.183.96 - 195.112.183.96 gb -195.112.183.97 - 195.112.183.97 de -195.112.183.98 - 195.112.183.98 se +195.112.183.82 - 195.112.183.98 de 195.112.183.99 - 195.112.183.99 gb -195.112.183.100 - 195.112.183.102 de -195.112.183.103 - 195.112.183.104 it -195.112.183.105 - 195.112.183.105 fr -195.112.183.106 - 195.112.183.106 at -195.112.183.107 - 195.112.183.108 de -195.112.183.109 - 195.112.183.109 es -195.112.183.110 - 195.112.183.111 de -195.112.183.112 - 195.112.183.112 nl -195.112.183.113 - 195.112.183.113 de -195.112.183.114 - 195.112.183.114 it -195.112.183.115 - 195.112.183.116 es -195.112.183.117 - 195.112.183.118 it -195.112.183.119 - 195.112.183.119 es -195.112.183.120 - 195.112.183.121 de -195.112.183.122 - 195.112.183.122 fr -195.112.183.123 - 195.112.183.123 it -195.112.183.124 - 195.112.183.124 de -195.112.183.125 - 195.112.183.125 se -195.112.183.126 - 195.112.183.126 es -195.112.183.127 - 195.112.183.127 it -195.112.183.128 - 195.112.183.128 pt -195.112.183.129 - 195.112.183.129 be -195.112.183.130 - 195.112.183.130 de -195.112.183.131 - 195.112.183.131 fr -195.112.183.132 - 195.112.183.132 ie -195.112.183.133 - 195.112.183.133 it -195.112.183.134 - 195.112.183.134 es -195.112.183.135 - 195.112.183.135 nl -195.112.183.136 - 195.112.183.137 de +195.112.183.100 - 195.112.183.137 de 195.112.183.138 - 195.112.183.138 gb -195.112.183.139 - 195.112.183.139 fr -195.112.183.140 - 195.112.183.140 pt -195.112.183.141 - 195.112.183.141 fr -195.112.183.142 - 195.112.183.142 gb -195.112.183.143 - 195.112.183.143 at -195.112.183.144 - 195.112.183.144 de -195.112.183.145 - 195.112.183.145 se -195.112.183.146 - 195.112.183.147 de -195.112.183.148 - 195.112.183.148 es -195.112.183.149 - 195.112.183.149 de -195.112.183.150 - 195.112.183.150 ie -195.112.183.151 - 195.112.183.151 it -195.112.183.152 - 195.112.183.152 is -195.112.183.153 - 195.112.183.156 de -195.112.183.157 - 195.112.183.157 fr -195.112.183.158 - 195.112.183.158 de -195.112.183.159 - 195.112.183.159 ch -195.112.183.160 - 195.112.183.160 fr -195.112.183.161 - 195.112.183.161 de -195.112.183.162 - 195.112.183.162 gb -195.112.183.163 - 195.112.183.163 hu -195.112.183.164 - 195.112.183.164 it -195.112.183.165 - 195.112.183.166 de -195.112.183.167 - 195.112.183.167 it -195.112.183.168 - 195.112.183.168 ch -195.112.183.169 - 195.112.183.169 de -195.112.183.170 - 195.112.183.171 ch -195.112.183.172 - 195.112.183.172 de -195.112.183.173 - 195.112.183.173 fr -195.112.183.174 - 195.112.183.174 gb -195.112.183.175 - 195.112.183.175 de -195.112.183.176 - 195.112.183.176 es -195.112.183.177 - 195.112.183.177 lu -195.112.183.178 - 195.112.183.179 de -195.112.183.180 - 195.112.183.180 gb -195.112.183.181 - 195.112.183.181 it -195.112.183.182 - 195.112.183.182 fr -195.112.183.183 - 195.112.183.184 es -195.112.183.185 - 195.112.183.185 nl -195.112.183.186 - 195.112.183.192 de -195.112.183.193 - 195.112.183.193 fr -195.112.183.194 - 195.112.183.194 gb -195.112.183.195 - 195.112.183.195 it -195.112.183.196 - 195.112.183.197 de -195.112.183.198 - 195.112.183.198 it -195.112.183.199 - 195.112.183.199 at -195.112.183.200 - 195.112.183.200 de -195.112.183.201 - 195.112.183.201 se -195.112.183.202 - 195.112.183.202 no +195.112.183.139 - 195.112.183.202 de 195.112.183.203 - 195.112.183.203 nl -195.112.183.204 - 195.112.183.207 de -195.112.183.208 - 195.112.183.208 nl -195.112.183.209 - 195.112.183.209 pl -195.112.183.210 - 195.112.183.210 at -195.112.183.211 - 195.112.183.211 de -195.112.183.212 - 195.112.183.212 fr -195.112.183.213 - 195.112.183.213 dk -195.112.183.214 - 195.112.183.214 gb -195.112.183.215 - 195.112.183.215 it -195.112.183.216 - 195.112.183.216 de -195.112.183.217 - 195.112.183.217 it -195.112.183.218 - 195.112.183.219 de -195.112.183.220 - 195.112.183.220 gb -195.112.183.221 - 195.112.183.221 gr -195.112.183.222 - 195.112.183.222 it -195.112.183.223 - 195.112.183.224 de -195.112.183.225 - 195.112.183.225 nl -195.112.183.226 - 195.112.183.226 ru -195.112.183.227 - 195.112.183.227 it -195.112.183.228 - 195.112.183.230 de -195.112.183.231 - 195.112.183.231 ch -195.112.183.232 - 195.112.183.232 nl -195.112.183.233 - 195.112.183.233 gb -195.112.183.234 - 195.112.183.234 at -195.112.183.235 - 195.112.183.235 de -195.112.183.236 - 195.112.183.236 it -195.112.183.237 - 195.112.183.238 de -195.112.183.239 - 195.112.183.239 se -195.112.183.240 - 195.112.183.240 fr -195.112.183.241 - 195.112.183.241 it -195.112.183.242 - 195.112.183.242 es -195.112.183.243 - 195.112.183.243 de -195.112.183.244 - 195.112.183.244 es -195.112.183.245 - 195.112.183.245 be -195.112.183.246 - 195.112.183.246 nl -195.112.183.247 - 195.112.183.247 es -195.112.183.248 - 195.112.183.248 nl -195.112.183.249 - 195.112.183.249 es -195.112.183.250 - 195.112.183.250 it -195.112.183.251 - 195.112.183.251 at -195.112.183.252 - 195.112.183.252 it -195.112.183.253 - 195.112.183.254 gb -195.112.183.255 - 195.112.184.0 de -195.112.184.1 - 195.112.184.16 us -195.112.184.17 - 195.112.184.17 ca -195.112.184.18 - 195.112.184.18 us -195.112.184.19 - 195.112.184.19 ca -195.112.184.20 - 195.112.184.21 us -195.112.184.22 - 195.112.184.22 ve -195.112.184.23 - 195.112.184.23 de -195.112.184.24 - 195.112.184.28 us -195.112.184.29 - 195.112.184.29 de -195.112.184.30 - 195.112.184.30 us -195.112.184.31 - 195.112.184.32 ca -195.112.184.33 - 195.112.184.37 us -195.112.184.38 - 195.112.184.38 ca -195.112.184.39 - 195.112.184.90 us -195.112.184.91 - 195.112.184.91 ar -195.112.184.92 - 195.112.184.104 us -195.112.184.105 - 195.112.184.105 ar -195.112.184.106 - 195.112.184.109 us -195.112.184.110 - 195.112.184.110 mx -195.112.184.111 - 195.112.184.111 us -195.112.184.112 - 195.112.184.112 ca -195.112.184.113 - 195.112.184.123 us -195.112.184.124 - 195.112.184.124 de -195.112.184.125 - 195.112.184.129 us -195.112.184.130 - 195.112.184.130 de -195.112.184.131 - 195.112.184.132 us -195.112.184.133 - 195.112.184.133 ca -195.112.184.134 - 195.112.184.134 ar -195.112.184.135 - 195.112.184.135 ca -195.112.184.136 - 195.112.184.139 us -195.112.184.140 - 195.112.184.140 ca -195.112.184.141 - 195.112.184.143 us -195.112.184.144 - 195.112.184.144 br -195.112.184.145 - 195.112.184.145 us -195.112.184.146 - 195.112.184.146 ca -195.112.184.147 - 195.112.184.156 us -195.112.184.157 - 195.112.184.157 ca -195.112.184.158 - 195.112.184.162 us -195.112.184.163 - 195.112.184.163 de -195.112.184.164 - 195.112.184.164 ca -195.112.184.165 - 195.112.184.165 de -195.112.184.166 - 195.112.184.176 us -195.112.184.177 - 195.112.184.177 de -195.112.184.178 - 195.112.184.188 us -195.112.184.189 - 195.112.184.193 de -195.112.184.194 - 195.112.184.195 ca -195.112.184.196 - 195.112.184.204 de -195.112.184.205 - 195.112.184.205 us -195.112.184.206 - 195.112.184.214 de -195.112.184.215 - 195.112.184.215 us -195.112.184.216 - 195.112.185.1 de -195.112.185.2 - 195.112.185.5 us -195.112.185.6 - 195.112.185.6 de -195.112.185.7 - 195.112.185.8 us -195.112.185.9 - 195.112.185.9 ca -195.112.185.10 - 195.112.185.10 us -195.112.185.11 - 195.112.185.11 ca -195.112.185.12 - 195.112.185.12 us -195.112.185.13 - 195.112.185.13 cl -195.112.185.14 - 195.112.185.14 us -195.112.185.15 - 195.112.185.15 ca -195.112.185.16 - 195.112.185.16 us -195.112.185.17 - 195.112.185.17 ca -195.112.185.18 - 195.112.185.23 us -195.112.185.24 - 195.112.185.24 gu -195.112.185.25 - 195.112.185.25 us -195.112.185.26 - 195.112.185.26 ar -195.112.185.27 - 195.112.185.32 us -195.112.185.33 - 195.112.185.33 ca -195.112.185.34 - 195.112.185.43 us -195.112.185.44 - 195.112.185.44 cl -195.112.185.45 - 195.112.185.47 us -195.112.185.48 - 195.112.185.48 ar -195.112.185.49 - 195.112.185.49 us -195.112.185.50 - 195.112.185.50 ca -195.112.185.51 - 195.112.185.51 us -195.112.185.52 - 195.112.185.52 ca -195.112.185.53 - 195.112.185.57 us -195.112.185.58 - 195.112.185.58 de -195.112.185.59 - 195.112.185.60 us -195.112.185.61 - 195.112.185.61 de -195.112.185.62 - 195.112.185.62 us -195.112.185.63 - 195.112.185.63 de -195.112.185.64 - 195.112.185.66 us -195.112.185.67 - 195.112.185.67 de -195.112.185.68 - 195.112.185.68 ar -195.112.185.69 - 195.112.185.69 us -195.112.185.70 - 195.112.185.71 de -195.112.185.72 - 195.112.185.76 us -195.112.185.77 - 195.112.185.77 de -195.112.185.78 - 195.112.185.87 us -195.112.185.88 - 195.112.185.88 sa -195.112.185.89 - 195.112.185.94 us -195.112.185.95 - 195.112.185.96 de -195.112.185.97 - 195.112.185.99 us -195.112.185.100 - 195.112.185.100 de -195.112.185.101 - 195.112.185.114 us -195.112.185.115 - 195.112.185.115 de -195.112.185.116 - 195.112.185.121 us -195.112.185.122 - 195.112.185.122 de -195.112.185.123 - 195.112.185.126 us -195.112.185.127 - 195.112.185.128 de -195.112.185.129 - 195.112.185.130 us -195.112.185.131 - 195.112.185.131 cl -195.112.185.132 - 195.112.185.138 us -195.112.185.139 - 195.112.185.139 de -195.112.185.140 - 195.112.185.142 us -195.112.185.143 - 195.112.185.145 ar -195.112.185.146 - 195.112.185.147 us -195.112.185.148 - 195.112.185.148 ar +195.112.183.204 - 195.112.184.30 de +195.112.184.31 - 195.112.184.31 ca +195.112.184.32 - 195.112.184.38 de +195.112.184.39 - 195.112.184.39 us +195.112.184.40 - 195.112.184.49 de +195.112.184.50 - 195.112.184.50 us +195.112.184.51 - 195.112.184.119 de +195.112.184.120 - 195.112.184.120 us +195.112.184.121 - 195.112.184.161 de +195.112.184.162 - 195.112.184.162 us +195.112.184.163 - 195.112.185.100 de +195.112.185.101 - 195.112.185.101 us +195.112.185.102 - 195.112.185.104 de +195.112.185.105 - 195.112.185.105 us +195.112.185.106 - 195.112.185.116 de +195.112.185.117 - 195.112.185.117 us +195.112.185.118 - 195.112.185.131 de +195.112.185.132 - 195.112.185.132 us +195.112.185.133 - 195.112.185.148 de 195.112.185.149 - 195.112.185.149 us -195.112.185.150 - 195.112.185.151 de -195.112.185.152 - 195.112.185.153 ar -195.112.185.154 - 195.112.185.155 us -195.112.185.156 - 195.112.185.156 ar -195.112.185.157 - 195.112.185.158 us -195.112.185.159 - 195.112.185.159 cl -195.112.185.160 - 195.112.185.160 de -195.112.185.161 - 195.112.185.161 pe -195.112.185.162 - 195.112.185.162 de -195.112.185.163 - 195.112.185.165 us +195.112.185.150 - 195.112.185.154 de +195.112.185.155 - 195.112.185.155 us +195.112.185.156 - 195.112.185.165 de 195.112.185.166 - 195.112.185.166 ca -195.112.185.167 - 195.112.185.167 us -195.112.185.168 - 195.112.185.168 ca -195.112.185.169 - 195.112.185.171 us -195.112.185.172 - 195.112.185.174 de -195.112.185.175 - 195.112.185.175 us -195.112.185.176 - 195.112.185.176 ar -195.112.185.177 - 195.112.185.181 us -195.112.185.182 - 195.112.185.183 de -195.112.185.184 - 195.112.185.184 as +195.112.185.167 - 195.112.185.168 de +195.112.185.169 - 195.112.185.169 us +195.112.185.170 - 195.112.185.184 de 195.112.185.185 - 195.112.185.185 ca -195.112.185.186 - 195.112.185.194 us -195.112.185.195 - 195.112.185.195 de -195.112.185.196 - 195.112.185.196 pe +195.112.185.186 - 195.112.185.196 de 195.112.185.197 - 195.112.185.197 us -195.112.185.198 - 195.112.185.198 de -195.112.185.199 - 195.112.185.200 cl -195.112.185.201 - 195.112.185.201 de -195.112.185.202 - 195.112.185.202 jm +195.112.185.198 - 195.112.185.202 de 195.112.185.203 - 195.112.185.203 ca -195.112.185.204 - 195.112.185.204 de -195.112.185.205 - 195.112.185.206 us -195.112.185.207 - 195.112.185.207 ca -195.112.185.208 - 195.112.185.208 us -195.112.185.209 - 195.112.185.209 ca -195.112.185.210 - 195.112.185.215 us -195.112.185.216 - 195.112.185.216 de -195.112.185.217 - 195.112.185.218 us -195.112.185.219 - 195.112.185.219 de -195.112.185.220 - 195.112.185.222 us -195.112.185.223 - 195.112.185.223 de -195.112.185.224 - 195.112.185.224 ar -195.112.185.225 - 195.112.185.227 us -195.112.185.228 - 195.112.185.228 ca -195.112.185.229 - 195.112.185.229 de -195.112.185.230 - 195.112.185.231 us -195.112.185.232 - 195.112.185.233 de -195.112.185.234 - 195.112.185.237 us -195.112.185.238 - 195.112.185.238 de -195.112.185.239 - 195.112.185.239 us -195.112.185.240 - 195.112.185.240 de -195.112.185.241 - 195.112.185.241 us -195.112.185.242 - 195.112.185.242 br -195.112.185.243 - 195.112.185.243 ar -195.112.185.244 - 195.112.185.246 us -195.112.185.247 - 195.112.185.248 de -195.112.185.249 - 195.112.185.249 uy -195.112.185.250 - 195.112.185.251 de -195.112.185.252 - 195.112.185.252 ar -195.112.185.253 - 195.112.185.253 us -195.112.185.254 - 195.112.185.255 de -195.112.186.0 - 195.112.186.3 do -195.112.186.4 - 195.112.186.51 us -195.112.186.52 - 195.112.186.55 ar -195.112.186.56 - 195.112.186.59 br -195.112.186.60 - 195.112.186.83 us -195.112.186.84 - 195.112.186.87 ca -195.112.186.88 - 195.112.186.95 us -195.112.186.96 - 195.112.186.99 mx -195.112.186.100 - 195.112.186.103 us -195.112.186.104 - 195.112.186.107 de -195.112.186.108 - 195.112.186.119 us -195.112.186.120 - 195.112.186.123 co -195.112.186.124 - 195.112.186.135 us -195.112.186.136 - 195.112.186.139 br -195.112.186.140 - 195.112.186.151 us -195.112.186.152 - 195.112.186.155 co -195.112.186.156 - 195.112.186.167 us -195.112.186.168 - 195.112.186.171 br -195.112.186.172 - 195.112.186.179 us -195.112.186.180 - 195.112.186.183 co -195.112.186.184 - 195.112.186.195 us -195.112.186.196 - 195.112.186.203 ca -195.112.186.204 - 195.112.186.207 us -195.112.186.208 - 195.112.186.227 ca -195.112.186.228 - 195.112.186.231 co -195.112.186.232 - 195.112.186.239 us -195.112.186.240 - 195.112.186.243 co -195.112.186.244 - 195.112.186.247 pe -195.112.186.248 - 195.112.186.255 us -195.112.187.0 - 195.112.187.3 br -195.112.187.4 - 195.112.187.7 an -195.112.187.8 - 195.112.187.63 us -195.112.187.64 - 195.112.187.67 br -195.112.187.68 - 195.112.187.75 us -195.112.187.76 - 195.112.187.83 br -195.112.187.84 - 195.112.187.87 do -195.112.187.88 - 195.112.187.103 us -195.112.187.104 - 195.112.187.107 ar -195.112.187.108 - 195.112.187.111 br -195.112.187.112 - 195.112.187.127 us -195.112.187.128 - 195.112.187.131 ca -195.112.187.132 - 195.112.187.135 br -195.112.187.136 - 195.112.187.147 us -195.112.187.148 - 195.112.187.151 ar -195.112.187.152 - 195.112.187.167 us -195.112.187.168 - 195.112.187.175 ca -195.112.187.176 - 195.112.187.179 us -195.112.187.180 - 195.112.187.183 ar -195.112.187.184 - 195.112.187.203 us -195.112.187.204 - 195.112.187.211 ca -195.112.187.212 - 195.112.187.223 us -195.112.187.224 - 195.112.187.231 ca -195.112.187.232 - 195.112.187.243 us -195.112.187.244 - 195.112.187.247 ar -195.112.187.248 - 195.112.187.251 us -195.112.187.252 - 195.112.187.255 cl -195.112.188.0 - 195.112.188.3 ca -195.112.188.4 - 195.112.188.19 us -195.112.188.20 - 195.112.188.23 de -195.112.188.24 - 195.112.188.27 co -195.112.188.28 - 195.112.188.31 ca -195.112.188.32 - 195.112.188.39 us -195.112.188.40 - 195.112.188.43 mx -195.112.188.44 - 195.112.188.47 ar -195.112.188.48 - 195.112.188.51 ca -195.112.188.52 - 195.112.188.55 us -195.112.188.56 - 195.112.188.59 ca -195.112.188.60 - 195.112.188.63 us -195.112.188.64 - 195.112.188.67 br -195.112.188.68 - 195.112.188.83 us -195.112.188.84 - 195.112.188.87 pr -195.112.188.88 - 195.112.188.115 us -195.112.188.116 - 195.112.188.119 ar -195.112.188.120 - 195.112.188.123 mx -195.112.188.124 - 195.112.188.147 us -195.112.188.148 - 195.112.188.151 ca -195.112.188.152 - 195.112.188.155 ar -195.112.188.156 - 195.112.188.159 mx -195.112.188.160 - 195.112.188.171 us -195.112.188.172 - 195.112.188.175 br -195.112.188.176 - 195.112.188.179 us -195.112.188.180 - 195.112.188.183 mx -195.112.188.184 - 195.112.188.199 us -195.112.188.200 - 195.112.188.203 cl -195.112.188.204 - 195.112.188.211 br -195.112.188.212 - 195.112.188.223 us -195.112.188.224 - 195.112.188.227 mx -195.112.188.228 - 195.112.188.235 ar -195.112.188.236 - 195.112.188.239 br -195.112.188.240 - 195.112.188.243 us -195.112.188.244 - 195.112.188.247 ca +195.112.185.204 - 195.112.185.214 de +195.112.185.215 - 195.112.185.215 us +195.112.185.216 - 195.112.185.220 de +195.112.185.221 - 195.112.185.221 us +195.112.185.222 - 195.112.185.235 de +195.112.185.236 - 195.112.185.236 us +195.112.185.237 - 195.112.185.243 de +195.112.185.244 - 195.112.185.244 us +195.112.185.245 - 195.112.186.215 de +195.112.186.216 - 195.112.186.219 ca +195.112.186.220 - 195.112.187.39 de +195.112.187.40 - 195.112.187.43 us +195.112.187.44 - 195.112.188.7 de +195.112.188.8 - 195.112.188.11 us +195.112.188.12 - 195.112.188.35 de +195.112.188.36 - 195.112.188.39 us +195.112.188.40 - 195.112.188.127 de +195.112.188.128 - 195.112.188.131 us +195.112.188.132 - 195.112.188.247 de 195.112.188.248 - 195.112.188.251 us -195.112.188.252 - 195.112.188.255 an -195.112.189.0 - 195.112.189.3 ar -195.112.189.4 - 195.112.189.43 us -195.112.189.44 - 195.112.189.47 ar -195.112.189.48 - 195.112.189.51 us -195.112.189.52 - 195.112.189.55 do -195.112.189.56 - 195.112.189.123 us -195.112.189.124 - 195.112.189.127 ar -195.112.189.128 - 195.112.189.131 us -195.112.189.132 - 195.112.189.135 uy -195.112.189.136 - 195.112.189.139 de -195.112.189.140 - 195.112.189.151 us -195.112.189.152 - 195.112.189.155 br -195.112.189.156 - 195.112.189.163 us -195.112.189.164 - 195.112.189.167 ar -195.112.189.168 - 195.112.189.179 us -195.112.189.180 - 195.112.189.183 co -195.112.189.184 - 195.112.189.187 us -195.112.189.188 - 195.112.189.191 ar -195.112.189.192 - 195.112.189.207 us -195.112.189.208 - 195.112.189.211 mx -195.112.189.212 - 195.112.189.227 us -195.112.189.228 - 195.112.189.231 mx -195.112.189.232 - 195.112.189.235 co -195.112.189.236 - 195.112.189.243 us -195.112.189.244 - 195.112.189.247 pe -195.112.189.248 - 195.112.189.255 us -195.112.190.0 - 195.112.190.2 de -195.112.190.3 - 195.112.190.3 ch -195.112.190.4 - 195.112.190.4 de -195.112.190.5 - 195.112.190.5 be -195.112.190.6 - 195.112.190.6 nl -195.112.190.7 - 195.112.190.7 lu -195.112.190.8 - 195.112.190.8 de -195.112.190.9 - 195.112.190.9 nl -195.112.190.10 - 195.112.190.10 pt -195.112.190.11 - 195.112.190.11 gb -195.112.190.12 - 195.112.190.12 de -195.112.190.13 - 195.112.190.13 dk +195.112.188.252 - 195.112.189.35 de +195.112.189.36 - 195.112.189.39 us +195.112.189.40 - 195.112.189.239 de +195.112.189.240 - 195.112.189.243 us +195.112.189.244 - 195.112.190.13 de 195.112.190.14 - 195.112.190.14 fr -195.112.190.15 - 195.112.190.15 de -195.112.190.16 - 195.112.190.16 ru -195.112.190.17 - 195.112.190.17 de -195.112.190.18 - 195.112.190.18 ch -195.112.190.19 - 195.112.190.23 de -195.112.190.24 - 195.112.190.24 gb -195.112.190.25 - 195.112.190.29 de -195.112.190.30 - 195.112.190.30 gr -195.112.190.31 - 195.112.190.31 ch -195.112.190.32 - 195.112.190.34 de -195.112.190.35 - 195.112.190.35 dk -195.112.190.36 - 195.112.190.36 fr -195.112.190.37 - 195.112.190.37 de -195.112.190.38 - 195.112.190.39 nl -195.112.190.40 - 195.112.190.40 de -195.112.190.41 - 195.112.190.41 gb +195.112.190.15 - 195.112.190.41 de 195.112.190.42 - 195.112.190.42 nl -195.112.190.43 - 195.112.190.43 ch -195.112.190.44 - 195.112.190.48 de -195.112.190.49 - 195.112.190.49 ch -195.112.190.50 - 195.112.190.52 de -195.112.190.53 - 195.112.190.53 es -195.112.190.54 - 195.112.190.54 ch -195.112.190.55 - 195.112.190.55 de -195.112.190.56 - 195.112.190.56 gb -195.112.190.57 - 195.112.190.57 de -195.112.190.58 - 195.112.190.58 nl -195.112.190.59 - 195.112.190.60 de -195.112.190.61 - 195.112.190.61 ch -195.112.190.62 - 195.112.190.62 fr -195.112.190.63 - 195.112.190.63 de -195.112.190.64 - 195.112.190.64 dk -195.112.190.65 - 195.112.190.66 de -195.112.190.67 - 195.112.190.67 gb -195.112.190.68 - 195.112.190.68 fr -195.112.190.69 - 195.112.190.69 it -195.112.190.70 - 195.112.190.70 be -195.112.190.71 - 195.112.190.71 es -195.112.190.72 - 195.112.190.72 ie -195.112.190.73 - 195.112.190.74 de -195.112.190.75 - 195.112.190.75 fr -195.112.190.76 - 195.112.190.76 no -195.112.190.77 - 195.112.190.78 de -195.112.190.79 - 195.112.190.79 it -195.112.190.80 - 195.112.190.80 fr -195.112.190.81 - 195.112.190.81 de -195.112.190.82 - 195.112.190.82 it -195.112.190.83 - 195.112.190.83 es -195.112.190.84 - 195.112.190.84 nl -195.112.190.85 - 195.112.190.85 se -195.112.190.86 - 195.112.190.86 fr -195.112.190.87 - 195.112.190.88 de -195.112.190.89 - 195.112.190.89 be -195.112.190.90 - 195.112.190.94 de -195.112.190.95 - 195.112.190.96 it -195.112.190.97 - 195.112.190.98 de -195.112.190.99 - 195.112.190.99 ch -195.112.190.100 - 195.112.190.100 be -195.112.190.101 - 195.112.190.101 de -195.112.190.102 - 195.112.190.102 at -195.112.190.103 - 195.112.190.103 es -195.112.190.104 - 195.112.190.104 gb -195.112.190.105 - 195.112.190.105 it -195.112.190.106 - 195.112.190.106 es -195.112.190.107 - 195.112.190.107 de -195.112.190.108 - 195.112.190.108 fr -195.112.190.109 - 195.112.190.112 de -195.112.190.113 - 195.112.190.113 pt -195.112.190.114 - 195.112.190.114 fr -195.112.190.115 - 195.112.190.115 gb -195.112.190.116 - 195.112.190.116 de -195.112.190.117 - 195.112.190.117 fr -195.112.190.118 - 195.112.190.118 de -195.112.190.119 - 195.112.190.119 nl -195.112.190.120 - 195.112.190.125 de -195.112.190.126 - 195.112.190.126 it -195.112.190.127 - 195.112.191.1 de -195.112.191.2 - 195.112.191.6 us -195.112.191.7 - 195.112.191.7 ca -195.112.191.8 - 195.112.191.11 us -195.112.191.12 - 195.112.191.12 cn -195.112.191.13 - 195.112.191.13 us -195.112.191.14 - 195.112.191.14 de -195.112.191.15 - 195.112.191.19 us -195.112.191.20 - 195.112.191.20 de -195.112.191.21 - 195.112.191.36 us -195.112.191.37 - 195.112.191.37 de -195.112.191.38 - 195.112.191.43 us -195.112.191.44 - 195.112.191.44 de -195.112.191.45 - 195.112.191.60 us -195.112.191.61 - 195.112.191.61 gb -195.112.191.62 - 195.112.191.94 us -195.112.191.95 - 195.112.191.95 de -195.112.191.96 - 195.112.191.118 us -195.112.191.119 - 195.112.191.119 de -195.112.191.120 - 195.112.191.142 us -195.112.191.143 - 195.112.191.143 pr -195.112.191.144 - 195.112.191.160 us -195.112.191.161 - 195.112.191.165 de -195.112.191.166 - 195.112.191.166 us -195.112.191.167 - 195.112.191.173 de -195.112.191.174 - 195.112.191.174 us -195.112.191.175 - 195.112.191.176 de -195.112.191.177 - 195.112.191.177 us -195.112.191.178 - 195.112.191.181 de -195.112.191.182 - 195.112.191.183 us -195.112.191.184 - 195.112.191.191 de -195.112.191.192 - 195.112.191.215 us -195.112.191.216 - 195.112.191.219 de -195.112.191.220 - 195.112.191.223 us -195.112.191.224 - 195.112.191.227 sv -195.112.191.228 - 195.112.191.231 do -195.112.191.232 - 195.112.191.235 de -195.112.191.236 - 195.112.191.239 us -195.112.191.240 - 195.112.191.243 de -195.112.191.244 - 195.112.191.247 pr -195.112.191.248 - 195.112.191.251 us -195.112.191.252 - 195.112.191.255 de +195.112.190.43 - 195.112.191.26 de +195.112.191.27 - 195.112.191.27 us +195.112.191.28 - 195.112.191.33 de +195.112.191.34 - 195.112.191.34 us +195.112.191.35 - 195.112.191.45 de +195.112.191.46 - 195.112.191.46 us +195.112.191.47 - 195.112.191.99 de +195.112.191.100 - 195.112.191.100 us +195.112.191.101 - 195.112.191.110 de +195.112.191.111 - 195.112.191.111 us +195.112.191.112 - 195.112.191.119 de +195.112.191.120 - 195.112.191.120 us +195.112.191.121 - 195.112.191.255 de 195.112.192.0 - 195.112.223.255 lb 195.112.224.0 - 195.112.255.255 ru 195.113.0.0 - 195.113.255.255 cz 195.114.0.0 - 195.114.1.255 pl 195.114.2.0 - 195.114.3.255 ru -195.114.4.0 - 195.114.7.255 ua -195.114.8.0 - 195.114.9.255 ru +195.114.6.0 - 195.114.7.255 ua 195.114.10.0 - 195.114.11.255 de 195.114.12.0 - 195.114.13.255 nl -195.114.14.0 - 195.114.15.255 ro 195.114.16.0 - 195.114.17.255 hu 195.114.18.0 - 195.114.19.255 fr 195.114.20.0 - 195.114.21.255 ru @@ -112644,270 +91273,100 @@ 195.114.28.0 - 195.114.29.255 ps 195.114.30.0 - 195.114.31.255 ua 195.114.32.0 - 195.114.63.255 lv -195.114.64.0 - 195.114.86.215 fr -195.114.86.216 - 195.114.86.223 a2 -195.114.86.224 - 195.114.95.255 fr +195.114.64.0 - 195.114.95.255 fr 195.114.96.0 - 195.114.97.255 ua 195.114.98.0 - 195.114.99.255 de 195.114.100.0 - 195.114.101.255 nl 195.114.102.0 - 195.114.103.255 gb 195.114.104.0 - 195.114.105.255 ru 195.114.106.0 - 195.114.107.255 sa -195.114.108.0 - 195.114.109.255 tr -195.114.110.0 - 195.114.111.255 gb -195.114.112.0 - 195.114.113.255 bg +195.114.112.0 - 195.114.112.255 ru 195.114.114.0 - 195.114.115.255 fr -195.114.116.0 - 195.114.117.255 ro -195.114.118.0 - 195.114.119.255 ru 195.114.120.0 - 195.114.121.255 ua 195.114.122.0 - 195.114.125.255 ru -195.114.126.0 - 195.114.127.255 pl 195.114.128.0 - 195.114.159.255 ua 195.114.160.0 - 195.114.191.255 pl -195.114.192.0 - 195.114.195.255 es -195.114.196.0 - 195.114.196.255 it -195.114.197.0 - 195.114.197.255 fr -195.114.198.0 - 195.114.219.255 es -195.114.220.0 - 195.114.223.255 it -195.114.224.0 - 195.114.254.255 nl -195.114.255.0 - 195.114.255.255 de -195.115.0.0 - 195.115.36.127 fr -195.115.36.128 - 195.115.36.159 gb -195.115.36.160 - 195.115.99.191 fr -195.115.99.192 - 195.115.99.223 gb -195.115.99.224 - 195.115.255.255 fr +195.114.192.0 - 195.114.223.255 es +195.114.224.0 - 195.114.239.255 nl +195.114.240.0 - 195.114.255.255 kg +195.115.0.0 - 195.115.115.255 fr +195.115.116.0 - 195.115.117.255 re +195.115.118.0 - 195.115.255.255 fr 195.116.0.0 - 195.117.255.255 pl -195.118.0.0 - 195.118.3.255 nl -195.118.4.0 - 195.118.4.255 gb -195.118.5.0 - 195.118.15.255 nl -195.118.16.0 - 195.118.16.255 eu -195.118.17.0 - 195.118.17.255 ie -195.118.18.0 - 195.118.18.255 se -195.118.19.0 - 195.118.19.255 es -195.118.20.0 - 195.118.20.255 pt -195.118.21.0 - 195.118.21.255 il +195.118.0.0 - 195.118.7.255 eu +195.118.8.0 - 195.118.15.255 nl +195.118.16.0 - 195.118.21.255 eu 195.118.22.0 - 195.118.23.255 za -195.118.24.0 - 195.118.26.255 es -195.118.27.0 - 195.118.27.255 za -195.118.28.0 - 195.118.29.255 se +195.118.24.0 - 195.118.29.255 eu 195.118.30.0 - 195.118.31.255 za -195.118.32.0 - 195.118.58.255 de -195.118.59.0 - 195.118.59.15 eu -195.118.59.16 - 195.118.59.31 de -195.118.59.32 - 195.118.59.63 gb -195.118.59.64 - 195.118.59.159 de -195.118.59.160 - 195.118.59.191 gb -195.118.59.192 - 195.118.59.255 es -195.118.60.0 - 195.118.63.255 de -195.118.64.0 - 195.118.79.255 fr +195.118.32.0 - 195.118.43.255 eu +195.118.44.0 - 195.118.55.255 de +195.118.56.0 - 195.118.79.255 eu 195.118.80.0 - 195.118.83.255 de -195.118.84.0 - 195.118.87.255 eu -195.118.88.0 - 195.118.90.7 de -195.118.90.8 - 195.118.90.15 eu -195.118.90.16 - 195.118.91.255 de -195.118.92.0 - 195.118.95.255 gb -195.118.96.0 - 195.118.98.255 ch -195.118.99.0 - 195.118.99.255 be -195.118.100.0 - 195.118.100.255 de -195.118.101.0 - 195.118.101.255 be -195.118.102.0 - 195.118.106.255 it -195.118.107.0 - 195.118.107.127 de -195.118.107.128 - 195.118.107.191 it -195.118.107.192 - 195.118.107.207 de -195.118.107.208 - 195.118.107.223 it -195.118.107.224 - 195.118.107.255 nl -195.118.108.0 - 195.118.108.255 de -195.118.109.0 - 195.118.109.255 gb -195.118.110.0 - 195.118.110.31 cz -195.118.110.32 - 195.118.110.127 fr -195.118.110.128 - 195.118.110.159 cz -195.118.110.160 - 195.118.110.191 fr -195.118.110.192 - 195.118.110.223 za -195.118.110.224 - 195.118.110.255 gb -195.118.111.0 - 195.118.111.255 nl -195.118.112.0 - 195.118.115.255 at +195.118.84.0 - 195.118.112.255 eu +195.118.113.0 - 195.118.113.127 at +195.118.113.128 - 195.118.115.255 eu 195.118.116.0 - 195.118.119.255 fr -195.118.120.0 - 195.118.125.255 dk -195.118.126.0 - 195.118.126.39 nl -195.118.126.40 - 195.118.126.47 at -195.118.126.48 - 195.118.126.63 gb -195.118.126.64 - 195.118.126.255 de -195.118.127.0 - 195.118.127.95 nl -195.118.127.96 - 195.118.127.191 de -195.118.127.192 - 195.118.155.31 gb -195.118.155.32 - 195.118.155.63 dk -195.118.155.64 - 195.118.157.255 gb -195.118.158.0 - 195.118.158.255 eu -195.118.159.0 - 195.118.175.127 gb -195.118.175.128 - 195.118.175.255 be -195.118.176.0 - 195.118.191.255 gb -195.118.192.0 - 195.118.193.255 es -195.118.194.0 - 195.118.195.255 it -195.118.196.0 - 195.118.196.127 fr -195.118.196.128 - 195.118.196.255 eu -195.118.197.0 - 195.118.197.255 fr -195.118.198.0 - 195.118.199.255 it -195.118.200.0 - 195.118.200.255 se -195.118.201.0 - 195.118.201.255 za -195.118.202.0 - 195.118.202.255 it -195.118.203.0 - 195.118.203.255 za -195.118.204.0 - 195.118.204.255 se -195.118.205.0 - 195.118.205.255 hr -195.118.206.0 - 195.118.206.255 si -195.118.207.0 - 195.118.207.255 za -195.118.208.0 - 195.118.213.255 be -195.118.214.0 - 195.118.215.255 se -195.118.216.0 - 195.118.220.255 gb -195.118.221.0 - 195.118.223.255 fr -195.118.224.0 - 195.118.225.255 se -195.118.226.0 - 195.118.227.255 it -195.118.228.0 - 195.118.228.255 gb -195.118.229.0 - 195.118.229.255 es -195.118.230.0 - 195.118.230.255 it -195.118.231.0 - 195.118.231.255 fr -195.118.232.0 - 195.118.236.255 de -195.118.237.0 - 195.118.237.255 fr -195.118.238.0 - 195.118.239.255 gb -195.118.240.0 - 195.118.241.255 dk -195.118.242.0 - 195.118.242.255 gb -195.118.243.0 - 195.118.243.255 be -195.118.244.0 - 195.118.244.23 se -195.118.244.24 - 195.118.244.255 eu -195.118.245.0 - 195.118.245.255 gb -195.118.246.0 - 195.118.251.255 dk -195.118.252.0 - 195.118.254.255 at -195.118.255.0 - 195.118.255.255 be -195.119.0.0 - 195.119.0.135 eu -195.119.0.136 - 195.119.0.143 no -195.119.0.144 - 195.119.0.159 eu -195.119.0.160 - 195.119.0.223 no -195.119.0.224 - 195.119.0.255 eu -195.119.1.0 - 195.119.1.255 no -195.119.2.0 - 195.119.3.255 eu -195.119.4.0 - 195.119.5.255 no -195.119.6.0 - 195.119.63.255 eu -195.119.64.0 - 195.119.65.255 fi -195.119.66.0 - 195.119.66.255 eu -195.119.67.0 - 195.119.75.255 fi -195.119.76.0 - 195.119.95.255 eu -195.119.96.0 - 195.119.97.255 ch -195.119.98.0 - 195.119.104.255 eu -195.119.105.0 - 195.119.108.255 ch -195.119.109.0 - 195.119.109.255 eu -195.119.110.0 - 195.119.114.255 ch -195.119.115.0 - 195.119.118.255 eu -195.119.119.0 - 195.119.119.127 ch -195.119.119.128 - 195.119.121.255 eu -195.119.122.0 - 195.119.122.255 ch -195.119.123.0 - 195.119.127.255 eu -195.119.128.0 - 195.119.128.255 gr -195.119.129.0 - 195.119.129.255 eu -195.119.130.0 - 195.119.130.59 gr -195.119.130.60 - 195.119.130.63 eu -195.119.130.64 - 195.119.130.71 gr -195.119.130.72 - 195.119.130.75 eu -195.119.130.76 - 195.119.130.91 gr -195.119.130.92 - 195.119.130.95 eu -195.119.130.96 - 195.119.130.175 gr -195.119.130.176 - 195.119.130.179 eu -195.119.130.180 - 195.119.130.195 gr -195.119.130.196 - 195.119.130.199 eu -195.119.130.200 - 195.119.130.255 gr -195.119.131.0 - 195.119.132.15 eu -195.119.132.16 - 195.119.132.31 gr -195.119.132.32 - 195.119.133.63 eu -195.119.133.64 - 195.119.133.191 gr -195.119.133.192 - 195.119.147.255 eu -195.119.148.0 - 195.119.148.255 gr -195.119.149.0 - 195.119.149.255 eu -195.119.150.0 - 195.119.150.255 gr -195.119.151.0 - 195.119.182.255 eu -195.119.183.0 - 195.119.183.255 cz -195.119.184.0 - 195.119.184.255 eu -195.119.185.0 - 195.119.187.127 cz -195.119.187.128 - 195.119.188.255 eu -195.119.189.0 - 195.119.189.127 cz -195.119.189.128 - 195.119.190.255 eu -195.119.191.0 - 195.119.191.255 cz -195.119.192.0 - 195.119.255.255 eu +195.118.120.0 - 195.118.143.255 eu +195.118.144.0 - 195.118.151.255 gb +195.118.152.0 - 195.118.159.255 eu +195.118.160.0 - 195.118.163.255 gb +195.118.164.0 - 195.118.183.255 eu +195.118.184.0 - 195.118.191.255 gb +195.118.192.0 - 195.118.208.255 eu +195.118.209.0 - 195.118.209.255 be +195.118.210.0 - 195.118.247.255 eu +195.118.248.0 - 195.118.251.255 dk +195.118.252.0 - 195.119.67.255 eu +195.119.68.0 - 195.119.71.255 fi +195.119.72.0 - 195.119.72.255 eu +195.119.73.0 - 195.119.75.255 fi +195.119.76.0 - 195.119.127.255 eu +195.119.128.0 - 195.119.159.255 gr +195.119.160.0 - 195.119.255.255 eu 195.120.0.0 - 195.120.255.255 it 195.121.0.0 - 195.121.255.255 nl -195.122.0.0 - 195.122.31.255 lv +195.122.0.0 - 195.122.25.116 lv +195.122.25.117 - 195.122.25.117 us +195.122.25.118 - 195.122.31.255 lv 195.122.32.0 - 195.122.63.255 gb 195.122.64.0 - 195.122.95.255 it 195.122.96.0 - 195.122.127.255 be -195.122.128.0 - 195.122.130.127 de -195.122.130.128 - 195.122.130.159 gb -195.122.130.160 - 195.122.130.199 de -195.122.130.200 - 195.122.130.207 gb -195.122.130.208 - 195.122.131.255 de -195.122.132.0 - 195.122.132.255 gb -195.122.133.0 - 195.122.138.255 de -195.122.139.0 - 195.122.139.159 gb -195.122.139.160 - 195.122.139.191 de -195.122.139.192 - 195.122.140.255 gb -195.122.141.0 - 195.122.141.255 de -195.122.142.0 - 195.122.143.255 gb -195.122.144.0 - 195.122.145.255 de -195.122.146.0 - 195.122.148.255 gb -195.122.149.0 - 195.122.150.23 de -195.122.150.24 - 195.122.150.255 gb -195.122.151.0 - 195.122.153.255 de -195.122.154.0 - 195.122.157.255 gb -195.122.158.0 - 195.122.158.255 de -195.122.159.0 - 195.122.159.31 gb -195.122.159.32 - 195.122.159.51 de -195.122.159.52 - 195.122.159.55 gb -195.122.159.56 - 195.122.159.59 de -195.122.159.60 - 195.122.159.191 gb +195.122.128.0 - 195.122.133.255 gb +195.122.134.0 - 195.122.135.255 de +195.122.136.0 - 195.122.136.255 gb +195.122.137.0 - 195.122.138.255 de +195.122.139.0 - 195.122.147.255 gb +195.122.148.0 - 195.122.148.255 us +195.122.149.0 - 195.122.149.255 gb +195.122.150.0 - 195.122.150.255 de +195.122.151.0 - 195.122.156.255 gb +195.122.157.0 - 195.122.157.255 de +195.122.158.0 - 195.122.159.191 gb 195.122.159.192 - 195.122.159.224 de -195.122.159.225 - 195.122.159.255 gb -195.122.160.0 - 195.122.160.15 de -195.122.160.16 - 195.122.160.63 gb -195.122.160.64 - 195.122.160.95 de -195.122.160.96 - 195.122.160.127 gb -195.122.160.128 - 195.122.163.255 de -195.122.164.0 - 195.122.168.255 gb -195.122.169.0 - 195.122.169.63 de -195.122.169.64 - 195.122.169.127 gb -195.122.169.128 - 195.122.169.223 de -195.122.169.224 - 195.122.169.247 gb -195.122.169.248 - 195.122.169.255 de -195.122.170.0 - 195.122.171.255 gb +195.122.159.225 - 195.122.160.127 gb +195.122.160.128 - 195.122.160.255 de +195.122.161.0 - 195.122.171.255 gb 195.122.172.0 - 195.122.174.255 de 195.122.175.0 - 195.122.179.255 gb 195.122.180.0 - 195.122.183.255 de -195.122.184.0 - 195.122.186.255 gb -195.122.187.0 - 195.122.187.95 de -195.122.187.96 - 195.122.187.103 gb -195.122.187.104 - 195.122.187.255 de -195.122.188.0 - 195.122.191.255 gb +195.122.184.0 - 195.122.191.255 gb 195.122.192.0 - 195.122.223.255 cz 195.122.224.0 - 195.122.255.255 ru 195.123.0.0 - 195.123.255.255 ua -195.124.0.0 - 195.124.154.207 de -195.124.154.208 - 195.124.154.215 a2 -195.124.154.216 - 195.124.237.135 de -195.124.237.136 - 195.124.237.143 pl -195.124.237.144 - 195.125.14.255 de -195.125.15.0 - 195.125.15.255 ch -195.125.16.0 - 195.125.157.127 de -195.125.157.128 - 195.125.157.143 pl -195.125.157.144 - 195.126.101.151 de -195.126.101.152 - 195.126.101.159 a2 -195.126.101.160 - 195.127.67.239 de -195.127.67.240 - 195.127.67.247 gb -195.127.67.248 - 195.128.3.255 de +195.124.0.0 - 195.124.17.255 de +195.124.18.0 - 195.124.18.255 eu +195.124.19.0 - 195.127.58.255 de +195.127.59.0 - 195.127.59.255 eu +195.127.60.0 - 195.128.3.255 de 195.128.4.0 - 195.128.7.255 se 195.128.8.0 - 195.128.11.255 nl -195.128.12.0 - 195.128.15.255 gb 195.128.16.0 - 195.128.19.255 ua 195.128.20.0 - 195.128.23.255 de -195.128.24.0 - 195.128.27.255 cy 195.128.28.0 - 195.128.31.255 pl 195.128.32.0 - 195.128.39.255 tr 195.128.40.0 - 195.128.47.255 de -195.128.48.0 - 195.128.103.255 ru +195.128.48.0 - 195.128.95.255 ru 195.128.104.0 - 195.128.111.255 at 195.128.112.0 - 195.128.119.255 pl 195.128.120.0 - 195.128.127.255 ru @@ -112940,7 +91399,6 @@ 195.128.156.0 - 195.128.156.255 de 195.128.157.0 - 195.128.159.255 ru 195.128.160.0 - 195.128.161.255 nl -195.128.162.0 - 195.128.163.255 ru 195.128.164.0 - 195.128.165.255 ro 195.128.166.0 - 195.128.167.255 am 195.128.168.0 - 195.128.169.255 ro @@ -112948,7 +91406,6 @@ 195.128.172.0 - 195.128.173.255 pl 195.128.174.0 - 195.128.175.255 dk 195.128.176.0 - 195.128.177.255 il -195.128.178.0 - 195.128.179.255 ua 195.128.180.0 - 195.128.181.255 pl 195.128.182.0 - 195.128.183.255 ua 195.128.184.0 - 195.128.187.255 nl @@ -112956,94 +91413,26 @@ 195.128.190.0 - 195.128.191.255 gb 195.128.192.0 - 195.128.223.255 cz 195.128.224.0 - 195.128.225.255 bg -195.128.226.0 - 195.128.227.255 ua +195.128.226.0 - 195.128.227.255 gb 195.128.228.0 - 195.128.229.255 pl 195.128.230.0 - 195.128.231.255 ua 195.128.232.0 - 195.128.233.255 hu 195.128.234.0 - 195.128.235.255 it 195.128.236.0 - 195.128.237.255 dk 195.128.238.0 - 195.128.239.255 gb -195.128.240.0 - 195.128.241.255 se 195.128.242.0 - 195.128.243.255 pl 195.128.244.0 - 195.128.247.255 ru 195.128.248.0 - 195.128.249.255 ua 195.128.250.0 - 195.128.251.255 gb 195.128.252.0 - 195.128.253.255 ua -195.128.254.0 - 195.128.255.255 tr -195.129.0.0 - 195.129.0.63 de -195.129.0.64 - 195.129.0.127 nl -195.129.0.128 - 195.129.0.143 eu -195.129.0.144 - 195.129.0.151 gb -195.129.0.152 - 195.129.1.31 eu -195.129.1.32 - 195.129.1.47 gb -195.129.1.48 - 195.129.1.127 eu -195.129.1.128 - 195.129.1.255 it -195.129.2.0 - 195.129.2.7 nl -195.129.2.8 - 195.129.2.15 be -195.129.2.16 - 195.129.2.127 eu -195.129.2.128 - 195.129.2.175 be -195.129.2.176 - 195.129.14.255 eu -195.129.15.0 - 195.129.15.255 gb -195.129.16.0 - 195.129.17.255 eu -195.129.18.0 - 195.129.19.255 gb -195.129.20.0 - 195.129.20.63 eu -195.129.20.64 - 195.129.20.79 be -195.129.20.80 - 195.129.20.159 eu -195.129.20.160 - 195.129.20.175 be -195.129.20.176 - 195.129.20.191 gr -195.129.20.192 - 195.129.20.223 no -195.129.20.224 - 195.129.20.239 ch -195.129.20.240 - 195.129.22.63 eu -195.129.22.64 - 195.129.22.95 be -195.129.22.96 - 195.129.22.127 fr -195.129.22.128 - 195.129.22.159 it -195.129.22.160 - 195.129.22.191 eu -195.129.22.192 - 195.129.22.255 ie -195.129.23.0 - 195.129.25.255 eu -195.129.26.0 - 195.129.27.255 it -195.129.28.0 - 195.129.31.255 gb -195.129.32.0 - 195.129.32.255 eu -195.129.33.0 - 195.129.35.255 ch -195.129.36.0 - 195.129.36.255 ie -195.129.37.0 - 195.129.37.255 be -195.129.38.0 - 195.129.38.95 gb -195.129.38.96 - 195.129.38.127 eu -195.129.38.128 - 195.129.38.191 nl -195.129.38.192 - 195.129.38.255 eu -195.129.39.0 - 195.129.39.255 ch -195.129.40.0 - 195.129.40.255 eu -195.129.41.0 - 195.129.41.63 be -195.129.41.64 - 195.129.44.255 eu -195.129.45.0 - 195.129.45.255 it -195.129.46.0 - 195.129.47.255 eu +195.129.0.0 - 195.129.47.255 eu 195.129.48.0 - 195.129.51.255 it -195.129.52.0 - 195.129.52.255 se -195.129.53.0 - 195.129.63.255 eu -195.129.64.0 - 195.129.64.255 ch -195.129.65.0 - 195.129.65.255 eu -195.129.66.0 - 195.129.66.255 it -195.129.67.0 - 195.129.67.255 be -195.129.68.0 - 195.129.73.255 eu -195.129.74.0 - 195.129.74.255 ch -195.129.75.0 - 195.129.79.255 eu -195.129.80.0 - 195.129.80.255 ie -195.129.81.0 - 195.129.81.127 eu -195.129.81.128 - 195.129.81.255 ch -195.129.82.0 - 195.129.93.255 eu -195.129.94.0 - 195.129.94.255 ch -195.129.95.0 - 195.129.98.255 eu -195.129.99.0 - 195.129.99.255 ch -195.129.100.0 - 195.129.103.255 eu -195.129.104.0 - 195.129.105.255 ch -195.129.106.0 - 195.129.117.255 eu -195.129.118.0 - 195.129.118.255 ch -195.129.119.0 - 195.129.255.255 eu +195.129.52.0 - 195.129.255.255 eu 195.130.0.0 - 195.130.31.255 gb 195.130.32.0 - 195.130.63.255 ba 195.130.64.0 - 195.130.127.255 gr 195.130.128.0 - 195.130.159.255 be 195.130.160.0 - 195.130.191.255 ch -195.130.192.0 - 195.130.192.255 de 195.130.193.0 - 195.130.193.255 is 195.130.194.0 - 195.130.194.255 si 195.130.195.0 - 195.130.195.255 it @@ -113054,11 +91443,9 @@ 195.130.200.0 - 195.130.200.255 se 195.130.201.0 - 195.130.201.255 gb 195.130.202.0 - 195.130.203.255 hu -195.130.204.0 - 195.130.204.255 ru 195.130.205.0 - 195.130.205.255 lv -195.130.206.0 - 195.130.206.255 sa 195.130.207.0 - 195.130.207.255 fr -195.130.208.0 - 195.130.209.255 ru +195.130.209.0 - 195.130.209.255 ru 195.130.210.0 - 195.130.210.255 gb 195.130.211.0 - 195.130.211.255 is 195.130.212.0 - 195.130.212.255 pl @@ -113074,23 +91461,18 @@ 195.130.222.0 - 195.130.222.255 fr 195.130.223.0 - 195.130.223.255 nl 195.130.224.0 - 195.130.255.255 it -195.131.0.0 - 195.131.9.175 ru -195.131.9.176 - 195.131.9.183 ro -195.131.9.184 - 195.131.255.255 ru +195.131.0.0 - 195.131.255.255 ru 195.132.0.0 - 195.132.255.255 fr 195.133.0.0 - 195.133.255.255 ru 195.134.0.0 - 195.134.31.255 gb 195.134.32.0 - 195.134.63.255 no 195.134.64.0 - 195.134.127.255 gr 195.134.128.0 - 195.134.159.255 ch -195.134.160.0 - 195.134.191.255 fr -195.134.192.0 - 195.134.202.63 gb -195.134.202.64 - 195.134.202.95 fr -195.134.202.96 - 195.134.209.255 gb -195.134.210.0 - 195.134.210.127 fr -195.134.210.128 - 195.134.219.255 gb -195.134.220.0 - 195.134.220.255 fr -195.134.221.0 - 195.134.223.255 gb +195.134.160.0 - 195.134.167.255 fr +195.134.168.0 - 195.134.175.255 nl +195.134.176.0 - 195.134.183.255 it +195.134.184.0 - 195.134.191.255 sa +195.134.192.0 - 195.134.223.255 gb 195.134.224.0 - 195.134.255.255 fi 195.135.0.0 - 195.135.127.255 it 195.135.128.0 - 195.135.191.255 de @@ -113104,20 +91486,16 @@ 195.135.220.0 - 195.135.227.255 de 195.135.228.0 - 195.135.231.255 pl 195.135.232.0 - 195.135.243.255 ru -195.135.244.0 - 195.135.247.255 ua 195.135.248.0 - 195.135.251.255 es -195.135.252.0 - 195.135.255.255 cy 195.136.0.0 - 195.136.255.255 pl 195.137.0.0 - 195.137.127.255 gb 195.137.128.0 - 195.137.159.255 it 195.137.160.0 - 195.137.160.255 by 195.137.161.0 - 195.137.162.255 pl 195.137.163.0 - 195.137.163.255 de -195.137.164.0 - 195.137.164.255 il 195.137.165.0 - 195.137.165.255 nl 195.137.166.0 - 195.137.166.255 ro 195.137.167.0 - 195.137.167.255 ua -195.137.168.0 - 195.137.168.255 pl 195.137.169.0 - 195.137.169.255 nl 195.137.170.0 - 195.137.170.255 de 195.137.171.0 - 195.137.171.255 ru @@ -113135,37 +91513,35 @@ 195.137.183.0 - 195.137.183.255 dk 195.137.184.0 - 195.137.184.255 fr 195.137.185.0 - 195.137.185.255 ua -195.137.186.0 - 195.137.186.255 ro 195.137.187.0 - 195.137.187.255 ru -195.137.188.0 - 195.137.188.255 ps 195.137.189.0 - 195.137.189.255 pl 195.137.190.0 - 195.137.190.255 kw 195.137.191.0 - 195.137.191.255 de -195.137.192.0 - 195.137.193.255 ua 195.137.194.0 - 195.137.195.255 dk 195.137.196.0 - 195.137.197.255 ua 195.137.198.0 - 195.137.199.255 de 195.137.200.0 - 195.137.201.255 ru 195.137.202.0 - 195.137.203.255 ua -195.137.204.0 - 195.137.205.255 ro 195.137.206.0 - 195.137.207.255 ua 195.137.208.0 - 195.137.209.255 pl 195.137.210.0 - 195.137.213.255 de 195.137.214.0 - 195.137.215.255 nl 195.137.216.0 - 195.137.217.255 de 195.137.218.0 - 195.137.219.255 ua -195.137.220.0 - 195.137.221.255 gb +195.137.220.0 - 195.137.221.255 us 195.137.222.0 - 195.137.223.255 tr 195.137.224.0 - 195.137.225.255 de 195.137.226.0 - 195.137.227.255 ua 195.137.228.0 - 195.137.229.255 lu -195.137.230.0 - 195.137.231.255 nl +195.137.230.0 - 195.137.230.255 nl +195.137.231.0 - 195.137.231.255 eu 195.137.232.0 - 195.137.233.255 ua 195.137.234.0 - 195.137.235.255 de 195.137.236.0 - 195.137.237.255 dk 195.137.238.0 - 195.137.239.255 at 195.137.240.0 - 195.137.241.255 ua -195.137.242.0 - 195.137.243.255 fr +195.137.242.0 - 195.137.242.255 nl +195.137.243.0 - 195.137.243.255 be 195.137.244.0 - 195.137.245.255 ua 195.137.246.0 - 195.137.247.255 pl 195.137.248.0 - 195.137.249.255 fr @@ -113176,9 +91552,7 @@ 195.138.32.0 - 195.138.63.255 de 195.138.64.0 - 195.138.95.255 ua 195.138.96.0 - 195.138.127.255 md -195.138.128.0 - 195.138.135.159 bg -195.138.135.160 - 195.138.135.167 de -195.138.135.168 - 195.138.159.255 bg +195.138.128.0 - 195.138.159.255 bg 195.138.160.0 - 195.138.191.255 ua 195.138.192.0 - 195.138.192.255 ro 195.138.193.0 - 195.138.193.255 ua @@ -113193,8 +91567,7 @@ 195.138.203.0 - 195.138.203.255 ch 195.138.204.0 - 195.138.205.255 gb 195.138.206.0 - 195.138.206.255 ru -195.138.207.0 - 195.138.207.255 ch -195.138.208.0 - 195.138.208.255 pl +195.138.207.0 - 195.138.208.255 pl 195.138.209.0 - 195.138.209.255 es 195.138.210.0 - 195.138.210.255 ru 195.138.211.0 - 195.138.211.255 pl @@ -113203,18 +91576,19 @@ 195.138.214.0 - 195.138.214.255 ro 195.138.215.0 - 195.138.216.255 ch 195.138.217.0 - 195.138.219.255 ua -195.138.220.0 - 195.138.220.255 ru 195.138.221.0 - 195.138.221.255 se 195.138.222.0 - 195.138.222.255 ro 195.138.223.0 - 195.138.223.255 de -195.138.224.0 - 195.138.255.255 gb +195.138.224.0 - 195.138.231.255 mt +195.138.232.0 - 195.138.239.255 ru +195.138.240.0 - 195.138.248.255 de +195.138.249.0 - 195.138.249.255 cz +195.138.250.0 - 195.138.255.255 de 195.139.0.0 - 195.139.255.255 no 195.140.0.0 - 195.140.127.255 de -195.140.128.0 - 195.140.131.255 tj 195.140.132.0 - 195.140.135.255 dk 195.140.136.0 - 195.140.139.255 at 195.140.140.0 - 195.140.143.255 fr -195.140.144.0 - 195.140.147.255 nl 195.140.148.0 - 195.140.151.255 fr 195.140.152.0 - 195.140.155.255 pl 195.140.156.0 - 195.140.159.255 es @@ -113233,268 +91607,40 @@ 195.140.208.0 - 195.140.215.255 de 195.140.216.0 - 195.140.219.255 gb 195.140.220.0 - 195.140.223.255 pl -195.140.224.0 - 195.140.231.255 ua +195.140.228.0 - 195.140.231.255 ua 195.140.232.0 - 195.140.235.255 de 195.140.236.0 - 195.140.239.255 pl 195.140.240.0 - 195.140.243.255 nl 195.140.244.0 - 195.140.247.255 ua 195.140.248.0 - 195.140.251.255 mz 195.140.252.0 - 195.140.255.255 cz -195.141.0.0 - 195.141.51.31 ch -195.141.51.32 - 195.141.51.47 de -195.141.51.48 - 195.141.255.255 ch +195.141.0.0 - 195.141.255.255 ch 195.142.0.0 - 195.142.255.255 tr -195.143.0.0 - 195.143.5.255 gb -195.143.6.0 - 195.143.6.255 de -195.143.7.0 - 195.143.8.143 gb -195.143.8.144 - 195.143.8.159 de -195.143.8.160 - 195.143.17.55 gb -195.143.17.56 - 195.143.17.63 de -195.143.17.64 - 195.143.17.239 gb -195.143.17.240 - 195.143.17.255 de -195.143.18.0 - 195.143.18.255 gb -195.143.19.0 - 195.143.21.255 de -195.143.22.0 - 195.143.28.255 gb -195.143.29.0 - 195.143.29.127 de -195.143.29.128 - 195.143.39.15 gb -195.143.39.16 - 195.143.39.31 de -195.143.39.32 - 195.143.39.47 gb -195.143.39.48 - 195.143.39.63 de -195.143.39.64 - 195.143.85.127 gb -195.143.85.128 - 195.143.85.159 de -195.143.85.160 - 195.143.86.255 gb -195.143.87.0 - 195.143.87.255 de -195.143.88.0 - 195.143.89.255 gb -195.143.90.0 - 195.143.92.3 de -195.143.92.4 - 195.143.92.7 gb -195.143.92.8 - 195.143.92.23 de -195.143.92.24 - 195.143.92.31 gb -195.143.92.32 - 195.143.92.55 de -195.143.92.56 - 195.143.92.63 gb -195.143.92.64 - 195.143.92.135 de -195.143.92.136 - 195.143.92.143 gb -195.143.92.144 - 195.143.92.255 de -195.143.93.0 - 195.143.93.39 gb -195.143.93.40 - 195.143.93.47 de -195.143.93.48 - 195.143.93.55 gb -195.143.93.56 - 195.143.93.67 de -195.143.93.68 - 195.143.93.95 gb -195.143.93.96 - 195.143.93.111 de -195.143.93.112 - 195.143.93.119 gb -195.143.93.120 - 195.143.93.191 de -195.143.93.192 - 195.143.93.207 gb -195.143.93.208 - 195.143.93.215 de -195.143.93.216 - 195.143.93.223 gb -195.143.93.224 - 195.143.93.255 de -195.143.94.0 - 195.143.104.15 gb -195.143.104.16 - 195.143.104.27 de -195.143.104.28 - 195.143.104.111 gb -195.143.104.112 - 195.143.105.143 de -195.143.105.144 - 195.143.105.151 gb -195.143.105.152 - 195.143.106.95 de -195.143.106.96 - 195.143.106.103 gb -195.143.106.104 - 195.143.106.111 de -195.143.106.112 - 195.143.106.119 gb -195.143.106.120 - 195.143.106.135 de -195.143.106.136 - 195.143.106.143 gb -195.143.106.144 - 195.143.106.191 de -195.143.106.192 - 195.143.106.199 gb -195.143.106.200 - 195.143.106.239 de -195.143.106.240 - 195.143.107.255 gb -195.143.108.0 - 195.143.109.255 de -195.143.110.0 - 195.143.111.71 gb -195.143.111.72 - 195.143.111.79 de -195.143.111.80 - 195.143.111.127 gb -195.143.111.128 - 195.143.112.63 de -195.143.112.64 - 195.143.113.135 gb -195.143.113.136 - 195.143.113.143 de -195.143.113.144 - 195.143.115.255 gb -195.143.116.0 - 195.143.117.87 de -195.143.117.88 - 195.143.117.143 gb -195.143.117.144 - 195.143.117.151 de -195.143.117.152 - 195.143.117.159 gb -195.143.117.160 - 195.143.117.191 de -195.143.117.192 - 195.143.117.199 gb -195.143.117.200 - 195.143.118.135 de -195.143.118.136 - 195.143.118.143 gb -195.143.118.144 - 195.143.119.47 de -195.143.119.48 - 195.143.120.255 gb -195.143.121.0 - 195.143.121.31 de -195.143.121.32 - 195.143.122.15 gb -195.143.122.16 - 195.143.122.23 de -195.143.122.24 - 195.143.122.31 gb -195.143.122.32 - 195.143.122.39 de -195.143.122.40 - 195.143.132.255 gb -195.143.133.0 - 195.143.133.15 de -195.143.133.16 - 195.143.135.15 gb -195.143.135.16 - 195.143.135.39 de -195.143.135.40 - 195.143.135.47 gb -195.143.135.48 - 195.143.135.63 de -195.143.135.64 - 195.143.135.79 gb -195.143.135.80 - 195.143.135.95 de -195.143.135.96 - 195.143.135.159 gb -195.143.135.160 - 195.143.135.167 de -195.143.135.168 - 195.143.135.191 gb -195.143.135.192 - 195.143.135.199 de -195.143.135.200 - 195.143.135.207 gb -195.143.135.208 - 195.143.135.223 de -195.143.135.224 - 195.143.154.255 gb -195.143.155.0 - 195.143.155.255 de -195.143.156.0 - 195.143.161.255 gb -195.143.162.0 - 195.143.162.255 de -195.143.163.0 - 195.143.165.31 gb -195.143.165.32 - 195.143.165.47 de -195.143.165.48 - 195.143.176.255 gb -195.143.177.0 - 195.143.177.255 de -195.143.178.0 - 195.143.178.63 gb -195.143.178.64 - 195.143.178.79 de -195.143.178.80 - 195.143.178.255 gb -195.143.179.0 - 195.143.179.255 de -195.143.180.0 - 195.143.188.15 gb -195.143.188.16 - 195.143.188.31 de -195.143.188.32 - 195.143.188.39 gb -195.143.188.40 - 195.143.188.55 de -195.143.188.56 - 195.143.188.95 gb -195.143.188.96 - 195.143.188.127 de -195.143.188.128 - 195.143.188.135 gb -195.143.188.136 - 195.143.188.215 de -195.143.188.216 - 195.143.188.223 gb -195.143.188.224 - 195.143.189.255 de -195.143.190.0 - 195.143.192.31 gb -195.143.192.32 - 195.143.192.35 de -195.143.192.36 - 195.143.192.79 gb -195.143.192.80 - 195.143.192.87 de -195.143.192.88 - 195.143.193.15 gb -195.143.193.16 - 195.143.193.19 de -195.143.193.20 - 195.143.193.55 gb -195.143.193.56 - 195.143.193.63 de -195.143.193.64 - 195.143.193.159 gb -195.143.193.160 - 195.143.193.191 de -195.143.193.192 - 195.143.193.207 gb -195.143.193.208 - 195.143.193.223 de -195.143.193.224 - 195.143.194.63 gb -195.143.194.64 - 195.143.194.67 de -195.143.194.68 - 195.143.194.191 gb -195.143.194.192 - 195.143.194.199 de -195.143.194.200 - 195.143.196.79 gb -195.143.196.80 - 195.143.196.95 de -195.143.196.96 - 195.143.196.159 gb -195.143.196.160 - 195.143.196.167 de -195.143.196.168 - 195.143.196.207 gb -195.143.196.208 - 195.143.196.215 de -195.143.196.216 - 195.143.196.223 gb -195.143.196.224 - 195.143.196.239 de -195.143.196.240 - 195.143.197.111 gb -195.143.197.112 - 195.143.197.127 de -195.143.197.128 - 195.143.198.99 gb -195.143.198.100 - 195.143.198.103 de -195.143.198.104 - 195.143.198.120 gb -195.143.198.121 - 195.143.198.121 de -195.143.198.122 - 195.143.199.127 gb -195.143.199.128 - 195.143.200.7 de -195.143.200.8 - 195.143.200.112 gb -195.143.200.113 - 195.143.200.113 de -195.143.200.114 - 195.143.201.127 gb -195.143.201.128 - 195.143.201.143 de -195.143.201.144 - 195.143.201.199 gb -195.143.201.200 - 195.143.201.207 de -195.143.201.208 - 195.143.201.247 gb -195.143.201.248 - 195.143.201.255 de -195.143.202.0 - 195.143.204.47 gb -195.143.204.48 - 195.143.204.63 de -195.143.204.64 - 195.143.204.223 gb -195.143.204.224 - 195.143.204.239 de -195.143.204.240 - 195.143.205.239 gb -195.143.205.240 - 195.143.205.255 de -195.143.206.0 - 195.143.206.103 gb -195.143.206.104 - 195.143.206.111 de -195.143.206.112 - 195.143.207.79 gb -195.143.207.80 - 195.143.207.87 de -195.143.207.88 - 195.143.207.223 gb -195.143.207.224 - 195.143.207.239 de -195.143.207.240 - 195.143.207.255 gb -195.143.208.0 - 195.143.208.7 de -195.143.208.8 - 195.143.208.239 gb -195.143.208.240 - 195.143.208.247 de -195.143.208.248 - 195.143.210.79 gb -195.143.210.80 - 195.143.210.95 de -195.143.210.96 - 195.143.210.127 gb -195.143.210.128 - 195.143.210.143 de -195.143.210.144 - 195.143.211.167 gb -195.143.211.168 - 195.143.211.175 de -195.143.211.176 - 195.143.212.72 gb -195.143.212.73 - 195.143.212.73 de -195.143.212.74 - 195.143.212.79 gb -195.143.212.80 - 195.143.212.127 de -195.143.212.128 - 195.143.213.63 gb -195.143.213.64 - 195.143.213.79 de -195.143.213.80 - 195.143.213.127 gb -195.143.213.128 - 195.143.213.135 de -195.143.213.136 - 195.143.215.79 gb -195.143.215.80 - 195.143.215.87 de -195.143.215.88 - 195.143.217.175 gb -195.143.217.176 - 195.143.217.183 de -195.143.217.184 - 195.143.222.39 gb -195.143.222.40 - 195.143.222.47 de -195.143.222.48 - 195.143.224.151 gb -195.143.224.152 - 195.143.224.155 de -195.143.224.156 - 195.143.231.79 gb -195.143.231.80 - 195.143.231.95 de -195.143.231.96 - 195.143.232.143 gb -195.143.232.144 - 195.143.232.151 de -195.143.232.152 - 195.143.232.223 gb -195.143.232.224 - 195.143.232.231 de -195.143.232.232 - 195.143.232.239 gb -195.143.232.240 - 195.143.233.15 de -195.143.233.16 - 195.143.234.143 gb -195.143.234.144 - 195.143.234.159 de -195.143.234.160 - 195.143.234.183 gb -195.143.234.184 - 195.143.234.191 de -195.143.234.192 - 195.143.235.87 gb -195.143.235.88 - 195.143.235.111 de -195.143.235.112 - 195.143.235.135 gb -195.143.235.136 - 195.143.235.139 de -195.143.235.140 - 195.143.236.151 gb -195.143.236.152 - 195.143.236.159 de -195.143.236.160 - 195.143.236.191 gb -195.143.236.192 - 195.143.236.207 de -195.143.236.208 - 195.143.237.23 gb -195.143.237.24 - 195.143.237.31 de -195.143.237.32 - 195.143.237.95 gb -195.143.237.96 - 195.143.237.111 de -195.143.237.112 - 195.143.237.191 gb -195.143.237.192 - 195.143.237.207 de -195.143.237.208 - 195.143.238.124 gb -195.143.238.125 - 195.143.238.125 de -195.143.238.126 - 195.143.239.95 gb -195.143.239.96 - 195.143.239.111 de -195.143.239.112 - 195.143.239.239 gb -195.143.239.240 - 195.143.240.15 de -195.143.240.16 - 195.143.240.23 gb -195.143.240.24 - 195.143.240.31 de -195.143.240.32 - 195.143.240.63 gb -195.143.240.64 - 195.143.240.79 de -195.143.240.80 - 195.143.241.15 gb -195.143.241.16 - 195.143.241.23 de -195.143.241.24 - 195.143.241.111 gb -195.143.241.112 - 195.143.241.127 de -195.143.241.128 - 195.143.241.239 gb -195.143.241.240 - 195.143.241.255 de -195.143.242.0 - 195.143.242.143 gb -195.143.242.144 - 195.143.242.151 de -195.143.242.152 - 195.143.244.159 gb -195.143.244.160 - 195.143.244.175 de -195.143.244.176 - 195.143.247.231 gb -195.143.247.232 - 195.143.247.239 de -195.143.247.240 - 195.143.248.143 gb -195.143.248.144 - 195.143.248.159 de -195.143.248.160 - 195.143.250.31 gb -195.143.250.32 - 195.143.250.47 de -195.143.250.48 - 195.143.250.79 gb -195.143.250.80 - 195.143.250.95 de -195.143.250.96 - 195.143.252.255 gb -195.143.253.0 - 195.143.253.255 de -195.143.254.0 - 195.144.0.255 gb +195.143.0.0 - 195.143.0.63 gb +195.143.0.64 - 195.143.0.79 ru +195.143.0.80 - 195.143.0.87 gb +195.143.0.88 - 195.143.0.95 ru +195.143.0.96 - 195.143.24.15 gb +195.143.24.16 - 195.143.24.23 de +195.143.24.24 - 195.143.24.143 gb +195.143.24.144 - 195.143.24.151 it +195.143.24.152 - 195.143.24.175 gb +195.143.24.176 - 195.143.24.183 es +195.143.24.184 - 195.143.24.207 gb +195.143.24.208 - 195.143.24.215 fr +195.143.24.216 - 195.143.93.207 gb +195.143.93.208 - 195.143.93.223 de +195.143.93.224 - 195.143.105.59 gb +195.143.105.60 - 195.143.105.63 de +195.143.105.64 - 195.143.117.199 gb +195.143.117.200 - 195.143.117.207 de +195.143.117.208 - 195.143.135.47 gb +195.143.135.48 - 195.143.135.55 de +195.143.135.56 - 195.143.220.191 gb +195.143.220.192 - 195.143.220.255 ch +195.143.221.0 - 195.143.243.255 gb +195.143.244.0 - 195.143.245.255 de +195.143.246.0 - 195.144.0.255 gb 195.144.1.0 - 195.144.1.255 ru 195.144.2.0 - 195.144.2.255 nl 195.144.3.0 - 195.144.3.255 de @@ -113506,7 +91652,7 @@ 195.144.9.0 - 195.144.9.255 pl 195.144.10.0 - 195.144.10.255 nl 195.144.11.0 - 195.144.11.255 fr -195.144.12.0 - 195.144.12.255 be +195.144.12.0 - 195.144.12.255 pl 195.144.13.0 - 195.144.13.255 se 195.144.14.0 - 195.144.14.255 ua 195.144.15.0 - 195.144.15.255 de @@ -113514,11 +91660,10 @@ 195.144.17.0 - 195.144.19.255 gb 195.144.20.0 - 195.144.20.255 hu 195.144.21.0 - 195.144.21.255 ua -195.144.22.0 - 195.144.23.255 de +195.144.22.0 - 195.144.22.255 de 195.144.24.0 - 195.144.24.255 fr 195.144.25.0 - 195.144.25.255 ua 195.144.26.0 - 195.144.26.255 si -195.144.27.0 - 195.144.27.255 ro 195.144.28.0 - 195.144.28.255 ua 195.144.29.0 - 195.144.29.255 ru 195.144.30.0 - 195.144.30.255 ch @@ -113534,8 +91679,8 @@ 195.144.128.128 - 195.144.128.143 gb 195.144.128.144 - 195.144.128.207 eu 195.144.128.208 - 195.144.128.215 gb -195.144.128.216 - 195.144.128.231 eu -195.144.128.232 - 195.144.128.239 gb +195.144.128.216 - 195.144.128.223 eu +195.144.128.224 - 195.144.128.239 gb 195.144.128.240 - 195.144.128.247 eu 195.144.128.248 - 195.144.128.255 gb 195.144.129.0 - 195.144.129.255 eu @@ -113556,16 +91701,16 @@ 195.144.141.0 - 195.144.159.255 gb 195.144.160.0 - 195.144.191.255 ch 195.144.192.0 - 195.144.255.255 ru -195.145.0.0 - 195.145.57.239 de -195.145.57.240 - 195.145.57.247 es -195.145.57.248 - 195.145.172.63 de -195.145.172.64 - 195.145.172.71 at -195.145.172.72 - 195.145.172.255 de -195.145.173.0 - 195.145.173.255 fr -195.145.174.0 - 195.145.210.103 de -195.145.210.104 - 195.145.210.111 be -195.145.210.112 - 195.145.255.255 de -195.146.0.0 - 195.146.31.255 sk +195.145.0.0 - 195.145.11.255 de +195.145.12.0 - 195.145.12.127 eu +195.145.12.128 - 195.145.12.199 de +195.145.12.200 - 195.145.12.255 eu +195.145.13.0 - 195.145.34.129 de +195.145.34.130 - 195.145.34.130 us +195.145.34.131 - 195.145.255.255 de +195.146.0.0 - 195.146.6.255 sk +195.146.7.0 - 195.146.7.255 cz +195.146.8.0 - 195.146.31.255 sk 195.146.32.0 - 195.146.63.255 ir 195.146.64.0 - 195.146.95.255 ru 195.146.96.0 - 195.146.127.255 cz @@ -113578,12 +91723,11 @@ 195.149.64.0 - 195.149.64.255 pl 195.149.65.0 - 195.149.65.255 sa 195.149.66.0 - 195.149.66.255 fr -195.149.67.0 - 195.149.67.255 ro 195.149.68.0 - 195.149.68.255 pl 195.149.69.0 - 195.149.69.255 gb 195.149.70.0 - 195.149.70.255 ua 195.149.71.0 - 195.149.71.255 bg -195.149.72.0 - 195.149.73.255 ro +195.149.72.0 - 195.149.72.255 ro 195.149.74.0 - 195.149.74.255 de 195.149.75.0 - 195.149.75.255 at 195.149.76.0 - 195.149.76.255 de @@ -113593,13 +91737,11 @@ 195.149.83.0 - 195.149.83.255 fi 195.149.84.0 - 195.149.84.255 gb 195.149.85.0 - 195.149.85.255 tr -195.149.86.0 - 195.149.86.255 fr +195.149.86.0 - 195.149.86.255 nl 195.149.87.0 - 195.149.87.255 ru 195.149.88.0 - 195.149.88.255 ua -195.149.89.0 - 195.149.90.255 ru +195.149.89.0 - 195.149.89.255 ru 195.149.91.0 - 195.149.91.255 sa -195.149.92.0 - 195.149.92.255 ch -195.149.93.0 - 195.149.93.255 ru 195.149.94.0 - 195.149.94.255 si 195.149.95.0 - 195.149.95.255 pl 195.149.96.0 - 195.149.96.255 ua @@ -113622,17 +91764,14 @@ 195.149.116.0 - 195.149.116.255 tr 195.149.117.0 - 195.149.117.255 ua 195.149.118.0 - 195.149.118.255 pl -195.149.119.0 - 195.149.119.255 ro -195.149.120.0 - 195.149.120.255 de +195.149.120.0 - 195.149.120.255 eu 195.149.121.0 - 195.149.121.255 gb 195.149.122.0 - 195.149.122.255 de 195.149.123.0 - 195.149.123.255 se 195.149.124.0 - 195.149.124.255 pl 195.149.125.0 - 195.149.125.255 ua 195.149.126.0 - 195.149.127.255 gb -195.149.128.0 - 195.149.144.223 se -195.149.144.224 - 195.149.144.255 an -195.149.145.0 - 195.149.191.255 se +195.149.128.0 - 195.149.191.255 se 195.149.192.0 - 195.149.195.255 rs 195.149.196.0 - 195.149.197.255 ru 195.149.198.0 - 195.149.199.255 pl @@ -113643,44 +91782,14 @@ 195.149.240.0 - 195.149.247.255 at 195.149.248.0 - 195.149.255.255 bg 195.150.0.0 - 195.150.255.255 pl -195.151.0.0 - 195.151.69.255 ru -195.151.70.0 - 195.151.70.255 uz -195.151.71.0 - 195.151.255.255 ru -195.152.0.0 - 195.152.233.191 gb -195.152.233.192 - 195.152.233.207 ie -195.152.233.208 - 195.153.221.255 gb -195.153.222.0 - 195.153.222.23 se -195.153.222.24 - 195.153.222.63 gb -195.153.222.64 - 195.153.222.79 se -195.153.222.80 - 195.153.222.127 gb -195.153.222.128 - 195.153.222.159 se -195.153.222.160 - 195.153.255.255 gb -195.154.0.0 - 195.154.196.159 fr -195.154.196.160 - 195.154.196.191 us -195.154.196.192 - 195.154.210.127 fr -195.154.210.128 - 195.154.210.191 us -195.154.210.192 - 195.154.238.207 fr -195.154.238.208 - 195.154.238.223 us -195.154.238.224 - 195.154.241.127 fr -195.154.241.128 - 195.154.241.159 be -195.154.241.160 - 195.154.243.255 fr -195.154.244.0 - 195.154.244.31 us -195.154.244.32 - 195.154.244.63 fr -195.154.244.64 - 195.154.244.127 us -195.154.244.128 - 195.154.255.255 fr +195.151.0.0 - 195.151.255.255 ru +195.152.0.0 - 195.153.255.255 gb +195.154.0.0 - 195.154.236.255 fr +195.154.237.0 - 195.154.237.255 kp +195.154.238.0 - 195.154.255.255 fr 195.155.0.0 - 195.155.255.255 tr -195.156.0.0 - 195.156.217.255 fi -195.156.218.0 - 195.156.218.255 ax -195.156.219.0 - 195.156.255.255 fi -195.157.0.0 - 195.157.59.31 gb -195.157.59.32 - 195.157.59.47 fr -195.157.59.48 - 195.157.85.239 gb -195.157.85.240 - 195.157.85.255 fr -195.157.86.0 - 195.157.132.127 gb -195.157.132.128 - 195.157.132.159 fr -195.157.132.160 - 195.157.155.255 gb -195.157.156.0 - 195.157.156.127 fr -195.157.156.128 - 195.157.255.255 gb +195.156.0.0 - 195.156.255.255 fi +195.157.0.0 - 195.157.255.255 gb 195.158.0.0 - 195.158.31.255 uz 195.158.32.0 - 195.158.63.255 de 195.158.64.0 - 195.158.127.255 mt @@ -113689,14 +91798,13 @@ 195.158.224.0 - 195.158.225.255 ru 195.158.226.0 - 195.158.227.255 pl 195.158.228.0 - 195.158.229.255 ru -195.158.230.0 - 195.158.231.255 li +195.158.230.0 - 195.158.231.255 ch 195.158.232.0 - 195.158.233.255 ru 195.158.234.0 - 195.158.235.255 ro 195.158.236.0 - 195.158.237.255 de 195.158.238.0 - 195.158.239.255 ru 195.158.240.0 - 195.158.241.255 fr 195.158.242.0 - 195.158.243.255 dk -195.158.244.0 - 195.158.245.255 ru 195.158.246.0 - 195.158.247.255 pl 195.158.248.0 - 195.158.251.255 ru 195.158.252.0 - 195.158.253.255 de @@ -113715,7 +91823,6 @@ 195.160.178.0 - 195.160.181.255 pl 195.160.182.0 - 195.160.183.255 sk 195.160.184.0 - 195.160.185.255 pl -195.160.186.0 - 195.160.187.255 gb 195.160.188.0 - 195.160.189.255 fr 195.160.190.0 - 195.160.191.255 ch 195.160.192.0 - 195.160.195.255 ua @@ -113732,16 +91839,12 @@ 195.160.240.0 - 195.160.243.255 il 195.160.244.0 - 195.160.247.255 ru 195.160.248.0 - 195.160.251.255 de -195.160.252.0 - 195.160.255.255 nl -195.161.0.0 - 195.161.42.255 ru -195.161.43.0 - 195.161.43.255 kz -195.161.44.0 - 195.161.160.79 ru -195.161.160.80 - 195.161.160.95 kg -195.161.160.96 - 195.161.255.255 ru +195.160.252.0 - 195.160.255.255 eu +195.161.0.0 - 195.161.255.255 ru 195.162.0.0 - 195.162.1.255 ua 195.162.2.0 - 195.162.3.255 gb 195.162.4.0 - 195.162.5.255 de -195.162.6.0 - 195.162.11.255 ru +195.162.8.0 - 195.162.11.255 ru 195.162.12.0 - 195.162.13.255 gb 195.162.14.0 - 195.162.15.255 kz 195.162.16.0 - 195.162.17.255 pl @@ -113769,57 +91872,10 @@ 195.162.128.0 - 195.162.191.255 ch 195.162.192.0 - 195.162.223.255 be 195.162.224.0 - 195.162.255.255 de -195.163.0.0 - 195.163.176.23 se -195.163.176.24 - 195.163.176.35 fi -195.163.176.36 - 195.163.176.47 se -195.163.176.48 - 195.163.176.51 fi -195.163.176.52 - 195.163.176.55 se -195.163.176.56 - 195.163.176.59 fi -195.163.176.60 - 195.163.176.191 se -195.163.176.192 - 195.163.176.239 fi -195.163.176.240 - 195.163.187.255 se -195.163.188.0 - 195.163.188.143 fi -195.163.188.144 - 195.163.255.255 se +195.163.0.0 - 195.163.255.255 se 195.164.0.0 - 195.164.255.255 pl -195.165.0.0 - 195.165.68.127 fi -195.165.68.128 - 195.165.68.191 ax -195.165.68.192 - 195.165.68.207 fi -195.165.68.208 - 195.165.68.223 se -195.165.68.224 - 195.165.75.255 fi -195.165.76.0 - 195.165.76.255 nl -195.165.77.0 - 195.165.148.79 fi -195.165.148.80 - 195.165.148.87 ax -195.165.148.88 - 195.165.178.255 fi -195.165.179.0 - 195.165.179.127 ru -195.165.179.128 - 195.165.229.95 fi -195.165.229.96 - 195.165.229.127 se -195.165.229.128 - 195.165.229.159 no -195.165.229.160 - 195.165.255.255 fi -195.166.0.0 - 195.166.31.127 gb -195.166.31.128 - 195.166.31.191 us -195.166.31.192 - 195.166.50.127 gb -195.166.50.128 - 195.166.50.255 nl -195.166.51.0 - 195.166.63.255 gb -195.166.64.0 - 195.166.64.255 de -195.166.65.0 - 195.166.77.215 gb -195.166.77.216 - 195.166.77.223 it -195.166.77.224 - 195.166.98.255 gb -195.166.99.0 - 195.166.99.255 ch -195.166.100.0 - 195.166.111.255 gb -195.166.112.0 - 195.166.112.255 se -195.166.113.0 - 195.166.113.255 de -195.166.114.0 - 195.166.114.255 it -195.166.115.0 - 195.166.116.255 gb -195.166.117.0 - 195.166.117.63 us -195.166.117.64 - 195.166.119.83 gb -195.166.119.84 - 195.166.119.95 it -195.166.119.96 - 195.166.119.127 gb -195.166.119.128 - 195.166.119.167 it -195.166.119.168 - 195.166.119.255 gb -195.166.120.0 - 195.166.120.255 us -195.166.121.0 - 195.166.121.255 gb -195.166.122.0 - 195.166.122.31 de -195.166.122.32 - 195.166.159.255 gb +195.165.0.0 - 195.165.255.255 fi +195.166.0.0 - 195.166.159.255 gb 195.166.160.0 - 195.166.191.255 ru 195.166.192.0 - 195.166.223.255 gi 195.166.224.0 - 195.166.255.255 ng @@ -113841,9 +91897,7 @@ 195.170.162.0 - 195.170.162.255 fr 195.170.163.0 - 195.170.163.255 ir 195.170.164.0 - 195.170.164.255 fr -195.170.165.0 - 195.170.165.255 at 195.170.166.0 - 195.170.166.255 bg -195.170.167.0 - 195.170.167.255 de 195.170.168.0 - 195.170.168.255 pt 195.170.169.0 - 195.170.169.255 gb 195.170.170.0 - 195.170.170.255 es @@ -113860,43 +91914,37 @@ 195.170.182.0 - 195.170.182.255 pl 195.170.183.0 - 195.170.183.255 rs 195.170.184.0 - 195.170.184.255 hu -195.170.185.0 - 195.170.186.255 de +195.170.185.0 - 195.170.185.255 de +195.170.186.0 - 195.170.186.255 pl 195.170.187.0 - 195.170.187.255 se 195.170.188.0 - 195.170.188.255 pl 195.170.189.0 - 195.170.189.255 se -195.170.190.0 - 195.170.190.255 ro 195.170.191.0 - 195.170.191.255 pl 195.170.192.0 - 195.170.255.255 ru 195.171.0.0 - 195.171.35.255 gb -195.171.36.0 - 195.171.36.127 be -195.171.36.128 - 195.172.60.183 gb -195.172.60.184 - 195.172.60.191 a2 -195.172.60.192 - 195.173.223.255 gb -195.173.224.0 - 195.173.255.255 nl -195.174.0.0 - 195.175.255.255 tr +195.171.36.0 - 195.171.36.255 eu +195.171.37.0 - 195.173.255.255 gb +195.174.0.0 - 195.175.107.255 tr +195.175.108.0 - 195.175.108.255 us +195.175.109.0 - 195.175.255.255 tr 195.176.0.0 - 195.176.79.255 ch 195.176.80.0 - 195.176.85.255 li 195.176.86.0 - 195.176.255.255 ch -195.177.0.0 - 195.177.4.199 de -195.177.4.200 - 195.177.4.203 ee -195.177.4.204 - 195.177.63.255 de +195.177.0.0 - 195.177.63.255 de 195.177.64.0 - 195.177.67.255 pl -195.177.68.0 - 195.177.75.255 ua -195.177.76.0 - 195.177.79.255 gb +195.177.68.0 - 195.177.71.255 gb +195.177.72.0 - 195.177.75.255 ua 195.177.80.0 - 195.177.83.255 be 195.177.84.0 - 195.177.87.255 pl -195.177.88.0 - 195.177.91.255 lu 195.177.92.0 - 195.177.95.255 ua 195.177.96.0 - 195.177.99.255 no 195.177.100.0 - 195.177.103.255 pl 195.177.104.0 - 195.177.107.255 ru -195.177.108.0 - 195.177.111.255 il -195.177.112.0 - 195.177.119.255 ua +195.177.116.0 - 195.177.119.255 ua 195.177.120.0 - 195.177.123.255 ru 195.177.124.0 - 195.177.127.255 ua 195.177.128.0 - 195.177.191.255 de 195.177.192.0 - 195.177.193.255 gb -195.177.194.0 - 195.177.195.255 sa 195.177.196.0 - 195.177.197.255 pl 195.177.198.0 - 195.177.199.255 at 195.177.200.0 - 195.177.201.255 de @@ -113905,7 +91953,9 @@ 195.177.206.0 - 195.177.207.255 tr 195.177.208.0 - 195.177.209.255 ua 195.177.210.0 - 195.177.211.255 pl -195.177.212.0 - 195.177.213.255 gb +195.177.212.0 - 195.177.212.224 gb +195.177.212.225 - 195.177.212.225 eu +195.177.212.226 - 195.177.213.255 gb 195.177.214.0 - 195.177.215.255 nl 195.177.216.0 - 195.177.217.255 pl 195.177.218.0 - 195.177.219.255 bg @@ -113914,7 +91964,6 @@ 195.177.224.0 - 195.177.225.255 ro 195.177.226.0 - 195.177.227.255 ru 195.177.228.0 - 195.177.229.255 at -195.177.230.0 - 195.177.231.255 tr 195.177.232.0 - 195.177.233.255 de 195.177.234.0 - 195.177.235.255 ch 195.177.236.0 - 195.177.241.255 ua @@ -113934,9 +91983,7 @@ 195.178.14.0 - 195.178.15.255 dk 195.178.16.0 - 195.178.17.255 ru 195.178.18.0 - 195.178.19.255 ua -195.178.20.0 - 195.178.21.255 ru -195.178.22.0 - 195.178.23.255 ro -195.178.24.0 - 195.178.25.255 ru +195.178.20.0 - 195.178.25.255 ru 195.178.26.0 - 195.178.27.255 pl 195.178.28.0 - 195.178.29.255 it 195.178.30.0 - 195.178.31.255 ua @@ -113947,76 +91994,43 @@ 195.178.100.0 - 195.178.101.255 de 195.178.102.0 - 195.178.103.255 ro 195.178.104.0 - 195.178.105.255 ua -195.178.106.0 - 195.178.107.255 gb +195.178.106.0 - 195.178.106.255 md +195.178.107.0 - 195.178.107.255 ro 195.178.108.0 - 195.178.109.255 ru -195.178.110.0 - 195.178.111.255 ro 195.178.112.0 - 195.178.113.255 fr 195.178.114.0 - 195.178.115.255 pl 195.178.116.0 - 195.178.117.255 bg 195.178.118.0 - 195.178.119.255 si -195.178.120.0 - 195.178.121.255 ro 195.178.122.0 - 195.178.123.255 pl -195.178.124.0 - 195.178.127.255 ro 195.178.128.0 - 195.178.159.255 ua 195.178.160.0 - 195.178.191.255 se 195.178.192.0 - 195.178.223.255 ru 195.178.224.0 - 195.178.255.255 se -195.179.0.0 - 195.179.1.255 de -195.179.2.0 - 195.179.2.3 be -195.179.2.4 - 195.179.13.95 de -195.179.13.96 - 195.179.13.99 es -195.179.13.100 - 195.179.65.215 de -195.179.65.216 - 195.179.65.219 es -195.179.65.220 - 195.179.65.255 de -195.179.66.0 - 195.179.66.63 gb -195.179.66.64 - 195.179.66.127 de -195.179.66.128 - 195.179.66.167 fr -195.179.66.168 - 195.179.68.239 de -195.179.68.240 - 195.179.68.243 es -195.179.68.244 - 195.179.119.159 de -195.179.119.160 - 195.179.119.163 es -195.179.119.164 - 195.179.120.191 de -195.179.120.192 - 195.179.120.207 nl -195.179.120.208 - 195.179.120.215 es -195.179.120.216 - 195.179.121.127 de -195.179.121.128 - 195.179.121.131 es -195.179.121.132 - 195.179.128.255 de -195.179.129.0 - 195.179.129.31 gb -195.179.129.32 - 195.179.129.63 de -195.179.129.64 - 195.179.129.67 es -195.179.129.68 - 195.179.131.111 de -195.179.131.112 - 195.179.131.115 es -195.179.131.116 - 195.179.132.15 de -195.179.132.16 - 195.179.132.19 es -195.179.132.20 - 195.179.163.131 de -195.179.163.132 - 195.179.163.135 es -195.179.163.136 - 195.180.255.255 de +195.179.0.0 - 195.179.63.127 de +195.179.63.128 - 195.179.63.255 gb +195.179.64.0 - 195.180.255.255 de 195.181.0.0 - 195.181.255.255 dk 195.182.0.0 - 195.182.0.255 ua 195.182.1.0 - 195.182.1.255 nl 195.182.2.0 - 195.182.2.255 de -195.182.3.0 - 195.182.3.255 ua +195.182.3.0 - 195.182.3.255 ru 195.182.4.0 - 195.182.4.255 gb -195.182.5.0 - 195.182.5.255 us +195.182.5.0 - 195.182.5.255 se 195.182.6.0 - 195.182.6.255 at 195.182.7.0 - 195.182.7.255 ua 195.182.8.0 - 195.182.8.255 ru 195.182.9.0 - 195.182.9.255 pl -195.182.10.0 - 195.182.10.255 fr 195.182.11.0 - 195.182.11.255 de 195.182.12.0 - 195.182.12.255 ch 195.182.13.0 - 195.182.13.255 nl 195.182.14.0 - 195.182.14.255 pl -195.182.15.0 - 195.182.15.255 ru 195.182.16.0 - 195.182.17.255 fr 195.182.18.0 - 195.182.18.255 de -195.182.19.0 - 195.182.20.255 pl +195.182.20.0 - 195.182.20.255 ru 195.182.21.0 - 195.182.22.255 ua 195.182.23.0 - 195.182.23.255 pl -195.182.24.0 - 195.182.24.255 ch 195.182.25.0 - 195.182.25.255 tr 195.182.26.0 - 195.182.26.255 at -195.182.27.0 - 195.182.27.255 ro 195.182.28.0 - 195.182.28.255 ru 195.182.29.0 - 195.182.29.255 at 195.182.30.0 - 195.182.30.255 es @@ -114024,10 +92038,7 @@ 195.182.32.0 - 195.182.32.255 dk 195.182.33.0 - 195.182.33.255 il 195.182.34.0 - 195.182.35.255 pl -195.182.36.0 - 195.182.36.255 dk -195.182.37.0 - 195.182.37.255 gb -195.182.38.0 - 195.182.38.255 pl -195.182.39.0 - 195.182.39.255 dk +195.182.36.0 - 195.182.39.255 dk 195.182.40.0 - 195.182.40.255 pl 195.182.41.0 - 195.182.41.255 bg 195.182.42.0 - 195.182.42.255 tr @@ -114037,7 +92048,7 @@ 195.182.46.0 - 195.182.46.255 hr 195.182.47.0 - 195.182.47.255 lv 195.182.48.0 - 195.182.48.255 de -195.182.49.0 - 195.182.49.255 gb +195.182.49.0 - 195.182.49.255 pl 195.182.50.0 - 195.182.50.255 de 195.182.51.0 - 195.182.52.255 pl 195.182.53.0 - 195.182.53.255 ch @@ -114052,37 +92063,12 @@ 195.182.62.0 - 195.182.62.255 gb 195.182.63.0 - 195.182.63.255 ua 195.182.64.0 - 195.182.95.255 lt -195.182.96.0 - 195.182.112.31 de -195.182.112.32 - 195.182.112.63 eu -195.182.112.64 - 195.182.112.71 de -195.182.112.72 - 195.182.112.87 eu -195.182.112.88 - 195.182.112.91 de -195.182.112.92 - 195.182.112.103 eu -195.182.112.104 - 195.182.112.175 de -195.182.112.176 - 195.182.112.191 eu -195.182.112.192 - 195.182.113.255 de -195.182.114.0 - 195.182.114.127 eu -195.182.114.128 - 195.182.114.239 de -195.182.114.240 - 195.182.114.255 eu -195.182.115.0 - 195.182.116.95 de -195.182.116.96 - 195.182.116.159 eu -195.182.116.160 - 195.182.116.179 de -195.182.116.180 - 195.182.116.183 eu -195.182.116.184 - 195.182.123.255 de -195.182.124.0 - 195.182.125.127 eu -195.182.125.128 - 195.182.125.191 de -195.182.125.192 - 195.182.126.63 eu -195.182.126.64 - 195.182.126.127 de -195.182.126.128 - 195.182.126.255 eu -195.182.127.0 - 195.182.127.255 de +195.182.96.0 - 195.182.127.255 de 195.182.128.0 - 195.182.159.255 ru 195.182.160.0 - 195.182.191.255 gb 195.182.192.0 - 195.182.195.255 ua 195.182.196.0 - 195.182.197.255 de -195.182.198.0 - 195.182.199.255 ro -195.182.200.0 - 195.182.201.255 gi 195.182.202.0 - 195.182.203.255 ua -195.182.204.0 - 195.182.205.255 dk 195.182.206.0 - 195.182.207.255 pl 195.182.208.0 - 195.182.209.255 ro 195.182.210.0 - 195.182.211.255 it @@ -114093,449 +92079,41 @@ 195.182.220.0 - 195.182.221.255 ro 195.182.222.0 - 195.182.223.255 ch 195.182.224.0 - 195.182.255.255 it -195.183.0.0 - 195.183.0.31 at -195.183.0.32 - 195.183.0.79 eu -195.183.0.80 - 195.183.0.111 at -195.183.0.112 - 195.183.0.255 eu -195.183.1.0 - 195.183.1.159 at -195.183.1.160 - 195.183.1.191 fr -195.183.1.192 - 195.183.1.255 gb -195.183.2.0 - 195.183.7.255 at -195.183.8.0 - 195.183.8.63 it -195.183.8.64 - 195.183.8.95 eu -195.183.8.96 - 195.183.8.175 it -195.183.8.176 - 195.183.8.191 eu -195.183.8.192 - 195.183.9.63 it -195.183.9.64 - 195.183.9.127 de -195.183.9.128 - 195.183.9.159 it -195.183.9.160 - 195.183.9.191 ch -195.183.9.192 - 195.183.9.223 de -195.183.9.224 - 195.183.9.239 fr -195.183.9.240 - 195.183.11.23 it -195.183.11.24 - 195.183.11.31 gb -195.183.11.32 - 195.183.11.47 za -195.183.11.48 - 195.183.11.55 se -195.183.11.56 - 195.183.11.95 de -195.183.11.96 - 195.183.11.127 gr -195.183.11.128 - 195.183.11.255 gb -195.183.12.0 - 195.183.12.255 it -195.183.13.0 - 195.183.13.255 eu -195.183.14.0 - 195.183.14.255 gb -195.183.15.0 - 195.183.15.31 it -195.183.15.32 - 195.183.15.47 es -195.183.15.48 - 195.183.15.63 nl -195.183.15.64 - 195.183.15.127 it -195.183.15.128 - 195.183.15.191 fr -195.183.15.192 - 195.183.15.207 za -195.183.15.208 - 195.183.15.223 ru -195.183.15.224 - 195.183.15.255 gb -195.183.16.0 - 195.183.16.23 ch -195.183.16.24 - 195.183.16.31 eu -195.183.16.32 - 195.183.16.63 ch -195.183.16.64 - 195.183.16.127 eu -195.183.16.128 - 195.183.21.159 ch -195.183.21.160 - 195.183.21.175 se -195.183.21.176 - 195.183.21.191 de -195.183.21.192 - 195.183.21.223 nl -195.183.21.224 - 195.183.21.255 de -195.183.22.0 - 195.183.23.255 ch -195.183.24.0 - 195.183.24.39 fr -195.183.24.40 - 195.183.24.47 eu -195.183.24.48 - 195.183.25.15 fr -195.183.25.16 - 195.183.25.63 eu -195.183.25.64 - 195.183.25.127 fr -195.183.25.128 - 195.183.25.255 eu -195.183.26.0 - 195.183.31.159 fr -195.183.31.160 - 195.183.31.191 de -195.183.31.192 - 195.183.31.223 it -195.183.31.224 - 195.183.31.239 za -195.183.31.240 - 195.183.31.255 gb -195.183.32.0 - 195.183.32.31 ru -195.183.32.32 - 195.183.32.63 de -195.183.32.64 - 195.183.32.135 ru -195.183.32.136 - 195.183.32.255 eu -195.183.33.0 - 195.183.33.95 fr -195.183.33.96 - 195.183.33.127 be -195.183.33.128 - 195.183.33.143 gb -195.183.33.144 - 195.183.33.159 be -195.183.33.160 - 195.183.33.191 nl -195.183.33.192 - 195.183.33.207 za -195.183.33.208 - 195.183.33.215 gb -195.183.33.216 - 195.183.33.223 za -195.183.33.224 - 195.183.33.239 gb -195.183.33.240 - 195.183.33.255 be -195.183.34.0 - 195.183.34.127 de -195.183.34.128 - 195.183.34.255 ie -195.183.35.0 - 195.183.35.63 de -195.183.35.64 - 195.183.35.95 gb -195.183.35.96 - 195.183.35.127 za -195.183.35.128 - 195.183.35.255 de -195.183.36.0 - 195.183.36.255 nl -195.183.37.0 - 195.183.37.255 it -195.183.38.0 - 195.183.38.255 gb -195.183.39.0 - 195.183.39.255 no -195.183.40.0 - 195.183.40.255 eu -195.183.41.0 - 195.183.41.143 za -195.183.41.144 - 195.183.41.159 eu -195.183.41.160 - 195.183.41.191 se -195.183.41.192 - 195.183.41.255 gb -195.183.42.0 - 195.183.42.255 be -195.183.43.0 - 195.183.43.159 eu -195.183.43.160 - 195.183.43.191 gb -195.183.43.192 - 195.183.43.255 es +195.183.0.0 - 195.183.43.255 eu 195.183.44.0 - 195.183.47.255 gb -195.183.48.0 - 195.183.48.255 de -195.183.49.0 - 195.183.49.143 gb -195.183.49.144 - 195.183.49.151 nl -195.183.49.152 - 195.183.49.159 ch -195.183.49.160 - 195.183.49.191 de -195.183.49.192 - 195.183.49.255 it -195.183.50.0 - 195.183.61.191 gb -195.183.61.192 - 195.183.61.255 za -195.183.62.0 - 195.183.63.255 gb -195.183.64.0 - 195.183.64.127 pl -195.183.64.128 - 195.183.64.255 eu -195.183.65.0 - 195.183.65.255 no -195.183.66.0 - 195.183.67.63 gb -195.183.67.64 - 195.183.67.95 de -195.183.67.96 - 195.183.67.111 gb -195.183.67.112 - 195.183.67.127 es -195.183.67.128 - 195.183.67.255 za -195.183.68.0 - 195.183.69.95 gb -195.183.69.96 - 195.183.69.127 it -195.183.69.128 - 195.183.69.159 gb -195.183.69.160 - 195.183.69.191 de -195.183.69.192 - 195.183.69.207 nl -195.183.69.208 - 195.183.69.223 za -195.183.69.224 - 195.183.69.255 dk -195.183.70.0 - 195.183.77.71 gb -195.183.77.72 - 195.183.77.95 se -195.183.77.96 - 195.183.77.127 dk -195.183.77.128 - 195.183.77.255 de -195.183.78.0 - 195.183.79.7 gb -195.183.79.8 - 195.183.79.15 se -195.183.79.16 - 195.183.79.31 it -195.183.79.32 - 195.183.79.63 gb -195.183.79.64 - 195.183.79.127 de -195.183.79.128 - 195.183.79.191 fr -195.183.79.192 - 195.183.81.223 gb -195.183.81.224 - 195.183.81.255 de -195.183.82.0 - 195.183.83.255 gb -195.183.84.0 - 195.183.84.7 hu -195.183.84.8 - 195.183.84.31 eu -195.183.84.32 - 195.183.84.63 de -195.183.84.64 - 195.183.84.127 gb -195.183.84.128 - 195.183.84.191 se -195.183.84.192 - 195.183.84.255 de -195.183.85.0 - 195.183.85.143 gb -195.183.85.144 - 195.183.85.159 be -195.183.85.160 - 195.183.85.191 se -195.183.85.192 - 195.183.85.207 gb -195.183.85.208 - 195.183.85.223 za -195.183.85.224 - 195.183.85.255 ch -195.183.86.0 - 195.183.87.135 gb -195.183.87.136 - 195.183.87.143 fr -195.183.87.144 - 195.183.87.151 gb -195.183.87.152 - 195.183.87.159 ch -195.183.87.160 - 195.183.87.191 gb -195.183.87.192 - 195.183.87.255 de -195.183.88.0 - 195.183.89.255 eu -195.183.90.0 - 195.183.94.255 gb -195.183.95.0 - 195.183.95.63 eu -195.183.95.64 - 195.183.95.79 gb -195.183.95.80 - 195.183.95.87 nl -195.183.95.88 - 195.183.95.95 gb -195.183.95.96 - 195.183.95.111 za -195.183.95.112 - 195.183.95.127 gb -195.183.95.128 - 195.183.97.31 de -195.183.97.32 - 195.183.97.47 nl -195.183.97.48 - 195.183.102.95 de -195.183.102.96 - 195.183.102.127 za -195.183.102.128 - 195.183.116.255 de -195.183.117.0 - 195.183.117.255 eu -195.183.118.0 - 195.183.118.39 de -195.183.118.40 - 195.183.118.47 eu -195.183.118.48 - 195.183.127.255 de -195.183.128.0 - 195.183.128.31 eu -195.183.128.32 - 195.183.129.127 za -195.183.129.128 - 195.183.129.255 eu -195.183.130.0 - 195.183.130.15 za -195.183.130.16 - 195.183.130.31 eu -195.183.130.32 - 195.183.130.127 za -195.183.130.128 - 195.183.130.255 eu -195.183.131.0 - 195.183.131.95 za -195.183.131.96 - 195.183.131.103 it -195.183.131.104 - 195.183.131.127 gb -195.183.131.128 - 195.183.131.255 be -195.183.132.0 - 195.183.132.31 za -195.183.132.32 - 195.183.132.63 de -195.183.132.64 - 195.183.132.127 ie -195.183.132.128 - 195.183.135.255 za -195.183.136.0 - 195.183.136.255 es -195.183.137.0 - 195.183.137.255 za -195.183.138.0 - 195.183.138.143 es -195.183.138.144 - 195.183.138.159 ie -195.183.138.160 - 195.183.138.191 fr -195.183.138.192 - 195.183.138.255 es -195.183.139.0 - 195.183.139.255 ie -195.183.140.0 - 195.183.141.31 es -195.183.141.32 - 195.183.141.39 eu -195.183.141.40 - 195.183.141.47 es -195.183.141.48 - 195.183.141.63 eu -195.183.141.64 - 195.183.141.103 es -195.183.141.104 - 195.183.141.111 eu -195.183.141.112 - 195.183.141.199 es -195.183.141.200 - 195.183.141.255 eu -195.183.142.0 - 195.183.142.255 fr -195.183.143.0 - 195.183.143.255 de -195.183.144.0 - 195.183.144.127 eu -195.183.144.128 - 195.183.144.159 nl -195.183.144.160 - 195.183.144.255 eu -195.183.145.0 - 195.183.145.7 nl -195.183.145.8 - 195.183.145.15 gb -195.183.145.16 - 195.183.145.31 nl -195.183.145.32 - 195.183.145.63 se -195.183.145.64 - 195.183.145.95 nl -195.183.145.96 - 195.183.145.103 se -195.183.145.104 - 195.183.145.111 eu -195.183.145.112 - 195.183.145.119 gb -195.183.145.120 - 195.183.145.127 de -195.183.145.128 - 195.183.145.159 ch -195.183.145.160 - 195.183.145.191 eu -195.183.145.192 - 195.183.145.223 ch -195.183.145.224 - 195.183.145.255 eu -195.183.146.0 - 195.183.146.63 nl -195.183.146.64 - 195.183.146.95 de -195.183.146.96 - 195.183.146.127 ch -195.183.146.128 - 195.183.146.255 de -195.183.147.0 - 195.183.147.31 nl -195.183.147.32 - 195.183.147.47 za -195.183.147.48 - 195.183.147.55 se -195.183.147.56 - 195.183.147.63 ch -195.183.147.64 - 195.183.147.127 ie -195.183.147.128 - 195.183.147.255 de -195.183.148.0 - 195.183.148.95 be -195.183.148.96 - 195.183.148.127 eu -195.183.148.128 - 195.183.149.127 be -195.183.149.128 - 195.183.149.191 at -195.183.149.192 - 195.183.149.255 gb -195.183.150.0 - 195.183.151.255 be -195.183.152.0 - 195.183.154.159 dk -195.183.154.160 - 195.183.154.191 de -195.183.154.192 - 195.183.154.207 eu -195.183.154.208 - 195.183.154.255 de -195.183.155.0 - 195.183.155.255 dk -195.183.156.0 - 195.183.156.31 eu -195.183.156.32 - 195.183.156.63 se -195.183.156.64 - 195.183.156.127 eu -195.183.156.128 - 195.183.156.175 se -195.183.156.176 - 195.183.156.191 eu -195.183.156.192 - 195.183.156.215 se -195.183.156.216 - 195.183.156.223 eu -195.183.156.224 - 195.183.157.127 se -195.183.157.128 - 195.183.157.143 za -195.183.157.144 - 195.183.157.191 de -195.183.157.192 - 195.183.157.223 ch -195.183.157.224 - 195.183.157.255 gb -195.183.158.0 - 195.183.158.191 se -195.183.158.192 - 195.183.158.223 za -195.183.158.224 - 195.183.158.255 de -195.183.159.0 - 195.183.159.255 se -195.183.160.0 - 195.183.160.191 de -195.183.160.192 - 195.183.160.199 gb -195.183.160.200 - 195.183.160.207 za -195.183.160.208 - 195.183.160.255 ch -195.183.161.0 - 195.183.163.255 de -195.183.164.0 - 195.183.166.143 ch -195.183.166.144 - 195.183.166.159 gb -195.183.166.160 - 195.183.166.191 de -195.183.166.192 - 195.183.166.199 se -195.183.166.200 - 195.183.166.207 gb -195.183.166.208 - 195.183.166.223 za -195.183.166.224 - 195.183.167.63 ch -195.183.167.64 - 195.183.167.95 be -195.183.167.96 - 195.183.167.127 it -195.183.167.128 - 195.183.167.255 ch +195.183.48.0 - 195.183.51.255 eu +195.183.52.0 - 195.183.55.255 gb +195.183.56.0 - 195.183.71.255 eu +195.183.72.0 - 195.183.75.255 gb +195.183.76.0 - 195.183.103.255 eu +195.183.104.0 - 195.183.115.255 de +195.183.116.0 - 195.183.167.255 eu 195.183.168.0 - 195.183.175.255 it -195.183.176.0 - 195.183.177.255 de -195.183.178.0 - 195.183.179.255 eu -195.183.180.0 - 195.183.187.47 gb -195.183.187.48 - 195.183.187.63 eu -195.183.187.64 - 195.183.187.95 de -195.183.187.96 - 195.183.187.127 eu -195.183.187.128 - 195.183.187.255 de -195.183.188.0 - 195.183.189.47 gb -195.183.189.48 - 195.183.189.63 ch -195.183.189.64 - 195.183.189.95 ie -195.183.189.96 - 195.183.189.127 se -195.183.189.128 - 195.183.189.143 de -195.183.189.144 - 195.183.189.151 dk -195.183.189.152 - 195.183.189.255 de -195.183.190.0 - 195.183.190.31 gb -195.183.190.32 - 195.183.190.63 ch -195.183.190.64 - 195.183.190.127 gb -195.183.190.128 - 195.183.190.255 dk -195.183.191.0 - 195.183.191.191 gb -195.183.191.192 - 195.183.191.207 de -195.183.191.208 - 195.183.191.223 nl -195.183.191.224 - 195.183.191.255 gb -195.183.192.0 - 195.183.192.255 se -195.183.193.0 - 195.183.193.255 ie -195.183.194.0 - 195.183.196.143 za -195.183.196.144 - 195.183.196.159 fr -195.183.196.160 - 195.183.196.191 de -195.183.196.192 - 195.183.196.223 it -195.183.196.224 - 195.183.196.255 eu -195.183.197.0 - 195.183.197.31 za -195.183.197.32 - 195.183.197.63 de -195.183.197.64 - 195.183.197.127 it -195.183.197.128 - 195.183.197.255 za -195.183.198.0 - 195.183.199.191 at -195.183.199.192 - 195.183.199.223 it -195.183.199.224 - 195.183.199.239 ie -195.183.199.240 - 195.183.199.247 nl -195.183.199.248 - 195.183.201.255 at -195.183.202.0 - 195.183.203.63 za -195.183.203.64 - 195.183.203.95 gb -195.183.203.96 - 195.183.203.111 it -195.183.203.112 - 195.183.203.127 za -195.183.203.128 - 195.183.203.191 gb -195.183.203.192 - 195.183.203.255 be -195.183.204.0 - 195.183.205.255 za -195.183.206.0 - 195.183.206.63 ch -195.183.206.64 - 195.183.206.127 it -195.183.206.128 - 195.183.206.255 ch -195.183.207.0 - 195.183.207.255 eu -195.183.208.0 - 195.183.211.255 gb -195.183.212.0 - 195.183.212.255 eu -195.183.213.0 - 195.183.215.255 gb -195.183.216.0 - 195.183.220.255 de -195.183.221.0 - 195.183.223.63 be -195.183.223.64 - 195.183.223.127 no -195.183.223.128 - 195.183.223.255 at -195.183.224.0 - 195.183.227.255 be -195.183.228.0 - 195.183.228.255 de -195.183.229.0 - 195.183.229.63 eu -195.183.229.64 - 195.183.229.127 de -195.183.229.128 - 195.183.229.255 it -195.183.230.0 - 195.183.236.159 de -195.183.236.160 - 195.183.236.191 ch -195.183.236.192 - 195.183.236.255 tr -195.183.237.0 - 195.183.240.255 de -195.183.241.0 - 195.183.246.63 it -195.183.246.64 - 195.183.246.127 de -195.183.246.128 - 195.183.247.255 it -195.183.248.0 - 195.183.249.127 ch -195.183.249.128 - 195.183.249.255 fr -195.183.250.0 - 195.183.252.255 ch -195.183.253.0 - 195.183.253.255 eu -195.183.254.0 - 195.183.255.255 ch +195.183.176.0 - 195.183.255.255 eu 195.184.0.0 - 195.184.31.255 hu 195.184.32.0 - 195.184.63.255 dk 195.184.64.0 - 195.184.65.255 nl 195.184.66.0 - 195.184.67.255 gb 195.184.68.0 - 195.184.69.255 se 195.184.70.0 - 195.184.71.255 ua -195.184.72.0 - 195.184.75.255 ru +195.184.74.0 - 195.184.75.255 ru 195.184.76.0 - 195.184.77.255 gb 195.184.78.0 - 195.184.79.255 ru 195.184.80.0 - 195.184.81.255 ua 195.184.82.0 - 195.184.85.255 pl -195.184.86.0 - 195.184.87.255 ua 195.184.88.0 - 195.184.89.255 pl -195.184.90.0 - 195.184.91.255 ru 195.184.92.0 - 195.184.93.255 ch 195.184.94.0 - 195.184.95.255 de 195.184.96.0 - 195.184.127.255 dk -195.184.128.0 - 195.184.129.255 be -195.184.130.0 - 195.184.131.255 gb -195.184.132.0 - 195.184.132.255 de -195.184.133.0 - 195.184.133.255 fr -195.184.134.0 - 195.184.135.255 de -195.184.136.0 - 195.184.136.127 se -195.184.136.128 - 195.184.136.255 ch -195.184.137.0 - 195.184.137.63 se -195.184.137.64 - 195.184.137.95 gb -195.184.137.96 - 195.184.137.111 se +195.184.128.0 - 195.184.137.111 be 195.184.137.112 - 195.184.137.127 gb -195.184.137.128 - 195.184.137.143 ru -195.184.137.144 - 195.184.137.159 ch -195.184.137.160 - 195.184.137.255 gb -195.184.138.0 - 195.184.138.63 it -195.184.138.64 - 195.184.138.95 be -195.184.138.96 - 195.184.138.111 es -195.184.138.112 - 195.184.138.127 be -195.184.138.128 - 195.184.138.191 hu -195.184.138.192 - 195.184.138.255 za -195.184.139.0 - 195.184.139.95 be -195.184.139.96 - 195.184.139.111 de -195.184.139.112 - 195.184.139.135 be -195.184.139.136 - 195.184.139.143 de -195.184.139.144 - 195.184.139.159 be -195.184.139.160 - 195.184.139.191 fr -195.184.139.192 - 195.184.139.255 il -195.184.140.0 - 195.184.140.7 gb -195.184.140.8 - 195.184.140.15 be -195.184.140.16 - 195.184.140.31 de -195.184.140.32 - 195.184.140.63 be -195.184.140.64 - 195.184.140.79 se -195.184.140.80 - 195.184.140.87 ro -195.184.140.88 - 195.184.140.103 be -195.184.140.104 - 195.184.140.111 it -195.184.140.112 - 195.184.140.127 gb -195.184.140.128 - 195.184.140.143 ch -195.184.140.144 - 195.184.140.151 fr -195.184.140.152 - 195.184.140.159 ch -195.184.140.160 - 195.184.140.191 fr -195.184.140.192 - 195.184.140.255 se -195.184.141.0 - 195.184.141.127 nl -195.184.141.128 - 195.184.141.191 dk -195.184.141.192 - 195.184.141.223 de -195.184.141.224 - 195.184.141.231 be -195.184.141.232 - 195.184.141.239 gb -195.184.141.240 - 195.184.141.255 be -195.184.142.0 - 195.184.142.255 gb -195.184.143.0 - 195.184.143.127 it -195.184.143.128 - 195.184.143.167 be -195.184.143.168 - 195.184.143.175 se -195.184.143.176 - 195.184.143.191 be -195.184.143.192 - 195.184.143.223 fr -195.184.143.224 - 195.184.143.255 de -195.184.144.0 - 195.184.144.255 no -195.184.145.0 - 195.184.146.127 be -195.184.146.128 - 195.184.146.191 no -195.184.146.192 - 195.184.147.127 be -195.184.147.128 - 195.184.147.255 gb -195.184.148.0 - 195.184.148.255 fr -195.184.149.0 - 195.184.149.127 se -195.184.149.128 - 195.184.149.255 fr -195.184.150.0 - 195.184.150.255 de -195.184.151.0 - 195.184.151.255 ch -195.184.152.0 - 195.184.152.255 dk -195.184.153.0 - 195.184.153.127 be -195.184.153.128 - 195.184.153.255 dk -195.184.154.0 - 195.184.154.127 de -195.184.154.128 - 195.184.154.255 be -195.184.155.0 - 195.184.155.255 fr -195.184.156.0 - 195.184.156.255 es -195.184.157.0 - 195.184.157.255 za -195.184.158.0 - 195.184.158.31 gb -195.184.158.32 - 195.184.158.63 be -195.184.158.64 - 195.184.158.79 gb -195.184.158.80 - 195.184.158.111 be -195.184.158.112 - 195.184.158.119 gb -195.184.158.120 - 195.184.158.255 be -195.184.159.0 - 195.184.159.111 es -195.184.159.112 - 195.184.159.127 fr -195.184.159.128 - 195.184.159.143 be -195.184.159.144 - 195.184.159.151 fr -195.184.159.152 - 195.184.159.255 be +195.184.137.128 - 195.184.137.159 be +195.184.137.160 - 195.184.137.191 gb +195.184.137.192 - 195.184.159.255 be 195.184.160.0 - 195.184.191.255 hu 195.184.192.0 - 195.184.223.255 ua 195.184.224.0 - 195.184.255.255 gb -195.185.0.0 - 195.185.186.127 de -195.185.186.128 - 195.185.186.255 us -195.185.187.0 - 195.185.255.255 de +195.185.0.0 - 195.185.255.255 de 195.186.0.0 - 195.186.255.255 ch 195.187.0.0 - 195.187.255.255 pl 195.188.0.0 - 195.188.255.255 gb @@ -114543,14 +92121,16 @@ 195.189.4.0 - 195.189.7.255 at 195.189.8.0 - 195.189.11.255 ua 195.189.12.0 - 195.189.15.255 gb -195.189.16.0 - 195.189.19.255 ua +195.189.16.0 - 195.189.19.255 ru 195.189.20.0 - 195.189.23.255 nl 195.189.24.0 - 195.189.27.255 se 195.189.28.0 - 195.189.31.255 kz 195.189.32.0 - 195.189.35.255 pl 195.189.36.0 - 195.189.39.255 ua 195.189.40.0 - 195.189.43.255 pl -195.189.44.0 - 195.189.51.255 ua +195.189.44.0 - 195.189.46.126 ua +195.189.46.127 - 195.189.46.127 cy +195.189.46.128 - 195.189.51.255 ua 195.189.52.0 - 195.189.55.255 pl 195.189.56.0 - 195.189.59.255 gr 195.189.60.0 - 195.189.63.255 ua @@ -114575,26 +92155,24 @@ 195.189.134.0 - 195.189.137.255 ru 195.189.138.0 - 195.189.139.255 ro 195.189.140.0 - 195.189.141.255 il -195.189.142.0 - 195.189.143.255 no +195.189.142.0 - 195.189.143.255 nl 195.189.144.0 - 195.189.145.255 ro 195.189.146.0 - 195.189.149.255 ch -195.189.150.0 - 195.189.155.255 ro +195.189.150.0 - 195.189.151.255 ro +195.189.154.0 - 195.189.155.255 ro 195.189.156.0 - 195.189.157.255 cy 195.189.158.0 - 195.189.159.255 gb 195.189.160.0 - 195.189.161.255 se 195.189.162.0 - 195.189.163.255 gr -195.189.164.0 - 195.189.165.255 ro 195.189.166.0 - 195.189.167.255 at -195.189.168.0 - 195.189.169.255 ru 195.189.170.0 - 195.189.171.255 at 195.189.172.0 - 195.189.173.255 gb -195.189.174.0 - 195.189.177.255 ro +195.189.176.0 - 195.189.177.255 ro 195.189.178.0 - 195.189.179.255 fr 195.189.180.0 - 195.189.181.255 ru 195.189.182.0 - 195.189.183.255 se -195.189.184.0 - 195.189.187.255 ro +195.189.186.0 - 195.189.187.255 ro 195.189.188.0 - 195.189.189.255 se -195.189.190.0 - 195.189.191.255 ro 195.189.192.0 - 195.189.193.255 il 195.189.194.0 - 195.189.195.255 ro 195.189.196.0 - 195.189.197.255 ua @@ -114653,52 +92231,48 @@ 195.190.29.0 - 195.190.29.255 ch 195.190.30.0 - 195.190.31.255 dk 195.190.32.0 - 195.190.63.255 gr -195.190.64.0 - 195.190.64.95 gb -195.190.64.96 - 195.190.64.127 de -195.190.64.128 - 195.190.71.191 gb -195.190.71.192 - 195.190.71.207 de -195.190.71.208 - 195.190.75.255 gb -195.190.76.0 - 195.190.76.255 de -195.190.77.0 - 195.190.77.207 gb -195.190.77.208 - 195.190.77.223 de -195.190.77.224 - 195.190.88.255 gb -195.190.89.0 - 195.190.89.255 de -195.190.90.0 - 195.190.90.63 gb -195.190.90.64 - 195.190.90.95 de -195.190.90.96 - 195.190.90.159 gb -195.190.90.160 - 195.190.90.191 de -195.190.90.192 - 195.190.92.159 gb -195.190.92.160 - 195.190.92.191 de -195.190.92.192 - 195.190.95.255 gb +195.190.64.0 - 195.190.74.235 gb +195.190.74.236 - 195.190.74.239 us +195.190.74.240 - 195.190.75.127 gb +195.190.75.128 - 195.190.75.255 us +195.190.76.0 - 195.190.78.255 gb +195.190.79.0 - 195.190.79.255 us +195.190.80.0 - 195.190.80.255 gb +195.190.81.0 - 195.190.81.255 us +195.190.82.0 - 195.190.84.7 gb +195.190.84.8 - 195.190.84.15 il +195.190.84.16 - 195.190.84.31 fr +195.190.84.32 - 195.190.84.151 gb +195.190.84.152 - 195.190.84.159 se +195.190.84.160 - 195.190.85.55 gb +195.190.85.56 - 195.190.85.63 se +195.190.85.64 - 195.190.86.15 gb +195.190.86.16 - 195.190.86.31 fr +195.190.86.32 - 195.190.95.255 gb 195.190.96.0 - 195.190.127.255 ru 195.190.128.0 - 195.190.128.255 dk 195.190.129.0 - 195.190.129.255 si -195.190.130.0 - 195.190.130.255 gb 195.190.131.0 - 195.190.131.255 at 195.190.132.0 - 195.190.132.255 ru -195.190.133.0 - 195.190.133.255 de +195.190.133.0 - 195.190.133.255 th 195.190.134.0 - 195.190.134.255 ee 195.190.135.0 - 195.190.135.255 de 195.190.136.0 - 195.190.136.255 hr 195.190.137.0 - 195.190.137.255 fr -195.190.138.0 - 195.190.139.255 de +195.190.138.0 - 195.190.138.255 de 195.190.140.0 - 195.190.140.255 cz -195.190.141.0 - 195.190.141.255 lt +195.190.141.0 - 195.190.141.255 ee 195.190.142.0 - 195.190.142.255 de 195.190.143.0 - 195.190.143.255 at -195.190.144.0 - 195.190.144.255 ua 195.190.145.0 - 195.190.145.255 de 195.190.146.0 - 195.190.146.255 nl 195.190.147.0 - 195.190.147.255 se 195.190.148.0 - 195.190.148.255 de -195.190.149.0 - 195.190.149.255 dk -195.190.150.0 - 195.190.150.255 de +195.190.150.0 - 195.190.150.255 eu 195.190.151.0 - 195.190.151.255 nl 195.190.152.0 - 195.190.152.255 ua 195.190.153.0 - 195.190.153.255 dk -195.190.154.0 - 195.190.154.255 gb 195.190.155.0 - 195.190.156.255 fr -195.190.157.0 - 195.190.157.255 ua 195.190.158.0 - 195.190.158.255 si 195.190.159.0 - 195.190.159.255 ro 195.190.160.0 - 195.190.191.255 ch @@ -114714,7 +92288,6 @@ 195.191.16.0 - 195.191.17.255 nl 195.191.18.0 - 195.191.19.255 ru 195.191.20.0 - 195.191.21.255 de -195.191.22.0 - 195.191.23.255 be 195.191.24.0 - 195.191.25.255 ua 195.191.26.0 - 195.191.27.255 de 195.191.28.0 - 195.191.29.255 ie @@ -114729,7 +92302,6 @@ 195.191.48.0 - 195.191.49.255 cz 195.191.50.0 - 195.191.51.255 ru 195.191.52.0 - 195.191.53.255 il -195.191.54.0 - 195.191.55.255 lv 195.191.56.0 - 195.191.59.255 ua 195.191.60.0 - 195.191.61.255 bg 195.191.62.0 - 195.191.63.255 pl @@ -114748,13 +92320,15 @@ 195.191.90.0 - 195.191.91.255 ua 195.191.92.0 - 195.191.93.255 de 195.191.94.0 - 195.191.95.255 bg -195.191.96.0 - 195.191.97.255 ro +195.191.96.0 - 195.191.96.255 si +195.191.97.0 - 195.191.97.255 hu 195.191.98.0 - 195.191.99.255 gr 195.191.100.0 - 195.191.101.255 am 195.191.102.0 - 195.191.103.255 eu 195.191.104.0 - 195.191.105.255 ua 195.191.106.0 - 195.191.107.255 gb -195.191.108.0 - 195.191.109.255 dk +195.191.108.0 - 195.191.108.255 dk +195.191.109.0 - 195.191.109.255 eu 195.191.110.0 - 195.191.111.255 at 195.191.112.0 - 195.191.113.255 nl 195.191.114.0 - 195.191.115.255 de @@ -114764,12 +92338,12 @@ 195.191.122.0 - 195.191.123.255 fi 195.191.124.0 - 195.191.125.255 ro 195.191.126.0 - 195.191.127.255 ua -195.191.128.0 - 195.191.131.255 ru +195.191.128.0 - 195.191.129.255 de +195.191.130.0 - 195.191.131.255 ru 195.191.132.0 - 195.191.133.255 ch 195.191.134.0 - 195.191.135.255 fr 195.191.136.0 - 195.191.137.255 ru 195.191.138.0 - 195.191.139.255 ua -195.191.140.0 - 195.191.141.255 ru 195.191.142.0 - 195.191.143.255 dk 195.191.144.0 - 195.191.145.255 se 195.191.146.0 - 195.191.147.255 ru @@ -114785,7 +92359,7 @@ 195.191.168.0 - 195.191.169.255 ua 195.191.170.0 - 195.191.171.255 pl 195.191.172.0 - 195.191.173.255 fr -195.191.174.0 - 195.191.177.255 ru +195.191.174.0 - 195.191.175.255 ru 195.191.178.0 - 195.191.179.255 ua 195.191.180.0 - 195.191.181.255 pl 195.191.182.0 - 195.191.183.255 ru @@ -114795,10 +92369,8 @@ 195.191.190.0 - 195.191.193.255 ru 195.191.194.0 - 195.191.195.255 ua 195.191.196.0 - 195.191.197.255 de -195.191.198.0 - 195.191.199.255 ro 195.191.200.0 - 195.191.201.255 ua 195.191.202.0 - 195.191.205.255 cz -195.191.206.0 - 195.191.207.255 hk 195.191.208.0 - 195.191.209.255 ru 195.191.210.0 - 195.191.211.255 gb 195.191.212.0 - 195.191.213.255 se @@ -114822,19 +92394,21 @@ 195.191.250.0 - 195.191.251.255 ru 195.191.252.0 - 195.191.255.255 at 195.192.0.0 - 195.192.255.255 dk -195.193.0.0 - 195.193.255.255 nl +195.193.0.0 - 195.193.2.255 nl +195.193.3.0 - 195.193.3.255 eu +195.193.4.0 - 195.193.202.255 nl +195.193.203.0 - 195.193.203.255 gb +195.193.204.0 - 195.193.255.255 nl 195.194.0.0 - 195.195.255.255 gb 195.196.0.0 - 195.196.255.255 se -195.197.0.0 - 195.197.68.35 fi -195.197.68.36 - 195.197.68.39 ax -195.197.68.40 - 195.197.250.63 fi -195.197.250.64 - 195.197.250.67 nl -195.197.250.68 - 195.197.255.255 fi -195.198.0.0 - 195.198.255.255 se +195.197.0.0 - 195.197.255.255 fi +195.198.0.0 - 195.198.214.255 se +195.198.215.0 - 195.198.215.255 dk +195.198.216.0 - 195.198.255.255 se 195.199.0.0 - 195.199.255.255 hu 195.200.0.0 - 195.200.31.255 gb 195.200.32.0 - 195.200.63.255 de -195.200.66.0 - 195.200.67.255 ro +195.200.64.0 - 195.200.65.255 ua 195.200.68.0 - 195.200.69.255 fi 195.200.70.0 - 195.200.71.255 de 195.200.72.0 - 195.200.73.255 se @@ -114847,12 +92421,10 @@ 195.200.86.0 - 195.200.87.255 ro 195.200.88.0 - 195.200.89.255 pl 195.200.90.0 - 195.200.91.255 ua -195.200.92.0 - 195.200.93.255 ng +195.200.92.0 - 195.200.93.255 il 195.200.94.0 - 195.200.95.255 it 195.200.96.0 - 195.200.127.255 fr -195.200.128.0 - 195.200.128.127 gb -195.200.128.128 - 195.200.128.191 fr -195.200.128.192 - 195.200.159.255 gb +195.200.128.0 - 195.200.159.255 gb 195.200.160.0 - 195.200.191.255 fr 195.200.192.0 - 195.200.192.255 de 195.200.193.0 - 195.200.193.255 gr @@ -114862,8 +92434,10 @@ 195.200.197.0 - 195.200.197.255 at 195.200.198.0 - 195.200.198.255 gb 195.200.199.0 - 195.200.199.255 pl -195.200.200.0 - 195.200.200.255 ro -195.200.201.0 - 195.200.201.255 be +195.200.200.0 - 195.200.200.255 si +195.200.201.0 - 195.200.201.40 be +195.200.201.41 - 195.200.201.41 eu +195.200.201.42 - 195.200.201.255 be 195.200.202.0 - 195.200.202.255 it 195.200.203.0 - 195.200.203.255 ru 195.200.204.0 - 195.200.204.255 gr @@ -114872,16 +92446,14 @@ 195.200.207.0 - 195.200.207.255 de 195.200.208.0 - 195.200.208.255 fr 195.200.209.0 - 195.200.209.255 ru -195.200.210.0 - 195.200.211.255 gb +195.200.211.0 - 195.200.211.255 gb 195.200.212.0 - 195.200.212.255 pl 195.200.213.0 - 195.200.213.255 ru 195.200.214.0 - 195.200.214.255 pl -195.200.215.0 - 195.200.215.255 de 195.200.216.0 - 195.200.216.255 ru 195.200.217.0 - 195.200.217.255 fr 195.200.218.0 - 195.200.218.255 ch 195.200.219.0 - 195.200.220.255 se -195.200.221.0 - 195.200.221.255 ua 195.200.222.0 - 195.200.222.255 tr 195.200.223.0 - 195.200.223.255 nl 195.200.224.0 - 195.200.225.255 be @@ -114899,56 +92471,34 @@ 195.200.248.0 - 195.200.249.255 ru 195.200.250.0 - 195.200.251.255 ua 195.200.252.0 - 195.200.253.255 pt -195.200.254.0 - 195.200.255.255 fr +195.200.254.0 - 195.200.254.255 gb +195.200.255.0 - 195.200.255.255 fr 195.201.0.0 - 195.201.255.255 ru 195.202.0.0 - 195.202.31.255 fr 195.202.32.0 - 195.202.63.255 de 195.202.64.0 - 195.202.95.255 ke -195.202.96.0 - 195.202.116.255 gb -195.202.117.0 - 195.202.117.15 de -195.202.117.16 - 195.202.127.255 gb +195.202.96.0 - 195.202.127.255 gb 195.202.128.0 - 195.202.191.255 at 195.202.192.0 - 195.202.255.255 ch -195.203.0.0 - 195.203.10.255 de -195.203.11.0 - 195.203.11.255 fr -195.203.12.0 - 195.203.30.255 de -195.203.31.0 - 195.203.32.255 fr -195.203.33.0 - 195.203.33.255 de -195.203.34.0 - 195.203.34.255 it -195.203.35.0 - 195.203.46.255 de -195.203.47.0 - 195.203.48.255 it -195.203.49.0 - 195.203.206.255 de -195.203.207.0 - 195.203.207.255 gb -195.203.208.0 - 195.203.255.255 de +195.203.0.0 - 195.203.255.255 de 195.204.0.0 - 195.204.255.255 no 195.205.0.0 - 195.205.255.255 pl 195.206.0.0 - 195.206.31.255 it 195.206.32.0 - 195.206.63.255 ru -195.206.64.0 - 195.206.66.255 gb -195.206.67.0 - 195.206.74.127 nl -195.206.74.128 - 195.206.75.31 be -195.206.75.32 - 195.206.80.95 nl -195.206.80.96 - 195.206.80.127 gb -195.206.80.128 - 195.206.80.159 nl -195.206.80.160 - 195.206.80.175 gb -195.206.80.176 - 195.206.85.127 nl -195.206.85.128 - 195.206.85.255 de -195.206.86.0 - 195.206.87.159 nl -195.206.87.160 - 195.206.87.191 de -195.206.87.192 - 195.206.95.255 nl +195.206.64.0 - 195.206.73.255 nl +195.206.74.0 - 195.206.74.255 eu +195.206.75.0 - 195.206.95.255 nl 195.206.96.0 - 195.206.103.255 at -195.206.104.0 - 195.206.107.255 lu -195.206.108.0 - 195.206.111.255 gb 195.206.112.0 - 195.206.119.255 pl -195.206.120.0 - 195.206.123.255 cz +195.206.120.0 - 195.206.120.255 ro +195.206.121.0 - 195.206.121.255 dk +195.206.122.0 - 195.206.123.255 ru 195.206.124.0 - 195.206.127.255 pl 195.206.128.0 - 195.206.159.255 de 195.206.160.0 - 195.206.223.255 gb 195.206.224.0 - 195.206.227.255 ru -195.206.228.0 - 195.206.229.255 pl -195.206.230.0 - 195.206.231.255 ru +195.206.228.0 - 195.206.229.255 si 195.206.232.0 - 195.206.233.255 ua -195.206.234.0 - 195.206.235.255 ru 195.206.236.0 - 195.206.237.255 fr 195.206.238.0 - 195.206.239.255 ua 195.206.240.0 - 195.206.241.255 ru @@ -114958,14 +92508,8 @@ 195.206.248.0 - 195.206.249.255 se 195.206.250.0 - 195.206.251.255 cy 195.206.252.0 - 195.206.255.255 ru -195.207.0.0 - 195.207.138.239 be -195.207.138.240 - 195.207.138.247 fr -195.207.138.248 - 195.207.161.79 be -195.207.161.80 - 195.207.161.87 nl -195.207.161.88 - 195.207.255.255 be -195.208.0.0 - 195.209.46.79 ru -195.209.46.80 - 195.209.46.87 ch -195.209.46.88 - 195.209.255.255 ru +195.207.0.0 - 195.207.255.255 be +195.208.0.0 - 195.209.255.255 ru 195.210.0.0 - 195.210.1.255 hu 195.210.2.0 - 195.210.3.255 ru 195.210.4.0 - 195.210.5.255 ro @@ -115019,15 +92563,13 @@ 195.211.84.0 - 195.211.87.255 ua 195.211.88.0 - 195.211.91.255 ru 195.211.92.0 - 195.211.95.255 gb -195.211.96.0 - 195.211.99.255 ua -195.211.100.0 - 195.211.107.255 ru +195.211.96.0 - 195.211.107.255 ru 195.211.108.0 - 195.211.111.255 ua 195.211.112.0 - 195.211.115.255 ru 195.211.116.0 - 195.211.119.255 ua 195.211.120.0 - 195.211.131.255 ru 195.211.132.0 - 195.211.135.255 se -195.211.136.0 - 195.211.151.255 ua -195.211.152.0 - 195.211.155.255 ro +195.211.136.0 - 195.211.155.255 ua 195.211.156.0 - 195.211.159.255 lv 195.211.160.0 - 195.211.163.255 ua 195.211.164.0 - 195.211.167.255 gb @@ -115047,1218 +92589,81 @@ 195.211.240.0 - 195.211.243.255 ua 195.211.244.0 - 195.211.251.255 ru 195.211.252.0 - 195.211.255.255 ua -195.212.0.0 - 195.212.8.255 gb -195.212.9.0 - 195.212.9.63 eu -195.212.9.64 - 195.212.15.255 gb -195.212.16.0 - 195.212.16.255 eu -195.212.17.0 - 195.212.19.127 de -195.212.19.128 - 195.212.19.255 eu -195.212.20.0 - 195.212.20.15 de -195.212.20.16 - 195.212.20.23 eu -195.212.20.24 - 195.212.20.31 gb -195.212.20.32 - 195.212.20.63 eu -195.212.20.64 - 195.212.20.151 de -195.212.20.152 - 195.212.20.159 eu -195.212.20.160 - 195.212.21.127 de -195.212.21.128 - 195.212.21.159 eu -195.212.21.160 - 195.212.21.223 de -195.212.21.224 - 195.212.21.255 eu -195.212.22.0 - 195.212.22.255 de -195.212.23.0 - 195.212.23.63 dk -195.212.23.64 - 195.212.23.95 eu -195.212.23.96 - 195.212.23.127 dk -195.212.23.128 - 195.212.23.191 eu -195.212.23.192 - 195.212.23.231 dk -195.212.23.232 - 195.212.23.239 eu -195.212.23.240 - 195.212.23.255 dk -195.212.24.0 - 195.212.24.63 gb -195.212.24.64 - 195.212.24.79 eu -195.212.24.80 - 195.212.24.255 gb -195.212.25.0 - 195.212.25.15 eu -195.212.25.16 - 195.212.25.31 se -195.212.25.32 - 195.212.25.79 eu -195.212.25.80 - 195.212.25.95 se -195.212.25.96 - 195.212.25.127 eu -195.212.25.128 - 195.212.25.255 se -195.212.26.0 - 195.212.26.255 gb -195.212.27.0 - 195.212.27.95 it -195.212.27.96 - 195.212.27.127 eu -195.212.27.128 - 195.212.27.255 it -195.212.28.0 - 195.212.28.231 gb -195.212.28.232 - 195.212.28.255 eu -195.212.29.0 - 195.212.31.255 gb -195.212.32.0 - 195.212.32.31 dk -195.212.32.32 - 195.212.32.63 eu -195.212.32.64 - 195.212.32.135 dk -195.212.32.136 - 195.212.32.175 eu -195.212.32.176 - 195.212.33.127 dk -195.212.33.128 - 195.212.33.191 eu -195.212.33.192 - 195.212.34.79 dk -195.212.34.80 - 195.212.34.87 eu -195.212.34.88 - 195.212.34.255 dk -195.212.35.0 - 195.212.35.255 no -195.212.36.0 - 195.212.37.255 fi -195.212.38.0 - 195.212.39.255 dk -195.212.40.0 - 195.212.40.15 nl -195.212.40.16 - 195.212.40.63 eu -195.212.40.64 - 195.212.40.119 nl -195.212.40.120 - 195.212.40.127 eu -195.212.40.128 - 195.212.41.15 nl -195.212.41.16 - 195.212.41.31 be -195.212.41.32 - 195.212.41.63 eu -195.212.41.64 - 195.212.41.127 ch -195.212.41.128 - 195.212.41.159 nl -195.212.41.160 - 195.212.41.175 eu -195.212.41.176 - 195.212.41.199 nl -195.212.41.200 - 195.212.41.207 de -195.212.41.208 - 195.212.42.31 nl -195.212.42.32 - 195.212.42.63 eu -195.212.42.64 - 195.212.43.47 nl -195.212.43.48 - 195.212.43.95 eu -195.212.43.96 - 195.212.43.117 nl -195.212.43.118 - 195.212.43.119 eu -195.212.43.120 - 195.212.43.231 nl -195.212.43.232 - 195.212.43.239 gb -195.212.43.240 - 195.212.43.247 nl -195.212.43.248 - 195.212.43.255 eu -195.212.44.0 - 195.212.44.191 de -195.212.44.192 - 195.212.44.207 gb -195.212.44.208 - 195.212.45.95 de -195.212.45.96 - 195.212.45.127 eu -195.212.45.128 - 195.212.45.255 de -195.212.46.0 - 195.212.46.15 eu -195.212.46.16 - 195.212.46.127 de -195.212.46.128 - 195.212.46.255 eu -195.212.47.0 - 195.212.47.47 at -195.212.47.48 - 195.212.47.167 eu -195.212.47.168 - 195.212.47.175 at -195.212.47.176 - 195.212.47.223 eu -195.212.47.224 - 195.212.47.255 at -195.212.48.0 - 195.212.48.47 lu -195.212.48.48 - 195.212.48.63 eu -195.212.48.64 - 195.212.48.95 lu -195.212.48.96 - 195.212.48.255 eu -195.212.49.0 - 195.212.49.15 fr -195.212.49.16 - 195.212.49.23 be -195.212.49.24 - 195.212.49.63 eu -195.212.49.64 - 195.212.49.159 be -195.212.49.160 - 195.212.49.191 eu -195.212.49.192 - 195.212.49.207 gb -195.212.49.208 - 195.212.49.223 eu -195.212.49.224 - 195.212.50.63 be -195.212.50.64 - 195.212.50.95 fr -195.212.50.96 - 195.212.50.111 be -195.212.50.112 - 195.212.50.119 eu -195.212.50.120 - 195.212.50.191 be -195.212.50.192 - 195.212.50.223 eu -195.212.50.224 - 195.212.51.183 be -195.212.51.184 - 195.212.51.223 eu -195.212.51.224 - 195.212.51.255 be -195.212.52.0 - 195.212.52.7 eu -195.212.52.8 - 195.212.52.31 be -195.212.52.32 - 195.212.52.63 gb -195.212.52.64 - 195.212.52.255 eu -195.212.53.0 - 195.212.53.63 be -195.212.53.64 - 195.212.53.95 gb -195.212.53.96 - 195.212.53.111 be -195.212.53.112 - 195.212.53.127 de -195.212.53.128 - 195.212.55.255 be -195.212.56.0 - 195.212.56.15 dk -195.212.56.16 - 195.212.56.63 eu -195.212.56.64 - 195.212.56.87 dk -195.212.56.88 - 195.212.56.127 eu -195.212.56.128 - 195.212.56.143 dk -195.212.56.144 - 195.212.56.159 eu -195.212.56.160 - 195.212.56.255 dk -195.212.57.0 - 195.212.58.31 eu -195.212.58.32 - 195.212.58.127 de -195.212.58.128 - 195.212.58.255 eu -195.212.59.0 - 195.212.59.47 de -195.212.59.48 - 195.212.59.55 eu -195.212.59.56 - 195.212.59.95 de -195.212.59.96 - 195.212.59.127 eu -195.212.59.128 - 195.212.60.255 de -195.212.61.0 - 195.212.61.79 ch -195.212.61.80 - 195.212.61.87 eu -195.212.61.88 - 195.212.61.95 ch -195.212.61.96 - 195.212.61.159 eu -195.212.61.160 - 195.212.61.191 ch -195.212.61.192 - 195.212.61.255 eu -195.212.62.0 - 195.212.62.255 at -195.212.63.0 - 195.212.63.15 bg -195.212.63.16 - 195.212.63.31 eu -195.212.63.32 - 195.212.63.79 bg -195.212.63.80 - 195.212.63.95 eu -195.212.63.96 - 195.212.63.127 bg -195.212.63.128 - 195.212.63.135 eu -195.212.63.136 - 195.212.63.143 bg -195.212.63.144 - 195.212.63.255 eu -195.212.64.0 - 195.212.64.255 de -195.212.65.0 - 195.212.66.15 eu -195.212.66.16 - 195.212.66.31 de -195.212.66.32 - 195.212.66.63 eu -195.212.66.64 - 195.212.66.175 de -195.212.66.176 - 195.212.66.183 eu -195.212.66.184 - 195.212.66.191 de -195.212.66.192 - 195.212.67.31 eu -195.212.67.32 - 195.212.67.47 de -195.212.67.48 - 195.212.67.55 gb -195.212.67.56 - 195.212.67.63 eu -195.212.67.64 - 195.212.69.95 de -195.212.69.96 - 195.212.69.159 eu -195.212.69.160 - 195.212.69.183 de -195.212.69.184 - 195.212.69.191 eu -195.212.69.192 - 195.212.69.199 de -195.212.69.200 - 195.212.69.207 eu -195.212.69.208 - 195.212.73.255 de -195.212.74.0 - 195.212.74.31 eu -195.212.74.32 - 195.212.79.31 de -195.212.79.32 - 195.212.79.63 eu -195.212.79.64 - 195.212.79.95 de -195.212.79.96 - 195.212.79.127 eu -195.212.79.128 - 195.212.81.255 de -195.212.82.0 - 195.212.82.63 eu -195.212.82.64 - 195.212.82.127 de -195.212.82.128 - 195.212.82.191 eu -195.212.82.192 - 195.212.83.127 de -195.212.83.128 - 195.212.83.159 eu -195.212.83.160 - 195.212.83.175 de -195.212.83.176 - 195.212.83.183 eu -195.212.83.184 - 195.212.83.223 de -195.212.83.224 - 195.212.83.255 eu -195.212.84.0 - 195.212.84.31 de -195.212.84.32 - 195.212.84.63 eu -195.212.84.64 - 195.212.84.95 de -195.212.84.96 - 195.212.84.111 eu -195.212.84.112 - 195.212.84.255 de -195.212.85.0 - 195.212.88.47 eu -195.212.88.48 - 195.212.88.63 de -195.212.88.64 - 195.212.88.159 eu -195.212.88.160 - 195.212.89.47 de -195.212.89.48 - 195.212.89.55 gb -195.212.89.56 - 195.212.89.63 de -195.212.89.64 - 195.212.89.95 eu -195.212.89.96 - 195.212.89.127 de -195.212.89.128 - 195.212.89.255 eu -195.212.90.0 - 195.212.90.255 de -195.212.91.0 - 195.212.91.47 eu -195.212.91.48 - 195.212.91.63 de -195.212.91.64 - 195.212.91.127 eu -195.212.91.128 - 195.212.91.223 de -195.212.91.224 - 195.212.91.255 eu -195.212.92.0 - 195.212.92.15 de -195.212.92.16 - 195.212.92.31 eu -195.212.92.32 - 195.212.92.63 de -195.212.92.64 - 195.212.92.79 eu -195.212.92.80 - 195.212.93.255 de -195.212.94.0 - 195.212.94.255 eu -195.212.95.0 - 195.212.95.63 de -195.212.95.64 - 195.212.95.71 eu -195.212.95.72 - 195.212.95.95 de -195.212.95.96 - 195.212.95.127 eu -195.212.95.128 - 195.212.95.135 de -195.212.95.136 - 195.212.95.143 eu -195.212.95.144 - 195.212.95.255 de -195.212.96.0 - 195.212.97.39 eu -195.212.97.40 - 195.212.97.63 at -195.212.97.64 - 195.212.97.95 eu -195.212.97.96 - 195.212.97.111 at -195.212.97.112 - 195.212.97.119 eu -195.212.97.120 - 195.212.97.127 at -195.212.97.128 - 195.212.97.191 eu -195.212.97.192 - 195.212.97.199 at -195.212.97.200 - 195.212.97.223 eu -195.212.97.224 - 195.212.97.239 at -195.212.97.240 - 195.212.98.63 eu -195.212.98.64 - 195.212.98.111 at -195.212.98.112 - 195.212.98.127 eu -195.212.98.128 - 195.212.98.191 at -195.212.98.192 - 195.212.99.255 eu -195.212.100.0 - 195.212.100.255 de -195.212.101.0 - 195.212.101.127 eu -195.212.101.128 - 195.212.101.255 gb -195.212.102.0 - 195.212.102.31 at -195.212.102.32 - 195.212.102.159 eu -195.212.102.160 - 195.212.102.223 at -195.212.102.224 - 195.212.103.31 eu -195.212.103.32 - 195.212.103.223 it -195.212.103.224 - 195.212.103.239 eu -195.212.103.240 - 195.212.103.255 it -195.212.104.0 - 195.212.106.31 fr -195.212.106.32 - 195.212.106.63 eu -195.212.106.64 - 195.212.106.95 fr -195.212.106.96 - 195.212.106.111 eu -195.212.106.112 - 195.212.108.255 fr -195.212.109.0 - 195.212.109.255 eu -195.212.110.0 - 195.212.111.223 fr -195.212.111.224 - 195.212.111.231 eu -195.212.111.232 - 195.212.111.239 gb -195.212.111.240 - 195.212.111.255 eu -195.212.112.0 - 195.212.113.127 ch -195.212.113.128 - 195.212.115.255 eu -195.212.116.0 - 195.212.116.127 ch -195.212.116.128 - 195.212.117.15 eu -195.212.117.16 - 195.212.117.63 ch -195.212.117.64 - 195.212.117.71 eu -195.212.117.72 - 195.212.117.191 ch -195.212.117.192 - 195.212.117.255 eu +195.212.0.0 - 195.212.2.191 eu +195.212.2.192 - 195.212.2.207 gb +195.212.2.208 - 195.212.3.87 eu +195.212.3.88 - 195.212.3.95 gb +195.212.3.96 - 195.212.6.207 eu +195.212.6.208 - 195.212.6.223 gb +195.212.6.224 - 195.212.10.127 eu +195.212.10.128 - 195.212.10.255 gb +195.212.11.0 - 195.212.40.191 eu +195.212.40.192 - 195.212.40.223 nl +195.212.40.224 - 195.212.43.47 eu +195.212.43.48 - 195.212.43.79 nl +195.212.43.80 - 195.212.48.127 eu +195.212.48.128 - 195.212.48.159 lu +195.212.48.160 - 195.212.57.255 eu +195.212.58.0 - 195.212.58.255 nl +195.212.59.0 - 195.212.83.255 eu +195.212.84.0 - 195.212.84.15 us +195.212.84.16 - 195.212.84.31 de +195.212.84.32 - 195.212.84.255 us +195.212.85.0 - 195.212.103.15 eu +195.212.103.16 - 195.212.103.31 it +195.212.103.32 - 195.212.117.255 eu 195.212.118.0 - 195.212.118.255 ch -195.212.119.0 - 195.212.119.255 eu -195.212.120.0 - 195.212.120.255 it -195.212.121.0 - 195.212.121.15 ch -195.212.121.16 - 195.212.121.23 eu -195.212.121.24 - 195.212.121.63 ch -195.212.121.64 - 195.212.121.255 eu -195.212.122.0 - 195.212.122.15 fr -195.212.122.16 - 195.212.122.23 cy -195.212.122.24 - 195.212.122.31 eu -195.212.122.32 - 195.212.122.103 fr -195.212.122.104 - 195.212.122.111 eu -195.212.122.112 - 195.212.122.255 fr -195.212.123.0 - 195.212.123.255 eu -195.212.124.0 - 195.212.124.31 ch -195.212.124.32 - 195.212.124.255 eu -195.212.125.0 - 195.212.125.31 ch -195.212.125.32 - 195.212.125.255 eu -195.212.126.0 - 195.212.127.255 ch -195.212.128.0 - 195.212.131.255 eu -195.212.132.0 - 195.212.133.255 ie -195.212.134.0 - 195.212.134.47 eu -195.212.134.48 - 195.212.134.63 sk -195.212.134.64 - 195.212.136.71 eu -195.212.136.72 - 195.212.136.79 sk -195.212.136.80 - 195.212.136.159 eu -195.212.136.160 - 195.212.136.175 sk -195.212.136.176 - 195.212.136.183 eu -195.212.136.184 - 195.212.136.191 sk -195.212.136.192 - 195.212.136.231 eu -195.212.136.232 - 195.212.136.247 sk -195.212.136.248 - 195.212.139.255 eu -195.212.140.0 - 195.212.141.255 it -195.212.142.0 - 195.212.142.255 hu -195.212.143.0 - 195.212.143.15 nl -195.212.143.16 - 195.212.143.63 eu -195.212.143.64 - 195.212.143.127 gb -195.212.143.128 - 195.212.143.255 eu -195.212.144.0 - 195.212.144.63 nl -195.212.144.64 - 195.212.144.127 eu -195.212.144.128 - 195.212.145.255 nl -195.212.146.0 - 195.212.147.255 eu -195.212.148.0 - 195.212.151.255 gb -195.212.152.0 - 195.212.153.255 eu -195.212.154.0 - 195.212.154.143 ru -195.212.154.144 - 195.212.154.159 eu -195.212.154.160 - 195.212.155.31 ru -195.212.155.32 - 195.212.155.63 eu -195.212.155.64 - 195.212.155.87 ru -195.212.155.88 - 195.212.155.95 lt -195.212.155.96 - 195.212.155.103 lv -195.212.155.104 - 195.212.155.111 ru -195.212.155.112 - 195.212.155.127 eu -195.212.155.128 - 195.212.155.255 ru -195.212.156.0 - 195.212.156.255 eu -195.212.157.0 - 195.212.157.63 ru -195.212.157.64 - 195.212.158.255 eu -195.212.159.0 - 195.212.159.255 ru -195.212.160.0 - 195.212.161.255 eu -195.212.162.0 - 195.212.162.255 fr -195.212.163.0 - 195.212.163.207 gb -195.212.163.208 - 195.212.163.215 eu -195.212.163.216 - 195.212.163.255 gb -195.212.164.0 - 195.212.167.255 eu -195.212.168.0 - 195.212.168.15 es -195.212.168.16 - 195.212.168.31 eu -195.212.168.32 - 195.212.168.127 es -195.212.168.128 - 195.212.168.191 eu -195.212.168.192 - 195.212.168.223 es -195.212.168.224 - 195.212.168.239 eu -195.212.168.240 - 195.212.168.255 es -195.212.169.0 - 195.212.169.63 it -195.212.169.64 - 195.212.169.95 eu -195.212.169.96 - 195.212.171.255 it -195.212.172.0 - 195.212.175.255 eu -195.212.176.0 - 195.212.177.255 de -195.212.178.0 - 195.212.178.63 es -195.212.178.64 - 195.212.178.127 eu -195.212.178.128 - 195.212.178.151 es -195.212.178.152 - 195.212.178.175 eu -195.212.178.176 - 195.212.178.207 fr -195.212.178.208 - 195.212.178.215 es -195.212.178.216 - 195.212.178.223 eu -195.212.178.224 - 195.212.178.255 fr -195.212.179.0 - 195.212.179.31 eu -195.212.179.32 - 195.212.183.255 de -195.212.184.0 - 195.212.184.31 eu -195.212.184.32 - 195.212.184.223 de -195.212.184.224 - 195.212.184.239 eu -195.212.184.240 - 195.212.184.255 de -195.212.185.0 - 195.212.185.255 it -195.212.186.0 - 195.212.186.255 de -195.212.187.0 - 195.212.187.31 ch -195.212.187.32 - 195.212.187.39 cy -195.212.187.40 - 195.212.187.47 eu -195.212.187.48 - 195.212.187.63 ch -195.212.187.64 - 195.212.189.255 eu -195.212.190.0 - 195.212.190.63 fr -195.212.190.64 - 195.212.190.95 eu -195.212.190.96 - 195.212.190.255 fr -195.212.191.0 - 195.212.191.255 de -195.212.192.0 - 195.212.192.255 cz -195.212.193.0 - 195.212.193.127 eu -195.212.193.128 - 195.212.193.255 cz -195.212.194.0 - 195.212.195.255 gb -195.212.196.0 - 195.212.196.255 dk -195.212.197.0 - 195.212.197.143 cz -195.212.197.144 - 195.212.197.151 eu -195.212.197.152 - 195.212.197.159 cz -195.212.197.160 - 195.212.197.191 gb -195.212.197.192 - 195.212.197.223 cz -195.212.197.224 - 195.212.197.255 eu -195.212.198.0 - 195.212.198.127 cz -195.212.198.128 - 195.212.199.31 eu -195.212.199.32 - 195.212.199.63 gb -195.212.199.64 - 195.212.199.79 cz -195.212.199.80 - 195.212.200.255 eu -195.212.201.0 - 195.212.201.255 cz -195.212.202.0 - 195.212.202.31 il -195.212.202.32 - 195.212.202.39 cy -195.212.202.40 - 195.212.202.47 il -195.212.202.48 - 195.212.202.63 cy -195.212.202.64 - 195.212.202.127 by -195.212.202.128 - 195.212.202.191 gb -195.212.202.192 - 195.212.202.255 il -195.212.203.0 - 195.212.205.159 eu -195.212.205.160 - 195.212.205.191 cz -195.212.205.192 - 195.212.205.255 eu -195.212.206.0 - 195.212.206.63 es -195.212.206.64 - 195.212.206.255 eu -195.212.207.0 - 195.212.207.255 fi -195.212.208.0 - 195.212.209.255 eu -195.212.210.0 - 195.212.210.95 cz -195.212.210.96 - 195.212.212.191 eu -195.212.212.192 - 195.212.212.255 cz -195.212.213.0 - 195.212.213.159 eu -195.212.213.160 - 195.212.213.191 cz -195.212.213.192 - 195.212.215.255 eu -195.212.216.0 - 195.212.216.31 cz -195.212.216.32 - 195.212.220.255 eu -195.212.221.0 - 195.212.221.63 gr -195.212.221.64 - 195.212.222.79 eu -195.212.222.80 - 195.212.222.127 cz -195.212.222.128 - 195.212.222.255 eu -195.212.223.0 - 195.212.223.255 cz -195.212.224.0 - 195.212.225.255 de -195.212.226.0 - 195.212.226.15 ru -195.212.226.16 - 195.212.226.31 eu -195.212.226.32 - 195.212.226.63 ru -195.212.226.64 - 195.212.226.127 eu -195.212.226.128 - 195.212.226.255 ru -195.212.227.0 - 195.212.227.7 eu -195.212.227.8 - 195.212.227.63 pt -195.212.227.64 - 195.212.227.255 eu -195.212.228.0 - 195.212.228.127 se -195.212.228.128 - 195.212.228.159 eu -195.212.228.160 - 195.212.228.191 se -195.212.228.192 - 195.212.229.255 eu -195.212.230.0 - 195.212.230.255 tr -195.212.231.0 - 195.212.231.127 eu -195.212.231.128 - 195.212.231.159 hu -195.212.231.160 - 195.212.231.223 eu -195.212.231.224 - 195.212.231.255 hu +195.212.119.0 - 195.212.173.255 eu +195.212.174.0 - 195.212.175.255 es +195.212.176.0 - 195.212.197.143 eu +195.212.197.144 - 195.212.197.175 cz +195.212.197.176 - 195.212.199.47 eu +195.212.199.48 - 195.212.199.63 gb +195.212.199.64 - 195.212.231.255 eu 195.212.232.0 - 195.212.239.255 gb -195.212.240.0 - 195.212.240.127 gr -195.212.240.128 - 195.212.240.191 eu -195.212.240.192 - 195.212.241.63 gr -195.212.241.64 - 195.212.241.127 eu -195.212.241.128 - 195.212.242.15 gr -195.212.242.16 - 195.212.242.63 eu -195.212.242.64 - 195.212.242.127 gr -195.212.242.128 - 195.212.243.255 eu -195.212.244.0 - 195.212.244.7 gb -195.212.244.8 - 195.212.244.15 eu -195.212.244.16 - 195.212.244.31 gr -195.212.244.32 - 195.212.244.63 eu -195.212.244.64 - 195.212.244.127 gr -195.212.244.128 - 195.212.245.255 eu -195.212.246.0 - 195.212.247.255 gr -195.212.248.0 - 195.212.251.255 eu -195.212.252.0 - 195.212.252.255 at -195.212.253.0 - 195.212.254.15 eu -195.212.254.16 - 195.212.254.27 gr -195.212.254.28 - 195.212.255.127 eu -195.212.255.128 - 195.212.255.159 gr -195.212.255.160 - 195.212.255.191 eu -195.212.255.192 - 195.212.255.255 gr -195.213.0.0 - 195.213.0.255 dk -195.213.1.0 - 195.213.1.127 no -195.213.1.128 - 195.213.1.143 be +195.212.240.0 - 195.212.253.255 eu +195.212.254.0 - 195.212.254.23 gr +195.212.254.24 - 195.212.254.39 eu +195.212.254.40 - 195.212.254.47 gr +195.212.254.48 - 195.212.255.255 eu +195.213.0.0 - 195.213.1.143 be 195.213.1.144 - 195.213.1.147 nl -195.213.1.148 - 195.213.1.151 it -195.213.1.152 - 195.213.1.159 nl -195.213.1.160 - 195.213.1.175 gb -195.213.1.176 - 195.213.1.191 il -195.213.1.192 - 195.213.1.255 de -195.213.2.0 - 195.213.2.127 gb -195.213.2.128 - 195.213.2.191 pl -195.213.2.192 - 195.213.2.223 be -195.213.2.224 - 195.213.2.255 se -195.213.3.0 - 195.213.3.159 gb -195.213.3.160 - 195.213.3.191 at -195.213.3.192 - 195.213.7.255 gb -195.213.8.0 - 195.213.8.15 nl -195.213.8.16 - 195.213.8.31 es -195.213.8.32 - 195.213.8.127 be -195.213.8.128 - 195.213.8.255 es -195.213.9.0 - 195.213.9.255 ch -195.213.10.0 - 195.213.10.255 be -195.213.11.0 - 195.213.11.255 fr -195.213.12.0 - 195.213.12.255 de -195.213.13.0 - 195.213.14.255 gb -195.213.15.0 - 195.213.15.255 nl -195.213.16.0 - 195.213.16.143 gb -195.213.16.144 - 195.213.16.159 ch -195.213.16.160 - 195.213.16.191 gb -195.213.16.192 - 195.213.16.255 de -195.213.17.0 - 195.213.17.127 nl -195.213.17.128 - 195.213.17.255 gb -195.213.18.0 - 195.213.19.15 be -195.213.19.16 - 195.213.19.255 gb -195.213.20.0 - 195.213.21.31 be -195.213.21.32 - 195.213.21.127 gb -195.213.21.128 - 195.213.22.255 be -195.213.23.0 - 195.213.26.127 gb -195.213.26.128 - 195.213.26.135 be -195.213.26.136 - 195.213.26.143 es -195.213.26.144 - 195.213.26.255 ch -195.213.27.0 - 195.213.27.31 za -195.213.27.32 - 195.213.27.127 be -195.213.27.128 - 195.213.27.135 fi -195.213.27.136 - 195.213.27.159 be -195.213.27.160 - 195.213.27.191 gb -195.213.27.192 - 195.213.28.255 fr -195.213.29.0 - 195.213.29.255 ch -195.213.30.0 - 195.213.30.95 gb -195.213.30.96 - 195.213.30.127 lu -195.213.30.128 - 195.213.30.191 za -195.213.30.192 - 195.213.30.207 gb -195.213.30.208 - 195.213.30.223 ch -195.213.30.224 - 195.213.30.255 be +195.213.1.148 - 195.213.3.255 be +195.213.4.0 - 195.213.7.255 gb +195.213.8.0 - 195.213.30.255 be 195.213.31.0 - 195.213.31.127 gb -195.213.31.128 - 195.213.31.255 be -195.213.32.0 - 195.213.32.255 dk -195.213.33.0 - 195.213.33.127 gb -195.213.33.128 - 195.213.33.159 be -195.213.33.160 - 195.213.33.191 es -195.213.33.192 - 195.213.33.255 gb -195.213.34.0 - 195.213.34.255 be -195.213.35.0 - 195.213.35.255 ch -195.213.36.0 - 195.213.37.255 be -195.213.38.0 - 195.213.38.7 il -195.213.38.8 - 195.213.38.19 be -195.213.38.20 - 195.213.38.23 fr -195.213.38.24 - 195.213.38.31 be -195.213.38.32 - 195.213.38.63 cz -195.213.38.64 - 195.213.38.127 be -195.213.38.128 - 195.213.38.159 hu -195.213.38.160 - 195.213.39.111 be -195.213.39.112 - 195.213.39.127 pt -195.213.39.128 - 195.213.39.255 ch -195.213.40.0 - 195.213.40.255 es -195.213.41.0 - 195.213.41.31 ch -195.213.41.32 - 195.213.41.63 be -195.213.41.64 - 195.213.41.127 ch -195.213.41.128 - 195.213.42.255 gb -195.213.43.0 - 195.213.43.127 be -195.213.43.128 - 195.213.43.131 gb -195.213.43.132 - 195.213.43.135 be -195.213.43.136 - 195.213.43.143 fr -195.213.43.144 - 195.213.43.159 lu +195.213.31.128 - 195.213.43.159 be 195.213.43.160 - 195.213.43.191 il -195.213.43.192 - 195.213.43.199 be -195.213.43.200 - 195.213.43.207 de -195.213.43.208 - 195.213.43.223 jp -195.213.43.224 - 195.213.43.255 be -195.213.44.0 - 195.213.44.63 il -195.213.44.64 - 195.213.44.127 gb -195.213.44.128 - 195.213.44.255 be -195.213.45.0 - 195.213.45.3 gb -195.213.45.4 - 195.213.45.7 pl -195.213.45.8 - 195.213.45.47 be -195.213.45.48 - 195.213.45.63 fr -195.213.45.64 - 195.213.45.159 be -195.213.45.160 - 195.213.45.191 de -195.213.45.192 - 195.213.46.255 be -195.213.47.0 - 195.213.47.127 de -195.213.47.128 - 195.213.47.255 fr -195.213.48.0 - 195.213.48.223 be -195.213.48.224 - 195.213.48.255 gb -195.213.49.0 - 195.213.49.15 be -195.213.49.16 - 195.213.49.31 za -195.213.49.32 - 195.213.49.51 be -195.213.49.52 - 195.213.49.55 fr -195.213.49.56 - 195.213.49.63 be -195.213.49.64 - 195.213.49.79 gb -195.213.49.80 - 195.213.49.99 be -195.213.49.100 - 195.213.49.103 fr -195.213.49.104 - 195.213.49.111 be -195.213.49.112 - 195.213.49.239 gb -195.213.49.240 - 195.213.50.63 be -195.213.50.64 - 195.213.50.95 de -195.213.50.96 - 195.213.50.111 nl +195.213.43.192 - 195.213.50.111 be 195.213.50.112 - 195.213.50.127 il -195.213.50.128 - 195.213.50.159 ch -195.213.50.160 - 195.213.50.175 gb -195.213.50.176 - 195.213.50.255 be -195.213.51.0 - 195.213.51.255 it -195.213.52.0 - 195.213.52.31 no -195.213.52.32 - 195.213.52.63 ie -195.213.52.64 - 195.213.52.79 li -195.213.52.80 - 195.213.52.87 fi -195.213.52.88 - 195.213.52.95 it -195.213.52.96 - 195.213.52.127 be +195.213.50.128 - 195.213.52.127 be 195.213.52.128 - 195.213.52.255 gb -195.213.53.0 - 195.213.53.95 lu -195.213.53.96 - 195.213.53.127 gr -195.213.53.128 - 195.213.53.143 cz -195.213.53.144 - 195.213.54.31 be -195.213.54.32 - 195.213.54.63 gb -195.213.54.64 - 195.213.54.71 nl -195.213.54.72 - 195.213.54.103 be -195.213.54.104 - 195.213.54.111 gb -195.213.54.112 - 195.213.54.159 fr -195.213.54.160 - 195.213.55.31 be -195.213.55.32 - 195.213.55.63 nl -195.213.55.64 - 195.213.55.95 it -195.213.55.96 - 195.213.55.127 de -195.213.55.128 - 195.213.55.191 at -195.213.55.192 - 195.213.55.207 be -195.213.55.208 - 195.213.55.215 gb -195.213.55.216 - 195.213.55.223 be -195.213.55.224 - 195.213.55.239 gb -195.213.55.240 - 195.213.56.31 be -195.213.56.32 - 195.213.56.63 za -195.213.56.64 - 195.213.56.95 gb -195.213.56.96 - 195.213.56.99 be -195.213.56.100 - 195.213.56.103 gb -195.213.56.104 - 195.213.56.111 de -195.213.56.112 - 195.213.56.115 gb -195.213.56.116 - 195.213.56.119 be -195.213.56.120 - 195.213.56.127 gb -195.213.56.128 - 195.213.56.143 it -195.213.56.144 - 195.213.56.159 de -195.213.56.160 - 195.213.56.191 be -195.213.56.192 - 195.213.56.207 gb -195.213.56.208 - 195.213.56.255 be -195.213.57.0 - 195.213.57.31 ch -195.213.57.32 - 195.213.57.95 gb -195.213.57.96 - 195.213.57.103 be -195.213.57.104 - 195.213.57.111 ie -195.213.57.112 - 195.213.57.127 gb -195.213.57.128 - 195.213.57.143 fr -195.213.57.144 - 195.213.57.159 lu -195.213.57.160 - 195.213.57.191 es -195.213.57.192 - 195.213.57.223 nl -195.213.57.224 - 195.213.57.239 fr -195.213.57.240 - 195.213.58.127 be -195.213.58.128 - 195.213.58.175 gb -195.213.58.176 - 195.213.58.191 dk -195.213.58.192 - 195.213.58.207 be -195.213.58.208 - 195.213.58.215 gb -195.213.58.216 - 195.213.58.219 fr -195.213.58.220 - 195.213.58.223 es -195.213.58.224 - 195.213.58.231 be -195.213.58.232 - 195.213.58.239 de -195.213.58.240 - 195.213.58.247 be -195.213.58.248 - 195.213.58.255 de -195.213.59.0 - 195.213.59.31 be -195.213.59.32 - 195.213.59.63 de -195.213.59.64 - 195.213.59.103 be -195.213.59.104 - 195.213.59.111 nl -195.213.59.112 - 195.213.59.127 fr -195.213.59.128 - 195.213.59.143 be -195.213.59.144 - 195.213.59.159 de -195.213.59.160 - 195.213.59.175 il -195.213.59.176 - 195.213.59.223 be -195.213.59.224 - 195.213.59.255 nl -195.213.60.0 - 195.213.60.255 be -195.213.61.0 - 195.213.61.255 gb -195.213.62.0 - 195.213.62.63 be -195.213.62.64 - 195.213.62.71 es -195.213.62.72 - 195.213.62.255 be -195.213.63.0 - 195.213.64.15 it -195.213.64.16 - 195.213.64.31 de -195.213.64.32 - 195.213.64.39 be -195.213.64.40 - 195.213.64.47 ru -195.213.64.48 - 195.213.64.63 it -195.213.64.64 - 195.213.64.127 ch -195.213.64.128 - 195.213.64.159 de -195.213.64.160 - 195.213.64.175 fi -195.213.64.176 - 195.213.64.191 it -195.213.64.192 - 195.213.64.223 be -195.213.64.224 - 195.213.65.31 it -195.213.65.32 - 195.213.65.111 be -195.213.65.112 - 195.213.65.119 nl -195.213.65.120 - 195.213.65.127 be -195.213.65.128 - 195.213.65.131 nl -195.213.65.132 - 195.213.65.159 be -195.213.65.160 - 195.213.65.175 it -195.213.65.176 - 195.213.65.191 lu -195.213.65.192 - 195.213.65.199 be -195.213.65.200 - 195.213.65.207 se -195.213.65.208 - 195.213.65.223 gb -195.213.65.224 - 195.213.65.255 fr -195.213.66.0 - 195.213.66.127 it -195.213.66.128 - 195.213.66.159 se -195.213.66.160 - 195.213.66.183 be -195.213.66.184 - 195.213.66.191 ch -195.213.66.192 - 195.213.67.31 gb -195.213.67.32 - 195.213.67.63 be +195.213.53.0 - 195.213.67.63 be 195.213.67.64 - 195.213.67.79 gb -195.213.67.80 - 195.213.67.95 se -195.213.67.96 - 195.213.67.103 be -195.213.67.104 - 195.213.67.111 de +195.213.67.80 - 195.213.67.111 be 195.213.67.112 - 195.213.67.127 gb -195.213.67.128 - 195.213.68.255 it -195.213.69.0 - 195.213.69.127 il -195.213.69.128 - 195.213.69.143 it -195.213.69.144 - 195.213.69.159 tr -195.213.69.160 - 195.213.69.191 be -195.213.69.192 - 195.213.69.255 it -195.213.70.0 - 195.213.70.255 pt -195.213.71.0 - 195.213.71.15 nl -195.213.71.16 - 195.213.71.63 be -195.213.71.64 - 195.213.71.95 fr -195.213.71.96 - 195.213.71.127 it -195.213.71.128 - 195.213.71.163 gb -195.213.71.164 - 195.213.71.175 be -195.213.71.176 - 195.213.71.191 gb -195.213.71.192 - 195.213.71.255 it -195.213.72.0 - 195.213.72.31 gb -195.213.72.32 - 195.213.72.47 be -195.213.72.48 - 195.213.72.63 gb -195.213.72.64 - 195.213.72.79 dk -195.213.72.80 - 195.213.72.95 es -195.213.72.96 - 195.213.72.111 hu -195.213.72.112 - 195.213.72.207 ie -195.213.72.208 - 195.213.72.223 gb -195.213.72.224 - 195.213.72.255 be -195.213.73.0 - 195.213.73.127 it -195.213.73.128 - 195.213.73.147 be -195.213.73.148 - 195.213.73.151 es -195.213.73.152 - 195.213.73.155 be -195.213.73.156 - 195.213.73.159 nl -195.213.73.160 - 195.213.73.163 fr -195.213.73.164 - 195.213.73.167 be -195.213.73.168 - 195.213.73.171 gr -195.213.73.172 - 195.213.73.175 cz -195.213.73.176 - 195.213.73.179 se -195.213.73.180 - 195.213.73.255 be -195.213.74.0 - 195.213.75.255 no -195.213.76.0 - 195.213.76.127 it -195.213.76.128 - 195.213.76.159 fr -195.213.76.160 - 195.213.76.163 dk -195.213.76.164 - 195.213.76.167 no -195.213.76.168 - 195.213.76.175 be -195.213.76.176 - 195.213.76.183 nl -195.213.76.184 - 195.213.76.207 be -195.213.76.208 - 195.213.76.223 gb -195.213.76.224 - 195.213.76.255 be -195.213.77.0 - 195.213.77.63 gb -195.213.77.64 - 195.213.77.79 be -195.213.77.80 - 195.213.77.95 it -195.213.77.96 - 195.213.77.111 gb -195.213.77.112 - 195.213.77.255 be -195.213.78.0 - 195.213.78.255 gb -195.213.79.0 - 195.213.79.31 lu -195.213.79.32 - 195.213.79.63 de -195.213.79.64 - 195.213.79.95 il -195.213.79.96 - 195.213.79.191 be -195.213.79.192 - 195.213.79.223 gb -195.213.79.224 - 195.213.79.227 it -195.213.79.228 - 195.213.79.231 gb -195.213.79.232 - 195.213.79.235 de -195.213.79.236 - 195.213.79.239 at -195.213.79.240 - 195.213.79.243 be -195.213.79.244 - 195.213.79.247 il -195.213.79.248 - 195.213.79.255 be -195.213.80.0 - 195.213.80.191 dk -195.213.80.192 - 195.213.80.223 es -195.213.80.224 - 195.213.80.255 gb -195.213.81.0 - 195.213.81.63 il -195.213.81.64 - 195.213.81.103 gb -195.213.81.104 - 195.213.81.111 be -195.213.81.112 - 195.213.81.119 dk -195.213.81.120 - 195.213.81.127 gb -195.213.81.128 - 195.213.81.143 dk -195.213.81.144 - 195.213.81.151 ch -195.213.81.152 - 195.213.81.159 be -195.213.81.160 - 195.213.81.191 de -195.213.81.192 - 195.213.81.207 gb -195.213.81.208 - 195.213.82.255 be -195.213.83.0 - 195.213.83.63 ru -195.213.83.64 - 195.213.83.79 fr -195.213.83.80 - 195.213.83.95 be -195.213.83.96 - 195.213.83.127 se -195.213.83.128 - 195.213.83.191 de -195.213.83.192 - 195.213.83.223 it -195.213.83.224 - 195.213.83.255 lu -195.213.84.0 - 195.213.84.127 nl -195.213.84.128 - 195.213.84.255 lu -195.213.85.0 - 195.213.85.127 nl -195.213.85.128 - 195.213.85.135 de -195.213.85.136 - 195.213.85.139 lu -195.213.85.140 - 195.213.85.159 be -195.213.85.160 - 195.213.85.191 lu -195.213.85.192 - 195.213.85.223 no -195.213.85.224 - 195.213.85.239 fi -195.213.85.240 - 195.213.85.247 ch -195.213.85.248 - 195.213.85.251 be -195.213.85.252 - 195.213.86.15 gb -195.213.86.16 - 195.213.86.23 lu -195.213.86.24 - 195.213.86.31 be -195.213.86.32 - 195.213.86.47 gb -195.213.86.48 - 195.213.86.63 lu -195.213.86.64 - 195.213.86.71 be -195.213.86.72 - 195.213.86.79 at -195.213.86.80 - 195.213.86.95 be -195.213.86.96 - 195.213.86.127 dk -195.213.86.128 - 195.213.87.63 be -195.213.87.64 - 195.213.87.127 lu -195.213.87.128 - 195.213.87.159 be -195.213.87.160 - 195.213.87.191 de -195.213.87.192 - 195.213.87.195 it -195.213.87.196 - 195.213.87.199 fr -195.213.87.200 - 195.213.87.203 ie -195.213.87.204 - 195.213.87.207 be -195.213.87.208 - 195.213.87.223 cz -195.213.87.224 - 195.213.87.255 be -195.213.88.0 - 195.213.88.31 ch -195.213.88.32 - 195.213.88.63 be -195.213.88.64 - 195.213.88.255 es -195.213.89.0 - 195.213.89.255 nl -195.213.90.0 - 195.213.90.255 be -195.213.91.0 - 195.213.91.127 ie -195.213.91.128 - 195.213.91.255 gb -195.213.92.0 - 195.213.92.127 it -195.213.92.128 - 195.213.92.191 gb -195.213.92.192 - 195.213.92.255 za -195.213.93.0 - 195.213.93.7 gb -195.213.93.8 - 195.213.93.11 it -195.213.93.12 - 195.213.93.15 be -195.213.93.16 - 195.213.93.31 il -195.213.93.32 - 195.213.93.63 za -195.213.93.64 - 195.213.93.95 fi -195.213.93.96 - 195.213.93.111 ch -195.213.93.112 - 195.213.93.119 ie -195.213.93.120 - 195.213.93.123 be -195.213.93.124 - 195.213.93.127 za -195.213.93.128 - 195.213.93.255 cz -195.213.94.0 - 195.213.94.63 pt -195.213.94.64 - 195.213.94.71 za -195.213.94.72 - 195.213.94.95 be -195.213.94.96 - 195.213.94.127 de -195.213.94.128 - 195.213.94.255 nl -195.213.95.0 - 195.213.95.63 be -195.213.95.64 - 195.213.95.127 de -195.213.95.128 - 195.213.95.255 be -195.213.96.0 - 195.213.96.7 fr -195.213.96.8 - 195.213.96.15 be -195.213.96.16 - 195.213.97.255 fr -195.213.98.0 - 195.213.98.15 gb -195.213.98.16 - 195.213.98.63 fr -195.213.98.64 - 195.213.98.143 gb -195.213.98.144 - 195.213.98.151 bg -195.213.98.152 - 195.213.98.159 be -195.213.98.160 - 195.213.98.175 fr -195.213.98.176 - 195.213.98.191 be -195.213.98.192 - 195.213.98.223 gb -195.213.98.224 - 195.213.98.255 be -195.213.99.0 - 195.213.99.31 es -195.213.99.32 - 195.213.99.63 fr -195.213.99.64 - 195.213.99.127 be -195.213.99.128 - 195.213.99.255 fr -195.213.100.0 - 195.213.100.31 gb -195.213.100.32 - 195.213.100.63 fr -195.213.100.64 - 195.213.100.191 de -195.213.100.192 - 195.213.100.255 fr -195.213.101.0 - 195.213.101.255 be -195.213.102.0 - 195.213.102.255 gb -195.213.103.0 - 195.213.103.255 za -195.213.104.0 - 195.213.104.255 it -195.213.105.0 - 195.213.105.255 nl -195.213.106.0 - 195.213.106.255 se -195.213.107.0 - 195.213.107.63 at -195.213.107.64 - 195.213.107.79 fr -195.213.107.80 - 195.213.107.95 be -195.213.107.96 - 195.213.107.111 it -195.213.107.112 - 195.213.107.115 es -195.213.107.116 - 195.213.107.119 be -195.213.107.120 - 195.213.107.127 fr -195.213.107.128 - 195.213.107.191 nl -195.213.107.192 - 195.213.107.255 fr -195.213.108.0 - 195.213.108.255 be -195.213.109.0 - 195.213.109.63 il -195.213.109.64 - 195.213.109.127 de -195.213.109.128 - 195.213.109.143 es -195.213.109.144 - 195.213.109.159 nl -195.213.109.160 - 195.213.109.191 be -195.213.109.192 - 195.213.110.31 fr -195.213.110.32 - 195.213.110.63 es -195.213.110.64 - 195.213.110.191 fr -195.213.110.192 - 195.213.110.255 be -195.213.111.0 - 195.213.111.255 fr -195.213.112.0 - 195.213.112.255 gb -195.213.113.0 - 195.213.113.127 be -195.213.113.128 - 195.213.113.163 gb -195.213.113.164 - 195.213.113.255 be -195.213.114.0 - 195.213.114.255 se -195.213.115.0 - 195.213.115.255 fi -195.213.116.0 - 195.213.116.15 it -195.213.116.16 - 195.213.116.23 be -195.213.116.24 - 195.213.116.31 it -195.213.116.32 - 195.213.116.79 es -195.213.116.80 - 195.213.116.87 it -195.213.116.88 - 195.213.116.127 es -195.213.116.128 - 195.213.116.255 at -195.213.117.0 - 195.213.117.127 za -195.213.117.128 - 195.213.117.255 fr -195.213.118.0 - 195.213.118.63 nl -195.213.118.64 - 195.213.118.127 be -195.213.118.128 - 195.213.118.175 fr -195.213.118.176 - 195.213.118.191 se +195.213.67.128 - 195.213.80.223 be +195.213.80.224 - 195.213.80.239 gb +195.213.80.240 - 195.213.111.255 be +195.213.112.0 - 195.213.112.255 eu +195.213.113.0 - 195.213.118.191 be 195.213.118.192 - 195.213.118.255 gb -195.213.119.0 - 195.213.119.255 dk -195.213.120.0 - 195.213.120.15 at -195.213.120.16 - 195.213.120.31 fr -195.213.120.32 - 195.213.120.63 at -195.213.120.64 - 195.213.120.127 au -195.213.120.128 - 195.213.120.159 ru -195.213.120.160 - 195.213.120.191 lu -195.213.120.192 - 195.213.120.255 se -195.213.121.0 - 195.213.121.255 lu -195.213.122.0 - 195.213.122.255 nl -195.213.123.0 - 195.213.123.127 es -195.213.123.128 - 195.213.123.255 be -195.213.124.0 - 195.213.124.255 fr -195.213.125.0 - 195.213.125.255 de -195.213.126.0 - 195.213.126.63 fr -195.213.126.64 - 195.213.126.95 li -195.213.126.96 - 195.213.126.103 be -195.213.126.104 - 195.213.126.111 li -195.213.126.112 - 195.213.126.191 gb -195.213.126.192 - 195.213.126.223 be -195.213.126.224 - 195.213.126.255 lu -195.213.127.0 - 195.213.127.31 it -195.213.127.32 - 195.213.127.39 gb -195.213.127.40 - 195.213.127.47 il -195.213.127.48 - 195.213.127.159 it -195.213.127.160 - 195.213.127.223 fr -195.213.127.224 - 195.213.127.239 pt -195.213.127.240 - 195.213.127.255 fr -195.213.128.0 - 195.213.128.127 de -195.213.128.128 - 195.213.128.159 be -195.213.128.160 - 195.213.128.191 ch -195.213.128.192 - 195.213.128.223 de -195.213.128.224 - 195.213.128.255 gb -195.213.129.0 - 195.213.130.127 de -195.213.130.128 - 195.213.130.151 be -195.213.130.152 - 195.213.130.159 gb -195.213.130.160 - 195.213.130.167 se -195.213.130.168 - 195.213.130.199 be -195.213.130.200 - 195.213.130.207 fi -195.213.130.208 - 195.213.130.223 de -195.213.130.224 - 195.213.130.255 lu -195.213.131.0 - 195.213.131.47 de -195.213.131.48 - 195.213.131.63 dk -195.213.131.64 - 195.213.131.127 de -195.213.131.128 - 195.213.132.255 be +195.213.119.0 - 195.213.132.255 be 195.213.133.0 - 195.213.133.127 gb -195.213.133.128 - 195.213.133.191 de -195.213.133.192 - 195.213.133.255 it -195.213.134.0 - 195.213.134.255 fr -195.213.135.0 - 195.213.135.95 it -195.213.135.96 - 195.213.135.127 nl -195.213.135.128 - 195.213.135.159 be -195.213.135.160 - 195.213.135.191 ch -195.213.135.192 - 195.213.135.223 de -195.213.135.224 - 195.213.135.255 be -195.213.136.0 - 195.213.136.255 de -195.213.137.0 - 195.213.137.31 be -195.213.137.32 - 195.213.137.63 de -195.213.137.64 - 195.213.137.127 dk -195.213.137.128 - 195.213.137.191 be -195.213.137.192 - 195.213.137.255 de -195.213.138.0 - 195.213.138.31 gb -195.213.138.32 - 195.213.138.63 fr -195.213.138.64 - 195.213.138.191 gb -195.213.138.192 - 195.213.138.223 ru -195.213.138.224 - 195.213.139.255 be -195.213.140.0 - 195.213.140.63 de -195.213.140.64 - 195.213.140.127 za -195.213.140.128 - 195.213.140.159 cz -195.213.140.160 - 195.213.140.191 hu -195.213.140.192 - 195.213.140.255 gb -195.213.141.0 - 195.213.141.127 de +195.213.133.128 - 195.213.141.127 be 195.213.141.128 - 195.213.141.255 gb -195.213.142.0 - 195.213.143.31 de -195.213.143.32 - 195.213.143.63 be -195.213.143.64 - 195.213.143.127 fr -195.213.143.128 - 195.213.143.143 be -195.213.143.144 - 195.213.143.159 eg -195.213.143.160 - 195.213.143.191 be -195.213.143.192 - 195.213.143.255 it -195.213.144.0 - 195.213.144.63 de -195.213.144.64 - 195.213.144.95 be -195.213.144.96 - 195.213.144.111 pl -195.213.144.112 - 195.213.146.63 de -195.213.146.64 - 195.213.146.95 ch -195.213.146.96 - 195.213.146.103 gb -195.213.146.104 - 195.213.146.111 za -195.213.146.112 - 195.213.146.127 fr -195.213.146.128 - 195.213.146.191 be -195.213.146.192 - 195.213.146.223 za -195.213.146.224 - 195.213.146.255 de -195.213.147.0 - 195.213.147.127 ch -195.213.147.128 - 195.213.147.207 de -195.213.147.208 - 195.213.147.223 be -195.213.147.224 - 195.213.147.255 gb -195.213.148.0 - 195.213.148.255 at -195.213.149.0 - 195.213.149.255 be -195.213.150.0 - 195.213.150.15 de -195.213.150.16 - 195.213.150.31 be -195.213.150.32 - 195.213.150.63 fr -195.213.150.64 - 195.213.150.127 be -195.213.150.128 - 195.213.150.255 ch -195.213.151.0 - 195.213.151.255 lu -195.213.152.0 - 195.213.152.31 at -195.213.152.32 - 195.213.152.63 nl -195.213.152.64 - 195.213.152.127 fr -195.213.152.128 - 195.213.152.255 il -195.213.153.0 - 195.213.153.255 be -195.213.154.0 - 195.213.154.255 lu -195.213.155.0 - 195.213.155.255 it -195.213.156.0 - 195.213.156.255 be -195.213.157.0 - 195.213.157.255 de -195.213.158.0 - 195.213.158.31 ch -195.213.158.32 - 195.213.158.39 be -195.213.158.40 - 195.213.158.43 nl -195.213.158.44 - 195.213.158.63 be -195.213.158.64 - 195.213.158.127 de -195.213.158.128 - 195.213.158.255 be -195.213.159.0 - 195.213.159.63 gb -195.213.159.64 - 195.213.159.127 nl -195.213.159.128 - 195.213.159.255 de -195.213.160.0 - 195.213.160.115 nl -195.213.160.116 - 195.213.160.127 be -195.213.160.128 - 195.213.161.15 nl -195.213.161.16 - 195.213.161.31 fi -195.213.161.32 - 195.213.161.71 nl -195.213.161.72 - 195.213.161.75 se -195.213.161.76 - 195.213.161.79 be -195.213.161.80 - 195.213.161.95 nl -195.213.161.96 - 195.213.161.127 be -195.213.161.128 - 195.213.162.31 nl -195.213.162.32 - 195.213.162.63 no -195.213.162.64 - 195.213.162.127 se -195.213.162.128 - 195.213.162.151 ch -195.213.162.152 - 195.213.162.159 cz -195.213.162.160 - 195.213.162.191 fr -195.213.162.192 - 195.213.162.255 de -195.213.163.0 - 195.213.163.255 nl -195.213.164.0 - 195.213.164.191 be -195.213.164.192 - 195.213.165.63 nl -195.213.165.64 - 195.213.165.127 be -195.213.165.128 - 195.213.165.255 it -195.213.166.0 - 195.213.166.255 gb -195.213.167.0 - 195.213.167.127 be -195.213.167.128 - 195.213.167.191 nl -195.213.167.192 - 195.213.167.255 be -195.213.168.0 - 195.213.169.255 se -195.213.170.0 - 195.213.170.31 ie -195.213.170.32 - 195.213.170.63 ch -195.213.170.64 - 195.213.170.79 be -195.213.170.80 - 195.213.170.95 se -195.213.170.96 - 195.213.170.111 nl -195.213.170.112 - 195.213.170.127 se -195.213.170.128 - 195.213.170.255 no -195.213.171.0 - 195.213.172.31 se -195.213.172.32 - 195.213.172.63 es -195.213.172.64 - 195.213.172.127 se -195.213.172.128 - 195.213.172.159 li -195.213.172.160 - 195.213.172.191 ch -195.213.172.192 - 195.213.172.255 be -195.213.173.0 - 195.213.173.255 de -195.213.174.0 - 195.213.175.127 se -195.213.175.128 - 195.213.175.255 no -195.213.176.0 - 195.213.176.63 gb -195.213.176.64 - 195.213.176.127 pl -195.213.176.128 - 195.213.176.255 dk -195.213.177.0 - 195.213.177.19 no -195.213.177.20 - 195.213.177.23 de -195.213.177.24 - 195.213.177.47 be -195.213.177.48 - 195.213.177.63 no -195.213.177.64 - 195.213.177.127 be -195.213.177.128 - 195.213.177.191 no -195.213.177.192 - 195.213.178.63 be -195.213.178.64 - 195.213.178.95 ch -195.213.178.96 - 195.213.178.111 no -195.213.178.112 - 195.213.178.127 be -195.213.178.128 - 195.213.178.255 fi -195.213.179.0 - 195.213.179.255 no -195.213.180.0 - 195.213.181.127 fi -195.213.181.128 - 195.213.181.159 nl -195.213.181.160 - 195.213.181.191 be -195.213.181.192 - 195.213.181.255 it -195.213.182.0 - 195.213.182.31 fi -195.213.182.32 - 195.213.182.63 be -195.213.182.64 - 195.213.182.95 de -195.213.182.96 - 195.213.182.111 fi -195.213.182.112 - 195.213.182.119 be -195.213.182.120 - 195.213.182.127 gb -195.213.182.128 - 195.213.182.255 se -195.213.183.0 - 195.213.183.255 fi -195.213.184.0 - 195.213.184.63 be -195.213.184.64 - 195.213.184.79 nl -195.213.184.80 - 195.213.184.95 be -195.213.184.96 - 195.213.184.127 se -195.213.184.128 - 195.213.184.255 pl -195.213.185.0 - 195.213.185.255 ch -195.213.186.0 - 195.213.186.127 se -195.213.186.128 - 195.213.186.255 fi -195.213.187.0 - 195.213.187.255 gb -195.213.188.0 - 195.213.188.95 ch -195.213.188.96 - 195.213.188.127 no -195.213.188.128 - 195.213.188.255 be -195.213.189.0 - 195.213.189.63 ch -195.213.189.64 - 195.213.189.79 fr -195.213.189.80 - 195.213.189.95 be -195.213.189.96 - 195.213.189.127 se -195.213.189.128 - 195.213.189.255 be -195.213.190.0 - 195.213.190.255 fr -195.213.191.0 - 195.213.191.255 nl -195.213.192.0 - 195.213.193.255 gb -195.213.194.0 - 195.213.194.63 fr -195.213.194.64 - 195.213.194.79 it -195.213.194.80 - 195.213.194.95 be -195.213.194.96 - 195.213.194.127 ch -195.213.194.128 - 195.213.194.191 fr -195.213.194.192 - 195.213.194.255 be -195.213.195.0 - 195.213.196.31 ru -195.213.196.32 - 195.213.196.47 se -195.213.196.48 - 195.213.196.63 fi -195.213.196.64 - 195.213.196.95 ch -195.213.196.96 - 195.213.196.111 be -195.213.196.112 - 195.213.196.127 ch -195.213.196.128 - 195.213.196.191 nl -195.213.196.192 - 195.213.197.127 be -195.213.197.128 - 195.213.197.255 fr -195.213.198.0 - 195.213.198.255 gb -195.213.199.0 - 195.213.199.255 pt +195.213.142.0 - 195.213.145.255 be +195.213.146.0 - 195.213.146.63 de +195.213.146.64 - 195.213.174.255 be +195.213.175.0 - 195.213.175.15 se +195.213.175.16 - 195.213.199.255 be 195.213.200.0 - 195.213.203.255 nl -195.213.204.0 - 195.213.204.159 de -195.213.204.160 - 195.213.204.191 ch -195.213.204.192 - 195.213.204.239 be -195.213.204.240 - 195.213.205.255 de -195.213.206.0 - 195.213.207.127 be -195.213.207.128 - 195.213.207.255 gb -195.213.208.0 - 195.213.208.255 de -195.213.209.0 - 195.213.209.255 fi -195.213.210.0 - 195.213.210.127 fr -195.213.210.128 - 195.213.210.159 be -195.213.210.160 - 195.213.210.175 pl -195.213.210.176 - 195.213.210.191 nl -195.213.210.192 - 195.213.211.255 be -195.213.212.0 - 195.213.212.255 se -195.213.213.0 - 195.213.213.255 it -195.213.214.0 - 195.213.214.255 de -195.213.215.0 - 195.213.215.255 fi -195.213.216.0 - 195.213.216.127 fr -195.213.216.128 - 195.213.216.191 se -195.213.216.192 - 195.213.216.223 be -195.213.216.224 - 195.213.216.255 de -195.213.217.0 - 195.213.217.63 be -195.213.217.64 - 195.213.217.127 se -195.213.217.128 - 195.213.217.255 be -195.213.218.0 - 195.213.218.127 de -195.213.218.128 - 195.213.218.239 be -195.213.218.240 - 195.213.218.255 es -195.213.219.0 - 195.213.219.15 ir -195.213.219.16 - 195.213.219.31 es -195.213.219.32 - 195.213.219.95 be -195.213.219.96 - 195.213.219.127 ch -195.213.219.128 - 195.213.219.255 fr -195.213.220.0 - 195.213.220.255 dk -195.213.221.0 - 195.213.221.255 it -195.213.222.0 - 195.213.222.255 se -195.213.223.0 - 195.213.223.159 be -195.213.223.160 - 195.213.223.191 ch -195.213.223.192 - 195.213.223.255 fr -195.213.224.0 - 195.213.224.255 nl -195.213.225.0 - 195.213.225.63 il -195.213.225.64 - 195.213.225.255 be -195.213.226.0 - 195.213.226.255 ru -195.213.227.0 - 195.213.227.255 il -195.213.228.0 - 195.213.228.255 gb -195.213.229.0 - 195.213.229.255 eu -195.213.230.0 - 195.213.230.255 es -195.213.231.0 - 195.213.231.255 il -195.213.232.0 - 195.213.232.255 be -195.213.233.0 - 195.213.233.63 dk -195.213.233.64 - 195.213.233.127 be -195.213.233.128 - 195.213.233.191 fr -195.213.233.192 - 195.213.233.223 be -195.213.233.224 - 195.213.233.255 dk -195.213.234.0 - 195.213.234.255 be -195.213.235.0 - 195.213.235.255 cz -195.213.236.0 - 195.213.236.255 hu -195.213.237.0 - 195.213.237.255 be -195.213.238.0 - 195.213.238.255 za -195.213.239.0 - 195.213.239.127 it -195.213.239.128 - 195.213.240.255 be +195.213.204.0 - 195.213.240.255 be 195.213.241.0 - 195.213.241.127 it -195.213.241.128 - 195.213.241.255 de -195.213.242.0 - 195.213.242.127 be -195.213.242.128 - 195.213.242.191 fr -195.213.242.192 - 195.213.242.255 be -195.213.243.0 - 195.213.243.255 de -195.213.244.0 - 195.213.244.255 be -195.213.245.0 - 195.213.246.255 es -195.213.247.0 - 195.213.247.255 fr -195.213.248.0 - 195.213.248.255 us -195.213.249.0 - 195.213.249.255 hu +195.213.241.128 - 195.213.249.255 be 195.213.250.0 - 195.213.250.127 de -195.213.250.128 - 195.213.250.255 be -195.213.251.0 - 195.213.251.3 nl -195.213.251.4 - 195.213.251.107 be -195.213.251.108 - 195.213.251.111 se -195.213.251.112 - 195.213.251.255 be -195.213.252.0 - 195.213.252.31 se -195.213.252.32 - 195.213.252.47 pl -195.213.252.48 - 195.213.252.127 be -195.213.252.128 - 195.213.252.255 za -195.213.253.0 - 195.213.254.191 be -195.213.254.192 - 195.213.254.255 at -195.213.255.0 - 195.213.255.31 fr -195.213.255.32 - 195.213.255.47 gb -195.213.255.48 - 195.213.255.127 fr -195.213.255.128 - 195.213.255.191 lv -195.213.255.192 - 195.213.255.255 fr -195.214.0.0 - 195.214.51.255 de -195.214.52.0 - 195.214.52.31 cz -195.214.52.32 - 195.214.52.39 us -195.214.52.40 - 195.214.52.127 de -195.214.52.128 - 195.214.53.31 us -195.214.53.32 - 195.214.55.255 de -195.214.56.0 - 195.214.56.31 us -195.214.56.32 - 195.214.56.63 de -195.214.56.64 - 195.214.56.95 us -195.214.56.96 - 195.214.56.127 de -195.214.56.128 - 195.214.56.159 us -195.214.56.160 - 195.214.56.191 de -195.214.56.192 - 195.214.56.223 fr -195.214.56.224 - 195.214.59.255 de -195.214.60.0 - 195.214.60.31 us -195.214.60.32 - 195.214.95.255 de +195.213.250.128 - 195.213.255.255 be +195.214.0.0 - 195.214.95.255 de 195.214.96.0 - 195.214.127.255 gb 195.214.128.0 - 195.214.191.255 tr 195.214.192.0 - 195.214.199.255 ua @@ -116271,16 +92676,12 @@ 195.214.236.0 - 195.214.239.255 ua 195.214.240.0 - 195.214.247.255 fr 195.214.248.0 - 195.214.255.255 bg -195.215.0.0 - 195.215.255.255 dk +195.215.0.0 - 195.215.31.103 dk +195.215.31.104 - 195.215.31.104 us +195.215.31.105 - 195.215.255.255 dk 195.216.0.0 - 195.216.31.255 gb 195.216.32.0 - 195.216.63.255 se -195.216.64.0 - 195.216.82.255 ch -195.216.83.0 - 195.216.83.15 gb -195.216.83.16 - 195.216.83.191 ch -195.216.83.192 - 195.216.83.207 li -195.216.83.208 - 195.216.83.255 ch -195.216.84.0 - 195.216.84.255 li -195.216.85.0 - 195.216.95.255 ch +195.216.64.0 - 195.216.95.255 ch 195.216.96.0 - 195.216.127.255 pl 195.216.128.0 - 195.216.159.255 it 195.216.160.0 - 195.216.191.255 lv @@ -116288,9 +92689,8 @@ 195.216.194.0 - 195.216.195.255 ru 195.216.196.0 - 195.216.197.255 gb 195.216.198.0 - 195.216.199.255 de -195.216.200.0 - 195.216.203.255 ru +195.216.200.0 - 195.216.201.255 ru 195.216.204.0 - 195.216.207.255 ua -195.216.208.0 - 195.216.209.255 de 195.216.210.0 - 195.216.213.255 ua 195.216.214.0 - 195.216.215.255 fr 195.216.216.0 - 195.216.217.255 ru @@ -116308,20 +92708,15 @@ 195.216.231.0 - 195.216.231.255 se 195.216.232.0 - 195.216.232.255 tr 195.216.233.0 - 195.216.233.255 lt -195.216.234.0 - 195.216.234.255 mt 195.216.235.0 - 195.216.235.255 de 195.216.236.0 - 195.216.236.255 lv 195.216.237.0 - 195.216.237.255 kg -195.216.238.0 - 195.216.238.255 ru 195.216.239.0 - 195.216.239.255 ro 195.216.240.0 - 195.216.240.255 cz 195.216.241.0 - 195.216.241.255 ru 195.216.242.0 - 195.216.242.255 fr -195.216.243.0 - 195.216.243.255 gb -195.216.244.0 - 195.216.244.255 ru -195.216.245.0 - 195.216.245.255 ng +195.216.243.0 - 195.216.244.255 ru 195.216.246.0 - 195.216.246.255 nl -195.216.247.0 - 195.216.247.255 ro 195.216.248.0 - 195.216.248.255 ua 195.216.249.0 - 195.216.249.255 fr 195.216.250.0 - 195.216.250.255 pl @@ -116336,244 +92731,101 @@ 195.218.64.0 - 195.218.95.255 fi 195.218.96.0 - 195.218.127.255 ie 195.218.128.0 - 195.218.255.255 ru -195.219.0.0 - 195.219.2.255 gb -195.219.3.0 - 195.219.3.31 es -195.219.3.32 - 195.219.3.63 gb +195.219.0.0 - 195.219.3.63 eu 195.219.3.64 - 195.219.3.127 es -195.219.3.128 - 195.219.3.135 it -195.219.3.136 - 195.219.3.159 gb -195.219.3.160 - 195.219.3.191 ng -195.219.3.192 - 195.219.3.255 es -195.219.4.0 - 195.219.7.255 gb -195.219.8.0 - 195.219.11.255 eu -195.219.12.0 - 195.219.13.255 gb -195.219.14.0 - 195.219.14.127 es -195.219.14.128 - 195.219.14.191 gb -195.219.14.192 - 195.219.14.255 es -195.219.15.0 - 195.219.15.255 gb -195.219.16.0 - 195.219.23.255 eu -195.219.24.0 - 195.219.24.255 gb +195.219.3.128 - 195.219.7.255 eu +195.219.8.0 - 195.219.11.255 gb +195.219.12.0 - 195.219.16.47 eu +195.219.16.48 - 195.219.16.55 ie +195.219.16.56 - 195.219.16.103 gb +195.219.16.104 - 195.219.16.111 fi +195.219.16.112 - 195.219.17.47 gb +195.219.17.48 - 195.219.17.63 eu +195.219.17.64 - 195.219.17.95 gb +195.219.17.96 - 195.219.24.255 eu 195.219.25.0 - 195.219.25.255 at -195.219.26.0 - 195.219.26.255 fr -195.219.27.0 - 195.219.27.255 ye -195.219.28.0 - 195.219.28.31 bh -195.219.28.32 - 195.219.28.39 de -195.219.28.40 - 195.219.28.47 cy -195.219.28.48 - 195.219.28.63 es -195.219.28.64 - 195.219.28.159 gb -195.219.28.160 - 195.219.28.255 eu -195.219.29.0 - 195.219.29.255 gb -195.219.30.0 - 195.219.30.255 es -195.219.31.0 - 195.219.31.255 ye -195.219.32.0 - 195.219.35.255 eu -195.219.36.0 - 195.219.36.255 se -195.219.37.0 - 195.219.37.255 ye -195.219.38.0 - 195.219.38.255 gb -195.219.39.0 - 195.219.39.255 ua +195.219.26.0 - 195.219.31.255 eu +195.219.32.0 - 195.219.33.255 gb +195.219.34.0 - 195.219.39.255 eu 195.219.40.0 - 195.219.47.255 qa -195.219.48.0 - 195.219.48.31 cz -195.219.48.32 - 195.219.49.63 gb -195.219.49.64 - 195.219.49.127 fr -195.219.49.128 - 195.219.49.135 gb -195.219.49.136 - 195.219.49.143 ru -195.219.49.144 - 195.219.49.159 de -195.219.49.160 - 195.219.49.191 es -195.219.49.192 - 195.219.49.255 ru -195.219.50.0 - 195.219.50.255 de -195.219.51.0 - 195.219.51.255 gb -195.219.52.0 - 195.219.53.255 kw -195.219.54.0 - 195.219.58.63 es -195.219.58.64 - 195.219.58.79 de -195.219.58.80 - 195.219.58.127 gb -195.219.58.128 - 195.219.59.255 es -195.219.60.0 - 195.219.63.255 eu -195.219.64.0 - 195.219.64.255 nl -195.219.65.0 - 195.219.65.255 ye -195.219.66.0 - 195.219.66.7 gb -195.219.66.8 - 195.219.66.15 es -195.219.66.16 - 195.219.66.31 gb +195.219.48.0 - 195.219.48.255 eu +195.219.49.0 - 195.219.49.255 fr +195.219.50.0 - 195.219.60.47 eu +195.219.60.48 - 195.219.60.55 ch +195.219.60.56 - 195.219.60.63 fi +195.219.60.64 - 195.219.60.79 de +195.219.60.80 - 195.219.60.83 it +195.219.60.84 - 195.219.60.87 at +195.219.60.88 - 195.219.60.91 ch +195.219.60.92 - 195.219.60.95 pl +195.219.60.96 - 195.219.60.127 de +195.219.60.128 - 195.219.60.131 fr +195.219.60.132 - 195.219.60.135 cz +195.219.60.136 - 195.219.60.143 ru +195.219.60.144 - 195.219.60.191 de +195.219.60.192 - 195.219.61.43 eu +195.219.61.44 - 195.219.61.51 ch +195.219.61.52 - 195.219.66.31 eu 195.219.66.32 - 195.219.66.63 ch -195.219.66.64 - 195.219.66.127 gb -195.219.66.128 - 195.219.66.191 eu -195.219.66.192 - 195.219.66.223 fr -195.219.66.224 - 195.219.66.231 us -195.219.66.232 - 195.219.67.31 gb -195.219.67.32 - 195.219.67.63 in -195.219.67.64 - 195.219.67.127 eu -195.219.67.128 - 195.219.67.255 gb -195.219.68.0 - 195.219.69.255 de -195.219.70.0 - 195.219.70.255 gb -195.219.71.0 - 195.219.71.255 ir -195.219.72.0 - 195.219.72.15 gb -195.219.72.16 - 195.219.72.127 eu -195.219.72.128 - 195.219.72.255 es -195.219.73.0 - 195.219.73.15 pl -195.219.73.16 - 195.219.73.31 gb -195.219.73.32 - 195.219.73.63 de -195.219.73.64 - 195.219.73.79 gb -195.219.73.80 - 195.219.73.95 de -195.219.73.96 - 195.219.73.143 gb -195.219.73.144 - 195.219.73.255 eu -195.219.74.0 - 195.219.75.255 es -195.219.76.0 - 195.219.79.255 eu -195.219.80.0 - 195.219.82.63 gb -195.219.82.64 - 195.219.82.79 es -195.219.82.80 - 195.219.82.127 gb -195.219.82.128 - 195.219.82.135 be -195.219.82.136 - 195.219.82.143 gb -195.219.82.144 - 195.219.82.159 es -195.219.82.160 - 195.219.82.175 nl -195.219.82.176 - 195.219.82.183 be -195.219.82.184 - 195.219.82.191 de -195.219.82.192 - 195.219.83.255 gb -195.219.84.0 - 195.219.87.255 eu -195.219.88.0 - 195.219.88.255 nl -195.219.89.0 - 195.219.90.255 gb -195.219.91.0 - 195.219.91.255 es -195.219.92.0 - 195.219.92.255 de -195.219.93.0 - 195.219.93.255 es -195.219.94.0 - 195.219.95.255 de -195.219.96.0 - 195.219.97.255 gb -195.219.98.0 - 195.219.98.255 es -195.219.99.0 - 195.219.101.255 gb -195.219.102.0 - 195.219.111.255 eu -195.219.112.0 - 195.219.112.255 es -195.219.113.0 - 195.219.113.15 gb -195.219.113.16 - 195.219.113.127 eu -195.219.113.128 - 195.219.113.175 gb -195.219.113.176 - 195.219.113.191 fr -195.219.113.192 - 195.219.113.199 ng -195.219.113.200 - 195.219.113.207 es -195.219.113.208 - 195.219.113.223 gb -195.219.113.224 - 195.219.113.255 de -195.219.114.0 - 195.219.114.255 es -195.219.115.0 - 195.219.115.7 ng -195.219.115.8 - 195.219.115.15 nl -195.219.115.16 - 195.219.115.31 us -195.219.115.32 - 195.219.115.127 es -195.219.115.128 - 195.219.115.143 eu -195.219.115.144 - 195.219.115.159 fr -195.219.115.160 - 195.219.115.255 eu -195.219.116.0 - 195.219.117.255 es -195.219.118.0 - 195.219.118.15 eu -195.219.118.16 - 195.219.118.23 gb -195.219.118.24 - 195.219.119.255 eu -195.219.120.0 - 195.219.120.255 es -195.219.121.0 - 195.219.123.255 gb -195.219.124.0 - 195.219.128.15 eu -195.219.128.16 - 195.219.128.31 nl -195.219.128.32 - 195.219.129.127 eu -195.219.129.128 - 195.219.129.255 ir -195.219.130.0 - 195.219.130.255 es -195.219.131.0 - 195.219.131.255 se -195.219.132.0 - 195.219.132.255 es -195.219.133.0 - 195.219.133.15 gb -195.219.133.16 - 195.219.133.23 es -195.219.133.24 - 195.219.133.31 de -195.219.133.32 - 195.219.133.95 gb -195.219.133.96 - 195.219.133.127 ng -195.219.133.128 - 195.219.133.255 gb -195.219.134.0 - 195.219.135.255 eu -195.219.136.0 - 195.219.137.255 us -195.219.138.0 - 195.219.139.255 dk -195.219.140.0 - 195.219.140.255 es -195.219.141.0 - 195.219.141.15 eu -195.219.141.16 - 195.219.141.31 gb -195.219.141.32 - 195.219.141.63 eu -195.219.141.64 - 195.219.141.95 fr -195.219.141.96 - 195.219.141.143 gb -195.219.141.144 - 195.219.141.255 eu -195.219.142.0 - 195.219.142.255 gb -195.219.143.0 - 195.219.143.255 es -195.219.144.0 - 195.219.145.255 gb -195.219.146.0 - 195.219.147.255 eu -195.219.148.0 - 195.219.148.255 de -195.219.149.0 - 195.219.149.255 es -195.219.150.0 - 195.219.150.255 nl -195.219.151.0 - 195.219.152.255 gb -195.219.153.0 - 195.219.153.255 sa -195.219.154.0 - 195.219.154.255 ng -195.219.155.0 - 195.219.155.255 es -195.219.156.0 - 195.219.156.255 de -195.219.157.0 - 195.219.157.127 es -195.219.157.128 - 195.219.157.159 eu +195.219.66.64 - 195.219.66.191 eu +195.219.66.192 - 195.219.66.223 de +195.219.66.224 - 195.219.73.111 eu +195.219.73.112 - 195.219.73.119 gb +195.219.73.120 - 195.219.76.255 eu +195.219.77.0 - 195.219.77.15 de +195.219.77.16 - 195.219.86.7 eu +195.219.86.8 - 195.219.86.31 de +195.219.86.32 - 195.219.102.255 eu +195.219.103.0 - 195.219.103.255 gb +195.219.104.0 - 195.219.104.7 eu +195.219.104.8 - 195.219.104.19 fr +195.219.104.20 - 195.219.104.23 eu +195.219.104.24 - 195.219.104.31 fr +195.219.104.32 - 195.219.115.191 eu +195.219.115.192 - 195.219.115.231 gb +195.219.115.232 - 195.219.115.239 eu +195.219.115.240 - 195.219.115.247 gb +195.219.115.248 - 195.219.118.31 eu +195.219.118.32 - 195.219.118.47 gb +195.219.118.48 - 195.219.118.127 eu +195.219.118.128 - 195.219.118.255 gb +195.219.119.0 - 195.219.121.255 eu +195.219.122.0 - 195.219.122.31 it +195.219.122.32 - 195.219.123.255 eu +195.219.124.0 - 195.219.124.255 es +195.219.125.0 - 195.219.133.255 eu +195.219.134.0 - 195.219.134.255 ch +195.219.135.0 - 195.219.146.255 eu +195.219.147.0 - 195.219.147.15 nl +195.219.147.16 - 195.219.156.163 eu +195.219.156.164 - 195.219.156.167 ch +195.219.156.168 - 195.219.157.159 eu 195.219.157.160 - 195.219.157.191 es -195.219.157.192 - 195.219.157.223 gb -195.219.157.224 - 195.219.157.255 eu -195.219.158.0 - 195.219.159.255 es -195.219.160.0 - 195.219.160.255 gb -195.219.161.0 - 195.219.161.63 us -195.219.161.64 - 195.219.161.95 gb -195.219.161.96 - 195.219.161.223 eu -195.219.161.224 - 195.219.161.255 gb -195.219.162.0 - 195.219.162.255 nl -195.219.163.0 - 195.219.163.255 it -195.219.164.0 - 195.219.164.31 gb -195.219.164.32 - 195.219.164.127 eu -195.219.164.128 - 195.219.164.159 gb +195.219.157.192 - 195.219.158.255 eu +195.219.159.0 - 195.219.159.255 it +195.219.160.0 - 195.219.164.159 eu 195.219.164.160 - 195.219.164.191 es -195.219.164.192 - 195.219.164.207 gb -195.219.164.208 - 195.219.164.255 eu -195.219.165.0 - 195.219.165.255 gb -195.219.166.0 - 195.219.166.255 it -195.219.167.0 - 195.219.167.255 sa -195.219.168.0 - 195.219.171.255 ca -195.219.172.0 - 195.219.179.255 eu -195.219.180.0 - 195.219.180.255 de -195.219.181.0 - 195.219.181.255 es -195.219.182.0 - 195.219.182.255 fr -195.219.183.0 - 195.219.183.255 de -195.219.184.0 - 195.219.184.255 gb -195.219.185.0 - 195.219.187.255 pt -195.219.188.0 - 195.219.188.255 pl -195.219.189.0 - 195.219.189.255 gb -195.219.190.0 - 195.219.191.255 eu -195.219.192.0 - 195.219.192.31 gb -195.219.192.32 - 195.219.192.127 eu -195.219.192.128 - 195.219.192.143 gb -195.219.192.144 - 195.219.192.191 eu -195.219.192.192 - 195.219.192.239 nl -195.219.192.240 - 195.219.193.127 gb -195.219.193.128 - 195.219.193.255 de -195.219.194.0 - 195.219.194.255 nl -195.219.195.0 - 195.219.196.255 gb -195.219.197.0 - 195.219.197.255 es -195.219.198.0 - 195.219.198.255 fr -195.219.199.0 - 195.219.199.255 gb -195.219.200.0 - 195.219.203.255 ca -195.219.204.0 - 195.219.207.255 eu +195.219.164.192 - 195.219.173.255 eu +195.219.174.0 - 195.219.174.255 ae +195.219.175.0 - 195.219.175.255 eu +195.219.176.0 - 195.219.176.7 ro +195.219.176.8 - 195.219.176.15 pl +195.219.176.16 - 195.219.176.255 gb +195.219.177.0 - 195.219.204.255 eu +195.219.205.0 - 195.219.205.7 gb +195.219.205.8 - 195.219.207.255 eu 195.219.208.0 - 195.219.211.255 de -195.219.212.0 - 195.219.213.255 gb -195.219.214.0 - 195.219.215.255 fr -195.219.216.0 - 195.219.223.255 eu -195.219.224.0 - 195.219.224.255 fr -195.219.225.0 - 195.219.225.255 pl -195.219.226.0 - 195.219.226.255 es -195.219.227.0 - 195.219.229.255 be -195.219.230.0 - 195.219.230.255 es -195.219.231.0 - 195.219.231.255 pl -195.219.232.0 - 195.219.240.63 eu -195.219.240.64 - 195.219.240.95 gb -195.219.240.96 - 195.219.240.239 eu -195.219.240.240 - 195.219.240.255 gb -195.219.241.0 - 195.219.241.255 fr -195.219.242.0 - 195.219.242.255 de -195.219.243.0 - 195.219.243.255 gb -195.219.244.0 - 195.219.244.255 es -195.219.245.0 - 195.219.245.255 eu -195.219.246.0 - 195.219.246.255 pl -195.219.247.0 - 195.219.247.255 fr -195.219.248.0 - 195.219.248.103 gb -195.219.248.104 - 195.219.248.255 eu -195.219.249.0 - 195.219.251.7 gb -195.219.251.8 - 195.219.251.31 eu -195.219.251.32 - 195.219.251.63 gb -195.219.251.64 - 195.219.251.255 eu -195.219.252.0 - 195.219.255.255 gb -195.220.0.0 - 195.221.255.255 fr -195.222.0.0 - 195.222.2.63 ee -195.222.2.64 - 195.222.2.67 fi -195.222.2.68 - 195.222.31.255 ee +195.219.212.0 - 195.219.215.255 eu +195.219.216.0 - 195.219.216.135 de +195.219.216.136 - 195.219.216.255 eu +195.219.217.0 - 195.219.219.255 de +195.219.220.0 - 195.219.231.255 eu +195.219.232.0 - 195.219.239.255 gb +195.219.240.0 - 195.219.255.255 eu +195.220.0.0 - 195.220.150.255 fr +195.220.151.0 - 195.220.151.255 re +195.220.152.0 - 195.221.255.255 fr +195.222.0.0 - 195.222.31.255 ee 195.222.32.0 - 195.222.63.255 ba 195.222.64.0 - 195.222.95.255 by 195.222.96.0 - 195.222.99.255 rs @@ -116587,19 +92839,7 @@ 195.222.128.0 - 195.222.191.255 ru 195.222.192.0 - 195.222.255.255 de 195.223.0.0 - 195.223.255.255 it -195.224.0.0 - 195.224.24.255 gb -195.224.25.0 - 195.224.25.255 us -195.224.26.0 - 195.224.33.255 gb -195.224.34.0 - 195.224.34.255 us -195.224.35.0 - 195.224.66.87 gb -195.224.66.88 - 195.224.66.95 nl -195.224.66.96 - 195.224.108.47 gb -195.224.108.48 - 195.224.108.63 nl -195.224.108.64 - 195.224.164.255 gb -195.224.165.0 - 195.224.165.255 us -195.224.166.0 - 195.224.213.95 gb -195.224.213.96 - 195.224.213.111 us -195.224.213.112 - 195.224.255.255 gb +195.224.0.0 - 195.224.255.255 gb 195.225.0.0 - 195.225.31.255 no 195.225.32.0 - 195.225.33.255 ch 195.225.34.0 - 195.225.35.255 nl @@ -116616,8 +92856,7 @@ 195.225.56.0 - 195.225.57.255 ru 195.225.58.0 - 195.225.59.255 ro 195.225.60.0 - 195.225.61.255 ch -195.225.62.0 - 195.225.63.255 a2 -195.225.64.0 - 195.225.67.255 ro +195.225.62.0 - 195.225.63.255 eu 195.225.68.0 - 195.225.71.255 pl 195.225.72.0 - 195.225.75.255 cz 195.225.76.0 - 195.225.79.255 pl @@ -116627,7 +92866,7 @@ 195.225.92.0 - 195.225.95.255 pl 195.225.96.0 - 195.225.103.255 nl 195.225.104.0 - 195.225.107.255 de -195.225.108.0 - 195.225.111.255 ro +195.225.108.0 - 195.225.111.255 ru 195.225.112.0 - 195.225.115.255 ua 195.225.116.0 - 195.225.119.255 ch 195.225.120.0 - 195.225.123.255 pl @@ -116644,7 +92883,6 @@ 195.225.168.0 - 195.225.171.255 it 195.225.172.0 - 195.225.175.255 ua 195.225.176.0 - 195.225.179.255 pa -195.225.180.0 - 195.225.183.255 pl 195.225.184.0 - 195.225.187.255 se 195.225.188.0 - 195.225.191.255 gb 195.225.192.0 - 195.225.195.255 ch @@ -116654,7 +92892,6 @@ 195.225.208.0 - 195.225.211.255 de 195.225.212.0 - 195.225.215.255 pl 195.225.216.0 - 195.225.219.255 gb -195.225.220.0 - 195.225.223.255 pt 195.225.224.0 - 195.225.227.255 it 195.225.228.0 - 195.225.231.255 ua 195.225.232.0 - 195.225.235.255 ru @@ -116664,17 +92901,18 @@ 195.225.252.0 - 195.225.255.255 bg 195.226.0.0 - 195.226.31.255 ch 195.226.32.0 - 195.226.63.255 gb -195.226.64.0 - 195.226.114.167 de -195.226.114.168 - 195.226.114.175 a2 -195.226.114.176 - 195.226.127.255 de -195.226.128.0 - 195.226.159.255 gb +195.226.64.0 - 195.226.127.255 de +195.226.128.0 - 195.226.135.255 gb +195.226.136.0 - 195.226.136.255 gg +195.226.137.0 - 195.226.151.255 gb +195.226.152.0 - 195.226.152.255 gg +195.226.153.0 - 195.226.159.255 gb 195.226.160.0 - 195.226.191.255 de 195.226.192.0 - 195.226.192.255 ua 195.226.193.0 - 195.226.193.255 it 195.226.194.0 - 195.226.194.255 de 195.226.195.0 - 195.226.195.255 at 195.226.196.0 - 195.226.196.255 tr -195.226.197.0 - 195.226.197.255 ua 195.226.198.0 - 195.226.198.255 pl 195.226.199.0 - 195.226.199.255 dk 195.226.200.0 - 195.226.200.255 de @@ -116691,7 +92929,6 @@ 195.226.212.0 - 195.226.212.255 ro 195.226.213.0 - 195.226.213.255 ua 195.226.214.0 - 195.226.214.255 ro -195.226.215.0 - 195.226.215.255 ua 195.226.216.0 - 195.226.216.255 ru 195.226.217.0 - 195.226.217.255 cz 195.226.218.0 - 195.226.218.255 lv @@ -116702,21 +92939,24 @@ 195.226.223.0 - 195.226.223.255 it 195.226.224.0 - 195.226.255.255 kw 195.227.0.0 - 195.227.255.255 de -195.228.0.0 - 195.228.76.255 hu -195.228.77.0 - 195.228.77.255 ro -195.228.78.0 - 195.228.255.255 hu -195.229.0.0 - 195.229.4.255 ae -195.229.5.0 - 195.229.5.127 tz -195.229.5.128 - 195.229.6.255 ae +195.228.0.0 - 195.228.0.255 hu +195.228.1.0 - 195.228.1.255 bg +195.228.2.0 - 195.228.10.255 hu +195.228.11.0 - 195.228.11.255 bg +195.228.12.0 - 195.228.42.255 hu +195.228.43.0 - 195.228.43.255 bg +195.228.44.0 - 195.228.58.255 hu +195.228.59.0 - 195.228.59.255 ro +195.228.60.0 - 195.228.207.255 hu +195.228.208.0 - 195.228.209.255 bg +195.228.210.0 - 195.228.255.255 hu +195.229.0.0 - 195.229.6.255 ae 195.229.7.0 - 195.229.9.255 kw -195.229.10.0 - 195.229.23.255 ae -195.229.24.0 - 195.229.26.255 kw -195.229.27.0 - 195.229.255.255 ae +195.229.10.0 - 195.229.255.255 ae 195.230.0.0 - 195.230.31.255 bg 195.230.32.0 - 195.230.63.255 at 195.230.64.0 - 195.230.95.255 ru 195.230.96.0 - 195.230.96.255 ua -195.230.97.0 - 195.230.97.255 kz 195.230.98.0 - 195.230.98.255 lt 195.230.99.0 - 195.230.99.255 ru 195.230.100.0 - 195.230.100.255 ch @@ -116726,8 +92966,7 @@ 195.230.104.0 - 195.230.104.255 be 195.230.105.0 - 195.230.105.255 es 195.230.106.0 - 195.230.106.255 hu -195.230.107.0 - 195.230.107.255 ru -195.230.108.0 - 195.230.108.255 us +195.230.108.0 - 195.230.108.255 de 195.230.109.0 - 195.230.109.255 ru 195.230.110.0 - 195.230.110.255 nl 195.230.111.0 - 195.230.111.255 ru @@ -116743,64 +92982,21 @@ 195.230.121.0 - 195.230.121.255 si 195.230.122.0 - 195.230.122.255 gb 195.230.123.0 - 195.230.123.255 ru -195.230.124.0 - 195.230.124.255 de +195.230.124.0 - 195.230.124.255 sk 195.230.125.0 - 195.230.125.255 ua 195.230.126.0 - 195.230.126.255 de 195.230.127.0 - 195.230.159.255 ua 195.230.160.0 - 195.230.191.255 at -195.230.192.0 - 195.230.200.31 it -195.230.200.32 - 195.230.200.47 de -195.230.200.48 - 195.230.200.59 it -195.230.200.60 - 195.230.200.63 es -195.230.200.64 - 195.230.200.95 fr -195.230.200.96 - 195.230.200.99 es -195.230.200.100 - 195.230.200.111 it -195.230.200.112 - 195.230.200.127 ch -195.230.200.128 - 195.230.200.143 hk -195.230.200.144 - 195.230.200.151 es -195.230.200.152 - 195.230.200.167 it -195.230.200.168 - 195.230.200.175 de -195.230.200.176 - 195.230.200.215 it -195.230.200.216 - 195.230.200.223 fr -195.230.200.224 - 195.230.203.95 it -195.230.203.96 - 195.230.203.127 ro -195.230.203.128 - 195.230.203.255 it -195.230.204.0 - 195.230.204.255 sm -195.230.205.0 - 195.230.255.255 it +195.230.192.0 - 195.230.255.255 it 195.231.0.0 - 195.231.255.255 dk -195.232.0.0 - 195.232.0.255 de -195.232.1.0 - 195.232.31.255 gb -195.232.32.0 - 195.232.32.255 de -195.232.33.0 - 195.232.47.255 gb +195.232.0.0 - 195.232.47.255 gb 195.232.48.0 - 195.232.63.255 de -195.232.64.0 - 195.232.79.255 fr -195.232.80.0 - 195.232.80.255 gb -195.232.81.0 - 195.232.81.255 de -195.232.82.0 - 195.232.82.71 gb -195.232.82.72 - 195.232.82.79 fr -195.232.82.80 - 195.232.82.111 gb -195.232.82.112 - 195.232.82.119 de -195.232.82.120 - 195.232.86.111 gb -195.232.86.112 - 195.232.86.127 ch -195.232.86.128 - 195.232.86.191 de -195.232.86.192 - 195.232.89.255 gb -195.232.90.0 - 195.232.90.255 ch -195.232.91.0 - 195.232.91.255 de -195.232.92.0 - 195.232.99.255 gb -195.232.100.0 - 195.232.100.255 fr -195.232.101.0 - 195.232.101.255 de -195.232.102.0 - 195.232.103.255 gb -195.232.104.0 - 195.232.104.255 de -195.232.105.0 - 195.232.105.255 fr -195.232.106.0 - 195.232.107.255 gb -195.232.108.0 - 195.232.109.255 de -195.232.110.0 - 195.232.111.255 fr -195.232.112.0 - 195.232.113.255 gb -195.232.114.0 - 195.232.114.255 de -195.232.115.0 - 195.232.117.255 gb -195.232.118.0 - 195.232.118.255 at -195.232.119.0 - 195.232.127.255 gb -195.232.128.0 - 195.233.239.255 de +195.232.64.0 - 195.232.64.255 gb +195.232.65.0 - 195.232.79.255 fr +195.232.80.0 - 195.232.127.255 gb +195.232.128.0 - 195.232.146.255 de +195.232.147.0 - 195.232.147.255 it +195.232.148.0 - 195.233.239.255 de 195.233.240.0 - 195.233.243.255 ie 195.233.244.0 - 195.233.255.255 de 195.234.0.0 - 195.234.1.255 li @@ -116842,41 +93038,35 @@ 195.234.58.0 - 195.234.58.255 at 195.234.59.0 - 195.234.59.255 es 195.234.60.0 - 195.234.60.255 ch -195.234.62.0 - 195.234.62.255 fr -195.234.63.0 - 195.234.63.255 pl +195.234.61.0 - 195.234.61.255 es 195.234.64.0 - 195.234.67.255 ch 195.234.68.0 - 195.234.79.255 ua -195.234.80.0 - 195.234.83.255 de +195.234.80.0 - 195.234.81.255 gb 195.234.84.0 - 195.234.87.255 bg 195.234.88.0 - 195.234.91.255 fr -195.234.92.0 - 195.234.95.255 de 195.234.96.0 - 195.234.99.255 ru 195.234.100.0 - 195.234.103.255 at 195.234.104.0 - 195.234.107.255 de -195.234.108.0 - 195.234.111.255 ru 195.234.112.0 - 195.234.115.255 ua 195.234.116.0 - 195.234.119.255 gb 195.234.120.0 - 195.234.123.255 cm -195.234.124.0 - 195.234.127.255 ua -195.234.128.0 - 195.234.128.255 de -195.234.129.0 - 195.234.129.255 ch -195.234.130.0 - 195.234.130.255 ro +195.234.128.0 - 195.234.129.255 de 195.234.131.0 - 195.234.131.255 lv 195.234.132.0 - 195.234.132.255 ua 195.234.133.0 - 195.234.133.255 de 195.234.134.0 - 195.234.134.255 pt 195.234.135.0 - 195.234.135.255 fi -195.234.136.0 - 195.234.136.255 de +195.234.136.0 - 195.234.136.77 de +195.234.136.78 - 195.234.136.79 gb +195.234.136.80 - 195.234.136.255 de 195.234.137.0 - 195.234.137.255 si -195.234.138.0 - 195.234.139.255 de -195.234.140.0 - 195.234.140.255 es +195.234.138.0 - 195.234.138.255 bg +195.234.139.0 - 195.234.139.255 de 195.234.141.0 - 195.234.141.255 pl 195.234.142.0 - 195.234.142.255 fi -195.234.143.0 - 195.234.143.255 de 195.234.144.0 - 195.234.144.255 lv 195.234.145.0 - 195.234.145.255 be 195.234.146.0 - 195.234.146.255 se -195.234.147.0 - 195.234.147.255 ru 195.234.148.0 - 195.234.148.255 ua 195.234.149.0 - 195.234.149.255 de 195.234.150.0 - 195.234.150.255 se @@ -116885,18 +93075,15 @@ 195.234.153.0 - 195.234.153.255 gb 195.234.154.0 - 195.234.154.255 fr 195.234.155.0 - 195.234.155.255 dk -195.234.156.0 - 195.234.156.255 gb 195.234.157.0 - 195.234.157.255 at -195.234.158.0 - 195.234.159.255 il +195.234.158.0 - 195.234.158.255 il 195.234.160.0 - 195.234.160.255 dk -195.234.161.0 - 195.234.161.255 ro 195.234.162.0 - 195.234.162.255 be 195.234.163.0 - 195.234.163.255 ch 195.234.164.0 - 195.234.164.255 pl 195.234.165.0 - 195.234.165.255 tr 195.234.166.0 - 195.234.167.255 es 195.234.168.0 - 195.234.168.255 eg -195.234.169.0 - 195.234.169.255 ro 195.234.170.0 - 195.234.170.255 ru 195.234.171.0 - 195.234.171.255 it 195.234.172.0 - 195.234.172.255 ro @@ -116906,18 +93093,15 @@ 195.234.176.0 - 195.234.176.255 ch 195.234.177.0 - 195.234.177.255 ro 195.234.178.0 - 195.234.178.255 de -195.234.179.0 - 195.234.179.255 es 195.234.180.0 - 195.234.180.255 ch -195.234.181.0 - 195.234.182.255 ro +195.234.182.0 - 195.234.182.255 ro 195.234.183.0 - 195.234.183.255 de 195.234.184.0 - 195.234.184.255 be 195.234.185.0 - 195.234.185.255 eg 195.234.186.0 - 195.234.186.255 be -195.234.187.0 - 195.234.187.255 ch +195.234.187.0 - 195.234.187.255 nl 195.234.188.0 - 195.234.188.255 ro -195.234.189.0 - 195.234.189.255 pl 195.234.190.0 - 195.234.190.255 ru -195.234.191.0 - 195.234.191.255 ro 195.234.192.0 - 195.234.195.255 de 195.234.196.0 - 195.234.199.255 fi 195.234.200.0 - 195.234.203.255 ua @@ -116935,84 +93119,77 @@ 195.234.248.0 - 195.234.251.255 a2 195.234.252.0 - 195.234.255.255 eg 195.235.0.0 - 195.235.255.255 es -195.236.0.0 - 195.237.31.255 fi -195.237.32.0 - 195.237.32.255 ax -195.237.33.0 - 195.237.255.255 fi +195.236.0.0 - 195.237.255.255 fi 195.238.0.0 - 195.238.31.255 be -195.238.32.0 - 195.238.63.255 us +195.238.32.0 - 195.238.39.255 us +195.238.40.0 - 195.238.40.255 de +195.238.41.0 - 195.238.41.255 us +195.238.42.0 - 195.238.42.255 sa +195.238.43.0 - 195.238.43.255 us +195.238.44.0 - 195.238.44.255 sa +195.238.45.0 - 195.238.49.255 us +195.238.50.0 - 195.238.50.255 sa +195.238.51.0 - 195.238.53.255 us +195.238.54.0 - 195.238.54.255 eu +195.238.55.0 - 195.238.56.255 sa +195.238.57.0 - 195.238.57.255 us +195.238.58.0 - 195.238.58.255 sa +195.238.59.0 - 195.238.60.255 us +195.238.61.0 - 195.238.61.255 de +195.238.62.0 - 195.238.63.255 us 195.238.64.0 - 195.238.65.255 lt 195.238.66.0 - 195.238.67.255 pl -195.238.68.0 - 195.238.69.255 de 195.238.70.0 - 195.238.71.255 pl 195.238.72.0 - 195.238.73.255 ru 195.238.74.0 - 195.238.75.255 nl 195.238.76.0 - 195.238.77.255 se -195.238.78.0 - 195.238.79.255 gb 195.238.80.0 - 195.238.83.255 ro 195.238.84.0 - 195.238.85.255 bg 195.238.86.0 - 195.238.87.255 nl 195.238.88.0 - 195.238.91.255 ro 195.238.92.0 - 195.238.93.255 ua -195.238.94.0 - 195.238.95.255 ro 195.238.96.0 - 195.238.99.255 fr 195.238.100.0 - 195.238.103.255 ru 195.238.104.0 - 195.238.107.255 uz 195.238.108.0 - 195.238.119.255 ua -195.238.120.0 - 195.238.123.255 se -195.238.124.0 - 195.238.127.255 fi 195.238.128.0 - 195.238.163.255 de 195.238.164.0 - 195.238.171.255 pl 195.238.172.0 - 195.238.175.255 gb 195.238.176.0 - 195.238.183.255 ua 195.238.184.0 - 195.238.187.255 pl 195.238.188.0 - 195.238.191.255 ua -195.238.192.0 - 195.238.196.31 fi -195.238.196.32 - 195.238.196.87 ee -195.238.196.88 - 195.238.196.95 fi -195.238.196.96 - 195.238.196.191 ee -195.238.196.192 - 195.238.223.255 fi +195.238.192.0 - 195.238.223.255 fi 195.238.224.0 - 195.238.225.255 de 195.238.226.0 - 195.238.226.255 fr 195.238.227.0 - 195.238.228.255 pl 195.238.229.0 - 195.238.229.255 fr -195.238.230.0 - 195.238.231.255 ru +195.238.230.0 - 195.238.230.255 ru 195.238.232.0 - 195.238.232.255 gb 195.238.233.0 - 195.238.233.255 de +195.238.234.0 - 195.238.234.255 no 195.238.235.0 - 195.238.235.255 it 195.238.236.0 - 195.238.236.255 pl 195.238.237.0 - 195.238.237.255 gb 195.238.238.0 - 195.238.238.255 de 195.238.239.0 - 195.238.239.255 ru 195.238.240.0 - 195.238.241.255 gb -195.238.242.0 - 195.238.242.255 md -195.238.243.0 - 195.238.243.255 gb 195.238.244.0 - 195.238.244.255 nl 195.238.245.0 - 195.238.245.255 pl 195.238.246.0 - 195.238.246.255 ru -195.238.247.0 - 195.238.247.255 pl -195.238.248.0 - 195.238.248.255 de 195.238.249.0 - 195.238.249.255 gb 195.238.250.0 - 195.238.250.255 ru 195.238.251.0 - 195.238.251.255 fr -195.238.252.0 - 195.238.252.255 de 195.238.253.0 - 195.238.253.255 ch 195.238.254.0 - 195.238.255.255 se -195.239.0.0 - 195.239.152.239 ru -195.239.152.240 - 195.239.152.247 dk -195.239.152.248 - 195.239.198.207 ru -195.239.198.208 - 195.239.198.215 uz -195.239.198.216 - 195.239.255.255 ru +195.239.0.0 - 195.239.255.255 ru 195.240.0.0 - 195.241.255.255 nl 195.242.0.0 - 195.242.31.255 ru -195.242.32.0 - 195.242.42.175 se -195.242.42.176 - 195.242.42.191 gb -195.242.42.192 - 195.242.63.255 se +195.242.32.0 - 195.242.63.255 se 195.242.64.0 - 195.242.65.255 pl 195.242.66.0 - 195.242.67.255 de 195.242.68.0 - 195.242.69.255 pl 195.242.70.0 - 195.242.71.255 gb 195.242.72.0 - 195.242.73.255 nl -195.242.74.0 - 195.242.75.255 gb 195.242.76.0 - 195.242.77.255 rs 195.242.78.0 - 195.242.79.255 ro 195.242.80.0 - 195.242.81.255 ua @@ -117023,15 +93200,11 @@ 195.242.90.0 - 195.242.93.255 pl 195.242.94.0 - 195.242.95.255 ua 195.242.96.0 - 195.242.99.255 nl -195.242.100.0 - 195.242.101.255 pl -195.242.102.0 - 195.242.105.255 de +195.242.104.0 - 195.242.105.255 de 195.242.106.0 - 195.242.107.255 bg 195.242.108.0 - 195.242.109.255 pl -195.242.110.0 - 195.242.111.255 de -195.242.112.0 - 195.242.113.255 gb -195.242.114.0 - 195.242.115.255 ua +195.242.112.0 - 195.242.115.255 ua 195.242.116.0 - 195.242.117.255 pl -195.242.118.0 - 195.242.119.255 il 195.242.120.0 - 195.242.121.255 dk 195.242.122.0 - 195.242.123.255 gb 195.242.124.0 - 195.242.125.255 pl @@ -117045,7 +93218,7 @@ 195.242.140.0 - 195.242.141.255 ch 195.242.142.0 - 195.242.145.255 ru 195.242.146.0 - 195.242.147.255 se -195.242.148.0 - 195.242.151.255 ua +195.242.150.0 - 195.242.151.255 ua 195.242.152.0 - 195.242.153.255 nl 195.242.154.0 - 195.242.157.255 gb 195.242.158.0 - 195.242.159.255 ro @@ -117064,17 +93237,14 @@ 195.242.174.0 - 195.242.174.255 ch 195.242.175.0 - 195.242.175.255 at 195.242.176.0 - 195.242.176.255 pl -195.242.177.0 - 195.242.177.255 sa 195.242.178.0 - 195.242.178.255 be 195.242.179.0 - 195.242.179.255 ua 195.242.180.0 - 195.242.180.255 fr 195.242.181.0 - 195.242.181.255 it -195.242.182.0 - 195.242.182.255 ro 195.242.183.0 - 195.242.183.255 pl 195.242.184.0 - 195.242.184.255 at 195.242.185.0 - 195.242.185.255 sk 195.242.186.0 - 195.242.186.255 pl -195.242.187.0 - 195.242.187.255 nl 195.242.188.0 - 195.242.188.255 sa 195.242.189.0 - 195.242.189.255 se 195.242.190.0 - 195.242.190.255 de @@ -117082,43 +93252,24 @@ 195.242.192.0 - 195.242.195.255 dk 195.242.196.0 - 195.242.199.255 sa 195.242.200.0 - 195.242.203.255 ua -195.242.204.0 - 195.242.211.255 de -195.242.212.0 - 195.242.215.255 gb +195.242.204.0 - 195.242.207.255 de +195.242.212.0 - 195.242.215.255 eu 195.242.216.0 - 195.242.217.255 ru 195.242.218.0 - 195.242.219.255 ua 195.242.220.0 - 195.242.223.255 gb 195.242.224.0 - 195.242.231.255 de 195.242.232.0 - 195.242.235.255 pl 195.242.236.0 - 195.242.239.255 gb -195.242.240.0 - 195.242.243.255 bg 195.242.244.0 - 195.242.247.255 ro 195.242.248.0 - 195.242.251.255 at 195.242.252.0 - 195.242.255.255 pl -195.243.0.0 - 195.243.66.175 de -195.243.66.176 - 195.243.66.207 gb -195.243.66.208 - 195.243.66.223 de -195.243.66.224 - 195.243.66.239 gb -195.243.66.240 - 195.243.100.15 de -195.243.100.16 - 195.243.100.23 fr -195.243.100.24 - 195.243.128.239 de -195.243.128.240 - 195.243.128.247 cz -195.243.128.248 - 195.243.159.231 de -195.243.159.232 - 195.243.159.239 us -195.243.159.240 - 195.243.204.215 de -195.243.204.216 - 195.243.204.223 it -195.243.204.224 - 195.243.229.95 de -195.243.229.96 - 195.243.229.103 cz -195.243.229.104 - 195.243.236.31 de -195.243.236.32 - 195.243.236.47 us -195.243.236.48 - 195.244.3.255 de +195.243.0.0 - 195.244.1.255 de 195.244.4.0 - 195.244.5.255 ua 195.244.6.0 - 195.244.7.255 se 195.244.8.0 - 195.244.9.255 ua 195.244.10.0 - 195.244.11.255 de 195.244.12.0 - 195.244.13.255 lt -195.244.14.0 - 195.244.15.255 ro 195.244.16.0 - 195.244.17.255 gb -195.244.18.0 - 195.244.19.255 ro 195.244.20.0 - 195.244.21.255 fr 195.244.22.0 - 195.244.23.255 il 195.244.24.0 - 195.244.25.255 ru @@ -117127,11 +93278,7 @@ 195.244.30.0 - 195.244.31.255 fr 195.244.32.0 - 195.244.63.255 tr 195.244.64.0 - 195.244.95.255 fi -195.244.96.0 - 195.244.120.239 de -195.244.120.240 - 195.244.120.255 li -195.244.121.0 - 195.244.127.159 de -195.244.127.160 - 195.244.127.191 li -195.244.127.192 - 195.244.127.255 de +195.244.96.0 - 195.244.127.255 de 195.244.128.0 - 195.244.159.255 lv 195.244.160.0 - 195.244.191.255 be 195.244.192.0 - 195.244.223.255 gi @@ -117142,22 +93289,18 @@ 195.245.74.0 - 195.245.75.255 se 195.245.76.0 - 195.245.77.255 ru 195.245.78.0 - 195.245.79.255 sk -195.245.80.0 - 195.245.81.255 gb +195.245.80.0 - 195.245.81.255 ua 195.245.82.0 - 195.245.83.255 ro 195.245.84.0 - 195.245.85.255 pl 195.245.86.0 - 195.245.87.255 de -195.245.88.0 - 195.245.89.255 ro 195.245.90.0 - 195.245.91.255 ie 195.245.92.0 - 195.245.93.255 at 195.245.94.0 - 195.245.95.255 pl -195.245.96.0 - 195.245.97.255 ua -195.245.98.0 - 195.245.99.255 de 195.245.100.0 - 195.245.101.255 gb -195.245.102.0 - 195.245.103.255 ru +195.245.104.0 - 195.245.105.255 pl 195.245.106.0 - 195.245.107.255 si -195.245.108.0 - 195.245.109.255 a2 -195.245.110.0 - 195.245.111.255 fi -195.245.112.0 - 195.245.113.255 ua +195.245.108.0 - 195.245.109.255 eu +195.245.112.0 - 195.245.113.255 nl 195.245.114.0 - 195.245.115.255 be 195.245.116.0 - 195.245.117.255 it 195.245.118.0 - 195.245.121.255 ua @@ -117167,8 +93310,7 @@ 195.245.192.0 - 195.245.192.255 de 195.245.193.0 - 195.245.193.255 dk 195.245.194.0 - 195.245.194.255 lv -195.245.195.0 - 195.245.195.255 gb -195.245.196.0 - 195.245.196.255 es +195.245.196.0 - 195.245.196.255 nl 195.245.197.0 - 195.245.197.255 pt 195.245.198.0 - 195.245.198.255 pl 195.245.199.0 - 195.245.199.255 nl @@ -117177,14 +93319,13 @@ 195.245.202.0 - 195.245.202.255 no 195.245.203.0 - 195.245.204.255 pl 195.245.205.0 - 195.245.206.255 ru -195.245.207.0 - 195.245.207.255 dk 195.245.208.0 - 195.245.208.255 si 195.245.209.0 - 195.245.209.255 cz 195.245.210.0 - 195.245.210.255 dk 195.245.211.0 - 195.245.211.255 ru 195.245.212.0 - 195.245.212.255 es 195.245.213.0 - 195.245.213.255 pl -195.245.214.0 - 195.245.214.255 ro +195.245.214.0 - 195.245.214.255 ru 195.245.215.0 - 195.245.215.255 ua 195.245.216.0 - 195.245.216.255 si 195.245.217.0 - 195.245.217.255 pl @@ -117193,13 +93334,12 @@ 195.245.220.0 - 195.245.220.255 ro 195.245.221.0 - 195.245.221.255 ua 195.245.222.0 - 195.245.222.255 pl -195.245.223.0 - 195.245.223.255 us +195.245.223.0 - 195.245.223.255 gb 195.245.224.0 - 195.245.224.255 pl 195.245.225.0 - 195.245.225.255 at 195.245.226.0 - 195.245.226.255 pl 195.245.227.0 - 195.245.227.255 tr 195.245.228.0 - 195.245.228.255 ch -195.245.229.0 - 195.245.229.255 lt 195.245.230.0 - 195.245.230.255 de 195.245.231.0 - 195.245.231.255 nl 195.245.232.0 - 195.245.232.255 ru @@ -117208,15 +93348,10 @@ 195.245.235.0 - 195.245.235.255 gb 195.245.236.0 - 195.245.236.255 nl 195.245.237.0 - 195.245.237.255 ch -195.245.238.0 - 195.245.238.255 de -195.245.239.0 - 195.245.239.255 ro 195.245.240.0 - 195.245.240.255 se -195.245.241.0 - 195.245.241.255 gb -195.245.242.0 - 195.245.242.255 se 195.245.243.0 - 195.245.243.255 de 195.245.244.0 - 195.245.244.255 be 195.245.245.0 - 195.245.245.255 de -195.245.246.0 - 195.245.246.255 ru 195.245.247.0 - 195.245.247.255 gb 195.245.248.0 - 195.245.248.255 es 195.245.249.0 - 195.245.249.255 ru @@ -117232,54 +93367,40 @@ 195.246.96.0 - 195.246.97.255 cz 195.246.98.0 - 195.246.99.255 nl 195.246.100.0 - 195.246.101.255 lu -195.246.102.0 - 195.246.103.255 ru +195.246.102.0 - 195.246.103.255 tj 195.246.104.0 - 195.246.105.255 sa 195.246.106.0 - 195.246.107.255 ru 195.246.108.0 - 195.246.109.255 gb -195.246.110.0 - 195.246.111.255 fr 195.246.112.0 - 195.246.113.255 be -195.246.114.0 - 195.246.115.255 nl -195.246.116.0 - 195.246.117.255 eu +195.246.114.0 - 195.246.117.255 nl 195.246.118.0 - 195.246.119.255 ru 195.246.120.0 - 195.246.121.255 se 195.246.122.0 - 195.246.123.255 ru 195.246.124.0 - 195.246.125.255 ua 195.246.126.0 - 195.246.127.255 pl -195.246.128.0 - 195.246.155.255 gb -195.246.156.0 - 195.246.156.255 fr -195.246.157.0 - 195.246.157.255 gb -195.246.158.0 - 195.246.158.255 fr -195.246.159.0 - 195.246.159.255 gb +195.246.128.0 - 195.246.159.255 gb 195.246.160.0 - 195.246.191.255 de 195.246.192.0 - 195.246.196.255 it -195.246.197.0 - 195.246.197.255 se 195.246.198.0 - 195.246.198.255 dk 195.246.199.0 - 195.246.199.255 hu -195.246.200.0 - 195.246.200.255 pl -195.246.201.0 - 195.246.201.255 gb -195.246.202.0 - 195.246.207.255 de 195.246.208.0 - 195.246.215.255 it 195.246.216.0 - 195.246.216.255 pl 195.246.217.0 - 195.246.217.255 ua 195.246.218.0 - 195.246.218.255 ru -195.246.219.0 - 195.246.219.255 se 195.246.220.0 - 195.246.223.255 it 195.246.224.0 - 195.246.225.255 pl 195.246.226.0 - 195.246.227.255 lv 195.246.228.0 - 195.246.229.255 gb 195.246.230.0 - 195.246.231.255 fr -195.246.232.0 - 195.246.233.255 ch +195.246.232.0 - 195.246.233.255 gb 195.246.234.0 - 195.246.235.255 de 195.246.236.0 - 195.246.237.255 nl 195.246.238.0 - 195.246.239.255 pt 195.246.240.0 - 195.246.241.255 bg 195.246.242.0 - 195.246.243.255 ro 195.246.244.0 - 195.246.245.255 ch -195.246.246.0 - 195.246.247.255 ro -195.246.248.0 - 195.246.249.255 ru 195.246.250.0 - 195.246.251.255 ro -195.246.252.0 - 195.246.253.255 lv -195.246.254.0 - 195.246.255.255 fr +195.246.252.0 - 195.246.253.255 de 195.247.0.0 - 195.247.255.255 de 195.248.0.0 - 195.248.31.255 fr 195.248.32.0 - 195.248.63.255 at @@ -117303,7 +93424,6 @@ 195.248.81.0 - 195.248.81.255 gb 195.248.82.0 - 195.248.82.255 ru 195.248.83.0 - 195.248.83.255 ch -195.248.84.0 - 195.248.84.255 ro 195.248.85.0 - 195.248.85.255 at 195.248.86.0 - 195.248.86.255 fi 195.248.87.0 - 195.248.87.255 nl @@ -117340,9 +93460,6 @@ 195.248.234.0 - 195.248.235.255 ua 195.248.236.0 - 195.248.237.255 ru 195.248.238.0 - 195.248.239.255 nl -195.248.240.0 - 195.248.241.255 pl -195.248.242.0 - 195.248.243.255 ru -195.248.244.0 - 195.248.245.255 gb 195.248.246.0 - 195.248.247.255 pl 195.248.248.0 - 195.248.249.255 ru 195.248.250.0 - 195.248.251.255 fr @@ -117370,44 +93487,34 @@ 195.250.52.0 - 195.250.52.255 ch 195.250.53.0 - 195.250.53.255 ro 195.250.54.0 - 195.250.54.255 pl -195.250.55.0 - 195.250.56.255 ru +195.250.56.0 - 195.250.56.255 ru 195.250.57.0 - 195.250.57.255 de 195.250.58.0 - 195.250.58.255 si 195.250.59.0 - 195.250.59.255 ro 195.250.60.0 - 195.250.60.255 bg 195.250.61.0 - 195.250.61.255 se 195.250.62.0 - 195.250.62.255 ua -195.250.63.0 - 195.250.63.255 gb 195.250.64.0 - 195.250.95.255 am 195.250.96.0 - 195.250.127.255 rs 195.250.128.0 - 195.250.159.255 cz 195.250.160.0 - 195.250.191.255 ee -195.250.192.0 - 195.250.223.255 si +195.250.192.0 - 195.250.215.255 si +195.250.216.0 - 195.250.223.255 ba 195.250.224.0 - 195.250.255.255 it 195.251.0.0 - 195.251.255.255 gr 195.252.0.0 - 195.252.63.255 se -195.252.64.0 - 195.252.118.143 rs -195.252.118.144 - 195.252.118.151 dk -195.252.118.152 - 195.252.127.255 rs -195.252.128.0 - 195.253.22.255 de -195.253.23.0 - 195.253.23.255 ch -195.253.24.0 - 195.253.30.255 de -195.253.31.0 - 195.253.32.255 ch -195.253.33.0 - 195.253.47.255 de -195.253.48.0 - 195.253.53.255 nl -195.253.54.0 - 195.254.127.255 de +195.252.64.0 - 195.252.127.255 rs +195.252.128.0 - 195.254.127.255 de 195.254.128.0 - 195.254.129.255 li 195.254.130.0 - 195.254.131.255 fr 195.254.132.0 - 195.254.137.255 ro 195.254.138.0 - 195.254.139.255 pl 195.254.140.0 - 195.254.141.255 ro -195.254.142.0 - 195.254.143.255 ua 195.254.144.0 - 195.254.145.255 ch 195.254.146.0 - 195.254.147.255 fr 195.254.148.0 - 195.254.149.255 es 195.254.150.0 - 195.254.151.255 ua 195.254.152.0 - 195.254.153.255 ro -195.254.154.0 - 195.254.155.255 fr 195.254.156.0 - 195.254.157.255 pl 195.254.158.0 - 195.254.161.255 fr 195.254.162.0 - 195.254.163.255 de @@ -117420,7 +93527,7 @@ 195.254.178.0 - 195.254.181.255 gb 195.254.182.0 - 195.254.183.255 ro 195.254.184.0 - 195.254.185.255 pl -195.254.186.0 - 195.254.189.255 ru +195.254.188.0 - 195.254.189.255 ru 195.254.190.0 - 195.254.191.255 at 195.254.192.0 - 195.254.223.255 no 195.254.224.0 - 195.254.255.255 it @@ -117434,7 +93541,9 @@ 196.1.5.0 - 196.1.5.255 ru 196.1.6.0 - 196.1.6.255 sa 196.1.7.0 - 196.1.7.255 mu -196.1.8.0 - 196.1.25.255 za +196.1.8.0 - 196.1.14.255 za +196.1.15.0 - 196.1.15.255 ao +196.1.16.0 - 196.1.25.255 za 196.1.26.0 - 196.1.27.255 ke 196.1.28.0 - 196.1.31.255 na 196.1.32.0 - 196.1.51.255 za @@ -117454,15 +93563,17 @@ 196.1.112.0 - 196.1.112.255 cu 196.1.113.0 - 196.1.114.255 in 196.1.115.0 - 196.1.115.255 za -196.1.116.0 - 196.1.118.255 gh +196.1.116.0 - 196.1.117.255 ke +196.1.118.0 - 196.1.118.255 gh 196.1.119.0 - 196.1.119.255 eg 196.1.120.0 - 196.1.127.255 sc -196.1.128.0 - 196.1.129.255 za -196.1.130.0 - 196.1.133.255 bw +196.1.128.0 - 196.1.130.255 za +196.1.131.0 - 196.1.132.255 ke +196.1.133.0 - 196.1.133.255 ng 196.1.134.0 - 196.1.134.255 in 196.1.135.0 - 196.1.135.255 cu 196.1.136.0 - 196.1.136.255 jm -196.1.137.0 - 196.1.137.255 gh +196.1.137.0 - 196.1.137.255 cd 196.1.138.0 - 196.1.139.255 jm 196.1.140.0 - 196.1.140.255 us 196.1.141.0 - 196.1.141.255 pr @@ -117481,15 +93592,29 @@ 196.2.3.0 - 196.2.3.255 mu 196.2.4.0 - 196.2.7.255 sy 196.2.8.0 - 196.2.15.255 bi -196.2.16.0 - 196.2.79.255 za +196.2.16.0 - 196.2.63.255 za +196.2.64.0 - 196.2.65.255 zw +196.2.66.0 - 196.2.78.255 za +196.2.79.0 - 196.2.79.255 zw 196.2.80.0 - 196.2.95.255 ma 196.2.96.0 - 196.2.191.255 za -196.2.192.0 - 196.2.255.255 eg +196.2.192.0 - 196.2.223.255 eg +196.2.224.0 - 196.2.255.255 za 196.3.0.0 - 196.3.7.255 jm 196.3.8.0 - 196.3.13.255 pr -196.3.14.0 - 196.3.15.255 mg -196.3.16.0 - 196.3.31.255 an -196.3.32.0 - 196.3.56.255 us +196.3.14.0 - 196.3.15.255 eg +196.3.16.0 - 196.3.31.255 cw +196.3.32.0 - 196.3.48.255 us +196.3.49.0 - 196.3.49.255 ap +196.3.50.0 - 196.3.50.252 ch +196.3.50.253 - 196.3.50.253 eu +196.3.50.254 - 196.3.50.255 ch +196.3.51.0 - 196.3.52.242 us +196.3.52.243 - 196.3.52.243 eu +196.3.52.244 - 196.3.53.255 us +196.3.54.0 - 196.3.54.255 mx +196.3.55.0 - 196.3.55.255 fr +196.3.56.0 - 196.3.56.255 au 196.3.57.0 - 196.3.57.255 za 196.3.58.0 - 196.3.59.255 ke 196.3.60.0 - 196.3.63.255 ng @@ -117517,25 +93642,100 @@ 196.3.152.0 - 196.3.152.255 cu 196.3.153.0 - 196.3.153.255 jm 196.3.154.0 - 196.3.179.255 za -196.3.180.0 - 196.3.183.255 ng 196.3.184.0 - 196.3.191.255 jm 196.3.192.0 - 196.3.223.255 bb 196.3.224.0 - 196.4.45.255 za -196.4.46.0 - 196.4.70.255 us +196.4.46.0 - 196.4.46.8 us +196.4.46.9 - 196.4.46.9 de +196.4.46.10 - 196.4.70.255 us 196.4.71.0 - 196.4.79.255 za 196.4.80.0 - 196.4.80.255 zw 196.4.81.0 - 196.4.254.255 za 196.4.255.0 - 196.4.255.255 ls -196.5.0.0 - 196.5.255.255 za -196.6.0.0 - 196.6.0.255 mu -196.6.1.0 - 196.11.31.255 za -196.11.56.0 - 196.11.58.255 za -196.11.59.0 - 196.11.59.255 zw -196.11.60.0 - 196.11.60.255 na -196.11.61.0 - 196.11.61.255 za -196.11.64.0 - 196.11.123.255 za +196.5.0.0 - 196.6.102.255 za +196.6.103.0 - 196.6.103.255 ng +196.6.120.0 - 196.6.120.255 eg +196.6.121.0 - 196.6.175.255 za +196.6.184.0 - 196.6.184.255 za +196.6.185.0 - 196.6.185.255 eg +196.6.186.0 - 196.6.195.255 ng +196.6.196.0 - 196.6.197.255 tz +196.6.198.0 - 196.6.198.255 za +196.6.199.0 - 196.6.199.255 mu +196.6.200.0 - 196.6.200.255 eg +196.6.201.0 - 196.6.201.255 za +196.6.202.0 - 196.6.203.255 ke +196.6.204.0 - 196.6.207.255 ng +196.6.208.0 - 196.6.214.255 za +196.6.215.0 - 196.6.215.255 ke +196.6.216.0 - 196.6.217.255 ng +196.6.218.0 - 196.6.220.255 ke +196.6.221.0 - 196.6.225.255 za +196.6.226.0 - 196.6.226.255 ug +196.6.236.0 - 196.6.236.255 eg +196.6.237.0 - 196.6.254.255 za +196.6.255.0 - 196.6.255.255 ao +196.7.0.0 - 196.10.50.255 za +196.10.51.0 - 196.10.51.255 ao +196.10.52.0 - 196.10.55.255 za +196.10.56.0 - 196.10.59.255 ng +196.10.60.0 - 196.10.60.255 tz +196.10.61.0 - 196.10.96.255 za +196.10.97.0 - 196.10.97.255 eg +196.10.98.0 - 196.10.99.255 za +196.10.100.0 - 196.10.100.255 cm +196.10.101.0 - 196.10.118.255 za +196.10.119.0 - 196.10.119.255 ug +196.10.120.0 - 196.10.120.255 eg +196.10.121.0 - 196.10.121.255 za +196.10.122.0 - 196.10.123.255 ci +196.10.124.0 - 196.10.136.255 za +196.10.137.0 - 196.10.137.255 gh +196.10.138.0 - 196.10.139.255 ug +196.10.140.0 - 196.10.146.255 za +196.10.147.0 - 196.10.147.255 tz +196.10.148.0 - 196.10.148.255 mz +196.10.149.0 - 196.10.201.255 za +196.10.202.0 - 196.10.202.255 ng +196.10.203.0 - 196.10.214.255 za +196.10.215.0 - 196.10.215.255 gh +196.10.216.0 - 196.10.223.255 ml +196.10.224.0 - 196.10.227.255 za +196.10.228.0 - 196.10.228.255 ug +196.10.229.0 - 196.10.230.255 za +196.10.231.0 - 196.10.231.255 ng +196.10.232.0 - 196.10.250.255 za +196.10.251.0 - 196.10.255.255 ng +196.11.0.0 - 196.11.61.255 za +196.11.62.0 - 196.11.62.255 so +196.11.63.0 - 196.11.74.255 za +196.11.75.0 - 196.11.75.255 dz +196.11.76.0 - 196.11.79.255 za +196.11.80.0 - 196.11.87.255 mw +196.11.88.0 - 196.11.89.255 ke +196.11.90.0 - 196.11.90.255 gh +196.11.91.0 - 196.11.103.255 za +196.11.104.0 - 196.11.104.255 ng +196.11.105.0 - 196.11.123.255 za 196.11.124.0 - 196.11.124.255 sz -196.11.125.0 - 196.11.255.255 za +196.11.125.0 - 196.11.134.255 za +196.11.135.0 - 196.11.135.255 mz +196.11.136.0 - 196.11.149.255 za +196.11.150.0 - 196.11.151.255 ng +196.11.152.0 - 196.11.174.255 za +196.11.175.0 - 196.11.175.255 ls +196.11.184.0 - 196.11.187.255 ng +196.11.188.0 - 196.11.188.255 za +196.11.189.0 - 196.11.189.255 ao +196.11.190.0 - 196.11.191.255 ke +196.11.192.0 - 196.11.205.255 za +196.11.206.0 - 196.11.207.255 gh +196.11.208.0 - 196.11.230.255 za +196.11.231.0 - 196.11.231.255 ng +196.11.232.0 - 196.11.233.255 za +196.11.234.0 - 196.11.234.255 ao +196.11.235.0 - 196.11.254.255 za +196.11.255.0 - 196.11.255.255 tz 196.12.0.0 - 196.12.9.255 pr 196.12.10.0 - 196.12.10.255 na 196.12.11.0 - 196.12.11.255 eg @@ -117543,19 +93743,75 @@ 196.12.16.0 - 196.12.31.255 za 196.12.32.0 - 196.12.63.255 in 196.12.64.0 - 196.12.127.255 bm -196.12.128.0 - 196.12.159.255 rw -196.12.160.0 - 196.12.190.223 pr -196.12.190.224 - 196.12.190.255 us -196.12.191.0 - 196.12.191.255 pr +196.12.128.0 - 196.12.139.255 mu +196.12.140.0 - 196.12.147.255 rw +196.12.148.0 - 196.12.159.255 mu +196.12.160.0 - 196.12.165.255 pr +196.12.166.0 - 196.12.166.255 us +196.12.167.0 - 196.12.191.255 pr 196.12.192.0 - 196.12.255.255 ma -196.13.0.0 - 196.13.167.255 za +196.13.0.0 - 196.13.100.255 za +196.13.101.0 - 196.13.101.255 mz +196.13.102.0 - 196.13.103.255 ng +196.13.104.0 - 196.13.104.255 zm +196.13.105.0 - 196.13.105.255 tz +196.13.106.0 - 196.13.107.255 za +196.13.108.0 - 196.13.108.255 ma +196.13.109.0 - 196.13.109.255 ao +196.13.110.0 - 196.13.110.255 cd +196.13.111.0 - 196.13.112.255 ng +196.13.113.0 - 196.13.120.255 za +196.13.121.0 - 196.13.121.255 ke +196.13.122.0 - 196.13.122.255 ug +196.13.123.0 - 196.13.123.255 gh +196.13.124.0 - 196.13.124.255 za +196.13.125.0 - 196.13.125.255 mu +196.13.126.0 - 196.13.132.255 za +196.13.133.0 - 196.13.133.255 tz +196.13.134.0 - 196.13.135.255 za +196.13.136.0 - 196.13.137.255 ke +196.13.138.0 - 196.13.160.255 za +196.13.161.0 - 196.13.161.255 ng +196.13.162.0 - 196.13.167.255 za 196.13.168.0 - 196.13.168.255 sz -196.13.170.0 - 196.13.172.255 za -196.13.184.0 - 196.15.10.255 za -196.15.11.0 - 196.15.11.255 na +196.13.169.0 - 196.13.172.255 za +196.13.173.0 - 196.13.173.255 ke +196.13.174.0 - 196.13.175.255 gh +196.13.176.0 - 196.13.185.255 za +196.13.186.0 - 196.13.186.255 tz +196.13.187.0 - 196.13.190.255 za +196.13.191.0 - 196.13.191.255 ke +196.13.192.0 - 196.13.199.255 gh +196.13.200.0 - 196.13.201.255 za +196.13.204.0 - 196.13.204.255 ao +196.13.205.0 - 196.13.205.255 za +196.13.206.0 - 196.13.206.255 eg +196.13.207.0 - 196.13.207.255 bf +196.13.208.0 - 196.13.208.255 sc +196.13.209.0 - 196.13.209.255 ke +196.13.210.0 - 196.13.222.255 za +196.13.223.0 - 196.13.223.255 bi +196.13.224.0 - 196.13.241.255 za +196.13.242.0 - 196.13.242.255 ng +196.13.243.0 - 196.13.243.255 ao +196.13.244.0 - 196.13.244.255 eg +196.13.245.0 - 196.13.245.255 ng +196.13.246.0 - 196.13.251.255 za +196.13.252.0 - 196.13.252.255 gh +196.13.253.0 - 196.13.253.255 eg +196.13.254.0 - 196.13.254.255 za +196.13.255.0 - 196.13.255.255 ke +196.14.0.0 - 196.15.7.255 za +196.15.8.0 - 196.15.8.255 a2 +196.15.9.0 - 196.15.9.255 za +196.15.10.0 - 196.15.11.255 a2 +196.15.12.0 - 196.15.15.255 za 196.15.16.0 - 196.15.31.255 in 196.15.32.0 - 196.15.63.255 sa -196.15.64.0 - 196.19.255.255 za +196.15.64.0 - 196.16.31.255 za +196.16.32.0 - 196.16.223.255 sc +196.16.224.0 - 196.16.255.255 za +196.17.0.0 - 196.19.255.255 sc 196.20.0.0 - 196.20.31.255 na 196.20.32.0 - 196.20.63.255 eg 196.20.64.0 - 196.20.127.255 dz @@ -117568,9 +93824,7 @@ 196.22.12.0 - 196.22.15.255 gw 196.22.16.0 - 196.22.47.255 za 196.22.48.0 - 196.22.63.255 mz -196.22.64.0 - 196.22.79.255 za -196.22.80.0 - 196.22.80.255 sz -196.22.81.0 - 196.22.129.255 za +196.22.64.0 - 196.22.129.255 za 196.22.130.0 - 196.22.130.255 eg 196.22.131.0 - 196.22.131.255 ke 196.22.132.0 - 196.22.143.255 za @@ -117579,56 +93833,37 @@ 196.24.0.0 - 196.24.3.255 ls 196.24.4.0 - 196.24.63.255 za 196.24.64.0 - 196.24.67.255 sz -196.24.68.0 - 196.26.255.255 za -196.27.0.0 - 196.27.1.255 jo -196.27.2.0 - 196.27.3.255 eg -196.27.4.0 - 196.27.11.255 ve -196.27.12.0 - 196.27.12.255 cl -196.27.13.0 - 196.27.13.15 ca -196.27.13.16 - 196.27.13.31 us -196.27.13.32 - 196.27.13.95 ca -196.27.13.96 - 196.27.13.127 us -196.27.13.128 - 196.27.13.175 ca -196.27.13.176 - 196.27.13.207 us -196.27.13.208 - 196.27.13.223 ca -196.27.13.224 - 196.27.13.239 us -196.27.13.240 - 196.27.13.247 ca -196.27.13.248 - 196.27.13.255 us -196.27.14.0 - 196.27.14.255 ca -196.27.15.0 - 196.27.17.255 us -196.27.18.0 - 196.27.18.255 ca -196.27.19.0 - 196.27.19.255 us -196.27.20.0 - 196.27.20.255 gh -196.27.21.0 - 196.27.21.255 mu -196.27.22.0 - 196.27.22.255 et -196.27.23.0 - 196.27.24.255 pr -196.27.25.0 - 196.27.25.255 us -196.27.26.0 - 196.27.26.255 es -196.27.27.0 - 196.27.27.255 do -196.27.28.0 - 196.27.29.255 us -196.27.30.0 - 196.27.30.255 mx -196.27.31.0 - 196.27.31.255 us -196.27.32.0 - 196.27.32.143 ca -196.27.32.144 - 196.27.47.255 us -196.27.48.0 - 196.27.56.255 pe -196.27.57.0 - 196.27.63.255 us +196.24.68.0 - 196.25.227.255 za +196.25.228.0 - 196.25.228.255 ls +196.25.229.0 - 196.26.85.255 za +196.26.86.0 - 196.26.86.255 sz +196.26.87.0 - 196.26.255.255 za +196.27.0.0 - 196.27.25.127 ca +196.27.25.128 - 196.27.25.159 us +196.27.25.160 - 196.27.63.255 ca 196.27.64.0 - 196.27.95.255 mu 196.27.96.0 - 196.27.127.255 zw 196.27.128.0 - 196.27.255.255 ng 196.28.0.0 - 196.28.6.255 za 196.28.7.0 - 196.28.7.255 sz -196.28.8.0 - 196.28.8.255 za -196.28.10.0 - 196.28.10.255 ng +196.28.8.0 - 196.28.10.255 za 196.28.11.0 - 196.28.11.255 ke 196.28.12.0 - 196.28.47.255 za -196.28.48.0 - 196.28.63.255 pr +196.28.48.0 - 196.28.48.255 us +196.28.49.0 - 196.28.54.255 pr +196.28.55.0 - 196.28.55.255 us +196.28.56.0 - 196.28.60.255 pr +196.28.61.0 - 196.28.61.255 us +196.28.62.0 - 196.28.63.255 pr 196.28.64.0 - 196.28.223.255 za 196.28.224.0 - 196.28.239.255 mz 196.28.240.0 - 196.28.255.255 bf 196.29.0.0 - 196.29.31.255 za 196.29.32.0 - 196.29.39.255 zw 196.29.40.0 - 196.29.43.255 dz +196.29.44.0 - 196.29.47.255 ng 196.29.48.0 - 196.29.55.255 tz +196.29.56.0 - 196.29.63.255 za 196.29.64.0 - 196.29.95.255 tt 196.29.96.0 - 196.29.127.255 gh 196.29.128.0 - 196.29.159.255 za @@ -117636,37 +93871,49 @@ 196.29.192.0 - 196.29.207.255 ao 196.29.208.0 - 196.29.223.255 ng 196.29.224.0 - 196.29.239.255 gh -196.29.240.0 - 196.31.255.255 za +196.29.240.0 - 196.31.223.255 za +196.31.224.0 - 196.31.239.255 na +196.31.240.0 - 196.31.255.255 za 196.32.0.0 - 196.32.7.255 jm +196.32.8.0 - 196.32.15.255 za +196.32.16.0 - 196.32.31.255 dz 196.32.32.0 - 196.32.63.255 tt 196.32.64.0 - 196.32.95.255 ar 196.32.96.0 - 196.32.111.255 mz 196.32.112.0 - 196.32.127.255 ml -196.32.128.0 - 196.32.156.63 pr -196.32.156.64 - 196.32.156.127 do -196.32.156.128 - 196.32.159.255 pr +196.32.128.0 - 196.32.159.255 pr 196.32.160.0 - 196.32.191.255 za 196.32.192.0 - 196.32.199.255 ao 196.32.200.0 - 196.32.207.255 cf 196.32.208.0 - 196.32.215.255 za -196.32.216.0 - 196.32.223.255 sc +196.32.216.0 - 196.32.223.255 ma 196.32.224.0 - 196.32.225.255 ng 196.32.226.0 - 196.32.227.255 ke 196.32.228.0 - 196.32.229.255 eg -196.32.232.0 - 196.32.239.255 za +196.32.230.0 - 196.32.239.255 za 196.32.240.0 - 196.32.247.255 tz -196.33.0.0 - 196.39.255.255 za +196.32.248.0 - 196.36.98.255 za +196.36.99.0 - 196.36.99.255 sz +196.36.100.0 - 196.39.255.255 za 196.40.0.0 - 196.40.95.255 cr 196.40.96.0 - 196.40.111.255 za +196.40.112.0 - 196.40.127.255 mz 196.40.128.0 - 196.40.143.255 ke +196.40.144.0 - 196.40.159.255 gh +196.40.160.0 - 196.40.175.255 ng +196.40.176.0 - 196.40.191.255 za 196.40.192.0 - 196.40.255.255 ng 196.41.0.0 - 196.41.31.255 za -196.41.32.0 - 196.41.46.255 tz -196.41.47.0 - 196.41.47.255 ke -196.41.48.0 - 196.41.63.255 tz +196.41.32.0 - 196.41.63.255 tz 196.41.64.0 - 196.41.223.255 za 196.41.224.0 - 196.41.255.255 dz 196.42.0.0 - 196.42.63.255 pr +196.42.64.0 - 196.42.143.255 za +196.42.144.0 - 196.42.191.255 bg +196.42.192.0 - 196.42.207.255 za +196.42.208.0 - 196.42.223.255 bg +196.42.224.0 - 196.42.239.255 za +196.42.240.0 - 196.42.255.255 bg 196.43.0.0 - 196.43.63.255 za 196.43.64.0 - 196.43.95.255 tz 196.43.96.0 - 196.43.127.255 zw @@ -117688,6 +93935,7 @@ 196.43.208.0 - 196.43.209.255 za 196.43.210.0 - 196.43.210.255 ao 196.43.211.0 - 196.43.212.255 ke +196.43.213.0 - 196.43.213.255 za 196.43.214.0 - 196.43.214.255 mg 196.43.215.0 - 196.43.215.255 ng 196.43.216.0 - 196.43.216.255 bw @@ -117699,7 +93947,32 @@ 196.43.223.0 - 196.43.223.255 ao 196.43.224.0 - 196.43.224.255 ng 196.43.225.0 - 196.43.225.255 gh -196.43.252.0 - 196.43.255.255 mu +196.43.226.0 - 196.43.226.255 ug +196.43.227.0 - 196.43.227.255 za +196.43.228.0 - 196.43.228.255 ke +196.43.229.0 - 196.43.229.255 sl +196.43.230.0 - 196.43.230.255 tz +196.43.231.0 - 196.43.231.255 za +196.43.232.0 - 196.43.233.255 ng +196.43.234.0 - 196.43.234.255 mz +196.43.235.0 - 196.43.235.255 ng +196.43.236.0 - 196.43.236.255 ma +196.43.237.0 - 196.43.237.255 eg +196.43.238.0 - 196.43.238.255 ng +196.43.239.0 - 196.43.239.255 ke +196.43.240.0 - 196.43.240.255 cg +196.43.241.0 - 196.43.241.255 mz +196.43.242.0 - 196.43.242.255 gh +196.43.243.0 - 196.43.243.255 za +196.43.244.0 - 196.43.244.255 ng +196.43.245.0 - 196.43.246.255 ke +196.43.247.0 - 196.43.247.255 bf +196.43.248.0 - 196.43.248.255 ke +196.43.249.0 - 196.43.249.255 ls +196.43.250.0 - 196.43.250.255 za +196.43.251.0 - 196.43.252.255 ng +196.43.253.0 - 196.43.253.255 za +196.43.254.0 - 196.43.255.255 tz 196.44.0.0 - 196.44.47.255 za 196.44.48.0 - 196.44.63.255 gh 196.44.64.0 - 196.44.95.255 za @@ -117711,22 +93984,19 @@ 196.44.240.0 - 196.44.255.255 rw 196.45.0.0 - 196.45.15.255 na 196.45.16.0 - 196.45.31.255 za -196.45.32.0 - 196.45.38.191 tz -196.45.38.192 - 196.45.38.255 ng -196.45.39.0 - 196.45.40.255 tz -196.45.41.0 - 196.45.41.127 ke -196.45.41.128 - 196.45.47.255 tz +196.45.32.0 - 196.45.47.255 tz 196.45.48.0 - 196.45.63.255 ng -196.45.64.0 - 196.45.127.255 za +196.45.64.0 - 196.45.115.255 za +196.45.116.0 - 196.45.119.255 ng +196.45.120.0 - 196.45.123.255 za +196.45.124.0 - 196.45.127.255 ug 196.45.128.0 - 196.45.159.255 tz 196.45.160.0 - 196.45.163.255 ao 196.45.164.0 - 196.45.167.255 bw 196.45.168.0 - 196.45.183.255 za 196.45.184.0 - 196.45.187.255 tz 196.45.188.0 - 196.45.191.255 mw -196.45.192.0 - 196.45.192.7 za -196.45.192.8 - 196.45.192.255 ng -196.45.193.0 - 196.45.255.255 za +196.45.192.0 - 196.45.255.255 za 196.46.0.0 - 196.46.15.255 mz 196.46.16.0 - 196.46.16.255 ke 196.46.17.0 - 196.46.17.255 eg @@ -117747,7 +94017,8 @@ 196.46.72.0 - 196.46.79.255 ao 196.46.80.0 - 196.46.95.255 gh 196.46.96.0 - 196.46.111.255 tz -196.46.112.0 - 196.46.119.255 za +196.46.112.0 - 196.46.115.255 cd +196.46.116.0 - 196.46.119.255 za 196.46.120.0 - 196.46.123.255 tz 196.46.124.0 - 196.46.127.255 zm 196.46.128.0 - 196.46.135.255 tz @@ -117763,23 +94034,111 @@ 196.46.232.0 - 196.46.239.255 gm 196.46.240.0 - 196.46.247.255 ng 196.46.248.0 - 196.46.255.255 dz -196.47.0.0 - 196.47.65.255 za -196.47.66.0 - 196.47.66.127 na -196.47.66.128 - 196.47.68.255 za -196.47.69.0 - 196.47.69.255 na -196.47.70.0 - 196.47.73.255 za -196.47.74.0 - 196.47.74.255 na -196.47.75.0 - 196.47.81.255 za -196.47.82.0 - 196.47.85.255 na -196.47.86.0 - 196.47.89.255 za -196.47.90.0 - 196.47.90.255 na -196.47.91.0 - 196.47.95.255 za +196.47.0.0 - 196.47.47.255 za +196.47.48.0 - 196.47.63.255 na +196.47.64.0 - 196.47.70.255 za +196.47.71.0 - 196.47.71.255 na +196.47.72.0 - 196.47.76.255 za +196.47.77.0 - 196.47.78.255 a2 +196.47.79.0 - 196.47.95.255 za +196.47.96.0 - 196.47.127.255 ng 196.47.128.0 - 196.47.191.255 ci -196.48.0.0 - 196.63.255.255 za +196.47.192.0 - 196.47.255.255 za +196.48.0.0 - 196.48.31.255 de +196.48.32.0 - 196.48.63.255 sc +196.48.64.0 - 196.48.127.255 us +196.48.128.0 - 196.48.191.255 sc +196.48.192.0 - 196.48.255.255 us +196.49.0.0 - 196.49.0.255 ci +196.49.1.0 - 196.49.1.255 gm +196.49.2.0 - 196.49.2.255 na +196.49.3.0 - 196.49.3.255 bi +196.49.4.0 - 196.49.4.255 sz +196.49.5.0 - 196.49.5.255 tz +196.49.6.0 - 196.49.6.255 ao +196.49.7.0 - 196.49.7.255 rw +196.49.8.0 - 196.49.8.255 bj +196.49.9.0 - 196.49.9.255 mu +196.49.10.0 - 196.49.10.255 dj +196.49.11.0 - 196.49.11.255 sc +196.49.12.0 - 196.49.12.255 tz +196.49.13.0 - 196.49.13.255 mg +196.49.14.0 - 196.49.14.255 gh +196.49.15.0 - 196.49.15.255 ug +196.49.16.0 - 196.49.16.255 lr +196.49.17.0 - 196.49.17.255 ga +196.50.0.0 - 196.50.1.255 za +196.52.0.0 - 196.52.0.255 us +196.52.1.0 - 196.52.1.127 gb +196.52.1.128 - 196.52.1.255 ie +196.52.2.0 - 196.52.31.255 us +196.52.32.0 - 196.52.32.255 gb +196.52.33.0 - 196.55.255.255 us +196.56.0.0 - 196.59.255.255 sc +196.62.0.0 - 196.62.255.255 us +196.63.0.0 - 196.63.255.255 za +196.64.0.0 - 196.95.255.255 ma +196.96.0.0 - 196.111.255.255 ke +196.112.0.0 - 196.127.255.255 ma +196.128.0.0 - 196.159.255.255 eg +196.168.0.0 - 196.171.255.255 tg +196.172.0.0 - 196.175.255.255 gh +196.176.0.0 - 196.179.255.255 tn +196.180.0.0 - 196.183.255.255 ci +196.184.0.0 - 196.187.255.255 tn +196.188.0.0 - 196.191.255.255 et 196.192.0.0 - 196.192.15.255 mu +196.192.16.0 - 196.192.31.255 bj 196.192.32.0 - 196.192.47.255 mg 196.192.64.0 - 196.192.127.255 mu -196.200.0.0 - 196.200.15.255 ng +196.192.140.0 - 196.192.143.255 mu +196.192.144.0 - 196.192.159.255 ng +196.192.160.0 - 196.194.255.255 za +196.195.0.0 - 196.195.95.255 ng +196.195.96.0 - 196.195.103.255 za +196.195.104.0 - 196.195.127.255 ng +196.195.128.0 - 196.195.223.255 za +196.195.224.0 - 196.195.227.255 in +196.195.228.0 - 196.195.239.255 za +196.195.240.0 - 196.195.255.255 af +196.196.0.0 - 196.196.7.255 sc +196.196.8.0 - 196.196.23.255 us +196.196.24.0 - 196.196.31.255 gb +196.196.32.0 - 196.196.39.255 fr +196.196.40.0 - 196.196.47.255 us +196.196.48.0 - 196.196.55.255 ca +196.196.56.0 - 196.196.63.255 jp +196.196.64.0 - 196.196.71.255 de +196.196.72.0 - 196.196.79.255 gb +196.196.80.0 - 196.196.87.255 us +196.196.88.0 - 196.196.95.255 nl +196.196.96.0 - 196.196.99.255 dk +196.196.100.0 - 196.196.100.255 se +196.196.101.0 - 196.196.103.255 dk +196.196.104.0 - 196.196.111.255 sc +196.196.112.0 - 196.196.135.255 us +196.196.136.0 - 196.196.143.255 se +196.196.144.0 - 196.196.159.255 sc +196.196.160.0 - 196.196.167.255 se +196.196.168.0 - 196.196.175.255 be +196.196.176.0 - 196.196.183.255 sc +196.196.184.0 - 196.196.191.255 us +196.196.192.0 - 196.196.199.255 ie +196.196.200.0 - 196.196.207.255 fi +196.196.208.0 - 196.196.223.255 sc +196.196.224.0 - 196.196.231.255 ca +196.196.232.0 - 196.196.239.255 us +196.196.240.0 - 196.196.247.255 se +196.196.248.0 - 196.196.255.255 sc +196.197.0.0 - 196.197.7.255 se +196.197.8.0 - 196.198.3.255 sc +196.198.4.0 - 196.198.11.255 se +196.198.12.0 - 196.198.15.255 sc +196.198.16.0 - 196.198.19.255 se +196.198.20.0 - 196.198.31.255 sc +196.198.32.0 - 196.198.255.255 se +196.199.0.0 - 196.199.255.255 sc +196.200.0.0 - 196.200.15.255 za 196.200.16.0 - 196.200.47.255 ke 196.200.48.0 - 196.200.63.255 ml 196.200.64.0 - 196.200.79.255 ng @@ -117787,53 +94146,72 @@ 196.200.96.0 - 196.200.111.255 er 196.200.112.0 - 196.200.127.255 ng 196.200.128.0 - 196.200.191.255 ma -196.200.192.0 - 196.200.207.255 dz -196.200.208.0 - 196.200.223.255 tz -196.201.1.0 - 196.201.1.255 us +196.200.192.0 - 196.200.207.255 za +196.200.208.0 - 196.200.223.255 zm +196.200.240.0 - 196.200.255.255 ma +196.201.1.0 - 196.201.1.255 mu 196.201.2.0 - 196.201.2.255 gh 196.201.3.0 - 196.201.3.255 eg -196.201.4.0 - 196.201.5.255 mw +196.201.4.0 - 196.201.5.255 gh 196.201.6.0 - 196.201.7.255 za 196.201.12.0 - 196.201.15.255 mw -196.201.16.0 - 196.201.23.255 zw +196.201.16.0 - 196.201.19.255 zw +196.201.20.0 - 196.201.23.255 mu 196.201.24.0 - 196.201.31.255 eg 196.201.32.0 - 196.201.63.255 gh 196.201.64.0 - 196.201.95.255 ci -196.201.128.0 - 196.201.159.255 ke +196.201.96.0 - 196.201.127.255 za +196.201.128.0 - 196.201.131.255 ke +196.201.132.0 - 196.201.132.255 a2 +196.201.133.0 - 196.201.134.255 ke +196.201.135.0 - 196.201.135.255 a2 +196.201.136.0 - 196.201.144.255 ke +196.201.145.0 - 196.201.147.255 de +196.201.148.0 - 196.201.148.255 a2 +196.201.149.0 - 196.201.159.255 ke 196.201.160.0 - 196.201.191.255 gh -196.201.192.0 - 196.201.207.255 dj -196.201.208.0 - 196.201.231.255 ke +196.201.192.0 - 196.201.197.255 dj +196.201.198.0 - 196.201.198.255 us +196.201.199.0 - 196.201.207.255 dj +196.201.208.0 - 196.201.227.255 ke +196.201.228.0 - 196.201.231.255 mu 196.201.240.0 - 196.201.247.255 eg 196.201.248.0 - 196.201.255.255 ke 196.202.0.0 - 196.202.127.255 eg 196.202.128.0 - 196.202.159.255 sd -196.202.160.0 - 196.202.191.255 ng -196.202.192.0 - 196.202.223.255 ke -196.202.224.0 - 196.202.231.255 ng +196.202.160.0 - 196.202.223.255 ke 196.202.232.0 - 196.202.239.255 cm 196.202.240.0 - 196.202.247.255 ls 196.202.248.0 - 196.202.251.255 za 196.202.252.0 - 196.202.255.255 ao 196.203.0.0 - 196.203.255.255 tn -196.204.0.0 - 196.205.255.255 eg +196.204.0.0 - 196.204.13.255 eg +196.204.14.0 - 196.204.14.255 us +196.204.15.0 - 196.205.255.255 eg 196.206.0.0 - 196.206.255.255 ma -196.207.0.0 - 196.207.9.71 ng -196.207.9.72 - 196.207.9.79 cm -196.207.9.80 - 196.207.15.255 ng +196.207.0.0 - 196.207.15.255 ng 196.207.16.0 - 196.207.31.255 ke 196.207.32.0 - 196.207.47.255 za 196.207.48.0 - 196.207.63.255 mu -196.207.128.0 - 196.207.191.255 ng +196.207.64.0 - 196.207.127.255 in +196.207.128.0 - 196.207.191.255 ke 196.207.192.0 - 196.207.255.255 sn 196.208.0.0 - 196.215.255.255 za +196.216.0.0 - 196.216.0.255 ke 196.216.1.0 - 196.216.1.255 us -196.216.2.0 - 196.216.7.255 mu +196.216.2.0 - 196.216.3.255 mu +196.216.4.0 - 196.216.7.255 ng 196.216.8.0 - 196.216.15.255 mw 196.216.16.0 - 196.216.23.255 za -196.216.32.0 - 196.216.63.255 na -196.216.64.0 - 196.216.95.255 ke -196.216.128.0 - 196.216.135.255 ke -196.216.136.0 - 196.216.139.255 ao +196.216.24.0 - 196.216.31.255 eg +196.216.32.0 - 196.216.47.255 na +196.216.48.0 - 196.216.59.255 ao +196.216.60.0 - 196.216.63.255 na +196.216.64.0 - 196.216.71.255 ke +196.216.72.0 - 196.216.95.255 mu +196.216.96.0 - 196.216.127.255 za +196.216.128.0 - 196.216.131.255 ke +196.216.132.0 - 196.216.139.255 za 196.216.140.0 - 196.216.143.255 eg 196.216.144.0 - 196.216.151.255 ng 196.216.152.0 - 196.216.155.255 za @@ -117845,16 +94223,37 @@ 196.216.164.0 - 196.216.167.255 na 196.216.168.0 - 196.216.169.255 mu 196.216.170.0 - 196.216.170.255 za -196.216.171.0 - 196.216.171.255 mu 196.216.172.0 - 196.216.175.255 za 196.216.176.0 - 196.216.179.255 ug 196.216.180.0 - 196.216.183.255 gh 196.216.184.0 - 196.216.187.255 ng 196.216.188.0 - 196.216.191.255 gh 196.216.192.0 - 196.216.195.255 za +196.216.196.0 - 196.216.197.255 ug +196.216.198.0 - 196.216.199.255 ao +196.216.200.0 - 196.216.203.255 ng +196.216.204.0 - 196.216.205.255 za +196.216.206.0 - 196.216.206.255 eg +196.216.207.0 - 196.216.207.255 na +196.216.208.0 - 196.216.211.255 ng +196.216.212.0 - 196.216.212.255 cm +196.216.213.0 - 196.216.213.255 mu +196.216.214.0 - 196.216.214.255 gh +196.216.215.0 - 196.216.215.255 za +196.216.216.0 - 196.216.217.255 cd +196.216.218.0 - 196.216.219.255 tz +196.216.220.0 - 196.216.221.255 sl +196.216.222.0 - 196.216.223.255 ke +196.216.224.0 - 196.216.225.255 zw +196.216.226.0 - 196.216.227.255 ci +196.216.228.0 - 196.216.229.255 gh +196.216.230.0 - 196.216.231.255 za +196.216.232.0 - 196.216.233.255 ke +196.216.234.0 - 196.216.235.255 tz +196.216.236.0 - 196.216.237.255 za +196.216.238.0 - 196.216.239.255 mu 196.216.240.0 - 196.216.241.255 eg 196.216.242.0 - 196.216.243.255 ke -196.216.244.0 - 196.216.244.255 tz 196.216.245.0 - 196.216.245.255 ke 196.216.246.0 - 196.216.246.255 eg 196.216.247.0 - 196.216.247.255 tz @@ -117863,27 +94262,27 @@ 196.216.251.0 - 196.216.251.255 ng 196.216.252.0 - 196.216.252.255 eg 196.216.253.0 - 196.216.253.255 ng -196.216.254.0 - 196.216.254.255 mu 196.216.255.0 - 196.216.255.255 ng 196.217.0.0 - 196.217.255.255 ma 196.218.0.0 - 196.218.247.255 eg 196.218.248.0 - 196.218.255.255 jo -196.219.0.0 - 196.219.255.255 eg -196.220.0.0 - 196.220.3.7 ng -196.220.3.8 - 196.220.3.15 ma -196.220.3.16 - 196.220.4.79 ng -196.220.4.80 - 196.220.4.83 cm -196.220.4.84 - 196.220.5.71 ng -196.220.5.72 - 196.220.5.79 gh -196.220.5.80 - 196.220.31.255 ng -196.220.32.0 - 196.220.63.255 za +196.219.0.0 - 196.219.243.249 eg +196.219.243.250 - 196.219.243.250 us +196.219.243.251 - 196.219.247.255 eg +196.219.248.0 - 196.219.255.255 jo +196.220.0.0 - 196.220.31.255 ng +196.220.32.0 - 196.220.39.255 za +196.220.40.0 - 196.220.55.255 us +196.220.56.0 - 196.220.63.255 za 196.220.64.0 - 196.220.95.255 ng 196.220.96.0 - 196.220.127.255 zw +196.220.128.0 - 196.220.159.255 ng +196.220.160.0 - 196.220.191.255 za 196.220.192.0 - 196.220.207.255 ng 196.220.208.0 - 196.220.223.255 mw 196.220.224.0 - 196.220.255.255 ng 196.221.0.0 - 196.221.255.255 eg -196.222.0.0 - 196.222.255.255 rw +196.222.0.0 - 196.222.255.255 ng 196.223.0.0 - 196.223.0.255 mu 196.223.1.0 - 196.223.1.255 ao 196.223.2.0 - 196.223.2.255 zm @@ -117907,6 +94306,31 @@ 196.223.25.0 - 196.223.25.255 ug 196.223.26.0 - 196.223.26.255 zw 196.223.27.0 - 196.223.27.255 mw +196.223.28.0 - 196.223.28.255 cd +196.223.30.0 - 196.223.31.255 za +196.223.32.0 - 196.223.32.255 cg +196.223.33.0 - 196.223.33.255 mz +196.223.34.0 - 196.223.34.255 gm +196.223.35.0 - 196.223.35.255 na +196.223.36.0 - 196.223.36.255 bi +196.223.37.0 - 196.223.37.255 sz +196.223.38.0 - 196.223.38.255 dj +196.223.39.0 - 196.223.39.255 ga +196.223.40.0 - 196.223.40.255 bj +196.223.41.0 - 196.223.41.255 mg +196.223.42.0 - 196.223.42.255 td +196.223.43.0 - 196.223.43.255 sc +196.223.44.0 - 196.223.44.255 lr +196.223.144.0 - 196.223.151.255 dj +196.224.0.0 - 196.239.255.255 tn +196.240.0.0 - 196.245.255.255 sc +196.246.0.0 - 196.246.255.255 ng +196.247.0.0 - 196.247.255.255 sc +196.248.0.0 - 196.249.63.255 za +196.249.64.0 - 196.249.127.255 tz +196.249.128.0 - 196.249.191.255 za +196.249.192.0 - 196.249.255.255 ao +196.252.0.0 - 196.255.255.255 za 197.0.0.0 - 197.31.255.255 tn 197.32.0.0 - 197.63.255.255 eg 197.64.0.0 - 197.111.255.255 za @@ -117916,11 +94340,94 @@ 197.132.0.0 - 197.135.255.255 eg 197.136.0.0 - 197.139.255.255 ke 197.140.0.0 - 197.143.255.255 dz -197.156.0.0 - 197.156.63.255 za +197.144.0.0 - 197.147.19.255 ma +197.147.20.0 - 197.147.23.255 us +197.147.24.0 - 197.147.255.255 ma +197.148.0.0 - 197.148.63.255 ao +197.148.64.0 - 197.148.71.255 za +197.148.72.0 - 197.148.79.255 gm +197.148.80.0 - 197.148.87.255 ng +197.148.88.0 - 197.148.95.255 ao +197.148.96.0 - 197.148.127.255 tg +197.148.128.0 - 197.148.191.255 mg +197.148.192.0 - 197.148.223.255 ci +197.148.224.0 - 197.148.255.255 gh +197.149.0.0 - 197.149.63.255 mg +197.149.64.0 - 197.149.127.255 ng +197.149.128.0 - 197.149.131.255 td +197.149.132.0 - 197.149.135.255 ng +197.149.136.0 - 197.149.139.255 cg +197.149.140.0 - 197.149.143.255 bi +197.149.144.0 - 197.149.147.255 za +197.149.148.0 - 197.149.151.255 ao +197.149.152.0 - 197.149.155.255 mw +197.149.156.0 - 197.149.159.255 mz +197.149.160.0 - 197.149.163.255 za +197.149.164.0 - 197.149.167.255 ng +197.149.168.0 - 197.149.171.255 gq +197.149.172.0 - 197.149.175.255 za +197.149.176.0 - 197.149.179.255 tz +197.149.180.0 - 197.149.183.255 za +197.149.184.0 - 197.149.187.255 cd +197.149.188.0 - 197.149.191.255 ng +197.149.192.0 - 197.149.255.255 gn +197.150.0.0 - 197.151.255.255 eg +197.152.0.0 - 197.152.255.255 tz +197.153.0.0 - 197.153.255.255 ma +197.154.0.0 - 197.154.255.255 et +197.155.0.0 - 197.155.63.255 za +197.155.64.0 - 197.155.64.255 ke +197.155.65.0 - 197.155.69.255 mu +197.155.70.0 - 197.155.70.255 ke +197.155.71.0 - 197.155.71.255 mu +197.155.72.0 - 197.155.72.255 ke +197.155.73.0 - 197.155.73.93 mu +197.155.73.94 - 197.155.73.94 ke +197.155.73.95 - 197.155.76.255 mu +197.155.77.0 - 197.155.77.255 ke +197.155.78.0 - 197.155.83.255 mu +197.155.84.0 - 197.155.91.255 ke +197.155.92.0 - 197.155.95.255 mu +197.155.96.0 - 197.155.127.255 za +197.155.128.0 - 197.155.191.255 ml +197.155.192.0 - 197.155.207.255 ls +197.155.208.0 - 197.155.223.255 za +197.155.224.0 - 197.155.239.255 zw +197.155.240.0 - 197.155.247.255 gh +197.155.248.0 - 197.156.63.255 za 197.156.64.0 - 197.156.127.255 et 197.156.128.0 - 197.156.191.255 ke +197.156.192.0 - 197.156.255.255 ng +197.157.0.0 - 197.157.63.255 ug +197.157.64.0 - 197.157.95.255 za +197.157.96.0 - 197.157.127.255 sc +197.157.128.0 - 197.157.191.255 rw +197.157.192.0 - 197.157.195.255 bi +197.157.196.0 - 197.157.199.255 ao +197.157.200.0 - 197.157.203.255 ls +197.157.204.0 - 197.157.207.255 zw +197.157.208.0 - 197.157.211.255 cd +197.157.212.0 - 197.157.215.255 rw +197.157.216.0 - 197.157.219.255 ng +197.157.220.0 - 197.157.223.255 za +197.157.224.0 - 197.157.227.255 sl +197.157.228.0 - 197.157.231.255 ke +197.157.232.0 - 197.157.235.255 sl +197.157.236.0 - 197.157.239.255 tz +197.157.240.0 - 197.157.243.255 za +197.157.244.0 - 197.157.247.255 so +197.157.248.0 - 197.157.251.255 cd +197.157.252.0 - 197.157.255.255 cg +197.158.0.0 - 197.158.63.255 mz +197.158.64.0 - 197.158.127.255 mg +197.158.128.0 - 197.158.191.255 zm +197.158.192.0 - 197.158.255.255 sc 197.159.0.0 - 197.159.31.255 cm +197.159.32.0 - 197.159.63.255 za 197.159.64.0 - 197.159.79.255 ng +197.159.80.0 - 197.159.95.255 gw +197.159.96.0 - 197.159.111.255 ke +197.159.112.0 - 197.159.127.255 tz 197.159.128.0 - 197.159.143.255 gh 197.159.144.0 - 197.159.159.255 mg 197.159.160.0 - 197.159.191.255 st @@ -117929,8 +94436,41 @@ 197.160.0.0 - 197.167.255.255 eg 197.168.0.0 - 197.175.255.255 za 197.176.0.0 - 197.183.255.255 ke +197.184.0.0 - 197.185.255.255 za +197.186.0.0 - 197.187.255.255 tz +197.188.0.0 - 197.188.255.255 na +197.189.0.0 - 197.189.127.255 cd +197.189.128.0 - 197.189.191.255 ls +197.189.192.0 - 197.189.255.255 za +197.190.0.0 - 197.191.255.255 gh 197.192.0.0 - 197.199.255.255 eg 197.200.0.0 - 197.207.255.255 dz +197.208.0.0 - 197.209.255.255 sd +197.210.0.0 - 197.210.255.255 ng +197.211.0.0 - 197.211.31.255 ke +197.211.32.0 - 197.211.63.255 ng +197.211.64.0 - 197.211.95.255 za +197.211.96.0 - 197.211.127.255 mw +197.211.128.0 - 197.211.191.255 za +197.211.192.0 - 197.211.255.255 zw +197.212.0.0 - 197.213.255.255 zm +197.214.0.0 - 197.214.63.255 ne +197.214.64.0 - 197.214.79.255 gq +197.214.80.0 - 197.214.95.255 gw +197.214.96.0 - 197.214.111.255 ng +197.214.112.0 - 197.214.119.255 za +197.214.120.0 - 197.214.127.255 zw +197.214.128.0 - 197.214.255.255 cg +197.215.0.0 - 197.215.127.255 sl +197.215.128.0 - 197.215.159.255 ly +197.215.160.0 - 197.215.191.255 za +197.215.192.0 - 197.215.207.255 mg +197.215.208.0 - 197.215.215.255 za +197.215.216.0 - 197.215.219.255 lr +197.215.220.0 - 197.215.223.255 cd +197.215.224.0 - 197.215.239.255 za +197.215.240.0 - 197.215.255.255 tz +197.216.0.0 - 197.217.255.255 ao 197.218.0.0 - 197.219.255.255 mz 197.220.0.0 - 197.220.31.255 zm 197.220.32.0 - 197.220.63.255 mw @@ -117948,10 +94488,81 @@ 197.221.224.0 - 197.221.255.255 zw 197.222.0.0 - 197.223.255.255 eg 197.224.0.0 - 197.227.255.255 mu +197.228.0.0 - 197.229.255.255 za +197.230.0.0 - 197.230.255.255 ma +197.231.0.0 - 197.231.31.255 mr +197.231.32.0 - 197.231.63.255 ls +197.231.64.0 - 197.231.127.255 ga +197.231.128.0 - 197.231.135.255 gm +197.231.136.0 - 197.231.143.255 ga +197.231.144.0 - 197.231.151.255 za +197.231.152.0 - 197.231.159.255 lr +197.231.160.0 - 197.231.175.255 za +197.231.176.0 - 197.231.183.255 ke +197.231.184.0 - 197.231.191.255 mu +197.231.192.0 - 197.231.195.255 bw +197.231.196.0 - 197.231.199.255 za +197.231.200.0 - 197.231.203.255 so +197.231.204.0 - 197.231.207.255 gm +197.231.208.0 - 197.231.211.255 sc +197.231.212.0 - 197.231.215.255 zw +197.231.216.0 - 197.231.219.255 mz +197.231.220.0 - 197.231.223.255 lr +197.231.224.0 - 197.231.227.255 cv +197.231.228.0 - 197.231.231.255 ly +197.231.232.0 - 197.231.235.255 za +197.231.236.0 - 197.231.239.255 ss +197.231.240.0 - 197.231.243.255 bj +197.231.244.0 - 197.231.247.255 zm +197.231.248.0 - 197.231.251.255 bi +197.231.252.0 - 197.231.255.255 cd +197.232.0.0 - 197.232.255.255 ke +197.233.0.0 - 197.233.255.255 na +197.234.0.0 - 197.234.15.255 sc +197.234.16.0 - 197.234.31.255 za +197.234.32.0 - 197.234.63.255 ng +197.234.64.0 - 197.234.127.255 na +197.234.128.0 - 197.234.207.255 za +197.234.208.0 - 197.234.215.255 bw +197.234.216.0 - 197.234.223.255 bj +197.234.224.0 - 197.234.227.255 tz +197.234.228.0 - 197.234.231.255 ng +197.234.232.0 - 197.234.235.255 za +197.234.236.0 - 197.234.239.255 ke +197.234.240.0 - 197.234.243.255 za +197.234.244.0 - 197.234.247.255 rw +197.234.248.0 - 197.234.251.255 ly +197.234.252.0 - 197.234.255.255 za +197.235.0.0 - 197.235.255.255 mz 197.236.0.0 - 197.236.255.255 za 197.237.0.0 - 197.237.255.255 ke -197.238.0.0 - 197.239.255.255 za +197.238.0.0 - 197.238.255.255 za +197.239.0.0 - 197.239.63.255 ug +197.239.64.0 - 197.239.127.255 bf +197.239.128.0 - 197.239.191.255 za +197.239.192.0 - 197.239.207.255 ke +197.239.208.0 - 197.239.223.255 mu +197.239.224.0 - 197.239.231.255 ke +197.239.232.0 - 197.239.255.255 mu 197.240.0.0 - 197.240.255.255 ng +197.241.0.0 - 197.241.127.255 dj +197.241.128.0 - 197.241.255.255 ao +197.242.0.0 - 197.242.31.255 ga +197.242.32.0 - 197.242.55.255 za +197.242.56.0 - 197.242.56.7 ke +197.242.56.8 - 197.242.95.255 za +197.242.96.0 - 197.242.127.255 ng +197.242.128.0 - 197.242.143.255 gm +197.242.144.0 - 197.242.159.255 za +197.242.160.0 - 197.242.175.255 mz +197.242.176.0 - 197.242.183.255 cf +197.242.184.0 - 197.242.191.255 mu +197.242.192.0 - 197.242.199.255 tz +197.242.200.0 - 197.242.207.255 za +197.242.208.0 - 197.242.223.255 ke +197.242.224.0 - 197.242.239.255 ci +197.242.240.0 - 197.242.255.255 ng +197.243.0.0 - 197.243.127.255 rw 197.243.128.0 - 197.243.255.255 na 197.244.0.0 - 197.244.255.255 ng 197.245.0.0 - 197.245.255.255 za @@ -117978,135 +94589,225 @@ 197.255.192.0 - 197.255.207.255 gm 197.255.208.0 - 197.255.223.255 ng 197.255.224.0 - 197.255.239.255 km -198.1.0.0 - 198.1.63.255 us +197.255.240.0 - 197.255.243.255 za +197.255.244.0 - 197.255.247.255 ng +197.255.248.0 - 197.255.251.255 ga +197.255.252.0 - 197.255.255.255 ng +198.0.0.0 - 198.1.55.255 us +198.1.56.0 - 198.1.63.255 ca +198.1.64.0 - 198.1.191.255 us +198.1.192.0 - 198.1.255.255 ca 198.2.0.0 - 198.2.15.255 us 198.2.16.0 - 198.2.31.255 cl -198.3.0.0 - 198.4.64.255 us -198.4.65.0 - 198.4.65.255 gb -198.4.66.0 - 198.4.199.255 us +198.2.32.0 - 198.2.63.255 us +198.2.64.0 - 198.2.127.255 ca +198.2.128.0 - 198.4.199.255 us 198.4.200.0 - 198.4.203.255 gb -198.4.204.0 - 198.5.134.223 us -198.5.134.224 - 198.5.134.255 il -198.5.135.0 - 198.5.136.71 us -198.5.136.72 - 198.5.136.79 il -198.5.136.80 - 198.5.149.127 us -198.5.149.128 - 198.5.149.191 ca -198.5.149.192 - 198.6.224.255 us +198.4.204.0 - 198.6.224.255 us 198.6.225.0 - 198.6.225.255 gb -198.6.226.0 - 198.10.255.255 us +198.6.226.0 - 198.7.25.255 us +198.7.26.0 - 198.7.26.255 jp +198.7.27.0 - 198.10.255.255 us 198.11.0.0 - 198.11.3.255 sa -198.11.4.0 - 198.11.7.255 us -198.11.16.0 - 198.11.127.255 us -198.12.0.0 - 198.12.31.255 us -198.12.32.0 - 198.12.63.255 br -198.13.0.0 - 198.13.127.255 us -198.14.0.0 - 198.14.255.255 us -198.15.8.0 - 198.15.15.255 us -198.15.16.0 - 198.15.63.255 au -198.16.0.0 - 198.16.31.255 us -198.17.1.0 - 198.17.1.255 jp -198.17.2.0 - 198.17.2.255 us -198.17.5.0 - 198.17.6.255 us -198.17.7.0 - 198.17.7.255 cn -198.17.8.0 - 198.17.41.255 us +198.11.4.0 - 198.12.31.255 us +198.12.32.0 - 198.12.32.255 ar +198.12.33.0 - 198.12.63.255 br +198.12.64.0 - 198.12.64.255 us +198.12.65.0 - 198.12.65.255 se +198.12.66.0 - 198.12.90.143 us +198.12.90.144 - 198.12.90.151 ca +198.12.90.152 - 198.13.127.255 us +198.13.128.0 - 198.13.255.255 ca +198.14.0.0 - 198.15.15.255 us +198.15.32.0 - 198.15.63.255 au +198.15.64.0 - 198.16.12.255 us +198.16.13.0 - 198.16.13.255 ap +198.16.14.0 - 198.16.31.255 us +198.16.32.0 - 198.16.55.255 cn +198.16.56.0 - 198.16.63.255 us +198.16.64.0 - 198.16.94.255 nl +198.16.95.0 - 198.16.124.255 us +198.16.125.0 - 198.16.127.255 nl +198.16.128.0 - 198.16.255.255 ca +198.17.0.0 - 198.17.42.255 us 198.17.43.0 - 198.17.43.255 ca 198.17.44.0 - 198.17.57.255 us 198.17.58.0 - 198.17.58.255 ca -198.17.59.0 - 198.17.59.255 us -198.17.62.0 - 198.17.69.255 us -198.17.70.0 - 198.17.70.255 sg +198.17.59.0 - 198.17.69.255 us +198.17.70.0 - 198.17.70.255 ap 198.17.71.0 - 198.17.76.255 us 198.17.77.0 - 198.17.77.255 gb -198.17.78.0 - 198.17.105.255 us -198.17.106.0 - 198.17.106.255 au -198.17.107.0 - 198.17.109.255 us -198.17.112.0 - 198.17.115.255 au +198.17.78.0 - 198.17.95.255 us +198.17.96.0 - 198.17.96.255 ca +198.17.97.0 - 198.17.112.255 us 198.17.116.0 - 198.17.116.255 us 198.17.117.0 - 198.17.117.255 it 198.17.118.0 - 198.17.118.255 jp +198.17.119.0 - 198.17.119.255 us 198.17.120.0 - 198.17.121.255 br 198.17.122.0 - 198.17.139.255 us 198.17.140.0 - 198.17.140.255 ca 198.17.141.0 - 198.17.179.255 us 198.17.180.0 - 198.17.182.255 nl 198.17.183.0 - 198.17.227.255 us -198.17.228.0 - 198.17.228.255 sg 198.17.229.0 - 198.17.230.255 us 198.17.231.0 - 198.17.232.255 br -198.17.234.0 - 198.17.239.255 us -198.17.240.0 - 198.17.241.255 au -198.17.242.0 - 198.17.255.255 us +198.17.233.0 - 198.17.255.255 us +198.20.0.0 - 198.20.7.255 us 198.20.8.0 - 198.20.15.255 ca 198.20.16.0 - 198.20.31.255 us 198.20.32.0 - 198.20.63.255 ca -198.21.0.0 - 198.21.127.255 us -198.22.1.0 - 198.22.1.255 us -198.22.2.0 - 198.22.4.255 ca +198.20.64.0 - 198.20.95.255 us +198.20.96.0 - 198.20.127.255 nl +198.20.128.0 - 198.20.164.255 us +198.20.165.0 - 198.20.165.255 ca +198.20.166.0 - 198.20.175.255 us +198.20.176.0 - 198.20.176.127 ca +198.20.176.128 - 198.20.179.7 us +198.20.179.8 - 198.20.179.15 ca +198.20.179.16 - 198.20.179.151 us +198.20.179.152 - 198.20.179.159 ca +198.20.179.160 - 198.21.21.20 us +198.21.21.21 - 198.21.21.21 ch +198.21.21.22 - 198.22.3.255 us +198.22.4.0 - 198.22.4.255 ca 198.22.5.0 - 198.22.33.255 us -198.22.34.0 - 198.22.34.255 au -198.22.35.0 - 198.22.35.255 th -198.22.37.0 - 198.22.37.255 nz -198.22.38.0 - 198.22.45.255 us -198.22.47.0 - 198.22.50.255 au +198.22.36.0 - 198.22.36.255 ca +198.22.38.0 - 198.22.46.255 us +198.22.47.0 - 198.22.47.255 au 198.22.51.0 - 198.22.51.255 de -198.22.52.0 - 198.22.59.255 us +198.22.52.0 - 198.22.60.255 us 198.22.61.0 - 198.22.61.255 au -198.22.62.0 - 198.22.92.255 us +198.22.62.0 - 198.22.91.255 us +198.22.92.0 - 198.22.92.255 gb 198.22.93.0 - 198.22.97.255 de -198.22.99.0 - 198.22.101.255 us +198.22.98.0 - 198.22.101.255 us 198.22.102.0 - 198.22.102.255 ca 198.22.103.0 - 198.22.187.255 us 198.22.188.0 - 198.22.188.255 ca -198.22.189.0 - 198.22.236.255 us +198.22.189.0 - 198.22.203.255 us +198.22.204.0 - 198.22.205.255 ca +198.22.206.0 - 198.22.236.255 us 198.22.237.0 - 198.22.237.255 ca 198.22.238.0 - 198.22.249.255 us 198.22.250.0 - 198.22.251.255 cl -198.22.252.0 - 198.23.63.255 us -198.24.0.0 - 198.27.3.255 us +198.22.252.0 - 198.23.79.79 us +198.23.79.80 - 198.23.79.159 gb +198.23.79.160 - 198.23.162.255 us +198.23.163.0 - 198.23.163.255 ca +198.23.164.0 - 198.23.253.255 us +198.23.254.0 - 198.23.254.255 gb +198.23.255.0 - 198.24.4.255 us +198.24.5.0 - 198.24.5.255 br +198.24.6.0 - 198.24.63.223 us +198.24.63.224 - 198.24.63.255 gb +198.24.64.0 - 198.27.3.255 us 198.27.4.0 - 198.27.8.255 nz +198.27.9.0 - 198.27.11.255 us +198.27.12.0 - 198.27.15.255 ca 198.27.16.0 - 198.27.63.255 us -198.28.0.0 - 198.32.97.255 us +198.27.64.0 - 198.27.77.255 ca +198.27.78.0 - 198.27.78.255 us +198.27.79.0 - 198.27.79.59 ca +198.27.79.60 - 198.27.79.63 us +198.27.79.64 - 198.27.79.119 ca +198.27.79.120 - 198.27.79.123 us +198.27.79.124 - 198.27.86.71 ca +198.27.86.72 - 198.27.86.72 us +198.27.86.73 - 198.27.86.157 ca +198.27.86.158 - 198.27.86.158 us +198.27.86.159 - 198.27.86.255 ca +198.27.87.0 - 198.27.89.255 us +198.27.90.0 - 198.27.96.139 ca +198.27.96.140 - 198.27.96.143 us +198.27.96.144 - 198.27.103.255 ca +198.27.104.0 - 198.27.105.255 us +198.27.106.0 - 198.27.106.175 ca +198.27.106.176 - 198.27.106.179 by +198.27.106.180 - 198.27.107.255 ca +198.27.108.0 - 198.27.109.255 us +198.27.110.0 - 198.27.111.255 ca +198.27.112.0 - 198.27.113.255 us +198.27.114.0 - 198.27.115.135 ca +198.27.115.136 - 198.27.115.139 us +198.27.115.140 - 198.27.115.255 ca +198.27.116.0 - 198.27.116.63 us +198.27.116.64 - 198.27.119.255 ca +198.27.120.0 - 198.27.120.239 us +198.27.120.240 - 198.27.120.255 ca +198.27.121.0 - 198.27.121.255 us +198.27.122.0 - 198.27.125.255 ca +198.27.126.0 - 198.28.68.255 us +198.28.69.0 - 198.28.69.255 gb +198.28.70.0 - 198.28.91.255 us +198.28.92.0 - 198.28.92.255 gb +198.28.93.0 - 198.32.7.255 us +198.32.8.0 - 198.32.8.255 kn +198.32.9.0 - 198.32.97.255 us 198.32.98.0 - 198.32.98.255 kn -198.32.99.0 - 198.32.173.255 us +198.32.99.0 - 198.32.144.255 us +198.32.145.0 - 198.32.145.255 kn +198.32.146.0 - 198.32.146.255 us +198.32.147.0 - 198.32.147.255 kn +198.32.148.0 - 198.32.173.255 us 198.32.174.0 - 198.32.174.255 kn 198.32.175.0 - 198.32.186.255 us 198.32.187.0 - 198.32.187.255 kn -198.32.188.0 - 198.32.193.255 us -198.32.194.0 - 198.32.194.255 kn -198.32.195.0 - 198.32.196.255 us -198.32.197.0 - 198.32.197.255 kn -198.32.198.0 - 198.32.255.255 us +198.32.188.0 - 198.32.192.255 us +198.32.193.0 - 198.32.193.255 kn +198.32.194.0 - 198.32.255.255 us 198.33.0.0 - 198.34.255.255 ca -198.35.0.0 - 198.36.31.255 us -198.36.32.0 - 198.36.43.255 sa -198.36.44.0 - 198.36.44.255 us -198.36.45.0 - 198.36.45.255 sa -198.36.46.0 - 198.36.46.255 us -198.36.64.0 - 198.37.255.255 us +198.35.0.0 - 198.35.41.255 us +198.35.42.0 - 198.35.43.255 ca +198.35.44.0 - 198.36.27.255 us +198.36.28.0 - 198.36.31.255 vi +198.36.32.0 - 198.36.46.255 sa +198.36.47.0 - 198.36.71.255 us +198.36.72.0 - 198.36.72.255 ap +198.36.73.0 - 198.36.85.255 us +198.36.86.0 - 198.36.87.255 eu +198.36.88.0 - 198.36.115.255 us +198.36.116.0 - 198.36.119.255 ca +198.36.120.0 - 198.37.159.255 us +198.37.160.0 - 198.37.191.255 ca +198.37.192.0 - 198.37.255.255 us 198.38.0.0 - 198.38.3.255 ca -198.38.4.0 - 198.38.47.255 us -198.38.64.0 - 198.38.79.255 us -198.38.128.0 - 198.39.99.255 us -198.39.100.0 - 198.39.103.255 gb -198.39.104.0 - 198.41.15.255 us -198.41.16.0 - 198.41.31.255 nz -198.41.32.0 - 198.41.47.255 cl -198.41.64.0 - 198.41.79.255 us -198.42.0.0 - 198.42.3.255 us +198.38.4.0 - 198.38.6.255 us +198.38.7.0 - 198.38.7.255 ca +198.38.8.0 - 198.39.99.255 us +198.39.100.0 - 198.39.115.255 gb +198.39.116.0 - 198.40.47.255 us +198.40.48.0 - 198.40.48.255 cn +198.40.49.0 - 198.40.49.255 us +198.40.50.0 - 198.40.50.255 cn +198.40.51.0 - 198.40.58.255 us +198.40.59.0 - 198.40.59.255 cn +198.40.60.0 - 198.40.62.255 us +198.40.63.0 - 198.40.63.255 cn +198.40.64.0 - 198.41.15.255 us +198.41.28.0 - 198.41.31.255 ca +198.41.32.0 - 198.41.46.255 cl +198.41.47.0 - 198.41.223.255 us +198.41.224.0 - 198.41.227.255 pe +198.41.228.0 - 198.41.231.255 ar +198.41.232.0 - 198.41.232.255 sg +198.41.233.0 - 198.41.233.255 us +198.41.234.0 - 198.41.234.255 hk +198.41.235.0 - 198.41.235.255 us +198.41.236.0 - 198.41.239.255 nz +198.41.240.0 - 198.41.243.255 de +198.41.244.0 - 198.41.245.255 in +198.41.246.0 - 198.42.3.255 us 198.42.4.0 - 198.42.4.255 ca 198.42.5.0 - 198.42.17.255 us 198.42.18.0 - 198.42.18.255 ca -198.42.19.0 - 198.42.21.255 us -198.42.22.0 - 198.42.22.255 ca -198.42.23.0 - 198.42.24.255 us +198.42.19.0 - 198.42.24.255 us 198.42.25.0 - 198.42.25.255 ca 198.42.26.0 - 198.42.35.255 us 198.42.36.0 - 198.42.36.255 ca 198.42.37.0 - 198.42.46.255 us 198.42.47.0 - 198.42.47.255 ca -198.42.48.0 - 198.42.54.255 us -198.42.55.0 - 198.42.55.255 ca -198.42.56.0 - 198.42.56.255 us +198.42.48.0 - 198.42.56.255 us 198.42.57.0 - 198.42.57.255 ca 198.42.58.0 - 198.42.72.255 us 198.42.73.0 - 198.42.73.255 ca @@ -118128,9 +94829,7 @@ 198.42.131.0 - 198.42.132.255 ca 198.42.133.0 - 198.42.136.255 us 198.42.137.0 - 198.42.138.255 ca -198.42.139.0 - 198.42.143.255 us -198.42.144.0 - 198.42.144.255 ca -198.42.145.0 - 198.42.146.255 us +198.42.139.0 - 198.42.146.255 us 198.42.147.0 - 198.42.147.255 ca 198.42.148.0 - 198.42.148.255 us 198.42.149.0 - 198.42.150.255 ca @@ -118148,12 +94847,12 @@ 198.42.202.0 - 198.42.202.255 ca 198.42.203.0 - 198.42.203.255 us 198.42.204.0 - 198.42.204.255 ca -198.42.205.0 - 198.42.205.255 us -198.42.206.0 - 198.42.206.255 ca -198.42.207.0 - 198.42.207.255 us +198.42.205.0 - 198.42.207.255 us 198.42.208.0 - 198.42.209.255 ca 198.42.210.0 - 198.42.211.255 us -198.42.212.0 - 198.42.215.255 ca +198.42.212.0 - 198.42.212.255 ca +198.42.213.0 - 198.42.213.255 us +198.42.214.0 - 198.42.215.255 ca 198.42.216.0 - 198.42.216.255 us 198.42.217.0 - 198.42.217.255 ca 198.42.218.0 - 198.42.223.255 us @@ -118161,97 +94860,223 @@ 198.42.226.0 - 198.42.226.255 us 198.42.227.0 - 198.42.227.255 ca 198.42.228.0 - 198.42.233.255 us -198.42.234.0 - 198.42.237.255 ca +198.42.234.0 - 198.42.235.255 ca +198.42.236.0 - 198.42.236.255 us +198.42.237.0 - 198.42.237.255 ca 198.42.238.0 - 198.42.244.255 us 198.42.245.0 - 198.42.245.255 ca 198.42.246.0 - 198.42.253.255 us 198.42.254.0 - 198.42.254.255 ca -198.42.255.0 - 198.47.255.255 us +198.42.255.0 - 198.43.99.255 us +198.43.100.0 - 198.43.100.255 eu +198.43.101.0 - 198.44.151.39 us +198.44.151.40 - 198.44.151.47 au +198.44.151.48 - 198.45.23.23 us +198.45.23.24 - 198.45.23.25 ap +198.45.23.26 - 198.45.25.255 us +198.45.26.0 - 198.45.26.255 eu +198.45.27.0 - 198.46.154.199 us +198.46.154.200 - 198.46.154.207 ca +198.46.154.208 - 198.47.43.255 us +198.47.44.0 - 198.47.47.255 ca +198.47.48.0 - 198.47.255.255 us 198.48.0.0 - 198.48.3.255 nz -198.48.4.0 - 198.48.47.255 us -198.48.64.0 - 198.48.95.255 us +198.48.4.0 - 198.48.127.255 us +198.48.128.0 - 198.49.0.255 ca 198.49.1.0 - 198.49.1.255 us -198.49.2.0 - 198.49.2.255 hk -198.49.3.0 - 198.49.3.255 nz -198.49.4.0 - 198.49.31.255 us -198.49.32.0 - 198.49.39.255 au -198.49.40.0 - 198.49.47.255 us -198.49.80.0 - 198.49.85.255 us -198.49.87.0 - 198.49.87.255 au -198.49.88.0 - 198.49.111.255 us +198.49.4.0 - 198.49.111.255 us 198.49.112.0 - 198.49.113.255 th 198.49.114.0 - 198.49.123.255 us 198.49.124.0 - 198.49.124.255 au 198.49.125.0 - 198.49.127.255 us -198.49.128.0 - 198.49.133.255 br -198.49.134.0 - 198.49.134.255 us -198.49.136.0 - 198.49.137.255 us +198.49.128.0 - 198.49.131.255 co +198.49.132.0 - 198.49.133.255 br +198.49.134.0 - 198.49.140.255 us 198.49.141.0 - 198.49.141.255 ca -198.49.142.0 - 198.49.142.255 us -198.49.144.0 - 198.49.163.255 us -198.49.164.0 - 198.49.164.255 ar +198.49.142.0 - 198.49.163.255 us +198.49.164.0 - 198.49.164.255 cr 198.49.165.0 - 198.49.174.255 us 198.49.175.0 - 198.49.175.255 ca 198.49.176.0 - 198.50.15.255 us 198.50.16.0 - 198.50.23.255 br -198.50.32.0 - 198.50.95.255 us +198.50.24.0 - 198.50.95.255 us +198.50.96.0 - 198.50.102.7 ca +198.50.102.8 - 198.50.102.15 us +198.50.102.16 - 198.50.142.127 ca +198.50.142.128 - 198.50.142.159 us +198.50.142.160 - 198.50.151.255 ca +198.50.152.0 - 198.50.155.255 us +198.50.156.0 - 198.50.159.156 ca +198.50.159.157 - 198.50.159.157 us +198.50.159.158 - 198.50.160.111 ca +198.50.160.112 - 198.50.160.127 us +198.50.160.128 - 198.50.164.255 ca +198.50.165.0 - 198.50.165.127 us +198.50.165.128 - 198.50.166.55 ca +198.50.166.56 - 198.50.166.59 us +198.50.166.60 - 198.50.167.83 ca +198.50.167.84 - 198.50.167.87 us +198.50.167.88 - 198.50.179.27 ca +198.50.179.28 - 198.50.179.31 us +198.50.179.32 - 198.50.179.255 ca +198.50.180.0 - 198.50.180.127 us +198.50.180.128 - 198.50.183.231 ca +198.50.183.232 - 198.50.183.239 us +198.50.183.240 - 198.50.187.247 ca +198.50.187.248 - 198.50.187.255 us +198.50.188.0 - 198.50.198.63 ca +198.50.198.64 - 198.50.198.71 us +198.50.198.72 - 198.50.199.15 ca +198.50.199.16 - 198.50.199.19 us +198.50.199.20 - 198.50.204.147 ca +198.50.204.148 - 198.50.204.151 us +198.50.204.152 - 198.50.205.159 ca +198.50.205.160 - 198.50.205.191 us +198.50.205.192 - 198.50.206.3 ca +198.50.206.4 - 198.50.206.7 es +198.50.206.8 - 198.50.206.215 ca +198.50.206.216 - 198.50.206.219 us +198.50.206.220 - 198.50.211.223 ca +198.50.211.224 - 198.50.211.227 us +198.50.211.228 - 198.50.215.27 ca +198.50.215.28 - 198.50.215.28 us +198.50.215.29 - 198.50.215.255 ca +198.50.216.0 - 198.50.216.15 us +198.50.216.16 - 198.50.218.75 ca +198.50.218.76 - 198.50.218.79 us +198.50.218.80 - 198.50.219.159 ca +198.50.219.160 - 198.50.219.163 fr +198.50.219.164 - 198.50.221.59 ca +198.50.221.60 - 198.50.221.63 by +198.50.221.64 - 198.50.224.171 ca +198.50.224.172 - 198.50.224.175 by +198.50.224.176 - 198.50.226.223 ca +198.50.226.224 - 198.50.226.239 de +198.50.226.240 - 198.50.230.223 ca +198.50.230.224 - 198.50.230.227 us +198.50.230.228 - 198.50.234.199 ca +198.50.234.200 - 198.50.234.203 us +198.50.234.204 - 198.50.235.11 ca +198.50.235.12 - 198.50.235.12 us +198.50.235.13 - 198.50.238.96 ca +198.50.238.97 - 198.50.238.97 us +198.50.238.98 - 198.50.238.255 ca +198.50.239.0 - 198.50.239.255 us +198.50.240.0 - 198.50.242.55 ca +198.50.242.56 - 198.50.242.63 us +198.50.242.64 - 198.50.250.23 ca +198.50.250.24 - 198.50.250.31 us +198.50.250.32 - 198.50.252.239 ca +198.50.252.240 - 198.50.252.243 us +198.50.252.244 - 198.50.253.247 ca +198.50.253.248 - 198.50.253.255 sn +198.50.254.0 - 198.50.255.255 ca 198.51.0.0 - 198.51.3.255 us -198.51.4.0 - 198.51.7.255 au 198.51.8.0 - 198.51.11.255 us 198.51.12.0 - 198.51.12.255 sa 198.51.13.0 - 198.51.70.255 us 198.51.71.0 - 198.51.71.255 co -198.51.72.0 - 198.51.98.255 us -198.51.99.0 - 198.51.99.255 hk -198.51.101.0 - 198.51.101.255 id +198.51.72.0 - 198.51.74.255 us +198.51.75.0 - 198.51.75.255 ca +198.51.76.0 - 198.51.99.255 us 198.51.102.0 - 198.51.103.255 us +198.51.104.0 - 198.51.107.255 ca 198.51.108.0 - 198.51.111.255 us 198.51.112.0 - 198.51.117.255 ca -198.51.118.0 - 198.51.131.255 us -198.51.141.0 - 198.51.142.255 us +198.51.118.0 - 198.51.135.255 us +198.51.136.0 - 198.51.139.255 ca +198.51.140.0 - 198.51.142.255 us 198.51.143.0 - 198.51.146.255 sy 198.51.147.0 - 198.51.150.255 us 198.51.151.0 - 198.51.151.255 ca 198.51.152.0 - 198.51.155.255 us 198.51.156.0 - 198.51.156.255 ca -198.51.157.0 - 198.51.157.255 us -198.51.159.0 - 198.51.185.255 us -198.51.186.0 - 198.51.186.255 au -198.51.187.0 - 198.51.194.255 us +198.51.157.0 - 198.51.194.255 us 198.51.195.0 - 198.51.195.255 nz -198.51.196.0 - 198.51.196.255 au -198.51.197.0 - 198.51.209.255 us -198.51.210.0 - 198.51.211.255 au -198.51.212.0 - 198.52.31.255 us +198.51.196.0 - 198.51.209.255 us +198.51.210.0 - 198.51.210.255 au +198.51.212.0 - 198.51.254.255 us +198.51.255.0 - 198.51.255.255 ca +198.52.0.0 - 198.52.29.255 us +198.52.30.0 - 198.52.31.255 as 198.52.32.0 - 198.52.42.255 ca 198.52.43.0 - 198.52.43.255 bb -198.52.44.0 - 198.52.47.255 ca -198.52.64.0 - 198.52.95.255 us +198.52.44.0 - 198.52.63.255 ca +198.52.64.0 - 198.52.159.255 us +198.52.160.0 - 198.52.161.255 gb +198.52.162.0 - 198.52.171.255 us +198.52.172.0 - 198.52.172.255 ca +198.52.173.0 - 198.52.255.255 us 198.53.0.0 - 198.53.255.255 ca -198.54.0.0 - 198.54.127.255 za +198.54.0.0 - 198.54.0.255 us +198.54.1.0 - 198.54.10.255 za +198.54.11.0 - 198.54.14.255 us +198.54.15.0 - 198.54.51.255 za +198.54.52.0 - 198.54.52.255 mu +198.54.53.0 - 198.54.61.255 za +198.54.62.0 - 198.54.63.255 us +198.54.64.0 - 198.54.66.255 za +198.54.67.0 - 198.54.67.255 mu +198.54.68.0 - 198.54.80.255 za +198.54.81.0 - 198.54.82.255 us +198.54.83.0 - 198.54.83.255 mu +198.54.84.0 - 198.54.87.255 za +198.54.88.0 - 198.54.90.255 us +198.54.91.0 - 198.54.91.255 za +198.54.92.0 - 198.54.97.255 us +198.54.98.0 - 198.54.99.255 za +198.54.100.0 - 198.54.103.255 ca +198.54.104.0 - 198.54.140.255 us 198.54.141.0 - 198.54.141.255 za 198.54.142.0 - 198.54.145.255 na -198.54.146.0 - 198.54.255.255 za -198.55.0.0 - 198.55.15.255 us -198.55.16.0 - 198.55.31.255 pr -198.55.32.0 - 198.55.47.255 us -198.55.64.0 - 198.55.95.255 us -198.55.128.0 - 198.56.15.255 us -198.56.16.0 - 198.56.31.255 ph -198.56.32.0 - 198.56.127.255 us -198.57.0.0 - 198.57.63.255 us +198.54.146.0 - 198.54.151.255 za +198.54.152.0 - 198.54.153.255 us +198.54.154.0 - 198.54.163.255 za +198.54.164.0 - 198.54.164.255 us +198.54.165.0 - 198.54.165.255 za +198.54.166.0 - 198.54.169.255 us +198.54.170.0 - 198.54.170.255 za +198.54.171.0 - 198.54.172.255 us +198.54.173.0 - 198.54.181.255 za +198.54.182.0 - 198.54.182.255 us +198.54.183.0 - 198.54.199.255 za +198.54.200.0 - 198.54.201.255 us +198.54.202.0 - 198.54.210.255 za +198.54.211.0 - 198.54.211.255 us +198.54.212.0 - 198.54.215.255 ca +198.54.216.0 - 198.54.218.255 us +198.54.219.0 - 198.54.220.255 za +198.54.221.0 - 198.54.222.255 us +198.54.223.0 - 198.54.223.255 za +198.54.224.0 - 198.54.224.255 us +198.54.225.0 - 198.54.229.255 za +198.54.230.0 - 198.54.230.255 us +198.54.231.0 - 198.54.232.255 za +198.54.233.0 - 198.54.233.255 us +198.54.234.0 - 198.54.234.255 za +198.54.235.0 - 198.54.246.255 us +198.54.247.0 - 198.54.254.255 za +198.54.255.0 - 198.55.15.255 us +198.55.16.0 - 198.55.25.255 pr +198.55.26.0 - 198.55.47.255 us +198.55.48.0 - 198.55.63.255 ca +198.55.64.0 - 198.55.227.255 us +198.55.228.0 - 198.55.231.255 ca +198.55.232.0 - 198.56.55.255 us +198.56.56.0 - 198.56.59.255 vg +198.56.60.0 - 198.56.63.255 bb +198.56.64.0 - 198.57.25.255 us +198.57.26.0 - 198.57.27.255 ca +198.57.28.0 - 198.57.63.255 us 198.57.64.0 - 198.57.79.255 ca +198.57.80.0 - 198.57.255.255 us 198.58.0.0 - 198.58.1.255 jm -198.58.2.0 - 198.58.7.255 us -198.58.8.0 - 198.58.15.255 br -198.58.16.0 - 198.58.39.255 us -198.58.64.0 - 198.58.71.255 us -198.59.0.0 - 198.60.255.255 us -198.61.0.0 - 198.61.3.255 nz -198.61.4.0 - 198.61.7.255 us -198.61.8.0 - 198.61.15.255 au -198.61.16.0 - 198.61.95.255 us -198.62.0.0 - 198.62.15.255 us +198.58.2.0 - 198.58.6.255 us +198.58.7.0 - 198.58.7.255 ca +198.58.8.0 - 198.58.12.255 br +198.58.13.0 - 198.58.127.255 us +198.58.128.0 - 198.58.255.255 ca +198.59.0.0 - 198.62.15.255 us 198.62.16.0 - 198.62.31.255 ca 198.62.32.0 - 198.62.93.255 us 198.62.94.0 - 198.62.94.255 ca @@ -118259,54 +95084,51 @@ 198.62.112.0 - 198.62.112.255 ca 198.62.113.0 - 198.62.157.255 us 198.62.158.0 - 198.62.159.255 ca -198.62.160.0 - 198.62.174.255 us +198.62.160.0 - 198.62.163.255 us +198.62.164.0 - 198.62.164.255 ca +198.62.165.0 - 198.62.174.255 us 198.62.175.0 - 198.62.175.255 ca -198.62.176.0 - 198.65.159.255 us -198.65.160.0 - 198.65.160.255 a1 -198.65.161.0 - 198.65.163.255 us -198.65.164.0 - 198.65.164.127 a1 -198.65.164.128 - 198.65.164.255 us -198.65.165.0 - 198.65.165.127 a1 -198.65.165.128 - 198.65.166.191 us -198.65.166.192 - 198.65.166.255 a1 -198.65.167.0 - 198.65.167.191 us -198.65.167.192 - 198.65.167.223 a1 -198.65.167.224 - 198.68.17.255 us +198.62.176.0 - 198.68.17.255 us 198.68.18.0 - 198.68.19.255 ec -198.68.20.0 - 198.68.176.255 us -198.68.177.0 - 198.68.177.7 ca -198.68.177.8 - 198.68.216.127 us -198.68.216.128 - 198.68.216.143 pr -198.68.216.144 - 198.68.222.63 us -198.68.222.64 - 198.68.222.71 pr -198.68.222.72 - 198.68.239.255 us +198.68.20.0 - 198.68.239.255 us 198.68.240.0 - 198.68.247.255 co 198.68.248.0 - 198.69.11.255 us 198.69.12.0 - 198.69.13.255 ye 198.69.14.0 - 198.69.39.255 us 198.69.40.0 - 198.69.47.255 pr -198.69.48.0 - 198.70.0.207 us -198.70.0.208 - 198.70.0.215 ge -198.70.0.216 - 198.70.62.79 us -198.70.62.80 - 198.70.62.95 ca -198.70.62.96 - 198.70.195.255 us +198.69.48.0 - 198.70.195.255 us 198.70.196.0 - 198.70.196.255 ca -198.70.197.0 - 198.71.127.255 us -198.72.0.0 - 198.72.127.255 us -198.73.31.0 - 198.73.37.255 ca +198.70.197.0 - 198.72.23.255 us +198.72.24.0 - 198.72.31.255 ca +198.72.32.0 - 198.72.47.255 us +198.72.48.0 - 198.72.61.127 ca +198.72.61.128 - 198.72.61.255 us +198.72.62.0 - 198.72.62.255 ca +198.72.63.0 - 198.72.95.255 us +198.72.96.0 - 198.72.127.255 ca +198.72.128.0 - 198.73.30.255 us +198.73.31.0 - 198.73.31.255 ca +198.73.32.0 - 198.73.32.255 us +198.73.33.0 - 198.73.37.255 ca 198.73.38.0 - 198.73.38.255 us -198.73.39.0 - 198.73.157.255 ca +198.73.39.0 - 198.73.94.255 ca +198.73.95.0 - 198.73.103.255 us +198.73.104.0 - 198.73.157.255 ca 198.73.158.0 - 198.73.160.255 us 198.73.161.0 - 198.73.171.255 ca 198.73.172.0 - 198.73.175.255 us -198.73.176.0 - 198.73.219.255 ca +198.73.176.0 - 198.73.191.255 ca +198.73.192.0 - 198.73.207.255 us +198.73.208.0 - 198.73.208.255 ca +198.73.209.0 - 198.73.209.255 us +198.73.210.0 - 198.73.219.255 ca 198.73.220.0 - 198.73.220.255 jp 198.73.221.0 - 198.73.221.255 ca 198.73.222.0 - 198.73.239.255 us 198.73.240.0 - 198.73.252.255 ca 198.73.253.0 - 198.73.253.255 us 198.73.254.0 - 198.73.254.255 ca -198.74.0.0 - 198.77.66.255 us +198.73.255.0 - 198.77.66.255 us 198.77.67.0 - 198.77.67.255 as 198.77.68.0 - 198.77.73.255 us 198.77.74.0 - 198.77.75.255 as @@ -118316,30 +95138,64 @@ 198.80.120.0 - 198.80.120.255 gb 198.80.121.0 - 198.80.121.255 us 198.80.122.0 - 198.80.123.255 gb -198.80.124.0 - 198.80.255.255 us +198.80.124.0 - 198.80.160.255 us +198.80.161.0 - 198.80.161.255 ap +198.80.162.0 - 198.80.255.255 us 198.81.0.0 - 198.81.3.255 jp 198.81.4.0 - 198.81.7.255 us 198.81.8.0 - 198.81.11.255 br 198.81.12.0 - 198.81.232.255 us 198.81.233.0 - 198.81.233.255 gu -198.81.234.0 - 198.89.7.255 us -198.89.8.0 - 198.89.15.255 ca -198.89.16.0 - 198.89.47.255 us -198.89.64.0 - 198.89.95.255 us -198.89.128.0 - 198.93.47.255 us -198.93.48.0 - 198.93.51.255 an +198.81.234.0 - 198.84.13.255 us +198.84.14.0 - 198.84.15.255 ca +198.84.16.0 - 198.84.127.255 us +198.84.128.0 - 198.84.255.255 ca +198.85.0.0 - 198.89.7.255 us +198.89.8.0 - 198.89.14.255 ca +198.89.15.0 - 198.90.5.255 us +198.90.6.0 - 198.90.7.255 ca +198.90.8.0 - 198.90.64.255 us +198.90.65.0 - 198.90.65.255 ap +198.90.66.0 - 198.90.75.255 us +198.90.76.0 - 198.90.95.255 ca +198.90.96.0 - 198.91.127.255 us +198.91.128.0 - 198.91.255.255 ca +198.92.0.0 - 198.93.47.255 us +198.93.48.0 - 198.93.51.255 cw 198.93.52.0 - 198.93.175.255 us -198.93.176.0 - 198.93.183.255 an -198.93.184.0 - 198.95.255.255 us -198.96.0.0 - 198.96.134.255 ca +198.93.176.0 - 198.93.183.255 cw +198.93.184.0 - 198.96.0.255 us +198.96.1.0 - 198.96.3.255 ca +198.96.4.0 - 198.96.5.255 us +198.96.6.0 - 198.96.21.255 ca +198.96.22.0 - 198.96.22.255 us +198.96.23.0 - 198.96.28.255 ca +198.96.29.0 - 198.96.29.255 us +198.96.30.0 - 198.96.62.255 ca +198.96.63.0 - 198.96.63.255 us +198.96.64.0 - 198.96.87.255 ca +198.96.88.0 - 198.96.95.255 us +198.96.96.0 - 198.96.134.255 ca 198.96.135.0 - 198.96.136.255 gb -198.96.137.0 - 198.96.213.255 ca -198.96.214.0 - 198.96.214.255 us -198.96.216.0 - 198.96.239.255 ca +198.96.137.0 - 198.96.171.255 ca +198.96.172.0 - 198.96.172.255 us +198.96.173.0 - 198.96.213.255 ca +198.96.214.0 - 198.96.215.255 us +198.96.216.0 - 198.96.219.255 ca +198.96.220.0 - 198.96.222.255 us +198.96.223.0 - 198.96.239.255 ca 198.96.240.0 - 198.96.244.255 us 198.96.245.0 - 198.96.245.255 gb 198.96.246.0 - 198.96.255.255 ca -198.97.0.0 - 198.99.67.255 us +198.97.0.0 - 198.97.210.255 us +198.97.211.0 - 198.97.215.255 ca +198.97.216.0 - 198.97.236.255 us +198.97.237.0 - 198.97.237.255 ca +198.97.238.0 - 198.98.183.255 us +198.98.184.0 - 198.98.191.255 ca +198.98.192.0 - 198.99.27.255 us +198.99.28.0 - 198.99.31.255 ca +198.99.32.0 - 198.99.67.255 us 198.99.68.0 - 198.99.68.255 gb 198.99.69.0 - 198.99.147.255 us 198.99.148.0 - 198.99.148.255 ch @@ -118352,23 +95208,48 @@ 198.99.222.0 - 198.99.222.255 ch 198.99.223.0 - 198.100.127.255 us 198.100.128.0 - 198.100.135.255 ca -198.101.0.0 - 198.101.63.255 us -198.102.0.0 - 198.102.173.255 us +198.100.136.0 - 198.100.143.255 us +198.100.144.0 - 198.100.145.135 ca +198.100.145.136 - 198.100.145.136 us +198.100.145.137 - 198.100.151.255 ca +198.100.152.0 - 198.100.153.255 us +198.100.154.0 - 198.100.155.255 ca +198.100.156.0 - 198.100.158.255 us +198.100.159.0 - 198.100.159.255 ca +198.100.160.0 - 198.101.27.255 us +198.101.28.0 - 198.101.31.255 dm +198.101.32.0 - 198.102.173.255 us 198.102.174.0 - 198.102.174.255 ca -198.102.175.0 - 198.102.223.255 us +198.102.175.0 - 198.102.218.255 us +198.102.219.0 - 198.102.219.127 eu +198.102.219.128 - 198.102.219.191 gb +198.102.219.192 - 198.102.219.255 eu +198.102.220.0 - 198.102.220.255 us +198.102.221.0 - 198.102.221.255 ca +198.102.222.0 - 198.102.223.255 us 198.102.224.0 - 198.102.227.255 ca 198.102.228.0 - 198.102.255.255 us 198.103.0.0 - 198.103.255.255 ca 198.104.0.0 - 198.105.16.255 us 198.105.17.0 - 198.105.22.255 ca -198.105.23.0 - 198.105.25.255 us -198.105.32.0 - 198.105.47.255 us -198.105.64.0 - 198.105.79.255 us -198.105.128.0 - 198.112.5.255 us +198.105.23.0 - 198.105.75.255 us +198.105.76.0 - 198.105.77.255 ap +198.105.78.0 - 198.105.111.255 us +198.105.112.0 - 198.105.115.255 nl +198.105.116.0 - 198.105.116.255 us +198.105.117.0 - 198.105.117.255 nl +198.105.118.0 - 198.105.119.255 it +198.105.120.0 - 198.105.120.255 nz +198.105.121.0 - 198.105.121.255 se +198.105.122.0 - 198.105.123.255 cz +198.105.124.0 - 198.105.124.255 us +198.105.125.0 - 198.105.125.255 de +198.105.126.0 - 198.105.127.255 au +198.105.128.0 - 198.105.221.189 us +198.105.221.190 - 198.105.221.190 sg +198.105.221.191 - 198.112.5.255 us 198.112.6.0 - 198.112.6.255 jp -198.112.7.0 - 198.116.24.255 us -198.116.25.0 - 198.116.25.255 ke -198.116.26.0 - 198.116.29.255 us +198.112.7.0 - 198.116.29.255 us 198.116.30.0 - 198.116.30.255 es 198.116.31.0 - 198.133.31.255 us 198.133.32.0 - 198.133.37.255 ca @@ -118377,30 +95258,28 @@ 198.133.48.0 - 198.133.62.255 us 198.133.63.0 - 198.133.72.255 ca 198.133.73.0 - 198.133.74.255 us +198.133.75.0 - 198.133.75.255 ca 198.133.76.0 - 198.133.79.255 us 198.133.80.0 - 198.133.85.255 gb 198.133.86.0 - 198.133.139.255 us 198.133.140.0 - 198.133.140.255 ch -198.133.141.0 - 198.133.142.255 us -198.133.144.0 - 198.133.161.255 us +198.133.141.0 - 198.133.161.255 us 198.133.162.0 - 198.133.164.255 ca -198.133.165.0 - 198.133.166.255 us -198.133.168.0 - 198.133.172.255 us +198.133.165.0 - 198.133.173.255 us 198.133.174.0 - 198.133.174.255 ca -198.133.175.0 - 198.133.205.255 us -198.133.206.0 - 198.133.206.255 jp -198.133.207.0 - 198.133.225.255 us +198.133.175.0 - 198.133.225.255 us 198.133.226.0 - 198.133.226.255 gb 198.133.227.0 - 198.133.230.255 us 198.133.231.0 - 198.133.231.255 ca -198.133.232.0 - 198.134.170.255 us +198.133.232.0 - 198.134.27.255 us +198.134.28.0 - 198.134.31.255 ca +198.134.32.0 - 198.134.170.255 us 198.134.171.0 - 198.134.171.255 ca 198.134.172.0 - 198.134.218.255 us 198.134.219.0 - 198.134.219.255 ca 198.134.220.0 - 198.135.71.255 us 198.135.72.0 - 198.135.72.255 ca -198.135.73.0 - 198.135.73.255 us -198.135.75.0 - 198.135.106.255 us +198.135.73.0 - 198.135.106.255 us 198.135.107.0 - 198.135.107.255 ca 198.135.108.0 - 198.135.115.255 us 198.135.116.0 - 198.135.117.255 ca @@ -118408,15 +95287,19 @@ 198.135.137.0 - 198.135.138.255 ch 198.135.139.0 - 198.135.166.255 us 198.135.167.0 - 198.135.167.255 gb -198.135.168.0 - 198.135.215.255 us +198.135.168.0 - 198.135.191.255 us +198.135.192.0 - 198.135.193.255 ca +198.135.194.0 - 198.135.215.255 us 198.135.216.0 - 198.135.216.255 ca -198.135.217.0 - 198.137.63.255 us +198.135.217.0 - 198.136.43.255 us +198.136.44.0 - 198.136.47.255 ca +198.136.48.0 - 198.136.254.255 us +198.136.255.0 - 198.136.255.255 ca +198.137.0.0 - 198.137.63.255 us 198.137.64.0 - 198.137.66.255 nl 198.137.67.0 - 198.137.68.255 us 198.137.69.0 - 198.137.69.255 gb -198.137.70.0 - 198.137.81.127 us -198.137.81.128 - 198.137.81.191 nl -198.137.81.192 - 198.137.81.255 us +198.137.70.0 - 198.137.81.255 us 198.137.82.0 - 198.137.83.255 au 198.137.84.0 - 198.137.84.255 us 198.137.85.0 - 198.137.85.255 ch @@ -118435,74 +95318,240 @@ 198.137.120.0 - 198.137.120.255 ca 198.137.121.0 - 198.137.121.255 de 198.137.122.0 - 198.137.123.255 fr -198.137.124.0 - 198.140.150.255 us +198.137.124.0 - 198.137.145.255 us +198.137.146.0 - 198.137.146.255 ca +198.137.147.0 - 198.140.133.255 us +198.140.134.0 - 198.140.134.255 ca +198.140.135.0 - 198.140.150.255 us 198.140.151.0 - 198.140.151.255 ca 198.140.152.0 - 198.141.255.255 us 198.142.0.0 - 198.142.255.255 au -198.143.0.0 - 198.147.159.255 us -198.147.160.0 - 198.147.160.255 ch -198.147.161.0 - 198.148.176.255 us +198.143.0.0 - 198.143.34.255 us +198.143.35.0 - 198.143.35.255 au +198.143.36.0 - 198.143.36.0 il +198.143.36.1 - 198.143.38.255 us +198.143.39.0 - 198.143.39.0 sg +198.143.39.1 - 198.143.39.255 us +198.143.40.0 - 198.143.40.0 il +198.143.40.1 - 198.143.41.255 us +198.143.42.0 - 198.143.42.0 jp +198.143.42.1 - 198.143.42.255 us +198.143.43.0 - 198.143.43.255 fr +198.143.44.0 - 198.143.44.0 jp +198.143.44.1 - 198.143.44.255 us +198.143.45.0 - 198.143.45.0 es +198.143.45.1 - 198.143.48.255 us +198.143.49.0 - 198.143.49.0 it +198.143.49.1 - 198.143.50.255 us +198.143.51.0 - 198.143.51.255 il +198.143.52.0 - 198.143.52.255 au +198.143.53.0 - 198.143.53.0 hk +198.143.53.1 - 198.143.53.255 us +198.143.54.0 - 198.143.54.0 se +198.143.54.1 - 198.143.54.255 us +198.143.55.0 - 198.143.55.0 pl +198.143.55.1 - 198.143.55.255 us +198.143.56.0 - 198.143.56.0 br +198.143.56.1 - 198.143.57.255 us +198.143.58.0 - 198.143.58.0 ch +198.143.58.1 - 198.143.59.255 us +198.143.60.0 - 198.143.60.0 ca +198.143.60.1 - 198.144.105.87 us +198.144.105.88 - 198.144.105.88 a1 +198.144.105.89 - 198.144.119.255 us +198.144.120.0 - 198.144.121.255 bz +198.144.122.0 - 198.144.143.255 us +198.144.144.0 - 198.144.159.255 ca +198.144.160.0 - 198.147.3.255 us +198.147.4.0 - 198.147.4.255 gb +198.147.5.0 - 198.147.5.255 us +198.147.6.0 - 198.147.7.255 sg +198.147.8.0 - 198.147.17.255 us +198.147.18.0 - 198.147.19.255 gb +198.147.20.0 - 198.147.159.255 us +198.147.160.0 - 198.147.160.255 in +198.147.161.0 - 198.147.167.255 us +198.147.168.0 - 198.147.169.255 ca +198.147.170.0 - 198.148.173.255 us +198.148.174.0 - 198.148.174.255 ca +198.148.175.0 - 198.148.176.255 us 198.148.177.0 - 198.148.178.255 ch -198.148.179.0 - 198.148.230.255 us +198.148.179.0 - 198.148.188.255 us +198.148.189.0 - 198.148.189.255 au +198.148.190.0 - 198.148.191.255 us +198.148.192.0 - 198.148.195.255 kr +198.148.196.0 - 198.148.197.255 au +198.148.198.0 - 198.148.230.255 us 198.148.231.0 - 198.148.231.255 ca 198.148.232.0 - 198.148.238.255 us 198.148.239.0 - 198.148.239.255 ca -198.148.240.0 - 198.151.52.255 us -198.151.53.0 - 198.151.53.255 au -198.151.54.0 - 198.151.131.255 us +198.148.240.0 - 198.151.131.255 us 198.151.132.0 - 198.151.132.255 mx -198.151.133.0 - 198.160.255.255 us -198.161.0.0 - 198.161.79.255 ca +198.151.133.0 - 198.151.216.111 us +198.151.216.112 - 198.151.216.115 ca +198.151.216.116 - 198.152.13.255 us +198.152.14.0 - 198.152.14.255 ap +198.152.15.0 - 198.152.70.1 us +198.152.70.2 - 198.152.70.2 eu +198.152.70.3 - 198.153.75.255 us +198.153.76.0 - 198.153.79.255 ca +198.153.80.0 - 198.154.6.255 us +198.154.7.0 - 198.154.7.255 ca +198.154.8.0 - 198.154.27.255 us +198.154.28.0 - 198.154.31.255 ca +198.154.32.0 - 198.154.183.255 us +198.154.184.0 - 198.154.191.255 ca +198.154.192.0 - 198.155.144.255 us +198.155.145.0 - 198.155.145.255 ap +198.155.146.0 - 198.155.188.255 us +198.155.189.0 - 198.155.189.255 eu +198.155.190.0 - 198.160.190.255 us +198.160.191.0 - 198.160.191.255 ca +198.160.192.0 - 198.161.0.255 us +198.161.1.0 - 198.161.79.255 ca 198.161.80.0 - 198.161.80.255 us 198.161.81.0 - 198.161.82.255 ca -198.161.84.0 - 198.161.245.255 ca +198.161.83.0 - 198.161.83.255 us +198.161.84.0 - 198.161.86.255 ca +198.161.87.0 - 198.161.87.255 us +198.161.88.0 - 198.161.131.255 ca +198.161.132.0 - 198.161.147.255 us +198.161.148.0 - 198.161.164.255 ca +198.161.165.0 - 198.161.167.255 us +198.161.168.0 - 198.161.171.255 a2 +198.161.172.0 - 198.161.199.255 ca +198.161.200.0 - 198.161.202.255 us +198.161.203.0 - 198.161.236.255 ca +198.161.237.0 - 198.161.237.255 us +198.161.238.0 - 198.161.238.255 ca +198.161.239.0 - 198.161.239.255 us +198.161.240.0 - 198.161.245.255 ca 198.161.246.0 - 198.161.247.255 us -198.161.248.0 - 198.162.191.255 ca +198.161.248.0 - 198.161.254.255 ca +198.161.255.0 - 198.162.0.255 us +198.162.1.0 - 198.162.11.255 ca +198.162.12.0 - 198.162.12.255 us +198.162.13.0 - 198.162.76.255 ca +198.162.77.0 - 198.162.78.255 us +198.162.79.0 - 198.162.87.255 ca +198.162.88.0 - 198.162.93.255 us +198.162.94.0 - 198.162.191.255 ca +198.162.192.0 - 198.162.207.255 us 198.162.208.0 - 198.162.223.255 ca 198.162.224.0 - 198.162.225.255 us -198.162.226.0 - 198.163.73.255 ca +198.162.226.0 - 198.162.229.255 ca +198.162.230.0 - 198.162.230.255 us +198.162.231.0 - 198.162.254.255 ca +198.162.255.0 - 198.163.0.255 us +198.163.1.0 - 198.163.31.255 ca +198.163.32.0 - 198.163.39.255 us +198.163.40.0 - 198.163.73.255 ca 198.163.74.0 - 198.163.75.255 us -198.163.76.0 - 198.163.175.255 ca +198.163.76.0 - 198.163.91.255 ca +198.163.92.0 - 198.163.92.255 us +198.163.93.0 - 198.163.94.255 ca +198.163.95.0 - 198.163.95.255 us +198.163.96.0 - 198.163.153.255 ca +198.163.154.0 - 198.163.155.255 us +198.163.156.0 - 198.163.156.255 ca +198.163.157.0 - 198.163.157.255 us +198.163.158.0 - 198.163.175.255 ca 198.163.176.0 - 198.163.178.255 us -198.163.179.0 - 198.163.180.255 ca -198.163.184.0 - 198.163.207.255 us -198.163.208.0 - 198.165.87.255 ca +198.163.179.0 - 198.163.181.255 ca +198.163.182.0 - 198.163.207.255 us +198.163.208.0 - 198.163.254.255 ca +198.163.255.0 - 198.163.255.255 us +198.164.0.0 - 198.165.87.255 ca 198.165.88.0 - 198.165.95.255 pm 198.165.96.0 - 198.165.135.255 ca 198.165.136.0 - 198.165.139.255 pm 198.165.140.0 - 198.165.163.255 ca 198.165.164.0 - 198.165.167.255 pm -198.165.168.0 - 198.168.29.255 ca +198.165.168.0 - 198.165.194.255 ca +198.165.195.0 - 198.165.195.255 pm +198.165.196.0 - 198.166.255.255 ca +198.167.0.0 - 198.167.0.255 us +198.167.1.0 - 198.167.31.255 ca +198.167.32.0 - 198.167.32.255 us +198.167.33.0 - 198.167.128.255 ca +198.167.129.0 - 198.167.159.255 us +198.167.160.0 - 198.167.162.255 ca +198.167.163.0 - 198.167.163.255 us +198.167.164.0 - 198.167.167.255 ca +198.167.168.0 - 198.167.191.255 us +198.167.192.0 - 198.167.223.255 kn +198.167.224.0 - 198.167.249.255 us +198.167.250.0 - 198.167.255.255 ca +198.168.0.0 - 198.168.0.255 us +198.168.1.0 - 198.168.29.255 ca 198.168.30.0 - 198.168.41.255 us -198.168.42.0 - 198.168.191.255 ca +198.168.42.0 - 198.168.42.255 ca +198.168.43.0 - 198.168.43.255 us +198.168.44.0 - 198.168.93.255 ca +198.168.94.0 - 198.168.95.255 us +198.168.96.0 - 198.168.104.255 ca +198.168.105.0 - 198.168.111.255 us +198.168.116.0 - 198.168.117.255 us +198.168.118.0 - 198.168.121.255 ca +198.168.124.0 - 198.168.126.255 us +198.168.127.0 - 198.168.191.255 ca 198.168.192.0 - 198.168.192.255 us 198.168.193.0 - 198.169.6.255 ca 198.169.7.0 - 198.169.7.255 us -198.169.8.0 - 198.169.187.255 ca +198.169.8.0 - 198.169.60.255 ca +198.169.61.0 - 198.169.63.255 us +198.169.64.0 - 198.169.95.255 ca +198.169.96.0 - 198.169.99.255 us +198.169.100.0 - 198.169.127.255 ca +198.169.128.0 - 198.169.128.255 us +198.169.129.0 - 198.169.171.255 ca +198.169.172.0 - 198.169.173.255 us +198.169.174.0 - 198.169.187.255 ca 198.169.188.0 - 198.169.189.255 us -198.169.190.0 - 198.169.255.255 ca -198.170.0.0 - 198.172.200.255 us -198.172.201.0 - 198.172.202.255 a1 -198.172.203.0 - 198.172.203.127 us -198.172.203.128 - 198.172.204.255 a1 -198.172.205.0 - 198.172.205.255 us -198.172.206.0 - 198.172.207.127 a1 -198.172.207.128 - 198.175.110.255 us +198.169.190.0 - 198.169.193.255 ca +198.169.194.0 - 198.169.195.255 us +198.169.196.0 - 198.169.207.255 ca +198.169.208.0 - 198.169.209.255 us +198.169.210.0 - 198.169.229.255 ca +198.169.230.0 - 198.169.237.255 us +198.169.238.0 - 198.169.254.255 ca +198.169.255.0 - 198.175.67.255 us +198.175.68.0 - 198.175.68.255 in +198.175.69.0 - 198.175.110.255 us 198.175.111.0 - 198.175.111.255 jp -198.175.112.0 - 198.176.18.255 us -198.176.19.0 - 198.176.19.255 gb -198.176.20.0 - 198.176.25.255 us -198.176.32.0 - 198.176.47.255 us -198.176.64.0 - 198.176.222.255 us +198.175.112.0 - 198.175.150.255 us +198.175.151.0 - 198.175.151.255 jp +198.175.152.0 - 198.175.152.193 us +198.175.152.194 - 198.175.152.194 de +198.175.152.195 - 198.175.152.209 us +198.175.152.210 - 198.175.152.211 eu +198.175.152.212 - 198.176.18.255 us +198.176.19.0 - 198.176.19.39 gb +198.176.19.40 - 198.176.19.40 eu +198.176.19.41 - 198.176.19.255 gb +198.176.20.0 - 198.176.222.255 us 198.176.223.0 - 198.176.227.255 de -198.176.228.0 - 198.180.64.255 us +198.176.228.0 - 198.178.115.255 us +198.178.116.0 - 198.178.119.255 ca +198.178.120.0 - 198.178.154.255 us +198.178.155.0 - 198.178.155.255 ca +198.178.156.0 - 198.178.192.0 us +198.178.192.1 - 198.178.192.1 eu +198.178.192.2 - 198.178.235.255 us +198.178.236.0 - 198.178.236.255 gb +198.178.237.0 - 198.179.17.255 us +198.179.18.0 - 198.179.18.255 ca +198.179.19.0 - 198.179.218.255 us +198.179.219.0 - 198.179.219.255 ca +198.179.220.0 - 198.179.224.255 us +198.179.225.0 - 198.179.225.255 hk +198.179.226.0 - 198.180.64.255 us 198.180.65.0 - 198.180.65.255 gb 198.180.66.0 - 198.180.66.255 us 198.180.67.0 - 198.180.67.255 ch 198.180.68.0 - 198.180.79.255 us 198.180.80.0 - 198.180.94.255 gb -198.180.95.0 - 198.180.97.255 us -198.180.98.0 - 198.180.98.255 de +198.180.95.0 - 198.180.98.255 us 198.180.99.0 - 198.180.99.255 it 198.180.100.0 - 198.180.101.255 gb 198.180.102.0 - 198.180.104.255 de @@ -118515,41 +95564,99 @@ 198.180.125.0 - 198.180.125.255 fr 198.180.126.0 - 198.180.126.255 sg 198.180.127.0 - 198.180.127.255 nl -198.180.128.0 - 198.180.149.255 us -198.180.150.0 - 198.180.153.255 jp -198.180.154.0 - 198.182.169.255 us +198.180.128.0 - 198.180.141.255 us +198.180.142.0 - 198.180.142.255 jp +198.180.143.0 - 198.181.119.255 us +198.181.120.0 - 198.181.127.255 ca +198.181.128.0 - 198.181.198.255 us +198.181.199.0 - 198.181.199.255 ca +198.181.200.0 - 198.182.36.255 us +198.182.37.0 - 198.182.37.255 eu +198.182.38.0 - 198.182.51.255 us +198.182.52.0 - 198.182.52.255 in +198.182.53.0 - 198.182.169.255 us 198.182.170.0 - 198.182.170.255 bm -198.182.171.0 - 198.184.160.255 us +198.182.171.0 - 198.182.213.255 us +198.182.214.0 - 198.182.214.255 ca +198.182.215.0 - 198.183.224.255 us +198.183.225.0 - 198.183.225.255 ca +198.183.226.0 - 198.184.160.255 us 198.184.161.0 - 198.184.161.255 br 198.184.162.0 - 198.184.196.255 us 198.184.197.0 - 198.184.197.255 ca -198.184.198.0 - 198.186.234.255 us +198.184.198.0 - 198.184.234.255 us +198.184.235.0 - 198.184.235.255 eu +198.184.236.0 - 198.185.27.255 us +198.185.28.0 - 198.185.31.255 ca +198.185.32.0 - 198.185.216.255 us +198.185.217.0 - 198.185.217.255 ca +198.185.218.0 - 198.186.234.255 us 198.186.235.0 - 198.186.235.255 bm 198.186.236.0 - 198.187.170.255 us 198.187.171.0 - 198.187.171.255 bm -198.187.172.0 - 198.199.255.255 us -198.200.0.0 - 198.200.15.255 ph -198.200.16.0 - 198.200.31.255 us -198.200.128.0 - 198.203.231.255 us -198.203.233.0 - 198.203.234.255 us +198.187.172.0 - 198.199.6.255 us +198.199.7.0 - 198.199.7.255 ca +198.199.8.0 - 198.199.13.255 us +198.199.14.0 - 198.199.15.255 ca +198.199.16.0 - 198.199.123.255 us +198.199.124.0 - 198.199.127.255 nl +198.199.128.0 - 198.199.255.255 us +198.200.0.0 - 198.200.9.255 ph +198.200.10.0 - 198.200.33.239 us +198.200.33.240 - 198.200.33.255 cn +198.200.34.0 - 198.200.63.255 us +198.200.64.0 - 198.200.127.255 ca +198.200.128.0 - 198.200.241.255 us +198.200.242.0 - 198.200.242.255 ca +198.200.243.0 - 198.202.129.255 us +198.202.130.0 - 198.202.130.255 ca +198.202.131.0 - 198.203.234.255 us 198.203.235.0 - 198.203.235.255 ca 198.203.236.0 - 198.204.70.255 us 198.204.71.0 - 198.204.72.255 pr -198.204.73.0 - 198.206.196.255 us +198.204.73.0 - 198.205.119.67 us +198.205.119.68 - 198.205.119.71 ca +198.205.119.72 - 198.206.196.255 us 198.206.197.0 - 198.206.197.255 ch 198.206.198.0 - 198.206.199.255 us 198.206.200.0 - 198.206.202.255 ch -198.206.203.0 - 198.207.15.255 us +198.206.203.0 - 198.207.7.255 us 198.207.16.0 - 198.207.23.255 bm -198.207.32.0 - 198.207.79.255 us +198.207.24.0 - 198.207.79.255 us 198.207.80.0 - 198.207.80.255 de -198.207.81.0 - 198.207.99.127 us -198.207.99.128 - 198.207.99.255 it -198.207.100.0 - 198.213.50.255 us +198.207.81.0 - 198.208.15.255 us +198.208.16.0 - 198.208.16.255 au +198.208.17.0 - 198.208.103.255 us +198.208.104.0 - 198.208.104.255 kr +198.208.105.0 - 198.208.208.255 us +198.208.209.0 - 198.208.209.255 in +198.208.210.0 - 198.208.239.255 us +198.208.240.0 - 198.208.240.255 eu +198.208.241.0 - 198.208.242.255 us +198.208.243.0 - 198.208.243.255 eu +198.208.244.0 - 198.211.117.255 us +198.211.118.0 - 198.211.127.255 nl +198.211.128.0 - 198.212.6.255 us +198.212.7.0 - 198.212.7.255 ca +198.212.8.0 - 198.213.50.255 us 198.213.51.0 - 198.213.51.255 mx -198.213.52.0 - 198.231.63.255 us -198.231.64.0 - 198.231.64.255 ca -198.231.65.0 - 198.231.65.255 us +198.213.52.0 - 198.217.115.255 us +198.217.116.0 - 198.217.119.255 ca +198.217.120.0 - 198.228.89.255 us +198.228.90.0 - 198.228.90.255 co +198.228.91.0 - 198.229.0.255 us +198.229.1.0 - 198.229.1.255 ve +198.229.2.0 - 198.230.111.255 us +198.230.112.0 - 198.230.112.255 ca +198.230.113.0 - 198.230.113.255 us +198.230.114.0 - 198.230.115.255 ca +198.230.116.0 - 198.230.119.255 us +198.230.120.0 - 198.230.122.255 ca +198.230.123.0 - 198.230.123.255 us +198.230.124.0 - 198.230.124.255 ca +198.230.125.0 - 198.231.11.255 us +198.231.12.0 - 198.231.12.255 gb +198.231.13.0 - 198.231.65.255 us 198.231.66.0 - 198.231.66.255 ca 198.231.67.0 - 198.231.67.255 us 198.231.68.0 - 198.231.71.255 ca @@ -118560,44 +95667,84 @@ 198.231.94.0 - 198.231.94.255 us 198.231.95.0 - 198.231.95.255 ca 198.231.96.0 - 198.231.99.255 us -198.231.100.0 - 198.231.104.255 ca -198.231.105.0 - 198.231.105.255 us -198.231.106.0 - 198.231.106.255 ca -198.231.107.0 - 198.231.107.255 us +198.231.100.0 - 198.231.101.255 ca +198.231.102.0 - 198.231.107.255 us 198.231.108.0 - 198.231.127.255 ca -198.231.128.0 - 198.234.255.255 us -198.235.0.0 - 198.235.31.255 ca +198.231.128.0 - 198.233.156.111 us +198.233.156.112 - 198.233.156.115 ca +198.233.156.116 - 198.235.0.255 us +198.235.1.0 - 198.235.31.255 ca 198.235.32.0 - 198.235.47.255 us -198.235.48.0 - 198.235.56.255 ca +198.235.48.0 - 198.235.53.255 ca +198.235.54.0 - 198.235.55.255 us +198.235.56.0 - 198.235.56.255 ca 198.235.57.0 - 198.235.61.255 us -198.235.62.0 - 198.235.177.255 ca +198.235.62.0 - 198.235.127.255 ca +198.235.128.0 - 198.235.128.255 us +198.235.129.0 - 198.235.129.255 ca +198.235.130.0 - 198.235.135.255 us +198.235.136.0 - 198.235.177.255 ca 198.235.178.0 - 198.235.179.255 us -198.235.180.0 - 198.235.255.255 ca -198.236.0.0 - 198.240.127.255 us -198.240.128.0 - 198.240.129.255 gb -198.240.130.0 - 198.240.130.255 us +198.235.180.0 - 198.235.203.255 ca +198.235.204.0 - 198.235.205.255 us +198.235.206.0 - 198.235.254.255 ca +198.235.255.0 - 198.240.127.255 us +198.240.128.0 - 198.240.128.255 gb +198.240.129.0 - 198.240.130.255 us 198.240.131.0 - 198.240.131.255 hk 198.240.132.0 - 198.240.132.255 ch 198.240.133.0 - 198.240.133.255 sg -198.240.134.0 - 198.240.140.255 ch -198.240.141.0 - 198.240.141.255 jp -198.240.142.0 - 198.240.145.255 ch +198.240.134.0 - 198.240.145.255 ch 198.240.146.0 - 198.240.146.255 au 198.240.147.0 - 198.240.255.255 ch -198.241.0.0 - 198.245.63.255 us +198.241.0.0 - 198.244.9.255 us +198.244.10.0 - 198.244.11.255 au +198.244.12.0 - 198.244.50.255 us +198.244.51.0 - 198.244.51.63 hk +198.244.51.64 - 198.244.52.255 us +198.244.53.0 - 198.244.53.255 cn +198.244.54.0 - 198.244.54.255 ca +198.244.55.0 - 198.244.62.255 us +198.244.63.0 - 198.244.63.255 cn +198.244.64.0 - 198.244.79.255 pr +198.244.80.0 - 198.245.13.255 us +198.245.14.0 - 198.245.15.255 ca +198.245.16.0 - 198.245.47.255 us +198.245.48.0 - 198.245.51.255 ca +198.245.52.0 - 198.245.53.127 us +198.245.53.128 - 198.245.53.128 ca +198.245.53.129 - 198.245.59.255 us +198.245.60.0 - 198.245.63.255 ca +198.245.64.0 - 198.245.64.255 us +198.245.65.0 - 198.245.65.255 ca +198.245.66.0 - 198.245.72.119 us +198.245.72.120 - 198.245.72.127 ca +198.245.72.128 - 198.245.73.255 us +198.245.74.0 - 198.245.75.255 a2 +198.245.76.0 - 198.245.95.255 us +198.245.96.0 - 198.245.111.255 pr +198.245.112.0 - 198.245.127.255 ca 198.245.128.0 - 198.245.138.255 us 198.245.139.0 - 198.245.139.255 pr 198.245.140.0 - 198.245.159.255 us 198.245.160.0 - 198.245.160.255 bb -198.245.161.0 - 198.246.228.255 us +198.245.161.0 - 198.245.175.255 us +198.245.176.0 - 198.245.177.255 ca +198.245.178.0 - 198.245.254.255 us +198.245.255.0 - 198.245.255.255 pr +198.246.0.0 - 198.246.27.255 us +198.246.28.0 - 198.246.31.255 ca +198.246.32.0 - 198.246.43.255 us +198.246.44.0 - 198.246.47.255 ca +198.246.48.0 - 198.246.222.255 us +198.246.223.0 - 198.246.223.255 sg +198.246.224.0 - 198.246.228.255 us 198.246.229.0 - 198.246.230.255 bb 198.246.231.0 - 198.249.0.255 us 198.249.1.0 - 198.249.1.255 ca 198.249.2.0 - 198.249.4.255 us 198.249.5.0 - 198.249.5.255 ca -198.249.6.0 - 198.249.14.255 us -198.249.15.0 - 198.249.15.255 ca -198.249.16.0 - 198.249.16.255 us +198.249.6.0 - 198.249.16.255 us 198.249.17.0 - 198.249.18.255 ca 198.249.19.0 - 198.249.31.255 us 198.249.32.0 - 198.249.33.255 ca @@ -118609,9 +95756,7 @@ 198.249.52.0 - 198.249.53.255 ca 198.249.54.0 - 198.249.60.255 us 198.249.61.0 - 198.249.62.255 ca -198.249.63.0 - 198.249.69.255 us -198.249.70.0 - 198.249.70.255 ca -198.249.71.0 - 198.249.83.255 us +198.249.63.0 - 198.249.83.255 us 198.249.84.0 - 198.249.84.255 ca 198.249.85.0 - 198.249.87.255 us 198.249.88.0 - 198.249.88.255 ca @@ -118662,8 +95807,8 @@ 198.249.201.0 - 198.249.203.255 us 198.249.204.0 - 198.249.204.255 ca 198.249.205.0 - 198.249.208.255 us -198.249.209.0 - 198.249.213.255 ca -198.249.214.0 - 198.249.215.255 us +198.249.209.0 - 198.249.212.255 ca +198.249.213.0 - 198.249.215.255 us 198.249.216.0 - 198.249.217.255 ca 198.249.218.0 - 198.249.221.255 us 198.249.222.0 - 198.249.223.255 ca @@ -118679,19 +95824,45 @@ 198.249.251.0 - 198.249.251.255 ca 198.249.252.0 - 198.249.252.255 us 198.249.253.0 - 198.249.253.255 ca -198.249.254.0 - 199.0.79.255 us +198.249.254.0 - 198.251.47.255 us +198.251.48.0 - 198.251.63.255 ca +198.251.64.0 - 198.251.84.9 us +198.251.84.10 - 198.251.84.10 gb +198.251.84.11 - 198.251.87.255 us +198.251.88.0 - 198.251.88.255 ru +198.251.89.0 - 198.251.127.255 us +198.251.128.0 - 198.251.255.255 ca +198.252.0.0 - 198.252.79.255 us +198.252.80.0 - 198.252.95.255 ca +198.252.96.0 - 198.252.100.255 us +198.252.101.0 - 198.252.101.255 sg +198.252.102.0 - 198.252.104.255 us +198.252.105.0 - 198.252.105.255 nl +198.252.106.0 - 198.252.107.255 us +198.252.108.0 - 198.252.108.255 ca +198.252.109.0 - 198.252.110.255 us +198.252.111.0 - 198.252.111.255 ca +198.252.112.0 - 198.252.199.255 us +198.252.200.0 - 198.252.200.255 gb +198.252.201.0 - 198.254.127.255 us +198.254.128.0 - 198.254.255.255 ca +198.255.0.0 - 199.0.79.255 us 199.0.80.0 - 199.0.87.255 aw -199.0.88.0 - 199.0.91.255 us -199.0.92.0 - 199.0.92.255 sl -199.0.93.0 - 199.1.151.255 us +199.0.88.0 - 199.1.151.255 us 199.1.152.0 - 199.1.159.255 pr 199.1.160.0 - 199.2.111.255 us 199.2.112.0 - 199.2.119.255 aw 199.2.120.0 - 199.3.195.255 us 199.3.196.0 - 199.3.196.255 ec -199.3.197.0 - 199.3.209.255 us -199.3.210.0 - 199.3.210.127 cn -199.3.210.128 - 199.6.63.255 us +199.3.197.0 - 199.4.143.255 us +199.4.144.0 - 199.4.144.255 ca +199.4.145.0 - 199.4.189.255 us +199.4.190.0 - 199.4.190.255 ca +199.4.191.0 - 199.4.254.255 us +199.4.255.0 - 199.4.255.255 ca +199.5.0.0 - 199.5.193.255 us +199.5.194.0 - 199.5.194.255 ca +199.5.195.0 - 199.6.63.255 us 199.6.64.0 - 199.6.68.255 gb 199.6.69.0 - 199.6.71.255 jp 199.6.72.0 - 199.6.72.255 sg @@ -118711,8 +95882,7 @@ 199.6.134.0 - 199.6.135.255 nl 199.6.136.0 - 199.7.69.255 us 199.7.70.0 - 199.7.70.255 nl -199.7.71.0 - 199.7.83.255 us -199.7.85.0 - 199.7.86.255 us +199.7.71.0 - 199.7.86.255 us 199.7.87.0 - 199.7.89.255 ca 199.7.90.0 - 199.7.90.255 ms 199.7.91.0 - 199.7.111.255 us @@ -118730,18 +95900,28 @@ 199.7.212.0 - 199.7.215.255 us 199.7.216.0 - 199.7.219.255 ca 199.7.220.0 - 199.7.231.255 us -199.7.232.0 - 199.7.233.255 ca -199.7.234.0 - 199.7.234.255 us -199.7.235.0 - 199.7.239.255 ca -199.7.240.0 - 199.10.25.255 us +199.7.232.0 - 199.7.239.255 ca +199.7.240.0 - 199.9.23.255 us +199.9.24.0 - 199.9.31.255 hk +199.9.32.0 - 199.9.56.255 us +199.9.57.0 - 199.9.57.255 ca +199.9.60.0 - 199.10.25.255 us 199.10.28.0 - 199.10.31.255 ca -199.10.32.0 - 199.10.63.255 us -199.10.65.0 - 199.10.65.255 us +199.10.32.0 - 199.10.65.255 us 199.10.66.0 - 199.10.66.255 ca -199.10.67.0 - 199.15.79.255 us +199.10.67.0 - 199.10.83.255 us +199.10.84.0 - 199.10.84.255 ca +199.10.85.0 - 199.15.79.255 us 199.15.80.0 - 199.15.88.255 ca -199.15.92.0 - 199.16.55.255 us -199.16.56.0 - 199.16.59.255 ag +199.15.89.0 - 199.15.89.255 us +199.15.92.0 - 199.15.118.255 us +199.15.119.0 - 199.15.119.255 cn +199.15.120.0 - 199.15.227.255 us +199.15.228.0 - 199.15.231.255 bm +199.15.232.0 - 199.16.55.255 us +199.16.56.0 - 199.16.57.255 ag +199.16.58.0 - 199.16.58.255 dm +199.16.59.0 - 199.16.59.255 ag 199.16.60.0 - 199.16.111.255 us 199.16.112.0 - 199.16.115.255 ca 199.16.116.0 - 199.16.127.255 us @@ -118752,43 +95932,48 @@ 199.16.152.0 - 199.16.155.255 ca 199.16.156.0 - 199.16.179.255 us 199.16.180.0 - 199.16.183.255 ca -199.16.184.0 - 199.16.249.127 us -199.16.249.128 - 199.16.249.143 cy -199.16.249.144 - 199.16.249.151 us -199.16.249.152 - 199.16.249.167 cy -199.16.249.168 - 199.16.249.175 us -199.16.249.176 - 199.16.249.191 cy -199.16.249.192 - 199.19.47.255 us +199.16.184.0 - 199.16.201.31 us +199.16.201.32 - 199.16.201.39 de +199.16.201.40 - 199.16.201.167 us +199.16.201.168 - 199.16.201.175 au +199.16.201.176 - 199.16.204.223 us +199.16.204.224 - 199.16.204.231 de +199.16.204.232 - 199.19.47.255 us 199.19.48.0 - 199.19.63.255 ca 199.19.64.0 - 199.19.91.255 us 199.19.92.0 - 199.19.95.255 ca -199.19.96.0 - 199.19.159.255 us +199.19.96.0 - 199.19.101.255 us +199.19.102.0 - 199.19.102.255 mx +199.19.103.0 - 199.19.159.255 us 199.19.160.0 - 199.19.175.255 ca 199.19.176.0 - 199.19.211.255 us -199.19.212.0 - 199.19.227.31 ca -199.19.227.32 - 199.19.227.47 au -199.19.227.48 - 199.19.227.95 ca -199.19.227.96 - 199.21.112.95 us -199.21.112.96 - 199.21.112.143 gb -199.21.112.144 - 199.21.112.151 us -199.21.112.152 - 199.21.112.159 es -199.21.112.160 - 199.21.147.255 us +199.19.212.0 - 199.19.223.255 ca +199.19.224.0 - 199.19.252.255 us +199.19.253.0 - 199.19.253.255 ca +199.19.254.0 - 199.20.58.255 us +199.20.59.0 - 199.20.59.255 ca +199.20.60.0 - 199.21.147.255 us 199.21.148.0 - 199.21.151.255 ca 199.21.152.0 - 199.21.163.255 us 199.21.164.0 - 199.21.167.255 kn -199.21.168.0 - 199.21.179.255 us +199.21.168.0 - 199.21.171.255 us +199.21.176.0 - 199.21.179.255 us 199.21.180.0 - 199.21.183.255 ca 199.21.184.0 - 199.21.215.255 us 199.21.216.0 - 199.21.219.255 ca 199.21.220.0 - 199.21.255.255 us 199.22.0.0 - 199.25.255.255 ca -199.26.0.0 - 199.26.64.255 us +199.26.0.0 - 199.26.65.255 us 199.26.68.0 - 199.26.71.255 ca 199.26.72.0 - 199.26.79.255 us 199.26.80.0 - 199.26.83.255 ca -199.26.84.0 - 199.26.233.255 us +199.26.84.0 - 199.26.189.255 us +199.26.190.0 - 199.26.191.255 ca +199.26.192.0 - 199.26.233.255 us 199.26.234.0 - 199.26.234.255 pa -199.26.235.0 - 199.27.95.255 us +199.26.235.0 - 199.27.67.255 us +199.27.68.0 - 199.27.71.255 ca +199.27.72.0 - 199.27.95.255 us 199.27.96.0 - 199.27.103.255 pr 199.27.104.0 - 199.27.119.255 us 199.27.120.0 - 199.27.123.255 a2 @@ -118800,134 +95985,81 @@ 199.29.71.0 - 199.29.71.255 kw 199.29.72.0 - 199.30.127.255 us 199.30.128.0 - 199.30.131.255 ca -199.30.132.0 - 199.30.175.255 us +199.30.144.0 - 199.30.175.255 us 199.30.176.0 - 199.30.183.255 ca -199.30.184.0 - 199.34.14.255 us -199.34.15.0 - 199.34.15.255 ca -199.34.16.0 - 199.34.120.143 us -199.34.120.144 - 199.34.120.151 ca -199.34.120.152 - 199.34.121.63 us -199.34.121.64 - 199.34.121.71 ar -199.34.121.72 - 199.34.121.95 us -199.34.121.96 - 199.34.121.103 ca -199.34.121.104 - 199.34.121.119 us -199.34.121.120 - 199.34.121.127 se -199.34.121.128 - 199.34.121.191 us -199.34.121.192 - 199.34.121.199 ru -199.34.121.200 - 199.34.122.31 us -199.34.122.32 - 199.34.122.39 ch -199.34.122.40 - 199.34.122.95 us -199.34.122.96 - 199.34.122.103 ru -199.34.122.104 - 199.34.122.167 us -199.34.122.168 - 199.34.122.175 au -199.34.122.176 - 199.34.122.191 us -199.34.122.192 - 199.34.122.199 br -199.34.122.200 - 199.34.122.207 co -199.34.122.208 - 199.34.123.7 us -199.34.123.8 - 199.34.123.15 fr -199.34.123.16 - 199.34.123.23 us -199.34.123.24 - 199.34.123.31 ca -199.34.123.32 - 199.34.123.39 br -199.34.123.40 - 199.34.123.47 ua -199.34.123.48 - 199.34.123.127 us -199.34.123.128 - 199.34.123.191 gb -199.34.123.192 - 199.34.123.199 ca -199.34.123.200 - 199.34.123.223 us -199.34.123.224 - 199.34.123.231 pt -199.34.123.232 - 199.34.123.239 us -199.34.123.240 - 199.34.123.247 de -199.34.123.248 - 199.34.124.47 us -199.34.124.48 - 199.34.124.55 ru -199.34.124.56 - 199.34.124.63 us -199.34.124.64 - 199.34.124.71 ru -199.34.124.72 - 199.34.124.127 us -199.34.124.128 - 199.34.124.135 ca -199.34.124.136 - 199.34.124.143 us -199.34.124.144 - 199.34.124.151 au -199.34.124.152 - 199.34.124.159 ca -199.34.124.160 - 199.34.124.191 us -199.34.124.192 - 199.34.124.199 br -199.34.124.200 - 199.34.124.207 cn -199.34.124.208 - 199.34.124.223 ar -199.34.124.224 - 199.34.124.247 us -199.34.124.248 - 199.34.124.255 de -199.34.125.0 - 199.34.125.15 us -199.34.125.16 - 199.34.125.23 pt -199.34.125.24 - 199.34.125.39 ca -199.34.125.40 - 199.34.125.47 ar -199.34.125.48 - 199.34.125.55 au -199.34.125.56 - 199.34.125.79 us -199.34.125.80 - 199.34.125.87 ca -199.34.125.88 - 199.34.125.111 us -199.34.125.112 - 199.34.125.119 ru -199.34.125.120 - 199.34.125.135 us -199.34.125.136 - 199.34.125.143 gb -199.34.125.144 - 199.34.125.151 us -199.34.125.152 - 199.34.125.159 de -199.34.125.160 - 199.34.125.199 us -199.34.125.200 - 199.34.125.207 gb -199.34.125.208 - 199.34.125.231 us -199.34.125.232 - 199.34.125.239 no -199.34.125.240 - 199.34.125.247 de -199.34.125.248 - 199.34.125.255 us -199.34.126.0 - 199.34.126.15 mx -199.34.126.16 - 199.34.126.31 us -199.34.126.32 - 199.34.126.39 de -199.34.126.40 - 199.34.126.47 mx -199.34.126.48 - 199.34.126.79 us -199.34.126.80 - 199.34.126.95 gb -199.34.126.96 - 199.34.126.135 us -199.34.126.136 - 199.34.126.143 ca -199.34.126.144 - 199.34.126.151 ru -199.34.126.152 - 199.34.126.159 us -199.34.126.160 - 199.34.126.191 gb -199.34.126.192 - 199.34.126.199 be -199.34.126.200 - 199.34.126.207 gb -199.34.126.208 - 199.34.126.215 us -199.34.126.216 - 199.34.126.223 cl -199.34.126.224 - 199.34.127.71 us -199.34.127.72 - 199.34.127.79 gb -199.34.127.80 - 199.34.127.95 us -199.34.127.96 - 199.34.127.111 ca -199.34.127.112 - 199.34.127.183 us -199.34.127.184 - 199.34.127.191 il -199.34.127.192 - 199.34.127.207 us -199.34.127.208 - 199.34.127.215 es -199.34.127.216 - 199.34.127.231 us -199.34.127.232 - 199.34.127.239 br -199.34.127.240 - 199.36.223.255 us +199.30.184.0 - 199.30.244.255 us +199.30.245.0 - 199.30.245.255 ca +199.30.246.0 - 199.33.88.255 us +199.33.89.0 - 199.33.89.255 ca +199.33.90.0 - 199.33.93.255 us +199.33.94.0 - 199.33.95.255 ca +199.33.96.0 - 199.33.111.255 us +199.33.112.0 - 199.33.115.255 ca +199.33.116.0 - 199.34.122.127 us +199.34.122.128 - 199.34.122.135 de +199.34.122.136 - 199.34.123.119 us +199.34.123.120 - 199.34.123.127 au +199.34.123.128 - 199.34.125.87 us +199.34.125.88 - 199.34.125.95 de +199.34.125.96 - 199.36.223.255 us 199.36.224.0 - 199.36.231.255 ca 199.36.232.0 - 199.38.95.255 us 199.38.96.0 - 199.38.103.255 ca 199.38.104.0 - 199.38.191.255 us -199.38.192.0 - 199.38.199.255 vc -199.38.200.0 - 199.38.235.255 us +199.38.192.0 - 199.38.199.255 bb +199.38.200.0 - 199.38.233.255 us +199.38.234.0 - 199.38.235.255 jp 199.38.236.0 - 199.38.239.255 ca -199.38.240.0 - 199.42.102.255 us +199.38.240.0 - 199.38.243.63 us +199.38.243.64 - 199.38.243.95 ca +199.38.243.96 - 199.39.255.255 us +199.40.0.0 - 199.40.203.255 cz +199.40.204.0 - 199.40.204.255 ap +199.40.205.0 - 199.40.205.255 cz +199.40.206.0 - 199.40.206.255 ap +199.40.207.0 - 199.41.216.255 cz +199.41.217.0 - 199.41.217.255 us +199.41.218.0 - 199.41.255.255 cz +199.42.0.0 - 199.42.102.255 us 199.42.103.0 - 199.42.105.255 de -199.42.106.0 - 199.42.239.255 us +199.42.106.0 - 199.42.179.255 us +199.42.180.0 - 199.42.180.255 gb +199.42.181.0 - 199.42.201.255 us +199.42.202.0 - 199.42.202.255 gb +199.42.203.0 - 199.42.239.255 us 199.42.240.0 - 199.42.241.255 de 199.42.242.0 - 199.43.0.255 us 199.43.1.0 - 199.43.3.255 ca -199.43.4.0 - 199.43.107.255 us +199.43.4.0 - 199.43.17.255 us +199.43.18.0 - 199.43.18.255 jp +199.43.19.0 - 199.43.19.255 ap +199.43.20.0 - 199.43.44.255 us +199.43.45.0 - 199.43.45.255 hk +199.43.46.0 - 199.43.62.255 us +199.43.63.0 - 199.43.63.255 hk +199.43.64.0 - 199.43.107.255 us 199.43.108.0 - 199.43.131.255 ca 199.43.132.0 - 199.43.135.255 us 199.43.136.0 - 199.43.143.255 ca 199.43.144.0 - 199.43.146.255 us 199.43.147.0 - 199.43.183.255 ca -199.43.184.0 - 199.43.195.255 us -199.43.199.0 - 199.43.207.255 ca -199.43.208.0 - 199.43.242.255 us +199.43.184.0 - 199.43.194.255 us +199.43.195.0 - 199.43.195.255 ca +199.43.198.0 - 199.43.198.255 us +199.43.199.0 - 199.43.205.255 ca +199.43.206.0 - 199.43.242.255 us 199.43.243.0 - 199.43.245.255 ca 199.43.246.0 - 199.43.247.255 ch -199.43.248.0 - 199.43.255.255 ca -199.44.0.0 - 199.45.65.255 us +199.43.248.0 - 199.43.254.255 ca +199.43.255.0 - 199.45.65.255 us 199.45.66.0 - 199.45.68.255 ca 199.45.69.0 - 199.45.76.255 us 199.45.77.0 - 199.45.77.255 ca 199.45.78.0 - 199.45.103.255 us -199.45.104.0 - 199.45.108.255 ca -199.45.109.0 - 199.45.110.255 us +199.45.104.0 - 199.45.105.255 ca +199.45.106.0 - 199.45.106.255 us +199.45.107.0 - 199.45.107.255 ca +199.45.108.0 - 199.45.110.255 us 199.45.111.0 - 199.45.111.255 ca 199.45.112.0 - 199.45.113.255 us 199.45.114.0 - 199.45.115.255 ca @@ -118937,30 +96069,44 @@ 199.45.121.0 - 199.45.122.255 ca 199.45.123.0 - 199.46.111.255 us 199.46.112.0 - 199.46.115.255 ca -199.46.116.0 - 199.47.47.255 us +199.46.116.0 - 199.46.184.255 us +199.46.185.0 - 199.46.185.255 au +199.46.186.0 - 199.47.47.255 us 199.47.48.0 - 199.47.51.255 ca 199.47.52.0 - 199.47.55.255 bb 199.47.56.0 - 199.47.63.255 ca 199.47.64.0 - 199.47.123.255 us 199.47.124.0 - 199.47.127.255 ca -199.47.128.0 - 199.47.239.255 us +199.47.128.0 - 199.47.149.255 us +199.47.150.0 - 199.47.150.255 ch +199.47.151.0 - 199.47.196.255 us +199.47.197.0 - 199.47.197.255 au +199.47.198.0 - 199.47.199.255 jp +199.47.200.0 - 199.47.239.255 us 199.47.240.0 - 199.47.243.255 ca 199.47.244.0 - 199.48.63.255 us 199.48.64.0 - 199.48.67.255 ca -199.48.72.0 - 199.48.79.255 us -199.48.128.0 - 199.48.165.127 us -199.48.165.128 - 199.48.165.255 sg -199.48.166.0 - 199.48.167.87 us -199.48.167.88 - 199.48.167.95 sg -199.48.167.96 - 199.48.203.255 us +199.48.68.0 - 199.48.99.255 us +199.48.100.0 - 199.48.103.255 ca +199.48.104.0 - 199.48.203.255 us 199.48.204.0 - 199.48.207.255 ag 199.48.208.0 - 199.48.215.255 us 199.48.216.0 - 199.48.223.255 ca -199.48.224.0 - 199.48.239.255 us -199.48.240.0 - 199.48.247.255 a1 -199.48.248.0 - 199.52.255.255 us +199.48.224.0 - 199.48.227.255 us +199.48.228.0 - 199.48.228.255 cn +199.48.229.0 - 199.49.14.255 us +199.49.15.0 - 199.49.15.255 sg +199.49.16.0 - 199.49.53.255 us +199.49.54.0 - 199.49.54.255 au +199.49.55.0 - 199.52.255.255 us 199.53.0.0 - 199.53.255.255 ch -199.54.0.0 - 199.58.63.255 us +199.54.0.0 - 199.58.12.255 us +199.58.13.0 - 199.58.13.255 ca +199.58.16.0 - 199.58.79.255 us +199.58.80.0 - 199.58.83.255 ca +199.58.84.0 - 199.58.115.255 us +199.58.116.0 - 199.58.119.255 ca +199.58.120.0 - 199.58.127.255 gd 199.58.128.0 - 199.58.151.255 us 199.58.152.0 - 199.58.155.255 bb 199.58.156.0 - 199.58.167.255 us @@ -118969,139 +96115,161 @@ 199.58.192.0 - 199.58.195.255 ca 199.58.196.0 - 199.58.231.255 us 199.58.232.0 - 199.58.239.255 ca -199.58.240.0 - 199.59.63.255 us +199.58.240.0 - 199.59.75.255 us +199.59.76.0 - 199.59.79.255 ca +199.59.80.0 - 199.59.127.255 us 199.59.128.0 - 199.59.135.255 ca -199.59.136.0 - 199.59.143.255 us -199.59.144.0 - 199.59.144.255 cr -199.59.145.0 - 199.59.183.255 us +199.59.136.0 - 199.59.183.255 us 199.59.184.0 - 199.59.191.255 ca -199.59.192.0 - 199.59.243.255 us -199.59.244.0 - 199.59.246.255 ca -199.59.247.0 - 199.59.247.255 fr +199.59.192.0 - 199.59.206.255 us +199.59.207.0 - 199.59.207.255 mu +199.59.208.0 - 199.59.243.255 us +199.59.244.0 - 199.59.245.255 ca +199.59.246.0 - 199.59.247.255 fr 199.59.248.0 - 199.59.255.255 us 199.60.0.0 - 199.60.19.255 ca 199.60.20.0 - 199.60.25.255 us 199.60.26.0 - 199.60.27.255 ca 199.60.28.0 - 199.60.28.255 us -199.60.29.0 - 199.60.255.255 ca -199.61.0.0 - 199.66.63.255 us -199.66.128.0 - 199.66.217.3 us -199.66.217.4 - 199.66.217.7 gb -199.66.217.8 - 199.66.217.15 it -199.66.217.16 - 199.66.217.27 us -199.66.217.28 - 199.66.217.31 ru -199.66.217.32 - 199.66.217.35 kw -199.66.217.36 - 199.66.217.39 pt -199.66.217.40 - 199.66.217.43 us -199.66.217.44 - 199.66.217.47 it -199.66.217.48 - 199.66.217.51 be -199.66.217.52 - 199.66.217.55 us -199.66.217.56 - 199.66.217.59 nl -199.66.217.60 - 199.66.217.67 us -199.66.217.68 - 199.66.217.71 gb -199.66.217.72 - 199.66.217.75 us -199.66.217.76 - 199.66.217.79 ca -199.66.217.80 - 199.66.217.87 us -199.66.217.88 - 199.66.217.91 ru -199.66.217.92 - 199.66.217.99 us -199.66.217.100 - 199.66.217.103 au -199.66.217.104 - 199.66.217.127 us -199.66.217.128 - 199.66.217.135 ca -199.66.217.136 - 199.66.217.167 us -199.66.217.168 - 199.66.217.175 gr -199.66.217.176 - 199.66.217.199 us -199.66.217.200 - 199.66.217.215 sg -199.66.217.216 - 199.66.217.231 us -199.66.217.232 - 199.66.217.247 it -199.66.217.248 - 199.66.218.159 us -199.66.218.160 - 199.66.218.175 it -199.66.218.176 - 199.66.218.255 us -199.66.219.0 - 199.66.219.15 ru -199.66.219.16 - 199.66.219.31 ua -199.66.219.32 - 199.66.219.47 ie -199.66.219.48 - 199.66.219.95 us -199.66.219.96 - 199.66.219.111 in -199.66.219.112 - 199.66.219.175 us -199.66.219.176 - 199.66.219.191 gb -199.66.219.192 - 199.66.220.7 us -199.66.220.8 - 199.66.220.15 ca -199.66.220.16 - 199.66.220.47 us -199.66.220.48 - 199.66.220.55 ca -199.66.220.56 - 199.66.220.63 us -199.66.220.64 - 199.66.220.71 au -199.66.220.72 - 199.66.220.79 br -199.66.220.80 - 199.66.220.111 us -199.66.220.112 - 199.66.220.119 pl -199.66.220.120 - 199.66.220.167 us -199.66.220.168 - 199.66.220.175 it -199.66.220.176 - 199.66.220.183 us -199.66.220.184 - 199.66.220.191 ru -199.66.220.192 - 199.66.220.199 au -199.66.220.200 - 199.66.220.223 us -199.66.220.224 - 199.66.220.231 ar -199.66.220.232 - 199.66.220.255 us -199.66.221.0 - 199.66.221.31 ca -199.66.221.32 - 199.66.251.255 us +199.60.29.0 - 199.60.99.255 ca +199.60.101.0 - 199.60.101.255 us +199.60.102.0 - 199.60.115.255 ca +199.60.116.0 - 199.60.116.255 us +199.60.117.0 - 199.60.122.255 ca +199.60.123.0 - 199.60.123.255 us +199.60.124.0 - 199.60.231.255 ca +199.60.232.0 - 199.60.232.255 us +199.60.233.0 - 199.60.254.255 ca +199.60.255.0 - 199.63.0.255 us +199.63.1.0 - 199.63.1.255 ap +199.63.2.0 - 199.63.141.255 us +199.63.142.0 - 199.63.142.255 in +199.63.143.0 - 199.64.72.247 us +199.64.72.248 - 199.64.72.255 eu +199.64.73.0 - 199.66.87.255 us +199.66.88.0 - 199.66.95.255 ca +199.66.96.0 - 199.66.251.255 us 199.66.252.0 - 199.66.255.255 ca -199.67.0.0 - 199.68.175.255 us +199.67.0.0 - 199.67.202.255 us +199.67.203.0 - 199.67.203.255 eu +199.67.204.0 - 199.68.119.255 us +199.68.120.0 - 199.68.126.255 ca +199.68.127.0 - 199.68.175.255 us 199.68.176.0 - 199.68.183.255 ca 199.68.184.0 - 199.68.191.255 us 199.68.192.0 - 199.68.195.255 bm 199.68.196.0 - 199.71.0.255 us -199.71.1.0 - 199.71.175.255 ca -199.71.176.0 - 199.71.179.255 us -199.71.182.0 - 199.71.208.255 ca -199.71.212.0 - 199.71.223.255 us +199.71.1.0 - 199.71.92.255 ca +199.71.93.0 - 199.71.93.255 pr +199.71.94.0 - 199.71.105.255 ca +199.71.106.0 - 199.71.107.255 us +199.71.108.0 - 199.71.141.255 ca +199.71.142.0 - 199.71.143.255 us +199.71.144.0 - 199.71.158.255 ca +199.71.159.0 - 199.71.159.255 us +199.71.160.0 - 199.71.175.255 ca +199.71.176.0 - 199.71.181.255 us +199.71.182.0 - 199.71.185.255 ca +199.71.186.0 - 199.71.186.255 us +199.71.187.0 - 199.71.208.255 ca +199.71.209.0 - 199.71.233.135 us +199.71.233.136 - 199.71.233.151 se +199.71.233.152 - 199.71.234.135 us +199.71.234.136 - 199.71.234.143 se +199.71.234.144 - 199.71.239.255 us 199.71.240.0 - 199.71.255.255 ca -199.72.0.0 - 199.80.55.31 us -199.80.55.32 - 199.80.55.63 pa -199.80.55.64 - 199.80.55.191 us -199.80.55.192 - 199.80.55.255 hk -199.80.56.0 - 199.83.135.255 us +199.72.0.0 - 199.73.41.255 us +199.73.42.0 - 199.73.43.255 ca +199.73.44.0 - 199.73.59.255 us +199.73.60.0 - 199.73.63.255 jm +199.73.64.0 - 199.76.11.255 us +199.76.12.0 - 199.76.15.255 vi +199.76.16.0 - 199.76.26.255 us +199.76.27.0 - 199.76.27.63 ca +199.76.27.64 - 199.76.28.191 us +199.76.28.192 - 199.76.28.223 ca +199.76.28.224 - 199.79.59.255 us +199.79.60.0 - 199.79.61.255 vg +199.79.62.0 - 199.83.41.255 us +199.83.42.0 - 199.83.43.255 ca +199.83.44.0 - 199.83.83.255 us +199.83.84.0 - 199.83.87.255 ca +199.83.88.0 - 199.83.135.255 us 199.83.136.0 - 199.83.139.255 ca 199.83.140.0 - 199.83.151.255 us 199.83.152.0 - 199.83.159.255 ca 199.83.160.0 - 199.83.191.255 us 199.83.192.0 - 199.83.199.255 gd 199.83.200.0 - 199.83.207.255 ca -199.83.208.0 - 199.83.234.255 us -199.83.235.0 - 199.83.235.31 mx -199.83.235.32 - 199.83.239.255 us +199.83.208.0 - 199.83.239.255 us 199.83.240.0 - 199.83.247.255 ca -199.83.248.0 - 199.83.255.255 us -199.84.0.0 - 199.85.75.255 ca -199.85.76.0 - 199.85.79.255 us -199.85.96.0 - 199.85.124.255 ca +199.83.248.0 - 199.84.0.255 us +199.84.1.0 - 199.84.95.255 ca +199.84.96.0 - 199.84.127.255 us +199.84.128.0 - 199.84.254.255 ca +199.84.255.0 - 199.85.1.255 us +199.85.2.0 - 199.85.6.255 ca +199.85.7.0 - 199.85.7.255 us +199.85.16.0 - 199.85.21.255 ca +199.85.22.0 - 199.85.23.255 us +199.85.24.0 - 199.85.62.255 ca +199.85.63.0 - 199.85.63.255 us +199.85.64.0 - 199.85.75.255 ca +199.85.76.0 - 199.85.98.255 us +199.85.99.0 - 199.85.115.255 ca +199.85.116.0 - 199.85.117.255 us +199.85.118.0 - 199.85.124.255 ca 199.85.125.0 - 199.85.127.255 us -199.85.128.0 - 199.85.203.255 ca +199.85.128.0 - 199.85.199.255 ca +199.85.200.0 - 199.85.200.255 us +199.85.201.0 - 199.85.203.255 ca 199.85.204.0 - 199.85.207.255 pr 199.85.208.0 - 199.85.219.255 us 199.85.220.0 - 199.85.233.255 ca +199.85.234.0 - 199.85.235.255 us 199.85.236.0 - 199.85.239.255 gd -199.85.240.0 - 199.85.243.255 us +199.85.240.0 - 199.85.244.255 us 199.85.245.0 - 199.85.245.255 ca 199.85.246.0 - 199.85.246.255 us 199.85.247.0 - 199.85.249.255 ca 199.85.250.0 - 199.85.250.255 us -199.85.251.0 - 199.85.255.255 ca -199.86.0.0 - 199.87.151.255 us +199.85.251.0 - 199.85.254.255 ca +199.85.255.0 - 199.87.47.255 us +199.87.48.0 - 199.87.51.255 ca +199.87.52.0 - 199.87.151.255 us 199.87.152.0 - 199.87.159.255 ca 199.87.160.0 - 199.87.239.255 us -199.87.240.0 - 199.87.241.31 ca -199.87.241.32 - 199.87.241.63 us -199.87.241.64 - 199.87.247.255 ca +199.87.240.0 - 199.87.247.255 ca 199.87.248.0 - 199.88.207.255 us 199.88.208.0 - 199.88.215.255 nl -199.88.216.0 - 199.91.15.255 us +199.88.216.0 - 199.89.138.255 us +199.89.139.0 - 199.89.139.255 ca +199.89.140.0 - 199.91.15.255 us 199.91.16.0 - 199.91.31.255 ch -199.91.32.0 - 199.91.47.255 us -199.91.128.0 - 199.91.159.255 us -199.91.160.0 - 199.91.163.255 gp +199.91.32.0 - 199.91.75.255 us +199.91.76.0 - 199.91.79.255 pr +199.91.80.0 - 199.91.87.255 ca +199.91.88.0 - 199.91.95.255 us +199.91.96.0 - 199.91.103.255 vg +199.91.104.0 - 199.91.111.255 us +199.91.112.0 - 199.91.119.255 ca +199.91.120.0 - 199.91.159.255 us +199.91.160.0 - 199.91.161.255 gp +199.91.162.0 - 199.91.162.255 mq +199.91.163.0 - 199.91.163.255 gp 199.91.164.0 - 199.91.183.255 us -199.91.184.0 - 199.91.191.255 ca +199.91.184.0 - 199.91.185.127 ca +199.91.185.128 - 199.91.185.143 us +199.91.185.144 - 199.91.185.159 ca +199.91.185.160 - 199.91.185.175 us +199.91.185.176 - 199.91.186.31 ca +199.91.186.32 - 199.91.186.47 us +199.91.186.48 - 199.91.191.255 ca 199.91.192.0 - 199.91.203.255 us 199.91.204.0 - 199.91.215.255 ca -199.91.216.0 - 199.91.251.255 us +199.91.216.0 - 199.91.239.255 us +199.91.240.0 - 199.91.247.255 ca +199.91.248.0 - 199.91.251.255 us 199.91.252.0 - 199.91.255.255 ca 199.92.0.0 - 199.95.177.255 us 199.95.178.0 - 199.95.179.255 eg @@ -119111,133 +96279,48 @@ 199.95.248.0 - 199.95.248.255 gb 199.95.249.0 - 199.96.27.255 us 199.96.28.0 - 199.96.31.255 ca -199.96.32.0 - 199.96.47.255 us -199.96.128.0 - 199.96.195.255 us +199.96.32.0 - 199.96.63.255 us +199.96.64.0 - 199.96.67.255 bm +199.96.68.0 - 199.96.87.255 us +199.96.88.0 - 199.96.95.255 ca +199.96.96.0 - 199.96.195.255 us 199.96.196.0 - 199.96.199.255 ca 199.96.200.0 - 199.96.207.255 us 199.96.208.0 - 199.96.211.255 ca -199.96.212.0 - 199.101.63.255 us -199.101.128.0 - 199.101.132.31 us -199.101.132.32 - 199.101.132.63 hk -199.101.132.64 - 199.101.141.255 us -199.101.142.0 - 199.101.142.255 ca +199.96.212.0 - 199.101.55.255 us +199.101.56.0 - 199.101.63.255 ca +199.101.64.0 - 199.101.71.255 us +199.101.72.0 - 199.101.75.255 ca +199.101.76.0 - 199.101.116.255 us +199.101.117.0 - 199.101.117.255 tw +199.101.118.0 - 199.101.118.255 us +199.101.119.0 - 199.101.119.255 tw +199.101.120.0 - 199.101.141.255 us +199.101.142.0 - 199.101.142.255 gb 199.101.143.0 - 199.101.163.255 us 199.101.164.0 - 199.101.167.255 ca -199.101.168.0 - 199.101.187.255 us -199.101.188.0 - 199.101.191.255 mf +199.101.168.0 - 199.101.185.7 us +199.101.185.8 - 199.101.185.15 ro +199.101.185.16 - 199.101.185.127 us +199.101.185.128 - 199.101.185.159 ro +199.101.185.160 - 199.101.185.175 us +199.101.185.176 - 199.101.185.183 ro +199.101.185.184 - 199.101.187.255 us +199.101.188.0 - 199.101.189.255 gp +199.101.190.0 - 199.101.191.255 mf 199.101.192.0 - 199.101.211.255 us 199.101.212.0 - 199.101.215.255 ca -199.101.216.0 - 199.102.63.255 us +199.101.216.0 - 199.102.95.255 us +199.102.96.0 - 199.102.103.255 ca +199.102.104.0 - 199.102.127.255 us 199.102.128.0 - 199.102.131.255 ca 199.102.132.0 - 199.102.155.255 us 199.102.156.0 - 199.102.159.255 ca -199.102.160.0 - 199.102.165.255 us -199.102.166.0 - 199.102.166.127 au -199.102.166.128 - 199.102.166.255 us -199.102.167.0 - 199.102.167.127 au -199.102.167.128 - 199.102.187.255 us +199.102.160.0 - 199.102.187.255 us 199.102.188.0 - 199.102.191.255 bs 199.102.192.0 - 199.102.199.255 pr 199.102.200.0 - 199.102.207.255 ca -199.102.208.0 - 199.102.224.5 us -199.102.224.6 - 199.102.224.9 cz -199.102.224.10 - 199.102.224.17 us -199.102.224.18 - 199.102.224.21 gb -199.102.224.22 - 199.102.224.92 us -199.102.224.93 - 199.102.224.94 gb -199.102.224.95 - 199.102.224.98 ve -199.102.224.99 - 199.102.224.110 us -199.102.224.111 - 199.102.224.114 au -199.102.224.115 - 199.102.224.161 us -199.102.224.162 - 199.102.224.165 ca -199.102.224.166 - 199.102.224.189 us -199.102.224.190 - 199.102.224.193 ar -199.102.224.194 - 199.102.224.197 us -199.102.224.198 - 199.102.224.225 in -199.102.224.226 - 199.102.224.227 gb -199.102.224.228 - 199.102.224.235 us -199.102.224.236 - 199.102.224.239 cn -199.102.224.240 - 199.102.225.63 us -199.102.225.64 - 199.102.225.67 gb -199.102.225.68 - 199.102.225.79 us -199.102.225.80 - 199.102.225.83 gb -199.102.225.84 - 199.102.225.130 us -199.102.225.131 - 199.102.225.138 gb -199.102.225.139 - 199.102.225.159 us -199.102.225.160 - 199.102.225.164 au -199.102.225.165 - 199.102.225.168 us -199.102.225.169 - 199.102.225.172 gb -199.102.225.173 - 199.102.225.204 us -199.102.225.205 - 199.102.225.208 in -199.102.225.209 - 199.102.225.223 us -199.102.225.224 - 199.102.225.227 gb -199.102.225.228 - 199.102.226.22 us -199.102.226.23 - 199.102.226.26 au -199.102.226.27 - 199.102.226.30 ca -199.102.226.31 - 199.102.226.57 us -199.102.226.58 - 199.102.226.61 ca -199.102.226.62 - 199.102.226.65 us -199.102.226.66 - 199.102.226.77 gb -199.102.226.78 - 199.102.226.122 us -199.102.226.123 - 199.102.226.127 ca -199.102.226.128 - 199.102.226.139 us -199.102.226.140 - 199.102.226.143 ca -199.102.226.144 - 199.102.226.155 us -199.102.226.156 - 199.102.226.159 ca -199.102.226.160 - 199.102.226.185 us -199.102.226.186 - 199.102.226.189 gb -199.102.226.190 - 199.102.227.16 us -199.102.227.17 - 199.102.227.20 ca -199.102.227.21 - 199.102.227.120 us -199.102.227.121 - 199.102.227.124 mx -199.102.227.125 - 199.102.227.135 us -199.102.227.136 - 199.102.227.139 gb -199.102.227.140 - 199.102.227.181 us -199.102.227.182 - 199.102.227.225 in -199.102.227.226 - 199.102.228.9 us -199.102.228.10 - 199.102.228.13 ca -199.102.228.14 - 199.102.228.61 us -199.102.228.62 - 199.102.228.65 ca -199.102.228.66 - 199.102.228.69 us -199.102.228.70 - 199.102.228.73 ca -199.102.228.74 - 199.102.228.77 us -199.102.228.78 - 199.102.228.81 gb -199.102.228.82 - 199.102.228.147 us -199.102.228.148 - 199.102.228.151 gb -199.102.228.152 - 199.102.228.155 cn -199.102.228.156 - 199.102.228.180 us -199.102.228.181 - 199.102.228.188 au -199.102.228.189 - 199.102.228.193 us -199.102.228.194 - 199.102.228.197 au -199.102.228.198 - 199.102.228.221 us -199.102.228.222 - 199.102.228.231 gb -199.102.228.232 - 199.102.230.22 us -199.102.230.23 - 199.102.230.26 ca -199.102.230.27 - 199.102.230.40 us -199.102.230.41 - 199.102.230.44 gb -199.102.230.45 - 199.102.230.170 us -199.102.230.171 - 199.102.230.182 in -199.102.230.183 - 199.102.230.186 us -199.102.230.187 - 199.102.230.191 gb -199.102.230.192 - 199.102.230.246 us -199.102.230.247 - 199.102.230.250 sg -199.102.230.251 - 199.102.231.24 us -199.102.231.25 - 199.102.231.28 gb -199.102.231.29 - 199.102.231.95 us -199.102.231.96 - 199.102.231.99 gb -199.102.231.100 - 199.102.231.103 us -199.102.231.104 - 199.102.231.107 pr -199.102.231.108 - 199.102.231.111 ca -199.102.231.112 - 199.102.231.119 us -199.102.231.120 - 199.102.231.123 ca -199.102.231.124 - 199.102.231.127 au -199.102.231.128 - 199.102.231.153 us -199.102.231.154 - 199.102.231.157 sg -199.102.231.158 - 199.102.231.165 us -199.102.231.166 - 199.102.231.169 ca -199.102.231.170 - 199.102.231.240 us -199.102.231.241 - 199.102.231.244 gb -199.102.231.245 - 199.103.7.255 us +199.102.208.0 - 199.103.7.255 us 199.103.8.0 - 199.103.12.255 nl 199.103.13.0 - 199.103.25.255 us 199.103.28.0 - 199.103.31.255 tc @@ -119253,78 +96336,63 @@ 199.103.81.0 - 199.103.81.255 es 199.103.82.0 - 199.103.83.255 gb 199.103.84.0 - 199.103.84.255 nl +199.103.85.0 - 199.103.85.255 ca 199.103.86.0 - 199.103.86.255 gb 199.103.87.0 - 199.103.88.255 fr -199.103.90.0 - 199.103.91.255 us +199.103.89.0 - 199.103.91.255 us 199.103.92.0 - 199.103.92.255 fr 199.103.93.0 - 199.103.93.255 de -199.103.94.0 - 199.103.95.255 us -199.103.96.0 - 199.103.99.255 de +199.103.94.0 - 199.103.96.255 us +199.103.97.0 - 199.103.99.255 de 199.103.102.0 - 199.103.102.255 cl 199.103.103.0 - 199.103.103.255 jp 199.103.104.0 - 199.103.105.255 at 199.103.106.0 - 199.103.106.255 ch 199.103.107.0 - 199.103.107.255 de -199.103.109.0 - 199.103.110.255 us +199.103.108.0 - 199.103.110.255 us 199.103.111.0 - 199.103.112.255 ch 199.103.113.0 - 199.103.113.255 us 199.103.114.0 - 199.103.117.255 gb +199.103.118.0 - 199.103.118.255 us 199.103.119.0 - 199.103.119.255 it 199.103.120.0 - 199.103.122.255 us -199.103.123.0 - 199.103.125.255 fr +199.103.123.0 - 199.103.123.255 be +199.103.124.0 - 199.103.125.255 fr 199.103.126.0 - 199.103.126.255 be 199.103.127.0 - 199.103.127.255 de -199.103.128.0 - 199.106.210.7 us -199.106.210.8 - 199.106.210.31 in -199.106.210.32 - 199.106.210.79 no -199.106.210.80 - 199.106.212.31 us -199.106.212.32 - 199.106.212.47 in -199.106.212.48 - 199.115.63.255 us +199.103.128.0 - 199.114.222.255 us +199.114.223.0 - 199.114.223.255 a1 +199.114.224.0 - 199.114.231.255 us +199.114.232.0 - 199.114.235.255 ca +199.114.236.0 - 199.114.251.255 us +199.114.252.0 - 199.114.255.255 ca +199.115.0.0 - 199.115.25.255 us +199.115.28.0 - 199.115.29.193 us +199.115.29.194 - 199.115.29.194 ca +199.115.29.195 - 199.115.63.255 us +199.115.64.0 - 199.115.71.255 ca +199.115.72.0 - 199.115.87.255 us +199.115.88.0 - 199.115.95.255 ca +199.115.96.0 - 199.115.123.255 us +199.115.124.0 - 199.115.127.255 ca 199.115.128.0 - 199.115.151.255 us -199.115.152.0 - 199.115.159.255 ca -199.115.160.0 - 199.116.55.255 us +199.115.152.0 - 199.115.158.255 ca +199.115.159.0 - 199.116.55.255 us 199.116.56.0 - 199.116.63.255 pr -199.116.128.0 - 199.116.215.255 us +199.116.64.0 - 199.116.199.255 us +199.116.208.0 - 199.116.211.255 us 199.116.216.0 - 199.116.223.255 ca 199.116.224.0 - 199.116.231.255 us 199.116.232.0 - 199.116.235.255 ca -199.116.236.0 - 199.119.63.255 us +199.116.236.0 - 199.116.239.255 us +199.116.240.0 - 199.116.243.255 ca +199.116.244.0 - 199.117.255.255 us +199.118.0.0 - 199.118.255.255 fr +199.119.0.0 - 199.119.127.255 us 199.119.128.0 - 199.119.131.255 ca -199.119.132.0 - 199.119.135.255 us -199.119.136.0 - 199.119.143.255 vi -199.119.144.0 - 199.119.160.223 us -199.119.160.224 - 199.119.160.231 ca -199.119.160.232 - 199.119.161.23 us -199.119.161.24 - 199.119.161.31 eg -199.119.161.32 - 199.119.161.55 us -199.119.161.56 - 199.119.161.71 ca -199.119.161.72 - 199.119.161.127 us -199.119.161.128 - 199.119.161.135 jm -199.119.161.136 - 199.119.161.143 mx -199.119.161.144 - 199.119.162.31 us -199.119.162.32 - 199.119.162.39 gb -199.119.162.40 - 199.119.162.47 ca -199.119.162.48 - 199.119.162.71 us -199.119.162.72 - 199.119.162.79 co -199.119.162.80 - 199.119.163.71 us -199.119.163.72 - 199.119.163.79 tr -199.119.163.80 - 199.119.177.191 us -199.119.177.192 - 199.119.177.255 il -199.119.178.0 - 199.119.215.255 us +199.119.132.0 - 199.119.215.255 us 199.119.216.0 - 199.119.219.255 ca -199.119.220.0 - 199.119.224.235 us -199.119.224.236 - 199.119.224.238 bd -199.119.224.239 - 199.119.225.33 us -199.119.225.34 - 199.119.225.36 in -199.119.225.37 - 199.119.225.43 us -199.119.225.44 - 199.119.225.45 ae -199.119.225.46 - 199.119.226.67 us -199.119.226.68 - 199.119.226.80 pt -199.119.226.81 - 199.119.226.149 us -199.119.226.150 - 199.119.226.159 pt -199.119.226.160 - 199.119.227.233 us -199.119.227.234 - 199.119.227.241 th -199.119.227.242 - 199.119.227.255 us +199.119.220.0 - 199.119.227.255 us 199.119.228.0 - 199.119.228.255 bo 199.119.229.0 - 199.119.229.255 ru 199.119.230.0 - 199.119.230.255 us @@ -119333,9 +96401,22 @@ 199.119.236.0 - 199.119.247.255 us 199.119.248.0 - 199.119.251.255 pr 199.119.252.0 - 199.119.255.255 ca -199.120.0.0 - 199.125.255.255 us +199.120.0.0 - 199.120.238.255 us +199.120.239.0 - 199.120.239.255 ca +199.120.240.0 - 199.122.6.255 us +199.122.7.0 - 199.122.7.255 ca +199.122.8.0 - 199.122.115.255 us +199.122.116.0 - 199.122.119.255 ca +199.122.120.0 - 199.124.2.255 us +199.124.3.0 - 199.124.3.255 ca +199.124.4.0 - 199.124.5.255 us +199.124.8.0 - 199.125.255.255 us 199.126.0.0 - 199.126.255.255 ca -199.127.0.0 - 199.127.63.255 us +199.127.0.0 - 199.127.103.223 us +199.127.103.224 - 199.127.103.239 ae +199.127.103.240 - 199.127.107.255 us +199.127.108.0 - 199.127.111.255 ca +199.127.112.0 - 199.127.127.255 us 199.127.128.0 - 199.127.131.255 ca 199.127.132.0 - 199.127.161.255 us 199.127.162.0 - 199.127.162.255 in @@ -119351,41 +96432,48 @@ 199.162.230.0 - 199.162.230.255 ca 199.162.231.0 - 199.164.128.255 us 199.164.129.0 - 199.164.129.255 ca -199.164.130.0 - 199.165.207.255 us +199.164.130.0 - 199.164.191.255 us +199.164.192.0 - 199.164.192.255 ca +199.164.193.0 - 199.164.254.255 us +199.164.255.0 - 199.164.255.255 ca +199.165.0.0 - 199.165.207.255 us 199.165.208.0 - 199.165.211.255 gb -199.165.212.0 - 199.165.255.255 us -199.166.0.0 - 199.166.23.255 ca +199.165.212.0 - 199.165.212.255 ca +199.165.213.0 - 199.166.0.255 us +199.166.1.0 - 199.166.2.255 ca +199.166.3.0 - 199.166.3.255 us +199.166.4.0 - 199.166.23.255 ca 199.166.24.0 - 199.166.33.255 us -199.166.34.0 - 199.166.247.255 ca -199.166.248.0 - 199.166.250.255 us -199.166.251.0 - 199.166.255.255 ca -199.167.0.0 - 199.167.15.255 us -199.167.128.0 - 199.167.128.223 ca -199.167.128.224 - 199.167.128.239 us -199.167.128.240 - 199.167.131.255 ca -199.167.132.0 - 199.167.133.112 us -199.167.133.113 - 199.167.133.128 gb -199.167.133.129 - 199.167.135.159 us -199.167.135.160 - 199.167.135.175 id -199.167.135.176 - 199.167.135.255 us +199.166.34.0 - 199.166.37.255 in +199.166.38.0 - 199.166.235.255 ca +199.166.236.0 - 199.166.236.255 us +199.166.237.0 - 199.166.247.255 ca +199.166.248.0 - 199.166.251.255 us +199.166.252.0 - 199.166.254.255 ca +199.166.255.0 - 199.167.15.255 us +199.167.16.0 - 199.167.16.63 ca +199.167.16.64 - 199.167.16.79 us +199.167.16.80 - 199.167.16.191 ca +199.167.16.192 - 199.167.16.255 us +199.167.17.0 - 199.167.19.191 ca +199.167.19.192 - 199.167.19.255 us +199.167.20.0 - 199.167.21.255 ca +199.167.22.0 - 199.167.23.255 us +199.167.24.0 - 199.167.27.255 ca +199.167.28.0 - 199.167.103.255 us +199.167.104.0 - 199.167.111.255 ca +199.167.112.0 - 199.167.115.255 us +199.167.116.0 - 199.167.119.255 ca +199.167.120.0 - 199.167.127.255 us +199.167.128.0 - 199.167.131.255 ca +199.167.132.0 - 199.167.135.255 us 199.167.136.0 - 199.167.143.255 ca 199.167.144.0 - 199.167.151.255 us 199.167.152.0 - 199.167.167.255 ca -199.167.168.0 - 199.168.63.255 us -199.168.128.0 - 199.168.184.124 us -199.168.184.125 - 199.168.184.129 ca -199.168.184.130 - 199.168.184.224 us -199.168.184.225 - 199.168.184.231 ca -199.168.184.232 - 199.168.187.92 us -199.168.187.93 - 199.168.187.96 lk -199.168.187.97 - 199.168.191.57 us -199.168.191.58 - 199.168.191.71 pk -199.168.191.72 - 199.168.215.255 us +199.167.168.0 - 199.168.215.255 us 199.168.216.0 - 199.168.223.255 ca 199.168.224.0 - 199.168.247.255 us -199.168.248.0 - 199.168.248.31 ca -199.168.248.32 - 199.168.248.39 us -199.168.248.40 - 199.168.251.255 ca +199.168.248.0 - 199.168.251.255 ca 199.168.252.0 - 199.172.191.255 us 199.172.192.0 - 199.172.227.255 bm 199.172.228.0 - 199.172.229.255 ky @@ -119394,71 +96482,113 @@ 199.173.153.0 - 199.173.153.255 kw 199.173.154.0 - 199.174.255.255 us 199.175.0.0 - 199.175.43.255 ca -199.175.44.0 - 199.175.47.255 us -199.175.64.0 - 199.175.183.255 ca -199.175.184.0 - 199.175.187.255 us -199.175.188.0 - 199.175.255.255 ca -199.176.0.0 - 199.180.25.255 us +199.175.44.0 - 199.175.59.255 us +199.175.60.0 - 199.175.100.255 ca +199.175.101.0 - 199.175.101.255 us +199.175.102.0 - 199.175.183.255 ca +199.175.184.0 - 199.175.188.255 us +199.175.189.0 - 199.175.254.255 ca +199.175.255.0 - 199.180.25.255 us 199.180.28.0 - 199.180.31.255 ca 199.180.32.0 - 199.180.51.255 us 199.180.52.0 - 199.180.55.255 ca -199.180.56.0 - 199.180.63.255 us -199.180.128.0 - 199.180.129.89 us -199.180.129.90 - 199.180.129.97 gb -199.180.129.98 - 199.180.129.114 us -199.180.129.115 - 199.180.129.116 bd -199.180.129.117 - 199.180.129.157 us -199.180.129.158 - 199.180.129.164 ro -199.180.129.165 - 199.180.130.129 us -199.180.130.130 - 199.180.130.130 in -199.180.130.131 - 199.180.130.137 us -199.180.130.138 - 199.180.130.138 in -199.180.130.139 - 199.180.132.49 us -199.180.132.50 - 199.180.132.61 pt -199.180.132.62 - 199.180.132.191 us -199.180.132.192 - 199.180.132.199 pt -199.180.132.200 - 199.180.133.20 us -199.180.133.21 - 199.180.133.21 in -199.180.133.22 - 199.180.133.147 us -199.180.133.148 - 199.180.133.163 br -199.180.133.164 - 199.180.133.209 us -199.180.133.210 - 199.180.133.211 in -199.180.133.212 - 199.181.255.255 us -199.182.0.0 - 199.182.63.255 ca -199.182.80.0 - 199.182.95.255 us -199.182.128.0 - 199.184.255.255 us -199.185.0.0 - 199.185.138.255 ca +199.180.56.0 - 199.180.95.255 us +199.180.96.0 - 199.180.99.255 ca +199.180.100.0 - 199.180.113.255 us +199.180.114.0 - 199.180.114.255 pl +199.180.115.0 - 199.180.152.255 us +199.180.153.0 - 199.180.153.255 mx +199.180.154.0 - 199.180.167.255 us +199.180.168.0 - 199.180.175.255 ca +199.180.176.0 - 199.181.80.255 us +199.181.81.0 - 199.181.81.255 ca +199.181.82.0 - 199.181.129.255 us +199.181.130.0 - 199.181.130.255 ap +199.181.131.0 - 199.181.181.255 us +199.181.183.0 - 199.181.183.255 ca +199.181.184.0 - 199.181.255.255 us +199.182.0.0 - 199.182.47.255 ca +199.182.48.0 - 199.182.51.255 us +199.182.52.0 - 199.182.55.255 ca +199.182.56.0 - 199.182.95.255 us +199.182.96.0 - 199.182.99.255 ca +199.182.100.0 - 199.182.115.255 us +199.182.116.0 - 199.182.119.255 ca +199.182.120.0 - 199.182.123.255 us +199.182.128.0 - 199.182.135.255 ca +199.182.136.0 - 199.182.191.255 us +199.182.192.0 - 199.182.195.255 tc +199.182.196.0 - 199.182.203.255 us +199.182.204.0 - 199.182.207.255 ca +199.182.208.0 - 199.182.215.255 us +199.182.216.0 - 199.182.222.255 ca +199.182.223.0 - 199.182.223.7 us +199.182.223.8 - 199.182.223.255 ca +199.182.224.0 - 199.185.0.255 us +199.185.1.0 - 199.185.96.255 ca +199.185.97.0 - 199.185.97.255 us +199.185.98.0 - 199.185.129.255 ca +199.185.130.0 - 199.185.131.255 us +199.185.132.0 - 199.185.138.255 ca 199.185.139.0 - 199.185.139.255 gb -199.185.140.0 - 199.185.255.255 ca +199.185.140.0 - 199.185.173.255 ca +199.185.174.0 - 199.185.175.255 us +199.185.176.0 - 199.185.179.255 ca +199.185.180.0 - 199.185.182.255 us +199.185.183.0 - 199.185.183.255 ca +199.185.184.0 - 199.185.185.255 us +199.185.186.0 - 199.185.207.255 ca +199.185.208.0 - 199.185.208.255 us +199.185.209.0 - 199.185.255.255 ca 199.186.0.0 - 199.186.24.255 us 199.186.25.0 - 199.186.34.255 cl 199.186.35.0 - 199.187.191.255 us 199.187.192.0 - 199.187.195.255 ca -199.187.196.0 - 199.187.227.255 us +199.187.196.0 - 199.187.223.255 us 199.187.228.0 - 199.187.231.255 ca 199.187.232.0 - 199.188.31.255 us 199.188.32.0 - 199.188.43.255 ca -199.188.44.0 - 199.188.47.255 us -199.188.128.0 - 199.188.171.255 us +199.188.44.0 - 199.188.59.255 us +199.188.60.0 - 199.188.63.255 ca +199.188.64.0 - 199.188.67.255 us +199.188.68.0 - 199.188.71.255 ca +199.188.72.0 - 199.188.111.255 us +199.188.112.0 - 199.188.115.255 ca +199.188.116.0 - 199.188.171.255 us 199.188.172.0 - 199.188.175.255 ca 199.188.176.0 - 199.188.187.255 us 199.188.188.0 - 199.188.191.255 ca 199.188.192.0 - 199.188.195.255 us 199.188.196.0 - 199.188.199.255 ca 199.188.200.0 - 199.188.219.255 us -199.188.220.0 - 199.188.220.7 fr -199.188.220.8 - 199.188.223.255 ca -199.188.224.0 - 199.189.63.255 us -199.189.128.0 - 199.189.131.255 us +199.188.220.0 - 199.188.221.255 fr +199.188.222.0 - 199.188.223.255 ca +199.188.224.0 - 199.188.235.255 us +199.188.236.0 - 199.188.237.255 a1 +199.188.238.0 - 199.189.25.255 us +199.189.26.0 - 199.189.27.255 ca +199.189.28.0 - 199.189.75.255 us +199.189.76.0 - 199.189.79.255 ca +199.189.80.0 - 199.189.87.255 us +199.189.88.0 - 199.189.95.255 ca +199.189.96.0 - 199.189.111.255 us +199.189.112.0 - 199.189.114.255 ag +199.189.115.0 - 199.189.115.255 dm +199.189.116.0 - 199.189.131.255 us 199.189.132.0 - 199.189.135.255 ca 199.189.136.0 - 199.189.199.255 us 199.189.200.0 - 199.189.203.255 ca 199.189.204.0 - 199.189.235.255 us 199.189.236.0 - 199.189.239.255 ca -199.189.240.0 - 199.191.191.255 us +199.189.240.0 - 199.190.43.255 us +199.190.44.0 - 199.190.47.255 a2 +199.190.48.0 - 199.191.49.255 us +199.191.50.0 - 199.191.51.255 vg +199.191.52.0 - 199.191.191.255 us 199.191.192.0 - 199.191.192.255 il -199.191.193.0 - 199.192.63.255 us -199.192.128.0 - 199.192.175.255 us +199.191.193.0 - 199.192.103.255 us +199.192.104.0 - 199.192.107.255 ca +199.192.108.0 - 199.192.175.255 us 199.192.176.0 - 199.192.179.255 ca 199.192.180.0 - 199.192.183.255 us 199.192.184.0 - 199.192.191.255 ca @@ -119466,16 +96596,19 @@ 199.192.212.0 - 199.192.215.255 ca 199.192.216.0 - 199.192.223.255 us 199.192.224.0 - 199.192.227.255 vc -199.192.228.0 - 199.192.228.255 us -199.192.229.0 - 199.192.229.255 ca -199.192.230.0 - 199.192.231.255 us +199.192.228.0 - 199.192.231.255 us 199.192.232.0 - 199.192.239.255 ca -199.192.240.0 - 199.193.63.255 us -199.193.128.0 - 199.193.167.255 us +199.192.240.0 - 199.193.47.255 us +199.193.48.0 - 199.193.55.255 ca +199.193.56.0 - 199.193.87.255 us +199.193.88.0 - 199.193.95.255 ca +199.193.96.0 - 199.193.167.255 us 199.193.168.0 - 199.193.175.255 ca 199.193.176.0 - 199.193.227.255 us 199.193.228.0 - 199.193.231.255 bm -199.193.232.0 - 199.194.0.255 us +199.193.232.0 - 199.193.240.255 us +199.193.241.0 - 199.193.242.255 pr +199.193.243.0 - 199.194.0.255 us 199.194.1.0 - 199.194.1.255 ca 199.194.2.0 - 199.194.2.255 us 199.194.3.0 - 199.194.6.255 ca @@ -119487,9 +96620,7 @@ 199.194.17.0 - 199.194.17.255 ca 199.194.18.0 - 199.194.20.255 us 199.194.21.0 - 199.194.21.255 ca -199.194.22.0 - 199.194.23.255 us -199.194.24.0 - 199.194.24.255 pr -199.194.25.0 - 199.194.25.255 us +199.194.22.0 - 199.194.25.255 us 199.194.26.0 - 199.194.26.255 ca 199.194.27.0 - 199.194.27.255 us 199.194.28.0 - 199.194.28.255 ca @@ -119499,11 +96630,7 @@ 199.194.35.0 - 199.194.36.255 ca 199.194.37.0 - 199.194.40.255 us 199.194.41.0 - 199.194.42.255 ca -199.194.43.0 - 199.194.48.255 us -199.194.49.0 - 199.194.49.255 ca -199.194.50.0 - 199.194.51.255 us -199.194.52.0 - 199.194.52.255 ca -199.194.53.0 - 199.194.57.255 us +199.194.43.0 - 199.194.57.255 us 199.194.58.0 - 199.194.58.255 ca 199.194.59.0 - 199.194.62.255 us 199.194.63.0 - 199.194.63.255 ca @@ -119534,8 +96661,8 @@ 199.194.102.0 - 199.194.105.255 us 199.194.106.0 - 199.194.106.255 ca 199.194.107.0 - 199.194.107.255 us -199.194.108.0 - 199.194.109.255 ca -199.194.110.0 - 199.194.112.255 us +199.194.108.0 - 199.194.108.255 ca +199.194.109.0 - 199.194.112.255 us 199.194.113.0 - 199.194.114.255 ca 199.194.115.0 - 199.194.119.255 us 199.194.120.0 - 199.194.120.255 ca @@ -119555,15 +96682,11 @@ 199.194.140.0 - 199.194.140.255 ca 199.194.141.0 - 199.194.144.255 us 199.194.145.0 - 199.194.146.255 ca -199.194.147.0 - 199.194.147.255 us -199.194.148.0 - 199.194.148.255 ca -199.194.149.0 - 199.194.154.255 us +199.194.147.0 - 199.194.154.255 us 199.194.155.0 - 199.194.155.255 ca 199.194.156.0 - 199.194.170.255 us 199.194.171.0 - 199.194.171.255 pr -199.194.172.0 - 199.194.183.255 us -199.194.184.0 - 199.194.184.255 ca -199.194.185.0 - 199.194.188.255 us +199.194.172.0 - 199.194.188.255 us 199.194.189.0 - 199.194.189.255 ca 199.194.190.0 - 199.194.218.255 us 199.194.219.0 - 199.194.219.255 ca @@ -119581,22 +96704,70 @@ 199.194.239.0 - 199.194.239.255 ca 199.194.240.0 - 199.194.241.255 us 199.194.242.0 - 199.194.242.255 ca -199.194.243.0 - 199.195.147.255 us +199.194.243.0 - 199.195.113.255 us +199.195.114.0 - 199.195.115.255 ca +199.195.116.0 - 199.195.117.255 us +199.195.118.0 - 199.195.118.255 is +199.195.119.0 - 199.195.147.255 us 199.195.148.0 - 199.195.151.255 ca -199.195.152.0 - 199.195.155.255 us -199.196.0.0 - 199.196.50.255 us +199.195.152.0 - 199.195.159.255 us +199.195.160.0 - 199.195.167.255 ca +199.195.168.0 - 199.195.192.255 us +199.195.193.0 - 199.195.194.27 sg +199.195.194.28 - 199.195.194.28 us +199.195.194.29 - 199.195.195.255 sg +199.195.196.0 - 199.195.196.255 us +199.195.197.0 - 199.195.197.53 sg +199.195.197.54 - 199.195.197.54 us +199.195.197.55 - 199.195.197.255 sg +199.195.198.0 - 199.195.203.255 us +199.195.204.0 - 199.195.207.255 ca +199.195.208.0 - 199.195.219.255 us +199.195.220.0 - 199.195.223.255 jm +199.195.224.0 - 199.195.227.255 us +199.195.228.0 - 199.195.231.255 ca +199.195.232.0 - 199.196.50.255 us 199.196.51.0 - 199.196.51.255 gb 199.196.52.0 - 199.197.255.255 us -199.198.0.0 - 199.198.219.255 ca -199.198.220.0 - 199.201.255.255 us -199.202.32.0 - 199.202.90.255 ca +199.198.0.0 - 199.198.209.255 ca +199.198.210.0 - 199.198.211.255 us +199.198.212.0 - 199.198.212.255 ca +199.198.213.0 - 199.198.215.255 us +199.198.216.0 - 199.198.219.255 ca +199.198.220.0 - 199.198.222.255 us +199.198.223.0 - 199.198.223.255 ca +199.198.224.0 - 199.198.250.255 us +199.198.251.0 - 199.198.251.255 ca +199.198.252.0 - 199.201.44.255 us +199.201.45.0 - 199.201.45.255 ap +199.201.46.0 - 199.201.65.255 us +199.201.66.0 - 199.201.66.255 gb +199.201.67.0 - 199.201.83.255 us +199.201.84.0 - 199.201.87.255 ky +199.201.88.0 - 199.201.119.255 us +199.201.120.0 - 199.201.127.255 ca +199.201.128.0 - 199.201.221.255 us +199.201.222.0 - 199.201.222.255 ca +199.201.223.0 - 199.201.255.255 us +199.202.0.0 - 199.202.31.255 ca +199.202.32.0 - 199.202.63.255 us +199.202.64.0 - 199.202.90.255 ca 199.202.91.0 - 199.202.91.255 us -199.202.92.0 - 199.202.215.255 ca +199.202.92.0 - 199.202.115.255 ca +199.202.116.0 - 199.202.135.255 us +199.202.136.0 - 199.202.215.255 ca 199.202.216.0 - 199.202.223.255 us -199.202.224.0 - 199.202.255.255 ca +199.202.224.0 - 199.202.231.255 ca +199.202.232.0 - 199.202.233.255 us +199.202.234.0 - 199.202.239.255 ca +199.202.240.0 - 199.202.253.255 us +199.202.254.0 - 199.202.254.255 ca +199.202.255.0 - 199.202.255.255 us 199.203.0.0 - 199.203.255.255 il 199.204.0.0 - 199.204.3.255 ca -199.204.4.0 - 199.204.43.255 us +199.204.4.0 - 199.204.10.0 us +199.204.10.1 - 199.204.10.1 eu +199.204.10.2 - 199.204.43.255 us 199.204.44.0 - 199.204.55.255 ca 199.204.56.0 - 199.204.63.255 us 199.204.64.0 - 199.204.79.255 ca @@ -119604,127 +96775,179 @@ 199.204.120.0 - 199.204.123.255 ca 199.204.124.0 - 199.204.127.255 us 199.204.128.0 - 199.204.131.255 ca -199.204.132.0 - 199.204.135.31 us -199.204.135.32 - 199.204.135.47 co -199.204.135.48 - 199.204.183.255 us -199.204.184.0 - 199.204.187.255 jm -199.204.188.0 - 199.204.207.255 us +199.204.132.0 - 199.204.207.255 us 199.204.208.0 - 199.204.215.255 ca 199.204.216.0 - 199.204.231.255 us 199.204.232.0 - 199.204.239.255 vg 199.204.240.0 - 199.212.0.255 us -199.212.1.0 - 199.212.217.255 ca +199.212.1.0 - 199.212.13.255 ca +199.212.14.0 - 199.212.14.255 us +199.212.15.0 - 199.212.55.255 ca +199.212.56.0 - 199.212.57.255 us +199.212.58.0 - 199.212.85.255 ca +199.212.86.0 - 199.212.87.255 us +199.212.88.0 - 199.212.94.255 ca +199.212.95.0 - 199.212.95.255 us +199.212.96.0 - 199.212.123.255 ca +199.212.124.0 - 199.212.124.255 us +199.212.125.0 - 199.212.217.255 ca 199.212.218.0 - 199.212.223.255 us 199.212.224.0 - 199.216.255.255 ca -199.217.0.0 - 199.228.176.255 us +199.217.0.0 - 199.217.119.255 us +199.217.120.0 - 199.217.123.255 ca +199.217.124.0 - 199.223.214.39 us +199.223.214.40 - 199.223.214.41 nl +199.223.214.42 - 199.228.176.255 us 199.228.177.0 - 199.228.177.255 gb -199.228.178.0 - 199.229.189.255 us +199.228.178.0 - 199.229.55.255 us +199.229.56.0 - 199.229.57.255 gb +199.229.58.0 - 199.229.158.255 us +199.229.159.0 - 199.229.159.255 be +199.229.160.0 - 199.229.189.255 us 199.229.190.0 - 199.229.190.255 gb -199.229.191.0 - 199.229.215.255 us +199.229.191.0 - 199.229.207.255 us +199.229.208.0 - 199.229.208.255 in +199.229.209.0 - 199.229.215.255 us 199.229.216.0 - 199.229.216.255 hk 199.229.217.0 - 199.229.219.255 us -199.230.0.0 - 199.230.52.5 us -199.230.52.6 - 199.230.52.9 fr -199.230.52.10 - 199.230.52.13 be -199.230.52.14 - 199.230.52.30 us -199.230.52.31 - 199.230.52.34 au -199.230.52.35 - 199.230.52.54 us -199.230.52.55 - 199.230.52.58 ca -199.230.52.59 - 199.230.52.74 us -199.230.52.75 - 199.230.52.78 au -199.230.52.79 - 199.230.52.101 us -199.230.52.102 - 199.230.52.105 es -199.230.52.106 - 199.230.52.140 us -199.230.52.141 - 199.230.52.144 it -199.230.52.145 - 199.230.52.164 us -199.230.52.165 - 199.230.52.168 ca -199.230.52.169 - 199.230.52.172 us -199.230.52.173 - 199.230.52.176 ca -199.230.52.177 - 199.230.52.193 us -199.230.52.194 - 199.230.52.197 au -199.230.52.198 - 199.230.52.235 us -199.230.52.236 - 199.230.52.239 ca -199.230.52.240 - 199.230.52.252 us -199.230.52.253 - 199.230.52.254 fr -199.230.52.255 - 199.230.53.104 us -199.230.53.105 - 199.230.53.108 se -199.230.53.109 - 199.230.53.155 us -199.230.53.156 - 199.230.53.159 gb -199.230.53.160 - 199.230.53.223 us -199.230.53.224 - 199.230.53.227 br -199.230.53.228 - 199.230.53.235 gb -199.230.53.236 - 199.233.170.255 us +199.229.220.0 - 199.229.223.255 ca +199.229.224.0 - 199.229.229.255 us +199.229.230.0 - 199.229.230.255 de +199.229.231.0 - 199.229.243.255 us +199.229.244.0 - 199.229.244.255 pr +199.229.245.0 - 199.229.247.255 us +199.229.248.0 - 199.229.248.255 gb +199.229.249.0 - 199.230.159.255 us +199.230.160.0 - 199.230.160.255 gb +199.230.161.0 - 199.231.124.255 us +199.231.125.0 - 199.231.126.255 ca +199.231.127.0 - 199.231.199.255 us +199.231.200.0 - 199.231.207.255 ca +199.231.208.0 - 199.231.219.255 us +199.231.220.0 - 199.231.223.255 ca +199.231.224.0 - 199.231.226.63 us +199.231.226.64 - 199.231.226.95 ca +199.231.226.96 - 199.231.234.255 us +199.231.235.0 - 199.231.235.255 ca +199.231.236.0 - 199.232.56.255 us +199.232.57.0 - 199.232.57.255 gb +199.232.58.0 - 199.233.25.255 us +199.233.26.0 - 199.233.27.255 ca +199.233.28.0 - 199.233.94.255 us +199.233.95.0 - 199.233.95.255 ca +199.233.96.0 - 199.233.170.255 us 199.233.171.0 - 199.233.171.255 ca 199.233.172.0 - 199.233.182.255 us 199.233.183.0 - 199.233.184.255 ca -199.233.185.0 - 199.233.223.255 us -199.234.0.0 - 199.234.255.255 us +199.233.185.0 - 199.234.255.255 us 199.235.0.0 - 199.235.255.255 ca -199.236.0.0 - 199.242.255.255 us +199.236.0.0 - 199.241.127.255 us +199.241.128.0 - 199.241.135.255 ca +199.241.136.0 - 199.241.151.255 us +199.241.152.0 - 199.241.159.255 au +199.241.160.0 - 199.241.167.255 ca +199.241.168.0 - 199.241.206.255 us +199.241.207.0 - 199.241.207.255 ca +199.241.208.0 - 199.242.255.255 us 199.243.0.0 - 199.243.255.255 ca -199.244.0.0 - 199.245.235.255 us -199.245.236.0 - 199.245.236.255 ca -199.245.237.0 - 199.245.255.255 us -199.246.0.0 - 199.246.72.127 ca -199.246.72.128 - 199.246.72.191 us -199.246.72.192 - 199.246.76.255 ca +199.244.0.0 - 199.244.75.255 us +199.244.76.0 - 199.244.79.255 ca +199.244.80.0 - 199.244.117.255 us +199.244.118.0 - 199.244.118.255 cn +199.244.119.0 - 199.244.119.255 us +199.244.120.0 - 199.244.123.255 ca +199.244.124.0 - 199.244.197.255 us +199.244.198.0 - 199.244.199.255 ca +199.244.200.0 - 199.245.34.10 us +199.245.34.11 - 199.245.34.11 eu +199.245.34.12 - 199.245.35.255 us +199.245.36.0 - 199.245.36.255 ap +199.245.37.0 - 199.245.188.255 us +199.245.189.0 - 199.245.189.255 ca +199.245.190.0 - 199.246.0.255 us +199.246.1.0 - 199.246.76.255 ca 199.246.77.0 - 199.246.87.255 us 199.246.88.0 - 199.246.105.255 ca 199.246.106.0 - 199.246.106.255 us -199.246.107.0 - 199.247.255.255 ca +199.246.107.0 - 199.246.138.255 ca +199.246.139.0 - 199.246.139.255 us +199.246.140.0 - 199.246.254.255 ca +199.246.255.0 - 199.246.255.255 us +199.247.0.0 - 199.247.255.255 ca 199.248.0.0 - 199.248.143.255 us 199.248.144.0 - 199.248.144.255 ar -199.248.145.0 - 199.249.111.255 us -199.249.112.0 - 199.249.127.255 ca +199.248.145.0 - 199.248.207.255 us +199.248.208.0 - 199.248.208.255 ca +199.248.209.0 - 199.249.109.255 us +199.249.110.0 - 199.249.127.255 ca 199.249.128.0 - 199.250.8.255 us -199.250.9.0 - 199.250.12.255 ca -199.250.13.0 - 199.250.13.255 us -199.250.16.0 - 199.253.55.255 us +199.250.9.0 - 199.250.9.255 au +199.250.10.0 - 199.250.12.255 ca +199.250.13.0 - 199.253.9.255 us +199.253.10.0 - 199.253.11.255 ca +199.253.12.0 - 199.253.55.255 us 199.253.56.0 - 199.253.62.255 ca -199.253.63.0 - 199.253.249.255 us +199.253.63.0 - 199.253.99.253 us +199.253.99.254 - 199.253.99.254 eu +199.253.99.255 - 199.253.249.255 us 199.253.250.0 - 199.253.251.255 ca 199.253.252.0 - 199.254.27.255 us 199.254.28.0 - 199.254.31.255 ca 199.254.32.0 - 199.254.47.255 us 199.254.48.0 - 199.254.63.255 ca -199.254.64.0 - 199.254.95.255 us -199.254.128.0 - 199.254.151.255 us +199.254.64.0 - 199.254.103.255 us +199.254.104.0 - 199.254.111.255 bb +199.254.112.0 - 199.254.151.255 us 199.254.152.0 - 199.254.152.255 ca 199.254.153.0 - 199.254.234.255 us 199.254.235.0 - 199.254.235.255 ca 199.254.236.0 - 199.255.27.255 us 199.255.28.0 - 199.255.31.255 ca -199.255.32.0 - 199.255.115.255 us +199.255.32.0 - 199.255.45.255 us +199.255.46.0 - 199.255.46.255 gb +199.255.47.0 - 199.255.47.255 jp +199.255.48.0 - 199.255.115.255 us 199.255.116.0 - 199.255.119.255 pr 199.255.120.0 - 199.255.135.255 us -199.255.136.0 - 199.255.137.255 be +199.255.136.0 - 199.255.136.127 be +199.255.136.128 - 199.255.136.255 us +199.255.137.0 - 199.255.137.255 be 199.255.138.0 - 199.255.207.255 us 199.255.208.0 - 199.255.215.255 a1 -199.255.216.0 - 199.255.255.255 us -200.0.0.0 - 200.0.7.255 co +199.255.216.0 - 199.255.223.255 ca +199.255.224.0 - 199.255.255.255 us +200.0.0.0 - 200.0.0.0 de +200.0.0.1 - 200.0.7.255 co 200.0.8.0 - 200.0.15.255 br 200.0.16.0 - 200.0.16.255 cu 200.0.17.0 - 200.0.17.255 ar 200.0.18.0 - 200.0.18.255 ht 200.0.19.0 - 200.0.19.255 ar -200.0.20.0 - 200.0.23.255 an +200.0.20.0 - 200.0.21.255 cw +200.0.22.0 - 200.0.23.255 sx 200.0.24.0 - 200.0.27.255 cu 200.0.28.0 - 200.0.31.255 ec -200.0.32.0 - 200.0.61.255 br -200.0.62.0 - 200.0.62.255 co +200.0.32.0 - 200.0.59.255 br +200.0.60.0 - 200.0.61.255 hn +200.0.62.0 - 200.0.62.255 br 200.0.63.0 - 200.0.63.255 ec 200.0.64.0 - 200.0.64.255 pa 200.0.65.0 - 200.0.65.255 ve 200.0.66.0 - 200.0.66.255 cl -200.0.67.0 - 200.0.72.255 br +200.0.67.0 - 200.0.67.255 br +200.0.68.0 - 200.0.68.255 uy +200.0.69.0 - 200.0.72.255 br 200.0.73.0 - 200.0.78.255 ec 200.0.79.0 - 200.0.80.255 ar 200.0.81.0 - 200.0.81.255 br 200.0.82.0 - 200.0.82.255 cl 200.0.83.0 - 200.0.84.255 mx 200.0.85.0 - 200.0.87.255 br -200.0.88.0 - 200.0.88.255 mx -200.0.89.0 - 200.0.93.255 br +200.0.88.0 - 200.0.88.255 uy +200.0.89.0 - 200.0.89.255 br +200.0.90.0 - 200.0.91.255 mx +200.0.92.0 - 200.0.92.255 br +200.0.93.0 - 200.0.93.255 mx 200.0.94.0 - 200.0.94.255 us 200.0.95.0 - 200.0.95.255 mx 200.0.96.0 - 200.0.99.255 ar @@ -119739,7 +96962,8 @@ 200.0.115.0 - 200.0.117.255 cl 200.0.118.0 - 200.0.119.255 pe 200.0.120.0 - 200.0.124.255 cl -200.0.125.0 - 200.0.135.255 mx +200.0.125.0 - 200.0.133.255 mx +200.0.134.0 - 200.0.135.255 br 200.0.136.0 - 200.0.136.255 pe 200.0.137.0 - 200.0.138.255 us 200.0.139.0 - 200.0.139.255 ve @@ -119754,7 +96978,9 @@ 200.0.178.0 - 200.0.178.255 pa 200.0.179.0 - 200.0.179.255 cr 200.0.180.0 - 200.0.180.255 sv -200.0.181.0 - 200.0.200.255 ar +200.0.181.0 - 200.0.186.255 ar +200.0.187.0 - 200.0.187.255 co +200.0.188.0 - 200.0.200.255 ar 200.0.201.0 - 200.0.201.255 co 200.0.202.0 - 200.0.203.255 pa 200.0.204.0 - 200.0.207.255 uy @@ -119769,8 +96995,8 @@ 200.1.32.0 - 200.1.63.255 ar 200.1.64.0 - 200.1.103.255 co 200.1.104.0 - 200.1.111.255 tt +200.1.112.0 - 200.1.112.255 br 200.1.113.0 - 200.1.113.255 ar -200.1.114.0 - 200.1.114.255 ni 200.1.115.0 - 200.1.115.255 cl 200.1.116.0 - 200.1.118.255 ar 200.1.119.0 - 200.1.119.255 ve @@ -119796,6 +97022,7 @@ 200.1.192.0 - 200.1.199.255 co 200.1.200.0 - 200.1.207.255 py 200.1.208.0 - 200.1.215.255 sr +200.1.216.0 - 200.1.223.255 br 200.1.224.0 - 200.1.255.255 ar 200.2.0.0 - 200.2.7.255 cl 200.2.8.0 - 200.2.15.255 ve @@ -119848,10 +97075,10 @@ 200.5.11.0 - 200.5.11.255 pr 200.5.12.0 - 200.5.15.255 cu 200.5.16.0 - 200.5.31.255 ve -200.5.32.0 - 200.5.39.255 ar +200.5.32.0 - 200.5.39.255 br 200.5.40.0 - 200.5.47.255 ve 200.5.48.0 - 200.5.55.255 ar -200.5.56.0 - 200.5.63.255 co +200.5.56.0 - 200.5.63.255 cr 200.5.64.0 - 200.5.127.255 ar 200.5.128.0 - 200.5.191.255 ve 200.5.192.0 - 200.5.255.255 ar @@ -119863,26 +97090,19 @@ 200.6.33.0 - 200.6.33.255 cl 200.6.34.0 - 200.6.34.255 ec 200.6.35.0 - 200.6.48.255 br -200.6.49.0 - 200.6.49.255 cl -200.6.50.0 - 200.6.51.255 ar 200.6.52.0 - 200.6.52.255 pa 200.6.53.0 - 200.6.54.255 cl 200.6.55.0 - 200.6.55.255 ni -200.6.56.0 - 200.6.63.255 an +200.6.56.0 - 200.6.63.255 cw 200.6.64.0 - 200.6.78.255 cl 200.6.79.0 - 200.6.79.255 pa 200.6.80.0 - 200.6.87.255 ec -200.6.88.0 - 200.6.95.255 do 200.6.96.0 - 200.6.127.255 cl 200.6.128.0 - 200.6.133.255 br 200.6.134.0 - 200.6.135.255 cr -200.6.136.0 - 200.6.137.255 ar -200.6.138.0 - 200.6.138.255 uy -200.6.139.0 - 200.6.140.255 ar -200.6.141.0 - 200.6.142.255 uy -200.6.143.0 - 200.6.143.255 ar -200.6.144.0 - 200.6.151.255 an -200.6.152.0 - 200.6.159.255 ve +200.6.136.0 - 200.6.143.255 br +200.6.144.0 - 200.6.151.255 bq +200.6.152.0 - 200.6.159.255 mx 200.6.160.0 - 200.6.191.255 co 200.6.192.0 - 200.6.255.255 gt 200.7.0.0 - 200.7.3.255 br @@ -119891,15 +97111,20 @@ 200.7.14.0 - 200.7.14.255 py 200.7.15.0 - 200.7.15.255 ar 200.7.16.0 - 200.7.31.255 cl -200.7.32.0 - 200.7.63.255 an +200.7.32.0 - 200.7.63.255 sx 200.7.64.0 - 200.7.83.255 ec 200.7.84.0 - 200.7.87.255 uy 200.7.88.0 - 200.7.95.255 tt -200.7.96.0 - 200.7.127.255 ve -200.7.128.0 - 200.7.143.255 ar +200.7.96.0 - 200.7.97.255 nl +200.7.98.0 - 200.7.101.255 us +200.7.102.0 - 200.7.111.255 pa +200.7.112.0 - 200.7.127.255 br +200.7.128.0 - 200.7.147.255 ar +200.7.148.0 - 200.7.151.255 sr +200.7.152.0 - 200.7.159.255 ar 200.7.160.0 - 200.7.175.255 bo 200.7.176.0 - 200.7.183.255 ar -200.7.184.0 - 200.7.191.255 an +200.7.184.0 - 200.7.191.255 cw 200.7.192.0 - 200.7.255.255 ec 200.8.0.0 - 200.8.255.255 ve 200.9.0.0 - 200.9.2.255 br @@ -119917,14 +97142,18 @@ 200.9.76.0 - 200.9.78.255 br 200.9.79.0 - 200.9.81.255 cl 200.9.82.0 - 200.9.83.255 us -200.9.84.0 - 200.9.95.255 br +200.9.84.0 - 200.9.93.255 br +200.9.94.0 - 200.9.94.255 co +200.9.95.0 - 200.9.95.255 br 200.9.96.0 - 200.9.96.255 ec 200.9.97.0 - 200.9.101.255 cl 200.9.102.0 - 200.9.107.255 br 200.9.108.0 - 200.9.111.255 cl 200.9.112.0 - 200.9.114.255 br 200.9.115.0 - 200.9.115.255 jm -200.9.116.0 - 200.9.121.255 br +200.9.116.0 - 200.9.119.255 cr +200.9.120.0 - 200.9.120.255 hn +200.9.121.0 - 200.9.121.255 br 200.9.122.0 - 200.9.122.255 cl 200.9.123.0 - 200.9.127.255 br 200.9.128.0 - 200.9.128.255 cl @@ -119935,14 +97164,17 @@ 200.9.147.0 - 200.9.147.255 ar 200.9.148.0 - 200.9.149.255 br 200.9.150.0 - 200.9.153.255 cl -200.9.154.0 - 200.9.156.255 cr 200.9.157.0 - 200.9.157.255 ar 200.9.158.0 - 200.9.164.255 br 200.9.165.0 - 200.9.168.255 bo 200.9.169.0 - 200.9.175.255 br 200.9.176.0 - 200.9.176.255 ec 200.9.177.0 - 200.9.180.255 cl -200.9.181.0 - 200.9.186.255 br +200.9.181.0 - 200.9.181.255 ar +200.9.182.0 - 200.9.183.255 mx +200.9.184.0 - 200.9.184.255 br +200.9.185.0 - 200.9.185.255 mx +200.9.186.0 - 200.9.186.255 br 200.9.187.0 - 200.9.192.255 ni 200.9.193.0 - 200.9.193.255 cl 200.9.194.0 - 200.9.194.255 ar @@ -119953,9 +97185,7 @@ 200.9.204.0 - 200.9.205.255 cl 200.9.206.0 - 200.9.207.255 br 200.9.208.0 - 200.9.208.255 ar -200.9.209.0 - 200.9.209.255 cr -200.9.210.0 - 200.9.210.255 ve -200.9.211.0 - 200.9.211.255 co +200.9.209.0 - 200.9.211.255 cr 200.9.212.0 - 200.9.213.255 ar 200.9.214.0 - 200.9.214.255 br 200.9.215.0 - 200.9.215.255 cl @@ -119963,7 +97193,8 @@ 200.9.219.0 - 200.9.219.255 ar 200.9.220.0 - 200.9.224.255 br 200.9.225.0 - 200.9.225.255 cl -200.9.226.0 - 200.9.227.255 br +200.9.226.0 - 200.9.226.255 br +200.9.227.0 - 200.9.227.255 ar 200.9.228.0 - 200.9.228.255 cl 200.9.229.0 - 200.9.229.255 br 200.9.230.0 - 200.9.233.255 cl @@ -119982,31 +97213,47 @@ 200.10.15.0 - 200.10.15.255 pa 200.10.16.0 - 200.10.27.255 cl 200.10.28.0 - 200.10.31.255 sv -200.10.32.0 - 200.10.59.255 br +200.10.32.0 - 200.10.36.199 hn +200.10.36.200 - 200.10.36.207 is +200.10.36.208 - 200.10.41.63 hn +200.10.41.64 - 200.10.41.79 fr +200.10.41.80 - 200.10.41.207 hn +200.10.41.208 - 200.10.41.215 de +200.10.41.216 - 200.10.42.183 hn +200.10.42.184 - 200.10.42.191 it +200.10.42.192 - 200.10.43.119 hn +200.10.43.120 - 200.10.43.127 ca +200.10.43.128 - 200.10.47.255 hn +200.10.48.0 - 200.10.59.255 br 200.10.60.0 - 200.10.63.255 uy 200.10.64.0 - 200.10.95.255 pe 200.10.96.0 - 200.10.129.255 ar 200.10.130.0 - 200.10.131.255 pe 200.10.132.0 - 200.10.138.255 br 200.10.139.0 - 200.10.140.255 ar -200.10.141.0 - 200.10.141.255 br +200.10.141.0 - 200.10.141.255 py 200.10.142.0 - 200.10.142.255 do 200.10.143.0 - 200.10.143.255 mx 200.10.144.0 - 200.10.144.255 br -200.10.145.0 - 200.10.145.255 cl +200.10.145.0 - 200.10.145.255 cr 200.10.146.0 - 200.10.146.255 br 200.10.147.0 - 200.10.151.255 ec 200.10.152.0 - 200.10.152.255 jm 200.10.153.0 - 200.10.154.255 br 200.10.155.0 - 200.10.155.255 us -200.10.156.0 - 200.10.159.255 br +200.10.156.0 - 200.10.156.255 br +200.10.158.0 - 200.10.158.255 cl +200.10.159.0 - 200.10.159.255 br 200.10.160.0 - 200.10.160.255 us 200.10.161.0 - 200.10.161.255 ar 200.10.162.0 - 200.10.162.255 do -200.10.163.0 - 200.10.164.255 br +200.10.163.0 - 200.10.163.255 br +200.10.164.0 - 200.10.164.255 co 200.10.165.0 - 200.10.166.255 bm 200.10.167.0 - 200.10.172.255 cl -200.10.173.0 - 200.10.181.255 br +200.10.173.0 - 200.10.173.255 gt +200.10.174.0 - 200.10.175.255 br +200.10.178.0 - 200.10.181.255 br 200.10.182.0 - 200.10.182.255 cl 200.10.183.0 - 200.10.183.255 br 200.10.184.0 - 200.10.184.255 cl @@ -120027,7 +97274,8 @@ 200.10.203.0 - 200.10.203.255 pa 200.10.204.0 - 200.10.204.255 ar 200.10.205.0 - 200.10.205.255 ni -200.10.206.0 - 200.10.207.255 ar +200.10.206.0 - 200.10.206.255 br +200.10.207.0 - 200.10.207.255 ar 200.10.208.0 - 200.10.208.255 cl 200.10.209.0 - 200.10.210.255 br 200.10.211.0 - 200.10.211.255 cl @@ -120040,7 +97288,8 @@ 200.10.233.0 - 200.10.233.255 mx 200.10.234.0 - 200.10.234.255 cl 200.10.236.0 - 200.10.238.255 cl -200.10.239.0 - 200.10.240.255 mx +200.10.239.0 - 200.10.239.255 br +200.10.240.0 - 200.10.240.255 mx 200.10.241.0 - 200.10.241.255 gt 200.10.242.0 - 200.10.242.255 cl 200.10.243.0 - 200.10.244.255 mx @@ -120062,14 +97311,13 @@ 200.11.64.0 - 200.11.103.255 cl 200.11.104.0 - 200.11.111.255 do 200.11.112.0 - 200.11.119.255 ar -200.11.120.0 - 200.11.127.255 tt -200.11.128.0 - 200.11.255.255 ve +200.11.128.0 - 200.11.191.255 ky +200.11.192.0 - 200.11.255.255 ve 200.12.0.0 - 200.12.15.255 br 200.12.16.0 - 200.12.31.255 cl 200.12.32.0 - 200.12.63.255 gt 200.12.64.0 - 200.12.128.255 mx 200.12.129.0 - 200.12.130.255 cl -200.12.131.0 - 200.12.131.255 br 200.12.132.0 - 200.12.132.255 cl 200.12.133.0 - 200.12.138.255 ar 200.12.139.0 - 200.12.139.255 br @@ -120079,7 +97327,6 @@ 200.12.153.0 - 200.12.153.255 pa 200.12.154.0 - 200.12.154.255 ar 200.12.155.0 - 200.12.156.255 uy -200.12.157.0 - 200.12.157.255 br 200.12.158.0 - 200.12.166.255 mx 200.12.167.0 - 200.12.167.255 cr 200.12.168.0 - 200.12.168.255 us @@ -120095,65 +97342,39 @@ 200.12.200.0 - 200.12.207.255 ar 200.12.208.0 - 200.12.215.255 pa 200.12.216.0 - 200.12.223.255 ar -200.12.224.0 - 200.12.224.15 us -200.12.224.16 - 200.12.224.31 gt -200.12.224.32 - 200.12.224.47 hn -200.12.224.48 - 200.12.224.63 gt -200.12.224.64 - 200.12.224.71 us -200.12.224.72 - 200.12.224.95 gt -200.12.224.96 - 200.12.224.111 sv -200.12.224.112 - 200.12.224.127 us -200.12.224.128 - 200.12.224.175 gt -200.12.224.176 - 200.12.224.255 us -200.12.225.0 - 200.12.225.255 gt -200.12.226.0 - 200.12.227.255 an -200.12.228.0 - 200.12.228.255 ni -200.12.229.0 - 200.12.229.255 tt -200.12.230.0 - 200.12.230.255 sv -200.12.231.0 - 200.12.231.255 ni -200.12.232.0 - 200.12.233.255 sv -200.12.234.0 - 200.12.234.255 ni -200.12.235.0 - 200.12.235.7 us -200.12.235.8 - 200.12.235.15 gt -200.12.235.16 - 200.12.235.31 sv -200.12.235.32 - 200.12.235.95 us -200.12.235.96 - 200.12.235.127 sv -200.12.235.128 - 200.12.235.159 us -200.12.235.160 - 200.12.235.191 gt -200.12.235.192 - 200.12.236.255 us -200.12.237.0 - 200.12.237.255 ni +200.12.224.0 - 200.12.225.255 us +200.12.226.0 - 200.12.226.255 sv +200.12.227.0 - 200.12.228.255 hn +200.12.229.0 - 200.12.230.255 sv +200.12.231.0 - 200.12.231.255 gt +200.12.232.0 - 200.12.234.255 sv +200.12.235.0 - 200.12.236.255 us +200.12.237.0 - 200.12.237.255 sv 200.12.238.0 - 200.12.239.255 cr 200.12.240.0 - 200.12.247.255 tt -200.12.248.0 - 200.12.255.255 aw +200.12.248.0 - 200.12.248.255 bo +200.12.249.0 - 200.12.250.255 aw +200.12.251.0 - 200.12.251.255 bo +200.12.252.0 - 200.12.255.255 aw 200.13.0.0 - 200.13.7.255 cl 200.13.8.0 - 200.13.15.255 br 200.13.16.0 - 200.13.40.255 mx 200.13.41.0 - 200.13.47.255 ar 200.13.48.0 - 200.13.82.255 mx -200.13.83.0 - 200.13.87.255 ar +200.13.83.0 - 200.13.83.255 ar 200.13.88.0 - 200.13.131.255 mx 200.13.132.0 - 200.13.135.255 hn 200.13.136.0 - 200.13.143.255 gf 200.13.144.0 - 200.13.151.255 cu 200.13.152.0 - 200.13.159.255 bo -200.13.160.0 - 200.13.163.255 sv -200.13.164.0 - 200.13.165.255 hn -200.13.166.0 - 200.13.167.135 sv -200.13.167.136 - 200.13.167.143 hn -200.13.167.144 - 200.13.176.231 sv -200.13.176.232 - 200.13.176.239 hn -200.13.176.240 - 200.13.177.207 sv -200.13.177.208 - 200.13.177.223 hn -200.13.177.224 - 200.13.178.127 sv -200.13.178.128 - 200.13.178.143 hn -200.13.178.144 - 200.13.179.239 sv -200.13.179.240 - 200.13.179.247 hn -200.13.179.248 - 200.13.182.39 sv -200.13.182.40 - 200.13.182.47 hn -200.13.182.48 - 200.13.182.103 sv -200.13.182.104 - 200.13.182.111 hn -200.13.182.112 - 200.13.187.255 sv -200.13.188.0 - 200.13.188.255 hn +200.13.160.0 - 200.13.162.255 sv +200.13.163.0 - 200.13.167.255 hn +200.13.168.0 - 200.13.174.255 sv +200.13.175.0 - 200.13.179.255 hn +200.13.180.0 - 200.13.180.255 sv +200.13.181.0 - 200.13.183.255 hn +200.13.184.0 - 200.13.186.255 sv +200.13.187.0 - 200.13.188.255 hn 200.13.189.0 - 200.13.191.255 sv 200.13.192.0 - 200.13.255.255 co 200.14.0.0 - 200.14.7.255 cl @@ -120161,11 +97382,10 @@ 200.14.16.0 - 200.14.31.255 mx 200.14.32.0 - 200.14.33.255 br 200.14.34.0 - 200.14.34.255 ec -200.14.35.0 - 200.14.36.255 br -200.14.37.0 - 200.14.39.255 ar +200.14.35.0 - 200.14.35.255 br +200.14.36.0 - 200.14.39.255 ar 200.14.40.0 - 200.14.47.255 co 200.14.48.0 - 200.14.55.255 cu -200.14.56.0 - 200.14.63.255 hn 200.14.64.0 - 200.14.73.255 cl 200.14.74.0 - 200.14.75.255 ar 200.14.76.0 - 200.14.78.255 cl @@ -120180,27 +97400,35 @@ 200.14.116.0 - 200.14.116.255 ar 200.14.117.0 - 200.14.118.255 cl 200.14.119.0 - 200.14.119.255 pa -200.14.120.0 - 200.14.127.255 co -200.14.128.0 - 200.14.204.255 cl -200.14.205.0 - 200.14.207.255 co -200.14.208.0 - 200.14.230.255 cl -200.14.231.0 - 200.14.239.255 co -200.14.240.0 - 200.14.255.255 cl -200.15.0.0 - 200.15.255.255 us +200.14.128.0 - 200.14.205.255 cl +200.14.206.0 - 200.14.207.127 co +200.14.207.128 - 200.14.230.255 cl +200.14.231.0 - 200.14.231.127 co +200.14.231.128 - 200.14.234.255 cl +200.14.235.0 - 200.14.236.255 co +200.14.237.0 - 200.14.237.255 cl +200.14.238.0 - 200.14.239.255 co +200.14.240.0 - 200.14.252.255 cl +200.14.253.0 - 200.14.253.127 co +200.14.253.128 - 200.14.255.255 cl +200.15.0.0 - 200.15.3.255 br +200.15.4.0 - 200.15.255.255 us 200.16.0.0 - 200.16.7.255 pe 200.16.8.0 - 200.16.15.255 za 200.16.16.0 - 200.16.31.255 ar 200.16.32.0 - 200.16.63.255 mx 200.16.64.0 - 200.16.65.255 ar 200.16.66.0 - 200.16.67.255 cr -200.16.68.0 - 200.16.71.255 ve +200.16.68.0 - 200.16.68.255 ve +200.16.69.0 - 200.16.69.63 us +200.16.69.64 - 200.16.71.255 ve 200.16.72.0 - 200.16.78.255 ar 200.16.79.0 - 200.16.79.255 co 200.16.80.0 - 200.16.87.255 ar 200.16.88.0 - 200.16.88.255 us 200.16.89.0 - 200.16.89.255 ar 200.16.90.0 - 200.16.91.255 do -200.16.92.0 - 200.16.93.255 an +200.16.92.0 - 200.16.93.255 cw 200.16.94.0 - 200.16.94.255 ec 200.16.95.0 - 200.16.95.255 ve 200.16.96.0 - 200.16.111.255 ar @@ -120211,19 +97439,20 @@ 200.17.0.0 - 200.20.255.255 br 200.21.0.0 - 200.21.255.255 co 200.22.0.0 - 200.22.255.255 cl -200.23.0.0 - 200.23.255.255 mx -200.24.0.0 - 200.24.63.255 co -200.24.64.0 - 200.24.64.255 ec -200.24.65.0 - 200.24.127.255 co -200.24.128.0 - 200.24.135.255 pa -200.24.136.0 - 200.24.136.15 cr -200.24.136.16 - 200.24.149.255 pa -200.24.150.0 - 200.24.150.255 bz -200.24.151.0 - 200.24.151.255 pa -200.24.152.0 - 200.24.152.111 bz -200.24.152.112 - 200.24.152.127 pa -200.24.152.128 - 200.24.152.255 bz -200.24.153.0 - 200.24.159.255 pa +200.23.0.0 - 200.23.67.255 mx +200.23.68.0 - 200.23.71.255 br +200.23.72.0 - 200.23.179.255 mx +200.23.180.0 - 200.23.183.255 br +200.23.184.0 - 200.23.223.255 mx +200.23.224.0 - 200.23.239.255 br +200.23.240.0 - 200.23.255.255 mx +200.24.0.0 - 200.24.9.255 co +200.24.10.0 - 200.24.11.255 br +200.24.12.0 - 200.24.15.255 cl +200.24.16.0 - 200.24.63.255 co +200.24.64.0 - 200.24.95.255 br +200.24.96.0 - 200.24.127.255 co +200.24.128.0 - 200.24.159.255 ec 200.24.160.0 - 200.24.191.255 pe 200.24.192.0 - 200.24.223.255 ec 200.24.224.0 - 200.24.239.255 cl @@ -120237,11 +97466,7 @@ 200.26.168.0 - 200.26.175.255 do 200.26.176.0 - 200.26.183.255 py 200.26.184.0 - 200.26.191.255 ar -200.26.192.0 - 200.26.245.255 an -200.26.246.0 - 200.26.246.255 aw -200.26.247.0 - 200.26.253.255 an -200.26.254.0 - 200.26.254.255 aw -200.26.255.0 - 200.26.255.255 an +200.26.192.0 - 200.26.255.255 cw 200.27.0.0 - 200.29.95.255 cl 200.29.96.0 - 200.29.127.255 co 200.29.128.0 - 200.29.231.255 cl @@ -120251,7 +97476,7 @@ 200.30.0.0 - 200.30.7.255 br 200.30.8.0 - 200.30.11.255 ve 200.30.12.0 - 200.30.13.255 pe -200.30.14.0 - 200.30.14.255 us +200.30.14.0 - 200.30.14.255 ca 200.30.15.0 - 200.30.15.255 fr 200.30.16.0 - 200.30.19.255 us 200.30.20.0 - 200.30.23.255 pr @@ -120274,40 +97499,116 @@ 200.30.60.0 - 200.30.63.255 cl 200.30.64.0 - 200.30.127.255 co 200.30.128.0 - 200.30.128.255 ni -200.30.129.0 - 200.30.129.255 hn +200.30.129.0 - 200.30.129.15 gt +200.30.129.16 - 200.30.129.23 hn +200.30.129.24 - 200.30.129.31 gt +200.30.129.32 - 200.30.129.39 hn +200.30.129.40 - 200.30.129.87 gt +200.30.129.88 - 200.30.129.91 hn +200.30.129.92 - 200.30.129.255 gt 200.30.130.0 - 200.30.130.255 ni 200.30.131.0 - 200.30.131.255 sv 200.30.132.0 - 200.30.132.255 ni 200.30.133.0 - 200.30.133.255 gt -200.30.134.0 - 200.30.137.255 hn +200.30.134.0 - 200.30.136.255 hn +200.30.137.0 - 200.30.137.127 gt +200.30.137.128 - 200.30.137.135 hn +200.30.137.136 - 200.30.137.255 gt 200.30.138.0 - 200.30.138.255 sv -200.30.139.0 - 200.30.139.255 hn -200.30.140.0 - 200.30.151.255 gt -200.30.152.0 - 200.30.153.255 sv +200.30.139.0 - 200.30.152.215 gt +200.30.152.216 - 200.30.152.223 sv +200.30.152.224 - 200.30.152.255 gt +200.30.153.0 - 200.30.153.255 sv 200.30.154.0 - 200.30.154.255 gt -200.30.155.0 - 200.30.157.255 hn -200.30.158.0 - 200.30.161.255 gt -200.30.162.0 - 200.30.164.255 hn -200.30.165.0 - 200.30.165.255 ni -200.30.166.0 - 200.30.166.255 hn -200.30.167.0 - 200.30.167.255 gt +200.30.155.0 - 200.30.157.15 hn +200.30.157.16 - 200.30.157.47 gt +200.30.157.48 - 200.30.157.55 hn +200.30.157.56 - 200.30.157.223 gt +200.30.157.224 - 200.30.157.231 hn +200.30.157.232 - 200.30.161.255 gt +200.30.162.0 - 200.30.162.255 sv +200.30.163.0 - 200.30.163.111 gt +200.30.163.112 - 200.30.163.119 hn +200.30.163.120 - 200.30.163.135 gt +200.30.163.136 - 200.30.163.143 hn +200.30.163.144 - 200.30.163.255 gt +200.30.164.0 - 200.30.164.255 hn +200.30.165.0 - 200.30.165.55 gt +200.30.165.56 - 200.30.165.63 ni +200.30.165.64 - 200.30.167.255 gt 200.30.168.0 - 200.30.169.255 hn 200.30.170.0 - 200.30.170.255 ni -200.30.171.0 - 200.30.171.255 sv -200.30.172.0 - 200.30.176.255 gt +200.30.171.0 - 200.30.171.15 gt +200.30.171.16 - 200.30.171.23 sv +200.30.171.24 - 200.30.171.79 gt +200.30.171.80 - 200.30.171.95 sv +200.30.171.96 - 200.30.171.255 gt +200.30.172.0 - 200.30.172.255 hn +200.30.173.0 - 200.30.176.255 gt 200.30.177.0 - 200.30.177.255 ni 200.30.178.0 - 200.30.178.255 hn 200.30.179.0 - 200.30.179.255 sv -200.30.180.0 - 200.30.191.255 gt +200.30.180.0 - 200.30.181.255 gt +200.30.182.0 - 200.30.182.255 ni +200.30.183.0 - 200.30.184.255 gt +200.30.185.0 - 200.30.185.255 hn +200.30.186.0 - 200.30.189.47 gt +200.30.189.48 - 200.30.189.63 cr +200.30.189.64 - 200.30.189.255 gt +200.30.190.0 - 200.30.190.127 hn +200.30.190.128 - 200.30.191.255 gt 200.30.192.0 - 200.30.255.255 cl -200.31.0.0 - 200.31.0.255 pr -200.31.1.0 - 200.31.3.255 ar -200.31.4.0 - 200.31.5.255 ve -200.31.6.0 - 200.31.6.255 us -200.31.7.0 - 200.31.7.255 pr -200.31.8.0 - 200.31.10.255 ec -200.31.11.0 - 200.31.11.255 ar -200.31.12.0 - 200.31.23.255 co +200.31.0.0 - 200.31.0.199 us +200.31.0.200 - 200.31.0.203 ar +200.31.0.204 - 200.31.0.255 us +200.31.1.0 - 200.31.4.47 ar +200.31.4.48 - 200.31.4.63 ve +200.31.4.64 - 200.31.4.159 ar +200.31.4.160 - 200.31.4.175 ve +200.31.4.176 - 200.31.4.191 ar +200.31.4.192 - 200.31.4.207 ve +200.31.4.208 - 200.31.4.231 ar +200.31.4.232 - 200.31.4.239 ve +200.31.4.240 - 200.31.5.191 ar +200.31.5.192 - 200.31.5.255 ve +200.31.6.0 - 200.31.6.127 ar +200.31.6.128 - 200.31.6.255 ec +200.31.7.0 - 200.31.7.79 ar +200.31.7.80 - 200.31.7.95 us +200.31.7.96 - 200.31.7.127 ar +200.31.7.128 - 200.31.7.191 us +200.31.7.192 - 200.31.7.255 ar +200.31.8.0 - 200.31.9.255 ec +200.31.10.0 - 200.31.10.47 ar +200.31.10.48 - 200.31.10.55 ec +200.31.10.56 - 200.31.10.167 ar +200.31.10.168 - 200.31.10.175 ec +200.31.10.176 - 200.31.11.255 ar +200.31.12.0 - 200.31.16.255 co +200.31.17.0 - 200.31.17.15 ar +200.31.17.16 - 200.31.17.23 co +200.31.17.24 - 200.31.17.47 ar +200.31.17.48 - 200.31.17.55 co +200.31.17.56 - 200.31.18.127 ar +200.31.18.128 - 200.31.18.255 co +200.31.19.0 - 200.31.19.183 ar +200.31.19.184 - 200.31.19.187 co +200.31.19.188 - 200.31.19.191 ar +200.31.19.192 - 200.31.19.199 co +200.31.19.200 - 200.31.20.167 ar +200.31.20.168 - 200.31.20.175 co +200.31.20.176 - 200.31.21.143 ar +200.31.21.144 - 200.31.21.151 co +200.31.21.152 - 200.31.21.167 ar +200.31.21.168 - 200.31.21.175 co +200.31.21.176 - 200.31.21.215 ar +200.31.21.216 - 200.31.21.223 co +200.31.21.224 - 200.31.22.15 ar +200.31.22.16 - 200.31.22.31 co +200.31.22.32 - 200.31.22.63 ar +200.31.22.64 - 200.31.22.95 co +200.31.22.96 - 200.31.22.255 ar +200.31.23.0 - 200.31.23.255 co 200.31.24.0 - 200.31.31.255 ec 200.31.32.0 - 200.31.63.255 cl 200.31.64.0 - 200.31.95.255 co @@ -120315,89 +97616,148 @@ 200.31.128.0 - 200.31.159.255 ve 200.31.160.0 - 200.31.191.255 sv 200.31.192.0 - 200.31.223.255 co -200.31.224.0 - 200.31.239.255 ar -200.32.0.0 - 200.32.63.255 ar +200.31.224.0 - 200.32.63.255 ar 200.32.64.0 - 200.32.64.255 ve -200.32.65.0 - 200.32.67.255 mx -200.32.68.0 - 200.32.68.255 ec -200.32.69.0 - 200.32.69.31 ar -200.32.69.32 - 200.32.73.255 ec -200.32.74.0 - 200.32.76.255 cl -200.32.77.0 - 200.32.77.255 hn +200.32.65.0 - 200.32.65.255 ar +200.32.66.0 - 200.32.67.255 mx +200.32.68.0 - 200.32.73.255 ec +200.32.74.0 - 200.32.74.255 ca +200.32.75.0 - 200.32.75.255 us +200.32.76.0 - 200.32.76.127 ar +200.32.76.128 - 200.32.76.255 ve +200.32.77.0 - 200.32.77.95 ar +200.32.77.96 - 200.32.77.103 ve +200.32.77.104 - 200.32.77.111 ar +200.32.77.112 - 200.32.77.119 ve +200.32.77.120 - 200.32.77.135 ar +200.32.77.136 - 200.32.77.143 ve +200.32.77.144 - 200.32.77.183 ar +200.32.77.184 - 200.32.77.191 ve +200.32.77.192 - 200.32.77.199 ar +200.32.77.200 - 200.32.77.207 ve +200.32.77.208 - 200.32.77.255 ar 200.32.78.0 - 200.32.78.255 mx -200.32.79.0 - 200.32.79.255 pr +200.32.79.0 - 200.32.79.255 us 200.32.80.0 - 200.32.83.255 co 200.32.84.0 - 200.32.159.255 ar 200.32.160.0 - 200.32.191.255 cl 200.32.192.0 - 200.32.255.255 bz -200.33.0.0 - 200.34.255.255 mx +200.33.0.0 - 200.33.3.255 mx +200.33.4.0 - 200.33.4.255 ar +200.33.5.0 - 200.33.27.255 mx +200.33.28.0 - 200.33.28.255 ar +200.33.29.0 - 200.33.50.255 mx +200.33.51.0 - 200.33.51.255 sv +200.33.52.0 - 200.33.66.255 mx +200.33.67.0 - 200.33.67.255 ar +200.33.68.0 - 200.33.87.255 mx +200.33.88.0 - 200.33.95.255 br +200.33.96.0 - 200.33.127.255 mx +200.33.128.0 - 200.33.135.255 br +200.33.136.0 - 200.33.151.255 mx +200.33.152.0 - 200.33.159.255 br +200.33.160.0 - 200.33.163.255 mx +200.33.164.0 - 200.33.167.255 br +200.33.168.0 - 200.33.255.255 mx +200.34.0.0 - 200.34.0.255 co +200.34.1.0 - 200.34.159.255 mx +200.34.160.0 - 200.34.163.255 br +200.34.164.0 - 200.34.170.255 mx +200.34.171.0 - 200.34.171.255 co +200.34.172.0 - 200.34.214.255 mx +200.34.215.0 - 200.34.215.255 ar +200.34.216.0 - 200.34.219.255 br +200.34.220.0 - 200.34.223.255 mx +200.34.224.0 - 200.34.255.255 br 200.35.0.0 - 200.35.31.255 ve 200.35.32.0 - 200.35.63.255 co 200.35.64.0 - 200.35.80.47 ve 200.35.80.48 - 200.35.80.55 bo 200.35.80.56 - 200.35.143.255 ve 200.35.144.0 - 200.35.151.255 pa -200.35.152.0 - 200.35.159.255 uy -200.35.160.0 - 200.35.191.255 gt +200.35.152.0 - 200.35.152.255 us +200.35.153.0 - 200.35.153.255 uy +200.35.154.0 - 200.35.155.255 us +200.35.156.0 - 200.35.159.255 cl +200.35.160.0 - 200.35.161.239 gt +200.35.161.240 - 200.35.161.247 sv +200.35.161.248 - 200.35.184.255 gt +200.35.185.0 - 200.35.185.15 sv +200.35.185.16 - 200.35.191.255 gt 200.35.192.0 - 200.35.255.255 ve 200.36.0.0 - 200.36.255.255 mx 200.37.0.0 - 200.37.255.255 pe -200.38.0.0 - 200.39.255.255 mx +200.38.0.0 - 200.39.63.255 mx +200.39.64.0 - 200.39.95.255 br +200.39.96.0 - 200.39.255.255 mx 200.40.0.0 - 200.40.255.255 uy 200.41.0.0 - 200.41.3.255 ec -200.41.4.0 - 200.41.4.191 co -200.41.4.192 - 200.41.4.207 gt -200.41.4.208 - 200.41.7.15 co -200.41.7.16 - 200.41.7.23 gt -200.41.7.24 - 200.41.7.255 co -200.41.8.0 - 200.41.8.255 ar -200.41.9.0 - 200.41.9.255 co -200.41.10.0 - 200.41.11.255 ec -200.41.12.0 - 200.41.12.255 ve -200.41.13.0 - 200.41.13.255 co +200.41.4.0 - 200.41.4.127 ar +200.41.4.128 - 200.41.4.255 co +200.41.5.0 - 200.41.6.127 ar +200.41.6.128 - 200.41.6.255 co +200.41.7.0 - 200.41.7.15 ar +200.41.7.16 - 200.41.7.63 co +200.41.7.64 - 200.41.7.119 ar +200.41.7.120 - 200.41.7.127 co +200.41.7.128 - 200.41.7.159 ar +200.41.7.160 - 200.41.7.167 co +200.41.7.168 - 200.41.9.127 ar +200.41.9.128 - 200.41.9.255 co +200.41.10.0 - 200.41.10.239 ar +200.41.10.240 - 200.41.11.127 ec +200.41.11.128 - 200.41.11.255 ar +200.41.12.0 - 200.41.13.255 ve 200.41.14.0 - 200.41.48.255 ar -200.41.49.0 - 200.41.50.255 co +200.41.49.0 - 200.41.49.255 us +200.41.50.0 - 200.41.50.255 co 200.41.51.0 - 200.41.51.255 ve -200.41.52.0 - 200.41.52.255 cl -200.41.53.0 - 200.41.53.255 hn -200.41.54.0 - 200.41.54.255 sv +200.41.52.0 - 200.41.53.255 us +200.41.54.0 - 200.41.54.127 cl +200.41.54.128 - 200.41.54.255 ar 200.41.55.0 - 200.41.55.255 cl -200.41.56.0 - 200.41.56.255 hn -200.41.57.0 - 200.41.57.255 ve -200.41.58.0 - 200.41.75.255 ar -200.41.76.0 - 200.41.79.255 co -200.41.80.0 - 200.41.81.255 ec -200.41.82.0 - 200.41.82.255 py -200.41.83.0 - 200.41.83.255 co -200.41.84.0 - 200.41.84.255 gt -200.41.85.0 - 200.41.85.127 pe -200.41.85.128 - 200.41.87.255 gt -200.41.88.0 - 200.41.88.31 ar -200.41.88.32 - 200.41.88.63 ve -200.41.88.64 - 200.41.88.127 us -200.41.88.128 - 200.41.90.63 ar +200.41.56.0 - 200.41.57.255 ve +200.41.58.0 - 200.41.76.63 ar +200.41.76.64 - 200.41.76.71 co +200.41.76.72 - 200.41.76.87 ar +200.41.76.88 - 200.41.76.95 co +200.41.76.96 - 200.41.77.127 ar +200.41.77.128 - 200.41.77.255 co +200.41.78.0 - 200.41.79.23 ar +200.41.79.24 - 200.41.79.31 co +200.41.79.32 - 200.41.79.79 ar +200.41.79.80 - 200.41.79.255 co +200.41.80.0 - 200.41.80.255 ec +200.41.81.0 - 200.41.81.127 ar +200.41.81.128 - 200.41.81.255 ec +200.41.82.0 - 200.41.82.95 ar +200.41.82.96 - 200.41.82.103 ec +200.41.82.104 - 200.41.82.255 ar +200.41.83.0 - 200.41.83.127 ec +200.41.83.128 - 200.41.83.255 ar +200.41.84.0 - 200.41.87.255 pe +200.41.88.0 - 200.41.88.255 us +200.41.89.0 - 200.41.89.255 ec +200.41.90.0 - 200.41.90.63 ar 200.41.90.64 - 200.41.90.95 us 200.41.90.96 - 200.41.90.127 ar 200.41.90.128 - 200.41.91.63 us 200.41.91.64 - 200.41.91.127 ar 200.41.91.128 - 200.41.91.191 pr -200.41.91.192 - 200.41.91.255 us +200.41.91.192 - 200.41.91.231 ar +200.41.91.232 - 200.41.91.239 pr +200.41.91.240 - 200.41.91.255 ar 200.41.92.0 - 200.41.92.255 ec -200.41.93.0 - 200.41.93.255 ve -200.41.94.0 - 200.41.94.255 cl -200.41.95.0 - 200.41.95.255 sv -200.41.96.0 - 200.41.99.255 pe -200.41.100.0 - 200.41.100.255 hn -200.41.101.0 - 200.41.111.255 pe -200.41.112.0 - 200.41.113.55 ve +200.41.93.0 - 200.41.93.255 us +200.41.94.0 - 200.41.95.255 cl +200.41.96.0 - 200.41.111.255 pe +200.41.112.0 - 200.41.113.55 ar 200.41.113.56 - 200.41.113.63 us -200.41.113.64 - 200.41.113.255 ve +200.41.113.64 - 200.41.113.255 ar 200.41.114.0 - 200.41.114.255 ec 200.41.115.0 - 200.41.115.255 us 200.41.116.0 - 200.41.119.255 ve -200.41.120.0 - 200.41.239.255 ar -200.41.240.0 - 200.41.243.255 cl -200.41.244.0 - 200.42.159.255 ar +200.41.120.0 - 200.42.159.255 ar 200.42.160.0 - 200.42.191.255 cl 200.42.192.0 - 200.42.255.255 do 200.43.0.0 - 200.43.10.255 ar @@ -120406,72 +97766,87 @@ 200.44.0.0 - 200.44.255.255 ve 200.45.0.0 - 200.45.255.255 ar 200.46.0.0 - 200.46.255.255 pa -200.47.0.0 - 200.47.78.255 ar -200.47.79.0 - 200.47.79.255 ve +200.47.0.0 - 200.47.1.255 ve +200.47.2.0 - 200.47.3.255 ar +200.47.4.0 - 200.47.9.255 ve +200.47.10.0 - 200.47.11.255 ar +200.47.12.0 - 200.47.15.255 ve +200.47.16.0 - 200.47.26.255 ar +200.47.27.0 - 200.47.29.127 ve +200.47.29.128 - 200.47.29.255 ar +200.47.30.0 - 200.47.31.255 ve +200.47.32.0 - 200.47.32.255 ar +200.47.33.0 - 200.47.34.255 ve +200.47.35.0 - 200.47.36.255 ar +200.47.37.0 - 200.47.42.255 ve +200.47.43.0 - 200.47.43.255 ar +200.47.44.0 - 200.47.44.255 ve +200.47.45.0 - 200.47.47.255 ar +200.47.48.0 - 200.47.50.255 ve +200.47.51.0 - 200.47.51.255 ar +200.47.52.0 - 200.47.62.255 ve +200.47.63.0 - 200.47.63.255 ar +200.47.64.0 - 200.47.79.255 ve 200.47.80.0 - 200.47.80.255 mx -200.47.81.0 - 200.47.122.255 ar -200.47.123.0 - 200.47.123.127 uy -200.47.123.128 - 200.47.123.255 us -200.47.124.0 - 200.47.135.255 ar -200.47.136.0 - 200.47.138.255 py -200.47.139.0 - 200.47.139.255 ar +200.47.81.0 - 200.47.81.255 ar +200.47.82.0 - 200.47.85.255 ve +200.47.86.0 - 200.47.86.255 ar +200.47.87.0 - 200.47.96.255 ve +200.47.97.0 - 200.47.97.255 ar +200.47.98.0 - 200.47.102.255 ve +200.47.103.0 - 200.47.103.255 ar +200.47.104.0 - 200.47.111.255 ve +200.47.112.0 - 200.47.115.255 ar +200.47.116.0 - 200.47.117.255 ve +200.47.118.0 - 200.47.118.255 ar +200.47.119.0 - 200.47.122.255 ve +200.47.123.0 - 200.47.123.255 ar +200.47.124.0 - 200.47.127.255 ve +200.47.128.0 - 200.47.136.255 ar +200.47.137.0 - 200.47.137.127 py +200.47.137.128 - 200.47.139.255 ar 200.47.140.0 - 200.47.143.255 ve 200.47.144.0 - 200.47.149.255 ar 200.47.150.0 - 200.47.151.255 ve 200.47.152.0 - 200.47.155.255 pe 200.47.156.0 - 200.47.158.255 co 200.47.159.0 - 200.47.159.255 mx -200.47.160.0 - 200.47.171.255 ar -200.47.172.0 - 200.47.175.255 co -200.47.176.0 - 200.47.177.255 ar -200.47.178.0 - 200.47.179.255 mx +200.47.160.0 - 200.47.170.63 ar +200.47.170.64 - 200.47.170.191 ve +200.47.170.192 - 200.47.170.255 ar +200.47.171.0 - 200.47.171.63 ve +200.47.171.64 - 200.47.171.95 ar +200.47.171.96 - 200.47.171.159 ve +200.47.171.160 - 200.47.171.175 ar +200.47.171.176 - 200.47.171.207 ve +200.47.171.208 - 200.47.171.223 ar +200.47.171.224 - 200.47.171.239 ve +200.47.171.240 - 200.47.171.255 ar +200.47.172.0 - 200.47.177.255 co +200.47.178.0 - 200.47.179.255 ar 200.47.180.0 - 200.47.183.255 ve 200.47.184.0 - 200.47.184.255 mx 200.47.185.0 - 200.47.186.255 pe -200.47.187.0 - 200.47.188.255 mx -200.47.189.0 - 200.47.189.255 ar -200.47.190.0 - 200.47.191.255 mx -200.47.192.0 - 200.47.197.127 ar -200.47.197.128 - 200.47.197.255 uy -200.47.198.0 - 200.47.208.255 ar -200.47.209.0 - 200.47.210.127 pe -200.47.210.128 - 200.47.214.255 ar +200.47.187.0 - 200.47.191.255 mx +200.47.192.0 - 200.47.209.255 ar +200.47.210.0 - 200.47.210.255 pe +200.47.211.0 - 200.47.214.255 ar 200.47.215.0 - 200.47.215.255 ve 200.47.216.0 - 200.47.220.255 co -200.47.221.0 - 200.47.221.255 ar -200.47.222.0 - 200.47.223.255 pe -200.47.224.0 - 200.47.255.255 ar +200.47.221.0 - 200.47.255.255 ar 200.48.0.0 - 200.48.255.255 pe 200.49.0.0 - 200.49.15.255 ar 200.49.16.0 - 200.49.23.255 cl -200.49.24.0 - 200.49.35.31 ar -200.49.35.32 - 200.49.35.63 us -200.49.35.64 - 200.49.42.255 ar -200.49.43.0 - 200.49.43.127 us -200.49.43.128 - 200.49.46.127 ar -200.49.46.128 - 200.49.46.255 us -200.49.47.0 - 200.49.47.127 ar -200.49.47.128 - 200.49.47.255 us +200.49.24.0 - 200.49.31.255 ar +200.49.32.0 - 200.49.47.255 br 200.49.48.0 - 200.49.159.255 ar 200.49.160.0 - 200.49.191.255 gt 200.49.192.0 - 200.49.239.255 ar 200.49.240.0 - 200.49.247.255 ec -200.49.248.0 - 200.49.255.255 ar -200.50.0.0 - 200.50.0.75 pr -200.50.0.76 - 200.50.0.83 do -200.50.0.84 - 200.50.7.255 pr -200.50.8.0 - 200.50.10.111 do -200.50.10.112 - 200.50.10.127 pr -200.50.10.128 - 200.50.11.255 do -200.50.12.0 - 200.50.12.255 pr -200.50.13.0 - 200.50.13.255 an -200.50.14.0 - 200.50.15.255 pr -200.50.16.0 - 200.50.19.255 do -200.50.20.0 - 200.50.31.255 pr +200.49.248.0 - 200.49.255.255 us +200.50.0.0 - 200.50.31.255 pr 200.50.32.0 - 200.50.63.255 cl -200.50.64.0 - 200.50.66.215 bb -200.50.66.216 - 200.50.66.223 ca -200.50.66.224 - 200.50.70.255 bb +200.50.64.0 - 200.50.70.255 bb 200.50.71.0 - 200.50.72.255 gd 200.50.73.0 - 200.50.76.255 bb 200.50.77.0 - 200.50.77.255 kn @@ -120479,161 +97854,62 @@ 200.50.96.0 - 200.50.127.255 cl 200.50.128.0 - 200.50.143.255 bb 200.50.144.0 - 200.50.159.255 cl -200.50.160.0 - 200.50.176.255 ar -200.50.177.0 - 200.50.177.255 uy -200.50.178.0 - 200.50.178.255 ar -200.50.179.0 - 200.50.181.255 uy -200.50.182.0 - 200.50.191.255 ar +200.50.160.0 - 200.50.191.255 ar 200.50.192.0 - 200.50.223.255 ht 200.50.224.0 - 200.50.231.255 cr 200.50.232.0 - 200.50.239.255 ec -200.50.240.0 - 200.51.143.255 ar -200.51.144.0 - 200.51.163.255 uy -200.51.164.0 - 200.51.171.255 ar -200.51.172.0 - 200.51.175.255 cl -200.51.176.0 - 200.51.255.255 ar -200.52.0.0 - 200.53.255.255 mx +200.50.240.0 - 200.51.255.255 ar +200.52.0.0 - 200.52.15.255 mx +200.52.16.0 - 200.52.31.255 br +200.52.32.0 - 200.52.143.255 mx +200.52.144.0 - 200.52.159.255 hn +200.52.160.0 - 200.53.7.255 mx +200.53.8.0 - 200.53.31.255 br +200.53.32.0 - 200.53.191.255 mx +200.53.192.0 - 200.53.223.255 br +200.53.224.0 - 200.53.255.255 mx 200.54.0.0 - 200.54.255.255 cl 200.55.0.0 - 200.55.127.255 ar 200.55.128.0 - 200.55.191.255 cu 200.55.192.0 - 200.55.223.255 cl 200.55.224.0 - 200.55.239.255 ec -200.55.240.0 - 200.55.247.255 ar +200.55.240.0 - 200.55.240.255 us +200.55.241.0 - 200.55.247.255 ar 200.55.248.0 - 200.55.255.255 ec 200.56.0.0 - 200.57.255.255 mx -200.58.0.0 - 200.58.15.255 us -200.58.16.0 - 200.58.16.15 br -200.58.16.16 - 200.58.21.15 us -200.58.21.16 - 200.58.21.95 ar -200.58.21.96 - 200.58.21.127 br -200.58.21.128 - 200.58.21.223 ar -200.58.21.224 - 200.58.22.255 us -200.58.23.0 - 200.58.30.63 ar -200.58.30.64 - 200.58.30.71 us -200.58.30.72 - 200.58.30.79 it -200.58.30.80 - 200.58.30.95 us -200.58.30.96 - 200.58.30.127 ar -200.58.30.128 - 200.58.30.191 us -200.58.30.192 - 200.58.30.255 ar -200.58.31.0 - 200.58.47.255 us -200.58.48.0 - 200.58.48.63 br -200.58.48.64 - 200.58.49.255 us -200.58.50.0 - 200.58.50.15 br -200.58.50.16 - 200.58.50.39 ar -200.58.50.40 - 200.58.50.47 br -200.58.50.48 - 200.58.50.63 us -200.58.50.64 - 200.58.50.95 br -200.58.50.96 - 200.58.50.127 us -200.58.50.128 - 200.58.50.159 ar -200.58.50.160 - 200.58.50.175 br -200.58.50.176 - 200.58.50.191 us -200.58.50.192 - 200.58.50.223 ar -200.58.50.224 - 200.58.50.239 us -200.58.50.240 - 200.58.50.255 ar -200.58.51.0 - 200.58.63.255 us +200.58.0.0 - 200.58.63.255 us 200.58.64.0 - 200.58.95.255 bo 200.58.96.0 - 200.58.127.255 ar 200.58.128.0 - 200.58.159.255 uy 200.58.160.0 - 200.58.191.255 bo 200.58.192.0 - 200.58.239.255 co 200.58.240.0 - 200.58.247.255 do -200.58.248.0 - 200.58.255.255 cl 200.59.0.0 - 200.59.15.255 ar 200.59.16.0 - 200.59.23.255 cr 200.59.24.0 - 200.59.31.255 hn 200.59.32.0 - 200.59.183.255 ar 200.59.184.0 - 200.59.191.255 ve -200.59.192.0 - 200.59.199.255 ar -200.59.200.0 - 200.59.203.255 uy -200.59.204.0 - 200.59.207.255 ar +200.59.192.0 - 200.59.207.255 ar +200.59.208.0 - 200.59.223.255 pa 200.59.224.0 - 200.59.255.255 ar 200.60.0.0 - 200.60.255.255 pe -200.61.0.0 - 200.61.64.207 ar -200.61.64.208 - 200.61.64.223 ec -200.61.64.224 - 200.61.65.159 ar -200.61.65.160 - 200.61.65.191 bo -200.61.65.192 - 200.61.65.255 ar -200.61.66.0 - 200.61.71.255 ec -200.61.72.0 - 200.61.72.255 py -200.61.73.0 - 200.61.77.239 ar -200.61.77.240 - 200.61.78.255 uy -200.61.79.0 - 200.61.79.255 ar -200.61.80.0 - 200.61.81.255 ec -200.61.82.0 - 200.61.82.63 ar +200.61.0.0 - 200.61.82.63 ar 200.61.82.64 - 200.61.82.127 hn 200.61.82.128 - 200.61.83.127 ar 200.61.83.128 - 200.61.83.191 uy -200.61.83.192 - 200.61.83.255 ar -200.61.84.0 - 200.61.84.255 uy -200.61.85.0 - 200.61.87.231 ar +200.61.83.192 - 200.61.87.231 ar 200.61.87.232 - 200.61.87.239 co -200.61.87.240 - 200.61.88.239 ar -200.61.88.240 - 200.61.88.255 py +200.61.87.240 - 200.61.88.255 ar 200.61.89.0 - 200.61.89.63 hn -200.61.89.64 - 200.61.89.255 ar -200.61.90.0 - 200.61.90.191 ec -200.61.90.192 - 200.61.90.255 ar -200.61.91.0 - 200.61.91.255 ec -200.61.92.0 - 200.61.95.255 uy -200.61.96.0 - 200.61.97.255 co -200.61.98.0 - 200.61.99.255 ar -200.61.100.0 - 200.61.100.255 bo -200.61.101.0 - 200.61.102.255 ar -200.61.103.0 - 200.61.103.255 uy -200.61.104.0 - 200.61.105.255 bo -200.61.106.0 - 200.61.107.255 uy -200.61.108.0 - 200.61.108.255 ar -200.61.109.0 - 200.61.111.255 uy -200.61.112.0 - 200.61.115.255 ar -200.61.116.0 - 200.61.119.255 py -200.61.120.0 - 200.61.121.255 ar -200.61.122.0 - 200.61.123.255 bo -200.61.124.0 - 200.61.127.255 py -200.61.128.0 - 200.61.134.159 co -200.61.134.160 - 200.61.134.167 ar -200.61.134.168 - 200.61.135.63 co -200.61.135.64 - 200.61.135.95 ar -200.61.135.96 - 200.61.135.159 co -200.61.135.160 - 200.61.135.167 ar -200.61.135.168 - 200.61.141.255 co -200.61.142.0 - 200.61.143.255 ar -200.61.144.0 - 200.61.147.159 co -200.61.147.160 - 200.61.147.191 ar -200.61.147.192 - 200.61.149.255 co -200.61.150.0 - 200.61.150.7 ar -200.61.150.8 - 200.61.150.31 co -200.61.150.32 - 200.61.150.47 ar -200.61.150.48 - 200.61.150.79 co -200.61.150.80 - 200.61.150.87 ar -200.61.150.88 - 200.61.150.191 co -200.61.150.192 - 200.61.150.255 ar -200.61.151.0 - 200.61.154.255 co -200.61.155.0 - 200.61.155.239 ar -200.61.155.240 - 200.61.156.39 co -200.61.156.40 - 200.61.156.55 ar -200.61.156.56 - 200.61.156.79 co -200.61.156.80 - 200.61.156.83 ar -200.61.156.84 - 200.61.156.95 co -200.61.156.96 - 200.61.156.103 ar -200.61.156.104 - 200.61.156.127 co -200.61.156.128 - 200.61.156.143 ar -200.61.156.144 - 200.61.158.255 co -200.61.159.0 - 200.61.159.63 ar -200.61.159.64 - 200.61.159.127 co -200.61.159.128 - 200.61.159.143 ar -200.61.159.144 - 200.61.159.223 co -200.61.159.224 - 200.61.159.239 ar -200.61.159.240 - 200.61.159.255 co -200.61.160.0 - 200.61.223.255 ar -200.61.224.0 - 200.61.235.255 py -200.61.236.0 - 200.61.239.255 sr +200.61.89.64 - 200.61.223.255 ar +200.61.224.0 - 200.61.239.255 py 200.61.240.0 - 200.61.251.255 ar 200.61.252.0 - 200.61.252.255 ve -200.61.253.0 - 200.61.253.255 an +200.61.253.0 - 200.61.253.255 cw 200.61.254.0 - 200.61.255.255 ar 200.62.0.0 - 200.62.7.255 us 200.62.8.0 - 200.62.31.255 ve -200.62.32.0 - 200.62.39.255 gt +200.62.32.0 - 200.62.39.255 us 200.62.40.0 - 200.62.40.255 vg 200.62.41.0 - 200.62.41.255 us 200.62.42.0 - 200.62.42.255 vg @@ -120648,23 +97924,24 @@ 200.63.40.0 - 200.63.47.255 pa 200.63.48.0 - 200.63.55.255 ar 200.63.56.0 - 200.63.63.255 cl -200.63.64.0 - 200.63.67.255 ar -200.63.68.0 - 200.63.68.255 uy -200.63.69.0 - 200.63.95.255 ar +200.63.64.0 - 200.63.95.255 ar 200.63.96.0 - 200.63.103.255 cl -200.63.112.0 - 200.63.191.255 ar +200.63.104.0 - 200.63.107.255 ec +200.63.108.0 - 200.63.191.255 ar 200.63.192.0 - 200.63.255.255 ec 200.64.0.0 - 200.66.82.15 mx 200.66.82.16 - 200.66.82.31 us -200.66.82.32 - 200.67.255.255 mx +200.66.82.32 - 200.66.82.255 mx +200.66.83.0 - 200.66.83.63 us +200.66.83.64 - 200.66.111.255 mx +200.66.112.0 - 200.66.127.255 br +200.66.128.0 - 200.67.255.255 mx 200.68.0.0 - 200.68.63.255 cl 200.68.64.0 - 200.68.127.255 ar -200.68.128.0 - 200.68.178.255 co -200.68.179.0 - 200.68.179.255 ec -200.68.180.0 - 200.68.191.255 co -200.68.192.0 - 200.69.17.127 ar -200.69.17.128 - 200.69.17.255 uy -200.69.18.0 - 200.69.95.255 ar +200.68.128.0 - 200.68.191.255 mx +200.68.192.0 - 200.69.93.255 ar +200.69.94.0 - 200.69.94.255 us +200.69.95.0 - 200.69.95.255 ar 200.69.96.0 - 200.69.127.255 co 200.69.128.0 - 200.69.159.255 ar 200.69.160.0 - 200.69.191.255 ec @@ -120673,107 +97950,118 @@ 200.71.32.0 - 200.71.79.255 co 200.71.80.0 - 200.71.87.255 bo 200.71.88.0 - 200.71.95.255 ar -200.71.96.0 - 200.71.127.255 co +200.71.96.0 - 200.71.111.255 co +200.71.112.0 - 200.71.112.255 us +200.71.113.0 - 200.71.115.255 ve +200.71.116.0 - 200.71.123.255 br +200.71.124.0 - 200.71.125.63 hn +200.71.125.64 - 200.71.125.71 it +200.71.125.72 - 200.71.126.31 hn +200.71.126.32 - 200.71.126.63 us +200.71.126.64 - 200.71.127.255 hn 200.71.128.0 - 200.71.191.255 ve 200.71.192.0 - 200.71.223.255 cl 200.71.224.0 - 200.71.239.255 ar 200.71.240.0 - 200.71.247.255 ve -200.71.248.0 - 200.71.255.255 an -200.72.0.0 - 200.72.255.255 cl -200.73.0.0 - 200.73.3.95 co -200.73.3.96 - 200.73.3.127 cl -200.73.3.128 - 200.73.5.31 co -200.73.5.32 - 200.73.5.55 cl -200.73.5.56 - 200.73.6.255 co -200.73.7.0 - 200.73.15.255 cl -200.73.16.0 - 200.73.16.31 co -200.73.16.32 - 200.73.16.39 cl -200.73.16.40 - 200.73.16.63 co -200.73.16.64 - 200.73.16.95 cl -200.73.16.96 - 200.73.16.175 co -200.73.16.176 - 200.73.16.183 cl -200.73.16.184 - 200.73.16.255 co -200.73.17.0 - 200.73.28.255 cl -200.73.29.0 - 200.73.30.255 co -200.73.31.0 - 200.73.31.7 cl -200.73.31.8 - 200.73.31.223 co -200.73.31.224 - 200.73.31.231 cl -200.73.31.232 - 200.73.31.255 co -200.73.32.0 - 200.73.34.255 cl -200.73.35.0 - 200.73.35.15 co -200.73.35.16 - 200.73.35.23 cl -200.73.35.24 - 200.73.35.135 co -200.73.35.136 - 200.73.35.151 cl -200.73.35.152 - 200.73.35.199 co -200.73.35.200 - 200.73.35.215 cl -200.73.35.216 - 200.73.35.239 co -200.73.35.240 - 200.73.35.255 cl -200.73.36.0 - 200.73.36.255 co -200.73.37.0 - 200.73.41.255 cl -200.73.42.0 - 200.73.45.255 co -200.73.46.0 - 200.73.47.255 cl -200.73.48.0 - 200.73.52.255 co -200.73.53.0 - 200.73.64.255 cl -200.73.65.0 - 200.73.81.255 co -200.73.82.0 - 200.73.82.255 cl -200.73.83.0 - 200.73.95.255 co +200.71.248.0 - 200.71.255.255 bq +200.72.0.0 - 200.73.6.143 cl +200.73.6.144 - 200.73.6.148 us +200.73.6.149 - 200.73.6.149 cl +200.73.6.150 - 200.73.6.159 us +200.73.6.160 - 200.73.17.95 cl +200.73.17.96 - 200.73.17.127 us +200.73.17.128 - 200.73.65.255 cl +200.73.66.0 - 200.73.66.255 co +200.73.67.0 - 200.73.67.255 cl +200.73.68.0 - 200.73.71.255 co +200.73.72.0 - 200.73.75.255 cl +200.73.76.0 - 200.73.76.255 ar +200.73.77.0 - 200.73.79.255 cl +200.73.80.0 - 200.73.80.255 co +200.73.81.0 - 200.73.83.255 cl +200.73.84.0 - 200.73.84.255 co +200.73.85.0 - 200.73.85.255 cl +200.73.86.0 - 200.73.89.255 co +200.73.90.0 - 200.73.90.255 cl +200.73.91.0 - 200.73.92.255 co +200.73.93.0 - 200.73.93.255 cl +200.73.94.0 - 200.73.95.255 co 200.73.96.0 - 200.73.103.255 bo 200.73.104.0 - 200.73.111.255 sv -200.73.112.0 - 200.73.119.255 ar -200.73.120.0 - 200.73.127.255 cl -200.73.128.0 - 200.73.191.255 ar +200.73.112.0 - 200.73.127.255 cl +200.73.128.0 - 200.73.128.255 ar +200.73.129.0 - 200.73.129.255 us +200.73.130.0 - 200.73.191.255 ar 200.73.192.0 - 200.73.199.255 ve 200.73.200.0 - 200.73.207.255 ec 200.73.208.0 - 200.73.215.255 cl -200.73.216.0 - 200.73.223.255 co 200.73.224.0 - 200.74.127.255 cl 200.74.128.0 - 200.74.159.255 co 200.74.160.0 - 200.74.191.255 cl 200.74.192.0 - 200.74.239.255 ve 200.74.240.0 - 200.74.247.255 pa 200.74.248.0 - 200.74.255.255 cr -200.75.0.0 - 200.75.31.255 cl +200.75.0.0 - 200.75.1.255 cl +200.75.2.0 - 200.75.2.7 co +200.75.2.8 - 200.75.31.255 cl 200.75.32.0 - 200.75.95.255 co 200.75.96.0 - 200.75.159.255 ve 200.75.160.0 - 200.75.175.255 bo -200.75.176.0 - 200.75.179.255 ar -200.75.180.0 - 200.75.183.255 us +200.75.176.0 - 200.75.183.255 br 200.75.184.0 - 200.75.191.255 hn 200.75.192.0 - 200.75.255.255 pa -200.76.0.0 - 200.79.255.255 mx -200.80.0.0 - 200.80.6.255 co -200.80.7.0 - 200.80.9.255 ar -200.80.10.0 - 200.80.10.127 co -200.80.10.128 - 200.80.11.255 ar -200.80.12.0 - 200.80.12.255 co +200.76.0.0 - 200.76.126.255 mx +200.76.127.0 - 200.76.127.255 us +200.76.128.0 - 200.77.175.255 mx +200.77.176.0 - 200.77.183.255 br +200.77.184.0 - 200.77.187.255 cl +200.77.188.0 - 200.77.191.255 ec +200.77.192.0 - 200.79.183.255 mx +200.79.184.0 - 200.79.191.255 br +200.79.192.0 - 200.79.255.255 mx +200.80.0.0 - 200.80.7.47 co +200.80.7.48 - 200.80.7.63 ar +200.80.7.64 - 200.80.7.111 co +200.80.7.112 - 200.80.7.159 ar +200.80.7.160 - 200.80.7.255 co +200.80.8.0 - 200.80.9.255 ar +200.80.10.0 - 200.80.12.255 co 200.80.13.0 - 200.80.13.127 ar -200.80.13.128 - 200.80.13.255 co -200.80.14.0 - 200.80.14.255 ar -200.80.15.0 - 200.80.15.255 co -200.80.16.0 - 200.80.16.127 ar -200.80.16.128 - 200.80.16.255 co -200.80.17.0 - 200.80.18.31 ar -200.80.18.32 - 200.80.18.63 co -200.80.18.64 - 200.80.18.255 ar -200.80.19.0 - 200.80.21.255 co -200.80.22.0 - 200.80.24.127 ar -200.80.24.128 - 200.80.24.143 co -200.80.24.144 - 200.80.25.127 ar +200.80.13.128 - 200.80.14.255 co +200.80.15.0 - 200.80.15.255 ar +200.80.16.0 - 200.80.16.223 co +200.80.16.224 - 200.80.16.239 ar +200.80.16.240 - 200.80.17.191 co +200.80.17.192 - 200.80.17.255 ar +200.80.18.0 - 200.80.18.15 co +200.80.18.16 - 200.80.18.31 ar +200.80.18.32 - 200.80.18.159 co +200.80.18.160 - 200.80.18.175 ar +200.80.18.176 - 200.80.19.255 co +200.80.20.0 - 200.80.20.191 ar +200.80.20.192 - 200.80.20.255 co +200.80.21.0 - 200.80.21.255 ar +200.80.22.0 - 200.80.24.255 co +200.80.25.0 - 200.80.25.127 ar 200.80.25.128 - 200.80.25.255 co -200.80.26.0 - 200.80.27.255 ar -200.80.28.0 - 200.80.28.63 co -200.80.28.64 - 200.80.28.95 ar -200.80.28.96 - 200.80.28.255 co +200.80.26.0 - 200.80.26.63 ar +200.80.26.64 - 200.80.26.127 co +200.80.26.128 - 200.80.27.255 ar +200.80.28.0 - 200.80.28.31 co +200.80.28.32 - 200.80.28.95 ar +200.80.28.96 - 200.80.28.159 co +200.80.28.160 - 200.80.28.175 ar +200.80.28.176 - 200.80.28.255 co 200.80.29.0 - 200.80.30.31 ar -200.80.30.32 - 200.80.30.63 co -200.80.30.64 - 200.80.30.255 ar -200.80.31.0 - 200.80.31.63 co -200.80.31.64 - 200.80.31.127 ar -200.80.31.128 - 200.80.31.255 co -200.80.32.0 - 200.80.32.31 ar -200.80.32.32 - 200.80.32.191 co -200.80.32.192 - 200.80.35.31 ar -200.80.35.32 - 200.80.35.47 co +200.80.30.32 - 200.80.30.47 co +200.80.30.48 - 200.80.30.63 ar +200.80.30.64 - 200.80.32.167 co +200.80.32.168 - 200.80.32.175 ar +200.80.32.176 - 200.80.32.191 co +200.80.32.192 - 200.80.33.255 ar +200.80.34.0 - 200.80.34.255 co +200.80.35.0 - 200.80.35.39 ar +200.80.35.40 - 200.80.35.47 co 200.80.35.48 - 200.80.35.127 ar 200.80.35.128 - 200.80.35.159 co 200.80.35.160 - 200.80.35.175 ar @@ -120781,55 +98069,76 @@ 200.80.36.0 - 200.80.40.127 ar 200.80.40.128 - 200.80.40.191 co 200.80.40.192 - 200.80.40.207 ar -200.80.40.208 - 200.80.41.159 co -200.80.41.160 - 200.80.41.191 ar -200.80.41.192 - 200.80.41.255 co -200.80.42.0 - 200.80.46.255 ar -200.80.47.0 - 200.80.51.255 co -200.80.52.0 - 200.80.54.255 ar -200.80.55.0 - 200.80.55.255 co -200.80.56.0 - 200.80.59.127 ar -200.80.59.128 - 200.80.59.255 co -200.80.60.0 - 200.80.95.255 ar +200.80.40.208 - 200.80.43.255 co +200.80.44.0 - 200.80.44.255 ar +200.80.45.0 - 200.80.45.255 co +200.80.46.0 - 200.80.46.255 ar +200.80.47.0 - 200.80.56.127 co +200.80.56.128 - 200.80.58.255 ar +200.80.59.0 - 200.80.60.255 co +200.80.61.0 - 200.80.61.255 ar +200.80.62.0 - 200.80.62.255 co +200.80.63.0 - 200.80.75.255 ar +200.80.76.0 - 200.80.77.255 us +200.80.78.0 - 200.80.81.255 ar +200.80.82.0 - 200.80.82.255 us +200.80.83.0 - 200.80.83.255 ar +200.80.84.0 - 200.80.85.255 us +200.80.86.0 - 200.80.86.127 ar +200.80.86.128 - 200.80.86.255 us +200.80.87.0 - 200.80.87.127 ar +200.80.87.128 - 200.80.88.255 us +200.80.89.0 - 200.80.89.127 ar +200.80.89.128 - 200.80.90.127 us +200.80.90.128 - 200.80.91.255 ar +200.80.92.0 - 200.80.92.127 us +200.80.92.128 - 200.80.94.127 ar +200.80.94.128 - 200.80.94.255 us +200.80.95.0 - 200.80.95.127 ar +200.80.95.128 - 200.80.95.255 us 200.80.96.0 - 200.80.127.255 ht 200.80.128.0 - 200.81.47.255 ar 200.81.48.0 - 200.81.55.255 gt 200.81.56.0 - 200.81.63.255 co -200.81.64.0 - 200.81.71.255 py -200.81.72.0 - 200.81.75.255 ec -200.81.76.0 - 200.81.76.127 ar -200.81.76.128 - 200.81.76.255 ec -200.81.77.0 - 200.81.78.255 ar -200.81.79.0 - 200.81.79.255 ec -200.81.80.0 - 200.81.80.255 ar +200.81.64.0 - 200.81.80.255 ar 200.81.81.0 - 200.81.81.127 bo -200.81.81.128 - 200.81.81.255 ar -200.81.82.0 - 200.81.83.255 ec -200.81.84.0 - 200.81.87.255 bo -200.81.88.0 - 200.81.88.255 ec -200.81.89.0 - 200.81.89.255 ar -200.81.90.0 - 200.81.90.255 ec -200.81.91.0 - 200.81.91.175 ar -200.81.91.176 - 200.81.91.187 ec -200.81.91.188 - 200.81.91.255 ar -200.81.92.0 - 200.81.93.255 bo -200.81.94.0 - 200.81.143.255 ar +200.81.81.128 - 200.81.112.15 ar +200.81.112.16 - 200.81.112.31 br +200.81.112.32 - 200.81.112.111 ar +200.81.112.112 - 200.81.112.127 br +200.81.112.128 - 200.81.114.191 ar +200.81.114.192 - 200.81.114.195 br +200.81.114.196 - 200.81.117.223 ar +200.81.117.224 - 200.81.117.227 mx +200.81.117.228 - 200.81.118.15 ar +200.81.118.16 - 200.81.118.23 do +200.81.118.24 - 200.81.118.119 ar +200.81.118.120 - 200.81.118.123 mx +200.81.118.124 - 200.81.119.87 ar +200.81.119.88 - 200.81.119.95 mx +200.81.119.96 - 200.81.119.159 ar +200.81.119.160 - 200.81.119.167 mx +200.81.119.168 - 200.81.143.255 ar 200.81.144.0 - 200.81.151.255 cl -200.81.160.0 - 200.82.127.255 ar +200.81.152.0 - 200.82.127.255 ar 200.82.128.0 - 200.82.255.255 ve 200.83.0.0 - 200.83.255.255 cl 200.84.0.0 - 200.84.255.255 ve -200.85.0.0 - 200.85.31.255 sv +200.85.0.0 - 200.85.30.255 sv +200.85.31.0 - 200.85.31.255 hn 200.85.32.0 - 200.85.63.255 py 200.85.64.0 - 200.85.79.255 ve 200.85.80.0 - 200.85.87.255 ec 200.85.88.0 - 200.85.127.255 ar 200.85.128.0 - 200.85.151.255 bo -200.85.152.0 - 200.85.159.255 ar +200.85.152.0 - 200.85.158.255 ar +200.85.159.0 - 200.85.159.255 pe 200.85.160.0 - 200.85.175.255 ni 200.85.176.0 - 200.85.191.255 ar 200.85.192.0 - 200.85.223.255 cl -200.85.224.0 - 200.85.255.255 co +200.85.224.0 - 200.85.229.255 co +200.85.230.0 - 200.85.230.127 ve +200.85.230.128 - 200.85.255.255 co 200.86.0.0 - 200.86.255.255 cl 200.87.0.0 - 200.87.255.255 bo 200.88.0.0 - 200.88.255.255 do @@ -120856,42 +98165,57 @@ 200.93.192.0 - 200.93.239.255 ec 200.93.240.0 - 200.93.247.255 uy 200.93.248.0 - 200.93.255.255 ec -200.94.0.0 - 200.95.255.255 mx +200.94.0.0 - 200.94.239.255 mx +200.94.240.0 - 200.94.247.255 br +200.94.248.0 - 200.94.251.255 gt +200.94.252.0 - 200.94.255.255 br +200.95.0.0 - 200.95.171.255 mx +200.95.172.0 - 200.95.183.255 br +200.95.184.0 - 200.95.187.255 cl +200.95.188.0 - 200.95.223.255 br +200.95.224.0 - 200.95.255.255 mx 200.96.0.0 - 200.103.255.255 br 200.104.0.0 - 200.104.255.255 cl 200.105.0.0 - 200.105.0.255 ar -200.105.1.0 - 200.105.1.255 uy -200.105.2.0 - 200.105.7.255 ar -200.105.8.0 - 200.105.15.255 br -200.105.16.0 - 200.105.23.255 co -200.105.24.0 - 200.105.31.255 mx -200.105.32.0 - 200.105.47.255 pa -200.105.48.0 - 200.105.49.255 co -200.105.50.0 - 200.105.50.255 us -200.105.51.0 - 200.105.55.255 co -200.105.56.0 - 200.105.59.255 ar -200.105.60.0 - 200.105.67.255 co -200.105.68.0 - 200.105.68.255 gt +200.105.1.0 - 200.105.1.255 us +200.105.2.0 - 200.105.5.255 ar +200.105.6.0 - 200.105.6.255 us +200.105.7.0 - 200.105.9.255 ar +200.105.10.0 - 200.105.11.255 us +200.105.12.0 - 200.105.13.255 ar +200.105.14.0 - 200.105.15.255 us +200.105.16.0 - 200.105.49.255 ar +200.105.50.0 - 200.105.52.255 us +200.105.53.0 - 200.105.54.255 ar +200.105.55.0 - 200.105.55.255 us +200.105.56.0 - 200.105.57.255 ar +200.105.58.0 - 200.105.58.255 us +200.105.59.0 - 200.105.68.255 ar 200.105.69.0 - 200.105.69.255 pa -200.105.70.0 - 200.105.70.255 ar -200.105.71.0 - 200.105.71.255 pa -200.105.72.0 - 200.105.79.255 co -200.105.80.0 - 200.105.87.255 pa -200.105.88.0 - 200.105.95.255 co +200.105.70.0 - 200.105.73.255 ar +200.105.74.0 - 200.105.74.255 us +200.105.75.0 - 200.105.77.255 ar +200.105.78.0 - 200.105.79.255 us +200.105.80.0 - 200.105.83.255 ar +200.105.84.0 - 200.105.85.255 us +200.105.86.0 - 200.105.94.255 ar +200.105.95.0 - 200.105.95.255 us 200.105.96.0 - 200.105.103.255 cr 200.105.104.0 - 200.105.111.255 ar 200.105.112.0 - 200.105.119.255 ec 200.105.120.0 - 200.105.127.255 ar -200.105.128.0 - 200.105.191.255 bo -200.105.192.0 - 200.105.207.255 pe -200.105.208.0 - 200.105.223.255 bo +200.105.128.0 - 200.105.223.255 bo 200.105.224.0 - 200.105.255.255 ec 200.106.0.0 - 200.106.127.255 pe 200.106.128.0 - 200.106.143.255 co 200.106.144.0 - 200.106.151.255 pa 200.106.152.0 - 200.106.159.255 cl 200.106.160.0 - 200.106.223.255 co -200.106.224.0 - 200.106.239.255 sv +200.106.224.0 - 200.106.229.255 hn +200.106.230.0 - 200.106.230.255 sv +200.106.231.0 - 200.106.231.255 hn +200.106.232.0 - 200.106.235.255 sv +200.106.236.0 - 200.106.239.255 hn 200.106.240.0 - 200.106.243.255 ar 200.106.244.0 - 200.106.245.255 bo 200.106.246.0 - 200.106.246.255 hn @@ -120902,95 +98226,97 @@ 200.107.80.0 - 200.107.80.255 hn 200.107.81.0 - 200.107.81.255 ar 200.107.82.0 - 200.107.83.255 cr -200.107.84.0 - 200.107.87.255 an -200.107.88.0 - 200.107.95.255 ar -200.107.96.0 - 200.107.111.255 pe -200.107.112.0 - 200.107.113.255 ar -200.107.114.0 - 200.107.114.255 uy -200.107.115.0 - 200.107.117.255 ar -200.107.118.0 - 200.107.118.255 uy -200.107.119.0 - 200.107.119.255 ar +200.107.84.0 - 200.107.87.255 bq +200.107.88.0 - 200.107.111.255 ar 200.107.120.0 - 200.107.127.255 hn 200.107.128.0 - 200.107.191.255 pe 200.107.192.0 - 200.107.199.255 ve 200.107.200.0 - 200.107.207.255 ar 200.107.208.0 - 200.107.215.255 hn -200.107.216.0 - 200.107.223.255 gt 200.107.224.0 - 200.107.231.255 ar 200.107.232.0 - 200.107.239.255 hn 200.107.240.0 - 200.107.247.255 bo 200.107.248.0 - 200.107.255.255 ec 200.108.0.0 - 200.108.31.255 tt -200.108.32.0 - 200.108.47.255 pa +200.108.32.0 - 200.108.63.255 pa 200.108.64.0 - 200.108.95.255 ar 200.108.96.0 - 200.108.111.255 pe -200.108.112.0 - 200.108.127.255 ar +200.108.112.0 - 200.108.120.63 ar +200.108.120.64 - 200.108.120.79 mx +200.108.120.80 - 200.108.121.79 ar +200.108.121.80 - 200.108.121.95 pr +200.108.121.96 - 200.108.124.191 ar +200.108.124.192 - 200.108.124.207 pr +200.108.124.208 - 200.108.125.79 ar +200.108.125.80 - 200.108.125.95 do +200.108.125.96 - 200.108.125.159 ar +200.108.125.160 - 200.108.125.175 co +200.108.125.176 - 200.108.127.255 ar 200.108.128.0 - 200.108.143.255 py -200.108.160.0 - 200.108.163.255 bz -200.108.164.0 - 200.108.164.127 pa -200.108.164.128 - 200.108.165.255 bz -200.108.166.0 - 200.108.166.127 pa -200.108.166.128 - 200.108.167.255 bz -200.108.168.0 - 200.108.168.127 pa -200.108.168.128 - 200.108.169.127 bz -200.108.169.128 - 200.108.169.255 pa -200.108.170.0 - 200.108.172.255 bz -200.108.173.0 - 200.108.173.127 pa -200.108.173.128 - 200.108.173.255 bz -200.108.174.0 - 200.108.174.127 pa -200.108.174.128 - 200.108.180.255 bz -200.108.181.0 - 200.108.181.255 pa -200.108.182.0 - 200.108.189.255 bz -200.108.190.0 - 200.108.190.255 pa -200.108.191.0 - 200.108.191.255 bz +200.108.144.0 - 200.108.159.255 ar 200.108.192.0 - 200.108.255.255 uy 200.109.0.0 - 200.109.255.255 ve -200.110.0.0 - 200.110.63.255 pe -200.110.64.0 - 200.110.95.255 ec -200.110.96.0 - 200.110.111.255 co -200.110.112.0 - 200.110.127.255 ec -200.110.128.0 - 200.110.131.255 co -200.110.132.0 - 200.110.135.255 ar -200.110.136.0 - 200.110.137.255 co -200.110.138.0 - 200.110.139.255 ar -200.110.140.0 - 200.110.141.127 co -200.110.141.128 - 200.110.141.255 ar -200.110.142.0 - 200.110.145.255 co -200.110.146.0 - 200.110.147.255 ar -200.110.148.0 - 200.110.148.255 co -200.110.149.0 - 200.110.150.127 ar -200.110.150.128 - 200.110.150.255 co -200.110.151.0 - 200.110.151.255 ar -200.110.152.0 - 200.110.152.255 co -200.110.153.0 - 200.110.153.255 pa -200.110.154.0 - 200.110.155.255 co -200.110.156.0 - 200.110.156.255 ar -200.110.157.0 - 200.110.157.127 mx -200.110.157.128 - 200.110.157.255 ar +200.110.0.0 - 200.110.47.255 pe +200.110.48.0 - 200.110.63.255 bo +200.110.64.0 - 200.110.127.255 ec +200.110.128.0 - 200.110.142.255 ar +200.110.143.0 - 200.110.144.255 co +200.110.145.0 - 200.110.145.31 ar +200.110.145.32 - 200.110.149.63 co +200.110.149.64 - 200.110.149.127 ar +200.110.149.128 - 200.110.149.223 co +200.110.149.224 - 200.110.149.255 ar +200.110.150.0 - 200.110.151.255 co +200.110.152.0 - 200.110.155.255 pa +200.110.156.0 - 200.110.156.191 ar +200.110.156.192 - 200.110.156.255 co +200.110.157.0 - 200.110.157.255 mx 200.110.158.0 - 200.110.158.255 co 200.110.159.0 - 200.110.167.255 ar 200.110.168.0 - 200.110.175.255 co -200.110.176.0 - 200.110.199.255 ar -200.110.200.0 - 200.110.207.255 gt -200.110.208.0 - 200.110.231.255 ar +200.110.176.0 - 200.110.231.255 ar 200.110.232.0 - 200.110.239.255 ec -200.110.240.0 - 200.110.255.255 gt +200.110.240.0 - 200.110.243.255 ve +200.110.244.0 - 200.110.244.255 hn +200.110.245.0 - 200.110.250.255 ve +200.110.251.0 - 200.110.251.255 cr +200.110.252.0 - 200.110.255.255 ve 200.111.0.0 - 200.112.127.255 cl 200.112.128.0 - 200.112.191.255 ar -200.112.192.0 - 200.112.207.255 bo -200.112.208.0 - 200.112.215.255 co +200.112.192.0 - 200.112.215.255 co +200.112.216.0 - 200.112.223.255 ec 200.112.224.0 - 200.113.191.255 cl -200.113.192.0 - 200.113.223.255 ht -200.114.0.0 - 200.114.79.255 co +200.113.192.0 - 200.113.213.255 ht +200.113.214.0 - 200.113.215.255 mx +200.113.216.0 - 200.113.255.255 ht +200.114.0.0 - 200.114.63.255 co +200.114.64.0 - 200.114.79.255 cl 200.114.80.0 - 200.114.87.255 ar 200.114.88.0 - 200.114.95.255 cl 200.114.96.0 - 200.114.111.255 ar 200.114.112.0 - 200.114.119.255 gt 200.114.120.0 - 200.115.15.255 ar +200.115.16.0 - 200.115.17.255 py +200.115.18.0 - 200.115.18.255 cr +200.115.19.0 - 200.115.19.255 pa +200.115.20.0 - 200.115.23.255 pe +200.115.24.0 - 200.115.31.255 ar 200.115.32.0 - 200.115.47.255 ec +200.115.48.0 - 200.115.63.255 ar 200.115.64.0 - 200.115.79.255 uy -200.115.96.0 - 200.115.127.255 co -200.115.128.0 - 200.115.191.255 pa +200.115.80.0 - 200.115.95.255 ar +200.115.128.0 - 200.115.133.79 pa +200.115.133.80 - 200.115.133.87 ni +200.115.133.88 - 200.115.175.255 pa +200.115.176.0 - 200.115.176.255 hn +200.115.177.0 - 200.115.177.255 pa +200.115.178.0 - 200.115.178.255 co +200.115.179.0 - 200.115.179.255 cw +200.115.180.0 - 200.115.181.255 co +200.115.182.0 - 200.115.183.255 ht +200.115.184.0 - 200.115.184.255 cl +200.115.185.0 - 200.115.187.255 ar +200.115.188.0 - 200.115.191.255 hn 200.115.192.0 - 200.115.255.255 ar 200.116.0.0 - 200.116.255.255 co 200.117.0.0 - 200.117.255.255 ar @@ -121003,53 +98329,274 @@ 200.122.128.0 - 200.122.191.255 cr 200.122.192.0 - 200.122.255.255 co 200.123.0.0 - 200.123.31.255 pe -200.123.32.0 - 200.123.193.255 ar -200.123.194.0 - 200.123.194.255 pe +200.123.32.0 - 200.123.194.255 ar 200.123.195.0 - 200.123.195.127 us -200.123.195.128 - 200.123.207.255 ar -200.123.224.0 - 200.123.239.255 co +200.123.195.128 - 200.123.198.127 ar +200.123.198.128 - 200.123.198.255 us +200.123.199.0 - 200.123.201.255 ar +200.123.202.0 - 200.123.203.127 us +200.123.203.128 - 200.123.203.255 ar +200.123.204.0 - 200.123.204.255 us +200.123.205.0 - 200.123.207.255 ar +200.123.208.0 - 200.123.215.255 bz +200.123.216.0 - 200.123.223.255 ar +200.123.240.0 - 200.123.255.255 ar 200.124.0.0 - 200.124.31.255 pa 200.124.32.0 - 200.124.63.255 cl -200.124.64.0 - 200.124.95.255 bz 200.124.96.0 - 200.124.119.255 ar 200.124.120.0 - 200.124.120.255 py 200.124.121.0 - 200.124.121.255 ve -200.124.128.0 - 200.124.159.255 an -200.124.160.0 - 200.124.175.255 co -200.124.192.0 - 200.124.207.255 uy +200.124.122.0 - 200.124.123.255 ar +200.124.124.0 - 200.124.125.255 co +200.124.126.0 - 200.124.126.255 ar +200.124.127.0 - 200.124.127.255 pa +200.124.128.0 - 200.124.159.255 cw +200.124.176.0 - 200.124.187.255 ar +200.124.188.0 - 200.124.191.255 pe +200.124.192.0 - 200.124.223.255 uy 200.124.224.0 - 200.124.255.255 ec 200.125.0.0 - 200.125.63.255 uy 200.125.64.0 - 200.125.127.255 ar 200.125.128.0 - 200.125.159.255 ec 200.125.160.0 - 200.125.167.255 tt -200.125.168.0 - 200.125.175.255 ni 200.125.176.0 - 200.125.183.255 gt 200.125.184.0 - 200.125.191.255 ve -200.125.192.0 - 200.126.0.255 ec -200.126.1.0 - 200.126.1.255 cu -200.126.2.0 - 200.126.31.255 ec +200.125.192.0 - 200.126.31.255 ec 200.126.32.0 - 200.126.47.255 cl +200.126.48.0 - 200.126.48.255 ec +200.126.49.0 - 200.126.51.255 cl +200.126.52.0 - 200.126.63.255 pe 200.126.64.0 - 200.126.127.255 cl 200.126.128.0 - 200.127.255.255 ar -200.128.0.0 - 201.95.255.255 br -201.96.0.0 - 201.175.255.255 mx +200.128.0.0 - 200.187.255.255 br +200.188.0.0 - 200.188.39.255 mx +200.188.40.0 - 200.188.47.255 br +200.188.48.0 - 200.188.95.255 mx +200.188.96.0 - 200.188.127.255 br +200.188.128.0 - 200.188.159.255 mx +200.188.160.0 - 200.189.43.255 br +200.189.44.0 - 200.189.44.255 hn +200.189.45.0 - 200.189.45.15 ca +200.189.45.16 - 200.189.47.255 hn +200.189.48.0 - 200.192.104.255 br +200.192.105.0 - 200.192.105.255 pe +200.192.108.0 - 200.192.235.255 br +200.192.236.0 - 200.192.239.255 cr +200.192.240.0 - 200.193.255.255 br +200.194.0.0 - 200.194.63.255 mx +200.194.64.0 - 200.200.200.199 br +200.200.200.200 - 200.200.200.200 a1 +200.200.200.201 - 200.224.255.255 br +200.225.0.0 - 200.225.31.255 mx +200.225.32.0 - 200.225.99.255 br +200.225.100.0 - 200.225.103.255 ar +200.225.104.0 - 200.229.143.255 br +200.229.144.0 - 200.229.147.255 cr +200.229.148.0 - 200.229.151.255 ar +200.229.152.0 - 200.229.155.255 ve +200.229.156.0 - 200.229.215.255 br +200.229.216.0 - 200.229.219.255 ve +200.229.220.0 - 200.229.249.255 br +200.229.252.0 - 200.229.255.255 ar +200.230.0.0 - 200.236.63.255 br +200.236.64.0 - 200.236.127.255 mx +200.236.128.0 - 200.238.255.255 br +200.239.0.0 - 200.239.63.255 mx +200.239.64.0 - 201.95.255.255 br +201.96.0.0 - 201.126.112.255 mx +201.126.113.0 - 201.126.113.255 br +201.126.114.0 - 201.130.15.255 mx +201.130.20.0 - 201.130.23.255 br +201.130.24.0 - 201.130.27.255 pe +201.130.28.0 - 201.130.31.255 br +201.130.32.0 - 201.130.81.255 mx +201.130.82.0 - 201.130.83.255 ve +201.130.84.0 - 201.130.95.255 br +201.130.96.0 - 201.131.9.255 mx +201.131.10.0 - 201.131.11.255 cr +201.131.12.0 - 201.131.23.255 mx +201.131.24.0 - 201.131.31.255 br +201.131.32.0 - 201.131.36.255 mx +201.131.37.0 - 201.131.37.255 cr +201.131.38.0 - 201.131.39.255 cl +201.131.40.0 - 201.131.40.255 mx +201.131.41.0 - 201.131.41.255 bo +201.131.42.0 - 201.131.42.255 sv +201.131.43.0 - 201.131.43.255 cw +201.131.44.0 - 201.131.44.255 mx +201.131.45.0 - 201.131.45.255 bo +201.131.46.0 - 201.131.46.255 co +201.131.47.0 - 201.131.47.255 ar +201.131.48.0 - 201.131.48.255 mx +201.131.49.0 - 201.131.49.255 pa +201.131.50.0 - 201.131.50.255 do +201.131.51.0 - 201.131.51.255 py +201.131.52.0 - 201.131.65.255 mx +201.131.66.0 - 201.131.66.255 ni +201.131.67.0 - 201.131.67.255 pe +201.131.68.0 - 201.131.71.255 br +201.131.72.0 - 201.131.72.255 mx +201.131.73.0 - 201.131.73.255 gt +201.131.74.0 - 201.131.75.255 ar +201.131.76.0 - 201.131.76.255 mx +201.131.77.0 - 201.131.77.255 ht +201.131.78.0 - 201.131.78.255 co +201.131.79.0 - 201.131.79.255 ar +201.131.80.0 - 201.131.87.255 br +201.131.88.0 - 201.131.89.255 mx +201.131.90.0 - 201.131.91.255 co +201.131.92.0 - 201.131.95.255 br +201.131.96.0 - 201.131.96.255 mx +201.131.97.0 - 201.131.97.255 co +201.131.98.0 - 201.131.99.255 pa +201.131.100.0 - 201.131.101.255 mx +201.131.102.0 - 201.131.102.255 ar +201.131.103.0 - 201.131.103.255 sr +201.131.104.0 - 201.131.105.255 mx +201.131.106.0 - 201.131.107.255 do +201.131.108.0 - 201.131.109.255 mx +201.131.110.0 - 201.131.111.255 sv +201.131.112.0 - 201.131.113.255 mx +201.131.114.0 - 201.131.114.255 co +201.131.115.0 - 201.131.115.255 ni +201.131.116.0 - 201.131.117.255 mx +201.131.118.0 - 201.131.119.255 ar +201.131.120.0 - 201.131.120.255 mx +201.131.121.0 - 201.131.121.255 pe +201.131.122.0 - 201.131.123.255 sv +201.131.124.0 - 201.131.135.255 mx +201.131.136.0 - 201.131.147.255 br +201.131.148.0 - 201.131.151.255 pa +201.131.152.0 - 201.131.187.255 br +201.131.188.0 - 201.131.191.255 co +201.131.192.0 - 201.131.207.255 mx +201.131.208.0 - 201.131.215.255 br +201.131.216.0 - 201.131.219.255 co +201.131.220.0 - 201.131.223.255 pe +201.131.224.0 - 201.131.231.255 br +201.131.232.0 - 201.131.239.255 mx +201.131.240.0 - 201.131.247.255 br +201.131.248.0 - 201.139.79.255 mx +201.139.80.0 - 201.139.83.255 ar +201.139.84.0 - 201.139.95.255 br +201.139.96.0 - 201.139.171.255 mx +201.139.172.0 - 201.139.175.255 br +201.139.176.0 - 201.139.183.255 mx +201.139.184.0 - 201.139.191.255 br +201.139.192.0 - 201.139.215.255 mx +201.139.216.0 - 201.139.223.255 br +201.139.224.0 - 201.140.207.255 mx +201.140.208.0 - 201.140.223.255 br +201.140.224.0 - 201.140.227.255 ar +201.140.228.0 - 201.140.235.255 br +201.140.236.0 - 201.140.239.255 co +201.140.240.0 - 201.140.255.255 br +201.141.0.0 - 201.148.95.255 mx +201.148.96.0 - 201.148.103.255 br +201.148.104.0 - 201.148.107.255 cl +201.148.108.0 - 201.148.127.255 br +201.148.128.0 - 201.148.159.255 mx +201.148.160.0 - 201.148.167.255 br +201.148.168.0 - 201.148.171.255 hn +201.148.172.0 - 201.148.191.255 br +201.148.192.0 - 201.148.207.255 mx +201.148.208.0 - 201.148.211.255 br +201.148.212.0 - 201.148.215.255 cl +201.148.216.0 - 201.148.231.255 br +201.148.232.0 - 201.148.235.255 cr +201.148.236.0 - 201.148.255.255 br +201.149.0.0 - 201.149.95.255 mx +201.149.96.0 - 201.149.127.255 br +201.149.128.0 - 201.150.11.255 mx +201.150.12.0 - 201.150.27.255 br +201.150.28.0 - 201.150.31.255 cl +201.150.32.0 - 201.150.47.255 mx +201.150.48.0 - 201.150.59.255 br +201.150.60.0 - 201.150.63.255 pe +201.150.64.0 - 201.150.79.255 mx +201.150.80.0 - 201.150.83.255 br +201.150.84.0 - 201.150.87.255 sv +201.150.88.0 - 201.150.95.255 br +201.150.96.0 - 201.150.99.255 co +201.150.100.0 - 201.150.103.255 br +201.150.104.0 - 201.150.107.255 ht +201.150.108.0 - 201.150.127.255 br +201.150.128.0 - 201.150.143.255 mx +201.150.144.0 - 201.150.159.255 br +201.150.160.0 - 201.150.191.255 bo +201.150.192.0 - 201.157.191.255 mx +201.157.192.0 - 201.157.255.255 br +201.158.0.0 - 201.158.7.255 mx +201.158.8.0 - 201.158.15.255 br +201.158.16.0 - 201.158.19.255 mx +201.158.20.0 - 201.158.31.255 br +201.158.32.0 - 201.158.39.255 mx +201.158.40.0 - 201.158.47.255 br +201.158.48.0 - 201.158.51.255 hn +201.158.52.0 - 201.158.55.255 pe +201.158.56.0 - 201.158.63.255 br +201.158.64.0 - 201.158.107.255 mx +201.158.108.0 - 201.158.111.255 br +201.158.112.0 - 201.158.119.255 mx +201.158.120.0 - 201.158.127.255 ar +201.158.128.0 - 201.159.7.255 mx +201.159.8.0 - 201.159.15.255 ar +201.159.16.0 - 201.159.23.255 mx +201.159.24.0 - 201.159.31.255 br +201.159.32.0 - 201.159.43.255 mx +201.159.44.0 - 201.159.47.255 br +201.159.48.0 - 201.159.51.255 mx +201.159.52.0 - 201.159.55.255 br +201.159.56.0 - 201.159.63.255 ar +201.159.64.0 - 201.159.71.255 mx +201.159.72.0 - 201.159.79.255 br +201.159.80.0 - 201.159.83.255 mx +201.159.84.0 - 201.159.95.255 br +201.159.96.0 - 201.159.111.255 mx +201.159.112.0 - 201.159.115.255 gt +201.159.116.0 - 201.159.123.255 br +201.159.124.0 - 201.159.143.255 mx +201.159.144.0 - 201.159.159.255 br +201.159.160.0 - 201.159.167.255 mx +201.159.168.0 - 201.159.175.255 cl +201.159.176.0 - 201.159.179.255 mx +201.159.180.0 - 201.159.191.255 br +201.159.192.0 - 201.159.215.255 mx +201.159.216.0 - 201.159.219.255 ar +201.159.220.0 - 201.159.223.255 ec +201.159.224.0 - 201.159.247.255 mx +201.159.248.0 - 201.159.255.255 br +201.160.0.0 - 201.162.63.255 mx +201.162.64.0 - 201.162.127.255 br +201.162.128.0 - 201.175.47.255 mx +201.175.48.0 - 201.175.63.255 br +201.175.64.0 - 201.175.255.255 mx 201.176.0.0 - 201.181.255.255 ar -201.182.0.0 - 201.182.255.255 pa +201.182.0.0 - 201.182.26.255 us +201.182.27.0 - 201.182.27.255 hn +201.182.28.0 - 201.182.31.255 us +201.182.32.0 - 201.182.47.255 pa +201.182.48.0 - 201.182.63.255 us +201.182.64.0 - 201.182.139.255 pa +201.182.140.0 - 201.182.143.255 ve +201.182.144.0 - 201.182.255.255 pa +201.183.0.0 - 201.183.255.255 ec 201.184.0.0 - 201.185.255.255 co 201.186.0.0 - 201.189.255.255 cl 201.190.0.0 - 201.190.63.255 hn 201.190.64.0 - 201.190.127.255 co -201.190.128.0 - 201.190.191.255 pa +201.190.128.0 - 201.190.135.255 us +201.190.136.0 - 201.190.191.255 pa 201.190.192.0 - 201.190.207.255 us -201.190.208.0 - 201.190.255.255 pa +201.190.208.0 - 201.190.234.255 pa +201.190.235.0 - 201.190.235.255 br +201.190.236.0 - 201.190.255.255 pa 201.191.0.0 - 201.207.255.255 cr 201.208.0.0 - 201.211.255.255 ve 201.212.0.0 - 201.213.255.255 ar 201.214.0.0 - 201.215.255.255 cl 201.216.0.0 - 201.216.63.255 co -201.216.64.0 - 201.216.86.255 an -201.216.87.0 - 201.216.87.255 vg -201.216.88.0 - 201.216.127.255 an +201.216.64.0 - 201.216.127.255 cw 201.216.128.0 - 201.216.191.255 gt 201.216.192.0 - 201.216.255.255 ar 201.217.0.0 - 201.217.63.255 py @@ -121057,30 +98604,63 @@ 201.217.128.0 - 201.217.191.255 uy 201.217.192.0 - 201.217.223.255 co 201.217.224.0 - 201.217.239.255 ar +201.217.240.0 - 201.217.243.255 cl +201.217.244.0 - 201.217.247.255 ar +201.217.248.0 - 201.217.255.255 cl 201.218.0.0 - 201.218.63.255 ec 201.218.64.0 - 201.218.127.255 pa 201.218.128.0 - 201.218.159.255 cl -201.218.192.0 - 201.218.255.255 pa +201.218.160.0 - 201.218.191.255 cr +201.218.192.0 - 201.218.213.255 pa +201.218.214.0 - 201.218.214.255 pe +201.218.215.0 - 201.218.255.255 pa 201.219.0.0 - 201.219.63.255 ec -201.219.64.0 - 201.219.127.255 ar +201.219.64.0 - 201.219.111.255 ar +201.219.112.0 - 201.219.127.255 co 201.219.128.0 - 201.219.159.255 cl +201.219.160.0 - 201.219.191.255 ar 201.219.192.0 - 201.219.223.255 co -201.220.0.0 - 201.220.15.255 an -201.220.32.0 - 201.220.95.255 co +201.219.224.0 - 201.219.231.255 uy +201.219.232.0 - 201.219.239.255 cl +201.219.240.0 - 201.219.247.255 co +201.219.248.0 - 201.219.251.255 br +201.219.252.0 - 201.219.255.255 uy +201.220.0.0 - 201.220.9.255 sx +201.220.10.0 - 201.220.10.255 us +201.220.11.0 - 201.220.15.255 sx +201.220.16.0 - 201.220.24.255 ar +201.220.25.0 - 201.220.25.255 py +201.220.26.0 - 201.220.26.255 cr +201.220.27.0 - 201.220.27.255 cl +201.220.28.0 - 201.220.28.255 ar +201.220.29.0 - 201.220.29.255 cr +201.220.30.0 - 201.220.95.255 co 201.220.96.0 - 201.220.127.255 cl 201.220.128.0 - 201.220.143.255 hn -201.220.160.0 - 201.220.191.255 ar +201.220.144.0 - 201.220.191.255 ar 201.220.192.0 - 201.220.223.255 cu 201.220.224.0 - 201.220.255.255 cl 201.221.0.0 - 201.221.63.255 uy 201.221.64.0 - 201.221.95.255 tt 201.221.96.0 - 201.221.111.255 ar 201.221.112.0 - 201.221.119.255 cl +201.221.120.0 - 201.221.120.255 ar +201.221.121.0 - 201.221.121.255 cl +201.221.122.0 - 201.221.122.255 co +201.221.123.0 - 201.221.123.255 cl +201.221.124.0 - 201.221.125.255 co +201.221.126.0 - 201.221.126.255 do +201.221.127.0 - 201.221.127.255 ec 201.221.128.0 - 201.221.191.255 co 201.221.192.0 - 201.221.223.255 cl 201.221.224.0 - 201.221.255.255 pa 201.222.0.0 - 201.222.15.255 ve -201.222.32.0 - 201.222.47.255 an +201.222.16.0 - 201.222.19.255 ar +201.222.20.0 - 201.222.31.255 br +201.222.32.0 - 201.222.47.255 cw +201.222.48.0 - 201.222.55.255 py +201.222.56.0 - 201.222.59.255 ar +201.222.60.0 - 201.222.63.255 gt 201.222.64.0 - 201.222.127.255 bo 201.222.128.0 - 201.223.255.255 cl 201.224.0.0 - 201.227.255.255 pa @@ -121092,15 +98672,9 @@ 201.232.0.0 - 201.233.255.255 co 201.234.0.0 - 201.234.47.255 ar 201.234.48.0 - 201.234.63.255 pe -201.234.64.0 - 201.234.66.127 ar -201.234.66.128 - 201.234.66.255 co -201.234.67.0 - 201.234.68.255 ar -201.234.69.0 - 201.234.69.127 co -201.234.69.128 - 201.234.78.127 ar -201.234.78.128 - 201.234.78.255 co -201.234.79.0 - 201.234.79.255 ar -201.234.80.0 - 201.234.95.255 ec -201.234.96.0 - 201.234.111.255 ar +201.234.64.0 - 201.234.79.255 co +201.234.80.0 - 201.234.87.255 ec +201.234.88.0 - 201.234.111.255 ar 201.234.112.0 - 201.234.127.255 pe 201.234.128.0 - 201.234.175.255 ar 201.234.176.0 - 201.234.191.255 co @@ -121122,9 +98696,7 @@ 201.246.0.0 - 201.246.255.255 cl 201.247.0.0 - 201.247.255.255 sv 201.248.0.0 - 201.249.255.255 ve -201.250.0.0 - 201.252.252.255 ar -201.252.253.0 - 201.252.253.255 py -201.252.254.0 - 201.255.255.255 ar +201.250.0.0 - 201.255.255.255 ar 202.0.0.0 - 202.0.15.255 au 202.0.16.0 - 202.0.31.255 ph 202.0.32.0 - 202.0.63.255 nz @@ -121135,56 +98707,62 @@ 202.0.72.0 - 202.0.73.255 jp 202.0.74.0 - 202.0.75.255 au 202.0.76.0 - 202.0.76.255 jp -202.0.77.0 - 202.0.78.255 hk +202.0.77.0 - 202.0.77.255 hk +202.0.78.0 - 202.0.78.255 au 202.0.79.0 - 202.0.79.255 vn 202.0.80.0 - 202.0.80.255 pg -202.0.81.0 - 202.0.81.255 id -202.0.82.0 - 202.0.83.255 au +202.0.81.0 - 202.0.83.255 au 202.0.84.0 - 202.0.84.255 nz 202.0.85.0 - 202.0.87.255 au -202.0.88.0 - 202.0.89.255 sg +202.0.88.0 - 202.0.89.255 id 202.0.90.0 - 202.0.90.255 au 202.0.91.0 - 202.0.91.255 ph -202.0.92.0 - 202.0.92.255 au -202.0.93.0 - 202.0.93.255 jp -202.0.94.0 - 202.0.94.255 my +202.0.92.0 - 202.0.93.255 id +202.0.94.0 - 202.0.94.255 bd 202.0.95.0 - 202.0.96.255 au -202.0.97.0 - 202.0.97.255 nz +202.0.97.0 - 202.0.97.255 in 202.0.98.0 - 202.0.99.255 au -202.0.100.0 - 202.0.100.255 hk -202.0.101.0 - 202.0.102.255 au -202.0.103.0 - 202.0.103.255 id -202.0.104.0 - 202.0.104.255 hk -202.0.105.0 - 202.0.109.255 au -202.0.110.0 - 202.0.110.255 cn +202.0.100.0 - 202.0.101.255 cn +202.0.102.0 - 202.0.102.255 au +202.0.103.0 - 202.0.103.255 in +202.0.104.0 - 202.0.104.255 sg +202.0.105.0 - 202.0.106.255 au +202.0.107.0 - 202.0.107.255 id +202.0.108.0 - 202.0.108.255 au +202.0.109.0 - 202.0.109.255 in +202.0.110.0 - 202.0.110.255 pk 202.0.111.0 - 202.0.111.255 th -202.0.112.0 - 202.0.112.255 hk -202.0.113.0 - 202.0.115.255 au -202.0.116.0 - 202.0.116.255 id +202.0.112.0 - 202.0.112.255 in +202.0.113.0 - 202.0.114.255 au +202.0.115.0 - 202.0.116.255 in 202.0.117.0 - 202.0.120.255 th 202.0.121.0 - 202.0.121.255 nz -202.0.122.0 - 202.0.123.255 hk +202.0.122.0 - 202.0.123.255 cn 202.0.124.0 - 202.0.125.255 nz 202.0.126.0 - 202.0.127.255 sg -202.0.128.0 - 202.0.147.255 hk -202.0.148.0 - 202.0.148.255 au -202.0.149.0 - 202.0.150.255 sg +202.0.128.0 - 202.0.143.255 hk +202.0.144.0 - 202.0.147.255 ph +202.0.148.0 - 202.0.148.255 in +202.0.149.0 - 202.0.149.255 sg +202.0.150.0 - 202.0.150.255 au 202.0.151.0 - 202.0.151.255 nz -202.0.152.0 - 202.0.152.255 sg -202.0.153.0 - 202.0.153.255 nz -202.0.154.0 - 202.0.155.255 au +202.0.152.0 - 202.0.155.255 au 202.0.156.0 - 202.0.159.255 nc 202.0.160.0 - 202.0.183.255 hk -202.0.184.0 - 202.0.187.255 au -202.0.188.0 - 202.0.191.255 fr +202.0.184.0 - 202.0.191.255 au 202.0.192.0 - 202.0.255.255 us -202.1.0.0 - 202.1.4.255 au +202.1.0.0 - 202.1.1.255 au +202.1.2.0 - 202.1.2.255 hk +202.1.3.0 - 202.1.3.255 au +202.1.4.0 - 202.1.4.255 in 202.1.5.0 - 202.1.5.255 sg 202.1.6.0 - 202.1.7.255 hk 202.1.8.0 - 202.1.15.255 nz 202.1.16.0 - 202.1.31.255 au 202.1.32.0 - 202.1.63.255 pg -202.1.64.0 - 202.1.113.255 sg +202.1.64.0 - 202.1.95.255 sg +202.1.96.0 - 202.1.96.255 hk +202.1.97.0 - 202.1.113.255 sg 202.1.114.0 - 202.1.115.255 ph 202.1.116.0 - 202.1.119.255 au 202.1.120.0 - 202.1.127.255 in @@ -121192,14 +98770,13 @@ 202.1.160.0 - 202.1.191.255 sb 202.1.192.0 - 202.1.207.255 mv 202.1.208.0 - 202.1.223.255 jp -202.1.224.0 - 202.1.231.255 au 202.1.232.0 - 202.1.232.255 hk 202.1.233.0 - 202.1.235.255 au 202.1.236.0 - 202.1.236.255 id 202.1.237.0 - 202.1.238.255 au 202.1.239.0 - 202.1.239.255 sg -202.1.240.0 - 202.1.255.255 pg -202.2.0.0 - 202.2.3.255 au +202.1.240.0 - 202.1.254.255 pg +202.1.255.0 - 202.2.3.255 au 202.2.4.0 - 202.2.15.255 nz 202.2.16.0 - 202.2.31.255 au 202.2.32.0 - 202.2.51.255 hk @@ -121207,7 +98784,8 @@ 202.2.56.0 - 202.2.63.255 au 202.2.64.0 - 202.2.87.255 hk 202.2.88.0 - 202.2.91.255 jp -202.2.92.0 - 202.2.95.255 id +202.2.92.0 - 202.2.94.255 us +202.2.95.0 - 202.2.95.255 au 202.2.96.0 - 202.2.127.255 tv 202.2.128.0 - 202.2.255.255 jp 202.3.0.0 - 202.3.5.255 au @@ -121216,21 +98794,26 @@ 202.3.13.0 - 202.3.13.255 in 202.3.14.0 - 202.3.14.255 id 202.3.15.0 - 202.3.15.255 in -202.3.16.0 - 202.3.31.255 nz +202.3.16.0 - 202.3.31.255 kr 202.3.32.0 - 202.3.63.255 au 202.3.64.0 - 202.3.64.255 in 202.3.65.0 - 202.3.65.255 au 202.3.66.0 - 202.3.66.255 in 202.3.67.0 - 202.3.67.255 au 202.3.68.0 - 202.3.71.255 th -202.3.72.0 - 202.3.74.255 au -202.3.75.0 - 202.3.77.255 in -202.3.78.0 - 202.3.79.255 au -202.3.80.0 - 202.3.95.255 in +202.3.72.0 - 202.3.73.255 in +202.3.74.0 - 202.3.74.255 au +202.3.77.0 - 202.3.77.255 in +202.3.78.0 - 202.3.78.255 sg +202.3.79.0 - 202.3.79.255 au +202.3.80.0 - 202.3.95.255 nz 202.3.96.0 - 202.3.111.255 au -202.3.112.0 - 202.3.127.255 in -202.3.128.0 - 202.3.128.255 pf -202.3.129.0 - 202.3.129.255 tw +202.3.112.0 - 202.3.115.255 us +202.3.116.0 - 202.3.124.255 in +202.3.125.0 - 202.3.125.255 au +202.3.126.0 - 202.3.126.255 sg +202.3.127.0 - 202.3.127.255 in +202.3.128.0 - 202.3.129.255 cn 202.3.130.0 - 202.3.131.255 pk 202.3.132.0 - 202.3.134.255 au 202.3.135.0 - 202.3.135.255 sg @@ -121257,7 +98840,7 @@ 202.4.165.0 - 202.4.166.255 au 202.4.167.0 - 202.4.167.255 pk 202.4.168.0 - 202.4.168.255 vn -202.4.169.0 - 202.4.169.255 tw +202.4.169.0 - 202.4.169.255 in 202.4.170.0 - 202.4.171.255 id 202.4.172.0 - 202.4.172.255 in 202.4.173.0 - 202.4.173.255 bd @@ -121270,11 +98853,11 @@ 202.4.181.0 - 202.4.181.255 au 202.4.182.0 - 202.4.182.255 in 202.4.183.0 - 202.4.183.255 au -202.4.184.0 - 202.4.184.255 fj +202.4.184.0 - 202.4.184.255 sg 202.4.185.0 - 202.4.186.255 id -202.4.187.0 - 202.4.187.255 hk +202.4.187.0 - 202.4.187.255 in 202.4.188.0 - 202.4.188.255 au -202.4.189.0 - 202.4.189.255 kh +202.4.189.0 - 202.4.189.255 id 202.4.190.0 - 202.4.190.255 au 202.4.191.0 - 202.4.191.255 ph 202.4.192.0 - 202.4.223.255 hk @@ -121286,29 +98869,38 @@ 202.5.4.0 - 202.5.5.255 tw 202.5.6.0 - 202.5.7.255 au 202.5.8.0 - 202.5.15.255 tw -202.5.16.0 - 202.5.31.255 hk +202.5.16.0 - 202.5.31.255 ph 202.5.32.0 - 202.5.63.255 bd 202.5.64.0 - 202.5.79.255 jp 202.5.80.0 - 202.5.95.255 th 202.5.96.0 - 202.5.127.255 au 202.5.128.0 - 202.5.159.255 pk 202.5.160.0 - 202.5.191.255 au -202.5.192.0 - 202.5.223.255 mn +202.5.192.0 - 202.5.207.255 mn +202.5.208.0 - 202.5.219.255 cn +202.5.220.0 - 202.5.223.255 jp 202.5.224.0 - 202.5.255.255 tw 202.6.0.0 - 202.6.1.255 hk 202.6.2.0 - 202.6.2.255 vn 202.6.3.0 - 202.6.4.255 au -202.6.5.0 - 202.6.7.255 nz -202.6.8.0 - 202.6.79.255 au +202.6.5.0 - 202.6.5.255 nz +202.6.6.0 - 202.6.7.255 cn +202.6.8.0 - 202.6.15.255 jp +202.6.16.0 - 202.6.31.255 th +202.6.32.0 - 202.6.65.255 au +202.6.66.0 - 202.6.67.255 cn +202.6.68.0 - 202.6.71.255 jp +202.6.72.0 - 202.6.73.255 cn +202.6.74.0 - 202.6.79.255 au 202.6.80.0 - 202.6.80.255 in 202.6.81.0 - 202.6.83.255 au -202.6.84.0 - 202.6.85.255 nz +202.6.84.0 - 202.6.84.255 nz +202.6.85.0 - 202.6.85.255 ph 202.6.86.0 - 202.6.86.255 au -202.6.87.0 - 202.6.87.255 nz -202.6.88.0 - 202.6.89.255 cn +202.6.87.0 - 202.6.89.255 cn 202.6.90.0 - 202.6.90.255 th -202.6.91.0 - 202.6.92.255 au -202.6.93.0 - 202.6.93.255 cn +202.6.91.0 - 202.6.91.255 au +202.6.92.0 - 202.6.93.255 cn 202.6.94.0 - 202.6.94.255 hk 202.6.95.0 - 202.6.95.255 kr 202.6.96.0 - 202.6.97.255 vn @@ -121316,21 +98908,22 @@ 202.6.99.0 - 202.6.99.255 in 202.6.100.0 - 202.6.101.255 th 202.6.102.0 - 202.6.102.255 sg -202.6.103.0 - 202.6.103.255 jp +202.6.103.0 - 202.6.103.255 cn 202.6.104.0 - 202.6.105.255 tw 202.6.106.0 - 202.6.106.255 au 202.6.107.0 - 202.6.107.255 th -202.6.108.0 - 202.6.108.255 au -202.6.109.0 - 202.6.110.255 nz -202.6.111.0 - 202.6.111.255 th -202.6.112.0 - 202.6.115.255 au +202.6.108.0 - 202.6.108.255 cn +202.6.109.0 - 202.6.109.255 nz +202.6.110.0 - 202.6.111.255 cn +202.6.112.0 - 202.6.113.255 au +202.6.114.0 - 202.6.114.255 cn +202.6.115.0 - 202.6.115.255 au 202.6.116.0 - 202.6.117.255 nz -202.6.118.0 - 202.6.118.255 au 202.6.119.0 - 202.6.119.255 jp 202.6.120.0 - 202.6.123.255 ki 202.6.124.0 - 202.6.159.255 au 202.6.160.0 - 202.6.175.255 sg -202.6.176.0 - 202.6.191.255 bd +202.6.176.0 - 202.6.191.255 cn 202.6.192.0 - 202.6.207.255 hk 202.6.208.0 - 202.6.239.255 id 202.6.240.0 - 202.6.243.255 sg @@ -121343,21 +98936,26 @@ 202.7.8.0 - 202.7.15.255 au 202.7.16.0 - 202.7.31.255 jp 202.7.32.0 - 202.7.51.255 nz -202.7.52.0 - 202.7.59.255 in +202.7.52.0 - 202.7.55.255 kh +202.7.56.0 - 202.7.57.255 au +202.7.58.0 - 202.7.58.255 in 202.7.60.0 - 202.7.63.255 nz 202.7.64.0 - 202.7.95.255 au 202.7.96.0 - 202.7.127.255 jp 202.7.128.0 - 202.7.143.255 hk 202.7.144.0 - 202.7.255.255 au -202.8.0.0 - 202.8.1.255 sg -202.8.2.0 - 202.8.3.255 cn -202.8.4.0 - 202.8.5.255 sg +202.8.0.0 - 202.8.0.255 cn +202.8.1.0 - 202.8.1.255 sg +202.8.2.0 - 202.8.5.255 cn 202.8.6.0 - 202.8.7.255 jp -202.8.8.0 - 202.8.13.255 nz +202.8.8.0 - 202.8.11.255 au +202.8.12.0 - 202.8.12.255 cn +202.8.13.0 - 202.8.13.255 nz 202.8.14.0 - 202.8.15.255 tw -202.8.16.0 - 202.8.24.255 au -202.8.25.0 - 202.8.25.255 th -202.8.26.0 - 202.8.27.255 jp +202.8.16.0 - 202.8.23.255 jp +202.8.24.0 - 202.8.24.255 cn +202.8.26.0 - 202.8.26.255 jp +202.8.27.0 - 202.8.27.255 ap 202.8.28.0 - 202.8.29.255 id 202.8.30.0 - 202.8.30.255 ph 202.8.31.0 - 202.8.31.255 hk @@ -121369,7 +98967,7 @@ 202.8.65.0 - 202.8.71.255 th 202.8.72.0 - 202.8.75.255 kh 202.8.76.0 - 202.8.76.255 au -202.8.77.0 - 202.8.77.255 jp +202.8.77.0 - 202.8.77.255 cn 202.8.78.0 - 202.8.79.255 th 202.8.80.0 - 202.8.83.255 jp 202.8.84.0 - 202.8.87.255 th @@ -121377,19 +98975,29 @@ 202.8.92.0 - 202.8.92.255 au 202.8.93.0 - 202.8.93.255 hk 202.8.94.0 - 202.8.95.255 sg -202.8.96.0 - 202.8.127.255 au 202.8.128.0 - 202.8.159.255 cn -202.8.160.0 - 202.8.191.255 tw -202.8.192.0 - 202.8.207.255 lk +202.8.160.0 - 202.8.191.255 kr +202.8.192.0 - 202.8.207.255 cn 202.8.208.0 - 202.8.223.255 jp 202.8.224.0 - 202.8.255.255 ph -202.9.0.0 - 202.9.39.255 au +202.9.0.0 - 202.9.31.255 au +202.9.32.0 - 202.9.32.255 cn +202.9.33.0 - 202.9.33.255 au +202.9.34.0 - 202.9.35.255 cn +202.9.36.0 - 202.9.38.255 sg +202.9.39.0 - 202.9.39.255 my 202.9.40.0 - 202.9.47.255 mn -202.9.48.0 - 202.9.65.255 au +202.9.48.0 - 202.9.49.255 cn +202.9.50.0 - 202.9.50.255 au +202.9.51.0 - 202.9.55.255 cn +202.9.56.0 - 202.9.56.255 au +202.9.57.0 - 202.9.59.255 cn +202.9.60.0 - 202.9.63.255 hk +202.9.65.0 - 202.9.65.255 au 202.9.66.0 - 202.9.67.255 sg -202.9.68.0 - 202.9.68.255 hk 202.9.69.0 - 202.9.69.255 id -202.9.70.0 - 202.9.71.255 au +202.9.70.0 - 202.9.70.255 au +202.9.71.0 - 202.9.71.255 sg 202.9.72.0 - 202.9.73.255 id 202.9.74.0 - 202.9.74.255 au 202.9.75.0 - 202.9.75.255 in @@ -121404,74 +99012,86 @@ 202.9.86.0 - 202.9.86.255 sg 202.9.87.0 - 202.9.87.255 au 202.9.88.0 - 202.9.88.255 nz -202.9.89.0 - 202.9.89.255 in -202.9.90.0 - 202.9.90.255 hk 202.9.91.0 - 202.9.93.255 in 202.9.94.0 - 202.9.95.255 au 202.9.96.0 - 202.9.111.255 my -202.9.112.0 - 202.9.207.255 in +202.9.112.0 - 202.9.115.255 au +202.9.116.0 - 202.9.119.255 nz +202.9.120.0 - 202.9.207.255 in 202.9.208.0 - 202.9.223.255 jp -202.9.224.0 - 202.9.255.255 nz -202.10.0.0 - 202.10.31.255 au +202.9.224.0 - 202.9.227.255 nz +202.9.228.0 - 202.10.31.255 au 202.10.32.0 - 202.10.63.255 id 202.10.64.0 - 202.10.79.255 cn 202.10.80.0 - 202.10.95.255 au -202.10.96.0 - 202.10.127.255 jp +202.10.96.0 - 202.10.111.255 jp +202.10.112.0 - 202.10.127.255 cn 202.10.128.0 - 202.10.255.255 au 202.11.0.0 - 202.11.255.255 jp 202.12.0.0 - 202.12.0.255 nz -202.12.1.0 - 202.12.1.255 au -202.12.2.0 - 202.12.2.255 sg +202.12.1.0 - 202.12.2.255 cn 202.12.3.0 - 202.12.3.255 nz 202.12.4.0 - 202.12.7.255 hk 202.12.8.0 - 202.12.15.255 jp 202.12.16.0 - 202.12.16.255 in -202.12.17.0 - 202.12.18.255 ph +202.12.17.0 - 202.12.18.255 cn 202.12.19.0 - 202.12.21.255 us 202.12.22.0 - 202.12.25.255 au 202.12.26.0 - 202.12.26.255 bn 202.12.27.0 - 202.12.27.255 jp 202.12.28.0 - 202.12.29.255 au 202.12.30.0 - 202.12.30.255 jp -202.12.31.0 - 202.12.69.255 au +202.12.31.0 - 202.12.63.255 au +202.12.64.0 - 202.12.67.255 jp +202.12.68.0 - 202.12.69.255 au 202.12.70.0 - 202.12.70.255 nz -202.12.71.0 - 202.12.72.255 au +202.12.71.0 - 202.12.71.255 au +202.12.72.0 - 202.12.72.255 cn 202.12.73.0 - 202.12.74.255 th 202.12.75.0 - 202.12.75.255 id -202.12.76.0 - 202.12.85.255 nz +202.12.76.0 - 202.12.79.255 tw +202.12.80.0 - 202.12.83.255 in +202.12.84.0 - 202.12.85.255 cn 202.12.86.0 - 202.12.90.255 au 202.12.91.0 - 202.12.91.255 nz 202.12.92.0 - 202.12.93.255 au 202.12.94.0 - 202.12.95.255 sg -202.12.96.0 - 202.12.96.255 nz +202.12.96.0 - 202.12.96.255 cn 202.12.97.0 - 202.12.97.255 th -202.12.98.0 - 202.12.100.255 au +202.12.98.0 - 202.12.99.255 cn +202.12.100.0 - 202.12.100.255 au 202.12.101.0 - 202.12.101.255 in 202.12.102.0 - 202.12.102.255 au 202.12.103.0 - 202.12.103.255 in 202.12.104.0 - 202.12.105.255 nz -202.12.106.0 - 202.12.107.255 au +202.12.106.0 - 202.12.106.255 cn +202.12.107.0 - 202.12.107.255 au 202.12.108.0 - 202.12.108.255 nz -202.12.109.0 - 202.12.115.255 au -202.12.116.0 - 202.12.118.255 th +202.12.109.0 - 202.12.110.255 au +202.12.111.0 - 202.12.111.255 cn +202.12.112.0 - 202.12.115.255 au +202.12.116.0 - 202.12.116.255 cn +202.12.117.0 - 202.12.118.255 th 202.12.119.0 - 202.12.121.255 au -202.12.122.0 - 202.12.124.255 nz 202.12.125.0 - 202.12.126.255 au 202.12.127.0 - 202.12.127.255 us -202.12.128.0 - 202.12.242.255 au -202.12.243.0 - 202.12.247.255 jp +202.12.128.0 - 202.12.243.255 au +202.12.244.0 - 202.12.247.255 jp 202.12.248.0 - 202.12.255.255 nz 202.13.0.0 - 202.13.255.255 jp -202.14.0.0 - 202.14.7.255 au -202.14.8.0 - 202.14.15.255 tw +202.14.0.0 - 202.14.3.255 au +202.14.4.0 - 202.14.7.255 hk +202.14.8.0 - 202.14.15.255 sg 202.14.16.0 - 202.14.63.255 nz -202.14.64.0 - 202.14.66.255 au -202.14.67.0 - 202.14.68.255 hk -202.14.69.0 - 202.14.69.255 in +202.14.64.0 - 202.14.65.255 cn +202.14.66.0 - 202.14.66.255 au +202.14.67.0 - 202.14.68.255 jp +202.14.69.0 - 202.14.69.255 cn 202.14.70.0 - 202.14.71.255 pk 202.14.72.0 - 202.14.72.255 in -202.14.73.0 - 202.14.75.255 nz -202.14.76.0 - 202.14.79.255 au +202.14.73.0 - 202.14.76.255 cn +202.14.77.0 - 202.14.77.255 au +202.14.78.0 - 202.14.79.255 cn 202.14.80.0 - 202.14.80.255 hk 202.14.81.0 - 202.14.81.255 au 202.14.82.0 - 202.14.84.255 nz @@ -121481,111 +99101,149 @@ 202.14.90.0 - 202.14.91.255 kr 202.14.92.0 - 202.14.93.255 id 202.14.94.0 - 202.14.95.255 au -202.14.96.0 - 202.14.97.255 nz +202.14.96.0 - 202.14.96.255 nz +202.14.97.0 - 202.14.97.255 cn 202.14.98.0 - 202.14.98.255 au 202.14.99.0 - 202.14.100.255 nz 202.14.101.0 - 202.14.101.255 au 202.14.102.0 - 202.14.102.255 nz 202.14.103.0 - 202.14.103.255 kr -202.14.104.0 - 202.14.105.255 au -202.14.106.0 - 202.14.109.255 nz -202.14.110.0 - 202.14.113.255 au -202.14.114.0 - 202.14.115.255 nz -202.14.116.0 - 202.14.116.255 hk +202.14.104.0 - 202.14.105.255 cn +202.14.106.0 - 202.14.107.255 nz +202.14.108.0 - 202.14.109.255 cn +202.14.110.0 - 202.14.110.255 au +202.14.111.0 - 202.14.111.255 cn +202.14.112.0 - 202.14.113.255 au +202.14.114.0 - 202.14.115.255 cn +202.14.116.0 - 202.14.116.255 au 202.14.117.0 - 202.14.117.255 th -202.14.118.0 - 202.14.126.255 au -202.14.127.0 - 202.14.127.255 nz -202.14.128.0 - 202.14.134.255 au -202.14.135.0 - 202.14.136.255 nz +202.14.118.0 - 202.14.119.255 cn +202.14.120.0 - 202.14.123.255 in +202.14.124.0 - 202.14.125.255 cn +202.14.126.0 - 202.14.126.255 au +202.14.127.0 - 202.14.127.255 cn +202.14.128.0 - 202.14.128.255 au +202.14.129.0 - 202.14.129.255 cn +202.14.130.0 - 202.14.134.255 au +202.14.135.0 - 202.14.136.255 cn 202.14.137.0 - 202.14.139.255 au 202.14.140.0 - 202.14.142.255 nz 202.14.143.0 - 202.14.148.255 au -202.14.149.0 - 202.14.149.255 nz -202.14.150.0 - 202.14.152.255 au +202.14.149.0 - 202.14.149.255 cn +202.14.150.0 - 202.14.150.255 au +202.14.151.0 - 202.14.151.255 cn +202.14.152.0 - 202.14.152.255 au 202.14.153.0 - 202.14.154.255 sg -202.14.155.0 - 202.14.161.255 au -202.14.162.0 - 202.14.164.255 th +202.14.155.0 - 202.14.156.255 au +202.14.157.0 - 202.14.159.255 cn +202.14.160.0 - 202.14.163.255 in +202.14.164.0 - 202.14.164.255 th 202.14.165.0 - 202.14.165.255 kr 202.14.166.0 - 202.14.166.255 au 202.14.167.0 - 202.14.168.255 nz -202.14.169.0 - 202.14.212.255 au +202.14.169.0 - 202.14.176.255 cn +202.14.177.0 - 202.14.183.255 au +202.14.184.0 - 202.14.185.255 cn +202.14.186.0 - 202.14.186.255 au +202.14.188.0 - 202.14.199.255 au +202.14.200.0 - 202.14.207.255 sg +202.14.208.0 - 202.14.209.255 cn +202.14.210.0 - 202.14.212.255 au 202.14.213.0 - 202.14.213.255 cn 202.14.214.0 - 202.14.215.255 au 202.14.216.0 - 202.14.218.255 nz -202.14.219.0 - 202.14.221.255 au -202.14.222.0 - 202.14.222.255 hk -202.14.223.0 - 202.14.223.255 au -202.14.224.0 - 202.14.224.255 in -202.14.225.0 - 202.14.228.255 nz -202.14.229.0 - 202.14.234.255 au -202.14.235.0 - 202.14.238.255 cn -202.14.239.0 - 202.14.251.255 au +202.14.219.0 - 202.14.220.255 cn +202.14.221.0 - 202.14.221.255 au +202.14.222.0 - 202.14.227.255 cn +202.14.228.0 - 202.14.228.255 nz +202.14.229.0 - 202.14.230.255 au +202.14.231.0 - 202.14.231.255 cn +202.14.232.0 - 202.14.234.255 au +202.14.235.0 - 202.14.239.255 cn +202.14.240.0 - 202.14.245.255 au +202.14.246.0 - 202.14.246.255 cn +202.14.247.0 - 202.14.250.255 au +202.14.251.0 - 202.14.251.255 cn 202.14.252.0 - 202.14.254.255 nz 202.14.255.0 - 202.14.255.255 id 202.15.0.0 - 202.19.255.255 jp 202.20.0.0 - 202.20.7.255 nz 202.20.8.0 - 202.20.31.255 au 202.20.32.0 - 202.20.65.255 nz -202.20.66.0 - 202.20.66.255 hk +202.20.66.0 - 202.20.66.255 cn 202.20.67.0 - 202.20.75.255 au -202.20.76.0 - 202.20.80.255 nz +202.20.76.0 - 202.20.78.255 nz +202.20.79.0 - 202.20.79.255 cn +202.20.80.0 - 202.20.80.255 nz 202.20.81.0 - 202.20.81.255 au 202.20.82.0 - 202.20.86.255 kr -202.20.87.0 - 202.20.87.255 th -202.20.88.0 - 202.20.89.255 hk -202.20.90.0 - 202.20.90.255 jp +202.20.87.0 - 202.20.90.255 cn 202.20.91.0 - 202.20.93.255 nz -202.20.94.0 - 202.20.95.255 hk +202.20.94.0 - 202.20.95.255 cn 202.20.96.0 - 202.20.97.255 nz -202.20.98.0 - 202.20.98.255 ap +202.20.98.0 - 202.20.98.255 hk 202.20.99.0 - 202.20.99.255 kr 202.20.100.0 - 202.20.101.255 hk 202.20.102.0 - 202.20.104.255 nz 202.20.105.0 - 202.20.105.255 th 202.20.106.0 - 202.20.109.255 id 202.20.110.0 - 202.20.110.255 jp -202.20.111.0 - 202.20.111.255 ap +202.20.111.0 - 202.20.111.255 hk 202.20.112.0 - 202.20.112.255 gu 202.20.113.0 - 202.20.113.255 nz -202.20.114.0 - 202.20.116.255 sg -202.20.117.0 - 202.20.118.255 hk +202.20.114.0 - 202.20.114.255 cn +202.20.115.0 - 202.20.116.255 jp +202.20.117.0 - 202.20.117.255 cn +202.20.118.0 - 202.20.118.255 hk 202.20.119.0 - 202.20.119.255 kr 202.20.120.0 - 202.20.120.255 cn 202.20.121.0 - 202.20.122.255 nz 202.20.123.0 - 202.20.124.255 jp -202.20.125.0 - 202.20.127.255 hk +202.20.125.0 - 202.20.125.255 cn +202.20.127.0 - 202.20.127.255 cn 202.20.128.0 - 202.21.7.255 kr 202.21.8.0 - 202.21.15.255 au 202.21.16.0 - 202.21.31.255 nz -202.21.32.0 - 202.21.63.255 lk -202.21.64.0 - 202.21.111.255 nz -202.21.112.0 - 202.21.127.255 jp +202.21.32.0 - 202.21.39.255 lk +202.21.40.0 - 202.21.47.255 in +202.21.48.0 - 202.21.63.255 cn +202.21.64.0 - 202.21.95.255 nz +202.21.96.0 - 202.21.127.255 mn 202.21.128.0 - 202.21.128.255 nz -202.21.129.0 - 202.21.129.255 in -202.21.130.0 - 202.21.133.255 nz +202.21.129.0 - 202.21.129.255 sg +202.21.130.0 - 202.21.130.255 nz +202.21.131.0 - 202.21.132.255 cn +202.21.133.0 - 202.21.133.255 nz 202.21.134.0 - 202.21.135.255 in 202.21.136.0 - 202.21.139.255 nz 202.21.140.0 - 202.21.140.255 th -202.21.141.0 - 202.21.143.255 nz +202.21.141.0 - 202.21.142.255 cn +202.21.143.0 - 202.21.143.255 nz 202.21.144.0 - 202.21.144.255 th -202.21.145.0 - 202.21.146.255 sg -202.21.147.0 - 202.21.147.255 in -202.21.148.0 - 202.21.148.255 my +202.21.145.0 - 202.21.146.255 jp +202.21.147.0 - 202.21.148.255 cn 202.21.149.0 - 202.21.149.255 th -202.21.150.0 - 202.21.153.255 jp -202.21.154.0 - 202.21.154.255 sg -202.21.155.0 - 202.21.157.255 nz +202.21.150.0 - 202.21.154.255 cn +202.21.155.0 - 202.21.155.255 nz +202.21.156.0 - 202.21.156.255 cn +202.21.157.0 - 202.21.157.255 nz 202.21.158.0 - 202.21.159.255 sg 202.21.160.0 - 202.21.175.255 jp 202.21.176.0 - 202.21.191.255 mv -202.21.192.0 - 202.21.255.255 sg +202.21.192.0 - 202.21.194.255 sg +202.21.195.0 - 202.21.195.255 ap +202.21.196.0 - 202.21.216.255 sg +202.21.217.0 - 202.21.218.255 hk +202.21.219.0 - 202.21.255.255 sg 202.22.0.0 - 202.22.7.255 nz 202.22.8.0 - 202.22.15.255 th 202.22.16.0 - 202.22.30.255 nz 202.22.31.0 - 202.22.31.255 id 202.22.32.0 - 202.22.63.255 kr 202.22.64.0 - 202.22.127.255 jp -202.22.128.0 - 202.22.159.255 nc +202.22.128.0 - 202.22.129.255 nc +202.22.130.0 - 202.22.130.255 fr +202.22.131.0 - 202.22.159.255 nc 202.22.160.0 - 202.22.175.255 au 202.22.176.0 - 202.22.191.255 gu 202.22.192.0 - 202.22.207.255 bd @@ -121597,19 +99255,19 @@ 202.27.0.0 - 202.27.8.255 nz 202.27.9.0 - 202.27.9.255 in 202.27.10.0 - 202.27.11.255 th -202.27.12.0 - 202.27.13.255 au -202.27.14.0 - 202.27.14.255 jp -202.27.15.0 - 202.27.15.255 au +202.27.12.0 - 202.27.15.255 au 202.27.16.0 - 202.27.31.255 sg 202.27.32.0 - 202.27.90.255 nz 202.27.91.0 - 202.27.91.255 au -202.27.92.0 - 202.27.255.255 nz +202.27.92.0 - 202.27.135.255 nz +202.27.136.0 - 202.27.137.255 cn +202.27.138.0 - 202.27.255.255 nz 202.28.0.0 - 202.29.255.255 th 202.30.0.0 - 202.31.255.255 kr -202.32.0.0 - 202.35.255.255 jp -202.36.0.0 - 202.36.225.255 nz -202.36.226.0 - 202.36.226.255 au -202.36.227.0 - 202.37.73.255 nz +202.32.0.0 - 202.33.123.255 jp +202.33.124.0 - 202.33.124.255 ap +202.33.125.0 - 202.35.255.255 jp +202.36.0.0 - 202.37.73.255 nz 202.37.74.0 - 202.37.74.255 ph 202.37.75.0 - 202.37.85.255 nz 202.37.86.0 - 202.37.87.255 vn @@ -121618,64 +99276,127 @@ 202.37.121.0 - 202.37.181.255 nz 202.37.182.0 - 202.37.182.255 au 202.37.183.0 - 202.37.255.255 nz -202.38.0.0 - 202.38.15.255 cn +202.38.0.0 - 202.38.3.255 cn +202.38.4.0 - 202.38.7.255 np +202.38.8.0 - 202.38.15.255 cn 202.38.16.0 - 202.38.31.255 hk 202.38.32.0 - 202.38.47.255 sg -202.38.48.0 - 202.38.63.255 pk -202.38.64.0 - 202.38.138.255 cn +202.38.48.0 - 202.38.138.255 cn 202.38.139.0 - 202.38.139.255 au 202.38.140.0 - 202.38.143.255 cn 202.38.144.0 - 202.38.145.255 au 202.38.146.0 - 202.38.147.255 cn 202.38.148.0 - 202.38.148.255 au -202.38.149.0 - 202.38.150.255 cn -202.38.151.0 - 202.38.151.255 sg -202.38.152.0 - 202.38.156.255 cn +202.38.149.0 - 202.38.156.255 cn 202.38.157.0 - 202.38.157.255 au 202.38.158.0 - 202.38.161.255 cn 202.38.162.0 - 202.38.163.255 au -202.38.164.0 - 202.38.177.255 cn +202.38.164.0 - 202.38.171.255 cn +202.38.172.0 - 202.38.175.255 in +202.38.176.0 - 202.38.177.255 cn 202.38.178.0 - 202.38.179.255 hk 202.38.180.0 - 202.38.183.255 in 202.38.184.0 - 202.38.255.255 cn 202.39.0.0 - 202.39.255.255 tw -202.40.0.0 - 202.40.5.255 hk +202.40.0.0 - 202.40.3.255 au +202.40.4.0 - 202.40.5.255 cn 202.40.6.0 - 202.40.6.255 in -202.40.7.0 - 202.40.162.255 hk -202.40.163.0 - 202.40.163.255 au -202.40.164.0 - 202.40.171.255 hk +202.40.7.0 - 202.40.7.255 cn +202.40.8.0 - 202.40.14.255 hk +202.40.15.0 - 202.40.15.255 cn +202.40.16.0 - 202.40.31.255 hk +202.40.32.0 - 202.40.127.255 in +202.40.128.0 - 202.40.134.255 hk +202.40.135.0 - 202.40.136.255 cn +202.40.137.0 - 202.40.139.255 hk +202.40.140.0 - 202.40.140.255 cn +202.40.141.0 - 202.40.142.255 hk +202.40.143.0 - 202.40.145.255 cn +202.40.146.0 - 202.40.149.255 hk +202.40.150.0 - 202.40.150.255 cn +202.40.151.0 - 202.40.154.255 hk +202.40.155.0 - 202.40.156.255 cn +202.40.157.0 - 202.40.157.255 hk +202.40.158.0 - 202.40.159.255 cn +202.40.160.0 - 202.40.161.255 hk +202.40.162.0 - 202.40.162.255 cn +202.40.163.0 - 202.40.167.255 au +202.40.168.0 - 202.40.171.255 hk 202.40.172.0 - 202.40.175.255 ph 202.40.176.0 - 202.40.191.255 bd 202.40.192.0 - 202.40.223.255 hk 202.40.224.0 - 202.40.255.255 sg -202.41.0.0 - 202.41.13.255 in +202.41.0.0 - 202.41.7.255 in +202.41.8.0 - 202.41.9.255 cn +202.41.10.0 - 202.41.10.255 in +202.41.11.0 - 202.41.13.255 cn 202.41.14.0 - 202.41.15.255 au -202.41.16.0 - 202.41.129.255 in -202.41.130.0 - 202.41.130.255 us -202.41.131.0 - 202.41.133.255 in -202.41.134.0 - 202.41.134.255 jp -202.41.135.0 - 202.41.135.255 au -202.41.136.0 - 202.41.140.255 nz -202.41.141.0 - 202.41.141.255 sg +202.41.16.0 - 202.41.127.255 in +202.41.128.0 - 202.41.128.255 cn +202.41.129.0 - 202.41.129.255 in +202.41.130.0 - 202.41.131.255 cn +202.41.132.0 - 202.41.133.255 in +202.41.134.0 - 202.41.135.255 jp +202.41.136.0 - 202.41.141.255 nz 202.41.142.0 - 202.41.142.255 cn -202.41.143.0 - 202.41.143.255 hk -202.41.144.0 - 202.41.144.255 au -202.41.145.0 - 202.41.145.255 kr +202.41.143.0 - 202.41.143.255 nz +202.41.144.0 - 202.41.145.255 au 202.41.146.0 - 202.41.146.255 tw 202.41.147.0 - 202.41.147.255 ph 202.41.148.0 - 202.41.151.255 in 202.41.152.0 - 202.41.159.255 cn 202.41.160.0 - 202.41.191.255 th -202.41.192.0 - 202.41.192.255 in +202.41.192.0 - 202.41.192.255 cn 202.41.193.0 - 202.41.195.255 au -202.41.200.0 - 202.41.203.255 jp +202.41.196.0 - 202.41.203.255 cn 202.41.204.0 - 202.41.207.255 in 202.41.208.0 - 202.41.223.255 jp -202.41.224.0 - 202.41.235.191 in -202.41.235.192 - 202.41.235.223 sg -202.41.235.224 - 202.41.239.255 in +202.41.224.0 - 202.41.239.255 in 202.41.240.0 - 202.41.255.255 cn -202.42.0.0 - 202.42.255.255 sg +202.42.0.0 - 202.42.9.27 jp +202.42.9.28 - 202.42.9.31 sg +202.42.9.32 - 202.42.12.191 jp +202.42.12.192 - 202.42.12.255 sg +202.42.13.0 - 202.42.31.255 jp +202.42.32.0 - 202.42.59.255 sg +202.42.60.0 - 202.42.64.255 jp +202.42.65.0 - 202.42.65.255 ap +202.42.66.0 - 202.42.66.255 jp +202.42.67.0 - 202.42.70.255 sg +202.42.71.0 - 202.42.95.255 jp +202.42.96.0 - 202.42.103.255 sg +202.42.104.0 - 202.42.127.255 jp +202.42.128.0 - 202.42.135.255 sg +202.42.136.0 - 202.42.136.159 jp +202.42.136.160 - 202.42.136.191 sg +202.42.136.192 - 202.42.140.128 jp +202.42.140.129 - 202.42.140.129 sg +202.42.140.130 - 202.42.140.255 jp +202.42.141.0 - 202.42.161.255 sg +202.42.162.0 - 202.42.164.255 jp +202.42.165.0 - 202.42.166.255 sg +202.42.167.0 - 202.42.169.255 jp +202.42.170.0 - 202.42.176.255 sg +202.42.177.0 - 202.42.178.215 jp +202.42.178.216 - 202.42.178.223 sg +202.42.178.224 - 202.42.180.111 jp +202.42.180.112 - 202.42.180.119 sg +202.42.180.120 - 202.42.181.255 jp +202.42.182.0 - 202.42.182.255 sg +202.42.183.0 - 202.42.189.255 jp +202.42.190.0 - 202.42.211.255 sg +202.42.212.0 - 202.42.214.255 jp +202.42.215.0 - 202.42.215.255 sg +202.42.216.0 - 202.42.218.255 jp +202.42.219.0 - 202.42.221.255 sg +202.42.222.0 - 202.42.223.243 jp +202.42.223.244 - 202.42.223.247 sg +202.42.223.248 - 202.42.225.255 jp +202.42.226.0 - 202.42.233.255 sg +202.42.234.0 - 202.42.234.255 ap +202.42.235.0 - 202.42.248.255 sg +202.42.249.0 - 202.42.254.255 jp +202.42.255.0 - 202.42.255.255 sg 202.43.0.0 - 202.43.7.255 au 202.43.8.0 - 202.43.15.255 to 202.43.16.0 - 202.43.31.255 jp @@ -121692,7 +99413,6 @@ 202.43.84.0 - 202.43.87.255 au 202.43.88.0 - 202.43.89.255 id 202.43.90.0 - 202.43.90.255 in -202.43.91.0 - 202.43.91.255 au 202.43.92.0 - 202.43.95.255 id 202.43.96.0 - 202.43.99.255 jp 202.43.100.0 - 202.43.103.255 my @@ -121700,39 +99420,53 @@ 202.43.108.0 - 202.43.111.255 vn 202.43.112.0 - 202.43.117.255 id 202.43.118.0 - 202.43.119.255 pk -202.43.124.0 - 202.43.127.255 pk -202.43.128.0 - 202.43.143.255 au +202.43.120.0 - 202.43.123.255 in +202.43.124.0 - 202.43.127.255 hk +202.43.128.0 - 202.43.137.255 au +202.43.138.0 - 202.43.138.255 ap +202.43.139.0 - 202.43.143.255 au 202.43.144.0 - 202.43.159.255 cn 202.43.160.0 - 202.43.191.255 id -202.43.192.0 - 202.43.207.255 us +202.43.192.0 - 202.43.199.255 tw +202.43.200.0 - 202.43.207.255 us 202.43.208.0 - 202.43.215.255 sg 202.43.216.0 - 202.43.223.255 us 202.43.224.0 - 202.43.239.255 au 202.43.240.0 - 202.43.247.255 jp 202.43.248.0 - 202.43.255.255 id -202.44.0.0 - 202.44.55.255 th +202.44.0.0 - 202.44.15.255 th +202.44.16.0 - 202.44.31.255 cn +202.44.32.0 - 202.44.47.255 th +202.44.48.0 - 202.44.51.255 cn +202.44.52.0 - 202.44.55.255 th 202.44.56.0 - 202.44.59.255 in 202.44.60.0 - 202.44.63.255 nz -202.44.64.0 - 202.44.74.255 th +202.44.64.0 - 202.44.66.255 th +202.44.67.0 - 202.44.67.255 cn +202.44.68.0 - 202.44.73.255 th +202.44.74.0 - 202.44.74.255 cn 202.44.75.0 - 202.44.79.255 au 202.44.80.0 - 202.44.95.255 pk 202.44.96.0 - 202.44.96.255 th -202.44.97.0 - 202.44.97.255 jp 202.44.98.0 - 202.44.99.255 au 202.44.100.0 - 202.44.103.255 ph 202.44.104.0 - 202.44.111.255 bd 202.44.112.0 - 202.44.115.255 io 202.44.116.0 - 202.44.119.255 au 202.44.120.0 - 202.44.127.255 hk -202.44.128.0 - 202.44.133.255 th +202.44.128.0 - 202.44.128.255 th +202.44.129.0 - 202.44.129.255 cn +202.44.130.0 - 202.44.131.255 th +202.44.132.0 - 202.44.133.255 cn 202.44.134.0 - 202.44.134.255 au 202.44.135.0 - 202.44.136.255 th 202.44.137.0 - 202.44.137.255 vn -202.44.138.0 - 202.44.151.255 th +202.44.138.0 - 202.44.145.255 th +202.44.146.0 - 202.44.147.255 cn +202.44.148.0 - 202.44.151.255 th 202.44.152.0 - 202.44.191.255 au 202.44.192.0 - 202.44.255.255 th -202.45.0.0 - 202.45.0.255 de -202.45.1.0 - 202.45.2.255 hk +202.45.0.0 - 202.45.2.255 cn 202.45.3.0 - 202.45.3.255 au 202.45.4.0 - 202.45.5.255 hk 202.45.6.0 - 202.45.7.255 in @@ -121740,10 +99474,14 @@ 202.45.10.0 - 202.45.11.255 in 202.45.12.0 - 202.45.12.255 jp 202.45.13.0 - 202.45.13.255 au -202.45.14.0 - 202.45.95.255 hk +202.45.14.0 - 202.45.14.255 hk +202.45.15.0 - 202.45.31.255 cn +202.45.32.0 - 202.45.95.255 hk 202.45.96.0 - 202.45.127.255 au 202.45.128.0 - 202.45.128.255 hk -202.45.129.0 - 202.45.129.255 jp +202.45.129.0 - 202.45.129.179 cn +202.45.129.180 - 202.45.129.181 ap +202.45.129.182 - 202.45.129.255 cn 202.45.130.0 - 202.45.131.255 hk 202.45.132.0 - 202.45.143.255 my 202.45.144.0 - 202.45.147.255 np @@ -121753,19 +99491,19 @@ 202.45.156.0 - 202.45.157.255 pk 202.45.158.0 - 202.45.158.255 au 202.45.159.0 - 202.45.159.255 bd -202.45.160.0 - 202.45.163.127 jp -202.45.163.128 - 202.45.163.255 sg -202.45.164.0 - 202.45.175.255 jp +202.45.160.0 - 202.45.175.255 jp 202.45.176.0 - 202.45.255.255 hk -202.46.0.0 - 202.46.18.255 id +202.46.0.0 - 202.46.15.255 id +202.46.16.0 - 202.46.18.255 cn 202.46.19.0 - 202.46.19.255 in -202.46.20.0 - 202.46.21.255 id +202.46.20.0 - 202.46.21.255 cn 202.46.22.0 - 202.46.23.255 in 202.46.24.0 - 202.46.31.255 id 202.46.32.0 - 202.46.63.255 cn 202.46.64.0 - 202.46.111.255 id 202.46.112.0 - 202.46.127.255 my -202.46.128.0 - 202.46.131.255 id +202.46.128.0 - 202.46.128.255 cn +202.46.129.0 - 202.46.131.255 id 202.46.132.0 - 202.46.143.255 au 202.46.144.0 - 202.46.159.255 id 202.46.160.0 - 202.46.191.255 nz @@ -121773,8 +99511,7 @@ 202.46.224.0 - 202.46.239.255 cn 202.46.240.0 - 202.46.255.255 id 202.47.0.0 - 202.47.7.255 au -202.47.8.0 - 202.47.15.255 th -202.47.16.0 - 202.47.31.255 jp +202.47.8.0 - 202.47.31.255 jp 202.47.32.0 - 202.47.63.255 au 202.47.64.0 - 202.47.80.255 id 202.47.81.0 - 202.47.81.255 au @@ -121786,30 +99523,33 @@ 202.47.90.0 - 202.47.93.255 id 202.47.94.0 - 202.47.94.255 pk 202.47.95.0 - 202.47.95.255 au -202.47.96.0 - 202.47.111.255 kh -202.47.112.0 - 202.47.123.255 au -202.47.124.0 - 202.47.124.255 in -202.47.125.0 - 202.47.126.255 ph +202.47.96.0 - 202.47.111.255 cn +202.47.112.0 - 202.47.119.255 in +202.47.120.0 - 202.47.123.255 au +202.47.125.0 - 202.47.125.255 ph +202.47.126.0 - 202.47.126.255 cn 202.47.127.0 - 202.47.127.255 in -202.47.128.0 - 202.47.129.255 ph -202.47.130.0 - 202.47.130.255 de -202.47.131.0 - 202.47.133.255 ph +202.47.128.0 - 202.47.128.255 cn +202.47.129.0 - 202.47.129.255 ph +202.47.130.0 - 202.47.131.255 cn +202.47.132.0 - 202.47.133.255 ph 202.47.134.0 - 202.47.135.255 au -202.47.136.0 - 202.47.141.255 ph +202.47.136.0 - 202.47.139.255 jp +202.47.140.0 - 202.47.141.255 ph 202.47.142.0 - 202.47.142.255 vn 202.47.143.0 - 202.47.143.255 kr 202.47.144.0 - 202.47.159.255 gu 202.47.160.0 - 202.47.191.255 my -202.47.192.0 - 202.47.223.255 id +202.47.192.0 - 202.47.204.255 id +202.47.205.0 - 202.47.206.255 tw +202.47.207.0 - 202.47.223.255 id 202.47.224.0 - 202.47.255.255 th 202.48.0.0 - 202.48.255.255 jp 202.49.0.0 - 202.50.48.255 nz -202.50.49.0 - 202.50.49.255 us +202.50.49.0 - 202.50.49.255 ap 202.50.50.0 - 202.50.51.255 nz 202.50.52.0 - 202.50.55.255 np -202.50.56.0 - 202.50.83.255 nz -202.50.84.0 - 202.50.84.255 au -202.50.85.0 - 202.50.195.255 nz +202.50.56.0 - 202.50.195.255 nz 202.50.196.0 - 202.50.197.255 au 202.50.198.0 - 202.50.199.255 nz 202.50.200.0 - 202.50.203.255 id @@ -121826,7 +99566,7 @@ 202.51.176.0 - 202.51.191.255 bd 202.51.192.0 - 202.51.239.255 id 202.51.240.0 - 202.51.247.255 sg -202.51.248.0 - 202.51.251.255 au +202.51.248.0 - 202.51.251.255 in 202.51.252.0 - 202.51.255.255 id 202.52.0.0 - 202.52.1.255 np 202.52.2.0 - 202.52.3.255 in @@ -121834,7 +99574,6 @@ 202.52.8.0 - 202.52.15.255 id 202.52.16.0 - 202.52.31.255 jp 202.52.32.0 - 202.52.32.255 pk -202.52.34.0 - 202.52.34.255 ph 202.52.35.0 - 202.52.35.255 hk 202.52.36.0 - 202.52.37.255 au 202.52.38.0 - 202.52.38.255 jp @@ -121844,7 +99583,6 @@ 202.52.42.0 - 202.52.43.255 hk 202.52.44.0 - 202.52.44.255 in 202.52.45.0 - 202.52.46.255 au -202.52.47.0 - 202.52.47.255 hk 202.52.48.0 - 202.52.50.255 id 202.52.51.0 - 202.52.51.255 sg 202.52.52.0 - 202.52.52.255 id @@ -121855,11 +99593,7 @@ 202.52.60.0 - 202.52.60.255 au 202.52.61.0 - 202.52.61.255 my 202.52.62.0 - 202.52.63.255 in -202.52.64.0 - 202.52.96.191 sg -202.52.96.192 - 202.52.96.223 tw -202.52.96.224 - 202.52.105.127 sg -202.52.105.128 - 202.52.105.159 tw -202.52.105.160 - 202.52.127.255 sg +202.52.64.0 - 202.52.127.255 sg 202.52.128.0 - 202.52.128.255 in 202.52.129.0 - 202.52.129.255 au 202.52.130.0 - 202.52.130.255 in @@ -121872,7 +99606,6 @@ 202.52.138.0 - 202.52.139.255 bd 202.52.140.0 - 202.52.141.255 id 202.52.142.0 - 202.52.142.255 au -202.52.144.0 - 202.52.144.255 hk 202.52.145.0 - 202.52.145.255 au 202.52.146.0 - 202.52.147.255 id 202.52.148.0 - 202.52.148.255 in @@ -121884,7 +99617,6 @@ 202.52.154.0 - 202.52.154.255 jp 202.52.155.0 - 202.52.155.255 nz 202.52.156.0 - 202.52.156.255 id -202.52.157.0 - 202.52.157.255 in 202.52.158.0 - 202.52.159.255 au 202.52.160.0 - 202.52.175.255 ph 202.52.176.0 - 202.52.191.255 jp @@ -121896,14 +99628,20 @@ 202.53.32.0 - 202.53.63.255 au 202.53.64.0 - 202.53.111.255 in 202.53.112.0 - 202.53.127.255 jp -202.53.128.0 - 202.53.159.255 hk +202.53.128.0 - 202.53.133.255 hk +202.53.134.0 - 202.53.135.255 in +202.53.140.0 - 202.53.143.255 hk +202.53.144.0 - 202.53.147.255 kh +202.53.148.0 - 202.53.155.255 hk +202.53.156.0 - 202.53.159.255 mm 202.53.160.0 - 202.53.175.255 bd -202.53.176.0 - 202.53.191.255 nz -202.53.192.0 - 202.53.207.255 au +202.53.176.0 - 202.53.187.255 au +202.53.188.0 - 202.53.189.255 nz +202.53.190.0 - 202.53.207.255 au 202.53.208.0 - 202.53.223.255 jp 202.53.224.0 - 202.53.255.255 id -202.54.0.0 - 202.55.31.255 in -202.55.32.0 - 202.55.63.255 hk +202.54.0.0 - 202.54.255.255 in +202.55.0.0 - 202.55.63.255 hk 202.55.64.0 - 202.55.95.255 sg 202.55.96.0 - 202.55.111.255 nz 202.55.112.0 - 202.55.127.255 jp @@ -121915,18 +99653,10 @@ 202.55.160.0 - 202.55.175.255 id 202.55.176.0 - 202.55.191.255 mn 202.55.192.0 - 202.55.223.255 jp -202.55.224.0 - 202.55.229.95 tw -202.55.229.96 - 202.55.229.111 sg -202.55.229.112 - 202.55.229.175 tw -202.55.229.176 - 202.55.229.191 sg -202.55.229.192 - 202.55.255.255 tw +202.55.224.0 - 202.55.255.255 tw 202.56.0.0 - 202.56.3.255 in 202.56.4.0 - 202.56.7.255 bd -202.56.8.0 - 202.56.12.63 hk -202.56.12.64 - 202.56.12.79 us -202.56.12.80 - 202.56.12.95 hk -202.56.12.96 - 202.56.12.127 us -202.56.12.128 - 202.56.15.255 hk +202.56.8.0 - 202.56.15.255 hk 202.56.16.0 - 202.56.31.255 jp 202.56.32.0 - 202.56.55.255 nz 202.56.56.0 - 202.56.56.255 sg @@ -121943,17 +99673,16 @@ 202.57.0.0 - 202.57.31.255 id 202.57.32.0 - 202.57.127.255 ph 202.57.128.0 - 202.57.191.255 th -202.57.192.0 - 202.57.223.255 hk +202.57.192.0 - 202.57.207.255 cn +202.57.212.0 - 202.57.219.255 cn +202.57.220.0 - 202.57.223.255 hk 202.57.224.0 - 202.57.239.255 jp -202.57.240.0 - 202.57.255.255 cn -202.58.0.0 - 202.58.0.255 la +202.57.240.0 - 202.58.0.255 cn 202.58.1.0 - 202.58.1.255 jp 202.58.2.0 - 202.58.2.255 ph 202.58.3.0 - 202.58.3.255 au 202.58.4.0 - 202.58.7.255 jp -202.58.8.0 - 202.58.10.95 sg -202.58.10.96 - 202.58.10.111 hk -202.58.10.112 - 202.58.15.255 sg +202.58.8.0 - 202.58.15.255 sg 202.58.16.0 - 202.58.31.255 jp 202.58.32.0 - 202.58.63.255 au 202.58.64.0 - 202.58.79.255 id @@ -121961,8 +99690,9 @@ 202.58.96.0 - 202.58.99.255 kh 202.58.100.0 - 202.58.101.255 au 202.58.102.0 - 202.58.103.255 in -202.58.104.0 - 202.58.107.255 jp -202.58.108.0 - 202.58.111.255 ph +202.58.104.0 - 202.58.107.255 cn +202.58.108.0 - 202.58.111.255 bd +202.58.112.0 - 202.58.115.255 cn 202.58.116.0 - 202.58.119.255 jp 202.58.120.0 - 202.58.123.255 in 202.58.124.0 - 202.58.124.255 id @@ -121976,9 +99706,22 @@ 202.58.160.0 - 202.58.183.255 id 202.58.184.0 - 202.58.191.255 hk 202.58.192.0 - 202.58.223.255 id -202.58.224.0 - 202.58.255.255 ph -202.59.0.0 - 202.59.0.255 to -202.59.1.0 - 202.59.1.255 au +202.58.224.0 - 202.58.227.255 au +202.58.228.0 - 202.58.228.255 in +202.58.229.0 - 202.58.231.255 au +202.58.232.0 - 202.58.232.255 in +202.58.234.0 - 202.58.234.255 jp +202.58.235.0 - 202.58.235.255 au +202.58.236.0 - 202.58.237.255 ph +202.58.238.0 - 202.58.239.255 id +202.58.240.0 - 202.58.241.255 au +202.58.242.0 - 202.58.243.255 id +202.58.244.0 - 202.58.244.255 th +202.58.245.0 - 202.58.245.255 vn +202.58.246.0 - 202.58.247.255 au +202.58.248.0 - 202.58.251.255 ki +202.58.252.0 - 202.58.255.255 bd +202.59.0.0 - 202.59.0.255 cn 202.59.2.0 - 202.59.3.255 in 202.59.4.0 - 202.59.7.255 nu 202.59.8.0 - 202.59.63.255 au @@ -121991,7 +99734,9 @@ 202.59.160.0 - 202.59.175.255 id 202.59.176.0 - 202.59.191.255 jp 202.59.192.0 - 202.59.207.255 id -202.59.208.0 - 202.59.223.255 bd +202.59.208.0 - 202.59.211.255 bd +202.59.212.0 - 202.59.215.255 cn +202.59.216.0 - 202.59.223.255 kr 202.59.224.0 - 202.59.224.255 nz 202.59.225.0 - 202.59.227.255 au 202.59.228.0 - 202.59.228.255 in @@ -122000,6 +99745,7 @@ 202.59.231.0 - 202.59.231.255 in 202.59.232.0 - 202.59.233.255 cn 202.59.234.0 - 202.59.235.255 jp +202.59.236.0 - 202.59.236.255 cn 202.59.237.0 - 202.59.237.255 au 202.59.238.0 - 202.59.239.255 vn 202.59.240.0 - 202.59.243.255 au @@ -122014,14 +99760,15 @@ 202.60.0.0 - 202.60.7.255 mu 202.60.8.0 - 202.60.15.255 ph 202.60.16.0 - 202.60.47.255 jp -202.60.48.0 - 202.60.55.255 au +202.60.48.0 - 202.60.55.255 cn 202.60.56.0 - 202.60.59.255 my 202.60.60.0 - 202.60.63.255 in 202.60.64.0 - 202.60.95.255 au 202.60.96.0 - 202.60.103.255 cn 202.60.104.0 - 202.60.111.255 vn 202.60.112.0 - 202.60.127.255 cn -202.60.128.0 - 202.60.159.255 in +202.60.128.0 - 202.60.131.255 in +202.60.132.0 - 202.60.159.255 cn 202.60.160.0 - 202.60.191.255 jp 202.60.192.0 - 202.60.207.255 th 202.60.208.0 - 202.60.223.255 in @@ -122034,14 +99781,20 @@ 202.61.12.0 - 202.61.15.255 au 202.61.16.0 - 202.61.31.255 jp 202.61.32.0 - 202.61.63.255 pk -202.61.64.0 - 202.61.95.255 ph +202.61.64.0 - 202.61.67.255 ph +202.61.68.0 - 202.61.71.255 cn +202.61.72.0 - 202.61.75.255 au +202.61.76.0 - 202.61.79.255 cn +202.61.80.0 - 202.61.83.255 in +202.61.84.0 - 202.61.87.255 hk +202.61.88.0 - 202.61.91.255 cn +202.61.92.0 - 202.61.95.255 au 202.61.96.0 - 202.61.96.255 id 202.61.97.0 - 202.61.97.255 mn 202.61.98.0 - 202.61.101.255 id 202.61.102.0 - 202.61.102.255 in 202.61.103.0 - 202.61.103.255 hk 202.61.104.0 - 202.61.105.255 id -202.61.106.0 - 202.61.107.255 sg 202.61.108.0 - 202.61.108.255 ph 202.61.109.0 - 202.61.109.255 au 202.61.110.0 - 202.61.110.255 sg @@ -122052,9 +99805,8 @@ 202.61.117.0 - 202.61.117.255 in 202.61.118.0 - 202.61.118.255 ph 202.61.119.0 - 202.61.119.255 au -202.61.120.0 - 202.61.121.255 hk +202.61.120.0 - 202.61.121.255 in 202.61.122.0 - 202.61.122.255 au -202.61.123.0 - 202.61.123.255 pk 202.61.124.0 - 202.61.127.255 id 202.61.128.0 - 202.61.255.255 au 202.62.0.0 - 202.62.7.255 fj @@ -122073,29 +99825,31 @@ 202.62.244.0 - 202.62.244.255 in 202.62.245.0 - 202.62.245.255 nz 202.62.246.0 - 202.62.247.255 in -202.62.248.0 - 202.62.251.255 cn -202.62.252.0 - 202.62.252.255 in +202.62.248.0 - 202.62.252.255 cn 202.62.253.0 - 202.62.253.255 jp 202.62.254.0 - 202.62.254.255 au 202.62.255.0 - 202.62.255.255 cn 202.63.0.0 - 202.63.31.255 hk 202.63.32.0 - 202.63.79.255 au -202.63.80.0 - 202.63.95.255 pk +202.63.80.0 - 202.63.95.255 cn 202.63.96.0 - 202.63.127.255 in 202.63.128.0 - 202.63.159.255 sg -202.63.160.0 - 202.63.191.255 in +202.63.160.0 - 202.63.191.255 cn 202.63.192.0 - 202.63.223.255 pk -202.63.224.0 - 202.63.239.255 sg +202.63.224.0 - 202.63.225.255 sg +202.63.226.0 - 202.63.227.255 pk +202.63.228.0 - 202.63.239.255 sg 202.63.240.0 - 202.63.247.255 np 202.63.248.0 - 202.63.251.255 cn -202.63.252.0 - 202.63.253.255 in +202.63.252.0 - 202.63.252.255 in 202.63.254.0 - 202.63.255.255 sb -202.64.0.0 - 202.65.9.255 hk +202.64.0.0 - 202.64.255.255 hk +202.65.0.0 - 202.65.9.255 cn 202.65.10.0 - 202.65.11.255 bd 202.65.12.0 - 202.65.31.255 au 202.65.32.0 - 202.65.63.255 ck 202.65.64.0 - 202.65.95.255 au -202.65.96.0 - 202.65.111.255 hk +202.65.96.0 - 202.65.111.255 cn 202.65.112.0 - 202.65.127.255 id 202.65.128.0 - 202.65.159.255 in 202.65.160.0 - 202.65.167.255 nz @@ -122104,7 +99858,15 @@ 202.65.192.0 - 202.65.223.255 hk 202.65.224.0 - 202.65.239.255 id 202.65.240.0 - 202.65.247.255 sg -202.65.248.0 - 202.67.3.255 hk +202.65.248.0 - 202.66.159.255 hk +202.66.160.0 - 202.66.163.255 au +202.66.164.0 - 202.66.167.255 in +202.66.168.0 - 202.66.171.255 cn +202.66.172.0 - 202.66.191.255 in +202.66.192.0 - 202.66.202.255 hk +202.66.203.0 - 202.66.205.255 sg +202.66.206.0 - 202.66.255.255 hk +202.67.0.0 - 202.67.3.255 cn 202.67.4.0 - 202.67.7.255 in 202.67.8.0 - 202.67.15.255 id 202.67.16.0 - 202.67.31.255 jp @@ -122114,7 +99876,7 @@ 202.67.128.0 - 202.68.63.255 hk 202.68.64.0 - 202.68.79.255 au 202.68.80.0 - 202.68.95.255 nz -202.68.96.0 - 202.68.127.255 hk +202.68.96.0 - 202.68.127.255 au 202.68.128.0 - 202.68.159.255 in 202.68.160.0 - 202.68.175.255 au 202.68.176.0 - 202.68.191.255 sg @@ -122154,13 +99916,12 @@ 202.70.140.0 - 202.70.140.255 jp 202.70.141.0 - 202.70.143.255 au 202.70.144.0 - 202.70.159.255 pk -202.70.160.0 - 202.70.160.255 hk -202.70.161.0 - 202.70.175.255 cn +202.70.160.0 - 202.70.175.255 hk 202.70.176.0 - 202.70.191.255 jp -202.70.192.0 - 202.70.207.255 in +202.70.192.0 - 202.70.207.255 cn 202.70.208.0 - 202.70.255.255 jp -202.71.0.0 - 202.71.31.255 hk -202.71.32.0 - 202.71.47.255 kh +202.71.0.0 - 202.71.31.255 in +202.71.32.0 - 202.71.47.255 cn 202.71.48.0 - 202.71.95.255 jp 202.71.96.0 - 202.71.111.255 my 202.71.112.0 - 202.71.127.255 th @@ -122169,32 +99930,19 @@ 202.71.176.0 - 202.71.191.255 ph 202.71.192.0 - 202.72.31.255 hk 202.72.32.0 - 202.72.39.255 au -202.72.40.0 - 202.72.47.255 bd +202.72.40.0 - 202.72.47.255 cn 202.72.48.0 - 202.72.79.255 jp -202.72.80.0 - 202.72.95.255 hk -202.72.96.0 - 202.72.96.255 kh -202.72.97.0 - 202.72.97.255 bd -202.72.98.0 - 202.72.98.255 np -202.72.99.0 - 202.72.99.7 bd -202.72.99.8 - 202.72.99.255 us -202.72.100.0 - 202.72.103.255 sc +202.72.80.0 - 202.72.95.255 cn +202.72.96.0 - 202.72.98.255 us +202.72.99.0 - 202.72.99.255 mg +202.72.100.0 - 202.72.103.255 us 202.72.104.0 - 202.72.107.255 tl -202.72.108.0 - 202.72.108.255 us -202.72.109.0 - 202.72.109.15 tk -202.72.109.16 - 202.72.109.31 us -202.72.109.32 - 202.72.109.47 tk -202.72.109.48 - 202.72.109.255 us -202.72.110.0 - 202.72.110.31 sc -202.72.110.32 - 202.72.110.63 us -202.72.110.64 - 202.72.110.95 mg -202.72.110.96 - 202.72.110.127 bd -202.72.110.128 - 202.72.110.191 pk -202.72.110.192 - 202.72.110.255 us -202.72.111.0 - 202.72.111.255 kh -202.72.112.0 - 202.72.127.255 ph +202.72.108.0 - 202.72.111.255 us +202.72.112.0 - 202.72.127.255 cn 202.72.128.0 - 202.72.191.255 au 202.72.192.0 - 202.72.223.255 id -202.72.224.0 - 202.72.231.255 au +202.72.224.0 - 202.72.227.255 in +202.72.228.0 - 202.72.231.255 hk 202.72.232.0 - 202.72.239.255 bd 202.72.240.0 - 202.72.247.255 mn 202.72.248.0 - 202.72.251.255 in @@ -122205,7 +99953,7 @@ 202.73.32.0 - 202.73.63.255 sg 202.73.64.0 - 202.73.95.255 jp 202.73.96.0 - 202.73.127.255 id -202.73.128.0 - 202.73.131.255 hk +202.73.128.0 - 202.73.131.255 cn 202.73.132.0 - 202.73.135.255 kr 202.73.136.0 - 202.73.143.255 jp 202.73.144.0 - 202.73.159.255 au @@ -122213,7 +99961,8 @@ 202.73.192.0 - 202.73.207.255 nz 202.73.208.0 - 202.73.223.255 jp 202.73.224.0 - 202.73.239.255 id -202.73.240.0 - 202.74.3.255 hk +202.73.240.0 - 202.73.255.255 cn +202.74.0.0 - 202.74.3.255 hk 202.74.4.0 - 202.74.7.255 jp 202.74.8.0 - 202.74.15.255 cn 202.74.16.0 - 202.74.31.255 jp @@ -122221,10 +99970,12 @@ 202.74.33.0 - 202.74.33.255 nz 202.74.34.0 - 202.74.34.255 au 202.74.35.0 - 202.74.35.255 hk -202.74.37.0 - 202.74.37.255 sg +202.74.37.0 - 202.74.37.128 sg +202.74.37.129 - 202.74.37.129 ap +202.74.37.130 - 202.74.37.255 sg 202.74.38.0 - 202.74.39.255 nz 202.74.40.0 - 202.74.41.255 hk -202.74.42.0 - 202.74.43.255 id +202.74.43.0 - 202.74.43.255 id 202.74.44.0 - 202.74.44.255 au 202.74.45.0 - 202.74.45.255 id 202.74.46.0 - 202.74.46.255 au @@ -122237,18 +99988,26 @@ 202.74.58.0 - 202.74.59.255 vn 202.74.60.0 - 202.74.60.255 nz 202.74.61.0 - 202.74.61.255 au -202.74.62.0 - 202.74.63.255 hk +202.74.62.0 - 202.74.63.255 sg 202.74.64.0 - 202.74.71.255 au 202.74.72.0 - 202.74.79.255 id -202.74.80.0 - 202.74.127.255 hk +202.74.80.0 - 202.74.95.255 cn +202.74.96.0 - 202.74.107.255 hk +202.74.108.0 - 202.74.111.255 au +202.74.112.0 - 202.74.115.255 hk +202.74.116.0 - 202.74.119.255 sg +202.74.120.0 - 202.74.123.255 in +202.74.124.0 - 202.74.127.255 hk 202.74.128.0 - 202.74.191.255 au 202.74.192.0 - 202.74.231.255 nz -202.74.232.0 - 202.74.239.255 pk +202.74.232.0 - 202.74.235.255 cn +202.74.236.0 - 202.74.239.255 id 202.74.240.0 - 202.74.247.255 bd 202.74.248.0 - 202.74.251.255 ph 202.74.252.0 - 202.74.252.255 au 202.74.253.0 - 202.74.253.255 jp -202.74.254.0 - 202.75.3.255 hk +202.74.254.0 - 202.74.255.255 cn +202.75.0.0 - 202.75.3.255 hk 202.75.4.0 - 202.75.7.255 my 202.75.8.0 - 202.75.15.255 jp 202.75.16.0 - 202.75.31.255 id @@ -122260,17 +100019,25 @@ 202.75.192.0 - 202.75.207.255 in 202.75.208.0 - 202.75.223.255 cn 202.75.224.0 - 202.75.239.255 jp -202.75.240.0 - 202.75.247.255 my +202.75.240.0 - 202.75.247.255 sg 202.75.248.0 - 202.75.251.255 mo -202.75.252.0 - 202.76.127.255 hk +202.75.252.0 - 202.75.255.255 cn +202.76.0.0 - 202.76.127.255 hk 202.76.128.0 - 202.76.191.255 au 202.76.192.0 - 202.76.223.255 jp 202.76.224.0 - 202.76.239.255 my -202.76.240.0 - 202.76.247.255 us +202.76.240.0 - 202.76.242.255 sg +202.76.243.0 - 202.76.243.255 in +202.76.244.0 - 202.76.244.255 sg +202.76.245.0 - 202.76.245.255 my +202.76.246.0 - 202.76.247.255 sg 202.76.248.0 - 202.76.251.255 au -202.76.252.0 - 202.77.63.255 hk +202.76.252.0 - 202.76.255.255 cn +202.77.0.0 - 202.77.63.255 hk 202.77.64.0 - 202.77.79.255 id -202.77.80.0 - 202.77.95.255 au +202.77.80.0 - 202.77.87.255 cn +202.77.88.0 - 202.77.91.255 au +202.77.92.0 - 202.77.95.255 cn 202.77.96.0 - 202.77.127.255 id 202.77.128.0 - 202.77.135.255 hk 202.77.136.0 - 202.77.136.255 au @@ -122278,9 +100045,12 @@ 202.77.138.0 - 202.77.139.255 ph 202.77.140.0 - 202.77.170.47 hk 202.77.170.48 - 202.77.170.63 cn -202.77.170.64 - 202.78.7.255 hk -202.78.8.0 - 202.78.15.255 th -202.78.16.0 - 202.78.31.255 sg +202.77.170.64 - 202.77.189.255 hk +202.77.190.0 - 202.77.190.255 ap +202.77.191.0 - 202.78.7.255 hk +202.78.8.0 - 202.78.15.255 cn +202.78.16.0 - 202.78.16.255 ap +202.78.17.0 - 202.78.31.255 sg 202.78.32.0 - 202.78.47.255 au 202.78.48.0 - 202.78.63.255 sg 202.78.64.0 - 202.78.127.255 ph @@ -122302,11 +100072,15 @@ 202.79.64.0 - 202.79.127.255 sg 202.79.128.0 - 202.79.159.255 jp 202.79.160.0 - 202.79.175.255 au -202.79.176.0 - 202.79.223.255 sg -202.79.224.0 - 202.79.231.255 au +202.79.176.0 - 202.79.202.255 sg +202.79.203.0 - 202.79.203.3 ap +202.79.203.4 - 202.79.203.4 sg +202.79.203.5 - 202.79.203.255 ap +202.79.204.0 - 202.79.223.255 sg +202.79.224.0 - 202.79.231.255 cn 202.79.232.0 - 202.79.239.255 vn 202.79.240.0 - 202.79.247.255 jp -202.79.248.0 - 202.79.251.255 in +202.79.248.0 - 202.79.251.255 cn 202.79.252.0 - 202.80.31.255 hk 202.80.32.0 - 202.80.47.255 vu 202.80.48.0 - 202.80.63.255 in @@ -122317,18 +100091,13 @@ 202.80.128.0 - 202.80.143.255 hk 202.80.144.0 - 202.80.151.255 au 202.80.152.0 - 202.80.159.255 ph -202.80.160.0 - 202.80.168.255 sg -202.80.169.0 - 202.80.169.255 bd -202.80.170.0 - 202.80.170.255 sg -202.80.171.0 - 202.80.171.63 so -202.80.171.64 - 202.80.175.255 sg +202.80.160.0 - 202.80.175.255 sg 202.80.176.0 - 202.80.191.255 au -202.80.192.0 - 202.80.195.255 hk -202.80.196.0 - 202.80.207.255 cn +202.80.192.0 - 202.80.207.255 cn 202.80.208.0 - 202.80.223.255 id 202.80.224.0 - 202.80.255.255 th -202.81.0.0 - 202.81.3.255 hk -202.81.4.0 - 202.81.7.255 sg +202.81.0.0 - 202.81.3.255 cn +202.81.4.0 - 202.81.7.255 au 202.81.8.0 - 202.81.15.255 jp 202.81.16.0 - 202.81.31.255 au 202.81.32.0 - 202.81.63.255 id @@ -122336,26 +100105,35 @@ 202.81.80.0 - 202.81.95.255 jp 202.81.96.0 - 202.81.127.255 au 202.81.128.0 - 202.81.159.255 in -202.81.160.0 - 202.81.191.255 ph +202.81.160.0 - 202.81.175.255 ph +202.81.176.0 - 202.81.191.255 cn 202.81.192.0 - 202.81.207.255 in 202.81.208.0 - 202.81.223.255 au -202.81.224.0 - 202.83.15.255 hk +202.81.224.0 - 202.82.182.255 hk +202.82.183.0 - 202.82.183.255 ap +202.82.184.0 - 202.83.15.255 hk 202.83.16.0 - 202.83.63.255 in 202.83.64.0 - 202.83.95.255 au 202.83.96.0 - 202.83.111.255 sg 202.83.112.0 - 202.83.119.255 au -202.83.120.0 - 202.83.127.255 my +202.83.120.0 - 202.83.123.255 id +202.83.124.0 - 202.83.127.255 bd 202.83.128.0 - 202.83.159.255 jp 202.83.160.0 - 202.83.175.255 pk 202.83.176.0 - 202.83.183.255 au 202.83.184.0 - 202.83.191.255 jp -202.83.192.0 - 202.83.223.255 hk +202.83.192.0 - 202.83.204.255 hk +202.83.205.0 - 202.83.205.31 ap +202.83.205.32 - 202.83.223.255 hk 202.83.224.0 - 202.83.239.255 jp 202.83.240.0 - 202.83.247.255 hk 202.83.248.0 - 202.83.251.255 sg -202.83.252.0 - 202.84.17.255 hk +202.83.252.0 - 202.83.255.255 cn +202.84.0.0 - 202.84.3.255 hk +202.84.4.0 - 202.84.17.255 cn 202.84.18.0 - 202.84.19.255 jp -202.84.20.0 - 202.84.23.255 ph +202.84.20.0 - 202.84.21.255 au +202.84.23.0 - 202.84.23.255 ph 202.84.24.0 - 202.84.31.255 cn 202.84.32.0 - 202.84.47.255 bd 202.84.48.0 - 202.84.63.255 jp @@ -122363,19 +100141,14 @@ 202.84.72.0 - 202.84.79.255 kh 202.84.80.0 - 202.84.95.255 jp 202.84.96.0 - 202.84.127.255 ph -202.84.128.0 - 202.84.221.255 hk -202.84.222.0 - 202.84.223.255 a2 -202.84.224.0 - 202.84.239.255 hk -202.84.240.0 - 202.84.241.255 a2 -202.84.242.0 - 202.84.245.255 hk -202.84.246.0 - 202.84.246.255 pk -202.84.247.0 - 202.84.247.255 a2 -202.84.248.0 - 202.85.207.255 hk +202.84.128.0 - 202.84.164.255 hk +202.84.165.0 - 202.84.165.255 ap +202.84.166.0 - 202.85.207.255 hk 202.85.208.0 - 202.85.223.255 cn 202.85.224.0 - 202.85.239.255 hk 202.85.240.0 - 202.85.247.255 au 202.85.248.0 - 202.86.3.255 hk -202.86.4.0 - 202.86.7.255 in +202.86.4.0 - 202.86.7.255 au 202.86.8.0 - 202.86.15.255 kr 202.86.16.0 - 202.86.31.255 af 202.86.32.0 - 202.86.55.255 au @@ -122384,14 +100157,13 @@ 202.86.96.0 - 202.86.111.255 nz 202.86.112.0 - 202.86.119.255 au 202.86.120.0 - 202.86.127.255 jp -202.86.128.0 - 202.86.189.255 mo -202.86.190.0 - 202.86.191.255 hk +202.86.128.0 - 202.86.191.255 mo 202.86.192.0 - 202.86.207.255 ph 202.86.208.0 - 202.86.215.255 au 202.86.216.0 - 202.86.223.255 bd 202.86.224.0 - 202.86.247.255 jp 202.86.248.0 - 202.86.248.255 sg -202.86.249.0 - 202.86.249.255 pk +202.86.249.0 - 202.86.249.255 cn 202.86.250.0 - 202.86.250.255 au 202.86.251.0 - 202.86.251.255 in 202.86.252.0 - 202.86.255.255 cn @@ -122399,7 +100171,8 @@ 202.87.4.0 - 202.87.31.255 au 202.87.32.0 - 202.87.63.255 in 202.87.64.0 - 202.87.79.255 jp -202.87.80.0 - 202.87.127.255 pk +202.87.80.0 - 202.87.95.255 cn +202.87.96.0 - 202.87.127.255 my 202.87.128.0 - 202.87.159.255 nc 202.87.160.0 - 202.87.175.255 au 202.87.176.0 - 202.87.207.255 id @@ -122409,7 +100182,10 @@ 202.87.224.0 - 202.87.239.255 jp 202.87.240.0 - 202.87.255.255 id 202.88.0.0 - 202.88.31.255 hk -202.88.32.0 - 202.88.47.255 pk +202.88.32.0 - 202.88.35.255 cn +202.88.36.0 - 202.88.39.255 hk +202.88.40.0 - 202.88.43.255 bd +202.88.44.0 - 202.88.47.255 nz 202.88.48.0 - 202.88.63.255 jp 202.88.64.0 - 202.88.95.255 mp 202.88.96.0 - 202.88.127.255 hk @@ -122419,17 +100195,27 @@ 202.88.208.0 - 202.88.255.255 in 202.89.0.0 - 202.89.3.255 hk 202.89.4.0 - 202.89.7.255 nz -202.89.8.0 - 202.89.15.255 ph -202.89.16.0 - 202.89.16.255 hk +202.89.8.0 - 202.89.15.255 cn +202.89.16.0 - 202.89.16.127 hk +202.89.16.128 - 202.89.16.143 jp +202.89.16.144 - 202.89.16.159 sg +202.89.16.160 - 202.89.16.167 jp +202.89.16.168 - 202.89.16.175 sg +202.89.16.176 - 202.89.16.255 hk 202.89.17.0 - 202.89.17.255 jp 202.89.18.0 - 202.89.18.15 hk 202.89.18.16 - 202.89.18.31 jp -202.89.18.32 - 202.89.18.255 hk +202.89.18.32 - 202.89.18.39 hk +202.89.18.40 - 202.89.18.47 sg +202.89.18.48 - 202.89.18.111 hk +202.89.18.112 - 202.89.18.127 sg +202.89.18.128 - 202.89.18.255 hk 202.89.19.0 - 202.89.19.255 jp 202.89.20.0 - 202.89.20.127 sg 202.89.20.128 - 202.89.20.255 jp 202.89.21.0 - 202.89.21.255 cn -202.89.22.0 - 202.89.23.15 jp +202.89.22.0 - 202.89.22.255 ap +202.89.23.0 - 202.89.23.15 jp 202.89.23.16 - 202.89.23.23 as 202.89.23.24 - 202.89.23.191 jp 202.89.23.192 - 202.89.23.255 hk @@ -122437,62 +100223,61 @@ 202.89.32.0 - 202.89.63.255 nz 202.89.64.0 - 202.89.79.255 in 202.89.80.0 - 202.89.95.255 jp +202.89.96.0 - 202.89.99.255 cn 202.89.100.0 - 202.89.103.255 au -202.89.104.0 - 202.89.111.255 in +202.89.104.0 - 202.89.107.255 in +202.89.108.0 - 202.89.111.255 cn 202.89.112.0 - 202.89.115.255 jp 202.89.116.0 - 202.89.117.255 id -202.89.118.0 - 202.89.119.255 in +202.89.118.0 - 202.89.118.255 in 202.89.120.0 - 202.89.123.255 hk 202.89.124.0 - 202.89.127.255 kr 202.89.128.0 - 202.89.159.255 nz 202.89.160.0 - 202.89.191.255 au 202.89.192.0 - 202.89.207.255 ph 202.89.208.0 - 202.89.223.255 id -202.89.224.0 - 202.89.247.255 jp +202.89.224.0 - 202.89.231.255 jp +202.89.232.0 - 202.89.239.255 cn +202.89.240.0 - 202.89.247.255 jp 202.89.248.0 - 202.89.251.255 kr 202.89.252.0 - 202.89.255.255 hk 202.90.0.0 - 202.90.3.255 cn 202.90.4.0 - 202.90.7.255 th 202.90.8.0 - 202.90.15.255 jp -202.90.16.0 - 202.90.31.255 sg +202.90.16.0 - 202.90.31.255 cn 202.90.32.0 - 202.90.32.255 au 202.90.33.0 - 202.90.33.255 in 202.90.34.0 - 202.90.35.255 au 202.90.36.0 - 202.90.36.255 bn -202.90.37.0 - 202.90.39.255 au +202.90.38.0 - 202.90.39.255 au 202.90.40.0 - 202.90.40.255 in 202.90.41.0 - 202.90.41.255 au 202.90.42.0 - 202.90.43.255 in 202.90.44.0 - 202.90.47.255 nz 202.90.48.0 - 202.90.55.255 au -202.90.56.0 - 202.90.63.255 ph +202.90.56.0 - 202.90.63.255 nz 202.90.64.0 - 202.90.95.255 pf -202.90.96.0 - 202.90.111.255 in -202.90.112.0 - 202.90.127.255 th +202.90.96.0 - 202.90.127.255 cn 202.90.128.0 - 202.90.159.255 ph 202.90.160.0 - 202.90.175.255 au 202.90.176.0 - 202.90.191.255 jp 202.90.192.0 - 202.90.192.255 in -202.90.193.0 - 202.90.193.255 au 202.90.194.0 - 202.90.195.255 id -202.90.196.0 - 202.90.197.255 au +202.90.196.0 - 202.90.196.255 cn +202.90.197.0 - 202.90.197.255 au 202.90.198.0 - 202.90.199.255 id 202.90.200.0 - 202.90.203.255 bd 202.90.204.0 - 202.90.204.255 in -202.90.205.0 - 202.90.205.255 ph 202.90.206.0 - 202.90.207.255 au 202.90.208.0 - 202.90.223.255 jp 202.90.224.0 - 202.90.239.255 cn -202.90.240.0 - 202.90.247.255 ap +202.90.240.0 - 202.90.247.255 au 202.90.248.0 - 202.90.251.255 hk -202.90.252.0 - 202.91.3.255 cn +202.91.0.0 - 202.91.3.255 cn 202.91.4.0 - 202.91.7.255 au 202.91.8.0 - 202.91.15.255 id 202.91.16.0 - 202.91.23.255 th 202.91.24.0 - 202.91.31.255 id -202.91.32.0 - 202.91.38.255 sg -202.91.39.0 - 202.91.39.255 au -202.91.40.0 - 202.91.47.255 sg 202.91.48.0 - 202.91.63.255 jp 202.91.64.0 - 202.91.95.255 in 202.91.96.0 - 202.91.111.255 cn @@ -122506,7 +100291,7 @@ 202.91.208.0 - 202.91.223.255 jp 202.91.224.0 - 202.92.3.255 cn 202.92.4.0 - 202.92.7.255 vn -202.92.8.0 - 202.92.15.255 in +202.92.8.0 - 202.92.15.255 cn 202.92.16.0 - 202.92.31.255 pk 202.92.32.0 - 202.92.47.255 au 202.92.48.0 - 202.92.63.255 cn @@ -122547,42 +100332,41 @@ 202.94.70.0 - 202.94.70.255 sg 202.94.71.0 - 202.94.72.255 au 202.94.73.0 - 202.94.73.255 th -202.94.74.0 - 202.94.74.255 in 202.94.75.0 - 202.94.75.255 hk 202.94.76.0 - 202.94.77.255 th 202.94.78.0 - 202.94.79.255 au 202.94.80.0 - 202.94.80.255 id -202.94.81.0 - 202.94.81.255 mh 202.94.82.0 - 202.94.82.255 vn 202.94.83.0 - 202.94.85.255 id 202.94.86.0 - 202.94.86.255 jp 202.94.87.0 - 202.94.87.255 hk 202.94.88.0 - 202.94.89.255 vn -202.94.90.0 - 202.94.91.255 hk +202.94.90.0 - 202.94.91.255 th 202.94.92.0 - 202.94.95.255 cn -202.94.96.0 - 202.94.127.255 sg +202.94.96.0 - 202.94.96.255 ap +202.94.97.0 - 202.94.127.255 sg 202.94.128.0 - 202.94.159.255 jp -202.94.160.0 - 202.94.175.255 my +202.94.167.0 - 202.94.167.255 my 202.94.176.0 - 202.94.223.255 jp 202.94.224.0 - 202.94.239.255 hk 202.94.240.0 - 202.94.255.255 th 202.95.0.0 - 202.95.31.255 cn 202.95.32.0 - 202.95.63.255 jp -202.95.64.0 - 202.95.121.223 sg -202.95.121.224 - 202.95.121.239 jp -202.95.121.240 - 202.95.127.255 sg +202.95.64.0 - 202.95.75.255 sg +202.95.76.0 - 202.95.76.255 ap +202.95.77.0 - 202.95.121.255 sg +202.95.122.0 - 202.95.122.255 in +202.95.123.0 - 202.95.127.255 sg 202.95.128.0 - 202.95.159.255 id 202.95.160.0 - 202.95.191.255 jp 202.95.192.0 - 202.95.207.255 pg 202.95.208.0 - 202.95.223.255 jp 202.95.224.0 - 202.95.239.255 ph -202.95.240.0 - 202.95.247.255 au +202.95.240.0 - 202.95.247.255 cn 202.95.248.0 - 202.95.249.255 jp 202.95.250.0 - 202.95.250.255 nz 202.95.251.0 - 202.95.251.255 in -202.95.252.0 - 202.120.24.223 cn -202.120.24.224 - 202.120.24.255 sg -202.120.25.0 - 202.122.7.255 cn +202.95.252.0 - 202.122.7.255 cn 202.122.8.0 - 202.122.15.255 id 202.122.16.0 - 202.122.23.255 in 202.122.24.0 - 202.122.31.255 jp @@ -122591,16 +100375,16 @@ 202.122.48.0 - 202.122.63.255 jp 202.122.64.0 - 202.122.95.255 cn 202.122.96.0 - 202.122.111.255 hk -202.122.112.0 - 202.122.119.255 cn -202.122.120.0 - 202.122.127.255 bd -202.122.128.0 - 202.122.128.255 cn +202.122.112.0 - 202.122.128.255 cn 202.122.129.0 - 202.122.129.255 au 202.122.130.0 - 202.122.131.255 th -202.122.132.0 - 202.122.132.255 au +202.122.132.0 - 202.122.132.255 cn 202.122.133.0 - 202.122.133.255 ph 202.122.134.0 - 202.122.135.255 in 202.122.136.0 - 202.122.143.255 jp -202.122.144.0 - 202.122.159.255 my +202.122.144.0 - 202.122.149.255 my +202.122.150.0 - 202.122.150.255 ap +202.122.151.0 - 202.122.159.255 my 202.122.160.0 - 202.122.175.255 id 202.122.176.0 - 202.122.255.255 jp 202.123.0.0 - 202.123.31.255 mu @@ -122608,7 +100392,11 @@ 202.123.48.0 - 202.123.63.255 ph 202.123.64.0 - 202.123.95.255 hk 202.123.96.0 - 202.123.111.255 cn -202.123.128.0 - 202.123.159.255 gu +202.123.116.0 - 202.123.123.255 cn +202.123.124.0 - 202.123.127.255 tw +202.123.128.0 - 202.123.144.255 gu +202.123.145.0 - 202.123.145.255 mp +202.123.146.0 - 202.123.159.255 gu 202.123.160.0 - 202.123.175.255 hk 202.123.176.0 - 202.123.183.255 la 202.123.184.0 - 202.123.191.255 jp @@ -122656,30 +100444,15 @@ 202.125.104.0 - 202.125.105.255 au 202.125.106.0 - 202.125.106.255 in 202.125.107.0 - 202.125.107.255 sg -202.125.108.0 - 202.125.109.255 au +202.125.108.0 - 202.125.108.255 au 202.125.110.0 - 202.125.110.255 nz 202.125.111.0 - 202.125.111.255 au -202.125.112.0 - 202.125.159.255 pk +202.125.112.0 - 202.125.127.255 cn +202.125.128.0 - 202.125.159.255 pk 202.125.160.0 - 202.125.175.255 au 202.125.176.0 - 202.125.191.255 cn 202.125.192.0 - 202.125.255.255 hk -202.126.0.0 - 202.126.1.183 jp -202.126.1.184 - 202.126.1.191 sg -202.126.1.192 - 202.126.2.31 jp -202.126.2.32 - 202.126.2.47 sg -202.126.2.48 - 202.126.2.127 jp -202.126.2.128 - 202.126.2.143 hk -202.126.2.144 - 202.126.5.207 jp -202.126.5.208 - 202.126.5.223 hk -202.126.5.224 - 202.126.7.15 jp -202.126.7.16 - 202.126.7.23 sg -202.126.7.24 - 202.126.8.111 jp -202.126.8.112 - 202.126.8.127 sg -202.126.8.128 - 202.126.10.255 jp -202.126.11.0 - 202.126.11.23 sg -202.126.11.24 - 202.126.11.31 jp -202.126.11.32 - 202.126.11.79 sg -202.126.11.80 - 202.126.31.255 jp +202.126.0.0 - 202.126.31.255 jp 202.126.32.0 - 202.126.47.255 ph 202.126.48.0 - 202.126.63.255 hk 202.126.64.0 - 202.126.79.255 tw @@ -122688,7 +100461,9 @@ 202.126.96.0 - 202.126.111.255 au 202.126.112.0 - 202.126.119.255 kr 202.126.120.0 - 202.126.127.255 bd -202.126.128.0 - 202.126.191.255 sg +202.126.128.0 - 202.126.172.159 sg +202.126.172.160 - 202.126.172.175 in +202.126.172.176 - 202.126.191.255 sg 202.126.192.0 - 202.126.207.255 nz 202.126.208.0 - 202.126.223.255 hk 202.126.224.0 - 202.126.255.255 jp @@ -122697,7 +100472,14 @@ 202.127.12.0 - 202.127.31.255 cn 202.127.32.0 - 202.127.39.255 id 202.127.40.0 - 202.127.63.255 cn -202.127.64.0 - 202.127.79.255 hk +202.127.64.0 - 202.127.67.183 hk +202.127.67.184 - 202.127.67.187 sg +202.127.67.188 - 202.127.69.7 hk +202.127.69.8 - 202.127.69.11 jp +202.127.69.12 - 202.127.73.255 hk +202.127.74.0 - 202.127.74.39 sg +202.127.74.40 - 202.127.78.255 hk +202.127.79.0 - 202.127.79.255 th 202.127.80.0 - 202.127.95.255 jp 202.127.96.0 - 202.127.111.255 id 202.127.112.0 - 202.127.167.255 cn @@ -122720,11 +100502,15 @@ 202.128.108.0 - 202.128.109.255 nz 202.128.110.0 - 202.128.111.255 in 202.128.112.0 - 202.128.127.255 au -202.128.128.0 - 202.128.130.15 hk -202.128.130.16 - 202.128.130.31 kr -202.128.130.32 - 202.128.131.95 hk -202.128.131.96 - 202.128.131.128 kr -202.128.131.129 - 202.128.159.255 hk +202.128.128.0 - 202.128.130.63 hk +202.128.130.64 - 202.128.130.79 kr +202.128.130.80 - 202.128.130.87 hk +202.128.130.88 - 202.128.130.95 kr +202.128.130.96 - 202.128.130.127 hk +202.128.130.128 - 202.128.130.151 kr +202.128.130.152 - 202.128.130.191 hk +202.128.130.192 - 202.128.130.199 kr +202.128.130.200 - 202.128.159.255 hk 202.128.160.0 - 202.128.223.255 sg 202.128.224.0 - 202.128.255.255 hk 202.129.0.0 - 202.129.63.255 th @@ -122735,8 +100521,7 @@ 202.129.192.0 - 202.129.195.255 bd 202.129.196.0 - 202.129.203.255 in 202.129.204.0 - 202.129.207.255 th -202.129.208.0 - 202.129.208.255 nz -202.129.209.0 - 202.129.213.255 in +202.129.208.0 - 202.129.213.255 in 202.129.214.0 - 202.129.214.255 au 202.129.215.0 - 202.129.215.255 in 202.129.216.0 - 202.129.217.255 id @@ -122766,11 +100551,11 @@ 202.130.52.0 - 202.130.55.255 id 202.130.56.0 - 202.130.59.255 sg 202.130.60.0 - 202.130.63.255 jp -202.130.64.0 - 202.130.150.191 hk -202.130.150.192 - 202.130.150.223 jp -202.130.150.224 - 202.130.191.55 hk -202.130.191.56 - 202.130.191.63 tw -202.130.191.64 - 202.130.191.255 hk +202.130.64.0 - 202.130.132.255 hk +202.130.133.0 - 202.130.133.255 ap +202.130.134.0 - 202.130.155.255 hk +202.130.156.0 - 202.130.156.255 ap +202.130.157.0 - 202.130.191.255 hk 202.130.192.0 - 202.130.223.255 au 202.130.224.0 - 202.130.255.255 cn 202.131.0.0 - 202.131.7.255 mn @@ -122789,44 +100574,19 @@ 202.131.224.0 - 202.131.255.255 mn 202.132.0.0 - 202.132.255.255 tw 202.133.0.0 - 202.133.7.255 id -202.133.8.0 - 202.133.9.207 hk -202.133.9.208 - 202.133.9.223 id -202.133.9.224 - 202.133.9.239 hk -202.133.9.240 - 202.133.9.255 af -202.133.10.0 - 202.133.12.255 hk -202.133.13.0 - 202.133.13.7 bd -202.133.13.8 - 202.133.13.31 af -202.133.13.32 - 202.133.13.39 id -202.133.13.40 - 202.133.13.47 af -202.133.13.48 - 202.133.13.55 hk -202.133.13.56 - 202.133.13.63 af -202.133.13.64 - 202.133.13.95 hk -202.133.13.96 - 202.133.13.111 af -202.133.13.112 - 202.133.14.207 hk -202.133.14.208 - 202.133.14.223 bd -202.133.14.224 - 202.133.15.255 hk +202.133.8.0 - 202.133.15.255 hk 202.133.16.0 - 202.133.31.255 kr -202.133.32.0 - 202.133.47.255 pk -202.133.48.0 - 202.133.63.255 in -202.133.64.0 - 202.133.79.255 pk -202.133.80.0 - 202.133.95.255 id +202.133.32.0 - 202.133.47.255 cn +202.133.48.0 - 202.133.79.255 in +202.133.80.0 - 202.133.83.255 my +202.133.84.0 - 202.133.87.255 mm +202.133.88.0 - 202.133.91.255 bd +202.133.92.0 - 202.133.95.255 in 202.133.96.0 - 202.133.111.255 my 202.133.112.0 - 202.133.127.255 jp 202.133.128.0 - 202.133.191.255 th 202.133.192.0 - 202.133.223.255 ph -202.133.224.0 - 202.133.242.15 tw -202.133.242.16 - 202.133.242.47 hk -202.133.242.48 - 202.133.248.127 tw -202.133.248.128 - 202.133.248.143 cr -202.133.248.144 - 202.133.248.175 tw -202.133.248.176 - 202.133.248.191 cr -202.133.248.192 - 202.133.249.127 tw -202.133.249.128 - 202.133.249.143 cr -202.133.249.144 - 202.133.249.175 tw -202.133.249.176 - 202.133.249.191 cr -202.133.249.192 - 202.133.250.255 tw -202.133.251.0 - 202.133.251.15 us -202.133.251.16 - 202.133.255.255 tw +202.133.224.0 - 202.133.255.255 tw 202.134.0.0 - 202.134.7.255 id 202.134.8.0 - 202.134.15.255 bd 202.134.16.0 - 202.134.23.255 vn @@ -122839,35 +100599,37 @@ 202.134.54.0 - 202.134.54.255 vn 202.134.55.0 - 202.134.55.255 hk 202.134.56.0 - 202.134.57.255 ph -202.134.58.0 - 202.134.58.255 au +202.134.58.0 - 202.134.58.255 cn 202.134.59.0 - 202.134.59.255 in 202.134.60.0 - 202.134.127.255 hk -202.134.128.0 - 202.134.143.255 pk +202.134.128.0 - 202.134.143.255 cn 202.134.144.0 - 202.134.207.255 in -202.134.208.0 - 202.134.223.255 jp +202.134.208.0 - 202.134.223.255 cn 202.134.224.0 - 202.134.255.255 au -202.135.0.0 - 202.135.34.255 jp -202.135.35.0 - 202.135.35.255 hk -202.135.36.0 - 202.135.39.255 jp -202.135.40.0 - 202.135.40.7 hk -202.135.40.8 - 202.135.142.159 jp -202.135.142.160 - 202.135.142.191 nz -202.135.142.192 - 202.135.226.255 jp -202.135.227.0 - 202.135.227.255 hk -202.135.228.0 - 202.135.253.255 jp -202.135.254.0 - 202.135.254.255 sg -202.135.255.0 - 202.135.255.255 jp -202.136.0.0 - 202.136.31.255 sg +202.135.0.0 - 202.135.96.255 jp +202.135.97.0 - 202.135.97.255 au +202.135.98.0 - 202.135.167.255 jp +202.135.168.0 - 202.135.171.255 in +202.135.172.0 - 202.135.238.191 jp +202.135.238.192 - 202.135.238.255 in +202.135.239.0 - 202.135.248.255 jp +202.135.249.0 - 202.135.249.255 au +202.135.250.0 - 202.135.255.255 jp +202.136.0.0 - 202.136.13.255 sg +202.136.14.0 - 202.136.14.255 ap +202.136.15.0 - 202.136.31.255 sg 202.136.32.0 - 202.136.47.255 au 202.136.48.0 - 202.136.63.255 cn -202.136.64.0 - 202.136.95.255 id +202.136.64.0 - 202.136.87.255 in +202.136.88.0 - 202.136.91.255 bd +202.136.92.0 - 202.136.95.255 ph 202.136.96.0 - 202.136.111.255 au 202.136.112.0 - 202.136.159.255 kr 202.136.160.0 - 202.136.191.255 sg 202.136.192.0 - 202.136.207.255 jp 202.136.208.0 - 202.136.239.255 cn 202.136.240.0 - 202.136.247.255 la -202.136.248.0 - 202.136.251.255 in +202.136.248.0 - 202.136.251.255 cn 202.136.252.0 - 202.136.255.255 au 202.137.0.0 - 202.137.31.255 id 202.137.32.0 - 202.137.63.255 jp @@ -122894,14 +100656,17 @@ 202.138.128.0 - 202.138.191.255 ph 202.138.192.0 - 202.138.223.255 au 202.138.224.0 - 202.138.255.255 id -202.139.0.0 - 202.139.191.255 au +202.139.0.0 - 202.139.1.194 au +202.139.1.195 - 202.139.1.195 us +202.139.1.196 - 202.139.191.255 au 202.139.192.0 - 202.139.223.255 th 202.139.224.0 - 202.139.255.255 au 202.140.0.0 - 202.140.31.255 jp 202.140.32.0 - 202.140.63.255 in 202.140.64.0 - 202.140.127.255 hk -202.140.128.0 - 202.140.159.255 in -202.140.160.0 - 202.140.191.255 hk +202.140.128.0 - 202.140.139.255 in +202.140.140.0 - 202.140.159.255 cn +202.140.160.0 - 202.140.191.255 tw 202.140.192.0 - 202.140.223.255 jp 202.140.224.0 - 202.140.255.255 hk 202.141.0.0 - 202.141.159.255 in @@ -122920,13 +100685,15 @@ 202.142.224.0 - 202.142.255.255 jp 202.143.0.0 - 202.143.1.255 in 202.143.2.0 - 202.143.3.255 jp -202.143.4.0 - 202.143.7.255 in +202.143.4.0 - 202.143.7.255 cn 202.143.8.0 - 202.143.15.255 jp -202.143.16.0 - 202.143.31.255 cn -202.143.32.0 - 202.143.47.255 id -202.143.48.0 - 202.143.63.255 au +202.143.16.0 - 202.143.47.255 cn +202.143.48.0 - 202.143.55.255 au +202.143.56.0 - 202.143.63.255 cn 202.143.64.0 - 202.143.95.255 jp -202.143.96.0 - 202.143.111.255 id +202.143.96.0 - 202.143.99.255 in +202.143.100.0 - 202.143.107.255 cn +202.143.108.0 - 202.143.111.255 vn 202.143.112.0 - 202.143.127.255 pk 202.143.128.0 - 202.143.191.255 th 202.143.192.0 - 202.143.255.255 jp @@ -122943,159 +100710,49 @@ 202.146.0.0 - 202.146.5.255 id 202.146.6.0 - 202.146.15.255 au 202.146.16.0 - 202.146.23.255 jp -202.146.24.0 - 202.146.31.255 ap +202.146.24.0 - 202.146.31.255 au 202.146.32.0 - 202.146.63.255 id 202.146.64.0 - 202.146.95.255 my 202.146.96.0 - 202.146.127.255 hk 202.146.128.0 - 202.146.159.255 id -202.146.160.0 - 202.146.175.255 au +202.146.160.0 - 202.146.175.255 cn 202.146.176.0 - 202.146.183.255 id 202.146.184.0 - 202.146.185.255 ph -202.146.186.0 - 202.146.186.255 nz 202.146.187.0 - 202.146.187.255 au 202.146.188.0 - 202.146.191.255 cn -202.146.192.0 - 202.146.207.255 in +202.146.192.0 - 202.146.195.255 in +202.146.196.0 - 202.146.207.255 cn 202.146.208.0 - 202.146.215.255 au 202.146.216.0 - 202.146.223.255 hk 202.146.224.0 - 202.146.255.255 id 202.147.0.0 - 202.147.1.255 ap -202.147.2.0 - 202.147.2.79 jp -202.147.2.80 - 202.147.2.87 ap -202.147.2.88 - 202.147.2.207 jp -202.147.2.208 - 202.147.2.239 ap -202.147.2.240 - 202.147.3.191 jp -202.147.3.192 - 202.147.3.199 ap -202.147.3.200 - 202.147.4.175 jp -202.147.4.176 - 202.147.4.191 ap -202.147.4.192 - 202.147.5.255 jp -202.147.6.0 - 202.147.9.255 ap -202.147.10.0 - 202.147.10.127 kr -202.147.10.128 - 202.147.11.63 ap -202.147.11.64 - 202.147.11.95 kr -202.147.11.96 - 202.147.11.103 ap -202.147.11.104 - 202.147.11.239 kr -202.147.11.240 - 202.147.11.255 ap -202.147.12.0 - 202.147.12.95 kr -202.147.12.96 - 202.147.12.111 ap -202.147.12.112 - 202.147.12.127 kr -202.147.12.128 - 202.147.12.255 ap -202.147.13.0 - 202.147.13.31 kr -202.147.13.32 - 202.147.14.255 ap -202.147.15.0 - 202.147.15.127 kr -202.147.15.128 - 202.147.18.7 ap -202.147.18.8 - 202.147.18.95 hk -202.147.18.96 - 202.147.19.63 ap -202.147.19.64 - 202.147.19.95 hk -202.147.19.96 - 202.147.19.159 ap -202.147.19.160 - 202.147.19.239 hk -202.147.19.240 - 202.147.19.255 ap -202.147.20.0 - 202.147.20.39 hk -202.147.20.40 - 202.147.20.47 ap -202.147.20.48 - 202.147.20.191 hk -202.147.20.192 - 202.147.20.223 ap -202.147.20.224 - 202.147.20.231 hk -202.147.20.232 - 202.147.20.239 ap -202.147.20.240 - 202.147.20.255 hk -202.147.21.0 - 202.147.22.127 ap -202.147.22.128 - 202.147.22.159 hk -202.147.22.160 - 202.147.22.191 ap -202.147.22.192 - 202.147.22.255 hk -202.147.23.0 - 202.147.23.63 jp -202.147.23.64 - 202.147.23.207 hk -202.147.23.208 - 202.147.23.239 ap -202.147.23.240 - 202.147.23.255 hk -202.147.24.0 - 202.147.26.15 ap -202.147.26.16 - 202.147.26.31 ph -202.147.26.32 - 202.147.26.79 ap -202.147.26.80 - 202.147.26.87 ph -202.147.26.88 - 202.147.26.111 tw -202.147.26.112 - 202.147.26.127 ph -202.147.26.128 - 202.147.27.31 ap -202.147.27.32 - 202.147.27.47 tw -202.147.27.48 - 202.147.27.63 ap -202.147.27.64 - 202.147.27.95 tw -202.147.27.96 - 202.147.27.111 ph -202.147.27.112 - 202.147.27.143 ap -202.147.27.144 - 202.147.27.159 tw -202.147.27.160 - 202.147.28.127 ap -202.147.28.128 - 202.147.28.255 ph -202.147.29.0 - 202.147.29.31 ap -202.147.29.32 - 202.147.29.63 ph -202.147.29.64 - 202.147.29.159 ap -202.147.29.160 - 202.147.30.127 ph -202.147.30.128 - 202.147.30.143 ap -202.147.30.144 - 202.147.30.159 ph -202.147.30.160 - 202.147.30.167 tw -202.147.30.168 - 202.147.31.63 ap -202.147.31.64 - 202.147.31.95 ph -202.147.31.96 - 202.147.33.255 ap -202.147.34.0 - 202.147.34.31 sg -202.147.34.32 - 202.147.34.63 ap -202.147.34.64 - 202.147.34.79 my -202.147.34.80 - 202.147.35.255 ap -202.147.36.0 - 202.147.36.55 sg -202.147.36.56 - 202.147.36.143 ap -202.147.36.144 - 202.147.36.159 sg -202.147.36.160 - 202.147.36.255 ap -202.147.37.0 - 202.147.37.15 my -202.147.37.16 - 202.147.37.63 sg -202.147.37.64 - 202.147.37.111 ap -202.147.37.112 - 202.147.37.143 sg -202.147.37.144 - 202.147.37.159 ap -202.147.37.160 - 202.147.37.191 sg -202.147.37.192 - 202.147.37.199 ap -202.147.37.200 - 202.147.37.207 sg -202.147.37.208 - 202.147.37.223 ap -202.147.37.224 - 202.147.38.159 sg -202.147.38.160 - 202.147.39.15 ap -202.147.39.16 - 202.147.39.23 sg -202.147.39.24 - 202.147.39.39 my -202.147.39.40 - 202.147.39.47 ap -202.147.39.48 - 202.147.39.95 sg -202.147.39.96 - 202.147.39.127 ap -202.147.39.128 - 202.147.39.135 sg -202.147.39.136 - 202.147.39.159 ap -202.147.39.160 - 202.147.39.223 my -202.147.39.224 - 202.147.43.31 ap -202.147.43.32 - 202.147.43.79 au -202.147.43.80 - 202.147.43.95 nz -202.147.43.96 - 202.147.43.127 au -202.147.43.128 - 202.147.43.191 ap -202.147.43.192 - 202.147.43.207 au -202.147.43.208 - 202.147.43.223 ap -202.147.43.224 - 202.147.44.127 au -202.147.44.128 - 202.147.45.31 ap -202.147.45.32 - 202.147.45.63 au -202.147.45.64 - 202.147.45.79 ap -202.147.45.80 - 202.147.45.95 au -202.147.45.96 - 202.147.45.103 ap -202.147.45.104 - 202.147.45.127 au -202.147.45.128 - 202.147.45.255 ap -202.147.46.0 - 202.147.46.23 au -202.147.46.24 - 202.147.46.47 nz -202.147.46.48 - 202.147.46.63 au -202.147.46.64 - 202.147.46.143 ap -202.147.46.144 - 202.147.46.159 au -202.147.46.160 - 202.147.46.175 ap -202.147.46.176 - 202.147.46.183 nz -202.147.46.184 - 202.147.47.63 ap -202.147.47.64 - 202.147.47.127 au -202.147.47.128 - 202.147.47.255 ap -202.147.48.0 - 202.147.48.255 sg -202.147.49.0 - 202.147.55.255 ap -202.147.56.0 - 202.147.57.255 au -202.147.58.0 - 202.147.61.255 ap -202.147.62.0 - 202.147.62.255 tw -202.147.63.0 - 202.147.63.255 ap -202.147.64.0 - 202.147.143.255 au +202.147.2.0 - 202.147.2.15 jp +202.147.2.16 - 202.147.2.47 ap +202.147.2.48 - 202.147.2.63 jp +202.147.2.64 - 202.147.11.199 ap +202.147.11.200 - 202.147.11.207 kr +202.147.11.208 - 202.147.19.255 ap +202.147.20.0 - 202.147.20.31 hk +202.147.20.32 - 202.147.22.63 ap +202.147.22.64 - 202.147.22.127 hk +202.147.22.128 - 202.147.33.31 ap +202.147.33.32 - 202.147.33.35 my +202.147.33.36 - 202.147.36.31 ap +202.147.36.32 - 202.147.36.55 sg +202.147.36.56 - 202.147.42.255 ap +202.147.43.0 - 202.147.43.255 au +202.147.44.0 - 202.147.47.223 ap +202.147.47.224 - 202.147.47.239 nz +202.147.47.240 - 202.147.63.255 ap +202.147.64.0 - 202.147.95.255 in +202.147.96.0 - 202.147.143.255 au 202.147.144.0 - 202.147.159.255 cn 202.147.160.0 - 202.147.191.255 pk 202.147.192.0 - 202.147.207.255 id 202.147.208.0 - 202.147.223.255 jp 202.147.224.0 - 202.148.31.255 id 202.148.32.0 - 202.148.47.255 cn -202.148.48.0 - 202.148.55.255 au -202.148.56.0 - 202.148.63.255 bd +202.148.56.0 - 202.148.63.255 in 202.148.64.0 - 202.148.127.255 cn 202.148.128.0 - 202.148.159.255 au 202.148.160.0 - 202.148.175.255 sg @@ -123105,7 +100762,7 @@ 202.148.224.0 - 202.148.239.255 au 202.148.240.0 - 202.149.23.255 jp 202.149.24.0 - 202.149.31.255 th -202.149.32.0 - 202.149.63.255 in +202.149.32.0 - 202.149.63.255 cn 202.149.64.0 - 202.149.95.255 id 202.149.96.0 - 202.149.127.255 th 202.149.128.0 - 202.149.159.255 id @@ -123115,11 +100772,12 @@ 202.150.0.0 - 202.150.3.255 kh 202.150.4.0 - 202.150.7.255 in 202.150.8.0 - 202.150.11.255 kh -202.150.12.0 - 202.150.15.255 jp -202.150.16.0 - 202.150.31.255 cn -202.150.32.0 - 202.150.47.255 id +202.150.12.0 - 202.150.12.255 jp +202.150.13.0 - 202.150.13.255 hk +202.150.14.0 - 202.150.15.255 jp +202.150.16.0 - 202.150.47.255 cn 202.150.48.0 - 202.150.55.255 jp -202.150.56.0 - 202.150.59.255 hk +202.150.56.0 - 202.150.59.255 cn 202.150.60.0 - 202.150.63.255 au 202.150.64.0 - 202.150.95.255 id 202.150.96.0 - 202.150.127.255 nz @@ -123127,19 +100785,18 @@ 202.150.176.0 - 202.150.191.255 kr 202.150.192.0 - 202.150.207.255 cn 202.150.208.0 - 202.150.223.255 sg -202.150.224.0 - 202.151.3.255 id +202.150.224.0 - 202.151.3.255 cn 202.151.4.0 - 202.151.7.255 th 202.151.8.0 - 202.151.15.255 id 202.151.16.0 - 202.151.31.255 fj 202.151.32.0 - 202.151.32.255 au -202.151.33.0 - 202.151.33.255 hk 202.151.34.0 - 202.151.35.255 ph 202.151.36.0 - 202.151.39.255 au 202.151.40.0 - 202.151.47.255 th 202.151.48.0 - 202.151.63.255 tw 202.151.64.0 - 202.151.95.255 gu 202.151.96.0 - 202.151.127.255 jp -202.151.128.0 - 202.151.159.255 in +202.151.128.0 - 202.151.159.255 cn 202.151.160.0 - 202.151.175.255 vn 202.151.176.0 - 202.151.191.255 th 202.151.192.0 - 202.151.255.255 my @@ -123151,10 +100808,9 @@ 202.152.192.0 - 202.152.207.255 id 202.152.208.0 - 202.152.223.255 jp 202.152.224.0 - 202.152.255.255 id -202.153.0.0 - 202.153.3.255 th -202.153.4.0 - 202.153.5.255 jp +202.153.0.0 - 202.153.3.255 cn +202.153.4.0 - 202.153.5.255 tw 202.153.6.0 - 202.153.6.255 sg -202.153.7.0 - 202.153.7.255 au 202.153.8.0 - 202.153.15.255 hk 202.153.16.0 - 202.153.31.255 id 202.153.32.0 - 202.153.47.255 in @@ -123163,45 +100819,9 @@ 202.153.80.0 - 202.153.87.255 mv 202.153.88.0 - 202.153.127.255 hk 202.153.128.0 - 202.153.159.255 id -202.153.160.0 - 202.153.194.191 tw -202.153.194.192 - 202.153.194.223 cn -202.153.194.224 - 202.153.198.159 tw -202.153.198.160 - 202.153.198.175 cr -202.153.198.176 - 202.153.202.79 tw -202.153.202.80 - 202.153.202.95 cr -202.153.202.96 - 202.153.202.255 tw -202.153.203.0 - 202.153.203.31 hk -202.153.203.32 - 202.153.203.79 tw -202.153.203.80 - 202.153.203.95 hk -202.153.203.96 - 202.153.204.215 tw -202.153.204.216 - 202.153.204.223 hk -202.153.204.224 - 202.153.205.239 tw -202.153.205.240 - 202.153.205.255 cr -202.153.206.0 - 202.153.207.255 tw +202.153.160.0 - 202.153.207.255 tw 202.153.208.0 - 202.153.223.255 au -202.153.224.0 - 202.154.36.255 id -202.154.37.0 - 202.154.37.255 au -202.154.38.0 - 202.154.41.47 id -202.154.41.48 - 202.154.41.63 au -202.154.41.64 - 202.154.41.79 id -202.154.41.80 - 202.154.41.127 au -202.154.41.128 - 202.154.41.191 id -202.154.41.192 - 202.154.41.207 au -202.154.41.208 - 202.154.41.223 id -202.154.41.224 - 202.154.41.255 au -202.154.42.0 - 202.154.45.255 id -202.154.46.0 - 202.154.46.31 au -202.154.46.32 - 202.154.46.127 id -202.154.46.128 - 202.154.46.159 au -202.154.46.160 - 202.154.46.175 id -202.154.46.176 - 202.154.46.255 au -202.154.47.0 - 202.154.47.79 id -202.154.47.80 - 202.154.47.191 au -202.154.47.192 - 202.154.47.223 id -202.154.47.224 - 202.154.47.255 au -202.154.48.0 - 202.154.48.255 id -202.154.49.0 - 202.154.49.255 au -202.154.50.0 - 202.154.63.255 id +202.153.224.0 - 202.154.63.255 id 202.154.64.0 - 202.154.127.255 au 202.154.128.0 - 202.154.159.255 nz 202.154.160.0 - 202.154.175.255 in @@ -123215,12 +100835,9 @@ 202.157.0.0 - 202.157.63.255 jp 202.157.64.0 - 202.157.95.255 in 202.157.96.0 - 202.157.127.255 jp -202.157.128.0 - 202.157.175.255 sg -202.157.176.0 - 202.157.177.255 my +202.157.128.0 - 202.157.177.255 sg 202.157.178.0 - 202.157.179.255 au -202.157.180.0 - 202.157.181.255 hk -202.157.182.0 - 202.157.189.255 my -202.157.190.0 - 202.157.191.255 in +202.157.180.0 - 202.157.191.255 sg 202.157.192.0 - 202.157.223.255 cn 202.157.224.0 - 202.157.255.255 jp 202.158.0.0 - 202.158.143.255 id @@ -123228,16 +100845,14 @@ 202.158.160.0 - 202.158.191.255 cn 202.158.192.0 - 202.158.223.255 au 202.158.224.0 - 202.158.239.255 jp -202.158.240.0 - 202.158.240.255 nl +202.158.240.0 - 202.158.240.255 sg 202.158.241.0 - 202.158.241.255 au -202.158.242.0 - 202.158.242.255 jp 202.158.243.0 - 202.158.243.255 au 202.158.244.0 - 202.158.247.255 vn -202.158.248.0 - 202.158.251.255 sg 202.158.252.0 - 202.158.252.255 id 202.158.253.0 - 202.158.255.255 au 202.159.0.0 - 202.159.127.255 id -202.159.128.0 - 202.159.191.255 tw +202.159.128.0 - 202.159.191.255 au 202.159.192.0 - 202.159.255.255 in 202.160.0.0 - 202.160.47.255 bn 202.160.48.0 - 202.160.63.255 nz @@ -123246,21 +100861,23 @@ 202.160.112.0 - 202.160.119.255 nz 202.160.120.0 - 202.160.123.255 sg 202.160.124.0 - 202.160.125.255 vn -202.160.126.0 - 202.160.159.255 au +202.160.126.0 - 202.160.127.255 au +202.160.128.0 - 202.160.131.255 sg +202.160.132.0 - 202.160.135.255 in +202.160.136.0 - 202.160.139.255 id +202.160.140.0 - 202.160.143.255 cn +202.160.144.0 - 202.160.147.255 in +202.160.148.0 - 202.160.151.255 nz +202.160.152.0 - 202.160.155.255 hk +202.160.156.0 - 202.160.159.255 cn 202.160.160.0 - 202.160.175.255 in 202.160.176.0 - 202.160.191.255 cn 202.160.192.0 - 202.160.255.255 sg 202.161.0.0 - 202.161.31.255 au 202.161.32.0 - 202.161.63.255 sg 202.161.64.0 - 202.161.127.255 au -202.161.128.0 - 202.161.134.255 us -202.161.135.0 - 202.161.135.255 np -202.161.136.0 - 202.161.137.255 us -202.161.138.0 - 202.161.138.255 bd -202.161.139.0 - 202.161.151.255 us -202.161.152.0 - 202.161.152.255 bd -202.161.153.0 - 202.161.158.255 us -202.161.159.0 - 202.161.159.255 np +202.161.128.0 - 202.161.128.255 hk +202.161.129.0 - 202.161.159.255 us 202.161.160.0 - 202.161.175.255 hk 202.161.176.0 - 202.161.191.255 bd 202.161.192.0 - 202.161.255.255 jp @@ -123283,7 +100900,9 @@ 202.162.188.0 - 202.162.191.255 in 202.162.192.0 - 202.162.223.255 id 202.162.224.0 - 202.162.255.255 in -202.163.0.0 - 202.163.31.255 hk +202.163.0.0 - 202.163.1.47 hk +202.163.1.48 - 202.163.1.63 de +202.163.1.64 - 202.163.31.255 hk 202.163.32.0 - 202.163.63.255 sg 202.163.64.0 - 202.163.127.255 pk 202.163.128.0 - 202.163.159.255 kr @@ -123313,18 +100932,21 @@ 202.165.64.0 - 202.165.95.255 au 202.165.96.0 - 202.165.111.255 ap 202.165.112.0 - 202.165.119.255 jp -202.165.120.0 - 202.165.137.255 tw -202.165.138.0 - 202.165.138.7 us -202.165.138.8 - 202.165.140.7 tw -202.165.140.8 - 202.165.140.23 us -202.165.140.24 - 202.165.141.79 tw -202.165.141.80 - 202.165.141.95 us -202.165.141.96 - 202.165.159.255 tw +202.165.120.0 - 202.165.123.255 hk +202.165.124.0 - 202.165.127.255 au +202.165.128.0 - 202.165.159.255 tw 202.165.160.0 - 202.165.175.255 jp 202.165.176.0 - 202.165.191.255 cn 202.165.192.0 - 202.165.207.255 pg 202.165.208.0 - 202.165.223.255 cn -202.165.224.0 - 202.165.255.255 pk +202.165.224.0 - 202.165.238.255 pk +202.165.239.0 - 202.165.241.255 cn +202.165.242.0 - 202.165.242.255 pk +202.165.243.0 - 202.165.243.255 cn +202.165.244.0 - 202.165.244.255 pk +202.165.245.0 - 202.165.245.255 cn +202.165.246.0 - 202.165.250.255 pk +202.165.251.0 - 202.165.255.255 cn 202.166.0.0 - 202.166.159.255 sg 202.166.160.0 - 202.166.175.255 pk 202.166.176.0 - 202.166.183.255 nc @@ -123333,48 +100955,46 @@ 202.166.186.0 - 202.166.187.255 au 202.166.188.0 - 202.166.191.255 ph 202.166.192.0 - 202.166.223.255 np -202.166.224.0 - 202.166.255.255 tw -202.167.0.0 - 202.167.31.255 ap -202.167.32.0 - 202.167.40.255 us -202.167.41.0 - 202.167.41.63 au -202.167.41.64 - 202.167.100.127 us -202.167.100.128 - 202.167.100.255 hk -202.167.101.0 - 202.167.127.255 us -202.167.128.0 - 202.167.143.255 ap -202.167.144.0 - 202.167.159.111 us -202.167.159.112 - 202.167.159.127 sg -202.167.159.128 - 202.167.207.255 us +202.166.224.0 - 202.166.255.255 cn +202.167.0.0 - 202.167.14.255 hk +202.167.15.0 - 202.167.15.255 au +202.167.16.0 - 202.167.31.255 hk +202.167.32.0 - 202.167.49.255 au +202.167.50.0 - 202.167.127.255 us +202.167.128.0 - 202.167.143.255 hk +202.167.144.0 - 202.167.159.115 us +202.167.159.116 - 202.167.159.117 ap +202.167.159.118 - 202.167.162.128 us +202.167.162.129 - 202.167.162.129 sg +202.167.162.130 - 202.167.191.255 us +202.167.192.0 - 202.167.207.255 in 202.167.208.0 - 202.167.223.255 kr -202.167.224.0 - 202.167.230.255 sg -202.167.231.0 - 202.167.231.255 au -202.167.232.0 - 202.167.233.255 sg -202.167.234.0 - 202.167.235.255 hk -202.167.236.0 - 202.167.239.255 jp -202.167.240.0 - 202.167.244.63 sg -202.167.244.64 - 202.167.244.95 au -202.167.244.96 - 202.167.252.255 sg -202.167.253.0 - 202.167.253.31 au -202.167.253.32 - 202.167.255.255 sg +202.167.224.0 - 202.167.227.219 sg +202.167.227.220 - 202.167.227.223 us +202.167.227.224 - 202.167.227.231 au +202.167.227.232 - 202.167.234.255 sg +202.167.235.0 - 202.167.235.63 hk +202.167.235.64 - 202.167.243.255 sg +202.167.244.0 - 202.167.244.255 au +202.167.245.0 - 202.167.249.255 sg +202.167.250.0 - 202.167.250.255 ap +202.167.251.0 - 202.167.255.255 sg 202.168.0.0 - 202.168.63.255 au 202.168.64.0 - 202.168.79.255 my -202.168.80.0 - 202.168.87.255 au -202.168.88.0 - 202.168.91.255 in +202.168.80.0 - 202.168.83.255 cn +202.168.84.0 - 202.168.91.255 in 202.168.92.0 - 202.168.93.255 sg 202.168.94.0 - 202.168.94.255 in 202.168.95.0 - 202.168.95.255 hk -202.168.96.0 - 202.168.159.255 au +202.168.96.0 - 202.168.127.255 au +202.168.128.0 - 202.168.143.255 cn +202.168.144.0 - 202.168.147.255 in +202.168.148.0 - 202.168.151.255 hk +202.168.152.0 - 202.168.155.255 kr +202.168.156.0 - 202.168.159.255 in 202.168.160.0 - 202.168.191.255 cn 202.168.192.0 - 202.168.207.255 tw -202.168.208.0 - 202.168.210.255 hk -202.168.211.0 - 202.168.211.63 us -202.168.211.64 - 202.168.211.95 pr -202.168.211.96 - 202.168.212.31 hk -202.168.212.32 - 202.168.212.47 us -202.168.212.48 - 202.168.212.63 hk -202.168.212.64 - 202.168.212.95 mo -202.168.212.96 - 202.168.212.127 hk -202.168.212.128 - 202.168.212.255 au -202.168.213.0 - 202.168.215.255 hk +202.168.208.0 - 202.168.215.255 hk 202.168.216.0 - 202.168.223.255 jp 202.168.224.0 - 202.168.255.255 bd 202.169.0.0 - 202.169.15.255 hk @@ -123385,7 +101005,7 @@ 202.169.96.0 - 202.169.127.255 au 202.169.128.0 - 202.169.159.255 jp 202.169.160.0 - 202.169.175.255 tw -202.169.176.0 - 202.169.183.255 ap +202.169.176.0 - 202.169.183.255 au 202.169.184.0 - 202.169.191.255 jp 202.169.192.0 - 202.169.223.255 nz 202.169.224.0 - 202.169.255.255 id @@ -123398,14 +101018,14 @@ 202.170.128.0 - 202.170.159.255 cn 202.170.160.0 - 202.170.175.255 nz 202.170.176.0 - 202.170.191.255 jp -202.170.192.0 - 202.170.207.255 au +202.170.192.0 - 202.170.195.255 ca +202.170.196.0 - 202.170.199.255 au +202.170.200.0 - 202.170.207.255 in 202.170.208.0 - 202.170.215.255 jp 202.170.216.0 - 202.170.255.255 cn 202.171.0.0 - 202.171.31.255 id 202.171.32.0 - 202.171.63.255 my -202.171.64.0 - 202.171.65.127 nc -202.171.65.128 - 202.171.65.191 nz -202.171.65.192 - 202.171.79.255 nc +202.171.64.0 - 202.171.79.255 nc 202.171.80.0 - 202.171.95.255 jp 202.171.96.0 - 202.171.111.255 au 202.171.112.0 - 202.171.159.255 jp @@ -123414,7 +101034,6 @@ 202.171.208.0 - 202.171.215.255 hk 202.171.216.0 - 202.171.223.255 cn 202.171.224.0 - 202.171.231.255 jp -202.171.232.0 - 202.171.232.255 au 202.171.233.0 - 202.171.233.255 id 202.171.234.0 - 202.171.234.255 in 202.171.235.0 - 202.171.235.255 cn @@ -123423,10 +101042,10 @@ 202.171.239.0 - 202.171.239.255 in 202.171.240.0 - 202.171.247.255 pg 202.171.248.0 - 202.171.251.255 kr -202.171.252.0 - 202.172.3.255 mo +202.171.252.0 - 202.171.255.255 mo +202.172.0.0 - 202.172.3.255 cn 202.172.4.0 - 202.172.5.255 vn 202.172.6.0 - 202.172.6.255 au -202.172.7.0 - 202.172.7.255 in 202.172.8.0 - 202.172.15.255 au 202.172.16.0 - 202.172.23.255 th 202.172.24.0 - 202.172.31.255 jp @@ -123434,10 +101053,9 @@ 202.172.64.0 - 202.172.95.255 jp 202.172.96.0 - 202.172.159.255 au 202.172.160.0 - 202.172.255.255 sg -202.173.0.0 - 202.173.3.255 mo +202.173.0.0 - 202.173.3.255 cn 202.173.4.0 - 202.173.4.255 ph 202.173.5.0 - 202.173.5.255 jp -202.173.6.0 - 202.173.6.255 au 202.173.7.0 - 202.173.7.255 ph 202.173.8.0 - 202.173.15.255 cn 202.173.16.0 - 202.173.23.255 id @@ -123445,6 +101063,10 @@ 202.173.32.0 - 202.173.63.255 tw 202.173.64.0 - 202.173.95.255 id 202.173.96.0 - 202.173.111.255 jp +202.173.112.0 - 202.173.115.255 cn +202.173.116.0 - 202.173.119.255 us +202.173.120.0 - 202.173.123.255 cn +202.173.124.0 - 202.173.127.255 in 202.173.128.0 - 202.173.207.255 au 202.173.208.0 - 202.173.223.255 th 202.173.224.0 - 202.173.255.255 cn @@ -123452,11 +101074,11 @@ 202.174.4.0 - 202.174.4.255 tw 202.174.5.0 - 202.174.5.255 in 202.174.6.0 - 202.174.7.255 nz -202.174.8.0 - 202.174.15.255 ap +202.174.8.0 - 202.174.15.255 hk 202.174.16.0 - 202.174.31.255 tw 202.174.32.0 - 202.174.47.255 au 202.174.48.0 - 202.174.63.255 jp -202.174.64.0 - 202.174.79.255 sg +202.174.64.0 - 202.174.79.255 cn 202.174.80.0 - 202.174.87.255 au 202.174.88.0 - 202.174.91.255 kr 202.174.92.0 - 202.174.95.255 in @@ -123464,229 +101086,15 @@ 202.174.112.0 - 202.174.119.255 nz 202.174.120.0 - 202.174.120.255 in 202.174.121.0 - 202.174.121.255 hk -202.174.122.0 - 202.174.127.255 in -202.174.128.0 - 202.174.129.255 hk -202.174.130.0 - 202.174.131.31 my -202.174.131.32 - 202.174.131.39 hk -202.174.131.40 - 202.174.131.47 my -202.174.131.48 - 202.174.131.55 hk -202.174.131.56 - 202.174.131.87 my -202.174.131.88 - 202.174.131.95 mv -202.174.131.96 - 202.174.131.103 hk -202.174.131.104 - 202.174.131.111 kz -202.174.131.112 - 202.174.131.119 my -202.174.131.120 - 202.174.131.127 kz -202.174.131.128 - 202.174.131.135 mv -202.174.131.136 - 202.174.131.143 my -202.174.131.144 - 202.174.131.151 mv -202.174.131.152 - 202.174.131.167 my -202.174.131.168 - 202.174.131.175 hk -202.174.131.176 - 202.174.131.215 mv -202.174.131.216 - 202.174.131.223 kz -202.174.131.224 - 202.174.131.231 mv -202.174.131.232 - 202.174.131.247 my -202.174.131.248 - 202.174.131.255 hk -202.174.132.0 - 202.174.132.207 my -202.174.132.208 - 202.174.132.223 mv -202.174.132.224 - 202.174.132.239 kz -202.174.132.240 - 202.174.132.247 mv -202.174.132.248 - 202.174.133.7 hk -202.174.133.8 - 202.174.133.15 af -202.174.133.16 - 202.174.133.31 hk -202.174.133.32 - 202.174.133.47 af -202.174.133.48 - 202.174.133.63 ma -202.174.133.64 - 202.174.133.127 my -202.174.133.128 - 202.174.133.143 ma -202.174.133.144 - 202.174.133.151 af -202.174.133.152 - 202.174.133.175 ma -202.174.133.176 - 202.174.133.199 hk -202.174.133.200 - 202.174.133.207 ma -202.174.133.208 - 202.174.133.215 hk -202.174.133.216 - 202.174.133.231 ma -202.174.133.232 - 202.174.133.239 my -202.174.133.240 - 202.174.133.255 mv -202.174.134.0 - 202.174.134.7 af -202.174.134.8 - 202.174.134.39 hk -202.174.134.40 - 202.174.134.63 id -202.174.134.64 - 202.174.134.191 my -202.174.134.192 - 202.174.134.223 hk -202.174.134.224 - 202.174.134.239 id -202.174.134.240 - 202.174.134.255 kz -202.174.135.0 - 202.174.135.119 my -202.174.135.120 - 202.174.135.183 hk -202.174.135.184 - 202.174.135.191 my -202.174.135.192 - 202.174.135.207 hk -202.174.135.208 - 202.174.135.255 my -202.174.136.0 - 202.174.138.255 hk -202.174.139.0 - 202.174.139.255 np -202.174.140.0 - 202.174.141.255 bd -202.174.142.0 - 202.174.142.127 pk -202.174.142.128 - 202.174.142.191 bd -202.174.142.192 - 202.174.143.23 hk -202.174.143.24 - 202.174.143.39 my -202.174.143.40 - 202.174.143.47 hk -202.174.143.48 - 202.174.143.87 my -202.174.143.88 - 202.174.143.95 bd -202.174.143.96 - 202.174.143.103 mn -202.174.143.104 - 202.174.143.111 my -202.174.143.112 - 202.174.143.127 hk -202.174.143.128 - 202.174.143.143 my -202.174.143.144 - 202.174.143.151 hk -202.174.143.152 - 202.174.143.159 my -202.174.143.160 - 202.174.143.167 mn -202.174.143.168 - 202.174.143.175 hk -202.174.143.176 - 202.174.143.183 mn -202.174.143.184 - 202.174.143.199 id -202.174.143.200 - 202.174.143.207 hk -202.174.143.208 - 202.174.143.215 my -202.174.143.216 - 202.174.143.223 hk -202.174.143.224 - 202.174.143.255 id -202.174.144.0 - 202.174.144.7 af -202.174.144.8 - 202.174.144.15 my -202.174.144.16 - 202.174.144.23 hk -202.174.144.24 - 202.174.144.47 np -202.174.144.48 - 202.174.144.55 mn -202.174.144.56 - 202.174.144.63 id -202.174.144.64 - 202.174.144.71 my -202.174.144.72 - 202.174.144.87 id -202.174.144.88 - 202.174.144.127 my -202.174.144.128 - 202.174.144.135 hk -202.174.144.136 - 202.174.144.143 my -202.174.144.144 - 202.174.144.151 id -202.174.144.152 - 202.174.144.167 my -202.174.144.168 - 202.174.144.175 id -202.174.144.176 - 202.174.144.191 bd -202.174.144.192 - 202.174.144.199 mn -202.174.144.200 - 202.174.144.207 id -202.174.144.208 - 202.174.144.215 my -202.174.144.216 - 202.174.144.223 af -202.174.144.224 - 202.174.144.255 hk -202.174.145.0 - 202.174.145.63 lk -202.174.145.64 - 202.174.145.95 bd -202.174.145.96 - 202.174.145.127 hk -202.174.145.128 - 202.174.145.159 bd -202.174.145.160 - 202.174.146.127 hk -202.174.146.128 - 202.174.146.255 bd -202.174.147.0 - 202.174.147.255 af -202.174.148.0 - 202.174.148.31 kz -202.174.148.32 - 202.174.148.47 pk -202.174.148.48 - 202.174.148.55 af -202.174.148.56 - 202.174.148.63 id -202.174.148.64 - 202.174.148.79 bd -202.174.148.80 - 202.174.148.87 hk -202.174.148.88 - 202.174.148.95 id -202.174.148.96 - 202.174.148.127 np -202.174.148.128 - 202.174.148.135 af -202.174.148.136 - 202.174.148.143 in -202.174.148.144 - 202.174.148.159 bd -202.174.148.160 - 202.174.148.175 hk -202.174.148.176 - 202.174.148.207 id -202.174.148.208 - 202.174.148.215 hk -202.174.148.216 - 202.174.148.223 pk -202.174.148.224 - 202.174.148.239 bd -202.174.148.240 - 202.174.148.255 id -202.174.149.0 - 202.174.149.255 hk -202.174.150.0 - 202.174.150.255 pk -202.174.151.0 - 202.174.151.63 bd -202.174.151.64 - 202.174.151.127 hk -202.174.151.128 - 202.174.151.159 bd -202.174.151.160 - 202.174.151.191 kz -202.174.151.192 - 202.174.151.255 bd -202.174.152.0 - 202.174.152.63 hk -202.174.152.64 - 202.174.152.127 np -202.174.152.128 - 202.174.152.255 hk -202.174.153.0 - 202.174.153.15 np -202.174.153.16 - 202.174.153.23 mn -202.174.153.24 - 202.174.153.31 my -202.174.153.32 - 202.174.153.47 mn -202.174.153.48 - 202.174.153.63 my -202.174.153.64 - 202.174.153.71 mn -202.174.153.72 - 202.174.153.79 hk -202.174.153.80 - 202.174.153.95 my -202.174.153.96 - 202.174.153.103 bd -202.174.153.104 - 202.174.153.111 my -202.174.153.112 - 202.174.153.127 bd -202.174.153.128 - 202.174.153.135 kz -202.174.153.136 - 202.174.153.143 mn -202.174.153.144 - 202.174.153.159 my -202.174.153.160 - 202.174.153.175 bd -202.174.153.176 - 202.174.153.183 id -202.174.153.184 - 202.174.153.191 af -202.174.153.192 - 202.174.153.199 id -202.174.153.200 - 202.174.153.207 mn -202.174.153.208 - 202.174.153.231 id -202.174.153.232 - 202.174.153.239 bd -202.174.153.240 - 202.174.153.255 my -202.174.154.0 - 202.174.154.7 af -202.174.154.8 - 202.174.154.15 id -202.174.154.16 - 202.174.154.23 np -202.174.154.24 - 202.174.154.31 af -202.174.154.32 - 202.174.154.39 hk -202.174.154.40 - 202.174.154.47 id -202.174.154.48 - 202.174.154.55 hk -202.174.154.56 - 202.174.154.63 id -202.174.154.64 - 202.174.154.71 mn -202.174.154.72 - 202.174.154.95 id -202.174.154.96 - 202.174.154.111 af -202.174.154.112 - 202.174.154.119 my -202.174.154.120 - 202.174.154.127 hk -202.174.154.128 - 202.174.154.135 af -202.174.154.136 - 202.174.154.143 bd -202.174.154.144 - 202.174.154.147 id -202.174.154.148 - 202.174.154.155 hk -202.174.154.156 - 202.174.154.159 np -202.174.154.160 - 202.174.154.167 af -202.174.154.168 - 202.174.154.175 my -202.174.154.176 - 202.174.154.179 lk -202.174.154.180 - 202.174.154.187 af -202.174.154.188 - 202.174.154.199 hk -202.174.154.200 - 202.174.154.211 id -202.174.154.212 - 202.174.154.215 af -202.174.154.216 - 202.174.154.219 id -202.174.154.220 - 202.174.154.223 hk -202.174.154.224 - 202.174.154.231 mn -202.174.154.232 - 202.174.154.255 np -202.174.155.0 - 202.174.155.7 id -202.174.155.8 - 202.174.155.15 hk -202.174.155.16 - 202.174.155.31 pk -202.174.155.32 - 202.174.155.47 hk -202.174.155.48 - 202.174.155.63 id -202.174.155.64 - 202.174.155.127 hk -202.174.155.128 - 202.174.155.136 af -202.174.155.137 - 202.174.155.143 id -202.174.155.144 - 202.174.155.151 af -202.174.155.152 - 202.174.155.159 kz -202.174.155.160 - 202.174.155.167 bd -202.174.155.168 - 202.174.155.174 id -202.174.155.175 - 202.174.155.175 hk -202.174.155.176 - 202.174.155.183 id -202.174.155.184 - 202.174.155.191 my -202.174.155.192 - 202.174.155.199 id -202.174.155.200 - 202.174.155.207 hk -202.174.155.208 - 202.174.155.216 mn -202.174.155.217 - 202.174.155.223 af -202.174.155.224 - 202.174.155.232 bd -202.174.155.233 - 202.174.155.239 my -202.174.155.240 - 202.174.155.247 af -202.174.155.248 - 202.174.155.255 my -202.174.156.0 - 202.174.156.63 bd -202.174.156.64 - 202.174.156.127 af -202.174.156.128 - 202.174.156.191 vn -202.174.156.192 - 202.174.156.215 af -202.174.156.216 - 202.174.156.223 bd -202.174.156.224 - 202.174.156.231 pk -202.174.156.232 - 202.174.156.239 hk -202.174.156.240 - 202.174.156.247 id -202.174.156.248 - 202.174.156.255 af -202.174.157.0 - 202.174.157.63 pk -202.174.157.64 - 202.174.157.127 bd -202.174.157.128 - 202.174.157.191 hk -202.174.157.192 - 202.174.157.223 af -202.174.157.224 - 202.174.157.231 lk -202.174.157.232 - 202.174.157.239 af -202.174.157.240 - 202.174.157.247 lk -202.174.157.248 - 202.174.159.255 hk -202.174.160.0 - 202.174.191.255 nz +202.174.122.0 - 202.174.123.255 in +202.174.124.0 - 202.174.127.255 cn +202.174.128.0 - 202.174.135.255 hk +202.174.136.0 - 202.174.137.255 bd +202.174.138.0 - 202.174.158.255 hk +202.174.159.0 - 202.174.159.255 au +202.174.160.0 - 202.174.175.255 nz +202.174.176.0 - 202.174.176.255 au +202.174.177.0 - 202.174.191.255 nz 202.174.192.0 - 202.174.223.255 jp 202.174.224.0 - 202.174.255.255 au 202.175.0.0 - 202.175.127.255 mo @@ -123694,7 +101102,8 @@ 202.175.144.0 - 202.175.159.255 jp 202.175.160.0 - 202.175.191.255 mo 202.175.192.0 - 202.175.255.255 ph -202.176.0.0 - 202.176.7.255 au +202.176.0.0 - 202.176.3.255 in +202.176.4.0 - 202.176.7.255 my 202.176.8.0 - 202.176.11.255 jp 202.176.12.0 - 202.176.13.255 my 202.176.14.0 - 202.176.15.255 au @@ -123708,29 +101117,19 @@ 202.177.44.0 - 202.177.47.255 in 202.177.48.0 - 202.177.127.255 jp 202.177.128.0 - 202.177.191.255 in -202.177.192.0 - 202.177.196.95 sg -202.177.196.96 - 202.177.196.111 au -202.177.196.112 - 202.177.201.231 sg -202.177.201.232 - 202.177.201.239 hk -202.177.201.240 - 202.177.204.255 sg -202.177.205.0 - 202.177.205.63 hk -202.177.205.64 - 202.177.206.167 sg -202.177.206.168 - 202.177.206.175 au -202.177.206.176 - 202.177.212.255 sg -202.177.213.0 - 202.177.213.255 au -202.177.214.0 - 202.177.214.151 sg -202.177.214.152 - 202.177.214.159 au -202.177.214.160 - 202.177.214.191 sg -202.177.214.192 - 202.177.214.255 au -202.177.215.0 - 202.177.221.23 sg -202.177.221.24 - 202.177.221.31 au -202.177.221.32 - 202.177.221.127 sg -202.177.221.128 - 202.177.221.255 au -202.177.222.0 - 202.177.223.103 sg -202.177.223.104 - 202.177.223.111 au -202.177.223.112 - 202.177.223.127 sg -202.177.223.128 - 202.177.223.143 au -202.177.223.144 - 202.177.223.255 sg +202.177.192.0 - 202.177.192.255 hk +202.177.193.0 - 202.177.196.255 sg +202.177.197.0 - 202.177.197.255 au +202.177.198.0 - 202.177.199.229 sg +202.177.199.230 - 202.177.199.230 hk +202.177.199.231 - 202.177.200.111 sg +202.177.200.112 - 202.177.200.127 hk +202.177.200.128 - 202.177.205.159 sg +202.177.205.160 - 202.177.205.175 hk +202.177.205.176 - 202.177.206.169 sg +202.177.206.170 - 202.177.206.170 au +202.177.206.171 - 202.177.206.255 sg +202.177.207.0 - 202.177.223.255 au 202.177.224.0 - 202.177.255.255 in 202.178.0.0 - 202.178.79.255 my 202.178.80.0 - 202.178.111.255 jp @@ -123739,9 +101138,10 @@ 202.179.0.0 - 202.179.31.255 mn 202.179.32.0 - 202.179.63.255 jp 202.179.64.0 - 202.179.95.255 in -202.179.96.0 - 202.179.127.255 my -202.179.128.0 - 202.179.159.255 pk -202.179.160.0 - 202.179.175.255 jp +202.179.96.0 - 202.179.96.255 my +202.179.97.0 - 202.179.97.255 ap +202.179.98.0 - 202.179.127.255 my +202.179.160.0 - 202.179.175.255 cn 202.179.176.0 - 202.179.183.255 kr 202.179.184.0 - 202.179.191.255 id 202.179.192.0 - 202.179.239.255 jp @@ -123756,7 +101156,15 @@ 202.180.176.0 - 202.180.207.255 jp 202.180.208.0 - 202.180.215.255 cn 202.180.216.0 - 202.180.223.255 mn -202.180.224.0 - 202.181.95.255 au +202.180.224.0 - 202.180.255.255 au +202.181.0.0 - 202.181.3.255 hk +202.181.4.0 - 202.181.7.255 in +202.181.8.0 - 202.181.11.255 cn +202.181.12.0 - 202.181.19.255 bd +202.181.20.0 - 202.181.23.255 au +202.181.24.0 - 202.181.27.255 hk +202.181.28.0 - 202.181.31.255 cn +202.181.32.0 - 202.181.95.255 au 202.181.96.0 - 202.181.111.255 jp 202.181.112.0 - 202.181.127.255 cn 202.181.128.0 - 202.181.255.255 hk @@ -123779,7 +101187,9 @@ 202.189.64.0 - 202.189.79.255 au 202.189.80.0 - 202.189.95.255 cn 202.189.96.0 - 202.189.127.255 hk -202.189.128.0 - 202.189.143.255 kr +202.189.128.0 - 202.189.128.255 kr +202.189.129.0 - 202.189.131.255 ap +202.189.132.0 - 202.189.143.255 sg 202.189.144.0 - 202.189.159.255 jp 202.189.160.0 - 202.189.175.255 nz 202.189.176.0 - 202.189.183.255 jp @@ -123787,7 +101197,7 @@ 202.189.192.0 - 202.189.223.255 jp 202.189.224.0 - 202.189.255.255 in 202.190.0.0 - 202.190.255.255 my -202.191.0.0 - 202.191.0.255 de +202.191.0.0 - 202.191.0.255 cn 202.191.1.0 - 202.191.1.255 au 202.191.2.0 - 202.191.3.255 id 202.191.4.0 - 202.191.15.255 au @@ -123796,439 +101206,1656 @@ 202.191.48.0 - 202.191.55.255 au 202.191.56.0 - 202.191.59.255 vn 202.191.60.0 - 202.191.63.255 au -202.191.64.0 - 202.191.95.255 in +202.191.64.0 - 202.191.67.255 in +202.191.68.0 - 202.191.95.255 cn 202.191.96.0 - 202.191.111.255 au 202.191.112.0 - 202.191.119.255 jp 202.191.120.0 - 202.191.127.255 bd -202.191.128.0 - 202.191.255.255 my -202.192.0.0 - 202.192.241.255 cn -202.192.242.0 - 202.192.242.255 tw -202.192.243.0 - 202.207.255.255 cn -202.208.0.0 - 202.242.2.98 jp -202.242.2.99 - 202.242.2.99 id -202.242.2.100 - 202.242.2.110 jp -202.242.2.111 - 202.242.2.111 in -202.242.2.112 - 202.255.255.255 jp -203.0.0.0 - 203.0.80.255 au -203.0.81.0 - 203.0.82.255 cn -203.0.83.0 - 203.1.24.255 au +202.191.128.0 - 202.191.255.255 in +202.192.0.0 - 202.207.255.255 cn +202.208.0.0 - 202.212.102.255 jp +202.212.103.0 - 202.212.103.153 us +202.212.103.154 - 202.212.103.154 jp +202.212.103.155 - 202.212.103.255 us +202.212.104.0 - 202.239.233.255 jp +202.239.234.0 - 202.239.234.38 us +202.239.234.39 - 202.239.234.39 jp +202.239.234.40 - 202.239.234.255 us +202.239.235.0 - 202.255.255.255 jp +203.0.0.0 - 203.0.3.255 au +203.0.4.0 - 203.0.7.255 cn +203.0.8.0 - 203.0.9.255 au +203.0.10.0 - 203.0.11.255 cn +203.0.12.0 - 203.0.17.255 au +203.0.18.0 - 203.0.18.255 cn +203.0.19.0 - 203.0.23.255 au +203.0.24.0 - 203.0.24.255 cn +203.0.25.0 - 203.0.41.255 au +203.0.42.0 - 203.0.43.255 cn +203.0.44.0 - 203.0.44.255 au +203.0.45.0 - 203.0.47.255 cn +203.0.48.0 - 203.0.80.255 au +203.0.81.0 - 203.0.83.255 cn +203.0.84.0 - 203.0.89.255 au +203.0.90.0 - 203.0.91.255 cn +203.0.92.0 - 203.0.95.255 au +203.0.96.0 - 203.0.97.255 cn +203.0.98.0 - 203.0.103.255 au +203.0.104.0 - 203.0.111.255 cn +203.0.112.0 - 203.0.112.255 au +203.0.114.0 - 203.0.115.255 cn +203.0.116.0 - 203.0.121.255 au +203.0.122.0 - 203.0.122.255 cn +203.0.123.0 - 203.0.127.255 au +203.0.128.0 - 203.0.128.255 cn +203.0.129.0 - 203.0.129.255 au +203.0.130.0 - 203.0.135.255 cn +203.0.136.0 - 203.0.136.255 au +203.0.137.0 - 203.0.137.255 cn +203.0.138.0 - 203.0.141.255 au +203.0.142.0 - 203.0.142.255 cn +203.0.143.0 - 203.0.143.255 au +203.0.144.0 - 203.0.144.255 cn +203.0.145.0 - 203.0.145.255 au +203.0.146.0 - 203.0.146.255 cn +203.0.147.0 - 203.0.147.255 au +203.0.148.0 - 203.0.148.255 cn +203.0.149.0 - 203.0.149.255 au +203.0.150.0 - 203.0.152.255 cn +203.0.153.0 - 203.0.176.255 au +203.0.177.0 - 203.0.177.255 cn +203.0.178.0 - 203.0.223.255 au +203.0.224.0 - 203.0.224.255 cn +203.0.225.0 - 203.0.251.255 au +203.0.252.0 - 203.0.255.255 hk +203.1.0.0 - 203.1.3.255 au +203.1.4.0 - 203.1.7.255 cn +203.1.8.0 - 203.1.17.255 au +203.1.18.0 - 203.1.18.255 cn +203.1.19.0 - 203.1.24.255 au 203.1.25.0 - 203.1.25.255 id -203.1.26.0 - 203.2.111.255 au +203.1.26.0 - 203.1.27.255 cn +203.1.28.0 - 203.1.64.255 au +203.1.65.0 - 203.1.67.255 cn +203.1.68.0 - 203.1.69.255 au +203.1.70.0 - 203.1.71.255 cn +203.1.72.0 - 203.1.75.255 au +203.1.76.0 - 203.1.77.255 cn +203.1.78.0 - 203.1.89.255 au +203.1.90.0 - 203.1.90.255 cn +203.1.91.0 - 203.1.96.255 au +203.1.97.0 - 203.1.103.255 cn +203.1.104.0 - 203.1.107.255 au +203.1.108.0 - 203.1.108.255 cn +203.1.109.0 - 203.1.252.255 au +203.1.253.0 - 203.1.254.255 cn +203.1.255.0 - 203.2.63.255 au +203.2.64.0 - 203.2.71.255 cn +203.2.72.0 - 203.2.72.255 au +203.2.73.0 - 203.2.73.255 cn +203.2.74.0 - 203.2.111.255 au 203.2.112.0 - 203.2.119.255 cn -203.2.120.0 - 203.3.131.255 au -203.3.132.0 - 203.3.132.255 hk -203.3.133.0 - 203.4.135.255 au +203.2.120.0 - 203.2.125.255 au +203.2.126.0 - 203.2.127.255 cn +203.2.128.0 - 203.2.139.255 au +203.2.140.0 - 203.2.140.255 cn +203.2.141.0 - 203.2.149.255 au +203.2.150.0 - 203.2.150.255 cn +203.2.151.0 - 203.2.151.255 au +203.2.152.0 - 203.2.157.255 cn +203.2.158.0 - 203.2.159.255 au +203.2.160.0 - 203.2.167.255 cn +203.2.168.0 - 203.2.179.255 au +203.2.180.0 - 203.2.181.255 cn +203.2.182.0 - 203.2.195.255 au +203.2.196.0 - 203.2.197.255 cn +203.2.198.0 - 203.2.208.255 au +203.2.209.0 - 203.2.209.255 cn +203.2.210.0 - 203.2.213.255 au +203.2.214.0 - 203.2.215.255 cn +203.2.216.0 - 203.2.225.255 au +203.2.226.0 - 203.2.227.255 cn +203.2.228.0 - 203.2.228.255 jp +203.2.229.0 - 203.2.229.255 cn +203.2.230.0 - 203.2.235.255 au +203.2.236.0 - 203.2.237.255 cn +203.2.238.0 - 203.3.67.255 au +203.3.68.0 - 203.3.68.255 cn +203.3.69.0 - 203.3.71.255 au +203.3.72.0 - 203.3.73.255 cn +203.3.74.0 - 203.3.74.255 au +203.3.75.0 - 203.3.75.255 cn +203.3.76.0 - 203.3.79.255 au +203.3.80.0 - 203.3.87.255 cn +203.3.88.0 - 203.3.95.255 au +203.3.96.0 - 203.3.99.255 cn +203.3.100.0 - 203.3.104.255 au +203.3.105.0 - 203.3.105.255 cn +203.3.106.0 - 203.3.111.255 au +203.3.112.0 - 203.3.120.255 cn +203.3.121.0 - 203.3.122.255 au +203.3.123.0 - 203.3.123.255 cn +203.3.124.0 - 203.3.131.255 au +203.3.133.0 - 203.3.134.255 au +203.3.135.0 - 203.3.135.255 cn +203.3.136.0 - 203.3.138.255 au +203.3.139.0 - 203.3.139.255 cn +203.3.140.0 - 203.3.142.255 au +203.3.143.0 - 203.3.143.255 cn +203.3.144.0 - 203.4.131.255 au +203.4.132.0 - 203.4.134.255 cn +203.4.135.0 - 203.4.135.255 au 203.4.136.0 - 203.4.143.255 us -203.4.144.0 - 203.4.159.255 au +203.4.144.0 - 203.4.150.255 au +203.4.151.0 - 203.4.155.255 cn +203.4.156.0 - 203.4.159.255 au 203.4.160.0 - 203.4.160.255 th -203.4.161.0 - 203.5.27.255 au +203.4.161.0 - 203.4.173.255 au +203.4.174.0 - 203.4.175.255 cn +203.4.176.0 - 203.4.179.255 au +203.4.180.0 - 203.4.180.255 cn +203.4.181.0 - 203.4.185.255 au +203.4.186.0 - 203.4.186.255 cn +203.4.187.0 - 203.4.204.255 au +203.4.205.0 - 203.4.205.255 cn +203.4.206.0 - 203.4.207.255 au +203.4.208.0 - 203.4.211.255 cn +203.4.212.0 - 203.4.226.255 au +203.4.227.0 - 203.4.227.255 cn +203.4.228.0 - 203.4.229.255 au +203.4.230.0 - 203.4.231.255 cn +203.4.232.0 - 203.5.3.255 au +203.5.4.0 - 203.5.5.255 cn +203.5.6.0 - 203.5.6.255 au +203.5.7.0 - 203.5.9.255 cn +203.5.10.0 - 203.5.10.255 au +203.5.11.0 - 203.5.11.255 cn +203.5.12.0 - 203.5.20.255 au +203.5.21.0 - 203.5.22.255 cn +203.5.23.0 - 203.5.27.255 au 203.5.28.0 - 203.5.28.255 nz -203.5.29.0 - 203.5.51.255 au -203.5.52.0 - 203.5.55.255 cn -203.5.56.0 - 203.6.147.255 au +203.5.29.0 - 203.5.43.255 au +203.5.44.0 - 203.5.44.255 cn +203.5.45.0 - 203.5.45.255 au +203.5.46.0 - 203.5.47.255 cn +203.5.48.0 - 203.5.51.255 au +203.5.52.0 - 203.5.57.255 cn +203.5.58.0 - 203.5.59.255 au +203.5.60.0 - 203.5.61.255 cn +203.5.62.0 - 203.5.113.255 au +203.5.114.0 - 203.5.115.255 cn +203.5.116.0 - 203.5.117.255 au +203.5.118.0 - 203.5.118.255 cn +203.5.119.0 - 203.5.119.255 au +203.5.120.0 - 203.5.120.255 cn +203.5.121.0 - 203.5.171.255 au +203.5.172.0 - 203.5.172.255 cn +203.5.173.0 - 203.5.179.255 au +203.5.180.0 - 203.5.182.255 cn +203.5.183.0 - 203.5.184.255 au +203.5.185.0 - 203.5.186.255 cn +203.5.187.0 - 203.5.187.255 au +203.5.188.0 - 203.5.190.255 cn +203.5.191.0 - 203.5.194.255 au +203.5.195.0 - 203.5.195.255 cn +203.5.196.0 - 203.5.213.255 au +203.5.214.0 - 203.5.215.255 cn +203.5.216.0 - 203.5.217.255 au +203.5.218.0 - 203.5.219.255 cn +203.5.220.0 - 203.6.130.255 au +203.6.131.0 - 203.6.131.255 cn +203.6.132.0 - 203.6.135.255 au +203.6.136.0 - 203.6.136.255 cn +203.6.137.0 - 203.6.137.255 au +203.6.138.0 - 203.6.139.255 cn +203.6.140.0 - 203.6.141.255 au +203.6.142.0 - 203.6.142.255 cn +203.6.143.0 - 203.6.147.255 au 203.6.148.0 - 203.6.149.255 id -203.6.150.0 - 203.7.146.255 au +203.6.150.0 - 203.6.151.255 cn +203.6.152.0 - 203.6.156.255 au +203.6.157.0 - 203.6.157.255 cn +203.6.158.0 - 203.6.158.255 au +203.6.159.0 - 203.6.159.255 cn +203.6.160.0 - 203.6.223.255 au +203.6.224.0 - 203.6.239.255 cn +203.6.240.0 - 203.6.245.255 au +203.6.246.0 - 203.6.246.255 nz +203.6.247.0 - 203.6.247.255 au +203.6.248.0 - 203.6.249.255 cn +203.6.250.0 - 203.7.128.255 au +203.7.129.0 - 203.7.129.255 cn +203.7.130.0 - 203.7.137.255 au +203.7.138.0 - 203.7.139.255 cn +203.7.140.0 - 203.7.146.255 au 203.7.147.0 - 203.7.147.255 cn -203.7.148.0 - 203.7.170.255 au +203.7.148.0 - 203.7.149.255 au +203.7.150.0 - 203.7.151.255 cn +203.7.152.0 - 203.7.157.255 au +203.7.158.0 - 203.7.158.255 cn +203.7.159.0 - 203.7.159.255 au +203.7.160.0 - 203.7.167.255 hk +203.7.168.0 - 203.7.170.255 au 203.7.171.0 - 203.7.171.255 id -203.7.172.0 - 203.8.108.255 au +203.7.172.0 - 203.7.191.255 au +203.7.192.0 - 203.7.193.255 cn +203.7.194.0 - 203.7.199.255 au +203.7.200.0 - 203.7.200.255 cn +203.7.201.0 - 203.7.255.255 au +203.8.0.0 - 203.8.0.255 cn +203.8.1.0 - 203.8.7.255 au +203.8.8.0 - 203.8.8.255 cn +203.8.9.0 - 203.8.22.255 au +203.8.23.0 - 203.8.23.255 cn +203.8.24.0 - 203.8.31.255 hk +203.8.32.0 - 203.8.69.255 au +203.8.70.0 - 203.8.70.255 cn +203.8.71.0 - 203.8.81.255 au +203.8.82.0 - 203.8.82.255 cn +203.8.83.0 - 203.8.85.255 au +203.8.86.0 - 203.8.87.255 cn +203.8.88.0 - 203.8.90.255 au +203.8.91.0 - 203.8.91.255 cn +203.8.92.0 - 203.8.108.255 au 203.8.109.0 - 203.8.109.255 in 203.8.110.0 - 203.8.111.255 cn -203.8.112.0 - 203.8.115.255 au +203.8.112.0 - 203.8.114.255 au +203.8.115.0 - 203.8.115.255 cn 203.8.116.0 - 203.8.117.255 in 203.8.118.0 - 203.8.126.255 au 203.8.127.0 - 203.8.127.255 vn -203.8.128.0 - 203.8.171.255 au +203.8.128.0 - 203.8.165.255 au +203.8.166.0 - 203.8.167.255 cn +203.8.168.0 - 203.8.168.255 au +203.8.169.0 - 203.8.169.255 cn +203.8.170.0 - 203.8.171.255 au 203.8.172.0 - 203.8.172.255 vn -203.8.173.0 - 203.8.200.255 au +203.8.173.0 - 203.8.173.255 cn +203.8.174.0 - 203.8.183.255 au +203.8.184.0 - 203.8.184.255 cn +203.8.185.0 - 203.8.185.255 au +203.8.186.0 - 203.8.187.255 cn +203.8.188.0 - 203.8.189.255 au +203.8.190.0 - 203.8.192.255 cn +203.8.193.0 - 203.8.196.255 au +203.8.197.0 - 203.8.199.255 cn +203.8.200.0 - 203.8.200.255 au 203.8.201.0 - 203.8.201.255 in -203.8.202.0 - 203.9.62.255 au +203.8.202.0 - 203.8.202.255 au +203.8.203.0 - 203.8.203.255 cn +203.8.204.0 - 203.8.208.255 au +203.8.209.0 - 203.8.215.255 cn +203.8.216.0 - 203.8.216.255 au +203.8.217.0 - 203.8.217.255 cn +203.8.218.0 - 203.8.219.255 au +203.8.220.0 - 203.8.220.255 cn +203.8.221.0 - 203.9.31.255 au +203.9.32.0 - 203.9.32.255 cn +203.9.33.0 - 203.9.35.255 au +203.9.36.0 - 203.9.37.255 cn +203.9.38.0 - 203.9.56.255 au +203.9.57.0 - 203.9.57.255 cn +203.9.58.0 - 203.9.62.255 au 203.9.63.0 - 203.9.63.255 cn -203.9.64.0 - 203.9.69.255 au -203.9.70.0 - 203.9.71.255 cn -203.9.72.0 - 203.9.77.255 au -203.9.78.0 - 203.9.79.255 sg -203.9.80.0 - 203.9.175.255 au +203.9.64.0 - 203.9.64.255 au +203.9.65.0 - 203.9.65.255 cn +203.9.66.0 - 203.9.69.255 au +203.9.70.0 - 203.9.72.255 cn +203.9.73.0 - 203.9.74.255 au +203.9.75.0 - 203.9.77.255 cn +203.9.78.0 - 203.9.78.255 ap +203.9.79.0 - 203.9.79.255 sg +203.9.80.0 - 203.9.95.255 au +203.9.96.0 - 203.9.101.255 cn +203.9.102.0 - 203.9.107.255 au +203.9.108.0 - 203.9.108.255 cn +203.9.109.0 - 203.9.157.255 au +203.9.158.0 - 203.9.158.255 cn +203.9.159.0 - 203.9.175.255 au 203.9.176.0 - 203.9.183.255 nz -203.9.184.0 - 203.10.15.255 au +203.9.184.0 - 203.9.189.255 au +203.9.190.0 - 203.9.191.255 jp +203.9.192.0 - 203.10.15.255 au 203.10.16.0 - 203.10.23.255 my -203.10.24.0 - 203.10.57.255 au +203.10.24.0 - 203.10.33.255 au +203.10.34.0 - 203.10.34.255 cn +203.10.35.0 - 203.10.55.255 au +203.10.56.0 - 203.10.56.255 cn +203.10.57.0 - 203.10.57.255 au 203.10.58.0 - 203.10.58.255 my -203.10.59.0 - 203.11.64.255 au -203.11.65.0 - 203.11.65.255 in -203.11.66.0 - 203.11.73.255 au +203.10.59.0 - 203.10.73.255 au +203.10.74.0 - 203.10.75.255 cn +203.10.76.0 - 203.10.83.255 au +203.10.84.0 - 203.10.88.255 cn +203.10.89.0 - 203.10.94.255 au +203.10.95.0 - 203.10.95.255 cn +203.10.96.0 - 203.10.124.255 au +203.10.125.0 - 203.10.125.255 cn +203.10.126.0 - 203.11.69.255 au +203.11.70.0 - 203.11.70.255 cn +203.11.71.0 - 203.11.71.255 au +203.11.72.0 - 203.11.72.255 in +203.11.73.0 - 203.11.73.255 au 203.11.74.0 - 203.11.74.255 th -203.11.75.0 - 203.11.99.255 au +203.11.75.0 - 203.11.75.255 au +203.11.76.0 - 203.11.79.255 cn +203.11.80.0 - 203.11.81.255 au +203.11.82.0 - 203.11.82.255 cn +203.11.83.0 - 203.11.83.255 au +203.11.84.0 - 203.11.87.255 cn +203.11.88.0 - 203.11.99.255 au 203.11.100.0 - 203.11.103.255 cn -203.11.104.0 - 203.11.183.255 au -203.11.184.0 - 203.11.184.255 sg -203.11.185.0 - 203.12.17.255 au +203.11.104.0 - 203.11.108.255 au +203.11.109.0 - 203.11.109.255 cn +203.11.110.0 - 203.11.116.255 au +203.11.117.0 - 203.11.117.255 cn +203.11.118.0 - 203.11.121.255 au +203.11.122.0 - 203.11.122.255 cn +203.11.123.0 - 203.11.125.255 au +203.11.126.0 - 203.11.126.255 cn +203.11.127.0 - 203.11.127.255 au +203.11.128.0 - 203.11.131.81 hk +203.11.131.82 - 203.11.131.82 ap +203.11.131.83 - 203.11.131.255 hk +203.11.132.0 - 203.11.132.255 il +203.11.133.0 - 203.11.135.255 hk +203.11.136.0 - 203.11.139.255 cn +203.11.140.0 - 203.11.140.255 au +203.11.141.0 - 203.11.143.255 cn +203.11.144.0 - 203.11.179.255 au +203.11.180.0 - 203.11.183.255 cn +203.11.184.0 - 203.11.184.255 ap +203.11.185.0 - 203.11.207.255 au +203.11.208.0 - 203.11.211.255 cn +203.11.212.0 - 203.12.15.255 au +203.12.16.0 - 203.12.16.255 cn +203.12.17.0 - 203.12.17.255 au 203.12.18.0 - 203.12.18.255 ph -203.12.19.0 - 203.12.19.255 au +203.12.19.0 - 203.12.19.255 cn 203.12.20.0 - 203.12.21.255 id -203.12.22.0 - 203.12.117.255 au -203.12.118.0 - 203.12.118.255 np -203.12.119.0 - 203.12.219.255 au +203.12.22.0 - 203.12.23.255 au +203.12.24.0 - 203.12.24.255 cn +203.12.25.0 - 203.12.41.255 au +203.12.42.0 - 203.12.42.255 jp +203.12.43.0 - 203.12.56.255 au +203.12.57.0 - 203.12.57.255 cn +203.12.58.0 - 203.12.64.255 au +203.12.65.0 - 203.12.66.255 cn +203.12.67.0 - 203.12.69.255 au +203.12.70.0 - 203.12.71.255 cn +203.12.72.0 - 203.12.85.255 au +203.12.87.0 - 203.12.87.255 cn +203.12.88.0 - 203.12.95.255 hk +203.12.96.0 - 203.12.96.255 au +203.12.97.0 - 203.12.97.255 jp +203.12.98.0 - 203.12.99.255 au +203.12.100.0 - 203.12.101.255 cn +203.12.102.0 - 203.12.102.255 au +203.12.103.0 - 203.12.103.255 cn +203.12.104.0 - 203.12.113.255 au +203.12.114.0 - 203.12.114.255 cn +203.12.115.0 - 203.12.117.255 au +203.12.118.0 - 203.12.118.255 cn +203.12.119.0 - 203.12.129.255 au +203.12.130.0 - 203.12.130.255 cn +203.12.131.0 - 203.12.136.255 au +203.12.137.0 - 203.12.137.255 cn +203.12.138.0 - 203.12.195.255 au +203.12.196.0 - 203.12.199.255 cn +203.12.200.0 - 203.12.207.255 hk +203.12.208.0 - 203.12.210.255 au +203.12.211.0 - 203.12.211.255 cn +203.12.212.0 - 203.12.218.255 au +203.12.219.0 - 203.12.219.255 cn 203.12.220.0 - 203.12.220.255 my 203.12.221.0 - 203.12.221.255 au 203.12.222.0 - 203.12.223.255 in -203.12.224.0 - 203.12.248.255 au +203.12.224.0 - 203.12.225.255 au +203.12.226.0 - 203.12.226.255 cn +203.12.227.0 - 203.12.239.255 au +203.12.240.0 - 203.12.243.255 cn +203.12.244.0 - 203.12.248.255 au 203.12.249.0 - 203.12.249.255 nf -203.12.250.0 - 203.13.39.255 au +203.12.250.0 - 203.13.17.255 au +203.13.18.0 - 203.13.18.255 cn +203.13.19.0 - 203.13.23.255 au +203.13.24.0 - 203.13.24.255 cn +203.13.25.0 - 203.13.39.255 au 203.13.40.0 - 203.13.40.255 in -203.13.41.0 - 203.13.167.255 au +203.13.41.0 - 203.13.43.255 au +203.13.44.0 - 203.13.45.255 cn +203.13.46.0 - 203.13.79.255 au +203.13.80.0 - 203.13.87.255 hk +203.13.88.0 - 203.13.89.255 cn +203.13.90.0 - 203.13.91.255 au +203.13.92.0 - 203.13.95.255 cn +203.13.96.0 - 203.13.145.255 au +203.13.146.0 - 203.13.146.255 in +203.13.147.0 - 203.13.167.255 au 203.13.168.0 - 203.13.171.255 in -203.13.172.0 - 203.14.17.255 au +203.13.172.0 - 203.13.172.255 au +203.13.173.0 - 203.13.173.255 cn +203.13.174.0 - 203.13.223.255 au +203.13.224.0 - 203.13.225.255 cn +203.13.226.0 - 203.13.226.255 au +203.13.227.0 - 203.13.227.255 cn +203.13.228.0 - 203.13.232.255 au +203.13.233.0 - 203.13.233.255 cn +203.13.234.0 - 203.14.17.255 au 203.14.18.0 - 203.14.18.255 in -203.14.19.0 - 203.14.165.255 au -203.14.166.0 - 203.14.166.255 ap +203.14.19.0 - 203.14.23.255 au +203.14.24.0 - 203.14.27.255 cn +203.14.28.0 - 203.14.31.255 au +203.14.32.0 - 203.14.32.255 in +203.14.33.0 - 203.14.33.255 cn +203.14.34.0 - 203.14.55.255 au +203.14.56.0 - 203.14.56.255 cn +203.14.57.0 - 203.14.60.255 au +203.14.61.0 - 203.14.62.255 cn +203.14.63.0 - 203.14.103.255 au +203.14.104.0 - 203.14.104.255 cn +203.14.105.0 - 203.14.113.255 au +203.14.114.0 - 203.14.115.255 cn +203.14.116.0 - 203.14.117.255 au +203.14.118.0 - 203.14.118.255 cn +203.14.119.0 - 203.14.161.255 au +203.14.162.0 - 203.14.162.255 cn +203.14.163.0 - 203.14.165.255 au +203.14.166.0 - 203.14.166.255 hk 203.14.167.0 - 203.14.175.255 au 203.14.176.0 - 203.14.176.255 id 203.14.177.0 - 203.14.182.255 au 203.14.183.0 - 203.14.183.255 id -203.14.184.0 - 203.14.211.255 au -203.14.212.0 - 203.14.212.255 hk -203.14.213.0 - 203.16.33.255 au +203.14.184.0 - 203.14.189.255 hk +203.14.190.0 - 203.14.191.255 sg +203.14.192.0 - 203.14.192.255 cn +203.14.193.0 - 203.14.193.255 au +203.14.194.0 - 203.14.195.255 cn +203.14.196.0 - 203.14.211.255 au +203.14.212.0 - 203.14.212.255 jp +203.14.213.0 - 203.14.213.255 au +203.14.214.0 - 203.14.214.255 cn +203.14.215.0 - 203.14.230.255 au +203.14.231.0 - 203.14.231.255 cn +203.14.232.0 - 203.14.245.255 au +203.14.246.0 - 203.14.246.255 cn +203.14.247.0 - 203.14.255.255 au +203.15.0.0 - 203.15.15.255 cn +203.15.16.0 - 203.15.19.255 au +203.15.20.0 - 203.15.22.255 cn +203.15.23.0 - 203.15.67.255 au +203.15.68.0 - 203.15.68.255 jp +203.15.69.0 - 203.15.86.255 au +203.15.87.0 - 203.15.89.255 cn +203.15.90.0 - 203.15.104.255 au +203.15.105.0 - 203.15.105.255 cn +203.15.106.0 - 203.15.111.255 au +203.15.112.0 - 203.15.119.255 cn +203.15.120.0 - 203.15.129.255 au +203.15.130.0 - 203.15.131.255 cn +203.15.132.0 - 203.15.148.255 au +203.15.149.0 - 203.15.149.255 cn +203.15.150.0 - 203.15.150.255 au +203.15.151.0 - 203.15.151.255 cn +203.15.152.0 - 203.15.155.255 au +203.15.156.0 - 203.15.159.255 cn +203.15.160.0 - 203.15.173.255 au +203.15.174.0 - 203.15.174.255 cn +203.15.175.0 - 203.15.226.255 au +203.15.227.0 - 203.15.227.255 cn +203.15.228.0 - 203.15.231.255 au +203.15.232.0 - 203.15.241.255 cn +203.15.242.0 - 203.15.245.255 au +203.15.246.0 - 203.15.246.255 cn +203.15.247.0 - 203.16.9.255 au +203.16.10.0 - 203.16.10.255 cn +203.16.12.0 - 203.16.13.255 cn +203.16.14.0 - 203.16.15.255 au +203.16.16.0 - 203.16.23.255 cn +203.16.24.0 - 203.16.26.255 au +203.16.27.0 - 203.16.27.255 cn +203.16.28.0 - 203.16.33.255 au 203.16.34.0 - 203.16.34.255 pk -203.16.35.0 - 203.16.164.255 au +203.16.35.0 - 203.16.37.255 au +203.16.38.0 - 203.16.38.255 cn +203.16.39.0 - 203.16.48.255 au +203.16.49.0 - 203.16.51.255 cn +203.16.52.0 - 203.16.57.255 au +203.16.58.0 - 203.16.58.255 cn +203.16.59.0 - 203.16.132.255 au +203.16.133.0 - 203.16.133.255 cn +203.16.134.0 - 203.16.160.255 au +203.16.161.0 - 203.16.162.255 cn +203.16.163.0 - 203.16.164.255 au 203.16.165.0 - 203.16.165.255 in -203.16.166.0 - 203.16.238.255 au +203.16.166.0 - 203.16.179.255 au +203.16.180.0 - 203.16.181.255 jp +203.16.182.0 - 203.16.182.255 au +203.16.183.0 - 203.16.183.255 jp +203.16.184.0 - 203.16.185.255 au +203.16.186.0 - 203.16.187.255 cn +203.16.188.0 - 203.16.227.255 au +203.16.228.0 - 203.16.228.255 cn +203.16.229.0 - 203.16.237.255 au +203.16.238.0 - 203.16.238.255 cn 203.16.239.0 - 203.16.239.255 hk -203.16.240.0 - 203.17.20.255 au +203.16.240.0 - 203.16.240.255 cn +203.16.241.0 - 203.16.244.255 au +203.16.245.0 - 203.16.245.255 cn +203.16.246.0 - 203.17.1.255 au +203.17.2.0 - 203.17.2.255 cn +203.17.3.0 - 203.17.17.255 au +203.17.18.0 - 203.17.18.255 cn +203.17.19.0 - 203.17.20.255 au 203.17.21.0 - 203.17.21.255 id -203.17.22.0 - 203.17.30.255 au +203.17.22.0 - 203.17.27.255 au +203.17.28.0 - 203.17.28.255 cn +203.17.29.0 - 203.17.30.255 au 203.17.31.0 - 203.17.31.255 in -203.17.32.0 - 203.17.135.255 au +203.17.32.0 - 203.17.38.255 au +203.17.39.0 - 203.17.39.255 cn +203.17.40.0 - 203.17.55.255 au +203.17.56.0 - 203.17.56.255 cn +203.17.57.0 - 203.17.73.255 au +203.17.74.0 - 203.17.75.255 cn +203.17.76.0 - 203.17.87.255 au +203.17.88.0 - 203.17.89.255 cn +203.17.90.0 - 203.17.135.255 au 203.17.136.0 - 203.17.136.255 cn -203.17.137.0 - 203.17.193.255 au +203.17.137.0 - 203.17.161.255 au +203.17.162.0 - 203.17.162.255 jp +203.17.163.0 - 203.17.163.255 au +203.17.164.0 - 203.17.164.255 cn +203.17.165.0 - 203.17.186.255 au +203.17.187.0 - 203.17.187.255 cn +203.17.188.0 - 203.17.188.255 au +203.17.190.0 - 203.17.191.255 cn +203.17.192.0 - 203.17.193.255 au 203.17.194.0 - 203.17.194.255 in 203.17.195.0 - 203.17.225.255 au 203.17.226.0 - 203.17.226.255 kr -203.17.227.0 - 203.17.239.255 au +203.17.227.0 - 203.17.230.255 au +203.17.231.0 - 203.17.231.255 cn +203.17.232.0 - 203.17.232.255 au +203.17.233.0 - 203.17.233.255 cn +203.17.234.0 - 203.17.239.255 au 203.17.240.0 - 203.17.243.255 nf -203.17.244.0 - 203.17.248.255 au -203.17.249.0 - 203.17.249.255 ph -203.17.250.0 - 203.18.25.255 au +203.17.244.0 - 203.17.247.255 au +203.17.248.0 - 203.17.248.255 cn +203.17.250.0 - 203.17.254.255 au +203.17.255.0 - 203.17.255.255 cn +203.18.0.0 - 203.18.1.255 au +203.18.2.0 - 203.18.4.255 cn +203.18.5.0 - 203.18.6.255 au +203.18.7.0 - 203.18.7.255 cn +203.18.8.0 - 203.18.25.255 au 203.18.26.0 - 203.18.26.255 in -203.18.27.0 - 203.18.49.255 au -203.18.50.0 - 203.18.50.255 cn +203.18.27.0 - 203.18.30.255 au +203.18.31.0 - 203.18.31.255 cn +203.18.32.0 - 203.18.36.255 au +203.18.37.0 - 203.18.37.255 cn +203.18.38.0 - 203.18.47.255 au +203.18.48.0 - 203.18.49.255 cn +203.18.50.0 - 203.18.50.255 hk 203.18.51.0 - 203.18.51.255 in -203.18.52.0 - 203.18.136.255 au +203.18.52.0 - 203.18.52.255 cn +203.18.53.0 - 203.18.71.255 au +203.18.72.0 - 203.18.75.255 cn +203.18.76.0 - 203.18.79.255 au +203.18.80.0 - 203.18.81.255 cn +203.18.82.0 - 203.18.86.255 au +203.18.87.0 - 203.18.87.255 cn +203.18.88.0 - 203.18.99.255 au +203.18.100.0 - 203.18.101.255 cn +203.18.102.0 - 203.18.104.255 au +203.18.105.0 - 203.18.105.255 cn +203.18.106.0 - 203.18.106.255 au +203.18.107.0 - 203.18.107.255 cn +203.18.108.0 - 203.18.109.255 au +203.18.110.0 - 203.18.110.255 cn +203.18.112.0 - 203.18.128.255 au +203.18.129.0 - 203.18.129.255 cn +203.18.130.0 - 203.18.130.255 au +203.18.131.0 - 203.18.133.255 cn +203.18.134.0 - 203.18.136.255 au 203.18.137.0 - 203.18.137.255 in -203.18.138.0 - 203.19.0.255 au -203.19.1.0 - 203.19.1.255 sg +203.18.138.0 - 203.18.143.255 au +203.18.144.0 - 203.18.144.255 cn +203.18.145.0 - 203.18.152.255 au +203.18.153.0 - 203.18.153.255 cn +203.18.154.0 - 203.18.155.255 au +203.18.160.0 - 203.18.198.255 au +203.18.199.0 - 203.18.199.255 cn +203.18.200.0 - 203.18.207.255 au +203.18.208.0 - 203.18.208.255 cn +203.18.209.0 - 203.18.210.255 au +203.18.211.0 - 203.18.211.255 cn +203.18.212.0 - 203.18.214.255 au +203.18.215.0 - 203.18.215.255 cn +203.18.216.0 - 203.19.0.255 au 203.19.2.0 - 203.19.2.255 au 203.19.3.0 - 203.19.3.255 in 203.19.4.0 - 203.19.4.255 id -203.19.5.0 - 203.19.29.255 au +203.19.5.0 - 203.19.17.255 au +203.19.18.0 - 203.19.18.255 cn +203.19.19.0 - 203.19.23.255 au +203.19.24.0 - 203.19.24.255 cn +203.19.25.0 - 203.19.29.255 au 203.19.30.0 - 203.19.30.255 cn -203.19.31.0 - 203.19.100.255 au -203.19.101.0 - 203.19.101.255 hk -203.19.102.0 - 203.19.146.255 au -203.19.147.0 - 203.19.147.255 jp +203.19.31.0 - 203.19.31.255 au +203.19.32.0 - 203.19.39.255 hk +203.19.40.0 - 203.19.40.255 au +203.19.41.0 - 203.19.41.255 cn +203.19.42.0 - 203.19.43.255 au +203.19.44.0 - 203.19.46.255 cn +203.19.47.0 - 203.19.57.255 au +203.19.58.0 - 203.19.58.255 cn +203.19.59.0 - 203.19.59.255 au +203.19.60.0 - 203.19.61.255 cn +203.19.62.0 - 203.19.63.255 au +203.19.64.0 - 203.19.64.255 cn +203.19.65.0 - 203.19.67.255 au +203.19.68.0 - 203.19.68.255 cn +203.19.69.0 - 203.19.71.255 au +203.19.72.0 - 203.19.72.255 cn +203.19.73.0 - 203.19.100.255 au +203.19.101.0 - 203.19.101.255 cn +203.19.102.0 - 203.19.110.255 au +203.19.111.0 - 203.19.111.255 cn +203.19.112.0 - 203.19.130.255 au +203.19.131.0 - 203.19.131.255 cn +203.19.132.0 - 203.19.132.255 au +203.19.133.0 - 203.19.133.255 cn +203.19.134.0 - 203.19.143.255 au +203.19.144.0 - 203.19.144.255 cn +203.19.145.0 - 203.19.146.255 au 203.19.148.0 - 203.19.148.255 au 203.19.149.0 - 203.19.149.255 cn 203.19.150.0 - 203.19.155.255 au 203.19.156.0 - 203.19.156.255 cn -203.19.157.0 - 203.19.227.255 au +203.19.157.0 - 203.19.175.255 au +203.19.176.0 - 203.19.176.255 cn +203.19.177.0 - 203.19.177.255 au +203.19.178.0 - 203.19.179.255 cn +203.19.180.0 - 203.19.207.255 au +203.19.208.0 - 203.19.208.255 cn +203.19.209.0 - 203.19.227.255 au 203.19.228.0 - 203.19.231.255 cn -203.19.232.0 - 203.19.254.255 au +203.19.232.0 - 203.19.232.255 au +203.19.233.0 - 203.19.233.255 cn +203.19.234.0 - 203.19.239.255 au +203.19.241.0 - 203.19.241.255 au +203.19.242.0 - 203.19.242.255 cn +203.19.243.0 - 203.19.247.255 au +203.19.248.0 - 203.19.249.255 cn +203.19.250.0 - 203.19.254.255 au 203.19.255.0 - 203.19.255.255 cn -203.20.0.0 - 203.20.43.255 au -203.20.44.0 - 203.20.44.255 jp -203.20.45.0 - 203.20.60.255 au +203.20.0.0 - 203.20.16.255 au +203.20.17.0 - 203.20.17.255 cn +203.20.18.0 - 203.20.39.255 au +203.20.40.0 - 203.20.41.255 cn +203.20.43.0 - 203.20.47.255 au +203.20.48.0 - 203.20.48.255 cn +203.20.49.0 - 203.20.60.255 au 203.20.61.0 - 203.20.61.255 cn -203.20.62.0 - 203.20.104.255 au -203.20.105.0 - 203.20.105.255 sg -203.20.106.0 - 203.21.6.255 au +203.20.62.0 - 203.20.62.255 au +203.20.64.0 - 203.20.64.255 au +203.20.65.0 - 203.20.65.255 cn +203.20.66.0 - 203.20.83.255 au +203.20.84.0 - 203.20.85.255 cn +203.20.86.0 - 203.20.88.255 au +203.20.89.0 - 203.20.89.255 cn +203.20.90.0 - 203.20.104.255 au +203.20.105.0 - 203.20.105.255 ap +203.20.106.0 - 203.20.107.255 cn +203.20.108.0 - 203.20.114.255 au +203.20.115.0 - 203.20.115.255 cn +203.20.116.0 - 203.20.116.255 au +203.20.117.0 - 203.20.119.255 cn +203.20.120.0 - 203.20.121.255 au +203.20.122.0 - 203.20.122.255 cn +203.20.123.0 - 203.20.125.255 au +203.20.126.0 - 203.20.127.255 cn +203.20.128.0 - 203.20.134.255 au +203.20.135.0 - 203.20.135.255 cn +203.20.136.0 - 203.20.143.255 hk +203.20.144.0 - 203.20.149.255 au +203.20.150.0 - 203.20.150.255 cn +203.20.151.0 - 203.20.151.255 au +203.20.152.0 - 203.20.159.255 hk +203.20.160.0 - 203.20.229.255 au +203.20.230.0 - 203.20.230.255 cn +203.20.231.0 - 203.20.231.255 au +203.20.232.0 - 203.20.232.255 cn +203.20.233.0 - 203.20.235.255 au +203.20.236.0 - 203.20.236.255 cn +203.20.237.0 - 203.20.240.255 au +203.20.241.0 - 203.20.241.255 nz +203.20.242.0 - 203.20.255.255 au +203.21.0.0 - 203.21.2.255 cn +203.21.3.0 - 203.21.6.255 au 203.21.7.0 - 203.21.7.255 in -203.21.8.0 - 203.21.25.55 au -203.21.25.56 - 203.21.25.59 nz -203.21.25.60 - 203.21.25.75 au -203.21.25.76 - 203.21.25.79 nz -203.21.25.80 - 203.21.25.107 au -203.21.25.108 - 203.21.25.111 nz -203.21.25.112 - 203.21.25.139 au -203.21.25.140 - 203.21.25.143 nz -203.21.25.144 - 203.21.25.199 au -203.21.25.200 - 203.21.25.207 nz -203.21.25.208 - 203.21.26.255 au -203.21.27.0 - 203.21.27.31 nz -203.21.27.32 - 203.21.27.35 au -203.21.27.36 - 203.21.27.39 nz -203.21.27.40 - 203.21.27.95 au -203.21.27.96 - 203.21.27.111 nz -203.21.27.112 - 203.21.27.127 au -203.21.27.128 - 203.21.27.135 nz -203.21.27.136 - 203.21.27.151 au -203.21.27.152 - 203.21.27.159 nz -203.21.27.160 - 203.21.27.191 au -203.21.27.192 - 203.21.27.207 nz -203.21.27.208 - 203.21.27.223 au -203.21.27.224 - 203.21.27.255 nz -203.21.28.0 - 203.21.31.51 au -203.21.31.52 - 203.21.31.55 nz -203.21.31.56 - 203.21.31.71 au -203.21.31.72 - 203.21.31.111 nz -203.21.31.112 - 203.21.31.151 au -203.21.31.152 - 203.21.31.155 nz -203.21.31.156 - 203.21.31.167 au -203.21.31.168 - 203.21.31.175 nz -203.21.31.176 - 203.21.31.191 au -203.21.31.192 - 203.21.31.199 nz -203.21.31.200 - 203.21.31.223 au -203.21.31.224 - 203.21.31.255 nz -203.21.32.0 - 203.21.40.255 au +203.21.8.0 - 203.21.8.255 cn +203.21.9.0 - 203.21.9.255 au +203.21.10.0 - 203.21.10.255 cn +203.21.11.0 - 203.21.17.255 au +203.21.18.0 - 203.21.18.255 cn +203.21.19.0 - 203.21.32.255 au +203.21.33.0 - 203.21.34.255 cn +203.21.35.0 - 203.21.40.255 au 203.21.41.0 - 203.21.41.255 cn 203.21.42.0 - 203.21.43.255 th -203.21.44.0 - 203.21.73.255 au +203.21.44.0 - 203.21.44.255 cn +203.21.45.0 - 203.21.67.255 au +203.21.68.0 - 203.21.68.255 cn +203.21.69.0 - 203.21.73.255 au 203.21.74.0 - 203.21.75.255 id -203.21.76.0 - 203.21.135.255 au +203.21.76.0 - 203.21.81.255 au +203.21.82.0 - 203.21.82.255 cn +203.21.83.0 - 203.21.95.255 au +203.21.96.0 - 203.21.99.255 cn +203.21.100.0 - 203.21.123.255 au +203.21.124.0 - 203.21.124.255 cn +203.21.125.0 - 203.21.135.255 au 203.21.136.0 - 203.21.137.255 cn -203.21.138.0 - 203.22.94.255 au -203.22.95.0 - 203.22.95.255 cn -203.22.96.0 - 203.22.103.255 au +203.21.138.0 - 203.21.144.255 au +203.21.145.0 - 203.21.145.255 cn +203.21.146.0 - 203.21.205.255 au +203.21.206.0 - 203.21.206.255 cn +203.21.207.0 - 203.22.23.255 au +203.22.24.0 - 203.22.24.255 cn +203.22.25.0 - 203.22.27.255 au +203.22.28.0 - 203.22.29.255 cn +203.22.30.0 - 203.22.30.255 au +203.22.31.0 - 203.22.31.255 cn +203.22.32.0 - 203.22.67.255 au +203.22.68.0 - 203.22.68.255 cn +203.22.69.0 - 203.22.75.255 au +203.22.76.0 - 203.22.76.255 cn +203.22.77.0 - 203.22.77.255 au +203.22.78.0 - 203.22.78.255 cn +203.22.79.0 - 203.22.83.255 au +203.22.84.0 - 203.22.84.255 cn +203.22.85.0 - 203.22.86.255 au +203.22.87.0 - 203.22.87.255 cn +203.22.88.0 - 203.22.91.255 au +203.22.92.0 - 203.22.95.255 cn +203.22.96.0 - 203.22.98.255 au +203.22.99.0 - 203.22.99.255 cn +203.22.100.0 - 203.22.103.255 au 203.22.104.0 - 203.22.105.255 hk -203.22.106.0 - 203.22.130.255 au +203.22.106.0 - 203.22.106.255 cn +203.22.107.0 - 203.22.107.255 au +203.22.110.0 - 203.22.121.255 au +203.22.122.0 - 203.22.123.255 cn +203.22.124.0 - 203.22.130.255 au 203.22.131.0 - 203.22.131.255 cn -203.22.132.0 - 203.22.203.255 au +203.22.132.0 - 203.22.162.255 au +203.22.163.0 - 203.22.163.255 cn +203.22.164.0 - 203.22.165.255 au +203.22.166.0 - 203.22.166.255 cn +203.22.167.0 - 203.22.169.255 au +203.22.170.0 - 203.22.170.255 cn +203.22.171.0 - 203.22.175.255 au +203.22.176.0 - 203.22.183.255 hk +203.22.184.0 - 203.22.193.255 au +203.22.194.0 - 203.22.194.255 cn +203.22.195.0 - 203.22.203.255 au 203.22.204.0 - 203.22.204.255 us -203.22.205.0 - 203.23.46.255 au +203.22.205.0 - 203.22.241.255 au +203.22.242.0 - 203.22.243.255 cn +203.22.244.0 - 203.22.244.255 au +203.22.245.0 - 203.22.246.255 cn +203.22.247.0 - 203.22.251.255 au +203.22.252.0 - 203.22.253.255 cn +203.22.254.0 - 203.22.255.255 au +203.23.0.0 - 203.23.0.255 cn +203.23.2.0 - 203.23.46.255 au 203.23.47.0 - 203.23.47.255 cn -203.23.48.0 - 203.23.111.255 au +203.23.48.0 - 203.23.60.255 au +203.23.61.0 - 203.23.63.255 cn +203.23.64.0 - 203.23.72.255 au +203.23.73.0 - 203.23.73.255 cn +203.23.74.0 - 203.23.84.255 au +203.23.85.0 - 203.23.85.255 cn +203.23.86.0 - 203.23.91.255 au +203.23.92.0 - 203.23.95.255 cn +203.23.96.0 - 203.23.97.255 au +203.23.98.0 - 203.23.98.255 cn +203.23.99.0 - 203.23.106.255 au +203.23.107.0 - 203.23.107.255 cn +203.23.108.0 - 203.23.111.255 au 203.23.112.0 - 203.23.112.255 cn 203.23.113.0 - 203.23.129.255 au 203.23.130.0 - 203.23.130.255 cn -203.23.131.0 - 203.23.171.255 au +203.23.131.0 - 203.23.139.255 au +203.23.140.0 - 203.23.141.255 cn +203.23.142.0 - 203.23.171.255 au 203.23.172.0 - 203.23.172.255 cn 203.23.173.0 - 203.23.181.255 au 203.23.182.0 - 203.23.182.255 cn 203.23.183.0 - 203.23.185.255 au 203.23.186.0 - 203.23.187.255 cn -203.23.188.0 - 203.24.49.255 au +203.23.188.0 - 203.23.191.255 au +203.23.192.0 - 203.23.192.255 cn +203.23.193.0 - 203.23.196.255 au +203.23.197.0 - 203.23.198.255 cn +203.23.199.0 - 203.23.203.255 au +203.23.204.0 - 203.23.207.255 cn +203.23.208.0 - 203.23.223.255 au +203.23.224.0 - 203.23.224.255 cn +203.23.225.0 - 203.23.225.255 au +203.23.226.0 - 203.23.231.255 cn +203.23.232.0 - 203.23.248.255 au +203.23.249.0 - 203.23.249.255 cn +203.23.250.0 - 203.23.250.255 au +203.23.251.0 - 203.23.251.255 cn +203.23.252.0 - 203.24.12.255 au +203.24.13.0 - 203.24.13.255 cn +203.24.14.0 - 203.24.17.255 au +203.24.18.0 - 203.24.18.255 cn +203.24.19.0 - 203.24.26.255 au +203.24.27.0 - 203.24.27.255 cn +203.24.28.0 - 203.24.42.255 au +203.24.43.0 - 203.24.43.255 cn +203.24.44.0 - 203.24.49.255 au 203.24.50.0 - 203.24.51.255 id 203.24.52.0 - 203.24.55.255 au 203.24.56.0 - 203.24.56.255 cn -203.24.57.0 - 203.24.75.255 au +203.24.57.0 - 203.24.57.255 au +203.24.58.0 - 203.24.58.255 cn +203.24.59.0 - 203.24.66.255 au +203.24.67.0 - 203.24.67.255 cn +203.24.68.0 - 203.24.73.255 au +203.24.74.0 - 203.24.74.255 cn +203.24.75.0 - 203.24.75.255 au 203.24.76.0 - 203.24.77.255 id 203.24.78.0 - 203.24.78.255 au -203.24.79.0 - 203.24.80.255 cn -203.24.81.0 - 203.24.86.255 au +203.24.79.0 - 203.24.81.255 cn +203.24.82.0 - 203.24.83.255 au +203.24.84.0 - 203.24.86.255 cn 203.24.87.0 - 203.24.87.255 in 203.24.88.0 - 203.24.89.255 au 203.24.90.0 - 203.24.90.255 cn -203.24.91.0 - 203.24.151.255 au -203.24.152.0 - 203.24.152.255 cn -203.24.153.0 - 203.24.160.255 au +203.24.91.0 - 203.24.110.255 au +203.24.111.0 - 203.24.112.255 cn +203.24.113.0 - 203.24.115.255 au +203.24.116.0 - 203.24.116.255 cn +203.24.117.0 - 203.24.121.255 au +203.24.122.0 - 203.24.123.255 cn +203.24.124.0 - 203.24.133.255 au +203.24.134.0 - 203.24.135.255 jp +203.24.136.0 - 203.24.144.255 au +203.24.145.0 - 203.24.145.255 cn +203.24.146.0 - 203.24.151.255 au +203.24.152.0 - 203.24.153.255 cn +203.24.154.0 - 203.24.156.255 au +203.24.157.0 - 203.24.157.255 cn +203.24.158.0 - 203.24.160.255 au 203.24.161.0 - 203.24.161.255 cn -203.24.162.0 - 203.24.198.255 au +203.24.162.0 - 203.24.166.255 au +203.24.167.0 - 203.24.167.255 cn +203.24.168.0 - 203.24.185.255 au +203.24.186.0 - 203.24.187.255 cn +203.24.188.0 - 203.24.198.255 au 203.24.199.0 - 203.24.199.255 cn -203.24.200.0 - 203.25.105.255 au +203.24.200.0 - 203.24.201.255 au +203.24.202.0 - 203.24.202.255 cn +203.24.203.0 - 203.24.211.255 au +203.24.212.0 - 203.24.213.255 cn +203.24.214.0 - 203.24.216.255 au +203.24.217.0 - 203.24.217.255 cn +203.24.218.0 - 203.24.218.255 au +203.24.219.0 - 203.24.219.255 cn +203.24.220.0 - 203.24.243.255 au +203.24.244.0 - 203.24.244.255 cn +203.24.245.0 - 203.25.18.255 au +203.25.19.0 - 203.25.21.255 cn +203.25.22.0 - 203.25.45.255 au +203.25.46.0 - 203.25.46.255 cn +203.25.47.0 - 203.25.47.255 au +203.25.48.0 - 203.25.55.255 hk +203.25.56.0 - 203.25.63.255 au +203.25.64.0 - 203.25.65.255 cn +203.25.66.0 - 203.25.90.255 au +203.25.91.0 - 203.25.91.255 cn +203.25.92.0 - 203.25.98.255 au +203.25.99.0 - 203.25.100.255 cn +203.25.101.0 - 203.25.105.255 au 203.25.106.0 - 203.25.106.255 cn -203.25.107.0 - 203.25.198.255 au -203.25.199.0 - 203.25.199.255 cn -203.25.200.0 - 203.25.207.255 au +203.25.107.0 - 203.25.107.255 au +203.25.108.0 - 203.25.108.255 in +203.25.109.0 - 203.25.130.255 au +203.25.131.0 - 203.25.131.255 cn +203.25.132.0 - 203.25.134.255 au +203.25.135.0 - 203.25.135.255 cn +203.25.137.0 - 203.25.137.255 au +203.25.138.0 - 203.25.138.255 cn +203.25.139.0 - 203.25.146.255 au +203.25.147.0 - 203.25.147.255 cn +203.25.148.0 - 203.25.152.255 au +203.25.153.0 - 203.25.155.255 cn +203.25.156.0 - 203.25.163.255 au +203.25.164.0 - 203.25.164.255 cn +203.25.165.0 - 203.25.165.255 au +203.25.166.0 - 203.25.166.255 cn +203.25.167.0 - 203.25.173.255 au +203.25.174.0 - 203.25.175.255 cn +203.25.176.0 - 203.25.179.255 au +203.25.180.0 - 203.25.180.255 cn +203.25.181.0 - 203.25.181.255 au +203.25.182.0 - 203.25.182.255 cn +203.25.183.0 - 203.25.190.255 au +203.25.191.0 - 203.25.191.255 cn +203.25.192.0 - 203.25.198.255 au +203.25.199.0 - 203.25.200.255 cn +203.25.201.0 - 203.25.201.255 au +203.25.202.0 - 203.25.203.255 cn +203.25.204.0 - 203.25.207.255 au 203.25.208.0 - 203.25.223.255 cn -203.25.224.0 - 203.25.241.255 au +203.25.224.0 - 203.25.228.255 au +203.25.229.0 - 203.25.229.255 cn +203.25.230.0 - 203.25.234.255 au +203.25.235.0 - 203.25.236.255 cn +203.25.237.0 - 203.25.241.255 au 203.25.242.0 - 203.25.242.255 cn -203.25.243.0 - 203.26.64.255 au +203.25.243.0 - 203.26.8.255 au +203.26.9.0 - 203.26.9.135 jp +203.26.9.136 - 203.26.9.143 au +203.26.9.144 - 203.26.10.255 jp +203.26.11.0 - 203.26.11.255 au +203.26.12.0 - 203.26.12.255 cn +203.26.13.0 - 203.26.33.255 au +203.26.34.0 - 203.26.34.255 cn +203.26.35.0 - 203.26.48.255 au +203.26.49.0 - 203.26.50.255 cn +203.26.51.0 - 203.26.54.255 au +203.26.55.0 - 203.26.57.255 cn +203.26.58.0 - 203.26.59.255 au +203.26.60.0 - 203.26.60.255 cn +203.26.61.0 - 203.26.64.255 au 203.26.65.0 - 203.26.65.255 cn -203.26.66.0 - 203.26.76.255 au +203.26.66.0 - 203.26.67.255 au +203.26.68.0 - 203.26.68.255 cn +203.26.69.0 - 203.26.75.255 au +203.26.76.0 - 203.26.76.255 cn 203.26.77.0 - 203.26.77.255 pk 203.26.78.0 - 203.26.79.255 au 203.26.80.0 - 203.26.80.255 cn -203.26.81.0 - 203.26.101.255 au +203.26.81.0 - 203.26.83.255 au +203.26.84.0 - 203.26.84.255 cn +203.26.85.0 - 203.26.96.255 au +203.26.97.0 - 203.26.97.255 cn +203.26.98.0 - 203.26.101.255 au 203.26.102.0 - 203.26.103.255 cn 203.26.104.0 - 203.26.114.255 au -203.26.115.0 - 203.26.115.255 cn -203.26.116.0 - 203.26.172.255 au +203.26.115.0 - 203.26.116.255 cn +203.26.117.0 - 203.26.128.255 au +203.26.129.0 - 203.26.129.255 cn +203.26.130.0 - 203.26.142.255 au +203.26.143.0 - 203.26.144.255 cn +203.26.145.0 - 203.26.147.255 au +203.26.148.0 - 203.26.149.255 cn +203.26.150.0 - 203.26.153.255 au +203.26.154.0 - 203.26.154.255 cn +203.26.155.0 - 203.26.157.255 au +203.26.158.0 - 203.26.159.255 cn +203.26.160.0 - 203.26.169.255 au +203.26.170.0 - 203.26.170.255 cn +203.26.171.0 - 203.26.172.255 au 203.26.173.0 - 203.26.173.255 cn -203.26.174.0 - 203.26.178.255 au +203.26.174.0 - 203.26.174.255 au +203.26.175.0 - 203.26.175.255 jp +203.26.176.0 - 203.26.176.255 cn +203.26.177.0 - 203.26.178.255 au 203.26.179.0 - 203.26.179.255 nz -203.26.180.0 - 203.27.5.255 au +203.26.180.0 - 203.26.184.255 au +203.26.185.0 - 203.26.185.255 cn +203.26.186.0 - 203.26.201.255 au +203.26.202.0 - 203.26.203.255 cn +203.26.204.0 - 203.26.209.255 au +203.26.210.0 - 203.26.210.255 cn +203.26.211.0 - 203.26.213.255 au +203.26.214.0 - 203.26.214.255 cn +203.26.215.0 - 203.26.221.255 au +203.26.222.0 - 203.26.222.255 cn +203.26.223.0 - 203.26.223.255 au +203.26.224.0 - 203.26.224.255 cn +203.26.225.0 - 203.26.227.255 au +203.26.228.0 - 203.26.228.255 cn +203.26.229.0 - 203.26.231.255 au +203.26.232.0 - 203.26.232.255 cn +203.26.233.0 - 203.26.255.255 au +203.27.0.0 - 203.27.0.255 cn +203.27.1.0 - 203.27.5.255 au 203.27.6.0 - 203.27.7.255 id 203.27.8.0 - 203.27.9.255 au 203.27.10.0 - 203.27.10.255 cn -203.27.11.0 - 203.27.116.255 au +203.27.11.0 - 203.27.14.255 au +203.27.15.0 - 203.27.16.255 cn +203.27.17.0 - 203.27.19.255 au +203.27.20.0 - 203.27.20.255 cn +203.27.21.0 - 203.27.21.255 au +203.27.22.0 - 203.27.23.255 cn +203.27.24.0 - 203.27.39.255 au +203.27.40.0 - 203.27.40.255 cn +203.27.41.0 - 203.27.44.255 au +203.27.45.0 - 203.27.45.255 cn +203.27.46.0 - 203.27.52.255 au +203.27.53.0 - 203.27.53.255 cn +203.27.54.0 - 203.27.64.255 au +203.27.65.0 - 203.27.66.255 cn +203.27.67.0 - 203.27.67.255 nz +203.27.68.0 - 203.27.68.255 au +203.27.69.0 - 203.27.69.255 jp +203.27.70.0 - 203.27.80.255 au +203.27.81.0 - 203.27.81.255 cn +203.27.82.0 - 203.27.87.255 au +203.27.88.0 - 203.27.88.255 cn +203.27.89.0 - 203.27.101.255 au +203.27.102.0 - 203.27.102.255 cn +203.27.103.0 - 203.27.108.255 au +203.27.109.0 - 203.27.109.255 cn +203.27.110.0 - 203.27.116.255 au 203.27.117.0 - 203.27.117.255 cn -203.27.118.0 - 203.27.122.255 au -203.27.123.0 - 203.27.123.255 cn -203.27.124.0 - 203.27.228.255 au +203.27.118.0 - 203.27.120.255 au +203.27.121.0 - 203.27.123.255 cn +203.27.124.0 - 203.27.124.255 au +203.27.125.0 - 203.27.125.255 cn +203.27.126.0 - 203.27.199.255 au +203.27.200.0 - 203.27.200.255 cn +203.27.201.0 - 203.27.201.255 au +203.27.202.0 - 203.27.202.255 cn +203.27.203.0 - 203.27.228.255 au 203.27.229.0 - 203.27.229.255 jp -203.27.230.0 - 203.27.234.255 au +203.27.230.0 - 203.27.232.255 au +203.27.233.0 - 203.27.233.255 cn +203.27.234.0 - 203.27.234.255 au 203.27.235.0 - 203.27.235.255 in -203.27.236.0 - 203.27.251.139 au +203.27.236.0 - 203.27.240.255 au +203.27.241.0 - 203.27.241.255 cn +203.27.242.0 - 203.27.249.255 au +203.27.250.0 - 203.27.250.255 cn +203.27.251.0 - 203.27.251.139 au 203.27.251.140 - 203.27.251.160 jp -203.27.251.161 - 203.28.127.255 au +203.27.251.161 - 203.28.9.255 au +203.28.10.0 - 203.28.10.255 cn +203.28.11.0 - 203.28.11.255 au +203.28.12.0 - 203.28.12.255 cn +203.28.13.0 - 203.28.32.255 au +203.28.33.0 - 203.28.35.255 cn +203.28.36.0 - 203.28.42.255 au +203.28.43.0 - 203.28.44.255 cn +203.28.45.0 - 203.28.53.255 au +203.28.54.0 - 203.28.54.255 cn +203.28.55.0 - 203.28.55.255 au +203.28.56.0 - 203.28.56.255 cn +203.28.57.0 - 203.28.72.255 au +203.28.73.0 - 203.28.74.255 cn +203.28.75.0 - 203.28.75.255 au +203.28.76.0 - 203.28.76.255 cn +203.28.77.0 - 203.28.85.255 au +203.28.86.0 - 203.28.86.255 cn +203.28.87.0 - 203.28.87.255 au +203.28.88.0 - 203.28.88.255 cn +203.28.89.0 - 203.28.111.255 au +203.28.112.0 - 203.28.112.255 cn +203.28.113.0 - 203.28.127.255 au 203.28.128.0 - 203.28.129.255 th -203.28.130.0 - 203.29.1.255 au +203.28.130.0 - 203.28.130.255 au +203.28.131.0 - 203.28.131.255 cn +203.28.132.0 - 203.28.135.255 au +203.28.136.0 - 203.28.136.255 cn +203.28.137.0 - 203.28.139.255 au +203.28.140.0 - 203.28.140.255 cn +203.28.141.0 - 203.28.142.255 au +203.28.144.0 - 203.28.144.255 au +203.28.145.0 - 203.28.145.255 cn +203.28.146.0 - 203.28.164.255 au +203.28.165.0 - 203.28.165.255 cn +203.28.166.0 - 203.28.168.255 au +203.28.169.0 - 203.28.170.255 cn +203.28.171.0 - 203.28.177.255 au +203.28.178.0 - 203.28.179.255 cn +203.28.180.0 - 203.28.184.255 au +203.28.185.0 - 203.28.185.255 cn +203.28.186.0 - 203.28.186.255 au +203.28.187.0 - 203.28.187.255 cn +203.28.188.0 - 203.28.195.255 au +203.28.196.0 - 203.28.196.255 cn +203.28.197.0 - 203.28.225.255 au +203.28.226.0 - 203.28.227.255 cn +203.28.228.0 - 203.28.238.255 au +203.28.239.0 - 203.28.239.255 cn +203.28.240.0 - 203.29.1.255 au 203.29.2.0 - 203.29.2.255 cn -203.29.3.0 - 203.29.13.255 au -203.29.14.0 - 203.29.14.255 cn +203.29.3.0 - 203.29.7.255 au +203.29.8.0 - 203.29.9.255 cn +203.29.10.0 - 203.29.12.255 au +203.29.13.0 - 203.29.14.255 cn 203.29.15.0 - 203.29.25.255 au 203.29.26.0 - 203.29.27.255 id 203.29.28.0 - 203.29.28.255 cn -203.29.29.0 - 203.29.102.255 au +203.29.29.0 - 203.29.45.255 au +203.29.46.0 - 203.29.46.255 cn +203.29.47.0 - 203.29.56.255 au +203.29.57.0 - 203.29.57.255 cn +203.29.58.0 - 203.29.60.255 au +203.29.61.0 - 203.29.61.255 cn +203.29.62.0 - 203.29.62.255 au +203.29.63.0 - 203.29.63.255 cn +203.29.64.0 - 203.29.68.255 au +203.29.69.0 - 203.29.69.255 cn +203.29.70.0 - 203.29.72.255 au +203.29.73.0 - 203.29.73.255 cn +203.29.74.0 - 203.29.80.255 au +203.29.81.0 - 203.29.81.255 cn +203.29.82.0 - 203.29.89.255 au +203.29.90.0 - 203.29.90.255 cn +203.29.91.0 - 203.29.94.255 au +203.29.95.0 - 203.29.95.255 cn +203.29.96.0 - 203.29.99.255 au +203.29.100.0 - 203.29.100.255 cn +203.29.101.0 - 203.29.102.255 au 203.29.103.0 - 203.29.103.255 cn 203.29.104.0 - 203.29.111.255 au 203.29.112.0 - 203.29.112.255 cn -203.29.113.0 - 203.29.204.255 au +203.29.113.0 - 203.29.119.255 au +203.29.120.0 - 203.29.123.255 cn +203.29.124.0 - 203.29.181.255 au +203.29.182.0 - 203.29.183.255 cn +203.29.184.0 - 203.29.186.255 au +203.29.187.0 - 203.29.187.255 cn +203.29.188.0 - 203.29.188.255 au +203.29.189.0 - 203.29.190.255 cn +203.29.191.0 - 203.29.204.255 au 203.29.205.0 - 203.29.205.255 cn 203.29.206.0 - 203.29.209.255 au 203.29.210.0 - 203.29.210.255 cn -203.29.211.0 - 203.29.221.255 au +203.29.211.0 - 203.29.216.255 au +203.29.217.0 - 203.29.217.255 cn +203.29.218.0 - 203.29.221.255 au 203.29.222.0 - 203.29.222.255 hk -203.29.223.0 - 203.30.26.255 au +203.29.223.0 - 203.29.226.255 au +203.29.227.0 - 203.29.227.255 cn +203.29.228.0 - 203.29.230.255 au +203.29.231.0 - 203.29.231.255 cn +203.29.232.0 - 203.29.232.255 au +203.29.233.0 - 203.29.234.255 cn +203.29.235.0 - 203.29.247.255 au +203.29.248.0 - 203.29.248.255 cn +203.29.249.0 - 203.29.253.255 au +203.29.254.0 - 203.29.255.255 cn +203.30.0.0 - 203.30.15.255 au +203.30.16.0 - 203.30.17.255 cn +203.30.18.0 - 203.30.24.255 au +203.30.25.0 - 203.30.25.255 cn +203.30.26.0 - 203.30.26.255 au 203.30.27.0 - 203.30.27.255 cn -203.30.28.0 - 203.30.37.255 au +203.30.28.0 - 203.30.28.255 au +203.30.29.0 - 203.30.29.255 cn +203.30.30.0 - 203.30.37.255 au 203.30.38.0 - 203.30.39.255 sg 203.30.40.0 - 203.30.47.255 au 203.30.48.0 - 203.30.49.255 hk -203.30.50.0 - 203.30.151.255 au +203.30.50.0 - 203.30.65.255 au +203.30.66.0 - 203.30.66.255 cn +203.30.67.0 - 203.30.80.255 au +203.30.81.0 - 203.30.81.255 cn +203.30.82.0 - 203.30.86.255 au +203.30.87.0 - 203.30.87.255 cn +203.30.88.0 - 203.30.110.255 au +203.30.111.0 - 203.30.111.255 cn +203.30.112.0 - 203.30.120.255 au +203.30.121.0 - 203.30.121.255 cn +203.30.122.0 - 203.30.122.255 au +203.30.123.0 - 203.30.123.255 cn +203.30.124.0 - 203.30.151.255 au 203.30.152.0 - 203.30.152.255 cn 203.30.153.0 - 203.30.155.255 au 203.30.156.0 - 203.30.156.255 cn -203.30.157.0 - 203.30.173.255 au +203.30.157.0 - 203.30.161.255 au +203.30.162.0 - 203.30.162.255 cn +203.30.163.0 - 203.30.172.255 au +203.30.173.0 - 203.30.173.255 cn 203.30.174.0 - 203.30.174.255 nz -203.30.175.0 - 203.30.193.255 au +203.30.175.0 - 203.30.175.255 cn +203.30.176.0 - 203.30.186.255 au +203.30.187.0 - 203.30.187.255 cn +203.30.188.0 - 203.30.193.255 au 203.30.194.0 - 203.30.194.255 cn -203.30.195.0 - 203.30.219.255 au +203.30.195.0 - 203.30.216.255 au +203.30.217.0 - 203.30.217.255 cn +203.30.218.0 - 203.30.219.255 au 203.30.220.0 - 203.30.220.255 cn -203.30.221.0 - 203.30.234.255 au +203.30.222.0 - 203.30.222.255 cn +203.30.223.0 - 203.30.231.255 au +203.30.232.0 - 203.30.233.255 cn +203.30.234.0 - 203.30.234.255 au 203.30.235.0 - 203.30.235.255 cn 203.30.236.0 - 203.30.237.255 id -203.30.238.0 - 203.30.253.255 au +203.30.238.0 - 203.30.239.255 au +203.30.240.0 - 203.30.241.255 cn +203.30.242.0 - 203.30.245.255 au +203.30.246.0 - 203.30.246.255 cn +203.30.247.0 - 203.30.249.255 au +203.30.250.0 - 203.30.251.255 cn +203.30.252.0 - 203.30.253.255 au 203.30.254.0 - 203.30.255.255 id 203.31.0.0 - 203.31.7.255 au 203.31.8.0 - 203.31.9.255 in 203.31.10.0 - 203.31.31.255 au 203.31.32.0 - 203.31.33.255 hk -203.31.34.0 - 203.31.68.255 au +203.31.34.0 - 203.31.44.255 au +203.31.45.0 - 203.31.46.255 cn +203.31.47.0 - 203.31.48.255 au +203.31.49.0 - 203.31.49.255 cn +203.31.50.0 - 203.31.50.255 au +203.31.51.0 - 203.31.51.255 cn +203.31.52.0 - 203.31.53.255 au +203.31.54.0 - 203.31.55.255 cn +203.31.56.0 - 203.31.68.255 au 203.31.69.0 - 203.31.69.255 cn -203.31.70.0 - 203.31.87.255 au +203.31.70.0 - 203.31.71.255 au +203.31.72.0 - 203.31.72.255 cn +203.31.73.0 - 203.31.79.255 au +203.31.80.0 - 203.31.80.255 cn +203.31.81.0 - 203.31.84.255 au +203.31.85.0 - 203.31.85.255 cn +203.31.86.0 - 203.31.87.255 au 203.31.88.0 - 203.31.89.255 us -203.31.90.0 - 203.31.119.255 au -203.31.120.0 - 203.31.120.255 us -203.31.121.0 - 203.31.161.255 au +203.31.90.0 - 203.31.96.255 au +203.31.97.0 - 203.31.97.255 cn +203.31.98.0 - 203.31.104.255 au +203.31.105.0 - 203.31.106.255 cn +203.31.107.0 - 203.31.107.255 au +203.31.108.0 - 203.31.109.255 cn +203.31.110.0 - 203.31.123.255 au +203.31.124.0 - 203.31.124.255 cn +203.31.125.0 - 203.31.161.255 au 203.31.162.0 - 203.31.162.255 cn 203.31.163.0 - 203.31.163.255 au 203.31.164.0 - 203.31.165.255 id -203.31.166.0 - 203.31.219.255 au +203.31.166.0 - 203.31.173.255 au +203.31.174.0 - 203.31.174.255 cn +203.31.175.0 - 203.31.176.255 au +203.31.177.0 - 203.31.177.255 cn +203.31.178.0 - 203.31.180.255 au +203.31.181.0 - 203.31.181.255 cn +203.31.182.0 - 203.31.186.255 au +203.31.187.0 - 203.31.187.255 cn +203.31.188.0 - 203.31.188.255 au +203.31.189.0 - 203.31.189.255 cn +203.31.190.0 - 203.31.203.255 au +203.31.204.0 - 203.31.204.255 cn +203.31.205.0 - 203.31.219.255 au 203.31.220.0 - 203.31.220.255 cn -203.31.221.0 - 203.31.233.255 au -203.31.234.0 - 203.31.234.255 gb -203.31.235.0 - 203.32.3.255 au +203.31.221.0 - 203.31.221.255 au +203.31.222.0 - 203.31.223.255 cn +203.31.224.0 - 203.31.224.255 au +203.31.225.0 - 203.31.225.255 cn +203.31.226.0 - 203.31.228.255 au +203.31.229.0 - 203.31.229.255 cn +203.31.230.0 - 203.31.233.255 au +203.31.234.0 - 203.31.234.255 sg +203.31.235.0 - 203.31.247.255 au +203.31.248.0 - 203.31.249.255 cn +203.31.250.0 - 203.31.252.255 au +203.31.253.0 - 203.31.253.255 cn +203.31.254.0 - 203.32.3.255 au 203.32.4.0 - 203.32.5.255 in 203.32.6.0 - 203.32.19.255 au 203.32.20.0 - 203.32.20.255 cn -203.32.21.0 - 203.32.61.255 au +203.32.21.0 - 203.32.47.255 au +203.32.48.0 - 203.32.49.255 cn +203.32.50.0 - 203.32.55.255 au +203.32.56.0 - 203.32.56.255 cn +203.32.57.0 - 203.32.59.255 au +203.32.60.0 - 203.32.60.255 cn +203.32.61.0 - 203.32.61.255 au 203.32.62.0 - 203.32.62.255 cn -203.32.63.0 - 203.32.129.255 au +203.32.63.0 - 203.32.67.255 au +203.32.68.0 - 203.32.69.255 cn +203.32.70.0 - 203.32.75.255 au +203.32.76.0 - 203.32.76.255 cn +203.32.77.0 - 203.32.80.255 au +203.32.81.0 - 203.32.81.255 cn +203.32.82.0 - 203.32.83.255 au +203.32.84.0 - 203.32.85.255 cn +203.32.88.0 - 203.32.94.255 au +203.32.95.0 - 203.32.95.255 cn +203.32.96.0 - 203.32.101.255 au +203.32.102.0 - 203.32.102.255 cn +203.32.103.0 - 203.32.104.255 au +203.32.105.0 - 203.32.105.255 cn +203.32.106.0 - 203.32.129.255 au 203.32.130.0 - 203.32.130.255 cn -203.32.131.0 - 203.32.139.255 au +203.32.131.0 - 203.32.132.255 au +203.32.133.0 - 203.32.133.255 cn +203.32.134.0 - 203.32.139.255 au 203.32.140.0 - 203.32.140.255 cn -203.32.141.0 - 203.32.185.255 au +203.32.141.0 - 203.32.151.255 au +203.32.152.0 - 203.32.152.255 cn +203.32.153.0 - 203.32.185.255 au 203.32.186.0 - 203.32.187.255 cn -203.32.188.0 - 203.32.220.255 au +203.32.188.0 - 203.32.191.255 au +203.32.192.0 - 203.32.192.255 cn +203.32.193.0 - 203.32.195.255 au +203.32.196.0 - 203.32.196.255 cn +203.32.197.0 - 203.32.202.255 au +203.32.203.0 - 203.32.205.255 cn +203.32.206.0 - 203.32.211.255 au +203.32.212.0 - 203.32.212.255 cn +203.32.213.0 - 203.32.220.255 au 203.32.221.0 - 203.32.221.255 in -203.32.222.0 - 203.33.155.255 au +203.32.222.0 - 203.33.3.255 au +203.33.4.0 - 203.33.4.255 cn +203.33.5.0 - 203.33.6.255 au +203.33.7.0 - 203.33.7.255 cn +203.33.8.0 - 203.33.11.255 sg +203.33.12.0 - 203.33.15.255 hk +203.33.16.0 - 203.33.20.255 au +203.33.21.0 - 203.33.21.255 cn +203.33.22.0 - 203.33.25.255 au +203.33.26.0 - 203.33.26.255 cn +203.33.27.0 - 203.33.31.255 au +203.33.32.0 - 203.33.32.255 cn +203.33.33.0 - 203.33.62.255 au +203.33.63.0 - 203.33.64.255 cn +203.33.65.0 - 203.33.66.255 au +203.33.67.0 - 203.33.68.255 cn +203.33.69.0 - 203.33.72.255 au +203.33.73.0 - 203.33.73.255 cn +203.33.74.0 - 203.33.78.255 au +203.33.79.0 - 203.33.79.255 cn +203.33.80.0 - 203.33.99.255 au +203.33.100.0 - 203.33.100.255 cn +203.33.101.0 - 203.33.121.255 au +203.33.122.0 - 203.33.122.255 cn +203.33.123.0 - 203.33.128.255 au +203.33.129.0 - 203.33.129.255 cn +203.33.130.0 - 203.33.130.255 au +203.33.131.0 - 203.33.131.255 cn +203.33.132.0 - 203.33.144.255 au +203.33.145.0 - 203.33.145.255 cn +203.33.146.0 - 203.33.155.255 au 203.33.156.0 - 203.33.156.255 cn -203.33.157.0 - 203.33.188.255 au +203.33.157.0 - 203.33.157.255 au +203.33.158.0 - 203.33.159.255 cn +203.33.160.0 - 203.33.173.255 au +203.33.174.0 - 203.33.174.255 cn +203.33.175.0 - 203.33.184.255 au +203.33.185.0 - 203.33.185.255 cn +203.33.186.0 - 203.33.188.255 au 203.33.189.0 - 203.33.189.255 kh 203.33.190.0 - 203.33.195.255 au 203.33.196.0 - 203.33.196.255 ph 203.33.197.0 - 203.33.197.255 au 203.33.198.0 - 203.33.199.255 in -203.33.200.0 - 203.33.203.255 au -203.33.204.0 - 203.33.204.255 cn -203.33.205.0 - 203.33.223.255 au -203.33.224.0 - 203.33.224.255 cn -203.33.225.0 - 203.33.232.255 au +203.33.200.0 - 203.33.200.255 cn +203.33.201.0 - 203.33.201.255 au +203.33.202.0 - 203.33.204.255 cn +203.33.205.0 - 203.33.205.255 au +203.33.206.0 - 203.33.207.255 cn +203.33.208.0 - 203.33.213.255 au +203.33.214.0 - 203.33.215.255 cn +203.33.216.0 - 203.33.223.255 au +203.33.224.0 - 203.33.226.255 cn +203.33.227.0 - 203.33.232.255 au 203.33.233.0 - 203.33.233.255 cn 203.33.234.0 - 203.33.239.255 au 203.33.240.0 - 203.33.240.255 th -203.33.241.0 - 203.34.26.255 au +203.33.241.0 - 203.33.242.255 au +203.33.243.0 - 203.33.243.255 cn +203.33.244.0 - 203.33.249.255 au +203.33.250.0 - 203.33.250.255 cn +203.33.251.0 - 203.34.3.255 au +203.34.4.0 - 203.34.4.255 cn +203.34.5.0 - 203.34.20.255 au +203.34.21.0 - 203.34.21.255 cn +203.34.22.0 - 203.34.26.255 au 203.34.27.0 - 203.34.27.255 cn 203.34.28.0 - 203.34.36.255 au 203.34.37.0 - 203.34.37.255 mn -203.34.38.0 - 203.34.68.255 au +203.34.38.0 - 203.34.38.255 au +203.34.39.0 - 203.34.39.255 cn +203.34.40.0 - 203.34.47.255 au +203.34.48.0 - 203.34.49.255 cn +203.34.50.0 - 203.34.53.255 au +203.34.54.0 - 203.34.54.255 cn +203.34.55.0 - 203.34.55.255 au +203.34.56.0 - 203.34.57.255 cn +203.34.58.0 - 203.34.66.255 au +203.34.67.0 - 203.34.67.255 cn +203.34.68.0 - 203.34.68.255 jp 203.34.69.0 - 203.34.69.255 cn -203.34.70.0 - 203.34.80.255 au +203.34.70.0 - 203.34.75.255 au +203.34.76.0 - 203.34.76.255 cn +203.34.77.0 - 203.34.80.255 au 203.34.81.0 - 203.34.81.255 jp -203.34.82.0 - 203.34.112.255 au +203.34.83.0 - 203.34.91.255 au +203.34.92.0 - 203.34.92.255 cn +203.34.93.0 - 203.34.105.255 au +203.34.106.0 - 203.34.106.255 cn +203.34.107.0 - 203.34.112.255 au 203.34.113.0 - 203.34.113.255 cn 203.34.114.0 - 203.34.115.255 au -203.34.116.0 - 203.34.117.255 in +203.34.116.0 - 203.34.116.255 lk +203.34.117.0 - 203.34.117.255 in 203.34.118.0 - 203.34.119.255 id 203.34.120.0 - 203.34.143.255 au 203.34.144.0 - 203.34.144.255 vn 203.34.145.0 - 203.34.146.255 au 203.34.147.0 - 203.34.147.255 cn -203.34.148.0 - 203.34.151.255 au -203.34.152.0 - 203.34.153.255 sg -203.34.154.0 - 203.34.154.255 hk -203.34.155.0 - 203.34.239.255 au +203.34.148.0 - 203.34.149.255 au +203.34.150.0 - 203.34.150.255 cn +203.34.151.0 - 203.34.151.255 au +203.34.152.0 - 203.34.153.255 cn +203.34.155.0 - 203.34.160.255 au +203.34.161.0 - 203.34.162.255 cn +203.34.163.0 - 203.34.186.255 au +203.34.187.0 - 203.34.187.255 cn +203.34.188.0 - 203.34.191.255 au +203.34.192.0 - 203.34.199.255 hk +203.34.200.0 - 203.34.203.255 au +203.34.204.0 - 203.34.207.255 cn +203.34.208.0 - 203.34.231.255 au +203.34.232.0 - 203.34.232.255 cn +203.34.233.0 - 203.34.239.255 au 203.34.240.0 - 203.34.240.255 cn -203.34.241.0 - 203.34.245.255 au +203.34.242.0 - 203.34.242.255 cn +203.34.243.0 - 203.34.244.255 au +203.34.245.0 - 203.34.245.255 cn 203.34.246.0 - 203.34.246.255 ph -203.34.247.0 - 203.55.66.255 au +203.34.247.0 - 203.34.250.255 au +203.34.251.0 - 203.34.251.255 cn +203.34.252.0 - 203.55.1.255 au +203.55.2.0 - 203.55.4.255 cn +203.55.5.0 - 203.55.9.255 au +203.55.10.0 - 203.55.10.255 cn +203.55.11.0 - 203.55.12.255 au +203.55.13.0 - 203.55.13.255 cn +203.55.14.0 - 203.55.21.255 au +203.55.22.0 - 203.55.22.255 cn +203.55.23.0 - 203.55.29.255 au +203.55.30.0 - 203.55.30.255 cn +203.55.31.0 - 203.55.66.255 au 203.55.67.0 - 203.55.67.255 ph -203.55.68.0 - 203.55.115.255 au +203.55.68.0 - 203.55.92.255 au +203.55.93.0 - 203.55.93.255 cn +203.55.94.0 - 203.55.100.255 au +203.55.101.0 - 203.55.101.255 cn +203.55.102.0 - 203.55.108.255 au +203.55.109.0 - 203.55.110.255 cn +203.55.111.0 - 203.55.115.255 au 203.55.116.0 - 203.55.117.255 cn -203.55.118.0 - 203.55.152.255 au +203.55.118.0 - 203.55.118.255 au +203.55.119.0 - 203.55.119.255 cn +203.55.120.0 - 203.55.127.255 au +203.55.128.0 - 203.55.129.255 cn +203.55.130.0 - 203.55.145.255 au +203.55.146.0 - 203.55.147.255 cn +203.55.148.0 - 203.55.152.255 au 203.55.153.0 - 203.55.153.255 pl 203.55.154.0 - 203.55.159.255 au 203.55.160.0 - 203.55.160.255 in 203.55.161.0 - 203.55.172.255 au 203.55.173.0 - 203.55.173.255 in -203.55.174.0 - 203.55.180.255 au -203.55.181.0 - 203.55.181.255 ap -203.55.182.0 - 203.55.195.255 au +203.55.174.0 - 203.55.191.255 au +203.55.192.0 - 203.55.192.255 cn +203.55.193.0 - 203.55.195.255 au 203.55.196.0 - 203.55.196.255 cn 203.55.197.0 - 203.55.217.255 au -203.55.218.0 - 203.55.218.255 cn -203.55.219.0 - 203.56.84.255 au -203.56.85.0 - 203.56.85.255 cn -203.56.86.0 - 203.56.120.255 au +203.55.218.0 - 203.55.219.255 cn +203.55.220.0 - 203.55.220.255 au +203.55.221.0 - 203.55.221.255 cn +203.55.222.0 - 203.55.223.255 au +203.55.224.0 - 203.55.224.255 cn +203.55.225.0 - 203.56.0.255 au +203.56.1.0 - 203.56.1.255 cn +203.56.2.0 - 203.56.3.255 au +203.56.4.0 - 203.56.4.255 cn +203.56.5.0 - 203.56.11.255 au +203.56.12.0 - 203.56.12.255 cn +203.56.13.0 - 203.56.23.255 au +203.56.24.0 - 203.56.24.255 cn +203.56.25.0 - 203.56.31.255 au +203.56.32.0 - 203.56.33.255 nz +203.56.34.0 - 203.56.37.255 au +203.56.38.0 - 203.56.38.255 cn +203.56.39.0 - 203.56.39.255 au +203.56.40.0 - 203.56.40.255 cn +203.56.41.0 - 203.56.45.255 au +203.56.46.0 - 203.56.46.255 cn +203.56.47.0 - 203.56.48.0 au +203.56.48.1 - 203.56.55.255 hk +203.56.56.0 - 203.56.67.255 au +203.56.68.0 - 203.56.69.255 cn +203.56.70.0 - 203.56.81.255 au +203.56.82.0 - 203.56.85.255 cn +203.56.86.0 - 203.56.86.255 au +203.56.87.0 - 203.56.87.255 hk +203.56.88.0 - 203.56.89.255 au +203.56.90.0 - 203.56.90.255 hk +203.56.91.0 - 203.56.94.255 au +203.56.95.0 - 203.56.95.255 cn +203.56.96.0 - 203.56.109.255 au +203.56.110.0 - 203.56.110.255 cn +203.56.111.0 - 203.56.120.255 au 203.56.121.0 - 203.56.121.255 cn -203.56.122.0 - 203.56.168.255 au +203.56.122.0 - 203.56.160.255 au +203.56.161.0 - 203.56.161.255 cn +203.56.162.0 - 203.56.168.255 au 203.56.169.0 - 203.56.169.255 cn -203.56.170.0 - 203.56.182.255 au -203.56.183.0 - 203.56.183.255 sg -203.56.184.0 - 203.56.207.255 au +203.56.170.0 - 203.56.171.255 au +203.56.172.0 - 203.56.173.255 cn +203.56.174.0 - 203.56.174.255 au +203.56.175.0 - 203.56.175.255 cn +203.56.176.0 - 203.56.182.255 au +203.56.183.0 - 203.56.183.255 cn +203.56.184.0 - 203.56.184.255 au +203.56.185.0 - 203.56.185.255 cn +203.56.186.0 - 203.56.186.255 au +203.56.187.0 - 203.56.187.255 cn +203.56.188.0 - 203.56.191.255 au +203.56.192.0 - 203.56.192.255 cn +203.56.193.0 - 203.56.197.255 au +203.56.198.0 - 203.56.198.255 cn +203.56.199.0 - 203.56.200.255 au +203.56.201.0 - 203.56.201.255 cn +203.56.202.0 - 203.56.207.255 au 203.56.208.0 - 203.56.210.255 cn -203.56.211.0 - 203.56.234.255 au -203.56.235.0 - 203.56.235.255 us -203.56.236.0 - 203.56.240.255 au -203.56.241.0 - 203.56.241.255 in -203.56.242.0 - 203.56.252.255 au +203.56.211.0 - 203.56.213.255 au +203.56.214.0 - 203.56.214.255 cn +203.56.215.0 - 203.56.215.255 au +203.56.216.0 - 203.56.216.255 cn +203.56.217.0 - 203.56.226.255 au +203.56.227.0 - 203.56.228.255 cn +203.56.229.0 - 203.56.230.255 au +203.56.232.0 - 203.56.232.255 cn +203.56.233.0 - 203.56.239.255 au +203.56.240.0 - 203.56.240.255 cn +203.56.241.0 - 203.56.241.255 ph +203.56.242.0 - 203.56.251.255 au +203.56.252.0 - 203.56.252.255 cn 203.56.253.0 - 203.56.253.255 hk -203.56.254.0 - 203.56.255.223 au -203.56.255.224 - 203.56.255.239 in -203.56.255.240 - 203.57.23.255 au +203.56.254.0 - 203.56.254.255 cn +203.56.255.0 - 203.57.4.255 au +203.57.5.0 - 203.57.6.255 cn +203.57.7.0 - 203.57.11.255 au +203.57.12.0 - 203.57.13.255 cn +203.57.14.0 - 203.57.23.255 au 203.57.24.0 - 203.57.25.255 id -203.57.26.0 - 203.57.38.255 au +203.57.26.0 - 203.57.27.255 au +203.57.28.0 - 203.57.28.255 cn +203.57.29.0 - 203.57.38.255 au 203.57.39.0 - 203.57.39.255 cn 203.57.40.0 - 203.57.45.255 au 203.57.46.0 - 203.57.46.255 cn -203.57.47.0 - 203.57.144.255 au +203.57.47.0 - 203.57.57.255 au +203.57.58.0 - 203.57.58.255 cn +203.57.59.0 - 203.57.60.255 au +203.57.61.0 - 203.57.61.255 cn +203.57.62.0 - 203.57.65.255 au +203.57.66.0 - 203.57.66.255 cn +203.57.67.0 - 203.57.68.255 au +203.57.69.0 - 203.57.71.255 cn +203.57.72.0 - 203.57.72.255 au +203.57.73.0 - 203.57.73.255 cn +203.57.74.0 - 203.57.89.255 au +203.57.90.0 - 203.57.90.255 cn +203.57.91.0 - 203.57.100.255 au +203.57.101.0 - 203.57.101.255 cn +203.57.102.0 - 203.57.108.255 au +203.57.109.0 - 203.57.109.255 cn +203.57.110.0 - 203.57.122.255 au +203.57.123.0 - 203.57.123.255 cn +203.57.124.0 - 203.57.144.255 au 203.57.145.0 - 203.57.145.255 nz 203.57.146.0 - 203.57.156.255 au 203.57.157.0 - 203.57.157.255 cn -203.57.158.0 - 203.57.221.255 au +203.57.158.0 - 203.57.199.255 au +203.57.200.0 - 203.57.200.255 cn +203.57.201.0 - 203.57.201.255 au +203.57.202.0 - 203.57.202.255 cn +203.57.203.0 - 203.57.205.255 au +203.57.206.0 - 203.57.206.255 cn +203.57.207.0 - 203.57.221.255 au 203.57.222.0 - 203.57.222.255 cn -203.57.223.0 - 203.57.248.255 au +203.57.223.0 - 203.57.223.255 au +203.57.224.0 - 203.57.239.255 cn +203.57.240.0 - 203.57.245.255 au +203.57.246.0 - 203.57.247.255 cn +203.57.248.0 - 203.57.248.255 au 203.57.249.0 - 203.57.249.255 cn -203.57.250.0 - 203.62.0.255 au +203.57.250.0 - 203.57.252.255 au +203.57.253.0 - 203.57.255.255 cn +203.58.0.0 - 203.59.255.255 au +203.60.0.0 - 203.60.255.255 hk +203.61.0.0 - 203.62.0.255 au 203.62.1.0 - 203.62.1.255 my 203.62.2.0 - 203.62.2.255 cn -203.62.3.0 - 203.62.151.255 au +203.62.3.0 - 203.62.130.255 au +203.62.131.0 - 203.62.131.255 cn +203.62.132.0 - 203.62.138.255 au +203.62.139.0 - 203.62.139.255 cn +203.62.140.0 - 203.62.147.255 au +203.62.148.0 - 203.62.150.255 jp +203.62.151.0 - 203.62.151.255 au 203.62.152.0 - 203.62.155.255 th -203.62.156.0 - 203.62.171.255 au +203.62.156.0 - 203.62.160.255 au +203.62.161.0 - 203.62.161.255 cn +203.62.162.0 - 203.62.171.255 au 203.62.172.0 - 203.62.175.255 in 203.62.176.0 - 203.62.194.255 au 203.62.195.0 - 203.62.195.255 sg -203.62.196.0 - 203.62.227.255 au +203.62.196.0 - 203.62.196.255 au +203.62.197.0 - 203.62.197.255 cn +203.62.198.0 - 203.62.207.255 au +203.62.208.0 - 203.62.209.255 gb +203.62.210.0 - 203.62.211.255 au +203.62.212.0 - 203.62.213.255 us +203.62.214.0 - 203.62.227.255 au 203.62.228.0 - 203.62.231.255 cn 203.62.232.0 - 203.62.233.255 au 203.62.234.0 - 203.62.234.255 cn @@ -124246,7 +102873,15 @@ 203.76.168.0 - 203.76.171.255 cn 203.76.172.0 - 203.76.175.255 sg 203.76.176.0 - 203.76.191.255 in -203.76.192.0 - 203.76.255.255 ph +203.76.192.0 - 203.76.207.255 ph +203.76.208.0 - 203.76.219.255 cn +203.76.220.0 - 203.76.223.255 bd +203.76.224.0 - 203.76.227.255 au +203.76.228.0 - 203.76.231.255 in +203.76.232.0 - 203.76.239.255 hk +203.76.240.0 - 203.76.247.255 cn +203.76.248.0 - 203.76.251.255 in +203.76.252.0 - 203.76.255.255 la 203.77.0.0 - 203.77.127.255 tw 203.77.128.0 - 203.77.159.255 hk 203.77.160.0 - 203.77.175.255 au @@ -124254,8 +102889,8 @@ 203.77.177.0 - 203.77.177.255 in 203.77.178.0 - 203.77.178.255 vn 203.77.179.0 - 203.77.179.255 au -203.77.180.0 - 203.77.183.255 hk -203.77.184.0 - 203.77.191.255 us +203.77.180.0 - 203.77.183.255 cn +203.77.184.0 - 203.77.191.255 jp 203.77.192.0 - 203.77.207.255 in 203.77.208.0 - 203.77.255.255 id 203.78.0.0 - 203.78.3.255 tw @@ -124268,7 +102903,10 @@ 203.78.64.0 - 203.78.95.255 hk 203.78.96.0 - 203.78.111.255 th 203.78.112.0 - 203.78.127.255 id -203.78.128.0 - 203.78.159.255 in +203.78.144.0 - 203.78.147.255 bd +203.78.148.0 - 203.78.151.255 sg +203.78.152.0 - 203.78.155.255 mh +203.78.156.0 - 203.78.159.255 cn 203.78.160.0 - 203.78.175.255 np 203.78.176.0 - 203.78.191.255 tw 203.78.192.0 - 203.78.207.255 my @@ -124286,7 +102924,7 @@ 203.79.64.0 - 203.79.127.255 nz 203.79.128.0 - 203.79.255.255 tw 203.80.0.0 - 203.80.3.255 hk -203.80.4.0 - 203.80.5.255 au +203.80.4.0 - 203.80.5.255 cn 203.80.6.0 - 203.80.7.255 jp 203.80.8.0 - 203.80.15.255 id 203.80.16.0 - 203.80.23.255 my @@ -124298,14 +102936,17 @@ 203.80.58.0 - 203.80.59.255 au 203.80.60.0 - 203.80.63.255 nz 203.80.64.0 - 203.80.127.255 hk -203.80.128.0 - 203.80.135.255 pk -203.80.136.0 - 203.80.143.255 ph +203.80.128.0 - 203.80.128.255 pk +203.80.130.0 - 203.80.130.255 pk +203.80.131.0 - 203.80.131.255 sg +203.80.132.0 - 203.80.135.255 cn +203.80.136.0 - 203.80.136.0 jp +203.80.136.1 - 203.80.143.255 hk 203.80.144.0 - 203.80.159.255 cn 203.80.160.0 - 203.80.175.255 au -203.80.176.0 - 203.80.177.191 hk -203.80.177.192 - 203.80.177.255 pk -203.80.178.0 - 203.80.255.255 hk -203.81.0.0 - 203.81.7.255 cn +203.80.176.0 - 203.80.183.255 hk +203.80.184.0 - 203.80.184.255 bd +203.80.185.0 - 203.81.7.255 hk 203.81.8.0 - 203.81.11.255 kr 203.81.12.0 - 203.81.15.255 jp 203.81.16.0 - 203.81.31.255 cn @@ -124318,30 +102959,35 @@ 203.81.176.0 - 203.81.183.255 hk 203.81.184.0 - 203.81.191.255 id 203.81.192.0 - 203.81.239.255 pk +203.81.240.0 - 203.81.243.255 in +203.81.244.0 - 203.81.247.255 cn 203.81.248.0 - 203.81.251.255 id -203.81.252.0 - 203.82.1.255 hk +203.81.252.0 - 203.81.255.255 hk +203.82.0.0 - 203.82.1.255 cn 203.82.2.0 - 203.82.3.255 mv 203.82.4.0 - 203.82.7.255 in -203.82.8.0 - 203.82.15.255 hk -203.82.16.0 - 203.82.23.255 cn -203.82.24.0 - 203.82.31.255 jp +203.82.8.0 - 203.82.23.255 hk +203.82.24.0 - 203.82.27.255 au +203.82.28.0 - 203.82.31.255 hk 203.82.32.0 - 203.82.47.255 ph 203.82.48.0 - 203.82.63.255 pk 203.82.64.0 - 203.82.95.255 my 203.82.96.0 - 203.82.111.255 au -203.82.112.0 - 203.82.159.255 jp +203.82.112.0 - 203.82.127.255 cn +203.82.128.0 - 203.82.159.255 jp 203.82.160.0 - 203.82.191.255 au 203.82.192.0 - 203.82.207.255 bd 203.82.208.0 - 203.82.217.255 au 203.82.218.0 - 203.82.218.255 in 203.82.219.0 - 203.82.221.255 kr 203.82.222.0 - 203.82.223.255 hk -203.82.224.0 - 203.82.239.255 kh +203.82.224.0 - 203.82.239.255 cn 203.82.240.0 - 203.82.247.255 kr -203.82.248.0 - 203.82.249.255 ph -203.82.250.0 - 203.82.251.255 in -203.82.252.0 - 203.83.3.255 hk +203.82.248.0 - 203.82.251.255 in +203.82.252.0 - 203.82.255.255 hk +203.83.0.0 - 203.83.3.255 cn 203.83.4.0 - 203.83.7.255 au +203.83.8.0 - 203.83.15.255 cn 203.83.16.0 - 203.83.23.255 pg 203.83.24.0 - 203.83.47.255 id 203.83.48.0 - 203.83.55.255 io @@ -124350,38 +102996,39 @@ 203.83.128.0 - 203.83.159.255 kr 203.83.160.0 - 203.83.191.255 bd 203.83.192.0 - 203.83.215.255 au -203.83.216.0 - 203.83.217.255 tw +203.83.216.0 - 203.83.217.255 hk 203.83.218.0 - 203.83.218.255 nz 203.83.219.0 - 203.83.219.255 au -203.83.220.0 - 203.83.223.255 jp -203.83.224.0 - 203.83.239.255 au +203.83.220.0 - 203.83.223.255 sg +203.83.224.0 - 203.83.239.255 cn 203.83.240.0 - 203.83.247.255 jp -203.83.248.0 - 203.83.249.255 in +203.83.248.0 - 203.83.249.255 hk 203.83.250.0 - 203.83.250.255 sg 203.83.251.0 - 203.83.251.255 fj 203.83.252.0 - 203.84.63.255 hk 203.84.64.0 - 203.84.127.255 au 203.84.128.0 - 203.84.129.255 hk -203.84.130.0 - 203.84.131.255 tw -203.84.132.0 - 203.84.132.255 ap +203.84.130.0 - 203.84.131.255 sg +203.84.132.0 - 203.84.132.255 au 203.84.133.0 - 203.84.133.255 hk 203.84.134.0 - 203.84.135.255 nz 203.84.136.0 - 203.84.143.255 id 203.84.144.0 - 203.84.151.255 tw 203.84.152.0 - 203.84.159.255 id 203.84.160.0 - 203.84.191.255 ph -203.84.192.0 - 203.84.223.255 ap +203.84.192.0 - 203.84.223.255 hk 203.84.224.0 - 203.84.239.255 au 203.84.240.0 - 203.84.255.255 kr -203.85.0.0 - 203.85.255.255 hk -203.86.0.0 - 203.86.95.255 cn -203.86.96.0 - 203.86.127.255 in +203.85.0.0 - 203.85.36.255 hk +203.85.37.0 - 203.85.39.255 sg +203.85.40.0 - 203.85.255.255 hk +203.86.0.0 - 203.86.127.255 cn 203.86.128.0 - 203.86.191.255 hk 203.86.192.0 - 203.86.207.255 nz 203.86.208.0 - 203.86.223.255 au 203.86.224.0 - 203.86.231.255 jp 203.86.232.0 - 203.86.239.255 hk -203.86.240.0 - 203.86.250.255 jp +203.86.240.0 - 203.86.249.255 jp 203.86.251.0 - 203.86.251.255 au 203.86.252.0 - 203.86.253.255 hk 203.86.254.0 - 203.86.255.255 cn @@ -124389,106 +103036,7 @@ 203.87.128.0 - 203.87.255.255 ph 203.88.0.0 - 203.88.31.255 in 203.88.32.0 - 203.88.63.255 cn -203.88.64.0 - 203.88.65.255 hk -203.88.66.0 - 203.88.66.15 id -203.88.66.16 - 203.88.66.31 hk -203.88.66.32 - 203.88.66.47 id -203.88.66.48 - 203.88.66.63 hk -203.88.66.64 - 203.88.66.71 af -203.88.66.72 - 203.88.66.95 hk -203.88.66.96 - 203.88.66.103 my -203.88.66.104 - 203.88.66.111 hk -203.88.66.112 - 203.88.66.119 id -203.88.66.120 - 203.88.66.123 np -203.88.66.124 - 203.88.66.127 pk -203.88.66.128 - 203.88.66.151 id -203.88.66.152 - 203.88.66.159 my -203.88.66.160 - 203.88.66.167 af -203.88.66.168 - 203.88.66.175 my -203.88.66.176 - 203.88.66.183 id -203.88.66.184 - 203.88.66.191 pk -203.88.66.192 - 203.88.66.199 my -203.88.66.200 - 203.88.66.223 pk -203.88.66.224 - 203.88.66.231 hk -203.88.66.232 - 203.88.66.255 my -203.88.67.0 - 203.88.67.31 bd -203.88.67.32 - 203.88.67.63 hk -203.88.67.64 - 203.88.67.127 bd -203.88.67.128 - 203.88.67.135 id -203.88.67.136 - 203.88.67.143 hk -203.88.67.144 - 203.88.67.159 np -203.88.67.160 - 203.88.67.175 hk -203.88.67.176 - 203.88.67.191 id -203.88.67.192 - 203.88.67.255 bd -203.88.68.0 - 203.88.68.31 hk -203.88.68.32 - 203.88.68.63 bd -203.88.68.64 - 203.88.68.127 hk -203.88.68.128 - 203.88.68.255 bd -203.88.69.0 - 203.88.69.255 id -203.88.70.0 - 203.88.70.95 bd -203.88.70.96 - 203.88.70.127 hk -203.88.70.128 - 203.88.71.127 bd -203.88.71.128 - 203.88.71.255 hk -203.88.72.0 - 203.88.72.255 np -203.88.73.0 - 203.88.78.63 bd -203.88.78.64 - 203.88.78.127 pk -203.88.78.128 - 203.88.78.255 bd -203.88.79.0 - 203.88.80.63 hk -203.88.80.64 - 203.88.80.95 ma -203.88.80.96 - 203.88.80.111 pk -203.88.80.112 - 203.88.80.127 ma -203.88.80.128 - 203.88.80.255 hk -203.88.81.0 - 203.88.82.7 my -203.88.82.8 - 203.88.82.15 th -203.88.82.16 - 203.88.82.39 id -203.88.82.40 - 203.88.82.47 lk -203.88.82.48 - 203.88.82.127 id -203.88.82.128 - 203.88.82.135 th -203.88.82.136 - 203.88.82.175 id -203.88.82.176 - 203.88.82.183 hk -203.88.82.184 - 203.88.82.239 id -203.88.82.240 - 203.88.82.247 af -203.88.82.248 - 203.88.82.255 id -203.88.83.0 - 203.88.83.255 hk -203.88.84.0 - 203.88.84.255 bd -203.88.85.0 - 203.88.85.255 hk -203.88.86.0 - 203.88.86.23 id -203.88.86.24 - 203.88.86.39 hk -203.88.86.40 - 203.88.86.55 id -203.88.86.56 - 203.88.86.63 hk -203.88.86.64 - 203.88.86.87 id -203.88.86.88 - 203.88.86.159 hk -203.88.86.160 - 203.88.86.167 id -203.88.86.168 - 203.88.86.207 hk -203.88.86.208 - 203.88.86.215 id -203.88.86.216 - 203.88.86.223 hk -203.88.86.224 - 203.88.86.231 id -203.88.86.232 - 203.88.86.255 hk -203.88.87.0 - 203.88.87.255 bd -203.88.88.0 - 203.88.88.7 hk -203.88.88.8 - 203.88.88.15 pk -203.88.88.16 - 203.88.88.23 hk -203.88.88.24 - 203.88.88.43 af -203.88.88.44 - 203.88.88.79 hk -203.88.88.80 - 203.88.88.95 my -203.88.88.96 - 203.88.88.103 id -203.88.88.104 - 203.88.88.119 my -203.88.88.120 - 203.88.88.127 id -203.88.88.128 - 203.88.88.151 hk -203.88.88.152 - 203.88.88.159 id -203.88.88.160 - 203.88.88.167 af -203.88.88.168 - 203.88.88.199 hk -203.88.88.200 - 203.88.88.207 my -203.88.88.208 - 203.88.88.223 hk -203.88.88.224 - 203.88.88.231 af -203.88.88.232 - 203.88.89.255 hk -203.88.90.0 - 203.88.90.7 bd -203.88.90.8 - 203.88.90.63 hk -203.88.90.64 - 203.88.90.191 bd -203.88.90.192 - 203.88.90.223 hk -203.88.90.224 - 203.88.90.255 bd -203.88.91.0 - 203.88.95.255 hk -203.88.96.0 - 203.88.111.255 bd +203.88.64.0 - 203.88.95.255 hk 203.88.112.0 - 203.88.127.255 au 203.88.128.0 - 203.88.159.255 in 203.88.160.0 - 203.88.175.255 hk @@ -124498,18 +103046,15 @@ 203.89.0.0 - 203.89.3.255 cn 203.89.4.0 - 203.89.4.255 in 203.89.5.0 - 203.89.5.255 au -203.89.6.0 - 203.89.7.255 hk -203.89.8.0 - 203.89.15.255 cn +203.89.6.0 - 203.89.15.255 hk 203.89.16.0 - 203.89.31.255 id 203.89.32.0 - 203.89.63.255 jp 203.89.64.0 - 203.89.127.255 au 203.89.128.0 - 203.89.131.255 jp -203.89.132.0 - 203.89.132.255 in -203.89.133.0 - 203.89.133.255 hk -203.89.134.0 - 203.89.135.255 in +203.89.132.0 - 203.89.135.255 in 203.89.136.0 - 203.89.139.255 cn 203.89.140.0 - 203.89.143.255 vn -203.89.144.0 - 203.89.145.255 au +203.89.145.0 - 203.89.145.255 au 203.89.146.0 - 203.89.149.255 id 203.89.150.0 - 203.89.150.255 sg 203.89.151.0 - 203.89.155.255 in @@ -124519,8 +103064,7 @@ 203.90.0.0 - 203.90.3.255 cn 203.90.4.0 - 203.90.5.255 in 203.90.6.0 - 203.90.7.255 hk -203.90.8.0 - 203.90.11.255 cn -203.90.12.0 - 203.90.15.255 pk +203.90.8.0 - 203.90.15.255 cn 203.90.16.0 - 203.90.23.255 jp 203.90.24.0 - 203.90.31.255 au 203.90.32.0 - 203.90.63.255 kr @@ -124533,50 +103077,32 @@ 203.91.96.0 - 203.91.111.255 cn 203.91.112.0 - 203.91.119.255 mn 203.91.120.0 - 203.91.127.255 cn -203.91.128.0 - 203.91.135.255 hk -203.91.136.0 - 203.91.136.255 sc -203.91.137.0 - 203.91.137.255 hk -203.91.138.0 - 203.91.139.255 bd -203.91.140.0 - 203.91.147.255 hk -203.91.148.0 - 203.91.148.255 sc -203.91.149.0 - 203.91.152.127 hk -203.91.152.128 - 203.91.152.255 bd -203.91.153.0 - 203.91.159.191 hk -203.91.159.192 - 203.91.159.207 id -203.91.159.208 - 203.91.159.255 hk +203.91.128.0 - 203.91.159.255 hk 203.91.160.0 - 203.91.191.255 jp 203.91.192.0 - 203.91.223.255 in 203.91.224.0 - 203.91.255.255 au 203.92.0.0 - 203.92.3.255 cn 203.92.4.0 - 203.92.5.255 pk -203.92.6.0 - 203.92.6.255 jp 203.92.7.0 - 203.92.7.255 au 203.92.8.0 - 203.92.15.255 ph 203.92.16.0 - 203.92.23.255 jp -203.92.24.0 - 203.92.24.255 mn -203.92.25.0 - 203.92.25.255 nz +203.92.24.0 - 203.92.25.255 nz 203.92.26.0 - 203.92.31.255 au 203.92.32.0 - 203.92.63.255 in 203.92.64.0 - 203.92.127.255 sg 203.92.128.0 - 203.92.159.255 my 203.92.160.0 - 203.92.191.255 cn 203.92.192.0 - 203.92.207.255 in -203.92.208.0 - 203.92.208.255 tw -203.92.209.0 - 203.92.209.255 jp -203.92.210.0 - 203.92.210.255 sg -203.92.211.0 - 203.92.211.255 hk -203.92.212.0 - 203.92.212.255 jp -203.92.213.0 - 203.92.213.255 nz -203.92.214.0 - 203.92.214.255 jp -203.92.215.0 - 203.92.215.255 sg -203.92.216.0 - 203.92.221.255 hk -203.92.222.0 - 203.92.222.255 au -203.92.223.0 - 203.92.223.127 jp -203.92.223.128 - 203.92.223.239 hk -203.92.223.240 - 203.92.223.255 jp +203.92.208.0 - 203.92.215.49 jp +203.92.215.50 - 203.92.215.51 au +203.92.215.52 - 203.92.216.255 jp +203.92.217.0 - 203.92.217.103 ap +203.92.217.104 - 203.92.217.104 cn +203.92.217.105 - 203.92.218.255 ap +203.92.219.0 - 203.92.223.255 jp 203.92.224.0 - 203.92.255.255 au 203.93.0.0 - 203.94.31.255 cn -203.94.32.0 - 203.94.63.255 au +203.94.32.0 - 203.94.63.255 nz 203.94.64.0 - 203.94.127.255 lk 203.94.128.0 - 203.94.191.255 au 203.94.192.0 - 203.94.255.255 in @@ -124584,115 +103110,26 @@ 203.95.8.0 - 203.95.15.255 gu 203.95.16.0 - 203.95.63.255 jp 203.95.64.0 - 203.95.95.255 sg -203.95.96.0 - 203.95.127.255 cn -203.95.128.0 - 203.95.255.255 tw +203.95.96.0 - 203.95.191.255 cn +203.95.192.0 - 203.95.195.255 hk +203.95.196.0 - 203.95.199.255 kh +203.95.200.0 - 203.95.211.255 cn +203.95.212.0 - 203.95.215.255 hk +203.95.216.0 - 203.95.219.255 in +203.95.220.0 - 203.95.223.255 bd +203.95.224.0 - 203.95.255.255 cn 203.96.0.0 - 203.98.63.255 nz 203.98.64.0 - 203.98.95.255 au 203.98.96.0 - 203.98.127.255 in 203.98.128.0 - 203.98.191.255 hk -203.98.192.0 - 203.98.192.255 au -203.98.193.0 - 203.98.193.15 hk -203.98.193.16 - 203.98.193.63 au -203.98.193.64 - 203.98.193.127 in -203.98.193.128 - 203.98.193.143 sg -203.98.193.144 - 203.98.193.167 au -203.98.193.168 - 203.98.193.175 cn -203.98.193.176 - 203.98.193.183 jp -203.98.193.184 - 203.98.193.191 au -203.98.193.192 - 203.98.193.223 jp -203.98.193.224 - 203.98.193.239 in -203.98.193.240 - 203.98.193.247 cn -203.98.193.248 - 203.98.193.255 nz -203.98.194.0 - 203.98.194.15 hk -203.98.194.16 - 203.98.194.31 cn -203.98.194.32 - 203.98.194.63 jp -203.98.194.64 - 203.98.194.127 au -203.98.194.128 - 203.98.195.23 in -203.98.195.24 - 203.98.195.31 au -203.98.195.32 - 203.98.195.39 in -203.98.195.40 - 203.98.195.47 sg -203.98.195.48 - 203.98.195.63 cn -203.98.195.64 - 203.98.195.79 au -203.98.195.80 - 203.98.195.95 my -203.98.195.96 - 203.98.195.103 sg -203.98.195.104 - 203.98.195.127 au -203.98.195.128 - 203.98.195.143 hk -203.98.195.144 - 203.98.200.255 au -203.98.201.0 - 203.98.201.255 cn -203.98.202.0 - 203.98.202.15 hk -203.98.202.16 - 203.98.204.255 au -203.98.205.0 - 203.98.205.7 sg -203.98.205.8 - 203.98.205.15 au -203.98.205.16 - 203.98.205.23 hk -203.98.205.24 - 203.98.205.31 jp -203.98.205.32 - 203.98.205.47 cn -203.98.205.48 - 203.98.205.127 sg -203.98.205.128 - 203.98.205.159 in -203.98.205.160 - 203.98.205.167 hk -203.98.205.168 - 203.98.205.175 cn -203.98.205.176 - 203.98.205.207 in -203.98.205.208 - 203.98.205.223 au -203.98.205.224 - 203.98.205.231 kr -203.98.205.232 - 203.98.206.255 hk -203.98.207.0 - 203.98.207.7 cn -203.98.207.8 - 203.98.207.15 tw -203.98.207.16 - 203.98.207.31 sg -203.98.207.32 - 203.98.207.63 kr -203.98.207.64 - 203.98.207.79 in -203.98.207.80 - 203.98.207.111 cn -203.98.207.112 - 203.98.207.127 hk -203.98.207.128 - 203.98.207.135 jp -203.98.207.136 - 203.98.207.143 hk -203.98.207.144 - 203.98.207.159 tw -203.98.207.160 - 203.98.207.191 in -203.98.207.192 - 203.98.207.207 sg -203.98.207.208 - 203.98.207.231 hk -203.98.207.232 - 203.98.207.239 au -203.98.207.240 - 203.98.207.247 kr -203.98.207.248 - 203.98.207.255 au -203.98.208.0 - 203.98.208.255 jp -203.98.209.0 - 203.98.209.47 au -203.98.209.48 - 203.98.209.79 sg -203.98.209.80 - 203.98.209.111 jp -203.98.209.112 - 203.98.209.127 hk -203.98.209.128 - 203.98.209.191 cn -203.98.209.192 - 203.98.209.223 au -203.98.209.224 - 203.98.209.239 ph -203.98.209.240 - 203.98.209.255 au -203.98.210.0 - 203.98.210.15 cn -203.98.210.16 - 203.98.210.31 au -203.98.210.32 - 203.98.210.95 hk -203.98.210.96 - 203.98.210.103 cn -203.98.210.104 - 203.98.210.111 au -203.98.210.112 - 203.98.210.127 in -203.98.210.128 - 203.98.210.255 au -203.98.211.0 - 203.98.211.255 tw -203.98.212.0 - 203.98.212.255 au -203.98.213.0 - 203.98.213.15 hk -203.98.213.16 - 203.98.213.23 au -203.98.213.24 - 203.98.213.31 cn -203.98.213.32 - 203.98.213.63 hk -203.98.213.64 - 203.98.213.127 sg -203.98.213.128 - 203.98.213.175 hk -203.98.213.176 - 203.98.213.183 cn -203.98.213.184 - 203.98.213.191 hk -203.98.213.192 - 203.98.213.199 jp -203.98.213.200 - 203.98.213.207 hk -203.98.213.208 - 203.98.213.255 in -203.98.214.0 - 203.98.214.255 kr -203.98.215.0 - 203.98.215.255 jp -203.98.216.0 - 203.98.216.255 hk -203.98.217.0 - 203.98.217.159 au -203.98.217.160 - 203.98.217.163 jp -203.98.217.164 - 203.98.217.171 au -203.98.217.172 - 203.98.217.175 hk -203.98.217.176 - 203.98.217.255 au -203.98.218.0 - 203.98.218.255 sg -203.98.219.0 - 203.98.219.255 kr +203.98.192.0 - 203.98.205.47 au +203.98.205.48 - 203.98.205.63 sg +203.98.205.64 - 203.98.219.255 au 203.98.220.0 - 203.98.223.255 jp 203.98.224.0 - 203.98.255.255 nr 203.99.0.0 - 203.99.7.255 jp -203.99.8.0 - 203.99.31.255 cn +203.99.8.0 - 203.99.15.255 hk +203.99.16.0 - 203.99.31.255 cn 203.99.32.0 - 203.99.39.255 nz 203.99.40.0 - 203.99.47.255 in 203.99.48.0 - 203.99.63.255 pk @@ -124704,6 +103141,7 @@ 203.99.130.0 - 203.99.131.255 id 203.99.132.0 - 203.99.135.255 nz 203.99.136.0 - 203.99.139.255 my +203.99.140.0 - 203.99.141.255 th 203.99.142.0 - 203.99.142.255 au 203.99.143.0 - 203.99.143.255 hk 203.99.144.0 - 203.99.155.255 au @@ -124718,11 +103156,12 @@ 203.99.254.0 - 203.99.254.255 hk 203.99.255.0 - 203.99.255.255 ws 203.100.0.0 - 203.100.31.255 au -203.100.32.0 - 203.100.55.255 cn +203.100.32.0 - 203.100.47.255 cn +203.100.48.0 - 203.100.55.255 hk 203.100.56.0 - 203.100.56.255 au -203.100.57.0 - 203.100.57.255 in -203.100.58.0 - 203.100.58.255 ap -203.100.59.0 - 203.100.61.255 au +203.100.57.0 - 203.100.57.255 hk +203.100.59.0 - 203.100.59.255 au +203.100.61.0 - 203.100.61.255 au 203.100.62.0 - 203.100.62.255 sg 203.100.63.0 - 203.100.63.255 cn 203.100.64.0 - 203.100.79.255 in @@ -124733,7 +103172,11 @@ 203.100.208.0 - 203.100.223.255 nz 203.100.224.0 - 203.100.255.255 au 203.101.0.0 - 203.101.127.255 in -203.101.128.0 - 203.101.159.255 th +203.101.128.0 - 203.101.155.95 th +203.101.155.96 - 203.101.155.111 id +203.101.155.112 - 203.101.155.127 th +203.101.155.128 - 203.101.155.159 hk +203.101.155.160 - 203.101.159.255 th 203.101.160.0 - 203.101.191.255 pk 203.101.192.0 - 203.101.223.255 sg 203.101.224.0 - 203.104.15.255 au @@ -124742,16 +103185,23 @@ 203.104.32.0 - 203.104.47.255 cn 203.104.48.0 - 203.104.63.255 nc 203.104.64.0 - 203.104.95.255 ph -203.104.96.0 - 203.104.255.255 jp +203.104.96.0 - 203.104.159.255 jp +203.104.160.0 - 203.104.191.255 kr +203.104.192.0 - 203.104.255.255 jp 203.105.0.0 - 203.105.63.255 hk -203.105.64.0 - 203.105.95.255 jp +203.105.64.0 - 203.105.73.255 jp +203.105.74.0 - 203.105.74.255 us +203.105.75.0 - 203.105.89.255 jp +203.105.90.0 - 203.105.90.255 us +203.105.91.0 - 203.105.93.255 jp +203.105.94.0 - 203.105.94.255 us +203.105.95.0 - 203.105.95.255 jp 203.105.96.0 - 203.105.159.255 cn 203.105.160.0 - 203.105.191.255 in 203.105.192.0 - 203.105.223.255 au 203.105.224.0 - 203.105.255.255 tw 203.106.0.0 - 203.106.255.255 my -203.107.0.0 - 203.107.63.255 tw -203.107.64.0 - 203.107.127.255 cn +203.107.0.0 - 203.107.127.255 cn 203.107.128.0 - 203.107.255.255 th 203.108.0.0 - 203.108.255.255 au 203.109.0.0 - 203.109.31.255 kr @@ -124763,11 +103213,13 @@ 203.110.96.0 - 203.110.127.255 jp 203.110.128.0 - 203.110.159.255 au 203.110.160.0 - 203.110.191.255 cn -203.110.192.0 - 203.110.207.255 au -203.110.208.0 - 203.110.223.255 in +203.110.192.0 - 203.110.192.255 us +203.110.193.0 - 203.110.200.255 au +203.110.201.0 - 203.110.201.255 us +203.110.202.0 - 203.110.207.255 au +203.110.208.0 - 203.110.223.255 cn 203.110.224.0 - 203.110.231.255 jp -203.110.232.0 - 203.110.233.255 au -203.110.234.0 - 203.110.234.255 cn +203.110.232.0 - 203.110.234.255 cn 203.110.235.0 - 203.110.235.255 au 203.110.236.0 - 203.110.239.255 ap 203.110.240.0 - 203.110.247.255 in @@ -124777,9 +103229,17 @@ 203.111.224.0 - 203.111.239.255 ph 203.111.240.0 - 203.111.247.255 jp 203.111.248.0 - 203.111.251.255 in -203.111.252.0 - 203.112.71.255 jp +203.111.252.0 - 203.111.255.255 hk +203.112.0.0 - 203.112.71.255 jp 203.112.72.0 - 203.112.79.255 bd -203.112.80.0 - 203.112.95.255 hk +203.112.80.0 - 203.112.80.255 ap +203.112.81.0 - 203.112.81.255 hk +203.112.82.0 - 203.112.82.255 ap +203.112.83.0 - 203.112.83.255 hk +203.112.84.0 - 203.112.84.255 ap +203.112.85.0 - 203.112.86.255 hk +203.112.87.0 - 203.112.87.255 ap +203.112.88.0 - 203.112.95.255 hk 203.112.96.0 - 203.112.127.255 au 203.112.128.0 - 203.112.159.255 in 203.112.160.0 - 203.112.191.255 sg @@ -124788,8 +103248,15 @@ 203.113.0.0 - 203.113.127.255 th 203.113.128.0 - 203.113.191.255 vn 203.113.192.0 - 203.113.255.255 au -203.114.0.0 - 203.114.63.255 my -203.114.64.0 - 203.114.95.255 ph +203.114.0.0 - 203.114.19.255 my +203.114.20.0 - 203.114.63.255 jp +203.114.64.0 - 203.114.67.255 ph +203.114.68.0 - 203.114.71.255 in +203.114.72.0 - 203.114.72.255 sg +203.114.73.0 - 203.114.73.255 au +203.114.74.0 - 203.114.75.255 sg +203.114.76.0 - 203.114.79.255 au +203.114.80.0 - 203.114.95.255 cn 203.114.96.0 - 203.114.127.255 th 203.114.128.0 - 203.114.191.255 nz 203.114.192.0 - 203.114.223.255 jp @@ -124805,7 +103272,15 @@ 203.115.64.0 - 203.115.127.255 in 203.115.128.0 - 203.115.191.255 ph 203.115.192.0 - 203.115.255.255 my -203.116.0.0 - 203.118.63.255 sg +203.116.0.0 - 203.116.40.255 sg +203.116.41.0 - 203.116.41.175 ap +203.116.41.176 - 203.116.41.191 sg +203.116.41.192 - 203.116.41.255 ap +203.116.42.0 - 203.116.109.127 sg +203.116.109.128 - 203.116.109.255 hk +203.116.110.0 - 203.116.237.255 sg +203.116.238.0 - 203.116.238.255 ap +203.116.239.0 - 203.118.63.255 sg 203.118.64.0 - 203.118.127.255 th 203.118.128.0 - 203.118.191.255 nz 203.118.192.0 - 203.118.223.255 cn @@ -124826,7 +103301,8 @@ 203.119.12.0 - 203.119.12.255 au 203.119.13.0 - 203.119.13.255 id 203.119.14.0 - 203.119.15.255 au -203.119.16.0 - 203.119.20.255 ap +203.119.16.0 - 203.119.19.255 jp +203.119.20.0 - 203.119.20.255 pk 203.119.21.0 - 203.119.21.255 au 203.119.22.0 - 203.119.23.255 jp 203.119.24.0 - 203.119.35.255 cn @@ -124837,7 +103313,7 @@ 203.119.44.0 - 203.119.47.255 vn 203.119.48.0 - 203.119.48.255 id 203.119.49.0 - 203.119.50.255 in -203.119.51.0 - 203.119.51.255 ap +203.119.51.0 - 203.119.51.255 fj 203.119.52.0 - 203.119.55.255 id 203.119.56.0 - 203.119.56.255 nz 203.119.57.0 - 203.119.57.255 my @@ -124846,7 +103322,7 @@ 203.119.78.0 - 203.119.78.255 sg 203.119.79.0 - 203.119.79.255 kh 203.119.80.0 - 203.119.83.255 cn -203.119.84.0 - 203.119.84.255 nz +203.119.84.0 - 203.119.84.255 au 203.119.85.0 - 203.119.85.255 cn 203.119.86.0 - 203.119.86.255 au 203.119.87.0 - 203.119.87.255 hk @@ -124855,10 +103331,83 @@ 203.119.94.0 - 203.119.94.255 tw 203.119.95.0 - 203.119.111.255 au 203.119.112.0 - 203.119.112.255 id -203.119.113.0 - 203.119.255.255 cn -203.120.0.0 - 203.120.255.255 sg +203.119.113.0 - 203.119.119.255 cn +203.119.120.0 - 203.119.127.255 hk +203.119.128.0 - 203.119.255.255 cn +203.120.0.0 - 203.120.0.255 sg +203.120.1.0 - 203.120.6.255 jp +203.120.7.0 - 203.120.19.255 sg +203.120.20.0 - 203.120.23.255 jp +203.120.24.0 - 203.120.26.255 sg +203.120.27.0 - 203.120.33.255 jp +203.120.34.0 - 203.120.35.255 sg +203.120.36.0 - 203.120.39.207 jp +203.120.39.208 - 203.120.39.223 sg +203.120.39.224 - 203.120.39.255 jp +203.120.40.0 - 203.120.44.255 sg +203.120.45.0 - 203.120.52.255 jp +203.120.53.0 - 203.120.54.255 sg +203.120.55.0 - 203.120.57.255 jp +203.120.58.0 - 203.120.58.255 sg +203.120.59.0 - 203.120.61.255 jp +203.120.62.0 - 203.120.62.255 sg +203.120.63.0 - 203.120.68.255 jp +203.120.69.0 - 203.120.71.255 sg +203.120.72.0 - 203.120.76.255 jp +203.120.77.0 - 203.120.77.255 sg +203.120.78.0 - 203.120.80.255 jp +203.120.81.0 - 203.120.81.255 sg +203.120.82.0 - 203.120.85.255 jp +203.120.86.0 - 203.120.86.255 sg +203.120.87.0 - 203.120.91.255 jp +203.120.92.0 - 203.120.92.255 sg +203.120.93.0 - 203.120.100.255 jp +203.120.101.0 - 203.120.103.255 sg +203.120.104.0 - 203.120.104.127 jp +203.120.104.128 - 203.120.104.159 sg +203.120.104.160 - 203.120.106.159 jp +203.120.106.160 - 203.120.106.191 sg +203.120.106.192 - 203.120.109.255 jp +203.120.110.0 - 203.120.145.255 sg +203.120.146.0 - 203.120.148.255 jp +203.120.149.0 - 203.120.153.255 sg +203.120.154.0 - 203.120.156.255 jp +203.120.157.0 - 203.120.159.255 sg +203.120.160.0 - 203.120.160.183 jp +203.120.160.184 - 203.120.160.187 sg +203.120.160.188 - 203.120.164.255 jp +203.120.165.0 - 203.120.183.255 sg +203.120.184.0 - 203.120.184.63 jp +203.120.184.64 - 203.120.184.96 sg +203.120.184.97 - 203.120.185.159 jp +203.120.185.160 - 203.120.185.191 sg +203.120.185.192 - 203.120.186.255 jp +203.120.187.0 - 203.120.192.255 sg +203.120.193.0 - 203.120.195.255 jp +203.120.196.0 - 203.120.223.255 sg +203.120.224.0 - 203.120.227.255 jp +203.120.228.0 - 203.120.255.255 sg 203.121.0.0 - 203.121.127.255 my -203.121.128.0 - 203.121.191.255 th +203.121.128.0 - 203.121.143.255 sg +203.121.144.0 - 203.121.144.255 jp +203.121.145.0 - 203.121.145.255 sg +203.121.146.0 - 203.121.147.255 jp +203.121.148.0 - 203.121.153.255 sg +203.121.154.0 - 203.121.158.255 th +203.121.159.0 - 203.121.166.255 sg +203.121.167.0 - 203.121.167.255 jp +203.121.168.0 - 203.121.169.255 sg +203.121.170.0 - 203.121.170.255 jp +203.121.171.0 - 203.121.174.255 sg +203.121.175.0 - 203.121.177.255 jp +203.121.178.0 - 203.121.180.255 sg +203.121.181.0 - 203.121.181.255 jp +203.121.182.0 - 203.121.182.255 sg +203.121.183.0 - 203.121.184.255 jp +203.121.185.0 - 203.121.186.255 sg +203.121.187.0 - 203.121.187.255 jp +203.121.188.0 - 203.121.188.255 sg +203.121.189.0 - 203.121.191.255 jp 203.121.192.0 - 203.121.223.255 au 203.121.224.0 - 203.121.255.255 tw 203.122.0.0 - 203.122.63.255 in @@ -124866,7 +103415,7 @@ 203.123.0.0 - 203.123.31.255 sg 203.123.32.0 - 203.123.47.255 in 203.123.48.0 - 203.123.55.255 sg -203.123.56.0 - 203.123.58.255 jp +203.123.56.0 - 203.123.57.255 id 203.123.59.0 - 203.123.59.255 au 203.123.60.0 - 203.123.63.255 id 203.123.64.0 - 203.123.127.255 au @@ -124883,11 +103432,15 @@ 203.124.128.0 - 203.124.175.255 in 203.124.176.0 - 203.124.191.255 au 203.124.192.0 - 203.124.255.255 in -203.125.0.0 - 203.126.69.255 sg +203.125.0.0 - 203.126.29.255 sg +203.126.30.0 - 203.126.30.255 ap +203.126.31.0 - 203.126.63.255 sg +203.126.64.0 - 203.126.64.255 ap +203.126.65.0 - 203.126.69.255 sg 203.126.70.0 - 203.126.71.255 us -203.126.72.0 - 203.127.0.255 sg -203.127.1.0 - 203.127.1.15 id -203.127.1.16 - 203.127.224.255 sg +203.126.72.0 - 203.126.135.255 sg +203.126.136.0 - 203.126.136.255 ap +203.126.137.0 - 203.127.224.255 sg 203.127.225.0 - 203.127.225.255 ph 203.127.226.0 - 203.127.255.255 sg 203.128.0.0 - 203.128.31.255 pk @@ -124896,7 +103449,7 @@ 203.128.96.0 - 203.128.127.255 cn 203.128.128.0 - 203.128.159.255 au 203.128.160.0 - 203.128.223.255 kr -203.128.224.0 - 203.128.231.255 cn +203.128.224.0 - 203.128.231.255 hk 203.128.232.0 - 203.128.235.255 au 203.128.236.0 - 203.128.239.255 kr 203.128.240.0 - 203.128.247.255 vn @@ -124904,7 +103457,7 @@ 203.128.252.0 - 203.129.3.255 pk 203.129.4.0 - 203.129.5.255 ph 203.129.6.0 - 203.129.7.255 kr -203.129.8.0 - 203.129.15.255 cn +203.129.8.0 - 203.129.15.255 hk 203.129.16.0 - 203.129.63.255 au 203.129.64.0 - 203.129.95.255 hk 203.129.96.0 - 203.129.127.255 jp @@ -124953,9 +103506,10 @@ 203.135.189.0 - 203.135.189.255 sg 203.135.190.0 - 203.135.191.255 my 203.135.192.0 - 203.141.255.255 jp -203.142.0.0 - 203.142.7.255 my +203.142.0.0 - 203.142.4.255 my +203.142.5.0 - 203.142.7.255 sg 203.142.8.0 - 203.142.9.255 au -203.142.10.0 - 203.142.11.255 hk +203.142.10.0 - 203.142.11.255 sg 203.142.12.0 - 203.142.13.255 cn 203.142.14.0 - 203.142.15.255 us 203.142.16.0 - 203.142.25.255 sg @@ -124969,27 +103523,26 @@ 203.142.160.0 - 203.142.191.255 kr 203.142.192.0 - 203.142.215.255 jp 203.142.216.0 - 203.142.217.255 kr -203.142.218.0 - 203.142.218.255 au -203.142.219.0 - 203.142.219.255 cn 203.142.220.0 - 203.142.220.255 in -203.142.221.0 - 203.142.221.255 nf -203.142.222.0 - 203.142.255.255 au +203.142.221.0 - 203.142.223.255 au +203.142.224.0 - 203.142.255.255 cn 203.143.0.0 - 203.143.63.255 lk 203.143.64.0 - 203.143.95.255 au 203.143.96.0 - 203.143.127.255 jp 203.143.128.0 - 203.143.159.255 sg 203.143.160.0 - 203.143.175.255 au 203.143.176.0 - 203.143.191.255 in -203.143.192.0 - 203.144.31.255 au +203.143.192.0 - 203.143.207.255 nz +203.143.208.0 - 203.144.31.255 au 203.144.32.0 - 203.144.47.255 nz 203.144.48.0 - 203.144.63.255 us 203.144.64.0 - 203.144.95.255 kh -203.144.96.0 - 203.144.127.255 in +203.144.96.0 - 203.144.127.255 cn 203.144.128.0 - 203.144.255.255 th 203.145.0.0 - 203.145.31.255 cn 203.145.32.0 - 203.145.63.255 au 203.145.64.0 - 203.145.95.255 hk -203.145.96.0 - 203.145.111.255 au +203.145.96.0 - 203.145.111.255 jp 203.145.112.0 - 203.145.119.255 th 203.145.120.0 - 203.145.127.255 jp 203.145.128.0 - 203.145.191.255 in @@ -125002,50 +103555,76 @@ 203.147.104.0 - 203.147.107.255 ph 203.147.108.0 - 203.147.109.255 ap 203.147.110.0 - 203.147.111.255 hk -203.147.112.0 - 203.147.127.255 se +203.147.112.0 - 203.147.127.255 jp 203.147.128.0 - 203.147.255.255 au -203.148.0.0 - 203.148.63.255 cn -203.148.64.0 - 203.148.67.255 pk -203.148.68.0 - 203.148.83.255 cn +203.148.0.0 - 203.148.83.255 cn 203.148.84.0 - 203.148.85.255 id 203.148.86.0 - 203.148.87.255 cn -203.148.88.0 - 203.148.91.255 my +203.148.88.0 - 203.148.91.255 bd 203.148.92.0 - 203.148.92.255 tw 203.148.93.0 - 203.148.95.255 au 203.148.96.0 - 203.148.127.255 jp 203.148.128.0 - 203.149.63.255 th 203.149.64.0 - 203.149.91.255 au -203.149.92.0 - 203.149.95.255 sg +203.149.92.0 - 203.149.95.255 cn 203.149.96.0 - 203.149.111.255 jp 203.149.112.0 - 203.149.127.255 kr 203.149.128.0 - 203.149.255.255 sg -203.150.0.0 - 203.152.63.255 th +203.150.0.0 - 203.151.255.255 th +203.152.0.0 - 203.152.4.255 sg +203.152.5.0 - 203.152.5.255 jp +203.152.6.0 - 203.152.9.255 sg +203.152.10.0 - 203.152.10.255 jp +203.152.11.0 - 203.152.14.255 sg +203.152.15.0 - 203.152.15.255 jp +203.152.16.0 - 203.152.20.255 sg +203.152.21.0 - 203.152.21.255 jp +203.152.22.0 - 203.152.22.255 sg +203.152.23.0 - 203.152.23.255 jp +203.152.24.0 - 203.152.37.255 sg +203.152.38.0 - 203.152.38.255 jp +203.152.39.0 - 203.152.40.255 sg +203.152.41.0 - 203.152.41.255 jp +203.152.42.0 - 203.152.44.255 sg +203.152.45.0 - 203.152.46.255 jp +203.152.47.0 - 203.152.50.255 sg +203.152.51.0 - 203.152.52.127 jp +203.152.52.128 - 203.152.52.159 th +203.152.52.160 - 203.152.52.191 jp +203.152.52.192 - 203.152.52.207 th +203.152.52.208 - 203.152.52.255 jp +203.152.53.0 - 203.152.53.255 sg +203.152.54.0 - 203.152.54.255 jp +203.152.55.0 - 203.152.58.255 sg +203.152.59.0 - 203.152.59.255 jp +203.152.60.0 - 203.152.60.255 th +203.152.61.0 - 203.152.61.255 jp +203.152.62.0 - 203.152.63.255 sg 203.152.64.0 - 203.152.95.255 cn 203.152.96.0 - 203.152.127.255 nz 203.152.128.0 - 203.152.159.255 cn 203.152.160.0 - 203.152.191.255 kr 203.152.192.0 - 203.152.223.255 jp 203.152.224.0 - 203.152.255.255 au -203.153.0.0 - 203.153.3.255 id +203.153.0.0 - 203.153.3.255 cn 203.153.4.0 - 203.153.5.255 hk 203.153.6.0 - 203.153.15.255 ph -203.153.16.0 - 203.153.23.255 my -203.153.24.0 - 203.153.31.255 id +203.153.16.0 - 203.153.19.255 au +203.153.20.0 - 203.153.31.255 id 203.153.32.0 - 203.153.48.255 in 203.153.49.0 - 203.153.49.255 id 203.153.50.0 - 203.153.51.255 th 203.153.52.0 - 203.153.55.255 in 203.153.56.0 - 203.153.59.255 jp -203.153.60.0 - 203.153.61.255 id -203.153.64.0 - 203.153.79.255 hk +203.153.60.0 - 203.153.63.255 my +203.153.64.0 - 203.153.79.255 jp 203.153.80.0 - 203.153.95.255 my 203.153.96.0 - 203.153.127.255 id 203.153.128.0 - 203.153.143.255 th 203.153.144.0 - 203.153.159.255 kr 203.153.160.0 - 203.153.191.255 th 203.153.192.0 - 203.153.207.255 au -203.153.208.0 - 203.153.209.255 hk -203.153.210.0 - 203.153.211.255 in +203.153.208.0 - 203.153.211.255 in 203.153.212.0 - 203.153.219.255 id 203.153.220.0 - 203.153.223.255 lk 203.153.224.0 - 203.153.255.255 au @@ -125064,16 +103643,15 @@ 203.160.8.0 - 203.160.15.255 au 203.160.16.0 - 203.160.31.255 jp 203.160.32.0 - 203.160.47.255 hk -203.160.48.0 - 203.160.55.255 mn 203.160.56.0 - 203.160.63.255 id 203.160.64.0 - 203.160.95.255 hk 203.160.96.0 - 203.160.103.255 vn -203.160.104.0 - 203.160.111.255 cn +203.160.104.0 - 203.160.111.255 hk 203.160.112.0 - 203.160.127.255 nz 203.160.128.0 - 203.160.128.255 id 203.160.129.0 - 203.160.129.255 cn 203.160.130.0 - 203.160.131.255 ph -203.160.132.0 - 203.160.135.255 au +203.160.132.0 - 203.160.135.255 vn 203.160.136.0 - 203.160.136.255 in 203.160.137.0 - 203.160.137.255 th 203.160.138.0 - 203.160.139.255 in @@ -125082,23 +103660,20 @@ 203.160.160.0 - 203.160.191.255 ph 203.160.192.0 - 203.160.223.255 cn 203.160.224.0 - 203.160.255.255 tw -203.161.0.0 - 203.161.3.255 vn +203.161.0.0 - 203.161.3.255 cn 203.161.4.0 - 203.161.7.255 hk 203.161.8.0 - 203.161.15.255 au 203.161.16.0 - 203.161.31.255 id -203.161.32.0 - 203.161.47.255 sg -203.161.48.0 - 203.161.48.255 my -203.161.49.0 - 203.161.53.255 sg -203.161.54.0 - 203.161.63.255 in +203.161.32.0 - 203.161.51.255 sg +203.161.52.0 - 203.161.52.255 in +203.161.53.0 - 203.161.63.255 sg 203.161.64.0 - 203.161.175.255 au 203.161.176.0 - 203.161.177.255 ph 203.161.178.0 - 203.161.178.255 vn -203.161.179.0 - 203.161.179.255 in 203.161.180.0 - 203.161.180.255 cn -203.161.181.0 - 203.161.181.255 sg +203.161.181.0 - 203.161.181.255 ap 203.161.182.0 - 203.161.182.255 au -203.161.184.0 - 203.161.184.255 au -203.161.185.0 - 203.161.185.255 sg +203.161.184.0 - 203.161.185.255 id 203.161.186.0 - 203.161.187.255 au 203.161.188.0 - 203.161.188.255 ph 203.161.189.0 - 203.161.189.255 in @@ -125106,27 +103681,23 @@ 203.161.192.0 - 203.161.223.255 cn 203.161.224.0 - 203.161.255.255 hk 203.162.0.0 - 203.162.255.255 vn -203.163.0.0 - 203.163.13.255 jp -203.163.14.0 - 203.163.14.255 sg -203.163.15.0 - 203.163.32.255 jp -203.163.33.0 - 203.163.33.255 hk -203.163.34.0 - 203.163.53.255 jp -203.163.54.0 - 203.163.54.255 nz -203.163.55.0 - 203.163.125.255 jp -203.163.126.0 - 203.163.126.255 au -203.163.127.0 - 203.163.127.255 jp +203.163.0.0 - 203.163.67.215 jp +203.163.67.216 - 203.163.67.231 au +203.163.67.232 - 203.163.70.255 jp +203.163.71.0 - 203.163.71.255 nz +203.163.72.0 - 203.163.96.255 jp +203.163.97.0 - 203.163.97.7 sg +203.163.97.8 - 203.163.127.27 jp +203.163.127.28 - 203.163.127.31 au +203.163.127.32 - 203.163.127.255 jp 203.163.128.0 - 203.163.191.255 vn 203.163.192.0 - 203.163.223.255 tw 203.163.224.0 - 203.163.255.255 in 203.164.0.0 - 203.164.255.255 au 203.165.0.0 - 203.165.255.255 jp -203.166.0.0 - 203.166.47.255 au -203.166.48.0 - 203.166.48.127 hk -203.166.48.128 - 203.166.51.255 au +203.166.0.0 - 203.166.51.255 au 203.166.52.0 - 203.166.55.255 us -203.166.56.0 - 203.166.118.143 au -203.166.118.144 - 203.166.118.151 nz -203.166.118.152 - 203.166.127.255 au +203.166.56.0 - 203.166.127.255 au 203.166.128.0 - 203.166.159.255 sg 203.166.160.0 - 203.166.191.255 cn 203.166.192.0 - 203.166.207.255 id @@ -125136,7 +103707,12 @@ 203.166.218.0 - 203.166.219.255 au 203.166.220.0 - 203.166.223.255 hk 203.166.224.0 - 203.166.255.255 au -203.167.0.0 - 203.167.31.255 ph +203.167.0.0 - 203.167.7.255 ph +203.167.8.0 - 203.167.15.255 vn +203.167.16.0 - 203.167.19.255 kh +203.167.20.0 - 203.167.23.255 hk +203.167.24.0 - 203.167.27.255 au +203.167.28.0 - 203.167.31.255 cn 203.167.32.0 - 203.167.63.255 jp 203.167.64.0 - 203.167.127.255 ph 203.167.128.0 - 203.167.255.255 nz @@ -125157,16 +103733,23 @@ 203.169.57.0 - 203.169.57.127 hk 203.169.57.128 - 203.169.57.255 sg 203.169.58.0 - 203.169.58.7 jp -203.169.58.8 - 203.169.58.15 ap +203.169.58.8 - 203.169.58.15 hk 203.169.58.16 - 203.169.58.23 au -203.169.58.24 - 203.169.58.127 ap +203.169.58.24 - 203.169.58.31 hk +203.169.58.32 - 203.169.58.47 sg +203.169.58.48 - 203.169.58.63 hk +203.169.58.64 - 203.169.58.79 jp +203.169.58.80 - 203.169.58.127 hk 203.169.58.128 - 203.169.59.63 jp -203.169.59.64 - 203.169.59.71 hk -203.169.59.72 - 203.169.59.119 ap +203.169.59.64 - 203.169.59.119 hk 203.169.59.120 - 203.169.59.255 jp -203.169.60.0 - 203.169.60.255 hk -203.169.61.0 - 203.169.63.255 ap -203.169.64.0 - 203.169.127.255 sg +203.169.60.0 - 203.169.60.127 sg +203.169.60.128 - 203.169.61.7 hk +203.169.61.8 - 203.169.61.23 sg +203.169.61.24 - 203.169.61.31 hk +203.169.61.32 - 203.169.61.47 sg +203.169.61.48 - 203.169.62.255 hk +203.169.63.0 - 203.169.127.255 sg 203.169.128.0 - 203.169.255.255 hk 203.170.0.0 - 203.170.15.255 au 203.170.16.0 - 203.170.19.255 th @@ -125185,14 +103768,12 @@ 203.170.58.0 - 203.170.59.255 cn 203.170.60.0 - 203.170.63.255 in 203.170.64.0 - 203.170.79.255 pk -203.170.80.0 - 203.170.87.255 au -203.170.88.0 - 203.170.88.255 nz -203.170.89.0 - 203.170.89.255 au +203.170.80.0 - 203.170.89.255 au 203.170.90.0 - 203.170.91.255 hk 203.170.92.0 - 203.170.95.255 au 203.170.96.0 - 203.170.127.255 kr 203.170.128.0 - 203.170.255.255 th -203.171.0.0 - 203.171.3.255 ph +203.171.0.0 - 203.171.3.255 cn 203.171.4.0 - 203.171.4.255 nz 203.171.5.0 - 203.171.5.255 au 203.171.6.0 - 203.171.7.255 ph @@ -125203,8 +103784,7 @@ 203.171.128.0 - 203.171.159.255 jp 203.171.160.0 - 203.171.191.255 kr 203.171.192.0 - 203.171.207.255 au -203.171.208.0 - 203.171.208.255 nz -203.171.209.0 - 203.171.211.255 in +203.171.208.0 - 203.171.211.255 in 203.171.212.0 - 203.171.215.255 jp 203.171.216.0 - 203.171.219.255 id 203.171.220.0 - 203.171.220.255 au @@ -125224,11 +103804,10 @@ 203.174.0.0 - 203.174.3.255 ph 203.174.4.0 - 203.174.4.255 cn 203.174.5.0 - 203.174.5.255 id -203.174.6.0 - 203.174.6.255 in 203.174.7.0 - 203.174.7.255 cn 203.174.8.0 - 203.174.15.255 id 203.174.16.0 - 203.174.25.255 au -203.174.26.0 - 203.174.26.255 nz +203.174.26.0 - 203.174.26.255 mn 203.174.27.0 - 203.174.27.255 af 203.174.28.0 - 203.174.29.255 sg 203.174.30.0 - 203.174.31.255 nz @@ -125241,12 +103820,10 @@ 203.174.192.0 - 203.174.255.255 jp 203.175.0.0 - 203.175.3.255 ph 203.175.4.0 - 203.175.7.255 in -203.175.8.0 - 203.175.15.255 bt 203.175.16.0 - 203.175.31.255 jp 203.175.32.0 - 203.175.63.255 kr 203.175.64.0 - 203.175.79.255 pk 203.175.80.0 - 203.175.95.255 jp -203.175.96.0 - 203.175.111.255 pk 203.175.112.0 - 203.175.119.255 nz 203.175.120.0 - 203.175.123.255 au 203.175.124.0 - 203.175.127.255 ph @@ -125263,7 +103840,8 @@ 203.176.114.0 - 203.176.115.255 hk 203.176.116.0 - 203.176.119.255 ph 203.176.120.0 - 203.176.121.255 au -203.176.122.0 - 203.176.127.255 nz +203.176.122.0 - 203.176.123.255 nz +203.176.124.0 - 203.176.127.255 hk 203.176.128.0 - 203.176.143.255 kh 203.176.144.0 - 203.176.151.255 my 203.176.152.0 - 203.176.152.255 au @@ -125280,11 +103858,7 @@ 203.176.190.0 - 203.176.191.255 pk 203.176.192.0 - 203.176.255.255 hk 203.177.0.0 - 203.177.255.255 ph -203.178.0.0 - 203.182.14.111 jp -203.182.14.112 - 203.182.14.115 hk -203.182.14.116 - 203.182.55.175 jp -203.182.55.176 - 203.182.55.179 hk -203.182.55.180 - 203.183.255.255 jp +203.178.0.0 - 203.183.255.255 jp 203.184.0.0 - 203.184.63.255 nz 203.184.64.0 - 203.184.79.255 au 203.184.80.0 - 203.184.95.255 cn @@ -125292,15 +103866,15 @@ 203.184.128.0 - 203.185.63.255 hk 203.185.64.0 - 203.185.159.255 th 203.185.160.0 - 203.185.183.255 pf -203.185.184.0 - 203.185.187.255 au -203.185.188.0 - 203.185.188.255 in -203.185.189.0 - 203.185.189.255 hk +203.185.184.0 - 203.185.184.25 au +203.185.184.26 - 203.185.184.26 hk +203.185.184.27 - 203.185.187.255 au 203.185.190.0 - 203.185.190.255 au 203.185.191.0 - 203.185.191.255 in 203.185.192.0 - 203.185.255.255 au 203.186.0.0 - 203.186.255.255 hk 203.187.0.0 - 203.187.127.255 tw -203.187.128.0 - 203.187.159.255 in +203.187.128.0 - 203.187.159.255 us 203.187.160.0 - 203.187.191.255 cn 203.187.192.0 - 203.187.255.255 in 203.188.0.0 - 203.188.63.255 th @@ -125312,7 +103886,8 @@ 203.188.216.0 - 203.188.223.255 au 203.188.224.0 - 203.188.231.255 in 203.188.232.0 - 203.188.239.255 my -203.188.240.0 - 203.189.1.255 bd +203.188.240.0 - 203.188.255.255 bd +203.189.0.0 - 203.189.1.255 cn 203.189.2.0 - 203.189.4.255 au 203.189.5.0 - 203.189.5.255 in 203.189.6.0 - 203.189.7.255 cn @@ -125328,7 +103903,7 @@ 203.189.88.0 - 203.189.89.255 id 203.189.90.0 - 203.189.92.255 in 203.189.93.0 - 203.189.95.255 au -203.189.96.0 - 203.189.111.255 pk +203.189.96.0 - 203.189.111.255 jp 203.189.112.0 - 203.189.115.255 cn 203.189.116.0 - 203.189.119.255 th 203.189.120.0 - 203.189.123.255 id @@ -125338,8 +103913,11 @@ 203.189.176.0 - 203.189.183.255 in 203.189.184.0 - 203.189.191.255 lk 203.189.192.0 - 203.189.223.255 cn -203.189.224.0 - 203.190.3.255 bd -203.190.4.0 - 203.190.7.255 tw +203.189.224.0 - 203.189.231.255 bd +203.189.232.0 - 203.189.243.255 cn +203.189.244.0 - 203.189.255.255 in +203.190.0.0 - 203.190.3.255 bd +203.190.4.0 - 203.190.7.255 kr 203.190.8.0 - 203.190.15.255 bd 203.190.16.0 - 203.190.23.255 tw 203.190.24.0 - 203.190.25.255 au @@ -125350,56 +103928,50 @@ 203.190.38.0 - 203.190.39.255 ap 203.190.40.0 - 203.190.55.255 id 203.190.56.0 - 203.190.63.255 jp -203.190.64.0 - 203.190.75.127 ph -203.190.75.128 - 203.190.75.135 sg -203.190.75.136 - 203.190.95.255 ph +203.190.64.0 - 203.190.95.255 ph 203.190.96.0 - 203.190.111.255 cn 203.190.112.0 - 203.190.119.255 id -203.190.120.0 - 203.190.127.255 hk +203.190.120.0 - 203.190.120.255 hk +203.190.121.0 - 203.190.121.255 jp +203.190.122.0 - 203.190.127.255 hk 203.190.128.0 - 203.190.159.255 in 203.190.160.0 - 203.190.175.255 vn 203.190.176.0 - 203.190.183.255 sg 203.190.184.0 - 203.190.191.255 id 203.190.192.0 - 203.190.207.255 au 203.190.208.0 - 203.190.215.255 nz -203.190.216.0 - 203.190.216.255 in 203.190.217.0 - 203.190.217.255 au 203.190.218.0 - 203.190.221.255 ph 203.190.222.0 - 203.190.223.255 au -203.190.224.0 - 203.190.227.255 sg -203.190.228.0 - 203.190.229.255 jp -203.190.230.0 - 203.190.232.31 sg -203.190.232.32 - 203.190.232.63 au -203.190.232.64 - 203.190.232.147 sg -203.190.232.148 - 203.190.232.155 au -203.190.232.156 - 203.190.232.159 sg -203.190.232.160 - 203.190.232.175 au -203.190.232.176 - 203.190.235.79 sg -203.190.235.80 - 203.190.235.95 au -203.190.235.96 - 203.190.239.255 sg +203.190.224.0 - 203.190.229.255 sg +203.190.230.0 - 203.190.230.255 jp +203.190.231.0 - 203.190.231.255 sg +203.190.232.0 - 203.190.235.255 au +203.190.236.0 - 203.190.239.255 sg 203.190.240.0 - 203.190.247.255 id 203.190.248.0 - 203.190.248.255 in -203.190.249.0 - 203.190.249.255 hk +203.190.249.0 - 203.190.249.255 cn 203.190.250.0 - 203.190.251.255 th 203.190.252.0 - 203.190.253.255 au -203.190.254.0 - 203.191.1.255 bd -203.191.2.0 - 203.191.2.255 jp -203.191.3.0 - 203.191.3.255 hk -203.191.4.0 - 203.191.4.255 jp -203.191.5.0 - 203.191.5.255 in +203.190.254.0 - 203.190.255.255 bd +203.191.0.0 - 203.191.1.255 cn +203.191.3.0 - 203.191.4.255 hk 203.191.6.0 - 203.191.6.255 au -203.191.7.0 - 203.191.7.255 nz 203.191.8.0 - 203.191.15.255 vn -203.191.16.0 - 203.191.31.255 cn +203.191.16.0 - 203.191.23.255 cn +203.191.24.0 - 203.191.25.255 hk +203.191.26.0 - 203.191.26.255 cn +203.191.27.0 - 203.191.27.255 hk +203.191.28.0 - 203.191.31.255 cn 203.191.32.0 - 203.191.33.255 bd 203.191.34.0 - 203.191.35.255 in 203.191.36.0 - 203.191.39.255 au 203.191.40.0 - 203.191.47.255 id 203.191.48.0 - 203.191.55.255 vn -203.191.56.0 - 203.191.63.255 mn +203.191.56.0 - 203.191.63.255 in 203.191.64.0 - 203.191.127.255 cn -203.191.128.0 - 203.191.131.255 bd -203.191.132.0 - 203.191.133.255 au +203.191.128.0 - 203.191.131.255 vu +203.191.132.0 - 203.191.132.255 au 203.191.134.0 - 203.191.135.255 ph 203.191.136.0 - 203.191.143.255 jp 203.191.144.0 - 203.191.159.255 cn @@ -125409,208 +103981,54 @@ 203.192.32.0 - 203.192.63.255 th 203.192.64.0 - 203.192.95.255 au 203.192.96.0 - 203.192.127.255 jp -203.192.128.0 - 203.192.134.255 ap -203.192.135.0 - 203.192.135.255 hk -203.192.136.0 - 203.192.136.255 au -203.192.137.0 - 203.192.137.255 hk -203.192.138.0 - 203.192.138.15 sg -203.192.138.16 - 203.192.138.23 ap -203.192.138.24 - 203.192.138.71 sg -203.192.138.72 - 203.192.138.95 ap -203.192.138.96 - 203.192.138.159 sg -203.192.138.160 - 203.192.138.191 ap -203.192.138.192 - 203.192.138.255 sg -203.192.139.0 - 203.192.139.255 ap -203.192.140.0 - 203.192.140.7 jp -203.192.140.8 - 203.192.140.79 ap -203.192.140.80 - 203.192.140.191 jp -203.192.140.192 - 203.192.140.255 ap -203.192.141.0 - 203.192.141.127 au -203.192.141.128 - 203.192.141.159 sg -203.192.141.160 - 203.192.141.191 au -203.192.141.192 - 203.192.141.207 my -203.192.141.208 - 203.192.141.223 nz -203.192.141.224 - 203.192.141.255 au -203.192.142.0 - 203.192.142.255 kr +203.192.128.0 - 203.192.129.255 ap +203.192.130.0 - 203.192.130.255 au +203.192.131.0 - 203.192.140.193 ap +203.192.140.194 - 203.192.140.194 jp +203.192.140.195 - 203.192.141.63 ap +203.192.141.64 - 203.192.141.71 au +203.192.141.72 - 203.192.142.255 ap 203.192.143.0 - 203.192.143.255 tw -203.192.144.0 - 203.192.144.255 ap -203.192.145.0 - 203.192.145.255 jp -203.192.146.0 - 203.192.146.255 ap -203.192.147.0 - 203.192.147.15 jp -203.192.147.16 - 203.192.147.31 ap -203.192.147.32 - 203.192.147.47 jp -203.192.147.48 - 203.192.147.63 ap -203.192.147.64 - 203.192.147.128 jp -203.192.147.129 - 203.192.148.31 ap -203.192.148.32 - 203.192.148.47 kr -203.192.148.48 - 203.192.148.191 ap -203.192.148.192 - 203.192.148.255 kr -203.192.149.0 - 203.192.150.255 jp -203.192.151.0 - 203.192.152.47 ap -203.192.152.48 - 203.192.152.63 tw -203.192.152.64 - 203.192.156.127 ap -203.192.156.128 - 203.192.156.135 hk -203.192.156.136 - 203.192.156.151 ap -203.192.156.152 - 203.192.156.215 hk -203.192.156.216 - 203.192.157.127 ap -203.192.157.128 - 203.192.157.255 kr -203.192.158.0 - 203.192.159.255 jp -203.192.160.0 - 203.192.161.255 ap -203.192.162.0 - 203.192.162.127 ph -203.192.162.128 - 203.192.162.207 ap -203.192.162.208 - 203.192.162.223 ph -203.192.162.224 - 203.192.162.239 ap -203.192.162.240 - 203.192.162.255 tw -203.192.163.0 - 203.192.170.255 ap -203.192.171.0 - 203.192.171.63 ph -203.192.171.64 - 203.192.171.95 ap -203.192.171.96 - 203.192.171.111 ph -203.192.171.112 - 203.192.171.183 ap -203.192.171.184 - 203.192.171.191 ph -203.192.171.192 - 203.192.171.255 tw -203.192.172.0 - 203.192.172.95 ap -203.192.172.96 - 203.192.172.111 ph -203.192.172.112 - 203.192.172.127 tw -203.192.172.128 - 203.192.172.143 ap -203.192.172.144 - 203.192.172.159 tw -203.192.172.160 - 203.192.176.255 ap -203.192.177.0 - 203.192.177.31 my -203.192.177.32 - 203.192.178.255 ap -203.192.179.0 - 203.192.179.7 au -203.192.179.8 - 203.192.179.15 ap -203.192.179.16 - 203.192.179.31 au -203.192.179.32 - 203.192.179.39 ap -203.192.179.40 - 203.192.179.95 au -203.192.179.96 - 203.192.179.127 ap -203.192.179.128 - 203.192.179.191 au -203.192.179.192 - 203.192.179.199 nz -203.192.179.200 - 203.192.179.223 au -203.192.179.224 - 203.192.179.231 ap -203.192.179.232 - 203.192.179.255 au -203.192.180.0 - 203.192.180.151 hk -203.192.180.152 - 203.192.180.159 ap -203.192.180.160 - 203.192.180.223 hk -203.192.180.224 - 203.192.181.63 ap -203.192.181.64 - 203.192.181.79 tw -203.192.181.80 - 203.192.181.255 ap -203.192.182.0 - 203.192.182.127 kr -203.192.182.128 - 203.192.185.255 ap -203.192.186.0 - 203.192.186.127 au -203.192.186.128 - 203.192.186.255 ap -203.192.187.0 - 203.192.187.31 hk -203.192.187.32 - 203.192.187.223 ap -203.192.187.224 - 203.192.187.255 sg -203.192.188.0 - 203.192.188.255 ap -203.192.189.0 - 203.192.189.255 sg -203.192.190.0 - 203.192.191.255 ap +203.192.144.0 - 203.192.153.255 ap +203.192.154.0 - 203.192.154.255 my +203.192.155.0 - 203.192.161.255 ap +203.192.162.0 - 203.192.162.15 ph +203.192.162.16 - 203.192.165.255 ap +203.192.166.0 - 203.192.166.255 au +203.192.167.0 - 203.192.168.93 ap +203.192.168.94 - 203.192.168.94 sg +203.192.168.95 - 203.192.170.175 ap +203.192.170.176 - 203.192.170.179 tw +203.192.170.180 - 203.192.187.255 ap +203.192.188.0 - 203.192.188.255 ph +203.192.189.0 - 203.192.191.255 ap 203.192.192.0 - 203.192.255.255 in -203.193.0.0 - 203.193.48.127 hk -203.193.48.128 - 203.193.48.159 jp -203.193.48.160 - 203.193.98.255 hk -203.193.99.0 - 203.193.99.255 sg -203.193.100.0 - 203.193.116.72 hk -203.193.116.73 - 203.193.116.73 as -203.193.116.74 - 203.193.116.79 us -203.193.116.80 - 203.193.116.95 hk -203.193.116.96 - 203.193.116.99 us -203.193.116.100 - 203.193.116.255 hk -203.193.117.0 - 203.193.117.127 as -203.193.117.128 - 203.193.117.159 us -203.193.117.160 - 203.193.117.163 hk -203.193.117.164 - 203.193.117.164 kr -203.193.117.165 - 203.193.117.167 hk -203.193.117.168 - 203.193.117.175 kr -203.193.117.176 - 203.193.118.127 hk -203.193.118.128 - 203.193.118.255 us -203.193.119.0 - 203.193.127.255 hk +203.193.0.0 - 203.193.81.59 hk +203.193.81.60 - 203.193.81.63 cn +203.193.81.64 - 203.193.127.255 hk 203.193.128.0 - 203.193.191.255 in 203.193.192.0 - 203.193.223.255 au 203.193.224.0 - 203.193.255.255 cn 203.194.0.0 - 203.194.63.255 au -203.194.64.0 - 203.194.70.79 jp -203.194.70.80 - 203.194.70.127 id -203.194.70.128 - 203.194.70.143 au -203.194.70.144 - 203.194.70.159 nz -203.194.70.160 - 203.194.71.35 jp -203.194.71.36 - 203.194.71.39 id -203.194.71.40 - 203.194.71.63 jp -203.194.71.64 - 203.194.71.67 id -203.194.71.68 - 203.194.72.31 jp -203.194.72.32 - 203.194.72.71 hk -203.194.72.72 - 203.194.74.127 jp -203.194.74.128 - 203.194.74.143 my -203.194.74.144 - 203.194.74.151 jp -203.194.74.152 - 203.194.74.195 my -203.194.74.196 - 203.194.76.255 jp -203.194.77.0 - 203.194.77.63 hk -203.194.77.64 - 203.194.77.95 jp -203.194.77.96 - 203.194.77.127 hk -203.194.77.128 - 203.194.78.127 jp -203.194.78.128 - 203.194.78.224 sg -203.194.78.225 - 203.194.78.255 jp -203.194.79.0 - 203.194.79.63 tw -203.194.79.64 - 203.194.80.15 jp -203.194.80.16 - 203.194.80.143 hk -203.194.80.144 - 203.194.83.191 jp -203.194.83.192 - 203.194.83.199 tw -203.194.83.200 - 203.194.83.207 jp -203.194.83.208 - 203.194.83.223 hk -203.194.83.224 - 203.194.84.255 jp -203.194.85.0 - 203.194.85.255 tw -203.194.86.0 - 203.194.86.79 jp -203.194.86.80 - 203.194.86.95 hk -203.194.86.96 - 203.194.86.103 au -203.194.86.104 - 203.194.86.143 jp -203.194.86.144 - 203.194.86.159 hk -203.194.86.160 - 203.194.86.175 jp -203.194.86.176 - 203.194.86.191 hk -203.194.86.192 - 203.194.86.239 jp -203.194.86.240 - 203.194.86.255 hk -203.194.87.0 - 203.194.87.3 jp -203.194.87.4 - 203.194.87.11 sg -203.194.87.12 - 203.194.87.12 jp -203.194.87.13 - 203.194.87.13 sg -203.194.87.14 - 203.194.87.15 jp -203.194.87.16 - 203.194.87.255 sg -203.194.88.0 - 203.194.88.23 jp -203.194.88.24 - 203.194.88.39 tw -203.194.88.40 - 203.194.88.47 sg -203.194.88.48 - 203.194.88.55 tw -203.194.88.56 - 203.194.88.63 sg -203.194.88.64 - 203.194.88.79 tw -203.194.88.80 - 203.194.91.63 jp -203.194.91.64 - 203.194.91.127 au -203.194.91.128 - 203.194.93.63 jp -203.194.93.64 - 203.194.93.95 au -203.194.93.96 - 203.194.94.55 jp -203.194.94.56 - 203.194.94.63 au -203.194.94.64 - 203.194.94.87 jp -203.194.94.88 - 203.194.94.135 au -203.194.94.136 - 203.194.94.143 hk -203.194.94.144 - 203.194.94.159 au -203.194.94.160 - 203.194.94.167 jp -203.194.94.168 - 203.194.94.175 au -203.194.94.176 - 203.194.94.191 jp -203.194.94.192 - 203.194.94.231 au -203.194.94.232 - 203.194.95.63 jp -203.194.95.64 - 203.194.95.79 tw -203.194.95.80 - 203.194.95.255 jp +203.194.64.0 - 203.194.91.191 jp +203.194.91.192 - 203.194.91.207 au +203.194.91.208 - 203.194.95.255 jp 203.194.96.0 - 203.194.111.255 in 203.194.112.0 - 203.194.119.255 mn -203.194.120.0 - 203.194.127.255 cn -203.194.128.0 - 203.194.255.255 hk +203.194.120.0 - 203.194.255.255 hk 203.195.0.0 - 203.195.63.255 vn 203.195.64.0 - 203.195.95.255 cn 203.195.96.0 - 203.195.111.255 th -203.195.112.0 - 203.195.119.255 cn -203.195.120.0 - 203.195.123.255 th +203.195.112.0 - 203.195.119.255 hk +203.195.120.0 - 203.195.123.255 sg 203.195.124.0 - 203.195.124.255 au -203.195.125.0 - 203.195.125.255 sg -203.195.126.0 - 203.195.126.255 pk +203.195.125.0 - 203.195.126.255 sg 203.195.127.0 - 203.195.127.255 au -203.195.128.0 - 203.196.15.255 cn +203.195.128.0 - 203.196.7.255 cn +203.196.8.0 - 203.196.15.255 hk 203.196.16.0 - 203.196.23.255 jp -203.196.24.0 - 203.196.31.255 ki +203.196.24.0 - 203.196.27.255 vn +203.196.28.0 - 203.196.31.255 cn 203.196.32.0 - 203.196.63.255 au 203.196.64.0 - 203.196.89.255 jp 203.196.90.0 - 203.196.90.255 id @@ -125618,47 +104036,13 @@ 203.196.92.0 - 203.196.95.255 au 203.196.96.0 - 203.196.96.255 jp 203.196.97.0 - 203.196.97.255 au -203.196.98.0 - 203.196.98.255 tw -203.196.99.0 - 203.196.99.255 sg -203.196.100.0 - 203.196.100.255 jp -203.196.101.0 - 203.196.102.255 nz -203.196.103.0 - 203.196.103.255 hk -203.196.104.0 - 203.196.104.255 jp -203.196.105.0 - 203.196.105.255 tw -203.196.106.0 - 203.196.109.255 jp -203.196.110.0 - 203.196.111.255 sg -203.196.112.0 - 203.196.112.15 au -203.196.112.16 - 203.196.112.63 jp -203.196.112.64 - 203.196.112.207 au -203.196.112.208 - 203.196.112.223 sg -203.196.112.224 - 203.196.112.239 nz -203.196.112.240 - 203.196.112.255 hk -203.196.113.0 - 203.196.115.95 jp -203.196.115.96 - 203.196.115.159 sg -203.196.115.160 - 203.196.115.175 jp -203.196.115.176 - 203.196.115.223 sg -203.196.115.224 - 203.196.115.239 jp -203.196.115.240 - 203.196.115.255 sg -203.196.116.0 - 203.196.117.31 jp -203.196.117.32 - 203.196.117.95 ph -203.196.117.96 - 203.196.120.127 jp -203.196.120.128 - 203.196.120.184 hk +203.196.98.0 - 203.196.114.255 jp +203.196.115.0 - 203.196.115.255 ap +203.196.116.0 - 203.196.120.183 jp +203.196.120.184 - 203.196.120.184 hk 203.196.120.185 - 203.196.120.199 jp 203.196.120.200 - 203.196.120.215 hk -203.196.120.216 - 203.196.120.222 jp -203.196.120.223 - 203.196.120.255 hk -203.196.121.0 - 203.196.121.159 nz -203.196.121.160 - 203.196.121.255 jp -203.196.122.0 - 203.196.122.255 sg -203.196.123.0 - 203.196.124.255 jp -203.196.125.0 - 203.196.125.255 hk -203.196.126.0 - 203.196.126.3 ph -203.196.126.4 - 203.196.126.7 jp -203.196.126.8 - 203.196.126.11 ph -203.196.126.12 - 203.196.126.23 jp -203.196.126.24 - 203.196.126.47 ph -203.196.126.48 - 203.196.126.255 jp -203.196.127.0 - 203.196.127.255 hk +203.196.120.216 - 203.196.127.255 jp 203.196.128.0 - 203.197.255.255 in 203.198.0.0 - 203.198.255.255 hk 203.199.0.0 - 203.200.255.255 in @@ -125671,24 +104055,28 @@ 203.201.60.0 - 203.201.63.255 in 203.201.64.0 - 203.201.159.255 au 203.201.160.0 - 203.201.175.255 id -203.201.176.0 - 203.201.180.255 sg -203.201.182.0 - 203.201.182.255 my +203.201.176.0 - 203.201.179.255 sg +203.201.180.0 - 203.201.180.255 ph 203.201.183.0 - 203.201.183.255 au 203.201.184.0 - 203.201.187.255 my 203.201.188.0 - 203.201.191.255 jp 203.201.192.0 - 203.201.255.255 in 203.202.0.0 - 203.202.191.255 au 203.202.192.0 - 203.202.223.255 jp -203.202.224.0 - 203.202.229.255 hk -203.202.230.0 - 203.202.230.255 id -203.202.231.0 - 203.202.231.255 hk -203.202.232.0 - 203.202.233.255 jp +203.202.224.0 - 203.202.231.255 a2 203.202.234.0 - 203.202.234.255 sg 203.202.235.0 - 203.202.235.255 fj -203.202.236.0 - 203.202.239.255 sg +203.202.236.0 - 203.202.239.255 cn 203.202.240.0 - 203.202.255.255 bd 203.203.0.0 - 203.204.255.255 tw -203.205.0.0 - 203.205.255.255 jp +203.205.0.0 - 203.205.63.255 vn +203.205.64.0 - 203.205.95.255 cn +203.205.96.0 - 203.205.113.135 jp +203.205.113.136 - 203.205.113.136 us +203.205.113.137 - 203.205.124.255 jp +203.205.125.0 - 203.205.126.255 us +203.205.127.0 - 203.205.127.255 jp +203.205.128.0 - 203.205.255.255 cn 203.206.0.0 - 203.206.255.255 au 203.207.0.0 - 203.207.15.255 tw 203.207.16.0 - 203.207.31.255 kr @@ -125696,26 +104084,22 @@ 203.207.48.0 - 203.207.51.255 jp 203.207.52.0 - 203.207.59.255 id 203.207.60.0 - 203.207.61.255 nz -203.207.62.0 - 203.207.63.255 in +203.207.62.0 - 203.207.62.255 in 203.207.64.0 - 203.208.19.255 cn 203.208.20.0 - 203.208.20.255 hk 203.208.21.0 - 203.208.21.255 nz -203.208.22.0 - 203.208.22.255 hk +203.208.22.0 - 203.208.22.255 ph 203.208.23.0 - 203.208.23.255 jp 203.208.24.0 - 203.208.31.255 ph 203.208.32.0 - 203.208.63.255 cn 203.208.64.0 - 203.208.127.255 au -203.208.128.0 - 203.208.165.127 sg -203.208.165.128 - 203.208.165.159 np -203.208.165.160 - 203.208.166.191 sg -203.208.166.192 - 203.208.166.223 bd -203.208.166.224 - 203.208.197.143 sg -203.208.197.144 - 203.208.197.159 jp -203.208.197.160 - 203.208.205.191 sg -203.208.205.192 - 203.208.205.255 af -203.208.206.0 - 203.208.207.79 sg -203.208.207.80 - 203.208.207.95 gb -203.208.207.96 - 203.208.255.255 sg +203.208.128.0 - 203.208.141.31 sg +203.208.141.32 - 203.208.141.47 hk +203.208.141.48 - 203.208.199.255 sg +203.208.200.0 - 203.208.200.255 us +203.208.201.0 - 203.208.250.255 sg +203.208.251.0 - 203.208.251.255 ap +203.208.252.0 - 203.208.255.255 sg 203.209.0.0 - 203.209.127.255 th 203.209.128.0 - 203.209.143.255 hk 203.209.144.0 - 203.209.159.255 jp @@ -125729,7 +104113,8 @@ 203.209.224.0 - 203.209.255.255 cn 203.210.0.0 - 203.210.15.255 hk 203.210.16.0 - 203.210.63.255 kr -203.210.64.0 - 203.210.79.255 au +203.210.64.0 - 203.210.78.255 au +203.210.79.0 - 203.210.79.255 ap 203.210.80.0 - 203.210.81.255 id 203.210.82.0 - 203.210.82.255 au 203.210.83.0 - 203.210.87.255 id @@ -125747,7 +104132,7 @@ 203.212.0.0 - 203.212.15.255 cn 203.212.16.0 - 203.212.23.255 au 203.212.24.0 - 203.212.27.255 in -203.212.28.0 - 203.212.31.255 mn +203.212.28.0 - 203.212.31.255 pk 203.212.32.0 - 203.212.63.255 jp 203.212.64.0 - 203.212.79.255 in 203.212.80.0 - 203.212.95.255 cn @@ -125759,7 +104144,9 @@ 203.213.160.0 - 203.213.191.255 jp 203.213.192.0 - 203.213.223.255 ph 203.213.224.0 - 203.215.31.255 au -203.215.32.0 - 203.215.47.255 af +203.215.32.0 - 203.215.33.255 af +203.215.34.0 - 203.215.34.255 us +203.215.35.0 - 203.215.47.255 af 203.215.48.0 - 203.215.48.255 id 203.215.49.0 - 203.215.49.255 kh 203.215.50.0 - 203.215.50.255 id @@ -125771,8 +104158,10 @@ 203.215.128.0 - 203.215.135.255 jp 203.215.136.0 - 203.215.136.255 fr 203.215.137.0 - 203.215.137.255 be -203.215.138.0 - 203.215.141.255 au -203.215.142.0 - 203.215.143.255 nz +203.215.138.0 - 203.215.142.127 au +203.215.142.128 - 203.215.142.233 nz +203.215.142.234 - 203.215.142.234 au +203.215.142.235 - 203.215.143.255 nz 203.215.144.0 - 203.215.144.255 au 203.215.145.0 - 203.215.145.255 hk 203.215.146.0 - 203.215.146.255 cn @@ -125783,8 +104172,7 @@ 203.215.160.0 - 203.215.191.255 pk 203.215.192.0 - 203.215.223.255 kr 203.215.224.0 - 203.215.231.255 jp -203.215.232.0 - 203.215.239.255 cn -203.215.240.0 - 203.215.255.255 hk +203.215.232.0 - 203.215.255.255 hk 203.216.0.0 - 203.216.159.255 jp 203.216.160.0 - 203.216.191.255 kr 203.216.192.0 - 203.216.255.255 jp @@ -125797,9 +104185,10 @@ 203.217.141.0 - 203.217.141.255 au 203.217.142.0 - 203.217.143.255 nz 203.217.144.0 - 203.217.147.255 in -203.217.148.0 - 203.217.155.255 au +203.217.148.0 - 203.217.151.255 au 203.217.156.0 - 203.217.159.255 jp -203.217.160.0 - 203.217.163.255 au +203.217.160.0 - 203.217.161.255 au +203.217.164.0 - 203.217.167.255 cn 203.217.168.0 - 203.217.171.255 kh 203.217.172.0 - 203.217.173.255 id 203.217.174.0 - 203.217.174.255 in @@ -125812,154 +104201,25 @@ 203.218.0.0 - 203.218.255.255 hk 203.219.0.0 - 203.221.255.255 au 203.222.0.0 - 203.222.31.255 tw -203.222.32.0 - 203.222.41.255 au -203.222.42.0 - 203.222.42.31 hk -203.222.42.32 - 203.222.42.47 au -203.222.42.48 - 203.222.42.51 sg -203.222.42.52 - 203.222.42.55 au -203.222.42.56 - 203.222.42.95 hk -203.222.42.96 - 203.222.42.103 sg -203.222.42.104 - 203.222.42.111 jp -203.222.42.112 - 203.222.42.127 hk -203.222.42.128 - 203.222.42.255 sg -203.222.43.0 - 203.222.44.167 hk -203.222.44.168 - 203.222.44.175 cn -203.222.44.176 - 203.222.45.255 hk -203.222.46.0 - 203.222.46.7 kr -203.222.46.8 - 203.222.46.15 sg -203.222.46.16 - 203.222.46.24 jp -203.222.46.25 - 203.222.46.31 au -203.222.46.32 - 203.222.46.255 jp -203.222.47.0 - 203.222.47.255 sg -203.222.48.0 - 203.222.48.55 jp -203.222.48.56 - 203.222.48.71 sg -203.222.48.72 - 203.222.48.79 jp -203.222.48.80 - 203.222.48.95 hk -203.222.48.96 - 203.222.48.127 sg -203.222.48.128 - 203.222.48.159 jp -203.222.48.160 - 203.222.48.191 sg -203.222.48.192 - 203.222.48.223 jp -203.222.48.224 - 203.222.48.239 kr -203.222.48.240 - 203.222.48.255 sg -203.222.49.0 - 203.222.50.15 jp -203.222.50.16 - 203.222.50.31 au -203.222.50.32 - 203.222.50.255 jp -203.222.51.0 - 203.222.51.255 hk -203.222.52.0 - 203.222.52.15 sg -203.222.52.16 - 203.222.52.19 au -203.222.52.20 - 203.222.52.23 sg -203.222.52.24 - 203.222.52.31 au -203.222.52.32 - 203.222.53.191 sg -203.222.53.192 - 203.222.53.223 hk -203.222.53.224 - 203.222.53.227 au -203.222.53.228 - 203.222.53.235 sg -203.222.53.236 - 203.222.53.239 au -203.222.53.240 - 203.222.53.255 sg -203.222.54.0 - 203.222.54.63 au -203.222.54.64 - 203.222.54.79 nz -203.222.54.80 - 203.222.54.171 au -203.222.54.172 - 203.222.54.175 nz -203.222.54.176 - 203.222.63.51 au -203.222.63.52 - 203.222.63.55 nz -203.222.63.56 - 203.222.63.175 au -203.222.63.176 - 203.222.63.191 nz -203.222.63.192 - 203.222.164.23 au -203.222.164.24 - 203.222.164.31 tw -203.222.164.32 - 203.222.164.63 au -203.222.164.64 - 203.222.164.223 hk -203.222.164.224 - 203.222.164.231 tw -203.222.164.232 - 203.222.164.235 hk -203.222.164.236 - 203.222.164.239 au -203.222.164.240 - 203.222.164.255 tw -203.222.165.0 - 203.222.165.255 hk -203.222.166.0 - 203.222.166.95 sg -203.222.166.96 - 203.222.166.103 cn -203.222.166.104 - 203.222.166.111 sg -203.222.166.112 - 203.222.166.127 us -203.222.166.128 - 203.222.166.135 sg -203.222.166.136 - 203.222.166.143 in -203.222.166.144 - 203.222.166.159 sg -203.222.166.160 - 203.222.166.175 hk -203.222.166.176 - 203.222.166.191 sg -203.222.166.192 - 203.222.166.255 cn -203.222.167.0 - 203.222.167.47 hk -203.222.167.48 - 203.222.167.55 tw -203.222.167.56 - 203.222.167.63 cn -203.222.167.64 - 203.222.167.127 hk -203.222.167.128 - 203.222.167.143 cn -203.222.167.144 - 203.222.167.159 kr -203.222.167.160 - 203.222.167.255 hk -203.222.168.0 - 203.222.168.23 jp -203.222.168.24 - 203.222.168.31 kr -203.222.168.32 - 203.222.168.63 au -203.222.168.64 - 203.222.168.111 jp +203.222.32.0 - 203.222.53.31 au +203.222.53.32 - 203.222.53.63 sg +203.222.53.64 - 203.222.168.111 au 203.222.168.112 - 203.222.168.127 kr -203.222.168.128 - 203.222.168.191 jp -203.222.168.192 - 203.222.168.207 kr -203.222.168.208 - 203.222.168.255 jp -203.222.169.0 - 203.222.169.255 hk -203.222.170.0 - 203.222.170.23 jp -203.222.170.24 - 203.222.170.63 kr -203.222.170.64 - 203.222.170.135 jp -203.222.170.136 - 203.222.170.143 kr -203.222.170.144 - 203.222.170.159 au -203.222.170.160 - 203.222.171.15 jp -203.222.171.16 - 203.222.171.31 au -203.222.171.32 - 203.222.171.47 jp -203.222.171.48 - 203.222.171.63 kr -203.222.171.64 - 203.222.171.127 jp -203.222.171.128 - 203.222.171.159 au -203.222.171.160 - 203.222.171.175 tw -203.222.171.176 - 203.222.171.191 in -203.222.171.192 - 203.222.171.255 jp -203.222.172.0 - 203.222.172.143 au -203.222.172.144 - 203.222.172.159 nz -203.222.172.160 - 203.222.172.191 au -203.222.172.192 - 203.222.172.195 nz -203.222.172.196 - 203.222.174.199 au -203.222.174.200 - 203.222.174.207 cn -203.222.174.208 - 203.222.174.255 au -203.222.175.0 - 203.222.175.255 nz -203.222.176.0 - 203.222.176.39 hk -203.222.176.40 - 203.222.176.47 tw -203.222.176.48 - 203.222.176.95 hk -203.222.176.96 - 203.222.176.111 au -203.222.176.112 - 203.222.176.159 hk -203.222.176.160 - 203.222.176.191 au -203.222.176.192 - 203.222.176.243 hk -203.222.176.244 - 203.222.177.71 cn -203.222.177.72 - 203.222.177.87 hk -203.222.177.88 - 203.222.177.103 tw -203.222.177.104 - 203.222.177.111 cn -203.222.177.112 - 203.222.177.127 au -203.222.177.128 - 203.222.177.191 hk -203.222.177.192 - 203.222.177.255 cn -203.222.178.0 - 203.222.181.255 au -203.222.182.0 - 203.222.182.95 hk -203.222.182.96 - 203.222.182.111 cn -203.222.182.112 - 203.222.182.127 hk +203.222.168.128 - 203.222.169.255 au +203.222.170.0 - 203.222.170.255 ap +203.222.171.0 - 203.222.176.111 au +203.222.176.112 - 203.222.176.127 hk +203.222.176.128 - 203.222.182.127 au 203.222.182.128 - 203.222.182.143 jp -203.222.182.144 - 203.222.182.159 cn -203.222.182.160 - 203.222.182.191 au -203.222.182.192 - 203.222.183.255 hk -203.222.184.0 - 203.222.184.255 jp -203.222.185.0 - 203.222.185.255 au -203.222.186.0 - 203.222.187.63 jp -203.222.187.64 - 203.222.187.95 kr -203.222.187.96 - 203.222.187.111 hk -203.222.187.112 - 203.222.187.127 kr -203.222.187.128 - 203.222.187.167 in -203.222.187.168 - 203.222.187.175 sg -203.222.187.176 - 203.222.187.183 cn -203.222.187.184 - 203.222.187.191 au -203.222.187.192 - 203.222.187.255 in -203.222.188.0 - 203.222.188.255 au -203.222.189.0 - 203.222.190.255 hk -203.222.191.0 - 203.222.191.255 au -203.222.192.0 - 203.222.207.255 hk +203.222.182.144 - 203.222.191.255 au +203.222.192.0 - 203.222.197.255 hk +203.222.198.0 - 203.222.198.255 id +203.222.199.0 - 203.222.201.255 hk +203.222.202.0 - 203.222.202.255 id +203.222.203.0 - 203.222.207.255 hk 203.222.208.0 - 203.222.255.255 jp 203.223.0.0 - 203.223.15.255 us -203.223.16.0 - 203.223.23.255 cn +203.223.16.0 - 203.223.23.255 hk 203.223.24.0 - 203.223.31.255 jp 203.223.32.0 - 203.223.47.255 kh 203.223.48.0 - 203.223.87.255 jp @@ -125977,12 +104237,18 @@ 203.223.184.0 - 203.223.187.255 au 203.223.188.0 - 203.223.191.255 in 203.223.192.0 - 203.223.255.255 hk -203.224.0.0 - 203.255.255.255 kr -204.0.0.0 - 204.4.133.255 us -204.4.134.0 - 204.4.134.255 gb -204.4.135.0 - 204.6.39.255 us +203.224.0.0 - 203.247.149.149 kr +203.247.149.150 - 203.247.149.153 ap +203.247.149.154 - 203.255.255.255 kr +204.0.0.0 - 204.4.142.255 us +204.4.143.0 - 204.4.143.255 gb +204.4.144.0 - 204.6.39.255 us 204.6.40.0 - 204.6.44.255 fr -204.6.45.0 - 204.8.63.255 us +204.6.45.0 - 204.7.255.255 us +204.8.0.0 - 204.8.3.255 ca +204.8.4.0 - 204.8.39.255 us +204.8.40.0 - 204.8.40.255 a2 +204.8.41.0 - 204.8.63.255 us 204.8.64.0 - 204.8.64.31 vi 204.8.64.32 - 204.8.64.47 us 204.8.64.48 - 204.8.64.95 vi @@ -125990,500 +104256,80 @@ 204.8.64.112 - 204.8.67.255 vi 204.8.68.0 - 204.8.71.255 us 204.8.72.0 - 204.8.75.255 ca -204.8.76.0 - 204.9.7.255 us +204.8.76.0 - 204.8.215.255 us +204.8.216.0 - 204.8.223.255 pl +204.8.224.0 - 204.9.7.255 us 204.9.8.0 - 204.9.15.255 ca -204.9.16.0 - 204.9.74.199 us -204.9.74.200 - 204.9.74.207 ca -204.9.74.208 - 204.9.76.135 us -204.9.76.136 - 204.9.76.143 hk -204.9.76.144 - 204.9.77.13 us -204.9.77.14 - 204.9.77.21 ca -204.9.77.22 - 204.9.79.47 us -204.9.79.48 - 204.9.79.55 mx -204.9.79.56 - 204.9.79.191 us -204.9.79.192 - 204.9.79.199 gb -204.9.79.200 - 204.9.79.255 us +204.9.16.0 - 204.9.79.255 us 204.9.80.0 - 204.9.83.255 ca 204.9.84.0 - 204.9.159.255 us -204.9.160.0 - 204.9.161.95 ca -204.9.161.96 - 204.9.161.127 bm -204.9.161.128 - 204.9.161.159 ca -204.9.161.160 - 204.9.161.175 ee -204.9.161.176 - 204.9.163.127 ca -204.9.163.128 - 204.9.163.255 ee -204.9.164.0 - 204.9.164.63 ca -204.9.164.64 - 204.9.164.95 ee -204.9.164.96 - 204.9.165.47 ca -204.9.165.48 - 204.9.165.63 us -204.9.165.64 - 204.9.165.79 ca -204.9.165.80 - 204.9.165.87 ee -204.9.165.88 - 204.9.165.159 ca -204.9.165.160 - 204.9.165.191 au -204.9.165.192 - 204.9.167.255 ca +204.9.160.0 - 204.9.167.255 ca 204.9.168.0 - 204.9.242.255 us 204.9.243.0 - 204.9.243.255 ca -204.9.244.0 - 204.10.0.239 us -204.10.0.240 - 204.10.0.247 an -204.10.0.248 - 204.10.3.1 us -204.10.3.2 - 204.10.3.191 an -204.10.3.192 - 204.10.55.255 us -204.10.56.0 - 204.10.59.255 ca -204.10.60.0 - 204.10.109.215 us -204.10.109.216 - 204.10.109.223 tr -204.10.109.224 - 204.10.109.231 us -204.10.109.232 - 204.10.109.235 tr -204.10.109.236 - 204.10.110.127 us -204.10.110.128 - 204.10.110.159 ca -204.10.110.160 - 204.10.110.223 us -204.10.110.224 - 204.10.110.239 in -204.10.110.240 - 204.10.111.31 us -204.10.111.32 - 204.10.111.63 ca -204.10.111.64 - 204.10.111.135 us -204.10.111.136 - 204.10.111.143 il -204.10.111.144 - 204.10.111.255 us -204.10.112.0 - 204.10.119.255 jm -204.10.120.0 - 204.10.199.255 us +204.9.244.0 - 204.10.159.255 us +204.10.160.0 - 204.10.163.255 ca +204.10.164.0 - 204.10.199.255 us 204.10.200.0 - 204.10.207.255 ca 204.10.208.0 - 204.10.224.63 us 204.10.224.64 - 204.10.224.95 ng -204.10.224.96 - 204.10.225.223 us -204.10.225.224 - 204.10.225.239 ec -204.10.225.240 - 204.10.231.255 us +204.10.224.96 - 204.10.239.255 us 204.10.240.0 - 204.10.243.255 ca 204.10.244.0 - 204.11.47.255 us -204.11.48.0 - 204.11.49.23 ca -204.11.49.24 - 204.11.49.31 nl -204.11.49.32 - 204.11.49.39 jp -204.11.49.40 - 204.11.49.47 ca -204.11.49.48 - 204.11.49.55 us -204.11.49.56 - 204.11.49.79 ca -204.11.49.80 - 204.11.49.87 us -204.11.49.88 - 204.11.49.143 ca -204.11.49.144 - 204.11.49.151 us -204.11.49.152 - 204.11.49.167 ca -204.11.49.168 - 204.11.49.175 jp -204.11.49.176 - 204.11.49.199 ca -204.11.49.200 - 204.11.49.207 tl -204.11.49.208 - 204.11.50.31 ca -204.11.50.32 - 204.11.50.47 cr -204.11.50.48 - 204.11.51.159 ca -204.11.51.160 - 204.11.51.191 us -204.11.51.192 - 204.11.52.255 ca -204.11.53.0 - 204.11.53.127 gb -204.11.53.128 - 204.11.55.255 ca -204.11.56.0 - 204.11.74.79 us -204.11.74.80 - 204.11.74.87 il -204.11.74.88 - 204.11.119.255 us +204.11.48.0 - 204.11.55.255 ca +204.11.56.0 - 204.11.59.255 vg +204.11.60.0 - 204.11.119.255 us 204.11.120.0 - 204.11.123.255 ca 204.11.124.0 - 204.11.151.255 us 204.11.152.0 - 204.11.156.255 vi 204.11.157.0 - 204.11.157.255 us 204.11.158.0 - 204.11.159.255 vi -204.11.160.0 - 204.11.221.31 us -204.11.221.32 - 204.11.221.79 il -204.11.221.80 - 204.12.0.31 us -204.12.0.32 - 204.12.0.39 ae -204.12.0.40 - 204.12.1.175 us -204.12.1.176 - 204.12.1.191 de -204.12.1.192 - 204.12.3.111 us -204.12.3.112 - 204.12.3.119 de -204.12.3.120 - 204.12.7.111 us -204.12.7.112 - 204.12.7.119 au -204.12.7.120 - 204.12.9.215 us -204.12.9.216 - 204.12.9.223 ca -204.12.9.224 - 204.12.11.199 us -204.12.11.200 - 204.12.11.207 pe -204.12.11.208 - 204.12.11.231 us -204.12.11.232 - 204.12.11.239 gb -204.12.11.240 - 204.12.11.255 us -204.12.12.0 - 204.12.12.31 gb -204.12.12.32 - 204.12.14.199 us -204.12.14.200 - 204.12.14.207 il -204.12.14.208 - 204.12.16.39 us -204.12.16.40 - 204.12.16.47 in -204.12.16.48 - 204.12.16.167 us -204.12.16.168 - 204.12.16.183 gb -204.12.16.184 - 204.12.17.119 us -204.12.17.120 - 204.12.17.127 au -204.12.17.128 - 204.12.17.191 us -204.12.17.192 - 204.12.17.207 in -204.12.17.208 - 204.12.18.31 us -204.12.18.32 - 204.12.18.47 pk -204.12.18.48 - 204.12.18.63 ro -204.12.18.64 - 204.12.18.223 us -204.12.18.224 - 204.12.18.239 au -204.12.18.240 - 204.12.21.135 us -204.12.21.136 - 204.12.21.151 ca -204.12.21.152 - 204.12.24.127 us -204.12.24.128 - 204.12.24.151 pk -204.12.24.152 - 204.12.24.167 ca -204.12.24.168 - 204.12.25.95 us -204.12.25.96 - 204.12.25.103 ie -204.12.25.104 - 204.12.25.191 us -204.12.25.192 - 204.12.25.199 ca -204.12.25.200 - 204.12.25.215 us -204.12.25.216 - 204.12.25.223 ie -204.12.25.224 - 204.12.26.247 us -204.12.26.248 - 204.12.26.255 ie -204.12.27.0 - 204.12.27.23 us -204.12.27.24 - 204.12.27.31 gt -204.12.27.32 - 204.12.27.95 us -204.12.27.96 - 204.12.27.127 au -204.12.27.128 - 204.12.27.143 ca -204.12.27.144 - 204.12.27.175 us -204.12.27.176 - 204.12.27.183 jo -204.12.27.184 - 204.12.27.215 us -204.12.27.216 - 204.12.27.223 gb -204.12.27.224 - 204.12.28.31 us -204.12.28.32 - 204.12.28.55 ca -204.12.28.56 - 204.12.29.207 us -204.12.29.208 - 204.12.29.223 ca -204.12.29.224 - 204.12.30.143 us -204.12.30.144 - 204.12.30.151 dk -204.12.30.152 - 204.12.30.255 us -204.12.31.0 - 204.12.31.15 gb -204.12.31.16 - 204.12.31.55 us -204.12.31.56 - 204.12.31.63 ae -204.12.31.64 - 204.12.31.71 sa -204.12.31.72 - 204.12.32.143 us -204.12.32.144 - 204.12.32.159 im -204.12.32.160 - 204.12.32.255 us -204.12.33.0 - 204.12.33.7 ca -204.12.33.8 - 204.12.33.39 us -204.12.33.40 - 204.12.33.47 ae -204.12.33.48 - 204.12.33.55 au -204.12.33.56 - 204.12.34.7 us -204.12.34.8 - 204.12.34.31 ca -204.12.34.32 - 204.12.34.247 us -204.12.34.248 - 204.12.34.255 ca -204.12.35.0 - 204.12.35.47 us -204.12.35.48 - 204.12.35.63 de -204.12.35.64 - 204.12.35.183 us -204.12.35.184 - 204.12.35.207 gb -204.12.35.208 - 204.12.36.71 us -204.12.36.72 - 204.12.36.79 sa -204.12.36.80 - 204.12.36.111 us -204.12.36.112 - 204.12.36.119 fr -204.12.36.120 - 204.12.36.167 us -204.12.36.168 - 204.12.36.191 ca -204.12.36.192 - 204.12.36.207 us -204.12.36.208 - 204.12.36.215 au -204.12.36.216 - 204.12.36.239 us -204.12.36.240 - 204.12.36.247 th -204.12.36.248 - 204.12.37.39 us -204.12.37.40 - 204.12.37.55 gb -204.12.37.56 - 204.12.37.103 us -204.12.37.104 - 204.12.37.127 au -204.12.37.128 - 204.12.41.127 us -204.12.41.128 - 204.12.41.143 it -204.12.41.144 - 204.12.41.255 us -204.12.42.0 - 204.12.42.15 au -204.12.42.16 - 204.12.42.47 us -204.12.42.48 - 204.12.42.55 au -204.12.42.56 - 204.12.42.79 us -204.12.42.80 - 204.12.42.87 de -204.12.42.88 - 204.12.42.111 us -204.12.42.112 - 204.12.42.135 de -204.12.42.136 - 204.12.43.175 us -204.12.43.176 - 204.12.43.183 il -204.12.43.184 - 204.12.47.135 us -204.12.47.136 - 204.12.47.143 au -204.12.47.144 - 204.12.47.191 us -204.12.47.192 - 204.12.47.199 ca -204.12.47.200 - 204.12.47.207 us -204.12.47.208 - 204.12.47.215 sa -204.12.47.216 - 204.12.50.255 us -204.12.51.0 - 204.12.51.63 pr -204.12.51.64 - 204.12.52.23 us -204.12.52.24 - 204.12.52.31 au -204.12.52.32 - 204.12.52.215 us -204.12.52.216 - 204.12.52.239 ca -204.12.52.240 - 204.12.52.255 gb -204.12.53.0 - 204.12.53.7 us -204.12.53.8 - 204.12.53.15 ca -204.12.53.16 - 204.12.53.191 us -204.12.53.192 - 204.12.53.207 ca -204.12.53.208 - 204.12.54.119 us -204.12.54.120 - 204.12.54.127 il -204.12.54.128 - 204.12.54.175 us -204.12.54.176 - 204.12.54.183 ca -204.12.54.184 - 204.12.54.191 il -204.12.54.192 - 204.12.55.103 us -204.12.55.104 - 204.12.55.111 nl -204.12.55.112 - 204.12.55.119 us -204.12.55.120 - 204.12.55.127 mx -204.12.55.128 - 204.12.55.135 br -204.12.55.136 - 204.12.56.199 us -204.12.56.200 - 204.12.56.207 au -204.12.56.208 - 204.12.57.55 us -204.12.57.56 - 204.12.57.63 kh -204.12.57.64 - 204.12.57.207 us -204.12.57.208 - 204.12.57.215 br -204.12.57.216 - 204.12.58.7 us -204.12.58.8 - 204.12.58.23 pa -204.12.58.24 - 204.12.58.127 us -204.12.58.128 - 204.12.58.135 kh -204.12.58.136 - 204.12.58.159 us -204.12.58.160 - 204.12.58.167 gb -204.12.58.168 - 204.12.58.199 us -204.12.58.200 - 204.12.58.207 in -204.12.58.208 - 204.12.59.191 us -204.12.59.192 - 204.12.59.207 gb -204.12.59.208 - 204.12.59.255 us -204.12.60.0 - 204.12.60.15 ca -204.12.60.16 - 204.12.60.63 us -204.12.60.64 - 204.12.60.71 bb -204.12.60.72 - 204.12.60.175 us -204.12.60.176 - 204.12.60.183 il -204.12.60.184 - 204.12.60.191 pt -204.12.60.192 - 204.12.60.207 pk -204.12.60.208 - 204.12.60.239 us -204.12.60.240 - 204.12.60.247 ca -204.12.60.248 - 204.12.61.31 us -204.12.61.32 - 204.12.61.95 ca -204.12.61.96 - 204.12.61.223 us -204.12.61.224 - 204.12.61.247 pe -204.12.61.248 - 204.12.62.215 us -204.12.62.216 - 204.12.62.223 au -204.12.62.224 - 204.12.62.255 gb -204.12.63.0 - 204.12.63.31 us -204.12.63.32 - 204.12.63.39 ae -204.12.63.40 - 204.12.63.95 us -204.12.63.96 - 204.12.63.103 br -204.12.63.104 - 204.12.63.159 us -204.12.63.160 - 204.12.63.167 pa -204.12.63.168 - 204.12.68.183 us -204.12.68.184 - 204.12.68.215 br -204.12.68.216 - 204.12.69.127 us -204.12.69.128 - 204.12.69.159 ca -204.12.69.160 - 204.12.69.223 us -204.12.69.224 - 204.12.69.239 in -204.12.69.240 - 204.12.72.183 us -204.12.72.184 - 204.12.72.199 ae -204.12.72.200 - 204.12.74.71 us -204.12.74.72 - 204.12.74.79 de -204.12.74.80 - 204.12.75.143 us -204.12.75.144 - 204.12.75.159 in -204.12.75.160 - 204.12.75.167 us -204.12.75.168 - 204.12.75.175 ae -204.12.75.176 - 204.12.87.255 us -204.12.88.0 - 204.12.88.255 au -204.12.89.0 - 204.12.97.135 us -204.12.97.136 - 204.12.97.143 au -204.12.97.144 - 204.12.97.159 ca -204.12.97.160 - 204.12.97.183 us -204.12.97.184 - 204.12.97.191 mx -204.12.97.192 - 204.12.97.239 us -204.12.97.240 - 204.12.97.255 za -204.12.98.0 - 204.12.98.31 us -204.12.98.32 - 204.12.98.47 au -204.12.98.48 - 204.12.106.143 us -204.12.106.144 - 204.12.106.151 ca -204.12.106.152 - 204.12.107.15 us -204.12.107.16 - 204.12.107.23 ae -204.12.107.24 - 204.12.107.239 us -204.12.107.240 - 204.12.107.247 sa -204.12.107.248 - 204.12.108.79 us -204.12.108.80 - 204.12.108.95 au -204.12.108.96 - 204.12.108.151 us -204.12.108.152 - 204.12.108.159 ca -204.12.108.160 - 204.12.108.207 us -204.12.108.208 - 204.12.108.223 au -204.12.108.224 - 204.12.109.79 us +204.11.160.0 - 204.12.109.79 us 204.12.109.80 - 204.12.109.95 it -204.12.109.96 - 204.12.110.47 us -204.12.110.48 - 204.12.110.55 gb -204.12.110.56 - 204.12.110.199 us -204.12.110.200 - 204.12.110.215 br -204.12.110.216 - 204.12.111.79 us -204.12.111.80 - 204.12.111.87 ca -204.12.111.88 - 204.12.112.55 us -204.12.112.56 - 204.12.112.63 au -204.12.112.64 - 204.12.112.111 us -204.12.112.112 - 204.12.112.135 br -204.12.112.136 - 204.12.112.143 au -204.12.112.144 - 204.12.112.175 us -204.12.112.176 - 204.12.112.191 nl -204.12.112.192 - 204.12.112.199 us -204.12.112.200 - 204.12.112.207 gb -204.12.112.208 - 204.12.114.127 us -204.12.114.128 - 204.12.114.143 it -204.12.114.144 - 204.12.114.151 us -204.12.114.152 - 204.12.114.167 mx -204.12.114.168 - 204.12.114.223 us -204.12.114.224 - 204.12.114.239 il -204.12.114.240 - 204.12.115.47 us -204.12.115.48 - 204.12.115.71 ca -204.12.115.72 - 204.12.115.167 us -204.12.115.168 - 204.12.115.175 ca -204.12.115.176 - 204.12.115.207 us -204.12.115.208 - 204.12.115.231 il -204.12.115.232 - 204.12.116.63 us -204.12.116.64 - 204.12.116.95 ca -204.12.116.96 - 204.12.116.127 us -204.12.116.128 - 204.12.116.135 ca -204.12.116.136 - 204.12.120.111 us -204.12.120.112 - 204.12.120.127 br -204.12.120.128 - 204.12.121.119 us -204.12.121.120 - 204.12.121.127 br -204.12.121.128 - 204.12.121.247 us -204.12.121.248 - 204.12.121.255 au -204.12.122.0 - 204.12.124.63 us -204.12.124.64 - 204.12.124.79 il -204.12.124.80 - 204.12.125.55 us -204.12.125.56 - 204.12.125.63 ie -204.12.125.64 - 204.12.125.223 us -204.12.125.224 - 204.12.125.231 vg -204.12.125.232 - 204.12.126.23 us -204.12.126.24 - 204.12.126.31 lb -204.12.126.32 - 204.12.126.119 us -204.12.126.120 - 204.12.126.127 vg -204.12.126.128 - 204.12.127.255 us +204.12.109.96 - 204.12.127.255 us 204.12.128.0 - 204.12.143.255 za -204.12.144.0 - 204.12.154.255 ca -204.12.155.0 - 204.12.155.127 us -204.12.155.128 - 204.12.155.255 ca -204.12.156.0 - 204.12.157.255 us -204.12.158.0 - 204.12.159.255 ca -204.12.160.0 - 204.12.216.111 us -204.12.216.112 - 204.12.216.119 ru -204.12.216.120 - 204.12.226.135 us -204.12.226.136 - 204.12.226.143 ru -204.12.226.144 - 204.12.235.183 us -204.12.235.184 - 204.12.235.191 ru -204.12.235.192 - 204.12.243.151 us -204.12.243.152 - 204.12.243.167 ru -204.12.243.168 - 204.12.244.119 us -204.12.244.120 - 204.12.244.127 ru -204.12.244.128 - 204.12.244.191 us -204.12.244.192 - 204.12.244.199 ru -204.12.244.200 - 204.12.244.223 us -204.12.244.224 - 204.12.244.231 ru -204.12.244.232 - 204.12.251.191 us -204.12.251.192 - 204.12.251.199 ru -204.12.251.200 - 204.13.47.255 us +204.12.144.0 - 204.12.159.255 ca +204.12.160.0 - 204.13.47.255 us 204.13.48.0 - 204.13.51.255 ca -204.13.52.0 - 204.13.52.126 us -204.13.52.127 - 204.13.52.136 au -204.13.52.137 - 204.13.228.255 us -204.13.229.0 - 204.13.229.15 ca -204.13.229.16 - 204.14.15.255 us -204.14.16.0 - 204.14.19.223 ca -204.14.19.224 - 204.14.19.239 cy -204.14.19.240 - 204.14.19.255 ca -204.14.20.0 - 204.14.39.255 us -204.14.40.0 - 204.14.41.255 a2 -204.14.42.0 - 204.14.42.127 ng -204.14.42.128 - 204.14.42.207 a2 -204.14.42.208 - 204.14.42.223 us -204.14.42.224 - 204.14.44.95 a2 -204.14.44.96 - 204.14.44.103 us -204.14.44.104 - 204.14.44.111 ao -204.14.44.112 - 204.14.44.175 a2 -204.14.44.176 - 204.14.44.191 us -204.14.44.192 - 204.14.44.207 ng -204.14.44.208 - 204.14.44.223 us -204.14.44.224 - 204.14.46.191 a2 -204.14.46.192 - 204.14.46.207 ng -204.14.46.208 - 204.14.47.255 a2 -204.14.48.0 - 204.14.93.255 us +204.13.52.0 - 204.13.103.255 us +204.13.104.0 - 204.13.107.255 tc +204.13.108.0 - 204.13.251.255 us +204.13.252.0 - 204.13.255.255 ca +204.14.0.0 - 204.14.15.255 us +204.14.16.0 - 204.14.19.255 ca +204.14.20.0 - 204.14.35.255 us +204.14.40.0 - 204.14.47.255 a2 +204.14.48.0 - 204.14.71.255 us +204.14.72.0 - 204.14.79.255 ca +204.14.80.0 - 204.14.93.255 us 204.14.94.0 - 204.14.94.255 ru -204.14.95.0 - 204.14.95.15 id -204.14.95.16 - 204.14.95.23 us -204.14.95.24 - 204.14.95.31 tt -204.14.95.32 - 204.14.95.79 us -204.14.95.80 - 204.14.95.87 at -204.14.95.88 - 204.14.247.255 us +204.14.95.0 - 204.14.247.255 us 204.14.248.0 - 204.14.255.255 ai -204.15.0.0 - 204.15.19.119 us -204.15.19.120 - 204.15.19.127 hn -204.15.19.128 - 204.15.19.207 us -204.15.19.208 - 204.15.19.215 hn -204.15.19.216 - 204.15.31.255 us -204.15.32.0 - 204.15.36.175 ca -204.15.36.176 - 204.15.36.191 us -204.15.36.192 - 204.15.36.223 ca -204.15.36.224 - 204.15.36.231 us -204.15.36.232 - 204.15.39.255 ca -204.15.40.0 - 204.15.74.135 us -204.15.74.136 - 204.15.74.143 ca -204.15.74.144 - 204.15.74.223 us -204.15.74.224 - 204.15.74.231 gb -204.15.74.232 - 204.15.76.199 us -204.15.76.200 - 204.15.76.207 ca -204.15.76.208 - 204.15.143.255 us +204.15.0.0 - 204.15.31.255 us +204.15.32.0 - 204.15.39.255 ca +204.15.40.0 - 204.15.143.255 us 204.15.144.0 - 204.15.151.255 pr -204.15.152.0 - 204.15.183.255 us -204.15.184.0 - 204.15.192.15 ca -204.15.192.16 - 204.15.192.23 us -204.15.192.24 - 204.15.192.79 ca -204.15.192.80 - 204.15.192.95 us -204.15.192.96 - 204.15.192.103 au -204.15.192.104 - 204.15.192.111 ca -204.15.192.112 - 204.15.192.119 us -204.15.192.120 - 204.15.192.167 ca -204.15.192.168 - 204.15.192.175 us -204.15.192.176 - 204.15.192.191 ca -204.15.192.192 - 204.15.192.199 us -204.15.192.200 - 204.15.193.175 ca -204.15.193.176 - 204.15.193.191 us -204.15.193.192 - 204.15.193.207 ca -204.15.193.208 - 204.15.193.223 us -204.15.193.224 - 204.15.193.239 ca -204.15.193.240 - 204.15.193.255 us -204.15.194.0 - 204.15.196.255 ca -204.15.197.0 - 204.15.197.15 my -204.15.197.16 - 204.15.197.239 ca -204.15.197.240 - 204.15.197.255 my -204.15.198.0 - 204.15.198.103 ca -204.15.198.104 - 204.15.198.111 nl -204.15.198.112 - 204.15.198.119 ca -204.15.198.120 - 204.15.198.127 es -204.15.198.128 - 204.15.198.135 ca -204.15.198.136 - 204.15.198.143 nz -204.15.198.144 - 204.15.198.207 ca -204.15.198.208 - 204.15.198.215 us -204.15.198.216 - 204.15.198.223 nz -204.15.198.224 - 204.15.198.239 us -204.15.198.240 - 204.15.198.247 nz -204.15.198.248 - 204.15.199.111 ca -204.15.199.112 - 204.15.199.119 my -204.15.199.120 - 204.15.199.255 ca -204.15.200.0 - 204.15.211.31 us -204.15.211.32 - 204.15.211.39 gb -204.15.211.40 - 204.15.217.215 us -204.15.217.216 - 204.15.217.223 ht -204.15.217.224 - 204.15.218.231 us -204.15.218.232 - 204.15.218.239 hn -204.15.218.240 - 204.15.224.151 us -204.15.224.152 - 204.15.224.159 es -204.15.224.160 - 204.15.224.239 us -204.15.224.240 - 204.15.224.255 ca -204.15.225.0 - 204.15.225.35 us -204.15.225.36 - 204.15.225.51 ca -204.15.225.52 - 204.15.225.191 us -204.15.225.192 - 204.15.225.207 il -204.15.225.208 - 204.15.248.127 us -204.15.248.128 - 204.15.248.191 ca -204.15.248.192 - 204.15.254.113 us -204.15.254.114 - 204.15.254.123 gb -204.15.254.124 - 204.16.7.255 us +204.15.152.0 - 204.15.171.255 us +204.15.172.0 - 204.15.175.255 ca +204.15.176.0 - 204.15.183.255 us +204.15.184.0 - 204.15.199.255 ca +204.15.200.0 - 204.15.207.255 us +204.15.216.0 - 204.16.7.255 us 204.16.8.0 - 204.16.11.255 kn -204.16.12.0 - 204.16.16.231 us -204.16.16.232 - 204.16.16.239 bz -204.16.16.240 - 204.16.99.255 us +204.16.12.0 - 204.16.99.255 us 204.16.100.0 - 204.16.103.255 ca 204.16.104.0 - 204.16.111.255 us +204.16.112.0 - 204.16.115.255 ag +204.16.116.0 - 204.16.123.255 us 204.16.124.0 - 204.16.127.255 a2 204.16.128.0 - 204.16.143.255 us 204.16.144.0 - 204.16.151.255 ca 204.16.152.0 - 204.16.199.255 us -204.16.200.0 - 204.16.200.127 ca -204.16.200.128 - 204.16.200.159 us -204.16.200.160 - 204.16.207.255 ca +204.16.200.0 - 204.16.207.255 ca 204.16.208.0 - 204.17.153.255 us 204.17.154.0 - 204.17.154.255 ca -204.17.155.0 - 204.19.0.255 us +204.17.155.0 - 204.17.231.111 us +204.17.231.112 - 204.17.231.115 ca +204.17.231.116 - 204.19.0.255 us 204.19.1.0 - 204.19.14.255 ca 204.19.15.0 - 204.19.15.255 us 204.19.16.0 - 204.19.101.255 ca @@ -126520,33 +104366,19 @@ 204.29.213.0 - 204.29.213.255 ca 204.29.214.0 - 204.39.255.255 us 204.40.0.0 - 204.41.255.255 ca -204.42.0.0 - 204.47.255.255 us +204.42.0.0 - 204.44.139.255 us +204.44.140.0 - 204.44.143.255 ca +204.44.144.0 - 204.47.255.255 us 204.48.0.0 - 204.48.7.255 ca 204.48.8.0 - 204.48.63.255 us 204.48.64.0 - 204.48.95.255 ca 204.48.96.0 - 204.49.255.255 us -204.50.0.0 - 204.50.7.159 ca -204.50.7.160 - 204.50.7.175 us -204.50.7.176 - 204.50.84.151 ca -204.50.84.152 - 204.50.84.159 us -204.50.84.160 - 204.50.140.7 ca -204.50.140.8 - 204.50.140.15 us -204.50.140.16 - 204.50.157.111 ca -204.50.157.112 - 204.50.157.127 us -204.50.157.128 - 204.50.181.191 ca -204.50.181.192 - 204.50.181.207 us -204.50.181.208 - 204.50.255.255 ca -204.51.0.0 - 204.51.71.239 us -204.51.71.240 - 204.51.71.255 do -204.51.72.0 - 204.51.72.15 us -204.51.72.16 - 204.51.72.31 bb -204.51.72.32 - 204.51.77.47 us -204.51.77.48 - 204.51.77.127 a2 -204.51.77.128 - 204.51.83.159 us -204.51.83.160 - 204.51.83.175 ni -204.51.83.176 - 204.51.86.63 us -204.51.86.64 - 204.51.86.127 dk -204.51.86.128 - 204.52.207.255 us +204.50.0.0 - 204.50.69.255 ca +204.50.70.0 - 204.50.70.255 eu +204.50.71.0 - 204.50.255.255 ca +204.51.0.0 - 204.52.186.255 us +204.52.187.0 - 204.52.187.255 eu +204.52.188.0 - 204.52.207.255 us 204.52.208.0 - 204.52.208.255 il 204.52.209.0 - 204.58.61.255 us 204.58.62.0 - 204.58.63.255 ca @@ -126554,35 +104386,44 @@ 204.58.136.0 - 204.58.139.255 mx 204.58.140.0 - 204.58.183.255 us 204.58.184.0 - 204.58.184.255 ca -204.58.185.0 - 204.62.9.255 us +204.58.185.0 - 204.58.255.255 us +204.59.0.0 - 204.59.6.255 gb +204.59.7.0 - 204.59.7.255 us +204.59.8.0 - 204.59.63.255 gb +204.59.64.0 - 204.59.79.255 sg +204.59.80.0 - 204.59.87.255 au +204.59.88.0 - 204.59.89.255 hk +204.59.90.0 - 204.59.105.255 us +204.59.106.0 - 204.59.107.255 de +204.59.108.0 - 204.59.249.255 us +204.59.250.0 - 204.59.255.255 ca +204.60.0.0 - 204.62.9.255 us 204.62.10.0 - 204.62.11.255 ca -204.62.12.0 - 204.62.13.63 us -204.62.13.64 - 204.62.13.79 nz -204.62.13.80 - 204.62.13.111 us -204.62.13.112 - 204.62.13.127 nz -204.62.13.128 - 204.62.14.31 us -204.62.14.32 - 204.62.14.191 nz -204.62.14.192 - 204.62.15.31 us -204.62.15.32 - 204.62.15.111 nz -204.62.15.112 - 204.62.15.127 us -204.62.15.128 - 204.62.15.159 nz -204.62.15.160 - 204.62.119.255 us -204.62.120.0 - 204.62.123.255 ca -204.62.124.0 - 204.63.189.255 us +204.62.12.0 - 204.62.121.255 us +204.62.122.0 - 204.62.122.255 gb +204.62.123.0 - 204.63.189.255 us 204.63.190.0 - 204.63.191.255 ca 204.63.192.0 - 204.63.247.255 us 204.63.248.0 - 204.63.255.255 ca -204.64.0.0 - 204.68.95.255 us -204.68.96.0 - 204.68.127.255 a1 -204.68.128.0 - 204.69.167.255 us +204.64.0.0 - 204.69.31.255 us +204.69.32.0 - 204.69.32.255 de +204.69.33.0 - 204.69.149.255 us +204.69.150.0 - 204.69.150.255 cn +204.69.151.0 - 204.69.167.255 us 204.69.168.0 - 204.69.168.255 ca 204.69.169.0 - 204.69.207.255 us 204.69.208.0 - 204.69.208.255 ca -204.69.209.0 - 204.77.77.255 us +204.69.209.0 - 204.69.229.255 us +204.69.230.0 - 204.69.230.255 eu +204.69.231.0 - 204.74.26.9 us +204.74.26.10 - 204.74.26.10 eu +204.74.26.11 - 204.75.79.255 us +204.75.80.0 - 204.75.80.255 gb +204.75.81.0 - 204.75.142.255 us +204.75.143.0 - 204.75.143.255 sg +204.75.144.0 - 204.77.77.255 us 204.77.78.0 - 204.77.78.255 ca -204.77.79.0 - 204.77.193.255 us -204.77.194.0 - 204.77.195.255 ca -204.77.196.0 - 204.77.205.255 us +204.77.79.0 - 204.77.205.255 us 204.77.206.0 - 204.77.206.255 ca 204.77.207.0 - 204.78.255.255 us 204.79.0.0 - 204.79.0.255 ca @@ -126598,10 +104439,11 @@ 204.79.23.0 - 204.79.25.255 hk 204.79.26.0 - 204.79.26.255 gb 204.79.27.0 - 204.79.48.255 us -204.79.49.0 - 204.79.50.255 de +204.79.49.0 - 204.79.49.255 de +204.79.50.0 - 204.79.50.255 us 204.79.51.0 - 204.79.51.255 at -204.79.52.0 - 204.79.52.255 ch -204.79.53.0 - 204.79.54.255 gb +204.79.52.0 - 204.79.53.255 ch +204.79.54.0 - 204.79.54.255 gb 204.79.55.0 - 204.79.55.255 de 204.79.56.0 - 204.79.56.255 ca 204.79.57.0 - 204.79.57.255 se @@ -126622,10 +104464,9 @@ 204.79.79.0 - 204.79.79.255 nl 204.79.80.0 - 204.79.82.255 de 204.79.83.0 - 204.79.83.255 gb -204.79.84.0 - 204.79.85.255 us -204.79.86.0 - 204.79.86.95 be -204.79.86.96 - 204.79.89.255 us -204.79.90.0 - 204.79.91.255 gb +204.79.84.0 - 204.79.89.255 us +204.79.90.0 - 204.79.90.255 eu +204.79.91.0 - 204.79.91.255 gb 204.79.92.0 - 204.79.92.255 us 204.79.93.0 - 204.79.93.255 jp 204.79.94.0 - 204.79.94.255 fi @@ -126645,7 +104486,8 @@ 204.79.109.0 - 204.79.109.255 fr 204.79.110.0 - 204.79.110.255 jp 204.79.111.0 - 204.79.111.255 de -204.79.112.0 - 204.79.113.255 be +204.79.112.0 - 204.79.112.255 be +204.79.113.0 - 204.79.113.255 us 204.79.114.0 - 204.79.114.255 it 204.79.115.0 - 204.79.115.255 us 204.79.116.0 - 204.79.116.255 be @@ -126706,7 +104548,7 @@ 204.79.208.0 - 204.79.210.255 fr 204.79.211.0 - 204.79.211.255 gb 204.79.212.0 - 204.79.212.255 us -204.79.213.0 - 204.79.215.255 gb +204.79.213.0 - 204.79.215.255 fr 204.79.216.0 - 204.79.217.255 us 204.79.218.0 - 204.79.218.255 jp 204.79.219.0 - 204.79.219.255 no @@ -126740,190 +104582,70 @@ 204.87.130.0 - 204.87.168.255 us 204.87.169.0 - 204.87.169.255 cl 204.87.170.0 - 204.87.178.255 us -204.87.179.0 - 204.87.179.255 za +204.87.179.0 - 204.87.179.255 mu 204.87.180.0 - 204.87.188.255 us 204.87.189.0 - 204.87.189.255 ca 204.87.190.0 - 204.87.204.255 us -204.87.205.0 - 204.87.205.255 mx +204.87.205.0 - 204.87.205.255 pe 204.87.206.0 - 204.87.254.255 us 204.87.255.0 - 204.87.255.255 ca 204.88.0.0 - 204.89.56.255 us 204.89.57.0 - 204.89.57.255 ca -204.89.60.0 - 204.89.191.255 us -204.89.192.0 - 204.89.192.255 ca -204.89.193.0 - 204.89.195.255 us +204.89.58.0 - 204.89.195.255 us 204.89.196.0 - 204.89.196.255 ca 204.89.197.0 - 204.89.205.255 us 204.89.206.0 - 204.89.206.255 mx -204.89.207.0 - 204.90.180.255 us -204.90.181.0 - 204.90.182.255 nl -204.90.183.0 - 204.91.255.255 us -204.92.0.0 - 204.92.0.191 ca -204.92.0.192 - 204.92.1.63 us -204.92.1.64 - 204.92.1.127 ca -204.92.1.128 - 204.92.1.191 us -204.92.1.192 - 204.92.1.255 ca -204.92.2.0 - 204.92.2.63 us -204.92.2.64 - 204.92.3.87 ca -204.92.3.88 - 204.92.3.95 us -204.92.3.96 - 204.92.3.135 ca -204.92.3.136 - 204.92.3.143 dk -204.92.3.144 - 204.92.3.159 ca -204.92.3.160 - 204.92.3.167 us -204.92.3.168 - 204.92.3.175 ca -204.92.3.176 - 204.92.3.183 us -204.92.3.184 - 204.92.3.255 ca +204.89.207.0 - 204.92.2.255 us +204.92.3.0 - 204.92.3.255 ca 204.92.4.0 - 204.92.4.255 us 204.92.5.0 - 204.92.5.255 ca -204.92.6.0 - 204.92.6.255 us -204.92.7.0 - 204.92.7.63 ca -204.92.7.64 - 204.92.7.191 us -204.92.7.192 - 204.92.8.31 ca -204.92.8.32 - 204.92.8.63 us -204.92.8.64 - 204.92.8.127 ca -204.92.8.128 - 204.92.8.159 us -204.92.8.160 - 204.92.9.63 ca -204.92.9.64 - 204.92.9.191 us -204.92.9.192 - 204.92.9.255 ca -204.92.10.0 - 204.92.10.191 us -204.92.10.192 - 204.92.10.255 ca -204.92.11.0 - 204.92.12.63 us -204.92.12.64 - 204.92.12.255 ca -204.92.13.0 - 204.92.13.63 us -204.92.13.64 - 204.92.13.191 ca -204.92.13.192 - 204.92.13.255 us -204.92.14.0 - 204.92.15.255 ca -204.92.16.0 - 204.92.16.127 us -204.92.16.128 - 204.92.16.255 ca -204.92.17.0 - 204.92.17.255 us +204.92.6.0 - 204.92.14.255 us +204.92.15.0 - 204.92.15.255 ca +204.92.16.0 - 204.92.17.255 us 204.92.18.0 - 204.92.19.255 ca -204.92.20.0 - 204.92.20.255 us -204.92.21.0 - 204.92.21.127 ca -204.92.21.128 - 204.92.21.255 us +204.92.20.0 - 204.92.21.255 us 204.92.22.0 - 204.92.23.255 ca 204.92.24.0 - 204.92.24.255 us 204.92.25.0 - 204.92.26.255 ca 204.92.27.0 - 204.92.27.255 us -204.92.28.0 - 204.92.29.255 ca -204.92.30.0 - 204.92.30.255 us +204.92.28.0 - 204.92.28.255 ca +204.92.29.0 - 204.92.30.255 us 204.92.31.0 - 204.92.31.255 ca -204.92.32.0 - 204.92.40.7 us -204.92.40.8 - 204.92.40.47 ca -204.92.40.48 - 204.92.40.63 us -204.92.40.64 - 204.92.40.79 ca -204.92.40.80 - 204.92.40.215 us -204.92.40.216 - 204.92.40.231 ca -204.92.40.232 - 204.92.40.255 us -204.92.41.0 - 204.92.42.7 ca -204.92.42.8 - 204.92.42.23 us -204.92.42.24 - 204.92.42.63 ca -204.92.42.64 - 204.92.42.79 us -204.92.42.80 - 204.92.42.119 ca -204.92.42.120 - 204.92.42.127 us -204.92.42.128 - 204.92.42.143 ca -204.92.42.144 - 204.92.42.215 us -204.92.42.216 - 204.92.47.255 ca -204.92.48.0 - 204.92.48.255 us -204.92.49.0 - 204.92.50.127 ca -204.92.50.128 - 204.92.50.255 us -204.92.51.0 - 204.92.51.63 ca -204.92.51.64 - 204.92.51.191 us -204.92.51.192 - 204.92.53.255 ca -204.92.54.0 - 204.92.54.15 us -204.92.54.16 - 204.92.54.47 ca -204.92.54.48 - 204.92.54.255 us -204.92.55.0 - 204.92.56.31 ca -204.92.56.32 - 204.92.56.95 us -204.92.56.96 - 204.92.56.159 ca -204.92.56.160 - 204.92.56.191 us -204.92.56.192 - 204.92.56.255 ca -204.92.57.0 - 204.92.57.127 us -204.92.57.128 - 204.92.60.47 ca -204.92.60.48 - 204.92.60.55 us -204.92.60.56 - 204.92.60.63 ca -204.92.60.64 - 204.92.60.79 us -204.92.60.80 - 204.92.60.87 ca -204.92.60.88 - 204.92.60.95 us -204.92.60.96 - 204.92.60.103 ca -204.92.60.104 - 204.92.60.111 us -204.92.60.112 - 204.92.60.151 ca -204.92.60.152 - 204.92.60.159 us -204.92.60.160 - 204.92.60.255 ca -204.92.61.0 - 204.92.61.255 us -204.92.62.0 - 204.92.63.7 ca -204.92.63.8 - 204.92.63.15 us -204.92.63.16 - 204.92.63.47 ca -204.92.63.48 - 204.92.63.55 us -204.92.63.56 - 204.92.63.71 ca -204.92.63.72 - 204.92.63.79 us -204.92.63.80 - 204.92.63.119 ca -204.92.63.120 - 204.92.63.127 us -204.92.63.128 - 204.92.63.151 ca -204.92.63.152 - 204.92.63.159 us -204.92.63.160 - 204.92.63.223 ca -204.92.63.224 - 204.92.63.255 us -204.92.64.0 - 204.92.65.255 ca -204.92.66.0 - 204.92.66.255 us -204.92.67.0 - 204.92.67.159 ca -204.92.67.160 - 204.92.67.191 us -204.92.67.192 - 204.92.67.223 ca -204.92.67.224 - 204.92.67.255 us -204.92.68.0 - 204.92.69.63 ca -204.92.69.64 - 204.92.69.191 us -204.92.69.192 - 204.92.69.255 ca -204.92.70.0 - 204.92.70.255 us -204.92.71.0 - 204.92.78.255 ca +204.92.32.0 - 204.92.40.255 us +204.92.41.0 - 204.92.41.255 ca +204.92.42.0 - 204.92.42.255 us +204.92.43.0 - 204.92.48.255 ca +204.92.49.0 - 204.92.51.255 us +204.92.52.0 - 204.92.53.255 ca +204.92.54.0 - 204.92.57.255 us +204.92.58.0 - 204.92.59.255 ca +204.92.60.0 - 204.92.61.255 us +204.92.62.0 - 204.92.62.255 ca +204.92.63.0 - 204.92.64.255 us +204.92.65.0 - 204.92.65.255 ca +204.92.66.0 - 204.92.67.63 us +204.92.67.64 - 204.92.67.95 ca +204.92.67.96 - 204.92.67.255 us +204.92.68.0 - 204.92.68.255 ca +204.92.69.0 - 204.92.70.255 us +204.92.71.0 - 204.92.74.255 ca +204.92.75.0 - 204.92.75.255 us +204.92.76.0 - 204.92.78.255 ca 204.92.79.0 - 204.92.80.255 us 204.92.81.0 - 204.92.81.255 ca -204.92.82.0 - 204.92.82.255 us -204.92.83.0 - 204.92.83.63 ca -204.92.83.64 - 204.92.83.95 us -204.92.83.96 - 204.92.83.223 ca -204.92.83.224 - 204.92.84.255 us -204.92.85.0 - 204.92.85.63 ca -204.92.85.64 - 204.92.85.127 us -204.92.85.128 - 204.92.85.191 ca -204.92.85.192 - 204.92.85.255 us -204.92.86.0 - 204.92.86.127 ca -204.92.86.128 - 204.92.87.255 us +204.92.82.0 - 204.92.87.255 us 204.92.88.0 - 204.92.92.255 ca -204.92.93.0 - 204.92.94.255 us -204.92.95.0 - 204.92.95.127 ca -204.92.95.128 - 204.92.95.159 us -204.92.95.160 - 204.92.96.71 ca -204.92.96.72 - 204.92.96.79 us -204.92.96.80 - 204.92.96.87 ca -204.92.96.88 - 204.92.96.159 us -204.92.96.160 - 204.92.96.167 ca -204.92.96.168 - 204.92.96.255 us -204.92.97.0 - 204.92.97.63 ca -204.92.97.64 - 204.92.97.159 us -204.92.97.160 - 204.92.97.175 ca -204.92.97.176 - 204.92.97.207 us -204.92.97.208 - 204.92.97.223 ca -204.92.97.224 - 204.92.97.255 us -204.92.98.0 - 204.92.98.127 ca -204.92.98.128 - 204.92.98.191 us -204.92.98.192 - 204.92.98.223 ca -204.92.98.224 - 204.92.99.191 us -204.92.99.192 - 204.92.99.255 is -204.92.100.0 - 204.92.102.255 us -204.92.103.0 - 204.92.103.127 ca -204.92.103.128 - 204.92.103.255 us +204.92.93.0 - 204.92.103.255 us 204.92.104.0 - 204.92.107.255 ca 204.92.108.0 - 204.92.111.255 us 204.92.112.0 - 204.92.115.255 ca -204.92.116.0 - 204.92.117.255 us -204.92.118.0 - 204.92.118.255 ca -204.92.119.0 - 204.92.121.255 us +204.92.116.0 - 204.92.121.255 us 204.92.122.0 - 204.92.126.255 ca 204.92.127.0 - 204.92.127.255 us -204.92.128.0 - 204.92.151.63 ca -204.92.151.64 - 204.92.151.255 us -204.92.152.0 - 204.92.158.63 ca -204.92.158.64 - 204.92.158.223 us -204.92.158.224 - 204.92.159.15 ca -204.92.159.16 - 204.92.159.255 us +204.92.128.0 - 204.92.150.255 ca +204.92.151.0 - 204.92.151.255 us +204.92.152.0 - 204.92.157.255 ca +204.92.158.0 - 204.92.159.255 us 204.92.160.0 - 204.92.164.255 ca 204.92.165.0 - 204.92.165.255 us 204.92.166.0 - 204.92.168.255 ca @@ -126934,113 +104656,70 @@ 204.92.208.0 - 204.92.208.255 us 204.92.209.0 - 204.92.209.255 ca 204.92.210.0 - 204.92.210.255 us -204.92.211.0 - 204.92.212.31 ca -204.92.212.32 - 204.92.212.63 us -204.92.212.64 - 204.92.212.127 ca -204.92.212.128 - 204.92.212.223 us -204.92.212.224 - 204.92.216.255 ca -204.92.217.0 - 204.92.217.63 us -204.92.217.64 - 204.92.217.127 ca -204.92.217.128 - 204.92.217.191 us -204.92.217.192 - 204.92.218.31 ca -204.92.218.32 - 204.92.218.63 us -204.92.218.64 - 204.92.218.191 ca -204.92.218.192 - 204.92.218.223 us -204.92.218.224 - 204.92.221.63 ca -204.92.221.64 - 204.92.221.127 us -204.92.221.128 - 204.92.221.191 ca -204.92.221.192 - 204.92.221.255 us -204.92.222.0 - 204.92.223.127 ca -204.92.223.128 - 204.92.223.255 us +204.92.211.0 - 204.92.211.255 ca +204.92.212.0 - 204.92.212.255 us +204.92.213.0 - 204.92.216.255 ca +204.92.217.0 - 204.92.218.255 us +204.92.219.0 - 204.92.220.255 ca +204.92.221.0 - 204.92.223.255 us 204.92.224.0 - 204.92.226.255 ca 204.92.227.0 - 204.92.229.255 us 204.92.230.0 - 204.92.230.255 ca 204.92.231.0 - 204.92.231.255 us 204.92.232.0 - 204.92.241.255 ca 204.92.242.0 - 204.92.242.255 us -204.92.243.0 - 204.92.244.15 ca -204.92.244.16 - 204.92.244.31 us -204.92.244.32 - 204.92.244.63 ca -204.92.244.64 - 204.92.244.79 us -204.92.244.80 - 204.92.244.95 ca -204.92.244.96 - 204.92.244.111 us -204.92.244.112 - 204.92.244.175 ca -204.92.244.176 - 204.92.244.207 us -204.92.244.208 - 204.92.244.223 ca -204.92.244.224 - 204.92.245.255 us +204.92.243.0 - 204.92.243.255 ca +204.92.244.0 - 204.92.245.255 us 204.92.246.0 - 204.92.250.255 ca -204.92.251.0 - 204.92.251.63 us -204.92.251.64 - 204.92.251.127 ca -204.92.251.128 - 204.92.251.159 us -204.92.251.160 - 204.92.251.223 ca -204.92.251.224 - 204.92.251.255 us -204.92.252.0 - 204.92.252.63 ca -204.92.252.64 - 204.92.252.127 us -204.92.252.128 - 204.92.252.191 ca -204.92.252.192 - 204.92.252.255 us -204.92.253.0 - 204.92.255.255 ca -204.93.0.0 - 204.94.104.255 us -204.94.105.0 - 204.94.105.15 gb -204.94.105.16 - 204.94.119.255 us +204.92.251.0 - 204.92.252.255 us +204.92.253.0 - 204.92.253.255 ca +204.92.254.0 - 204.92.254.255 us +204.92.255.0 - 204.92.255.255 ca +204.93.0.0 - 204.93.53.255 us +204.93.54.0 - 204.93.56.255 ca +204.93.57.0 - 204.94.119.255 us 204.94.120.0 - 204.94.123.255 ca -204.94.124.0 - 204.94.150.255 us -204.94.151.0 - 204.94.151.127 pr -204.94.151.128 - 204.94.155.255 us +204.94.124.0 - 204.94.155.255 us 204.94.156.0 - 204.94.159.255 gh -204.94.160.0 - 204.94.171.255 us -204.94.172.0 - 204.94.172.7 se -204.94.172.8 - 204.95.159.39 us -204.95.159.40 - 204.95.159.47 gb -204.95.159.48 - 204.96.197.87 us -204.96.197.88 - 204.96.197.95 ca -204.96.197.96 - 204.97.191.255 us +204.94.160.0 - 204.97.191.255 us 204.97.192.0 - 204.97.207.255 co 204.97.208.0 - 204.100.255.255 us 204.101.0.0 - 204.101.255.255 ca 204.102.0.0 - 204.104.54.255 us -204.104.55.0 - 204.104.55.255 de -204.104.56.0 - 204.104.110.255 us -204.104.111.0 - 204.104.111.255 de -204.104.112.0 - 204.104.158.255 us -204.104.159.0 - 204.104.159.255 de -204.104.160.0 - 204.104.170.255 us -204.104.171.0 - 204.104.171.255 de -204.104.172.0 - 204.106.7.255 us +204.104.55.0 - 204.104.55.255 eu +204.104.56.0 - 204.106.7.255 us 204.106.8.0 - 204.106.15.255 a2 -204.106.16.0 - 204.110.53.7 us -204.110.53.8 - 204.110.53.15 bd -204.110.53.16 - 204.110.55.255 us +204.106.16.0 - 204.110.55.255 us 204.110.56.0 - 204.110.63.255 tc 204.110.64.0 - 204.111.255.255 us 204.112.0.0 - 204.112.255.255 ca -204.113.0.0 - 204.118.23.95 us -204.118.23.96 - 204.118.23.127 is -204.118.23.128 - 204.118.111.239 us -204.118.111.240 - 204.118.111.255 ca -204.118.112.0 - 204.118.132.31 us -204.118.132.32 - 204.118.132.39 se -204.118.132.40 - 204.118.169.255 us +204.113.0.0 - 204.114.195.255 us +204.114.196.0 - 204.114.196.255 ap +204.114.197.0 - 204.114.198.255 us +204.114.199.0 - 204.114.199.255 au +204.114.200.0 - 204.118.169.255 us 204.118.170.0 - 204.118.170.255 gh 204.118.171.0 - 204.119.15.255 us 204.119.16.0 - 204.119.23.255 pr 204.119.24.0 - 204.120.203.255 us 204.120.204.0 - 204.120.204.255 aq -204.120.205.0 - 204.120.205.7 pr -204.120.205.8 - 204.124.87.255 us -204.124.88.0 - 204.124.91.255 ca -204.124.92.0 - 204.124.98.255 us +204.120.205.0 - 204.124.98.255 us 204.124.99.0 - 204.124.99.255 pr 204.124.100.0 - 204.124.103.255 us 204.124.104.0 - 204.124.107.255 mx 204.124.108.0 - 204.124.170.255 us 204.124.171.0 - 204.124.171.255 ca -204.124.172.0 - 204.125.14.255 us +204.124.172.0 - 204.124.198.255 us +204.124.199.0 - 204.124.199.255 gb +204.124.200.0 - 204.124.210.255 us +204.124.211.0 - 204.124.211.255 gb +204.124.212.0 - 204.125.14.255 us 204.125.15.0 - 204.125.15.255 ca 204.125.16.0 - 204.125.22.255 us 204.125.23.0 - 204.125.23.255 ca 204.125.24.0 - 204.125.91.255 us -204.125.92.0 - 204.125.94.255 ca -204.125.95.0 - 204.125.96.255 us +204.125.92.0 - 204.125.93.255 ca +204.125.94.0 - 204.125.96.255 us 204.125.97.0 - 204.125.97.255 ca 204.125.98.0 - 204.125.98.255 us 204.125.99.0 - 204.125.99.255 ca @@ -127064,13 +104743,9 @@ 204.125.143.0 - 204.125.143.255 ca 204.125.144.0 - 204.125.149.255 us 204.125.150.0 - 204.125.150.255 ca -204.125.151.0 - 204.125.194.255 us -204.125.195.0 - 204.125.195.255 pr -204.125.196.0 - 204.125.198.255 us +204.125.151.0 - 204.125.198.255 us 204.125.199.0 - 204.125.199.255 ca -204.125.200.0 - 204.125.209.255 us -204.125.210.0 - 204.125.210.255 ca -204.125.211.0 - 204.125.240.255 us +204.125.200.0 - 204.125.240.255 us 204.125.241.0 - 204.125.241.255 ca 204.125.242.0 - 204.125.246.255 us 204.125.247.0 - 204.125.247.255 ca @@ -127088,10 +104763,16 @@ 204.130.167.0 - 204.130.167.255 ca 204.130.168.0 - 204.136.11.255 us 204.136.12.0 - 204.136.15.255 ca -204.136.16.0 - 204.138.0.255 us +204.136.16.0 - 204.136.217.255 us +204.136.218.0 - 204.136.218.255 ap +204.136.219.0 - 204.136.242.9 us +204.136.242.10 - 204.136.242.10 eu +204.136.242.11 - 204.138.0.255 us 204.138.1.0 - 204.138.25.255 ca 204.138.26.0 - 204.138.26.255 us -204.138.27.0 - 204.138.67.255 ca +204.138.27.0 - 204.138.39.255 ca +204.138.40.0 - 204.138.51.255 us +204.138.52.0 - 204.138.67.255 ca 204.138.68.0 - 204.138.68.255 us 204.138.69.0 - 204.138.93.255 ca 204.138.94.0 - 204.138.94.255 us @@ -127106,8 +104787,8 @@ 204.138.168.0 - 204.138.178.255 ca 204.138.179.0 - 204.138.181.255 us 204.138.182.0 - 204.138.239.255 ca -204.138.240.0 - 204.138.243.255 us -204.138.244.0 - 204.138.254.255 ca +204.138.240.0 - 204.138.244.255 us +204.138.245.0 - 204.138.254.255 ca 204.138.255.0 - 204.140.69.255 us 204.140.70.0 - 204.140.70.255 be 204.140.71.0 - 204.140.72.255 us @@ -127118,16 +104799,15 @@ 204.140.78.0 - 204.140.78.255 lu 204.140.79.0 - 204.140.83.255 us 204.140.84.0 - 204.140.85.255 fr -204.140.86.0 - 204.140.99.255 it +204.140.86.0 - 204.140.94.255 us +204.140.95.0 - 204.140.99.255 it 204.140.100.0 - 204.140.101.255 us 204.140.102.0 - 204.140.102.255 sg -204.140.103.0 - 204.140.108.255 ca -204.140.109.0 - 204.140.111.255 nl -204.140.112.0 - 204.140.126.255 ca +204.140.103.0 - 204.140.103.255 us +204.140.104.0 - 204.140.108.255 ca +204.140.109.0 - 204.140.126.255 nl 204.140.127.0 - 204.140.127.255 de -204.140.128.0 - 204.140.220.7 us -204.140.220.8 - 204.140.220.11 nl -204.140.220.12 - 204.144.59.255 us +204.140.128.0 - 204.144.59.255 us 204.144.60.0 - 204.144.63.255 ca 204.144.64.0 - 204.144.77.255 us 204.144.78.0 - 204.144.78.255 pr @@ -127139,10 +104819,10 @@ 204.146.53.0 - 204.146.53.255 gb 204.146.54.0 - 204.147.75.255 us 204.147.76.0 - 204.147.79.255 ca -204.147.80.0 - 204.148.7.255 us -204.148.8.0 - 204.148.9.255 ca -204.148.10.0 - 204.148.56.255 us -204.148.57.0 - 204.148.61.255 de +204.147.80.0 - 204.148.56.255 us +204.148.57.0 - 204.148.57.255 de +204.148.58.0 - 204.148.59.255 us +204.148.60.0 - 204.148.61.255 de 204.148.62.0 - 204.148.111.255 us 204.148.112.0 - 204.148.112.255 gb 204.148.113.0 - 204.149.29.255 us @@ -127151,35 +104831,31 @@ 204.149.48.0 - 204.149.51.255 de 204.149.52.0 - 204.149.175.255 us 204.149.176.0 - 204.149.191.255 de -204.149.192.0 - 204.151.110.255 us -204.151.111.0 - 204.151.111.255 de -204.151.112.0 - 204.151.178.255 us -204.151.179.0 - 204.151.183.255 de -204.151.184.0 - 204.152.13.255 us -204.152.14.0 - 204.152.15.255 na -204.152.16.0 - 204.152.27.255 us -204.152.28.0 - 204.152.28.255 gb -204.152.29.0 - 204.152.226.255 us -204.152.227.0 - 204.152.227.255 ca -204.152.228.0 - 204.152.231.127 us -204.152.231.128 - 204.152.231.255 do +204.149.192.0 - 204.152.13.255 us +204.152.14.0 - 204.152.15.255 mu +204.152.16.0 - 204.152.223.255 us +204.152.224.0 - 204.152.231.255 hk 204.152.232.0 - 204.153.23.255 us 204.153.24.0 - 204.153.25.255 mx -204.153.26.0 - 204.153.134.255 us +204.153.26.0 - 204.153.106.255 us +204.153.107.0 - 204.153.107.255 gb +204.153.108.0 - 204.153.134.255 us 204.153.135.0 - 204.153.135.255 ca 204.153.136.0 - 204.153.214.255 us 204.153.215.0 - 204.153.215.255 ca 204.153.216.0 - 204.154.63.255 us -204.154.64.0 - 204.154.69.255 de -204.154.70.0 - 204.154.70.3 pt -204.154.70.4 - 204.154.71.255 de +204.154.64.0 - 204.154.71.255 de 204.154.72.0 - 204.154.173.255 us 204.154.174.0 - 204.154.175.255 ca -204.154.176.0 - 204.156.123.255 us +204.154.176.0 - 204.154.199.255 us +204.154.200.0 - 204.154.207.255 ca +204.154.208.0 - 204.155.101.255 us +204.155.102.0 - 204.155.102.255 gb +204.155.103.0 - 204.155.109.255 us +204.155.110.0 - 204.155.110.255 gb +204.155.111.0 - 204.156.123.255 us 204.156.124.0 - 204.156.127.255 ca -204.156.128.0 - 204.168.75.0 us -204.168.75.1 - 204.168.75.255 ca -204.168.76.0 - 204.174.0.255 us +204.156.128.0 - 204.174.0.255 us 204.174.1.0 - 204.174.36.255 ca 204.174.37.0 - 204.174.37.255 us 204.174.38.0 - 204.174.46.255 ca @@ -127191,27 +104867,9 @@ 204.174.225.0 - 204.174.231.255 ca 204.174.232.0 - 204.174.233.255 us 204.174.234.0 - 204.174.254.255 ca -204.174.255.0 - 204.176.37.191 us -204.176.37.192 - 204.176.37.207 au -204.176.37.208 - 204.176.44.255 us -204.176.45.0 - 204.176.45.63 gb -204.176.45.64 - 204.176.86.223 us -204.176.86.224 - 204.176.86.255 il -204.176.87.0 - 204.176.100.239 us -204.176.100.240 - 204.176.100.255 in -204.176.101.0 - 204.176.121.255 us -204.176.122.0 - 204.176.122.63 ca -204.176.122.64 - 204.176.184.47 us -204.176.184.48 - 204.176.184.63 il -204.176.184.64 - 204.176.184.255 us -204.176.185.0 - 204.176.185.31 il -204.176.185.32 - 204.176.185.255 us -204.176.186.0 - 204.176.186.63 ca -204.176.186.64 - 204.179.63.255 us +204.174.255.0 - 204.179.63.255 us 204.179.64.0 - 204.179.79.255 ve -204.179.80.0 - 204.181.35.255 us -204.181.36.0 - 204.181.36.7 ca -204.181.36.8 - 204.181.51.255 us +204.179.80.0 - 204.181.51.255 us 204.181.52.0 - 204.181.55.255 hr 204.181.56.0 - 204.181.74.255 us 204.181.75.0 - 204.181.75.255 pr @@ -127224,34 +104882,10 @@ 204.183.119.0 - 204.183.147.255 us 204.183.148.0 - 204.183.151.255 nl 204.183.152.0 - 204.187.0.255 us -204.187.1.0 - 204.187.10.255 ca -204.187.11.0 - 204.187.11.255 us -204.187.12.0 - 204.187.13.255 ca -204.187.14.0 - 204.187.14.15 gb -204.187.14.16 - 204.187.14.31 us -204.187.14.32 - 204.187.14.63 ca -204.187.14.64 - 204.187.14.79 us -204.187.14.80 - 204.187.14.95 ae -204.187.14.96 - 204.187.14.127 ca -204.187.14.128 - 204.187.14.143 us -204.187.14.144 - 204.187.14.159 za -204.187.14.160 - 204.187.14.191 us -204.187.14.192 - 204.187.14.255 ca -204.187.15.0 - 204.187.15.15 us -204.187.15.16 - 204.187.15.31 ca -204.187.15.32 - 204.187.15.63 us -204.187.15.64 - 204.187.15.79 au -204.187.15.80 - 204.187.15.175 us -204.187.15.176 - 204.187.15.191 gb -204.187.15.192 - 204.187.15.223 us -204.187.15.224 - 204.187.15.239 ca -204.187.15.240 - 204.187.15.247 us -204.187.15.248 - 204.187.93.255 ca +204.187.1.0 - 204.187.93.255 ca 204.187.94.0 - 204.187.94.255 us 204.187.95.0 - 204.187.254.255 ca -204.187.255.0 - 204.188.135.255 us -204.188.136.0 - 204.188.143.255 pa -204.188.144.0 - 204.188.159.255 us +204.187.255.0 - 204.188.159.255 us 204.188.160.0 - 204.188.160.255 ag 204.188.161.0 - 204.188.161.255 dm 204.188.162.0 - 204.188.162.255 vg @@ -127267,14 +104901,16 @@ 204.188.174.0 - 204.188.175.255 ag 204.188.176.0 - 204.190.255.255 us 204.191.0.0 - 204.191.255.255 ca -204.192.0.0 - 204.194.20.255 us +204.192.0.0 - 204.193.62.253 us +204.193.62.254 - 204.193.62.254 eu +204.193.62.255 - 204.194.20.255 us 204.194.21.0 - 204.194.21.255 ca 204.194.22.0 - 204.197.175.255 us 204.197.176.0 - 204.197.191.255 ca -204.197.192.0 - 204.197.217.255 us -204.197.218.0 - 204.197.218.63 gi -204.197.218.64 - 204.209.0.255 us -204.209.1.0 - 204.209.25.255 ca +204.197.192.0 - 204.209.0.255 us +204.209.1.0 - 204.209.12.255 ca +204.209.13.0 - 204.209.15.255 us +204.209.16.0 - 204.209.25.255 ca 204.209.26.0 - 204.209.27.255 us 204.209.28.0 - 204.209.113.255 ca 204.209.114.0 - 204.209.114.255 us @@ -127285,9 +104921,9 @@ 204.209.160.0 - 204.209.254.255 ca 204.209.255.0 - 204.212.119.255 us 204.212.120.0 - 204.212.127.255 aw -204.212.128.0 - 204.212.183.255 us -204.212.184.0 - 204.212.184.255 nl -204.212.185.0 - 204.215.213.255 us +204.212.128.0 - 204.212.239.255 us +204.212.240.0 - 204.212.247.255 bb +204.212.248.0 - 204.215.213.255 us 204.215.214.0 - 204.215.214.255 ve 204.215.215.0 - 204.224.0.255 us 204.224.1.0 - 204.224.1.255 ca @@ -127309,12 +104945,14 @@ 204.224.192.0 - 204.224.192.255 ca 204.224.193.0 - 204.224.236.255 us 204.224.237.0 - 204.224.237.255 ca -204.224.238.0 - 204.224.251.255 us -204.224.252.0 - 204.224.252.255 ca -204.224.253.0 - 204.225.0.255 us -204.225.1.0 - 204.225.37.255 ca +204.224.238.0 - 204.225.0.255 us +204.225.1.0 - 204.225.15.255 ca +204.225.16.0 - 204.225.31.255 us +204.225.32.0 - 204.225.37.255 ca 204.225.38.0 - 204.225.39.255 us -204.225.40.0 - 204.225.51.255 ca +204.225.40.0 - 204.225.41.255 ca +204.225.42.0 - 204.225.43.255 us +204.225.44.0 - 204.225.51.255 ca 204.225.52.0 - 204.225.53.255 us 204.225.54.0 - 204.225.132.255 ca 204.225.133.0 - 204.225.133.255 us @@ -127328,11 +104966,13 @@ 204.225.150.0 - 204.225.150.255 us 204.225.151.0 - 204.225.171.255 ca 204.225.172.0 - 204.225.172.255 us -204.225.173.0 - 204.225.177.255 ca +204.225.174.0 - 204.225.177.255 ca 204.225.178.0 - 204.225.178.255 us 204.225.179.0 - 204.225.207.255 ca 204.225.208.0 - 204.225.209.255 us -204.225.210.0 - 204.225.238.255 ca +204.225.210.0 - 204.225.219.255 ca +204.225.220.0 - 204.225.220.255 a2 +204.225.221.0 - 204.225.238.255 ca 204.225.239.0 - 204.225.239.255 us 204.225.240.0 - 204.226.255.255 ca 204.227.0.0 - 204.231.1.255 us @@ -127362,9 +105002,7 @@ 204.231.66.0 - 204.231.66.255 fr 204.231.67.0 - 204.231.67.255 us 204.231.68.0 - 204.231.69.255 fi -204.231.70.0 - 204.231.71.255 ca -204.231.72.0 - 204.231.73.255 fr -204.231.74.0 - 204.231.74.255 us +204.231.70.0 - 204.231.74.255 us 204.231.75.0 - 204.231.75.255 gb 204.231.76.0 - 204.231.84.255 us 204.231.85.0 - 204.231.88.255 gb @@ -127382,9 +105020,7 @@ 204.231.136.0 - 204.231.137.255 de 204.231.138.0 - 204.231.138.255 us 204.231.139.0 - 204.231.140.255 gb -204.231.141.0 - 204.231.158.255 us -204.231.159.0 - 204.231.159.31 af -204.231.159.32 - 204.231.169.255 us +204.231.141.0 - 204.231.169.255 us 204.231.170.0 - 204.231.170.255 sg 204.231.171.0 - 204.231.177.255 us 204.231.178.0 - 204.231.181.255 cl @@ -127409,191 +105045,9 @@ 204.231.255.0 - 204.231.255.255 ie 204.232.0.0 - 204.232.63.255 us 204.232.64.0 - 204.232.79.255 ca -204.232.80.0 - 204.232.130.151 us -204.232.130.152 - 204.232.130.159 in -204.232.130.160 - 204.232.130.167 us +204.232.80.0 - 204.232.130.167 us 204.232.130.168 - 204.232.130.175 au -204.232.130.176 - 204.232.131.191 us -204.232.131.192 - 204.232.131.207 ca -204.232.131.208 - 204.232.132.7 us -204.232.132.8 - 204.232.132.15 au -204.232.132.16 - 204.232.133.151 us -204.232.133.152 - 204.232.133.159 gb -204.232.133.160 - 204.232.134.15 us -204.232.134.16 - 204.232.134.23 se -204.232.134.24 - 204.232.135.223 us -204.232.135.224 - 204.232.135.231 co -204.232.135.232 - 204.232.137.159 us -204.232.137.160 - 204.232.137.175 ca -204.232.137.176 - 204.232.138.191 us -204.232.138.192 - 204.232.138.255 au -204.232.139.0 - 204.232.139.31 us -204.232.139.32 - 204.232.139.63 au -204.232.139.64 - 204.232.140.23 us -204.232.140.24 - 204.232.140.31 se -204.232.140.32 - 204.232.140.159 us -204.232.140.160 - 204.232.140.167 au -204.232.140.168 - 204.232.141.15 us -204.232.141.16 - 204.232.141.23 mx -204.232.141.24 - 204.232.141.223 us -204.232.141.224 - 204.232.141.231 ca -204.232.141.232 - 204.232.142.7 us -204.232.142.8 - 204.232.142.15 ca -204.232.142.16 - 204.232.143.255 us -204.232.144.0 - 204.232.144.255 bd -204.232.145.0 - 204.232.145.191 us -204.232.145.192 - 204.232.145.255 bd -204.232.146.0 - 204.232.149.87 us -204.232.149.88 - 204.232.149.95 gb -204.232.149.96 - 204.232.150.15 us -204.232.150.16 - 204.232.150.23 id -204.232.150.24 - 204.232.150.63 us -204.232.150.64 - 204.232.150.71 ca -204.232.150.72 - 204.232.151.31 us -204.232.151.32 - 204.232.151.39 in -204.232.151.40 - 204.232.151.175 us -204.232.151.176 - 204.232.151.183 ca -204.232.151.184 - 204.232.151.231 us -204.232.151.232 - 204.232.151.239 bd -204.232.151.240 - 204.232.153.223 us -204.232.153.224 - 204.232.153.231 ar -204.232.153.232 - 204.232.154.79 us -204.232.154.80 - 204.232.154.87 th -204.232.154.88 - 204.232.158.55 us -204.232.158.56 - 204.232.158.71 es -204.232.158.72 - 204.232.167.135 us -204.232.167.136 - 204.232.167.143 ca -204.232.167.144 - 204.232.167.191 us -204.232.167.192 - 204.232.167.199 in -204.232.167.200 - 204.232.168.15 us -204.232.168.16 - 204.232.168.23 ca -204.232.168.24 - 204.232.168.47 us -204.232.168.48 - 204.232.168.55 ca -204.232.168.56 - 204.232.168.175 us -204.232.168.176 - 204.232.168.183 mx -204.232.168.184 - 204.232.168.239 us -204.232.168.240 - 204.232.168.247 gb -204.232.168.248 - 204.232.169.95 us -204.232.169.96 - 204.232.169.103 ca -204.232.169.104 - 204.232.169.111 us -204.232.169.112 - 204.232.169.119 in -204.232.169.120 - 204.232.169.191 us -204.232.169.192 - 204.232.169.199 ca -204.232.169.200 - 204.232.170.95 us -204.232.170.96 - 204.232.170.103 au -204.232.170.104 - 204.232.171.23 us -204.232.171.24 - 204.232.171.31 cn -204.232.171.32 - 204.232.171.39 us -204.232.171.40 - 204.232.171.47 ca -204.232.171.48 - 204.232.173.63 us -204.232.173.64 - 204.232.173.79 ca -204.232.173.80 - 204.232.173.127 us -204.232.173.128 - 204.232.173.143 ph -204.232.173.144 - 204.232.173.255 us -204.232.174.0 - 204.232.174.15 fr -204.232.174.16 - 204.232.176.223 us -204.232.176.224 - 204.232.176.231 au -204.232.176.232 - 204.232.176.255 us -204.232.177.0 - 204.232.177.7 co -204.232.177.8 - 204.232.177.15 ca -204.232.177.16 - 204.232.178.55 us -204.232.178.56 - 204.232.178.63 br -204.232.178.64 - 204.232.178.223 us -204.232.178.224 - 204.232.178.239 br -204.232.178.240 - 204.232.179.255 us -204.232.180.0 - 204.232.180.7 gb -204.232.180.8 - 204.232.180.63 us -204.232.180.64 - 204.232.180.71 sa -204.232.180.72 - 204.232.180.231 us -204.232.180.232 - 204.232.180.239 ar -204.232.180.240 - 204.232.180.247 gb -204.232.180.248 - 204.232.181.39 us -204.232.181.40 - 204.232.181.47 ca -204.232.181.48 - 204.232.181.71 gb -204.232.181.72 - 204.232.181.127 us -204.232.181.128 - 204.232.181.135 gb -204.232.181.136 - 204.232.182.47 us -204.232.182.48 - 204.232.182.63 ec -204.232.182.64 - 204.232.183.55 us -204.232.183.56 - 204.232.183.63 ca -204.232.183.64 - 204.232.183.119 us -204.232.183.120 - 204.232.183.127 br -204.232.183.128 - 204.232.184.15 us -204.232.184.16 - 204.232.184.23 gb -204.232.184.24 - 204.232.184.127 us -204.232.184.128 - 204.232.184.135 au -204.232.184.136 - 204.232.184.239 us -204.232.184.240 - 204.232.184.247 ca -204.232.184.248 - 204.232.185.7 us -204.232.185.8 - 204.232.185.15 ca -204.232.185.16 - 204.232.185.111 us -204.232.185.112 - 204.232.185.119 ca -204.232.185.120 - 204.232.185.143 us -204.232.185.144 - 204.232.185.151 ca -204.232.185.152 - 204.232.185.191 us -204.232.185.192 - 204.232.185.199 fr -204.232.185.200 - 204.232.186.31 us -204.232.186.32 - 204.232.186.39 il -204.232.186.40 - 204.232.186.127 us -204.232.186.128 - 204.232.186.135 gb -204.232.186.136 - 204.232.186.143 nz -204.232.186.144 - 204.232.187.47 us -204.232.187.48 - 204.232.187.63 pe -204.232.187.64 - 204.232.187.159 us -204.232.187.160 - 204.232.187.167 ca -204.232.187.168 - 204.232.187.183 us -204.232.187.184 - 204.232.187.199 in -204.232.187.200 - 204.232.188.127 us -204.232.188.128 - 204.232.188.159 ca -204.232.188.160 - 204.232.188.223 us -204.232.188.224 - 204.232.188.255 ph -204.232.189.0 - 204.232.189.7 us -204.232.189.8 - 204.232.189.15 ca -204.232.189.16 - 204.232.189.103 us -204.232.189.104 - 204.232.189.111 ca -204.232.189.112 - 204.232.190.103 us -204.232.190.104 - 204.232.190.111 mx -204.232.190.112 - 204.232.190.119 us -204.232.190.120 - 204.232.190.127 ca -204.232.190.128 - 204.232.190.135 gb -204.232.190.136 - 204.232.190.151 us -204.232.190.152 - 204.232.190.159 gb -204.232.190.160 - 204.232.190.175 us -204.232.190.176 - 204.232.190.183 fr -204.232.190.184 - 204.232.190.215 us -204.232.190.216 - 204.232.190.223 il -204.232.190.224 - 204.232.227.95 us -204.232.227.96 - 204.232.227.103 ca -204.232.227.104 - 204.232.231.255 us -204.232.232.0 - 204.232.232.7 in -204.232.232.8 - 204.232.232.183 us -204.232.232.184 - 204.232.232.191 ca -204.232.232.192 - 204.232.232.199 au -204.232.232.200 - 204.232.233.31 us -204.232.233.32 - 204.232.233.39 it -204.232.233.40 - 204.232.233.95 us -204.232.233.96 - 204.232.233.103 il -204.232.233.104 - 204.232.233.119 us -204.232.233.120 - 204.232.233.127 br -204.232.233.128 - 204.232.233.199 us -204.232.233.200 - 204.232.233.207 gb -204.232.233.208 - 204.232.234.111 us -204.232.234.112 - 204.232.234.119 ca -204.232.234.120 - 204.232.238.31 us -204.232.238.32 - 204.232.238.39 il -204.232.238.40 - 204.232.238.47 us -204.232.238.48 - 204.232.238.55 sg -204.232.238.56 - 204.232.239.47 us -204.232.239.48 - 204.232.239.63 fr -204.232.239.64 - 204.232.239.255 us -204.232.240.0 - 204.232.240.127 bd -204.232.240.128 - 204.232.246.79 us -204.232.246.80 - 204.232.246.87 il -204.232.246.88 - 204.232.247.223 us -204.232.247.224 - 204.232.247.239 fr -204.232.247.240 - 204.232.255.127 us -204.232.255.128 - 204.232.255.191 bd -204.232.255.192 - 204.235.31.255 us +204.232.130.176 - 204.235.31.255 us 204.235.32.0 - 204.235.43.255 za 204.235.44.0 - 204.235.207.255 us 204.235.208.0 - 204.235.223.255 ca @@ -127618,204 +105072,57 @@ 204.239.182.0 - 204.239.182.255 us 204.239.183.0 - 204.239.255.255 ca 204.240.0.0 - 204.243.255.255 us -204.244.0.0 - 204.244.8.47 ca -204.244.8.48 - 204.244.8.63 tc -204.244.8.64 - 204.244.10.15 ca -204.244.10.16 - 204.244.10.23 us -204.244.10.24 - 204.244.10.63 ca -204.244.10.64 - 204.244.10.71 us -204.244.10.72 - 204.244.28.55 ca -204.244.28.56 - 204.244.28.63 us -204.244.28.64 - 204.244.29.175 ca -204.244.29.176 - 204.244.29.191 us -204.244.29.192 - 204.244.36.207 ca -204.244.36.208 - 204.244.36.223 us -204.244.36.224 - 204.244.65.159 ca -204.244.65.160 - 204.244.65.191 us -204.244.65.192 - 204.244.102.255 ca -204.244.103.0 - 204.244.103.127 us -204.244.103.128 - 204.244.106.47 ca -204.244.106.48 - 204.244.106.55 my -204.244.106.56 - 204.244.107.255 ca -204.244.108.0 - 204.244.108.31 us -204.244.108.32 - 204.244.187.255 ca -204.244.188.0 - 204.244.188.255 tc -204.244.189.0 - 204.244.192.255 ca -204.244.193.0 - 204.244.193.7 us -204.244.193.8 - 204.244.194.15 ca -204.244.194.16 - 204.244.194.23 us -204.244.194.24 - 204.244.224.127 ca -204.244.224.128 - 204.244.224.159 us -204.244.224.160 - 204.244.255.255 ca +204.244.0.0 - 204.244.255.255 ca 204.245.0.0 - 204.248.31.255 us 204.248.32.0 - 204.248.35.255 gh 204.248.36.0 - 204.249.95.255 us -204.249.96.0 - 204.249.102.255 hn -204.249.103.0 - 204.251.226.255 us +204.249.96.0 - 204.249.101.255 hn +204.249.102.0 - 204.251.226.255 us 204.251.227.0 - 204.251.227.255 pr -204.251.228.0 - 204.252.14.255 us -204.252.15.0 - 204.252.15.159 mx -204.252.15.160 - 204.253.197.255 us -204.253.198.0 - 204.253.199.255 ht -204.253.200.0 - 204.254.84.255 us -204.254.85.0 - 204.254.85.111 cl -204.254.85.112 - 204.254.85.119 us -204.254.85.120 - 204.254.85.191 cl -204.254.85.192 - 204.254.85.207 us -204.254.85.208 - 204.254.85.223 cl -204.254.85.224 - 205.134.188.239 us -205.134.188.240 - 205.134.188.255 ag -205.134.189.0 - 205.134.225.127 us -205.134.225.128 - 205.134.225.135 in -205.134.225.136 - 205.134.227.47 us -205.134.227.48 - 205.134.227.63 ae -205.134.227.64 - 205.134.232.15 us -205.134.232.16 - 205.134.232.31 uy -205.134.232.32 - 205.134.232.55 us -205.134.232.56 - 205.134.232.63 ca -205.134.232.64 - 205.134.241.127 us -205.134.241.128 - 205.134.241.255 ca -205.134.242.0 - 205.134.243.127 us -205.134.243.128 - 205.134.243.255 ca -205.134.244.0 - 205.134.244.79 us -205.134.244.80 - 205.134.244.87 ca -205.134.244.88 - 205.134.244.127 us -205.134.244.128 - 205.134.244.255 ca -205.134.245.0 - 205.134.245.31 us -205.134.245.32 - 205.134.245.39 ca -205.134.245.40 - 205.134.245.95 us -205.134.245.96 - 205.134.245.111 uy -205.134.245.112 - 205.136.82.255 us -205.136.83.0 - 205.136.83.7 ag -205.136.83.8 - 205.136.83.15 kn -205.136.83.16 - 205.136.83.23 ag -205.136.83.24 - 205.136.83.47 kn -205.136.83.48 - 205.136.83.63 ag -205.136.83.64 - 205.136.83.127 ai -205.136.83.128 - 205.136.83.231 ag -205.136.83.232 - 205.136.83.239 ms -205.136.83.240 - 205.136.84.63 ag -205.136.84.64 - 205.136.84.191 vg -205.136.84.192 - 205.136.84.255 ag -205.136.85.0 - 205.136.237.255 us -205.136.238.0 - 205.136.240.255 ky -205.136.241.0 - 205.137.120.255 us -205.137.121.0 - 205.137.123.255 gb -205.137.124.0 - 205.138.15.255 us +204.251.228.0 - 204.252.15.127 us +204.252.15.128 - 204.252.15.159 mx +204.252.15.160 - 205.136.82.255 us +205.136.83.0 - 205.136.84.255 ag +205.136.85.0 - 205.136.239.255 us +205.136.240.0 - 205.136.240.255 ky +205.136.241.0 - 205.138.15.255 us 205.138.16.0 - 205.138.17.255 ag -205.138.18.0 - 205.138.24.23 us -205.138.24.24 - 205.138.24.31 il -205.138.24.32 - 205.138.24.47 us -205.138.24.48 - 205.138.24.55 sg -205.138.24.56 - 205.138.24.127 us -205.138.24.128 - 205.138.24.255 in +205.138.18.0 - 205.138.24.255 us 205.138.25.0 - 205.138.25.255 sg -205.138.26.0 - 205.138.26.159 us -205.138.26.160 - 205.138.26.175 sg -205.138.26.176 - 205.138.26.191 us -205.138.26.192 - 205.138.27.79 sg -205.138.27.80 - 205.138.27.95 us -205.138.27.96 - 205.138.27.127 sg -205.138.27.128 - 205.138.27.255 us -205.138.28.0 - 205.138.29.47 sg -205.138.29.48 - 205.138.29.63 us -205.138.29.64 - 205.138.29.103 sg -205.138.29.104 - 205.138.29.111 ae -205.138.29.112 - 205.138.29.127 sg -205.138.29.128 - 205.138.29.167 us +205.138.26.0 - 205.138.27.255 us +205.138.28.0 - 205.138.28.255 sg +205.138.29.0 - 205.138.29.167 us 205.138.29.168 - 205.138.29.175 sg -205.138.29.176 - 205.138.29.255 us -205.138.30.0 - 205.138.30.31 sg -205.138.30.32 - 205.138.30.47 us -205.138.30.48 - 205.138.30.63 au -205.138.30.64 - 205.138.30.255 us +205.138.29.176 - 205.138.30.255 us 205.138.31.0 - 205.138.31.255 sg -205.138.32.0 - 205.138.32.255 gb -205.138.33.0 - 205.138.35.135 us -205.138.35.136 - 205.138.35.143 ie -205.138.35.144 - 205.138.35.159 gb -205.138.35.160 - 205.138.35.207 us -205.138.35.208 - 205.138.35.239 gb -205.138.35.240 - 205.138.36.103 us -205.138.36.104 - 205.138.36.119 gb -205.138.36.120 - 205.138.96.63 us -205.138.96.64 - 205.138.96.143 ca -205.138.96.144 - 205.138.97.255 us +205.138.32.0 - 205.138.97.255 us 205.138.98.0 - 205.138.100.255 ca 205.138.101.0 - 205.138.101.255 us 205.138.102.0 - 205.138.103.255 ca -205.138.104.0 - 205.138.148.255 us -205.138.149.0 - 205.138.149.63 ca -205.138.149.64 - 205.138.160.63 us -205.138.160.64 - 205.138.160.87 jp -205.138.160.88 - 205.138.160.95 us -205.138.160.96 - 205.138.160.127 jp -205.138.160.128 - 205.139.87.255 us -205.139.88.0 - 205.139.88.79 gb -205.139.88.80 - 205.139.88.103 us -205.139.88.104 - 205.139.88.111 sg -205.139.88.112 - 205.139.88.119 us -205.139.88.120 - 205.139.88.127 gb -205.139.88.128 - 205.139.88.231 us -205.139.88.232 - 205.139.88.239 gb -205.139.88.240 - 205.139.88.247 us -205.139.88.248 - 205.139.88.255 gb -205.139.89.0 - 205.139.89.31 sg -205.139.89.32 - 205.139.89.63 us -205.139.89.64 - 205.139.89.127 sg -205.139.89.128 - 205.139.89.167 us -205.139.89.168 - 205.139.89.175 gb -205.139.89.176 - 205.139.91.31 us -205.139.91.32 - 205.139.91.47 sg -205.139.91.48 - 205.139.91.63 us -205.139.91.64 - 205.139.91.143 sg -205.139.91.144 - 205.139.91.159 gb -205.139.91.160 - 205.139.91.175 us -205.139.91.176 - 205.139.91.191 gb -205.139.91.192 - 205.139.240.255 us +205.138.104.0 - 205.139.20.239 us +205.139.20.240 - 205.139.20.255 sg +205.139.21.0 - 205.139.240.255 us 205.139.241.0 - 205.139.241.255 sg -205.139.242.0 - 205.140.161.63 us -205.140.161.64 - 205.140.161.143 au -205.140.161.144 - 205.140.161.159 us -205.140.161.160 - 205.140.161.191 au -205.140.161.192 - 205.140.161.255 us -205.140.162.0 - 205.140.162.31 sg -205.140.162.32 - 205.140.162.63 au -205.140.162.64 - 205.140.162.87 us -205.140.162.88 - 205.140.162.127 sg -205.140.162.128 - 205.140.162.159 us -205.140.162.160 - 205.140.162.175 sg -205.140.162.176 - 205.140.162.183 my -205.140.162.184 - 205.140.162.215 au -205.140.162.216 - 205.140.162.255 us -205.140.163.0 - 205.140.163.31 my -205.140.163.32 - 205.140.163.71 sg -205.140.163.72 - 205.140.163.127 us -205.140.163.128 - 205.140.163.159 sg -205.140.163.160 - 205.140.164.127 us -205.140.164.128 - 205.140.164.151 au -205.140.164.152 - 205.140.168.255 us -205.140.169.0 - 205.140.169.15 sg -205.140.169.16 - 205.140.204.127 us -205.140.204.128 - 205.140.204.191 gb -205.140.204.192 - 205.140.204.255 us -205.140.205.0 - 205.140.205.15 gb -205.140.205.16 - 205.140.213.63 us -205.140.213.64 - 205.140.213.71 gb -205.140.213.72 - 205.140.213.255 us +205.139.242.0 - 205.140.213.255 us 205.140.214.0 - 205.140.214.255 gb -205.140.215.0 - 205.140.229.71 us -205.140.229.72 - 205.140.229.87 gb -205.140.229.88 - 205.140.252.223 us -205.140.252.224 - 205.140.252.255 mx -205.140.253.0 - 205.140.255.135 us -205.140.255.136 - 205.140.255.143 gb -205.140.255.144 - 205.147.80.255 us -205.147.81.0 - 205.147.81.63 gb -205.147.81.64 - 205.147.87.255 us -205.147.96.0 - 205.147.149.29 us -205.147.149.30 - 205.147.149.30 mc -205.147.149.31 - 205.149.255.255 us +205.140.215.0 - 205.143.63.255 us +205.143.64.0 - 205.143.64.255 au +205.143.65.0 - 205.145.23.255 us +205.145.24.0 - 205.145.24.255 ca +205.145.25.0 - 205.147.95.255 us +205.147.96.0 - 205.147.103.255 in +205.147.104.0 - 205.147.107.255 hk +205.147.108.0 - 205.147.111.255 in +205.147.112.0 - 205.149.15.255 us +205.149.16.0 - 205.149.16.255 gb +205.149.17.0 - 205.149.17.255 eu +205.149.18.0 - 205.149.19.255 de +205.149.20.0 - 205.149.21.255 ap +205.149.22.0 - 205.149.25.255 us +205.149.26.0 - 205.149.27.255 au +205.149.28.0 - 205.149.29.255 us +205.149.30.0 - 205.149.31.255 eu +205.149.32.0 - 205.149.255.255 us 205.150.0.0 - 205.150.3.255 ca 205.150.4.0 - 205.150.6.255 us 205.150.7.0 - 205.150.14.255 ca @@ -127828,165 +105135,103 @@ 205.150.35.0 - 205.150.35.255 us 205.150.36.0 - 205.150.36.255 ca 205.150.37.0 - 205.150.38.255 us -205.150.39.0 - 205.150.44.255 ca +205.150.39.0 - 205.150.41.255 ca +205.150.42.0 - 205.150.42.255 us +205.150.43.0 - 205.150.44.255 ca 205.150.45.0 - 205.150.46.255 us 205.150.47.0 - 205.150.51.255 ca 205.150.52.0 - 205.150.52.255 us -205.150.53.0 - 205.150.58.255 ca +205.150.53.0 - 205.150.53.255 ca +205.150.54.0 - 205.150.54.255 us +205.150.55.0 - 205.150.58.255 ca 205.150.59.0 - 205.150.59.255 us 205.150.60.0 - 205.150.60.255 ca 205.150.61.0 - 205.150.61.255 us 205.150.62.0 - 205.150.62.255 ca 205.150.63.0 - 205.150.63.255 us -205.150.64.0 - 205.150.67.255 ca -205.150.68.0 - 205.150.68.15 us -205.150.68.16 - 205.150.72.255 ca +205.150.64.0 - 205.150.72.255 ca 205.150.73.0 - 205.150.73.255 us -205.150.74.0 - 205.150.79.63 ca -205.150.79.64 - 205.150.79.127 us -205.150.79.128 - 205.150.79.191 ca -205.150.79.192 - 205.150.81.255 us +205.150.74.0 - 205.150.78.255 ca +205.150.79.0 - 205.150.81.255 us 205.150.82.0 - 205.150.86.255 ca -205.150.87.0 - 205.150.87.31 us -205.150.87.32 - 205.150.87.47 ca -205.150.87.48 - 205.150.87.63 us +205.150.87.0 - 205.150.87.63 us 205.150.87.64 - 205.150.87.79 ca -205.150.87.80 - 205.150.87.95 us -205.150.87.96 - 205.150.87.111 ca -205.150.87.112 - 205.150.87.127 us -205.150.87.128 - 205.150.87.143 ca -205.150.87.144 - 205.150.87.159 us -205.150.87.160 - 205.150.87.207 ca -205.150.87.208 - 205.150.87.255 us +205.150.87.80 - 205.150.87.255 us 205.150.88.0 - 205.150.103.255 ca 205.150.104.0 - 205.150.104.255 us 205.150.105.0 - 205.150.105.255 ca 205.150.106.0 - 205.150.106.255 us -205.150.107.0 - 205.150.109.63 ca -205.150.109.64 - 205.150.109.127 us -205.150.109.128 - 205.150.111.63 ca -205.150.111.64 - 205.150.111.127 us -205.150.111.128 - 205.150.113.223 ca -205.150.113.224 - 205.150.113.255 us -205.150.114.0 - 205.150.116.223 ca -205.150.116.224 - 205.150.116.255 us -205.150.117.0 - 205.150.117.15 ca -205.150.117.16 - 205.150.117.31 us -205.150.117.32 - 205.150.117.47 ca -205.150.117.48 - 205.150.117.79 us -205.150.117.80 - 205.150.117.127 ca -205.150.117.128 - 205.150.117.143 us -205.150.117.144 - 205.150.117.159 ca -205.150.117.160 - 205.150.117.207 us -205.150.117.208 - 205.150.120.255 ca +205.150.107.0 - 205.150.108.255 ca +205.150.109.0 - 205.150.109.255 us +205.150.110.0 - 205.150.110.255 ca +205.150.111.0 - 205.150.111.255 us +205.150.112.0 - 205.150.112.255 ca +205.150.113.0 - 205.150.113.63 us +205.150.113.64 - 205.150.113.95 ca +205.150.113.96 - 205.150.113.255 us +205.150.114.0 - 205.150.115.255 ca +205.150.116.0 - 205.150.117.255 us +205.150.118.0 - 205.150.120.255 ca 205.150.121.0 - 205.150.121.255 us -205.150.122.0 - 205.150.123.7 ca -205.150.123.8 - 205.150.123.15 us -205.150.123.16 - 205.150.123.87 ca -205.150.123.88 - 205.150.123.95 us -205.150.123.96 - 205.150.123.135 ca -205.150.123.136 - 205.150.123.143 us -205.150.123.144 - 205.150.123.151 ca -205.150.123.152 - 205.150.123.159 us -205.150.123.160 - 205.150.123.175 ca -205.150.123.176 - 205.150.123.183 gb -205.150.123.184 - 205.150.123.199 ca -205.150.123.200 - 205.150.123.207 us -205.150.123.208 - 205.150.124.255 ca -205.150.125.0 - 205.150.125.63 us -205.150.125.64 - 205.150.140.255 ca +205.150.122.0 - 205.150.122.255 ca +205.150.123.0 - 205.150.123.255 us +205.150.124.0 - 205.150.124.255 ca +205.150.125.0 - 205.150.127.255 us +205.150.128.0 - 205.150.140.255 ca 205.150.141.0 - 205.150.141.255 us 205.150.142.0 - 205.150.142.255 ca 205.150.143.0 - 205.150.152.95 us -205.150.152.96 - 205.150.152.191 ca -205.150.152.192 - 205.150.153.31 us -205.150.153.32 - 205.150.153.255 ca -205.150.154.0 - 205.150.156.31 us -205.150.156.32 - 205.150.156.79 ca -205.150.156.80 - 205.150.156.95 us -205.150.156.96 - 205.150.156.255 ca -205.150.157.0 - 205.150.168.79 us -205.150.168.80 - 205.150.168.159 ca -205.150.168.160 - 205.150.168.175 us -205.150.168.176 - 205.150.168.223 ca -205.150.168.224 - 205.150.168.255 us -205.150.169.0 - 205.150.169.15 ca -205.150.169.16 - 205.150.169.23 us -205.150.169.24 - 205.150.169.79 ca -205.150.169.80 - 205.150.169.87 us -205.150.169.88 - 205.150.169.95 ca -205.150.169.96 - 205.150.169.103 us -205.150.169.104 - 205.150.169.151 ca -205.150.169.152 - 205.150.169.159 us -205.150.169.160 - 205.150.169.175 ca -205.150.169.176 - 205.150.169.183 us -205.150.169.184 - 205.150.170.63 ca -205.150.170.64 - 205.150.170.95 us -205.150.170.96 - 205.150.171.71 ca -205.150.171.72 - 205.150.171.87 us -205.150.171.88 - 205.150.171.143 ca -205.150.171.144 - 205.150.171.151 us -205.150.171.152 - 205.150.171.167 ca -205.150.171.168 - 205.150.171.175 us -205.150.171.176 - 205.150.171.199 ca -205.150.171.200 - 205.150.171.207 us -205.150.171.208 - 205.150.171.231 ca -205.150.171.232 - 205.150.171.239 us -205.150.171.240 - 205.150.172.63 ca -205.150.172.64 - 205.150.172.191 us -205.150.172.192 - 205.150.172.255 ca -205.150.173.0 - 205.150.173.63 us -205.150.173.64 - 205.150.174.255 ca +205.150.152.96 - 205.150.152.127 ca +205.150.152.128 - 205.150.171.255 us +205.150.172.0 - 205.150.172.63 ca +205.150.172.64 - 205.150.173.255 us +205.150.174.0 - 205.150.174.255 ca 205.150.175.0 - 205.150.175.255 us 205.150.176.0 - 205.150.179.255 ca -205.150.180.0 - 205.150.181.255 us -205.150.182.0 - 205.150.182.63 ca -205.150.182.64 - 205.150.182.95 us -205.150.182.96 - 205.150.183.63 ca -205.150.183.64 - 205.150.183.127 us -205.150.183.128 - 205.150.184.223 ca -205.150.184.224 - 205.150.190.255 us -205.150.191.0 - 205.150.191.191 ca -205.150.191.192 - 205.150.191.255 us -205.150.192.0 - 205.150.192.47 ca -205.150.192.48 - 205.150.192.63 us -205.150.192.64 - 205.150.192.143 ca -205.150.192.144 - 205.150.192.175 us -205.150.192.176 - 205.150.192.191 ca -205.150.192.192 - 205.150.192.207 us -205.150.192.208 - 205.150.194.255 ca -205.150.195.0 - 205.150.195.255 us -205.150.196.0 - 205.150.196.127 ca -205.150.196.128 - 205.150.196.159 us -205.150.196.160 - 205.150.205.255 ca -205.150.206.0 - 205.150.206.255 us -205.150.207.0 - 205.150.207.255 ca +205.150.180.0 - 205.150.192.95 us +205.150.192.96 - 205.150.192.111 ca +205.150.192.112 - 205.150.193.255 us +205.150.194.0 - 205.150.194.255 ca +205.150.195.0 - 205.150.197.255 us +205.150.198.0 - 205.150.207.255 ca 205.150.208.0 - 205.150.208.255 us 205.150.209.0 - 205.150.210.255 ca -205.150.211.0 - 205.150.211.255 us -205.150.212.0 - 205.150.212.127 ca -205.150.212.128 - 205.150.212.191 us -205.150.212.192 - 205.150.214.119 ca -205.150.214.120 - 205.150.214.127 se -205.150.214.128 - 205.150.214.159 ca -205.150.214.160 - 205.150.214.183 us -205.150.214.184 - 205.150.214.255 ca -205.150.215.0 - 205.150.215.15 us -205.150.215.16 - 205.150.215.95 ca -205.150.215.96 - 205.150.215.111 us -205.150.215.112 - 205.150.215.127 ca -205.150.215.128 - 205.150.215.143 us -205.150.215.144 - 205.150.219.255 ca -205.150.220.0 - 205.150.236.255 us -205.150.237.0 - 205.150.240.255 ca +205.150.211.0 - 205.150.215.255 us +205.150.216.0 - 205.150.217.255 ca +205.150.218.0 - 205.150.219.127 us +205.150.219.128 - 205.150.219.255 ca +205.150.220.0 - 205.150.237.255 us +205.150.238.0 - 205.150.240.255 ca 205.150.241.0 - 205.150.245.255 us 205.150.246.0 - 205.150.254.255 ca -205.150.255.0 - 205.150.255.255 us -205.151.0.0 - 205.151.255.255 ca -205.152.0.0 - 205.156.176.255 us -205.156.177.0 - 205.156.177.255 gb -205.156.178.0 - 205.159.78.255 us -205.159.79.0 - 205.159.79.255 za +205.150.255.0 - 205.151.0.255 us +205.151.1.0 - 205.151.112.255 ca +205.151.113.0 - 205.151.115.255 us +205.151.116.0 - 205.151.188.255 ca +205.151.189.0 - 205.151.189.255 us +205.151.190.0 - 205.151.209.255 ca +205.151.210.0 - 205.151.211.255 us +205.151.212.0 - 205.151.254.255 ca +205.151.255.0 - 205.156.87.255 us +205.156.88.0 - 205.156.88.255 au +205.156.89.0 - 205.156.117.0 us +205.156.117.1 - 205.156.117.1 eu +205.156.117.2 - 205.156.159.255 us +205.156.160.0 - 205.156.160.255 au +205.156.161.0 - 205.156.183.255 us +205.156.184.0 - 205.156.184.255 ca +205.156.185.0 - 205.157.79.255 us +205.157.80.0 - 205.157.80.255 gb +205.157.81.0 - 205.157.81.255 us +205.157.82.0 - 205.157.82.255 gb +205.157.83.0 - 205.157.83.255 us +205.157.84.0 - 205.157.84.255 gb +205.157.85.0 - 205.157.85.255 nl +205.157.86.0 - 205.157.87.255 gb +205.157.88.0 - 205.157.88.255 nl +205.157.89.0 - 205.157.89.255 gb +205.157.90.0 - 205.159.78.255 us +205.159.79.0 - 205.159.79.255 mu 205.159.80.0 - 205.160.31.255 us 205.160.32.0 - 205.160.35.255 co 205.160.36.0 - 205.160.79.255 us @@ -127995,43 +105240,64 @@ 205.160.110.0 - 205.160.111.255 ye 205.160.112.0 - 205.160.232.255 us 205.160.233.0 - 205.160.233.255 ag -205.160.234.0 - 205.161.117.191 us -205.161.117.192 - 205.161.117.255 ca -205.161.118.0 - 205.161.167.255 us +205.160.234.0 - 205.161.14.255 us +205.161.15.0 - 205.161.15.255 as +205.161.16.0 - 205.161.167.255 us 205.161.168.0 - 205.161.168.255 es 205.161.169.0 - 205.162.111.255 us 205.162.112.0 - 205.162.119.255 ca -205.162.120.0 - 205.162.132.255 us -205.162.133.0 - 205.162.133.255 an -205.162.134.0 - 205.162.187.255 us +205.162.120.0 - 205.162.187.255 us 205.162.188.0 - 205.162.188.255 mx -205.162.189.0 - 205.166.34.255 us +205.162.189.0 - 205.164.34.255 us +205.164.35.0 - 205.164.36.255 ch +205.164.37.0 - 205.164.42.255 us +205.164.43.0 - 205.164.43.255 ch +205.164.44.0 - 205.164.61.255 us +205.164.62.0 - 205.164.62.255 ch +205.164.63.0 - 205.166.34.255 us 205.166.35.0 - 205.166.35.255 lc -205.166.36.0 - 205.166.250.255 us +205.166.36.0 - 205.166.178.255 us +205.166.179.0 - 205.166.179.255 ca +205.166.180.0 - 205.166.250.255 us 205.166.251.0 - 205.166.251.255 mx -205.166.252.0 - 205.168.23.15 us -205.168.23.16 - 205.168.23.31 fr -205.168.23.32 - 205.168.23.47 it -205.168.23.48 - 205.168.23.63 us -205.168.23.64 - 205.168.23.95 ne -205.168.23.96 - 205.168.23.127 ge -205.168.23.128 - 205.168.23.175 us -205.168.23.176 - 205.168.23.183 bg -205.168.23.184 - 205.168.23.223 us -205.168.23.224 - 205.168.23.255 ge -205.168.24.0 - 205.173.251.255 us +205.166.252.0 - 205.167.5.255 us +205.167.6.0 - 205.167.6.255 gb +205.167.7.0 - 205.167.7.255 fr +205.167.8.0 - 205.168.23.63 us +205.168.23.64 - 205.168.23.71 at +205.168.23.72 - 205.168.23.79 de +205.168.23.80 - 205.168.23.87 cz +205.168.23.88 - 205.168.23.143 us +205.168.23.144 - 205.168.23.151 de +205.168.23.152 - 205.168.23.191 us +205.168.23.192 - 205.168.23.199 it +205.168.23.200 - 205.168.23.207 cz +205.168.23.208 - 205.168.23.223 de +205.168.23.224 - 205.172.42.255 us +205.172.43.0 - 205.172.43.255 ca +205.172.44.0 - 205.172.124.255 us +205.172.125.0 - 205.172.125.255 ca +205.172.126.0 - 205.173.70.255 us +205.173.71.0 - 205.173.71.255 ca +205.173.72.0 - 205.173.124.255 us +205.173.125.0 - 205.173.125.255 ca +205.173.126.0 - 205.173.251.255 us 205.173.252.0 - 205.173.255.255 ca 205.174.0.0 - 205.174.159.255 us -205.174.160.0 - 205.174.164.255 ca -205.174.165.0 - 205.174.165.255 us -205.174.166.0 - 205.174.175.255 ca -205.174.176.0 - 205.177.27.255 us -205.177.28.0 - 205.177.28.31 hk -205.177.28.32 - 205.177.176.47 us -205.177.176.48 - 205.177.176.63 gb -205.177.176.64 - 205.177.223.255 us +205.174.160.0 - 205.174.175.255 ca +205.174.176.0 - 205.175.201.255 us +205.175.202.0 - 205.175.202.255 eu +205.175.203.0 - 205.175.211.255 us +205.175.212.0 - 205.175.215.255 ca +205.175.216.0 - 205.177.24.255 us +205.177.25.0 - 205.177.25.255 ap +205.177.26.0 - 205.177.176.127 us +205.177.176.128 - 205.177.176.255 gb +205.177.177.0 - 205.177.223.255 us 205.177.224.0 - 205.177.224.255 hk -205.177.225.0 - 205.180.173.255 us +205.177.225.0 - 205.177.225.255 us +205.177.226.0 - 205.177.226.255 cn +205.177.227.0 - 205.180.173.255 us 205.180.174.0 - 205.180.174.255 ve 205.180.175.0 - 205.180.242.255 us 205.180.243.0 - 205.180.243.255 au @@ -128041,25 +105307,33 @@ 205.181.176.0 - 205.181.176.255 hu 205.181.177.0 - 205.183.191.255 us 205.183.192.0 - 205.183.192.255 gb -205.183.193.0 - 205.185.111.255 us -205.185.112.0 - 205.185.113.71 ca -205.185.113.72 - 205.185.113.79 ar -205.185.113.80 - 205.185.117.31 ca -205.185.117.32 - 205.185.117.39 us -205.185.117.40 - 205.185.127.255 ca -205.185.128.0 - 205.185.207.255 us -205.185.208.0 - 205.185.211.255 br -205.185.212.0 - 205.188.255.255 us -205.189.0.0 - 205.189.84.255 ca +205.183.193.0 - 205.185.209.255 us +205.185.210.0 - 205.185.211.255 br +205.185.212.0 - 205.189.0.255 us +205.189.1.0 - 205.189.34.255 ca +205.189.35.0 - 205.189.38.255 us +205.189.39.0 - 205.189.43.255 ca +205.189.44.0 - 205.189.45.255 us +205.189.46.0 - 205.189.84.255 ca 205.189.85.0 - 205.189.85.255 us -205.189.86.0 - 205.189.111.255 ca +205.189.86.0 - 205.189.98.255 ca +205.189.99.0 - 205.189.99.255 us +205.189.100.0 - 205.189.101.255 ca +205.189.102.0 - 205.189.103.255 us +205.189.104.0 - 205.189.111.255 ca 205.189.112.0 - 205.189.116.255 us -205.189.117.0 - 205.189.255.255 ca -205.190.0.0 - 205.190.10.255 us +205.189.117.0 - 205.189.133.255 ca +205.189.134.0 - 205.189.134.255 us +205.189.135.0 - 205.189.199.255 ca +205.189.200.0 - 205.189.201.255 us +205.189.202.0 - 205.189.202.255 ca +205.189.203.0 - 205.189.203.255 us +205.189.204.0 - 205.189.254.255 ca +205.189.255.0 - 205.190.10.255 us 205.190.11.0 - 205.190.11.255 ca 205.190.12.0 - 205.190.21.255 us -205.190.22.0 - 205.190.23.255 ca -205.190.24.0 - 205.190.26.255 us +205.190.22.0 - 205.190.22.255 ca +205.190.23.0 - 205.190.26.255 us 205.190.27.0 - 205.190.27.255 ca 205.190.28.0 - 205.190.68.255 us 205.190.69.0 - 205.190.69.255 ca @@ -128075,11 +105349,7 @@ 205.190.158.0 - 205.190.158.255 pr 205.190.159.0 - 205.190.167.255 us 205.190.168.0 - 205.190.168.255 ca -205.190.169.0 - 205.190.180.255 us -205.190.181.0 - 205.190.181.255 pr -205.190.182.0 - 205.190.184.255 us -205.190.185.0 - 205.190.185.255 ca -205.190.186.0 - 205.190.186.255 us +205.190.169.0 - 205.190.186.255 us 205.190.187.0 - 205.190.187.255 ca 205.190.188.0 - 205.190.213.255 us 205.190.214.0 - 205.190.214.255 ca @@ -128093,92 +105363,214 @@ 205.190.231.0 - 205.190.232.255 ca 205.190.233.0 - 205.191.127.255 us 205.191.128.0 - 205.191.129.255 de -205.191.130.0 - 205.191.193.255 us +205.191.130.0 - 205.191.170.255 us +205.191.171.0 - 205.191.171.255 au +205.191.172.0 - 205.191.193.255 us 205.191.194.0 - 205.191.194.255 de 205.191.195.0 - 205.191.255.255 us 205.192.0.0 - 205.195.255.255 ca -205.196.0.0 - 205.196.17.31 us -205.196.17.32 - 205.196.17.63 ca -205.196.17.64 - 205.196.19.191 us -205.196.19.192 - 205.196.19.199 ca -205.196.19.200 - 205.196.21.228 us -205.196.21.229 - 205.196.21.229 ca -205.196.21.230 - 205.199.255.255 us +205.196.0.0 - 205.199.255.255 us 205.200.0.0 - 205.200.255.255 ca -205.201.0.0 - 205.203.175.255 us -205.203.176.0 - 205.203.191.255 be -205.203.192.0 - 205.204.63.255 us +205.201.0.0 - 205.203.98.255 us +205.203.99.0 - 205.203.99.255 hk +205.203.100.0 - 205.203.116.255 us +205.203.117.0 - 205.203.117.255 gb +205.203.118.0 - 205.203.175.255 us +205.203.176.0 - 205.203.176.255 eu +205.203.177.0 - 205.204.63.255 us 205.204.64.0 - 205.204.95.255 ca -205.204.96.0 - 205.204.255.255 us -205.205.0.0 - 205.205.1.23 ca -205.205.1.24 - 205.205.1.31 us -205.205.1.32 - 205.205.1.71 ca -205.205.1.72 - 205.205.1.79 us -205.205.1.80 - 205.205.1.199 ca -205.205.1.200 - 205.205.1.207 us -205.205.1.208 - 205.205.1.223 ca -205.205.1.224 - 205.205.1.231 us -205.205.1.232 - 205.205.1.239 ca -205.205.1.240 - 205.205.1.247 us -205.205.1.248 - 205.205.16.143 ca -205.205.16.144 - 205.205.16.175 us -205.205.16.176 - 205.205.17.239 ca -205.205.17.240 - 205.205.17.255 us -205.205.18.0 - 205.205.25.31 ca -205.205.25.32 - 205.205.25.47 us -205.205.25.48 - 205.205.25.223 ca -205.205.25.224 - 205.205.25.239 us -205.205.25.240 - 205.205.29.63 ca -205.205.29.64 - 205.205.29.127 us -205.205.29.128 - 205.205.49.191 ca -205.205.49.192 - 205.205.49.255 us -205.205.50.0 - 205.205.82.247 ca -205.205.82.248 - 205.205.82.255 us -205.205.83.0 - 205.205.91.63 ca -205.205.91.64 - 205.205.91.127 us -205.205.91.128 - 205.205.104.255 ca -205.205.105.0 - 205.205.105.15 us -205.205.105.16 - 205.205.113.127 ca -205.205.113.128 - 205.205.113.255 us -205.205.114.0 - 205.205.135.231 ca -205.205.135.232 - 205.205.135.239 us -205.205.135.240 - 205.205.179.255 ca -205.205.180.0 - 205.205.181.255 us -205.205.182.0 - 205.205.212.95 ca -205.205.212.96 - 205.205.212.103 us -205.205.212.104 - 205.205.212.167 ca -205.205.212.168 - 205.205.212.183 us -205.205.212.184 - 205.205.212.207 ca -205.205.212.208 - 205.205.212.215 us -205.205.212.216 - 205.205.235.255 ca -205.205.236.0 - 205.205.236.31 us -205.205.236.32 - 205.207.73.255 ca +205.204.96.0 - 205.204.124.255 us +205.204.125.0 - 205.204.125.255 hk +205.204.126.0 - 205.205.1.255 us +205.205.2.0 - 205.205.3.255 ca +205.205.4.0 - 205.205.4.255 us +205.205.5.0 - 205.205.6.255 ca +205.205.7.0 - 205.205.7.255 us +205.205.8.0 - 205.205.8.255 ca +205.205.9.0 - 205.205.10.255 us +205.205.11.0 - 205.205.12.255 ca +205.205.13.0 - 205.205.13.255 us +205.205.14.0 - 205.205.14.255 ca +205.205.15.0 - 205.205.17.95 us +205.205.17.96 - 205.205.17.127 ca +205.205.17.128 - 205.205.18.255 us +205.205.19.0 - 205.205.20.255 ca +205.205.21.0 - 205.205.21.255 us +205.205.22.0 - 205.205.22.255 ca +205.205.23.0 - 205.205.23.255 us +205.205.24.0 - 205.205.24.255 ca +205.205.25.0 - 205.205.25.255 us +205.205.26.0 - 205.205.26.255 ca +205.205.27.0 - 205.205.29.255 us +205.205.30.0 - 205.205.34.255 ca +205.205.35.0 - 205.205.35.255 us +205.205.36.0 - 205.205.37.255 ca +205.205.38.0 - 205.205.38.255 us +205.205.39.0 - 205.205.41.255 ca +205.205.42.0 - 205.205.42.255 us +205.205.43.0 - 205.205.45.255 ca +205.205.46.0 - 205.205.46.255 us +205.205.47.0 - 205.205.48.255 ca +205.205.49.0 - 205.205.49.255 us +205.205.50.0 - 205.205.51.255 ca +205.205.52.0 - 205.205.52.255 us +205.205.53.0 - 205.205.57.255 ca +205.205.58.0 - 205.205.58.255 us +205.205.59.0 - 205.205.59.255 ca +205.205.60.0 - 205.205.61.255 us +205.205.62.0 - 205.205.63.255 ca +205.205.64.0 - 205.205.65.255 us +205.205.66.0 - 205.205.67.255 ca +205.205.68.0 - 205.205.68.255 us +205.205.69.0 - 205.205.69.255 ca +205.205.70.0 - 205.205.70.255 us +205.205.71.0 - 205.205.74.255 ca +205.205.75.0 - 205.205.76.255 us +205.205.77.0 - 205.205.79.255 ca +205.205.80.0 - 205.205.80.255 us +205.205.81.0 - 205.205.81.255 ca +205.205.82.0 - 205.205.82.255 us +205.205.83.0 - 205.205.84.255 ca +205.205.85.0 - 205.205.85.255 us +205.205.86.0 - 205.205.90.255 ca +205.205.91.0 - 205.205.91.255 us +205.205.92.0 - 205.205.98.255 ca +205.205.99.0 - 205.205.99.255 us +205.205.100.0 - 205.205.101.255 ca +205.205.102.0 - 205.205.106.255 us +205.205.107.0 - 205.205.112.255 ca +205.205.113.0 - 205.205.113.255 us +205.205.114.0 - 205.205.114.255 ca +205.205.115.0 - 205.205.115.255 us +205.205.116.0 - 205.205.120.255 ca +205.205.121.0 - 205.205.121.255 us +205.205.122.0 - 205.205.124.255 ca +205.205.125.0 - 205.205.125.255 us +205.205.126.0 - 205.205.128.255 ca +205.205.129.0 - 205.205.129.255 us +205.205.130.0 - 205.205.134.255 ca +205.205.135.0 - 205.205.135.255 us +205.205.136.0 - 205.205.137.255 ca +205.205.138.0 - 205.205.138.255 us +205.205.139.0 - 205.205.145.255 ca +205.205.146.0 - 205.205.146.255 us +205.205.147.0 - 205.205.149.255 ca +205.205.150.0 - 205.205.150.255 us +205.205.151.0 - 205.205.152.255 ca +205.205.153.0 - 205.205.153.255 us +205.205.154.0 - 205.205.163.255 ca +205.205.164.0 - 205.205.166.255 us +205.205.167.0 - 205.205.167.255 ca +205.205.168.0 - 205.205.168.255 us +205.205.169.0 - 205.205.169.255 ca +205.205.170.0 - 205.205.170.255 us +205.205.171.0 - 205.205.171.255 ca +205.205.172.0 - 205.205.172.255 us +205.205.173.0 - 205.205.177.255 ca +205.205.178.0 - 205.205.178.255 us +205.205.179.0 - 205.205.179.255 ca +205.205.180.0 - 205.205.182.255 us +205.205.183.0 - 205.205.184.255 ca +205.205.185.0 - 205.205.185.255 us +205.205.186.0 - 205.205.187.255 ca +205.205.188.0 - 205.205.188.255 us +205.205.189.0 - 205.205.191.255 ca +205.205.192.0 - 205.205.192.255 us +205.205.193.0 - 205.205.194.255 ca +205.205.195.0 - 205.205.195.255 us +205.205.196.0 - 205.205.199.255 ca +205.205.200.0 - 205.205.200.255 us +205.205.201.0 - 205.205.202.255 ca +205.205.203.0 - 205.205.204.127 us +205.205.204.128 - 205.205.204.143 ca +205.205.204.144 - 205.205.205.255 us +205.205.206.0 - 205.205.208.255 ca +205.205.209.0 - 205.205.209.255 us +205.205.210.0 - 205.205.211.255 ca +205.205.212.0 - 205.205.212.255 us +205.205.213.0 - 205.205.213.255 ca +205.205.214.0 - 205.205.214.255 us +205.205.215.0 - 205.205.216.255 ca +205.205.217.0 - 205.205.219.255 us +205.205.220.0 - 205.205.220.255 ca +205.205.221.0 - 205.205.221.255 us +205.205.222.0 - 205.205.223.255 ca +205.205.224.0 - 205.205.226.255 us +205.205.227.0 - 205.205.227.255 ca +205.205.228.0 - 205.205.228.255 us +205.205.229.0 - 205.205.231.255 ca +205.205.232.0 - 205.205.232.255 us +205.205.233.0 - 205.205.233.255 ca +205.205.234.0 - 205.205.234.255 us +205.205.235.0 - 205.205.235.255 ca +205.205.236.0 - 205.205.236.255 us +205.205.237.0 - 205.205.239.255 ca +205.205.240.0 - 205.205.240.255 us +205.205.241.0 - 205.205.252.255 ca +205.205.253.0 - 205.205.254.255 us +205.205.255.0 - 205.206.255.255 ca +205.207.0.0 - 205.207.0.255 us +205.207.1.0 - 205.207.27.255 ca +205.207.28.0 - 205.207.28.255 us +205.207.29.0 - 205.207.65.255 ca +205.207.66.0 - 205.207.66.255 us +205.207.67.0 - 205.207.73.255 ca 205.207.74.0 - 205.207.74.255 us -205.207.75.0 - 205.207.99.255 ca -205.207.100.0 - 205.207.107.255 us -205.207.110.0 - 205.207.154.255 ca +205.207.75.0 - 205.207.94.255 ca +205.207.95.0 - 205.207.95.255 us +205.207.96.0 - 205.207.99.255 ca +205.207.100.0 - 205.207.109.255 us +205.207.110.0 - 205.207.140.255 ca +205.207.141.0 - 205.207.141.255 us +205.207.142.0 - 205.207.147.255 ca +205.207.148.0 - 205.207.149.255 us +205.207.150.0 - 205.207.154.255 ca 205.207.155.0 - 205.207.159.255 us -205.207.160.0 - 205.207.255.255 ca -205.208.0.0 - 205.208.255.255 us -205.209.0.0 - 205.209.8.255 ca -205.209.12.0 - 205.209.50.63 us -205.209.50.64 - 205.209.50.79 au -205.209.50.80 - 205.209.50.95 us -205.209.50.96 - 205.209.50.111 ca -205.209.50.112 - 205.209.52.7 us -205.209.52.8 - 205.209.52.15 au -205.209.52.16 - 205.209.53.47 us -205.209.53.48 - 205.209.53.63 au -205.209.53.64 - 205.209.255.255 us -205.210.0.0 - 205.210.35.255 ca +205.207.160.0 - 205.207.169.255 ca +205.207.170.0 - 205.207.171.15 us +205.207.171.16 - 205.207.171.31 ca +205.207.171.32 - 205.207.171.255 us +205.207.172.0 - 205.207.185.255 ca +205.207.186.0 - 205.207.186.255 us +205.207.187.0 - 205.207.225.255 ca +205.207.226.0 - 205.207.226.255 us +205.207.227.0 - 205.207.254.255 ca +205.207.255.0 - 205.209.0.255 us +205.209.1.0 - 205.209.6.255 ca +205.209.7.0 - 205.209.7.255 us +205.209.8.0 - 205.209.8.255 ca +205.209.9.0 - 205.209.9.255 us +205.209.10.0 - 205.209.11.255 ca +205.209.12.0 - 205.210.0.255 us +205.210.1.0 - 205.210.19.255 ca +205.210.20.0 - 205.210.23.255 us +205.210.24.0 - 205.210.35.255 ca 205.210.36.0 - 205.210.36.255 us -205.210.37.0 - 205.210.185.255 ca -205.210.188.0 - 205.210.191.255 us +205.210.37.0 - 205.210.124.255 ca +205.210.125.0 - 205.210.125.255 us +205.210.126.0 - 205.210.144.255 ca +205.210.145.0 - 205.210.145.255 us +205.210.146.0 - 205.210.148.255 ca +205.210.149.0 - 205.210.149.255 us +205.210.150.0 - 205.210.185.255 ca +205.210.186.0 - 205.210.191.255 us 205.210.192.0 - 205.210.223.255 ca 205.210.224.0 - 205.210.224.255 us -205.210.225.0 - 205.211.7.255 ca +205.210.225.0 - 205.210.233.255 ca +205.210.234.0 - 205.210.234.255 us +205.210.235.0 - 205.210.247.255 ca +205.210.248.0 - 205.210.248.255 us +205.210.249.0 - 205.210.254.255 ca +205.210.255.0 - 205.211.0.255 us +205.211.1.0 - 205.211.7.255 ca 205.211.8.0 - 205.211.9.255 bm -205.211.10.0 - 205.211.147.255 ca +205.211.10.0 - 205.211.23.255 ca +205.211.24.0 - 205.211.25.255 us +205.211.26.0 - 205.211.82.255 ca +205.211.83.0 - 205.211.83.255 us +205.211.84.0 - 205.211.90.255 ca +205.211.91.0 - 205.211.91.255 us +205.211.92.0 - 205.211.147.255 ca 205.211.148.0 - 205.211.148.255 us 205.211.149.0 - 205.211.191.255 ca 205.211.192.0 - 205.211.195.255 hn @@ -128200,170 +105592,7 @@ 205.211.243.0 - 205.211.243.255 sv 205.211.244.0 - 205.211.246.255 us 205.211.247.0 - 205.211.255.255 hn -205.212.0.0 - 205.212.71.255 us -205.212.72.0 - 205.212.79.255 a1 -205.212.80.0 - 205.214.64.215 us -205.214.64.216 - 205.214.64.239 ca -205.214.64.240 - 205.214.65.79 us -205.214.65.80 - 205.214.65.95 ca -205.214.65.96 - 205.214.67.55 us -205.214.67.56 - 205.214.67.63 ca -205.214.67.64 - 205.214.67.79 us -205.214.67.80 - 205.214.67.87 my -205.214.67.88 - 205.214.68.71 us -205.214.68.72 - 205.214.68.79 cz -205.214.68.80 - 205.214.68.247 us -205.214.68.248 - 205.214.69.15 ca -205.214.69.16 - 205.214.69.23 us -205.214.69.24 - 205.214.69.31 ca -205.214.69.32 - 205.214.69.119 us -205.214.69.120 - 205.214.69.135 sa -205.214.69.136 - 205.214.69.159 us -205.214.69.160 - 205.214.69.167 sa -205.214.69.168 - 205.214.69.183 us -205.214.69.184 - 205.214.69.191 jp -205.214.69.192 - 205.214.70.63 us -205.214.70.64 - 205.214.70.71 at -205.214.70.72 - 205.214.70.79 ca -205.214.70.80 - 205.214.70.143 us -205.214.70.144 - 205.214.70.159 sa -205.214.70.160 - 205.214.71.23 us -205.214.71.24 - 205.214.71.31 jp -205.214.71.32 - 205.214.71.39 ch -205.214.71.40 - 205.214.71.71 us -205.214.71.72 - 205.214.71.87 ca -205.214.71.88 - 205.214.71.103 us -205.214.71.104 - 205.214.71.111 pt -205.214.71.112 - 205.214.71.127 us -205.214.71.128 - 205.214.71.167 ca -205.214.71.168 - 205.214.71.255 us -205.214.72.0 - 205.214.72.23 ua -205.214.72.24 - 205.214.72.119 us -205.214.72.120 - 205.214.72.127 hk -205.214.72.128 - 205.214.72.135 lb -205.214.72.136 - 205.214.73.39 us -205.214.73.40 - 205.214.73.55 sa -205.214.73.56 - 205.214.73.63 om -205.214.73.64 - 205.214.73.95 us -205.214.73.96 - 205.214.73.103 ae -205.214.73.104 - 205.214.73.111 us -205.214.73.112 - 205.214.73.119 lb -205.214.73.120 - 205.214.74.23 us -205.214.74.24 - 205.214.74.39 in -205.214.74.40 - 205.214.74.47 us -205.214.74.48 - 205.214.74.63 in -205.214.74.64 - 205.214.74.79 us -205.214.74.80 - 205.214.74.95 in -205.214.74.96 - 205.214.74.167 us -205.214.74.168 - 205.214.74.199 sa -205.214.74.200 - 205.214.74.207 us -205.214.74.208 - 205.214.74.215 ph -205.214.74.216 - 205.214.75.55 us -205.214.75.56 - 205.214.75.87 ca -205.214.75.88 - 205.214.80.55 us -205.214.80.56 - 205.214.80.63 at -205.214.80.64 - 205.214.80.87 us -205.214.80.88 - 205.214.80.95 ca -205.214.80.96 - 205.214.80.103 us -205.214.80.104 - 205.214.80.119 ph -205.214.80.120 - 205.214.80.127 cy -205.214.80.128 - 205.214.80.175 us -205.214.80.176 - 205.214.80.183 ca -205.214.80.184 - 205.214.81.71 us -205.214.81.72 - 205.214.81.87 ph -205.214.81.88 - 205.214.81.95 us -205.214.81.96 - 205.214.81.103 ca -205.214.81.104 - 205.214.81.151 us -205.214.81.152 - 205.214.81.159 ua -205.214.81.160 - 205.214.81.207 us -205.214.81.208 - 205.214.81.215 gb -205.214.81.216 - 205.214.82.7 us -205.214.82.8 - 205.214.82.23 gb -205.214.82.24 - 205.214.82.47 us -205.214.82.48 - 205.214.82.71 sa -205.214.82.72 - 205.214.82.119 us -205.214.82.120 - 205.214.82.159 sa -205.214.82.160 - 205.214.82.167 th -205.214.82.168 - 205.214.82.191 us -205.214.82.192 - 205.214.82.215 sa -205.214.82.216 - 205.214.82.239 us -205.214.82.240 - 205.214.82.255 gb -205.214.83.0 - 205.214.83.23 us -205.214.83.24 - 205.214.83.31 in -205.214.83.32 - 205.214.83.47 gb -205.214.83.48 - 205.214.83.87 tk -205.214.83.88 - 205.214.83.111 us -205.214.83.112 - 205.214.83.143 gb -205.214.83.144 - 205.214.83.151 us -205.214.83.152 - 205.214.83.175 sa -205.214.83.176 - 205.214.83.183 gb -205.214.83.184 - 205.214.83.215 fr -205.214.83.216 - 205.214.83.255 au -205.214.84.0 - 205.214.84.63 us -205.214.84.64 - 205.214.84.71 nz -205.214.84.72 - 205.214.84.87 us -205.214.84.88 - 205.214.84.95 ru -205.214.84.96 - 205.214.84.103 us -205.214.84.104 - 205.214.84.111 nz -205.214.84.112 - 205.214.84.151 us -205.214.84.152 - 205.214.84.159 nz -205.214.84.160 - 205.214.85.39 us -205.214.85.40 - 205.214.85.47 nz -205.214.85.48 - 205.214.85.63 us -205.214.85.64 - 205.214.85.143 sa -205.214.85.144 - 205.214.85.255 us -205.214.86.0 - 205.214.86.255 ca -205.214.87.0 - 205.214.88.23 us -205.214.88.24 - 205.214.88.31 gb -205.214.88.32 - 205.214.88.207 us -205.214.88.208 - 205.214.88.215 gb -205.214.88.216 - 205.214.88.231 us -205.214.88.232 - 205.214.88.239 gb -205.214.88.240 - 205.214.88.247 ua -205.214.88.248 - 205.214.89.15 us -205.214.89.16 - 205.214.89.23 gb -205.214.89.24 - 205.214.89.55 us -205.214.89.56 - 205.214.89.63 au -205.214.89.64 - 205.214.89.71 sa -205.214.89.72 - 205.214.89.79 us -205.214.89.80 - 205.214.89.119 kw -205.214.89.120 - 205.214.89.151 us -205.214.89.152 - 205.214.89.159 gb -205.214.89.160 - 205.214.89.183 us -205.214.89.184 - 205.214.89.191 gb -205.214.89.192 - 205.214.89.207 us -205.214.89.208 - 205.214.89.215 sa -205.214.89.216 - 205.214.90.7 us -205.214.90.8 - 205.214.90.15 ca -205.214.90.16 - 205.214.90.135 us -205.214.90.136 - 205.214.90.143 gb -205.214.90.144 - 205.214.90.159 us -205.214.90.160 - 205.214.90.167 au -205.214.90.168 - 205.214.91.39 us -205.214.91.40 - 205.214.91.47 gb -205.214.91.48 - 205.214.92.71 us -205.214.92.72 - 205.214.92.79 sa -205.214.92.80 - 205.214.92.135 us -205.214.92.136 - 205.214.92.143 nl -205.214.92.144 - 205.214.93.23 us -205.214.93.24 - 205.214.93.31 hn -205.214.93.32 - 205.214.93.95 us -205.214.93.96 - 205.214.93.111 ca -205.214.93.112 - 205.214.93.207 us -205.214.93.208 - 205.214.93.215 sa -205.214.93.216 - 205.214.93.223 us -205.214.93.224 - 205.214.93.239 gb -205.214.93.240 - 205.214.93.255 us -205.214.94.0 - 205.214.94.7 gb -205.214.94.8 - 205.214.94.95 us -205.214.94.96 - 205.214.94.103 sa -205.214.94.104 - 205.214.94.223 us -205.214.94.224 - 205.214.94.231 dk -205.214.94.232 - 205.214.95.199 us -205.214.95.200 - 205.214.95.207 be -205.214.95.208 - 205.214.95.215 ca -205.214.95.216 - 205.214.95.231 gb -205.214.95.232 - 205.214.191.255 us +205.212.0.0 - 205.214.191.255 us 205.214.192.0 - 205.214.202.255 bb 205.214.203.0 - 205.214.203.255 kn 205.214.204.0 - 205.214.204.255 tc @@ -128374,58 +105603,21 @@ 205.214.212.0 - 205.214.214.255 bb 205.214.215.0 - 205.214.216.255 kn 205.214.217.0 - 205.214.223.255 bb -205.214.224.0 - 205.217.4.223 us -205.217.4.224 - 205.217.5.7 gb -205.217.5.8 - 205.217.5.23 us -205.217.5.24 - 205.217.5.31 gb -205.217.5.32 - 205.217.5.63 us -205.217.5.64 - 205.217.5.95 gb -205.217.5.96 - 205.217.5.167 us -205.217.5.168 - 205.217.5.175 gb -205.217.5.176 - 205.217.7.15 us -205.217.7.16 - 205.217.7.23 gb -205.217.7.24 - 205.217.7.71 us -205.217.7.72 - 205.217.7.79 ie -205.217.7.80 - 205.217.7.87 gb -205.217.7.88 - 205.217.7.127 us -205.217.7.128 - 205.217.7.255 ie +205.214.224.0 - 205.214.255.255 us +205.215.0.0 - 205.215.31.255 mo +205.215.32.0 - 205.217.4.228 us +205.217.4.229 - 205.217.4.229 gb +205.217.4.230 - 205.217.5.255 us +205.217.6.0 - 205.217.6.255 gb +205.217.7.0 - 205.217.7.255 us 205.217.8.0 - 205.217.8.255 gb 205.217.9.0 - 205.217.9.255 us 205.217.10.0 - 205.217.10.255 gb -205.217.11.0 - 205.217.11.223 us -205.217.11.224 - 205.217.11.231 gb -205.217.11.232 - 205.217.12.255 us -205.217.13.0 - 205.217.13.63 gb -205.217.13.64 - 205.217.13.143 us -205.217.13.144 - 205.217.13.175 gb -205.217.13.176 - 205.217.13.239 us -205.217.13.240 - 205.217.13.255 gb -205.217.14.0 - 205.217.14.31 us -205.217.14.32 - 205.217.14.39 gb -205.217.14.40 - 205.217.14.63 us -205.217.14.64 - 205.217.14.79 gb -205.217.14.80 - 205.217.14.255 us +205.217.11.0 - 205.217.14.255 us 205.217.15.0 - 205.217.15.255 gb -205.217.16.0 - 205.217.16.175 us -205.217.16.176 - 205.217.16.191 nl -205.217.16.192 - 205.217.19.255 us -205.217.20.0 - 205.217.20.55 gb -205.217.20.56 - 205.217.128.255 us -205.217.129.0 - 205.217.129.79 sg -205.217.129.80 - 205.217.175.135 us -205.217.175.136 - 205.217.175.159 ca -205.217.175.160 - 205.217.175.191 us -205.217.175.192 - 205.217.175.231 ca -205.217.175.232 - 205.217.192.255 us +205.217.16.0 - 205.217.192.255 us 205.217.193.0 - 205.217.195.255 gb -205.217.196.0 - 205.217.200.71 us -205.217.200.72 - 205.217.200.79 gb -205.217.200.80 - 205.217.200.87 ch -205.217.200.88 - 205.217.201.127 us -205.217.201.128 - 205.217.201.135 gb -205.217.201.136 - 205.217.201.159 us -205.217.201.160 - 205.217.201.175 gb -205.217.201.176 - 205.217.223.255 us +205.217.196.0 - 205.217.223.255 us 205.217.224.0 - 205.217.227.255 kn 205.217.228.0 - 205.217.231.255 lc 205.217.232.0 - 205.217.233.255 ag @@ -128439,22 +105631,19 @@ 205.217.252.0 - 205.217.252.255 ag 205.217.253.0 - 205.217.253.255 kn 205.217.254.0 - 205.217.255.255 ag -205.218.0.0 - 205.219.1.23 us -205.219.1.24 - 205.219.1.31 in -205.219.1.32 - 205.223.231.69 us +205.218.0.0 - 205.223.231.69 us 205.223.231.70 - 205.223.231.70 es 205.223.231.71 - 205.223.239.5 us 205.223.239.6 - 205.223.239.6 gb -205.223.239.7 - 205.230.131.255 us +205.223.239.7 - 205.228.63.255 us +205.228.64.0 - 205.228.95.255 gb +205.228.96.0 - 205.230.131.255 us 205.230.132.0 - 205.230.132.255 gu 205.230.133.0 - 205.231.115.255 us 205.231.116.0 - 205.231.119.255 mx -205.231.120.0 - 205.232.117.39 us -205.232.117.40 - 205.232.117.47 nc -205.232.117.48 - 205.233.0.255 us +205.231.120.0 - 205.233.0.255 us 205.233.1.0 - 205.233.7.255 ca -205.233.8.0 - 205.233.11.255 us -205.233.14.0 - 205.233.14.255 us +205.233.8.0 - 205.233.14.255 us 205.233.15.0 - 205.233.16.255 ca 205.233.17.0 - 205.233.18.255 us 205.233.19.0 - 205.233.21.255 ca @@ -128469,7 +105658,9 @@ 205.233.73.0 - 205.233.73.255 us 205.233.74.0 - 205.233.74.255 ca 205.233.75.0 - 205.233.79.255 us -205.233.80.0 - 205.233.138.255 ca +205.233.80.0 - 205.233.125.255 ca +205.233.126.0 - 205.233.127.255 us +205.233.128.0 - 205.233.138.255 ca 205.233.139.0 - 205.233.143.255 us 205.233.144.0 - 205.233.146.255 ca 205.233.147.0 - 205.233.147.255 us @@ -128480,68 +105671,21 @@ 205.233.248.0 - 205.233.254.255 ca 205.233.255.0 - 205.234.31.255 us 205.234.32.0 - 205.234.63.255 ca -205.234.64.0 - 205.234.133.71 us -205.234.133.72 - 205.234.133.87 ca -205.234.133.88 - 205.234.133.135 us -205.234.133.136 - 205.234.133.143 hk -205.234.133.144 - 205.234.150.31 us -205.234.150.32 - 205.234.150.39 in -205.234.150.40 - 205.234.150.151 us -205.234.150.152 - 205.234.150.159 ca -205.234.150.160 - 205.234.152.31 us -205.234.152.32 - 205.234.152.47 ca -205.234.152.48 - 205.234.153.79 us -205.234.153.80 - 205.234.153.87 af -205.234.153.88 - 205.234.153.135 us -205.234.153.136 - 205.234.153.143 id -205.234.153.144 - 205.234.153.175 us -205.234.153.176 - 205.234.153.183 ca -205.234.153.184 - 205.234.153.191 us -205.234.153.192 - 205.234.153.207 ca -205.234.153.208 - 205.234.153.215 ae -205.234.153.216 - 205.234.153.231 us -205.234.153.232 - 205.234.153.239 gb -205.234.153.240 - 205.234.157.255 us -205.234.158.0 - 205.234.158.63 gb -205.234.158.64 - 205.234.159.31 us -205.234.159.32 - 205.234.159.39 gb -205.234.159.40 - 205.234.159.103 us -205.234.159.104 - 205.234.159.111 ca -205.234.159.112 - 205.234.172.191 us -205.234.172.192 - 205.234.172.255 in -205.234.173.0 - 205.234.179.23 us -205.234.179.24 - 205.234.179.31 so -205.234.179.32 - 205.234.179.143 us -205.234.179.144 - 205.234.179.151 in -205.234.179.152 - 205.234.182.191 us -205.234.182.192 - 205.234.182.223 hk -205.234.182.224 - 205.234.206.111 us -205.234.206.112 - 205.234.206.119 ca -205.234.206.120 - 205.234.210.159 us -205.234.210.160 - 205.234.210.191 hk -205.234.210.192 - 205.234.211.47 us -205.234.211.48 - 205.234.211.55 eg -205.234.211.56 - 205.234.211.63 be -205.234.211.64 - 205.234.211.239 us -205.234.211.240 - 205.234.211.247 tr -205.234.211.248 - 205.234.220.159 us -205.234.220.160 - 205.234.220.167 eg -205.234.220.168 - 205.234.238.127 us -205.234.238.128 - 205.234.238.135 de -205.234.238.136 - 205.234.241.231 us -205.234.241.232 - 205.234.241.239 nl -205.234.241.240 - 205.234.246.119 us -205.234.246.120 - 205.234.246.127 ca -205.234.246.128 - 205.234.255.255 us +205.234.64.0 - 205.234.246.255 us +205.234.247.0 - 205.234.247.255 jp +205.234.248.0 - 205.234.255.255 us 205.235.0.0 - 205.235.7.255 ec 205.235.8.0 - 205.236.0.255 us 205.236.1.0 - 205.236.50.255 ca 205.236.51.0 - 205.236.51.255 us 205.236.52.0 - 205.236.55.255 ca 205.236.56.0 - 205.236.56.255 us -205.236.57.0 - 205.236.74.255 ca +205.236.57.0 - 205.236.70.255 ca +205.236.71.0 - 205.236.71.255 us +205.236.72.0 - 205.236.74.255 ca 205.236.75.0 - 205.236.75.255 us 205.236.76.0 - 205.236.77.255 ca +205.236.78.0 - 205.236.79.255 us 205.236.80.0 - 205.236.80.255 ca 205.236.81.0 - 205.236.81.255 us 205.236.82.0 - 205.236.126.255 ca @@ -128550,25 +105694,25 @@ 205.236.255.0 - 205.237.0.255 us 205.237.1.0 - 205.237.24.255 ca 205.237.25.0 - 205.237.25.255 us -205.237.26.0 - 205.237.87.255 ca -205.237.88.0 - 205.237.207.255 us -205.237.208.0 - 205.237.255.255 ca -205.238.0.0 - 205.240.151.255 us +205.237.26.0 - 205.237.78.255 ca +205.237.79.0 - 205.237.79.255 us +205.237.80.0 - 205.237.87.255 ca +205.237.88.0 - 205.237.209.255 us +205.237.210.0 - 205.237.254.255 ca +205.237.255.0 - 205.239.97.255 us +205.239.98.0 - 205.239.98.255 gb +205.239.99.0 - 205.239.167.255 us +205.239.168.0 - 205.239.169.255 au +205.239.170.0 - 205.240.151.255 us 205.240.152.0 - 205.240.155.255 ec 205.240.156.0 - 205.240.199.255 us 205.240.200.0 - 205.240.207.255 hn 205.240.208.0 - 205.240.223.255 sr -205.240.224.0 - 205.240.253.191 us -205.240.253.192 - 205.240.253.199 pr -205.240.253.200 - 205.241.11.255 us +205.240.224.0 - 205.241.11.255 us 205.241.12.0 - 205.241.12.255 mx 205.241.13.0 - 205.241.33.255 us 205.241.34.0 - 205.241.39.255 bo -205.241.40.0 - 205.242.208.167 us -205.242.208.168 - 205.242.208.175 ca -205.242.208.176 - 205.242.218.47 us -205.242.218.48 - 205.242.218.55 ca -205.242.218.56 - 205.243.255.255 us +205.241.40.0 - 205.243.255.255 us 205.244.0.0 - 205.244.7.255 fr 205.244.8.0 - 205.244.31.255 us 205.244.32.0 - 205.244.35.255 do @@ -128576,15 +105720,17 @@ 205.244.42.0 - 205.244.43.255 es 205.244.44.0 - 205.244.53.255 us 205.244.54.0 - 205.244.55.255 nl -205.244.56.0 - 205.244.152.255 us +205.244.56.0 - 205.244.147.255 us +205.244.148.0 - 205.244.151.255 bb +205.244.152.0 - 205.244.152.255 us 205.244.153.0 - 205.244.153.255 es -205.244.154.0 - 205.244.158.159 us -205.244.158.160 - 205.244.158.175 pr -205.244.158.176 - 205.245.127.255 us +205.244.154.0 - 205.245.127.255 us 205.245.128.0 - 205.245.129.255 ky 205.245.130.0 - 205.245.139.255 us 205.245.140.0 - 205.245.141.255 be -205.245.142.0 - 205.247.137.255 us +205.245.142.0 - 205.246.8.255 us +205.246.9.0 - 205.246.9.255 ht +205.246.10.0 - 205.247.137.255 us 205.247.138.0 - 205.247.138.255 ec 205.247.139.0 - 205.247.192.255 us 205.247.193.0 - 205.247.193.255 ec @@ -128597,16 +105743,13 @@ 205.248.26.0 - 205.248.26.255 fr 205.248.27.0 - 205.248.27.255 us 205.248.28.0 - 205.248.28.255 be -205.248.29.0 - 205.248.36.255 us -205.248.37.0 - 205.248.37.255 nl -205.248.38.0 - 205.248.38.255 us +205.248.29.0 - 205.248.38.255 us 205.248.39.0 - 205.248.39.255 ie 205.248.40.0 - 205.248.40.255 kr 205.248.41.0 - 205.248.46.255 us 205.248.47.0 - 205.248.47.255 de 205.248.48.0 - 205.248.48.255 tw -205.248.49.0 - 205.248.49.255 de -205.248.50.0 - 205.248.51.255 us +205.248.49.0 - 205.248.51.255 us 205.248.52.0 - 205.248.52.255 kr 205.248.53.0 - 205.248.53.255 fr 205.248.54.0 - 205.248.55.255 ch @@ -128625,19 +105768,13 @@ 205.248.75.0 - 205.248.76.255 gb 205.248.77.0 - 205.248.77.255 us 205.248.78.0 - 205.248.79.255 gb -205.248.80.0 - 205.248.129.255 us -205.248.130.0 - 205.248.132.255 jp -205.248.133.0 - 205.248.133.255 us +205.248.80.0 - 205.248.133.255 us 205.248.134.0 - 205.248.134.255 ca 205.248.135.0 - 205.248.136.255 us 205.248.137.0 - 205.248.143.255 gb -205.248.144.0 - 205.248.144.191 us -205.248.144.192 - 205.248.144.255 ar -205.248.145.0 - 205.248.146.255 us +205.248.144.0 - 205.248.146.255 us 205.248.147.0 - 205.248.147.255 gb -205.248.148.0 - 205.248.148.191 us -205.248.148.192 - 205.248.148.255 ve -205.248.149.0 - 205.248.153.255 us +205.248.148.0 - 205.248.153.255 us 205.248.154.0 - 205.248.155.255 gb 205.248.156.0 - 205.248.163.255 us 205.248.164.0 - 205.248.164.255 fr @@ -128684,22 +105821,26 @@ 205.248.255.0 - 205.248.255.255 it 205.249.0.0 - 205.249.255.255 us 205.250.0.0 - 205.250.255.255 ca -205.251.0.0 - 205.251.72.127 us -205.251.72.128 - 205.251.72.159 fr -205.251.72.160 - 205.252.107.255 us +205.251.0.0 - 205.252.107.255 us 205.252.108.0 - 205.252.108.255 zm -205.252.109.0 - 206.2.255.255 us +205.252.109.0 - 205.252.232.223 us +205.252.232.224 - 205.252.232.239 hk +205.252.232.240 - 205.252.255.255 us +205.253.0.0 - 205.253.205.223 sg +205.253.205.224 - 205.253.205.231 us +205.253.205.232 - 205.253.211.63 sg +205.253.211.64 - 205.253.211.71 us +205.253.211.72 - 205.253.255.255 sg +205.254.0.0 - 206.2.255.255 us 206.3.0.0 - 206.3.31.255 jp -206.3.32.0 - 206.11.255.255 us +206.3.32.0 - 206.3.223.255 us +206.3.224.0 - 206.3.239.255 bg +206.3.240.0 - 206.11.255.255 us 206.12.0.0 - 206.12.255.255 ca -206.13.0.0 - 206.17.100.159 us -206.17.100.160 - 206.17.100.175 se -206.17.100.176 - 206.18.101.191 us -206.18.101.192 - 206.18.101.255 ie -206.18.102.0 - 206.22.13.255 us +206.13.0.0 - 206.22.13.255 us 206.22.14.0 - 206.22.14.255 ca -206.22.15.0 - 206.22.18.255 us -206.22.19.0 - 206.22.20.255 ca +206.22.15.0 - 206.22.19.255 us +206.22.20.0 - 206.22.20.255 ca 206.22.21.0 - 206.22.22.255 us 206.22.23.0 - 206.22.23.255 ca 206.22.24.0 - 206.22.28.255 us @@ -128726,67 +105867,25 @@ 206.22.204.0 - 206.22.204.255 ca 206.22.205.0 - 206.24.17.255 us 206.24.18.0 - 206.24.21.255 ca -206.24.22.0 - 206.24.172.143 us -206.24.172.144 - 206.24.172.159 gb -206.24.172.160 - 206.26.192.255 us +206.24.22.0 - 206.26.192.255 us 206.26.193.0 - 206.26.193.255 ca -206.26.194.0 - 206.26.204.191 us -206.26.204.192 - 206.26.204.255 ca -206.26.205.0 - 206.27.63.255 us -206.27.64.0 - 206.27.65.15 in -206.27.65.16 - 206.30.48.63 us -206.30.48.64 - 206.30.48.71 ca -206.30.48.72 - 206.31.13.191 us -206.31.13.192 - 206.31.13.215 gb -206.31.13.216 - 206.31.22.119 us -206.31.22.120 - 206.31.22.127 ae -206.31.22.128 - 206.31.22.175 us -206.31.22.176 - 206.31.22.191 ae -206.31.22.192 - 206.31.22.255 us -206.31.23.0 - 206.31.23.15 de -206.31.23.16 - 206.31.23.31 us -206.31.23.32 - 206.31.23.47 de -206.31.23.48 - 206.31.23.111 us -206.31.23.112 - 206.31.23.119 ca -206.31.23.120 - 206.31.24.159 us -206.31.24.160 - 206.31.24.167 de -206.31.24.168 - 206.31.29.191 us -206.31.29.192 - 206.31.29.199 de -206.31.29.200 - 206.31.29.207 us -206.31.29.208 - 206.31.29.223 de -206.31.29.224 - 206.31.223.255 us +206.26.194.0 - 206.27.63.255 us +206.27.64.0 - 206.27.64.255 in +206.27.65.0 - 206.29.127.255 us +206.29.128.0 - 206.29.143.255 ca +206.29.144.0 - 206.31.223.255 us 206.31.224.0 - 206.31.227.255 sg -206.31.228.0 - 206.40.147.63 us -206.40.147.64 - 206.40.147.127 ca -206.40.147.128 - 206.41.71.255 us +206.31.228.0 - 206.32.115.255 us +206.32.116.0 - 206.32.119.255 ca +206.32.120.0 - 206.41.79.255 us 206.41.80.0 - 206.41.95.255 ca 206.41.96.0 - 206.41.103.255 us -206.41.112.0 - 206.41.117.135 us -206.41.117.136 - 206.41.117.151 lb -206.41.117.152 - 206.41.117.159 us -206.41.117.160 - 206.41.117.167 my -206.41.117.168 - 206.41.118.21 us -206.41.118.22 - 206.41.118.37 gb -206.41.118.38 - 206.41.118.45 us -206.41.118.46 - 206.41.118.53 gr -206.41.118.54 - 206.41.118.85 us -206.41.118.86 - 206.41.118.101 ru -206.41.118.102 - 206.41.118.109 us -206.41.118.110 - 206.41.118.133 il -206.41.118.134 - 206.41.118.166 us -206.41.118.167 - 206.41.118.182 gb -206.41.118.183 - 206.41.118.191 us -206.41.118.192 - 206.41.118.223 id -206.41.118.224 - 206.41.118.239 jp -206.41.118.240 - 206.41.118.255 us -206.41.119.0 - 206.41.119.31 ca -206.41.119.32 - 206.41.119.47 jp -206.41.119.48 - 206.41.119.151 us -206.41.119.152 - 206.41.119.175 gb -206.41.119.176 - 206.41.119.223 us -206.41.119.224 - 206.41.119.247 id -206.41.119.248 - 206.41.119.255 gb -206.41.120.0 - 206.44.255.255 us +206.41.104.0 - 206.41.104.255 ca +206.41.105.0 - 206.41.106.255 us +206.41.107.0 - 206.41.107.255 jm +206.41.108.0 - 206.41.110.255 us +206.41.111.0 - 206.41.111.255 ca +206.41.112.0 - 206.44.255.255 us 206.45.0.0 - 206.45.255.255 ca 206.46.0.0 - 206.46.255.255 us 206.47.0.0 - 206.47.255.255 ca @@ -128798,9 +105897,7 @@ 206.48.28.0 - 206.48.48.255 us 206.48.49.0 - 206.48.49.255 ve 206.48.50.0 - 206.48.55.255 us -206.48.56.0 - 206.48.56.63 ag -206.48.56.64 - 206.48.56.95 kn -206.48.56.96 - 206.48.58.255 ag +206.48.56.0 - 206.48.58.255 ag 206.48.59.0 - 206.48.59.255 ai 206.48.60.0 - 206.48.60.255 ag 206.48.61.0 - 206.48.61.255 dm @@ -128809,19 +105906,23 @@ 206.48.84.0 - 206.48.87.255 cl 206.48.88.0 - 206.48.99.255 us 206.48.100.0 - 206.48.103.255 aw -206.48.104.0 - 206.48.128.255 us -206.48.129.0 - 206.48.129.63 cl -206.48.129.64 - 206.48.129.127 us -206.48.129.128 - 206.48.132.255 cl +206.48.104.0 - 206.48.129.255 us +206.48.130.0 - 206.48.132.255 cl 206.48.133.0 - 206.48.138.255 us 206.48.139.0 - 206.48.139.255 cl 206.48.140.0 - 206.48.147.255 us 206.48.148.0 - 206.48.149.255 cl 206.48.150.0 - 206.48.167.255 us 206.48.168.0 - 206.48.171.255 kr -206.48.172.0 - 206.48.235.255 us -206.48.236.0 - 206.48.236.47 mx -206.48.236.48 - 206.48.236.127 us +206.48.172.0 - 206.48.227.255 us +206.48.228.0 - 206.48.228.255 ky +206.48.229.0 - 206.48.229.255 us +206.48.230.0 - 206.48.230.38 ky +206.48.230.39 - 206.48.230.39 us +206.48.230.40 - 206.48.231.255 ky +206.48.232.0 - 206.48.235.255 us +206.48.236.0 - 206.48.236.31 mx +206.48.236.32 - 206.48.236.127 us 206.48.236.128 - 206.48.236.255 mx 206.48.237.0 - 206.49.31.255 us 206.49.32.0 - 206.49.32.255 ve @@ -128830,14 +105931,7 @@ 206.49.38.0 - 206.49.39.255 co 206.49.40.0 - 206.49.43.255 cl 206.49.44.0 - 206.49.47.255 ve -206.49.48.0 - 206.49.49.255 cl -206.49.50.0 - 206.49.51.255 us -206.49.52.0 - 206.49.53.255 mx -206.49.54.0 - 206.49.57.255 pa -206.49.58.0 - 206.49.59.255 us -206.49.60.0 - 206.49.61.255 pw -206.49.62.0 - 206.49.62.255 mr -206.49.63.0 - 206.49.64.255 us +206.49.48.0 - 206.49.64.255 us 206.49.65.0 - 206.49.65.255 ca 206.49.66.0 - 206.49.68.255 us 206.49.69.0 - 206.49.69.255 ve @@ -128869,18 +105963,16 @@ 206.49.97.0 - 206.49.97.255 by 206.49.98.0 - 206.49.98.255 ve 206.49.99.0 - 206.49.99.255 br -206.49.100.0 - 206.49.100.79 ca -206.49.100.80 - 206.49.100.95 us -206.49.100.96 - 206.49.100.231 ca -206.49.100.232 - 206.49.100.239 us -206.49.100.240 - 206.49.100.255 ca +206.49.100.0 - 206.49.100.255 ca 206.49.101.0 - 206.49.102.255 om 206.49.103.0 - 206.49.108.255 us 206.49.109.0 - 206.49.109.255 om 206.49.110.0 - 206.49.111.255 us 206.49.112.0 - 206.49.112.255 lk 206.49.113.0 - 206.49.113.255 us -206.49.114.0 - 206.49.118.255 pr +206.49.114.0 - 206.49.115.255 pr +206.49.116.0 - 206.49.116.255 us +206.49.117.0 - 206.49.118.255 pr 206.49.119.0 - 206.49.119.255 ag 206.49.120.0 - 206.49.120.255 co 206.49.121.0 - 206.49.121.255 bw @@ -128905,15 +105997,7 @@ 206.49.184.0 - 206.49.191.255 ar 206.49.192.0 - 206.49.192.255 ve 206.49.193.0 - 206.49.193.255 us -206.49.194.0 - 206.49.194.31 ve -206.49.194.32 - 206.49.194.111 vn -206.49.194.112 - 206.49.194.127 ve -206.49.194.128 - 206.49.194.223 vn -206.49.194.224 - 206.49.195.255 ve -206.49.196.0 - 206.49.196.63 vn -206.49.196.64 - 206.49.196.127 ve -206.49.196.128 - 206.49.196.159 vn -206.49.196.160 - 206.49.198.255 ve +206.49.194.0 - 206.49.198.255 ve 206.49.199.0 - 206.49.199.255 us 206.49.200.0 - 206.49.207.255 mx 206.49.208.0 - 206.49.215.255 pe @@ -128931,146 +106015,59 @@ 206.51.31.0 - 206.51.32.255 ca 206.51.33.0 - 206.51.33.255 us 206.51.34.0 - 206.51.34.255 ca -206.51.35.0 - 206.51.35.255 pr -206.51.36.0 - 206.51.247.255 us +206.51.35.0 - 206.51.247.255 us 206.51.248.0 - 206.51.253.255 ca 206.51.254.0 - 206.53.47.255 us 206.53.48.0 - 206.53.63.255 ca -206.53.64.0 - 206.53.167.255 us +206.53.64.0 - 206.53.139.255 us +206.53.140.0 - 206.53.140.255 ca +206.53.141.0 - 206.53.141.255 dm +206.53.142.0 - 206.53.143.255 us +206.53.144.0 - 206.53.147.255 ca +206.53.148.0 - 206.53.148.207 ap +206.53.148.208 - 206.53.148.208 id +206.53.148.209 - 206.53.148.255 ap +206.53.149.0 - 206.53.151.255 ca +206.53.152.0 - 206.53.152.255 ap +206.53.153.0 - 206.53.159.255 ca +206.53.160.0 - 206.53.175.255 us 206.53.176.0 - 206.53.191.255 bm -206.53.192.0 - 206.55.79.255 us +206.53.192.0 - 206.54.159.255 us +206.54.160.0 - 206.54.168.31 nl +206.54.168.32 - 206.54.170.255 us +206.54.171.0 - 206.54.171.255 nl +206.54.172.0 - 206.55.79.255 us 206.55.80.0 - 206.55.95.255 ca 206.55.96.0 - 206.55.134.255 us 206.55.135.0 - 206.55.135.255 it -206.55.136.0 - 206.57.32.191 us -206.57.32.192 - 206.57.32.255 ca -206.57.33.0 - 206.57.42.191 us -206.57.42.192 - 206.57.42.207 ca -206.57.42.208 - 206.57.124.15 us -206.57.124.16 - 206.57.124.31 it -206.57.124.32 - 206.61.1.255 us +206.55.136.0 - 206.57.26.255 us +206.57.27.0 - 206.57.27.255 fr +206.57.28.0 - 206.57.125.255 us +206.57.126.0 - 206.57.126.255 gb +206.57.127.0 - 206.61.1.255 us 206.61.2.0 - 206.61.3.255 mx -206.61.4.0 - 206.61.18.95 us -206.61.18.96 - 206.61.18.103 fi -206.61.18.104 - 206.61.29.255 us -206.61.30.0 - 206.61.30.15 ca -206.61.30.16 - 206.61.34.143 us -206.61.34.144 - 206.61.34.151 pr -206.61.34.152 - 206.61.39.255 us +206.61.4.0 - 206.61.39.255 us 206.61.40.0 - 206.61.47.255 sr 206.61.48.0 - 206.61.223.255 us 206.61.224.0 - 206.61.239.255 pr 206.61.240.0 - 206.65.31.255 us 206.65.32.0 - 206.65.35.255 mx -206.65.36.0 - 206.66.84.255 us +206.65.36.0 - 206.65.175.13 us +206.65.175.14 - 206.65.175.14 eu +206.65.175.15 - 206.66.84.255 us 206.66.85.0 - 206.66.85.255 bs 206.66.86.0 - 206.67.39.255 us 206.67.40.0 - 206.67.40.255 mx -206.67.41.0 - 206.71.159.255 us -206.71.160.0 - 206.71.191.255 a1 -206.71.192.0 - 206.72.114.167 us -206.72.114.168 - 206.72.114.175 ca -206.72.114.176 - 206.72.116.47 us -206.72.116.48 - 206.72.116.63 ve -206.72.116.64 - 206.72.116.127 us -206.72.116.128 - 206.72.116.159 gb -206.72.116.160 - 206.72.116.231 us -206.72.116.232 - 206.72.116.247 au -206.72.116.248 - 206.72.117.155 us -206.72.117.156 - 206.72.117.159 au -206.72.117.160 - 206.72.117.207 us -206.72.117.208 - 206.72.117.215 au -206.72.117.216 - 206.72.117.223 ve -206.72.117.224 - 206.72.117.231 us -206.72.117.232 - 206.72.117.239 gb -206.72.117.240 - 206.72.117.247 ca -206.72.117.248 - 206.72.118.15 us -206.72.118.16 - 206.72.118.23 nl -206.72.118.24 - 206.72.118.167 us -206.72.118.168 - 206.72.118.175 sa -206.72.118.176 - 206.72.118.199 us -206.72.118.200 - 206.72.118.207 ca -206.72.118.208 - 206.72.118.239 us -206.72.118.240 - 206.72.118.247 mx -206.72.118.248 - 206.72.118.255 au -206.72.119.0 - 206.72.119.79 us -206.72.119.80 - 206.72.119.95 ca -206.72.119.96 - 206.72.119.151 us -206.72.119.152 - 206.72.119.159 au -206.72.119.160 - 206.72.119.191 us -206.72.119.192 - 206.72.119.223 ca -206.72.119.224 - 206.72.119.255 us -206.72.120.0 - 206.72.120.7 gb -206.72.120.8 - 206.72.120.47 us -206.72.120.48 - 206.72.120.55 gb -206.72.120.56 - 206.72.120.63 us -206.72.120.64 - 206.72.120.71 gb -206.72.120.72 - 206.72.120.79 gu -206.72.120.80 - 206.72.120.183 us -206.72.120.184 - 206.72.120.191 gb -206.72.120.192 - 206.72.120.199 us -206.72.120.200 - 206.72.120.207 ca -206.72.120.208 - 206.72.121.55 us -206.72.121.56 - 206.72.121.63 gb -206.72.121.64 - 206.72.121.71 jp -206.72.121.72 - 206.72.121.127 us -206.72.121.128 - 206.72.121.135 za -206.72.121.136 - 206.72.121.151 us -206.72.121.152 - 206.72.121.159 gb -206.72.121.160 - 206.72.121.223 us -206.72.121.224 - 206.72.121.231 in -206.72.121.232 - 206.72.122.31 us -206.72.122.32 - 206.72.122.35 tz -206.72.122.36 - 206.72.122.63 us -206.72.122.64 - 206.72.122.79 gb -206.72.122.80 - 206.72.122.127 us -206.72.122.128 - 206.72.122.175 gb -206.72.122.176 - 206.72.122.239 us -206.72.122.240 - 206.72.122.255 ca -206.72.123.0 - 206.72.123.47 us -206.72.123.48 - 206.72.123.63 nz -206.72.123.64 - 206.72.123.239 us -206.72.123.240 - 206.72.123.255 nz -206.72.124.0 - 206.72.124.223 us -206.72.124.224 - 206.72.124.255 nz -206.72.125.0 - 206.72.125.63 us -206.72.125.64 - 206.72.125.95 ca -206.72.125.96 - 206.72.125.255 us -206.72.126.0 - 206.72.126.15 ca -206.72.126.16 - 206.72.126.23 us -206.72.126.24 - 206.72.126.31 pl -206.72.126.32 - 206.72.126.39 gb -206.72.126.40 - 206.72.126.87 us -206.72.126.88 - 206.72.126.95 ve -206.72.126.96 - 206.72.126.119 us -206.72.126.120 - 206.72.126.127 gb -206.72.126.128 - 206.72.126.255 us -206.72.127.0 - 206.72.127.255 au -206.72.128.0 - 206.73.1.255 us -206.73.2.0 - 206.73.2.63 cl -206.73.2.64 - 206.73.5.63 us -206.73.5.64 - 206.73.5.95 br -206.73.5.96 - 206.73.5.127 co -206.73.5.128 - 206.73.5.191 ve -206.73.5.192 - 206.73.5.223 br -206.73.5.224 - 206.73.5.255 us -206.73.6.0 - 206.73.6.63 fr -206.73.6.64 - 206.73.6.111 br -206.73.6.112 - 206.73.6.127 us -206.73.6.128 - 206.73.6.255 fr -206.73.7.0 - 206.73.10.255 us +206.67.41.0 - 206.71.161.255 us +206.71.162.0 - 206.71.162.255 a1 +206.71.163.0 - 206.72.207.255 us +206.72.208.0 - 206.72.208.255 ca +206.72.209.0 - 206.72.215.255 us +206.72.224.0 - 206.73.10.255 us 206.73.11.0 - 206.73.11.255 it -206.73.12.0 - 206.73.14.15 us -206.73.14.16 - 206.73.14.31 mx -206.73.14.32 - 206.73.14.127 us -206.73.14.128 - 206.73.14.159 mx -206.73.14.160 - 206.73.14.255 us +206.73.12.0 - 206.73.14.255 us 206.73.15.0 - 206.73.15.255 jp -206.73.16.0 - 206.73.16.15 nl -206.73.16.16 - 206.73.16.31 ca -206.73.16.32 - 206.73.16.63 us -206.73.16.64 - 206.73.16.255 nl -206.73.17.0 - 206.73.17.255 dk +206.73.16.0 - 206.73.17.255 us 206.73.18.0 - 206.73.18.255 be 206.73.19.0 - 206.73.21.255 us 206.73.22.0 - 206.73.22.255 za @@ -129079,129 +106076,38 @@ 206.73.25.0 - 206.73.25.255 gb 206.73.26.0 - 206.73.33.255 us 206.73.34.0 - 206.73.34.255 za -206.73.35.0 - 206.73.38.255 us -206.73.39.0 - 206.73.39.63 pe -206.73.39.64 - 206.73.39.127 us -206.73.39.128 - 206.73.39.191 pr -206.73.39.192 - 206.73.39.223 ec -206.73.39.224 - 206.73.41.255 us +206.73.35.0 - 206.73.41.255 us 206.73.42.0 - 206.73.42.255 se -206.73.43.0 - 206.73.44.255 us -206.73.45.0 - 206.73.45.127 in -206.73.45.128 - 206.73.49.47 us -206.73.49.48 - 206.73.49.63 ar -206.73.49.64 - 206.73.49.71 br -206.73.49.72 - 206.73.49.95 us -206.73.49.96 - 206.73.49.127 ve -206.73.49.128 - 206.73.49.191 us -206.73.49.192 - 206.73.49.255 mx -206.73.50.0 - 206.73.51.127 us -206.73.51.128 - 206.73.51.191 bo -206.73.51.192 - 206.73.51.255 us -206.73.52.0 - 206.73.52.127 ve -206.73.52.128 - 206.73.52.143 mx -206.73.52.144 - 206.73.52.255 us -206.73.53.0 - 206.73.53.31 fi -206.73.53.32 - 206.73.53.63 us -206.73.53.64 - 206.73.53.127 de -206.73.53.128 - 206.73.53.255 us -206.73.54.0 - 206.73.54.31 fi -206.73.54.32 - 206.73.54.143 us -206.73.54.144 - 206.73.54.159 ca -206.73.54.160 - 206.73.54.191 us -206.73.54.192 - 206.73.54.255 br -206.73.55.0 - 206.73.55.31 us -206.73.55.32 - 206.73.55.47 ca -206.73.55.48 - 206.73.57.39 us -206.73.57.40 - 206.73.57.47 mx -206.73.57.48 - 206.73.57.79 us -206.73.57.80 - 206.73.57.95 br -206.73.57.96 - 206.73.57.191 us -206.73.57.192 - 206.73.57.255 br -206.73.58.0 - 206.73.59.15 us -206.73.59.16 - 206.73.59.31 br -206.73.59.32 - 206.73.59.63 us -206.73.59.64 - 206.73.59.95 br -206.73.59.96 - 206.73.60.63 us -206.73.60.64 - 206.73.60.95 id -206.73.60.96 - 206.73.60.127 cn -206.73.60.128 - 206.73.60.159 hk -206.73.60.160 - 206.73.61.255 us -206.73.62.0 - 206.73.62.63 id -206.73.62.64 - 206.73.64.255 us +206.73.43.0 - 206.73.64.255 us 206.73.65.0 - 206.73.65.255 sg -206.73.66.0 - 206.73.68.127 us -206.73.68.128 - 206.73.68.159 cn -206.73.68.160 - 206.73.68.255 us +206.73.66.0 - 206.73.68.255 us 206.73.69.0 - 206.73.69.255 fi 206.73.70.0 - 206.73.70.255 us 206.73.71.0 - 206.73.76.255 ie 206.73.77.0 - 206.73.77.255 us 206.73.78.0 - 206.73.78.255 ie -206.73.79.0 - 206.73.80.63 us -206.73.80.64 - 206.73.80.95 id -206.73.80.96 - 206.73.83.255 us +206.73.79.0 - 206.73.83.255 us 206.73.84.0 - 206.73.84.255 it 206.73.85.0 - 206.73.85.255 fr 206.73.86.0 - 206.73.86.255 es -206.73.87.0 - 206.73.88.255 us -206.73.89.0 - 206.73.89.31 fr -206.73.89.32 - 206.73.89.63 us -206.73.89.64 - 206.73.89.255 fr -206.73.90.0 - 206.73.91.31 us -206.73.91.32 - 206.73.91.95 cn -206.73.91.96 - 206.73.91.127 us -206.73.91.128 - 206.73.91.191 de -206.73.91.192 - 206.73.99.255 us +206.73.87.0 - 206.73.99.255 us 206.73.100.0 - 206.73.100.255 ch 206.73.101.0 - 206.73.101.255 gb 206.73.102.0 - 206.73.102.255 ar -206.73.103.0 - 206.73.103.31 ca -206.73.103.32 - 206.73.103.143 us -206.73.103.144 - 206.73.103.159 mx -206.73.103.160 - 206.73.103.191 pr -206.73.103.192 - 206.73.104.31 us -206.73.104.32 - 206.73.104.63 ca -206.73.104.64 - 206.73.104.95 us -206.73.104.96 - 206.73.104.111 ca -206.73.104.112 - 206.73.104.175 us -206.73.104.176 - 206.73.104.191 mx -206.73.104.192 - 206.73.105.255 us +206.73.103.0 - 206.73.105.255 us 206.73.106.0 - 206.73.106.255 ca -206.73.107.0 - 206.73.107.191 us -206.73.107.192 - 206.73.107.223 ar -206.73.107.224 - 206.73.107.255 us +206.73.107.0 - 206.73.107.255 us 206.73.108.0 - 206.73.108.255 nl -206.73.109.0 - 206.73.109.159 us -206.73.109.160 - 206.73.109.191 mx -206.73.109.192 - 206.73.109.255 us +206.73.109.0 - 206.73.109.255 us 206.73.110.0 - 206.73.110.255 jp 206.73.111.0 - 206.73.111.255 nl -206.73.112.0 - 206.73.112.239 us -206.73.112.240 - 206.73.112.247 ar -206.73.112.248 - 206.73.112.255 co -206.73.113.0 - 206.73.115.255 us +206.73.112.0 - 206.73.115.255 us 206.73.116.0 - 206.73.116.255 it 206.73.117.0 - 206.73.117.255 be 206.73.118.0 - 206.73.119.255 us 206.73.120.0 - 206.73.120.255 de 206.73.121.0 - 206.73.121.255 au -206.73.122.0 - 206.73.127.255 us -206.73.128.0 - 206.73.128.255 mx -206.73.129.0 - 206.73.129.31 us -206.73.129.32 - 206.73.129.63 fr -206.73.129.64 - 206.73.129.95 de -206.73.129.96 - 206.73.129.127 ch -206.73.129.128 - 206.73.129.159 se -206.73.129.160 - 206.73.129.191 gb -206.73.129.192 - 206.73.129.223 at -206.73.129.224 - 206.73.130.255 us -206.73.131.0 - 206.73.131.15 gb -206.73.131.16 - 206.73.131.63 us -206.73.131.64 - 206.73.131.127 gb -206.73.131.128 - 206.73.131.255 de -206.73.132.0 - 206.73.132.191 gb -206.73.132.192 - 206.73.132.255 us +206.73.122.0 - 206.73.132.255 us 206.73.133.0 - 206.73.134.255 gb 206.73.135.0 - 206.73.136.255 us 206.73.137.0 - 206.73.137.255 es @@ -129209,41 +106115,24 @@ 206.73.139.0 - 206.73.139.255 gb 206.73.140.0 - 206.73.140.255 us 206.73.141.0 - 206.73.141.255 de -206.73.142.0 - 206.73.142.127 us -206.73.142.128 - 206.73.142.255 es +206.73.142.0 - 206.73.142.255 us 206.73.143.0 - 206.73.149.255 be 206.73.150.0 - 206.73.150.255 us 206.73.151.0 - 206.73.151.255 de 206.73.152.0 - 206.73.152.255 gb 206.73.153.0 - 206.73.153.255 dk -206.73.154.0 - 206.73.157.191 us -206.73.157.192 - 206.73.157.255 it -206.73.158.0 - 206.73.158.127 gr -206.73.158.128 - 206.73.158.175 us -206.73.158.176 - 206.73.158.255 be -206.73.159.0 - 206.73.159.255 us +206.73.154.0 - 206.73.159.255 us 206.73.160.0 - 206.73.160.255 se 206.73.161.0 - 206.73.161.255 de 206.73.162.0 - 206.73.162.255 gb 206.73.163.0 - 206.73.163.255 fr 206.73.164.0 - 206.73.164.255 us 206.73.165.0 - 206.73.165.255 gb -206.73.166.0 - 206.73.166.255 us -206.73.167.0 - 206.73.167.63 de -206.73.167.64 - 206.73.168.47 us -206.73.168.48 - 206.73.168.63 se -206.73.168.64 - 206.73.168.191 us -206.73.168.192 - 206.73.168.255 il +206.73.166.0 - 206.73.168.255 us 206.73.169.0 - 206.73.169.255 de -206.73.170.0 - 206.73.171.255 us -206.73.172.0 - 206.73.172.127 ch -206.73.172.128 - 206.73.172.255 it +206.73.170.0 - 206.73.172.255 us 206.73.173.0 - 206.73.173.255 sg -206.73.174.0 - 206.73.174.31 us -206.73.174.32 - 206.73.174.63 es -206.73.174.64 - 206.73.174.127 us -206.73.174.128 - 206.73.174.255 hu -206.73.175.0 - 206.73.175.255 fr +206.73.174.0 - 206.73.175.255 us 206.73.176.0 - 206.73.176.255 fi 206.73.177.0 - 206.73.177.255 fr 206.73.178.0 - 206.73.178.255 us @@ -129255,185 +106144,66 @@ 206.73.184.0 - 206.73.184.255 dk 206.73.185.0 - 206.73.185.255 ie 206.73.186.0 - 206.73.186.255 de -206.73.187.0 - 206.73.189.31 us -206.73.189.32 - 206.73.189.63 be -206.73.189.64 - 206.73.189.95 it -206.73.189.96 - 206.73.189.255 us +206.73.187.0 - 206.73.189.255 us 206.73.190.0 - 206.73.190.255 hk -206.73.191.0 - 206.73.191.191 us -206.73.191.192 - 206.73.191.255 ch -206.73.192.0 - 206.73.192.127 us -206.73.192.128 - 206.73.192.159 au -206.73.192.160 - 206.73.192.191 sg -206.73.192.192 - 206.73.193.255 us -206.73.194.0 - 206.73.194.63 mx -206.73.194.64 - 206.73.194.127 id -206.73.194.128 - 206.73.194.191 us -206.73.194.192 - 206.73.194.223 hk -206.73.194.224 - 206.73.194.255 th -206.73.195.0 - 206.73.195.15 us -206.73.195.16 - 206.73.195.23 gb -206.73.195.24 - 206.73.195.63 us -206.73.195.64 - 206.73.195.95 cn -206.73.195.96 - 206.73.197.255 us -206.73.198.0 - 206.73.198.63 my -206.73.198.64 - 206.73.198.127 us -206.73.198.128 - 206.73.198.255 tw +206.73.191.0 - 206.73.198.255 us 206.73.199.0 - 206.73.199.255 au 206.73.200.0 - 206.73.200.255 us 206.73.201.0 - 206.73.201.255 gb 206.73.202.0 - 206.73.205.255 us 206.73.206.0 - 206.73.206.255 id 206.73.207.0 - 206.73.207.255 hk -206.73.208.0 - 206.73.209.255 us -206.73.210.0 - 206.73.210.63 kr -206.73.210.64 - 206.73.210.95 us -206.73.210.96 - 206.73.210.127 cn -206.73.210.128 - 206.73.210.159 th -206.73.210.160 - 206.73.210.191 jp -206.73.210.192 - 206.73.211.31 kr -206.73.211.32 - 206.73.211.127 us -206.73.211.128 - 206.73.211.255 th +206.73.208.0 - 206.73.211.255 us 206.73.212.0 - 206.73.212.255 de 206.73.213.0 - 206.73.214.255 us 206.73.215.0 - 206.73.215.255 gb 206.73.216.0 - 206.73.218.255 us 206.73.219.0 - 206.73.219.255 de -206.73.220.0 - 206.73.220.31 ch -206.73.220.32 - 206.73.220.255 us -206.73.221.0 - 206.73.221.255 be +206.73.220.0 - 206.73.221.255 us 206.73.222.0 - 206.73.222.255 de 206.73.223.0 - 206.73.223.255 se -206.73.224.0 - 206.73.224.127 us -206.73.224.128 - 206.73.224.191 kr -206.73.224.192 - 206.73.226.255 us -206.73.227.0 - 206.73.227.63 ph -206.73.227.64 - 206.73.227.127 cn -206.73.227.128 - 206.73.227.191 us -206.73.227.192 - 206.73.227.223 id -206.73.227.224 - 206.73.228.31 us -206.73.228.32 - 206.73.228.63 jp -206.73.228.64 - 206.73.228.191 id -206.73.228.192 - 206.73.232.255 us +206.73.224.0 - 206.73.232.255 us 206.73.233.0 - 206.73.233.255 de -206.73.234.0 - 206.73.234.31 hk -206.73.234.32 - 206.73.234.143 us -206.73.234.144 - 206.73.234.159 jp -206.73.234.160 - 206.73.235.207 us -206.73.235.208 - 206.73.235.223 jp -206.73.235.224 - 206.73.236.255 us +206.73.234.0 - 206.73.236.255 us 206.73.237.0 - 206.73.237.255 gb -206.73.238.0 - 206.73.238.7 jp -206.73.238.8 - 206.73.238.15 us -206.73.238.16 - 206.73.238.31 hk -206.73.238.32 - 206.73.238.191 us -206.73.238.192 - 206.73.238.199 hk -206.73.238.200 - 206.73.238.207 id -206.73.238.208 - 206.73.239.15 us -206.73.239.16 - 206.73.239.23 ca -206.73.239.24 - 206.73.239.47 us -206.73.239.48 - 206.73.239.63 jp -206.73.239.64 - 206.73.239.79 ch -206.73.239.80 - 206.73.239.127 us -206.73.239.128 - 206.73.239.143 mx -206.73.239.144 - 206.73.239.199 us -206.73.239.200 - 206.73.239.207 ca -206.73.239.208 - 206.73.240.191 us -206.73.240.192 - 206.73.240.223 ca -206.73.240.224 - 206.73.240.255 us +206.73.238.0 - 206.73.240.255 us 206.73.241.0 - 206.73.241.255 gb 206.73.242.0 - 206.73.242.255 es -206.73.243.0 - 206.73.243.63 us -206.73.243.64 - 206.73.243.95 br -206.73.243.96 - 206.73.243.127 us -206.73.243.128 - 206.73.243.191 ca -206.73.243.192 - 206.73.244.23 us -206.73.244.24 - 206.73.244.31 tw -206.73.244.32 - 206.73.244.47 mx -206.73.244.48 - 206.73.244.63 us -206.73.244.64 - 206.73.244.79 th -206.73.244.80 - 206.73.244.95 jp -206.73.244.96 - 206.73.244.111 mx -206.73.244.112 - 206.73.244.143 us -206.73.244.144 - 206.73.244.159 id -206.73.244.160 - 206.73.244.191 us -206.73.244.192 - 206.73.244.255 ca -206.73.245.0 - 206.73.245.255 us -206.73.246.0 - 206.73.246.15 br -206.73.246.16 - 206.73.246.23 us -206.73.246.24 - 206.73.246.31 sg -206.73.246.32 - 206.73.246.47 cn -206.73.246.48 - 206.73.246.63 sg -206.73.246.64 - 206.73.246.127 us -206.73.246.128 - 206.73.246.255 hk +206.73.243.0 - 206.73.246.255 us 206.73.247.0 - 206.73.247.255 gb -206.73.248.0 - 206.73.248.79 us -206.73.248.80 - 206.73.248.95 sg -206.73.248.96 - 206.73.248.255 us -206.73.249.0 - 206.73.249.63 do -206.73.249.64 - 206.73.249.95 us -206.73.249.96 - 206.73.249.111 my -206.73.249.112 - 206.73.249.159 us -206.73.249.160 - 206.73.249.191 kr -206.73.249.192 - 206.73.249.255 us +206.73.248.0 - 206.73.249.255 us 206.73.250.0 - 206.73.250.255 de 206.73.251.0 - 206.73.251.255 lu -206.73.252.0 - 206.73.252.255 us -206.73.253.0 - 206.73.253.31 jp -206.73.253.32 - 206.73.253.63 us -206.73.253.64 - 206.73.253.95 br -206.73.253.96 - 206.73.253.127 co -206.73.253.128 - 206.73.253.191 br -206.73.253.192 - 206.74.255.255 us +206.73.252.0 - 206.74.255.255 us 206.75.0.0 - 206.75.39.255 ca 206.75.40.0 - 206.75.40.255 us 206.75.41.0 - 206.75.255.255 ca -206.76.0.0 - 206.79.7.255 us -206.79.8.0 - 206.79.8.87 gb -206.79.8.88 - 206.79.8.255 us -206.79.9.0 - 206.79.9.191 fr -206.79.9.192 - 206.79.9.255 us -206.79.10.0 - 206.79.10.63 fr -206.79.10.64 - 206.79.10.71 gb -206.79.10.72 - 206.79.10.103 us -206.79.10.104 - 206.79.10.111 gb -206.79.10.112 - 206.79.10.119 us -206.79.10.120 - 206.79.10.143 gb -206.79.10.144 - 206.79.183.255 us +206.76.0.0 - 206.79.183.255 us 206.79.184.0 - 206.79.184.255 sg -206.79.185.0 - 206.79.185.47 us -206.79.185.48 - 206.79.185.63 sg -206.79.185.64 - 206.79.185.95 us -206.79.185.96 - 206.79.185.111 sg -206.79.185.112 - 206.79.185.127 us -206.79.185.128 - 206.79.186.95 sg -206.79.186.96 - 206.79.186.111 us -206.79.186.112 - 206.79.186.127 sg -206.79.186.128 - 206.79.186.255 us +206.79.185.0 - 206.79.186.255 us 206.79.187.0 - 206.79.187.255 sg 206.79.188.0 - 206.79.188.255 us -206.79.189.0 - 206.79.190.79 sg -206.79.190.80 - 206.79.190.255 us +206.79.189.0 - 206.79.189.255 sg +206.79.190.0 - 206.79.190.255 us 206.79.191.0 - 206.79.191.255 sg -206.79.192.0 - 206.80.231.255 us +206.79.192.0 - 206.80.27.255 us +206.80.28.0 - 206.80.31.255 as +206.80.32.0 - 206.80.231.255 us 206.80.240.0 - 206.80.255.255 ca -206.81.0.0 - 206.82.127.255 us -206.82.128.0 - 206.82.129.255 ca +206.81.0.0 - 206.81.183.255 us +206.81.184.0 - 206.81.184.255 au +206.81.185.0 - 206.81.185.255 nl +206.81.186.0 - 206.81.186.255 us +206.81.187.0 - 206.81.187.255 sg +206.81.188.0 - 206.82.129.255 us 206.82.130.0 - 206.82.130.255 bf -206.82.131.0 - 206.82.132.255 ca +206.82.131.0 - 206.82.132.255 us 206.82.133.0 - 206.82.133.255 qa -206.82.134.0 - 206.82.139.255 ca +206.82.134.0 - 206.82.137.255 us +206.82.138.0 - 206.82.138.255 ca +206.82.139.0 - 206.82.139.255 us 206.82.140.0 - 206.82.140.255 il -206.82.141.0 - 206.82.142.255 ca -206.82.143.0 - 206.82.203.191 us -206.82.203.192 - 206.82.203.207 ca -206.82.203.208 - 206.83.31.255 us -206.83.32.0 - 206.83.39.255 ca -206.83.48.0 - 206.83.202.191 us -206.83.202.192 - 206.83.202.255 co -206.83.203.0 - 206.83.203.63 us -206.83.203.64 - 206.83.203.127 co -206.83.203.128 - 206.86.255.255 us +206.82.141.0 - 206.86.255.255 us 206.87.0.0 - 206.87.255.255 ca 206.88.0.0 - 206.88.93.255 us 206.88.94.0 - 206.88.94.255 ca @@ -129459,21 +106229,15 @@ 206.89.129.0 - 206.89.129.255 ca 206.89.130.0 - 206.89.150.255 us 206.89.151.0 - 206.89.151.255 ca -206.89.152.0 - 206.89.177.255 us -206.89.178.0 - 206.89.178.255 ca -206.89.179.0 - 206.89.208.255 us +206.89.152.0 - 206.89.208.255 us 206.89.209.0 - 206.89.209.255 ca -206.89.210.0 - 206.89.236.255 us -206.89.237.0 - 206.89.237.255 pr -206.89.238.0 - 206.89.240.255 us +206.89.210.0 - 206.89.240.255 us 206.89.241.0 - 206.89.241.255 ca 206.89.242.0 - 206.89.244.255 us 206.89.245.0 - 206.89.246.255 ca 206.89.247.0 - 206.92.49.255 us 206.92.50.0 - 206.92.50.255 ca -206.92.51.0 - 206.92.97.255 us -206.92.98.0 - 206.92.98.255 pr -206.92.99.0 - 206.92.109.255 us +206.92.51.0 - 206.92.109.255 us 206.92.110.0 - 206.92.110.255 ca 206.92.111.0 - 206.92.126.255 us 206.92.127.0 - 206.92.127.255 ca @@ -129490,10 +106254,8 @@ 206.92.152.0 - 206.92.171.255 us 206.92.172.0 - 206.92.172.255 ca 206.92.173.0 - 206.92.177.255 us -206.92.178.0 - 206.92.180.255 ca -206.92.181.0 - 206.92.218.255 us -206.92.219.0 - 206.92.219.255 pr -206.92.220.0 - 206.92.227.255 us +206.92.178.0 - 206.92.179.255 ca +206.92.180.0 - 206.92.227.255 us 206.92.228.0 - 206.92.228.255 ca 206.92.229.0 - 206.93.115.255 us 206.93.116.0 - 206.93.116.255 ca @@ -129501,9 +106263,7 @@ 206.93.119.0 - 206.93.119.255 ca 206.93.120.0 - 206.94.5.255 us 206.94.6.0 - 206.94.6.255 ca -206.94.7.0 - 206.94.38.255 us -206.94.39.0 - 206.94.39.255 ca -206.94.40.0 - 206.94.90.255 us +206.94.7.0 - 206.94.90.255 us 206.94.91.0 - 206.94.91.255 ca 206.94.92.0 - 206.94.184.255 us 206.94.185.0 - 206.94.185.255 ca @@ -129519,32 +106279,23 @@ 206.95.32.0 - 206.95.32.255 ca 206.95.33.0 - 206.95.71.255 us 206.95.72.0 - 206.95.72.255 ca -206.95.73.0 - 206.98.164.87 us -206.98.164.88 - 206.98.164.95 ca -206.98.164.96 - 206.98.166.143 us -206.98.166.144 - 206.98.166.151 ca -206.98.166.152 - 206.98.252.255 us +206.95.73.0 - 206.98.252.255 us 206.98.253.0 - 206.98.255.255 gn 206.99.0.0 - 206.99.151.255 us 206.99.152.0 - 206.99.152.255 sg -206.99.153.0 - 206.99.153.71 bv -206.99.153.72 - 206.99.153.95 us +206.99.153.0 - 206.99.153.95 us 206.99.153.96 - 206.99.153.127 sg 206.99.153.128 - 206.99.153.255 us 206.99.154.0 - 206.99.154.255 sg -206.99.155.0 - 206.99.155.7 us -206.99.155.8 - 206.99.155.31 sg -206.99.155.32 - 206.99.155.127 ae -206.99.155.128 - 206.99.155.255 sg -206.99.156.0 - 206.99.156.255 us +206.99.155.0 - 206.99.156.255 us 206.99.157.0 - 206.99.157.255 sg 206.99.158.0 - 206.99.158.255 us 206.99.159.0 - 206.99.159.255 sg -206.99.160.0 - 206.103.128.7 us -206.103.128.8 - 206.103.128.15 gb -206.103.128.16 - 206.105.13.79 us -206.105.13.80 - 206.105.13.87 ca -206.105.13.88 - 206.105.63.255 us +206.99.160.0 - 206.100.0.199 us +206.100.0.200 - 206.100.0.207 gb +206.100.0.208 - 206.100.4.255 us +206.100.5.0 - 206.100.5.255 sg +206.100.6.0 - 206.105.63.255 us 206.105.64.0 - 206.105.71.255 co 206.105.72.0 - 206.105.173.255 us 206.105.174.0 - 206.105.175.255 pr @@ -129556,34 +106307,19 @@ 206.106.248.0 - 206.106.255.255 co 206.107.0.0 - 206.107.147.255 us 206.107.148.0 - 206.107.151.255 bo -206.107.152.0 - 206.107.223.255 us -206.107.224.0 - 206.107.225.255 an +206.107.152.0 - 206.107.224.255 us +206.107.225.0 - 206.107.225.255 cw 206.107.226.0 - 206.107.255.255 us 206.108.0.0 - 206.108.39.255 ca 206.108.40.0 - 206.108.55.255 us 206.108.56.0 - 206.108.112.255 ca -206.108.113.0 - 206.108.113.255 us -206.108.116.0 - 206.108.119.255 us -206.108.120.0 - 206.108.175.143 ca -206.108.175.144 - 206.108.175.151 us -206.108.175.152 - 206.108.231.255 ca -206.108.232.0 - 206.108.235.255 us -206.108.236.0 - 206.108.255.255 ca -206.109.0.0 - 206.112.130.255 us -206.112.131.0 - 206.112.131.255 ca -206.112.132.0 - 206.112.217.255 us -206.112.218.0 - 206.112.218.63 gb -206.112.218.64 - 206.113.23.255 us +206.108.113.0 - 206.108.119.255 us +206.108.120.0 - 206.108.231.255 ca +206.108.232.0 - 206.108.236.255 us +206.108.237.0 - 206.108.254.255 ca +206.108.255.0 - 206.113.23.255 us 206.113.24.0 - 206.113.31.255 nl -206.113.32.0 - 206.114.23.79 us -206.114.23.80 - 206.114.23.95 um -206.114.23.96 - 206.114.97.255 us -206.114.98.0 - 206.114.98.255 ph -206.114.99.0 - 206.114.213.255 us -206.114.214.0 - 206.114.214.7 ca -206.114.214.8 - 206.114.214.15 us -206.114.214.16 - 206.114.214.31 ca -206.114.214.32 - 206.115.255.255 us +206.113.32.0 - 206.115.255.255 us 206.116.0.0 - 206.116.255.255 ca 206.117.0.0 - 206.122.23.255 us 206.122.24.0 - 206.122.24.255 de @@ -129592,237 +106328,202 @@ 206.122.103.0 - 206.122.107.255 us 206.122.108.0 - 206.122.109.255 de 206.122.110.0 - 206.123.0.255 us -206.123.1.0 - 206.123.16.255 ca +206.123.1.0 - 206.123.6.255 ca +206.123.7.0 - 206.123.7.255 us +206.123.8.0 - 206.123.16.255 ca 206.123.17.0 - 206.123.17.255 us -206.123.18.0 - 206.123.51.255 ca -206.123.52.0 - 206.123.66.167 us -206.123.66.168 - 206.123.66.175 gb -206.123.66.176 - 206.123.66.191 ca -206.123.66.192 - 206.123.71.159 us -206.123.71.160 - 206.123.71.191 pr -206.123.71.192 - 206.123.89.255 us -206.123.90.0 - 206.123.90.255 ca -206.123.91.0 - 206.123.95.31 us -206.123.95.32 - 206.123.95.39 es -206.123.95.40 - 206.123.95.55 us -206.123.95.56 - 206.123.95.63 af -206.123.95.64 - 206.123.95.71 us -206.123.95.72 - 206.123.95.79 ca -206.123.95.80 - 206.123.95.167 us -206.123.95.168 - 206.123.95.175 es -206.123.95.176 - 206.123.95.183 sg -206.123.95.184 - 206.123.109.215 us -206.123.109.216 - 206.123.109.223 it -206.123.109.224 - 206.123.111.47 us -206.123.111.48 - 206.123.111.55 pr -206.123.111.56 - 206.123.111.103 us -206.123.111.104 - 206.123.111.111 au -206.123.111.112 - 206.123.111.119 it -206.123.111.120 - 206.123.112.55 us -206.123.112.56 - 206.123.112.63 au -206.123.112.64 - 206.123.112.79 us -206.123.112.80 - 206.123.112.87 au -206.123.112.88 - 206.123.112.95 it -206.123.112.96 - 206.123.127.255 us +206.123.18.0 - 206.123.23.255 ca +206.123.24.0 - 206.123.24.255 us +206.123.25.0 - 206.123.29.255 ca +206.123.30.0 - 206.123.30.255 us +206.123.31.0 - 206.123.51.255 ca +206.123.52.0 - 206.123.129.255 us +206.123.130.0 - 206.123.130.255 au +206.123.131.0 - 206.123.131.255 nz +206.123.132.0 - 206.123.132.255 jp +206.123.133.0 - 206.123.133.255 gr +206.123.134.0 - 206.123.134.255 eg +206.123.135.0 - 206.123.135.255 es +206.123.136.0 - 206.123.136.255 ca +206.123.137.0 - 206.123.137.255 fr +206.123.138.0 - 206.123.138.255 it +206.123.139.0 - 206.123.139.255 se +206.123.140.0 - 206.123.140.255 de +206.123.141.0 - 206.123.145.255 us +206.123.146.0 - 206.123.147.255 nl +206.123.148.0 - 206.123.148.255 se +206.123.149.0 - 206.123.149.255 ve +206.123.150.0 - 206.123.150.127 af +206.123.150.128 - 206.123.150.255 uz +206.123.151.0 - 206.123.151.127 tj +206.123.151.128 - 206.123.151.255 kg +206.123.152.0 - 206.123.152.127 kz +206.123.152.128 - 206.123.152.255 tm +206.123.153.0 - 206.123.153.127 la +206.123.153.128 - 206.123.153.255 mn +206.123.154.0 - 206.123.154.127 lk +206.123.154.128 - 206.123.154.255 bd +206.123.155.0 - 206.123.155.127 mm +206.123.155.128 - 206.123.155.255 pg +206.123.156.0 - 206.123.156.127 tz +206.123.156.128 - 206.123.156.255 mg +206.123.157.0 - 206.123.157.127 ao +206.123.157.128 - 206.123.157.255 ne +206.123.158.0 - 206.123.158.127 mr +206.123.158.128 - 206.123.158.255 sn +206.123.159.0 - 206.123.159.127 tn +206.123.159.128 - 206.123.159.255 dz 206.123.160.0 - 206.123.191.255 ca -206.123.192.0 - 206.125.44.143 us -206.125.44.144 - 206.125.44.151 ca -206.125.44.152 - 206.125.46.191 us -206.125.46.192 - 206.125.46.223 au -206.125.46.224 - 206.125.47.63 us -206.125.47.64 - 206.125.47.127 au -206.125.47.128 - 206.125.163.255 us +206.123.192.0 - 206.125.163.255 us 206.125.164.0 - 206.125.167.255 ca -206.125.168.0 - 206.125.168.255 us -206.125.169.0 - 206.125.169.15 jp -206.125.169.16 - 206.125.169.23 au -206.125.169.24 - 206.125.169.39 us -206.125.169.40 - 206.125.169.47 ca -206.125.169.48 - 206.125.169.55 jp -206.125.169.56 - 206.125.169.63 us -206.125.169.64 - 206.125.169.71 pt -206.125.169.72 - 206.125.169.111 us -206.125.169.112 - 206.125.169.119 vn -206.125.169.120 - 206.125.169.135 us -206.125.169.136 - 206.125.169.143 gb -206.125.169.144 - 206.125.169.151 us -206.125.169.152 - 206.125.169.159 ie -206.125.169.160 - 206.125.169.167 us -206.125.169.168 - 206.125.169.175 cv -206.125.169.176 - 206.125.169.223 us -206.125.169.224 - 206.125.169.231 pr -206.125.169.232 - 206.125.172.15 us -206.125.172.16 - 206.125.172.31 se -206.125.172.32 - 206.125.172.39 us -206.125.172.40 - 206.125.172.47 pt -206.125.172.48 - 206.125.172.175 us -206.125.172.176 - 206.125.172.183 jp -206.125.172.184 - 206.125.173.95 us -206.125.173.96 - 206.125.173.103 gb -206.125.173.104 - 206.125.174.175 us -206.125.174.176 - 206.125.174.183 ca -206.125.174.184 - 206.125.174.199 us -206.125.174.200 - 206.125.174.207 mx -206.125.174.208 - 206.125.174.231 us -206.125.174.232 - 206.125.174.239 ca -206.125.174.240 - 206.125.175.127 us -206.125.175.128 - 206.125.175.135 sg -206.125.175.136 - 206.126.71.255 us +206.125.168.0 - 206.125.171.15 us +206.125.171.16 - 206.125.171.23 vn +206.125.171.24 - 206.125.199.255 us +206.125.200.0 - 206.125.207.255 ca +206.125.208.0 - 206.126.79.255 us 206.126.80.0 - 206.126.95.255 ca -206.126.96.0 - 206.126.119.255 us -206.126.120.0 - 206.126.127.255 vc -206.126.128.0 - 206.128.207.255 us -206.128.208.0 - 206.128.208.255 ag +206.126.96.0 - 206.126.108.255 us +206.126.109.0 - 206.126.109.255 ca +206.126.110.0 - 206.126.119.255 us +206.126.120.0 - 206.126.127.255 lc +206.126.128.0 - 206.126.224.255 us +206.126.225.0 - 206.126.225.255 ca +206.126.226.0 - 206.126.243.255 us +206.126.244.0 - 206.126.244.255 gd +206.126.245.0 - 206.126.254.255 us +206.126.255.0 - 206.126.255.255 ca +206.127.0.0 - 206.128.208.255 us 206.128.209.0 - 206.128.209.255 lc 206.128.210.0 - 206.128.210.255 kn 206.128.211.0 - 206.128.211.255 vg -206.128.212.0 - 206.128.212.63 ag -206.128.212.64 - 206.128.212.127 ms -206.128.212.128 - 206.128.213.95 ag +206.128.212.0 - 206.128.213.63 us +206.128.213.64 - 206.128.213.95 ag 206.128.213.96 - 206.128.213.127 kn -206.128.213.128 - 206.128.214.255 ag +206.128.213.128 - 206.128.214.255 us 206.128.215.0 - 206.128.215.255 lc 206.128.216.0 - 206.129.255.255 us -206.130.1.0 - 206.130.1.255 ca -206.130.2.0 - 206.130.3.255 us -206.130.7.0 - 206.130.15.255 ca +206.130.0.0 - 206.130.1.255 ca +206.130.2.0 - 206.130.6.255 us +206.130.7.0 - 206.130.9.255 ca +206.130.10.0 - 206.130.10.255 us +206.130.11.0 - 206.130.15.255 ca 206.130.16.0 - 206.130.19.255 us -206.130.20.0 - 206.130.95.255 ca -206.130.96.0 - 206.130.147.255 us -206.130.148.0 - 206.130.255.255 ca -206.131.0.0 - 206.132.34.191 us -206.132.34.192 - 206.132.34.255 in -206.132.35.0 - 206.132.44.95 us -206.132.44.96 - 206.132.44.111 it -206.132.44.112 - 206.132.44.255 us -206.132.45.0 - 206.132.45.127 ca -206.132.45.128 - 206.132.47.255 us +206.130.20.0 - 206.130.51.255 ca +206.130.52.0 - 206.130.52.255 us +206.130.53.0 - 206.130.61.255 ca +206.130.62.0 - 206.130.63.255 us +206.130.64.0 - 206.130.64.255 ca +206.130.65.0 - 206.130.65.255 us +206.130.66.0 - 206.130.84.255 ca +206.130.85.0 - 206.130.85.255 us +206.130.86.0 - 206.130.87.255 ca +206.130.88.0 - 206.130.89.255 us +206.130.90.0 - 206.130.93.255 ca +206.130.94.0 - 206.130.148.255 us +206.130.149.0 - 206.130.227.255 ca +206.130.228.0 - 206.130.228.255 bl +206.130.229.0 - 206.130.242.255 ca +206.130.243.0 - 206.130.243.255 us +206.130.244.0 - 206.130.255.255 ca +206.131.0.0 - 206.131.191.255 us +206.131.192.0 - 206.131.207.255 ph +206.131.208.0 - 206.132.47.255 us 206.132.48.0 - 206.132.63.255 ca -206.132.64.0 - 206.132.175.255 us +206.132.64.0 - 206.132.96.255 us +206.132.97.0 - 206.132.97.255 gb +206.132.98.0 - 206.132.108.255 us +206.132.109.0 - 206.132.109.255 ar +206.132.110.0 - 206.132.125.79 us +206.132.125.80 - 206.132.125.95 ca +206.132.125.96 - 206.132.175.255 us 206.132.176.0 - 206.132.191.255 ca 206.132.192.0 - 206.138.15.255 us 206.138.16.0 - 206.138.31.255 bs 206.138.32.0 - 206.138.103.255 us 206.138.104.0 - 206.138.111.255 pe 206.138.112.0 - 206.141.255.255 us -206.142.0.0 - 206.142.1.7 hk -206.142.1.8 - 206.142.1.31 gb -206.142.1.32 - 206.142.1.63 us -206.142.1.64 - 206.142.1.191 hk -206.142.1.192 - 206.142.1.255 us -206.142.2.0 - 206.142.2.7 hk -206.142.2.8 - 206.142.2.255 us -206.142.3.0 - 206.142.3.7 hk -206.142.3.8 - 206.142.195.255 us +206.142.0.0 - 206.142.0.255 hk +206.142.1.0 - 206.142.195.255 us 206.142.196.0 - 206.142.196.255 gb -206.142.197.0 - 206.142.197.239 us -206.142.197.240 - 206.142.197.255 gb -206.142.198.0 - 206.142.211.63 us -206.142.211.64 - 206.142.211.79 gb -206.142.211.80 - 206.142.211.255 us -206.142.212.0 - 206.142.212.95 gb -206.142.212.96 - 206.142.212.191 us -206.142.212.192 - 206.142.212.199 gb -206.142.212.200 - 206.142.216.175 us -206.142.216.176 - 206.142.216.183 gb -206.142.216.184 - 206.142.217.191 us -206.142.217.192 - 206.142.217.207 fi -206.142.217.208 - 206.142.217.223 us -206.142.217.224 - 206.142.217.239 gb -206.142.217.240 - 206.142.219.207 us -206.142.219.208 - 206.142.219.239 sg -206.142.219.240 - 206.142.220.7 us -206.142.220.8 - 206.142.220.15 sg -206.142.220.16 - 206.142.220.255 us -206.142.221.0 - 206.142.221.31 gb -206.142.221.32 - 206.143.127.255 us +206.142.197.0 - 206.142.210.127 us +206.142.210.128 - 206.142.210.159 gb +206.142.210.160 - 206.142.216.255 us +206.142.217.0 - 206.142.217.255 gb +206.142.218.0 - 206.143.127.255 us 206.143.128.0 - 206.143.255.255 jp -206.144.0.0 - 206.150.64.223 us -206.150.64.224 - 206.150.64.255 ca -206.150.65.0 - 206.150.67.127 us -206.150.67.128 - 206.150.67.255 ca -206.150.68.0 - 206.150.96.135 us -206.150.96.136 - 206.150.96.143 ca -206.150.96.144 - 206.150.96.159 us -206.150.96.160 - 206.150.96.191 ca -206.150.96.192 - 206.150.180.15 us -206.150.180.16 - 206.150.180.31 gb -206.150.180.32 - 206.150.180.47 us -206.150.180.48 - 206.150.180.151 gb -206.150.180.152 - 206.150.180.191 us -206.150.180.192 - 206.150.180.223 gb -206.150.180.224 - 206.150.180.231 za -206.150.180.232 - 206.150.181.31 gb -206.150.181.32 - 206.150.181.39 us -206.150.181.40 - 206.150.181.79 gb -206.150.181.80 - 206.150.181.231 us -206.150.181.232 - 206.150.181.255 gb -206.150.182.0 - 206.151.165.231 us -206.151.165.232 - 206.151.165.239 ph -206.151.165.240 - 206.151.255.255 us -206.152.0.0 - 206.152.1.23 ca -206.152.1.24 - 206.153.95.255 us +206.144.0.0 - 206.150.99.255 us +206.150.100.0 - 206.150.100.255 ca +206.150.101.0 - 206.151.255.255 us +206.152.0.0 - 206.152.0.255 ca +206.152.1.0 - 206.152.4.63 us +206.152.4.64 - 206.152.4.95 ca +206.152.4.96 - 206.152.5.95 us +206.152.5.96 - 206.152.5.127 ca +206.152.5.128 - 206.152.5.199 us +206.152.5.200 - 206.152.5.207 ca +206.152.5.208 - 206.152.14.255 us +206.152.15.0 - 206.152.15.255 ca +206.152.16.0 - 206.152.17.111 us +206.152.17.112 - 206.152.17.119 ca +206.152.17.120 - 206.152.18.199 us +206.152.18.200 - 206.152.18.207 ca +206.152.18.208 - 206.152.19.223 us +206.152.19.224 - 206.152.19.255 ca +206.152.20.0 - 206.153.95.255 us 206.153.96.0 - 206.153.127.255 pa -206.153.128.0 - 206.155.68.127 us -206.155.68.128 - 206.155.68.135 gb -206.155.68.136 - 206.155.70.231 us -206.155.70.232 - 206.155.70.247 ca -206.155.70.248 - 206.155.73.63 us -206.155.73.64 - 206.155.73.127 ca -206.155.73.128 - 206.155.84.23 us -206.155.84.24 - 206.155.84.31 de -206.155.84.32 - 206.155.101.255 us +206.153.128.0 - 206.155.101.255 us 206.155.102.0 - 206.155.102.255 ch -206.155.103.0 - 206.155.115.255 us -206.155.116.0 - 206.155.116.47 ca -206.155.116.48 - 206.155.191.255 us +206.155.103.0 - 206.155.124.255 us +206.155.125.0 - 206.155.125.255 gb +206.155.126.0 - 206.155.191.255 us 206.155.192.0 - 206.155.207.255 ca 206.155.208.0 - 206.158.111.255 us 206.158.112.0 - 206.158.112.255 ca -206.158.113.0 - 206.159.111.63 us -206.159.111.64 - 206.159.111.79 ca -206.159.111.80 - 206.159.122.255 us +206.158.113.0 - 206.159.122.255 us 206.159.123.0 - 206.159.123.255 ec 206.159.124.0 - 206.159.130.255 us 206.159.131.0 - 206.159.131.255 gh -206.159.132.0 - 206.160.135.191 us -206.160.135.192 - 206.160.135.223 pr -206.160.135.224 - 206.160.213.255 us -206.160.214.0 - 206.160.214.7 pr -206.160.214.8 - 206.162.44.255 us +206.159.132.0 - 206.161.219.255 us +206.161.220.0 - 206.161.220.255 jp +206.161.221.0 - 206.162.44.255 us 206.162.45.0 - 206.162.45.255 ru 206.162.46.0 - 206.162.127.255 us 206.162.128.0 - 206.162.191.255 ca 206.162.192.0 - 206.163.223.255 us 206.163.224.0 - 206.163.255.255 ca -206.164.0.0 - 206.165.148.255 us +206.164.0.0 - 206.164.24.255 us +206.164.25.0 - 206.164.26.255 fr +206.164.27.0 - 206.164.183.255 us +206.164.184.0 - 206.164.191.255 de +206.164.192.0 - 206.164.207.255 us +206.164.208.0 - 206.164.215.255 de +206.164.216.0 - 206.164.233.255 us +206.164.234.0 - 206.164.234.255 fr +206.164.235.0 - 206.165.36.255 us +206.165.37.0 - 206.165.37.255 it +206.165.38.0 - 206.165.69.63 us +206.165.69.64 - 206.165.69.69 de +206.165.69.70 - 206.165.69.70 eu +206.165.69.71 - 206.165.69.127 de +206.165.69.128 - 206.165.73.183 us +206.165.73.184 - 206.165.73.187 gb +206.165.73.188 - 206.165.148.255 us 206.165.149.0 - 206.165.149.255 ca -206.165.150.0 - 206.166.255.255 us -206.167.0.0 - 206.167.255.255 ca -206.168.0.0 - 206.168.112.135 us -206.168.112.136 - 206.168.112.143 de -206.168.112.144 - 206.168.114.15 us -206.168.114.16 - 206.168.114.23 de -206.168.114.24 - 206.168.114.87 us -206.168.114.88 - 206.168.114.95 de -206.168.114.96 - 206.168.114.103 ch -206.168.114.104 - 206.168.114.111 us -206.168.114.112 - 206.168.114.119 hk -206.168.114.120 - 206.168.114.127 de -206.168.114.128 - 206.168.116.255 us -206.168.117.0 - 206.168.117.63 co -206.168.117.64 - 206.168.117.95 de -206.168.117.96 - 206.168.117.159 us -206.168.117.160 - 206.168.117.175 cn -206.168.117.176 - 206.171.255.255 us +206.165.150.0 - 206.165.177.255 us +206.165.178.0 - 206.165.178.255 nl +206.165.179.0 - 206.166.255.255 us +206.167.0.0 - 206.167.69.255 ca +206.167.70.0 - 206.167.71.255 us +206.167.72.0 - 206.167.255.255 ca +206.168.0.0 - 206.171.255.255 us 206.172.0.0 - 206.172.255.255 ca 206.173.0.0 - 206.174.175.255 us 206.174.176.0 - 206.174.223.255 ca -206.174.224.0 - 206.175.174.95 us -206.175.174.96 - 206.175.174.127 ca -206.175.174.128 - 206.176.255.255 us +206.174.224.0 - 206.176.255.255 us 206.177.0.0 - 206.179.255.255 ca -206.180.0.0 - 206.181.255.255 us +206.180.0.0 - 206.180.239.255 us +206.180.240.0 - 206.180.255.255 ca +206.181.0.0 - 206.181.255.255 us 206.182.0.0 - 206.182.7.255 gb 206.182.8.0 - 206.182.8.255 be 206.182.9.0 - 206.182.9.255 de @@ -129838,34 +106539,19 @@ 206.182.28.0 - 206.182.28.255 fi 206.182.29.0 - 206.182.29.255 us 206.182.30.0 - 206.182.30.255 tw -206.182.31.0 - 206.182.32.127 us -206.182.32.128 - 206.182.32.191 it -206.182.32.192 - 206.182.32.255 us +206.182.31.0 - 206.182.32.255 us 206.182.33.0 - 206.182.33.255 at -206.182.34.0 - 206.182.35.127 us -206.182.35.128 - 206.182.35.255 dk -206.182.36.0 - 206.182.40.255 us -206.182.41.0 - 206.182.41.255 es -206.182.42.0 - 206.182.42.127 gb -206.182.42.128 - 206.182.42.255 dk +206.182.34.0 - 206.182.42.255 us 206.182.43.0 - 206.182.43.255 de -206.182.44.0 - 206.182.45.127 us -206.182.45.128 - 206.182.45.255 za +206.182.44.0 - 206.182.45.255 us 206.182.46.0 - 206.182.46.255 no 206.182.47.0 - 206.182.47.255 za 206.182.48.0 - 206.182.48.255 fr -206.182.49.0 - 206.182.49.127 us -206.182.49.128 - 206.182.49.255 de +206.182.49.0 - 206.182.49.255 us 206.182.50.0 - 206.182.50.255 it 206.182.51.0 - 206.182.51.255 us 206.182.52.0 - 206.182.52.255 de -206.182.53.0 - 206.182.53.127 us -206.182.53.128 - 206.182.53.191 lu -206.182.53.192 - 206.182.53.255 us -206.182.54.0 - 206.182.54.15 es -206.182.54.16 - 206.182.54.127 us -206.182.54.128 - 206.182.54.255 de -206.182.55.0 - 206.182.55.255 us +206.182.53.0 - 206.182.55.255 us 206.182.56.0 - 206.182.56.255 fr 206.182.57.0 - 206.182.59.255 us 206.182.60.0 - 206.182.60.255 gb @@ -129873,1161 +106559,176 @@ 206.182.62.0 - 206.182.62.255 it 206.182.63.0 - 206.182.63.255 us 206.182.64.0 - 206.182.64.255 se -206.182.65.0 - 206.182.65.255 us -206.182.66.0 - 206.182.66.63 it -206.182.66.64 - 206.182.67.31 us -206.182.67.32 - 206.182.67.63 dk -206.182.67.64 - 206.182.67.127 at -206.182.67.128 - 206.182.71.255 us +206.182.65.0 - 206.182.71.255 us 206.182.72.0 - 206.182.72.255 es 206.182.73.0 - 206.182.73.255 gb -206.182.74.0 - 206.182.74.255 es -206.182.75.0 - 206.182.75.255 za -206.182.76.0 - 206.182.76.255 au +206.182.74.0 - 206.182.76.255 us 206.182.77.0 - 206.182.77.255 ch 206.182.78.0 - 206.182.78.255 de -206.182.79.0 - 206.182.82.255 us -206.182.83.0 - 206.182.83.255 be +206.182.79.0 - 206.182.83.255 us 206.182.84.0 - 206.182.84.255 it -206.182.85.0 - 206.182.85.255 nl -206.182.86.0 - 206.182.86.255 fr -206.182.87.0 - 206.182.87.255 ch +206.182.85.0 - 206.182.87.255 us 206.182.88.0 - 206.182.88.255 no -206.182.89.0 - 206.182.89.127 dk -206.182.89.128 - 206.182.89.191 in -206.182.89.192 - 206.182.89.255 us -206.182.90.0 - 206.182.90.127 lu -206.182.90.128 - 206.182.91.31 gb -206.182.91.32 - 206.182.91.255 us +206.182.89.0 - 206.182.91.255 us 206.182.92.0 - 206.182.92.255 il -206.182.93.0 - 206.182.93.255 us -206.182.94.0 - 206.182.94.63 be -206.182.94.64 - 206.182.94.127 ch -206.182.94.128 - 206.182.94.255 gb -206.182.95.0 - 206.182.95.0 us -206.182.95.1 - 206.182.95.64 it -206.182.95.65 - 206.182.95.191 us -206.182.95.192 - 206.182.95.255 sg -206.182.96.0 - 206.182.96.63 us +206.182.93.0 - 206.182.96.63 us 206.182.96.64 - 206.182.96.95 es 206.182.96.96 - 206.182.99.255 us 206.182.100.0 - 206.182.100.255 fr 206.182.101.0 - 206.182.101.255 de 206.182.102.0 - 206.182.103.255 fr -206.182.104.0 - 206.182.104.255 us -206.182.105.0 - 206.182.105.63 fr -206.182.105.64 - 206.182.105.191 us -206.182.105.192 - 206.182.105.255 ch -206.182.106.0 - 206.182.107.255 us +206.182.104.0 - 206.182.107.255 us 206.182.108.0 - 206.182.108.255 jp -206.182.109.0 - 206.182.109.127 us -206.182.109.128 - 206.182.109.191 gb -206.182.109.192 - 206.182.110.127 us -206.182.110.128 - 206.182.110.191 tw -206.182.110.192 - 206.182.110.255 de +206.182.109.0 - 206.182.110.255 us 206.182.111.0 - 206.182.111.255 at 206.182.112.0 - 206.182.113.255 nl -206.182.114.0 - 206.182.114.127 us -206.182.114.128 - 206.182.114.191 ro -206.182.114.192 - 206.182.114.255 us +206.182.114.0 - 206.182.114.255 us 206.182.115.0 - 206.182.115.255 be 206.182.116.0 - 206.182.116.255 us 206.182.117.0 - 206.182.117.255 hk -206.182.118.0 - 206.182.118.255 us -206.182.119.0 - 206.182.119.15 be -206.182.119.16 - 206.182.119.31 us -206.182.119.32 - 206.182.119.63 no -206.182.119.64 - 206.182.119.127 us -206.182.119.128 - 206.182.119.191 lu -206.182.119.192 - 206.182.119.223 us -206.182.119.224 - 206.182.119.255 ch +206.182.118.0 - 206.182.119.255 us 206.182.120.0 - 206.182.120.255 de 206.182.121.0 - 206.182.121.255 us 206.182.122.0 - 206.182.122.255 de -206.182.123.0 - 206.182.123.255 us -206.182.124.0 - 206.182.124.127 it -206.182.124.128 - 206.182.124.159 gb -206.182.124.160 - 206.182.124.191 lu -206.182.124.192 - 206.182.124.207 cz -206.182.124.208 - 206.182.124.223 be -206.182.124.224 - 206.182.124.255 de -206.182.125.0 - 206.182.125.191 us -206.182.125.192 - 206.182.125.223 ie -206.182.125.224 - 206.182.126.15 us -206.182.126.16 - 206.182.126.23 fr -206.182.126.24 - 206.182.126.63 us -206.182.126.64 - 206.182.126.95 fr -206.182.126.96 - 206.182.126.159 us -206.182.126.160 - 206.182.126.191 se -206.182.126.192 - 206.182.126.223 ch -206.182.126.224 - 206.182.126.255 fr -206.182.127.0 - 206.182.127.63 it -206.182.127.64 - 206.182.129.127 us -206.182.129.128 - 206.182.129.159 ca -206.182.129.160 - 206.182.129.191 us -206.182.129.192 - 206.182.129.223 il -206.182.129.224 - 206.182.129.255 us -206.182.130.0 - 206.182.130.31 br -206.182.130.32 - 206.182.130.63 us -206.182.130.64 - 206.182.130.71 br -206.182.130.72 - 206.182.130.223 us -206.182.130.224 - 206.182.130.239 gb -206.182.130.240 - 206.182.131.175 us -206.182.131.176 - 206.182.131.191 ar -206.182.131.192 - 206.182.132.255 us +206.182.123.0 - 206.182.132.255 us 206.182.133.0 - 206.182.133.255 mc -206.182.134.0 - 206.182.134.175 us -206.182.134.176 - 206.182.134.191 mx -206.182.134.192 - 206.182.135.255 us +206.182.134.0 - 206.182.135.255 us 206.182.136.0 - 206.182.138.255 ca -206.182.139.0 - 206.182.147.111 us -206.182.147.112 - 206.182.147.127 mx -206.182.147.128 - 206.182.147.191 us -206.182.147.192 - 206.182.147.207 mx -206.182.147.208 - 206.182.149.159 us -206.182.149.160 - 206.182.149.191 ca -206.182.149.192 - 206.182.152.223 us -206.182.152.224 - 206.182.152.255 mx -206.182.153.0 - 206.182.154.255 us -206.182.155.0 - 206.182.155.63 ca -206.182.155.64 - 206.182.155.127 us -206.182.155.128 - 206.182.155.191 ca -206.182.155.192 - 206.182.157.223 us -206.182.157.224 - 206.182.157.239 gb -206.182.157.240 - 206.182.163.143 us -206.182.163.144 - 206.182.163.159 br -206.182.163.160 - 206.182.163.191 us -206.182.163.192 - 206.182.163.223 mx -206.182.163.224 - 206.182.163.255 ph -206.182.164.0 - 206.182.164.159 us -206.182.164.160 - 206.182.164.175 br -206.182.164.176 - 206.182.164.191 us -206.182.164.192 - 206.182.164.255 gb -206.182.165.0 - 206.182.170.63 us -206.182.170.64 - 206.182.170.95 ar -206.182.170.96 - 206.182.176.223 us -206.182.176.224 - 206.182.176.255 br -206.182.177.0 - 206.182.177.127 us -206.182.177.128 - 206.182.177.191 jp -206.182.177.192 - 206.182.184.255 us +206.182.139.0 - 206.182.184.255 us 206.182.185.0 - 206.182.185.255 de 206.182.186.0 - 206.182.186.255 at 206.182.187.0 - 206.182.188.255 us 206.182.189.0 - 206.182.189.255 no -206.182.190.0 - 206.182.192.111 us -206.182.192.112 - 206.182.192.127 in -206.182.192.128 - 206.182.193.207 us -206.182.193.208 - 206.182.193.223 id -206.182.193.224 - 206.182.194.255 us +206.182.190.0 - 206.182.194.255 us 206.182.195.0 - 206.182.195.255 au 206.182.196.0 - 206.182.197.255 us 206.182.198.0 - 206.182.198.255 sg -206.182.199.0 - 206.182.199.63 ca -206.182.199.64 - 206.182.199.127 us -206.182.199.128 - 206.182.199.191 ca -206.182.199.192 - 206.182.199.199 jp -206.182.199.200 - 206.182.199.207 ph -206.182.199.208 - 206.182.199.215 cn -206.182.199.216 - 206.182.199.255 us -206.182.200.0 - 206.182.200.31 br -206.182.200.32 - 206.182.200.63 us -206.182.200.64 - 206.182.200.127 br -206.182.200.128 - 206.182.200.191 cn -206.182.200.192 - 206.182.200.255 br -206.182.201.0 - 206.182.201.31 jp -206.182.201.32 - 206.182.201.47 us -206.182.201.48 - 206.182.201.63 ph -206.182.201.64 - 206.182.201.95 hk -206.182.201.96 - 206.182.201.103 us -206.182.201.104 - 206.182.201.119 hk -206.182.201.120 - 206.182.201.159 us -206.182.201.160 - 206.182.201.191 id -206.182.201.192 - 206.182.201.255 us +206.182.199.0 - 206.182.201.255 us 206.182.202.0 - 206.182.202.255 id -206.182.203.0 - 206.182.203.127 us -206.182.203.128 - 206.182.203.255 sg -206.182.204.0 - 206.182.205.255 us -206.182.206.0 - 206.182.206.15 hk -206.182.206.16 - 206.182.206.95 us -206.182.206.96 - 206.182.206.127 sg -206.182.206.128 - 206.182.209.255 us +206.182.203.0 - 206.182.209.255 us 206.182.210.0 - 206.182.210.255 sg -206.182.211.0 - 206.182.211.127 us -206.182.211.128 - 206.182.211.143 hk -206.182.211.144 - 206.182.211.159 us -206.182.211.160 - 206.182.211.167 hk -206.182.211.168 - 206.182.212.15 us -206.182.212.16 - 206.182.212.31 jp -206.182.212.32 - 206.182.212.63 id -206.182.212.64 - 206.182.212.95 us -206.182.212.96 - 206.182.212.111 tw -206.182.212.112 - 206.182.214.127 us -206.182.214.128 - 206.182.214.159 jp -206.182.214.160 - 206.182.214.191 us -206.182.214.192 - 206.182.214.223 hk -206.182.214.224 - 206.182.217.63 us -206.182.217.64 - 206.182.217.95 jp -206.182.217.96 - 206.182.217.223 us -206.182.217.224 - 206.182.217.255 sg -206.182.218.0 - 206.182.220.255 us -206.182.221.0 - 206.182.221.63 it -206.182.221.64 - 206.182.221.95 my -206.182.221.96 - 206.182.221.103 us -206.182.221.104 - 206.182.221.111 jp -206.182.221.112 - 206.182.221.127 cn -206.182.221.128 - 206.182.221.191 us -206.182.221.192 - 206.182.221.255 cn -206.182.222.0 - 206.182.222.255 us -206.182.223.0 - 206.182.223.63 jp -206.182.223.64 - 206.182.223.255 us +206.182.211.0 - 206.182.223.255 us 206.182.224.0 - 206.182.224.255 nl -206.182.225.0 - 206.182.225.255 us -206.182.226.0 - 206.182.226.31 kr -206.182.226.32 - 206.182.226.127 us -206.182.226.128 - 206.182.226.159 th -206.182.226.160 - 206.182.226.223 us -206.182.226.224 - 206.182.226.255 sg -206.182.227.0 - 206.182.231.63 us -206.182.231.64 - 206.182.231.79 jp -206.182.231.80 - 206.182.231.95 us -206.182.231.96 - 206.182.231.103 jp -206.182.231.104 - 206.182.231.159 us -206.182.231.160 - 206.182.231.191 hk -206.182.231.192 - 206.182.231.207 sg -206.182.231.208 - 206.182.231.223 id -206.182.231.224 - 206.182.231.255 au -206.182.232.0 - 206.182.232.255 us +206.182.225.0 - 206.182.232.255 us 206.182.233.0 - 206.182.233.255 de -206.182.234.0 - 206.182.234.255 us -206.182.235.0 - 206.182.235.15 hk -206.182.235.16 - 206.182.235.63 us -206.182.235.64 - 206.182.235.95 kr -206.182.235.96 - 206.182.235.127 id -206.182.235.128 - 206.182.238.159 us -206.182.238.160 - 206.182.238.191 jp -206.182.238.192 - 206.182.238.255 us +206.182.234.0 - 206.182.238.255 us 206.182.239.0 - 206.182.239.255 se -206.182.240.0 - 206.182.242.255 us -206.182.243.0 - 206.182.243.127 ca -206.182.243.128 - 206.182.243.191 tw -206.182.243.192 - 206.182.243.223 us -206.182.243.224 - 206.182.243.255 my +206.182.240.0 - 206.182.243.255 us 206.182.244.0 - 206.182.244.255 no -206.182.245.0 - 206.182.245.127 ph -206.182.245.128 - 206.182.245.255 au -206.182.246.0 - 206.182.249.255 us -206.182.250.0 - 206.182.250.31 jp -206.182.250.32 - 206.182.250.63 sg -206.182.250.64 - 206.182.250.191 us -206.182.250.192 - 206.182.250.223 sg -206.182.250.224 - 206.182.254.255 us +206.182.245.0 - 206.182.254.255 us 206.182.255.0 - 206.182.255.255 fr -206.183.0.0 - 206.183.110.255 us -206.183.111.0 - 206.183.111.255 in +206.183.0.0 - 206.183.109.255 us +206.183.110.0 - 206.183.111.255 in 206.183.112.0 - 206.185.255.255 us -206.186.0.0 - 206.186.51.255 ca -206.186.52.0 - 206.186.52.255 us -206.186.53.0 - 206.186.94.95 ca -206.186.94.96 - 206.186.94.127 us -206.186.94.128 - 206.186.255.255 ca -206.187.0.0 - 206.188.0.95 us -206.188.0.96 - 206.188.0.111 il -206.188.0.112 - 206.188.2.159 us -206.188.2.160 - 206.188.2.191 au -206.188.2.192 - 206.188.3.159 us -206.188.3.160 - 206.188.3.175 bg -206.188.3.176 - 206.188.4.127 us -206.188.4.128 - 206.188.4.159 gr -206.188.4.160 - 206.188.4.255 us -206.188.5.0 - 206.188.5.15 ca -206.188.5.16 - 206.188.5.63 us -206.188.5.64 - 206.188.5.127 ca -206.188.5.128 - 206.188.6.127 us -206.188.6.128 - 206.188.6.191 se -206.188.6.192 - 206.188.8.31 us -206.188.8.32 - 206.188.8.47 qa -206.188.8.48 - 206.188.12.159 us -206.188.12.160 - 206.188.12.191 ca -206.188.12.192 - 206.188.18.127 us -206.188.18.128 - 206.188.18.191 ca -206.188.18.192 - 206.188.21.31 us -206.188.21.32 - 206.188.21.47 es -206.188.21.48 - 206.188.23.15 us -206.188.23.16 - 206.188.23.31 ca -206.188.23.32 - 206.188.23.63 us -206.188.23.64 - 206.188.23.127 se -206.188.23.128 - 206.188.24.31 us -206.188.24.32 - 206.188.24.47 au -206.188.24.48 - 206.188.24.255 us -206.188.25.0 - 206.188.25.255 au -206.188.26.0 - 206.188.31.159 us -206.188.31.160 - 206.188.31.223 au -206.188.31.224 - 206.188.63.255 us +206.186.0.0 - 206.186.255.255 ca +206.187.0.0 - 206.188.63.255 us 206.188.64.0 - 206.188.127.255 ca 206.188.128.0 - 206.188.159.255 bm 206.188.160.0 - 206.189.206.255 us 206.189.207.0 - 206.189.207.255 sg -206.189.208.0 - 206.190.236.255 us +206.189.208.0 - 206.190.156.255 us +206.190.157.0 - 206.190.157.255 sg +206.190.158.0 - 206.190.158.255 nl +206.190.159.0 - 206.190.159.255 sg +206.190.160.0 - 206.190.236.255 us 206.190.237.0 - 206.190.237.255 ca 206.190.238.0 - 206.190.255.255 us -206.191.0.0 - 206.191.2.143 ca -206.191.2.144 - 206.191.2.159 us -206.191.2.160 - 206.191.2.167 ca -206.191.2.168 - 206.191.2.175 us -206.191.2.176 - 206.191.7.63 ca -206.191.7.64 - 206.191.7.79 us -206.191.7.80 - 206.191.12.71 ca -206.191.12.72 - 206.191.12.79 us -206.191.12.80 - 206.191.12.143 ca -206.191.12.144 - 206.191.12.159 us -206.191.12.160 - 206.191.13.47 ca -206.191.13.48 - 206.191.13.63 us -206.191.13.64 - 206.191.14.207 ca -206.191.14.208 - 206.191.14.223 us -206.191.14.224 - 206.191.16.151 ca -206.191.16.152 - 206.191.16.159 gb -206.191.16.160 - 206.191.16.175 ca -206.191.16.176 - 206.191.16.191 us -206.191.16.192 - 206.191.16.215 ca -206.191.16.216 - 206.191.16.223 us -206.191.16.224 - 206.191.18.31 ca -206.191.18.32 - 206.191.18.127 us -206.191.18.128 - 206.191.19.191 ca -206.191.19.192 - 206.191.19.255 us -206.191.20.0 - 206.191.30.31 ca -206.191.30.32 - 206.191.30.63 us -206.191.30.64 - 206.191.30.127 ca -206.191.30.128 - 206.191.30.143 us -206.191.30.144 - 206.191.32.79 ca -206.191.32.80 - 206.191.32.95 us -206.191.32.96 - 206.191.32.223 ca -206.191.32.224 - 206.191.32.231 us -206.191.32.232 - 206.191.35.143 ca -206.191.35.144 - 206.191.35.159 us -206.191.35.160 - 206.191.38.159 ca -206.191.38.160 - 206.191.38.191 us -206.191.38.192 - 206.191.41.15 ca -206.191.41.16 - 206.191.41.23 us -206.191.41.24 - 206.191.41.191 ca -206.191.41.192 - 206.191.41.223 us -206.191.41.224 - 206.191.45.191 ca -206.191.45.192 - 206.191.45.255 us -206.191.46.0 - 206.191.47.15 ca -206.191.47.16 - 206.191.47.31 us -206.191.47.32 - 206.191.54.143 ca -206.191.54.144 - 206.191.54.151 sk -206.191.54.152 - 206.191.55.191 ca -206.191.55.192 - 206.191.55.207 us -206.191.55.208 - 206.191.62.191 ca -206.191.62.192 - 206.191.62.223 us -206.191.62.224 - 206.191.127.255 ca -206.191.128.0 - 206.197.150.255 us +206.191.0.0 - 206.191.127.255 ca +206.191.128.0 - 206.191.228.159 us +206.191.228.160 - 206.191.228.175 hk +206.191.228.176 - 206.191.228.255 sg +206.191.229.0 - 206.191.229.63 hk +206.191.229.64 - 206.191.229.79 us +206.191.229.80 - 206.191.229.95 hk +206.191.229.96 - 206.191.229.127 sg +206.191.229.128 - 206.191.229.239 hk +206.191.229.240 - 206.191.229.255 us +206.191.230.0 - 206.191.230.159 hk +206.191.230.160 - 206.191.230.175 us +206.191.230.176 - 206.191.230.255 hk +206.191.231.0 - 206.191.231.15 us +206.191.231.16 - 206.191.231.95 hk +206.191.231.96 - 206.191.239.255 us +206.191.240.0 - 206.191.240.31 nl +206.191.240.32 - 206.191.241.95 ie +206.191.241.96 - 206.191.242.191 nl +206.191.242.192 - 206.191.249.223 us +206.191.249.224 - 206.191.249.239 nl +206.191.249.240 - 206.191.250.47 us +206.191.250.48 - 206.191.250.63 nl +206.191.250.64 - 206.191.251.127 us +206.191.251.128 - 206.191.251.143 ie +206.191.251.144 - 206.191.251.175 nl +206.191.251.176 - 206.191.251.207 ie +206.191.251.208 - 206.191.251.239 nl +206.191.251.240 - 206.191.252.15 ie +206.191.252.16 - 206.191.252.47 nl +206.191.252.48 - 206.191.252.79 ie +206.191.252.80 - 206.191.252.111 nl +206.191.252.112 - 206.191.252.143 ie +206.191.252.144 - 206.191.252.175 nl +206.191.252.176 - 206.191.252.207 ie +206.191.252.208 - 206.191.252.239 nl +206.191.252.240 - 206.191.253.15 ie +206.191.253.16 - 206.191.253.47 nl +206.191.253.48 - 206.191.253.79 ie +206.191.253.80 - 206.191.253.111 nl +206.191.253.112 - 206.191.253.143 ie +206.191.253.144 - 206.191.253.175 nl +206.191.253.176 - 206.191.253.207 ie +206.191.253.208 - 206.191.253.239 nl +206.191.253.240 - 206.191.254.15 ie +206.191.254.16 - 206.191.254.47 nl +206.191.254.48 - 206.191.254.63 ie +206.191.254.64 - 206.196.102.255 us +206.196.103.0 - 206.196.103.255 a1 +206.196.104.0 - 206.197.58.255 us +206.197.59.0 - 206.197.59.255 ap +206.197.60.0 - 206.197.150.255 us 206.197.151.0 - 206.197.151.255 ca -206.197.152.0 - 206.199.109.255 us +206.197.152.0 - 206.197.207.255 us +206.197.208.0 - 206.197.208.255 ca +206.197.209.0 - 206.199.109.255 us 206.199.110.0 - 206.199.110.255 mx 206.199.111.0 - 206.199.148.255 us 206.199.149.0 - 206.199.149.255 mx -206.199.150.0 - 206.210.95.255 us +206.199.150.0 - 206.209.218.255 us +206.209.219.0 - 206.209.219.255 ca +206.209.220.0 - 206.210.95.255 us 206.210.96.0 - 206.210.127.255 ca -206.210.128.0 - 206.213.255.255 us +206.210.128.0 - 206.211.215.255 us +206.211.216.0 - 206.211.217.255 ca +206.211.218.0 - 206.213.255.255 us 206.214.0.0 - 206.214.15.255 ag 206.214.16.0 - 206.214.23.255 lc 206.214.24.0 - 206.214.31.255 vg -206.214.32.0 - 206.214.65.255 us -206.214.66.0 - 206.214.66.255 ca -206.214.67.0 - 206.214.68.255 us -206.214.69.0 - 206.214.69.255 ca -206.214.70.0 - 206.214.75.255 us -206.214.76.0 - 206.214.76.255 ca -206.214.77.0 - 206.214.78.127 us -206.214.78.128 - 206.214.78.191 ca -206.214.78.192 - 206.214.79.255 us -206.214.80.0 - 206.214.83.255 ca -206.214.84.0 - 206.214.84.255 us -206.214.85.0 - 206.214.85.15 ca -206.214.85.16 - 206.214.208.6 us -206.214.208.7 - 206.214.208.10 lk -206.214.208.11 - 206.214.208.12 ru -206.214.208.13 - 206.214.208.28 us -206.214.208.29 - 206.214.208.32 cn -206.214.208.33 - 206.214.208.36 us -206.214.208.37 - 206.214.208.40 in -206.214.208.41 - 206.214.208.44 us -206.214.208.45 - 206.214.208.48 id -206.214.208.49 - 206.214.208.64 us -206.214.208.65 - 206.214.208.68 th -206.214.208.69 - 206.214.208.80 us -206.214.208.81 - 206.214.208.84 ca -206.214.208.85 - 206.214.208.92 us -206.214.208.93 - 206.214.208.96 id -206.214.208.97 - 206.214.208.97 my -206.214.208.98 - 206.214.208.101 ca -206.214.208.102 - 206.214.208.105 si -206.214.208.106 - 206.214.208.109 in -206.214.208.110 - 206.214.208.113 us -206.214.208.114 - 206.214.208.117 in -206.214.208.118 - 206.214.208.126 us -206.214.208.127 - 206.214.208.127 be -206.214.208.128 - 206.214.208.129 ca -206.214.208.130 - 206.214.208.133 mx -206.214.208.134 - 206.214.208.137 ca -206.214.208.138 - 206.214.208.145 us -206.214.208.146 - 206.214.208.149 jp -206.214.208.150 - 206.214.208.165 us -206.214.208.166 - 206.214.208.169 in -206.214.208.170 - 206.214.208.171 nz -206.214.208.172 - 206.214.208.191 us -206.214.208.192 - 206.214.208.195 tw -206.214.208.196 - 206.214.208.223 us -206.214.208.224 - 206.214.208.227 my -206.214.208.228 - 206.214.208.235 us -206.214.208.236 - 206.214.208.239 br -206.214.208.240 - 206.214.208.243 ca -206.214.208.244 - 206.214.208.251 us -206.214.208.252 - 206.214.208.253 au -206.214.208.254 - 206.214.209.18 us -206.214.209.19 - 206.214.209.19 my -206.214.209.20 - 206.214.209.27 us -206.214.209.28 - 206.214.209.29 nz -206.214.209.30 - 206.214.209.33 us -206.214.209.34 - 206.214.209.37 sg -206.214.209.38 - 206.214.209.42 us -206.214.209.43 - 206.214.209.46 my -206.214.209.47 - 206.214.209.65 us -206.214.209.66 - 206.214.209.69 id -206.214.209.70 - 206.214.209.81 us -206.214.209.82 - 206.214.209.85 nz -206.214.209.86 - 206.214.209.97 us -206.214.209.98 - 206.214.209.101 tw -206.214.209.102 - 206.214.209.105 us -206.214.209.106 - 206.214.209.109 my -206.214.209.110 - 206.214.209.113 ca -206.214.209.114 - 206.214.209.117 us -206.214.209.118 - 206.214.209.121 au -206.214.209.122 - 206.214.209.125 us -206.214.209.126 - 206.214.209.129 jp -206.214.209.130 - 206.214.209.133 us -206.214.209.134 - 206.214.209.137 gb -206.214.209.138 - 206.214.209.145 us -206.214.209.146 - 206.214.209.149 jp -206.214.209.150 - 206.214.209.153 sg -206.214.209.154 - 206.214.209.157 ro -206.214.209.158 - 206.214.209.161 us -206.214.209.162 - 206.214.209.165 au -206.214.209.166 - 206.214.209.169 hk -206.214.209.170 - 206.214.209.177 us -206.214.209.178 - 206.214.209.180 au -206.214.209.181 - 206.214.209.181 us -206.214.209.182 - 206.214.209.185 ca -206.214.209.186 - 206.214.209.201 us -206.214.209.202 - 206.214.209.203 sg -206.214.209.204 - 206.214.209.215 us -206.214.209.216 - 206.214.209.219 mx -206.214.209.220 - 206.214.209.225 us -206.214.209.226 - 206.214.209.229 au -206.214.209.230 - 206.214.209.253 us -206.214.209.254 - 206.214.209.254 lk -206.214.209.255 - 206.214.210.9 us -206.214.210.10 - 206.214.210.11 ru -206.214.210.12 - 206.214.210.15 us -206.214.210.16 - 206.214.210.16 my -206.214.210.17 - 206.214.210.30 us -206.214.210.31 - 206.214.210.34 nz -206.214.210.35 - 206.214.210.50 us -206.214.210.51 - 206.214.210.54 gb -206.214.210.55 - 206.214.210.56 au -206.214.210.57 - 206.214.210.60 us -206.214.210.61 - 206.214.210.61 be -206.214.210.62 - 206.214.210.90 us -206.214.210.91 - 206.214.210.94 in -206.214.210.95 - 206.214.210.102 us -206.214.210.103 - 206.214.210.106 br -206.214.210.107 - 206.214.210.110 pl -206.214.210.111 - 206.214.210.122 us -206.214.210.123 - 206.214.210.126 au -206.214.210.127 - 206.214.210.130 in -206.214.210.131 - 206.214.210.178 us -206.214.210.179 - 206.214.210.182 id -206.214.210.183 - 206.214.210.186 us -206.214.210.187 - 206.214.210.190 ar -206.214.210.191 - 206.214.210.194 au -206.214.210.195 - 206.214.210.206 us -206.214.210.207 - 206.214.210.210 cn -206.214.210.211 - 206.214.210.239 us -206.214.210.240 - 206.214.210.243 id -206.214.210.244 - 206.214.210.247 gb -206.214.210.248 - 206.214.210.253 us -206.214.210.254 - 206.214.210.254 lk -206.214.210.255 - 206.214.211.18 us -206.214.211.19 - 206.214.211.22 ae -206.214.211.23 - 206.214.211.26 nl -206.214.211.27 - 206.214.211.34 us -206.214.211.35 - 206.214.211.38 ca -206.214.211.39 - 206.214.211.42 sg -206.214.211.43 - 206.214.211.46 au -206.214.211.47 - 206.214.211.54 us -206.214.211.55 - 206.214.211.58 id -206.214.211.59 - 206.214.211.62 au -206.214.211.63 - 206.214.211.66 ca -206.214.211.67 - 206.214.211.70 us -206.214.211.71 - 206.214.211.74 cn -206.214.211.75 - 206.214.211.78 us -206.214.211.79 - 206.214.211.79 my -206.214.211.80 - 206.214.211.96 us -206.214.211.97 - 206.214.211.100 tw -206.214.211.101 - 206.214.211.120 us -206.214.211.121 - 206.214.211.124 au -206.214.211.125 - 206.214.211.128 us -206.214.211.129 - 206.214.211.132 ec -206.214.211.133 - 206.214.211.136 us -206.214.211.137 - 206.214.211.137 nz -206.214.211.138 - 206.214.211.141 ar -206.214.211.142 - 206.214.211.149 us -206.214.211.150 - 206.214.211.151 au -206.214.211.152 - 206.214.211.155 ph -206.214.211.156 - 206.214.211.163 us -206.214.211.164 - 206.214.211.167 au -206.214.211.168 - 206.214.211.183 us -206.214.211.184 - 206.214.211.187 id -206.214.211.188 - 206.214.211.199 us -206.214.211.200 - 206.214.211.203 be -206.214.211.204 - 206.214.211.207 nl -206.214.211.208 - 206.214.211.211 ca -206.214.211.212 - 206.214.211.215 us -206.214.211.216 - 206.214.211.219 cn -206.214.211.220 - 206.214.211.235 us -206.214.211.236 - 206.214.211.239 ve -206.214.211.240 - 206.214.211.247 us -206.214.211.248 - 206.214.211.251 nz -206.214.211.252 - 206.214.211.252 us -206.214.211.253 - 206.214.211.253 lk -206.214.211.254 - 206.214.214.19 us -206.214.214.20 - 206.214.214.23 mx -206.214.214.24 - 206.214.214.31 ca -206.214.214.32 - 206.214.214.35 au -206.214.214.36 - 206.214.214.64 us -206.214.214.65 - 206.214.214.68 py -206.214.214.69 - 206.214.214.76 us -206.214.214.77 - 206.214.214.80 cn -206.214.214.81 - 206.214.214.84 au -206.214.214.85 - 206.214.214.88 us -206.214.214.89 - 206.214.214.92 in -206.214.214.93 - 206.214.214.100 us -206.214.214.101 - 206.214.214.101 be -206.214.214.102 - 206.214.214.105 us -206.214.214.106 - 206.214.214.109 sg -206.214.214.110 - 206.214.214.113 ca -206.214.214.114 - 206.214.214.129 us -206.214.214.130 - 206.214.214.133 au -206.214.214.134 - 206.214.215.11 us -206.214.215.12 - 206.214.215.15 cn -206.214.215.16 - 206.214.215.27 us -206.214.215.28 - 206.214.215.31 mx -206.214.215.32 - 206.214.215.35 sg -206.214.215.36 - 206.214.215.43 us -206.214.215.44 - 206.214.215.47 ca -206.214.215.48 - 206.214.215.66 us -206.214.215.67 - 206.214.215.70 my -206.214.215.71 - 206.214.215.74 th -206.214.215.75 - 206.214.215.78 au -206.214.215.79 - 206.214.215.84 us -206.214.215.85 - 206.214.215.88 cn -206.214.215.89 - 206.214.215.89 nz -206.214.215.90 - 206.214.215.98 us -206.214.215.99 - 206.214.215.102 ua -206.214.215.103 - 206.214.216.17 us -206.214.216.18 - 206.214.216.21 ca -206.214.216.22 - 206.214.216.29 us -206.214.216.30 - 206.214.216.33 id -206.214.216.34 - 206.214.216.41 gb -206.214.216.42 - 206.214.216.49 us -206.214.216.50 - 206.214.216.53 my -206.214.216.54 - 206.214.216.77 us -206.214.216.78 - 206.214.216.81 ch -206.214.216.82 - 206.214.216.97 us -206.214.216.98 - 206.214.216.101 ca -206.214.216.102 - 206.214.216.105 tr -206.214.216.106 - 206.214.216.109 us -206.214.216.110 - 206.214.216.113 ca -206.214.216.114 - 206.214.216.117 es -206.214.216.118 - 206.214.216.121 us -206.214.216.122 - 206.214.216.125 ro -206.214.216.126 - 206.214.216.129 br -206.214.216.130 - 206.214.216.141 us -206.214.216.142 - 206.214.216.145 br -206.214.216.146 - 206.214.216.149 us -206.214.216.150 - 206.214.216.153 es -206.214.216.154 - 206.214.216.173 us -206.214.216.174 - 206.214.216.177 au -206.214.216.178 - 206.214.216.181 us -206.214.216.182 - 206.214.216.185 ca -206.214.216.186 - 206.214.216.189 us -206.214.216.190 - 206.214.216.193 il -206.214.216.194 - 206.214.216.197 in -206.214.216.198 - 206.214.216.201 es -206.214.216.202 - 206.214.216.205 ca -206.214.216.206 - 206.214.216.209 au -206.214.216.210 - 206.214.216.225 us -206.214.216.226 - 206.214.216.229 in -206.214.216.230 - 206.214.216.233 us -206.214.216.234 - 206.214.216.237 in -206.214.216.238 - 206.214.216.241 us -206.214.216.242 - 206.214.216.245 ca -206.214.216.246 - 206.214.216.249 il -206.214.216.250 - 206.214.217.5 us -206.214.217.6 - 206.214.217.9 ca -206.214.217.10 - 206.214.217.13 us -206.214.217.14 - 206.214.217.17 hu -206.214.217.18 - 206.214.217.33 us -206.214.217.34 - 206.214.217.37 gb -206.214.217.38 - 206.214.217.53 us -206.214.217.54 - 206.214.217.57 in -206.214.217.58 - 206.214.217.61 us -206.214.217.62 - 206.214.217.65 ee -206.214.217.66 - 206.214.217.73 us -206.214.217.74 - 206.214.217.77 gb -206.214.217.78 - 206.214.217.81 in -206.214.217.82 - 206.214.217.85 us -206.214.217.86 - 206.214.217.89 ar -206.214.217.90 - 206.214.217.93 ca -206.214.217.94 - 206.214.217.97 eg -206.214.217.98 - 206.214.217.101 us -206.214.217.102 - 206.214.217.105 kw -206.214.217.106 - 206.214.217.109 us -206.214.217.110 - 206.214.217.113 ar -206.214.217.114 - 206.214.217.121 us -206.214.217.122 - 206.214.217.125 ae -206.214.217.126 - 206.214.217.129 ca -206.214.217.130 - 206.214.217.133 us -206.214.217.134 - 206.214.217.137 fr -206.214.217.138 - 206.214.217.139 ca -206.214.217.140 - 206.214.217.143 fr -206.214.217.144 - 206.214.217.147 au -206.214.217.148 - 206.214.217.151 us -206.214.217.152 - 206.214.217.155 in -206.214.217.156 - 206.214.217.181 us -206.214.217.182 - 206.214.217.183 br -206.214.217.184 - 206.214.217.191 us -206.214.217.192 - 206.214.217.195 ca -206.214.217.196 - 206.214.217.211 us -206.214.217.212 - 206.214.217.215 tr -206.214.217.216 - 206.214.217.237 us -206.214.217.238 - 206.214.217.241 pe -206.214.217.242 - 206.214.217.245 ru -206.214.217.246 - 206.214.217.249 gb -206.214.217.250 - 206.214.218.33 us -206.214.218.34 - 206.214.218.37 gb -206.214.218.38 - 206.214.218.49 us -206.214.218.50 - 206.214.218.53 my -206.214.218.54 - 206.214.218.65 us -206.214.218.66 - 206.214.218.69 it -206.214.218.70 - 206.214.218.73 ca -206.214.218.74 - 206.214.218.77 cz -206.214.218.78 - 206.214.218.81 us -206.214.218.82 - 206.214.218.85 tr -206.214.218.86 - 206.214.218.89 gb -206.214.218.90 - 206.214.218.93 in -206.214.218.94 - 206.214.218.101 us -206.214.218.102 - 206.214.218.105 br -206.214.218.106 - 206.214.218.109 vn -206.214.218.110 - 206.214.218.117 us -206.214.218.118 - 206.214.218.121 gb -206.214.218.122 - 206.214.218.125 ar -206.214.218.126 - 206.214.218.129 ba -206.214.218.130 - 206.214.218.133 us -206.214.218.134 - 206.214.218.137 ca -206.214.218.138 - 206.214.218.145 in -206.214.218.146 - 206.214.218.149 id -206.214.218.150 - 206.214.218.153 us -206.214.218.154 - 206.214.218.157 au -206.214.218.158 - 206.214.218.161 no -206.214.218.162 - 206.214.218.173 us -206.214.218.174 - 206.214.218.177 gr -206.214.218.178 - 206.214.218.221 us -206.214.218.222 - 206.214.218.223 ca -206.214.218.224 - 206.214.218.227 gb -206.214.218.228 - 206.214.218.239 us -206.214.218.240 - 206.214.218.243 gb -206.214.218.244 - 206.214.218.247 us -206.214.218.248 - 206.214.218.251 es -206.214.218.252 - 206.214.219.5 us -206.214.219.6 - 206.214.219.9 au -206.214.219.10 - 206.214.219.45 us -206.214.219.46 - 206.214.219.49 es -206.214.219.50 - 206.214.219.71 us -206.214.219.72 - 206.214.219.75 ca -206.214.219.76 - 206.214.219.79 gr -206.214.219.80 - 206.214.219.92 us -206.214.219.93 - 206.214.219.96 gb -206.214.219.97 - 206.214.219.100 bg -206.214.219.101 - 206.214.219.104 sa -206.214.219.105 - 206.214.219.108 gr -206.214.219.109 - 206.214.219.116 us -206.214.219.117 - 206.214.219.120 ar -206.214.219.121 - 206.214.219.124 us -206.214.219.125 - 206.214.219.128 gb -206.214.219.129 - 206.214.219.132 in -206.214.219.133 - 206.214.219.136 ru -206.214.219.137 - 206.214.219.140 gb -206.214.219.141 - 206.214.219.144 do -206.214.219.145 - 206.214.219.152 us -206.214.219.153 - 206.214.219.156 in -206.214.219.157 - 206.214.219.165 us -206.214.219.166 - 206.214.219.167 ru -206.214.219.168 - 206.214.219.173 us -206.214.219.174 - 206.214.219.177 ph -206.214.219.178 - 206.214.219.182 us -206.214.219.183 - 206.214.219.186 ca -206.214.219.187 - 206.214.219.190 us -206.214.219.191 - 206.214.219.194 it -206.214.219.195 - 206.214.219.206 us -206.214.219.207 - 206.214.219.210 pt -206.214.219.211 - 206.214.219.238 us -206.214.219.239 - 206.214.219.239 jp -206.214.219.240 - 206.214.219.247 us -206.214.219.248 - 206.214.219.251 ua -206.214.219.252 - 206.214.220.5 us -206.214.220.6 - 206.214.220.9 ec -206.214.220.10 - 206.214.220.37 us -206.214.220.38 - 206.214.220.41 ae -206.214.220.42 - 206.214.220.49 us -206.214.220.50 - 206.214.220.53 in -206.214.220.54 - 206.214.220.57 us -206.214.220.58 - 206.214.220.61 gb -206.214.220.62 - 206.214.220.69 us -206.214.220.70 - 206.214.220.73 it -206.214.220.74 - 206.214.220.86 us -206.214.220.87 - 206.214.220.90 il -206.214.220.91 - 206.214.220.94 pl -206.214.220.95 - 206.214.220.98 us -206.214.220.99 - 206.214.220.102 it -206.214.220.103 - 206.214.220.114 us -206.214.220.115 - 206.214.220.118 sg -206.214.220.119 - 206.214.220.122 us -206.214.220.123 - 206.214.220.126 au -206.214.220.127 - 206.214.220.130 it -206.214.220.131 - 206.214.220.134 ar -206.214.220.135 - 206.214.220.146 us -206.214.220.147 - 206.214.220.150 in -206.214.220.151 - 206.214.220.154 rs -206.214.220.155 - 206.214.220.158 es -206.214.220.159 - 206.214.220.162 pt -206.214.220.163 - 206.214.220.166 us -206.214.220.167 - 206.214.220.170 jp -206.214.220.171 - 206.214.220.182 us -206.214.220.183 - 206.214.220.186 gb -206.214.220.187 - 206.214.220.205 us -206.214.220.206 - 206.214.220.209 gb -206.214.220.210 - 206.214.220.221 us -206.214.220.222 - 206.214.220.225 vn -206.214.220.226 - 206.214.220.235 us -206.214.220.236 - 206.214.220.239 ph -206.214.220.240 - 206.214.220.243 za -206.214.220.244 - 206.214.221.5 us -206.214.221.6 - 206.214.221.9 si -206.214.221.10 - 206.214.221.25 us -206.214.221.26 - 206.214.221.29 in -206.214.221.30 - 206.214.221.37 us -206.214.221.38 - 206.214.221.41 hk -206.214.221.42 - 206.214.221.49 us -206.214.221.50 - 206.214.221.53 ca -206.214.221.54 - 206.214.221.65 us -206.214.221.66 - 206.214.221.69 tr -206.214.221.70 - 206.214.221.81 us -206.214.221.82 - 206.214.221.85 mx -206.214.221.86 - 206.214.221.91 us -206.214.221.92 - 206.214.221.95 il -206.214.221.96 - 206.214.221.109 us -206.214.221.110 - 206.214.221.113 in -206.214.221.114 - 206.214.221.164 us -206.214.221.165 - 206.214.221.168 sa -206.214.221.169 - 206.214.221.176 us -206.214.221.177 - 206.214.221.180 no -206.214.221.181 - 206.214.221.184 us -206.214.221.185 - 206.214.221.188 in -206.214.221.189 - 206.214.221.200 us -206.214.221.201 - 206.214.221.204 es -206.214.221.205 - 206.214.221.212 us -206.214.221.213 - 206.214.221.216 ca -206.214.221.217 - 206.214.221.228 us -206.214.221.229 - 206.214.221.232 au -206.214.221.233 - 206.214.221.240 se -206.214.221.241 - 206.214.221.248 us -206.214.221.249 - 206.214.221.252 gb -206.214.221.253 - 206.214.222.9 us -206.214.222.10 - 206.214.222.13 th -206.214.222.14 - 206.214.222.17 gb -206.214.222.18 - 206.214.222.21 ca -206.214.222.22 - 206.214.222.25 us -206.214.222.26 - 206.214.222.29 gb -206.214.222.30 - 206.214.222.37 us -206.214.222.38 - 206.214.222.41 nz -206.214.222.42 - 206.214.222.63 us -206.214.222.64 - 206.214.222.67 gb -206.214.222.68 - 206.214.222.71 us -206.214.222.72 - 206.214.222.75 ca -206.214.222.76 - 206.214.222.79 us +206.214.32.0 - 206.214.80.127 us +206.214.80.128 - 206.214.80.191 ca +206.214.80.192 - 206.214.80.255 us +206.214.81.0 - 206.214.81.255 eg +206.214.82.0 - 206.214.222.79 us 206.214.222.80 - 206.214.222.83 ca -206.214.222.84 - 206.214.222.99 us -206.214.222.100 - 206.214.222.103 au -206.214.222.104 - 206.214.222.119 us -206.214.222.120 - 206.214.222.123 kw -206.214.222.124 - 206.214.222.127 us -206.214.222.128 - 206.214.222.131 be -206.214.222.132 - 206.214.222.135 id -206.214.222.136 - 206.214.222.139 us -206.214.222.140 - 206.214.222.143 nl -206.214.222.144 - 206.214.222.155 us -206.214.222.156 - 206.214.222.159 es -206.214.222.160 - 206.214.222.167 us -206.214.222.168 - 206.214.222.171 ar -206.214.222.172 - 206.214.222.175 us -206.214.222.176 - 206.214.222.179 es -206.214.222.180 - 206.214.222.183 tr -206.214.222.184 - 206.214.222.195 us -206.214.222.196 - 206.214.222.199 gb -206.214.222.200 - 206.214.222.211 us -206.214.222.212 - 206.214.222.215 ca -206.214.222.216 - 206.214.222.219 be -206.214.222.220 - 206.214.222.223 us -206.214.222.224 - 206.214.222.227 ca -206.214.222.228 - 206.214.222.243 us -206.214.222.244 - 206.214.222.247 in -206.214.222.248 - 206.214.222.251 gr -206.214.222.252 - 206.214.223.5 us -206.214.223.6 - 206.214.223.7 ru -206.214.223.8 - 206.214.223.11 us -206.214.223.12 - 206.214.223.15 es -206.214.223.16 - 206.214.223.59 us -206.214.223.60 - 206.214.223.63 hu -206.214.223.64 - 206.214.223.105 us -206.214.223.106 - 206.214.223.109 gb -206.214.223.110 - 206.214.223.117 us -206.214.223.118 - 206.214.223.121 gr -206.214.223.122 - 206.214.223.133 us -206.214.223.134 - 206.214.223.137 gb -206.214.223.138 - 206.214.223.145 es -206.214.223.146 - 206.214.223.149 ar -206.214.223.150 - 206.214.223.195 us -206.214.223.196 - 206.214.223.199 ph -206.214.223.200 - 206.214.223.203 id -206.214.223.204 - 206.214.223.215 us -206.214.223.216 - 206.214.223.219 ca -206.214.223.220 - 206.214.223.221 us -206.214.223.222 - 206.214.223.222 il -206.214.223.223 - 206.214.223.233 us -206.214.223.234 - 206.214.223.253 hk -206.214.223.254 - 206.214.239.255 us -206.214.240.0 - 206.214.255.255 ca -206.215.0.0 - 206.217.128.47 us -206.217.128.48 - 206.217.128.63 ca -206.217.128.64 - 206.217.128.71 gb -206.217.128.72 - 206.217.128.111 us -206.217.128.112 - 206.217.128.119 af -206.217.128.120 - 206.217.128.151 us -206.217.128.152 - 206.217.128.159 gb -206.217.128.160 - 206.217.128.223 us -206.217.128.224 - 206.217.128.231 ca -206.217.128.232 - 206.217.129.63 us -206.217.129.64 - 206.217.129.79 ca -206.217.129.80 - 206.217.129.95 us -206.217.129.96 - 206.217.129.103 ca -206.217.129.104 - 206.217.129.207 us -206.217.129.208 - 206.217.129.223 ca -206.217.129.224 - 206.217.130.143 us -206.217.130.144 - 206.217.130.159 in -206.217.130.160 - 206.217.130.207 us -206.217.130.208 - 206.217.130.223 in -206.217.130.224 - 206.217.131.127 us -206.217.131.128 - 206.217.131.135 jp -206.217.131.136 - 206.217.131.143 us -206.217.131.144 - 206.217.131.151 sg -206.217.131.152 - 206.217.132.63 us -206.217.132.64 - 206.217.132.71 ca -206.217.132.72 - 206.217.132.103 us -206.217.132.104 - 206.217.132.111 af -206.217.132.112 - 206.217.132.171 us -206.217.132.172 - 206.217.132.175 ae -206.217.132.176 - 206.217.133.243 us -206.217.133.244 - 206.217.133.247 ae -206.217.133.248 - 206.217.133.255 us -206.217.134.0 - 206.217.134.7 ca -206.217.134.8 - 206.217.134.15 au -206.217.134.16 - 206.217.134.23 us -206.217.134.24 - 206.217.134.31 nl -206.217.134.32 - 206.217.134.47 us -206.217.134.48 - 206.217.134.55 af -206.217.134.56 - 206.217.134.63 us -206.217.134.64 - 206.217.134.79 ca -206.217.134.80 - 206.217.134.151 us -206.217.134.152 - 206.217.134.159 nz -206.217.134.160 - 206.217.134.207 us -206.217.134.208 - 206.217.134.223 af -206.217.134.224 - 206.217.135.95 us -206.217.135.96 - 206.217.135.103 ca -206.217.135.104 - 206.217.135.175 us -206.217.135.176 - 206.217.135.191 se -206.217.135.192 - 206.217.135.255 ca -206.217.136.0 - 206.217.136.107 us -206.217.136.108 - 206.217.136.111 ae -206.217.136.112 - 206.217.136.167 us -206.217.136.168 - 206.217.136.175 sg -206.217.136.176 - 206.217.137.15 us -206.217.137.16 - 206.217.137.31 au -206.217.137.32 - 206.217.139.31 us -206.217.139.32 - 206.217.139.47 ca -206.217.139.48 - 206.217.139.143 us -206.217.139.144 - 206.217.139.151 ca -206.217.139.152 - 206.217.139.163 af -206.217.139.164 - 206.217.139.167 us -206.217.139.168 - 206.217.139.175 br -206.217.139.176 - 206.217.139.223 us -206.217.139.224 - 206.217.139.239 es -206.217.139.240 - 206.217.140.23 us -206.217.140.24 - 206.217.140.31 se -206.217.140.32 - 206.217.140.255 us -206.217.141.0 - 206.217.141.15 ca -206.217.141.16 - 206.217.141.63 us -206.217.141.64 - 206.217.141.79 ca -206.217.141.80 - 206.217.141.143 us -206.217.141.144 - 206.217.141.159 ca -206.217.141.160 - 206.217.141.191 us -206.217.141.192 - 206.217.141.199 au -206.217.141.200 - 206.217.142.255 us -206.217.143.0 - 206.217.143.63 ca -206.217.143.64 - 206.217.143.143 us -206.217.143.144 - 206.217.143.159 hn -206.217.143.160 - 206.217.143.239 us -206.217.143.240 - 206.217.143.247 ca -206.217.143.248 - 206.218.255.255 us +206.214.222.84 - 206.214.239.255 us +206.214.240.0 - 206.214.248.239 ca +206.214.248.240 - 206.214.248.247 us +206.214.248.248 - 206.214.255.255 ca +206.215.0.0 - 206.218.255.255 us 206.219.0.0 - 206.219.63.255 kr -206.219.64.0 - 206.220.131.255 us +206.219.64.0 - 206.219.196.255 us +206.219.197.0 - 206.219.197.255 ca +206.219.198.0 - 206.220.131.255 us 206.220.132.0 - 206.220.135.255 hk 206.220.136.0 - 206.220.191.255 us 206.220.192.0 - 206.220.199.255 ca 206.220.200.0 - 206.221.79.255 us -206.221.80.0 - 206.221.95.255 br -206.221.96.0 - 206.221.209.183 us -206.221.209.184 - 206.221.209.191 il -206.221.209.192 - 206.221.217.7 us -206.221.217.8 - 206.221.217.15 gb -206.221.217.16 - 206.221.217.23 fr -206.221.217.24 - 206.221.217.55 us -206.221.217.56 - 206.221.217.63 ru -206.221.217.64 - 206.221.217.71 ca -206.221.217.72 - 206.221.217.79 us -206.221.217.80 - 206.221.217.87 fr -206.221.217.88 - 206.221.217.119 us -206.221.217.120 - 206.221.217.127 br -206.221.217.128 - 206.221.217.151 us -206.221.217.152 - 206.221.217.159 ru -206.221.217.160 - 206.221.217.183 us -206.221.217.184 - 206.221.217.191 es -206.221.217.192 - 206.221.217.199 nl -206.221.217.200 - 206.221.217.227 us -206.221.217.228 - 206.221.217.231 au -206.221.217.232 - 206.221.217.235 cn -206.221.217.236 - 206.221.217.239 us -206.221.217.240 - 206.221.217.243 es -206.221.217.244 - 206.221.217.247 us -206.221.217.248 - 206.221.217.255 br -206.221.218.0 - 206.221.218.31 us -206.221.218.32 - 206.221.218.39 cn -206.221.218.40 - 206.221.218.255 us -206.221.219.0 - 206.221.219.3 br -206.221.219.4 - 206.221.219.19 us -206.221.219.20 - 206.221.219.23 vi -206.221.219.24 - 206.221.219.39 us -206.221.219.40 - 206.221.219.47 es -206.221.219.48 - 206.221.219.71 us -206.221.219.72 - 206.221.219.79 es -206.221.219.80 - 206.221.219.87 us -206.221.219.88 - 206.221.219.103 br -206.221.219.104 - 206.221.219.119 us -206.221.219.120 - 206.221.219.127 au -206.221.219.128 - 206.221.219.135 ca -206.221.219.136 - 206.221.219.151 au -206.221.219.152 - 206.221.219.159 br -206.221.219.160 - 206.221.219.199 us -206.221.219.200 - 206.221.219.207 br -206.221.219.208 - 206.221.219.215 il -206.221.219.216 - 206.221.219.223 us -206.221.219.224 - 206.221.219.231 il -206.221.219.232 - 206.221.219.239 de -206.221.219.240 - 206.221.219.247 au -206.221.219.248 - 206.221.219.255 ar -206.221.220.0 - 206.221.220.87 us -206.221.220.88 - 206.221.220.95 za -206.221.220.96 - 206.221.220.103 us -206.221.220.104 - 206.221.220.111 br -206.221.220.112 - 206.221.220.143 us -206.221.220.144 - 206.221.220.151 ca -206.221.220.152 - 206.221.220.159 fr -206.221.220.160 - 206.221.220.183 us -206.221.220.184 - 206.221.220.191 dk -206.221.220.192 - 206.221.220.215 us -206.221.220.216 - 206.221.220.223 pl -206.221.220.224 - 206.221.220.231 br -206.221.220.232 - 206.221.220.239 us -206.221.220.240 - 206.221.220.247 br -206.221.220.248 - 206.221.220.255 us -206.221.221.0 - 206.221.221.15 fr -206.221.221.16 - 206.221.221.39 us -206.221.221.40 - 206.221.221.47 br -206.221.221.48 - 206.221.221.55 us -206.221.221.56 - 206.221.221.63 lk +206.221.80.0 - 206.221.95.255 ar +206.221.96.0 - 206.221.221.63 us 206.221.221.64 - 206.221.221.71 cn -206.221.221.72 - 206.221.221.79 us -206.221.221.80 - 206.221.221.95 za -206.221.221.96 - 206.221.221.103 de -206.221.221.104 - 206.221.221.111 br -206.221.221.112 - 206.221.221.143 us -206.221.221.144 - 206.221.221.151 br -206.221.221.152 - 206.221.221.159 ca -206.221.221.160 - 206.221.221.175 us -206.221.221.176 - 206.221.221.183 cn -206.221.221.184 - 206.221.221.191 uy -206.221.221.192 - 206.221.221.199 us -206.221.221.200 - 206.221.221.207 gb -206.221.221.208 - 206.221.221.215 us -206.221.221.216 - 206.221.221.223 br -206.221.221.224 - 206.221.221.239 fr -206.221.221.240 - 206.221.221.247 us -206.221.221.248 - 206.221.221.255 it -206.221.222.0 - 206.221.222.7 us -206.221.222.8 - 206.221.222.15 cz -206.221.222.16 - 206.221.222.23 br -206.221.222.24 - 206.221.222.47 us +206.221.221.72 - 206.221.222.47 us 206.221.222.48 - 206.221.222.63 il -206.221.222.64 - 206.221.222.119 us -206.221.222.120 - 206.221.222.127 sg -206.221.222.128 - 206.221.222.135 ru -206.221.222.136 - 206.221.222.151 us -206.221.222.152 - 206.221.222.159 ca -206.221.222.160 - 206.221.222.167 br -206.221.222.168 - 206.221.222.199 us -206.221.222.200 - 206.221.222.207 ar -206.221.222.208 - 206.221.222.215 cn -206.221.222.216 - 206.221.239.255 us +206.221.222.64 - 206.221.239.255 us 206.221.240.0 - 206.221.255.255 ca -206.222.0.0 - 206.222.2.63 us -206.222.2.64 - 206.222.2.95 il -206.222.2.96 - 206.222.2.191 us -206.222.2.192 - 206.222.2.199 il -206.222.2.200 - 206.222.3.127 us -206.222.3.128 - 206.222.3.159 il -206.222.3.160 - 206.222.3.215 us -206.222.3.216 - 206.222.3.223 il -206.222.3.224 - 206.222.5.23 us -206.222.5.24 - 206.222.5.31 ca -206.222.5.32 - 206.222.6.71 us -206.222.6.72 - 206.222.6.79 in -206.222.6.80 - 206.222.7.103 us -206.222.7.104 - 206.222.7.111 ca -206.222.7.112 - 206.222.7.223 us -206.222.7.224 - 206.222.7.231 in -206.222.7.232 - 206.222.8.159 us -206.222.8.160 - 206.222.8.175 ru -206.222.8.176 - 206.222.9.95 us -206.222.9.96 - 206.222.9.103 pk -206.222.9.104 - 206.222.12.39 us -206.222.12.40 - 206.222.12.47 jp -206.222.12.48 - 206.222.12.55 us -206.222.12.56 - 206.222.12.63 za -206.222.12.64 - 206.222.12.143 us -206.222.12.144 - 206.222.12.151 sg -206.222.12.152 - 206.222.12.191 us -206.222.12.192 - 206.222.12.199 ie -206.222.12.200 - 206.222.13.55 us -206.222.13.56 - 206.222.13.63 ru -206.222.13.64 - 206.222.14.111 us -206.222.14.112 - 206.222.14.119 be -206.222.14.120 - 206.222.14.127 us -206.222.14.128 - 206.222.14.135 tr -206.222.14.136 - 206.222.14.199 us -206.222.14.200 - 206.222.14.207 co -206.222.14.208 - 206.222.15.143 us -206.222.15.144 - 206.222.15.159 es -206.222.15.160 - 206.222.15.191 il -206.222.15.192 - 206.222.15.239 us -206.222.15.240 - 206.222.15.247 br -206.222.15.248 - 206.222.16.127 us -206.222.16.128 - 206.222.16.135 bd -206.222.16.136 - 206.222.16.151 us -206.222.16.152 - 206.222.16.159 au -206.222.16.160 - 206.222.16.199 us -206.222.16.200 - 206.222.16.207 ca -206.222.16.208 - 206.222.17.111 us -206.222.17.112 - 206.222.17.119 my -206.222.17.120 - 206.222.17.135 in -206.222.17.136 - 206.222.17.239 us -206.222.17.240 - 206.222.17.247 ca -206.222.17.248 - 206.222.18.7 us -206.222.18.8 - 206.222.18.15 hk -206.222.18.16 - 206.222.18.103 us -206.222.18.104 - 206.222.18.119 au -206.222.18.120 - 206.222.18.127 us -206.222.18.128 - 206.222.18.159 ph -206.222.18.160 - 206.222.18.231 us -206.222.18.232 - 206.222.18.239 nl -206.222.18.240 - 206.222.20.39 us -206.222.20.40 - 206.222.20.47 ie -206.222.20.48 - 206.222.20.223 us -206.222.20.224 - 206.222.20.239 tr -206.222.20.240 - 206.222.21.47 us -206.222.21.48 - 206.222.21.55 id -206.222.21.56 - 206.222.21.71 us -206.222.21.72 - 206.222.21.79 ir -206.222.21.80 - 206.222.21.175 us -206.222.21.176 - 206.222.21.183 gb -206.222.21.184 - 206.222.22.47 us -206.222.22.48 - 206.222.22.55 ie -206.222.22.56 - 206.222.22.71 us -206.222.22.72 - 206.222.22.87 ca -206.222.22.88 - 206.222.22.95 us -206.222.22.96 - 206.222.22.103 in -206.222.22.104 - 206.222.22.111 us -206.222.22.112 - 206.222.22.119 es -206.222.22.120 - 206.222.22.175 us -206.222.22.176 - 206.222.22.183 sa -206.222.22.184 - 206.222.22.199 us -206.222.22.200 - 206.222.22.207 bd -206.222.22.208 - 206.222.23.167 us -206.222.23.168 - 206.222.23.175 ir -206.222.23.176 - 206.222.23.191 us -206.222.23.192 - 206.222.23.199 ro -206.222.23.200 - 206.222.24.95 us -206.222.24.96 - 206.222.24.103 au -206.222.24.104 - 206.222.26.23 us -206.222.26.24 - 206.222.26.31 il -206.222.26.32 - 206.222.26.39 cn -206.222.26.40 - 206.222.26.71 us -206.222.26.72 - 206.222.26.79 dk -206.222.26.80 - 206.222.28.7 us -206.222.28.8 - 206.222.28.15 ae -206.222.28.16 - 206.222.28.55 us -206.222.28.56 - 206.222.28.63 nl -206.222.28.64 - 206.222.28.207 us -206.222.28.208 - 206.222.28.215 in -206.222.28.216 - 206.222.28.255 us -206.222.29.0 - 206.222.29.7 gb -206.222.29.8 - 206.222.29.47 us -206.222.29.48 - 206.222.29.55 au -206.222.29.56 - 206.222.29.135 us -206.222.29.136 - 206.222.29.143 ph -206.222.29.144 - 206.222.29.151 nl -206.222.29.152 - 206.222.29.183 us -206.222.29.184 - 206.222.29.191 gb -206.222.29.192 - 206.222.29.207 us -206.222.29.208 - 206.222.29.215 ve -206.222.29.216 - 206.222.30.119 us -206.222.30.120 - 206.222.30.127 th -206.222.30.128 - 206.222.30.143 ie -206.222.30.144 - 206.222.31.39 us -206.222.31.40 - 206.222.31.47 eg -206.222.31.48 - 206.222.31.103 us -206.222.31.104 - 206.222.31.111 gr -206.222.31.112 - 206.222.63.255 us +206.222.0.0 - 206.222.63.255 us 206.222.64.0 - 206.222.95.255 ca 206.222.96.0 - 206.223.89.255 us 206.223.90.0 - 206.223.91.255 ca @@ -131037,29 +106738,22 @@ 206.223.113.0 - 206.223.113.255 ca 206.223.114.0 - 206.223.123.255 us 206.223.124.0 - 206.223.124.255 co -206.223.125.0 - 206.223.129.255 us +206.223.125.0 - 206.223.128.255 us 206.223.130.0 - 206.223.130.255 pe 206.223.131.0 - 206.223.135.255 us -206.223.136.0 - 206.223.136.255 za +206.223.136.0 - 206.223.136.255 mu 206.223.137.0 - 206.223.159.255 us -206.223.160.0 - 206.223.162.255 ca -206.223.163.0 - 206.223.163.7 nl -206.223.163.8 - 206.223.182.255 ca +206.223.160.0 - 206.223.182.255 ca 206.223.183.0 - 206.223.183.255 ie 206.223.184.0 - 206.223.191.255 ca 206.223.192.0 - 206.223.223.255 us -206.223.224.0 - 206.223.255.255 ca 206.224.0.0 - 206.224.31.255 us 206.224.32.0 - 206.224.63.255 pa -206.224.64.0 - 206.225.82.200 us -206.225.82.201 - 206.225.82.208 mx -206.225.82.209 - 206.225.92.169 us -206.225.92.170 - 206.225.92.179 jp -206.225.92.180 - 206.225.94.242 us -206.225.94.243 - 206.225.94.250 in -206.225.94.251 - 206.225.127.255 us +206.224.64.0 - 206.225.127.255 us 206.225.128.0 - 206.225.131.255 hk -206.225.132.0 - 206.228.35.255 us +206.225.132.0 - 206.225.134.255 us +206.225.135.0 - 206.225.135.255 gb +206.225.136.0 - 206.228.35.255 us 206.228.36.0 - 206.228.39.255 ve 206.228.40.0 - 206.228.41.255 us 206.228.42.0 - 206.228.44.255 es @@ -131067,487 +106761,179 @@ 206.228.48.0 - 206.228.48.255 nl 206.228.49.0 - 206.228.49.255 us 206.228.50.0 - 206.228.50.255 nl -206.228.51.0 - 206.230.97.71 us -206.230.97.72 - 206.230.97.79 pr -206.230.97.80 - 206.231.67.255 us +206.228.51.0 - 206.231.67.255 us 206.231.68.0 - 206.231.71.255 ec 206.231.72.0 - 206.231.79.255 co -206.231.80.0 - 206.235.84.255 us +206.231.80.0 - 206.231.119.255 us +206.231.120.0 - 206.231.127.255 bb +206.231.128.0 - 206.235.84.255 us 206.235.85.0 - 206.235.87.255 ca 206.235.88.0 - 206.235.199.255 us 206.235.200.0 - 206.235.207.255 ca 206.235.208.0 - 206.235.247.255 us 206.235.248.0 - 206.235.255.255 ca -206.236.0.0 - 206.248.63.255 us +206.236.0.0 - 206.246.81.255 us +206.246.82.0 - 206.246.82.255 ca +206.246.83.0 - 206.248.63.255 us 206.248.64.0 - 206.248.127.255 pr 206.248.128.0 - 206.248.191.255 ca -206.248.192.0 - 206.251.223.255 us -206.251.224.0 - 206.251.255.255 a1 -206.252.0.0 - 207.1.159.255 us -207.1.160.0 - 207.1.160.255 as -207.1.161.0 - 207.2.95.255 us +206.248.192.0 - 206.253.135.255 us +206.253.136.0 - 206.253.143.255 ca +206.253.144.0 - 207.2.95.255 us 207.2.96.0 - 207.2.100.255 bm 207.2.101.0 - 207.2.101.255 us 207.2.102.0 - 207.2.103.255 bm -207.2.104.0 - 207.3.62.0 us -207.3.62.1 - 207.3.62.255 ph -207.3.63.0 - 207.5.255.255 us +207.2.104.0 - 207.2.111.255 us +207.2.128.0 - 207.2.203.255 us +207.2.204.0 - 207.2.207.255 ca +207.2.208.0 - 207.5.255.255 us 207.6.0.0 - 207.6.255.255 ca -207.7.0.0 - 207.7.129.7 us -207.7.129.8 - 207.7.129.15 nz -207.7.129.16 - 207.7.151.191 us -207.7.151.192 - 207.7.151.223 de -207.7.151.224 - 207.12.130.127 us -207.12.130.128 - 207.12.130.255 ca -207.12.131.0 - 207.13.76.255 us +207.7.0.0 - 207.13.76.255 us 207.13.77.0 - 207.13.77.255 hn -207.13.78.0 - 207.13.113.191 us -207.13.113.192 - 207.13.113.207 pr -207.13.113.208 - 207.13.113.215 us -207.13.113.216 - 207.13.113.223 pr -207.13.113.224 - 207.13.117.255 us +207.13.78.0 - 207.13.117.255 us 207.13.118.0 - 207.13.119.255 ec 207.13.120.0 - 207.13.196.255 us 207.13.197.0 - 207.13.197.15 pr -207.13.197.16 - 207.14.48.63 us -207.14.48.64 - 207.14.48.95 ca -207.14.48.96 - 207.15.133.255 us +207.13.197.16 - 207.15.133.255 us 207.15.134.0 - 207.15.134.255 ec 207.15.135.0 - 207.15.197.255 us 207.15.198.0 - 207.15.198.255 pr -207.15.199.0 - 207.17.189.255 us -207.17.190.0 - 207.17.191.255 mx -207.17.192.0 - 207.17.215.255 us +207.15.199.0 - 207.17.215.255 us 207.17.216.0 - 207.17.223.255 pe 207.17.224.0 - 207.19.251.255 us 207.19.252.0 - 207.19.252.255 ph 207.19.253.0 - 207.19.253.255 us 207.19.254.0 - 207.19.255.255 ph -207.20.0.0 - 207.22.145.159 us -207.22.145.160 - 207.22.145.191 au -207.22.145.192 - 207.22.148.255 us -207.22.149.0 - 207.22.149.39 gb -207.22.149.40 - 207.22.149.47 us -207.22.149.48 - 207.22.149.63 gb -207.22.149.64 - 207.22.255.255 us +207.20.0.0 - 207.22.255.255 us 207.23.0.0 - 207.23.255.255 ca -207.24.0.0 - 207.24.25.95 us -207.24.25.96 - 207.24.25.111 gb -207.24.25.112 - 207.24.25.207 us -207.24.25.208 - 207.24.25.223 gb -207.24.25.224 - 207.24.25.255 us +207.24.0.0 - 207.24.25.255 us 207.24.26.0 - 207.24.26.255 gb -207.24.27.0 - 207.24.28.47 us -207.24.28.48 - 207.24.28.63 gb -207.24.28.64 - 207.24.28.111 us -207.24.28.112 - 207.24.28.127 gb -207.24.28.128 - 207.24.28.159 us -207.24.28.160 - 207.24.28.175 gb -207.24.28.176 - 207.24.29.255 us +207.24.27.0 - 207.24.29.255 us 207.24.30.0 - 207.24.31.255 gb 207.24.32.0 - 207.25.101.255 us 207.25.102.0 - 207.25.102.255 jp -207.25.103.0 - 207.26.140.111 us -207.26.140.112 - 207.26.140.127 ca -207.26.140.128 - 207.32.191.167 us -207.32.191.168 - 207.32.191.175 ca -207.32.191.176 - 207.34.0.255 us +207.25.103.0 - 207.34.0.255 us 207.34.1.0 - 207.34.4.255 ca 207.34.5.0 - 207.34.11.255 us 207.34.12.0 - 207.34.31.255 ca 207.34.32.0 - 207.34.47.255 us 207.34.48.0 - 207.35.255.255 ca -207.36.0.0 - 207.41.74.255 us +207.36.0.0 - 207.37.8.255 us +207.37.9.0 - 207.37.9.255 de +207.37.10.0 - 207.37.195.255 us +207.37.196.0 - 207.37.196.255 gb +207.37.197.0 - 207.41.74.255 us 207.41.75.0 - 207.41.75.255 ec 207.41.76.0 - 207.42.131.255 us -207.42.132.0 - 207.42.132.31 ag -207.42.132.32 - 207.42.132.63 kn -207.42.132.64 - 207.42.132.159 ag -207.42.132.160 - 207.42.132.191 kn -207.42.132.192 - 207.42.132.255 ag +207.42.132.0 - 207.42.132.255 ag 207.42.133.0 - 207.42.133.255 ai 207.42.134.0 - 207.42.134.255 lc 207.42.135.0 - 207.42.135.63 dm 207.42.135.64 - 207.42.135.255 ag 207.42.136.0 - 207.42.175.255 us 207.42.176.0 - 207.42.191.255 hn -207.42.192.0 - 207.43.68.63 us -207.43.68.64 - 207.43.68.127 pr -207.43.68.128 - 207.43.170.223 us -207.43.170.224 - 207.43.170.255 ca -207.43.171.0 - 207.43.198.255 us -207.43.199.0 - 207.43.199.255 an -207.43.200.0 - 207.45.191.255 us -207.45.192.0 - 207.45.195.255 ca -207.45.196.0 - 207.45.196.31 us -207.45.196.32 - 207.45.197.223 ca -207.45.197.224 - 207.45.197.255 us -207.45.198.0 - 207.45.199.255 ca -207.45.200.0 - 207.45.200.255 us -207.45.201.0 - 207.45.201.31 ca -207.45.201.32 - 207.45.201.39 us -207.45.201.40 - 207.45.215.255 ca -207.45.216.0 - 207.45.216.255 us -207.45.217.0 - 207.45.223.255 ca -207.45.224.0 - 207.47.127.255 us +207.42.192.0 - 207.45.181.111 us +207.45.181.112 - 207.45.181.119 tt +207.45.181.120 - 207.45.195.15 us +207.45.195.16 - 207.45.195.31 fr +207.45.195.32 - 207.45.195.47 us +207.45.195.48 - 207.45.195.63 fr +207.45.195.64 - 207.45.207.127 us +207.45.207.128 - 207.45.207.159 ca +207.45.207.160 - 207.45.248.255 us +207.45.249.0 - 207.45.249.255 fr +207.45.250.0 - 207.45.252.127 us +207.45.252.128 - 207.45.252.159 fr +207.45.252.160 - 207.46.47.255 us +207.46.48.0 - 207.46.49.255 sg +207.46.50.0 - 207.46.50.255 ap +207.46.51.0 - 207.46.51.95 sg +207.46.51.96 - 207.46.51.127 hk +207.46.51.128 - 207.46.63.255 sg +207.46.64.0 - 207.46.64.127 us +207.46.64.128 - 207.46.64.143 jp +207.46.64.144 - 207.46.66.191 us +207.46.66.192 - 207.46.66.223 jp +207.46.66.224 - 207.46.67.127 us +207.46.67.128 - 207.46.67.159 jp +207.46.67.160 - 207.46.67.223 hk +207.46.67.224 - 207.46.67.255 jp +207.46.68.0 - 207.46.68.255 us +207.46.69.0 - 207.46.69.15 hk +207.46.69.16 - 207.46.69.255 us +207.46.70.0 - 207.46.72.63 hk +207.46.72.64 - 207.46.72.255 us +207.46.73.0 - 207.46.73.127 jp +207.46.73.128 - 207.46.73.175 us +207.46.73.176 - 207.46.73.255 jp +207.46.74.0 - 207.46.75.223 us +207.46.75.224 - 207.46.75.255 jp +207.46.76.0 - 207.46.77.127 us +207.46.77.128 - 207.46.77.191 jp +207.46.77.192 - 207.46.77.207 us +207.46.77.208 - 207.46.77.239 hk +207.46.77.240 - 207.46.86.255 us +207.46.87.0 - 207.46.87.255 hk +207.46.88.0 - 207.46.89.15 us +207.46.89.16 - 207.46.89.31 hk +207.46.89.32 - 207.46.95.47 us +207.46.95.48 - 207.46.95.63 hk +207.46.95.64 - 207.46.127.255 us +207.46.128.0 - 207.46.159.255 hk +207.46.160.0 - 207.46.212.127 us +207.46.212.128 - 207.46.212.255 jp +207.46.213.0 - 207.46.215.255 us +207.46.216.0 - 207.46.216.255 ie +207.46.217.0 - 207.46.217.255 sg +207.46.218.0 - 207.46.223.255 us +207.46.224.0 - 207.46.239.255 sg +207.46.240.0 - 207.47.127.255 us 207.47.128.0 - 207.47.255.255 ca -207.48.0.0 - 207.48.47.79 us -207.48.47.80 - 207.48.47.111 mx -207.48.47.112 - 207.48.183.31 us -207.48.183.32 - 207.48.183.63 jo -207.48.183.64 - 207.49.63.255 us +207.48.0.0 - 207.49.63.255 us 207.49.64.0 - 207.49.65.255 ca -207.49.66.0 - 207.51.155.127 us -207.51.155.128 - 207.51.155.191 eg -207.51.155.192 - 207.52.223.255 us +207.49.66.0 - 207.52.223.255 us 207.52.224.0 - 207.52.224.255 ca -207.52.225.0 - 207.53.239.255 us -207.53.240.0 - 207.53.244.255 ca -207.53.245.0 - 207.53.245.119 us -207.53.245.120 - 207.53.245.255 ca -207.53.246.0 - 207.53.246.255 us -207.53.247.0 - 207.53.247.255 ca -207.53.248.0 - 207.53.248.255 us -207.53.249.0 - 207.53.252.255 ca -207.53.253.0 - 207.53.253.255 us -207.53.254.0 - 207.53.255.255 ca -207.54.0.0 - 207.54.95.255 us -207.54.96.0 - 207.54.112.15 ca -207.54.112.16 - 207.54.112.47 us -207.54.112.48 - 207.54.127.255 ca -207.54.128.0 - 207.58.132.24 us -207.58.132.25 - 207.58.132.25 in -207.58.132.26 - 207.58.137.253 us -207.58.137.254 - 207.58.137.254 gb -207.58.137.255 - 207.58.138.235 us -207.58.138.236 - 207.58.138.239 lv -207.58.138.240 - 207.58.138.249 us -207.58.138.250 - 207.58.138.253 pt -207.58.138.254 - 207.58.142.7 us -207.58.142.8 - 207.58.142.15 it -207.58.142.16 - 207.58.142.167 us -207.58.142.168 - 207.58.142.175 gb -207.58.142.176 - 207.58.144.15 us -207.58.144.16 - 207.58.144.23 it -207.58.144.24 - 207.58.144.79 us -207.58.144.80 - 207.58.144.95 ca -207.58.144.96 - 207.58.144.135 us -207.58.144.136 - 207.58.144.143 gb -207.58.144.144 - 207.58.144.159 us -207.58.144.160 - 207.58.144.167 gb -207.58.144.168 - 207.58.144.231 us -207.58.144.232 - 207.58.144.239 ca -207.58.144.240 - 207.58.144.247 au -207.58.144.248 - 207.58.146.15 us -207.58.146.16 - 207.58.146.31 be -207.58.146.32 - 207.58.146.63 it -207.58.146.64 - 207.58.146.79 sa -207.58.146.80 - 207.58.146.111 us -207.58.146.112 - 207.58.146.143 it -207.58.146.144 - 207.58.147.63 us -207.58.147.64 - 207.58.147.79 au -207.58.147.80 - 207.58.147.95 us -207.58.147.96 - 207.58.147.111 au -207.58.147.112 - 207.58.147.159 us -207.58.147.160 - 207.58.147.175 gb -207.58.147.176 - 207.58.148.31 us -207.58.148.32 - 207.58.148.39 co -207.58.148.40 - 207.58.148.71 us -207.58.148.72 - 207.58.148.79 in -207.58.148.80 - 207.58.148.87 us -207.58.148.88 - 207.58.148.95 gb -207.58.148.96 - 207.58.150.63 us -207.58.150.64 - 207.58.150.71 nl -207.58.150.72 - 207.58.151.214 us -207.58.151.215 - 207.58.151.218 gb -207.58.151.219 - 207.58.157.191 us -207.58.157.192 - 207.58.157.223 za -207.58.157.224 - 207.58.157.255 us -207.58.158.0 - 207.58.158.7 ca -207.58.158.8 - 207.58.158.47 us -207.58.158.48 - 207.58.158.55 ca -207.58.158.56 - 207.58.158.103 us -207.58.158.104 - 207.58.158.111 nl -207.58.158.112 - 207.58.158.119 us -207.58.158.120 - 207.58.158.127 ca -207.58.158.128 - 207.58.158.151 us -207.58.158.152 - 207.58.158.167 ca -207.58.158.168 - 207.58.158.175 us -207.58.158.176 - 207.58.158.183 gb -207.58.158.184 - 207.58.184.5 us -207.58.184.6 - 207.58.184.9 in -207.58.184.10 - 207.58.184.145 us -207.58.184.146 - 207.58.184.149 in -207.58.184.150 - 207.58.184.169 us -207.58.184.170 - 207.58.184.173 in -207.58.184.174 - 207.58.184.209 us -207.58.184.210 - 207.58.184.213 in -207.58.184.214 - 207.58.185.181 us -207.58.185.182 - 207.58.185.185 mx -207.58.185.186 - 207.58.185.213 us -207.58.185.214 - 207.58.185.217 mx -207.58.185.218 - 207.58.190.163 us -207.58.190.164 - 207.58.190.164 mx -207.58.190.165 - 207.58.191.217 us -207.58.191.218 - 207.58.191.218 mx -207.58.191.219 - 207.60.255.255 us +207.52.225.0 - 207.54.95.255 us +207.54.96.0 - 207.54.127.255 ca +207.54.128.0 - 207.55.223.255 us +207.55.224.0 - 207.55.224.255 a2 +207.55.225.0 - 207.55.230.255 us +207.55.231.0 - 207.55.231.255 a2 +207.55.232.0 - 207.60.255.255 us 207.61.0.0 - 207.61.255.255 ca -207.62.0.0 - 207.65.70.31 us -207.65.70.32 - 207.65.70.47 tn -207.65.70.48 - 207.65.70.79 us -207.65.70.80 - 207.65.70.95 tn -207.65.70.96 - 207.65.70.143 us -207.65.70.144 - 207.65.70.151 tn -207.65.70.152 - 207.65.71.47 us -207.65.71.48 - 207.65.71.63 tn -207.65.71.64 - 207.67.145.127 us -207.67.145.128 - 207.67.146.255 a1 -207.67.147.0 - 207.67.147.255 us -207.67.148.0 - 207.67.149.255 a1 -207.67.150.0 - 207.67.150.255 us -207.67.151.0 - 207.67.151.255 a1 -207.67.152.0 - 207.79.207.255 us +207.62.0.0 - 207.79.207.255 us 207.79.208.0 - 207.79.223.255 pe 207.79.224.0 - 207.80.255.255 us 207.81.0.0 - 207.81.255.255 ca -207.82.0.0 - 207.82.16.95 us -207.82.16.96 - 207.82.16.127 sg -207.82.16.128 - 207.82.16.143 us -207.82.16.144 - 207.82.16.175 sg -207.82.16.176 - 207.82.17.255 us -207.82.18.0 - 207.82.18.7 sg -207.82.18.8 - 207.82.19.127 us -207.82.19.128 - 207.82.19.143 sg -207.82.19.144 - 207.82.143.255 us -207.82.144.0 - 207.82.144.15 gb -207.82.144.16 - 207.83.0.191 us -207.83.0.192 - 207.83.0.199 ca -207.83.0.200 - 207.83.32.127 us -207.83.32.128 - 207.83.32.255 gb -207.83.33.0 - 207.83.38.63 us -207.83.38.64 - 207.83.38.71 ca -207.83.38.72 - 207.83.96.127 us -207.83.96.128 - 207.83.96.255 mx -207.83.97.0 - 207.83.112.79 us -207.83.112.80 - 207.83.112.95 gb -207.83.112.96 - 207.83.112.239 us -207.83.112.240 - 207.83.112.247 gb -207.83.112.248 - 207.83.159.255 us -207.83.160.0 - 207.83.160.7 br -207.83.160.8 - 207.83.160.31 us -207.83.160.32 - 207.83.160.63 br -207.83.160.64 - 207.83.160.95 us -207.83.160.96 - 207.83.160.111 br -207.83.160.112 - 207.83.191.255 us +207.82.0.0 - 207.82.16.15 us +207.82.16.16 - 207.82.16.31 sg +207.82.16.32 - 207.82.67.7 us +207.82.67.8 - 207.82.67.15 gb +207.82.67.16 - 207.82.71.143 us +207.82.71.144 - 207.82.71.159 gb +207.82.71.160 - 207.82.112.255 us +207.82.113.0 - 207.82.113.255 gb +207.82.114.0 - 207.82.120.223 us +207.82.120.224 - 207.82.120.231 gb +207.82.120.232 - 207.82.120.255 us +207.82.121.0 - 207.82.121.255 gb +207.82.122.0 - 207.83.191.255 us 207.83.192.0 - 207.83.223.255 mx 207.83.224.0 - 207.96.127.255 us 207.96.128.0 - 207.96.255.255 ca -207.97.0.0 - 207.97.192.63 us -207.97.192.64 - 207.97.192.95 bd -207.97.192.96 - 207.97.192.207 us -207.97.192.208 - 207.97.192.215 mx -207.97.192.216 - 207.97.192.231 us -207.97.192.232 - 207.97.192.239 lc -207.97.192.240 - 207.97.193.95 us -207.97.193.96 - 207.97.193.127 bd -207.97.193.128 - 207.97.193.239 us -207.97.193.240 - 207.97.193.247 in -207.97.193.248 - 207.97.193.255 us -207.97.194.0 - 207.97.194.63 bd -207.97.194.64 - 207.97.194.119 us -207.97.194.120 - 207.97.194.127 gb -207.97.194.128 - 207.97.194.215 us -207.97.194.216 - 207.97.194.223 ca -207.97.194.224 - 207.97.195.7 us -207.97.195.8 - 207.97.195.15 gb -207.97.195.16 - 207.97.195.119 us -207.97.195.120 - 207.97.195.127 ec -207.97.195.128 - 207.97.195.143 us -207.97.195.144 - 207.97.195.159 ca -207.97.195.160 - 207.97.196.191 us -207.97.196.192 - 207.97.196.207 ca -207.97.196.208 - 207.97.197.127 us -207.97.197.128 - 207.97.197.151 ca -207.97.197.152 - 207.97.199.23 us -207.97.199.24 - 207.97.199.31 ca -207.97.199.32 - 207.97.199.39 au -207.97.199.40 - 207.97.199.47 us -207.97.199.48 - 207.97.199.55 au -207.97.199.56 - 207.97.199.183 us -207.97.199.184 - 207.97.199.199 au -207.97.199.200 - 207.97.199.207 jm -207.97.199.208 - 207.97.199.223 us -207.97.199.224 - 207.97.199.231 ca -207.97.199.232 - 207.97.200.7 us -207.97.200.8 - 207.97.200.15 ie -207.97.200.16 - 207.97.200.103 us -207.97.200.104 - 207.97.200.111 ca -207.97.200.112 - 207.97.201.63 us -207.97.201.64 - 207.97.201.71 uy -207.97.201.72 - 207.97.201.79 in -207.97.201.80 - 207.97.202.255 us -207.97.203.0 - 207.97.203.15 au -207.97.203.16 - 207.97.203.63 us -207.97.203.64 - 207.97.203.79 bd -207.97.203.80 - 207.97.203.143 us -207.97.203.144 - 207.97.203.151 il -207.97.203.152 - 207.97.204.79 us -207.97.204.80 - 207.97.204.95 au -207.97.204.96 - 207.97.204.103 us -207.97.204.104 - 207.97.204.111 co -207.97.204.112 - 207.97.205.71 us -207.97.205.72 - 207.97.205.79 gb -207.97.205.80 - 207.97.205.127 us -207.97.205.128 - 207.97.205.135 ca -207.97.205.136 - 207.97.206.143 us -207.97.206.144 - 207.97.206.151 gb -207.97.206.152 - 207.97.208.79 us -207.97.208.80 - 207.97.208.87 bd -207.97.208.88 - 207.97.209.15 us -207.97.209.16 - 207.97.209.23 th -207.97.209.24 - 207.97.209.211 us -207.97.209.212 - 207.97.209.215 ca -207.97.209.216 - 207.97.209.217 us -207.97.209.218 - 207.97.209.219 ca -207.97.209.220 - 207.97.210.23 us -207.97.210.24 - 207.97.210.31 mx -207.97.210.32 - 207.97.210.63 us -207.97.210.64 - 207.97.210.79 bd -207.97.210.80 - 207.97.210.95 us -207.97.210.96 - 207.97.210.103 gb -207.97.210.104 - 207.97.210.199 us -207.97.210.200 - 207.97.210.207 au -207.97.210.208 - 207.97.211.55 us -207.97.211.56 - 207.97.211.63 ca -207.97.211.64 - 207.97.212.39 us -207.97.212.40 - 207.97.212.47 my -207.97.212.48 - 207.97.212.95 us -207.97.212.96 - 207.97.212.103 cr -207.97.212.104 - 207.97.212.119 us -207.97.212.120 - 207.97.212.127 pr -207.97.212.128 - 207.97.212.135 ca -207.97.212.136 - 207.97.213.127 us -207.97.213.128 - 207.97.213.135 au -207.97.213.136 - 207.97.214.31 us -207.97.214.32 - 207.97.214.39 ca -207.97.214.40 - 207.97.214.95 us -207.97.214.96 - 207.97.214.103 nl -207.97.214.104 - 207.97.214.215 us -207.97.214.216 - 207.97.214.247 my -207.97.214.248 - 207.97.215.23 us -207.97.215.24 - 207.97.215.31 my -207.97.215.32 - 207.97.216.7 us -207.97.216.8 - 207.97.216.15 ca -207.97.216.16 - 207.97.216.71 us -207.97.216.72 - 207.97.216.79 gb -207.97.216.80 - 207.97.216.95 my -207.97.216.96 - 207.97.217.63 us -207.97.217.64 - 207.97.217.79 bd -207.97.217.80 - 207.97.218.95 us -207.97.218.96 - 207.97.218.103 bm -207.97.218.104 - 207.97.218.119 us -207.97.218.120 - 207.97.218.127 jp -207.97.218.128 - 207.97.218.159 us -207.97.218.160 - 207.97.218.167 nl -207.97.218.168 - 207.97.218.247 us -207.97.218.248 - 207.97.218.251 il -207.97.218.252 - 207.97.222.79 us -207.97.222.80 - 207.97.222.87 ca -207.97.222.88 - 207.97.223.255 us -207.97.224.0 - 207.97.224.15 is -207.97.224.16 - 207.97.224.31 gb -207.97.224.32 - 207.97.224.55 us -207.97.224.56 - 207.97.224.63 bm -207.97.224.64 - 207.97.224.151 us -207.97.224.152 - 207.97.224.159 bm -207.97.224.160 - 207.97.225.15 us -207.97.225.16 - 207.97.225.23 in -207.97.225.24 - 207.97.225.95 us -207.97.225.96 - 207.97.225.103 in -207.97.225.104 - 207.97.225.159 us -207.97.225.160 - 207.97.225.167 ca -207.97.225.168 - 207.97.226.23 us -207.97.226.24 - 207.97.226.31 jp -207.97.226.32 - 207.97.226.39 au -207.97.226.40 - 207.97.226.199 us -207.97.226.200 - 207.97.226.207 ca -207.97.226.208 - 207.97.236.7 us -207.97.236.8 - 207.97.236.15 gb -207.97.236.16 - 207.97.236.63 us -207.97.236.64 - 207.97.236.71 gb -207.97.236.72 - 207.97.236.167 us -207.97.236.168 - 207.97.236.175 il -207.97.236.176 - 207.97.237.79 us -207.97.237.80 - 207.97.237.87 in -207.97.237.88 - 207.97.237.143 us -207.97.237.144 - 207.97.237.159 th -207.97.237.160 - 207.97.237.175 ca -207.97.237.176 - 207.97.237.203 us -207.97.237.204 - 207.97.237.207 in -207.97.237.208 - 207.97.238.31 us -207.97.238.32 - 207.97.238.47 nl -207.97.238.48 - 207.97.238.55 us -207.97.238.56 - 207.97.238.63 nz -207.97.238.64 - 207.97.238.143 us -207.97.238.144 - 207.97.238.151 in -207.97.238.152 - 207.97.246.79 us -207.97.246.80 - 207.97.246.87 za -207.97.246.88 - 207.97.247.15 us -207.97.247.16 - 207.97.247.39 nl -207.97.247.40 - 207.97.247.47 us -207.97.247.48 - 207.97.247.55 ca -207.97.247.56 - 207.97.248.127 us -207.97.248.128 - 207.97.248.135 jm -207.97.248.136 - 207.97.248.255 us -207.97.249.0 - 207.97.249.7 il -207.97.249.8 - 207.97.249.15 mx -207.97.249.16 - 207.97.250.159 us -207.97.250.160 - 207.97.250.167 pk -207.97.250.168 - 207.97.251.95 us -207.97.251.96 - 207.97.251.111 jp -207.97.251.112 - 207.97.251.215 us -207.97.251.216 - 207.97.251.223 bm -207.97.251.224 - 207.97.251.255 us -207.97.252.0 - 207.97.252.15 eg -207.97.252.16 - 207.97.252.55 us -207.97.252.56 - 207.97.252.63 in -207.97.252.64 - 207.97.253.111 us -207.97.253.112 - 207.97.253.127 bd -207.97.253.128 - 207.97.254.255 us -207.97.255.0 - 207.97.255.31 ca -207.97.255.32 - 207.97.255.47 us -207.97.255.48 - 207.97.255.55 pk -207.97.255.56 - 207.97.255.95 us -207.97.255.96 - 207.97.255.103 bd -207.97.255.104 - 207.101.255.255 us +207.97.0.0 - 207.101.255.255 us 207.102.0.0 - 207.102.255.255 ca -207.103.0.0 - 207.105.95.31 us -207.105.95.32 - 207.105.95.48 uy -207.105.95.49 - 207.106.255.255 us -207.107.0.0 - 207.107.105.127 ca -207.107.105.128 - 207.107.105.135 us -207.107.105.136 - 207.107.255.255 ca +207.103.0.0 - 207.106.255.255 us +207.107.0.0 - 207.107.235.255 ca +207.107.236.0 - 207.107.236.255 us +207.107.237.0 - 207.107.255.255 ca 207.108.0.0 - 207.111.255.255 us -207.112.0.0 - 207.112.10.111 ca -207.112.10.112 - 207.112.10.119 us -207.112.10.120 - 207.112.12.143 ca -207.112.12.144 - 207.112.12.151 us -207.112.12.152 - 207.112.14.127 ca -207.112.14.128 - 207.112.14.135 us -207.112.14.136 - 207.112.106.127 ca -207.112.106.128 - 207.112.106.191 us -207.112.106.192 - 207.112.127.255 ca +207.112.0.0 - 207.112.127.255 ca 207.112.128.0 - 207.112.235.255 us 207.112.236.0 - 207.112.237.255 ca 207.112.238.0 - 207.115.95.255 us -207.115.96.0 - 207.115.101.23 ca -207.115.101.24 - 207.115.101.31 us -207.115.101.32 - 207.115.101.127 ca -207.115.101.128 - 207.115.101.255 us -207.115.102.0 - 207.115.102.111 ca -207.115.102.112 - 207.115.102.119 es -207.115.102.120 - 207.115.111.255 ca -207.115.112.0 - 207.116.255.255 us +207.115.96.0 - 207.115.111.255 ca +207.115.128.0 - 207.116.255.255 us 207.117.0.0 - 207.117.0.255 jp 207.117.1.0 - 207.117.1.255 de 207.117.2.0 - 207.117.2.255 gb @@ -131555,9 +106941,7 @@ 207.117.4.0 - 207.117.4.255 ch 207.117.5.0 - 207.117.5.255 us 207.117.6.0 - 207.117.6.255 at -207.117.7.0 - 207.117.7.127 us -207.117.7.128 - 207.117.7.254 mx -207.117.7.255 - 207.117.7.255 us +207.117.7.0 - 207.117.7.255 us 207.117.8.0 - 207.117.8.255 sg 207.117.9.0 - 207.117.9.255 hk 207.117.10.0 - 207.117.10.255 us @@ -131581,18 +106965,13 @@ 207.117.37.0 - 207.117.37.255 br 207.117.38.0 - 207.117.40.255 us 207.117.41.0 - 207.117.41.255 jp -207.117.42.0 - 207.117.44.63 us -207.117.44.64 - 207.117.44.127 pr -207.117.44.128 - 207.117.51.255 us +207.117.42.0 - 207.117.51.255 us 207.117.52.0 - 207.117.52.255 de 207.117.53.0 - 207.117.60.255 us 207.117.61.0 - 207.117.62.255 gb 207.117.63.0 - 207.117.65.255 us 207.117.66.0 - 207.117.66.255 hk -207.117.67.0 - 207.117.67.95 it -207.117.67.96 - 207.117.67.127 gb -207.117.67.128 - 207.117.67.255 fr -207.117.68.0 - 207.117.70.255 us +207.117.67.0 - 207.117.70.255 us 207.117.71.0 - 207.117.71.255 hk 207.117.72.0 - 207.117.72.255 us 207.117.73.0 - 207.117.73.255 fr @@ -131600,47 +106979,24 @@ 207.117.75.0 - 207.117.75.255 jp 207.117.76.0 - 207.117.77.255 ch 207.117.78.0 - 207.117.78.255 be -207.117.79.0 - 207.117.79.127 fi -207.117.79.128 - 207.117.86.127 us -207.117.86.128 - 207.117.86.191 it -207.117.86.192 - 207.117.86.255 de -207.117.87.0 - 207.117.90.63 us -207.117.90.64 - 207.117.90.127 nl -207.117.90.128 - 207.117.92.255 us +207.117.79.0 - 207.117.92.255 us 207.117.93.0 - 207.117.93.255 il 207.117.94.0 - 207.117.94.255 us 207.117.95.0 - 207.117.99.255 it -207.117.100.0 - 207.117.108.255 us -207.117.109.0 - 207.117.109.255 it -207.117.110.0 - 207.117.110.127 us -207.117.110.128 - 207.117.110.191 bg -207.117.110.192 - 207.117.110.255 au -207.117.111.0 - 207.117.111.255 hk -207.117.112.0 - 207.117.112.255 jp -207.117.113.0 - 207.117.113.255 kr +207.117.100.0 - 207.117.113.255 us 207.117.114.0 - 207.117.114.255 se 207.117.115.0 - 207.117.115.255 dk -207.117.116.0 - 207.117.116.127 us -207.117.116.128 - 207.117.116.255 nl -207.117.117.0 - 207.117.117.255 us +207.117.116.0 - 207.117.117.255 us 207.117.118.0 - 207.117.118.255 cl 207.117.119.0 - 207.117.119.255 no 207.117.120.0 - 207.117.120.255 us 207.117.121.0 - 207.117.121.255 ru 207.117.122.0 - 207.117.124.255 mx -207.117.125.0 - 207.117.133.127 us -207.117.133.128 - 207.117.133.191 es -207.117.133.192 - 207.117.141.127 us -207.117.141.128 - 207.117.141.255 pt -207.117.142.0 - 207.117.145.255 us +207.117.125.0 - 207.117.145.255 us 207.117.146.0 - 207.117.146.255 se -207.117.147.0 - 207.117.152.127 us -207.117.152.128 - 207.117.152.255 fr -207.117.153.0 - 207.117.154.255 us +207.117.147.0 - 207.117.154.255 us 207.117.155.0 - 207.117.155.255 za -207.117.156.0 - 207.117.156.63 us -207.117.156.64 - 207.117.156.127 gr -207.117.156.128 - 207.117.156.255 us +207.117.156.0 - 207.117.156.255 us 207.117.157.0 - 207.117.158.255 id 207.117.159.0 - 207.117.159.255 no 207.117.160.0 - 207.117.160.255 ch @@ -131681,14 +107037,11 @@ 207.117.214.0 - 207.117.214.255 mx 207.117.215.0 - 207.117.215.255 be 207.117.216.0 - 207.117.216.255 gr -207.117.217.0 - 207.117.217.255 ca +207.117.217.0 - 207.117.217.255 us 207.117.218.0 - 207.117.218.255 it 207.117.219.0 - 207.117.229.255 us 207.117.230.0 - 207.117.230.255 es -207.117.231.0 - 207.117.231.255 us -207.117.232.0 - 207.117.232.127 au -207.117.232.128 - 207.117.232.255 hu -207.117.233.0 - 207.117.233.255 us +207.117.231.0 - 207.117.233.255 us 207.117.234.0 - 207.117.234.255 jp 207.117.235.0 - 207.117.235.255 mx 207.117.236.0 - 207.117.236.255 br @@ -131700,265 +107053,267 @@ 207.122.110.0 - 207.122.111.255 fr 207.122.112.0 - 207.123.91.255 us 207.123.92.0 - 207.123.92.255 au -207.123.93.0 - 207.126.161.39 us -207.126.161.40 - 207.126.161.47 ca -207.126.161.48 - 207.133.255.255 us +207.123.93.0 - 207.133.255.255 us 207.134.0.0 - 207.134.255.255 ca 207.135.0.0 - 207.136.63.255 us -207.136.64.0 - 207.136.99.111 ca -207.136.99.112 - 207.136.99.127 us -207.136.99.128 - 207.136.127.255 ca -207.136.128.0 - 207.138.255.255 us -207.139.0.0 - 207.139.2.55 ca -207.139.2.56 - 207.139.2.63 us -207.139.2.64 - 207.139.2.159 ca -207.139.2.160 - 207.139.2.167 us -207.139.2.168 - 207.139.8.15 ca -207.139.8.16 - 207.139.8.23 us -207.139.8.24 - 207.139.8.39 ca -207.139.8.40 - 207.139.8.47 us -207.139.8.48 - 207.139.8.255 ca -207.139.9.0 - 207.139.9.7 us -207.139.9.8 - 207.139.9.23 ca -207.139.9.24 - 207.139.9.31 us -207.139.9.32 - 207.139.20.255 ca +207.136.64.0 - 207.136.127.255 ca +207.136.128.0 - 207.136.182.255 us +207.136.183.0 - 207.136.183.255 gb +207.136.184.0 - 207.138.94.233 us +207.138.94.234 - 207.138.94.234 de +207.138.94.235 - 207.138.119.127 us +207.138.119.128 - 207.138.119.255 nl +207.138.120.0 - 207.138.122.108 us +207.138.122.109 - 207.138.122.110 gb +207.138.122.111 - 207.138.144.31 us +207.138.144.32 - 207.138.144.35 ie +207.138.144.36 - 207.138.151.255 us +207.138.152.0 - 207.138.152.255 ch +207.138.153.0 - 207.139.2.63 us +207.139.2.64 - 207.139.2.71 ca +207.139.2.72 - 207.139.3.255 us +207.139.4.0 - 207.139.5.255 ca +207.139.6.0 - 207.139.6.255 us +207.139.7.0 - 207.139.7.255 ca +207.139.8.0 - 207.139.10.255 us +207.139.11.0 - 207.139.11.255 ca +207.139.12.0 - 207.139.12.255 us +207.139.13.0 - 207.139.15.255 ca +207.139.16.0 - 207.139.16.255 us +207.139.17.0 - 207.139.20.255 ca 207.139.21.0 - 207.139.21.255 ag -207.139.22.0 - 207.139.81.127 ca -207.139.81.128 - 207.139.81.255 ag -207.139.82.0 - 207.139.99.255 ca -207.139.100.0 - 207.139.100.255 us -207.139.101.0 - 207.139.115.127 ca -207.139.115.128 - 207.139.115.191 us -207.139.115.192 - 207.139.197.87 ca -207.139.197.88 - 207.139.197.95 us -207.139.197.96 - 207.139.214.191 ca -207.139.214.192 - 207.139.214.255 us -207.139.215.0 - 207.139.255.255 ca -207.140.0.0 - 207.147.255.255 us +207.139.22.0 - 207.139.22.255 us +207.139.23.0 - 207.139.23.255 ca +207.139.24.0 - 207.139.24.255 us +207.139.25.0 - 207.139.32.255 ca +207.139.33.0 - 207.139.33.255 us +207.139.34.0 - 207.139.34.255 ca +207.139.35.0 - 207.139.35.255 us +207.139.36.0 - 207.139.39.255 ca +207.139.40.0 - 207.139.43.255 us +207.139.44.0 - 207.139.49.255 ca +207.139.50.0 - 207.139.55.255 us +207.139.56.0 - 207.139.57.255 ca +207.139.58.0 - 207.139.58.255 us +207.139.59.0 - 207.139.69.255 ca +207.139.70.0 - 207.139.71.255 us +207.139.72.0 - 207.139.73.255 ca +207.139.74.0 - 207.139.76.255 us +207.139.77.0 - 207.139.80.255 ca +207.139.81.0 - 207.139.81.255 us +207.139.82.0 - 207.139.83.255 ca +207.139.84.0 - 207.139.84.143 us +207.139.84.144 - 207.139.84.159 ca +207.139.84.160 - 207.139.89.255 us +207.139.90.0 - 207.139.91.255 ca +207.139.92.0 - 207.139.92.255 us +207.139.93.0 - 207.139.93.255 ca +207.139.94.0 - 207.139.94.255 us +207.139.95.0 - 207.139.95.255 ca +207.139.96.0 - 207.139.96.255 us +207.139.97.0 - 207.139.97.255 ca +207.139.98.0 - 207.139.101.255 us +207.139.102.0 - 207.139.102.255 ca +207.139.103.0 - 207.139.106.255 us +207.139.107.0 - 207.139.107.255 ca +207.139.108.0 - 207.139.108.255 us +207.139.109.0 - 207.139.112.255 ca +207.139.113.0 - 207.139.115.255 us +207.139.116.0 - 207.139.122.255 ca +207.139.123.0 - 207.139.123.255 us +207.139.124.0 - 207.139.124.255 ca +207.139.125.0 - 207.139.125.255 us +207.139.126.0 - 207.139.137.255 ca +207.139.138.0 - 207.139.138.255 us +207.139.139.0 - 207.139.140.255 ca +207.139.141.0 - 207.139.141.255 us +207.139.142.0 - 207.139.154.255 ca +207.139.155.0 - 207.139.155.255 us +207.139.156.0 - 207.139.157.255 ca +207.139.158.0 - 207.139.158.255 us +207.139.159.0 - 207.139.160.255 ca +207.139.161.0 - 207.139.163.255 us +207.139.164.0 - 207.139.165.255 ca +207.139.166.0 - 207.139.166.255 us +207.139.167.0 - 207.139.167.255 ca +207.139.168.0 - 207.139.168.255 us +207.139.169.0 - 207.139.169.255 ca +207.139.170.0 - 207.139.170.255 us +207.139.171.0 - 207.139.171.255 ca +207.139.172.0 - 207.139.173.255 us +207.139.174.0 - 207.139.174.255 ca +207.139.175.0 - 207.139.175.255 us +207.139.176.0 - 207.139.177.255 ca +207.139.178.0 - 207.139.180.255 us +207.139.181.0 - 207.139.183.255 ca +207.139.184.0 - 207.139.186.255 us +207.139.187.0 - 207.139.187.255 ca +207.139.188.0 - 207.139.188.255 us +207.139.189.0 - 207.139.189.255 ca +207.139.190.0 - 207.139.190.255 us +207.139.191.0 - 207.139.191.255 ca +207.139.192.0 - 207.139.197.255 us +207.139.198.0 - 207.139.201.255 ca +207.139.202.0 - 207.139.202.255 us +207.139.203.0 - 207.139.204.255 ca +207.139.205.0 - 207.139.209.255 us +207.139.210.0 - 207.139.211.255 ca +207.139.212.0 - 207.139.212.255 us +207.139.213.0 - 207.139.213.255 ca +207.139.214.0 - 207.139.215.255 us +207.139.216.0 - 207.139.216.255 ca +207.139.217.0 - 207.139.220.255 us +207.139.221.0 - 207.139.223.255 ca +207.139.224.0 - 207.139.226.255 us +207.139.227.0 - 207.139.227.255 ca +207.139.228.0 - 207.139.228.255 us +207.139.229.0 - 207.139.232.255 ca +207.139.233.0 - 207.139.235.255 us +207.139.236.0 - 207.139.236.255 ca +207.139.237.0 - 207.139.237.111 us +207.139.237.112 - 207.139.237.127 ca +207.139.237.128 - 207.139.237.255 us +207.139.238.0 - 207.139.239.255 ca +207.139.240.0 - 207.139.253.255 us +207.139.254.0 - 207.139.254.255 ca +207.139.255.0 - 207.147.255.255 us 207.148.0.0 - 207.148.191.255 ca 207.148.192.0 - 207.150.239.255 us -207.150.240.0 - 207.150.251.7 pr -207.150.251.8 - 207.150.251.15 us -207.150.251.16 - 207.150.255.255 pr +207.150.240.0 - 207.150.255.255 pr 207.151.0.0 - 207.152.255.255 us 207.153.0.0 - 207.153.63.255 ca -207.153.64.0 - 207.157.255.255 us -207.158.0.0 - 207.158.63.255 a1 -207.158.64.0 - 207.158.225.4 us -207.158.225.5 - 207.158.225.5 be -207.158.225.6 - 207.160.255.255 us +207.153.64.0 - 207.160.255.255 us 207.161.0.0 - 207.162.127.255 ca -207.162.128.0 - 207.162.202.255 us -207.162.203.0 - 207.162.203.95 gb -207.162.203.96 - 207.163.255.255 us +207.162.128.0 - 207.163.255.255 us 207.164.0.0 - 207.164.255.255 ca 207.165.0.0 - 207.166.111.255 us -207.166.112.0 - 207.166.112.47 pr -207.166.112.48 - 207.166.112.55 vi -207.166.112.56 - 207.166.112.63 us -207.166.112.64 - 207.166.112.239 pr -207.166.112.240 - 207.166.112.247 vi -207.166.112.248 - 207.166.113.119 pr -207.166.113.120 - 207.166.113.127 vi -207.166.113.128 - 207.166.113.215 pr -207.166.113.216 - 207.166.113.223 vi -207.166.113.224 - 207.166.114.111 pr -207.166.114.112 - 207.166.114.127 us -207.166.114.128 - 207.166.114.143 pr -207.166.114.144 - 207.166.114.159 il -207.166.114.160 - 207.166.114.239 pr -207.166.114.240 - 207.166.114.247 us -207.166.114.248 - 207.166.127.255 pr +207.166.112.0 - 207.166.113.7 pr +207.166.113.8 - 207.166.113.15 us +207.166.113.16 - 207.166.113.199 pr +207.166.113.200 - 207.166.113.207 us +207.166.113.208 - 207.166.121.255 pr +207.166.122.0 - 207.166.123.255 us +207.166.124.0 - 207.166.127.255 pr 207.166.128.0 - 207.166.255.255 us 207.167.0.0 - 207.167.31.255 ca 207.167.32.0 - 207.167.191.255 us 207.167.192.0 - 207.167.255.255 ca -207.168.0.0 - 207.169.209.255 us +207.168.0.0 - 207.169.185.255 us +207.169.186.0 - 207.169.186.255 au +207.169.187.0 - 207.169.209.255 us 207.169.210.0 - 207.169.211.255 de -207.169.212.0 - 207.176.79.255 us +207.169.212.0 - 207.174.131.255 us +207.174.136.0 - 207.174.136.255 pr +207.174.137.0 - 207.174.151.255 us +207.174.156.0 - 207.174.157.255 us +207.174.158.0 - 207.174.159.255 ca +207.174.160.0 - 207.176.79.255 us 207.176.80.0 - 207.176.80.255 zm 207.176.81.0 - 207.176.83.255 us 207.176.84.0 - 207.176.84.255 zm 207.176.85.0 - 207.176.127.255 us 207.176.128.0 - 207.176.131.255 ca -207.176.132.0 - 207.176.132.31 us -207.176.132.32 - 207.176.145.95 ca -207.176.145.96 - 207.176.145.127 us -207.176.145.128 - 207.176.147.127 ca -207.176.147.128 - 207.176.147.191 us -207.176.147.192 - 207.176.148.255 ca +207.176.132.0 - 207.176.132.255 us +207.176.133.0 - 207.176.138.255 ca +207.176.139.0 - 207.176.139.255 us +207.176.140.0 - 207.176.144.255 ca +207.176.145.0 - 207.176.145.255 us +207.176.146.0 - 207.176.146.255 ca +207.176.147.0 - 207.176.147.255 us +207.176.148.0 - 207.176.148.255 ca 207.176.149.0 - 207.176.150.255 us 207.176.151.0 - 207.176.154.255 ca 207.176.155.0 - 207.176.155.255 us -207.176.156.0 - 207.176.159.31 ca -207.176.159.32 - 207.176.159.39 us -207.176.159.40 - 207.176.159.55 ca -207.176.159.56 - 207.176.159.63 us -207.176.159.64 - 207.176.159.135 ca -207.176.159.136 - 207.176.159.151 us -207.176.159.152 - 207.176.159.159 ca -207.176.159.160 - 207.176.159.167 us -207.176.159.168 - 207.176.159.207 ca -207.176.159.208 - 207.176.159.215 us -207.176.159.216 - 207.176.163.15 ca -207.176.163.16 - 207.176.163.31 us -207.176.163.32 - 207.176.163.47 ca -207.176.163.48 - 207.176.163.63 us -207.176.163.64 - 207.176.163.79 ca -207.176.163.80 - 207.176.163.95 us -207.176.163.96 - 207.176.163.111 ca -207.176.163.112 - 207.176.163.143 us -207.176.163.144 - 207.176.163.191 ca -207.176.163.192 - 207.176.163.223 us -207.176.163.224 - 207.176.163.239 ca -207.176.163.240 - 207.176.163.255 us -207.176.164.0 - 207.176.164.255 ca -207.176.165.0 - 207.176.165.255 us -207.176.166.0 - 207.176.166.31 ca -207.176.166.32 - 207.176.166.47 us -207.176.166.48 - 207.176.166.159 ca -207.176.166.160 - 207.176.166.175 us -207.176.166.176 - 207.176.166.239 ca -207.176.166.240 - 207.176.166.255 us -207.176.167.0 - 207.176.168.23 ca -207.176.168.24 - 207.176.168.39 us -207.176.168.40 - 207.176.168.47 ca -207.176.168.48 - 207.176.168.79 us -207.176.168.80 - 207.176.168.87 ca -207.176.168.88 - 207.176.168.143 us -207.176.168.144 - 207.176.168.175 ca -207.176.168.176 - 207.176.168.207 us -207.176.168.208 - 207.176.168.215 ca -207.176.168.216 - 207.176.168.223 us -207.176.168.224 - 207.176.169.63 ca -207.176.169.64 - 207.176.169.127 us -207.176.169.128 - 207.176.169.191 ca -207.176.169.192 - 207.176.170.63 us -207.176.170.64 - 207.176.172.23 ca -207.176.172.24 - 207.176.172.63 us -207.176.172.64 - 207.176.172.79 ca -207.176.172.80 - 207.176.172.95 us -207.176.172.96 - 207.176.172.127 ca -207.176.172.128 - 207.176.172.135 us -207.176.172.136 - 207.176.172.199 ca -207.176.172.200 - 207.176.172.215 us -207.176.172.216 - 207.176.175.127 ca -207.176.175.128 - 207.176.175.191 us -207.176.175.192 - 207.176.176.47 ca -207.176.176.48 - 207.176.176.79 us -207.176.176.80 - 207.176.180.15 ca -207.176.180.16 - 207.176.180.31 us -207.176.180.32 - 207.176.180.47 ca -207.176.180.48 - 207.176.180.63 us -207.176.180.64 - 207.176.180.95 ca -207.176.180.96 - 207.176.180.159 us -207.176.180.160 - 207.176.180.175 ca -207.176.180.176 - 207.176.180.191 us +207.176.156.0 - 207.176.158.255 ca +207.176.159.0 - 207.176.159.255 us +207.176.160.0 - 207.176.162.255 ca +207.176.163.0 - 207.176.166.143 us +207.176.166.144 - 207.176.166.159 ca +207.176.166.160 - 207.176.166.191 us +207.176.166.192 - 207.176.166.207 ca +207.176.166.208 - 207.176.166.255 us +207.176.167.0 - 207.176.167.255 ca +207.176.168.0 - 207.176.170.255 us +207.176.171.0 - 207.176.171.255 ca +207.176.172.0 - 207.176.172.255 us +207.176.173.0 - 207.176.173.255 ca +207.176.174.0 - 207.176.176.255 us +207.176.177.0 - 207.176.179.255 ca +207.176.180.0 - 207.176.180.191 us 207.176.180.192 - 207.176.180.207 ca -207.176.180.208 - 207.176.180.255 us -207.176.181.0 - 207.176.182.63 ca -207.176.182.64 - 207.176.182.95 us -207.176.182.96 - 207.176.183.255 ca -207.176.184.0 - 207.176.184.255 us -207.176.185.0 - 207.176.188.255 ca +207.176.180.208 - 207.176.182.255 us +207.176.183.0 - 207.176.183.255 ca +207.176.184.0 - 207.176.185.255 us +207.176.186.0 - 207.176.186.255 ca +207.176.187.0 - 207.176.187.255 us +207.176.188.0 - 207.176.188.255 ca 207.176.189.0 - 207.176.189.255 us -207.176.190.0 - 207.176.196.63 ca -207.176.196.64 - 207.176.196.255 us -207.176.197.0 - 207.176.199.127 ca -207.176.199.128 - 207.176.199.255 us +207.176.190.0 - 207.176.195.255 ca +207.176.196.0 - 207.176.196.255 us +207.176.197.0 - 207.176.198.255 ca +207.176.199.0 - 207.176.199.255 us 207.176.200.0 - 207.176.201.255 ca -207.176.202.0 - 207.176.202.31 us -207.176.202.32 - 207.176.202.127 ca -207.176.202.128 - 207.176.202.191 us -207.176.202.192 - 207.176.204.255 ca -207.176.205.0 - 207.176.207.255 us -207.176.208.0 - 207.176.208.255 ca -207.176.209.0 - 207.176.209.255 us -207.176.210.0 - 207.176.211.71 ca -207.176.211.72 - 207.176.211.103 us -207.176.211.104 - 207.176.211.119 ca -207.176.211.120 - 207.176.211.135 us -207.176.211.136 - 207.176.211.159 ca -207.176.211.160 - 207.176.211.199 us -207.176.211.200 - 207.176.214.7 ca -207.176.214.8 - 207.176.214.23 us -207.176.214.24 - 207.176.214.175 ca -207.176.214.176 - 207.176.214.183 us -207.176.214.184 - 207.176.214.191 ca -207.176.214.192 - 207.176.214.199 us -207.176.214.200 - 207.176.214.215 ca -207.176.214.216 - 207.176.214.223 us -207.176.214.224 - 207.176.214.255 ca -207.176.215.0 - 207.176.215.63 us -207.176.215.64 - 207.176.216.255 ca -207.176.217.0 - 207.176.217.127 us -207.176.217.128 - 207.176.217.191 ca -207.176.217.192 - 207.176.217.255 us -207.176.218.0 - 207.176.230.255 ca +207.176.202.0 - 207.176.202.255 us +207.176.203.0 - 207.176.204.255 ca +207.176.205.0 - 207.176.209.255 us +207.176.210.0 - 207.176.210.255 ca +207.176.211.0 - 207.176.211.255 us +207.176.212.0 - 207.176.212.255 ca +207.176.213.0 - 207.176.214.135 us +207.176.214.136 - 207.176.214.143 ca +207.176.214.144 - 207.176.215.255 us +207.176.216.0 - 207.176.216.255 ca +207.176.217.0 - 207.176.217.255 us +207.176.218.0 - 207.176.221.255 ca +207.176.222.0 - 207.176.222.255 us +207.176.223.0 - 207.176.230.255 ca 207.176.231.0 - 207.176.232.255 us -207.176.233.0 - 207.176.234.255 ca -207.176.235.0 - 207.176.236.255 us +207.176.233.0 - 207.176.233.255 ca +207.176.234.0 - 207.176.236.255 us 207.176.237.0 - 207.176.237.255 ca 207.176.238.0 - 207.176.238.255 us 207.176.239.0 - 207.176.239.255 ca 207.176.240.0 - 207.176.240.255 us 207.176.241.0 - 207.176.241.255 ca 207.176.242.0 - 207.176.242.255 us -207.176.243.0 - 207.176.249.255 ca +207.176.243.0 - 207.176.246.255 ca +207.176.247.0 - 207.176.247.255 us +207.176.248.0 - 207.176.249.255 ca 207.176.250.0 - 207.176.251.255 us 207.176.252.0 - 207.176.255.255 ca 207.177.0.0 - 207.179.127.255 us 207.179.128.0 - 207.179.191.255 ca -207.179.192.0 - 207.181.4.63 us -207.181.4.64 - 207.181.4.191 gb -207.181.4.192 - 207.181.63.255 us -207.181.64.0 - 207.181.117.63 ca -207.181.117.64 - 207.181.117.95 us -207.181.117.96 - 207.181.124.191 ca -207.181.124.192 - 207.181.124.223 us -207.181.124.224 - 207.181.127.255 ca +207.179.192.0 - 207.181.63.255 us +207.181.64.0 - 207.181.127.255 ca 207.181.128.0 - 207.183.31.255 us 207.183.32.0 - 207.183.63.255 ca -207.183.64.0 - 207.183.235.143 us -207.183.235.144 - 207.183.235.151 se -207.183.235.152 - 207.188.63.255 us +207.183.64.0 - 207.188.63.255 us 207.188.64.0 - 207.188.95.255 ca -207.188.96.0 - 207.189.79.223 us -207.189.79.224 - 207.189.79.239 gb -207.189.79.240 - 207.189.223.255 us +207.188.96.0 - 207.189.183.255 us +207.189.184.0 - 207.189.187.255 in +207.189.188.0 - 207.189.191.255 us +207.189.192.0 - 207.189.207.255 se +207.189.208.0 - 207.189.223.255 us 207.189.224.0 - 207.189.255.255 ca -207.190.0.0 - 207.191.159.255 us -207.191.160.0 - 207.191.175.255 ve -207.191.176.0 - 207.191.225.159 us -207.191.225.160 - 207.191.225.175 fr -207.191.225.176 - 207.191.239.255 us -207.191.240.0 - 207.191.247.255 vc -207.191.248.0 - 207.191.255.255 lc +207.190.0.0 - 207.191.239.255 us +207.191.240.0 - 207.191.252.255 vc +207.191.253.0 - 207.191.253.255 lc +207.191.254.0 - 207.191.255.255 vc 207.192.0.0 - 207.193.255.255 us -207.194.0.0 - 207.195.32.159 ca -207.195.32.160 - 207.195.32.191 us -207.195.32.192 - 207.195.36.95 ca -207.195.36.96 - 207.195.36.103 us -207.195.36.104 - 207.195.127.255 ca -207.195.128.0 - 207.195.239.255 us -207.195.240.0 - 207.195.255.255 a1 -207.196.0.0 - 207.198.98.199 us -207.198.98.200 - 207.198.98.213 ca -207.198.98.214 - 207.198.105.197 us -207.198.105.198 - 207.198.105.211 in -207.198.105.212 - 207.198.109.3 us -207.198.109.4 - 207.198.109.33 au -207.198.109.34 - 207.200.127.255 us +207.194.0.0 - 207.195.127.255 ca +207.195.128.0 - 207.199.132.255 us +207.199.133.0 - 207.199.135.255 ca +207.199.136.0 - 207.199.137.255 us +207.199.138.0 - 207.199.138.255 ca +207.199.139.0 - 207.199.175.255 us +207.199.176.0 - 207.199.176.255 ca +207.199.177.0 - 207.200.127.255 us 207.200.128.0 - 207.200.159.255 ca -207.200.160.0 - 207.203.88.255 us -207.203.89.0 - 207.203.89.15 fm -207.203.89.16 - 207.204.63.255 us +207.200.160.0 - 207.204.63.255 us 207.204.64.0 - 207.204.127.255 jm 207.204.128.0 - 207.204.191.255 pr 207.204.192.0 - 207.204.223.255 ca -207.204.224.0 - 207.207.204.63 us -207.207.204.64 - 207.207.204.79 de -207.207.204.80 - 207.208.255.255 us +207.204.224.0 - 207.208.255.255 us 207.209.0.0 - 207.209.0.255 gb 207.209.1.0 - 207.209.2.255 de 207.209.3.0 - 207.209.3.255 tw @@ -131983,17 +107338,12 @@ 207.209.27.0 - 207.209.27.255 cl 207.209.28.0 - 207.209.29.255 gb 207.209.30.0 - 207.209.30.255 fr -207.209.31.0 - 207.209.32.191 us -207.209.32.192 - 207.209.32.223 nl -207.209.32.224 - 207.209.33.63 us -207.209.33.64 - 207.209.33.95 za -207.209.33.96 - 207.209.35.255 us +207.209.31.0 - 207.209.35.255 us 207.209.36.0 - 207.209.36.255 it 207.209.37.0 - 207.209.37.255 us 207.209.38.0 - 207.209.42.255 gb 207.209.43.0 - 207.209.43.255 ch -207.209.44.0 - 207.209.44.63 fi -207.209.44.64 - 207.209.44.255 us +207.209.44.0 - 207.209.44.255 us 207.209.45.0 - 207.209.45.255 nl 207.209.46.0 - 207.209.47.255 no 207.209.48.0 - 207.209.48.255 nl @@ -132001,27 +107351,19 @@ 207.209.51.0 - 207.209.51.255 fr 207.209.52.0 - 207.209.52.255 de 207.209.53.0 - 207.209.53.255 be -207.209.54.0 - 207.209.54.159 us -207.209.54.160 - 207.209.54.191 lu -207.209.54.192 - 207.209.54.223 gb -207.209.54.224 - 207.209.54.255 us -207.209.55.0 - 207.209.55.127 ar -207.209.55.128 - 207.209.55.255 us +207.209.54.0 - 207.209.55.255 us 207.209.56.0 - 207.209.56.255 dk 207.209.57.0 - 207.209.57.255 id 207.209.58.0 - 207.209.58.255 pr 207.209.59.0 - 207.209.59.255 dk 207.209.60.0 - 207.209.60.255 nl 207.209.61.0 - 207.209.61.255 no -207.209.62.0 - 207.209.62.127 us -207.209.62.128 - 207.209.62.191 ch -207.209.62.192 - 207.209.62.255 fr +207.209.62.0 - 207.209.62.255 us 207.209.63.0 - 207.209.63.255 gb 207.209.64.0 - 207.209.64.255 ie 207.209.65.0 - 207.209.65.255 it 207.209.66.0 - 207.209.66.255 gb -207.209.67.0 - 207.209.69.191 us -207.209.69.192 - 207.209.69.255 fr +207.209.67.0 - 207.209.69.255 us 207.209.70.0 - 207.209.70.255 br 207.209.71.0 - 207.209.71.255 no 207.209.72.0 - 207.209.72.255 se @@ -132030,31 +107372,16 @@ 207.209.75.0 - 207.209.76.255 br 207.209.77.0 - 207.209.79.255 us 207.209.80.0 - 207.209.80.255 be -207.209.81.0 - 207.209.81.63 tr -207.209.81.64 - 207.209.81.255 us +207.209.81.0 - 207.209.81.255 us 207.209.82.0 - 207.209.82.255 be 207.209.83.0 - 207.209.83.255 nz -207.209.84.0 - 207.209.84.191 us -207.209.84.192 - 207.209.84.255 co -207.209.85.0 - 207.209.86.255 us +207.209.84.0 - 207.209.86.255 us 207.209.87.0 - 207.209.87.255 sg -207.209.88.0 - 207.209.88.31 us -207.209.88.32 - 207.209.88.63 br -207.209.88.64 - 207.209.88.127 cl -207.209.88.128 - 207.209.88.143 us -207.209.88.144 - 207.209.88.159 ar -207.209.88.160 - 207.209.88.191 us -207.209.88.192 - 207.209.88.255 ar +207.209.88.0 - 207.209.88.255 us 207.209.89.0 - 207.209.89.255 jp -207.209.90.0 - 207.209.90.255 us -207.209.91.0 - 207.209.91.255 au +207.209.90.0 - 207.209.91.255 us 207.209.92.0 - 207.209.92.255 be -207.209.93.0 - 207.209.93.31 us -207.209.93.32 - 207.209.93.63 sg -207.209.93.64 - 207.209.93.71 my -207.209.93.72 - 207.209.93.127 us -207.209.93.128 - 207.209.93.191 co -207.209.93.192 - 207.209.94.255 us +207.209.93.0 - 207.209.94.255 us 207.209.95.0 - 207.209.95.255 es 207.209.96.0 - 207.209.96.255 nl 207.209.97.0 - 207.209.98.255 us @@ -132073,16 +107400,12 @@ 207.209.115.0 - 207.209.115.255 us 207.209.116.0 - 207.209.116.255 se 207.209.117.0 - 207.209.117.255 nl -207.209.118.0 - 207.209.118.255 us -207.209.119.0 - 207.209.119.15 br -207.209.119.16 - 207.209.119.255 us +207.209.118.0 - 207.209.119.255 us 207.209.120.0 - 207.209.120.255 sg -207.209.121.0 - 207.209.121.63 ec -207.209.121.64 - 207.209.121.255 us +207.209.121.0 - 207.209.121.255 us 207.209.122.0 - 207.209.122.255 hk 207.209.123.0 - 207.209.123.255 sg -207.209.124.0 - 207.209.124.127 us -207.209.124.128 - 207.209.124.255 fr +207.209.124.0 - 207.209.124.255 us 207.209.125.0 - 207.209.125.255 de 207.209.126.0 - 207.209.126.255 us 207.209.127.0 - 207.209.128.255 gb @@ -132093,15 +107416,9 @@ 207.209.133.0 - 207.209.133.255 fr 207.209.134.0 - 207.209.134.255 be 207.209.135.0 - 207.209.135.255 ph -207.209.136.0 - 207.209.137.63 us -207.209.137.64 - 207.209.137.95 lu -207.209.137.96 - 207.209.137.127 us -207.209.137.128 - 207.209.137.159 ch -207.209.137.160 - 207.209.138.255 us +207.209.136.0 - 207.209.138.255 us 207.209.139.0 - 207.209.140.255 no -207.209.141.0 - 207.209.142.127 us -207.209.142.128 - 207.209.142.255 se -207.209.143.0 - 207.209.143.255 us +207.209.141.0 - 207.209.143.255 us 207.209.144.0 - 207.209.144.255 ch 207.209.145.0 - 207.209.145.255 au 207.209.146.0 - 207.209.146.255 no @@ -132131,20 +107448,13 @@ 207.209.170.0 - 207.209.170.255 sg 207.209.171.0 - 207.209.171.255 se 207.209.172.0 - 207.209.172.255 es -207.209.173.0 - 207.209.173.31 us -207.209.173.32 - 207.209.173.63 mx -207.209.173.64 - 207.209.173.127 us -207.209.173.128 - 207.209.173.159 mx -207.209.173.160 - 207.209.173.255 us +207.209.173.0 - 207.209.173.255 us 207.209.174.0 - 207.209.174.255 se 207.209.175.0 - 207.209.175.255 no 207.209.176.0 - 207.209.176.255 nl 207.209.177.0 - 207.209.177.255 fi 207.209.178.0 - 207.209.178.255 il -207.209.179.0 - 207.209.179.7 ch -207.209.179.8 - 207.209.179.31 us -207.209.179.32 - 207.209.179.63 fi -207.209.179.64 - 207.209.180.255 us +207.209.179.0 - 207.209.180.255 us 207.209.181.0 - 207.209.181.255 jp 207.209.182.0 - 207.209.182.255 us 207.209.183.0 - 207.209.183.255 be @@ -132163,9 +107473,7 @@ 207.209.203.0 - 207.209.203.255 jp 207.209.204.0 - 207.209.204.255 it 207.209.205.0 - 207.209.205.255 gb -207.209.206.0 - 207.209.206.127 us -207.209.206.128 - 207.209.206.255 cn -207.209.207.0 - 207.209.207.255 us +207.209.206.0 - 207.209.207.255 us 207.209.208.0 - 207.209.208.255 hk 207.209.209.0 - 207.209.209.255 us 207.209.210.0 - 207.209.210.255 kr @@ -132182,9 +107490,7 @@ 207.209.221.0 - 207.209.222.255 be 207.209.223.0 - 207.209.224.255 se 207.209.225.0 - 207.209.225.255 fr -207.209.226.0 - 207.209.226.31 us -207.209.226.32 - 207.209.226.47 cn -207.209.226.48 - 207.209.226.255 us +207.209.226.0 - 207.209.226.255 us 207.209.227.0 - 207.209.227.255 dk 207.209.228.0 - 207.209.228.255 be 207.209.229.0 - 207.209.229.255 sg @@ -132195,51 +107501,31 @@ 207.209.240.0 - 207.209.240.255 br 207.209.241.0 - 207.209.241.255 pt 207.209.242.0 - 207.209.242.255 dk -207.209.243.0 - 207.209.254.255 us -207.209.255.0 - 207.209.255.127 jp -207.209.255.128 - 207.209.255.255 us +207.209.243.0 - 207.209.255.255 us 207.210.0.0 - 207.210.63.255 ca -207.210.64.0 - 207.210.120.63 us -207.210.120.64 - 207.210.120.79 ca -207.210.120.80 - 207.210.207.255 us +207.210.64.0 - 207.210.163.255 us +207.210.164.0 - 207.210.164.255 gb +207.210.165.0 - 207.210.207.255 us 207.210.208.0 - 207.210.208.255 ca -207.210.209.0 - 207.210.211.111 us -207.210.211.112 - 207.210.211.119 ca -207.210.211.120 - 207.210.211.151 us -207.210.211.152 - 207.210.211.159 it -207.210.211.160 - 207.210.214.255 us -207.210.215.0 - 207.210.215.255 ca -207.210.216.0 - 207.210.239.103 us -207.210.239.104 - 207.210.239.111 hn -207.210.239.112 - 207.210.254.255 us -207.210.255.0 - 207.210.255.255 ca -207.211.0.0 - 207.215.255.255 us +207.210.209.0 - 207.210.219.255 us +207.210.220.0 - 207.210.220.255 ca +207.210.221.0 - 207.215.255.255 us 207.216.0.0 - 207.216.255.255 ca -207.217.0.0 - 207.218.64.255 us -207.218.65.0 - 207.218.65.15 gb -207.218.65.16 - 207.218.72.255 us +207.217.0.0 - 207.218.5.255 us +207.218.6.0 - 207.218.6.255 mx +207.218.7.0 - 207.218.72.255 us 207.218.73.0 - 207.218.73.255 dk 207.218.74.0 - 207.218.103.255 us 207.218.104.0 - 207.218.104.255 dk -207.218.105.0 - 207.218.126.255 us -207.218.127.0 - 207.218.127.255 dk -207.218.128.0 - 207.218.255.255 us +207.218.105.0 - 207.218.178.255 us +207.218.179.0 - 207.218.179.255 se +207.218.180.0 - 207.218.255.255 us 207.219.0.0 - 207.219.255.255 ca -207.220.0.0 - 207.223.35.127 us -207.223.35.128 - 207.223.35.135 ca -207.223.35.136 - 207.223.35.143 us -207.223.35.144 - 207.223.35.159 ca -207.223.35.160 - 207.223.35.175 us -207.223.35.176 - 207.223.35.191 ca -207.223.35.192 - 207.223.240.39 us -207.223.240.40 - 207.223.240.47 au -207.223.240.48 - 207.223.240.159 us -207.223.240.160 - 207.223.240.191 au -207.223.240.192 - 207.223.241.231 us -207.223.241.232 - 207.223.241.239 au -207.223.241.240 - 207.223.246.255 us -207.223.247.0 - 207.223.247.255 au -207.223.248.0 - 207.227.23.255 us +207.220.0.0 - 207.226.44.255 us +207.226.45.0 - 207.226.45.255 ru +207.226.46.0 - 207.226.140.255 us +207.226.141.0 - 207.226.142.255 cn +207.226.143.0 - 207.227.23.255 us 207.227.24.0 - 207.227.31.255 ca 207.227.32.0 - 207.228.63.255 us 207.228.64.0 - 207.228.127.255 ca @@ -132249,9 +107535,7 @@ 207.228.141.0 - 207.228.191.255 bm 207.228.192.0 - 207.228.255.255 us 207.229.0.0 - 207.229.63.255 ca -207.229.64.0 - 207.229.83.255 us -207.229.84.0 - 207.229.84.127 ca -207.229.84.128 - 207.230.49.255 us +207.229.64.0 - 207.230.49.255 us 207.230.50.0 - 207.230.50.255 kw 207.230.51.0 - 207.230.223.255 us 207.230.224.0 - 207.230.255.255 ca @@ -132262,289 +107546,208 @@ 207.231.240.0 - 207.231.255.255 us 207.232.0.0 - 207.232.63.255 il 207.232.64.0 - 207.232.95.255 us -207.232.96.0 - 207.232.100.175 ca -207.232.100.176 - 207.232.100.183 us -207.232.100.184 - 207.232.112.127 ca -207.232.112.128 - 207.232.112.135 us -207.232.112.136 - 207.232.119.31 ca -207.232.119.32 - 207.232.119.39 us -207.232.119.40 - 207.232.127.255 ca +207.232.96.0 - 207.232.127.255 ca 207.232.128.0 - 207.235.60.255 us 207.235.61.0 - 207.235.61.255 a2 207.235.62.0 - 207.235.255.255 us -207.236.0.0 - 207.236.42.255 ca -207.236.43.0 - 207.236.43.255 us -207.236.44.0 - 207.236.255.255 ca +207.236.0.0 - 207.236.255.255 ca 207.237.0.0 - 207.240.13.255 us 207.240.14.0 - 207.240.14.255 au -207.240.15.0 - 207.241.159.255 us -207.241.160.0 - 207.241.164.127 a2 -207.241.164.128 - 207.241.164.191 us -207.241.164.192 - 207.241.164.223 bg -207.241.164.224 - 207.241.164.239 by -207.241.164.240 - 207.241.166.255 a2 -207.241.167.0 - 207.241.167.255 us -207.241.168.0 - 207.241.168.255 al -207.241.169.0 - 207.241.169.255 a2 -207.241.170.0 - 207.241.172.255 ba -207.241.173.0 - 207.241.173.255 ro -207.241.174.0 - 207.241.174.255 al -207.241.175.0 - 207.241.176.255 jm -207.241.177.0 - 207.241.191.255 a2 -207.241.192.0 - 207.244.106.255 us +207.240.15.0 - 207.244.106.255 us 207.244.107.0 - 207.244.107.255 ca -207.244.108.0 - 207.244.255.255 us +207.244.108.0 - 207.244.139.255 us +207.244.140.0 - 207.244.143.255 ca +207.244.144.0 - 207.244.255.255 us 207.245.0.0 - 207.245.63.255 ca 207.245.64.0 - 207.245.191.255 us 207.245.192.0 - 207.245.255.255 ca -207.246.0.0 - 207.247.255.255 us -207.248.0.0 - 207.249.255.255 mx +207.246.0.0 - 207.246.204.255 us +207.246.205.0 - 207.246.205.255 gb +207.246.206.0 - 207.247.255.255 us +207.248.0.0 - 207.248.65.255 mx +207.248.66.0 - 207.248.67.255 hn +207.248.68.0 - 207.248.73.255 mx +207.248.74.0 - 207.248.77.255 ar +207.248.78.0 - 207.248.79.255 mx +207.248.82.0 - 207.248.84.255 mx +207.248.85.0 - 207.248.85.255 ar +207.248.88.0 - 207.248.91.255 mx +207.248.92.0 - 207.248.95.255 ar +207.248.96.0 - 207.248.100.255 mx +207.248.101.0 - 207.248.101.255 gt +207.248.104.0 - 207.248.120.255 mx +207.248.121.0 - 207.248.121.255 pe +207.248.122.0 - 207.248.122.255 mx +207.248.123.0 - 207.248.123.255 pe +207.248.124.0 - 207.248.127.255 ar +207.248.128.0 - 207.248.191.255 mx +207.248.192.0 - 207.248.223.255 cl +207.248.224.0 - 207.249.255.255 mx 207.250.0.0 - 207.251.31.255 us 207.251.32.0 - 207.251.47.255 ca 207.251.48.0 - 207.251.255.255 us 207.252.0.0 - 207.252.0.255 it 207.252.1.0 - 207.252.255.255 us 207.253.0.0 - 207.253.255.255 ca -207.254.0.0 - 207.254.127.255 us -207.254.128.0 - 207.254.143.255 jm -207.254.144.0 - 208.0.48.255 us -208.0.49.0 - 208.0.49.255 pr -208.0.50.0 - 208.0.221.255 us +207.254.0.0 - 207.254.179.255 us +207.254.180.0 - 207.254.183.255 cn +207.254.184.0 - 207.254.184.255 us +207.254.185.0 - 207.254.188.255 cn +207.254.189.0 - 208.0.95.255 us +208.0.96.0 - 208.0.103.255 bb +208.0.104.0 - 208.0.221.255 us 208.0.222.0 - 208.0.222.255 pr 208.0.223.0 - 208.0.223.255 us 208.0.224.0 - 208.0.224.255 dm 208.0.225.0 - 208.0.226.255 lc -208.0.227.0 - 208.0.227.151 ag -208.0.227.152 - 208.0.227.159 vg -208.0.227.160 - 208.0.228.255 ag +208.0.227.0 - 208.0.228.255 ag 208.0.229.0 - 208.0.229.255 vg 208.0.230.0 - 208.0.230.255 dm 208.0.231.0 - 208.0.231.255 lc 208.0.232.0 - 208.1.47.255 us 208.1.48.0 - 208.1.55.255 ph -208.1.56.0 - 208.1.59.215 us -208.1.59.216 - 208.1.59.223 ca -208.1.59.224 - 208.1.89.255 us -208.1.90.0 - 208.1.90.15 ca -208.1.90.16 - 208.1.104.63 us +208.1.56.0 - 208.1.104.63 us 208.1.104.64 - 208.1.104.79 pr -208.1.104.80 - 208.1.115.215 us -208.1.115.216 - 208.1.115.223 de -208.1.115.224 - 208.1.137.207 us -208.1.137.208 - 208.1.137.223 ca -208.1.137.224 - 208.1.188.239 us -208.1.188.240 - 208.1.188.247 gb -208.1.188.248 - 208.1.189.255 us +208.1.104.80 - 208.1.189.255 us 208.1.190.0 - 208.1.190.255 bo 208.1.191.0 - 208.4.179.255 us 208.4.180.0 - 208.4.181.255 pr -208.4.182.0 - 208.5.206.159 us -208.5.206.160 - 208.5.206.191 ca -208.5.206.192 - 208.8.169.255 us +208.4.182.0 - 208.8.169.255 us 208.8.170.0 - 208.8.171.255 co 208.8.172.0 - 208.9.47.255 us -208.9.48.0 - 208.9.63.255 co +208.9.48.0 - 208.9.55.255 co +208.9.56.0 - 208.9.56.255 ec +208.9.57.0 - 208.9.63.255 co 208.9.64.0 - 208.12.159.255 us 208.12.160.0 - 208.12.163.255 pr -208.12.164.0 - 208.15.38.175 us -208.15.38.176 - 208.15.38.191 ca -208.15.38.192 - 208.15.229.255 us +208.12.164.0 - 208.15.229.255 us 208.15.230.0 - 208.15.230.255 as 208.15.231.0 - 208.15.232.255 us 208.15.233.0 - 208.15.233.255 pr -208.15.234.0 - 208.16.89.143 us -208.16.89.144 - 208.16.89.159 ca -208.16.89.160 - 208.17.42.255 us +208.15.234.0 - 208.17.42.255 us 208.17.43.0 - 208.17.43.255 pr 208.17.44.0 - 208.18.150.255 us 208.18.151.0 - 208.18.151.255 pr -208.18.152.0 - 208.19.63.255 us -208.19.64.0 - 208.19.71.255 co -208.19.72.0 - 208.20.11.255 us -208.20.12.0 - 208.20.15.255 pr -208.20.16.0 - 208.23.198.239 us -208.23.198.240 - 208.23.198.247 pr -208.23.198.248 - 208.23.228.63 us -208.23.228.64 - 208.23.228.95 ca -208.23.228.96 - 208.23.248.63 us -208.23.248.64 - 208.23.248.79 pr -208.23.248.80 - 208.25.203.159 us -208.25.203.160 - 208.25.203.167 hr -208.25.203.168 - 208.25.229.231 us -208.25.229.232 - 208.25.229.239 pr -208.25.229.240 - 208.26.63.255 us +208.18.152.0 - 208.26.63.255 us 208.26.64.0 - 208.26.95.255 bm 208.26.96.0 - 208.27.181.255 us 208.27.182.0 - 208.27.187.255 vi -208.27.188.0 - 208.27.188.63 us -208.27.188.64 - 208.27.188.71 pr -208.27.188.72 - 208.28.41.199 us -208.28.41.200 - 208.28.41.207 dk -208.28.41.208 - 208.28.47.255 us -208.28.48.0 - 208.28.63.255 ca -208.28.64.0 - 208.29.127.255 us -208.29.128.0 - 208.29.135.255 co -208.29.136.0 - 208.30.39.255 us +208.27.188.0 - 208.30.39.255 us 208.30.40.0 - 208.30.41.255 co 208.30.42.0 - 208.30.95.255 us 208.30.96.0 - 208.30.127.255 vi -208.30.128.0 - 208.31.79.159 us -208.31.79.160 - 208.31.79.191 tw -208.31.79.192 - 208.31.169.255 us -208.31.170.0 - 208.31.170.255 pr -208.31.171.0 - 208.31.199.255 us +208.30.128.0 - 208.31.199.255 us 208.31.200.0 - 208.31.207.255 co -208.31.208.0 - 208.32.26.47 us -208.32.26.48 - 208.32.26.55 pr -208.32.26.56 - 208.33.11.255 us -208.33.12.0 - 208.33.12.255 an -208.33.13.0 - 208.33.34.255 us -208.33.35.0 - 208.33.35.7 pr -208.33.35.8 - 208.34.126.255 us -208.34.127.0 - 208.34.127.255 pr -208.34.128.0 - 208.35.3.255 us -208.35.4.0 - 208.35.7.255 co -208.35.8.0 - 208.35.19.255 us -208.35.20.0 - 208.35.21.255 co -208.35.22.0 - 208.35.53.167 us -208.35.53.168 - 208.35.53.175 pr -208.35.53.176 - 208.35.53.191 af -208.35.53.192 - 208.35.55.255 us +208.31.208.0 - 208.34.212.23 us +208.34.212.24 - 208.34.212.31 br +208.34.212.32 - 208.35.55.255 us 208.35.56.0 - 208.35.59.255 pr -208.35.60.0 - 208.35.66.23 us -208.35.66.24 - 208.35.66.31 it -208.35.66.32 - 208.35.66.167 us -208.35.66.168 - 208.35.66.175 au -208.35.66.176 - 208.35.67.111 us -208.35.67.112 - 208.35.67.127 hk -208.35.67.128 - 208.35.72.31 us -208.35.72.32 - 208.35.72.39 ve -208.35.72.40 - 208.35.95.255 us -208.35.96.0 - 208.35.105.255 co -208.35.106.0 - 208.35.111.255 us -208.35.112.0 - 208.35.127.255 co -208.35.128.0 - 208.35.197.255 us -208.35.198.0 - 208.35.198.15 dk -208.35.198.16 - 208.35.198.63 us -208.35.198.64 - 208.35.198.71 dk -208.35.198.72 - 208.35.198.87 us -208.35.198.88 - 208.35.198.111 au -208.35.198.112 - 208.37.255.255 us +208.35.60.0 - 208.37.255.255 us 208.38.0.0 - 208.38.63.255 ca -208.38.64.0 - 208.38.146.127 us -208.38.146.128 - 208.38.146.159 ch -208.38.146.160 - 208.42.228.231 us -208.42.228.232 - 208.42.228.239 gb -208.42.228.240 - 208.44.123.143 us -208.44.123.144 - 208.44.123.151 cn -208.44.123.152 - 208.45.142.223 us -208.45.142.224 - 208.45.142.239 il -208.45.142.240 - 208.45.232.255 us -208.45.233.0 - 208.45.239.255 pa -208.45.240.0 - 208.46.214.47 us -208.46.214.48 - 208.46.214.63 ca -208.46.214.64 - 208.47.213.127 us -208.47.213.128 - 208.47.213.255 ar -208.47.214.0 - 208.48.80.255 us -208.48.81.0 - 208.48.81.31 ca -208.48.81.32 - 208.48.81.39 us -208.48.81.40 - 208.48.81.47 de -208.48.81.48 - 208.48.81.63 au -208.48.81.64 - 208.48.81.127 us -208.48.81.128 - 208.48.81.255 au -208.48.82.0 - 208.48.82.255 us -208.48.83.0 - 208.48.83.63 au -208.48.83.64 - 208.49.206.63 us -208.49.206.64 - 208.49.206.79 de -208.49.206.80 - 208.50.36.143 us -208.50.36.144 - 208.50.36.159 de -208.50.36.160 - 208.50.99.15 us -208.50.99.16 - 208.50.99.31 fr -208.50.99.32 - 208.51.60.15 us -208.51.60.16 - 208.51.60.31 ae -208.51.60.32 - 208.52.0.255 us +208.38.64.0 - 208.43.225.51 us +208.43.225.52 - 208.43.225.52 a1 +208.43.225.53 - 208.45.233.255 us +208.45.234.0 - 208.45.239.255 pa +208.45.240.0 - 208.48.1.243 us +208.48.1.244 - 208.48.1.247 se +208.48.1.248 - 208.48.23.215 us +208.48.23.216 - 208.48.23.219 jp +208.48.23.220 - 208.48.152.255 us +208.48.153.0 - 208.48.153.255 fr +208.48.154.0 - 208.48.226.255 us +208.48.227.0 - 208.48.227.255 ca +208.48.228.0 - 208.48.228.255 us +208.48.229.0 - 208.48.229.255 gb +208.48.230.0 - 208.48.236.255 us +208.48.237.0 - 208.48.237.255 gb +208.48.238.0 - 208.49.22.130 us +208.49.22.131 - 208.49.22.131 ca +208.49.22.132 - 208.49.84.255 us +208.49.85.0 - 208.49.85.17 gb +208.49.85.18 - 208.49.85.19 us +208.49.85.20 - 208.49.85.33 gb +208.49.85.34 - 208.49.85.34 us +208.49.85.35 - 208.49.85.255 gb +208.49.86.0 - 208.49.96.255 us +208.49.97.0 - 208.49.97.255 gb +208.49.98.0 - 208.49.133.255 us +208.49.134.0 - 208.49.134.255 eu +208.49.135.0 - 208.49.155.255 us +208.49.156.0 - 208.49.156.255 gb +208.49.157.0 - 208.49.193.255 us +208.49.194.0 - 208.49.194.255 vi +208.49.195.0 - 208.49.210.127 us +208.49.210.128 - 208.49.210.143 eu +208.49.210.144 - 208.49.238.255 us +208.49.239.0 - 208.49.239.0 ca +208.49.239.1 - 208.49.239.1 ch +208.49.239.2 - 208.49.239.255 ca +208.49.240.0 - 208.50.5.14 us +208.50.5.15 - 208.50.5.15 de +208.50.5.16 - 208.50.77.255 us +208.50.78.0 - 208.50.79.255 vi +208.50.80.0 - 208.50.87.255 us +208.50.88.0 - 208.50.88.255 es +208.50.89.0 - 208.50.119.127 us +208.50.119.128 - 208.50.119.255 gb +208.50.120.0 - 208.50.123.255 us +208.50.124.0 - 208.50.124.255 vi +208.50.125.0 - 208.50.222.255 us +208.50.223.0 - 208.50.223.255 gb +208.50.224.0 - 208.50.238.255 us +208.50.239.0 - 208.50.239.224 gb +208.50.239.225 - 208.50.239.225 us +208.50.239.226 - 208.50.239.255 gb +208.50.240.0 - 208.51.18.255 us +208.51.19.0 - 208.51.19.255 gb +208.51.20.0 - 208.51.140.255 us +208.51.141.0 - 208.51.141.255 ar +208.51.142.0 - 208.52.0.255 us 208.52.1.0 - 208.52.1.255 a2 -208.52.2.0 - 208.52.7.255 us -208.52.8.0 - 208.52.11.255 ht -208.52.12.0 - 208.52.16.255 us +208.52.2.0 - 208.52.16.255 us 208.52.17.0 - 208.52.17.255 bo 208.52.18.0 - 208.52.18.255 us 208.52.19.0 - 208.52.19.255 bo -208.52.20.0 - 208.52.20.255 us -208.52.21.0 - 208.52.21.255 bo -208.52.22.0 - 208.52.37.255 ht -208.52.38.0 - 208.52.39.255 us -208.52.40.0 - 208.52.47.255 ht -208.52.48.0 - 208.52.49.255 us +208.52.20.0 - 208.52.49.255 us 208.52.50.0 - 208.52.53.255 py 208.52.54.0 - 208.52.78.255 us -208.52.79.0 - 208.52.79.255 a2 -208.52.80.0 - 208.53.15.31 us -208.53.15.32 - 208.53.15.63 de -208.53.15.64 - 208.53.22.255 us +208.52.79.0 - 208.52.79.255 cm +208.52.80.0 - 208.53.22.255 us 208.53.23.0 - 208.53.23.255 de -208.53.24.0 - 208.53.27.31 us -208.53.27.32 - 208.53.27.63 cy -208.53.27.64 - 208.54.175.255 us +208.53.24.0 - 208.54.175.255 us 208.54.176.0 - 208.54.191.255 pr 208.54.192.0 - 208.64.43.255 us 208.64.44.0 - 208.64.47.255 vg -208.64.48.0 - 208.64.75.255 us -208.64.76.0 - 208.64.79.255 bm -208.64.80.0 - 208.64.103.255 us +208.64.48.0 - 208.64.103.255 us 208.64.104.0 - 208.64.107.255 ca -208.64.108.0 - 208.64.122.251 us -208.64.122.252 - 208.64.122.255 bz -208.64.123.0 - 208.64.178.223 us +208.64.108.0 - 208.64.176.83 us +208.64.176.84 - 208.64.176.87 gb +208.64.176.88 - 208.64.178.223 us 208.64.178.224 - 208.64.178.231 hk 208.64.178.232 - 208.64.179.255 us 208.64.180.0 - 208.64.180.255 ae -208.64.181.0 - 208.64.181.11 us -208.64.181.12 - 208.64.181.15 tt -208.64.181.16 - 208.64.181.31 vg -208.64.181.32 - 208.64.181.191 us -208.64.181.192 - 208.64.181.199 ae -208.64.181.200 - 208.64.181.223 us -208.64.181.224 - 208.64.181.255 ae -208.64.182.0 - 208.64.182.23 us -208.64.182.24 - 208.64.182.27 ca -208.64.182.28 - 208.64.182.127 us -208.64.182.128 - 208.64.182.159 ca -208.64.182.160 - 208.64.183.135 us -208.64.183.136 - 208.64.183.143 ca -208.64.183.144 - 208.64.183.215 us -208.64.183.216 - 208.64.183.223 ng -208.64.183.224 - 208.64.188.191 us -208.64.188.192 - 208.64.188.207 kw -208.64.188.208 - 208.64.230.127 us -208.64.230.128 - 208.64.230.255 ca -208.64.231.0 - 208.64.239.255 us -208.64.248.0 - 208.65.59.255 us +208.64.181.0 - 208.65.59.255 us 208.65.60.0 - 208.65.63.255 ca -208.65.64.0 - 208.65.231.255 us -208.65.232.0 - 208.65.233.31 ca -208.65.233.32 - 208.65.233.39 us -208.65.233.40 - 208.65.235.255 ca +208.65.64.0 - 208.65.71.255 us +208.65.72.0 - 208.65.79.255 ca +208.65.80.0 - 208.65.231.255 us +208.65.232.0 - 208.65.235.255 ca 208.65.236.0 - 208.65.239.255 us 208.65.240.0 - 208.65.247.255 ca 208.65.248.0 - 208.65.255.255 us -208.66.0.0 - 208.66.1.63 ca -208.66.1.64 - 208.66.1.127 us -208.66.1.128 - 208.66.3.255 ca +208.66.0.0 - 208.66.3.255 ca 208.66.4.0 - 208.66.15.255 us 208.66.16.0 - 208.66.19.255 ca 208.66.20.0 - 208.66.47.255 us 208.66.48.0 - 208.66.55.255 ai -208.66.56.0 - 208.66.67.255 us +208.66.56.0 - 208.66.63.255 us 208.66.68.0 - 208.66.71.255 ca 208.66.72.0 - 208.66.91.255 us 208.66.92.0 - 208.66.95.255 ca -208.66.96.0 - 208.66.97.95 us -208.66.97.96 - 208.66.97.111 hk -208.66.97.112 - 208.66.111.255 us +208.66.96.0 - 208.66.111.255 us 208.66.112.0 - 208.66.119.255 ca -208.66.120.0 - 208.66.227.255 us -208.66.228.0 - 208.66.231.255 ca +208.66.120.0 - 208.66.223.255 us +208.66.224.0 - 208.66.231.255 ca 208.66.232.0 - 208.66.247.255 us 208.66.248.0 - 208.66.255.255 ca 208.67.0.0 - 208.67.91.255 us @@ -132553,305 +107756,81 @@ 208.67.144.0 - 208.67.151.255 ca 208.67.152.0 - 208.67.167.255 us 208.67.168.0 - 208.67.171.255 ca -208.67.172.0 - 208.67.192.97 us -208.67.192.98 - 208.67.192.105 jm -208.67.192.106 - 208.67.193.71 us -208.67.193.72 - 208.67.193.79 gb -208.67.193.80 - 208.67.193.129 us -208.67.193.130 - 208.67.193.137 jm -208.67.193.138 - 208.67.193.159 us -208.67.193.160 - 208.67.193.167 co -208.67.193.168 - 208.67.193.181 us -208.67.193.182 - 208.67.193.189 gb -208.67.193.190 - 208.67.197.209 us -208.67.197.210 - 208.67.197.217 ca -208.67.197.218 - 208.67.198.95 us -208.67.198.96 - 208.67.198.111 sb -208.67.198.112 - 208.67.198.159 us -208.67.198.160 - 208.67.198.173 pe -208.67.198.174 - 208.67.198.175 us -208.67.198.176 - 208.67.198.183 ca -208.67.198.184 - 208.67.198.207 us -208.67.198.208 - 208.67.198.215 vi -208.67.198.216 - 208.67.226.229 us -208.67.226.230 - 208.67.226.246 ca -208.67.226.247 - 208.67.227.139 us -208.67.227.140 - 208.67.227.157 ca -208.67.227.158 - 208.67.227.193 us -208.67.227.194 - 208.67.227.209 ca -208.67.227.210 - 208.67.248.143 us -208.67.248.144 - 208.67.248.159 au -208.67.248.160 - 208.67.248.167 us -208.67.248.168 - 208.67.248.175 ca -208.67.248.176 - 208.67.250.143 us -208.67.250.144 - 208.67.250.151 au -208.67.250.152 - 208.67.250.167 us -208.67.250.168 - 208.67.250.175 gb -208.67.250.176 - 208.67.252.23 us -208.67.252.24 - 208.67.252.31 gb -208.67.252.32 - 208.67.252.55 us -208.67.252.56 - 208.67.252.63 ca -208.67.252.64 - 208.67.252.79 us -208.67.252.80 - 208.67.252.87 gb -208.67.252.88 - 208.67.252.159 us -208.67.252.160 - 208.67.252.167 nl -208.67.252.168 - 208.68.15.255 us +208.67.172.0 - 208.68.15.255 us 208.68.16.0 - 208.68.19.255 ca -208.68.20.0 - 208.68.71.255 us +208.68.20.0 - 208.68.31.255 us +208.68.32.0 - 208.68.35.255 ca +208.68.36.0 - 208.68.71.255 us 208.68.72.0 - 208.68.75.255 ca 208.68.76.0 - 208.68.87.255 us 208.68.88.0 - 208.68.95.255 ca 208.68.96.0 - 208.68.103.255 us 208.68.104.0 - 208.68.107.255 ca -208.68.108.0 - 208.68.162.191 us -208.68.162.192 - 208.68.162.223 ch -208.68.162.224 - 208.68.199.255 us +208.68.108.0 - 208.68.199.255 us 208.68.200.0 - 208.68.207.255 ca 208.68.208.0 - 208.68.250.255 us 208.68.251.0 - 208.68.251.255 sn 208.68.252.0 - 208.69.7.255 us 208.69.8.0 - 208.69.15.255 ca -208.69.16.0 - 208.69.55.255 us -208.69.56.0 - 208.69.56.143 ca -208.69.56.144 - 208.69.56.164 fr -208.69.56.165 - 208.69.56.200 ca -208.69.56.201 - 208.69.56.208 ae -208.69.56.209 - 208.69.56.245 ca -208.69.56.246 - 208.69.56.254 fr -208.69.56.255 - 208.69.57.32 ca -208.69.57.33 - 208.69.57.56 ae -208.69.57.57 - 208.69.57.65 fr -208.69.57.66 - 208.69.57.100 ca -208.69.57.101 - 208.69.57.110 us -208.69.57.111 - 208.69.58.0 ca -208.69.58.1 - 208.69.58.17 ae -208.69.58.18 - 208.69.58.193 ca -208.69.58.194 - 208.69.58.207 us -208.69.58.208 - 208.69.59.243 ca -208.69.59.244 - 208.69.59.244 us -208.69.59.245 - 208.69.59.255 ca -208.69.60.0 - 208.69.93.127 us -208.69.93.128 - 208.69.93.167 ca -208.69.93.168 - 208.69.93.191 us -208.69.93.192 - 208.69.93.223 ca -208.69.93.224 - 208.69.176.63 us -208.69.176.64 - 208.69.176.127 au -208.69.176.128 - 208.69.177.95 us -208.69.177.96 - 208.69.177.111 ru -208.69.177.112 - 208.69.178.15 us -208.69.178.16 - 208.69.178.31 ca -208.69.178.32 - 208.69.179.127 us -208.69.179.128 - 208.69.179.191 in -208.69.179.192 - 208.69.181.127 us -208.69.181.128 - 208.69.181.159 bz -208.69.181.160 - 208.69.183.239 us -208.69.183.240 - 208.69.183.255 ca -208.69.184.0 - 208.69.230.135 us -208.69.230.136 - 208.69.230.143 au -208.69.230.144 - 208.69.230.159 us -208.69.230.160 - 208.69.230.167 in -208.69.230.168 - 208.69.231.127 us -208.69.231.128 - 208.69.231.159 gb -208.69.231.160 - 208.69.231.199 us -208.69.231.200 - 208.69.231.207 co -208.69.231.208 - 208.69.239.255 us +208.69.16.0 - 208.69.36.255 us +208.69.37.0 - 208.69.37.255 jp +208.69.38.0 - 208.69.55.255 us +208.69.56.0 - 208.69.59.255 ca +208.69.60.0 - 208.69.239.255 us 208.69.240.0 - 208.69.247.255 ca 208.69.248.0 - 208.69.251.255 us -208.69.252.0 - 208.70.7.255 ca -208.70.8.0 - 208.70.55.255 us +208.69.252.0 - 208.70.15.255 ca +208.70.16.0 - 208.70.55.255 us 208.70.56.0 - 208.70.63.255 ca -208.70.64.0 - 208.70.72.127 us -208.70.72.128 - 208.70.72.143 ae -208.70.72.144 - 208.70.72.207 us -208.70.72.208 - 208.70.72.223 pk -208.70.72.224 - 208.70.74.31 us -208.70.74.32 - 208.70.74.47 gb -208.70.74.48 - 208.70.77.127 us -208.70.77.128 - 208.70.77.159 th -208.70.77.160 - 208.70.77.175 ua -208.70.77.176 - 208.70.79.143 us -208.70.79.144 - 208.70.79.159 ua -208.70.79.160 - 208.70.91.255 us +208.70.64.0 - 208.70.91.255 us 208.70.92.0 - 208.70.95.255 kn 208.70.96.0 - 208.70.103.255 us 208.70.104.0 - 208.70.111.255 ca -208.70.112.0 - 208.70.165.255 us -208.70.166.0 - 208.70.167.255 gb -208.70.168.0 - 208.70.169.31 us -208.70.169.32 - 208.70.169.39 gb -208.70.169.40 - 208.70.169.191 us -208.70.169.192 - 208.70.169.255 gb -208.70.170.0 - 208.70.200.15 us -208.70.200.16 - 208.70.200.31 th -208.70.200.32 - 208.70.200.39 us -208.70.200.40 - 208.70.200.47 sc -208.70.200.48 - 208.70.200.79 us -208.70.200.80 - 208.70.200.87 sc -208.70.200.88 - 208.70.202.207 us -208.70.202.208 - 208.70.202.223 tw -208.70.202.224 - 208.70.206.63 us -208.70.206.64 - 208.70.206.127 sg -208.70.206.128 - 208.70.206.255 us -208.70.207.0 - 208.70.207.255 tw -208.70.208.0 - 208.70.211.255 us +208.70.112.0 - 208.70.211.255 us 208.70.212.0 - 208.70.215.255 ca 208.70.216.0 - 208.70.243.255 us 208.70.244.0 - 208.70.247.255 ca -208.70.248.0 - 208.70.252.175 us -208.70.252.176 - 208.70.252.183 gb -208.70.252.184 - 208.70.252.191 ro -208.70.252.192 - 208.70.253.111 us -208.70.253.112 - 208.70.253.127 co -208.70.253.128 - 208.70.253.143 us -208.70.253.144 - 208.70.253.159 mx -208.70.253.160 - 208.70.253.167 es -208.70.253.168 - 208.71.7.255 us +208.70.248.0 - 208.71.7.255 us 208.71.8.0 - 208.71.11.255 ca 208.71.12.0 - 208.71.87.255 us -208.71.88.0 - 208.71.89.255 ca -208.71.90.0 - 208.71.90.63 us -208.71.90.64 - 208.71.90.111 ca -208.71.90.112 - 208.71.90.127 us -208.71.90.128 - 208.71.91.255 ca +208.71.88.0 - 208.71.91.255 ca 208.71.92.0 - 208.71.111.255 us 208.71.112.0 - 208.71.119.255 ca -208.71.120.0 - 208.71.137.167 us -208.71.137.168 - 208.71.137.175 gb -208.71.137.176 - 208.71.140.255 us -208.71.141.0 - 208.71.141.7 au -208.71.141.8 - 208.71.141.15 us -208.71.141.16 - 208.71.141.23 ca -208.71.141.24 - 208.71.175.255 us +208.71.120.0 - 208.71.175.255 us 208.71.176.0 - 208.71.179.255 ca 208.71.180.0 - 208.71.183.255 us 208.71.184.0 - 208.71.187.255 ca -208.71.188.0 - 208.72.3.255 us +208.71.188.0 - 208.71.211.255 us +208.71.212.0 - 208.71.215.255 cn +208.71.216.0 - 208.72.3.255 us 208.72.4.0 - 208.72.7.255 ca -208.72.8.0 - 208.72.119.255 us +208.72.8.0 - 208.72.89.255 us +208.72.90.0 - 208.72.90.255 gb +208.72.91.0 - 208.72.119.255 us 208.72.120.0 - 208.72.127.255 ca -208.72.128.0 - 208.72.152.79 us -208.72.152.80 - 208.72.152.95 gb -208.72.152.96 - 208.72.152.143 us -208.72.152.144 - 208.72.152.159 au -208.72.152.160 - 208.72.152.191 ca -208.72.152.192 - 208.72.152.199 be -208.72.152.200 - 208.72.152.207 us -208.72.152.208 - 208.72.152.223 au -208.72.152.224 - 208.72.153.23 us -208.72.153.24 - 208.72.153.31 co -208.72.153.32 - 208.72.153.39 au -208.72.153.40 - 208.72.153.47 us -208.72.153.48 - 208.72.153.55 nz -208.72.153.56 - 208.72.153.167 us -208.72.153.168 - 208.72.153.175 gr -208.72.153.176 - 208.72.153.183 ca -208.72.153.184 - 208.72.154.7 us -208.72.154.8 - 208.72.154.15 ca -208.72.154.16 - 208.72.154.63 us -208.72.154.64 - 208.72.154.95 id -208.72.154.96 - 208.72.154.151 us -208.72.154.152 - 208.72.154.159 jo -208.72.154.160 - 208.72.154.167 us -208.72.154.168 - 208.72.154.175 br -208.72.154.176 - 208.72.154.179 ca -208.72.154.180 - 208.72.155.7 us -208.72.155.8 - 208.72.155.15 ca -208.72.155.16 - 208.72.155.23 ie -208.72.155.24 - 208.72.155.79 us -208.72.155.80 - 208.72.155.87 fr -208.72.155.88 - 208.72.155.95 us -208.72.155.96 - 208.72.155.103 gr -208.72.155.104 - 208.72.155.111 us -208.72.155.112 - 208.72.155.127 pt -208.72.155.128 - 208.72.155.143 us -208.72.155.144 - 208.72.155.151 tr -208.72.155.152 - 208.72.155.175 us -208.72.155.176 - 208.72.155.183 br -208.72.155.184 - 208.72.155.199 us -208.72.155.200 - 208.72.155.207 ru -208.72.155.208 - 208.72.155.211 es -208.72.155.212 - 208.72.158.255 us -208.72.159.0 - 208.72.159.15 bo -208.72.159.16 - 208.72.159.191 us -208.72.159.192 - 208.72.159.223 ca -208.72.159.224 - 208.72.167.255 us +208.72.128.0 - 208.72.167.255 us 208.72.168.0 - 208.72.179.255 ca -208.72.180.0 - 208.72.186.63 us -208.72.186.64 - 208.72.186.79 ca -208.72.186.80 - 208.72.190.63 us -208.72.190.64 - 208.72.190.79 ca -208.72.190.80 - 208.72.207.255 us +208.72.180.0 - 208.72.207.255 us 208.72.208.0 - 208.72.211.255 ca 208.72.212.0 - 208.72.227.255 us -208.72.228.0 - 208.72.228.95 gp -208.72.228.96 - 208.72.228.111 kn -208.72.228.112 - 208.72.228.135 gp -208.72.228.136 - 208.72.228.143 kn -208.72.228.144 - 208.72.228.175 gp -208.72.228.176 - 208.72.228.183 kn -208.72.228.184 - 208.72.228.255 gp +208.72.228.0 - 208.72.228.255 gp 208.72.229.0 - 208.72.229.255 dm 208.72.230.0 - 208.72.230.255 kn 208.72.231.0 - 208.72.231.255 dm -208.72.232.0 - 208.73.16.135 us -208.73.16.136 - 208.73.16.159 ca -208.73.16.160 - 208.73.17.31 us -208.73.17.32 - 208.73.17.255 ca -208.73.18.0 - 208.73.18.31 us -208.73.18.32 - 208.73.20.255 ca -208.73.21.0 - 208.73.21.39 us -208.73.21.40 - 208.73.21.47 ca -208.73.21.48 - 208.73.21.63 us -208.73.21.64 - 208.73.23.255 ca -208.73.24.0 - 208.73.35.112 us -208.73.35.113 - 208.73.35.142 ph -208.73.35.143 - 208.73.39.255 us +208.72.232.0 - 208.73.39.255 us 208.73.40.0 - 208.73.43.255 ca -208.73.44.0 - 208.73.48.24 us -208.73.48.25 - 208.73.48.35 gb -208.73.48.36 - 208.73.49.179 us -208.73.49.180 - 208.73.49.187 gb -208.73.49.188 - 208.73.51.89 us -208.73.51.90 - 208.73.51.99 fr -208.73.51.100 - 208.73.51.119 us -208.73.51.120 - 208.73.51.143 de -208.73.51.144 - 208.73.55.255 us +208.73.44.0 - 208.73.55.255 us 208.73.56.0 - 208.73.59.255 ca 208.73.60.0 - 208.73.75.255 us 208.73.76.0 - 208.73.79.255 ca -208.73.80.0 - 208.73.218.159 us -208.73.218.160 - 208.73.218.175 au -208.73.218.176 - 208.73.255.255 us +208.73.80.0 - 208.73.255.255 us 208.74.0.0 - 208.74.7.255 ca -208.74.8.0 - 208.74.8.255 us -208.74.9.0 - 208.74.9.15 no -208.74.9.16 - 208.74.9.23 us -208.74.9.24 - 208.74.9.255 no -208.74.10.0 - 208.74.23.255 us +208.74.8.0 - 208.74.23.255 us 208.74.24.0 - 208.74.27.255 ca 208.74.28.0 - 208.74.111.255 us -208.74.112.0 - 208.74.115.255 a2 -208.74.116.0 - 208.74.171.72 us -208.74.171.73 - 208.74.171.80 gb -208.74.171.81 - 208.74.171.85 us -208.74.171.86 - 208.74.171.93 es -208.74.171.94 - 208.74.171.166 us -208.74.171.167 - 208.74.171.174 gb -208.74.171.175 - 208.74.171.186 us -208.74.171.187 - 208.74.171.194 es -208.74.171.195 - 208.74.172.31 us -208.74.172.32 - 208.74.172.63 tr -208.74.172.64 - 208.74.173.173 us -208.74.173.174 - 208.74.173.194 ca -208.74.173.195 - 208.74.173.227 us -208.74.173.228 - 208.74.173.236 ca -208.74.173.237 - 208.74.174.31 us -208.74.174.32 - 208.74.174.63 tr -208.74.174.64 - 208.74.174.127 us -208.74.174.128 - 208.74.174.159 tr -208.74.174.160 - 208.74.175.0 us -208.74.175.1 - 208.74.175.31 cn -208.74.175.32 - 208.74.207.255 us +208.74.112.0 - 208.74.114.255 a2 +208.74.115.0 - 208.74.115.255 ug +208.74.116.0 - 208.74.207.255 us 208.74.208.0 - 208.74.215.255 ca 208.74.216.0 - 208.75.71.255 us 208.75.72.0 - 208.75.75.255 ca @@ -132859,7 +107838,8 @@ 208.75.116.0 - 208.75.119.255 ca 208.75.120.0 - 208.75.135.255 us 208.75.136.0 - 208.75.139.255 ca -208.75.140.0 - 208.75.187.255 us +208.75.140.0 - 208.75.151.255 us +208.75.160.0 - 208.75.187.255 us 208.75.188.0 - 208.75.191.255 ca 208.75.192.0 - 208.75.199.255 us 208.75.200.0 - 208.75.203.255 bm @@ -132868,44 +107848,10 @@ 208.76.44.0 - 208.76.71.255 us 208.76.72.0 - 208.76.75.255 ca 208.76.76.0 - 208.76.103.255 us -208.76.104.0 - 208.76.108.63 ca -208.76.108.64 - 208.76.108.127 us -208.76.108.128 - 208.76.111.127 ca -208.76.111.128 - 208.76.111.135 us -208.76.111.136 - 208.76.111.255 ca -208.76.112.0 - 208.76.220.31 us -208.76.220.32 - 208.76.220.39 ca -208.76.220.40 - 208.76.220.95 us -208.76.220.96 - 208.76.220.103 ca -208.76.220.104 - 208.76.220.127 us -208.76.220.128 - 208.76.220.135 ca -208.76.220.136 - 208.76.220.167 us -208.76.220.168 - 208.76.220.175 gb -208.76.220.176 - 208.76.220.183 jp -208.76.220.184 - 208.76.221.15 us -208.76.221.16 - 208.76.221.23 ca -208.76.221.24 - 208.76.221.31 us -208.76.221.32 - 208.76.221.39 ru -208.76.221.40 - 208.76.221.91 us -208.76.221.92 - 208.76.221.95 ar -208.76.221.96 - 208.76.221.223 us -208.76.221.224 - 208.76.221.231 gb -208.76.221.232 - 208.76.222.7 us -208.76.222.8 - 208.76.222.15 ca -208.76.222.16 - 208.76.222.119 us -208.76.222.120 - 208.76.222.127 gb -208.76.222.128 - 208.76.223.39 us -208.76.223.40 - 208.76.223.47 ca -208.76.223.48 - 208.76.223.91 us -208.76.223.92 - 208.76.223.95 eg -208.76.223.96 - 208.76.223.127 us -208.76.223.128 - 208.76.223.135 in -208.76.223.136 - 208.76.223.143 eg -208.76.223.144 - 208.76.227.255 us +208.76.104.0 - 208.76.111.255 ca +208.76.112.0 - 208.76.227.255 us 208.76.228.0 - 208.76.231.255 ca -208.76.232.0 - 208.76.248.167 us -208.76.248.168 - 208.76.248.175 mx -208.76.248.176 - 208.77.19.255 us +208.76.232.0 - 208.77.19.255 us 208.77.20.0 - 208.77.20.255 ca 208.77.21.0 - 208.77.79.255 us 208.77.80.0 - 208.77.87.255 ca @@ -132913,107 +107859,37 @@ 208.77.92.0 - 208.77.95.255 ca 208.77.96.0 - 208.77.139.255 us 208.77.140.0 - 208.77.143.255 ca -208.77.144.0 - 208.77.145.79 us -208.77.145.80 - 208.77.145.87 au -208.77.145.88 - 208.77.146.127 us -208.77.146.128 - 208.77.146.135 de -208.77.146.136 - 208.77.148.63 us -208.77.148.64 - 208.77.148.71 au -208.77.148.72 - 208.77.148.215 us -208.77.148.216 - 208.77.148.223 au -208.77.148.224 - 208.77.151.23 us -208.77.151.24 - 208.77.151.31 gb -208.77.151.32 - 208.77.151.95 us -208.77.151.96 - 208.77.151.103 gb -208.77.151.104 - 208.77.151.163 us -208.77.151.164 - 208.77.151.167 au -208.77.151.168 - 208.77.155.255 us +208.77.144.0 - 208.77.155.255 us 208.77.156.0 - 208.77.159.255 ca 208.77.160.0 - 208.77.195.255 us 208.77.196.0 - 208.77.199.255 ca -208.77.200.0 - 208.77.217.255 us -208.77.218.0 - 208.77.218.7 es -208.77.218.8 - 208.77.218.39 us -208.77.218.40 - 208.77.218.47 jp -208.77.218.48 - 208.77.218.55 au -208.77.218.56 - 208.77.218.63 mx -208.77.218.64 - 208.77.218.111 us -208.77.218.112 - 208.77.218.119 de -208.77.218.120 - 208.77.218.135 us -208.77.218.136 - 208.77.218.143 es -208.77.218.144 - 208.77.218.191 us -208.77.218.192 - 208.77.218.199 ky -208.77.218.200 - 208.77.221.127 us -208.77.221.128 - 208.77.221.143 au -208.77.221.144 - 208.77.221.207 us -208.77.221.208 - 208.77.221.223 au -208.77.221.224 - 208.77.223.7 us -208.77.223.8 - 208.77.223.15 ca -208.77.223.16 - 208.77.223.55 us -208.77.223.56 - 208.77.223.63 gb -208.77.223.64 - 208.77.223.87 us -208.77.223.88 - 208.77.223.95 au -208.77.223.96 - 208.77.223.103 gb -208.77.223.104 - 208.77.223.159 us -208.77.223.160 - 208.77.223.175 gb -208.77.223.176 - 208.77.223.239 us -208.77.223.240 - 208.77.223.247 es -208.77.223.248 - 208.78.15.255 us +208.77.200.0 - 208.78.15.255 us 208.78.16.0 - 208.78.19.255 ca 208.78.20.0 - 208.78.47.255 us 208.78.48.0 - 208.78.55.255 mf -208.78.56.0 - 208.78.56.127 a2 -208.78.56.128 - 208.78.56.159 gb -208.78.56.160 - 208.78.63.255 a2 +208.78.56.0 - 208.78.56.255 a2 +208.78.57.0 - 208.78.57.255 ng +208.78.58.0 - 208.78.59.255 a2 +208.78.60.0 - 208.78.60.255 ng +208.78.61.0 - 208.78.61.255 ly +208.78.62.0 - 208.78.63.255 a2 208.78.64.0 - 208.79.55.255 us 208.79.56.0 - 208.79.63.255 ca -208.79.64.0 - 208.79.89.31 us -208.79.89.32 - 208.79.89.39 ca -208.79.89.40 - 208.79.91.7 us -208.79.91.8 - 208.79.91.15 ch -208.79.91.16 - 208.79.91.47 us -208.79.91.48 - 208.79.91.55 au -208.79.91.56 - 208.79.92.15 us -208.79.92.16 - 208.79.92.31 au -208.79.92.32 - 208.79.92.111 us -208.79.92.112 - 208.79.92.119 au -208.79.92.120 - 208.79.92.175 us -208.79.92.176 - 208.79.92.183 ca -208.79.92.184 - 208.79.93.175 us -208.79.93.176 - 208.79.93.183 cz -208.79.93.184 - 208.79.95.47 us -208.79.95.48 - 208.79.95.55 jp -208.79.95.56 - 208.79.95.255 us +208.79.64.0 - 208.79.95.255 us 208.79.96.0 - 208.79.99.255 dm 208.79.100.0 - 208.79.111.255 us 208.79.112.0 - 208.79.115.255 ca 208.79.116.0 - 208.79.139.255 us 208.79.140.0 - 208.79.140.255 es -208.79.141.0 - 208.79.142.255 us -208.79.143.0 - 208.79.143.31 es -208.79.143.32 - 208.79.215.255 us +208.79.141.0 - 208.79.215.255 us 208.79.216.0 - 208.79.219.255 ca -208.79.220.0 - 208.80.10.87 us -208.80.10.88 - 208.80.10.95 gb -208.80.10.96 - 208.80.51.255 us +208.79.220.0 - 208.80.51.255 us 208.80.52.0 - 208.80.53.255 ca 208.80.54.0 - 208.80.95.255 us 208.80.96.0 - 208.80.103.255 ca -208.80.104.0 - 208.80.124.194 us -208.80.124.195 - 208.80.124.195 gb -208.80.124.196 - 208.80.125.194 us -208.80.125.195 - 208.80.125.195 gb -208.80.125.196 - 208.80.126.194 us -208.80.126.195 - 208.80.126.195 gb -208.80.126.196 - 208.80.127.194 us -208.80.127.195 - 208.80.127.195 gb -208.80.127.196 - 208.80.135.255 us +208.80.104.0 - 208.80.135.255 us 208.80.136.0 - 208.80.139.255 ca -208.80.140.0 - 208.80.180.1 us -208.80.180.2 - 208.80.180.64 gb -208.80.180.65 - 208.80.180.84 us -208.80.180.85 - 208.80.180.254 gb -208.80.180.255 - 208.80.182.255 us +208.80.144.0 - 208.80.182.255 us 208.80.183.0 - 208.80.183.255 ph 208.80.184.0 - 208.80.235.255 us 208.80.236.0 - 208.80.239.255 pr @@ -133029,21 +107905,13 @@ 208.81.160.0 - 208.81.163.255 kn 208.81.164.0 - 208.81.167.255 us 208.81.168.0 - 208.81.175.255 pr -208.81.176.0 - 208.81.176.48 us -208.81.176.49 - 208.81.176.56 sg -208.81.176.57 - 208.81.211.255 us +208.81.176.0 - 208.81.211.255 us 208.81.212.0 - 208.81.215.255 ca 208.81.216.0 - 208.82.87.255 us 208.82.88.0 - 208.82.95.255 ca 208.82.96.0 - 208.82.119.255 us 208.82.120.0 - 208.82.123.255 ca -208.82.124.0 - 208.82.129.127 us -208.82.129.128 - 208.82.129.143 pl -208.82.129.144 - 208.82.130.63 us -208.82.130.64 - 208.82.130.79 pl -208.82.130.80 - 208.82.131.239 us -208.82.131.240 - 208.82.131.255 pl -208.82.132.0 - 208.82.163.255 us +208.82.124.0 - 208.82.163.255 us 208.82.164.0 - 208.82.167.255 bm 208.82.168.0 - 208.82.215.255 us 208.82.216.0 - 208.82.219.255 ky @@ -133051,265 +107919,73 @@ 208.82.248.0 - 208.82.255.255 ca 208.83.0.0 - 208.83.79.255 us 208.83.80.0 - 208.83.87.255 ag -208.83.88.0 - 208.83.106.63 us -208.83.106.64 - 208.83.106.95 ca -208.83.106.96 - 208.83.111.159 us -208.83.111.160 - 208.83.111.175 ae -208.83.111.176 - 208.83.140.215 us -208.83.140.216 - 208.83.140.223 ar -208.83.140.224 - 208.83.140.239 us -208.83.140.240 - 208.83.140.247 in -208.83.140.248 - 208.83.142.79 us -208.83.142.80 - 208.83.142.87 pr -208.83.142.88 - 208.83.207.255 us +208.83.88.0 - 208.83.207.255 us 208.83.208.0 - 208.83.215.255 ca -208.83.216.0 - 208.83.221.47 us -208.83.221.48 - 208.83.221.55 se -208.83.221.56 - 208.83.232.31 us -208.83.232.32 - 208.83.232.39 br -208.83.232.40 - 208.83.232.63 us -208.83.232.64 - 208.83.232.71 ae -208.83.232.72 - 208.83.232.79 bd -208.83.232.80 - 208.83.232.87 gb -208.83.232.88 - 208.83.232.95 in -208.83.232.96 - 208.83.232.119 us -208.83.232.120 - 208.83.232.127 in -208.83.232.128 - 208.83.233.7 us -208.83.233.8 - 208.83.233.15 hk -208.83.233.16 - 208.83.233.47 us -208.83.233.48 - 208.83.233.55 nz -208.83.233.56 - 208.83.233.239 us -208.83.233.240 - 208.83.233.255 tr -208.83.234.0 - 208.83.234.39 us -208.83.234.40 - 208.83.234.47 gb -208.83.234.48 - 208.83.234.127 us -208.83.234.128 - 208.83.234.135 br -208.83.234.136 - 208.83.234.143 us -208.83.234.144 - 208.83.234.159 tr -208.83.234.160 - 208.83.234.191 ca -208.83.234.192 - 208.83.234.215 us -208.83.234.216 - 208.83.234.223 br -208.83.234.224 - 208.83.236.31 us -208.83.236.32 - 208.83.236.63 tr -208.83.236.64 - 208.83.236.223 us -208.83.236.224 - 208.83.236.255 tr -208.83.237.0 - 208.83.237.63 us -208.83.237.64 - 208.83.237.79 tr -208.83.237.80 - 208.83.249.79 us -208.83.249.80 - 208.83.249.87 ca -208.83.249.88 - 208.83.249.175 us -208.83.249.176 - 208.83.249.183 co -208.83.249.184 - 208.84.82.255 us +208.83.216.0 - 208.84.82.255 us 208.84.83.0 - 208.84.83.255 im 208.84.84.0 - 208.84.103.255 us 208.84.104.0 - 208.84.107.255 ca 208.84.108.0 - 208.84.191.255 us 208.84.192.0 - 208.84.199.255 vi 208.84.200.0 - 208.84.207.255 vc -208.84.208.0 - 208.85.16.103 us -208.85.16.104 - 208.85.16.111 in -208.85.16.112 - 208.85.16.119 fr -208.85.16.120 - 208.85.16.199 us -208.85.16.200 - 208.85.16.207 hr -208.85.16.208 - 208.85.16.239 us -208.85.16.240 - 208.85.16.247 gb -208.85.16.248 - 208.85.17.63 us -208.85.17.64 - 208.85.17.71 ca -208.85.17.72 - 208.85.17.135 us -208.85.17.136 - 208.85.17.143 vn -208.85.17.144 - 208.85.17.175 us -208.85.17.176 - 208.85.17.191 gb -208.85.17.192 - 208.85.18.151 us -208.85.18.152 - 208.85.18.159 az -208.85.18.160 - 208.85.19.15 us -208.85.19.16 - 208.85.19.23 ca -208.85.19.24 - 208.85.19.71 us -208.85.19.72 - 208.85.19.79 sg -208.85.19.80 - 208.85.19.87 in -208.85.19.88 - 208.85.79.255 us +208.84.208.0 - 208.85.79.255 us 208.85.80.0 - 208.85.87.255 ca 208.85.88.0 - 208.85.111.255 us 208.85.112.0 - 208.85.115.255 ca -208.85.116.0 - 208.85.174.255 us -208.85.175.0 - 208.85.175.63 in -208.85.175.64 - 208.85.215.255 us -208.85.216.0 - 208.85.223.255 ca -208.85.224.0 - 208.85.239.255 us -208.85.240.0 - 208.85.240.15 gb -208.85.240.16 - 208.85.240.31 us -208.85.240.32 - 208.85.240.47 ph -208.85.240.48 - 208.85.240.143 us -208.85.240.144 - 208.85.240.159 ca -208.85.240.160 - 208.85.240.239 us -208.85.240.240 - 208.85.240.255 in -208.85.241.0 - 208.85.241.175 us -208.85.241.176 - 208.85.241.191 in -208.85.241.192 - 208.85.242.47 us -208.85.242.48 - 208.85.242.63 gb -208.85.242.64 - 208.85.242.223 us -208.85.242.224 - 208.85.242.239 gb -208.85.242.240 - 208.85.243.31 us -208.85.243.32 - 208.85.243.47 gb -208.85.243.48 - 208.85.243.63 us -208.85.243.64 - 208.85.243.95 au -208.85.243.96 - 208.86.44.159 us -208.86.44.160 - 208.86.44.175 hk -208.86.44.176 - 208.86.45.63 us -208.86.45.64 - 208.86.45.127 il -208.86.45.128 - 208.86.135.255 us -208.86.136.0 - 208.86.139.255 a2 +208.85.116.0 - 208.85.211.255 us +208.85.212.0 - 208.85.223.255 ca +208.85.224.0 - 208.86.135.255 us +208.86.136.0 - 208.86.136.255 ca +208.86.137.0 - 208.86.137.255 us +208.86.138.0 - 208.86.139.255 a2 208.86.140.0 - 208.86.143.255 ca 208.86.144.0 - 208.86.203.255 us 208.86.204.0 - 208.86.207.255 ca 208.86.208.0 - 208.86.239.255 us 208.86.240.0 - 208.86.243.255 ca -208.86.244.0 - 208.86.249.255 us -208.86.250.0 - 208.86.250.31 ca -208.86.250.32 - 208.87.0.63 us -208.87.0.64 - 208.87.0.71 bd -208.87.0.72 - 208.87.0.79 ar -208.87.0.80 - 208.87.0.151 us -208.87.0.152 - 208.87.0.159 ar -208.87.0.160 - 208.87.0.167 us -208.87.0.168 - 208.87.0.175 a2 -208.87.0.176 - 208.87.0.191 sg -208.87.0.192 - 208.87.1.203 us -208.87.1.204 - 208.87.1.207 ar -208.87.1.208 - 208.87.3.71 us -208.87.3.72 - 208.87.3.79 bd -208.87.3.80 - 208.87.19.255 us +208.86.244.0 - 208.87.19.255 us 208.87.20.0 - 208.87.23.255 ca 208.87.24.0 - 208.87.29.255 us -208.87.30.0 - 208.87.30.255 ca +208.87.30.0 - 208.87.30.255 ru 208.87.31.0 - 208.87.31.255 us 208.87.32.0 - 208.87.39.255 bs 208.87.40.0 - 208.87.51.255 us 208.87.52.0 - 208.87.55.255 ca -208.87.56.0 - 208.87.120.149 us -208.87.120.150 - 208.87.120.165 au -208.87.120.166 - 208.87.143.255 us +208.87.56.0 - 208.87.143.255 us 208.87.144.0 - 208.87.147.255 kn -208.87.148.0 - 208.87.151.255 us -208.87.160.0 - 208.87.195.255 us +208.87.148.0 - 208.87.165.255 us +208.87.166.0 - 208.87.167.255 hk +208.87.168.0 - 208.87.170.255 us +208.87.171.0 - 208.87.171.255 lb +208.87.172.0 - 208.87.195.255 us 208.87.196.0 - 208.87.199.255 ca -208.87.200.0 - 208.87.240.33 us -208.87.240.34 - 208.87.240.42 in -208.87.240.43 - 208.87.241.30 us -208.87.241.31 - 208.87.241.52 in -208.87.241.53 - 208.87.241.65 us -208.87.241.66 - 208.87.241.90 in -208.87.241.91 - 208.87.241.99 us -208.87.241.100 - 208.87.241.125 in -208.87.241.126 - 208.87.242.117 us -208.87.242.118 - 208.87.242.125 in -208.87.242.126 - 208.87.243.21 us -208.87.243.22 - 208.87.243.29 in -208.87.243.30 - 208.87.243.97 us -208.87.243.98 - 208.87.243.110 in -208.87.243.111 - 208.87.243.145 us -208.87.243.146 - 208.87.243.151 in -208.87.243.152 - 208.88.3.255 us +208.87.200.0 - 208.88.3.255 us 208.88.4.0 - 208.88.7.255 ca -208.88.8.0 - 208.88.49.159 us -208.88.49.160 - 208.88.49.175 pl -208.88.49.176 - 208.88.49.191 us +208.88.8.0 - 208.88.49.191 us 208.88.49.192 - 208.88.49.207 in -208.88.49.208 - 208.88.49.255 us -208.88.50.0 - 208.88.50.15 pl -208.88.50.16 - 208.88.50.255 us -208.88.51.0 - 208.88.51.15 pl -208.88.51.16 - 208.88.51.255 us -208.88.52.0 - 208.88.52.15 pl -208.88.52.16 - 208.88.52.255 us -208.88.53.0 - 208.88.53.15 pl -208.88.53.16 - 208.88.53.255 us -208.88.54.0 - 208.88.54.15 pl -208.88.54.16 - 208.88.55.143 us -208.88.55.144 - 208.88.55.159 pl -208.88.55.160 - 208.88.107.255 us +208.88.49.208 - 208.88.107.255 us 208.88.108.0 - 208.88.111.255 ca 208.88.112.0 - 208.88.139.255 us 208.88.140.0 - 208.88.143.255 ca 208.88.144.0 - 208.88.183.255 us -208.88.184.0 - 208.88.185.255 ca -208.88.186.0 - 208.88.187.255 ee -208.88.188.0 - 208.88.191.255 ca +208.88.184.0 - 208.88.191.255 ca 208.88.192.0 - 208.88.195.255 us 208.88.196.0 - 208.88.199.255 ca -208.88.200.0 - 208.88.224.159 us -208.88.224.160 - 208.88.224.175 gb -208.88.224.176 - 208.88.224.191 us -208.88.224.192 - 208.88.224.223 vg -208.88.224.224 - 208.88.226.127 us -208.88.226.128 - 208.88.226.191 pa -208.88.226.192 - 208.88.226.255 us -208.88.227.0 - 208.88.227.31 ai -208.88.227.32 - 208.88.227.127 us -208.88.227.128 - 208.88.227.191 vg -208.88.227.192 - 208.89.47.255 us +208.88.200.0 - 208.89.47.255 us 208.89.48.0 - 208.89.55.255 ca 208.89.56.0 - 208.89.83.255 us 208.89.84.0 - 208.89.87.255 ca -208.89.88.0 - 208.89.104.119 us -208.89.104.120 - 208.89.104.123 sg -208.89.104.124 - 208.89.105.59 us -208.89.105.60 - 208.89.105.67 ke -208.89.105.68 - 208.89.105.155 us -208.89.105.156 - 208.89.105.194 br -208.89.105.195 - 208.89.105.195 us -208.89.105.196 - 208.89.105.203 ch -208.89.105.204 - 208.89.127.255 us +208.89.88.0 - 208.89.127.255 us 208.89.128.0 - 208.89.131.255 ca 208.89.132.0 - 208.89.191.255 us -208.89.192.0 - 208.89.199.255 a2 -208.89.200.0 - 208.89.208.212 us -208.89.208.213 - 208.89.208.213 bd -208.89.208.214 - 208.89.208.222 us -208.89.208.223 - 208.89.208.223 bd -208.89.208.224 - 208.89.210.34 us -208.89.210.35 - 208.89.210.35 bd -208.89.210.36 - 208.89.210.53 us -208.89.210.54 - 208.89.210.55 bd -208.89.210.56 - 208.89.210.79 us -208.89.210.80 - 208.89.210.87 gb -208.89.210.88 - 208.89.210.213 us -208.89.210.214 - 208.89.210.214 bd -208.89.210.215 - 208.89.210.241 us -208.89.210.242 - 208.89.210.243 co -208.89.210.244 - 208.89.212.222 us -208.89.212.223 - 208.89.212.225 no -208.89.212.226 - 208.89.213.45 us -208.89.213.46 - 208.89.213.47 id -208.89.213.48 - 208.89.214.21 us -208.89.214.22 - 208.89.214.22 es -208.89.214.23 - 208.89.214.128 us -208.89.214.129 - 208.89.214.129 bd -208.89.214.130 - 208.89.214.132 us -208.89.214.133 - 208.89.214.133 es -208.89.214.134 - 208.89.214.134 bd -208.89.214.135 - 208.89.214.142 us -208.89.214.143 - 208.89.214.143 es -208.89.214.144 - 208.89.214.170 us -208.89.214.171 - 208.89.214.172 lk -208.89.214.173 - 208.89.214.219 us -208.89.214.220 - 208.89.214.221 bd -208.89.214.222 - 208.89.214.224 us -208.89.214.225 - 208.89.214.232 bd -208.89.214.233 - 208.89.217.54 us -208.89.217.55 - 208.89.217.118 ca -208.89.217.119 - 208.89.217.182 us -208.89.217.183 - 208.89.217.246 ca -208.89.217.247 - 208.89.219.113 us -208.89.219.114 - 208.89.219.117 in -208.89.219.118 - 208.89.219.221 us -208.89.219.222 - 208.89.219.227 ca -208.89.219.228 - 208.89.220.79 us -208.89.220.80 - 208.89.220.87 ca -208.89.220.88 - 208.89.220.255 us -208.89.221.0 - 208.89.221.255 ca -208.89.222.0 - 208.89.227.255 us +208.89.192.0 - 208.89.196.255 a2 +208.89.197.0 - 208.89.197.255 ng +208.89.198.0 - 208.89.199.255 a2 +208.89.200.0 - 208.89.227.255 us 208.89.228.0 - 208.89.231.255 bm -208.89.232.0 - 208.90.79.255 us +208.89.232.0 - 208.90.67.255 us +208.90.68.0 - 208.90.71.255 ca +208.90.72.0 - 208.90.79.255 us 208.90.80.0 - 208.90.87.255 ca 208.90.88.0 - 208.90.95.255 us 208.90.96.0 - 208.90.103.255 ca @@ -133319,93 +107995,47 @@ 208.90.232.0 - 208.90.235.255 ca 208.90.236.0 - 208.90.239.255 us 208.90.240.0 - 208.90.247.255 ca -208.90.248.0 - 208.91.111.255 us -208.91.112.0 - 208.91.115.255 ca -208.91.116.0 - 208.91.128.79 us -208.91.128.80 - 208.91.128.95 gb -208.91.128.96 - 208.91.132.31 us -208.91.132.32 - 208.91.132.63 fr -208.91.132.64 - 208.91.191.255 us -208.91.192.0 - 208.91.194.255 gp -208.91.195.0 - 208.91.195.255 mf -208.91.196.0 - 208.91.199.255 vg -208.91.200.0 - 208.91.247.255 us +208.90.248.0 - 208.91.103.255 us +208.91.112.0 - 208.91.113.255 us +208.91.114.0 - 208.91.115.255 ca +208.91.116.0 - 208.91.191.255 us +208.91.192.0 - 208.91.195.255 mf +208.91.196.0 - 208.91.197.26 vg +208.91.197.27 - 208.91.197.27 us +208.91.197.28 - 208.91.197.255 vg +208.91.198.0 - 208.91.247.255 us 208.91.248.0 - 208.91.251.255 ca 208.91.252.0 - 208.92.15.255 us 208.92.16.0 - 208.92.23.255 ca -208.92.32.0 - 208.92.51.255 us +208.92.24.0 - 208.92.51.255 us 208.92.52.0 - 208.92.55.255 ca 208.92.56.0 - 208.92.111.255 us -208.92.112.0 - 208.92.112.239 a2 -208.92.112.240 - 208.92.113.255 ca -208.92.114.0 - 208.92.119.255 a2 -208.92.120.0 - 208.92.131.255 us -208.92.132.0 - 208.92.134.191 ca -208.92.134.192 - 208.92.134.255 us -208.92.135.0 - 208.92.143.255 ca -208.92.144.0 - 208.92.195.255 us -208.92.196.0 - 208.92.199.255 ca -208.92.200.0 - 208.92.231.255 us -208.92.232.0 - 208.92.232.103 ca -208.92.232.104 - 208.92.232.113 us -208.92.232.114 - 208.92.232.153 ca -208.92.232.154 - 208.92.232.197 gb -208.92.232.198 - 208.92.232.214 ca -208.92.232.215 - 208.92.232.224 us -208.92.232.225 - 208.92.233.20 ca -208.92.233.21 - 208.92.233.45 gb -208.92.233.46 - 208.92.233.71 ca -208.92.233.72 - 208.92.233.102 gb -208.92.233.103 - 208.92.233.103 ca -208.92.233.104 - 208.92.233.133 gb -208.92.233.134 - 208.92.233.138 ca -208.92.233.139 - 208.92.233.163 us -208.92.233.164 - 208.92.234.45 ca -208.92.234.46 - 208.92.234.60 pa -208.92.234.61 - 208.92.234.123 ca -208.92.234.124 - 208.92.234.133 us -208.92.234.134 - 208.92.234.158 ca -208.92.234.159 - 208.92.234.183 us -208.92.234.184 - 208.92.234.199 ca -208.92.234.200 - 208.92.234.234 au -208.92.234.235 - 208.92.235.34 ca -208.92.235.35 - 208.92.235.44 au -208.92.235.45 - 208.92.235.255 ca -208.92.236.0 - 208.93.99.191 us -208.93.99.192 - 208.93.99.255 ca -208.93.100.0 - 208.93.223.15 us -208.93.223.16 - 208.93.223.31 gb -208.93.223.32 - 208.93.231.255 us -208.93.232.0 - 208.93.232.239 ca -208.93.232.240 - 208.93.232.243 us -208.93.232.244 - 208.93.233.191 ca -208.93.233.192 - 208.93.233.195 us -208.93.233.196 - 208.93.239.255 ca +208.92.112.0 - 208.92.127.255 ca +208.92.128.0 - 208.92.131.255 us +208.92.132.0 - 208.92.143.255 ca +208.92.144.0 - 208.92.191.255 us +208.92.192.0 - 208.92.195.255 ca +208.92.196.0 - 208.92.231.255 us +208.92.232.0 - 208.92.232.224 ca +208.92.232.225 - 208.92.232.229 ru +208.92.232.230 - 208.92.235.255 ca +208.92.236.0 - 208.93.231.255 us +208.93.232.0 - 208.93.239.255 ca 208.93.240.0 - 208.94.27.255 us 208.94.28.0 - 208.94.31.255 ca -208.94.32.0 - 208.94.103.255 us +208.94.32.0 - 208.94.63.255 us +208.94.64.0 - 208.94.66.255 ca +208.94.67.0 - 208.94.103.255 us 208.94.104.0 - 208.94.111.255 ca -208.94.112.0 - 208.94.148.194 us -208.94.148.195 - 208.94.148.195 gb -208.94.148.196 - 208.94.149.194 us -208.94.149.195 - 208.94.149.195 gb -208.94.149.196 - 208.94.159.255 us +208.94.112.0 - 208.94.159.255 us 208.94.160.0 - 208.94.167.255 ca 208.94.168.0 - 208.94.169.255 dm 208.94.170.0 - 208.94.171.255 mf -208.94.172.0 - 208.94.172.95 ca -208.94.172.96 - 208.94.172.127 bd -208.94.172.128 - 208.94.174.191 ca -208.94.174.192 - 208.94.174.223 us -208.94.174.224 - 208.94.175.247 ca -208.94.175.248 - 208.94.175.251 us -208.94.175.252 - 208.94.175.255 ca +208.94.172.0 - 208.94.175.255 us 208.94.176.0 - 208.94.183.255 lc 208.94.184.0 - 208.94.195.255 us 208.94.196.0 - 208.94.199.255 ca -208.94.200.0 - 208.94.233.159 us -208.94.233.160 - 208.94.233.191 pa -208.94.233.192 - 208.94.234.255 us +208.94.200.0 - 208.94.234.255 us 208.94.235.0 - 208.94.235.255 pa 208.94.236.0 - 208.95.35.255 us 208.95.36.0 - 208.95.39.255 pr @@ -133418,337 +108048,66 @@ 208.96.144.0 - 208.97.63.255 us 208.97.64.0 - 208.97.127.255 ca 208.97.128.0 - 208.98.191.255 us -208.98.192.0 - 208.98.244.31 ca -208.98.244.32 - 208.98.244.63 us -208.98.244.64 - 208.98.255.255 ca +208.98.192.0 - 208.98.255.255 ca 208.99.0.0 - 208.99.127.255 us 208.99.128.0 - 208.99.159.255 ca -208.99.160.0 - 208.99.161.255 us -208.99.162.0 - 208.99.163.255 ca -208.99.164.0 - 208.99.207.255 us -208.99.208.0 - 208.99.208.63 ca -208.99.208.64 - 208.99.222.15 us -208.99.222.16 - 208.99.222.31 id -208.99.222.32 - 208.99.222.47 ca -208.99.222.48 - 208.100.25.67 us -208.100.25.68 - 208.100.25.69 gb -208.100.25.70 - 208.100.25.86 us -208.100.25.87 - 208.100.25.88 gb -208.100.25.89 - 208.101.63.255 us +208.99.160.0 - 208.99.162.55 us +208.99.162.56 - 208.99.162.63 ca +208.99.162.64 - 208.99.162.255 us +208.99.163.0 - 208.99.163.255 ca +208.99.164.0 - 208.101.63.255 us 208.101.64.0 - 208.101.127.255 ca 208.101.128.0 - 208.103.223.255 us 208.103.224.0 - 208.103.255.255 ca -208.104.0.0 - 208.110.15.255 us -208.110.16.0 - 208.110.31.255 a2 +208.104.0.0 - 208.110.20.255 us +208.110.21.0 - 208.110.21.255 bd +208.110.22.0 - 208.110.31.255 us 208.110.32.0 - 208.110.47.255 ca -208.110.48.0 - 208.110.64.127 us -208.110.64.128 - 208.110.64.135 tr -208.110.64.136 - 208.110.64.151 us -208.110.64.152 - 208.110.64.159 tr -208.110.64.160 - 208.110.64.175 us -208.110.64.176 - 208.110.64.191 tr -208.110.64.192 - 208.110.64.223 us -208.110.64.224 - 208.110.64.231 ca -208.110.64.232 - 208.110.65.79 us -208.110.65.80 - 208.110.65.95 ca -208.110.65.96 - 208.110.65.127 us -208.110.65.128 - 208.110.65.143 in -208.110.65.144 - 208.110.65.183 us -208.110.65.184 - 208.110.65.199 au -208.110.65.200 - 208.110.66.39 us -208.110.66.40 - 208.110.66.47 in -208.110.66.48 - 208.110.66.151 us -208.110.66.152 - 208.110.66.159 pk -208.110.66.160 - 208.110.67.95 us -208.110.67.96 - 208.110.67.127 au -208.110.67.128 - 208.110.68.103 us -208.110.68.104 - 208.110.68.111 pk -208.110.68.112 - 208.110.68.143 us -208.110.68.144 - 208.110.68.151 au -208.110.68.152 - 208.110.68.175 us -208.110.68.176 - 208.110.68.207 au -208.110.68.208 - 208.110.68.215 us -208.110.68.216 - 208.110.68.223 ca -208.110.68.224 - 208.110.68.231 au -208.110.68.232 - 208.110.68.239 us -208.110.68.240 - 208.110.68.247 pk -208.110.68.248 - 208.110.68.255 us -208.110.69.0 - 208.110.69.7 tr -208.110.69.8 - 208.110.69.23 us -208.110.69.24 - 208.110.69.31 au -208.110.69.32 - 208.110.69.71 us -208.110.69.72 - 208.110.69.79 my -208.110.69.80 - 208.110.69.87 ru -208.110.69.88 - 208.110.69.103 us -208.110.69.104 - 208.110.69.111 au -208.110.69.112 - 208.110.69.151 us -208.110.69.152 - 208.110.69.175 au -208.110.69.176 - 208.110.69.255 us -208.110.70.0 - 208.110.70.127 au -208.110.70.128 - 208.110.70.167 us -208.110.70.168 - 208.110.70.175 au -208.110.70.176 - 208.110.70.255 us -208.110.71.0 - 208.110.71.31 au -208.110.71.32 - 208.110.71.39 pt -208.110.71.40 - 208.110.71.47 gb -208.110.71.48 - 208.110.71.63 us -208.110.71.64 - 208.110.71.95 tr -208.110.71.96 - 208.110.71.143 us -208.110.71.144 - 208.110.71.159 au -208.110.71.160 - 208.110.71.167 us -208.110.71.168 - 208.110.71.175 br -208.110.71.176 - 208.110.71.215 us -208.110.71.216 - 208.110.71.223 de -208.110.71.224 - 208.110.71.255 us -208.110.72.0 - 208.110.72.15 au -208.110.72.16 - 208.110.72.23 us -208.110.72.24 - 208.110.72.31 au -208.110.72.32 - 208.110.72.47 us -208.110.72.48 - 208.110.72.63 au -208.110.72.64 - 208.110.72.79 us -208.110.72.80 - 208.110.72.95 au -208.110.72.96 - 208.110.72.111 us -208.110.72.112 - 208.110.72.119 au -208.110.72.120 - 208.110.73.7 us -208.110.73.8 - 208.110.73.15 au -208.110.73.16 - 208.110.73.23 us -208.110.73.24 - 208.110.73.31 pk -208.110.73.32 - 208.110.73.47 us -208.110.73.48 - 208.110.73.79 au -208.110.73.80 - 208.110.73.95 us -208.110.73.96 - 208.110.73.103 no -208.110.73.104 - 208.110.92.255 us -208.110.93.0 - 208.110.93.7 ru -208.110.93.8 - 208.110.94.39 us -208.110.94.40 - 208.110.94.47 tr -208.110.94.48 - 208.110.95.255 us +208.110.48.0 - 208.110.95.255 us 208.110.96.0 - 208.110.127.255 ca -208.110.128.0 - 208.111.32.159 us -208.111.32.160 - 208.111.32.191 jp -208.111.32.192 - 208.111.63.255 us +208.110.128.0 - 208.111.41.255 us +208.111.42.0 - 208.111.42.255 hk +208.111.43.0 - 208.111.47.255 us +208.111.48.0 - 208.111.55.255 jp +208.111.56.0 - 208.111.63.255 us 208.111.64.0 - 208.111.95.255 ca -208.111.96.0 - 208.112.1.31 us -208.112.1.32 - 208.112.1.47 au -208.112.1.48 - 208.112.1.111 us -208.112.1.112 - 208.112.1.127 de -208.112.1.128 - 208.112.19.63 us -208.112.19.64 - 208.112.19.127 ca -208.112.19.128 - 208.112.27.199 us -208.112.27.200 - 208.112.27.207 ca -208.112.27.208 - 208.112.30.31 us -208.112.30.32 - 208.112.30.47 ca -208.112.30.48 - 208.112.32.247 us -208.112.32.248 - 208.112.32.255 ae -208.112.33.0 - 208.112.38.15 us -208.112.38.16 - 208.112.38.23 pk -208.112.38.24 - 208.112.38.31 us -208.112.38.32 - 208.112.38.39 ae -208.112.38.40 - 208.112.38.47 us -208.112.38.48 - 208.112.38.63 ca -208.112.38.64 - 208.112.53.159 us -208.112.53.160 - 208.112.53.167 gb -208.112.53.168 - 208.112.63.255 us -208.112.64.0 - 208.112.64.31 gb -208.112.64.32 - 208.112.64.55 us -208.112.64.56 - 208.112.64.95 gb -208.112.64.96 - 208.112.68.231 us -208.112.68.232 - 208.112.68.239 il -208.112.68.240 - 208.112.71.95 us -208.112.71.96 - 208.112.71.111 pk -208.112.71.112 - 208.112.75.255 us +208.111.96.0 - 208.112.75.255 us 208.112.76.0 - 208.112.76.255 il -208.112.77.0 - 208.112.78.15 us -208.112.78.16 - 208.112.78.31 ca -208.112.78.32 - 208.112.83.159 us -208.112.83.160 - 208.112.83.191 au -208.112.83.192 - 208.112.87.215 us -208.112.87.216 - 208.112.87.223 ca -208.112.87.224 - 208.112.92.127 us -208.112.92.128 - 208.112.92.143 au -208.112.92.144 - 208.112.92.223 us -208.112.92.224 - 208.112.92.239 gb -208.112.92.240 - 208.112.93.223 us -208.112.93.224 - 208.112.93.239 jp -208.112.93.240 - 208.112.94.103 us -208.112.94.104 - 208.112.94.111 pk -208.112.94.112 - 208.112.100.255 us -208.112.101.0 - 208.112.101.31 es -208.112.101.32 - 208.112.101.103 us -208.112.101.104 - 208.112.101.111 ca -208.112.101.112 - 208.112.103.47 us -208.112.103.48 - 208.112.103.55 ae -208.112.103.56 - 208.112.107.31 us -208.112.107.32 - 208.112.107.39 mx -208.112.107.40 - 208.112.107.79 us -208.112.107.80 - 208.112.107.87 mx -208.112.107.88 - 208.112.107.127 us -208.112.107.128 - 208.112.107.143 ae -208.112.107.144 - 208.112.109.119 us -208.112.109.120 - 208.112.109.191 ca -208.112.109.192 - 208.112.109.207 us -208.112.109.208 - 208.112.109.223 th -208.112.109.224 - 208.112.109.231 gb -208.112.109.232 - 208.112.110.31 us -208.112.110.32 - 208.112.110.47 th -208.112.110.48 - 208.112.110.111 us -208.112.110.112 - 208.112.110.119 gb -208.112.110.120 - 208.112.115.15 us -208.112.115.16 - 208.112.115.23 in -208.112.115.24 - 208.112.115.95 us -208.112.115.96 - 208.112.115.111 au -208.112.115.112 - 208.112.116.111 us -208.112.116.112 - 208.112.116.119 ch -208.112.116.120 - 208.112.116.255 us -208.112.117.0 - 208.112.117.31 ch -208.112.117.32 - 208.112.117.159 us -208.112.117.160 - 208.112.117.167 ca -208.112.117.168 - 208.112.121.175 us -208.112.121.176 - 208.112.121.183 ca -208.112.121.184 - 208.112.126.167 us -208.112.126.168 - 208.112.126.175 ch -208.112.126.176 - 208.112.126.223 us -208.112.126.224 - 208.112.126.231 pk -208.112.126.232 - 208.112.255.255 us +208.112.77.0 - 208.112.255.255 us 208.113.0.0 - 208.113.63.255 ca -208.113.64.0 - 208.114.96.255 us -208.114.97.0 - 208.114.97.15 nl -208.114.97.16 - 208.114.97.119 us -208.114.97.120 - 208.114.97.142 dz -208.114.97.143 - 208.114.98.255 us -208.114.99.0 - 208.114.103.255 a2 -208.114.104.0 - 208.114.109.255 us -208.114.110.0 - 208.114.110.159 nl -208.114.110.160 - 208.114.113.255 us -208.114.114.0 - 208.114.114.127 hk -208.114.114.128 - 208.114.114.159 us -208.114.114.160 - 208.114.114.191 hk -208.114.114.192 - 208.114.115.135 us -208.114.115.136 - 208.114.115.143 no -208.114.115.144 - 208.114.115.231 us -208.114.115.232 - 208.114.115.239 gb -208.114.115.240 - 208.114.116.7 us +208.113.64.0 - 208.114.98.255 us +208.114.99.0 - 208.114.101.255 a2 +208.114.102.0 - 208.114.116.7 us 208.114.116.8 - 208.114.116.15 mt -208.114.116.16 - 208.114.116.23 us -208.114.116.24 - 208.114.116.31 gb +208.114.116.16 - 208.114.116.31 us 208.114.116.32 - 208.114.116.39 pt 208.114.116.40 - 208.114.116.47 mt 208.114.116.48 - 208.114.116.167 us 208.114.116.168 - 208.114.116.175 mt -208.114.116.176 - 208.114.116.183 us -208.114.116.184 - 208.114.116.191 tn -208.114.116.192 - 208.114.116.199 us -208.114.116.200 - 208.114.116.207 gb +208.114.116.176 - 208.114.116.207 us 208.114.116.208 - 208.114.116.215 mt 208.114.116.216 - 208.114.118.255 us 208.114.119.0 - 208.114.119.255 gb 208.114.120.0 - 208.114.120.255 nl -208.114.121.0 - 208.114.121.31 us -208.114.121.32 - 208.114.121.39 es -208.114.121.40 - 208.114.121.95 us -208.114.121.96 - 208.114.121.103 no -208.114.121.104 - 208.114.121.127 us -208.114.121.128 - 208.114.121.143 gb -208.114.121.144 - 208.114.121.159 us -208.114.121.160 - 208.114.121.167 gb -208.114.121.168 - 208.114.122.47 us -208.114.122.48 - 208.114.122.55 no -208.114.122.56 - 208.114.122.87 us -208.114.122.88 - 208.114.122.95 es -208.114.122.96 - 208.114.122.119 gb -208.114.122.120 - 208.114.122.135 us -208.114.122.136 - 208.114.122.143 no -208.114.122.144 - 208.114.122.183 us -208.114.122.184 - 208.114.122.191 es -208.114.122.192 - 208.114.122.199 us -208.114.122.200 - 208.114.122.207 es -208.114.122.208 - 208.114.122.255 us -208.114.123.0 - 208.114.123.135 dk -208.114.123.136 - 208.114.123.143 no -208.114.123.144 - 208.114.123.159 dk -208.114.123.160 - 208.114.123.175 us -208.114.123.176 - 208.114.123.183 dk -208.114.123.184 - 208.114.123.191 es -208.114.123.192 - 208.114.125.255 us -208.114.126.0 - 208.114.126.7 gb -208.114.126.8 - 208.114.126.175 us -208.114.126.176 - 208.114.126.191 es -208.114.126.192 - 208.114.126.199 us -208.114.126.200 - 208.114.126.207 es -208.114.126.208 - 208.114.127.255 us +208.114.121.0 - 208.114.127.255 us 208.114.128.0 - 208.114.191.255 ca -208.114.192.0 - 208.115.112.55 us -208.115.112.56 - 208.115.112.63 sg -208.115.112.64 - 208.115.112.151 us -208.115.112.152 - 208.115.112.159 ir -208.115.112.160 - 208.115.113.191 us -208.115.113.192 - 208.115.113.223 gb -208.115.113.224 - 208.115.114.191 us -208.115.114.192 - 208.115.114.223 ca -208.115.114.224 - 208.115.116.47 us -208.115.116.48 - 208.115.116.63 ca -208.115.116.64 - 208.115.117.79 us -208.115.117.80 - 208.115.117.95 ca -208.115.117.96 - 208.115.139.255 us -208.115.140.0 - 208.115.140.255 cn -208.115.141.0 - 208.116.2.199 us -208.116.2.200 - 208.116.2.207 gb -208.116.2.208 - 208.116.3.255 us -208.116.4.0 - 208.116.4.31 ca -208.116.4.32 - 208.116.7.17 us -208.116.7.18 - 208.116.7.54 gb -208.116.7.55 - 208.116.13.95 us -208.116.13.96 - 208.116.13.103 gb -208.116.13.104 - 208.116.19.255 us -208.116.20.0 - 208.116.20.63 gb -208.116.20.64 - 208.116.21.223 us -208.116.21.224 - 208.116.21.239 ca -208.116.21.240 - 208.116.22.79 us -208.116.22.80 - 208.116.22.95 ca -208.116.22.96 - 208.116.42.63 us -208.116.42.64 - 208.116.42.71 ca -208.116.42.72 - 208.116.43.63 us -208.116.43.64 - 208.116.43.95 ca -208.116.43.96 - 208.116.54.23 us -208.116.54.24 - 208.116.54.31 in -208.116.54.32 - 208.116.54.231 us -208.116.54.232 - 208.116.54.239 in -208.116.54.240 - 208.118.63.255 us +208.114.192.0 - 208.118.63.255 us 208.118.64.0 - 208.118.143.255 ca 208.118.144.0 - 208.118.207.255 us 208.118.208.0 - 208.118.223.255 ca -208.118.224.0 - 208.122.223.7 us -208.122.223.8 - 208.122.223.15 ec -208.122.223.16 - 208.122.223.135 us -208.122.223.136 - 208.122.223.143 ca -208.122.223.144 - 208.122.239.255 us -208.122.240.0 - 208.122.247.255 a2 -208.122.248.0 - 208.122.248.31 mr -208.122.248.32 - 208.122.253.255 a2 -208.122.254.0 - 208.122.254.255 ng -208.122.255.0 - 208.122.255.255 a2 -208.123.0.0 - 208.123.69.159 us -208.123.69.160 - 208.123.69.167 ca -208.123.69.168 - 208.124.127.255 us +208.118.224.0 - 208.122.30.255 us +208.122.31.0 - 208.122.31.255 nl +208.122.32.0 - 208.122.239.255 us +208.122.240.0 - 208.122.255.255 a2 +208.123.0.0 - 208.123.222.255 us +208.123.223.0 - 208.123.223.255 ca +208.123.224.0 - 208.124.127.255 us 208.124.128.0 - 208.124.255.255 ca -208.125.0.0 - 208.131.31.255 us -208.131.32.0 - 208.131.32.31 jm -208.131.32.32 - 208.131.32.95 us -208.131.32.96 - 208.131.32.111 jm -208.131.32.112 - 208.131.32.255 us +208.125.0.0 - 208.131.32.255 us 208.131.33.0 - 208.131.33.255 jm 208.131.34.0 - 208.131.159.255 us -208.131.160.0 - 208.131.181.63 jm -208.131.181.64 - 208.131.181.71 us -208.131.181.72 - 208.131.191.255 jm -208.131.192.0 - 208.133.199.255 us -208.133.200.0 - 208.133.203.255 cr -208.133.204.0 - 208.133.205.255 us -208.133.206.0 - 208.133.206.255 cr -208.133.207.0 - 208.134.244.127 us -208.134.244.128 - 208.134.244.159 sg -208.134.244.160 - 208.135.2.255 us -208.135.3.0 - 208.135.7.255 pr -208.135.8.0 - 208.135.18.255 us +208.131.160.0 - 208.131.191.255 jm +208.131.192.0 - 208.135.18.255 us 208.135.19.0 - 208.135.19.255 cl 208.135.20.0 - 208.135.21.255 us 208.135.22.0 - 208.135.23.255 cl @@ -133757,26 +108116,20 @@ 208.136.56.0 - 208.136.101.255 us 208.136.102.0 - 208.136.102.255 ws 208.136.103.0 - 208.138.15.255 us -208.138.16.0 - 208.138.34.39 jm -208.138.34.40 - 208.138.34.47 ca -208.138.34.48 - 208.138.47.255 jm +208.138.16.0 - 208.138.47.255 jm 208.138.48.0 - 208.138.215.255 us -208.138.216.0 - 208.138.223.255 pr -208.138.224.0 - 208.139.163.255 us +208.138.216.0 - 208.138.219.255 pr +208.138.220.0 - 208.138.221.255 us +208.138.222.0 - 208.138.222.255 pr +208.138.223.0 - 208.139.163.255 us 208.139.164.0 - 208.139.164.255 pf -208.139.165.0 - 208.145.89.159 us -208.145.89.160 - 208.145.89.191 mx -208.145.89.192 - 208.147.17.255 us +208.139.165.0 - 208.147.17.255 us 208.147.18.0 - 208.147.18.255 ws 208.147.19.0 - 208.148.167.255 us 208.148.168.0 - 208.148.169.255 mw 208.148.170.0 - 208.149.39.255 us 208.149.40.0 - 208.149.40.255 de -208.149.41.0 - 208.149.43.255 us -208.149.44.0 - 208.149.44.95 de -208.149.44.96 - 208.149.45.111 us -208.149.45.112 - 208.149.45.119 it -208.149.45.120 - 208.149.95.255 us +208.149.41.0 - 208.149.95.255 us 208.149.96.0 - 208.149.99.255 in 208.149.100.0 - 208.153.67.255 us 208.153.68.0 - 208.153.69.255 tz @@ -133792,138 +108145,40 @@ 208.158.13.0 - 208.158.13.255 lc 208.158.14.0 - 208.158.14.255 ag 208.158.15.0 - 208.158.15.255 lc -208.158.16.0 - 208.158.237.127 us -208.158.237.128 - 208.158.237.255 sg -208.158.238.0 - 208.159.175.255 us +208.158.16.0 - 208.159.175.255 us 208.159.176.0 - 208.159.176.255 se 208.159.177.0 - 208.159.177.255 gb -208.159.178.0 - 208.159.247.255 us -208.159.248.0 - 208.159.248.255 it -208.159.249.0 - 208.161.241.255 us -208.161.242.0 - 208.161.242.63 ie -208.161.242.64 - 208.163.31.255 us +208.159.178.0 - 208.163.31.255 us 208.163.32.0 - 208.163.63.255 jm -208.163.64.0 - 208.163.110.127 us -208.163.110.128 - 208.163.110.143 gb -208.163.110.144 - 208.163.209.31 us -208.163.209.32 - 208.163.209.63 gb -208.163.209.64 - 208.165.47.255 us -208.165.48.0 - 208.165.63.255 cr -208.165.64.0 - 208.167.31.255 us +208.163.64.0 - 208.167.31.255 us 208.167.32.0 - 208.167.35.255 mz -208.167.36.0 - 208.167.226.249 us -208.167.226.250 - 208.167.226.250 ca -208.167.226.251 - 208.167.229.255 us -208.167.230.0 - 208.167.230.55 ca -208.167.230.56 - 208.167.230.63 us -208.167.230.64 - 208.167.230.111 ca -208.167.230.112 - 208.167.230.191 us -208.167.230.192 - 208.167.230.215 ca -208.167.230.216 - 208.167.230.253 us -208.167.230.254 - 208.167.230.254 ca -208.167.230.255 - 208.167.230.255 us -208.167.231.0 - 208.167.231.15 ca -208.167.231.16 - 208.167.231.255 us -208.167.232.0 - 208.167.233.15 ca -208.167.233.16 - 208.167.233.31 us -208.167.233.32 - 208.167.233.255 ca -208.167.234.0 - 208.167.235.255 us -208.167.236.0 - 208.167.236.15 ca -208.167.236.16 - 208.167.236.31 us -208.167.236.32 - 208.167.236.79 ca -208.167.236.80 - 208.167.236.127 us -208.167.236.128 - 208.167.236.255 ca -208.167.237.0 - 208.167.251.255 us -208.167.252.0 - 208.167.253.255 ca -208.167.254.0 - 208.168.71.255 us +208.167.36.0 - 208.168.71.255 us 208.168.72.0 - 208.168.73.255 cl 208.168.74.0 - 208.168.141.255 us 208.168.142.0 - 208.168.143.255 ca -208.168.144.0 - 208.168.210.255 us -208.168.211.0 - 208.168.212.255 ec -208.168.213.0 - 208.168.213.255 ht -208.168.214.0 - 208.168.214.255 ec -208.168.215.0 - 208.168.215.255 ht -208.168.216.0 - 208.168.223.255 us +208.168.144.0 - 208.168.223.255 us 208.168.224.0 - 208.168.255.255 ky 208.169.0.0 - 208.169.63.255 us 208.169.64.0 - 208.169.95.255 ky -208.169.96.0 - 208.170.31.7 us -208.170.31.8 - 208.170.31.15 ca -208.170.31.16 - 208.170.32.7 us -208.170.32.8 - 208.170.32.15 ca -208.170.32.16 - 208.170.37.47 us -208.170.37.48 - 208.170.37.63 au -208.170.37.64 - 208.170.37.71 us -208.170.37.72 - 208.170.37.111 au -208.170.37.112 - 208.170.39.143 us -208.170.39.144 - 208.170.39.151 gb -208.170.39.152 - 208.171.209.191 us -208.171.209.192 - 208.171.209.223 au -208.171.209.224 - 208.175.67.71 us -208.175.67.72 - 208.175.67.79 ca -208.175.67.80 - 208.175.67.95 gb -208.175.67.96 - 208.175.67.159 us -208.175.67.160 - 208.175.67.191 ca -208.175.67.192 - 208.175.203.7 us -208.175.203.8 - 208.175.203.15 au -208.175.203.16 - 208.175.203.31 kr -208.175.203.32 - 208.175.203.47 us -208.175.203.48 - 208.175.203.95 jp -208.175.203.96 - 208.175.207.255 us -208.175.208.0 - 208.175.208.31 sg -208.175.208.32 - 208.175.208.47 us -208.175.208.48 - 208.175.208.71 sg -208.175.208.72 - 208.175.208.191 us -208.175.208.192 - 208.175.208.255 sg -208.175.209.0 - 208.175.209.255 us +208.169.96.0 - 208.170.19.107 us +208.170.19.108 - 208.170.19.111 gb +208.170.19.112 - 208.170.20.27 us +208.170.20.28 - 208.170.20.31 gb +208.170.20.32 - 208.170.20.131 us +208.170.20.132 - 208.170.20.135 gb +208.170.20.136 - 208.170.43.163 us +208.170.43.164 - 208.170.43.167 gb +208.170.43.168 - 208.175.209.255 us 208.175.210.0 - 208.175.210.255 gb -208.175.211.0 - 208.175.211.215 us -208.175.211.216 - 208.175.211.223 il -208.175.211.224 - 208.175.211.255 sg -208.175.212.0 - 208.180.255.255 us +208.175.211.0 - 208.178.165.255 us +208.178.166.0 - 208.178.166.255 nl +208.178.167.0 - 208.178.194.147 us +208.178.194.148 - 208.178.194.151 nl +208.178.194.152 - 208.178.201.255 us +208.178.202.0 - 208.178.202.255 de +208.178.203.0 - 208.180.255.255 us 208.181.0.0 - 208.181.255.255 ca -208.182.0.0 - 208.184.36.63 us -208.184.36.64 - 208.184.36.95 au -208.184.36.96 - 208.184.48.231 us -208.184.48.232 - 208.184.48.247 au -208.184.48.248 - 208.184.110.255 us -208.184.111.0 - 208.184.111.63 ca -208.184.111.64 - 208.185.93.255 us -208.185.94.0 - 208.185.94.255 ca -208.185.95.0 - 208.185.128.127 us -208.185.128.128 - 208.185.128.159 hk -208.185.128.160 - 208.188.82.119 us -208.188.82.120 - 208.188.82.127 pr -208.188.82.128 - 208.188.125.223 us -208.188.125.224 - 208.188.125.231 pr -208.188.125.232 - 208.188.125.239 us -208.188.125.240 - 208.188.125.247 pr -208.188.125.248 - 208.188.249.239 us -208.188.249.240 - 208.188.249.247 pr -208.188.249.248 - 208.189.91.247 us -208.189.91.248 - 208.189.91.255 pr -208.189.92.0 - 208.189.137.79 us -208.189.137.80 - 208.189.137.87 pr -208.189.137.88 - 208.189.207.31 us -208.189.207.32 - 208.189.207.39 pr -208.189.207.40 - 208.190.124.247 us -208.190.124.248 - 208.190.124.255 pr -208.190.125.0 - 208.190.133.111 us -208.190.133.112 - 208.190.133.119 pr -208.190.133.120 - 208.190.182.31 us -208.190.182.32 - 208.190.182.39 pr -208.190.182.40 - 208.190.182.47 us -208.190.182.48 - 208.190.182.55 pr -208.190.182.56 - 208.191.93.47 us -208.191.93.48 - 208.191.93.55 pr -208.191.93.56 - 208.191.93.175 us -208.191.93.176 - 208.191.93.183 pr -208.191.93.184 - 208.191.95.23 us -208.191.95.24 - 208.191.95.31 pr -208.191.95.32 - 208.191.114.47 us -208.191.114.48 - 208.191.114.55 pr -208.191.114.56 - 208.194.250.255 us +208.182.0.0 - 208.194.250.255 us 208.194.251.0 - 208.194.251.255 pk 208.194.252.0 - 208.195.115.255 us 208.195.116.0 - 208.195.119.255 mx @@ -133935,37 +108190,28 @@ 208.196.155.0 - 208.196.155.255 bs 208.196.156.0 - 208.198.179.255 us 208.198.180.0 - 208.198.180.255 mc -208.198.181.0 - 208.203.111.255 us +208.198.181.0 - 208.199.62.255 us +208.199.63.0 - 208.199.63.255 ca +208.199.64.0 - 208.203.111.255 us 208.203.112.0 - 208.203.113.255 nl -208.203.114.0 - 208.203.244.127 us -208.203.244.128 - 208.203.244.159 gb -208.203.244.160 - 208.204.109.255 us -208.204.110.0 - 208.204.110.15 ca -208.204.110.16 - 208.206.175.255 us +208.203.114.0 - 208.206.175.255 us 208.206.176.0 - 208.206.177.255 cr -208.206.178.0 - 208.206.212.7 us -208.206.212.8 - 208.206.212.23 nl -208.206.212.24 - 208.206.239.167 us -208.206.239.168 - 208.206.239.175 ca -208.206.239.176 - 208.207.1.255 us -208.207.2.0 - 208.207.2.15 ca -208.207.2.16 - 208.207.91.255 us +208.206.178.0 - 208.207.91.255 us 208.207.92.0 - 208.207.93.255 pk 208.207.94.0 - 208.208.119.255 us 208.208.120.0 - 208.208.121.255 ke -208.208.122.0 - 208.209.109.255 us +208.208.122.0 - 208.208.122.255 a2 +208.208.123.0 - 208.209.54.255 us +208.209.55.0 - 208.209.55.255 a2 +208.209.56.0 - 208.209.109.255 us 208.209.110.0 - 208.209.110.255 ch -208.209.111.0 - 208.209.218.111 us -208.209.218.112 - 208.209.218.127 pr -208.209.218.128 - 208.210.121.255 us +208.209.111.0 - 208.210.121.255 us 208.210.122.0 - 208.210.122.255 az 208.210.123.0 - 208.210.215.255 us 208.210.216.0 - 208.210.216.255 de 208.210.217.0 - 208.214.207.255 us 208.214.208.0 - 208.214.215.255 co -208.214.216.0 - 208.216.36.167 us -208.216.36.168 - 208.216.36.175 pr -208.216.36.176 - 208.217.31.255 us +208.214.216.0 - 208.217.31.255 us 208.217.32.0 - 208.217.47.255 co 208.217.48.0 - 208.218.167.255 us 208.218.168.0 - 208.218.175.255 ae @@ -133979,7 +108225,11 @@ 208.221.248.0 - 208.221.248.255 ca 208.221.249.0 - 208.222.53.255 us 208.222.54.0 - 208.222.54.255 ro -208.222.55.0 - 208.232.93.255 us +208.222.55.0 - 208.226.180.255 us +208.226.181.0 - 208.226.181.255 ca +208.226.182.0 - 208.226.191.255 us +208.226.192.0 - 208.226.193.255 gu +208.226.194.0 - 208.232.93.255 us 208.232.94.0 - 208.232.95.255 pk 208.232.96.0 - 208.232.223.255 us 208.232.224.0 - 208.232.226.255 ph @@ -133988,204 +108238,71 @@ 208.232.247.184 - 208.233.5.255 us 208.233.6.0 - 208.233.7.255 bd 208.233.8.0 - 208.234.31.255 us -208.234.32.0 - 208.234.63.255 pr +208.234.32.0 - 208.234.36.255 pr +208.234.37.0 - 208.234.37.255 do +208.234.38.0 - 208.234.63.255 pr 208.234.64.0 - 208.235.195.255 us 208.235.196.0 - 208.235.196.255 ec -208.235.197.0 - 208.235.197.15 us -208.235.197.16 - 208.235.199.255 ec -208.235.200.0 - 208.235.223.255 us +208.235.197.0 - 208.235.197.255 us +208.235.198.0 - 208.235.198.255 ec +208.235.199.0 - 208.235.223.255 us 208.235.224.0 - 208.235.224.255 ph -208.235.225.0 - 208.237.31.255 us -208.237.32.0 - 208.237.32.255 jo -208.237.33.0 - 208.237.106.255 us -208.237.107.0 - 208.237.107.127 ca -208.237.107.128 - 208.237.133.239 us -208.237.133.240 - 208.237.133.247 gb -208.237.133.248 - 208.238.45.255 us +208.235.225.0 - 208.235.230.255 us +208.235.231.0 - 208.235.231.255 ph +208.235.232.0 - 208.238.45.255 us 208.238.46.0 - 208.238.46.255 jm 208.238.47.0 - 208.238.47.255 ht 208.238.48.0 - 208.240.105.255 us 208.240.106.0 - 208.240.108.255 mx 208.240.109.0 - 208.240.135.255 us 208.240.136.0 - 208.240.139.255 pk -208.240.140.0 - 208.240.166.95 us -208.240.166.96 - 208.240.166.127 a2 -208.240.166.128 - 208.240.221.127 us -208.240.221.128 - 208.240.221.255 ca -208.240.222.0 - 208.241.75.255 us +208.240.140.0 - 208.241.75.255 us 208.241.76.0 - 208.241.76.255 gu 208.241.77.0 - 208.241.220.255 us 208.241.221.0 - 208.241.221.255 ro 208.241.222.0 - 208.244.39.255 us 208.244.40.0 - 208.244.41.255 jm -208.244.42.0 - 208.244.51.31 us -208.244.51.32 - 208.244.51.63 ua -208.244.51.64 - 208.246.139.255 us +208.244.42.0 - 208.246.139.255 us 208.246.140.0 - 208.246.143.255 bs 208.246.144.0 - 208.249.77.255 us 208.249.78.0 - 208.249.80.255 pr 208.249.81.0 - 208.249.248.255 us 208.249.249.0 - 208.249.255.255 pa -208.250.0.0 - 208.250.29.191 us -208.250.29.192 - 208.250.29.207 de -208.250.29.208 - 208.250.54.63 us -208.250.54.64 - 208.250.54.71 af -208.250.54.72 - 208.251.96.223 us -208.251.96.224 - 208.251.96.255 gb -208.251.97.0 - 208.251.201.55 us -208.251.201.56 - 208.251.201.63 af -208.251.201.64 - 208.252.64.255 us +208.250.0.0 - 208.252.64.255 us 208.252.65.0 - 208.252.65.255 a2 -208.252.66.0 - 208.252.72.103 us -208.252.72.104 - 208.252.72.111 au -208.252.72.112 - 208.252.85.247 us -208.252.85.248 - 208.252.85.255 no -208.252.86.0 - 208.252.149.15 us -208.252.149.16 - 208.252.149.31 ca -208.252.149.32 - 208.254.2.47 us -208.254.2.48 - 208.254.2.63 gb -208.254.2.64 - 208.255.44.127 us -208.255.44.128 - 208.255.44.159 ca -208.255.44.160 - 208.255.192.223 us -208.255.192.224 - 208.255.192.255 pr -208.255.193.0 - 209.2.45.127 us -209.2.45.128 - 209.2.45.191 pl -209.2.45.192 - 209.4.255.255 us -209.5.0.0 - 209.5.112.7 ca -209.5.112.8 - 209.5.112.15 us -209.5.112.16 - 209.5.255.255 ca -209.6.0.0 - 209.8.245.255 us +208.252.66.0 - 208.252.217.255 us +208.252.218.0 - 208.252.218.255 in +208.252.219.0 - 209.4.255.255 us +209.5.0.0 - 209.5.255.255 ca +209.6.0.0 - 209.8.195.255 us +209.8.196.0 - 209.8.196.31 gr +209.8.196.32 - 209.8.245.255 us 209.8.246.0 - 209.8.246.255 iq -209.8.247.0 - 209.10.32.223 us -209.10.32.224 - 209.10.32.239 il -209.10.32.240 - 209.12.255.255 us +209.8.247.0 - 209.9.105.255 us +209.9.106.0 - 209.9.107.255 cn +209.9.108.0 - 209.9.127.255 us +209.9.128.0 - 209.9.128.255 cn +209.9.129.0 - 209.12.255.255 us 209.13.0.0 - 209.13.255.255 ar -209.14.0.0 - 209.15.191.255 us +209.14.0.0 - 209.15.24.255 us +209.15.25.0 - 209.15.25.255 ca +209.15.26.0 - 209.15.191.255 us 209.15.192.0 - 209.15.255.255 ca -209.16.0.0 - 209.16.208.47 us -209.16.208.48 - 209.16.208.63 in -209.16.208.64 - 209.17.127.255 us +209.16.0.0 - 209.17.127.255 us 209.17.128.0 - 209.17.182.63 ca 209.17.182.64 - 209.17.182.95 us 209.17.182.96 - 209.17.191.255 ca -209.17.192.0 - 209.18.64.159 us -209.18.64.160 - 209.18.64.175 iq -209.18.64.176 - 209.18.64.207 us -209.18.64.208 - 209.18.64.223 es -209.18.64.224 - 209.18.65.191 us -209.18.65.192 - 209.18.65.223 ca -209.18.65.224 - 209.18.68.191 us -209.18.68.192 - 209.18.68.207 au -209.18.68.208 - 209.18.74.223 us -209.18.74.224 - 209.18.74.239 ca -209.18.74.240 - 209.18.77.47 us -209.18.77.48 - 209.18.77.63 il -209.18.77.64 - 209.18.83.149 us -209.18.83.150 - 209.18.83.159 it -209.18.83.160 - 209.18.84.89 us -209.18.84.90 - 209.18.84.99 be -209.18.84.100 - 209.18.84.219 us -209.18.84.220 - 209.18.84.229 in -209.18.84.230 - 209.18.85.119 us -209.18.85.120 - 209.18.85.129 sy -209.18.85.130 - 209.18.85.159 us -209.18.85.160 - 209.18.85.169 be -209.18.85.170 - 209.18.85.189 us -209.18.85.190 - 209.18.85.199 nz -209.18.85.200 - 209.18.85.209 lb -209.18.85.210 - 209.18.96.159 us -209.18.96.160 - 209.18.96.191 il -209.18.96.192 - 209.18.96.223 ca -209.18.96.224 - 209.18.98.127 us -209.18.98.128 - 209.18.98.159 gb -209.18.98.160 - 209.18.99.39 us -209.18.99.40 - 209.18.99.49 fr -209.18.99.50 - 209.18.99.129 us -209.18.99.130 - 209.18.99.139 iq -209.18.99.140 - 209.18.99.149 us -209.18.99.150 - 209.18.99.159 es -209.18.99.160 - 209.18.99.179 us -209.18.99.180 - 209.18.99.189 jp -209.18.99.190 - 209.18.100.69 us -209.18.100.70 - 209.18.100.79 au -209.18.100.80 - 209.18.100.129 us -209.18.100.130 - 209.18.100.139 lb -209.18.100.140 - 209.18.100.209 us -209.18.100.210 - 209.18.100.219 it -209.18.100.220 - 209.18.102.127 us -209.18.102.128 - 209.18.102.159 il -209.18.102.160 - 209.18.102.223 us -209.18.102.224 - 209.18.102.255 fr -209.18.103.0 - 209.18.104.95 us -209.18.104.96 - 209.18.104.127 no -209.18.104.128 - 209.18.104.175 us -209.18.104.176 - 209.18.104.191 gb -209.18.104.192 - 209.18.104.223 us -209.18.104.224 - 209.18.104.255 fr -209.18.105.0 - 209.18.106.89 us -209.18.106.90 - 209.18.106.99 au -209.18.106.100 - 209.18.106.109 ua -209.18.106.110 - 209.18.106.189 us -209.18.106.190 - 209.18.106.199 nz -209.18.106.200 - 209.18.107.9 us -209.18.107.10 - 209.18.107.19 nz -209.18.107.20 - 209.18.107.39 us -209.18.107.40 - 209.18.107.49 au -209.18.107.50 - 209.18.107.149 us -209.18.107.150 - 209.18.107.159 ir -209.18.107.160 - 209.18.107.169 ua -209.18.107.170 - 209.18.107.239 us -209.18.107.240 - 209.18.107.249 gb -209.18.107.250 - 209.18.108.39 us -209.18.108.40 - 209.18.108.49 gr -209.18.108.50 - 209.18.110.175 us -209.18.110.176 - 209.18.110.191 es -209.18.110.192 - 209.18.117.63 us -209.18.117.64 - 209.18.117.127 au -209.18.117.128 - 209.18.122.239 us -209.18.122.240 - 209.18.122.255 qa -209.18.123.0 - 209.18.125.255 us -209.18.126.0 - 209.18.126.63 bv -209.18.126.64 - 209.18.127.31 us -209.18.127.32 - 209.18.127.63 pa -209.18.127.64 - 209.18.127.127 us -209.18.127.128 - 209.18.127.191 au -209.18.127.192 - 209.19.255.255 us -209.20.0.0 - 209.20.63.255 ca +209.17.192.0 - 209.19.255.255 us +209.20.0.0 - 209.20.1.255 ca +209.20.2.0 - 209.20.2.255 us +209.20.3.0 - 209.20.63.255 ca 209.20.64.0 - 209.20.235.255 us 209.20.236.0 - 209.20.236.255 bg -209.20.237.0 - 209.25.130.191 us -209.25.130.192 - 209.25.130.223 ca -209.25.130.224 - 209.25.131.127 us -209.25.131.128 - 209.25.131.159 es -209.25.131.160 - 209.25.135.255 us +209.20.237.0 - 209.25.135.255 us 209.25.136.0 - 209.25.136.255 ca 209.25.137.0 - 209.25.147.255 us 209.25.148.0 - 209.25.148.255 id -209.25.149.0 - 209.25.153.95 us -209.25.153.96 - 209.25.153.127 ru -209.25.153.128 - 209.25.159.191 us -209.25.159.192 - 209.25.159.255 ca -209.25.160.0 - 209.25.163.255 us -209.25.164.0 - 209.25.164.31 au -209.25.164.32 - 209.25.165.127 us -209.25.165.128 - 209.25.165.159 ca -209.25.165.160 - 209.25.185.31 us -209.25.185.32 - 209.25.185.47 ca -209.25.185.48 - 209.25.194.31 us -209.25.194.32 - 209.25.194.47 gb -209.25.194.48 - 209.25.211.255 us -209.25.212.0 - 209.25.212.15 ru -209.25.212.16 - 209.25.213.63 us -209.25.213.64 - 209.25.213.127 ca -209.25.213.128 - 209.25.220.255 us -209.25.221.0 - 209.25.221.127 gb -209.25.221.128 - 209.25.238.159 us -209.25.238.160 - 209.25.238.175 sk -209.25.238.176 - 209.25.238.223 us -209.25.238.224 - 209.25.238.239 id -209.25.238.240 - 209.27.47.255 us -209.27.48.0 - 209.27.51.255 ca +209.25.149.0 - 209.27.51.255 us 209.27.52.0 - 209.27.55.255 ky 209.27.56.0 - 209.27.59.255 us 209.27.60.0 - 209.27.63.255 ky @@ -134194,24 +108311,11 @@ 209.27.142.0 - 209.27.142.255 bm 209.27.143.0 - 209.28.0.255 us 209.28.1.0 - 209.28.1.255 mx -209.28.2.0 - 209.28.6.31 us -209.28.6.32 - 209.28.6.63 ar -209.28.6.64 - 209.28.7.255 us -209.28.8.0 - 209.28.8.127 it -209.28.8.128 - 209.28.8.255 us -209.28.9.0 - 209.28.9.31 za -209.28.9.32 - 209.28.14.255 us -209.28.15.0 - 209.28.15.255 mx -209.28.16.0 - 209.28.16.95 us -209.28.16.96 - 209.28.16.127 ca -209.28.16.128 - 209.28.16.239 us -209.28.16.240 - 209.28.16.255 pr -209.28.17.0 - 209.28.20.255 us +209.28.2.0 - 209.28.20.255 us 209.28.21.0 - 209.28.21.255 au 209.28.22.0 - 209.28.22.255 us 209.28.23.0 - 209.28.23.255 ve -209.28.24.0 - 209.28.24.255 us -209.28.25.0 - 209.28.25.255 co +209.28.24.0 - 209.28.25.255 us 209.28.26.0 - 209.28.26.255 jp 209.28.27.0 - 209.28.27.255 th 209.28.28.0 - 209.28.28.255 jp @@ -134220,230 +108324,81 @@ 209.28.31.0 - 209.28.31.255 kr 209.28.32.0 - 209.28.32.255 ph 209.28.33.0 - 209.28.33.255 nz -209.28.34.0 - 209.28.34.191 us -209.28.34.192 - 209.28.34.255 sg +209.28.34.0 - 209.28.34.255 us 209.28.35.0 - 209.28.35.255 hk -209.28.36.0 - 209.28.36.223 us -209.28.36.224 - 209.28.36.255 it +209.28.36.0 - 209.28.36.255 us 209.28.37.0 - 209.28.37.255 au -209.28.38.0 - 209.28.38.7 kp -209.28.38.8 - 209.28.38.255 us +209.28.38.0 - 209.28.38.255 us 209.28.39.0 - 209.28.39.255 hk 209.28.40.0 - 209.28.40.255 us 209.28.41.0 - 209.28.41.255 au 209.28.42.0 - 209.28.42.255 my 209.28.43.0 - 209.28.43.255 sg 209.28.44.0 - 209.28.44.255 au -209.28.45.0 - 209.28.45.63 jp -209.28.45.64 - 209.28.45.255 us -209.28.46.0 - 209.28.46.63 es -209.28.46.64 - 209.28.46.159 us -209.28.46.160 - 209.28.46.167 es -209.28.46.168 - 209.28.46.191 us -209.28.46.192 - 209.28.46.223 es -209.28.46.224 - 209.28.49.127 us -209.28.49.128 - 209.28.49.159 es -209.28.49.160 - 209.28.49.191 us -209.28.49.192 - 209.28.49.255 gb -209.28.50.0 - 209.28.50.63 nl -209.28.50.64 - 209.28.50.127 us -209.28.50.128 - 209.28.50.159 nl -209.28.50.160 - 209.28.50.255 us +209.28.45.0 - 209.28.50.255 us 209.28.51.0 - 209.28.51.255 se 209.28.52.0 - 209.28.52.255 hk -209.28.53.0 - 209.28.53.127 us -209.28.53.128 - 209.28.53.143 tw -209.28.53.144 - 209.28.53.191 us -209.28.53.192 - 209.28.53.207 ph -209.28.53.208 - 209.28.53.223 us -209.28.53.224 - 209.28.53.255 id -209.28.54.0 - 209.28.54.63 th -209.28.54.64 - 209.28.54.79 us -209.28.54.80 - 209.28.54.87 th -209.28.54.88 - 209.28.54.127 us -209.28.54.128 - 209.28.54.191 hk -209.28.54.192 - 209.28.54.255 us -209.28.55.0 - 209.28.55.31 hk -209.28.55.32 - 209.28.55.63 us -209.28.55.64 - 209.28.55.127 hk -209.28.55.128 - 209.28.57.255 us -209.28.58.0 - 209.28.58.127 my -209.28.58.128 - 209.28.58.255 sg +209.28.53.0 - 209.28.58.255 us 209.28.59.0 - 209.28.59.255 jp -209.28.60.0 - 209.28.60.255 us -209.28.61.0 - 209.28.61.255 br +209.28.60.0 - 209.28.61.255 us 209.28.62.0 - 209.28.62.255 au -209.28.63.0 - 209.28.63.63 br -209.28.63.64 - 209.28.63.127 us -209.28.63.128 - 209.28.63.191 br -209.28.63.192 - 209.28.63.255 us +209.28.63.0 - 209.28.63.255 us 209.28.64.0 - 209.28.64.255 ca -209.28.65.0 - 209.28.69.31 us -209.28.69.32 - 209.28.69.63 mx -209.28.69.64 - 209.28.69.79 us -209.28.69.80 - 209.28.69.95 br -209.28.69.96 - 209.28.69.111 us -209.28.69.112 - 209.28.69.127 br -209.28.69.128 - 209.28.70.191 us -209.28.70.192 - 209.28.70.255 it +209.28.65.0 - 209.28.70.255 us 209.28.71.0 - 209.28.73.255 gb 209.28.74.0 - 209.28.74.255 ch -209.28.75.0 - 209.28.75.63 us -209.28.75.64 - 209.28.75.95 cl -209.28.75.96 - 209.28.76.255 us +209.28.75.0 - 209.28.76.255 us 209.28.77.0 - 209.28.81.255 de -209.28.82.0 - 209.28.82.127 us -209.28.82.128 - 209.28.82.191 vi -209.28.82.192 - 209.28.87.15 us -209.28.87.16 - 209.28.87.63 br -209.28.87.64 - 209.28.87.95 gb -209.28.87.96 - 209.28.87.127 us -209.28.87.128 - 209.28.87.191 br -209.28.87.192 - 209.28.87.207 es -209.28.87.208 - 209.28.87.223 us -209.28.87.224 - 209.28.87.255 be +209.28.82.0 - 209.28.87.255 us 209.28.88.0 - 209.28.88.255 gb -209.28.89.0 - 209.28.89.63 us -209.28.89.64 - 209.28.89.79 br -209.28.89.80 - 209.28.89.159 us -209.28.89.160 - 209.28.89.191 br -209.28.89.192 - 209.28.89.255 us -209.28.90.0 - 209.28.90.127 gb -209.28.90.128 - 209.28.90.255 us -209.28.91.0 - 209.28.91.31 gb -209.28.91.32 - 209.28.91.47 be -209.28.91.48 - 209.28.91.95 us -209.28.91.96 - 209.28.91.111 se -209.28.91.112 - 209.28.91.223 us -209.28.91.224 - 209.28.91.255 gb -209.28.92.0 - 209.28.92.63 fr -209.28.92.64 - 209.28.92.127 us -209.28.92.128 - 209.28.92.255 no +209.28.89.0 - 209.28.92.255 us 209.28.93.0 - 209.28.93.255 ch -209.28.94.0 - 209.28.94.191 gb -209.28.94.192 - 209.28.94.255 sg +209.28.94.0 - 209.28.94.255 us 209.28.95.0 - 209.28.95.255 it -209.28.96.0 - 209.28.96.63 ch -209.28.96.64 - 209.28.97.63 us -209.28.97.64 - 209.28.97.95 be -209.28.97.96 - 209.28.97.127 us -209.28.97.128 - 209.28.97.175 be -209.28.97.176 - 209.28.97.223 us -209.28.97.224 - 209.28.97.239 be -209.28.97.240 - 209.28.97.255 us +209.28.96.0 - 209.28.97.255 us 209.28.98.0 - 209.28.98.255 de -209.28.99.0 - 209.28.99.63 dk -209.28.99.64 - 209.28.99.127 us -209.28.99.128 - 209.28.99.159 dk -209.28.99.160 - 209.28.99.191 us -209.28.99.192 - 209.28.99.255 dk +209.28.99.0 - 209.28.99.255 us 209.28.100.0 - 209.28.100.255 es 209.28.101.0 - 209.28.101.255 be 209.28.102.0 - 209.28.102.255 gb -209.28.103.0 - 209.28.103.127 us -209.28.103.128 - 209.28.103.159 ch -209.28.103.160 - 209.28.103.255 us +209.28.103.0 - 209.28.103.255 us 209.28.104.0 - 209.28.104.255 se 209.28.105.0 - 209.28.105.255 de 209.28.106.0 - 209.28.106.255 us 209.28.107.0 - 209.28.107.255 fr -209.28.108.0 - 209.28.108.63 us -209.28.108.64 - 209.28.108.79 gb -209.28.108.80 - 209.28.108.95 us -209.28.108.96 - 209.28.108.111 gb -209.28.108.112 - 209.28.111.63 us -209.28.111.64 - 209.28.111.95 br -209.28.111.96 - 209.28.111.255 us -209.28.112.0 - 209.28.112.127 gb -209.28.112.128 - 209.28.112.159 dk -209.28.112.160 - 209.28.112.175 it -209.28.112.176 - 209.28.112.255 us -209.28.113.0 - 209.28.113.31 de -209.28.113.32 - 209.28.113.127 us -209.28.113.128 - 209.28.113.143 de -209.28.113.144 - 209.28.113.159 us -209.28.113.160 - 209.28.113.175 gb -209.28.113.176 - 209.28.113.255 us -209.28.114.0 - 209.28.114.127 sg -209.28.114.128 - 209.28.114.191 be -209.28.114.192 - 209.28.115.31 us -209.28.115.32 - 209.28.115.95 be -209.28.115.96 - 209.28.117.255 us -209.28.118.0 - 209.28.118.31 be -209.28.118.32 - 209.28.118.63 us -209.28.118.64 - 209.28.118.79 be -209.28.118.80 - 209.28.118.95 us -209.28.118.96 - 209.28.118.111 be -209.28.118.112 - 209.28.118.127 us -209.28.118.128 - 209.28.118.191 es -209.28.118.192 - 209.28.118.255 us +209.28.108.0 - 209.28.118.255 us 209.28.119.0 - 209.28.119.255 de -209.28.120.0 - 209.28.120.31 us -209.28.120.32 - 209.28.120.63 cl -209.28.120.64 - 209.28.120.78 pr -209.28.120.79 - 209.28.120.79 us -209.28.120.80 - 209.28.120.95 co -209.28.120.96 - 209.28.120.111 us -209.28.120.112 - 209.28.120.127 br -209.28.120.128 - 209.28.121.255 us +209.28.120.0 - 209.28.121.255 us 209.28.122.0 - 209.28.122.255 de -209.28.123.0 - 209.28.123.63 ir -209.28.123.64 - 209.28.124.31 us -209.28.124.32 - 209.28.124.47 de -209.28.124.48 - 209.28.124.255 us -209.28.125.0 - 209.28.125.63 nl -209.28.125.64 - 209.28.125.95 us -209.28.125.96 - 209.28.125.111 nl -209.28.125.112 - 209.28.127.127 us -209.28.127.128 - 209.28.127.159 co -209.28.127.160 - 209.28.127.191 us -209.28.127.192 - 209.28.127.207 be -209.28.127.208 - 209.28.129.255 us -209.28.130.0 - 209.28.130.255 ec -209.28.131.0 - 209.28.131.255 us +209.28.123.0 - 209.28.131.255 us 209.28.132.0 - 209.28.132.255 ch -209.28.133.0 - 209.28.133.255 us -209.28.134.0 - 209.28.134.255 ar -209.28.135.0 - 209.28.139.255 us +209.28.133.0 - 209.28.139.255 us 209.28.140.0 - 209.28.140.255 be 209.28.141.0 - 209.28.145.255 se 209.28.146.0 - 209.28.146.255 de 209.28.147.0 - 209.28.147.255 be 209.28.148.0 - 209.28.148.255 nl 209.28.149.0 - 209.28.150.255 ie -209.28.151.0 - 209.28.151.159 us -209.28.151.160 - 209.28.151.175 de -209.28.151.176 - 209.28.151.255 us +209.28.151.0 - 209.28.151.255 us 209.28.152.0 - 209.28.152.255 nl 209.28.153.0 - 209.28.153.255 ch -209.28.154.0 - 209.28.154.15 es -209.28.154.16 - 209.28.154.255 us +209.28.154.0 - 209.28.154.255 us 209.28.155.0 - 209.28.156.255 de 209.28.157.0 - 209.28.157.255 se 209.28.158.0 - 209.28.158.255 dk 209.28.159.0 - 209.28.160.255 gb -209.28.161.0 - 209.28.161.255 it +209.28.161.0 - 209.28.161.255 us 209.28.162.0 - 209.28.162.255 dk -209.28.163.0 - 209.28.163.31 us -209.28.163.32 - 209.28.163.47 fr -209.28.163.48 - 209.28.163.63 us -209.28.163.64 - 209.28.163.79 ch -209.28.163.80 - 209.28.163.95 pt -209.28.163.96 - 209.28.163.255 us +209.28.163.0 - 209.28.163.255 us 209.28.164.0 - 209.28.164.255 no 209.28.165.0 - 209.28.165.255 us 209.28.166.0 - 209.28.166.255 fr 209.28.167.0 - 209.28.167.255 us 209.28.168.0 - 209.28.168.255 pt 209.28.169.0 - 209.28.169.255 gb -209.28.170.0 - 209.28.170.255 ru +209.28.170.0 - 209.28.170.255 us 209.28.171.0 - 209.28.171.255 se -209.28.172.0 - 209.28.172.15 us -209.28.172.16 - 209.28.172.23 ru -209.28.172.24 - 209.28.172.47 us -209.28.172.48 - 209.28.172.63 at -209.28.172.64 - 209.28.172.191 us -209.28.172.192 - 209.28.172.255 fr +209.28.172.0 - 209.28.172.255 us 209.28.173.0 - 209.28.173.255 de 209.28.174.0 - 209.28.174.255 us 209.28.175.0 - 209.28.176.255 fi @@ -134453,27 +108408,13 @@ 209.28.181.0 - 209.28.181.255 ru 209.28.182.0 - 209.28.182.255 ch 209.28.183.0 - 209.28.183.255 se -209.28.184.0 - 209.28.184.127 pt -209.28.184.128 - 209.28.184.255 us -209.28.185.0 - 209.28.185.15 de -209.28.185.16 - 209.28.185.31 pt -209.28.185.32 - 209.28.185.255 us +209.28.184.0 - 209.28.185.255 us 209.28.186.0 - 209.28.189.255 be -209.28.190.0 - 209.28.190.31 nl -209.28.190.32 - 209.28.190.63 za -209.28.190.64 - 209.28.190.79 fr -209.28.190.80 - 209.28.190.95 se -209.28.190.96 - 209.28.191.63 us -209.28.191.64 - 209.28.191.95 pl -209.28.191.96 - 209.28.191.127 us -209.28.191.128 - 209.28.191.143 ch -209.28.191.144 - 209.28.191.191 us -209.28.191.192 - 209.28.191.255 ch +209.28.190.0 - 209.28.191.255 us 209.28.192.0 - 209.28.192.255 gb 209.28.193.0 - 209.28.193.255 fi 209.28.194.0 - 209.28.194.255 no -209.28.195.0 - 209.28.195.63 de -209.28.195.64 - 209.28.195.255 us +209.28.195.0 - 209.28.195.255 us 209.28.196.0 - 209.28.196.255 no 209.28.197.0 - 209.28.197.255 de 209.28.198.0 - 209.28.198.255 fi @@ -134482,10 +108423,7 @@ 209.28.201.0 - 209.28.201.255 no 209.28.202.0 - 209.28.202.255 gb 209.28.203.0 - 209.28.203.255 de -209.28.204.0 - 209.28.204.95 gr -209.28.204.96 - 209.28.204.127 us -209.28.204.128 - 209.28.204.191 gb -209.28.204.192 - 209.28.204.255 us +209.28.204.0 - 209.28.204.255 us 209.28.205.0 - 209.28.205.255 za 209.28.206.0 - 209.28.207.255 se 209.28.208.0 - 209.28.208.255 gb @@ -134497,32 +108435,18 @@ 209.28.216.0 - 209.28.216.255 be 209.28.217.0 - 209.28.219.255 il 209.28.220.0 - 209.28.220.255 nl -209.28.221.0 - 209.28.221.255 fr +209.28.221.0 - 209.28.221.255 us 209.28.222.0 - 209.28.223.255 se 209.28.224.0 - 209.28.226.255 gb 209.28.227.0 - 209.28.227.255 be -209.28.228.0 - 209.28.228.63 fr -209.28.228.64 - 209.28.228.191 us -209.28.228.192 - 209.28.228.223 fr -209.28.228.224 - 209.28.228.255 us -209.28.229.0 - 209.28.229.31 it -209.28.229.32 - 209.28.229.63 us -209.28.229.64 - 209.28.229.95 at -209.28.229.96 - 209.28.229.255 us +209.28.228.0 - 209.28.229.255 us 209.28.230.0 - 209.28.230.255 gb 209.28.231.0 - 209.28.231.255 gr 209.28.232.0 - 209.28.232.255 ie 209.28.233.0 - 209.28.233.255 no -209.28.234.0 - 209.28.234.127 gb -209.28.234.128 - 209.28.234.255 us +209.28.234.0 - 209.28.234.255 us 209.28.235.0 - 209.28.236.255 ch -209.28.237.0 - 209.28.237.127 gb -209.28.237.128 - 209.28.237.255 us -209.28.238.0 - 209.28.238.127 gb -209.28.238.128 - 209.28.238.255 us -209.28.239.0 - 209.28.239.127 de -209.28.239.128 - 209.28.239.191 gb -209.28.239.192 - 209.28.239.255 us +209.28.237.0 - 209.28.239.255 us 209.28.240.0 - 209.28.240.255 au 209.28.241.0 - 209.28.241.255 sg 209.28.242.0 - 209.28.242.255 my @@ -134535,420 +108459,181 @@ 209.28.250.0 - 209.28.251.255 ph 209.28.252.0 - 209.28.252.255 kr 209.28.253.0 - 209.28.253.255 jp -209.28.254.0 - 209.28.254.127 hk -209.28.254.128 - 209.28.254.159 id -209.28.254.160 - 209.28.254.191 us -209.28.254.192 - 209.28.254.223 sg -209.28.254.224 - 209.28.254.255 us +209.28.254.0 - 209.28.254.255 us 209.28.255.0 - 209.28.255.255 kr 209.29.0.0 - 209.29.255.255 ca 209.30.0.0 - 209.34.95.255 us 209.34.96.0 - 209.34.111.255 ca -209.34.112.0 - 209.34.248.79 us -209.34.248.80 - 209.34.248.95 gb -209.34.248.96 - 209.35.114.32 us -209.35.114.33 - 209.35.114.48 be -209.35.114.49 - 209.35.114.96 us -209.35.114.97 - 209.35.114.112 be -209.35.114.113 - 209.35.188.47 us -209.35.188.48 - 209.35.188.79 nl -209.35.188.80 - 209.35.190.79 us -209.35.190.80 - 209.35.190.95 it -209.35.190.96 - 209.41.127.255 us +209.34.112.0 - 209.41.75.255 us +209.41.76.0 - 209.41.76.255 br +209.41.77.0 - 209.41.127.255 us 209.41.128.0 - 209.41.159.255 ca 209.41.160.0 - 209.42.95.255 us 209.42.96.0 - 209.42.127.255 ca -209.42.128.0 - 209.44.16.255 us -209.44.17.0 - 209.44.17.7 ca -209.44.17.8 - 209.44.23.79 us -209.44.23.80 - 209.44.23.95 ca -209.44.23.96 - 209.44.23.191 us -209.44.23.192 - 209.44.23.255 ca -209.44.24.0 - 209.44.95.255 us +209.42.128.0 - 209.43.192.255 us +209.43.193.0 - 209.43.193.15 gb +209.43.193.16 - 209.44.95.255 us 209.44.96.0 - 209.44.113.55 ca 209.44.113.56 - 209.44.113.63 us 209.44.113.64 - 209.44.127.255 ca 209.44.128.0 - 209.44.255.255 us 209.45.0.0 - 209.45.127.255 pe -209.45.128.0 - 209.47.0.255 us -209.47.1.0 - 209.47.1.223 ca -209.47.1.224 - 209.47.1.239 us -209.47.1.240 - 209.47.3.255 ca -209.47.4.0 - 209.47.4.63 us -209.47.4.64 - 209.47.5.31 ca -209.47.5.32 - 209.47.5.63 us -209.47.5.64 - 209.47.8.127 ca -209.47.8.128 - 209.47.8.255 us -209.47.9.0 - 209.47.9.191 ca -209.47.9.192 - 209.47.9.255 us +209.45.128.0 - 209.47.1.255 us +209.47.2.0 - 209.47.2.255 ca +209.47.3.0 - 209.47.5.255 us +209.47.6.0 - 209.47.6.255 ca +209.47.7.0 - 209.47.9.255 us 209.47.10.0 - 209.47.10.255 ca 209.47.11.0 - 209.47.11.255 us -209.47.12.0 - 209.47.13.127 ca -209.47.13.128 - 209.47.13.255 us -209.47.14.0 - 209.47.15.255 ca +209.47.12.0 - 209.47.12.255 ca +209.47.13.0 - 209.47.15.255 us 209.47.16.0 - 209.47.16.255 kw -209.47.17.0 - 209.47.18.127 ca -209.47.18.128 - 209.47.18.255 us -209.47.19.0 - 209.47.19.127 ca -209.47.19.128 - 209.47.19.191 us -209.47.19.192 - 209.47.19.255 ca -209.47.20.0 - 209.47.20.15 us -209.47.20.16 - 209.47.21.63 ca -209.47.21.64 - 209.47.21.127 us -209.47.21.128 - 209.47.21.191 ca -209.47.21.192 - 209.47.22.255 us -209.47.23.0 - 209.47.24.255 ca +209.47.17.0 - 209.47.17.255 ca +209.47.18.0 - 209.47.23.255 us +209.47.24.0 - 209.47.24.255 ca 209.47.25.0 - 209.47.25.255 us -209.47.26.0 - 209.47.29.63 ca -209.47.29.64 - 209.47.29.127 us -209.47.29.128 - 209.47.33.31 ca -209.47.33.32 - 209.47.33.95 us -209.47.33.96 - 209.47.34.31 ca -209.47.34.32 - 209.47.34.79 us -209.47.34.80 - 209.47.34.159 ca -209.47.34.160 - 209.47.34.175 us -209.47.34.176 - 209.47.35.255 ca -209.47.36.0 - 209.47.36.255 us -209.47.37.0 - 209.47.38.143 ca -209.47.38.144 - 209.47.38.159 us -209.47.38.160 - 209.47.38.255 ca -209.47.39.0 - 209.47.40.255 us -209.47.41.0 - 209.47.42.255 ca -209.47.43.0 - 209.47.43.255 us -209.47.44.0 - 209.47.44.127 ca -209.47.44.128 - 209.47.44.223 us -209.47.44.224 - 209.47.45.31 ca -209.47.45.32 - 209.47.45.95 us -209.47.45.96 - 209.47.46.127 ca -209.47.46.128 - 209.47.46.255 us -209.47.47.0 - 209.47.47.191 ca -209.47.47.192 - 209.47.47.255 us +209.47.26.0 - 209.47.28.255 ca +209.47.29.0 - 209.47.31.255 us +209.47.32.0 - 209.47.32.255 ca +209.47.33.0 - 209.47.36.255 us +209.47.37.0 - 209.47.37.255 ca +209.47.38.0 - 209.47.41.255 us +209.47.42.0 - 209.47.42.127 ca +209.47.42.128 - 209.47.47.255 us 209.47.48.0 - 209.47.55.255 ca 209.47.56.0 - 209.47.56.255 us -209.47.57.0 - 209.47.59.31 ca -209.47.59.32 - 209.47.59.95 us -209.47.59.96 - 209.47.59.127 ca -209.47.59.128 - 209.47.59.159 us -209.47.59.160 - 209.47.60.127 ca -209.47.60.128 - 209.47.62.127 us -209.47.62.128 - 209.47.62.159 ca -209.47.62.160 - 209.47.63.255 us -209.47.64.0 - 209.47.67.47 ca -209.47.67.48 - 209.47.67.63 us -209.47.67.64 - 209.47.72.127 ca -209.47.72.128 - 209.47.72.255 us -209.47.73.0 - 209.47.78.31 ca -209.47.78.32 - 209.47.78.47 us -209.47.78.48 - 209.47.78.95 ca -209.47.78.96 - 209.47.78.111 us -209.47.78.112 - 209.47.78.143 ca -209.47.78.144 - 209.47.78.159 no -209.47.78.160 - 209.47.79.255 ca +209.47.57.0 - 209.47.58.255 ca +209.47.59.0 - 209.47.63.255 us +209.47.64.0 - 209.47.65.255 ca +209.47.66.0 - 209.47.66.255 us +209.47.67.0 - 209.47.68.255 ca +209.47.69.0 - 209.47.69.255 us +209.47.70.0 - 209.47.71.255 ca +209.47.72.0 - 209.47.73.255 us +209.47.74.0 - 209.47.77.255 ca +209.47.78.0 - 209.47.78.255 us +209.47.79.0 - 209.47.79.255 ca 209.47.80.0 - 209.47.80.255 us 209.47.81.0 - 209.47.81.255 ca -209.47.82.0 - 209.47.82.255 us -209.47.83.0 - 209.47.83.95 ca -209.47.83.96 - 209.47.83.111 us -209.47.83.112 - 209.47.83.239 ca -209.47.83.240 - 209.47.83.255 us -209.47.84.0 - 209.47.84.63 ca -209.47.84.64 - 209.47.84.127 us -209.47.84.128 - 209.47.84.255 ca -209.47.85.0 - 209.47.85.31 us -209.47.85.32 - 209.47.85.255 ca -209.47.86.0 - 209.47.86.255 us -209.47.87.0 - 209.47.91.31 ca -209.47.91.32 - 209.47.91.63 us -209.47.91.64 - 209.47.92.63 ca -209.47.92.64 - 209.47.92.111 us -209.47.92.112 - 209.47.92.175 ca -209.47.92.176 - 209.47.92.191 us -209.47.92.192 - 209.47.93.255 ca -209.47.94.0 - 209.47.94.255 us -209.47.95.0 - 209.47.101.255 ca +209.47.82.0 - 209.47.84.127 us +209.47.84.128 - 209.47.84.191 ca +209.47.84.192 - 209.47.86.255 us +209.47.87.0 - 209.47.90.127 ca +209.47.90.128 - 209.47.91.255 us +209.47.92.0 - 209.47.92.255 ca +209.47.93.0 - 209.47.95.255 us +209.47.96.0 - 209.47.96.255 ca +209.47.97.0 - 209.47.97.255 us +209.47.98.0 - 209.47.99.255 ca +209.47.100.0 - 209.47.100.255 us +209.47.101.0 - 209.47.101.255 ca 209.47.102.0 - 209.47.102.255 us -209.47.103.0 - 209.47.104.191 ca -209.47.104.192 - 209.47.105.255 us -209.47.106.0 - 209.47.108.15 ca -209.47.108.16 - 209.47.108.31 us -209.47.108.32 - 209.47.108.47 ca -209.47.108.48 - 209.47.108.79 us -209.47.108.80 - 209.47.108.223 ca -209.47.108.224 - 209.47.108.239 us -209.47.108.240 - 209.47.122.255 ca -209.47.123.0 - 209.47.123.255 us -209.47.124.0 - 209.47.135.255 ca -209.47.136.0 - 209.47.136.255 us -209.47.137.0 - 209.47.138.191 ca -209.47.138.192 - 209.47.138.255 us -209.47.139.0 - 209.47.139.127 ca -209.47.139.128 - 209.47.139.191 us -209.47.139.192 - 209.47.143.175 ca -209.47.143.176 - 209.47.143.191 us -209.47.143.192 - 209.47.152.191 ca -209.47.152.192 - 209.47.153.255 us -209.47.154.0 - 209.47.156.95 ca -209.47.156.96 - 209.47.156.127 us -209.47.156.128 - 209.47.156.191 ca -209.47.156.192 - 209.47.156.223 us -209.47.156.224 - 209.47.156.255 ca -209.47.157.0 - 209.47.157.31 us -209.47.157.32 - 209.47.157.255 ca -209.47.158.0 - 209.47.158.255 us +209.47.103.0 - 209.47.103.255 ca +209.47.104.0 - 209.47.108.111 us +209.47.108.112 - 209.47.108.127 ca +209.47.108.128 - 209.47.109.255 us +209.47.110.0 - 209.47.111.255 ca +209.47.112.0 - 209.47.129.255 us +209.47.130.0 - 209.47.130.255 ca +209.47.131.0 - 209.47.131.255 us +209.47.132.0 - 209.47.133.255 ca +209.47.134.0 - 209.47.140.255 us +209.47.141.0 - 209.47.143.15 ca +209.47.143.16 - 209.47.143.255 us +209.47.144.0 - 209.47.144.255 ca +209.47.145.0 - 209.47.145.255 us +209.47.146.0 - 209.47.149.255 ca +209.47.150.0 - 209.47.153.255 us +209.47.154.0 - 209.47.154.255 ca +209.47.155.0 - 209.47.158.255 us 209.47.159.0 - 209.47.159.255 kw -209.47.160.0 - 209.47.163.255 ca -209.47.164.0 - 209.47.165.127 us -209.47.165.128 - 209.47.167.127 ca -209.47.167.128 - 209.47.167.191 us -209.47.167.192 - 209.47.172.255 ca -209.47.173.0 - 209.47.173.127 us -209.47.173.128 - 209.47.173.255 ca -209.47.174.0 - 209.47.175.31 us -209.47.175.32 - 209.47.182.159 ca -209.47.182.160 - 209.47.182.191 us -209.47.182.192 - 209.47.189.79 ca -209.47.189.80 - 209.47.189.95 us -209.47.189.96 - 209.47.189.127 ca -209.47.189.128 - 209.47.189.143 us -209.47.189.144 - 209.47.189.207 ca -209.47.189.208 - 209.47.189.223 us -209.47.189.224 - 209.47.190.175 ca -209.47.190.176 - 209.47.190.191 us -209.47.190.192 - 209.47.190.223 ca -209.47.190.224 - 209.47.190.239 us -209.47.190.240 - 209.47.197.255 ca -209.47.198.0 - 209.47.199.255 us -209.47.200.0 - 209.47.200.127 ca -209.47.200.128 - 209.47.200.255 us -209.47.201.0 - 209.47.201.127 ca -209.47.201.128 - 209.47.201.255 us -209.47.202.0 - 209.47.203.127 ca -209.47.203.128 - 209.47.204.127 us -209.47.204.128 - 209.47.206.255 ca -209.47.207.0 - 209.47.208.63 us -209.47.208.64 - 209.47.208.79 ca -209.47.208.80 - 209.47.208.255 us -209.47.209.0 - 209.47.209.255 ca -209.47.210.0 - 209.47.210.127 us -209.47.210.128 - 209.47.215.111 ca -209.47.215.112 - 209.47.215.127 us -209.47.215.128 - 209.47.216.255 ca -209.47.217.0 - 209.47.217.31 us -209.47.217.32 - 209.47.217.63 ca -209.47.217.64 - 209.47.217.95 us -209.47.217.96 - 209.47.224.15 ca -209.47.224.16 - 209.47.225.63 us -209.47.225.64 - 209.47.225.127 ca -209.47.225.128 - 209.47.225.255 us -209.47.226.0 - 209.47.226.63 ca -209.47.226.64 - 209.47.226.79 us -209.47.226.80 - 209.47.227.255 ca -209.47.228.0 - 209.47.228.255 us -209.47.229.0 - 209.47.230.191 ca -209.47.230.192 - 209.47.230.255 us -209.47.231.0 - 209.47.231.63 ca -209.47.231.64 - 209.47.231.79 us -209.47.231.80 - 209.47.231.159 ca -209.47.231.160 - 209.47.231.175 us -209.47.231.176 - 209.47.231.223 ca -209.47.231.224 - 209.47.231.239 us -209.47.231.240 - 209.47.231.255 ca -209.47.232.0 - 209.47.232.255 us -209.47.233.0 - 209.47.234.127 ca -209.47.234.128 - 209.47.234.255 us -209.47.235.0 - 209.47.237.255 ca -209.47.238.0 - 209.47.238.63 us -209.47.238.64 - 209.47.238.191 ca -209.47.238.192 - 209.47.238.255 us +209.47.160.0 - 209.47.161.255 ca +209.47.162.0 - 209.47.162.255 us +209.47.163.0 - 209.47.163.255 ca +209.47.164.0 - 209.47.165.255 us +209.47.166.0 - 209.47.166.255 ca +209.47.167.0 - 209.47.167.255 us +209.47.168.0 - 209.47.168.255 ca +209.47.169.0 - 209.47.169.255 us +209.47.170.0 - 209.47.172.255 ca +209.47.173.0 - 209.47.175.255 us +209.47.176.0 - 209.47.177.255 ca +209.47.178.0 - 209.47.179.255 us +209.47.180.0 - 209.47.180.255 ca +209.47.181.0 - 209.47.182.255 us +209.47.183.0 - 209.47.187.255 ca +209.47.188.0 - 209.47.190.255 us +209.47.191.0 - 209.47.197.255 ca +209.47.198.0 - 209.47.201.255 us +209.47.202.0 - 209.47.202.255 ca +209.47.203.0 - 209.47.210.255 us +209.47.211.0 - 209.47.214.255 ca +209.47.215.0 - 209.47.215.63 us +209.47.215.64 - 209.47.215.79 ca +209.47.215.80 - 209.47.215.255 us +209.47.216.0 - 209.47.216.255 ca +209.47.217.0 - 209.47.217.255 us +209.47.218.0 - 209.47.223.255 ca +209.47.224.0 - 209.47.224.255 us +209.47.225.0 - 209.47.225.255 ca +209.47.226.0 - 209.47.228.255 us +209.47.229.0 - 209.47.229.255 ca +209.47.230.0 - 209.47.232.255 us +209.47.233.0 - 209.47.233.255 ca +209.47.234.0 - 209.47.236.255 us +209.47.237.0 - 209.47.237.255 ca +209.47.238.0 - 209.47.238.255 us 209.47.239.0 - 209.47.239.255 ca 209.47.240.0 - 209.47.240.255 us 209.47.241.0 - 209.47.241.255 ca -209.47.242.0 - 209.47.243.127 us -209.47.243.128 - 209.47.245.31 ca -209.47.245.32 - 209.47.245.63 us -209.47.245.64 - 209.47.245.143 ca -209.47.245.144 - 209.47.245.159 us -209.47.245.160 - 209.47.245.175 ca -209.47.245.176 - 209.47.245.191 us -209.47.245.192 - 209.47.245.207 ca -209.47.245.208 - 209.47.245.223 us -209.47.245.224 - 209.47.245.239 ca -209.47.245.240 - 209.47.245.255 us -209.47.246.0 - 209.47.246.63 ca -209.47.246.64 - 209.47.246.95 us -209.47.246.96 - 209.47.246.191 ca -209.47.246.192 - 209.47.246.255 us -209.47.247.0 - 209.47.251.255 ca +209.47.242.0 - 209.47.249.255 us +209.47.250.0 - 209.47.251.255 ca 209.47.252.0 - 209.47.254.255 us 209.47.255.0 - 209.47.255.255 ca 209.48.0.0 - 209.50.63.255 us 209.50.64.0 - 209.50.95.255 ca -209.50.96.0 - 209.50.230.167 us -209.50.230.168 - 209.50.230.179 gr -209.50.230.180 - 209.50.230.189 us -209.50.230.190 - 209.50.230.209 gb -209.50.230.210 - 209.50.231.40 us -209.50.231.41 - 209.50.231.55 gb -209.50.231.56 - 209.50.231.58 us -209.50.231.59 - 209.50.231.83 gb -209.50.231.84 - 209.50.231.183 us -209.50.231.184 - 209.50.231.215 hr -209.50.231.216 - 209.50.232.239 us -209.50.232.240 - 209.50.232.255 gr -209.50.233.0 - 209.50.235.0 us -209.50.235.1 - 209.50.235.16 ca -209.50.235.17 - 209.50.235.192 us -209.50.235.193 - 209.50.235.208 gb -209.50.235.209 - 209.50.235.224 ca -209.50.235.225 - 209.50.236.84 us -209.50.236.85 - 209.50.236.94 th -209.50.236.95 - 209.50.236.117 us -209.50.236.118 - 209.50.236.132 ca -209.50.236.133 - 209.50.236.144 us -209.50.236.145 - 209.50.236.160 nl -209.50.236.161 - 209.50.236.176 us -209.50.236.177 - 209.50.236.192 dk -209.50.236.193 - 209.50.236.224 us -209.50.236.225 - 209.50.236.254 de -209.50.236.255 - 209.50.237.0 us -209.50.237.1 - 209.50.237.32 de -209.50.237.33 - 209.50.237.48 ca -209.50.237.49 - 209.50.237.176 us -209.50.237.177 - 209.50.237.254 ca -209.50.237.255 - 209.50.238.31 us -209.50.238.32 - 209.50.238.47 au -209.50.238.48 - 209.50.238.71 us -209.50.238.72 - 209.50.238.79 it -209.50.238.80 - 209.50.238.151 us -209.50.238.152 - 209.50.238.159 ca -209.50.238.160 - 209.50.238.175 us -209.50.238.176 - 209.50.238.183 sa -209.50.238.184 - 209.50.238.223 us -209.50.238.224 - 209.50.238.231 au -209.50.238.232 - 209.50.238.239 us -209.50.238.240 - 209.50.238.247 it -209.50.238.248 - 209.50.243.7 us -209.50.243.8 - 209.50.243.15 cn -209.50.243.16 - 209.50.243.23 ru -209.50.243.24 - 209.50.243.63 us -209.50.243.64 - 209.50.243.71 th -209.50.243.72 - 209.50.243.119 us -209.50.243.120 - 209.50.243.127 it -209.50.243.128 - 209.50.244.41 us -209.50.244.42 - 209.50.244.137 id -209.50.244.138 - 209.50.244.176 us -209.50.244.177 - 209.50.244.240 id -209.50.244.241 - 209.50.247.63 us -209.50.247.64 - 209.50.247.95 in -209.50.247.96 - 209.50.247.223 us -209.50.247.224 - 209.50.247.255 nl -209.50.248.0 - 209.50.249.15 us -209.50.249.16 - 209.50.249.23 ca -209.50.249.24 - 209.50.249.159 us -209.50.249.160 - 209.50.249.167 co -209.50.249.168 - 209.50.249.215 us -209.50.249.216 - 209.50.249.223 ru -209.50.249.224 - 209.50.249.231 us -209.50.249.232 - 209.50.249.239 gb -209.50.249.240 - 209.50.250.63 us -209.50.250.64 - 209.50.250.95 in -209.50.250.96 - 209.51.163.127 us -209.51.163.128 - 209.51.163.143 de -209.51.163.144 - 209.51.191.127 us -209.51.191.128 - 209.51.191.159 gb -209.51.191.160 - 209.51.194.143 us -209.51.194.144 - 209.51.194.151 be -209.51.194.152 - 209.51.195.7 us -209.51.195.8 - 209.51.195.15 gb -209.51.195.16 - 209.51.197.31 us -209.51.197.32 - 209.51.197.39 be -209.51.197.40 - 209.51.197.223 us -209.51.197.224 - 209.51.197.231 in -209.51.197.232 - 209.51.199.111 us -209.51.199.112 - 209.51.199.127 lb -209.51.199.128 - 209.51.199.191 us -209.51.199.192 - 209.51.199.223 il -209.51.199.224 - 209.51.200.55 us -209.51.200.56 - 209.51.200.63 at -209.51.200.64 - 209.51.200.127 us -209.51.200.128 - 209.51.200.135 in -209.51.200.136 - 209.51.200.143 ca -209.51.200.144 - 209.51.200.151 us -209.51.200.152 - 209.51.200.159 gb -209.51.200.160 - 209.51.205.143 us -209.51.205.144 - 209.51.205.151 in -209.51.205.152 - 209.51.207.63 us -209.51.207.64 - 209.51.207.71 ca -209.51.207.72 - 209.51.207.79 in -209.51.207.80 - 209.51.207.95 us -209.51.207.96 - 209.51.207.127 ph -209.51.207.128 - 209.51.207.231 us -209.51.207.232 - 209.51.207.239 za -209.51.207.240 - 209.51.209.127 us -209.51.209.128 - 209.51.209.159 il -209.51.209.160 - 209.51.210.255 us -209.51.211.0 - 209.51.211.7 no -209.51.211.8 - 209.51.211.23 us -209.51.211.24 - 209.51.211.31 bd -209.51.211.32 - 209.51.211.95 us -209.51.211.96 - 209.51.211.103 in -209.51.211.104 - 209.51.212.79 us -209.51.212.80 - 209.51.212.95 co -209.51.212.96 - 209.51.213.95 us -209.51.213.96 - 209.51.213.103 gb -209.51.213.104 - 209.51.221.111 us -209.51.221.112 - 209.51.221.119 gb -209.51.221.120 - 209.51.223.55 us -209.51.223.56 - 209.51.223.71 gb -209.51.223.72 - 209.51.223.183 us -209.51.223.184 - 209.51.223.191 gb -209.51.223.192 - 209.51.255.255 us +209.50.96.0 - 209.51.185.255 us +209.51.186.0 - 209.51.186.63 ca +209.51.186.64 - 209.51.255.255 us 209.52.0.0 - 209.53.255.255 ca 209.54.0.0 - 209.54.63.255 us 209.54.64.0 - 209.54.79.255 ca 209.54.80.0 - 209.54.111.255 us -209.54.112.0 - 209.54.127.255 ca -209.54.128.0 - 209.57.255.255 us -209.58.0.0 - 209.58.5.191 ca -209.58.5.192 - 209.58.5.223 am -209.58.5.224 - 209.58.5.255 ca -209.58.6.0 - 209.58.6.255 us -209.58.7.0 - 209.58.7.39 ca -209.58.7.40 - 209.58.7.47 us -209.58.7.48 - 209.58.11.255 ca +209.54.112.0 - 209.54.125.255 ca +209.54.126.0 - 209.58.5.231 us +209.58.5.232 - 209.58.5.239 ca +209.58.5.240 - 209.58.11.255 us 209.58.12.0 - 209.58.12.255 om -209.58.13.0 - 209.58.23.255 ca +209.58.13.0 - 209.58.23.255 us 209.58.24.0 - 209.58.24.255 bd -209.58.25.0 - 209.58.29.79 ca -209.58.29.80 - 209.58.29.119 us -209.58.29.120 - 209.58.39.255 ca +209.58.25.0 - 209.58.39.255 us 209.58.40.0 - 209.58.41.255 qa -209.58.42.0 - 209.58.47.255 ca +209.58.42.0 - 209.58.47.255 us 209.58.48.0 - 209.58.52.255 do -209.58.53.0 - 209.58.54.255 ca +209.58.53.0 - 209.58.54.255 us 209.58.55.0 - 209.58.55.255 nc -209.58.56.0 - 209.58.56.63 us -209.58.56.64 - 209.58.56.191 ca -209.58.56.192 - 209.58.56.207 us -209.58.56.208 - 209.58.63.79 ca -209.58.63.80 - 209.58.63.87 us -209.58.63.88 - 209.58.86.255 ca +209.58.56.0 - 209.58.57.255 us +209.58.58.0 - 209.58.59.255 ca +209.58.60.0 - 209.58.71.255 us +209.58.72.0 - 209.58.73.255 ca +209.58.74.0 - 209.58.86.255 us 209.58.87.0 - 209.58.87.255 zm -209.58.88.0 - 209.58.91.255 ca -209.58.92.0 - 209.58.92.255 us -209.58.93.0 - 209.58.96.255 ca +209.58.88.0 - 209.58.93.255 us +209.58.94.0 - 209.58.94.255 ca +209.58.95.0 - 209.58.96.255 us 209.58.97.0 - 209.58.97.255 ug -209.58.98.0 - 209.58.114.255 ca +209.58.98.0 - 209.58.100.255 us +209.58.101.0 - 209.58.101.255 ca +209.58.102.0 - 209.58.113.255 us +209.58.114.0 - 209.58.114.255 ca 209.58.115.0 - 209.58.115.255 sy -209.58.116.0 - 209.58.119.127 ca -209.58.119.128 - 209.58.119.255 co +209.58.116.0 - 209.58.119.255 us 209.58.120.0 - 209.58.122.255 ly 209.58.123.0 - 209.58.123.255 sy -209.58.124.0 - 209.58.127.255 ca -209.58.128.0 - 209.58.176.135 us -209.58.176.136 - 209.58.176.143 ca -209.58.176.144 - 209.59.31.255 us -209.59.32.0 - 209.59.63.255 a1 +209.58.124.0 - 209.58.175.255 us +209.58.176.0 - 209.58.183.255 sg +209.58.184.0 - 209.58.191.255 hk +209.58.192.0 - 209.59.63.255 us 209.59.64.0 - 209.59.65.255 vg 209.59.66.0 - 209.59.66.255 ag 209.59.67.0 - 209.59.67.255 kn @@ -134960,11 +108645,7 @@ 209.59.88.0 - 209.59.91.255 ag 209.59.92.0 - 209.59.92.255 kn 209.59.93.0 - 209.59.93.255 ms -209.59.94.0 - 209.59.95.191 ag -209.59.95.192 - 209.59.95.207 ms -209.59.95.208 - 209.59.95.215 ag -209.59.95.216 - 209.59.95.223 ms -209.59.95.224 - 209.59.96.255 ag +209.59.94.0 - 209.59.96.255 ag 209.59.97.0 - 209.59.97.255 ms 209.59.98.0 - 209.59.103.255 ag 209.59.104.0 - 209.59.107.255 dm @@ -134978,542 +108659,58 @@ 209.59.121.0 - 209.59.121.255 vg 209.59.122.0 - 209.59.126.255 ag 209.59.127.0 - 209.59.127.255 lc -209.59.128.0 - 209.59.131.132 us -209.59.131.133 - 209.59.131.148 es -209.59.131.149 - 209.61.128.23 us -209.61.128.24 - 209.61.128.31 gb -209.61.128.32 - 209.61.128.111 us -209.61.128.112 - 209.61.128.119 mx -209.61.128.120 - 209.61.128.239 us -209.61.128.240 - 209.61.128.247 mx -209.61.128.248 - 209.61.128.255 nz -209.61.129.0 - 209.61.129.31 us -209.61.129.32 - 209.61.129.39 ca -209.61.129.40 - 209.61.129.47 id -209.61.129.48 - 209.61.129.159 us -209.61.129.160 - 209.61.129.175 ag -209.61.129.176 - 209.61.129.191 us -209.61.129.192 - 209.61.129.199 ca -209.61.129.200 - 209.61.129.207 us -209.61.129.208 - 209.61.129.223 au -209.61.129.224 - 209.61.129.231 ru -209.61.129.232 - 209.61.129.239 ca -209.61.129.240 - 209.61.129.255 bs -209.61.130.0 - 209.61.130.47 us -209.61.130.48 - 209.61.130.55 fr -209.61.130.56 - 209.61.130.63 be -209.61.130.64 - 209.61.130.71 us -209.61.130.72 - 209.61.130.79 au -209.61.130.80 - 209.61.130.103 us -209.61.130.104 - 209.61.130.111 au -209.61.130.112 - 209.61.130.127 us -209.61.130.128 - 209.61.130.143 id -209.61.130.144 - 209.61.130.159 us -209.61.130.160 - 209.61.130.175 my -209.61.130.176 - 209.61.130.223 us -209.61.130.224 - 209.61.130.231 gb -209.61.130.232 - 209.61.130.239 us -209.61.130.240 - 209.61.130.247 ch -209.61.130.248 - 209.61.130.255 gr -209.61.131.0 - 209.61.131.23 us -209.61.131.24 - 209.61.131.31 be -209.61.131.32 - 209.61.131.111 us -209.61.131.112 - 209.61.131.119 ca -209.61.131.120 - 209.61.131.143 us -209.61.131.144 - 209.61.131.151 in -209.61.131.152 - 209.61.131.191 us -209.61.131.192 - 209.61.131.199 my -209.61.131.200 - 209.61.131.223 us -209.61.131.224 - 209.61.131.231 ca -209.61.131.232 - 209.61.131.239 vg -209.61.131.240 - 209.61.131.247 us -209.61.131.248 - 209.61.131.255 de -209.61.132.0 - 209.61.132.87 us -209.61.132.88 - 209.61.132.95 ca -209.61.132.96 - 209.61.132.111 au -209.61.132.112 - 209.61.132.119 ch -209.61.132.120 - 209.61.132.135 us -209.61.132.136 - 209.61.132.143 in -209.61.132.144 - 209.61.132.183 us -209.61.132.184 - 209.61.132.199 ca -209.61.132.200 - 209.61.132.223 us -209.61.132.224 - 209.61.132.231 um -209.61.132.232 - 209.61.132.239 ca -209.61.132.240 - 209.61.132.255 in -209.61.133.0 - 209.61.133.7 us -209.61.133.8 - 209.61.133.15 in -209.61.133.16 - 209.61.133.31 us -209.61.133.32 - 209.61.133.39 gb -209.61.133.40 - 209.61.133.87 us -209.61.133.88 - 209.61.133.95 in -209.61.133.96 - 209.61.133.103 ca -209.61.133.104 - 209.61.133.111 gb -209.61.133.112 - 209.61.133.143 us -209.61.133.144 - 209.61.133.151 ca -209.61.133.152 - 209.61.133.159 ru -209.61.133.160 - 209.61.133.167 ca -209.61.133.168 - 209.61.133.175 mx -209.61.133.176 - 209.61.133.255 us -209.61.134.0 - 209.61.134.7 dk -209.61.134.8 - 209.61.134.15 us -209.61.134.16 - 209.61.134.31 dk -209.61.134.32 - 209.61.134.39 ca -209.61.134.40 - 209.61.134.151 us -209.61.134.152 - 209.61.134.175 ca -209.61.134.176 - 209.61.134.183 tw -209.61.134.184 - 209.61.134.207 us -209.61.134.208 - 209.61.134.215 il -209.61.134.216 - 209.61.134.223 th -209.61.134.224 - 209.61.134.231 us -209.61.134.232 - 209.61.134.239 ch -209.61.134.240 - 209.61.135.55 us -209.61.135.56 - 209.61.135.63 gb -209.61.135.64 - 209.61.135.71 nl -209.61.135.72 - 209.61.135.223 us -209.61.135.224 - 209.61.135.231 br -209.61.135.232 - 209.61.135.247 us -209.61.135.248 - 209.61.135.255 in -209.61.136.0 - 209.61.136.87 us -209.61.136.88 - 209.61.136.95 se -209.61.136.96 - 209.61.136.119 us -209.61.136.120 - 209.61.136.127 gr -209.61.136.128 - 209.61.136.143 us -209.61.136.144 - 209.61.136.151 gb -209.61.136.152 - 209.61.136.159 us -209.61.136.160 - 209.61.136.175 gb -209.61.136.176 - 209.61.136.199 us -209.61.136.200 - 209.61.136.207 fr -209.61.136.208 - 209.61.136.215 us -209.61.136.216 - 209.61.136.223 ar -209.61.136.224 - 209.61.137.15 us +209.59.128.0 - 209.61.137.15 us 209.61.137.16 - 209.61.137.23 il -209.61.137.24 - 209.61.137.47 us -209.61.137.48 - 209.61.137.63 in -209.61.137.64 - 209.61.137.87 us -209.61.137.88 - 209.61.137.95 ch -209.61.137.96 - 209.61.137.127 bh -209.61.137.128 - 209.61.137.207 us -209.61.137.208 - 209.61.137.223 gb -209.61.137.224 - 209.61.138.15 us -209.61.138.16 - 209.61.138.31 ca -209.61.138.32 - 209.61.138.39 us -209.61.138.40 - 209.61.138.47 hr -209.61.138.48 - 209.61.138.55 us -209.61.138.56 - 209.61.138.63 de -209.61.138.64 - 209.61.138.143 us -209.61.138.144 - 209.61.138.151 ie -209.61.138.152 - 209.61.138.239 us -209.61.138.240 - 209.61.138.247 gr -209.61.138.248 - 209.61.139.7 us -209.61.139.8 - 209.61.139.15 au -209.61.139.16 - 209.61.139.31 us -209.61.139.32 - 209.61.139.63 fr -209.61.139.64 - 209.61.139.87 us -209.61.139.88 - 209.61.139.95 hk -209.61.139.96 - 209.61.139.111 fr -209.61.139.112 - 209.61.139.183 us -209.61.139.184 - 209.61.139.191 de -209.61.139.192 - 209.61.139.215 us -209.61.139.216 - 209.61.139.223 in -209.61.139.224 - 209.61.140.23 us -209.61.140.24 - 209.61.140.31 jp -209.61.140.32 - 209.61.140.71 us -209.61.140.72 - 209.61.140.79 ca -209.61.140.80 - 209.61.140.111 us -209.61.140.112 - 209.61.140.119 in -209.61.140.120 - 209.61.140.159 us -209.61.140.160 - 209.61.140.167 mx -209.61.140.168 - 209.61.140.191 us -209.61.140.192 - 209.61.140.207 ve -209.61.140.208 - 209.61.140.231 us -209.61.140.232 - 209.61.140.239 in -209.61.140.240 - 209.61.141.15 us -209.61.141.16 - 209.61.141.23 id -209.61.141.24 - 209.61.141.55 us -209.61.141.56 - 209.61.141.63 ar -209.61.141.64 - 209.61.141.71 in -209.61.141.72 - 209.61.141.175 us -209.61.141.176 - 209.61.141.183 gb -209.61.141.184 - 209.61.141.255 us -209.61.142.0 - 209.61.142.15 in -209.61.142.16 - 209.61.142.23 fr -209.61.142.24 - 209.61.142.31 ca -209.61.142.32 - 209.61.142.39 it -209.61.142.40 - 209.61.142.47 sg -209.61.142.48 - 209.61.142.103 us -209.61.142.104 - 209.61.142.111 ae -209.61.142.112 - 209.61.142.255 us -209.61.143.0 - 209.61.143.15 in -209.61.143.16 - 209.61.143.23 us -209.61.143.24 - 209.61.143.31 eg -209.61.143.32 - 209.61.143.63 us -209.61.143.64 - 209.61.143.127 ag -209.61.143.128 - 209.61.144.31 us -209.61.144.32 - 209.61.144.39 ar -209.61.144.40 - 209.61.144.47 us -209.61.144.48 - 209.61.144.63 ar -209.61.144.64 - 209.61.144.87 us -209.61.144.88 - 209.61.144.95 ca -209.61.144.96 - 209.61.144.96 us -209.61.144.97 - 209.61.144.127 de -209.61.144.128 - 209.61.144.215 us -209.61.144.216 - 209.61.144.223 nl -209.61.144.224 - 209.61.145.127 us -209.61.145.128 - 209.61.145.135 tr -209.61.145.136 - 209.61.145.143 us -209.61.145.144 - 209.61.145.159 ve -209.61.145.160 - 209.61.145.175 us -209.61.145.176 - 209.61.145.183 nz -209.61.145.184 - 209.61.145.191 us -209.61.145.192 - 209.61.145.199 de -209.61.145.200 - 209.61.145.215 us -209.61.145.216 - 209.61.145.223 fr -209.61.145.224 - 209.61.145.239 ie -209.61.145.240 - 209.61.145.255 us -209.61.146.0 - 209.61.146.7 in -209.61.146.8 - 209.61.146.15 us -209.61.146.16 - 209.61.146.23 fr -209.61.146.24 - 209.61.146.31 ru -209.61.146.32 - 209.61.146.127 us -209.61.146.128 - 209.61.146.167 de -209.61.146.168 - 209.61.146.191 us -209.61.146.192 - 209.61.146.231 de -209.61.146.232 - 209.61.146.247 us -209.61.146.248 - 209.61.146.255 nl -209.61.147.0 - 209.61.147.39 de -209.61.147.40 - 209.61.147.135 us -209.61.147.136 - 209.61.147.143 id -209.61.147.144 - 209.61.147.151 au -209.61.147.152 - 209.61.147.175 us -209.61.147.176 - 209.61.147.183 gb -209.61.147.184 - 209.61.147.223 us -209.61.147.224 - 209.61.147.231 by -209.61.147.232 - 209.61.149.55 us -209.61.149.56 - 209.61.149.63 mx -209.61.149.64 - 209.61.150.191 us -209.61.150.192 - 209.61.150.207 tc -209.61.150.208 - 209.61.150.239 us -209.61.150.240 - 209.61.150.255 au -209.61.151.0 - 209.61.153.143 us -209.61.153.144 - 209.61.153.151 au -209.61.153.152 - 209.61.153.159 se -209.61.153.160 - 209.61.161.7 us -209.61.161.8 - 209.61.161.15 gb -209.61.161.16 - 209.61.161.31 us -209.61.161.32 - 209.61.161.55 gb -209.61.161.56 - 209.61.161.255 us -209.61.162.0 - 209.61.162.7 in -209.61.162.8 - 209.61.162.15 us -209.61.162.16 - 209.61.162.23 gb -209.61.162.24 - 209.61.162.31 mo -209.61.162.32 - 209.61.162.63 ag -209.61.162.64 - 209.61.162.175 us -209.61.162.176 - 209.61.162.183 in -209.61.162.184 - 209.61.162.191 us -209.61.162.192 - 209.61.162.207 gb -209.61.162.208 - 209.61.162.223 us -209.61.162.224 - 209.61.162.231 gb -209.61.162.232 - 209.61.163.247 us -209.61.163.248 - 209.61.163.255 gb -209.61.164.0 - 209.61.164.79 us -209.61.164.80 - 209.61.164.87 it -209.61.164.88 - 209.61.164.95 us -209.61.164.96 - 209.61.164.103 nl -209.61.164.104 - 209.61.164.151 us -209.61.164.152 - 209.61.164.159 ar -209.61.164.160 - 209.61.164.183 us -209.61.164.184 - 209.61.164.191 in -209.61.164.192 - 209.61.164.199 ca -209.61.164.200 - 209.61.165.47 us -209.61.165.48 - 209.61.165.55 gb -209.61.165.56 - 209.61.165.63 us -209.61.165.64 - 209.61.165.95 fi -209.61.165.96 - 209.61.165.151 us -209.61.165.152 - 209.61.165.159 in -209.61.165.160 - 209.61.165.191 us -209.61.165.192 - 209.61.165.199 mt -209.61.165.200 - 209.61.165.231 us -209.61.165.232 - 209.61.165.239 fi -209.61.165.240 - 209.61.166.159 us -209.61.166.160 - 209.61.166.191 fr -209.61.166.192 - 209.61.166.199 us -209.61.166.200 - 209.61.166.207 gb -209.61.166.208 - 209.61.166.215 us -209.61.166.216 - 209.61.166.223 ve -209.61.166.224 - 209.61.166.231 nl -209.61.166.232 - 209.61.166.255 us -209.61.167.0 - 209.61.167.7 mx -209.61.167.8 - 209.61.167.39 us -209.61.167.40 - 209.61.167.47 gb -209.61.167.48 - 209.61.167.63 us -209.61.167.64 - 209.61.167.71 gb -209.61.167.72 - 209.61.167.79 us -209.61.167.80 - 209.61.167.127 au -209.61.167.128 - 209.61.167.143 us -209.61.167.144 - 209.61.167.159 lb -209.61.167.160 - 209.61.167.183 us -209.61.167.184 - 209.61.167.191 cr -209.61.167.192 - 209.61.168.7 us -209.61.168.8 - 209.61.168.15 in -209.61.168.16 - 209.61.168.55 us -209.61.168.56 - 209.61.168.71 gb -209.61.168.72 - 209.61.168.95 us -209.61.168.96 - 209.61.168.103 in -209.61.168.104 - 209.61.168.247 us -209.61.168.248 - 209.61.168.255 gb -209.61.169.0 - 209.61.169.255 gu -209.61.170.0 - 209.61.170.7 us -209.61.170.8 - 209.61.170.15 id -209.61.170.16 - 209.61.170.47 us -209.61.170.48 - 209.61.170.55 ca -209.61.170.56 - 209.61.170.79 us -209.61.170.80 - 209.61.170.87 ca -209.61.170.88 - 209.61.170.95 gi -209.61.170.96 - 209.61.170.143 us -209.61.170.144 - 209.61.170.151 au -209.61.170.152 - 209.61.170.159 us -209.61.170.160 - 209.61.170.175 lb -209.61.170.176 - 209.61.170.215 us -209.61.170.216 - 209.61.170.223 gi -209.61.170.224 - 209.61.171.175 us +209.61.137.24 - 209.61.171.175 us 209.61.171.176 - 209.61.171.183 ie -209.61.171.184 - 209.61.171.215 us -209.61.171.216 - 209.61.171.223 de -209.61.171.224 - 209.61.171.239 us -209.61.171.240 - 209.61.171.247 de -209.61.171.248 - 209.61.172.7 us -209.61.172.8 - 209.61.172.15 de -209.61.172.16 - 209.61.172.31 us -209.61.172.32 - 209.61.172.47 es -209.61.172.48 - 209.61.172.63 us -209.61.172.64 - 209.61.172.71 my -209.61.172.72 - 209.61.172.79 us -209.61.172.80 - 209.61.172.87 au -209.61.172.88 - 209.61.172.95 us -209.61.172.96 - 209.61.172.103 ae -209.61.172.104 - 209.61.172.119 us -209.61.172.120 - 209.61.172.127 sg -209.61.172.128 - 209.61.172.175 us -209.61.172.176 - 209.61.172.183 fr -209.61.172.184 - 209.61.172.231 us -209.61.172.232 - 209.61.172.239 ca -209.61.172.240 - 209.61.172.247 mx -209.61.172.248 - 209.61.174.31 us -209.61.174.32 - 209.61.174.39 gb -209.61.174.40 - 209.61.174.47 ve -209.61.174.48 - 209.61.174.55 us -209.61.174.56 - 209.61.174.63 bz -209.61.174.64 - 209.61.174.143 us -209.61.174.144 - 209.61.174.151 gb -209.61.174.152 - 209.61.174.159 us -209.61.174.160 - 209.61.174.191 at -209.61.174.192 - 209.61.175.15 us -209.61.175.16 - 209.61.175.23 in -209.61.175.24 - 209.61.175.31 us -209.61.175.32 - 209.61.175.95 au -209.61.175.96 - 209.61.175.175 us -209.61.175.176 - 209.61.175.183 in -209.61.175.184 - 209.61.175.199 us -209.61.175.200 - 209.61.175.207 in -209.61.175.208 - 209.61.176.63 us -209.61.176.64 - 209.61.176.71 gb -209.61.176.72 - 209.61.176.95 us -209.61.176.96 - 209.61.176.127 cr -209.61.176.128 - 209.61.177.39 us -209.61.177.40 - 209.61.177.47 gb -209.61.177.48 - 209.61.177.63 us -209.61.177.64 - 209.61.177.79 ca -209.61.177.80 - 209.61.177.143 us -209.61.177.144 - 209.61.177.159 au -209.61.177.160 - 209.61.177.167 fr -209.61.177.168 - 209.61.177.207 us -209.61.177.208 - 209.61.177.223 es -209.61.177.224 - 209.61.177.255 us -209.61.178.0 - 209.61.178.7 my -209.61.178.8 - 209.61.179.15 us -209.61.179.16 - 209.61.179.23 au -209.61.179.24 - 209.61.179.47 us -209.61.179.48 - 209.61.179.55 ca -209.61.179.56 - 209.61.179.63 jp -209.61.179.64 - 209.61.179.79 au -209.61.179.80 - 209.61.179.191 us -209.61.179.192 - 209.61.179.207 ca -209.61.179.208 - 209.61.179.255 us -209.61.180.0 - 209.61.180.7 mx -209.61.180.8 - 209.61.180.15 ru -209.61.180.16 - 209.61.180.191 us -209.61.180.192 - 209.61.180.223 ca -209.61.180.224 - 209.61.180.231 ar -209.61.180.232 - 209.67.9.167 us -209.67.9.168 - 209.67.9.175 gb -209.67.9.176 - 209.67.17.15 us -209.67.17.16 - 209.67.17.31 ca -209.67.17.32 - 209.67.29.191 us -209.67.29.192 - 209.67.29.207 ca -209.67.29.208 - 209.67.39.95 us -209.67.39.96 - 209.67.39.111 gb -209.67.39.112 - 209.67.39.175 us -209.67.39.176 - 209.67.39.191 gb -209.67.39.192 - 209.67.40.15 us -209.67.40.16 - 209.67.40.31 in -209.67.40.32 - 209.67.54.207 us -209.67.54.208 - 209.67.54.215 ca -209.67.54.216 - 209.67.54.223 gb -209.67.54.224 - 209.67.59.255 us +209.61.171.184 - 209.62.175.255 us +209.62.176.0 - 209.62.191.255 ca +209.62.192.0 - 209.66.97.95 us +209.66.97.96 - 209.66.97.127 gb +209.66.97.128 - 209.67.59.255 us 209.67.60.0 - 209.67.61.255 ca -209.67.62.0 - 209.67.68.63 us -209.67.68.64 - 209.67.68.95 ca -209.67.68.96 - 209.68.11.34 us -209.68.11.35 - 209.68.11.35 ie -209.68.11.36 - 209.68.159.255 us +209.67.62.0 - 209.68.159.255 us 209.68.160.0 - 209.68.191.255 ca -209.68.192.0 - 209.71.147.255 us -209.71.148.0 - 209.71.155.255 ca -209.71.156.0 - 209.71.191.255 us +209.68.192.0 - 209.71.191.255 us 209.71.192.0 - 209.71.255.255 ca -209.72.0.0 - 209.74.169.127 us -209.74.169.128 - 209.74.169.159 ca -209.74.169.160 - 209.74.185.63 us -209.74.185.64 - 209.74.185.95 ru -209.74.185.96 - 209.74.185.127 us -209.74.185.128 - 209.74.185.255 ru -209.74.186.0 - 209.76.4.47 us -209.76.4.48 - 209.76.4.55 ua -209.76.4.56 - 209.78.238.255 us -209.78.239.0 - 209.78.239.255 ca -209.78.240.0 - 209.81.255.255 us +209.72.0.0 - 209.81.255.255 us 209.82.0.0 - 209.82.127.255 ca -209.82.128.0 - 209.85.10.47 us -209.85.10.48 - 209.85.10.63 um -209.85.10.64 - 209.85.10.95 us -209.85.10.96 - 209.85.10.111 tr -209.85.10.112 - 209.85.12.31 us -209.85.12.32 - 209.85.12.47 tw -209.85.12.48 - 209.85.12.79 us -209.85.12.80 - 209.85.12.95 se -209.85.12.96 - 209.85.13.63 us +209.82.128.0 - 209.85.13.63 us 209.85.13.64 - 209.85.13.127 gb -209.85.13.128 - 209.85.13.143 mx -209.85.13.144 - 209.85.13.223 us -209.85.13.224 - 209.85.13.255 gb -209.85.14.0 - 209.85.19.15 us -209.85.19.16 - 209.85.19.31 ca -209.85.19.32 - 209.85.19.79 us -209.85.19.80 - 209.85.19.95 ca -209.85.19.96 - 209.85.19.111 us -209.85.19.112 - 209.85.19.127 gr -209.85.19.128 - 209.85.30.159 us -209.85.30.160 - 209.85.30.175 it -209.85.30.176 - 209.85.30.191 us -209.85.30.192 - 209.85.30.207 tw -209.85.30.208 - 209.85.30.223 us -209.85.30.224 - 209.85.30.239 ca -209.85.30.240 - 209.85.31.127 gb -209.85.31.128 - 209.85.31.191 us -209.85.31.192 - 209.85.31.255 jo -209.85.32.0 - 209.85.33.31 us -209.85.33.32 - 209.85.33.47 ar -209.85.33.48 - 209.85.33.79 us -209.85.33.80 - 209.85.33.95 es -209.85.33.96 - 209.85.33.111 mx -209.85.33.112 - 209.85.33.127 gb -209.85.33.128 - 209.85.33.207 us -209.85.33.208 - 209.85.33.223 ru -209.85.33.224 - 209.85.33.255 gb +209.85.13.128 - 209.85.33.255 us 209.85.34.0 - 209.85.34.255 br -209.85.35.0 - 209.85.35.31 ca -209.85.35.32 - 209.85.35.63 ru -209.85.35.64 - 209.85.35.79 us -209.85.35.80 - 209.85.35.95 it -209.85.35.96 - 209.85.35.127 us -209.85.35.128 - 209.85.35.143 lt -209.85.35.144 - 209.85.35.159 us -209.85.35.160 - 209.85.35.191 jo -209.85.35.192 - 209.85.40.127 us -209.85.40.128 - 209.85.40.191 gb +209.85.35.0 - 209.85.40.191 us 209.85.40.192 - 209.85.40.207 mx -209.85.40.208 - 209.85.40.255 us -209.85.41.0 - 209.85.41.63 es -209.85.41.64 - 209.85.41.95 us -209.85.41.96 - 209.85.41.111 ca -209.85.41.112 - 209.85.41.127 us -209.85.41.128 - 209.85.41.159 ca -209.85.41.160 - 209.85.44.127 us -209.85.44.128 - 209.85.44.255 es -209.85.45.0 - 209.85.45.255 us -209.85.46.0 - 209.85.46.31 gb -209.85.46.32 - 209.85.49.255 us +209.85.40.208 - 209.85.49.255 us 209.85.50.0 - 209.85.50.255 gb -209.85.51.0 - 209.85.53.63 us -209.85.53.64 - 209.85.53.127 es -209.85.53.128 - 209.85.53.159 us -209.85.53.160 - 209.85.53.175 in -209.85.53.176 - 209.85.53.191 gb -209.85.53.192 - 209.85.58.255 us -209.85.59.0 - 209.85.59.31 ca -209.85.59.32 - 209.85.59.47 gb -209.85.59.48 - 209.85.59.79 us -209.85.59.80 - 209.85.59.95 mx -209.85.59.96 - 209.85.59.191 us -209.85.59.192 - 209.85.59.255 br -209.85.60.0 - 209.85.60.255 us +209.85.51.0 - 209.85.60.255 us 209.85.61.0 - 209.85.61.255 au -209.85.62.0 - 209.85.62.15 ca -209.85.62.16 - 209.85.63.255 us -209.85.64.0 - 209.85.64.15 ca -209.85.64.16 - 209.85.64.95 us -209.85.64.96 - 209.85.64.127 ca -209.85.64.128 - 209.85.64.255 us -209.85.65.0 - 209.85.65.15 ca -209.85.65.16 - 209.85.72.255 us -209.85.73.0 - 209.85.73.127 au -209.85.73.128 - 209.85.76.111 us -209.85.76.112 - 209.85.76.127 gb -209.85.76.128 - 209.85.79.191 us -209.85.79.192 - 209.85.79.207 ca -209.85.79.208 - 209.85.80.79 us -209.85.80.80 - 209.85.80.95 ca -209.85.80.96 - 209.85.88.63 us -209.85.88.64 - 209.85.88.127 jo -209.85.88.128 - 209.85.88.143 ca -209.85.88.144 - 209.85.89.47 us -209.85.89.48 - 209.85.89.63 ca -209.85.89.64 - 209.85.90.15 us -209.85.90.16 - 209.85.90.31 ca -209.85.90.32 - 209.85.111.127 us -209.85.111.128 - 209.85.111.191 au -209.85.111.192 - 209.85.117.207 us -209.85.117.208 - 209.85.117.223 ca -209.85.117.224 - 209.85.122.207 us -209.85.122.208 - 209.85.122.223 ca -209.85.122.224 - 209.86.255.255 us +209.85.62.0 - 209.85.135.255 us +209.85.136.0 - 209.85.136.255 fi +209.85.137.0 - 209.85.171.255 us +209.85.172.0 - 209.85.172.255 fi +209.85.173.0 - 209.86.255.255 us 209.87.0.0 - 209.87.63.255 ca 209.87.64.0 - 209.87.127.255 us 209.87.128.0 - 209.87.143.255 ca 209.87.144.0 - 209.87.223.255 us -209.87.224.0 - 209.87.235.223 ca -209.87.235.224 - 209.87.235.239 us -209.87.235.240 - 209.87.255.255 ca +209.87.224.0 - 209.87.255.255 ca 209.88.0.0 - 209.88.0.255 us 209.88.1.0 - 209.88.1.255 cl 209.88.2.0 - 209.88.2.255 aw 209.88.3.0 - 209.88.3.255 cl 209.88.4.0 - 209.88.6.255 hn -209.88.7.0 - 209.88.7.127 ni -209.88.7.128 - 209.88.7.255 us +209.88.7.0 - 209.88.7.255 us 209.88.8.0 - 209.88.15.255 co 209.88.16.0 - 209.88.21.255 us 209.88.22.0 - 209.88.22.255 cl 209.88.23.0 - 209.88.23.255 ar -209.88.24.0 - 209.88.62.255 us -209.88.63.0 - 209.88.63.31 co -209.88.63.32 - 209.88.63.255 us +209.88.24.0 - 209.88.63.255 us 209.88.64.0 - 209.88.64.63 ag 209.88.64.64 - 209.88.64.95 gp 209.88.64.96 - 209.88.64.255 ag 209.88.65.0 - 209.88.65.255 vg -209.88.66.0 - 209.88.66.31 ag -209.88.66.32 - 209.88.66.63 vg +209.88.66.0 - 209.88.66.63 ag 209.88.66.64 - 209.88.66.127 kn 209.88.66.128 - 209.88.66.255 ag 209.88.67.0 - 209.88.68.255 ai @@ -135522,30 +108719,14 @@ 209.88.80.0 - 209.88.87.255 pr 209.88.88.0 - 209.88.95.255 zw 209.88.96.0 - 209.88.96.255 ve -209.88.97.0 - 209.88.97.127 us -209.88.97.128 - 209.88.97.143 ca -209.88.97.144 - 209.88.97.255 us -209.88.98.0 - 209.88.98.31 co -209.88.98.32 - 209.88.99.255 us +209.88.97.0 - 209.88.99.255 us 209.88.100.0 - 209.88.100.255 cl -209.88.101.0 - 209.88.101.31 ve -209.88.101.32 - 209.88.101.127 us -209.88.101.128 - 209.88.101.255 ve +209.88.101.0 - 209.88.101.255 us 209.88.102.0 - 209.88.102.255 cl 209.88.103.0 - 209.88.103.255 ve -209.88.104.0 - 209.88.104.31 co -209.88.104.32 - 209.88.104.127 us -209.88.104.128 - 209.88.104.191 co -209.88.104.192 - 209.88.104.255 us -209.88.105.0 - 209.88.105.31 co -209.88.105.32 - 209.88.105.127 us -209.88.105.128 - 209.88.105.159 co -209.88.105.160 - 209.88.108.255 us +209.88.104.0 - 209.88.108.255 us 209.88.109.0 - 209.88.109.255 cl -209.88.110.0 - 209.88.110.31 ve -209.88.110.32 - 209.88.110.127 us -209.88.110.128 - 209.88.110.159 co -209.88.110.160 - 209.88.110.255 us +209.88.110.0 - 209.88.110.255 us 209.88.111.0 - 209.88.111.255 hn 209.88.112.0 - 209.88.119.255 za 209.88.120.0 - 209.88.120.255 us @@ -135563,12 +108744,8 @@ 209.88.162.0 - 209.88.162.255 us 209.88.163.0 - 209.88.163.255 ng 209.88.164.0 - 209.88.167.255 us -209.88.168.0 - 209.88.170.31 co -209.88.170.32 - 209.88.170.95 us -209.88.170.96 - 209.88.170.127 co -209.88.170.128 - 209.88.170.191 us -209.88.170.192 - 209.88.170.223 co -209.88.170.224 - 209.88.170.255 us +209.88.168.0 - 209.88.169.255 co +209.88.170.0 - 209.88.170.255 cl 209.88.171.0 - 209.88.171.255 co 209.88.172.0 - 209.88.199.255 il 209.88.200.0 - 209.88.207.255 cl @@ -135588,453 +108765,83 @@ 209.88.252.0 - 209.88.255.255 us 209.89.0.0 - 209.89.255.255 ca 209.90.0.0 - 209.90.127.255 us -209.90.128.0 - 209.90.159.143 ca -209.90.159.144 - 209.90.159.151 us -209.90.159.152 - 209.90.164.67 ca -209.90.164.68 - 209.90.164.68 us -209.90.164.69 - 209.90.166.103 ca -209.90.166.104 - 209.90.166.111 us -209.90.166.112 - 209.90.191.255 ca +209.90.128.0 - 209.90.191.255 ca 209.90.192.0 - 209.90.239.255 us -209.90.240.0 - 209.90.246.15 ca -209.90.246.16 - 209.90.246.23 us -209.90.246.24 - 209.90.255.255 ca +209.90.240.0 - 209.90.255.255 ca 209.91.0.0 - 209.91.63.255 us 209.91.64.0 - 209.91.191.255 ca -209.91.192.0 - 209.91.255.255 pr -209.92.0.0 - 209.93.3.255 us -209.93.4.0 - 209.93.4.63 br -209.93.4.64 - 209.93.10.127 us -209.93.10.128 - 209.93.10.191 ca -209.93.10.192 - 209.93.11.127 us -209.93.11.128 - 209.93.11.255 de -209.93.12.0 - 209.93.12.127 us -209.93.12.128 - 209.93.12.255 hk -209.93.13.0 - 209.93.13.63 co -209.93.13.64 - 209.93.13.127 us -209.93.13.128 - 209.93.13.191 es -209.93.13.192 - 209.93.13.255 us -209.93.14.0 - 209.93.14.127 mx -209.93.14.128 - 209.93.15.255 us -209.93.16.0 - 209.93.16.63 cl -209.93.16.64 - 209.93.16.127 dk -209.93.16.128 - 209.93.17.255 us +209.91.192.0 - 209.91.224.255 pr +209.91.225.0 - 209.91.225.255 us +209.91.226.0 - 209.91.226.255 pr +209.91.227.0 - 209.91.227.255 us +209.91.228.0 - 209.91.229.255 pr +209.91.230.0 - 209.91.230.255 us +209.91.231.0 - 209.91.238.255 pr +209.91.239.0 - 209.91.239.255 us +209.91.240.0 - 209.91.244.255 pr +209.91.245.0 - 209.91.245.255 us +209.91.246.0 - 209.91.247.255 pr +209.91.248.0 - 209.91.248.255 us +209.91.249.0 - 209.91.249.255 pr +209.91.250.0 - 209.91.250.255 us +209.91.251.0 - 209.91.252.255 pr +209.91.253.0 - 209.91.253.255 us +209.91.254.0 - 209.91.255.255 pr +209.92.0.0 - 209.93.17.255 us 209.93.18.0 - 209.93.18.255 ca -209.93.19.0 - 209.93.19.127 us -209.93.19.128 - 209.93.19.255 br -209.93.20.0 - 209.93.21.127 us -209.93.21.128 - 209.93.21.255 ve -209.93.22.0 - 209.93.23.127 us -209.93.23.128 - 209.93.23.255 id -209.93.24.0 - 209.93.24.191 us -209.93.24.192 - 209.93.24.255 co -209.93.25.0 - 209.93.26.255 us -209.93.27.0 - 209.93.27.127 mx -209.93.27.128 - 209.93.28.127 us -209.93.28.128 - 209.93.28.135 th -209.93.28.136 - 209.93.28.191 us -209.93.28.192 - 209.93.28.255 co -209.93.29.0 - 209.93.31.127 us -209.93.31.128 - 209.93.31.191 co -209.93.31.192 - 209.93.32.47 us -209.93.32.48 - 209.93.32.63 se -209.93.32.64 - 209.93.32.95 us -209.93.32.96 - 209.93.32.111 it -209.93.32.112 - 209.93.32.255 us -209.93.33.0 - 209.93.33.143 it -209.93.33.144 - 209.93.33.159 us -209.93.33.160 - 209.93.33.175 it -209.93.33.176 - 209.93.33.191 us -209.93.33.192 - 209.93.33.255 it -209.93.34.0 - 209.93.34.225 no -209.93.34.226 - 209.93.35.255 us -209.93.36.0 - 209.93.36.31 se -209.93.36.32 - 209.93.37.255 us -209.93.38.0 - 209.93.38.31 de -209.93.38.32 - 209.93.38.255 us -209.93.39.0 - 209.93.39.47 il -209.93.39.48 - 209.93.41.255 us -209.93.42.0 - 209.93.42.159 fi -209.93.42.160 - 209.93.42.255 us -209.93.43.0 - 209.93.43.63 de -209.93.43.64 - 209.93.43.71 id -209.93.43.72 - 209.93.43.79 tw -209.93.43.80 - 209.93.43.87 my -209.93.43.88 - 209.93.43.95 us -209.93.43.96 - 209.93.43.103 hk -209.93.43.104 - 209.93.43.111 jp -209.93.43.112 - 209.93.43.255 us -209.93.44.0 - 209.93.44.79 gb -209.93.44.80 - 209.93.44.127 us -209.93.44.128 - 209.93.44.191 gb -209.93.44.192 - 209.93.44.255 us -209.93.45.0 - 209.93.45.15 de -209.93.45.16 - 209.93.45.63 us -209.93.45.64 - 209.93.45.127 de -209.93.45.128 - 209.93.45.255 us -209.93.46.0 - 209.93.46.31 no -209.93.46.32 - 209.93.46.63 us -209.93.46.64 - 209.93.46.143 no -209.93.46.144 - 209.93.46.255 us -209.93.47.0 - 209.93.47.127 tw -209.93.47.128 - 209.93.48.127 us -209.93.48.128 - 209.93.48.159 gb -209.93.48.160 - 209.93.48.191 us -209.93.48.192 - 209.93.49.127 gb -209.93.49.128 - 209.93.49.223 us -209.93.49.224 - 209.93.49.255 gb -209.93.50.0 - 209.93.50.143 it -209.93.50.144 - 209.93.50.191 us -209.93.50.192 - 209.93.50.255 it -209.93.51.0 - 209.93.51.127 gb -209.93.51.128 - 209.93.51.255 us -209.93.52.0 - 209.93.52.159 fr -209.93.52.160 - 209.93.52.255 us -209.93.53.0 - 209.93.53.31 it -209.93.53.32 - 209.93.53.47 sg -209.93.53.48 - 209.93.53.63 jp -209.93.53.64 - 209.93.53.71 kr -209.93.53.72 - 209.93.53.127 us -209.93.53.128 - 209.93.53.255 be -209.93.54.0 - 209.93.54.63 de -209.93.54.64 - 209.93.54.127 us -209.93.54.128 - 209.93.54.255 de -209.93.55.0 - 209.93.55.31 lu -209.93.55.32 - 209.93.55.159 be -209.93.55.160 - 209.93.55.191 us -209.93.55.192 - 209.93.55.255 es -209.93.56.0 - 209.93.56.31 se -209.93.56.32 - 209.93.56.63 us -209.93.56.64 - 209.93.56.127 za -209.93.56.128 - 209.93.56.255 us -209.93.57.0 - 209.93.57.255 gb -209.93.58.0 - 209.93.58.31 pt -209.93.58.32 - 209.93.58.255 us -209.93.59.0 - 209.93.59.47 ch -209.93.59.48 - 209.93.59.255 us -209.93.60.0 - 209.93.60.127 es -209.93.60.128 - 209.93.61.63 us -209.93.61.64 - 209.93.61.95 nl -209.93.61.96 - 209.93.61.127 us -209.93.61.128 - 209.93.61.255 nl -209.93.62.0 - 209.93.62.127 ch -209.93.62.128 - 209.93.62.223 us -209.93.62.224 - 209.93.62.255 gr -209.93.63.0 - 209.93.63.127 fr -209.93.63.128 - 209.93.63.191 us -209.93.63.192 - 209.93.63.255 fr -209.93.64.0 - 209.93.64.191 us -209.93.64.192 - 209.93.64.255 be -209.93.65.0 - 209.93.65.63 de -209.93.65.64 - 209.93.65.95 tw -209.93.65.96 - 209.93.65.127 us -209.93.65.128 - 209.93.65.255 th -209.93.66.0 - 209.93.66.127 us -209.93.66.128 - 209.93.66.143 de -209.93.66.144 - 209.93.66.255 us -209.93.67.0 - 209.93.67.31 at -209.93.67.32 - 209.93.67.111 us -209.93.67.112 - 209.93.67.127 at -209.93.67.128 - 209.93.67.255 us -209.93.68.0 - 209.93.68.15 ch -209.93.68.16 - 209.93.69.255 us -209.93.70.0 - 209.93.70.255 gb +209.93.19.0 - 209.93.70.255 us 209.93.71.0 - 209.93.71.255 de -209.93.72.0 - 209.93.72.127 il -209.93.72.128 - 209.93.74.255 us +209.93.72.0 - 209.93.74.255 us 209.93.75.0 - 209.93.75.255 nl -209.93.76.0 - 209.93.76.111 us -209.93.76.112 - 209.93.76.255 de -209.93.77.0 - 209.93.77.255 us -209.93.78.0 - 209.93.78.151 gr -209.93.78.152 - 209.93.79.255 us -209.93.80.0 - 209.93.80.191 at -209.93.80.192 - 209.93.80.255 us -209.93.81.0 - 209.93.81.127 ch -209.93.81.128 - 209.93.81.255 us +209.93.76.0 - 209.93.81.255 us 209.93.82.0 - 209.93.84.255 gb -209.93.85.0 - 209.93.85.15 dk -209.93.85.16 - 209.93.88.255 us -209.93.89.0 - 209.93.90.255 ie -209.93.91.0 - 209.93.91.127 se -209.93.91.128 - 209.93.91.191 de -209.93.91.192 - 209.93.91.255 us +209.93.85.0 - 209.93.88.255 us +209.93.89.0 - 209.93.89.255 ie +209.93.90.0 - 209.93.91.255 us 209.93.92.0 - 209.93.92.255 fr -209.93.93.0 - 209.93.93.31 us -209.93.93.32 - 209.93.93.47 be -209.93.93.48 - 209.93.93.63 us -209.93.93.64 - 209.93.93.127 be -209.93.93.128 - 209.93.93.255 us +209.93.93.0 - 209.93.93.255 us 209.93.94.0 - 209.93.94.255 de 209.93.95.0 - 209.93.95.255 gb -209.93.96.0 - 209.93.97.87 us -209.93.97.88 - 209.93.97.95 jp -209.93.97.96 - 209.93.97.127 us -209.93.97.128 - 209.93.97.191 id -209.93.97.192 - 209.93.97.255 hk -209.93.98.0 - 209.93.99.255 us -209.93.100.0 - 209.93.100.127 jp -209.93.100.128 - 209.93.100.191 my -209.93.100.192 - 209.93.100.255 us -209.93.101.0 - 209.93.101.63 jp -209.93.101.64 - 209.93.101.111 sg -209.93.101.112 - 209.93.101.127 us -209.93.101.128 - 209.93.101.191 jp -209.93.101.192 - 209.93.101.223 au -209.93.101.224 - 209.93.101.255 us -209.93.102.0 - 209.93.102.31 sg -209.93.102.32 - 209.93.102.127 us -209.93.102.128 - 209.93.102.255 id -209.93.103.0 - 209.93.105.255 us -209.93.106.0 - 209.93.106.129 th -209.93.106.130 - 209.93.106.255 us -209.93.107.0 - 209.93.107.127 jp -209.93.107.128 - 209.93.109.255 us -209.93.110.0 - 209.93.110.127 cn -209.93.110.128 - 209.93.110.255 us -209.93.111.0 - 209.93.111.127 hk -209.93.111.128 - 209.93.111.255 us -209.93.112.0 - 209.93.112.63 au -209.93.112.64 - 209.93.112.127 jp -209.93.112.128 - 209.93.112.255 cn +209.93.96.0 - 209.93.112.255 us 209.93.113.0 - 209.93.113.255 jp -209.93.114.0 - 209.93.114.63 ch -209.93.114.64 - 209.93.114.95 hk -209.93.114.96 - 209.93.114.127 us -209.93.114.128 - 209.93.114.191 cn -209.93.114.192 - 209.93.114.255 hk -209.93.115.0 - 209.93.115.31 th -209.93.115.32 - 209.93.115.111 us -209.93.115.112 - 209.93.115.127 th -209.93.115.128 - 209.93.116.255 us -209.93.117.0 - 209.93.117.127 ph -209.93.117.128 - 209.93.117.191 us -209.93.117.192 - 209.93.117.255 sg -209.93.118.0 - 209.93.118.191 us -209.93.118.192 - 209.93.118.255 id -209.93.119.0 - 209.93.119.255 us -209.93.120.0 - 209.93.120.15 my -209.93.120.16 - 209.93.120.31 us -209.93.120.32 - 209.93.120.63 au -209.93.120.64 - 209.93.120.95 jp -209.93.120.96 - 209.93.120.255 us -209.93.121.0 - 209.93.121.127 ph -209.93.121.128 - 209.93.121.255 us +209.93.114.0 - 209.93.121.255 us 209.93.122.0 - 209.93.122.255 sg -209.93.123.0 - 209.93.125.127 us -209.93.125.128 - 209.93.125.255 hk +209.93.123.0 - 209.93.125.255 us 209.93.126.0 - 209.93.126.255 ph -209.93.127.0 - 209.93.130.255 us -209.93.131.0 - 209.93.131.127 br -209.93.131.128 - 209.93.133.159 us -209.93.133.160 - 209.93.133.191 ca -209.93.133.192 - 209.93.133.255 us -209.93.134.0 - 209.93.134.127 gb -209.93.134.128 - 209.93.136.127 us -209.93.136.128 - 209.93.136.255 br -209.93.137.0 - 209.93.140.255 us -209.93.141.0 - 209.93.141.127 ca -209.93.141.128 - 209.93.144.127 us -209.93.144.128 - 209.93.144.143 ve -209.93.144.144 - 209.93.144.159 ca -209.93.144.160 - 209.93.145.127 us -209.93.145.128 - 209.93.145.255 mx -209.93.146.0 - 209.93.151.127 us -209.93.151.128 - 209.93.151.255 cl -209.93.152.0 - 209.93.152.63 ve -209.93.152.64 - 209.93.155.255 us -209.93.156.0 - 209.93.156.127 mx -209.93.156.128 - 209.93.156.223 us -209.93.156.224 - 209.93.156.255 br -209.93.157.0 - 209.93.157.127 us -209.93.157.128 - 209.93.157.191 cl -209.93.157.192 - 209.93.157.255 us -209.93.158.0 - 209.93.158.255 cl -209.93.159.0 - 209.93.159.31 kr -209.93.159.32 - 209.93.159.63 hk -209.93.159.64 - 209.93.159.95 tw -209.93.159.96 - 209.93.159.127 id -209.93.159.128 - 209.93.159.159 sg -209.93.159.160 - 209.93.159.191 us -209.93.159.192 - 209.93.160.255 id +209.93.127.0 - 209.93.159.255 us +209.93.160.0 - 209.93.160.255 id 209.93.161.0 - 209.93.162.255 us 209.93.163.0 - 209.93.163.255 sg -209.93.164.0 - 209.93.166.63 us -209.93.166.64 - 209.93.166.127 my -209.93.166.128 - 209.93.166.255 jp -209.93.167.0 - 209.93.167.255 us -209.93.168.0 - 209.93.168.31 kr -209.93.168.32 - 209.93.168.63 us -209.93.168.64 - 209.93.168.127 kr -209.93.168.128 - 209.93.168.255 us +209.93.164.0 - 209.93.168.255 us 209.93.169.0 - 209.93.169.255 hk -209.93.170.0 - 209.93.170.255 us -209.93.171.0 - 209.93.171.127 kr -209.93.171.128 - 209.93.171.255 us -209.93.172.0 - 209.93.172.63 jp -209.93.172.64 - 209.93.172.255 us -209.93.173.0 - 209.93.173.63 tw -209.93.173.64 - 209.93.173.127 sg -209.93.173.128 - 209.93.173.159 th -209.93.173.160 - 209.93.173.255 us -209.93.174.0 - 209.93.174.63 au -209.93.174.64 - 209.93.174.95 ph -209.93.174.96 - 209.93.174.127 us -209.93.174.128 - 209.93.174.191 th -209.93.174.192 - 209.93.174.255 us -209.93.175.0 - 209.93.175.63 jp -209.93.175.64 - 209.93.175.255 us -209.93.176.0 - 209.93.176.63 kr -209.93.176.64 - 209.93.177.255 us -209.93.178.0 - 209.93.178.160 cn -209.93.178.161 - 209.93.178.255 us -209.93.179.0 - 209.93.179.127 th -209.93.179.128 - 209.93.179.255 us -209.93.180.0 - 209.93.180.127 id -209.93.180.128 - 209.93.180.255 hk -209.93.181.0 - 209.93.181.127 kr -209.93.181.128 - 209.93.181.255 nz -209.93.182.0 - 209.93.182.255 id -209.93.183.0 - 209.93.183.127 sg -209.93.183.128 - 209.93.183.191 kr -209.93.183.192 - 209.93.183.255 tw -209.93.184.0 - 209.93.184.127 jp -209.93.184.128 - 209.93.184.191 us -209.93.184.192 - 209.93.184.255 cn -209.93.185.0 - 209.93.185.15 ch -209.93.185.16 - 209.93.185.63 us -209.93.185.64 - 209.93.185.127 sg -209.93.185.128 - 209.93.186.255 hk -209.93.187.0 - 209.93.187.127 id -209.93.187.128 - 209.93.187.191 sg -209.93.187.192 - 209.93.187.255 kr -209.93.188.0 - 209.93.188.127 nz -209.93.188.128 - 209.93.188.255 tw +209.93.170.0 - 209.93.185.255 us +209.93.186.0 - 209.93.186.255 hk +209.93.187.0 - 209.93.188.255 us 209.93.189.0 - 209.93.191.255 cn -209.93.192.0 - 209.93.192.63 us -209.93.192.64 - 209.93.192.79 br -209.93.192.80 - 209.93.193.63 us -209.93.193.64 - 209.93.193.127 br -209.93.193.128 - 209.93.193.255 pe -209.93.194.0 - 209.93.194.63 br -209.93.194.64 - 209.93.194.127 cn -209.93.194.128 - 209.93.194.255 br -209.93.195.0 - 209.93.196.127 us -209.93.196.128 - 209.93.197.255 br -209.93.198.0 - 209.93.200.255 us -209.93.201.0 - 209.93.201.31 br -209.93.201.32 - 209.93.204.191 us -209.93.204.192 - 209.93.204.223 br -209.93.204.224 - 209.93.206.159 us -209.93.206.160 - 209.93.206.191 pe -209.93.206.192 - 209.93.206.255 co -209.93.207.0 - 209.93.207.191 us -209.93.207.192 - 209.93.207.255 ve -209.93.208.0 - 209.93.208.255 us -209.93.209.0 - 209.93.209.191 br -209.93.209.192 - 209.93.209.255 ar -209.93.210.0 - 209.93.212.31 us -209.93.212.32 - 209.93.212.63 ch -209.93.212.64 - 209.93.213.127 us -209.93.213.128 - 209.93.213.255 co -209.93.214.0 - 209.93.214.127 us -209.93.214.128 - 209.93.214.255 co -209.93.215.0 - 209.93.215.127 us -209.93.215.128 - 209.93.215.159 pe -209.93.215.160 - 209.93.215.191 us -209.93.215.192 - 209.93.215.255 br -209.93.216.0 - 209.93.216.127 us -209.93.216.128 - 209.93.216.255 mx -209.93.217.0 - 209.93.220.95 us -209.93.220.96 - 209.93.220.255 br -209.93.221.0 - 209.93.222.63 us -209.93.222.64 - 209.93.222.127 co -209.93.222.128 - 209.93.222.191 us -209.93.222.192 - 209.93.222.255 co -209.93.223.0 - 209.93.223.63 mx -209.93.223.64 - 209.93.223.127 ch -209.93.223.128 - 209.93.225.255 us -209.93.226.0 - 209.93.226.127 th -209.93.226.128 - 209.93.226.255 ph +209.93.192.0 - 209.93.196.255 us +209.93.197.0 - 209.93.197.255 br +209.93.198.0 - 209.93.226.255 us 209.93.227.0 - 209.93.227.255 jp 209.93.228.0 - 209.93.231.255 us 209.93.232.0 - 209.93.233.255 gb 209.93.234.0 - 209.93.234.255 ph 209.93.235.0 - 209.93.235.127 gb -209.93.235.128 - 209.93.235.255 sg -209.93.236.0 - 209.93.236.63 th -209.93.236.64 - 209.93.236.103 us -209.93.236.104 - 209.93.236.111 cn -209.93.236.112 - 209.93.236.255 us +209.93.235.128 - 209.93.236.255 us 209.93.237.0 - 209.93.237.127 jp -209.93.237.128 - 209.93.237.223 us -209.93.237.224 - 209.93.237.255 de -209.93.238.0 - 209.93.238.127 us -209.93.238.128 - 209.93.238.255 cn +209.93.237.128 - 209.93.237.255 us +209.93.238.0 - 209.93.238.255 ap 209.93.239.0 - 209.93.239.255 my -209.93.240.0 - 209.93.240.63 hk -209.93.240.64 - 209.93.240.127 us -209.93.240.128 - 209.93.240.255 cn -209.93.241.0 - 209.93.241.255 us -209.93.242.0 - 209.93.242.63 th -209.93.242.64 - 209.93.242.255 us -209.93.243.0 - 209.93.243.255 tw -209.93.244.0 - 209.93.244.255 us -209.93.245.0 - 209.93.245.31 kr -209.93.245.32 - 209.93.245.63 us -209.93.245.64 - 209.93.245.127 kr -209.93.245.128 - 209.93.246.255 us -209.93.247.0 - 209.93.247.255 jp -209.93.248.0 - 209.93.249.255 us -209.93.250.0 - 209.93.250.255 th -209.93.251.0 - 209.93.252.255 us -209.93.253.0 - 209.93.253.255 jp -209.93.254.0 - 209.93.254.63 kr -209.93.254.64 - 209.93.254.127 us -209.93.254.128 - 209.93.254.255 th -209.93.255.0 - 209.93.255.255 ph -209.94.0.0 - 209.94.191.255 us +209.93.240.0 - 209.94.191.255 us 209.94.192.0 - 209.94.223.255 tt -209.94.224.0 - 209.95.103.159 us -209.95.103.160 - 209.95.103.191 in -209.95.103.192 - 209.95.124.31 us -209.95.124.32 - 209.95.124.63 gb -209.95.124.64 - 209.95.127.255 us -209.95.128.0 - 209.95.138.255 se -209.95.139.0 - 209.95.139.255 us -209.95.140.0 - 209.95.159.255 se -209.95.160.0 - 209.97.191.255 us -209.97.192.0 - 209.97.192.255 ca -209.97.193.0 - 209.97.193.63 a1 -209.97.193.64 - 209.97.196.255 ca -209.97.197.0 - 209.97.197.127 a1 -209.97.197.128 - 209.97.197.129 ca -209.97.197.130 - 209.97.197.177 a1 -209.97.197.178 - 209.97.197.179 ca -209.97.197.180 - 209.97.197.190 a1 -209.97.197.191 - 209.97.197.191 ca -209.97.197.192 - 209.97.197.255 a1 -209.97.198.0 - 209.97.204.127 ca -209.97.204.128 - 209.97.204.255 a1 -209.97.205.0 - 209.97.206.127 ca -209.97.206.128 - 209.97.206.255 a1 -209.97.207.0 - 209.97.207.232 ca -209.97.207.233 - 209.97.207.233 a1 -209.97.207.234 - 209.97.210.63 ca -209.97.210.64 - 209.97.210.127 a1 -209.97.210.128 - 209.97.213.33 ca -209.97.213.34 - 209.97.213.35 a1 -209.97.213.36 - 209.97.223.235 ca -209.97.223.236 - 209.97.223.237 a1 -209.97.223.238 - 209.97.223.255 ca -209.97.224.0 - 209.98.118.255 us -209.98.119.0 - 209.98.119.31 be -209.98.119.32 - 209.98.119.63 au -209.98.119.64 - 209.98.119.95 fr -209.98.119.96 - 209.98.119.127 kw -209.98.119.128 - 209.98.119.191 us -209.98.119.192 - 209.98.119.223 ca -209.98.119.224 - 209.99.223.255 us +209.94.224.0 - 209.95.60.87 us +209.95.60.88 - 209.95.60.91 hk +209.95.60.92 - 209.95.63.147 us +209.95.63.148 - 209.95.63.148 sg +209.95.63.149 - 209.97.191.255 us +209.97.192.0 - 209.97.223.255 ca +209.97.224.0 - 209.99.20.255 us +209.99.21.0 - 209.99.21.255 ca +209.99.22.0 - 209.99.223.255 us 209.99.224.0 - 209.99.239.255 ar 209.99.240.0 - 209.102.255.255 us 209.103.0.0 - 209.103.63.255 ca @@ -136046,33 +108853,19 @@ 209.105.192.0 - 209.105.223.255 ca 209.105.224.0 - 209.107.95.255 us 209.107.96.0 - 209.107.127.255 ca -209.107.128.0 - 209.107.197.255 us +209.107.192.0 - 209.107.194.255 us +209.107.195.0 - 209.107.195.255 au +209.107.196.0 - 209.107.197.255 us 209.107.198.0 - 209.107.198.255 ph -209.107.199.0 - 209.107.199.127 us -209.107.199.128 - 209.107.199.191 az -209.107.199.192 - 209.107.203.255 us -209.107.204.0 - 209.107.204.255 a1 -209.107.205.0 - 209.107.216.255 us -209.107.217.0 - 209.107.217.255 a1 -209.107.218.0 - 209.107.218.255 us -209.107.219.0 - 209.107.219.255 ca -209.107.220.0 - 209.110.92.255 us +209.107.199.0 - 209.110.92.255 us 209.110.93.0 - 209.110.93.255 a2 209.110.94.0 - 209.111.255.255 us 209.112.0.0 - 209.112.63.255 ca -209.112.64.0 - 209.112.239.255 us -209.112.240.0 - 209.112.255.255 a1 -209.113.0.0 - 209.115.127.255 us +209.112.64.0 - 209.115.127.255 us 209.115.128.0 - 209.115.255.255 ca 209.116.0.0 - 209.120.255.255 us 209.121.0.0 - 209.121.255.255 ca -209.122.0.0 - 209.124.73.239 us -209.124.73.240 - 209.124.73.247 je -209.124.73.248 - 209.124.81.15 us -209.124.81.16 - 209.124.81.31 gb -209.124.81.32 - 209.124.89.119 us -209.124.89.120 - 209.124.89.127 pa -209.124.89.128 - 209.124.96.255 us +209.122.0.0 - 209.124.96.255 us 209.124.97.0 - 209.124.97.255 gt 209.124.98.0 - 209.124.99.255 sv 209.124.100.0 - 209.124.101.255 ni @@ -136082,67 +108875,45 @@ 209.124.108.0 - 209.124.111.255 sv 209.124.112.0 - 209.124.125.255 us 209.124.126.0 - 209.124.127.255 sv -209.124.128.0 - 209.127.255.255 us +209.124.128.0 - 209.126.100.21 us +209.126.100.22 - 209.126.100.23 bz +209.126.100.24 - 209.126.100.105 us +209.126.100.106 - 209.126.100.111 bz +209.126.100.112 - 209.126.109.109 us +209.126.109.110 - 209.126.109.111 bz +209.126.109.112 - 209.126.109.112 us +209.126.109.113 - 209.126.109.113 bz +209.126.109.114 - 209.126.113.27 us +209.126.113.28 - 209.126.113.28 ua +209.126.113.29 - 209.127.255.255 us 209.128.0.0 - 209.128.63.255 ca -209.128.64.0 - 209.132.99.7 us -209.132.99.8 - 209.132.99.15 au -209.132.99.16 - 209.132.236.255 us -209.132.237.0 - 209.132.237.15 au -209.132.237.16 - 209.133.64.175 us -209.133.64.176 - 209.133.64.183 kr -209.133.64.184 - 209.135.63.255 us +209.128.64.0 - 209.130.141.63 us +209.130.141.64 - 209.130.141.67 fr +209.130.141.68 - 209.130.141.71 de +209.130.141.72 - 209.130.141.87 gb +209.130.141.88 - 209.130.141.103 dk +209.130.141.104 - 209.130.141.129 us +209.130.141.130 - 209.130.141.130 eu +209.130.141.131 - 209.133.223.255 us +209.133.224.0 - 209.133.255.255 ca +209.134.0.0 - 209.134.8.255 us +209.134.9.0 - 209.134.18.255 tr +209.134.19.0 - 209.135.63.255 us 209.135.64.0 - 209.135.127.255 ca 209.135.128.0 - 209.136.30.255 us 209.136.31.0 - 209.136.31.255 mx -209.136.32.0 - 209.137.140.223 us -209.137.140.224 - 209.137.140.239 kr -209.137.140.240 - 209.137.142.127 us -209.137.142.128 - 209.137.142.143 jp -209.137.142.144 - 209.137.144.239 us -209.137.144.240 - 209.137.144.247 jp -209.137.144.248 - 209.137.146.191 us -209.137.146.192 - 209.137.146.255 jp -209.137.147.0 - 209.137.147.191 us -209.137.147.192 - 209.137.147.255 jp -209.137.148.0 - 209.137.151.79 us -209.137.151.80 - 209.137.151.87 jp -209.137.151.88 - 209.137.153.255 us -209.137.154.0 - 209.137.154.15 jp -209.137.154.16 - 209.137.156.191 us -209.137.156.192 - 209.137.156.255 jp -209.137.157.0 - 209.139.191.255 us +209.136.32.0 - 209.139.191.255 us 209.139.192.0 - 209.139.255.255 ca -209.140.0.0 - 209.141.31.255 us -209.141.32.0 - 209.141.32.255 ca -209.141.33.0 - 209.141.36.255 us -209.141.37.0 - 209.141.63.255 ca -209.141.64.0 - 209.141.127.255 us +209.140.0.0 - 209.141.38.238 us +209.141.38.239 - 209.141.38.239 pt +209.141.38.240 - 209.141.127.255 us 209.141.128.0 - 209.141.207.255 ca -209.141.208.0 - 209.142.191.199 us -209.142.191.200 - 209.142.191.207 mo -209.142.191.208 - 209.143.197.127 us -209.143.197.128 - 209.143.197.207 in -209.143.197.208 - 209.143.224.15 us -209.143.224.16 - 209.143.224.31 au -209.143.224.32 - 209.143.224.255 us -209.143.225.0 - 209.143.225.127 au -209.143.225.128 - 209.143.229.47 us -209.143.229.48 - 209.143.229.63 it -209.143.229.64 - 209.144.149.159 us -209.144.149.160 - 209.144.149.191 ca -209.144.149.192 - 209.144.160.231 us -209.144.160.232 - 209.144.160.239 au -209.144.160.240 - 209.145.56.175 us -209.145.56.176 - 209.145.56.191 gb -209.145.56.192 - 209.145.57.47 us -209.145.57.48 - 209.145.57.63 ca -209.145.57.64 - 209.145.57.95 us -209.145.57.96 - 209.145.57.111 es -209.145.57.112 - 209.145.60.95 us -209.145.60.96 - 209.145.60.111 nl -209.145.60.112 - 209.145.60.159 us -209.145.60.160 - 209.145.60.175 gb -209.145.60.176 - 209.145.95.255 us +209.141.208.0 - 209.141.223.255 us +209.141.224.0 - 209.141.255.255 de +209.142.0.0 - 209.142.63.255 ca +209.142.64.0 - 209.143.133.255 us +209.143.134.0 - 209.143.135.255 gb +209.143.136.0 - 209.145.95.255 us 209.145.96.0 - 209.145.127.255 ca 209.145.128.0 - 209.145.191.255 us 209.145.192.0 - 209.145.255.255 ca @@ -136150,1281 +108921,400 @@ 209.146.128.0 - 209.146.255.255 ca 209.147.0.0 - 209.148.5.255 us 209.148.6.0 - 209.148.6.255 gb -209.148.7.0 - 209.148.63.255 us -209.148.64.0 - 209.148.95.255 ca -209.148.96.0 - 209.148.127.255 us -209.148.128.0 - 209.148.220.151 ca -209.148.220.152 - 209.148.220.159 us -209.148.220.160 - 209.148.255.255 ca -209.149.0.0 - 209.150.255.255 us +209.148.7.0 - 209.148.127.255 us +209.148.128.0 - 209.148.255.255 ca +209.149.0.0 - 209.150.143.255 us +209.150.144.0 - 209.150.159.255 pk +209.150.160.0 - 209.150.255.255 us 209.151.0.0 - 209.151.31.255 ca -209.151.32.0 - 209.151.66.79 us -209.151.66.80 - 209.151.66.111 tr -209.151.66.112 - 209.151.66.119 us -209.151.66.120 - 209.151.66.127 my -209.151.66.128 - 209.151.67.23 us -209.151.67.24 - 209.151.67.39 ae -209.151.67.40 - 209.151.84.79 us -209.151.84.80 - 209.151.84.95 ca -209.151.84.96 - 209.151.91.255 us +209.151.32.0 - 209.151.91.255 us 209.151.92.0 - 209.151.92.255 my -209.151.93.0 - 209.151.94.255 ca -209.151.95.0 - 209.151.127.255 us +209.151.93.0 - 209.151.93.255 ca +209.151.94.0 - 209.151.127.255 us 209.151.128.0 - 209.151.143.255 ca -209.151.144.0 - 209.151.234.255 us -209.151.235.0 - 209.151.235.7 is -209.151.235.8 - 209.153.191.255 us +209.151.144.0 - 209.153.191.255 us 209.153.192.0 - 209.153.255.255 ca -209.154.0.0 - 209.159.159.255 us +209.154.0.0 - 209.155.183.11 us +209.155.183.12 - 209.155.183.15 pr +209.155.183.16 - 209.159.159.255 us 209.159.160.0 - 209.159.161.255 a2 -209.159.162.0 - 209.159.162.7 us -209.159.162.8 - 209.159.162.15 ng -209.159.162.16 - 209.159.162.47 us -209.159.162.48 - 209.159.162.63 ng -209.159.162.64 - 209.159.162.95 ec -209.159.162.96 - 209.159.162.175 ng -209.159.162.176 - 209.159.162.255 us +209.159.162.0 - 209.159.162.191 ng +209.159.162.192 - 209.159.162.223 us +209.159.162.224 - 209.159.162.255 ng 209.159.163.0 - 209.159.163.255 a2 209.159.164.0 - 209.159.164.255 ng 209.159.165.0 - 209.159.165.255 a2 209.159.166.0 - 209.159.166.255 ng -209.159.167.0 - 209.159.169.255 a2 -209.159.170.0 - 209.159.171.255 ng +209.159.167.0 - 209.159.171.255 us 209.159.172.0 - 209.159.172.255 a2 209.159.173.0 - 209.159.173.255 ng 209.159.174.0 - 209.159.174.255 a2 209.159.175.0 - 209.159.175.255 ng 209.159.176.0 - 209.159.191.255 ca -209.159.192.0 - 209.161.191.255 us +209.159.192.0 - 209.161.115.255 us +209.161.116.0 - 209.161.116.255 hn +209.161.117.0 - 209.161.124.255 us +209.161.125.0 - 209.161.125.255 ni +209.161.126.0 - 209.161.191.255 us 209.161.192.0 - 209.161.255.255 ca 209.162.0.0 - 209.162.159.255 us 209.162.160.0 - 209.162.175.255 ca -209.162.176.0 - 209.162.176.105 us -209.162.176.106 - 209.162.176.121 ca -209.162.176.122 - 209.162.176.181 us -209.162.176.182 - 209.162.176.191 nz -209.162.176.192 - 209.162.178.25 us -209.162.178.26 - 209.162.178.41 ne -209.162.178.42 - 209.162.178.75 us -209.162.178.76 - 209.162.178.91 ca -209.162.178.92 - 209.162.178.104 us -209.162.178.105 - 209.162.178.124 ca -209.162.178.125 - 209.162.178.176 us -209.162.178.177 - 209.162.178.186 ca -209.162.178.187 - 209.162.179.11 us -209.162.179.12 - 209.162.179.29 gb -209.162.179.30 - 209.162.182.29 us -209.162.182.30 - 209.162.182.45 gb -209.162.182.46 - 209.162.188.212 us -209.162.188.213 - 209.162.188.226 nz -209.162.188.227 - 209.162.223.255 us +209.162.176.0 - 209.162.223.255 us 209.162.224.0 - 209.162.238.255 ca 209.162.239.0 - 209.162.239.255 us 209.162.240.0 - 209.162.255.255 ca -209.163.0.0 - 209.164.183.255 us +209.163.0.0 - 209.163.207.255 us +209.163.208.0 - 209.163.211.255 in +209.163.212.0 - 209.164.183.255 us 209.164.184.0 - 209.164.191.255 gu 209.164.192.0 - 209.166.255.255 us -209.167.0.0 - 209.167.3.255 ca -209.167.4.0 - 209.167.4.255 us -209.167.5.0 - 209.167.6.255 ca -209.167.7.0 - 209.167.9.255 us -209.167.10.0 - 209.167.10.95 ca -209.167.10.96 - 209.167.10.159 us -209.167.10.160 - 209.167.19.255 ca +209.167.0.0 - 209.167.1.255 ca +209.167.2.0 - 209.167.2.255 us +209.167.3.0 - 209.167.7.255 ca +209.167.8.0 - 209.167.10.191 us +209.167.10.192 - 209.167.10.223 ca +209.167.10.224 - 209.167.10.255 us +209.167.11.0 - 209.167.11.255 ca +209.167.12.0 - 209.167.12.255 us +209.167.13.0 - 209.167.17.255 ca +209.167.18.0 - 209.167.18.255 us +209.167.19.0 - 209.167.19.255 ca 209.167.20.0 - 209.167.20.255 us -209.167.21.0 - 209.167.21.223 ca -209.167.21.224 - 209.167.21.239 us -209.167.21.240 - 209.167.23.255 ca +209.167.21.0 - 209.167.23.255 ca 209.167.24.0 - 209.167.25.255 us 209.167.26.0 - 209.167.26.255 ca -209.167.27.0 - 209.167.28.255 us -209.167.29.0 - 209.167.29.255 ca +209.167.27.0 - 209.167.27.255 us +209.167.28.0 - 209.167.29.255 ca 209.167.30.0 - 209.167.30.255 us -209.167.31.0 - 209.167.34.111 ca -209.167.34.112 - 209.167.34.127 us -209.167.34.128 - 209.167.34.175 ca -209.167.34.176 - 209.167.34.191 us -209.167.34.192 - 209.167.36.255 ca +209.167.31.0 - 209.167.32.255 ca +209.167.33.0 - 209.167.33.255 us +209.167.34.0 - 209.167.34.255 ca +209.167.35.0 - 209.167.35.255 us +209.167.36.0 - 209.167.36.255 ca 209.167.37.0 - 209.167.37.255 us -209.167.38.0 - 209.167.38.255 ca -209.167.39.0 - 209.167.39.15 us -209.167.39.16 - 209.167.39.79 ca -209.167.39.80 - 209.167.39.95 us -209.167.39.96 - 209.167.39.223 ca -209.167.39.224 - 209.167.39.239 us -209.167.39.240 - 209.167.41.255 ca -209.167.42.0 - 209.167.42.31 us -209.167.42.32 - 209.167.42.63 ca -209.167.42.64 - 209.167.42.95 us -209.167.42.96 - 209.167.50.207 ca -209.167.50.208 - 209.167.50.223 us -209.167.50.224 - 209.167.50.239 ca -209.167.50.240 - 209.167.51.31 us -209.167.51.32 - 209.167.51.95 ca -209.167.51.96 - 209.167.51.127 us -209.167.51.128 - 209.167.51.159 ca -209.167.51.160 - 209.167.51.191 us -209.167.51.192 - 209.167.52.127 ca -209.167.52.128 - 209.167.52.143 us -209.167.52.144 - 209.167.52.175 ca -209.167.52.176 - 209.167.52.207 us -209.167.52.208 - 209.167.55.175 ca -209.167.55.176 - 209.167.55.191 us -209.167.55.192 - 209.167.57.255 ca +209.167.38.0 - 209.167.41.255 ca +209.167.42.0 - 209.167.43.255 us +209.167.44.0 - 209.167.44.255 ca +209.167.45.0 - 209.167.45.255 us +209.167.46.0 - 209.167.47.255 ca +209.167.48.0 - 209.167.48.255 us +209.167.49.0 - 209.167.49.255 ca +209.167.50.0 - 209.167.52.255 us +209.167.53.0 - 209.167.53.255 ca +209.167.54.0 - 209.167.55.15 us +209.167.55.16 - 209.167.55.31 ca +209.167.55.32 - 209.167.56.255 us +209.167.57.0 - 209.167.57.255 ca 209.167.58.0 - 209.167.58.255 us 209.167.59.0 - 209.167.59.255 ca 209.167.60.0 - 209.167.61.255 us -209.167.62.0 - 209.167.65.255 ca -209.167.66.0 - 209.167.66.255 us +209.167.62.0 - 209.167.63.255 ca +209.167.64.0 - 209.167.66.255 us 209.167.67.0 - 209.167.67.63 ca -209.167.67.64 - 209.167.67.127 il -209.167.67.128 - 209.167.70.255 ca -209.167.71.0 - 209.167.71.15 us -209.167.71.16 - 209.167.72.95 ca -209.167.72.96 - 209.167.72.111 us -209.167.72.112 - 209.167.72.191 ca -209.167.72.192 - 209.167.72.255 us -209.167.73.0 - 209.167.73.255 ca -209.167.74.0 - 209.167.74.255 us -209.167.75.0 - 209.167.78.255 ca -209.167.79.0 - 209.167.80.255 us -209.167.81.0 - 209.167.81.63 ca -209.167.81.64 - 209.167.81.127 us -209.167.81.128 - 209.167.86.255 ca +209.167.67.64 - 209.167.67.255 us +209.167.68.0 - 209.167.68.255 ca +209.167.69.0 - 209.167.74.255 us +209.167.75.0 - 209.167.76.255 ca +209.167.77.0 - 209.167.77.255 us +209.167.78.0 - 209.167.78.255 ca +209.167.79.0 - 209.167.81.255 us +209.167.82.0 - 209.167.82.255 ca +209.167.83.0 - 209.167.84.255 us +209.167.85.0 - 209.167.86.255 ca 209.167.87.0 - 209.167.87.255 us -209.167.88.0 - 209.167.94.31 ca -209.167.94.32 - 209.167.94.63 us -209.167.94.64 - 209.167.96.127 ca -209.167.96.128 - 209.167.96.255 us -209.167.97.0 - 209.167.101.71 ca -209.167.101.72 - 209.167.101.79 us -209.167.101.80 - 209.167.101.191 ca -209.167.101.192 - 209.167.101.199 us -209.167.101.200 - 209.167.101.215 ca -209.167.101.216 - 209.167.101.223 us -209.167.101.224 - 209.167.101.231 ca -209.167.101.232 - 209.167.101.255 us -209.167.102.0 - 209.167.102.31 ca -209.167.102.32 - 209.167.102.47 us -209.167.102.48 - 209.167.102.127 ca -209.167.102.128 - 209.167.102.143 us -209.167.102.144 - 209.167.102.223 ca -209.167.102.224 - 209.167.102.239 us -209.167.102.240 - 209.167.103.255 ca +209.167.88.0 - 209.167.88.255 ca +209.167.89.0 - 209.167.89.255 us +209.167.90.0 - 209.167.93.255 ca +209.167.94.0 - 209.167.94.255 us +209.167.95.0 - 209.167.95.255 ca +209.167.96.0 - 209.167.97.255 us +209.167.98.0 - 209.167.98.255 ca +209.167.99.0 - 209.167.99.255 us +209.167.100.0 - 209.167.100.255 ca +209.167.101.0 - 209.167.102.255 us +209.167.103.0 - 209.167.103.255 ca 209.167.104.0 - 209.167.105.255 us 209.167.106.0 - 209.167.110.255 ca 209.167.111.0 - 209.167.111.255 us -209.167.112.0 - 209.167.124.63 ca -209.167.124.64 - 209.167.124.95 us -209.167.124.96 - 209.167.125.95 ca -209.167.125.96 - 209.167.125.111 us -209.167.125.112 - 209.167.130.47 ca -209.167.130.48 - 209.167.130.63 gb -209.167.130.64 - 209.167.130.127 ca -209.167.130.128 - 209.167.130.143 us -209.167.130.144 - 209.167.130.175 ca -209.167.130.176 - 209.167.130.191 us -209.167.130.192 - 209.167.130.207 ca -209.167.130.208 - 209.167.130.223 us -209.167.130.224 - 209.167.132.143 ca -209.167.132.144 - 209.167.132.159 us -209.167.132.160 - 209.167.133.7 ca -209.167.133.8 - 209.167.133.23 us -209.167.133.24 - 209.167.133.31 ca -209.167.133.32 - 209.167.133.39 us -209.167.133.40 - 209.167.133.63 ca -209.167.133.64 - 209.167.133.79 us -209.167.133.80 - 209.167.133.87 ca -209.167.133.88 - 209.167.133.95 us -209.167.133.96 - 209.167.133.119 ca -209.167.133.120 - 209.167.133.135 us -209.167.133.136 - 209.167.136.63 ca -209.167.136.64 - 209.167.136.95 us -209.167.136.96 - 209.167.136.159 ca -209.167.136.160 - 209.167.136.191 us -209.167.136.192 - 209.167.136.223 ca -209.167.136.224 - 209.167.137.127 us -209.167.137.128 - 209.167.139.127 ca -209.167.139.128 - 209.167.139.159 us -209.167.139.160 - 209.167.142.95 ca -209.167.142.96 - 209.167.142.127 us -209.167.142.128 - 209.167.146.127 ca -209.167.146.128 - 209.167.146.255 us -209.167.147.0 - 209.167.147.15 ca -209.167.147.16 - 209.167.147.23 us -209.167.147.24 - 209.167.147.39 ca -209.167.147.40 - 209.167.147.47 us -209.167.147.48 - 209.167.147.63 ca -209.167.147.64 - 209.167.147.71 us -209.167.147.72 - 209.167.147.95 ca -209.167.147.96 - 209.167.147.111 us -209.167.147.112 - 209.167.147.119 ca -209.167.147.120 - 209.167.147.143 us -209.167.147.144 - 209.167.147.151 ca -209.167.147.152 - 209.167.147.159 us -209.167.147.160 - 209.167.147.183 ca -209.167.147.184 - 209.167.147.191 us -209.167.147.192 - 209.167.147.199 ca -209.167.147.200 - 209.167.147.207 us -209.167.147.208 - 209.167.155.255 ca -209.167.156.0 - 209.167.156.7 us -209.167.156.8 - 209.167.156.71 ca -209.167.156.72 - 209.167.156.95 us -209.167.156.96 - 209.167.156.103 ca -209.167.156.104 - 209.167.156.111 us -209.167.156.112 - 209.167.156.127 ca -209.167.156.128 - 209.167.156.167 us -209.167.156.168 - 209.167.156.191 ca -209.167.156.192 - 209.167.156.199 us -209.167.156.200 - 209.167.162.191 ca -209.167.162.192 - 209.167.162.207 se -209.167.162.208 - 209.167.163.127 ca -209.167.163.128 - 209.167.163.159 us -209.167.163.160 - 209.167.163.239 ca -209.167.163.240 - 209.167.163.255 us -209.167.164.0 - 209.167.169.127 ca -209.167.169.128 - 209.167.169.191 us -209.167.169.192 - 209.167.171.255 ca -209.167.172.0 - 209.167.172.63 us -209.167.172.64 - 209.167.175.255 ca -209.167.176.0 - 209.167.176.15 us -209.167.176.16 - 209.167.177.95 ca -209.167.177.96 - 209.167.177.127 us -209.167.177.128 - 209.167.178.207 ca -209.167.178.208 - 209.167.178.223 us -209.167.178.224 - 209.167.183.255 ca -209.167.184.0 - 209.167.184.31 us -209.167.184.32 - 209.167.184.255 ca -209.167.185.0 - 209.167.185.15 us -209.167.185.16 - 209.167.185.111 ca -209.167.185.112 - 209.167.185.127 us -209.167.185.128 - 209.167.185.159 ca -209.167.185.160 - 209.167.185.175 us -209.167.185.176 - 209.167.185.191 ca -209.167.185.192 - 209.167.185.207 us -209.167.185.208 - 209.167.185.223 ca -209.167.185.224 - 209.167.185.239 us -209.167.185.240 - 209.167.187.255 ca -209.167.188.0 - 209.167.188.255 us -209.167.189.0 - 209.167.191.47 ca -209.167.191.48 - 209.167.191.63 us -209.167.191.64 - 209.167.191.111 ca -209.167.191.112 - 209.167.191.127 us -209.167.191.128 - 209.167.191.143 ca -209.167.191.144 - 209.167.191.159 nl -209.167.191.160 - 209.167.191.207 ca -209.167.191.208 - 209.167.191.223 us -209.167.191.224 - 209.167.191.255 ca -209.167.192.0 - 209.167.192.15 us -209.167.192.16 - 209.167.192.111 ca -209.167.192.112 - 209.167.192.127 us -209.167.192.128 - 209.167.192.159 ca -209.167.192.160 - 209.167.192.175 us -209.167.192.176 - 209.167.193.127 ca -209.167.193.128 - 209.167.193.255 us -209.167.194.0 - 209.167.200.63 ca -209.167.200.64 - 209.167.200.127 us -209.167.200.128 - 209.167.202.7 ca -209.167.202.8 - 209.167.202.15 us -209.167.202.16 - 209.167.202.135 ca -209.167.202.136 - 209.167.202.159 us -209.167.202.160 - 209.167.202.199 ca -209.167.202.200 - 209.167.202.215 us -209.167.202.216 - 209.167.202.239 ca -209.167.202.240 - 209.167.202.247 us -209.167.202.248 - 209.167.204.127 ca -209.167.204.128 - 209.167.204.255 us -209.167.205.0 - 209.167.212.7 ca -209.167.212.8 - 209.167.212.15 us -209.167.212.16 - 209.167.212.47 ca -209.167.212.48 - 209.167.212.55 us -209.167.212.56 - 209.167.212.63 ca -209.167.212.64 - 209.167.212.71 us -209.167.212.72 - 209.167.212.79 ca -209.167.212.80 - 209.167.212.87 us -209.167.212.88 - 209.167.212.111 ca -209.167.212.112 - 209.167.212.127 us -209.167.212.128 - 209.167.212.143 ca -209.167.212.144 - 209.167.212.151 us -209.167.212.152 - 209.167.212.159 ca -209.167.212.160 - 209.167.212.167 no -209.167.212.168 - 209.167.212.207 ca -209.167.212.208 - 209.167.212.215 us -209.167.212.216 - 209.167.212.223 ca -209.167.212.224 - 209.167.212.247 us -209.167.212.248 - 209.167.216.191 ca -209.167.216.192 - 209.167.216.255 us +209.167.112.0 - 209.167.115.255 ca +209.167.116.0 - 209.167.116.255 us +209.167.117.0 - 209.167.117.255 ca +209.167.118.0 - 209.167.118.255 us +209.167.119.0 - 209.167.123.255 ca +209.167.124.0 - 209.167.126.255 us +209.167.127.0 - 209.167.127.255 ca +209.167.128.0 - 209.167.133.215 us +209.167.133.216 - 209.167.133.223 ca +209.167.133.224 - 209.167.133.255 us +209.167.134.0 - 209.167.135.255 ca +209.167.136.0 - 209.167.139.255 us +209.167.140.0 - 209.167.141.255 ca +209.167.142.0 - 209.167.143.255 us +209.167.144.0 - 209.167.145.255 ca +209.167.146.0 - 209.167.147.87 us +209.167.147.88 - 209.167.147.95 ca +209.167.147.96 - 209.167.148.255 us +209.167.149.0 - 209.167.151.255 ca +209.167.152.0 - 209.167.152.255 us +209.167.153.0 - 209.167.153.255 ca +209.167.154.0 - 209.167.156.255 us +209.167.157.0 - 209.167.158.255 ca +209.167.159.0 - 209.167.159.63 us +209.167.159.64 - 209.167.159.95 ca +209.167.159.96 - 209.167.159.127 us +209.167.159.128 - 209.167.159.159 ca +209.167.159.160 - 209.167.160.255 us +209.167.161.0 - 209.167.161.255 ca +209.167.162.0 - 209.167.164.127 us +209.167.164.128 - 209.167.164.191 ca +209.167.164.192 - 209.167.166.255 us +209.167.167.0 - 209.167.168.255 ca +209.167.169.0 - 209.167.172.63 us +209.167.172.64 - 209.167.172.127 ca +209.167.172.128 - 209.167.172.255 us +209.167.173.0 - 209.167.175.255 ca +209.167.176.0 - 209.167.179.255 us +209.167.180.0 - 209.167.182.255 ca +209.167.183.0 - 209.167.185.255 us +209.167.186.0 - 209.167.186.255 ca +209.167.187.0 - 209.167.187.159 us +209.167.187.160 - 209.167.187.191 ca +209.167.187.192 - 209.167.193.255 us +209.167.194.0 - 209.167.197.255 ca +209.167.198.0 - 209.167.200.255 us +209.167.201.0 - 209.167.201.255 ca +209.167.202.0 - 209.167.204.255 us +209.167.205.0 - 209.167.205.255 ca +209.167.206.0 - 209.167.206.255 us +209.167.207.0 - 209.167.209.255 ca +209.167.210.0 - 209.167.210.255 us +209.167.211.0 - 209.167.211.255 ca +209.167.212.0 - 209.167.212.255 us +209.167.213.0 - 209.167.213.255 ca +209.167.214.0 - 209.167.214.255 us +209.167.215.0 - 209.167.215.255 ca +209.167.216.0 - 209.167.216.255 us 209.167.217.0 - 209.167.217.255 ca -209.167.218.0 - 209.167.218.63 us -209.167.218.64 - 209.167.218.127 ca -209.167.218.128 - 209.167.218.191 us -209.167.218.192 - 209.167.219.31 ca -209.167.219.32 - 209.167.219.63 us -209.167.219.64 - 209.167.219.159 ca -209.167.219.160 - 209.167.219.191 kw -209.167.219.192 - 209.167.221.255 ca -209.167.222.0 - 209.167.222.127 us -209.167.222.128 - 209.167.232.191 ca -209.167.232.192 - 209.167.232.255 us -209.167.233.0 - 209.167.233.15 ca -209.167.233.16 - 209.167.233.31 us -209.167.233.32 - 209.167.233.79 ca -209.167.233.80 - 209.167.233.95 us -209.167.233.96 - 209.167.233.127 ca -209.167.233.128 - 209.167.233.143 us -209.167.233.144 - 209.167.238.63 ca -209.167.238.64 - 209.167.238.95 us -209.167.238.96 - 209.167.240.127 ca -209.167.240.128 - 209.167.240.255 us -209.167.241.0 - 209.167.242.63 ca -209.167.242.64 - 209.167.242.127 us -209.167.242.128 - 209.167.242.191 ca -209.167.242.192 - 209.167.242.255 us -209.167.243.0 - 209.167.244.79 ca -209.167.244.80 - 209.167.244.255 us -209.167.245.0 - 209.167.245.127 ca -209.167.245.128 - 209.167.245.191 us -209.167.245.192 - 209.167.246.255 ca -209.167.247.0 - 209.167.247.127 us -209.167.247.128 - 209.167.250.255 ca -209.167.251.0 - 209.167.251.255 us -209.167.252.0 - 209.167.254.47 ca -209.167.254.48 - 209.167.254.63 us -209.167.254.64 - 209.167.254.103 ca -209.167.254.104 - 209.167.254.111 us -209.167.254.112 - 209.167.254.167 ca -209.167.254.168 - 209.167.254.183 us -209.167.254.184 - 209.167.255.255 ca -209.168.0.0 - 209.169.36.223 us -209.169.36.224 - 209.169.36.239 bs -209.169.36.240 - 209.169.38.215 us -209.169.38.216 - 209.169.38.223 ky -209.169.38.224 - 209.169.39.223 us -209.169.39.224 - 209.169.39.231 bz -209.169.39.232 - 209.169.40.207 us -209.169.40.208 - 209.169.40.215 gt -209.169.40.216 - 209.169.40.223 vi -209.169.40.224 - 209.169.41.207 us -209.169.41.208 - 209.169.41.215 gt -209.169.41.216 - 209.169.127.255 us +209.167.218.0 - 209.167.219.223 us +209.167.219.224 - 209.167.220.255 ca +209.167.221.0 - 209.167.222.255 us +209.167.223.0 - 209.167.228.255 ca +209.167.229.0 - 209.167.229.255 us +209.167.230.0 - 209.167.231.255 ca +209.167.232.0 - 209.167.232.127 us +209.167.232.128 - 209.167.232.159 ca +209.167.232.160 - 209.167.233.255 us +209.167.234.0 - 209.167.234.63 ca +209.167.234.64 - 209.167.234.255 us +209.167.235.0 - 209.167.237.255 ca +209.167.238.0 - 209.167.242.255 us +209.167.243.0 - 209.167.243.255 ca +209.167.244.0 - 209.167.245.255 us +209.167.246.0 - 209.167.246.255 ca +209.167.247.0 - 209.167.247.255 us +209.167.248.0 - 209.167.249.255 ca +209.167.250.0 - 209.167.251.255 us +209.167.252.0 - 209.167.253.255 ca +209.167.254.0 - 209.167.254.183 us +209.167.254.184 - 209.167.254.191 ca +209.167.254.192 - 209.167.254.255 us +209.167.255.0 - 209.167.255.255 ca +209.168.0.0 - 209.169.127.255 us 209.169.128.0 - 209.169.191.255 ca -209.169.192.0 - 209.170.67.255 us -209.170.68.0 - 209.170.68.255 no +209.169.192.0 - 209.170.68.255 us 209.170.69.0 - 209.170.69.255 ie 209.170.70.0 - 209.170.71.255 us 209.170.72.0 - 209.170.72.255 ie -209.170.73.0 - 209.170.73.255 de +209.170.73.0 - 209.170.73.255 us 209.170.74.0 - 209.170.74.255 ie -209.170.75.0 - 209.170.75.63 se -209.170.75.64 - 209.170.75.95 fr -209.170.75.96 - 209.170.75.127 se -209.170.75.128 - 209.170.77.255 us -209.170.78.0 - 209.170.78.31 bg -209.170.78.32 - 209.170.78.127 se -209.170.78.128 - 209.170.78.255 us -209.170.79.0 - 209.170.83.255 se -209.170.84.0 - 209.170.85.255 us -209.170.86.0 - 209.170.88.255 se +209.170.75.0 - 209.170.88.255 us 209.170.89.0 - 209.170.89.255 de -209.170.90.0 - 209.170.90.255 us -209.170.91.0 - 209.170.91.15 se -209.170.91.16 - 209.170.91.31 us -209.170.91.32 - 209.170.91.63 se -209.170.91.64 - 209.170.91.255 us -209.170.92.0 - 209.170.92.255 se -209.170.93.0 - 209.170.95.31 us -209.170.95.32 - 209.170.95.63 de -209.170.95.64 - 209.170.95.127 us -209.170.95.128 - 209.170.95.191 se -209.170.95.192 - 209.170.95.255 us -209.170.96.0 - 209.170.96.127 se -209.170.96.128 - 209.170.96.191 de -209.170.96.192 - 209.170.96.255 se -209.170.97.0 - 209.170.97.255 us -209.170.98.0 - 209.170.100.255 se -209.170.101.0 - 209.170.101.255 us -209.170.102.0 - 209.170.103.143 se -209.170.103.144 - 209.170.103.159 us -209.170.103.160 - 209.170.103.255 se -209.170.104.0 - 209.170.104.255 us -209.170.105.0 - 209.170.105.127 se -209.170.105.128 - 209.170.105.255 us -209.170.106.0 - 209.170.107.255 se -209.170.108.0 - 209.170.111.255 us +209.170.90.0 - 209.170.111.255 us 209.170.112.0 - 209.170.112.255 de 209.170.113.0 - 209.170.113.255 us 209.170.114.0 - 209.170.114.255 gb -209.170.115.0 - 209.170.119.15 us -209.170.119.16 - 209.170.119.31 se -209.170.119.32 - 209.170.119.63 us -209.170.119.64 - 209.170.119.127 se -209.170.119.128 - 209.170.120.63 us -209.170.120.64 - 209.170.120.127 se -209.170.120.128 - 209.170.120.159 no -209.170.120.160 - 209.170.120.207 se -209.170.120.208 - 209.170.120.215 us -209.170.120.216 - 209.170.120.255 se -209.170.121.0 - 209.170.121.255 us +209.170.115.0 - 209.170.118.255 us +209.170.119.0 - 209.170.119.15 at +209.170.119.16 - 209.170.121.255 us 209.170.122.0 - 209.170.124.255 ie -209.170.125.0 - 209.170.125.31 se -209.170.125.32 - 209.170.125.39 de -209.170.125.40 - 209.170.125.47 ca -209.170.125.48 - 209.170.125.103 se -209.170.125.104 - 209.170.125.119 us -209.170.125.120 - 209.170.125.199 se -209.170.125.200 - 209.170.125.207 il -209.170.125.208 - 209.170.127.255 se -209.170.128.0 - 209.170.255.255 us +209.170.125.0 - 209.170.255.255 us 209.171.0.0 - 209.171.255.255 ca 209.172.0.0 - 209.172.31.255 us 209.172.32.0 - 209.172.63.255 ca -209.172.64.0 - 209.173.246.79 us -209.173.246.80 - 209.173.246.90 lb -209.173.246.91 - 209.176.25.223 us -209.176.25.224 - 209.176.25.231 ca -209.176.25.232 - 209.176.66.111 us -209.176.66.112 - 209.176.66.127 ca -209.176.66.128 - 209.176.67.63 us -209.176.67.64 - 209.176.67.95 ca -209.176.67.96 - 209.176.68.135 us -209.176.68.136 - 209.176.68.143 ca -209.176.68.144 - 209.176.71.255 us +209.172.64.0 - 209.176.71.255 us 209.176.72.0 - 209.176.73.255 ca 209.176.74.0 - 209.177.95.255 us 209.177.96.0 - 209.177.111.255 ca -209.177.112.0 - 209.177.146.63 us -209.177.146.64 - 209.177.146.127 ar -209.177.146.128 - 209.177.146.191 us -209.177.146.192 - 209.177.146.255 mx +209.177.112.0 - 209.177.146.255 us 209.177.147.0 - 209.177.147.255 au -209.177.148.0 - 209.177.148.175 us -209.177.148.176 - 209.177.148.183 au -209.177.148.184 - 209.177.150.255 us +209.177.148.0 - 209.177.150.255 us 209.177.151.0 - 209.177.151.255 pa -209.177.152.0 - 209.177.152.175 us -209.177.152.176 - 209.177.152.183 gb -209.177.152.184 - 209.182.35.63 us -209.182.35.64 - 209.182.35.127 in -209.182.35.128 - 209.182.56.191 us -209.182.56.192 - 209.182.56.255 de -209.182.57.0 - 209.182.59.255 us +209.177.152.0 - 209.182.59.255 us 209.182.60.0 - 209.182.60.255 in -209.182.61.0 - 209.182.61.127 us -209.182.61.128 - 209.182.61.255 in -209.182.62.0 - 209.182.62.63 de -209.182.62.64 - 209.182.62.255 us -209.182.63.0 - 209.182.63.255 sg -209.182.64.0 - 209.182.255.255 us +209.182.61.0 - 209.182.255.255 us 209.183.0.0 - 209.183.31.255 ca 209.183.32.0 - 209.183.127.255 us 209.183.128.0 - 209.183.159.255 ca -209.183.160.0 - 209.187.255.255 us -209.188.0.0 - 209.188.0.63 cy -209.188.0.64 - 209.188.1.239 us -209.188.1.240 - 209.188.1.255 cy -209.188.2.0 - 209.188.6.63 us -209.188.6.64 - 209.188.6.127 au -209.188.6.128 - 209.188.13.255 us +209.183.160.0 - 209.188.13.255 us 209.188.14.0 - 209.188.14.255 gb -209.188.15.0 - 209.188.22.127 us -209.188.22.128 - 209.188.22.159 nl -209.188.22.160 - 209.188.24.255 us -209.188.25.0 - 209.188.25.255 ca -209.188.26.0 - 209.188.31.31 us -209.188.31.32 - 209.188.31.63 th -209.188.31.64 - 209.190.9.127 us -209.190.9.128 - 209.190.9.135 gb -209.190.9.136 - 209.190.17.103 us -209.190.17.104 - 209.190.17.111 tr -209.190.17.112 - 209.190.22.159 us -209.190.22.160 - 209.190.22.167 ca -209.190.22.168 - 209.190.22.175 th -209.190.22.176 - 209.190.24.87 us -209.190.24.88 - 209.190.24.95 ca -209.190.24.96 - 209.190.24.103 us -209.190.24.104 - 209.190.24.111 cn -209.190.24.112 - 209.190.27.223 us -209.190.27.224 - 209.190.27.231 it -209.190.27.232 - 209.190.51.151 us -209.190.51.152 - 209.190.51.159 jp -209.190.51.160 - 209.190.60.255 us -209.190.61.0 - 209.190.61.255 gb -209.190.62.0 - 209.190.84.255 us -209.190.85.0 - 209.190.85.255 gb -209.190.86.0 - 209.190.87.255 us +209.188.15.0 - 209.188.24.255 us +209.188.25.0 - 209.188.25.31 ca +209.188.25.32 - 209.188.25.39 us +209.188.25.40 - 209.188.25.255 ca +209.188.26.0 - 209.190.87.255 us 209.190.88.0 - 209.190.88.255 in -209.190.89.0 - 209.190.154.127 us -209.190.154.128 - 209.190.154.191 ca -209.190.154.192 - 209.191.156.239 us -209.191.156.240 - 209.191.156.247 gb -209.191.156.248 - 209.192.157.47 us -209.192.157.48 - 209.192.157.63 gb -209.192.157.64 - 209.195.63.255 us +209.190.89.0 - 209.190.109.255 us +209.190.110.0 - 209.190.110.255 in +209.190.111.0 - 209.190.114.255 us +209.190.115.0 - 209.190.115.255 in +209.190.116.0 - 209.195.63.255 us 209.195.64.0 - 209.195.127.255 ca -209.195.128.0 - 209.196.147.143 us -209.196.147.144 - 209.196.147.151 gr -209.196.147.152 - 209.196.223.255 us +209.195.128.0 - 209.196.223.255 us 209.196.224.0 - 209.196.239.255 ca -209.196.240.0 - 209.197.5.63 us -209.197.5.64 - 209.197.5.71 nl -209.197.5.72 - 209.197.16.63 us -209.197.16.64 - 209.197.16.71 nl -209.197.16.72 - 209.197.127.255 us +209.196.240.0 - 209.197.24.29 us +209.197.24.30 - 209.197.24.30 br +209.197.24.31 - 209.197.127.255 us 209.197.128.0 - 209.197.191.255 ca -209.197.192.0 - 209.197.223.255 us -209.197.224.0 - 209.197.224.63 it -209.197.224.64 - 209.197.224.175 us -209.197.224.176 - 209.197.224.183 sa -209.197.224.184 - 209.197.224.215 us -209.197.224.216 - 209.197.224.223 th -209.197.224.224 - 209.197.224.255 us -209.197.225.0 - 209.197.225.15 de -209.197.225.16 - 209.197.225.39 us -209.197.225.40 - 209.197.225.47 it -209.197.225.48 - 209.197.225.55 in -209.197.225.56 - 209.197.225.71 gb -209.197.225.72 - 209.197.225.143 us -209.197.225.144 - 209.197.225.151 au -209.197.225.152 - 209.197.225.167 us -209.197.225.168 - 209.197.225.175 ca -209.197.225.176 - 209.197.225.191 gb -209.197.225.192 - 209.197.225.223 ca -209.197.225.224 - 209.197.226.103 us -209.197.226.104 - 209.197.226.239 sa -209.197.226.240 - 209.197.226.255 us -209.197.227.0 - 209.197.227.255 ca -209.197.228.0 - 209.197.228.47 us -209.197.228.48 - 209.197.228.95 my -209.197.228.96 - 209.197.228.111 ar -209.197.228.112 - 209.197.228.247 ae -209.197.228.248 - 209.197.228.255 us -209.197.229.0 - 209.197.229.223 ar -209.197.229.224 - 209.197.229.231 us -209.197.229.232 - 209.197.229.239 ae -209.197.229.240 - 209.197.229.247 us -209.197.229.248 - 209.197.229.255 ru -209.197.230.0 - 209.197.230.7 ar -209.197.230.8 - 209.197.235.215 us -209.197.235.216 - 209.197.235.223 my -209.197.235.224 - 209.197.235.239 om -209.197.235.240 - 209.197.236.143 us -209.197.236.144 - 209.197.236.151 ca -209.197.236.152 - 209.197.236.175 us -209.197.236.176 - 209.197.236.183 ar -209.197.236.184 - 209.197.236.255 us -209.197.237.0 - 209.197.237.15 ae -209.197.237.16 - 209.197.237.31 us -209.197.237.32 - 209.197.237.47 gb -209.197.237.48 - 209.197.237.191 my -209.197.237.192 - 209.197.237.207 ar -209.197.237.208 - 209.197.238.143 us -209.197.238.144 - 209.197.238.151 gb -209.197.238.152 - 209.197.238.255 us -209.197.239.0 - 209.197.239.7 ar -209.197.239.8 - 209.197.239.23 my -209.197.239.24 - 209.197.239.31 us -209.197.239.32 - 209.197.239.255 my -209.197.240.0 - 209.197.240.103 us -209.197.240.104 - 209.197.240.111 au -209.197.240.112 - 209.197.242.255 us -209.197.243.0 - 209.197.243.255 ar -209.197.244.0 - 209.197.244.127 us -209.197.244.128 - 209.197.244.191 ru -209.197.244.192 - 209.197.245.255 us -209.197.246.0 - 209.197.246.255 ar -209.197.247.0 - 209.197.247.255 de -209.197.248.0 - 209.197.249.39 us -209.197.249.40 - 209.197.249.47 ru -209.197.249.48 - 209.197.249.255 us -209.197.250.0 - 209.197.250.15 ru -209.197.250.16 - 209.197.250.63 us -209.197.250.64 - 209.197.250.79 ru -209.197.250.80 - 209.197.251.7 us -209.197.251.8 - 209.197.251.15 cy -209.197.251.16 - 209.197.253.255 us -209.197.254.0 - 209.197.255.255 ca -209.198.0.0 - 209.198.10.239 us -209.198.10.240 - 209.198.10.243 pt -209.198.10.244 - 209.198.10.255 us -209.198.11.0 - 209.198.11.63 it -209.198.11.64 - 209.198.25.95 us -209.198.25.96 - 209.198.25.103 hk -209.198.25.104 - 209.198.32.31 us -209.198.32.32 - 209.198.32.63 ca -209.198.32.64 - 209.198.205.143 us -209.198.205.144 - 209.198.205.159 sz -209.198.205.160 - 209.198.207.255 us -209.198.216.0 - 209.198.239.255 us +209.197.192.0 - 209.198.239.255 us 209.198.240.0 - 209.198.241.255 bh -209.198.242.0 - 209.198.247.255 a2 +209.198.242.0 - 209.198.247.255 de 209.198.248.0 - 209.200.128.255 us 209.200.129.0 - 209.200.129.255 na 209.200.130.0 - 209.200.130.255 us 209.200.131.0 - 209.200.131.255 ca -209.200.132.0 - 209.200.135.63 us -209.200.135.64 - 209.200.135.79 cy -209.200.135.80 - 209.200.159.255 us +209.200.132.0 - 209.200.159.255 us 209.200.160.0 - 209.200.160.255 gb -209.200.161.0 - 209.200.162.223 us -209.200.162.224 - 209.200.162.255 ag -209.200.163.0 - 209.200.169.31 us -209.200.169.32 - 209.200.169.63 gb -209.200.169.64 - 209.200.176.255 us +209.200.161.0 - 209.200.176.255 us 209.200.177.0 - 209.200.177.255 ca -209.200.178.0 - 209.200.226.4 us -209.200.226.5 - 209.200.226.12 vn -209.200.226.13 - 209.200.226.55 us -209.200.226.56 - 209.200.226.65 br -209.200.226.66 - 209.200.226.71 us -209.200.226.72 - 209.200.226.86 ca -209.200.226.87 - 209.200.228.60 us -209.200.228.61 - 209.200.228.69 in -209.200.228.70 - 209.201.255.255 us -209.202.0.0 - 209.202.94.79 ca -209.202.94.80 - 209.202.94.87 us -209.202.94.88 - 209.202.94.95 ca -209.202.94.96 - 209.202.94.127 us -209.202.94.128 - 209.202.101.47 ca -209.202.101.48 - 209.202.101.55 us -209.202.101.56 - 209.202.127.255 ca -209.202.128.0 - 209.202.128.127 us -209.202.128.128 - 209.202.128.159 ca -209.202.128.160 - 209.202.140.191 us -209.202.140.192 - 209.202.140.255 ca -209.202.141.0 - 209.202.151.223 us -209.202.151.224 - 209.202.151.255 gb -209.202.152.0 - 209.202.157.255 us -209.202.158.0 - 209.202.158.135 ca -209.202.158.136 - 209.202.183.255 us +209.200.178.0 - 209.201.255.255 us +209.202.0.0 - 209.202.127.255 ca +209.202.128.0 - 209.202.183.255 us 209.202.184.0 - 209.202.185.255 ca 209.202.186.0 - 209.202.255.255 us 209.203.0.0 - 209.203.63.255 za -209.203.64.0 - 209.203.226.63 us -209.203.226.64 - 209.203.226.95 in -209.203.226.96 - 209.203.246.191 us -209.203.246.192 - 209.203.246.255 gb -209.203.247.0 - 209.204.255.255 us -209.205.0.0 - 209.205.25.255 ca -209.205.26.0 - 209.205.26.7 us -209.205.26.8 - 209.205.26.87 ca -209.205.26.88 - 209.205.26.95 us -209.205.26.96 - 209.205.26.127 ca -209.205.26.128 - 209.205.26.135 us -209.205.26.136 - 209.205.30.63 ca -209.205.30.64 - 209.205.30.127 de -209.205.30.128 - 209.205.32.159 ca -209.205.32.160 - 209.205.32.191 us -209.205.32.192 - 209.205.33.95 ca -209.205.33.96 - 209.205.33.127 us -209.205.33.128 - 209.205.111.255 ca -209.205.112.0 - 209.205.239.255 us +209.203.64.0 - 209.204.255.255 us +209.205.0.0 - 209.205.5.255 ca +209.205.6.0 - 209.205.7.255 us +209.205.8.0 - 209.205.15.255 ca +209.205.16.0 - 209.205.16.47 us +209.205.16.48 - 209.205.16.63 ca +209.205.16.64 - 209.205.18.255 us +209.205.19.0 - 209.205.19.255 ca +209.205.20.0 - 209.205.20.127 us +209.205.20.128 - 209.205.20.159 ca +209.205.20.160 - 209.205.21.255 us +209.205.22.0 - 209.205.22.255 ca +209.205.23.0 - 209.205.26.47 us +209.205.26.48 - 209.205.26.55 ca +209.205.26.56 - 209.205.26.255 us +209.205.27.0 - 209.205.28.255 ca +209.205.29.0 - 209.205.34.255 us +209.205.35.0 - 209.205.36.255 ca +209.205.37.0 - 209.205.37.255 us +209.205.38.0 - 209.205.42.255 ca +209.205.43.0 - 209.205.43.255 us +209.205.44.0 - 209.205.111.255 ca +209.205.112.0 - 209.205.223.255 us 209.205.240.0 - 209.205.255.255 ca 209.206.0.0 - 209.207.63.255 us -209.207.64.0 - 209.207.64.79 ca -209.207.64.80 - 209.207.64.87 us -209.207.64.88 - 209.207.64.175 ca -209.207.64.176 - 209.207.64.183 us -209.207.64.184 - 209.207.64.239 ca -209.207.64.240 - 209.207.64.247 us -209.207.64.248 - 209.207.65.255 ca -209.207.66.0 - 209.207.66.23 us -209.207.66.24 - 209.207.66.63 ca -209.207.66.64 - 209.207.66.79 us -209.207.66.80 - 209.207.66.191 ca -209.207.66.192 - 209.207.66.199 us -209.207.66.200 - 209.207.67.71 ca -209.207.67.72 - 209.207.67.111 us -209.207.67.112 - 209.207.67.135 ca -209.207.67.136 - 209.207.67.167 us -209.207.67.168 - 209.207.67.223 ca -209.207.67.224 - 209.207.67.231 us -209.207.67.232 - 209.207.67.247 ca -209.207.67.248 - 209.207.67.255 us -209.207.68.0 - 209.207.68.183 ca -209.207.68.184 - 209.207.68.191 us -209.207.68.192 - 209.207.69.79 ca -209.207.69.80 - 209.207.69.87 us -209.207.69.88 - 209.207.69.135 ca -209.207.69.136 - 209.207.69.143 us -209.207.69.144 - 209.207.69.151 ca -209.207.69.152 - 209.207.69.159 us -209.207.69.160 - 209.207.69.167 ca -209.207.69.168 - 209.207.69.175 us -209.207.69.176 - 209.207.69.207 ca -209.207.69.208 - 209.207.69.215 us -209.207.69.216 - 209.207.69.223 ca -209.207.69.224 - 209.207.69.231 us -209.207.69.232 - 209.207.69.239 ca -209.207.69.240 - 209.207.69.247 us -209.207.69.248 - 209.207.69.255 ca -209.207.70.0 - 209.207.70.7 us -209.207.70.8 - 209.207.70.55 ca -209.207.70.56 - 209.207.70.71 us -209.207.70.72 - 209.207.70.127 ca -209.207.70.128 - 209.207.70.135 us -209.207.70.136 - 209.207.70.191 ca -209.207.70.192 - 209.207.70.199 us -209.207.70.200 - 209.207.70.255 ca -209.207.71.0 - 209.207.71.7 us -209.207.71.8 - 209.207.71.103 ca -209.207.71.104 - 209.207.71.111 us -209.207.71.112 - 209.207.71.119 ca -209.207.71.120 - 209.207.71.127 us -209.207.71.128 - 209.207.73.79 ca -209.207.73.80 - 209.207.73.87 us -209.207.73.88 - 209.207.73.143 ca -209.207.73.144 - 209.207.73.151 us -209.207.73.152 - 209.207.74.7 ca -209.207.74.8 - 209.207.74.23 us -209.207.74.24 - 209.207.74.47 ca -209.207.74.48 - 209.207.74.63 us -209.207.74.64 - 209.207.74.71 ca -209.207.74.72 - 209.207.74.79 us -209.207.74.80 - 209.207.74.87 ca -209.207.74.88 - 209.207.74.95 us -209.207.74.96 - 209.207.74.111 ca -209.207.74.112 - 209.207.74.119 us -209.207.74.120 - 209.207.75.87 ca -209.207.75.88 - 209.207.75.119 us -209.207.75.120 - 209.207.77.71 ca -209.207.77.72 - 209.207.77.79 us -209.207.77.80 - 209.207.77.103 ca -209.207.77.104 - 209.207.77.111 us -209.207.77.112 - 209.207.78.151 ca -209.207.78.152 - 209.207.78.167 us -209.207.78.168 - 209.207.79.167 ca -209.207.79.168 - 209.207.79.175 us -209.207.79.176 - 209.207.80.231 ca -209.207.80.232 - 209.207.80.239 us -209.207.80.240 - 209.207.82.103 ca -209.207.82.104 - 209.207.82.111 us -209.207.82.112 - 209.207.82.207 ca -209.207.82.208 - 209.207.82.215 us -209.207.82.216 - 209.207.82.255 ca -209.207.83.0 - 209.207.83.15 us -209.207.83.16 - 209.207.83.159 ca -209.207.83.160 - 209.207.83.167 us -209.207.83.168 - 209.207.83.247 ca -209.207.83.248 - 209.207.83.255 nl -209.207.84.0 - 209.207.84.23 ca -209.207.84.24 - 209.207.84.31 us -209.207.84.32 - 209.207.84.39 ca -209.207.84.40 - 209.207.84.47 us -209.207.84.48 - 209.207.84.191 ca -209.207.84.192 - 209.207.84.199 us -209.207.84.200 - 209.207.88.47 ca -209.207.88.48 - 209.207.88.55 us -209.207.88.56 - 209.207.88.79 ca -209.207.88.80 - 209.207.88.87 us -209.207.88.88 - 209.207.88.159 ca -209.207.88.160 - 209.207.88.167 us -209.207.88.168 - 209.207.89.15 ca -209.207.89.16 - 209.207.89.23 us -209.207.89.24 - 209.207.89.111 ca -209.207.89.112 - 209.207.89.119 us -209.207.89.120 - 209.207.89.167 ca -209.207.89.168 - 209.207.89.175 us -209.207.89.176 - 209.207.89.231 ca -209.207.89.232 - 209.207.89.239 us -209.207.89.240 - 209.207.90.95 ca -209.207.90.96 - 209.207.90.103 us -209.207.90.104 - 209.207.90.135 ca -209.207.90.136 - 209.207.90.143 us -209.207.90.144 - 209.207.91.47 ca -209.207.91.48 - 209.207.91.55 us -209.207.91.56 - 209.207.92.63 ca -209.207.92.64 - 209.207.92.79 us -209.207.92.80 - 209.207.92.167 ca -209.207.92.168 - 209.207.92.175 us -209.207.92.176 - 209.207.92.191 ca -209.207.92.192 - 209.207.92.239 us -209.207.92.240 - 209.207.93.47 ca -209.207.93.48 - 209.207.93.87 us -209.207.93.88 - 209.207.93.143 ca -209.207.93.144 - 209.207.93.151 us -209.207.93.152 - 209.207.93.191 ca -209.207.93.192 - 209.207.93.199 us -209.207.93.200 - 209.207.94.31 ca -209.207.94.32 - 209.207.94.39 us -209.207.94.40 - 209.207.95.71 ca -209.207.95.72 - 209.207.95.119 us -209.207.95.120 - 209.207.95.127 ca -209.207.95.128 - 209.207.95.135 us -209.207.95.136 - 209.207.95.239 ca -209.207.95.240 - 209.207.95.255 us -209.207.96.0 - 209.207.96.23 ca -209.207.96.24 - 209.207.96.39 us -209.207.96.40 - 209.207.97.239 ca -209.207.97.240 - 209.207.97.247 il -209.207.97.248 - 209.207.103.255 ca -209.207.104.0 - 209.207.104.7 us -209.207.104.8 - 209.207.104.79 ca -209.207.104.80 - 209.207.104.87 us -209.207.104.88 - 209.207.104.231 ca -209.207.104.232 - 209.207.104.239 us -209.207.104.240 - 209.207.104.255 ca -209.207.105.0 - 209.207.105.7 nl -209.207.105.8 - 209.207.105.167 ca -209.207.105.168 - 209.207.105.175 us -209.207.105.176 - 209.207.107.39 ca -209.207.107.40 - 209.207.107.47 us -209.207.107.48 - 209.207.107.55 ca -209.207.107.56 - 209.207.107.63 us -209.207.107.64 - 209.207.107.119 ca -209.207.107.120 - 209.207.107.167 us -209.207.107.168 - 209.207.109.39 ca -209.207.109.40 - 209.207.109.87 us -209.207.109.88 - 209.207.109.103 ca -209.207.109.104 - 209.207.109.111 us -209.207.109.112 - 209.207.109.119 ca -209.207.109.120 - 209.207.109.127 us -209.207.109.128 - 209.207.109.159 ca -209.207.109.160 - 209.207.109.191 us -209.207.109.192 - 209.207.109.199 ca -209.207.109.200 - 209.207.109.223 us -209.207.109.224 - 209.207.110.47 ca -209.207.110.48 - 209.207.110.55 us -209.207.110.56 - 209.207.110.143 ca -209.207.110.144 - 209.207.110.151 us -209.207.110.152 - 209.207.111.79 ca -209.207.111.80 - 209.207.111.87 us -209.207.111.88 - 209.207.111.175 ca -209.207.111.176 - 209.207.111.199 us -209.207.111.200 - 209.207.111.223 ca -209.207.111.224 - 209.207.111.247 us -209.207.111.248 - 209.207.111.255 ca -209.207.112.0 - 209.207.112.23 us -209.207.112.24 - 209.207.112.39 ca -209.207.112.40 - 209.207.112.79 us -209.207.112.80 - 209.207.112.87 ca -209.207.112.88 - 209.207.112.95 us -209.207.112.96 - 209.207.113.7 ca -209.207.113.8 - 209.207.113.23 us -209.207.113.24 - 209.207.113.31 ca -209.207.113.32 - 209.207.113.39 us -209.207.113.40 - 209.207.113.111 ca -209.207.113.112 - 209.207.113.135 us -209.207.113.136 - 209.207.114.111 ca -209.207.114.112 - 209.207.114.127 us -209.207.114.128 - 209.207.115.47 ca -209.207.115.48 - 209.207.115.55 us -209.207.115.56 - 209.207.115.95 ca -209.207.115.96 - 209.207.115.103 us -209.207.115.104 - 209.207.115.135 ca -209.207.115.136 - 209.207.115.143 us -209.207.115.144 - 209.207.115.159 ca -209.207.115.160 - 209.207.115.167 us -209.207.115.168 - 209.207.115.223 ca -209.207.115.224 - 209.207.115.231 us -209.207.115.232 - 209.207.117.103 ca -209.207.117.104 - 209.207.117.111 us -209.207.117.112 - 209.207.117.119 ca -209.207.117.120 - 209.207.117.127 us -209.207.117.128 - 209.207.117.215 ca -209.207.117.216 - 209.207.117.223 us -209.207.117.224 - 209.207.118.183 ca -209.207.118.184 - 209.207.118.191 us -209.207.118.192 - 209.207.118.255 ca -209.207.119.0 - 209.207.119.7 us -209.207.119.8 - 209.207.119.63 ca -209.207.119.64 - 209.207.119.79 us -209.207.119.80 - 209.207.119.87 gh -209.207.119.88 - 209.207.119.103 ca -209.207.119.104 - 209.207.119.191 us -209.207.119.192 - 209.207.119.215 ca -209.207.119.216 - 209.207.119.231 us -209.207.119.232 - 209.207.120.135 ca -209.207.120.136 - 209.207.120.143 us -209.207.120.144 - 209.207.120.239 ca -209.207.120.240 - 209.207.120.255 us -209.207.121.0 - 209.207.121.63 ca -209.207.121.64 - 209.207.121.191 us -209.207.121.192 - 209.207.121.207 ca -209.207.121.208 - 209.207.121.215 us -209.207.121.216 - 209.207.121.255 ca -209.207.122.0 - 209.207.122.7 us -209.207.122.8 - 209.207.122.159 ca -209.207.122.160 - 209.207.122.175 us -209.207.122.176 - 209.207.122.191 ca -209.207.122.192 - 209.207.122.215 us -209.207.122.216 - 209.207.122.255 ca -209.207.123.0 - 209.207.123.47 us -209.207.123.48 - 209.207.125.95 ca -209.207.125.96 - 209.207.125.103 us -209.207.125.104 - 209.207.125.159 ca -209.207.125.160 - 209.207.125.175 us -209.207.125.176 - 209.207.125.191 ca -209.207.125.192 - 209.207.125.199 us -209.207.125.200 - 209.207.125.231 ca -209.207.125.232 - 209.207.125.247 us -209.207.125.248 - 209.207.125.255 ca -209.207.126.0 - 209.207.126.7 us -209.207.126.8 - 209.207.127.255 ca -209.207.128.0 - 209.208.8.143 us -209.208.8.144 - 209.208.8.159 nl -209.208.8.160 - 209.208.12.47 us -209.208.12.48 - 209.208.12.63 ar -209.208.12.64 - 209.208.16.239 us -209.208.16.240 - 209.208.16.247 ca -209.208.16.248 - 209.208.19.175 us -209.208.19.176 - 209.208.19.191 gb -209.208.19.192 - 209.208.20.31 us -209.208.20.32 - 209.208.20.63 nl -209.208.20.64 - 209.208.20.95 us -209.208.20.96 - 209.208.20.111 gb -209.208.20.112 - 209.208.22.47 us -209.208.22.48 - 209.208.22.63 br -209.208.22.64 - 209.208.22.191 us -209.208.22.192 - 209.208.22.207 ca -209.208.22.208 - 209.208.23.223 us -209.208.23.224 - 209.208.23.255 nl -209.208.24.0 - 209.208.32.207 us -209.208.32.208 - 209.208.32.223 bs -209.208.32.224 - 209.208.36.63 us -209.208.36.64 - 209.208.36.79 au -209.208.36.80 - 209.208.36.95 ec -209.208.36.96 - 209.208.46.47 us -209.208.46.48 - 209.208.46.63 br -209.208.46.64 - 209.208.48.231 us -209.208.48.232 - 209.208.48.247 ca -209.208.48.248 - 209.208.64.255 us -209.208.65.0 - 209.208.65.255 ca -209.208.66.0 - 209.208.67.175 us -209.208.67.176 - 209.208.67.191 ca -209.208.67.192 - 209.208.69.31 us -209.208.69.32 - 209.208.69.63 de -209.208.69.64 - 209.208.73.127 us -209.208.73.128 - 209.208.73.143 es -209.208.73.144 - 209.208.100.223 us -209.208.100.224 - 209.208.100.239 nl -209.208.100.240 - 209.208.107.111 us -209.208.107.112 - 209.208.107.127 ca -209.208.107.128 - 209.208.109.255 us -209.208.110.0 - 209.208.110.255 ca -209.208.111.0 - 209.208.118.191 us -209.208.118.192 - 209.208.118.199 lb -209.208.118.200 - 209.208.125.207 us -209.208.125.208 - 209.208.125.223 ca -209.208.125.224 - 209.208.126.31 us -209.208.126.32 - 209.208.126.39 br -209.208.126.40 - 209.208.169.79 us -209.208.169.80 - 209.208.169.95 es -209.208.169.96 - 209.208.174.223 us -209.208.174.224 - 209.208.174.231 vg -209.208.174.232 - 209.208.202.175 us -209.208.202.176 - 209.208.202.191 gb -209.208.202.192 - 209.212.95.255 us +209.207.64.0 - 209.207.127.255 ca +209.207.128.0 - 209.212.95.255 us 209.212.96.0 - 209.212.127.255 za -209.212.128.0 - 209.212.145.200 us -209.212.145.201 - 209.212.145.201 a1 -209.212.145.202 - 209.213.209.127 us -209.213.209.128 - 209.213.209.143 gb -209.213.209.144 - 209.213.223.255 us +209.212.128.0 - 209.213.62.255 us +209.213.63.0 - 209.213.63.255 ca +209.213.64.0 - 209.213.223.255 us 209.213.224.0 - 209.213.255.255 ca 209.214.0.0 - 209.214.253.255 us 209.214.254.0 - 209.214.255.255 a2 209.215.0.0 - 209.216.127.255 us 209.216.128.0 - 209.216.159.255 ca -209.216.160.0 - 209.216.191.255 us -209.216.192.0 - 209.216.255.255 a1 -209.217.0.0 - 209.217.63.255 us -209.217.64.0 - 209.217.64.151 ca -209.217.64.152 - 209.217.64.159 us -209.217.64.160 - 209.217.78.15 ca -209.217.78.16 - 209.217.78.23 us -209.217.78.24 - 209.217.92.239 ca -209.217.92.240 - 209.217.92.255 us -209.217.93.0 - 209.217.94.223 ca -209.217.94.224 - 209.217.94.239 us -209.217.94.240 - 209.217.97.119 ca -209.217.97.120 - 209.217.97.127 us -209.217.97.128 - 209.217.113.15 ca -209.217.113.16 - 209.217.113.47 us -209.217.113.48 - 209.217.118.135 ca -209.217.118.136 - 209.217.118.143 us -209.217.118.144 - 209.217.125.127 ca -209.217.125.128 - 209.217.125.135 us -209.217.125.136 - 209.217.126.95 ca -209.217.126.96 - 209.217.126.127 us -209.217.126.128 - 209.217.127.255 ca -209.217.128.0 - 209.218.97.47 us -209.218.97.48 - 209.218.97.55 ca -209.218.97.56 - 209.221.63.255 us +209.216.160.0 - 209.216.197.255 us +209.216.198.0 - 209.216.198.255 a1 +209.216.199.0 - 209.217.63.255 us +209.217.64.0 - 209.217.127.255 ca +209.217.128.0 - 209.221.63.255 us 209.221.64.0 - 209.221.127.255 ca -209.221.128.0 - 209.221.134.251 us -209.221.134.252 - 209.221.134.255 ch -209.221.135.0 - 209.221.223.255 us -209.221.224.0 - 209.221.226.255 bz -209.221.227.0 - 209.222.2.255 us +209.221.128.0 - 209.222.2.255 us 209.222.3.0 - 209.222.3.31 a1 209.222.3.32 - 209.222.29.255 us -209.222.30.0 - 209.222.31.255 es +209.222.30.0 - 209.222.30.255 gb +209.222.31.0 - 209.222.31.255 es 209.222.32.0 - 209.222.47.255 us 209.222.48.0 - 209.222.63.255 ca -209.222.64.0 - 209.222.64.63 us -209.222.64.64 - 209.222.64.127 il -209.222.64.128 - 209.222.65.255 us -209.222.66.0 - 209.222.66.7 my -209.222.66.8 - 209.222.66.31 us -209.222.66.32 - 209.222.66.39 ro -209.222.66.40 - 209.222.66.127 us -209.222.66.128 - 209.222.66.143 fr -209.222.66.144 - 209.222.70.255 us -209.222.71.0 - 209.222.71.7 my -209.222.71.8 - 209.222.71.15 gb -209.222.71.16 - 209.222.71.23 de -209.222.71.24 - 209.222.88.15 us -209.222.88.16 - 209.222.88.23 my -209.222.88.24 - 209.222.96.7 us -209.222.96.8 - 209.222.96.15 br -209.222.96.16 - 209.222.96.23 au -209.222.96.24 - 209.222.96.31 us -209.222.96.32 - 209.222.96.39 pk -209.222.96.40 - 209.222.96.47 us -209.222.96.48 - 209.222.96.55 gb -209.222.96.56 - 209.222.96.79 us -209.222.96.80 - 209.222.96.87 nz -209.222.96.88 - 209.222.96.95 br -209.222.96.96 - 209.222.96.255 us -209.222.97.0 - 209.222.97.7 il -209.222.97.8 - 209.222.104.191 us -209.222.104.192 - 209.222.104.199 au -209.222.104.200 - 209.222.105.111 us -209.222.105.112 - 209.222.105.119 gr -209.222.105.120 - 209.222.105.127 ca -209.222.105.128 - 209.222.107.127 us -209.222.107.128 - 209.222.107.143 hk -209.222.107.144 - 209.222.107.159 us -209.222.107.160 - 209.222.107.175 gb -209.222.107.176 - 209.222.122.127 us -209.222.122.128 - 209.222.122.143 in -209.222.122.144 - 209.222.159.255 us +209.222.64.0 - 209.222.159.255 us 209.222.160.0 - 209.222.175.255 ca 209.222.176.0 - 209.222.223.255 us 209.222.224.0 - 209.222.239.255 ca -209.222.240.0 - 209.222.243.255 us -209.223.0.0 - 209.223.85.255 us -209.223.86.0 - 209.223.86.7 ca -209.223.86.8 - 209.223.86.47 us -209.223.86.48 - 209.223.86.63 au -209.223.86.64 - 209.223.130.255 us +209.222.240.0 - 209.223.130.255 us 209.223.131.0 - 209.223.131.255 au -209.223.132.0 - 209.223.179.55 us -209.223.179.56 - 209.223.179.63 mx -209.223.179.64 - 209.223.197.127 us -209.223.197.128 - 209.223.197.159 ca -209.223.197.160 - 209.223.210.95 us -209.223.210.96 - 209.223.210.111 ca -209.223.210.112 - 209.225.11.63 us -209.225.11.64 - 209.225.11.127 ar -209.225.11.128 - 209.225.34.255 us -209.225.35.0 - 209.225.35.31 fr -209.225.35.32 - 209.225.48.255 us +209.223.132.0 - 209.225.48.255 us 209.225.49.0 - 209.225.49.255 ar -209.225.50.0 - 209.225.59.255 us -209.225.60.0 - 209.225.60.63 ca -209.225.60.64 - 209.225.60.111 us -209.225.60.112 - 209.225.60.119 ca -209.225.60.120 - 209.225.60.127 us -209.225.60.128 - 209.225.60.135 ca -209.225.60.136 - 209.225.255.255 us +209.225.50.0 - 209.225.127.255 us +209.225.128.0 - 209.225.142.255 ca +209.225.143.0 - 209.225.143.255 us +209.225.144.0 - 209.225.160.255 ca +209.225.161.0 - 209.225.161.255 us +209.225.162.0 - 209.225.191.255 ca +209.225.192.0 - 209.225.255.255 us 209.226.0.0 - 209.226.255.255 ca -209.227.0.0 - 209.227.194.255 us -209.227.195.0 - 209.227.195.79 it -209.227.195.80 - 209.227.202.255 us -209.227.203.0 - 209.227.203.255 cy -209.227.204.0 - 209.227.221.31 us -209.227.221.32 - 209.227.221.63 it -209.227.221.64 - 209.227.221.71 us -209.227.221.72 - 209.227.221.103 it -209.227.221.104 - 209.227.221.255 us -209.227.222.0 - 209.227.222.31 ca -209.227.222.32 - 209.227.222.63 us -209.227.222.64 - 209.227.222.111 ca -209.227.222.112 - 209.227.222.255 us -209.227.223.0 - 209.227.223.7 it -209.227.223.8 - 209.227.223.15 us -209.227.223.16 - 209.227.223.79 it -209.227.223.80 - 209.227.223.95 us -209.227.223.96 - 209.227.223.127 it -209.227.223.128 - 209.227.223.159 us -209.227.223.160 - 209.227.223.175 in -209.227.223.176 - 209.227.223.191 it -209.227.223.192 - 209.227.223.255 ca -209.227.224.0 - 209.227.244.127 us -209.227.244.128 - 209.227.244.159 it -209.227.244.160 - 209.234.242.47 us -209.234.242.48 - 209.234.242.55 ch -209.234.242.56 - 209.234.243.127 us -209.234.243.128 - 209.234.243.191 ca -209.234.243.192 - 209.234.246.143 us -209.234.246.144 - 209.234.246.159 gb -209.234.246.160 - 209.235.255.255 us +209.227.0.0 - 209.227.127.255 us +209.227.128.0 - 209.227.191.255 ca +209.227.192.0 - 209.227.255.255 it +209.228.0.0 - 209.234.247.255 us +209.234.248.0 - 209.234.248.255 sg +209.234.249.0 - 209.235.255.255 us 209.236.0.0 - 209.236.63.255 jm -209.236.64.0 - 209.236.112.9 us -209.236.112.10 - 209.236.112.17 pk -209.236.112.18 - 209.236.112.33 ma -209.236.112.34 - 209.236.112.45 us -209.236.112.46 - 209.236.112.53 ae -209.236.112.54 - 209.236.112.77 us -209.236.112.78 - 209.236.112.85 ae -209.236.112.86 - 209.236.112.93 us -209.236.112.94 - 209.236.112.101 ve -209.236.112.102 - 209.236.112.109 in -209.236.112.110 - 209.236.112.117 ma -209.236.112.118 - 209.236.112.125 ca -209.236.112.126 - 209.236.112.133 ve -209.236.112.134 - 209.236.112.173 us -209.236.112.174 - 209.236.112.181 eg -209.236.112.182 - 209.236.112.185 us -209.236.112.186 - 209.236.112.193 eg -209.236.112.194 - 209.236.112.225 gb -209.236.112.226 - 209.236.113.9 us -209.236.113.10 - 209.236.113.17 eg -209.236.113.18 - 209.236.113.37 us -209.236.113.38 - 209.236.113.45 ae -209.236.113.46 - 209.236.113.53 us -209.236.113.54 - 209.236.113.61 in -209.236.113.62 - 209.236.113.77 us -209.236.113.78 - 209.236.113.85 pe -209.236.113.86 - 209.236.113.93 us -209.236.113.94 - 209.236.113.101 ma -209.236.113.102 - 209.236.113.157 us -209.236.113.158 - 209.236.113.165 gb -209.236.113.166 - 209.236.113.173 us -209.236.113.174 - 209.236.113.217 gb -209.236.113.218 - 209.236.114.9 us -209.236.114.10 - 209.236.114.17 eg -209.236.114.18 - 209.236.114.105 us -209.236.114.106 - 209.236.114.113 in -209.236.114.114 - 209.236.114.121 gb -209.236.114.122 - 209.236.114.129 eg -209.236.114.130 - 209.236.114.157 us -209.236.114.158 - 209.236.114.165 in -209.236.114.166 - 209.236.115.9 us -209.236.115.10 - 209.236.115.17 eg -209.236.115.18 - 209.236.115.41 us -209.236.115.42 - 209.236.115.49 id -209.236.115.50 - 209.236.115.57 us -209.236.115.58 - 209.236.115.65 gr -209.236.115.66 - 209.236.115.81 id -209.236.115.82 - 209.236.115.89 us -209.236.115.90 - 209.236.115.97 eg -209.236.115.98 - 209.236.115.105 us -209.236.115.106 - 209.236.115.121 lk -209.236.115.122 - 209.236.115.153 us -209.236.115.154 - 209.236.115.161 id -209.236.115.162 - 209.236.116.85 us -209.236.116.86 - 209.236.116.93 eg -209.236.116.94 - 209.236.116.101 us -209.236.116.102 - 209.236.116.109 in -209.236.116.110 - 209.236.116.173 us -209.236.116.174 - 209.236.116.181 in -209.236.116.182 - 209.236.117.143 us -209.236.117.144 - 209.236.117.151 eg -209.236.117.152 - 209.236.117.176 us -209.236.117.177 - 209.236.117.184 ma -209.236.117.185 - 209.236.119.206 us -209.236.119.207 - 209.236.119.214 eg -209.236.119.215 - 209.236.120.193 us -209.236.120.194 - 209.236.120.201 ve -209.236.120.202 - 209.236.121.93 us -209.236.121.94 - 209.236.121.109 in -209.236.121.110 - 209.236.122.121 us -209.236.122.122 - 209.236.122.153 eg -209.236.122.154 - 209.236.122.177 us -209.236.122.178 - 209.236.122.193 ca -209.236.122.194 - 209.236.123.115 us -209.236.123.116 - 209.236.123.123 in -209.236.123.124 - 209.236.123.163 us -209.236.123.164 - 209.236.123.171 in -209.236.123.172 - 209.236.124.9 us -209.236.124.10 - 209.236.124.41 eg -209.236.124.42 - 209.236.125.29 us -209.236.125.30 - 209.236.125.37 pk -209.236.125.38 - 209.236.125.99 us -209.236.125.100 - 209.236.125.107 id -209.236.125.108 - 209.236.125.118 us -209.236.125.119 - 209.236.125.126 in -209.236.125.127 - 209.236.125.134 pe -209.236.125.135 - 209.236.125.187 us -209.236.125.188 - 209.236.125.220 eg -209.236.125.221 - 209.236.126.61 us -209.236.126.62 - 209.236.126.69 pe -209.236.126.70 - 209.236.126.73 us -209.236.126.74 - 209.236.126.81 pk -209.236.126.82 - 209.236.126.97 us -209.236.126.98 - 209.236.126.105 lk -209.236.126.106 - 209.236.126.109 us -209.236.126.110 - 209.236.126.113 eg -209.236.126.114 - 209.236.126.115 us -209.236.126.116 - 209.236.126.117 eg -209.236.126.118 - 209.236.126.121 us -209.236.126.122 - 209.236.126.129 sg -209.236.126.130 - 209.236.127.9 us -209.236.127.10 - 209.236.127.100 eg -209.236.127.101 - 209.236.127.108 us -209.236.127.109 - 209.236.127.254 eg -209.236.127.255 - 209.236.235.255 us +209.236.64.0 - 209.236.235.255 us 209.236.236.0 - 209.236.239.255 de -209.236.240.0 - 209.237.75.255 us -209.237.76.0 - 209.237.76.255 a2 -209.237.77.0 - 209.237.231.127 us -209.237.231.128 - 209.237.231.191 fi -209.237.231.192 - 209.237.231.255 ca -209.237.232.0 - 209.237.232.255 us -209.237.233.0 - 209.237.233.31 a1 -209.237.233.32 - 209.237.251.15 us -209.237.251.16 - 209.237.251.31 gb -209.237.251.32 - 209.238.255.255 us +209.236.240.0 - 209.238.255.255 us 209.239.0.0 - 209.239.31.255 ca -209.239.32.0 - 209.239.72.255 us +209.239.32.0 - 209.239.65.255 us +209.239.66.0 - 209.239.67.255 gb +209.239.68.0 - 209.239.68.255 us +209.239.69.0 - 209.239.71.255 gb +209.239.72.0 - 209.239.72.255 us 209.239.73.0 - 209.239.73.255 ly 209.239.74.0 - 209.239.74.255 us -209.239.75.0 - 209.239.77.255 ly +209.239.75.0 - 209.239.75.255 ly +209.239.76.0 - 209.239.76.255 ae +209.239.77.0 - 209.239.77.255 ly 209.239.78.0 - 209.239.78.255 us -209.239.79.0 - 209.239.80.255 ly +209.239.79.0 - 209.239.79.255 ly +209.239.80.0 - 209.239.80.255 ae 209.239.81.0 - 209.239.81.255 aw -209.239.82.0 - 209.239.118.31 us -209.239.118.32 - 209.239.118.63 de -209.239.118.64 - 209.239.118.159 us -209.239.118.160 - 209.239.118.191 br -209.239.118.192 - 209.239.118.255 us -209.239.119.0 - 209.239.119.31 gb -209.239.119.32 - 209.239.119.63 us -209.239.119.64 - 209.239.119.95 tr -209.239.119.96 - 209.239.121.255 us -209.239.122.0 - 209.239.122.63 co -209.239.122.64 - 209.239.122.127 us -209.239.122.128 - 209.239.122.159 ca -209.239.122.160 - 209.239.122.191 bo -209.239.122.192 - 209.239.122.223 br -209.239.122.224 - 209.239.122.255 lk -209.239.123.0 - 209.239.124.31 us -209.239.124.32 - 209.239.124.63 br -209.239.124.64 - 209.239.126.95 us -209.239.126.96 - 209.239.126.127 jp -209.239.126.128 - 209.239.126.135 us +209.239.82.0 - 209.239.86.255 us +209.239.87.0 - 209.239.87.255 gb +209.239.88.0 - 209.239.92.255 us +209.239.93.0 - 209.239.93.255 gb +209.239.94.0 - 209.239.113.126 us +209.239.113.127 - 209.239.113.127 bz +209.239.113.128 - 209.239.113.131 us +209.239.113.132 - 209.239.113.132 bz +209.239.113.133 - 209.239.113.133 us +209.239.113.134 - 209.239.113.134 bz +209.239.113.135 - 209.239.119.146 us +209.239.119.147 - 209.239.119.147 de +209.239.119.148 - 209.239.121.171 us +209.239.121.172 - 209.239.121.172 br +209.239.121.173 - 209.239.126.135 us 209.239.126.136 - 209.239.126.143 de 209.239.126.144 - 209.239.126.159 us 209.239.126.160 - 209.239.126.191 de -209.239.126.192 - 209.239.126.255 us -209.239.127.0 - 209.239.127.31 ir -209.239.127.32 - 209.240.31.255 us +209.239.126.192 - 209.240.31.255 us 209.240.32.0 - 209.240.47.255 bm 209.240.48.0 - 209.240.111.255 us 209.240.112.0 - 209.240.127.255 ca -209.240.128.0 - 209.249.11.167 us -209.249.11.168 - 209.249.11.175 ca -209.249.11.176 - 209.250.127.255 us -209.250.128.0 - 209.250.147.223 ca -209.250.147.224 - 209.250.147.255 in -209.250.148.0 - 209.250.191.255 ca -209.250.192.0 - 209.251.55.255 us +209.240.128.0 - 209.250.127.255 us +209.250.128.0 - 209.250.191.255 ca +209.250.192.0 - 209.251.23.255 us +209.251.24.0 - 209.251.27.255 ca +209.251.28.0 - 209.251.55.255 us 209.251.56.0 - 209.251.59.255 ca 209.251.60.0 - 209.251.195.255 us -209.251.196.0 - 209.251.197.255 gb -209.251.198.0 - 209.255.255.255 us +209.251.196.0 - 209.251.196.255 gb +209.251.197.0 - 209.251.205.255 us +209.251.206.0 - 209.251.206.255 hk +209.251.207.0 - 209.255.255.255 us 210.0.0.0 - 210.0.31.255 au 210.0.32.0 - 210.0.63.255 kr 210.0.64.0 - 210.0.127.255 au @@ -137433,7 +109323,8 @@ 210.1.64.0 - 210.1.143.255 ph 210.1.144.0 - 210.1.191.255 jp 210.1.192.0 - 210.1.223.255 au -210.1.224.0 - 210.1.231.255 my +210.1.224.0 - 210.1.229.255 my +210.1.230.0 - 210.1.231.255 hk 210.1.232.0 - 210.1.235.255 au 210.1.236.0 - 210.1.239.255 jp 210.1.240.0 - 210.1.255.255 bd @@ -137459,202 +109350,92 @@ 210.5.32.0 - 210.5.39.255 au 210.5.40.0 - 210.5.47.255 my 210.5.48.0 - 210.5.55.255 nz -210.5.56.0 - 210.5.127.255 ph +210.5.56.0 - 210.5.63.255 cn +210.5.64.0 - 210.5.127.255 ph 210.5.128.0 - 210.5.159.255 cn -210.5.160.0 - 210.5.193.31 hk -210.5.193.32 - 210.5.193.47 ye -210.5.193.48 - 210.5.193.63 hk -210.5.193.64 - 210.5.193.127 pk -210.5.193.128 - 210.5.193.255 lb -210.5.194.0 - 210.5.195.255 hk -210.5.196.0 - 210.5.196.15 kw -210.5.196.16 - 210.5.196.23 ae -210.5.196.24 - 210.5.196.63 hk -210.5.196.64 - 210.5.196.127 ir -210.5.196.128 - 210.5.197.63 hk -210.5.197.64 - 210.5.197.127 ir -210.5.197.128 - 210.5.198.15 hk -210.5.198.16 - 210.5.198.23 iq -210.5.198.24 - 210.5.198.31 hk -210.5.198.32 - 210.5.198.39 ir -210.5.198.40 - 210.5.198.47 hk -210.5.198.48 - 210.5.198.63 iq -210.5.198.64 - 210.5.198.79 ir -210.5.198.80 - 210.5.198.95 hk -210.5.198.96 - 210.5.198.223 ir -210.5.198.224 - 210.5.198.231 hk -210.5.198.232 - 210.5.198.255 iq -210.5.199.0 - 210.5.199.255 pk -210.5.200.0 - 210.5.203.255 in -210.5.204.0 - 210.5.204.127 ir -210.5.204.128 - 210.5.204.255 pk -210.5.205.0 - 210.5.205.63 ir -210.5.205.64 - 210.5.205.71 hk -210.5.205.72 - 210.5.205.79 ke -210.5.205.80 - 210.5.205.111 iq -210.5.205.112 - 210.5.205.127 lb -210.5.205.128 - 210.5.207.255 pk -210.5.208.0 - 210.5.208.63 ir -210.5.208.64 - 210.5.208.71 hk +210.5.160.0 - 210.5.208.71 hk 210.5.208.72 - 210.5.208.87 pk -210.5.208.88 - 210.5.208.127 hk -210.5.208.128 - 210.5.209.127 ir -210.5.209.128 - 210.5.209.191 pk -210.5.209.192 - 210.5.209.207 in -210.5.209.208 - 210.5.209.215 us -210.5.209.216 - 210.5.209.223 hk -210.5.209.224 - 210.5.209.231 in -210.5.209.232 - 210.5.209.239 hk +210.5.208.88 - 210.5.209.239 hk 210.5.209.240 - 210.5.209.247 pk -210.5.209.248 - 210.5.210.15 hk -210.5.210.16 - 210.5.210.31 iq -210.5.210.32 - 210.5.210.63 hk -210.5.210.64 - 210.5.210.127 iq -210.5.210.128 - 210.5.211.71 pk -210.5.211.72 - 210.5.211.255 hk -210.5.212.0 - 210.5.213.255 pk -210.5.214.0 - 210.5.214.127 tz -210.5.214.128 - 210.5.214.135 ir -210.5.214.136 - 210.5.214.159 iq -210.5.214.160 - 210.5.214.167 kz -210.5.214.168 - 210.5.214.175 us -210.5.214.176 - 210.5.214.191 hk -210.5.214.192 - 210.5.214.255 ir -210.5.215.0 - 210.5.215.127 tz -210.5.215.128 - 210.5.215.255 hk -210.5.216.0 - 210.5.216.255 ae -210.5.217.0 - 210.5.217.255 pk -210.5.218.0 - 210.5.218.63 hk -210.5.218.64 - 210.5.218.255 ir -210.5.219.0 - 210.5.219.255 ae -210.5.220.0 - 210.5.220.255 hk -210.5.221.0 - 210.5.221.7 pk -210.5.221.8 - 210.5.221.15 hk -210.5.221.16 - 210.5.221.31 pk -210.5.221.32 - 210.5.221.255 hk -210.5.222.0 - 210.5.223.255 ae -210.5.224.0 - 210.5.225.255 hk -210.5.226.0 - 210.5.226.255 af -210.5.227.0 - 210.5.231.255 hk -210.5.232.0 - 210.5.232.127 ir -210.5.232.128 - 210.5.232.255 tr -210.5.233.0 - 210.5.233.191 ir -210.5.233.192 - 210.5.233.207 iq -210.5.233.208 - 210.5.233.215 hk -210.5.233.216 - 210.5.233.255 iq -210.5.234.0 - 210.5.235.7 hk -210.5.235.8 - 210.5.235.47 iq -210.5.235.48 - 210.5.235.55 hk -210.5.235.56 - 210.5.235.63 iq -210.5.235.64 - 210.5.235.79 hk -210.5.235.80 - 210.5.235.111 iq -210.5.235.112 - 210.5.235.119 hk -210.5.235.120 - 210.5.235.143 iq -210.5.235.144 - 210.5.235.183 hk -210.5.235.184 - 210.5.235.215 iq -210.5.235.216 - 210.5.236.39 hk -210.5.236.40 - 210.5.236.47 iq -210.5.236.48 - 210.5.236.79 hk -210.5.236.80 - 210.5.236.103 iq -210.5.236.104 - 210.5.236.119 hk -210.5.236.120 - 210.5.236.127 iq -210.5.236.128 - 210.5.236.151 hk -210.5.236.152 - 210.5.236.159 iq -210.5.236.160 - 210.5.236.191 hk -210.5.236.192 - 210.5.236.207 iq -210.5.236.208 - 210.5.236.223 hk -210.5.236.224 - 210.5.236.239 iq -210.5.236.240 - 210.5.236.247 hk -210.5.236.248 - 210.5.236.255 iq -210.5.237.0 - 210.5.238.255 hk -210.5.239.0 - 210.5.239.255 ae -210.5.240.0 - 210.5.241.255 hk -210.5.242.0 - 210.5.243.255 ae -210.5.244.0 - 210.5.245.255 hk -210.5.246.0 - 210.5.247.255 ae -210.5.248.0 - 210.5.248.255 au -210.5.249.0 - 210.5.249.255 hk -210.5.250.0 - 210.5.254.255 au -210.5.255.0 - 210.5.255.255 qa -210.6.0.0 - 210.6.255.255 hk +210.5.209.248 - 210.5.210.127 hk +210.5.210.128 - 210.5.210.255 pk +210.5.211.0 - 210.5.211.7 hk +210.5.211.8 - 210.5.211.47 pk +210.5.211.48 - 210.5.211.63 hk +210.5.211.64 - 210.5.211.71 pk +210.5.211.72 - 210.5.212.255 hk +210.5.213.0 - 210.5.213.255 pk +210.5.214.0 - 210.5.228.255 hk +210.5.229.0 - 210.5.229.255 sa +210.5.230.0 - 210.5.236.255 hk +210.5.237.0 - 210.5.237.255 eu +210.5.238.0 - 210.6.255.255 hk 210.7.0.0 - 210.7.31.255 fj 210.7.32.0 - 210.7.47.255 nz -210.7.48.0 - 210.7.63.255 au +210.7.48.0 - 210.7.55.255 au +210.7.56.0 - 210.7.63.255 cn 210.7.64.0 - 210.7.95.255 in 210.7.96.0 - 210.7.96.175 hk -210.7.96.176 - 210.7.96.191 ap +210.7.96.176 - 210.7.96.191 jp 210.7.96.192 - 210.7.96.255 hk -210.7.97.0 - 210.7.97.31 ap +210.7.97.0 - 210.7.97.31 jp 210.7.97.32 - 210.7.97.63 hk -210.7.97.64 - 210.7.97.127 ap +210.7.97.64 - 210.7.97.127 jp 210.7.97.128 - 210.7.97.255 hk 210.7.98.0 - 210.7.99.255 us -210.7.100.0 - 210.7.101.255 ap +210.7.100.0 - 210.7.101.255 jp 210.7.102.0 - 210.7.102.63 us -210.7.102.64 - 210.7.102.127 ap +210.7.102.64 - 210.7.102.127 jp 210.7.102.128 - 210.7.102.191 us -210.7.102.192 - 210.7.103.191 ap +210.7.102.192 - 210.7.103.191 jp 210.7.103.192 - 210.7.103.199 hk -210.7.103.200 - 210.7.103.255 ap +210.7.103.200 - 210.7.103.255 jp 210.7.104.0 - 210.7.107.255 hk -210.7.108.0 - 210.7.111.255 ap +210.7.108.0 - 210.7.111.255 jp 210.7.112.0 - 210.7.112.15 sg 210.7.112.16 - 210.7.112.23 sn 210.7.112.24 - 210.7.112.63 sg -210.7.112.64 - 210.7.112.87 ap +210.7.112.64 - 210.7.112.87 jp 210.7.112.88 - 210.7.112.127 sg -210.7.112.128 - 210.7.112.255 ap +210.7.112.128 - 210.7.112.255 jp 210.7.113.0 - 210.7.113.63 sg -210.7.113.64 - 210.7.119.127 ap +210.7.113.64 - 210.7.119.127 jp 210.7.119.128 - 210.7.119.143 sg -210.7.119.144 - 210.7.119.175 ap +210.7.119.144 - 210.7.119.175 jp 210.7.119.176 - 210.7.119.207 sg -210.7.119.208 - 210.7.119.215 ap +210.7.119.208 - 210.7.119.215 jp 210.7.119.216 - 210.7.119.255 sg 210.7.120.0 - 210.7.120.7 hk -210.7.120.8 - 210.7.127.255 ap +210.7.120.8 - 210.7.127.255 jp 210.7.128.0 - 210.7.128.159 au -210.7.128.160 - 210.7.128.191 ap +210.7.128.160 - 210.7.128.191 jp 210.7.128.192 - 210.7.128.223 au -210.7.128.224 - 210.7.128.239 ap +210.7.128.224 - 210.7.128.239 jp 210.7.128.240 - 210.7.128.255 au 210.7.129.0 - 210.7.131.255 gb 210.7.132.0 - 210.7.132.255 au -210.7.133.0 - 210.7.133.127 ap +210.7.133.0 - 210.7.133.127 jp 210.7.133.128 - 210.7.133.159 au -210.7.133.160 - 210.7.133.191 ap +210.7.133.160 - 210.7.133.191 jp 210.7.133.192 - 210.7.133.255 au -210.7.134.0 - 210.7.135.255 ap +210.7.134.0 - 210.7.135.255 jp 210.7.136.0 - 210.7.136.47 au -210.7.136.48 - 210.7.136.63 ap +210.7.136.48 - 210.7.136.63 jp 210.7.136.64 - 210.7.136.255 au -210.7.137.0 - 210.7.151.255 ap +210.7.137.0 - 210.7.151.255 jp 210.7.152.0 - 210.7.152.111 au -210.7.152.112 - 210.7.152.255 ap -210.7.153.0 - 210.7.153.255 nl -210.7.154.0 - 210.7.155.255 ap +210.7.152.112 - 210.7.155.255 jp 210.7.156.0 - 210.7.158.159 au -210.7.158.160 - 210.7.158.239 ap +210.7.158.160 - 210.7.158.239 jp 210.7.158.240 - 210.7.159.127 au 210.7.159.128 - 210.7.159.191 gb -210.7.159.192 - 210.7.159.215 ap +210.7.159.192 - 210.7.159.215 jp 210.7.159.216 - 210.7.159.255 au -210.7.160.0 - 210.7.191.255 ap +210.7.160.0 - 210.7.191.255 jp 210.7.192.0 - 210.7.199.255 us -210.7.200.0 - 210.7.223.255 ap -210.7.224.0 - 210.7.224.47 jp -210.7.224.48 - 210.7.224.63 ap -210.7.224.64 - 210.7.224.111 jp -210.7.224.112 - 210.7.224.127 ap -210.7.224.128 - 210.7.224.159 jp -210.7.224.160 - 210.7.247.255 ap +210.7.200.0 - 210.7.247.255 jp 210.7.248.0 - 210.7.249.255 us -210.7.250.0 - 210.7.253.255 ap -210.7.254.0 - 210.7.255.63 jp -210.7.255.64 - 210.7.255.127 ap -210.7.255.128 - 210.7.255.159 jp -210.7.255.160 - 210.7.255.183 ap -210.7.255.184 - 210.7.255.255 jp +210.7.250.0 - 210.7.255.255 jp 210.8.0.0 - 210.11.255.255 au 210.12.0.0 - 210.13.255.255 cn 210.14.0.0 - 210.14.47.255 ph @@ -137667,7 +109448,16 @@ 210.16.10.0 - 210.16.10.255 sg 210.16.11.0 - 210.16.39.255 ph 210.16.40.0 - 210.16.40.255 sg -210.16.41.0 - 210.16.127.255 ph +210.16.41.0 - 210.16.63.255 ph +210.16.64.0 - 210.16.67.255 jp +210.16.68.0 - 210.16.71.255 au +210.16.72.0 - 210.16.95.255 in +210.16.96.0 - 210.16.99.255 hk +210.16.100.0 - 210.16.103.255 in +210.16.104.0 - 210.16.107.255 cn +210.16.108.0 - 210.16.119.255 in +210.16.120.0 - 210.16.123.255 sg +210.16.124.0 - 210.16.127.255 ph 210.16.128.0 - 210.16.191.255 cn 210.16.192.0 - 210.16.255.255 kr 210.17.0.0 - 210.17.127.255 tw @@ -137680,17 +109470,104 @@ 210.23.0.0 - 210.23.31.255 sg 210.23.32.0 - 210.23.63.255 cn 210.23.64.0 - 210.23.79.255 id -210.23.80.0 - 210.23.95.255 mp +210.23.80.0 - 210.23.89.255 mp +210.23.90.0 - 210.23.90.255 gu +210.23.91.0 - 210.23.95.255 mp 210.23.96.0 - 210.23.127.255 ph 210.23.128.0 - 210.23.159.255 au 210.23.160.0 - 210.23.230.223 ph 210.23.230.224 - 210.23.230.255 sg 210.23.231.0 - 210.23.255.255 ph -210.24.0.0 - 210.24.255.255 sg +210.24.0.0 - 210.24.7.255 sg +210.24.8.0 - 210.24.23.255 jp +210.24.24.0 - 210.24.47.255 sg +210.24.48.0 - 210.24.48.255 jp +210.24.49.0 - 210.24.49.255 sg +210.24.50.0 - 210.24.51.255 jp +210.24.52.0 - 210.24.52.255 sg +210.24.53.0 - 210.24.53.255 jp +210.24.54.0 - 210.24.54.255 sg +210.24.55.0 - 210.24.55.255 jp +210.24.56.0 - 210.24.64.255 sg +210.24.65.0 - 210.24.81.255 jp +210.24.82.0 - 210.24.83.255 sg +210.24.84.0 - 210.24.85.255 jp +210.24.86.0 - 210.24.86.255 sg +210.24.87.0 - 210.24.95.255 jp +210.24.96.0 - 210.24.129.255 sg +210.24.130.0 - 210.24.132.255 jp +210.24.133.0 - 210.24.133.255 sg +210.24.134.0 - 210.24.134.255 jp +210.24.135.0 - 210.24.138.255 sg +210.24.139.0 - 210.24.139.223 jp +210.24.139.224 - 210.24.140.255 sg +210.24.141.0 - 210.24.141.255 jp +210.24.142.0 - 210.24.142.255 sg +210.24.143.0 - 210.24.144.255 jp +210.24.145.0 - 210.24.146.255 sg +210.24.147.0 - 210.24.148.255 jp +210.24.149.0 - 210.24.150.255 sg +210.24.151.0 - 210.24.153.63 jp +210.24.153.64 - 210.24.153.79 sg +210.24.153.80 - 210.24.155.255 jp +210.24.156.0 - 210.24.156.255 sg +210.24.157.0 - 210.24.159.255 jp +210.24.160.0 - 210.24.160.255 sg +210.24.161.0 - 210.24.161.255 jp +210.24.162.0 - 210.24.163.255 sg +210.24.164.0 - 210.24.164.255 jp +210.24.165.0 - 210.24.165.255 sg +210.24.166.0 - 210.24.166.255 jp +210.24.167.0 - 210.24.168.255 sg +210.24.169.0 - 210.24.169.255 jp +210.24.170.0 - 210.24.172.255 sg +210.24.173.0 - 210.24.173.255 jp +210.24.174.0 - 210.24.174.255 sg +210.24.175.0 - 210.24.184.255 jp +210.24.185.0 - 210.24.185.255 sg +210.24.186.0 - 210.24.186.255 jp +210.24.187.0 - 210.24.187.255 sg +210.24.188.0 - 210.24.188.255 jp +210.24.189.0 - 210.24.190.255 sg +210.24.191.0 - 210.24.191.255 jp +210.24.192.0 - 210.24.192.255 sg +210.24.193.0 - 210.24.196.255 jp +210.24.197.0 - 210.24.198.255 sg +210.24.199.0 - 210.24.201.255 jp +210.24.202.0 - 210.24.203.255 sg +210.24.204.0 - 210.24.204.255 jp +210.24.205.0 - 210.24.205.255 sg +210.24.206.0 - 210.24.207.255 jp +210.24.208.0 - 210.24.212.255 sg +210.24.213.0 - 210.24.213.255 jp +210.24.214.0 - 210.24.214.255 sg +210.24.215.0 - 210.24.215.255 jp +210.24.216.0 - 210.24.216.255 sg +210.24.217.0 - 210.24.217.255 jp +210.24.218.0 - 210.24.219.255 sg +210.24.220.0 - 210.24.223.255 jp +210.24.224.0 - 210.24.224.255 sg +210.24.225.0 - 210.24.225.255 jp +210.24.226.0 - 210.24.226.255 sg +210.24.227.0 - 210.24.227.255 jp +210.24.228.0 - 210.24.230.255 sg +210.24.231.0 - 210.24.231.255 jp +210.24.232.0 - 210.24.232.255 sg +210.24.233.0 - 210.24.233.255 jp +210.24.234.0 - 210.24.234.255 sg +210.24.235.0 - 210.24.235.255 jp +210.24.236.0 - 210.24.238.255 sg +210.24.239.0 - 210.24.239.255 jp +210.24.240.0 - 210.24.240.255 sg +210.24.241.0 - 210.24.241.255 jp +210.24.242.0 - 210.24.242.255 sg +210.24.243.0 - 210.24.243.255 jp +210.24.244.0 - 210.24.246.255 sg +210.24.247.0 - 210.24.255.255 jp 210.25.0.0 - 210.47.255.255 cn 210.48.0.0 - 210.48.127.255 nz 210.48.128.0 - 210.48.135.255 jp -210.48.136.0 - 210.48.143.255 kh +210.48.136.0 - 210.48.143.255 hk 210.48.144.0 - 210.48.159.255 my 210.48.160.0 - 210.48.191.255 nz 210.48.192.0 - 210.48.207.255 my @@ -137698,7 +109575,9 @@ 210.48.216.0 - 210.48.223.255 my 210.48.224.0 - 210.48.255.255 jp 210.49.0.0 - 210.50.255.255 au -210.51.0.0 - 210.53.255.255 cn +210.51.0.0 - 210.52.108.255 cn +210.52.109.0 - 210.52.109.255 kp +210.52.110.0 - 210.53.255.255 cn 210.54.0.0 - 210.55.255.255 nz 210.56.0.0 - 210.56.31.255 pk 210.56.32.0 - 210.56.47.255 nz @@ -137706,12 +109585,14 @@ 210.56.64.0 - 210.56.95.255 au 210.56.96.0 - 210.56.127.255 in 210.56.128.0 - 210.56.143.255 sg -210.56.144.0 - 210.56.151.255 bd +210.56.144.0 - 210.56.151.255 in 210.56.152.0 - 210.56.159.255 au 210.56.160.0 - 210.56.191.255 jp 210.56.192.0 - 210.56.223.255 cn 210.56.224.0 - 210.56.255.255 au -210.57.0.0 - 210.57.207.255 jp +210.57.0.0 - 210.57.199.255 jp +210.57.200.0 - 210.57.205.255 in +210.57.206.0 - 210.57.207.255 jp 210.57.208.0 - 210.57.223.255 id 210.57.224.0 - 210.57.255.255 kr 210.58.0.0 - 210.71.255.255 tw @@ -137722,24 +109603,16 @@ 210.79.48.0 - 210.79.55.255 nz 210.79.56.0 - 210.79.63.255 au 210.79.64.0 - 210.79.127.255 cn -210.79.128.0 - 210.79.207.255 jp +210.79.192.0 - 210.79.207.255 jp 210.79.208.0 - 210.79.223.255 id 210.79.224.0 - 210.79.255.255 cn -210.80.0.0 - 210.80.9.31 ap -210.80.9.32 - 210.80.9.47 au -210.80.9.48 - 210.80.25.255 ap -210.80.26.0 - 210.80.26.255 hk -210.80.27.0 - 210.80.45.255 ap -210.80.46.0 - 210.80.46.255 au -210.80.47.0 - 210.80.63.255 ap +210.80.0.0 - 210.80.63.255 ap 210.80.64.0 - 210.80.95.255 tw 210.80.96.0 - 210.80.127.255 kr -210.80.128.0 - 210.80.182.175 au -210.80.182.176 - 210.80.182.191 hk -210.80.182.192 - 210.80.188.175 au -210.80.188.176 - 210.80.188.191 nz -210.80.188.192 - 210.80.191.255 au -210.80.192.0 - 210.81.255.255 jp +210.80.128.0 - 210.80.191.255 au +210.80.192.0 - 210.81.206.255 jp +210.81.207.0 - 210.81.207.255 ap +210.81.208.0 - 210.81.255.255 jp 210.82.0.0 - 210.83.255.255 cn 210.84.0.0 - 210.84.255.255 au 210.85.0.0 - 210.85.255.255 tw @@ -137751,9 +109624,7 @@ 210.87.192.0 - 210.87.223.255 kr 210.87.224.0 - 210.87.239.255 jp 210.87.240.0 - 210.87.255.255 hk -210.88.0.0 - 210.88.111.191 jp -210.88.111.192 - 210.88.111.207 nz -210.88.111.208 - 210.89.31.255 jp +210.88.0.0 - 210.89.31.255 jp 210.89.32.0 - 210.89.63.255 in 210.89.64.0 - 210.89.95.255 hk 210.89.96.0 - 210.89.127.255 jp @@ -137761,14 +109632,32 @@ 210.89.160.0 - 210.89.191.255 kr 210.89.192.0 - 210.89.255.255 jp 210.90.0.0 - 210.127.255.255 kr -210.128.0.0 - 210.175.255.255 jp -210.176.0.0 - 210.176.32.31 hk -210.176.32.32 - 210.176.32.63 in -210.176.32.64 - 210.176.32.95 hk -210.176.32.96 - 210.176.44.63 in -210.176.44.64 - 210.176.44.159 hk -210.176.44.160 - 210.176.47.255 in -210.176.48.0 - 210.177.255.255 hk +210.128.0.0 - 210.138.122.255 jp +210.138.123.0 - 210.138.123.255 gb +210.138.124.0 - 210.148.56.255 jp +210.148.57.0 - 210.148.57.255 ap +210.148.58.0 - 210.175.255.255 jp +210.176.0.0 - 210.176.31.255 hk +210.176.32.0 - 210.176.32.255 au +210.176.33.0 - 210.176.33.3 jp +210.176.33.4 - 210.176.35.255 au +210.176.36.0 - 210.176.36.15 ph +210.176.36.16 - 210.176.36.63 au +210.176.36.64 - 210.176.36.127 ph +210.176.36.128 - 210.176.36.255 au +210.176.37.0 - 210.176.37.15 jp +210.176.37.16 - 210.176.41.255 au +210.176.42.0 - 210.176.43.255 nz +210.176.44.0 - 210.176.47.255 au +210.176.48.0 - 210.176.54.255 hk +210.176.55.0 - 210.176.55.255 ap +210.176.56.0 - 210.176.146.255 hk +210.176.147.0 - 210.176.147.255 th +210.176.148.0 - 210.177.188.83 hk +210.177.188.84 - 210.177.188.84 cn +210.177.188.85 - 210.177.204.255 hk +210.177.205.0 - 210.177.205.255 ap +210.177.206.0 - 210.177.255.255 hk 210.178.0.0 - 210.183.255.255 kr 210.184.0.0 - 210.184.255.255 hk 210.185.0.0 - 210.185.63.255 nz @@ -137784,10 +109673,16 @@ 210.192.128.0 - 210.192.255.255 tw 210.193.0.0 - 210.193.63.255 sg 210.193.64.0 - 210.193.127.255 jp -210.193.128.0 - 210.193.255.255 au +210.193.128.0 - 210.193.163.255 au +210.193.164.0 - 210.193.164.255 us +210.193.165.0 - 210.193.179.255 au +210.193.180.0 - 210.193.180.255 us +210.193.181.0 - 210.193.255.255 au 210.194.0.0 - 210.194.255.255 jp 210.195.0.0 - 210.195.255.255 my -210.196.0.0 - 210.199.255.255 jp +210.196.0.0 - 210.197.127.255 jp +210.197.128.0 - 210.197.128.255 us +210.197.129.0 - 210.199.255.255 jp 210.200.0.0 - 210.203.127.255 tw 210.203.128.0 - 210.203.191.255 th 210.203.192.0 - 210.203.255.255 jp @@ -137807,8 +109702,12 @@ 210.213.0.0 - 210.213.63.255 th 210.213.64.0 - 210.213.255.255 ph 210.214.0.0 - 210.214.255.255 in -210.215.0.0 - 210.215.255.255 au -210.216.0.0 - 210.223.255.255 kr +210.215.0.0 - 210.215.77.255 au +210.215.78.0 - 210.215.78.255 ap +210.215.79.0 - 210.215.255.255 au +210.216.0.0 - 210.216.56.255 kr +210.216.57.0 - 210.216.58.255 us +210.216.59.0 - 210.223.255.255 kr 210.224.0.0 - 210.239.255.255 jp 210.240.0.0 - 210.244.255.255 tw 210.245.0.0 - 210.245.127.255 vn @@ -137818,37 +109717,37 @@ 210.247.0.0 - 210.247.127.255 jp 210.247.128.0 - 210.247.239.255 au 210.247.240.0 - 210.247.255.255 id -210.248.0.0 - 211.19.255.255 jp +210.248.0.0 - 210.248.163.255 jp +210.248.164.0 - 210.248.164.255 ap +210.248.165.0 - 211.19.255.255 jp 211.20.0.0 - 211.23.255.255 tw 211.24.0.0 - 211.25.255.255 my 211.26.0.0 - 211.31.255.255 au -211.32.0.0 - 211.63.255.255 kr +211.32.0.0 - 211.43.143.255 kr +211.43.144.0 - 211.43.159.255 us +211.43.160.0 - 211.63.255.255 kr 211.64.0.0 - 211.71.255.255 cn 211.72.0.0 - 211.79.255.255 tw 211.80.0.0 - 211.103.255.255 cn 211.104.0.0 - 211.119.255.255 kr -211.120.0.0 - 211.135.255.255 jp +211.120.0.0 - 211.120.231.255 jp +211.120.232.0 - 211.120.232.255 us +211.120.233.0 - 211.125.91.255 jp +211.125.92.0 - 211.125.93.255 us +211.125.94.0 - 211.135.255.255 jp 211.136.0.0 - 211.167.255.255 cn 211.168.0.0 - 211.255.255.255 kr -212.0.0.0 - 212.0.17.255 de -212.0.18.0 - 212.0.63.255 eu +212.0.0.0 - 212.0.15.255 de +212.0.16.0 - 212.0.63.255 eu 212.0.64.0 - 212.0.95.255 ru -212.0.96.0 - 212.0.109.71 es -212.0.109.72 - 212.0.109.79 gb -212.0.109.80 - 212.0.109.143 es -212.0.109.144 - 212.0.109.151 pt -212.0.109.152 - 212.0.118.79 es -212.0.118.80 - 212.0.118.87 fr -212.0.118.88 - 212.0.121.31 es -212.0.121.32 - 212.0.121.39 fr -212.0.121.40 - 212.0.127.255 es +212.0.96.0 - 212.0.127.255 es 212.0.128.0 - 212.0.159.255 sd 212.0.160.0 - 212.0.191.255 pt 212.0.192.0 - 212.0.223.255 md -212.0.224.0 - 212.1.31.255 nl -212.1.32.0 - 212.1.49.63 de -212.1.49.64 - 212.1.49.95 us -212.1.49.96 - 212.1.63.255 de +212.0.224.0 - 212.1.9.255 nl +212.1.10.0 - 212.1.10.255 eu +212.1.11.0 - 212.1.31.255 nl +212.1.32.0 - 212.1.63.255 de 212.1.64.0 - 212.1.127.255 ua 212.1.128.0 - 212.1.159.255 gb 212.1.160.0 - 212.1.191.255 nl @@ -137866,72 +109765,25 @@ 212.2.224.0 - 212.2.255.255 kg 212.3.0.0 - 212.3.31.255 se 212.3.32.0 - 212.3.63.255 es -212.3.64.0 - 212.3.71.47 de -212.3.71.48 - 212.3.71.63 fr -212.3.71.64 - 212.3.71.71 de -212.3.71.72 - 212.3.71.75 fr -212.3.71.76 - 212.3.71.79 de -212.3.71.80 - 212.3.71.143 fr -212.3.71.144 - 212.3.73.31 de -212.3.73.32 - 212.3.73.47 es -212.3.73.48 - 212.3.73.119 de -212.3.73.120 - 212.3.73.127 es -212.3.73.128 - 212.3.75.63 de -212.3.75.64 - 212.3.75.71 hu -212.3.75.72 - 212.3.95.255 de +212.3.64.0 - 212.3.95.255 de 212.3.96.0 - 212.3.127.255 ua 212.3.128.0 - 212.3.159.255 ru 212.3.160.0 - 212.3.191.255 it 212.3.192.0 - 212.3.223.255 de -212.3.224.0 - 212.3.224.135 be -212.3.224.136 - 212.3.224.159 gb -212.3.224.160 - 212.3.224.255 be -212.3.225.0 - 212.3.225.255 gb -212.3.226.0 - 212.3.227.255 be -212.3.228.0 - 212.3.231.255 gb -212.3.232.0 - 212.3.232.255 be -212.3.233.0 - 212.3.233.255 gb -212.3.234.0 - 212.3.235.255 be -212.3.236.0 - 212.3.236.255 gb -212.3.237.0 - 212.3.239.255 be -212.3.240.0 - 212.3.240.23 gb -212.3.240.24 - 212.3.240.31 be -212.3.240.32 - 212.3.240.47 gb -212.3.240.48 - 212.3.240.191 be -212.3.240.192 - 212.3.240.223 gb -212.3.240.224 - 212.3.240.255 be -212.3.241.0 - 212.3.241.255 gb -212.3.242.0 - 212.3.243.127 be -212.3.243.128 - 212.3.243.191 gb -212.3.243.192 - 212.3.244.47 be -212.3.244.48 - 212.3.244.63 gb -212.3.244.64 - 212.3.244.195 be -212.3.244.196 - 212.3.244.207 gb -212.3.244.208 - 212.3.247.255 be -212.3.248.0 - 212.3.248.63 gb -212.3.248.64 - 212.3.248.191 be -212.3.248.192 - 212.3.248.255 gb -212.3.249.0 - 212.3.251.63 be -212.3.251.64 - 212.3.251.95 gb -212.3.251.96 - 212.3.251.111 be -212.3.251.112 - 212.3.251.127 gb -212.3.251.128 - 212.3.255.127 be -212.3.255.128 - 212.3.255.255 gb -212.4.0.0 - 212.4.6.103 it -212.4.6.104 - 212.4.6.111 gb -212.4.6.112 - 212.4.31.255 it +212.3.224.0 - 212.3.237.255 gb +212.3.238.0 - 212.3.238.255 be +212.3.239.0 - 212.3.239.255 gb +212.3.240.0 - 212.3.240.255 be +212.3.241.0 - 212.3.242.63 gb +212.3.242.64 - 212.3.242.127 be +212.3.242.128 - 212.3.255.255 gb +212.4.0.0 - 212.4.31.255 it 212.4.32.0 - 212.4.63.255 no 212.4.64.0 - 212.4.95.255 ch 212.4.96.0 - 212.4.127.255 es 212.4.128.0 - 212.4.159.255 cz 212.4.160.0 - 212.4.191.255 de -212.4.192.0 - 212.4.211.63 nl -212.4.211.64 - 212.4.211.95 de -212.4.211.96 - 212.4.211.127 gb -212.4.211.128 - 212.4.213.255 nl -212.4.214.0 - 212.4.214.63 ch -212.4.214.64 - 212.4.214.127 it -212.4.214.128 - 212.4.223.255 nl +212.4.192.0 - 212.4.223.255 nl 212.4.224.0 - 212.5.31.255 de 212.5.32.0 - 212.5.63.255 bg 212.5.64.0 - 212.5.127.255 ru @@ -137939,215 +109791,49 @@ 212.5.160.0 - 212.5.191.255 ru 212.5.192.0 - 212.5.223.255 sk 212.5.224.0 - 212.6.31.255 ru -212.6.32.0 - 212.6.36.255 a2 -212.6.37.0 - 212.6.38.255 ir -212.6.39.0 - 212.6.40.255 iq -212.6.41.0 - 212.6.41.127 ir -212.6.41.128 - 212.6.41.191 iq -212.6.41.192 - 212.6.41.199 ae -212.6.41.200 - 212.6.41.255 a2 -212.6.42.0 - 212.6.42.255 ir -212.6.43.0 - 212.6.44.255 a2 -212.6.45.0 - 212.6.45.255 ir -212.6.46.0 - 212.6.46.255 ae -212.6.47.0 - 212.6.50.255 ir -212.6.51.0 - 212.6.52.255 a2 -212.6.53.0 - 212.6.53.43 ne -212.6.53.44 - 212.6.53.255 a2 -212.6.54.0 - 212.6.54.191 iq -212.6.54.192 - 212.6.55.111 a2 -212.6.55.112 - 212.6.55.127 ir -212.6.55.128 - 212.6.55.255 a2 -212.6.56.0 - 212.6.56.255 it -212.6.57.0 - 212.6.62.255 a2 -212.6.63.0 - 212.6.63.255 it -212.6.64.0 - 212.6.196.167 de -212.6.196.168 - 212.6.196.175 us -212.6.196.176 - 212.6.255.255 de +212.6.32.0 - 212.6.63.255 a2 +212.6.64.0 - 212.6.255.255 de 212.7.0.0 - 212.7.31.255 ee 212.7.32.0 - 212.7.63.255 es 212.7.64.0 - 212.7.95.255 it 212.7.96.0 - 212.7.127.255 ru 212.7.128.0 - 212.7.191.255 de -212.7.192.0 - 212.7.195.246 nl -212.7.195.247 - 212.7.195.250 ch -212.7.195.251 - 212.7.202.78 nl -212.7.202.79 - 212.7.202.80 in -212.7.202.81 - 212.7.223.255 nl +212.7.192.0 - 212.7.199.255 nl +212.7.200.0 - 212.7.201.255 us +212.7.202.0 - 212.7.202.255 de +212.7.203.0 - 212.7.215.255 nl +212.7.216.0 - 212.7.220.255 pl +212.7.221.0 - 212.7.223.255 nl 212.7.224.0 - 212.7.255.255 ru 212.8.0.0 - 212.8.31.255 de 212.8.32.0 - 212.8.63.255 ua 212.8.64.0 - 212.8.127.255 es 212.8.128.0 - 212.8.159.255 de -212.8.160.0 - 212.8.161.15 be -212.8.161.16 - 212.8.161.31 eu -212.8.161.32 - 212.8.161.95 be -212.8.161.96 - 212.8.161.159 eu -212.8.161.160 - 212.8.163.143 be -212.8.163.144 - 212.8.163.159 lu -212.8.163.160 - 212.8.163.255 be -212.8.164.0 - 212.8.164.63 eu -212.8.164.64 - 212.8.164.127 be -212.8.164.128 - 212.8.164.191 eu -212.8.164.192 - 212.8.164.255 be -212.8.165.0 - 212.8.165.255 eu -212.8.166.0 - 212.8.166.255 be -212.8.167.0 - 212.8.171.255 eu -212.8.172.0 - 212.8.172.255 be -212.8.173.0 - 212.8.173.127 eu -212.8.173.128 - 212.8.173.247 be -212.8.173.248 - 212.8.173.255 eu -212.8.174.0 - 212.8.176.39 be -212.8.176.40 - 212.8.176.47 eu -212.8.176.48 - 212.8.176.55 be -212.8.176.56 - 212.8.176.79 eu -212.8.176.80 - 212.8.176.87 be -212.8.176.88 - 212.8.176.103 eu -212.8.176.104 - 212.8.176.111 be -212.8.176.112 - 212.8.176.123 eu -212.8.176.124 - 212.8.176.131 be -212.8.176.132 - 212.8.176.135 eu -212.8.176.136 - 212.8.179.255 be -212.8.180.0 - 212.8.180.31 eu -212.8.180.32 - 212.8.182.255 be -212.8.183.0 - 212.8.183.255 eu -212.8.184.0 - 212.8.185.87 be -212.8.185.88 - 212.8.185.95 eu -212.8.185.96 - 212.8.185.111 be -212.8.185.112 - 212.8.185.119 eu -212.8.185.120 - 212.8.185.127 be -212.8.185.128 - 212.8.185.223 eu -212.8.185.224 - 212.8.185.255 be -212.8.186.0 - 212.8.186.255 eu -212.8.187.0 - 212.8.189.47 be -212.8.189.48 - 212.8.189.63 eu -212.8.189.64 - 212.8.189.79 be -212.8.189.80 - 212.8.189.95 eu -212.8.189.96 - 212.8.189.159 be -212.8.189.160 - 212.8.189.255 eu -212.8.190.0 - 212.8.191.255 be +212.8.160.0 - 212.8.180.127 eu +212.8.180.128 - 212.8.182.255 be +212.8.183.0 - 212.8.191.255 eu 212.8.192.0 - 212.8.223.255 de 212.8.224.0 - 212.8.255.255 ru -212.9.0.0 - 212.9.0.31 gb -212.9.0.32 - 212.9.0.39 je -212.9.0.40 - 212.9.0.55 gb -212.9.0.56 - 212.9.0.79 je -212.9.0.80 - 212.9.0.87 gb -212.9.0.88 - 212.9.0.255 je -212.9.1.0 - 212.9.1.183 gb -212.9.1.184 - 212.9.1.191 je -212.9.1.192 - 212.9.3.22 gb -212.9.3.23 - 212.9.3.23 je -212.9.3.24 - 212.9.3.31 gb -212.9.3.32 - 212.9.3.47 je -212.9.3.48 - 212.9.3.87 gb -212.9.3.88 - 212.9.3.103 je -212.9.3.104 - 212.9.3.111 gb -212.9.3.112 - 212.9.3.143 je -212.9.3.144 - 212.9.3.151 gb -212.9.3.152 - 212.9.3.159 je -212.9.3.160 - 212.9.3.175 gb -212.9.3.176 - 212.9.3.191 je -212.9.3.192 - 212.9.4.40 gb -212.9.4.41 - 212.9.4.47 je -212.9.4.48 - 212.9.5.31 gb -212.9.5.32 - 212.9.5.47 je -212.9.5.48 - 212.9.5.63 gb -212.9.5.64 - 212.9.5.71 je -212.9.5.72 - 212.9.5.159 gb -212.9.5.160 - 212.9.5.191 je -212.9.5.192 - 212.9.6.7 gb -212.9.6.8 - 212.9.6.15 je -212.9.6.16 - 212.9.6.31 gb -212.9.6.32 - 212.9.6.63 je -212.9.6.64 - 212.9.6.95 gb -212.9.6.96 - 212.9.6.127 je -212.9.6.128 - 212.9.6.223 gb -212.9.6.224 - 212.9.6.239 je -212.9.6.240 - 212.9.7.7 gb -212.9.7.8 - 212.9.7.15 je -212.9.7.16 - 212.9.7.199 gb -212.9.7.200 - 212.9.7.207 je -212.9.7.208 - 212.9.7.255 gb -212.9.8.0 - 212.9.9.63 je -212.9.9.64 - 212.9.9.127 gb -212.9.9.128 - 212.9.10.255 je -212.9.11.0 - 212.9.11.255 gb -212.9.12.0 - 212.9.13.255 je -212.9.14.0 - 212.9.15.15 gb -212.9.15.16 - 212.9.15.23 je -212.9.15.24 - 212.9.15.199 gb -212.9.15.200 - 212.9.15.207 je -212.9.15.208 - 212.9.15.215 gb -212.9.15.216 - 212.9.15.223 je -212.9.15.224 - 212.9.17.135 gb -212.9.17.136 - 212.9.17.139 je -212.9.17.140 - 212.9.17.219 gb -212.9.17.220 - 212.9.17.231 je -212.9.17.232 - 212.9.18.255 gb -212.9.19.0 - 212.9.19.15 je -212.9.19.16 - 212.9.19.47 gb -212.9.19.48 - 212.9.19.79 je -212.9.19.80 - 212.9.19.95 gb -212.9.19.96 - 212.9.19.127 je -212.9.19.128 - 212.9.19.151 gb -212.9.19.152 - 212.9.19.159 je -212.9.19.160 - 212.9.19.223 gb -212.9.19.224 - 212.9.19.239 je -212.9.19.240 - 212.9.19.247 gb -212.9.19.248 - 212.9.19.255 je -212.9.20.0 - 212.9.20.15 gb -212.9.20.16 - 212.9.20.23 je -212.9.20.24 - 212.9.20.55 gb -212.9.20.56 - 212.9.20.111 je -212.9.20.112 - 212.9.20.159 gb -212.9.20.160 - 212.9.20.191 je -212.9.20.192 - 212.9.20.223 gb -212.9.20.224 - 212.9.20.255 je -212.9.21.0 - 212.9.21.95 gb -212.9.21.96 - 212.9.21.111 je -212.9.21.112 - 212.9.21.119 gb -212.9.21.120 - 212.9.21.127 je -212.9.21.128 - 212.9.21.191 gb -212.9.21.192 - 212.9.22.127 je -212.9.22.128 - 212.9.22.175 gb -212.9.22.176 - 212.9.22.255 je -212.9.23.0 - 212.9.23.7 gb -212.9.23.8 - 212.9.23.15 je -212.9.23.16 - 212.9.23.47 gb -212.9.23.48 - 212.9.23.63 je -212.9.23.64 - 212.9.23.127 gb -212.9.23.128 - 212.9.23.191 je -212.9.23.192 - 212.9.24.47 gb -212.9.24.48 - 212.9.24.63 je -212.9.24.64 - 212.9.24.87 gb -212.9.24.88 - 212.9.24.111 je -212.9.24.112 - 212.9.24.127 gb -212.9.24.128 - 212.9.24.135 je -212.9.24.136 - 212.9.24.151 gb -212.9.24.152 - 212.9.24.159 je -212.9.24.160 - 212.9.24.167 gb -212.9.24.168 - 212.9.24.255 je -212.9.25.0 - 212.9.25.39 gb -212.9.25.40 - 212.9.25.47 je -212.9.25.48 - 212.9.25.247 gb -212.9.25.248 - 212.9.25.255 je -212.9.26.0 - 212.9.31.255 gb +212.9.0.0 - 212.9.1.119 je +212.9.1.120 - 212.9.1.127 gb +212.9.1.128 - 212.9.1.175 je +212.9.1.176 - 212.9.1.183 gb +212.9.1.184 - 212.9.1.255 je +212.9.2.0 - 212.9.2.7 gb +212.9.2.8 - 212.9.2.135 je +212.9.2.136 - 212.9.2.143 gb +212.9.2.144 - 212.9.24.31 je +212.9.24.32 - 212.9.24.39 gb +212.9.24.40 - 212.9.31.255 je 212.9.32.0 - 212.9.63.255 de 212.9.64.0 - 212.9.95.255 es 212.9.96.0 - 212.9.127.255 gb 212.9.128.0 - 212.9.159.255 at -212.9.160.0 - 212.9.176.31 de -212.9.176.32 - 212.9.176.47 ch -212.9.176.48 - 212.9.176.63 de -212.9.176.64 - 212.9.176.127 ch -212.9.176.128 - 212.9.191.255 de +212.9.160.0 - 212.9.191.255 de 212.9.192.0 - 212.9.223.255 gb 212.9.224.0 - 212.9.255.255 ua 212.10.0.0 - 212.10.255.255 dk -212.11.0.0 - 212.11.26.87 fr -212.11.26.88 - 212.11.26.95 a2 -212.11.26.96 - 212.11.63.255 fr +212.11.0.0 - 212.11.63.255 fr 212.11.64.0 - 212.11.95.255 gb 212.11.96.0 - 212.11.127.255 cz 212.11.128.0 - 212.11.159.255 ru @@ -138155,25 +109841,11 @@ 212.11.192.0 - 212.11.223.255 sy 212.11.224.0 - 212.11.255.255 de 212.12.0.0 - 212.12.31.255 ru -212.12.32.0 - 212.12.55.15 de -212.12.55.16 - 212.12.55.31 es -212.12.55.32 - 212.12.58.223 de -212.12.58.224 - 212.12.58.243 gb -212.12.58.244 - 212.12.63.255 de +212.12.32.0 - 212.12.63.255 de 212.12.64.0 - 212.12.95.255 ru -212.12.96.0 - 212.12.109.159 de -212.12.109.160 - 212.12.109.191 gb -212.12.109.192 - 212.12.112.255 de -212.12.113.0 - 212.12.113.127 ch -212.12.113.128 - 212.12.115.31 de -212.12.115.32 - 212.12.115.47 ch -212.12.115.48 - 212.12.115.223 de -212.12.115.224 - 212.12.115.239 ch -212.12.115.240 - 212.12.127.255 de +212.12.96.0 - 212.12.127.255 de 212.12.128.0 - 212.12.159.255 tr -212.12.160.0 - 212.12.162.15 sa -212.12.162.16 - 212.12.162.23 as -212.12.162.24 - 212.12.191.255 sa +212.12.160.0 - 212.12.191.255 sa 212.12.192.0 - 212.12.223.255 lt 212.12.224.0 - 212.12.255.255 eg 212.13.0.0 - 212.13.31.255 ru @@ -138199,376 +109871,140 @@ 212.15.224.0 - 212.15.255.255 es 212.16.0.0 - 212.16.31.255 ru 212.16.32.0 - 212.16.63.255 at -212.16.64.0 - 212.16.69.255 gb -212.16.70.0 - 212.16.70.255 ir -212.16.71.0 - 212.16.72.255 gb -212.16.73.0 - 212.16.95.255 ir +212.16.64.0 - 212.16.95.255 ir 212.16.96.0 - 212.16.127.255 fi 212.16.128.0 - 212.16.159.255 hu -212.16.160.0 - 212.16.161.255 se -212.16.162.0 - 212.16.162.255 no -212.16.163.0 - 212.16.163.63 se -212.16.163.64 - 212.16.163.71 dk -212.16.163.72 - 212.16.164.255 se -212.16.165.0 - 212.16.165.15 fi -212.16.165.16 - 212.16.165.223 se -212.16.165.224 - 212.16.165.239 fi -212.16.165.240 - 212.16.165.255 se -212.16.166.0 - 212.16.166.255 no -212.16.167.0 - 212.16.170.55 se -212.16.170.56 - 212.16.170.59 fi -212.16.170.60 - 212.16.170.127 se -212.16.170.128 - 212.16.170.143 be -212.16.170.144 - 212.16.171.255 se -212.16.172.0 - 212.16.173.255 fi -212.16.174.0 - 212.16.175.127 se +212.16.160.0 - 212.16.170.31 se +212.16.170.32 - 212.16.170.193 fi +212.16.170.194 - 212.16.170.194 se +212.16.170.195 - 212.16.170.255 fi +212.16.171.0 - 212.16.175.127 se 212.16.175.128 - 212.16.175.159 fi -212.16.175.160 - 212.16.175.183 se -212.16.175.184 - 212.16.175.191 fi -212.16.175.192 - 212.16.175.223 se -212.16.175.224 - 212.16.175.231 fi -212.16.175.232 - 212.16.176.63 se -212.16.176.64 - 212.16.176.79 no -212.16.176.80 - 212.16.176.95 dk -212.16.176.96 - 212.16.177.207 se +212.16.175.160 - 212.16.177.207 se 212.16.177.208 - 212.16.177.223 no 212.16.177.224 - 212.16.177.239 fi -212.16.177.240 - 212.16.179.95 se -212.16.179.96 - 212.16.179.111 dk -212.16.179.112 - 212.16.179.119 se +212.16.177.240 - 212.16.179.119 se 212.16.179.120 - 212.16.179.127 fi -212.16.179.128 - 212.16.181.95 se -212.16.181.96 - 212.16.181.127 fi -212.16.181.128 - 212.16.191.255 se +212.16.179.128 - 212.16.191.255 se 212.16.192.0 - 212.16.223.255 ru 212.16.224.0 - 212.16.255.255 de 212.17.0.0 - 212.17.31.255 ru 212.17.32.0 - 212.17.63.255 ie 212.17.64.0 - 212.17.127.255 at 212.17.128.0 - 212.17.159.255 no -212.17.160.0 - 212.17.191.255 fi +212.17.160.0 - 212.17.163.255 ax +212.17.164.0 - 212.17.164.255 fi +212.17.165.0 - 212.17.165.255 ax +212.17.166.0 - 212.17.179.255 fi +212.17.180.0 - 212.17.191.255 ax 212.17.192.0 - 212.17.223.255 it -212.17.224.0 - 212.17.239.95 de -212.17.239.96 - 212.17.239.111 gb -212.17.239.112 - 212.18.31.255 de +212.17.224.0 - 212.18.31.255 de 212.18.32.0 - 212.18.63.255 si -212.18.64.0 - 212.18.95.255 de +212.18.64.0 - 212.18.77.255 de +212.18.78.0 - 212.18.78.255 eu +212.18.79.0 - 212.18.95.255 de 212.18.96.0 - 212.18.127.255 ch 212.18.128.0 - 212.18.159.255 no 212.18.160.0 - 212.18.191.255 pt 212.18.192.0 - 212.18.223.255 de -212.18.224.0 - 212.18.255.255 gb +212.18.224.0 - 212.18.239.255 gb +212.18.240.0 - 212.18.247.255 fr +212.18.248.0 - 212.18.252.255 gb +212.18.253.0 - 212.18.253.255 nl +212.18.254.0 - 212.18.254.255 us +212.18.255.0 - 212.18.255.255 nl 212.19.0.0 - 212.19.31.255 ru -212.19.32.0 - 212.19.32.31 gb -212.19.32.32 - 212.19.32.175 de -212.19.32.176 - 212.19.32.191 gb -212.19.32.192 - 212.19.36.191 de -212.19.36.192 - 212.19.36.223 gb -212.19.36.224 - 212.19.51.31 de -212.19.51.32 - 212.19.51.39 ch -212.19.51.40 - 212.19.61.63 de -212.19.61.64 - 212.19.61.67 ch -212.19.61.68 - 212.19.63.255 de +212.19.32.0 - 212.19.63.255 de 212.19.64.0 - 212.19.95.255 gb 212.19.96.0 - 212.19.127.255 it 212.19.128.0 - 212.19.159.255 kz 212.19.160.0 - 212.19.191.255 fr -212.19.192.0 - 212.19.206.127 nl -212.19.206.128 - 212.19.206.143 us -212.19.206.144 - 212.19.255.255 nl +212.19.192.0 - 212.19.255.255 nl 212.20.0.0 - 212.20.63.255 ru 212.20.64.0 - 212.20.127.255 cz -212.20.128.0 - 212.20.165.15 de -212.20.165.16 - 212.20.165.31 ch -212.20.165.32 - 212.20.191.255 de +212.20.128.0 - 212.20.191.255 de 212.20.192.0 - 212.20.223.255 no 212.20.224.0 - 212.20.255.255 gb 212.21.0.0 - 212.21.31.255 ru -212.21.32.0 - 212.21.32.127 ng -212.21.32.128 - 212.21.32.255 sd -212.21.33.0 - 212.21.33.127 mz -212.21.33.128 - 212.21.33.255 ci -212.21.34.0 - 212.21.34.127 cm -212.21.34.128 - 212.21.34.255 sd -212.21.35.0 - 212.21.35.15 mm -212.21.35.16 - 212.21.35.19 ng -212.21.35.20 - 212.21.35.23 af -212.21.35.24 - 212.21.35.31 de -212.21.35.32 - 212.21.35.39 mr -212.21.35.40 - 212.21.35.47 a2 -212.21.35.48 - 212.21.35.51 af +212.21.32.0 - 212.21.35.51 a2 212.21.35.52 - 212.21.35.55 de -212.21.35.56 - 212.21.35.95 a2 -212.21.35.96 - 212.21.35.111 de -212.21.35.112 - 212.21.35.127 a2 -212.21.35.128 - 212.21.35.255 sd -212.21.36.0 - 212.21.36.127 et -212.21.36.128 - 212.21.36.135 a2 -212.21.36.136 - 212.21.36.143 ke -212.21.36.144 - 212.21.36.159 a2 -212.21.36.160 - 212.21.36.167 mm -212.21.36.168 - 212.21.36.223 a2 -212.21.36.224 - 212.21.36.239 so -212.21.36.240 - 212.21.36.247 a2 -212.21.36.248 - 212.21.36.251 de -212.21.36.252 - 212.21.36.255 a2 -212.21.37.0 - 212.21.38.255 sd -212.21.39.0 - 212.21.39.255 kg -212.21.40.0 - 212.21.40.87 gb -212.21.40.88 - 212.21.40.95 af -212.21.40.96 - 212.21.40.103 a2 -212.21.40.104 - 212.21.40.111 dk -212.21.40.112 - 212.21.40.167 af -212.21.40.168 - 212.21.40.183 ke -212.21.40.184 - 212.21.40.191 a2 -212.21.40.192 - 212.21.40.223 gb -212.21.40.224 - 212.21.40.239 np -212.21.40.240 - 212.21.40.255 a2 -212.21.41.0 - 212.21.41.127 kn -212.21.41.128 - 212.21.42.127 sm -212.21.42.128 - 212.21.43.127 af -212.21.43.128 - 212.21.43.255 sm -212.21.44.0 - 212.21.44.7 a2 -212.21.44.8 - 212.21.44.15 de -212.21.44.16 - 212.21.44.23 sl -212.21.44.24 - 212.21.44.63 a2 -212.21.44.64 - 212.21.44.79 ug +212.21.35.56 - 212.21.40.15 a2 +212.21.40.16 - 212.21.40.23 gb +212.21.40.24 - 212.21.44.79 a2 212.21.44.80 - 212.21.44.95 af -212.21.44.96 - 212.21.44.127 sd -212.21.44.128 - 212.21.44.255 sz -212.21.45.0 - 212.21.45.15 a2 -212.21.45.16 - 212.21.45.31 mm -212.21.45.32 - 212.21.45.159 sd -212.21.45.160 - 212.21.45.191 so -212.21.45.192 - 212.21.45.223 a2 -212.21.45.224 - 212.21.46.255 sl -212.21.47.0 - 212.21.47.127 gb -212.21.47.128 - 212.21.47.159 sc -212.21.47.160 - 212.21.47.247 a2 -212.21.47.248 - 212.21.47.251 sc -212.21.47.252 - 212.21.47.255 a2 -212.21.48.0 - 212.21.49.255 se -212.21.50.0 - 212.21.51.255 de -212.21.52.0 - 212.21.52.159 af -212.21.52.160 - 212.21.53.191 a2 -212.21.53.192 - 212.21.53.223 de -212.21.53.224 - 212.21.53.255 a2 -212.21.54.0 - 212.21.54.255 sl -212.21.55.0 - 212.21.55.255 de -212.21.56.0 - 212.21.58.255 a2 -212.21.59.0 - 212.21.59.255 af -212.21.60.0 - 212.21.62.223 a2 -212.21.62.224 - 212.21.62.255 so -212.21.63.0 - 212.21.63.31 bi -212.21.63.32 - 212.21.63.127 a2 -212.21.63.128 - 212.21.63.255 bi +212.21.44.96 - 212.21.51.255 a2 +212.21.52.0 - 212.21.52.255 us +212.21.53.0 - 212.21.54.255 a2 +212.21.55.0 - 212.21.55.255 gb +212.21.56.0 - 212.21.63.255 a2 212.21.64.0 - 212.21.95.255 de 212.21.96.0 - 212.21.127.255 gb 212.21.128.0 - 212.21.159.255 bg 212.21.160.0 - 212.21.191.255 de -212.21.192.0 - 212.21.192.255 be -212.21.193.0 - 212.21.195.63 es -212.21.195.64 - 212.21.195.67 it -212.21.195.68 - 212.21.195.71 es -212.21.195.72 - 212.21.195.79 it -212.21.195.80 - 212.21.195.151 es -212.21.195.152 - 212.21.195.159 it -212.21.195.160 - 212.21.195.191 es -212.21.195.192 - 212.21.195.199 it -212.21.195.200 - 212.21.195.207 es -212.21.195.208 - 212.21.195.223 it -212.21.195.224 - 212.21.195.231 es -212.21.195.232 - 212.21.196.47 it -212.21.196.48 - 212.21.196.127 es -212.21.196.128 - 212.21.196.135 it -212.21.196.136 - 212.21.196.143 es -212.21.196.144 - 212.21.196.191 it -212.21.196.192 - 212.21.197.63 es -212.21.197.64 - 212.21.197.119 it -212.21.197.120 - 212.21.197.255 es -212.21.198.0 - 212.21.223.255 us +212.21.192.0 - 212.21.199.255 gb +212.21.200.0 - 212.21.207.255 us +212.21.208.0 - 212.21.223.255 gb 212.21.224.0 - 212.21.255.255 es 212.22.0.0 - 212.22.31.255 gb 212.22.32.0 - 212.22.63.255 es -212.22.64.0 - 212.22.95.255 ru +212.22.64.0 - 212.22.71.255 ru +212.22.72.0 - 212.22.75.255 pl +212.22.76.0 - 212.22.77.255 ru +212.22.78.0 - 212.22.78.255 sk +212.22.79.0 - 212.22.79.255 fr +212.22.80.0 - 212.22.81.255 lb +212.22.82.0 - 212.22.93.255 ru +212.22.94.0 - 212.22.94.255 lb +212.22.95.0 - 212.22.95.255 ru 212.22.96.0 - 212.22.127.255 gb 212.22.128.0 - 212.22.159.255 it 212.22.160.0 - 212.22.191.255 ke 212.22.192.0 - 212.22.223.255 ua -212.22.224.0 - 212.22.225.255 gb -212.22.226.0 - 212.22.227.255 gi -212.22.228.0 - 212.22.229.255 gb -212.22.230.0 - 212.22.232.255 gi -212.22.233.0 - 212.22.233.255 gb -212.22.234.0 - 212.22.251.255 gi -212.22.252.0 - 212.22.254.255 gb -212.22.255.0 - 212.22.255.255 gi -212.23.0.0 - 212.23.32.255 gb -212.23.33.0 - 212.23.33.255 de -212.23.34.0 - 212.23.34.127 gb +212.22.224.0 - 212.22.255.255 gi +212.23.0.0 - 212.23.34.127 gb 212.23.34.128 - 212.23.34.255 de 212.23.35.0 - 212.23.36.255 gb -212.23.37.0 - 212.23.37.63 fr -212.23.37.64 - 212.23.37.127 gb -212.23.37.128 - 212.23.37.255 fr -212.23.38.0 - 212.23.41.63 gb -212.23.41.64 - 212.23.41.127 be -212.23.41.128 - 212.23.41.255 nl -212.23.42.0 - 212.23.42.63 fr -212.23.42.64 - 212.23.42.127 it -212.23.42.128 - 212.23.42.191 de -212.23.42.192 - 212.23.42.255 es -212.23.43.0 - 212.23.43.63 at -212.23.43.64 - 212.23.43.127 se -212.23.43.128 - 212.23.43.191 us -212.23.43.192 - 212.23.43.255 ch -212.23.44.0 - 212.23.44.39 us -212.23.44.40 - 212.23.44.63 gb -212.23.44.64 - 212.23.44.99 us -212.23.44.100 - 212.23.44.103 gb -212.23.44.104 - 212.23.44.255 us -212.23.45.0 - 212.23.45.31 be -212.23.45.32 - 212.23.45.47 de -212.23.45.48 - 212.23.45.255 be -212.23.46.0 - 212.23.46.207 fr -212.23.46.208 - 212.23.46.223 gb +212.23.37.0 - 212.23.37.255 fr +212.23.38.0 - 212.23.44.255 gb +212.23.45.0 - 212.23.45.255 eu +212.23.46.0 - 212.23.46.223 gb 212.23.46.224 - 212.23.46.255 fr -212.23.47.0 - 212.23.47.255 gb -212.23.48.0 - 212.23.48.95 nl -212.23.48.96 - 212.23.48.127 gb -212.23.48.128 - 212.23.48.255 nl -212.23.49.0 - 212.23.49.83 it -212.23.49.84 - 212.23.49.87 gb -212.23.49.88 - 212.23.49.111 it -212.23.49.112 - 212.23.49.119 gb -212.23.49.120 - 212.23.49.255 it -212.23.50.0 - 212.23.50.255 cz -212.23.51.0 - 212.23.51.255 gb -212.23.52.0 - 212.23.52.143 be -212.23.52.144 - 212.23.52.159 gb -212.23.52.160 - 212.23.52.167 be -212.23.52.168 - 212.23.52.183 gb -212.23.52.184 - 212.23.52.231 be -212.23.52.232 - 212.23.52.247 gb -212.23.52.248 - 212.23.52.255 be -212.23.53.0 - 212.23.53.183 es -212.23.53.184 - 212.23.53.191 gb -212.23.53.192 - 212.23.53.223 es -212.23.53.224 - 212.23.53.255 gb -212.23.54.0 - 212.23.54.15 de -212.23.54.16 - 212.23.54.23 nl -212.23.54.24 - 212.23.54.31 gb -212.23.54.32 - 212.23.54.47 nl -212.23.54.48 - 212.23.54.79 de -212.23.54.80 - 212.23.54.87 se -212.23.54.88 - 212.23.54.191 de -212.23.54.192 - 212.23.54.255 gb -212.23.55.0 - 212.23.55.15 ch -212.23.55.16 - 212.23.55.31 at -212.23.55.32 - 212.23.55.39 ch -212.23.55.40 - 212.23.55.47 gb -212.23.55.48 - 212.23.55.63 ch -212.23.55.64 - 212.23.55.79 at -212.23.55.80 - 212.23.55.95 gb -212.23.55.96 - 212.23.55.255 ch -212.23.56.0 - 212.23.56.3 de -212.23.56.4 - 212.23.56.7 gb -212.23.56.8 - 212.23.56.15 de -212.23.56.16 - 212.23.58.255 gb -212.23.59.0 - 212.23.59.63 se -212.23.59.64 - 212.23.60.63 nl -212.23.60.64 - 212.23.60.127 gb -212.23.60.128 - 212.23.60.255 nl -212.23.61.0 - 212.23.61.127 gb -212.23.61.128 - 212.23.61.135 ch -212.23.61.136 - 212.23.61.143 gb -212.23.61.144 - 212.23.62.127 nl -212.23.62.128 - 212.23.62.151 ch -212.23.62.152 - 212.23.62.159 gb -212.23.62.160 - 212.23.62.255 nl -212.23.63.0 - 212.23.63.255 gb +212.23.47.0 - 212.23.48.23 gb +212.23.48.24 - 212.23.48.31 nl +212.23.48.32 - 212.23.50.55 gb +212.23.50.56 - 212.23.50.63 cz +212.23.50.64 - 212.23.53.143 gb +212.23.53.144 - 212.23.53.159 es +212.23.53.160 - 212.23.54.127 gb +212.23.54.128 - 212.23.54.191 de +212.23.54.192 - 212.23.59.31 gb +212.23.59.32 - 212.23.59.47 se +212.23.59.48 - 212.23.59.255 gb +212.23.60.0 - 212.23.60.255 eu +212.23.61.0 - 212.23.62.63 gb +212.23.62.64 - 212.23.62.95 nl +212.23.62.96 - 212.23.62.207 gb +212.23.62.208 - 212.23.62.223 nl +212.23.62.224 - 212.23.63.255 gb 212.23.64.0 - 212.23.95.255 ru -212.23.96.0 - 212.23.129.175 de -212.23.129.176 - 212.23.129.183 ch -212.23.129.184 - 212.23.130.111 de -212.23.130.112 - 212.23.130.119 ch -212.23.130.120 - 212.23.139.87 de -212.23.139.88 - 212.23.139.95 ch -212.23.139.96 - 212.23.159.255 de -212.23.160.0 - 212.23.167.17 fr -212.23.167.18 - 212.23.167.19 es -212.23.167.20 - 212.23.223.255 fr -212.23.224.0 - 212.23.225.215 ch -212.23.225.216 - 212.23.225.223 fr -212.23.225.224 - 212.23.228.11 ch -212.23.228.12 - 212.23.228.15 de -212.23.228.16 - 212.23.228.23 ch -212.23.228.24 - 212.23.228.31 de -212.23.228.32 - 212.23.235.235 ch -212.23.235.236 - 212.23.235.239 es -212.23.235.240 - 212.23.236.247 ch -212.23.236.248 - 212.23.236.251 de -212.23.236.252 - 212.23.236.253 ch -212.23.236.254 - 212.23.236.254 gb -212.23.236.255 - 212.23.243.31 ch -212.23.243.32 - 212.23.243.39 es -212.23.243.40 - 212.23.244.115 ch -212.23.244.116 - 212.23.244.119 de -212.23.244.120 - 212.23.245.199 ch -212.23.245.200 - 212.23.245.203 de -212.23.245.204 - 212.23.255.255 ch +212.23.96.0 - 212.23.159.255 de +212.23.160.0 - 212.23.223.255 fr +212.23.224.0 - 212.23.255.255 ch 212.24.0.0 - 212.24.31.255 it 212.24.32.0 - 212.24.63.255 ru 212.24.64.0 - 212.24.95.255 gb -212.24.96.0 - 212.24.96.39 at -212.24.96.40 - 212.24.96.47 gi -212.24.96.48 - 212.24.99.15 at -212.24.99.16 - 212.24.99.31 ar -212.24.99.32 - 212.24.99.63 cl -212.24.99.64 - 212.24.99.79 es -212.24.99.80 - 212.24.99.95 de -212.24.99.96 - 212.24.99.111 us -212.24.99.112 - 212.24.99.127 gb -212.24.99.128 - 212.24.99.159 at -212.24.99.160 - 212.24.99.191 de -212.24.99.192 - 212.24.99.207 us -212.24.99.208 - 212.24.99.223 gb -212.24.99.224 - 212.24.99.239 es -212.24.99.240 - 212.24.99.255 ar -212.24.100.0 - 212.24.100.15 at -212.24.100.16 - 212.24.100.31 gb -212.24.100.32 - 212.24.100.63 cl -212.24.100.64 - 212.24.100.127 ar -212.24.100.128 - 212.24.100.191 at -212.24.100.192 - 212.24.100.223 de -212.24.100.224 - 212.24.100.239 es -212.24.100.240 - 212.24.100.255 us -212.24.101.0 - 212.24.104.207 at -212.24.104.208 - 212.24.104.223 ch -212.24.104.224 - 212.24.104.239 fr -212.24.104.240 - 212.24.115.255 at -212.24.116.0 - 212.24.116.255 bg -212.24.117.0 - 212.24.117.127 at -212.24.117.128 - 212.24.117.255 es -212.24.118.0 - 212.24.127.255 at +212.24.96.0 - 212.24.127.255 at 212.24.128.0 - 212.24.159.255 cz 212.24.160.0 - 212.24.191.255 hu 212.24.192.0 - 212.24.223.255 lu 212.24.224.0 - 212.24.255.255 sa -212.25.0.0 - 212.25.15.63 ch -212.25.15.64 - 212.25.15.71 gb -212.25.15.72 - 212.25.31.255 ch +212.25.0.0 - 212.25.31.255 ch 212.25.32.0 - 212.25.63.255 bg 212.25.64.0 - 212.25.127.255 il 212.25.128.0 - 212.25.159.255 se 212.25.160.0 - 212.25.191.255 it -212.25.192.0 - 212.25.192.63 be -212.25.192.64 - 212.25.192.255 gb -212.25.193.0 - 212.25.193.127 fr -212.25.193.128 - 212.25.223.255 nl -212.25.224.0 - 212.25.235.255 gb -212.25.236.0 - 212.25.237.255 us -212.25.238.0 - 212.25.255.255 gb +212.25.192.0 - 212.25.223.255 nl +212.25.224.0 - 212.25.255.255 gb 212.26.0.0 - 212.26.127.255 sa 212.26.128.0 - 212.26.159.255 ua 212.26.160.0 - 212.26.191.255 sk @@ -138578,9 +110014,7 @@ 212.27.32.0 - 212.27.63.255 fr 212.27.64.0 - 212.27.127.255 at 212.27.128.0 - 212.27.159.255 de -212.27.160.0 - 212.27.164.175 ch -212.27.164.176 - 212.27.164.191 de -212.27.164.192 - 212.27.191.255 ch +212.27.160.0 - 212.27.191.255 ch 212.27.192.0 - 212.27.223.255 cz 212.27.224.0 - 212.27.255.255 ee 212.28.0.0 - 212.28.31.255 gb @@ -138594,148 +110028,13 @@ 212.29.0.0 - 212.29.63.255 de 212.29.64.0 - 212.29.127.255 tr 212.29.128.0 - 212.29.159.255 it -212.29.160.0 - 212.29.191.255 nl +212.29.160.0 - 212.29.184.255 nl +212.29.185.0 - 212.29.185.255 eu +212.29.186.0 - 212.29.186.255 nl +212.29.187.0 - 212.29.187.255 eu +212.29.188.0 - 212.29.191.255 nl 212.29.192.0 - 212.29.255.255 il -212.30.0.0 - 212.30.0.255 gb -212.30.1.0 - 212.30.2.255 gg -212.30.3.0 - 212.30.4.159 gb -212.30.4.160 - 212.30.4.255 gg -212.30.5.0 - 212.30.5.127 gb -212.30.5.128 - 212.30.7.255 gg -212.30.8.0 - 212.30.11.63 gb -212.30.11.64 - 212.30.11.255 gg -212.30.12.0 - 212.30.12.47 gb -212.30.12.48 - 212.30.12.63 gg -212.30.12.64 - 212.30.12.95 gb -212.30.12.96 - 212.30.12.111 gg -212.30.12.112 - 212.30.12.255 gb -212.30.13.0 - 212.30.13.31 gg -212.30.13.32 - 212.30.13.95 gb -212.30.13.96 - 212.30.14.255 gg -212.30.15.0 - 212.30.16.7 gb -212.30.16.8 - 212.30.16.15 gg -212.30.16.16 - 212.30.16.47 gb -212.30.16.48 - 212.30.16.55 gg -212.30.16.56 - 212.30.16.63 gb -212.30.16.64 - 212.30.16.71 gg -212.30.16.72 - 212.30.16.95 gb -212.30.16.96 - 212.30.16.111 gg -212.30.16.112 - 212.30.16.119 gb -212.30.16.120 - 212.30.16.127 gg -212.30.16.128 - 212.30.16.215 gb -212.30.16.216 - 212.30.16.231 gg -212.30.16.232 - 212.30.16.239 gb -212.30.16.240 - 212.30.16.247 gg -212.30.16.248 - 212.30.16.254 gb -212.30.16.255 - 212.30.16.255 gg -212.30.17.0 - 212.30.17.31 gb -212.30.17.32 - 212.30.17.47 gg -212.30.17.48 - 212.30.17.63 gb -212.30.17.64 - 212.30.17.71 gg -212.30.17.72 - 212.30.17.119 gb -212.30.17.120 - 212.30.17.127 gg -212.30.17.128 - 212.30.17.135 gb -212.30.17.136 - 212.30.17.143 gg -212.30.17.144 - 212.30.17.159 gb -212.30.17.160 - 212.30.18.127 gg -212.30.18.128 - 212.30.18.207 gb -212.30.18.208 - 212.30.21.7 gg -212.30.21.8 - 212.30.21.23 gb -212.30.21.24 - 212.30.21.31 gg -212.30.21.32 - 212.30.21.39 gb -212.30.21.40 - 212.30.21.47 gg -212.30.21.48 - 212.30.21.63 gb -212.30.21.64 - 212.30.21.87 gg -212.30.21.88 - 212.30.21.111 gb -212.30.21.112 - 212.30.21.119 gg -212.30.21.120 - 212.30.21.143 gb -212.30.21.144 - 212.30.21.151 gg -212.30.21.152 - 212.30.21.175 gb -212.30.21.176 - 212.30.21.183 gg -212.30.21.184 - 212.30.21.191 gb -212.30.21.192 - 212.30.21.199 gg -212.30.21.200 - 212.30.21.223 gb -212.30.21.224 - 212.30.21.239 gg -212.30.21.240 - 212.30.21.255 gb -212.30.22.0 - 212.30.23.255 gg -212.30.24.0 - 212.30.24.23 gb -212.30.24.24 - 212.30.24.31 gg -212.30.24.32 - 212.30.24.39 gb -212.30.24.40 - 212.30.24.55 gg -212.30.24.56 - 212.30.24.63 gb -212.30.24.64 - 212.30.24.71 gg -212.30.24.72 - 212.30.24.87 gb -212.30.24.88 - 212.30.24.119 gg -212.30.24.120 - 212.30.24.143 gb -212.30.24.144 - 212.30.24.175 gg -212.30.24.176 - 212.30.24.199 gb -212.30.24.200 - 212.30.24.207 gg -212.30.24.208 - 212.30.24.223 gb -212.30.24.224 - 212.30.24.231 gg -212.30.24.232 - 212.30.24.239 gb -212.30.24.240 - 212.30.25.255 gg -212.30.26.0 - 212.30.26.15 gb -212.30.26.16 - 212.30.26.23 gg -212.30.26.24 - 212.30.26.39 gb -212.30.26.40 - 212.30.26.55 gg -212.30.26.56 - 212.30.26.95 gb -212.30.26.96 - 212.30.26.103 gg -212.30.26.104 - 212.30.26.127 gb -212.30.26.128 - 212.30.26.135 gg -212.30.26.136 - 212.30.26.151 gb -212.30.26.152 - 212.30.26.167 gg -212.30.26.168 - 212.30.26.199 gb -212.30.26.200 - 212.30.26.207 gg -212.30.26.208 - 212.30.26.215 gb -212.30.26.216 - 212.30.26.223 gg -212.30.26.224 - 212.30.26.247 gb -212.30.26.248 - 212.30.27.255 gg -212.30.28.0 - 212.30.28.7 gb -212.30.28.8 - 212.30.28.11 gg -212.30.28.12 - 212.30.28.35 gb -212.30.28.36 - 212.30.28.51 gg -212.30.28.52 - 212.30.28.67 gb -212.30.28.68 - 212.30.28.71 gg -212.30.28.72 - 212.30.28.75 gb -212.30.28.76 - 212.30.28.79 gg -212.30.28.80 - 212.30.28.91 gb -212.30.28.92 - 212.30.28.95 gg -212.30.28.96 - 212.30.28.107 gb -212.30.28.108 - 212.30.28.111 gg -212.30.28.112 - 212.30.28.127 gb -212.30.28.128 - 212.30.28.131 gg -212.30.28.132 - 212.30.28.143 gb -212.30.28.144 - 212.30.28.151 gg -212.30.28.152 - 212.30.28.163 gb -212.30.28.164 - 212.30.28.167 gg -212.30.28.168 - 212.30.28.179 gb -212.30.28.180 - 212.30.28.183 gg -212.30.28.184 - 212.30.28.195 gb -212.30.28.196 - 212.30.28.199 gg -212.30.28.200 - 212.30.28.203 gb -212.30.28.204 - 212.30.28.215 gg -212.30.28.216 - 212.30.28.223 gb -212.30.28.224 - 212.30.28.255 gg -212.30.29.0 - 212.30.29.7 gb -212.30.29.8 - 212.30.29.15 gg -212.30.29.16 - 212.30.29.23 gb -212.30.29.24 - 212.30.29.31 gg -212.30.29.32 - 212.30.29.55 gb -212.30.29.56 - 212.30.29.63 gg -212.30.29.64 - 212.30.29.87 gb -212.30.29.88 - 212.30.29.95 gg -212.30.29.96 - 212.30.29.103 gb -212.30.29.104 - 212.30.29.111 gg -212.30.29.112 - 212.30.29.143 gb -212.30.29.144 - 212.30.29.151 gg -212.30.29.152 - 212.30.29.167 gb -212.30.29.168 - 212.30.29.199 gg -212.30.29.200 - 212.30.29.211 gb -212.30.29.212 - 212.30.29.215 gg -212.30.29.216 - 212.30.29.239 gb -212.30.29.240 - 212.30.29.255 gg -212.30.30.0 - 212.30.31.31 gb -212.30.31.32 - 212.30.31.255 gg +212.30.0.0 - 212.30.31.255 gg 212.30.32.0 - 212.30.63.255 lb 212.30.64.0 - 212.30.95.255 si 212.30.96.0 - 212.30.127.255 fr @@ -138744,50 +110043,16 @@ 212.31.0.0 - 212.31.31.255 tr 212.31.32.0 - 212.31.63.255 es 212.31.64.0 - 212.31.95.255 at -212.31.96.0 - 212.31.103.31 cy -212.31.103.32 - 212.31.103.39 a2 -212.31.103.40 - 212.31.104.255 cy -212.31.105.0 - 212.31.105.15 a2 -212.31.105.16 - 212.31.120.255 cy -212.31.121.0 - 212.31.121.255 lb -212.31.122.0 - 212.31.127.255 cy +212.31.96.0 - 212.31.127.255 cy 212.31.128.0 - 212.31.159.255 fr 212.31.160.0 - 212.31.191.255 se -212.31.192.0 - 212.31.192.255 es -212.31.193.0 - 212.31.194.255 us -212.31.195.0 - 212.31.195.31 es -212.31.195.32 - 212.31.195.63 gb -212.31.195.64 - 212.31.195.143 es -212.31.195.144 - 212.31.195.151 no -212.31.195.152 - 212.31.201.255 es -212.31.202.0 - 212.31.202.255 be -212.31.203.0 - 212.31.203.23 es -212.31.203.24 - 212.31.203.31 de -212.31.203.32 - 212.31.203.63 es -212.31.203.64 - 212.31.203.79 de -212.31.203.80 - 212.31.203.87 es -212.31.203.88 - 212.31.203.91 de -212.31.203.92 - 212.31.203.127 es -212.31.203.128 - 212.31.203.135 de -212.31.203.136 - 212.31.203.159 es -212.31.203.160 - 212.31.203.171 de -212.31.203.172 - 212.31.207.255 es -212.31.208.0 - 212.31.208.255 us -212.31.209.0 - 212.31.209.63 es -212.31.209.64 - 212.31.209.127 us -212.31.209.128 - 212.31.209.255 gb -212.31.210.0 - 212.31.210.15 us -212.31.210.16 - 212.31.210.255 es -212.31.211.0 - 212.31.211.7 nl -212.31.211.8 - 212.31.212.255 es -212.31.213.0 - 212.31.213.255 us -212.31.214.0 - 212.31.215.127 gb -212.31.215.128 - 212.31.215.191 es -212.31.215.192 - 212.31.215.255 nl +212.31.192.0 - 212.31.194.255 gb +212.31.195.0 - 212.31.195.7 es +212.31.195.8 - 212.31.206.223 gb +212.31.206.224 - 212.31.206.255 es +212.31.207.0 - 212.31.215.255 gb 212.31.216.0 - 212.31.223.255 us -212.31.224.0 - 212.31.247.55 it -212.31.247.56 - 212.31.247.63 gb -212.31.247.64 - 212.31.255.255 it +212.31.224.0 - 212.31.255.255 it 212.32.0.0 - 212.32.127.255 gb 212.32.128.0 - 212.32.191.255 se 212.32.192.0 - 212.32.223.255 ru @@ -138802,285 +110067,58 @@ 212.33.224.0 - 212.33.255.255 ru 212.34.0.0 - 212.34.31.255 jo 212.34.32.0 - 212.34.63.255 ru -212.34.64.0 - 212.34.70.255 de -212.34.71.0 - 212.34.71.15 gb -212.34.71.16 - 212.34.71.23 jp -212.34.71.24 - 212.34.95.255 de +212.34.64.0 - 212.34.95.255 de 212.34.96.0 - 212.34.127.255 ru -212.34.128.0 - 212.34.159.0 es -212.34.159.1 - 212.34.159.255 us +212.34.128.0 - 212.34.159.255 es 212.34.160.0 - 212.34.191.255 de 212.34.192.0 - 212.34.223.255 it 212.34.224.0 - 212.34.255.255 am 212.35.0.0 - 212.35.63.255 ch 212.35.64.0 - 212.35.95.255 jo -212.35.96.0 - 212.35.96.135 be -212.35.96.136 - 212.35.96.139 gb -212.35.96.140 - 212.35.96.179 be -212.35.96.180 - 212.35.96.183 gb -212.35.96.184 - 212.35.96.215 be -212.35.96.216 - 212.35.96.219 gb -212.35.96.220 - 212.35.96.239 be -212.35.96.240 - 212.35.96.243 gb -212.35.96.244 - 212.35.96.247 be -212.35.96.248 - 212.35.96.251 gb -212.35.96.252 - 212.35.97.247 be -212.35.97.248 - 212.35.97.255 de -212.35.98.0 - 212.35.99.127 be -212.35.99.128 - 212.35.99.131 gb -212.35.99.132 - 212.35.99.183 be -212.35.99.184 - 212.35.99.191 gb -212.35.99.192 - 212.35.100.199 be -212.35.100.200 - 212.35.100.207 gb -212.35.100.208 - 212.35.100.255 be -212.35.101.0 - 212.35.101.3 gb -212.35.101.4 - 212.35.101.31 be -212.35.101.32 - 212.35.101.35 gb -212.35.101.36 - 212.35.101.39 be -212.35.101.40 - 212.35.101.43 gb -212.35.101.44 - 212.35.101.55 be -212.35.101.56 - 212.35.101.59 gb -212.35.101.60 - 212.35.101.139 be -212.35.101.140 - 212.35.101.143 gb -212.35.101.144 - 212.35.101.199 be -212.35.101.200 - 212.35.101.203 gb -212.35.101.204 - 212.35.101.215 be -212.35.101.216 - 212.35.101.219 gb -212.35.101.220 - 212.35.101.231 be -212.35.101.232 - 212.35.101.235 gb -212.35.101.236 - 212.35.101.247 be -212.35.101.248 - 212.35.101.251 gb -212.35.101.252 - 212.35.103.151 be -212.35.103.152 - 212.35.103.159 nl -212.35.103.160 - 212.35.105.7 be -212.35.105.8 - 212.35.105.11 gb -212.35.105.12 - 212.35.105.31 be -212.35.105.32 - 212.35.105.35 gb -212.35.105.36 - 212.35.105.51 be -212.35.105.52 - 212.35.105.55 gb -212.35.105.56 - 212.35.105.155 be -212.35.105.156 - 212.35.105.159 gb -212.35.105.160 - 212.35.106.63 be -212.35.106.64 - 212.35.106.67 gb -212.35.106.68 - 212.35.106.87 be -212.35.106.88 - 212.35.106.91 gb -212.35.106.92 - 212.35.106.115 be -212.35.106.116 - 212.35.106.119 gb -212.35.106.120 - 212.35.106.175 be -212.35.106.176 - 212.35.106.183 gb -212.35.106.184 - 212.35.106.207 be -212.35.106.208 - 212.35.106.211 gb -212.35.106.212 - 212.35.106.215 be -212.35.106.216 - 212.35.106.219 gb -212.35.106.220 - 212.35.106.235 be -212.35.106.236 - 212.35.106.239 gb -212.35.106.240 - 212.35.107.67 be -212.35.107.68 - 212.35.107.71 gb -212.35.107.72 - 212.35.107.143 be -212.35.107.144 - 212.35.107.147 gb -212.35.107.148 - 212.35.108.3 be -212.35.108.4 - 212.35.108.7 gb -212.35.108.8 - 212.35.108.11 be -212.35.108.12 - 212.35.108.15 gb -212.35.108.16 - 212.35.108.23 be -212.35.108.24 - 212.35.108.31 gb -212.35.108.32 - 212.35.108.223 be -212.35.108.224 - 212.35.108.227 gb -212.35.108.228 - 212.35.108.239 be -212.35.108.240 - 212.35.108.247 es -212.35.108.248 - 212.35.108.255 be -212.35.109.0 - 212.35.109.31 de -212.35.109.32 - 212.35.109.39 be -212.35.109.40 - 212.35.109.47 gb -212.35.109.48 - 212.35.109.51 be -212.35.109.52 - 212.35.109.55 gb -212.35.109.56 - 212.35.109.71 be -212.35.109.72 - 212.35.109.87 gb -212.35.109.88 - 212.35.109.115 be -212.35.109.116 - 212.35.109.119 gb -212.35.109.120 - 212.35.109.135 be -212.35.109.136 - 212.35.109.159 gb -212.35.109.160 - 212.35.109.175 be -212.35.109.176 - 212.35.109.183 lu -212.35.109.184 - 212.35.110.103 be -212.35.110.104 - 212.35.110.111 gb -212.35.110.112 - 212.35.111.191 be -212.35.111.192 - 212.35.111.192 gb -212.35.111.193 - 212.35.111.254 be -212.35.111.255 - 212.35.111.255 gb -212.35.112.0 - 212.35.112.15 be -212.35.112.16 - 212.35.112.23 gb -212.35.112.24 - 212.35.112.135 be -212.35.112.136 - 212.35.112.143 gb -212.35.112.144 - 212.35.113.255 be -212.35.114.0 - 212.35.114.3 gb -212.35.114.4 - 212.35.114.63 be -212.35.114.64 - 212.35.114.67 gb -212.35.114.68 - 212.35.114.111 be -212.35.114.112 - 212.35.114.127 gb -212.35.114.128 - 212.35.114.135 be -212.35.114.136 - 212.35.114.159 gb -212.35.114.160 - 212.35.114.203 be -212.35.114.204 - 212.35.114.207 gb -212.35.114.208 - 212.35.114.223 be -212.35.114.224 - 212.35.114.239 gb -212.35.114.240 - 212.35.115.3 be -212.35.115.4 - 212.35.115.7 gb -212.35.115.8 - 212.35.115.15 be -212.35.115.16 - 212.35.115.23 gb -212.35.115.24 - 212.35.115.31 fr -212.35.115.32 - 212.35.115.39 be -212.35.115.40 - 212.35.115.47 gb -212.35.115.48 - 212.35.115.55 be -212.35.115.56 - 212.35.115.63 gb -212.35.115.64 - 212.35.115.71 be -212.35.115.72 - 212.35.115.79 fr -212.35.115.80 - 212.35.115.83 be -212.35.115.84 - 212.35.115.87 gb -212.35.115.88 - 212.35.115.91 be -212.35.115.92 - 212.35.115.95 gb -212.35.115.96 - 212.35.115.111 be -212.35.115.112 - 212.35.115.127 fr -212.35.115.128 - 212.35.115.143 be -212.35.115.144 - 212.35.115.167 fr -212.35.115.168 - 212.35.115.171 gb -212.35.115.172 - 212.35.115.175 be -212.35.115.176 - 212.35.115.179 gb -212.35.115.180 - 212.35.115.203 be -212.35.115.204 - 212.35.115.211 gb -212.35.115.212 - 212.35.115.223 be -212.35.115.224 - 212.35.115.227 gb -212.35.115.228 - 212.35.115.247 be -212.35.115.248 - 212.35.115.251 gb -212.35.115.252 - 212.35.117.15 be -212.35.117.16 - 212.35.117.31 gb -212.35.117.32 - 212.35.117.63 be -212.35.117.64 - 212.35.117.95 it -212.35.117.96 - 212.35.117.159 be -212.35.117.160 - 212.35.117.167 gb -212.35.117.168 - 212.35.117.183 be -212.35.117.184 - 212.35.117.195 gb -212.35.117.196 - 212.35.117.199 be -212.35.117.200 - 212.35.117.207 gb -212.35.117.208 - 212.35.118.215 be -212.35.118.216 - 212.35.118.223 gb -212.35.118.224 - 212.35.119.3 be -212.35.119.4 - 212.35.119.7 gb -212.35.119.8 - 212.35.119.15 be -212.35.119.16 - 212.35.119.23 fr -212.35.119.24 - 212.35.119.31 be -212.35.119.32 - 212.35.119.39 fr -212.35.119.40 - 212.35.119.67 be -212.35.119.68 - 212.35.119.71 gb -212.35.119.72 - 212.35.119.79 fr -212.35.119.80 - 212.35.119.83 gb -212.35.119.84 - 212.35.119.87 be -212.35.119.88 - 212.35.119.95 gb -212.35.119.96 - 212.35.119.127 be -212.35.119.128 - 212.35.119.131 gb -212.35.119.132 - 212.35.119.135 be -212.35.119.136 - 212.35.119.143 gb -212.35.119.144 - 212.35.119.159 be -212.35.119.160 - 212.35.119.163 gb -212.35.119.164 - 212.35.119.167 be -212.35.119.168 - 212.35.119.175 gb -212.35.119.176 - 212.35.119.195 be -212.35.119.196 - 212.35.119.199 gb -212.35.119.200 - 212.35.119.203 be -212.35.119.204 - 212.35.119.207 gb -212.35.119.208 - 212.35.119.215 be -212.35.119.216 - 212.35.119.219 gb -212.35.119.220 - 212.35.119.223 be -212.35.119.224 - 212.35.119.227 gb -212.35.119.228 - 212.35.119.231 be -212.35.119.232 - 212.35.119.235 gb -212.35.119.236 - 212.35.120.47 be -212.35.120.48 - 212.35.120.63 gb -212.35.120.64 - 212.35.120.151 be -212.35.120.152 - 212.35.120.175 gb -212.35.120.176 - 212.35.120.183 es -212.35.120.184 - 212.35.120.255 be -212.35.121.0 - 212.35.122.255 gb -212.35.123.0 - 212.35.123.15 be -212.35.123.16 - 212.35.123.23 gb -212.35.123.24 - 212.35.123.127 be -212.35.123.128 - 212.35.123.191 gb -212.35.123.192 - 212.35.123.223 be -212.35.123.224 - 212.35.124.7 gb -212.35.124.8 - 212.35.124.143 be -212.35.124.144 - 212.35.124.159 gb -212.35.124.160 - 212.35.124.191 be -212.35.124.192 - 212.35.124.255 gb -212.35.125.0 - 212.35.125.39 be -212.35.125.40 - 212.35.125.71 gb -212.35.125.72 - 212.35.125.79 be -212.35.125.80 - 212.35.125.95 gb -212.35.125.96 - 212.35.126.63 be -212.35.126.64 - 212.35.126.79 gb -212.35.126.80 - 212.35.126.111 be -212.35.126.112 - 212.35.126.119 gb -212.35.126.120 - 212.35.126.239 be -212.35.126.240 - 212.35.126.255 gb -212.35.127.0 - 212.35.127.19 be -212.35.127.20 - 212.35.127.31 gb -212.35.127.32 - 212.35.127.59 be -212.35.127.60 - 212.35.127.63 gb -212.35.127.64 - 212.35.127.151 be -212.35.127.152 - 212.35.127.159 nl -212.35.127.160 - 212.35.127.183 be -212.35.127.184 - 212.35.127.191 gb -212.35.127.192 - 212.35.127.255 be -212.35.128.0 - 212.35.154.255 ro -212.35.155.0 - 212.35.155.255 gb -212.35.156.0 - 212.35.159.255 ro +212.35.96.0 - 212.35.96.255 gb +212.35.97.0 - 212.35.97.255 be +212.35.98.0 - 212.35.101.119 gb +212.35.101.120 - 212.35.101.127 be +212.35.101.128 - 212.35.103.15 gb +212.35.103.16 - 212.35.103.31 be +212.35.103.32 - 212.35.104.63 gb +212.35.104.64 - 212.35.104.127 be +212.35.104.128 - 212.35.109.255 gb +212.35.110.0 - 212.35.110.255 be +212.35.111.0 - 212.35.112.19 gb +212.35.112.20 - 212.35.112.20 be +212.35.112.21 - 212.35.116.63 gb +212.35.116.64 - 212.35.116.71 be +212.35.116.72 - 212.35.117.191 gb +212.35.117.192 - 212.35.117.199 be +212.35.117.200 - 212.35.120.31 gb +212.35.120.32 - 212.35.120.47 be +212.35.120.48 - 212.35.124.159 gb +212.35.124.160 - 212.35.124.160 be +212.35.124.161 - 212.35.127.255 gb +212.35.128.0 - 212.35.159.255 ro 212.35.160.0 - 212.35.191.255 ru 212.35.192.0 - 212.35.223.255 it 212.35.224.0 - 212.35.255.255 gb 212.36.0.0 - 212.36.31.255 bg 212.36.32.0 - 212.36.63.255 gb 212.36.64.0 - 212.36.95.255 es -212.36.96.0 - 212.36.127.255 gb -212.36.128.0 - 212.36.128.31 fr -212.36.128.32 - 212.36.128.191 gb -212.36.128.192 - 212.36.128.223 be -212.36.128.224 - 212.36.135.255 gb -212.36.136.0 - 212.36.136.31 fr -212.36.136.32 - 212.36.136.95 gb -212.36.136.96 - 212.36.136.127 nl -212.36.136.128 - 212.36.136.247 gb -212.36.136.248 - 212.36.136.255 it -212.36.137.0 - 212.36.145.127 gb -212.36.145.128 - 212.36.145.143 ch -212.36.145.144 - 212.36.155.255 gb -212.36.156.0 - 212.36.156.31 ch -212.36.156.32 - 212.36.178.47 gb -212.36.178.48 - 212.36.178.55 it -212.36.178.56 - 212.36.178.87 gb -212.36.178.88 - 212.36.178.95 de -212.36.178.96 - 212.36.178.111 gb -212.36.178.112 - 212.36.178.119 de -212.36.178.120 - 212.36.178.127 gb -212.36.178.128 - 212.36.178.135 dk -212.36.178.136 - 212.36.178.143 gb -212.36.178.144 - 212.36.178.151 no -212.36.178.152 - 212.36.179.31 gb -212.36.179.32 - 212.36.179.39 it -212.36.179.40 - 212.36.179.63 gb -212.36.179.64 - 212.36.179.71 de -212.36.179.72 - 212.36.179.167 gb -212.36.179.168 - 212.36.179.183 fr -212.36.179.184 - 212.36.179.215 gb -212.36.179.216 - 212.36.179.223 de -212.36.179.224 - 212.36.179.231 fr -212.36.179.232 - 212.36.179.239 gb -212.36.179.240 - 212.36.179.255 fr -212.36.180.0 - 212.36.187.255 gb -212.36.188.0 - 212.36.188.255 de -212.36.189.0 - 212.36.189.255 gb -212.36.190.0 - 212.36.191.255 de +212.36.96.0 - 212.36.191.255 gb 212.36.192.0 - 212.36.223.255 lb 212.36.224.0 - 212.36.255.255 ru -212.37.0.0 - 212.37.31.255 se +212.37.0.0 - 212.37.10.255 se +212.37.11.0 - 212.37.11.127 fi +212.37.11.128 - 212.37.21.143 se +212.37.21.144 - 212.37.21.151 fi +212.37.21.152 - 212.37.21.255 se +212.37.22.0 - 212.37.22.255 fi +212.37.23.0 - 212.37.23.127 se +212.37.23.128 - 212.37.23.159 fi +212.37.23.160 - 212.37.27.71 se +212.37.27.72 - 212.37.27.79 fi +212.37.27.80 - 212.37.28.79 se +212.37.28.80 - 212.37.28.87 fi +212.37.28.88 - 212.37.31.255 se 212.37.32.0 - 212.37.63.255 de 212.37.64.0 - 212.37.95.255 sk 212.37.96.0 - 212.37.127.255 se @@ -139091,17 +110129,11 @@ 212.38.0.0 - 212.38.31.255 de 212.38.32.0 - 212.38.63.255 it 212.38.64.0 - 212.38.95.255 gb -212.38.96.0 - 212.38.96.159 ru -212.38.96.160 - 212.38.96.175 ua -212.38.96.176 - 212.38.109.111 ru -212.38.109.112 - 212.38.109.127 ua -212.38.109.128 - 212.38.109.143 az -212.38.109.144 - 212.38.111.255 ru -212.38.112.0 - 212.38.115.255 az -212.38.116.0 - 212.38.127.255 ru +212.38.96.0 - 212.38.127.255 ru 212.38.128.0 - 212.38.159.255 jo -212.38.160.0 - 212.38.167.255 de -212.38.168.0 - 212.38.191.255 us +212.38.160.0 - 212.38.181.80 gb +212.38.181.81 - 212.38.181.81 at +212.38.181.82 - 212.38.191.255 gb 212.38.192.0 - 212.38.223.255 pl 212.38.224.0 - 212.38.255.255 fi 212.39.0.0 - 212.39.31.255 it @@ -139111,7 +110143,9 @@ 212.39.64.0 - 212.39.95.255 bg 212.39.96.0 - 212.39.127.255 ba 212.39.128.0 - 212.39.159.255 fr -212.39.160.0 - 212.39.191.255 gb +212.39.160.0 - 212.39.168.255 gb +212.39.169.0 - 212.39.169.255 ao +212.39.170.0 - 212.39.191.255 gb 212.39.192.0 - 212.39.223.255 at 212.39.224.0 - 212.39.255.255 gb 212.40.0.0 - 212.40.31.255 ch @@ -139123,39 +110157,11 @@ 212.40.224.0 - 212.40.255.255 es 212.41.0.0 - 212.41.63.255 ru 212.41.64.0 - 212.41.127.255 ch -212.41.128.0 - 212.41.132.31 nl -212.41.132.32 - 212.41.132.63 de -212.41.132.64 - 212.41.132.127 nl -212.41.132.128 - 212.41.132.159 es -212.41.132.160 - 212.41.132.191 nl -212.41.132.192 - 212.41.132.223 es -212.41.132.224 - 212.41.132.231 nl -212.41.132.232 - 212.41.132.239 be -212.41.132.240 - 212.41.132.255 nl -212.41.133.0 - 212.41.133.255 es -212.41.134.0 - 212.41.134.63 nl -212.41.134.64 - 212.41.134.95 es -212.41.134.96 - 212.41.135.111 nl -212.41.135.112 - 212.41.135.127 es -212.41.135.128 - 212.41.136.63 nl -212.41.136.64 - 212.41.136.127 es -212.41.136.128 - 212.41.136.143 nl -212.41.136.144 - 212.41.136.151 es -212.41.136.152 - 212.41.137.31 nl -212.41.137.32 - 212.41.137.63 gb -212.41.137.64 - 212.41.137.95 be -212.41.137.96 - 212.41.137.159 es -212.41.137.160 - 212.41.137.173 nl -212.41.137.174 - 212.41.137.175 es -212.41.137.176 - 212.41.137.183 nl -212.41.137.184 - 212.41.137.191 es -212.41.137.192 - 212.41.142.127 nl -212.41.142.128 - 212.41.142.159 es -212.41.142.160 - 212.41.142.191 gb -212.41.142.192 - 212.41.142.229 nl -212.41.142.230 - 212.41.142.239 es -212.41.142.240 - 212.41.159.255 nl -212.41.160.0 - 212.41.191.255 gb +212.41.128.0 - 212.41.134.175 gb +212.41.134.176 - 212.41.134.191 nl +212.41.134.192 - 212.41.136.175 gb +212.41.136.176 - 212.41.136.183 nl +212.41.136.184 - 212.41.191.255 gb 212.41.192.0 - 212.41.223.255 ch 212.41.224.0 - 212.41.255.255 at 212.42.0.0 - 212.42.31.255 gb @@ -139165,24 +110171,10 @@ 212.42.128.0 - 212.42.159.255 ch 212.42.160.0 - 212.42.191.255 gb 212.42.192.0 - 212.42.223.255 am -212.42.224.0 - 212.42.249.223 de -212.42.249.224 - 212.42.249.255 us -212.42.250.0 - 212.42.255.255 de +212.42.224.0 - 212.42.255.255 de 212.43.0.0 - 212.43.31.255 kw 212.43.32.0 - 212.43.63.255 bg -212.43.64.0 - 212.43.78.175 de -212.43.78.176 - 212.43.78.191 lu -212.43.78.192 - 212.43.79.15 de -212.43.79.16 - 212.43.79.31 lu -212.43.79.32 - 212.43.79.71 de -212.43.79.72 - 212.43.79.79 lu -212.43.79.80 - 212.43.90.255 de -212.43.91.0 - 212.43.91.255 gb -212.43.92.0 - 212.43.92.191 de -212.43.92.192 - 212.43.92.255 lu -212.43.93.0 - 212.43.93.83 de -212.43.93.84 - 212.43.93.87 nl -212.43.93.88 - 212.43.95.255 de +212.43.64.0 - 212.43.95.255 de 212.43.96.0 - 212.43.127.255 it 212.43.128.0 - 212.43.159.255 ch 212.43.160.0 - 212.43.191.255 gb @@ -139191,17 +110183,13 @@ 212.44.64.0 - 212.44.95.255 ru 212.44.96.0 - 212.44.127.255 si 212.44.128.0 - 212.44.159.255 ru -212.44.160.0 - 212.44.192.127 de -212.44.192.128 - 212.44.192.191 ru -212.44.192.192 - 212.44.223.255 de +212.44.160.0 - 212.44.223.255 de 212.44.224.0 - 212.44.255.255 fr 212.45.0.0 - 212.45.31.255 ru 212.45.32.0 - 212.45.63.255 nl 212.45.64.0 - 212.45.95.255 bg 212.45.96.0 - 212.45.103.255 it -212.45.104.0 - 212.45.106.51 de -212.45.106.52 - 212.45.106.55 gb -212.45.106.56 - 212.45.111.255 de +212.45.104.0 - 212.45.111.255 de 212.45.112.0 - 212.45.127.255 dk 212.45.128.0 - 212.45.159.255 it 212.45.160.0 - 212.45.191.255 no @@ -139209,138 +110197,50 @@ 212.45.224.0 - 212.46.31.255 ru 212.46.32.0 - 212.46.63.255 sa 212.46.64.0 - 212.46.95.255 it -212.46.96.0 - 212.46.121.3 de -212.46.121.4 - 212.46.121.7 at -212.46.121.8 - 212.46.121.171 de -212.46.121.172 - 212.46.121.175 nl -212.46.121.176 - 212.46.127.255 de +212.46.96.0 - 212.46.127.255 de 212.46.128.0 - 212.46.159.255 gb 212.46.160.0 - 212.46.191.255 it 212.46.192.0 - 212.46.255.255 ru 212.47.0.0 - 212.47.31.255 cz 212.47.32.0 - 212.47.63.255 it 212.47.64.0 - 212.47.95.255 gb -212.47.96.0 - 212.47.109.63 lt -212.47.109.64 - 212.47.109.79 ch -212.47.109.80 - 212.47.127.255 lt +212.47.96.0 - 212.47.127.255 lt 212.47.128.0 - 212.47.159.255 az 212.47.160.0 - 212.47.191.255 ch -212.47.192.0 - 212.47.193.95 ua -212.47.193.96 - 212.47.193.127 ee -212.47.193.128 - 212.47.194.255 ua -212.47.195.0 - 212.47.195.3 ee -212.47.195.4 - 212.47.195.31 ru -212.47.195.32 - 212.47.195.47 ua -212.47.195.48 - 212.47.195.51 ru -212.47.195.52 - 212.47.195.55 ua -212.47.195.56 - 212.47.195.87 ru -212.47.195.88 - 212.47.196.115 ua -212.47.196.116 - 212.47.196.119 ee -212.47.196.120 - 212.47.197.7 ua -212.47.197.8 - 212.47.197.16 ee -212.47.197.17 - 212.47.197.23 ua -212.47.197.24 - 212.47.197.31 ee -212.47.197.32 - 212.47.197.67 ua -212.47.197.68 - 212.47.197.71 ee -212.47.197.72 - 212.47.197.76 ua -212.47.197.77 - 212.47.197.77 ee -212.47.197.78 - 212.47.197.87 ua -212.47.197.88 - 212.47.197.95 ee -212.47.197.96 - 212.47.197.195 ua -212.47.197.196 - 212.47.197.208 ee -212.47.197.209 - 212.47.197.255 ua -212.47.198.0 - 212.47.199.23 ee -212.47.199.24 - 212.47.199.31 de -212.47.199.32 - 212.47.199.47 se -212.47.199.48 - 212.47.199.55 pl -212.47.199.56 - 212.47.199.63 gb -212.47.199.64 - 212.47.199.79 ru -212.47.199.80 - 212.47.199.255 ua -212.47.200.0 - 212.47.203.59 ee -212.47.203.60 - 212.47.203.63 ua -212.47.203.64 - 212.47.203.79 ee -212.47.203.80 - 212.47.203.95 ua -212.47.203.96 - 212.47.203.103 ee -212.47.203.104 - 212.47.203.119 ua -212.47.203.120 - 212.47.203.127 ee -212.47.203.128 - 212.47.203.223 ua -212.47.203.224 - 212.47.203.231 ee -212.47.203.232 - 212.47.203.239 ua -212.47.203.240 - 212.47.204.7 ee -212.47.204.8 - 212.47.204.15 ua -212.47.204.16 - 212.47.204.31 ee -212.47.204.32 - 212.47.204.223 ua -212.47.204.224 - 212.47.204.255 ee -212.47.205.0 - 212.47.206.255 ua -212.47.207.0 - 212.47.209.143 ee -212.47.209.144 - 212.47.209.191 ua -212.47.209.192 - 212.47.211.3 ee -212.47.211.4 - 212.47.211.15 ua -212.47.211.16 - 212.47.211.43 ee -212.47.211.44 - 212.47.211.127 ua -212.47.211.128 - 212.47.213.255 ee -212.47.214.0 - 212.47.214.31 ua -212.47.214.32 - 212.47.214.47 ee -212.47.214.48 - 212.47.214.127 ua -212.47.214.128 - 212.47.215.3 ee -212.47.215.4 - 212.47.215.5 ua -212.47.215.6 - 212.47.215.27 ee -212.47.215.28 - 212.47.215.31 ua -212.47.215.32 - 212.47.215.115 ee -212.47.215.116 - 212.47.215.119 de -212.47.215.120 - 212.47.215.127 ua -212.47.215.128 - 212.47.215.131 ee -212.47.215.132 - 212.47.215.135 ua -212.47.215.136 - 212.47.215.201 ee -212.47.215.202 - 212.47.215.207 ua -212.47.215.208 - 212.47.215.223 ee -212.47.215.224 - 212.47.215.231 ua -212.47.215.232 - 212.47.215.239 ee -212.47.215.240 - 212.47.215.247 ua -212.47.215.248 - 212.47.216.17 ee -212.47.216.18 - 212.47.216.19 ua -212.47.216.20 - 212.47.216.37 ee -212.47.216.38 - 212.47.216.39 lt -212.47.216.40 - 212.47.216.43 ua -212.47.216.44 - 212.47.216.51 ee -212.47.216.52 - 212.47.216.67 ua -212.47.216.68 - 212.47.216.69 ee -212.47.216.70 - 212.47.216.255 ua -212.47.217.0 - 212.47.217.79 ee -212.47.217.80 - 212.47.217.95 ua -212.47.217.96 - 212.47.218.111 ee -212.47.218.112 - 212.47.218.119 ua -212.47.218.120 - 212.47.219.191 ee -212.47.219.192 - 212.47.219.199 ua -212.47.219.200 - 212.47.219.209 ee -212.47.219.210 - 212.47.219.215 ua -212.47.219.216 - 212.47.219.219 ee -212.47.219.220 - 212.47.219.223 ua -212.47.219.224 - 212.47.222.159 ee -212.47.222.160 - 212.47.222.255 ua -212.47.223.0 - 212.47.223.255 ee +212.47.192.0 - 212.47.193.255 ua +212.47.194.0 - 212.47.195.63 ee +212.47.195.64 - 212.47.195.127 ua +212.47.195.128 - 212.47.196.191 ee +212.47.196.192 - 212.47.205.255 ua +212.47.206.0 - 212.47.206.255 ee +212.47.207.0 - 212.47.207.255 ua +212.47.208.0 - 212.47.223.255 ee 212.47.224.0 - 212.47.255.255 fr 212.48.0.0 - 212.48.31.255 it 212.48.32.0 - 212.48.63.255 ru -212.48.64.0 - 212.48.95.255 il -212.48.96.0 - 212.48.116.255 de -212.48.117.0 - 212.48.117.255 us -212.48.118.0 - 212.48.127.255 de +212.48.64.0 - 212.48.95.255 gb +212.48.96.0 - 212.48.127.255 de 212.48.128.0 - 212.48.159.255 ru -212.48.160.0 - 212.48.160.63 it -212.48.160.64 - 212.48.160.71 nl -212.48.160.72 - 212.48.164.63 it -212.48.164.64 - 212.48.164.95 nl -212.48.164.96 - 212.48.189.255 it -212.48.190.0 - 212.48.190.255 hu -212.48.191.0 - 212.48.191.255 it -212.48.192.0 - 212.48.255.255 ru +212.48.160.0 - 212.48.191.255 it +212.48.192.0 - 212.48.239.255 ru +212.48.240.0 - 212.48.255.255 hu 212.49.0.0 - 212.49.31.255 ee 212.49.32.0 - 212.49.63.255 pl 212.49.64.0 - 212.49.95.255 ke 212.49.96.0 - 212.49.127.255 ru -212.49.128.0 - 212.49.191.255 es -212.49.192.0 - 212.49.255.255 gb +212.49.128.0 - 212.49.135.255 gb +212.49.136.0 - 212.49.136.255 es +212.49.137.0 - 212.49.162.223 gb +212.49.162.224 - 212.49.162.239 es +212.49.162.240 - 212.49.166.79 gb +212.49.166.80 - 212.49.166.87 es +212.49.166.88 - 212.49.166.239 gb +212.49.166.240 - 212.49.166.247 es +212.49.166.248 - 212.49.175.48 gb +212.49.175.49 - 212.49.175.49 es +212.49.175.50 - 212.49.191.143 gb +212.49.191.144 - 212.49.191.151 es +212.49.191.152 - 212.49.255.255 gb 212.50.0.0 - 212.50.31.255 bg 212.50.32.0 - 212.50.63.255 tr 212.50.64.0 - 212.50.95.255 bg @@ -139365,43 +110265,36 @@ 212.52.224.0 - 212.52.255.255 de 212.53.0.0 - 212.53.15.255 be 212.53.16.0 - 212.53.31.255 nl -212.53.32.0 - 212.53.34.255 ru -212.53.35.0 - 212.53.35.255 cz -212.53.36.0 - 212.53.39.255 ru -212.53.40.0 - 212.53.40.255 cz -212.53.41.0 - 212.53.63.255 ru +212.53.32.0 - 212.53.63.255 ru 212.53.64.0 - 212.53.95.255 gb -212.53.96.0 - 212.53.127.255 ch +212.53.96.0 - 212.53.127.255 ee 212.53.128.0 - 212.53.255.255 de 212.54.0.0 - 212.54.31.255 fi 212.54.32.0 - 212.54.63.255 nl 212.54.64.0 - 212.54.95.255 dk 212.54.96.0 - 212.54.127.255 ro -212.54.128.0 - 212.54.191.255 gb +212.54.128.0 - 212.54.144.255 gb +212.54.145.0 - 212.54.154.255 us +212.54.155.0 - 212.54.191.255 gb 212.54.192.0 - 212.54.223.255 gr -212.54.224.0 - 212.54.226.95 ch -212.54.226.96 - 212.54.226.103 it -212.54.226.104 - 212.54.226.111 ch -212.54.226.112 - 212.54.226.127 it -212.54.226.128 - 212.54.255.255 ch +212.54.224.0 - 212.54.255.255 ch 212.55.0.0 - 212.55.31.255 es -212.55.32.0 - 212.55.50.31 fo -212.55.50.32 - 212.55.50.39 dk -212.55.50.40 - 212.55.63.255 fo -212.55.64.0 - 212.55.127.255 ru +212.55.32.0 - 212.55.63.255 fo +212.55.64.0 - 212.55.95.255 ua +212.55.96.0 - 212.55.127.255 ru 212.55.128.0 - 212.55.191.255 pt 212.55.192.0 - 212.55.223.255 ch 212.55.224.0 - 212.55.255.255 sk 212.56.0.0 - 212.56.31.255 bg -212.56.32.0 - 212.56.38.255 gb -212.56.39.0 - 212.56.39.255 us -212.56.40.0 - 212.56.127.255 gb +212.56.32.0 - 212.56.127.255 gb 212.56.128.0 - 212.56.159.255 mt 212.56.160.0 - 212.56.191.255 it 212.56.192.0 - 212.56.223.255 md -212.56.224.0 - 212.56.239.255 lu -212.56.240.0 - 212.56.240.255 eu -212.56.241.0 - 212.56.255.255 lu +212.56.224.0 - 212.56.240.255 lu +212.56.241.0 - 212.56.244.255 de +212.56.245.0 - 212.56.245.255 lu +212.56.246.0 - 212.56.246.255 de +212.56.247.0 - 212.56.255.255 lu 212.57.0.0 - 212.57.31.255 tr 212.57.32.0 - 212.57.39.255 sk 212.57.40.0 - 212.57.47.255 rs @@ -139417,9 +110310,7 @@ 212.58.128.0 - 212.58.159.255 gb 212.58.160.0 - 212.58.191.255 ua 212.58.192.0 - 212.58.223.255 ru -212.58.224.0 - 212.58.239.143 gb -212.58.239.144 - 212.58.239.151 nl -212.58.239.152 - 212.58.255.255 gb +212.58.224.0 - 212.58.255.255 gb 212.59.0.0 - 212.59.31.255 lt 212.59.32.0 - 212.59.63.255 de 212.59.64.0 - 212.59.95.255 gb @@ -139427,2118 +110318,123 @@ 212.59.128.0 - 212.59.191.255 ch 212.59.192.0 - 212.59.223.255 es 212.59.224.0 - 212.59.255.255 pl -212.60.0.0 - 212.60.31.255 de 212.60.32.0 - 212.60.63.255 ch 212.60.64.0 - 212.60.95.255 gm 212.60.96.0 - 212.60.127.255 dk 212.60.128.0 - 212.60.159.255 de 212.60.160.0 - 212.60.191.255 at -212.60.192.0 - 212.60.234.0 de -212.60.234.1 - 212.60.234.1 a2 -212.60.234.2 - 212.60.255.255 de -212.61.0.0 - 212.61.255.23 nl -212.61.255.24 - 212.61.255.31 be -212.61.255.32 - 212.61.255.255 nl +212.60.192.0 - 212.60.255.255 de +212.61.0.0 - 212.61.255.255 nl 212.62.0.0 - 212.62.31.255 gb 212.62.32.0 - 212.62.63.255 rs -212.62.64.0 - 212.62.64.255 de -212.62.65.0 - 212.62.65.63 nl -212.62.65.64 - 212.62.77.175 de -212.62.77.176 - 212.62.77.183 th -212.62.77.184 - 212.62.77.223 de -212.62.77.224 - 212.62.77.231 gb -212.62.77.232 - 212.62.95.255 de +212.62.64.0 - 212.62.95.255 de 212.62.96.0 - 212.62.127.255 sa 212.62.128.0 - 212.62.191.255 fr 212.62.192.0 - 212.62.223.255 de 212.62.224.0 - 212.62.255.255 no 212.63.0.0 - 212.63.31.255 fi -212.63.32.0 - 212.63.69.159 de -212.63.69.160 - 212.63.69.167 ch -212.63.69.168 - 212.63.80.7 de -212.63.80.8 - 212.63.80.15 ch -212.63.80.16 - 212.63.95.255 de +212.63.32.0 - 212.63.95.255 de 212.63.96.0 - 212.63.127.255 es -212.63.128.0 - 212.63.160.3 de -212.63.160.4 - 212.63.160.7 at -212.63.160.8 - 212.63.160.15 de -212.63.160.16 - 212.63.160.19 pt -212.63.160.20 - 212.63.160.23 it -212.63.160.24 - 212.63.160.35 de -212.63.160.36 - 212.63.160.39 es -212.63.160.40 - 212.63.160.47 de -212.63.160.48 - 212.63.160.51 nl -212.63.160.52 - 212.63.160.59 es -212.63.160.60 - 212.63.160.63 be -212.63.160.64 - 212.63.160.67 de -212.63.160.68 - 212.63.160.71 be -212.63.160.72 - 212.63.160.87 de -212.63.160.88 - 212.63.160.91 it -212.63.160.92 - 212.63.160.123 de -212.63.160.124 - 212.63.160.127 be -212.63.160.128 - 212.63.160.135 de -212.63.160.136 - 212.63.160.139 ch -212.63.160.140 - 212.63.160.143 de -212.63.160.144 - 212.63.160.147 dk -212.63.160.148 - 212.63.160.159 de -212.63.160.160 - 212.63.160.163 it -212.63.160.164 - 212.63.160.167 at -212.63.160.168 - 212.63.160.171 es -212.63.160.172 - 212.63.160.175 fr -212.63.160.176 - 212.63.160.183 de -212.63.160.184 - 212.63.160.187 es -212.63.160.188 - 212.63.160.199 de -212.63.160.200 - 212.63.160.207 gr -212.63.160.208 - 212.63.160.215 nl -212.63.160.216 - 212.63.160.231 fr -212.63.160.232 - 212.63.160.235 it -212.63.160.236 - 212.63.160.239 de -212.63.160.240 - 212.63.160.243 it -212.63.160.244 - 212.63.160.247 de -212.63.160.248 - 212.63.160.251 ie -212.63.160.252 - 212.63.160.255 cz -212.63.161.0 - 212.63.161.3 be -212.63.161.4 - 212.63.161.15 de -212.63.161.16 - 212.63.161.19 fr -212.63.161.20 - 212.63.161.23 gb -212.63.161.24 - 212.63.161.27 de -212.63.161.28 - 212.63.161.31 it -212.63.161.32 - 212.63.161.35 fr -212.63.161.36 - 212.63.161.39 de -212.63.161.40 - 212.63.161.43 ch -212.63.161.44 - 212.63.161.47 de -212.63.161.48 - 212.63.161.51 li -212.63.161.52 - 212.63.161.55 fr -212.63.161.56 - 212.63.161.63 de -212.63.161.64 - 212.63.161.67 gb -212.63.161.68 - 212.63.161.71 es -212.63.161.72 - 212.63.161.75 be -212.63.161.76 - 212.63.161.79 es -212.63.161.80 - 212.63.161.83 fr -212.63.161.84 - 212.63.161.87 hu -212.63.161.88 - 212.63.161.91 es -212.63.161.92 - 212.63.161.99 de -212.63.161.100 - 212.63.161.103 ch -212.63.161.104 - 212.63.161.111 de -212.63.161.112 - 212.63.161.115 ch -212.63.161.116 - 212.63.161.119 de -212.63.161.120 - 212.63.161.123 es -212.63.161.124 - 212.63.161.127 gb -212.63.161.128 - 212.63.161.131 br -212.63.161.132 - 212.63.161.135 nl -212.63.161.136 - 212.63.161.139 re -212.63.161.140 - 212.63.161.143 es -212.63.161.144 - 212.63.161.151 de -212.63.161.152 - 212.63.161.155 nl -212.63.161.156 - 212.63.161.159 it -212.63.161.160 - 212.63.161.163 de -212.63.161.164 - 212.63.161.167 at -212.63.161.168 - 212.63.161.175 fr -212.63.161.176 - 212.63.161.179 de -212.63.161.180 - 212.63.161.183 at -212.63.161.184 - 212.63.161.191 de -212.63.161.192 - 212.63.161.195 es -212.63.161.196 - 212.63.161.199 de -212.63.161.200 - 212.63.161.207 be -212.63.161.208 - 212.63.161.211 fr -212.63.161.212 - 212.63.161.215 es -212.63.161.216 - 212.63.161.219 it -212.63.161.220 - 212.63.161.223 de -212.63.161.224 - 212.63.161.231 es -212.63.161.232 - 212.63.161.239 de -212.63.161.240 - 212.63.161.243 be -212.63.161.244 - 212.63.161.247 gb -212.63.161.248 - 212.63.161.251 gr -212.63.161.252 - 212.63.162.11 de -212.63.162.12 - 212.63.162.15 gb -212.63.162.16 - 212.63.162.19 es -212.63.162.20 - 212.63.162.23 be -212.63.162.24 - 212.63.162.27 nl -212.63.162.28 - 212.63.162.31 lu -212.63.162.32 - 212.63.162.35 ch -212.63.162.36 - 212.63.162.39 fr -212.63.162.40 - 212.63.162.43 de -212.63.162.44 - 212.63.162.47 es -212.63.162.48 - 212.63.162.55 de -212.63.162.56 - 212.63.162.59 it -212.63.162.60 - 212.63.162.63 ch -212.63.162.64 - 212.63.162.67 it -212.63.162.68 - 212.63.162.71 fr -212.63.162.72 - 212.63.162.83 de -212.63.162.84 - 212.63.162.87 fr -212.63.162.88 - 212.63.162.91 gb -212.63.162.92 - 212.63.162.95 de -212.63.162.96 - 212.63.162.103 it -212.63.162.104 - 212.63.162.107 at -212.63.162.108 - 212.63.162.111 hu -212.63.162.112 - 212.63.162.115 de -212.63.162.116 - 212.63.162.119 it -212.63.162.120 - 212.63.162.123 fr -212.63.162.124 - 212.63.162.127 es -212.63.162.128 - 212.63.162.131 it -212.63.162.132 - 212.63.162.139 fr -212.63.162.140 - 212.63.162.143 de -212.63.162.144 - 212.63.162.147 fr -212.63.162.148 - 212.63.162.151 be -212.63.162.152 - 212.63.162.155 fr -212.63.162.156 - 212.63.162.159 it -212.63.162.160 - 212.63.162.163 at -212.63.162.164 - 212.63.162.167 de -212.63.162.168 - 212.63.162.171 cy -212.63.162.172 - 212.63.162.175 de -212.63.162.176 - 212.63.162.179 es -212.63.162.180 - 212.63.162.183 fr -212.63.162.184 - 212.63.162.187 ie -212.63.162.188 - 212.63.162.195 de -212.63.162.196 - 212.63.162.199 ch -212.63.162.200 - 212.63.162.203 it -212.63.162.204 - 212.63.162.207 de -212.63.162.208 - 212.63.162.211 pt -212.63.162.212 - 212.63.162.215 gb -212.63.162.216 - 212.63.162.219 de -212.63.162.220 - 212.63.162.223 ch -212.63.162.224 - 212.63.162.231 de -212.63.162.232 - 212.63.162.235 at -212.63.162.236 - 212.63.162.243 gb -212.63.162.244 - 212.63.162.247 fr -212.63.162.248 - 212.63.162.251 at -212.63.162.252 - 212.63.162.255 de -212.63.163.0 - 212.63.163.3 fr -212.63.163.4 - 212.63.163.19 de -212.63.163.20 - 212.63.163.23 be -212.63.163.24 - 212.63.163.39 de -212.63.163.40 - 212.63.163.43 es -212.63.163.44 - 212.63.163.51 de -212.63.163.52 - 212.63.163.55 ch -212.63.163.56 - 212.63.163.59 nl -212.63.163.60 - 212.63.163.79 de -212.63.163.80 - 212.63.163.83 fr -212.63.163.84 - 212.63.163.91 ch -212.63.163.92 - 212.63.163.99 de -212.63.163.100 - 212.63.163.103 es -212.63.163.104 - 212.63.163.107 de -212.63.163.108 - 212.63.163.111 il -212.63.163.112 - 212.63.163.115 ch -212.63.163.116 - 212.63.163.119 de -212.63.163.120 - 212.63.163.123 it -212.63.163.124 - 212.63.163.131 de -212.63.163.132 - 212.63.163.135 gr -212.63.163.136 - 212.63.163.143 de -212.63.163.144 - 212.63.163.147 fr -212.63.163.148 - 212.63.163.151 de -212.63.163.152 - 212.63.163.155 be -212.63.163.156 - 212.63.163.159 sl -212.63.163.160 - 212.63.163.163 de -212.63.163.164 - 212.63.163.167 nl -212.63.163.168 - 212.63.163.171 de -212.63.163.172 - 212.63.163.175 hu -212.63.163.176 - 212.63.163.179 cy -212.63.163.180 - 212.63.163.183 de -212.63.163.184 - 212.63.163.187 fr -212.63.163.188 - 212.63.163.191 ch -212.63.163.192 - 212.63.163.199 es -212.63.163.200 - 212.63.163.203 cz -212.63.163.204 - 212.63.163.207 es -212.63.163.208 - 212.63.163.211 it -212.63.163.212 - 212.63.163.215 de -212.63.163.216 - 212.63.163.219 gb -212.63.163.220 - 212.63.163.223 it -212.63.163.224 - 212.63.163.235 de -212.63.163.236 - 212.63.163.239 fr -212.63.163.240 - 212.63.163.243 de -212.63.163.244 - 212.63.163.247 fr -212.63.163.248 - 212.63.163.251 hu -212.63.163.252 - 212.63.163.255 it -212.63.164.0 - 212.63.164.3 de -212.63.164.4 - 212.63.164.7 ie -212.63.164.8 - 212.63.164.19 de -212.63.164.20 - 212.63.164.23 gb -212.63.164.24 - 212.63.164.27 de -212.63.164.28 - 212.63.164.31 dk -212.63.164.32 - 212.63.164.35 es -212.63.164.36 - 212.63.164.39 it -212.63.164.40 - 212.63.164.43 fr -212.63.164.44 - 212.63.164.47 it -212.63.164.48 - 212.63.164.51 gr -212.63.164.52 - 212.63.164.55 ch -212.63.164.56 - 212.63.164.59 ma -212.63.164.60 - 212.63.164.63 gb -212.63.164.64 - 212.63.164.67 fr -212.63.164.68 - 212.63.164.71 ch -212.63.164.72 - 212.63.164.75 de -212.63.164.76 - 212.63.164.79 at -212.63.164.80 - 212.63.164.83 sm -212.63.164.84 - 212.63.164.87 pl -212.63.164.88 - 212.63.164.91 at -212.63.164.92 - 212.63.164.95 de -212.63.164.96 - 212.63.164.103 gb -212.63.164.104 - 212.63.164.111 de -212.63.164.112 - 212.63.164.119 it -212.63.164.120 - 212.63.164.139 de -212.63.164.140 - 212.63.164.143 dk -212.63.164.144 - 212.63.164.147 it -212.63.164.148 - 212.63.164.151 no -212.63.164.152 - 212.63.164.155 fr -212.63.164.156 - 212.63.164.159 gb -212.63.164.160 - 212.63.164.163 es -212.63.164.164 - 212.63.164.167 be -212.63.164.168 - 212.63.164.171 de -212.63.164.172 - 212.63.164.175 es -212.63.164.176 - 212.63.164.179 pl -212.63.164.180 - 212.63.164.183 de -212.63.164.184 - 212.63.164.187 fr -212.63.164.188 - 212.63.164.191 de -212.63.164.192 - 212.63.164.195 dk -212.63.164.196 - 212.63.164.199 it -212.63.164.200 - 212.63.164.207 de -212.63.164.208 - 212.63.164.211 ie -212.63.164.212 - 212.63.164.219 fr -212.63.164.220 - 212.63.164.223 ch -212.63.164.224 - 212.63.164.235 de -212.63.164.236 - 212.63.164.239 it -212.63.164.240 - 212.63.164.243 nl -212.63.164.244 - 212.63.164.247 gb -212.63.164.248 - 212.63.164.255 es -212.63.165.0 - 212.63.165.3 de -212.63.165.4 - 212.63.165.7 gb -212.63.165.8 - 212.63.165.11 it -212.63.165.12 - 212.63.165.15 de -212.63.165.16 - 212.63.165.19 fr -212.63.165.20 - 212.63.165.23 nl -212.63.165.24 - 212.63.165.27 it -212.63.165.28 - 212.63.165.31 es -212.63.165.32 - 212.63.165.39 de -212.63.165.40 - 212.63.165.43 it -212.63.165.44 - 212.63.165.51 es -212.63.165.52 - 212.63.165.59 de -212.63.165.60 - 212.63.165.63 pt -212.63.165.64 - 212.63.165.67 it -212.63.165.68 - 212.63.165.75 de -212.63.165.76 - 212.63.165.79 fr -212.63.165.80 - 212.63.165.83 it -212.63.165.84 - 212.63.165.87 nl -212.63.165.88 - 212.63.165.91 lu -212.63.165.92 - 212.63.165.95 es -212.63.165.96 - 212.63.165.99 de -212.63.165.100 - 212.63.165.103 nl -212.63.165.104 - 212.63.165.107 de -212.63.165.108 - 212.63.165.115 gb -212.63.165.116 - 212.63.165.123 de -212.63.165.124 - 212.63.165.127 es -212.63.165.128 - 212.63.165.131 gr -212.63.165.132 - 212.63.165.135 ch -212.63.165.136 - 212.63.165.139 it -212.63.165.140 - 212.63.165.151 de -212.63.165.152 - 212.63.165.155 at -212.63.165.156 - 212.63.165.163 nl -212.63.165.164 - 212.63.165.167 de -212.63.165.168 - 212.63.165.171 nl -212.63.165.172 - 212.63.165.175 de -212.63.165.176 - 212.63.165.179 fr -212.63.165.180 - 212.63.165.183 lu -212.63.165.184 - 212.63.165.187 it -212.63.165.188 - 212.63.165.195 de -212.63.165.196 - 212.63.165.199 dk -212.63.165.200 - 212.63.165.203 es -212.63.165.204 - 212.63.165.207 pl -212.63.165.208 - 212.63.165.219 de -212.63.165.220 - 212.63.165.223 it -212.63.165.224 - 212.63.165.227 fr -212.63.165.228 - 212.63.165.231 ch -212.63.165.232 - 212.63.165.235 fr -212.63.165.236 - 212.63.165.239 de -212.63.165.240 - 212.63.165.243 fr -212.63.165.244 - 212.63.165.247 de -212.63.165.248 - 212.63.165.251 gr -212.63.165.252 - 212.63.166.3 fr -212.63.166.4 - 212.63.166.7 gb -212.63.166.8 - 212.63.166.15 fr -212.63.166.16 - 212.63.166.19 nl -212.63.166.20 - 212.63.166.23 gb -212.63.166.24 - 212.63.166.27 be -212.63.166.28 - 212.63.166.31 it -212.63.166.32 - 212.63.166.35 de -212.63.166.36 - 212.63.166.39 be -212.63.166.40 - 212.63.166.43 at -212.63.166.44 - 212.63.166.47 it -212.63.166.48 - 212.63.166.51 fr -212.63.166.52 - 212.63.166.63 de -212.63.166.64 - 212.63.166.67 be -212.63.166.68 - 212.63.166.71 fr -212.63.166.72 - 212.63.166.75 de -212.63.166.76 - 212.63.166.79 gb -212.63.166.80 - 212.63.166.91 de -212.63.166.92 - 212.63.166.95 it -212.63.166.96 - 212.63.166.99 dk -212.63.166.100 - 212.63.166.103 es -212.63.166.104 - 212.63.166.107 it -212.63.166.108 - 212.63.166.111 de -212.63.166.112 - 212.63.166.115 nl -212.63.166.116 - 212.63.166.119 de -212.63.166.120 - 212.63.166.123 es +212.63.128.0 - 212.63.166.123 de 212.63.166.124 - 212.63.166.127 gb -212.63.166.128 - 212.63.166.131 it -212.63.166.132 - 212.63.166.135 es -212.63.166.136 - 212.63.166.139 ch -212.63.166.140 - 212.63.166.143 fr -212.63.166.144 - 212.63.166.147 de -212.63.166.148 - 212.63.166.151 it -212.63.166.152 - 212.63.166.155 ma -212.63.166.156 - 212.63.166.159 de -212.63.166.160 - 212.63.166.163 nl -212.63.166.164 - 212.63.166.167 gb -212.63.166.168 - 212.63.166.171 de -212.63.166.172 - 212.63.166.175 se -212.63.166.176 - 212.63.166.179 fr -212.63.166.180 - 212.63.166.187 de -212.63.166.188 - 212.63.166.195 it -212.63.166.196 - 212.63.166.199 fr -212.63.166.200 - 212.63.166.203 at -212.63.166.204 - 212.63.166.207 gb -212.63.166.208 - 212.63.166.215 es -212.63.166.216 - 212.63.166.219 dk -212.63.166.220 - 212.63.166.223 gr -212.63.166.224 - 212.63.166.227 nl -212.63.166.228 - 212.63.166.231 de -212.63.166.232 - 212.63.166.235 es -212.63.166.236 - 212.63.166.239 de -212.63.166.240 - 212.63.166.247 it -212.63.166.248 - 212.63.166.251 fr -212.63.166.252 - 212.63.167.3 de -212.63.167.4 - 212.63.167.7 se -212.63.167.8 - 212.63.167.11 es -212.63.167.12 - 212.63.167.19 it -212.63.167.20 - 212.63.167.23 pt -212.63.167.24 - 212.63.167.27 be +212.63.166.128 - 212.63.167.27 de 212.63.167.28 - 212.63.167.31 gb -212.63.167.32 - 212.63.167.35 fr -212.63.167.36 - 212.63.167.39 ie -212.63.167.40 - 212.63.167.43 nl -212.63.167.44 - 212.63.167.47 es -212.63.167.48 - 212.63.167.55 de -212.63.167.56 - 212.63.167.59 dk -212.63.167.60 - 212.63.167.67 de -212.63.167.68 - 212.63.167.71 ch -212.63.167.72 - 212.63.167.75 ie -212.63.167.76 - 212.63.167.79 se -212.63.167.80 - 212.63.167.83 dk -212.63.167.84 - 212.63.167.87 is -212.63.167.88 - 212.63.167.95 de -212.63.167.96 - 212.63.167.99 ch -212.63.167.100 - 212.63.167.103 it -212.63.167.104 - 212.63.167.107 de -212.63.167.108 - 212.63.167.111 fr -212.63.167.112 - 212.63.167.115 de -212.63.167.116 - 212.63.167.119 fr -212.63.167.120 - 212.63.167.123 de -212.63.167.124 - 212.63.167.127 in -212.63.167.128 - 212.63.167.131 de -212.63.167.132 - 212.63.167.135 es -212.63.167.136 - 212.63.167.147 gb -212.63.167.148 - 212.63.167.155 de -212.63.167.156 - 212.63.167.159 ch -212.63.167.160 - 212.63.167.163 be -212.63.167.164 - 212.63.167.167 es -212.63.167.168 - 212.63.167.171 de -212.63.167.172 - 212.63.167.175 es -212.63.167.176 - 212.63.167.179 de -212.63.167.180 - 212.63.167.183 gb -212.63.167.184 - 212.63.167.187 fr -212.63.167.188 - 212.63.167.191 es -212.63.167.192 - 212.63.167.195 de -212.63.167.196 - 212.63.167.199 it -212.63.167.200 - 212.63.167.203 at -212.63.167.204 - 212.63.167.207 se -212.63.167.208 - 212.63.167.211 no -212.63.167.212 - 212.63.167.223 de -212.63.167.224 - 212.63.167.227 dk -212.63.167.228 - 212.63.167.231 fr -212.63.167.232 - 212.63.167.235 gb -212.63.167.236 - 212.63.167.239 de -212.63.167.240 - 212.63.167.243 it -212.63.167.244 - 212.63.167.247 de -212.63.167.248 - 212.63.167.251 gb -212.63.167.252 - 212.63.167.255 gr -212.63.168.0 - 212.63.168.19 de -212.63.168.20 - 212.63.168.23 es -212.63.168.24 - 212.63.168.31 de -212.63.168.32 - 212.63.168.35 fr -212.63.168.36 - 212.63.168.39 ch -212.63.168.40 - 212.63.168.43 gb -212.63.168.44 - 212.63.168.55 de -212.63.168.56 - 212.63.168.59 gb -212.63.168.60 - 212.63.168.63 es -212.63.168.64 - 212.63.168.67 nl -212.63.168.68 - 212.63.168.71 be -212.63.168.72 - 212.63.168.75 gb -212.63.168.76 - 212.63.168.79 be -212.63.168.80 - 212.63.168.83 no -212.63.168.84 - 212.63.168.87 de -212.63.168.88 - 212.63.168.91 gb -212.63.168.92 - 212.63.168.95 nl -212.63.168.96 - 212.63.168.103 de -212.63.168.104 - 212.63.168.111 fr -212.63.168.112 - 212.63.168.115 gb -212.63.168.116 - 212.63.168.119 it -212.63.168.120 - 212.63.168.123 de -212.63.168.124 - 212.63.168.127 it -212.63.168.128 - 212.63.168.131 fr -212.63.168.132 - 212.63.168.135 gb -212.63.168.136 - 212.63.168.139 de -212.63.168.140 - 212.63.168.143 ch -212.63.168.144 - 212.63.168.147 fr -212.63.168.148 - 212.63.168.155 de -212.63.168.156 - 212.63.168.159 fr -212.63.168.160 - 212.63.168.167 de -212.63.168.168 - 212.63.168.171 nl -212.63.168.172 - 212.63.168.175 no -212.63.168.176 - 212.63.168.179 fr -212.63.168.180 - 212.63.168.183 es -212.63.168.184 - 212.63.168.187 be -212.63.168.188 - 212.63.168.203 de -212.63.168.204 - 212.63.168.219 gb -212.63.168.220 - 212.63.168.223 de -212.63.168.224 - 212.63.168.227 es -212.63.168.228 - 212.63.168.231 fr -212.63.168.232 - 212.63.168.235 nl -212.63.168.236 - 212.63.168.239 es -212.63.168.240 - 212.63.168.243 fr -212.63.168.244 - 212.63.168.247 no -212.63.168.248 - 212.63.168.251 fr -212.63.168.252 - 212.63.168.255 nl -212.63.169.0 - 212.63.169.3 de -212.63.169.4 - 212.63.169.7 es -212.63.169.8 - 212.63.169.11 gb -212.63.169.12 - 212.63.169.19 de -212.63.169.20 - 212.63.169.23 it -212.63.169.24 - 212.63.169.27 be -212.63.169.28 - 212.63.169.31 ch -212.63.169.32 - 212.63.169.35 be -212.63.169.36 - 212.63.169.43 de -212.63.169.44 - 212.63.169.47 at -212.63.169.48 - 212.63.169.51 gb -212.63.169.52 - 212.63.169.55 nl -212.63.169.56 - 212.63.169.59 bg -212.63.169.60 - 212.63.169.63 de -212.63.169.64 - 212.63.169.67 es -212.63.169.68 - 212.63.169.71 it -212.63.169.72 - 212.63.169.75 es -212.63.169.76 - 212.63.169.79 de -212.63.169.80 - 212.63.169.83 gb -212.63.169.84 - 212.63.169.87 de -212.63.169.88 - 212.63.169.95 fr -212.63.169.96 - 212.63.169.107 de -212.63.169.108 - 212.63.169.111 ch -212.63.169.112 - 212.63.169.123 de -212.63.169.124 - 212.63.169.127 dk -212.63.169.128 - 212.63.169.131 it -212.63.169.132 - 212.63.169.135 de -212.63.169.136 - 212.63.169.139 lu -212.63.169.140 - 212.63.169.143 fr -212.63.169.144 - 212.63.169.147 de -212.63.169.148 - 212.63.169.151 dk -212.63.169.152 - 212.63.169.159 de -212.63.169.160 - 212.63.169.163 nl -212.63.169.164 - 212.63.169.167 de -212.63.169.168 - 212.63.169.171 gb -212.63.169.172 - 212.63.169.175 be -212.63.169.176 - 212.63.169.179 fr -212.63.169.180 - 212.63.169.183 gb -212.63.169.184 - 212.63.169.187 it -212.63.169.188 - 212.63.169.191 de -212.63.169.192 - 212.63.169.195 nl -212.63.169.196 - 212.63.169.199 es -212.63.169.200 - 212.63.169.203 ch -212.63.169.204 - 212.63.169.211 de -212.63.169.212 - 212.63.169.215 gb -212.63.169.216 - 212.63.169.223 de -212.63.169.224 - 212.63.169.227 it -212.63.169.228 - 212.63.169.231 de -212.63.169.232 - 212.63.169.235 is -212.63.169.236 - 212.63.169.239 gb -212.63.169.240 - 212.63.169.243 es -212.63.169.244 - 212.63.169.247 be -212.63.169.248 - 212.63.170.3 de -212.63.170.4 - 212.63.170.7 fr -212.63.170.8 - 212.63.170.15 de -212.63.170.16 - 212.63.170.19 fr -212.63.170.20 - 212.63.170.23 de -212.63.170.24 - 212.63.170.27 nl -212.63.170.28 - 212.63.170.35 de -212.63.170.36 - 212.63.170.39 hu -212.63.170.40 - 212.63.170.43 at -212.63.170.44 - 212.63.170.47 be -212.63.170.48 - 212.63.170.51 de -212.63.170.52 - 212.63.170.55 es -212.63.170.56 - 212.63.170.63 de -212.63.170.64 - 212.63.170.67 gb -212.63.170.68 - 212.63.170.71 de -212.63.170.72 - 212.63.170.75 it -212.63.170.76 - 212.63.170.79 es -212.63.170.80 - 212.63.170.83 de -212.63.170.84 - 212.63.170.91 es -212.63.170.92 - 212.63.170.95 se -212.63.170.96 - 212.63.170.99 be -212.63.170.100 - 212.63.170.103 es -212.63.170.104 - 212.63.170.111 de -212.63.170.112 - 212.63.170.115 hu -212.63.170.116 - 212.63.170.119 es -212.63.170.120 - 212.63.170.123 fr -212.63.170.124 - 212.63.170.127 at -212.63.170.128 - 212.63.170.131 de -212.63.170.132 - 212.63.170.139 it -212.63.170.140 - 212.63.170.147 fr -212.63.170.148 - 212.63.170.151 it -212.63.170.152 - 212.63.170.163 de -212.63.170.164 - 212.63.170.167 it -212.63.170.168 - 212.63.170.171 tr -212.63.170.172 - 212.63.170.175 gb -212.63.170.176 - 212.63.170.179 de -212.63.170.180 - 212.63.170.183 es -212.63.170.184 - 212.63.170.187 nl -212.63.170.188 - 212.63.170.191 de -212.63.170.192 - 212.63.170.195 pl -212.63.170.196 - 212.63.170.199 it -212.63.170.200 - 212.63.170.203 nl -212.63.170.204 - 212.63.170.207 dk -212.63.170.208 - 212.63.170.211 fr -212.63.170.212 - 212.63.170.215 bh -212.63.170.216 - 212.63.170.219 ma -212.63.170.220 - 212.63.170.227 de -212.63.170.228 - 212.63.170.239 es -212.63.170.240 - 212.63.170.243 de -212.63.170.244 - 212.63.170.247 it -212.63.170.248 - 212.63.171.3 pt -212.63.171.4 - 212.63.171.7 de -212.63.171.8 - 212.63.171.11 fr -212.63.171.12 - 212.63.171.15 gr -212.63.171.16 - 212.63.171.19 es -212.63.171.20 - 212.63.171.23 it -212.63.171.24 - 212.63.171.27 at -212.63.171.28 - 212.63.171.31 de -212.63.171.32 - 212.63.171.39 fr -212.63.171.40 - 212.63.171.43 de -212.63.171.44 - 212.63.171.47 gb -212.63.171.48 - 212.63.171.51 de -212.63.171.52 - 212.63.171.55 it -212.63.171.56 - 212.63.171.71 de -212.63.171.72 - 212.63.171.75 gb -212.63.171.76 - 212.63.171.79 de -212.63.171.80 - 212.63.171.83 it -212.63.171.84 - 212.63.171.87 fr -212.63.171.88 - 212.63.171.91 no -212.63.171.92 - 212.63.171.111 de -212.63.171.112 - 212.63.171.119 ch -212.63.171.120 - 212.63.171.123 es -212.63.171.124 - 212.63.171.127 ru -212.63.171.128 - 212.63.171.131 be -212.63.171.132 - 212.63.171.135 es -212.63.171.136 - 212.63.171.139 de -212.63.171.140 - 212.63.171.143 ch -212.63.171.144 - 212.63.171.147 es -212.63.171.148 - 212.63.171.151 hu -212.63.171.152 - 212.63.171.159 fr -212.63.171.160 - 212.63.171.163 es -212.63.171.164 - 212.63.171.167 de -212.63.171.168 - 212.63.171.175 es -212.63.171.176 - 212.63.171.179 it -212.63.171.180 - 212.63.171.187 de -212.63.171.188 - 212.63.171.191 nl -212.63.171.192 - 212.63.171.199 de -212.63.171.200 - 212.63.171.203 fr -212.63.171.204 - 212.63.171.207 de -212.63.171.208 - 212.63.171.211 ch -212.63.171.212 - 212.63.171.215 dk -212.63.171.216 - 212.63.171.219 de -212.63.171.220 - 212.63.171.223 fr -212.63.171.224 - 212.63.171.227 it -212.63.171.228 - 212.63.171.231 es -212.63.171.232 - 212.63.171.235 de -212.63.171.236 - 212.63.171.243 fr -212.63.171.244 - 212.63.171.247 de -212.63.171.248 - 212.63.171.251 gb -212.63.171.252 - 212.63.171.254 es -212.63.171.255 - 212.63.172.7 de -212.63.172.8 - 212.63.172.11 dk -212.63.172.12 - 212.63.172.27 de -212.63.172.28 - 212.63.172.31 be -212.63.172.32 - 212.63.172.35 it -212.63.172.36 - 212.63.172.39 gb -212.63.172.40 - 212.63.172.43 fr -212.63.172.44 - 212.63.172.51 de -212.63.172.52 - 212.63.172.55 fr -212.63.172.56 - 212.63.172.59 de -212.63.172.60 - 212.63.172.63 gr -212.63.172.64 - 212.63.172.71 es -212.63.172.72 - 212.63.172.75 nl -212.63.172.76 - 212.63.172.83 it -212.63.172.84 - 212.63.172.87 be -212.63.172.88 - 212.63.172.91 de -212.63.172.92 - 212.63.172.95 be -212.63.172.96 - 212.63.172.99 nl -212.63.172.100 - 212.63.172.103 lu -212.63.172.104 - 212.63.172.107 de -212.63.172.108 - 212.63.172.111 es -212.63.172.112 - 212.63.172.115 de -212.63.172.116 - 212.63.172.119 it -212.63.172.120 - 212.63.172.123 lu -212.63.172.124 - 212.63.172.127 be -212.63.172.128 - 212.63.172.135 it -212.63.172.136 - 212.63.172.139 gb -212.63.172.140 - 212.63.172.143 de -212.63.172.144 - 212.63.172.147 ch -212.63.172.148 - 212.63.172.151 es -212.63.172.152 - 212.63.172.159 gb -212.63.172.160 - 212.63.172.171 de -212.63.172.172 - 212.63.172.175 fr -212.63.172.176 - 212.63.172.179 de -212.63.172.180 - 212.63.172.183 es -212.63.172.184 - 212.63.172.187 de -212.63.172.188 - 212.63.172.191 ch -212.63.172.192 - 212.63.172.195 de -212.63.172.196 - 212.63.172.199 hu -212.63.172.200 - 212.63.172.203 de -212.63.172.204 - 212.63.172.207 fr -212.63.172.208 - 212.63.172.211 at -212.63.172.212 - 212.63.172.215 tr -212.63.172.216 - 212.63.172.219 at -212.63.172.220 - 212.63.172.223 fr -212.63.172.224 - 212.63.172.227 tr -212.63.172.228 - 212.63.172.231 es -212.63.172.232 - 212.63.172.235 gb -212.63.172.236 - 212.63.172.239 at -212.63.172.240 - 212.63.172.243 it -212.63.172.244 - 212.63.172.247 ch -212.63.172.248 - 212.63.172.251 be -212.63.172.252 - 212.63.172.255 es -212.63.173.0 - 212.63.173.3 it -212.63.173.4 - 212.63.173.7 es -212.63.173.8 - 212.63.173.11 de -212.63.173.12 - 212.63.173.15 it -212.63.173.16 - 212.63.173.23 de -212.63.173.24 - 212.63.173.27 it -212.63.173.28 - 212.63.173.31 pl -212.63.173.32 - 212.63.173.35 gb -212.63.173.36 - 212.63.173.39 de -212.63.173.40 - 212.63.173.43 fr -212.63.173.44 - 212.63.173.47 de -212.63.173.48 - 212.63.173.51 es -212.63.173.52 - 212.63.173.55 de -212.63.173.56 - 212.63.173.59 ch -212.63.173.60 - 212.63.173.67 de -212.63.173.68 - 212.63.173.71 be -212.63.173.72 - 212.63.173.75 de -212.63.173.76 - 212.63.173.79 it -212.63.173.80 - 212.63.173.83 se -212.63.173.84 - 212.63.173.87 at -212.63.173.88 - 212.63.173.91 de -212.63.173.92 - 212.63.173.95 ae -212.63.173.96 - 212.63.173.103 de -212.63.173.104 - 212.63.173.107 es -212.63.173.108 - 212.63.173.111 de -212.63.173.112 - 212.63.173.115 gb -212.63.173.116 - 212.63.173.135 de -212.63.173.136 - 212.63.173.139 be -212.63.173.140 - 212.63.173.151 it -212.63.173.152 - 212.63.173.155 pl -212.63.173.156 - 212.63.173.159 dk -212.63.173.160 - 212.63.173.163 ch -212.63.173.164 - 212.63.173.167 it -212.63.173.168 - 212.63.173.171 es -212.63.173.172 - 212.63.173.175 de -212.63.173.176 - 212.63.173.179 gr -212.63.173.180 - 212.63.173.183 de -212.63.173.184 - 212.63.173.187 fr -212.63.173.188 - 212.63.173.191 pl -212.63.173.192 - 212.63.173.195 no -212.63.173.196 - 212.63.173.199 es -212.63.173.200 - 212.63.173.203 hr -212.63.173.204 - 212.63.173.207 cy -212.63.173.208 - 212.63.173.211 be -212.63.173.212 - 212.63.173.227 de -212.63.173.228 - 212.63.173.231 es -212.63.173.232 - 212.63.173.247 de -212.63.173.248 - 212.63.173.251 pl -212.63.173.252 - 212.63.174.6 de -212.63.174.7 - 212.63.174.7 es -212.63.174.8 - 212.63.174.9 de -212.63.174.10 - 212.63.174.11 es -212.63.174.12 - 212.63.174.12 dk -212.63.174.13 - 212.63.174.13 il -212.63.174.14 - 212.63.174.14 de -212.63.174.15 - 212.63.174.15 it -212.63.174.16 - 212.63.174.16 de -212.63.174.17 - 212.63.174.17 ch -212.63.174.18 - 212.63.174.18 es -212.63.174.19 - 212.63.174.21 de -212.63.174.22 - 212.63.174.22 fr -212.63.174.23 - 212.63.174.23 hu -212.63.174.24 - 212.63.174.25 de -212.63.174.26 - 212.63.174.26 be -212.63.174.27 - 212.63.174.27 ru -212.63.174.28 - 212.63.174.28 be -212.63.174.29 - 212.63.174.29 es -212.63.174.30 - 212.63.174.32 de -212.63.174.33 - 212.63.174.33 es -212.63.174.34 - 212.63.174.34 ch -212.63.174.35 - 212.63.174.35 de -212.63.174.36 - 212.63.174.36 es -212.63.174.37 - 212.63.174.37 ch -212.63.174.38 - 212.63.174.38 de -212.63.174.39 - 212.63.174.41 hu -212.63.174.42 - 212.63.174.42 ie -212.63.174.43 - 212.63.174.43 ch -212.63.174.44 - 212.63.174.45 de -212.63.174.46 - 212.63.174.46 es -212.63.174.47 - 212.63.174.47 it -212.63.174.48 - 212.63.174.48 hu -212.63.174.49 - 212.63.174.50 de -212.63.174.51 - 212.63.174.51 fr -212.63.174.52 - 212.63.174.53 de -212.63.174.54 - 212.63.174.54 fr -212.63.174.55 - 212.63.174.55 it -212.63.174.56 - 212.63.174.56 no -212.63.174.57 - 212.63.174.57 be -212.63.174.58 - 212.63.174.58 gr -212.63.174.59 - 212.63.174.59 de -212.63.174.60 - 212.63.174.60 pl -212.63.174.61 - 212.63.174.61 fr -212.63.174.62 - 212.63.174.62 gb -212.63.174.63 - 212.63.174.63 fr -212.63.174.64 - 212.63.174.64 es -212.63.174.65 - 212.63.174.65 de -212.63.174.66 - 212.63.174.66 es -212.63.174.67 - 212.63.174.67 it -212.63.174.68 - 212.63.174.68 es -212.63.174.69 - 212.63.174.69 be -212.63.174.70 - 212.63.174.71 de -212.63.174.72 - 212.63.174.73 ch -212.63.174.74 - 212.63.174.74 it -212.63.174.75 - 212.63.174.75 pl -212.63.174.76 - 212.63.174.76 gb -212.63.174.77 - 212.63.174.77 de -212.63.174.78 - 212.63.174.79 es -212.63.174.80 - 212.63.174.80 it -212.63.174.81 - 212.63.174.81 dk -212.63.174.82 - 212.63.174.82 es -212.63.174.83 - 212.63.174.83 pt -212.63.174.84 - 212.63.174.84 it -212.63.174.85 - 212.63.174.88 de -212.63.174.89 - 212.63.174.89 es -212.63.174.90 - 212.63.174.90 at -212.63.174.91 - 212.63.174.91 de -212.63.174.92 - 212.63.174.93 it -212.63.174.94 - 212.63.174.94 de -212.63.174.95 - 212.63.174.95 pt -212.63.174.96 - 212.63.174.96 at -212.63.174.97 - 212.63.174.97 it -212.63.174.98 - 212.63.174.98 il -212.63.174.99 - 212.63.174.100 de -212.63.174.101 - 212.63.174.101 it -212.63.174.102 - 212.63.174.103 de -212.63.174.104 - 212.63.174.104 at -212.63.174.105 - 212.63.174.106 es -212.63.174.107 - 212.63.174.107 fr -212.63.174.108 - 212.63.174.108 de -212.63.174.109 - 212.63.174.109 fr -212.63.174.110 - 212.63.174.110 pl -212.63.174.111 - 212.63.174.114 de -212.63.174.115 - 212.63.174.115 es -212.63.174.116 - 212.63.174.117 de -212.63.174.118 - 212.63.174.118 es -212.63.174.119 - 212.63.174.119 fr -212.63.174.120 - 212.63.174.120 de -212.63.174.121 - 212.63.174.122 gr -212.63.174.123 - 212.63.174.123 de -212.63.174.124 - 212.63.174.126 nl -212.63.174.127 - 212.63.174.128 fr -212.63.174.129 - 212.63.174.129 pl -212.63.174.130 - 212.63.174.130 ee -212.63.174.131 - 212.63.174.131 ch -212.63.174.132 - 212.63.174.133 nl -212.63.174.134 - 212.63.174.134 es -212.63.174.135 - 212.63.174.135 fr -212.63.174.136 - 212.63.174.136 gb -212.63.174.137 - 212.63.174.137 fr -212.63.174.138 - 212.63.174.138 de -212.63.174.139 - 212.63.174.139 fr -212.63.174.140 - 212.63.174.140 pl -212.63.174.141 - 212.63.174.141 ch -212.63.174.142 - 212.63.174.143 de -212.63.174.144 - 212.63.174.144 gr -212.63.174.145 - 212.63.174.145 ch -212.63.174.146 - 212.63.174.146 at -212.63.174.147 - 212.63.174.147 gb -212.63.174.148 - 212.63.174.148 be -212.63.174.149 - 212.63.174.149 de -212.63.174.150 - 212.63.174.150 es -212.63.174.151 - 212.63.174.151 gb -212.63.174.152 - 212.63.174.152 de -212.63.174.153 - 212.63.174.153 es -212.63.174.154 - 212.63.174.154 fr -212.63.174.155 - 212.63.174.155 de -212.63.174.156 - 212.63.174.156 es -212.63.174.157 - 212.63.174.157 ie -212.63.174.158 - 212.63.174.158 de -212.63.174.159 - 212.63.174.159 it -212.63.174.160 - 212.63.174.160 cz -212.63.174.161 - 212.63.174.161 de -212.63.174.162 - 212.63.174.162 gb -212.63.174.163 - 212.63.174.163 de -212.63.174.164 - 212.63.174.165 it -212.63.174.166 - 212.63.174.166 gb -212.63.174.167 - 212.63.174.167 it -212.63.174.168 - 212.63.174.168 es -212.63.174.169 - 212.63.174.169 fr -212.63.174.170 - 212.63.174.170 gb -212.63.174.171 - 212.63.174.171 de -212.63.174.172 - 212.63.174.172 fr -212.63.174.173 - 212.63.174.173 it -212.63.174.174 - 212.63.174.174 de -212.63.174.175 - 212.63.174.175 fr -212.63.174.176 - 212.63.174.176 gr -212.63.174.177 - 212.63.174.177 es -212.63.174.178 - 212.63.174.178 fr -212.63.174.179 - 212.63.174.179 es -212.63.174.180 - 212.63.174.182 de -212.63.174.183 - 212.63.174.183 nl -212.63.174.184 - 212.63.174.186 fr -212.63.174.187 - 212.63.174.188 it -212.63.174.189 - 212.63.174.189 es -212.63.174.190 - 212.63.174.190 it -212.63.174.191 - 212.63.174.191 de -212.63.174.192 - 212.63.174.192 ru -212.63.174.193 - 212.63.174.193 es -212.63.174.194 - 212.63.174.194 fr -212.63.174.195 - 212.63.174.195 gb -212.63.174.196 - 212.63.174.196 de -212.63.174.197 - 212.63.174.197 fr -212.63.174.198 - 212.63.174.198 es -212.63.174.199 - 212.63.174.199 it -212.63.174.200 - 212.63.174.200 fr -212.63.174.201 - 212.63.174.202 de -212.63.174.203 - 212.63.174.203 es -212.63.174.204 - 212.63.174.205 de -212.63.174.206 - 212.63.174.207 it -212.63.174.208 - 212.63.174.208 pl -212.63.174.209 - 212.63.174.209 de -212.63.174.210 - 212.63.174.210 es -212.63.174.211 - 212.63.174.211 it -212.63.174.212 - 212.63.174.212 gb -212.63.174.213 - 212.63.174.213 it -212.63.174.214 - 212.63.174.214 ch -212.63.174.215 - 212.63.174.215 es -212.63.174.216 - 212.63.174.216 it -212.63.174.217 - 212.63.174.217 gb -212.63.174.218 - 212.63.174.218 de -212.63.174.219 - 212.63.174.219 nl -212.63.174.220 - 212.63.174.220 de -212.63.174.221 - 212.63.174.221 ch -212.63.174.222 - 212.63.174.222 ru -212.63.174.223 - 212.63.174.225 de -212.63.174.226 - 212.63.174.227 it -212.63.174.228 - 212.63.174.231 de -212.63.174.232 - 212.63.174.232 es -212.63.174.233 - 212.63.174.233 it -212.63.174.234 - 212.63.174.234 be -212.63.174.235 - 212.63.174.235 nl -212.63.174.236 - 212.63.174.237 de -212.63.174.238 - 212.63.174.238 es -212.63.174.239 - 212.63.174.239 fr -212.63.174.240 - 212.63.174.240 nl -212.63.174.241 - 212.63.174.241 ch -212.63.174.242 - 212.63.174.242 it -212.63.174.243 - 212.63.174.243 es -212.63.174.244 - 212.63.174.244 fr -212.63.174.245 - 212.63.174.245 de -212.63.174.246 - 212.63.174.246 be -212.63.174.247 - 212.63.174.247 se -212.63.174.248 - 212.63.174.248 it -212.63.174.249 - 212.63.174.250 de -212.63.174.251 - 212.63.174.251 it -212.63.174.252 - 212.63.174.252 de -212.63.174.253 - 212.63.174.253 es -212.63.174.254 - 212.63.174.254 be -212.63.174.255 - 212.63.175.1 de -212.63.175.2 - 212.63.175.2 gb -212.63.175.3 - 212.63.175.5 de -212.63.175.6 - 212.63.175.7 it -212.63.175.8 - 212.63.175.8 de -212.63.175.9 - 212.63.175.9 gr -212.63.175.10 - 212.63.175.10 de -212.63.175.11 - 212.63.175.11 at -212.63.175.12 - 212.63.175.12 fr -212.63.175.13 - 212.63.175.15 de -212.63.175.16 - 212.63.175.16 es -212.63.175.17 - 212.63.175.17 gb -212.63.175.18 - 212.63.175.18 de -212.63.175.19 - 212.63.175.20 es -212.63.175.21 - 212.63.175.23 de -212.63.175.24 - 212.63.175.24 fr -212.63.175.25 - 212.63.175.25 es -212.63.175.26 - 212.63.175.26 ch -212.63.175.27 - 212.63.175.27 gb -212.63.175.28 - 212.63.175.31 de -212.63.175.32 - 212.63.175.32 gb -212.63.175.33 - 212.63.175.33 de -212.63.175.34 - 212.63.175.34 es -212.63.175.35 - 212.63.175.35 nl -212.63.175.36 - 212.63.175.36 be -212.63.175.37 - 212.63.175.37 de -212.63.175.38 - 212.63.175.38 be -212.63.175.39 - 212.63.175.39 ch -212.63.175.40 - 212.63.175.40 it -212.63.175.41 - 212.63.175.41 de -212.63.175.42 - 212.63.175.42 nl -212.63.175.43 - 212.63.175.43 de -212.63.175.44 - 212.63.175.44 be -212.63.175.45 - 212.63.175.45 de -212.63.175.46 - 212.63.175.47 es -212.63.175.48 - 212.63.175.48 it -212.63.175.49 - 212.63.175.49 es -212.63.175.50 - 212.63.175.50 nl -212.63.175.51 - 212.63.175.51 de -212.63.175.52 - 212.63.175.52 it -212.63.175.53 - 212.63.175.53 es -212.63.175.54 - 212.63.175.55 de -212.63.175.56 - 212.63.175.56 fr -212.63.175.57 - 212.63.175.57 de -212.63.175.58 - 212.63.175.58 gb -212.63.175.59 - 212.63.175.59 fr -212.63.175.60 - 212.63.175.60 de -212.63.175.61 - 212.63.175.61 hu -212.63.175.62 - 212.63.175.62 ch -212.63.175.63 - 212.63.175.63 fr -212.63.175.64 - 212.63.175.64 de -212.63.175.65 - 212.63.175.65 es -212.63.175.66 - 212.63.175.66 it -212.63.175.67 - 212.63.175.67 fr -212.63.175.68 - 212.63.175.68 no -212.63.175.69 - 212.63.175.70 nl -212.63.175.71 - 212.63.175.72 de -212.63.175.73 - 212.63.175.73 gb -212.63.175.74 - 212.63.175.74 se -212.63.175.75 - 212.63.175.75 de -212.63.175.76 - 212.63.175.76 fr -212.63.175.77 - 212.63.175.77 es -212.63.175.78 - 212.63.175.78 fr -212.63.175.79 - 212.63.175.79 no -212.63.175.80 - 212.63.175.80 fr -212.63.175.81 - 212.63.175.81 de -212.63.175.82 - 212.63.175.82 es -212.63.175.83 - 212.63.175.83 be -212.63.175.84 - 212.63.175.84 ch -212.63.175.85 - 212.63.175.85 pt -212.63.175.86 - 212.63.175.86 de -212.63.175.87 - 212.63.175.87 gb -212.63.175.88 - 212.63.175.90 de -212.63.175.91 - 212.63.175.91 pl -212.63.175.92 - 212.63.175.92 gb -212.63.175.93 - 212.63.175.94 de -212.63.175.95 - 212.63.175.96 gb -212.63.175.97 - 212.63.175.97 es -212.63.175.98 - 212.63.175.99 it -212.63.175.100 - 212.63.175.100 es -212.63.175.101 - 212.63.175.101 ch -212.63.175.102 - 212.63.175.102 fr -212.63.175.103 - 212.63.175.103 nl -212.63.175.104 - 212.63.175.104 es -212.63.175.105 - 212.63.175.105 fr -212.63.175.106 - 212.63.175.106 no -212.63.175.107 - 212.63.175.107 it -212.63.175.108 - 212.63.175.108 ch -212.63.175.109 - 212.63.175.109 it -212.63.175.110 - 212.63.175.111 de -212.63.175.112 - 212.63.175.112 be -212.63.175.113 - 212.63.175.113 at -212.63.175.114 - 212.63.175.114 ch -212.63.175.115 - 212.63.175.115 es -212.63.175.116 - 212.63.175.116 be -212.63.175.117 - 212.63.175.117 de -212.63.175.118 - 212.63.175.118 it -212.63.175.119 - 212.63.175.119 gb -212.63.175.120 - 212.63.175.120 nl -212.63.175.121 - 212.63.175.121 bg -212.63.175.122 - 212.63.175.122 de -212.63.175.123 - 212.63.175.126 es -212.63.175.127 - 212.63.175.127 de -212.63.175.128 - 212.63.175.128 es -212.63.175.129 - 212.63.175.129 de -212.63.175.130 - 212.63.175.130 gb -212.63.175.131 - 212.63.175.131 de -212.63.175.132 - 212.63.175.133 fr -212.63.175.134 - 212.63.175.134 gb -212.63.175.135 - 212.63.175.135 it -212.63.175.136 - 212.63.175.139 de -212.63.175.140 - 212.63.175.140 ch -212.63.175.141 - 212.63.175.141 es -212.63.175.142 - 212.63.175.147 de -212.63.175.148 - 212.63.175.148 dk -212.63.175.149 - 212.63.175.150 de -212.63.175.151 - 212.63.175.151 it -212.63.175.152 - 212.63.175.152 de -212.63.175.153 - 212.63.175.153 lu -212.63.175.154 - 212.63.175.155 es -212.63.175.156 - 212.63.175.157 de -212.63.175.158 - 212.63.175.158 lu -212.63.175.159 - 212.63.175.159 de -212.63.175.160 - 212.63.175.160 dk -212.63.175.161 - 212.63.175.161 de -212.63.175.162 - 212.63.175.162 gb -212.63.175.163 - 212.63.175.164 de -212.63.175.165 - 212.63.175.165 nl -212.63.175.166 - 212.63.175.166 it -212.63.175.167 - 212.63.175.167 de -212.63.175.168 - 212.63.175.168 fr -212.63.175.169 - 212.63.175.169 de -212.63.175.170 - 212.63.175.170 ch -212.63.175.171 - 212.63.175.172 de -212.63.175.173 - 212.63.175.173 hu -212.63.175.174 - 212.63.175.174 by -212.63.175.175 - 212.63.175.175 fr -212.63.175.176 - 212.63.175.176 be -212.63.175.177 - 212.63.175.177 de -212.63.175.178 - 212.63.175.178 gb -212.63.175.179 - 212.63.175.179 de -212.63.175.180 - 212.63.175.180 be -212.63.175.181 - 212.63.175.181 nl -212.63.175.182 - 212.63.175.182 de -212.63.175.183 - 212.63.175.183 nl -212.63.175.184 - 212.63.175.184 es -212.63.175.185 - 212.63.175.186 de -212.63.175.187 - 212.63.175.187 si -212.63.175.188 - 212.63.175.188 gb -212.63.175.189 - 212.63.175.189 de -212.63.175.190 - 212.63.175.190 hu -212.63.175.191 - 212.63.175.191 fr -212.63.175.192 - 212.63.175.192 it -212.63.175.193 - 212.63.175.193 de -212.63.175.194 - 212.63.175.194 is -212.63.175.195 - 212.63.175.195 fr -212.63.175.196 - 212.63.175.196 de -212.63.175.197 - 212.63.175.197 es -212.63.175.198 - 212.63.175.198 de -212.63.175.199 - 212.63.175.199 gb -212.63.175.200 - 212.63.175.202 it -212.63.175.203 - 212.63.175.203 hu -212.63.175.204 - 212.63.175.204 de -212.63.175.205 - 212.63.175.205 gb -212.63.175.206 - 212.63.175.206 de -212.63.175.207 - 212.63.175.207 fr -212.63.175.208 - 212.63.175.208 gb -212.63.175.209 - 212.63.175.210 fr -212.63.175.211 - 212.63.175.212 de -212.63.175.213 - 212.63.175.213 fr -212.63.175.214 - 212.63.175.214 no -212.63.175.215 - 212.63.175.215 be -212.63.175.216 - 212.63.175.216 it -212.63.175.217 - 212.63.175.217 dk -212.63.175.218 - 212.63.175.218 es -212.63.175.219 - 212.63.175.220 de -212.63.175.221 - 212.63.175.221 nl -212.63.175.222 - 212.63.175.222 de -212.63.175.223 - 212.63.175.223 es -212.63.175.224 - 212.63.175.224 it -212.63.175.225 - 212.63.175.225 fr -212.63.175.226 - 212.63.175.226 es -212.63.175.227 - 212.63.175.227 de -212.63.175.228 - 212.63.175.228 it -212.63.175.229 - 212.63.175.229 nl -212.63.175.230 - 212.63.175.230 hu -212.63.175.231 - 212.63.175.231 at -212.63.175.232 - 212.63.175.232 sk -212.63.175.233 - 212.63.175.233 pl -212.63.175.234 - 212.63.175.234 fr -212.63.175.235 - 212.63.175.236 es -212.63.175.237 - 212.63.175.239 de -212.63.175.240 - 212.63.175.240 at -212.63.175.241 - 212.63.175.242 it -212.63.175.243 - 212.63.175.243 ch -212.63.175.244 - 212.63.175.244 es -212.63.175.245 - 212.63.175.245 gb -212.63.175.246 - 212.63.175.247 de -212.63.175.248 - 212.63.175.248 it -212.63.175.249 - 212.63.175.250 de -212.63.175.251 - 212.63.175.251 fr -212.63.175.252 - 212.63.175.252 de +212.63.167.32 - 212.63.175.6 de +212.63.175.7 - 212.63.175.7 it +212.63.175.8 - 212.63.175.154 de +212.63.175.155 - 212.63.175.155 es +212.63.175.156 - 212.63.175.252 de 212.63.175.253 - 212.63.175.253 es -212.63.175.254 - 212.63.176.1 de -212.63.176.2 - 212.63.176.2 fr -212.63.176.3 - 212.63.176.4 es -212.63.176.5 - 212.63.176.5 se -212.63.176.6 - 212.63.176.6 be -212.63.176.7 - 212.63.176.7 de -212.63.176.8 - 212.63.176.8 es -212.63.176.9 - 212.63.176.9 at -212.63.176.10 - 212.63.176.10 es -212.63.176.11 - 212.63.176.11 dk -212.63.176.12 - 212.63.176.12 de -212.63.176.13 - 212.63.176.13 it -212.63.176.14 - 212.63.176.14 de -212.63.176.15 - 212.63.176.15 hu -212.63.176.16 - 212.63.176.16 ch -212.63.176.17 - 212.63.176.17 es -212.63.176.18 - 212.63.176.18 fr +212.63.175.254 - 212.63.176.18 de 212.63.176.19 - 212.63.176.19 es -212.63.176.20 - 212.63.176.20 de -212.63.176.21 - 212.63.176.21 pl -212.63.176.22 - 212.63.176.22 it -212.63.176.23 - 212.63.176.23 es -212.63.176.24 - 212.63.176.24 fr -212.63.176.25 - 212.63.176.27 it -212.63.176.28 - 212.63.176.28 de -212.63.176.29 - 212.63.176.29 gb -212.63.176.30 - 212.63.176.30 de -212.63.176.31 - 212.63.176.31 es -212.63.176.32 - 212.63.176.32 de -212.63.176.33 - 212.63.176.33 nl -212.63.176.34 - 212.63.176.35 de -212.63.176.36 - 212.63.176.36 at -212.63.176.37 - 212.63.176.37 de -212.63.176.38 - 212.63.176.38 it -212.63.176.39 - 212.63.176.39 de -212.63.176.40 - 212.63.176.40 it -212.63.176.41 - 212.63.176.41 de -212.63.176.42 - 212.63.176.42 gb -212.63.176.43 - 212.63.176.43 de -212.63.176.44 - 212.63.176.44 pt -212.63.176.45 - 212.63.176.45 dk -212.63.176.46 - 212.63.176.46 de -212.63.176.47 - 212.63.176.48 nl -212.63.176.49 - 212.63.176.50 de -212.63.176.51 - 212.63.176.51 pl -212.63.176.52 - 212.63.176.52 dk -212.63.176.53 - 212.63.176.53 fr -212.63.176.54 - 212.63.176.55 de -212.63.176.56 - 212.63.176.56 bh -212.63.176.57 - 212.63.176.57 se -212.63.176.58 - 212.63.176.58 ma -212.63.176.59 - 212.63.176.59 fr -212.63.176.60 - 212.63.176.61 de -212.63.176.62 - 212.63.176.64 es -212.63.176.65 - 212.63.176.66 de -212.63.176.67 - 212.63.176.67 gr -212.63.176.68 - 212.63.176.68 nl -212.63.176.69 - 212.63.176.69 it -212.63.176.70 - 212.63.176.70 fr -212.63.176.71 - 212.63.176.71 pt -212.63.176.72 - 212.63.176.72 de -212.63.176.73 - 212.63.176.73 pt -212.63.176.74 - 212.63.176.74 it -212.63.176.75 - 212.63.176.75 de -212.63.176.76 - 212.63.176.76 se -212.63.176.77 - 212.63.176.77 de -212.63.176.78 - 212.63.176.78 fr -212.63.176.79 - 212.63.176.79 gr -212.63.176.80 - 212.63.176.81 ch -212.63.176.82 - 212.63.176.82 de -212.63.176.83 - 212.63.176.83 it -212.63.176.84 - 212.63.176.84 de -212.63.176.85 - 212.63.176.85 at -212.63.176.86 - 212.63.176.86 de -212.63.176.87 - 212.63.176.87 fr -212.63.176.88 - 212.63.176.88 de -212.63.176.89 - 212.63.176.89 ch -212.63.176.90 - 212.63.176.90 li -212.63.176.91 - 212.63.176.93 de -212.63.176.94 - 212.63.176.94 nl -212.63.176.95 - 212.63.176.95 de -212.63.176.96 - 212.63.176.96 it -212.63.176.97 - 212.63.176.97 pl -212.63.176.98 - 212.63.176.98 nl -212.63.176.99 - 212.63.176.99 de -212.63.176.100 - 212.63.176.100 gb -212.63.176.101 - 212.63.176.101 fr -212.63.176.102 - 212.63.176.103 de -212.63.176.104 - 212.63.176.105 it -212.63.176.106 - 212.63.176.110 de -212.63.176.111 - 212.63.176.111 es -212.63.176.112 - 212.63.176.112 gb -212.63.176.113 - 212.63.176.113 de -212.63.176.114 - 212.63.176.114 nl -212.63.176.115 - 212.63.176.115 it -212.63.176.116 - 212.63.176.116 fr -212.63.176.117 - 212.63.176.117 no -212.63.176.118 - 212.63.176.120 de -212.63.176.121 - 212.63.176.121 gr -212.63.176.122 - 212.63.176.122 pt -212.63.176.123 - 212.63.176.124 de -212.63.176.125 - 212.63.176.125 fr -212.63.176.126 - 212.63.176.126 de -212.63.176.127 - 212.63.176.127 pl -212.63.176.128 - 212.63.176.128 de -212.63.176.129 - 212.63.176.129 pl -212.63.176.130 - 212.63.176.132 de -212.63.176.133 - 212.63.176.133 gb -212.63.176.134 - 212.63.176.134 de -212.63.176.135 - 212.63.176.135 it -212.63.176.136 - 212.63.176.136 de -212.63.176.137 - 212.63.176.137 es -212.63.176.138 - 212.63.176.138 hu -212.63.176.139 - 212.63.176.139 be -212.63.176.140 - 212.63.176.140 it -212.63.176.141 - 212.63.176.141 de -212.63.176.142 - 212.63.176.142 cz -212.63.176.143 - 212.63.176.143 ie -212.63.176.144 - 212.63.176.144 no -212.63.176.145 - 212.63.176.145 gb -212.63.176.146 - 212.63.176.146 it -212.63.176.147 - 212.63.176.147 fr -212.63.176.148 - 212.63.176.148 de -212.63.176.149 - 212.63.176.149 se -212.63.176.150 - 212.63.176.150 cy -212.63.176.151 - 212.63.176.152 de -212.63.176.153 - 212.63.176.153 fr -212.63.176.154 - 212.63.176.154 nl -212.63.176.155 - 212.63.176.155 it -212.63.176.156 - 212.63.176.158 de -212.63.176.159 - 212.63.176.159 fr -212.63.176.160 - 212.63.176.164 de -212.63.176.165 - 212.63.176.165 es -212.63.176.166 - 212.63.176.166 de -212.63.176.167 - 212.63.176.167 be -212.63.176.168 - 212.63.176.170 de -212.63.176.171 - 212.63.176.171 es -212.63.176.172 - 212.63.176.172 dk -212.63.176.173 - 212.63.176.173 it -212.63.176.174 - 212.63.176.174 de -212.63.176.175 - 212.63.176.175 it -212.63.176.176 - 212.63.176.177 de -212.63.176.178 - 212.63.176.178 fr -212.63.176.179 - 212.63.176.179 de -212.63.176.180 - 212.63.176.180 it -212.63.176.181 - 212.63.176.181 de -212.63.176.182 - 212.63.176.182 dk -212.63.176.183 - 212.63.176.183 de -212.63.176.184 - 212.63.176.184 ch -212.63.176.185 - 212.63.176.185 fr -212.63.176.186 - 212.63.176.186 it -212.63.176.187 - 212.63.176.187 hu -212.63.176.188 - 212.63.176.188 es -212.63.176.189 - 212.63.176.189 de -212.63.176.190 - 212.63.176.190 es -212.63.176.191 - 212.63.176.191 dk -212.63.176.192 - 212.63.176.194 de -212.63.176.195 - 212.63.176.195 es -212.63.176.196 - 212.63.176.196 it -212.63.176.197 - 212.63.176.197 ch -212.63.176.198 - 212.63.176.198 de -212.63.176.199 - 212.63.176.199 it -212.63.176.200 - 212.63.176.201 fr -212.63.176.202 - 212.63.176.202 pt -212.63.176.203 - 212.63.176.203 de -212.63.176.204 - 212.63.176.204 fr -212.63.176.205 - 212.63.176.205 it -212.63.176.206 - 212.63.176.206 de -212.63.176.207 - 212.63.176.207 gr -212.63.176.208 - 212.63.176.211 de +212.63.176.20 - 212.63.176.211 de 212.63.176.212 - 212.63.176.212 es -212.63.176.213 - 212.63.176.213 nl -212.63.176.214 - 212.63.176.214 dk -212.63.176.215 - 212.63.176.217 fr -212.63.176.218 - 212.63.176.220 de -212.63.176.221 - 212.63.176.221 ch -212.63.176.222 - 212.63.176.222 de -212.63.176.223 - 212.63.176.223 no -212.63.176.224 - 212.63.176.224 de -212.63.176.225 - 212.63.176.225 gb -212.63.176.226 - 212.63.176.226 de +212.63.176.213 - 212.63.176.226 de 212.63.176.227 - 212.63.176.227 gb -212.63.176.228 - 212.63.176.228 be -212.63.176.229 - 212.63.176.229 cz -212.63.176.230 - 212.63.176.230 lu -212.63.176.231 - 212.63.176.231 cz -212.63.176.232 - 212.63.176.232 fr -212.63.176.233 - 212.63.176.233 de -212.63.176.234 - 212.63.176.234 nl -212.63.176.235 - 212.63.176.241 de -212.63.176.242 - 212.63.176.242 gb -212.63.176.243 - 212.63.176.243 de -212.63.176.244 - 212.63.176.244 gb -212.63.176.245 - 212.63.176.249 de -212.63.176.250 - 212.63.176.250 be -212.63.176.251 - 212.63.176.251 es -212.63.176.252 - 212.63.176.252 de -212.63.176.253 - 212.63.176.253 lu -212.63.176.254 - 212.63.176.255 de -212.63.177.0 - 212.63.177.3 br -212.63.177.4 - 212.63.177.7 de -212.63.177.8 - 212.63.177.15 us -212.63.177.16 - 212.63.177.19 ca -212.63.177.20 - 212.63.177.23 de -212.63.177.24 - 212.63.177.27 cl -212.63.177.28 - 212.63.177.31 mx -212.63.177.32 - 212.63.177.43 us -212.63.177.44 - 212.63.177.47 ca -212.63.177.48 - 212.63.177.51 us -212.63.177.52 - 212.63.177.55 mx -212.63.177.56 - 212.63.177.63 us -212.63.177.64 - 212.63.177.67 pe -212.63.177.68 - 212.63.177.71 de -212.63.177.72 - 212.63.177.75 us -212.63.177.76 - 212.63.177.103 de -212.63.177.104 - 212.63.177.107 us -212.63.177.108 - 212.63.177.111 de +212.63.176.228 - 212.63.177.35 de +212.63.177.36 - 212.63.177.39 us +212.63.177.40 - 212.63.177.111 de 212.63.177.112 - 212.63.177.115 us -212.63.177.116 - 212.63.177.119 de -212.63.177.120 - 212.63.177.127 us -212.63.177.128 - 212.63.177.151 de -212.63.177.152 - 212.63.177.159 us -212.63.177.160 - 212.63.177.163 mx -212.63.177.164 - 212.63.177.167 us -212.63.177.168 - 212.63.177.171 mx -212.63.177.172 - 212.63.177.187 de -212.63.177.188 - 212.63.177.191 us -212.63.177.192 - 212.63.177.195 de -212.63.177.196 - 212.63.177.199 us -212.63.177.200 - 212.63.177.207 de -212.63.177.208 - 212.63.177.211 us -212.63.177.212 - 212.63.177.215 cl -212.63.177.216 - 212.63.177.231 de -212.63.177.232 - 212.63.177.235 us -212.63.177.236 - 212.63.177.247 de -212.63.177.248 - 212.63.178.7 us -212.63.178.8 - 212.63.178.11 de -212.63.178.12 - 212.63.178.31 us -212.63.178.32 - 212.63.178.35 mx -212.63.178.36 - 212.63.178.39 ar -212.63.178.40 - 212.63.178.47 us -212.63.178.48 - 212.63.178.51 br -212.63.178.52 - 212.63.178.55 pa -212.63.178.56 - 212.63.178.59 us -212.63.178.60 - 212.63.178.63 ca -212.63.178.64 - 212.63.178.67 us -212.63.178.68 - 212.63.178.71 de -212.63.178.72 - 212.63.178.75 bo -212.63.178.76 - 212.63.178.79 de -212.63.178.80 - 212.63.178.83 ca -212.63.178.84 - 212.63.178.87 de -212.63.178.88 - 212.63.178.91 br -212.63.178.92 - 212.63.178.99 us -212.63.178.100 - 212.63.178.103 it +212.63.177.116 - 212.63.178.11 de +212.63.178.12 - 212.63.178.15 us +212.63.178.16 - 212.63.178.103 de 212.63.178.104 - 212.63.178.107 us -212.63.178.108 - 212.63.178.111 ca -212.63.178.112 - 212.63.178.115 us -212.63.178.116 - 212.63.178.119 mx -212.63.178.120 - 212.63.178.139 us -212.63.178.140 - 212.63.178.143 co -212.63.178.144 - 212.63.178.147 br -212.63.178.148 - 212.63.178.151 pe -212.63.178.152 - 212.63.178.155 de -212.63.178.156 - 212.63.178.167 us -212.63.178.168 - 212.63.178.171 co -212.63.178.172 - 212.63.178.179 us -212.63.178.180 - 212.63.178.183 mx -212.63.178.184 - 212.63.178.187 us -212.63.178.188 - 212.63.178.195 ar -212.63.178.196 - 212.63.178.211 us -212.63.178.212 - 212.63.178.215 co -212.63.178.216 - 212.63.178.223 us -212.63.178.224 - 212.63.178.227 gt -212.63.178.228 - 212.63.178.231 ca -212.63.178.232 - 212.63.178.235 do -212.63.178.236 - 212.63.178.239 ar -212.63.178.240 - 212.63.178.243 br -212.63.178.244 - 212.63.178.247 de -212.63.178.248 - 212.63.178.251 ar -212.63.178.252 - 212.63.178.255 de -212.63.179.0 - 212.63.179.11 us -212.63.179.12 - 212.63.179.15 pr -212.63.179.16 - 212.63.179.19 ca -212.63.179.20 - 212.63.179.27 de -212.63.179.28 - 212.63.179.31 us -212.63.179.32 - 212.63.179.35 sg -212.63.179.36 - 212.63.179.47 us -212.63.179.48 - 212.63.179.51 de -212.63.179.52 - 212.63.179.63 us -212.63.179.64 - 212.63.179.67 de -212.63.179.68 - 212.63.179.75 us -212.63.179.76 - 212.63.179.76 ar -212.63.179.77 - 212.63.179.79 de -212.63.179.80 - 212.63.179.83 ca -212.63.179.84 - 212.63.179.87 br -212.63.179.88 - 212.63.179.91 us -212.63.179.92 - 212.63.179.95 ar -212.63.179.96 - 212.63.179.103 us +212.63.178.108 - 212.63.179.7 de +212.63.179.8 - 212.63.179.11 us +212.63.179.12 - 212.63.179.103 de 212.63.179.104 - 212.63.179.107 ca -212.63.179.108 - 212.63.179.135 us -212.63.179.136 - 212.63.179.139 de -212.63.179.140 - 212.63.179.147 us -212.63.179.148 - 212.63.179.151 mx -212.63.179.152 - 212.63.179.167 us -212.63.179.168 - 212.63.179.171 br -212.63.179.172 - 212.63.179.175 mx -212.63.179.176 - 212.63.179.179 us -212.63.179.180 - 212.63.179.183 es -212.63.179.184 - 212.63.179.191 us -212.63.179.192 - 212.63.179.195 br -212.63.179.196 - 212.63.179.219 us -212.63.179.220 - 212.63.179.223 ca -212.63.179.224 - 212.63.179.231 us -212.63.179.232 - 212.63.179.235 ec -212.63.179.236 - 212.63.179.239 us -212.63.179.240 - 212.63.179.243 cl -212.63.179.244 - 212.63.179.247 de -212.63.179.248 - 212.63.179.251 ca -212.63.179.252 - 212.63.179.255 de -212.63.180.0 - 212.63.180.3 tr -212.63.180.4 - 212.63.180.7 es -212.63.180.8 - 212.63.180.11 tr -212.63.180.12 - 212.63.180.15 hu -212.63.180.16 - 212.63.180.19 tr -212.63.180.20 - 212.63.180.23 de -212.63.180.24 - 212.63.180.27 fr -212.63.180.28 - 212.63.180.31 tr -212.63.180.32 - 212.63.180.35 kz -212.63.180.36 - 212.63.180.39 gr -212.63.180.40 - 212.63.180.47 tr -212.63.180.48 - 212.63.180.51 de -212.63.180.52 - 212.63.180.55 sa -212.63.180.56 - 212.63.180.59 tr -212.63.180.60 - 212.63.180.63 cu -212.63.180.64 - 212.63.180.67 zw -212.63.180.68 - 212.63.180.71 tr -212.63.180.72 - 212.63.180.75 il -212.63.180.76 - 212.63.180.79 zw -212.63.180.80 - 212.63.180.83 sk -212.63.180.84 - 212.63.180.87 tr -212.63.180.88 - 212.63.180.91 kz -212.63.180.92 - 212.63.180.95 tr -212.63.180.96 - 212.63.180.103 fr -212.63.180.104 - 212.63.180.107 gr -212.63.180.108 - 212.63.180.115 tr -212.63.180.116 - 212.63.180.119 mz -212.63.180.120 - 212.63.180.127 tr -212.63.180.128 - 212.63.180.131 mz -212.63.180.132 - 212.63.180.139 de -212.63.180.140 - 212.63.180.143 es -212.63.180.144 - 212.63.180.147 fr -212.63.180.148 - 212.63.180.151 nl -212.63.180.152 - 212.63.180.155 es -212.63.180.156 - 212.63.180.159 gb -212.63.180.160 - 212.63.180.163 es -212.63.180.164 - 212.63.180.167 fr -212.63.180.168 - 212.63.180.171 de -212.63.180.172 - 212.63.180.175 es -212.63.180.176 - 212.63.180.183 it -212.63.180.184 - 212.63.180.187 de -212.63.180.188 - 212.63.180.191 ie -212.63.180.192 - 212.63.180.195 de -212.63.180.196 - 212.63.180.199 it -212.63.180.200 - 212.63.180.203 tr -212.63.180.204 - 212.63.180.207 de -212.63.180.208 - 212.63.180.215 fr -212.63.180.216 - 212.63.180.219 nl -212.63.180.220 - 212.63.180.223 dk -212.63.180.224 - 212.63.180.231 fr -212.63.180.232 - 212.63.180.235 de -212.63.180.236 - 212.63.180.239 es -212.63.180.240 - 212.63.180.243 sa -212.63.180.244 - 212.63.180.247 es -212.63.180.248 - 212.63.180.251 ch -212.63.180.252 - 212.63.180.255 de -212.63.181.0 - 212.63.181.3 tw -212.63.181.4 - 212.63.181.7 sg -212.63.181.8 - 212.63.181.11 my -212.63.181.12 - 212.63.181.23 sg -212.63.181.24 - 212.63.181.27 my -212.63.181.28 - 212.63.181.31 cn -212.63.181.32 - 212.63.181.35 my -212.63.181.36 - 212.63.181.39 sg -212.63.181.40 - 212.63.181.47 cn -212.63.181.48 - 212.63.181.51 my -212.63.181.52 - 212.63.181.55 sg -212.63.181.56 - 212.63.181.59 tw -212.63.181.60 - 212.63.181.63 sg -212.63.181.64 - 212.63.181.67 in -212.63.181.68 - 212.63.181.71 my -212.63.181.72 - 212.63.181.75 sg -212.63.181.76 - 212.63.181.79 cn -212.63.181.80 - 212.63.181.91 in -212.63.181.92 - 212.63.181.95 sg -212.63.181.96 - 212.63.181.99 my -212.63.181.100 - 212.63.181.103 sg -212.63.181.104 - 212.63.181.107 my -212.63.181.108 - 212.63.181.111 in -212.63.181.112 - 212.63.181.115 sg -212.63.181.116 - 212.63.181.119 de -212.63.181.120 - 212.63.181.131 in -212.63.181.132 - 212.63.181.135 my -212.63.181.136 - 212.63.181.139 in -212.63.181.140 - 212.63.181.143 cn -212.63.181.144 - 212.63.181.147 sg -212.63.181.148 - 212.63.181.151 tw -212.63.181.152 - 212.63.181.163 in -212.63.181.164 - 212.63.181.167 sg -212.63.181.168 - 212.63.181.171 my -212.63.181.172 - 212.63.181.179 in -212.63.181.180 - 212.63.181.187 cn -212.63.181.188 - 212.63.181.195 in -212.63.181.196 - 212.63.181.199 sg -212.63.181.200 - 212.63.181.203 cn -212.63.181.204 - 212.63.181.207 sg -212.63.181.208 - 212.63.181.211 my -212.63.181.212 - 212.63.181.215 tw -212.63.181.216 - 212.63.181.219 sg -212.63.181.220 - 212.63.181.223 in -212.63.181.224 - 212.63.181.227 cn -212.63.181.228 - 212.63.181.235 sg -212.63.181.236 - 212.63.181.239 tw -212.63.181.240 - 212.63.181.243 my -212.63.181.244 - 212.63.181.247 sg -212.63.181.248 - 212.63.181.251 in -212.63.181.252 - 212.63.181.255 sg -212.63.182.0 - 212.63.182.1 de -212.63.182.2 - 212.63.182.4 au -212.63.182.5 - 212.63.182.5 nz -212.63.182.6 - 212.63.182.15 au -212.63.182.16 - 212.63.182.16 de -212.63.182.17 - 212.63.182.17 au -212.63.182.18 - 212.63.182.39 de -212.63.182.40 - 212.63.182.40 au -212.63.182.41 - 212.63.182.42 de -212.63.182.43 - 212.63.182.43 au -212.63.182.44 - 212.63.182.52 de -212.63.182.53 - 212.63.182.53 au -212.63.182.54 - 212.63.182.54 in -212.63.182.55 - 212.63.182.57 au -212.63.182.58 - 212.63.182.75 de -212.63.182.76 - 212.63.182.79 in -212.63.182.80 - 212.63.182.115 de -212.63.182.116 - 212.63.182.119 au -212.63.182.120 - 212.63.182.123 de -212.63.182.124 - 212.63.182.127 au -212.63.182.128 - 212.63.182.203 jp -212.63.182.204 - 212.63.182.207 th -212.63.182.208 - 212.63.182.251 jp -212.63.182.252 - 212.63.182.255 th -212.63.183.0 - 212.63.183.1 de -212.63.183.2 - 212.63.183.2 my -212.63.183.3 - 212.63.183.3 tw -212.63.183.4 - 212.63.183.4 cn -212.63.183.5 - 212.63.183.5 sg -212.63.183.6 - 212.63.183.6 in -212.63.183.7 - 212.63.183.8 sg -212.63.183.9 - 212.63.183.10 cn -212.63.183.11 - 212.63.183.11 my -212.63.183.12 - 212.63.183.12 in -212.63.183.13 - 212.63.183.14 sg -212.63.183.15 - 212.63.183.15 cn -212.63.183.16 - 212.63.183.16 my -212.63.183.17 - 212.63.183.17 in -212.63.183.18 - 212.63.183.18 my +212.63.179.108 - 212.63.179.183 de +212.63.179.184 - 212.63.179.187 us +212.63.179.188 - 212.63.179.223 de +212.63.179.224 - 212.63.179.227 us +212.63.179.228 - 212.63.182.12 de +212.63.182.13 - 212.63.182.13 au +212.63.182.14 - 212.63.182.195 de +212.63.182.196 - 212.63.182.199 jp +212.63.182.200 - 212.63.183.18 de 212.63.183.19 - 212.63.183.19 cn -212.63.183.20 - 212.63.183.20 sg -212.63.183.21 - 212.63.183.21 tw -212.63.183.22 - 212.63.183.22 my -212.63.183.23 - 212.63.183.23 cn -212.63.183.24 - 212.63.183.25 in -212.63.183.26 - 212.63.183.26 tw -212.63.183.27 - 212.63.183.27 my -212.63.183.28 - 212.63.183.28 cn -212.63.183.29 - 212.63.183.29 sg -212.63.183.30 - 212.63.183.30 tw -212.63.183.31 - 212.63.183.31 sg -212.63.183.32 - 212.63.183.32 id -212.63.183.33 - 212.63.183.33 sg -212.63.183.34 - 212.63.183.35 in -212.63.183.36 - 212.63.183.40 sg -212.63.183.41 - 212.63.183.41 in -212.63.183.42 - 212.63.183.42 sg -212.63.183.43 - 212.63.183.43 in -212.63.183.44 - 212.63.183.44 sg -212.63.183.45 - 212.63.183.45 in -212.63.183.46 - 212.63.183.50 sg -212.63.183.51 - 212.63.183.51 tw -212.63.183.52 - 212.63.183.53 sg -212.63.183.54 - 212.63.183.54 in -212.63.183.55 - 212.63.183.57 sg -212.63.183.58 - 212.63.183.58 cn -212.63.183.59 - 212.63.183.59 my -212.63.183.60 - 212.63.183.61 sg -212.63.183.62 - 212.63.183.62 cn -212.63.183.63 - 212.63.183.63 sg -212.63.183.64 - 212.63.183.64 cn -212.63.183.65 - 212.63.183.65 tw -212.63.183.66 - 212.63.183.67 sg -212.63.183.68 - 212.63.183.68 cn -212.63.183.69 - 212.63.183.69 tw -212.63.183.70 - 212.63.183.70 in -212.63.183.71 - 212.63.183.71 sg -212.63.183.72 - 212.63.183.73 in -212.63.183.74 - 212.63.183.74 de -212.63.183.75 - 212.63.183.77 my -212.63.183.78 - 212.63.183.79 in -212.63.183.80 - 212.63.183.80 de -212.63.183.81 - 212.63.183.81 my -212.63.183.82 - 212.63.183.82 th -212.63.183.83 - 212.63.183.84 in -212.63.183.85 - 212.63.183.87 de -212.63.183.88 - 212.63.183.88 in -212.63.183.89 - 212.63.183.89 de -212.63.183.90 - 212.63.183.91 in -212.63.183.92 - 212.63.183.92 sg -212.63.183.93 - 212.63.183.93 us -212.63.183.94 - 212.63.183.94 in -212.63.183.95 - 212.63.183.127 de -212.63.183.128 - 212.63.183.131 in -212.63.183.132 - 212.63.183.135 sg -212.63.183.136 - 212.63.183.151 in -212.63.183.152 - 212.63.183.155 de -212.63.183.156 - 212.63.183.159 sg -212.63.183.160 - 212.63.183.167 in -212.63.183.168 - 212.63.183.171 sg -212.63.183.172 - 212.63.183.175 my -212.63.183.176 - 212.63.183.179 sg -212.63.183.180 - 212.63.183.183 tw -212.63.183.184 - 212.63.183.195 sg -212.63.183.196 - 212.63.183.199 us -212.63.183.200 - 212.63.183.203 in -212.63.183.204 - 212.63.183.211 sg -212.63.183.212 - 212.63.183.219 cn -212.63.183.220 - 212.63.183.227 sg -212.63.183.228 - 212.63.183.231 cn -212.63.183.232 - 212.63.183.235 in -212.63.183.236 - 212.63.183.239 my -212.63.183.240 - 212.63.183.243 in -212.63.183.244 - 212.63.183.251 de -212.63.183.252 - 212.63.183.255 in -212.63.184.0 - 212.63.184.3 us -212.63.184.4 - 212.63.184.7 br +212.63.183.20 - 212.63.184.7 de 212.63.184.8 - 212.63.184.11 us -212.63.184.12 - 212.63.184.15 pe -212.63.184.16 - 212.63.184.19 br -212.63.184.20 - 212.63.184.27 co -212.63.184.28 - 212.63.184.35 us -212.63.184.36 - 212.63.184.39 co -212.63.184.40 - 212.63.184.43 us -212.63.184.44 - 212.63.184.47 co -212.63.184.48 - 212.63.184.63 us -212.63.184.64 - 212.63.184.67 ar -212.63.184.68 - 212.63.184.75 us -212.63.184.76 - 212.63.184.79 br -212.63.184.80 - 212.63.184.83 us -212.63.184.84 - 212.63.184.87 ar -212.63.184.88 - 212.63.184.99 us -212.63.184.100 - 212.63.184.103 ar -212.63.184.104 - 212.63.184.107 br -212.63.184.108 - 212.63.184.111 ca -212.63.184.112 - 212.63.184.123 us -212.63.184.124 - 212.63.184.127 co -212.63.184.128 - 212.63.184.131 ar +212.63.184.12 - 212.63.184.31 de +212.63.184.32 - 212.63.184.35 us +212.63.184.36 - 212.63.184.131 de 212.63.184.132 - 212.63.184.135 us -212.63.184.136 - 212.63.184.139 br -212.63.184.140 - 212.63.184.143 us -212.63.184.144 - 212.63.184.147 co -212.63.184.148 - 212.63.184.151 us -212.63.184.152 - 212.63.184.155 ar -212.63.184.156 - 212.63.184.159 us -212.63.184.160 - 212.63.184.163 br -212.63.184.164 - 212.63.184.171 us -212.63.184.172 - 212.63.184.175 cl -212.63.184.176 - 212.63.184.179 br -212.63.184.180 - 212.63.184.187 us -212.63.184.188 - 212.63.184.191 de -212.63.184.192 - 212.63.184.195 us -212.63.184.196 - 212.63.184.199 de +212.63.184.136 - 212.63.184.199 de 212.63.184.200 - 212.63.184.203 us -212.63.184.204 - 212.63.184.207 de -212.63.184.208 - 212.63.184.211 ca -212.63.184.212 - 212.63.184.247 us -212.63.184.248 - 212.63.184.251 ca -212.63.184.252 - 212.63.184.255 us -212.63.185.0 - 212.63.185.97 de -212.63.185.98 - 212.63.185.98 fi -212.63.185.99 - 212.63.185.99 cz -212.63.185.100 - 212.63.186.0 de -212.63.186.1 - 212.63.186.13 us -212.63.186.14 - 212.63.186.14 ar -212.63.186.15 - 212.63.186.18 us -212.63.186.19 - 212.63.186.19 pe -212.63.186.20 - 212.63.186.20 ca -212.63.186.21 - 212.63.186.21 us -212.63.186.22 - 212.63.186.22 ca -212.63.186.23 - 212.63.186.23 ar -212.63.186.24 - 212.63.186.24 us -212.63.186.25 - 212.63.186.25 ca -212.63.186.26 - 212.63.186.26 de -212.63.186.27 - 212.63.186.27 ca -212.63.186.28 - 212.63.186.28 us -212.63.186.29 - 212.63.186.29 pe -212.63.186.30 - 212.63.186.32 us +212.63.184.204 - 212.63.186.32 de 212.63.186.33 - 212.63.186.33 ca -212.63.186.34 - 212.63.186.36 us -212.63.186.37 - 212.63.186.37 co -212.63.186.38 - 212.63.186.38 ca -212.63.186.39 - 212.63.186.39 pe -212.63.186.40 - 212.63.186.53 us -212.63.186.54 - 212.63.186.54 ar -212.63.186.55 - 212.63.186.55 us -212.63.186.56 - 212.63.186.56 ca -212.63.186.57 - 212.63.186.58 us -212.63.186.59 - 212.63.186.59 cl -212.63.186.60 - 212.63.186.61 us -212.63.186.62 - 212.63.186.62 ar -212.63.186.63 - 212.63.186.70 us -212.63.186.71 - 212.63.186.71 pr -212.63.186.72 - 212.63.186.77 us -212.63.186.78 - 212.63.186.78 sg -212.63.186.79 - 212.63.186.80 us -212.63.186.81 - 212.63.186.81 mx -212.63.186.82 - 212.63.186.82 us -212.63.186.83 - 212.63.186.83 vi -212.63.186.84 - 212.63.186.84 ar -212.63.186.85 - 212.63.186.86 us -212.63.186.87 - 212.63.186.87 ar -212.63.186.88 - 212.63.186.90 us +212.63.186.34 - 212.63.186.43 de +212.63.186.44 - 212.63.186.44 us +212.63.186.45 - 212.63.186.48 de +212.63.186.49 - 212.63.186.49 us +212.63.186.50 - 212.63.186.50 de +212.63.186.51 - 212.63.186.51 us +212.63.186.52 - 212.63.186.63 de +212.63.186.64 - 212.63.186.64 us +212.63.186.65 - 212.63.186.72 de +212.63.186.73 - 212.63.186.73 us +212.63.186.74 - 212.63.186.76 de +212.63.186.77 - 212.63.186.77 us +212.63.186.78 - 212.63.186.90 de 212.63.186.91 - 212.63.186.91 ca -212.63.186.92 - 212.63.186.95 us -212.63.186.96 - 212.63.186.96 de -212.63.186.97 - 212.63.186.97 ca -212.63.186.98 - 212.63.186.103 us -212.63.186.104 - 212.63.186.104 es -212.63.186.105 - 212.63.186.106 us -212.63.186.107 - 212.63.186.107 cl +212.63.186.92 - 212.63.186.107 de 212.63.186.108 - 212.63.186.108 us -212.63.186.109 - 212.63.186.109 co -212.63.186.110 - 212.63.186.114 us -212.63.186.115 - 212.63.186.115 ca -212.63.186.116 - 212.63.186.119 us -212.63.186.120 - 212.63.186.120 cl -212.63.186.121 - 212.63.186.121 de -212.63.186.122 - 212.63.186.122 us -212.63.186.123 - 212.63.186.123 de -212.63.186.124 - 212.63.186.124 cl -212.63.186.125 - 212.63.186.135 de -212.63.186.136 - 212.63.186.136 us -212.63.186.137 - 212.63.186.141 de -212.63.186.142 - 212.63.186.143 us -212.63.186.144 - 212.63.186.144 de -212.63.186.145 - 212.63.186.150 us -212.63.186.151 - 212.63.186.151 ca -212.63.186.152 - 212.63.186.152 us -212.63.186.153 - 212.63.186.153 do -212.63.186.154 - 212.63.186.154 us -212.63.186.155 - 212.63.186.155 do -212.63.186.156 - 212.63.186.157 ca -212.63.186.158 - 212.63.186.159 us -212.63.186.160 - 212.63.186.160 ca -212.63.186.161 - 212.63.186.161 de -212.63.186.162 - 212.63.186.162 ca -212.63.186.163 - 212.63.186.163 us -212.63.186.164 - 212.63.186.164 cl -212.63.186.165 - 212.63.186.166 ca -212.63.186.167 - 212.63.186.167 do -212.63.186.168 - 212.63.186.168 ar -212.63.186.169 - 212.63.186.169 us -212.63.186.170 - 212.63.186.170 pe -212.63.186.171 - 212.63.186.171 us -212.63.186.172 - 212.63.186.185 de -212.63.186.186 - 212.63.186.187 us -212.63.186.188 - 212.63.186.191 de -212.63.186.192 - 212.63.186.192 us -212.63.186.193 - 212.63.186.196 de +212.63.186.109 - 212.63.186.196 de 212.63.186.197 - 212.63.186.197 us -212.63.186.198 - 212.63.186.198 de -212.63.186.199 - 212.63.186.199 us -212.63.186.200 - 212.63.186.222 de -212.63.186.223 - 212.63.186.223 us -212.63.186.224 - 212.63.186.232 de -212.63.186.233 - 212.63.186.233 pr -212.63.186.234 - 212.63.186.243 de -212.63.186.244 - 212.63.186.244 us -212.63.186.245 - 212.63.186.255 de -212.63.187.0 - 212.63.187.11 us -212.63.187.12 - 212.63.187.15 br -212.63.187.16 - 212.63.187.19 de -212.63.187.20 - 212.63.187.23 bo -212.63.187.24 - 212.63.187.35 us -212.63.187.36 - 212.63.187.39 br -212.63.187.40 - 212.63.187.43 gu -212.63.187.44 - 212.63.187.51 us -212.63.187.52 - 212.63.187.55 mx -212.63.187.56 - 212.63.187.59 us -212.63.187.60 - 212.63.187.63 br -212.63.187.64 - 212.63.187.67 ve -212.63.187.68 - 212.63.187.71 ar -212.63.187.72 - 212.63.187.75 us -212.63.187.76 - 212.63.187.79 mx -212.63.187.80 - 212.63.187.91 us -212.63.187.92 - 212.63.187.95 mx -212.63.187.96 - 212.63.187.99 us -212.63.187.100 - 212.63.187.103 ca -212.63.187.104 - 212.63.187.107 pe -212.63.187.108 - 212.63.187.111 us -212.63.187.112 - 212.63.187.115 ca -212.63.187.116 - 212.63.187.119 us -212.63.187.120 - 212.63.187.123 pe -212.63.187.124 - 212.63.187.127 us -212.63.187.128 - 212.63.187.131 br -212.63.187.132 - 212.63.187.135 us -212.63.187.136 - 212.63.187.139 br -212.63.187.140 - 212.63.187.147 us -212.63.187.148 - 212.63.187.151 ca -212.63.187.152 - 212.63.187.155 us -212.63.187.156 - 212.63.187.159 ar -212.63.187.160 - 212.63.187.171 us -212.63.187.172 - 212.63.187.175 ar -212.63.187.176 - 212.63.187.179 br -212.63.187.180 - 212.63.187.191 us -212.63.187.192 - 212.63.187.203 mx -212.63.187.204 - 212.63.187.211 us -212.63.187.212 - 212.63.187.215 ar -212.63.187.216 - 212.63.187.219 mx -212.63.187.220 - 212.63.187.223 cl -212.63.187.224 - 212.63.187.227 br -212.63.187.228 - 212.63.187.231 mx -212.63.187.232 - 212.63.187.235 us -212.63.187.236 - 212.63.187.239 mx -212.63.187.240 - 212.63.187.247 br -212.63.187.248 - 212.63.187.255 us -212.63.188.0 - 212.63.188.1 de -212.63.188.2 - 212.63.188.7 us -212.63.188.8 - 212.63.188.8 br -212.63.188.9 - 212.63.188.10 us -212.63.188.11 - 212.63.188.12 de -212.63.188.13 - 212.63.188.13 co -212.63.188.14 - 212.63.188.18 us -212.63.188.19 - 212.63.188.19 ve -212.63.188.20 - 212.63.188.20 br -212.63.188.21 - 212.63.188.22 ve -212.63.188.23 - 212.63.188.23 us -212.63.188.24 - 212.63.188.24 ve -212.63.188.25 - 212.63.188.26 us -212.63.188.27 - 212.63.188.27 co -212.63.188.28 - 212.63.188.28 us -212.63.188.29 - 212.63.188.29 ar -212.63.188.30 - 212.63.188.30 us -212.63.188.31 - 212.63.188.32 br -212.63.188.33 - 212.63.188.35 co -212.63.188.36 - 212.63.188.36 mx -212.63.188.37 - 212.63.188.41 us -212.63.188.42 - 212.63.188.42 mx -212.63.188.43 - 212.63.188.45 us -212.63.188.46 - 212.63.188.46 pr -212.63.188.47 - 212.63.188.59 us -212.63.188.60 - 212.63.188.60 de -212.63.188.61 - 212.63.188.72 us -212.63.188.73 - 212.63.188.73 de -212.63.188.74 - 212.63.188.79 us -212.63.188.80 - 212.63.188.80 ca -212.63.188.81 - 212.63.188.81 us -212.63.188.82 - 212.63.188.137 de -212.63.188.138 - 212.63.188.138 us -212.63.188.139 - 212.63.188.147 de -212.63.188.148 - 212.63.188.148 us -212.63.188.149 - 212.63.188.151 de -212.63.188.152 - 212.63.188.152 us -212.63.188.153 - 212.63.188.255 de -212.63.189.0 - 212.63.189.3 us -212.63.189.4 - 212.63.189.7 br -212.63.189.8 - 212.63.189.11 mx -212.63.189.12 - 212.63.189.15 co -212.63.189.16 - 212.63.189.19 mx -212.63.189.20 - 212.63.189.23 ar -212.63.189.24 - 212.63.189.35 us -212.63.189.36 - 212.63.189.43 de -212.63.189.44 - 212.63.189.47 us -212.63.189.48 - 212.63.189.51 de -212.63.189.52 - 212.63.189.55 uy -212.63.189.56 - 212.63.189.63 us -212.63.189.64 - 212.63.189.67 pr -212.63.189.68 - 212.63.189.71 us -212.63.189.72 - 212.63.189.75 ar -212.63.189.76 - 212.63.189.83 us -212.63.189.84 - 212.63.189.87 co -212.63.189.88 - 212.63.189.95 us -212.63.189.96 - 212.63.189.99 br -212.63.189.100 - 212.63.189.123 us -212.63.189.124 - 212.63.189.127 ar -212.63.189.128 - 212.63.189.131 br -212.63.189.132 - 212.63.189.151 us -212.63.189.152 - 212.63.189.155 mx -212.63.189.156 - 212.63.189.163 us -212.63.189.164 - 212.63.189.167 de -212.63.189.168 - 212.63.189.179 us -212.63.189.180 - 212.63.189.183 co -212.63.189.184 - 212.63.189.199 us -212.63.189.200 - 212.63.189.203 de -212.63.189.204 - 212.63.189.215 us +212.63.186.198 - 212.63.188.63 de +212.63.188.64 - 212.63.188.64 us +212.63.188.65 - 212.63.189.115 de +212.63.189.116 - 212.63.189.119 us +212.63.189.120 - 212.63.189.131 de +212.63.189.132 - 212.63.189.135 us +212.63.189.136 - 212.63.189.215 de 212.63.189.216 - 212.63.189.219 pr -212.63.189.220 - 212.63.189.247 us -212.63.189.248 - 212.63.189.251 ve -212.63.189.252 - 212.63.189.255 de +212.63.189.220 - 212.63.189.223 us +212.63.189.224 - 212.63.189.255 de 212.63.190.0 - 212.63.190.3 ca -212.63.190.4 - 212.63.190.7 us -212.63.190.8 - 212.63.190.11 de -212.63.190.12 - 212.63.190.31 us -212.63.190.32 - 212.63.190.35 ca -212.63.190.36 - 212.63.190.39 co -212.63.190.40 - 212.63.190.47 us -212.63.190.48 - 212.63.190.51 ca -212.63.190.52 - 212.63.190.67 us -212.63.190.68 - 212.63.190.71 co -212.63.190.72 - 212.63.190.75 us -212.63.190.76 - 212.63.190.79 ar -212.63.190.80 - 212.63.190.83 mx -212.63.190.84 - 212.63.190.87 us -212.63.190.88 - 212.63.190.91 br -212.63.190.92 - 212.63.190.131 us -212.63.190.132 - 212.63.190.135 mx -212.63.190.136 - 212.63.190.143 us -212.63.190.144 - 212.63.190.147 mx -212.63.190.148 - 212.63.190.151 co -212.63.190.152 - 212.63.190.155 us -212.63.190.156 - 212.63.190.159 an -212.63.190.160 - 212.63.190.163 us -212.63.190.164 - 212.63.190.167 hn -212.63.190.168 - 212.63.190.171 br -212.63.190.172 - 212.63.190.175 ca -212.63.190.176 - 212.63.190.183 us -212.63.190.184 - 212.63.190.191 co -212.63.190.192 - 212.63.190.195 mx -212.63.190.196 - 212.63.190.199 us -212.63.190.200 - 212.63.190.207 ar -212.63.190.208 - 212.63.190.211 us -212.63.190.212 - 212.63.190.215 ar -212.63.190.216 - 212.63.190.231 us -212.63.190.232 - 212.63.190.235 mx -212.63.190.236 - 212.63.190.239 de -212.63.190.240 - 212.63.190.243 br -212.63.190.244 - 212.63.190.255 us -212.63.191.0 - 212.63.191.39 jp -212.63.191.40 - 212.63.191.43 kr -212.63.191.44 - 212.63.191.230 jp -212.63.191.231 - 212.63.191.231 de -212.63.191.232 - 212.63.191.255 jp -212.63.192.0 - 212.63.204.55 se -212.63.204.56 - 212.63.204.59 cz -212.63.204.60 - 212.63.204.63 fi -212.63.204.64 - 212.63.204.79 se -212.63.204.80 - 212.63.204.83 dk -212.63.204.84 - 212.63.204.87 es -212.63.204.88 - 212.63.204.172 se -212.63.204.173 - 212.63.204.174 pl -212.63.204.175 - 212.63.204.243 se -212.63.204.244 - 212.63.204.247 dk -212.63.204.248 - 212.63.204.255 se -212.63.205.0 - 212.63.205.3 no -212.63.205.4 - 212.63.205.43 se -212.63.205.44 - 212.63.205.47 dk -212.63.205.48 - 212.63.205.48 se -212.63.205.49 - 212.63.205.50 pl -212.63.205.51 - 212.63.205.51 se -212.63.205.52 - 212.63.205.55 it -212.63.205.56 - 212.63.205.63 se -212.63.205.64 - 212.63.205.67 de -212.63.205.68 - 212.63.205.71 dk -212.63.205.72 - 212.63.205.75 fr -212.63.205.76 - 212.63.205.79 se -212.63.205.80 - 212.63.205.83 cz -212.63.205.84 - 212.63.205.87 gb -212.63.205.88 - 212.63.205.91 se -212.63.205.92 - 212.63.205.95 es -212.63.205.96 - 212.63.205.103 se -212.63.205.104 - 212.63.205.107 br -212.63.205.108 - 212.63.205.115 se -212.63.205.116 - 212.63.205.119 us -212.63.205.120 - 212.63.205.155 se -212.63.205.156 - 212.63.205.159 dk -212.63.205.160 - 212.63.205.163 se -212.63.205.164 - 212.63.205.167 ae -212.63.205.168 - 212.63.205.171 dk -212.63.205.172 - 212.63.205.175 it -212.63.205.176 - 212.63.206.11 se -212.63.206.12 - 212.63.206.15 it -212.63.206.16 - 212.63.206.80 se -212.63.206.81 - 212.63.206.82 pl -212.63.206.83 - 212.63.206.84 se -212.63.206.85 - 212.63.206.86 fi -212.63.206.87 - 212.63.206.87 se -212.63.206.88 - 212.63.206.91 no -212.63.206.92 - 212.63.206.92 se -212.63.206.93 - 212.63.206.94 pt -212.63.206.95 - 212.63.206.95 se -212.63.206.96 - 212.63.206.99 it -212.63.206.100 - 212.63.206.103 de -212.63.206.104 - 212.63.206.107 se -212.63.206.108 - 212.63.206.111 no -212.63.206.112 - 212.63.206.127 se -212.63.206.128 - 212.63.206.131 nl -212.63.206.132 - 212.63.206.135 dk -212.63.206.136 - 212.63.206.139 se -212.63.206.140 - 212.63.206.143 dk -212.63.206.144 - 212.63.206.144 se -212.63.206.145 - 212.63.206.146 jp -212.63.206.147 - 212.63.206.148 se -212.63.206.149 - 212.63.206.150 hu -212.63.206.151 - 212.63.206.151 se -212.63.206.152 - 212.63.206.155 fr -212.63.206.156 - 212.63.206.163 se -212.63.206.164 - 212.63.206.167 fi -212.63.206.168 - 212.63.206.255 se -212.63.207.0 - 212.63.207.3 es -212.63.207.4 - 212.63.207.7 no -212.63.207.8 - 212.63.207.31 se -212.63.207.32 - 212.63.207.35 fi -212.63.207.36 - 212.63.207.39 se -212.63.207.40 - 212.63.207.43 no -212.63.207.44 - 212.63.207.47 cz -212.63.207.48 - 212.63.207.127 se -212.63.207.128 - 212.63.207.131 de -212.63.207.132 - 212.63.207.207 se -212.63.207.208 - 212.63.207.211 dk -212.63.207.212 - 212.63.207.215 hu -212.63.207.216 - 212.63.207.255 se -212.63.208.0 - 212.63.208.3 us -212.63.208.4 - 212.63.208.8 se -212.63.208.9 - 212.63.208.10 es -212.63.208.11 - 212.63.208.12 se -212.63.208.13 - 212.63.208.14 it -212.63.208.15 - 212.63.208.23 se -212.63.208.24 - 212.63.208.27 de -212.63.208.28 - 212.63.208.107 se -212.63.208.108 - 212.63.208.111 pl -212.63.208.112 - 212.63.208.127 se -212.63.208.128 - 212.63.208.131 nl -212.63.208.132 - 212.63.208.135 se -212.63.208.136 - 212.63.208.139 no -212.63.208.140 - 212.63.208.187 se -212.63.208.188 - 212.63.208.191 us -212.63.208.192 - 212.63.208.231 se -212.63.208.232 - 212.63.208.235 fi -212.63.208.236 - 212.63.209.159 se -212.63.209.160 - 212.63.209.163 cz -212.63.209.164 - 212.63.209.167 se -212.63.209.168 - 212.63.209.171 us -212.63.209.172 - 212.63.209.175 pt -212.63.209.176 - 212.63.209.191 se -212.63.209.192 - 212.63.209.195 pl -212.63.209.196 - 212.63.209.231 se -212.63.209.232 - 212.63.209.235 nl -212.63.209.236 - 212.63.210.111 se -212.63.210.112 - 212.63.210.115 dk -212.63.210.116 - 212.63.213.15 se -212.63.213.16 - 212.63.213.31 jp -212.63.213.32 - 212.63.223.255 se +212.63.190.4 - 212.63.190.59 de +212.63.190.60 - 212.63.190.63 us +212.63.190.64 - 212.63.190.99 de +212.63.190.100 - 212.63.190.103 us +212.63.190.104 - 212.63.191.59 de +212.63.191.60 - 212.63.191.63 jp +212.63.191.64 - 212.63.191.255 de +212.63.192.0 - 212.63.223.255 se 212.63.224.0 - 212.63.255.255 be 212.64.0.0 - 212.64.127.255 nl 212.64.128.0 - 212.64.159.255 gb 212.64.160.0 - 212.64.191.255 es 212.64.192.0 - 212.64.223.255 tr -212.64.224.0 - 212.64.228.255 de +212.64.224.0 - 212.64.224.255 eu +212.64.225.0 - 212.64.227.255 de +212.64.228.0 - 212.64.228.255 eu 212.64.229.0 - 212.64.229.255 at 212.64.230.0 - 212.65.31.255 de -212.65.32.0 - 212.65.37.127 be -212.65.37.128 - 212.65.37.159 nl -212.65.37.160 - 212.65.37.223 be -212.65.37.224 - 212.65.37.226 nl -212.65.37.227 - 212.65.63.255 be +212.65.32.0 - 212.65.63.255 be 212.65.64.0 - 212.65.95.255 ru 212.65.96.0 - 212.65.127.255 mt 212.65.128.0 - 212.65.159.255 tr -212.65.160.0 - 212.65.160.255 de -212.65.161.0 - 212.65.191.255 ch +212.65.160.0 - 212.65.191.255 ch 212.65.192.0 - 212.65.255.255 cz 212.66.0.0 - 212.66.31.255 de 212.66.32.0 - 212.66.63.255 ua @@ -141549,53 +110445,40 @@ 212.66.192.0 - 212.66.223.255 fi 212.66.224.0 - 212.66.255.255 it 212.67.0.0 - 212.67.31.255 ru -212.67.32.0 - 212.67.63.255 fr +212.67.32.0 - 212.67.47.255 fr +212.67.48.0 - 212.67.63.255 no 212.67.64.0 - 212.67.95.255 cz 212.67.96.0 - 212.67.127.255 gb 212.67.128.0 - 212.67.159.255 pl -212.67.160.0 - 212.67.179.127 nl -212.67.179.128 - 212.67.179.135 be -212.67.179.136 - 212.67.191.255 nl -212.67.192.0 - 212.67.211.255 gb -212.67.212.0 - 212.67.212.255 es -212.67.213.0 - 212.67.223.255 gb +212.67.160.0 - 212.67.191.255 nl +212.67.192.0 - 212.67.223.255 gb 212.67.224.0 - 212.67.255.255 at -212.68.0.0 - 212.68.9.119 fi -212.68.9.120 - 212.68.9.127 ax -212.68.9.128 - 212.68.31.255 fi +212.68.0.0 - 212.68.31.255 fi 212.68.32.0 - 212.68.63.255 tr 212.68.64.0 - 212.68.127.255 de 212.68.128.0 - 212.68.159.255 il 212.68.160.0 - 212.68.191.255 ua 212.68.192.0 - 212.68.255.255 be 212.69.0.0 - 212.69.31.255 rs -212.69.32.0 - 212.69.63.255 gb +212.69.32.0 - 212.69.40.255 gb +212.69.41.0 - 212.69.41.255 nl +212.69.42.0 - 212.69.63.255 gb 212.69.64.0 - 212.69.95.255 pl 212.69.96.0 - 212.69.127.255 ru -212.69.128.0 - 212.69.159.255 it +212.69.128.0 - 212.69.131.255 it +212.69.132.0 - 212.69.135.255 ch +212.69.136.0 - 212.69.159.255 it 212.69.160.0 - 212.69.191.255 at 212.69.192.0 - 212.69.255.255 gb 212.70.0.0 - 212.70.31.255 dk 212.70.32.0 - 212.70.63.255 sa 212.70.64.0 - 212.70.95.255 gb -212.70.96.0 - 212.70.98.79 at -212.70.98.80 - 212.70.98.95 de -212.70.98.96 - 212.70.127.255 at -212.70.128.0 - 212.70.148.255 bg -212.70.149.0 - 212.70.149.255 gr -212.70.150.0 - 212.70.151.255 bg -212.70.152.0 - 212.70.153.0 mk -212.70.153.1 - 212.70.159.255 bg +212.70.96.0 - 212.70.127.255 at +212.70.128.0 - 212.70.159.255 bg 212.70.160.0 - 212.70.191.255 lv 212.70.192.0 - 212.70.223.255 gr 212.70.224.0 - 212.70.255.255 it -212.71.0.0 - 212.71.17.7 be -212.71.17.8 - 212.71.17.11 nl -212.71.17.12 - 212.71.20.167 be -212.71.20.168 - 212.71.20.175 nl -212.71.20.176 - 212.71.25.31 be -212.71.25.32 - 212.71.25.39 nl -212.71.25.40 - 212.71.31.255 be +212.71.0.0 - 212.71.31.255 be 212.71.32.0 - 212.71.63.255 sa 212.71.64.0 - 212.71.95.255 no 212.71.96.0 - 212.71.127.255 ch @@ -141603,146 +110486,51 @@ 212.71.192.0 - 212.71.223.255 de 212.71.224.0 - 212.71.255.255 gb 212.72.0.0 - 212.72.31.255 om -212.72.32.0 - 212.72.32.255 nl -212.72.33.0 - 212.72.33.55 gb -212.72.33.56 - 212.72.33.59 nl -212.72.33.60 - 212.72.33.123 gb -212.72.33.124 - 212.72.33.127 nl -212.72.33.128 - 212.72.33.255 gb -212.72.34.0 - 212.72.34.31 nl -212.72.34.32 - 212.72.34.127 gb -212.72.34.128 - 212.72.34.223 nl -212.72.34.224 - 212.72.34.239 gb -212.72.34.240 - 212.72.35.79 nl -212.72.35.80 - 212.72.35.127 gb -212.72.35.128 - 212.72.35.191 nl -212.72.35.192 - 212.72.35.255 gb -212.72.36.0 - 212.72.37.255 nl -212.72.38.0 - 212.72.39.31 gb -212.72.39.32 - 212.72.39.63 nl -212.72.39.64 - 212.72.39.119 gb -212.72.39.120 - 212.72.39.123 nl -212.72.39.124 - 212.72.39.127 gb -212.72.39.128 - 212.72.39.191 nl -212.72.39.192 - 212.72.39.239 gb -212.72.39.240 - 212.72.39.247 nl -212.72.39.248 - 212.72.39.255 gb -212.72.40.0 - 212.72.46.255 nl -212.72.47.0 - 212.72.47.255 gb -212.72.48.0 - 212.72.48.31 nl -212.72.48.32 - 212.72.48.47 gb -212.72.48.48 - 212.72.48.79 nl -212.72.48.80 - 212.72.48.91 gb -212.72.48.92 - 212.72.48.95 nl -212.72.48.96 - 212.72.48.103 gb -212.72.48.104 - 212.72.50.127 nl -212.72.50.128 - 212.72.50.159 gb -212.72.50.160 - 212.72.50.191 nl -212.72.50.192 - 212.72.50.223 gb -212.72.50.224 - 212.72.51.3 nl -212.72.51.4 - 212.72.51.47 gb -212.72.51.48 - 212.72.51.63 nl -212.72.51.64 - 212.72.51.95 gb -212.72.51.96 - 212.72.51.191 nl -212.72.51.192 - 212.72.51.255 gb -212.72.52.0 - 212.72.53.95 nl -212.72.53.96 - 212.72.53.127 gb -212.72.53.128 - 212.72.53.191 nl -212.72.53.192 - 212.72.53.255 gb -212.72.54.0 - 212.72.55.167 nl -212.72.55.168 - 212.72.55.191 gb -212.72.55.192 - 212.72.61.255 nl -212.72.62.0 - 212.72.62.127 gb -212.72.62.128 - 212.72.63.255 nl +212.72.32.0 - 212.72.32.255 gb +212.72.33.0 - 212.72.33.255 nl +212.72.34.0 - 212.72.39.255 gb +212.72.40.0 - 212.72.40.255 nl +212.72.41.0 - 212.72.55.255 gb +212.72.56.0 - 212.72.59.255 nl +212.72.60.0 - 212.72.63.255 gb 212.72.64.0 - 212.72.95.255 de 212.72.96.0 - 212.72.127.255 si 212.72.128.0 - 212.72.159.255 ge -212.72.160.0 - 212.72.180.95 de -212.72.180.96 - 212.72.180.111 us -212.72.180.112 - 212.72.191.255 de +212.72.160.0 - 212.72.191.255 de 212.72.192.0 - 212.72.223.255 bg 212.72.224.0 - 212.72.255.255 nl 212.73.0.0 - 212.73.31.255 se 212.73.32.0 - 212.73.63.255 es 212.73.64.0 - 212.73.95.255 am 212.73.96.0 - 212.73.127.255 ru -212.73.128.0 - 212.73.143.63 bg -212.73.143.64 - 212.73.143.95 cy -212.73.143.96 - 212.73.159.255 bg -212.73.160.0 - 212.73.160.55 se -212.73.160.56 - 212.73.160.59 dk -212.73.160.60 - 212.73.160.95 se -212.73.160.96 - 212.73.160.127 dk -212.73.160.128 - 212.73.191.255 se -212.73.192.0 - 212.73.192.191 fr -212.73.192.192 - 212.73.192.223 gb -212.73.192.224 - 212.73.193.127 fr -212.73.193.128 - 212.73.193.159 gb -212.73.193.160 - 212.73.197.255 fr -212.73.198.0 - 212.73.199.31 gb -212.73.199.32 - 212.73.199.47 fr -212.73.199.48 - 212.73.199.255 gb -212.73.200.0 - 212.73.208.63 fr -212.73.208.64 - 212.73.208.67 gb -212.73.208.68 - 212.73.208.71 fr -212.73.208.72 - 212.73.208.79 gb -212.73.208.80 - 212.73.208.175 fr -212.73.208.176 - 212.73.208.191 gb -212.73.208.192 - 212.73.209.255 fr -212.73.210.0 - 212.73.210.31 gb -212.73.210.32 - 212.73.210.79 fr -212.73.210.80 - 212.73.210.95 gb -212.73.210.96 - 212.73.219.255 fr -212.73.220.0 - 212.73.220.255 us -212.73.221.0 - 212.73.221.31 fr -212.73.221.32 - 212.73.221.223 gb -212.73.221.224 - 212.73.224.47 fr -212.73.224.48 - 212.73.225.39 gb -212.73.225.40 - 212.73.225.47 fr -212.73.225.48 - 212.73.227.255 gb -212.73.228.0 - 212.73.228.127 fr -212.73.228.128 - 212.73.231.255 gb -212.73.232.0 - 212.73.232.7 fr -212.73.232.8 - 212.73.232.31 gb -212.73.232.32 - 212.73.232.95 fr -212.73.232.96 - 212.73.235.95 gb -212.73.235.96 - 212.73.235.119 fr -212.73.235.120 - 212.73.235.255 gb -212.73.236.0 - 212.73.236.255 fr -212.73.237.0 - 212.73.239.255 gb -212.73.240.0 - 212.73.240.255 fr -212.73.241.0 - 212.73.241.255 it -212.73.242.0 - 212.73.244.31 fr -212.73.244.32 - 212.73.244.111 gb -212.73.244.112 - 212.73.244.159 fr -212.73.244.160 - 212.73.244.175 gb -212.73.244.176 - 212.73.244.191 fr -212.73.244.192 - 212.73.245.255 gb -212.73.246.0 - 212.73.246.63 fr -212.73.246.64 - 212.73.246.255 gb -212.73.247.0 - 212.73.247.255 fr -212.73.248.0 - 212.73.248.255 fi -212.73.249.0 - 212.73.249.255 lu -212.73.250.0 - 212.73.250.255 se -212.73.251.0 - 212.73.251.255 ie -212.73.252.0 - 212.73.252.255 dk -212.73.253.0 - 212.73.253.127 fr -212.73.253.128 - 212.73.253.255 pl -212.73.254.0 - 212.73.254.7 es -212.73.254.8 - 212.74.82.127 gb -212.74.82.128 - 212.74.83.127 fr -212.74.83.128 - 212.74.127.255 gb +212.73.128.0 - 212.73.159.255 bg +212.73.160.0 - 212.73.191.255 se +212.73.192.0 - 212.73.196.255 gb +212.73.197.0 - 212.73.197.255 fr +212.73.198.0 - 212.73.208.223 gb +212.73.208.224 - 212.73.208.255 fr +212.73.209.0 - 212.73.210.43 gb +212.73.210.44 - 212.73.210.44 fr +212.73.210.45 - 212.73.215.255 gb +212.73.216.0 - 212.73.216.255 fr +212.73.217.0 - 212.73.220.255 gb +212.73.221.0 - 212.73.221.255 fr +212.73.222.0 - 212.73.224.255 gb +212.73.225.0 - 212.73.225.255 fr +212.73.226.0 - 212.73.228.255 gb +212.73.229.0 - 212.73.229.255 fr +212.73.230.0 - 212.73.232.255 gb +212.73.233.0 - 212.73.233.255 fr +212.73.234.0 - 212.73.241.255 gb +212.73.242.0 - 212.73.242.255 fr +212.73.243.0 - 212.73.244.255 gb +212.73.245.0 - 212.73.245.255 fr +212.73.246.0 - 212.74.127.255 gb 212.74.128.0 - 212.74.191.255 ch -212.74.192.0 - 212.74.233.255 ru -212.74.234.0 - 212.74.234.255 ua -212.74.235.0 - 212.74.255.255 ru +212.74.192.0 - 212.74.255.255 ru 212.75.0.0 - 212.75.31.255 bg -212.75.32.0 - 212.75.37.23 de -212.75.37.24 - 212.75.37.31 ch -212.75.37.32 - 212.75.63.255 de -212.75.64.0 - 212.75.82.47 se -212.75.82.48 - 212.75.82.63 dk -212.75.82.64 - 212.75.95.255 se +212.75.32.0 - 212.75.63.255 de +212.75.64.0 - 212.75.95.255 se 212.75.96.0 - 212.75.127.255 pl 212.75.128.0 - 212.75.159.255 ru 212.75.160.0 - 212.75.191.255 es @@ -141754,8 +110542,7 @@ 212.76.128.0 - 212.76.191.255 ru 212.76.192.0 - 212.76.223.255 de 212.76.224.0 - 212.76.255.255 be -212.77.0.0 - 212.77.30.255 va -212.77.31.0 - 212.77.31.255 it +212.77.0.0 - 212.77.31.255 va 212.77.32.0 - 212.77.63.255 li 212.77.64.0 - 212.77.95.255 it 212.77.96.0 - 212.77.127.255 pl @@ -141766,104 +110553,28 @@ 212.78.0.0 - 212.78.31.255 it 212.78.32.0 - 212.78.63.255 fr 212.78.64.0 - 212.78.95.255 gb -212.78.96.0 - 212.78.102.47 de -212.78.102.48 - 212.78.102.51 gb -212.78.102.52 - 212.78.110.131 de -212.78.110.132 - 212.78.110.135 gb -212.78.110.136 - 212.78.111.191 de -212.78.111.192 - 212.78.111.207 gb -212.78.111.208 - 212.78.127.255 de +212.78.96.0 - 212.78.127.255 de 212.78.128.0 - 212.78.159.255 es -212.78.160.0 - 212.78.160.255 nl -212.78.161.0 - 212.78.161.31 gb -212.78.161.32 - 212.78.161.47 nl -212.78.161.48 - 212.78.161.55 fr -212.78.161.56 - 212.78.161.111 gb -212.78.161.112 - 212.78.161.159 nl -212.78.161.160 - 212.78.161.175 gb -212.78.161.176 - 212.78.161.199 nl -212.78.161.200 - 212.78.161.247 gb -212.78.161.248 - 212.78.161.251 nl -212.78.161.252 - 212.78.161.255 gb -212.78.162.0 - 212.78.162.255 nl -212.78.163.0 - 212.78.163.75 gb -212.78.163.76 - 212.78.163.79 nl -212.78.163.80 - 212.78.163.95 gb -212.78.163.96 - 212.78.163.223 nl -212.78.163.224 - 212.78.164.63 gb -212.78.164.64 - 212.78.164.95 nl -212.78.164.96 - 212.78.164.255 gb -212.78.165.0 - 212.78.166.255 nl -212.78.167.0 - 212.78.167.255 gb -212.78.168.0 - 212.78.168.31 nl -212.78.168.32 - 212.78.168.47 gb -212.78.168.48 - 212.78.168.55 nl -212.78.168.56 - 212.78.168.71 gb -212.78.168.72 - 212.78.168.79 nl -212.78.168.80 - 212.78.168.95 gb -212.78.168.96 - 212.78.168.111 nl -212.78.168.112 - 212.78.169.31 gb -212.78.169.32 - 212.78.169.39 fr -212.78.169.40 - 212.78.169.47 gb -212.78.169.48 - 212.78.169.63 nl -212.78.169.64 - 212.78.169.79 gb -212.78.169.80 - 212.78.169.175 nl -212.78.169.176 - 212.78.169.223 gb -212.78.169.224 - 212.78.169.255 nl -212.78.170.0 - 212.78.177.31 gb -212.78.177.32 - 212.78.177.63 nl -212.78.177.64 - 212.78.177.71 gb -212.78.177.72 - 212.78.177.87 nl -212.78.177.88 - 212.78.177.103 gb -212.78.177.104 - 212.78.177.127 nl -212.78.177.128 - 212.78.177.191 gb -212.78.177.192 - 212.78.177.255 nl -212.78.178.0 - 212.78.179.127 gb -212.78.179.128 - 212.78.179.223 nl -212.78.179.224 - 212.78.179.239 gb -212.78.179.240 - 212.78.187.255 nl -212.78.188.0 - 212.78.188.15 gb -212.78.188.16 - 212.78.188.95 nl -212.78.188.96 - 212.78.188.127 ch -212.78.188.128 - 212.78.188.151 gb -212.78.188.152 - 212.78.188.191 nl -212.78.188.192 - 212.78.188.239 gb -212.78.188.240 - 212.78.189.255 nl -212.78.190.0 - 212.78.190.255 gb -212.78.191.0 - 212.78.191.15 nl -212.78.191.16 - 212.78.191.23 be -212.78.191.24 - 212.78.191.31 fr -212.78.191.32 - 212.78.191.39 ch -212.78.191.40 - 212.78.191.47 gb -212.78.191.48 - 212.78.191.55 fr -212.78.191.56 - 212.78.191.79 nl -212.78.191.80 - 212.78.191.87 de -212.78.191.88 - 212.78.191.103 nl -212.78.191.104 - 212.78.191.119 gb -212.78.191.120 - 212.78.191.175 nl -212.78.191.176 - 212.78.191.183 gb -212.78.191.184 - 212.78.191.223 nl -212.78.191.224 - 212.78.191.231 gb -212.78.191.232 - 212.78.223.255 nl -212.78.224.0 - 212.78.227.120 ie -212.78.227.121 - 212.78.227.123 gb -212.78.227.124 - 212.78.231.255 ie +212.78.160.0 - 212.78.169.159 gb +212.78.169.160 - 212.78.169.175 nl +212.78.169.176 - 212.78.170.223 gb +212.78.170.224 - 212.78.170.255 nl +212.78.171.0 - 212.78.188.239 gb +212.78.188.240 - 212.78.188.255 nl +212.78.189.0 - 212.78.191.255 gb +212.78.192.0 - 212.78.223.255 nl +212.78.224.0 - 212.78.231.255 ie 212.78.232.0 - 212.78.235.255 gb -212.78.236.0 - 212.78.239.63 ie -212.78.239.64 - 212.78.239.127 gb -212.78.239.128 - 212.78.255.255 ie +212.78.236.0 - 212.78.255.255 ie 212.79.0.0 - 212.79.63.255 de 212.79.64.0 - 212.79.95.255 be 212.79.96.0 - 212.79.111.255 cz -212.79.112.0 - 212.79.127.255 ua +212.79.112.0 - 212.79.115.255 bg +212.79.116.0 - 212.79.127.255 ua 212.79.128.0 - 212.79.159.255 es 212.79.160.0 - 212.79.223.255 de -212.79.224.0 - 212.79.247.127 nl -212.79.247.128 - 212.79.247.255 de -212.79.248.0 - 212.79.255.255 nl -212.80.0.0 - 212.80.28.255 ir -212.80.29.0 - 212.80.29.255 ae -212.80.30.0 - 212.80.31.255 ir +212.79.224.0 - 212.79.255.255 nl +212.80.0.0 - 212.80.31.255 ir 212.80.32.0 - 212.80.63.255 ua 212.80.64.0 - 212.80.95.255 cz 212.80.96.0 - 212.80.127.255 ch @@ -141878,58 +110589,23 @@ 212.80.175.0 - 212.80.175.255 de 212.80.176.0 - 212.80.176.247 es 212.80.176.248 - 212.80.176.255 fr -212.80.177.0 - 212.80.178.63 es -212.80.178.64 - 212.80.178.127 it -212.80.178.128 - 212.80.182.63 es +212.80.177.0 - 212.80.182.63 es 212.80.182.64 - 212.80.182.71 ch 212.80.182.72 - 212.80.182.127 es -212.80.182.128 - 212.80.183.255 ch -212.80.184.0 - 212.80.191.255 es -212.80.192.0 - 212.80.223.255 it +212.80.182.128 - 212.80.182.255 ch +212.80.183.0 - 212.80.191.255 es 212.80.224.0 - 212.80.255.255 de 212.81.0.0 - 212.81.31.255 sk 212.81.32.0 - 212.81.35.255 se 212.81.36.0 - 212.81.39.255 gb 212.81.40.0 - 212.81.63.255 se -212.81.64.0 - 212.81.67.247 gb -212.81.67.248 - 212.81.67.255 fr -212.81.68.0 - 212.81.69.191 gb -212.81.69.192 - 212.81.69.255 fr -212.81.70.0 - 212.81.78.191 gb -212.81.78.192 - 212.81.78.199 fr -212.81.78.200 - 212.81.90.223 gb -212.81.90.224 - 212.81.90.231 fr -212.81.90.232 - 212.81.91.127 gb -212.81.91.128 - 212.81.91.135 fr -212.81.91.136 - 212.81.104.159 gb -212.81.104.160 - 212.81.104.167 fr -212.81.104.168 - 212.81.106.255 gb -212.81.107.0 - 212.81.107.255 fr -212.81.108.0 - 212.81.111.255 gb -212.81.112.0 - 212.81.112.31 fr -212.81.112.32 - 212.81.112.63 gb -212.81.112.64 - 212.81.112.79 fr -212.81.112.80 - 212.81.112.191 gb -212.81.112.192 - 212.81.112.223 fr -212.81.112.224 - 212.81.113.95 gb -212.81.113.96 - 212.81.113.127 fr -212.81.113.128 - 212.81.114.127 gb -212.81.114.128 - 212.81.114.191 fr -212.81.114.192 - 212.81.120.31 gb -212.81.120.32 - 212.81.120.47 fr -212.81.120.48 - 212.81.122.127 gb -212.81.122.128 - 212.81.122.143 fr -212.81.122.144 - 212.81.125.191 gb -212.81.125.192 - 212.81.125.223 fr -212.81.125.224 - 212.81.125.255 gb -212.81.126.0 - 212.81.126.255 fr -212.81.127.0 - 212.81.127.255 gb +212.81.64.0 - 212.81.112.15 gb +212.81.112.16 - 212.81.112.31 fr +212.81.112.32 - 212.81.127.255 gb 212.81.128.0 - 212.81.255.255 es 212.82.0.0 - 212.82.31.255 gb 212.82.32.0 - 212.82.63.255 de -212.82.64.0 - 212.82.67.255 gb -212.82.68.0 - 212.82.68.31 nl -212.82.68.32 - 212.82.99.255 gb +212.82.64.0 - 212.82.99.255 gb 212.82.100.0 - 212.82.103.255 ch 212.82.104.0 - 212.82.111.255 ie 212.82.112.0 - 212.82.117.255 ch @@ -141944,26 +110620,14 @@ 212.83.64.0 - 212.83.95.255 nl 212.83.96.0 - 212.83.127.255 fi 212.83.128.0 - 212.83.191.255 fr -212.83.192.0 - 212.83.213.167 nl -212.83.213.168 - 212.83.213.175 be -212.83.213.176 - 212.84.31.255 nl +212.83.192.0 - 212.84.31.255 nl 212.84.32.0 - 212.84.39.255 it 212.84.40.0 - 212.84.47.255 ie 212.84.48.0 - 212.84.55.255 it 212.84.56.0 - 212.84.63.255 fr 212.84.64.0 - 212.84.127.255 gb 212.84.128.0 - 212.84.159.255 nl -212.84.160.0 - 212.84.181.79 gb -212.84.181.80 - 212.84.181.87 be -212.84.181.88 - 212.84.187.55 gb -212.84.187.56 - 212.84.187.63 gg -212.84.187.64 - 212.84.188.143 gb -212.84.188.144 - 212.84.188.151 es -212.84.188.152 - 212.84.188.191 gb -212.84.188.192 - 212.84.188.199 be -212.84.188.200 - 212.84.191.239 gb -212.84.191.240 - 212.84.191.247 gg -212.84.191.248 - 212.84.191.255 gb +212.84.160.0 - 212.84.191.255 gb 212.84.192.0 - 212.84.255.255 de 212.85.0.0 - 212.85.31.255 gb 212.85.32.0 - 212.85.63.255 es @@ -141971,10 +110635,7 @@ 212.85.96.0 - 212.85.127.255 pl 212.85.128.0 - 212.85.159.255 fr 212.85.160.0 - 212.85.191.255 si -212.85.192.0 - 212.85.215.255 gh -212.85.216.0 - 212.85.216.255 br -212.85.217.0 - 212.85.217.255 tz -212.85.218.0 - 212.85.223.255 sz +212.85.192.0 - 212.85.223.255 gh 212.85.224.0 - 212.85.255.255 gb 212.86.0.0 - 212.86.31.255 fi 212.86.32.0 - 212.86.63.255 de @@ -141988,24 +110649,17 @@ 212.87.96.0 - 212.87.127.255 be 212.87.128.0 - 212.87.159.255 de 212.87.160.0 - 212.87.191.255 ua -212.87.192.0 - 212.87.223.255 es 212.87.224.0 - 212.87.255.255 pl 212.88.0.0 - 212.88.31.255 at 212.88.32.0 - 212.88.63.255 gb 212.88.64.0 - 212.88.95.255 dk 212.88.96.0 - 212.88.127.255 ug -212.88.128.0 - 212.88.137.191 de -212.88.137.192 - 212.88.137.207 us -212.88.137.208 - 212.88.138.255 de +212.88.128.0 - 212.88.138.255 de 212.88.139.0 - 212.88.139.255 lu 212.88.140.0 - 212.88.159.255 de 212.88.160.0 - 212.88.191.255 at 212.88.192.0 - 212.88.223.255 de -212.88.224.0 - 212.88.228.95 be -212.88.228.96 - 212.88.228.127 lu -212.88.228.128 - 212.88.239.63 be -212.88.239.64 - 212.88.239.79 lu -212.88.239.80 - 212.88.255.255 be +212.88.224.0 - 212.88.255.255 be 212.89.0.0 - 212.89.31.255 es 212.89.32.0 - 212.89.63.255 no 212.89.64.0 - 212.89.95.255 gb @@ -142016,7 +110670,6 @@ 212.90.0.0 - 212.90.31.255 it 212.90.32.0 - 212.90.63.255 ua 212.90.64.0 - 212.90.95.255 fi -212.90.96.0 - 212.90.127.255 ua 212.90.128.0 - 212.90.159.255 de 212.90.160.0 - 212.90.191.255 ua 212.90.192.0 - 212.90.223.255 ch @@ -142027,12 +110680,8 @@ 212.91.128.0 - 212.91.159.255 se 212.91.160.0 - 212.91.191.255 bg 212.91.192.0 - 212.91.223.255 ru -212.91.224.0 - 212.91.251.127 de -212.91.251.128 - 212.91.251.143 ch -212.91.251.144 - 212.91.255.255 de -212.92.0.0 - 212.92.17.15 hu -212.92.17.16 - 212.92.17.23 ua -212.92.17.24 - 212.92.31.255 hu +212.91.224.0 - 212.91.255.255 de +212.92.0.0 - 212.92.31.255 hu 212.92.32.0 - 212.92.63.255 es 212.92.64.0 - 212.92.95.255 nl 212.92.96.0 - 212.92.191.255 ru @@ -142053,53 +110702,25 @@ 212.94.160.0 - 212.94.223.255 fr 212.94.224.0 - 212.94.255.255 de 212.95.0.0 - 212.95.31.255 at -212.95.32.0 - 212.95.36.255 de -212.95.37.0 - 212.95.37.127 kz -212.95.37.128 - 212.95.37.255 de -212.95.38.0 - 212.95.38.255 tr -212.95.39.0 - 212.95.39.255 de -212.95.40.0 - 212.95.41.255 tr -212.95.42.0 - 212.95.42.127 de -212.95.42.128 - 212.95.42.255 ca -212.95.43.0 - 212.95.45.255 de -212.95.46.0 - 212.95.47.255 tr -212.95.48.0 - 212.95.48.255 de +212.95.32.0 - 212.95.48.255 de 212.95.49.0 - 212.95.49.255 pl -212.95.50.0 - 212.95.52.255 de -212.95.53.0 - 212.95.53.255 lt -212.95.54.0 - 212.95.54.255 de -212.95.55.0 - 212.95.55.255 hk -212.95.56.0 - 212.95.58.255 de +212.95.50.0 - 212.95.58.255 de 212.95.59.0 - 212.95.59.255 pl -212.95.60.0 - 212.95.61.255 de -212.95.62.0 - 212.95.62.255 es -212.95.63.0 - 212.95.63.255 de +212.95.60.0 - 212.95.63.255 de 212.95.64.0 - 212.95.95.255 fr 212.95.96.0 - 212.95.127.255 de 212.95.128.0 - 212.95.159.255 ir 212.95.160.0 - 212.95.191.255 bg 212.95.192.0 - 212.95.223.255 es 212.95.224.0 - 212.95.255.255 gb -212.96.0.0 - 212.96.1.255 gh -212.96.2.0 - 212.96.4.255 ng -212.96.5.0 - 212.96.16.255 gh -212.96.17.0 - 212.96.23.255 ng +212.96.0.0 - 212.96.15.255 gh +212.96.16.0 - 212.96.23.255 ng 212.96.24.0 - 212.96.27.255 mz 212.96.28.0 - 212.96.31.255 ng 212.96.32.0 - 212.96.63.255 hu 212.96.64.0 - 212.96.95.255 kz 212.96.96.0 - 212.96.127.255 ru -212.96.128.0 - 212.96.136.191 de -212.96.136.192 - 212.96.136.223 gb -212.96.136.224 - 212.96.139.255 de -212.96.140.0 - 212.96.140.31 gb -212.96.140.32 - 212.96.140.63 de -212.96.140.64 - 212.96.140.95 gb -212.96.140.96 - 212.96.140.127 de -212.96.140.128 - 212.96.140.159 gb -212.96.140.160 - 212.96.140.223 de -212.96.140.224 - 212.96.140.255 gb -212.96.141.0 - 212.96.159.255 de +212.96.128.0 - 212.96.159.255 de 212.96.160.0 - 212.96.191.255 cz 212.96.192.0 - 212.96.223.255 ru 212.96.224.0 - 212.96.255.255 pl @@ -142107,9 +110728,7 @@ 212.97.32.0 - 212.97.63.255 it 212.97.64.0 - 212.97.95.255 gb 212.97.96.0 - 212.97.127.255 de -212.97.128.0 - 212.97.143.255 dk -212.97.144.0 - 212.97.145.255 se -212.97.146.0 - 212.97.159.255 dk +212.97.128.0 - 212.97.159.255 dk 212.97.160.0 - 212.97.191.255 es 212.97.192.0 - 212.97.255.255 dk 212.98.0.0 - 212.98.31.255 tr @@ -142121,20 +110740,18 @@ 212.99.0.0 - 212.99.127.255 fr 212.99.128.0 - 212.99.223.255 de 212.99.224.0 - 212.99.255.255 dk -212.100.0.0 - 212.100.24.255 gb +212.100.0.0 - 212.100.0.255 eu +212.100.1.0 - 212.100.24.255 gb 212.100.25.0 - 212.100.31.255 eu 212.100.32.0 - 212.100.63.255 de 212.100.64.0 - 212.100.95.255 ng -212.100.96.0 - 212.100.127.255 gb +212.100.96.0 - 212.100.99.255 gb +212.100.100.0 - 212.100.115.255 fi +212.100.116.0 - 212.100.127.255 gb 212.100.128.0 - 212.100.159.255 ru 212.100.160.0 - 212.100.191.255 be 212.100.192.0 - 212.100.223.255 sa -212.100.224.0 - 212.100.231.55 gb -212.100.231.56 - 212.100.231.59 at -212.100.231.60 - 212.100.231.61 de -212.100.231.62 - 212.100.231.239 gb -212.100.231.240 - 212.100.231.247 ie -212.100.231.248 - 212.100.255.255 gb +212.100.224.0 - 212.100.255.255 gb 212.101.0.0 - 212.101.31.255 ch 212.101.32.0 - 212.101.63.255 de 212.101.64.0 - 212.101.73.255 es @@ -142147,17 +110764,13 @@ 212.102.0.0 - 212.102.31.255 sa 212.102.32.0 - 212.102.95.255 it 212.102.96.0 - 212.102.127.255 gb -212.102.128.0 - 212.102.159.255 rs +212.102.128.0 - 212.102.143.255 rs +212.102.144.0 - 212.102.159.255 bg 212.102.160.0 - 212.102.191.255 de 212.102.192.0 - 212.102.223.255 gb 212.102.224.0 - 212.102.255.255 de 212.103.0.0 - 212.103.31.255 fr -212.103.32.0 - 212.103.63.255 de -212.103.64.0 - 212.103.74.143 ch -212.103.74.144 - 212.103.74.151 us -212.103.74.152 - 212.103.74.175 ch -212.103.74.176 - 212.103.74.191 de -212.103.74.192 - 212.103.95.255 ch +212.103.64.0 - 212.103.95.255 ch 212.103.96.0 - 212.103.127.255 ru 212.103.128.0 - 212.103.159.255 si 212.103.160.0 - 212.103.191.255 eg @@ -142180,288 +110793,75 @@ 212.106.96.0 - 212.106.127.255 gb 212.106.128.0 - 212.106.191.255 pl 212.106.192.0 - 212.106.255.255 es -212.107.0.0 - 212.107.31.255 gr 212.107.32.0 - 212.107.63.255 ee -212.107.64.0 - 212.107.71.127 fr -212.107.71.128 - 212.107.71.143 gb -212.107.71.144 - 212.107.71.175 fr -212.107.71.176 - 212.107.71.191 gb -212.107.71.192 - 212.107.72.31 fr -212.107.72.32 - 212.107.72.47 gb -212.107.72.48 - 212.107.72.191 fr -212.107.72.192 - 212.107.72.207 gb -212.107.72.208 - 212.107.73.79 fr -212.107.73.80 - 212.107.73.95 gb -212.107.73.96 - 212.107.73.111 fr -212.107.73.112 - 212.107.73.159 gb -212.107.73.160 - 212.107.74.47 fr -212.107.74.48 - 212.107.74.63 de -212.107.74.64 - 212.107.74.95 fr -212.107.74.96 - 212.107.74.111 de -212.107.74.112 - 212.107.74.191 fr -212.107.74.192 - 212.107.74.207 nl -212.107.74.208 - 212.107.75.31 fr -212.107.75.32 - 212.107.75.47 gb -212.107.75.48 - 212.107.75.63 it -212.107.75.64 - 212.107.75.79 de -212.107.75.80 - 212.107.75.111 fr -212.107.75.112 - 212.107.75.175 gb -212.107.75.176 - 212.107.75.207 fr -212.107.75.208 - 212.107.75.223 gb -212.107.75.224 - 212.107.75.255 fr -212.107.76.0 - 212.107.76.31 gb -212.107.76.32 - 212.107.76.47 fr -212.107.76.48 - 212.107.76.143 gb -212.107.76.144 - 212.107.76.175 fr -212.107.76.176 - 212.107.76.191 be -212.107.76.192 - 212.107.76.239 fr -212.107.76.240 - 212.107.76.255 gb -212.107.77.0 - 212.107.77.15 fr -212.107.77.16 - 212.107.77.31 gb -212.107.77.32 - 212.107.77.66 fr -212.107.77.67 - 212.107.77.79 gb -212.107.77.80 - 212.107.77.159 fr -212.107.77.160 - 212.107.77.175 be -212.107.77.176 - 212.107.77.191 fr -212.107.77.192 - 212.107.77.207 it -212.107.77.208 - 212.107.78.95 fr -212.107.78.96 - 212.107.78.111 gb -212.107.78.112 - 212.107.78.143 fr -212.107.78.144 - 212.107.78.159 gb -212.107.78.160 - 212.107.78.191 fr -212.107.78.192 - 212.107.78.207 it -212.107.78.208 - 212.107.79.79 fr -212.107.79.80 - 212.107.79.95 gb -212.107.79.96 - 212.107.79.255 fr -212.107.80.0 - 212.107.80.31 gb -212.107.80.32 - 212.107.80.111 fr -212.107.80.112 - 212.107.80.127 us -212.107.80.128 - 212.107.80.159 gb -212.107.80.160 - 212.107.81.127 fr -212.107.81.128 - 212.107.81.143 gb -212.107.81.144 - 212.107.81.159 fr -212.107.81.160 - 212.107.81.175 gb -212.107.81.176 - 212.107.81.239 fr -212.107.81.240 - 212.107.81.255 nl -212.107.82.0 - 212.107.82.15 fr -212.107.82.16 - 212.107.82.31 gb -212.107.82.32 - 212.107.82.47 fr -212.107.82.48 - 212.107.82.79 gb -212.107.82.80 - 212.107.82.111 fr -212.107.82.112 - 212.107.82.127 gb -212.107.82.128 - 212.107.82.143 fr -212.107.82.144 - 212.107.82.159 gb -212.107.82.160 - 212.107.82.175 fr -212.107.82.176 - 212.107.82.191 gb -212.107.82.192 - 212.107.82.223 fr -212.107.82.224 - 212.107.83.31 gb -212.107.83.32 - 212.107.83.47 fr -212.107.83.48 - 212.107.83.63 de -212.107.83.64 - 212.107.83.95 gb -212.107.83.96 - 212.107.83.111 us -212.107.83.112 - 212.107.83.127 gb -212.107.83.128 - 212.107.83.239 fr -212.107.83.240 - 212.107.83.255 gb -212.107.84.0 - 212.107.85.63 fr -212.107.85.64 - 212.107.85.79 be -212.107.85.80 - 212.107.88.23 fr -212.107.88.24 - 212.107.88.31 gb -212.107.88.32 - 212.107.88.47 fr -212.107.88.48 - 212.107.88.55 gb -212.107.88.56 - 212.107.95.79 fr -212.107.95.80 - 212.107.95.95 de -212.107.95.96 - 212.107.95.223 fr -212.107.95.224 - 212.107.95.239 de -212.107.95.240 - 212.107.95.255 fr +212.107.64.0 - 212.107.95.255 fr 212.107.96.0 - 212.107.127.255 sa 212.107.128.0 - 212.107.159.255 se 212.107.160.0 - 212.107.191.255 de 212.107.192.0 - 212.107.255.255 ru -212.108.0.0 - 212.108.2.39 nl -212.108.2.40 - 212.108.2.47 gb -212.108.2.48 - 212.108.2.127 nl -212.108.2.128 - 212.108.2.135 es -212.108.2.136 - 212.108.2.191 nl -212.108.2.192 - 212.108.2.255 es -212.108.3.0 - 212.108.3.127 nl -212.108.3.128 - 212.108.3.135 es -212.108.3.136 - 212.108.3.223 nl -212.108.3.224 - 212.108.3.255 es -212.108.4.0 - 212.108.5.19 nl -212.108.5.20 - 212.108.5.23 es -212.108.5.24 - 212.108.5.27 nl -212.108.5.28 - 212.108.5.47 es -212.108.5.48 - 212.108.5.191 nl -212.108.5.192 - 212.108.5.223 es -212.108.5.224 - 212.108.5.231 nl -212.108.5.232 - 212.108.5.255 es -212.108.6.0 - 212.108.7.255 gb -212.108.8.0 - 212.108.9.15 nl -212.108.9.16 - 212.108.9.23 fi -212.108.9.24 - 212.108.9.31 nl -212.108.9.32 - 212.108.9.63 es -212.108.9.64 - 212.108.9.255 nl -212.108.10.0 - 212.108.11.255 gb -212.108.12.0 - 212.108.12.63 nl -212.108.12.64 - 212.108.12.79 es -212.108.12.80 - 212.108.12.95 nl -212.108.12.96 - 212.108.12.127 es -212.108.12.128 - 212.108.12.255 nl -212.108.13.0 - 212.108.13.127 es -212.108.13.128 - 212.108.16.63 nl -212.108.16.64 - 212.108.16.127 es -212.108.16.128 - 212.108.16.255 nl -212.108.17.0 - 212.108.17.39 es -212.108.17.40 - 212.108.17.47 nl -212.108.17.48 - 212.108.17.63 es -212.108.17.64 - 212.108.17.159 nl -212.108.17.160 - 212.108.17.175 gb -212.108.17.176 - 212.108.17.184 nl -212.108.17.185 - 212.108.17.191 es -212.108.17.192 - 212.108.18.255 nl -212.108.19.0 - 212.108.19.255 es -212.108.20.0 - 212.108.22.7 nl -212.108.22.8 - 212.108.22.15 es -212.108.22.16 - 212.108.22.63 nl -212.108.22.64 - 212.108.22.127 es -212.108.22.128 - 212.108.22.255 nl -212.108.23.0 - 212.108.24.255 es -212.108.25.0 - 212.108.25.15 nl -212.108.25.16 - 212.108.25.23 es -212.108.25.24 - 212.108.25.111 nl -212.108.25.112 - 212.108.25.159 es -212.108.25.160 - 212.108.25.179 nl -212.108.25.180 - 212.108.26.255 es -212.108.27.0 - 212.108.27.255 nl -212.108.28.0 - 212.108.29.255 es -212.108.30.0 - 212.108.30.127 nl -212.108.30.128 - 212.108.30.191 es -212.108.30.192 - 212.108.30.223 nl -212.108.30.224 - 212.108.30.255 es -212.108.31.0 - 212.108.31.255 us +212.108.0.0 - 212.108.2.255 nl +212.108.3.0 - 212.108.3.255 eu +212.108.4.0 - 212.108.4.143 nl +212.108.4.144 - 212.108.4.144 eu +212.108.4.145 - 212.108.4.145 nl +212.108.4.146 - 212.108.4.151 eu +212.108.4.152 - 212.108.31.255 nl 212.108.32.0 - 212.108.63.255 at 212.108.64.0 - 212.108.95.255 gb 212.108.96.0 - 212.108.127.255 ru 212.108.128.0 - 212.108.159.255 tr 212.108.160.0 - 212.108.191.255 de -212.108.192.0 - 212.108.203.255 hu -212.108.204.0 - 212.108.204.255 sk -212.108.205.0 - 212.108.205.255 hu -212.108.206.0 - 212.108.206.255 sk -212.108.207.0 - 212.108.255.255 hu +212.108.192.0 - 212.108.255.255 hu 212.109.0.0 - 212.109.31.255 ru 212.109.32.0 - 212.109.63.255 ua 212.109.64.0 - 212.109.95.255 ch 212.109.96.0 - 212.109.127.255 tr -212.109.128.0 - 212.109.159.255 pl -212.109.160.0 - 212.109.191.255 it +212.109.128.0 - 212.109.167.255 pl +212.109.168.0 - 212.109.175.255 ru +212.109.176.0 - 212.109.191.255 cz 212.109.192.0 - 212.109.223.255 ru 212.109.224.0 - 212.109.255.255 tr 212.110.0.0 - 212.110.63.255 it 212.110.64.0 - 212.110.95.255 mk -212.110.96.0 - 212.110.114.255 de -212.110.115.0 - 212.110.115.31 ch -212.110.115.32 - 212.110.127.255 de +212.110.96.0 - 212.110.127.255 de 212.110.128.0 - 212.110.159.255 ua -212.110.160.0 - 212.110.165.255 gb -212.110.166.0 - 212.110.166.31 it -212.110.166.32 - 212.110.177.31 gb -212.110.177.32 - 212.110.177.39 it -212.110.177.40 - 212.110.177.71 gb -212.110.177.72 - 212.110.177.79 it -212.110.177.80 - 212.110.191.255 gb -212.110.192.0 - 212.110.224.255 de -212.110.225.0 - 212.110.236.255 a2 -212.110.237.0 - 212.110.237.255 de -212.110.238.0 - 212.110.243.255 a2 -212.110.244.0 - 212.110.245.255 ru -212.110.246.0 - 212.110.251.255 a2 -212.110.252.0 - 212.110.252.255 de -212.110.253.0 - 212.110.255.255 a2 +212.110.160.0 - 212.110.175.255 gb +212.110.176.0 - 212.110.179.255 it +212.110.180.0 - 212.110.191.255 gb +212.110.192.0 - 212.110.255.255 de 212.111.0.0 - 212.111.31.255 cz 212.111.32.0 - 212.111.63.255 gb 212.111.64.0 - 212.111.95.255 ru 212.111.96.0 - 212.111.127.255 es 212.111.128.0 - 212.111.191.255 gb 212.111.192.0 - 212.111.223.255 ua -212.111.224.0 - 212.111.232.63 de -212.111.232.64 - 212.111.232.79 a2 -212.111.232.80 - 212.111.255.255 de +212.111.224.0 - 212.111.255.255 de 212.112.0.0 - 212.112.63.255 se -212.112.64.0 - 212.112.72.31 it -212.112.72.32 - 212.112.72.47 bg -212.112.72.48 - 212.112.77.191 it +212.112.64.0 - 212.112.77.191 it 212.112.77.192 - 212.112.77.207 ph -212.112.77.208 - 212.112.81.95 it -212.112.81.96 - 212.112.81.111 in -212.112.81.112 - 212.112.95.255 it +212.112.77.208 - 212.112.95.255 it 212.112.96.0 - 212.112.127.255 kg -212.112.128.0 - 212.112.141.255 de -212.112.142.0 - 212.112.159.255 dk -212.112.160.0 - 212.112.167.31 se -212.112.167.32 - 212.112.167.63 no -212.112.167.64 - 212.112.168.255 se -212.112.169.0 - 212.112.169.63 no -212.112.169.64 - 212.112.169.111 se -212.112.169.112 - 212.112.169.119 nl -212.112.169.120 - 212.112.181.255 se -212.112.182.0 - 212.112.182.3 no -212.112.182.4 - 212.112.183.247 se -212.112.183.248 - 212.112.183.255 fi -212.112.184.0 - 212.112.185.23 se -212.112.185.24 - 212.112.185.31 no -212.112.185.32 - 212.112.191.231 se -212.112.191.232 - 212.112.191.235 no -212.112.191.236 - 212.112.191.255 se -212.112.192.0 - 212.112.203.63 de -212.112.203.64 - 212.112.203.99 nl -212.112.203.100 - 212.112.215.255 de -212.112.216.0 - 212.112.217.63 nl -212.112.217.64 - 212.112.255.255 de +212.112.128.0 - 212.112.159.255 dk +212.112.160.0 - 212.112.176.63 se +212.112.176.64 - 212.112.176.95 fi +212.112.176.96 - 212.112.191.111 se +212.112.191.112 - 212.112.191.119 fi +212.112.191.120 - 212.112.191.255 se +212.112.192.0 - 212.112.255.255 de 212.113.0.0 - 212.113.31.255 gb -212.113.32.0 - 212.113.37.255 ua -212.113.38.0 - 212.113.38.255 de -212.113.39.0 - 212.113.63.255 ua +212.113.32.0 - 212.113.63.255 ua 212.113.64.0 - 212.113.95.255 be 212.113.96.0 - 212.113.127.255 ru -212.113.128.0 - 212.113.145.255 gb -212.113.146.0 - 212.113.147.15 ie -212.113.147.16 - 212.113.159.255 gb +212.113.128.0 - 212.113.159.255 gb 212.113.160.0 - 212.113.191.255 pt 212.113.192.0 - 212.113.223.255 gb -212.113.224.0 - 212.113.255.255 ru -212.114.0.0 - 212.114.1.255 tj -212.114.2.0 - 212.114.31.255 ru -212.114.32.0 - 212.114.77.127 de -212.114.77.128 - 212.114.77.255 nl -212.114.78.0 - 212.114.95.255 de +212.113.224.0 - 212.114.31.255 ru +212.114.32.0 - 212.114.95.255 de 212.114.96.0 - 212.114.127.255 nl -212.114.128.0 - 212.114.200.55 de -212.114.200.56 - 212.114.200.63 at -212.114.200.64 - 212.114.241.63 de -212.114.241.64 - 212.114.241.95 be -212.114.241.96 - 212.114.255.255 de +212.114.128.0 - 212.114.255.255 de 212.115.0.0 - 212.115.31.255 tr -212.115.32.0 - 212.115.63.255 gb 212.115.64.0 - 212.115.95.255 it -212.115.96.0 - 212.115.127.255 es -212.115.128.0 - 212.115.131.23 gb -212.115.131.24 - 212.115.131.31 nl -212.115.131.32 - 212.115.146.223 gb -212.115.146.224 - 212.115.146.239 nl -212.115.146.240 - 212.115.151.55 gb -212.115.151.56 - 212.115.151.63 nl -212.115.151.64 - 212.115.168.175 gb -212.115.168.176 - 212.115.168.191 nl -212.115.168.192 - 212.115.171.191 gb -212.115.171.192 - 212.115.171.223 nl -212.115.171.224 - 212.115.175.207 gb -212.115.175.208 - 212.115.175.223 nl -212.115.175.224 - 212.115.176.63 gb -212.115.176.64 - 212.115.176.127 nl -212.115.176.128 - 212.115.182.183 gb -212.115.182.184 - 212.115.182.191 nl -212.115.182.192 - 212.115.191.255 gb +212.115.128.0 - 212.115.191.255 gb 212.115.192.0 - 212.115.223.255 nl 212.115.224.0 - 212.115.255.255 ua 212.116.0.0 - 212.116.31.255 de @@ -142471,714 +110871,156 @@ 212.116.128.0 - 212.116.159.255 bg 212.116.160.0 - 212.116.191.255 il 212.116.192.0 - 212.116.223.255 sa -212.116.224.0 - 212.116.232.207 kz -212.116.232.208 - 212.116.232.223 af -212.116.232.224 - 212.116.255.255 kz +212.116.224.0 - 212.116.255.255 kz 212.117.0.0 - 212.117.31.255 lt 212.117.32.0 - 212.117.63.255 bg 212.117.64.0 - 212.117.95.255 de 212.117.96.0 - 212.117.127.255 ch -212.117.128.0 - 212.117.140.95 il -212.117.140.96 - 212.117.140.111 a2 -212.117.140.112 - 212.117.159.255 il -212.117.160.0 - 212.117.191.255 lu +212.117.128.0 - 212.117.159.255 il +212.117.160.0 - 212.117.160.255 ae +212.117.161.0 - 212.117.191.255 lu 212.117.192.0 - 212.117.223.255 ch -212.117.224.0 - 212.117.224.59 gb -212.117.224.60 - 212.117.224.63 fr -212.117.224.64 - 212.117.224.255 gb -212.117.225.0 - 212.117.225.63 de -212.117.225.64 - 212.117.225.99 gb -212.117.225.100 - 212.117.226.255 eu -212.117.227.0 - 212.117.227.127 gb -212.117.227.128 - 212.117.227.255 eu -212.117.228.0 - 212.117.228.55 gb -212.117.228.56 - 212.117.228.63 eu -212.117.228.64 - 212.117.228.239 gb -212.117.228.240 - 212.117.228.255 eu -212.117.229.0 - 212.117.229.47 gb -212.117.229.48 - 212.117.229.55 eu -212.117.229.56 - 212.117.229.71 gb -212.117.229.72 - 212.117.229.79 eu -212.117.229.80 - 212.117.229.87 gb -212.117.229.88 - 212.117.229.95 eu -212.117.229.96 - 212.117.229.135 gb -212.117.229.136 - 212.117.229.143 eu -212.117.229.144 - 212.117.229.191 gb -212.117.229.192 - 212.117.229.199 fr -212.117.229.200 - 212.117.229.207 eu -212.117.229.208 - 212.117.230.223 gb -212.117.230.224 - 212.117.230.255 eu -212.117.231.0 - 212.117.231.15 gb -212.117.231.16 - 212.117.231.31 eu -212.117.231.32 - 212.117.231.207 gb -212.117.231.208 - 212.117.231.223 fr -212.117.231.224 - 212.117.231.255 gb -212.117.232.0 - 212.117.239.255 eu -212.117.240.0 - 212.117.240.63 nl -212.117.240.64 - 212.117.240.111 gb -212.117.240.112 - 212.117.240.255 eu -212.117.241.0 - 212.117.241.15 nl -212.117.241.16 - 212.117.241.31 dk -212.117.241.32 - 212.117.241.39 nl -212.117.241.40 - 212.117.241.47 eu -212.117.241.48 - 212.117.241.135 gb -212.117.241.136 - 212.117.241.255 eu -212.117.242.0 - 212.117.242.95 nl -212.117.242.96 - 212.117.242.255 gb -212.117.243.0 - 212.117.247.255 eu -212.117.248.0 - 212.117.248.7 se -212.117.248.8 - 212.117.248.255 eu -212.117.249.0 - 212.117.249.15 de -212.117.249.16 - 212.117.249.31 se -212.117.249.32 - 212.117.249.63 gb -212.117.249.64 - 212.117.249.255 eu -212.117.250.0 - 212.117.250.3 se -212.117.250.4 - 212.117.250.7 de -212.117.250.8 - 212.117.250.255 eu -212.117.251.0 - 212.117.251.127 de -212.117.251.128 - 212.117.253.255 eu -212.117.254.0 - 212.117.254.31 de -212.117.254.32 - 212.117.254.63 gb -212.117.254.64 - 212.117.255.255 eu +212.117.224.0 - 212.117.255.255 eu 212.118.0.0 - 212.118.31.255 jo 212.118.32.0 - 212.118.63.255 ru 212.118.64.0 - 212.118.95.255 si 212.118.96.0 - 212.118.159.255 sa 212.118.160.0 - 212.118.223.255 de -212.118.224.0 - 212.118.224.7 us -212.118.224.8 - 212.118.224.15 ca -212.118.224.16 - 212.118.224.47 us -212.118.224.48 - 212.118.224.127 gb -212.118.224.128 - 212.118.224.143 us -212.118.224.144 - 212.118.224.159 gb -212.118.224.160 - 212.118.224.223 us -212.118.224.224 - 212.118.226.175 gb -212.118.226.176 - 212.118.226.191 us -212.118.226.192 - 212.118.226.255 gb -212.118.227.0 - 212.118.227.255 us -212.118.228.0 - 212.118.228.255 gb -212.118.229.0 - 212.118.229.7 us -212.118.229.8 - 212.118.229.15 gb -212.118.229.16 - 212.118.229.23 us -212.118.229.24 - 212.118.229.31 gb -212.118.229.32 - 212.118.229.255 us -212.118.230.0 - 212.118.231.255 ch -212.118.232.0 - 212.118.232.255 gb -212.118.233.0 - 212.118.233.143 us -212.118.233.144 - 212.118.233.159 gb -212.118.233.160 - 212.118.233.255 us -212.118.234.0 - 212.118.236.255 gb -212.118.237.0 - 212.118.237.255 us -212.118.238.0 - 212.118.238.255 gb -212.118.239.0 - 212.118.239.15 us -212.118.239.16 - 212.118.239.127 gb -212.118.239.128 - 212.118.239.191 us -212.118.239.192 - 212.118.242.239 gb -212.118.242.240 - 212.118.242.247 us -212.118.242.248 - 212.118.242.255 gb -212.118.243.0 - 212.118.243.31 us -212.118.243.32 - 212.118.243.79 gb -212.118.243.80 - 212.118.243.191 us -212.118.243.192 - 212.118.244.63 gb -212.118.244.64 - 212.118.244.127 us -212.118.244.128 - 212.118.244.159 gb -212.118.244.160 - 212.118.244.175 us -212.118.244.176 - 212.118.246.31 gb -212.118.246.32 - 212.118.246.63 us -212.118.246.64 - 212.118.246.127 gb -212.118.246.128 - 212.118.246.159 us -212.118.246.160 - 212.118.246.223 gb -212.118.246.224 - 212.118.247.255 us -212.118.248.0 - 212.118.250.7 gb -212.118.250.8 - 212.118.250.15 us -212.118.250.16 - 212.118.250.39 gb -212.118.250.40 - 212.118.250.55 us -212.118.250.56 - 212.118.250.103 gb -212.118.250.104 - 212.118.250.111 us -212.118.250.112 - 212.118.250.143 gb -212.118.250.144 - 212.118.250.159 us -212.118.250.160 - 212.118.250.207 gb -212.118.250.208 - 212.118.250.215 us -212.118.250.216 - 212.118.250.223 gb -212.118.250.224 - 212.118.251.255 us -212.118.252.0 - 212.118.252.255 gb -212.118.253.0 - 212.118.253.127 us -212.118.253.128 - 212.118.253.231 gb -212.118.253.232 - 212.118.253.255 us -212.118.254.0 - 212.118.254.159 gb -212.118.254.160 - 212.118.254.167 us -212.118.254.168 - 212.118.254.191 gb -212.118.254.192 - 212.118.254.255 us -212.118.255.0 - 212.119.9.175 gb -212.119.9.176 - 212.119.9.191 de -212.119.9.192 - 212.119.9.255 gb -212.119.10.0 - 212.119.11.63 fr -212.119.11.64 - 212.119.11.87 gb -212.119.11.88 - 212.119.11.95 fr -212.119.11.96 - 212.119.11.119 gb -212.119.11.120 - 212.119.11.127 fr -212.119.11.128 - 212.119.11.175 gb -212.119.11.176 - 212.119.11.191 fr -212.119.11.192 - 212.119.11.199 gb -212.119.11.200 - 212.119.11.207 fr -212.119.11.208 - 212.119.14.111 gb -212.119.14.112 - 212.119.14.127 de -212.119.14.128 - 212.119.14.255 gb -212.119.15.0 - 212.119.15.127 de -212.119.15.128 - 212.119.19.255 gb -212.119.20.0 - 212.119.21.127 de -212.119.21.128 - 212.119.31.255 gb -212.119.32.0 - 212.119.63.255 ru +212.118.224.0 - 212.118.224.147 gb +212.118.224.148 - 212.118.224.148 eu +212.118.224.149 - 212.119.12.47 gb +212.119.12.48 - 212.119.12.55 de +212.119.12.56 - 212.119.15.11 gb +212.119.15.12 - 212.119.15.15 es +212.119.15.16 - 212.119.15.111 gb +212.119.15.112 - 212.119.15.115 dk +212.119.15.116 - 212.119.24.127 gb +212.119.24.128 - 212.119.24.255 nl +212.119.25.0 - 212.119.26.255 gb +212.119.27.0 - 212.119.27.127 de +212.119.27.128 - 212.119.31.255 gb 212.119.64.0 - 212.119.95.255 sa 212.119.96.0 - 212.119.127.255 ru -212.119.128.0 - 212.119.159.255 at +212.119.128.0 - 212.119.159.255 ee 212.119.160.0 - 212.119.255.255 ru 212.120.0.0 - 212.120.31.255 mk 212.120.32.0 - 212.120.63.255 ch 212.120.64.0 - 212.120.127.255 nl -212.120.128.0 - 212.120.136.31 ie -212.120.136.32 - 212.120.136.63 gb -212.120.136.64 - 212.120.136.175 ie -212.120.136.176 - 212.120.136.191 gb -212.120.136.192 - 212.120.137.223 ie -212.120.137.224 - 212.120.137.255 gb -212.120.138.0 - 212.120.140.255 ie -212.120.141.0 - 212.120.141.31 gb -212.120.141.32 - 212.120.151.255 ie -212.120.152.0 - 212.120.152.31 gb -212.120.152.32 - 212.120.152.111 ie -212.120.152.112 - 212.120.152.191 gb -212.120.152.192 - 212.120.153.127 ie -212.120.153.128 - 212.120.154.127 gb -212.120.154.128 - 212.120.154.255 ie -212.120.155.0 - 212.120.155.15 gb -212.120.155.16 - 212.120.155.31 ie -212.120.155.32 - 212.120.155.47 gb -212.120.155.48 - 212.120.155.255 ie -212.120.156.0 - 212.120.157.127 gb -212.120.157.128 - 212.120.159.255 ie +212.120.128.0 - 212.120.135.255 ie +212.120.136.0 - 212.120.136.255 eu +212.120.137.0 - 212.120.159.255 ie 212.120.160.0 - 212.120.191.255 ru 212.120.192.0 - 212.120.223.255 ir 212.120.224.0 - 212.120.255.255 gi 212.121.0.0 - 212.121.63.255 gb 212.121.64.0 - 212.121.95.255 it 212.121.96.0 - 212.121.127.255 nl -212.121.128.0 - 212.121.130.255 de -212.121.131.0 - 212.121.131.255 gb -212.121.132.0 - 212.121.135.79 de -212.121.135.80 - 212.121.135.95 gb -212.121.135.96 - 212.121.135.191 de -212.121.135.192 - 212.121.135.223 gb -212.121.135.224 - 212.121.137.95 de -212.121.137.96 - 212.121.137.103 gb -212.121.137.104 - 212.121.137.127 de -212.121.137.128 - 212.121.137.255 gb -212.121.138.0 - 212.121.143.255 de -212.121.144.0 - 212.121.144.15 gb -212.121.144.16 - 212.121.144.71 de -212.121.144.72 - 212.121.144.91 gb -212.121.144.92 - 212.121.144.95 de -212.121.144.96 - 212.121.144.99 gb -212.121.144.100 - 212.121.144.111 de -212.121.144.112 - 212.121.144.119 gb -212.121.144.120 - 212.121.145.103 de -212.121.145.104 - 212.121.145.119 gb -212.121.145.120 - 212.121.145.127 de -212.121.145.128 - 212.121.145.135 gb -212.121.145.136 - 212.121.145.159 de -212.121.145.160 - 212.121.145.191 gb -212.121.145.192 - 212.121.145.199 de -212.121.145.200 - 212.121.145.207 gb -212.121.145.208 - 212.121.145.223 de -212.121.145.224 - 212.121.145.255 gb -212.121.146.0 - 212.121.155.7 de -212.121.155.8 - 212.121.155.15 gb -212.121.155.16 - 212.121.155.55 de -212.121.155.56 - 212.121.155.63 es -212.121.155.64 - 212.121.155.167 de -212.121.155.168 - 212.121.155.175 gb -212.121.155.176 - 212.121.155.191 at -212.121.155.192 - 212.121.156.223 gb -212.121.156.224 - 212.121.156.231 de -212.121.156.232 - 212.121.156.239 gb -212.121.156.240 - 212.121.158.255 de -212.121.159.0 - 212.121.159.31 gb -212.121.159.32 - 212.121.159.103 de -212.121.159.104 - 212.121.159.107 gb -212.121.159.108 - 212.121.159.127 de -212.121.159.128 - 212.121.159.143 gb -212.121.159.144 - 212.121.159.151 de -212.121.159.152 - 212.121.159.175 gb -212.121.159.176 - 212.121.159.239 de -212.121.159.240 - 212.121.159.243 gb -212.121.159.244 - 212.121.159.247 de -212.121.159.248 - 212.121.159.251 gb -212.121.159.252 - 212.121.159.255 de +212.121.128.0 - 212.121.130.255 gb +212.121.131.0 - 212.121.131.255 de +212.121.132.0 - 212.121.134.255 gb +212.121.135.0 - 212.121.135.249 eu +212.121.135.250 - 212.121.135.250 de +212.121.135.251 - 212.121.135.255 eu +212.121.136.0 - 212.121.137.21 gb +212.121.137.22 - 212.121.137.22 de +212.121.137.23 - 212.121.137.23 gb +212.121.137.24 - 212.121.137.31 de +212.121.137.32 - 212.121.144.23 gb +212.121.144.24 - 212.121.144.31 de +212.121.144.32 - 212.121.155.17 gb +212.121.155.18 - 212.121.155.18 de +212.121.155.19 - 212.121.155.39 gb +212.121.155.40 - 212.121.155.47 de +212.121.155.48 - 212.121.155.255 gb +212.121.156.0 - 212.121.156.255 de +212.121.157.0 - 212.121.157.255 gb +212.121.158.0 - 212.121.158.255 de +212.121.159.0 - 212.121.159.255 gb 212.121.160.0 - 212.121.191.255 fr 212.121.192.0 - 212.121.223.255 gb 212.121.224.0 - 212.121.255.255 es 212.122.0.0 - 212.122.31.255 ru 212.122.32.0 - 212.122.63.255 de -212.122.64.0 - 212.122.95.255 lt +212.122.64.0 - 212.122.86.255 lt +212.122.87.0 - 212.122.87.127 nl +212.122.87.128 - 212.122.95.255 lt 212.122.96.0 - 212.122.127.255 es 212.122.128.0 - 212.122.159.255 de 212.122.160.0 - 212.122.191.255 bg 212.122.192.0 - 212.122.223.255 pl 212.122.224.0 - 212.122.255.255 eg -212.123.0.0 - 212.123.31.255 be +212.123.0.0 - 212.123.2.255 be +212.123.3.0 - 212.123.3.255 eu +212.123.4.0 - 212.123.6.255 be +212.123.7.0 - 212.123.7.255 eu +212.123.8.0 - 212.123.31.255 be 212.123.32.0 - 212.123.63.255 de 212.123.64.0 - 212.123.95.255 it -212.123.96.0 - 212.123.125.143 de -212.123.125.144 - 212.123.125.151 ae -212.123.125.152 - 212.123.127.255 de -212.123.128.0 - 212.123.196.31 nl -212.123.196.32 - 212.123.196.47 gb -212.123.196.48 - 212.123.196.55 nl -212.123.196.56 - 212.123.196.71 fr -212.123.196.72 - 212.123.196.79 nl -212.123.196.80 - 212.123.196.95 gb -212.123.196.96 - 212.123.196.111 nl -212.123.196.112 - 212.123.196.207 gb -212.123.196.208 - 212.123.197.7 nl -212.123.197.8 - 212.123.197.47 gb -212.123.197.48 - 212.123.197.51 fr -212.123.197.52 - 212.123.197.79 gb -212.123.197.80 - 212.123.197.95 nl -212.123.197.96 - 212.123.197.191 gb -212.123.197.192 - 212.123.197.207 nl -212.123.197.208 - 212.123.197.239 gb -212.123.197.240 - 212.123.198.31 nl -212.123.198.32 - 212.123.198.47 gb -212.123.198.48 - 212.123.198.55 nl -212.123.198.56 - 212.123.198.63 gb -212.123.198.64 - 212.123.198.143 nl -212.123.198.144 - 212.123.198.191 gb -212.123.198.192 - 212.123.198.207 nl -212.123.198.208 - 212.123.198.255 gb -212.123.199.0 - 212.123.199.63 nl -212.123.199.64 - 212.123.200.15 gb -212.123.200.16 - 212.123.200.19 nl -212.123.200.20 - 212.123.200.79 gb -212.123.200.80 - 212.123.200.159 nl -212.123.200.160 - 212.123.200.175 gb -212.123.200.176 - 212.123.200.199 nl -212.123.200.200 - 212.123.200.223 gb -212.123.200.224 - 212.123.201.63 nl -212.123.201.64 - 212.123.204.63 gb -212.123.204.64 - 212.123.204.95 nl -212.123.204.96 - 212.123.204.127 gb -212.123.204.128 - 212.123.204.143 nl -212.123.204.144 - 212.123.204.255 gb -212.123.205.0 - 212.123.207.255 nl -212.123.208.0 - 212.123.208.255 gb -212.123.209.0 - 212.123.209.31 nl -212.123.209.32 - 212.123.209.79 gb -212.123.209.80 - 212.123.209.95 nl -212.123.209.96 - 212.123.209.111 gb -212.123.209.112 - 212.123.209.119 nl -212.123.209.120 - 212.123.209.135 gb -212.123.209.136 - 212.123.209.143 nl -212.123.209.144 - 212.123.209.183 gb -212.123.209.184 - 212.123.209.191 nl -212.123.209.192 - 212.123.209.207 gb -212.123.209.208 - 212.123.209.215 nl -212.123.209.216 - 212.123.210.7 gb -212.123.210.8 - 212.123.210.39 nl -212.123.210.40 - 212.123.210.47 fr -212.123.210.48 - 212.123.210.72 nl -212.123.210.73 - 212.123.210.79 gb -212.123.210.80 - 212.123.210.87 nl -212.123.210.88 - 212.123.210.255 gb -212.123.211.0 - 212.123.212.47 nl -212.123.212.48 - 212.123.212.223 gb -212.123.212.224 - 212.123.213.95 nl -212.123.213.96 - 212.123.213.111 gb -212.123.213.112 - 212.123.213.119 nl -212.123.213.120 - 212.123.213.239 gb -212.123.213.240 - 212.123.213.247 nl -212.123.213.248 - 212.123.213.255 gb -212.123.214.0 - 212.123.214.39 nl -212.123.214.40 - 212.123.214.47 be -212.123.214.48 - 212.123.214.55 nl -212.123.214.56 - 212.123.214.63 gb -212.123.214.64 - 212.123.214.95 nl -212.123.214.96 - 212.123.214.111 gb -212.123.214.112 - 212.123.214.127 nl -212.123.214.128 - 212.123.214.143 gb -212.123.214.144 - 212.123.214.159 nl -212.123.214.160 - 212.123.214.223 fr -212.123.214.224 - 212.123.214.239 nl -212.123.214.240 - 212.123.214.255 gb -212.123.215.0 - 212.123.215.15 nl -212.123.215.16 - 212.123.215.31 gb -212.123.215.32 - 212.123.215.39 nl -212.123.215.40 - 212.123.215.79 gb -212.123.215.80 - 212.123.215.95 nl -212.123.215.96 - 212.123.215.111 gb -212.123.215.112 - 212.123.215.127 nl -212.123.215.128 - 212.123.215.159 gb -212.123.215.160 - 212.123.215.175 nl -212.123.215.176 - 212.123.215.191 gb -212.123.215.192 - 212.123.215.207 nl -212.123.215.208 - 212.123.215.239 gb -212.123.215.240 - 212.123.216.15 nl -212.123.216.16 - 212.123.216.47 gb -212.123.216.48 - 212.123.216.63 nl -212.123.216.64 - 212.123.216.111 gb -212.123.216.112 - 212.123.216.127 nl -212.123.216.128 - 212.123.216.143 gb -212.123.216.144 - 212.123.216.191 nl -212.123.216.192 - 212.123.216.255 gb -212.123.217.0 - 212.123.217.7 nl -212.123.217.8 - 212.123.217.15 gb -212.123.217.16 - 212.123.217.23 nl -212.123.217.24 - 212.123.217.31 gb -212.123.217.32 - 212.123.217.95 nl -212.123.217.96 - 212.123.217.111 gb -212.123.217.112 - 212.123.217.143 nl -212.123.217.144 - 212.123.217.159 gb -212.123.217.160 - 212.123.217.255 nl -212.123.218.0 - 212.123.218.127 gb -212.123.218.128 - 212.123.218.223 nl -212.123.218.224 - 212.123.219.159 gb -212.123.219.160 - 212.123.219.167 nl -212.123.219.168 - 212.123.219.255 gb -212.123.220.0 - 212.123.223.255 nl -212.123.224.0 - 212.123.224.15 gb -212.123.224.16 - 212.123.224.31 ch -212.123.224.32 - 212.123.224.143 nl -212.123.224.144 - 212.123.224.159 gb -212.123.224.160 - 212.123.225.7 nl -212.123.225.8 - 212.123.225.15 gb -212.123.225.16 - 212.123.225.47 nl -212.123.225.48 - 212.123.225.63 fr -212.123.225.64 - 212.123.225.143 nl -212.123.225.144 - 212.123.225.159 de -212.123.225.160 - 212.123.225.183 nl -212.123.225.184 - 212.123.225.191 gb -212.123.225.192 - 212.123.225.207 de -212.123.225.208 - 212.123.226.15 nl -212.123.226.16 - 212.123.226.31 gb -212.123.226.32 - 212.123.226.79 nl -212.123.226.80 - 212.123.226.87 be -212.123.226.88 - 212.123.226.95 nl -212.123.226.96 - 212.123.226.159 be -212.123.226.160 - 212.123.226.239 nl -212.123.226.240 - 212.123.226.247 gb -212.123.226.248 - 212.123.227.127 nl -212.123.227.128 - 212.123.227.159 gb -212.123.227.160 - 212.123.227.191 fr -212.123.227.192 - 212.123.227.255 nl -212.123.228.0 - 212.123.228.31 gb -212.123.228.32 - 212.123.228.79 nl -212.123.228.80 - 212.123.228.127 gb -212.123.228.128 - 212.123.228.223 nl -212.123.228.224 - 212.123.229.31 gb -212.123.229.32 - 212.123.230.15 nl -212.123.230.16 - 212.123.230.23 de -212.123.230.24 - 212.123.230.39 nl -212.123.230.40 - 212.123.230.47 gb -212.123.230.48 - 212.123.230.95 nl -212.123.230.96 - 212.123.230.127 de -212.123.230.128 - 212.123.230.191 nl -212.123.230.192 - 212.123.230.207 gb -212.123.230.208 - 212.123.230.239 be -212.123.230.240 - 212.123.230.247 nl -212.123.230.248 - 212.123.230.255 gb -212.123.231.0 - 212.123.231.63 nl -212.123.231.64 - 212.123.231.127 gb -212.123.231.128 - 212.123.231.255 nl -212.123.232.0 - 212.123.232.31 gb -212.123.232.32 - 212.123.232.39 nl -212.123.232.40 - 212.123.232.47 gb -212.123.232.48 - 212.123.232.71 be -212.123.232.72 - 212.123.232.79 gb -212.123.232.80 - 212.123.232.95 nl -212.123.232.96 - 212.123.232.119 gb -212.123.232.120 - 212.123.232.159 nl -212.123.232.160 - 212.123.232.191 gb -212.123.232.192 - 212.123.232.255 nl -212.123.233.0 - 212.123.233.31 fr -212.123.233.32 - 212.123.233.159 nl -212.123.233.160 - 212.123.233.167 be -212.123.233.168 - 212.123.233.211 nl -212.123.233.212 - 212.123.233.223 gb -212.123.233.224 - 212.123.233.255 nl -212.123.234.0 - 212.123.234.15 be -212.123.234.16 - 212.123.234.31 nl -212.123.234.32 - 212.123.234.39 ie -212.123.234.40 - 212.123.234.79 nl -212.123.234.80 - 212.123.234.111 gb -212.123.234.112 - 212.123.234.159 nl -212.123.234.160 - 212.123.234.175 gb -212.123.234.176 - 212.123.234.207 nl -212.123.234.208 - 212.123.234.223 be -212.123.234.224 - 212.123.234.239 gb -212.123.234.240 - 212.123.234.255 be -212.123.235.0 - 212.123.235.63 nl -212.123.235.64 - 212.123.235.111 be -212.123.235.112 - 212.123.235.143 nl -212.123.235.144 - 212.123.236.255 gb -212.123.237.0 - 212.123.238.255 nl -212.123.239.0 - 212.123.240.255 gb -212.123.241.0 - 212.123.241.127 nl -212.123.241.128 - 212.123.241.159 gb -212.123.241.160 - 212.123.242.39 nl -212.123.242.40 - 212.123.242.63 gb -212.123.242.64 - 212.123.242.79 nl -212.123.242.80 - 212.123.242.95 gb -212.123.242.96 - 212.123.242.127 nl -212.123.242.128 - 212.123.243.111 gb -212.123.243.112 - 212.123.243.127 nl -212.123.243.128 - 212.123.244.191 gb -212.123.244.192 - 212.123.246.63 nl -212.123.246.64 - 212.123.246.255 gb -212.123.247.0 - 212.123.253.255 nl +212.123.96.0 - 212.123.127.255 de +212.123.128.0 - 212.123.191.255 nl +212.123.192.0 - 212.123.192.63 gb +212.123.192.64 - 212.123.192.127 nl +212.123.192.128 - 212.123.195.11 gb +212.123.195.12 - 212.123.195.15 nl +212.123.195.16 - 212.123.196.49 gb +212.123.196.50 - 212.123.196.50 nl +212.123.196.51 - 212.123.200.95 gb +212.123.200.96 - 212.123.200.111 nl +212.123.200.112 - 212.123.201.255 gb +212.123.202.0 - 212.123.202.255 eu +212.123.203.0 - 212.123.204.127 gb +212.123.204.128 - 212.123.204.135 nl +212.123.204.136 - 212.123.204.255 gb +212.123.205.0 - 212.123.205.255 nl +212.123.206.0 - 212.123.218.191 gb +212.123.218.192 - 212.123.218.223 nl +212.123.218.224 - 212.123.225.159 gb +212.123.225.160 - 212.123.225.175 nl +212.123.225.176 - 212.123.230.33 gb +212.123.230.34 - 212.123.230.34 nl +212.123.230.35 - 212.123.235.239 gb +212.123.235.240 - 212.123.235.255 nl +212.123.236.0 - 212.123.251.255 gb +212.123.252.0 - 212.123.253.255 nl 212.123.254.0 - 212.123.255.255 gb 212.124.0.0 - 212.124.31.255 ru 212.124.32.0 - 212.124.63.255 de -212.124.64.0 - 212.124.95.255 bg -212.124.96.0 - 212.124.99.255 es -212.124.100.0 - 212.124.127.255 us +212.124.64.0 - 212.124.87.255 nl +212.124.88.0 - 212.124.95.255 it +212.124.96.0 - 212.124.100.255 de +212.124.101.0 - 212.124.127.255 us 212.124.128.0 - 212.124.159.255 at -212.124.160.0 - 212.124.191.255 rs -212.124.192.0 - 212.124.198.231 gb -212.124.198.232 - 212.124.198.239 fr -212.124.198.240 - 212.124.202.95 gb -212.124.202.96 - 212.124.202.103 ie -212.124.202.104 - 212.124.203.95 gb -212.124.203.96 - 212.124.203.127 ie -212.124.203.128 - 212.124.224.47 gb -212.124.224.48 - 212.124.224.51 ch -212.124.224.52 - 212.124.224.127 gb -212.124.224.128 - 212.124.224.143 at -212.124.224.144 - 212.124.224.144 gb -212.124.224.145 - 212.124.224.159 at -212.124.224.160 - 212.124.224.191 gb -212.124.224.192 - 212.124.225.63 at -212.124.225.64 - 212.124.225.255 gb -212.124.226.0 - 212.124.226.19 at -212.124.226.20 - 212.124.226.27 gb -212.124.226.28 - 212.124.226.31 at -212.124.226.32 - 212.124.226.43 gb -212.124.226.44 - 212.124.226.47 at -212.124.226.48 - 212.124.226.63 de -212.124.226.64 - 212.124.226.71 at -212.124.226.72 - 212.124.226.79 ch -212.124.226.80 - 212.124.226.99 at -212.124.226.100 - 212.124.226.119 gb -212.124.226.120 - 212.124.226.127 at -212.124.226.128 - 212.124.226.191 gb -212.124.226.192 - 212.124.226.199 at -212.124.226.200 - 212.124.226.255 gb -212.124.227.0 - 212.124.227.15 at -212.124.227.16 - 212.124.227.47 gb -212.124.227.48 - 212.124.227.63 de -212.124.227.64 - 212.124.234.0 gb -212.124.234.1 - 212.124.235.255 at -212.124.236.0 - 212.124.236.15 gb -212.124.236.16 - 212.124.236.47 at -212.124.236.48 - 212.124.236.63 gb -212.124.236.64 - 212.124.236.79 at -212.124.236.80 - 212.124.236.95 us -212.124.236.96 - 212.124.236.159 at -212.124.236.160 - 212.124.236.167 gb -212.124.236.168 - 212.124.236.183 at -212.124.236.184 - 212.124.236.231 gb -212.124.236.232 - 212.124.236.235 at -212.124.236.236 - 212.124.236.239 ch -212.124.236.240 - 212.124.236.255 at -212.124.237.0 - 212.124.237.39 gb -212.124.237.40 - 212.124.237.43 ch -212.124.237.44 - 212.124.237.47 us -212.124.237.48 - 212.124.237.51 gb -212.124.237.52 - 212.124.237.63 at -212.124.237.64 - 212.124.237.71 gb -212.124.237.72 - 212.124.237.79 at -212.124.237.80 - 212.124.237.95 gb -212.124.237.96 - 212.124.237.111 at -212.124.237.112 - 212.124.237.159 gb -212.124.237.160 - 212.124.238.71 at -212.124.238.72 - 212.124.238.79 gb -212.124.238.80 - 212.124.238.255 at -212.124.239.0 - 212.124.239.7 gb -212.124.239.8 - 212.124.239.15 ch -212.124.239.16 - 212.124.239.19 at -212.124.239.20 - 212.124.239.31 gb -212.124.239.32 - 212.124.239.59 at -212.124.239.60 - 212.124.239.63 gb -212.124.239.64 - 212.124.239.67 at -212.124.239.68 - 212.124.239.71 gb -212.124.239.72 - 212.124.239.79 at -212.124.239.80 - 212.124.239.87 gb -212.124.239.88 - 212.124.239.91 at -212.124.239.92 - 212.124.239.107 gb -212.124.239.108 - 212.124.239.111 at -212.124.239.112 - 212.124.239.119 gb -212.124.239.120 - 212.124.239.151 at -212.124.239.152 - 212.124.239.155 gb -212.124.239.156 - 212.124.239.159 at -212.124.239.160 - 212.124.239.167 gb -212.124.239.168 - 212.124.239.175 at -212.124.239.176 - 212.124.239.179 gb -212.124.239.180 - 212.124.239.191 at -212.124.239.192 - 212.124.239.223 gb -212.124.239.224 - 212.124.239.231 at -212.124.239.232 - 212.124.239.239 gb -212.124.239.240 - 212.124.239.255 at -212.124.240.0 - 212.124.240.159 gb -212.124.240.160 - 212.124.240.163 es -212.124.240.164 - 212.124.240.167 at -212.124.240.168 - 212.124.240.171 it -212.124.240.172 - 212.124.240.175 at -212.124.240.176 - 212.124.240.195 gb -212.124.240.196 - 212.124.240.207 at -212.124.240.208 - 212.124.240.215 gb -212.124.240.216 - 212.124.240.223 at -212.124.240.224 - 212.124.240.255 gb -212.124.241.0 - 212.124.241.15 at -212.124.241.16 - 212.124.241.35 gb -212.124.241.36 - 212.124.241.63 at -212.124.241.64 - 212.124.241.159 gb -212.124.241.160 - 212.124.241.191 at -212.124.241.192 - 212.124.241.195 gb -212.124.241.196 - 212.124.241.203 at -212.124.241.204 - 212.124.241.207 gb -212.124.241.208 - 212.124.241.227 at -212.124.241.228 - 212.124.241.231 us -212.124.241.232 - 212.124.241.239 at -212.124.241.240 - 212.124.241.255 gb -212.124.242.0 - 212.124.242.255 at -212.124.243.0 - 212.124.243.23 gb -212.124.243.24 - 212.124.243.127 at -212.124.243.128 - 212.124.243.255 gb -212.124.244.0 - 212.124.244.79 at -212.124.244.80 - 212.124.244.87 gb -212.124.244.88 - 212.124.244.127 at -212.124.244.128 - 212.124.244.191 gb -212.124.244.192 - 212.124.244.255 at -212.124.245.0 - 212.124.245.31 nl -212.124.245.32 - 212.124.245.79 at -212.124.245.80 - 212.124.245.99 gb -212.124.245.100 - 212.124.245.115 at -212.124.245.116 - 212.124.245.119 gb -212.124.245.120 - 212.124.245.127 at -212.124.245.128 - 212.124.245.143 gb -212.124.245.144 - 212.124.245.151 at -212.124.245.152 - 212.124.245.159 gb -212.124.245.160 - 212.124.245.179 at -212.124.245.180 - 212.124.245.215 gb -212.124.245.216 - 212.124.245.219 at -212.124.245.220 - 212.124.245.223 gb -212.124.245.224 - 212.124.245.251 at -212.124.245.252 - 212.124.245.255 gb -212.124.246.0 - 212.124.246.127 at -212.124.246.128 - 212.124.246.151 gb -212.124.246.152 - 212.124.246.159 at -212.124.246.160 - 212.124.246.167 sa -212.124.246.168 - 212.124.246.175 at -212.124.246.176 - 212.124.246.191 ch -212.124.246.192 - 212.124.246.211 gb -212.124.246.212 - 212.124.246.219 at -212.124.246.220 - 212.124.246.223 fr -212.124.246.224 - 212.124.246.239 gb -212.124.246.240 - 212.124.246.247 at -212.124.246.248 - 212.124.246.255 gb -212.124.247.0 - 212.124.247.7 at -212.124.247.8 - 212.124.247.11 gb -212.124.247.12 - 212.124.247.31 at -212.124.247.32 - 212.124.247.47 gb -212.124.247.48 - 212.124.247.63 at -212.124.247.64 - 212.124.247.79 gb -212.124.247.80 - 212.124.247.91 at -212.124.247.92 - 212.124.247.95 gb -212.124.247.96 - 212.124.247.127 at -212.124.247.128 - 212.124.247.135 gb -212.124.247.136 - 212.124.247.151 at -212.124.247.152 - 212.124.247.167 gb -212.124.247.168 - 212.124.247.175 ch -212.124.247.176 - 212.124.247.191 at -212.124.247.192 - 212.124.247.207 gb -212.124.247.208 - 212.124.247.223 at -212.124.247.224 - 212.124.248.11 gb -212.124.248.12 - 212.124.248.15 at -212.124.248.16 - 212.124.248.31 gb -212.124.248.32 - 212.124.248.63 at -212.124.248.64 - 212.124.248.95 gb -212.124.248.96 - 212.124.248.159 at -212.124.248.160 - 212.124.248.160 gb -212.124.248.161 - 212.124.248.223 at -212.124.248.224 - 212.124.248.255 gb -212.124.249.0 - 212.124.249.127 at -212.124.249.128 - 212.124.249.135 de -212.124.249.136 - 212.124.249.159 gb -212.124.249.160 - 212.124.249.195 at -212.124.249.196 - 212.124.249.211 gb -212.124.249.212 - 212.124.249.223 at -212.124.249.224 - 212.124.249.231 gb -212.124.249.232 - 212.124.250.255 at -212.124.251.0 - 212.124.251.31 gb -212.124.251.32 - 212.124.251.47 at -212.124.251.48 - 212.124.251.103 gb -212.124.251.104 - 212.124.251.111 fr -212.124.251.112 - 212.124.251.119 gb -212.124.251.120 - 212.124.251.127 at -212.124.251.128 - 212.124.251.255 gb -212.124.252.0 - 212.124.252.111 at -212.124.252.112 - 212.124.252.159 gb -212.124.252.160 - 212.124.252.191 at -212.124.252.192 - 212.124.252.223 gb -212.124.252.224 - 212.124.252.239 at -212.124.252.240 - 212.124.252.255 gb -212.124.253.0 - 212.124.253.55 at -212.124.253.56 - 212.124.253.127 gb -212.124.253.128 - 212.124.254.31 at -212.124.254.32 - 212.124.254.39 gb -212.124.254.40 - 212.124.255.255 at +212.124.160.0 - 212.124.191.255 it +212.124.192.0 - 212.124.223.255 gb +212.124.224.0 - 212.124.228.255 at +212.124.229.0 - 212.124.232.255 gb +212.124.233.0 - 212.124.235.255 at +212.124.236.0 - 212.124.236.255 gb +212.124.237.0 - 212.124.244.130 at +212.124.244.131 - 212.124.244.131 eu +212.124.244.132 - 212.124.252.191 at +212.124.252.192 - 212.124.252.207 gb +212.124.252.208 - 212.124.255.255 at 212.125.0.0 - 212.125.31.255 tr -212.125.32.0 - 212.125.42.63 de -212.125.42.64 - 212.125.42.79 at -212.125.42.80 - 212.125.42.87 de -212.125.42.88 - 212.125.42.95 li -212.125.42.96 - 212.125.63.255 de +212.125.32.0 - 212.125.63.255 de 212.125.64.0 - 212.125.95.255 gb 212.125.96.0 - 212.125.127.255 de 212.125.128.0 - 212.125.159.255 nl -212.125.160.0 - 212.125.177.143 no -212.125.177.144 - 212.125.177.147 se -212.125.177.148 - 212.125.198.183 no -212.125.198.184 - 212.125.198.187 se -212.125.198.188 - 212.125.255.255 no +212.125.160.0 - 212.125.255.255 no 212.126.0.0 - 212.126.31.255 pl 212.126.32.0 - 212.126.34.255 ie -212.126.35.0 - 212.126.35.255 gb -212.126.36.0 - 212.126.38.63 ie -212.126.38.64 - 212.126.38.79 gb -212.126.38.80 - 212.126.38.255 ie -212.126.39.0 - 212.126.39.255 gb -212.126.40.0 - 212.126.40.255 ie -212.126.41.0 - 212.126.43.255 gb -212.126.44.0 - 212.126.44.71 ie -212.126.44.72 - 212.126.44.95 gb -212.126.44.96 - 212.126.44.127 ie -212.126.44.128 - 212.126.44.135 gb -212.126.44.136 - 212.126.45.7 ie -212.126.45.8 - 212.126.47.255 gb -212.126.48.0 - 212.126.57.255 ie -212.126.58.0 - 212.126.63.255 gb -212.126.64.0 - 212.126.79.255 at -212.126.80.0 - 212.126.80.255 li -212.126.81.0 - 212.126.95.255 at +212.126.35.0 - 212.126.45.31 gb +212.126.45.32 - 212.126.45.47 ie +212.126.45.48 - 212.126.47.255 gb +212.126.48.0 - 212.126.55.255 ie +212.126.56.0 - 212.126.63.255 gb +212.126.64.0 - 212.126.95.255 at 212.126.96.0 - 212.126.127.255 iq 212.126.128.0 - 212.126.159.255 gb 212.126.160.0 - 212.126.191.255 ch 212.126.192.0 - 212.126.223.255 de 212.126.224.0 - 212.126.255.255 is -212.127.0.0 - 212.127.15.55 gb -212.127.15.56 - 212.127.15.63 ie -212.127.15.64 - 212.127.16.191 gb -212.127.16.192 - 212.127.16.207 tz -212.127.16.208 - 212.127.31.255 gb +212.127.0.0 - 212.127.31.255 gb 212.127.32.0 - 212.127.63.255 de 212.127.64.0 - 212.127.95.255 pl 212.127.96.0 - 212.127.127.255 tr @@ -143190,144 +111032,26 @@ 212.129.128.0 - 212.129.255.255 nl 212.130.0.0 - 212.130.255.255 dk 212.131.0.0 - 212.131.255.255 it -212.132.0.0 - 212.132.255.255 gb -212.133.0.0 - 212.133.0.255 ie +212.132.0.0 - 212.133.0.255 gb 212.133.1.0 - 212.133.3.127 fr 212.133.3.128 - 212.133.5.255 nl -212.133.6.0 - 212.133.6.255 se -212.133.7.0 - 212.133.7.255 sk -212.133.8.0 - 212.133.8.255 gb -212.133.9.0 - 212.133.9.255 es -212.133.10.0 - 212.133.10.255 gb -212.133.11.0 - 212.133.13.127 de -212.133.13.128 - 212.133.14.127 gb -212.133.14.128 - 212.133.14.159 de -212.133.14.160 - 212.133.15.255 gb -212.133.16.0 - 212.133.16.255 nl -212.133.17.0 - 212.133.19.255 gb -212.133.20.0 - 212.133.20.15 fr -212.133.20.16 - 212.133.20.255 gb -212.133.21.0 - 212.133.21.255 it -212.133.22.0 - 212.133.22.127 gb -212.133.22.128 - 212.133.22.191 it -212.133.22.192 - 212.133.22.255 nl -212.133.23.0 - 212.133.24.71 gb -212.133.24.72 - 212.133.24.79 ie -212.133.24.80 - 212.133.24.95 gb -212.133.24.96 - 212.133.24.103 de -212.133.24.104 - 212.133.24.111 gb -212.133.24.112 - 212.133.24.127 fr -212.133.24.128 - 212.133.24.255 gb -212.133.25.0 - 212.133.25.127 nl -212.133.25.128 - 212.133.25.159 gb -212.133.25.160 - 212.133.25.175 fr -212.133.25.176 - 212.133.25.191 gb -212.133.25.192 - 212.133.25.255 it -212.133.26.0 - 212.133.26.255 ch -212.133.27.0 - 212.133.27.255 nl -212.133.28.0 - 212.133.29.79 gb -212.133.29.80 - 212.133.29.87 de -212.133.29.88 - 212.133.29.175 gb -212.133.29.176 - 212.133.29.183 fr -212.133.29.184 - 212.133.29.255 gb -212.133.30.0 - 212.133.30.15 nl -212.133.30.16 - 212.133.30.223 gb -212.133.30.224 - 212.133.31.39 de -212.133.31.40 - 212.133.31.47 gb -212.133.31.48 - 212.133.31.63 nl -212.133.31.64 - 212.133.31.127 gb -212.133.31.128 - 212.133.31.255 de -212.133.32.0 - 212.133.32.255 is -212.133.33.0 - 212.133.33.15 gb -212.133.33.16 - 212.133.33.23 it -212.133.33.24 - 212.133.33.31 de -212.133.33.32 - 212.133.33.63 gb -212.133.33.64 - 212.133.33.127 fr -212.133.33.128 - 212.133.33.143 se -212.133.33.144 - 212.133.33.159 de -212.133.33.160 - 212.133.33.175 se -212.133.33.176 - 212.133.33.191 dk -212.133.33.192 - 212.133.33.207 gb -212.133.33.208 - 212.133.33.215 ca -212.133.33.216 - 212.133.35.255 gb -212.133.36.0 - 212.133.40.127 fr -212.133.40.128 - 212.133.40.191 de -212.133.40.192 - 212.133.40.255 us -212.133.41.0 - 212.133.41.255 gb -212.133.42.0 - 212.133.42.255 it -212.133.43.0 - 212.133.43.15 gb -212.133.43.16 - 212.133.43.31 ie -212.133.43.32 - 212.133.43.63 de -212.133.43.64 - 212.133.43.71 ie -212.133.43.72 - 212.133.43.79 us -212.133.43.80 - 212.133.43.111 gb -212.133.43.112 - 212.133.43.119 it -212.133.43.120 - 212.133.43.127 gb -212.133.43.128 - 212.133.43.191 cz -212.133.43.192 - 212.133.43.199 nl -212.133.43.200 - 212.133.43.255 gb -212.133.44.0 - 212.133.44.255 us -212.133.45.0 - 212.133.46.15 gb -212.133.46.16 - 212.133.46.31 de -212.133.46.32 - 212.133.46.47 gb -212.133.46.48 - 212.133.46.55 ie -212.133.46.56 - 212.133.46.63 de -212.133.46.64 - 212.133.46.71 pr -212.133.46.72 - 212.133.46.95 gb -212.133.46.96 - 212.133.46.111 us -212.133.46.112 - 212.133.46.255 gb -212.133.47.0 - 212.133.47.255 nl -212.133.48.0 - 212.133.48.63 fr -212.133.48.64 - 212.133.48.111 us -212.133.48.112 - 212.133.48.151 gb -212.133.48.152 - 212.133.48.159 za -212.133.48.160 - 212.133.53.167 gb -212.133.53.168 - 212.133.53.175 fr -212.133.53.176 - 212.133.56.63 gb -212.133.56.64 - 212.133.56.127 de -212.133.56.128 - 212.133.56.151 gb -212.133.56.152 - 212.133.56.159 ie -212.133.56.160 - 212.133.56.175 gb -212.133.56.176 - 212.133.56.183 de -212.133.56.184 - 212.133.56.191 gb -212.133.56.192 - 212.133.56.207 fr -212.133.56.208 - 212.133.58.167 gb -212.133.58.168 - 212.133.58.175 fr -212.133.58.176 - 212.133.58.191 fi -212.133.58.192 - 212.133.59.47 gb -212.133.59.48 - 212.133.59.63 de -212.133.59.64 - 212.133.59.127 gb -212.133.59.128 - 212.133.59.255 de -212.133.60.0 - 212.133.60.239 gb -212.133.60.240 - 212.133.60.255 ie -212.133.61.0 - 212.133.62.255 gb -212.133.63.0 - 212.133.63.31 it -212.133.63.32 - 212.133.63.255 gb +212.133.6.0 - 212.133.35.255 gb +212.133.36.0 - 212.133.39.255 fr +212.133.40.0 - 212.133.63.255 gb 212.133.64.0 - 212.133.67.255 nl -212.133.68.0 - 212.133.69.255 gb -212.133.70.0 - 212.133.71.255 nl -212.133.72.0 - 212.133.95.255 gb -212.133.96.0 - 212.133.99.255 nl -212.133.100.0 - 212.133.101.255 ch -212.133.102.0 - 212.133.103.255 de -212.133.104.0 - 212.133.104.63 gb -212.133.104.64 - 212.133.104.255 de -212.133.105.0 - 212.133.109.127 gb -212.133.109.128 - 212.133.109.255 de -212.133.110.0 - 212.133.110.255 dk -212.133.111.0 - 212.133.127.255 gb +212.133.68.0 - 212.133.127.255 gb 212.133.128.0 - 212.133.255.255 tr -212.134.0.0 - 212.134.104.255 gb -212.134.105.0 - 212.134.105.255 ca -212.134.106.0 - 212.135.95.15 gb -212.135.95.16 - 212.135.95.31 de -212.135.95.32 - 212.135.255.255 gb -212.136.0.0 - 212.136.20.255 nl -212.136.21.0 - 212.136.21.255 gb -212.136.22.0 - 212.136.255.255 nl -212.137.0.0 - 212.137.16.87 gb -212.137.16.88 - 212.137.16.95 eu -212.137.16.96 - 212.137.18.7 gb +212.134.0.0 - 212.135.255.255 gb +212.136.0.0 - 212.136.9.3 nl +212.136.9.4 - 212.136.9.4 eu +212.136.9.5 - 212.136.255.255 nl +212.137.0.0 - 212.137.15.255 gb +212.137.16.0 - 212.137.16.127 eu +212.137.16.128 - 212.137.16.159 gb +212.137.16.160 - 212.137.16.207 eu +212.137.16.208 - 212.137.16.223 gb +212.137.16.224 - 212.137.16.255 eu +212.137.17.0 - 212.137.18.7 gb 212.137.18.8 - 212.137.18.23 eu 212.137.18.24 - 212.137.18.47 gb 212.137.18.48 - 212.137.18.55 eu @@ -143371,37 +111095,11 @@ 212.137.29.200 - 212.137.29.207 eu 212.137.29.208 - 212.137.29.223 gb 212.137.29.224 - 212.137.29.231 eu -212.137.29.232 - 212.137.30.15 gb -212.137.30.16 - 212.137.30.23 eu -212.137.30.24 - 212.137.30.31 gb -212.137.30.32 - 212.137.30.39 eu -212.137.30.40 - 212.137.30.55 gb -212.137.30.56 - 212.137.30.63 eu -212.137.30.64 - 212.137.30.95 gb -212.137.30.96 - 212.137.30.103 eu -212.137.30.104 - 212.137.30.159 gb -212.137.30.160 - 212.137.30.167 eu -212.137.30.168 - 212.137.30.183 gb -212.137.30.184 - 212.137.30.191 eu -212.137.30.192 - 212.137.30.215 gb -212.137.30.216 - 212.137.30.231 eu -212.137.30.232 - 212.137.30.255 gb -212.137.31.0 - 212.137.31.127 eu -212.137.31.128 - 212.137.49.15 gb -212.137.49.16 - 212.137.49.23 eu -212.137.49.24 - 212.137.49.31 gb -212.137.49.32 - 212.137.49.39 eu -212.137.49.40 - 212.137.49.55 gb -212.137.49.56 - 212.137.49.63 eu -212.137.49.64 - 212.137.49.87 gb -212.137.49.88 - 212.137.49.95 eu -212.137.49.96 - 212.137.49.167 gb -212.137.49.168 - 212.137.49.175 eu -212.137.49.176 - 212.137.49.199 gb -212.137.49.200 - 212.137.49.207 eu -212.137.49.208 - 212.137.49.239 gb -212.137.49.240 - 212.137.49.247 eu -212.137.49.248 - 212.137.50.255 gb +212.137.29.232 - 212.137.29.255 gb +212.137.30.0 - 212.137.30.247 eu +212.137.30.248 - 212.137.30.255 gb +212.137.31.0 - 212.137.31.255 eu +212.137.32.0 - 212.137.50.255 gb 212.137.51.0 - 212.137.51.63 eu 212.137.51.64 - 212.137.51.255 gb 212.137.52.0 - 212.137.52.7 eu @@ -143476,12 +111174,10 @@ 212.137.75.208 - 212.137.75.255 eu 212.137.76.0 - 212.137.77.63 gb 212.137.77.64 - 212.137.78.15 eu -212.137.78.16 - 212.137.78.79 gb -212.137.78.80 - 212.137.78.87 eu -212.137.78.88 - 212.137.78.103 gb -212.137.78.104 - 212.137.78.119 eu -212.137.78.120 - 212.137.78.143 gb -212.137.78.144 - 212.137.78.255 eu +212.137.78.16 - 212.137.78.31 gb +212.137.78.32 - 212.137.78.47 eu +212.137.78.48 - 212.137.78.55 gb +212.137.78.56 - 212.137.78.255 eu 212.137.79.0 - 212.137.79.127 gb 212.137.79.128 - 212.137.79.255 eu 212.137.80.0 - 212.137.81.23 gb @@ -143502,31 +111198,29 @@ 212.146.64.0 - 212.146.127.255 ro 212.146.128.0 - 212.146.255.255 tr 212.147.0.0 - 212.147.127.255 ch -212.147.128.0 - 212.147.140.191 ie -212.147.140.192 - 212.147.140.207 gb -212.147.140.208 - 212.147.255.255 ie +212.147.128.0 - 212.147.136.146 ie +212.147.136.147 - 212.147.136.147 eu +212.147.136.148 - 212.147.255.255 ie 212.148.0.0 - 212.148.255.255 gb 212.149.0.0 - 212.149.63.255 de -212.149.64.0 - 212.149.156.155 fi -212.149.156.156 - 212.149.156.159 se -212.149.156.160 - 212.149.255.255 fi -212.150.0.0 - 212.150.255.255 il +212.149.64.0 - 212.149.255.255 fi +212.150.0.0 - 212.150.27.255 il +212.150.28.0 - 212.150.28.255 gn +212.150.29.0 - 212.150.255.255 il 212.151.0.0 - 212.151.223.255 se 212.151.224.0 - 212.151.224.255 ru 212.151.225.0 - 212.152.31.255 se 212.152.32.0 - 212.152.63.255 ru 212.152.64.0 - 212.152.127.255 gr 212.152.128.0 - 212.152.255.255 at -212.153.0.0 - 212.153.76.255 nl -212.153.77.0 - 212.153.77.255 us -212.153.78.0 - 212.153.255.255 nl +212.153.0.0 - 212.153.255.255 nl 212.154.0.0 - 212.154.127.255 tr 212.154.128.0 - 212.154.255.255 kz -212.155.0.0 - 212.155.255.255 fr +212.155.0.0 - 212.155.190.255 fr +212.155.191.0 - 212.155.191.255 eu +212.155.192.0 - 212.155.255.255 fr 212.156.0.0 - 212.156.255.255 tr -212.157.0.0 - 212.157.172.71 fr -212.157.172.72 - 212.157.172.79 it -212.157.172.80 - 212.157.255.255 fr +212.157.0.0 - 212.157.255.255 fr 212.158.0.0 - 212.158.1.255 eu 212.158.2.0 - 212.158.2.31 gb 212.158.2.32 - 212.158.2.255 eu @@ -143615,13 +111309,11 @@ 212.158.108.32 - 212.158.108.63 gb 212.158.108.64 - 212.158.108.127 eu 212.158.108.128 - 212.158.108.255 gb -212.158.109.0 - 212.158.109.7 eu -212.158.109.8 - 212.158.109.23 gb +212.158.109.0 - 212.158.109.15 eu +212.158.109.16 - 212.158.109.23 gb 212.158.109.24 - 212.158.109.255 eu 212.158.110.0 - 212.158.110.7 gb -212.158.110.8 - 212.158.110.23 eu -212.158.110.24 - 212.158.110.31 gb -212.158.110.32 - 212.158.110.103 eu +212.158.110.8 - 212.158.110.103 eu 212.158.110.104 - 212.158.110.111 gb 212.158.110.112 - 212.158.110.191 eu 212.158.110.192 - 212.158.110.223 gb @@ -143652,140 +111344,62 @@ 212.158.160.0 - 212.158.175.255 ru 212.158.176.0 - 212.158.191.255 mk 212.158.192.0 - 212.159.191.255 gb -212.159.192.0 - 212.159.255.255 nl +212.159.192.0 - 212.159.199.255 nl +212.159.200.0 - 212.159.200.255 eu +212.159.201.0 - 212.159.220.255 nl +212.159.221.0 - 212.159.221.255 gb +212.159.222.0 - 212.159.255.255 nl 212.160.0.0 - 212.160.255.255 pl -212.161.0.0 - 212.161.7.127 gb -212.161.7.128 - 212.161.7.143 ch -212.161.7.144 - 212.161.7.255 gb -212.161.8.0 - 212.161.8.255 ie -212.161.9.0 - 212.161.13.63 gb -212.161.13.64 - 212.161.13.127 es -212.161.13.128 - 212.161.13.143 gb -212.161.13.144 - 212.161.13.159 es -212.161.13.160 - 212.161.13.191 gb -212.161.13.192 - 212.161.13.255 es -212.161.14.0 - 212.161.15.191 gb -212.161.15.192 - 212.161.15.207 es -212.161.15.208 - 212.161.33.175 gb -212.161.33.176 - 212.161.33.191 ie -212.161.33.192 - 212.161.41.159 gb -212.161.41.160 - 212.161.41.191 ie -212.161.41.192 - 212.161.116.23 gb -212.161.116.24 - 212.161.116.31 us -212.161.116.32 - 212.161.116.55 gb -212.161.116.56 - 212.161.116.63 ch -212.161.116.64 - 212.161.116.151 gb -212.161.116.152 - 212.161.116.159 ch -212.161.116.160 - 212.161.122.159 gb -212.161.122.160 - 212.161.122.167 nl -212.161.122.168 - 212.161.122.191 gb -212.161.122.192 - 212.161.122.199 fr -212.161.122.200 - 212.161.123.183 gb -212.161.123.184 - 212.161.123.191 nl -212.161.123.192 - 212.161.127.255 gb +212.161.0.0 - 212.161.127.255 gb 212.161.128.0 - 212.161.255.255 ch -212.162.0.0 - 212.162.0.47 gb -212.162.0.48 - 212.162.0.63 de -212.162.0.64 - 212.162.0.255 gb -212.162.1.0 - 212.162.1.3 de -212.162.1.4 - 212.162.1.95 gb -212.162.1.96 - 212.162.1.127 de -212.162.1.128 - 212.162.1.191 gb -212.162.1.192 - 212.162.2.255 de -212.162.3.0 - 212.162.3.47 gb -212.162.3.48 - 212.162.3.63 de -212.162.3.64 - 212.162.3.95 gb -212.162.3.96 - 212.162.3.147 de -212.162.3.148 - 212.162.3.151 gb -212.162.3.152 - 212.162.3.155 de -212.162.3.156 - 212.162.3.191 gb -212.162.3.192 - 212.162.5.127 de -212.162.5.128 - 212.162.5.255 gb -212.162.6.0 - 212.162.6.239 de -212.162.6.240 - 212.162.6.255 gb -212.162.7.0 - 212.162.7.191 de -212.162.7.192 - 212.162.7.255 gb -212.162.8.0 - 212.162.8.255 cz +212.162.0.0 - 212.162.6.191 gb +212.162.6.192 - 212.162.6.223 de +212.162.6.224 - 212.162.7.127 gb +212.162.7.128 - 212.162.7.191 de +212.162.7.192 - 212.162.7.231 gb +212.162.7.232 - 212.162.7.239 de +212.162.7.240 - 212.162.8.255 gb 212.162.9.0 - 212.162.9.255 de -212.162.10.0 - 212.162.10.127 gb -212.162.10.128 - 212.162.10.191 de -212.162.10.192 - 212.162.11.255 gb +212.162.10.0 - 212.162.11.255 gb 212.162.12.0 - 212.162.16.255 de -212.162.17.0 - 212.162.17.131 gb -212.162.17.132 - 212.162.17.135 de -212.162.17.136 - 212.162.17.171 gb -212.162.17.172 - 212.162.17.175 de -212.162.17.176 - 212.162.17.255 gb -212.162.18.0 - 212.162.19.255 de -212.162.20.0 - 212.162.20.63 gb -212.162.20.64 - 212.162.20.95 de -212.162.20.96 - 212.162.23.255 gb -212.162.24.0 - 212.162.24.255 de -212.162.25.0 - 212.162.25.255 fr -212.162.26.0 - 212.162.26.255 hu -212.162.27.0 - 212.162.27.255 gb -212.162.28.0 - 212.162.28.255 si -212.162.29.0 - 212.162.29.127 hr -212.162.29.128 - 212.162.32.159 gb -212.162.32.160 - 212.162.32.191 de -212.162.32.192 - 212.162.32.255 gb -212.162.33.0 - 212.162.33.255 de -212.162.34.0 - 212.162.39.255 gb -212.162.40.0 - 212.162.40.255 de -212.162.41.0 - 212.162.41.255 gb -212.162.42.0 - 212.162.42.127 es -212.162.42.128 - 212.162.43.255 gb -212.162.44.0 - 212.162.44.255 de -212.162.45.0 - 212.162.45.47 ro -212.162.45.48 - 212.162.45.55 de -212.162.45.56 - 212.162.45.255 ro -212.162.46.0 - 212.162.46.255 gb -212.162.47.0 - 212.162.47.255 de -212.162.48.0 - 212.162.48.79 gb -212.162.48.80 - 212.162.48.119 de -212.162.48.120 - 212.162.48.127 gb -212.162.48.128 - 212.162.48.135 de -212.162.48.136 - 212.162.48.159 gb -212.162.48.160 - 212.162.48.191 de -212.162.48.192 - 212.162.48.255 gb -212.162.49.0 - 212.162.49.223 de -212.162.49.224 - 212.162.49.255 gb -212.162.50.0 - 212.162.50.15 de -212.162.50.16 - 212.162.50.63 gb -212.162.50.64 - 212.162.50.223 de -212.162.50.224 - 212.162.50.255 gb -212.162.51.0 - 212.162.51.127 de -212.162.51.128 - 212.162.51.255 gb -212.162.52.0 - 212.162.54.255 de -212.162.55.0 - 212.162.55.31 gb -212.162.55.32 - 212.162.55.47 de -212.162.55.48 - 212.162.55.255 gb -212.162.56.0 - 212.162.57.255 de -212.162.58.0 - 212.162.58.31 gb -212.162.58.32 - 212.162.58.47 de -212.162.58.48 - 212.162.58.71 gb -212.162.58.72 - 212.162.58.79 de -212.162.58.80 - 212.162.58.255 gb -212.162.59.0 - 212.162.60.255 de -212.162.61.0 - 212.162.61.255 gb -212.162.62.0 - 212.162.63.255 de +212.162.17.0 - 212.162.17.255 gb +212.162.18.0 - 212.162.18.255 de +212.162.19.0 - 212.162.28.9 gb +212.162.28.10 - 212.162.28.10 si +212.162.28.11 - 212.162.31.255 gb +212.162.32.0 - 212.162.32.255 ie +212.162.33.0 - 212.162.54.255 gb +212.162.55.0 - 212.162.55.255 de +212.162.56.0 - 212.162.63.255 gb 212.162.64.0 - 212.162.127.255 it 212.162.128.0 - 212.162.159.255 sa 212.162.160.0 - 212.162.191.255 se -212.162.192.0 - 212.162.213.223 gb -212.162.213.224 - 212.162.213.255 nl -212.162.214.0 - 212.162.224.255 gb -212.162.225.0 - 212.162.225.255 tz -212.162.226.0 - 212.162.231.191 gb -212.162.231.192 - 212.162.231.223 nl -212.162.231.224 - 212.162.255.255 gb -212.163.0.0 - 212.163.42.223 es -212.163.42.224 - 212.163.42.239 it -212.163.42.240 - 212.163.215.255 es -212.163.216.0 - 212.163.223.255 nl -212.163.224.0 - 212.163.235.255 es -212.163.236.0 - 212.163.239.255 nl -212.163.240.0 - 212.163.255.255 es +212.162.192.0 - 212.163.5.255 gb +212.163.6.0 - 212.163.6.255 es +212.163.7.0 - 212.163.16.151 gb +212.163.16.152 - 212.163.16.159 es +212.163.16.160 - 212.163.16.255 gb +212.163.17.0 - 212.163.17.255 es +212.163.18.0 - 212.163.24.1 gb +212.163.24.2 - 212.163.24.2 es +212.163.24.3 - 212.163.30.95 gb +212.163.30.96 - 212.163.30.103 es +212.163.30.104 - 212.163.53.255 gb +212.163.54.0 - 212.163.54.255 es +212.163.55.0 - 212.163.147.255 gb +212.163.148.0 - 212.163.148.255 es +212.163.149.0 - 212.163.169.255 gb +212.163.170.0 - 212.163.170.255 es +212.163.171.0 - 212.163.182.255 gb +212.163.183.0 - 212.163.183.127 es +212.163.183.128 - 212.163.199.255 gb +212.163.200.0 - 212.163.203.255 es +212.163.204.0 - 212.163.206.255 gb +212.163.207.0 - 212.163.207.255 es +212.163.208.0 - 212.163.231.191 gb +212.163.231.192 - 212.163.231.199 es +212.163.231.200 - 212.163.251.255 gb +212.163.252.0 - 212.163.255.255 es 212.164.0.0 - 212.164.255.255 ru 212.165.0.0 - 212.165.0.255 at 212.165.1.0 - 212.165.1.255 eu @@ -143798,129 +111412,47 @@ 212.165.4.144 - 212.165.4.151 at 212.165.4.152 - 212.165.4.255 eu 212.165.5.0 - 212.165.5.127 at -212.165.5.128 - 212.165.9.255 eu +212.165.5.128 - 212.165.7.255 eu +212.165.8.0 - 212.165.8.31 tr +212.165.8.32 - 212.165.9.255 eu 212.165.10.0 - 212.165.11.255 gb -212.165.12.0 - 212.165.15.255 eu +212.165.12.0 - 212.165.13.255 tr +212.165.14.0 - 212.165.15.255 eu 212.165.16.0 - 212.165.31.255 gb 212.165.32.0 - 212.165.63.255 it -212.165.64.0 - 212.165.127.255 nl -212.165.128.0 - 212.165.128.255 cg -212.165.129.0 - 212.165.129.7 cd -212.165.129.8 - 212.165.130.15 a2 -212.165.130.16 - 212.165.130.23 gb -212.165.130.24 - 212.165.130.63 a2 -212.165.130.64 - 212.165.130.71 gb -212.165.130.72 - 212.165.132.63 a2 -212.165.132.64 - 212.165.132.95 ng -212.165.132.96 - 212.165.132.127 a2 -212.165.132.128 - 212.165.132.255 ng -212.165.133.0 - 212.165.133.255 in -212.165.134.0 - 212.165.134.255 ke -212.165.135.0 - 212.165.135.255 ng +212.165.64.0 - 212.165.77.255 nl +212.165.78.0 - 212.165.78.255 dk +212.165.79.0 - 212.165.127.255 nl +212.165.128.0 - 212.165.130.255 a2 +212.165.131.0 - 212.165.131.255 us +212.165.132.0 - 212.165.135.255 a2 212.165.136.0 - 212.165.139.255 in -212.165.140.0 - 212.165.140.3 ng -212.165.140.4 - 212.165.140.15 a2 -212.165.140.16 - 212.165.140.23 ng -212.165.140.24 - 212.165.140.31 a2 -212.165.140.32 - 212.165.140.39 ke -212.165.140.40 - 212.165.140.63 a2 -212.165.140.64 - 212.165.141.255 ng -212.165.142.0 - 212.165.143.255 tz -212.165.144.0 - 212.165.144.255 a2 -212.165.145.0 - 212.165.145.127 tz -212.165.145.128 - 212.165.146.15 a2 -212.165.146.16 - 212.165.146.23 pk -212.165.146.24 - 212.165.146.31 in -212.165.146.32 - 212.165.146.71 pk -212.165.146.72 - 212.165.146.87 a2 -212.165.146.88 - 212.165.146.111 pk -212.165.146.112 - 212.165.146.119 a2 -212.165.146.120 - 212.165.146.127 in -212.165.146.128 - 212.165.146.255 a2 -212.165.147.0 - 212.165.147.63 ng -212.165.147.64 - 212.165.147.67 a2 -212.165.147.68 - 212.165.147.71 tz -212.165.147.72 - 212.165.147.95 ke -212.165.147.96 - 212.165.147.127 a2 -212.165.147.128 - 212.165.147.191 ng -212.165.147.192 - 212.165.147.255 ke -212.165.148.0 - 212.165.148.143 gb -212.165.148.144 - 212.165.148.159 cg -212.165.148.160 - 212.165.148.255 gb -212.165.149.0 - 212.165.149.15 a2 -212.165.149.16 - 212.165.149.23 cg -212.165.149.24 - 212.165.149.31 a2 -212.165.149.32 - 212.165.149.47 cg -212.165.149.48 - 212.165.149.255 a2 -212.165.150.0 - 212.165.150.255 id -212.165.151.0 - 212.165.151.7 tz -212.165.151.8 - 212.165.151.15 ke -212.165.151.16 - 212.165.151.23 ng -212.165.151.24 - 212.165.151.31 tz -212.165.151.32 - 212.165.151.63 ng -212.165.151.64 - 212.165.153.255 a2 -212.165.154.0 - 212.165.155.39 ke -212.165.155.40 - 212.165.155.47 a2 -212.165.155.48 - 212.165.155.51 tz -212.165.155.52 - 212.165.155.55 ng -212.165.155.56 - 212.165.155.63 a2 -212.165.155.64 - 212.165.155.127 tz -212.165.155.128 - 212.165.155.143 ga -212.165.155.144 - 212.165.155.159 ng -212.165.155.160 - 212.165.155.175 tz -212.165.155.176 - 212.165.155.183 a2 -212.165.155.184 - 212.165.155.191 ga -212.165.155.192 - 212.165.155.223 tz -212.165.155.224 - 212.165.155.231 a2 -212.165.155.232 - 212.165.155.239 tz -212.165.155.240 - 212.165.155.255 a2 -212.165.156.0 - 212.165.156.255 ke -212.165.157.0 - 212.165.157.47 a2 -212.165.157.48 - 212.165.157.55 ke -212.165.157.56 - 212.165.158.47 a2 -212.165.158.48 - 212.165.158.79 pk -212.165.158.80 - 212.165.158.87 a2 -212.165.158.88 - 212.165.158.95 pk -212.165.158.96 - 212.165.158.111 a2 -212.165.158.112 - 212.165.158.159 pk -212.165.158.160 - 212.165.158.255 a2 -212.165.159.0 - 212.165.159.255 pk -212.165.160.0 - 212.165.160.255 gb -212.165.161.0 - 212.165.165.255 tz -212.165.166.0 - 212.165.166.255 cg -212.165.167.0 - 212.165.167.255 ke -212.165.168.0 - 212.165.171.0 ng -212.165.171.1 - 212.165.179.255 a2 -212.165.180.0 - 212.165.183.127 tj -212.165.183.128 - 212.165.204.255 a2 -212.165.205.0 - 212.165.205.127 cg -212.165.205.128 - 212.165.205.255 cd -212.165.206.0 - 212.165.250.255 a2 +212.165.140.0 - 212.165.141.255 a2 +212.165.142.0 - 212.165.142.255 ng +212.165.143.0 - 212.165.143.255 a2 +212.165.144.0 - 212.165.144.255 in +212.165.145.0 - 212.165.171.255 a2 +212.165.172.0 - 212.165.179.255 lu +212.165.180.0 - 212.165.183.255 a2 +212.165.184.0 - 212.165.199.255 lu +212.165.200.0 - 212.165.203.255 gb +212.165.204.0 - 212.165.207.255 a2 +212.165.208.0 - 212.165.247.255 lu +212.165.248.0 - 212.165.250.255 a2 212.165.251.0 - 212.165.255.255 gb 212.166.0.0 - 212.166.63.255 be 212.166.64.0 - 212.166.95.255 es -212.166.96.0 - 212.166.97.47 at -212.166.97.48 - 212.166.97.55 gi -212.166.97.56 - 212.166.127.255 at +212.166.96.0 - 212.166.127.255 at 212.166.128.0 - 212.166.255.255 es 212.167.0.0 - 212.167.3.255 gb 212.167.4.0 - 212.167.4.255 eu 212.167.5.0 - 212.167.5.255 gb 212.167.6.0 - 212.167.7.255 eu -212.167.8.0 - 212.167.8.31 gb -212.167.8.32 - 212.167.8.255 eu -212.167.9.0 - 212.167.9.31 il -212.167.9.32 - 212.167.10.79 eu -212.167.10.80 - 212.167.10.255 gb -212.167.11.0 - 212.167.11.255 de -212.167.12.0 - 212.167.12.255 gb -212.167.13.0 - 212.167.13.47 de -212.167.13.48 - 212.167.13.127 eu -212.167.13.128 - 212.167.13.255 de -212.167.14.0 - 212.167.14.127 gb -212.167.14.128 - 212.167.14.255 eu -212.167.15.0 - 212.167.15.255 ch -212.167.16.0 - 212.167.19.255 us +212.167.8.0 - 212.167.11.255 gb +212.167.12.0 - 212.167.15.255 eu +212.167.16.0 - 212.167.16.255 us +212.167.17.0 - 212.167.17.255 gb +212.167.18.0 - 212.167.19.255 us 212.167.20.0 - 212.167.20.255 gb 212.167.21.0 - 212.167.255.255 eu 212.168.0.0 - 212.168.255.255 de @@ -143929,34 +111461,23 @@ 212.169.128.0 - 212.170.255.255 es 212.171.0.0 - 212.171.255.255 it 212.172.0.0 - 212.172.255.255 de -212.173.0.0 - 212.173.180.159 gb -212.173.180.160 - 212.173.180.167 ch -212.173.180.168 - 212.173.255.255 gb -212.174.0.0 - 212.175.255.255 tr -212.176.0.0 - 212.176.22.15 ru -212.176.22.16 - 212.176.22.31 uz -212.176.22.32 - 212.176.22.159 by -212.176.22.160 - 212.176.22.191 ru -212.176.22.192 - 212.176.22.255 by -212.176.23.0 - 212.176.255.255 ru +212.173.0.0 - 212.173.255.255 gb +212.174.0.0 - 212.174.103.255 tr +212.174.104.0 - 212.174.104.255 us +212.174.105.0 - 212.175.255.255 tr +212.176.0.0 - 212.176.255.255 ru 212.177.0.0 - 212.177.255.255 it 212.178.0.0 - 212.178.31.255 ua 212.178.32.0 - 212.178.159.255 nl 212.178.160.0 - 212.178.191.255 dk -212.178.192.0 - 212.178.223.255 nl +212.178.192.0 - 212.178.200.255 nl +212.178.201.0 - 212.178.201.255 eu +212.178.202.0 - 212.178.223.255 nl 212.178.224.0 - 212.178.255.255 rs 212.179.0.0 - 212.179.255.255 il -212.180.0.0 - 212.180.33.247 fr -212.180.33.248 - 212.180.33.255 a2 -212.180.34.0 - 212.180.42.127 fr -212.180.42.128 - 212.180.42.143 a2 -212.180.42.144 - 212.180.42.207 fr -212.180.42.208 - 212.180.42.215 a2 -212.180.42.216 - 212.180.68.103 fr -212.180.68.104 - 212.180.68.111 a2 -212.180.68.112 - 212.180.112.135 fr -212.180.112.136 - 212.180.112.143 a2 -212.180.112.144 - 212.180.127.255 fr +212.180.0.0 - 212.180.74.255 fr +212.180.75.0 - 212.180.75.255 eu +212.180.76.0 - 212.180.127.255 fr 212.180.128.0 - 212.180.255.255 pl 212.181.0.0 - 212.181.255.255 se 212.182.0.0 - 212.182.127.255 pl @@ -143966,447 +111487,62 @@ 212.183.128.0 - 212.183.159.255 gb 212.183.160.0 - 212.183.191.255 it 212.183.192.0 - 212.183.255.255 es -212.184.0.0 - 212.184.4.191 de -212.184.4.192 - 212.184.4.199 ch -212.184.4.200 - 212.184.79.151 de -212.184.79.152 - 212.184.79.159 pl -212.184.79.160 - 212.184.79.231 de -212.184.79.232 - 212.184.79.239 gb -212.184.79.240 - 212.185.85.79 de -212.185.85.80 - 212.185.85.95 lu -212.185.85.96 - 212.185.87.175 de -212.185.87.176 - 212.185.87.183 it -212.185.87.184 - 212.185.173.71 de -212.185.173.72 - 212.185.173.79 fi -212.185.173.80 - 212.185.177.255 de -212.185.178.0 - 212.185.178.7 it -212.185.178.8 - 212.185.255.255 de +212.184.0.0 - 212.185.255.255 de 212.186.0.0 - 212.186.255.255 at 212.187.0.0 - 212.187.127.255 nl -212.187.128.0 - 212.187.169.255 gb -212.187.170.0 - 212.187.170.127 bg -212.187.170.128 - 212.187.171.151 gb -212.187.171.152 - 212.187.171.191 de -212.187.171.192 - 212.187.194.191 gb -212.187.194.192 - 212.187.194.199 ie -212.187.194.200 - 212.187.197.255 gb -212.187.198.0 - 212.187.198.127 fr -212.187.198.128 - 212.187.229.255 gb -212.187.230.0 - 212.187.230.255 us -212.187.231.0 - 212.187.255.255 gb +212.187.128.0 - 212.187.193.255 gb +212.187.194.0 - 212.187.194.255 ie +212.187.195.0 - 212.187.196.255 gb +212.187.197.0 - 212.187.197.255 ie +212.187.198.0 - 212.187.199.255 gb +212.187.200.0 - 212.187.200.255 fr +212.187.201.0 - 212.187.255.255 gb 212.188.0.0 - 212.188.127.255 ru 212.188.128.0 - 212.188.255.255 gb -212.189.0.0 - 212.189.127.255 nl +212.189.0.0 - 212.189.5.3 nl +212.189.5.4 - 212.189.5.4 eu +212.189.5.5 - 212.189.35.255 nl +212.189.36.0 - 212.189.36.255 eu +212.189.37.0 - 212.189.45.255 nl +212.189.46.0 - 212.189.46.255 eu +212.189.47.0 - 212.189.127.255 nl 212.189.128.0 - 212.189.255.255 it -212.190.0.0 - 212.190.65.127 be -212.190.65.128 - 212.190.65.255 at -212.190.66.0 - 212.190.68.31 be -212.190.68.32 - 212.190.68.63 lu -212.190.68.64 - 212.190.69.223 be -212.190.69.224 - 212.190.69.255 lu -212.190.70.0 - 212.190.71.175 be -212.190.71.176 - 212.190.71.191 bn -212.190.71.192 - 212.190.71.223 be -212.190.71.224 - 212.190.71.255 fr -212.190.72.0 - 212.190.77.239 be -212.190.77.240 - 212.190.77.255 lu -212.190.78.0 - 212.190.79.31 be -212.190.79.32 - 212.190.79.47 lu -212.190.79.48 - 212.190.79.51 be -212.190.79.52 - 212.190.79.55 lu -212.190.79.56 - 212.190.79.191 be -212.190.79.192 - 212.190.79.255 lu -212.190.80.0 - 212.190.86.255 be -212.190.87.0 - 212.190.87.127 nl -212.190.87.128 - 212.190.88.143 be -212.190.88.144 - 212.190.88.159 lu -212.190.88.160 - 212.190.93.255 be -212.190.94.0 - 212.190.94.31 lu -212.190.94.32 - 212.190.114.63 be -212.190.114.64 - 212.190.114.79 lu -212.190.114.80 - 212.190.114.255 be -212.190.115.0 - 212.190.115.255 lu -212.190.116.0 - 212.190.117.255 us -212.190.118.0 - 212.190.122.127 be -212.190.122.128 - 212.190.122.143 lu -212.190.122.144 - 212.190.122.231 be -212.190.122.232 - 212.190.122.239 lu -212.190.122.240 - 212.190.130.95 be -212.190.130.96 - 212.190.130.127 lu -212.190.130.128 - 212.190.130.159 be -212.190.130.160 - 212.190.130.191 lu -212.190.130.192 - 212.190.145.223 be -212.190.145.224 - 212.190.145.255 lu -212.190.146.0 - 212.190.196.63 be -212.190.196.64 - 212.190.196.95 nl -212.190.196.96 - 212.190.196.103 be -212.190.196.104 - 212.190.196.111 de -212.190.196.112 - 212.190.196.127 be -212.190.196.128 - 212.190.196.135 it -212.190.196.136 - 212.190.201.79 be -212.190.201.80 - 212.190.201.95 lu -212.190.201.96 - 212.190.203.191 be -212.190.203.192 - 212.190.203.223 lu -212.190.203.224 - 212.190.205.191 be -212.190.205.192 - 212.190.205.199 lu -212.190.205.200 - 212.190.205.255 be -212.190.206.0 - 212.190.206.15 lu -212.190.206.16 - 212.190.206.127 be -212.190.206.128 - 212.190.206.191 lu -212.190.206.192 - 212.190.207.63 be -212.190.207.64 - 212.190.207.95 lu -212.190.207.96 - 212.190.216.255 be -212.190.217.0 - 212.190.217.255 lu -212.190.218.0 - 212.190.222.239 be -212.190.222.240 - 212.190.222.255 nl -212.190.223.0 - 212.190.224.247 be -212.190.224.248 - 212.190.224.255 us -212.190.225.0 - 212.190.225.31 be -212.190.225.32 - 212.190.225.47 us -212.190.225.48 - 212.190.255.255 be +212.190.0.0 - 212.190.255.255 be 212.191.0.0 - 212.191.255.255 pl 212.192.0.0 - 212.193.255.255 ru 212.194.0.0 - 212.195.255.255 fr 212.196.0.0 - 212.196.255.255 gb -212.197.0.0 - 212.197.12.255 sk -212.197.13.0 - 212.197.13.7 iq -212.197.13.8 - 212.197.119.111 sk -212.197.119.112 - 212.197.119.127 nl -212.197.119.128 - 212.197.127.255 sk +212.197.0.0 - 212.197.127.255 sk 212.197.128.0 - 212.197.191.255 at -212.197.192.0 - 212.197.198.95 fr -212.197.198.96 - 212.197.198.111 it -212.197.198.112 - 212.197.198.143 gb -212.197.198.144 - 212.197.198.159 fr -212.197.198.160 - 212.197.198.175 de -212.197.198.176 - 212.197.198.191 gb -212.197.198.192 - 212.197.198.239 fr -212.197.198.240 - 212.197.198.255 gb -212.197.199.0 - 212.197.199.47 fr -212.197.199.48 - 212.197.199.63 gb -212.197.199.64 - 212.197.199.95 fr -212.197.199.96 - 212.197.199.111 gb -212.197.199.112 - 212.197.199.127 fr -212.197.199.128 - 212.197.199.143 gb -212.197.199.144 - 212.197.199.159 fr -212.197.199.160 - 212.197.199.175 gb -212.197.199.176 - 212.197.199.191 it -212.197.199.192 - 212.197.199.223 gb -212.197.199.224 - 212.197.199.255 fr -212.197.200.0 - 212.197.200.15 gb -212.197.200.16 - 212.197.200.31 fr -212.197.200.32 - 212.197.200.47 de -212.197.200.48 - 212.197.200.63 it -212.197.200.64 - 212.197.200.143 fr -212.197.200.144 - 212.197.200.159 gb -212.197.200.160 - 212.197.200.207 fr -212.197.200.208 - 212.197.200.223 gb -212.197.200.224 - 212.197.200.255 fr -212.197.201.0 - 212.197.201.31 gb -212.197.201.32 - 212.197.201.63 fr -212.197.201.64 - 212.197.201.79 be -212.197.201.80 - 212.197.201.111 fr -212.197.201.112 - 212.197.201.127 nl -212.197.201.128 - 212.197.201.143 gb -212.197.201.144 - 212.197.201.191 fr -212.197.201.192 - 212.197.201.207 de -212.197.201.208 - 212.197.201.223 gb -212.197.201.224 - 212.197.201.239 fr -212.197.201.240 - 212.197.201.255 gb -212.197.202.0 - 212.197.202.47 fr -212.197.202.48 - 212.197.202.95 gb -212.197.202.96 - 212.197.202.111 de -212.197.202.112 - 212.197.202.191 fr -212.197.202.192 - 212.197.202.207 gb -212.197.202.208 - 212.197.202.223 de -212.197.202.224 - 212.197.202.239 fr -212.197.202.240 - 212.197.202.255 gb -212.197.203.0 - 212.197.203.31 fr -212.197.203.32 - 212.197.203.47 us -212.197.203.48 - 212.197.203.95 fr -212.197.203.96 - 212.197.203.127 us -212.197.203.128 - 212.197.203.143 gb -212.197.203.144 - 212.197.203.191 fr -212.197.203.192 - 212.197.203.223 gb -212.197.203.224 - 212.197.203.255 fr -212.197.204.0 - 212.197.204.31 gb -212.197.204.32 - 212.197.204.63 fr -212.197.204.64 - 212.197.204.95 gb -212.197.204.96 - 212.197.204.111 fr -212.197.204.112 - 212.197.204.127 gb -212.197.204.128 - 212.197.204.143 fr -212.197.204.144 - 212.197.204.159 gb -212.197.204.160 - 212.197.204.175 fr -212.197.204.176 - 212.197.204.239 gb -212.197.204.240 - 212.197.204.255 fr -212.197.205.0 - 212.197.205.15 gb -212.197.205.16 - 212.197.205.31 fr -212.197.205.32 - 212.197.205.47 it -212.197.205.48 - 212.197.205.143 fr -212.197.205.144 - 212.197.205.159 ie -212.197.205.160 - 212.197.205.191 fr -212.197.205.192 - 212.197.205.223 gb -212.197.205.224 - 212.197.205.239 it -212.197.205.240 - 212.197.206.63 fr -212.197.206.64 - 212.197.206.79 gb -212.197.206.80 - 212.197.206.143 fr -212.197.206.144 - 212.197.206.159 us -212.197.206.160 - 212.197.206.175 de -212.197.206.176 - 212.197.206.191 gb -212.197.206.192 - 212.197.206.207 fr -212.197.206.208 - 212.197.206.223 gb -212.197.206.224 - 212.197.207.47 fr -212.197.207.48 - 212.197.207.63 gb -212.197.207.64 - 212.197.207.95 fr -212.197.207.96 - 212.197.207.111 gb -212.197.207.112 - 212.197.207.143 fr -212.197.207.144 - 212.197.207.159 gb -212.197.207.160 - 212.197.207.175 nl -212.197.207.176 - 212.197.207.191 fr -212.197.207.192 - 212.197.207.207 gb -212.197.207.208 - 212.197.207.223 fr -212.197.207.224 - 212.197.207.239 gb -212.197.207.240 - 212.197.208.15 fr -212.197.208.16 - 212.197.208.31 gb -212.197.208.32 - 212.197.208.47 fr -212.197.208.48 - 212.197.208.63 gb -212.197.208.64 - 212.197.208.143 fr -212.197.208.144 - 212.197.208.159 ie -212.197.208.160 - 212.197.208.175 fr -212.197.208.176 - 212.197.208.191 gb -212.197.208.192 - 212.197.208.255 fr -212.197.209.0 - 212.197.209.31 gb -212.197.209.32 - 212.197.209.47 fr -212.197.209.48 - 212.197.209.63 gb -212.197.209.64 - 212.197.209.79 fr -212.197.209.80 - 212.197.209.95 es -212.197.209.96 - 212.197.209.111 gb -212.197.209.112 - 212.197.209.159 fr -212.197.209.160 - 212.197.209.191 gb -212.197.209.192 - 212.197.209.255 fr -212.197.210.0 - 212.197.210.15 gb -212.197.210.16 - 212.197.210.47 fr -212.197.210.48 - 212.197.210.63 gb -212.197.210.64 - 212.197.210.223 fr -212.197.210.224 - 212.197.210.255 gb -212.197.211.0 - 212.197.211.47 be -212.197.211.48 - 212.197.211.63 fr -212.197.211.64 - 212.197.211.111 be -212.197.211.112 - 212.197.217.111 fr -212.197.217.112 - 212.197.217.127 gb -212.197.217.128 - 212.197.217.135 fr -212.197.217.136 - 212.197.217.143 es -212.197.217.144 - 212.197.217.255 fr -212.197.218.0 - 212.197.218.31 nl -212.197.218.32 - 212.197.218.47 fr -212.197.218.48 - 212.197.218.191 nl -212.197.218.192 - 212.197.218.207 se -212.197.218.208 - 212.197.219.207 nl -212.197.219.208 - 212.197.219.223 fr -212.197.219.224 - 212.197.219.255 nl -212.197.220.0 - 212.197.229.255 fr -212.197.230.0 - 212.197.230.31 nl -212.197.230.32 - 212.197.230.63 fr -212.197.230.64 - 212.197.230.207 nl -212.197.230.208 - 212.197.230.223 fr -212.197.230.224 - 212.197.231.79 nl -212.197.231.80 - 212.197.231.111 fr -212.197.231.112 - 212.197.231.127 nl -212.197.231.128 - 212.197.231.143 fr -212.197.231.144 - 212.197.231.159 nl -212.197.231.160 - 212.197.231.175 fr -212.197.231.176 - 212.197.232.63 nl -212.197.232.64 - 212.197.232.79 fr -212.197.232.80 - 212.197.232.127 nl -212.197.232.128 - 212.197.232.143 fr -212.197.232.144 - 212.197.232.159 nl -212.197.232.160 - 212.197.232.175 fr -212.197.232.176 - 212.197.233.15 nl -212.197.233.16 - 212.197.233.31 fr -212.197.233.32 - 212.197.233.79 nl -212.197.233.80 - 212.197.233.95 fr -212.197.233.96 - 212.197.233.223 nl -212.197.233.224 - 212.197.233.239 fr -212.197.233.240 - 212.197.234.15 nl -212.197.234.16 - 212.197.234.31 fr -212.197.234.32 - 212.197.234.79 nl -212.197.234.80 - 212.197.234.95 fr -212.197.234.96 - 212.197.234.127 nl -212.197.234.128 - 212.197.234.143 fr -212.197.234.144 - 212.197.234.175 nl -212.197.234.176 - 212.197.234.191 fr -212.197.234.192 - 212.197.234.207 nl -212.197.234.208 - 212.197.234.223 fr -212.197.234.224 - 212.197.234.255 nl -212.197.235.0 - 212.197.235.15 fr -212.197.235.16 - 212.197.235.111 nl -212.197.235.112 - 212.197.235.127 fr -212.197.235.128 - 212.197.235.143 nl -212.197.235.144 - 212.197.235.159 fr -212.197.235.160 - 212.197.235.255 nl -212.197.236.0 - 212.197.237.255 fr -212.197.238.0 - 212.197.239.255 be -212.197.240.0 - 212.197.241.255 fr -212.197.242.0 - 212.197.242.15 be -212.197.242.16 - 212.197.242.47 fr -212.197.242.48 - 212.197.242.63 be -212.197.242.64 - 212.197.242.79 fr -212.197.242.80 - 212.197.242.175 be -212.197.242.176 - 212.197.242.191 fr -212.197.242.192 - 212.197.243.31 be -212.197.243.32 - 212.197.243.47 fr -212.197.243.48 - 212.197.243.79 be -212.197.243.80 - 212.197.243.95 fr -212.197.243.96 - 212.197.243.143 be -212.197.243.144 - 212.197.243.159 fr -212.197.243.160 - 212.197.243.175 be -212.197.243.176 - 212.197.243.191 fr -212.197.243.192 - 212.197.244.79 be -212.197.244.80 - 212.197.244.95 fr -212.197.244.96 - 212.197.244.239 be -212.197.244.240 - 212.197.244.255 fr -212.197.245.0 - 212.197.245.31 be -212.197.245.32 - 212.197.245.95 fr -212.197.245.96 - 212.197.245.111 be -212.197.245.112 - 212.197.245.255 fr -212.197.246.0 - 212.197.246.31 be -212.197.246.32 - 212.197.246.47 fr -212.197.246.48 - 212.197.246.63 be -212.197.246.64 - 212.197.246.95 fr -212.197.246.96 - 212.197.246.223 be -212.197.246.224 - 212.197.246.239 nl -212.197.246.240 - 212.197.246.255 fr -212.197.247.0 - 212.197.247.15 be -212.197.247.16 - 212.197.247.31 fr -212.197.247.32 - 212.197.247.63 be -212.197.247.64 - 212.197.247.95 fr -212.197.247.96 - 212.197.247.159 be -212.197.247.160 - 212.197.247.175 fr -212.197.247.176 - 212.197.247.255 be -212.197.248.0 - 212.197.248.111 nl -212.197.248.112 - 212.197.248.127 fr -212.197.248.128 - 212.197.248.175 nl -212.197.248.176 - 212.197.248.191 fr -212.197.248.192 - 212.197.248.255 nl -212.197.249.0 - 212.197.249.15 fr -212.197.249.16 - 212.197.250.159 nl -212.197.250.160 - 212.197.250.175 fr -212.197.250.176 - 212.197.250.191 nl -212.197.250.192 - 212.197.250.239 fr -212.197.250.240 - 212.197.251.175 nl -212.197.251.176 - 212.197.251.191 fr -212.197.251.192 - 212.197.252.15 nl -212.197.252.16 - 212.197.252.31 fr -212.197.252.32 - 212.197.252.79 nl -212.197.252.80 - 212.197.252.95 fr -212.197.252.96 - 212.197.252.111 nl -212.197.252.112 - 212.197.252.127 fr -212.197.252.128 - 212.197.252.143 nl -212.197.252.144 - 212.197.252.159 fr -212.197.252.160 - 212.197.252.207 nl -212.197.252.208 - 212.197.252.223 fr -212.197.252.224 - 212.197.253.15 nl -212.197.253.16 - 212.197.253.31 fr -212.197.253.32 - 212.197.253.63 nl -212.197.253.64 - 212.197.253.79 fr -212.197.253.80 - 212.197.253.95 nl -212.197.253.96 - 212.197.253.127 fr -212.197.253.128 - 212.197.253.159 nl -212.197.253.160 - 212.197.253.175 fr -212.197.253.176 - 212.197.253.207 nl -212.197.253.208 - 212.197.253.223 fr -212.197.253.224 - 212.197.253.255 nl -212.197.254.0 - 212.197.254.255 fr -212.197.255.0 - 212.197.255.63 nl -212.197.255.64 - 212.197.255.79 fr -212.197.255.80 - 212.197.255.149 nl -212.197.255.150 - 212.197.255.159 fr -212.197.255.160 - 212.197.255.175 nl -212.197.255.176 - 212.197.255.207 fr -212.197.255.208 - 212.197.255.223 nl -212.197.255.224 - 212.197.255.239 fr -212.197.255.240 - 212.197.255.255 nl -212.198.0.0 - 212.198.255.255 fr -212.199.0.0 - 212.199.74.63 il -212.199.74.64 - 212.199.74.127 gb -212.199.74.128 - 212.199.108.83 il -212.199.108.84 - 212.199.108.87 a2 -212.199.108.88 - 212.199.108.255 il -212.199.109.0 - 212.199.109.115 a2 -212.199.109.116 - 212.199.109.119 il -212.199.109.120 - 212.199.109.248 a2 -212.199.109.249 - 212.199.109.250 il -212.199.109.251 - 212.199.109.255 a2 -212.199.110.0 - 212.199.136.255 il -212.199.137.0 - 212.199.137.255 a2 -212.199.138.0 - 212.199.158.31 il -212.199.158.32 - 212.199.158.47 a2 -212.199.158.48 - 212.199.158.63 il -212.199.158.64 - 212.199.158.95 a2 -212.199.158.96 - 212.199.158.127 il -212.199.158.128 - 212.199.158.143 a2 -212.199.158.144 - 212.199.197.255 il -212.199.198.0 - 212.199.198.15 a2 -212.199.198.16 - 212.199.241.127 il -212.199.241.128 - 212.199.241.255 a2 -212.199.242.0 - 212.199.255.255 il +212.197.192.0 - 212.198.254.231 fr +212.198.254.232 - 212.198.254.232 gp +212.198.254.233 - 212.198.255.255 fr +212.199.0.0 - 212.199.255.255 il 212.200.0.0 - 212.200.255.255 rs -212.201.0.0 - 212.202.118.191 de -212.202.118.192 - 212.202.118.192 a2 -212.202.118.193 - 212.202.255.255 de +212.201.0.0 - 212.202.255.255 de 212.203.0.0 - 212.203.31.255 nl -212.203.32.0 - 212.203.127.255 ch +212.203.32.0 - 212.203.97.255 ch +212.203.98.0 - 212.203.98.255 eu +212.203.99.0 - 212.203.127.255 ch 212.203.128.0 - 212.203.255.255 pl -212.204.0.0 - 212.204.120.223 de -212.204.120.224 - 212.204.120.255 be -212.204.121.0 - 212.204.127.7 de -212.204.127.8 - 212.204.127.15 au -212.204.127.16 - 212.204.127.255 de +212.204.0.0 - 212.204.127.255 de 212.204.128.0 - 212.204.255.255 nl -212.205.0.0 - 212.205.42.255 gr -212.205.43.0 - 212.205.43.127 de -212.205.43.128 - 212.205.71.255 gr -212.205.72.0 - 212.205.72.127 de -212.205.72.128 - 212.205.122.255 gr -212.205.123.0 - 212.205.123.255 de -212.205.124.0 - 212.205.125.255 gr -212.205.126.0 - 212.205.126.255 de -212.205.127.0 - 212.205.144.255 gr -212.205.145.0 - 212.205.145.255 de -212.205.146.0 - 212.205.255.255 gr +212.205.0.0 - 212.205.255.255 gr 212.206.0.0 - 212.206.255.255 nl 212.207.0.0 - 212.207.255.255 gb 212.208.0.0 - 212.208.255.255 fr -212.209.0.0 - 212.209.158.175 se -212.209.158.176 - 212.209.158.191 ch -212.209.158.192 - 212.209.255.255 se +212.209.0.0 - 212.209.255.255 se 212.210.0.0 - 212.210.255.255 it -212.211.0.0 - 212.211.35.255 gb -212.211.36.0 - 212.211.39.255 de -212.211.40.0 - 212.211.51.255 gb -212.211.52.0 - 212.211.52.255 fr -212.211.53.0 - 212.211.63.255 gb +212.211.0.0 - 212.211.63.255 gb 212.211.64.0 - 212.211.75.255 de -212.211.76.0 - 212.211.77.255 gb -212.211.78.0 - 212.211.95.255 de -212.211.96.0 - 212.211.127.255 gb -212.211.128.0 - 212.211.165.255 de -212.211.166.0 - 212.211.166.31 ch -212.211.166.32 - 212.211.255.255 de +212.211.76.0 - 212.211.79.255 gb +212.211.80.0 - 212.211.94.255 de +212.211.95.0 - 212.211.127.255 gb +212.211.128.0 - 212.211.255.255 de 212.212.0.0 - 212.212.255.255 gb 212.213.0.0 - 212.213.3.255 fi 212.213.4.0 - 212.213.7.255 se -212.213.8.0 - 212.213.87.195 fi -212.213.87.196 - 212.213.87.199 ax -212.213.87.200 - 212.213.95.31 fi -212.213.95.32 - 212.213.95.47 ax -212.213.95.48 - 212.213.106.95 fi -212.213.106.96 - 212.213.106.127 ru -212.213.106.128 - 212.213.123.95 fi -212.213.123.96 - 212.213.123.127 ru -212.213.123.128 - 212.213.211.31 fi -212.213.211.32 - 212.213.211.47 ax -212.213.211.48 - 212.213.255.255 fi +212.213.8.0 - 212.213.255.255 fi 212.214.0.0 - 212.214.255.255 se 212.215.0.0 - 212.215.127.255 ch 212.215.128.0 - 212.215.255.255 sa @@ -144416,158 +111552,29 @@ 212.218.0.0 - 212.218.255.255 de 212.219.0.0 - 212.219.255.255 gb 212.220.0.0 - 212.220.255.255 ru -212.221.0.0 - 212.221.44.95 be -212.221.44.96 - 212.221.44.127 fr -212.221.44.128 - 212.221.59.255 be -212.221.60.0 - 212.221.60.31 lu -212.221.60.32 - 212.221.127.255 be +212.221.0.0 - 212.221.127.255 be 212.221.128.0 - 212.221.255.255 de -212.222.0.0 - 212.222.3.255 gb -212.222.4.0 - 212.222.4.127 de -212.222.4.128 - 212.222.8.23 gb -212.222.8.24 - 212.222.8.31 de -212.222.8.32 - 212.222.8.111 gb -212.222.8.112 - 212.222.8.127 de -212.222.8.128 - 212.222.10.255 gb -212.222.11.0 - 212.222.11.127 de -212.222.11.128 - 212.222.11.223 gb +212.222.0.0 - 212.222.8.223 gb +212.222.8.224 - 212.222.8.239 de +212.222.8.240 - 212.222.11.223 gb 212.222.11.224 - 212.222.11.255 de -212.222.12.0 - 212.222.12.127 gb -212.222.12.128 - 212.222.12.143 de -212.222.12.144 - 212.222.20.63 gb -212.222.20.64 - 212.222.20.127 de -212.222.20.128 - 212.222.28.255 gb -212.222.29.0 - 212.222.29.7 de -212.222.29.8 - 212.222.29.23 gb -212.222.29.24 - 212.222.29.39 de -212.222.29.40 - 212.222.32.7 gb -212.222.32.8 - 212.222.32.15 de -212.222.32.16 - 212.222.37.255 gb -212.222.38.0 - 212.222.38.31 de -212.222.38.32 - 212.222.39.95 gb -212.222.39.96 - 212.222.39.111 de -212.222.39.112 - 212.222.40.191 gb -212.222.40.192 - 212.222.40.223 de -212.222.40.224 - 212.222.50.63 gb -212.222.50.64 - 212.222.50.95 de -212.222.50.96 - 212.222.50.255 gb -212.222.51.0 - 212.222.52.255 de -212.222.53.0 - 212.222.66.127 gb -212.222.66.128 - 212.222.66.255 de -212.222.67.0 - 212.222.84.127 gb -212.222.84.128 - 212.222.84.159 de -212.222.84.160 - 212.222.90.255 gb -212.222.91.0 - 212.222.91.255 de -212.222.92.0 - 212.222.96.31 gb -212.222.96.32 - 212.222.96.95 de -212.222.96.96 - 212.222.111.255 gb -212.222.112.0 - 212.222.112.255 be -212.222.113.0 - 212.222.115.163 gb -212.222.115.164 - 212.222.115.167 de -212.222.115.168 - 212.222.118.95 gb -212.222.118.96 - 212.222.118.127 de -212.222.118.128 - 212.222.127.255 gb +212.222.12.0 - 212.222.127.255 gb 212.222.128.0 - 212.222.128.255 de -212.222.129.0 - 212.222.139.95 gb -212.222.139.96 - 212.222.139.127 de -212.222.139.128 - 212.222.141.191 gb -212.222.141.192 - 212.222.141.255 de -212.222.142.0 - 212.222.142.255 gb -212.222.143.0 - 212.222.144.255 de -212.222.145.0 - 212.222.145.95 gb -212.222.145.96 - 212.222.145.127 de -212.222.145.128 - 212.222.149.255 gb -212.222.150.0 - 212.222.151.255 de -212.222.152.0 - 212.222.152.175 gb -212.222.152.176 - 212.222.152.223 de -212.222.152.224 - 212.222.154.31 gb -212.222.154.32 - 212.222.154.47 de -212.222.154.48 - 212.222.157.23 gb -212.222.157.24 - 212.222.157.31 de -212.222.157.32 - 212.222.157.35 gb -212.222.157.36 - 212.222.157.39 de -212.222.157.40 - 212.222.157.167 gb -212.222.157.168 - 212.222.157.175 de -212.222.157.176 - 212.222.157.215 gb -212.222.157.216 - 212.222.157.223 de -212.222.157.224 - 212.222.158.71 gb -212.222.158.72 - 212.222.158.79 de -212.222.158.80 - 212.222.158.175 gb -212.222.158.176 - 212.222.158.183 de -212.222.158.184 - 212.222.158.215 gb -212.222.158.216 - 212.222.158.223 de -212.222.158.224 - 212.222.165.255 gb -212.222.166.0 - 212.222.166.127 de -212.222.166.128 - 212.222.166.191 gb -212.222.166.192 - 212.222.166.255 de -212.222.167.0 - 212.222.168.207 gb -212.222.168.208 - 212.222.168.223 de -212.222.168.224 - 212.222.171.255 gb -212.222.172.0 - 212.222.172.63 de -212.222.172.64 - 212.222.174.255 gb -212.222.175.0 - 212.222.176.255 de -212.222.177.0 - 212.222.194.175 gb -212.222.194.176 - 212.222.194.191 de -212.222.194.192 - 212.222.194.255 gb -212.222.195.0 - 212.222.195.255 de -212.222.196.0 - 212.222.205.63 gb -212.222.205.64 - 212.222.205.95 de -212.222.205.96 - 212.222.236.143 gb -212.222.236.144 - 212.222.236.151 de -212.222.236.152 - 212.222.236.159 gb -212.222.236.160 - 212.222.236.167 de -212.222.236.168 - 212.222.236.175 gb -212.222.236.176 - 212.222.236.191 de -212.222.236.192 - 212.222.237.79 gb -212.222.237.80 - 212.222.237.103 de -212.222.237.104 - 212.222.238.175 gb -212.222.238.176 - 212.222.238.183 de -212.222.238.184 - 212.222.249.95 gb -212.222.249.96 - 212.222.249.127 de -212.222.249.128 - 212.222.255.255 gb -212.223.0.0 - 212.223.3.63 de -212.223.3.64 - 212.223.3.95 gb -212.223.3.96 - 212.223.5.31 de -212.223.5.32 - 212.223.5.63 gb -212.223.5.64 - 212.223.20.63 de -212.223.20.64 - 212.223.20.79 hu -212.223.20.80 - 212.223.115.255 de -212.223.116.0 - 212.223.116.255 ie -212.223.117.0 - 212.223.118.255 de -212.223.119.0 - 212.223.119.15 ie -212.223.119.16 - 212.223.119.159 de -212.223.119.160 - 212.223.119.175 gb -212.223.119.176 - 212.223.119.255 de -212.223.120.0 - 212.223.120.255 gb -212.223.121.0 - 212.223.121.15 de -212.223.121.16 - 212.223.121.31 at -212.223.121.32 - 212.223.153.255 de -212.223.154.0 - 212.223.154.255 us -212.223.155.0 - 212.223.161.159 de +212.222.129.0 - 212.222.255.255 gb +212.223.0.0 - 212.223.161.159 de 212.223.161.160 - 212.223.161.191 es -212.223.161.192 - 212.223.166.79 de -212.223.166.80 - 212.223.166.83 es -212.223.166.84 - 212.223.166.115 de -212.223.166.116 - 212.223.166.119 es -212.223.166.120 - 212.224.26.63 de -212.224.26.64 - 212.224.26.79 gb -212.224.26.80 - 212.224.90.255 de -212.224.91.0 - 212.224.91.255 nl -212.224.92.0 - 212.224.126.255 de -212.224.127.0 - 212.224.127.255 ch -212.224.128.0 - 212.224.138.7 be -212.224.138.8 - 212.224.138.11 nl -212.224.138.12 - 212.224.255.255 be +212.223.161.192 - 212.224.95.255 de +212.224.96.0 - 212.224.99.255 us +212.224.100.0 - 212.224.127.255 de +212.224.128.0 - 212.224.255.255 be 212.225.0.0 - 212.225.127.255 gb 212.225.128.0 - 212.225.255.255 es 212.226.0.0 - 212.226.255.255 fi -212.227.0.0 - 212.227.35.136 de -212.227.35.137 - 212.227.35.137 ro -212.227.35.138 - 212.227.114.31 de -212.227.114.32 - 212.227.114.39 gb -212.227.114.40 - 212.227.248.255 de -212.227.249.0 - 212.227.249.255 gb -212.227.250.0 - 212.227.255.255 de +212.227.0.0 - 212.227.163.191 de +212.227.163.192 - 212.227.166.255 es +212.227.167.0 - 212.227.207.255 de +212.227.208.0 - 212.227.211.255 gb +212.227.212.0 - 212.227.255.255 de 212.228.0.0 - 212.229.255.255 gb 212.230.0.0 - 212.231.255.255 es 212.232.0.0 - 212.232.15.255 ru @@ -144576,38 +111583,16 @@ 212.232.32.0 - 212.232.127.255 ru 212.232.128.0 - 212.232.255.255 ch 212.233.0.0 - 212.233.31.255 be -212.233.32.0 - 212.233.49.255 lu -212.233.50.0 - 212.233.50.255 be -212.233.51.0 - 212.233.57.31 lu -212.233.57.32 - 212.233.57.159 be -212.233.57.160 - 212.233.57.255 lu -212.233.58.0 - 212.233.61.255 be -212.233.62.0 - 212.233.62.191 lu -212.233.62.192 - 212.233.63.255 be +212.233.32.0 - 212.233.63.255 lu 212.233.64.0 - 212.233.127.255 ru 212.233.128.0 - 212.233.255.255 bg -212.234.0.0 - 212.234.3.111 fr -212.234.3.112 - 212.234.3.127 a2 -212.234.3.128 - 212.234.44.47 fr -212.234.44.48 - 212.234.44.55 a2 -212.234.44.56 - 212.234.255.255 fr -212.235.0.0 - 212.235.97.207 il -212.235.97.208 - 212.235.97.223 gb -212.235.97.224 - 212.235.127.255 il +212.234.0.0 - 212.234.255.255 fr +212.235.0.0 - 212.235.127.255 il 212.235.128.0 - 212.235.255.255 si 212.236.0.0 - 212.236.255.255 at 212.237.0.0 - 212.237.255.255 dk 212.238.0.0 - 212.238.255.255 nl -212.239.0.0 - 212.239.12.79 it -212.239.12.80 - 212.239.12.95 gb -212.239.12.96 - 212.239.37.127 it -212.239.37.128 - 212.239.37.143 nl -212.239.37.144 - 212.239.55.255 it -212.239.56.0 - 212.239.56.7 at -212.239.56.8 - 212.239.56.15 fr -212.239.56.16 - 212.239.56.23 gb -212.239.56.24 - 212.239.56.31 es -212.239.56.32 - 212.239.127.255 it +212.239.0.0 - 212.239.127.255 it 212.239.128.0 - 212.239.255.255 be 212.240.0.0 - 212.240.255.255 gb 212.241.0.0 - 212.241.31.255 kg @@ -144615,32 +111600,17 @@ 212.241.64.0 - 212.241.127.255 at 212.241.128.0 - 212.241.255.255 gb 212.242.0.0 - 212.242.255.255 dk -212.243.0.0 - 212.243.38.183 ch -212.243.38.184 - 212.243.38.191 de -212.243.38.192 - 212.243.79.255 ch -212.243.80.0 - 212.243.80.255 gb -212.243.81.0 - 212.243.255.255 ch +212.243.0.0 - 212.243.255.255 ch 212.244.0.0 - 212.244.255.255 pl 212.245.0.0 - 212.245.255.255 it -212.246.0.0 - 212.246.255.247 fi -212.246.255.248 - 212.246.255.255 ax +212.246.0.0 - 212.246.255.255 fi 212.247.0.0 - 212.247.255.255 se 212.248.0.0 - 212.248.127.255 ru 212.248.128.0 - 212.248.255.255 gb -212.249.0.0 - 212.249.0.7 ch -212.249.0.8 - 212.249.0.15 de -212.249.0.16 - 212.249.5.223 ch -212.249.5.224 - 212.249.5.255 at -212.249.6.0 - 212.249.7.7 ch -212.249.7.8 - 212.249.7.15 cd -212.249.7.16 - 212.249.209.255 ch -212.249.210.0 - 212.249.210.255 at -212.249.211.0 - 212.249.255.255 ch -212.250.0.0 - 212.250.85.159 gb -212.250.85.160 - 212.250.85.175 ie -212.250.85.176 - 212.250.213.191 gb -212.250.213.192 - 212.250.213.223 ie -212.250.213.224 - 212.250.255.255 gb +212.249.0.0 - 212.249.49.255 ch +212.249.50.0 - 212.249.50.255 eu +212.249.51.0 - 212.249.255.255 ch +212.250.0.0 - 212.250.255.255 gb 212.251.0.0 - 212.251.127.255 gr 212.251.128.0 - 212.251.255.255 no 212.252.0.0 - 212.253.255.255 tr @@ -144651,7 +111621,9 @@ 213.3.0.0 - 213.3.255.255 ch 213.4.0.0 - 213.4.255.255 es 213.5.0.0 - 213.5.15.255 pl -213.5.16.0 - 213.5.31.255 ru +213.5.16.0 - 213.5.19.255 ru +213.5.20.0 - 213.5.23.255 md +213.5.24.0 - 213.5.31.255 ru 213.5.32.0 - 213.5.39.255 dk 213.5.40.0 - 213.5.47.255 pl 213.5.48.0 - 213.5.55.255 ru @@ -144670,47 +111642,32 @@ 213.5.184.0 - 213.5.191.255 ru 213.5.192.0 - 213.5.199.255 ua 213.5.200.0 - 213.5.215.255 pl -213.5.216.0 - 213.5.247.255 ru +213.5.216.0 - 213.5.231.255 ru +213.5.240.0 - 213.5.247.255 ru 213.5.248.0 - 213.5.255.255 pl 213.6.0.0 - 213.6.255.255 ps 213.7.0.0 - 213.7.255.255 cy 213.8.0.0 - 213.8.255.255 il -213.9.0.0 - 213.9.3.223 de -213.9.3.224 - 213.9.3.255 nl -213.9.4.0 - 213.9.6.191 de -213.9.6.192 - 213.9.6.255 nl -213.9.7.0 - 213.9.7.111 de -213.9.7.112 - 213.9.7.127 nl -213.9.7.128 - 213.9.7.143 de -213.9.7.144 - 213.9.7.151 nl -213.9.7.152 - 213.9.58.143 de -213.9.58.144 - 213.9.58.151 at -213.9.58.152 - 213.9.64.143 de -213.9.64.144 - 213.9.64.151 at -213.9.64.152 - 213.9.65.143 de -213.9.65.144 - 213.9.65.151 at -213.9.65.152 - 213.9.73.107 de -213.9.73.108 - 213.9.73.111 nl -213.9.73.112 - 213.9.73.207 de -213.9.73.208 - 213.9.73.211 at -213.9.73.212 - 213.9.73.219 de -213.9.73.220 - 213.9.73.223 at -213.9.73.224 - 213.9.74.107 de -213.9.74.108 - 213.9.74.111 nl -213.9.74.112 - 213.9.90.47 de -213.9.90.48 - 213.9.90.55 nl -213.9.90.56 - 213.9.94.35 de -213.9.94.36 - 213.9.94.39 nl -213.9.94.40 - 213.9.94.143 de -213.9.94.144 - 213.9.94.147 nl -213.9.94.148 - 213.9.94.159 de -213.9.94.160 - 213.9.94.191 nl -213.9.94.192 - 213.9.94.211 de -213.9.94.212 - 213.9.94.215 nl -213.9.94.216 - 213.9.95.183 de -213.9.95.184 - 213.9.95.187 ai -213.9.95.188 - 213.9.127.255 de -213.9.128.0 - 213.9.255.255 es +213.9.0.0 - 213.9.127.255 de +213.9.128.0 - 213.9.148.119 gb +213.9.148.120 - 213.9.148.127 es +213.9.148.128 - 213.9.179.248 gb +213.9.179.249 - 213.9.179.249 es +213.9.179.250 - 213.9.195.47 gb +213.9.195.48 - 213.9.195.63 es +213.9.195.64 - 213.9.195.255 gb +213.9.196.0 - 213.9.199.255 es +213.9.200.0 - 213.9.209.255 gb +213.9.210.0 - 213.9.210.255 eu +213.9.211.0 - 213.9.211.255 es +213.9.212.0 - 213.9.213.255 gb +213.9.214.0 - 213.9.215.255 es +213.9.216.0 - 213.9.227.255 gb +213.9.228.0 - 213.9.231.255 es +213.9.232.0 - 213.9.239.255 gb +213.9.240.0 - 213.9.243.255 es +213.9.244.0 - 213.9.245.255 gb +213.9.246.0 - 213.9.255.255 es 213.10.0.0 - 213.10.255.255 nl 213.11.0.0 - 213.11.255.255 fr 213.12.0.0 - 213.12.31.255 gb @@ -144719,29 +111676,15 @@ 213.12.59.0 - 213.12.255.255 eu 213.13.0.0 - 213.13.255.255 pt 213.14.0.0 - 213.14.255.255 tr -213.15.0.0 - 213.15.131.223 se -213.15.131.224 - 213.15.131.239 fi -213.15.131.240 - 213.15.251.255 se +213.15.0.0 - 213.15.6.47 se +213.15.6.48 - 213.15.6.55 gb +213.15.6.56 - 213.15.251.255 se 213.15.252.0 - 213.15.255.255 gb -213.16.0.0 - 213.16.0.255 gp -213.16.1.0 - 213.16.1.255 mq -213.16.2.0 - 213.16.2.255 fr -213.16.3.0 - 213.16.3.255 mq -213.16.4.0 - 213.16.4.255 gp -213.16.5.0 - 213.16.5.255 gf -213.16.6.0 - 213.16.7.255 mq -213.16.8.0 - 213.16.9.255 gp -213.16.10.0 - 213.16.10.255 mq -213.16.11.0 - 213.16.11.255 gp -213.16.12.0 - 213.16.15.255 mq -213.16.16.0 - 213.16.16.255 gp -213.16.17.0 - 213.16.20.255 mq -213.16.21.0 - 213.16.22.255 gp -213.16.23.0 - 213.16.24.255 mq -213.16.25.0 - 213.16.26.255 gf -213.16.27.0 - 213.16.29.255 mq -213.16.30.0 - 213.16.30.255 gp -213.16.31.0 - 213.16.31.255 gf +213.16.0.0 - 213.16.12.255 fr +213.16.13.0 - 213.16.13.255 mq +213.16.14.0 - 213.16.21.255 fr +213.16.22.0 - 213.16.22.255 gp +213.16.23.0 - 213.16.31.255 fr 213.16.32.0 - 213.16.63.255 bg 213.16.64.0 - 213.16.127.255 hu 213.16.128.0 - 213.16.255.255 gr @@ -144749,45 +111692,18 @@ 213.17.128.0 - 213.17.255.255 pl 213.18.0.0 - 213.18.255.255 gb 213.19.0.0 - 213.19.127.255 cz -213.19.128.0 - 213.19.128.63 nl -213.19.128.64 - 213.19.129.63 gb -213.19.129.64 - 213.19.129.191 nl -213.19.129.192 - 213.19.129.255 gb -213.19.130.0 - 213.19.132.127 nl -213.19.132.128 - 213.19.132.255 gb -213.19.133.0 - 213.19.134.255 nl -213.19.135.0 - 213.19.135.255 gb -213.19.136.0 - 213.19.144.255 nl -213.19.145.0 - 213.19.145.255 gb -213.19.146.0 - 213.19.146.255 nl -213.19.147.0 - 213.19.147.255 gb -213.19.148.0 - 213.19.152.255 nl -213.19.153.0 - 213.19.160.127 gb -213.19.160.128 - 213.19.160.159 nl -213.19.160.160 - 213.19.160.191 gb -213.19.160.192 - 213.19.160.207 nl -213.19.160.208 - 213.19.160.255 gb -213.19.161.0 - 213.19.161.31 nl -213.19.161.32 - 213.19.164.255 gb -213.19.165.0 - 213.19.165.127 nl -213.19.165.128 - 213.19.166.255 gb -213.19.167.0 - 213.19.167.255 nl -213.19.168.0 - 213.19.172.127 gb -213.19.172.128 - 213.19.178.255 nl -213.19.179.0 - 213.19.179.255 gb -213.19.180.0 - 213.19.180.255 nl -213.19.181.0 - 213.19.255.255 gb -213.20.0.0 - 213.20.232.255 de -213.20.233.0 - 213.20.233.255 ch -213.20.234.0 - 213.20.240.191 de -213.20.240.192 - 213.20.240.223 fr -213.20.240.224 - 213.20.244.31 de -213.20.244.32 - 213.20.244.47 lu -213.20.244.48 - 213.20.245.55 de -213.20.245.56 - 213.20.245.63 lu -213.20.245.64 - 213.20.255.255 de +213.19.128.0 - 213.19.147.255 gb +213.19.148.0 - 213.19.151.255 nl +213.19.152.0 - 213.19.195.255 gb +213.19.196.0 - 213.19.196.255 nl +213.19.197.0 - 213.19.255.255 gb +213.20.0.0 - 213.20.255.255 de 213.21.0.0 - 213.21.63.255 ru -213.21.64.0 - 213.21.127.255 se +213.21.64.0 - 213.21.70.191 se +213.21.70.192 - 213.21.70.255 no +213.21.71.0 - 213.21.103.111 se +213.21.103.112 - 213.21.103.127 no +213.21.103.128 - 213.21.127.255 se 213.21.128.0 - 213.21.191.255 it 213.21.192.0 - 213.21.255.255 lv 213.22.0.0 - 213.22.255.255 pt @@ -144796,482 +111712,31 @@ 213.25.0.0 - 213.25.255.255 pl 213.26.0.0 - 213.26.255.255 it 213.27.0.0 - 213.27.127.255 ru -213.27.128.0 - 213.27.137.127 es -213.27.137.128 - 213.27.137.135 nl -213.27.137.136 - 213.27.138.135 es -213.27.138.136 - 213.27.138.143 fr -213.27.138.144 - 213.27.148.231 es -213.27.148.232 - 213.27.148.239 gb -213.27.148.240 - 213.27.151.95 es -213.27.151.96 - 213.27.151.111 gb -213.27.151.112 - 213.27.170.199 es -213.27.170.200 - 213.27.170.207 fr -213.27.170.208 - 213.27.193.247 es -213.27.193.248 - 213.27.193.255 gb -213.27.194.0 - 213.27.197.199 es -213.27.197.200 - 213.27.197.207 de -213.27.197.208 - 213.27.217.207 es -213.27.217.208 - 213.27.217.215 pt -213.27.217.216 - 213.27.221.127 es -213.27.221.128 - 213.27.221.135 gb -213.27.221.136 - 213.27.225.239 es -213.27.225.240 - 213.27.225.247 gb -213.27.225.248 - 213.27.233.63 es -213.27.233.64 - 213.27.233.71 us -213.27.233.72 - 213.27.255.255 es -213.28.0.0 - 213.28.120.255 fi -213.28.121.0 - 213.28.121.127 ru -213.28.121.128 - 213.28.147.255 fi -213.28.148.0 - 213.28.148.15 ax -213.28.148.16 - 213.28.148.223 fi -213.28.148.224 - 213.28.148.255 ax -213.28.149.0 - 213.28.255.255 fi +213.27.128.0 - 213.27.255.255 es +213.28.0.0 - 213.28.255.255 fi 213.29.0.0 - 213.29.255.255 cz 213.30.0.0 - 213.30.127.255 pt 213.30.128.0 - 213.30.191.255 fr 213.30.192.0 - 213.30.255.255 de -213.31.0.0 - 213.31.0.255 be -213.31.1.0 - 213.31.1.255 au -213.31.2.0 - 213.31.3.255 be -213.31.4.0 - 213.31.4.255 au -213.31.5.0 - 213.31.10.255 be -213.31.11.0 - 213.31.11.127 gb -213.31.11.128 - 213.31.11.255 it -213.31.12.0 - 213.31.13.255 be -213.31.14.0 - 213.31.14.255 ch -213.31.15.0 - 213.31.15.255 fr -213.31.16.0 - 213.31.17.127 be -213.31.17.128 - 213.31.17.135 hu -213.31.17.136 - 213.31.17.139 gb -213.31.17.140 - 213.31.17.143 fr -213.31.17.144 - 213.31.17.255 be -213.31.18.0 - 213.31.18.255 it -213.31.19.0 - 213.31.27.255 be -213.31.28.0 - 213.31.28.255 eg -213.31.29.0 - 213.31.29.255 it -213.31.30.0 - 213.31.31.255 be -213.31.32.0 - 213.31.32.255 gb -213.31.33.0 - 213.31.33.159 be -213.31.33.160 - 213.31.33.175 nl -213.31.33.176 - 213.31.33.183 fr -213.31.33.184 - 213.31.33.191 be -213.31.33.192 - 213.31.33.199 ch -213.31.33.200 - 213.31.33.215 be -213.31.33.216 - 213.31.33.223 pl -213.31.33.224 - 213.31.33.247 be -213.31.33.248 - 213.31.33.251 pl -213.31.33.252 - 213.31.35.255 be -213.31.36.0 - 213.31.37.255 gb -213.31.38.0 - 213.31.39.255 be -213.31.40.0 - 213.31.43.255 a2 -213.31.44.0 - 213.31.45.255 be -213.31.46.0 - 213.31.47.255 a2 -213.31.48.0 - 213.31.63.255 be -213.31.64.0 - 213.31.65.255 gb -213.31.66.0 - 213.31.68.255 be -213.31.69.0 - 213.31.69.127 gb -213.31.69.128 - 213.31.69.255 be -213.31.70.0 - 213.31.70.255 fr -213.31.71.0 - 213.31.171.207 be -213.31.171.208 - 213.31.171.211 gb -213.31.171.212 - 213.31.171.255 be -213.31.172.0 - 213.31.172.159 gb -213.31.172.160 - 213.31.172.191 be -213.31.172.192 - 213.31.172.223 it -213.31.172.224 - 213.31.172.255 fi -213.31.173.0 - 213.31.173.255 gb -213.31.174.0 - 213.31.179.255 be -213.31.180.0 - 213.31.180.127 fr -213.31.180.128 - 213.31.180.135 pt -213.31.180.136 - 213.31.180.159 gb -213.31.180.160 - 213.31.180.191 il -213.31.180.192 - 213.31.180.207 gb -213.31.180.208 - 213.31.180.255 be -213.31.181.0 - 213.31.181.31 gb -213.31.181.32 - 213.31.181.39 it -213.31.181.40 - 213.31.181.47 gb -213.31.181.48 - 213.31.181.63 nl -213.31.181.64 - 213.31.181.67 eg -213.31.181.68 - 213.31.181.75 be -213.31.181.76 - 213.31.181.79 gb -213.31.181.80 - 213.31.181.87 be -213.31.181.88 - 213.31.181.95 fi -213.31.181.96 - 213.31.181.111 be -213.31.181.112 - 213.31.181.127 pl -213.31.181.128 - 213.31.181.143 be -213.31.181.144 - 213.31.181.191 gb -213.31.181.192 - 213.31.182.135 be -213.31.182.136 - 213.31.182.143 gb -213.31.182.144 - 213.31.182.159 be -213.31.182.160 - 213.31.182.191 it -213.31.182.192 - 213.31.182.223 be -213.31.182.224 - 213.31.182.239 es -213.31.182.240 - 213.31.182.255 be -213.31.183.0 - 213.31.183.31 no -213.31.183.32 - 213.31.184.255 be -213.31.185.0 - 213.31.185.7 se -213.31.185.8 - 213.31.185.63 be -213.31.185.64 - 213.31.185.127 fr -213.31.185.128 - 213.31.186.79 be -213.31.186.80 - 213.31.186.95 gb -213.31.186.96 - 213.31.186.111 es -213.31.186.112 - 213.31.186.127 de -213.31.186.128 - 213.31.187.7 be -213.31.187.8 - 213.31.187.15 ch -213.31.187.16 - 213.31.187.23 be -213.31.187.24 - 213.31.187.31 fr -213.31.187.32 - 213.31.187.71 be -213.31.187.72 - 213.31.187.79 ro -213.31.187.80 - 213.31.187.103 be -213.31.187.104 - 213.31.187.111 ie -213.31.187.112 - 213.31.187.135 be -213.31.187.136 - 213.31.187.143 gb -213.31.187.144 - 213.31.187.151 de -213.31.187.152 - 213.31.187.159 it -213.31.187.160 - 213.31.190.47 be -213.31.190.48 - 213.31.190.63 es -213.31.190.64 - 213.31.190.71 se -213.31.190.72 - 213.31.190.95 be -213.31.190.96 - 213.31.190.103 es -213.31.190.104 - 213.31.190.159 be -213.31.190.160 - 213.31.190.167 de -213.31.190.168 - 213.31.190.223 be -213.31.190.224 - 213.31.190.239 gb -213.31.190.240 - 213.31.191.191 be -213.31.191.192 - 213.31.191.255 gb -213.31.192.0 - 213.31.194.255 nl -213.31.195.0 - 213.31.195.87 be -213.31.195.88 - 213.31.195.95 gb -213.31.195.96 - 213.31.196.15 be -213.31.196.16 - 213.31.196.23 es -213.31.196.24 - 213.31.196.31 fr -213.31.196.32 - 213.31.197.127 be -213.31.197.128 - 213.31.197.191 nl -213.31.197.192 - 213.31.197.223 be -213.31.197.224 - 213.31.197.231 gb -213.31.197.232 - 213.31.197.239 be -213.31.197.240 - 213.31.197.247 nl -213.31.197.248 - 213.31.199.255 be -213.31.200.0 - 213.31.200.31 gr -213.31.200.32 - 213.31.200.47 de -213.31.200.48 - 213.31.200.111 be -213.31.200.112 - 213.31.200.127 fr -213.31.200.128 - 213.31.200.191 be -213.31.200.192 - 213.31.200.199 gr -213.31.200.200 - 213.31.200.239 be -213.31.200.240 - 213.31.200.255 za -213.31.201.0 - 213.31.201.255 be -213.31.202.0 - 213.31.202.127 it -213.31.202.128 - 213.31.202.255 ch -213.31.203.0 - 213.31.203.255 il -213.31.204.0 - 213.31.204.127 be -213.31.204.128 - 213.31.204.143 fr -213.31.204.144 - 213.31.204.255 be -213.31.205.0 - 213.31.205.7 at -213.31.205.8 - 213.31.205.15 ch -213.31.205.16 - 213.31.205.23 de -213.31.205.24 - 213.31.205.31 be -213.31.205.32 - 213.31.205.39 hu -213.31.205.40 - 213.31.205.55 be -213.31.205.56 - 213.31.205.63 gb -213.31.205.64 - 213.31.205.95 nl -213.31.205.96 - 213.31.205.103 ie -213.31.205.104 - 213.31.205.119 be -213.31.205.120 - 213.31.205.127 il -213.31.205.128 - 213.31.205.191 ch -213.31.205.192 - 213.31.206.255 be -213.31.207.0 - 213.31.207.15 se -213.31.207.16 - 213.31.207.23 be -213.31.207.24 - 213.31.207.31 ch -213.31.207.32 - 213.31.207.47 se -213.31.207.48 - 213.31.207.63 de -213.31.207.64 - 213.31.207.79 se -213.31.207.80 - 213.31.207.95 it -213.31.207.96 - 213.31.207.143 be -213.31.207.144 - 213.31.207.159 za -213.31.207.160 - 213.31.207.175 be -213.31.207.176 - 213.31.207.183 es -213.31.207.184 - 213.31.207.191 cz -213.31.207.192 - 213.31.207.239 be -213.31.207.240 - 213.31.207.247 za -213.31.207.248 - 213.31.207.255 be -213.31.208.0 - 213.31.208.255 il -213.31.209.0 - 213.31.210.255 be -213.31.211.0 - 213.31.211.15 no -213.31.211.16 - 213.31.211.63 be -213.31.211.64 - 213.31.211.71 gb -213.31.211.72 - 213.31.211.143 be -213.31.211.144 - 213.31.211.151 gb -213.31.211.152 - 213.31.211.207 be -213.31.211.208 - 213.31.211.223 ch -213.31.211.224 - 213.31.211.239 be -213.31.211.240 - 213.31.211.255 de -213.31.212.0 - 213.31.212.71 be -213.31.212.72 - 213.31.212.79 gb -213.31.212.80 - 213.31.212.95 be -213.31.212.96 - 213.31.212.103 it -213.31.212.104 - 213.31.212.143 be -213.31.212.144 - 213.31.212.159 de -213.31.212.160 - 213.31.212.167 se -213.31.212.168 - 213.31.212.175 nl -213.31.212.176 - 213.31.212.191 be -213.31.212.192 - 213.31.212.223 gb -213.31.212.224 - 213.31.212.239 be -213.31.212.240 - 213.31.212.247 gb -213.31.212.248 - 213.31.214.191 be -213.31.214.192 - 213.31.214.255 nl -213.31.215.0 - 213.31.215.63 be -213.31.215.64 - 213.31.215.71 at -213.31.215.72 - 213.31.215.79 it -213.31.215.80 - 213.31.215.119 be -213.31.215.120 - 213.31.215.127 de -213.31.215.128 - 213.31.215.223 be -213.31.215.224 - 213.31.215.231 se -213.31.215.232 - 213.31.215.255 be -213.31.216.0 - 213.31.216.63 ch -213.31.216.64 - 213.31.216.71 de -213.31.216.72 - 213.31.216.79 be -213.31.216.80 - 213.31.216.87 pt -213.31.216.88 - 213.31.216.95 dk -213.31.216.96 - 213.31.216.127 gb -213.31.216.128 - 213.31.217.7 be -213.31.217.8 - 213.31.217.15 at -213.31.217.16 - 213.31.217.79 be -213.31.217.80 - 213.31.217.95 it -213.31.217.96 - 213.31.217.191 be -213.31.217.192 - 213.31.217.223 no -213.31.217.224 - 213.31.217.255 gb -213.31.218.0 - 213.31.218.23 be -213.31.218.24 - 213.31.218.31 de -213.31.218.32 - 213.31.218.63 be -213.31.218.64 - 213.31.218.79 fi -213.31.218.80 - 213.31.218.159 be -213.31.218.160 - 213.31.218.167 es -213.31.218.168 - 213.31.218.175 be -213.31.218.176 - 213.31.218.183 gb -213.31.218.184 - 213.31.218.191 de -213.31.218.192 - 213.31.219.7 be -213.31.219.8 - 213.31.219.15 fi -213.31.219.16 - 213.31.219.23 be -213.31.219.24 - 213.31.219.31 de -213.31.219.32 - 213.31.219.79 be -213.31.219.80 - 213.31.219.87 no -213.31.219.88 - 213.31.219.95 be -213.31.219.96 - 213.31.219.103 fr -213.31.219.104 - 213.31.219.111 es -213.31.219.112 - 213.31.219.119 be -213.31.219.120 - 213.31.219.127 se -213.31.219.128 - 213.31.219.191 be -213.31.219.192 - 213.31.219.223 gb -213.31.219.224 - 213.31.219.231 se -213.31.219.232 - 213.31.219.239 gb -213.31.219.240 - 213.31.219.247 it -213.31.219.248 - 213.31.220.71 be -213.31.220.72 - 213.31.220.79 ch -213.31.220.80 - 213.31.220.95 es -213.31.220.96 - 213.31.220.111 be -213.31.220.112 - 213.31.220.119 ch -213.31.220.120 - 213.31.220.127 be -213.31.220.128 - 213.31.220.143 se -213.31.220.144 - 213.31.220.159 be -213.31.220.160 - 213.31.220.175 pt -213.31.220.176 - 213.31.220.191 pl -213.31.220.192 - 213.31.220.207 de -213.31.220.208 - 213.31.220.215 pt -213.31.220.216 - 213.31.220.223 de -213.31.220.224 - 213.31.220.231 gb -213.31.220.232 - 213.31.220.255 be -213.31.221.0 - 213.31.221.255 no -213.31.222.0 - 213.31.222.7 ru -213.31.222.8 - 213.31.222.15 gb -213.31.222.16 - 213.31.222.127 be -213.31.222.128 - 213.31.222.159 eg -213.31.222.160 - 213.31.222.175 fi -213.31.222.176 - 213.31.222.191 be -213.31.222.192 - 213.31.222.223 gb -213.31.222.224 - 213.31.222.239 be -213.31.222.240 - 213.31.222.247 gb -213.31.222.248 - 213.31.223.63 be -213.31.223.64 - 213.31.223.127 ch -213.31.223.128 - 213.31.223.135 gb -213.31.223.136 - 213.31.223.143 be -213.31.223.144 - 213.31.223.159 tr -213.31.223.160 - 213.31.224.15 be -213.31.224.16 - 213.31.224.31 de -213.31.224.32 - 213.31.224.175 be -213.31.224.176 - 213.31.224.183 hu -213.31.224.184 - 213.31.226.127 be -213.31.226.128 - 213.31.226.255 fr -213.31.227.0 - 213.31.227.71 be -213.31.227.72 - 213.31.227.79 gb -213.31.227.80 - 213.31.227.87 be -213.31.227.88 - 213.31.227.95 ru -213.31.227.96 - 213.31.227.119 be -213.31.227.120 - 213.31.227.127 de -213.31.227.128 - 213.31.227.135 be -213.31.227.136 - 213.31.227.143 cz -213.31.227.144 - 213.31.227.159 be -213.31.227.160 - 213.31.227.167 pl -213.31.227.168 - 213.31.227.175 cz -213.31.227.176 - 213.31.227.191 be -213.31.227.192 - 213.31.227.223 de -213.31.227.224 - 213.31.227.247 be -213.31.227.248 - 213.31.227.255 fr -213.31.228.0 - 213.31.228.47 be -213.31.228.48 - 213.31.228.63 de -213.31.228.64 - 213.31.228.159 be -213.31.228.160 - 213.31.228.191 gb -213.31.228.192 - 213.31.229.159 be -213.31.229.160 - 213.31.229.191 lu -213.31.229.192 - 213.31.229.223 gb -213.31.229.224 - 213.31.232.87 be -213.31.232.88 - 213.31.232.95 gb -213.31.232.96 - 213.31.232.159 be -213.31.232.160 - 213.31.232.223 gb -213.31.232.224 - 213.31.232.247 be -213.31.232.248 - 213.31.232.255 pl -213.31.233.0 - 213.31.233.7 be -213.31.233.8 - 213.31.233.15 ru -213.31.233.16 - 213.31.233.31 be -213.31.233.32 - 213.31.233.63 no -213.31.233.64 - 213.31.233.255 be -213.31.234.0 - 213.31.234.15 de -213.31.234.16 - 213.31.234.31 be -213.31.234.32 - 213.31.234.63 gb -213.31.234.64 - 213.31.234.95 be -213.31.234.96 - 213.31.234.111 pl -213.31.234.112 - 213.31.234.191 be -213.31.234.192 - 213.31.234.207 nl -213.31.234.208 - 213.31.234.223 gr -213.31.234.224 - 213.31.234.239 be -213.31.234.240 - 213.31.234.255 se -213.31.235.0 - 213.31.235.127 be -213.31.235.128 - 213.31.235.159 fr -213.31.235.160 - 213.31.235.191 gb -213.31.235.192 - 213.31.235.223 be -213.31.235.224 - 213.31.235.227 gb -213.31.235.228 - 213.31.235.239 ie -213.31.235.240 - 213.31.235.255 pl -213.31.236.0 - 213.31.239.255 be +213.31.0.0 - 213.31.10.255 be +213.31.11.0 - 213.31.11.255 eu +213.31.12.0 - 213.31.42.255 be +213.31.43.0 - 213.31.43.255 cy +213.31.44.0 - 213.31.179.255 be +213.31.180.0 - 213.31.180.255 eu +213.31.181.0 - 213.31.204.255 be +213.31.205.0 - 213.31.205.255 eu +213.31.206.0 - 213.31.232.165 be +213.31.232.166 - 213.31.232.166 eu +213.31.232.167 - 213.31.239.255 be 213.31.240.0 - 213.31.255.255 tr 213.32.0.0 - 213.32.255.255 dk -213.33.0.0 - 213.33.79.255 at -213.33.80.0 - 213.33.80.15 sa -213.33.80.16 - 213.33.89.255 at -213.33.90.0 - 213.33.90.255 li -213.33.91.0 - 213.33.103.255 at -213.33.104.0 - 213.33.106.63 li -213.33.106.64 - 213.33.112.39 at -213.33.112.40 - 213.33.112.47 sa -213.33.112.48 - 213.33.112.63 at -213.33.112.64 - 213.33.112.95 sa -213.33.112.96 - 213.33.113.127 at -213.33.113.128 - 213.33.113.135 sa -213.33.113.136 - 213.33.127.255 at +213.33.0.0 - 213.33.127.255 at 213.33.128.0 - 213.33.255.255 ru -213.34.0.0 - 213.34.0.63 at -213.34.0.64 - 213.34.0.255 nl -213.34.1.0 - 213.34.1.255 at -213.34.2.0 - 213.34.191.255 nl +213.34.0.0 - 213.34.191.255 nl 213.34.192.0 - 213.34.223.255 kw 213.34.224.0 - 213.34.255.255 nl -213.35.0.0 - 213.35.32.31 gb -213.35.32.32 - 213.35.32.47 nl -213.35.32.48 - 213.35.37.15 gb -213.35.37.16 - 213.35.37.23 nl -213.35.37.24 - 213.35.38.47 gb -213.35.38.48 - 213.35.38.63 nl -213.35.38.64 - 213.35.39.31 gb -213.35.39.32 - 213.35.39.63 nl -213.35.39.64 - 213.35.46.255 gb -213.35.47.0 - 213.35.47.255 nl -213.35.48.0 - 213.35.48.255 gb -213.35.49.0 - 213.35.49.63 nl -213.35.49.64 - 213.35.49.127 gb -213.35.49.128 - 213.35.49.191 nl -213.35.49.192 - 213.35.49.255 gb -213.35.50.0 - 213.35.50.11 nl -213.35.50.12 - 213.35.50.19 gb -213.35.50.20 - 213.35.50.23 nl -213.35.50.24 - 213.35.50.51 gb -213.35.50.52 - 213.35.50.63 nl -213.35.50.64 - 213.35.50.67 gb -213.35.50.68 - 213.35.50.79 nl -213.35.50.80 - 213.35.50.87 gb -213.35.50.88 - 213.35.50.95 nl -213.35.50.96 - 213.35.50.123 gb -213.35.50.124 - 213.35.50.127 nl -213.35.50.128 - 213.35.50.151 gb -213.35.50.152 - 213.35.50.155 nl -213.35.50.156 - 213.35.50.171 gb -213.35.50.172 - 213.35.50.175 nl -213.35.50.176 - 213.35.50.195 gb -213.35.50.196 - 213.35.50.199 nl -213.35.50.200 - 213.35.50.231 gb -213.35.50.232 - 213.35.50.239 nl -213.35.50.240 - 213.35.50.247 gb -213.35.50.248 - 213.35.50.255 nl -213.35.51.0 - 213.35.51.7 gb -213.35.51.8 - 213.35.51.39 nl -213.35.51.40 - 213.35.51.47 gb -213.35.51.48 - 213.35.51.55 nl -213.35.51.56 - 213.35.51.71 gb -213.35.51.72 - 213.35.51.103 nl -213.35.51.104 - 213.35.51.119 gb -213.35.51.120 - 213.35.51.127 nl -213.35.51.128 - 213.35.51.135 gb -213.35.51.136 - 213.35.51.151 nl -213.35.51.152 - 213.35.51.175 gb -213.35.51.176 - 213.35.51.191 nl -213.35.51.192 - 213.35.51.207 gb -213.35.51.208 - 213.35.51.215 nl -213.35.51.216 - 213.35.63.255 gb -213.35.64.0 - 213.35.64.255 be -213.35.65.0 - 213.35.69.97 gb -213.35.69.98 - 213.35.69.111 us -213.35.69.112 - 213.35.76.75 gb -213.35.76.76 - 213.35.76.79 be -213.35.76.80 - 213.35.77.255 gb -213.35.78.0 - 213.35.78.127 nl -213.35.78.128 - 213.35.78.255 gb -213.35.79.0 - 213.35.79.255 nl -213.35.80.0 - 213.35.80.255 gb -213.35.81.0 - 213.35.81.15 nl -213.35.81.16 - 213.35.92.7 gb -213.35.92.8 - 213.35.92.11 nl -213.35.92.12 - 213.35.92.23 gb -213.35.92.24 - 213.35.92.27 nl -213.35.92.28 - 213.35.92.39 gb -213.35.92.40 - 213.35.92.43 nl -213.35.92.44 - 213.35.92.60 gb -213.35.92.61 - 213.35.92.62 nl -213.35.92.63 - 213.35.92.67 gb -213.35.92.68 - 213.35.92.71 nl -213.35.92.72 - 213.35.92.75 gb -213.35.92.76 - 213.35.92.83 nl -213.35.92.84 - 213.35.93.7 gb -213.35.93.8 - 213.35.93.23 nl -213.35.93.24 - 213.35.93.31 gb -213.35.93.32 - 213.35.93.39 nl -213.35.93.40 - 213.35.93.55 gb -213.35.93.56 - 213.35.93.63 nl -213.35.93.64 - 213.35.93.87 gb -213.35.93.88 - 213.35.93.95 nl -213.35.93.96 - 213.35.93.111 gb -213.35.93.112 - 213.35.93.127 nl -213.35.93.128 - 213.35.93.199 gb -213.35.93.200 - 213.35.93.207 nl -213.35.93.208 - 213.35.94.255 gb -213.35.95.0 - 213.35.95.127 nl -213.35.95.128 - 213.35.99.255 gb -213.35.100.0 - 213.35.102.255 us -213.35.103.0 - 213.35.122.47 gb -213.35.122.48 - 213.35.122.63 nl -213.35.122.64 - 213.35.122.79 gb -213.35.122.80 - 213.35.122.95 nl -213.35.122.96 - 213.35.122.255 gb -213.35.123.0 - 213.35.124.255 nl -213.35.125.0 - 213.35.127.255 gb +213.35.0.0 - 213.35.127.255 gb 213.35.128.0 - 213.35.255.255 ee 213.36.0.0 - 213.36.255.255 fr 213.37.0.0 - 213.37.255.255 es @@ -145310,8 +111775,8 @@ 213.38.14.0 - 213.38.15.255 eu 213.38.16.0 - 213.38.16.63 gb 213.38.16.64 - 213.38.16.255 eu -213.38.17.0 - 213.38.17.71 gb -213.38.17.72 - 213.38.17.103 eu +213.38.17.0 - 213.38.17.63 gb +213.38.17.64 - 213.38.17.103 eu 213.38.17.104 - 213.38.17.119 gb 213.38.17.120 - 213.38.17.135 eu 213.38.17.136 - 213.38.17.143 gb @@ -145361,8 +111826,8 @@ 213.38.69.168 - 213.38.69.175 gb 213.38.69.176 - 213.38.69.239 eu 213.38.69.240 - 213.38.70.255 gb -213.38.71.0 - 213.38.71.127 eu -213.38.71.128 - 213.38.72.63 gb +213.38.71.0 - 213.38.71.255 eu +213.38.72.0 - 213.38.72.63 gb 213.38.72.64 - 213.38.72.127 eu 213.38.72.128 - 213.38.72.191 gb 213.38.72.192 - 213.38.73.127 eu @@ -145375,19 +111840,17 @@ 213.38.76.24 - 213.38.76.39 gb 213.38.76.40 - 213.38.76.47 eu 213.38.76.48 - 213.38.76.55 gb -213.38.76.56 - 213.38.76.63 eu -213.38.76.64 - 213.38.76.71 gb -213.38.76.72 - 213.38.76.87 eu +213.38.76.56 - 213.38.76.87 eu 213.38.76.88 - 213.38.76.95 gb 213.38.76.96 - 213.38.76.103 eu 213.38.76.104 - 213.38.76.111 gb 213.38.76.112 - 213.38.76.119 eu 213.38.76.120 - 213.38.76.143 gb 213.38.76.144 - 213.38.76.159 eu -213.38.76.160 - 213.38.76.175 gb -213.38.76.176 - 213.38.76.207 eu -213.38.76.208 - 213.38.76.223 gb -213.38.76.224 - 213.38.79.31 eu +213.38.76.160 - 213.38.76.167 gb +213.38.76.168 - 213.38.76.207 eu +213.38.76.208 - 213.38.76.215 gb +213.38.76.216 - 213.38.79.31 eu 213.38.79.32 - 213.38.79.47 gb 213.38.79.48 - 213.38.79.111 eu 213.38.79.112 - 213.38.79.143 gb @@ -145401,9 +111864,7 @@ 213.38.87.64 - 213.38.87.95 gb 213.38.87.96 - 213.38.87.127 eu 213.38.87.128 - 213.38.87.159 gb -213.38.87.160 - 213.38.88.191 eu -213.38.88.192 - 213.38.88.255 gb -213.38.89.0 - 213.38.89.127 eu +213.38.87.160 - 213.38.89.127 eu 213.38.89.128 - 213.38.89.191 gb 213.38.89.192 - 213.38.92.111 eu 213.38.92.112 - 213.38.92.127 gb @@ -145427,19 +111888,13 @@ 213.38.105.64 - 213.38.105.192 gb 213.38.105.193 - 213.38.106.31 eu 213.38.106.32 - 213.38.106.47 gb -213.38.106.48 - 213.38.109.127 eu -213.38.109.128 - 213.38.109.255 gb -213.38.110.0 - 213.38.111.63 eu +213.38.106.48 - 213.38.111.63 eu 213.38.111.64 - 213.38.111.95 gb -213.38.111.96 - 213.38.112.239 eu -213.38.112.240 - 213.38.112.247 gb -213.38.112.248 - 213.38.112.255 eu +213.38.111.96 - 213.38.112.255 eu 213.38.113.0 - 213.38.113.127 gb 213.38.113.128 - 213.38.115.255 eu 213.38.116.0 - 213.38.116.127 gb -213.38.116.128 - 213.38.116.175 eu -213.38.116.176 - 213.38.116.183 gb -213.38.116.184 - 213.38.120.255 eu +213.38.116.128 - 213.38.120.255 eu 213.38.121.0 - 213.38.121.127 gb 213.38.121.128 - 213.38.122.255 eu 213.38.123.0 - 213.38.123.63 gb @@ -145468,26 +111923,20 @@ 213.38.135.144 - 213.38.136.95 eu 213.38.136.96 - 213.38.136.127 gb 213.38.136.128 - 213.38.136.223 eu -213.38.136.224 - 213.38.137.63 gb -213.38.137.64 - 213.38.139.255 eu +213.38.136.224 - 213.38.136.255 gb +213.38.137.0 - 213.38.139.255 eu 213.38.140.0 - 213.38.140.63 gb 213.38.140.64 - 213.38.145.255 eu 213.38.146.0 - 213.38.146.127 gb 213.38.146.128 - 213.38.147.255 eu 213.38.148.0 - 213.38.148.63 gb -213.38.148.64 - 213.38.149.127 eu -213.38.149.128 - 213.38.149.191 gb -213.38.149.192 - 213.38.149.255 eu +213.38.148.64 - 213.38.149.255 eu 213.38.150.0 - 213.38.150.127 gb 213.38.150.128 - 213.38.151.239 eu 213.38.151.240 - 213.38.152.63 gb 213.38.152.64 - 213.38.153.23 eu 213.38.153.24 - 213.38.153.31 gb -213.38.153.32 - 213.38.153.79 eu -213.38.153.80 - 213.38.153.87 gb -213.38.153.88 - 213.38.153.159 eu -213.38.153.160 - 213.38.153.175 gb -213.38.153.176 - 213.38.153.239 eu +213.38.153.32 - 213.38.153.239 eu 213.38.153.240 - 213.38.153.247 gb 213.38.153.248 - 213.38.156.127 eu 213.38.156.128 - 213.38.156.159 gb @@ -145504,7 +111953,9 @@ 213.38.167.0 - 213.38.167.95 eu 213.38.167.96 - 213.38.167.127 gb 213.38.167.128 - 213.38.169.135 eu -213.38.169.136 - 213.38.169.159 gb +213.38.169.136 - 213.38.169.143 gb +213.38.169.144 - 213.38.169.151 eu +213.38.169.152 - 213.38.169.159 gb 213.38.169.160 - 213.38.169.167 eu 213.38.169.168 - 213.38.169.175 gb 213.38.169.176 - 213.38.169.183 eu @@ -145515,9 +111966,7 @@ 213.38.175.16 - 213.38.175.47 gb 213.38.175.48 - 213.38.176.255 eu 213.38.177.0 - 213.38.177.255 gb -213.38.178.0 - 213.38.181.255 eu -213.38.182.0 - 213.38.182.63 gb -213.38.182.64 - 213.38.183.255 eu +213.38.178.0 - 213.38.183.255 eu 213.38.184.0 - 213.38.184.63 gb 213.38.184.64 - 213.38.184.127 eu 213.38.184.128 - 213.38.184.191 gb @@ -145527,13 +111976,11 @@ 213.38.185.128 - 213.38.185.191 gb 213.38.185.192 - 213.38.186.191 eu 213.38.186.192 - 213.38.186.223 gb -213.38.186.224 - 213.38.188.191 eu -213.38.188.192 - 213.38.188.207 gb -213.38.188.208 - 213.38.189.255 eu +213.38.186.224 - 213.38.189.255 eu 213.38.190.0 - 213.38.190.127 gb 213.38.190.128 - 213.38.191.95 eu -213.38.191.96 - 213.38.191.159 gb -213.38.191.160 - 213.38.191.223 eu +213.38.191.96 - 213.38.191.127 gb +213.38.191.128 - 213.38.191.223 eu 213.38.191.224 - 213.38.191.255 gb 213.38.192.0 - 213.38.192.39 eu 213.38.192.40 - 213.38.192.43 gb @@ -145561,9 +112008,7 @@ 213.38.203.96 - 213.38.203.127 gb 213.38.203.128 - 213.38.204.175 eu 213.38.204.176 - 213.38.204.191 gb -213.38.204.192 - 213.38.204.223 eu -213.38.204.224 - 213.38.204.239 gb -213.38.204.240 - 213.38.211.15 eu +213.38.204.192 - 213.38.211.15 eu 213.38.211.16 - 213.38.211.31 gb 213.38.211.32 - 213.38.211.63 eu 213.38.211.64 - 213.38.211.87 gb @@ -145584,696 +112029,138 @@ 213.38.232.0 - 213.38.240.255 eu 213.38.241.0 - 213.38.247.255 gb 213.38.248.0 - 213.38.249.255 eu -213.38.250.0 - 213.39.1.207 gb -213.39.1.208 - 213.39.1.255 fr -213.39.2.0 - 213.39.11.63 gb -213.39.11.64 - 213.39.11.127 fr -213.39.11.128 - 213.39.18.191 gb -213.39.18.192 - 213.39.18.223 fr -213.39.18.224 - 213.39.20.255 gb -213.39.21.0 - 213.39.21.15 fr -213.39.21.16 - 213.39.23.31 gb -213.39.23.32 - 213.39.23.47 fr -213.39.23.48 - 213.39.33.63 gb -213.39.33.64 - 213.39.33.191 fr -213.39.33.192 - 213.39.64.175 gb -213.39.64.176 - 213.39.64.191 ch -213.39.64.192 - 213.39.71.255 gb -213.39.72.0 - 213.39.72.127 ch -213.39.72.128 - 213.39.73.255 gb -213.39.74.0 - 213.39.74.255 ch -213.39.75.0 - 213.39.76.175 gb -213.39.76.176 - 213.39.76.183 ch -213.39.76.184 - 213.39.77.71 gb -213.39.77.72 - 213.39.77.79 ch -213.39.77.80 - 213.39.117.79 gb -213.39.117.80 - 213.39.117.95 ch -213.39.117.96 - 213.39.120.127 gb -213.39.120.128 - 213.39.120.143 ch -213.39.120.144 - 213.39.122.255 gb -213.39.123.0 - 213.39.123.255 ch -213.39.124.0 - 213.39.126.127 gb -213.39.126.128 - 213.39.126.191 ch -213.39.126.192 - 213.39.127.255 gb +213.38.250.0 - 213.39.31.91 gb +213.39.31.92 - 213.39.31.95 nl +213.39.31.96 - 213.39.42.255 gb +213.39.43.0 - 213.39.43.255 fr +213.39.44.0 - 213.39.51.159 gb +213.39.51.160 - 213.39.51.167 de +213.39.51.168 - 213.39.93.59 gb +213.39.93.60 - 213.39.93.63 es +213.39.93.64 - 213.39.123.253 gb +213.39.123.254 - 213.39.123.254 ch +213.39.123.255 - 213.39.127.255 gb 213.39.128.0 - 213.39.255.255 de 213.40.0.0 - 213.40.255.255 gb -213.41.0.0 - 213.41.10.159 fr -213.41.10.160 - 213.41.10.175 gb -213.41.10.176 - 213.41.10.199 fr -213.41.10.200 - 213.41.10.207 gb -213.41.10.208 - 213.41.10.231 fr -213.41.10.232 - 213.41.10.239 gb -213.41.10.240 - 213.41.11.87 fr -213.41.11.88 - 213.41.11.127 gb -213.41.11.128 - 213.41.12.7 fr -213.41.12.8 - 213.41.12.15 gb -213.41.12.16 - 213.41.12.31 fr -213.41.12.32 - 213.41.12.63 gb -213.41.12.64 - 213.41.12.175 fr -213.41.12.176 - 213.41.12.255 gb -213.41.13.0 - 213.41.13.143 fr -213.41.13.144 - 213.41.13.191 gb -213.41.13.192 - 213.41.14.31 fr -213.41.14.32 - 213.41.14.63 gb -213.41.14.64 - 213.41.14.95 fr -213.41.14.96 - 213.41.14.111 gb -213.41.14.112 - 213.41.14.143 fr -213.41.14.144 - 213.41.14.175 gb -213.41.14.176 - 213.41.15.95 fr -213.41.15.96 - 213.41.15.111 gb -213.41.15.112 - 213.41.16.71 fr -213.41.16.72 - 213.41.16.79 gb -213.41.16.80 - 213.41.16.225 fr -213.41.16.226 - 213.41.16.255 gb -213.41.17.0 - 213.41.17.207 fr -213.41.17.208 - 213.41.17.215 gb -213.41.17.216 - 213.41.19.15 fr -213.41.19.16 - 213.41.19.31 gb -213.41.19.32 - 213.41.19.47 fr -213.41.19.48 - 213.41.19.63 gb -213.41.19.64 - 213.41.19.79 fr -213.41.19.80 - 213.41.19.127 gb -213.41.19.128 - 213.41.19.159 fr -213.41.19.160 - 213.41.19.175 gb -213.41.19.176 - 213.41.19.191 fr -213.41.19.192 - 213.41.19.223 gb -213.41.19.224 - 213.41.19.239 fr -213.41.19.240 - 213.41.19.255 gb -213.41.20.0 - 213.41.23.167 fr -213.41.23.168 - 213.41.23.175 gb -213.41.23.176 - 213.41.23.239 fr -213.41.23.240 - 213.41.23.255 gb -213.41.24.0 - 213.41.25.91 fr -213.41.25.92 - 213.41.25.127 gb -213.41.25.128 - 213.41.25.191 fr -213.41.25.192 - 213.41.26.255 gb -213.41.27.0 - 213.41.28.31 fr -213.41.28.32 - 213.41.28.63 gb -213.41.28.64 - 213.41.28.135 fr -213.41.28.136 - 213.41.28.143 gb -213.41.28.144 - 213.41.28.191 fr -213.41.28.192 - 213.41.28.199 gb -213.41.28.200 - 213.41.28.231 fr -213.41.28.232 - 213.41.28.247 gb -213.41.28.248 - 213.41.30.191 fr -213.41.30.192 - 213.41.30.223 gb -213.41.30.224 - 213.41.31.15 fr -213.41.31.16 - 213.41.31.23 gb -213.41.31.24 - 213.41.31.31 fr -213.41.31.32 - 213.41.31.71 gb -213.41.31.72 - 213.41.31.87 fr -213.41.31.88 - 213.41.31.111 gb -213.41.31.112 - 213.41.31.119 fr -213.41.31.120 - 213.41.31.127 gb -213.41.31.128 - 213.41.31.191 fr -213.41.31.192 - 213.41.31.223 gb -213.41.31.224 - 213.41.32.7 fr -213.41.32.8 - 213.41.32.23 gb -213.41.32.24 - 213.41.32.143 fr -213.41.32.144 - 213.41.32.151 gb -213.41.32.152 - 213.41.32.159 fr -213.41.32.160 - 213.41.32.167 gb -213.41.32.168 - 213.41.39.135 fr -213.41.39.136 - 213.41.39.143 gb -213.41.39.144 - 213.41.39.159 fr -213.41.39.160 - 213.41.39.175 gb -213.41.39.176 - 213.41.48.135 fr -213.41.48.136 - 213.41.48.191 gb -213.41.48.192 - 213.41.49.128 fr -213.41.49.129 - 213.41.49.199 gb -213.41.49.200 - 213.41.49.215 fr -213.41.49.216 - 213.41.49.223 gb -213.41.49.224 - 213.41.60.15 fr -213.41.60.16 - 213.41.60.23 gb -213.41.60.24 - 213.41.60.119 fr -213.41.60.120 - 213.41.60.127 gb -213.41.60.128 - 213.41.60.183 fr -213.41.60.184 - 213.41.60.223 gb -213.41.60.224 - 213.41.61.143 fr -213.41.61.144 - 213.41.61.191 gb -213.41.61.192 - 213.41.61.207 fr -213.41.61.208 - 213.41.61.223 gb -213.41.61.224 - 213.41.61.231 fr -213.41.61.232 - 213.41.61.239 gb -213.41.61.240 - 213.41.64.255 fr -213.41.65.0 - 213.41.66.127 gb -213.41.66.128 - 213.41.66.159 fr -213.41.66.160 - 213.41.66.255 gb -213.41.67.0 - 213.41.68.15 fr -213.41.68.16 - 213.41.68.127 gb -213.41.68.128 - 213.41.68.191 fr -213.41.68.192 - 213.41.68.207 gb -213.41.68.208 - 213.41.68.223 fr -213.41.68.224 - 213.41.68.255 gb -213.41.69.0 - 213.41.71.255 fr -213.41.72.0 - 213.41.72.255 gb -213.41.73.0 - 213.41.80.79 fr -213.41.80.80 - 213.41.80.87 gb -213.41.80.88 - 213.41.80.143 fr -213.41.80.144 - 213.41.80.151 gb -213.41.80.152 - 213.41.80.159 fr -213.41.80.160 - 213.41.80.183 gb -213.41.80.184 - 213.41.81.127 fr -213.41.81.128 - 213.41.81.135 gb -213.41.81.136 - 213.41.81.143 fr -213.41.81.144 - 213.41.81.159 gb -213.41.81.160 - 213.41.81.175 fr -213.41.81.176 - 213.41.81.183 gb -213.41.81.184 - 213.41.82.95 fr -213.41.82.96 - 213.41.82.103 gb -213.41.82.104 - 213.41.82.175 fr -213.41.82.176 - 213.41.82.223 gb -213.41.82.224 - 213.41.82.239 fr -213.41.82.240 - 213.41.82.255 gb -213.41.83.0 - 213.41.83.143 fr -213.41.83.144 - 213.41.83.151 gb -213.41.83.152 - 213.41.83.175 fr -213.41.83.176 - 213.41.83.191 gb -213.41.83.192 - 213.41.83.199 fr -213.41.83.200 - 213.41.83.207 gb -213.41.83.208 - 213.41.83.215 fr -213.41.83.216 - 213.41.83.223 gb -213.41.83.224 - 213.41.83.239 fr -213.41.83.240 - 213.41.83.247 gb -213.41.83.248 - 213.41.84.31 fr -213.41.84.32 - 213.41.84.39 gb -213.41.84.40 - 213.41.84.55 fr -213.41.84.56 - 213.41.84.63 gb -213.41.84.64 - 213.41.84.87 fr -213.41.84.88 - 213.41.84.95 gb -213.41.84.96 - 213.41.84.127 fr -213.41.84.128 - 213.41.84.135 gb -213.41.84.136 - 213.41.84.143 fr -213.41.84.144 - 213.41.84.159 gb -213.41.84.160 - 213.41.84.183 fr -213.41.84.184 - 213.41.84.191 gb -213.41.84.192 - 213.41.84.215 fr -213.41.84.216 - 213.41.84.231 gb -213.41.84.232 - 213.41.84.255 fr -213.41.85.0 - 213.41.85.7 gb -213.41.85.8 - 213.41.85.143 fr -213.41.85.144 - 213.41.85.175 gb -213.41.85.176 - 213.41.85.239 fr -213.41.85.240 - 213.41.85.255 gb -213.41.86.0 - 213.41.86.127 fr -213.41.86.128 - 213.41.86.143 gb -213.41.86.144 - 213.41.86.239 fr -213.41.86.240 - 213.41.86.255 gb -213.41.87.0 - 213.41.87.95 fr -213.41.87.96 - 213.41.87.111 gb -213.41.87.112 - 213.41.87.127 fr -213.41.87.128 - 213.41.87.159 gb -213.41.87.160 - 213.41.87.175 fr -213.41.87.176 - 213.41.88.15 gb -213.41.88.16 - 213.41.88.31 fr -213.41.88.32 - 213.41.88.47 gb -213.41.88.48 - 213.41.88.95 fr -213.41.88.96 - 213.41.88.111 gb -213.41.88.112 - 213.41.88.127 fr -213.41.88.128 - 213.41.88.159 gb -213.41.88.160 - 213.41.88.175 fr -213.41.88.176 - 213.41.88.255 gb -213.41.89.0 - 213.41.89.127 fr -213.41.89.128 - 213.41.89.191 gb -213.41.89.192 - 213.41.89.223 fr -213.41.89.224 - 213.41.89.239 gb -213.41.89.240 - 213.41.90.79 fr -213.41.90.80 - 213.41.90.95 gb -213.41.90.96 - 213.41.90.111 fr -213.41.90.112 - 213.41.90.127 gb -213.41.90.128 - 213.41.90.135 fr -213.41.90.136 - 213.41.90.143 gb -213.41.90.144 - 213.41.91.7 fr -213.41.91.8 - 213.41.91.15 gb -213.41.91.16 - 213.41.91.47 fr -213.41.91.48 - 213.41.91.79 gb -213.41.91.80 - 213.41.91.87 fr -213.41.91.88 - 213.41.91.95 gb -213.41.91.96 - 213.41.91.175 fr -213.41.91.176 - 213.41.91.191 gb -213.41.91.192 - 213.41.91.207 fr -213.41.91.208 - 213.41.91.255 gb -213.41.92.0 - 213.41.92.15 fr -213.41.92.16 - 213.41.92.47 gb -213.41.92.48 - 213.41.92.95 fr -213.41.92.96 - 213.41.92.111 gb -213.41.92.112 - 213.41.92.191 fr -213.41.92.192 - 213.41.93.15 gb -213.41.93.16 - 213.41.93.31 fr -213.41.93.32 - 213.41.93.47 gb -213.41.93.48 - 213.41.93.63 fr -213.41.93.64 - 213.41.93.79 gb -213.41.93.80 - 213.41.93.95 fr -213.41.93.96 - 213.41.93.111 gb -213.41.93.112 - 213.41.93.183 fr -213.41.93.184 - 213.41.93.223 gb -213.41.93.224 - 213.41.94.119 fr -213.41.94.120 - 213.41.94.127 gb -213.41.94.128 - 213.41.95.47 fr -213.41.95.48 - 213.41.95.95 gb -213.41.95.96 - 213.41.95.111 fr -213.41.95.112 - 213.41.95.127 gb -213.41.95.128 - 213.41.95.143 fr -213.41.95.144 - 213.41.95.175 gb -213.41.95.176 - 213.41.95.191 fr -213.41.95.192 - 213.41.95.207 gb -213.41.95.208 - 213.41.95.223 fr -213.41.95.224 - 213.41.96.15 gb -213.41.96.16 - 213.41.96.31 fr -213.41.96.32 - 213.41.96.63 gb -213.41.96.64 - 213.41.96.111 fr -213.41.96.112 - 213.41.96.127 gb -213.41.96.128 - 213.41.96.143 fr -213.41.96.144 - 213.41.96.223 gb -213.41.96.224 - 213.41.97.47 fr -213.41.97.48 - 213.41.97.79 gb -213.41.97.80 - 213.41.97.127 fr -213.41.97.128 - 213.41.97.191 gb -213.41.97.192 - 213.41.97.207 fr -213.41.97.208 - 213.41.97.223 gb -213.41.97.224 - 213.41.98.7 fr -213.41.98.8 - 213.41.98.15 gb -213.41.98.16 - 213.41.98.31 fr -213.41.98.32 - 213.41.98.127 gb -213.41.98.128 - 213.41.98.143 fr -213.41.98.144 - 213.41.98.175 gb -213.41.98.176 - 213.41.98.207 fr -213.41.98.208 - 213.41.98.223 gb -213.41.98.224 - 213.41.98.239 fr -213.41.98.240 - 213.41.98.255 gb -213.41.99.0 - 213.41.99.15 fr -213.41.99.16 - 213.41.99.63 gb -213.41.99.64 - 213.41.99.95 fr -213.41.99.96 - 213.41.99.111 gb -213.41.99.112 - 213.41.99.143 fr -213.41.99.144 - 213.41.99.159 gb -213.41.99.160 - 213.41.99.191 fr -213.41.99.192 - 213.41.99.255 gb -213.41.100.0 - 213.41.101.111 fr -213.41.101.112 - 213.41.101.135 gb -213.41.101.136 - 213.41.101.151 fr -213.41.101.152 - 213.41.101.159 gb -213.41.101.160 - 213.41.101.175 fr -213.41.101.176 - 213.41.101.207 gb -213.41.101.208 - 213.41.101.239 fr -213.41.101.240 - 213.41.102.15 gb -213.41.102.16 - 213.41.102.79 fr -213.41.102.80 - 213.41.102.95 gb -213.41.102.96 - 213.41.102.111 fr -213.41.102.112 - 213.41.102.127 gb -213.41.102.128 - 213.41.102.143 fr -213.41.102.144 - 213.41.102.159 gb -213.41.102.160 - 213.41.102.175 fr -213.41.102.176 - 213.41.102.191 gb -213.41.102.192 - 213.41.102.207 fr -213.41.102.208 - 213.41.102.239 gb -213.41.102.240 - 213.41.103.63 fr -213.41.103.64 - 213.41.103.95 gb -213.41.103.96 - 213.41.103.111 fr -213.41.103.112 - 213.41.103.191 gb -213.41.103.192 - 213.41.103.207 fr -213.41.103.208 - 213.41.103.255 gb -213.41.104.0 - 213.41.104.47 fr -213.41.104.48 - 213.41.104.55 gb -213.41.104.56 - 213.41.104.63 fr -213.41.104.64 - 213.41.104.71 gb -213.41.104.72 - 213.41.104.95 fr -213.41.104.96 - 213.41.104.127 gb -213.41.104.128 - 213.41.105.39 fr -213.41.105.40 - 213.41.105.63 gb -213.41.105.64 - 213.41.105.95 fr -213.41.105.96 - 213.41.105.135 gb -213.41.105.136 - 213.41.105.151 fr -213.41.105.152 - 213.41.105.159 gb -213.41.105.160 - 213.41.105.183 fr -213.41.105.184 - 213.41.105.191 gb -213.41.105.192 - 213.41.105.199 fr -213.41.105.200 - 213.41.105.207 gb -213.41.105.208 - 213.41.105.215 fr -213.41.105.216 - 213.41.105.231 gb -213.41.105.232 - 213.41.105.239 fr -213.41.105.240 - 213.41.105.247 gb -213.41.105.248 - 213.41.107.15 fr -213.41.107.16 - 213.41.107.255 gb -213.41.108.0 - 213.41.115.39 fr -213.41.115.40 - 213.41.115.47 gb -213.41.115.48 - 213.41.115.95 fr -213.41.115.96 - 213.41.115.103 gb -213.41.115.104 - 213.41.115.143 fr -213.41.115.144 - 213.41.115.151 gb -213.41.115.152 - 213.41.115.159 fr -213.41.115.160 - 213.41.115.199 gb -213.41.115.200 - 213.41.115.255 fr -213.41.116.0 - 213.41.116.63 gb -213.41.116.64 - 213.41.116.71 fr -213.41.116.72 - 213.41.116.79 gb -213.41.116.80 - 213.41.116.111 fr -213.41.116.112 - 213.41.116.223 gb -213.41.116.224 - 213.41.116.231 fr -213.41.116.232 - 213.41.116.239 gb -213.41.116.240 - 213.41.118.103 fr -213.41.118.104 - 213.41.118.127 gb -213.41.118.128 - 213.41.118.191 fr -213.41.118.192 - 213.41.118.207 gb -213.41.118.208 - 213.41.118.255 fr -213.41.119.0 - 213.41.119.79 gb -213.41.119.80 - 213.41.119.95 fr -213.41.119.96 - 213.41.119.111 gb -213.41.119.112 - 213.41.119.127 fr -213.41.119.128 - 213.41.119.175 gb -213.41.119.176 - 213.41.119.191 fr -213.41.119.192 - 213.41.119.239 gb -213.41.119.240 - 213.41.122.103 fr -213.41.122.104 - 213.41.122.111 gb -213.41.122.112 - 213.41.122.207 fr -213.41.122.208 - 213.41.122.215 gb -213.41.122.216 - 213.41.122.247 fr -213.41.122.248 - 213.41.122.255 gb -213.41.123.0 - 213.41.124.31 fr -213.41.124.32 - 213.41.124.47 gb -213.41.124.48 - 213.41.124.79 fr -213.41.124.80 - 213.41.124.95 gb -213.41.124.96 - 213.41.124.103 fr -213.41.124.104 - 213.41.124.111 gb -213.41.124.112 - 213.41.124.119 fr -213.41.124.120 - 213.41.124.135 gb -213.41.124.136 - 213.41.124.151 fr -213.41.124.152 - 213.41.124.175 gb -213.41.124.176 - 213.41.124.191 fr -213.41.124.192 - 213.41.124.207 gb -213.41.124.208 - 213.41.126.23 fr -213.41.126.24 - 213.41.126.255 gb -213.41.127.0 - 213.41.127.199 fr -213.41.127.200 - 213.41.127.255 gb +213.41.0.0 - 213.41.9.255 fr +213.41.10.0 - 213.41.31.71 gb +213.41.31.72 - 213.41.31.79 fr +213.41.31.80 - 213.41.32.207 gb +213.41.32.208 - 213.41.32.215 fr +213.41.32.216 - 213.41.62.255 gb +213.41.63.0 - 213.41.63.255 fr +213.41.64.0 - 213.41.69.63 gb +213.41.69.64 - 213.41.69.127 fr +213.41.69.128 - 213.41.71.255 gb +213.41.72.0 - 213.41.72.255 fr +213.41.73.0 - 213.41.77.111 gb +213.41.77.112 - 213.41.77.119 fr +213.41.77.120 - 213.41.80.47 gb +213.41.80.48 - 213.41.80.63 fr +213.41.80.64 - 213.41.80.231 gb +213.41.80.232 - 213.41.80.239 fr +213.41.80.240 - 213.41.81.55 gb +213.41.81.56 - 213.41.81.63 fr +213.41.81.64 - 213.41.94.255 gb +213.41.95.0 - 213.41.95.255 fr +213.41.96.0 - 213.41.103.255 gb +213.41.104.0 - 213.41.104.15 fr +213.41.104.16 - 213.41.104.255 gb +213.41.105.0 - 213.41.105.255 fr +213.41.106.0 - 213.41.108.255 gb +213.41.109.0 - 213.41.109.255 fr +213.41.110.0 - 213.41.116.239 gb +213.41.116.240 - 213.41.116.255 fr +213.41.117.0 - 213.41.118.63 gb +213.41.118.64 - 213.41.118.71 fr +213.41.118.72 - 213.41.118.159 gb +213.41.118.160 - 213.41.118.167 fr +213.41.118.168 - 213.41.118.183 gb +213.41.118.184 - 213.41.118.191 fr +213.41.118.192 - 213.41.119.231 gb +213.41.119.232 - 213.41.119.239 fr +213.41.119.240 - 213.41.120.255 gb +213.41.121.0 - 213.41.121.255 fr +213.41.122.0 - 213.41.127.255 gb 213.41.128.0 - 213.41.255.255 fr 213.42.0.0 - 213.42.255.255 ae 213.43.0.0 - 213.43.255.255 tr 213.44.0.0 - 213.44.255.255 fr 213.45.0.0 - 213.45.255.255 it -213.46.0.0 - 213.46.161.255 nl -213.46.162.0 - 213.46.162.255 be -213.46.163.0 - 213.46.163.255 fr -213.46.164.0 - 213.46.165.255 nl -213.46.166.0 - 213.46.166.255 hu -213.46.167.0 - 213.46.169.255 nl -213.46.170.0 - 213.46.170.255 ro -213.46.171.0 - 213.46.171.255 nl -213.46.172.0 - 213.46.172.255 cz -213.46.173.0 - 213.46.173.255 at -213.46.174.0 - 213.46.174.255 gb -213.46.175.0 - 213.46.175.255 nl -213.46.176.0 - 213.46.176.255 se -213.46.177.0 - 213.46.177.255 no -213.46.178.0 - 213.46.178.255 pl -213.46.179.0 - 213.46.179.255 de -213.46.180.0 - 213.46.227.255 nl -213.46.228.0 - 213.46.229.255 se -213.46.230.0 - 213.46.230.255 gb -213.46.231.0 - 213.46.235.255 nl -213.46.236.0 - 213.46.237.255 gb -213.46.238.0 - 213.46.242.255 nl -213.46.243.0 - 213.46.243.255 at -213.46.244.0 - 213.46.254.255 nl -213.46.255.0 - 213.47.255.255 at +213.46.0.0 - 213.46.236.20 nl +213.46.236.21 - 213.46.236.21 gb +213.46.236.22 - 213.46.255.255 nl +213.47.0.0 - 213.47.255.255 at 213.48.0.0 - 213.48.255.255 gb 213.49.0.0 - 213.49.255.255 be 213.50.0.0 - 213.50.255.255 se 213.51.0.0 - 213.51.255.255 nl 213.52.0.0 - 213.52.127.255 no -213.52.128.0 - 213.52.179.255 gb -213.52.180.0 - 213.52.181.127 nl -213.52.181.128 - 213.52.183.255 gb -213.52.184.0 - 213.52.190.123 nl -213.52.190.124 - 213.52.190.191 gb -213.52.190.192 - 213.52.191.255 nl -213.52.192.0 - 213.52.255.255 gb +213.52.128.0 - 213.52.175.255 gb +213.52.176.0 - 213.52.176.255 nl +213.52.177.0 - 213.52.255.255 gb 213.53.0.0 - 213.53.255.255 nl 213.54.0.0 - 213.54.255.255 de -213.55.0.0 - 213.55.63.255 fr +213.55.0.0 - 213.55.5.255 fr +213.55.6.0 - 213.55.6.255 re +213.55.7.0 - 213.55.17.255 fr +213.55.18.0 - 213.55.19.255 re +213.55.20.0 - 213.55.30.255 fr +213.55.31.0 - 213.55.31.255 re +213.55.32.0 - 213.55.40.255 fr +213.55.41.0 - 213.55.41.255 re +213.55.42.0 - 213.55.44.255 fr +213.55.45.0 - 213.55.45.255 re +213.55.46.0 - 213.55.49.41 fr +213.55.49.42 - 213.55.49.42 re +213.55.49.43 - 213.55.57.255 fr +213.55.58.0 - 213.55.58.255 re +213.55.59.0 - 213.55.63.255 fr 213.55.64.0 - 213.55.127.255 et 213.55.128.0 - 213.55.255.255 ch 213.56.0.0 - 213.56.255.255 fr 213.57.0.0 - 213.57.255.255 il -213.58.0.0 - 213.58.174.127 pt -213.58.174.128 - 213.58.174.143 de -213.58.174.144 - 213.58.255.255 pt -213.59.0.0 - 213.59.15.47 ru -213.59.15.48 - 213.59.15.63 kz -213.59.15.64 - 213.59.255.255 ru +213.58.0.0 - 213.58.255.255 pt +213.59.0.0 - 213.59.255.255 ru 213.60.0.0 - 213.60.255.255 es -213.61.0.0 - 213.61.4.135 de -213.61.4.136 - 213.61.4.143 us -213.61.4.144 - 213.61.4.255 de +213.61.0.0 - 213.61.4.255 de 213.61.5.0 - 213.61.5.127 se -213.61.5.128 - 213.61.5.255 de -213.61.6.0 - 213.61.6.127 us -213.61.6.128 - 213.61.10.223 de -213.61.10.224 - 213.61.10.255 fr -213.61.11.0 - 213.61.24.135 de -213.61.24.136 - 213.61.24.143 ch -213.61.24.144 - 213.61.26.47 de -213.61.26.48 - 213.61.26.51 us -213.61.26.52 - 213.61.34.191 de -213.61.34.192 - 213.61.34.199 dk -213.61.34.200 - 213.61.48.223 de -213.61.48.224 - 213.61.48.239 us -213.61.48.240 - 213.61.58.223 de -213.61.58.224 - 213.61.58.231 fr -213.61.58.232 - 213.61.69.23 de -213.61.69.24 - 213.61.69.31 gb -213.61.69.32 - 213.61.77.215 de -213.61.77.216 - 213.61.77.223 gb -213.61.77.224 - 213.61.89.223 de -213.61.89.224 - 213.61.89.231 it -213.61.89.232 - 213.61.104.63 de -213.61.104.64 - 213.61.104.71 dk -213.61.104.72 - 213.61.127.15 de -213.61.127.16 - 213.61.127.31 us -213.61.127.32 - 213.61.162.167 de -213.61.162.168 - 213.61.162.175 us -213.61.162.176 - 213.61.186.111 de -213.61.186.112 - 213.61.186.127 fr -213.61.186.128 - 213.61.187.167 de -213.61.187.168 - 213.61.187.175 ie -213.61.187.176 - 213.61.245.135 de -213.61.245.136 - 213.61.245.143 nl -213.61.245.144 - 213.62.0.127 de -213.62.0.128 - 213.62.0.255 gb -213.62.1.0 - 213.62.1.255 de -213.62.2.0 - 213.62.3.191 ch -213.62.3.192 - 213.62.3.255 eu -213.62.4.0 - 213.62.7.255 de -213.62.8.0 - 213.62.8.31 eu -213.62.8.32 - 213.62.8.95 de -213.62.8.96 - 213.62.8.127 eu -213.62.8.128 - 213.62.8.255 no -213.62.9.0 - 213.62.9.255 hu -213.62.10.0 - 213.62.10.255 fi -213.62.11.0 - 213.62.11.255 eu -213.62.12.0 - 213.62.12.255 de -213.62.13.0 - 213.62.14.255 eu -213.62.15.0 - 213.62.15.31 de -213.62.15.32 - 213.62.15.63 eu -213.62.15.64 - 213.62.15.127 de -213.62.15.128 - 213.62.31.255 eu -213.62.32.0 - 213.62.32.15 gb -213.62.32.16 - 213.62.32.31 nl -213.62.32.32 - 213.62.32.127 gb -213.62.32.128 - 213.62.32.191 be -213.62.32.192 - 213.62.32.223 eu -213.62.32.224 - 213.62.32.239 at -213.62.32.240 - 213.62.32.255 eu -213.62.33.0 - 213.62.37.223 gb -213.62.37.224 - 213.62.37.255 eu -213.62.38.0 - 213.62.40.95 gb -213.62.40.96 - 213.62.40.143 eu -213.62.40.144 - 213.62.40.191 gb -213.62.40.192 - 213.62.40.255 tr -213.62.41.0 - 213.62.41.255 eu -213.62.42.0 - 213.62.42.63 gb -213.62.42.64 - 213.62.42.127 eu -213.62.42.128 - 213.62.42.159 gb -213.62.42.160 - 213.62.42.223 eu -213.62.42.224 - 213.62.42.231 sk -213.62.42.232 - 213.62.42.255 eu -213.62.43.0 - 213.62.46.127 gb -213.62.46.128 - 213.62.46.255 de -213.62.47.0 - 213.62.47.255 gb -213.62.48.0 - 213.62.48.63 eu -213.62.48.64 - 213.62.49.143 gb -213.62.49.144 - 213.62.49.255 eu -213.62.50.0 - 213.62.53.127 gb -213.62.53.128 - 213.62.53.255 eu -213.62.54.0 - 213.62.54.255 gb -213.62.55.0 - 213.62.55.127 eu -213.62.55.128 - 213.62.57.47 gb -213.62.57.48 - 213.62.57.63 eu -213.62.57.64 - 213.62.58.111 gb -213.62.58.112 - 213.62.58.119 eu -213.62.58.120 - 213.62.58.127 gb -213.62.58.128 - 213.62.58.143 eu -213.62.58.144 - 213.62.59.255 gb -213.62.60.0 - 213.62.60.191 eu -213.62.60.192 - 213.62.63.255 gb -213.62.64.0 - 213.62.65.255 fr -213.62.66.0 - 213.62.66.255 eu -213.62.67.0 - 213.62.67.255 gb -213.62.68.0 - 213.62.69.63 fr -213.62.69.64 - 213.62.69.95 eu -213.62.69.96 - 213.62.71.255 fr -213.62.72.0 - 213.62.79.255 ch -213.62.80.0 - 213.62.85.255 gb -213.62.86.0 - 213.62.86.255 eu -213.62.87.0 - 213.62.87.255 gb -213.62.88.0 - 213.62.91.255 eu -213.62.92.0 - 213.62.92.159 cz -213.62.92.160 - 213.62.92.167 eu -213.62.92.168 - 213.62.92.175 cz -213.62.92.176 - 213.62.92.255 eu -213.62.93.0 - 213.62.93.191 cz -213.62.93.192 - 213.62.95.255 eu -213.62.96.0 - 213.62.98.127 fr -213.62.98.128 - 213.62.98.191 eu -213.62.98.192 - 213.62.99.255 fr +213.61.5.128 - 213.61.255.255 de +213.62.0.0 - 213.62.62.63 eu +213.62.62.64 - 213.62.62.127 gb +213.62.62.128 - 213.62.71.255 eu +213.62.72.0 - 213.62.75.255 ch +213.62.76.0 - 213.62.99.255 eu 213.62.100.0 - 213.62.103.255 de -213.62.104.0 - 213.62.108.255 gb -213.62.109.0 - 213.62.109.255 be -213.62.110.0 - 213.62.111.255 gb -213.62.112.0 - 213.62.112.47 fr -213.62.112.48 - 213.62.112.55 eu -213.62.112.56 - 213.62.113.71 fr -213.62.113.72 - 213.62.113.79 eu -213.62.113.80 - 213.62.115.63 fr -213.62.115.64 - 213.62.115.87 eu -213.62.115.88 - 213.62.115.103 fr -213.62.115.104 - 213.62.115.119 eu -213.62.115.120 - 213.62.115.127 fr -213.62.115.128 - 213.62.115.159 eu -213.62.115.160 - 213.62.115.167 fr -213.62.115.168 - 213.62.115.183 eu -213.62.115.184 - 213.62.115.191 fr -213.62.115.192 - 213.62.115.255 eu -213.62.116.0 - 213.62.119.15 fr -213.62.119.16 - 213.62.119.31 eu -213.62.119.32 - 213.62.120.191 fr -213.62.120.192 - 213.62.120.199 eu -213.62.120.200 - 213.62.121.175 fr -213.62.121.176 - 213.62.121.183 eu -213.62.121.184 - 213.62.121.223 fr -213.62.121.224 - 213.62.123.255 eu -213.62.124.0 - 213.62.124.23 gb -213.62.124.24 - 213.62.124.31 eu -213.62.124.32 - 213.62.124.71 gb -213.62.124.72 - 213.62.124.79 eu -213.62.124.80 - 213.62.124.255 gb -213.62.125.0 - 213.62.125.255 eu -213.62.126.0 - 213.62.127.255 fr -213.62.128.0 - 213.62.128.223 nl -213.62.128.224 - 213.62.128.239 gb -213.62.128.240 - 213.62.128.255 nl -213.62.129.0 - 213.62.137.119 eu -213.62.137.120 - 213.62.137.135 nl -213.62.137.136 - 213.62.137.143 eu -213.62.137.144 - 213.62.137.191 nl -213.62.137.192 - 213.62.137.255 sk -213.62.138.0 - 213.62.138.255 eu -213.62.139.0 - 213.62.139.63 nl -213.62.139.64 - 213.62.139.79 eu -213.62.139.80 - 213.62.139.127 nl -213.62.139.128 - 213.62.139.255 eu -213.62.140.0 - 213.62.140.127 nl -213.62.140.128 - 213.62.140.255 no -213.62.141.0 - 213.62.141.71 nl -213.62.141.72 - 213.62.141.79 eu -213.62.141.80 - 213.62.141.191 nl -213.62.141.192 - 213.62.141.255 eu -213.62.142.0 - 213.62.142.255 nl -213.62.143.0 - 213.62.143.255 eu -213.62.144.0 - 213.62.147.39 dk -213.62.147.40 - 213.62.147.63 eu -213.62.147.64 - 213.62.147.95 dk -213.62.147.96 - 213.62.147.127 eu -213.62.147.128 - 213.62.147.255 dk -213.62.148.0 - 213.62.149.255 eu -213.62.150.0 - 213.62.151.255 nl -213.62.152.0 - 213.62.159.255 eu -213.62.160.0 - 213.62.160.255 gb -213.62.161.0 - 213.62.163.255 eu -213.62.164.0 - 213.62.165.191 it -213.62.165.192 - 213.62.165.255 eu -213.62.166.0 - 213.62.166.7 no -213.62.166.8 - 213.62.166.15 eu -213.62.166.16 - 213.62.166.31 no -213.62.166.32 - 213.62.166.127 eu -213.62.166.128 - 213.62.166.207 no -213.62.166.208 - 213.62.166.255 eu -213.62.167.0 - 213.62.167.127 no -213.62.167.128 - 213.62.167.255 eu -213.62.168.0 - 213.62.175.255 it -213.62.176.0 - 213.62.176.223 at -213.62.176.224 - 213.62.176.255 eu -213.62.177.0 - 213.62.177.95 at -213.62.177.96 - 213.62.177.111 eu -213.62.177.112 - 213.62.177.127 at -213.62.177.128 - 213.62.177.159 eu -213.62.177.160 - 213.62.177.191 at -213.62.177.192 - 213.62.177.255 eu -213.62.178.0 - 213.62.180.127 at -213.62.180.128 - 213.62.183.255 eu -213.62.184.0 - 213.62.184.255 gb -213.62.185.0 - 213.62.185.63 eu -213.62.185.64 - 213.62.191.255 gb -213.62.192.0 - 213.62.193.31 gr -213.62.193.32 - 213.62.193.63 eu -213.62.193.64 - 213.62.193.95 gr -213.62.193.96 - 213.62.193.255 eu -213.62.194.0 - 213.62.194.255 gb -213.62.195.0 - 213.62.196.191 be -213.62.196.192 - 213.62.196.255 eu -213.62.197.0 - 213.62.199.255 be -213.62.200.0 - 213.62.207.255 eu -213.62.208.0 - 213.62.214.191 se -213.62.214.192 - 213.62.214.223 eu -213.62.214.224 - 213.62.215.31 se -213.62.215.32 - 213.62.215.63 eu -213.62.215.64 - 213.62.215.95 se -213.62.215.96 - 213.62.215.127 eu -213.62.215.128 - 213.62.215.175 se -213.62.215.176 - 213.62.215.255 eu -213.62.216.0 - 213.62.216.55 es -213.62.216.56 - 213.62.216.63 eu -213.62.216.64 - 213.62.216.71 es -213.62.216.72 - 213.62.216.79 eu -213.62.216.80 - 213.62.216.143 es -213.62.216.144 - 213.62.216.255 eu -213.62.217.0 - 213.62.217.31 be -213.62.217.32 - 213.62.217.63 ro -213.62.217.64 - 213.62.217.127 lu -213.62.217.128 - 213.62.217.255 eu -213.62.218.0 - 213.62.218.127 es -213.62.218.128 - 213.62.223.255 eu -213.62.224.0 - 213.62.224.159 pl -213.62.224.160 - 213.62.228.31 eu -213.62.228.32 - 213.62.228.63 ie -213.62.228.64 - 213.62.228.127 eu -213.62.228.128 - 213.62.228.191 ie -213.62.228.192 - 213.62.229.255 eu -213.62.230.0 - 213.62.231.7 hu -213.62.231.8 - 213.62.231.127 eu -213.62.231.128 - 213.62.231.255 hu -213.62.232.0 - 213.62.239.255 be -213.62.240.0 - 213.62.241.255 za -213.62.242.0 - 213.62.247.255 de -213.62.248.0 - 213.62.255.255 eu +213.62.104.0 - 213.62.107.255 gb +213.62.108.0 - 213.62.115.63 eu +213.62.115.64 - 213.62.115.95 fr +213.62.115.96 - 213.62.120.239 eu +213.62.120.240 - 213.62.120.255 fr +213.62.121.0 - 213.62.121.255 eu +213.62.122.0 - 213.62.123.255 fr +213.62.124.0 - 213.62.155.127 eu +213.62.155.128 - 213.62.155.143 nl +213.62.155.144 - 213.62.207.255 eu +213.62.208.0 - 213.62.211.255 se +213.62.212.0 - 213.62.231.255 eu +213.62.232.0 - 213.62.235.255 be +213.62.236.0 - 213.62.255.255 eu 213.63.0.0 - 213.63.255.255 pt 213.64.0.0 - 213.67.255.255 se -213.68.0.0 - 213.68.177.255 de -213.68.178.0 - 213.68.178.31 ch -213.68.178.32 - 213.71.31.127 de -213.71.31.128 - 213.71.31.191 pk -213.71.31.192 - 213.71.135.135 de -213.71.135.136 - 213.71.135.143 us -213.71.135.144 - 213.71.255.255 de +213.68.0.0 - 213.68.143.255 de +213.68.144.0 - 213.68.144.255 eu +213.68.145.0 - 213.68.237.255 de +213.68.238.0 - 213.68.238.124 eu +213.68.238.125 - 213.68.238.126 de +213.68.238.127 - 213.68.238.255 eu +213.68.239.0 - 213.70.97.255 de +213.70.98.0 - 213.70.98.255 eu +213.70.99.0 - 213.70.227.255 de +213.70.228.0 - 213.70.228.255 nl +213.70.229.0 - 213.71.134.255 de +213.71.135.0 - 213.71.135.255 eu +213.71.136.0 - 213.71.255.255 de 213.72.0.0 - 213.72.255.255 gb 213.73.0.0 - 213.73.31.255 pl 213.73.32.0 - 213.73.63.255 es @@ -146286,281 +112173,40 @@ 213.79.0.0 - 213.79.31.255 ru 213.79.32.0 - 213.79.63.255 ie 213.79.64.0 - 213.79.127.255 ru -213.79.128.0 - 213.80.127.255 se +213.79.128.0 - 213.80.72.255 se +213.80.73.0 - 213.80.73.255 fi +213.80.74.0 - 213.80.127.255 se 213.80.128.0 - 213.80.255.255 ru 213.81.0.0 - 213.81.127.255 gb 213.81.128.0 - 213.81.255.255 sk 213.82.0.0 - 213.82.255.255 it -213.83.0.0 - 213.83.6.63 de -213.83.6.64 - 213.83.6.67 ch -213.83.6.68 - 213.83.25.63 de -213.83.25.64 - 213.83.25.79 gb -213.83.25.80 - 213.83.33.71 de -213.83.33.72 - 213.83.33.79 be -213.83.33.80 - 213.83.41.7 de -213.83.41.8 - 213.83.41.15 ch -213.83.41.16 - 213.83.44.175 de -213.83.44.176 - 213.83.44.183 fr -213.83.44.184 - 213.83.47.47 de -213.83.47.48 - 213.83.47.55 gb -213.83.47.56 - 213.83.51.95 de -213.83.51.96 - 213.83.51.99 ch -213.83.51.100 - 213.83.63.255 de +213.83.0.0 - 213.83.63.255 de 213.83.64.0 - 213.83.127.255 gb 213.83.128.0 - 213.83.255.255 dk 213.84.0.0 - 213.84.255.255 nl -213.85.0.0 - 213.85.56.255 ru -213.85.57.0 - 213.85.57.255 by -213.85.58.0 - 213.85.255.255 ru -213.86.0.0 - 213.86.20.15 gb -213.86.20.16 - 213.86.20.31 be -213.86.20.32 - 213.86.20.191 gb -213.86.20.192 - 213.86.20.207 is -213.86.20.208 - 213.86.23.79 gb -213.86.23.80 - 213.86.23.95 ch -213.86.23.96 - 213.86.33.207 gb -213.86.33.208 - 213.86.33.223 de -213.86.33.224 - 213.86.40.255 gb -213.86.41.0 - 213.86.41.103 nl -213.86.41.104 - 213.86.41.104 gb -213.86.41.105 - 213.86.41.105 nl -213.86.41.106 - 213.86.41.111 gb -213.86.41.112 - 213.86.41.127 be -213.86.41.128 - 213.86.41.207 nl -213.86.41.208 - 213.86.41.215 gb -213.86.41.216 - 213.86.41.223 es -213.86.41.224 - 213.86.41.255 nl -213.86.42.0 - 213.86.42.247 gb -213.86.42.248 - 213.86.42.255 us -213.86.43.0 - 213.86.54.127 gb -213.86.54.128 - 213.86.54.255 us -213.86.55.0 - 213.86.55.127 gb +213.85.0.0 - 213.85.255.255 ru +213.86.0.0 - 213.86.40.255 gb +213.86.41.0 - 213.86.41.7 be +213.86.41.8 - 213.86.41.15 nl +213.86.41.16 - 213.86.41.255 be +213.86.42.0 - 213.86.55.127 gb 213.86.55.128 - 213.86.55.255 us -213.86.56.0 - 213.86.57.191 gb -213.86.57.192 - 213.86.57.207 it -213.86.57.208 - 213.86.82.31 gb -213.86.82.32 - 213.86.82.47 be -213.86.82.48 - 213.86.87.255 gb -213.86.88.0 - 213.86.88.255 ie -213.86.89.0 - 213.86.105.95 gb -213.86.105.96 - 213.86.105.103 be -213.86.105.104 - 213.86.117.191 gb -213.86.117.192 - 213.86.117.255 it -213.86.118.0 - 213.86.148.31 gb -213.86.148.32 - 213.86.148.47 fr -213.86.148.48 - 213.86.148.79 gb -213.86.148.80 - 213.86.148.95 de -213.86.148.96 - 213.86.148.111 gb -213.86.148.112 - 213.86.148.127 it -213.86.148.128 - 213.86.149.223 gb -213.86.149.224 - 213.86.149.255 es -213.86.150.0 - 213.86.156.31 gb -213.86.156.32 - 213.86.156.47 be -213.86.156.48 - 213.86.156.63 fr -213.86.156.64 - 213.86.168.31 gb -213.86.168.32 - 213.86.168.39 de -213.86.168.40 - 213.86.168.215 gb -213.86.168.216 - 213.86.168.239 fr -213.86.168.240 - 213.86.176.31 gb -213.86.176.32 - 213.86.176.47 it -213.86.176.48 - 213.86.176.63 es -213.86.176.64 - 213.86.177.255 gb -213.86.178.0 - 213.86.178.127 us -213.86.178.128 - 213.86.190.71 gb -213.86.190.72 - 213.86.190.87 fr -213.86.190.88 - 213.86.190.175 gb -213.86.190.176 - 213.86.190.183 us -213.86.190.184 - 213.86.211.63 gb -213.86.211.64 - 213.86.211.95 de -213.86.211.96 - 213.86.211.127 nl -213.86.211.128 - 213.86.222.207 gb -213.86.222.208 - 213.86.222.223 ch -213.86.222.224 - 213.86.226.191 gb -213.86.226.192 - 213.86.226.255 ie -213.86.227.0 - 213.86.239.87 gb -213.86.239.88 - 213.86.239.95 ch -213.86.239.96 - 213.86.250.95 gb -213.86.250.96 - 213.86.250.103 de -213.86.250.104 - 213.86.250.119 gb -213.86.250.120 - 213.86.250.127 fr -213.86.250.128 - 213.86.250.167 gb -213.86.250.168 - 213.86.250.175 us -213.86.250.176 - 213.86.250.207 gb -213.86.250.208 - 213.86.250.215 fr -213.86.250.216 - 213.86.251.31 gb -213.86.251.32 - 213.86.251.39 us -213.86.251.40 - 213.86.251.47 gb -213.86.251.48 - 213.86.251.55 us -213.86.251.56 - 213.86.251.175 gb -213.86.251.176 - 213.86.251.183 ie -213.86.251.184 - 213.86.251.207 gb -213.86.251.208 - 213.86.251.215 de -213.86.251.216 - 213.86.251.223 gb -213.86.251.224 - 213.86.251.255 us -213.86.252.0 - 213.86.254.7 gb -213.86.254.8 - 213.86.254.15 de -213.86.254.16 - 213.86.255.255 gb +213.86.56.0 - 213.86.241.31 gb +213.86.241.32 - 213.86.241.79 at +213.86.241.80 - 213.86.255.255 gb 213.87.0.0 - 213.88.127.255 ru -213.88.128.0 - 213.88.184.255 se -213.88.185.0 - 213.88.185.255 no -213.88.186.0 - 213.88.186.255 se -213.88.187.0 - 213.88.187.15 no -213.88.187.16 - 213.88.187.255 se -213.88.188.0 - 213.88.188.255 no -213.88.189.0 - 213.88.189.255 se -213.88.190.0 - 213.88.191.255 no -213.88.192.0 - 213.89.255.255 se -213.90.0.0 - 213.90.71.255 at -213.90.72.0 - 213.90.72.3 us -213.90.72.4 - 213.90.127.255 at -213.90.128.0 - 213.90.139.15 fr -213.90.139.16 - 213.90.139.23 nl -213.90.139.24 - 213.90.139.31 fr -213.90.139.32 - 213.90.139.39 nl -213.90.139.40 - 213.90.140.7 fr -213.90.140.8 - 213.90.140.15 ch -213.90.140.16 - 213.90.140.31 fr -213.90.140.32 - 213.90.140.39 gb -213.90.140.40 - 213.90.140.55 fr -213.90.140.56 - 213.90.140.63 ch -213.90.140.64 - 213.90.140.71 fr -213.90.140.72 - 213.90.140.79 gb -213.90.140.80 - 213.90.140.103 fr -213.90.140.104 - 213.90.140.111 ch -213.90.140.112 - 213.90.140.159 fr -213.90.140.160 - 213.90.140.167 gb -213.90.140.168 - 213.90.140.175 ch -213.90.140.176 - 213.90.140.191 fr -213.90.140.192 - 213.90.140.199 gb -213.90.140.200 - 213.90.145.255 fr -213.90.146.0 - 213.90.146.159 nl -213.90.146.160 - 213.90.146.175 fr -213.90.146.176 - 213.90.147.47 nl -213.90.147.48 - 213.90.147.63 fr -213.90.147.64 - 213.90.147.111 nl -213.90.147.112 - 213.90.148.15 fr -213.90.148.16 - 213.90.148.127 nl -213.90.148.128 - 213.90.148.159 fr -213.90.148.160 - 213.90.148.175 nl -213.90.148.176 - 213.90.148.223 fr -213.90.148.224 - 213.90.148.239 nl -213.90.148.240 - 213.90.154.79 fr -213.90.154.80 - 213.90.154.95 be -213.90.154.96 - 213.90.156.79 fr -213.90.156.80 - 213.90.156.95 be -213.90.156.96 - 213.90.157.255 fr -213.90.158.0 - 213.90.158.15 gb -213.90.158.16 - 213.90.158.18 fr -213.90.158.19 - 213.90.158.31 gb -213.90.158.32 - 213.90.158.111 fr -213.90.158.112 - 213.90.158.127 gb -213.90.158.128 - 213.90.158.191 fr -213.90.158.192 - 213.90.158.192 gb -213.90.158.193 - 213.90.158.207 fr -213.90.158.208 - 213.90.158.223 de -213.90.158.224 - 213.90.159.31 fr -213.90.159.32 - 213.90.159.47 ch -213.90.159.48 - 213.90.159.63 fr -213.90.159.64 - 213.90.159.79 gb -213.90.159.80 - 213.90.159.95 de -213.90.159.96 - 213.90.159.143 gb -213.90.159.144 - 213.90.159.191 fr -213.90.159.192 - 213.90.159.223 gb -213.90.159.224 - 213.90.159.239 fr -213.90.159.240 - 213.90.159.255 gb -213.90.160.0 - 213.90.160.63 fr -213.90.160.64 - 213.90.160.79 gb -213.90.160.80 - 213.90.160.95 fr -213.90.160.96 - 213.90.160.111 gb -213.90.160.112 - 213.90.160.127 fr -213.90.160.128 - 213.90.160.143 gb -213.90.160.144 - 213.90.160.159 fr -213.90.160.160 - 213.90.160.175 it -213.90.160.176 - 213.90.160.191 de -213.90.160.192 - 213.90.160.207 fr -213.90.160.208 - 213.90.160.223 de -213.90.160.224 - 213.90.160.239 gb -213.90.160.240 - 213.90.162.15 fr -213.90.162.16 - 213.90.162.31 de -213.90.162.32 - 213.90.162.111 fr -213.90.162.112 - 213.90.162.127 be -213.90.162.128 - 213.90.162.143 fr -213.90.162.144 - 213.90.162.159 gb -213.90.162.160 - 213.90.163.31 fr -213.90.163.32 - 213.90.163.63 gb -213.90.163.64 - 213.90.163.79 de -213.90.163.80 - 213.90.163.127 fr -213.90.163.128 - 213.90.163.143 gb -213.90.163.144 - 213.90.163.239 fr -213.90.163.240 - 213.90.163.255 gb -213.90.164.0 - 213.90.164.15 fr -213.90.164.16 - 213.90.164.31 gb -213.90.164.32 - 213.90.164.239 fr -213.90.164.240 - 213.90.164.255 es -213.90.165.0 - 213.90.165.31 fr -213.90.165.32 - 213.90.165.43 it -213.90.165.44 - 213.90.165.47 fr -213.90.165.48 - 213.90.165.63 gb -213.90.165.64 - 213.90.165.79 fr -213.90.165.80 - 213.90.165.95 gb -213.90.165.96 - 213.90.165.111 fr -213.90.165.112 - 213.90.165.127 it -213.90.165.128 - 213.90.165.175 fr -213.90.165.176 - 213.90.165.223 de -213.90.165.224 - 213.90.165.239 se -213.90.165.240 - 213.90.165.255 gb -213.90.166.0 - 213.90.166.63 fr -213.90.166.64 - 213.90.166.79 gb -213.90.166.80 - 213.90.166.111 fr -213.90.166.112 - 213.90.166.127 gb -213.90.166.128 - 213.90.166.143 ie -213.90.166.144 - 213.90.166.159 de -213.90.166.160 - 213.90.166.207 fr -213.90.166.208 - 213.90.166.223 gb -213.90.166.224 - 213.90.166.239 it -213.90.166.240 - 213.90.166.255 gb -213.90.167.0 - 213.90.167.47 fr -213.90.167.48 - 213.90.167.79 gb -213.90.167.80 - 213.90.176.255 fr -213.90.177.0 - 213.90.177.95 pt -213.90.177.96 - 213.90.177.111 fr -213.90.177.112 - 213.90.177.159 pt -213.90.177.160 - 213.90.177.175 nl -213.90.177.176 - 213.90.177.191 fr -213.90.177.192 - 213.90.177.239 pt -213.90.177.240 - 213.90.178.15 fr -213.90.178.16 - 213.90.178.127 pt -213.90.178.128 - 213.90.178.143 fr -213.90.178.144 - 213.90.178.159 pt -213.90.178.160 - 213.90.178.191 fr -213.90.178.192 - 213.90.178.207 pt -213.90.178.208 - 213.90.179.159 fr -213.90.179.160 - 213.90.179.175 pt -213.90.179.176 - 213.90.179.191 nl -213.90.179.192 - 213.90.180.143 fr -213.90.180.144 - 213.90.180.159 pt -213.90.180.160 - 213.90.205.255 fr -213.90.206.0 - 213.90.206.7 nl -213.90.206.8 - 213.91.63.255 fr +213.88.128.0 - 213.88.187.7 se +213.88.187.8 - 213.88.187.15 no +213.88.187.16 - 213.89.255.255 se +213.90.0.0 - 213.90.127.255 at +213.90.128.0 - 213.91.63.255 fr 213.91.64.0 - 213.91.127.255 ba -213.91.128.0 - 213.91.163.255 bg -213.91.164.0 - 213.91.164.255 a2 -213.91.165.0 - 213.91.166.255 bg -213.91.167.0 - 213.91.167.255 a2 -213.91.168.0 - 213.91.255.255 bg -213.92.0.0 - 213.92.76.191 it -213.92.76.192 - 213.92.76.207 a2 -213.92.76.208 - 213.92.80.127 it -213.92.80.128 - 213.92.80.255 gr -213.92.81.0 - 213.92.93.63 it -213.92.93.64 - 213.92.93.79 us -213.92.93.80 - 213.92.98.63 it -213.92.98.64 - 213.92.98.79 us -213.92.98.80 - 213.92.113.239 it -213.92.113.240 - 213.92.113.255 de -213.92.114.0 - 213.92.121.255 it -213.92.122.0 - 213.92.122.255 us -213.92.123.0 - 213.92.127.255 it +213.91.128.0 - 213.91.255.255 bg +213.92.0.0 - 213.92.21.125 it +213.92.21.126 - 213.92.21.126 eu +213.92.21.127 - 213.92.79.255 it +213.92.80.0 - 213.92.80.255 eu +213.92.81.0 - 213.92.127.255 it 213.92.128.0 - 213.92.255.255 pl 213.93.0.0 - 213.93.255.255 nl 213.94.0.0 - 213.94.63.255 es @@ -146568,107 +112214,87 @@ 213.94.128.0 - 213.94.255.255 ie 213.95.0.0 - 213.95.255.255 de 213.96.0.0 - 213.99.255.255 es -213.100.0.0 - 213.101.127.255 se -213.101.128.0 - 213.101.129.255 lv -213.101.130.0 - 213.101.131.255 se +213.100.0.0 - 213.100.9.255 se +213.100.10.0 - 213.100.27.255 lv +213.100.28.0 - 213.100.47.255 se +213.100.48.0 - 213.100.63.255 lv +213.100.64.0 - 213.100.119.255 se +213.100.120.0 - 213.100.131.255 lv +213.100.132.0 - 213.100.135.255 se +213.100.136.0 - 213.100.137.255 ee +213.100.138.0 - 213.100.139.255 se +213.100.140.0 - 213.100.147.255 hr +213.100.148.0 - 213.100.195.255 se +213.100.196.0 - 213.100.196.255 nl +213.100.197.0 - 213.100.239.255 se +213.100.240.0 - 213.100.247.255 ee +213.100.248.0 - 213.100.254.255 se +213.100.255.0 - 213.100.255.255 nl +213.101.0.0 - 213.101.127.255 se +213.101.128.0 - 213.101.130.127 lv +213.101.130.128 - 213.101.131.255 se 213.101.132.0 - 213.101.133.255 ee 213.101.134.0 - 213.101.135.255 se 213.101.136.0 - 213.101.143.255 lt -213.101.144.0 - 213.101.144.127 hr -213.101.144.128 - 213.101.145.255 se -213.101.146.0 - 213.101.149.255 ru +213.101.144.0 - 213.101.146.127 se +213.101.146.128 - 213.101.146.255 at +213.101.147.0 - 213.101.149.255 se 213.101.150.0 - 213.101.151.255 nl -213.101.152.0 - 213.101.159.255 hr -213.101.160.0 - 213.101.163.255 se +213.101.152.0 - 213.101.155.255 se +213.101.156.0 - 213.101.159.255 hr +213.101.160.0 - 213.101.163.255 lv 213.101.164.0 - 213.101.167.255 ee -213.101.168.0 - 213.101.175.255 se -213.101.176.0 - 213.101.183.255 hr -213.101.184.0 - 213.101.187.255 ch -213.101.188.0 - 213.101.189.255 lv -213.101.190.0 - 213.101.191.255 hr -213.101.192.0 - 213.101.195.255 ee -213.101.196.0 - 213.101.197.255 se -213.101.198.0 - 213.101.198.255 ee -213.101.199.0 - 213.101.215.255 se -213.101.216.0 - 213.101.217.255 hr -213.101.218.0 - 213.101.219.127 se -213.101.219.128 - 213.101.220.255 hr -213.101.221.0 - 213.101.221.255 se -213.101.222.0 - 213.101.223.255 hr +213.101.168.0 - 213.101.183.255 hr +213.101.184.0 - 213.101.191.255 lv +213.101.192.0 - 213.101.199.255 ee +213.101.200.0 - 213.101.211.255 se +213.101.212.0 - 213.101.217.255 lv +213.101.218.0 - 213.101.223.255 se 213.101.224.0 - 213.101.255.255 de -213.102.0.0 - 213.102.0.255 lt -213.102.1.0 - 213.102.2.255 lv -213.102.3.0 - 213.102.7.255 lt -213.102.8.0 - 213.102.11.255 no -213.102.12.0 - 213.102.13.255 se -213.102.14.0 - 213.102.19.255 lt +213.102.0.0 - 213.102.0.255 se +213.102.1.0 - 213.102.1.255 lv +213.102.2.0 - 213.102.2.255 se +213.102.3.0 - 213.102.5.255 lt +213.102.6.0 - 213.102.7.255 se +213.102.8.0 - 213.102.13.255 lt +213.102.14.0 - 213.102.15.255 se +213.102.16.0 - 213.102.19.255 lt 213.102.20.0 - 213.102.22.255 lv -213.102.23.0 - 213.102.23.255 lt -213.102.24.0 - 213.102.29.255 se -213.102.30.0 - 213.102.31.255 lv -213.102.32.0 - 213.102.39.255 se -213.102.40.0 - 213.102.47.255 ch -213.102.48.0 - 213.102.63.255 nl +213.102.23.0 - 213.102.23.255 se +213.102.24.0 - 213.102.31.255 lv +213.102.32.0 - 213.102.39.255 ee +213.102.40.0 - 213.102.47.255 se +213.102.48.0 - 213.102.51.255 ee +213.102.52.0 - 213.102.55.255 lt +213.102.56.0 - 213.102.63.255 lv 213.102.64.0 - 213.102.87.255 ee -213.102.88.0 - 213.102.111.255 de -213.102.112.0 - 213.102.132.255 at -213.102.133.0 - 213.102.135.255 ee -213.102.136.0 - 213.102.143.255 se +213.102.88.0 - 213.102.91.255 lv +213.102.92.0 - 213.102.103.255 de +213.102.104.0 - 213.102.104.255 lv +213.102.105.0 - 213.102.105.255 se +213.102.106.0 - 213.102.111.255 de +213.102.112.0 - 213.102.131.255 at +213.102.132.0 - 213.102.135.255 se +213.102.136.0 - 213.102.143.255 ee 213.102.144.0 - 213.102.159.255 lv -213.102.160.0 - 213.102.191.255 se -213.102.192.0 - 213.103.127.255 ru -213.103.128.0 - 213.103.159.255 se -213.103.160.0 - 213.103.165.255 hr -213.103.166.0 - 213.103.167.255 se +213.102.160.0 - 213.102.175.255 se +213.102.176.0 - 213.103.159.255 nl +213.103.160.0 - 213.103.161.255 se +213.103.162.0 - 213.103.163.255 hr +213.103.164.0 - 213.103.165.255 se +213.103.166.0 - 213.103.167.255 ee 213.103.168.0 - 213.103.183.255 lt 213.103.184.0 - 213.103.223.255 se 213.103.224.0 - 213.103.255.255 lt -213.104.0.0 - 213.105.176.31 gb -213.105.176.32 - 213.105.176.47 ie -213.105.176.48 - 213.105.176.159 gb -213.105.176.160 - 213.105.176.167 ie -213.105.176.168 - 213.105.176.175 gb -213.105.176.176 - 213.105.176.183 ie -213.105.176.184 - 213.105.177.95 gb -213.105.177.96 - 213.105.177.127 ie -213.105.177.128 - 213.105.177.159 gb -213.105.177.160 - 213.105.178.31 ie -213.105.178.32 - 213.105.178.95 gb -213.105.178.96 - 213.105.178.103 ie -213.105.178.104 - 213.105.178.111 gb -213.105.178.112 - 213.105.178.127 ie -213.105.178.128 - 213.105.178.143 gb -213.105.178.144 - 213.105.178.151 ie -213.105.178.152 - 213.105.178.239 gb -213.105.178.240 - 213.105.178.255 ie -213.105.179.0 - 213.105.180.127 gb -213.105.180.128 - 213.105.180.191 ie -213.105.180.192 - 213.105.181.15 gb -213.105.181.16 - 213.105.181.23 ie -213.105.181.24 - 213.105.181.31 gb -213.105.181.32 - 213.105.181.47 ie -213.105.181.48 - 213.105.181.63 gb -213.105.181.64 - 213.105.181.79 ie -213.105.181.80 - 213.105.181.95 gb -213.105.181.96 - 213.105.181.111 ie -213.105.181.112 - 213.105.181.183 gb -213.105.181.184 - 213.105.181.255 ie -213.105.182.0 - 213.105.182.175 gb -213.105.182.176 - 213.105.182.183 ie -213.105.182.184 - 213.105.182.243 gb -213.105.182.244 - 213.105.182.247 ie -213.105.182.248 - 213.105.183.207 gb -213.105.183.208 - 213.105.183.215 ie -213.105.183.216 - 213.107.255.255 gb +213.104.0.0 - 213.107.255.255 gb 213.108.0.0 - 213.108.7.255 ru 213.108.8.0 - 213.108.15.255 pl 213.108.16.0 - 213.108.23.255 ru -213.108.24.0 - 213.108.29.255 nl -213.108.30.0 - 213.108.30.255 de -213.108.31.0 - 213.108.31.255 gb +213.108.24.0 - 213.108.27.255 nl +213.108.28.0 - 213.108.28.255 pl +213.108.29.0 - 213.108.31.255 nl 213.108.32.0 - 213.108.39.255 ru 213.108.40.0 - 213.108.47.255 ua -213.108.48.0 - 213.108.55.255 kz 213.108.56.0 - 213.108.63.255 pl 213.108.64.0 - 213.108.71.255 fr 213.108.72.0 - 213.108.79.255 ua @@ -146686,7 +112312,6 @@ 213.108.184.0 - 213.108.223.255 ru 213.108.224.0 - 213.108.231.255 pl 213.108.232.0 - 213.108.239.255 fr -213.108.240.0 - 213.108.247.255 bg 213.108.248.0 - 213.109.31.255 ru 213.109.32.0 - 213.109.47.255 pl 213.109.48.0 - 213.109.79.255 ru @@ -146695,9 +112320,9 @@ 213.109.112.0 - 213.109.127.255 nl 213.109.128.0 - 213.109.143.255 ua 213.109.144.0 - 213.109.159.255 ru -213.109.160.0 - 213.109.191.255 ro 213.109.192.0 - 213.109.207.255 ru -213.109.208.0 - 213.109.239.255 ua +213.109.208.0 - 213.109.223.255 ro +213.109.224.0 - 213.109.239.255 ua 213.109.240.0 - 213.109.255.255 ir 213.110.0.0 - 213.110.63.255 ru 213.110.64.0 - 213.110.95.255 lv @@ -146706,49 +112331,31 @@ 213.111.0.0 - 213.111.63.255 fr 213.111.64.0 - 213.111.255.255 ua 213.112.0.0 - 213.115.255.255 se -213.116.0.0 - 213.116.4.159 eu -213.116.4.160 - 213.116.4.255 ie -213.116.5.0 - 213.116.5.127 eu -213.116.5.128 - 213.116.5.255 nl -213.116.6.0 - 213.116.6.63 se -213.116.6.64 - 213.116.6.255 eu -213.116.7.0 - 213.116.7.63 se -213.116.7.64 - 213.116.7.255 eu -213.116.8.0 - 213.116.8.63 se -213.116.8.64 - 213.116.18.255 eu -213.116.19.0 - 213.116.19.255 nl -213.116.20.0 - 213.116.30.255 eu -213.116.31.0 - 213.116.36.255 at -213.116.37.0 - 213.116.38.255 eu -213.116.39.0 - 213.116.39.127 at -213.116.39.128 - 213.116.39.255 eu +213.116.0.0 - 213.116.31.255 eu +213.116.32.0 - 213.116.35.255 at +213.116.36.0 - 213.116.39.255 eu 213.116.40.0 - 213.116.47.255 ie 213.116.48.0 - 213.116.95.255 eu -213.116.96.0 - 213.116.185.255 nl -213.116.186.0 - 213.116.187.255 eu -213.116.188.0 - 213.116.188.255 ie -213.116.189.0 - 213.116.189.255 eu -213.116.190.0 - 213.116.191.255 gb -213.116.192.0 - 213.116.198.255 nl -213.116.199.0 - 213.116.213.255 eu -213.116.214.0 - 213.116.255.255 se +213.116.96.0 - 213.116.183.255 nl +213.116.184.0 - 213.116.191.255 eu +213.116.192.0 - 213.116.195.255 nl +213.116.196.0 - 213.116.215.255 eu +213.116.216.0 - 213.116.255.255 se 213.117.0.0 - 213.117.63.255 nl 213.117.64.0 - 213.117.95.255 eu 213.117.96.0 - 213.117.103.255 nl 213.117.104.0 - 213.117.159.255 eu -213.117.160.0 - 213.117.173.255 fr -213.117.174.0 - 213.117.181.255 eu -213.117.182.0 - 213.117.182.127 fr -213.117.182.128 - 213.117.251.127 eu -213.117.251.128 - 213.117.251.223 nl -213.117.251.224 - 213.117.255.255 eu +213.117.160.0 - 213.117.171.255 fr +213.117.172.0 - 213.117.255.255 eu 213.118.0.0 - 213.119.255.255 be 213.120.0.0 - 213.123.255.255 gb 213.124.0.0 - 213.127.255.255 nl 213.128.0.0 - 213.128.31.255 ru 213.128.32.0 - 213.128.63.255 fr 213.128.64.0 - 213.128.95.255 tr -213.128.96.0 - 213.128.159.255 de +213.128.96.0 - 213.128.122.1 de +213.128.122.2 - 213.128.122.2 eu +213.128.122.3 - 213.128.159.255 de 213.128.160.0 - 213.128.191.255 no 213.128.192.0 - 213.128.223.255 ru 213.128.224.0 - 213.128.255.255 gb @@ -146761,38 +112368,22 @@ 213.129.192.0 - 213.129.223.255 nl 213.129.224.0 - 213.129.255.255 at 213.130.0.0 - 213.130.31.255 ua -213.130.32.0 - 213.130.36.175 gb -213.130.36.176 - 213.130.36.191 ae -213.130.36.192 - 213.130.39.191 gb -213.130.39.192 - 213.130.39.223 de -213.130.39.224 - 213.130.39.255 gb -213.130.40.0 - 213.130.40.183 es -213.130.40.184 - 213.130.41.255 gb +213.130.32.0 - 213.130.41.255 gb 213.130.42.0 - 213.130.42.31 de -213.130.42.32 - 213.130.42.63 gb -213.130.42.64 - 213.130.43.255 de -213.130.44.0 - 213.130.46.167 gb -213.130.46.168 - 213.130.46.175 de -213.130.46.176 - 213.130.56.31 gb -213.130.56.32 - 213.130.56.63 es -213.130.56.64 - 213.130.57.255 gb -213.130.58.0 - 213.130.58.255 de -213.130.59.0 - 213.130.63.255 gb +213.130.42.32 - 213.130.63.255 gb 213.130.64.0 - 213.130.95.255 bg 213.130.96.0 - 213.130.127.255 qa 213.130.128.0 - 213.130.159.255 gb 213.130.160.0 - 213.130.191.255 nl -213.130.192.0 - 213.130.192.255 se -213.130.193.0 - 213.130.193.255 ee -213.130.194.0 - 213.130.195.255 no +213.130.192.0 - 213.130.192.63 ee +213.130.192.64 - 213.130.192.95 se +213.130.192.96 - 213.130.192.127 ee +213.130.192.128 - 213.130.195.255 se 213.130.196.0 - 213.130.199.255 ee -213.130.200.0 - 213.130.209.255 lt -213.130.210.0 - 213.130.211.255 no +213.130.200.0 - 213.130.211.255 lt 213.130.212.0 - 213.130.215.255 ee 213.130.216.0 - 213.130.223.255 lt -213.130.224.0 - 213.130.229.71 fi -213.130.229.72 - 213.130.229.79 ax -213.130.229.80 - 213.130.255.255 fi +213.130.224.0 - 213.130.255.255 fi 213.131.0.0 - 213.131.31.255 ru 213.131.32.0 - 213.131.63.255 ge 213.131.64.0 - 213.131.95.255 eg @@ -146801,158 +112392,39 @@ 213.131.160.0 - 213.131.191.255 gb 213.131.192.0 - 213.131.229.79 de 213.131.229.80 - 213.131.229.83 fr -213.131.229.84 - 213.131.233.255 de -213.131.234.0 - 213.131.234.15 nl -213.131.234.16 - 213.131.244.87 de -213.131.244.88 - 213.131.244.95 cy -213.131.244.96 - 213.131.253.135 de -213.131.253.136 - 213.131.253.143 bz -213.131.253.144 - 213.131.255.255 de +213.131.229.84 - 213.131.237.255 de +213.131.238.0 - 213.131.238.255 eu +213.131.239.0 - 213.131.255.255 de 213.132.0.0 - 213.132.31.255 dk 213.132.32.0 - 213.132.63.255 ae 213.132.64.0 - 213.132.95.255 ru -213.132.96.0 - 213.132.96.47 se -213.132.96.48 - 213.132.96.55 no -213.132.96.56 - 213.132.96.175 se -213.132.96.176 - 213.132.96.191 dk -213.132.96.192 - 213.132.98.15 se -213.132.98.16 - 213.132.98.31 no -213.132.98.32 - 213.132.98.239 se -213.132.98.240 - 213.132.98.247 nl -213.132.98.248 - 213.132.109.55 se +213.132.96.0 - 213.132.109.55 se 213.132.109.56 - 213.132.109.63 fi -213.132.109.64 - 213.132.112.167 se -213.132.112.168 - 213.132.112.175 fi -213.132.112.176 - 213.132.115.191 se +213.132.109.64 - 213.132.115.191 se 213.132.115.192 - 213.132.115.255 fi 213.132.116.0 - 213.132.127.255 se 213.132.128.0 - 213.132.159.255 be -213.132.160.0 - 213.132.223.255 nl -213.132.224.0 - 213.132.255.255 kw +213.132.160.0 - 213.132.209.55 nl +213.132.209.56 - 213.132.209.63 fi +213.132.209.64 - 213.132.223.255 nl +213.132.224.0 - 213.132.237.255 kw +213.132.238.0 - 213.132.238.255 us +213.132.239.0 - 213.132.254.255 kw +213.132.255.0 - 213.132.255.255 a2 213.133.0.0 - 213.133.31.255 me 213.133.32.0 - 213.133.63.255 nl -213.133.64.0 - 213.133.95.255 gb +213.133.64.0 - 213.133.85.255 gb +213.133.86.0 - 213.133.87.255 cy +213.133.88.0 - 213.133.89.255 gb +213.133.90.0 - 213.133.90.255 cy +213.133.91.0 - 213.133.95.255 gb 213.133.96.0 - 213.133.127.255 de 213.133.128.0 - 213.133.159.255 gb 213.133.160.0 - 213.133.191.255 ua -213.133.192.0 - 213.133.195.33 je -213.133.195.34 - 213.133.195.34 gb -213.133.195.35 - 213.133.195.40 je -213.133.195.41 - 213.133.195.44 gb -213.133.195.45 - 213.133.195.55 je -213.133.195.56 - 213.133.195.126 gb -213.133.195.127 - 213.133.195.127 je -213.133.195.128 - 213.133.195.254 gb -213.133.195.255 - 213.133.195.255 je -213.133.196.0 - 213.133.196.87 gb -213.133.196.88 - 213.133.196.95 je -213.133.196.96 - 213.133.196.127 gb -213.133.196.128 - 213.133.196.223 je -213.133.196.224 - 213.133.196.254 gb -213.133.196.255 - 213.133.196.255 je -213.133.197.0 - 213.133.197.15 gb -213.133.197.16 - 213.133.197.31 je -213.133.197.32 - 213.133.197.47 gb -213.133.197.48 - 213.133.197.63 je -213.133.197.64 - 213.133.197.71 gb -213.133.197.72 - 213.133.197.79 je -213.133.197.80 - 213.133.197.143 gb -213.133.197.144 - 213.133.197.239 je -213.133.197.240 - 213.133.197.254 gb -213.133.197.255 - 213.133.198.7 je -213.133.198.8 - 213.133.198.23 gb -213.133.198.24 - 213.133.198.31 je -213.133.198.32 - 213.133.198.95 gb -213.133.198.96 - 213.133.198.111 je -213.133.198.112 - 213.133.198.135 gb -213.133.198.136 - 213.133.198.143 je -213.133.198.144 - 213.133.198.183 gb -213.133.198.184 - 213.133.198.191 je -213.133.198.192 - 213.133.198.203 gb -213.133.198.204 - 213.133.198.211 je -213.133.198.212 - 213.133.198.215 gb -213.133.198.216 - 213.133.198.223 je -213.133.198.224 - 213.133.198.251 gb -213.133.198.252 - 213.133.198.255 je -213.133.199.0 - 213.133.199.23 gb -213.133.199.24 - 213.133.199.31 je -213.133.199.32 - 213.133.199.63 gb -213.133.199.64 - 213.133.199.71 je -213.133.199.72 - 213.133.199.103 gb -213.133.199.104 - 213.133.199.143 je -213.133.199.144 - 213.133.199.167 gb -213.133.199.168 - 213.133.199.175 je -213.133.199.176 - 213.133.199.203 gb -213.133.199.204 - 213.133.199.207 je -213.133.199.208 - 213.133.199.211 gb -213.133.199.212 - 213.133.199.215 je -213.133.199.216 - 213.133.199.251 gb -213.133.199.252 - 213.133.201.31 je -213.133.201.32 - 213.133.201.127 gb -213.133.201.128 - 213.133.201.159 je -213.133.201.160 - 213.133.201.191 gb -213.133.201.192 - 213.133.201.239 je -213.133.201.240 - 213.133.201.247 gb -213.133.201.248 - 213.133.202.15 je -213.133.202.16 - 213.133.202.55 gb -213.133.202.56 - 213.133.202.71 je -213.133.202.72 - 213.133.202.87 gb -213.133.202.88 - 213.133.202.127 je -213.133.202.128 - 213.133.202.183 gb -213.133.202.184 - 213.133.203.7 je -213.133.203.8 - 213.133.203.15 gb -213.133.203.16 - 213.133.203.23 je -213.133.203.24 - 213.133.203.38 gb -213.133.203.39 - 213.133.203.39 je -213.133.203.40 - 213.133.203.63 gb -213.133.203.64 - 213.133.203.71 je -213.133.203.72 - 213.133.203.79 gb -213.133.203.80 - 213.133.203.87 je -213.133.203.88 - 213.133.203.119 gb -213.133.203.120 - 213.133.203.127 je -213.133.203.128 - 213.133.203.199 gb -213.133.203.200 - 213.133.203.255 je -213.133.204.0 - 213.133.204.255 gb -213.133.205.0 - 213.133.207.255 je -213.133.208.0 - 213.133.209.63 gb -213.133.209.64 - 213.133.209.71 je -213.133.209.72 - 213.133.209.255 gb -213.133.210.0 - 213.133.210.255 je -213.133.211.0 - 213.133.211.167 gb -213.133.211.168 - 213.133.211.175 je -213.133.211.176 - 213.133.211.255 gb -213.133.212.0 - 213.133.213.255 je -213.133.214.0 - 213.133.215.63 gb -213.133.215.64 - 213.133.215.71 je -213.133.215.72 - 213.133.215.175 gb -213.133.215.176 - 213.133.215.183 je -213.133.215.184 - 213.133.215.255 gb -213.133.216.0 - 213.133.216.255 je -213.133.217.0 - 213.133.217.87 gb -213.133.217.88 - 213.133.217.95 je -213.133.217.96 - 213.133.217.151 gb -213.133.217.152 - 213.133.217.159 je -213.133.217.160 - 213.133.217.255 gb -213.133.218.0 - 213.133.218.7 je -213.133.218.8 - 213.133.218.255 gb -213.133.219.0 - 213.133.219.127 je -213.133.219.128 - 213.133.220.254 gb -213.133.220.255 - 213.133.220.255 je -213.133.221.0 - 213.133.221.7 gb -213.133.221.8 - 213.133.221.15 je -213.133.221.16 - 213.133.221.23 gb -213.133.221.24 - 213.133.221.31 je -213.133.221.32 - 213.133.221.55 gb -213.133.221.56 - 213.133.221.63 je -213.133.221.64 - 213.133.222.79 gb -213.133.222.80 - 213.133.222.239 je -213.133.222.240 - 213.133.222.247 gb -213.133.222.248 - 213.133.223.255 je +213.133.192.0 - 213.133.223.255 je 213.133.224.0 - 213.133.255.255 ch 213.134.0.0 - 213.134.31.255 hu -213.134.32.0 - 213.134.47.255 es -213.134.48.0 - 213.134.55.255 pt -213.134.56.0 - 213.134.63.255 es +213.134.32.0 - 213.134.63.255 pt 213.134.64.0 - 213.134.95.255 it 213.134.96.0 - 213.134.127.255 se 213.134.128.0 - 213.134.191.255 pl @@ -146964,234 +112436,24 @@ 213.135.160.0 - 213.135.191.255 mk 213.135.192.0 - 213.135.223.255 de 213.135.224.0 - 213.135.255.255 lu -213.136.0.0 - 213.136.8.191 nl -213.136.8.192 - 213.136.8.255 de -213.136.9.0 - 213.136.28.63 nl -213.136.28.64 - 213.136.28.127 de -213.136.28.128 - 213.136.31.255 nl -213.136.32.0 - 213.136.63.255 se +213.136.0.0 - 213.136.31.255 nl +213.136.32.0 - 213.136.63.207 se +213.136.63.208 - 213.136.63.215 dk +213.136.63.216 - 213.136.63.255 se 213.136.64.0 - 213.136.95.255 de 213.136.96.0 - 213.136.127.255 ci 213.136.128.0 - 213.136.191.255 it 213.136.192.0 - 213.136.223.255 sa 213.136.224.0 - 213.136.255.255 pl -213.137.0.0 - 213.137.0.255 im -213.137.1.0 - 213.137.1.47 gb -213.137.1.48 - 213.137.1.51 im -213.137.1.52 - 213.137.1.183 gb -213.137.1.184 - 213.137.1.199 im -213.137.1.200 - 213.137.2.107 gb -213.137.2.108 - 213.137.2.111 im -213.137.2.112 - 213.137.2.183 gb -213.137.2.184 - 213.137.2.191 im -213.137.2.192 - 213.137.2.199 gb -213.137.2.200 - 213.137.2.207 im -213.137.2.208 - 213.137.3.255 gb -213.137.4.0 - 213.137.4.39 im -213.137.4.40 - 213.137.4.159 gb -213.137.4.160 - 213.137.4.167 im -213.137.4.168 - 213.137.4.207 gb -213.137.4.208 - 213.137.4.215 im -213.137.4.216 - 213.137.4.255 gb -213.137.5.0 - 213.137.5.7 im -213.137.5.8 - 213.137.5.95 gb -213.137.5.96 - 213.137.5.99 im -213.137.5.100 - 213.137.5.191 gb -213.137.5.192 - 213.137.5.207 im -213.137.5.208 - 213.137.5.215 gb -213.137.5.216 - 213.137.5.223 im -213.137.5.224 - 213.137.6.255 gb -213.137.7.0 - 213.137.7.39 im -213.137.7.40 - 213.137.7.71 gb -213.137.7.72 - 213.137.7.79 im -213.137.7.80 - 213.137.7.95 gb -213.137.7.96 - 213.137.7.103 im -213.137.7.104 - 213.137.7.247 gb -213.137.7.248 - 213.137.8.255 im -213.137.9.0 - 213.137.13.255 gb -213.137.14.0 - 213.137.18.255 im -213.137.19.0 - 213.137.19.95 gb -213.137.19.96 - 213.137.20.255 im -213.137.21.0 - 213.137.21.135 gb -213.137.21.136 - 213.137.21.143 im -213.137.21.144 - 213.137.21.163 gb -213.137.21.164 - 213.137.21.167 im -213.137.21.168 - 213.137.21.175 gb -213.137.21.176 - 213.137.21.183 im -213.137.21.184 - 213.137.21.215 gb -213.137.21.216 - 213.137.21.223 im -213.137.21.224 - 213.137.22.63 gb -213.137.22.64 - 213.137.23.111 im -213.137.23.112 - 213.137.23.143 gb -213.137.23.144 - 213.137.23.159 im -213.137.23.160 - 213.137.23.175 gb -213.137.23.176 - 213.137.23.207 im -213.137.23.208 - 213.137.23.223 gb -213.137.23.224 - 213.137.23.231 im -213.137.23.232 - 213.137.23.255 gb -213.137.24.0 - 213.137.24.47 im -213.137.24.48 - 213.137.24.67 gb -213.137.24.68 - 213.137.24.79 im -213.137.24.80 - 213.137.24.87 gb -213.137.24.88 - 213.137.24.111 im -213.137.24.112 - 213.137.24.183 gb -213.137.24.184 - 213.137.24.191 im -213.137.24.192 - 213.137.24.199 gb -213.137.24.200 - 213.137.24.207 im -213.137.24.208 - 213.137.24.215 gb -213.137.24.216 - 213.137.24.223 im -213.137.24.224 - 213.137.24.239 gb -213.137.24.240 - 213.137.27.255 im -213.137.28.0 - 213.137.29.63 gb -213.137.29.64 - 213.137.29.119 im -213.137.29.120 - 213.137.29.127 gb -213.137.29.128 - 213.137.29.255 im -213.137.30.0 - 213.137.31.255 gb -213.137.32.0 - 213.137.49.199 bg -213.137.49.200 - 213.137.49.207 gb -213.137.49.208 - 213.137.63.255 bg +213.137.0.0 - 213.137.31.255 im +213.137.32.0 - 213.137.63.255 it 213.137.64.0 - 213.137.95.255 us 213.137.96.0 - 213.137.127.255 rs -213.137.128.0 - 213.137.159.255 mc -213.137.160.0 - 213.137.160.31 eu -213.137.160.32 - 213.137.160.79 be -213.137.160.80 - 213.137.160.127 eu -213.137.160.128 - 213.137.160.191 be -213.137.160.192 - 213.137.161.79 eu -213.137.161.80 - 213.137.161.87 be -213.137.161.88 - 213.137.161.95 eu -213.137.161.96 - 213.137.161.111 be -213.137.161.112 - 213.137.161.127 eu -213.137.161.128 - 213.137.161.191 be -213.137.161.192 - 213.137.161.255 eu -213.137.162.0 - 213.137.162.107 be -213.137.162.108 - 213.137.162.111 eu -213.137.162.112 - 213.137.162.127 be -213.137.162.128 - 213.137.162.223 eu -213.137.162.224 - 213.137.162.239 be -213.137.162.240 - 213.137.163.63 eu -213.137.163.64 - 213.137.163.127 be -213.137.163.128 - 213.137.163.223 eu -213.137.163.224 - 213.137.163.231 be -213.137.163.232 - 213.137.163.255 eu -213.137.164.0 - 213.137.165.127 us -213.137.165.128 - 213.137.165.223 eu -213.137.165.224 - 213.137.165.255 us -213.137.166.0 - 213.137.167.23 eu -213.137.167.24 - 213.137.167.31 se -213.137.167.32 - 213.137.167.55 eu -213.137.167.56 - 213.137.167.71 se -213.137.167.72 - 213.137.167.143 eu -213.137.167.144 - 213.137.167.147 se -213.137.167.148 - 213.137.167.247 eu -213.137.167.248 - 213.137.167.255 se -213.137.168.0 - 213.137.168.255 us -213.137.169.0 - 213.137.169.127 eu -213.137.169.128 - 213.137.169.255 us -213.137.170.0 - 213.137.170.7 hu -213.137.170.8 - 213.137.170.31 eu -213.137.170.32 - 213.137.170.63 cz -213.137.170.64 - 213.137.170.71 eu -213.137.170.72 - 213.137.170.75 at -213.137.170.76 - 213.137.170.79 de -213.137.170.80 - 213.137.170.83 at -213.137.170.84 - 213.137.170.119 eu -213.137.170.120 - 213.137.170.127 hu -213.137.170.128 - 213.137.170.135 eu -213.137.170.136 - 213.137.170.143 hu -213.137.170.144 - 213.137.170.247 eu -213.137.170.248 - 213.137.170.255 at -213.137.171.0 - 213.137.171.63 eu -213.137.171.64 - 213.137.171.87 at -213.137.171.88 - 213.137.171.255 eu -213.137.172.0 - 213.137.172.63 fr -213.137.172.64 - 213.137.173.255 eu -213.137.174.0 - 213.137.174.255 fr -213.137.175.0 - 213.137.175.159 gb -213.137.175.160 - 213.137.175.191 fr -213.137.175.192 - 213.137.175.223 eu -213.137.175.224 - 213.137.175.231 fr -213.137.175.232 - 213.137.175.243 eu -213.137.175.244 - 213.137.175.247 fr -213.137.175.248 - 213.137.176.255 eu -213.137.177.0 - 213.137.177.71 fr -213.137.177.72 - 213.137.177.95 eu -213.137.177.96 - 213.137.177.103 fr -213.137.177.104 - 213.137.177.127 eu -213.137.177.128 - 213.137.177.131 fr -213.137.177.132 - 213.137.177.135 eu -213.137.177.136 - 213.137.177.143 fr -213.137.177.144 - 213.137.177.151 eu -213.137.177.152 - 213.137.177.223 fr -213.137.177.224 - 213.137.177.231 eu -213.137.177.232 - 213.137.178.23 fr -213.137.178.24 - 213.137.178.127 eu -213.137.178.128 - 213.137.178.255 fr -213.137.179.0 - 213.137.179.39 eu -213.137.179.40 - 213.137.179.43 ch -213.137.179.44 - 213.137.179.111 eu -213.137.179.112 - 213.137.179.127 fr -213.137.179.128 - 213.137.179.143 eu -213.137.179.144 - 213.137.179.159 fr -213.137.179.160 - 213.137.179.191 eu -213.137.179.192 - 213.137.179.223 fr -213.137.179.224 - 213.137.180.127 eu -213.137.180.128 - 213.137.180.167 ie -213.137.180.168 - 213.137.180.171 eu -213.137.180.172 - 213.137.180.175 ie -213.137.180.176 - 213.137.180.187 eu -213.137.180.188 - 213.137.180.199 ie -213.137.180.200 - 213.137.180.231 eu -213.137.180.232 - 213.137.181.63 ie -213.137.181.64 - 213.137.181.223 eu -213.137.181.224 - 213.137.181.239 ie -213.137.181.240 - 213.137.183.127 eu -213.137.183.128 - 213.137.183.143 ch -213.137.183.144 - 213.137.183.159 eu -213.137.183.160 - 213.137.183.163 ch -213.137.183.164 - 213.137.183.167 eu -213.137.183.168 - 213.137.183.171 ch -213.137.183.172 - 213.137.183.191 eu -213.137.183.192 - 213.137.183.255 ch -213.137.184.0 - 213.137.184.15 eu -213.137.184.16 - 213.137.184.23 de -213.137.184.24 - 213.137.184.255 eu -213.137.185.0 - 213.137.185.63 de -213.137.185.64 - 213.137.185.143 eu -213.137.185.144 - 213.137.185.151 de -213.137.185.152 - 213.137.185.175 eu -213.137.185.176 - 213.137.185.183 de -213.137.185.184 - 213.137.185.223 eu -213.137.185.224 - 213.137.185.255 de -213.137.186.0 - 213.137.186.31 eu -213.137.186.32 - 213.137.186.39 de -213.137.186.40 - 213.137.186.47 eu -213.137.186.48 - 213.137.186.55 de -213.137.186.56 - 213.137.186.71 eu -213.137.186.72 - 213.137.186.79 de -213.137.186.80 - 213.137.186.127 eu -213.137.186.128 - 213.137.186.159 de -213.137.186.160 - 213.137.187.95 eu -213.137.187.96 - 213.137.187.111 de -213.137.187.112 - 213.137.187.119 eu -213.137.187.120 - 213.137.187.127 de -213.137.187.128 - 213.137.187.199 eu -213.137.187.200 - 213.137.187.207 de -213.137.187.208 - 213.137.187.239 eu -213.137.187.240 - 213.137.187.255 de -213.137.188.0 - 213.137.188.31 eu -213.137.188.32 - 213.137.188.47 ch -213.137.188.48 - 213.137.188.255 eu -213.137.189.0 - 213.137.189.63 ch -213.137.189.64 - 213.137.189.71 eu -213.137.189.72 - 213.137.189.79 ch -213.137.189.80 - 213.137.189.95 eu -213.137.189.96 - 213.137.189.127 ch -213.137.189.128 - 213.137.191.95 eu -213.137.191.96 - 213.137.191.99 ch -213.137.191.100 - 213.137.191.119 eu -213.137.191.120 - 213.137.191.127 ch -213.137.191.128 - 213.137.191.255 eu +213.137.128.0 - 213.137.177.159 eu +213.137.177.160 - 213.137.177.191 fr +213.137.177.192 - 213.137.183.127 eu +213.137.183.128 - 213.137.183.135 ch +213.137.183.136 - 213.137.191.255 eu 213.137.192.0 - 213.137.223.255 de 213.137.224.0 - 213.137.255.255 ru 213.138.0.0 - 213.138.31.255 fr @@ -147199,14 +112461,10 @@ 213.138.64.0 - 213.138.95.255 ru 213.138.96.0 - 213.138.127.255 gb 213.138.128.0 - 213.138.159.255 fi -213.138.160.0 - 213.138.171.255 no -213.138.172.0 - 213.138.172.255 se -213.138.173.0 - 213.138.191.255 no +213.138.160.0 - 213.138.191.255 no 213.138.192.0 - 213.138.223.255 ru 213.138.224.0 - 213.138.255.255 pt -213.139.0.0 - 213.139.29.111 es -213.139.29.112 - 213.139.29.119 fr -213.139.29.120 - 213.139.31.255 es +213.139.0.0 - 213.139.31.255 es 213.139.32.0 - 213.139.63.255 jo 213.139.64.0 - 213.139.95.255 de 213.139.96.0 - 213.139.127.255 fr @@ -147221,9 +112479,7 @@ 213.140.96.0 - 213.140.127.255 ru 213.140.128.0 - 213.140.159.255 gr 213.140.160.0 - 213.140.191.255 fi -213.140.192.0 - 213.140.196.255 cy -213.140.197.0 - 213.140.197.255 gb -213.140.198.0 - 213.140.223.255 cy +213.140.192.0 - 213.140.223.255 cy 213.140.224.0 - 213.140.255.255 ru 213.141.0.0 - 213.141.31.255 pt 213.141.32.0 - 213.141.63.255 es @@ -147239,7 +112495,8 @@ 213.142.128.0 - 213.142.159.255 tr 213.142.160.0 - 213.142.191.255 ch 213.142.192.0 - 213.142.223.255 ru -213.142.224.0 - 213.142.251.255 si +213.142.224.0 - 213.142.247.255 si +213.142.248.0 - 213.142.251.255 za 213.142.252.0 - 213.142.255.255 lu 213.143.0.0 - 213.143.31.255 gb 213.143.32.0 - 213.143.63.255 es @@ -147253,37 +112510,10 @@ 213.144.32.0 - 213.144.63.255 es 213.144.64.0 - 213.144.95.255 it 213.144.96.0 - 213.144.127.255 tr -213.144.128.0 - 213.144.137.103 ch -213.144.137.104 - 213.144.137.111 de -213.144.137.112 - 213.144.152.111 ch -213.144.152.112 - 213.144.152.119 de -213.144.152.120 - 213.144.159.255 ch -213.144.160.0 - 213.144.160.127 br -213.144.160.128 - 213.144.174.255 it -213.144.175.0 - 213.144.175.127 dj -213.144.175.128 - 213.144.175.255 us -213.144.176.0 - 213.144.176.127 sg -213.144.176.128 - 213.144.176.255 fr -213.144.177.0 - 213.144.177.255 it -213.144.178.0 - 213.144.178.255 gr -213.144.179.0 - 213.144.181.255 it -213.144.182.0 - 213.144.182.63 ie -213.144.182.64 - 213.144.182.255 gr -213.144.183.0 - 213.144.183.255 fr -213.144.184.0 - 213.144.186.31 gr -213.144.186.32 - 213.144.186.39 it -213.144.186.40 - 213.144.186.87 gr -213.144.186.88 - 213.144.186.95 sg -213.144.186.96 - 213.144.186.111 lb -213.144.186.112 - 213.144.187.47 it -213.144.187.48 - 213.144.187.63 gr -213.144.187.64 - 213.144.187.95 it -213.144.187.96 - 213.144.187.191 fr -213.144.187.192 - 213.144.187.255 it -213.144.188.0 - 213.144.188.255 fr -213.144.189.0 - 213.144.189.255 it -213.144.190.0 - 213.144.190.255 sg -213.144.191.0 - 213.144.191.255 it +213.144.128.0 - 213.144.159.255 ch +213.144.160.0 - 213.144.185.255 it +213.144.186.0 - 213.144.186.255 gr +213.144.187.0 - 213.144.191.255 it 213.144.192.0 - 213.144.223.255 fr 213.144.224.0 - 213.144.255.255 nl 213.145.0.0 - 213.145.63.255 ru @@ -147296,28 +112526,12 @@ 213.146.0.0 - 213.146.31.255 ch 213.146.32.0 - 213.146.63.255 pl 213.146.64.0 - 213.146.95.255 se -213.146.96.0 - 213.146.103.95 de -213.146.103.96 - 213.146.103.103 at -213.146.103.104 - 213.146.127.255 de -213.146.128.0 - 213.146.163.255 gb -213.146.164.0 - 213.146.164.31 ie -213.146.164.32 - 213.146.164.191 gb -213.146.164.192 - 213.146.164.223 ie -213.146.164.224 - 213.146.164.239 gb -213.146.164.240 - 213.146.165.255 ie -213.146.166.0 - 213.146.168.239 gb -213.146.168.240 - 213.146.168.255 ie -213.146.169.0 - 213.146.169.255 gb -213.146.170.0 - 213.146.170.255 de -213.146.171.0 - 213.146.175.255 gb +213.146.96.0 - 213.146.127.255 de +213.146.128.0 - 213.146.164.255 gb +213.146.165.0 - 213.146.165.255 ie +213.146.166.0 - 213.146.175.255 gb 213.146.176.0 - 213.146.179.255 de -213.146.180.0 - 213.146.183.159 gb -213.146.183.160 - 213.146.183.191 ie -213.146.183.192 - 213.146.183.255 gb -213.146.184.0 - 213.146.184.255 de -213.146.185.0 - 213.146.187.255 gb -213.146.188.0 - 213.146.189.255 ie -213.146.190.0 - 213.146.191.255 gb +213.146.180.0 - 213.146.191.255 gb 213.146.192.0 - 213.146.223.255 pt 213.146.224.0 - 213.147.31.255 de 213.147.32.0 - 213.147.63.255 ru @@ -147330,11 +112544,7 @@ 213.148.0.0 - 213.148.31.255 ru 213.148.32.0 - 213.148.63.255 gb 213.148.64.0 - 213.148.95.255 tr -213.148.96.0 - 213.148.146.31 de -213.148.146.32 - 213.148.146.35 a2 -213.148.146.36 - 213.148.146.155 de -213.148.146.156 - 213.148.146.159 a2 -213.148.146.160 - 213.148.159.255 de +213.148.96.0 - 213.148.159.255 de 213.148.160.0 - 213.148.191.255 ru 213.148.192.0 - 213.148.223.255 es 213.148.224.0 - 213.148.255.255 nl @@ -147343,27 +112553,10 @@ 213.149.64.0 - 213.149.95.255 de 213.149.96.0 - 213.149.100.255 me 213.149.101.0 - 213.149.101.255 al -213.149.102.0 - 213.149.102.31 me -213.149.102.32 - 213.149.102.39 rs -213.149.102.40 - 213.149.102.47 me -213.149.102.48 - 213.149.102.63 rs -213.149.102.64 - 213.149.102.159 me +213.149.102.0 - 213.149.102.159 me 213.149.102.160 - 213.149.102.191 rs -213.149.102.192 - 213.149.113.239 me -213.149.113.240 - 213.149.113.255 al -213.149.114.0 - 213.149.118.255 me -213.149.119.0 - 213.149.119.255 rs -213.149.120.0 - 213.149.127.255 me -213.149.128.0 - 213.149.131.255 bg -213.149.132.0 - 213.149.133.255 mk -213.149.134.0 - 213.149.135.255 bg -213.149.136.0 - 213.149.136.255 mk -213.149.137.0 - 213.149.149.255 bg -213.149.150.0 - 213.149.152.255 mk -213.149.153.0 - 213.149.155.255 bg -213.149.156.0 - 213.149.156.255 mk -213.149.157.0 - 213.149.157.255 bg -213.149.158.0 - 213.149.159.255 mk +213.149.102.192 - 213.149.127.255 me +213.149.128.0 - 213.149.159.255 bg 213.149.160.0 - 213.149.191.255 cy 213.149.192.0 - 213.149.223.255 it 213.149.224.0 - 213.149.255.255 es @@ -147373,13 +112566,14 @@ 213.150.96.0 - 213.150.127.255 ke 213.150.128.0 - 213.150.159.255 se 213.150.160.0 - 213.150.191.255 tn -213.150.192.0 - 213.150.223.255 ci +213.150.192.0 - 213.150.199.255 cv +213.150.200.0 - 213.150.200.255 za +213.150.201.0 - 213.150.207.255 ci +213.150.208.0 - 213.150.223.255 za 213.150.224.0 - 213.150.255.255 at -213.151.0.0 - 213.151.31.255 ua +213.151.0.0 - 213.151.31.255 ru 213.151.32.0 - 213.151.63.255 il -213.151.64.0 - 213.151.81.211 cz -213.151.81.212 - 213.151.81.215 pl -213.151.81.216 - 213.151.95.255 cz +213.151.64.0 - 213.151.95.255 cz 213.151.96.0 - 213.151.127.255 es 213.151.128.0 - 213.151.159.255 no 213.151.160.0 - 213.151.191.255 fr @@ -147390,9 +112584,7 @@ 213.152.96.0 - 213.152.127.255 de 213.152.128.0 - 213.152.159.255 ru 213.152.160.0 - 213.152.191.255 nl -213.152.192.0 - 213.152.206.255 it -213.152.207.0 - 213.152.207.31 sm -213.152.207.32 - 213.152.223.255 it +213.152.192.0 - 213.152.223.255 it 213.152.224.0 - 213.152.255.255 gb 213.153.0.0 - 213.153.31.255 no 213.153.32.0 - 213.153.63.255 at @@ -147406,281 +112598,49 @@ 213.154.160.0 - 213.154.191.255 ru 213.154.192.0 - 213.154.223.255 ua 213.154.224.0 - 213.154.255.255 nl -213.155.0.0 - 213.155.0.151 ua -213.155.0.152 - 213.155.0.159 na -213.155.0.160 - 213.155.0.167 ua -213.155.0.168 - 213.155.0.175 na -213.155.0.176 - 213.155.0.215 ua -213.155.0.216 - 213.155.0.231 na -213.155.0.232 - 213.155.0.247 ua -213.155.0.248 - 213.155.0.255 na -213.155.1.0 - 213.155.1.127 ua -213.155.1.128 - 213.155.1.143 na -213.155.1.144 - 213.155.1.151 ua -213.155.1.152 - 213.155.1.159 na -213.155.1.160 - 213.155.2.3 ua -213.155.2.4 - 213.155.2.7 na -213.155.2.8 - 213.155.2.47 ua -213.155.2.48 - 213.155.2.191 na -213.155.2.192 - 213.155.2.231 ua -213.155.2.232 - 213.155.2.239 na -213.155.2.240 - 213.155.2.247 ua -213.155.2.248 - 213.155.2.255 na -213.155.3.0 - 213.155.3.3 ua -213.155.3.4 - 213.155.3.7 na -213.155.3.8 - 213.155.3.167 ua -213.155.3.168 - 213.155.3.175 na -213.155.3.176 - 213.155.3.199 ua -213.155.3.200 - 213.155.3.207 ru -213.155.3.208 - 213.155.3.247 ua -213.155.3.248 - 213.155.3.251 na -213.155.3.252 - 213.155.4.79 ua -213.155.4.80 - 213.155.4.87 na -213.155.4.88 - 213.155.4.183 ua -213.155.4.184 - 213.155.4.207 na -213.155.4.208 - 213.155.5.95 ua -213.155.5.96 - 213.155.5.103 na -213.155.5.104 - 213.155.5.127 ua -213.155.5.128 - 213.155.5.143 na -213.155.5.144 - 213.155.5.151 ua -213.155.5.152 - 213.155.5.159 na -213.155.5.160 - 213.155.5.207 ua -213.155.5.208 - 213.155.5.215 na -213.155.5.216 - 213.155.5.223 ua -213.155.5.224 - 213.155.5.239 na -213.155.5.240 - 213.155.5.247 ua -213.155.5.248 - 213.155.5.255 na -213.155.6.0 - 213.155.6.71 ua -213.155.6.72 - 213.155.6.87 na -213.155.6.88 - 213.155.6.119 ua -213.155.6.120 - 213.155.6.143 na -213.155.6.144 - 213.155.6.151 ua -213.155.6.152 - 213.155.6.167 na -213.155.6.168 - 213.155.6.183 ua -213.155.6.184 - 213.155.6.191 na -213.155.6.192 - 213.155.6.239 ua -213.155.6.240 - 213.155.6.255 na -213.155.7.0 - 213.155.7.3 ua -213.155.7.4 - 213.155.7.7 na -213.155.7.8 - 213.155.7.23 ua -213.155.7.24 - 213.155.7.31 na -213.155.7.32 - 213.155.7.47 ua -213.155.7.48 - 213.155.7.63 na -213.155.7.64 - 213.155.7.79 ua -213.155.7.80 - 213.155.7.87 na -213.155.7.88 - 213.155.7.111 ua -213.155.7.112 - 213.155.7.119 na -213.155.7.120 - 213.155.7.135 ua -213.155.7.136 - 213.155.7.143 na -213.155.7.144 - 213.155.7.151 ua -213.155.7.152 - 213.155.7.159 na -213.155.7.160 - 213.155.7.191 ua -213.155.7.192 - 213.155.7.231 na -213.155.7.232 - 213.155.7.247 ua -213.155.7.248 - 213.155.7.255 na -213.155.8.0 - 213.155.8.79 ua -213.155.8.80 - 213.155.8.87 na -213.155.8.88 - 213.155.9.127 ua -213.155.9.128 - 213.155.9.143 na -213.155.9.144 - 213.155.10.103 ua -213.155.10.104 - 213.155.10.111 na -213.155.10.112 - 213.155.10.159 ua -213.155.10.160 - 213.155.10.167 na -213.155.10.168 - 213.155.10.191 ua -213.155.10.192 - 213.155.10.207 na -213.155.10.208 - 213.155.11.127 ua -213.155.11.128 - 213.155.11.128 na -213.155.11.129 - 213.155.11.136 ua -213.155.11.137 - 213.155.11.191 na -213.155.11.192 - 213.155.12.7 ua -213.155.12.8 - 213.155.12.15 na -213.155.12.16 - 213.155.12.71 ua -213.155.12.72 - 213.155.12.79 na -213.155.12.80 - 213.155.13.7 ua -213.155.13.8 - 213.155.13.15 na -213.155.13.16 - 213.155.13.63 ua -213.155.13.64 - 213.155.13.127 na -213.155.13.128 - 213.155.13.159 ua -213.155.13.160 - 213.155.13.167 na -213.155.13.168 - 213.155.13.191 ua -213.155.13.192 - 213.155.13.207 na -213.155.13.208 - 213.155.17.7 ua -213.155.17.8 - 213.155.17.15 na -213.155.17.16 - 213.155.17.63 ua -213.155.17.64 - 213.155.17.71 ru -213.155.17.72 - 213.155.17.167 ua -213.155.17.168 - 213.155.17.175 ru -213.155.17.176 - 213.155.18.3 ua -213.155.18.4 - 213.155.18.7 na -213.155.18.8 - 213.155.18.39 ua -213.155.18.40 - 213.155.18.47 na -213.155.18.48 - 213.155.18.63 ua -213.155.18.64 - 213.155.18.71 na -213.155.18.72 - 213.155.18.151 ua -213.155.18.152 - 213.155.18.167 na -213.155.18.168 - 213.155.18.175 ru -213.155.18.176 - 213.155.18.191 ua -213.155.18.192 - 213.155.18.215 na -213.155.18.216 - 213.155.18.231 ua -213.155.18.232 - 213.155.18.247 na -213.155.18.248 - 213.155.19.103 ua -213.155.19.104 - 213.155.19.120 na -213.155.19.121 - 213.155.19.127 ua -213.155.19.128 - 213.155.19.135 na -213.155.19.136 - 213.155.19.151 ua -213.155.19.152 - 213.155.19.159 na -213.155.19.160 - 213.155.19.167 ua -213.155.19.168 - 213.155.19.183 na -213.155.19.184 - 213.155.20.3 ua -213.155.20.4 - 213.155.20.7 na -213.155.20.8 - 213.155.20.111 ua -213.155.20.112 - 213.155.20.119 na -213.155.20.120 - 213.155.20.159 ua -213.155.20.160 - 213.155.20.167 aq -213.155.20.168 - 213.155.20.175 na -213.155.20.176 - 213.155.20.199 ua -213.155.20.200 - 213.155.20.207 na -213.155.20.208 - 213.155.20.247 ua -213.155.20.248 - 213.155.20.251 na -213.155.20.252 - 213.155.21.167 ua -213.155.21.168 - 213.155.21.175 na -213.155.21.176 - 213.155.21.239 ua -213.155.21.240 - 213.155.21.247 na -213.155.21.248 - 213.155.22.23 ua -213.155.22.24 - 213.155.22.31 be -213.155.22.32 - 213.155.22.167 ua -213.155.22.168 - 213.155.22.175 na -213.155.22.176 - 213.155.23.39 ua -213.155.23.40 - 213.155.23.47 na -213.155.23.48 - 213.155.24.15 ua -213.155.24.16 - 213.155.24.23 na -213.155.24.24 - 213.155.24.95 ua -213.155.24.96 - 213.155.24.103 na -213.155.24.104 - 213.155.24.127 ua -213.155.24.128 - 213.155.24.135 na -213.155.24.136 - 213.155.24.143 ua -213.155.24.144 - 213.155.24.151 na -213.155.24.152 - 213.155.25.223 ua -213.155.25.224 - 213.155.25.231 na -213.155.25.232 - 213.155.26.39 ua -213.155.26.40 - 213.155.26.55 na -213.155.26.56 - 213.155.26.71 ua -213.155.26.72 - 213.155.26.79 na -213.155.26.80 - 213.155.27.15 ua -213.155.27.16 - 213.155.27.23 na -213.155.27.24 - 213.155.27.119 ua -213.155.27.120 - 213.155.27.127 na -213.155.27.128 - 213.155.27.159 ua -213.155.27.160 - 213.155.27.191 na -213.155.27.192 - 213.155.28.199 ua -213.155.28.200 - 213.155.28.207 na -213.155.28.208 - 213.155.28.215 ua -213.155.28.216 - 213.155.28.223 na -213.155.28.224 - 213.155.29.15 ua -213.155.29.16 - 213.155.29.23 in -213.155.29.24 - 213.155.30.7 ua -213.155.30.8 - 213.155.30.15 na -213.155.30.16 - 213.155.30.167 ua -213.155.30.168 - 213.155.30.175 na -213.155.30.176 - 213.155.30.239 ua -213.155.30.240 - 213.155.30.247 ru -213.155.30.248 - 213.155.31.255 ua +213.155.0.0 - 213.155.31.255 ua 213.155.32.0 - 213.155.63.255 cz 213.155.64.0 - 213.155.95.255 de 213.155.96.0 - 213.155.127.255 tr -213.155.128.0 - 213.155.138.255 eu -213.155.139.0 - 213.155.139.255 gb -213.155.140.0 - 213.155.141.255 eu -213.155.142.0 - 213.155.142.255 gb -213.155.143.0 - 213.155.143.255 nl -213.155.144.0 - 213.155.146.255 eu -213.155.147.0 - 213.155.149.255 de -213.155.150.0 - 213.155.150.15 fr -213.155.150.16 - 213.155.150.31 eu -213.155.150.32 - 213.155.150.63 fr -213.155.150.64 - 213.155.150.127 eu +213.155.128.0 - 213.155.139.255 eu +213.155.140.0 - 213.155.140.255 gb +213.155.141.0 - 213.155.147.255 eu +213.155.148.0 - 213.155.149.255 pl +213.155.150.0 - 213.155.150.127 eu 213.155.150.128 - 213.155.150.255 gb -213.155.151.0 - 213.155.151.31 eu -213.155.151.32 - 213.155.151.63 nl -213.155.151.64 - 213.155.151.231 eu -213.155.151.232 - 213.155.151.239 gb -213.155.151.240 - 213.155.152.63 eu -213.155.152.64 - 213.155.152.67 fr -213.155.152.68 - 213.155.152.71 gb -213.155.152.72 - 213.155.152.95 eu -213.155.152.96 - 213.155.152.99 de -213.155.152.100 - 213.155.152.103 fr -213.155.152.104 - 213.155.152.111 gb -213.155.152.112 - 213.155.153.31 eu -213.155.153.32 - 213.155.153.47 gb -213.155.153.48 - 213.155.153.63 eu +213.155.151.0 - 213.155.151.255 ie +213.155.152.0 - 213.155.152.127 eu +213.155.152.128 - 213.155.152.255 pl +213.155.153.0 - 213.155.153.63 eu 213.155.153.64 - 213.155.153.191 gb 213.155.153.192 - 213.155.153.255 eu 213.155.154.0 - 213.155.154.255 gb -213.155.155.0 - 213.155.155.63 de -213.155.155.64 - 213.155.155.159 eu -213.155.155.160 - 213.155.155.191 de +213.155.155.0 - 213.155.155.191 eu 213.155.155.192 - 213.155.155.223 gb -213.155.155.224 - 213.155.155.231 eu -213.155.155.232 - 213.155.155.235 nl -213.155.155.236 - 213.155.156.191 eu +213.155.155.224 - 213.155.156.191 eu 213.155.156.192 - 213.155.156.255 se 213.155.157.0 - 213.155.157.255 gb -213.155.158.0 - 213.155.158.127 se -213.155.158.128 - 213.155.158.183 eu -213.155.158.184 - 213.155.158.187 fr -213.155.158.188 - 213.155.159.7 eu -213.155.159.8 - 213.155.159.15 nl -213.155.159.16 - 213.155.159.31 gb -213.155.159.32 - 213.155.159.127 eu -213.155.159.128 - 213.155.159.159 gb -213.155.159.160 - 213.155.159.255 eu +213.155.158.0 - 213.155.158.127 cz +213.155.158.128 - 213.155.159.255 eu 213.155.160.0 - 213.155.191.255 pl 213.155.192.0 - 213.155.223.255 ru 213.155.224.0 - 213.155.255.255 cz -213.156.0.0 - 213.156.6.191 nl -213.156.6.192 - 213.156.6.207 it -213.156.6.208 - 213.156.31.255 nl +213.156.0.0 - 213.156.31.255 nl 213.156.32.0 - 213.156.63.255 it 213.156.64.0 - 213.156.95.255 ua 213.156.96.0 - 213.156.127.255 pl -213.156.128.0 - 213.156.140.255 ru -213.156.141.0 - 213.156.141.255 by -213.156.142.0 - 213.156.159.255 ru -213.156.160.0 - 213.156.160.255 gb -213.156.161.0 - 213.156.191.255 de +213.156.128.0 - 213.156.159.255 ru +213.156.160.0 - 213.156.191.255 de 213.156.192.0 - 213.156.223.255 ru 213.156.224.0 - 213.156.255.255 ch 213.157.0.0 - 213.157.31.255 de 213.157.32.0 - 213.157.63.255 kz -213.157.64.0 - 213.157.65.255 sg -213.157.66.0 - 213.157.71.255 fi -213.157.72.0 - 213.157.72.134 gb -213.157.72.135 - 213.157.72.135 fi -213.157.72.136 - 213.157.73.23 gb -213.157.73.24 - 213.157.73.31 fi -213.157.73.32 - 213.157.73.255 gb -213.157.74.0 - 213.157.74.63 us -213.157.74.64 - 213.157.74.71 fi -213.157.74.72 - 213.157.74.79 us -213.157.74.80 - 213.157.74.87 fi -213.157.74.88 - 213.157.74.95 us -213.157.74.96 - 213.157.74.103 fi -213.157.74.104 - 213.157.74.143 us -213.157.74.144 - 213.157.74.207 fi -213.157.74.208 - 213.157.74.223 us -213.157.74.224 - 213.157.78.255 fi -213.157.79.0 - 213.157.79.126 sg -213.157.79.127 - 213.157.79.127 fi -213.157.79.128 - 213.157.79.206 sg -213.157.79.207 - 213.157.79.231 fi -213.157.79.232 - 213.157.79.255 sg -213.157.80.0 - 213.157.95.255 fi +213.157.64.0 - 213.157.72.191 fi +213.157.72.192 - 213.157.72.255 gb +213.157.73.0 - 213.157.95.255 fi 213.157.96.0 - 213.157.127.255 hu 213.157.128.0 - 213.157.159.255 at -213.157.160.0 - 213.157.179.255 ro -213.157.180.0 - 213.157.181.255 hu -213.157.182.0 - 213.157.191.255 ro +213.157.160.0 - 213.157.191.255 ro 213.157.192.0 - 213.157.223.255 ge 213.157.224.0 - 213.157.255.255 si 213.158.0.0 - 213.158.31.255 ru @@ -147692,7 +112652,9 @@ 213.158.192.0 - 213.158.223.255 pl 213.158.224.0 - 213.158.255.255 no 213.159.0.0 - 213.159.31.255 nl -213.159.32.0 - 213.159.63.255 lt +213.159.32.0 - 213.159.62.127 lt +213.159.62.128 - 213.159.62.255 br +213.159.63.0 - 213.159.63.255 lt 213.159.64.0 - 213.159.127.255 ru 213.159.128.0 - 213.159.159.255 ie 213.159.160.0 - 213.159.191.255 se @@ -147700,44 +112662,20 @@ 213.159.224.0 - 213.159.255.255 ua 213.160.0.0 - 213.160.31.255 de 213.160.32.0 - 213.160.63.255 ch -213.160.64.0 - 213.160.90.103 de -213.160.90.104 - 213.160.90.111 tr -213.160.90.112 - 213.160.95.255 de +213.160.64.0 - 213.160.95.255 de 213.160.96.0 - 213.160.127.255 gb 213.160.128.0 - 213.160.159.255 ua 213.160.160.0 - 213.160.191.255 sk -213.160.192.0 - 213.160.192.31 at -213.160.192.32 - 213.160.192.39 nl -213.160.192.40 - 213.160.192.223 at -213.160.192.224 - 213.160.192.255 nl -213.160.193.0 - 213.160.193.103 at -213.160.193.104 - 213.160.193.111 nl -213.160.193.112 - 213.160.195.255 at -213.160.196.0 - 213.160.219.255 nl -213.160.220.0 - 213.160.222.255 at -213.160.223.0 - 213.160.223.15 nl -213.160.223.16 - 213.160.223.47 at -213.160.223.48 - 213.160.223.63 nl -213.160.223.64 - 213.160.223.255 at -213.160.224.0 - 213.160.225.255 no -213.160.226.0 - 213.160.226.255 nl -213.160.227.0 - 213.160.227.7 no -213.160.227.8 - 213.160.227.15 nl -213.160.227.16 - 213.160.227.63 no -213.160.227.64 - 213.160.227.79 nl -213.160.227.80 - 213.160.238.87 no -213.160.238.88 - 213.160.238.95 nl -213.160.238.96 - 213.160.242.173 no -213.160.242.174 - 213.160.242.175 nl -213.160.242.176 - 213.160.246.63 no -213.160.246.64 - 213.160.246.95 nl -213.160.246.96 - 213.160.246.191 no -213.160.246.192 - 213.160.246.255 nl -213.160.247.0 - 213.160.247.255 no +213.160.192.0 - 213.160.192.87 nl +213.160.192.88 - 213.160.192.95 at +213.160.192.96 - 213.160.223.255 nl +213.160.224.0 - 213.160.247.255 no 213.160.248.0 - 213.160.255.255 nl 213.161.0.0 - 213.161.31.255 si 213.161.32.0 - 213.161.63.255 fi -213.161.64.0 - 213.161.95.255 gb +213.161.64.0 - 213.161.84.255 gb +213.161.85.0 - 213.161.85.255 eu +213.161.86.0 - 213.161.95.255 gb 213.161.96.0 - 213.161.127.255 pl 213.161.128.0 - 213.161.159.255 tr 213.161.160.0 - 213.161.191.255 no @@ -147753,29 +112691,15 @@ 213.162.224.0 - 213.162.255.255 no 213.163.0.0 - 213.163.63.255 hu 213.163.64.0 - 213.163.95.255 nl -213.163.96.0 - 213.163.119.255 al -213.163.120.0 - 213.163.121.159 rs -213.163.121.160 - 213.163.121.255 al -213.163.122.0 - 213.163.123.127 rs -213.163.123.128 - 213.163.123.255 al -213.163.124.0 - 213.163.124.255 rs -213.163.125.0 - 213.163.127.255 al +213.163.96.0 - 213.163.127.255 al 213.163.128.0 - 213.163.159.255 se 213.163.160.0 - 213.163.191.255 fr 213.163.192.0 - 213.163.223.255 gb -213.163.224.0 - 213.164.3.39 at -213.164.3.40 - 213.164.3.47 nl -213.164.3.48 - 213.164.3.79 at -213.164.3.80 - 213.164.3.87 pt -213.164.3.88 - 213.164.3.127 at -213.164.3.128 - 213.164.3.135 pt -213.164.3.136 - 213.164.31.255 at +213.163.224.0 - 213.164.31.255 at 213.164.32.0 - 213.164.63.255 es 213.164.64.0 - 213.164.95.255 de 213.164.96.0 - 213.164.127.255 lt -213.164.128.0 - 213.164.146.231 de -213.164.146.232 - 213.164.146.239 nl -213.164.146.240 - 213.164.159.255 de +213.164.128.0 - 213.164.159.255 de 213.164.160.0 - 213.164.191.255 es 213.164.192.0 - 213.164.223.255 se 213.164.224.0 - 213.164.255.255 ro @@ -147784,14 +112708,7 @@ 213.165.64.0 - 213.165.127.255 de 213.165.128.0 - 213.165.159.255 gb 213.165.160.0 - 213.165.191.255 mt -213.165.192.0 - 213.165.206.255 ru -213.165.207.0 - 213.165.207.255 de -213.165.208.0 - 213.165.209.255 gb -213.165.210.0 - 213.165.211.255 ru -213.165.212.0 - 213.165.212.255 de -213.165.213.0 - 213.165.217.255 ru -213.165.218.0 - 213.165.219.255 gb -213.165.220.0 - 213.165.223.255 ru +213.165.192.0 - 213.165.223.255 ru 213.165.224.0 - 213.166.31.255 gb 213.166.32.0 - 213.166.63.255 lu 213.166.64.0 - 213.166.95.255 gb @@ -147802,54 +112719,32 @@ 213.166.224.0 - 213.166.255.255 de 213.167.0.0 - 213.167.31.255 bg 213.167.32.0 - 213.167.63.255 ru -213.167.64.0 - 213.167.67.255 gb -213.167.68.0 - 213.167.68.15 cy -213.167.68.16 - 213.167.68.23 ky -213.167.68.24 - 213.167.69.47 gb +213.167.64.0 - 213.167.69.47 gb 213.167.69.48 - 213.167.69.55 aw -213.167.69.56 - 213.167.76.23 gb -213.167.76.24 - 213.167.76.31 ky -213.167.76.32 - 213.167.76.47 gb -213.167.76.48 - 213.167.76.63 ky -213.167.76.64 - 213.167.76.79 gb -213.167.76.80 - 213.167.76.95 nl -213.167.76.96 - 213.167.79.63 gb -213.167.79.64 - 213.167.79.127 mt -213.167.79.128 - 213.167.85.255 gb -213.167.86.0 - 213.167.86.31 us -213.167.86.32 - 213.167.95.231 gb -213.167.95.232 - 213.167.95.239 bb -213.167.95.240 - 213.167.95.255 gb +213.167.69.56 - 213.167.71.159 gb +213.167.71.160 - 213.167.71.175 aw +213.167.71.176 - 213.167.95.255 gb 213.167.96.0 - 213.167.127.255 no 213.167.128.0 - 213.167.159.255 is 213.167.160.0 - 213.167.191.255 de 213.167.192.0 - 213.167.223.255 ru -213.167.224.0 - 213.167.255.255 es +213.167.224.0 - 213.167.227.255 es +213.167.228.0 - 213.167.231.255 fr +213.167.232.0 - 213.167.239.255 it +213.167.240.0 - 213.167.255.255 fr 213.168.0.0 - 213.168.31.255 ee 213.168.32.0 - 213.168.63.255 ru 213.168.64.0 - 213.168.127.255 de 213.168.128.0 - 213.168.159.255 ru 213.168.160.0 - 213.168.191.255 cz 213.168.192.0 - 213.168.223.255 de -213.168.224.0 - 213.168.224.95 gb -213.168.224.96 - 213.168.224.127 ie -213.168.224.128 - 213.168.224.191 gb -213.168.224.192 - 213.168.224.223 ie -213.168.224.224 - 213.168.224.255 gb -213.168.225.0 - 213.168.225.95 ie -213.168.225.96 - 213.168.225.103 gb -213.168.225.104 - 213.168.225.107 ie -213.168.225.108 - 213.168.225.111 gb -213.168.225.112 - 213.168.226.255 ie -213.168.227.0 - 213.168.227.159 gb -213.168.227.160 - 213.168.254.255 ie -213.168.255.0 - 213.168.255.255 gb +213.168.224.0 - 213.168.247.255 ie +213.168.248.0 - 213.168.251.255 gb +213.168.252.0 - 213.168.255.255 ie 213.169.0.0 - 213.169.31.255 fi 213.169.32.0 - 213.169.63.255 bg 213.169.64.0 - 213.169.95.255 ua -213.169.96.0 - 213.169.106.255 lu -213.169.107.0 - 213.169.107.255 eu -213.169.108.0 - 213.169.127.255 lu +213.169.96.0 - 213.169.127.255 lu 213.169.128.0 - 213.169.159.255 cy 213.169.160.0 - 213.169.191.255 fr 213.169.192.0 - 213.169.255.255 nl @@ -147864,7 +112759,6 @@ 213.170.64.0 - 213.170.127.255 ru 213.170.128.0 - 213.170.159.255 gb 213.170.160.0 - 213.170.191.255 de -213.170.192.0 - 213.170.223.255 gr 213.170.224.0 - 213.170.255.255 dk 213.171.0.0 - 213.171.63.255 ru 213.171.64.0 - 213.171.95.255 nl @@ -147877,56 +112771,32 @@ 213.172.32.0 - 213.172.63.255 es 213.172.64.0 - 213.172.95.255 az 213.172.96.0 - 213.172.127.255 de -213.172.128.0 - 213.172.159.255 gh +213.172.128.0 - 213.172.159.255 za 213.172.160.0 - 213.172.191.255 pl 213.172.192.0 - 213.172.223.255 no 213.172.224.0 - 213.172.255.255 si 213.173.0.0 - 213.173.31.255 de -213.173.32.0 - 213.173.63.255 il 213.173.64.0 - 213.173.95.255 at 213.173.96.0 - 213.173.127.255 it 213.173.128.0 - 213.173.159.255 fi -213.173.160.0 - 213.173.170.19 ch -213.173.170.20 - 213.173.170.23 it -213.173.170.24 - 213.173.175.63 ch -213.173.175.64 - 213.173.175.191 de -213.173.175.192 - 213.173.182.47 ch -213.173.182.48 - 213.173.182.63 es -213.173.182.64 - 213.173.185.199 ch -213.173.185.200 - 213.173.185.207 de -213.173.185.208 - 213.173.191.255 ch -213.173.192.0 - 213.173.223.255 no +213.173.160.0 - 213.173.191.255 ch +213.173.192.0 - 213.173.207.255 no +213.173.208.0 - 213.173.223.255 nl 213.173.224.0 - 213.173.255.255 dk 213.174.0.0 - 213.174.31.255 ua 213.174.32.0 - 213.174.63.255 de -213.174.64.0 - 213.174.87.255 dk -213.174.88.0 - 213.174.91.255 se -213.174.92.0 - 213.174.94.255 dk -213.174.95.0 - 213.174.95.255 se +213.174.64.0 - 213.174.81.255 dk +213.174.82.0 - 213.174.85.255 fi +213.174.86.0 - 213.174.95.255 dk 213.174.96.0 - 213.174.127.255 fr -213.174.128.0 - 213.174.149.159 us -213.174.149.160 - 213.174.149.175 ua -213.174.149.176 - 213.174.149.207 us -213.174.149.208 - 213.174.149.223 ua -213.174.149.224 - 213.174.149.239 us -213.174.149.240 - 213.174.149.255 ua -213.174.150.0 - 213.174.156.95 us -213.174.156.96 - 213.174.156.127 ua -213.174.156.128 - 213.174.156.255 us -213.174.157.0 - 213.174.157.31 nl -213.174.157.32 - 213.174.157.47 us -213.174.157.48 - 213.174.157.63 ua -213.174.157.64 - 213.174.157.127 us -213.174.157.128 - 213.174.157.255 gb -213.174.158.0 - 213.174.159.255 us +213.174.128.0 - 213.174.159.255 us 213.174.160.0 - 213.174.191.255 it 213.174.192.0 - 213.174.223.255 gb 213.174.224.0 - 213.174.255.255 at 213.175.0.0 - 213.175.31.255 it 213.175.32.0 - 213.175.63.255 cz 213.175.64.0 - 213.175.127.255 lv -213.175.128.0 - 213.175.135.255 iq -213.175.136.0 - 213.175.159.255 gb +213.175.128.0 - 213.175.159.255 gb 213.175.160.0 - 213.175.191.255 lb 213.175.192.0 - 213.175.255.255 gb 213.176.0.0 - 213.176.127.255 ir @@ -147938,9 +112808,7 @@ 213.177.32.0 - 213.177.63.255 gb 213.177.64.0 - 213.177.95.255 be 213.177.96.0 - 213.177.127.255 ru -213.177.128.0 - 213.177.167.255 be -213.177.168.0 - 213.177.168.255 dz -213.177.169.0 - 213.177.170.127 be +213.177.128.0 - 213.177.170.127 be 213.177.170.128 - 213.177.170.255 dz 213.177.171.0 - 213.177.191.255 be 213.177.192.0 - 213.177.223.255 es @@ -147954,31 +112822,19 @@ 213.178.192.0 - 213.178.223.255 it 213.178.224.0 - 213.178.255.255 sy 213.179.0.0 - 213.179.31.255 se -213.179.32.0 - 213.179.43.135 no -213.179.43.136 - 213.179.43.255 gb -213.179.44.0 - 213.179.45.80 no -213.179.45.81 - 213.179.45.127 gb -213.179.45.128 - 213.179.45.159 no -213.179.45.160 - 213.179.49.255 gb -213.179.50.0 - 213.179.50.7 no -213.179.50.8 - 213.179.50.31 gb -213.179.50.32 - 213.179.50.223 no -213.179.50.224 - 213.179.50.255 gb -213.179.51.0 - 213.179.58.223 no -213.179.58.224 - 213.179.58.255 gb -213.179.59.0 - 213.179.59.159 no -213.179.59.160 - 213.179.59.207 gb +213.179.32.0 - 213.179.42.255 no +213.179.43.0 - 213.179.50.255 gb +213.179.51.0 - 213.179.56.255 no +213.179.57.0 - 213.179.58.63 gb +213.179.58.64 - 213.179.58.95 no +213.179.58.96 - 213.179.59.207 gb 213.179.59.208 - 213.179.59.215 za -213.179.59.216 - 213.179.59.255 gb -213.179.60.0 - 213.179.61.255 no -213.179.62.0 - 213.179.63.255 gb +213.179.59.216 - 213.179.63.255 gb 213.179.64.0 - 213.179.95.255 de 213.179.96.0 - 213.179.127.255 es 213.179.128.0 - 213.179.159.255 de 213.179.160.0 - 213.179.191.255 dz -213.179.192.0 - 213.179.208.127 nl -213.179.208.128 - 213.179.208.143 fi -213.179.208.144 - 213.179.223.255 nl +213.179.192.0 - 213.179.223.255 nl 213.179.224.0 - 213.179.255.255 ua 213.180.0.0 - 213.180.31.255 ee 213.180.32.0 - 213.180.63.255 cz @@ -148003,12 +112859,7 @@ 213.182.160.0 - 213.182.191.255 ru 213.182.192.0 - 213.182.223.255 lv 213.182.224.0 - 213.182.255.255 at -213.183.0.0 - 213.183.8.191 de -213.183.8.192 - 213.183.8.207 tr -213.183.8.208 - 213.183.18.199 de -213.183.18.200 - 213.183.18.207 ch -213.183.18.208 - 213.183.18.223 tr -213.183.18.224 - 213.183.31.255 de +213.183.0.0 - 213.183.31.255 de 213.183.32.0 - 213.183.63.255 ru 213.183.64.0 - 213.183.95.255 de 213.183.96.0 - 213.183.127.255 ru @@ -148017,103 +112868,49 @@ 213.183.224.0 - 213.183.255.255 ru 213.184.0.0 - 213.184.31.255 pl 213.184.32.0 - 213.184.63.255 ee -213.184.64.0 - 213.184.95.255 ru -213.184.96.0 - 213.184.127.255 rs +213.184.96.0 - 213.184.103.255 il +213.184.104.0 - 213.184.104.255 gb +213.184.105.0 - 213.184.105.127 nl +213.184.105.128 - 213.184.105.255 il +213.184.106.0 - 213.184.108.255 gb +213.184.109.0 - 213.184.110.255 it +213.184.111.0 - 213.184.111.255 il +213.184.112.0 - 213.184.112.255 it +213.184.113.0 - 213.184.113.127 il +213.184.113.128 - 213.184.113.255 nl +213.184.114.0 - 213.184.114.255 it +213.184.115.0 - 213.184.115.127 nl +213.184.115.128 - 213.184.115.255 il +213.184.116.0 - 213.184.116.127 ae +213.184.116.128 - 213.184.117.127 nl +213.184.117.128 - 213.184.118.127 il +213.184.118.128 - 213.184.118.255 nl +213.184.119.0 - 213.184.123.255 il +213.184.124.0 - 213.184.124.127 nl +213.184.124.128 - 213.184.127.255 il 213.184.128.0 - 213.184.159.255 ru 213.184.160.0 - 213.184.191.255 sa -213.184.192.0 - 213.184.195.79 no -213.184.195.80 - 213.184.195.87 us -213.184.195.88 - 213.184.223.255 no +213.184.192.0 - 213.184.223.255 no 213.184.224.0 - 213.184.255.255 by -213.185.0.0 - 213.185.3.255 se -213.185.4.0 - 213.185.4.255 dk -213.185.5.0 - 213.185.6.255 se -213.185.7.0 - 213.185.10.255 dk -213.185.11.0 - 213.185.11.255 se -213.185.12.0 - 213.185.17.255 dk -213.185.18.0 - 213.185.19.255 se -213.185.20.0 - 213.185.22.255 dk -213.185.23.0 - 213.185.23.255 se -213.185.24.0 - 213.185.24.255 dk -213.185.25.0 - 213.185.31.255 se +213.185.0.0 - 213.185.16.42 se +213.185.16.43 - 213.185.16.43 dk +213.185.16.44 - 213.185.31.255 se 213.185.32.0 - 213.185.63.255 fi 213.185.64.0 - 213.185.95.255 de -213.185.96.0 - 213.185.96.255 cm -213.185.97.0 - 213.185.97.63 bd -213.185.97.64 - 213.185.98.255 a2 -213.185.99.0 - 213.185.99.255 lb -213.185.100.0 - 213.185.100.31 no -213.185.100.32 - 213.185.100.63 lr -213.185.100.64 - 213.185.100.79 gb -213.185.100.80 - 213.185.100.255 a2 -213.185.101.0 - 213.185.101.255 gb -213.185.102.0 - 213.185.102.255 no -213.185.103.0 - 213.185.103.255 a2 -213.185.104.0 - 213.185.104.255 ng -213.185.105.0 - 213.185.105.255 a2 -213.185.106.0 - 213.185.106.255 us -213.185.107.0 - 213.185.107.255 a2 -213.185.108.0 - 213.185.108.255 gb -213.185.109.0 - 213.185.110.255 a2 -213.185.111.0 - 213.185.111.127 us -213.185.111.128 - 213.185.111.255 au -213.185.112.0 - 213.185.112.255 iq -213.185.113.0 - 213.185.113.63 ng -213.185.113.64 - 213.185.113.95 a2 -213.185.113.96 - 213.185.113.127 ng -213.185.113.128 - 213.185.113.135 a2 -213.185.113.136 - 213.185.113.143 us -213.185.113.144 - 213.185.113.159 za -213.185.113.160 - 213.185.113.175 a2 -213.185.113.176 - 213.185.113.191 ng -213.185.113.192 - 213.185.113.207 a2 -213.185.113.208 - 213.185.113.223 ng -213.185.113.224 - 213.185.113.247 au -213.185.113.248 - 213.185.113.255 za -213.185.114.0 - 213.185.114.255 ng -213.185.115.0 - 213.185.115.255 tz -213.185.116.0 - 213.185.116.255 iq -213.185.117.0 - 213.185.117.255 us -213.185.118.0 - 213.185.118.63 mw -213.185.118.64 - 213.185.118.127 a2 -213.185.118.128 - 213.185.118.143 ng -213.185.118.144 - 213.185.118.159 ca -213.185.118.160 - 213.185.118.255 ng -213.185.119.0 - 213.185.119.255 gb -213.185.120.0 - 213.185.120.255 fr -213.185.121.0 - 213.185.121.255 lr -213.185.122.0 - 213.185.122.63 us -213.185.122.64 - 213.185.122.127 a2 -213.185.122.128 - 213.185.122.255 tz -213.185.123.0 - 213.185.123.255 tg -213.185.124.0 - 213.185.124.255 ng -213.185.125.0 - 213.185.125.255 fr -213.185.126.0 - 213.185.127.255 a2 +213.185.96.0 - 213.185.127.255 a2 213.185.128.0 - 213.185.159.255 de -213.185.160.0 - 213.185.176.111 at -213.185.176.112 - 213.185.176.127 de -213.185.176.128 - 213.185.176.191 at -213.185.176.192 - 213.185.176.199 de -213.185.176.200 - 213.185.191.255 at +213.185.160.0 - 213.185.191.255 at 213.185.192.0 - 213.185.223.255 gb 213.185.224.0 - 213.185.255.255 se 213.186.0.0 - 213.186.31.255 hr -213.186.32.0 - 213.186.49.47 fr -213.186.49.48 - 213.186.49.63 es -213.186.49.64 - 213.186.51.255 fr -213.186.52.0 - 213.186.52.15 gb -213.186.52.16 - 213.186.52.255 fr -213.186.53.0 - 213.186.53.15 es -213.186.53.16 - 213.186.53.63 fr -213.186.53.64 - 213.186.53.79 gb -213.186.53.80 - 213.186.53.95 de -213.186.53.96 - 213.186.53.111 es -213.186.53.112 - 213.186.53.127 pt -213.186.53.128 - 213.186.53.175 fr -213.186.53.176 - 213.186.53.191 de -213.186.53.192 - 213.186.63.255 fr +213.186.32.0 - 213.186.63.255 fr 213.186.64.0 - 213.186.95.255 pl -213.186.96.0 - 213.186.127.255 ua +213.186.96.0 - 213.186.111.255 ua +213.186.112.0 - 213.186.112.255 ru +213.186.113.0 - 213.186.120.255 ua +213.186.121.0 - 213.186.122.255 ru +213.186.123.0 - 213.186.126.255 ua +213.186.127.0 - 213.186.127.255 ru 213.186.128.0 - 213.186.159.255 tr 213.186.160.0 - 213.186.191.255 jo 213.186.192.0 - 213.186.223.255 ua @@ -148122,98 +112919,29 @@ 213.187.32.0 - 213.187.63.255 gb 213.187.64.0 - 213.187.95.255 de 213.187.96.0 - 213.187.127.255 ru -213.187.128.0 - 213.187.128.15 gb -213.187.128.16 - 213.187.130.63 nl -213.187.130.64 - 213.187.130.127 iq -213.187.130.128 - 213.187.130.255 nl -213.187.131.0 - 213.187.131.63 gq -213.187.131.64 - 213.187.131.71 ao -213.187.131.72 - 213.187.131.95 nl -213.187.131.96 - 213.187.131.103 iq -213.187.131.104 - 213.187.131.119 nl -213.187.131.120 - 213.187.131.127 iq -213.187.131.128 - 213.187.131.135 nl -213.187.131.136 - 213.187.131.143 ke -213.187.131.144 - 213.187.131.151 so -213.187.131.152 - 213.187.131.159 sc -213.187.131.160 - 213.187.131.167 sd -213.187.131.168 - 213.187.131.175 dj -213.187.131.176 - 213.187.131.183 so -213.187.131.184 - 213.187.131.191 td -213.187.131.192 - 213.187.131.207 er -213.187.131.208 - 213.187.132.255 nl -213.187.133.0 - 213.187.133.255 ch -213.187.134.0 - 213.187.135.255 dz -213.187.136.0 - 213.187.137.255 iq -213.187.138.0 - 213.187.140.63 ao -213.187.140.64 - 213.187.140.127 na -213.187.140.128 - 213.187.140.167 nl -213.187.140.168 - 213.187.140.175 ao -213.187.140.176 - 213.187.140.191 nl -213.187.140.192 - 213.187.140.199 ao -213.187.140.200 - 213.187.140.215 nl -213.187.140.216 - 213.187.140.223 ao -213.187.140.224 - 213.187.142.127 nl -213.187.142.128 - 213.187.142.255 ng -213.187.143.0 - 213.187.143.31 nl -213.187.143.32 - 213.187.143.63 iq -213.187.143.64 - 213.187.143.127 ng -213.187.143.128 - 213.187.143.255 dz -213.187.144.0 - 213.187.147.255 nl -213.187.148.0 - 213.187.151.255 iq -213.187.152.0 - 213.187.152.255 nl -213.187.153.0 - 213.187.153.3 ng -213.187.153.4 - 213.187.154.255 nl -213.187.155.0 - 213.187.155.255 ng -213.187.156.0 - 213.187.156.23 iq -213.187.156.24 - 213.187.156.31 nl -213.187.156.32 - 213.187.157.255 iq -213.187.158.0 - 213.187.158.255 ng -213.187.159.0 - 213.187.159.255 nl +213.187.128.0 - 213.187.159.255 us 213.187.160.0 - 213.187.191.255 no 213.187.192.0 - 213.187.223.255 se -213.187.224.0 - 213.187.227.255 ru -213.187.228.0 - 213.187.239.255 de -213.187.240.0 - 213.187.243.255 ru -213.187.244.0 - 213.187.247.255 de -213.187.248.0 - 213.187.255.255 ru +213.187.224.0 - 213.187.227.255 af +213.187.228.0 - 213.187.231.255 ru +213.187.232.0 - 213.187.239.255 ee +213.187.240.0 - 213.187.246.255 nl +213.187.247.0 - 213.187.247.255 lb +213.187.248.0 - 213.187.248.255 ua +213.187.249.0 - 213.187.255.255 ee 213.188.0.0 - 213.188.31.255 no 213.188.32.0 - 213.188.63.255 ch 213.188.64.0 - 213.188.95.255 iq 213.188.96.0 - 213.188.127.255 de -213.188.128.0 - 213.188.134.159 no -213.188.134.160 - 213.188.134.191 gb -213.188.134.192 - 213.188.135.111 no -213.188.135.112 - 213.188.135.127 gb -213.188.135.128 - 213.188.159.255 no -213.188.160.0 - 213.188.160.255 gp -213.188.161.0 - 213.188.163.255 gf -213.188.164.0 - 213.188.164.255 gp -213.188.165.0 - 213.188.165.255 mq -213.188.166.0 - 213.188.166.255 gp -213.188.167.0 - 213.188.167.255 fr -213.188.168.0 - 213.188.168.255 gp -213.188.169.0 - 213.188.169.255 fr -213.188.170.0 - 213.188.176.255 gp -213.188.177.0 - 213.188.177.255 fr -213.188.178.0 - 213.188.182.255 gp -213.188.183.0 - 213.188.183.255 gf -213.188.184.0 - 213.188.184.255 mq -213.188.185.0 - 213.188.186.255 gp -213.188.187.0 - 213.188.187.255 fr -213.188.188.0 - 213.188.188.255 gp -213.188.189.0 - 213.188.190.255 fr +213.188.128.0 - 213.188.151.255 no +213.188.152.0 - 213.188.155.255 cz +213.188.156.0 - 213.188.159.255 no +213.188.160.0 - 213.188.190.255 gp 213.188.191.0 - 213.188.191.255 mq 213.188.192.0 - 213.188.223.255 it 213.188.224.0 - 213.188.255.255 ch -213.189.0.0 - 213.189.10.255 nl -213.189.11.0 - 213.189.15.255 us -213.189.16.0 - 213.189.27.255 nl -213.189.28.0 - 213.189.28.255 be -213.189.29.0 - 213.189.31.255 nl -213.189.32.0 - 213.189.38.95 pl -213.189.38.96 - 213.189.38.127 hu -213.189.38.128 - 213.189.63.255 pl +213.189.0.0 - 213.189.31.255 nl +213.189.32.0 - 213.189.63.255 pl 213.189.64.0 - 213.189.95.255 kw 213.189.96.0 - 213.189.127.255 se 213.189.128.0 - 213.189.159.255 ch @@ -148221,7 +112949,15 @@ 213.189.192.0 - 213.189.255.255 ru 213.190.0.0 - 213.190.31.255 es 213.190.32.0 - 213.190.63.255 lt -213.190.64.0 - 213.190.95.255 fr +213.190.64.0 - 213.190.93.31 fr +213.190.93.32 - 213.190.93.32 gb +213.190.93.33 - 213.190.93.33 tn +213.190.93.34 - 213.190.93.34 se +213.190.93.35 - 213.190.93.35 be +213.190.93.36 - 213.190.93.36 dk +213.190.93.37 - 213.190.93.37 de +213.190.93.38 - 213.190.93.38 it +213.190.93.39 - 213.190.95.255 fr 213.190.96.0 - 213.190.127.255 is 213.190.128.0 - 213.190.159.255 ie 213.190.160.0 - 213.190.191.255 gb @@ -148230,82 +112966,30 @@ 213.191.32.0 - 213.191.95.255 de 213.191.96.0 - 213.191.127.255 cz 213.191.128.0 - 213.191.159.255 hr -213.191.160.0 - 213.191.160.255 a2 -213.191.161.0 - 213.191.161.127 er -213.191.161.128 - 213.191.191.255 a2 -213.191.192.0 - 213.191.223.255 bg +213.191.160.0 - 213.191.223.255 bg 213.191.224.0 - 213.191.255.255 ie 213.192.0.0 - 213.192.63.255 cz 213.192.64.0 - 213.192.127.255 pl 213.192.128.0 - 213.192.191.255 fi -213.192.192.0 - 213.192.241.255 es -213.192.242.0 - 213.192.242.15 fr -213.192.242.16 - 213.192.255.255 es +213.192.192.0 - 213.192.255.255 es 213.193.0.0 - 213.193.31.255 ru -213.193.32.0 - 213.193.33.255 zm -213.193.34.0 - 213.193.39.255 ke +213.193.32.0 - 213.193.34.255 ke +213.193.35.0 - 213.193.35.255 zm +213.193.36.0 - 213.193.39.255 ke 213.193.40.0 - 213.193.47.255 bw -213.193.48.0 - 213.193.51.255 za -213.193.52.0 - 213.193.63.255 ke -213.193.64.0 - 213.193.96.255 ch -213.193.97.0 - 213.193.97.15 fr -213.193.97.16 - 213.193.116.143 ch -213.193.116.144 - 213.193.116.159 fr -213.193.116.160 - 213.193.127.255 ch -213.193.128.0 - 213.193.164.255 be -213.193.165.0 - 213.193.165.255 nl -213.193.166.0 - 213.193.191.255 be -213.193.192.0 - 213.193.193.255 nl -213.193.194.0 - 213.193.199.255 gb +213.193.48.0 - 213.193.48.255 za +213.193.49.0 - 213.193.49.255 a2 +213.193.50.0 - 213.193.51.255 za +213.193.52.0 - 213.193.60.255 ke +213.193.61.0 - 213.193.61.255 bw +213.193.62.0 - 213.193.63.255 ke +213.193.64.0 - 213.193.127.255 ch +213.193.128.0 - 213.193.191.255 be +213.193.192.0 - 213.193.199.255 nl 213.193.200.0 - 213.193.207.255 be -213.193.208.0 - 213.193.214.209 nl -213.193.214.210 - 213.193.214.217 be -213.193.214.218 - 213.193.223.255 nl -213.193.224.0 - 213.193.231.255 be -213.193.232.0 - 213.193.247.255 nl -213.193.248.0 - 213.193.249.255 be -213.193.250.0 - 213.194.32.63 nl -213.194.32.64 - 213.194.32.79 es -213.194.32.80 - 213.194.32.191 nl -213.194.32.192 - 213.194.32.231 es -213.194.32.232 - 213.194.32.239 nl -213.194.32.240 - 213.194.32.255 es -213.194.33.0 - 213.194.33.31 nl -213.194.33.32 - 213.194.33.63 es -213.194.33.64 - 213.194.33.95 nl -213.194.33.96 - 213.194.33.167 gb -213.194.33.168 - 213.194.33.255 es -213.194.34.0 - 213.194.34.63 nl -213.194.34.64 - 213.194.34.127 es -213.194.34.128 - 213.194.34.159 nl -213.194.34.160 - 213.194.34.191 es -213.194.34.192 - 213.194.34.223 nl -213.194.34.224 - 213.194.35.127 es -213.194.35.128 - 213.194.35.255 nl -213.194.36.0 - 213.194.39.255 es -213.194.40.0 - 213.194.40.255 nl -213.194.41.0 - 213.194.42.79 es -213.194.42.80 - 213.194.42.95 it -213.194.42.96 - 213.194.42.255 es -213.194.43.0 - 213.194.43.255 it -213.194.44.0 - 213.194.44.127 nl -213.194.44.128 - 213.194.46.31 es -213.194.46.32 - 213.194.46.39 it -213.194.46.40 - 213.194.46.47 es -213.194.46.48 - 213.194.46.55 it -213.194.46.56 - 213.194.46.95 es -213.194.46.96 - 213.194.46.127 nl -213.194.46.128 - 213.194.46.191 it -213.194.46.192 - 213.194.46.223 es -213.194.46.224 - 213.194.46.239 it -213.194.46.240 - 213.194.46.247 es -213.194.46.248 - 213.194.46.255 it -213.194.47.0 - 213.194.59.255 nl -213.194.60.0 - 213.194.61.255 es -213.194.62.0 - 213.194.63.255 nl -213.194.64.0 - 213.194.99.255 tr -213.194.100.0 - 213.194.100.15 a2 -213.194.100.16 - 213.194.127.255 tr +213.193.208.0 - 213.193.255.255 nl +213.194.0.0 - 213.194.63.255 gb +213.194.64.0 - 213.194.127.255 tr 213.194.128.0 - 213.194.191.255 es 213.194.192.0 - 213.194.255.255 cz 213.195.0.0 - 213.195.63.255 ir @@ -148317,107 +113001,69 @@ 213.196.128.0 - 213.196.191.255 ch 213.196.192.0 - 213.196.255.255 de 213.197.0.0 - 213.197.63.255 nl -213.197.64.0 - 213.197.64.3 sk -213.197.64.4 - 213.197.71.255 hu -213.197.72.0 - 213.197.72.31 tr -213.197.72.32 - 213.197.72.255 hu -213.197.73.0 - 213.197.73.7 sk -213.197.73.8 - 213.197.73.63 hu -213.197.73.64 - 213.197.73.95 at -213.197.73.96 - 213.197.73.119 ua -213.197.73.120 - 213.197.73.127 bg -213.197.73.128 - 213.197.73.143 hu -213.197.73.144 - 213.197.73.151 sk -213.197.73.152 - 213.197.79.255 hu -213.197.80.0 - 213.197.81.255 sk -213.197.82.0 - 213.197.82.255 hu -213.197.83.0 - 213.197.83.255 sk -213.197.84.0 - 213.197.84.255 tr -213.197.85.0 - 213.197.85.255 sk -213.197.86.0 - 213.197.127.255 hu +213.197.64.0 - 213.197.127.255 hu 213.197.128.0 - 213.197.191.255 lt 213.197.192.0 - 213.197.255.255 nl -213.198.0.0 - 213.198.75.223 de -213.198.75.224 - 213.198.75.231 ae -213.198.75.232 - 213.198.79.159 de -213.198.79.160 - 213.198.79.167 gb -213.198.79.168 - 213.198.80.143 de -213.198.80.144 - 213.198.80.175 gb -213.198.80.176 - 213.198.84.63 de -213.198.84.64 - 213.198.84.79 ae -213.198.84.80 - 213.198.85.223 de -213.198.85.224 - 213.198.85.231 gb -213.198.85.232 - 213.198.88.15 de -213.198.88.16 - 213.198.88.39 gb -213.198.88.40 - 213.198.90.111 de -213.198.90.112 - 213.198.90.127 gb -213.198.90.128 - 213.198.90.135 de -213.198.90.136 - 213.198.90.143 gb -213.198.90.144 - 213.198.90.199 de -213.198.90.200 - 213.198.90.207 gb -213.198.90.208 - 213.198.90.239 de -213.198.90.240 - 213.198.90.247 gb -213.198.90.248 - 213.198.93.143 de -213.198.93.144 - 213.198.93.151 gb -213.198.93.152 - 213.198.127.255 de +213.198.0.0 - 213.198.82.139 de +213.198.82.140 - 213.198.82.143 dk +213.198.82.144 - 213.198.82.255 de +213.198.83.0 - 213.198.83.255 dk +213.198.84.0 - 213.198.95.255 de +213.198.96.0 - 213.198.96.255 nl +213.198.97.0 - 213.198.127.255 de 213.198.128.0 - 213.198.191.255 it 213.198.192.0 - 213.198.255.255 rs 213.199.0.0 - 213.199.31.255 it 213.199.32.0 - 213.199.63.255 gb 213.199.64.0 - 213.199.127.255 se -213.199.128.0 - 213.199.143.255 ie -213.199.144.0 - 213.199.159.255 gb -213.199.160.0 - 213.199.191.255 ie +213.199.128.0 - 213.199.128.255 eu +213.199.129.0 - 213.199.143.255 nl +213.199.144.0 - 213.199.153.255 gb +213.199.154.0 - 213.199.154.31 nl +213.199.154.32 - 213.199.154.63 gb +213.199.154.64 - 213.199.154.95 ie +213.199.154.96 - 213.199.159.255 gb +213.199.160.0 - 213.199.175.255 ie +213.199.176.0 - 213.199.176.255 nl +213.199.177.0 - 213.199.177.63 ie +213.199.177.64 - 213.199.177.95 nl +213.199.177.96 - 213.199.177.103 ie +213.199.177.104 - 213.199.177.191 nl +213.199.177.192 - 213.199.177.255 ie +213.199.178.0 - 213.199.179.255 nl +213.199.180.0 - 213.199.180.31 ie +213.199.180.32 - 213.199.180.127 nl +213.199.180.128 - 213.199.180.191 ie +213.199.180.192 - 213.199.183.255 nl +213.199.184.0 - 213.199.191.255 ie 213.199.192.0 - 213.199.255.255 pl 213.200.0.0 - 213.200.31.255 ge 213.200.32.0 - 213.200.63.255 ua -213.200.64.0 - 213.200.89.191 de -213.200.89.192 - 213.200.89.255 fr -213.200.90.0 - 213.200.90.63 de -213.200.90.64 - 213.200.90.79 fr -213.200.90.80 - 213.200.90.127 de -213.200.90.128 - 213.200.90.239 fr -213.200.90.240 - 213.200.91.255 de -213.200.92.0 - 213.200.92.255 gr -213.200.93.0 - 213.200.93.255 de -213.200.94.0 - 213.200.94.127 fr -213.200.94.128 - 213.200.94.143 gb -213.200.94.144 - 213.200.94.159 fr -213.200.94.160 - 213.200.94.167 ie -213.200.94.168 - 213.200.94.175 fr -213.200.94.176 - 213.200.94.255 ie -213.200.95.0 - 213.200.95.127 fr -213.200.95.128 - 213.200.95.143 cy -213.200.95.144 - 213.200.95.151 gb -213.200.95.152 - 213.200.95.159 mu -213.200.95.160 - 213.200.95.255 gb -213.200.96.0 - 213.200.96.255 it -213.200.97.0 - 213.200.97.63 fr -213.200.97.64 - 213.200.97.127 de -213.200.97.128 - 213.200.98.31 fr -213.200.98.32 - 213.200.98.47 dk -213.200.98.48 - 213.200.98.63 fr -213.200.98.64 - 213.200.98.127 de -213.200.98.128 - 213.200.99.31 fr -213.200.99.32 - 213.200.99.47 it -213.200.99.48 - 213.200.99.95 fr -213.200.99.96 - 213.200.99.159 it -213.200.99.160 - 213.200.99.175 fr -213.200.99.176 - 213.200.99.191 it -213.200.99.192 - 213.200.101.255 fr -213.200.102.0 - 213.200.102.127 es -213.200.102.128 - 213.200.102.143 fr -213.200.102.144 - 213.200.102.223 es -213.200.102.224 - 213.200.102.239 fr -213.200.102.240 - 213.200.102.255 es -213.200.103.0 - 213.200.103.31 fr -213.200.103.32 - 213.200.103.39 es -213.200.103.40 - 213.200.103.191 fr -213.200.103.192 - 213.200.103.255 es -213.200.104.0 - 213.200.109.127 fr +213.200.64.0 - 213.200.84.255 de +213.200.85.0 - 213.200.85.255 fr +213.200.86.0 - 213.200.88.255 de +213.200.89.0 - 213.200.90.186 fr +213.200.90.187 - 213.200.90.187 de +213.200.90.188 - 213.200.91.127 fr +213.200.91.128 - 213.200.91.135 de +213.200.91.136 - 213.200.91.139 gb +213.200.91.140 - 213.200.91.143 sg +213.200.91.144 - 213.200.91.151 us +213.200.91.152 - 213.200.99.47 fr +213.200.99.48 - 213.200.99.63 it +213.200.99.64 - 213.200.102.191 fr +213.200.102.192 - 213.200.102.199 gb +213.200.102.200 - 213.200.106.127 fr +213.200.106.128 - 213.200.106.143 gb +213.200.106.144 - 213.200.106.183 fr +213.200.106.184 - 213.200.106.191 gb +213.200.106.192 - 213.200.107.15 fr +213.200.107.16 - 213.200.107.31 cz +213.200.107.32 - 213.200.109.127 fr 213.200.109.128 - 213.200.109.255 us -213.200.110.0 - 213.200.110.31 at -213.200.110.32 - 213.200.111.255 fr +213.200.110.0 - 213.200.110.47 fr +213.200.110.48 - 213.200.110.55 de +213.200.110.56 - 213.200.111.255 fr 213.200.112.0 - 213.200.127.255 us 213.200.128.0 - 213.200.191.255 se 213.200.192.0 - 213.200.255.255 ch @@ -148425,437 +113071,83 @@ 213.201.128.0 - 213.201.255.255 nl 213.202.0.0 - 213.202.31.255 om 213.202.32.0 - 213.202.63.255 ch -213.202.64.0 - 213.202.71.31 hr -213.202.71.32 - 213.202.71.63 de -213.202.71.64 - 213.202.76.15 hr -213.202.76.16 - 213.202.76.31 hu -213.202.76.32 - 213.202.127.255 hr +213.202.64.0 - 213.202.127.255 hr 213.202.128.0 - 213.202.191.255 ie -213.202.192.0 - 213.202.254.191 de -213.202.254.192 - 213.202.254.207 us -213.202.254.208 - 213.202.255.255 de +213.202.192.0 - 213.202.255.255 de 213.203.0.0 - 213.203.63.255 no 213.203.64.0 - 213.203.127.255 fr 213.203.128.0 - 213.203.191.255 it -213.203.192.0 - 213.203.193.63 de -213.203.193.64 - 213.203.193.127 nl -213.203.193.128 - 213.203.197.63 de -213.203.197.64 - 213.203.197.127 es -213.203.197.128 - 213.203.210.255 de -213.203.211.0 - 213.203.211.7 vg -213.203.211.8 - 213.203.212.111 de -213.203.212.112 - 213.203.212.127 gb -213.203.212.128 - 213.203.212.199 de -213.203.212.200 - 213.203.212.207 cy -213.203.212.208 - 213.203.233.95 de -213.203.233.96 - 213.203.233.103 nl -213.203.233.104 - 213.203.233.111 cy -213.203.233.112 - 213.203.233.123 nl -213.203.233.124 - 213.203.233.127 de -213.203.233.128 - 213.203.233.159 nl -213.203.233.160 - 213.203.233.191 de -213.203.233.192 - 213.203.233.223 nl -213.203.233.224 - 213.203.233.247 de -213.203.233.248 - 213.203.233.255 nl -213.203.234.0 - 213.203.235.15 de -213.203.235.16 - 213.203.235.63 be +213.203.192.0 - 213.203.235.31 de +213.203.235.32 - 213.203.235.63 be 213.203.235.64 - 213.203.235.127 de 213.203.235.128 - 213.203.235.191 nl 213.203.235.192 - 213.203.255.255 de -213.204.0.0 - 213.204.29.255 it -213.204.30.0 - 213.204.30.15 us -213.204.30.16 - 213.204.31.255 it -213.204.32.0 - 213.204.32.199 fi -213.204.32.200 - 213.204.32.207 ax -213.204.32.208 - 213.204.32.223 fi -213.204.32.224 - 213.204.32.255 ax -213.204.33.0 - 213.204.33.71 fi -213.204.33.72 - 213.204.33.79 ax -213.204.33.80 - 213.204.33.119 fi -213.204.33.120 - 213.204.33.127 ax -213.204.33.128 - 213.204.33.143 fi -213.204.33.144 - 213.204.33.159 ax -213.204.33.160 - 213.204.33.183 fi -213.204.33.184 - 213.204.33.255 ax -213.204.34.0 - 213.204.34.47 fi -213.204.34.48 - 213.204.34.79 ax -213.204.34.80 - 213.204.34.191 fi -213.204.34.192 - 213.204.34.207 ax -213.204.34.208 - 213.204.34.255 fi -213.204.35.0 - 213.204.35.63 ax -213.204.35.64 - 213.204.35.127 fi -213.204.35.128 - 213.204.35.191 ax -213.204.35.192 - 213.204.35.223 fi -213.204.35.224 - 213.204.35.255 ax -213.204.36.0 - 213.204.36.127 fi -213.204.36.128 - 213.204.36.191 ax -213.204.36.192 - 213.204.36.223 fi -213.204.36.224 - 213.204.36.255 ax -213.204.37.0 - 213.204.37.7 fi -213.204.37.8 - 213.204.37.31 ax -213.204.37.32 - 213.204.37.63 fi -213.204.37.64 - 213.204.37.95 ax -213.204.37.96 - 213.204.37.159 fi -213.204.37.160 - 213.204.37.179 ax -213.204.37.180 - 213.204.37.191 fi -213.204.37.192 - 213.204.37.223 ax -213.204.37.224 - 213.204.37.255 fi -213.204.38.0 - 213.204.39.255 ax -213.204.40.0 - 213.204.40.255 se -213.204.41.0 - 213.204.41.255 fi -213.204.42.0 - 213.204.45.127 ax -213.204.45.128 - 213.204.45.255 fi -213.204.46.0 - 213.204.46.15 ax -213.204.46.16 - 213.204.46.31 fi -213.204.46.32 - 213.204.46.47 ax -213.204.46.48 - 213.204.46.95 fi -213.204.46.96 - 213.204.46.111 ax -213.204.46.112 - 213.204.46.159 fi -213.204.46.160 - 213.204.46.191 ax -213.204.46.192 - 213.204.46.207 fi -213.204.46.208 - 213.204.46.223 ax -213.204.46.224 - 213.204.47.255 fi -213.204.48.0 - 213.204.63.255 ax +213.204.0.0 - 213.204.31.255 it +213.204.32.0 - 213.204.51.255 ax +213.204.52.0 - 213.204.59.255 fi +213.204.60.0 - 213.204.63.255 ax 213.204.64.0 - 213.204.127.255 lb 213.204.128.0 - 213.204.191.255 se 213.204.192.0 - 213.204.255.255 nl 213.205.0.0 - 213.205.63.255 it 213.205.64.0 - 213.205.95.255 pt 213.205.96.0 - 213.205.127.255 fr -213.205.128.0 - 213.206.13.255 gb -213.206.14.0 - 213.206.16.255 de -213.206.17.0 - 213.206.17.255 gb -213.206.18.0 - 213.206.20.255 nl -213.206.21.0 - 213.206.21.255 gb -213.206.22.0 - 213.206.24.255 fr -213.206.25.0 - 213.206.31.255 gb +213.205.128.0 - 213.206.31.255 gb 213.206.32.0 - 213.206.63.255 uz 213.206.64.0 - 213.206.127.255 nl -213.206.128.0 - 213.206.136.127 gb -213.206.136.128 - 213.206.136.191 us -213.206.136.192 - 213.206.159.255 gb +213.206.128.0 - 213.206.159.255 gb 213.206.160.0 - 213.206.191.255 de 213.206.192.0 - 213.207.31.255 nl 213.207.32.0 - 213.207.63.255 al -213.207.64.0 - 213.207.83.255 nl -213.207.84.0 - 213.207.84.127 es -213.207.84.128 - 213.207.127.255 nl +213.207.64.0 - 213.207.127.255 nl 213.207.128.0 - 213.207.191.255 cy 213.207.192.0 - 213.207.255.255 ir -213.208.0.0 - 213.208.1.43 at -213.208.1.44 - 213.208.1.47 us -213.208.1.48 - 213.208.3.175 at -213.208.3.176 - 213.208.3.191 gb -213.208.3.192 - 213.208.31.255 at -213.208.32.0 - 213.208.33.255 a2 -213.208.34.0 - 213.208.34.255 gb -213.208.35.0 - 213.208.38.255 a2 -213.208.39.0 - 213.208.39.255 de -213.208.40.0 - 213.208.62.127 a2 -213.208.62.128 - 213.208.62.143 ru -213.208.62.144 - 213.208.63.255 a2 +213.208.0.0 - 213.208.31.255 at +213.208.32.0 - 213.208.32.255 de +213.208.33.0 - 213.208.33.255 gb +213.208.34.0 - 213.208.34.255 de +213.208.35.0 - 213.208.35.255 gb +213.208.36.0 - 213.208.37.255 de +213.208.38.0 - 213.208.38.255 am +213.208.39.0 - 213.208.56.255 de +213.208.57.0 - 213.208.58.255 gb +213.208.59.0 - 213.208.63.255 de 213.208.64.0 - 213.208.127.255 gb -213.208.128.0 - 213.208.129.11 at -213.208.129.12 - 213.208.129.15 de -213.208.129.16 - 213.208.138.87 at -213.208.138.88 - 213.208.138.95 uy -213.208.138.96 - 213.208.159.255 at -213.208.160.0 - 213.208.191.255 ru -213.208.192.0 - 213.208.192.15 nl -213.208.192.16 - 213.208.192.31 gb -213.208.192.32 - 213.208.192.111 nl -213.208.192.112 - 213.208.192.127 gb -213.208.192.128 - 213.208.192.255 nl -213.208.193.0 - 213.208.193.143 gb -213.208.193.144 - 213.208.193.183 nl -213.208.193.184 - 213.208.193.223 gb -213.208.193.224 - 213.208.194.111 nl -213.208.194.112 - 213.208.194.127 gb -213.208.194.128 - 213.208.194.191 nl -213.208.194.192 - 213.208.194.207 gb -213.208.194.208 - 213.208.195.175 nl -213.208.195.176 - 213.208.195.191 gb -213.208.195.192 - 213.208.195.224 nl -213.208.195.225 - 213.208.195.231 gb -213.208.195.232 - 213.208.196.255 nl -213.208.197.0 - 213.208.199.15 gb -213.208.199.16 - 213.208.199.207 nl -213.208.199.208 - 213.208.199.223 gb -213.208.199.224 - 213.208.200.127 nl -213.208.200.128 - 213.208.200.143 gb -213.208.200.144 - 213.208.200.159 es -213.208.200.160 - 213.208.200.175 nl -213.208.200.176 - 213.208.200.191 gb -213.208.200.192 - 213.208.200.224 nl -213.208.200.225 - 213.208.200.239 gb -213.208.200.240 - 213.208.201.207 nl -213.208.201.208 - 213.208.201.255 gb -213.208.202.0 - 213.208.202.191 nl -213.208.202.192 - 213.208.202.207 gb -213.208.202.208 - 213.208.202.223 nl -213.208.202.224 - 213.208.202.239 gb -213.208.202.240 - 213.208.202.255 nl -213.208.203.0 - 213.208.203.47 gb -213.208.203.48 - 213.208.203.55 nl -213.208.203.56 - 213.208.203.63 gb -213.208.203.64 - 213.208.203.79 nl -213.208.203.80 - 213.208.203.143 gb -213.208.203.144 - 213.208.203.159 nl -213.208.203.160 - 213.208.204.71 gb -213.208.204.72 - 213.208.204.79 nl -213.208.204.80 - 213.208.204.127 gb -213.208.204.128 - 213.208.204.191 nl -213.208.204.192 - 213.208.204.223 gb -213.208.204.224 - 213.208.204.247 de -213.208.204.248 - 213.208.204.255 gb -213.208.205.0 - 213.208.205.15 nl -213.208.205.16 - 213.208.206.127 gb -213.208.206.128 - 213.208.211.23 nl -213.208.211.24 - 213.208.211.199 gb -213.208.211.200 - 213.208.211.207 nl -213.208.211.208 - 213.208.211.255 gb -213.208.212.0 - 213.208.212.143 nl -213.208.212.144 - 213.208.212.159 gb -213.208.212.160 - 213.208.213.79 nl -213.208.213.80 - 213.208.213.95 gb -213.208.213.96 - 213.208.214.15 nl -213.208.214.16 - 213.208.214.39 gb -213.208.214.40 - 213.208.214.63 nl -213.208.214.64 - 213.208.214.79 gb -213.208.214.80 - 213.208.214.127 nl -213.208.214.128 - 213.208.214.191 gb -213.208.214.192 - 213.208.214.239 nl -213.208.214.240 - 213.208.214.255 gb -213.208.215.0 - 213.208.215.7 nl -213.208.215.8 - 213.208.215.63 gb -213.208.215.64 - 213.208.216.15 nl -213.208.216.16 - 213.208.216.31 gb -213.208.216.32 - 213.208.216.47 nl -213.208.216.48 - 213.208.216.127 gb -213.208.216.128 - 213.208.216.143 nl -213.208.216.144 - 213.208.216.159 gb -213.208.216.160 - 213.208.216.175 nl -213.208.216.176 - 213.208.216.191 gb -213.208.216.192 - 213.208.216.207 nl -213.208.216.208 - 213.208.216.255 gb -213.208.217.0 - 213.208.217.31 nl -213.208.217.32 - 213.208.217.47 gb -213.208.217.48 - 213.208.217.63 nl -213.208.217.64 - 213.208.217.79 gb -213.208.217.80 - 213.208.217.95 nl -213.208.217.96 - 213.208.217.111 gb -213.208.217.112 - 213.208.217.159 nl -213.208.217.160 - 213.208.219.255 gb -213.208.220.0 - 213.208.225.255 nl -213.208.226.0 - 213.208.226.31 gb -213.208.226.32 - 213.208.226.95 nl -213.208.226.96 - 213.208.226.127 gb -213.208.226.128 - 213.208.226.159 nl -213.208.226.160 - 213.208.226.191 gb -213.208.226.192 - 213.208.226.255 nl -213.208.227.0 - 213.208.227.255 gb -213.208.228.0 - 213.208.229.255 nl -213.208.230.0 - 213.208.230.15 gb -213.208.230.16 - 213.208.230.23 nl -213.208.230.24 - 213.208.230.31 gb -213.208.230.32 - 213.208.230.71 nl -213.208.230.72 - 213.208.230.79 gb -213.208.230.80 - 213.208.230.95 nl -213.208.230.96 - 213.208.230.111 gb -213.208.230.112 - 213.208.230.119 nl -213.208.230.120 - 213.208.230.143 gb -213.208.230.144 - 213.208.230.191 nl -213.208.230.192 - 213.208.231.255 gb -213.208.232.0 - 213.208.234.63 nl -213.208.234.64 - 213.208.234.79 gb -213.208.234.80 - 213.208.234.111 nl -213.208.234.112 - 213.208.234.119 gb -213.208.234.120 - 213.208.234.127 nl -213.208.234.128 - 213.208.234.143 gb -213.208.234.144 - 213.208.234.167 nl -213.208.234.168 - 213.208.234.183 gb -213.208.234.184 - 213.208.234.207 nl -213.208.234.208 - 213.208.235.255 gb -213.208.236.0 - 213.208.237.111 nl -213.208.237.112 - 213.208.237.119 gb -213.208.237.120 - 213.208.237.135 nl -213.208.237.136 - 213.208.237.143 gb -213.208.237.144 - 213.208.237.199 nl -213.208.237.200 - 213.208.237.255 gb -213.208.238.0 - 213.208.239.231 nl -213.208.239.232 - 213.208.239.239 gb -213.208.239.240 - 213.208.240.127 nl -213.208.240.128 - 213.208.240.135 be -213.208.240.136 - 213.208.240.167 nl -213.208.240.168 - 213.208.240.171 gb -213.208.240.172 - 213.208.241.79 nl -213.208.241.80 - 213.208.241.87 gb -213.208.241.88 - 213.208.241.167 nl -213.208.241.168 - 213.208.241.175 gb -213.208.241.176 - 213.208.242.71 nl -213.208.242.72 - 213.208.242.79 gb -213.208.242.80 - 213.208.242.95 nl -213.208.242.96 - 213.208.242.111 ie -213.208.242.112 - 213.208.242.119 be -213.208.242.120 - 213.208.242.127 gb -213.208.242.128 - 213.208.242.159 nl -213.208.242.160 - 213.208.242.175 gb -213.208.242.176 - 213.208.244.79 nl -213.208.244.80 - 213.208.244.87 gb -213.208.244.88 - 213.208.244.111 nl -213.208.244.112 - 213.208.244.127 gb -213.208.244.128 - 213.208.244.183 nl -213.208.244.184 - 213.208.244.191 gb -213.208.244.192 - 213.208.245.7 nl -213.208.245.8 - 213.208.245.31 gb -213.208.245.32 - 213.208.245.47 nl -213.208.245.48 - 213.208.245.55 gb -213.208.245.56 - 213.208.245.127 nl -213.208.245.128 - 213.208.245.255 gb -213.208.246.0 - 213.208.248.87 nl -213.208.248.88 - 213.208.248.95 ie -213.208.248.96 - 213.208.248.111 nl -213.208.248.112 - 213.208.248.127 gb -213.208.248.128 - 213.208.249.31 nl -213.208.249.32 - 213.208.249.47 gb -213.208.249.48 - 213.208.249.223 nl -213.208.249.224 - 213.208.249.255 gb -213.208.250.0 - 213.208.253.143 nl -213.208.253.144 - 213.208.253.151 gb -213.208.253.152 - 213.208.255.135 nl -213.208.255.136 - 213.208.255.143 gb -213.208.255.144 - 213.208.255.159 nl -213.208.255.160 - 213.208.255.175 gb -213.208.255.176 - 213.208.255.191 nl -213.208.255.192 - 213.208.255.199 gb -213.208.255.200 - 213.208.255.207 nl -213.208.255.208 - 213.208.255.215 gb -213.208.255.216 - 213.208.255.231 nl -213.208.255.232 - 213.208.255.239 gb -213.208.255.240 - 213.208.255.247 nl -213.208.255.248 - 213.208.255.255 gb +213.208.128.0 - 213.208.159.255 at +213.208.160.0 - 213.208.170.255 ru +213.208.171.0 - 213.208.171.255 ro +213.208.172.0 - 213.208.191.255 ru +213.208.192.0 - 213.208.203.255 gb +213.208.204.0 - 213.208.204.255 nl +213.208.205.0 - 213.208.205.255 gb +213.208.206.0 - 213.208.206.31 nl +213.208.206.32 - 213.208.213.63 gb +213.208.213.64 - 213.208.213.71 nl +213.208.213.72 - 213.208.217.143 gb +213.208.217.144 - 213.208.217.159 nl +213.208.217.160 - 213.208.224.255 gb +213.208.225.0 - 213.208.225.255 nl +213.208.226.0 - 213.208.229.255 gb +213.208.230.0 - 213.208.231.255 nl +213.208.232.0 - 213.208.234.87 gb +213.208.234.88 - 213.208.234.95 nl +213.208.234.96 - 213.208.238.63 gb +213.208.238.64 - 213.208.238.71 nl +213.208.238.72 - 213.208.238.159 gb +213.208.238.160 - 213.208.238.175 nl +213.208.238.176 - 213.208.239.31 gb +213.208.239.32 - 213.208.239.47 nl +213.208.239.48 - 213.208.239.111 gb +213.208.239.112 - 213.208.239.119 nl +213.208.239.120 - 213.208.249.255 gb +213.208.250.0 - 213.208.250.255 nl +213.208.251.0 - 213.208.255.255 gb 213.209.0.0 - 213.209.63.255 it 213.209.64.0 - 213.209.159.255 de -213.209.160.0 - 213.209.160.143 a2 -213.209.160.144 - 213.209.160.167 hk -213.209.160.168 - 213.209.168.3 a2 -213.209.168.4 - 213.209.168.7 ly -213.209.168.8 - 213.209.168.15 a2 -213.209.168.16 - 213.209.168.19 ly -213.209.168.20 - 213.209.168.255 a2 -213.209.169.0 - 213.209.169.11 ge -213.209.169.12 - 213.209.169.15 de -213.209.169.16 - 213.209.169.23 ge -213.209.169.24 - 213.209.169.31 fr -213.209.169.32 - 213.209.169.39 gb -213.209.169.40 - 213.209.169.43 de -213.209.169.44 - 213.209.169.47 pl -213.209.169.48 - 213.209.169.55 ge -213.209.169.56 - 213.209.169.63 is -213.209.169.64 - 213.209.169.67 nl -213.209.169.68 - 213.209.169.71 it -213.209.169.72 - 213.209.169.91 nl -213.209.169.92 - 213.209.169.95 cz -213.209.169.96 - 213.209.169.99 de -213.209.169.100 - 213.209.169.107 is -213.209.169.108 - 213.209.169.115 pl -213.209.169.116 - 213.209.169.119 de -213.209.169.120 - 213.209.169.123 iq -213.209.169.124 - 213.209.169.127 de -213.209.169.128 - 213.209.169.131 se -213.209.169.132 - 213.209.169.135 de -213.209.169.136 - 213.209.169.139 it -213.209.169.140 - 213.209.169.143 de -213.209.169.144 - 213.209.169.151 tr -213.209.169.152 - 213.209.169.155 de -213.209.169.156 - 213.209.169.159 it -213.209.169.160 - 213.209.169.163 de -213.209.169.164 - 213.209.169.167 it -213.209.169.168 - 213.209.169.179 se -213.209.169.180 - 213.209.169.183 pl -213.209.169.184 - 213.209.169.191 a2 -213.209.169.192 - 213.209.169.239 it -213.209.169.240 - 213.209.169.247 de -213.209.169.248 - 213.209.169.255 pl -213.209.170.0 - 213.209.170.7 gb -213.209.170.8 - 213.209.170.11 fr -213.209.170.12 - 213.209.170.19 pl -213.209.170.20 - 213.209.170.23 de -213.209.170.24 - 213.209.170.27 fr -213.209.170.28 - 213.209.170.31 de -213.209.170.32 - 213.209.170.39 fr -213.209.170.40 - 213.209.170.47 gb -213.209.170.48 - 213.209.170.127 it -213.209.170.128 - 213.209.170.135 nl -213.209.170.136 - 213.209.170.159 is -213.209.170.160 - 213.209.170.167 ge -213.209.170.168 - 213.209.170.171 it -213.209.170.172 - 213.209.170.175 se -213.209.170.176 - 213.209.170.255 it -213.209.171.0 - 213.209.171.7 is -213.209.171.8 - 213.209.171.15 gb -213.209.171.16 - 213.209.171.27 fr -213.209.171.28 - 213.209.171.39 gb -213.209.171.40 - 213.209.171.43 se -213.209.171.44 - 213.209.171.71 iq -213.209.171.72 - 213.209.171.79 fr -213.209.171.80 - 213.209.171.127 it -213.209.171.128 - 213.209.171.135 fr -213.209.171.136 - 213.209.171.139 de -213.209.171.140 - 213.209.171.151 it -213.209.171.152 - 213.209.171.155 fr -213.209.171.156 - 213.209.171.159 gb -213.209.171.160 - 213.209.171.175 de -213.209.171.176 - 213.209.171.255 it -213.209.172.0 - 213.209.172.255 a2 -213.209.173.0 - 213.209.173.255 it -213.209.174.0 - 213.209.174.127 ae -213.209.174.128 - 213.209.174.131 de -213.209.174.132 - 213.209.174.183 nl -213.209.174.184 - 213.209.175.127 a2 -213.209.175.128 - 213.209.175.255 de -213.209.176.0 - 213.209.176.255 fr -213.209.177.0 - 213.209.177.3 es -213.209.177.4 - 213.209.177.7 fr -213.209.177.8 - 213.209.177.15 pt -213.209.177.16 - 213.209.177.23 es -213.209.177.24 - 213.209.177.31 fr -213.209.177.32 - 213.209.177.39 a2 -213.209.177.40 - 213.209.177.43 gb -213.209.177.44 - 213.209.177.47 es -213.209.177.48 - 213.209.177.55 gb -213.209.177.56 - 213.209.177.63 es -213.209.177.64 - 213.209.177.67 a2 -213.209.177.68 - 213.209.177.71 fr -213.209.177.72 - 213.209.177.79 a2 -213.209.177.80 - 213.209.177.123 gb -213.209.177.124 - 213.209.178.255 a2 -213.209.179.0 - 213.209.179.3 fr -213.209.179.4 - 213.209.179.7 a2 -213.209.179.8 - 213.209.179.15 gb -213.209.179.16 - 213.209.179.39 a2 -213.209.179.40 - 213.209.179.51 gb -213.209.179.52 - 213.209.179.55 es -213.209.179.56 - 213.209.179.59 a2 -213.209.179.60 - 213.209.179.63 fr -213.209.179.64 - 213.209.179.255 a2 -213.209.180.0 - 213.209.180.255 it -213.209.181.0 - 213.209.181.254 gb -213.209.181.255 - 213.209.181.255 a2 -213.209.182.0 - 213.209.182.255 fr -213.209.183.0 - 213.209.183.255 a2 -213.209.184.0 - 213.209.184.3 nl -213.209.184.4 - 213.209.185.255 a2 -213.209.186.0 - 213.209.187.63 it -213.209.187.64 - 213.209.187.127 al -213.209.187.128 - 213.209.187.255 it -213.209.188.0 - 213.209.188.63 a2 -213.209.188.64 - 213.209.188.255 it -213.209.189.0 - 213.209.189.3 es -213.209.189.4 - 213.209.189.255 a2 -213.209.190.0 - 213.209.190.127 it -213.209.190.128 - 213.209.190.191 at -213.209.190.192 - 213.209.255.255 it +213.209.160.0 - 213.209.183.255 eu +213.209.184.0 - 213.209.187.255 fr +213.209.188.0 - 213.209.191.255 eu +213.209.192.0 - 213.209.255.255 it 213.210.0.0 - 213.210.63.255 gb 213.210.64.0 - 213.210.127.255 ru 213.210.128.0 - 213.210.191.255 cz @@ -148863,20 +113155,22 @@ 213.211.0.0 - 213.211.31.255 tr 213.211.32.0 - 213.211.63.255 cz 213.211.64.0 - 213.211.127.255 kz -213.211.128.0 - 213.211.129.255 nl -213.211.130.0 - 213.211.131.255 be -213.211.132.0 - 213.211.133.255 ru -213.211.134.0 - 213.211.137.255 be -213.211.138.0 - 213.211.138.255 nl -213.211.139.0 - 213.211.144.255 be -213.211.145.0 - 213.211.191.255 nl +213.211.128.0 - 213.211.144.255 be +213.211.145.0 - 213.211.150.255 nl +213.211.151.0 - 213.211.152.255 be +213.211.153.0 - 213.211.155.255 nl +213.211.156.0 - 213.211.185.255 be +213.211.186.0 - 213.211.189.255 nl +213.211.190.0 - 213.211.191.255 be 213.211.192.0 - 213.211.255.255 de -213.212.0.0 - 213.212.63.255 se -213.212.64.0 - 213.212.72.191 gb -213.212.72.192 - 213.212.72.223 de -213.212.72.224 - 213.212.96.143 gb -213.212.96.144 - 213.212.96.151 us -213.212.96.152 - 213.212.127.255 gb +213.212.0.0 - 213.212.19.255 se +213.212.20.0 - 213.212.20.255 fi +213.212.21.0 - 213.212.21.55 se +213.212.21.56 - 213.212.21.63 fi +213.212.21.64 - 213.212.21.127 se +213.212.21.128 - 213.212.21.255 fi +213.212.22.0 - 213.212.63.255 se +213.212.64.0 - 213.212.127.255 gb 213.212.128.0 - 213.212.191.255 it 213.212.192.0 - 213.212.255.255 eg 213.213.0.0 - 213.213.127.255 it @@ -148889,33 +113183,16 @@ 213.214.96.0 - 213.214.127.255 nl 213.214.128.0 - 213.214.191.255 fi 213.214.192.0 - 213.214.255.255 se -213.215.0.0 - 213.215.63.255 fr +213.215.0.0 - 213.215.37.255 fr +213.215.38.0 - 213.215.38.255 mc +213.215.39.0 - 213.215.63.255 fr 213.215.64.0 - 213.215.127.255 sk -213.215.128.0 - 213.215.179.255 it -213.215.180.0 - 213.215.180.31 fr -213.215.180.32 - 213.215.190.143 it -213.215.190.144 - 213.215.190.151 fr -213.215.190.152 - 213.215.196.167 it -213.215.196.168 - 213.215.196.175 nl -213.215.196.176 - 213.215.202.191 it -213.215.202.192 - 213.215.202.199 fr -213.215.202.200 - 213.215.242.55 it -213.215.242.56 - 213.215.242.63 a2 -213.215.242.64 - 213.215.243.103 it -213.215.243.104 - 213.215.243.111 gb -213.215.243.112 - 213.215.245.63 it -213.215.245.64 - 213.215.245.71 gb -213.215.245.72 - 213.215.250.23 it -213.215.250.24 - 213.215.250.31 de -213.215.250.32 - 213.215.250.47 it -213.215.250.48 - 213.215.250.55 fr -213.215.250.56 - 213.215.255.255 it +213.215.128.0 - 213.215.255.255 it 213.216.0.0 - 213.216.31.255 de 213.216.32.0 - 213.216.63.255 cz 213.216.64.0 - 213.216.127.255 pl 213.216.128.0 - 213.216.191.255 gb 213.216.192.0 - 213.216.255.255 fi -213.217.0.0 - 213.217.31.255 de 213.217.32.0 - 213.217.63.255 ir 213.217.64.0 - 213.217.127.255 de 213.217.128.0 - 213.217.191.255 it @@ -148925,51 +113202,40 @@ 213.218.64.0 - 213.218.79.255 nl 213.218.80.0 - 213.218.127.255 pl 213.218.128.0 - 213.218.159.255 fr -213.218.160.0 - 213.218.170.31 de -213.218.170.32 - 213.218.170.63 nl -213.218.170.64 - 213.218.173.191 de -213.218.173.192 - 213.218.173.255 ba -213.218.174.0 - 213.218.174.127 de -213.218.174.128 - 213.218.174.159 at -213.218.174.160 - 213.218.191.255 de +213.218.160.0 - 213.218.191.255 de 213.218.192.0 - 213.219.63.255 gb 213.219.64.0 - 213.219.127.255 ee -213.219.128.0 - 213.219.128.255 nl -213.219.129.0 - 213.219.175.255 be -213.219.176.0 - 213.219.179.255 nl -213.219.180.0 - 213.219.189.255 be -213.219.190.0 - 213.219.191.255 nl +213.219.128.0 - 213.219.191.255 be 213.219.192.0 - 213.219.255.255 ru 213.220.0.0 - 213.220.63.255 es 213.220.64.0 - 213.220.127.255 is 213.220.128.0 - 213.220.191.255 de 213.220.192.0 - 213.220.255.255 cz -213.221.0.0 - 213.221.4.127 ru -213.221.4.128 - 213.221.4.135 lv -213.221.4.136 - 213.221.63.255 ru -213.221.64.0 - 213.221.116.191 de -213.221.116.192 - 213.221.116.199 ch -213.221.116.200 - 213.221.127.255 de +213.221.0.0 - 213.221.63.255 ru +213.221.64.0 - 213.221.127.255 de 213.221.128.0 - 213.221.159.255 ch 213.221.160.0 - 213.221.191.255 gb 213.221.192.0 - 213.221.255.255 ch 213.222.0.0 - 213.222.31.255 nl 213.222.32.0 - 213.222.63.255 bg -213.222.64.0 - 213.222.127.255 fr +213.222.64.0 - 213.222.127.255 re 213.222.128.0 - 213.222.191.255 hu 213.222.192.0 - 213.222.223.255 pl 213.222.224.0 - 213.222.255.255 ru -213.223.0.0 - 213.223.255.255 fr +213.223.0.0 - 213.223.44.255 fr +213.223.45.0 - 213.223.46.255 re +213.223.47.0 - 213.223.255.255 fr 213.224.0.0 - 213.224.255.255 be 213.225.0.0 - 213.225.63.255 at 213.225.64.0 - 213.225.127.255 no -213.225.128.0 - 213.225.159.255 gb +213.225.128.0 - 213.225.138.255 gb +213.225.139.0 - 213.225.139.255 eu +213.225.140.0 - 213.225.159.255 gb 213.225.160.0 - 213.225.191.255 fr 213.225.192.0 - 213.225.255.255 it 213.226.0.0 - 213.226.63.255 bg -213.226.64.0 - 213.226.127.255 se -213.226.128.0 - 213.226.139.255 lt -213.226.140.0 - 213.226.141.255 lv +213.226.128.0 - 213.226.140.255 lt +213.226.141.0 - 213.226.141.255 lv 213.226.142.0 - 213.226.191.255 lt 213.226.192.0 - 213.226.255.255 cz 213.227.0.0 - 213.227.63.255 es @@ -148980,52 +113246,35 @@ 213.228.0.0 - 213.228.63.255 fr 213.228.64.0 - 213.228.127.255 ru 213.228.128.0 - 213.228.191.255 pt -213.228.192.0 - 213.228.215.127 gb -213.228.215.128 - 213.228.215.135 ie -213.228.215.136 - 213.228.252.255 gb -213.228.253.0 - 213.228.253.255 ie -213.228.254.0 - 213.228.255.191 gb -213.228.255.192 - 213.228.255.255 ie +213.228.192.0 - 213.228.255.255 gb 213.229.0.0 - 213.229.63.255 at 213.229.64.0 - 213.229.127.255 gb 213.229.128.0 - 213.229.132.23 es 213.229.132.24 - 213.229.132.31 it -213.229.132.32 - 213.229.138.95 es -213.229.138.96 - 213.229.138.127 be -213.229.138.128 - 213.229.139.255 es +213.229.132.32 - 213.229.139.255 es 213.229.140.0 - 213.229.140.255 fr 213.229.141.0 - 213.229.157.255 es 213.229.158.0 - 213.229.158.255 fr -213.229.159.0 - 213.229.171.79 es -213.229.171.80 - 213.229.171.87 it -213.229.171.88 - 213.229.191.255 es +213.229.159.0 - 213.229.191.255 es 213.229.192.0 - 213.229.255.255 si 213.230.0.0 - 213.230.31.255 sa 213.230.32.0 - 213.230.63.255 ch 213.230.64.0 - 213.230.127.255 uz 213.230.128.0 - 213.230.159.255 it -213.230.160.0 - 213.230.191.255 no +213.230.160.0 - 213.230.183.255 no +213.230.184.0 - 213.230.187.255 sg +213.230.188.0 - 213.230.191.255 hk 213.230.192.0 - 213.230.255.255 gb 213.231.0.0 - 213.231.63.255 ua 213.231.64.0 - 213.231.127.255 es 213.231.128.0 - 213.231.191.255 bg 213.231.192.0 - 213.231.255.255 pl 213.232.0.0 - 213.232.63.255 tr -213.232.64.0 - 213.232.87.127 gb -213.232.87.128 - 213.232.87.255 sl -213.232.88.0 - 213.232.95.255 gb -213.232.96.0 - 213.232.96.255 ng -213.232.97.0 - 213.232.120.191 gb -213.232.120.192 - 213.232.120.199 a2 -213.232.120.200 - 213.232.127.255 gb +213.232.64.0 - 213.232.127.255 gb 213.232.128.0 - 213.232.191.255 ch -213.232.192.0 - 213.232.200.127 ru -213.232.200.128 - 213.232.200.255 ch -213.232.201.0 - 213.232.255.255 ru +213.232.192.0 - 213.232.255.255 ru 213.233.0.0 - 213.233.63.255 it -213.233.64.0 - 213.233.124.127 ro -213.233.124.128 - 213.233.124.135 fr -213.233.124.136 - 213.233.127.255 ro +213.233.64.0 - 213.233.127.255 ro 213.233.128.0 - 213.233.159.255 ie 213.233.160.0 - 213.233.191.255 ir 213.233.192.0 - 213.233.255.255 nl @@ -149033,512 +113282,133 @@ 213.234.32.0 - 213.234.63.255 gb 213.234.64.0 - 213.234.127.255 no 213.234.128.0 - 213.234.191.255 it -213.234.192.0 - 213.234.255.255 ru +213.234.192.0 - 213.234.249.114 ru +213.234.249.115 - 213.234.249.115 a1 +213.234.249.116 - 213.234.255.255 ru 213.235.0.0 - 213.235.63.255 gb 213.235.64.0 - 213.235.191.255 cz 213.235.192.0 - 213.235.255.255 at 213.236.0.0 - 213.236.31.255 es 213.236.32.0 - 213.236.63.255 sa -213.236.64.0 - 213.236.65.159 nl -213.236.65.160 - 213.236.65.191 fr -213.236.65.192 - 213.236.80.159 nl -213.236.80.160 - 213.236.80.175 es -213.236.80.176 - 213.236.80.183 gb -213.236.80.184 - 213.236.80.199 nl -213.236.80.200 - 213.236.80.207 gb -213.236.80.208 - 213.236.80.223 de -213.236.80.224 - 213.236.81.63 nl -213.236.81.64 - 213.236.81.95 de -213.236.81.96 - 213.236.81.127 fr -213.236.81.128 - 213.236.81.191 nl -213.236.81.192 - 213.236.81.255 fr -213.236.82.0 - 213.236.91.255 es -213.236.92.0 - 213.236.92.127 be -213.236.92.128 - 213.236.93.31 nl -213.236.93.32 - 213.236.93.63 se -213.236.93.64 - 213.236.93.111 nl -213.236.93.112 - 213.236.93.127 es -213.236.93.128 - 213.236.93.175 nl -213.236.93.176 - 213.236.93.183 it -213.236.93.184 - 213.236.93.191 ch -213.236.93.192 - 213.236.93.239 nl -213.236.93.240 - 213.236.93.247 be -213.236.93.248 - 213.236.93.255 nl -213.236.94.0 - 213.236.95.255 es -213.236.96.0 - 213.236.127.255 nl -213.236.128.0 - 213.236.255.255 no -213.237.0.0 - 213.237.51.127 dk -213.237.51.128 - 213.237.51.131 se -213.237.51.132 - 213.237.191.255 dk +213.236.64.0 - 213.236.64.255 nl +213.236.65.0 - 213.236.68.143 gb +213.236.68.144 - 213.236.68.144 nl +213.236.68.145 - 213.236.80.255 gb +213.236.81.0 - 213.236.81.255 eu +213.236.82.0 - 213.236.91.255 gb +213.236.92.0 - 213.236.92.255 eu +213.236.93.0 - 213.236.127.255 gb +213.236.128.0 - 213.236.164.173 no +213.236.164.174 - 213.236.164.174 gb +213.236.164.175 - 213.236.255.255 no +213.237.0.0 - 213.237.191.255 dk 213.237.192.0 - 213.237.255.255 gb 213.238.0.0 - 213.238.31.255 ua -213.238.32.0 - 213.238.32.159 de -213.238.32.160 - 213.238.32.167 ch -213.238.32.168 - 213.238.33.3 de -213.238.33.4 - 213.238.33.7 es -213.238.33.8 - 213.238.46.239 de -213.238.46.240 - 213.238.46.255 ch -213.238.47.0 - 213.238.63.255 de +213.238.32.0 - 213.238.63.255 de 213.238.64.0 - 213.238.127.255 pl 213.238.128.0 - 213.238.191.255 tr 213.238.192.0 - 213.238.255.255 se 213.239.0.0 - 213.239.63.255 nl -213.239.64.0 - 213.239.79.79 no -213.239.79.80 - 213.239.79.95 dk -213.239.79.96 - 213.239.80.167 no -213.239.80.168 - 213.239.80.183 gb -213.239.80.184 - 213.239.127.255 no -213.239.128.0 - 213.239.149.255 nl -213.239.150.0 - 213.239.150.255 gb -213.239.151.0 - 213.239.179.255 nl -213.239.180.0 - 213.239.180.255 gr -213.239.181.0 - 213.239.188.255 nl -213.239.189.0 - 213.239.189.255 gb -213.239.190.0 - 213.239.191.255 nl -213.239.192.0 - 213.239.231.207 de -213.239.231.208 - 213.239.231.223 at -213.239.231.224 - 213.239.255.255 de +213.239.64.0 - 213.239.127.255 no +213.239.128.0 - 213.239.191.255 nl +213.239.192.0 - 213.239.255.255 de 213.240.0.0 - 213.240.63.255 rs 213.240.64.0 - 213.240.127.255 at 213.240.128.0 - 213.240.191.255 de 213.240.192.0 - 213.240.255.255 bg 213.241.0.0 - 213.241.127.255 pl -213.241.128.0 - 213.241.134.7 de -213.241.134.8 - 213.241.134.15 ci -213.241.134.16 - 213.241.191.255 de +213.241.128.0 - 213.241.191.255 de 213.241.192.0 - 213.242.63.255 ru -213.242.64.0 - 213.242.65.255 it -213.242.66.0 - 213.242.67.255 ch -213.242.68.0 - 213.242.69.255 se -213.242.70.0 - 213.242.71.255 es -213.242.72.0 - 213.242.73.255 ch -213.242.74.0 - 213.242.75.255 gb -213.242.76.0 - 213.242.76.63 fr -213.242.76.64 - 213.242.76.127 it -213.242.76.128 - 213.242.79.255 gb -213.242.80.0 - 213.242.80.47 fr -213.242.80.48 - 213.242.83.255 gb -213.242.84.0 - 213.242.84.31 ch -213.242.84.32 - 213.242.87.255 gb -213.242.88.0 - 213.242.88.255 fr -213.242.89.0 - 213.242.91.255 gb -213.242.92.0 - 213.242.93.15 fr -213.242.93.16 - 213.242.93.31 es -213.242.93.32 - 213.242.95.255 gb -213.242.96.0 - 213.242.96.47 fr -213.242.96.48 - 213.242.99.255 gb -213.242.100.0 - 213.242.100.255 ch -213.242.101.0 - 213.242.102.63 fr -213.242.102.64 - 213.242.103.255 gb -213.242.104.0 - 213.242.104.31 it -213.242.104.32 - 213.242.104.63 ch -213.242.104.64 - 213.242.104.95 se -213.242.104.96 - 213.242.104.127 es -213.242.104.128 - 213.242.104.159 ch -213.242.104.160 - 213.242.104.191 ie -213.242.104.192 - 213.242.104.223 dk -213.242.104.224 - 213.242.104.255 gb -213.242.105.0 - 213.242.106.255 ie -213.242.107.0 - 213.242.108.255 dk -213.242.109.0 - 213.242.109.127 gb -213.242.109.128 - 213.242.109.255 es -213.242.110.0 - 213.242.111.255 fr -213.242.112.0 - 213.242.112.127 pl -213.242.112.128 - 213.242.113.127 es -213.242.113.128 - 213.242.113.255 gb -213.242.114.0 - 213.242.114.255 es -213.242.115.0 - 213.242.115.255 gb -213.242.116.0 - 213.242.116.255 fr -213.242.117.0 - 213.242.117.127 pl -213.242.117.128 - 213.242.117.255 gb -213.242.118.0 - 213.242.118.255 pl -213.242.119.0 - 213.242.119.127 fr -213.242.119.128 - 213.242.127.255 gb -213.242.128.0 - 213.242.148.23 se -213.242.148.24 - 213.242.148.31 no -213.242.148.32 - 213.242.191.255 se +213.242.64.0 - 213.242.75.255 gb +213.242.76.0 - 213.242.76.255 it +213.242.77.0 - 213.242.93.63 gb +213.242.93.64 - 213.242.93.127 es +213.242.93.128 - 213.242.101.255 gb +213.242.102.0 - 213.242.102.255 ch +213.242.103.0 - 213.242.105.255 gb +213.242.106.0 - 213.242.106.255 ie +213.242.107.0 - 213.242.113.111 gb +213.242.113.112 - 213.242.113.115 es +213.242.113.116 - 213.242.127.255 gb +213.242.128.0 - 213.242.191.255 se 213.242.192.0 - 213.242.255.255 ru 213.243.0.0 - 213.243.63.255 tr -213.243.64.0 - 213.243.75.255 ru -213.243.76.0 - 213.243.76.31 tj -213.243.76.32 - 213.243.127.255 ru +213.243.64.0 - 213.243.127.255 ru 213.243.128.0 - 213.243.191.255 fi 213.243.192.0 - 213.243.255.255 it 213.244.0.0 - 213.244.31.255 fr 213.244.32.0 - 213.244.63.255 de 213.244.64.0 - 213.244.127.255 ps -213.244.128.0 - 213.244.128.95 nl -213.244.128.96 - 213.244.128.111 gb -213.244.128.112 - 213.244.128.119 nl -213.244.128.120 - 213.244.128.223 gb -213.244.128.224 - 213.244.128.239 nl -213.244.128.240 - 213.244.129.255 gb -213.244.130.0 - 213.244.130.63 nl -213.244.130.64 - 213.244.159.255 gb -213.244.160.0 - 213.244.162.127 nl -213.244.162.128 - 213.244.163.255 gb -213.244.164.0 - 213.244.167.255 nl -213.244.168.0 - 213.244.168.95 gb -213.244.168.96 - 213.244.168.255 nl -213.244.169.0 - 213.244.169.143 gb -213.244.169.144 - 213.244.169.159 nl -213.244.169.160 - 213.244.170.15 gb -213.244.170.16 - 213.244.170.127 nl -213.244.170.128 - 213.244.170.255 gb -213.244.171.0 - 213.244.171.223 nl -213.244.171.224 - 213.244.171.255 gb -213.244.172.0 - 213.244.175.47 nl -213.244.175.48 - 213.244.175.63 gb -213.244.175.64 - 213.244.177.255 nl -213.244.178.0 - 213.244.179.31 gb -213.244.179.32 - 213.244.179.47 nl -213.244.179.48 - 213.244.179.127 gb -213.244.179.128 - 213.244.179.255 nl -213.244.180.0 - 213.244.181.127 gb -213.244.181.128 - 213.244.181.143 nl -213.244.181.144 - 213.244.182.255 gb -213.244.183.0 - 213.244.185.127 nl -213.244.185.128 - 213.244.185.255 gb -213.244.186.0 - 213.244.188.63 nl -213.244.188.64 - 213.244.189.255 gb -213.244.190.0 - 213.244.190.255 nl -213.244.191.0 - 213.244.191.255 gb -213.244.192.0 - 213.244.255.255 rs +213.244.128.0 - 213.244.167.255 gb +213.244.168.0 - 213.244.168.255 nl +213.244.169.0 - 213.244.176.127 gb +213.244.176.128 - 213.244.176.255 nl +213.244.177.0 - 213.244.191.255 gb +213.244.192.0 - 213.244.192.255 de +213.244.193.0 - 213.244.193.255 nl +213.244.194.0 - 213.244.195.255 ch +213.244.196.0 - 213.244.239.255 rs +213.244.240.0 - 213.244.247.255 se +213.244.248.0 - 213.244.255.255 rs 213.245.0.0 - 213.245.255.255 fr 213.246.0.0 - 213.246.31.255 ru -213.246.32.0 - 213.246.44.159 fr -213.246.44.160 - 213.246.44.175 mq -213.246.44.176 - 213.246.46.111 fr -213.246.46.112 - 213.246.46.127 mq -213.246.46.128 - 213.246.63.255 fr +213.246.32.0 - 213.246.63.255 fr 213.246.64.0 - 213.246.191.255 gb -213.246.192.0 - 213.246.196.239 be -213.246.196.240 - 213.246.196.247 fr -213.246.196.248 - 213.246.197.47 be -213.246.197.48 - 213.246.197.51 lu -213.246.197.52 - 213.246.197.87 be -213.246.197.88 - 213.246.197.95 gb -213.246.197.96 - 213.246.199.39 be -213.246.199.40 - 213.246.199.47 at -213.246.199.48 - 213.246.199.159 be -213.246.199.160 - 213.246.199.167 gb -213.246.199.168 - 213.246.200.7 be -213.246.200.8 - 213.246.200.15 fr -213.246.200.16 - 213.246.200.71 be -213.246.200.72 - 213.246.200.79 gb -213.246.200.80 - 213.246.200.199 be -213.246.200.200 - 213.246.200.207 gb -213.246.200.208 - 213.246.200.215 fr -213.246.200.216 - 213.246.200.239 be -213.246.200.240 - 213.246.200.247 fr -213.246.200.248 - 213.246.201.255 be -213.246.202.0 - 213.246.202.7 es -213.246.202.8 - 213.246.202.23 fr -213.246.202.24 - 213.246.202.47 be -213.246.202.48 - 213.246.202.55 gb -213.246.202.56 - 213.246.202.63 fr -213.246.202.64 - 213.246.202.79 be -213.246.202.80 - 213.246.202.87 es -213.246.202.88 - 213.246.202.111 be -213.246.202.112 - 213.246.202.119 gb -213.246.202.120 - 213.246.202.127 es -213.246.202.128 - 213.246.202.151 be -213.246.202.152 - 213.246.202.159 gb -213.246.202.160 - 213.246.202.167 be -213.246.202.168 - 213.246.202.191 gb -213.246.202.192 - 213.246.202.207 be -213.246.202.208 - 213.246.202.223 gb -213.246.202.224 - 213.246.202.239 be -213.246.202.240 - 213.246.202.247 gb -213.246.202.248 - 213.246.203.7 be -213.246.203.8 - 213.246.203.15 gb -213.246.203.16 - 213.246.203.47 be -213.246.203.48 - 213.246.203.55 fr -213.246.203.56 - 213.246.203.63 be -213.246.203.64 - 213.246.203.71 it -213.246.203.72 - 213.246.203.103 be -213.246.203.104 - 213.246.203.111 gb -213.246.203.112 - 213.246.203.119 fr -213.246.203.120 - 213.246.203.151 gb -213.246.203.152 - 213.246.203.163 be -213.246.203.164 - 213.246.203.171 gb -213.246.203.172 - 213.246.203.183 be -213.246.203.184 - 213.246.203.199 gb -213.246.203.200 - 213.246.203.207 be -213.246.203.208 - 213.246.203.215 gb -213.246.203.216 - 213.246.203.223 es -213.246.203.224 - 213.246.203.231 be -213.246.203.232 - 213.246.203.239 gb -213.246.203.240 - 213.246.204.71 be -213.246.204.72 - 213.246.204.79 gb -213.246.204.80 - 213.246.204.143 be -213.246.204.144 - 213.246.204.159 gb -213.246.204.160 - 213.246.204.167 fr -213.246.204.168 - 213.246.204.191 gb -213.246.204.192 - 213.246.204.207 be -213.246.204.208 - 213.246.204.223 fr -213.246.204.224 - 213.246.205.55 be -213.246.205.56 - 213.246.205.63 gb -213.246.205.64 - 213.246.206.255 be -213.246.207.0 - 213.246.207.7 gb -213.246.207.8 - 213.246.207.11 be -213.246.207.12 - 213.246.207.27 gb -213.246.207.28 - 213.246.207.47 be -213.246.207.48 - 213.246.207.55 gb -213.246.207.56 - 213.246.207.95 be -213.246.207.96 - 213.246.207.111 gb -213.246.207.112 - 213.246.207.167 be +213.246.192.0 - 213.246.207.167 be 213.246.207.168 - 213.246.207.175 fr -213.246.207.176 - 213.246.207.255 be -213.246.208.0 - 213.246.208.31 gb -213.246.208.32 - 213.246.208.47 be -213.246.208.48 - 213.246.208.55 fr -213.246.208.56 - 213.246.208.63 be -213.246.208.64 - 213.246.208.79 gb -213.246.208.80 - 213.246.208.87 be -213.246.208.88 - 213.246.208.95 fr -213.246.208.96 - 213.246.208.151 be -213.246.208.152 - 213.246.208.159 gb -213.246.208.160 - 213.246.208.167 be -213.246.208.168 - 213.246.208.175 fr -213.246.208.176 - 213.246.208.191 be -213.246.208.192 - 213.246.208.199 fr -213.246.208.200 - 213.246.208.207 gb -213.246.208.208 - 213.246.208.223 fr -213.246.208.224 - 213.246.208.231 be -213.246.208.232 - 213.246.208.247 fr -213.246.208.248 - 213.246.209.15 be -213.246.209.16 - 213.246.209.23 de -213.246.209.24 - 213.246.209.63 be -213.246.209.64 - 213.246.209.71 es -213.246.209.72 - 213.246.209.79 gb -213.246.209.80 - 213.246.209.255 be -213.246.210.0 - 213.246.210.7 gb -213.246.210.8 - 213.246.210.15 be -213.246.210.16 - 213.246.210.23 gb -213.246.210.24 - 213.246.210.79 be -213.246.210.80 - 213.246.210.87 fr -213.246.210.88 - 213.246.210.167 be -213.246.210.168 - 213.246.210.175 gb -213.246.210.176 - 213.246.210.211 be -213.246.210.212 - 213.246.210.219 gb -213.246.210.220 - 213.246.211.63 be -213.246.211.64 - 213.246.211.71 gb -213.246.211.72 - 213.246.211.79 fr -213.246.211.80 - 213.246.211.103 be -213.246.211.104 - 213.246.211.111 gb -213.246.211.112 - 213.246.211.143 be -213.246.211.144 - 213.246.211.151 fr -213.246.211.152 - 213.246.215.71 be -213.246.215.72 - 213.246.215.79 fr -213.246.215.80 - 213.246.215.127 be -213.246.215.128 - 213.246.215.135 es -213.246.215.136 - 213.246.216.39 be -213.246.216.40 - 213.246.216.47 es -213.246.216.48 - 213.246.216.111 be -213.246.216.112 - 213.246.216.127 nl -213.246.216.128 - 213.246.216.191 be -213.246.216.192 - 213.246.216.207 es -213.246.216.208 - 213.246.217.255 be -213.246.218.0 - 213.246.218.7 fr -213.246.218.8 - 213.246.218.23 gb -213.246.218.24 - 213.246.218.31 be -213.246.218.32 - 213.246.218.47 fr -213.246.218.48 - 213.246.218.55 gb -213.246.218.56 - 213.246.218.119 be -213.246.218.120 - 213.246.218.135 gb -213.246.218.136 - 213.246.220.63 be -213.246.220.64 - 213.246.220.79 gb -213.246.220.80 - 213.246.221.55 be -213.246.221.56 - 213.246.221.63 pt -213.246.221.64 - 213.246.221.223 be -213.246.221.224 - 213.246.221.255 gb -213.246.222.0 - 213.246.222.103 be -213.246.222.104 - 213.246.222.111 ie -213.246.222.112 - 213.246.222.151 be -213.246.222.152 - 213.246.222.159 ie -213.246.222.160 - 213.246.222.215 be -213.246.222.216 - 213.246.222.223 gb -213.246.222.224 - 213.246.223.7 be -213.246.223.8 - 213.246.223.15 lu -213.246.223.16 - 213.246.223.47 be -213.246.223.48 - 213.246.223.55 fr -213.246.223.56 - 213.246.223.95 be -213.246.223.96 - 213.246.223.103 fr -213.246.223.104 - 213.246.223.159 be -213.246.223.160 - 213.246.223.167 gb -213.246.223.168 - 213.246.224.159 be -213.246.224.160 - 213.246.224.167 fr -213.246.224.168 - 213.246.224.215 be -213.246.224.216 - 213.246.224.223 fr -213.246.224.224 - 213.246.224.247 be -213.246.224.248 - 213.246.224.255 fr -213.246.225.0 - 213.246.225.7 be -213.246.225.8 - 213.246.225.15 gb -213.246.225.16 - 213.246.225.23 be -213.246.225.24 - 213.246.225.31 gb -213.246.225.32 - 213.246.225.71 be -213.246.225.72 - 213.246.225.79 gb -213.246.225.80 - 213.246.227.31 be -213.246.227.32 - 213.246.227.39 fr -213.246.227.40 - 213.246.237.199 be -213.246.237.200 - 213.246.237.207 es -213.246.237.208 - 213.246.237.215 gb -213.246.237.216 - 213.246.239.39 be -213.246.239.40 - 213.246.239.47 gb -213.246.239.48 - 213.246.239.63 be -213.246.239.64 - 213.246.239.71 gb -213.246.239.72 - 213.246.249.63 be -213.246.249.64 - 213.246.249.79 de -213.246.249.80 - 213.246.251.255 be -213.246.252.0 - 213.246.252.63 lu -213.246.252.64 - 213.246.255.23 be -213.246.255.24 - 213.246.255.31 de -213.246.255.32 - 213.246.255.255 be -213.247.0.0 - 213.247.31.255 eg -213.247.32.0 - 213.247.32.95 nl -213.247.32.96 - 213.247.32.103 at -213.247.32.104 - 213.247.33.127 nl -213.247.33.128 - 213.247.33.191 ie -213.247.33.192 - 213.247.35.98 nl -213.247.35.99 - 213.247.35.100 us -213.247.35.101 - 213.247.40.255 nl -213.247.41.0 - 213.247.41.63 be -213.247.41.64 - 213.247.41.223 nl -213.247.41.224 - 213.247.41.255 be -213.247.42.0 - 213.247.45.167 nl -213.247.45.168 - 213.247.45.175 de -213.247.45.176 - 213.247.45.255 nl +213.246.207.176 - 213.246.255.255 be +213.247.0.0 - 213.247.15.255 za +213.247.16.0 - 213.247.19.255 eg +213.247.20.0 - 213.247.31.255 za +213.247.32.0 - 213.247.45.255 nl 213.247.46.0 - 213.247.47.255 us -213.247.48.0 - 213.247.49.127 nl -213.247.49.128 - 213.247.49.159 es -213.247.49.160 - 213.247.127.255 nl -213.247.128.0 - 213.248.63.255 ru -213.248.64.0 - 213.248.105.255 eu -213.248.106.0 - 213.248.106.255 se -213.248.107.0 - 213.248.107.255 fr -213.248.108.0 - 213.248.108.63 eu -213.248.108.64 - 213.248.108.95 de -213.248.108.96 - 213.248.108.127 eu -213.248.108.128 - 213.248.109.255 de -213.248.110.0 - 213.248.110.15 fr -213.248.110.16 - 213.248.110.31 eu -213.248.110.32 - 213.248.110.63 de -213.248.110.64 - 213.248.111.255 fr -213.248.112.0 - 213.248.112.31 se -213.248.112.32 - 213.248.112.63 nl -213.248.112.64 - 213.248.112.127 eu +213.247.48.0 - 213.247.127.255 nl +213.247.128.0 - 213.248.40.255 ru +213.248.41.0 - 213.248.41.255 pl +213.248.42.0 - 213.248.63.255 ru +213.248.64.0 - 213.248.100.255 eu +213.248.101.0 - 213.248.101.255 de +213.248.102.0 - 213.248.104.157 eu +213.248.104.158 - 213.248.104.158 at +213.248.104.159 - 213.248.107.255 eu +213.248.108.0 - 213.248.108.63 de +213.248.108.64 - 213.248.108.127 eu +213.248.108.128 - 213.248.108.255 de +213.248.109.0 - 213.248.112.127 eu 213.248.112.128 - 213.248.113.127 nl 213.248.113.128 - 213.248.113.255 es -213.248.114.0 - 213.248.114.63 gb -213.248.114.64 - 213.248.115.255 eu -213.248.116.0 - 213.248.119.255 gb -213.248.120.0 - 213.248.121.255 de -213.248.122.0 - 213.248.123.255 us -213.248.124.0 - 213.248.127.255 fr +213.248.114.0 - 213.248.115.127 eu +213.248.115.128 - 213.248.115.255 de +213.248.116.0 - 213.248.117.255 gb +213.248.118.0 - 213.248.127.255 eu 213.248.128.0 - 213.248.191.255 tr 213.248.192.0 - 213.248.255.255 gb 213.249.0.0 - 213.249.63.255 gr 213.249.64.0 - 213.249.95.255 nl -213.249.96.0 - 213.249.96.127 be -213.249.96.128 - 213.249.96.255 gb -213.249.97.0 - 213.249.97.63 be -213.249.97.64 - 213.249.97.127 gb -213.249.97.128 - 213.249.97.255 be -213.249.98.0 - 213.249.98.127 gb -213.249.98.128 - 213.249.100.255 be -213.249.101.0 - 213.249.102.31 gb -213.249.102.32 - 213.249.102.47 be -213.249.102.48 - 213.249.255.255 gb +213.249.96.0 - 213.249.255.255 gb 213.250.0.0 - 213.250.63.255 si 213.250.64.0 - 213.250.127.255 fi -213.250.128.0 - 213.250.157.31 es -213.250.157.32 - 213.250.157.47 ca -213.250.157.48 - 213.250.191.255 es +213.250.128.0 - 213.250.191.255 es 213.250.192.0 - 213.250.255.255 cz -213.251.0.0 - 213.251.1.255 gb -213.251.2.0 - 213.251.2.255 nl -213.251.3.0 - 213.251.3.247 gb -213.251.3.248 - 213.251.3.255 nl -213.251.4.0 - 213.251.63.255 gb +213.251.0.0 - 213.251.7.255 gb +213.251.8.0 - 213.251.8.15 es +213.251.8.16 - 213.251.63.255 gb 213.251.64.0 - 213.251.127.255 be -213.251.128.0 - 213.251.145.95 fr -213.251.145.96 - 213.251.145.111 au -213.251.145.112 - 213.251.191.255 fr +213.251.128.0 - 213.251.191.255 fr 213.251.192.0 - 213.251.255.255 ru 213.252.0.0 - 213.252.63.255 de 213.252.64.0 - 213.252.127.255 ru 213.252.128.0 - 213.252.191.255 de -213.252.192.0 - 213.252.198.255 lt -213.252.199.0 - 213.252.199.255 lv -213.252.200.0 - 213.252.255.255 lt +213.252.192.0 - 213.252.255.255 lt 213.253.0.0 - 213.253.63.255 gb -213.253.64.0 - 213.253.91.231 si -213.253.91.232 - 213.253.91.239 hr -213.253.91.240 - 213.253.103.63 si -213.253.103.64 - 213.253.103.79 hr -213.253.103.80 - 213.253.109.255 si -213.253.110.0 - 213.253.110.31 hr -213.253.110.32 - 213.253.110.39 si -213.253.110.40 - 213.253.110.47 hr -213.253.110.48 - 213.253.110.95 si -213.253.110.96 - 213.253.112.71 hr -213.253.112.72 - 213.253.112.79 si -213.253.112.80 - 213.253.112.119 hr -213.253.112.120 - 213.253.112.127 rs -213.253.112.128 - 213.253.112.143 hr -213.253.112.144 - 213.253.112.159 si -213.253.112.160 - 213.253.113.55 hr -213.253.113.56 - 213.253.113.63 si -213.253.113.64 - 213.253.113.127 hr -213.253.113.128 - 213.253.113.143 si -213.253.113.144 - 213.253.113.175 hr -213.253.113.176 - 213.253.113.191 si -213.253.113.192 - 213.253.114.143 hr -213.253.114.144 - 213.253.114.151 si -213.253.114.152 - 213.253.114.159 hr -213.253.114.160 - 213.253.114.239 si -213.253.114.240 - 213.253.115.255 hr -213.253.116.0 - 213.253.116.31 rs -213.253.116.32 - 213.253.116.39 si -213.253.116.40 - 213.253.116.47 rs -213.253.116.48 - 213.253.116.143 si -213.253.116.144 - 213.253.116.159 rs -213.253.116.160 - 213.253.116.175 si -213.253.116.176 - 213.253.116.255 rs -213.253.117.0 - 213.253.117.63 si -213.253.117.64 - 213.253.117.111 rs -213.253.117.112 - 213.253.117.119 si -213.253.117.120 - 213.253.117.159 rs -213.253.117.160 - 213.253.117.175 si -213.253.117.176 - 213.253.117.183 rs -213.253.117.184 - 213.253.117.191 si -213.253.117.192 - 213.253.117.199 rs -213.253.117.200 - 213.253.117.207 si -213.253.117.208 - 213.253.117.215 rs -213.253.117.216 - 213.253.117.255 si -213.253.118.0 - 213.253.118.15 rs -213.253.118.16 - 213.253.118.31 si -213.253.118.32 - 213.253.118.127 rs -213.253.118.128 - 213.253.118.255 si -213.253.119.0 - 213.253.120.7 rs -213.253.120.8 - 213.253.120.23 si -213.253.120.24 - 213.253.120.31 rs -213.253.120.32 - 213.253.120.71 si -213.253.120.72 - 213.253.120.79 rs -213.253.120.80 - 213.253.120.95 me -213.253.120.96 - 213.253.120.103 rs -213.253.120.104 - 213.253.120.111 si -213.253.120.112 - 213.253.120.143 rs -213.253.120.144 - 213.253.120.191 si -213.253.120.192 - 213.253.120.199 rs -213.253.120.200 - 213.253.120.255 si -213.253.121.0 - 213.253.123.255 rs -213.253.124.0 - 213.253.127.255 si +213.253.64.0 - 213.253.111.255 si +213.253.112.0 - 213.253.115.255 hr +213.253.116.0 - 213.253.119.255 rs +213.253.120.0 - 213.253.120.255 si +213.253.121.0 - 213.253.121.255 rs +213.253.122.0 - 213.253.127.255 si 213.253.128.0 - 213.253.191.255 gb -213.253.192.0 - 213.253.199.55 hu -213.253.199.56 - 213.253.199.63 mk -213.253.199.64 - 213.253.255.255 hu +213.253.192.0 - 213.253.255.255 hu 213.254.0.0 - 213.254.31.255 it 213.254.32.0 - 213.254.63.255 de 213.254.64.0 - 213.254.127.255 es @@ -149546,397 +113416,45 @@ 213.254.160.0 - 213.254.191.255 gb 213.254.192.0 - 213.254.199.255 us 213.254.200.0 - 213.254.200.255 de -213.254.201.0 - 213.254.201.255 it -213.254.202.0 - 213.254.202.255 fr -213.254.203.0 - 213.254.203.15 be -213.254.203.16 - 213.254.203.23 fr -213.254.203.24 - 213.254.203.63 be -213.254.203.64 - 213.254.203.191 fr +213.254.201.0 - 213.254.203.135 fr +213.254.203.136 - 213.254.203.151 gb +213.254.203.152 - 213.254.203.191 fr 213.254.203.192 - 213.254.204.63 us -213.254.204.64 - 213.254.204.127 fr -213.254.204.128 - 213.254.204.191 gb -213.254.204.192 - 213.254.207.31 fr -213.254.207.32 - 213.254.207.63 au -213.254.207.64 - 213.254.207.127 fr -213.254.207.128 - 213.254.207.143 de -213.254.207.144 - 213.254.207.255 fr -213.254.208.0 - 213.254.209.255 us -213.254.210.0 - 213.254.210.127 de -213.254.210.128 - 213.254.210.143 it -213.254.210.144 - 213.254.210.151 de -213.254.210.152 - 213.254.210.159 fr -213.254.210.160 - 213.254.210.191 it -213.254.210.192 - 213.254.210.255 fr +213.254.204.64 - 213.254.210.136 fr +213.254.210.137 - 213.254.210.137 it +213.254.210.138 - 213.254.210.191 fr +213.254.210.192 - 213.254.210.207 gb +213.254.210.208 - 213.254.210.255 fr 213.254.211.0 - 213.254.211.63 us -213.254.211.64 - 213.254.211.127 it +213.254.211.64 - 213.254.211.127 fr 213.254.211.128 - 213.254.211.255 us -213.254.212.0 - 213.254.212.63 it +213.254.212.0 - 213.254.212.63 fr 213.254.212.64 - 213.254.212.127 us -213.254.212.128 - 213.254.212.255 it -213.254.213.0 - 213.254.213.7 gb -213.254.213.8 - 213.254.213.31 fr +213.254.212.128 - 213.254.213.31 fr 213.254.213.32 - 213.254.213.63 a1 -213.254.213.64 - 213.254.215.255 fr -213.254.216.0 - 213.254.217.255 us -213.254.218.0 - 213.254.219.255 es -213.254.220.0 - 213.254.221.255 ie -213.254.222.0 - 213.254.222.255 fr -213.254.223.0 - 213.254.223.255 gr -213.254.224.0 - 213.254.224.255 ie -213.254.225.0 - 213.254.226.255 fr -213.254.227.0 - 213.254.227.255 de -213.254.228.0 - 213.254.228.63 fr -213.254.228.64 - 213.254.228.127 us +213.254.213.64 - 213.254.213.79 fr +213.254.213.80 - 213.254.213.83 ie +213.254.213.84 - 213.254.228.127 fr 213.254.228.128 - 213.254.228.255 nl -213.254.229.0 - 213.254.229.191 fr -213.254.229.192 - 213.254.230.255 es -213.254.231.0 - 213.254.231.255 fr -213.254.232.0 - 213.254.233.255 gb -213.254.234.0 - 213.254.234.255 de -213.254.235.0 - 213.254.235.63 fr -213.254.235.64 - 213.254.235.95 us -213.254.235.96 - 213.254.237.255 fr -213.254.238.0 - 213.254.238.31 de -213.254.238.32 - 213.254.238.47 fr -213.254.238.48 - 213.254.238.55 ru -213.254.238.56 - 213.254.238.63 fr -213.254.238.64 - 213.254.238.191 us -213.254.238.192 - 213.254.239.127 fr -213.254.239.128 - 213.254.239.255 es -213.254.240.0 - 213.254.241.63 fr -213.254.241.64 - 213.254.241.127 es -213.254.241.128 - 213.254.241.191 de -213.254.241.192 - 213.254.241.199 fr -213.254.241.200 - 213.254.241.223 es -213.254.241.224 - 213.254.241.255 fr -213.254.242.0 - 213.254.242.255 es -213.254.243.0 - 213.254.244.255 fr -213.254.245.0 - 213.254.245.255 us +213.254.229.0 - 213.254.244.255 fr +213.254.245.0 - 213.254.245.63 us +213.254.245.64 - 213.254.245.255 fr 213.254.246.0 - 213.254.246.255 es -213.254.247.0 - 213.254.247.255 fr -213.254.248.0 - 213.254.248.63 us -213.254.248.64 - 213.254.248.79 be -213.254.248.80 - 213.254.248.95 fr +213.254.247.0 - 213.254.248.95 fr 213.254.248.96 - 213.254.248.127 be 213.254.248.128 - 213.254.249.255 us -213.254.250.0 - 213.254.253.255 de -213.254.254.0 - 213.254.254.211 fr -213.254.254.212 - 213.254.254.215 de -213.254.254.216 - 213.254.254.255 fr -213.254.255.0 - 213.254.255.15 gb -213.254.255.16 - 213.254.255.31 fr -213.254.255.32 - 213.254.255.63 us -213.254.255.64 - 213.254.255.127 fr +213.254.250.0 - 213.254.255.127 fr 213.254.255.128 - 213.254.255.255 us 213.255.0.0 - 213.255.127.255 it 213.255.128.0 - 213.255.159.255 eg 213.255.160.0 - 213.255.191.255 fi -213.255.192.0 - 213.255.192.63 a2 -213.255.192.64 - 213.255.192.95 ua -213.255.192.96 - 213.255.192.111 a2 -213.255.192.112 - 213.255.192.127 ng -213.255.192.128 - 213.255.192.151 a2 -213.255.192.152 - 213.255.192.155 so -213.255.192.156 - 213.255.192.191 a2 -213.255.192.192 - 213.255.192.207 ug -213.255.192.208 - 213.255.192.215 ng -213.255.192.216 - 213.255.192.223 a2 -213.255.192.224 - 213.255.192.231 so -213.255.192.232 - 213.255.192.239 rw -213.255.192.240 - 213.255.192.247 iq -213.255.192.248 - 213.255.192.255 a2 -213.255.193.0 - 213.255.193.7 iq -213.255.193.8 - 213.255.193.23 a2 -213.255.193.24 - 213.255.193.31 iq -213.255.193.32 - 213.255.193.39 a2 -213.255.193.40 - 213.255.193.47 iq -213.255.193.48 - 213.255.193.79 a2 -213.255.193.80 - 213.255.193.95 iq -213.255.193.96 - 213.255.193.103 a2 -213.255.193.104 - 213.255.193.142 iq -213.255.193.143 - 213.255.193.151 a2 -213.255.193.152 - 213.255.193.191 iq -213.255.193.192 - 213.255.193.207 a2 -213.255.193.208 - 213.255.193.215 so -213.255.193.216 - 213.255.193.223 iq -213.255.193.224 - 213.255.193.231 a2 -213.255.193.232 - 213.255.193.247 iq -213.255.193.248 - 213.255.193.255 a2 -213.255.194.0 - 213.255.194.15 iq -213.255.194.16 - 213.255.194.23 a2 -213.255.194.24 - 213.255.194.39 iq -213.255.194.40 - 213.255.194.47 a2 -213.255.194.48 - 213.255.194.55 iq -213.255.194.56 - 213.255.194.63 a2 -213.255.194.64 - 213.255.194.79 iq -213.255.194.80 - 213.255.194.87 a2 -213.255.194.88 - 213.255.194.103 iq -213.255.194.104 - 213.255.194.127 a2 -213.255.194.128 - 213.255.194.135 iq -213.255.194.136 - 213.255.194.167 a2 -213.255.194.168 - 213.255.194.175 iq -213.255.194.176 - 213.255.194.183 a2 -213.255.194.184 - 213.255.194.191 iq -213.255.194.192 - 213.255.194.199 a2 -213.255.194.200 - 213.255.194.207 iq -213.255.194.208 - 213.255.194.215 a2 -213.255.194.216 - 213.255.194.231 iq -213.255.194.232 - 213.255.194.255 a2 -213.255.195.0 - 213.255.195.127 ng -213.255.195.128 - 213.255.195.135 a2 -213.255.195.136 - 213.255.195.139 so -213.255.195.140 - 213.255.195.159 a2 -213.255.195.160 - 213.255.195.167 rw -213.255.195.168 - 213.255.195.175 za -213.255.195.176 - 213.255.195.191 zw -213.255.195.192 - 213.255.195.199 gb -213.255.195.200 - 213.255.195.207 zm -213.255.195.208 - 213.255.195.215 ke -213.255.195.216 - 213.255.195.223 so -213.255.195.224 - 213.255.195.247 a2 -213.255.195.248 - 213.255.195.255 ng -213.255.196.0 - 213.255.196.87 a2 +213.255.192.0 - 213.255.196.87 a2 213.255.196.88 - 213.255.196.95 gh -213.255.196.96 - 213.255.196.135 a2 -213.255.196.136 - 213.255.196.143 ug -213.255.196.144 - 213.255.196.175 a2 -213.255.196.176 - 213.255.196.191 zw -213.255.196.192 - 213.255.196.199 cd -213.255.196.200 - 213.255.196.207 a2 -213.255.196.208 - 213.255.196.215 mw -213.255.196.216 - 213.255.196.239 ng -213.255.196.240 - 213.255.196.247 zw -213.255.196.248 - 213.255.197.131 a2 -213.255.197.132 - 213.255.197.135 so -213.255.197.136 - 213.255.198.135 a2 -213.255.198.136 - 213.255.198.143 ao -213.255.198.144 - 213.255.198.151 ng -213.255.198.152 - 213.255.198.159 cm -213.255.198.160 - 213.255.198.167 so -213.255.198.168 - 213.255.198.175 am -213.255.198.176 - 213.255.198.199 a2 -213.255.198.200 - 213.255.198.207 us -213.255.198.208 - 213.255.198.239 a2 -213.255.198.240 - 213.255.198.247 ug -213.255.198.248 - 213.255.198.255 a2 -213.255.199.0 - 213.255.199.15 iq -213.255.199.16 - 213.255.199.39 a2 -213.255.199.40 - 213.255.199.55 iq -213.255.199.56 - 213.255.199.79 a2 -213.255.199.80 - 213.255.199.87 iq -213.255.199.88 - 213.255.199.95 a2 -213.255.199.96 - 213.255.199.127 iq -213.255.199.128 - 213.255.199.143 a2 -213.255.199.144 - 213.255.199.159 iq -213.255.199.160 - 213.255.199.167 a2 -213.255.199.168 - 213.255.199.175 iq -213.255.199.176 - 213.255.199.183 a2 -213.255.199.184 - 213.255.199.207 iq -213.255.199.208 - 213.255.199.231 a2 -213.255.199.232 - 213.255.199.239 iq -213.255.199.240 - 213.255.199.247 a2 -213.255.199.248 - 213.255.199.255 iq -213.255.200.0 - 213.255.200.255 a2 -213.255.201.0 - 213.255.201.31 iq -213.255.201.32 - 213.255.201.39 lr -213.255.201.40 - 213.255.201.47 a2 -213.255.201.48 - 213.255.201.71 iq -213.255.201.72 - 213.255.201.79 a2 -213.255.201.80 - 213.255.201.111 iq -213.255.201.112 - 213.255.201.127 a2 -213.255.201.128 - 213.255.201.135 iq -213.255.201.136 - 213.255.201.143 a2 -213.255.201.144 - 213.255.201.159 iq -213.255.201.160 - 213.255.201.167 a2 -213.255.201.168 - 213.255.201.175 iq -213.255.201.176 - 213.255.201.183 a2 -213.255.201.184 - 213.255.201.191 ng -213.255.201.192 - 213.255.201.215 a2 -213.255.201.216 - 213.255.201.223 iq -213.255.201.224 - 213.255.201.231 a2 -213.255.201.232 - 213.255.201.247 iq -213.255.201.248 - 213.255.202.255 a2 -213.255.203.0 - 213.255.203.255 gb -213.255.204.0 - 213.255.204.7 iq -213.255.204.8 - 213.255.204.39 a2 -213.255.204.40 - 213.255.204.47 iq -213.255.204.48 - 213.255.204.55 a2 -213.255.204.56 - 213.255.204.95 iq -213.255.204.96 - 213.255.204.119 a2 -213.255.204.120 - 213.255.204.127 iq -213.255.204.128 - 213.255.204.143 a2 -213.255.204.144 - 213.255.204.151 iq -213.255.204.152 - 213.255.204.167 a2 -213.255.204.168 - 213.255.204.175 iq -213.255.204.176 - 213.255.204.191 a2 -213.255.204.192 - 213.255.204.199 iq -213.255.204.200 - 213.255.204.207 a2 -213.255.204.208 - 213.255.204.223 iq -213.255.204.224 - 213.255.204.231 a2 -213.255.204.232 - 213.255.204.255 iq -213.255.205.0 - 213.255.205.7 a2 -213.255.205.8 - 213.255.205.15 cd -213.255.205.16 - 213.255.205.31 a2 -213.255.205.32 - 213.255.205.39 sd -213.255.205.40 - 213.255.205.47 cd -213.255.205.48 - 213.255.205.55 a2 -213.255.205.56 - 213.255.205.63 cd -213.255.205.64 - 213.255.205.87 a2 -213.255.205.88 - 213.255.205.95 zw -213.255.205.96 - 213.255.205.103 a2 -213.255.205.104 - 213.255.205.111 sd -213.255.205.112 - 213.255.205.119 ng -213.255.205.120 - 213.255.205.127 a2 -213.255.205.128 - 213.255.205.135 lr -213.255.205.136 - 213.255.205.143 a2 -213.255.205.144 - 213.255.205.151 cd -213.255.205.152 - 213.255.205.159 ci -213.255.205.160 - 213.255.205.167 cd -213.255.205.168 - 213.255.205.175 sd -213.255.205.176 - 213.255.205.183 ly -213.255.205.184 - 213.255.205.191 cd -213.255.205.192 - 213.255.205.199 ly -213.255.205.200 - 213.255.205.215 cd -213.255.205.216 - 213.255.205.223 ng -213.255.205.224 - 213.255.205.255 a2 -213.255.206.0 - 213.255.206.255 gb -213.255.207.0 - 213.255.207.255 yt -213.255.208.0 - 213.255.210.255 mw -213.255.211.0 - 213.255.211.95 a2 -213.255.211.96 - 213.255.211.103 ke -213.255.211.104 - 213.255.211.191 a2 -213.255.211.192 - 213.255.211.199 za -213.255.211.200 - 213.255.211.207 ao -213.255.211.208 - 213.255.211.215 ng -213.255.211.216 - 213.255.211.223 a2 -213.255.211.224 - 213.255.211.239 ug -213.255.211.240 - 213.255.211.247 a2 -213.255.211.248 - 213.255.211.255 ke -213.255.212.0 - 213.255.218.127 a2 -213.255.218.128 - 213.255.218.143 et -213.255.218.144 - 213.255.218.159 gh -213.255.218.160 - 213.255.218.175 a2 -213.255.218.176 - 213.255.218.183 ug -213.255.218.184 - 213.255.218.191 a2 -213.255.218.192 - 213.255.218.223 gb -213.255.218.224 - 213.255.218.231 tg -213.255.218.232 - 213.255.218.239 ug -213.255.218.240 - 213.255.218.247 ng -213.255.218.248 - 213.255.219.135 a2 -213.255.219.136 - 213.255.219.143 ng -213.255.219.144 - 213.255.219.151 a2 -213.255.219.152 - 213.255.219.159 ke -213.255.219.160 - 213.255.219.175 a2 -213.255.219.176 - 213.255.219.191 ng -213.255.219.192 - 213.255.219.215 a2 -213.255.219.216 - 213.255.219.221 yt -213.255.219.222 - 213.255.219.223 a2 -213.255.219.224 - 213.255.219.231 ug -213.255.219.232 - 213.255.223.255 a2 -213.255.224.0 - 213.255.224.7 tz -213.255.224.8 - 213.255.224.15 a2 -213.255.224.16 - 213.255.224.23 gh -213.255.224.24 - 213.255.224.39 iq -213.255.224.40 - 213.255.224.47 a2 -213.255.224.48 - 213.255.224.55 lb -213.255.224.56 - 213.255.224.95 a2 -213.255.224.96 - 213.255.224.119 ng -213.255.224.120 - 213.255.224.159 a2 -213.255.224.160 - 213.255.224.167 iq -213.255.224.168 - 213.255.224.199 a2 -213.255.224.200 - 213.255.224.207 lb -213.255.224.208 - 213.255.224.239 a2 -213.255.224.240 - 213.255.224.247 iq -213.255.224.248 - 213.255.226.23 a2 -213.255.226.24 - 213.255.226.31 iq -213.255.226.32 - 213.255.226.47 a2 -213.255.226.48 - 213.255.226.55 iq -213.255.226.56 - 213.255.226.119 a2 -213.255.226.120 - 213.255.226.127 ly -213.255.226.128 - 213.255.226.183 a2 -213.255.226.184 - 213.255.226.191 lb -213.255.226.192 - 213.255.227.255 a2 -213.255.228.0 - 213.255.228.255 ng -213.255.229.0 - 213.255.229.31 ao -213.255.229.32 - 213.255.229.127 a2 -213.255.229.128 - 213.255.229.135 am -213.255.229.136 - 213.255.229.143 lb -213.255.229.144 - 213.255.229.151 iq -213.255.229.152 - 213.255.229.159 a2 -213.255.229.160 - 213.255.229.167 mw -213.255.229.168 - 213.255.229.183 a2 -213.255.229.184 - 213.255.229.191 lb -213.255.229.192 - 213.255.229.215 a2 -213.255.229.216 - 213.255.229.231 iq -213.255.229.232 - 213.255.231.127 a2 -213.255.231.128 - 213.255.231.223 ua -213.255.231.224 - 213.255.236.63 a2 -213.255.236.64 - 213.255.236.127 ae -213.255.236.128 - 213.255.236.231 a2 -213.255.236.232 - 213.255.236.255 ae -213.255.237.0 - 213.255.237.63 a2 -213.255.237.64 - 213.255.237.95 ae -213.255.237.96 - 213.255.239.95 a2 -213.255.239.96 - 213.255.239.127 ae -213.255.239.128 - 213.255.240.71 a2 -213.255.240.72 - 213.255.240.79 iq -213.255.240.80 - 213.255.240.103 a2 -213.255.240.104 - 213.255.240.111 iq -213.255.240.112 - 213.255.240.175 a2 -213.255.240.176 - 213.255.240.191 iq -213.255.240.192 - 213.255.240.207 a2 -213.255.240.208 - 213.255.240.215 ug -213.255.240.216 - 213.255.240.223 a2 -213.255.240.224 - 213.255.240.231 iq -213.255.240.232 - 213.255.240.247 a2 -213.255.240.248 - 213.255.240.255 iq -213.255.241.0 - 213.255.246.15 a2 -213.255.246.16 - 213.255.246.23 cm -213.255.246.24 - 213.255.246.31 a2 -213.255.246.32 - 213.255.246.47 zw -213.255.246.48 - 213.255.247.23 a2 -213.255.247.24 - 213.255.247.39 iq -213.255.247.40 - 213.255.247.47 a2 -213.255.247.48 - 213.255.247.63 tr -213.255.247.64 - 213.255.247.87 a2 -213.255.247.88 - 213.255.247.95 iq -213.255.247.96 - 213.255.247.143 a2 -213.255.247.144 - 213.255.247.151 iq -213.255.247.152 - 213.255.247.191 a2 -213.255.247.192 - 213.255.247.199 bj -213.255.247.200 - 213.255.247.231 a2 -213.255.247.232 - 213.255.247.239 ly -213.255.247.240 - 213.255.247.255 a2 -213.255.248.0 - 213.255.248.63 iq -213.255.248.64 - 213.255.248.159 a2 -213.255.248.160 - 213.255.248.175 mg -213.255.248.176 - 213.255.248.215 a2 -213.255.248.216 - 213.255.248.223 iq -213.255.248.224 - 213.255.248.239 ao -213.255.248.240 - 213.255.248.247 a2 -213.255.248.248 - 213.255.248.255 ng -213.255.249.0 - 213.255.249.127 lb -213.255.249.128 - 213.255.249.175 a2 -213.255.249.176 - 213.255.249.255 lb -213.255.250.0 - 213.255.251.255 iq -213.255.252.0 - 213.255.253.255 mw -213.255.254.0 - 213.255.254.191 a2 -213.255.254.192 - 213.255.254.199 cd -213.255.254.200 - 213.255.255.15 a2 -213.255.255.16 - 213.255.255.23 ng -213.255.255.24 - 213.255.255.31 a2 -213.255.255.32 - 213.255.255.39 lr -213.255.255.40 - 213.255.255.47 a2 -213.255.255.48 - 213.255.255.55 ng -213.255.255.56 - 213.255.255.63 zw -213.255.255.64 - 213.255.255.199 a2 -213.255.255.200 - 213.255.255.207 bw -213.255.255.208 - 213.255.255.215 lr -213.255.255.216 - 213.255.255.223 sd -213.255.255.224 - 213.255.255.231 vg -213.255.255.232 - 213.255.255.239 a2 -213.255.255.240 - 213.255.255.247 cd -213.255.255.248 - 213.255.255.255 ng +213.255.196.96 - 213.255.211.231 a2 +213.255.211.232 - 213.255.211.239 ug +213.255.211.240 - 213.255.231.127 a2 +213.255.231.128 - 213.255.231.191 ua +213.255.231.192 - 213.255.255.255 a2 214.0.0.0 - 216.0.47.255 us 216.0.48.0 - 216.0.48.255 za 216.0.49.0 - 216.0.49.255 us @@ -149953,691 +113471,102 @@ 216.5.192.0 - 216.5.199.255 za 216.5.200.0 - 216.5.255.255 us 216.6.0.0 - 216.6.1.255 sy -216.6.2.0 - 216.6.2.31 us -216.6.2.32 - 216.6.2.255 ca +216.6.2.0 - 216.6.2.63 us +216.6.2.64 - 216.6.2.67 ca +216.6.2.68 - 216.6.2.255 us 216.6.3.0 - 216.6.3.255 dz -216.6.4.0 - 216.6.15.255 ca -216.6.16.0 - 216.6.16.255 us -216.6.17.0 - 216.6.28.31 ca -216.6.28.32 - 216.6.28.47 bd -216.6.28.48 - 216.6.35.255 ca +216.6.4.0 - 216.6.35.255 us 216.6.36.0 - 216.6.36.255 ht -216.6.37.0 - 216.6.43.255 ca -216.6.44.0 - 216.6.47.255 us -216.6.48.0 - 216.6.63.255 ca +216.6.37.0 - 216.6.49.255 us +216.6.50.0 - 216.6.50.255 ca +216.6.51.0 - 216.6.61.255 us +216.6.62.0 - 216.6.62.255 ca +216.6.63.0 - 216.6.63.255 us 216.6.64.0 - 216.6.71.255 in 216.6.72.0 - 216.6.79.255 ca -216.6.80.0 - 216.6.80.255 mf -216.6.81.0 - 216.6.81.255 us -216.6.82.0 - 216.6.86.255 ca -216.6.87.0 - 216.6.87.255 us -216.6.88.0 - 216.6.89.255 ca -216.6.90.0 - 216.6.90.255 us -216.6.91.0 - 216.6.93.255 ca +216.6.80.0 - 216.6.80.255 gp +216.6.81.0 - 216.6.91.8 us +216.6.91.9 - 216.6.91.9 sg +216.6.91.10 - 216.6.91.255 us +216.6.92.0 - 216.6.92.255 ca +216.6.93.0 - 216.6.93.255 us 216.6.94.0 - 216.6.94.255 ly -216.6.95.0 - 216.6.98.255 ca -216.6.99.0 - 216.6.99.255 us +216.6.95.0 - 216.6.95.255 us +216.6.96.0 - 216.6.96.255 ca +216.6.97.0 - 216.6.99.255 us 216.6.100.0 - 216.6.103.255 co 216.6.104.0 - 216.6.107.255 ph -216.6.108.0 - 216.6.109.255 ca +216.6.108.0 - 216.6.109.255 us 216.6.110.0 - 216.6.110.255 ly -216.6.111.0 - 216.6.122.255 ca -216.6.123.0 - 216.6.123.255 us -216.6.124.0 - 216.6.124.127 ca -216.6.124.128 - 216.6.124.143 za -216.6.124.144 - 216.6.127.255 ca -216.6.128.0 - 216.6.191.255 us +216.6.111.0 - 216.6.118.255 us +216.6.119.0 - 216.6.119.255 ca +216.6.120.0 - 216.6.124.255 us +216.6.125.0 - 216.6.125.255 ca +216.6.126.0 - 216.6.191.255 us 216.6.192.0 - 216.6.207.255 ca -216.6.208.0 - 216.6.229.15 us -216.6.229.16 - 216.6.229.23 ca -216.6.229.24 - 216.7.79.255 us +216.6.208.0 - 216.7.79.255 us 216.7.80.0 - 216.7.80.255 kn 216.7.81.0 - 216.7.86.255 us -216.7.87.0 - 216.7.90.255 an -216.7.91.0 - 216.7.144.159 us -216.7.144.160 - 216.7.144.167 gb -216.7.144.168 - 216.7.144.175 us -216.7.144.176 - 216.7.144.183 es -216.7.144.184 - 216.7.144.191 de -216.7.144.192 - 216.7.145.15 us -216.7.145.16 - 216.7.145.23 es -216.7.145.24 - 216.7.145.31 us -216.7.145.32 - 216.7.145.71 es -216.7.145.72 - 216.7.145.151 us -216.7.145.152 - 216.7.145.159 cy -216.7.145.160 - 216.7.150.63 us -216.7.150.64 - 216.7.150.71 nl -216.7.150.72 - 216.7.150.215 us -216.7.150.216 - 216.7.150.223 gb -216.7.150.224 - 216.7.151.183 us -216.7.151.184 - 216.7.151.199 es -216.7.151.200 - 216.7.151.215 cy -216.7.151.216 - 216.7.151.239 gb -216.7.151.240 - 216.7.152.15 us +216.7.87.0 - 216.7.90.255 cw +216.7.91.0 - 216.7.152.15 us 216.7.152.16 - 216.7.152.23 au 216.7.152.24 - 216.7.152.31 us 216.7.152.32 - 216.7.152.39 pt -216.7.152.40 - 216.7.152.247 us -216.7.152.248 - 216.7.152.255 nl -216.7.153.0 - 216.7.153.79 us -216.7.153.80 - 216.7.153.103 gb -216.7.153.104 - 216.7.155.231 us -216.7.155.232 - 216.7.155.235 gb -216.7.155.236 - 216.7.156.255 us -216.7.157.0 - 216.7.157.255 a2 -216.7.158.0 - 216.7.158.7 us +216.7.152.40 - 216.7.158.7 us 216.7.158.8 - 216.7.158.15 gb 216.7.158.16 - 216.7.158.23 us 216.7.158.24 - 216.7.158.31 gb 216.7.158.32 - 216.7.158.47 us 216.7.158.48 - 216.7.158.55 gb -216.7.158.56 - 216.7.158.63 us -216.7.158.64 - 216.7.158.79 es -216.7.158.80 - 216.7.158.143 us -216.7.158.144 - 216.7.158.151 es -216.7.158.152 - 216.7.158.183 us -216.7.158.184 - 216.7.158.191 gb -216.7.158.192 - 216.7.158.199 us -216.7.158.200 - 216.7.158.207 gb -216.7.158.208 - 216.7.158.231 us -216.7.158.232 - 216.7.158.239 gb -216.7.158.240 - 216.7.163.255 us -216.7.164.0 - 216.7.164.7 sg -216.7.164.8 - 216.7.168.7 us -216.7.168.8 - 216.7.168.31 ca -216.7.168.32 - 216.7.168.39 gb -216.7.168.40 - 216.7.168.95 us -216.7.168.96 - 216.7.168.103 hk -216.7.168.104 - 216.7.168.111 us -216.7.168.112 - 216.7.168.119 be -216.7.168.120 - 216.7.168.127 us -216.7.168.128 - 216.7.168.135 ca -216.7.168.136 - 216.7.169.15 us -216.7.169.16 - 216.7.169.23 au -216.7.169.24 - 216.7.169.79 us -216.7.169.80 - 216.7.169.87 ca -216.7.169.88 - 216.7.169.95 cy -216.7.169.96 - 216.7.169.127 us -216.7.169.128 - 216.7.169.135 gb -216.7.169.136 - 216.7.169.159 us -216.7.169.160 - 216.7.169.167 om -216.7.169.168 - 216.7.169.183 us -216.7.169.184 - 216.7.169.191 ar -216.7.169.192 - 216.7.170.7 us -216.7.170.8 - 216.7.170.15 sa -216.7.170.16 - 216.7.170.39 gb -216.7.170.40 - 216.7.170.55 tw -216.7.170.56 - 216.7.172.127 us -216.7.172.128 - 216.7.172.143 my -216.7.172.144 - 216.7.172.191 us -216.7.172.192 - 216.7.172.207 gb -216.7.172.208 - 216.7.173.111 us -216.7.173.112 - 216.7.173.127 in -216.7.173.128 - 216.7.173.159 us -216.7.173.160 - 216.7.173.191 au -216.7.173.192 - 216.7.173.207 us -216.7.173.208 - 216.7.173.223 ca -216.7.173.224 - 216.7.174.79 us -216.7.174.80 - 216.7.174.95 ro -216.7.174.96 - 216.7.178.95 us -216.7.178.96 - 216.7.178.111 gb -216.7.178.112 - 216.7.178.127 pt -216.7.178.128 - 216.7.184.255 us -216.7.185.0 - 216.7.185.255 ca -216.7.186.0 - 216.7.191.255 us +216.7.158.56 - 216.7.191.255 us 216.7.192.0 - 216.7.223.255 ca -216.7.224.0 - 216.8.127.255 us -216.8.128.0 - 216.8.139.136 ca -216.8.139.137 - 216.8.139.137 us -216.8.139.138 - 216.8.159.223 ca -216.8.159.224 - 216.8.159.231 us -216.8.159.232 - 216.8.159.255 ca +216.7.224.0 - 216.7.255.255 us +216.8.0.0 - 216.8.31.255 jp +216.8.32.0 - 216.8.127.255 us +216.8.128.0 - 216.8.159.255 ca 216.8.160.0 - 216.8.160.15 us -216.8.160.16 - 216.8.161.143 ca -216.8.161.144 - 216.8.161.159 us -216.8.161.160 - 216.8.161.183 ca -216.8.161.184 - 216.8.161.191 us -216.8.161.192 - 216.8.161.199 ca -216.8.161.200 - 216.8.161.207 us -216.8.161.208 - 216.8.191.255 ca +216.8.160.16 - 216.8.191.255 ca 216.8.192.0 - 216.9.47.255 us 216.9.48.0 - 216.9.63.255 ca -216.9.64.0 - 216.9.255.255 us +216.9.64.0 - 216.9.239.255 us +216.9.240.0 - 216.9.255.255 ca 216.10.0.0 - 216.10.0.255 pa -216.10.1.0 - 216.10.7.255 ca -216.10.8.0 - 216.10.48.255 us +216.10.1.0 - 216.10.48.255 us 216.10.49.0 - 216.10.49.255 a2 -216.10.50.0 - 216.10.50.127 us -216.10.50.128 - 216.10.50.175 a2 -216.10.50.176 - 216.10.50.191 us -216.10.50.192 - 216.10.50.199 a2 -216.10.50.200 - 216.10.50.255 us -216.10.51.0 - 216.10.51.7 a2 -216.10.51.8 - 216.10.51.15 us -216.10.51.16 - 216.10.51.47 a2 -216.10.51.48 - 216.10.51.95 us -216.10.51.96 - 216.10.51.103 a2 -216.10.51.104 - 216.10.51.111 us -216.10.51.112 - 216.10.51.119 a2 -216.10.51.120 - 216.10.51.127 us -216.10.51.128 - 216.10.51.143 a2 -216.10.51.144 - 216.10.51.167 us -216.10.51.168 - 216.10.51.183 a2 -216.10.51.184 - 216.10.51.191 as -216.10.51.192 - 216.10.51.255 us -216.10.52.0 - 216.10.52.255 a2 -216.10.53.0 - 216.10.53.7 us -216.10.53.8 - 216.10.53.63 a2 -216.10.53.64 - 216.10.53.127 us -216.10.53.128 - 216.10.53.159 a2 -216.10.53.160 - 216.10.53.255 us -216.10.54.0 - 216.10.54.7 a2 -216.10.54.8 - 216.10.54.23 us -216.10.54.24 - 216.10.54.31 a2 -216.10.54.32 - 216.10.54.55 us -216.10.54.56 - 216.10.54.79 a2 -216.10.54.80 - 216.10.54.127 us -216.10.54.128 - 216.10.54.167 a2 -216.10.54.168 - 216.10.54.191 us -216.10.54.192 - 216.10.54.199 a2 -216.10.54.200 - 216.10.54.223 us -216.10.54.224 - 216.10.54.247 a2 -216.10.54.248 - 216.10.54.255 us -216.10.55.0 - 216.10.55.255 a2 -216.10.56.0 - 216.10.56.7 us -216.10.56.8 - 216.10.57.71 a2 -216.10.57.72 - 216.10.57.79 us -216.10.57.80 - 216.10.57.95 a2 -216.10.57.96 - 216.10.57.103 us -216.10.57.104 - 216.10.57.127 a2 -216.10.57.128 - 216.10.58.71 us -216.10.58.72 - 216.10.58.95 a2 -216.10.58.96 - 216.10.58.111 us -216.10.58.112 - 216.10.58.159 a2 -216.10.58.160 - 216.10.58.183 us -216.10.58.184 - 216.10.58.199 a2 -216.10.58.200 - 216.10.58.215 us -216.10.58.216 - 216.10.58.223 a2 -216.10.58.224 - 216.10.58.239 us -216.10.58.240 - 216.10.58.247 a2 -216.10.58.248 - 216.10.60.7 us -216.10.60.8 - 216.10.60.95 a2 -216.10.60.96 - 216.10.60.103 us -216.10.60.104 - 216.10.60.207 a2 -216.10.60.208 - 216.10.60.239 us -216.10.60.240 - 216.10.62.255 a2 +216.10.50.0 - 216.10.51.255 us +216.10.52.0 - 216.10.54.255 a2 +216.10.55.0 - 216.10.55.255 us +216.10.56.0 - 216.10.62.255 a2 216.10.63.0 - 216.10.207.255 us 216.10.208.0 - 216.10.223.255 jm -216.10.224.0 - 216.12.191.255 us -216.12.192.0 - 216.12.193.127 sg -216.12.193.128 - 216.12.193.143 us -216.12.193.144 - 216.12.193.159 sg -216.12.193.160 - 216.12.193.183 us -216.12.193.184 - 216.12.193.191 sg -216.12.193.192 - 216.12.193.223 us -216.12.193.224 - 216.12.193.247 sg -216.12.193.248 - 216.12.193.255 us -216.12.194.0 - 216.12.195.15 sg -216.12.195.16 - 216.12.195.63 us -216.12.195.64 - 216.12.195.95 sg -216.12.195.96 - 216.12.195.159 us -216.12.195.160 - 216.12.195.175 sg -216.12.195.176 - 216.12.195.255 us -216.12.196.0 - 216.12.197.127 sg -216.12.197.128 - 216.12.197.135 us -216.12.197.136 - 216.12.197.223 sg -216.12.197.224 - 216.12.197.255 us -216.12.198.0 - 216.12.199.191 sg -216.12.199.192 - 216.12.199.223 au -216.12.199.224 - 216.12.199.255 sg -216.12.200.0 - 216.12.207.255 us -216.12.208.0 - 216.12.208.255 sg -216.12.209.0 - 216.12.209.255 us -216.12.210.0 - 216.12.210.15 sg -216.12.210.16 - 216.12.210.31 au -216.12.210.32 - 216.12.212.63 sg -216.12.212.64 - 216.12.212.71 us -216.12.212.72 - 216.12.212.175 sg -216.12.212.176 - 216.12.212.183 au -216.12.212.184 - 216.12.213.127 sg -216.12.213.128 - 216.12.213.135 us -216.12.213.136 - 216.12.213.255 sg -216.12.214.0 - 216.12.217.255 us -216.12.218.0 - 216.12.218.255 sg -216.12.219.0 - 216.12.219.255 us -216.12.220.0 - 216.12.221.31 sg -216.12.221.32 - 216.12.221.63 us -216.12.221.64 - 216.12.221.191 sg -216.12.221.192 - 216.12.221.199 cn -216.12.221.200 - 216.12.221.255 sg -216.12.222.0 - 216.12.255.255 us +216.10.224.0 - 216.10.227.255 us +216.10.228.0 - 216.10.233.255 ca +216.10.234.0 - 216.12.191.255 us +216.12.192.0 - 216.12.223.255 sg +216.12.224.0 - 216.12.255.255 us 216.13.0.0 - 216.13.255.255 ca -216.14.0.0 - 216.14.84.15 us -216.14.84.16 - 216.14.84.23 ca -216.14.84.24 - 216.14.95.255 us -216.14.96.0 - 216.14.96.63 cy -216.14.96.64 - 216.14.99.191 us -216.14.99.192 - 216.14.99.199 gb -216.14.99.200 - 216.14.113.9 us -216.14.113.10 - 216.14.113.14 br -216.14.113.15 - 216.14.121.160 us -216.14.121.161 - 216.14.121.163 rs -216.14.121.164 - 216.14.127.255 us +216.14.0.0 - 216.14.127.255 us 216.14.128.0 - 216.14.143.255 ca 216.14.144.0 - 216.14.191.255 us 216.14.192.0 - 216.14.207.255 au -216.14.208.0 - 216.15.130.79 us -216.15.130.80 - 216.15.130.95 tz -216.15.130.96 - 216.15.130.127 us -216.15.130.128 - 216.15.130.143 de -216.15.130.144 - 216.15.130.159 us -216.15.130.160 - 216.15.130.175 in -216.15.130.176 - 216.15.130.191 us -216.15.130.192 - 216.15.130.207 ve -216.15.130.208 - 216.15.133.31 us -216.15.133.32 - 216.15.133.63 my -216.15.133.64 - 216.15.133.191 us -216.15.133.192 - 216.15.133.223 in -216.15.133.224 - 216.15.133.255 us -216.15.134.0 - 216.15.134.255 ca -216.15.135.0 - 216.15.135.127 us -216.15.135.128 - 216.15.135.159 in -216.15.135.160 - 216.15.135.191 at -216.15.135.192 - 216.15.136.255 us -216.15.137.0 - 216.15.137.63 in -216.15.137.64 - 216.15.138.255 us -216.15.139.0 - 216.15.139.127 ca -216.15.139.128 - 216.15.139.255 us -216.15.140.0 - 216.15.140.127 ca -216.15.140.128 - 216.15.140.255 us -216.15.141.0 - 216.15.141.255 in -216.15.142.0 - 216.15.142.255 us -216.15.143.0 - 216.15.143.255 ca -216.15.144.0 - 216.15.144.255 us -216.15.145.0 - 216.15.145.255 au -216.15.146.0 - 216.15.146.255 ca -216.15.147.0 - 216.15.147.255 us -216.15.148.0 - 216.15.148.255 au -216.15.149.0 - 216.15.151.255 us -216.15.152.0 - 216.15.152.31 au -216.15.152.32 - 216.15.152.63 be -216.15.152.64 - 216.15.152.127 us -216.15.152.128 - 216.15.152.159 ca -216.15.152.160 - 216.15.152.223 us -216.15.152.224 - 216.15.152.255 de -216.15.153.0 - 216.15.153.39 us -216.15.153.40 - 216.15.153.47 ca -216.15.153.48 - 216.15.153.87 us -216.15.153.88 - 216.15.153.95 fr -216.15.153.96 - 216.15.153.103 us -216.15.153.104 - 216.15.153.111 ca -216.15.153.112 - 216.15.153.239 us -216.15.153.240 - 216.15.153.247 in -216.15.153.248 - 216.15.154.159 us -216.15.154.160 - 216.15.154.191 ca -216.15.154.192 - 216.15.154.223 be -216.15.154.224 - 216.15.156.255 us -216.15.157.0 - 216.15.157.31 in -216.15.157.32 - 216.15.157.63 my -216.15.157.64 - 216.15.157.223 us -216.15.157.224 - 216.15.157.255 in -216.15.158.0 - 216.15.158.127 us -216.15.158.128 - 216.15.158.255 my -216.15.159.0 - 216.15.159.255 us -216.15.160.0 - 216.15.160.127 in -216.15.160.128 - 216.15.160.255 ca -216.15.161.0 - 216.15.161.31 us -216.15.161.32 - 216.15.161.63 ca -216.15.161.64 - 216.15.161.159 us -216.15.161.160 - 216.15.161.191 hk -216.15.161.192 - 216.15.163.31 us -216.15.163.32 - 216.15.163.63 ca -216.15.163.64 - 216.15.163.95 us -216.15.163.96 - 216.15.163.159 ca -216.15.163.160 - 216.15.163.255 us -216.15.164.0 - 216.15.164.127 ca -216.15.164.128 - 216.15.164.255 us -216.15.165.0 - 216.15.167.255 ca -216.15.168.0 - 216.15.168.63 in -216.15.168.64 - 216.15.168.127 us -216.15.168.128 - 216.15.168.191 ca -216.15.168.192 - 216.15.169.63 in -216.15.169.64 - 216.15.169.127 us -216.15.169.128 - 216.15.169.255 ca -216.15.170.0 - 216.15.170.255 us -216.15.171.0 - 216.15.171.255 ca -216.15.172.0 - 216.15.173.255 us -216.15.174.0 - 216.15.174.255 ca -216.15.175.0 - 216.15.175.255 us -216.15.176.0 - 216.15.176.127 ca -216.15.176.128 - 216.15.176.255 tw -216.15.177.0 - 216.15.177.31 fr -216.15.177.32 - 216.15.177.63 us -216.15.177.64 - 216.15.177.95 ca -216.15.177.96 - 216.15.178.127 us -216.15.178.128 - 216.15.178.191 in -216.15.178.192 - 216.15.178.254 my -216.15.178.255 - 216.15.178.255 us -216.15.179.0 - 216.15.179.31 in -216.15.179.32 - 216.15.179.63 us -216.15.179.64 - 216.15.179.95 ca -216.15.179.96 - 216.15.179.159 us -216.15.179.160 - 216.15.179.191 in -216.15.179.192 - 216.15.179.225 us -216.15.179.226 - 216.15.179.255 in -216.15.180.0 - 216.15.180.127 us -216.15.180.128 - 216.15.180.255 sg -216.15.181.0 - 216.15.181.127 ca -216.15.181.128 - 216.15.181.255 us -216.15.182.0 - 216.15.182.31 ca -216.15.182.32 - 216.15.182.95 us -216.15.182.96 - 216.15.182.127 in -216.15.182.128 - 216.15.182.159 ca -216.15.182.160 - 216.15.182.191 us -216.15.182.192 - 216.15.182.223 ca -216.15.182.224 - 216.15.183.15 us -216.15.183.16 - 216.15.183.31 my -216.15.183.32 - 216.15.183.63 us -216.15.183.64 - 216.15.183.78 ca -216.15.183.79 - 216.15.183.95 us -216.15.183.96 - 216.15.183.143 ca -216.15.183.144 - 216.15.183.239 us -216.15.183.240 - 216.15.183.255 ca -216.15.184.0 - 216.15.186.159 us -216.15.186.160 - 216.15.186.191 au -216.15.186.192 - 216.15.186.255 us -216.15.187.0 - 216.15.187.254 my -216.15.187.255 - 216.15.187.255 us -216.15.188.0 - 216.15.188.127 ca -216.15.188.128 - 216.15.188.255 us -216.15.189.0 - 216.15.189.31 ca -216.15.189.32 - 216.15.189.63 us -216.15.189.64 - 216.15.189.95 ca -216.15.189.96 - 216.15.189.127 be -216.15.189.128 - 216.15.189.191 us -216.15.189.192 - 216.15.189.223 fr -216.15.189.224 - 216.15.190.255 us -216.15.191.0 - 216.15.191.31 ca -216.15.191.32 - 216.15.191.95 us -216.15.191.96 - 216.15.191.127 ca -216.15.191.128 - 216.15.191.159 us -216.15.191.160 - 216.15.191.191 tz -216.15.191.192 - 216.15.191.223 us -216.15.191.224 - 216.15.191.255 au -216.15.192.0 - 216.15.192.63 us -216.15.192.64 - 216.15.192.127 in -216.15.192.128 - 216.15.192.159 fr -216.15.192.160 - 216.15.192.191 ca -216.15.192.192 - 216.15.192.255 us -216.15.193.0 - 216.15.193.31 ca -216.15.193.32 - 216.15.193.63 us -216.15.193.64 - 216.15.193.95 my -216.15.193.96 - 216.15.193.127 be -216.15.193.128 - 216.15.193.159 ca -216.15.193.160 - 216.15.193.223 us -216.15.193.224 - 216.15.194.255 ca -216.15.195.0 - 216.15.195.31 us -216.15.195.32 - 216.15.195.35 ru -216.15.195.36 - 216.15.196.127 us -216.15.196.128 - 216.15.196.255 ca -216.15.197.0 - 216.15.199.39 us -216.15.199.40 - 216.15.199.47 in -216.15.199.48 - 216.15.199.87 us -216.15.199.88 - 216.15.199.95 tt -216.15.199.96 - 216.15.199.119 us -216.15.199.120 - 216.15.199.127 my -216.15.199.128 - 216.15.200.63 us -216.15.200.64 - 216.15.200.191 in -216.15.200.192 - 216.15.201.95 us -216.15.201.96 - 216.15.201.127 ca -216.15.201.128 - 216.15.201.159 us -216.15.201.160 - 216.15.201.191 ca -216.15.201.192 - 216.15.201.223 pk -216.15.201.224 - 216.15.201.255 us -216.15.202.0 - 216.15.202.127 ca -216.15.202.128 - 216.15.202.255 in -216.15.203.0 - 216.15.204.127 us -216.15.204.128 - 216.15.204.159 in -216.15.204.160 - 216.15.204.223 us -216.15.204.224 - 216.15.204.255 gb -216.15.205.0 - 216.15.205.95 us -216.15.205.96 - 216.15.205.127 ca -216.15.205.128 - 216.15.205.159 us -216.15.205.160 - 216.15.205.191 ca -216.15.205.192 - 216.15.205.223 in -216.15.205.224 - 216.15.206.255 us -216.15.207.0 - 216.15.207.255 be -216.15.208.0 - 216.15.208.127 ca -216.15.208.128 - 216.15.209.255 us -216.15.210.0 - 216.15.210.31 ca -216.15.210.32 - 216.15.211.191 us -216.15.211.192 - 216.15.211.223 hk -216.15.211.224 - 216.15.212.255 us -216.15.213.0 - 216.15.214.255 ca -216.15.215.0 - 216.15.216.255 us -216.15.217.0 - 216.15.217.255 au -216.15.218.0 - 216.15.219.159 us -216.15.219.160 - 216.15.219.191 ca -216.15.219.192 - 216.15.219.223 us -216.15.219.224 - 216.15.219.255 ca -216.15.220.0 - 216.15.221.255 us -216.15.222.0 - 216.15.223.31 ca -216.15.223.32 - 216.15.223.63 us -216.15.223.64 - 216.15.223.91 in -216.15.223.92 - 216.15.223.159 us -216.15.223.160 - 216.15.223.191 ca -216.15.223.192 - 216.15.223.223 us -216.15.223.224 - 216.15.223.255 my -216.15.224.0 - 216.15.224.31 us -216.15.224.32 - 216.15.224.63 be -216.15.224.64 - 216.15.224.255 us -216.15.225.0 - 216.15.225.127 ca -216.15.225.128 - 216.15.225.255 in -216.15.226.0 - 216.15.227.159 us -216.15.227.160 - 216.15.227.191 be -216.15.227.192 - 216.15.227.223 ca -216.15.227.224 - 216.15.227.255 tz -216.15.228.0 - 216.15.228.127 ca -216.15.228.128 - 216.15.228.255 in -216.15.229.0 - 216.15.230.127 ca -216.15.230.128 - 216.15.230.255 in -216.15.231.0 - 216.15.231.127 ca -216.15.231.128 - 216.15.231.255 in -216.15.232.0 - 216.15.232.127 pk -216.15.232.128 - 216.15.232.255 ca -216.15.233.0 - 216.15.234.255 us -216.15.235.0 - 216.15.235.255 ca -216.15.236.0 - 216.15.236.31 us -216.15.236.32 - 216.15.236.63 fr -216.15.236.64 - 216.15.236.95 my -216.15.236.96 - 216.15.236.127 fr -216.15.236.128 - 216.15.236.223 us -216.15.236.224 - 216.15.236.255 fr -216.15.237.0 - 216.15.237.127 in -216.15.237.128 - 216.15.237.255 be -216.15.238.0 - 216.15.238.63 ca -216.15.238.64 - 216.15.238.159 us -216.15.238.160 - 216.15.238.191 cn -216.15.238.192 - 216.15.238.223 fr -216.15.238.224 - 216.15.238.255 us -216.15.239.0 - 216.15.239.255 in -216.15.240.0 - 216.15.240.127 ca -216.15.240.128 - 216.15.240.255 us -216.15.241.0 - 216.15.241.127 ca -216.15.241.128 - 216.15.241.255 us -216.15.242.0 - 216.15.242.127 ca -216.15.242.128 - 216.15.242.255 us -216.15.243.0 - 216.15.243.31 ca -216.15.243.32 - 216.15.243.63 us -216.15.243.64 - 216.15.243.95 in -216.15.243.96 - 216.15.243.191 us -216.15.243.192 - 216.15.243.223 ca -216.15.243.224 - 216.15.244.127 us -216.15.244.128 - 216.15.246.31 ca -216.15.246.32 - 216.15.246.223 us -216.15.246.224 - 216.15.246.255 ca -216.15.247.0 - 216.15.247.126 us -216.15.247.127 - 216.15.249.255 ca -216.15.250.0 - 216.15.252.127 us -216.15.252.128 - 216.15.252.255 tz -216.15.253.0 - 216.15.253.63 ca -216.15.253.64 - 216.15.253.127 us -216.15.253.128 - 216.15.253.191 in -216.15.253.192 - 216.15.254.255 ca -216.15.255.0 - 216.15.255.63 us -216.15.255.64 - 216.15.255.95 hk -216.15.255.96 - 216.15.255.191 us -216.15.255.192 - 216.15.255.223 th -216.15.255.224 - 216.16.223.255 us -216.16.224.0 - 216.16.230.255 ca -216.16.231.0 - 216.16.231.31 us -216.16.231.32 - 216.16.246.223 ca -216.16.246.224 - 216.16.246.255 us -216.16.247.0 - 216.16.249.247 ca -216.16.249.248 - 216.16.249.255 us -216.16.250.0 - 216.16.255.255 ca -216.17.0.0 - 216.17.37.111 us -216.17.37.112 - 216.17.37.127 ca -216.17.37.128 - 216.17.193.151 us -216.17.193.152 - 216.17.193.159 it -216.17.193.160 - 216.17.255.255 us +216.14.208.0 - 216.16.223.255 us +216.16.224.0 - 216.16.255.255 ca +216.17.0.0 - 216.17.255.255 us 216.18.0.0 - 216.18.127.255 ca -216.18.128.0 - 216.18.227.255 us -216.18.228.0 - 216.18.228.95 ca -216.18.228.96 - 216.18.228.255 us +216.18.128.0 - 216.18.228.255 us 216.18.229.0 - 216.18.229.255 se -216.18.230.0 - 216.18.232.79 us -216.18.232.80 - 216.18.232.87 ca -216.18.232.88 - 216.18.232.95 us -216.18.232.96 - 216.18.232.103 ca -216.18.232.104 - 216.18.232.111 us -216.18.232.112 - 216.18.232.143 ca -216.18.232.144 - 216.18.234.25 us -216.18.234.26 - 216.18.234.33 ca -216.18.234.34 - 216.18.234.63 us -216.18.234.64 - 216.18.234.79 ca -216.18.234.80 - 216.18.236.255 us -216.18.237.0 - 216.18.237.80 pl -216.18.237.81 - 216.19.63.255 us +216.18.230.0 - 216.19.63.255 us 216.19.64.0 - 216.19.95.255 ca 216.19.96.0 - 216.19.175.255 us 216.19.176.0 - 216.19.191.255 ca -216.19.192.0 - 216.19.206.191 us -216.19.206.192 - 216.19.206.255 nz -216.19.207.0 - 216.20.210.79 us -216.20.210.80 - 216.20.210.87 ca -216.20.210.88 - 216.20.218.255 us -216.20.219.0 - 216.20.220.71 mx -216.20.220.72 - 216.20.220.207 us -216.20.220.208 - 216.20.220.215 bz -216.20.220.216 - 216.20.220.255 us -216.20.221.0 - 216.20.222.47 mx -216.20.222.48 - 216.20.222.55 us -216.20.222.56 - 216.20.222.63 mx -216.20.222.64 - 216.20.222.71 us -216.20.222.72 - 216.20.222.79 mx -216.20.222.80 - 216.20.222.87 us -216.20.222.88 - 216.20.222.167 mx -216.20.222.168 - 216.20.222.191 us -216.20.222.192 - 216.20.223.71 mx -216.20.223.72 - 216.20.223.79 us -216.20.223.80 - 216.20.223.255 mx -216.20.224.0 - 216.21.127.255 us -216.21.128.0 - 216.21.132.183 ca -216.21.132.184 - 216.21.132.191 us -216.21.132.192 - 216.21.136.231 ca -216.21.136.232 - 216.21.136.239 us -216.21.136.240 - 216.21.147.31 ca -216.21.147.32 - 216.21.147.39 us -216.21.147.40 - 216.21.147.127 ca -216.21.147.128 - 216.21.147.135 us -216.21.147.136 - 216.21.148.127 ca -216.21.148.128 - 216.21.148.135 us -216.21.148.136 - 216.21.151.39 ca -216.21.151.40 - 216.21.151.47 us -216.21.151.48 - 216.21.159.255 ca -216.21.160.0 - 216.21.255.255 us -216.22.0.0 - 216.22.0.19 ca -216.22.0.20 - 216.22.17.255 us -216.22.18.0 - 216.22.18.31 ru -216.22.18.32 - 216.22.24.40 us -216.22.24.41 - 216.22.24.50 gb -216.22.24.51 - 216.22.28.132 us -216.22.28.133 - 216.22.28.196 id -216.22.28.197 - 216.22.28.198 us -216.22.28.199 - 216.22.28.208 gb -216.22.28.209 - 216.22.29.35 us -216.22.29.36 - 216.22.29.45 id -216.22.29.46 - 216.22.50.135 us -216.22.50.136 - 216.22.50.143 gb -216.22.50.144 - 216.22.50.207 us -216.22.50.208 - 216.22.50.215 gb -216.22.50.216 - 216.22.60.53 us -216.22.60.54 - 216.22.60.57 in -216.22.60.58 - 216.22.99.255 us +216.19.192.0 - 216.21.7.255 us +216.21.8.0 - 216.21.11.255 ca +216.21.12.0 - 216.21.23.255 us +216.21.32.0 - 216.21.127.255 us +216.21.128.0 - 216.21.159.255 ca +216.21.160.0 - 216.22.99.255 us 216.22.100.0 - 216.22.100.255 ar -216.22.101.0 - 216.22.145.63 us -216.22.145.64 - 216.22.145.71 ca -216.22.145.72 - 216.22.146.231 us -216.22.146.232 - 216.22.146.239 ch -216.22.146.240 - 216.22.171.127 us -216.22.171.128 - 216.22.171.255 de -216.22.172.0 - 216.22.172.127 nl -216.22.172.128 - 216.22.172.253 de -216.22.172.254 - 216.22.173.159 us -216.22.173.160 - 216.22.173.175 no -216.22.173.176 - 216.22.173.215 us -216.22.173.216 - 216.22.173.223 nl -216.22.173.224 - 216.22.173.231 za -216.22.173.232 - 216.22.208.15 us -216.22.208.16 - 216.22.208.23 gb -216.22.208.24 - 216.22.208.39 us -216.22.208.40 - 216.22.208.47 ca -216.22.208.48 - 216.22.208.55 gb -216.22.208.56 - 216.22.208.127 us -216.22.208.128 - 216.22.208.135 ca -216.22.208.136 - 216.22.208.191 us -216.22.208.192 - 216.22.208.199 gb -216.22.208.200 - 216.22.209.1 us -216.22.209.2 - 216.22.209.31 ca -216.22.209.32 - 216.22.209.79 us -216.22.209.80 - 216.22.209.92 gb -216.22.209.93 - 216.22.209.95 us -216.22.209.96 - 216.22.209.111 ca -216.22.209.112 - 216.22.209.191 us -216.22.209.192 - 216.22.209.207 ca -216.22.209.208 - 216.22.212.159 us -216.22.212.160 - 216.22.212.191 mx -216.22.212.192 - 216.22.213.63 us -216.22.213.64 - 216.22.213.95 ca -216.22.213.96 - 216.22.213.159 us -216.22.213.160 - 216.22.213.191 ru -216.22.213.192 - 216.22.214.15 us -216.22.214.16 - 216.22.214.23 ca -216.22.214.24 - 216.22.214.127 us -216.22.214.128 - 216.22.214.135 se -216.22.214.136 - 216.22.214.167 us -216.22.214.168 - 216.22.214.175 mt -216.22.214.176 - 216.22.215.31 us -216.22.215.32 - 216.22.215.39 jm -216.22.215.40 - 216.22.215.111 us -216.22.215.112 - 216.22.215.119 jm -216.22.215.120 - 216.22.216.191 us -216.22.216.192 - 216.22.216.238 sg -216.22.216.239 - 216.22.217.31 us -216.22.217.32 - 216.22.217.63 ar -216.22.217.64 - 216.22.217.159 us -216.22.217.160 - 216.22.217.191 lb -216.22.217.192 - 216.22.217.223 tr -216.22.217.224 - 216.22.220.255 us -216.22.221.0 - 216.22.222.255 th -216.22.223.0 - 216.22.223.47 us -216.22.223.48 - 216.22.223.63 ca -216.22.223.64 - 216.22.240.23 us -216.22.240.24 - 216.22.240.31 ca -216.22.240.32 - 216.22.240.191 us -216.22.240.192 - 216.22.240.223 ca -216.22.240.224 - 216.23.127.255 us +216.22.101.0 - 216.23.127.255 us 216.23.128.0 - 216.23.132.255 ca 216.23.133.0 - 216.23.134.255 us 216.23.135.0 - 216.23.142.255 ca @@ -150645,819 +113574,90 @@ 216.23.145.0 - 216.23.159.255 ca 216.23.160.0 - 216.24.223.255 us 216.24.224.0 - 216.24.239.255 ca -216.24.240.0 - 216.25.44.221 us -216.25.44.222 - 216.25.44.231 au -216.25.44.232 - 216.25.223.255 us -216.25.224.0 - 216.25.238.255 a2 -216.25.239.0 - 216.25.252.63 us -216.25.252.64 - 216.25.252.79 nl -216.25.252.80 - 216.26.191.255 us +216.24.240.0 - 216.25.223.255 us +216.25.224.0 - 216.25.237.255 a2 +216.25.238.0 - 216.26.191.255 us 216.26.192.0 - 216.26.223.255 ca -216.26.224.0 - 216.32.195.191 us -216.32.195.192 - 216.32.195.223 lt -216.32.195.224 - 216.33.75.191 us -216.33.75.192 - 216.33.75.199 bm -216.33.75.200 - 216.33.80.79 us -216.33.80.80 - 216.33.80.87 bm -216.33.80.88 - 216.33.109.31 us -216.33.109.32 - 216.33.109.63 nl -216.33.109.64 - 216.33.123.127 us -216.33.123.128 - 216.33.123.159 ae -216.33.123.160 - 216.33.125.95 us -216.33.125.96 - 216.33.125.111 ae -216.33.125.112 - 216.33.195.255 us +216.26.224.0 - 216.31.201.255 us +216.31.202.0 - 216.31.202.255 gb +216.31.203.0 - 216.33.195.255 us 216.33.196.0 - 216.33.197.255 ar -216.33.198.0 - 216.34.7.223 us -216.34.7.224 - 216.34.7.255 au -216.34.8.0 - 216.34.91.239 us -216.34.91.240 - 216.34.91.255 ca -216.34.92.0 - 216.34.131.63 us -216.34.131.64 - 216.34.131.255 au -216.34.132.0 - 216.34.139.159 us -216.34.139.160 - 216.34.139.175 au -216.34.139.176 - 216.35.45.255 us -216.35.46.0 - 216.35.46.31 lt -216.35.46.32 - 216.35.66.47 us -216.35.66.48 - 216.35.66.55 no -216.35.66.56 - 216.35.66.63 us -216.35.66.64 - 216.35.66.71 il -216.35.66.72 - 216.35.66.119 us -216.35.66.120 - 216.35.66.127 il -216.35.66.128 - 216.35.73.15 us -216.35.73.16 - 216.35.73.31 gb -216.35.73.32 - 216.35.78.255 us -216.35.79.0 - 216.35.79.63 cy -216.35.79.64 - 216.35.79.127 us -216.35.79.128 - 216.35.79.159 ch -216.35.79.160 - 216.35.160.63 us -216.35.160.64 - 216.35.160.95 gb -216.35.160.96 - 216.35.206.255 us -216.35.207.0 - 216.35.207.255 hk -216.35.208.0 - 216.35.213.223 us -216.35.213.224 - 216.35.213.255 ar -216.35.214.0 - 216.35.218.239 us -216.35.218.240 - 216.35.218.255 ae -216.35.219.0 - 216.36.127.255 us +216.33.198.0 - 216.36.127.255 us 216.36.128.0 - 216.36.191.255 ca 216.36.192.0 - 216.37.111.255 us 216.37.112.0 - 216.37.127.255 ca -216.37.128.0 - 216.38.48.5 us -216.38.48.6 - 216.38.48.9 au -216.38.48.10 - 216.38.48.13 cr -216.38.48.14 - 216.38.48.17 it -216.38.48.18 - 216.38.48.25 us -216.38.48.26 - 216.38.48.29 il -216.38.48.30 - 216.38.48.37 us -216.38.48.38 - 216.38.48.41 qa -216.38.48.42 - 216.38.48.45 us -216.38.48.46 - 216.38.48.49 in -216.38.48.50 - 216.38.48.61 us -216.38.48.62 - 216.38.48.65 au -216.38.48.66 - 216.38.48.89 us -216.38.48.90 - 216.38.48.93 mx -216.38.48.94 - 216.38.48.97 us -216.38.48.98 - 216.38.48.107 mx -216.38.48.108 - 216.38.48.111 gb -216.38.48.112 - 216.38.48.123 us -216.38.48.124 - 216.38.48.127 tr -216.38.48.128 - 216.38.48.139 us -216.38.48.140 - 216.38.48.144 gb -216.38.48.145 - 216.38.48.148 ca -216.38.48.149 - 216.38.48.168 us -216.38.48.169 - 216.38.48.172 ve -216.38.48.173 - 216.38.48.180 us -216.38.48.181 - 216.38.48.184 co -216.38.48.185 - 216.38.48.196 us -216.38.48.197 - 216.38.48.198 ru -216.38.48.199 - 216.38.48.200 be -216.38.48.201 - 216.38.48.204 us -216.38.48.205 - 216.38.48.208 gb -216.38.48.209 - 216.38.48.212 in -216.38.48.213 - 216.38.48.216 us -216.38.48.217 - 216.38.48.220 it -216.38.48.221 - 216.38.48.225 us -216.38.48.226 - 216.38.48.229 ca -216.38.48.230 - 216.38.48.233 cl -216.38.48.234 - 216.38.48.237 us -216.38.48.238 - 216.38.48.241 gb -216.38.48.242 - 216.38.48.243 us -216.38.48.244 - 216.38.48.247 ru -216.38.48.248 - 216.38.48.252 us -216.38.48.253 - 216.38.48.254 gr -216.38.48.255 - 216.38.49.5 us -216.38.49.6 - 216.38.49.9 id -216.38.49.10 - 216.38.49.29 us -216.38.49.30 - 216.38.49.33 ve -216.38.49.34 - 216.38.49.37 il -216.38.49.38 - 216.38.49.41 us -216.38.49.42 - 216.38.49.45 de -216.38.49.46 - 216.38.49.53 us -216.38.49.54 - 216.38.49.57 fr -216.38.49.58 - 216.38.49.73 us -216.38.49.74 - 216.38.49.77 vi -216.38.49.78 - 216.38.49.81 us -216.38.49.82 - 216.38.49.85 au -216.38.49.86 - 216.38.49.89 us -216.38.49.90 - 216.38.49.93 be -216.38.49.94 - 216.38.49.97 us -216.38.49.98 - 216.38.49.101 ca -216.38.49.102 - 216.38.49.107 us -216.38.49.108 - 216.38.49.111 gb -216.38.49.112 - 216.38.49.134 us -216.38.49.135 - 216.38.49.138 lb -216.38.49.139 - 216.38.49.142 gb -216.38.49.143 - 216.38.49.147 us -216.38.49.148 - 216.38.49.151 nl -216.38.49.152 - 216.38.49.164 us -216.38.49.165 - 216.38.49.168 eg -216.38.49.169 - 216.38.49.172 fr -216.38.49.173 - 216.38.49.174 ru -216.38.49.175 - 216.38.49.176 us -216.38.49.177 - 216.38.49.180 ie -216.38.49.181 - 216.38.49.182 ca -216.38.49.183 - 216.38.49.184 us -216.38.49.185 - 216.38.49.187 gb -216.38.49.188 - 216.38.49.191 ca -216.38.49.192 - 216.38.49.195 sa -216.38.49.196 - 216.38.49.199 us -216.38.49.200 - 216.38.49.203 ru -216.38.49.204 - 216.38.49.211 us -216.38.49.212 - 216.38.49.215 au -216.38.49.216 - 216.38.49.229 us -216.38.49.230 - 216.38.49.233 mx -216.38.49.234 - 216.38.49.235 us -216.38.49.236 - 216.38.49.248 ru -216.38.49.249 - 216.38.50.18 us -216.38.50.19 - 216.38.50.22 ca -216.38.50.23 - 216.38.50.38 us -216.38.50.39 - 216.38.50.42 gb -216.38.50.43 - 216.38.50.50 us -216.38.50.51 - 216.38.50.58 in -216.38.50.59 - 216.38.50.70 us -216.38.50.71 - 216.38.50.74 ca -216.38.50.75 - 216.38.50.78 us -216.38.50.79 - 216.38.50.82 ca -216.38.50.83 - 216.38.50.96 us -216.38.50.97 - 216.38.50.100 nl -216.38.50.101 - 216.38.50.108 us -216.38.50.109 - 216.38.50.112 mx -216.38.50.113 - 216.38.50.116 gb -216.38.50.117 - 216.38.50.120 us -216.38.50.121 - 216.38.50.124 ca -216.38.50.125 - 216.38.50.148 us -216.38.50.149 - 216.38.50.152 gb -216.38.50.153 - 216.38.50.156 vn -216.38.50.157 - 216.38.50.160 ru -216.38.50.161 - 216.38.50.164 us -216.38.50.165 - 216.38.50.168 lk -216.38.50.169 - 216.38.50.169 us -216.38.50.170 - 216.38.50.173 nz -216.38.50.174 - 216.38.50.177 sa -216.38.50.178 - 216.38.50.201 us -216.38.50.202 - 216.38.50.205 co -216.38.50.206 - 216.38.50.209 ro -216.38.50.210 - 216.38.50.225 us -216.38.50.226 - 216.38.50.229 jp -216.38.50.230 - 216.38.50.245 us -216.38.50.246 - 216.38.50.249 ca -216.38.50.250 - 216.38.50.250 us -216.38.50.251 - 216.38.50.254 in -216.38.50.255 - 216.38.51.5 us -216.38.51.6 - 216.38.51.7 gb -216.38.51.8 - 216.38.51.21 us -216.38.51.22 - 216.38.51.25 gb -216.38.51.26 - 216.38.51.29 us -216.38.51.30 - 216.38.51.33 in -216.38.51.34 - 216.38.51.37 ch -216.38.51.38 - 216.38.51.41 sg -216.38.51.42 - 216.38.51.53 us -216.38.51.54 - 216.38.51.57 ca -216.38.51.58 - 216.38.51.65 us -216.38.51.66 - 216.38.51.69 ca -216.38.51.70 - 216.38.51.89 us -216.38.51.90 - 216.38.51.93 ca -216.38.51.94 - 216.38.51.97 nz -216.38.51.98 - 216.38.51.101 us -216.38.51.102 - 216.38.51.105 es -216.38.51.106 - 216.38.51.113 us -216.38.51.114 - 216.38.51.117 in -216.38.51.118 - 216.38.51.121 us -216.38.51.122 - 216.38.51.125 gb -216.38.51.126 - 216.38.51.127 us -216.38.51.128 - 216.38.51.131 in -216.38.51.132 - 216.38.51.143 us -216.38.51.144 - 216.38.51.147 cn -216.38.51.148 - 216.38.51.159 us -216.38.51.160 - 216.38.51.163 nl -216.38.51.164 - 216.38.51.167 us -216.38.51.168 - 216.38.51.171 in -216.38.51.172 - 216.38.51.183 us -216.38.51.184 - 216.38.51.187 ca -216.38.51.188 - 216.38.51.191 it -216.38.51.192 - 216.38.51.195 us -216.38.51.196 - 216.38.51.199 gb -216.38.51.200 - 216.38.51.203 dk -216.38.51.204 - 216.38.51.215 us -216.38.51.216 - 216.38.51.219 ar -216.38.51.220 - 216.38.51.227 us -216.38.51.228 - 216.38.51.231 rs -216.38.51.232 - 216.38.51.235 us -216.38.51.236 - 216.38.51.239 in -216.38.51.240 - 216.38.51.244 us -216.38.51.245 - 216.38.51.248 ca -216.38.51.249 - 216.38.51.252 us -216.38.51.253 - 216.38.51.254 in -216.38.51.255 - 216.38.52.17 us -216.38.52.18 - 216.38.52.21 gb -216.38.52.22 - 216.38.52.25 ru -216.38.52.26 - 216.38.52.29 th -216.38.52.30 - 216.38.52.42 us -216.38.52.43 - 216.38.52.47 in -216.38.52.48 - 216.38.52.51 us -216.38.52.52 - 216.38.52.55 sr -216.38.52.56 - 216.38.52.59 it -216.38.52.60 - 216.38.52.63 us -216.38.52.64 - 216.38.52.67 au -216.38.52.68 - 216.38.52.75 us -216.38.52.76 - 216.38.52.79 cn -216.38.52.80 - 216.38.52.83 gb -216.38.52.84 - 216.38.52.98 us -216.38.52.99 - 216.38.52.102 br -216.38.52.103 - 216.38.52.106 za -216.38.52.107 - 216.38.52.114 us -216.38.52.115 - 216.38.52.118 gr -216.38.52.119 - 216.38.52.122 fr -216.38.52.123 - 216.38.52.134 us -216.38.52.135 - 216.38.52.138 au -216.38.52.139 - 216.38.52.142 us -216.38.52.143 - 216.38.52.146 jp -216.38.52.147 - 216.38.52.150 us -216.38.52.151 - 216.38.52.154 il -216.38.52.155 - 216.38.52.158 my -216.38.52.159 - 216.38.52.166 gb -216.38.52.167 - 216.38.52.170 br -216.38.52.171 - 216.38.52.182 us -216.38.52.183 - 216.38.52.186 gr -216.38.52.187 - 216.38.52.190 sg -216.38.52.191 - 216.38.52.198 us -216.38.52.199 - 216.38.52.202 br -216.38.52.203 - 216.38.52.210 us -216.38.52.211 - 216.38.52.214 in -216.38.52.215 - 216.38.52.234 us -216.38.52.235 - 216.38.52.238 it -216.38.52.239 - 216.38.52.242 us -216.38.52.243 - 216.38.52.246 in -216.38.52.247 - 216.38.52.250 au -216.38.52.251 - 216.38.53.5 us -216.38.53.6 - 216.38.53.9 in -216.38.53.10 - 216.38.53.43 us -216.38.53.44 - 216.38.53.47 th -216.38.53.48 - 216.38.53.78 us -216.38.53.79 - 216.38.53.82 au -216.38.53.83 - 216.38.53.86 us -216.38.53.87 - 216.38.53.90 ua -216.38.53.91 - 216.38.53.94 us -216.38.53.95 - 216.38.53.98 tr -216.38.53.99 - 216.38.53.102 us -216.38.53.103 - 216.38.53.106 br -216.38.53.107 - 216.38.53.163 us -216.38.53.164 - 216.38.53.167 gb -216.38.53.168 - 216.38.53.171 us -216.38.53.172 - 216.38.53.175 ca -216.38.53.176 - 216.38.53.179 us -216.38.53.180 - 216.38.53.183 in -216.38.53.184 - 216.38.53.195 us -216.38.53.196 - 216.38.53.199 it -216.38.53.200 - 216.38.53.203 pt -216.38.53.204 - 216.38.53.223 us -216.38.53.224 - 216.38.53.227 au -216.38.53.228 - 216.38.53.231 ca -216.38.53.232 - 216.38.53.243 us -216.38.53.244 - 216.38.53.247 nl -216.38.53.248 - 216.38.53.251 us -216.38.53.252 - 216.38.53.253 in -216.38.53.254 - 216.38.54.14 us -216.38.54.15 - 216.38.54.18 ru -216.38.54.19 - 216.38.54.22 it -216.38.54.23 - 216.38.54.30 us -216.38.54.31 - 216.38.54.34 gb -216.38.54.35 - 216.38.54.44 us -216.38.54.45 - 216.38.54.48 br -216.38.54.49 - 216.38.54.53 us -216.38.54.54 - 216.38.54.57 sg -216.38.54.58 - 216.38.54.61 ca -216.38.54.62 - 216.38.54.65 in -216.38.54.66 - 216.38.54.69 sg -216.38.54.70 - 216.38.54.77 us -216.38.54.78 - 216.38.54.82 hn -216.38.54.83 - 216.38.54.89 us -216.38.54.90 - 216.38.54.93 pl -216.38.54.94 - 216.38.54.117 us -216.38.54.118 - 216.38.54.121 gr -216.38.54.122 - 216.38.54.125 us -216.38.54.126 - 216.38.54.129 au -216.38.54.130 - 216.38.54.133 it -216.38.54.134 - 216.38.54.145 gb -216.38.54.146 - 216.38.54.178 us -216.38.54.179 - 216.38.54.182 sg -216.38.54.183 - 216.38.54.186 cn -216.38.54.187 - 216.38.54.190 au -216.38.54.191 - 216.38.54.194 us -216.38.54.195 - 216.38.54.198 de -216.38.54.199 - 216.38.54.202 us -216.38.54.203 - 216.38.54.206 cn -216.38.54.207 - 216.38.54.226 us -216.38.54.227 - 216.38.54.230 au -216.38.54.231 - 216.38.54.234 us -216.38.54.235 - 216.38.54.238 in -216.38.54.239 - 216.38.54.242 gr -216.38.54.243 - 216.38.54.246 cn -216.38.54.247 - 216.38.55.23 us -216.38.55.24 - 216.38.55.27 in -216.38.55.28 - 216.38.55.31 us -216.38.55.32 - 216.38.55.35 co -216.38.55.36 - 216.38.55.43 us -216.38.55.44 - 216.38.55.47 br -216.38.55.48 - 216.38.55.96 us -216.38.55.97 - 216.38.55.100 pe -216.38.55.101 - 216.38.55.104 ae -216.38.55.105 - 216.38.55.116 us -216.38.55.117 - 216.38.55.121 tr -216.38.55.122 - 216.38.55.125 in -216.38.55.126 - 216.38.55.129 us -216.38.55.130 - 216.38.55.133 in -216.38.55.134 - 216.38.55.141 us -216.38.55.142 - 216.38.55.145 mx -216.38.55.146 - 216.38.55.153 us -216.38.55.154 - 216.38.55.157 co -216.38.55.158 - 216.38.55.166 us -216.38.55.167 - 216.38.55.174 gb -216.38.55.175 - 216.38.55.178 us -216.38.55.179 - 216.38.55.182 de -216.38.55.183 - 216.38.55.186 gr -216.38.55.187 - 216.38.55.190 ca -216.38.55.191 - 216.38.55.194 mx -216.38.55.195 - 216.38.56.15 us -216.38.56.16 - 216.38.56.23 ru -216.38.56.24 - 216.38.56.31 ca -216.38.56.32 - 216.38.56.39 us -216.38.56.40 - 216.38.56.47 in -216.38.56.48 - 216.38.56.63 us -216.38.56.64 - 216.38.56.71 gb -216.38.56.72 - 216.38.56.79 au -216.38.56.80 - 216.38.56.87 gr -216.38.56.88 - 216.38.56.95 in -216.38.56.96 - 216.38.56.143 us -216.38.56.144 - 216.38.56.159 gb -216.38.56.160 - 216.38.56.167 us -216.38.56.168 - 216.38.56.175 gb -216.38.56.176 - 216.38.56.183 us -216.38.56.184 - 216.38.56.191 gb -216.38.56.192 - 216.38.56.223 us -216.38.56.224 - 216.38.56.239 ca -216.38.56.240 - 216.38.56.255 in -216.38.57.0 - 216.38.57.31 us -216.38.57.32 - 216.38.57.63 ch -216.38.57.64 - 216.38.57.111 us -216.38.57.112 - 216.38.57.143 ca -216.38.57.144 - 216.38.57.159 gb -216.38.57.160 - 216.38.57.255 us -216.38.58.0 - 216.38.58.31 nl -216.38.58.32 - 216.38.58.223 us -216.38.58.224 - 216.38.58.255 nl -216.38.59.0 - 216.38.60.97 us -216.38.60.98 - 216.38.60.101 in -216.38.60.102 - 216.38.62.5 us -216.38.62.6 - 216.38.62.9 mx -216.38.62.10 - 216.38.62.25 us -216.38.62.26 - 216.38.62.29 in -216.38.62.30 - 216.38.62.41 us -216.38.62.42 - 216.38.62.49 ca -216.38.62.50 - 216.38.62.53 us -216.38.62.54 - 216.38.62.57 in -216.38.62.58 - 216.38.62.61 us -216.38.62.62 - 216.38.62.65 gb -216.38.62.66 - 216.38.62.73 us -216.38.62.74 - 216.38.62.77 au -216.38.62.78 - 216.38.62.81 gb -216.38.62.82 - 216.38.62.85 sg -216.38.62.86 - 216.38.62.89 us -216.38.62.90 - 216.38.62.93 ca -216.38.62.94 - 216.38.62.97 nz -216.38.62.98 - 216.38.62.101 us -216.38.62.102 - 216.38.62.105 it -216.38.62.106 - 216.38.62.109 id -216.38.62.110 - 216.38.62.129 us -216.38.62.130 - 216.38.62.133 cn -216.38.62.134 - 216.38.62.137 id -216.38.62.138 - 216.38.62.141 in -216.38.62.142 - 216.38.62.145 us -216.38.62.146 - 216.38.62.149 mx -216.38.62.150 - 216.38.62.153 ca -216.38.62.154 - 216.38.62.161 us -216.38.62.162 - 216.38.62.165 in -216.38.62.166 - 216.38.62.177 us -216.38.62.178 - 216.38.62.181 ie -216.38.62.182 - 216.38.62.201 us -216.38.62.202 - 216.38.62.205 in -216.38.62.206 - 216.38.62.217 us -216.38.62.218 - 216.38.62.221 jp -216.38.62.222 - 216.38.62.225 us -216.38.62.226 - 216.38.62.229 in -216.38.62.230 - 216.38.62.233 id -216.38.62.234 - 216.38.62.237 in -216.38.62.238 - 216.38.62.241 ca -216.38.62.242 - 216.38.62.245 gb -216.38.62.246 - 216.38.62.249 in -216.38.62.250 - 216.38.62.253 ro -216.38.62.254 - 216.38.63.27 us -216.38.63.28 - 216.38.63.31 it -216.38.63.32 - 216.38.63.35 us -216.38.63.36 - 216.38.63.39 ca -216.38.63.40 - 216.38.63.43 us -216.38.63.44 - 216.38.63.47 ca -216.38.63.48 - 216.38.63.55 us -216.38.63.56 - 216.38.63.57 nz -216.38.63.58 - 216.38.63.65 us -216.38.63.66 - 216.38.63.69 ca -216.38.63.70 - 216.38.63.73 us -216.38.63.74 - 216.38.63.77 ca -216.38.63.78 - 216.38.63.85 us -216.38.63.86 - 216.38.63.89 be -216.38.63.90 - 216.38.63.93 us -216.38.63.94 - 216.38.63.97 id -216.38.63.98 - 216.38.63.101 cn -216.38.63.102 - 216.38.63.109 us -216.38.63.110 - 216.38.63.113 gr -216.38.63.114 - 216.38.63.133 us -216.38.63.134 - 216.38.63.137 in -216.38.63.138 - 216.38.63.169 us -216.38.63.170 - 216.38.63.173 fr -216.38.63.174 - 216.38.63.177 ca -216.38.63.178 - 216.38.63.181 us -216.38.63.182 - 216.38.63.185 ca -216.38.63.186 - 216.38.63.197 us -216.38.63.198 - 216.38.63.201 in -216.38.63.202 - 216.38.63.205 mx -216.38.63.206 - 216.38.63.209 ca -216.38.63.210 - 216.38.63.213 us -216.38.63.214 - 216.38.63.217 il -216.38.63.218 - 216.38.63.221 us -216.38.63.222 - 216.38.63.225 si -216.38.63.226 - 216.38.63.229 us -216.38.63.230 - 216.38.63.237 in -216.38.63.238 - 216.38.63.241 gb -216.38.63.242 - 216.40.31.255 us +216.37.128.0 - 216.40.31.255 us 216.40.32.0 - 216.40.47.255 ca -216.40.48.0 - 216.40.95.255 us -216.40.96.0 - 216.40.96.255 ca -216.40.97.0 - 216.40.97.15 us -216.40.97.16 - 216.40.97.39 ca -216.40.97.40 - 216.40.97.47 us -216.40.97.48 - 216.40.100.87 ca -216.40.100.88 - 216.40.100.103 us -216.40.100.104 - 216.40.100.111 in -216.40.100.112 - 216.40.101.79 ca -216.40.101.80 - 216.40.101.87 us -216.40.101.88 - 216.40.102.31 ca -216.40.102.32 - 216.40.102.39 us -216.40.102.40 - 216.40.102.47 ca -216.40.102.48 - 216.40.102.55 us -216.40.102.56 - 216.40.102.71 ca -216.40.102.72 - 216.40.102.79 us -216.40.102.80 - 216.40.102.87 ca -216.40.102.88 - 216.40.102.95 us -216.40.102.96 - 216.40.102.223 ca -216.40.102.224 - 216.40.102.255 cr -216.40.103.0 - 216.40.103.103 ca -216.40.103.104 - 216.40.103.111 us -216.40.103.112 - 216.40.103.159 ca -216.40.103.160 - 216.40.103.167 us -216.40.103.168 - 216.40.103.247 ca -216.40.103.248 - 216.40.103.255 us -216.40.104.0 - 216.40.105.7 ca -216.40.105.8 - 216.40.105.47 us -216.40.105.48 - 216.40.105.159 ca -216.40.105.160 - 216.40.105.183 us -216.40.105.184 - 216.40.105.191 ca -216.40.105.192 - 216.40.105.207 us -216.40.105.208 - 216.40.106.191 ca -216.40.106.192 - 216.40.106.231 us -216.40.106.232 - 216.40.106.239 ca -216.40.106.240 - 216.40.106.247 us -216.40.106.248 - 216.40.106.255 ca -216.40.107.0 - 216.40.107.7 us -216.40.107.8 - 216.40.107.63 ca -216.40.107.64 - 216.40.107.71 us -216.40.107.72 - 216.40.108.159 ca -216.40.108.160 - 216.40.108.167 us -216.40.108.168 - 216.40.109.239 ca -216.40.109.240 - 216.40.109.247 us -216.40.109.248 - 216.40.110.71 ca -216.40.110.72 - 216.40.110.79 us -216.40.110.80 - 216.40.111.23 ca -216.40.111.24 - 216.40.111.31 us -216.40.111.32 - 216.40.111.119 ca -216.40.111.120 - 216.40.111.127 us -216.40.111.128 - 216.40.111.167 ca -216.40.111.168 - 216.40.111.191 us -216.40.111.192 - 216.40.113.159 ca -216.40.113.160 - 216.40.113.167 us -216.40.113.168 - 216.40.115.103 ca -216.40.115.104 - 216.40.115.111 us -216.40.115.112 - 216.40.115.199 ca -216.40.115.200 - 216.40.115.215 us -216.40.115.216 - 216.40.116.15 ca -216.40.116.16 - 216.40.116.71 us -216.40.116.72 - 216.40.116.127 ca -216.40.116.128 - 216.40.116.135 us -216.40.116.136 - 216.40.116.159 ca -216.40.116.160 - 216.40.116.167 us -216.40.116.168 - 216.40.116.247 ca -216.40.116.248 - 216.40.117.7 us -216.40.117.8 - 216.40.117.103 ca -216.40.117.104 - 216.40.117.111 us -216.40.117.112 - 216.40.117.159 ca -216.40.117.160 - 216.40.117.167 us -216.40.117.168 - 216.40.117.239 ca -216.40.117.240 - 216.40.117.247 us -216.40.117.248 - 216.40.118.23 ca -216.40.118.24 - 216.40.118.39 us -216.40.118.40 - 216.40.118.87 ca -216.40.118.88 - 216.40.118.103 us -216.40.118.104 - 216.40.118.135 ca -216.40.118.136 - 216.40.118.151 us -216.40.118.152 - 216.40.118.167 ca -216.40.118.168 - 216.40.118.175 us -216.40.118.176 - 216.40.118.183 ca -216.40.118.184 - 216.40.118.191 us -216.40.118.192 - 216.40.118.239 ca -216.40.118.240 - 216.40.118.255 us -216.40.119.0 - 216.40.119.255 ca -216.40.120.0 - 216.40.120.15 us -216.40.120.16 - 216.40.120.95 ca -216.40.120.96 - 216.40.120.103 us -216.40.120.104 - 216.40.120.127 ca -216.40.120.128 - 216.40.120.135 us -216.40.120.136 - 216.40.120.175 ca -216.40.120.176 - 216.40.120.191 us -216.40.120.192 - 216.40.120.199 ca -216.40.120.200 - 216.40.120.207 us -216.40.120.208 - 216.40.120.215 ca -216.40.120.216 - 216.40.120.231 us -216.40.120.232 - 216.40.121.71 ca -216.40.121.72 - 216.40.121.79 us -216.40.121.80 - 216.40.121.127 ca -216.40.121.128 - 216.40.121.135 us -216.40.121.136 - 216.40.121.207 ca -216.40.121.208 - 216.40.121.215 us -216.40.121.216 - 216.40.122.135 ca -216.40.122.136 - 216.40.122.143 us -216.40.122.144 - 216.40.122.191 ca -216.40.122.192 - 216.40.122.207 us -216.40.122.208 - 216.40.122.223 ca -216.40.122.224 - 216.40.122.231 us -216.40.122.232 - 216.40.122.247 ca -216.40.122.248 - 216.40.122.255 us -216.40.123.0 - 216.40.123.23 ca -216.40.123.24 - 216.40.123.31 us -216.40.123.32 - 216.40.123.55 ca -216.40.123.56 - 216.40.123.63 us -216.40.123.64 - 216.40.123.119 ca -216.40.123.120 - 216.40.123.127 us -216.40.123.128 - 216.40.123.215 ca -216.40.123.216 - 216.40.123.223 us -216.40.123.224 - 216.40.123.255 ca -216.40.124.0 - 216.40.124.7 us -216.40.124.8 - 216.40.124.15 ca -216.40.124.16 - 216.40.124.23 us -216.40.124.24 - 216.40.124.31 ca -216.40.124.32 - 216.40.124.39 us -216.40.124.40 - 216.40.124.47 ca -216.40.124.48 - 216.40.124.55 us -216.40.124.56 - 216.40.125.191 ca -216.40.125.192 - 216.40.125.215 us -216.40.125.216 - 216.40.125.223 ca -216.40.125.224 - 216.40.125.231 us -216.40.125.232 - 216.40.126.39 ca -216.40.126.40 - 216.40.126.167 us -216.40.126.168 - 216.40.126.183 ca -216.40.126.184 - 216.40.126.191 us -216.40.126.192 - 216.40.126.199 ca -216.40.126.200 - 216.40.126.239 us -216.40.126.240 - 216.40.126.255 ca -216.40.127.0 - 216.40.127.7 us -216.40.127.8 - 216.40.127.15 ca -216.40.127.16 - 216.40.127.95 us -216.40.127.96 - 216.40.127.119 ca -216.40.127.120 - 216.40.127.127 us -216.40.127.128 - 216.40.127.151 ca -216.40.127.152 - 216.40.127.159 us -216.40.127.160 - 216.40.127.247 ca -216.40.127.248 - 216.45.95.255 us +216.40.48.0 - 216.40.52.19 us +216.40.52.20 - 216.40.52.20 eu +216.40.52.21 - 216.40.61.255 us +216.40.62.0 - 216.40.62.255 gb +216.40.63.0 - 216.40.95.255 us +216.40.96.0 - 216.40.127.255 ca +216.40.128.0 - 216.45.95.255 us 216.45.96.0 - 216.45.127.255 ca 216.45.128.0 - 216.45.255.255 us -216.46.0.0 - 216.46.11.47 ca -216.46.11.48 - 216.46.11.55 us -216.46.11.56 - 216.46.47.255 ca +216.46.0.0 - 216.46.47.255 ca 216.46.48.0 - 216.46.127.255 us 216.46.128.0 - 216.46.159.255 ca 216.46.160.0 - 216.48.79.255 us 216.48.80.0 - 216.48.95.255 ca 216.48.96.0 - 216.48.159.255 us 216.48.160.0 - 216.48.175.255 ca -216.48.176.0 - 216.52.7.255 us -216.52.8.0 - 216.52.8.31 gb -216.52.8.32 - 216.52.89.143 us -216.52.89.144 - 216.52.89.159 il -216.52.89.160 - 216.52.90.127 us -216.52.90.128 - 216.52.90.255 ae -216.52.91.0 - 216.52.93.135 us -216.52.93.136 - 216.52.93.143 bm -216.52.93.144 - 216.52.119.95 us -216.52.119.96 - 216.52.119.127 gb -216.52.119.128 - 216.52.119.199 us -216.52.119.200 - 216.52.119.207 ca -216.52.119.208 - 216.52.162.55 us -216.52.162.56 - 216.52.162.63 sr -216.52.162.64 - 216.52.171.223 us -216.52.171.224 - 216.52.171.255 se -216.52.172.0 - 216.52.248.111 us -216.52.248.112 - 216.52.248.119 il -216.52.248.120 - 216.53.139.255 us -216.53.140.0 - 216.53.141.255 br -216.53.142.0 - 216.53.186.255 us -216.53.187.0 - 216.53.187.31 ge -216.53.187.32 - 216.53.187.63 us -216.53.187.64 - 216.53.187.127 de -216.53.187.128 - 216.53.187.215 us -216.53.187.216 - 216.53.187.255 de -216.53.188.0 - 216.53.188.127 us -216.53.188.128 - 216.53.188.159 br -216.53.188.160 - 216.53.189.191 us -216.53.189.192 - 216.53.189.223 ca -216.53.189.224 - 216.53.190.255 us -216.53.191.0 - 216.53.191.143 de -216.53.191.144 - 216.53.191.191 us -216.53.191.192 - 216.53.191.255 br -216.53.192.0 - 216.55.95.255 us +216.48.176.0 - 216.50.252.255 us +216.50.253.0 - 216.50.253.255 ca +216.50.254.0 - 216.52.48.255 us +216.52.49.0 - 216.52.49.255 in +216.52.50.0 - 216.55.95.255 us 216.55.96.0 - 216.55.111.255 ca -216.55.112.0 - 216.55.142.128 us -216.55.142.129 - 216.55.142.138 ca -216.55.142.139 - 216.55.163.115 us -216.55.163.116 - 216.55.163.123 ir -216.55.163.124 - 216.55.191.255 us +216.55.112.0 - 216.55.191.255 us 216.55.192.0 - 216.55.239.255 ca 216.55.240.0 - 216.57.175.255 us -216.57.176.0 - 216.57.186.127 ca -216.57.186.128 - 216.57.186.191 us -216.57.186.192 - 216.57.191.255 ca -216.57.192.0 - 216.57.199.255 us -216.57.200.0 - 216.57.200.31 ca -216.57.200.32 - 216.57.203.79 us -216.57.203.80 - 216.57.203.95 ca -216.57.203.96 - 216.57.205.31 us -216.57.205.32 - 216.57.205.63 ca -216.57.205.64 - 216.57.208.63 us -216.57.208.64 - 216.57.208.127 ca -216.57.208.128 - 216.57.217.71 us -216.57.217.72 - 216.57.217.79 ca -216.57.217.80 - 216.57.255.255 us +216.57.176.0 - 216.57.191.255 ca +216.57.192.0 - 216.57.208.105 us +216.57.208.106 - 216.57.208.106 ca +216.57.208.107 - 216.57.208.108 us +216.57.208.109 - 216.57.208.109 ca +216.57.208.110 - 216.57.255.255 us 216.58.0.0 - 216.58.127.255 ca -216.58.128.0 - 216.59.0.63 us -216.59.0.64 - 216.59.0.95 be -216.59.0.96 - 216.59.0.159 us -216.59.0.160 - 216.59.0.191 in -216.59.0.192 - 216.59.0.223 ca -216.59.0.224 - 216.59.4.95 us -216.59.4.96 - 216.59.4.127 ca -216.59.4.128 - 216.59.7.87 us -216.59.7.88 - 216.59.7.95 in -216.59.7.96 - 216.59.31.255 us +216.58.128.0 - 216.59.31.255 us 216.59.32.0 - 216.59.32.255 ar -216.59.33.0 - 216.59.37.255 us -216.59.38.0 - 216.59.38.127 ie -216.59.38.128 - 216.59.38.255 us -216.59.39.0 - 216.59.39.127 ie -216.59.39.128 - 216.59.52.255 us -216.59.53.0 - 216.59.53.15 gb -216.59.53.16 - 216.59.53.223 us +216.59.33.0 - 216.59.53.223 us 216.59.53.224 - 216.59.53.255 gb -216.59.54.0 - 216.59.54.255 us -216.59.55.0 - 216.59.55.15 nl -216.59.55.16 - 216.59.55.191 us -216.59.55.192 - 216.59.55.255 nl -216.59.56.0 - 216.59.223.255 us +216.59.54.0 - 216.59.59.255 us +216.59.60.0 - 216.59.60.255 eu +216.59.61.0 - 216.59.223.255 us 216.59.224.0 - 216.59.255.255 ca 216.60.0.0 - 216.60.121.255 us 216.60.122.0 - 216.60.122.255 is -216.60.123.0 - 216.61.80.103 us -216.61.80.104 - 216.61.80.111 pr -216.61.80.112 - 216.61.81.191 us -216.61.81.192 - 216.61.81.199 pr -216.61.81.200 - 216.61.82.47 us -216.61.82.48 - 216.61.82.55 pr -216.61.82.56 - 216.61.140.175 us -216.61.140.176 - 216.61.140.183 pr -216.61.140.184 - 216.62.110.55 us -216.62.110.56 - 216.62.110.63 pr -216.62.110.64 - 216.62.111.183 us -216.62.111.184 - 216.62.111.191 pr -216.62.111.192 - 216.62.111.215 us -216.62.111.216 - 216.62.111.223 pr -216.62.111.224 - 216.62.232.119 us -216.62.232.120 - 216.62.232.127 pr -216.62.232.128 - 216.62.247.47 us -216.62.247.48 - 216.62.247.55 pr -216.62.247.56 - 216.64.197.223 us -216.64.197.224 - 216.64.197.255 ca -216.64.198.0 - 216.64.198.63 bm -216.64.198.64 - 216.64.198.255 us -216.64.199.0 - 216.64.199.31 gb -216.64.199.32 - 216.64.217.191 us -216.64.217.192 - 216.64.217.207 ca -216.64.217.208 - 216.64.219.63 us -216.64.219.64 - 216.64.219.79 ca -216.64.219.80 - 216.65.3.47 us -216.65.3.48 - 216.65.3.63 sg -216.65.3.64 - 216.65.3.79 gb -216.65.3.80 - 216.65.3.223 us -216.65.3.224 - 216.65.3.239 nz -216.65.3.240 - 216.65.3.255 us -216.65.4.0 - 216.65.4.15 ru -216.65.4.16 - 216.65.4.175 us -216.65.4.176 - 216.65.4.191 vi -216.65.4.192 - 216.65.5.191 us -216.65.5.192 - 216.65.5.223 au -216.65.5.224 - 216.65.7.63 us -216.65.7.64 - 216.65.7.127 ru -216.65.7.128 - 216.65.28.255 us +216.60.123.0 - 216.65.28.255 us 216.65.29.0 - 216.65.29.255 au -216.65.30.0 - 216.65.31.95 us -216.65.31.96 - 216.65.31.127 gb -216.65.31.128 - 216.65.38.223 us -216.65.38.224 - 216.65.38.255 sk -216.65.39.0 - 216.65.40.79 us -216.65.40.80 - 216.65.40.95 nl -216.65.40.96 - 216.65.40.111 it -216.65.40.112 - 216.65.40.135 us -216.65.40.136 - 216.65.40.143 ca -216.65.40.144 - 216.65.50.127 us -216.65.50.128 - 216.65.50.255 de -216.65.51.0 - 216.65.52.63 us -216.65.52.64 - 216.65.52.127 do -216.65.52.128 - 216.65.52.255 id -216.65.53.0 - 216.65.56.255 us +216.65.30.0 - 216.65.56.255 us 216.65.57.0 - 216.65.57.255 kw -216.65.58.0 - 216.65.61.127 us -216.65.61.128 - 216.65.61.191 ph -216.65.61.192 - 216.65.62.95 us -216.65.62.96 - 216.65.62.127 gb -216.65.62.128 - 216.65.64.143 us -216.65.64.144 - 216.65.64.159 id -216.65.64.160 - 216.65.64.223 us -216.65.64.224 - 216.65.64.239 nz -216.65.64.240 - 216.65.66.255 us +216.65.58.0 - 216.65.66.255 us 216.65.67.0 - 216.65.67.255 ca 216.65.68.0 - 216.65.87.255 us 216.65.88.0 - 216.65.88.255 ca -216.65.89.0 - 216.65.103.63 us -216.65.103.64 - 216.65.103.79 ie -216.65.103.80 - 216.65.103.95 es -216.65.103.96 - 216.65.103.255 us -216.65.104.0 - 216.65.104.63 ca -216.65.104.64 - 216.65.104.191 us -216.65.104.192 - 216.65.104.255 do -216.65.105.0 - 216.65.106.15 us -216.65.106.16 - 216.65.106.31 vi -216.65.106.32 - 216.65.120.255 us -216.65.121.0 - 216.65.121.127 it -216.65.121.128 - 216.65.159.255 us +216.65.89.0 - 216.65.159.255 us 216.65.160.0 - 216.65.191.255 ca -216.65.192.0 - 216.66.15.255 us -216.66.16.0 - 216.66.16.255 it -216.66.17.0 - 216.66.77.239 us -216.66.77.240 - 216.66.77.255 ca -216.66.78.0 - 216.66.80.223 us -216.66.80.224 - 216.66.80.231 it -216.66.80.232 - 216.66.127.255 us +216.65.192.0 - 216.66.82.73 us +216.66.82.74 - 216.66.82.74 at +216.66.82.75 - 216.66.83.107 us +216.66.83.108 - 216.66.83.115 gb +216.66.83.116 - 216.66.84.243 us +216.66.84.244 - 216.66.84.247 gb +216.66.84.248 - 216.66.127.255 us 216.66.128.0 - 216.66.207.255 ca -216.66.208.0 - 216.67.230.111 us -216.67.230.112 - 216.67.230.119 my -216.67.230.120 - 216.67.245.95 us -216.67.245.96 - 216.67.245.103 in -216.67.245.104 - 216.67.245.135 us -216.67.245.136 - 216.67.245.143 in -216.67.245.144 - 216.72.3.255 us +216.66.208.0 - 216.71.191.255 us +216.71.192.0 - 216.71.192.255 ca +216.71.193.0 - 216.72.3.255 us 216.72.4.0 - 216.72.7.255 co 216.72.8.0 - 216.72.23.255 cl 216.72.24.0 - 216.72.27.255 us 216.72.28.0 - 216.72.31.255 gt 216.72.32.0 - 216.72.43.255 il 216.72.44.0 - 216.72.45.255 ve -216.72.46.0 - 216.72.46.127 us -216.72.46.128 - 216.72.46.191 ve -216.72.46.192 - 216.72.62.255 us +216.72.46.0 - 216.72.62.255 us 216.72.63.0 - 216.72.63.255 hn 216.72.64.0 - 216.72.66.255 id 216.72.67.0 - 216.72.68.255 co @@ -151481,8 +113681,7 @@ 216.72.124.0 - 216.72.124.255 gt 216.72.125.0 - 216.72.125.255 us 216.72.126.0 - 216.72.134.255 ve -216.72.135.0 - 216.72.142.255 us -216.72.143.0 - 216.72.143.255 co +216.72.135.0 - 216.72.143.255 co 216.72.144.0 - 216.72.151.255 ar 216.72.152.0 - 216.72.153.255 ve 216.72.154.0 - 216.72.154.255 us @@ -151501,685 +113700,186 @@ 216.72.224.0 - 216.72.224.255 us 216.72.225.0 - 216.72.225.255 cr 216.72.226.0 - 216.72.226.255 ve -216.72.227.0 - 216.72.230.255 co -216.72.231.0 - 216.72.231.255 ec -216.72.232.0 - 216.72.234.255 co -216.72.235.0 - 216.72.235.255 us +216.72.227.0 - 216.72.235.255 co 216.72.236.0 - 216.72.236.255 ve 216.72.237.0 - 216.72.237.255 bs 216.72.238.0 - 216.73.63.255 us 216.73.64.0 - 216.73.79.255 ca -216.73.80.0 - 216.74.132.223 us -216.74.132.224 - 216.74.132.255 il -216.74.133.0 - 216.74.133.151 us -216.74.133.152 - 216.74.133.159 cy -216.74.133.160 - 216.74.147.191 us -216.74.147.192 - 216.74.147.199 gb -216.74.147.200 - 216.74.151.63 us -216.74.151.64 - 216.74.151.79 ie -216.74.151.80 - 216.74.151.159 us -216.74.151.160 - 216.74.151.191 gb -216.74.151.192 - 216.74.153.207 us -216.74.153.208 - 216.74.153.215 no -216.74.153.216 - 216.74.155.223 us -216.74.155.224 - 216.74.155.239 no -216.74.155.240 - 216.74.159.63 us -216.74.159.64 - 216.74.159.95 au -216.74.159.96 - 216.74.163.159 us -216.74.163.160 - 216.74.163.167 no -216.74.163.168 - 216.74.164.63 us -216.74.164.64 - 216.74.164.79 cy -216.74.164.80 - 216.74.168.127 us -216.74.168.128 - 216.74.169.63 gb -216.74.169.64 - 216.74.169.255 us -216.74.170.0 - 216.74.170.255 no -216.74.171.0 - 216.74.172.79 us -216.74.172.80 - 216.74.172.95 gb -216.74.172.96 - 216.75.159.255 us +216.73.96.0 - 216.75.159.255 us 216.75.160.0 - 216.75.191.255 ca -216.75.192.0 - 216.77.148.191 us -216.77.148.192 - 216.77.148.223 pa -216.77.148.224 - 216.80.255.255 us +216.75.192.0 - 216.75.213.255 us +216.75.214.0 - 216.75.214.255 eu +216.75.215.0 - 216.80.255.255 us 216.81.0.0 - 216.81.31.255 ca 216.81.32.0 - 216.81.47.255 us -216.81.48.0 - 216.81.56.55 ca -216.81.56.56 - 216.81.56.59 us -216.81.56.60 - 216.81.56.79 ca -216.81.56.80 - 216.81.56.107 us -216.81.56.108 - 216.81.56.131 ca -216.81.56.132 - 216.81.56.135 us -216.81.56.136 - 216.81.56.143 ca -216.81.56.144 - 216.81.56.151 us -216.81.56.152 - 216.81.56.155 ca -216.81.56.156 - 216.81.56.191 us -216.81.56.192 - 216.81.56.207 ca -216.81.56.208 - 216.81.56.215 us -216.81.56.216 - 216.81.56.219 ca -216.81.56.220 - 216.81.57.79 us -216.81.57.80 - 216.81.57.83 ca -216.81.57.84 - 216.81.57.87 us -216.81.57.88 - 216.81.57.91 ca -216.81.57.92 - 216.81.57.111 us -216.81.57.112 - 216.81.57.127 ca -216.81.57.128 - 216.81.57.175 us -216.81.57.176 - 216.81.57.191 ca -216.81.57.192 - 216.81.57.223 us -216.81.57.224 - 216.81.57.239 ca -216.81.57.240 - 216.81.57.255 us -216.81.58.0 - 216.81.58.15 ca -216.81.58.16 - 216.81.58.31 us -216.81.58.32 - 216.81.58.39 ca -216.81.58.40 - 216.81.58.51 us -216.81.58.52 - 216.81.58.63 ca -216.81.58.64 - 216.81.58.71 us -216.81.58.72 - 216.81.58.79 ca -216.81.58.80 - 216.81.58.83 us -216.81.58.84 - 216.81.58.87 ca -216.81.58.88 - 216.81.58.95 us -216.81.58.96 - 216.81.58.127 ca -216.81.58.128 - 216.81.58.255 us -216.81.59.0 - 216.81.59.27 ca -216.81.59.28 - 216.81.59.47 us -216.81.59.48 - 216.81.59.63 ca -216.81.59.64 - 216.81.59.87 us -216.81.59.88 - 216.81.59.95 ca -216.81.59.96 - 216.81.59.155 us -216.81.59.156 - 216.81.59.191 ca -216.81.59.192 - 216.81.59.255 us -216.81.60.0 - 216.81.62.255 ca +216.81.48.0 - 216.81.56.31 ca +216.81.56.32 - 216.81.56.39 us +216.81.56.40 - 216.81.56.63 ca +216.81.56.64 - 216.81.56.67 us +216.81.56.68 - 216.81.56.87 ca +216.81.56.88 - 216.81.56.91 us +216.81.56.92 - 216.81.56.95 ca +216.81.56.96 - 216.81.56.99 us +216.81.56.100 - 216.81.58.15 ca +216.81.58.16 - 216.81.58.19 us +216.81.58.20 - 216.81.58.183 ca +216.81.58.184 - 216.81.58.187 us +216.81.58.188 - 216.81.62.255 ca 216.81.63.0 - 216.82.255.255 us 216.83.0.0 - 216.83.31.255 ca -216.83.32.0 - 216.83.36.167 us -216.83.36.168 - 216.83.36.175 hk -216.83.36.176 - 216.83.36.191 us -216.83.36.192 - 216.83.36.199 cn -216.83.36.200 - 216.83.36.207 us -216.83.36.208 - 216.83.36.215 hk -216.83.36.216 - 216.86.95.255 us +216.83.32.0 - 216.86.95.255 us 216.86.96.0 - 216.86.127.255 ca 216.86.128.0 - 216.88.63.255 us 216.88.64.0 - 216.88.64.255 gb -216.88.65.0 - 216.89.96.7 us -216.89.96.8 - 216.89.96.15 ca -216.89.96.16 - 216.89.96.183 us -216.89.96.184 - 216.89.96.191 ca -216.89.96.192 - 216.89.100.255 us +216.88.65.0 - 216.89.100.255 us 216.89.101.0 - 216.89.101.255 ca -216.89.102.0 - 216.89.196.15 us -216.89.196.16 - 216.89.196.31 ca -216.89.196.32 - 216.89.196.111 us -216.89.196.112 - 216.89.196.127 ca -216.89.196.128 - 216.89.220.255 us +216.89.102.0 - 216.89.220.255 us 216.89.221.0 - 216.89.221.255 ca -216.89.222.0 - 216.90.33.31 us -216.90.33.32 - 216.90.33.63 ca -216.90.33.64 - 216.90.48.255 us +216.89.222.0 - 216.90.48.255 us 216.90.49.0 - 216.90.49.255 ca 216.90.50.0 - 216.90.50.255 us 216.90.51.0 - 216.90.51.255 ca -216.90.52.0 - 216.90.121.223 us -216.90.121.224 - 216.90.121.255 ca -216.90.122.0 - 216.90.240.215 us -216.90.240.216 - 216.90.240.223 ca -216.90.240.224 - 216.90.240.247 us -216.90.240.248 - 216.90.240.255 ca -216.90.241.0 - 216.90.242.255 us +216.90.52.0 - 216.90.242.255 us 216.90.243.0 - 216.90.243.255 ca -216.90.244.0 - 216.90.254.31 us -216.90.254.32 - 216.90.254.63 ca -216.90.254.64 - 216.91.66.223 us -216.91.66.224 - 216.91.66.255 ca -216.91.67.0 - 216.91.130.63 us -216.91.130.64 - 216.91.130.95 ca -216.91.130.96 - 216.91.132.31 us -216.91.132.32 - 216.91.132.39 ca -216.91.132.40 - 216.91.132.55 us -216.91.132.56 - 216.91.132.63 ca -216.91.132.64 - 216.93.241.15 us -216.93.241.16 - 216.93.241.31 ug -216.93.241.32 - 216.93.255.255 us -216.94.0.0 - 216.94.1.63 ca -216.94.1.64 - 216.94.1.95 us -216.94.1.96 - 216.94.1.159 ca -216.94.1.160 - 216.94.1.191 us -216.94.1.192 - 216.94.1.255 ca -216.94.2.0 - 216.94.2.31 us -216.94.2.32 - 216.94.2.47 ca -216.94.2.48 - 216.94.2.79 us -216.94.2.80 - 216.94.2.255 ca -216.94.3.0 - 216.94.3.7 us -216.94.3.8 - 216.94.3.15 ca -216.94.3.16 - 216.94.3.23 us -216.94.3.24 - 216.94.3.31 ca -216.94.3.32 - 216.94.3.255 us -216.94.4.0 - 216.94.5.15 ca -216.94.5.16 - 216.94.5.31 us -216.94.5.32 - 216.94.5.63 ca -216.94.5.64 - 216.94.5.79 us -216.94.5.80 - 216.94.5.95 ca -216.94.5.96 - 216.94.5.111 us +216.90.244.0 - 216.94.3.255 us +216.94.4.0 - 216.94.4.255 ca +216.94.5.0 - 216.94.5.111 us 216.94.5.112 - 216.94.5.127 ca -216.94.5.128 - 216.94.5.143 us -216.94.5.144 - 216.94.5.159 ca -216.94.5.160 - 216.94.5.175 us -216.94.5.176 - 216.94.5.207 ca -216.94.5.208 - 216.94.5.223 us -216.94.5.224 - 216.94.6.255 ca -216.94.7.0 - 216.94.7.63 us -216.94.7.64 - 216.94.7.191 ca -216.94.7.192 - 216.94.7.255 us -216.94.8.0 - 216.94.8.127 ca -216.94.8.128 - 216.94.8.191 us -216.94.8.192 - 216.94.11.47 ca -216.94.11.48 - 216.94.11.55 us -216.94.11.56 - 216.94.11.71 ca -216.94.11.72 - 216.94.11.79 us -216.94.11.80 - 216.94.11.159 ca -216.94.11.160 - 216.94.11.167 us -216.94.11.168 - 216.94.13.31 ca -216.94.13.32 - 216.94.13.39 us -216.94.13.40 - 216.94.13.63 ca -216.94.13.64 - 216.94.13.71 us -216.94.13.72 - 216.94.14.31 ca -216.94.14.32 - 216.94.14.63 us -216.94.14.64 - 216.94.14.127 ca -216.94.14.128 - 216.94.14.159 us -216.94.14.160 - 216.94.14.223 ca -216.94.14.224 - 216.94.15.95 us -216.94.15.96 - 216.94.15.127 ca -216.94.15.128 - 216.94.15.159 us -216.94.15.160 - 216.94.15.223 ca -216.94.15.224 - 216.94.15.255 us -216.94.16.0 - 216.94.16.255 ca -216.94.17.0 - 216.94.18.255 us -216.94.19.0 - 216.94.19.15 ca -216.94.19.16 - 216.94.19.31 us -216.94.19.32 - 216.94.19.63 ca -216.94.19.64 - 216.94.19.79 us -216.94.19.80 - 216.94.19.95 ca -216.94.19.96 - 216.94.19.111 us -216.94.19.112 - 216.94.19.159 ca -216.94.19.160 - 216.94.19.175 us -216.94.19.176 - 216.94.20.127 ca -216.94.20.128 - 216.94.20.191 us -216.94.20.192 - 216.94.20.255 ca -216.94.21.0 - 216.94.21.255 us -216.94.22.0 - 216.94.28.159 ca -216.94.28.160 - 216.94.28.191 us -216.94.28.192 - 216.94.34.47 ca -216.94.34.48 - 216.94.34.63 us -216.94.34.64 - 216.94.41.255 ca -216.94.42.0 - 216.94.42.255 us -216.94.43.0 - 216.94.44.87 ca -216.94.44.88 - 216.94.44.95 us -216.94.44.96 - 216.94.44.183 ca -216.94.44.184 - 216.94.44.191 us -216.94.44.192 - 216.94.44.239 ca -216.94.44.240 - 216.94.44.255 us -216.94.45.0 - 216.94.46.31 ca -216.94.46.32 - 216.94.46.63 us -216.94.46.64 - 216.94.47.63 ca -216.94.47.64 - 216.94.47.255 us -216.94.48.0 - 216.94.48.255 ca -216.94.49.0 - 216.94.49.15 us -216.94.49.16 - 216.94.50.119 ca -216.94.50.120 - 216.94.50.179 us -216.94.50.180 - 216.94.53.255 ca -216.94.54.0 - 216.94.54.63 us -216.94.54.64 - 216.94.55.63 ca -216.94.55.64 - 216.94.55.127 us -216.94.55.128 - 216.94.56.255 ca -216.94.57.0 - 216.94.57.63 il -216.94.57.64 - 216.94.57.127 ca -216.94.57.128 - 216.94.57.255 us -216.94.58.0 - 216.94.59.95 ca -216.94.59.96 - 216.94.59.191 us -216.94.59.192 - 216.94.60.95 ca -216.94.60.96 - 216.94.60.111 us -216.94.60.112 - 216.94.64.95 ca -216.94.64.96 - 216.94.64.127 us -216.94.64.128 - 216.94.64.255 ca -216.94.65.0 - 216.94.65.255 us +216.94.5.128 - 216.94.5.255 us +216.94.6.0 - 216.94.6.255 ca +216.94.7.0 - 216.94.8.255 us +216.94.9.0 - 216.94.9.255 ca +216.94.10.0 - 216.94.24.255 us +216.94.25.0 - 216.94.27.255 ca +216.94.28.0 - 216.94.29.255 us +216.94.30.0 - 216.94.32.255 ca +216.94.33.0 - 216.94.34.255 us +216.94.35.0 - 216.94.35.255 ca +216.94.36.0 - 216.94.36.255 us +216.94.37.0 - 216.94.41.63 ca +216.94.41.64 - 216.94.42.255 us +216.94.43.0 - 216.94.43.255 ca +216.94.44.0 - 216.94.44.255 us +216.94.45.0 - 216.94.45.255 ca +216.94.46.0 - 216.94.49.255 us +216.94.50.0 - 216.94.52.255 ca +216.94.53.0 - 216.94.57.255 us +216.94.58.0 - 216.94.58.255 ca +216.94.59.0 - 216.94.60.255 us +216.94.61.0 - 216.94.62.255 ca +216.94.63.0 - 216.94.65.255 us 216.94.66.0 - 216.94.69.255 ca -216.94.70.0 - 216.94.70.15 us -216.94.70.16 - 216.94.70.79 ca -216.94.70.80 - 216.94.70.95 us -216.94.70.96 - 216.94.70.127 ca -216.94.70.128 - 216.94.70.143 us -216.94.70.144 - 216.94.70.191 ca -216.94.70.192 - 216.94.70.207 us -216.94.70.208 - 216.94.70.223 ca -216.94.70.224 - 216.94.70.239 us -216.94.70.240 - 216.94.71.255 ca +216.94.70.0 - 216.94.71.191 us +216.94.71.192 - 216.94.71.255 ca 216.94.72.0 - 216.94.72.255 us 216.94.73.0 - 216.94.73.255 ca -216.94.74.0 - 216.94.74.63 us -216.94.74.64 - 216.94.75.95 ca -216.94.75.96 - 216.94.75.127 us -216.94.75.128 - 216.94.75.255 ca -216.94.76.0 - 216.94.76.255 us +216.94.74.0 - 216.94.76.255 us 216.94.77.0 - 216.94.77.255 ca 216.94.78.0 - 216.94.78.255 us -216.94.79.0 - 216.94.80.255 ca -216.94.81.0 - 216.94.81.255 us -216.94.82.0 - 216.94.83.63 ca -216.94.83.64 - 216.94.83.95 us -216.94.83.96 - 216.94.83.255 ca -216.94.84.0 - 216.94.84.127 us -216.94.84.128 - 216.94.84.255 ca -216.94.85.0 - 216.94.85.15 us -216.94.85.16 - 216.94.85.23 ca -216.94.85.24 - 216.94.85.31 us -216.94.85.32 - 216.94.85.47 ca -216.94.85.48 - 216.94.85.55 us -216.94.85.56 - 216.94.85.95 ca -216.94.85.96 - 216.94.85.103 us -216.94.85.104 - 216.94.85.135 ca -216.94.85.136 - 216.94.85.143 us -216.94.85.144 - 216.94.85.159 ca -216.94.85.160 - 216.94.85.175 us -216.94.85.176 - 216.94.85.183 ca -216.94.85.184 - 216.94.85.191 us -216.94.85.192 - 216.94.85.199 ca -216.94.85.200 - 216.94.85.215 us -216.94.85.216 - 216.94.85.231 ca -216.94.85.232 - 216.94.85.239 us -216.94.85.240 - 216.94.85.247 ca -216.94.85.248 - 216.94.86.255 us -216.94.87.0 - 216.94.87.47 ca -216.94.87.48 - 216.94.87.63 us -216.94.87.64 - 216.94.91.255 ca +216.94.79.0 - 216.94.79.255 ca +216.94.80.0 - 216.94.87.255 us +216.94.88.0 - 216.94.89.255 ca +216.94.90.0 - 216.94.90.255 us +216.94.91.0 - 216.94.91.255 ca 216.94.92.0 - 216.94.92.255 us -216.94.93.0 - 216.94.97.31 ca -216.94.97.32 - 216.94.97.47 us -216.94.97.48 - 216.94.97.79 ca -216.94.97.80 - 216.94.97.111 us -216.94.97.112 - 216.94.97.127 ca -216.94.97.128 - 216.94.97.143 us -216.94.97.144 - 216.94.98.63 ca -216.94.98.64 - 216.94.98.127 us -216.94.98.128 - 216.94.98.255 ca -216.94.99.0 - 216.94.99.127 us -216.94.99.128 - 216.94.102.47 ca -216.94.102.48 - 216.94.102.63 us -216.94.102.64 - 216.94.102.175 ca -216.94.102.176 - 216.94.102.191 us -216.94.102.192 - 216.94.102.207 ca -216.94.102.208 - 216.94.102.239 us -216.94.102.240 - 216.94.104.63 ca -216.94.104.64 - 216.94.104.127 us -216.94.104.128 - 216.94.104.255 ca -216.94.105.0 - 216.94.105.255 cn -216.94.106.0 - 216.94.113.15 ca -216.94.113.16 - 216.94.113.31 us -216.94.113.32 - 216.94.113.47 ca -216.94.113.48 - 216.94.113.63 us -216.94.113.64 - 216.94.113.255 ca -216.94.114.0 - 216.94.114.255 us -216.94.115.0 - 216.94.116.127 ca -216.94.116.128 - 216.94.116.255 cn +216.94.93.0 - 216.94.96.255 ca +216.94.97.0 - 216.94.97.63 us +216.94.97.64 - 216.94.97.79 ca +216.94.97.80 - 216.94.106.255 us +216.94.107.0 - 216.94.107.255 ca +216.94.108.0 - 216.94.108.255 us +216.94.109.0 - 216.94.111.255 ca +216.94.112.0 - 216.94.116.255 us 216.94.117.0 - 216.94.117.255 ca 216.94.118.0 - 216.94.118.255 us -216.94.119.0 - 216.94.125.207 ca -216.94.125.208 - 216.94.125.223 us -216.94.125.224 - 216.94.126.255 ca -216.94.127.0 - 216.94.127.255 us -216.94.128.0 - 216.94.128.63 ca -216.94.128.64 - 216.94.128.255 us -216.94.129.0 - 216.94.137.47 ca -216.94.137.48 - 216.94.137.79 us -216.94.137.80 - 216.94.137.143 ca -216.94.137.144 - 216.94.137.175 us -216.94.137.176 - 216.94.137.223 ca -216.94.137.224 - 216.94.137.255 us -216.94.138.0 - 216.94.138.7 ca -216.94.138.8 - 216.94.138.15 us -216.94.138.16 - 216.94.138.47 ca -216.94.138.48 - 216.94.138.63 us -216.94.138.64 - 216.94.138.103 ca -216.94.138.104 - 216.94.138.127 us -216.94.138.128 - 216.94.138.159 ca -216.94.138.160 - 216.94.138.175 us -216.94.138.176 - 216.94.141.47 ca -216.94.141.48 - 216.94.141.63 us -216.94.141.64 - 216.94.141.239 ca -216.94.141.240 - 216.94.141.255 us -216.94.142.0 - 216.94.142.255 ca -216.94.143.0 - 216.94.145.63 us -216.94.145.64 - 216.94.145.127 ca -216.94.145.128 - 216.94.145.191 us -216.94.145.192 - 216.94.145.255 ca -216.94.146.0 - 216.94.146.255 us -216.94.147.0 - 216.94.147.159 ca -216.94.147.160 - 216.94.147.191 us -216.94.147.192 - 216.94.151.127 ca -216.94.151.128 - 216.94.151.191 us -216.94.151.192 - 216.94.155.127 ca -216.94.155.128 - 216.94.155.159 us -216.94.155.160 - 216.94.157.31 ca -216.94.157.32 - 216.94.157.47 us -216.94.157.48 - 216.94.157.207 ca -216.94.157.208 - 216.94.157.223 ag -216.94.157.224 - 216.94.157.255 ca -216.94.158.0 - 216.94.161.255 us -216.94.162.0 - 216.94.163.127 ca -216.94.163.128 - 216.94.163.255 us -216.94.164.0 - 216.94.166.255 ca -216.94.167.0 - 216.94.167.255 us -216.94.168.0 - 216.94.171.255 ca -216.94.172.0 - 216.94.172.31 ch -216.94.172.32 - 216.94.172.255 ca -216.94.173.0 - 216.94.173.63 us -216.94.173.64 - 216.94.173.191 ca -216.94.173.192 - 216.94.173.255 us -216.94.174.0 - 216.94.174.143 ca -216.94.174.144 - 216.94.174.159 us -216.94.174.160 - 216.94.174.255 ca -216.94.175.0 - 216.94.176.63 us -216.94.176.64 - 216.94.176.255 ca -216.94.177.0 - 216.94.177.255 us -216.94.178.0 - 216.94.178.255 ca -216.94.179.0 - 216.94.179.255 us -216.94.180.0 - 216.94.180.255 ca -216.94.181.0 - 216.94.181.255 us -216.94.182.0 - 216.94.183.255 ca -216.94.184.0 - 216.94.184.143 us -216.94.184.144 - 216.94.184.151 ca -216.94.184.152 - 216.94.184.175 us -216.94.184.176 - 216.94.184.255 ca -216.94.185.0 - 216.94.185.255 us -216.94.186.0 - 216.94.186.191 ca -216.94.186.192 - 216.94.186.255 us -216.94.187.0 - 216.94.190.255 ca +216.94.119.0 - 216.94.119.255 ca +216.94.120.0 - 216.94.125.255 us +216.94.126.0 - 216.94.126.255 ca +216.94.127.0 - 216.94.131.255 us +216.94.132.0 - 216.94.133.255 ca +216.94.134.0 - 216.94.139.255 us +216.94.140.0 - 216.94.140.255 ca +216.94.141.0 - 216.94.168.255 us +216.94.169.0 - 216.94.169.255 ca +216.94.170.0 - 216.94.170.255 us +216.94.171.0 - 216.94.171.255 ca +216.94.172.0 - 216.94.181.255 us +216.94.182.0 - 216.94.182.255 ca +216.94.183.0 - 216.94.189.255 us +216.94.190.0 - 216.94.190.255 ca 216.94.191.0 - 216.94.192.255 us 216.94.193.0 - 216.94.194.255 ca -216.94.195.0 - 216.94.196.255 us -216.94.197.0 - 216.94.200.31 ca -216.94.200.32 - 216.94.200.47 us -216.94.200.48 - 216.94.200.79 ca -216.94.200.80 - 216.94.200.95 us -216.94.200.96 - 216.94.201.255 ca -216.94.202.0 - 216.94.202.255 us -216.94.203.0 - 216.94.208.47 ca -216.94.208.48 - 216.94.208.63 us -216.94.208.64 - 216.94.208.239 ca -216.94.208.240 - 216.94.208.255 us -216.94.209.0 - 216.94.209.31 ca -216.94.209.32 - 216.94.209.255 us -216.94.210.0 - 216.94.210.175 ca -216.94.210.176 - 216.94.210.191 us -216.94.210.192 - 216.94.211.254 ca -216.94.211.255 - 216.94.212.7 us -216.94.212.8 - 216.94.212.55 ca -216.94.212.56 - 216.94.212.63 us -216.94.212.64 - 216.94.212.183 ca -216.94.212.184 - 216.94.212.191 us -216.94.212.192 - 216.94.213.255 ca -216.94.214.0 - 216.94.214.255 us -216.94.215.0 - 216.94.215.255 ca -216.94.216.0 - 216.94.216.31 us -216.94.216.32 - 216.94.216.159 ca -216.94.216.160 - 216.94.216.223 us -216.94.216.224 - 216.94.217.255 ca -216.94.218.0 - 216.94.218.7 us -216.94.218.8 - 216.94.218.15 ca -216.94.218.16 - 216.94.218.23 us -216.94.218.24 - 216.94.218.31 ca -216.94.218.32 - 216.94.218.39 us -216.94.218.40 - 216.94.218.55 ca -216.94.218.56 - 216.94.218.71 us -216.94.218.72 - 216.94.218.87 ca -216.94.218.88 - 216.94.218.95 us -216.94.218.96 - 216.94.218.151 ca -216.94.218.152 - 216.94.218.167 us -216.94.218.168 - 216.94.218.183 ca -216.94.218.184 - 216.94.218.191 us -216.94.218.192 - 216.94.218.199 ca -216.94.218.200 - 216.94.218.207 us -216.94.218.208 - 216.94.218.255 ca -216.94.219.0 - 216.94.219.255 us -216.94.220.0 - 216.94.220.127 ca -216.94.220.128 - 216.94.221.127 us -216.94.221.128 - 216.94.226.47 ca -216.94.226.48 - 216.94.226.255 us +216.94.195.0 - 216.94.204.255 us +216.94.205.0 - 216.94.205.255 ca +216.94.206.0 - 216.94.212.255 us +216.94.213.0 - 216.94.213.255 ca +216.94.214.0 - 216.94.222.255 us +216.94.223.0 - 216.94.223.255 ca +216.94.224.0 - 216.94.226.255 us 216.94.227.0 - 216.94.228.255 ca -216.94.229.0 - 216.94.230.255 kw -216.94.231.0 - 216.94.232.63 ca -216.94.232.64 - 216.94.232.95 us -216.94.232.96 - 216.94.238.255 ca -216.94.239.0 - 216.94.239.255 kw -216.94.240.0 - 216.94.241.127 ca -216.94.241.128 - 216.94.242.255 us -216.94.243.0 - 216.94.245.63 ca -216.94.245.64 - 216.94.245.95 us -216.94.245.96 - 216.94.245.127 ca -216.94.245.128 - 216.94.245.159 us -216.94.245.160 - 216.94.245.255 ca -216.94.246.0 - 216.94.247.63 us -216.94.247.64 - 216.94.253.191 ca -216.94.253.192 - 216.94.253.255 us +216.94.229.0 - 216.94.248.255 us +216.94.249.0 - 216.94.252.255 ca +216.94.253.0 - 216.94.253.255 us 216.94.254.0 - 216.94.255.255 ca -216.95.0.0 - 216.95.5.159 us -216.95.5.160 - 216.95.5.175 ca -216.95.5.176 - 216.95.5.207 us -216.95.5.208 - 216.95.5.223 ca -216.95.5.224 - 216.95.143.255 us -216.95.144.0 - 216.95.145.63 ca -216.95.145.64 - 216.95.145.95 us -216.95.145.96 - 216.95.145.191 ca -216.95.145.192 - 216.95.145.255 us -216.95.146.0 - 216.95.154.31 ca -216.95.154.32 - 216.95.154.63 us -216.95.154.64 - 216.95.154.223 ca -216.95.154.224 - 216.95.154.255 us -216.95.155.0 - 216.95.157.255 ca -216.95.158.0 - 216.95.158.15 gb -216.95.158.16 - 216.95.158.223 ca -216.95.158.224 - 216.95.159.255 us -216.95.160.0 - 216.95.168.63 ca -216.95.168.64 - 216.95.168.127 us -216.95.168.128 - 216.95.168.191 ca -216.95.168.192 - 216.95.168.255 us -216.95.169.0 - 216.95.169.63 ca -216.95.169.64 - 216.95.169.95 us -216.95.169.96 - 216.95.169.159 ca -216.95.169.160 - 216.95.169.191 us -216.95.169.192 - 216.95.172.15 ca -216.95.172.16 - 216.95.172.31 us -216.95.172.32 - 216.95.172.47 ca -216.95.172.48 - 216.95.172.63 us -216.95.172.64 - 216.95.172.207 ca -216.95.172.208 - 216.95.172.255 us -216.95.173.0 - 216.95.174.31 ca -216.95.174.32 - 216.95.174.63 us -216.95.174.64 - 216.95.174.95 ca -216.95.174.96 - 216.95.174.255 us -216.95.175.0 - 216.95.175.63 ca -216.95.175.64 - 216.95.175.95 us -216.95.175.96 - 216.95.175.127 ca -216.95.175.128 - 216.95.175.159 us -216.95.175.160 - 216.95.183.63 ca -216.95.183.64 - 216.95.183.95 us -216.95.183.96 - 216.95.189.159 ca -216.95.189.160 - 216.95.189.191 us -216.95.189.192 - 216.95.190.191 ca -216.95.190.192 - 216.95.191.255 us -216.95.192.0 - 216.95.195.255 ca -216.95.196.0 - 216.95.196.255 us -216.95.197.0 - 216.95.197.255 ca -216.95.198.0 - 216.95.198.255 us -216.95.199.0 - 216.95.199.63 ca -216.95.199.64 - 216.95.199.79 us -216.95.199.80 - 216.95.199.95 ca -216.95.199.96 - 216.95.199.111 us -216.95.199.112 - 216.95.209.55 ca -216.95.209.56 - 216.95.209.63 us -216.95.209.64 - 216.95.209.79 ca -216.95.209.80 - 216.95.209.87 us -216.95.209.88 - 216.95.209.95 ca -216.95.209.96 - 216.95.209.103 us -216.95.209.104 - 216.95.209.191 ca -216.95.209.192 - 216.95.209.199 us -216.95.209.200 - 216.95.210.255 ca -216.95.211.0 - 216.95.211.255 us -216.95.212.0 - 216.95.212.127 ca -216.95.212.128 - 216.95.212.159 us -216.95.212.160 - 216.95.214.127 ca -216.95.214.128 - 216.95.214.191 us -216.95.214.192 - 216.95.215.255 ca +216.95.0.0 - 216.95.114.255 us +216.95.115.0 - 216.95.115.255 ca +216.95.116.0 - 216.95.145.255 us +216.95.146.0 - 216.95.146.255 ca +216.95.147.0 - 216.95.169.255 us +216.95.170.0 - 216.95.171.255 ca +216.95.172.0 - 216.95.172.255 us +216.95.173.0 - 216.95.173.255 ca +216.95.174.0 - 216.95.183.255 us +216.95.184.0 - 216.95.185.255 ca +216.95.186.0 - 216.95.187.255 us +216.95.188.0 - 216.95.188.255 ca +216.95.189.0 - 216.95.201.255 us +216.95.202.0 - 216.95.202.255 ca +216.95.203.0 - 216.95.205.255 us +216.95.206.0 - 216.95.206.255 ca +216.95.207.0 - 216.95.208.255 us +216.95.209.0 - 216.95.209.255 ca +216.95.210.0 - 216.95.214.255 us +216.95.215.0 - 216.95.215.255 ca 216.95.216.0 - 216.95.216.255 us 216.95.217.0 - 216.95.217.255 ca -216.95.218.0 - 216.95.218.15 us -216.95.218.16 - 216.95.218.87 ca -216.95.218.88 - 216.95.218.103 us -216.95.218.104 - 216.95.218.111 ca -216.95.218.112 - 216.95.218.119 us -216.95.218.120 - 216.95.218.143 ca -216.95.218.144 - 216.95.218.175 us -216.95.218.176 - 216.95.218.215 ca -216.95.218.216 - 216.95.218.223 us -216.95.218.224 - 216.95.219.255 ca -216.95.220.0 - 216.95.220.23 us -216.95.220.24 - 216.95.220.31 ca -216.95.220.32 - 216.95.220.215 us -216.95.220.216 - 216.95.220.239 ca -216.95.220.240 - 216.95.220.255 us -216.95.221.0 - 216.95.224.63 ca -216.95.224.64 - 216.95.224.127 us -216.95.224.128 - 216.95.225.127 ca -216.95.225.128 - 216.95.225.191 us -216.95.225.192 - 216.95.229.255 ca -216.95.230.0 - 216.95.230.255 us -216.95.231.0 - 216.95.231.7 ca -216.95.231.8 - 216.95.231.15 us -216.95.231.16 - 216.95.231.47 ca -216.95.231.48 - 216.95.231.55 us -216.95.231.56 - 216.95.231.215 ca -216.95.231.216 - 216.95.231.247 us -216.95.231.248 - 216.95.234.255 ca -216.95.235.0 - 216.95.235.15 us -216.95.235.16 - 216.95.235.111 ca -216.95.235.112 - 216.95.235.127 us -216.95.235.128 - 216.95.235.175 ca -216.95.235.176 - 216.95.235.191 us -216.95.235.192 - 216.95.235.239 ca -216.95.235.240 - 216.95.235.255 us -216.95.236.0 - 216.95.242.191 ca -216.95.242.192 - 216.95.242.223 us -216.95.242.224 - 216.95.243.31 ca -216.95.243.32 - 216.95.243.47 us -216.95.243.48 - 216.95.243.79 ca -216.95.243.80 - 216.95.243.95 us -216.95.243.96 - 216.95.243.191 ca -216.95.243.192 - 216.95.243.207 us -216.95.243.208 - 216.95.244.255 ca -216.95.245.0 - 216.95.245.63 us -216.95.245.64 - 216.95.245.191 ca -216.95.245.192 - 216.95.245.255 us -216.95.246.0 - 216.95.247.103 ca -216.95.247.104 - 216.95.247.111 fr -216.95.247.112 - 216.95.247.119 ca -216.95.247.120 - 216.95.247.135 us -216.95.247.136 - 216.95.248.63 ca -216.95.248.64 - 216.95.248.127 us -216.95.248.128 - 216.95.251.255 ca -216.95.252.0 - 216.95.252.255 us -216.95.253.0 - 216.95.253.63 ca -216.95.253.64 - 216.95.253.127 us -216.95.253.128 - 216.95.255.255 ca -216.96.0.0 - 216.98.1.255 us -216.98.2.0 - 216.98.2.15 ru -216.98.2.16 - 216.98.31.255 us +216.95.218.0 - 216.95.220.255 us +216.95.221.0 - 216.95.221.255 ca +216.95.222.0 - 216.95.225.255 us +216.95.226.0 - 216.95.226.255 ca +216.95.227.0 - 216.95.228.255 us +216.95.229.0 - 216.95.229.255 ca +216.95.230.0 - 216.95.235.255 us +216.95.236.0 - 216.95.236.255 ca +216.95.237.0 - 216.95.237.255 us +216.95.238.0 - 216.95.239.255 ca +216.95.240.0 - 216.95.254.255 us +216.95.255.0 - 216.95.255.255 ca +216.96.0.0 - 216.98.31.255 us 216.98.32.0 - 216.98.63.255 ca -216.98.64.0 - 216.98.113.175 us -216.98.113.176 - 216.98.113.191 jp -216.98.113.192 - 216.99.31.255 us -216.99.32.0 - 216.99.63.255 ca +216.98.64.0 - 216.99.33.255 us +216.99.34.0 - 216.99.63.255 ca 216.99.64.0 - 216.99.95.255 us 216.99.96.0 - 216.99.111.255 ca 216.99.112.0 - 216.104.95.255 us 216.104.96.0 - 216.104.127.255 ca -216.104.128.0 - 216.104.204.255 us -216.104.205.0 - 216.104.206.255 tz -216.104.207.0 - 216.105.79.255 us +216.104.128.0 - 216.104.199.255 us +216.104.200.0 - 216.104.207.255 ug +216.104.208.0 - 216.105.79.255 us 216.105.80.0 - 216.105.95.255 ca -216.105.96.0 - 216.105.107.240 us -216.105.107.241 - 216.105.107.248 ie -216.105.107.249 - 216.106.95.255 us +216.105.96.0 - 216.106.95.255 us 216.106.96.0 - 216.106.111.255 ca -216.106.112.0 - 216.107.255.255 us +216.106.112.0 - 216.107.17.255 us +216.107.18.0 - 216.107.18.255 ca +216.107.19.0 - 216.107.24.255 us +216.107.25.0 - 216.107.25.255 ca +216.107.26.0 - 216.107.255.255 us 216.108.0.0 - 216.108.191.255 ca -216.108.192.0 - 216.108.224.37 us -216.108.224.38 - 216.108.224.53 gb -216.108.224.54 - 216.108.224.75 us -216.108.224.76 - 216.108.224.91 mx -216.108.224.92 - 216.108.224.133 us -216.108.224.134 - 216.108.224.165 br -216.108.224.166 - 216.108.228.3 us -216.108.228.4 - 216.108.228.99 hu -216.108.228.100 - 216.108.228.163 us -216.108.228.164 - 216.108.228.199 hu -216.108.228.200 - 216.108.228.227 us -216.108.228.228 - 216.108.228.235 cn -216.108.228.236 - 216.108.229.85 us -216.108.229.86 - 216.108.229.101 ca -216.108.229.102 - 216.108.229.127 us -216.108.229.128 - 216.108.229.143 cn -216.108.229.144 - 216.108.231.207 us -216.108.231.208 - 216.108.231.223 cn -216.108.231.224 - 216.108.234.107 us -216.108.234.108 - 216.108.234.123 cn -216.108.234.124 - 216.108.234.133 us -216.108.234.134 - 216.108.234.165 bd -216.108.234.166 - 216.108.234.197 ua -216.108.234.198 - 216.108.236.215 us -216.108.236.216 - 216.108.236.231 cn -216.108.236.232 - 216.108.238.3 us -216.108.238.4 - 216.108.238.254 lt -216.108.238.255 - 216.109.67.207 us -216.109.67.208 - 216.109.67.223 ca -216.109.67.224 - 216.109.67.255 us +216.108.192.0 - 216.109.67.255 us 216.109.68.0 - 216.109.68.255 ca -216.109.69.0 - 216.109.84.79 us -216.109.84.80 - 216.109.84.95 ca -216.109.84.96 - 216.109.84.175 us -216.109.84.176 - 216.109.84.183 ca -216.109.84.184 - 216.109.91.255 us -216.109.92.0 - 216.109.92.127 ca -216.109.92.128 - 216.109.93.95 us -216.109.93.96 - 216.109.93.103 ca -216.109.93.104 - 216.109.138.169 us -216.109.138.170 - 216.109.138.189 gb -216.109.138.190 - 216.109.141.229 us -216.109.141.230 - 216.109.141.239 ca -216.109.141.240 - 216.109.142.79 us -216.109.142.80 - 216.109.142.89 ca -216.109.142.90 - 216.109.142.149 us -216.109.142.150 - 216.109.142.159 ca -216.109.142.160 - 216.109.145.29 us -216.109.145.30 - 216.109.145.39 no -216.109.145.40 - 216.110.95.255 us -216.110.96.0 - 216.110.96.193 bb -216.110.96.194 - 216.110.96.194 vc -216.110.96.195 - 216.110.96.195 bb -216.110.96.196 - 216.110.96.199 vc -216.110.96.200 - 216.110.96.201 bb -216.110.96.202 - 216.110.96.206 vc -216.110.96.207 - 216.110.96.207 bb -216.110.96.208 - 216.110.96.209 vc -216.110.96.210 - 216.110.96.212 bb -216.110.96.213 - 216.110.96.213 vc -216.110.96.214 - 216.110.96.225 bb -216.110.96.226 - 216.110.96.226 vc -216.110.96.227 - 216.110.96.233 bb -216.110.96.234 - 216.110.96.235 vc -216.110.96.236 - 216.110.96.237 bb -216.110.96.238 - 216.110.96.238 vc -216.110.96.239 - 216.110.96.241 bb -216.110.96.242 - 216.110.96.242 vc -216.110.96.243 - 216.110.96.247 bb -216.110.96.248 - 216.110.96.248 vc -216.110.96.249 - 216.110.112.255 bb +216.109.69.0 - 216.110.95.255 us +216.110.96.0 - 216.110.97.255 vc +216.110.98.0 - 216.110.112.255 bb 216.110.113.0 - 216.110.116.255 gd 216.110.117.0 - 216.110.117.255 bb 216.110.118.0 - 216.110.118.255 gd @@ -152191,678 +113891,88 @@ 216.111.0.0 - 216.112.255.255 us 216.113.0.0 - 216.113.127.255 ca 216.113.128.0 - 216.113.191.255 us -216.113.192.0 - 216.113.193.47 ca -216.113.193.48 - 216.113.193.63 us -216.113.193.64 - 216.113.223.255 ca -216.113.224.0 - 216.114.255.255 us -216.115.0.0 - 216.115.15.255 a2 -216.115.16.0 - 216.115.76.255 us -216.115.77.0 - 216.115.77.255 gb -216.115.78.0 - 216.115.255.255 us -216.116.8.0 - 216.116.15.255 ca -216.116.16.0 - 216.118.127.255 us +216.113.192.0 - 216.113.223.255 ca +216.113.224.0 - 216.118.127.255 us 216.118.128.0 - 216.118.159.255 ca -216.118.160.0 - 216.118.200.47 us -216.118.200.48 - 216.118.200.55 ca -216.118.200.56 - 216.118.207.255 us -216.118.208.0 - 216.118.223.255 ca -216.118.224.0 - 216.118.226.7 a2 -216.118.226.8 - 216.118.226.15 us -216.118.226.16 - 216.118.226.23 bo -216.118.226.24 - 216.118.226.31 a2 -216.118.226.32 - 216.118.226.39 bo -216.118.226.40 - 216.118.226.47 us +216.118.160.0 - 216.118.207.255 us +216.118.208.0 - 216.118.215.255 ca +216.118.216.0 - 216.118.216.255 us +216.118.217.0 - 216.118.221.255 ca +216.118.222.0 - 216.118.223.255 us +216.118.224.0 - 216.118.226.47 a2 216.118.226.48 - 216.118.226.63 ec -216.118.226.64 - 216.118.226.79 bo -216.118.226.80 - 216.118.226.127 a2 -216.118.226.128 - 216.118.226.159 bo -216.118.226.160 - 216.118.226.191 ec -216.118.226.192 - 216.118.226.255 us -216.118.227.0 - 216.118.227.127 co -216.118.227.128 - 216.118.227.191 ni -216.118.227.192 - 216.118.228.255 a2 +216.118.226.64 - 216.118.226.255 a2 +216.118.227.0 - 216.118.227.255 us +216.118.228.0 - 216.118.228.255 a2 216.118.229.0 - 216.118.229.255 ng 216.118.230.0 - 216.118.230.255 ec 216.118.231.0 - 216.118.231.255 us 216.118.232.0 - 216.118.232.255 jm -216.118.233.0 - 216.118.236.255 py +216.118.233.0 - 216.118.233.255 py +216.118.234.0 - 216.118.234.255 a2 +216.118.235.0 - 216.118.236.255 py 216.118.237.0 - 216.118.237.255 ng -216.118.238.0 - 216.118.238.255 a2 -216.118.239.0 - 216.118.239.31 us -216.118.239.32 - 216.118.239.63 a2 -216.118.239.64 - 216.118.239.95 us -216.118.239.96 - 216.118.239.111 a2 -216.118.239.112 - 216.118.239.143 us -216.118.239.144 - 216.118.239.159 ec -216.118.239.160 - 216.118.239.175 jm -216.118.239.176 - 216.118.239.207 bb -216.118.239.208 - 216.118.239.223 ec -216.118.239.224 - 216.118.255.255 a2 -216.119.0.0 - 216.119.136.31 us -216.119.136.32 - 216.119.136.39 ar -216.119.136.40 - 216.119.136.47 us -216.119.136.48 - 216.119.136.55 ca -216.119.136.56 - 216.119.136.71 us -216.119.136.72 - 216.119.136.79 ve -216.119.136.80 - 216.119.136.151 us -216.119.136.152 - 216.119.136.159 gb -216.119.136.160 - 216.119.136.167 us -216.119.136.168 - 216.119.136.175 pt -216.119.136.176 - 216.119.136.183 us -216.119.136.184 - 216.119.136.191 in -216.119.136.192 - 216.119.136.207 us -216.119.136.208 - 216.119.136.215 ca -216.119.136.216 - 216.119.136.239 us -216.119.136.240 - 216.119.136.247 uy -216.119.136.248 - 216.119.136.255 de -216.119.137.0 - 216.119.137.15 us -216.119.137.16 - 216.119.137.23 mx -216.119.137.24 - 216.119.137.31 jp -216.119.137.32 - 216.119.137.39 cy -216.119.137.40 - 216.119.137.47 us -216.119.137.48 - 216.119.137.55 ar -216.119.137.56 - 216.119.137.183 us -216.119.137.184 - 216.119.137.191 nz -216.119.137.192 - 216.119.137.239 us -216.119.137.240 - 216.119.137.247 ca -216.119.137.248 - 216.119.138.127 us -216.119.138.128 - 216.119.138.135 mx -216.119.138.136 - 216.119.138.143 ca -216.119.138.144 - 216.119.138.159 us -216.119.138.160 - 216.119.138.167 br -216.119.138.168 - 216.119.138.183 gb -216.119.138.184 - 216.119.139.7 us -216.119.139.8 - 216.119.139.15 br -216.119.139.16 - 216.119.139.23 in -216.119.139.24 - 216.121.127.255 us +216.118.238.0 - 216.118.255.255 a2 +216.119.0.0 - 216.121.127.255 us 216.121.128.0 - 216.121.255.255 ca -216.122.0.0 - 216.122.20.31 us -216.122.20.32 - 216.122.20.63 ca -216.122.20.64 - 216.122.30.31 us -216.122.30.32 - 216.122.30.63 ca -216.122.30.64 - 216.122.255.255 us +216.122.0.0 - 216.122.255.255 us 216.123.0.0 - 216.123.255.255 ca 216.124.0.0 - 216.126.63.255 us 216.126.64.0 - 216.126.127.255 ca -216.126.128.0 - 216.126.239.255 us +216.126.128.0 - 216.126.199.255 us +216.126.200.0 - 216.126.203.255 ca +216.126.204.0 - 216.126.239.255 us 216.126.240.0 - 216.126.255.255 ca -216.127.0.0 - 216.127.119.255 us +216.127.0.0 - 216.127.64.159 us +216.127.64.160 - 216.127.64.175 au +216.127.64.176 - 216.127.64.183 us +216.127.64.184 - 216.127.64.191 sg +216.127.64.192 - 216.127.119.255 us 216.127.120.0 - 216.127.120.255 a2 216.127.121.0 - 216.127.165.255 us 216.127.166.0 - 216.127.166.255 ca -216.127.167.0 - 216.128.10.201 us -216.128.10.202 - 216.128.10.234 ca -216.128.10.235 - 216.128.24.237 us -216.128.24.238 - 216.128.24.249 au -216.128.24.250 - 216.128.68.207 us -216.128.68.208 - 216.128.68.223 ca -216.128.68.224 - 216.128.75.15 us -216.128.75.16 - 216.128.75.31 ca -216.128.75.32 - 216.128.87.47 us -216.128.87.48 - 216.128.87.63 ph -216.128.87.64 - 216.128.95.191 us -216.128.95.192 - 216.128.95.255 gb -216.128.96.0 - 216.128.255.255 us +216.127.167.0 - 216.128.255.255 us 216.129.0.0 - 216.129.95.255 ca -216.129.96.0 - 216.129.191.255 us +216.129.96.0 - 216.129.169.255 us +216.129.170.0 - 216.129.173.255 ca +216.129.174.0 - 216.129.191.255 us 216.129.192.0 - 216.129.223.255 ca 216.129.224.0 - 216.130.63.255 us 216.130.64.0 - 216.130.95.255 ca 216.130.96.0 - 216.130.207.255 us 216.130.208.0 - 216.130.223.255 ca -216.130.224.0 - 216.131.64.63 us -216.131.64.64 - 216.131.64.79 gb -216.131.64.80 - 216.131.64.111 us -216.131.64.112 - 216.131.64.127 gb -216.131.64.128 - 216.131.64.135 dk -216.131.64.136 - 216.131.64.159 us -216.131.64.160 - 216.131.64.167 nl -216.131.64.168 - 216.131.64.175 ru -216.131.64.176 - 216.131.64.183 us -216.131.64.184 - 216.131.64.191 ve -216.131.64.192 - 216.131.64.207 us -216.131.64.208 - 216.131.64.215 gb -216.131.64.216 - 216.131.64.231 us -216.131.64.232 - 216.131.64.239 fr -216.131.64.240 - 216.131.64.247 us -216.131.64.248 - 216.131.64.255 ru -216.131.65.0 - 216.131.65.31 tk -216.131.65.32 - 216.131.65.47 us -216.131.65.48 - 216.131.65.55 de -216.131.65.56 - 216.131.65.87 us -216.131.65.88 - 216.131.65.95 ca -216.131.65.96 - 216.131.65.103 gb -216.131.65.104 - 216.131.65.135 us -216.131.65.136 - 216.131.65.143 ca -216.131.65.144 - 216.131.65.159 gb -216.131.65.160 - 216.131.65.191 us -216.131.65.192 - 216.131.65.255 ca -216.131.66.0 - 216.131.66.255 us -216.131.67.0 - 216.131.67.63 io -216.131.67.64 - 216.131.67.159 us -216.131.67.160 - 216.131.67.175 th -216.131.67.176 - 216.131.67.255 us -216.131.68.0 - 216.131.68.7 gb -216.131.68.8 - 216.131.68.15 us -216.131.68.16 - 216.131.68.31 th -216.131.68.32 - 216.131.68.135 us -216.131.68.136 - 216.131.68.143 th -216.131.68.144 - 216.131.68.151 us -216.131.68.152 - 216.131.68.159 ca -216.131.68.160 - 216.131.68.183 us -216.131.68.184 - 216.131.68.191 ch -216.131.68.192 - 216.131.68.199 us -216.131.68.200 - 216.131.68.207 ca -216.131.68.208 - 216.131.68.231 us -216.131.68.232 - 216.131.68.239 gb -216.131.68.240 - 216.131.68.247 us -216.131.68.248 - 216.131.68.255 pl -216.131.69.0 - 216.131.69.95 us -216.131.69.96 - 216.131.69.111 gb -216.131.69.112 - 216.131.69.215 us -216.131.69.216 - 216.131.69.223 gb -216.131.69.224 - 216.131.69.231 kw -216.131.69.232 - 216.131.69.239 us -216.131.69.240 - 216.131.69.247 ca -216.131.69.248 - 216.131.69.255 gb -216.131.70.0 - 216.131.70.207 us -216.131.70.208 - 216.131.70.215 bz -216.131.70.216 - 216.131.70.223 ca -216.131.70.224 - 216.131.70.247 us -216.131.70.248 - 216.131.70.255 tk -216.131.71.0 - 216.131.71.191 us -216.131.71.192 - 216.131.71.199 gb -216.131.71.200 - 216.131.72.95 us -216.131.72.96 - 216.131.72.127 th -216.131.72.128 - 216.131.74.255 us -216.131.75.0 - 216.131.75.15 gb -216.131.75.16 - 216.131.75.55 us -216.131.75.56 - 216.131.75.63 au -216.131.75.64 - 216.131.75.79 us -216.131.75.80 - 216.131.75.87 gb -216.131.75.88 - 216.131.75.255 us -216.131.76.0 - 216.131.76.7 ca -216.131.76.8 - 216.131.76.31 us -216.131.76.32 - 216.131.76.39 nl -216.131.76.40 - 216.131.76.47 gi -216.131.76.48 - 216.131.76.63 gb -216.131.76.64 - 216.131.76.79 us -216.131.76.80 - 216.131.76.87 ca -216.131.76.88 - 216.131.76.95 us -216.131.76.96 - 216.131.76.127 sk -216.131.76.128 - 216.131.76.223 us -216.131.76.224 - 216.131.76.255 gb -216.131.77.0 - 216.131.77.15 us -216.131.77.16 - 216.131.77.23 au -216.131.77.24 - 216.131.77.31 pl -216.131.77.32 - 216.131.77.87 us -216.131.77.88 - 216.131.77.95 ca -216.131.77.96 - 216.131.77.175 us -216.131.77.176 - 216.131.77.191 th -216.131.77.192 - 216.131.77.231 us -216.131.77.232 - 216.131.77.239 gb -216.131.77.240 - 216.131.77.247 de -216.131.77.248 - 216.131.78.47 us -216.131.78.48 - 216.131.78.55 tr -216.131.78.56 - 216.131.78.63 ca -216.131.78.64 - 216.131.78.79 au -216.131.78.80 - 216.131.78.95 tw -216.131.78.96 - 216.131.78.111 us -216.131.78.112 - 216.131.78.119 nl -216.131.78.120 - 216.131.78.127 us -216.131.78.128 - 216.131.78.143 sr -216.131.78.144 - 216.131.78.151 gi -216.131.78.152 - 216.131.78.159 gb -216.131.78.160 - 216.131.78.223 us -216.131.78.224 - 216.131.78.239 ca -216.131.78.240 - 216.131.78.247 gb -216.131.78.248 - 216.131.80.31 us -216.131.80.32 - 216.131.80.39 gb -216.131.80.40 - 216.131.81.15 us -216.131.81.16 - 216.131.81.31 gb -216.131.81.32 - 216.131.81.39 sg -216.131.81.40 - 216.131.81.47 jp -216.131.81.48 - 216.131.81.79 us -216.131.81.80 - 216.131.81.87 gi -216.131.81.88 - 216.131.81.119 us -216.131.81.120 - 216.131.81.127 hk -216.131.81.128 - 216.131.81.135 il -216.131.81.136 - 216.131.81.143 ca -216.131.81.144 - 216.131.81.159 us -216.131.81.160 - 216.131.81.175 ca -216.131.81.176 - 216.131.81.183 us -216.131.81.184 - 216.131.81.191 bz -216.131.81.192 - 216.131.81.199 us -216.131.81.200 - 216.131.81.207 fr -216.131.81.208 - 216.131.81.215 us -216.131.81.216 - 216.131.81.223 ca -216.131.81.224 - 216.131.81.231 hk -216.131.81.232 - 216.131.81.247 us -216.131.81.248 - 216.131.81.255 gb -216.131.82.0 - 216.131.82.191 us -216.131.82.192 - 216.131.82.223 tw -216.131.82.224 - 216.131.82.239 us -216.131.82.240 - 216.131.82.247 gb -216.131.82.248 - 216.131.82.255 us -216.131.83.0 - 216.131.83.15 gb -216.131.83.16 - 216.131.83.23 th -216.131.83.24 - 216.131.83.31 nc -216.131.83.32 - 216.131.83.47 ca -216.131.83.48 - 216.131.83.55 us -216.131.83.56 - 216.131.83.63 ch -216.131.83.64 - 216.131.83.143 us -216.131.83.144 - 216.131.83.151 it -216.131.83.152 - 216.131.83.159 us -216.131.83.160 - 216.131.83.191 th -216.131.83.192 - 216.131.84.15 us -216.131.84.16 - 216.131.84.23 sr -216.131.84.24 - 216.131.84.31 us -216.131.84.32 - 216.131.84.39 ca -216.131.84.40 - 216.131.84.55 us -216.131.84.56 - 216.131.84.63 ca -216.131.84.64 - 216.131.84.95 us -216.131.84.96 - 216.131.84.111 nc -216.131.84.112 - 216.131.84.159 us -216.131.84.160 - 216.131.84.175 ca -216.131.84.176 - 216.131.84.183 gb -216.131.84.184 - 216.131.84.239 us -216.131.84.240 - 216.131.84.247 th -216.131.84.248 - 216.131.84.255 ca -216.131.85.0 - 216.131.85.7 us -216.131.85.8 - 216.131.85.15 nc -216.131.85.16 - 216.131.85.23 us -216.131.85.24 - 216.131.85.31 gr -216.131.85.32 - 216.131.85.39 gb -216.131.85.40 - 216.131.85.47 tk -216.131.85.48 - 216.131.85.55 br -216.131.85.56 - 216.131.85.95 us -216.131.85.96 - 216.131.85.103 ca -216.131.85.104 - 216.131.85.119 us -216.131.85.120 - 216.131.85.127 ca -216.131.85.128 - 216.131.85.135 us -216.131.85.136 - 216.131.85.143 kw -216.131.85.144 - 216.131.85.215 us -216.131.85.216 - 216.131.85.223 ca -216.131.85.224 - 216.131.85.231 us -216.131.85.232 - 216.131.85.239 bz -216.131.85.240 - 216.131.85.247 us -216.131.85.248 - 216.131.85.255 gr -216.131.86.0 - 216.131.86.7 gb -216.131.86.8 - 216.131.86.15 kw -216.131.86.16 - 216.131.86.199 us -216.131.86.200 - 216.131.86.207 de -216.131.86.208 - 216.131.86.215 us -216.131.86.216 - 216.131.86.223 bz -216.131.86.224 - 216.131.86.255 us -216.131.87.0 - 216.131.87.7 tk -216.131.87.8 - 216.131.87.15 gb -216.131.87.16 - 216.131.87.47 us -216.131.87.48 - 216.131.87.55 gb -216.131.87.56 - 216.131.87.119 us -216.131.87.120 - 216.131.87.127 gb -216.131.87.128 - 216.131.87.143 fr -216.131.87.144 - 216.131.87.175 us -216.131.87.176 - 216.131.87.183 gb -216.131.87.184 - 216.131.87.191 us -216.131.87.192 - 216.131.87.199 gb -216.131.87.200 - 216.131.87.207 fr -216.131.87.208 - 216.131.88.7 us -216.131.88.8 - 216.131.88.15 th -216.131.88.16 - 216.131.88.79 us -216.131.88.80 - 216.131.88.95 gb -216.131.88.96 - 216.131.88.111 us -216.131.88.112 - 216.131.88.119 hu -216.131.88.120 - 216.131.88.127 gb -216.131.88.128 - 216.131.88.143 us -216.131.88.144 - 216.131.88.151 de -216.131.88.152 - 216.131.88.167 us -216.131.88.168 - 216.131.88.175 il -216.131.88.176 - 216.131.88.183 th -216.131.88.184 - 216.131.89.31 us -216.131.89.32 - 216.131.89.47 hk -216.131.89.48 - 216.131.89.55 us -216.131.89.56 - 216.131.89.63 ca -216.131.89.64 - 216.131.89.95 us -216.131.89.96 - 216.131.89.103 nl -216.131.89.104 - 216.131.89.127 us -216.131.89.128 - 216.131.89.159 de -216.131.89.160 - 216.131.89.223 us -216.131.89.224 - 216.131.89.239 th -216.131.89.240 - 216.131.90.111 us -216.131.90.112 - 216.131.90.119 th -216.131.90.120 - 216.131.90.127 cz -216.131.90.128 - 216.131.90.223 us -216.131.90.224 - 216.131.90.231 gb -216.131.90.232 - 216.131.91.255 us -216.131.92.0 - 216.131.92.31 gb -216.131.92.32 - 216.131.93.103 us -216.131.93.104 - 216.131.93.111 ca -216.131.93.112 - 216.131.93.127 us -216.131.93.128 - 216.131.93.135 bz -216.131.93.136 - 216.131.93.143 il -216.131.93.144 - 216.131.93.175 us -216.131.93.176 - 216.131.93.183 gb -216.131.93.184 - 216.131.93.215 us -216.131.93.216 - 216.131.93.223 gb -216.131.93.224 - 216.131.98.127 us -216.131.98.128 - 216.131.98.159 sr -216.131.98.160 - 216.131.98.167 us -216.131.98.168 - 216.131.98.175 au -216.131.98.176 - 216.131.98.183 us -216.131.98.184 - 216.131.98.191 gb -216.131.98.192 - 216.131.101.159 us -216.131.101.160 - 216.131.101.167 tk -216.131.101.168 - 216.131.101.175 us -216.131.101.176 - 216.131.101.183 nl -216.131.101.184 - 216.131.101.191 us -216.131.101.192 - 216.131.101.215 gb -216.131.101.216 - 216.131.104.39 us -216.131.104.40 - 216.131.104.47 ca -216.131.104.48 - 216.131.104.55 th -216.131.104.56 - 216.131.104.63 us -216.131.104.64 - 216.131.104.127 de -216.131.104.128 - 216.131.104.207 us -216.131.104.208 - 216.131.104.223 th -216.131.104.224 - 216.131.104.255 us -216.131.105.0 - 216.131.105.31 gb -216.131.105.32 - 216.131.105.63 in -216.131.105.64 - 216.131.105.71 th -216.131.105.72 - 216.131.105.79 us -216.131.105.80 - 216.131.105.87 mo -216.131.105.88 - 216.131.105.95 us -216.131.105.96 - 216.131.105.127 ru -216.131.105.128 - 216.131.105.135 gb -216.131.105.136 - 216.131.105.143 gr -216.131.105.144 - 216.131.105.183 us -216.131.105.184 - 216.131.105.191 ca -216.131.105.192 - 216.131.105.207 us -216.131.105.208 - 216.131.105.215 ca -216.131.105.216 - 216.131.105.231 us -216.131.105.232 - 216.131.105.239 hk -216.131.105.240 - 216.131.106.143 us -216.131.106.144 - 216.131.106.159 in -216.131.106.160 - 216.131.106.231 us -216.131.106.232 - 216.131.106.239 ca -216.131.106.240 - 216.131.106.255 us -216.131.107.0 - 216.131.107.63 dm -216.131.107.64 - 216.131.107.79 fr -216.131.107.80 - 216.131.107.95 br -216.131.107.96 - 216.131.107.127 in -216.131.107.128 - 216.131.107.207 us -216.131.107.208 - 216.131.107.223 th -216.131.107.224 - 216.131.107.239 za -216.131.107.240 - 216.131.107.255 us -216.131.108.0 - 216.131.108.7 gb -216.131.108.8 - 216.131.108.15 us -216.131.108.16 - 216.131.108.23 gb -216.131.108.24 - 216.131.108.63 us -216.131.108.64 - 216.131.108.71 th -216.131.108.72 - 216.131.108.119 us -216.131.108.120 - 216.131.108.127 ca -216.131.108.128 - 216.131.109.31 us -216.131.109.32 - 216.131.109.47 tw -216.131.109.48 - 216.131.109.191 us -216.131.109.192 - 216.131.109.223 sr -216.131.109.224 - 216.131.109.231 nl -216.131.109.232 - 216.131.109.239 io -216.131.109.240 - 216.131.109.247 us -216.131.109.248 - 216.131.109.255 gb -216.131.110.0 - 216.131.110.55 us -216.131.110.56 - 216.131.110.63 gb -216.131.110.64 - 216.131.110.199 us -216.131.110.200 - 216.131.110.207 gb -216.131.110.208 - 216.131.110.223 us -216.131.110.224 - 216.131.110.231 ch -216.131.110.232 - 216.131.110.239 us -216.131.110.240 - 216.131.110.255 ca -216.131.111.0 - 216.131.111.31 us -216.131.111.32 - 216.131.111.39 ch -216.131.111.40 - 216.131.111.79 us -216.131.111.80 - 216.131.111.87 gb -216.131.111.88 - 216.131.111.167 us -216.131.111.168 - 216.131.111.175 th -216.131.111.176 - 216.131.111.255 us -216.131.112.0 - 216.131.112.7 fr -216.131.112.8 - 216.131.112.231 us -216.131.112.232 - 216.131.112.247 gb -216.131.112.248 - 216.131.113.39 us -216.131.113.40 - 216.131.113.47 ca -216.131.113.48 - 216.131.113.79 us -216.131.113.80 - 216.131.113.95 th -216.131.113.96 - 216.131.113.103 us -216.131.113.104 - 216.131.113.111 th -216.131.113.112 - 216.131.113.183 us -216.131.113.184 - 216.131.113.191 th -216.131.113.192 - 216.131.113.215 us -216.131.113.216 - 216.131.113.223 gi -216.131.113.224 - 216.131.113.255 gb -216.131.114.0 - 216.131.114.31 us -216.131.114.32 - 216.131.114.63 io -216.131.114.64 - 216.131.114.95 us -216.131.114.96 - 216.131.114.103 gr -216.131.114.104 - 216.131.114.127 us -216.131.114.128 - 216.131.114.135 bz -216.131.114.136 - 216.131.114.143 ca -216.131.114.144 - 216.131.114.159 us -216.131.114.160 - 216.131.114.167 de -216.131.114.168 - 216.131.114.183 us -216.131.114.184 - 216.131.114.191 tw -216.131.114.192 - 216.131.114.199 ca -216.131.114.200 - 216.131.114.207 de -216.131.114.208 - 216.131.114.215 us -216.131.114.216 - 216.131.114.223 sk -216.131.114.224 - 216.131.115.127 us -216.131.115.128 - 216.131.115.143 mx -216.131.115.144 - 216.131.115.159 jp -216.131.115.160 - 216.131.115.167 tk -216.131.115.168 - 216.131.115.255 us -216.131.116.0 - 216.131.116.7 th -216.131.116.8 - 216.131.116.15 gb -216.131.116.16 - 216.131.116.39 us -216.131.116.40 - 216.131.116.47 sk -216.131.116.48 - 216.131.116.71 us -216.131.116.72 - 216.131.116.79 gb -216.131.116.80 - 216.131.116.95 nl -216.131.116.96 - 216.131.116.103 au -216.131.116.104 - 216.131.116.127 us -216.131.116.128 - 216.131.116.135 nl -216.131.116.136 - 216.131.116.143 us -216.131.116.144 - 216.131.116.159 ca -216.131.116.160 - 216.131.117.23 us -216.131.117.24 - 216.131.117.31 ca -216.131.117.32 - 216.131.117.63 us -216.131.117.64 - 216.131.117.71 ca -216.131.117.72 - 216.131.117.79 us -216.131.117.80 - 216.131.117.87 ca -216.131.117.88 - 216.131.117.191 us -216.131.117.192 - 216.131.117.199 gb -216.131.117.200 - 216.131.117.207 ca -216.131.117.208 - 216.131.117.215 sk -216.131.117.216 - 216.131.117.247 us -216.131.117.248 - 216.131.117.255 ca -216.131.118.0 - 216.131.119.63 us -216.131.119.64 - 216.131.119.79 io -216.131.119.80 - 216.131.119.95 us -216.131.119.96 - 216.131.119.103 ca -216.131.119.104 - 216.131.119.111 us -216.131.119.112 - 216.131.119.119 th -216.131.119.120 - 216.131.119.199 us -216.131.119.200 - 216.131.119.207 nc -216.131.119.208 - 216.131.119.215 us -216.131.119.216 - 216.131.119.231 th -216.131.119.232 - 216.131.119.255 us -216.131.120.0 - 216.131.120.127 ca -216.131.120.128 - 216.131.121.63 us -216.131.121.64 - 216.131.121.79 cn -216.131.121.80 - 216.131.121.127 us -216.131.121.128 - 216.131.121.159 fr -216.131.121.160 - 216.131.121.255 us -216.131.122.0 - 216.131.122.7 gb -216.131.122.8 - 216.131.122.95 us +216.130.224.0 - 216.131.122.95 us 216.131.122.96 - 216.131.122.103 za -216.131.122.104 - 216.131.122.127 us -216.131.122.128 - 216.131.122.135 gb -216.131.122.136 - 216.131.122.143 us -216.131.122.144 - 216.131.122.151 gb -216.131.122.152 - 216.131.122.215 us -216.131.122.216 - 216.131.122.223 ca -216.131.122.224 - 216.131.124.215 us -216.131.124.216 - 216.131.124.223 ru -216.131.124.224 - 216.131.125.95 us -216.131.125.96 - 216.131.125.127 gb -216.131.125.128 - 216.131.125.159 gi -216.131.125.160 - 216.131.125.183 us -216.131.125.184 - 216.131.125.191 nz -216.131.125.192 - 216.131.126.7 us -216.131.126.8 - 216.131.126.15 nl -216.131.126.16 - 216.131.126.31 gb -216.131.126.32 - 216.131.126.63 us -216.131.126.64 - 216.131.126.95 ie -216.131.126.96 - 216.133.225.15 us -216.133.225.16 - 216.133.225.31 gb -216.133.225.32 - 216.134.229.199 us -216.134.229.200 - 216.134.229.207 sg -216.134.229.208 - 216.136.136.127 us -216.136.136.128 - 216.136.136.143 cn -216.136.136.144 - 216.136.162.207 us -216.136.162.208 - 216.136.162.223 cn -216.136.162.224 - 216.136.178.15 us -216.136.178.16 - 216.136.178.31 in -216.136.178.32 - 216.136.182.255 us -216.136.183.0 - 216.136.183.31 tw -216.136.183.32 - 216.136.183.183 us -216.136.183.184 - 216.136.183.191 cn -216.136.183.192 - 216.136.217.175 us -216.136.217.176 - 216.136.217.191 cn -216.136.217.192 - 216.136.255.255 us -216.137.0.0 - 216.137.15.255 bs +216.131.122.104 - 216.136.255.255 us +216.137.0.0 - 216.137.8.93 bs +216.137.8.94 - 216.137.8.94 us +216.137.8.95 - 216.137.15.255 bs 216.137.16.0 - 216.137.95.255 us 216.137.96.0 - 216.137.127.255 ca 216.137.128.0 - 216.137.159.255 us -216.137.160.0 - 216.137.161.31 ca -216.137.161.32 - 216.137.161.47 us -216.137.161.48 - 216.137.175.255 ca +216.137.160.0 - 216.137.175.255 ca 216.137.176.0 - 216.138.191.255 us -216.138.192.0 - 216.138.192.255 ca -216.138.193.0 - 216.138.193.31 us -216.138.193.32 - 216.138.197.31 ca -216.138.197.32 - 216.138.197.63 us -216.138.197.64 - 216.138.255.255 ca +216.138.192.0 - 216.138.255.255 ca 216.139.0.0 - 216.139.159.255 us 216.139.160.0 - 216.139.161.255 py 216.139.162.0 - 216.139.163.255 ni -216.139.164.0 - 216.139.164.15 us -216.139.164.16 - 216.139.164.23 a2 -216.139.164.24 - 216.139.164.31 us -216.139.164.32 - 216.139.164.39 a2 -216.139.164.40 - 216.139.164.47 us -216.139.164.48 - 216.139.164.55 a2 -216.139.164.56 - 216.139.164.63 us -216.139.164.64 - 216.139.164.71 a2 -216.139.164.72 - 216.139.164.79 ng -216.139.164.80 - 216.139.164.87 a2 -216.139.164.88 - 216.139.164.143 us -216.139.164.144 - 216.139.164.159 a2 -216.139.164.160 - 216.139.164.191 us -216.139.164.192 - 216.139.164.215 a2 -216.139.164.216 - 216.139.165.255 us +216.139.164.0 - 216.139.165.255 us 216.139.166.0 - 216.139.166.255 sn 216.139.167.0 - 216.139.167.255 a2 -216.139.168.0 - 216.139.169.191 us -216.139.169.192 - 216.139.169.199 a2 -216.139.169.200 - 216.139.169.223 us -216.139.169.224 - 216.139.169.231 ng -216.139.169.232 - 216.139.170.7 us -216.139.170.8 - 216.139.170.15 ng -216.139.170.16 - 216.139.171.23 us -216.139.171.24 - 216.139.171.31 nl -216.139.171.32 - 216.139.171.47 us -216.139.171.48 - 216.139.171.55 pg -216.139.171.56 - 216.139.171.151 us -216.139.171.152 - 216.139.171.159 nl -216.139.171.160 - 216.139.171.231 us -216.139.171.232 - 216.139.171.239 nl -216.139.171.240 - 216.139.172.31 us -216.139.172.32 - 216.139.172.39 ng -216.139.172.40 - 216.139.172.47 us -216.139.172.48 - 216.139.172.55 a2 -216.139.172.56 - 216.139.172.79 us -216.139.172.80 - 216.139.172.87 a2 -216.139.172.88 - 216.139.172.95 us -216.139.172.96 - 216.139.172.127 gq -216.139.172.128 - 216.139.172.223 us -216.139.172.224 - 216.139.172.239 ng -216.139.172.240 - 216.139.172.247 us -216.139.172.248 - 216.139.172.255 a2 -216.139.173.0 - 216.139.173.95 us -216.139.173.96 - 216.139.173.119 ng -216.139.173.120 - 216.139.173.143 us -216.139.173.144 - 216.139.173.159 a2 -216.139.173.160 - 216.139.176.31 us -216.139.176.32 - 216.139.176.39 a2 -216.139.176.40 - 216.139.176.47 us -216.139.176.48 - 216.139.176.55 a2 -216.139.176.56 - 216.139.176.71 us -216.139.176.72 - 216.139.176.79 gh -216.139.176.80 - 216.139.176.87 ng -216.139.176.88 - 216.139.176.103 a2 -216.139.176.104 - 216.139.176.111 ng -216.139.176.112 - 216.139.176.119 us -216.139.176.120 - 216.139.176.143 a2 -216.139.176.144 - 216.139.176.151 ng -216.139.176.152 - 216.139.176.159 a2 -216.139.176.160 - 216.139.176.175 ng -216.139.176.176 - 216.139.176.183 a2 -216.139.176.184 - 216.139.179.63 us -216.139.179.64 - 216.139.179.95 a2 -216.139.179.96 - 216.139.181.23 us -216.139.181.24 - 216.139.181.31 ng -216.139.181.32 - 216.139.181.127 us -216.139.181.128 - 216.139.181.255 ng -216.139.182.0 - 216.139.183.7 us -216.139.183.8 - 216.139.183.15 nl -216.139.183.16 - 216.139.183.63 us -216.139.183.64 - 216.139.183.79 nr -216.139.183.80 - 216.139.183.87 cn -216.139.183.88 - 216.139.183.127 us -216.139.183.128 - 216.139.183.143 nr -216.139.183.144 - 216.139.183.191 us -216.139.183.192 - 216.139.183.199 id -216.139.183.200 - 216.139.184.23 us -216.139.184.24 - 216.139.184.31 a2 -216.139.184.32 - 216.139.184.47 us -216.139.184.48 - 216.139.184.55 id -216.139.184.56 - 216.139.184.175 us -216.139.184.176 - 216.139.184.183 id -216.139.184.184 - 216.139.184.191 us -216.139.184.192 - 216.139.184.223 id -216.139.184.224 - 216.139.185.7 us -216.139.185.8 - 216.139.185.15 ng -216.139.185.16 - 216.139.185.31 us -216.139.185.32 - 216.139.185.79 a2 -216.139.185.80 - 216.139.186.255 us +216.139.168.0 - 216.139.170.255 us +216.139.171.0 - 216.139.171.255 pg +216.139.172.0 - 216.139.186.255 us 216.139.187.0 - 216.139.187.255 ht -216.139.188.0 - 216.139.188.191 us -216.139.188.192 - 216.139.188.223 tt -216.139.188.224 - 216.139.189.63 us -216.139.189.64 - 216.139.189.127 a2 -216.139.189.128 - 216.139.200.143 us -216.139.200.144 - 216.139.200.159 ca -216.139.200.160 - 216.141.182.255 us -216.141.183.0 - 216.141.183.127 mx -216.141.183.128 - 216.144.79.255 us -216.144.80.0 - 216.144.80.143 ky -216.144.80.144 - 216.144.80.159 us -216.144.80.160 - 216.144.95.255 ky +216.139.188.0 - 216.139.188.255 tt +216.139.189.0 - 216.144.79.255 us +216.144.80.0 - 216.144.95.255 ky 216.144.96.0 - 216.144.111.255 us 216.144.112.0 - 216.144.127.255 ca 216.144.128.0 - 216.145.95.255 us 216.145.96.0 - 216.145.111.255 ca 216.145.112.0 - 216.146.127.255 us 216.146.128.0 - 216.146.143.255 ca -216.146.144.0 - 216.147.6.0 us -216.147.6.1 - 216.147.6.254 es -216.147.6.255 - 216.147.127.255 us +216.146.144.0 - 216.147.127.255 us 216.147.128.0 - 216.147.129.255 ga 216.147.130.0 - 216.147.130.255 a2 216.147.131.0 - 216.147.131.255 us @@ -152872,444 +113982,228 @@ 216.147.136.0 - 216.147.139.255 ga 216.147.140.0 - 216.147.140.255 a2 216.147.141.0 - 216.147.141.255 ga -216.147.142.0 - 216.147.142.63 a2 -216.147.142.64 - 216.147.142.127 us -216.147.142.128 - 216.147.142.255 ga -216.147.143.0 - 216.147.144.63 a2 -216.147.144.64 - 216.147.144.79 us -216.147.144.80 - 216.147.144.255 a2 +216.147.142.0 - 216.147.142.255 us +216.147.143.0 - 216.147.144.255 a2 216.147.145.0 - 216.147.145.255 ga -216.147.146.0 - 216.147.147.255 us -216.147.148.0 - 216.147.148.95 a2 -216.147.148.96 - 216.147.148.255 us -216.147.149.0 - 216.147.149.103 a2 -216.147.149.104 - 216.147.149.255 us +216.147.146.0 - 216.147.149.255 us 216.147.150.0 - 216.147.151.255 ga -216.147.152.0 - 216.147.156.255 us -216.147.157.0 - 216.147.158.15 a2 -216.147.158.16 - 216.147.158.31 ga -216.147.158.32 - 216.147.158.223 us -216.147.158.224 - 216.147.158.231 a2 -216.147.158.232 - 216.147.158.247 us -216.147.158.248 - 216.147.158.255 a2 -216.147.159.0 - 216.147.159.127 gw -216.147.159.128 - 216.147.159.159 us -216.147.159.160 - 216.147.159.191 a2 -216.147.159.192 - 216.151.7.15 us -216.151.7.16 - 216.151.7.31 cn -216.151.7.32 - 216.151.7.79 us -216.151.7.80 - 216.151.7.95 cn -216.151.7.96 - 216.151.159.255 us -216.151.160.0 - 216.151.161.35 ca -216.151.161.36 - 216.151.161.39 us -216.151.161.40 - 216.151.162.15 ca -216.151.162.16 - 216.151.162.31 us -216.151.162.32 - 216.151.162.55 ca -216.151.162.56 - 216.151.162.63 in -216.151.162.64 - 216.151.162.79 us -216.151.162.80 - 216.151.162.87 ca -216.151.162.88 - 216.151.162.95 in -216.151.162.96 - 216.151.162.111 za -216.151.162.112 - 216.151.162.143 us -216.151.162.144 - 216.151.162.151 ca -216.151.162.152 - 216.151.162.159 us -216.151.162.160 - 216.151.162.167 in -216.151.162.168 - 216.151.162.183 us -216.151.162.184 - 216.151.162.191 in -216.151.162.192 - 216.151.162.199 ng -216.151.162.200 - 216.151.162.215 ca -216.151.162.216 - 216.151.162.247 us -216.151.162.248 - 216.151.162.255 ca -216.151.163.0 - 216.151.163.7 za -216.151.163.8 - 216.151.163.31 ca -216.151.163.32 - 216.151.163.63 in -216.151.163.64 - 216.151.163.71 ng -216.151.163.72 - 216.151.163.79 us -216.151.163.80 - 216.151.163.87 ca -216.151.163.88 - 216.151.163.143 us -216.151.163.144 - 216.151.163.151 ca -216.151.163.152 - 216.151.163.159 in -216.151.163.160 - 216.151.163.175 ca -216.151.163.176 - 216.151.163.183 za -216.151.163.184 - 216.151.163.191 in -216.151.163.192 - 216.151.163.199 us -216.151.163.200 - 216.151.163.207 za -216.151.163.208 - 216.151.163.215 ca -216.151.163.216 - 216.151.163.223 us -216.151.163.224 - 216.151.163.239 za -216.151.163.240 - 216.151.163.247 in -216.151.163.248 - 216.151.172.79 ca -216.151.172.80 - 216.151.172.87 us -216.151.172.88 - 216.151.172.127 ca -216.151.172.128 - 216.151.172.143 us -216.151.172.144 - 216.151.172.239 ca -216.151.172.240 - 216.151.172.255 us -216.151.173.0 - 216.151.173.255 ca -216.151.174.0 - 216.151.174.63 in -216.151.174.64 - 216.151.174.255 ca -216.151.175.0 - 216.151.175.31 in -216.151.175.32 - 216.151.175.255 ca -216.151.176.0 - 216.151.182.95 us -216.151.182.96 - 216.151.182.127 bb -216.151.182.128 - 216.151.185.223 us -216.151.185.224 - 216.151.185.239 gb -216.151.185.240 - 216.151.186.95 us -216.151.186.96 - 216.151.186.119 ca -216.151.186.120 - 216.151.207.255 us -216.151.208.0 - 216.151.208.255 gb -216.151.209.0 - 216.151.212.106 us -216.151.212.107 - 216.151.212.113 in -216.151.212.114 - 216.151.221.138 us -216.151.221.139 - 216.151.221.170 in -216.151.221.171 - 216.151.221.215 us -216.151.221.216 - 216.151.221.227 au -216.151.221.228 - 216.152.133.255 us -216.152.134.0 - 216.152.134.255 gb -216.152.135.0 - 216.152.159.255 us -216.152.160.0 - 216.152.175.255 an +216.147.152.0 - 216.147.154.255 us +216.147.155.0 - 216.147.155.255 a2 +216.147.156.0 - 216.147.156.255 us +216.147.157.0 - 216.147.157.255 a2 +216.147.158.0 - 216.150.188.255 us +216.150.189.0 - 216.150.189.255 in +216.150.190.0 - 216.150.190.255 us +216.150.191.0 - 216.150.191.255 ph +216.150.192.0 - 216.151.160.255 us +216.151.161.0 - 216.151.161.255 ca +216.151.162.0 - 216.151.165.255 us +216.151.166.0 - 216.151.166.255 ca +216.151.167.0 - 216.151.171.255 us +216.151.172.0 - 216.151.173.255 ca +216.151.174.0 - 216.151.179.255 us +216.151.180.0 - 216.151.180.255 a1 +216.151.181.0 - 216.151.191.255 us +216.151.192.0 - 216.151.207.255 hk +216.151.208.0 - 216.152.159.255 us +216.152.160.0 - 216.152.175.255 cw 216.152.176.0 - 216.152.191.255 us 216.152.192.0 - 216.152.207.255 ca 216.152.208.0 - 216.153.38.255 us 216.153.39.0 - 216.153.39.255 it -216.153.40.0 - 216.153.64.255 us -216.153.65.0 - 216.153.65.63 tn -216.153.65.64 - 216.153.255.255 us +216.153.40.0 - 216.153.255.255 us 216.154.0.0 - 216.154.12.255 ca 216.154.13.0 - 216.154.14.255 us 216.154.15.0 - 216.154.191.255 ca -216.154.192.0 - 216.155.63.255 us +216.154.192.0 - 216.155.1.255 us +216.155.2.0 - 216.155.3.255 ca +216.155.4.0 - 216.155.38.255 us +216.155.39.0 - 216.155.39.255 ca +216.155.40.0 - 216.155.62.255 us +216.155.63.0 - 216.155.63.255 ca 216.155.64.0 - 216.155.95.255 cl -216.155.96.0 - 216.155.111.159 us -216.155.111.160 - 216.155.111.191 sv -216.155.111.192 - 216.155.223.255 us +216.155.96.0 - 216.155.223.255 us 216.155.224.0 - 216.155.239.255 se -216.155.240.0 - 216.156.92.7 us -216.156.92.8 - 216.156.92.15 ca -216.156.92.16 - 216.156.92.31 jp -216.156.92.32 - 216.156.92.127 us -216.156.92.128 - 216.156.92.143 ca -216.156.92.144 - 216.156.129.127 us -216.156.129.128 - 216.156.129.191 ca -216.156.129.192 - 216.156.132.39 us -216.156.132.40 - 216.156.132.47 ca -216.156.132.48 - 216.156.140.15 us -216.156.140.16 - 216.156.140.31 ca -216.156.140.32 - 216.157.82.255 us -216.157.83.0 - 216.157.83.255 gb -216.157.84.0 - 216.157.142.95 us -216.157.142.96 - 216.157.142.103 at -216.157.142.104 - 216.157.143.175 us -216.157.143.176 - 216.157.143.191 gb -216.157.143.192 - 216.158.134.1 us -216.158.134.2 - 216.158.134.33 gb -216.158.134.34 - 216.158.141.229 us -216.158.141.230 - 216.158.141.239 gb -216.158.141.240 - 216.158.142.105 us -216.158.142.106 - 216.158.142.119 ca -216.158.142.120 - 216.158.143.64 us -216.158.143.65 - 216.158.143.128 cn -216.158.143.129 - 216.158.147.0 us -216.158.147.1 - 216.158.147.255 cn -216.158.148.0 - 216.158.148.0 us -216.158.148.1 - 216.158.148.96 ca -216.158.148.97 - 216.160.10.47 us -216.160.10.48 - 216.160.10.55 ca -216.160.10.56 - 216.162.63.255 us +216.155.240.0 - 216.158.194.255 us +216.158.195.0 - 216.158.195.255 ca +216.158.196.0 - 216.158.205.255 us +216.158.206.0 - 216.158.206.255 ca +216.158.207.0 - 216.158.216.255 us +216.158.217.0 - 216.158.217.255 ca +216.158.218.0 - 216.162.63.255 us 216.162.64.0 - 216.162.79.255 ca 216.162.80.0 - 216.162.223.255 us 216.162.224.0 - 216.162.239.255 ca 216.162.240.0 - 216.165.191.255 us 216.165.192.0 - 216.165.223.255 ca -216.165.224.0 - 216.167.223.255 us +216.165.224.0 - 216.166.7.255 us +216.166.8.0 - 216.166.8.255 ca +216.166.9.0 - 216.167.223.255 us 216.167.224.0 - 216.167.255.255 ca 216.168.0.0 - 216.168.95.255 us -216.168.96.0 - 216.168.105.79 ca -216.168.105.80 - 216.168.105.95 us -216.168.105.96 - 216.168.127.255 ca +216.168.96.0 - 216.168.127.255 ca 216.168.128.0 - 216.168.143.255 us 216.168.144.0 - 216.168.159.255 ca -216.168.160.0 - 216.171.88.63 us -216.171.88.64 - 216.171.88.127 mx -216.171.88.128 - 216.171.95.255 us -216.171.96.0 - 216.171.97.151 ca -216.171.97.152 - 216.171.97.159 us -216.171.97.160 - 216.171.111.255 ca +216.168.160.0 - 216.171.95.255 us +216.171.96.0 - 216.171.111.255 ca 216.171.112.0 - 216.171.223.255 us 216.171.224.0 - 216.171.239.255 ca 216.171.240.0 - 216.172.31.255 us 216.172.32.0 - 216.172.47.255 ca -216.172.48.0 - 216.174.127.255 us +216.172.48.0 - 216.172.78.255 us +216.172.79.0 - 216.172.79.255 ca +216.172.80.0 - 216.174.127.255 us 216.174.128.0 - 216.174.159.255 ca -216.174.160.0 - 216.176.47.255 us -216.176.48.0 - 216.176.63.255 ca -216.176.64.0 - 216.176.207.255 us +216.174.160.0 - 216.176.207.255 us 216.176.208.0 - 216.176.223.255 ca 216.176.224.0 - 216.177.191.255 us 216.177.192.0 - 216.177.192.255 pr -216.177.193.0 - 216.177.194.255 us -216.177.195.0 - 216.177.195.127 pr -216.177.195.128 - 216.177.196.255 us +216.177.193.0 - 216.177.196.255 us 216.177.197.0 - 216.177.197.255 pr -216.177.198.0 - 216.177.199.119 us -216.177.199.120 - 216.177.199.127 mx -216.177.199.128 - 216.177.199.231 us -216.177.199.232 - 216.177.199.239 mx -216.177.199.240 - 216.177.199.247 co -216.177.199.248 - 216.177.200.255 us +216.177.198.0 - 216.177.200.255 us 216.177.201.0 - 216.177.203.255 pr -216.177.204.0 - 216.177.204.7 us -216.177.204.8 - 216.177.204.15 pr -216.177.204.16 - 216.177.204.255 us +216.177.204.0 - 216.177.204.255 us 216.177.205.0 - 216.177.205.255 pr -216.177.206.0 - 216.177.207.63 us -216.177.207.64 - 216.177.207.95 pr -216.177.207.96 - 216.177.207.119 us -216.177.207.120 - 216.177.207.127 pr -216.177.207.128 - 216.177.207.207 us -216.177.207.208 - 216.177.207.215 es -216.177.207.216 - 216.177.209.255 us -216.177.210.0 - 216.177.210.15 es -216.177.210.16 - 216.177.212.31 us -216.177.212.32 - 216.177.212.63 ve -216.177.212.64 - 216.177.212.199 us -216.177.212.200 - 216.177.212.207 no -216.177.212.208 - 216.177.214.223 us +216.177.206.0 - 216.177.214.223 us 216.177.214.224 - 216.177.214.239 in 216.177.214.240 - 216.179.131.255 us -216.179.132.0 - 216.179.132.255 jp -216.179.133.0 - 216.179.133.31 us -216.179.133.32 - 216.179.133.33 jp -216.179.133.34 - 216.179.133.62 us -216.179.133.63 - 216.179.133.255 jp -216.179.134.0 - 216.179.134.255 us -216.179.135.0 - 216.179.135.95 jp -216.179.135.96 - 216.179.135.159 us -216.179.135.160 - 216.179.136.255 jp -216.179.137.0 - 216.179.139.255 us -216.179.140.0 - 216.179.141.0 jp -216.179.141.1 - 216.179.141.32 us -216.179.141.33 - 216.179.141.64 jp -216.179.141.65 - 216.179.141.80 us -216.179.141.81 - 216.179.141.255 jp -216.179.142.0 - 216.179.143.127 us -216.179.143.128 - 216.179.143.159 jp -216.179.143.160 - 216.179.152.255 us +216.179.132.0 - 216.179.135.255 jp +216.179.136.0 - 216.179.138.255 th +216.179.139.0 - 216.179.139.255 jp +216.179.140.0 - 216.179.141.255 hk +216.179.142.0 - 216.179.143.255 tl +216.179.144.0 - 216.179.145.255 us +216.179.146.0 - 216.179.147.255 gb +216.179.148.0 - 216.179.148.255 us +216.179.149.0 - 216.179.149.255 ca +216.179.150.0 - 216.179.150.255 tw +216.179.151.0 - 216.179.151.255 ml +216.179.152.0 - 216.179.152.255 us 216.179.153.0 - 216.179.153.255 jp 216.179.154.0 - 216.179.159.255 us -216.179.160.0 - 216.179.160.255 hk -216.179.161.0 - 216.179.161.255 us -216.179.162.0 - 216.179.162.255 hk -216.179.163.0 - 216.179.163.255 us -216.179.164.0 - 216.179.164.255 hk -216.179.165.0 - 216.179.167.255 us -216.179.168.0 - 216.179.168.31 hk -216.179.168.32 - 216.179.168.207 us -216.179.168.208 - 216.179.168.223 hk -216.179.168.224 - 216.179.169.207 us -216.179.169.208 - 216.179.169.255 hk -216.179.170.0 - 216.179.170.31 us -216.179.170.32 - 216.179.170.63 hk -216.179.170.64 - 216.179.171.255 us -216.179.172.0 - 216.179.172.63 jp -216.179.172.64 - 216.179.172.95 us -216.179.172.96 - 216.179.172.111 jp -216.179.172.112 - 216.179.172.143 us -216.179.172.144 - 216.179.172.159 jp -216.179.172.160 - 216.179.172.255 us -216.179.173.0 - 216.179.173.95 jp -216.179.173.96 - 216.179.173.127 us -216.179.173.128 - 216.179.173.255 jp -216.179.174.0 - 216.179.174.159 us -216.179.174.160 - 216.179.174.191 jp -216.179.174.192 - 216.179.175.255 us -216.179.176.0 - 216.179.176.255 hk -216.179.177.0 - 216.179.177.255 us -216.179.178.0 - 216.179.180.255 hk -216.179.181.0 - 216.179.181.255 us -216.179.182.0 - 216.179.182.31 hk -216.179.182.32 - 216.179.182.127 us -216.179.182.128 - 216.179.182.255 hk -216.179.183.0 - 216.179.183.255 ca -216.179.184.0 - 216.179.185.7 jp -216.179.185.8 - 216.179.185.63 us -216.179.185.64 - 216.179.185.255 jp -216.179.186.0 - 216.179.193.255 us -216.179.194.0 - 216.179.196.255 id -216.179.197.0 - 216.179.197.255 cn +216.179.160.0 - 216.179.167.255 hk +216.179.168.0 - 216.179.175.255 us +216.179.176.0 - 216.179.182.255 hk +216.179.183.0 - 216.179.183.255 us +216.179.184.0 - 216.179.187.255 jp +216.179.188.0 - 216.179.193.255 us +216.179.194.0 - 216.179.197.255 id 216.179.198.0 - 216.179.199.255 us 216.179.200.0 - 216.179.207.255 hk 216.179.208.0 - 216.179.237.255 us 216.179.238.0 - 216.179.239.255 tl 216.179.240.0 - 216.179.253.255 us 216.179.254.0 - 216.179.255.255 hk -216.180.0.0 - 216.182.162.111 us -216.182.162.112 - 216.182.162.127 ca -216.182.162.128 - 216.182.196.127 us -216.182.196.128 - 216.182.196.159 ca -216.182.196.160 - 216.182.255.255 us +216.180.0.0 - 216.181.2.255 us +216.181.3.0 - 216.181.3.255 ca +216.181.4.0 - 216.181.4.255 us +216.181.5.0 - 216.181.18.255 ca +216.181.19.0 - 216.181.20.255 us +216.181.21.0 - 216.181.43.255 ca +216.181.44.0 - 216.181.44.255 us +216.181.45.0 - 216.181.45.255 ca +216.181.46.0 - 216.181.46.255 us +216.181.47.0 - 216.181.52.255 ca +216.181.53.0 - 216.181.53.122 us +216.181.53.123 - 216.181.53.123 ca +216.181.53.124 - 216.181.55.255 us +216.181.56.0 - 216.181.78.255 ca +216.181.79.0 - 216.181.79.255 us +216.181.80.0 - 216.181.85.255 ca +216.181.86.0 - 216.181.86.255 us +216.181.87.0 - 216.181.87.255 ca +216.181.88.0 - 216.181.88.255 us +216.181.89.0 - 216.181.97.255 ca +216.181.98.0 - 216.181.108.255 us +216.181.109.0 - 216.181.119.255 ca +216.181.120.0 - 216.181.120.255 us +216.181.121.0 - 216.181.121.255 ca +216.181.122.0 - 216.181.123.255 us +216.181.124.0 - 216.181.124.255 ca +216.181.125.0 - 216.181.125.255 us +216.181.126.0 - 216.181.129.255 ca +216.181.130.0 - 216.181.130.255 us +216.181.131.0 - 216.181.157.255 ca +216.181.158.0 - 216.181.165.255 us +216.181.166.0 - 216.181.229.255 ca +216.181.230.0 - 216.181.231.255 us +216.181.232.0 - 216.181.247.255 ca +216.181.248.0 - 216.181.249.255 us +216.181.250.0 - 216.181.255.255 ca +216.182.0.0 - 216.182.255.255 us 216.183.0.0 - 216.183.31.255 ca 216.183.32.0 - 216.183.79.255 us -216.183.80.0 - 216.183.93.255 ca -216.183.94.0 - 216.183.94.31 us -216.183.94.32 - 216.183.95.255 ca +216.183.80.0 - 216.183.95.255 ca 216.183.96.0 - 216.183.127.255 us 216.183.128.0 - 216.183.159.255 ca 216.183.160.0 - 216.184.95.255 us 216.184.96.0 - 216.184.103.255 sv -216.184.104.0 - 216.184.104.255 us -216.184.105.0 - 216.184.105.255 bo +216.184.104.0 - 216.184.105.255 us 216.184.106.0 - 216.184.111.255 sv -216.184.112.0 - 216.184.115.255 bo +216.184.112.0 - 216.184.113.115 us +216.184.113.116 - 216.184.113.116 es +216.184.113.117 - 216.184.115.255 us 216.184.116.0 - 216.184.119.255 py 216.184.120.0 - 216.184.127.255 sv -216.184.128.0 - 216.185.63.255 us -216.185.64.0 - 216.185.74.15 ca -216.185.74.16 - 216.185.74.31 us -216.185.74.32 - 216.185.95.255 ca -216.185.96.0 - 216.185.96.255 us -216.185.97.0 - 216.185.99.192 sg -216.185.99.193 - 216.185.99.224 us -216.185.99.225 - 216.185.105.255 sg -216.185.106.0 - 216.185.106.255 us -216.185.107.0 - 216.185.110.255 sg -216.185.111.0 - 216.185.113.255 us -216.185.114.0 - 216.185.115.255 sg -216.185.116.0 - 216.185.116.255 us -216.185.117.0 - 216.185.119.255 sg -216.185.120.0 - 216.185.120.255 us -216.185.121.0 - 216.185.122.255 sg -216.185.123.0 - 216.185.126.255 us -216.185.127.0 - 216.185.127.255 sg +216.184.128.0 - 216.185.45.217 us +216.185.45.218 - 216.185.45.218 eu +216.185.45.219 - 216.185.63.255 us +216.185.64.0 - 216.185.95.255 ca +216.185.96.0 - 216.185.112.29 sg +216.185.112.30 - 216.185.112.30 us +216.185.112.31 - 216.185.127.255 sg 216.185.128.0 - 216.185.239.255 us 216.185.240.0 - 216.185.255.255 ca -216.186.0.0 - 216.187.64.223 us -216.187.64.224 - 216.187.64.255 ca -216.187.65.0 - 216.187.65.255 us -216.187.66.0 - 216.187.66.55 ca -216.187.66.56 - 216.187.66.127 us -216.187.66.128 - 216.187.66.151 ca -216.187.66.152 - 216.187.66.159 us -216.187.66.160 - 216.187.66.207 ca -216.187.66.208 - 216.187.66.223 us -216.187.66.224 - 216.187.66.239 bs -216.187.66.240 - 216.187.66.247 ca -216.187.66.248 - 216.187.66.255 us -216.187.67.0 - 216.187.68.159 ca -216.187.68.160 - 216.187.68.183 us -216.187.68.184 - 216.187.68.192 ca -216.187.68.193 - 216.187.68.239 us -216.187.68.240 - 216.187.69.207 ca -216.187.69.208 - 216.187.69.223 us -216.187.69.224 - 216.187.71.239 ca -216.187.71.240 - 216.187.71.255 us +216.186.0.0 - 216.187.65.255 us +216.187.66.0 - 216.187.66.15 ca +216.187.66.16 - 216.187.69.255 us +216.187.70.0 - 216.187.70.255 ca +216.187.71.0 - 216.187.71.255 us 216.187.72.0 - 216.187.72.255 ca -216.187.73.0 - 216.187.73.15 us -216.187.73.16 - 216.187.73.63 ca -216.187.73.64 - 216.187.73.71 us -216.187.73.72 - 216.187.73.79 ca -216.187.73.80 - 216.187.73.127 us -216.187.73.128 - 216.187.73.191 ca -216.187.73.192 - 216.187.73.199 mx -216.187.73.200 - 216.187.73.207 us -216.187.73.208 - 216.187.74.23 ca -216.187.74.24 - 216.187.74.63 us -216.187.74.64 - 216.187.74.191 ca -216.187.74.192 - 216.187.74.223 kn -216.187.74.224 - 216.187.75.255 ca -216.187.76.0 - 216.187.76.31 us -216.187.76.32 - 216.187.77.223 ca -216.187.77.224 - 216.187.77.239 us -216.187.77.240 - 216.187.77.247 ca -216.187.77.248 - 216.187.77.255 us -216.187.78.0 - 216.187.82.15 ca -216.187.82.16 - 216.187.82.31 us -216.187.82.32 - 216.187.82.95 ca -216.187.82.96 - 216.187.82.99 us -216.187.82.100 - 216.187.82.110 ca -216.187.82.111 - 216.187.82.191 us -216.187.82.192 - 216.187.83.255 ca -216.187.84.0 - 216.187.84.15 us -216.187.84.16 - 216.187.84.63 ca -216.187.84.64 - 216.187.84.127 us -216.187.84.128 - 216.187.85.127 ca -216.187.85.128 - 216.187.85.191 us -216.187.85.192 - 216.187.86.255 ca -216.187.87.0 - 216.187.87.31 us -216.187.87.32 - 216.187.87.95 ca -216.187.87.96 - 216.187.87.96 us -216.187.87.97 - 216.187.87.255 ca -216.187.88.0 - 216.187.89.255 us -216.187.90.0 - 216.187.90.135 ca -216.187.90.136 - 216.187.90.239 us -216.187.90.240 - 216.187.90.255 ca -216.187.91.0 - 216.187.91.255 us -216.187.92.0 - 216.187.94.63 ca -216.187.94.64 - 216.187.94.79 us -216.187.94.80 - 216.187.94.111 ca -216.187.94.112 - 216.187.94.127 us -216.187.94.128 - 216.187.95.7 ca -216.187.95.8 - 216.187.95.15 us -216.187.95.16 - 216.187.95.127 ca -216.187.95.128 - 216.187.95.143 us -216.187.95.144 - 216.187.95.159 ca -216.187.95.160 - 216.187.95.191 us -216.187.95.192 - 216.187.96.255 ca -216.187.97.0 - 216.187.97.31 us -216.187.97.32 - 216.187.97.95 ca -216.187.97.96 - 216.187.97.111 us -216.187.97.112 - 216.187.97.127 ca -216.187.97.128 - 216.187.97.255 us -216.187.98.0 - 216.187.100.255 ca -216.187.101.0 - 216.187.101.31 us -216.187.101.32 - 216.187.101.63 ca -216.187.101.64 - 216.187.101.95 us -216.187.101.96 - 216.187.101.127 ca -216.187.101.128 - 216.187.101.255 in -216.187.102.0 - 216.187.102.255 us -216.187.103.0 - 216.187.103.79 ca -216.187.103.80 - 216.187.103.87 us -216.187.103.88 - 216.187.103.159 ca -216.187.103.160 - 216.187.103.175 us -216.187.103.176 - 216.187.105.63 ca -216.187.105.64 - 216.187.105.127 us -216.187.105.128 - 216.187.105.175 ca -216.187.105.176 - 216.187.105.207 us -216.187.105.208 - 216.187.106.255 ca -216.187.107.0 - 216.187.107.47 us -216.187.107.48 - 216.187.107.255 ca -216.187.108.0 - 216.187.108.255 us -216.187.109.0 - 216.187.109.79 ca -216.187.109.80 - 216.187.109.93 us -216.187.109.94 - 216.187.109.151 ca -216.187.109.152 - 216.187.109.159 us -216.187.109.160 - 216.187.109.175 ca -216.187.109.176 - 216.187.109.191 cn -216.187.109.192 - 216.187.109.223 us -216.187.109.224 - 216.187.111.255 ca +216.187.73.0 - 216.187.73.159 us +216.187.73.160 - 216.187.73.175 ca +216.187.73.176 - 216.187.73.207 us +216.187.73.208 - 216.187.73.215 ca +216.187.73.216 - 216.187.73.255 us +216.187.74.0 - 216.187.74.15 ca +216.187.74.16 - 216.187.77.255 us +216.187.78.0 - 216.187.81.255 ca +216.187.82.0 - 216.187.82.255 us +216.187.83.0 - 216.187.83.255 ca +216.187.84.0 - 216.187.84.255 us +216.187.85.0 - 216.187.86.255 ca +216.187.87.0 - 216.187.91.255 us +216.187.92.0 - 216.187.93.255 ca +216.187.94.0 - 216.187.94.111 us +216.187.94.112 - 216.187.94.119 ca +216.187.94.120 - 216.187.94.255 us +216.187.95.0 - 216.187.95.7 ca +216.187.95.8 - 216.187.95.255 us +216.187.96.0 - 216.187.96.255 ca +216.187.97.0 - 216.187.97.151 us +216.187.97.152 - 216.187.97.159 ca +216.187.97.160 - 216.187.97.239 us +216.187.97.240 - 216.187.100.255 ca +216.187.101.0 - 216.187.103.255 us +216.187.104.0 - 216.187.104.255 ca +216.187.105.0 - 216.187.109.191 us +216.187.109.192 - 216.187.109.223 ca +216.187.109.224 - 216.187.109.255 us +216.187.110.0 - 216.187.111.255 ca 216.187.112.0 - 216.187.115.255 us 216.187.116.0 - 216.187.117.255 ca -216.187.118.0 - 216.187.118.15 bv -216.187.118.16 - 216.187.118.223 ca -216.187.118.224 - 216.187.118.231 us +216.187.118.0 - 216.187.118.159 us +216.187.118.160 - 216.187.118.175 ca +216.187.118.176 - 216.187.118.231 us 216.187.118.232 - 216.187.118.239 ca -216.187.118.240 - 216.187.118.255 us -216.187.119.0 - 216.187.119.255 ca -216.187.120.0 - 216.187.123.95 us -216.187.123.96 - 216.187.123.127 ca -216.187.123.128 - 216.187.125.255 us -216.187.126.0 - 216.187.127.255 ca +216.187.118.240 - 216.187.126.255 us +216.187.127.0 - 216.187.127.255 ca 216.187.128.0 - 216.188.25.255 us 216.188.26.0 - 216.188.26.255 au -216.188.27.0 - 216.189.7.127 us -216.189.7.128 - 216.189.7.159 hk -216.189.7.160 - 216.190.255.255 us +216.188.27.0 - 216.190.255.255 us 216.191.0.0 - 216.191.255.255 ca -216.192.0.0 - 216.193.197.111 us -216.193.197.112 - 216.193.197.127 ca -216.193.197.128 - 216.194.63.255 us -216.194.64.0 - 216.194.69.255 ca -216.194.70.0 - 216.194.70.255 us -216.194.71.0 - 216.194.111.255 ca +216.192.0.0 - 216.194.63.255 us +216.194.64.0 - 216.194.111.255 ca 216.194.112.0 - 216.194.127.255 us 216.194.128.0 - 216.194.131.255 ar 216.194.132.0 - 216.194.133.255 br @@ -153317,503 +114211,170 @@ 216.194.135.0 - 216.194.135.255 br 216.194.136.0 - 216.194.139.255 mx 216.194.140.0 - 216.194.141.255 pe -216.194.142.0 - 216.194.159.255 us -216.194.176.0 - 216.197.127.255 us +216.194.142.0 - 216.197.127.255 us 216.197.128.0 - 216.197.255.255 ca 216.198.0.0 - 216.198.127.255 us 216.198.128.0 - 216.198.159.255 ca -216.198.160.0 - 216.198.192.127 us -216.198.192.128 - 216.198.192.159 gb -216.198.192.160 - 216.198.192.223 us -216.198.192.224 - 216.198.192.255 ca -216.198.193.0 - 216.198.193.255 us -216.198.194.0 - 216.198.194.31 ca -216.198.194.32 - 216.198.194.63 hk -216.198.194.64 - 216.198.194.95 ca -216.198.194.96 - 216.198.194.127 in -216.198.194.128 - 216.198.194.159 us -216.198.194.160 - 216.198.194.223 in -216.198.194.224 - 216.198.197.255 us +216.198.160.0 - 216.198.197.255 us 216.198.198.0 - 216.198.198.255 ca -216.198.199.0 - 216.198.199.63 us -216.198.199.64 - 216.198.199.95 in -216.198.199.96 - 216.198.199.159 us -216.198.199.160 - 216.198.199.223 ca -216.198.199.224 - 216.198.200.31 us -216.198.200.32 - 216.198.200.63 in -216.198.200.64 - 216.198.200.95 us -216.198.200.96 - 216.198.200.127 be -216.198.200.128 - 216.198.200.159 us -216.198.200.160 - 216.198.200.191 be -216.198.200.192 - 216.198.200.223 in -216.198.200.224 - 216.198.201.127 us -216.198.201.128 - 216.198.201.225 in -216.198.201.226 - 216.198.201.255 us -216.198.202.0 - 216.198.202.127 ca -216.198.202.128 - 216.198.202.255 in -216.198.203.0 - 216.198.203.127 us -216.198.203.128 - 216.198.203.255 in -216.198.204.0 - 216.198.204.31 ca -216.198.204.32 - 216.198.204.95 us -216.198.204.96 - 216.198.204.127 in -216.198.204.128 - 216.198.204.159 ca -216.198.204.160 - 216.198.204.191 us -216.198.204.192 - 216.198.204.223 ca -216.198.204.224 - 216.198.206.255 us +216.198.199.0 - 216.198.206.255 us 216.198.207.0 - 216.198.207.255 ca -216.198.208.0 - 216.198.209.255 us -216.198.210.0 - 216.198.211.63 in -216.198.211.64 - 216.198.211.191 ca -216.198.211.192 - 216.198.211.255 us +216.198.208.0 - 216.198.211.255 us 216.198.212.0 - 216.198.212.255 ca -216.198.213.0 - 216.198.214.95 us -216.198.214.96 - 216.198.214.127 it -216.198.214.128 - 216.198.214.159 ca -216.198.214.160 - 216.198.214.191 us -216.198.214.192 - 216.198.214.223 ca -216.198.214.224 - 216.198.215.63 us -216.198.215.64 - 216.198.215.127 it -216.198.215.128 - 216.198.215.159 us -216.198.215.160 - 216.198.215.191 tz -216.198.215.192 - 216.198.216.255 us -216.198.217.0 - 216.198.217.31 in -216.198.217.32 - 216.198.217.63 us -216.198.217.64 - 216.198.217.95 in -216.198.217.96 - 216.198.217.159 us -216.198.217.160 - 216.198.217.191 be -216.198.217.192 - 216.198.217.255 us -216.198.218.0 - 216.198.218.127 ca -216.198.218.128 - 216.198.218.255 us -216.198.219.0 - 216.198.219.255 au -216.198.220.0 - 216.198.220.191 us -216.198.220.192 - 216.198.220.255 ca -216.198.221.0 - 216.198.221.63 us -216.198.221.64 - 216.198.221.95 be -216.198.221.96 - 216.198.221.255 us -216.198.222.0 - 216.198.222.127 ca -216.198.222.128 - 216.198.222.255 in -216.198.223.0 - 216.198.223.31 us -216.198.223.32 - 216.198.223.63 ca -216.198.223.64 - 216.198.224.255 us -216.198.225.0 - 216.198.225.63 jp -216.198.225.64 - 216.198.227.63 us -216.198.227.64 - 216.198.227.95 be -216.198.227.96 - 216.198.228.127 us -216.198.228.128 - 216.198.228.255 ca -216.198.229.0 - 216.198.229.127 us -216.198.229.128 - 216.198.229.255 ca -216.198.230.0 - 216.198.230.255 us +216.198.213.0 - 216.198.230.255 us 216.198.231.0 - 216.198.233.255 ca -216.198.234.0 - 216.198.234.127 us -216.198.234.128 - 216.198.234.191 in -216.198.234.192 - 216.198.234.255 ca -216.198.235.0 - 216.198.235.159 us -216.198.235.160 - 216.198.235.191 in -216.198.235.192 - 216.198.235.255 us -216.198.236.0 - 216.198.236.127 in -216.198.236.128 - 216.198.236.255 ca -216.198.237.0 - 216.198.237.127 in -216.198.237.128 - 216.198.237.255 ca -216.198.238.0 - 216.198.238.127 us -216.198.238.128 - 216.198.238.255 ca -216.198.239.0 - 216.198.239.63 us -216.198.239.64 - 216.198.239.95 ca -216.198.239.96 - 216.198.239.255 us -216.198.240.0 - 216.198.240.127 ca -216.198.240.128 - 216.198.240.255 us -216.198.241.0 - 216.198.241.127 ca -216.198.241.128 - 216.198.241.255 in -216.198.242.0 - 216.198.242.191 us -216.198.242.192 - 216.198.242.223 ca -216.198.242.224 - 216.198.242.255 us -216.198.243.0 - 216.198.243.127 ca -216.198.243.128 - 216.198.244.7 us -216.198.244.8 - 216.198.244.15 in -216.198.244.16 - 216.198.244.47 us -216.198.244.48 - 216.198.244.55 in -216.198.244.56 - 216.198.244.111 us -216.198.244.112 - 216.198.244.119 au -216.198.244.120 - 216.198.244.199 us -216.198.244.200 - 216.198.244.207 hk -216.198.244.208 - 216.198.244.255 us -216.198.245.0 - 216.198.250.255 ca -216.198.251.0 - 216.198.251.31 in -216.198.251.32 - 216.198.251.63 us -216.198.251.64 - 216.198.251.95 ca -216.198.251.96 - 216.198.251.127 in -216.198.251.128 - 216.198.251.159 ca -216.198.251.160 - 216.198.251.191 in -216.198.251.192 - 216.198.253.159 us -216.198.253.160 - 216.198.253.191 be -216.198.253.192 - 216.198.253.255 us -216.198.254.0 - 216.198.254.63 gb -216.198.254.64 - 216.198.254.191 us -216.198.254.192 - 216.198.255.63 in -216.198.255.64 - 216.198.255.127 ca -216.198.255.128 - 216.201.80.15 us -216.201.80.16 - 216.201.80.31 ad -216.201.80.32 - 216.201.80.63 us -216.201.80.64 - 216.201.80.71 sk -216.201.80.72 - 216.201.80.79 il -216.201.80.80 - 216.201.80.95 cy -216.201.80.96 - 216.201.80.143 us -216.201.80.144 - 216.201.80.159 cy -216.201.80.160 - 216.201.80.199 us -216.201.80.200 - 216.201.80.207 fi -216.201.80.208 - 216.201.80.223 ca -216.201.80.224 - 216.201.80.255 gb -216.201.81.0 - 216.201.81.7 us -216.201.81.8 - 216.201.81.15 ad -216.201.81.16 - 216.201.81.31 cy -216.201.81.32 - 216.201.81.151 us -216.201.81.152 - 216.201.81.159 ca -216.201.81.160 - 216.201.81.175 ne -216.201.81.176 - 216.201.81.191 us -216.201.81.192 - 216.201.81.207 il -216.201.81.208 - 216.201.81.215 ca -216.201.81.216 - 216.201.83.255 us +216.198.234.0 - 216.198.246.255 us +216.198.247.0 - 216.198.247.255 ca +216.198.248.0 - 216.198.248.255 us +216.198.249.0 - 216.198.250.255 ca +216.198.251.0 - 216.201.83.255 us 216.201.84.0 - 216.201.84.255 cy -216.201.85.0 - 216.201.85.15 us -216.201.85.16 - 216.201.85.31 ad -216.201.85.32 - 216.201.85.63 us -216.201.85.64 - 216.201.85.79 cy -216.201.85.80 - 216.201.87.63 us -216.201.87.64 - 216.201.87.127 cy -216.201.87.128 - 216.201.88.15 us -216.201.88.16 - 216.201.88.39 ad -216.201.88.40 - 216.201.89.63 us -216.201.89.64 - 216.201.89.127 pa -216.201.89.128 - 216.201.90.255 us -216.201.91.0 - 216.201.91.15 ca -216.201.91.16 - 216.201.91.255 us -216.201.92.0 - 216.201.92.15 ca -216.201.92.16 - 216.201.95.255 us +216.201.85.0 - 216.201.95.255 us 216.201.96.0 - 216.201.111.255 ca -216.201.112.0 - 216.206.40.23 us -216.206.40.24 - 216.206.40.31 ca -216.206.40.32 - 216.206.189.255 us -216.206.190.0 - 216.206.190.31 ca -216.206.190.32 - 216.206.250.31 us -216.206.250.32 - 216.206.250.63 jp -216.206.250.64 - 216.207.96.255 us +216.201.112.0 - 216.207.96.255 us 216.207.97.0 - 216.207.97.255 ge 216.207.98.0 - 216.207.255.255 us -216.208.0.0 - 216.208.38.255 ca -216.208.39.0 - 216.208.39.63 us -216.208.39.64 - 216.209.255.255 ca +216.208.0.0 - 216.209.255.255 ca 216.210.0.0 - 216.210.95.255 us -216.210.96.0 - 216.210.102.111 ca -216.210.102.112 - 216.210.102.190 us -216.210.102.191 - 216.210.111.255 ca +216.210.96.0 - 216.210.111.255 ca 216.210.112.0 - 216.210.255.255 us 216.211.0.0 - 216.211.127.255 ca -216.211.128.0 - 216.212.214.255 us -216.212.215.0 - 216.212.215.255 vi -216.212.216.0 - 216.217.255.255 us +216.211.128.0 - 216.217.255.255 us 216.218.0.0 - 216.218.63.255 ca -216.218.64.0 - 216.218.130.167 us -216.218.130.168 - 216.218.130.175 bm -216.218.130.176 - 216.218.130.199 us -216.218.130.200 - 216.218.130.207 es -216.218.130.208 - 216.218.131.127 us -216.218.131.128 - 216.218.131.255 cn -216.218.132.0 - 216.218.133.159 us -216.218.133.160 - 216.218.133.191 de -216.218.133.192 - 216.218.133.255 us -216.218.134.0 - 216.218.134.7 cn -216.218.134.8 - 216.218.134.15 au -216.218.134.16 - 216.218.134.199 us -216.218.134.200 - 216.218.134.207 jp -216.218.134.208 - 216.218.159.199 us -216.218.159.200 - 216.218.159.207 lu -216.218.159.208 - 216.218.168.15 us -216.218.168.16 - 216.218.168.31 cn -216.218.168.32 - 216.218.190.23 us -216.218.190.24 - 216.218.190.31 gb -216.218.190.32 - 216.218.190.255 us +216.218.64.0 - 216.218.190.255 us 216.218.191.0 - 216.218.191.255 gr -216.218.192.0 - 216.218.192.127 it -216.218.192.128 - 216.218.192.215 us -216.218.192.216 - 216.218.192.223 ck -216.218.192.224 - 216.218.195.239 us -216.218.195.240 - 216.218.195.255 gb -216.218.196.0 - 216.218.196.151 us -216.218.196.152 - 216.218.196.159 jp -216.218.196.160 - 216.218.196.175 us -216.218.196.176 - 216.218.196.183 au -216.218.196.184 - 216.218.200.31 us -216.218.200.32 - 216.218.200.39 lu -216.218.200.40 - 216.218.209.79 us -216.218.209.80 - 216.218.209.95 it -216.218.209.96 - 216.218.210.191 us -216.218.210.192 - 216.218.210.255 au -216.218.211.0 - 216.218.211.255 us -216.218.212.0 - 216.218.212.255 it -216.218.213.0 - 216.218.213.135 us -216.218.213.136 - 216.218.213.143 jp -216.218.213.144 - 216.218.213.159 us -216.218.213.160 - 216.218.213.191 qa -216.218.213.192 - 216.218.214.223 us -216.218.214.224 - 216.218.214.231 cn -216.218.214.232 - 216.218.221.7 us -216.218.221.8 - 216.218.221.15 de -216.218.221.16 - 216.218.221.63 us -216.218.221.64 - 216.218.221.127 de -216.218.221.128 - 216.218.222.127 us -216.218.222.128 - 216.218.222.255 au -216.218.223.0 - 216.218.223.31 ca -216.218.223.32 - 216.218.224.63 us -216.218.224.64 - 216.218.224.71 it -216.218.224.72 - 216.218.226.199 us -216.218.226.200 - 216.218.226.207 pa -216.218.226.208 - 216.218.229.127 us -216.218.229.128 - 216.218.229.143 it -216.218.229.144 - 216.218.230.255 us +216.218.192.0 - 216.218.230.255 us 216.218.231.0 - 216.218.231.255 gr -216.218.232.0 - 216.218.236.63 us -216.218.236.64 - 216.218.236.95 in -216.218.236.96 - 216.218.238.255 us +216.218.232.0 - 216.218.238.255 us 216.218.239.0 - 216.218.239.255 nl -216.218.240.0 - 216.218.244.55 us -216.218.244.56 - 216.218.244.63 gb -216.218.244.64 - 216.218.249.31 us -216.218.249.32 - 216.218.249.63 it -216.218.249.64 - 216.218.254.143 us -216.218.254.144 - 216.218.254.151 au -216.218.254.152 - 216.218.255.31 us -216.218.255.32 - 216.218.255.63 es -216.218.255.64 - 216.218.255.143 us -216.218.255.144 - 216.218.255.151 ca -216.218.255.152 - 216.218.255.247 us -216.218.255.248 - 216.218.255.255 gb -216.219.0.0 - 216.219.64.15 us -216.219.64.16 - 216.219.64.31 gb -216.219.64.32 - 216.219.64.63 us -216.219.64.64 - 216.219.64.127 gb -216.219.64.128 - 216.219.64.255 de -216.219.65.0 - 216.219.65.175 us -216.219.65.176 - 216.219.65.191 de -216.219.65.192 - 216.219.65.223 us -216.219.65.224 - 216.219.68.255 gb -216.219.69.0 - 216.219.70.255 fr +216.218.240.0 - 216.219.65.255 us +216.219.66.0 - 216.219.68.255 gb +216.219.69.0 - 216.219.70.255 us 216.219.71.0 - 216.219.71.255 gb -216.219.72.0 - 216.219.73.23 us -216.219.73.24 - 216.219.73.63 gb -216.219.73.64 - 216.219.73.255 us -216.219.74.0 - 216.219.74.7 gb -216.219.74.8 - 216.219.74.15 us -216.219.74.16 - 216.219.74.47 gb -216.219.74.48 - 216.219.76.39 us -216.219.76.40 - 216.219.76.47 gb -216.219.76.48 - 216.219.76.63 us +216.219.72.0 - 216.219.76.63 us 216.219.76.64 - 216.219.76.127 gb -216.219.76.128 - 216.219.76.191 us -216.219.76.192 - 216.219.76.207 gb -216.219.76.208 - 216.219.76.223 us -216.219.76.224 - 216.219.77.63 gb -216.219.77.64 - 216.219.77.79 us -216.219.77.80 - 216.219.77.95 gb -216.219.77.96 - 216.219.77.111 us -216.219.77.112 - 216.219.77.119 gb -216.219.77.120 - 216.219.77.143 us -216.219.77.144 - 216.219.77.159 gb -216.219.77.160 - 216.219.77.167 ch -216.219.77.168 - 216.219.77.231 us -216.219.77.232 - 216.219.77.239 gb -216.219.77.240 - 216.220.31.255 us +216.219.76.128 - 216.220.31.255 us 216.220.32.0 - 216.220.63.255 ca 216.220.64.0 - 216.221.31.255 us -216.221.32.0 - 216.221.49.95 ca -216.221.49.96 - 216.221.49.111 us -216.221.49.112 - 216.221.95.255 ca -216.221.96.0 - 216.221.143.255 us -216.221.144.0 - 216.221.144.15 gb -216.221.144.16 - 216.221.144.31 ch -216.221.144.32 - 216.221.145.255 us -216.221.146.0 - 216.221.146.127 ch -216.221.146.128 - 216.221.146.255 us +216.221.32.0 - 216.221.95.255 ca +216.221.96.0 - 216.221.146.255 us 216.221.147.0 - 216.221.147.255 ch -216.221.148.0 - 216.221.148.63 ca -216.221.148.64 - 216.221.149.15 us -216.221.149.16 - 216.221.149.23 ca -216.221.149.24 - 216.221.150.47 us -216.221.150.48 - 216.221.150.55 pa -216.221.150.56 - 216.221.150.63 us -216.221.150.64 - 216.221.150.95 ca -216.221.150.96 - 216.221.150.127 us -216.221.150.128 - 216.221.150.255 ca -216.221.151.0 - 216.223.62.239 us -216.223.62.240 - 216.223.62.255 gb -216.223.63.0 - 216.223.63.255 us -216.223.64.0 - 216.223.131.191 ca -216.223.131.192 - 216.223.131.199 us -216.223.131.200 - 216.223.138.239 ca -216.223.138.240 - 216.223.138.247 us -216.223.138.248 - 216.223.143.255 ca -216.223.144.0 - 216.223.144.15 us -216.223.144.16 - 216.223.144.191 ca -216.223.144.192 - 216.223.144.207 us -216.223.144.208 - 216.223.158.63 ca -216.223.158.64 - 216.223.158.71 us -216.223.158.72 - 216.223.159.255 ca +216.221.148.0 - 216.221.152.63 us +216.221.152.64 - 216.221.152.95 ca +216.221.152.96 - 216.223.27.29 us +216.223.27.30 - 216.223.27.30 ca +216.223.27.31 - 216.223.63.255 us +216.223.64.0 - 216.223.159.255 ca 216.223.160.0 - 216.226.31.255 us 216.226.32.0 - 216.226.63.255 ca -216.226.64.0 - 216.226.67.255 a2 -216.226.68.0 - 216.226.68.255 vc -216.226.69.0 - 216.226.79.255 a2 -216.226.80.0 - 216.228.207.255 us +216.226.64.0 - 216.228.207.255 us 216.228.208.0 - 216.228.223.255 ca -216.228.224.0 - 216.230.32.255 us -216.230.33.0 - 216.230.33.255 br -216.230.34.0 - 216.230.127.255 us -216.230.128.0 - 216.230.159.255 gt -216.230.160.0 - 216.231.255.255 us +216.228.224.0 - 216.228.232.255 us +216.228.233.0 - 216.228.233.255 ca +216.228.234.0 - 216.229.48.255 us +216.229.49.0 - 216.229.49.255 mx +216.229.50.0 - 216.230.127.255 us +216.230.128.0 - 216.230.132.255 gt +216.230.133.0 - 216.230.133.255 hn +216.230.134.0 - 216.230.159.255 gt +216.230.160.0 - 216.230.175.255 us +216.230.192.0 - 216.231.134.255 us +216.231.135.0 - 216.231.135.255 es +216.231.136.0 - 216.231.202.255 us +216.231.203.0 - 216.231.203.255 hk +216.231.204.0 - 216.231.255.255 us 216.232.0.0 - 216.232.255.255 ca 216.233.0.0 - 216.234.31.255 us 216.234.32.0 - 216.234.63.255 ca 216.234.64.0 - 216.234.159.255 us -216.234.160.0 - 216.234.174.53 ca -216.234.174.54 - 216.234.174.54 il -216.234.174.55 - 216.234.191.255 ca +216.234.160.0 - 216.234.191.255 ca 216.234.192.0 - 216.234.255.255 us 216.235.0.0 - 216.235.15.255 ca -216.235.16.0 - 216.235.246.111 us -216.235.246.112 - 216.235.246.119 gb -216.235.246.120 - 216.235.248.31 us -216.235.248.32 - 216.235.248.63 gb -216.235.248.64 - 216.235.248.127 us -216.235.248.128 - 216.235.248.159 gb -216.235.248.160 - 216.235.253.63 us -216.235.253.64 - 216.235.253.79 ma -216.235.253.80 - 216.235.253.159 us -216.235.253.160 - 216.235.253.191 gb -216.235.253.192 - 216.235.253.207 pl -216.235.253.208 - 216.236.95.255 us -216.236.96.0 - 216.236.121.255 a2 -216.236.122.0 - 216.236.125.255 gu -216.236.126.0 - 216.236.126.255 a2 -216.236.127.0 - 216.236.175.255 us +216.235.16.0 - 216.236.95.255 us +216.236.96.0 - 216.236.104.255 a2 +216.236.105.0 - 216.236.105.255 us +216.236.106.0 - 216.236.117.255 a2 +216.236.118.0 - 216.236.119.255 us +216.236.120.0 - 216.236.125.255 a2 +216.236.126.0 - 216.236.175.255 us 216.236.176.0 - 216.236.191.255 za 216.236.192.0 - 216.236.198.255 us -216.236.199.0 - 216.236.199.255 a2 -216.236.200.0 - 216.236.200.31 ne -216.236.200.32 - 216.236.200.63 a2 -216.236.200.64 - 216.236.200.79 pk -216.236.200.80 - 216.236.200.95 a2 -216.236.200.96 - 216.236.200.111 ng -216.236.200.112 - 216.236.200.119 tz -216.236.200.120 - 216.236.200.135 a2 -216.236.200.136 - 216.236.200.167 in -216.236.200.168 - 216.236.200.191 a2 -216.236.200.192 - 216.236.200.199 tz -216.236.200.200 - 216.236.201.63 a2 -216.236.201.64 - 216.236.201.127 ne -216.236.201.128 - 216.236.201.135 in -216.236.201.136 - 216.236.201.255 a2 -216.236.202.0 - 216.236.202.15 ne -216.236.202.16 - 216.236.202.63 a2 -216.236.202.64 - 216.236.202.95 fr -216.236.202.96 - 216.236.202.111 ng -216.236.202.112 - 216.236.202.127 a2 -216.236.202.128 - 216.236.202.159 cd -216.236.202.160 - 216.236.202.255 a2 +216.236.199.0 - 216.236.202.255 a2 216.236.203.0 - 216.236.203.255 in 216.236.204.0 - 216.236.204.255 us -216.236.205.0 - 216.236.205.255 a2 +216.236.205.0 - 216.236.205.255 ng 216.236.206.0 - 216.236.207.255 us -216.236.208.0 - 216.236.208.23 a2 -216.236.208.24 - 216.236.208.31 lb -216.236.208.32 - 216.236.208.39 a2 -216.236.208.40 - 216.236.208.47 lb -216.236.208.48 - 216.236.208.63 a2 -216.236.208.64 - 216.236.208.95 sa -216.236.208.96 - 216.236.208.127 a2 -216.236.208.128 - 216.236.208.191 sa -216.236.208.192 - 216.236.208.199 lb -216.236.208.200 - 216.236.208.255 a2 -216.236.209.0 - 216.236.209.7 sa -216.236.209.8 - 216.236.209.255 a2 -216.236.210.0 - 216.236.213.255 us +216.236.208.0 - 216.236.209.255 a2 +216.236.210.0 - 216.236.212.255 us +216.236.213.0 - 216.236.213.255 hn 216.236.214.0 - 216.236.215.255 a2 216.236.216.0 - 216.236.219.255 rs -216.236.220.0 - 216.236.220.23 pk -216.236.220.24 - 216.236.220.39 a2 -216.236.220.40 - 216.236.220.47 id -216.236.220.48 - 216.236.220.63 a2 -216.236.220.64 - 216.236.220.79 tz -216.236.220.80 - 216.236.220.87 lk -216.236.220.88 - 216.236.220.119 a2 -216.236.220.120 - 216.236.220.127 us -216.236.220.128 - 216.236.220.151 a2 -216.236.220.152 - 216.236.220.159 tz -216.236.220.160 - 216.236.220.175 a2 -216.236.220.176 - 216.236.220.183 pk -216.236.220.184 - 216.236.220.215 a2 -216.236.220.216 - 216.236.220.255 pk -216.236.221.0 - 216.236.222.31 a2 -216.236.222.32 - 216.236.222.47 pk -216.236.222.48 - 216.236.222.63 a2 -216.236.222.64 - 216.236.222.71 us -216.236.222.72 - 216.236.222.87 pk -216.236.222.88 - 216.236.222.95 a2 -216.236.222.96 - 216.236.222.111 pk -216.236.222.112 - 216.236.222.127 a2 -216.236.222.128 - 216.236.222.191 ng -216.236.222.192 - 216.236.222.207 pk -216.236.222.208 - 216.236.222.215 a2 -216.236.222.216 - 216.236.222.223 pk -216.236.222.224 - 216.236.222.255 a2 +216.236.220.0 - 216.236.222.255 a2 216.236.223.0 - 216.236.223.255 gh -216.236.224.0 - 216.237.113.15 us -216.237.113.16 - 216.237.113.23 ro -216.237.113.24 - 216.237.117.127 us -216.237.117.128 - 216.237.117.255 in -216.237.118.0 - 216.238.88.15 us -216.238.88.16 - 216.238.88.31 si -216.238.88.32 - 216.238.88.39 us -216.238.88.40 - 216.238.88.47 nl -216.238.88.48 - 216.238.143.255 us -216.238.144.0 - 216.238.144.31 ae -216.238.144.32 - 216.238.144.151 us +216.236.224.0 - 216.238.144.151 us 216.238.144.152 - 216.238.144.155 ae -216.238.144.156 - 216.238.223.255 us +216.238.144.156 - 216.238.191.255 us +216.238.208.0 - 216.238.223.255 us 216.238.224.0 - 216.238.239.255 ca -216.238.240.0 - 216.239.63.255 us +216.238.240.0 - 216.239.32.255 us +216.239.33.0 - 216.239.33.7 ar +216.239.33.8 - 216.239.33.15 br +216.239.33.16 - 216.239.33.31 ca +216.239.33.32 - 216.239.33.39 mx +216.239.33.40 - 216.239.33.103 us +216.239.33.104 - 216.239.33.111 au +216.239.33.112 - 216.239.33.223 us +216.239.33.224 - 216.239.33.255 ca +216.239.34.0 - 216.239.49.255 us +216.239.50.0 - 216.239.50.105 gb +216.239.50.106 - 216.239.50.106 us +216.239.50.107 - 216.239.50.188 gb +216.239.50.189 - 216.239.50.189 us +216.239.50.190 - 216.239.50.255 gb +216.239.51.0 - 216.239.54.255 us +216.239.55.0 - 216.239.55.7 ar +216.239.55.8 - 216.239.55.15 br +216.239.55.16 - 216.239.55.23 ca +216.239.55.24 - 216.239.55.31 mx +216.239.55.32 - 216.239.55.159 us +216.239.55.160 - 216.239.55.167 au +216.239.55.168 - 216.239.55.175 ca +216.239.55.176 - 216.239.55.183 co +216.239.55.184 - 216.239.63.255 us 216.239.64.0 - 216.239.95.255 ca -216.239.96.0 - 216.239.203.255 us +216.239.96.0 - 216.239.97.255 us +216.239.98.0 - 216.239.98.255 hk +216.239.99.0 - 216.239.203.255 us 216.239.204.0 - 216.239.207.255 gb 216.239.208.0 - 216.239.255.255 us 216.240.0.0 - 216.240.15.255 ca -216.240.16.0 - 216.240.191.255 us +216.240.16.0 - 216.240.126.255 us +216.240.127.0 - 216.240.127.255 ca +216.240.128.0 - 216.240.191.255 us 216.240.192.0 - 216.240.207.255 ca 216.240.208.0 - 216.240.223.255 us 216.240.224.0 - 216.240.239.255 ca 216.240.240.0 - 216.240.255.255 us -216.241.0.0 - 216.241.2.255 co -216.241.3.0 - 216.241.9.255 cl -216.241.10.0 - 216.241.12.255 co +216.241.0.0 - 216.241.8.127 cl +216.241.8.128 - 216.241.8.255 co +216.241.9.0 - 216.241.9.127 cl +216.241.9.128 - 216.241.12.255 co 216.241.13.0 - 216.241.13.255 cl -216.241.14.0 - 216.241.14.127 co -216.241.14.128 - 216.241.14.159 cl -216.241.14.160 - 216.241.14.223 co -216.241.14.224 - 216.241.14.239 cl -216.241.14.240 - 216.241.15.23 co -216.241.15.24 - 216.241.15.31 cl -216.241.15.32 - 216.241.16.31 co +216.241.14.0 - 216.241.14.63 co +216.241.14.64 - 216.241.14.191 cl +216.241.14.192 - 216.241.14.223 co +216.241.14.224 - 216.241.15.127 cl +216.241.15.128 - 216.241.16.31 co 216.241.16.32 - 216.241.16.39 cl 216.241.16.40 - 216.241.16.55 co 216.241.16.56 - 216.241.16.71 cl 216.241.16.72 - 216.241.16.135 co 216.241.16.136 - 216.241.16.143 cl -216.241.16.144 - 216.241.16.183 co -216.241.16.184 - 216.241.16.191 cl -216.241.16.192 - 216.241.17.39 co +216.241.16.144 - 216.241.17.39 co 216.241.17.40 - 216.241.17.47 cl 216.241.17.48 - 216.241.17.151 co 216.241.17.152 - 216.241.17.159 cl -216.241.17.160 - 216.241.17.191 co -216.241.17.192 - 216.241.17.199 cl -216.241.17.200 - 216.241.17.247 co +216.241.17.160 - 216.241.17.247 co 216.241.17.248 - 216.241.17.255 cl 216.241.18.0 - 216.241.18.63 co 216.241.18.64 - 216.241.18.79 cl @@ -153823,7 +114384,9 @@ 216.241.18.136 - 216.241.18.143 cl 216.241.18.144 - 216.241.18.191 co 216.241.18.192 - 216.241.18.255 cl -216.241.19.0 - 216.241.19.55 co +216.241.19.0 - 216.241.19.23 co +216.241.19.24 - 216.241.19.31 cl +216.241.19.32 - 216.241.19.55 co 216.241.19.56 - 216.241.19.71 cl 216.241.19.72 - 216.241.19.127 co 216.241.19.128 - 216.241.19.135 cl @@ -153833,260 +114396,120 @@ 216.241.19.232 - 216.241.19.255 cl 216.241.20.0 - 216.241.20.23 co 216.241.20.24 - 216.241.20.31 cl -216.241.20.32 - 216.241.20.47 co -216.241.20.48 - 216.241.20.55 cl +216.241.20.32 - 216.241.20.39 co +216.241.20.40 - 216.241.20.55 cl 216.241.20.56 - 216.241.20.79 co 216.241.20.80 - 216.241.20.87 cl 216.241.20.88 - 216.241.20.223 co 216.241.20.224 - 216.241.20.239 cl 216.241.20.240 - 216.241.20.247 co -216.241.20.248 - 216.241.21.255 cl -216.241.22.0 - 216.241.22.23 co +216.241.20.248 - 216.241.20.255 cl +216.241.21.0 - 216.241.21.255 co +216.241.22.0 - 216.241.22.7 cl +216.241.22.8 - 216.241.22.23 co 216.241.22.24 - 216.241.22.31 cl 216.241.22.32 - 216.241.22.183 co 216.241.22.184 - 216.241.22.191 cl -216.241.22.192 - 216.241.22.207 co -216.241.22.208 - 216.241.22.223 cl -216.241.22.224 - 216.241.23.15 co +216.241.22.192 - 216.241.22.223 co +216.241.22.224 - 216.241.22.239 cl +216.241.22.240 - 216.241.23.15 co 216.241.23.16 - 216.241.23.31 cl -216.241.23.32 - 216.241.23.175 co +216.241.23.32 - 216.241.23.111 co +216.241.23.112 - 216.241.23.119 cl +216.241.23.120 - 216.241.23.175 co 216.241.23.176 - 216.241.23.191 cl 216.241.23.192 - 216.241.23.207 co 216.241.23.208 - 216.241.23.215 cl -216.241.23.216 - 216.241.25.127 co +216.241.23.216 - 216.241.24.255 co +216.241.25.0 - 216.241.25.15 cl +216.241.25.16 - 216.241.25.31 co +216.241.25.32 - 216.241.25.47 cl +216.241.25.48 - 216.241.25.127 co 216.241.25.128 - 216.241.25.151 cl 216.241.25.152 - 216.241.25.223 co 216.241.25.224 - 216.241.25.231 cl -216.241.25.232 - 216.241.25.255 co -216.241.26.0 - 216.241.26.255 cl -216.241.27.0 - 216.241.28.255 co -216.241.29.0 - 216.241.29.15 cl -216.241.29.16 - 216.241.29.87 co -216.241.29.88 - 216.241.29.95 cl -216.241.29.96 - 216.241.29.103 co -216.241.29.104 - 216.241.29.111 cl -216.241.29.112 - 216.241.29.191 co -216.241.29.192 - 216.241.29.223 cl -216.241.29.224 - 216.241.31.79 co -216.241.31.80 - 216.241.31.95 cl -216.241.31.96 - 216.241.31.127 co -216.241.31.128 - 216.241.31.159 cl -216.241.31.160 - 216.241.31.223 co +216.241.25.232 - 216.241.29.159 co +216.241.29.160 - 216.241.29.175 cl +216.241.29.176 - 216.241.29.255 co +216.241.30.0 - 216.241.30.255 cl +216.241.31.0 - 216.241.31.31 co +216.241.31.32 - 216.241.31.63 cl +216.241.31.64 - 216.241.31.127 co +216.241.31.128 - 216.241.31.191 cl +216.241.31.192 - 216.241.31.223 co 216.241.31.224 - 216.241.31.255 cl -216.241.32.0 - 216.241.223.255 us +216.241.32.0 - 216.241.74.255 us +216.241.75.0 - 216.241.75.255 gb +216.241.76.0 - 216.241.123.253 us +216.241.123.254 - 216.241.123.254 gb +216.241.123.255 - 216.241.223.255 us 216.241.224.0 - 216.241.239.255 ca -216.241.240.0 - 216.244.66.255 us -216.244.67.0 - 216.244.67.7 sg -216.244.67.8 - 216.244.76.66 us -216.244.76.67 - 216.244.76.67 id -216.244.76.68 - 216.244.76.90 us -216.244.76.91 - 216.244.76.91 id -216.244.76.92 - 216.244.89.135 us -216.244.89.136 - 216.244.89.143 id -216.244.89.144 - 216.244.89.151 us -216.244.89.152 - 216.244.89.159 id -216.244.89.160 - 216.244.89.191 us -216.244.89.192 - 216.244.89.207 mx -216.244.89.208 - 216.244.91.79 us -216.244.91.80 - 216.244.91.95 mx -216.244.91.96 - 216.244.92.215 us -216.244.92.216 - 216.244.92.223 de -216.244.92.224 - 216.244.93.255 us -216.244.94.0 - 216.244.94.15 id -216.244.94.16 - 216.244.127.255 us +216.241.240.0 - 216.241.248.255 us +216.241.249.0 - 216.241.249.255 hk +216.241.250.0 - 216.241.251.255 us +216.241.252.0 - 216.241.252.29 gb +216.241.252.30 - 216.241.252.30 fr +216.241.252.31 - 216.241.252.255 gb +216.241.253.0 - 216.241.253.29 us +216.241.253.30 - 216.241.253.30 gb +216.241.253.31 - 216.244.127.255 us 216.244.128.0 - 216.244.191.255 pe 216.244.192.0 - 216.244.255.255 ar -216.245.0.0 - 216.246.4.215 us -216.246.4.216 - 216.246.4.223 il -216.246.4.224 - 216.246.10.167 us -216.246.10.168 - 216.246.10.175 tr -216.246.10.176 - 216.246.26.143 us -216.246.26.144 - 216.246.26.151 hk -216.246.26.152 - 216.246.26.191 us -216.246.26.192 - 216.246.26.199 so -216.246.26.200 - 216.246.49.39 us -216.246.49.40 - 216.246.49.47 ca -216.246.49.48 - 216.246.51.199 us -216.246.51.200 - 216.246.51.207 gi -216.246.51.208 - 216.246.88.39 us -216.246.88.40 - 216.246.88.47 eg -216.246.88.48 - 216.246.88.191 us -216.246.88.192 - 216.246.88.207 gi -216.246.88.208 - 216.246.88.231 us -216.246.88.232 - 216.246.88.239 hk -216.246.88.240 - 216.246.105.23 us -216.246.105.24 - 216.246.105.31 gb -216.246.105.32 - 216.246.108.47 us -216.246.108.48 - 216.246.108.55 gb -216.246.108.56 - 216.246.108.87 us -216.246.108.88 - 216.246.108.95 in -216.246.108.96 - 216.246.108.135 us -216.246.108.136 - 216.246.108.143 ca -216.246.108.144 - 216.246.108.151 gb -216.246.108.152 - 216.246.108.175 us -216.246.108.176 - 216.246.108.183 ca -216.246.108.184 - 216.246.109.31 us -216.246.109.32 - 216.246.109.39 gb -216.246.109.40 - 216.246.109.175 us -216.246.109.176 - 216.246.109.183 ca -216.246.109.184 - 216.246.223.255 us +216.245.0.0 - 216.246.223.255 us 216.246.224.0 - 216.246.255.255 ca -216.247.0.0 - 216.247.36.127 us -216.247.36.128 - 216.247.36.143 nl -216.247.36.144 - 216.247.37.239 us -216.247.37.240 - 216.247.37.255 ca -216.247.38.0 - 216.247.179.191 us -216.247.179.192 - 216.247.179.207 nl -216.247.179.208 - 216.247.181.191 us -216.247.181.192 - 216.247.181.207 nl -216.247.181.208 - 216.248.255.255 us +216.247.0.0 - 216.248.255.255 us 216.249.0.0 - 216.249.15.255 ca 216.249.16.0 - 216.249.31.255 us 216.249.32.0 - 216.249.47.255 bm 216.249.48.0 - 216.249.63.255 ca -216.249.64.0 - 216.250.95.255 us -216.250.96.0 - 216.250.111.255 ca -216.250.112.0 - 216.250.193.15 us -216.250.193.16 - 216.250.193.31 id -216.250.193.32 - 216.250.193.39 gb -216.250.193.40 - 216.250.193.95 us -216.250.193.96 - 216.250.193.127 id -216.250.193.128 - 216.250.193.255 us +216.249.64.0 - 216.250.193.255 us 216.250.194.0 - 216.250.194.255 ni -216.250.195.0 - 216.250.195.31 ng -216.250.195.32 - 216.250.203.255 us -216.250.204.0 - 216.250.204.255 a2 -216.250.205.0 - 216.250.205.255 us +216.250.195.0 - 216.250.195.255 us +216.250.196.0 - 216.250.196.255 to +216.250.197.0 - 216.250.205.255 us 216.250.206.0 - 216.250.206.255 tr -216.250.207.0 - 216.250.213.143 us -216.250.213.144 - 216.250.213.159 a2 -216.250.213.160 - 216.250.213.223 us -216.250.213.224 - 216.250.213.239 a2 -216.250.213.240 - 216.250.214.63 us -216.250.214.64 - 216.250.214.95 id -216.250.214.96 - 216.250.214.119 us -216.250.214.120 - 216.250.214.127 nl -216.250.214.128 - 216.250.216.255 us +216.250.207.0 - 216.250.211.255 us +216.250.212.0 - 216.250.212.255 mx +216.250.213.0 - 216.250.216.255 us 216.250.217.0 - 216.250.219.255 nc -216.250.220.0 - 216.250.220.127 gq -216.250.220.128 - 216.250.220.255 us +216.250.220.0 - 216.250.220.255 us 216.250.221.0 - 216.250.221.255 ng -216.250.222.0 - 216.251.65.127 us -216.251.65.128 - 216.251.65.175 mx -216.251.65.176 - 216.251.65.191 us -216.251.65.192 - 216.251.65.254 mx -216.251.65.255 - 216.251.65.255 us -216.251.66.0 - 216.251.66.254 mx -216.251.66.255 - 216.251.67.47 us -216.251.67.48 - 216.251.67.63 mx -216.251.67.64 - 216.251.67.79 us -216.251.67.80 - 216.251.67.87 mx -216.251.67.88 - 216.251.67.111 us -216.251.67.112 - 216.251.67.159 mx -216.251.67.160 - 216.251.68.63 us -216.251.68.64 - 216.251.68.111 mx -216.251.68.112 - 216.251.68.143 us -216.251.68.144 - 216.251.68.254 mx -216.251.68.255 - 216.251.72.191 us -216.251.72.192 - 216.251.72.223 mx -216.251.72.224 - 216.251.72.255 us +216.250.222.0 - 216.251.72.255 us 216.251.73.0 - 216.251.73.254 mx -216.251.73.255 - 216.251.74.255 us -216.251.75.0 - 216.251.75.63 mx -216.251.75.64 - 216.251.75.79 us -216.251.75.80 - 216.251.75.95 mx -216.251.75.96 - 216.251.75.111 us -216.251.75.112 - 216.251.75.127 mx -216.251.75.128 - 216.251.75.143 us -216.251.75.144 - 216.251.75.159 mx -216.251.75.160 - 216.251.75.175 us -216.251.75.176 - 216.251.75.207 mx -216.251.75.208 - 216.251.75.223 us -216.251.75.224 - 216.251.75.239 mx -216.251.75.240 - 216.251.75.255 us -216.251.76.0 - 216.251.76.63 mx -216.251.76.64 - 216.251.76.191 us -216.251.76.192 - 216.251.76.254 mx -216.251.76.255 - 216.251.127.255 us +216.251.73.255 - 216.251.127.255 us 216.251.128.0 - 216.251.159.255 ca 216.251.160.0 - 216.252.63.255 us 216.252.64.0 - 216.252.95.255 ca 216.252.96.0 - 216.252.143.255 us -216.252.144.0 - 216.252.151.255 a2 +216.252.144.0 - 216.252.151.255 de 216.252.152.0 - 216.252.154.255 us 216.252.155.0 - 216.252.155.255 a2 -216.252.156.0 - 216.252.160.255 us -216.252.176.0 - 216.252.191.255 a2 +216.252.156.0 - 216.252.175.255 us +216.252.176.0 - 216.252.191.255 de 216.252.192.0 - 216.252.207.255 us +216.252.208.0 - 216.252.215.255 ca 216.252.216.0 - 216.252.219.255 a2 216.252.220.0 - 216.252.223.255 us -216.252.224.0 - 216.252.255.255 a2 +216.252.224.0 - 216.252.255.255 de 216.253.0.0 - 216.254.127.255 us -216.254.128.0 - 216.254.135.207 ca -216.254.135.208 - 216.254.135.215 us -216.254.135.216 - 216.254.139.127 ca -216.254.139.128 - 216.254.139.143 us -216.254.139.144 - 216.254.154.231 ca -216.254.154.232 - 216.254.154.239 us -216.254.154.240 - 216.254.159.127 ca -216.254.159.128 - 216.254.159.143 us -216.254.159.144 - 216.254.223.255 ca +216.254.128.0 - 216.254.223.255 ca 216.254.224.0 - 216.255.223.255 us 216.255.224.0 - 216.255.239.255 jp 216.255.240.0 - 216.255.255.255 us -217.0.0.0 - 217.6.33.119 de -217.6.33.120 - 217.6.33.127 cz -217.6.33.128 - 217.6.115.31 de -217.6.115.32 - 217.6.115.39 be -217.6.115.40 - 217.6.142.247 de -217.6.142.248 - 217.6.142.255 cz -217.6.143.0 - 217.6.213.103 de -217.6.213.104 - 217.6.213.111 hu -217.6.213.112 - 217.6.226.7 de -217.6.226.8 - 217.6.226.15 ch -217.6.226.16 - 217.7.101.191 de -217.7.101.192 - 217.7.101.199 us -217.7.101.200 - 217.7.128.127 de -217.7.128.128 - 217.7.128.135 at -217.7.128.136 - 217.7.169.63 de -217.7.169.64 - 217.7.169.71 at -217.7.169.72 - 217.7.169.143 de -217.7.169.144 - 217.7.169.167 fr -217.7.169.168 - 217.7.169.215 de -217.7.169.216 - 217.7.169.223 fr -217.7.169.224 - 217.7.169.239 de -217.7.169.240 - 217.7.169.247 es -217.7.169.248 - 217.7.170.55 de -217.7.170.56 - 217.7.170.63 nl -217.7.170.64 - 217.7.170.191 de -217.7.170.192 - 217.7.170.199 es -217.7.170.200 - 217.7.171.23 de -217.7.171.24 - 217.7.171.31 it -217.7.171.32 - 217.7.171.119 de -217.7.171.120 - 217.7.171.127 es -217.7.171.128 - 217.7.175.255 de -217.7.176.0 - 217.7.176.7 es -217.7.176.8 - 217.7.176.47 de -217.7.176.48 - 217.7.176.63 es -217.7.176.64 - 217.7.176.87 de -217.7.176.88 - 217.7.176.95 es -217.7.176.96 - 217.7.255.255 de +217.0.0.0 - 217.7.255.255 de 217.8.0.0 - 217.8.31.255 gb 217.8.32.0 - 217.8.47.255 tj 217.8.48.0 - 217.8.63.255 de 217.8.64.0 - 217.8.79.255 sa 217.8.80.0 - 217.8.95.255 ru -217.8.96.0 - 217.8.100.255 nl -217.8.101.0 - 217.8.101.255 cn -217.8.102.0 - 217.8.111.255 nl -217.8.112.0 - 217.8.127.255 jo +217.8.96.0 - 217.8.111.255 nl 217.8.128.0 - 217.8.159.255 no 217.8.160.0 - 217.8.191.255 pl 217.8.192.0 - 217.8.223.255 ch 217.8.224.0 - 217.8.239.255 ru 217.8.240.0 - 217.8.255.255 gb 217.9.0.0 - 217.9.15.255 ua -217.9.16.0 - 217.9.63.255 de +217.9.32.0 - 217.9.63.255 de 217.9.64.0 - 217.9.79.255 it 217.9.80.0 - 217.9.95.255 ru 217.9.96.0 - 217.9.127.255 de @@ -154100,71 +114523,29 @@ 217.10.0.0 - 217.10.15.255 de 217.10.16.0 - 217.10.31.255 dk 217.10.32.0 - 217.10.47.255 ru -217.10.48.0 - 217.10.48.255 us -217.10.49.0 - 217.10.79.255 de +217.10.48.0 - 217.10.51.255 de +217.10.52.0 - 217.10.52.255 at +217.10.53.0 - 217.10.79.255 de 217.10.80.0 - 217.10.95.255 es 217.10.96.0 - 217.10.127.255 se -217.10.128.0 - 217.10.132.175 gb -217.10.132.176 - 217.10.132.191 ie -217.10.132.192 - 217.10.162.255 gb -217.10.163.0 - 217.10.163.191 a2 -217.10.163.192 - 217.10.163.223 bd -217.10.163.224 - 217.10.163.255 ng -217.10.164.0 - 217.10.164.15 gb -217.10.164.16 - 217.10.164.31 iq -217.10.164.32 - 217.10.165.255 a2 -217.10.166.0 - 217.10.166.31 ng -217.10.166.32 - 217.10.166.47 gb -217.10.166.48 - 217.10.166.79 ng -217.10.166.80 - 217.10.166.103 gb -217.10.166.104 - 217.10.166.111 a2 -217.10.166.112 - 217.10.166.127 gb -217.10.166.128 - 217.10.166.151 ng -217.10.166.152 - 217.10.166.255 a2 -217.10.167.0 - 217.10.167.255 af -217.10.168.0 - 217.10.168.71 a2 -217.10.168.72 - 217.10.168.79 gb -217.10.168.80 - 217.10.168.87 a2 -217.10.168.88 - 217.10.168.95 gb -217.10.168.96 - 217.10.168.99 a2 -217.10.168.100 - 217.10.168.127 gb -217.10.168.128 - 217.10.168.255 a2 -217.10.169.0 - 217.10.169.255 gb -217.10.170.0 - 217.10.171.255 ng -217.10.172.0 - 217.10.172.255 ao -217.10.173.0 - 217.10.173.63 a2 -217.10.173.64 - 217.10.173.79 gb -217.10.173.80 - 217.10.173.255 a2 -217.10.174.0 - 217.10.174.255 lb -217.10.175.0 - 217.10.175.159 a2 -217.10.175.160 - 217.10.175.175 ng -217.10.175.176 - 217.10.181.255 a2 -217.10.182.0 - 217.10.182.7 ng -217.10.182.8 - 217.10.182.31 a2 -217.10.182.32 - 217.10.182.55 gb -217.10.182.56 - 217.10.182.63 a2 -217.10.182.64 - 217.10.182.103 gb -217.10.182.104 - 217.10.183.255 a2 -217.10.184.0 - 217.10.187.255 gb -217.10.188.0 - 217.10.188.255 iq -217.10.189.0 - 217.10.189.23 gb -217.10.189.24 - 217.10.189.255 a2 -217.10.190.0 - 217.10.191.255 gb +217.10.128.0 - 217.10.159.255 gb +217.10.160.0 - 217.10.176.247 a2 +217.10.176.248 - 217.10.176.255 cm +217.10.177.0 - 217.10.182.159 a2 +217.10.182.160 - 217.10.182.191 sl +217.10.182.192 - 217.10.191.255 a2 217.10.192.0 - 217.10.223.255 ro 217.10.224.0 - 217.10.239.255 gb 217.10.240.0 - 217.10.255.255 bg 217.11.0.0 - 217.11.15.255 it -217.11.16.0 - 217.11.28.55 ir -217.11.28.56 - 217.11.28.63 se -217.11.28.64 - 217.11.31.255 ir +217.11.16.0 - 217.11.31.255 ir 217.11.32.0 - 217.11.47.255 ch -217.11.48.0 - 217.11.58.191 de -217.11.58.192 - 217.11.58.207 at -217.11.58.208 - 217.11.63.255 de +217.11.48.0 - 217.11.63.255 de 217.11.64.0 - 217.11.79.255 kz 217.11.80.0 - 217.11.95.255 it 217.11.96.0 - 217.11.127.255 es -217.11.128.0 - 217.11.159.255 pl +217.11.128.0 - 217.11.143.255 pl +217.11.144.0 - 217.11.159.255 de 217.11.160.0 - 217.11.175.255 ge 217.11.176.0 - 217.11.191.255 tj 217.11.192.0 - 217.11.207.255 de @@ -154182,9 +114563,10 @@ 217.12.144.0 - 217.12.159.255 gb 217.12.160.0 - 217.12.191.255 it 217.12.192.0 - 217.12.199.255 ua -217.12.200.0 - 217.12.201.255 ru -217.12.202.0 - 217.12.207.255 ua -217.12.208.0 - 217.12.209.255 ru +217.12.200.0 - 217.12.201.255 nl +217.12.202.0 - 217.12.203.255 bg +217.12.204.0 - 217.12.207.255 ua +217.12.208.0 - 217.12.209.255 nl 217.12.210.0 - 217.12.223.255 ua 217.12.224.0 - 217.12.239.255 sa 217.12.240.0 - 217.12.255.255 ru @@ -154198,16 +114580,9 @@ 217.13.128.0 - 217.13.159.255 gb 217.13.160.0 - 217.13.175.255 de 217.13.176.0 - 217.13.191.255 at -217.13.192.0 - 217.13.200.63 de -217.13.200.64 - 217.13.200.95 nl -217.13.200.96 - 217.13.207.127 de -217.13.207.128 - 217.13.207.255 nl +217.13.192.0 - 217.13.207.255 de 217.13.208.0 - 217.13.223.255 ru -217.13.224.0 - 217.13.232.111 se -217.13.232.112 - 217.13.232.119 fi -217.13.232.120 - 217.13.238.199 se -217.13.238.200 - 217.13.238.207 dk -217.13.238.208 - 217.13.255.255 se +217.13.224.0 - 217.13.255.255 se 217.14.0.0 - 217.14.15.255 no 217.14.16.0 - 217.14.31.255 ru 217.14.32.0 - 217.14.47.255 es @@ -154216,9 +114591,7 @@ 217.14.80.0 - 217.14.95.255 ng 217.14.96.0 - 217.14.111.255 az 217.14.112.0 - 217.14.127.255 de -217.14.128.0 - 217.14.134.15 gb -217.14.134.16 - 217.14.134.31 fr -217.14.134.32 - 217.14.143.255 gb +217.14.128.0 - 217.14.143.255 gb 217.14.144.0 - 217.14.175.255 de 217.14.176.0 - 217.14.191.255 gb 217.14.192.0 - 217.14.207.255 ru @@ -154232,14 +114605,11 @@ 217.15.64.0 - 217.15.79.255 gb 217.15.80.0 - 217.15.95.255 fr 217.15.96.0 - 217.15.111.255 mt -217.15.112.0 - 217.15.115.255 gb -217.15.116.0 - 217.15.123.255 zw -217.15.124.0 - 217.15.124.127 so -217.15.124.128 - 217.15.124.135 ng -217.15.124.136 - 217.15.124.255 gb +217.15.112.0 - 217.15.117.255 gb +217.15.118.0 - 217.15.122.127 zw +217.15.122.128 - 217.15.124.255 gb 217.15.125.0 - 217.15.125.255 ls -217.15.126.0 - 217.15.126.255 zw -217.15.127.0 - 217.15.127.255 gb +217.15.126.0 - 217.15.127.255 gb 217.15.128.0 - 217.15.159.255 ru 217.15.160.0 - 217.15.175.255 a1 217.15.176.0 - 217.15.191.255 kz @@ -154265,31 +114635,13 @@ 217.17.0.0 - 217.17.15.255 no 217.17.16.0 - 217.17.31.255 de 217.17.32.0 - 217.17.47.255 pl -217.17.48.0 - 217.17.55.15 gb -217.17.55.16 - 217.17.55.255 bg -217.17.56.0 - 217.17.56.255 gb -217.17.57.0 - 217.17.63.255 bg +217.17.48.0 - 217.17.63.255 gb 217.17.64.0 - 217.17.79.255 se 217.17.80.0 - 217.17.95.255 lt 217.17.96.0 - 217.17.111.255 rs 217.17.112.0 - 217.17.127.255 ru 217.17.128.0 - 217.17.143.255 nl -217.17.144.0 - 217.17.147.255 tr -217.17.148.0 - 217.17.151.255 nl -217.17.152.0 - 217.17.154.255 tr -217.17.155.0 - 217.17.155.255 nl -217.17.156.0 - 217.17.157.139 tr -217.17.157.140 - 217.17.157.255 cy -217.17.158.0 - 217.17.158.7 nl -217.17.158.8 - 217.17.158.15 us -217.17.158.16 - 217.17.158.31 nl -217.17.158.32 - 217.17.158.47 us -217.17.158.48 - 217.17.158.127 tr -217.17.158.128 - 217.17.158.191 us -217.17.158.192 - 217.17.158.199 tr -217.17.158.200 - 217.17.158.210 us -217.17.158.211 - 217.17.158.255 tr -217.17.159.0 - 217.17.159.255 cy +217.17.144.0 - 217.17.159.255 tr 217.17.160.0 - 217.17.191.255 ru 217.17.192.0 - 217.17.207.255 de 217.17.208.0 - 217.17.223.255 no @@ -154297,27 +114649,12 @@ 217.18.0.0 - 217.18.15.255 it 217.18.16.0 - 217.18.31.255 gb 217.18.32.0 - 217.18.47.255 es -217.18.48.0 - 217.18.63.255 it 217.18.64.0 - 217.18.79.255 nl 217.18.80.0 - 217.18.95.255 gb 217.18.96.0 - 217.18.127.255 it 217.18.128.0 - 217.18.159.255 ru 217.18.160.0 - 217.18.175.255 es -217.18.176.0 - 217.18.178.255 de -217.18.179.0 - 217.18.179.15 us -217.18.179.16 - 217.18.179.47 de -217.18.179.48 - 217.18.179.51 ch -217.18.179.52 - 217.18.179.55 de -217.18.179.56 - 217.18.179.63 ch -217.18.179.64 - 217.18.179.79 de -217.18.179.80 - 217.18.179.95 us -217.18.179.96 - 217.18.179.103 de -217.18.179.104 - 217.18.179.111 ch -217.18.179.112 - 217.18.179.223 de -217.18.179.224 - 217.18.179.239 ch -217.18.179.240 - 217.18.184.103 de -217.18.184.104 - 217.18.184.111 ch -217.18.184.112 - 217.18.191.255 de +217.18.176.0 - 217.18.191.255 de 217.18.192.0 - 217.18.207.255 no 217.18.208.0 - 217.18.223.255 it 217.18.224.0 - 217.18.239.255 es @@ -154329,23 +114666,19 @@ 217.19.64.0 - 217.19.95.255 gr 217.19.96.0 - 217.19.127.255 ru 217.19.128.0 - 217.19.143.255 gb -217.19.144.0 - 217.19.159.255 it -217.19.160.0 - 217.19.181.103 de -217.19.181.104 - 217.19.181.111 us -217.19.181.112 - 217.19.191.255 de +217.19.144.0 - 217.19.158.255 it +217.19.159.0 - 217.19.159.255 eu +217.19.160.0 - 217.19.191.255 de 217.19.192.0 - 217.19.207.255 fr -217.19.208.0 - 217.19.217.255 md -217.19.218.0 - 217.19.220.255 gb +217.19.208.0 - 217.19.218.255 md +217.19.219.0 - 217.19.220.255 gb 217.19.221.0 - 217.19.221.255 md -217.19.222.0 - 217.19.223.255 gb +217.19.222.0 - 217.19.222.255 gb +217.19.223.0 - 217.19.223.255 md 217.19.224.0 - 217.19.231.255 be -217.19.232.0 - 217.19.232.71 nl -217.19.232.72 - 217.19.232.79 be -217.19.232.80 - 217.19.232.255 nl +217.19.232.0 - 217.19.232.255 nl 217.19.233.0 - 217.19.236.255 be -217.19.237.0 - 217.19.237.15 nl -217.19.237.16 - 217.19.237.63 be -217.19.237.64 - 217.19.237.71 us +217.19.237.0 - 217.19.237.71 nl 217.19.237.72 - 217.19.239.255 be 217.19.240.0 - 217.19.255.255 gb 217.20.0.0 - 217.20.15.255 it @@ -154360,105 +114693,30 @@ 217.20.192.0 - 217.20.207.255 ch 217.20.208.0 - 217.20.223.255 sy 217.20.224.0 - 217.20.239.255 eg -217.20.240.0 - 217.20.240.255 a2 -217.20.241.0 - 217.20.241.255 ng -217.20.242.0 - 217.20.242.0 a2 -217.20.242.1 - 217.20.242.255 ng -217.20.243.0 - 217.20.243.0 a2 +217.20.240.0 - 217.20.243.0 a2 217.20.243.1 - 217.20.243.63 so -217.20.243.64 - 217.20.243.128 a2 -217.20.243.129 - 217.20.243.255 ng -217.20.244.0 - 217.20.244.0 a2 -217.20.244.1 - 217.20.244.255 ng -217.20.245.0 - 217.20.245.0 a2 -217.20.245.1 - 217.20.245.255 gb -217.20.246.0 - 217.20.249.255 ng -217.20.250.0 - 217.20.250.255 gn -217.20.251.0 - 217.20.252.255 ng -217.20.253.0 - 217.20.253.255 gb -217.20.254.0 - 217.20.254.0 a2 -217.20.254.1 - 217.20.254.127 sl -217.20.254.128 - 217.20.254.255 a2 -217.20.255.0 - 217.20.255.255 gb +217.20.243.64 - 217.20.255.255 a2 217.21.0.0 - 217.21.15.255 ps 217.21.16.0 - 217.21.31.255 hu 217.21.32.0 - 217.21.63.255 by -217.21.64.0 - 217.21.83.63 a2 -217.21.83.64 - 217.21.83.255 tz -217.21.84.0 - 217.21.95.255 a2 +217.21.64.0 - 217.21.95.255 a2 217.21.96.0 - 217.21.111.255 ru 217.21.112.0 - 217.21.127.255 ke -217.21.128.0 - 217.21.143.255 se +217.21.128.0 - 217.21.143.255 it 217.21.144.0 - 217.21.159.255 al 217.21.160.0 - 217.21.175.255 lv -217.21.176.0 - 217.21.183.23 be -217.21.183.24 - 217.21.183.31 nl -217.21.183.32 - 217.21.191.247 be -217.21.191.248 - 217.21.191.254 us -217.21.191.255 - 217.21.207.255 nl +217.21.176.0 - 217.21.179.255 nl +217.21.180.0 - 217.21.180.255 be +217.21.181.0 - 217.21.207.255 nl 217.21.208.0 - 217.21.223.255 ru 217.21.224.0 - 217.21.239.255 se 217.21.240.0 - 217.21.255.255 nl 217.22.0.0 - 217.22.15.255 gb 217.22.16.0 - 217.22.47.255 no -217.22.48.0 - 217.22.49.255 be -217.22.50.0 - 217.22.52.15 nl -217.22.52.16 - 217.22.52.47 be -217.22.52.48 - 217.22.52.127 nl -217.22.52.128 - 217.22.53.254 be -217.22.53.255 - 217.22.55.47 nl -217.22.55.48 - 217.22.55.95 be -217.22.55.96 - 217.22.55.143 nl -217.22.55.144 - 217.22.55.159 be -217.22.55.160 - 217.22.55.175 nl -217.22.55.176 - 217.22.55.191 be -217.22.55.192 - 217.22.55.207 nl -217.22.55.208 - 217.22.55.239 be -217.22.55.240 - 217.22.55.255 nl -217.22.56.0 - 217.22.56.31 be -217.22.56.32 - 217.22.56.47 nl -217.22.56.48 - 217.22.56.63 be -217.22.56.64 - 217.22.56.143 nl -217.22.56.144 - 217.22.56.159 be -217.22.56.160 - 217.22.56.207 nl -217.22.56.208 - 217.22.56.239 be -217.22.56.240 - 217.22.57.95 nl -217.22.57.96 - 217.22.57.127 be -217.22.57.128 - 217.22.57.159 nl -217.22.57.160 - 217.22.57.191 be -217.22.57.192 - 217.22.58.15 nl -217.22.58.16 - 217.22.58.31 be -217.22.58.32 - 217.22.58.47 nl -217.22.58.48 - 217.22.58.63 be -217.22.58.64 - 217.22.58.79 nl -217.22.58.80 - 217.22.58.95 be -217.22.58.96 - 217.22.58.111 nl -217.22.58.112 - 217.22.58.143 be -217.22.58.144 - 217.22.58.159 nl -217.22.58.160 - 217.22.58.175 be -217.22.58.176 - 217.22.58.207 nl -217.22.58.208 - 217.22.58.239 be -217.22.58.240 - 217.22.58.255 nl -217.22.59.0 - 217.22.59.63 be -217.22.59.64 - 217.22.59.255 nl -217.22.60.0 - 217.22.60.191 be -217.22.60.192 - 217.22.60.255 nl -217.22.61.0 - 217.22.61.31 be -217.22.61.32 - 217.22.62.255 nl -217.22.63.0 - 217.22.63.31 be -217.22.63.32 - 217.22.63.63 nl -217.22.63.64 - 217.22.63.127 be -217.22.63.128 - 217.22.66.31 nl -217.22.66.32 - 217.22.66.255 no -217.22.67.0 - 217.22.67.15 nl -217.22.67.16 - 217.22.68.23 no -217.22.68.24 - 217.22.68.31 nl -217.22.68.32 - 217.22.71.255 no +217.22.48.0 - 217.22.63.255 be +217.22.64.0 - 217.22.71.255 no 217.22.72.0 - 217.22.75.255 nl -217.22.76.0 - 217.22.76.255 no -217.22.77.0 - 217.22.77.255 nl -217.22.78.0 - 217.22.78.255 no -217.22.79.0 - 217.22.79.255 nl +217.22.76.0 - 217.22.79.255 no 217.22.80.0 - 217.22.95.255 gb 217.22.96.0 - 217.22.111.255 es 217.22.112.0 - 217.22.127.255 il @@ -154468,27 +114726,12 @@ 217.22.176.0 - 217.22.191.255 mt 217.22.192.0 - 217.22.207.255 de 217.22.208.0 - 217.22.255.255 it -217.23.0.0 - 217.23.3.78 nl -217.23.3.79 - 217.23.3.80 af -217.23.3.81 - 217.23.15.255 nl +217.23.0.0 - 217.23.15.255 nl 217.23.16.0 - 217.23.31.255 ru 217.23.32.0 - 217.23.47.255 jo 217.23.48.0 - 217.23.63.255 de 217.23.64.0 - 217.23.95.255 ru -217.23.96.0 - 217.23.106.255 dk -217.23.107.0 - 217.23.107.31 no -217.23.107.32 - 217.23.110.63 dk -217.23.110.64 - 217.23.110.95 es -217.23.110.96 - 217.23.110.127 tr -217.23.110.128 - 217.23.110.159 ch -217.23.110.160 - 217.23.110.191 cy -217.23.110.192 - 217.23.110.223 es -217.23.110.224 - 217.23.110.255 us -217.23.111.0 - 217.23.111.31 za -217.23.111.32 - 217.23.111.63 au -217.23.111.64 - 217.23.111.95 th -217.23.111.96 - 217.23.111.127 br -217.23.111.128 - 217.23.111.255 dk +217.23.96.0 - 217.23.111.255 dk 217.23.112.0 - 217.23.127.255 by 217.23.128.0 - 217.23.159.255 ru 217.23.160.0 - 217.23.175.255 gb @@ -154499,28 +114742,23 @@ 217.23.240.0 - 217.23.255.255 sk 217.24.0.0 - 217.24.15.255 de 217.24.16.0 - 217.24.31.255 rs -217.24.32.0 - 217.24.47.255 ch +217.24.32.0 - 217.24.33.79 ch +217.24.33.80 - 217.24.33.80 de +217.24.33.81 - 217.24.47.255 ch 217.24.48.0 - 217.24.63.255 de 217.24.64.0 - 217.24.79.255 lv 217.24.80.0 - 217.24.95.255 fr 217.24.96.0 - 217.24.111.255 fi 217.24.112.0 - 217.24.127.255 ru 217.24.128.0 - 217.24.143.255 ba -217.24.144.0 - 217.24.144.255 ae -217.24.145.0 - 217.24.159.255 ir +217.24.144.0 - 217.24.159.255 ae 217.24.160.0 - 217.24.175.255 ua 217.24.176.0 - 217.24.191.255 ru 217.24.192.0 - 217.24.239.255 de 217.24.240.0 - 217.24.255.255 al 217.25.0.0 - 217.25.15.255 gb 217.25.16.0 - 217.25.31.255 az -217.25.32.0 - 217.25.33.39 se -217.25.33.40 - 217.25.33.44 gb -217.25.33.45 - 217.25.33.255 se -217.25.34.0 - 217.25.34.31 gb -217.25.34.32 - 217.25.38.31 se -217.25.38.32 - 217.25.38.36 gb -217.25.38.37 - 217.25.47.255 se +217.25.32.0 - 217.25.47.255 se 217.25.48.0 - 217.25.63.255 ir 217.25.64.0 - 217.25.79.255 de 217.25.80.0 - 217.25.95.255 ru @@ -154538,44 +114776,21 @@ 217.26.64.0 - 217.26.79.255 rs 217.26.80.0 - 217.26.95.255 it 217.26.96.0 - 217.26.127.255 nl -217.26.128.0 - 217.26.143.255 am +217.26.128.0 - 217.26.135.255 at +217.26.136.0 - 217.26.143.255 fr 217.26.144.0 - 217.26.175.255 md -217.26.176.0 - 217.26.191.255 ru -217.26.192.0 - 217.26.207.255 fr -217.26.208.0 - 217.26.213.255 rs -217.26.214.0 - 217.26.214.255 gb -217.26.215.0 - 217.26.215.127 rs -217.26.215.128 - 217.26.218.11 gb -217.26.218.12 - 217.26.218.19 mt -217.26.218.20 - 217.26.218.35 gb -217.26.218.36 - 217.26.218.39 mt -217.26.218.40 - 217.26.223.255 gb +217.26.192.0 - 217.26.199.255 fr +217.26.200.0 - 217.26.201.255 ae +217.26.202.0 - 217.26.207.255 fr +217.26.208.0 - 217.26.215.255 rs +217.26.216.0 - 217.26.223.255 gb 217.26.224.0 - 217.26.231.255 de 217.26.232.0 - 217.26.239.255 gb -217.26.240.0 - 217.26.247.51 a2 -217.26.247.52 - 217.26.247.59 ng -217.26.247.60 - 217.26.251.87 a2 -217.26.251.88 - 217.26.251.103 ng -217.26.251.104 - 217.26.251.135 a2 -217.26.251.136 - 217.26.251.151 ng -217.26.251.152 - 217.26.254.255 a2 -217.26.255.0 - 217.26.255.95 iq -217.26.255.96 - 217.26.255.255 a2 -217.27.0.0 - 217.27.15.255 de +217.26.240.0 - 217.27.15.255 de 217.27.16.0 - 217.27.31.255 gb 217.27.32.0 - 217.27.39.255 cy 217.27.40.0 - 217.27.43.255 ru -217.27.44.0 - 217.27.45.255 cy -217.27.46.0 - 217.27.47.255 gb -217.27.48.0 - 217.27.54.255 cy -217.27.55.0 - 217.27.55.35 ru -217.27.55.36 - 217.27.55.39 cy -217.27.55.40 - 217.27.55.47 ru -217.27.55.48 - 217.27.55.59 cy -217.27.55.60 - 217.27.55.71 ru -217.27.55.72 - 217.27.55.127 cy -217.27.55.128 - 217.27.55.143 ru -217.27.55.144 - 217.27.63.255 cy +217.27.44.0 - 217.27.63.255 cy 217.27.64.0 - 217.27.95.255 it 217.27.96.0 - 217.27.111.255 ch 217.27.112.0 - 217.27.127.255 it @@ -154588,7 +114803,10 @@ 217.27.240.0 - 217.27.255.255 gb 217.28.0.0 - 217.28.15.255 im 217.28.16.0 - 217.28.31.255 gb -217.28.32.0 - 217.28.47.255 se +217.28.32.0 - 217.28.34.131 se +217.28.34.132 - 217.28.34.132 eu +217.28.34.133 - 217.28.39.255 se +217.28.40.0 - 217.28.47.255 lu 217.28.48.0 - 217.28.63.255 lv 217.28.64.0 - 217.28.71.255 fr 217.28.72.0 - 217.28.79.255 ru @@ -154597,174 +114815,21 @@ 217.28.112.0 - 217.28.127.255 it 217.28.128.0 - 217.28.143.255 gb 217.28.144.0 - 217.28.159.255 pl -217.28.160.0 - 217.28.161.255 dk -217.28.162.0 - 217.28.162.255 gb +217.28.160.0 - 217.28.162.255 dk 217.28.163.0 - 217.28.163.255 us 217.28.164.0 - 217.28.175.255 dk -217.28.176.0 - 217.28.191.93 is -217.28.191.94 - 217.28.191.94 gb -217.28.191.95 - 217.28.191.195 is -217.28.191.196 - 217.28.191.199 dk -217.28.191.200 - 217.28.191.255 is -217.28.192.0 - 217.28.192.31 se -217.28.192.32 - 217.28.192.47 no -217.28.192.48 - 217.28.192.103 se -217.28.192.104 - 217.28.192.111 no -217.28.192.112 - 217.28.207.255 se +217.28.176.0 - 217.28.191.255 is +217.28.192.0 - 217.28.207.255 se 217.28.208.0 - 217.28.239.255 ru -217.28.240.0 - 217.28.241.63 ua -217.28.241.64 - 217.28.241.79 ee -217.28.241.80 - 217.28.241.87 hu -217.28.241.88 - 217.28.241.89 ee -217.28.241.90 - 217.28.241.95 ua -217.28.241.96 - 217.28.241.111 se -217.28.241.112 - 217.28.241.255 ua -217.28.242.0 - 217.28.242.15 ee -217.28.242.16 - 217.28.242.255 ua -217.28.243.0 - 217.28.243.3 lv -217.28.243.4 - 217.28.243.7 ua -217.28.243.8 - 217.28.243.11 lv -217.28.243.12 - 217.28.243.15 ua -217.28.243.16 - 217.28.243.73 lv -217.28.243.74 - 217.28.243.75 ua -217.28.243.76 - 217.28.243.87 lv -217.28.243.88 - 217.28.243.95 ua -217.28.243.96 - 217.28.243.135 lv -217.28.243.136 - 217.28.243.191 ua -217.28.243.192 - 217.28.243.197 lv -217.28.243.198 - 217.28.243.201 ua -217.28.243.202 - 217.28.243.207 lv -217.28.243.208 - 217.28.243.223 ua -217.28.243.224 - 217.28.243.255 lv -217.28.244.0 - 217.28.244.19 ru -217.28.244.20 - 217.28.244.23 ua -217.28.244.24 - 217.28.244.27 ru -217.28.244.28 - 217.28.244.35 ua -217.28.244.36 - 217.28.244.39 ru -217.28.244.40 - 217.28.244.63 ua -217.28.244.64 - 217.28.244.67 ru -217.28.244.68 - 217.28.244.71 ua -217.28.244.72 - 217.28.244.79 ru -217.28.244.80 - 217.28.244.87 ua -217.28.244.88 - 217.28.244.99 ru -217.28.244.100 - 217.28.244.103 ua -217.28.244.104 - 217.28.244.119 ru -217.28.244.120 - 217.28.244.127 ua -217.28.244.128 - 217.28.244.175 ru -217.28.244.176 - 217.28.244.179 ua -217.28.244.180 - 217.28.244.191 ru -217.28.244.192 - 217.28.244.203 ua -217.28.244.204 - 217.28.244.223 ru -217.28.244.224 - 217.28.244.227 ua -217.28.244.228 - 217.28.244.231 ru -217.28.244.232 - 217.28.244.235 ua -217.28.244.236 - 217.28.244.245 ru -217.28.244.246 - 217.28.244.247 ua -217.28.244.248 - 217.28.244.255 ru -217.28.245.0 - 217.28.245.255 ua -217.28.246.0 - 217.28.246.73 ru -217.28.246.74 - 217.28.246.79 ua -217.28.246.80 - 217.28.246.103 ru -217.28.246.104 - 217.28.246.255 ua -217.28.247.0 - 217.28.247.7 ru -217.28.247.8 - 217.28.247.15 ua -217.28.247.16 - 217.28.247.47 ru -217.28.247.48 - 217.28.247.75 ua -217.28.247.76 - 217.28.247.81 ru -217.28.247.82 - 217.28.247.83 ua -217.28.247.84 - 217.28.247.95 ru -217.28.247.96 - 217.28.247.107 ua -217.28.247.108 - 217.28.247.111 ru -217.28.247.112 - 217.28.247.255 ua -217.28.248.0 - 217.28.248.59 lt -217.28.248.60 - 217.28.248.63 ua -217.28.248.64 - 217.28.248.79 lt -217.28.248.80 - 217.28.248.95 ua -217.28.248.96 - 217.28.248.205 lt -217.28.248.206 - 217.28.248.207 ua -217.28.248.208 - 217.28.248.255 lt -217.28.249.0 - 217.28.249.7 ua -217.28.249.8 - 217.28.249.47 lv -217.28.249.48 - 217.28.249.51 ua -217.28.249.52 - 217.28.249.79 lv -217.28.249.80 - 217.28.249.127 ua -217.28.249.128 - 217.28.249.171 lv -217.28.249.172 - 217.28.249.183 ua -217.28.249.184 - 217.28.249.207 lv -217.28.249.208 - 217.28.249.227 ua -217.28.249.228 - 217.28.249.255 lv -217.28.250.0 - 217.28.250.31 de -217.28.250.32 - 217.28.250.39 nl -217.28.250.40 - 217.28.250.51 de -217.28.250.52 - 217.28.250.79 ua -217.28.250.80 - 217.28.250.83 de -217.28.250.84 - 217.28.250.87 ua -217.28.250.88 - 217.28.250.91 lv -217.28.250.92 - 217.28.250.95 de -217.28.250.96 - 217.28.250.97 cz -217.28.250.98 - 217.28.250.99 fr -217.28.250.100 - 217.28.250.103 be -217.28.250.104 - 217.28.250.107 ua -217.28.250.108 - 217.28.250.109 fr -217.28.250.110 - 217.28.250.111 ua -217.28.250.112 - 217.28.250.135 de -217.28.250.136 - 217.28.250.137 nl -217.28.250.138 - 217.28.250.143 de -217.28.250.144 - 217.28.250.159 nl -217.28.250.160 - 217.28.250.165 de -217.28.250.166 - 217.28.250.167 ua -217.28.250.168 - 217.28.250.171 de -217.28.250.172 - 217.28.250.175 ua -217.28.250.176 - 217.28.250.187 de -217.28.250.188 - 217.28.250.189 nl -217.28.250.190 - 217.28.250.191 de -217.28.250.192 - 217.28.250.207 ge -217.28.250.208 - 217.28.250.223 de -217.28.250.224 - 217.28.250.231 cz -217.28.250.232 - 217.28.250.239 ua -217.28.250.240 - 217.28.250.255 de -217.28.251.0 - 217.28.251.17 lt -217.28.251.18 - 217.28.251.31 ua -217.28.251.32 - 217.28.251.47 lt -217.28.251.48 - 217.28.251.63 ua -217.28.251.64 - 217.28.251.87 lt -217.28.251.88 - 217.28.251.91 lv -217.28.251.92 - 217.28.251.153 lt -217.28.251.154 - 217.28.251.159 ua -217.28.251.160 - 217.28.251.223 lt -217.28.251.224 - 217.28.251.239 ua -217.28.251.240 - 217.28.251.255 lt -217.28.252.0 - 217.28.252.39 pl -217.28.252.40 - 217.28.252.45 ua -217.28.252.46 - 217.28.252.47 pl -217.28.252.48 - 217.28.252.51 ua -217.28.252.52 - 217.28.252.71 pl -217.28.252.72 - 217.28.252.83 ua -217.28.252.84 - 217.28.252.111 pl -217.28.252.112 - 217.28.252.255 ua -217.28.253.0 - 217.28.253.35 se -217.28.253.36 - 217.28.253.37 gb -217.28.253.38 - 217.28.253.43 ua -217.28.253.44 - 217.28.253.47 se -217.28.253.48 - 217.28.253.55 ua -217.28.253.56 - 217.28.253.59 fi -217.28.253.60 - 217.28.253.63 se -217.28.253.64 - 217.28.253.79 ru -217.28.253.80 - 217.28.253.87 se -217.28.253.88 - 217.28.253.95 gb -217.28.253.96 - 217.28.253.111 se -217.28.253.112 - 217.28.253.123 ua -217.28.253.124 - 217.28.253.127 se -217.28.253.128 - 217.28.253.135 ua -217.28.253.136 - 217.28.253.139 gb -217.28.253.140 - 217.28.253.141 ua -217.28.253.142 - 217.28.253.143 se -217.28.253.144 - 217.28.253.147 cz -217.28.253.148 - 217.28.254.255 ua -217.28.255.0 - 217.28.255.255 lv -217.29.0.0 - 217.29.9.255 cz -217.29.10.0 - 217.29.11.255 hr -217.29.12.0 - 217.29.15.255 cz +217.28.240.0 - 217.28.246.80 ua +217.28.246.81 - 217.28.246.81 us +217.28.246.82 - 217.28.246.255 ua +217.28.247.0 - 217.28.247.255 ru +217.28.248.0 - 217.28.248.255 lt +217.28.249.0 - 217.28.249.96 ua +217.28.249.97 - 217.28.249.97 lv +217.28.249.98 - 217.28.255.255 ua +217.29.0.0 - 217.29.15.255 cz 217.29.16.0 - 217.29.31.255 kg 217.29.32.0 - 217.29.47.255 de 217.29.48.0 - 217.29.63.255 ru @@ -154772,18 +114837,18 @@ 217.29.80.0 - 217.29.95.255 ru 217.29.96.0 - 217.29.111.255 es 217.29.112.0 - 217.29.127.255 uz -217.29.128.0 - 217.29.143.255 eg +217.29.128.0 - 217.29.143.255 tz 217.29.144.0 - 217.29.159.255 at 217.29.160.0 - 217.29.175.255 it 217.29.176.0 - 217.29.191.255 ru 217.29.192.0 - 217.29.207.255 gb -217.29.208.0 - 217.29.223.255 dz -217.29.224.0 - 217.29.231.31 fi -217.29.231.32 - 217.29.231.63 ax -217.29.231.64 - 217.29.239.255 fi +217.29.208.0 - 217.29.223.255 za +217.29.224.0 - 217.29.239.255 fi 217.29.240.0 - 217.29.255.255 jo 217.30.0.0 - 217.30.15.255 it -217.30.16.0 - 217.30.31.255 be +217.30.16.0 - 217.30.25.255 be +217.30.26.0 - 217.30.26.255 a2 +217.30.27.0 - 217.30.31.255 be 217.30.32.0 - 217.30.47.255 dk 217.30.48.0 - 217.30.63.255 de 217.30.64.0 - 217.30.79.255 cz @@ -154797,9 +114862,7 @@ 217.30.208.0 - 217.30.223.255 bg 217.30.224.0 - 217.30.239.255 de 217.30.240.0 - 217.30.255.255 ru -217.31.0.0 - 217.31.13.255 gb -217.31.14.0 - 217.31.14.255 lu -217.31.15.0 - 217.31.15.255 gb +217.31.0.0 - 217.31.15.255 gb 217.31.16.0 - 217.31.31.255 de 217.31.32.0 - 217.31.47.255 sk 217.31.48.0 - 217.31.63.255 cz @@ -154812,9 +114875,11 @@ 217.31.192.0 - 217.31.207.255 cz 217.31.208.0 - 217.31.223.255 de 217.31.224.0 - 217.31.255.255 tr -217.32.0.0 - 217.33.47.79 gb -217.33.47.80 - 217.33.47.95 a2 -217.33.47.96 - 217.47.255.255 gb +217.32.0.0 - 217.33.153.255 gb +217.33.154.0 - 217.33.154.63 eu +217.33.154.64 - 217.33.154.95 gb +217.33.154.96 - 217.33.154.255 eu +217.33.155.0 - 217.47.255.255 gb 217.48.0.0 - 217.51.255.255 de 217.52.0.0 - 217.55.255.255 eg 217.56.0.0 - 217.59.255.255 it @@ -154826,49 +114891,33 @@ 217.64.16.0 - 217.64.31.255 az 217.64.32.0 - 217.64.47.255 fi 217.64.48.0 - 217.64.63.255 fr -217.64.64.0 - 217.64.81.255 de -217.64.82.0 - 217.64.82.255 at -217.64.83.0 - 217.64.95.255 de +217.64.64.0 - 217.64.95.255 de 217.64.96.0 - 217.64.111.255 ml 217.64.112.0 - 217.64.127.255 gb 217.64.128.0 - 217.64.143.255 ru 217.64.144.0 - 217.64.159.255 ir 217.64.160.0 - 217.64.175.255 de -217.64.176.0 - 217.64.190.231 fi -217.64.190.232 - 217.64.190.239 ax -217.64.190.240 - 217.64.191.255 fi +217.64.176.0 - 217.64.191.255 fi 217.64.192.0 - 217.64.207.255 it 217.64.208.0 - 217.64.223.255 tr -217.64.224.0 - 217.64.229.183 gb -217.64.229.184 - 217.64.229.191 us -217.64.229.192 - 217.64.233.31 gb -217.64.233.32 - 217.64.233.35 is -217.64.233.36 - 217.64.239.255 gb +217.64.224.0 - 217.64.239.255 gb 217.64.240.0 - 217.64.255.255 be 217.65.0.0 - 217.65.15.255 ru 217.65.16.0 - 217.65.31.255 de -217.65.32.0 - 217.65.32.255 il -217.65.33.0 - 217.65.34.255 gb -217.65.35.0 - 217.65.35.255 il +217.65.32.0 - 217.65.35.255 il 217.65.36.0 - 217.65.36.255 us 217.65.37.0 - 217.65.37.255 il -217.65.38.0 - 217.65.38.255 gb -217.65.39.0 - 217.65.39.255 il -217.65.40.0 - 217.65.44.255 us -217.65.45.0 - 217.65.46.255 il -217.65.47.0 - 217.65.47.255 us +217.65.38.0 - 217.65.38.255 us +217.65.39.0 - 217.65.41.255 il +217.65.42.0 - 217.65.42.255 us +217.65.43.0 - 217.65.47.255 il 217.65.48.0 - 217.65.63.255 gi 217.65.64.0 - 217.65.79.255 it 217.65.80.0 - 217.65.95.255 ru 217.65.96.0 - 217.65.127.255 hu 217.65.128.0 - 217.65.143.255 de 217.65.144.0 - 217.65.175.255 gb -217.65.176.0 - 217.65.178.31 de -217.65.178.32 - 217.65.178.63 tr -217.65.178.64 - 217.65.179.255 de -217.65.180.0 - 217.65.189.255 tr -217.65.190.0 - 217.65.190.31 de -217.65.190.32 - 217.65.191.255 tr +217.65.176.0 - 217.65.191.255 tr 217.65.192.0 - 217.65.207.255 rs 217.65.208.0 - 217.65.223.255 ru 217.65.224.0 - 217.65.239.255 no @@ -154881,10 +114930,7 @@ 217.66.112.0 - 217.66.127.255 fr 217.66.128.0 - 217.66.143.255 de 217.66.144.0 - 217.66.159.255 ru -217.66.160.0 - 217.66.165.255 cz -217.66.166.0 - 217.66.166.255 sk -217.66.167.0 - 217.66.190.255 cz -217.66.191.0 - 217.66.191.255 sk +217.66.160.0 - 217.66.191.255 cz 217.66.192.0 - 217.66.223.255 ir 217.66.224.0 - 217.66.255.255 ps 217.67.0.0 - 217.67.15.255 ru @@ -154901,11 +114947,7 @@ 217.67.176.0 - 217.67.191.255 ru 217.67.192.0 - 217.67.223.255 pl 217.67.224.0 - 217.67.255.255 nl -217.68.0.0 - 217.68.5.135 de -217.68.5.136 - 217.68.5.143 mk -217.68.5.144 - 217.68.6.223 de -217.68.6.224 - 217.68.6.239 il -217.68.6.240 - 217.68.15.255 de +217.68.0.0 - 217.68.15.255 de 217.68.16.0 - 217.68.31.255 gb 217.68.32.0 - 217.68.47.255 se 217.68.48.0 - 217.68.63.255 nl @@ -154913,47 +114955,24 @@ 217.68.80.0 - 217.68.95.255 hr 217.68.96.0 - 217.68.127.255 no 217.68.128.0 - 217.68.143.255 gb -217.68.144.0 - 217.68.145.47 de -217.68.145.48 - 217.68.145.55 gb -217.68.145.56 - 217.68.146.191 de -217.68.146.192 - 217.68.146.255 hk -217.68.147.0 - 217.68.149.95 de -217.68.149.96 - 217.68.149.127 hk -217.68.149.128 - 217.68.149.151 de -217.68.149.152 - 217.68.149.175 us -217.68.149.176 - 217.68.150.255 de -217.68.151.0 - 217.68.151.255 us -217.68.152.0 - 217.68.152.255 de -217.68.153.0 - 217.68.153.127 mt -217.68.153.128 - 217.68.157.255 de -217.68.158.0 - 217.68.158.31 hk -217.68.158.32 - 217.68.191.255 de -217.68.192.0 - 217.68.207.255 at +217.68.144.0 - 217.68.191.255 de +217.68.192.0 - 217.68.199.255 at +217.68.200.0 - 217.68.201.255 gb +217.68.202.0 - 217.68.207.255 at 217.68.208.0 - 217.68.223.255 tr 217.68.224.0 - 217.68.239.255 ch 217.68.240.0 - 217.68.255.255 gb 217.69.0.0 - 217.69.15.255 gr -217.69.16.0 - 217.69.21.95 fr -217.69.21.96 - 217.69.21.127 gb -217.69.21.128 - 217.69.21.207 fr -217.69.21.208 - 217.69.21.223 us -217.69.21.224 - 217.69.22.127 fr -217.69.22.128 - 217.69.22.191 sa -217.69.22.192 - 217.69.22.255 fr -217.69.23.0 - 217.69.23.127 gb -217.69.23.128 - 217.69.23.159 fr -217.69.23.160 - 217.69.23.191 ie -217.69.23.192 - 217.69.24.255 fr -217.69.25.0 - 217.69.25.191 gb -217.69.25.192 - 217.69.31.255 fr +217.69.16.0 - 217.69.30.223 fr +217.69.30.224 - 217.69.30.239 gb +217.69.30.240 - 217.69.31.255 fr 217.69.32.0 - 217.69.47.255 gb 217.69.48.0 - 217.69.63.255 fi 217.69.64.0 - 217.69.95.255 de 217.69.96.0 - 217.69.111.255 cz -217.69.112.0 - 217.69.119.255 lv -217.69.120.0 - 217.69.127.255 lt +217.69.112.0 - 217.69.127.255 lv 217.69.128.0 - 217.69.143.255 ru -217.69.144.0 - 217.69.159.255 nl +217.69.144.0 - 217.69.159.255 se 217.69.160.0 - 217.69.175.255 de 217.69.176.0 - 217.69.191.255 kw 217.69.192.0 - 217.69.223.255 ru @@ -154965,20 +114984,16 @@ 217.70.64.0 - 217.70.79.255 pt 217.70.80.0 - 217.70.95.255 fr 217.70.96.0 - 217.70.127.255 ru -217.70.128.0 - 217.70.136.215 de -217.70.136.216 - 217.70.136.223 pt -217.70.136.224 - 217.70.143.255 de -217.70.144.0 - 217.70.147.255 it -217.70.148.0 - 217.70.148.255 de -217.70.149.0 - 217.70.149.255 it -217.70.150.0 - 217.70.150.127 hu -217.70.150.128 - 217.70.159.255 it +217.70.128.0 - 217.70.143.255 de +217.70.144.0 - 217.70.159.255 it 217.70.160.0 - 217.70.175.255 de -217.70.176.0 - 217.70.191.255 fr -217.70.192.0 - 217.70.201.255 de -217.70.202.0 - 217.70.202.255 nl -217.70.203.0 - 217.70.207.255 de -217.70.208.0 - 217.70.223.255 nl +217.70.176.0 - 217.70.177.191 fr +217.70.177.192 - 217.70.177.255 lu +217.70.178.0 - 217.70.191.255 fr +217.70.192.0 - 217.70.207.255 de +217.70.208.0 - 217.70.210.255 nl +217.70.211.0 - 217.70.211.255 eu +217.70.212.0 - 217.70.223.255 nl 217.70.224.0 - 217.70.239.255 be 217.70.240.0 - 217.70.255.255 es 217.71.0.0 - 217.71.15.255 dk @@ -154987,30 +115002,12 @@ 217.71.48.0 - 217.71.63.255 ba 217.71.64.0 - 217.71.79.255 it 217.71.80.0 - 217.71.95.255 ch -217.71.96.0 - 217.71.98.23 de -217.71.98.24 - 217.71.98.255 eu -217.71.99.0 - 217.71.109.95 de -217.71.109.96 - 217.71.109.103 eu -217.71.109.104 - 217.71.109.159 de -217.71.109.160 - 217.71.109.175 eu -217.71.109.176 - 217.71.109.191 de -217.71.109.192 - 217.71.109.255 eu -217.71.110.0 - 217.71.111.255 de -217.71.112.0 - 217.71.112.31 fr -217.71.112.32 - 217.71.112.63 be -217.71.112.64 - 217.71.118.159 fr -217.71.118.160 - 217.71.118.223 be -217.71.118.224 - 217.71.118.255 fr -217.71.119.0 - 217.71.119.255 nl -217.71.120.0 - 217.71.120.255 fr -217.71.121.0 - 217.71.121.63 be -217.71.121.64 - 217.71.122.255 fr -217.71.123.0 - 217.71.123.31 nl -217.71.123.32 - 217.71.123.127 fr -217.71.123.128 - 217.71.124.255 be -217.71.125.0 - 217.71.125.255 fr -217.71.126.0 - 217.71.126.255 be -217.71.127.0 - 217.71.127.255 fr +217.71.96.0 - 217.71.98.255 eu +217.71.99.0 - 217.71.101.255 de +217.71.102.0 - 217.71.104.135 eu +217.71.104.136 - 217.71.104.139 de +217.71.104.140 - 217.71.111.255 eu +217.71.112.0 - 217.71.127.255 fr 217.71.128.0 - 217.71.143.255 ru 217.71.144.0 - 217.71.159.255 fi 217.71.160.0 - 217.71.175.255 ru @@ -155027,9 +115024,7 @@ 217.72.64.0 - 217.72.95.255 si 217.72.96.0 - 217.72.111.255 it 217.72.112.0 - 217.72.127.255 gb -217.72.128.0 - 217.72.131.255 de -217.72.132.0 - 217.72.132.63 ch -217.72.132.64 - 217.72.143.255 de +217.72.128.0 - 217.72.143.255 de 217.72.144.0 - 217.72.159.255 ru 217.72.160.0 - 217.72.191.255 gb 217.72.192.0 - 217.72.223.255 de @@ -155038,9 +115033,7 @@ 217.73.0.0 - 217.73.15.255 se 217.73.16.0 - 217.73.31.255 sk 217.73.32.0 - 217.73.55.255 de -217.73.56.0 - 217.73.59.255 ru -217.73.60.0 - 217.73.60.127 de -217.73.60.128 - 217.73.63.255 ru +217.73.56.0 - 217.73.63.255 ru 217.73.64.0 - 217.73.79.255 gb 217.73.80.0 - 217.73.95.255 ua 217.73.96.0 - 217.73.111.255 se @@ -155052,15 +115045,8 @@ 217.73.192.0 - 217.73.207.255 ru 217.73.208.0 - 217.73.239.255 it 217.73.240.0 - 217.73.255.255 pl -217.74.0.0 - 217.74.3.255 de -217.74.4.0 - 217.74.4.255 at -217.74.5.0 - 217.74.7.255 de -217.74.8.0 - 217.74.8.3 at -217.74.8.4 - 217.74.8.7 de -217.74.8.8 - 217.74.8.11 at -217.74.8.12 - 217.74.8.15 de -217.74.8.16 - 217.74.8.23 at -217.74.8.24 - 217.74.15.255 de +217.74.0.0 - 217.74.7.255 de +217.74.8.0 - 217.74.15.255 at 217.74.16.0 - 217.74.23.255 nl 217.74.24.0 - 217.74.31.255 tr 217.74.32.0 - 217.74.47.255 ru @@ -155068,44 +115054,22 @@ 217.74.64.0 - 217.74.79.255 pl 217.74.80.0 - 217.74.95.255 se 217.74.96.0 - 217.74.111.255 fr -217.74.112.0 - 217.74.175.255 ru +217.74.112.0 - 217.74.127.255 ru +217.74.128.0 - 217.74.159.255 dk +217.74.160.0 - 217.74.175.255 ru 217.74.176.0 - 217.74.207.255 de 217.74.208.0 - 217.74.223.255 dk -217.74.224.0 - 217.74.224.255 zw +217.74.224.0 - 217.74.224.255 gb 217.74.225.0 - 217.74.230.255 ls -217.74.231.0 - 217.74.231.255 zw -217.74.232.0 - 217.74.232.127 so -217.74.232.128 - 217.74.232.255 gb -217.74.233.0 - 217.74.233.255 zw -217.74.234.0 - 217.74.234.255 gb -217.74.235.0 - 217.74.239.255 zw +217.74.231.0 - 217.74.235.255 gb +217.74.236.0 - 217.74.239.255 zw 217.74.240.0 - 217.74.255.255 ru 217.75.0.0 - 217.75.15.255 ie 217.75.16.0 - 217.75.31.255 ch 217.75.32.0 - 217.75.47.255 nl 217.75.48.0 - 217.75.63.255 pl -217.75.64.0 - 217.75.92.87 sk -217.75.92.88 - 217.75.92.95 sr -217.75.92.96 - 217.75.92.119 sk -217.75.92.120 - 217.75.92.127 sr -217.75.92.128 - 217.75.92.175 sk -217.75.92.176 - 217.75.92.191 sr -217.75.92.192 - 217.75.92.239 sk -217.75.92.240 - 217.75.92.247 sr -217.75.92.248 - 217.75.95.255 sk -217.75.96.0 - 217.75.104.55 se -217.75.104.56 - 217.75.104.63 gb -217.75.104.64 - 217.75.118.191 se -217.75.118.192 - 217.75.118.207 no -217.75.118.208 - 217.75.118.223 se -217.75.118.224 - 217.75.118.227 gb -217.75.118.228 - 217.75.119.223 se -217.75.119.224 - 217.75.119.239 fr -217.75.119.240 - 217.75.119.243 gb -217.75.119.244 - 217.75.119.247 us -217.75.119.248 - 217.75.120.7 se -217.75.120.8 - 217.75.120.11 gb -217.75.120.12 - 217.75.127.255 se +217.75.64.0 - 217.75.95.255 sk +217.75.96.0 - 217.75.127.255 se 217.75.128.0 - 217.75.159.255 bg 217.75.160.0 - 217.75.175.255 gb 217.75.176.0 - 217.75.191.255 at @@ -155120,21 +115084,37 @@ 217.76.80.0 - 217.76.95.255 se 217.76.96.0 - 217.76.111.255 de 217.76.112.0 - 217.76.127.255 pl -217.76.128.0 - 217.76.128.255 es -217.76.129.0 - 217.76.129.223 fr -217.76.129.224 - 217.76.131.255 es -217.76.132.0 - 217.76.132.127 fr +217.76.128.0 - 217.76.128.223 es +217.76.128.224 - 217.76.129.255 pt +217.76.130.0 - 217.76.131.255 es +217.76.132.0 - 217.76.132.27 pt +217.76.132.28 - 217.76.132.29 es +217.76.132.30 - 217.76.132.30 pt +217.76.132.31 - 217.76.132.33 es +217.76.132.34 - 217.76.132.36 pt +217.76.132.37 - 217.76.132.41 es +217.76.132.42 - 217.76.132.56 pt +217.76.132.57 - 217.76.132.60 es +217.76.132.61 - 217.76.132.67 pt +217.76.132.68 - 217.76.132.83 es +217.76.132.84 - 217.76.132.108 pt +217.76.132.109 - 217.76.132.109 es +217.76.132.110 - 217.76.132.127 pt 217.76.132.128 - 217.76.132.255 es -217.76.133.0 - 217.76.133.255 fr +217.76.133.0 - 217.76.133.255 pt 217.76.134.0 - 217.76.143.255 es -217.76.144.0 - 217.76.144.63 fr -217.76.144.64 - 217.76.150.255 es -217.76.151.0 - 217.76.151.255 pt +217.76.144.0 - 217.76.144.63 pt +217.76.144.64 - 217.76.146.255 es +217.76.147.0 - 217.76.147.31 pt +217.76.147.32 - 217.76.149.255 es +217.76.150.0 - 217.76.151.255 pt 217.76.152.0 - 217.76.152.239 es -217.76.152.240 - 217.76.152.255 fr +217.76.152.240 - 217.76.152.255 pt 217.76.153.0 - 217.76.153.239 es -217.76.153.240 - 217.76.153.255 fr -217.76.154.0 - 217.76.159.255 es +217.76.153.240 - 217.76.153.255 pt +217.76.154.0 - 217.76.155.255 es +217.76.156.0 - 217.76.156.255 pt +217.76.157.0 - 217.76.159.255 es 217.76.160.0 - 217.76.175.255 at 217.76.176.0 - 217.76.191.255 ru 217.76.192.0 - 217.76.207.255 ua @@ -155154,885 +115134,19 @@ 217.77.192.0 - 217.77.207.255 fi 217.77.208.0 - 217.77.223.255 ua 217.77.224.0 - 217.77.239.255 fr -217.77.240.0 - 217.77.240.1 de -217.77.240.2 - 217.77.240.3 it -217.77.240.4 - 217.77.240.4 de -217.77.240.5 - 217.77.240.5 ie -217.77.240.6 - 217.77.240.6 es -217.77.240.7 - 217.77.240.7 be -217.77.240.8 - 217.77.240.9 de -217.77.240.10 - 217.77.240.10 ch -217.77.240.11 - 217.77.240.11 it -217.77.240.12 - 217.77.240.13 de -217.77.240.14 - 217.77.240.14 nl -217.77.240.15 - 217.77.240.16 de -217.77.240.17 - 217.77.240.17 gr -217.77.240.18 - 217.77.240.19 fr -217.77.240.20 - 217.77.240.25 de -217.77.240.26 - 217.77.240.26 pl -217.77.240.27 - 217.77.240.28 de -217.77.240.29 - 217.77.240.29 hu -217.77.240.30 - 217.77.240.30 ch -217.77.240.31 - 217.77.240.31 es -217.77.240.32 - 217.77.240.32 fr -217.77.240.33 - 217.77.240.33 de -217.77.240.34 - 217.77.240.34 es -217.77.240.35 - 217.77.240.35 de -217.77.240.36 - 217.77.240.36 fr -217.77.240.37 - 217.77.240.37 ch -217.77.240.38 - 217.77.240.38 gb -217.77.240.39 - 217.77.240.39 fr -217.77.240.40 - 217.77.240.40 de -217.77.240.41 - 217.77.240.41 fr -217.77.240.42 - 217.77.240.42 nl -217.77.240.43 - 217.77.240.43 at -217.77.240.44 - 217.77.240.45 de -217.77.240.46 - 217.77.240.47 nl -217.77.240.48 - 217.77.240.49 gb -217.77.240.50 - 217.77.240.50 nl -217.77.240.51 - 217.77.240.51 de -217.77.240.52 - 217.77.240.52 at -217.77.240.53 - 217.77.240.53 fr -217.77.240.54 - 217.77.240.54 nl -217.77.240.55 - 217.77.240.55 de -217.77.240.56 - 217.77.240.56 hu -217.77.240.57 - 217.77.240.57 it -217.77.240.58 - 217.77.240.58 gb -217.77.240.59 - 217.77.240.61 de -217.77.240.62 - 217.77.240.63 es -217.77.240.64 - 217.77.240.64 de -217.77.240.65 - 217.77.240.65 il -217.77.240.66 - 217.77.240.66 de -217.77.240.67 - 217.77.240.67 nl -217.77.240.68 - 217.77.240.69 de -217.77.240.70 - 217.77.240.70 es -217.77.240.71 - 217.77.240.76 de -217.77.240.77 - 217.77.240.78 fr -217.77.240.79 - 217.77.240.79 hu -217.77.240.80 - 217.77.240.81 de -217.77.240.82 - 217.77.240.82 nl -217.77.240.83 - 217.77.240.86 de -217.77.240.87 - 217.77.240.87 fr -217.77.240.88 - 217.77.240.88 de -217.77.240.89 - 217.77.240.89 be -217.77.240.90 - 217.77.240.90 de -217.77.240.91 - 217.77.240.91 nl -217.77.240.92 - 217.77.240.92 de -217.77.240.93 - 217.77.240.94 hu -217.77.240.95 - 217.77.240.95 it -217.77.240.96 - 217.77.240.96 de -217.77.240.97 - 217.77.240.97 ch -217.77.240.98 - 217.77.240.98 de -217.77.240.99 - 217.77.240.99 no -217.77.240.100 - 217.77.240.100 ch -217.77.240.101 - 217.77.240.101 nl -217.77.240.102 - 217.77.240.102 de -217.77.240.103 - 217.77.240.103 es -217.77.240.104 - 217.77.240.106 nl -217.77.240.107 - 217.77.240.107 ch -217.77.240.108 - 217.77.240.108 de -217.77.240.109 - 217.77.240.109 nl -217.77.240.110 - 217.77.240.112 de -217.77.240.113 - 217.77.240.113 nl -217.77.240.114 - 217.77.240.114 de -217.77.240.115 - 217.77.240.115 be -217.77.240.116 - 217.77.240.116 nl -217.77.240.117 - 217.77.240.117 de -217.77.240.118 - 217.77.240.118 it -217.77.240.119 - 217.77.240.119 ch -217.77.240.120 - 217.77.240.121 de -217.77.240.122 - 217.77.240.122 gb -217.77.240.123 - 217.77.240.123 nl -217.77.240.124 - 217.77.240.124 gr -217.77.240.125 - 217.77.240.125 nl -217.77.240.126 - 217.77.240.126 gb -217.77.240.127 - 217.77.240.129 nl -217.77.240.130 - 217.77.240.130 de -217.77.240.131 - 217.77.240.131 nl -217.77.240.132 - 217.77.240.132 de -217.77.240.133 - 217.77.240.133 nl -217.77.240.134 - 217.77.240.135 de -217.77.240.136 - 217.77.240.136 it -217.77.240.137 - 217.77.240.137 de -217.77.240.138 - 217.77.240.138 gr -217.77.240.139 - 217.77.240.139 nl -217.77.240.140 - 217.77.240.142 it -217.77.240.143 - 217.77.240.143 nl -217.77.240.144 - 217.77.240.144 gr -217.77.240.145 - 217.77.240.146 it -217.77.240.147 - 217.77.240.148 de -217.77.240.149 - 217.77.240.149 fr -217.77.240.150 - 217.77.240.150 de -217.77.240.151 - 217.77.240.151 gb -217.77.240.152 - 217.77.240.152 fr -217.77.240.153 - 217.77.240.153 de -217.77.240.154 - 217.77.240.154 ch -217.77.240.155 - 217.77.240.157 es -217.77.240.158 - 217.77.240.158 de -217.77.240.159 - 217.77.240.159 it -217.77.240.160 - 217.77.240.160 de -217.77.240.161 - 217.77.240.161 fr -217.77.240.162 - 217.77.240.162 de -217.77.240.163 - 217.77.240.168 nl -217.77.240.169 - 217.77.240.169 es -217.77.240.170 - 217.77.240.171 nl -217.77.240.172 - 217.77.240.172 de -217.77.240.173 - 217.77.240.173 be -217.77.240.174 - 217.77.240.174 fr -217.77.240.175 - 217.77.240.176 nl -217.77.240.177 - 217.77.240.177 se -217.77.240.178 - 217.77.240.178 es -217.77.240.179 - 217.77.240.180 nl -217.77.240.181 - 217.77.240.181 de -217.77.240.182 - 217.77.240.182 il -217.77.240.183 - 217.77.240.184 nl -217.77.240.185 - 217.77.240.185 fr -217.77.240.186 - 217.77.240.186 nl -217.77.240.187 - 217.77.240.187 gb -217.77.240.188 - 217.77.240.188 ch -217.77.240.189 - 217.77.240.189 de -217.77.240.190 - 217.77.240.190 nl -217.77.240.191 - 217.77.240.191 de -217.77.240.192 - 217.77.240.192 nl -217.77.240.193 - 217.77.240.193 be -217.77.240.194 - 217.77.240.195 de -217.77.240.196 - 217.77.240.196 ch -217.77.240.197 - 217.77.240.197 de -217.77.240.198 - 217.77.240.198 nl -217.77.240.199 - 217.77.240.199 de -217.77.240.200 - 217.77.240.200 nl -217.77.240.201 - 217.77.240.201 de -217.77.240.202 - 217.77.240.202 ch -217.77.240.203 - 217.77.240.203 nl -217.77.240.204 - 217.77.240.204 ie -217.77.240.205 - 217.77.240.205 at -217.77.240.206 - 217.77.240.206 es -217.77.240.207 - 217.77.240.207 it -217.77.240.208 - 217.77.240.208 fr -217.77.240.209 - 217.77.240.209 es -217.77.240.210 - 217.77.240.210 de -217.77.240.211 - 217.77.240.211 it -217.77.240.212 - 217.77.240.213 de -217.77.240.214 - 217.77.240.214 fr -217.77.240.215 - 217.77.240.217 de -217.77.240.218 - 217.77.240.218 es -217.77.240.219 - 217.77.240.219 nl -217.77.240.220 - 217.77.240.222 de -217.77.240.223 - 217.77.240.223 it -217.77.240.224 - 217.77.240.224 de -217.77.240.225 - 217.77.240.225 it -217.77.240.226 - 217.77.240.226 nl -217.77.240.227 - 217.77.240.229 de -217.77.240.230 - 217.77.240.230 it -217.77.240.231 - 217.77.240.232 de -217.77.240.233 - 217.77.240.233 gr -217.77.240.234 - 217.77.240.234 es -217.77.240.235 - 217.77.240.238 de -217.77.240.239 - 217.77.240.239 es -217.77.240.240 - 217.77.240.241 de -217.77.240.242 - 217.77.240.242 it -217.77.240.243 - 217.77.240.243 za -217.77.240.244 - 217.77.241.1 de -217.77.241.2 - 217.77.241.2 ch -217.77.241.3 - 217.77.241.5 de -217.77.241.6 - 217.77.241.6 fr -217.77.241.7 - 217.77.241.7 it -217.77.241.8 - 217.77.241.9 de -217.77.241.10 - 217.77.241.10 it -217.77.241.11 - 217.77.241.11 gb -217.77.241.12 - 217.77.241.12 de -217.77.241.13 - 217.77.241.13 ch -217.77.241.14 - 217.77.241.14 nl -217.77.241.15 - 217.77.241.18 de -217.77.241.19 - 217.77.241.19 dk -217.77.241.20 - 217.77.241.20 it -217.77.241.21 - 217.77.241.21 de -217.77.241.22 - 217.77.241.22 fr -217.77.241.23 - 217.77.241.24 es -217.77.241.25 - 217.77.241.25 ch -217.77.241.26 - 217.77.241.26 de -217.77.241.27 - 217.77.241.28 gb -217.77.241.29 - 217.77.241.29 de -217.77.241.30 - 217.77.241.30 hu -217.77.241.31 - 217.77.241.34 de -217.77.241.35 - 217.77.241.35 gb -217.77.241.36 - 217.77.241.36 pl -217.77.241.37 - 217.77.241.37 fr -217.77.241.38 - 217.77.241.39 de -217.77.241.40 - 217.77.241.41 fr -217.77.241.42 - 217.77.241.42 de -217.77.241.43 - 217.77.241.43 nl -217.77.241.44 - 217.77.241.44 it -217.77.241.45 - 217.77.241.46 de -217.77.241.47 - 217.77.241.47 fr -217.77.241.48 - 217.77.241.48 de -217.77.241.49 - 217.77.241.49 gr -217.77.241.50 - 217.77.241.50 es -217.77.241.51 - 217.77.241.54 de -217.77.241.55 - 217.77.241.55 es -217.77.241.56 - 217.77.241.56 de -217.77.241.57 - 217.77.241.57 be -217.77.241.58 - 217.77.241.58 nl -217.77.241.59 - 217.77.241.59 es -217.77.241.60 - 217.77.241.60 nl -217.77.241.61 - 217.77.241.62 lu -217.77.241.63 - 217.77.241.63 de -217.77.241.64 - 217.77.241.64 be -217.77.241.65 - 217.77.241.65 rs -217.77.241.66 - 217.77.241.66 de -217.77.241.67 - 217.77.241.68 it -217.77.241.69 - 217.77.241.69 de -217.77.241.70 - 217.77.241.70 es -217.77.241.71 - 217.77.241.71 de -217.77.241.72 - 217.77.241.72 ie -217.77.241.73 - 217.77.241.73 pt -217.77.241.74 - 217.77.241.74 de -217.77.241.75 - 217.77.241.75 il -217.77.241.76 - 217.77.241.76 be -217.77.241.77 - 217.77.241.77 de -217.77.241.78 - 217.77.241.78 it -217.77.241.79 - 217.77.241.79 gb -217.77.241.80 - 217.77.241.80 de -217.77.241.81 - 217.77.241.81 ch -217.77.241.82 - 217.77.241.82 es -217.77.241.83 - 217.77.241.83 gb -217.77.241.84 - 217.77.241.84 pl -217.77.241.85 - 217.77.241.86 de -217.77.241.87 - 217.77.241.87 hu -217.77.241.88 - 217.77.241.88 fr -217.77.241.89 - 217.77.241.89 nl -217.77.241.90 - 217.77.241.90 es -217.77.241.91 - 217.77.241.91 fr -217.77.241.92 - 217.77.241.92 de -217.77.241.93 - 217.77.241.93 fr -217.77.241.94 - 217.77.241.94 it -217.77.241.95 - 217.77.241.95 fr -217.77.241.96 - 217.77.241.96 de -217.77.241.97 - 217.77.241.97 fr -217.77.241.98 - 217.77.241.98 es -217.77.241.99 - 217.77.241.99 nl -217.77.241.100 - 217.77.241.101 de -217.77.241.102 - 217.77.241.102 ch -217.77.241.103 - 217.77.241.103 es -217.77.241.104 - 217.77.241.104 ch -217.77.241.105 - 217.77.241.105 de -217.77.241.106 - 217.77.241.107 hu -217.77.241.108 - 217.77.241.109 de -217.77.241.110 - 217.77.241.110 es -217.77.241.111 - 217.77.241.111 ch -217.77.241.112 - 217.77.241.112 it -217.77.241.113 - 217.77.241.113 tr -217.77.241.114 - 217.77.241.114 it -217.77.241.115 - 217.77.241.115 fr -217.77.241.116 - 217.77.241.116 de -217.77.241.117 - 217.77.241.117 gb -217.77.241.118 - 217.77.241.118 at -217.77.241.119 - 217.77.241.119 de -217.77.241.120 - 217.77.241.120 it -217.77.241.121 - 217.77.241.121 de -217.77.241.122 - 217.77.241.122 es -217.77.241.123 - 217.77.241.124 de -217.77.241.125 - 217.77.241.125 at -217.77.241.126 - 217.77.241.126 de -217.77.241.127 - 217.77.241.127 it -217.77.241.128 - 217.77.241.128 de -217.77.241.129 - 217.77.241.129 es -217.77.241.130 - 217.77.241.130 it -217.77.241.131 - 217.77.241.131 es -217.77.241.132 - 217.77.241.132 it -217.77.241.133 - 217.77.241.133 be -217.77.241.134 - 217.77.241.134 gb -217.77.241.135 - 217.77.241.135 at -217.77.241.136 - 217.77.241.136 it -217.77.241.137 - 217.77.241.137 de -217.77.241.138 - 217.77.241.138 nl -217.77.241.139 - 217.77.241.139 it -217.77.241.140 - 217.77.241.141 de -217.77.241.142 - 217.77.241.142 it -217.77.241.143 - 217.77.241.144 fr -217.77.241.145 - 217.77.241.145 nl -217.77.241.146 - 217.77.241.146 de -217.77.241.147 - 217.77.241.147 pl -217.77.241.148 - 217.77.241.148 ch -217.77.241.149 - 217.77.241.149 fr -217.77.241.150 - 217.77.241.151 de -217.77.241.152 - 217.77.241.152 nl -217.77.241.153 - 217.77.241.153 de -217.77.241.154 - 217.77.241.154 it -217.77.241.155 - 217.77.241.155 es -217.77.241.156 - 217.77.241.160 de -217.77.241.161 - 217.77.241.161 it -217.77.241.162 - 217.77.241.167 de -217.77.241.168 - 217.77.241.168 pl -217.77.241.169 - 217.77.241.170 fr -217.77.241.171 - 217.77.241.172 de -217.77.241.173 - 217.77.241.173 hu -217.77.241.174 - 217.77.241.175 gb -217.77.241.176 - 217.77.241.176 it -217.77.241.177 - 217.77.241.177 gb -217.77.241.178 - 217.77.241.178 de -217.77.241.179 - 217.77.241.179 nl -217.77.241.180 - 217.77.241.180 it -217.77.241.181 - 217.77.241.181 de -217.77.241.182 - 217.77.241.182 es -217.77.241.183 - 217.77.241.183 fr -217.77.241.184 - 217.77.241.186 es -217.77.241.187 - 217.77.241.188 de -217.77.241.189 - 217.77.241.189 es -217.77.241.190 - 217.77.241.190 de -217.77.241.191 - 217.77.241.191 nl -217.77.241.192 - 217.77.241.192 fr -217.77.241.193 - 217.77.241.194 de -217.77.241.195 - 217.77.241.195 it -217.77.241.196 - 217.77.241.197 es -217.77.241.198 - 217.77.241.198 it -217.77.241.199 - 217.77.241.199 hu -217.77.241.200 - 217.77.241.200 es -217.77.241.201 - 217.77.241.201 de -217.77.241.202 - 217.77.241.202 ch -217.77.241.203 - 217.77.241.203 de -217.77.241.204 - 217.77.241.204 es -217.77.241.205 - 217.77.241.205 ae -217.77.241.206 - 217.77.241.206 es -217.77.241.207 - 217.77.241.208 de -217.77.241.209 - 217.77.241.209 es -217.77.241.210 - 217.77.241.211 de -217.77.241.212 - 217.77.241.212 fr -217.77.241.213 - 217.77.241.215 de -217.77.241.216 - 217.77.241.216 be -217.77.241.217 - 217.77.241.217 de -217.77.241.218 - 217.77.241.218 tr -217.77.241.219 - 217.77.241.219 de -217.77.241.220 - 217.77.241.220 fr -217.77.241.221 - 217.77.241.221 it -217.77.241.222 - 217.77.241.222 se -217.77.241.223 - 217.77.241.223 at -217.77.241.224 - 217.77.241.224 si -217.77.241.225 - 217.77.241.225 de -217.77.241.226 - 217.77.241.226 it -217.77.241.227 - 217.77.241.227 de -217.77.241.228 - 217.77.241.228 it -217.77.241.229 - 217.77.241.229 ch -217.77.241.230 - 217.77.241.230 gb -217.77.241.231 - 217.77.241.234 de -217.77.241.235 - 217.77.241.235 se -217.77.241.236 - 217.77.241.236 gr -217.77.241.237 - 217.77.241.238 de -217.77.241.239 - 217.77.241.239 es -217.77.241.240 - 217.77.241.240 de -217.77.241.241 - 217.77.241.241 gb -217.77.241.242 - 217.77.241.244 de -217.77.241.245 - 217.77.241.245 ie -217.77.241.246 - 217.77.241.246 it -217.77.241.247 - 217.77.241.247 ch -217.77.241.248 - 217.77.241.251 de -217.77.241.252 - 217.77.241.252 fr -217.77.241.253 - 217.77.242.1 de -217.77.242.2 - 217.77.242.2 it -217.77.242.3 - 217.77.242.3 de -217.77.242.4 - 217.77.242.4 be -217.77.242.5 - 217.77.242.6 de -217.77.242.7 - 217.77.242.7 sk -217.77.242.8 - 217.77.242.9 it -217.77.242.10 - 217.77.242.10 nl -217.77.242.11 - 217.77.242.11 gr -217.77.242.12 - 217.77.242.12 pl -217.77.242.13 - 217.77.242.13 ch -217.77.242.14 - 217.77.242.14 dk -217.77.242.15 - 217.77.242.15 de -217.77.242.16 - 217.77.242.16 it -217.77.242.17 - 217.77.242.17 es -217.77.242.18 - 217.77.242.18 de -217.77.242.19 - 217.77.242.19 gb -217.77.242.20 - 217.77.242.20 gr -217.77.242.21 - 217.77.242.21 de -217.77.242.22 - 217.77.242.22 gb -217.77.242.23 - 217.77.242.23 ch -217.77.242.24 - 217.77.242.24 fr -217.77.242.25 - 217.77.242.25 it -217.77.242.26 - 217.77.242.26 de -217.77.242.27 - 217.77.242.27 pl -217.77.242.28 - 217.77.242.28 de -217.77.242.29 - 217.77.242.29 no -217.77.242.30 - 217.77.242.30 lu -217.77.242.31 - 217.77.242.31 gb -217.77.242.32 - 217.77.242.32 gr -217.77.242.33 - 217.77.242.33 hr -217.77.242.34 - 217.77.242.34 fr -217.77.242.35 - 217.77.242.35 de -217.77.242.36 - 217.77.242.36 es -217.77.242.37 - 217.77.242.37 cy -217.77.242.38 - 217.77.242.38 de -217.77.242.39 - 217.77.242.39 it -217.77.242.40 - 217.77.242.40 be -217.77.242.41 - 217.77.242.41 de -217.77.242.42 - 217.77.242.42 ch -217.77.242.43 - 217.77.242.44 de -217.77.242.45 - 217.77.242.45 es -217.77.242.46 - 217.77.242.46 hu -217.77.242.47 - 217.77.242.49 de -217.77.242.50 - 217.77.242.51 nl -217.77.242.52 - 217.77.242.52 dk -217.77.242.53 - 217.77.242.53 de -217.77.242.54 - 217.77.242.54 es -217.77.242.55 - 217.77.242.58 de -217.77.242.59 - 217.77.242.59 es -217.77.242.60 - 217.77.242.60 at -217.77.242.61 - 217.77.242.62 de -217.77.242.63 - 217.77.242.63 it -217.77.242.64 - 217.77.242.64 be -217.77.242.65 - 217.77.242.65 es -217.77.242.66 - 217.77.242.66 de -217.77.242.67 - 217.77.242.67 nl -217.77.242.68 - 217.77.242.68 de -217.77.242.69 - 217.77.242.69 ch -217.77.242.70 - 217.77.242.70 hu -217.77.242.71 - 217.77.242.71 de -217.77.242.72 - 217.77.242.72 es -217.77.242.73 - 217.77.242.73 gr -217.77.242.74 - 217.77.242.74 it -217.77.242.75 - 217.77.242.76 de -217.77.242.77 - 217.77.242.77 it -217.77.242.78 - 217.77.242.78 de -217.77.242.79 - 217.77.242.79 pl -217.77.242.80 - 217.77.242.80 de -217.77.242.81 - 217.77.242.81 gb -217.77.242.82 - 217.77.242.82 es -217.77.242.83 - 217.77.242.83 gr -217.77.242.84 - 217.77.242.85 de -217.77.242.86 - 217.77.242.86 fr -217.77.242.87 - 217.77.242.88 de -217.77.242.89 - 217.77.242.89 it -217.77.242.90 - 217.77.242.90 fr -217.77.242.91 - 217.77.242.91 be -217.77.242.92 - 217.77.242.92 gb -217.77.242.93 - 217.77.242.93 fr -217.77.242.94 - 217.77.242.94 it -217.77.242.95 - 217.77.242.95 gb -217.77.242.96 - 217.77.242.97 de -217.77.242.98 - 217.77.242.98 es -217.77.242.99 - 217.77.242.99 de -217.77.242.100 - 217.77.242.100 it -217.77.242.101 - 217.77.242.101 de -217.77.242.102 - 217.77.242.102 gr -217.77.242.103 - 217.77.242.103 de -217.77.242.104 - 217.77.242.104 it -217.77.242.105 - 217.77.242.105 be -217.77.242.106 - 217.77.242.106 it -217.77.242.107 - 217.77.242.107 de -217.77.242.108 - 217.77.242.108 es -217.77.242.109 - 217.77.242.109 fr -217.77.242.110 - 217.77.242.110 de -217.77.242.111 - 217.77.242.111 it -217.77.242.112 - 217.77.242.112 no -217.77.242.113 - 217.77.242.114 de -217.77.242.115 - 217.77.242.115 fr -217.77.242.116 - 217.77.242.116 nl -217.77.242.117 - 217.77.242.117 gb -217.77.242.118 - 217.77.242.118 nl -217.77.242.119 - 217.77.242.120 de -217.77.242.121 - 217.77.242.121 it -217.77.242.122 - 217.77.242.122 ch -217.77.242.123 - 217.77.242.123 fr -217.77.242.124 - 217.77.242.124 nl -217.77.242.125 - 217.77.242.125 it -217.77.242.126 - 217.77.242.126 be -217.77.242.127 - 217.77.242.128 es -217.77.242.129 - 217.77.242.130 gb -217.77.242.131 - 217.77.242.131 ch -217.77.242.132 - 217.77.242.132 fr -217.77.242.133 - 217.77.242.133 pl -217.77.242.134 - 217.77.242.134 nl -217.77.242.135 - 217.77.242.135 ch -217.77.242.136 - 217.77.242.138 de -217.77.242.139 - 217.77.242.139 fr -217.77.242.140 - 217.77.242.140 it -217.77.242.141 - 217.77.242.142 de -217.77.242.143 - 217.77.242.144 es -217.77.242.145 - 217.77.242.145 de -217.77.242.146 - 217.77.242.146 at -217.77.242.147 - 217.77.242.147 gr -217.77.242.148 - 217.77.242.148 fr -217.77.242.149 - 217.77.242.150 nl -217.77.242.151 - 217.77.242.151 it -217.77.242.152 - 217.77.242.154 de -217.77.242.155 - 217.77.242.155 fr -217.77.242.156 - 217.77.242.157 es -217.77.242.158 - 217.77.242.158 de -217.77.242.159 - 217.77.242.159 ch -217.77.242.160 - 217.77.242.161 de -217.77.242.162 - 217.77.242.162 nl -217.77.242.163 - 217.77.242.163 it -217.77.242.164 - 217.77.242.164 de -217.77.242.165 - 217.77.242.165 gb -217.77.242.166 - 217.77.242.166 be -217.77.242.167 - 217.77.242.168 it -217.77.242.169 - 217.77.242.169 tr -217.77.242.170 - 217.77.242.173 de -217.77.242.174 - 217.77.242.174 es -217.77.242.175 - 217.77.242.175 it -217.77.242.176 - 217.77.242.176 de -217.77.242.177 - 217.77.242.177 it -217.77.242.178 - 217.77.242.178 de -217.77.242.179 - 217.77.242.179 fr -217.77.242.180 - 217.77.242.181 de -217.77.242.182 - 217.77.242.182 nl -217.77.242.183 - 217.77.242.183 es -217.77.242.184 - 217.77.242.184 it -217.77.242.185 - 217.77.242.185 de -217.77.242.186 - 217.77.242.186 nl -217.77.242.187 - 217.77.242.188 fr -217.77.242.189 - 217.77.242.189 it -217.77.242.190 - 217.77.242.190 nl -217.77.242.191 - 217.77.242.191 be -217.77.242.192 - 217.77.242.192 fr -217.77.242.193 - 217.77.242.193 nl -217.77.242.194 - 217.77.242.194 de -217.77.242.195 - 217.77.242.195 nl -217.77.242.196 - 217.77.242.196 fr -217.77.242.197 - 217.77.242.198 it -217.77.242.199 - 217.77.242.199 es -217.77.242.200 - 217.77.242.201 de -217.77.242.202 - 217.77.242.202 gr -217.77.242.203 - 217.77.242.203 nl -217.77.242.204 - 217.77.242.204 pl -217.77.242.205 - 217.77.242.205 gr -217.77.242.206 - 217.77.242.206 it -217.77.242.207 - 217.77.242.207 de -217.77.242.208 - 217.77.242.208 es -217.77.242.209 - 217.77.242.209 gb -217.77.242.210 - 217.77.242.210 bm -217.77.242.211 - 217.77.242.211 nl -217.77.242.212 - 217.77.242.212 de -217.77.242.213 - 217.77.242.213 ch -217.77.242.214 - 217.77.242.214 za -217.77.242.215 - 217.77.242.217 es -217.77.242.218 - 217.77.242.219 de -217.77.242.220 - 217.77.242.220 it -217.77.242.221 - 217.77.242.221 es -217.77.242.222 - 217.77.242.222 hu -217.77.242.223 - 217.77.242.223 fr -217.77.242.224 - 217.77.242.224 it -217.77.242.225 - 217.77.242.225 de -217.77.242.226 - 217.77.242.226 ch -217.77.242.227 - 217.77.242.227 de -217.77.242.228 - 217.77.242.228 fr -217.77.242.229 - 217.77.242.229 de -217.77.242.230 - 217.77.242.230 es -217.77.242.231 - 217.77.242.231 dk -217.77.242.232 - 217.77.242.232 ch -217.77.242.233 - 217.77.242.233 es -217.77.242.234 - 217.77.242.234 de -217.77.242.235 - 217.77.242.235 ru -217.77.242.236 - 217.77.242.236 nl -217.77.242.237 - 217.77.242.237 gr -217.77.242.238 - 217.77.242.238 es -217.77.242.239 - 217.77.242.239 de -217.77.242.240 - 217.77.242.240 my -217.77.242.241 - 217.77.242.241 hu -217.77.242.242 - 217.77.242.242 nl -217.77.242.243 - 217.77.242.244 de -217.77.242.245 - 217.77.242.245 ie -217.77.242.246 - 217.77.242.246 it -217.77.242.247 - 217.77.242.247 es -217.77.242.248 - 217.77.242.249 de -217.77.242.250 - 217.77.242.250 it -217.77.242.251 - 217.77.242.251 ie -217.77.242.252 - 217.77.242.252 nl -217.77.242.253 - 217.77.242.253 be -217.77.242.254 - 217.77.242.254 it -217.77.242.255 - 217.77.243.4 de -217.77.243.5 - 217.77.243.5 ru -217.77.243.6 - 217.77.243.6 fr -217.77.243.7 - 217.77.243.7 it -217.77.243.8 - 217.77.243.8 de -217.77.243.9 - 217.77.243.9 ch -217.77.243.10 - 217.77.243.10 gb -217.77.243.11 - 217.77.243.12 nl -217.77.243.13 - 217.77.243.13 be -217.77.243.14 - 217.77.243.15 de -217.77.243.16 - 217.77.243.16 it -217.77.243.17 - 217.77.243.17 de -217.77.243.18 - 217.77.243.18 gb -217.77.243.19 - 217.77.243.19 es -217.77.243.20 - 217.77.243.21 fr -217.77.243.22 - 217.77.243.23 de -217.77.243.24 - 217.77.243.25 nl -217.77.243.26 - 217.77.243.26 de -217.77.243.27 - 217.77.243.28 gb -217.77.243.29 - 217.77.243.29 de -217.77.243.30 - 217.77.243.30 nl -217.77.243.31 - 217.77.243.31 fr -217.77.243.32 - 217.77.243.32 at -217.77.243.33 - 217.77.243.36 de -217.77.243.37 - 217.77.243.37 nl -217.77.243.38 - 217.77.243.38 de -217.77.243.39 - 217.77.243.39 nl -217.77.243.40 - 217.77.243.40 gr -217.77.243.41 - 217.77.243.41 de -217.77.243.42 - 217.77.243.42 fr -217.77.243.43 - 217.77.243.44 nl -217.77.243.45 - 217.77.243.45 de -217.77.243.46 - 217.77.243.46 nl -217.77.243.47 - 217.77.243.47 de -217.77.243.48 - 217.77.243.49 nl -217.77.243.50 - 217.77.243.51 fr -217.77.243.52 - 217.77.243.54 nl -217.77.243.55 - 217.77.243.56 de -217.77.243.57 - 217.77.243.57 fr -217.77.243.58 - 217.77.243.58 de -217.77.243.59 - 217.77.243.59 fr -217.77.243.60 - 217.77.243.60 nl -217.77.243.61 - 217.77.243.61 fr -217.77.243.62 - 217.77.243.65 nl -217.77.243.66 - 217.77.243.66 de -217.77.243.67 - 217.77.243.67 nl -217.77.243.68 - 217.77.243.68 gb -217.77.243.69 - 217.77.243.69 de -217.77.243.70 - 217.77.243.70 it -217.77.243.71 - 217.77.243.71 hu -217.77.243.72 - 217.77.243.72 de -217.77.243.73 - 217.77.243.73 gb -217.77.243.74 - 217.77.243.81 de -217.77.243.82 - 217.77.243.82 nl -217.77.243.83 - 217.77.243.83 at -217.77.243.84 - 217.77.243.84 nl -217.77.243.85 - 217.77.243.85 fr -217.77.243.86 - 217.77.243.87 de -217.77.243.88 - 217.77.243.88 ch -217.77.243.89 - 217.77.243.89 de -217.77.243.90 - 217.77.243.90 it -217.77.243.91 - 217.77.243.92 de -217.77.243.93 - 217.77.243.93 gb -217.77.243.94 - 217.77.243.94 nl -217.77.243.95 - 217.77.243.104 de -217.77.243.105 - 217.77.243.105 it -217.77.243.106 - 217.77.243.106 at -217.77.243.107 - 217.77.243.107 it -217.77.243.108 - 217.77.243.110 de -217.77.243.111 - 217.77.243.111 nl -217.77.243.112 - 217.77.243.112 be -217.77.243.113 - 217.77.243.113 de -217.77.243.114 - 217.77.243.114 gr -217.77.243.115 - 217.77.243.115 de -217.77.243.116 - 217.77.243.116 it -217.77.243.117 - 217.77.243.118 de -217.77.243.119 - 217.77.243.119 it -217.77.243.120 - 217.77.243.120 gr -217.77.243.121 - 217.77.243.121 nl -217.77.243.122 - 217.77.243.122 de -217.77.243.123 - 217.77.243.123 gr -217.77.243.124 - 217.77.243.124 de -217.77.243.125 - 217.77.243.125 nl -217.77.243.126 - 217.77.243.126 gb -217.77.243.127 - 217.77.243.127 de -217.77.243.128 - 217.77.243.129 nl -217.77.243.130 - 217.77.243.130 de -217.77.243.131 - 217.77.243.131 nl -217.77.243.132 - 217.77.243.132 fr -217.77.243.133 - 217.77.243.133 nl -217.77.243.134 - 217.77.243.134 ie -217.77.243.135 - 217.77.243.135 de -217.77.243.136 - 217.77.243.138 nl -217.77.243.139 - 217.77.243.139 de -217.77.243.140 - 217.77.243.140 nl -217.77.243.141 - 217.77.243.141 es -217.77.243.142 - 217.77.243.142 fr -217.77.243.143 - 217.77.243.143 nl -217.77.243.144 - 217.77.243.144 de -217.77.243.145 - 217.77.243.145 nl -217.77.243.146 - 217.77.243.146 fr -217.77.243.147 - 217.77.243.148 nl -217.77.243.149 - 217.77.243.149 de -217.77.243.150 - 217.77.243.153 nl -217.77.243.154 - 217.77.243.154 de -217.77.243.155 - 217.77.243.155 es -217.77.243.156 - 217.77.243.156 it -217.77.243.157 - 217.77.243.157 nl -217.77.243.158 - 217.77.243.158 de -217.77.243.159 - 217.77.243.159 nl -217.77.243.160 - 217.77.243.160 de -217.77.243.161 - 217.77.243.161 nl -217.77.243.162 - 217.77.243.162 es -217.77.243.163 - 217.77.243.163 de -217.77.243.164 - 217.77.243.164 nl -217.77.243.165 - 217.77.243.166 de -217.77.243.167 - 217.77.243.170 nl -217.77.243.171 - 217.77.243.172 de -217.77.243.173 - 217.77.243.179 nl -217.77.243.180 - 217.77.243.181 de -217.77.243.182 - 217.77.243.183 nl -217.77.243.184 - 217.77.243.184 it -217.77.243.185 - 217.77.243.187 nl -217.77.243.188 - 217.77.243.188 de -217.77.243.189 - 217.77.243.189 it -217.77.243.190 - 217.77.243.197 nl -217.77.243.198 - 217.77.243.198 de -217.77.243.199 - 217.77.243.199 gr -217.77.243.200 - 217.77.243.201 de -217.77.243.202 - 217.77.243.202 nl -217.77.243.203 - 217.77.243.203 de -217.77.243.204 - 217.77.243.204 ch -217.77.243.205 - 217.77.243.205 nl -217.77.243.206 - 217.77.243.209 de -217.77.243.210 - 217.77.243.210 fr -217.77.243.211 - 217.77.243.211 es -217.77.243.212 - 217.77.243.213 nl -217.77.243.214 - 217.77.243.214 de -217.77.243.215 - 217.77.243.216 nl -217.77.243.217 - 217.77.243.217 de -217.77.243.218 - 217.77.243.218 ma -217.77.243.219 - 217.77.246.7 de -217.77.246.8 - 217.77.246.11 gr -217.77.246.12 - 217.77.246.15 de -217.77.246.16 - 217.77.246.19 be -217.77.246.20 - 217.77.246.23 it -217.77.246.24 - 217.77.246.27 de -217.77.246.28 - 217.77.246.31 it -217.77.246.32 - 217.77.246.35 be -217.77.246.36 - 217.77.246.51 it -217.77.246.52 - 217.77.246.55 no -217.77.246.56 - 217.77.246.59 de -217.77.246.60 - 217.77.246.63 fr -217.77.246.64 - 217.77.246.67 gr -217.77.246.68 - 217.77.246.75 de -217.77.246.76 - 217.77.246.79 ch -217.77.246.80 - 217.77.246.87 gb -217.77.246.88 - 217.77.246.91 fr -217.77.246.92 - 217.77.246.99 es -217.77.246.100 - 217.77.246.103 pl -217.77.246.104 - 217.77.246.107 be +217.77.240.0 - 217.77.241.174 de +217.77.241.175 - 217.77.241.175 gb +217.77.241.176 - 217.77.246.107 de 217.77.246.108 - 217.77.246.111 gb -217.77.246.112 - 217.77.246.115 it -217.77.246.116 - 217.77.246.119 fr -217.77.246.120 - 217.77.246.123 gb -217.77.246.124 - 217.77.246.127 it -217.77.246.128 - 217.77.246.131 es -217.77.246.132 - 217.77.246.135 de -217.77.246.136 - 217.77.246.139 gr -217.77.246.140 - 217.77.246.143 pl -217.77.246.144 - 217.77.246.147 it -217.77.246.148 - 217.77.246.151 pl -217.77.246.152 - 217.77.246.155 it -217.77.246.156 - 217.77.246.159 fr -217.77.246.160 - 217.77.246.163 de -217.77.246.164 - 217.77.246.167 es -217.77.246.168 - 217.77.246.175 de -217.77.246.176 - 217.77.246.179 es -217.77.246.180 - 217.77.246.183 fr -217.77.246.184 - 217.77.246.191 it -217.77.246.192 - 217.77.246.195 tr -217.77.246.196 - 217.77.246.199 it -217.77.246.200 - 217.77.246.203 fr -217.77.246.204 - 217.77.246.211 es -217.77.246.212 - 217.77.246.215 fr -217.77.246.216 - 217.77.246.219 it -217.77.246.220 - 217.77.246.223 fr -217.77.246.224 - 217.77.246.227 pl -217.77.246.228 - 217.77.246.231 gr -217.77.246.232 - 217.77.246.235 it -217.77.246.236 - 217.77.246.239 es -217.77.246.240 - 217.77.246.243 fr -217.77.246.244 - 217.77.246.247 es -217.77.246.248 - 217.77.246.251 it -217.77.246.252 - 217.77.246.255 ch -217.77.247.0 - 217.77.247.3 de -217.77.247.4 - 217.77.247.7 bm -217.77.247.8 - 217.77.247.11 nl -217.77.247.12 - 217.77.247.15 de -217.77.247.16 - 217.77.247.27 es -217.77.247.28 - 217.77.247.31 gr -217.77.247.32 - 217.77.247.35 dk -217.77.247.36 - 217.77.247.39 it -217.77.247.40 - 217.77.247.43 fr -217.77.247.44 - 217.77.247.47 de -217.77.247.48 - 217.77.247.51 it -217.77.247.52 - 217.77.247.67 de -217.77.247.68 - 217.77.247.71 fr -217.77.247.72 - 217.77.247.75 es -217.77.247.76 - 217.77.247.79 fr -217.77.247.80 - 217.77.247.83 at -217.77.247.84 - 217.77.247.87 fr -217.77.247.88 - 217.77.247.91 gb -217.77.247.92 - 217.77.247.95 de -217.77.247.96 - 217.77.247.99 nl -217.77.247.100 - 217.77.247.111 de -217.77.247.112 - 217.77.247.115 hu -217.77.247.116 - 217.77.247.119 de -217.77.247.120 - 217.77.247.123 gb -217.77.247.124 - 217.77.247.127 nl -217.77.247.128 - 217.77.247.131 ch -217.77.247.132 - 217.77.247.135 it -217.77.247.136 - 217.77.247.143 gb -217.77.247.144 - 217.77.247.147 fr -217.77.247.148 - 217.77.247.151 it -217.77.247.152 - 217.77.247.159 fr -217.77.247.160 - 217.77.247.163 se -217.77.247.164 - 217.77.247.167 il -217.77.247.168 - 217.77.247.171 be -217.77.247.172 - 217.77.247.179 de -217.77.247.180 - 217.77.247.183 it -217.77.247.184 - 217.77.247.187 ie -217.77.247.188 - 217.77.247.191 es -217.77.247.192 - 217.77.247.195 fr -217.77.247.196 - 217.77.247.199 de -217.77.247.200 - 217.77.247.203 it -217.77.247.204 - 217.77.247.215 de -217.77.247.216 - 217.77.247.219 ie -217.77.247.220 - 217.77.247.235 de -217.77.247.236 - 217.77.247.239 it -217.77.247.240 - 217.77.247.243 gb -217.77.247.244 - 217.77.247.247 ch -217.77.247.248 - 217.77.247.251 fr -217.77.247.252 - 217.77.248.7 de -217.77.248.8 - 217.77.248.11 dk -217.77.248.12 - 217.77.248.15 gb -217.77.248.16 - 217.77.248.19 nl -217.77.248.20 - 217.77.248.35 de -217.77.248.36 - 217.77.248.43 fr -217.77.248.44 - 217.77.248.47 de -217.77.248.48 - 217.77.248.51 fr -217.77.248.52 - 217.77.248.55 nl -217.77.248.56 - 217.77.248.59 fr -217.77.248.60 - 217.77.248.63 ch -217.77.248.64 - 217.77.248.71 it -217.77.248.72 - 217.77.248.75 de -217.77.248.76 - 217.77.248.79 fr -217.77.248.80 - 217.77.248.83 de -217.77.248.84 - 217.77.248.87 fr -217.77.248.88 - 217.77.251.1 de -217.77.251.2 - 217.77.251.7 us -217.77.251.8 - 217.77.254.19 de -217.77.254.20 - 217.77.254.20 us -217.77.254.21 - 217.77.254.25 de -217.77.254.26 - 217.77.254.26 us -217.77.254.27 - 217.77.254.27 de -217.77.254.28 - 217.77.254.28 us -217.77.254.29 - 217.77.254.29 de -217.77.254.30 - 217.77.254.30 us -217.77.254.31 - 217.77.254.40 de -217.77.254.41 - 217.77.254.41 us -217.77.254.42 - 217.77.254.54 de -217.77.254.55 - 217.77.254.55 us -217.77.254.56 - 217.77.254.72 de -217.77.254.73 - 217.77.254.73 us -217.77.254.74 - 217.77.255.2 de -217.77.255.3 - 217.77.255.3 us -217.77.255.4 - 217.77.255.4 de +217.77.246.112 - 217.77.255.4 de 217.77.255.5 - 217.77.255.5 us -217.77.255.6 - 217.77.255.7 de -217.77.255.8 - 217.77.255.9 us -217.77.255.10 - 217.77.255.10 ca -217.77.255.11 - 217.77.255.24 us -217.77.255.25 - 217.77.255.25 de -217.77.255.26 - 217.77.255.31 us -217.77.255.32 - 217.77.255.78 de -217.77.255.79 - 217.77.255.79 us -217.77.255.80 - 217.77.255.255 de +217.77.255.6 - 217.77.255.19 de +217.77.255.20 - 217.77.255.20 us +217.77.255.21 - 217.77.255.255 de 217.78.0.0 - 217.78.15.255 ie 217.78.16.0 - 217.78.47.255 se 217.78.48.0 - 217.78.63.255 ps -217.78.64.0 - 217.78.79.255 ng +217.78.64.0 - 217.78.79.255 dj 217.78.80.0 - 217.78.95.255 gb 217.78.96.0 - 217.78.111.255 tr 217.78.112.0 - 217.78.127.255 ch @@ -156053,253 +115167,106 @@ 217.79.160.0 - 217.79.175.255 gb 217.79.176.0 - 217.79.191.255 de 217.79.192.0 - 217.79.207.255 ch -217.79.208.0 - 217.79.210.15 de -217.79.210.16 - 217.79.210.19 gb -217.79.210.20 - 217.79.210.91 de -217.79.210.92 - 217.79.210.95 us -217.79.210.96 - 217.79.210.103 at -217.79.210.104 - 217.79.212.255 de -217.79.213.0 - 217.79.213.127 us -217.79.213.128 - 217.79.214.127 de -217.79.214.128 - 217.79.214.143 at -217.79.214.144 - 217.79.214.159 de -217.79.214.160 - 217.79.214.191 at -217.79.214.192 - 217.79.214.223 sg -217.79.214.224 - 217.79.220.255 de -217.79.221.0 - 217.79.221.127 us -217.79.221.128 - 217.79.223.255 de +217.79.208.0 - 217.79.215.255 de +217.79.216.0 - 217.79.216.255 eu +217.79.217.0 - 217.79.223.255 de 217.79.224.0 - 217.79.239.255 ru 217.79.240.0 - 217.79.255.255 nl -217.80.0.0 - 217.89.95.207 de -217.89.95.208 - 217.89.95.215 ca -217.89.95.216 - 217.95.255.255 de +217.80.0.0 - 217.95.255.255 de 217.96.0.0 - 217.99.255.255 pl 217.100.0.0 - 217.105.255.255 nl -217.106.0.0 - 217.106.218.255 ru -217.106.219.0 - 217.106.219.255 ge -217.106.220.0 - 217.106.243.255 ru -217.106.244.0 - 217.106.244.255 ge -217.106.245.0 - 217.107.212.255 ru -217.107.213.0 - 217.107.213.127 by -217.107.213.128 - 217.107.255.255 ru -217.108.0.0 - 217.109.60.199 fr -217.109.60.200 - 217.109.60.207 a2 -217.109.60.208 - 217.109.255.255 fr -217.110.0.0 - 217.110.83.31 de -217.110.83.32 - 217.110.83.39 gb -217.110.83.40 - 217.110.83.95 de -217.110.83.96 - 217.110.83.103 gb -217.110.83.104 - 217.110.83.107 de -217.110.83.108 - 217.110.83.127 gb -217.110.83.128 - 217.110.83.191 de -217.110.83.192 - 217.110.83.223 gb -217.110.83.224 - 217.110.91.15 de -217.110.91.16 - 217.110.91.23 it -217.110.91.24 - 217.110.96.255 de -217.110.97.0 - 217.110.97.7 be -217.110.97.8 - 217.110.100.31 de -217.110.100.32 - 217.110.100.39 fr -217.110.100.40 - 217.110.185.255 de -217.110.186.0 - 217.110.186.63 be -217.110.186.64 - 217.110.202.255 de +217.106.0.0 - 217.107.255.255 ru +217.108.0.0 - 217.109.255.255 fr +217.110.0.0 - 217.110.100.255 de +217.110.101.0 - 217.110.101.255 eu +217.110.102.0 - 217.110.202.255 de 217.110.203.0 - 217.110.203.255 se -217.110.204.0 - 217.110.206.31 de -217.110.206.32 - 217.110.206.47 us -217.110.206.48 - 217.110.227.15 de -217.110.227.16 - 217.110.227.31 gb -217.110.227.32 - 217.111.25.103 de -217.111.25.104 - 217.111.25.111 fr -217.111.25.112 - 217.111.93.55 de -217.111.93.56 - 217.111.93.63 gb -217.111.93.64 - 217.111.95.95 de -217.111.95.96 - 217.111.95.127 ch -217.111.95.128 - 217.111.106.7 de -217.111.106.8 - 217.111.106.15 gb -217.111.106.16 - 217.111.114.15 de -217.111.114.16 - 217.111.114.23 es -217.111.114.24 - 217.111.114.47 de -217.111.114.48 - 217.111.114.55 at -217.111.114.56 - 217.111.120.127 de -217.111.120.128 - 217.111.120.159 it -217.111.120.160 - 217.111.120.167 de -217.111.120.168 - 217.111.120.175 be -217.111.120.176 - 217.111.128.31 de -217.111.128.32 - 217.111.128.47 be -217.111.128.48 - 217.111.128.95 de -217.111.128.96 - 217.111.128.127 be -217.111.128.128 - 217.111.129.127 de -217.111.129.128 - 217.111.129.255 fr -217.111.130.0 - 217.111.130.127 be -217.111.130.128 - 217.111.130.191 fr -217.111.130.192 - 217.111.131.255 de -217.111.132.0 - 217.111.132.127 be -217.111.132.128 - 217.111.132.255 de -217.111.133.0 - 217.111.133.151 es -217.111.133.152 - 217.111.133.167 de -217.111.133.168 - 217.111.133.183 es +217.110.204.0 - 217.111.65.255 de +217.111.66.0 - 217.111.66.255 us +217.111.67.0 - 217.111.74.255 de +217.111.75.0 - 217.111.75.255 eu +217.111.76.0 - 217.111.127.255 de +217.111.128.0 - 217.111.128.255 be +217.111.129.0 - 217.111.131.255 de +217.111.132.0 - 217.111.132.127 es +217.111.132.128 - 217.111.133.23 de +217.111.133.24 - 217.111.133.31 es +217.111.133.32 - 217.111.133.47 de +217.111.133.48 - 217.111.133.55 es +217.111.133.56 - 217.111.133.87 de +217.111.133.88 - 217.111.133.95 es +217.111.133.96 - 217.111.133.103 de +217.111.133.104 - 217.111.133.111 es +217.111.133.112 - 217.111.133.135 de +217.111.133.136 - 217.111.133.151 es +217.111.133.152 - 217.111.133.175 de +217.111.133.176 - 217.111.133.183 es 217.111.133.184 - 217.111.133.191 de 217.111.133.192 - 217.111.133.199 es 217.111.133.200 - 217.111.133.207 de -217.111.133.208 - 217.111.133.255 es -217.111.134.0 - 217.111.134.7 de -217.111.134.8 - 217.111.134.31 es -217.111.134.32 - 217.111.135.255 de -217.111.136.0 - 217.111.136.71 es -217.111.136.72 - 217.111.136.95 de -217.111.136.96 - 217.111.136.111 es -217.111.136.112 - 217.111.136.119 de -217.111.136.120 - 217.111.136.127 es -217.111.136.128 - 217.111.136.135 de -217.111.136.136 - 217.111.136.247 es -217.111.136.248 - 217.111.136.255 de -217.111.137.0 - 217.111.137.255 es -217.111.138.0 - 217.111.139.255 ch -217.111.140.0 - 217.111.141.111 gb -217.111.141.112 - 217.111.141.119 de -217.111.141.120 - 217.111.143.255 gb +217.111.133.208 - 217.111.133.223 es +217.111.133.224 - 217.111.137.255 de +217.111.138.0 - 217.111.138.255 ch +217.111.139.0 - 217.111.139.255 de +217.111.140.0 - 217.111.143.255 gb 217.111.144.0 - 217.111.147.255 be 217.111.148.0 - 217.111.151.255 fr -217.111.152.0 - 217.111.153.255 it -217.111.154.0 - 217.111.155.255 be -217.111.156.0 - 217.111.159.255 fr -217.111.160.0 - 217.111.161.87 gb -217.111.161.88 - 217.111.161.95 de -217.111.161.96 - 217.111.163.95 gb -217.111.163.96 - 217.111.163.103 de -217.111.163.104 - 217.111.163.163 gb -217.111.163.164 - 217.111.163.167 de -217.111.163.168 - 217.111.163.255 gb -217.111.164.0 - 217.111.169.47 it -217.111.169.48 - 217.111.169.63 de -217.111.169.64 - 217.111.169.71 it -217.111.169.72 - 217.111.169.79 be -217.111.169.80 - 217.111.169.95 it -217.111.169.96 - 217.111.169.111 de -217.111.169.112 - 217.111.169.151 it -217.111.169.152 - 217.111.169.159 de -217.111.169.160 - 217.111.170.79 it -217.111.170.80 - 217.111.170.87 de -217.111.170.88 - 217.111.170.159 it -217.111.170.160 - 217.111.170.167 de -217.111.170.168 - 217.111.171.255 it -217.111.172.0 - 217.111.179.255 es -217.111.180.0 - 217.111.180.7 be -217.111.180.8 - 217.111.180.15 de -217.111.180.16 - 217.111.180.111 be -217.111.180.112 - 217.111.180.127 fr -217.111.180.128 - 217.111.180.199 be -217.111.180.200 - 217.111.180.215 de -217.111.180.216 - 217.111.181.15 be -217.111.181.16 - 217.111.181.23 de -217.111.181.24 - 217.111.181.39 be -217.111.181.40 - 217.111.181.47 de -217.111.181.48 - 217.111.181.63 be -217.111.181.64 - 217.111.181.79 de -217.111.181.80 - 217.111.181.87 be -217.111.181.88 - 217.111.181.95 de -217.111.181.96 - 217.111.181.223 be -217.111.181.224 - 217.111.181.231 de -217.111.181.232 - 217.111.182.159 be -217.111.182.160 - 217.111.182.175 de -217.111.182.176 - 217.111.182.191 be -217.111.182.192 - 217.111.182.255 de -217.111.183.0 - 217.111.183.255 be -217.111.184.0 - 217.111.185.63 gb -217.111.185.64 - 217.111.185.127 ie -217.111.185.128 - 217.111.187.255 gb -217.111.188.0 - 217.111.188.55 nl -217.111.188.56 - 217.111.188.63 de -217.111.188.64 - 217.111.189.23 nl -217.111.189.24 - 217.111.189.31 de -217.111.189.32 - 217.111.189.143 nl -217.111.189.144 - 217.111.189.159 de -217.111.189.160 - 217.111.189.255 nl -217.111.190.0 - 217.111.190.128 it -217.111.190.129 - 217.111.191.255 de -217.111.192.0 - 217.111.194.183 fr -217.111.194.184 - 217.111.194.191 de -217.111.194.192 - 217.111.194.207 fr -217.111.194.208 - 217.111.194.215 de -217.111.194.216 - 217.111.195.183 fr -217.111.195.184 - 217.111.195.191 de -217.111.195.192 - 217.111.195.207 fr -217.111.195.208 - 217.111.195.215 de -217.111.195.216 - 217.111.195.255 fr -217.111.196.0 - 217.111.197.255 gb -217.111.198.0 - 217.111.199.255 ie +217.111.152.0 - 217.111.152.47 de +217.111.152.48 - 217.111.152.55 it +217.111.152.56 - 217.111.159.255 de +217.111.160.0 - 217.111.163.255 gb +217.111.164.0 - 217.111.167.255 it +217.111.168.0 - 217.111.168.23 de +217.111.168.24 - 217.111.168.31 it +217.111.168.32 - 217.111.168.239 de +217.111.168.240 - 217.111.168.247 it +217.111.168.248 - 217.111.169.79 de +217.111.169.80 - 217.111.169.87 it +217.111.169.88 - 217.111.170.119 de +217.111.170.120 - 217.111.170.127 it +217.111.170.128 - 217.111.170.167 de +217.111.170.168 - 217.111.170.175 it +217.111.170.176 - 217.111.175.255 de +217.111.176.0 - 217.111.179.255 es +217.111.180.0 - 217.111.183.255 de +217.111.184.0 - 217.111.187.255 gb +217.111.188.0 - 217.111.189.255 de +217.111.190.0 - 217.111.190.63 it +217.111.190.64 - 217.111.193.255 de +217.111.194.0 - 217.111.194.255 fr +217.111.195.0 - 217.111.195.95 de +217.111.195.96 - 217.111.195.127 fr +217.111.195.128 - 217.111.195.255 de +217.111.196.0 - 217.111.199.255 gb 217.111.200.0 - 217.111.203.255 be 217.111.204.0 - 217.111.207.255 it -217.111.208.0 - 217.111.211.255 nl -217.111.212.0 - 217.111.213.255 dk -217.111.214.0 - 217.111.215.7 be -217.111.215.8 - 217.111.215.15 at -217.111.215.16 - 217.111.215.255 be -217.111.216.0 - 217.111.216.255 es -217.111.217.0 - 217.111.217.15 be -217.111.217.16 - 217.111.218.255 es -217.111.219.0 - 217.111.219.255 fr -217.111.220.0 - 217.111.220.255 de -217.111.221.0 - 217.111.221.7 es -217.111.221.8 - 217.111.221.31 de -217.111.221.32 - 217.111.221.127 es -217.111.221.128 - 217.111.221.143 de -217.111.221.144 - 217.111.221.175 es -217.111.221.176 - 217.111.221.183 de -217.111.221.184 - 217.111.221.239 es -217.111.221.240 - 217.111.221.247 de -217.111.221.248 - 217.111.221.255 es -217.111.222.0 - 217.111.222.255 de -217.111.223.0 - 217.111.223.31 es -217.111.223.32 - 217.111.223.39 de -217.111.223.40 - 217.111.223.71 es -217.111.223.72 - 217.111.223.79 gb -217.111.223.80 - 217.111.223.87 de -217.111.223.88 - 217.111.223.255 es +217.111.208.0 - 217.111.208.255 de +217.111.209.0 - 217.111.209.255 nl +217.111.210.0 - 217.111.218.255 de +217.111.219.0 - 217.111.219.255 es +217.111.220.0 - 217.111.223.191 de +217.111.223.192 - 217.111.223.199 es +217.111.223.200 - 217.111.223.239 de +217.111.223.240 - 217.111.223.255 es 217.111.224.0 - 217.111.227.255 it -217.111.228.0 - 217.111.228.255 de -217.111.229.0 - 217.111.230.15 be -217.111.230.16 - 217.111.230.63 de -217.111.230.64 - 217.111.230.79 be -217.111.230.80 - 217.111.230.127 de -217.111.230.128 - 217.111.231.255 be -217.111.232.0 - 217.111.233.255 de -217.111.234.0 - 217.111.235.255 es -217.111.236.0 - 217.111.255.255 de -217.112.0.0 - 217.112.32.127 ru -217.112.32.128 - 217.112.33.255 gb -217.112.34.0 - 217.112.40.127 ru -217.112.40.128 - 217.112.40.255 gb -217.112.41.0 - 217.112.43.255 ru -217.112.44.0 - 217.112.47.255 gb +217.111.228.0 - 217.111.229.7 de +217.111.229.8 - 217.111.229.15 be +217.111.229.16 - 217.111.229.71 de +217.111.229.72 - 217.111.229.79 be +217.111.229.80 - 217.111.255.255 de +217.112.0.0 - 217.112.31.255 ru +217.112.32.0 - 217.112.43.255 gb +217.112.44.0 - 217.112.45.255 us +217.112.46.0 - 217.112.46.255 ru +217.112.47.0 - 217.112.47.255 gb 217.112.48.0 - 217.112.79.255 fr 217.112.80.0 - 217.112.95.255 gb 217.112.96.0 - 217.112.111.255 it 217.112.112.0 - 217.112.127.255 nl 217.112.128.0 - 217.112.143.255 hu -217.112.144.0 - 217.112.144.255 ie -217.112.145.0 - 217.112.145.15 eu -217.112.145.16 - 217.112.145.63 ie -217.112.145.64 - 217.112.145.79 eu -217.112.145.80 - 217.112.145.95 ie -217.112.145.96 - 217.112.146.255 eu -217.112.147.0 - 217.112.147.255 ie -217.112.148.0 - 217.112.148.255 eu -217.112.149.0 - 217.112.149.255 ie -217.112.150.0 - 217.112.151.255 eu -217.112.152.0 - 217.112.152.31 de -217.112.152.32 - 217.112.152.71 eu -217.112.152.72 - 217.112.152.79 ie -217.112.152.80 - 217.112.152.127 eu -217.112.152.128 - 217.112.152.207 ie -217.112.152.208 - 217.112.152.223 eu -217.112.152.224 - 217.112.152.255 nl -217.112.153.0 - 217.112.159.255 eu +217.112.144.0 - 217.112.159.255 ie 217.112.160.0 - 217.112.175.255 cz -217.112.176.0 - 217.112.176.64 be -217.112.176.65 - 217.112.176.68 fr -217.112.176.69 - 217.112.176.87 be -217.112.176.88 - 217.112.176.95 nl -217.112.176.96 - 217.112.191.255 be +217.112.176.0 - 217.112.191.255 be 217.112.192.0 - 217.112.207.255 fi 217.112.208.0 - 217.112.223.255 ua 217.112.224.0 - 217.112.239.255 fr @@ -156307,41 +115274,31 @@ 217.113.0.0 - 217.113.31.255 am 217.113.32.0 - 217.113.47.255 de 217.113.48.0 - 217.113.63.255 hu -217.113.64.0 - 217.113.64.255 be -217.113.65.0 - 217.113.65.255 cg -217.113.66.0 - 217.113.66.127 be -217.113.66.128 - 217.113.66.159 bf -217.113.66.160 - 217.113.66.191 be +217.113.64.0 - 217.113.66.191 be 217.113.66.192 - 217.113.66.255 bf -217.113.67.0 - 217.113.67.255 cg -217.113.68.0 - 217.113.73.255 be -217.113.74.0 - 217.113.74.127 tz +217.113.67.0 - 217.113.68.255 be +217.113.69.0 - 217.113.69.255 cg +217.113.70.0 - 217.113.74.127 be 217.113.74.128 - 217.113.74.159 bf -217.113.74.160 - 217.113.74.255 tz -217.113.75.0 - 217.113.75.255 be -217.113.76.0 - 217.113.76.7 ne -217.113.76.8 - 217.113.76.23 cd -217.113.76.24 - 217.113.76.31 ga -217.113.76.32 - 217.113.76.63 cd -217.113.76.64 - 217.113.76.95 td -217.113.76.96 - 217.113.76.111 sl -217.113.76.112 - 217.113.76.127 be -217.113.76.128 - 217.113.76.159 gb -217.113.76.160 - 217.113.77.255 be -217.113.78.0 - 217.113.80.255 mw -217.113.81.0 - 217.113.81.63 be +217.113.74.160 - 217.113.74.255 be +217.113.75.0 - 217.113.75.255 ga +217.113.76.0 - 217.113.76.127 zm +217.113.76.128 - 217.113.76.159 ga +217.113.76.160 - 217.113.76.255 zm +217.113.77.0 - 217.113.77.255 be +217.113.78.0 - 217.113.78.255 cg +217.113.79.0 - 217.113.81.63 be 217.113.81.64 - 217.113.81.135 ne 217.113.81.136 - 217.113.81.255 be 217.113.82.0 - 217.113.82.47 zm -217.113.82.48 - 217.113.91.255 be -217.113.92.0 - 217.113.94.255 gb -217.113.95.0 - 217.113.95.255 zm +217.113.82.48 - 217.113.88.255 be +217.113.89.0 - 217.113.89.255 cd +217.113.90.0 - 217.113.91.255 be +217.113.92.0 - 217.113.95.255 gb 217.113.96.0 - 217.113.111.255 at 217.113.112.0 - 217.113.127.255 ru 217.113.128.0 - 217.113.159.255 pl -217.113.160.0 - 217.113.169.87 gb -217.113.169.88 - 217.113.169.95 ie -217.113.169.96 - 217.113.175.255 gb +217.113.160.0 - 217.113.175.255 gb 217.113.176.0 - 217.113.191.255 de 217.113.192.0 - 217.113.207.255 fr 217.113.208.0 - 217.113.223.255 it @@ -156350,93 +115307,32 @@ 217.114.0.0 - 217.114.47.255 ru 217.114.48.0 - 217.114.63.255 gb 217.114.64.0 - 217.114.79.255 de -217.114.80.0 - 217.114.87.255 se -217.114.88.0 - 217.114.89.255 gb -217.114.90.0 - 217.114.90.255 se -217.114.91.0 - 217.114.91.255 fi -217.114.92.0 - 217.114.92.255 dk -217.114.93.0 - 217.114.93.255 no -217.114.94.0 - 217.114.95.255 se +217.114.80.0 - 217.114.95.255 se 217.114.96.0 - 217.114.111.255 nl 217.114.112.0 - 217.114.127.255 ch 217.114.128.0 - 217.114.143.255 es 217.114.144.0 - 217.114.159.255 ru -217.114.160.0 - 217.114.175.255 ie +217.114.160.0 - 217.114.168.255 gb +217.114.169.0 - 217.114.169.255 ie +217.114.170.0 - 217.114.174.159 gb +217.114.174.160 - 217.114.174.175 ie +217.114.174.176 - 217.114.175.255 gb 217.114.176.0 - 217.114.191.255 ru -217.114.192.0 - 217.114.201.255 fr -217.114.202.0 - 217.114.202.127 lu -217.114.202.128 - 217.114.207.255 fr -217.114.208.0 - 217.114.209.255 de -217.114.210.0 - 217.114.210.15 it -217.114.210.16 - 217.114.210.31 de -217.114.210.32 - 217.114.210.63 at -217.114.210.64 - 217.114.210.255 de -217.114.211.0 - 217.114.211.15 cy -217.114.211.16 - 217.114.211.23 dk -217.114.211.24 - 217.114.211.31 de -217.114.211.32 - 217.114.211.63 at -217.114.211.64 - 217.114.211.71 de -217.114.211.72 - 217.114.211.79 dk -217.114.211.80 - 217.114.211.223 de -217.114.211.224 - 217.114.211.239 ru -217.114.211.240 - 217.114.211.255 de -217.114.212.0 - 217.114.212.31 it -217.114.212.32 - 217.114.212.63 de -217.114.212.64 - 217.114.212.95 at -217.114.212.96 - 217.114.212.127 de -217.114.212.128 - 217.114.212.159 ru -217.114.212.160 - 217.114.212.175 de -217.114.212.176 - 217.114.212.191 ch -217.114.212.192 - 217.114.213.47 de -217.114.213.48 - 217.114.213.63 ru -217.114.213.64 - 217.114.213.127 de -217.114.213.128 - 217.114.213.143 at -217.114.213.144 - 217.114.214.127 de -217.114.214.128 - 217.114.214.143 at -217.114.214.144 - 217.114.215.95 de -217.114.215.96 - 217.114.215.111 cy -217.114.215.112 - 217.114.215.127 de -217.114.215.128 - 217.114.215.143 br -217.114.215.144 - 217.114.215.159 de -217.114.215.160 - 217.114.215.191 ru -217.114.215.192 - 217.114.215.255 gb -217.114.216.0 - 217.114.216.31 ch -217.114.216.32 - 217.114.216.63 it -217.114.216.64 - 217.114.217.63 de -217.114.217.64 - 217.114.217.95 at -217.114.217.96 - 217.114.217.127 ch -217.114.217.128 - 217.114.217.255 de -217.114.218.0 - 217.114.218.15 it -217.114.218.16 - 217.114.218.31 at -217.114.218.32 - 217.114.218.39 us -217.114.218.40 - 217.114.218.47 ru -217.114.218.48 - 217.114.218.63 de -217.114.218.64 - 217.114.218.95 at -217.114.218.96 - 217.114.220.255 de -217.114.221.0 - 217.114.221.127 br -217.114.221.128 - 217.114.221.255 dk -217.114.222.0 - 217.114.222.63 de -217.114.222.64 - 217.114.222.127 gb -217.114.222.128 - 217.114.223.255 de +217.114.192.0 - 217.114.199.255 de +217.114.200.0 - 217.114.207.255 fr +217.114.208.0 - 217.114.223.255 de 217.114.224.0 - 217.114.255.255 ru 217.115.0.0 - 217.115.15.255 de 217.115.16.0 - 217.115.31.255 it -217.115.32.0 - 217.115.62.95 se -217.115.62.96 - 217.115.62.127 dk -217.115.62.128 - 217.115.63.255 se -217.115.64.0 - 217.115.79.255 de +217.115.32.0 - 217.115.63.255 se +217.115.64.0 - 217.115.66.255 de +217.115.67.0 - 217.115.67.255 eu +217.115.68.0 - 217.115.79.255 de 217.115.80.0 - 217.115.95.255 ru 217.115.96.0 - 217.115.111.255 ua 217.115.112.0 - 217.115.127.255 ie -217.115.128.0 - 217.115.151.95 de -217.115.151.96 - 217.115.151.127 nl -217.115.151.128 - 217.115.159.255 de -217.115.160.0 - 217.115.172.123 fr -217.115.172.124 - 217.115.172.124 gb -217.115.172.125 - 217.115.172.125 nl -217.115.172.126 - 217.115.172.126 de -217.115.172.127 - 217.115.172.127 se -217.115.172.128 - 217.115.175.255 fr +217.115.128.0 - 217.115.159.255 de +217.115.160.0 - 217.115.175.255 fr 217.115.176.0 - 217.115.191.255 ru 217.115.192.0 - 217.115.207.255 nl 217.115.208.0 - 217.115.223.255 ro @@ -156453,21 +115349,7 @@ 217.116.160.0 - 217.116.175.255 fi 217.116.176.0 - 217.116.191.255 at 217.116.192.0 - 217.116.207.255 tr -217.116.208.0 - 217.116.224.223 dk -217.116.224.224 - 217.116.224.239 ca -217.116.224.240 - 217.116.226.175 dk -217.116.226.176 - 217.116.226.183 se -217.116.226.184 - 217.116.227.255 dk -217.116.228.0 - 217.116.228.255 nl -217.116.229.0 - 217.116.231.63 dk -217.116.231.64 - 217.116.231.79 ca -217.116.231.80 - 217.116.240.39 dk -217.116.240.40 - 217.116.240.47 ch -217.116.240.48 - 217.116.248.95 dk -217.116.248.96 - 217.116.248.103 ca -217.116.248.104 - 217.116.249.31 dk -217.116.249.32 - 217.116.249.47 gb -217.116.249.48 - 217.116.255.255 dk +217.116.208.0 - 217.116.255.255 dk 217.117.0.0 - 217.117.15.255 ng 217.117.16.0 - 217.117.31.255 lt 217.117.32.0 - 217.117.63.255 be @@ -156476,73 +115358,33 @@ 217.117.96.0 - 217.117.111.255 de 217.117.112.0 - 217.117.127.255 ru 217.117.128.0 - 217.117.143.255 pl -217.117.144.0 - 217.117.151.11 fr -217.117.151.12 - 217.117.151.15 gb -217.117.151.16 - 217.117.151.23 fr -217.117.151.24 - 217.117.151.31 gb -217.117.151.32 - 217.117.159.255 fr +217.117.144.0 - 217.117.159.255 fr 217.117.160.0 - 217.117.175.255 ch 217.117.176.0 - 217.117.191.255 ru 217.117.192.0 - 217.117.207.255 lu 217.117.208.0 - 217.117.223.255 cz -217.117.224.0 - 217.117.239.255 nl +217.117.224.0 - 217.117.224.255 eu +217.117.225.0 - 217.117.239.255 nl 217.117.240.0 - 217.117.255.255 ru 217.118.0.0 - 217.118.15.255 it 217.118.16.0 - 217.118.31.255 de 217.118.32.0 - 217.118.63.255 no 217.118.64.0 - 217.118.95.255 ru 217.118.96.0 - 217.118.111.255 sk -217.118.112.0 - 217.118.112.15 at -217.118.112.16 - 217.118.112.23 gb -217.118.112.24 - 217.118.112.39 at -217.118.112.40 - 217.118.112.47 gb -217.118.112.48 - 217.118.112.63 at -217.118.112.64 - 217.118.112.127 gb -217.118.112.128 - 217.118.112.255 at -217.118.113.0 - 217.118.113.31 gb -217.118.113.32 - 217.118.113.199 es -217.118.113.200 - 217.118.113.207 ch -217.118.113.208 - 217.118.113.223 gb -217.118.113.224 - 217.118.113.255 es -217.118.114.0 - 217.118.117.255 gb -217.118.118.0 - 217.118.118.127 fr -217.118.118.128 - 217.118.118.191 it -217.118.118.192 - 217.118.118.255 es -217.118.119.0 - 217.118.119.255 gb -217.118.120.0 - 217.118.120.61 be -217.118.120.62 - 217.118.120.63 gb -217.118.120.64 - 217.118.120.127 be -217.118.120.128 - 217.118.120.255 gb -217.118.121.0 - 217.118.121.255 nl -217.118.122.0 - 217.118.123.255 gb -217.118.124.0 - 217.118.124.255 us -217.118.125.0 - 217.118.125.255 gb -217.118.126.0 - 217.118.126.255 de -217.118.127.0 - 217.118.127.255 ch -217.118.128.0 - 217.118.143.255 gb +217.118.112.0 - 217.118.120.63 gb +217.118.120.64 - 217.118.120.95 be +217.118.120.96 - 217.118.143.255 gb 217.118.144.0 - 217.118.159.255 it -217.118.160.0 - 217.118.167.255 nl -217.118.168.0 - 217.118.171.255 de -217.118.172.0 - 217.118.175.255 nl +217.118.160.0 - 217.118.175.255 nl 217.118.176.0 - 217.118.191.255 ru 217.118.192.0 - 217.118.207.255 ch 217.118.208.0 - 217.118.223.255 se -217.118.224.0 - 217.118.226.79 fr -217.118.226.80 - 217.118.226.87 es -217.118.226.88 - 217.118.234.95 fr -217.118.234.96 - 217.118.234.111 es -217.118.234.112 - 217.118.239.255 fr +217.118.224.0 - 217.118.239.255 fr 217.118.240.0 - 217.118.255.255 it 217.119.0.0 - 217.119.15.255 nl 217.119.16.0 - 217.119.31.255 ru -217.119.32.0 - 217.119.41.103 fi -217.119.41.104 - 217.119.41.119 ax -217.119.41.120 - 217.119.43.159 fi -217.119.43.160 - 217.119.43.191 ax -217.119.43.192 - 217.119.47.255 fi -217.119.48.0 - 217.119.57.47 de -217.119.57.48 - 217.119.57.63 at -217.119.57.64 - 217.119.63.255 de +217.119.32.0 - 217.119.47.255 fi +217.119.48.0 - 217.119.63.255 de 217.119.64.0 - 217.119.79.255 pl 217.119.80.0 - 217.119.95.255 ru 217.119.96.0 - 217.119.111.255 ch @@ -156553,53 +115395,36 @@ 217.119.176.0 - 217.119.191.255 fr 217.119.192.0 - 217.119.223.255 de 217.119.224.0 - 217.119.239.255 nl -217.119.240.0 - 217.119.255.255 rs -217.120.0.0 - 217.123.255.255 nl +217.119.240.0 - 217.119.251.255 rs +217.119.252.0 - 217.119.255.255 mk +217.120.0.0 - 217.123.118.221 nl +217.123.118.222 - 217.123.118.222 us +217.123.118.223 - 217.123.255.255 nl 217.124.0.0 - 217.127.255.255 es 217.128.0.0 - 217.128.255.255 fr 217.129.0.0 - 217.129.255.255 pt 217.130.0.0 - 217.130.255.255 es 217.131.0.0 - 217.131.255.255 tr 217.132.0.0 - 217.132.255.255 il -217.133.0.0 - 217.133.169.15 it -217.133.169.16 - 217.133.169.31 a2 -217.133.169.32 - 217.133.176.63 it -217.133.176.64 - 217.133.176.71 a2 -217.133.176.72 - 217.133.255.255 it +217.133.0.0 - 217.133.255.255 it 217.134.0.0 - 217.135.34.255 gb 217.135.35.0 - 217.135.35.255 fr 217.135.36.0 - 217.135.255.255 gb 217.136.0.0 - 217.136.255.255 be -217.137.0.0 - 217.138.1.63 gb -217.138.1.64 - 217.138.1.151 us -217.138.1.152 - 217.138.1.155 bb -217.138.1.156 - 217.138.1.191 us -217.138.1.192 - 217.138.3.255 gb -217.138.4.0 - 217.138.4.255 us -217.138.5.0 - 217.138.34.247 gb -217.138.34.248 - 217.138.35.255 gd -217.138.36.0 - 217.138.36.231 gb -217.138.36.232 - 217.138.36.239 bb -217.138.36.240 - 217.138.36.255 ag -217.138.37.0 - 217.138.38.247 gb -217.138.38.248 - 217.138.38.255 tt -217.138.39.0 - 217.138.255.255 gb +217.137.0.0 - 217.138.255.255 gb 217.139.0.0 - 217.139.255.255 eg -217.140.0.0 - 217.140.15.255 nl -217.140.16.0 - 217.140.27.255 es -217.140.28.0 - 217.140.31.255 nl +217.140.0.0 - 217.140.0.255 nl +217.140.1.0 - 217.140.1.255 eu +217.140.2.0 - 217.140.15.255 nl +217.140.16.0 - 217.140.23.255 es +217.140.24.0 - 217.140.31.255 nl 217.140.32.0 - 217.140.35.255 gb -217.140.36.0 - 217.140.36.255 nl -217.140.37.0 - 217.140.48.255 gb -217.140.49.0 - 217.140.55.255 nl -217.140.56.0 - 217.140.57.255 gb -217.140.58.0 - 217.140.62.255 nl -217.140.63.0 - 217.140.63.255 gb -217.140.64.0 - 217.140.95.255 de -217.140.96.0 - 217.140.99.255 gb -217.140.100.0 - 217.140.101.255 us -217.140.102.0 - 217.140.103.255 gb -217.140.104.0 - 217.140.105.255 jp +217.140.36.0 - 217.140.39.255 nl +217.140.40.0 - 217.140.47.255 gb +217.140.48.0 - 217.140.66.9 nl +217.140.66.10 - 217.140.95.255 de +217.140.96.0 - 217.140.104.255 gb +217.140.105.0 - 217.140.105.255 in 217.140.106.0 - 217.140.109.255 gb 217.140.110.0 - 217.140.111.255 us 217.140.112.0 - 217.140.127.255 se @@ -156614,18 +115439,16 @@ 217.144.80.0 - 217.144.95.255 gb 217.144.96.0 - 217.144.111.255 ru 217.144.112.0 - 217.144.127.255 fr -217.144.128.0 - 217.144.143.79 de -217.144.143.80 - 217.144.143.87 ie -217.144.143.88 - 217.144.143.255 de +217.144.128.0 - 217.144.143.255 de 217.144.144.0 - 217.144.159.255 gb 217.144.160.0 - 217.144.191.255 ru 217.144.192.0 - 217.144.223.255 pl -217.144.224.0 - 217.144.255.255 no +217.144.224.0 - 217.144.242.255 no +217.144.243.0 - 217.144.243.255 eu +217.144.244.0 - 217.144.255.255 no 217.145.0.0 - 217.145.15.255 mt 217.145.16.0 - 217.145.31.255 ru -217.145.32.0 - 217.145.35.255 be -217.145.36.0 - 217.145.36.255 lu -217.145.37.0 - 217.145.47.255 be +217.145.32.0 - 217.145.47.255 be 217.145.48.0 - 217.145.63.255 dk 217.145.64.0 - 217.145.79.255 gb 217.145.80.0 - 217.145.95.255 bg @@ -156636,113 +115459,67 @@ 217.145.176.0 - 217.145.191.255 es 217.145.192.0 - 217.145.207.255 sk 217.145.208.0 - 217.145.223.255 lv -217.145.224.0 - 217.145.239.255 gb 217.145.240.0 - 217.145.255.255 sa -217.146.0.0 - 217.146.15.255 a2 -217.146.16.0 - 217.146.17.255 us -217.146.18.0 - 217.146.18.255 a2 -217.146.19.0 - 217.146.31.255 us -217.146.32.0 - 217.146.35.255 ru -217.146.36.0 - 217.146.36.255 cy -217.146.37.0 - 217.146.47.255 ru +217.146.0.0 - 217.146.0.255 th +217.146.1.0 - 217.146.1.255 es +217.146.2.0 - 217.146.2.255 ua +217.146.3.0 - 217.146.3.255 fr +217.146.4.0 - 217.146.4.255 hu +217.146.5.0 - 217.146.5.255 br +217.146.6.0 - 217.146.7.255 tr +217.146.8.0 - 217.146.8.255 rs +217.146.9.0 - 217.146.9.255 sg +217.146.10.0 - 217.146.12.255 in +217.146.13.0 - 217.146.13.255 pl +217.146.14.0 - 217.146.14.255 pt +217.146.15.0 - 217.146.15.255 ar +217.146.16.0 - 217.146.16.255 hk +217.146.17.0 - 217.146.20.255 at +217.146.21.0 - 217.146.21.255 lu +217.146.22.0 - 217.146.24.255 de +217.146.25.0 - 217.146.27.255 at +217.146.28.0 - 217.146.28.255 ar +217.146.29.0 - 217.146.29.255 gb +217.146.30.0 - 217.146.30.255 de +217.146.31.0 - 217.146.31.255 se +217.146.32.0 - 217.146.47.255 ru 217.146.48.0 - 217.146.63.255 gb 217.146.64.0 - 217.146.79.255 ee 217.146.80.0 - 217.146.127.255 gb 217.146.128.0 - 217.146.159.255 de -217.146.160.0 - 217.146.161.215 ch -217.146.161.216 - 217.146.161.227 de -217.146.161.228 - 217.146.175.255 ch -217.146.176.0 - 217.146.191.47 gb -217.146.191.48 - 217.146.191.255 ir +217.146.160.0 - 217.146.175.255 ch +217.146.176.0 - 217.146.191.255 gb 217.146.192.0 - 217.146.207.255 it 217.146.208.0 - 217.146.223.255 ir 217.146.224.0 - 217.146.239.255 fr 217.146.240.0 - 217.146.255.255 ua 217.147.0.0 - 217.147.31.255 ru 217.147.32.0 - 217.147.47.255 lt -217.147.48.0 - 217.147.66.215 de -217.147.66.216 - 217.147.66.219 ge -217.147.66.220 - 217.147.67.191 de -217.147.67.192 - 217.147.67.194 gb -217.147.67.195 - 217.147.79.255 de +217.147.48.0 - 217.147.68.31 de +217.147.68.32 - 217.147.68.62 gb +217.147.68.63 - 217.147.79.255 de 217.147.80.0 - 217.147.95.255 gb -217.147.96.0 - 217.147.100.7 de -217.147.100.8 - 217.147.100.8 be -217.147.100.9 - 217.147.105.167 de -217.147.105.168 - 217.147.105.171 fr -217.147.105.172 - 217.147.111.255 de -217.147.112.0 - 217.147.119.255 gi -217.147.120.0 - 217.147.127.255 gb -217.147.128.0 - 217.147.131.127 it -217.147.131.128 - 217.147.131.159 sz -217.147.131.160 - 217.147.159.255 it +217.147.96.0 - 217.147.103.255 de +217.147.104.0 - 217.147.104.255 eu +217.147.105.0 - 217.147.111.255 de +217.147.112.0 - 217.147.127.255 gi +217.147.128.0 - 217.147.159.255 it 217.147.160.0 - 217.147.175.255 ua 217.147.176.0 - 217.147.191.255 gb 217.147.192.0 - 217.147.207.255 fr -217.147.208.0 - 217.147.214.15 ch -217.147.214.16 - 217.147.214.31 at -217.147.214.32 - 217.147.214.111 ch -217.147.214.112 - 217.147.214.127 at -217.147.214.128 - 217.147.215.175 ch -217.147.215.176 - 217.147.215.207 pt -217.147.215.208 - 217.147.219.159 ch -217.147.219.160 - 217.147.219.175 at -217.147.219.176 - 217.147.219.207 ch -217.147.219.208 - 217.147.219.223 pt -217.147.219.224 - 217.147.220.223 ch -217.147.220.224 - 217.147.220.255 im -217.147.221.0 - 217.147.223.255 ch +217.147.208.0 - 217.147.223.255 ch 217.147.224.0 - 217.147.239.255 ge -217.147.240.0 - 217.147.242.255 gb -217.147.243.0 - 217.147.243.7 nl -217.147.243.8 - 217.147.243.15 it -217.147.243.16 - 217.147.243.31 gb -217.147.243.32 - 217.147.243.39 fr -217.147.243.40 - 217.147.243.47 se -217.147.243.48 - 217.147.243.55 dk -217.147.243.56 - 217.147.243.63 de -217.147.243.64 - 217.147.243.71 pl -217.147.243.72 - 217.147.243.79 es -217.147.243.80 - 217.147.243.87 be -217.147.243.88 - 217.147.243.95 za -217.147.243.96 - 217.147.243.103 pt -217.147.243.104 - 217.147.243.111 fi -217.147.243.112 - 217.147.243.119 no -217.147.243.120 - 217.147.243.127 hu -217.147.243.128 - 217.147.243.135 gb -217.147.243.136 - 217.147.243.143 ie -217.147.243.144 - 217.147.243.255 gb -217.147.244.0 - 217.147.244.119 de -217.147.244.120 - 217.147.244.127 ie -217.147.244.128 - 217.147.244.135 gb -217.147.244.136 - 217.147.244.143 de -217.147.244.144 - 217.147.244.151 nl -217.147.244.152 - 217.147.244.159 it -217.147.244.160 - 217.147.244.167 fr -217.147.244.168 - 217.147.244.175 se -217.147.244.176 - 217.147.244.183 dk -217.147.244.184 - 217.147.244.191 de -217.147.244.192 - 217.147.244.199 pl -217.147.244.200 - 217.147.244.207 es -217.147.244.208 - 217.147.244.215 be -217.147.244.216 - 217.147.244.223 za -217.147.244.224 - 217.147.244.231 pt -217.147.244.232 - 217.147.244.239 fi -217.147.244.240 - 217.147.244.247 nl -217.147.244.248 - 217.147.244.255 hu -217.147.245.0 - 217.147.246.255 de -217.147.247.0 - 217.147.255.255 gb +217.147.240.0 - 217.147.244.136 gb +217.147.244.137 - 217.147.244.137 de +217.147.244.138 - 217.147.255.255 gb 217.148.0.0 - 217.148.15.255 ch -217.148.16.0 - 217.148.21.127 nl -217.148.21.128 - 217.148.21.255 be -217.148.22.0 - 217.148.31.255 nl +217.148.16.0 - 217.148.31.255 nl 217.148.32.0 - 217.148.47.255 gb 217.148.48.0 - 217.148.63.255 ru 217.148.64.0 - 217.148.79.255 es 217.148.80.0 - 217.148.95.255 nl 217.148.96.0 - 217.148.103.255 de 217.148.104.0 - 217.148.127.255 it -217.148.128.0 - 217.148.143.255 de 217.148.144.0 - 217.148.159.255 no 217.148.160.0 - 217.148.191.255 nl 217.148.192.0 - 217.148.223.255 ru @@ -156750,9 +115527,11 @@ 217.148.240.0 - 217.148.255.255 be 217.149.0.0 - 217.149.15.255 es 217.149.16.0 - 217.149.31.255 ru -217.149.32.0 - 217.149.45.175 nl -217.149.45.176 - 217.149.45.191 de -217.149.45.192 - 217.149.47.255 nl +217.149.32.0 - 217.149.35.18 nl +217.149.35.19 - 217.149.35.19 eu +217.149.35.20 - 217.149.43.255 nl +217.149.44.0 - 217.149.44.255 eu +217.149.45.0 - 217.149.47.255 nl 217.149.48.0 - 217.149.63.255 fi 217.149.64.0 - 217.149.79.255 nl 217.149.80.0 - 217.149.95.255 it @@ -156764,16 +115543,16 @@ 217.149.176.0 - 217.149.191.255 ru 217.149.192.0 - 217.149.223.255 nl 217.149.224.0 - 217.149.239.255 at -217.149.240.0 - 217.149.249.159 pl -217.149.249.160 - 217.149.249.191 us -217.149.249.192 - 217.149.255.255 pl +217.149.240.0 - 217.149.255.255 pl 217.150.0.0 - 217.150.63.255 ru -217.150.64.0 - 217.150.95.255 se +217.150.64.0 - 217.150.71.255 se +217.150.72.0 - 217.150.79.255 ru +217.150.80.0 - 217.150.87.255 lb +217.150.88.0 - 217.150.95.255 nl 217.150.96.0 - 217.150.127.255 gb 217.150.128.0 - 217.150.143.255 hu 217.150.144.0 - 217.150.159.255 de -217.150.160.0 - 217.150.189.255 se -217.150.190.0 - 217.150.191.255 nl +217.150.160.0 - 217.150.191.255 se 217.150.192.0 - 217.150.207.255 ru 217.150.208.0 - 217.150.223.255 es 217.150.224.0 - 217.150.255.255 ch @@ -156782,146 +115561,76 @@ 217.151.32.0 - 217.151.47.255 gb 217.151.48.0 - 217.151.63.255 se 217.151.64.0 - 217.151.79.255 ru -217.151.80.0 - 217.151.95.255 de +217.151.80.0 - 217.151.90.255 de +217.151.91.0 - 217.151.91.63 at +217.151.91.64 - 217.151.95.255 de 217.151.96.0 - 217.151.111.255 gb 217.151.112.0 - 217.151.127.255 ch 217.151.128.0 - 217.151.143.255 ru 217.151.144.0 - 217.151.159.255 de 217.151.160.0 - 217.151.191.255 is 217.151.192.0 - 217.151.207.255 se -217.151.208.0 - 217.151.224.127 de -217.151.224.128 - 217.151.224.159 cy -217.151.224.160 - 217.151.224.255 de -217.151.225.0 - 217.151.225.31 iq -217.151.225.32 - 217.151.225.39 kz -217.151.225.40 - 217.151.225.47 ru -217.151.225.48 - 217.151.225.255 de -217.151.226.0 - 217.151.226.255 kz -217.151.227.0 - 217.151.227.255 ru -217.151.228.0 - 217.151.229.255 kz -217.151.230.0 - 217.151.230.255 ru -217.151.231.0 - 217.151.233.255 de -217.151.234.0 - 217.151.237.255 kz -217.151.238.0 - 217.151.255.255 de -217.152.0.0 - 217.152.7.139 fi -217.152.7.140 - 217.152.7.143 ax -217.152.7.144 - 217.152.14.95 fi -217.152.14.96 - 217.152.14.99 ax -217.152.14.100 - 217.152.255.255 fi +217.151.208.0 - 217.151.227.255 de +217.151.228.0 - 217.151.233.255 ru +217.151.234.0 - 217.151.234.70 lb +217.151.234.71 - 217.151.234.71 ru +217.151.234.72 - 217.151.234.123 lb +217.151.234.124 - 217.151.234.124 ru +217.151.234.125 - 217.151.234.154 lb +217.151.234.155 - 217.151.234.155 ru +217.151.234.156 - 217.151.234.208 lb +217.151.234.209 - 217.151.234.209 ru +217.151.234.210 - 217.151.234.235 lb +217.151.234.236 - 217.151.234.236 ru +217.151.234.237 - 217.151.234.255 lb +217.151.235.0 - 217.151.239.255 ru +217.151.240.0 - 217.151.255.255 de +217.152.0.0 - 217.152.255.255 fi 217.153.0.0 - 217.153.255.255 pl -217.154.0.0 - 217.154.159.255 gb -217.154.160.0 - 217.154.162.255 nl -217.154.163.0 - 217.155.51.87 gb -217.155.51.88 - 217.155.51.95 a2 -217.155.51.96 - 217.155.255.255 gb +217.154.0.0 - 217.155.255.255 gb 217.156.0.0 - 217.156.127.255 ro -217.156.128.0 - 217.156.129.127 gb -217.156.129.128 - 217.156.129.159 fr -217.156.129.160 - 217.156.170.95 gb -217.156.170.96 - 217.156.170.127 fr -217.156.170.128 - 217.156.183.255 gb +217.156.128.0 - 217.156.144.41 gb +217.156.144.42 - 217.156.144.42 fr +217.156.144.43 - 217.156.150.255 gb +217.156.151.0 - 217.156.151.255 ch +217.156.152.0 - 217.156.160.255 gb +217.156.161.0 - 217.156.161.255 gr +217.156.162.0 - 217.156.162.31 gb +217.156.162.32 - 217.156.162.47 il +217.156.162.48 - 217.156.162.127 gb +217.156.162.128 - 217.156.162.255 gr +217.156.163.0 - 217.156.169.47 gb +217.156.169.48 - 217.156.169.63 fr +217.156.169.64 - 217.156.183.255 gb 217.156.184.0 - 217.156.195.255 es -217.156.196.0 - 217.156.204.255 gb -217.156.205.0 - 217.156.205.255 es -217.156.206.0 - 217.156.255.255 gb +217.156.196.0 - 217.156.196.167 gb +217.156.196.168 - 217.156.196.175 dk +217.156.196.176 - 217.156.196.183 be +217.156.196.184 - 217.156.196.191 fr +217.156.196.192 - 217.156.196.199 de +217.156.196.200 - 217.156.196.207 je +217.156.196.208 - 217.156.196.215 nl +217.156.196.216 - 217.156.196.223 it +217.156.196.224 - 217.156.196.231 lu +217.156.196.232 - 217.156.196.239 es +217.156.196.240 - 217.156.196.247 se +217.156.196.248 - 217.156.196.255 ch +217.156.197.0 - 217.156.208.207 gb +217.156.208.208 - 217.156.208.239 it +217.156.208.240 - 217.156.234.215 gb +217.156.234.216 - 217.156.234.223 tr +217.156.234.224 - 217.156.255.255 gb 217.157.0.0 - 217.157.255.255 dk 217.158.0.0 - 217.158.255.255 gb -217.159.0.0 - 217.159.4.255 de -217.159.5.0 - 217.159.6.255 gb -217.159.7.0 - 217.159.7.255 ie -217.159.8.0 - 217.159.8.255 es -217.159.9.0 - 217.159.9.255 ie -217.159.10.0 - 217.159.10.127 es -217.159.10.128 - 217.159.10.255 de -217.159.11.0 - 217.159.14.127 gb -217.159.14.128 - 217.159.14.255 es -217.159.15.0 - 217.159.15.255 de -217.159.16.0 - 217.159.18.127 gb -217.159.18.128 - 217.159.19.255 de -217.159.20.0 - 217.159.21.255 gb -217.159.22.0 - 217.159.22.255 at -217.159.23.0 - 217.159.23.255 de -217.159.24.0 - 217.159.25.255 gb -217.159.26.0 - 217.159.26.255 ie -217.159.27.0 - 217.159.28.255 gb -217.159.29.0 - 217.159.29.255 de -217.159.30.0 - 217.159.30.255 ie -217.159.31.0 - 217.159.32.255 fr -217.159.33.0 - 217.159.33.255 ie -217.159.34.0 - 217.159.35.255 es -217.159.36.0 - 217.159.36.255 fr -217.159.37.0 - 217.159.38.255 de -217.159.39.0 - 217.159.39.255 ie -217.159.40.0 - 217.159.40.127 de -217.159.40.128 - 217.159.40.255 ie -217.159.41.0 - 217.159.41.127 gr -217.159.41.128 - 217.159.41.255 de -217.159.42.0 - 217.159.42.255 fr -217.159.43.0 - 217.159.44.255 es -217.159.45.0 - 217.159.45.255 gb -217.159.46.0 - 217.159.46.255 de -217.159.47.0 - 217.159.47.255 ie -217.159.48.0 - 217.159.48.255 gr -217.159.49.0 - 217.159.57.79 de -217.159.57.80 - 217.159.57.87 gb -217.159.57.88 - 217.159.57.231 de -217.159.57.232 - 217.159.58.15 ie -217.159.58.16 - 217.159.85.255 de -217.159.86.0 - 217.159.86.255 ie -217.159.87.0 - 217.159.87.255 fr -217.159.88.0 - 217.159.98.255 de -217.159.99.0 - 217.159.99.255 fr -217.159.100.0 - 217.159.100.255 ch -217.159.101.0 - 217.159.101.255 fr -217.159.102.0 - 217.159.103.255 de -217.159.104.0 - 217.159.104.255 gb -217.159.105.0 - 217.159.105.255 sl -217.159.106.0 - 217.159.106.255 it -217.159.107.0 - 217.159.107.255 fr -217.159.108.0 - 217.159.108.255 it -217.159.109.0 - 217.159.110.255 de -217.159.111.0 - 217.159.111.255 pl -217.159.112.0 - 217.159.114.255 de -217.159.115.0 - 217.159.115.255 it -217.159.116.0 - 217.159.116.255 es -217.159.117.0 - 217.159.118.255 gb -217.159.119.0 - 217.159.119.255 ie -217.159.120.0 - 217.159.121.255 de -217.159.122.0 - 217.159.122.255 gb -217.159.123.0 - 217.159.123.255 nl -217.159.124.0 - 217.159.124.127 gb -217.159.124.128 - 217.159.125.255 ie -217.159.126.0 - 217.159.126.127 nl -217.159.126.128 - 217.159.126.191 es -217.159.126.192 - 217.159.127.255 de +217.159.0.0 - 217.159.127.255 de 217.159.128.0 - 217.159.255.255 ee -217.160.0.0 - 217.160.123.255 de -217.160.124.0 - 217.160.124.255 es -217.160.125.0 - 217.160.223.255 de -217.160.224.0 - 217.160.224.255 gb -217.160.225.0 - 217.160.225.255 es -217.160.226.0 - 217.160.226.255 gb -217.160.227.0 - 217.160.228.255 es -217.160.229.0 - 217.160.231.255 pl -217.160.232.0 - 217.160.232.255 es -217.160.233.0 - 217.160.233.255 pl -217.160.234.0 - 217.160.234.255 es -217.160.235.0 - 217.160.235.127 fr -217.160.235.128 - 217.160.235.255 es -217.160.236.0 - 217.160.236.127 fr -217.160.236.128 - 217.160.236.255 gb -217.160.237.0 - 217.160.238.255 es -217.160.239.0 - 217.160.241.255 gb -217.160.242.0 - 217.160.242.255 fr -217.160.243.0 - 217.160.243.255 de -217.160.244.0 - 217.160.244.127 es -217.160.244.128 - 217.160.244.255 de -217.160.245.0 - 217.160.245.255 pl -217.160.246.0 - 217.160.247.255 es -217.160.248.0 - 217.160.248.255 gb -217.160.249.0 - 217.160.251.255 es -217.160.252.0 - 217.160.252.255 pl -217.160.253.0 - 217.160.255.255 de +217.160.0.0 - 217.160.43.255 de +217.160.44.0 - 217.160.47.255 gb +217.160.48.0 - 217.160.103.255 de +217.160.104.0 - 217.160.106.255 es +217.160.107.0 - 217.160.197.255 de +217.160.198.0 - 217.160.201.255 gb +217.160.202.0 - 217.160.255.255 de 217.161.0.0 - 217.161.0.31 gb 217.161.0.32 - 217.161.0.55 eu 217.161.0.56 - 217.161.0.127 gb @@ -156948,7 +115657,9 @@ 217.161.40.128 - 217.161.47.255 eu 217.161.48.0 - 217.161.49.255 us 217.161.50.0 - 217.161.51.159 eu -217.161.51.160 - 217.161.51.255 gb +217.161.51.160 - 217.161.51.191 gb +217.161.51.192 - 217.161.51.207 eu +217.161.51.208 - 217.161.51.255 gb 217.161.52.0 - 217.161.55.255 eu 217.161.56.0 - 217.161.56.191 gb 217.161.56.192 - 217.161.63.255 eu @@ -156967,43 +115678,31 @@ 217.161.98.64 - 217.161.98.127 gb 217.161.98.128 - 217.161.98.191 eu 217.161.98.192 - 217.161.98.255 gb -217.161.99.0 - 217.161.103.255 eu -217.161.104.0 - 217.161.104.63 gb -217.161.104.64 - 217.161.112.191 eu -217.161.112.192 - 217.161.112.223 gb -217.161.112.224 - 217.161.115.255 eu -217.161.116.0 - 217.161.118.255 sc -217.161.119.0 - 217.161.119.255 eu -217.161.120.0 - 217.161.121.255 sc -217.161.122.0 - 217.161.127.255 eu +217.161.99.0 - 217.161.117.255 eu +217.161.118.0 - 217.161.118.255 sc +217.161.119.0 - 217.161.127.255 eu 217.161.128.0 - 217.161.255.255 gb 217.162.0.0 - 217.162.255.255 ch -217.163.0.0 - 217.163.255.255 gb +217.163.0.0 - 217.163.48.255 gb +217.163.49.0 - 217.163.49.255 eu +217.163.50.0 - 217.163.57.255 gb +217.163.58.0 - 217.163.58.255 fr +217.163.59.0 - 217.163.87.255 gb +217.163.88.0 - 217.163.88.255 de +217.163.89.0 - 217.163.255.255 gb 217.164.0.0 - 217.165.255.255 ae 217.166.0.0 - 217.166.255.255 nl -217.167.0.0 - 217.167.141.216 fr -217.167.141.217 - 217.167.141.217 gb -217.167.141.218 - 217.167.255.255 fr +217.167.0.0 - 217.167.255.255 fr 217.168.0.0 - 217.168.15.255 es 217.168.16.0 - 217.168.31.255 gb 217.168.32.0 - 217.168.63.255 ch 217.168.64.0 - 217.168.79.255 ru 217.168.80.0 - 217.168.95.255 no 217.168.96.0 - 217.168.111.255 fr -217.168.112.0 - 217.168.112.255 pt -217.168.113.0 - 217.168.113.127 ng -217.168.113.128 - 217.168.113.255 pt -217.168.114.0 - 217.168.114.255 cv -217.168.115.0 - 217.168.116.255 ao -217.168.117.0 - 217.168.117.255 pt -217.168.118.0 - 217.168.118.255 ao -217.168.119.0 - 217.168.119.255 pt -217.168.120.0 - 217.168.127.255 ao +217.168.112.0 - 217.168.127.255 pt 217.168.128.0 - 217.168.143.255 pl 217.168.144.0 - 217.168.159.255 gb -217.168.160.0 - 217.168.171.95 mt -217.168.171.96 - 217.168.171.111 cy -217.168.171.112 - 217.168.175.255 mt +217.168.160.0 - 217.168.175.255 mt 217.168.176.0 - 217.168.191.255 az 217.168.192.0 - 217.168.207.255 pl 217.168.208.0 - 217.168.223.255 cz @@ -157013,9 +115712,7 @@ 217.169.64.0 - 217.169.79.255 fi 217.169.80.0 - 217.169.95.255 ru 217.169.96.0 - 217.169.127.255 it -217.169.128.0 - 217.169.129.199 ch -217.169.129.200 - 217.169.129.207 fr -217.169.129.208 - 217.169.159.255 ch +217.169.128.0 - 217.169.159.255 ch 217.169.160.0 - 217.169.175.255 gb 217.169.176.0 - 217.169.191.255 cz 217.169.192.0 - 217.169.207.255 tr @@ -157038,207 +115735,55 @@ 217.171.16.0 - 217.171.31.255 fr 217.171.32.0 - 217.171.47.255 it 217.171.48.0 - 217.171.63.255 pl -217.171.64.0 - 217.171.79.255 ru -217.171.80.0 - 217.171.91.47 cd -217.171.91.48 - 217.171.91.71 be -217.171.91.72 - 217.171.91.75 cd -217.171.91.76 - 217.171.91.79 be -217.171.91.80 - 217.171.91.103 cd -217.171.91.104 - 217.171.91.255 be -217.171.92.0 - 217.171.93.11 cd -217.171.93.12 - 217.171.93.43 be -217.171.93.44 - 217.171.93.47 cd -217.171.93.48 - 217.171.93.55 be -217.171.93.56 - 217.171.93.59 cd -217.171.93.60 - 217.171.93.71 be -217.171.93.72 - 217.171.93.79 cd -217.171.93.80 - 217.171.93.87 be -217.171.93.88 - 217.171.93.91 cd -217.171.93.92 - 217.171.93.99 be -217.171.93.100 - 217.171.93.115 cd -217.171.93.116 - 217.171.93.119 be -217.171.93.120 - 217.171.93.123 cd -217.171.93.124 - 217.171.93.127 be -217.171.93.128 - 217.171.93.135 cd -217.171.93.136 - 217.171.93.143 be -217.171.93.144 - 217.171.93.159 cd -217.171.93.160 - 217.171.93.175 be -217.171.93.176 - 217.171.93.207 cd -217.171.93.208 - 217.171.93.255 be -217.171.94.0 - 217.171.94.255 cd -217.171.95.0 - 217.171.95.255 be +217.171.64.0 - 217.171.79.255 it +217.171.80.0 - 217.171.84.255 cd +217.171.85.0 - 217.171.91.15 be +217.171.91.16 - 217.171.91.19 cd +217.171.91.20 - 217.171.95.255 be 217.171.96.0 - 217.171.111.255 gb 217.171.112.0 - 217.171.127.255 de 217.171.128.0 - 217.171.143.255 gb 217.171.144.0 - 217.171.159.255 ru 217.171.160.0 - 217.171.175.255 it -217.171.176.0 - 217.171.177.255 iq -217.171.178.0 - 217.171.180.255 ae -217.171.181.0 - 217.171.181.127 iq -217.171.181.128 - 217.171.182.191 de -217.171.182.192 - 217.171.182.255 iq -217.171.183.0 - 217.171.183.255 de -217.171.184.0 - 217.171.187.255 iq -217.171.188.0 - 217.171.188.127 de -217.171.188.128 - 217.171.189.255 iq -217.171.190.0 - 217.171.191.199 de -217.171.191.200 - 217.171.191.207 iq -217.171.191.208 - 217.171.191.219 de -217.171.191.220 - 217.171.191.223 ir -217.171.191.224 - 217.171.191.255 de +217.171.176.0 - 217.171.191.255 de 217.171.192.0 - 217.171.207.255 no 217.171.208.0 - 217.171.223.255 is -217.171.224.0 - 217.171.239.255 ru +217.171.224.0 - 217.171.231.255 nl +217.171.232.0 - 217.171.239.255 it 217.171.240.0 - 217.171.255.255 de 217.172.0.0 - 217.172.15.255 it 217.172.16.0 - 217.172.31.255 ru -217.172.32.0 - 217.172.39.127 de -217.172.39.128 - 217.172.39.159 gb -217.172.39.160 - 217.172.39.207 de -217.172.39.208 - 217.172.39.223 pl -217.172.39.224 - 217.172.42.127 de -217.172.42.128 - 217.172.42.143 nl -217.172.42.144 - 217.172.42.159 de -217.172.42.160 - 217.172.42.191 tr -217.172.42.192 - 217.172.42.255 de -217.172.43.0 - 217.172.43.15 se -217.172.43.16 - 217.172.43.63 de -217.172.43.64 - 217.172.43.79 pl -217.172.43.80 - 217.172.43.95 de -217.172.43.96 - 217.172.43.159 gb -217.172.43.160 - 217.172.43.191 de -217.172.43.192 - 217.172.43.223 it -217.172.43.224 - 217.172.43.255 pl -217.172.44.0 - 217.172.44.63 it -217.172.44.64 - 217.172.44.175 de -217.172.44.176 - 217.172.44.183 gb -217.172.44.184 - 217.172.44.191 de -217.172.44.192 - 217.172.44.199 ru -217.172.44.200 - 217.172.44.255 pl -217.172.45.0 - 217.172.45.63 de -217.172.45.64 - 217.172.45.127 es -217.172.45.128 - 217.172.45.143 de -217.172.45.144 - 217.172.45.159 pl -217.172.45.160 - 217.172.45.207 de -217.172.45.208 - 217.172.45.215 ru -217.172.45.216 - 217.172.47.255 de -217.172.48.0 - 217.172.48.31 tr -217.172.48.32 - 217.172.48.63 us -217.172.48.64 - 217.172.48.127 it -217.172.48.128 - 217.172.48.191 gb -217.172.48.192 - 217.172.49.31 de -217.172.49.32 - 217.172.49.63 bs -217.172.49.64 - 217.172.49.127 de -217.172.49.128 - 217.172.49.135 au -217.172.49.136 - 217.172.49.143 ru -217.172.49.144 - 217.172.49.191 de -217.172.49.192 - 217.172.49.255 es -217.172.50.0 - 217.172.50.63 gb -217.172.50.64 - 217.172.50.127 it -217.172.50.128 - 217.172.50.163 de -217.172.50.164 - 217.172.50.191 tr -217.172.50.192 - 217.172.50.223 de -217.172.50.224 - 217.172.50.255 gb -217.172.51.0 - 217.172.51.63 de -217.172.51.64 - 217.172.51.95 it -217.172.51.96 - 217.172.51.129 tr -217.172.51.130 - 217.172.53.63 de -217.172.53.64 - 217.172.53.127 it -217.172.53.128 - 217.172.56.255 de -217.172.57.0 - 217.172.57.63 gb -217.172.57.64 - 217.172.57.79 se -217.172.57.80 - 217.172.57.95 us -217.172.57.96 - 217.172.57.127 de -217.172.57.128 - 217.172.57.159 gb -217.172.57.160 - 217.172.63.255 de +217.172.32.0 - 217.172.34.255 de +217.172.35.0 - 217.172.38.255 fr +217.172.39.0 - 217.172.47.255 de +217.172.48.0 - 217.172.50.255 fr +217.172.51.0 - 217.172.63.255 de 217.172.64.0 - 217.172.79.255 es 217.172.80.0 - 217.172.95.255 fo 217.172.96.0 - 217.172.99.255 ir 217.172.100.0 - 217.172.103.255 ae -217.172.104.0 - 217.172.117.255 ir -217.172.118.0 - 217.172.119.255 ae -217.172.120.0 - 217.172.120.255 ir -217.172.121.0 - 217.172.127.255 ae +217.172.104.0 - 217.172.115.255 ir +217.172.116.0 - 217.172.119.255 ae +217.172.120.0 - 217.172.127.255 ir 217.172.128.0 - 217.172.143.255 gb 217.172.144.0 - 217.172.159.255 sk -217.172.160.0 - 217.172.191.255 de +217.172.160.0 - 217.172.170.29 de +217.172.170.30 - 217.172.170.30 tr +217.172.170.31 - 217.172.191.255 de 217.172.192.0 - 217.172.223.255 it 217.172.224.0 - 217.173.15.255 pl 217.173.16.0 - 217.173.31.255 ru 217.173.32.0 - 217.173.47.255 hu 217.173.48.0 - 217.173.63.255 gb -217.173.64.0 - 217.173.69.255 ru -217.173.70.0 - 217.173.70.255 it -217.173.71.0 - 217.173.79.255 ru +217.173.64.0 - 217.173.79.255 ru 217.173.80.0 - 217.173.95.255 sa -217.173.96.0 - 217.173.99.239 ie -217.173.99.240 - 217.173.99.255 gb -217.173.100.0 - 217.173.100.127 ie -217.173.100.128 - 217.173.100.135 gb -217.173.100.136 - 217.173.100.255 ie -217.173.101.0 - 217.173.101.15 gb -217.173.101.16 - 217.173.101.23 ie -217.173.101.24 - 217.173.101.31 gb -217.173.101.32 - 217.173.101.111 ie -217.173.101.112 - 217.173.101.127 gb -217.173.101.128 - 217.173.101.143 ie -217.173.101.144 - 217.173.101.159 gb -217.173.101.160 - 217.173.101.223 ie -217.173.101.224 - 217.173.101.231 gb -217.173.101.232 - 217.173.102.23 ie -217.173.102.24 - 217.173.102.27 gb -217.173.102.28 - 217.173.102.39 ie -217.173.102.40 - 217.173.102.47 gb -217.173.102.48 - 217.173.106.63 ie -217.173.106.64 - 217.173.106.127 de -217.173.106.128 - 217.173.108.167 ie -217.173.108.168 - 217.173.108.175 be -217.173.108.176 - 217.173.111.255 ie +217.173.96.0 - 217.173.111.255 ie 217.173.112.0 - 217.173.127.255 es -217.173.128.0 - 217.173.134.127 de -217.173.134.128 - 217.173.134.159 us -217.173.134.160 - 217.173.134.191 ch -217.173.134.192 - 217.173.135.63 de -217.173.135.64 - 217.173.135.95 es -217.173.135.96 - 217.173.148.255 de -217.173.149.0 - 217.173.149.255 us -217.173.150.0 - 217.173.152.255 de +217.173.128.0 - 217.173.152.255 de 217.173.153.0 - 217.173.156.255 nl -217.173.157.0 - 217.173.157.63 gd -217.173.157.64 - 217.173.157.95 nl -217.173.157.96 - 217.173.157.127 vg -217.173.157.128 - 217.173.157.143 tr -217.173.157.144 - 217.173.157.159 de -217.173.157.160 - 217.173.157.175 ch -217.173.157.176 - 217.173.157.191 nl -217.173.157.192 - 217.173.157.223 tr -217.173.157.224 - 217.173.157.255 nl -217.173.158.0 - 217.173.158.63 gd -217.173.158.64 - 217.173.158.95 tr -217.173.158.96 - 217.173.158.127 ch -217.173.158.128 - 217.173.158.159 nl -217.173.158.160 - 217.173.158.191 es -217.173.158.192 - 217.173.158.223 vg -217.173.158.224 - 217.173.159.63 gd -217.173.159.64 - 217.173.159.79 es -217.173.159.80 - 217.173.159.95 vg -217.173.159.96 - 217.173.159.255 gd +217.173.157.0 - 217.173.159.255 de 217.173.160.0 - 217.173.207.255 pl -217.173.208.0 - 217.173.221.95 ie -217.173.221.96 - 217.173.221.123 gb -217.173.221.124 - 217.173.221.151 ie -217.173.221.152 - 217.173.221.167 gb -217.173.221.168 - 217.173.222.67 ie -217.173.222.68 - 217.173.222.71 gb -217.173.222.72 - 217.173.222.95 ie -217.173.222.96 - 217.173.222.103 gb -217.173.222.104 - 217.173.222.135 ie -217.173.222.136 - 217.173.222.183 gb -217.173.222.184 - 217.173.222.187 ie -217.173.222.188 - 217.173.222.195 gb -217.173.222.196 - 217.173.222.199 ie -217.173.222.200 - 217.173.222.239 gb -217.173.222.240 - 217.173.223.255 ie +217.173.208.0 - 217.173.223.255 ie 217.173.224.0 - 217.173.239.255 li 217.173.240.0 - 217.173.255.255 no 217.174.0.0 - 217.174.15.255 ru @@ -157249,213 +115794,55 @@ 217.174.96.0 - 217.174.111.255 ru 217.174.112.0 - 217.174.143.255 it 217.174.144.0 - 217.174.159.255 bg -217.174.160.0 - 217.174.180.255 ru -217.174.181.0 - 217.174.181.63 us -217.174.181.64 - 217.174.191.255 ru +217.174.160.0 - 217.174.191.255 ru 217.174.192.0 - 217.174.223.255 fr 217.174.224.0 - 217.174.239.255 tm 217.174.240.0 - 217.174.255.255 gb 217.175.0.0 - 217.175.15.255 ua 217.175.16.0 - 217.175.47.255 ru 217.175.48.0 - 217.175.63.255 it -217.175.64.0 - 217.175.64.255 gb -217.175.65.0 - 217.175.70.255 a2 -217.175.71.0 - 217.175.72.255 gb -217.175.73.0 - 217.175.74.255 a2 -217.175.75.0 - 217.175.75.255 gb -217.175.76.0 - 217.175.76.255 ke -217.175.77.0 - 217.175.77.255 cm -217.175.78.0 - 217.175.78.255 gb -217.175.79.0 - 217.175.79.255 a2 +217.175.64.0 - 217.175.79.255 a2 217.175.80.0 - 217.175.95.255 ua 217.175.96.0 - 217.175.111.255 de 217.175.112.0 - 217.175.127.255 se 217.175.128.0 - 217.175.159.255 ru -217.175.160.0 - 217.175.191.255 fr +217.175.160.0 - 217.175.179.255 fr +217.175.180.0 - 217.175.180.255 mq +217.175.181.0 - 217.175.185.255 fr +217.175.186.0 - 217.175.186.255 re +217.175.187.0 - 217.175.191.255 fr 217.175.192.0 - 217.175.207.255 at 217.175.208.0 - 217.175.223.255 cy -217.175.224.0 - 217.175.225.255 de -217.175.226.0 - 217.175.226.255 at -217.175.227.0 - 217.175.241.223 de -217.175.241.224 - 217.175.241.255 ch -217.175.242.0 - 217.175.242.255 de -217.175.243.0 - 217.175.243.127 at -217.175.243.128 - 217.175.255.255 de +217.175.224.0 - 217.175.255.255 de 217.176.0.0 - 217.183.255.255 gb -217.184.0.0 - 217.188.32.207 de -217.188.32.208 - 217.188.32.215 fr -217.188.32.216 - 217.188.207.143 de -217.188.207.144 - 217.188.207.159 lu -217.188.207.160 - 217.188.215.47 de -217.188.215.48 - 217.188.215.55 lu -217.188.215.56 - 217.188.243.255 de -217.188.244.0 - 217.188.244.255 it -217.188.245.0 - 217.188.247.127 de -217.188.247.128 - 217.188.247.143 lu -217.188.247.144 - 217.191.255.255 de -217.192.0.0 - 217.193.116.125 ch -217.193.116.126 - 217.193.116.126 at -217.193.116.127 - 217.193.146.175 ch -217.193.146.176 - 217.193.146.183 at -217.193.146.184 - 217.193.255.255 ch +217.184.0.0 - 217.191.255.255 de +217.192.0.0 - 217.193.255.255 ch 217.194.0.0 - 217.194.15.255 it 217.194.16.0 - 217.194.31.255 nl -217.194.32.0 - 217.194.47.255 de +217.194.32.0 - 217.194.33.255 de +217.194.34.0 - 217.194.34.9 dk +217.194.34.10 - 217.194.34.10 de +217.194.34.11 - 217.194.34.95 dk +217.194.34.96 - 217.194.34.96 de +217.194.34.97 - 217.194.34.114 dk +217.194.34.115 - 217.194.34.115 eu +217.194.34.116 - 217.194.34.255 dk +217.194.35.0 - 217.194.47.255 de 217.194.48.0 - 217.194.63.255 ch 217.194.64.0 - 217.194.79.255 de 217.194.80.0 - 217.194.95.255 fr 217.194.96.0 - 217.194.127.255 nl -217.194.128.0 - 217.194.129.255 a2 -217.194.130.0 - 217.194.131.255 cd -217.194.132.0 - 217.194.132.255 zw -217.194.133.0 - 217.194.133.7 a2 -217.194.133.8 - 217.194.133.15 iq -217.194.133.16 - 217.194.133.23 a2 -217.194.133.24 - 217.194.133.27 ua -217.194.133.28 - 217.194.133.39 a2 -217.194.133.40 - 217.194.133.47 lb -217.194.133.48 - 217.194.133.55 iq -217.194.133.56 - 217.194.133.63 mw -217.194.133.64 - 217.194.133.71 ng -217.194.133.72 - 217.194.133.79 a2 -217.194.133.80 - 217.194.133.95 ua -217.194.133.96 - 217.194.133.104 lb -217.194.133.105 - 217.194.133.111 zm -217.194.133.112 - 217.194.133.135 a2 -217.194.133.136 - 217.194.133.143 iq -217.194.133.144 - 217.194.133.159 a2 -217.194.133.160 - 217.194.133.167 lb -217.194.133.168 - 217.194.133.175 ao -217.194.133.176 - 217.194.133.183 ua -217.194.133.184 - 217.194.133.223 a2 -217.194.133.224 - 217.194.133.231 rs -217.194.133.232 - 217.194.133.255 a2 -217.194.134.0 - 217.194.134.255 at -217.194.135.0 - 217.194.135.127 a2 -217.194.135.128 - 217.194.135.143 ng -217.194.135.144 - 217.194.135.223 a2 -217.194.135.224 - 217.194.135.239 ua -217.194.135.240 - 217.194.135.255 a2 -217.194.136.0 - 217.194.136.7 tr -217.194.136.8 - 217.194.136.35 a2 -217.194.136.36 - 217.194.136.41 iq -217.194.136.42 - 217.194.136.47 a2 -217.194.136.48 - 217.194.136.63 lb -217.194.136.64 - 217.194.136.151 a2 -217.194.136.152 - 217.194.136.159 lb -217.194.136.160 - 217.194.136.175 ng -217.194.136.176 - 217.194.136.183 a2 -217.194.136.184 - 217.194.136.191 sl -217.194.136.192 - 217.194.136.231 a2 -217.194.136.232 - 217.194.136.239 iq -217.194.136.240 - 217.194.136.247 ly -217.194.136.248 - 217.194.137.31 a2 -217.194.137.32 - 217.194.137.47 ua -217.194.137.48 - 217.194.137.111 a2 -217.194.137.112 - 217.194.137.119 lb -217.194.137.120 - 217.194.137.127 iq -217.194.137.128 - 217.194.137.135 a2 -217.194.137.136 - 217.194.137.143 iq -217.194.137.144 - 217.194.137.167 a2 -217.194.137.168 - 217.194.137.175 ng -217.194.137.176 - 217.194.137.207 a2 -217.194.137.208 - 217.194.137.215 cd -217.194.137.216 - 217.194.137.239 a2 -217.194.137.240 - 217.194.137.255 ua -217.194.138.0 - 217.194.138.255 at -217.194.139.0 - 217.194.145.39 a2 -217.194.145.40 - 217.194.145.47 ug -217.194.145.48 - 217.194.145.55 a2 -217.194.145.56 - 217.194.145.63 zw -217.194.145.64 - 217.194.145.95 ng -217.194.145.96 - 217.194.145.127 a2 +217.194.128.0 - 217.194.143.93 a2 +217.194.143.94 - 217.194.143.94 gn +217.194.143.95 - 217.194.143.153 a2 +217.194.143.154 - 217.194.143.154 gn +217.194.143.155 - 217.194.145.127 a2 217.194.145.128 - 217.194.145.135 ug -217.194.145.136 - 217.194.145.143 zm -217.194.145.144 - 217.194.145.159 a2 -217.194.145.160 - 217.194.145.175 mz -217.194.145.176 - 217.194.145.191 a2 -217.194.145.192 - 217.194.145.255 ng -217.194.146.0 - 217.194.146.159 a2 -217.194.146.160 - 217.194.146.167 ng -217.194.146.168 - 217.194.147.127 a2 -217.194.147.128 - 217.194.147.151 ng -217.194.147.152 - 217.194.147.159 zm -217.194.147.160 - 217.194.147.191 a2 -217.194.147.192 - 217.194.147.207 ug -217.194.147.208 - 217.194.147.215 cd -217.194.147.216 - 217.194.147.223 ng -217.194.147.224 - 217.194.147.255 a2 -217.194.148.0 - 217.194.148.255 at -217.194.149.0 - 217.194.149.23 a2 -217.194.149.24 - 217.194.149.31 ug -217.194.149.32 - 217.194.149.63 a2 -217.194.149.64 - 217.194.149.71 zm +217.194.145.136 - 217.194.149.71 a2 217.194.149.72 - 217.194.149.79 ng -217.194.149.80 - 217.194.149.119 a2 -217.194.149.120 - 217.194.149.127 ng -217.194.149.128 - 217.194.149.143 a2 -217.194.149.144 - 217.194.149.151 ng -217.194.149.152 - 217.194.149.175 a2 -217.194.149.176 - 217.194.149.183 us -217.194.149.184 - 217.194.149.191 mw -217.194.149.192 - 217.194.149.199 a2 -217.194.149.200 - 217.194.149.207 ng -217.194.149.208 - 217.194.149.231 a2 +217.194.149.80 - 217.194.149.231 a2 217.194.149.232 - 217.194.149.239 ke -217.194.149.240 - 217.194.149.247 bf -217.194.149.248 - 217.194.150.15 a2 -217.194.150.16 - 217.194.150.23 iq -217.194.150.24 - 217.194.150.63 a2 -217.194.150.64 - 217.194.150.71 iq -217.194.150.72 - 217.194.151.255 a2 -217.194.152.0 - 217.194.152.255 cd -217.194.153.0 - 217.194.153.15 a2 -217.194.153.16 - 217.194.153.23 ng -217.194.153.24 - 217.194.153.39 a2 -217.194.153.40 - 217.194.153.47 cd -217.194.153.48 - 217.194.153.63 a2 -217.194.153.64 - 217.194.153.71 cd -217.194.153.72 - 217.194.153.103 a2 -217.194.153.104 - 217.194.153.111 cd -217.194.153.112 - 217.194.153.199 a2 -217.194.153.200 - 217.194.153.207 ng -217.194.153.208 - 217.194.153.255 a2 -217.194.154.0 - 217.194.154.31 tz -217.194.154.32 - 217.194.154.39 iq -217.194.154.40 - 217.194.154.255 tz -217.194.155.0 - 217.194.155.23 ua -217.194.155.24 - 217.194.155.31 cm -217.194.155.32 - 217.194.155.39 ua -217.194.155.40 - 217.194.155.79 a2 -217.194.155.80 - 217.194.155.87 iq -217.194.155.88 - 217.194.155.103 ng -217.194.155.104 - 217.194.155.111 a2 -217.194.155.112 - 217.194.155.127 ng -217.194.155.128 - 217.194.155.255 cm -217.194.156.0 - 217.194.156.127 a2 -217.194.156.128 - 217.194.156.255 ng -217.194.157.0 - 217.194.157.15 yt -217.194.157.16 - 217.194.157.31 ug -217.194.157.32 - 217.194.157.39 a2 -217.194.157.40 - 217.194.157.47 iq -217.194.157.48 - 217.194.157.63 zw -217.194.157.64 - 217.194.157.71 a2 -217.194.157.72 - 217.194.157.79 ng -217.194.157.80 - 217.194.157.103 a2 -217.194.157.104 - 217.194.157.111 ke -217.194.157.112 - 217.194.157.127 ng -217.194.157.128 - 217.194.157.135 us -217.194.157.136 - 217.194.157.143 mz -217.194.157.144 - 217.194.157.151 zw -217.194.157.152 - 217.194.157.199 a2 -217.194.157.200 - 217.194.157.207 zm -217.194.157.208 - 217.194.157.215 a2 -217.194.157.216 - 217.194.157.223 ng -217.194.157.224 - 217.194.157.231 a2 -217.194.157.232 - 217.194.157.239 iq -217.194.157.240 - 217.194.157.247 a2 -217.194.157.248 - 217.194.157.255 mw -217.194.158.0 - 217.194.159.255 gb +217.194.149.240 - 217.194.159.255 a2 217.194.160.0 - 217.194.175.255 cz 217.194.176.0 - 217.194.191.255 it 217.194.192.0 - 217.194.207.255 il @@ -157464,82 +115851,35 @@ 217.194.240.0 - 217.194.255.255 ru 217.195.0.0 - 217.195.15.255 de 217.195.16.0 - 217.195.31.255 fr -217.195.32.0 - 217.195.34.255 de -217.195.35.0 - 217.195.35.31 it -217.195.35.32 - 217.195.45.255 de -217.195.46.0 - 217.195.47.255 nl +217.195.32.0 - 217.195.47.255 de 217.195.48.0 - 217.195.63.255 lv 217.195.64.0 - 217.195.111.255 ru 217.195.112.0 - 217.195.127.255 nl 217.195.128.0 - 217.195.143.255 gr -217.195.144.0 - 217.195.144.23 nl -217.195.144.24 - 217.195.144.35 af -217.195.144.36 - 217.195.144.255 nl -217.195.145.0 - 217.195.145.47 af -217.195.145.48 - 217.195.145.55 nl -217.195.145.56 - 217.195.145.63 af -217.195.145.64 - 217.195.145.79 nl -217.195.145.80 - 217.195.145.255 af -217.195.146.0 - 217.195.146.7 nl -217.195.146.8 - 217.195.146.23 af -217.195.146.24 - 217.195.146.63 nl -217.195.146.64 - 217.195.146.103 af -217.195.146.104 - 217.195.146.111 nl -217.195.146.112 - 217.195.146.147 af -217.195.146.148 - 217.195.146.151 nl -217.195.146.152 - 217.195.146.215 af -217.195.146.216 - 217.195.146.231 nl -217.195.146.232 - 217.195.147.15 af -217.195.147.16 - 217.195.147.40 nl -217.195.147.41 - 217.195.147.47 af -217.195.147.48 - 217.195.151.255 nl -217.195.152.0 - 217.195.152.63 us -217.195.152.64 - 217.195.159.255 nl +217.195.147.0 - 217.195.147.255 us 217.195.160.0 - 217.195.175.255 cz 217.195.176.0 - 217.195.191.255 dk 217.195.192.0 - 217.195.207.255 tr 217.195.208.0 - 217.195.223.255 ru -217.195.224.0 - 217.195.255.255 nl +217.195.224.0 - 217.195.240.255 nl +217.195.241.0 - 217.195.241.255 us +217.195.242.0 - 217.195.250.255 nl +217.195.251.0 - 217.195.251.255 gb +217.195.252.0 - 217.195.255.255 nl 217.196.0.0 - 217.196.15.255 gb 217.196.16.0 - 217.196.31.255 kz 217.196.32.0 - 217.196.47.255 nl 217.196.48.0 - 217.196.63.255 no -217.196.64.0 - 217.196.68.31 at -217.196.68.32 - 217.196.68.63 sk -217.196.68.64 - 217.196.68.143 at -217.196.68.144 - 217.196.68.159 sk -217.196.68.160 - 217.196.73.207 at -217.196.73.208 - 217.196.73.223 sk -217.196.73.224 - 217.196.75.95 at -217.196.75.96 - 217.196.75.127 sk -217.196.75.128 - 217.196.86.31 at -217.196.86.32 - 217.196.86.47 sk -217.196.86.48 - 217.196.86.255 at -217.196.87.0 - 217.196.87.255 sk -217.196.88.0 - 217.196.88.159 at -217.196.88.160 - 217.196.88.191 sk -217.196.88.192 - 217.196.92.71 at -217.196.92.72 - 217.196.92.79 gr -217.196.92.80 - 217.196.92.255 at -217.196.93.0 - 217.196.93.127 sk -217.196.93.128 - 217.196.93.223 at -217.196.93.224 - 217.196.94.159 sk -217.196.94.160 - 217.196.94.191 at -217.196.94.192 - 217.196.94.223 sk -217.196.94.224 - 217.196.95.255 at +217.196.64.0 - 217.196.95.255 at 217.196.96.0 - 217.196.111.255 ru 217.196.112.0 - 217.196.127.255 cz 217.196.128.0 - 217.196.143.255 it -217.196.144.0 - 217.196.148.215 at -217.196.148.216 - 217.196.148.223 us -217.196.148.224 - 217.196.159.255 at +217.196.144.0 - 217.196.159.255 at 217.196.160.0 - 217.196.175.255 ua 217.196.176.0 - 217.196.191.255 ch -217.196.192.0 - 217.196.207.255 gb +217.196.192.0 - 217.196.207.255 mk 217.196.208.0 - 217.196.223.255 cz -217.196.224.0 - 217.196.229.119 gb -217.196.229.120 - 217.196.229.127 us -217.196.229.128 - 217.196.255.255 gb +217.196.224.0 - 217.196.255.255 gb 217.197.0.0 - 217.197.15.255 ru 217.197.16.0 - 217.197.31.255 es 217.197.32.0 - 217.197.47.255 cz @@ -157554,9 +115894,7 @@ 217.197.160.0 - 217.197.175.255 pl 217.197.176.0 - 217.197.191.255 hu 217.197.192.0 - 217.197.207.255 ru -217.197.208.0 - 217.197.221.255 ch -217.197.222.0 - 217.197.222.255 jp -217.197.223.0 - 217.197.223.255 us +217.197.208.0 - 217.197.223.255 ch 217.197.224.0 - 217.198.15.255 ru 217.198.16.0 - 217.198.31.255 nl 217.198.32.0 - 217.198.63.255 gb @@ -157564,14 +115902,9 @@ 217.198.80.0 - 217.198.95.255 ru 217.198.96.0 - 217.198.111.255 gb 217.198.112.0 - 217.198.127.255 cz -217.198.128.0 - 217.198.128.127 de -217.198.128.128 - 217.198.128.143 fr -217.198.128.144 - 217.198.128.255 nl -217.198.129.0 - 217.198.129.63 de -217.198.129.64 - 217.198.129.127 nl -217.198.129.128 - 217.198.129.255 de -217.198.130.0 - 217.198.131.255 nl -217.198.132.0 - 217.198.143.255 de +217.198.128.0 - 217.198.135.255 de +217.198.136.0 - 217.198.139.255 nl +217.198.140.0 - 217.198.143.255 de 217.198.144.0 - 217.198.159.255 se 217.198.160.0 - 217.198.191.255 ru 217.198.192.0 - 217.198.207.255 es @@ -157579,20 +115912,7 @@ 217.198.224.0 - 217.198.239.255 lv 217.198.240.0 - 217.198.255.255 de 217.199.0.0 - 217.199.31.255 it -217.199.32.0 - 217.199.32.7 se -217.199.32.8 - 217.199.32.135 no -217.199.32.136 - 217.199.32.143 se -217.199.32.144 - 217.199.32.167 no -217.199.32.168 - 217.199.32.175 bs -217.199.32.176 - 217.199.33.191 no -217.199.33.192 - 217.199.33.207 se -217.199.33.208 - 217.199.34.31 no -217.199.34.32 - 217.199.34.63 se -217.199.34.64 - 217.199.34.255 no -217.199.35.0 - 217.199.35.255 se -217.199.36.0 - 217.199.51.255 no -217.199.52.0 - 217.199.52.63 se -217.199.52.64 - 217.199.63.255 no +217.199.32.0 - 217.199.63.255 no 217.199.64.0 - 217.199.79.255 de 217.199.80.0 - 217.199.95.255 at 217.199.96.0 - 217.199.127.255 lv @@ -157600,80 +115920,40 @@ 217.199.144.0 - 217.199.159.255 ke 217.199.160.0 - 217.199.191.255 gb 217.199.192.0 - 217.199.207.255 de -217.199.208.0 - 217.199.216.255 ru -217.199.217.0 - 217.199.217.127 vg -217.199.217.128 - 217.199.223.255 ru +217.199.208.0 - 217.199.223.255 ru 217.199.224.0 - 217.199.239.255 ua 217.199.240.0 - 217.199.255.255 ru 217.200.0.0 - 217.203.255.255 it -217.204.0.0 - 217.204.37.95 gb -217.204.37.96 - 217.204.37.111 lu -217.204.37.112 - 217.204.40.127 gb -217.204.40.128 - 217.204.40.135 us -217.204.40.136 - 217.204.40.151 gb -217.204.40.152 - 217.204.40.159 se -217.204.40.160 - 217.204.80.183 gb -217.204.80.184 - 217.204.80.191 it -217.204.80.192 - 217.204.139.235 gb -217.204.139.236 - 217.204.139.239 us -217.204.139.240 - 217.204.143.127 gb -217.204.143.128 - 217.204.143.255 de -217.204.144.0 - 217.204.159.107 gb -217.204.159.108 - 217.204.159.111 mc -217.204.159.112 - 217.207.255.255 gb +217.204.0.0 - 217.207.255.255 gb 217.208.0.0 - 217.212.224.255 se 217.212.225.0 - 217.212.225.255 de -217.212.226.0 - 217.212.227.255 se -217.212.228.0 - 217.212.228.255 no -217.212.229.0 - 217.212.229.255 se -217.212.230.0 - 217.212.231.255 pl +217.212.226.0 - 217.212.230.20 se +217.212.230.21 - 217.212.230.21 no +217.212.230.22 - 217.212.231.255 se 217.212.232.0 - 217.212.235.255 no 217.212.236.0 - 217.212.237.255 se 217.212.238.0 - 217.212.239.255 fr -217.212.240.0 - 217.212.248.15 se -217.212.248.16 - 217.212.248.23 ru -217.212.248.24 - 217.212.248.63 se -217.212.248.64 - 217.212.248.79 ru -217.212.248.80 - 217.212.248.95 se -217.212.248.96 - 217.212.248.159 ru -217.212.248.160 - 217.212.248.255 se -217.212.249.0 - 217.212.251.255 no -217.212.252.0 - 217.212.252.63 se +217.212.240.0 - 217.212.240.255 se +217.212.241.0 - 217.212.241.255 nl +217.212.242.0 - 217.212.252.63 se 217.212.252.64 - 217.212.252.255 fi -217.212.253.0 - 217.212.253.255 se -217.212.254.0 - 217.212.254.255 ru -217.212.255.0 - 217.212.255.255 no -217.213.0.0 - 217.215.255.255 se +217.212.253.0 - 217.212.253.255 nl +217.212.254.0 - 217.215.255.255 se 217.216.0.0 - 217.217.255.255 es 217.218.0.0 - 217.219.255.255 ir 217.220.0.0 - 217.223.255.255 it -217.224.0.0 - 217.237.163.71 de -217.237.163.72 - 217.237.163.79 es -217.237.163.80 - 217.237.180.15 de -217.237.180.16 - 217.237.180.23 nl -217.237.180.24 - 217.243.204.143 de -217.243.204.144 - 217.243.204.151 gb -217.243.204.152 - 217.243.204.159 us -217.243.204.160 - 217.244.15.87 de -217.244.15.88 - 217.244.15.95 us -217.244.15.96 - 217.244.56.191 de -217.244.56.192 - 217.244.56.207 at -217.244.56.208 - 217.244.58.79 de -217.244.58.80 - 217.244.58.95 at -217.244.58.96 - 217.244.58.143 de -217.244.58.144 - 217.244.58.175 at -217.244.58.176 - 217.244.60.255 de -217.244.61.0 - 217.244.61.95 at -217.244.61.96 - 217.244.61.159 de -217.244.61.160 - 217.244.61.191 at -217.244.61.192 - 217.255.255.255 de -218.0.0.0 - 218.31.255.255 cn +217.224.0.0 - 217.255.255.255 de +218.0.0.0 - 218.30.63.159 cn +218.30.63.160 - 218.30.63.191 sg +218.30.63.192 - 218.31.255.255 cn 218.32.0.0 - 218.32.255.255 tw 218.33.0.0 - 218.33.127.255 id 218.33.128.0 - 218.33.255.255 jp 218.34.0.0 - 218.35.255.255 tw 218.36.0.0 - 218.39.255.255 kr -218.40.0.0 - 218.47.255.255 jp +218.40.0.0 - 218.40.185.255 jp +218.40.186.0 - 218.40.186.255 us +218.40.187.0 - 218.47.255.255 jp 218.48.0.0 - 218.55.255.255 kr 218.56.0.0 - 218.99.255.255 cn 218.100.0.0 - 218.100.3.255 au @@ -157702,7 +115982,6 @@ 218.100.46.0 - 218.100.47.255 th 218.100.48.0 - 218.100.49.255 in 218.100.50.0 - 218.100.50.255 au -218.100.51.0 - 218.100.51.255 kh 218.100.52.0 - 218.100.54.255 au 218.100.55.0 - 218.100.55.255 id 218.100.56.0 - 218.100.56.255 nz @@ -157715,9 +115994,7 @@ 218.100.65.0 - 218.100.65.255 nz 218.100.66.0 - 218.100.66.255 th 218.100.67.0 - 218.100.67.255 jp -218.100.68.0 - 218.100.68.255 nz 218.100.69.0 - 218.100.69.255 my -218.100.70.0 - 218.100.70.255 sg 218.100.71.0 - 218.100.71.255 kh 218.100.72.0 - 218.100.74.255 id 218.100.75.0 - 218.100.75.255 my @@ -157728,9 +116005,8 @@ 218.100.80.0 - 218.100.83.255 au 218.100.84.0 - 218.100.84.255 mn 218.100.85.0 - 218.100.85.255 pk -218.100.86.0 - 218.100.86.255 my -218.100.87.0 - 218.100.87.255 au -218.100.88.0 - 218.100.255.255 cn +218.100.87.0 - 218.100.91.255 au +218.100.92.0 - 218.100.255.255 cn 218.101.0.0 - 218.101.127.255 nz 218.101.128.0 - 218.101.255.255 kr 218.102.0.0 - 218.103.255.255 hk @@ -157747,7 +116023,8 @@ 218.185.192.0 - 218.185.223.255 cn 218.185.224.0 - 218.185.231.255 nz 218.185.232.0 - 218.185.239.255 au -218.185.240.0 - 218.185.247.255 bd +218.185.240.0 - 218.185.247.255 cn +218.185.248.0 - 218.185.255.255 in 218.186.0.0 - 218.186.255.255 sg 218.187.0.0 - 218.187.255.255 tw 218.188.0.0 - 218.191.255.255 hk @@ -157756,7 +116033,9 @@ 218.209.0.0 - 218.209.255.255 kr 218.210.0.0 - 218.211.255.255 tw 218.212.0.0 - 218.212.255.255 sg -218.213.0.0 - 218.213.255.255 hk +218.213.0.0 - 218.213.75.255 hk +218.213.76.0 - 218.213.76.255 ap +218.213.77.0 - 218.213.255.255 hk 218.214.0.0 - 218.215.255.255 au 218.216.0.0 - 218.231.255.255 jp 218.232.0.0 - 218.239.255.255 kr @@ -157779,11 +116058,13 @@ 219.80.0.0 - 219.81.255.255 tw 219.82.0.0 - 219.82.255.255 cn 219.83.0.0 - 219.83.127.255 id -219.83.128.0 - 219.83.255.255 in +219.83.128.0 - 219.83.255.255 cn 219.84.0.0 - 219.87.255.255 tw 219.88.0.0 - 219.89.255.255 nz 219.90.0.0 - 219.90.63.255 tw -219.90.64.0 - 219.90.95.255 ph +219.90.64.0 - 219.90.67.255 in +219.90.68.0 - 219.90.79.255 cn +219.90.80.0 - 219.90.95.255 ph 219.90.96.0 - 219.90.111.255 in 219.90.112.0 - 219.90.127.255 hk 219.90.128.0 - 219.90.255.255 au @@ -157792,8 +116073,14 @@ 219.92.0.0 - 219.94.127.255 my 219.94.128.0 - 219.94.255.255 jp 219.95.0.0 - 219.95.255.255 my -219.96.0.0 - 219.127.255.255 jp -219.128.0.0 - 219.159.255.255 cn +219.96.0.0 - 219.127.82.255 jp +219.127.83.0 - 219.127.83.146 ap +219.127.83.147 - 219.127.83.147 jp +219.127.83.148 - 219.127.83.255 ap +219.127.84.0 - 219.127.255.255 jp +219.128.0.0 - 219.158.40.36 cn +219.158.40.37 - 219.158.40.37 hk +219.158.40.38 - 219.159.255.255 cn 219.160.0.0 - 219.215.255.255 jp 219.216.0.0 - 219.239.255.255 cn 219.240.0.0 - 219.241.255.255 kr @@ -157801,7 +116088,10 @@ 219.248.0.0 - 219.255.255.255 kr 220.0.0.0 - 220.63.255.255 jp 220.64.0.0 - 220.95.255.255 kr -220.96.0.0 - 220.100.255.255 jp +220.96.0.0 - 220.100.127.255 jp +220.100.128.0 - 220.100.159.255 gb +220.100.160.0 - 220.100.175.255 sg +220.100.176.0 - 220.100.255.255 jp 220.101.0.0 - 220.101.191.255 au 220.101.192.0 - 220.101.255.255 cn 220.102.0.0 - 220.102.255.255 jp @@ -157826,7 +116116,30 @@ 220.157.64.0 - 220.157.95.255 au 220.157.96.0 - 220.157.111.255 id 220.157.112.0 - 220.157.127.255 tw -220.157.128.0 - 220.159.255.255 jp +220.157.128.0 - 220.158.127.255 jp +220.158.128.0 - 220.158.131.255 in +220.158.132.0 - 220.158.135.255 hk +220.158.136.0 - 220.158.147.255 in +220.158.148.0 - 220.158.151.255 kh +220.158.152.0 - 220.158.187.255 in +220.158.188.0 - 220.158.191.255 au +220.158.192.0 - 220.158.195.255 in +220.158.196.0 - 220.158.199.255 hk +220.158.200.0 - 220.158.203.255 my +220.158.204.0 - 220.158.207.255 bd +220.158.208.0 - 220.158.211.255 hk +220.158.212.0 - 220.158.215.255 nz +220.158.216.0 - 220.158.219.255 jp +220.158.220.0 - 220.158.223.255 mv +220.158.224.0 - 220.158.227.255 hk +220.158.228.0 - 220.158.231.255 tw +220.158.232.0 - 220.158.235.255 bd +220.158.236.0 - 220.158.239.255 bt +220.158.240.0 - 220.158.243.255 cn +220.158.244.0 - 220.158.247.255 hk +220.158.248.0 - 220.158.251.255 jp +220.158.252.0 - 220.158.255.255 hk +220.159.0.0 - 220.159.255.255 jp 220.160.0.0 - 220.207.255.255 cn 220.208.0.0 - 220.223.255.255 jp 220.224.0.0 - 220.227.255.255 in @@ -157835,7 +116148,11 @@ 220.231.0.0 - 220.231.63.255 cn 220.231.64.0 - 220.231.127.255 vn 220.231.128.0 - 220.231.255.255 cn -220.232.0.0 - 220.232.63.255 sg +220.232.0.0 - 220.232.58.239 sg +220.232.58.240 - 220.232.58.255 ap +220.232.59.0 - 220.232.59.131 sg +220.232.59.132 - 220.232.59.132 us +220.232.59.133 - 220.232.63.255 sg 220.232.64.0 - 220.232.127.255 cn 220.232.128.0 - 220.232.255.255 hk 220.233.0.0 - 220.233.255.255 au @@ -157846,7 +116163,10 @@ 220.244.0.0 - 220.245.255.255 au 220.246.0.0 - 220.246.255.255 hk 220.247.0.0 - 220.247.127.255 jp -220.247.128.0 - 220.247.159.255 tw +220.247.128.0 - 220.247.131.255 bd +220.247.132.0 - 220.247.135.255 nz +220.247.136.0 - 220.247.143.255 cn +220.247.144.0 - 220.247.159.255 nz 220.247.160.0 - 220.247.167.255 bd 220.247.168.0 - 220.247.175.255 id 220.247.176.0 - 220.247.183.255 au @@ -157871,16 +116191,40 @@ 221.121.0.0 - 221.121.63.255 vn 221.121.64.0 - 221.121.95.255 au 221.121.96.0 - 221.121.127.255 ph -221.121.128.0 - 221.121.159.255 au +221.121.128.0 - 221.121.134.255 au +221.121.135.0 - 221.121.135.255 nz +221.121.136.0 - 221.121.159.255 au 221.121.160.0 - 221.121.183.255 jp 221.121.184.0 - 221.121.191.255 ph 221.121.192.0 - 221.121.255.255 jp 221.122.0.0 - 221.123.255.255 cn 221.124.0.0 - 221.127.255.255 hk -221.128.0.0 - 221.128.63.255 sg -221.128.64.0 - 221.128.127.255 th -221.128.128.0 - 221.128.255.255 in -221.129.0.0 - 221.131.255.255 cn +221.128.0.0 - 221.128.70.255 sg +221.128.71.0 - 221.128.71.255 jp +221.128.72.0 - 221.128.72.255 sg +221.128.73.0 - 221.128.73.255 jp +221.128.74.0 - 221.128.76.255 sg +221.128.77.0 - 221.128.77.255 jp +221.128.78.0 - 221.128.78.255 sg +221.128.79.0 - 221.128.79.255 jp +221.128.80.0 - 221.128.80.255 sg +221.128.81.0 - 221.128.81.255 jp +221.128.82.0 - 221.128.86.255 sg +221.128.87.0 - 221.128.91.255 jp +221.128.92.0 - 221.128.96.255 sg +221.128.97.0 - 221.128.99.255 jp +221.128.100.0 - 221.128.103.255 sg +221.128.104.0 - 221.128.110.255 jp +221.128.111.0 - 221.128.114.255 sg +221.128.115.0 - 221.128.116.255 jp +221.128.117.0 - 221.128.117.255 sg +221.128.118.0 - 221.128.119.255 jp +221.128.120.0 - 221.128.120.255 th +221.128.121.0 - 221.128.121.255 jp +221.128.122.0 - 221.128.122.255 sg +221.128.123.0 - 221.128.123.255 jp +221.128.124.0 - 221.128.127.255 sg +221.128.128.0 - 221.131.255.255 cn 221.132.0.0 - 221.132.63.255 vn 221.132.64.0 - 221.132.95.255 kr 221.132.96.0 - 221.132.111.255 jp @@ -157892,22 +116236,7 @@ 221.133.48.0 - 221.133.63.255 kr 221.133.64.0 - 221.133.127.255 jp 221.133.128.0 - 221.133.191.255 kr -221.133.192.0 - 221.133.216.52 au -221.133.216.53 - 221.133.216.53 as -221.133.216.54 - 221.133.219.23 au -221.133.219.24 - 221.133.219.31 as -221.133.219.32 - 221.133.219.63 au -221.133.219.64 - 221.133.219.95 as -221.133.219.96 - 221.133.219.111 au -221.133.219.112 - 221.133.219.127 as -221.133.219.128 - 221.133.219.191 au -221.133.219.192 - 221.133.219.255 as -221.133.220.0 - 221.133.220.63 au -221.133.220.64 - 221.133.220.127 as -221.133.220.128 - 221.133.220.191 au -221.133.220.192 - 221.133.220.223 hk -221.133.220.224 - 221.133.220.255 jp -221.133.221.0 - 221.133.223.255 au +221.133.192.0 - 221.133.223.255 au 221.133.224.0 - 221.133.255.255 cn 221.134.0.0 - 221.135.255.255 in 221.136.0.0 - 221.137.255.255 cn @@ -157929,7 +116258,9 @@ 222.126.128.0 - 222.126.255.255 cn 222.127.0.0 - 222.127.255.255 ph 222.128.0.0 - 222.143.255.255 cn -222.144.0.0 - 222.151.255.255 jp +222.144.0.0 - 222.151.97.255 jp +222.151.98.0 - 222.151.98.255 nc +222.151.99.0 - 222.151.255.255 jp 222.152.0.0 - 222.155.255.255 nz 222.156.0.0 - 222.157.255.255 tw 222.158.0.0 - 222.159.255.255 jp @@ -157941,7 +116272,7 @@ 222.168.0.0 - 222.223.255.255 cn 222.224.0.0 - 222.229.79.255 jp 222.229.80.0 - 222.229.87.255 id -222.229.88.0 - 222.229.95.255 th +222.229.88.0 - 222.229.95.255 au 222.229.96.0 - 222.230.255.255 jp 222.231.0.0 - 222.231.63.255 kr 222.231.64.0 - 222.231.255.255 jp @@ -157965,14 +116296,16 @@ 223.25.224.0 - 223.25.231.255 au 223.25.232.0 - 223.25.239.255 sg 223.25.240.0 - 223.25.251.255 my -223.25.252.0 - 223.25.255.255 sg +223.25.252.0 - 223.25.255.255 bd 223.26.0.0 - 223.26.15.255 tw 223.26.16.0 - 223.26.31.255 sg 223.26.32.0 - 223.26.47.255 in 223.26.48.0 - 223.26.63.255 hk 223.26.64.0 - 223.26.127.255 tw 223.26.128.0 - 223.26.255.255 kr -223.27.0.0 - 223.27.31.255 au +223.27.0.0 - 223.27.19.143 au +223.27.19.144 - 223.27.19.144 nz +223.27.19.145 - 223.27.31.255 au 223.27.32.0 - 223.27.63.255 tw 223.27.64.0 - 223.27.67.255 au 223.27.68.0 - 223.27.79.255 jp @@ -157986,7 +116319,9 @@ 223.27.128.0 - 223.27.143.255 my 223.27.144.0 - 223.27.159.255 id 223.27.160.0 - 223.27.163.255 hk -223.27.164.0 - 223.27.175.255 sg +223.27.164.0 - 223.27.164.255 sg +223.27.165.0 - 223.27.165.255 hk +223.27.166.0 - 223.27.175.255 sg 223.27.176.0 - 223.27.179.255 au 223.27.180.0 - 223.27.183.255 jp 223.27.184.0 - 223.27.187.255 cn @@ -157997,19 +116332,27 @@ 223.29.0.0 - 223.29.127.255 jp 223.29.128.0 - 223.29.175.255 nc 223.29.176.0 - 223.29.191.255 jp -223.29.192.0 - 223.29.223.255 in +223.29.192.0 - 223.29.207.255 in +223.29.208.0 - 223.29.211.255 cn +223.29.212.0 - 223.29.215.255 bd +223.29.216.0 - 223.29.219.255 hk +223.29.220.0 - 223.29.223.255 in 223.29.224.0 - 223.29.239.255 pk 223.29.240.0 - 223.29.243.255 au 223.29.244.0 - 223.29.247.255 jp 223.29.248.0 - 223.29.251.255 hk -223.29.252.0 - 223.29.255.255 pk +223.29.252.0 - 223.29.255.255 cn 223.30.0.0 - 223.31.255.255 in 223.32.0.0 - 223.63.255.255 kr -223.64.0.0 - 223.129.255.255 cn +223.64.0.0 - 223.117.255.255 cn +223.118.0.0 - 223.119.255.255 hk +223.120.0.0 - 223.129.255.255 cn 223.130.0.0 - 223.130.3.255 sg 223.130.4.0 - 223.130.7.255 in +223.130.8.0 - 223.130.11.255 cn 223.130.12.0 - 223.130.15.255 au -223.130.20.0 - 223.130.27.255 au +223.130.16.0 - 223.130.19.255 ph +223.130.24.0 - 223.130.27.255 au 223.130.28.0 - 223.130.31.255 in 223.130.32.0 - 223.130.63.255 hk 223.130.64.0 - 223.131.255.255 kr @@ -158055,7 +116398,9 @@ 223.224.0.0 - 223.239.255.255 in 223.240.0.0 - 223.251.255.255 cn 223.252.0.0 - 223.252.127.255 au -223.252.128.0 - 223.252.255.255 cn +223.252.128.0 - 223.252.161.63 cn +223.252.161.64 - 223.252.161.127 hk +223.252.161.128 - 223.252.255.255 cn 223.253.0.0 - 223.253.255.255 kr 223.254.0.0 - 223.255.127.255 cn 223.255.128.0 - 223.255.191.255 hk @@ -158065,7 +116410,7 @@ 223.255.236.0 - 223.255.239.255 cn 223.255.240.0 - 223.255.243.255 hk 223.255.244.0 - 223.255.247.255 in -223.255.248.0 - 223.255.251.255 au +223.255.248.0 - 223.255.251.255 hk 223.255.252.0 - 223.255.253.255 cn 223.255.254.0 - 223.255.254.255 sg 223.255.255.0 - 223.255.255.255 au
View file
gtk-gnutella-0.98.2.tar.bz2/extra_files/geo-ipv6.txt -> gtk-gnutella-1.1.9.tar.bz2/extra_files/geo-ipv6.txt
Changed
@@ -1,6 +1,6 @@ # From http://geolite.maxmind.com/download/geoip/database/GeoIPv6.csv.gz # Redistributed under the OPEN DATA LICENSE (see GEO_LICENCE) -# Conversion for GTKG generated on Tue Dec 27 12:24:30 2011 GMT +# Conversion for GTKG generated on Sun Mar 6 07:48:04 2016 GMT 2001:200::/32 jp 2001:208::/32 sg 2001:218::/32 jp @@ -36,7 +36,6 @@ 2001:310::/32 jp 2001:318::/32 jp 2001:320::/32 kr -2001:328::/32 my 2001:330::/32 kr 2001:338::/32 jp 2001:340::/32 jp @@ -85,7 +84,6 @@ 2001:4c0::/32 ca 2001:4c8::/32 ca 2001:4d0::/32 us -2001:4d8::/32 us 2001:4e0::/32 us 2001:4e8::/32 ca 2001:4f0::/32 us @@ -101,12 +99,13 @@ 2001:500:80::/48 ca 2001:500:84::/48 us 2001:500:8c::/48 us -2001:500:9c::/48 us 2001:500:a0::/48 ca +2001:500:a8::/48 us 2001:500:c0::/48 ca 2001:500:f0::/48 us 2001:500:f1::/48 ca 2001:500:100::/48 ca +2001:500:120::/48 us 2001:500:3e5::/48 us 2001:500:30ff::/48 us 2001:500:3682::/48 us @@ -162,19 +161,41 @@ 2001:503:f261::/48 us 2001:503:f3da::/48 us 2001:503:ff39::/48 us -2001:504::/48 us +2001:504::/46 us 2001:504:15::/48 ca 2001:504:16::/48 us 2001:504:1a::/48 ca 2001:504:1b::/48 us 2001:504:1d::/48 pr 2001:504:20::/48 ca +2001:504:24::/48 us +2001:504:25::/48 ca +2001:504:27::/48 us +2001:504:2c::/48 ca +2001:504:2e::/48 us +2001:504:2f::/48 ca +2001:504:30::/48 us +2001:504:35::/48 gd +2001:504:36::/48 us +2001:504:37::/48 ca +2001:504:38::/48 us +2001:504:39::/48 ca +2001:504:3a::/48 us +2001:504:3e::/48 jm +2001:504:3f::/48 us +2001:504:42::/48 ca +2001:504:43::/48 us +2001:504:46::/48 ca +2001:504:47::/48 us +2001:504:57::/48 us +2001:504:60::/48 us 2001:506::/47 us 2001:506:8::/48 us 2001:506:20::/48 ca 2001:506:28::/48 us 2001:506:100::/48 us 2001:506:1000::/48 us +2001:506:4000::/48 us 2001:508::/32 bm 2001:510::/32 ca 2001:518::/32 us @@ -192,11 +213,11 @@ 2001:580::/32 us 2001:590::/32 us 2001:598::/32 ca -2001:5a0::/32 ca +2001:5a0::/32 us 2001:5a8::/32 us 2001:5b0::/32 us 2001:5b8::/32 us -2001:5c0::/32 ca +2001:5c0:1000::/48 ca 2001:5c8::/32 us 2001:5d0::/32 us 2001:5d8::/32 us @@ -215,9 +236,8 @@ 2001:640::/32 ru 2001:648::/32 gr 2001:650::/32 de -2001:658::/32 de 2001:660::/32 fr -2001:668::/32 eu +2001:668::/32 de 2001:670::/32 fi 2001:678:1::/48 cz 2001:678:2::/48 de @@ -250,51 +270,86 @@ 2001:678:44::/48 es 2001:678:48::/48 es 2001:678:4c::/48 fr -2001:678:50::/48 nl -2001:678:54::/48 nl -2001:678:58::/48 nl -2001:678:5c::/48 nl +2001:678:50::/48 eu +2001:678:54::/48 eu +2001:678:58::/48 eu +2001:678:5c::/48 eu 2001:678:60::/48 lu +2001:678:64::/48 be +2001:678:68::/48 be +2001:678:6c::/48 be +2001:678:70::/48 sk +2001:678:74::/48 dk +2001:678:78::/48 dk +2001:678:7c::/48 lv +2001:678:80::/48 lv +2001:678:84::/48 lv +2001:678:88::/48 lt +2001:678:8c::/48 lt +2001:678:90::/48 sk +2001:678:94::/48 ee +2001:678:98::/48 kz +2001:678:9c::/48 sk +2001:678:a0::/48 fi +2001:678:a4::/48 at +2001:678:a8::/48 nl +2001:678:ac::/48 se +2001:678:b0::/48 ir +2001:678:c0::/48 de +2001:678:c4::/48 de +2001:678:c8::/48 ua +2001:678:cc::/48 sa +2001:678:d0::/48 nl +2001:678:d4::/48 it +2001:678:d8::/48 lv +2001:678:dc::/48 nl +2001:678:e0::/48 md +2001:678:e4::/48 se +2001:678:e8::/48 cz +2001:678:ec::/48 ru +2001:678:f0::/48 se +2001:678:f4::/48 ru +2001:678:f8::/48 de +2001:678:fc::/48 lt 2001:67c::/48 ie 2001:67c:4::/48 de 2001:67c:8::/48 ch 2001:67c:c::/48 pl -2001:67c:10::/48 eu +2001:67c:10::/48 ro 2001:67c:14::/48 de -2001:67c:18::/48 gb +2001:67c:18::/48 nl 2001:67c:1c::/48 se 2001:67c:20::/48 ie 2001:67c:24::/48 de -2001:67c:28::/48 nl +2001:67c:28::/48 ua 2001:67c:2c::/48 nl 2001:67c:30::/48 ro 2001:67c:34::/48 nl 2001:67c:38::/48 nl -2001:67c:3c::/48 nl +2001:67c:3c::/48 se 2001:67c:40::/48 be -2001:67c:44::/48 eu -2001:67c:48::/48 nl +2001:67c:44::/48 ro +2001:67c:48::/48 cz 2001:67c:4c::/48 at 2001:67c:50::/48 nl 2001:67c:54::/48 nl 2001:67c:58::/48 si 2001:67c:5c::/48 be 2001:67c:60::/48 nl -2001:67c:64::/48 eu +2001:67c:64::/48 nl 2001:67c:68::/48 cz 2001:67c:6c::/48 is -2001:67c:70::/48 fi -2001:67c:74::/48 nl -2001:67c:78::/48 eu -2001:67c:80::/48 cz +2001:67c:70::/48 fr +2001:67c:78::/48 nl +2001:67c:7c::/48 at +2001:67c:80::/48 gb 2001:67c:84::/48 cz -2001:67c:88::/48 ch -2001:67c:8c::/48 cz +2001:67c:8c::/48 ru 2001:67c:90::/48 gb 2001:67c:94::/48 ch 2001:67c:98::/48 ch 2001:67c:9c::/48 be -2001:67c:a0::/48 se +2001:67c:a0::/48 gb 2001:67c:a4::/48 no 2001:67c:a8::/48 de 2001:67c:ac::/48 at @@ -302,7 +357,7 @@ 2001:67c:b4::/48 gb 2001:67c:b8::/48 dk 2001:67c:bc::/48 ee -2001:67c:c0::/48 gb +2001:67c:c0::/48 ch 2001:67c:c4::/48 fr 2001:67c:c8::/48 ch 2001:67c:cc::/48 de @@ -310,7 +365,7 @@ 2001:67c:d4::/48 gb 2001:67c:d8::/48 se 2001:67c:dc::/48 se -2001:67c:e0::/48 eu +2001:67c:e0::/48 nl 2001:67c:e4::/48 at 2001:67c:e8::/48 cz 2001:67c:ec::/48 fr @@ -319,6 +374,7 @@ 2001:67c:f8::/48 ua 2001:67c:fc::/48 de 2001:67c:100::/48 ch +2001:67c:104::/48 pl 2001:67c:108::/48 nl 2001:67c:10c::/48 gb 2001:67c:110::/48 fi @@ -327,24 +383,24 @@ 2001:67c:11c::/48 pl 2001:67c:120::/48 be 2001:67c:124::/48 si -2001:67c:128::/48 eu +2001:67c:128::/48 de 2001:67c:12c::/48 fi 2001:67c:130::/48 sa 2001:67c:134::/48 de 2001:67c:138::/48 de 2001:67c:13c::/48 de -2001:67c:140::/48 eu -2001:67c:144::/48 gb +2001:67c:140::/48 de +2001:67c:144::/48 nl 2001:67c:148::/48 at 2001:67c:14c::/48 de -2001:67c:150::/48 cz +2001:67c:150::/48 ru 2001:67c:154::/48 ro 2001:67c:158::/48 dk 2001:67c:15c::/48 fi 2001:67c:160::/48 ch 2001:67c:164::/48 fi 2001:67c:168::/48 ch -2001:67c:16c::/48 se +2001:67c:16c::/48 ru 2001:67c:170::/48 ch 2001:67c:174::/48 nl 2001:67c:178::/48 at @@ -355,7 +411,7 @@ 2001:67c:18c::/48 ru 2001:67c:190::/48 se 2001:67c:194::/48 de -2001:67c:198::/48 nl +2001:67c:198::/48 se 2001:67c:19c::/48 se 2001:67c:1a0::/48 si 2001:67c:1a4::/48 nl @@ -373,7 +429,7 @@ 2001:67c:1d4::/48 nl 2001:67c:1d8::/48 de 2001:67c:1dc::/48 gb -2001:67c:1e0::/48 eu +2001:67c:1e0::/48 ro 2001:67c:1e4::/48 se 2001:67c:1e8::/48 nl 2001:67c:1ec::/48 no @@ -386,7 +442,7 @@ 2001:67c:208::/48 de 2001:67c:20c::/48 nl 2001:67c:210::/48 at -2001:67c:214::/48 de +2001:67c:214::/48 fr 2001:67c:218::/48 lt 2001:67c:21c::/48 am 2001:67c:220::/48 de @@ -396,9 +452,9 @@ 2001:67c:230::/48 no 2001:67c:234::/48 ch 2001:67c:238::/48 dk -2001:67c:23c::/48 ch -2001:67c:240::/48 ch -2001:67c:244::/48 ch +2001:67c:23c::/48 se +2001:67c:240::/48 at +2001:67c:244::/48 ua 2001:67c:248::/48 at 2001:67c:24c::/48 pl 2001:67c:250::/48 de @@ -417,30 +473,31 @@ 2001:67c:284::/48 cz 2001:67c:288::/48 fr 2001:67c:28c::/48 nl +2001:67c:290::/48 ua 2001:67c:294::/48 nl 2001:67c:298::/48 se -2001:67c:29c::/48 gb +2001:67c:29c::/48 it 2001:67c:2a0::/48 se 2001:67c:2a4::/48 de 2001:67c:2a8::/48 no 2001:67c:2ac::/48 de 2001:67c:2b0::/48 fi +2001:67c:2b4::/48 ru 2001:67c:2b8::/48 at 2001:67c:2bc::/48 de 2001:67c:2c0::/48 at 2001:67c:2c4::/48 ch 2001:67c:2c8::/48 nl 2001:67c:2cc::/48 de -2001:67c:2d0::/48 nl 2001:67c:2d4::/48 nl 2001:67c:2d8::/48 at 2001:67c:2dc::/48 no 2001:67c:2e0::/48 pl 2001:67c:2e4::/48 nl -2001:67c:2e8::/48 eu +2001:67c:2e8::/48 nl 2001:67c:2ec::/48 nl -2001:67c:2f0::/48 si -2001:67c:2f4::/48 se +2001:67c:2f0::/48 ru +2001:67c:2f4::/48 lu 2001:67c:2f8::/48 ch 2001:67c:2fc::/48 de 2001:67c:300::/48 si @@ -451,6 +508,7 @@ 2001:67c:314::/48 be 2001:67c:318::/48 dk 2001:67c:31c::/48 de +2001:67c:320::/48 ua 2001:67c:324::/48 no 2001:67c:328::/48 dk 2001:67c:32c::/48 ee @@ -460,21 +518,21 @@ 2001:67c:33c::/48 ch 2001:67c:340::/48 ch 2001:67c:344::/48 be -2001:67c:348::/48 im +2001:67c:348::/48 gb 2001:67c:34c::/48 de 2001:67c:350::/48 at 2001:67c:354::/48 fr 2001:67c:358::/48 ch 2001:67c:35c::/48 se -2001:67c:360::/48 cz -2001:67c:364::/48 eu +2001:67c:360::/48 ru +2001:67c:364::/48 ch 2001:67c:368::/48 lv 2001:67c:36c::/48 ch -2001:67c:370::/48 se +2001:67c:370::/48 ch 2001:67c:374::/48 de -2001:67c:378::/48 at +2001:67c:378::/48 se 2001:67c:37c::/48 ch -2001:67c:380::/48 cz +2001:67c:380::/48 ru 2001:67c:384::/48 de 2001:67c:388::/48 de 2001:67c:38c::/48 gb @@ -482,7 +540,7 @@ 2001:67c:394::/48 se 2001:67c:398::/48 no 2001:67c:39c::/48 de -2001:67c:3a0::/48 eu +2001:67c:3a0::/48 nl 2001:67c:3a4::/48 nl 2001:67c:3a8::/48 de 2001:67c:3ac::/48 rs @@ -491,30 +549,839 @@ 2001:67c:3b8::/48 ie 2001:67c:3bc::/48 dk 2001:67c:3c0::/48 dk -2001:67c:3c4::/48 cz +2001:67c:3c4::/48 ru 2001:67c:3c8::/48 ee 2001:67c:3cc::/48 se 2001:67c:3d0::/48 nl 2001:67c:3d4::/48 cz 2001:67c:3d8::/48 gb +2001:67c:3dc::/48 gb +2001:67c:3e0::/48 eu +2001:67c:3e4::/48 gb +2001:67c:3e8::/48 sa +2001:67c:3f0::/48 gb +2001:67c:3f4::/48 hr +2001:67c:3f8::/48 si +2001:67c:3fc::/48 ch +2001:67c:400::/48 ru +2001:67c:404::/48 at +2001:67c:408::/48 fr +2001:67c:40c::/48 se +2001:67c:410::/48 se +2001:67c:414::/48 si +2001:67c:418::/48 ru +2001:67c:41c::/48 se +2001:67c:420::/48 ch +2001:67c:424::/48 de +2001:67c:428::/48 ru +2001:67c:42c::/48 gb +2001:67c:430::/48 ru +2001:67c:434::/48 de +2001:67c:438::/48 ua +2001:67c:43c::/48 se +2001:67c:440::/48 ua +2001:67c:444::/48 ch +2001:67c:448::/48 se +2001:67c:44c::/48 ro +2001:67c:450::/48 ch +2001:67c:454::/48 cz +2001:67c:458::/48 de +2001:67c:45c::/48 nl +2001:67c:460::/48 nl +2001:67c:464::/48 tr +2001:67c:468::/48 pl +2001:67c:46c::/48 ch +2001:67c:478::/48 nl +2001:67c:47c::/48 ch +2001:67c:480::/48 no +2001:67c:484::/48 gb +2001:67c:488::/48 se +2001:67c:48c::/48 si +2001:67c:490::/48 ro +2001:67c:494::/48 fr +2001:67c:498::/48 se +2001:67c:49c::/48 se +2001:67c:4a0::/48 de +2001:67c:4a4::/48 se +2001:67c:4a8::/48 si +2001:67c:4ac::/48 pl +2001:67c:4b0::/48 ru +2001:67c:4b4::/48 ru +2001:67c:4b8::/48 ch +2001:67c:4bc::/48 se +2001:67c:4c0::/48 fr +2001:67c:4c4::/48 se +2001:67c:4c8::/48 de +2001:67c:4cc::/48 il +2001:67c:4d0::/48 de +2001:67c:4d4::/48 pl +2001:67c:4d8::/48 se +2001:67c:4dc::/48 gb +2001:67c:4e0::/48 ch +2001:67c:4e4::/48 se +2001:67c:4e8::/48 nl +2001:67c:4ec::/48 de +2001:67c:4f0::/48 ch +2001:67c:4f4::/48 tr +2001:67c:4f8::/48 nl +2001:67c:4fc::/48 be +2001:67c:500::/48 ch +2001:67c:504::/48 gb +2001:67c:508::/48 ch +2001:67c:50c::/48 de +2001:67c:510::/48 de +2001:67c:514::/48 no +2001:67c:518::/48 de +2001:67c:51c::/48 ru +2001:67c:520::/48 se +2001:67c:524::/48 se +2001:67c:528::/48 ru +2001:67c:52c::/48 de +2001:67c:530::/48 nl +2001:67c:534::/48 ch +2001:67c:538::/48 pl +2001:67c:53c::/48 hr +2001:67c:540::/48 se +2001:67c:544::/48 ua +2001:67c:548::/48 si +2001:67c:54c::/48 fr +2001:67c:550::/48 no +2001:67c:558::/48 no +2001:67c:55c::/48 no +2001:67c:560::/48 se +2001:67c:564::/48 dk +2001:67c:568::/48 de +2001:67c:56c::/48 ru +2001:67c:570::/48 ua +2001:67c:574::/48 nl +2001:67c:578::/48 se +2001:67c:57c::/48 by +2001:67c:580::/48 gb +2001:67c:588::/48 ro +2001:67c:58c::/48 se +2001:67c:590::/48 no +2001:67c:594::/48 de +2001:67c:598::/48 ro +2001:67c:59c::/48 hu +2001:67c:5a0::/48 nl +2001:67c:5a8::/48 nl +2001:67c:5ac::/48 by +2001:67c:5b0::/48 lv +2001:67c:5b4::/48 se +2001:67c:5b8::/48 se +2001:67c:5bc::/48 de +2001:67c:5c0::/48 ro +2001:67c:5c4::/48 ru +2001:67c:5c8::/48 pl +2001:67c:5cc::/48 de +2001:67c:5d0::/48 lv +2001:67c:5d4::/48 de +2001:67c:5d8::/48 ch +2001:67c:5dc::/48 ch +2001:67c:5e0::/48 tr +2001:67c:5e4::/48 de +2001:67c:5e8::/48 ua +2001:67c:5ec::/48 de +2001:67c:5f0::/48 si +2001:67c:5f4::/48 se +2001:67c:5f8::/48 nl +2001:67c:5fc::/48 at +2001:67c:600::/48 pl +2001:67c:604::/48 se +2001:67c:608::/48 nl +2001:67c:60c::/48 ru +2001:67c:610::/48 dk +2001:67c:618::/48 pl +2001:67c:61c::/48 de +2001:67c:620::/48 de +2001:67c:624::/48 ro +2001:67c:628::/48 ro +2001:67c:62c::/48 ru +2001:67c:630::/48 no +2001:67c:634::/48 nl +2001:67c:638::/48 ch +2001:67c:63c::/48 de +2001:67c:640::/48 ro +2001:67c:644::/48 se +2001:67c:648::/48 nl +2001:67c:64c::/48 ro +2001:67c:650::/48 cz +2001:67c:654::/48 se +2001:67c:658::/48 cz +2001:67c:65c::/48 dk +2001:67c:660::/48 de +2001:67c:664::/48 ru +2001:67c:668::/48 md +2001:67c:66c::/48 ch +2001:67c:670::/48 de +2001:67c:674::/48 se +2001:67c:678::/48 se +2001:67c:67c::/48 de +2001:67c:680::/48 de +2001:67c:684::/48 de +2001:67c:688::/48 gb +2001:67c:68c::/48 tr +2001:67c:690::/48 ch +2001:67c:694::/48 gb +2001:67c:698::/48 ru +2001:67c:69c::/48 rs +2001:67c:6a0::/48 ru +2001:67c:6a4::/48 fr +2001:67c:6a8::/48 dk +2001:67c:6ac::/48 pl +2001:67c:6b0::/48 nl +2001:67c:6b4::/48 de +2001:67c:6b8::/48 nl +2001:67c:6bc::/48 nl +2001:67c:6c0::/48 tr +2001:67c:6c4::/48 de +2001:67c:6c8::/48 pl +2001:67c:6cc::/48 ru +2001:67c:6d0::/48 se +2001:67c:6d4::/48 de +2001:67c:6d8::/48 de +2001:67c:6dc::/48 ru +2001:67c:6e0::/48 ru +2001:67c:6e4::/48 de +2001:67c:6e8::/48 se +2001:67c:6ec::/48 nl +2001:67c:6f0::/48 gb +2001:67c:6f8::/48 pl +2001:67c:6fc::/48 de +2001:67c:700::/48 pl +2001:67c:704::/48 at +2001:67c:708::/48 cz +2001:67c:70c::/48 de +2001:67c:710::/48 pl +2001:67c:714::/48 no +2001:67c:718::/48 pl +2001:67c:71c::/48 ch +2001:67c:720::/48 ru +2001:67c:724::/48 se +2001:67c:728::/48 se +2001:67c:72c::/48 gb +2001:67c:730::/48 ch +2001:67c:734::/48 at +2001:67c:738::/48 ua +2001:67c:73c::/48 pl +2001:67c:740::/48 pl +2001:67c:744::/48 ro +2001:67c:748::/48 se +2001:67c:74c::/48 ru +2001:67c:750::/48 se +2001:67c:754::/48 de +2001:67c:758::/48 de +2001:67c:75c::/48 de +2001:67c:760::/48 lv +2001:67c:764::/48 de +2001:67c:768::/48 pl +2001:67c:76c::/48 de +2001:67c:778::/48 pl +2001:67c:77c::/48 nl +2001:67c:780::/48 ru +2001:67c:784::/48 ru +2001:67c:788::/48 gb +2001:67c:78c::/48 se +2001:67c:790::/48 it +2001:67c:794::/48 nl +2001:67c:798::/48 de +2001:67c:79c::/48 ru +2001:67c:7a0::/48 ru +2001:67c:7a4::/48 de +2001:67c:7a8::/48 dk +2001:67c:7ac::/48 ru +2001:67c:7b0::/48 cz +2001:67c:7b4::/48 ru +2001:67c:7b8::/48 se +2001:67c:7bc::/48 se +2001:67c:7c0::/48 ru +2001:67c:7d0::/48 lv +2001:67c:7d4::/48 pl +2001:67c:7d8::/48 ro +2001:67c:7dc::/48 ch +2001:67c:7e0::/48 de +2001:67c:7e4::/48 de +2001:67c:7e8::/48 no +2001:67c:7ec::/48 no +2001:67c:7f0::/48 no +2001:67c:7f4::/48 kw +2001:67c:7f8::/48 nl +2001:67c:7fc::/48 nl 2001:67c:1000::/48 se 2001:67c:1008::/48 ru 2001:67c:1010::/48 se 2001:67c:1018::/48 de -2001:67c:1020::/48 gb +2001:67c:1020::/48 at 2001:67c:1028::/48 ch +2001:67c:1030::/48 fr +2001:67c:1034::/48 ro +2001:67c:1038::/48 ro +2001:67c:103c::/48 cz +2001:67c:1040::/48 de +2001:67c:1044::/48 ch +2001:67c:1048::/48 gb +2001:67c:104c::/48 nl +2001:67c:1050::/48 sk +2001:67c:1054::/48 de +2001:67c:1058::/48 nl +2001:67c:105c::/48 gb +2001:67c:1060::/48 lu +2001:67c:1064::/48 nl +2001:67c:1068::/48 dk +2001:67c:106c::/48 gb +2001:67c:1070::/48 no +2001:67c:1078::/48 at +2001:67c:107c::/48 se +2001:67c:1080::/48 nl +2001:67c:1084::/48 se +2001:67c:1088::/48 gb +2001:67c:1090::/48 ch +2001:67c:1094::/48 gb +2001:67c:1098::/48 gb +2001:67c:109c::/48 gb +2001:67c:10a0::/48 gb +2001:67c:10a4::/48 fi +2001:67c:10a8::/48 de +2001:67c:10b0::/48 ru +2001:67c:10b4::/48 pl +2001:67c:10b8::/48 at +2001:67c:10bc::/48 at +2001:67c:10c0::/48 se +2001:67c:10c4::/48 gb +2001:67c:10c8::/48 se +2001:67c:10cc::/48 se +2001:67c:10d0::/48 se +2001:67c:10d4::/48 gb +2001:67c:10d8::/48 gb +2001:67c:10dc::/48 se +2001:67c:10e0::/48 at +2001:67c:10e4::/48 se +2001:67c:10e8::/48 cz +2001:67c:10ec::/48 ch +2001:67c:10f0::/48 fr +2001:67c:10f4::/48 at +2001:67c:10f8::/48 fr +2001:67c:10fc::/48 se +2001:67c:1100::/48 ru +2001:67c:1104::/48 se +2001:67c:1108::/48 fr +2001:67c:1110::/48 at +2001:67c:1118::/48 se +2001:67c:111c::/48 ch +2001:67c:1120::/48 pl +2001:67c:1124::/48 si +2001:67c:1128::/48 ch +2001:67c:112c::/48 se +2001:67c:1130::/48 se +2001:67c:1134::/48 nl +2001:67c:1138::/48 cz +2001:67c:113c::/48 ua +2001:67c:1140::/48 de +2001:67c:1144::/48 ru +2001:67c:1148::/48 es +2001:67c:114c::/48 ru +2001:67c:1150::/48 il +2001:67c:1154::/48 tr +2001:67c:1158::/48 pl +2001:67c:115c::/48 ro +2001:67c:1164::/48 ua +2001:67c:1168::/48 pl +2001:67c:116c::/48 se +2001:67c:1170::/48 gb +2001:67c:1174::/48 se +2001:67c:1178::/48 pl +2001:67c:117c::/48 ua +2001:67c:1180::/48 se +2001:67c:1184::/48 hr +2001:67c:1188::/48 ru +2001:67c:118c::/48 fr +2001:67c:1190::/48 pl +2001:67c:1194::/48 pl +2001:67c:1198::/48 sa +2001:67c:11a0::/48 ua +2001:67c:11a4::/48 ro +2001:67c:11a8::/48 cz +2001:67c:11ac::/48 se +2001:67c:11b0::/48 fr +2001:67c:11b4::/48 es +2001:67c:11b8::/48 tr +2001:67c:11bc::/48 gb +2001:67c:11c0::/48 dk +2001:67c:11c4::/48 ro +2001:67c:11c8::/48 fr +2001:67c:11cc::/48 se +2001:67c:11d0::/48 ro +2001:67c:11d4::/48 ua +2001:67c:11d8::/48 se +2001:67c:11dc::/48 de +2001:67c:11e0::/48 bg +2001:67c:11e4::/48 pl +2001:67c:11e8::/48 gb +2001:67c:11ec::/48 tr +2001:67c:11f0::/48 se +2001:67c:11f4::/48 at +2001:67c:11f8::/48 de +2001:67c:11fc::/48 ru 2001:67c:1200::/48 fr 2001:67c:1210::/48 ru 2001:67c:1220::/48 cz -2001:67c:1230::/48 se +2001:67c:1230::/48 ch +2001:67c:1240::/48 ie +2001:67c:1244::/48 se +2001:67c:1248::/48 ro +2001:67c:124c::/48 se +2001:67c:1250::/48 ch +2001:67c:1254::/48 fr +2001:67c:1258::/48 ru +2001:67c:125c::/48 ua +2001:67c:1260::/48 cz +2001:67c:1264::/48 ru +2001:67c:1268::/48 se +2001:67c:126c::/48 ch +2001:67c:1270::/48 gb +2001:67c:1274::/48 de +2001:67c:1278::/48 fr +2001:67c:127c::/48 dk +2001:67c:1280::/48 at +2001:67c:1284::/48 at +2001:67c:1288::/48 nl +2001:67c:128c::/48 fr +2001:67c:1290::/48 pl +2001:67c:1294::/48 se +2001:67c:1298::/48 pl +2001:67c:129c::/48 at +2001:67c:12a0::/48 de +2001:67c:12a4::/48 tr +2001:67c:12a8::/48 fi +2001:67c:12ac::/48 lu +2001:67c:12b4::/48 gb +2001:67c:12b8::/48 de +2001:67c:12bc::/48 si +2001:67c:12c0::/48 no +2001:67c:12c8::/48 lv +2001:67c:12cc::/48 nl +2001:67c:12d0::/48 si +2001:67c:12d4::/48 gb +2001:67c:12d8::/48 nl +2001:67c:12dc::/48 gb +2001:67c:12e4::/48 sa +2001:67c:12e8::/48 de +2001:67c:12f0::/48 de +2001:67c:12f4::/48 cz +2001:67c:12f8::/48 dk +2001:67c:12fc::/48 pl +2001:67c:1300::/48 ch +2001:67c:1304::/48 ru +2001:67c:1308::/48 md +2001:67c:130c::/48 se +2001:67c:1310::/48 gb +2001:67c:1314::/48 cz +2001:67c:1318::/48 cz +2001:67c:131c::/48 ru +2001:67c:1320::/48 de +2001:67c:1324::/48 ua +2001:67c:1328::/48 si +2001:67c:132c::/48 se +2001:67c:1330::/48 pl +2001:67c:1334::/48 de +2001:67c:1338::/48 pl +2001:67c:133c::/48 at +2001:67c:1340::/48 hr +2001:67c:1344::/48 ru +2001:67c:1348::/48 fr +2001:67c:134c::/48 cz +2001:67c:1350::/48 cy +2001:67c:1354::/48 gb +2001:67c:1358::/48 ru +2001:67c:135c::/48 se +2001:67c:1360::/48 gb +2001:67c:1364::/48 de +2001:67c:1368::/48 ch +2001:67c:136c::/48 ch +2001:67c:1370::/48 ua +2001:67c:1374::/48 ru +2001:67c:1378::/48 ua +2001:67c:137c::/48 es +2001:67c:1380::/48 pl +2001:67c:1384::/48 se +2001:67c:1388::/48 gb +2001:67c:138c::/48 pl +2001:67c:1390::/48 se +2001:67c:1394::/48 ua +2001:67c:1398::/48 se +2001:67c:139c::/48 at +2001:67c:13a0::/48 ua +2001:67c:13a4::/48 ro +2001:67c:13a8::/48 gb +2001:67c:13ac::/48 fi +2001:67c:13b0::/48 de +2001:67c:13b4::/48 nl +2001:67c:13b8::/48 ua +2001:67c:13bc::/48 se +2001:67c:13c0::/48 ch +2001:67c:13c4::/48 cz +2001:67c:13c8::/48 lv +2001:67c:13cc::/48 gb +2001:67c:13d0::/48 ru +2001:67c:13d4::/48 de +2001:67c:13d8::/48 se +2001:67c:13dc::/48 ru +2001:67c:13e0::/48 pl +2001:67c:13e4::/48 ru +2001:67c:13e8::/48 at +2001:67c:13ec::/48 pt +2001:67c:13f0::/48 ru +2001:67c:13f4::/48 se +2001:67c:13f8::/48 at +2001:67c:13fc::/48 ru 2001:67c:1400::/48 de -2001:67c:1420::/48 de 2001:67c:1440::/48 ru 2001:67c:1460::/48 de +2001:67c:1480::/48 cz +2001:67c:1484::/48 ru +2001:67c:1488::/48 se +2001:67c:148c::/48 se +2001:67c:1490::/48 se +2001:67c:1494::/48 ru +2001:67c:1498::/48 de +2001:67c:149c::/48 si +2001:67c:14a0::/48 cz +2001:67c:14a4::/48 bg +2001:67c:14a8::/48 kz +2001:67c:14ac::/48 fr +2001:67c:14b0::/48 nl +2001:67c:14b4::/48 ru +2001:67c:14b8::/48 de +2001:67c:14bc::/48 at +2001:67c:14c0::/48 fi +2001:67c:14c4::/48 de +2001:67c:14c8::/48 gb +2001:67c:14d0::/48 no +2001:67c:14d4::/48 at +2001:67c:14d8::/48 se +2001:67c:14dc::/48 se +2001:67c:14e0::/48 de +2001:67c:1500::/48 se +2001:67c:1504::/48 se +2001:67c:1508::/48 at +2001:67c:150c::/48 ch +2001:67c:1510::/48 gb +2001:67c:1518::/48 ua +2001:67c:151c::/48 at +2001:67c:1520::/48 gb +2001:67c:1524::/48 ua +2001:67c:1528::/48 ua +2001:67c:152c::/48 gb +2001:67c:1530::/48 gb +2001:67c:1534::/48 se +2001:67c:1538::/48 gb +2001:67c:153c::/48 se +2001:67c:1544::/48 se +2001:67c:1548::/48 no +2001:67c:154c::/48 se +2001:67c:1550::/48 de +2001:67c:1554::/48 tr +2001:67c:1558::/48 tr +2001:67c:155c::/48 pl +2001:67c:1560::/48 gb +2001:67c:1570::/48 ru +2001:67c:1574::/48 ru +2001:67c:1578::/48 cz +2001:67c:157c::/48 fr +2001:67c:1580::/48 ch +2001:67c:1584::/48 ua +2001:67c:1588::/48 ua +2001:67c:158c::/48 de +2001:67c:1590::/48 cz +2001:67c:1598::/48 nl +2001:67c:159c::/48 pl +2001:67c:15a0::/48 cz +2001:67c:15b0::/48 nl +2001:67c:15b4::/48 de +2001:67c:15b8::/48 nl +2001:67c:15bc::/48 se +2001:67c:15c0::/48 ch +2001:67c:15c4::/48 se +2001:67c:15c8::/48 se +2001:67c:15cc::/48 ro +2001:67c:15d0::/48 ru +2001:67c:15d4::/48 se +2001:67c:15d8::/48 ua +2001:67c:15dc::/48 ch +2001:67c:15e0::/48 ro +2001:67c:15e4::/48 ua +2001:67c:15e8::/48 se +2001:67c:15ec::/48 se +2001:67c:15f0::/48 ua +2001:67c:15f4::/48 gb +2001:67c:15f8::/48 ru +2001:67c:15fc::/48 se 2001:67c:1600::/48 de 2001:67c:1640::/48 no +2001:67c:1680::/48 gb +2001:67c:1684::/48 si +2001:67c:168c::/48 at +2001:67c:1690::/48 fr +2001:67c:1694::/48 pl +2001:67c:1698::/48 pl +2001:67c:169c::/48 se +2001:67c:16a0::/48 dk +2001:67c:16a4::/48 dk +2001:67c:16a8::/48 at +2001:67c:16ac::/48 es +2001:67c:16b0::/48 se +2001:67c:16b4::/48 nl +2001:67c:16b8::/48 bg +2001:67c:16bc::/48 se +2001:67c:16c0::/48 cz +2001:67c:16c4::/48 si +2001:67c:16c8::/48 cz +2001:67c:16cc::/48 dk +2001:67c:16d0::/48 gb +2001:67c:16d8::/48 ro +2001:67c:16dc::/48 ch +2001:67c:16e4::/48 hr +2001:67c:16e8::/48 pl +2001:67c:16ec::/48 ro +2001:67c:16f0::/48 de +2001:67c:16f4::/48 si +2001:67c:16f8::/48 pl +2001:67c:16fc::/48 se +2001:67c:1700::/48 de +2001:67c:1704::/48 pl +2001:67c:1708::/48 ro +2001:67c:170c::/48 cz +2001:67c:1710::/48 gb +2001:67c:1714::/48 de +2001:67c:1718::/48 fr +2001:67c:1720::/48 ua +2001:67c:1724::/48 nl +2001:67c:1728::/48 ua +2001:67c:172c::/48 gb +2001:67c:1730::/48 gb +2001:67c:1734::/48 nl +2001:67c:1738::/48 il +2001:67c:173c::/48 de +2001:67c:1740::/48 fr +2001:67c:1744::/48 dk +2001:67c:1748::/48 de +2001:67c:174c::/48 se +2001:67c:1750::/48 at +2001:67c:1754::/48 se +2001:67c:1758::/48 de +2001:67c:175c::/48 de +2001:67c:1760::/48 dk +2001:67c:1764::/48 ro +2001:67c:1768::/48 ru +2001:67c:176c::/48 ua +2001:67c:1770::/48 se +2001:67c:1774::/48 ru +2001:67c:1778::/48 pl +2001:67c:177c::/48 lt +2001:67c:1780::/48 ch +2001:67c:1784::/48 se +2001:67c:1790::/48 ru +2001:67c:1794::/48 se +2001:67c:1798::/48 cz +2001:67c:17a0::/48 fi +2001:67c:17a4::/48 ch +2001:67c:17a8::/48 se +2001:67c:17ac::/48 se +2001:67c:17b4::/48 cz +2001:67c:17b8::/48 cz +2001:67c:17bc::/48 se +2001:67c:17c0::/48 se +2001:67c:17c4::/48 se +2001:67c:17c8::/48 de +2001:67c:17cc::/48 se +2001:67c:17d0::/48 cz +2001:67c:17d4::/48 de +2001:67c:17d8::/48 pl +2001:67c:17dc::/48 se +2001:67c:17e0::/48 se +2001:67c:17e4::/48 no +2001:67c:17e8::/48 no +2001:67c:17ec::/48 nl +2001:67c:17f0::/48 se +2001:67c:17f4::/48 se +2001:67c:17f8::/48 ru +2001:67c:17fc::/48 ro +2001:67c:1800::/48 se +2001:67c:1804::/48 ro +2001:67c:1808::/48 be +2001:67c:1810::/48 be +2001:67c:1814::/48 fr +2001:67c:1818::/48 ch +2001:67c:181c::/48 de +2001:67c:1820::/48 de +2001:67c:1824::/48 is +2001:67c:1828::/48 cz +2001:67c:182c::/48 ro +2001:67c:1830::/48 se +2001:67c:1834::/48 be +2001:67c:1838::/48 be +2001:67c:183c::/48 be +2001:67c:1840::/48 ru +2001:67c:1844::/48 ro +2001:67c:1848::/48 ua +2001:67c:184c::/48 fr +2001:67c:1850::/48 fi +2001:67c:1854::/48 ro +2001:67c:1858::/48 dk +2001:67c:185c::/48 dk +2001:67c:1860::/48 ru +2001:67c:1864::/48 at +2001:67c:1868::/48 ru +2001:67c:186c::/48 se +2001:67c:1870::/48 nl +2001:67c:1874::/48 cz +2001:67c:187c::/48 ro +2001:67c:1880::/48 se +2001:67c:1884::/48 gb +2001:67c:1888::/48 se +2001:67c:188c::/48 pl +2001:67c:1890::/48 se +2001:67c:1894::/48 se +2001:67c:1898::/48 se +2001:67c:189c::/48 se +2001:67c:18a0::/48 nl +2001:67c:18a4::/48 ru +2001:67c:18a8::/48 by +2001:67c:18ac::/48 ru +2001:67c:18b0::/48 de +2001:67c:18b4::/48 dk +2001:67c:18b8::/48 de +2001:67c:18bc::/48 de +2001:67c:18c0::/48 ro +2001:67c:18c8::/48 sa +2001:67c:18d0::/48 ru +2001:67c:18d4::/48 nz +2001:67c:18d8::/48 se +2001:67c:18dc::/48 li +2001:67c:18e0::/48 si +2001:67c:18e4::/48 gb +2001:67c:18e8::/48 de +2001:67c:18ec::/48 de +2001:67c:18f0::/48 de +2001:67c:18f4::/48 se +2001:67c:18f8::/48 ro +2001:67c:18fc::/48 se +2001:67c:1900::/48 be +2001:67c:1910::/48 se +2001:67c:1914::/48 cz +2001:67c:1918::/48 nl +2001:67c:191c::/48 se +2001:67c:1920::/48 se +2001:67c:1924::/48 de +2001:67c:1928::/48 de +2001:67c:192c::/48 de +2001:67c:1930::/48 at +2001:67c:1940::/48 gb +2001:67c:1944::/48 de +2001:67c:1948::/48 ua +2001:67c:194c::/48 de +2001:67c:1950::/48 de +2001:67c:1954::/48 gb +2001:67c:1958::/48 dk +2001:67c:195c::/48 es +2001:67c:1960::/48 ro +2001:67c:1964::/48 ua +2001:67c:1968::/48 de +2001:67c:196c::/48 de +2001:67c:1970::/48 ru +2001:67c:1974::/48 at +2001:67c:1978::/48 ro +2001:67c:197c::/48 no +2001:67c:1980::/48 fr +2001:67c:1984::/48 bg +2001:67c:1988::/48 de +2001:67c:198c::/48 eu +2001:67c:1990::/48 ro +2001:67c:1994::/48 de +2001:67c:1998::/48 lu +2001:67c:199c::/48 de +2001:67c:19a0::/48 se +2001:67c:19a4::/48 se +2001:67c:19a8::/48 ro +2001:67c:19ac::/48 ua +2001:67c:19b0::/48 fi +2001:67c:19c0::/48 de +2001:67c:19c4::/48 cz +2001:67c:19c8::/48 pl +2001:67c:19cc::/48 de +2001:67c:19d0::/48 se +2001:67c:19d4::/48 ru +2001:67c:19d8::/48 si +2001:67c:19dc::/48 se +2001:67c:19e4::/48 ro +2001:67c:19e8::/48 tr +2001:67c:19ec::/48 de +2001:67c:19f0::/48 ru +2001:67c:19f4::/48 ru +2001:67c:19f8::/48 ru +2001:67c:19fc::/48 ch 2001:67c:1a00::/48 nl +2001:67c:1b00::/48 ru +2001:67c:1b04::/48 ru +2001:67c:1b08::/48 it +2001:67c:1b0c::/48 sa +2001:67c:1b10::/48 ru +2001:67c:1b14::/48 se +2001:67c:1b18::/48 ru +2001:67c:1b1c::/48 lu +2001:67c:1b20::/48 ro +2001:67c:1b24::/48 gb +2001:67c:1b28::/48 ru +2001:67c:1b2c::/48 se +2001:67c:1b30::/48 ro +2001:67c:1b34::/48 de +2001:67c:1b38::/48 pl +2001:67c:1b3c::/48 si +2001:67c:1b40::/48 gb +2001:67c:1b50::/48 cz +2001:67c:1b54::/48 ro +2001:67c:1b58::/48 gb +2001:67c:1b60::/48 de +2001:67c:1b64::/48 cz +2001:67c:1b68::/48 se +2001:67c:1b6c::/48 de +2001:67c:1b70::/48 at +2001:67c:1b74::/48 se +2001:67c:1b78::/48 ru +2001:67c:1b7c::/48 ru +2001:67c:1b80::/48 ru +2001:67c:1b84::/48 de +2001:67c:1b88::/48 cz +2001:67c:1b8c::/48 pl +2001:67c:1b90::/48 pl +2001:67c:1b98::/48 se +2001:67c:1b9c::/48 nl +2001:67c:1ba0::/48 at +2001:67c:1ba4::/48 se +2001:67c:1ba8::/48 de +2001:67c:1bac::/48 gb +2001:67c:1bb0::/48 fi +2001:67c:1bb4::/48 ro +2001:67c:1bb8::/48 se +2001:67c:1bbc::/48 nl +2001:67c:1bc0::/48 ru +2001:67c:1bc4::/48 cz +2001:67c:1bc8::/48 ru +2001:67c:1bcc::/48 ua +2001:67c:1bd0::/48 ch +2001:67c:1bd4::/48 sk +2001:67c:1bd8::/48 de +2001:67c:1bdc::/48 ro +2001:67c:1be0::/48 se +2001:67c:1be4::/48 fr +2001:67c:1be8::/48 fi +2001:67c:1bec::/48 ru +2001:67c:1bf0::/48 se +2001:67c:1bf4::/48 de +2001:67c:1bf8::/48 ua +2001:67c:1bfc::/48 bg 2001:67c:1c00::/48 no +2001:67c:2000::/48 ru 2001:67c:2004::/48 si 2001:67c:2008::/48 fr 2001:67c:200c::/48 ru @@ -523,9 +1390,9 @@ 2001:67c:2018::/48 de 2001:67c:201c::/48 pl 2001:67c:2020::/48 no -2001:67c:2024::/48 fr +2001:67c:2024::/48 gb 2001:67c:2028::/48 se -2001:67c:202c::/48 de +2001:67c:202c::/48 se 2001:67c:2030::/48 ua 2001:67c:2034::/48 ch 2001:67c:2038::/48 cz @@ -535,8 +1402,9 @@ 2001:67c:2048::/48 ch 2001:67c:204c::/48 gb 2001:67c:2050::/48 de -2001:67c:2058::/48 nl -2001:67c:205c::/48 cz +2001:67c:2054::/48 de +2001:67c:2058::/48 gb +2001:67c:205c::/48 ru 2001:67c:2060::/48 se 2001:67c:2064::/48 fr 2001:67c:2068::/48 ch @@ -545,16 +1413,18 @@ 2001:67c:2074::/48 at 2001:67c:2078::/48 at 2001:67c:207c::/48 de -2001:67c:2080::/48 se -2001:67c:2084::/48 cz +2001:67c:2080::/48 no +2001:67c:2084::/48 ru 2001:67c:2088::/48 de 2001:67c:208c::/48 nl -2001:67c:2090::/48 ch -2001:67c:2098::/48 de +2001:67c:2090::/48 at +2001:67c:2094::/48 ru +2001:67c:2098::/48 ru +2001:67c:209c::/48 de 2001:67c:20a0::/48 de 2001:67c:20a8::/48 nl 2001:67c:20ac::/48 ch -2001:67c:20b0::/48 cz +2001:67c:20b0::/48 ru 2001:67c:20b4::/48 gb 2001:67c:20b8::/48 si 2001:67c:20c0::/48 fi @@ -570,11 +1440,11 @@ 2001:67c:20ec::/48 at 2001:67c:20f0::/48 fr 2001:67c:20f4::/48 ro -2001:67c:20f8::/48 gb -2001:67c:20fc::/48 ro +2001:67c:20f8::/48 ch +2001:67c:20fc::/48 ru 2001:67c:2100::/48 ro 2001:67c:2104::/48 de -2001:67c:2108::/48 cz +2001:67c:2108::/48 ru 2001:67c:210c::/48 se 2001:67c:2110::/48 ro 2001:67c:2114::/48 is @@ -582,20 +1452,20 @@ 2001:67c:211c::/48 at 2001:67c:2120::/48 ro 2001:67c:2124::/48 hu -2001:67c:2128::/48 cz +2001:67c:2128::/48 ua 2001:67c:212c::/48 at 2001:67c:2130::/48 pl 2001:67c:2134::/48 se 2001:67c:2138::/48 de 2001:67c:213c::/48 pl -2001:67c:2140::/48 nl -2001:67c:2144::/48 is +2001:67c:2140::/48 gb +2001:67c:2144::/48 fi 2001:67c:2148::/48 nl 2001:67c:214c::/48 de 2001:67c:2150::/48 nl 2001:67c:2154::/48 bg -2001:67c:2158::/48 cz -2001:67c:215c::/48 cz +2001:67c:2158::/48 pl +2001:67c:215c::/48 ru 2001:67c:2160::/48 fr 2001:67c:2164::/48 sa 2001:67c:2168::/48 fi @@ -605,12 +1475,13 @@ 2001:67c:2178::/48 de 2001:67c:217c::/48 fr 2001:67c:2180::/48 at -2001:67c:2188::/48 gb +2001:67c:2184::/48 de +2001:67c:2188::/48 fr 2001:67c:218c::/48 ua 2001:67c:2190::/48 cz 2001:67c:2194::/48 cz 2001:67c:2198::/48 lv -2001:67c:219c::/48 cz +2001:67c:219c::/48 ru 2001:67c:21a0::/48 it 2001:67c:21a4::/48 fi 2001:67c:21a8::/48 at @@ -618,12 +1489,13 @@ 2001:67c:21b0::/48 de 2001:67c:21b4::/48 nl 2001:67c:21b8::/48 de -2001:67c:21bc::/48 cz +2001:67c:21bc::/48 bg 2001:67c:21c0::/48 ch 2001:67c:21c4::/48 gb 2001:67c:21c8::/48 bg 2001:67c:21cc::/48 es 2001:67c:21d0::/48 cz +2001:67c:21d4::/48 se 2001:67c:21d8::/48 fi 2001:67c:21dc::/48 pl 2001:67c:21e0::/48 no @@ -642,25 +1514,26 @@ 2001:67c:2214::/48 se 2001:67c:2218::/48 fr 2001:67c:2220::/48 ch -2001:67c:2224::/48 cz +2001:67c:2224::/48 ua 2001:67c:2228::/48 se -2001:67c:222c::/48 cz -2001:67c:2230::/48 hr +2001:67c:222c::/48 sk +2001:67c:2230::/48 be 2001:67c:2234::/48 gb 2001:67c:2238::/48 ch 2001:67c:223c::/48 de 2001:67c:2240::/48 se -2001:67c:2244::/48 cz +2001:67c:2244::/48 ru 2001:67c:2248::/48 at +2001:67c:224c::/48 sk 2001:67c:2250::/48 pl 2001:67c:2254::/48 si 2001:67c:2258::/48 de 2001:67c:225c::/48 se 2001:67c:2260::/48 at -2001:67c:2264::/48 cz -2001:67c:2268::/48 cz +2001:67c:2264::/48 kg +2001:67c:2268::/48 by 2001:67c:226c::/48 nl -2001:67c:2270::/48 cz +2001:67c:2270::/48 gb 2001:67c:2274::/48 de 2001:67c:2278::/48 pl 2001:67c:227c::/48 dk @@ -668,14 +1541,14 @@ 2001:67c:2284::/48 nl 2001:67c:2288::/48 si 2001:67c:228c::/48 ro -2001:67c:2290::/48 nl -2001:67c:2294::/48 eu -2001:67c:2298::/48 gb +2001:67c:2290::/48 de +2001:67c:2294::/48 es +2001:67c:2298::/48 us 2001:67c:229c::/48 gr 2001:67c:22a0::/48 at 2001:67c:22a4::/48 fr 2001:67c:22a8::/48 si -2001:67c:22ac::/48 se +2001:67c:22ac::/48 eu 2001:67c:22b0::/48 pl 2001:67c:22b4::/48 cz 2001:67c:22b8::/48 se @@ -684,8 +1557,7 @@ 2001:67c:22c4::/48 ua 2001:67c:22c8::/48 se 2001:67c:22cc::/48 gb -2001:67c:22d0::/48 cz -2001:67c:22d4::/48 eu +2001:67c:22d0::/48 ru 2001:67c:22d8::/48 si 2001:67c:22dc::/48 nl 2001:67c:22e0::/48 se @@ -693,6 +1565,7 @@ 2001:67c:22e8::/48 ch 2001:67c:22ec::/48 de 2001:67c:22f0::/48 rs +2001:67c:22f4::/48 de 2001:67c:22f8::/48 cz 2001:67c:22fc::/48 se 2001:67c:2300::/48 si @@ -706,21 +1579,20 @@ 2001:67c:2320::/48 no 2001:67c:2324::/48 si 2001:67c:2328::/48 at -2001:67c:232c::/48 lv 2001:67c:2330::/48 at 2001:67c:2334::/48 de 2001:67c:2338::/48 de -2001:67c:233c::/48 cz +2001:67c:233c::/48 ru 2001:67c:2340::/48 nl -2001:67c:2344::/48 eu +2001:67c:2344::/48 ru 2001:67c:2348::/48 ae 2001:67c:234c::/48 pl -2001:67c:2350::/48 ae +2001:67c:2350::/48 ch 2001:67c:2354::/48 se 2001:67c:2358::/48 se 2001:67c:235c::/48 se 2001:67c:2360::/48 pl -2001:67c:2364::/48 cz +2001:67c:2364::/48 ua 2001:67c:2368::/48 si 2001:67c:236c::/48 gb 2001:67c:2370::/48 ua @@ -729,14 +1601,16 @@ 2001:67c:237c::/48 dk 2001:67c:2380::/48 ua 2001:67c:2384::/48 se -2001:67c:2388::/48 cz +2001:67c:2388::/48 dk 2001:67c:238c::/48 at +2001:67c:2390::/48 nl 2001:67c:2394::/48 de -2001:67c:2398::/48 cz +2001:67c:2398::/48 nl 2001:67c:239c::/48 fr -2001:67c:23a0::/48 cz +2001:67c:23a0::/48 ua 2001:67c:23a4::/48 dk 2001:67c:23a8::/48 pl +2001:67c:23ac::/48 se 2001:67c:23b0::/48 de 2001:67c:23b4::/48 no 2001:67c:23b8::/48 nl @@ -745,22 +1619,25 @@ 2001:67c:23c4::/48 nl 2001:67c:23c8::/48 gb 2001:67c:23cc::/48 dk -2001:67c:23d0::/48 fr -2001:67c:23d4::/48 eu +2001:67c:23d0::/48 no +2001:67c:23d4::/48 ee 2001:67c:23d8::/48 at +2001:67c:23e0::/48 fr 2001:67c:23e4::/48 be 2001:67c:23e8::/48 ae -2001:67c:23ec::/48 gb +2001:67c:23ec::/48 bg 2001:67c:23f0::/48 ae 2001:67c:23f4::/48 pl -2001:67c:23f8::/48 de +2001:67c:23f8::/48 dk 2001:67c:23fc::/48 bg 2001:67c:2400::/48 nl 2001:67c:2404::/48 at 2001:67c:2408::/48 ae 2001:67c:240c::/48 se 2001:67c:2410::/48 tr +2001:67c:2414::/48 de 2001:67c:2418::/48 at +2001:67c:241c::/48 gb 2001:67c:2420::/48 at 2001:67c:2424::/48 si 2001:67c:2428::/48 se @@ -770,9 +1647,9 @@ 2001:67c:2444::/48 se 2001:67c:2448::/48 se 2001:67c:244c::/48 ru -2001:67c:2450::/48 ee +2001:67c:2450::/48 gb 2001:67c:2454::/48 se -2001:67c:2458::/48 cz +2001:67c:2458::/48 no 2001:67c:245c::/48 fi 2001:67c:2460::/48 se 2001:67c:2464::/48 nl @@ -780,9 +1657,9 @@ 2001:67c:246c::/48 ua 2001:67c:2470::/48 ua 2001:67c:2474::/48 nl -2001:67c:2478::/48 gb +2001:67c:2478::/48 at 2001:67c:247c::/48 si -2001:67c:2480::/48 eu +2001:67c:2480::/48 de 2001:67c:2484::/48 se 2001:67c:2488::/48 ch 2001:67c:248c::/48 gb @@ -793,18 +1670,18 @@ 2001:67c:24a0::/48 cz 2001:67c:24a4::/48 cz 2001:67c:24a8::/48 ua -2001:67c:24ac::/48 eu -2001:67c:24b0::/48 no +2001:67c:24ac::/48 gb +2001:67c:24b0::/48 de 2001:67c:24b4::/48 nl 2001:67c:24b8::/48 se -2001:67c:24bc::/48 se -2001:67c:24c0::/48 de +2001:67c:24bc::/48 de +2001:67c:24c0::/48 ru 2001:67c:24c4::/48 ro 2001:67c:24c8::/48 ru 2001:67c:24cc::/48 pl -2001:67c:24d0::/48 cz +2001:67c:24d0::/48 ru 2001:67c:24d4::/48 gb -2001:67c:24d8::/48 se +2001:67c:24d8::/48 no 2001:67c:24dc::/48 si 2001:67c:24e0::/48 dk 2001:67c:24e4::/48 no @@ -818,13 +1695,13 @@ 2001:67c:2524::/48 se 2001:67c:2528::/48 lv 2001:67c:252c::/48 at -2001:67c:2530::/48 gb +2001:67c:2530::/48 se 2001:67c:2534::/48 ua 2001:67c:2538::/48 se 2001:67c:253c::/48 de 2001:67c:2540::/48 ch -2001:67c:2544::/48 gb -2001:67c:2548::/48 se +2001:67c:2544::/48 de +2001:67c:2548::/48 de 2001:67c:254c::/48 se 2001:67c:2550::/48 se 2001:67c:2554::/48 se @@ -832,15 +1709,16 @@ 2001:67c:255c::/48 pl 2001:67c:2560::/48 at 2001:67c:2564::/48 nl +2001:67c:2568::/48 se 2001:67c:256c::/48 cz -2001:67c:2570::/48 eu +2001:67c:2570::/48 li 2001:67c:2574::/48 no -2001:67c:2578::/48 eu +2001:67c:2578::/48 gb 2001:67c:257c::/48 dk -2001:67c:2580::/48 eu -2001:67c:2584::/48 eu +2001:67c:2580::/48 ro +2001:67c:2584::/48 ro 2001:67c:2588::/48 at -2001:67c:258c::/48 de +2001:67c:258c::/48 ch 2001:67c:2590::/48 de 2001:67c:2594::/48 cz 2001:67c:2598::/48 no @@ -855,17 +1733,591 @@ 2001:67c:25bc::/48 se 2001:67c:25c0::/48 cz 2001:67c:25c4::/48 pl -2001:67c:25c8::/48 at +2001:67c:25c8::/48 ru 2001:67c:25cc::/48 pl -2001:680::/32 nl +2001:67c:25d0::/48 ru +2001:67c:25d4::/48 de +2001:67c:25d8::/48 si +2001:67c:25dc::/48 ua +2001:67c:25e0::/48 at +2001:67c:25e4::/48 fr +2001:67c:25e8::/48 be +2001:67c:25ec::/48 ru +2001:67c:25f0::/48 il +2001:67c:25f4::/48 ua +2001:67c:25f8::/48 eu +2001:67c:25fc::/48 at +2001:67c:2600::/48 at +2001:67c:2604::/48 sk +2001:67c:260c::/48 at +2001:67c:2610::/48 at +2001:67c:2614::/48 ch +2001:67c:2618::/48 ee +2001:67c:261c::/48 nl +2001:67c:2620::/48 cz +2001:67c:2624::/48 sa +2001:67c:2628::/48 lv +2001:67c:262c::/48 nl +2001:67c:2630::/48 gb +2001:67c:2634::/48 pl +2001:67c:2638::/48 sk +2001:67c:263c::/48 at +2001:67c:2640::/48 ae +2001:67c:2644::/48 gb +2001:67c:2648::/48 ch +2001:67c:264c::/48 at +2001:67c:2650::/48 se +2001:67c:2654::/48 ae +2001:67c:2658::/48 se +2001:67c:265c::/48 de +2001:67c:2660::/48 gb +2001:67c:2664::/48 dk +2001:67c:266c::/48 se +2001:67c:2670::/48 sk +2001:67c:2674::/48 de +2001:67c:2678::/48 se +2001:67c:267c::/48 pl +2001:67c:2680::/48 se +2001:67c:2684::/48 dk +2001:67c:2688::/48 de +2001:67c:268c::/48 se +2001:67c:2690::/48 be +2001:67c:2694::/48 pl +2001:67c:2698::/48 fr +2001:67c:269c::/48 se +2001:67c:26a0::/48 ru +2001:67c:26a4::/48 at +2001:67c:26a8::/48 be +2001:67c:26ac::/48 nl +2001:67c:26b0::/48 se +2001:67c:26b4::/48 gb +2001:67c:26b8::/48 gb +2001:67c:26bc::/48 ru +2001:67c:26c0::/48 nl +2001:67c:26d0::/48 se +2001:67c:26d4::/48 sk +2001:67c:26d8::/48 fr +2001:67c:26dc::/48 pl +2001:67c:26e0::/48 pl +2001:67c:26e4::/48 at +2001:67c:26e8::/48 gb +2001:67c:26ec::/48 gb +2001:67c:26f0::/48 dk +2001:67c:26f4::/48 de +2001:67c:26f8::/48 ua +2001:67c:26fc::/48 si +2001:67c:2700::/48 fi +2001:67c:2704::/48 ru +2001:67c:2708::/48 pl +2001:67c:270c::/48 pl +2001:67c:2710::/48 cz +2001:67c:2714::/48 ru +2001:67c:2718::/48 de +2001:67c:271c::/48 se +2001:67c:2720::/48 si +2001:67c:2724::/48 dk +2001:67c:2728::/48 ir +2001:67c:272c::/48 gb +2001:67c:2730::/48 si +2001:67c:2734::/48 dk +2001:67c:2738::/48 gb +2001:67c:273c::/48 ch +2001:67c:2740::/48 sk +2001:67c:2744::/48 si +2001:67c:2748::/48 gr +2001:67c:274c::/48 de +2001:67c:2750::/48 pl +2001:67c:2754::/48 de +2001:67c:2758::/48 pl +2001:67c:275c::/48 de +2001:67c:2760::/48 ru +2001:67c:2764::/48 no +2001:67c:2768::/48 dk +2001:67c:276c::/48 nl +2001:67c:2770::/48 se +2001:67c:2774::/48 ae +2001:67c:2778::/48 ru +2001:67c:277c::/48 dk +2001:67c:2780::/48 se +2001:67c:2784::/48 fi +2001:67c:2788::/48 se +2001:67c:278c::/48 de +2001:67c:2790::/48 gb +2001:67c:2794::/48 se +2001:67c:2798::/48 se +2001:67c:279c::/48 nl +2001:67c:27a0::/48 de +2001:67c:27a4::/48 se +2001:67c:27a8::/48 dk +2001:67c:27ac::/48 de +2001:67c:27b0::/48 fi +2001:67c:27b4::/48 ua +2001:67c:27b8::/48 sa +2001:67c:27bc::/48 de +2001:67c:27c0::/48 gb +2001:67c:27c4::/48 ru +2001:67c:27c8::/48 ru +2001:67c:27cc::/48 se +2001:67c:27d0::/48 de +2001:67c:27d4::/48 pl +2001:67c:27d8::/48 cz +2001:67c:27dc::/48 gb +2001:67c:27e0::/48 se +2001:67c:27e4::/48 si +2001:67c:27e8::/48 si +2001:67c:27ec::/48 no +2001:67c:27f0::/48 at +2001:67c:27f4::/48 pl +2001:67c:27f8::/48 se +2001:67c:27fc::/48 de +2001:67c:2800::/48 ch +2001:67c:2808::/48 pl +2001:67c:280c::/48 fr +2001:67c:2810::/48 dk +2001:67c:2818::/48 de +2001:67c:281c::/48 nl +2001:67c:2820::/48 at +2001:67c:2824::/48 ru +2001:67c:2828::/48 nl +2001:67c:282c::/48 be +2001:67c:2830::/48 pl +2001:67c:2834::/48 nl +2001:67c:2838::/48 de +2001:67c:283c::/48 es +2001:67c:2840::/48 il +2001:67c:2844::/48 fr +2001:67c:2848::/48 es +2001:67c:284c::/48 nl +2001:67c:2850::/48 nl +2001:67c:2854::/48 nl +2001:67c:2858::/48 fr +2001:67c:285c::/48 nl +2001:67c:2860::/48 nl +2001:67c:2864::/48 nl +2001:67c:2868::/48 fr +2001:67c:286c::/48 gb +2001:67c:2870::/48 pl +2001:67c:2874::/48 gb +2001:67c:2878::/48 dk +2001:67c:287c::/48 se +2001:67c:2880::/48 de +2001:67c:2884::/48 de +2001:67c:2888::/48 nl +2001:67c:2890::/48 pl +2001:67c:2894::/48 dk +2001:67c:2898::/48 es +2001:67c:289c::/48 se +2001:67c:28a0::/48 ch +2001:67c:28a4::/48 dk +2001:67c:28a8::/48 nl +2001:67c:28ac::/48 no +2001:67c:28b0::/48 no +2001:67c:28b4::/48 no +2001:67c:28b8::/48 cz +2001:67c:28bc::/48 hu +2001:67c:28c0::/48 at +2001:67c:28c4::/48 se +2001:67c:28c8::/48 dk +2001:67c:28cc::/48 dk +2001:67c:28d0::/48 nl +2001:67c:28d4::/48 ru +2001:67c:28d8::/48 de +2001:67c:28dc::/48 de +2001:67c:28e0::/48 de +2001:67c:28e4::/48 ru +2001:67c:28e8::/48 se +2001:67c:28ec::/48 ru +2001:67c:28f0::/48 nl +2001:67c:28f4::/48 si +2001:67c:28f8::/48 lt +2001:67c:28fc::/48 nl +2001:67c:2900::/48 nl +2001:67c:2980::/48 nl +2001:67c:2984::/48 ch +2001:67c:2988::/48 tr +2001:67c:2990::/48 gb +2001:67c:2994::/48 sa +2001:67c:2998::/48 fr +2001:67c:299c::/48 de +2001:67c:29a0::/48 tr +2001:67c:29a4::/48 lt +2001:67c:29a8::/48 ch +2001:67c:29ac::/48 cy +2001:67c:29b0::/48 cy +2001:67c:29b8::/48 ru +2001:67c:29bc::/48 ru +2001:67c:29c0::/48 fr +2001:67c:29c8::/48 ru +2001:67c:29cc::/48 at +2001:67c:29d0::/48 cz +2001:67c:29d4::/48 ro +2001:67c:29d8::/48 ae +2001:67c:29dc::/48 de +2001:67c:29e0::/48 ua +2001:67c:29e8::/48 tr +2001:67c:29ec::/48 no +2001:67c:29f0::/48 bg +2001:67c:29f4::/48 no +2001:67c:29f8::/48 se +2001:67c:29fc::/48 pl +2001:67c:2a00::/48 no +2001:67c:2a04::/48 se +2001:67c:2a08::/48 no +2001:67c:2a0c::/48 de +2001:67c:2a10::/48 de +2001:67c:2a14::/48 de +2001:67c:2a18::/48 se +2001:67c:2a1c::/48 de +2001:67c:2a20::/48 fi +2001:67c:2a24::/48 ro +2001:67c:2a28::/48 dk +2001:67c:2a2c::/48 fr +2001:67c:2a30::/48 de +2001:67c:2a34::/48 de +2001:67c:2a38::/48 at +2001:67c:2a3c::/48 es +2001:67c:2a40::/48 gb +2001:67c:2a44::/48 ro +2001:67c:2a48::/48 ru +2001:67c:2a4c::/48 gb +2001:67c:2a50::/48 fr +2001:67c:2a54::/48 de +2001:67c:2a58::/48 be +2001:67c:2a5c::/48 ch +2001:67c:2a60::/48 ru +2001:67c:2a64::/48 dk +2001:67c:2a68::/48 dk +2001:67c:2a6c::/48 tr +2001:67c:2a70::/48 nl +2001:67c:2a74::/48 fr +2001:67c:2a78::/48 dk +2001:67c:2a7c::/48 de +2001:67c:2a80::/48 fr +2001:67c:2a84::/48 se +2001:67c:2a88::/48 lv +2001:67c:2a8c::/48 si +2001:67c:2a90::/48 no +2001:67c:2a94::/48 pl +2001:67c:2a98::/48 se +2001:67c:2a9c::/48 dk +2001:67c:2aa0::/48 lu +2001:67c:2aa4::/48 at +2001:67c:2aa8::/48 dk +2001:67c:2aac::/48 is +2001:67c:2ab0::/48 ru +2001:67c:2ab4::/48 se +2001:67c:2ab8::/48 se +2001:67c:2abc::/48 ro +2001:67c:2ac0::/48 ua +2001:67c:2ac4::/48 ru +2001:67c:2ac8::/48 pl +2001:67c:2acc::/48 se +2001:67c:2ad0::/48 se +2001:67c:2ad4::/48 de +2001:67c:2ad8::/48 pl +2001:67c:2adc::/48 de +2001:67c:2ae0::/48 dk +2001:67c:2ae4::/48 de +2001:67c:2ae8::/48 de +2001:67c:2af0::/48 se +2001:67c:2af4::/48 ru +2001:67c:2af8::/48 se +2001:67c:2afc::/48 si +2001:67c:2b00::/48 eu +2001:67c:2b04::/48 at +2001:67c:2b08::/48 se +2001:67c:2b0c::/48 nl +2001:67c:2b10::/48 cz +2001:67c:2b14::/48 ua +2001:67c:2b18::/48 ua +2001:67c:2b1c::/48 de +2001:67c:2b20::/48 ru +2001:67c:2b24::/48 se +2001:67c:2b28::/48 pl +2001:67c:2b2c::/48 ro +2001:67c:2b30::/48 de +2001:67c:2b34::/48 se +2001:67c:2b38::/48 fr +2001:67c:2b3c::/48 fr +2001:67c:2b40::/48 pl +2001:67c:2b44::/48 nl +2001:67c:2b48::/48 se +2001:67c:2b4c::/48 cz +2001:67c:2b50::/48 at +2001:67c:2b54::/48 ch +2001:67c:2b58::/48 se +2001:67c:2b60::/48 nl +2001:67c:2b64::/48 ru +2001:67c:2b68::/48 ro +2001:67c:2b6c::/48 se +2001:67c:2b70::/48 dk +2001:67c:2b74::/48 de +2001:67c:2b78::/48 gr +2001:67c:2b80::/48 ro +2001:67c:2b84::/48 de +2001:67c:2b88::/48 ru +2001:67c:2b8c::/48 ru +2001:67c:2b90::/48 si +2001:67c:2b94::/48 se +2001:67c:2b98::/48 dk +2001:67c:2b9c::/48 de +2001:67c:2ba0::/48 tr +2001:67c:2ba4::/48 ru +2001:67c:2ba8::/48 de +2001:67c:2bac::/48 de +2001:67c:2bb0::/48 de +2001:67c:2bb4::/48 ro +2001:67c:2bb8::/48 ua +2001:67c:2bbc::/48 ro +2001:67c:2bc0::/48 se +2001:67c:2bc4::/48 ua +2001:67c:2bc8::/48 de +2001:67c:2bcc::/48 lv +2001:67c:2bd0::/48 se +2001:67c:2bd4::/48 se +2001:67c:2bd8::/48 se +2001:67c:2bdc::/48 pl +2001:67c:2be0::/48 pl +2001:67c:2be4::/48 pl +2001:67c:2bec::/48 pl +2001:67c:2bf0::/48 ua +2001:67c:2bf4::/48 ru +2001:67c:2bf8::/48 se +2001:67c:2bfc::/48 se +2001:67c:2c00::/48 ru +2001:67c:2c04::/48 se +2001:67c:2c08::/48 ch +2001:67c:2c0c::/48 ch +2001:67c:2c10::/48 ch +2001:67c:2c14::/48 ch +2001:67c:2c18::/48 se +2001:67c:2c1c::/48 ru +2001:67c:2c20::/48 ch +2001:67c:2c24::/48 nl +2001:67c:2c28::/48 ch +2001:67c:2c2c::/48 hu +2001:67c:2c30::/48 de +2001:67c:2c34::/48 se +2001:67c:2c38::/48 ch +2001:67c:2c3c::/48 de +2001:67c:2c40::/48 ch +2001:67c:2c44::/48 ua +2001:67c:2c48::/48 pl +2001:67c:2c4c::/48 se +2001:67c:2c50::/48 de +2001:67c:2c54::/48 se +2001:67c:2c58::/48 de +2001:67c:2c5c::/48 ru +2001:67c:2c60::/48 be +2001:67c:2c64::/48 pl +2001:67c:2c68::/48 de +2001:67c:2c6c::/48 ru +2001:67c:2c70::/48 se +2001:67c:2c74::/48 se +2001:67c:2c78::/48 se +2001:67c:2c7c::/48 ch +2001:67c:2c80::/48 se +2001:67c:2c84::/48 be +2001:67c:2c88::/48 bg +2001:67c:2c90::/48 bg +2001:67c:2ca0::/48 be +2001:67c:2cc0::/48 cz +2001:67c:2cc4::/48 ru +2001:67c:2cc8::/48 ua +2001:67c:2ccc::/48 ch +2001:67c:2cd0::/48 gb +2001:67c:2cd4::/48 pl +2001:67c:2cd8::/48 sk +2001:67c:2cdc::/48 ru +2001:67c:2ce0::/48 pl +2001:67c:2ce4::/48 bg +2001:67c:2ce8::/48 fi +2001:67c:2cec::/48 se +2001:67c:2cf0::/48 no +2001:67c:2cf4::/48 se +2001:67c:2cf8::/48 se +2001:67c:2cfc::/48 se +2001:67c:2d00::/48 se +2001:67c:2d04::/48 se +2001:67c:2d08::/48 de +2001:67c:2d0c::/48 de +2001:67c:2d10::/48 nl +2001:67c:2d14::/48 fi +2001:67c:2d18::/48 de +2001:67c:2d20::/48 ua +2001:67c:2d24::/48 pl +2001:67c:2d28::/48 de +2001:67c:2d2c::/48 cz +2001:67c:2d30::/48 cz +2001:67c:2d34::/48 cz +2001:67c:2d38::/48 cz +2001:67c:2d3c::/48 gb +2001:67c:2d40::/48 ua +2001:67c:2d44::/48 pt +2001:67c:2d48::/48 fr +2001:67c:2d4c::/48 se +2001:67c:2d50::/48 de +2001:67c:2d54::/48 nl +2001:67c:2d58::/48 at +2001:67c:2d60::/48 dk +2001:67c:2d64::/48 be +2001:67c:2d68::/48 no +2001:67c:2d6c::/48 fi +2001:67c:2d70::/48 ch +2001:67c:2d74::/48 fi +2001:67c:2d78::/48 nl +2001:67c:2d7c::/48 se +2001:67c:2d80::/48 de +2001:67c:2d84::/48 gb +2001:67c:2d88::/48 de +2001:67c:2d8c::/48 ch +2001:67c:2d90::/48 cz +2001:67c:2d94::/48 ru +2001:67c:2d98::/48 pl +2001:67c:2d9c::/48 ua +2001:67c:2da0::/48 ru +2001:67c:2da4::/48 se +2001:67c:2da8::/48 de +2001:67c:2dac::/48 de +2001:67c:2db0::/48 it +2001:67c:2db4::/48 pl +2001:67c:2db8::/48 md +2001:67c:2dbc::/48 il +2001:67c:2dc0::/48 li +2001:67c:2dc4::/48 de +2001:67c:2dc8::/48 nl +2001:67c:2dcc::/48 ru +2001:67c:2dd0::/48 se +2001:67c:2dd4::/48 ru +2001:67c:2dd8::/48 si +2001:67c:2ddc::/48 pl +2001:67c:2de0::/48 si +2001:67c:2de8::/48 ch +2001:67c:2dec::/48 ru +2001:67c:2df0::/48 bg +2001:67c:2df4::/48 ru +2001:67c:2df8::/48 se +2001:67c:2dfc::/48 ua +2001:67c:2e00::/48 ru +2001:67c:2e04::/48 ru +2001:67c:2e08::/48 ua +2001:67c:2e0c::/48 nl +2001:67c:2e10::/48 at +2001:67c:2e14::/48 at +2001:67c:2e18::/48 de +2001:67c:2e1c::/48 be +2001:67c:2e24::/48 de +2001:67c:2e28::/48 de +2001:67c:2e2c::/48 at +2001:67c:2e30::/48 fi +2001:67c:2e34::/48 ua +2001:67c:2e38::/48 ch +2001:67c:2e3c::/48 pl +2001:67c:2e40::/48 ru +2001:67c:2e44::/48 si +2001:67c:2e48::/48 se +2001:67c:2e4c::/48 ru +2001:67c:2e50::/48 pl +2001:67c:2e54::/48 se +2001:67c:2e58::/48 ua +2001:67c:2e5c::/48 ua +2001:67c:2e60::/48 de +2001:67c:2e64::/48 nl +2001:67c:2e68::/48 fr +2001:67c:2e74::/48 se +2001:67c:2e78::/48 pl +2001:67c:2e7c::/48 gb +2001:67c:2e80::/48 gb +2001:67c:2e84::/48 gb +2001:67c:2e88::/48 gb +2001:67c:2e8c::/48 de +2001:67c:2e90::/48 bg +2001:67c:2e94::/48 fi +2001:67c:2e98::/48 ru +2001:67c:2e9c::/48 ru +2001:67c:2ea0::/48 de +2001:67c:2ea4::/48 de +2001:67c:2ea8::/48 lv +2001:67c:2eac::/48 de +2001:67c:2eb0::/48 de +2001:67c:2eb4::/48 de +2001:67c:2eb8::/48 de +2001:67c:2ebc::/48 ru +2001:67c:2ec0::/48 de +2001:67c:2ec4::/48 dk +2001:67c:2ec8::/48 ru +2001:67c:2ecc::/48 de +2001:67c:2ed0::/48 de +2001:67c:2ed4::/48 ro +2001:67c:2ed8::/48 de +2001:67c:2edc::/48 se +2001:67c:2ee0::/48 ru +2001:67c:2ee4::/48 ua +2001:67c:2ee8::/48 pl +2001:67c:2eec::/48 ro +2001:67c:2ef0::/48 nl +2001:67c:2ef4::/48 de +2001:67c:2ef8::/48 fi +2001:67c:2efc::/48 at +2001:67c:2f00::/48 ch +2001:67c:2f04::/48 nl +2001:67c:2f08::/48 gb +2001:67c:2f0c::/48 de +2001:67c:2f10::/48 ua +2001:67c:2f14::/48 de +2001:67c:2f18::/48 cz +2001:67c:2f1c::/48 gb +2001:67c:2f20::/48 de +2001:67c:2f24::/48 hr +2001:67c:2f28::/48 pl +2001:67c:2f2c::/48 se +2001:67c:2f30::/48 de +2001:67c:2f34::/48 at +2001:67c:2f38::/48 gb +2001:67c:2f3c::/48 gb +2001:67c:2f40::/48 bg +2001:67c:2f44::/48 de +2001:67c:2f48::/48 ua +2001:67c:2f4c::/48 bg +2001:67c:2f50::/48 se +2001:67c:2f54::/48 pl +2001:67c:2f58::/48 gb +2001:67c:2f5c::/48 nl +2001:67c:2f60::/48 de +2001:67c:2f64::/48 pl +2001:67c:2f68::/48 ro +2001:67c:2f6c::/48 ua +2001:67c:2f70::/48 ch +2001:67c:2f74::/48 pl +2001:67c:2f78::/48 de +2001:67c:2f7c::/48 se +2001:67c:2f80::/48 se +2001:67c:2f84::/48 de +2001:67c:2f88::/48 nl +2001:67c:2f8c::/48 it +2001:67c:2f90::/48 ru +2001:67c:2f94::/48 ch +2001:67c:2f98::/48 ch +2001:67c:2f9c::/48 cz +2001:67c:2fa0::/48 se +2001:67c:2fa4::/48 de +2001:67c:2fa8::/48 de +2001:67c:2fac::/48 fi +2001:67c:2fb0::/48 de +2001:67c:2fb4::/48 ro +2001:67c:2fb8::/48 se +2001:67c:2fbc::/48 de +2001:67c:2fc0::/48 fi +2001:67c:2fc4::/48 ua +2001:680::/32 de 2001:688::/32 fr 2001:690::/32 pt -2001:698::/32 nl +2001:698::/32 eu 2001:6a0::/32 pl 2001:6a8::/32 be 2001:6b0::/32 se 2001:6b8::/32 it -2001:6c0::/32 fr +2001:6c0::/32 eu 2001:6c8::/32 dk 2001:6d0::/32 ru 2001:6d8::/32 pl @@ -878,7 +2330,7 @@ 2001:710::/32 gb 2001:718::/32 cz 2001:720::/32 es -2001:728::/32 eu +2001:728::/32 gb 2001:730::/32 at 2001:738::/32 hu 2001:740::/32 eu @@ -892,7 +2344,7 @@ 2001:780::/32 de 2001:788::/32 ch 2001:790::/32 ir -2001:798::/32 eu +2001:798::/32 gb 2001:7a0::/32 se 2001:7a8::/32 fr 2001:7b0::/32 de @@ -908,6 +2360,7 @@ 2001:7f8:1::/48 nl 2001:7f8:2::/48 it 2001:7f8:3::/48 gb +2001:7f8:5::/48 ru 2001:7f8:6::/48 bg 2001:7f8:7::/48 fi 2001:7f8:8::/48 de @@ -919,16 +2372,16 @@ 2001:7f8:e::/48 nl 2001:7f8:f::/48 es 2001:7f8:10::/48 it -2001:7f8:11::/48 lu +2001:7f8:11::/48 at 2001:7f8:12::/48 no 2001:7f8:13::/48 nl 2001:7f8:14::/48 cz 2001:7f8:15::/48 ee -2001:7f8:16::/48 se +2001:7f8:16::/48 lv 2001:7f8:17::/48 gb 2001:7f8:18::/48 ie 2001:7f8:19::/48 de -2001:7f8:1a::/48 eu +2001:7f8:1a::/48 nl 2001:7f8:1b::/48 be 2001:7f8:1c::/48 ch 2001:7f8:1d::/48 fi @@ -936,10 +2389,10 @@ 2001:7f8:1f::/48 dk 2001:7f8:20::/48 ru 2001:7f8:21::/48 se -2001:7f8:22::/48 de +2001:7f8:22::/48 me 2001:7f8:23::/48 it 2001:7f8:24::/48 ch -2001:7f8:25::/48 fr +2001:7f8:25::/48 gb 2001:7f8:26::/48 be 2001:7f8:27::/48 pl 2001:7f8:28::/48 hr @@ -947,21 +2400,24 @@ 2001:7f8:2a::/48 es 2001:7f8:2b::/48 eu 2001:7f8:2d::/48 fr -2001:7f8:2e::/48 pt +2001:7f8:2e::/48 md 2001:7f8:2f::/48 sk 2001:7f8:30::/48 at 2001:7f8:31::/48 nl +2001:7f8:32::/48 it 2001:7f8:33::/48 de -2001:7f8:34::/48 gb +2001:7f8:34::/48 fr 2001:7f8:35::/48 hu +2001:7f8:36::/48 fr 2001:7f8:37::/48 se 2001:7f8:39::/48 ee 2001:7f8:3a::/48 de 2001:7f8:3b::/48 il 2001:7f8:3c::/48 eu 2001:7f8:3d::/48 de -2001:7f8:3e::/48 se -2001:7f8:3f::/48 sk +2001:7f8:3e::/48 gb +2001:7f8:3f::/48 de +2001:7f8:40::/48 ru 2001:7f8:41::/48 no 2001:7f8:42::/48 pl 2001:7f8:43::/48 fr @@ -984,20 +2440,74 @@ 2001:7f8:54::/48 fr 2001:7f8:55::/48 ua 2001:7f8:56::/48 de +2001:7f8:57::/48 it 2001:7f8:58::/48 bg 2001:7f8:59::/48 fr 2001:7f8:5a::/48 by 2001:7f8:5b::/48 pl -2001:7f8:5c::/48 se +2001:7f8:5c::/48 ru 2001:7f8:5d::/48 ua 2001:7f8:5e::/48 cz 2001:7f8:5f::/48 it 2001:7f8:60::/48 pl 2001:7f8:61::/48 nl -2001:7f8:62::/48 de +2001:7f8:62::/48 ru 2001:7f8:63::/48 ua 2001:7f8:64::/48 ro +2001:7f8:65::/48 ua 2001:7f8:66::/48 at +2001:7f8:67::/48 gb +2001:7f8:68::/48 fr +2001:7f8:69::/48 pl +2001:7f8:6a::/48 md +2001:7f8:6b::/48 pl +2001:7f8:6c::/48 ua +2001:7f8:6d::/48 fr +2001:7f8:6e::/48 gr +2001:7f8:6f::/48 ru +2001:7f8:71::/48 at +2001:7f8:72::/48 ps +2001:7f8:73::/48 ae +2001:7f8:74::/48 pl +2001:7f8:76::/48 no +2001:7f8:77::/48 ru +2001:7f8:79::/48 fr +2001:7f8:7a::/48 ae +2001:7f8:7b::/48 ua +2001:7f8:7c::/48 pl +2001:7f8:7d::/48 ru +2001:7f8:7e::/48 es +2001:7f8:7f::/48 cz +2001:7f8:80::/48 ua +2001:7f8:81::/48 fr +2001:7f8:82::/48 ru +2001:7f8:83::/48 pl +2001:7f8:84::/48 ru +2001:7f8:85::/48 hu +2001:7f8:86::/48 nl +2001:7f8:87::/48 cz +2001:7f8:88::/48 fr +2001:7f8:8a::/48 pl +2001:7f8:8b::/48 by +2001:7f8:8c::/48 gb +2001:7f8:8d::/48 at +2001:7f8:8e::/48 bg +2001:7f8:8f::/48 nl +2001:7f8:90::/48 gb +2001:7f8:91::/48 sk +2001:7f8:92::/48 de +2001:7f8:93::/48 at +2001:7f8:94::/48 am +2001:7f8:95::/48 de +2001:7f8:96::/48 bg +2001:7f8:97::/48 ro +2001:7f8:98::/48 bg +2001:7f8:99::/48 fr +2001:7f8:9a::/48 ru +2001:7f8:9b::/48 pl +2001:7f8:9c::/48 de +2001:7f8:9f::/48 bg +2001:7f8:a0::/48 es 2001:7fa:0:1::/64 hk 2001:7fa:0:2::/64 kr 2001:7fa:0:3::/64 jp @@ -1013,6 +2523,7 @@ 2001:7fa:10::/48 cn 2001:7fa:11::/48 au 2001:7fb::/32 eu +2001:7fc::/47 de 2001:7fd::/32 eu 2001:7fe::/32 se 2001:808::/32 pl @@ -1043,7 +2554,6 @@ 2001:8d0::/32 it 2001:8d8::/32 de 2001:8e0::/32 ch -2001:8e8::/32 ch 2001:8f0::/32 cy 2001:8f8::/32 ae 2001:900::/32 fr @@ -1060,7 +2570,7 @@ 2001:958::/32 gb 2001:960::/32 nl 2001:968::/32 nl -2001:978::/32 eu +2001:978::/32 de 2001:980::/32 nl 2001:988::/32 fr 2001:990::/32 nl @@ -1076,7 +2586,6 @@ 2001:9e0::/32 nl 2001:9e8::/32 de 2001:9f0::/32 fi -2001:9f8::/32 at 2001:a00::/32 at 2001:a08::/32 gb 2001:a10::/32 pl @@ -1098,13 +2607,11 @@ 2001:a98::/32 tr 2001:aa0::/32 de 2001:aa8::/32 de -2001:ab0::/32 de 2001:ab8::/32 fr 2001:ac0::/32 es 2001:ac8::/32 gb -2001:ad0::/32 eu +2001:ad0::/32 ee 2001:ad8::/32 de -2001:ae0::/32 de 2001:ae8::/32 cz 2001:af0::/32 cz 2001:af8::/32 at @@ -1115,7 +2622,6 @@ 2001:b20::/32 lu 2001:b28::/32 ru 2001:b30::/32 ro -2001:b38::/32 es 2001:b40::/32 it 2001:b48::/32 se 2001:b50::/32 dk @@ -1123,7 +2629,6 @@ 2001:b60::/32 it 2001:b68::/32 hr 2001:b70::/32 gb -2001:b78::/32 be 2001:b80::/32 cz 2001:b88::/32 nl 2001:b90::/32 es @@ -1132,10 +2637,8 @@ 2001:ba8::/32 gb 2001:bb0::/32 ie 2001:bb8::/32 ee -2001:bc0::/32 gb 2001:bc8::/32 fr 2001:bd0::/32 gb -2001:bd8::/32 nl 2001:be0::/32 gb 2001:be8::/32 se 2001:bf0::/32 de @@ -1157,12 +2660,11 @@ 2001:c70::/32 jp 2001:c78::/32 au 2001:c80::/32 jp -2001:c88::/32 jp 2001:c90::/32 jp 2001:c98::/32 kr 2001:ca0::/32 tw 2001:ca8::/32 in -2001:cb0::/32 sg +2001:cb0::/32 jp 2001:cb8::/32 jp 2001:cc0::/32 cn 2001:cc8::/32 jp @@ -1230,6 +2732,10 @@ 2001:dd8:1f::/48 id 2001:dd8:20::/48 in 2001:dd8:22::/48 jp +2001:dd8:24::/48 np +2001:dda::/48 jp +2001:ddc::/48 my +2001:ddd::/48 au 2001:de1::/42 jp 2001:de8::/48 th 2001:de8:1::/48 in @@ -1253,11 +2759,20 @@ 2001:de8:17::/48 au 2001:de8:19::/48 nz 2001:de8:1a::/48 id -2001:de8:1b::/48 my -2001:de8:1c::/48 kh +2001:de8:1d::/48 kh +2001:de8:1e::/48 jp +2001:de8:8000::/48 ws +2001:de9::/48 lk +2001:de9:8000::/48 id +2001:dea::/48 au +2001:deb::/48 th +2001:dec::/48 vu +2001:ded::/48 sg +2001:dee::/48 hk +2001:def::/48 hk 2001:df0::/47 nz 2001:df0:2::/48 jp -2001:df0:3::/48 nz +2001:df0:4::/48 nz 2001:df0:7::/48 sg 2001:df0:8::/48 jp 2001:df0:9::/48 au @@ -1276,7 +2791,6 @@ 2001:df0:43::/48 jp 2001:df0:44::/48 hk 2001:df0:45::/48 jp -2001:df0:47::/48 nz 2001:df0:48::/48 id 2001:df0:49::/48 au 2001:df0:4a::/48 nz @@ -1284,16 +2798,13 @@ 2001:df0:4f::/48 au 2001:df0:62::/48 th 2001:df0:63::/48 au -2001:df0:64::/48 nz 2001:df0:65::/48 id 2001:df0:66::/48 vn -2001:df0:67::/48 fj 2001:df0:68::/48 jp 2001:df0:69::/48 hk 2001:df0:6a::/48 nz 2001:df0:6b::/48 in -2001:df0:6c::/48 ws -2001:df0:6e::/48 au +2001:df0:6f::/48 au 2001:df0:70::/48 ph 2001:df0:71::/48 au 2001:df0:73::/48 au @@ -1301,8 +2812,6 @@ 2001:df0:76::/48 au 2001:df0:77::/48 nz 2001:df0:78::/48 hk -2001:df0:79::/48 mn -2001:df0:7a::/48 nz 2001:df0:7b::/48 au 2001:df0:7d::/48 nz 2001:df0:7e::/48 au @@ -1311,12 +2820,9 @@ 2001:df0:84::/48 pk 2001:df0:85::/48 hk 2001:df0:86::/48 au -2001:df0:88::/48 my 2001:df0:89::/48 in -2001:df0:8a::/48 au 2001:df0:8b::/48 np 2001:df0:8c::/48 nu -2001:df0:8d::/48 sg 2001:df0:8e::/48 au 2001:df0:91::/48 fj 2001:df0:92::/48 in @@ -1326,7 +2832,6 @@ 2001:df0:96::/48 id 2001:df0:97::/48 au 2001:df0:98::/48 id -2001:df0:9b::/48 fj 2001:df0:9c::/48 id 2001:df0:9d::/48 my 2001:df0:9e::/48 th @@ -1339,7 +2844,7 @@ 2001:df0:a7::/48 id 2001:df0:ad::/48 hk 2001:df0:ae::/48 au -2001:df0:af::/48 nz +2001:df0:b0::/48 nz 2001:df0:b1::/48 id 2001:df0:b9::/48 nz 2001:df0:ba::/48 id @@ -1357,17 +2862,15 @@ 2001:df0:cf::/48 jp 2001:df0:d1::/48 nz 2001:df0:d2::/48 hk -2001:df0:d3::/48 id 2001:df0:d4::/48 au 2001:df0:d7::/48 kr 2001:df0:d8::/48 au 2001:df0:d9::/48 tw 2001:df0:da::/48 au -2001:df0:db::/48 hk 2001:df0:dc::/48 nz 2001:df0:dd::/48 au 2001:df0:de::/48 id -2001:df0:e0::/48 au +2001:df0:e1::/48 au 2001:df0:e2::/48 id 2001:df0:e3::/48 hk 2001:df0:e4::/48 au @@ -1383,7 +2886,6 @@ 2001:df0:f2::/48 id 2001:df0:f3::/48 au 2001:df0:f4::/48 id -2001:df0:f5::/48 au 2001:df0:f6::/48 nz 2001:df0:f7::/48 sg 2001:df0:f8::/48 au @@ -1391,7 +2893,6 @@ 2001:df0:fc::/48 nz 2001:df0:fd::/48 au 2001:df0:100::/48 au -2001:df0:200::/48 sg 2001:df0:201::/48 au 2001:df0:202::/48 in 2001:df0:203::/48 id @@ -1422,14 +2923,13 @@ 2001:df0:21f::/48 id 2001:df0:221::/48 vn 2001:df0:222::/48 id -2001:df0:223::/48 au -2001:df0:225::/48 in +2001:df0:224::/48 au 2001:df0:226::/48 au 2001:df0:229::/48 id -2001:df0:22a::/48 au 2001:df0:22b::/48 hk 2001:df0:22c::/48 nz 2001:df0:22e::/48 hk +2001:df0:22f::/48 au 2001:df0:230::/48 id 2001:df0:231::/48 nz 2001:df0:232::/48 jp @@ -1452,7 +2952,6 @@ 2001:df0:249::/48 au 2001:df0:24b::/48 nz 2001:df0:24c::/48 my -2001:df0:24d::/48 nz 2001:df0:24e::/48 au 2001:df0:24f::/48 sg 2001:df0:250::/48 in @@ -1468,26 +2967,729 @@ 2001:df0:25b::/48 hk 2001:df0:25c::/48 in 2001:df0:25e::/48 jp -2001:df0:25f::/48 sg 2001:df0:260::/48 id 2001:df0:261::/48 nz 2001:df0:262::/48 au 2001:df0:263::/48 id +2001:df0:264::/48 in +2001:df0:265::/48 th +2001:df0:266::/48 jp +2001:df0:267::/48 au +2001:df0:268::/48 id +2001:df0:26b::/48 au +2001:df0:26c::/48 sg +2001:df0:26d::/48 id +2001:df0:270::/48 in +2001:df0:272::/48 my +2001:df0:273::/48 id +2001:df0:274::/48 np +2001:df0:278::/48 id +2001:df0:279::/48 pk +2001:df0:27a::/48 au +2001:df0:27b::/48 id +2001:df0:27c::/48 sg +2001:df0:27d::/48 au +2001:df0:27e::/48 cn +2001:df0:27f::/48 jp +2001:df0:280::/48 hk +2001:df0:290::/48 kr +2001:df0:291::/48 au +2001:df0:292::/48 id +2001:df0:293::/48 jp +2001:df0:294::/48 au +2001:df0:295::/48 hk +2001:df0:298::/48 ph +2001:df0:299::/48 in +2001:df0:29a::/48 au +2001:df0:29b::/48 id +2001:df0:29c::/48 vn +2001:df0:29d::/48 au +2001:df0:29f::/48 bd +2001:df0:2a0::/48 my +2001:df0:2a1::/48 au +2001:df0:2a2::/48 hk +2001:df0:2a3::/48 in +2001:df0:2a4::/48 id +2001:df0:2a5::/48 sg +2001:df0:2a6::/48 jp +2001:df0:2a7::/48 id +2001:df0:2a8::/48 ph +2001:df0:2a9::/48 au +2001:df0:2ab::/48 id +2001:df0:2ac::/48 sg +2001:df0:2ad::/48 au +2001:df0:2af::/48 hk +2001:df0:2b0::/48 au +2001:df0:2b2::/48 id +2001:df0:2b4::/48 jp +2001:df0:2b5::/48 id +2001:df0:2b8::/48 my +2001:df0:2b9::/48 nz +2001:df0:2ba::/48 sg +2001:df0:2bb::/48 nz +2001:df0:2bc::/48 id +2001:df0:2bd::/48 au +2001:df0:2be::/48 jp +2001:df0:2bf::/48 my +2001:df0:2c1::/48 nz +2001:df0:2c2::/48 jp +2001:df0:2c3::/48 bd +2001:df0:2c4::/48 in +2001:df0:2c5::/48 bd +2001:df0:2c6::/48 au +2001:df0:2c9::/48 in +2001:df0:2ca::/48 jp +2001:df0:2cb::/48 pk +2001:df0:2cc::/48 jp +2001:df0:2ce::/48 au +2001:df0:2e1::/48 id +2001:df0:2e2::/48 au +2001:df0:2e3::/48 in +2001:df0:2e4::/48 jp +2001:df0:2e5::/48 in +2001:df0:2e6::/48 id +2001:df0:2e8::/48 vn +2001:df0:2e9::/48 cn +2001:df0:2ea::/48 nz +2001:df0:2ec::/48 id +2001:df0:2ed::/48 jp +2001:df0:2ef::/48 ph +2001:df0:2f0::/48 in +2001:df0:2f4::/48 id +2001:df0:2f5::/48 jp +2001:df0:2f6::/48 in +2001:df0:2f9::/48 in +2001:df0:2fa::/48 au +2001:df0:2fb::/48 th +2001:df0:2fc::/48 id +2001:df0:2fd::/48 in +2001:df0:2fe::/48 au +2001:df0:300::/48 sg +2001:df0:314::/48 sg +2001:df0:400::/48 sg +2001:df0:401::/48 jp +2001:df0:402::/48 au +2001:df0:404::/48 sg +2001:df0:407::/48 au +2001:df0:408::/48 nz +2001:df0:409::/48 id +2001:df0:40a::/48 au +2001:df0:40c::/48 jp +2001:df0:40d::/48 au +2001:df0:40e::/48 id +2001:df0:410::/48 vu +2001:df0:411::/48 in +2001:df0:412::/48 hk +2001:df0:413::/48 in +2001:df0:415::/48 au +2001:df0:417::/48 jp +2001:df0:418::/48 id +2001:df0:41a::/48 au +2001:df0:41b::/48 nz +2001:df0:41c::/48 au +2001:df0:41d::/48 id +2001:df0:41f::/48 my +2001:df0:420::/48 sg +2001:df0:421::/48 au +2001:df0:422::/48 in +2001:df0:423::/48 cn +2001:df0:425::/48 sg +2001:df0:426::/48 id +2001:df0:427::/48 my +2001:df0:430::/48 nz +2001:df0:440::/48 jp +2001:df0:441::/48 au +2001:df0:442::/48 hk +2001:df0:444::/48 in +2001:df0:446::/48 id +2001:df0:447::/48 au +2001:df0:448::/48 id +2001:df0:449::/48 jp +2001:df0:44a::/48 id +2001:df0:44b::/48 my +2001:df0:44c::/48 in +2001:df0:44e::/48 id +2001:df0:44f::/48 sg +2001:df0:450::/48 in +2001:df0:451::/48 my +2001:df0:452::/48 hk +2001:df0:453::/48 in +2001:df0:454::/48 sg +2001:df0:455::/48 in +2001:df0:456::/48 jp +2001:df0:457::/48 my +2001:df0:458::/48 in +2001:df0:45a::/48 in +2001:df0:45b::/48 au +2001:df0:45c::/48 in +2001:df0:45e::/48 bd +2001:df0:45f::/48 nz +2001:df0:460::/48 au +2001:df0:461::/48 sg +2001:df0:462::/48 jp +2001:df0:463::/48 sg +2001:df0:464::/48 my +2001:df0:465::/48 hk +2001:df0:466::/48 au +2001:df0:467::/48 jp +2001:df0:468::/48 au +2001:df0:46a::/48 id +2001:df0:46b::/48 my +2001:df0:46c::/48 id +2001:df0:500::/48 au +2001:df0:800::/48 id +2001:df0:a00::/48 id +2001:df0:c00::/48 my +2001:df0:e00::/48 id +2001:df0:1000::/48 th +2001:df0:1200::/48 in +2001:df0:1400::/48 sg +2001:df0:1600::/48 au +2001:df0:1800::/48 jp +2001:df0:1a00::/48 in +2001:df0:1c00::/48 au +2001:df0:1e00::/48 au +2001:df0:2000::/48 au +2001:df0:2200::/48 in +2001:df0:2400::/48 sg +2001:df0:2600::/48 id +2001:df0:2800::/48 au +2001:df0:2a00::/48 vn +2001:df0:2c00::/48 au +2001:df0:2e00::/48 cn +2001:df0:3000::/48 ph +2001:df0:3200::/48 pk +2001:df0:3600::/48 sg +2001:df0:3800::/48 my +2001:df0:3a00::/48 in +2001:df0:3c00::/48 au +2001:df0:3e00::/48 au +2001:df0:4000::/48 hk +2001:df0:4200::/48 au +2001:df0:4400::/48 id +2001:df0:4600::/48 sg +2001:df0:4800::/48 hk +2001:df0:4a00::/48 pk +2001:df0:4e00::/48 tw +2001:df0:5000::/48 in +2001:df0:5200::/48 in +2001:df0:5400::/48 au +2001:df0:5600::/48 my +2001:df0:5800::/48 id +2001:df0:5a00::/48 bd +2001:df0:5c00::/48 bd +2001:df0:5e00::/48 au +2001:df0:6000::/48 in +2001:df0:6200::/48 my +2001:df0:6400::/48 sg +2001:df0:6600::/48 sg +2001:df0:6800::/48 jp +2001:df0:6a00::/48 hk +2001:df0:6e00::/48 bd +2001:df0:7000::/48 au +2001:df0:7200::/48 hk +2001:df0:7400::/48 in +2001:df0:7600::/48 in +2001:df0:7a00::/48 tl +2001:df0:7c00::/48 hk +2001:df0:7e00::/48 sg +2001:df0:8000::/48 in +2001:df0:8200::/48 au +2001:df0:8400::/48 in +2001:df0:8600::/48 in +2001:df0:8800::/48 in +2001:df0:8a00::/48 np +2001:df0:8c00::/48 my +2001:df0:8e00::/48 hk +2001:df0:9200::/48 mm +2001:df0:9400::/48 hk +2001:df0:9600::/48 in +2001:df0:9800::/48 in +2001:df0:9a00::/48 cn +2001:df0:9c00::/48 au +2001:df0:9e00::/48 id +2001:df0:a000::/48 au +2001:df0:a200::/48 id +2001:df0:a400::/48 au +2001:df0:a600::/48 au +2001:df0:a800::/48 au +2001:df0:aa00::/48 sg +2001:df0:ac00::/48 nz +2001:df0:ae00::/48 nz +2001:df0:b000::/48 nz +2001:df0:b200::/48 sg +2001:df0:b400::/48 jp +2001:df0:b600::/48 bd +2001:df0:b800::/48 ph +2001:df0:ba00::/48 in +2001:df0:bc00::/48 au +2001:df0:be00::/48 my +2001:df0:c000::/48 hk +2001:df0:c200::/48 au +2001:df0:c400::/48 in +2001:df0:c600::/48 in +2001:df0:c800::/48 au +2001:df0:ca00::/48 au +2001:df0:cc00::/48 id +2001:df0:ce00::/48 id +2001:df0:d000::/48 in +2001:df0:d200::/48 my +2001:df0:d400::/48 hk +2001:df0:d600::/48 my +2001:df0:d800::/48 au +2001:df0:dc00::/48 hk +2001:df0:de00::/48 in +2001:df0:e200::/48 au +2001:df0:e400::/48 in +2001:df0:e600::/48 sg +2001:df0:e800::/48 au +2001:df0:ea00::/48 id +2001:df0:ec00::/48 in +2001:df0:ee00::/48 id +2001:df0:f000::/48 hk +2001:df0:f400::/48 in +2001:df0:f800::/48 id +2001:df0:fc00::/48 in +2001:df1:400::/48 bd +2001:df1:800::/48 sg +2001:df1:c00::/48 in +2001:df1:1400::/48 in +2001:df1:1800::/48 au +2001:df1:1c00::/48 in +2001:df1:2000::/48 au +2001:df1:2400::/48 ph +2001:df1:2800::/48 sg +2001:df1:2c00::/48 au +2001:df1:3000::/48 au +2001:df1:3400::/48 bd +2001:df1:3800::/48 nz +2001:df1:3c00::/48 in +2001:df1:4000::/48 au +2001:df1:4400::/48 in +2001:df1:4800::/48 in +2001:df1:4c00::/48 hk +2001:df1:5000::/48 hk +2001:df1:5800::/48 bd +2001:df1:5c00::/48 id +2001:df1:6000::/48 sg +2001:df1:6400::/48 th +2001:df1:6800::/48 au +2001:df1:6c00::/48 th +2001:df1:7000::/48 id +2001:df1:7400::/48 sg +2001:df1:7800::/48 id +2001:df1:7c00::/48 nz +2001:df1:8000::/48 in +2001:df1:8400::/48 bd +2001:df1:8800::/48 au +2001:df1:8c00::/48 au +2001:df1:9000::/48 id +2001:df1:9400::/48 hk +2001:df1:9800::/48 my +2001:df1:9c00::/48 sg +2001:df1:a000::/48 in +2001:df1:a400::/48 bd +2001:df1:a800::/48 sg +2001:df1:ac00::/48 hk +2001:df1:b000::/48 th +2001:df1:b400::/48 au +2001:df1:b800::/48 au +2001:df1:bc00::/48 sg +2001:df1:c400::/48 au +2001:df1:c800::/48 hk +2001:df1:cc00::/48 au +2001:df1:d000::/48 au +2001:df1:d400::/48 hk +2001:df1:d800::/48 au +2001:df1:e000::/48 id +2001:df1:e400::/48 id +2001:df1:e800::/48 au +2001:df1:ec00::/48 au +2001:df1:f000::/48 id +2001:df1:f400::/48 hk +2001:df1:f800::/48 bn +2001:df1:fc00::/48 my +2001:df2::/48 au +2001:df2:400::/48 th +2001:df2:800::/48 au +2001:df2:c00::/48 jp +2001:df2:1000::/48 in +2001:df2:1400::/48 np +2001:df2:1800::/48 in +2001:df2:1c00::/48 in +2001:df2:2000::/48 in +2001:df2:2400::/48 id +2001:df2:2800::/48 in +2001:df2:2c00::/48 hk +2001:df2:3000::/48 sg +2001:df2:3400::/48 nz +2001:df2:3800::/48 th +2001:df2:3c00::/48 au +2001:df2:4000::/48 hk +2001:df2:4400::/48 au +2001:df2:4c00::/48 id +2001:df2:5000::/48 in +2001:df2:5400::/48 in +2001:df2:5800::/48 hk +2001:df2:5c00::/48 th +2001:df2:6000::/48 id +2001:df2:6400::/48 in +2001:df2:6800::/48 ph +2001:df2:6c00::/48 in +2001:df2:7000::/48 in +2001:df2:7400::/48 hk +2001:df2:7800::/48 au +2001:df2:7c00::/48 nz +2001:df2:8000::/48 bn +2001:df2:8400::/48 nz +2001:df2:8800::/48 in +2001:df2:8c00::/48 hk +2001:df2:9400::/48 au +2001:df2:9800::/48 in +2001:df2:9c00::/48 ap +2001:df2:a000::/48 id +2001:df2:a400::/48 my +2001:df2:a800::/48 in +2001:df2:ac00::/48 th +2001:df2:b000::/48 in +2001:df2:b400::/48 in +2001:df2:bc00::/48 id +2001:df2:c000::/48 id +2001:df2:c400::/48 au +2001:df2:c800::/48 au +2001:df2:cc00::/48 id +2001:df2:d000::/48 hk +2001:df2:d400::/48 id +2001:df2:d800::/48 jp +2001:df2:dc00::/48 th +2001:df2:e400::/48 ph +2001:df2:e800::/48 in +2001:df2:ec00::/48 id +2001:df2:f000::/48 vn +2001:df2:f400::/48 hk +2001:df2:f800::/48 in +2001:df2:fc00::/48 jp +2001:df3::/48 my +2001:df3:400::/48 id +2001:df3:800::/48 cn +2001:df3:c00::/48 id +2001:df3:1000::/48 bd +2001:df3:1400::/48 au +2001:df3:1800::/48 id +2001:df3:1c00::/48 au +2001:df3:2000::/48 id +2001:df3:2400::/48 th +2001:df3:2800::/48 in +2001:df3:2c00::/48 my +2001:df3:3000::/48 in +2001:df3:3400::/48 bd +2001:df3:3800::/48 id +2001:df3:3c00::/48 in +2001:df3:4000::/48 nz +2001:df3:4400::/48 in +2001:df3:4800::/48 in +2001:df3:4c00::/48 pg +2001:df3:5000::/48 in +2001:df3:5400::/48 au +2001:df3:5800::/48 au +2001:df3:5c00::/48 vn +2001:df3:6000::/48 sg +2001:df3:6400::/48 nz +2001:df3:6800::/48 au +2001:df3:6c00::/48 in +2001:df3:7000::/48 id +2001:df3:7400::/48 sg +2001:df3:7800::/48 sg +2001:df3:7c00::/48 my +2001:df3:8000::/48 id +2001:df3:8400::/48 hk +2001:df3:8800::/48 in +2001:df3:9400::/48 au +2001:df3:9c00::/48 hk +2001:df3:a000::/48 ph +2001:df3:a400::/48 hk +2001:df3:a800::/48 my +2001:df3:ac00::/48 th +2001:df3:b000::/48 th +2001:df3:b400::/48 au +2001:df3:b800::/48 in +2001:df3:bc00::/48 jp +2001:df3:c000::/48 id +2001:df3:c400::/48 au +2001:df3:c800::/48 in +2001:df3:cc00::/48 in +2001:df3:d000::/48 au +2001:df3:d400::/48 au +2001:df3:d800::/48 sg +2001:df3:dc00::/48 id +2001:df3:e000::/48 nz +2001:df3:e400::/48 in +2001:df3:e800::/48 in +2001:df3:ec00::/48 in +2001:df3:f000::/48 id +2001:df3:f400::/48 in +2001:df3:f800::/48 in +2001:df3:fc00::/48 hk +2001:df4::/48 my +2001:df4:400::/48 id +2001:df4:800::/48 au +2001:df4:c00::/48 in +2001:df4:1000::/48 hk +2001:df4:1400::/48 au +2001:df4:1800::/48 in +2001:df4:1c00::/48 au +2001:df4:2000::/48 th +2001:df4:2400::/48 au +2001:df4:2800::/48 hk +2001:df4:2c00::/48 in +2001:df4:3000::/48 th +2001:df4:3400::/48 au +2001:df4:3800::/48 bd +2001:df4:3c00::/48 bd +2001:df4:4000::/48 sg +2001:df4:4400::/48 id +2001:df4:4800::/48 au +2001:df4:4c00::/48 my +2001:df4:5000::/48 id +2001:df4:5400::/48 id +2001:df4:5800::/48 au +2001:df4:5c00::/48 in +2001:df4:6000::/48 my +2001:df4:6400::/48 la +2001:df4:6800::/48 sg +2001:df4:6c00::/48 id +2001:df4:7000::/48 hk +2001:df4:7400::/48 in +2001:df4:7800::/48 in +2001:df4:7c00::/48 au +2001:df4:8000::/48 my +2001:df4:8400::/48 in +2001:df4:8800::/48 hk +2001:df4:8c00::/48 hk +2001:df4:9000::/48 sg +2001:df4:9400::/48 au +2001:df4:9800::/48 id +2001:df4:9c00::/48 au +2001:df4:a000::/48 nz +2001:df4:a400::/48 au +2001:df4:a800::/48 id +2001:df4:ac00::/48 au +2001:df4:b000::/48 in +2001:df4:b400::/48 jp +2001:df4:b800::/48 au +2001:df4:bc00::/48 in +2001:df4:c000::/48 id +2001:df4:c400::/48 vn +2001:df4:c800::/48 sg +2001:df4:cc00::/48 in +2001:df4:d000::/48 in +2001:df4:d400::/48 in +2001:df4:d800::/48 vn +2001:df4:dc00::/48 kh +2001:df4:e000::/48 in +2001:df4:e400::/48 au +2001:df4:e800::/48 mn +2001:df4:ec00::/48 au +2001:df4:f000::/48 in +2001:df4:f400::/48 bd +2001:df4:f800::/48 au +2001:df4:fc00::/48 nz +2001:df5::/48 au +2001:df5:400::/48 hk +2001:df5:800::/48 hk +2001:df5:c00::/48 nz +2001:df5:1000::/48 nz +2001:df5:1400::/48 in +2001:df5:1800::/48 id +2001:df5:1c00::/48 id +2001:df5:2000::/48 nz +2001:df5:2400::/48 nz +2001:df5:2800::/48 in +2001:df5:2c00::/48 jp +2001:df5:3000::/48 au +2001:df5:3400::/48 id +2001:df5:3800::/48 in +2001:df5:3c00::/48 au +2001:df5:4000::/48 id +2001:df5:4400::/48 ph +2001:df5:4800::/48 bn +2001:df5:4c00::/48 in +2001:df5:5800::/48 au +2001:df5:5c00::/48 th +2001:df5:6000::/48 nz +2001:df5:6400::/48 jp +2001:df5:6800::/48 kr +2001:df5:6c00::/48 in +2001:df5:7000::/48 id +2001:df5:7400::/48 id +2001:df5:7800::/48 cn +2001:df5:7c00::/48 in +2001:df5:8000::/48 sg +2001:df5:8400::/48 sg +2001:df5:8800::/48 in +2001:df5:8c00::/48 au +2001:df5:9000::/48 in +2001:df5:9800::/48 sg +2001:df5:9c00::/48 id +2001:df5:a000::/48 id +2001:df5:a400::/48 in +2001:df5:a800::/48 au +2001:df5:ac00::/48 in +2001:df5:b000::/48 nz +2001:df5:b400::/48 id +2001:df5:b800::/48 hk +2001:df5:bc00::/48 au +2001:df5:c400::/48 th +2001:df5:c800::/48 au +2001:df5:cc00::/48 au +2001:df5:d000::/48 id +2001:df5:d400::/48 hk +2001:df5:d401::/48 jp +2001:df5:d800::/48 sg +2001:df5:dc00::/48 sg +2001:df5:e000::/48 my +2001:df5:e800::/48 ph +2001:df5:ec00::/48 id +2001:df5:f000::/48 id +2001:df5:f400::/48 au +2001:df5:f800::/48 sg +2001:df5:fc00::/48 in +2001:df6::/46 in +2001:df6:400::/48 hk +2001:df6:800::/48 hk +2001:df6:c00::/48 th +2001:df6:1000::/48 ph +2001:df6:1400::/48 au +2001:df6:1800::/48 id +2001:df6:1c00::/48 cn +2001:df6:2000::/48 hk +2001:df6:2400::/48 au +2001:df6:2800::/48 in +2001:df6:2c00::/48 vn +2001:df6:3000::/48 nz +2001:df6:3400::/48 vn +2001:df6:3800::/48 nz +2001:df6:3c00::/48 pk +2001:df6:4000::/48 au +2001:df6:4400::/48 in +2001:df6:4800::/48 nz +2001:df6:4c00::/48 in +2001:df6:5000::/48 au +2001:df6:5400::/48 th +2001:df6:5800::/48 in +2001:df6:5c00::/48 th +2001:df6:6000::/48 jp +2001:df6:6400::/48 sg +2001:df6:6800::/48 cn +2001:df6:6c00::/48 in +2001:df6:7000::/48 vn +2001:df6:7400::/48 th +2001:df6:7800::/48 hk +2001:df6:7c00::/48 au +2001:df6:8000::/48 jp +2001:df6:8400::/48 au +2001:df6:8800::/48 au +2001:df6:8c00::/48 th +2001:df6:9000::/48 au +2001:df6:9400::/48 in +2001:df6:9800::/48 au +2001:df6:9c00::/48 th +2001:df6:a000::/48 jp +2001:df6:a400::/48 sg +2001:df6:a800::/48 in +2001:df6:ac00::/48 id +2001:df6:b000::/48 th +2001:df6:b400::/48 my +2001:df6:b800::/48 sg +2001:df6:bc00::/48 hk +2001:df6:c400::/48 au +2001:df6:c800::/48 in +2001:df6:cc00::/48 id +2001:df6:d000::/48 hk +2001:df6:d400::/48 in +2001:df6:d800::/48 bd +2001:df6:dc00::/48 id +2001:df6:e400::/48 in +2001:df6:e800::/48 in +2001:df6:ec00::/48 id +2001:df6:f000::/48 hk +2001:df6:f400::/48 cn +2001:df6:f800::/48 au +2001:df6:fc00::/48 au +2001:df7::/48 in +2001:df7:400::/48 hk +2001:df7:800::/48 in +2001:df7:c00::/48 tw +2001:df7:1000::/48 in +2001:df7:1400::/48 au +2001:df7:1800::/48 au +2001:df7:1c00::/48 id +2001:df7:2000::/48 au +2001:df7:2400::/48 au +2001:df7:2800::/48 au +2001:df7:2c00::/48 in +2001:df7:3000::/48 nz +2001:df7:3400::/48 id +2001:df7:3800::/48 au +2001:df7:3c00::/48 id +2001:df7:4000::/48 sg +2001:df7:4400::/48 in +2001:df7:4800::/48 jp +2001:df7:4c00::/48 in +2001:df7:5000::/48 in +2001:df7:5400::/48 id +2001:df7:5800::/48 au +2001:df7:5c00::/48 hk +2001:df7:6000::/48 in +2001:df7:6400::/48 my +2001:df7:6800::/48 in +2001:df7:6c00::/48 id +2001:df7:7000::/48 hk +2001:df7:7400::/48 id +2001:df7:7800::/48 jp +2001:df7:7c00::/48 th +2001:df7:8400::/48 in +2001:df7:8800::/48 id +2001:df7:8c00::/48 mm +2001:df7:9400::/48 hk +2001:df7:9800::/48 nz +2001:df7:9c00::/48 au +2001:df7:a000::/48 au +2001:df7:a400::/48 sg +2001:df7:a800::/48 jp +2001:df7:ac00::/48 au +2001:df7:b000::/48 in +2001:df7:b400::/48 id +2001:df7:b800::/48 sg +2001:df7:bc00::/48 id +2001:df7:c000::/48 sg +2001:df7:c400::/48 nz +2001:df7:c800::/48 in +2001:df7:cc00::/48 vn +2001:df7:d000::/48 bd +2001:df7:d400::/48 au +2001:df7:d800::/48 au +2001:df7:dc00::/48 th +2001:df7:e000::/48 in +2001:df7:e400::/48 in +2001:df7:e800::/48 au +2001:df7:ec00::/48 au +2001:df7:f000::/48 jp +2001:df7:f400::/48 in +2001:df7:f800::/48 in +2001:df7:fc00::/48 sg 2001:df8::/32 au -2001:df9::/32 id 2001:dfa::/32 jp -2001:dfb:1::/48 au 2001:e00::/32 id 2001:e08::/32 cn 2001:e10::/32 tw 2001:e18::/32 cn 2001:e20::/32 nz -2001:e28::/32 au +2001:e28::/32 jp 2001:e30::/32 in 2001:e38::/32 jp 2001:e40::/32 jp 2001:e48::/32 in -2001:e50::/32 jp 2001:e58::/32 jp 2001:e60::/32 kr 2001:e68::/32 my @@ -1502,7 +3704,6 @@ 2001:eb0::/32 hk 2001:eb8::/32 kr 2001:ec0::/32 th -2001:ec8::/32 ph 2001:ed0::/32 kr 2001:ed8::/32 tw 2001:ee0::/32 vn @@ -1529,7 +3730,6 @@ 2001:fa0::/32 jp 2001:fa8::/32 jp 2001:fb0::/32 th -2001:fb8::/32 jp 2001:fc0::/32 sg 2001:fc8::/32 jp 2001:fd0::/32 in @@ -1542,7 +3742,7 @@ 2001:1208::/32 mx 2001:1210::/32 mx 2001:1218::/32 mx -2001:1220::/32 mx +2001:1220::/48 mx 2001:1228::/32 mx 2001:122c::/32 mx 2001:1230::/32 mx @@ -1555,6 +3755,31 @@ 2001:1270::/32 mx 2001:1278::/32 mx 2001:1280::/32 br +2001:1284::/32 br +2001:1288::/32 br +2001:128c::/32 br +2001:1290::/32 br +2001:1294::/32 br +2001:1298::/32 br +2001:129c::/32 br +2001:12a0::/32 br +2001:12a4::/32 br +2001:12ac::/32 br +2001:12b0::/32 br +2001:12b4::/32 br +2001:12b8::/32 br +2001:12bc::/32 br +2001:12c0::/32 br +2001:12c4::/32 br +2001:12c8::/32 br +2001:12d0::/32 br +2001:12d8::/32 br +2001:12e0::/32 br +2001:12e8::/32 br +2001:12f0::/32 br +2001:12f8::/47 br +2001:12f8:4::/48 br +2001:12fe::/32 br 2001:1300::/32 pe 2001:1308::/32 do 2001:1310::/32 cl @@ -1573,22 +3798,25 @@ 2001:1378::/32 bo 2001:1380::/32 pe 2001:1388::/32 pe -2001:1390::/32 ar 2001:1398::/32 cl 2001:13a0::/32 pe 2001:13a8::/32 mx 2001:13b0::/32 ar 2001:13c7:6000::/48 co 2001:13c7:6001::/48 ar +2001:13c7:6002::/48 sx 2001:13c7:6003::/48 ht +2001:13c7:6004::/48 cw 2001:13c7:6006::/48 ec 2001:13c7:6007::/48 ar +2001:13c7:6010::/48 ar 2001:13c7:6f00::/48 ec 2001:13c7:7000::/48 mx 2001:13c7:7001::/48 uy 2001:13c7:7004::/48 cr 2001:13c7:7005::/48 uy 2001:13c7:7010::/48 uy +2001:13c7:7014::/48 mx 2001:13c8::/32 cu 2001:13d0::/32 ar 2001:13d8::/32 cr @@ -1612,7 +3840,6 @@ 2001:1468::/32 cz 2001:1470::/32 si 2001:1478::/32 gb -2001:1480::/32 fr 2001:1488::/32 cz 2001:1490::/32 sa 2001:1498::/32 es @@ -1627,7 +3854,6 @@ 2001:14e0::/32 de 2001:14e8::/32 ir 2001:14f0::/32 de -2001:14f8::/32 de 2001:1500::/32 ir 2001:1508::/32 cz 2001:1510::/32 gb @@ -1637,23 +3863,19 @@ 2001:1538::/32 fr 2001:1540::/32 nl 2001:1548::/32 gr -2001:1550::/32 nl 2001:1558::/32 ch 2001:1560::/32 de 2001:1568::/32 cz -2001:1570::/32 gb 2001:1578::/32 de 2001:1580::/32 dk 2001:1588::/32 pt 2001:1590::/32 si 2001:1598::/32 be -2001:15a0::/32 it 2001:15a8::/32 it 2001:15b0::/32 nl 2001:15b8::/32 nl 2001:15c0::/32 si 2001:15c8::/32 nl -2001:15d0::/32 rs 2001:15d8::/32 pt 2001:15e0::/32 gb 2001:15e8::/32 cz @@ -1664,15 +3886,13 @@ 2001:1610::/32 lu 2001:1618::/32 at 2001:1620::/32 ch -2001:1628::/32 fr 2001:1630::/32 se 2001:1638::/32 de 2001:1640::/32 de -2001:1648::/32 fr 2001:1650::/32 fr 2001:1658::/32 fi 2001:1660::/32 se -2001:1668::/32 gb +2001:1668::/32 fr 2001:1670::/32 om 2001:1678::/32 it 2001:1680::/32 ch @@ -1684,7 +3904,6 @@ 2001:16b0::/32 pl 2001:16b8::/32 de 2001:16c0::/32 ir -2001:16c8::/32 gb 2001:16d0::/32 it 2001:16d8::/32 se 2001:16e0::/32 de @@ -1703,11 +3922,9 @@ 2001:1840::/32 us 2001:1848::/32 us 2001:1850::/32 us -2001:1858::/32 us 2001:1860::/32 us 2001:1868::/32 us 2001:1878::/32 us -2001:1880::/32 us 2001:1888::/32 us 2001:1890::/32 us 2001:18a0::/32 us @@ -1752,7 +3969,7 @@ 2001:19e8::/32 us 2001:19f0::/32 us 2001:19f8::/32 us -2001:1a00::/32 gb +2001:1a00::/32 eu 2001:1a08::/32 gb 2001:1a10::/32 qa 2001:1a18::/32 cy @@ -1768,7 +3985,6 @@ 2001:1a68::/32 pl 2001:1a70::/32 mt 2001:1a78::/32 de -2001:1a80::/32 de 2001:1a88::/32 ch 2001:1a90::/32 gb 2001:1a98::/32 is @@ -1812,7 +4028,7 @@ 2001:1bc8::/32 fi 2001:1bd0::/32 it 2001:1bd8::/32 ie -2001:1be0::/32 eu +2001:1be0::/32 gb 2001:1be8::/32 nl 2001:1bf0::/32 ee 2001:1bf8::/32 lv @@ -1836,7 +4052,6 @@ 2001:4080::/32 fr 2001:4088::/32 gb 2001:4090::/32 de -2001:4098::/32 ro 2001:40a0::/32 gb 2001:40a8::/32 il 2001:40b0::/32 es @@ -1852,18 +4067,16 @@ 2001:4100::/32 at 2001:4108::/32 es 2001:4118::/32 sk -2001:4120::/32 gb +2001:4120::/32 de 2001:4128::/32 nl 2001:4130::/32 ua 2001:4138::/32 gb -2001:4140::/32 gb 2001:4150::/32 de 2001:4158::/32 be 2001:4160::/32 gb 2001:4168::/32 ch 2001:4170::/32 rs 2001:4178::/32 de -2001:4180::/32 de 2001:4188::/32 ir 2001:4190::/32 pl 2001:4198::/32 nl @@ -1872,7 +4085,6 @@ 2001:41b0::/32 pl 2001:41b8::/32 de 2001:41c0::/32 gb -2001:41c8::/32 gb 2001:41d0::/32 fr 2001:41d8::/32 cz 2001:41e0::/32 ch @@ -1880,13 +4092,11 @@ 2001:41f0::/32 nl 2001:41f8::/32 de 2001:4200::/32 za -2001:4208::/32 za 2001:4210::/32 za 2001:4218::/32 za 2001:4220::/32 eg 2001:4228::/32 sd -2001:4230::/32 eg -2001:4238::/32 ke +2001:4238::/32 mu 2001:4240::/32 tz 2001:4248::/32 mu 2001:4250::/32 ao @@ -1908,13 +4118,12 @@ 2001:42d8::/32 ci 2001:42e0::/32 sc 2001:42f0::/32 za -2001:42f8::/32 gh 2001:4300::/32 eg 2001:4308::/32 za 2001:4310::/32 ma 2001:4318::/32 ci 2001:4320::/32 bj -2001:4328::/32 rw +2001:4328::/32 mu 2001:4330::/32 za 2001:4338::/32 sz 2001:4340::/32 dz @@ -1923,19 +4132,17 @@ 2001:4368::/32 ke 2001:4370::/32 ke 2001:4378::/32 mz -2001:4380::/32 za 2001:4388::/32 eg -2001:4390::/32 za 2001:4398::/32 mg 2001:43a0::/32 tz 2001:43a8::/32 za 2001:43b0::/32 ng -2001:43b8::/32 ug +2001:43b8::/32 mu 2001:43c0::/32 gh 2001:43c8::/32 eg 2001:43d0::/32 ke 2001:43d8::/32 za -2001:43e0::/32 gh +2001:43e0::/32 za 2001:43e8::/32 za 2001:43f0::/32 zw 2001:43f8::/48 tz @@ -1947,10 +4154,10 @@ 2001:43f8:70::/48 za 2001:43f8:80::/48 na 2001:43f8:90::/48 mu +2001:43f8:92::/48 mu 2001:43f8:a0::/48 za 2001:43f8:b0::/48 sl 2001:43f8:c0::/48 ke -2001:43f8:d0::/48 mu 2001:43f8:e0::/48 tz 2001:43f8:100::/48 za 2001:43f8:110::/48 mu @@ -1961,10 +4168,11 @@ 2001:43f8:160::/48 ng 2001:43f8:170::/48 ke 2001:43f8:180::/48 ng -2001:43f8:190::/48 za +2001:43f8:190::/48 ng 2001:43f8:1a0::/48 gh +2001:43f8:1b0::/48 za 2001:43f8:1c0::/48 dz -2001:43f8:1d0::/48 gh +2001:43f8:1d0::/48 sn 2001:43f8:1e0::/48 ng 2001:43f8:1f0::/48 za 2001:43f8:200::/48 ke @@ -1974,13 +4182,13 @@ 2001:43f8:250::/48 ke 2001:43f8:260::/48 ke 2001:43f8:270::/48 mu +2001:43f8:280::/48 mu 2001:43f8:290::/48 mg 2001:43f8:2a0::/48 bw 2001:43f8:2b0::/48 bw 2001:43f8:2c0::/48 za 2001:43f8:2e0::/48 eg 2001:43f8:2f0::/48 ng -2001:43f8:300::/48 za 2001:43f8:310::/48 zw 2001:43f8:320::/48 tn 2001:43f8:330::/48 tz @@ -1989,11 +4197,77 @@ 2001:43f8:370::/48 ng 2001:43f8:380::/48 mw 2001:43f8:390::/48 ao +2001:43f8:3a0::/48 za +2001:43f8:3b0::/48 na +2001:43f8:3c0::/48 cd +2001:43f8:3d0::/48 bf +2001:43f8:3e0::/48 za 2001:43f8:400::/48 ao +2001:43f8:600::/48 ng +2001:43f8:610::/48 tz +2001:43f8:620::/48 za +2001:43f8:630::/48 mw +2001:43f8:640::/48 mz +2001:43f8:650::/48 ma +2001:43f8:660::/48 ng +2001:43f8:670::/48 ao +2001:43f8:680::/48 tz +2001:43f8:6a0::/48 cg +2001:43f8:6b0::/48 za +2001:43f8:6c0::/48 ng +2001:43f8:6d0::/48 za +2001:43f8:6e0::/48 ke +2001:43f8:700::/48 za +2001:43f8:720::/48 ao +2001:43f8:750::/48 za +2001:43f8:760::/48 ao +2001:43f8:770::/48 za +2001:43f8:780::/48 ng +2001:43f8:790::/48 za +2001:43f8:7a0::/48 mu +2001:43f8:7b0::/48 ke +2001:43f8:7c0::/48 ao +2001:43f8:7d0::/48 ng +2001:43f8:7e0::/48 za +2001:43f8:7f0::/48 sd +2001:43f8:800::/48 gh +2001:43f8:900::/48 za +2001:43f8:910::/48 za +2001:43f8:920::/48 za +2001:43f8:930::/48 mz +2001:43f8:940::/48 ci +2001:43f8:950::/48 za +2001:43f8:960::/48 za +2001:43f8:970::/48 gm +2001:43f8:980::/48 na +2001:43f8:990::/48 bi +2001:43f8:9a0::/48 bj +2001:43f8:9b0::/48 sz +2001:43f8:9c0::/48 dj +2001:43f8:9d0::/48 ao +2001:43f8:9e0::/48 zw +2001:43f8:9f0::/48 ng +2001:43f8:a00::/48 ng +2001:43f8:a10::/48 mg +2001:43f8:a20::/48 sc +2001:43f8:a30::/48 ug +2001:43f8:a40::/48 mz +2001:43f8:a50::/48 bf +2001:43f8:a60::/48 lr +2001:43f8:a80::/48 ao +2001:43f8:a90::/48 sl +2001:43f8:aa0::/48 zm +2001:43f8:ab0::/48 ke +2001:43f8:ac0::/48 za +2001:43f8:ad0::/48 ug +2001:43f8:ae0::/48 gh +2001:43f8:af0::/48 bj +2001:43f8:b00::/48 ke +2001:43f8:b10::/48 ng +2001:43f8:b20::/48 ci 2001:4400::/32 nz 2001:4408::/32 in 2001:4410::/32 nz -2001:4418::/32 au 2001:4420::/32 tw 2001:4428::/32 nz 2001:4430::/32 kr @@ -2018,7 +4292,6 @@ 2001:4500::/32 tw 2001:4508::/32 tw 2001:4510::/32 cn -2001:4520::/32 in 2001:4528::/32 in 2001:4530::/32 nz 2001:4538::/32 pk @@ -2039,7 +4312,6 @@ 2001:4868::/32 us 2001:4870::/32 us 2001:4878::/32 us -2001:4880::/32 us 2001:4888::/32 us 2001:4890::/32 us 2001:4898::/32 us @@ -2053,7 +4325,6 @@ 2001:48d8::/32 us 2001:48e0::/32 us 2001:48e8::/32 us -2001:48f0::/32 us 2001:48f8::/32 us 2001:4900::/32 ca 2001:4908::/32 us @@ -2093,7 +4364,6 @@ 2001:4b10::/32 gb 2001:4b18::/32 it 2001:4b20::/32 ch -2001:4b28::/32 ch 2001:4b30::/32 fr 2001:4b38::/32 de 2001:4b40::/32 at @@ -2103,7 +4373,6 @@ 2001:4b60::/32 at 2001:4b68::/32 at 2001:4b70::/32 it -2001:4b78::/32 it 2001:4b80::/32 no 2001:4b88::/32 de 2001:4b90::/32 fr @@ -2149,23 +4418,20 @@ 2001:4cd8::/32 de 2001:4ce0::/32 de 2001:4ce8::/32 de -2001:4cf0::/32 de -2001:4cf8::/32 de 2001:4d00::/32 am 2001:4d08::/32 de 2001:4d10::/32 es -2001:4d18::/32 eu +2001:4d18::/32 ro 2001:4d20::/32 de -2001:4d28::/32 es 2001:4d30::/32 gb 2001:4d38::/32 it -2001:4d40::/32 de +2001:4d40::/32 eu 2001:4d48::/32 gb 2001:4d50::/32 de 2001:4d58::/32 ch 2001:4d60::/32 nl 2001:4d68::/32 ie -2001:4d70::/32 gr +2001:4d70::/32 bg 2001:4d78::/32 gb 2001:4d80::/32 ro 2001:4d88::/32 de @@ -2192,794 +4458,1861 @@ 2400:1100::/32 hk 2400:1200::/32 nz 2400:1300::/32 tw +2400:1380::/32 cn 2400:1400::/32 id +2400:1480::/32 sg 2400:1500::/32 tw +2400:1580::/32 nz 2400:1600::/32 in +2400:1680::/32 pk 2400:1700::/32 sg +2400:1780::/32 au 2400:1800::/32 kr +2400:1880::/32 id 2400:1900::/32 au +2400:1980::/32 af 2400:1a00::/32 np +2400:1a80::/32 pk 2400:1b00::/32 au +2400:1b80::/32 jp 2400:1c00::/32 sg +2400:1c80::/32 hk 2400:1d00::/32 sg +2400:1d80::/32 hk 2400:1e00::/32 in +2400:1e80::/32 hk 2400:1f00::/32 in +2400:1f80::/32 hk 2400:2000::/32 jp +2400:3080::/32 af 2400:3100::/32 vu +2400:3180::/32 in 2400:3200::/32 cn +2400:3280::/32 cn 2400:3300::/32 kr +2400:3380::/32 in 2400:3400::/32 vu +2400:3480::/32 th 2400:3500::/32 tv +2400:3580::/32 id 2400:3600::/32 cn -2400:3700::/32 my +2400:3680::/32 in 2400:3800::/32 jp +2400:3880::/32 au 2400:3900::/32 au +2400:3980::/32 jp 2400:3a00::/32 cn +2400:3a80::/32 in 2400:3b00::/32 in +2400:3b80::/32 in 2400:3c00::/32 sg +2400:3c80::/32 au 2400:3d00::/32 au +2400:3d80::/32 nz 2400:3e00::/32 cn +2400:3e80::/32 jp 2400:3f00::/32 sg +2400:3f80::/32 jp 2400:4000::/32 jp 2400:4400::/32 my +2400:4480::/32 in 2400:4500::/32 tw +2400:4580::/32 hk 2400:4600::/32 cn +2400:4680::/32 sg 2400:4700::/32 au +2400:4780::/32 kr 2400:4800::/32 nz +2400:4880::/32 kh 2400:4900::/32 sg +2400:4980::/32 kr 2400:4a00::/32 id +2400:4a80::/32 in 2400:4b00::/32 au +2400:4b80::/32 au 2400:4c00::/32 hk +2400:4c80::/32 id 2400:4d00::/32 au 2400:4e00::/32 cn +2400:4e80::/32 tw 2400:4f00::/32 pk 2400:5000::/32 au +2400:5080::/32 cn 2400:5100::/32 jp +2400:5180::/32 af 2400:5200::/32 in +2400:5280::/32 cn 2400:5300::/32 in +2400:5380::/32 my 2400:5400::/32 cn +2400:5480::/32 hk 2400:5500::/32 ph +2400:5580::/32 cn 2400:5600::/32 cn +2400:5680::/32 my 2400:5700::/32 in +2400:5780::/32 th 2400:5800::/32 bd +2400:5880::/32 my 2400:5900::/32 nz 2400:5a00::/32 cn +2400:5a80::/32 bd 2400:5b00::/32 nz -2400:5c00::/32 au +2400:5b80::/32 au +2400:5c80::/32 cn 2400:5d00::/32 au +2400:5d80::/32 au 2400:5e00::/32 au +2400:5e80::/32 cn 2400:5f00::/32 pf +2400:5f80::/32 hk 2400:6000::/32 cn +2400:6080::/32 nz 2400:6100::/32 au +2400:6180::/32 sg 2400:6200::/32 cn +2400:6280::/32 th 2400:6300::/32 in +2400:6380::/32 au 2400:6400::/32 to +2400:6480::/32 in 2400:6500::/32 sg +2400:6580::/32 in 2400:6600::/32 cn +2400:6680::/32 sg 2400:6700::/32 jp +2400:6780::/32 sg 2400:6800::/32 au +2400:6880::/32 au 2400:6900::/32 nz +2400:6980::/32 au 2400:6a00::/32 cn +2400:6a80::/32 ph 2400:6b00::/32 jp +2400:6b80::/32 in 2400:6c00::/32 au +2400:6c80::/32 hk 2400:6d00::/32 fj +2400:6d80::/32 au 2400:6e00::/32 cn +2400:6e80::/32 my 2400:6f00::/32 jp +2400:6f80::/32 cn 2400:7000::/32 tw +2400:7080::/32 np 2400:7100::/32 cn +2400:7180::/32 nz 2400:7200::/32 cn 2400:7300::/32 hk +2400:7380::/32 nz 2400:7400::/32 my +2400:7480::/32 mn 2400:7500::/32 id 2400:7600::/32 au +2400:7680::/32 cn 2400:7700::/32 nz +2400:7780::/32 in 2400:7800::/32 jp +2400:7880::/32 nz 2400:7900::/32 in +2400:7980::/32 sg 2400:7a00::/32 hk +2400:7a80::/32 hk 2400:7b00::/32 jp +2400:7b80::/32 th 2400:7c00::/32 my +2400:7c80::/32 in 2400:7d00::/32 au +2400:7d80::/32 au 2400:7e00::/32 jp +2400:7e80::/32 sg 2400:7f00::/32 au +2400:7f80::/32 cn 2400:8000::/32 id +2400:8080::/32 cn 2400:8100::/32 au +2400:8180::/32 in 2400:8200::/32 cn +2400:8280::/32 au 2400:8300::/32 jp +2400:8380::/32 au 2400:8400::/32 jp +2400:8480::/32 mm 2400:8500::/32 jp +2400:8580::/32 cn 2400:8600::/32 cn +2400:8680::/32 hk 2400:8700::/32 jp +2400:8780::/32 cn 2400:8800::/32 hk +2400:8880::/32 in 2400:8900::/32 sg +2400:8980::/32 cn 2400:8a00::/32 au +2400:8a80::/32 ph 2400:8b00::/32 id +2400:8b80::/32 id 2400:8c00::/32 nz +2400:8c80::/32 au 2400:8d00::/32 hk +2400:8d80::/32 kh 2400:8e00::/32 cn +2400:8e80::/32 hk 2400:8f00::/32 cn +2400:8f80::/32 au 2400:9000::/32 au +2400:9080::/32 in 2400:9100::/32 vn +2400:9180::/32 jp 2400:9200::/32 jp +2400:9280::/32 id 2400:9300::/32 pg +2400:9380::/32 hk 2400:9400::/32 bn +2400:9480::/32 au 2400:9500::/32 np +2400:9580::/32 cn 2400:9600::/32 cn 2400:9700::/32 np +2400:9780::/32 sg 2400:9800::/32 id +2400:9880::/32 au 2400:9900::/32 np +2400:9980::/32 in 2400:9a00::/32 cn +2400:9a80::/32 au 2400:9b00::/32 np +2400:9b80::/32 au 2400:9c00::/32 au +2400:9c80::/32 id 2400:9d00::/32 ph +2400:9d80::/32 in 2400:9e00::/32 cn -2400:9f00::/32 np +2400:9e80::/32 kr +2400:9f80::/32 kr 2400:a000::/32 in -2400:a100::/32 np -2400:a200::/32 au +2400:a080::/32 jp +2400:a280::/32 au 2400:a300::/32 jp +2400:a380::/32 cn 2400:a400::/32 np +2400:a480::/32 cn 2400:a500::/32 au +2400:a580::/32 kr 2400:a600::/32 au +2400:a680::/32 id 2400:a700::/32 au +2400:a780::/32 cn 2400:a800::/32 jp +2400:a880::/32 au 2400:a900::/32 cn +2400:a980::/32 cn 2400:aa00::/32 la +2400:aa80::/32 tw 2400:ab00::/32 kr +2400:ab80::/32 nz 2400:ac00::/32 jp +2400:ac80::/32 sg 2400:ad00::/32 au +2400:ad80::/32 nz 2400:ae00::/32 cn -2400:af00::/32 ph +2400:ae80::/32 au +2400:af80::/32 jp 2400:b000::/32 ph +2400:b080::/32 id 2400:b100::/32 au +2400:b180::/32 id 2400:b200::/32 cn 2400:b300::/32 au +2400:b380::/32 tw 2400:b400::/32 nz +2400:b480::/32 tw 2400:b500::/32 cn +2400:b580::/32 in 2400:b600::/32 cn +2400:b680::/32 jp 2400:b700::/32 cn +2400:b780::/32 au 2400:b800::/32 au -2400:b900::/32 ph +2400:b880::/32 au +2400:b980::/32 id 2400:ba00::/32 cn +2400:ba80::/32 hk 2400:bb00::/32 sg 2400:bc00::/32 au +2400:bc80::/32 vn 2400:bd00::/32 nz 2400:be00::/32 cn +2400:be80::/32 hk 2400:bf00::/32 cn +2400:bf80::/32 id 2400:c000::/32 nz +2400:c080::/32 id 2400:c100::/32 au +2400:c180::/32 la 2400:c200::/32 cn 2400:c300::/32 hk +2400:c380::/32 cn 2400:c400::/32 au +2400:c401::/32 us 2400:c500::/32 au +2400:c580::/32 nz 2400:c600::/32 bd +2400:c680::/32 hk 2400:c700::/32 in +2400:c780::/32 tw 2400:c800::/32 hk +2400:c880::/32 in 2400:c900::/32 id +2400:c980::/32 sg 2400:ca00::/32 bd -2400:cb00::/32 hk +2400:cb00::/32 us +2400:cb80::/32 cn 2400:cc00::/32 au +2400:cc80::/32 cn 2400:cd00::/32 th +2400:cd80::/32 id 2400:ce00::/32 cn +2400:ce80::/32 bd 2400:cf00::/32 kr +2400:cf80::/32 cn 2400:d000::/32 ph 2400:d100::/32 cn +2400:d180::/32 in 2400:d200::/32 cn +2400:d280::/32 in 2400:d300::/32 cn +2400:d380::/32 cn 2400:d400::/32 au +2400:d480::/32 au 2400:d500::/32 au +2400:d580::/32 tw 2400:d600::/32 cn +2400:d680::/32 id 2400:d700::/32 hk +2400:d780::/32 cn 2400:d800::/32 sg +2400:d880::/32 hk 2400:d900::/32 lk +2400:d980::/32 bd 2400:da00::/32 cn +2400:da80::/32 sg 2400:db00::/32 hk +2400:db80::/32 mn 2400:dc00::/32 id +2400:dc80::/32 bd 2400:dd00::/32 cn +2400:dd80::/32 bd 2400:de00::/32 cn +2400:de80::/32 cn 2400:df00::/32 jp +2400:df80::/32 my 2400:e000::/32 jp 2400:e100::/32 jp +2400:e180::/32 kr 2400:e200::/32 au 2400:e300::/32 au 2400:e400::/32 jp +2400:e480::/32 tw 2400:e500::/32 af -2400:e700::/32 nz -2400:e800::/32 my +2400:e680::/32 cn +2400:e780::/32 nz +2400:e880::/32 cn 2400:e900::/32 au +2400:e980::/32 in 2400:ea00::/32 th +2400:ea80::/32 in 2400:eb00::/32 au +2400:eb80::/32 bd 2400:ec00::/32 au +2400:ec80::/32 sg 2400:ed00::/32 sg +2400:ed80::/32 au 2400:ee00::/32 cn +2400:ee80::/32 nz 2400:ef00::/32 hk +2400:ef80::/32 hk 2400:f000::/32 hk +2400:f080::/32 in 2400:f100::/32 hk +2400:f180::/32 sg 2400:f200::/32 ph +2400:f280::/32 au 2400:f300::/32 in +2400:f380::/32 au 2400:f400::/32 jp -2400:f500::/32 ph +2400:f480::/32 cn +2400:f580::/32 id 2400:f600::/32 ph +2400:f680::/32 in 2400:f700::/32 hk +2400:f780::/32 in 2400:f800::/32 hk +2400:f880::/32 hk 2400:f900::/32 au +2400:f980::/32 cn 2400:fa00::/32 au +2400:fa80::/32 au 2400:fb00::/32 id +2400:fb80::/32 sg 2400:fc00::/32 pk +2400:fc80::/32 tw 2400:fd00::/32 bd +2400:fd80::/32 kr 2400:fe00::/32 cn +2400:fe80::/32 au 2400:ff00::/32 lk -2401::/32 pk +2400:ff80::/32 af +2401::/31 pk +2401:80::/32 cn 2401:100::/32 au +2401:180::/32 id 2401:200::/32 my +2401:280::/32 hk 2401:300::/32 hk +2401:380::/32 au 2401:400::/32 au 2401:500::/32 th +2401:580::/32 bd 2401:600::/32 jp +2401:680::/32 jp 2401:700::/32 au +2401:780::/32 cn 2401:800::/32 cn +2401:880::/32 my 2401:900::/32 jp +2401:980::/32 jp 2401:a00::/32 cn +2401:a80::/32 au 2401:b00::/32 my +2401:b80::/32 ph 2401:c00::/32 nc +2401:c80::/32 nz 2401:d00::/32 sg +2401:d80::/32 au 2401:e00::/32 cn +2401:e80::/32 th 2401:f00::/32 id +2401:f80::/32 au 2401:1000::/32 cn 2401:1100::/32 hk 2401:1200::/32 cn +2401:1280::/32 hk 2401:1300::/32 nz +2401:1380::/32 hk 2401:1400::/32 au +2401:1480::/32 kh 2401:1500::/32 au +2401:1580::/32 sg 2401:1600::/32 ph +2401:1680::/32 my 2401:1700::/32 id +2401:1780::/32 tw 2401:1800::/32 hk +2401:1880::/32 nz 2401:1900::/32 bd +2401:1980::/32 bd 2401:1a00::/32 in +2401:1a80::/32 th 2401:1b00::/32 id +2401:1b80::/32 au 2401:1c00::/32 au +2401:1c80::/32 hk 2401:1d00::/32 id +2401:1d80::/32 au 2401:1e00::/32 cn +2401:1e80::/32 au 2401:1f00::/32 au +2401:1f80::/32 sg 2401:2000::/32 jp 2401:2001::/32 au +2401:2080::/32 cn 2401:2100::/32 jp +2401:2180::/32 hk 2401:2200::/32 my +2401:2280::/32 au 2401:2300::/32 ph +2401:2380::/32 au 2401:2400::/32 id +2401:2480::/32 au 2401:2500::/32 jp +2401:2580::/32 au 2401:2600::/32 cn +2401:2680::/32 jp 2401:2700::/32 kr +2401:2780::/32 cn 2401:2800::/32 au +2401:2880::/32 ph 2401:2900::/32 id +2401:2980::/32 cn 2401:2a00::/32 cn +2401:2a80::/32 jp 2401:2b00::/32 bd +2401:2b80::/32 np 2401:2c00::/32 nz +2401:2c80::/32 hk 2401:2d00::/32 in +2401:2d80::/32 sg 2401:2e00::/32 cn +2401:2e80::/32 nz 2401:2f00::/32 sg +2401:2f80::/32 hk 2401:3000::/32 hk +2401:3080::/32 au 2401:3100::/32 cn +2401:3180::/32 au 2401:3200::/32 jp +2401:3280::/32 mo 2401:3300::/32 bd +2401:3380::/32 cn 2401:3400::/32 my -2401:3500::/32 hk +2401:3480::/32 cn +2401:3580::/32 bd 2401:3600::/32 jp -2401:3700::/32 my +2401:3680::/32 hk +2401:3780::/32 cn 2401:3800::/32 cn +2401:3880::/32 cn 2401:3900::/32 au +2401:3980::/32 cn 2401:3a00::/32 cn +2401:3a80::/32 cn 2401:3b00::/32 jp +2401:3b80::/32 cn 2401:3c00::/32 my +2401:3c80::/32 cn 2401:3d00::/32 sg +2401:3d80::/32 cn 2401:3e00::/32 kh +2401:3e80::/32 cn 2401:3f00::/32 sg +2401:3f80::/32 cn 2401:4000::/32 kr +2401:4080::/32 cn 2401:4100::/32 pk +2401:4180::/32 cn 2401:4200::/32 id +2401:4280::/32 cn 2401:4300::/32 in +2401:4380::/32 cn 2401:4400::/32 au -2401:4500::/32 jp -2401:4600::/32 au +2401:4480::/32 cn +2401:4580::/32 cn +2401:4600::/32 bd +2401:4680::/32 cn 2401:4700::/32 in +2401:4780::/32 cn 2401:4800::/32 in +2401:4880::/32 cn 2401:4900::/32 in 2401:4a00::/32 hk +2401:4a80::/32 cn 2401:4b00::/32 cn +2401:4b80::/32 tl 2401:4c00::/32 hk +2401:4c80::/32 au 2401:4d00::/32 au +2401:4d80::/32 kh 2401:4e00::/32 id +2401:4e80::/32 hk 2401:4f00::/32 th +2401:4f80::/32 cn 2401:5000::/32 my +2401:5080::/32 hk 2401:5100::/32 fj +2401:5180::/32 cn 2401:5200::/32 my +2401:5280::/32 hk 2401:5300::/32 jp 2401:5400::/32 id +2401:5480::/32 hk 2401:5500::/32 au +2401:5680::/32 cn 2401:5700::/32 th +2401:5780::/32 in 2401:5800::/32 bd +2401:5880::/32 cn 2401:5900::/32 hk +2401:5980::/32 my 2401:5a00::/32 hk +2401:5a80::/32 in 2401:5b00::/32 au -2401:5c00::/32 nz +2401:5b80::/32 au +2401:5c00::/32 au +2401:5c80::/32 cn 2401:5d00::/32 bd 2401:5e00::/32 tw +2401:5e80::/32 au 2401:5f00::/32 au +2401:5f80::/32 vn 2401:6000::/32 au 2401:7000::/32 nz +2401:7080::/32 tw 2401:7100::/32 au +2401:7180::/32 cn 2401:7200::/32 au 2401:7300::/32 au +2401:7380::/32 au 2401:7400::/32 sg +2401:7480::/32 my 2401:7500::/32 in +2401:7580::/32 cn 2401:7600::/32 hk +2401:7680::/32 cn 2401:7700::/32 cn +2401:7780::/32 cn 2401:7800::/32 sg +2401:7880::/32 cn 2401:7900::/32 lk +2401:7980::/32 cn 2401:7a00::/32 cn +2401:7a80::/32 cn 2401:7b00::/32 au +2401:7b80::/32 cn 2401:7c00::/32 nz +2401:7c80::/32 cn 2401:7d00::/32 id +2401:7d80::/32 cn 2401:7e00::/32 cn +2401:7e80::/32 au 2401:7f00::/32 jp +2401:7f80::/32 cn 2401:8000::/32 tw +2401:8080::/32 af 2401:8100::/32 au +2401:8180::/32 au 2401:8200::/32 cn +2401:8280::/32 jp 2401:8300::/32 mv +2401:8380::/32 cn 2401:8400::/32 sg +2401:8480::/32 au 2401:8500::/32 hk 2401:8600::/32 cn +2401:8680::/32 cn 2401:8700::/32 jp +2401:8780::/32 in 2401:8800::/32 in +2401:8880::/32 hk 2401:8900::/32 in +2401:8980::/32 hk 2401:8a00::/32 hk +2401:8a80::/32 au 2401:8b00::/32 jp +2401:8b80::/32 hk 2401:8c00::/32 au +2401:8c80::/32 bd 2401:8d00::/32 cn 2401:8e00::/32 pk +2401:8e80::/32 ph 2401:8f00::/32 id -2401:9000::/32 id +2401:8f80::/32 in +2401:9080::/32 au 2401:9100::/32 mo +2401:9180::/32 tw 2401:9200::/32 hk +2401:9280::/32 id 2401:9300::/32 au +2401:9380::/32 cn 2401:9400::/32 ph +2401:9480::/32 nz 2401:9500::/32 ph +2401:9580::/32 my 2401:9600::/32 cn +2401:9680::/32 au 2401:9700::/32 kh +2401:9780::/32 in 2401:9800::/32 ph -2401:9900::/32 lk +2401:9880::/32 hk +2401:9980::/32 my 2401:9a00::/32 cn 2401:9b00::/32 id +2401:9b80::/32 cn 2401:9c00::/32 bd +2401:9c80::/32 hk 2401:9d00::/32 th +2401:9d80::/32 hk 2401:9e00::/32 pk +2401:9e80::/32 id 2401:9f00::/32 hk +2401:9f80::/32 cn 2401:a000::/32 kr +2401:a080::/32 hk 2401:a100::/32 in -2401:a200::/32 pk +2401:a180::/32 cn +2401:a280::/32 hk 2401:a300::/32 id +2401:a380::/32 jp 2401:a400::/32 au +2401:a480::/32 in 2401:a500::/32 jp +2401:a580::/32 th 2401:a600::/32 in +2401:a680::/32 hk 2401:a700::/32 kh +2401:a780::/32 hk 2401:a800::/32 kr +2401:a880::/32 in 2401:a900::/32 in +2401:a980::/32 cn 2401:aa00::/32 cn +2401:aa80::/32 nz 2401:ab00::/32 tw +2401:ab80::/32 hk 2401:ac00::/32 au +2401:ac80::/32 nz 2401:ad00::/32 jp +2401:ad80::/32 nz 2401:ae00::/32 id +2401:ae80::/32 au 2401:af00::/32 nc +2401:af80::/32 jp 2401:b000::/32 my +2401:b080::/32 sg 2401:b100::/32 in +2401:b180::/32 cn 2401:b200::/32 in +2401:b280::/32 hk 2401:b300::/32 au +2401:b380::/32 au 2401:b400::/32 cn +2401:b480::/32 cn 2401:b500::/32 au +2401:b580::/32 cn 2401:b600::/32 cn -2401:b700::/32 au +2401:b680::/32 cn +2401:b780::/32 my 2401:b800::/32 vn +2401:b880::/32 au 2401:b900::/32 ph 2401:ba00::/32 cn +2401:ba80::/32 pk 2401:bb00::/32 in +2401:bb80::/32 cn 2401:bc00::/32 ph +2401:bc80::/32 mm 2401:bd00::/32 jp 2401:be00::/32 cn +2401:be80::/32 id 2401:bf00::/32 jp +2401:bf80::/32 my 2401:c000::/32 bd +2401:c080::/32 jp 2401:c100::/32 sg +2401:c180::/32 hk 2401:c200::/32 cn +2401:c280::/32 in 2401:c300::/32 in 2401:c400::/32 my +2401:c480::/32 hk 2401:c500::/32 kr +2401:c580::/32 hk 2401:c600::/32 cn +2401:c680::/32 bd 2401:c700::/32 hk +2401:c780::/32 au 2401:c800::/32 jp +2401:c880::/32 in 2401:c900::/32 sg +2401:c980::/32 nz 2401:ca00::/32 cn +2401:ca80::/32 cn 2401:cb00::/32 kh +2401:cb80::/32 cn 2401:cc00::/32 cn +2401:cc80::/32 au 2401:cd00::/32 bd +2401:cd80::/32 au 2401:ce00::/32 cn +2401:ce80::/32 jp 2401:cf00::/32 au +2401:cf80::/32 ph 2401:d000::/32 au +2401:d080::/32 au 2401:d100::/32 sg +2401:d180::/32 cn 2401:d200::/32 nz +2401:d280::/32 hk 2401:d300::/32 my +2401:d380::/32 bd 2401:d400::/32 nz +2401:d480::/32 au 2401:d500::/32 jp +2401:d580::/32 au 2401:d600::/32 mn +2401:d680::/32 my 2401:d700::/32 jp +2401:d780::/32 cn 2401:d800::/32 vn +2401:d880::/32 th 2401:d900::/32 jp +2401:d980::/32 hk 2401:da00::/32 cn +2401:da80::/32 hk 2401:db00::/32 sg +2401:db80::/32 sg 2401:dc00::/32 in +2401:dc80::/32 pf 2401:dd00::/32 lk +2401:dd80::/32 au 2401:de00::/32 cn +2401:de80::/32 id 2401:df00::/32 au +2401:df80::/32 in 2401:e000::/32 th +2401:e080::/32 cn 2401:e100::/32 au +2401:e180::/32 tw 2401:e200::/32 kr +2401:e280::/32 my 2401:e300::/32 jp +2401:e380::/32 hk 2401:e400::/32 au +2401:e480::/32 id 2401:e500::/32 in +2401:e580::/32 au 2401:e600::/32 fj +2401:e680::/32 in 2401:e700::/32 jp +2401:e780::/32 sg 2401:e800::/32 vn +2401:e880::/32 au 2401:e900::/32 bd +2401:e980::/32 au 2401:ea00::/32 pk +2401:ea80::/32 au 2401:eb00::/32 au +2401:eb80::/32 my 2401:ec00::/32 cn +2401:ec80::/32 nz 2401:ed00::/32 au +2401:ed80::/32 bd 2401:ee00::/32 id +2401:ee80::/32 au 2401:ef00::/32 sg +2401:ef80::/32 hk 2401:f000::/32 nz +2401:f080::/32 au 2401:f100::/32 jp +2401:f180::/32 au 2401:f200::/32 mm +2401:f280::/32 jp 2401:f300::/32 cn +2401:f380::/32 hk 2401:f400::/32 hk +2401:f480::/32 in 2401:f500::/32 nz -2401:f600::/32 au +2401:f580::/32 in +2401:f680::/32 pg 2401:f700::/32 au +2401:f780::/32 np 2401:f800::/32 jp +2401:f880::/32 my 2401:f900::/32 sg +2401:f980::/32 id 2401:fa00::/32 in +2401:fa80::/32 cn 2401:fb00::/32 in +2401:fb80::/32 cn 2401:fc00::/32 au +2401:fc80::/32 cn 2401:fd00::/32 my +2401:fd80::/32 au 2401:fe00::/32 au +2401:fe80::/32 cn 2401:ff00::/32 nz +2401:ff80::/32 bd 2402::/22 kr 2402:400::/32 sg +2402:480::/32 id 2402:500::/32 sg +2402:580::/32 id 2402:600::/32 id +2402:680::/32 id 2402:700::/32 jp +2402:780::/32 id 2402:800::/32 vn 2402:900::/32 in +2402:980::/32 sg 2402:a00::/32 in +2402:a80::/32 au 2402:b00::/32 in +2402:b80::/32 in 2402:c00::/32 au +2402:c80::/32 hk 2402:d00::/32 af +2402:d80::/32 sg 2402:e00::/32 cn +2402:e80::/32 in 2402:f00::/32 au +2402:f80::/32 in 2402:1000::/32 cn +2402:1080::/32 in 2402:1100::/32 my +2402:1180::/32 au 2402:1200::/32 id +2402:1280::/32 au 2402:1300::/32 au +2402:1380::/32 bd 2402:1400::/32 jp +2402:1480::/32 np 2402:1500::/32 hk +2402:1580::/32 jp 2402:1600::/32 cn +2402:1680::/32 pk 2402:1700::/32 au +2402:1780::/32 tw 2402:1800::/32 au +2402:1880::/32 hk 2402:1900::/32 au +2402:1980::/32 my 2402:1a00::/32 kr +2402:1a80::/32 my 2402:1b00::/32 in +2402:1b80::/32 au 2402:1c00::/32 nz +2402:1c80::/32 bd 2402:1d00::/32 jp +2402:1d80::/32 id 2402:1e00::/32 au +2402:1e80::/32 jp 2402:1f00::/32 hk +2402:1f80::/32 cn 2402:2000::/32 cn +2402:2080::/32 tw 2402:2100::/32 hk +2402:2180::/32 hk 2402:2200::/32 my +2402:2280::/32 cn 2402:2300::/32 bd +2402:2380::/32 nz 2402:2400::/32 sg +2402:2480::/32 in 2402:2500::/32 sg +2402:2580::/32 tw 2402:2600::/32 in +2402:2680::/32 id 2402:2700::/32 th +2402:2780::/32 cn 2402:2800::/32 in +2402:2880::/32 af 2402:2900::/32 id +2402:2980::/32 nz 2402:2a00::/32 cn +2402:2a80::/32 hk 2402:2b00::/32 au +2402:2b80::/32 cn 2402:2c00::/32 sg +2402:2c80::/32 au 2402:2d00::/32 cn -2402:2e00::/32 ph +2402:2d80::/32 cn +2402:2e80::/32 cn 2402:2f00::/32 au +2402:2f80::/32 au 2402:3000::/32 jp +2402:3080::/32 cn 2402:3100::/32 kr +2402:3180::/32 cn 2402:3200::/32 au +2402:3280::/32 bd 2402:3300::/32 sg +2402:3380::/32 au 2402:3400::/32 au -2402:3500::/32 au +2402:3480::/32 id +2402:3500::/32 nz +2402:3580::/32 nz 2402:3600::/32 au +2402:3680::/32 au 2402:3700::/32 id +2402:3780::/32 au 2402:3800::/32 jp +2402:3880::/32 jp 2402:3900::/32 au +2402:3980::/32 au 2402:3a00::/32 au +2402:3a80::/32 in 2402:3b00::/32 jp +2402:3b80::/32 bd 2402:3c00::/32 cn +2402:3c80::/32 au 2402:3d00::/32 jp +2402:3d80::/32 id 2402:3e00::/32 cn -2402:3f00::/32 mn +2402:3e80::/32 my +2402:3f80::/32 cn 2402:4000::/32 lk +2402:4080::/32 hk 2402:4100::/32 id +2402:4180::/32 sg 2402:4200::/32 jp +2402:4280::/32 au 2402:4300::/32 in +2402:4380::/32 au 2402:4400::/32 sg +2402:4480::/32 hk 2402:4500::/32 cn +2402:4580::/32 id 2402:4600::/32 au +2402:4680::/32 hk 2402:4700::/32 jp +2402:4780::/32 th 2402:4800::/32 sg +2402:4880::/32 au 2402:4900::/32 tw +2402:4980::/32 au 2402:4a00::/32 cn +2402:4a80::/32 cn 2402:4b00::/32 my +2402:4b80::/32 cn 2402:4c00::/32 in +2402:4c80::/32 au 2402:4d00::/32 hk +2402:4d80::/32 cn 2402:4e00::/32 cn +2402:4e80::/32 au 2402:4f00::/32 hk +2402:4f80::/32 cn +2402:5080::/32 sg 2402:5100::/32 kh +2402:5180::/32 cn 2402:5200::/32 au +2402:5280::/32 au 2402:5300::/32 vn +2402:5380::/32 bd 2402:5400::/32 sg +2402:5480::/32 au 2402:5500::/32 ph +2402:5580::/32 id 2402:5600::/32 au +2402:5680::/32 id 2402:5700::/32 my +2402:5780::/32 sg 2402:5800::/32 kr +2402:5880::/32 cn 2402:5900::/32 sg +2402:5980::/32 sg 2402:5a00::/32 jp +2402:5a80::/32 pg 2402:5b00::/32 in +2402:5b80::/32 cn 2402:5c00::/32 au +2402:5c80::/32 in 2402:5d00::/32 cn +2402:5d80::/32 bd 2402:5e00::/32 cn +2402:5e80::/32 bd 2402:5f00::/32 id -2402:6000::/32 nz +2402:5f80::/32 sg +2402:6000::/32 au +2402:6080::/32 hk 2402:6100::/32 kr +2402:6180::/32 hk 2402:6200::/32 gu -2402:6300::/32 au +2402:6280::/32 cn 2402:6400::/32 au +2402:6480::/32 bd 2402:6500::/32 au +2402:6580::/32 au 2402:6600::/32 au +2402:6680::/32 in 2402:6700::/32 jp +2402:6780::/32 au 2402:6800::/32 jp +2402:6880::/32 th 2402:6900::/32 au +2402:6980::/32 id 2402:6a00::/32 cn +2402:6a80::/32 hk 2402:6b00::/32 jp +2402:6b80::/32 au 2402:6c00::/32 my +2402:6c80::/32 jp 2402:6d00::/32 pf +2402:6d80::/32 ph 2402:6e00::/32 cn +2402:6e80::/32 cn 2402:6f00::/32 hk +2402:6f80::/32 nz 2402:7000::/32 kr +2402:7080::/32 cn 2402:7100::/32 id +2402:7180::/32 bd 2402:7200::/32 tk +2402:7280::/32 au 2402:7300::/32 hk +2402:7380::/32 cn 2402:7400::/32 au +2402:7480::/32 hk 2402:7500::/32 tw +2402:7580::/32 mn 2402:7600::/32 au +2402:7680::/32 au 2402:7700::/32 jp +2402:7780::/32 in 2402:7800::/32 au +2402:7880::/32 sg 2402:7900::/32 au +2402:7980::/32 id 2402:7a00::/32 jp +2402:7a80::/32 nz 2402:7b00::/32 sg +2402:7b80::/32 au 2402:7c00::/32 pk +2402:7c80::/32 au 2402:7d00::/32 cn +2402:7d80::/32 cn 2402:7e00::/32 nz +2402:7e80::/32 au 2402:7f00::/32 in +2402:7f80::/32 jp 2402:8000::/32 au +2402:8080::/32 au 2402:8100::/32 in +2402:8180::/32 cn 2402:8200::/32 nz +2402:8280::/32 cn 2402:8300::/32 cn +2402:8380::/32 cn 2402:8400::/32 in +2402:8480::/32 au 2402:8500::/32 au +2402:8580::/32 hk 2402:8600::/32 id +2402:8680::/32 in 2402:8700::/32 au +2402:8780::/32 id 2402:8800::/32 cn +2402:8880::/32 mn 2402:8900::/32 cn +2402:8980::/32 bd 2402:8a00::/32 in +2402:8a80::/32 in 2402:8b00::/32 id +2402:8b80::/32 nz 2402:8c00::/32 in +2402:8c80::/32 la 2402:8d00::/32 sg +2402:8d80::/32 la 2402:8e00::/32 in +2402:8e80::/32 bd 2402:8f00::/32 sg +2402:8f80::/32 cn +2402:9080::/32 id 2402:9100::/32 au +2402:9180::/32 au 2402:9200::/32 au +2402:9280::/32 mo 2402:9300::/32 jp +2402:9380::/32 in 2402:9400::/32 au +2402:9480::/32 cn 2402:9500::/32 my -2402:9700::/32 au +2402:9580::/32 cn +2402:9680::/32 cn +2402:9780::/32 bd 2402:9800::/32 id +2402:9880::/32 hk 2402:9900::/32 au +2402:9980::/32 cn 2402:9a00::/32 my +2402:9a80::/32 cn 2402:9b00::/32 th +2402:9b80::/32 cn 2402:9c00::/32 tw +2402:9c80::/32 au 2402:9d00::/32 kh +2402:9d80::/32 vn 2402:9e00::/32 nz +2402:9e80::/32 hk 2402:9f00::/32 au +2402:9f80::/32 cn 2402:a000::/32 id +2402:a080::/32 cn 2402:a100::/32 id +2402:a180::/32 cn 2402:a200::/32 cn +2402:a280::/32 cn 2402:a300::/32 np +2402:a380::/32 cn 2402:a400::/32 au +2402:a480::/32 nz +2402:a500::/32 id +2402:a580::/32 au 2402:a600::/32 id +2402:a680::/32 cn +2402:a700::/32 au +2402:a780::/32 nz 2402:a800::/32 jp -2402:aa00::/32 au +2402:a880::/32 cn +2402:a900::/32 sg +2402:a980::/32 au +2402:aa80::/32 cn +2402:ab00::/32 id +2402:ab80::/32 cn 2402:ac00::/32 id +2402:ac80::/32 au +2402:ad00::/32 au +2402:ad80::/32 pk 2402:ae00::/32 cn -2402:b000::/32 jp +2402:ae80::/32 ws +2402:af00::/32 au +2402:af80::/32 cn +2402:b080::/32 cn +2402:b100::/32 au +2402:b180::/32 sg 2402:b200::/32 cn +2402:b280::/32 au +2402:b300::/32 jp +2402:b380::/32 cn 2402:b400::/32 my +2402:b480::/32 au +2402:b500::/32 bd +2402:b580::/32 in 2402:b600::/32 tw +2402:b680::/32 au +2402:b700::/32 jp +2402:b780::/32 hk 2402:b800::/32 au +2402:b880::/32 cn +2402:b900::/32 mn +2402:b980::/32 cn 2402:ba00::/32 ph +2402:ba80::/32 cn +2402:bb00::/32 jp +2402:bb80::/32 au 2402:bc00::/32 jp +2402:bc80::/32 au +2402:bd00::/32 au +2402:bd80::/32 in 2402:be00::/32 kr +2402:be80::/32 id +2402:bf00::/32 my +2402:bf80::/32 cn 2402:c000::/32 bd +2402:c080::/32 jp +2402:c100::/32 kh +2402:c180::/32 au 2402:c200::/32 jp +2402:c280::/32 cn +2402:c300::/32 id +2402:c380::/32 th 2402:c400::/32 jp +2402:c480::/32 hk +2402:c500::/32 au +2402:c580::/32 hk 2402:c600::/32 jp +2402:c680::/32 hk +2402:c700::/32 vn +2402:c780::/32 my 2402:c800::/32 jp +2402:c880::/32 hk +2402:c900::/32 mn +2402:c980::/32 th 2402:ca00::/32 au +2402:ca80::/32 au +2402:cb00::/32 lk +2402:cb80::/32 au 2402:cc00::/32 nz +2402:cc80::/32 cn +2402:cd00::/32 in +2402:cd80::/32 id 2402:ce00::/32 sg +2402:ce80::/32 in +2402:cf00::/32 cn +2402:cf80::/32 sg 2402:d000::/32 lk +2402:d080::/32 tl +2402:d100::/32 au +2402:d180::/32 au 2402:d200::/32 jp +2402:d280::/32 nl +2402:d300::/32 cn +2402:d380::/32 cn 2402:d400::/32 in +2402:d500::/32 in +2402:d580::/32 au 2402:d600::/32 jp +2402:d680::/32 id +2402:d700::/32 jp +2402:d780::/32 cn 2402:d800::/32 au +2402:d880::/32 cn +2402:d900::/32 au +2402:d980::/32 cn 2402:da00::/32 id +2402:da80::/32 hk +2402:db00::/32 sg +2402:db80::/32 nz 2402:dc00::/32 jp +2402:dc80::/32 hk +2402:dd80::/32 af 2402:de00::/32 kr +2402:de80::/32 in +2402:df00::/32 in +2402:df80::/32 au 2402:e000::/32 pk +2402:e080::/32 af +2402:e100::/32 id +2402:e180::/32 id 2402:e200::/32 jp +2402:e280::/32 in +2402:e300::/32 id +2402:e380::/32 hk 2402:e400::/32 au +2402:e480::/32 cn +2402:e500::/32 au +2402:e580::/32 hk 2402:e600::/32 sg +2402:e680::/32 cn +2402:e780::/32 cn 2402:e800::/32 jp -2402:ea00::/32 in +2402:e880::/32 cn +2402:e900::/32 au +2402:e980::/32 cn +2402:ea80::/32 in +2402:eb00::/32 au +2402:eb80::/32 cn 2402:ec00::/32 au +2402:ec80::/32 cn +2402:ed00::/32 jp +2402:ed80::/32 cn 2402:ee00::/32 au +2402:ee80::/32 id +2402:ef00::/32 in +2402:ef80::/32 cn 2402:f000::/32 cn +2402:f080::/32 id +2402:f100::/32 in +2402:f180::/32 hk 2402:f200::/32 in +2402:f280::/32 au +2402:f300::/32 nz +2402:f380::/32 au 2402:f400::/32 kr -2402:f600::/32 au +2402:f480::/32 cn +2402:f500::/32 bd +2402:f580::/32 cn +2402:f600::/32 nz +2402:f680::/32 cn +2402:f700::/32 au +2402:f780::/32 cn 2402:f800::/32 vn +2402:f880::/32 au +2402:f900::/32 nz +2402:f980::/32 cn 2402:fa00::/32 au +2402:fa80::/32 au +2402:fb00::/32 us +2402:fb80::/32 in 2402:fc00::/32 id +2402:fc80::/32 th +2402:fd00::/32 pk +2402:fd80::/32 nz 2402:fe00::/32 ph +2402:fe80::/32 my +2402:ff00::/32 nz +2402:ff80::/32 au 2403::/31 in +2403:80::/32 id +2403:100::/32 sg +2403:180::/32 sg 2403:200::/32 nc +2403:280::/32 hk +2403:300::/32 sg +2403:380::/32 hk 2403:400::/32 jp +2403:480::/32 au +2403:500::/32 la +2403:580::/32 bt 2403:600::/32 cn +2403:680::/32 bd +2403:700::/32 cn +2403:780::/32 au 2403:800::/32 cn +2403:880::/32 au +2403:900::/32 au +2403:980::/32 cn 2403:a00::/32 nz +2403:a80::/32 cn +2403:b00::/32 sg +2403:b80::/32 cn 2403:c00::/32 in +2403:c80::/32 cn +2403:d00::/32 au +2403:d80::/32 cn 2403:e00::/32 nz +2403:e80::/32 cn +2403:f00::/32 cn +2403:f80::/32 cn 2403:1000::/32 hk -2403:1200::/32 bd +2403:1080::/32 in +2403:1100::/32 au +2403:1180::/32 cn +2403:1280::/32 au +2403:1300::/32 my +2403:1380::/32 my 2403:1400::/32 au +2403:1480::/32 au +2403:1500::/32 nz +2403:1580::/32 cn 2403:1600::/32 kh +2403:1680::/32 au +2403:1700::/32 au +2403:1780::/32 id 2403:1800::/32 jp +2403:1880::/32 id +2403:1900::/32 au +2403:1980::/32 cn 2403:1a00::/32 id +2403:1a80::/32 sg +2403:1b00::/32 jp +2403:1b80::/32 cn 2403:1c00::/32 hk +2403:1c80::/32 cn +2403:1d00::/32 in +2403:1d80::/32 cn 2403:1e00::/32 as +2403:1e80::/32 cn +2403:1f00::/32 jp +2403:1f80::/32 cn 2403:2000::/32 jp +2403:2080::/32 cn +2403:2100::/32 nz +2403:2180::/32 cn 2403:2200::/32 in +2403:2280::/32 cn +2403:2300::/32 th +2403:2380::/32 cn 2403:2400::/32 hk +2403:2480::/32 cn +2403:2500::/32 in +2403:2580::/32 cn 2403:2600::/32 id +2403:2680::/32 cn +2403:2700::/32 id +2403:2780::/32 cn 2403:2800::/32 th +2403:2880::/32 jp +2403:2900::/32 in +2403:2980::/32 in 2403:2a00::/32 cn +2403:2a80::/32 au +2403:2b80::/32 my 2403:2c00::/32 hk +2403:2c80::/32 hk +2403:2d00::/32 jp +2403:2d80::/32 cn 2403:2e00::/32 id +2403:2e80::/32 au +2403:2f00::/32 nz +2403:2f80::/32 au +2403:3080::/32 hk +2403:3100::/32 sg +2403:3180::/32 au 2403:3200::/32 jp +2403:3280::/32 cn +2403:3300::/32 nl +2403:3380::/32 cn 2403:3400::/32 au +2403:3480::/32 cn +2403:3500::/32 au +2403:3580::/32 cn 2403:3600::/32 au +2403:3680::/32 cn +2403:3700::/32 kr +2403:3780::/32 cn 2403:3800::/32 np +2403:3880::/32 cn +2403:3900::/32 nz +2403:3980::/32 cn 2403:3a00::/32 jp +2403:3a80::/32 my +2403:3b00::/32 au +2403:3b80::/32 cn 2403:3c00::/32 au +2403:3c80::/32 cn +2403:3d00::/32 in +2403:3d80::/32 cn 2403:3e00::/32 kr +2403:3e80::/32 cn +2403:3f00::/32 my +2403:3f80::/32 cn 2403:4000::/32 bd +2403:4080::/32 cn +2403:4100::/32 id +2403:4180::/32 cn 2403:4200::/32 au +2403:4280::/32 cn +2403:4300::/32 cn +2403:4380::/32 cn 2403:4400::/32 jp +2403:4480::/32 ws +2403:4500::/32 id +2403:4580::/32 cn 2403:4600::/32 fj +2403:4680::/32 cn +2403:4700::/32 sg +2403:4780::/32 cn 2403:4800::/32 au +2403:4880::/32 cn +2403:4900::/32 hk +2403:4980::/32 cn 2403:4a00::/32 hk +2403:4a80::/32 cn +2403:4b00::/32 nz +2403:4b80::/32 cn 2403:4c00::/32 th +2403:4c80::/32 cn +2403:4d00::/32 nz +2403:4d80::/32 cn 2403:4e00::/32 in +2403:4e80::/32 au +2403:4f00::/32 nz +2403:4f80::/32 au 2403:5000::/32 hk +2403:5080::/32 cn +2403:5100::/32 au +2403:5180::/32 hk 2403:5200::/32 tw +2403:5280::/32 cn +2403:5300::/32 in +2403:5380::/32 cn 2403:5400::/32 th +2403:5480::/32 cn +2403:5500::/32 hk +2403:5580::/32 cn 2403:5600::/32 hk +2403:5680::/32 au +2403:5700::/32 jp +2403:5780::/32 cn 2403:5800::/32 au +2403:5880::/32 cn +2403:5900::/32 in +2403:5980::/32 cn 2403:5a00::/32 jp +2403:5a80::/32 cn +2403:5b00::/32 in +2403:5b80::/32 cn 2403:5c00::/32 au +2403:5c80::/32 cn +2403:5d80::/32 cn 2403:5e00::/32 ph +2403:5e80::/32 cn +2403:5f00::/32 jp +2403:5f80::/32 cn 2403:6000::/32 vn +2403:6080::/32 cn +2403:6100::/32 th +2403:6180::/32 cn 2403:6200::/32 th +2403:6280::/32 cn +2403:6300::/32 kr +2403:6380::/32 cn 2403:6400::/32 au +2403:6480::/32 cn +2403:6500::/32 kr +2403:6580::/32 cn 2403:6600::/32 kh +2403:6680::/32 cn +2403:6700::/32 au +2403:6780::/32 cn 2403:6800::/32 nz +2403:6880::/32 cn +2403:6900::/32 au +2403:6980::/32 cn 2403:6a00::/32 cn +2403:6a80::/32 mm +2403:6b00::/32 sg +2403:6b80::/32 au 2403:6c00::/32 jp +2403:6c80::/32 cn +2403:6d00::/32 sg +2403:6d80::/32 cn 2403:6e00::/32 au +2403:6e80::/32 cn +2403:6f80::/32 hk 2403:7000::/32 nz +2403:7080::/32 cn +2403:7100::/32 in +2403:7180::/32 cn 2403:7200::/32 id +2403:7280::/32 cn +2403:7300::/32 jp +2403:7380::/32 cn 2403:7400::/32 jp +2403:7480::/32 cn +2403:7500::/32 kh +2403:7580::/32 cn 2403:7600::/32 nz +2403:7680::/32 hk +2403:7700::/32 cn +2403:7780::/32 hk 2403:7800::/32 jp +2403:7880::/32 in +2403:7900::/32 au +2403:7980::/32 pk 2403:7a00::/32 jp +2403:7a80::/32 cn +2403:7b00::/32 cn +2403:7b80::/32 id 2403:7c00::/32 jp +2403:7c80::/32 sg +2403:7d00::/32 au +2403:7d80::/32 cn 2403:7e00::/32 au +2403:7e80::/32 cn +2403:7f00::/32 sg +2403:7f80::/32 cn 2403:8000::/32 id +2403:8080::/32 cn +2403:8100::/32 hk +2403:8180::/32 cn 2403:8200::/32 au +2403:8280::/32 cn +2403:8300::/32 de +2403:8380::/32 cn 2403:8400::/32 in +2403:8480::/32 cn +2403:8500::/32 in +2403:8580::/32 cn 2403:8600::/32 in +2403:8680::/32 id +2403:8700::/32 bt +2403:8780::/32 in 2403:8800::/32 au +2403:8880::/32 cn +2403:8900::/32 cn +2403:8980::/32 cn 2403:8a00::/32 jp +2403:8a80::/32 cn +2403:8b00::/32 cn +2403:8b80::/32 cn 2403:8c00::/32 cn +2403:8c80::/32 cn +2403:8d00::/32 cn +2403:8d80::/32 cn 2403:8e00::/32 jp +2403:8e80::/32 mm +2403:8f00::/32 jp +2403:8f80::/32 cn 2403:9000::/32 au +2403:9080::/32 cn +2403:9100::/32 id +2403:9180::/32 cn 2403:9200::/32 jp +2403:9280::/32 cn +2403:9300::/32 bd +2403:9380::/32 cn 2403:9400::/32 jp +2403:9480::/32 cn +2403:9500::/32 id +2403:9580::/32 cn 2403:9600::/32 jp +2403:9680::/32 cn +2403:9700::/32 my +2403:9780::/32 cn 2403:9800::/32 nz -2403:9a00::/32 jp +2403:9880::/32 cn +2403:9900::/32 jp +2403:9a80::/32 cn +2403:9b00::/32 cn +2403:9b80::/32 cn 2403:9c00::/32 jp +2403:9c80::/32 cn +2403:9d00::/32 cn +2403:9d80::/32 cn 2403:9e00::/32 au +2403:9e80::/32 cn +2403:9f00::/32 tw +2403:9f80::/32 cn 2403:a000::/32 ph +2403:a080::/32 in +2403:a100::/32 cn +2403:a180::/32 sg 2403:a200::/32 cn +2403:a280::/32 hk +2403:a300::/32 cn +2403:a380::/32 sg 2403:a400::/32 au +2403:a480::/32 cn +2403:a500::/32 pk +2403:a580::/32 cn 2403:a600::/32 id +2403:a680::/32 cn +2403:a700::/32 jp +2403:a780::/32 cn 2403:a800::/32 au +2403:a880::/32 cn +2403:a900::/32 sg +2403:a980::/32 cn 2403:aa00::/32 id +2403:aa80::/32 cn +2403:ab80::/32 cn 2403:ac00::/32 cn +2403:ac80::/32 jp +2403:ad00::/32 in +2403:ad80::/32 hk 2403:ae00::/32 id +2403:ae80::/32 nr +2403:af00::/32 id +2403:af80::/32 cn 2403:b000::/32 au +2403:b080::/32 cn +2403:b100::/32 sg +2403:b180::/32 cn 2403:b200::/32 id +2403:b280::/32 cn +2403:b300::/32 au +2403:b380::/32 cn 2403:b400::/32 cn +2403:b480::/32 cn +2403:b500::/32 in +2403:b580::/32 cn 2403:b600::/32 id +2403:b680::/32 cn +2403:b700::/32 nz +2403:b780::/32 cn 2403:b800::/32 au +2403:b880::/32 cn +2403:b900::/32 id +2403:b980::/32 cn 2403:ba00::/32 id +2403:ba80::/32 au +2403:bb00::/32 id +2403:bb80::/32 hk 2403:bc00::/32 my +2403:bc80::/32 sg +2403:bd00::/32 in +2403:bd80::/32 jp 2403:be00::/32 id +2403:be80::/32 in +2403:bf00::/32 th +2403:bf80::/32 bd 2403:c000::/32 th +2403:c080::/32 cn +2403:c100::/32 cn +2403:c180::/32 cn 2403:c200::/32 nz +2403:c280::/32 mm +2403:c300::/32 tw +2403:c380::/32 in 2403:c400::/32 au +2403:c480::/32 cn +2403:c500::/32 sg +2403:c580::/32 my 2403:c600::/32 id +2403:c680::/32 in +2403:c780::/32 jp 2403:c800::/32 au +2403:c880::/32 hk +2403:c900::/32 nz +2403:c980::/32 cn 2403:ca00::/32 au +2403:ca80::/32 cn +2403:cb00::/32 sg +2403:cb80::/32 id 2403:cc00::/32 sg +2403:cc80::/32 bd +2403:cd00::/32 ph +2403:cd80::/32 ph 2403:ce00::/32 au +2403:ce80::/32 jp +2403:cf00::/32 au +2403:cf80::/32 cn 2403:d000::/32 jp +2403:d080::/32 cn +2403:d100::/32 au +2403:d180::/32 cn 2403:d200::/32 nz +2403:d280::/32 cn +2403:d300::/32 hk +2403:d380::/32 cn 2403:d400::/32 cn +2403:d480::/32 cn +2403:d500::/32 au +2403:d580::/32 cn 2403:d600::/32 au +2403:d680::/32 cn +2403:d700::/32 mn +2403:d780::/32 cn 2403:d800::/32 nz +2403:d880::/32 cn +2403:d900::/32 au +2403:d980::/32 cn 2403:da00::/32 id +2403:da80::/32 cn +2403:db00::/32 cn +2403:db80::/32 cn 2403:dc00::/32 au +2403:dc80::/32 cn +2403:dd00::/32 bd +2403:dd80::/32 cn 2403:de00::/32 nz +2403:de80::/32 cn +2403:df00::/32 sg +2403:df80::/32 cn 2403:e000::/32 au +2403:e080::/32 cn +2403:e100::/32 bd +2403:e180::/32 cn 2403:e200::/32 vn +2403:e280::/32 cn +2403:e300::/32 cn +2403:e380::/32 id 2403:e400::/32 hk +2403:e480::/32 cn +2403:e500::/32 cn +2403:e580::/32 cn 2403:e600::/32 id +2403:e680::/32 cn +2403:e700::/32 cn +2403:e780::/32 cn 2403:e800::/32 hk +2403:e880::/32 cn +2403:e900::/32 sg +2403:e980::/32 cn 2403:ea00::/32 hk +2403:ea80::/32 cn +2403:eb00::/32 bd +2403:eb80::/32 cn 2403:ec00::/32 bd +2403:ec80::/32 cn +2403:ed00::/32 cn +2403:ed80::/32 cn 2403:ee00::/32 tw +2403:ee80::/32 cn +2403:ef80::/32 cn 2403:f000::/32 au +2403:f080::/32 cn +2403:f100::/32 cn +2403:f180::/32 cn 2403:f200::/32 jp -2403:f400::/32 bd +2403:f280::/32 cn +2403:f300::/32 cn +2403:f380::/32 cn +2403:f480::/32 au +2403:f500::/32 hk +2403:f580::/32 cn 2403:f600::/32 nr +2403:f680::/32 in +2403:f700::/32 nz +2403:f780::/32 bd 2403:f800::/32 cn +2403:f880::/32 jp +2403:f900::/32 cn +2403:f980::/32 cn 2403:fa00::/32 hk +2403:fa80::/32 sg +2403:fb00::/32 cn +2403:fb80::/32 cn 2403:fc00::/32 au +2403:fc80::/32 id +2403:fd00::/32 au +2403:fd80::/32 id 2403:fe00::/32 in +2403:fe80::/32 cn +2403:ff00::/32 id +2403:ff80::/32 cn 2404::/26 tw 2404:80::/32 tw 2404:a0::/32 nz @@ -2991,10 +6324,10 @@ 2404:d0::/32 ph 2404:d8::/32 ph 2404:e0::/32 au +2404:100::/32 cn 2404:130::/32 nz 2404:138::/32 nz 2404:140::/32 th -2404:148::/32 pk 2404:150::/32 bd 2404:158::/32 cn 2404:160::/32 my @@ -3007,532 +6340,1118 @@ 2404:1b0::/32 id 2404:1b8::/32 id 2404:200::/32 jp +2404:280::/32 cn +2404:300::/32 kh +2404:380::/32 gu 2404:400::/32 id +2404:480::/32 cn +2404:500::/32 id +2404:580::/32 in 2404:600::/32 id +2404:680::/32 cn +2404:700::/32 kh +2404:780::/32 au 2404:800::/32 kr +2404:880::/32 id +2404:980::/32 bd 2404:a00::/32 jp +2404:a80::/32 cn +2404:b00::/32 bd +2404:b80::/32 cn 2404:c00::/32 in +2404:c80::/32 au +2404:d00::/32 bd +2404:d80::/32 cn 2404:e00::/32 sg +2404:e80::/32 au +2404:f00::/32 cn +2404:f80::/32 cn 2404:1000::/32 jp +2404:1080::/32 cn +2404:1100::/32 sg +2404:1180::/32 cn 2404:1200::/32 sg +2404:1280::/32 hk +2404:1300::/32 jp +2404:1380::/32 bd 2404:1400::/32 id +2404:1480::/32 in +2404:1500::/32 in +2404:1580::/32 in 2404:1600::/32 au +2404:1680::/32 th +2404:1700::/32 jp +2404:1780::/32 mm 2404:1800::/32 nz +2404:1880::/32 cn +2404:1900::/32 jp +2404:1980::/32 jp 2404:1a00::/32 th +2404:1a80::/32 nz +2404:1b00::/32 jp +2404:1b80::/32 in 2404:1c00::/32 nz +2404:1c80::/32 cn +2404:1d00::/32 au +2404:1d80::/32 cn 2404:1e00::/32 nz +2404:1e80::/32 cn +2404:1f00::/32 in +2404:1f80::/32 au 2404:2000::/32 nz +2404:2080::/32 au +2404:2100::/32 hk +2404:2180::/32 sg 2404:2200::/32 nc +2404:2280::/32 sg +2404:2300::/32 kr +2404:2380::/32 ph 2404:2400::/32 au +2404:2480::/32 hk +2404:2580::/32 th 2404:2600::/32 th +2404:2680::/32 jp +2404:2700::/32 mn +2404:2780::/32 au 2404:2800::/32 au +2404:2880::/32 kr +2404:2900::/32 au +2404:2980::/32 bd 2404:2a00::/32 nc +2404:2a80::/32 hk +2404:2b00::/32 au +2404:2b80::/32 bd 2404:2c00::/32 np +2404:2c80::/32 id +2404:2d00::/32 jp +2404:2d80::/32 bd 2404:2e00::/32 la +2404:2e80::/32 np +2404:2f00::/32 nz +2404:2f80::/32 id +2404:3080::/32 bd +2404:3100::/32 pk +2404:3180::/32 bd 2404:3200::/32 jp -2404:3400::/32 nz +2404:3280::/32 th +2404:3300::/32 cn +2404:3380::/32 ph +2404:3480::/32 cn +2404:3500::/32 hk +2404:3580::/32 id 2404:3600::/32 nz +2404:3680::/32 id +2404:3700::/32 cn +2404:3780::/32 np 2404:3800::/32 nz +2404:3880::/32 hk +2404:3900::/32 id +2404:3980::/32 nz 2404:3a00::/32 vn +2404:3a80::/32 th +2404:3b00::/32 cn +2404:3b80::/32 hk 2404:3c00::/32 ph +2404:3c80::/32 pk +2404:3d00::/32 au +2404:3d80::/32 nz 2404:3e00::/32 id +2404:3e80::/32 id +2404:3f00::/32 in +2404:3f80::/32 bd +2404:4080::/32 cn +2404:4100::/32 in +2404:4180::/32 nz 2404:4200::/32 id +2404:4280::/32 hk +2404:4300::/32 my +2404:4380::/32 au 2404:4400::/32 nz +2404:4480::/32 in +2404:4580::/32 bd 2404:4600::/32 kr +2404:4680::/32 bd +2404:4700::/32 in +2404:4780::/32 id 2404:4800::/32 sg +2404:4880::/32 nz +2404:4900::/32 nz +2404:4980::/32 in 2404:4a00::/32 th +2404:4a80::/32 in +2404:4b80::/32 bd 2404:4c00::/32 au +2404:4c80::/32 in +2404:4d00::/32 cn +2404:4d80::/32 au 2404:4e00::/32 sg +2404:4e80::/32 cn +2404:4f00::/32 au +2404:4f80::/32 bd 2404:5000::/32 au +2404:5080::/32 au +2404:5100::/32 jp +2404:5180::/32 au 2404:5200::/32 jp +2404:5280::/32 bd +2404:5300::/32 au +2404:5380::/32 my 2404:5400::/32 au +2404:5480::/32 jp +2404:5500::/32 au +2404:5580::/32 sg 2404:5600::/32 id +2404:5680::/32 sg +2404:5700::/32 nz +2404:5780::/32 in 2404:5800::/32 sg +2404:5880::/32 au +2404:5900::/32 th +2404:5980::/32 id 2404:5a00::/32 id +2404:5a80::/32 cn +2404:5b00::/32 cn +2404:5b80::/32 nz 2404:5c00::/32 au +2404:5c80::/32 in +2404:5d00::/32 cn +2404:5d80::/32 jp 2404:5e00::/32 au +2404:5e80::/32 cn +2404:5f00::/32 au +2404:5f80::/32 ph 2404:6000::/32 cn +2404:6080::/32 au +2404:6100::/32 cn +2404:6180::/32 bd 2404:6200::/32 tw +2404:6280::/32 bd +2404:6300::/32 my +2404:6380::/32 cn 2404:6400::/32 pg +2404:6480::/32 bd +2404:6500::/32 cn +2404:6580::/32 bd 2404:6600::/32 nz +2404:6680::/32 pk +2404:6700::/32 cn +2404:6780::/32 in 2404:6800::/32 au +2404:6900::/32 hk 2404:6a00::/32 nz +2404:6b00::/32 in 2404:6c00::/32 nz +2404:6d00::/32 id 2404:6e00::/32 ph +2404:6f00::/32 my 2404:7000::/32 pk +2404:7100::/32 cn 2404:7200::/32 jp +2404:7300::/32 in 2404:7400::/32 ph +2404:7500::/32 bd 2404:7600::/32 cn +2404:7700::/32 in 2404:7800::/32 pw +2404:7900::/32 jp 2404:7a00::/32 jp +2404:7b00::/32 in 2404:7c00::/32 np +2404:7d00::/32 cn 2404:7e00::/32 bd +2404:7f00::/32 au 2404:8000::/32 id +2404:8100::/32 my 2404:8200::/32 jp +2404:8300::/32 pk +2404:8500::/32 in 2404:8600::/32 au +2404:8700::/32 cn 2404:8800::/32 th +2404:8900::/32 au 2404:8a00::/32 lk +2404:8b00::/32 cn 2404:8c00::/32 gu +2404:8d00::/32 th 2404:8e00::/32 jp +2404:8f00::/32 au 2404:9000::/32 jp +2404:9100::/32 in 2404:9200::/32 jp 2404:9400::/32 au +2404:9500::/32 hk 2404:9600::/32 au +2404:9700::/32 au 2404:9800::/32 ph +2404:9900::/32 bd 2404:9a00::/32 gu +2404:9b00::/32 af 2404:9c00::/32 au +2404:9d00::/32 in 2404:9e00::/32 id +2404:9f00::/32 nz 2404:a000::/32 cn +2404:a100::/32 sg 2404:a200::/32 in -2404:a400::/32 my +2404:a300::/32 th +2404:a500::/32 in 2404:a600::/32 jp +2404:a700::/32 in 2404:a800::/32 in 2404:aa00::/32 sg +2404:ab00::/32 nz 2404:ac00::/32 in +2404:ad00::/32 nz 2404:ae00::/32 hk +2404:af00::/32 hk 2404:b000::/32 au +2404:b100::/32 cn 2404:b200::/32 in -2404:b400::/32 au +2404:b300::/32 kh +2404:b500::/32 au 2404:b600::/32 jp +2404:b700::/32 nz 2404:b800::/32 au +2404:b900::/32 cn 2404:ba00::/32 in +2404:bb00::/32 sg 2404:bc00::/32 au +2404:bd00::/32 in 2404:be00::/32 my +2404:bf00::/32 nz 2404:c000::/32 id +2404:c100::/32 au 2404:c200::/32 la +2404:c300::/32 cn 2404:c400::/32 au +2404:c500::/32 hk 2404:c600::/32 au +2404:c700::/32 jp 2404:c800::/32 hk +2404:c900::/32 bd 2404:ca00::/32 jp +2404:cb00::/32 jp 2404:cc00::/32 kh +2404:cd00::/32 cn 2404:ce00::/32 jp +2404:cf00::/32 id 2404:d000::/32 nz +2404:d100::/32 au 2404:d200::/32 au +2404:d300::/32 au 2404:d400::/32 pk +2404:d500::/32 au 2404:d600::/32 au +2404:d700::/32 au 2404:d800::/32 ph +2404:d900::/32 bd 2404:da00::/32 au +2404:db00::/32 tw 2404:dc00::/32 ph +2404:dd00::/32 au 2404:de00::/32 au +2404:df00::/32 cn 2404:e000::/32 jp +2404:e100::/32 id 2404:e200::/32 nz +2404:e300::/32 id 2404:e400::/32 nc +2404:e500::/32 id 2404:e600::/32 sg +2404:e700::/32 id 2404:e800::/32 sg +2404:e900::/32 id 2404:ea00::/32 au +2404:eb00::/32 id 2404:ec00::/32 jp +2404:ed00::/32 au 2404:ee00::/32 hk +2404:ef00::/32 id 2404:f000::/32 lk +2404:f100::/32 in 2404:f200::/32 au +2404:f300::/32 id 2404:f400::/32 pk +2404:f500::/32 id 2404:f600::/32 id +2404:f700::/32 id 2404:f800::/32 jp +2404:f801::/32 sg +2404:f900::/32 id 2404:fa00::/32 au +2404:fb00::/32 id 2404:fc00::/32 hk +2404:fd00::/32 id 2404:fe00::/32 au +2404:ff00::/32 id 2405::/32 jp +2405:100::/32 id 2405:200::/32 in 2405:400::/32 mh +2405:500::/32 id 2405:600::/32 mn +2405:700::/32 id 2405:800::/32 au 2405:a00::/32 tw +2405:b00::/32 kh 2405:c00::/32 pk +2405:d00::/32 hk 2405:e00::/32 jp 2405:1000::/32 au 2405:1200::/32 jp +2405:1300::/32 au 2405:1400::/32 hk +2405:1500::/32 bd 2405:1600::/32 au +2405:1700::/32 bn 2405:1800::/32 jp 2405:1a00::/32 kh +2405:1b00::/32 np 2405:1c00::/32 hk +2405:1d00::/32 bd 2405:1e00::/32 in +2405:1f00::/32 tl 2405:2000::/32 in 2405:2200::/32 nz +2405:2300::/32 sg 2405:2400::/32 in +2405:2500::/32 th 2405:2600::/32 nz -2405:2800::/32 jp +2405:2700::/32 jp +2405:2900::/32 my 2405:2a00::/32 jp +2405:2b00::/32 au 2405:2c00::/32 au +2405:2d00::/32 au 2405:2e00::/32 au +2405:2f00::/32 bd 2405:3000::/32 hk +2405:3100::/32 sg 2405:3200::/32 ph +2405:3300::/32 tw 2405:3400::/32 ph +2405:3500::/32 kr 2405:3600::/32 jp +2405:3700::/32 jp 2405:3800::/32 my +2405:3900::/32 kh 2405:3a00::/32 nz +2405:3b00::/32 cn 2405:3c00::/32 au +2405:3d00::/32 kr 2405:3e00::/32 hk +2405:3f00::/32 au 2405:4000::/32 th +2405:4100::/32 id 2405:4200::/32 sg +2405:4300::/32 kr 2405:4400::/32 lk +2405:4500::/32 tw 2405:4600::/32 au +2405:4700::/32 my 2405:4800::/32 vn +2405:4900::/32 sg 2405:4a00::/32 au +2405:4b00::/32 au 2405:4c00::/32 ph +2405:4d00::/32 tw 2405:4e00::/32 jp +2405:4f00::/32 my 2405:5000::/32 au +2405:5100::/32 id 2405:5200::/32 au +2405:5300::/32 jp 2405:5400::/32 lk +2405:5500::/32 sg 2405:5600::/32 tw +2405:5700::/32 mn 2405:5800::/32 kr +2405:5900::/32 au 2405:5a00::/32 jp +2405:5b00::/32 cn 2405:5c00::/32 hk +2405:5d00::/32 hk 2405:5e00::/32 hk +2405:5f00::/32 kr 2405:6000::/32 nz +2405:6100::/32 tw 2405:6200::/32 cn 2405:6400::/32 my +2405:6500::/32 au 2405:6600::/32 np 2405:6800::/32 in +2405:6900::/32 bd 2405:6a00::/32 au +2405:6b00::/32 lk 2405:6c00::/32 in +2405:6d00::/32 th 2405:6e00::/32 au +2405:6f00::/32 cn 2405:7000::/32 jp +2405:7100::/32 au 2405:7200::/32 bd 2405:7400::/32 gu +2405:7500::/32 au 2405:7600::/32 bd +2405:7700::/32 my 2405:7800::/32 jp -2405:7a00::/32 bd +2405:7900::/32 nz +2405:7b00::/32 kr 2405:7c00::/32 my +2405:7d00::/32 jp 2405:7e00::/32 tw +2405:7f00::/32 au 2405:8000::/32 jp +2405:8100::/32 us 2405:8200::/32 bd +2405:8300::/32 sb 2405:8400::/32 nz +2405:8500::/32 jp 2405:8600::/32 kr +2405:8700::/32 tw 2405:8800::/32 au +2405:8900::/32 au 2405:8a00::/32 in +2405:8b00::/32 au 2405:8c00::/32 ws +2405:8d00::/32 gu 2405:8e00::/32 id +2405:8f00::/32 id 2405:9000::/32 au +2405:9100::/32 bd 2405:9200::/32 tw +2405:9300::/32 cn 2405:9400::/32 nz -2405:9600::/32 in +2405:9500::/32 kr +2405:9600::/32 sg +2405:9700::/32 cn 2405:9800::/32 th +2405:9900::/32 cn 2405:9a00::/32 au +2405:9b00::/32 cn 2405:9c00::/32 nz +2405:9d00::/32 in 2405:9e00::/32 cn +2405:9f00::/32 nz 2405:a000::/32 th +2405:a100::/32 in 2405:a200::/32 jp +2405:a300::/32 in 2405:a400::/32 nz -2405:a600::/32 au +2405:a500::/32 cn +2405:a700::/32 in +2405:a900::/32 cn 2405:aa00::/32 kh +2405:ab00::/32 cn 2405:ac00::/32 nz +2405:ad00::/32 cn 2405:ae00::/32 mn +2405:af00::/32 cn 2405:b000::/32 au +2405:b100::/32 cn 2405:b200::/32 hk +2405:b300::/32 cn 2405:b400::/32 nz +2405:b500::/32 us 2405:b600::/32 au 2405:b800::/32 ph +2405:b900::/32 id 2405:ba00::/32 in +2405:bb00::/32 cn 2405:bc00::/32 au +2405:bd00::/32 cn 2405:be00::/32 jp +2405:bf00::/32 cn 2405:c000::/32 kr +2405:c100::/32 jp 2405:c200::/32 nz +2405:c300::/32 hk 2405:c400::/32 au +2405:c500::/32 cn 2405:c600::/32 tw +2405:c700::/32 jp 2405:c800::/32 au +2405:c900::/32 au 2405:ca00::/32 nz +2405:cb00::/32 vn 2405:cc00::/32 pf +2405:cd00::/32 vn 2405:ce00::/32 au +2405:cf00::/32 au 2405:d000::/32 bt +2405:d100::/32 au 2405:d200::/32 jp +2405:d300::/32 au 2405:d400::/32 ph 2405:d600::/32 au +2405:d700::/32 cn 2405:d800::/32 sg +2405:d900::/32 cn 2405:da00::/32 kh +2405:db00::/32 au 2405:dc00::/32 au -2405:de00::/32 au 2405:e000::/32 cn +2405:e100::/32 in 2405:e200::/32 in +2405:e300::/32 hk 2405:e400::/32 au +2405:e500::/32 hk 2405:e600::/32 cn +2405:e700::/32 in 2405:e800::/32 jp 2405:ea00::/32 au 2405:ec00::/32 bt +2405:ed00::/32 jp 2405:ee00::/32 au +2405:ef00::/32 hk 2405:f000::/32 jp +2405:f100::/32 sg 2405:f200::/32 bd +2405:f300::/32 in 2405:f400::/32 ph +2405:f500::/32 kh 2405:f600::/32 in +2405:f700::/32 in 2405:f800::/32 jp +2405:f900::/32 nz 2405:fa00::/32 kh +2405:fb00::/32 sg 2405:fc00::/32 sg 2405:fe00::/32 ph +2405:ff00::/32 in 2406::/32 hk +2406:100::/32 sg 2406:200::/32 au +2406:300::/32 tw 2406:400::/32 th +2406:500::/32 jp 2406:600::/32 jp +2406:700::/32 jp 2406:800::/32 jp +2406:900::/32 au 2406:a00::/32 jp +2406:b00::/32 bd 2406:c00::/32 lk +2406:d00::/32 pk 2406:e00::/32 in +2406:f00::/32 in 2406:1000::/32 jp +2406:1100::/32 cn 2406:1200::/32 nz +2406:1300::/32 pk 2406:1400::/32 bd +2406:1500::/32 to 2406:1600::/32 au +2406:1700::/32 nz +2406:1900::/32 bd 2406:1a00::/32 nz +2406:1b00::/32 id 2406:1c00::/32 au +2406:1d00::/32 nz 2406:1e00::/32 nz +2406:1f00::/32 au 2406:2000::/32 tw +2406:2100::/32 in 2406:2200::/32 au +2406:2300::/32 nz 2406:2400::/32 id +2406:2500::/32 bd 2406:2600::/32 jp +2406:2700::/32 cn 2406:2800::/32 jp +2406:2900::/32 jp 2406:2a00::/32 ph +2406:2b00::/32 nz 2406:2c00::/32 id +2406:2d00::/32 in 2406:2e00::/32 in +2406:2f00::/32 in 2406:3000::/32 sg +2406:3100::/32 th 2406:3200::/32 ph +2406:3300::/32 cn 2406:3400::/32 au 2406:3600::/32 au +2406:3700::/32 cn 2406:3800::/32 au 2406:3a00::/32 au +2406:3b00::/32 au 2406:3c00::/32 au +2406:3d00::/32 nz 2406:3e00::/32 nz +2406:3f00::/32 in 2406:4000::/32 kr +2406:4100::/32 au 2406:4200::/32 au +2406:4300::/32 hk 2406:4400::/32 ph +2406:4500::/32 cn 2406:4600::/32 au +2406:4700::/32 sg 2406:4800::/32 sg +2406:4900::/32 my 2406:4a00::/32 au +2406:4b00::/32 bd 2406:4c00::/32 au +2406:4d00::/32 cn 2406:4e00::/32 nz +2406:4f00::/32 cn 2406:5000::/32 au +2406:5100::/32 au 2406:5200::/32 jp +2406:5300::/32 sg 2406:5400::/32 id +2406:5500::/32 in 2406:5600::/32 in +2406:5700::/32 af 2406:5800::/32 au +2406:5900::/32 kr 2406:5a00::/32 nz +2406:5b00::/32 my 2406:5c00::/32 id +2406:5d00::/32 au 2406:5e00::/32 au +2406:5f00::/32 au 2406:6000::/32 my +2406:6100::/32 cn 2406:6200::/32 id +2406:6300::/32 cn 2406:6400::/32 au +2406:6500::/32 cn 2406:6600::/32 kr +2406:6700::/32 au 2406:6800::/32 kr +2406:6900::/32 au 2406:6a00::/32 kr +2406:6b00::/32 id 2406:6c00::/32 au +2406:6d00::/32 au 2406:6e00::/32 au 2406:7000::/32 pk -2406:7200::/32 hk +2406:7100::/32 nz +2406:7300::/32 au 2406:7400::/32 in +2406:7500::/32 au 2406:7600::/32 au +2406:7700::/32 my 2406:7800::/32 bn +2406:7900::/32 th 2406:7a00::/32 id 2406:7c00::/32 au +2406:7d00::/32 cn 2406:7e00::/32 id +2406:7f00::/32 id 2406:8000::/32 jp +2406:8100::/32 hk 2406:8200::/32 nz 2406:8400::/32 pk +2406:8500::/32 cn 2406:8600::/32 in +2406:8700::/32 au 2406:8800::/32 in +2406:8900::/32 au 2406:8a00::/32 au +2406:8b00::/32 my 2406:8c00::/32 jp +2406:8d00::/32 au 2406:8e00::/32 jp +2406:8f00::/32 id 2406:9000::/32 vn +2406:9100::/32 hk 2406:9200::/32 cn +2406:9300::/32 id 2406:9400::/32 hk 2406:9600::/32 id -2406:9800::/32 au +2406:9700::/32 au +2406:9900::/32 jp 2406:9a00::/32 nz +2406:9b00::/32 bd 2406:9c00::/32 hk +2406:9d00::/32 au 2406:9e00::/32 in +2406:9f00::/32 au 2406:a000::/32 au +2406:a100::/32 af 2406:a200::/32 au +2406:a300::/32 id 2406:a400::/32 sg +2406:a500::/32 id 2406:a600::/32 au +2406:a700::/32 au 2406:a800::/32 au +2406:a900::/32 nz 2406:aa00::/32 au +2406:ab00::/32 in 2406:ac00::/32 pk +2406:ad00::/32 kr 2406:ae00::/32 au +2406:af00::/32 nz 2406:b000::/32 kr +2406:b100::/32 kh 2406:b200::/32 id +2406:b300::/32 au 2406:b400::/32 in +2406:b500::/32 in 2406:b600::/32 in +2406:b700::/32 np 2406:b800::/32 jp +2406:b900::/32 id 2406:ba00::/32 au +2406:bb00::/32 jp 2406:bc00::/32 au +2406:bd00::/32 au 2406:be00::/32 au +2406:bf00::/32 au 2406:c000::/32 au +2406:c100::/32 nz 2406:c200::/32 au +2406:c300::/32 sg 2406:c400::/32 au +2406:c500::/32 au 2406:c600::/32 au +2406:c700::/32 jp 2406:c800::/32 au +2406:c900::/32 cn 2406:ca00::/32 au +2406:cb00::/32 au 2406:cc00::/32 sg +2406:cd00::/32 ki 2406:ce00::/32 jp +2406:cf00::/32 cn 2406:d000::/32 kr +2406:d100::/32 af 2406:d200::/32 jp +2406:d300::/32 au 2406:d400::/32 tw +2406:d500::/32 au 2406:d600::/32 in +2406:d700::/32 kr 2406:d800::/32 in 2406:da00::/32 ap +2406:da01::/32 jp +2406:db00::/32 in 2406:dc00::/32 cn +2406:dd00::/32 cn 2406:de00::/32 in +2406:df00::/32 bd 2406:e000::/32 nz +2406:e100::/32 ph 2406:e200::/32 hk +2406:e300::/32 hk 2406:e400::/32 mv +2406:e500::/32 cn 2406:e600::/32 au +2406:e700::/32 jp 2406:e800::/32 jp +2406:e900::/32 id 2406:ea00::/32 mm +2406:eb00::/32 id 2406:ec00::/32 jp +2406:ed00::/32 nz 2406:ee00::/32 in +2406:ef00::/32 au 2406:f000::/32 sg +2406:f100::/32 bd 2406:f200::/32 jp +2406:f300::/32 cn 2406:f400::/32 sg +2406:f500::/32 pk 2406:f600::/32 nz +2406:f700::/32 hk 2406:f800::/32 fj +2406:f900::/32 sg 2406:fa00::/32 au +2406:fb00::/32 hk 2406:fc00::/32 sg +2406:fd00::/32 nz 2406:fe00::/32 jp +2406:ff00::/32 cn 2407::/32 id +2407:100::/32 vn 2407:200::/32 au +2407:300::/32 au 2407:400::/32 au +2407:500::/32 au 2407:600::/32 au +2407:700::/32 au 2407:800::/32 fj +2407:900::/32 hk 2407:a00::/32 au +2407:b00::/32 kr 2407:c00::/32 lk +2407:d00::/32 nz 2407:e00::/32 au +2407:f00::/32 id 2407:1000::/32 nz +2407:1100::/32 my 2407:1200::/32 jp +2407:1300::/32 my 2407:1400::/32 np +2407:1500::/32 bd 2407:1600::/32 hk +2407:1700::/32 au 2407:1800::/32 pg -2407:1a00::/32 au +2407:1900::/32 cn +2407:1b00::/32 pk 2407:1c00::/32 sg +2407:1d00::/32 cn 2407:1e00::/32 au 2407:2000::/32 kr +2407:2100::/32 hk 2407:2200::/32 au 2407:2400::/32 nz +2407:2500::/32 au 2407:2600::/32 au 2407:2800::/32 ws +2407:2900::/32 in 2407:2a00::/32 in -2407:2c00::/32 th +2407:2b00::/32 nz +2407:2d00::/32 sg 2407:2e00::/32 au +2407:2f00::/32 sg 2407:3000::/32 jp +2407:3100::/32 hk +2407:3300::/32 jp 2407:3400::/32 in +2407:3500::/32 kr 2407:3600::/32 au +2407:3700::/32 cn 2407:3800::/32 sb +2407:3900::/32 cn 2407:3a00::/32 au +2407:3b00::/32 pg 2407:3c00::/32 in +2407:3d00::/32 tw 2407:3e00::/32 sg +2407:3f00::/32 bd 2407:4000::/32 my +2407:4100::/32 sg 2407:4200::/32 au +2407:4300::/32 my 2407:4400::/32 nz +2407:4500::/32 pk 2407:4600::/32 id +2407:4700::/32 tw 2407:4800::/32 fm +2407:4900::/32 tw 2407:4a00::/32 nc +2407:4b00::/32 tw 2407:4c00::/32 au +2407:4d00::/32 tw 2407:4e00::/32 id +2407:4f00::/32 cn 2407:5000::/32 bd +2407:5100::/32 jp 2407:5200::/32 np +2407:5300::/32 jp 2407:5400::/32 au +2407:5500::/32 cn 2407:5600::/32 au +2407:5700::/32 au 2407:5800::/32 ck +2407:5900::/32 au 2407:5a00::/32 ph +2407:5b00::/32 nz 2407:5c00::/32 in +2407:5d00::/32 my 2407:5e00::/32 kh +2407:5f00::/32 my 2407:6000::/32 my +2407:6100::/32 mm 2407:6200::/32 np +2407:6300::/32 sg 2407:6400::/32 mn +2407:6500::/32 kr 2407:6600::/32 th +2407:6700::/32 kr 2407:6800::/32 au +2407:6900::/32 au 2407:6a00::/32 au +2407:6b00::/32 au 2407:6c00::/32 my +2407:6d00::/32 bd 2407:6e00::/32 au +2407:6f00::/32 bd 2407:7000::/32 nz +2407:7100::/32 tw 2407:7200::/32 hk +2407:7300::/32 au 2407:7400::/32 in +2407:7500::/32 au 2407:7600::/32 id +2407:7700::/32 my 2407:7800::/32 au +2407:7900::/32 th 2407:7a00::/32 th +2407:7b00::/32 hk 2407:7c00::/32 sg -2407:7e00::/32 hk +2407:7d00::/32 cn +2407:7f00::/32 nz 2407:8000::/32 hk +2407:8100::/32 sg 2407:8200::/32 id +2407:8300::/32 nz 2407:8400::/32 au +2407:8500::/32 sg 2407:8600::/32 au +2407:8700::/32 in 2407:8800::/32 au +2407:8900::/32 au 2407:8a00::/32 jp +2407:8b00::/32 nz 2407:8c00::/32 in 2407:8e00::/32 au +2407:8f00::/32 jp 2407:9000::/32 au -2407:9200::/32 pg +2407:9100::/32 kr +2407:9300::/32 in 2407:9400::/32 my -2407:9600::/32 my +2407:9500::/32 np 2407:9800::/32 ph +2407:9900::/32 jp 2407:9a00::/32 in 2407:9c00::/32 pk +2407:9d00::/32 nz 2407:9e00::/32 pk +2407:9f00::/32 cn 2407:a000::/32 fj +2407:a100::/32 au 2407:a200::/32 au +2407:a300::/32 in +2407:a500::/32 th 2407:a600::/32 id +2407:a700::/32 hk 2407:a800::/32 jp -2407:aa00::/32 au +2407:ab00::/32 au 2407:ac00::/32 sg +2407:ad00::/32 id 2407:ae00::/32 au -2407:b000::/32 sg +2407:af00::/32 au +2407:b000::/32 jp +2407:b100::/32 bd 2407:b200::/32 kr +2407:b300::/32 hk 2407:b400::/32 hk +2407:b500::/32 au 2407:b600::/32 au +2407:b700::/32 hk 2407:b800::/32 kr +2407:b900::/32 in 2407:ba00::/32 cn +2407:bb00::/32 in 2407:bc00::/32 cn +2407:bd00::/32 hk 2407:be00::/32 au +2407:bf00::/32 id 2407:c000::/32 kr +2407:c100::/32 nz 2407:c200::/32 id +2407:c300::/32 nz 2407:c400::/32 cn +2407:c500::/32 au 2407:c600::/32 my +2407:c700::/32 kr 2407:c800::/32 jp +2407:c900::/32 cn 2407:ca00::/32 nz +2407:cb00::/32 in 2407:cc00::/32 jp +2407:cd00::/32 hk 2407:ce00::/32 au +2407:cf00::/32 cn 2407:d000::/32 pk +2407:d100::/32 kr 2407:d200::/32 sg +2407:d300::/32 au 2407:d400::/32 np +2407:d500::/32 nz 2407:d600::/32 jp +2407:d700::/32 bd 2407:d800::/32 jp +2407:d900::/32 au 2407:da00::/32 in +2407:db00::/32 hk 2407:dc00::/32 au +2407:dd00::/32 au 2407:de00::/32 my +2407:df00::/32 id 2407:e000::/32 sg +2407:e100::/32 hk 2407:e200::/32 my +2407:e300::/32 hk 2407:e400::/32 au +2407:e500::/32 in 2407:e600::/32 jp +2407:e700::/32 au 2407:e800::/32 cn +2407:e900::/32 in 2407:ea00::/32 hk +2407:eb00::/32 sg 2407:ec00::/32 au +2407:ed00::/32 th 2407:ee00::/32 au +2407:ef00::/32 sg 2407:f000::/32 au +2407:f100::/32 nz 2407:f200::/32 id +2407:f300::/32 mm 2407:f400::/32 au 2407:f600::/32 jp +2407:f700::/32 in 2407:f800::/32 my +2407:f900::/32 id 2407:fa00::/32 hk -2407:fc00::/32 hk +2407:fd00::/32 au 2407:fe00::/32 au +2407:ff00::/32 in 2408::/22 jp +2408:4000::/32 cn 2408:8000::/32 cn -2409::/22 jp +2409:10::/32 jp +2409:250::/32 jp 2409:8000::/32 cn 240a::/25 jp -240b::/22 jp +240a:8000::/32 cn +240b::/26 jp +240b:240::/32 jp +240b:8000::/32 cn 240c::/28 cn +240c:8000::/32 cn 240d::/27 jp -240e::/24 cn +240d:8000::/32 cn +240e::/20 cn 240f::/24 jp +240f:8000::/32 cn 2600::/29 us 2600:100::/32 us 2600:200::/32 us 2600:300::/32 us 2600:800::/32 us 2600:900::/32 us +2600:a00::/32 us +2600:b00::/32 us 2600:c00::/32 us -2600:1000::/32 us +2600:d00::/32 ca +2600:f00::/32 us +2600:1100::/32 us +2600:1200::/32 us 2600:1400::/32 us +2600:1600::/32 ca +2600:1700::/32 us 2600:1800::/32 us -2600:1c00::/32 us -2600:2000::/32 us +2600:1900::/32 us +2600:1a00::/32 gd +2600:1b00::/32 jm +2600:1d00::/32 us +2600:1e00::/32 vc +2600:1f00::/32 us +2600:2100::/32 us +2600:2200::/32 us +2600:2300::/32 us 2600:2400::/32 us +2600:2500::/32 us +2600:2600::/32 us +2600:2700::/32 us 2600:2800::/32 us 2600:2c00::/32 us 2600:3000::/32 us @@ -3550,840 +7469,1932 @@ 2600:6000::/32 us 2600:6400::/32 us 2600:6800::/32 us +2600:6c00::/32 us 2600:7000::/32 us -2601::/28 us +2600:7400::/32 us +2600:7800::/32 us +2600:7c00::/32 vc +2600:8000::/32 us +2600:8400::/32 bb +2600:8800::/32 us +2600:8c00::/32 us +2600:9000::/32 us +2600:a000::/32 us +2600:a400::/32 us +2600:e000::/32 ca +2601::/20 us 2602::/28 us 2602:200::/32 ca 2602:210::/32 ca 2602:220::/32 ca +2602:230::/32 us +2602:240::/32 us 2602:300::/32 us +2602:ff55::/36 us +2602:ff56::/36 pr +2602:ff57::/36 us +2602:ff58::/36 us +2602:ff59::/36 us +2602:ff5a::/36 us +2602:ff5b::/36 us +2602:ff5c::/36 us +2602:ff5d::/36 us +2602:ff5e::/36 us +2602:ff5f::/36 us +2602:ff60::/36 us +2602:ff61::/36 us +2602:ff62::/36 us +2602:ff63::/36 us +2602:ff64::/36 us +2602:ff65::/36 us +2602:ff66::/36 ca +2602:ff67::/36 us +2602:ff68::/36 us +2602:ff69::/36 us +2602:ff6a::/36 us +2602:ff6b::/36 us +2602:ff6c::/36 ca +2602:ff6d::/36 ca +2602:ff6e::/36 ca +2602:ff6f::/36 us +2602:ff70::/36 ca +2602:ff71::/36 us +2602:ff72::/36 us +2602:ff73::/36 ca +2602:ff74::/36 ca +2602:ff75::/36 us +2602:ff76::/36 ca +2602:ff77::/36 us +2602:ff79::/36 us +2602:ff7a::/36 us +2602:ff7c::/36 us +2602:ff7d::/36 us +2602:ff7e::/36 us +2602:ff7f::/36 us +2602:ff80::/36 us +2602:ff81::/36 us +2602:ff82::/36 us +2602:ff83::/36 us +2602:ff84::/36 us +2602:ff85::/36 us +2602:ff86::/36 us +2602:ff87::/36 us +2602:ff88::/36 us +2602:ff89::/36 us +2602:ff8a::/36 us +2602:ff8b::/36 us +2602:ff8c::/36 us +2602:ff8d::/36 us +2602:ff8e::/36 us +2602:ff8f::/36 us +2602:ff90::/36 us +2602:ff91::/36 us +2602:ff92::/36 us +2602:ff93::/36 ca +2602:ff94::/36 us +2602:ff95::/36 us +2602:ff96::/36 us +2602:ff97::/36 us +2602:ff98::/36 ca +2602:ff99::/36 us +2602:ff9a::/36 us +2602:ff9b::/36 us +2602:ff9c::/36 ca +2602:ff9d::/36 ca +2602:ff9e::/36 ca +2602:ff9f::/36 ca +2602:ffa0::/36 vg +2602:ffa1::/36 us +2602:ffa2::/36 us +2602:ffa3::/36 us +2602:ffa4::/36 us +2602:ffa5::/36 us +2602:ffa6::/36 us +2602:ffa7::/36 us +2602:ffa8::/36 us +2602:ffa9::/36 us +2602:ffaa::/36 us +2602:ffab::/36 us +2602:ffac::/36 us +2602:ffad::/36 us +2602:ffae::/36 us +2602:ffaf::/36 us +2602:ffb0::/32 us +2602:ffb1::/36 ca +2602:ffb2::/36 us +2602:ffb3::/36 us +2602:ffb4::/36 us +2602:ffb5::/36 us +2602:ffb6::/36 ca +2602:ffb7::/36 us +2602:ffb8::/36 us +2602:ffb9::/36 us +2602:ffba::/36 us +2602:ffbb::/36 us +2602:ffbc::/36 us +2602:ffbd::/36 us +2602:ffbe::/36 ca +2602:ffbf::/36 us +2602:ffc0::/36 us +2602:ffc1::/36 ca +2602:ffc2::/36 us +2602:ffc3::/36 us +2602:ffc4::/36 us +2602:ffc5::/36 us +2602:ffc6::/36 us +2602:ffc7::/36 us +2602:ffc8::/36 us +2602:ffca::/36 us +2602:ffcb::/36 us +2602:ffcc::/36 us +2602:ffcd::/36 ca +2602:ffce::/36 ca +2602:ffcf::/36 us +2602:ffd0::/36 us +2602:ffd1::/36 us +2602:ffd3::/36 us +2602:ffd4::/36 us +2602:ffd5::/36 ca +2602:ffd6::/36 us +2602:ffd7::/36 us +2602:ffd8::/36 us +2602:ffd9::/36 us +2602:ffda::/36 us +2602:ffdb::/36 us +2602:ffdc::/36 us +2602:ffdd::/36 us +2602:ffde::/36 us +2602:ffdf::/36 us +2602:ffe0::/36 us +2602:ffe1::/36 us +2602:ffe2::/36 us +2602:ffe3::/36 us +2602:ffe4::/36 us +2602:ffe5::/36 us +2602:ffe6::/36 us +2602:ffe7::/36 pr +2602:ffe8::/32 us +2602:ffea::/36 us +2602:ffec::/36 ca +2602:ffed::/36 us +2602:ffee::/36 us +2602:ffef::/36 us +2602:fff0::/36 us +2602:fff1::/36 us +2602:fff2::/36 us +2602:fff3::/36 us +2602:fff4::/36 us +2602:fff5::/36 us +2602:fff6::/36 us +2602:fff7::/36 us +2602:fff8::/36 us +2602:fff9::/36 us +2602:fffa::/36 us +2602:fffb::/36 us +2602:fffc::/32 us +2602:fffd::/36 ca +2602:ffff::/36 us +2603::/24 us +2603:2000::/32 us +2603:4000::/32 us +2603:5000::/32 us 2604::/32 us 2604:10::/32 us 2604:100::/32 us +2604:180::/32 us 2604:200::/32 us +2604:280::/32 us 2604:300::/32 us +2604:380::/32 us 2604:400::/32 us +2604:480::/32 us 2604:500::/32 us +2604:580::/32 us 2604:600::/32 us +2604:680::/32 us 2604:700::/32 us +2604:780::/32 ca 2604:800::/32 us +2604:880::/32 us 2604:900::/32 us +2604:980::/32 us 2604:a00::/32 us -2604:b00::/32 us +2604:a80::/32 us +2604:b80::/32 us 2604:c00::/32 us +2604:c80::/32 us 2604:d00::/32 us +2604:d80::/32 us 2604:e00::/32 us +2604:e80::/32 ca 2604:f00::/32 us -2604:1000::/32 us +2604:f80::/32 us +2604:1080::/32 us 2604:1100::/32 us +2604:1180::/32 us 2604:1200::/32 us +2604:1280::/32 us 2604:1300::/32 us +2604:1380::/32 us 2604:1400::/32 pr +2604:1480::/32 us 2604:1500::/32 ca +2604:1580::/32 us 2604:1600::/32 us +2604:1680::/32 ca 2604:1700::/32 ca +2604:1780::/32 ky 2604:1800::/32 gp +2604:1880::/32 us 2604:1900::/32 us -2604:1a00::/32 ca +2604:1980::/32 us +2604:1a00::/32 us 2604:1b00::/32 ca +2604:1b80::/32 us 2604:1c00::/32 us +2604:1c80::/32 us 2604:1d00::/32 ca +2604:1d80::/32 us 2604:1e00::/32 us +2604:1e80::/32 ca 2604:1f00::/32 us +2604:1f80::/32 ca 2604:2000::/32 us +2604:2080::/32 us 2604:2100::/32 us +2604:2180::/32 us 2604:2200::/32 us +2604:2280::/32 us 2604:2300::/32 us +2604:2380::/32 us 2604:2400::/32 us +2604:2480::/32 us 2604:2500::/32 us +2604:2580::/32 ca 2604:2600::/32 us +2604:2680::/32 us 2604:2700::/32 us +2604:2780::/32 us 2604:2800::/32 us +2604:2880::/32 us 2604:2900::/32 us +2604:2980::/32 us 2604:2a00::/32 us +2604:2a80::/32 us 2604:2b00::/32 us +2604:2b80::/36 ca 2604:2c00::/32 us -2604:2d00::/32 us +2604:2c80::/32 us +2604:2d00::/36 us +2604:2d80::/32 us 2604:2e00::/32 us +2604:2e80::/32 us 2604:2f00::/32 us +2604:2f80::/32 ca 2604:3000::/32 us +2604:3080::/32 us 2604:3100::/32 us +2604:3180::/32 us 2604:3200::/32 us +2604:3280::/32 us 2604:3300::/32 us +2604:3380::/32 us 2604:3400::/32 us +2604:3480::/32 us 2604:3500::/32 us +2604:3580::/32 us 2604:3600::/32 us +2604:3680::/32 us 2604:3700::/32 us +2604:3780::/32 us 2604:3800::/32 us -2604:3900::/32 us +2604:3880::/32 us 2604:3a00::/32 us +2604:3a80::/32 ca 2604:3b00::/32 ca +2604:3b80::/32 us 2604:3c00::/32 us +2604:3c80::/32 us 2604:3d00::/32 ca +2604:3d80::/32 us 2604:3e00::/32 us +2604:3e80::/32 us 2604:3f00::/32 us +2604:3f80::/32 us 2604:4000::/32 ca -2604:4100::/32 us +2604:4080::/32 us +2604:4100::/36 us +2604:4180::/32 us 2604:4200::/32 us +2604:4280::/32 ca 2604:4300::/32 us +2604:4380::/32 gd 2604:4400::/32 us +2604:4480::/32 us 2604:4500::/32 us +2604:4580::/32 us 2604:4600::/32 us +2604:4680::/32 ca 2604:4700::/32 us +2604:4780::/32 us 2604:4800::/32 us +2604:4880::/32 ca 2604:4900::/32 us +2604:4980::/32 us 2604:4a00::/32 us +2604:4a80::/32 us 2604:4b00::/32 us +2604:4b80::/32 us 2604:4c00::/32 ca +2604:4c80::/32 us 2604:4d00::/32 us +2604:4d80::/32 ca 2604:4e00::/32 us -2604:4f00::/32 us +2604:4e80::/32 ca +2604:4f00::/36 us +2604:4f80::/32 us 2604:5000::/32 us +2604:5080::/32 us 2604:5100::/32 us +2604:5180::/32 us 2604:5200::/32 us +2604:5280::/32 ca 2604:5300::/32 us +2604:5380::/32 ca 2604:5400::/32 us +2604:5480::/32 us 2604:5500::/32 us +2604:5580::/32 ca 2604:5600::/32 us +2604:5680::/32 us 2604:5700::/32 us +2604:5780::/32 us 2604:5800::/32 us +2604:5880::/32 ca 2604:5900::/32 us +2604:5980::/32 us 2604:5a00::/32 us +2604:5a80::/32 us 2604:5b00::/32 us +2604:5b80::/32 us 2604:5c00::/32 us +2604:5c80::/32 us 2604:5d00::/32 us 2604:5e00::/32 us +2604:5e80::/32 us 2604:5f00::/32 us +2604:5f80::/32 us 2604:6000::/32 us +2604:6080::/32 us 2604:6100::/32 us +2604:6180::/32 us 2604:6200::/32 us +2604:6280::/32 us 2604:6300::/32 us +2604:6380::/32 us 2604:6400::/32 ca +2604:6480::/32 us 2604:6500::/32 ca +2604:6580::/32 ca 2604:6600::/32 us +2604:6680::/32 us 2604:6700::/32 us +2604:6780::/32 us 2604:6800::/32 us +2604:6880::/32 ca 2604:6900::/32 us +2604:6980::/32 us 2604:6a00::/32 us +2604:6a80::/32 us 2604:6b00::/32 us +2604:6b80::/32 us 2604:6c00::/32 us +2604:6c80::/32 ca 2604:6d00::/32 us +2604:6d80::/32 us 2604:6e00::/32 us +2604:6e80::/32 us 2604:6f00::/32 us +2604:6f80::/32 us 2604:7000::/32 us +2604:7080::/32 us 2604:7100::/32 us +2604:7180::/36 us 2604:7200::/32 us +2604:7280::/32 us 2604:7300::/32 us 2604:7400::/32 us +2604:7480::/32 ca 2604:7500::/32 us +2604:7580::/32 us 2604:7600::/32 us +2604:7680::/32 us 2604:7700::/32 us +2604:7780::/32 us 2604:7800::/32 us +2604:7880::/32 us 2604:7900::/32 us +2604:7980::/32 ca 2604:7a00::/32 us +2604:7a80::/32 us 2604:7b00::/32 us +2604:7b80::/32 us 2604:7c00::/32 us +2604:7c80::/32 us 2604:7d00::/32 us +2604:7d80::/32 us 2604:7e00::/32 us +2604:7e80::/32 us 2604:7f00::/32 ca +2604:7f80::/32 us 2604:8000::/32 us +2604:8080::/32 ca 2604:8100::/32 us +2604:8180::/32 us 2604:8200::/32 us +2604:8280::/32 ca 2604:8300::/32 us +2604:8380::/32 us 2604:8400::/32 ca +2604:8480::/32 us 2604:8500::/32 us +2604:8580::/32 us 2604:8600::/32 ca -2604:8700::/32 us +2604:8700::/36 us +2604:8780::/32 us 2604:8800::/32 us +2604:8880::/32 ca 2604:8900::/32 us +2604:8980::/32 ca 2604:8a00::/32 us +2604:8a80::/32 us 2604:8b00::/32 us +2604:8b80::/32 us 2604:8c00::/32 us +2604:8c80::/32 dm 2604:8d00::/32 us +2604:8d80::/32 us 2604:8e00::/32 us +2604:8e80::/32 us 2604:8f00::/32 us +2604:8f80::/32 us 2604:9000::/32 us +2604:9080::/32 us 2604:9100::/32 us +2604:9180::/32 us 2604:9200::/32 us +2604:9280::/32 us 2604:9300::/32 us +2604:9380::/32 ca 2604:9400::/32 us +2604:9480::/32 us 2604:9500::/32 us +2604:9580::/32 us 2604:9600::/32 us 2604:9700::/32 us +2604:9780::/32 us 2604:9800::/32 us +2604:9880::/36 ca 2604:9900::/32 us +2604:9980::/32 us 2604:9a00::/32 us +2604:9a80::/32 us 2604:9b00::/32 us +2604:9b80::/32 us 2604:9c00::/32 us +2604:9c80::/32 us 2604:9d00::/32 us +2604:9d80::/32 us 2604:9e00::/32 us +2604:9e80::/32 ca 2604:9f00::/32 us +2604:9f80::/32 us 2604:a000::/32 us +2604:a080::/32 us 2604:a100::/32 us +2604:a180::/32 bb 2604:a200::/32 us +2604:a280::/32 ca 2604:a300::/32 us 2604:a400::/32 us +2604:a480::/32 us 2604:a500::/32 us +2604:a580::/32 us 2604:a600::/32 us +2604:a680::/32 us 2604:a700::/32 us +2604:a780::/32 us 2604:a800::/32 us +2604:a880::/32 us 2604:a900::/32 us +2604:a980::/32 us 2604:aa00::/32 us +2604:aa80::/32 us 2604:ab00::/32 us +2604:ab80::/32 us 2604:ac00::/32 us +2604:ac80::/32 us 2604:ad00::/32 us +2604:ad80::/32 us 2604:ae00::/32 us +2604:ae80::/32 us 2604:af00::/32 us +2604:af80::/32 us 2604:b000::/32 pr +2604:b080::/32 us 2604:b100::/32 us +2604:b180::/32 us 2604:b200::/32 us +2604:b280::/32 ca 2604:b300::/32 us +2604:b380::/32 us +2604:b400::/32 us +2604:b480::/32 us 2604:b500::/32 us +2604:b580::/32 us 2604:b600::/32 us +2604:b680::/32 us 2604:b700::/32 us +2604:b780::/36 us 2604:b800::/32 us +2604:b880::/32 us 2604:b900::/32 us +2604:b980::/32 ca 2604:ba00::/32 us +2604:ba80::/32 us 2604:bb00::/32 us +2604:bb80::/32 us 2604:bc00::/32 us +2604:bc80::/32 us 2604:bd00::/32 us +2604:bd80::/32 us 2604:be00::/32 us +2604:be80::/32 us 2604:bf00::/32 us +2604:bf80::/32 us 2604:c000::/32 us +2604:c080::/32 us 2604:c100::/32 us +2604:c180::/32 vi 2604:c200::/32 us 2604:c300::/32 us +2604:c380::/32 us 2604:c400::/32 us 2604:c500::/32 us +2604:c580::/32 us 2604:c600::/32 us +2604:c680::/32 us 2604:c700::/32 us +2604:c780::/32 us 2604:c800::/32 us +2604:c880::/32 us 2604:c900::/32 us +2604:c980::/32 us 2604:ca00::/32 us +2604:ca80::/32 us 2604:cb00::/32 us +2604:cb80::/32 us 2604:cc00::/32 us +2604:cc80::/32 us 2604:cd00::/32 us +2604:cd80::/32 us 2604:ce00::/32 us -2604:cf00::/32 ca +2604:ce80::/32 us +2604:cf00::/32 us +2604:cf80::/32 us 2604:d000::/32 us +2604:d080::/32 us 2604:d100::/32 us +2604:d180::/32 us 2604:d200::/32 us +2604:d280::/32 us 2604:d300::/32 us +2604:d380::/32 us 2604:d400::/32 us +2604:d480::/32 us 2604:d500::/32 us +2604:d580::/32 us 2604:d600::/32 us +2604:d680::/32 us 2604:d700::/32 us +2604:d780::/32 ca 2604:d800::/32 us 2604:d900::/32 us -2604:da00::/32 us +2604:d980::/32 ca +2604:da00::/36 us +2604:da80::/32 us 2604:db00::/32 ca 2604:dc00::/32 ca +2604:dc80::/32 us 2604:dd00::/32 us -2604:de00::/32 us +2604:dd80::/32 us +2604:de00::/36 us +2604:de80::/32 us 2604:df00::/32 us 2604:e000::/32 us +2604:e080::/32 us 2604:e100::/32 ca +2604:e180::/32 us 2604:e200::/32 us +2604:e280::/32 us 2604:e300::/32 us +2604:e380::/32 us 2604:e400::/32 us +2604:e480::/32 us 2604:e500::/32 us +2604:e580::/32 us 2604:e600::/32 us +2604:e680::/32 us 2604:e700::/32 us +2604:e780::/32 us 2604:e800::/32 us +2604:e880::/32 us 2604:e900::/32 us +2604:e980::/32 us 2604:ea00::/32 us +2604:ea80::/32 us 2604:eb00::/32 us +2604:eb80::/32 us 2604:ec00::/32 ca +2604:ec80::/32 us 2604:ed00::/32 us -2604:ee00::/32 us +2604:ed80::/32 us +2604:ee00::/36 us +2604:ee80::/32 us 2604:ef00::/32 ca 2604:f000::/32 ca +2604:f080::/32 us 2604:f100::/32 us +2604:f180::/32 pr 2604:f200::/32 us +2604:f280::/32 us 2604:f300::/32 us +2604:f380::/32 us 2604:f400::/32 us +2604:f480::/32 us 2604:f500::/32 us +2604:f580::/32 us 2604:f600::/32 us +2604:f680::/32 ca 2604:f700::/32 us 2604:f800::/32 ca +2604:f880::/32 us 2604:f900::/32 us +2604:f980::/32 us 2604:fa00::/32 us +2604:fa80::/32 ca 2604:fb00::/32 us +2604:fb80::/32 ca 2604:fc00::/32 us +2604:fc80::/32 us 2604:fd00::/32 us +2604:fd80::/32 us 2604:fe00::/32 us +2604:fe80::/32 us 2604:ff00::/32 us +2604:ff80::/32 ca 2605::/32 us +2605:80::/32 ca 2605:100::/32 us +2605:180::/32 us 2605:200::/32 us +2605:280::/32 us 2605:300::/32 us +2605:380::/32 us 2605:400::/32 us +2605:480::/32 us 2605:500::/32 ca 2605:600::/32 us +2605:680::/32 us 2605:700::/32 us +2605:780::/32 us 2605:800::/32 us +2605:880::/32 us 2605:900::/32 us +2605:980::/32 us 2605:a00::/32 us -2605:b00::/32 us +2605:a80::/32 us +2605:b00::/36 us +2605:b80::/32 us 2605:c00::/32 ca 2605:d00::/32 us +2605:d80::/32 us 2605:e00::/32 us +2605:e80::/32 bm 2605:f00::/32 us +2605:f80::/32 us 2605:1000::/32 ca +2605:1080::/32 us 2605:1100::/32 ca -2605:1200::/32 us +2605:1180::/32 us +2605:1280::/32 us 2605:1300::/32 ca +2605:1380::/32 ca 2605:1400::/32 us +2605:1480::/32 us 2605:1500::/32 us +2605:1580::/32 us 2605:1600::/32 us +2605:1680::/32 us 2605:1700::/32 ca +2605:1780::/32 us 2605:1800::/32 us +2605:1880::/32 us 2605:1900::/32 us +2605:1980::/32 us 2605:1a00::/32 us +2605:1a80::/32 us 2605:1b00::/32 ca +2605:1b80::/32 us 2605:1c00::/32 us +2605:1c80::/32 ca 2605:1d00::/32 us 2605:1e00::/32 us +2605:1e80::/32 us 2605:1f00::/32 us +2605:1f80::/32 us 2605:2000::/32 us -2605:2100::/32 ca +2605:2080::/32 us +2605:2100::/36 ca +2605:2180::/32 us 2605:2200::/32 us +2605:2280::/32 us 2605:2300::/32 us +2605:2380::/32 us 2605:2400::/32 us +2605:2480::/32 us 2605:2500::/32 us +2605:2580::/32 us 2605:2600::/32 ca +2605:2680::/32 us 2605:2700::/32 us 2605:2800::/32 us +2605:2880::/32 us 2605:2900::/32 ca +2605:2980::/32 us 2605:2a00::/32 ca +2605:2a80::/32 us 2605:2b00::/32 us +2605:2b80::/32 us 2605:2c00::/32 us -2605:2d00::/32 us -2605:2e00::/32 ca +2605:2c80::/32 us +2605:2d80::/32 us +2605:2e00::/36 ca +2605:2e80::/32 us 2605:2f00::/32 us 2605:3000::/32 us +2605:3080::/32 us 2605:3100::/32 us +2605:3180::/32 us 2605:3200::/32 us +2605:3280::/32 us 2605:3300::/32 us +2605:3380::/32 us 2605:3400::/32 us +2605:3480::/32 us 2605:3500::/32 us +2605:3580::/32 us 2605:3600::/32 us +2605:3680::/32 us 2605:3700::/32 us +2605:3780::/32 us 2605:3800::/32 us +2605:3880::/32 ca 2605:3900::/32 us +2605:3980::/32 us 2605:3a00::/32 us -2605:3b00::/32 us +2605:3b00::/36 us +2605:3b80::/32 us 2605:3c00::/32 us +2605:3c80::/32 us 2605:3d00::/32 us +2605:3d80::/32 us 2605:3e00::/32 us +2605:3e80::/32 us 2605:3f00::/32 ca +2605:3f80::/32 us 2605:4000::/32 us +2605:4080::/32 us 2605:4100::/32 us +2605:4180::/32 us 2605:4200::/32 us +2605:4280::/32 us 2605:4300::/32 us +2605:4380::/32 us 2605:4400::/32 us +2605:4480::/32 us 2605:4500::/32 us +2605:4580::/32 us 2605:4600::/32 us +2605:4680::/32 us 2605:4700::/32 us +2605:4780::/32 us 2605:4800::/32 us 2605:4900::/32 us +2605:4980::/32 us 2605:4a00::/32 us +2605:4a80::/32 us 2605:4b00::/32 us +2605:4b80::/32 us 2605:4c00::/32 us +2605:4c80::/32 us 2605:4d00::/32 us +2605:4d80::/32 us 2605:4e00::/32 us +2605:4e80::/32 us 2605:4f00::/32 ca +2605:4f80::/32 us 2605:5000::/32 us +2605:5080::/32 ca 2605:5100::/32 us +2605:5180::/32 us 2605:5200::/32 us +2605:5280::/32 us 2605:5300::/32 us +2605:5380::/32 us 2605:5400::/32 us +2605:5480::/32 us 2605:5500::/32 us +2605:5580::/32 us 2605:5600::/32 us +2605:5680::/32 us 2605:5700::/32 us 2605:5800::/32 us +2605:5880::/32 us 2605:5900::/32 jm +2605:5980::/32 us 2605:5a00::/32 us +2605:5a80::/32 us 2605:5b00::/32 us 2605:5c00::/32 us +2605:5c80::/32 us 2605:5d00::/32 us +2605:5d80::/32 us 2605:5e00::/32 us +2605:5e80::/32 us 2605:5f00::/32 us +2605:5f80::/32 us 2605:6000::/32 us +2605:6080::/32 us 2605:6100::/32 us +2605:6180::/32 us 2605:6200::/32 us +2605:6280::/32 ai 2605:6300::/32 us -2605:6400::/32 ca +2605:6380::/32 us +2605:6400::/32 us +2605:6480::/32 us 2605:6500::/32 us +2605:6580::/32 us 2605:6600::/32 us +2605:6680::/32 us 2605:6700::/32 us +2605:6780::/32 us 2605:6800::/32 us +2605:6880::/32 ca 2605:6900::/32 us +2605:6980::/32 us 2605:6a00::/32 ca +2605:6a80::/32 us 2605:6b00::/32 ca +2605:6b80::/32 us 2605:6c00::/32 us +2605:6c80::/32 us 2605:6d00::/32 us +2605:6d80::/32 us 2605:6e00::/32 us +2605:6e80::/32 us 2605:6f00::/32 ca +2605:6f80::/32 us 2605:7000::/32 us +2605:7080::/32 us 2605:7100::/32 us +2605:7180::/32 us 2605:7200::/32 ca +2605:7280::/32 us 2605:7300::/32 us +2605:7380::/32 us 2605:7400::/32 ca +2605:7480::/32 ca 2605:7500::/32 us +2605:7580::/32 us 2605:7600::/32 us +2605:7680::/32 us 2605:7700::/32 us -2605:7800::/32 us +2605:7780::/32 us +2605:7880::/32 us 2605:7900::/32 us +2605:7980::/32 us 2605:7a00::/32 us 2605:7b00::/32 us +2605:7b80::/32 us 2605:7c00::/32 ca +2605:7c80::/32 us 2605:7d00::/32 us +2605:7d80::/32 us 2605:7e00::/32 us -2605:7f00::/32 us +2605:7e80::/32 ca +2605:7f80::/32 us 2605:8000::/32 us +2605:8080::/32 us 2605:8100::/32 ca 2605:8200::/32 us +2605:8280::/32 us 2605:8300::/32 us +2605:8380::/32 us 2605:8400::/32 us +2605:8480::/32 us 2605:8500::/32 us +2605:8580::/32 us 2605:8600::/32 us +2605:8680::/32 us 2605:8700::/32 us +2605:8780::/32 ca 2605:8800::/32 us +2605:8880::/32 us 2605:8900::/32 us +2605:8980::/32 us 2605:8a00::/32 us +2605:8a80::/32 us 2605:8b00::/32 us +2605:8b80::/32 us 2605:8c00::/32 us +2605:8c80::/32 ca 2605:8d00::/32 us +2605:8d80::/32 ca 2605:8e00::/32 us 2605:8f00::/32 us +2605:8f80::/32 us 2605:9000::/32 ca +2605:9080::/32 us 2605:9100::/32 us +2605:9180::/32 us 2605:9200::/32 us +2605:9280::/32 us 2605:9300::/32 ca +2605:9380::/32 us 2605:9400::/32 us +2605:9480::/32 us 2605:9500::/32 us +2605:9580::/32 us 2605:9600::/32 us +2605:9680::/32 ca 2605:9700::/32 us +2605:9780::/32 us 2605:9800::/32 us +2605:9880::/32 us 2605:9900::/32 us +2605:9980::/32 us 2605:9a00::/32 us +2605:9a80::/32 us 2605:9b00::/32 us +2605:9b80::/32 us 2605:9c00::/32 us +2605:9c80::/32 us 2605:9d00::/32 us +2605:9d80::/32 us 2605:9e00::/32 us +2605:9e80::/32 us 2605:9f00::/32 us +2605:9f80::/32 us 2605:a000::/32 us +2605:a080::/32 us 2605:a100::/32 us +2605:a180::/32 us 2605:a200::/32 jm +2605:a280::/32 us 2605:a300::/32 us +2605:a380::/32 us 2605:a400::/32 us +2605:a480::/32 us 2605:a500::/32 us +2605:a580::/32 us 2605:a600::/32 us +2605:a680::/32 ca 2605:a700::/32 us +2605:a780::/32 us 2605:a800::/32 ca +2605:a880::/32 us 2605:a900::/32 us +2605:a980::/32 us 2605:aa00::/32 us +2605:aa80::/32 us 2605:ab00::/32 ca +2605:ab80::/32 us 2605:ac00::/32 ca +2605:ac80::/32 us 2605:ad00::/32 us +2605:ad80::/32 us 2605:ae00::/32 us +2605:ae80::/32 us 2605:af00::/32 us +2605:af80::/32 us 2605:b000::/32 ca +2605:b080::/32 us 2605:b100::/32 ca +2605:b180::/32 us 2605:b200::/32 us +2605:b280::/32 us 2605:b300::/32 us +2605:b380::/32 us 2605:b400::/32 us +2605:b480::/32 ca 2605:b500::/32 us +2605:b580::/32 us 2605:b600::/32 ca +2605:b680::/32 us 2605:b700::/32 us +2605:b780::/32 us 2605:b800::/32 pr +2605:b880::/32 ca 2605:b900::/32 ca +2605:b980::/32 us 2605:ba00::/32 pr +2605:ba80::/32 ca 2605:bb00::/32 us +2605:bb80::/32 us 2605:bc00::/32 us +2605:bc80::/32 us 2605:bd00::/32 us +2605:bd80::/32 us 2605:be00::/32 us +2605:be80::/32 us 2605:bf00::/32 us +2605:bf80::/32 us 2605:c000::/32 us +2605:c080::/32 gd 2605:c100::/32 us +2605:c180::/36 us 2605:c200::/32 us +2605:c280::/32 us 2605:c300::/32 us +2605:c380::/32 us 2605:c400::/32 us +2605:c480::/32 us 2605:c500::/32 ca +2605:c580::/32 ca 2605:c600::/32 us +2605:c680::/32 us 2605:c700::/32 ca +2605:c780::/32 us 2605:c800::/32 us +2605:c880::/32 us 2605:c900::/32 us +2605:c980::/32 ca 2605:ca00::/32 us +2605:ca80::/32 us 2605:cb00::/32 us +2605:cb80::/32 us 2605:cc00::/32 us +2605:cc80::/32 us 2605:cd00::/32 us +2605:cd80::/32 us 2605:ce00::/32 us +2605:ce80::/32 us 2605:cf00::/32 ca +2605:cf80::/32 ca 2605:d000::/32 us +2605:d080::/32 us 2605:d100::/32 us -2605:d200::/32 us +2605:d180::/32 us +2605:d280::/32 us 2605:d300::/32 us +2605:d380::/36 us 2605:d400::/32 us +2605:d480::/32 us 2605:d500::/32 ca +2605:d580::/32 us 2605:d600::/32 us +2605:d680::/32 us 2605:d700::/32 us +2605:d780::/32 us 2605:d800::/32 us +2605:d880::/32 dm 2605:d900::/32 us +2605:d980::/32 us 2605:da00::/32 us +2605:da80::/32 us 2605:db00::/32 us +2605:db80::/32 us 2605:dc00::/32 us +2605:dc80::/32 us 2605:dd00::/32 us +2605:dd80::/32 us 2605:de00::/32 us +2605:de80::/32 vi 2605:df00::/32 us +2605:df80::/32 us 2605:e000::/32 us 2605:e100::/32 us +2605:e180::/32 us 2605:e200::/32 ca +2605:e280::/32 us 2605:e300::/32 us +2605:e380::/32 us 2605:e400::/32 us +2605:e480::/32 us 2605:e500::/32 us +2605:e580::/32 us 2605:e600::/32 us +2605:e680::/32 ca 2605:e700::/32 us -2605:e800::/32 us +2605:e780::/32 us +2605:e880::/32 us 2605:e900::/32 us +2605:e980::/32 us 2605:ea00::/32 us +2605:ea80::/32 us 2605:eb00::/32 us +2605:eb80::/32 us 2605:ec00::/32 us +2605:ec80::/32 us 2605:ed00::/32 us +2605:ed80::/32 us 2605:ee00::/32 us +2605:ee80::/36 us 2605:ef00::/32 us +2605:ef80::/32 us 2605:f000::/32 us +2605:f080::/32 us 2605:f100::/32 us +2605:f180::/32 us 2605:f200::/32 us +2605:f280::/32 us 2605:f300::/32 us +2605:f380::/32 us 2605:f400::/32 us +2605:f480::/32 us 2605:f500::/32 us +2605:f580::/32 us 2605:f600::/32 us +2605:f680::/32 us 2605:f700::/32 us +2605:f780::/36 us 2605:f800::/32 us +2605:f880::/32 us 2605:f900::/32 us +2605:f980::/32 us 2605:fa00::/32 ca +2605:fa80::/36 us 2605:fb00::/32 us -2605:fc00::/32 us +2605:fb80::/32 us +2605:fc80::/32 us 2605:fd00::/32 ca -2605:fe00::/32 us +2605:fd80::/32 us +2605:fe00::/36 us +2605:fe80::/32 us 2605:ff00::/32 us -2606::/32 ca +2605:ff80::/32 us +2606::/32 us +2606:80::/32 us 2606:100::/32 us +2606:180::/32 us 2606:200::/32 us +2606:280::/32 us 2606:300::/32 us +2606:380::/32 us 2606:400::/32 us +2606:480::/32 bm 2606:500::/32 us +2606:580::/32 us 2606:600::/32 ky +2606:680::/32 us 2606:700::/32 us +2606:780::/32 us 2606:800::/32 us +2606:880::/32 us 2606:900::/32 us +2606:980::/32 us 2606:a00::/32 us +2606:a80::/32 ca 2606:b00::/32 us +2606:b80::/32 bm 2606:c00::/32 us 2606:d00::/32 us +2606:d80::/32 us 2606:e00::/32 us +2606:e80::/32 us 2606:f00::/32 us +2606:f80::/32 us 2606:1000::/32 us +2606:1080::/32 us 2606:1100::/32 us +2606:1180::/32 us 2606:1200::/32 us 2606:1300::/32 us +2606:1380::/32 us 2606:1400::/32 us +2606:1480::/32 us 2606:1500::/32 us +2606:1580::/32 us 2606:1600::/32 us +2606:1680::/32 us 2606:1700::/32 us +2606:1780::/32 us 2606:1800::/32 us +2606:1880::/32 us 2606:1900::/32 us +2606:1980::/32 us 2606:1a00::/32 us +2606:1a80::/32 us 2606:1b00::/32 us +2606:1b80::/32 ca 2606:1c00::/32 us +2606:1c80::/32 us 2606:1d00::/32 us 2606:1e00::/32 us -2606:1f00::/32 ca +2606:1e80::/32 us +2606:1f00::/32 us +2606:1f80::/32 us 2606:2000::/32 us +2606:2080::/32 us 2606:2100::/32 us +2606:2180::/32 us 2606:2200::/32 us +2606:2280::/32 us 2606:2300::/32 us +2606:2380::/32 us 2606:2400::/32 us +2606:2480::/32 gp 2606:2500::/32 us +2606:2580::/32 ca 2606:2600::/32 us +2606:2680::/32 us 2606:2700::/32 ca +2606:2780::/32 us 2606:2800::/32 us +2606:2880::/32 us 2606:2900::/32 us +2606:2980::/32 us 2606:2a00::/32 us +2606:2a80::/32 us 2606:2b00::/32 us +2606:2b80::/32 ca 2606:2c00::/32 us -2606:2d00::/32 us +2606:2c80::/32 us +2606:2d00::/36 us +2606:2d80::/32 us 2606:2e00::/32 us +2606:2e80::/32 us 2606:2f00::/32 us +2606:2f80::/32 ca 2606:3000::/32 ca +2606:3080::/32 us 2606:3100::/32 ca +2606:3180::/32 gp 2606:3200::/32 us +2606:3280::/32 us 2606:3300::/32 us +2606:3380::/32 us 2606:3400::/32 us +2606:3480::/32 us 2606:3500::/32 us +2606:3580::/32 us 2606:3600::/32 us +2606:3680::/32 us 2606:3700::/32 us +2606:3780::/32 ca 2606:3800::/32 us +2606:3880::/32 us 2606:3900::/32 us +2606:3980::/32 us 2606:3a00::/32 us +2606:3a80::/32 us 2606:3b00::/32 us +2606:3b80::/32 us 2606:3c00::/32 ca +2606:3c80::/32 lc 2606:3d00::/32 us +2606:3d80::/32 pr 2606:3e00::/32 us +2606:3e80::/32 us 2606:3f00::/32 us +2606:3f80::/32 us 2606:4000::/32 us +2606:4080::/32 us 2606:4100::/32 us +2606:4180::/32 us 2606:4200::/32 us +2606:4280::/32 ca 2606:4300::/32 us +2606:4380::/32 ca 2606:4400::/32 us +2606:4480::/32 us 2606:4500::/32 us +2606:4580::/32 ca 2606:4600::/32 us +2606:4680::/32 us 2606:4700::/32 us +2606:4780::/32 us 2606:4800::/32 us +2606:4880::/32 us 2606:4900::/32 us +2606:4980::/32 us 2606:4a00::/32 us +2606:4a80::/32 us 2606:4b00::/32 us +2606:4b80::/32 us 2606:4c00::/32 us +2606:4c80::/32 us 2606:4d00::/32 us +2606:4d80::/32 us 2606:4e00::/32 us +2606:4e80::/32 us 2606:4f00::/32 us +2606:4f80::/32 us 2606:5000::/32 us +2606:5080::/32 us 2606:5100::/32 us +2606:5180::/32 ca 2606:5200::/32 us +2606:5280::/32 us 2606:5300::/32 ca +2606:5380::/32 us 2606:5400::/32 us +2606:5480::/32 ca 2606:5500::/32 us +2606:5580::/32 us 2606:5600::/32 us +2606:5680::/32 us 2606:5700::/32 us +2606:5780::/32 us 2606:5800::/32 us +2606:5880::/32 us 2606:5900::/32 us -2606:5a00::/32 us +2606:5980::/32 us +2606:5a00::/32 vi +2606:5a80::/32 us 2606:5b00::/32 us +2606:5b80::/32 us 2606:5c00::/32 us +2606:5c80::/32 ca 2606:5d00::/32 us -2606:5e00::/32 ca +2606:5d80::/32 ca +2606:5e00::/32 us +2606:5e80::/32 us 2606:5f00::/32 pr +2606:5f80::/32 us 2606:6000::/32 us +2606:6080::/32 ca 2606:6100::/32 us +2606:6180::/32 us 2606:6200::/32 ca +2606:6280::/32 ca 2606:6300::/32 ca +2606:6380::/32 us 2606:6400::/32 us +2606:6480::/32 ca 2606:6500::/32 us +2606:6580::/32 us 2606:6600::/32 us +2606:6680::/32 us 2606:6700::/32 us -2606:6800::/32 ca +2606:6780::/32 ca +2606:6800::/32 us +2606:6880::/32 ca 2606:6900::/32 us +2606:6980::/32 us 2606:6a00::/32 ca +2606:6a80::/32 us 2606:6b00::/32 us +2606:6b80::/32 us 2606:6c00::/32 us +2606:6c80::/32 us 2606:6d00::/32 ca +2606:6d80::/32 us 2606:6e00::/32 us +2606:6e80::/32 us 2606:6f00::/32 us +2606:6f80::/32 us 2606:7000::/32 us +2606:7080::/32 ca 2606:7100::/32 us +2606:7180::/32 us 2606:7200::/32 us +2606:7280::/32 us 2606:7300::/32 us +2606:7380::/32 us 2606:7400::/32 us +2606:7480::/32 ca 2606:7500::/32 us +2606:7580::/32 us 2606:7600::/32 us +2606:7680::/32 ca 2606:7700::/32 us +2606:7780::/32 us 2606:7800::/32 us +2606:7880::/32 ca 2606:7900::/32 us +2606:7980::/32 ca 2606:7a00::/32 ca +2606:7a80::/32 us 2606:7b00::/32 us +2606:7b80::/32 us 2606:7c00::/32 us +2606:7c80::/32 us 2606:7d00::/32 us +2606:7d80::/32 us 2606:7e00::/32 us +2606:7e80::/32 us 2606:7f00::/32 us +2606:7f80::/32 us 2606:8000::/32 us +2606:8080::/32 us 2606:8100::/32 us +2606:8180::/32 us 2606:8200::/32 us 2606:8300::/32 ca +2606:8380::/32 us 2606:8400::/32 us +2606:8480::/32 us 2606:8500::/32 us +2606:8580::/32 us 2606:8600::/32 us +2606:8680::/32 us +2606:8700::/32 us +2606:8780::/32 us 2606:8800::/32 us +2606:8880::/32 us +2606:8900::/32 ca +2606:8980::/32 ca 2606:8a00::/32 us +2606:8a80::/32 us +2606:8b00::/32 us +2606:8b80::/32 us 2606:8c00::/32 ca +2606:8c80::/32 us +2606:8d00::/32 us +2606:8d80::/32 us 2606:8e00::/32 us -2606:9000::/32 ca +2606:8e80::/32 us +2606:8f00::/32 us +2606:8f80::/32 ca +2606:9000::/32 us +2606:9080::/32 us +2606:9100::/32 us +2606:9180::/32 us 2606:9200::/32 us +2606:9280::/32 us +2606:9300::/32 us +2606:9380::/32 us 2606:9400::/32 us +2606:9480::/32 us +2606:9500::/32 us +2606:9580::/32 ca 2606:9600::/32 us +2606:9680::/32 us +2606:9700::/32 us +2606:9780::/32 us 2606:9800::/32 us +2606:9880::/32 us +2606:9900::/32 us +2606:9980::/32 us 2606:9a00::/32 us +2606:9a80::/32 us +2606:9b00::/32 us +2606:9b80::/32 us 2606:9c00::/32 us +2606:9c80::/32 us +2606:9d00::/32 us +2606:9d80::/32 us 2606:9e00::/32 bm +2606:9e80::/32 us +2606:9f00::/32 us +2606:9f80::/32 us 2606:a000::/32 us +2606:a080::/32 us +2606:a100::/32 us +2606:a180::/32 us 2606:a200::/32 us +2606:a280::/32 us +2606:a300::/32 us +2606:a380::/32 us 2606:a400::/32 us +2606:a480::/32 us +2606:a500::/32 us +2606:a580::/32 us 2606:a600::/32 us +2606:a680::/32 us +2606:a700::/32 us +2606:a780::/32 us 2606:a800::/32 us +2606:a880::/32 us +2606:a900::/32 us +2606:a980::/32 us 2606:aa00::/32 us +2606:aa80::/32 us +2606:ab00::/32 us +2606:ab80::/32 us 2606:ac00::/32 us +2606:ac80::/32 us +2606:ad00::/32 us +2606:ad80::/32 us 2606:ae00::/32 us +2606:ae80::/32 us +2606:af00::/32 ca +2606:af80::/32 us 2606:b000::/32 us +2606:b080::/32 us +2606:b100::/32 us +2606:b180::/32 us 2606:b200::/32 ky +2606:b280::/32 us +2606:b300::/32 us +2606:b380::/32 us 2606:b400::/32 us -2606:b600::/32 us +2606:b480::/32 us +2606:b500::/32 us +2606:b580::/32 us +2606:b600::/36 us +2606:b680::/32 us +2606:b700::/32 us +2606:b780::/32 us 2606:b800::/32 ca +2606:b880::/32 us +2606:b900::/32 us +2606:b980::/32 us 2606:ba00::/32 us +2606:ba80::/32 us +2606:bb00::/32 us +2606:bb80::/32 us 2606:bc00::/32 us +2606:bc80::/32 us +2606:bd00::/32 us +2606:bd80::/32 ca 2606:be00::/32 us +2606:be80::/32 ca +2606:bf00::/32 us +2606:bf80::/32 us 2606:c000::/32 us -2606:c200::/32 us +2606:c080::/32 us +2606:c100::/32 us +2606:c180::/32 us +2606:c280::/32 us +2606:c300::/32 us +2606:c380::/32 us 2606:c400::/32 us -2606:c600::/32 ca +2606:c480::/32 us +2606:c500::/32 jm +2606:c580::/32 us +2606:c680::/32 us +2606:c700::/32 us +2606:c780::/32 us 2606:c800::/32 us +2606:c880::/32 ca +2606:c900::/32 us +2606:c980::/32 us 2606:ca00::/32 ca +2606:ca80::/32 us +2606:cb00::/32 us +2606:cb80::/32 us 2606:cc00::/32 us +2606:cc80::/32 us +2606:cd00::/32 us +2606:cd80::/32 us 2606:ce00::/32 us +2606:ce80::/32 us +2606:cf00::/32 us +2606:cf80::/32 us 2606:d000::/32 us +2606:d080::/32 us +2606:d100::/32 us +2606:d180::/32 ca 2606:d200::/32 us +2606:d280::/32 us +2606:d300::/36 us +2606:d380::/32 us 2606:d400::/32 us +2606:d480::/32 us +2606:d500::/32 us +2606:d580::/32 us 2606:d600::/32 us +2606:d680::/32 ca +2606:d700::/32 us +2606:d780::/32 us 2606:d800::/32 us +2606:d880::/32 us +2606:d900::/32 us +2606:d980::/32 us 2606:da00::/32 us +2606:da80::/36 us +2606:db00::/32 us +2606:db80::/32 us 2606:dc00::/32 us +2606:dc80::/32 us +2606:dd00::/36 us +2606:dd80::/32 ca 2606:de00::/32 ca +2606:de80::/32 us +2606:df00::/32 us +2606:df80::/32 us 2606:e000::/32 ca +2606:e080::/32 us +2606:e100::/32 us +2606:e180::/32 us 2606:e200::/32 us +2606:e280::/32 us +2606:e300::/32 us +2606:e380::/32 ca 2606:e400::/32 us +2606:e480::/32 us +2606:e500::/32 us +2606:e580::/32 us 2606:e600::/32 us +2606:e680::/32 us +2606:e700::/32 us +2606:e780::/32 us 2606:e800::/32 us +2606:e880::/32 us +2606:e900::/32 us +2606:e980::/32 us 2606:ea00::/32 us +2606:ea80::/32 us +2606:eb00::/32 ca +2606:eb80::/32 us 2606:ec00::/32 us +2606:ec80::/32 ca +2606:ed00::/32 us +2606:ed80::/32 us 2606:ee00::/32 ca +2606:ee80::/32 us +2606:ef00::/32 us +2606:ef80::/32 us 2606:f000::/32 us +2606:f080::/32 ca +2606:f100::/32 us +2606:f180::/32 us 2606:f200::/32 us +2606:f280::/32 ca +2606:f300::/32 us +2606:f380::/32 us 2606:f400::/32 us +2606:f480::/32 us +2606:f500::/32 us +2606:f580::/32 ky 2606:f600::/32 us +2606:f680::/32 us +2606:f700::/32 ca +2606:f780::/32 us 2606:f800::/32 us +2606:f880::/32 ca +2606:f900::/32 ca +2606:f980::/32 us 2606:fa00::/32 ca +2606:fa80::/32 us +2606:fb80::/32 us 2606:fc00::/32 us +2606:fc80::/32 us +2606:fd00::/32 us +2606:fd80::/32 us 2606:fe00::/32 us +2606:fe80::/32 us +2606:ff00::/32 us +2606:ff80::/32 us 2607::/32 ca +2607:80::/32 us +2607:100::/32 ca +2607:180::/32 ca 2607:200::/32 us +2607:280::/32 us +2607:300::/32 bs +2607:380::/32 us 2607:400::/32 us +2607:480::/32 us +2607:500::/32 us +2607:580::/32 us 2607:600::/32 us +2607:680::/32 ca +2607:700::/32 us +2607:780::/32 ca 2607:800::/32 us +2607:900::/32 us 2607:a00::/32 ca +2607:b00::/32 us 2607:c00::/32 us +2607:d00::/32 us 2607:e00::/32 us +2607:f00::/32 pr 2607:1000::/32 us +2607:1100::/32 us 2607:1200::/32 us +2607:1300::/32 us 2607:1400::/32 us +2607:1500::/32 us 2607:1600::/32 us +2607:1700::/32 us 2607:1800::/32 us +2607:1900::/32 us 2607:1a00::/32 us +2607:1b00::/32 us 2607:1c00::/32 us +2607:1d00::/32 ca 2607:1e00::/32 us +2607:1f00::/32 us 2607:2000::/32 pr +2607:2100::/32 us 2607:2200::/32 us +2607:2300::/32 us 2607:2400::/32 us +2607:2500::/32 ca 2607:2600::/32 us +2607:2700::/32 ca 2607:2800::/32 us +2607:2900::/32 ca 2607:2a00::/32 ca +2607:2b00::/32 us 2607:2c00::/32 us +2607:2d00::/32 ca 2607:2e00::/32 us +2607:2f00::/32 us 2607:3000::/32 us +2607:3100::/32 us 2607:3200::/32 us +2607:3300::/32 us 2607:3400::/32 us +2607:3500::/32 us 2607:3600::/32 us +2607:3700::/32 us 2607:3800::/32 us +2607:3900::/32 us 2607:3a00::/32 us +2607:3b00::/32 us 2607:3c00::/32 us +2607:3d00::/32 us 2607:3e00::/32 us +2607:3f00::/32 us 2607:4000::/32 us +2607:4100::/32 ca 2607:4200::/32 us +2607:4300::/32 us 2607:4400::/32 us +2607:4500::/32 us 2607:4600::/32 us +2607:4700::/32 us 2607:4800::/32 us +2607:4900::/32 us 2607:4a00::/32 us +2607:4b00::/32 us 2607:4c00::/32 ca +2607:4d00::/32 us 2607:4e00::/32 us +2607:4f00::/32 us 2607:5000::/32 us +2607:5100::/32 us 2607:5200::/32 us +2607:5300::/32 ca 2607:5400::/32 us +2607:5500::/32 us 2607:5600::/32 us +2607:5700::/32 us 2607:5800::/32 us 2607:5a00::/32 us +2607:5b00::/32 us 2607:5c00::/32 us +2607:5d00::/32 us 2607:5e00::/32 ca +2607:5f00::/32 us 2607:6000::/32 us +2607:6100::/32 us 2607:6200::/32 us +2607:6300::/32 us 2607:6400::/32 us +2607:6500::/32 ca 2607:6600::/32 us +2607:6700::/32 us 2607:6800::/32 us +2607:6900::/32 us 2607:6a00::/32 us +2607:6b00::/32 us 2607:6c00::/32 us +2607:6d00::/32 us 2607:6e00::/32 us +2607:6f00::/32 us 2607:7000::/32 us +2607:7100::/32 us 2607:7200::/32 ca +2607:7300::/32 ca 2607:7400::/32 us +2607:7500::/32 us 2607:7600::/32 ca +2607:7700::/32 us 2607:7800::/32 us +2607:7900::/32 us 2607:7a00::/32 us +2607:7b00::/32 ca 2607:7c00::/32 us +2607:7d00::/32 us 2607:7e00::/32 ca +2607:7f00::/32 us 2607:8000::/32 us +2607:8100::/32 us 2607:8200::/32 us +2607:8300::/32 us 2607:8400::/32 us +2607:8500::/32 us 2607:8600::/32 us +2607:8700::/32 ca 2607:8800::/32 us +2607:8900::/32 us 2607:8a00::/32 us +2607:8b00::/32 us 2607:8c00::/32 us +2607:8d00::/32 us 2607:8e00::/32 us +2607:8f00::/32 us 2607:9000::/32 us +2607:9100::/32 us 2607:9200::/32 us 2607:9400::/32 us +2607:9500::/32 ca 2607:9600::/32 us +2607:9700::/32 us 2607:9800::/32 us +2607:9900::/32 ca 2607:9a00::/32 us +2607:9b00::/32 us 2607:9c00::/32 us +2607:9d00::/32 us 2607:9e00::/32 us +2607:9f00::/32 us 2607:a000::/32 ca +2607:a100::/32 us 2607:a200::/32 us +2607:a300::/32 us 2607:a400::/32 us +2607:a500::/32 us 2607:a600::/32 us +2607:a700::/32 us 2607:a800::/32 us +2607:a900::/32 us 2607:aa00::/32 us +2607:ab00::/32 us 2607:ac00::/32 pr +2607:ad00::/32 us 2607:ae00::/32 ca +2607:af00::/32 us 2607:b000::/32 us +2607:b100::/32 us 2607:b200::/32 us +2607:b300::/32 us 2607:b400::/32 us +2607:b500::/32 us 2607:b600::/32 us +2607:b700::/32 us 2607:b800::/32 us +2607:b900::/32 ca 2607:ba00::/32 us +2607:bb00::/32 us 2607:bc00::/32 us +2607:bd00::/32 ca 2607:be00::/32 ca +2607:bf00::/32 us 2607:c000::/32 ca +2607:c100::/32 us 2607:c200::/32 us +2607:c300::/32 us 2607:c400::/32 us +2607:c500::/32 us 2607:c600::/32 us +2607:c700::/32 us 2607:c800::/32 us +2607:c900::/32 us 2607:ca00::/32 ca +2607:cb00::/32 us 2607:cc00::/32 us +2607:cd00::/32 us 2607:ce00::/32 us +2607:cf00::/32 us 2607:d000::/32 us +2607:d100::/32 us 2607:d200::/32 us +2607:d300::/32 us 2607:d400::/32 us +2607:d500::/32 ca 2607:d600::/32 us +2607:d700::/32 ca 2607:d800::/32 us +2607:d900::/32 us 2607:da00::/32 us 2607:dc00::/32 us +2607:dd00::/32 us 2607:de00::/32 ca +2607:df00::/32 us 2607:e000::/32 us +2607:e100::/32 us 2607:e200::/32 us +2607:e300::/32 us 2607:e400::/32 us +2607:e500::/32 us 2607:e600::/32 us +2607:e700::/32 us 2607:e800::/32 us +2607:e900::/32 us 2607:ea00::/32 us +2607:eb00::/32 ca 2607:ec00::/32 us +2607:ed00::/32 ca 2607:ee00::/32 ca +2607:ef00::/32 us 2607:f000::/32 us 2607:f008::/32 us 2607:f010::/32 us @@ -4412,13 +9423,11 @@ 2607:f0d0::/32 us 2607:f0d8::/32 us 2607:f0e8::/32 us -2607:f0f0::/32 us 2607:f0f8::/32 us 2607:f100::/32 us 2607:f108::/32 us 2607:f110::/32 us 2607:f118::/32 ca -2607:f120::/32 ca 2607:f128::/32 us 2607:f130::/32 us 2607:f138::/32 us @@ -4462,7 +9471,7 @@ 2607:f270::/32 us 2607:f278::/32 us 2607:f280::/32 us -2607:f288::/32 ca +2607:f288::/32 us 2607:f290::/32 us 2607:f298::/32 us 2607:f2a8::/32 us @@ -4475,11 +9484,10 @@ 2607:f2e8::/32 us 2607:f2f0::/32 us 2607:f2f8::/32 us -2607:f300::/32 us +2607:f300::/36 us 2607:f308::/32 us 2607:f310::/32 us 2607:f318::/32 us -2607:f320::/32 us 2607:f330::/32 us 2607:f338::/32 ca 2607:f340::/32 us @@ -4495,7 +9503,6 @@ 2607:f390::/32 us 2607:f398::/32 us 2607:f3a0::/32 us -2607:f3a8::/32 us 2607:f3b0::/32 us 2607:f3b8::/32 us 2607:f3c0::/32 us @@ -4503,19 +9510,16 @@ 2607:f3d0::/32 us 2607:f3d8::/32 ca 2607:f3e0::/32 ca -2607:f3e8::/32 us 2607:f3f0::/32 us 2607:f3f8::/32 us 2607:f400::/32 us 2607:f408::/32 us -2607:f410::/32 us 2607:f418::/32 us 2607:f420::/32 us 2607:f428::/32 us 2607:f430::/32 us 2607:f438::/32 us 2607:f440::/32 us -2607:f448::/32 us 2607:f450::/32 us 2607:f458::/32 us 2607:f460::/32 us @@ -4554,16 +9558,13 @@ 2607:f568::/32 us 2607:f570::/32 us 2607:f578::/32 us -2607:f580::/32 us 2607:f588::/32 us 2607:f590::/32 us 2607:f598::/32 us 2607:f5a0::/32 us 2607:f5a8::/32 us 2607:f5b0::/32 us -2607:f5b8::/32 us 2607:f5c0::/32 us -2607:f5c8::/32 us 2607:f5d0::/32 us 2607:f5d8::/32 us 2607:f5e0::/32 us @@ -4572,16 +9573,14 @@ 2607:f5f8::/32 us 2607:f600::/32 us 2607:f608::/32 us -2607:f610::/32 us +2607:f610::/36 us 2607:f618::/32 us 2607:f620::/32 us 2607:f628::/32 us 2607:f630::/32 us 2607:f638::/32 us 2607:f640::/32 us -2607:f648::/32 us 2607:f650::/32 us -2607:f658::/32 us 2607:f660::/32 us 2607:f668::/32 us 2607:f670::/32 us @@ -4608,7 +9607,6 @@ 2607:f718::/32 us 2607:f720::/32 us 2607:f728::/32 us -2607:f730::/32 us 2607:f738::/32 us 2607:f740::/32 us 2607:f748::/32 ca @@ -4667,7 +9665,6 @@ 2607:f900::/32 us 2607:f908::/32 us 2607:f910::/32 us -2607:f918::/32 us 2607:f920::/32 us 2607:f928::/32 us 2607:f930::/32 us @@ -4675,7 +9672,6 @@ 2607:f940::/32 us 2607:f948::/32 us 2607:f950::/32 us -2607:f958::/32 us 2607:f960::/32 us 2607:f968::/32 us 2607:f978::/32 us @@ -4690,7 +9686,7 @@ 2607:f9c8::/32 us 2607:f9d0::/32 us 2607:f9d8::/32 us -2607:f9e0::/32 us +2607:f9e0::/36 us 2607:f9f0::/32 us 2607:f9f8::/32 us 2607:fa00::/32 us @@ -4702,13 +9698,11 @@ 2607:fa38::/32 us 2607:fa40::/32 us 2607:fa48::/32 ca -2607:fa50::/32 us 2607:fa58::/32 us 2607:fa60::/32 us 2607:fa68::/32 us 2607:fa70::/32 us 2607:fa78::/32 us -2607:fa80::/32 us 2607:fa88::/32 us 2607:fa90::/32 us 2607:fa98::/32 us @@ -4717,7 +9711,7 @@ 2607:fab0::/32 us 2607:fab8::/32 us 2607:fac0::/32 us -2607:fac8::/32 us +2607:fac8::/36 us 2607:fad0::/32 us 2607:fad8::/32 ca 2607:fae0::/32 us @@ -4737,7 +9731,6 @@ 2607:fb50::/32 us 2607:fb58::/32 us 2607:fb60::/32 us -2607:fb68::/32 us 2607:fb70::/32 us 2607:fb78::/32 us 2607:fb80::/32 us @@ -4749,7 +9742,6 @@ 2607:fbb0::/32 us 2607:fbb8::/32 us 2607:fbc0::/32 us -2607:fbc8::/32 us 2607:fbd0::/32 us 2607:fbd8::/32 ca 2607:fbe0::/32 us @@ -4759,7 +9751,7 @@ 2607:fc00::/32 us 2607:fc08::/32 us 2607:fc10::/32 ca -2607:fc18::/32 us +2607:fc18::/36 us 2607:fc20::/32 us 2607:fc28::/32 us 2607:fc30::/32 us @@ -4772,7 +9764,6 @@ 2607:fc68::/32 us 2607:fc70::/32 ca 2607:fc78::/32 ca -2607:fc80::/32 us 2607:fc88::/32 us 2607:fc90::/32 us 2607:fc98::/32 us @@ -4790,8 +9781,6 @@ 2607:fd00::/32 us 2607:fd08::/32 us 2607:fd10::/32 us -2607:fd18::/32 us -2607:fd20::/32 ca 2607:fd28::/32 us 2607:fd30::/32 us 2607:fd38::/32 us @@ -4805,7 +9794,6 @@ 2607:fd80::/32 us 2607:fd88::/32 us 2607:fd90::/32 us -2607:fd98::/32 us 2607:fda0::/32 us 2607:fda8::/32 us 2607:fdb0::/32 us @@ -4821,7 +9809,7 @@ 2607:fe00::/32 jm 2607:fe08::/32 us 2607:fe10::/32 us -2607:fe18::/32 us +2607:fe18::/36 us 2607:fe20::/32 us 2607:fe28::/32 us 2607:fe30::/32 us @@ -4848,7 +9836,6 @@ 2607:fed8::/32 us 2607:fee0::/32 us 2607:fee8::/32 us -2607:fef0::/32 us 2607:fef8::/32 us 2607:ff00::/32 us 2607:ff08::/32 us @@ -4889,7 +9876,15 @@ 2609:a000::/32 us 2609:c000::/32 us 2609:e000::/32 us +260c::/22 us +260c:2000::/32 us +260c:4000::/32 us +260c:6000::/32 us +260c:8000::/32 us +260c:a000::/32 us +260c:c000::/32 us 260c:d000::/32 us +260c:e000::/32 us 260c:f000::/32 us 260f:d000::/32 us 260f:f000::/32 us @@ -4907,10 +9902,8 @@ 2610:58::/32 us 2610:60::/32 us 2610:68::/32 us -2610:70::/32 us 2610:78::/32 ca 2610:80::/32 us -2610:90::/32 us 2610:98::/32 ca 2610:a0::/32 us 2610:b0::/32 us @@ -4918,18 +9911,15 @@ 2610:c0::/32 us 2610:c8::/32 us 2610:d0::/32 us -2610:d8::/32 us 2610:e0::/32 us 2610:e8::/32 us 2610:f0::/32 us 2610:f8::/32 us 2610:100::/32 us 2610:108::/32 us -2610:110::/32 us 2610:120::/32 us 2610:128::/32 us 2610:130::/32 us -2610:140::/32 us 2610:148::/32 us 2610:150::/32 us 2610:158::/32 us @@ -4956,7 +9946,6 @@ 2620:0:10::/48 us 2620:0:20::/48 us 2620:0:30::/48 us -2620:0:40::/48 us 2620:0:60::/48 us 2620:0:70::/48 us 2620:0:80::/48 us @@ -4967,7 +9956,6 @@ 2620:0:f0::/48 ca 2620:0:100::/48 us 2620:0:110::/48 us -2620:0:120::/48 us 2620:0:140::/48 us 2620:0:150::/48 us 2620:0:160::/48 ca @@ -4986,28 +9974,19 @@ 2620:0:240::/48 us 2620:0:250::/48 us 2620:0:260::/48 us -2620:0:270::/48 us 2620:0:280::/48 us 2620:0:290::/48 us -2620:0:2a0::/48 us 2620:0:2b0::/48 us 2620:0:2c0::/48 us 2620:0:2d0::/48 us 2620:0:2f0::/48 us 2620:0:300::/48 us -2620:0:310::/48 us 2620:0:320::/48 us -2620:0:330::/48 us -2620:0:340::/48 us 2620:0:350::/48 us 2620:0:360::/48 us -2620:0:370::/48 us -2620:0:380::/48 us 2620:0:390::/48 us -2620:0:3a0::/48 us 2620:0:3b0::/48 us 2620:0:3c0::/48 us -2620:0:3d0::/48 us 2620:0:3e0::/48 us 2620:0:3f0::/48 us 2620:0:400::/48 us @@ -5029,7 +10008,6 @@ 2620:0:700::/48 us 2620:0:800::/48 us 2620:0:810::/48 ca -2620:0:820::/48 us 2620:0:840::/48 us 2620:0:850::/48 us 2620:0:860::/48 us @@ -5061,30 +10039,25 @@ 2620:0:b20::/48 us 2620:0:b30::/48 us 2620:0:b40::/48 us -2620:0:b50::/48 us 2620:0:b60::/48 us 2620:0:b80::/48 us 2620:0:b90::/48 us 2620:0:ba0::/48 us 2620:0:bb0::/48 us -2620:0:bc0::/48 us 2620:0:bd0::/48 ca 2620:0:be0::/48 us 2620:0:bf0::/48 us 2620:0:c10::/48 us -2620:0:c20::/48 us 2620:0:c30::/48 us 2620:0:c40::/48 us 2620:0:c60::/48 us 2620:0:c70::/48 us 2620:0:c80::/48 us 2620:0:c90::/48 us -2620:0:ca0::/48 us 2620:0:cb0::/48 us 2620:0:cc0::/48 us 2620:0:ce0::/48 us 2620:0:cf0::/48 us -2620:0:d00::/48 us 2620:0:d20::/48 us 2620:0:d30::/48 us 2620:0:d50::/48 us @@ -5100,13 +10073,11 @@ 2620:0:e10::/48 us 2620:0:e20::/48 us 2620:0:e30::/48 us -2620:0:e40::/48 us 2620:0:e50::/48 us 2620:0:e60::/48 us 2620:0:e80::/48 us 2620:0:e90::/48 us 2620:0:ea0::/48 us -2620:0:eb0::/48 us 2620:0:ed0::/48 us 2620:0:ee0::/48 us 2620:0:ef0::/48 us @@ -5123,7 +10094,6 @@ 2620:0:1a30::/48 us 2620:0:1a40::/48 us 2620:0:1a50::/48 us -2620:0:1a60::/48 us 2620:0:1a70::/48 us 2620:0:1a80::/48 us 2620:0:1aa0::/48 us @@ -5135,13 +10105,11 @@ 2620:0:1b00::/48 us 2620:0:1c00::/48 us 2620:0:2000::/48 us -2620:0:2100::/48 us 2620:0:2210::/48 us 2620:0:2220::/48 ca 2620:0:2240::/48 us 2620:0:2250::/48 us 2620:0:2260::/48 us -2620:0:2270::/48 us 2620:0:2280::/48 us 2620:0:2290::/48 us 2620:0:22a0::/48 us @@ -5162,43 +10130,31 @@ 2620:0:2870::/48 us 2620:0:2880::/48 us 2620:0:28a0::/48 us -2620:0:28b0::/48 us -2620:0:28c0::/48 us 2620:0:28d0::/48 us -2620:0:28e0::/48 us 2620:0:28f0::/48 us 2620:0:2900::/48 us 2620:0:2a00::/48 us 2620:0:2b00::/48 us 2620:0:2b10::/48 us -2620:0:2b20::/48 us 2620:0:2b30::/48 us -2620:0:2b40::/48 us 2620:0:2b50::/48 us 2620:0:2b60::/48 us 2620:0:2b70::/48 us -2620:0:2b80::/48 us 2620:0:2bc0::/48 us -2620:0:2bd0::/48 us 2620:0:2be0::/48 us -2620:0:2bf0::/48 us -2620:0:2c00::/48 us 2620:0:2d00::/48 us 2620:0:2e00::/48 us 2620:0:2e10::/48 us -2620:0:2e20::/48 us 2620:0:2e30::/48 us 2620:0:2e40::/48 us 2620:0:2e50::/48 us 2620:0:2e60::/48 us 2620:0:2e70::/48 us -2620:0:2e80::/48 us 2620:0:2ea0::/48 us 2620:0:2eb0::/48 us 2620:0:2ed0::/48 us 2620:0:2ee0::/48 us 2620:0:2f00::/48 us -2620:0:3000::/48 us 2620:0:5000::/48 us 2620:0:5010::/48 us 2620:0:5030::/48 us @@ -5217,427 +10173,965 @@ 2620:0:5100::/48 us 2620:0:5200::/48 us 2620:0:5300::/48 us +2620:0:aa00::/48 us 2620:1::/48 us +2620:1:4000::/48 us 2620:1:8000::/48 us +2620:1:c000::/48 us 2620:2::/48 us +2620:2:4000::/48 ca 2620:2:8000::/48 us +2620:2:c000::/48 us 2620:3::/48 us +2620:3:4000::/48 us 2620:3:8000::/48 us +2620:3:c000::/48 us 2620:4::/48 us +2620:4:4000::/48 us 2620:4:8000::/48 us +2620:4:c000::/48 us 2620:5::/48 us +2620:5:4000::/48 us 2620:5:8000::/48 us +2620:5:c000::/48 us 2620:6::/48 ca +2620:6:4000::/48 us 2620:6:8000::/48 us +2620:6:c000::/48 us 2620:7::/48 us +2620:7:4000::/48 us 2620:7:8000::/48 us +2620:7:c000::/48 us 2620:8::/41 ca +2620:8:8200::/48 us 2620:9::/48 us +2620:9:4000::/48 us 2620:9:8000::/48 us -2620:a::/48 ca +2620:9:c000::/48 us +2620:a::/44 ca +2620:a:4000::/48 us 2620:a:8000::/48 us +2620:a:c000::/48 us 2620:b::/48 us +2620:b:4000::/48 us 2620:b:8000::/48 us -2620:c::/46 us +2620:b:c000::/48 us +2620:c::/44 us +2620:c:4000::/48 us 2620:c:8000::/48 us +2620:c:c000::/48 us 2620:d::/48 us +2620:d:4000::/48 us 2620:d:8000::/48 us +2620:d:c000::/48 us 2620:e::/48 us +2620:e:4000::/48 us 2620:e:8000::/48 us -2620:f::/46 us +2620:e:c000::/48 us +2620:f::/44 us +2620:f:4000::/48 us 2620:f:8000::/48 us +2620:f:c000::/48 us 2620:10::/48 us +2620:10:4000::/48 us 2620:10:8000::/48 ca -2620:11::/48 us +2620:10:c000::/48 us +2620:11::/40 us +2620:11:4000::/48 us 2620:11:8000::/48 us +2620:11:c000::/48 us 2620:12::/48 us +2620:12:4000::/48 us 2620:12:8000::/48 us +2620:12:c000::/48 us 2620:13::/48 ca +2620:13:4000::/48 us 2620:13:8000::/48 us +2620:13:c000::/48 us 2620:14::/48 us +2620:14:4000::/48 us 2620:14:8000::/48 us +2620:14:c000::/48 ca 2620:15::/48 us 2620:15:8000::/48 us +2620:15:c000::/48 us 2620:16::/48 ca +2620:16:4000::/48 us 2620:16:8000::/48 us +2620:16:c000::/48 us 2620:17::/48 us +2620:17:4000::/48 us 2620:17:8000::/48 us +2620:17:c000::/48 us 2620:18::/48 us +2620:18:4000::/48 us 2620:18:8000::/48 us +2620:18:c000::/48 kn 2620:19::/48 us +2620:19:4000::/48 ca 2620:19:8000::/48 us +2620:19:c000::/48 us 2620:1a::/48 us +2620:1a:4000::/48 us 2620:1a:8000::/48 us -2620:1b::/48 us +2620:1a:c000::/48 us +2620:1b::/44 us +2620:1b:4000::/48 us 2620:1b:8000::/48 us +2620:1b:c000::/48 us 2620:1c::/48 us +2620:1c:4000::/48 us 2620:1c:8000::/48 us -2620:1d::/48 us +2620:1c:c000::/48 us +2620:1d::/44 us +2620:1d:4000::/48 us 2620:1d:8000::/48 us +2620:1d:c000::/48 us 2620:1e::/48 us +2620:1e:4000::/48 us 2620:1e:8000::/48 us +2620:1e:c000::/48 us 2620:1f::/48 us +2620:1f:4000::/48 ca 2620:1f:8000::/48 us +2620:1f:c000::/48 us 2620:20::/48 us +2620:20:4000::/48 us 2620:20:8000::/48 us +2620:20:c000::/48 us 2620:21::/48 us +2620:21:4000::/48 us 2620:21:8000::/48 us +2620:21:c000::/48 ca +2620:22::/48 us +2620:22:4000::/48 ca 2620:22:8000::/48 us +2620:22:c000::/48 us 2620:23::/48 us +2620:23:4000::/48 us 2620:23:8000::/48 us +2620:23:c000::/48 us 2620:24::/43 us +2620:24:8080::/48 us 2620:25::/48 us +2620:25:4000::/48 us 2620:25:8000::/48 us +2620:25:c000::/48 us 2620:26::/48 us +2620:26:4000::/48 us 2620:26:8000::/48 us +2620:26:c000::/48 us 2620:27::/44 us +2620:27:8080::/48 us 2620:28::/48 us +2620:28:4000::/48 us 2620:28:8000::/48 us +2620:28:c000::/48 us 2620:29::/48 us -2620:29:8000::/48 us +2620:29:4000::/48 us +2620:29:c000::/48 us 2620:2a::/48 us +2620:2a:4000::/48 us 2620:2a:8000::/48 us +2620:2a:c000::/48 us 2620:2b::/48 us +2620:2b:4000::/48 us 2620:2b:8000::/48 us 2620:2c::/44 us +2620:2c:8080::/48 us 2620:2d::/48 us +2620:2d:4000::/48 us 2620:2d:8000::/48 us +2620:2d:c000::/48 us 2620:2e::/42 us +2620:2e:8080::/48 us 2620:2f::/48 ca +2620:2f:4000::/48 us 2620:2f:8000::/48 us -2620:30::/48 us +2620:2f:c000::/48 us +2620:30::/44 us +2620:30:4000::/48 us 2620:30:8000::/48 us +2620:30:c000::/48 us 2620:31::/48 us +2620:31:4000::/48 us 2620:31:8000::/48 us +2620:31:c000::/48 us 2620:32::/48 us +2620:32:4000::/48 ca 2620:32:8000::/48 us +2620:32:c000::/48 us 2620:33::/48 us +2620:33:4000::/48 us 2620:33:8000::/48 us +2620:33:c000::/48 us 2620:34::/48 us +2620:34:4000::/48 us 2620:34:8000::/48 us -2620:35::/48 us +2620:34:c000::/48 us +2620:35:4000::/48 ca 2620:35:8000::/48 ca +2620:35:c000::/48 us +2620:36::/48 us +2620:36:4000::/48 ca 2620:36:8000::/48 us +2620:36:c000::/48 ca 2620:37::/48 us +2620:37:4000::/48 us +2620:37:8000::/48 us +2620:37:c000::/48 us 2620:38::/48 us +2620:38:4000::/48 us 2620:38:8000::/48 us +2620:38:c000::/48 us 2620:39::/48 us +2620:39:4000::/48 us 2620:39:8000::/48 us +2620:39:c000::/48 us 2620:3a::/48 us +2620:3a:4000::/48 us 2620:3a:8000::/48 us +2620:3a:c000::/48 us 2620:3b::/48 us +2620:3b:4000::/48 us 2620:3b:8000::/48 us +2620:3b:c000::/48 us 2620:3c::/42 us +2620:3c:8080::/48 us 2620:3d::/48 us +2620:3d:4000::/48 us 2620:3d:8000::/48 us +2620:3d:c000::/48 ca 2620:3e::/48 us +2620:3e:4000::/48 us 2620:3e:8000::/48 us +2620:3e:c000::/48 us 2620:3f::/48 us +2620:3f:4000::/48 us 2620:3f:8000::/48 us +2620:3f:c000::/48 us 2620:40::/48 us +2620:40:4000::/48 us 2620:40:8000::/48 us -2620:41::/48 us +2620:40:c000::/48 us +2620:41::/47 us +2620:41:4000::/48 us 2620:41:8000::/48 us 2620:42::/48 us -2620:42:8000::/48 us +2620:42:4000::/48 us +2620:42:c000::/48 ca 2620:43::/48 us +2620:43:4000::/48 us 2620:43:8000::/48 us +2620:43:c000::/48 us 2620:44::/47 us +2620:44:4000::/48 us 2620:44:8000::/48 us 2620:45::/48 ca +2620:45:4000::/48 us 2620:45:8000::/48 us +2620:45:c000::/48 us 2620:46::/48 us +2620:46:4000::/48 ca 2620:46:8000::/48 us +2620:46:c000::/48 us 2620:47::/48 us +2620:47:4000::/48 us 2620:47:8000::/48 us +2620:47:c000::/48 us 2620:48::/48 us +2620:48:4000::/48 us 2620:48:8000::/48 us +2620:48:c000::/48 us 2620:49::/44 ca +2620:49:8080::/48 us 2620:4a::/48 us +2620:4a:4000::/48 us 2620:4a:8000::/48 us -2620:4b::/48 us +2620:4a:c000::/48 us +2620:4b::/48 ca +2620:4b:4000::/48 us 2620:4b:8000::/48 us +2620:4b:c000::/48 us 2620:4c::/47 us -2620:4c:8000::/48 us +2620:4c:4000::/48 us +2620:4c:c000::/48 us 2620:4d::/48 us +2620:4d:4000::/48 us 2620:4d:8000::/48 us +2620:4d:c000::/48 us 2620:4e::/48 us +2620:4e:4000::/48 ca 2620:4e:8000::/48 us +2620:4e:c000::/48 us 2620:4f::/48 us +2620:4f:4000::/48 us 2620:4f:8000::/48 us +2620:4f:c000::/48 us 2620:50::/44 us +2620:50:8080::/48 us 2620:51::/48 us +2620:51:4000::/48 ca 2620:51:8000::/48 ca +2620:51:c000::/48 us 2620:52::/46 us +2620:52:4000::/48 us 2620:52:8000::/48 us +2620:52:c000::/48 us 2620:53::/48 us +2620:53:4000::/48 us 2620:53:8000::/48 us +2620:53:c000::/48 us 2620:54::/48 us +2620:54:4000::/48 us 2620:54:8000::/48 us +2620:54:c000::/48 ca 2620:55::/48 us +2620:55:4000::/48 us 2620:55:8000::/48 us +2620:55:c000::/48 us 2620:56::/48 us +2620:56:4000::/48 us 2620:56:8000::/48 us +2620:56:c000::/48 us 2620:57::/48 us +2620:57:4000::/48 ky 2620:57:8000::/48 us +2620:57:c000::/48 us 2620:58::/40 us +2620:58:8800::/48 us 2620:59::/48 us +2620:59:4000::/48 us 2620:59:8000::/48 us +2620:59:c000::/48 us 2620:5a::/48 us +2620:5a:4000::/48 ca 2620:5a:8000::/48 us +2620:5a:c000::/48 us 2620:5b::/48 us +2620:5b:4000::/48 us 2620:5b:8000::/48 ca +2620:5b:c000::/48 ca 2620:5c::/48 us 2620:5c:8000::/48 us +2620:5c:c000::/48 us 2620:5d::/48 us +2620:5d:4000::/48 us 2620:5d:8000::/48 us +2620:5d:c000::/48 us 2620:5e::/48 us +2620:5e:4000::/48 ca 2620:5e:8000::/48 us +2620:5e:c000::/48 ca 2620:5f::/48 us +2620:5f:4000::/48 us 2620:5f:8000::/48 us +2620:5f:c000::/48 us 2620:60::/48 us +2620:60:4000::/48 us 2620:60:8000::/48 ca 2620:61::/48 ca +2620:61:4000::/48 us 2620:61:8000::/48 us +2620:61:c000::/48 us 2620:62::/48 us +2620:62:4000::/48 ca 2620:62:8000::/48 us +2620:62:c000::/48 us 2620:63::/48 us +2620:63:4000::/48 us 2620:63:8000::/48 us +2620:63:c000::/48 us 2620:64::/48 us -2620:64:8000::/48 ca -2620:65::/48 us +2620:64:4000::/48 us +2620:64:c000::/48 us +2620:65::/40 us 2620:65:8000::/48 us +2620:65:c000::/48 us 2620:66::/48 ca +2620:66:4000::/48 us 2620:66:8000::/48 us +2620:66:c000::/48 us 2620:67::/48 us +2620:67:4000::/48 us 2620:67:8000::/48 us +2620:67:c000::/48 us 2620:68::/48 us +2620:68:4000::/48 us 2620:68:8000::/48 ca -2620:69::/48 us +2620:68:c000::/48 us +2620:69:4000::/48 us 2620:69:8000::/48 us +2620:69:c000::/48 ca 2620:6a::/48 us +2620:6a:4000::/48 ca 2620:6a:8000::/48 us +2620:6a:c000::/48 ca 2620:6b::/48 us +2620:6b:4000::/48 us 2620:6b:8000::/48 us +2620:6b:c000::/48 us 2620:6c::/42 us -2620:6d::/48 us +2620:6c:8080::/48 us +2620:6d:40::/48 us 2620:6d:8000::/48 us +2620:6d:c000::/48 us 2620:6e::/48 us +2620:6e:4000::/48 us 2620:6e:8000::/48 us +2620:6e:c000::/48 us 2620:6f::/48 us +2620:6f:4000::/48 us 2620:6f:8000::/48 us +2620:6f:c000::/48 us 2620:70::/48 us +2620:70:4000::/48 us 2620:70:8000::/48 us +2620:70:c000::/48 us 2620:71::/48 us +2620:71:4000::/48 us 2620:71:8000::/48 us +2620:71:c000::/48 us 2620:72::/48 us +2620:72:4000::/48 us 2620:72:8000::/48 us +2620:72:c000::/48 us 2620:73::/48 us +2620:73:4000::/48 us 2620:73:8000::/48 us +2620:73:c000::/48 us 2620:74::/43 us +2620:74:8080::/48 us 2620:75::/48 us +2620:75:4000::/48 us +2620:75:8000::/48 us +2620:75:c000::/48 us 2620:76::/48 us +2620:76:4000::/48 us 2620:76:8000::/48 us +2620:76:c000::/48 us 2620:77::/48 us +2620:77:4000::/48 us 2620:77:8000::/48 us 2620:78::/48 us +2620:78:4000::/48 us 2620:78:8000::/48 us -2620:79::/48 us +2620:78:c000::/48 ca +2620:79::/44 us +2620:79:4000::/48 us 2620:79:8000::/48 us +2620:79:c000::/48 us 2620:7a::/48 us +2620:7a:4000::/48 us 2620:7a:8000::/48 us +2620:7a:c000::/48 us 2620:7b::/48 us +2620:7b:4000::/48 us 2620:7b:8000::/48 us +2620:7b:e000::/48 us 2620:7c:4000::/48 us +2620:7c:a000::/48 us 2620:7d::/48 us +2620:7d:4000::/48 us 2620:7d:8000::/48 us +2620:7d:c000::/48 us 2620:7e::/44 us +2620:7e:60c0::/48 us 2620:7e:c080::/48 us 2620:7f:8000::/48 ca -2620:80::/48 us +2620:7f:c000::/48 us +2620:80:4000::/48 us 2620:80:8000::/48 ca +2620:80:c000::/48 ca 2620:81::/48 us +2620:81:4000::/48 us 2620:81:8000::/48 us +2620:81:c000::/48 us 2620:82::/48 us +2620:82:4000::/48 us 2620:82:8000::/48 us +2620:82:c000::/48 us 2620:83::/48 us +2620:83:4000::/48 us 2620:83:8000::/48 us +2620:83:c000::/48 us 2620:84::/47 us +2620:84:4000::/48 us 2620:84:8000::/48 us +2620:84:c000::/48 us 2620:85::/48 us +2620:85:4000::/48 us 2620:85:8000::/48 us +2620:85:c000::/48 us 2620:86::/48 us +2620:86:4000::/48 us 2620:86:8000::/48 us +2620:86:c000::/48 us 2620:87::/48 us +2620:87:4000::/48 us 2620:87:8000::/48 us +2620:87:c000::/48 us 2620:88::/48 us +2620:88:4000::/48 us 2620:88:8000::/48 us +2620:88:c000::/48 us 2620:89::/48 us +2620:89:4000::/48 us 2620:89:8000::/48 us +2620:89:c000::/48 us 2620:8a::/48 us +2620:8a:4000::/48 ca 2620:8a:8000::/48 us +2620:8a:c000::/48 us 2620:8b::/48 us +2620:8b:4000::/48 us 2620:8b:8000::/48 ca -2620:8c::/48 us +2620:8b:c000::/48 us +2620:8c:4000::/48 us 2620:8c:8000::/48 us +2620:8c:c000::/48 us 2620:8d::/48 us +2620:8d:4000::/48 us 2620:8d:8000::/48 us +2620:8d:c000::/48 us 2620:8e::/48 us +2620:8e:4000::/48 us 2620:8e:8000::/48 us +2620:8e:c000::/48 us 2620:8f::/48 us +2620:8f:4000::/48 us 2620:8f:8000::/48 us -2620:90::/48 us +2620:8f:c000::/48 ca +2620:90::/48 ca +2620:90:4000::/48 us 2620:90:8000::/48 us +2620:90:c000::/48 us 2620:91::/48 us +2620:91:4000::/48 us 2620:91:8000::/48 us -2620:92::/48 us +2620:91:c000::/48 us +2620:92::/44 us +2620:92:4000::/48 us 2620:92:8000::/48 us +2620:92:c000::/48 ca 2620:93::/48 us +2620:93:4000::/48 us 2620:93:8000::/48 us +2620:93:c000::/48 us 2620:94::/48 us +2620:94:4000::/48 us 2620:94:8000::/48 us +2620:94:c000::/48 us 2620:95::/48 us +2620:95:4000::/48 us 2620:95:8000::/48 us +2620:95:c000::/48 us 2620:96::/48 us +2620:96:4000::/48 ca 2620:96:8000::/48 us +2620:96:c000::/48 us 2620:97::/48 us +2620:97:4000::/48 us 2620:97:8000::/48 us +2620:97:c000::/48 us 2620:98::/48 us +2620:98:4000::/48 ca 2620:98:8000::/48 us +2620:98:c000::/48 us 2620:99::/48 us 2620:99:8000::/48 us +2620:99:c000::/48 us 2620:9a::/48 ca +2620:9a:4000::/48 us 2620:9a:8000::/48 us +2620:9a:c000::/48 us 2620:9b::/48 us +2620:9b:4000::/48 us 2620:9b:8000::/48 us +2620:9b:c000::/48 us 2620:9c::/48 us +2620:9c:4000::/48 us 2620:9c:8000::/48 us +2620:9c:c000::/48 us 2620:9d::/48 us -2620:9d:8000::/48 us +2620:9d:4000::/48 us +2620:9d:c000::/48 us 2620:9e::/48 us +2620:9e:4000::/48 us 2620:9e:8000::/48 us -2620:9f::/48 us +2620:9e:c000::/48 us +2620:9f::/40 us 2620:9f:8000::/48 us +2620:9f:c000::/48 us 2620:a0::/48 us +2620:a0:4000::/48 us 2620:a0:8000::/48 us +2620:a0:c000::/48 us 2620:a1::/48 us +2620:a1:4000::/48 us 2620:a1:8000::/48 us +2620:a1:c000::/48 us 2620:a2::/48 us +2620:a2:4000::/48 us 2620:a2:8000::/48 us +2620:a2:c000::/48 us 2620:a3::/48 us +2620:a3:4000::/48 us 2620:a3:8000::/48 us -2620:a4::/44 us +2620:a3:c020::/48 us +2620:a4:40::/48 us +2620:a4:4060::/48 us +2620:a4:8080::/48 us 2620:a5::/48 us +2620:a5:4000::/48 us 2620:a5:8000::/48 us +2620:a5:c000::/48 us 2620:a6::/48 us +2620:a6:4000::/48 us 2620:a6:8000::/48 us +2620:a6:c000::/48 us 2620:a7::/48 us +2620:a7:4000::/48 us 2620:a7:8000::/48 us +2620:a7:c000::/48 us 2620:a8::/48 us +2620:a8:4000::/48 us 2620:a8:8000::/48 us +2620:a8:c000::/48 us 2620:a9::/48 us +2620:a9:4000::/48 us 2620:a9:8000::/48 us 2620:aa::/48 us +2620:aa:4000::/48 us 2620:aa:8000::/48 us +2620:aa:c000::/48 us 2620:ab::/48 us +2620:ab:4000::/48 us 2620:ab:8000::/48 us +2620:ab:c000::/48 us 2620:ac::/48 us +2620:ac:4000::/48 ca 2620:ac:8000::/48 us +2620:ac:c000::/48 us 2620:ad::/48 us +2620:ad:4000::/48 us 2620:ad:8000::/48 us +2620:ad:c000::/48 ca 2620:ae::/48 ca +2620:ae:4000::/48 us 2620:ae:8000::/48 us +2620:ae:c000::/48 ca 2620:af::/48 us +2620:af:4000::/48 us 2620:af:8000::/48 us +2620:af:c000::/48 ca 2620:b0::/48 ca +2620:b0:4000::/48 us 2620:b0:8000::/48 us +2620:b0:c000::/48 us 2620:b1::/48 us +2620:b1:4000::/48 us 2620:b1:8000::/48 us +2620:b1:c000::/48 us 2620:b2::/48 us +2620:b2:4000::/48 ca 2620:b2:8000::/48 us +2620:b2:c000::/48 us 2620:b3::/48 us +2620:b3:4000::/48 us 2620:b3:8000::/48 us +2620:b3:c000::/48 us 2620:b4::/48 us +2620:b4:4000::/48 us 2620:b4:8000::/48 ca +2620:b4:c000::/48 us 2620:b5::/48 us +2620:b5:4000::/48 us 2620:b5:8000::/48 us +2620:b5:c000::/48 us +2620:b6:4000::/48 us 2620:b6:8000::/48 us +2620:b6:c000::/48 us 2620:b7::/48 us +2620:b7:4000::/48 ca 2620:b7:8000::/48 ca +2620:b7:c000::/48 us 2620:b8::/48 us +2620:b8:4000::/48 ca +2620:b8:8000::/48 us +2620:b8:c000::/48 us 2620:b9::/48 us -2620:ba::/48 us +2620:b9:4000::/48 us +2620:b9:8000::/48 us +2620:b9:c000::/48 us +2620:ba::/40 us +2620:ba:4000::/48 us +2620:ba:8000::/48 us +2620:ba:c000::/48 us 2620:bb::/48 us -2620:bc::/48 us +2620:bb:4000::/48 us +2620:bb:8000::/48 us +2620:bb:c000::/48 us +2620:bc:4000::/48 us +2620:bc:8000::/48 us +2620:bc:c000::/48 us 2620:bd::/48 ca +2620:bd:4000::/48 ca +2620:bd:8000::/48 us +2620:bd:c000::/48 us 2620:be::/48 us +2620:be:4000::/48 us +2620:be:8000::/48 us +2620:be:c000::/48 us 2620:bf::/48 us +2620:bf:4000::/48 us +2620:bf:8000::/48 us +2620:bf:c000::/48 us 2620:c0::/48 us +2620:c0:4000::/48 us +2620:c0:8000::/48 us +2620:c0:c000::/48 us 2620:c1::/48 us +2620:c1:4000::/48 us +2620:c1:8000::/48 us +2620:c1:c000::/48 ca 2620:c2::/48 ca +2620:c2:4000::/48 us +2620:c2:8000::/48 us +2620:c2:c000::/48 us 2620:c3::/48 us +2620:c3:4000::/48 us +2620:c3:8000::/48 us +2620:c3:c000::/48 us 2620:c4::/48 us +2620:c4:4000::/48 us +2620:c4:8000::/48 us +2620:c4:c000::/48 ca 2620:c5::/48 us +2620:c5:4000::/48 us +2620:c5:8000::/48 us +2620:c5:c000::/48 us 2620:c6::/48 us +2620:c6:4000::/48 us +2620:c6:8000::/48 us +2620:c6:c000::/48 us 2620:c7::/48 us +2620:c7:4000::/48 us +2620:c7:8000::/48 us +2620:c7:c000::/48 us 2620:c8::/48 us +2620:c8:4000::/48 us +2620:c8:8000::/48 us +2620:c8:c000::/48 us 2620:c9::/48 us +2620:c9:4000::/48 us +2620:c9:8000::/48 us +2620:c9:c000::/48 us 2620:ca::/48 us -2620:cb::/48 us +2620:ca:4000::/48 us +2620:ca:8000::/48 us +2620:ca:c000::/48 us +2620:cb::/44 us +2620:cb:4000::/48 us +2620:cb:8000::/48 ca +2620:cb:c000::/48 us 2620:cc::/48 us +2620:cc:4000::/48 us +2620:cc:8000::/48 us +2620:cc:c000::/48 us 2620:cd::/48 us +2620:cd:4000::/48 us +2620:cd:8000::/48 us +2620:cd:c000::/48 us 2620:ce::/48 us -2620:cf::/48 us +2620:ce:4000::/48 us +2620:ce:8000::/48 us +2620:ce:c000::/48 us +2620:cf:4000::/48 us +2620:cf:8000::/48 us +2620:cf:c000::/48 us 2620:d0::/48 us +2620:d0:4000::/48 us +2620:d0:8000::/48 us +2620:d0:c000::/48 us 2620:d1::/48 us +2620:d1:4000::/48 us +2620:d1:8000::/48 us +2620:d1:c000::/48 us 2620:d2::/48 us +2620:d2:4000::/48 us +2620:d2:8000::/48 us +2620:d2:c000::/48 ca 2620:d3::/48 us +2620:d3:4000::/48 us +2620:d3:8000::/48 us +2620:d3:c000::/48 us 2620:d4::/48 us +2620:d4:4000::/48 us +2620:d4:8000::/48 us +2620:d4:c000::/48 us 2620:d5::/48 us +2620:d5:4000::/48 us +2620:d5:8000::/48 us +2620:d5:c000::/48 us 2620:d6::/48 us +2620:d6:4000::/48 us +2620:d6:8000::/48 us +2620:d6:c000::/48 us 2620:d7::/48 us +2620:d7:4000::/48 ca +2620:d7:8000::/48 us +2620:d7:c000::/48 us 2620:d8::/48 us +2620:d8:4000::/48 us +2620:d8:8000::/48 us +2620:d8:c000::/48 us 2620:d9::/48 us +2620:d9:4000::/48 us +2620:d9:8000::/48 us +2620:d9:c000::/48 us 2620:da::/48 us +2620:da:4000::/48 us +2620:da:c000::/48 us 2620:db::/48 us +2620:db:4000::/48 ca +2620:db:8000::/48 us +2620:db:c000::/48 us 2620:dc::/48 us 2620:dc:8::/48 us +2620:dc:4000::/48 us +2620:dc:8000::/48 ca +2620:dc:c000::/48 us 2620:dd::/48 ca +2620:dd:4000::/48 us +2620:dd:8000::/48 us +2620:dd:c000::/48 us 2620:de::/48 us +2620:de:4000::/48 us +2620:de:8000::/48 us +2620:de:c000::/48 us 2620:df::/48 us +2620:df:4000::/48 us +2620:df:8000::/48 us +2620:df:c000::/48 us 2620:e0::/48 us +2620:e0:4000::/48 us +2620:e0:8000::/48 us +2620:e0:c000::/48 us 2620:e1::/48 us +2620:e1:4000::/48 us +2620:e1:8000::/48 us +2620:e1:c000::/48 vg 2620:e2::/48 us +2620:e2:4000::/48 us +2620:e2:8000::/48 us +2620:e2:c000::/48 us 2620:e3::/48 us +2620:e3:4000::/48 us +2620:e3:8000::/48 us +2620:e3:c000::/48 us 2620:e4::/48 us +2620:e4:4000::/48 us +2620:e4:8000::/48 us +2620:e4:c000::/48 us 2620:e5::/48 us +2620:e5:4000::/48 us +2620:e5:8000::/48 us +2620:e5:c000::/48 us +2620:e6::/48 us +2620:e6:4000::/48 us +2620:e6:8000::/48 us +2620:e6:c000::/48 us 2620:e7::/48 us +2620:e7:4000::/48 us +2620:e7:8000::/48 ca +2620:e7:c000::/48 us 2620:e8::/48 us +2620:e8:4000::/48 us +2620:e8:8000::/48 us +2620:e8:c000::/48 us 2620:e9::/48 us -2620:ea::/48 us +2620:e9:4000::/48 us +2620:e9:8000::/48 us +2620:e9:c000::/48 us +2620:ea::/44 us +2620:ea:4000::/48 us +2620:ea:8000::/48 us +2620:ea:c000::/48 us 2620:eb::/48 us +2620:eb:4000::/48 us +2620:eb:8000::/48 us +2620:eb:c000::/48 us 2620:ec::/48 us +2620:ec:4000::/48 us +2620:ec:8000::/48 us +2620:ec:c000::/48 us 2620:ed::/48 us +2620:ed:4000::/48 ca +2620:ed:8000::/48 us +2620:ed:c000::/48 us 2620:ee::/48 us +2620:ee:4000::/48 us +2620:ee:8000::/48 us +2620:ee:c000::/48 us 2620:ef::/48 us +2620:ef:4000::/48 us +2620:ef:8000::/48 us +2620:ef:c000::/48 us 2620:f0::/48 us +2620:f0:4000::/48 us +2620:f0:8000::/48 us +2620:f0:c000::/48 us 2620:f1::/48 us +2620:f1:4000::/48 ca +2620:f1:8000::/48 us +2620:f1:c000::/48 us 2620:f2::/48 ca +2620:f2:4000::/48 us +2620:f2:8000::/48 us +2620:f2:c000::/48 us 2620:f3::/48 us +2620:f3:4000::/48 us +2620:f3:8000::/48 us +2620:f3:c000::/48 us 2620:f4::/48 us +2620:f4:4000::/48 us +2620:f4:8000::/48 ca +2620:f4:c000::/48 us 2620:f5::/48 us -2620:f6::/48 ca +2620:f5:4000::/48 us +2620:f5:8000::/48 us +2620:f5:c000::/48 us +2620:f6:4000::/48 us +2620:f6:8000::/48 us +2620:f6:c000::/48 ca 2620:f7::/48 us +2620:f7:4000::/48 us +2620:f7:8000::/48 us +2620:f7:c000::/48 us 2620:f8::/48 us +2620:f8:4000::/48 us +2620:f8:8000::/48 us +2620:f8:c000::/48 us 2620:f9::/44 us +2620:f9:4000::/48 us +2620:f9:8000::/48 us +2620:f9:c000::/48 us 2620:fa::/48 us +2620:fa:4000::/48 us +2620:fa:8000::/48 ca +2620:fa:c000::/48 us 2620:fb::/48 us +2620:fb:4000::/48 us +2620:fb:8000::/48 us 2620:fc::/48 ca +2620:fc:8000::/48 us 2620:fd::/48 ca -2620:fe::/48 us +2620:fd:8000::/48 us +2620:fe:8000::/48 us 2620:ff::/48 us +2620:ff:8000::/48 us 2620:100::/44 us -2620:100:1000::/48 us 2620:100:3000::/48 us 2620:100:4000::/48 us 2620:100:5000::/48 us @@ -5659,15 +11153,13 @@ 2620:101:6000::/48 us 2620:101:7000::/48 us 2620:101:8000::/48 us -2620:101:9000::/48 ca -2620:101:a000::/48 us +2620:101:9000::/48 us 2620:101:b000::/48 us 2620:101:c000::/48 ca 2620:101:d000::/48 us 2620:101:e000::/48 us 2620:101:f000::/48 ca 2620:102::/44 us -2620:102:1000::/48 us 2620:102:2000::/48 us 2620:102:3000::/48 us 2620:102:4000::/48 us @@ -5676,7 +11168,6 @@ 2620:102:7000::/48 us 2620:102:8000::/48 us 2620:102:9000::/48 us -2620:102:a000::/48 us 2620:102:b000::/48 us 2620:102:c000::/48 us 2620:102:d000::/48 us @@ -5697,7 +11188,6 @@ 2620:103:c000::/48 us 2620:103:d000::/48 us 2620:103:e000::/48 us -2620:103:f000::/48 us 2620:104::/40 us 2620:104:1000::/48 us 2620:104:2000::/48 us @@ -5757,7 +11247,6 @@ 2620:107:8000::/48 us 2620:107:9000::/48 us 2620:107:a000::/48 us -2620:107:b000::/48 us 2620:107:c000::/48 us 2620:107:d000::/48 us 2620:107:e000::/48 us @@ -5780,6 +11269,453 @@ 2620:108:f000::/48 us 2620:109::/40 us 2620:109:1000::/48 us +2620:109:2000::/48 us +2620:109:3000::/48 us +2620:109:4000::/48 us +2620:109:5000::/48 us +2620:109:6000::/48 us +2620:109:7000::/48 us +2620:109:8000::/48 us +2620:109:9000::/48 us +2620:109:a000::/48 us +2620:109:b000::/48 us +2620:109:c000::/48 us +2620:109:d000::/48 us +2620:109:e000::/48 us +2620:109:f000::/48 us +2620:10a::/44 us +2620:10a:1000::/48 us +2620:10a:2000::/48 us +2620:10a:3000::/48 us +2620:10a:4000::/48 us +2620:10a:5000::/48 us +2620:10a:6000::/48 us +2620:10a:8000::/48 ca +2620:10a:9000::/48 us +2620:10a:a000::/48 us +2620:10a:b000::/48 us +2620:10a:c000::/48 us +2620:10a:d000::/48 us +2620:10a:e000::/48 us +2620:10a:f000::/48 us +2620:10b::/44 us +2620:10b:1000::/48 us +2620:10b:2000::/48 us +2620:10b:3000::/48 ca +2620:10b:4000::/48 us +2620:10b:5000::/48 us +2620:10b:6000::/48 us +2620:10b:7000::/48 us +2620:10b:8000::/48 us +2620:10b:9000::/48 us +2620:10b:a000::/48 us +2620:10b:b000::/48 ca +2620:10b:c000::/48 us +2620:10b:d000::/48 us +2620:10b:e000::/48 us +2620:10b:f000::/48 us +2620:10c::/44 us +2620:10c:1000::/48 us +2620:10c:2000::/48 us +2620:10c:3000::/48 us +2620:10c:4000::/48 us +2620:10c:5000::/48 us +2620:10c:6000::/48 us +2620:10c:7000::/48 us +2620:10c:9000::/48 us +2620:10c:a000::/48 us +2620:10c:b000::/48 us +2620:10c:c000::/48 us +2620:10c:d000::/48 us +2620:10c:e000::/48 us +2620:10c:f000::/48 us +2620:10d::/44 us +2620:10d:1000::/48 us +2620:10d:2000::/48 us +2620:10d:3000::/48 us +2620:10d:4000::/48 us +2620:10d:5000::/48 us +2620:10d:6000::/48 us +2620:10d:7000::/48 us +2620:10d:8000::/48 us +2620:10d:9000::/48 us +2620:10d:a000::/48 us +2620:10d:b000::/48 us +2620:10d:c000::/48 us +2620:10d:d000::/48 ca +2620:10d:e000::/48 ca +2620:10d:f000::/48 us +2620:10e::/44 us +2620:10e:1000::/48 us +2620:10e:2000::/48 us +2620:10e:3000::/48 us +2620:10e:4000::/48 us +2620:10e:5000::/48 us +2620:10e:6000::/48 us +2620:10e:7000::/48 us +2620:10e:8000::/48 us +2620:10e:9000::/48 us +2620:10e:a000::/48 us +2620:10e:b000::/48 us +2620:10e:c000::/48 us +2620:10e:d000::/48 bl +2620:10e:e000::/48 us +2620:10e:f000::/48 us +2620:10f::/44 us +2620:10f:1000::/48 us +2620:10f:2000::/48 us +2620:10f:3000::/48 us +2620:10f:4000::/48 us +2620:10f:5000::/48 us +2620:10f:6000::/48 us +2620:10f:7000::/48 us +2620:10f:8000::/48 us +2620:10f:9000::/48 us +2620:10f:a000::/48 us +2620:10f:b000::/48 us +2620:10f:c000::/48 us +2620:10f:d000::/48 us +2620:10f:e000::/48 us +2620:10f:f000::/48 us +2620:110::/44 us +2620:110:1000::/48 us +2620:110:2000::/48 us +2620:110:3000::/48 us +2620:110:4000::/48 us +2620:110:5000::/48 us +2620:110:6000::/48 us +2620:110:7000::/48 us +2620:110:8000::/48 us +2620:110:9000::/48 us +2620:110:a000::/48 us +2620:110:d000::/48 us +2620:110:e000::/48 us +2620:110:f000::/48 us +2620:111::/40 us +2620:111:1000::/48 us +2620:111:2000::/48 us +2620:111:3000::/48 us +2620:111:4000::/48 us +2620:111:5000::/48 us +2620:111:6000::/48 us +2620:111:7000::/48 us +2620:111:8000::/48 us +2620:111:9000::/48 us +2620:111:a000::/48 us +2620:111:b000::/48 us +2620:111:c000::/48 us +2620:111:d000::/48 us +2620:111:e000::/48 ca +2620:111:f000::/48 us +2620:112:1000::/48 us +2620:112:2000::/48 us +2620:112:3000::/48 us +2620:112:4000::/48 us +2620:112:5000::/48 us +2620:112:6000::/48 us +2620:112:8000::/48 us +2620:112:9000::/48 ca +2620:112:a000::/48 us +2620:112:b000::/48 us +2620:112:c000::/48 us +2620:112:d000::/48 us +2620:112:e000::/48 us +2620:112:f000::/48 us +2620:113::/44 us +2620:113:1000::/48 us +2620:113:2000::/48 ca +2620:113:3000::/48 us +2620:113:4000::/48 us +2620:113:5000::/48 us +2620:113:6000::/48 us +2620:113:7000::/48 us +2620:113:8000::/48 us +2620:113:9000::/48 us +2620:113:a000::/48 us +2620:113:b000::/48 us +2620:113:c000::/48 us +2620:113:d000::/48 us +2620:113:e000::/48 us +2620:113:f000::/48 us +2620:114::/44 us +2620:114:1000::/48 us +2620:114:2000::/48 us +2620:114:3000::/48 us +2620:114:5000::/48 us +2620:114:6000::/48 us +2620:114:8000::/48 us +2620:114:9000::/48 us +2620:114:a000::/48 us +2620:114:b000::/48 us +2620:114:c000::/48 us +2620:114:d000::/48 us +2620:114:e000::/48 us +2620:114:f000::/48 us +2620:115::/44 us +2620:115:1000::/48 us +2620:115:2000::/48 us +2620:115:3000::/48 us +2620:115:4000::/48 us +2620:115:5000::/48 us +2620:115:6000::/48 us +2620:115:7000::/48 us +2620:115:8000::/48 us +2620:115:9000::/48 us +2620:115:a000::/48 us +2620:115:b000::/48 us +2620:115:c000::/48 us +2620:115:d000::/48 us +2620:115:e000::/48 us +2620:115:f000::/48 us +2620:116::/44 us +2620:116:1000::/48 us +2620:116:2000::/48 us +2620:116:3000::/48 us +2620:116:4000::/48 us +2620:116:5000::/48 us +2620:116:6000::/48 us +2620:116:7000::/48 us +2620:116:8000::/48 us +2620:116:9000::/48 ca +2620:116:a000::/48 us +2620:116:b000::/48 us +2620:116:c000::/48 us +2620:116:d000::/48 ca +2620:116:e000::/48 ca +2620:116:f000::/48 us +2620:117::/40 us +2620:117:1000::/48 us +2620:117:2000::/48 us +2620:117:3000::/48 us +2620:117:4000::/48 us +2620:117:5000::/48 us +2620:117:6000::/48 us +2620:117:7000::/48 us +2620:117:8000::/48 us +2620:117:9000::/48 us +2620:117:a000::/48 us +2620:117:b000::/48 us +2620:117:c000::/48 us +2620:117:d000::/48 ca +2620:117:e000::/48 us +2620:117:f000::/48 us +2620:118::/44 us +2620:118:1000::/48 us +2620:118:2000::/48 us +2620:118:3000::/48 us +2620:118:4000::/48 us +2620:118:5000::/48 us +2620:118:6000::/48 us +2620:118:7000::/48 us +2620:118:8000::/48 us +2620:118:9000::/48 us +2620:118:a000::/48 us +2620:118:b000::/48 us +2620:118:c000::/48 us +2620:118:d000::/48 us +2620:118:e000::/48 us +2620:118:f000::/48 us +2620:119::/40 us +2620:119:1000::/48 us +2620:119:2000::/48 us +2620:119:3000::/48 us +2620:119:4000::/48 us +2620:119:5000::/48 us +2620:119:6000::/48 us +2620:119:7000::/48 us +2620:119:8000::/48 us +2620:119:9000::/48 us +2620:119:a000::/48 us +2620:119:b000::/48 us +2620:119:c000::/48 us +2620:119:d000::/48 us +2620:119:e000::/48 us +2620:119:f000::/48 us +2620:11a::/40 us +2620:11a:1000::/48 ca +2620:11a:3000::/48 us +2620:11a:4000::/48 us +2620:11a:5000::/48 us +2620:11a:6000::/48 us +2620:11a:7000::/48 us +2620:11a:8000::/48 us +2620:11a:9000::/48 us +2620:11a:a000::/48 us +2620:11a:b000::/48 us +2620:11a:c000::/48 us +2620:11a:d000::/48 us +2620:11a:e000::/48 us +2620:11a:f000::/48 us +2620:11b::/40 us +2620:11b:1000::/48 us +2620:11b:2000::/48 us +2620:11b:3000::/48 us +2620:11b:4000::/48 us +2620:11b:5000::/48 us +2620:11b:6000::/48 us +2620:11b:7000::/48 us +2620:11b:8000::/48 us +2620:11b:9000::/48 us +2620:11b:a000::/48 us +2620:11b:b000::/48 us +2620:11b:c000::/48 us +2620:11b:d000::/48 us +2620:11b:e000::/48 us +2620:11b:f000::/48 us +2620:11c::/44 us +2620:11c:1000::/48 bb +2620:11c:2000::/48 ca +2620:11c:3000::/48 us +2620:11c:4000::/48 us +2620:11c:5000::/48 us +2620:11c:6000::/48 us +2620:11c:7000::/48 us +2620:11c:8000::/48 us +2620:11c:9000::/48 us +2620:11c:a000::/48 us +2620:11c:b000::/48 us +2620:11c:c000::/48 ca +2620:11c:d000::/48 us +2620:11c:e000::/48 us +2620:11c:f000::/48 us +2620:11d::/44 us +2620:11d:1000::/48 us +2620:11d:2000::/48 us +2620:11d:3000::/48 us +2620:11d:4000::/48 us +2620:11d:5000::/48 us +2620:11d:6000::/48 us +2620:11d:7000::/48 us +2620:11d:8000::/48 us +2620:11d:9000::/48 us +2620:11d:a000::/48 us +2620:11d:b000::/48 us +2620:11d:c000::/48 us +2620:11d:d000::/48 us +2620:11d:e000::/48 us +2620:11d:f000::/48 ca +2620:11e::/40 us +2620:11e:1000::/48 us +2620:11e:2000::/48 us +2620:11e:3000::/48 us +2620:11e:4000::/48 us +2620:11e:5000::/48 us +2620:11e:6000::/48 us +2620:11e:7000::/48 us +2620:11e:8000::/48 us +2620:11e:9000::/48 us +2620:11e:a000::/48 us +2620:11e:b000::/48 us +2620:11e:c000::/48 us +2620:11e:d000::/48 ca +2620:11e:e000::/48 us +2620:11e:f000::/48 us +2620:11f::/44 us +2620:11f:1000::/48 us +2620:11f:2000::/48 us +2620:11f:3000::/48 us +2620:11f:4000::/48 us +2620:11f:5000::/48 us +2620:11f:6000::/48 us +2620:11f:7000::/48 us +2620:11f:8000::/48 ca +2620:11f:9000::/48 us +2620:11f:a000::/48 us +2620:11f:b000::/48 us +2620:11f:c000::/48 us +2620:11f:d000::/48 us +2620:11f:e000::/48 us +2620:11f:f000::/48 us +2620:120::/40 us +2620:120:1000::/48 us +2620:120:2000::/48 us +2620:120:3000::/48 us +2620:120:4000::/48 us +2620:120:5000::/48 us +2620:120:6000::/48 us +2620:120:7000::/48 us +2620:120:8000::/48 ca +2620:120:9000::/48 ca +2620:120:a000::/48 us +2620:120:b000::/48 us +2620:120:c000::/48 us +2620:120:d000::/48 us +2620:120:e000::/48 us +2620:120:f000::/48 us +2620:121::/44 us +2620:121:1000::/48 us +2620:121:2000::/48 us +2620:121:3000::/48 us +2620:121:4000::/48 us +2620:121:5000::/48 us +2620:121:6000::/48 us +2620:121:7000::/48 us +2620:121:8000::/48 us +2620:121:9000::/48 us +2620:121:a000::/48 us +2620:121:b000::/48 us +2620:121:c000::/48 us +2620:121:d000::/48 us +2620:121:e000::/48 us +2620:121:f000::/48 us +2620:122::/44 us +2620:122:1000::/48 us +2620:122:2000::/48 us +2620:122:3000::/48 us +2620:122:4000::/48 us +2620:122:5000::/48 us +2620:122:6000::/48 us +2620:122:7000::/48 us +2620:122:8000::/48 us +2620:122:9000::/48 us +2620:122:a000::/48 bl +2620:122:b000::/48 us +2620:122:c000::/48 us +2620:122:d000::/48 us +2620:122:e000::/48 us +2620:122:f000::/48 us +2620:123::/44 us +2620:123:1000::/48 us +2620:123:2000::/48 us +2620:123:3000::/48 us +2620:123:4000::/48 us +2620:123:5000::/48 us +2620:123:6000::/48 ca +2620:123:7000::/48 ca +2620:123:8000::/48 us +2620:123:9000::/48 us +2620:123:a000::/48 us +2620:123:b000::/48 us +2620:123:c000::/48 us +2620:123:d000::/48 us +2620:123:e000::/48 us +2620:123:f000::/48 us +2620:124::/44 us +2620:124:1000::/48 us +2620:124:2000::/48 us +2620:124:3000::/48 us +2620:124:4000::/48 us +2620:124:5000::/48 ca +2620:124:6000::/48 us +2620:124:7000::/48 us +2620:124:8000::/48 us +2620:124:9000::/48 us +2620:124:a000::/48 us +2620:124:b000::/48 ca +2620:124:c000::/48 us +2620:124:d000::/48 us +2620:124:e000::/48 us +2620:124:f000::/48 us +2620:125::/40 us +2620:125:1000::/48 us +2620:125:2000::/48 us +2620:125:3000::/48 us +2620:125:4000::/48 us +2620:125:5000::/48 ca +2620:125:6000::/48 us +2620:125:7000::/48 us +2620:125:8000::/48 us +2620:125:9000::/48 us 2620:140::/38 us 2620:141::/36 us 2620:143::/37 us @@ -5798,26 +11734,84 @@ 2620:151::/36 us 2620:152::/36 us 2620:153::/36 us +2620:154::/36 us +2620:155::/36 us +2620:156::/36 us +2620:157::/36 us +2620:158::/36 us +2620:159::/36 us +2620:15a::/36 us +2620:15b::/36 us +2620:15c::/36 us +2620:15d::/36 us +2620:15f::/36 us 2620:160::/32 us -2620:180::/32 us +2620:162::/36 us +2620:163::/36 us +2620:164::/36 us +2620:165::/36 us +2620:166::/36 us +2620:167::/36 us +2620:168::/36 us +2620:16a::/36 us +2620:16b::/36 us +2620:16d::/36 us +2620:170::/36 us +2620:171::/36 us +2620:172::/36 us +2620:173::/36 us +2620:174::/36 us +2620:175::/36 ca +2620:176::/36 us +2620:178::/36 us +2620:179::/36 us +2620:17a::/36 us +2620:17b::/36 us +2620:17c::/36 us +2620:17e::/36 us +2620:17f::/32 us 2620:190::/32 us 2620:1a0::/32 us 2620:1b0::/32 us 2620:1c0::/32 us +2620:1d0::/32 us +2620:1d2::/32 ca +2620:1d3::/36 us +2620:1d6::/36 us +2620:1e0::/36 us +2620:1e2::/36 us +2620:1e3::/36 us +2620:1e4::/32 ca +2620:1e5::/36 us +2620:1e6::/36 us +2620:1e7::/36 us +2620:1e8::/36 us +2620:1e9::/36 us +2620:1ea::/36 us +2620:1eb::/36 us +2620:1ec::/36 us +2620:1ee::/36 us +2620:1ef::/36 us +2620:1f0::/36 us +2620:1f2::/36 us +2620:1f5::/36 ca +2620:1f6::/36 us +2620:1f7::/36 us +2620:1fa::/36 us +2620:1fc::/36 us +2620:1fd::/36 us +2620:1fe::/36 us +2620:1ff::/36 us 2800:8::/32 cl 2800:10::/32 ni 2800:18::/32 pe -2800:20::/32 ar -2800:30::/32 ve +2800:20::/32 ve 2800:38::/32 ve 2800:40::/32 ar 2800:48::/32 ar -2800:50::/32 co -2800:58::/32 pa -2800:60::/32 pa 2800:68::/32 ec 2800:70::/32 tt -2800:78::/32 co +2800:80::/32 cw 2800:88::/32 bo 2800:90::/32 sv 2800:98::/32 gt @@ -5828,10 +11822,10 @@ 2800:110::/32 ar 2800:120::/32 pe 2800:130::/32 ec -2800:140::/32 ve +2800:140::/32 pa 2800:150::/32 cl 2800:160::/32 cl -2800:170::/32 gt +2800:170::/32 ve 2800:180::/32 tt 2800:190::/32 ar 2800:1a0::/32 gt @@ -5847,11 +11841,12 @@ 2800:250::/32 uy 2800:260::/32 co 2800:270::/32 cl +2800:280::/32 sx 2800:290::/32 cl 2800:2a0::/32 ec 2800:2b0::/32 ar -2800:2c0::/32 ar 2800:2d0::/32 co +2800:2e0::/32 cw 2800:2f0::/32 ec 2800:300::/32 cl 2800:310::/32 co @@ -5876,6 +11871,7 @@ 2800:440::/32 ec 2800:450::/32 cr 2800:460::/32 cl +2800:470::/32 sx 2800:480::/32 co 2800:490::/32 co 2800:4b0::/32 pe @@ -5885,7 +11881,7 @@ 2800:4f0::/32 ec 2800:500::/32 ve 2800:510::/32 cr -2800:520::/32 tt +2800:530::/32 cw 2800:540::/32 cl 2800:550::/32 cl 2800:560::/32 ar @@ -5917,7 +11913,6 @@ 2800:700::/32 uy 2800:800::/32 co 2800:810::/32 ar -2800:820::/32 ar 2800:830::/32 ec 2800:840::/32 uy 2800:850::/32 ar @@ -5945,9 +11940,11 @@ 2800:9b0::/32 cr 2800:9c0::/32 ar 2800:9d0::/32 ar +2800:9e0::/32 cw 2800:9f0::/32 co 2800:a00::/32 ar 2800:a10::/32 ar +2800:a20::/32 cw 2800:a30::/32 ar 2800:a40::/32 ar 2800:a50::/32 ar @@ -5961,18 +11958,42 @@ 2800:ad0::/32 aw 2800:ae0::/32 co 2800:af0::/32 ar +2800:b00::/32 bq 2800:b10::/32 hn 2800:b20::/32 sv 2800:b30::/32 ec 2800:b40::/32 co -2800:b50::/32 ar 2800:b60::/32 ar 2800:b70::/32 co 2800:b80::/32 ar 2800:b90::/32 cr 2800:ba0::/32 ar 2800:bb0::/32 ar +2800:bc0::/32 us +2800:bd0::/32 ve +2800:be0::/32 cl +2800:bf0::/32 ec +2800:c00::/32 ar +2800:c10::/32 ec +2800:c20::/32 cr +2800:c30::/32 ar +2800:c40::/32 ec +2800:c50::/32 ar +2800:c70::/32 py +2800:c80::/32 ar +2800:c90::/32 do +2800:ca0::/32 ar +2800:cb0::/32 ar +2800:cc0::/32 pe +2800:cd0::/32 bo +2800:ce0::/32 pa +2800:cf0::/32 ar +2800:d00::/32 ar +2800:d10::/32 ar +2800:d20::/32 do +2800:e00::/32 tt 2800:1000::/32 ve +2800:2000::/32 ar 2800:a000::/32 ve 2800:a008::/32 ve 2800:a010::/32 ve @@ -5982,6 +12003,7 @@ 2800:a030::/32 ve 2800:a038::/32 ve 2800:b000::/32 ar +2800:d300::/32 cr 2801::/48 uy 2801:0:10::/48 cl 2801:0:20::/48 ec @@ -5992,7 +12014,6 @@ 2801:0:70::/48 co 2801:0:80::/48 do 2801:0:90::/48 ar -2801:0:a0::/48 ar 2801:0:b0::/48 cl 2801:0:c0::/48 cr 2801:0:100::/48 co @@ -6012,22 +12033,4135 @@ 2801:0:1e0::/48 co 2801:0:1f0::/48 py 2801:0:200::/48 ve +2801:0:210::/48 co +2801:0:220::/48 ar +2801:0:240::/48 pa +2801:0:250::/48 ar +2801:0:260::/48 ar +2801:0:270::/48 ec +2801:0:280::/48 co +2801:0:290::/48 ar +2801:0:2a0::/48 cr +2801:0:2b0::/48 pa +2801:0:2c0::/48 hn +2801:0:2d0::/48 pa +2801:0:2e0::/48 co +2801:0:2f0::/48 ar +2801:0:300::/48 co +2801:0:310::/48 cw +2801:0:320::/48 co +2801:0:330::/48 ht +2801:0:340::/48 co +2801:0:350::/48 ar +2801:0:360::/48 co +2801:0:370::/48 co +2801:0:380::/48 cl +2801:0:390::/48 co +2801:0:3b0::/48 co +2801:0:3c0::/48 co +2801:0:3e0::/48 ar +2801:0:3f0::/48 ar +2801:0:400::/48 cl +2801:0:410::/48 ec +2801:0:420::/48 ec +2801:0:440::/48 ar +2801:0:480::/48 co +2801:0:490::/48 pa +2801:0:4a0::/48 cr +2801:0:4c0::/48 co +2801:0:4d0::/48 ec +2801:0:4e0::/48 cl +2801:0:4f0::/48 co +2801:0:2000::/48 uy 2801:1::/32 cr -2801:80::/32 br +2801:2::/32 cl +2801:10::/45 ar +2801:10:1000::/48 ar +2801:10:2000::/48 ar +2801:10:4000::/48 ar +2801:10:6000::/48 hn +2801:10:8000::/48 ar +2801:10:9000::/48 py +2801:10:a000::/48 ar +2801:10:c000::/48 co +2801:10:e000::/48 ar +2801:11::/48 ar +2801:11:1000::/48 py +2801:11:2000::/48 ar +2801:11:4000::/48 co +2801:11:6000::/48 ar +2801:11:8000::/48 co +2801:11:a000::/48 ve +2801:11:c000::/48 ar +2801:11:e000::/48 co +2801:12::/48 py +2801:12:1000::/48 bo +2801:12:2000::/48 hn +2801:12:4000::/48 co +2801:12:6000::/48 sv +2801:12:8000::/48 ar +2801:12:c000::/48 ar +2801:12:e000::/48 pa +2801:13::/48 ve +2801:13:1000::/48 ar +2801:13:2000::/48 ar +2801:13:4000::/48 cl +2801:13:6000::/48 gt +2801:13:8000::/48 sv +2801:13:a000::/48 co +2801:13:c000::/48 tt +2801:13:e000::/48 co +2801:14::/48 co +2801:14:1000::/48 cl +2801:14:2000::/48 ar +2801:14:4000::/48 co +2801:14:6000::/48 bo +2801:14:8000::/48 co +2801:14:a000::/48 uy +2801:14:c000::/48 bo +2801:14:e000::/48 py +2801:15::/48 ec +2801:15:1000::/48 sv +2801:15:2000::/48 cr +2801:15:4000::/48 co +2801:15:6000::/48 sv +2801:15:8000::/48 cr +2801:15:a000::/48 do +2801:15:c000::/48 gt +2801:15:e000::/48 do +2801:16::/48 cw +2801:16:e0::/48 gy +2801:16:1000::/48 ar +2801:16:2000::/48 hn +2801:16:4000::/48 ar +2801:16:6000::/48 ar +2801:16:8000::/48 co +2801:16:a000::/48 cr +2801:16:c000::/48 ar +2801:17::/48 cl +2801:17:1000::/48 hn +2801:17:2000::/48 py +2801:17:4000::/48 co +2801:17:6000::/48 ar +2801:17:8000::/48 cr +2801:17:a000::/48 ht +2801:17:c000::/48 pa +2801:17:e000::/48 ar +2801:18::/48 cr +2801:18:1000::/48 pa +2801:18:2000::/48 co +2801:18:6000::/48 ar +2801:18:8000::/48 ar +2801:18:a000::/48 bo +2801:18:c000::/48 ar +2801:18:e000::/48 do +2801:19::/48 ar +2801:19:1000::/48 pa +2801:19:2000::/48 cl +2801:19:4000::/48 py +2801:19:6000::/48 cw +2801:19:8000::/48 ec +2801:19:a000::/48 bo +2801:19:c000::/48 ar +2801:19:e000::/48 co +2801:1a::/48 co +2801:1a:1000::/48 cl +2801:1a:2000::/48 sr +2801:1a:4000::/48 co +2801:1a:6000::/48 cr +2801:1a:8000::/48 cl +2801:1a:a000::/48 ar +2801:1a:c000::/48 co +2801:1a:e000::/48 do +2801:1b::/48 cr +2801:1b:1000::/48 cl +2801:1b:2000::/48 uy +2801:1b:4000::/48 cl +2801:1b:6000::/48 cl +2801:1b:8000::/48 cl +2801:1b:a000::/48 ar +2801:1b:c000::/48 pa +2801:1b:e000::/48 ni +2801:1c::/48 py +2801:1c:1000::/48 pe +2801:1c:2000::/48 pe +2801:1c:4000::/48 co +2801:1c:6000::/48 pa +2801:1c:8000::/48 ec +2801:1c:a000::/48 co +2801:1c:c000::/48 hn +2801:1c:e000::/48 co +2801:1d::/48 py +2801:1d:1000::/48 ar +2801:1d:2000::/48 gt +2801:1d:4000::/48 tt +2801:1d:6000::/48 ni +2801:1d:8000::/48 ar +2801:1d:a000::/48 cr +2801:1d:c000::/48 ar +2801:1d:e000::/48 co +2801:1e::/48 ec +2801:1e:1000::/48 ar +2801:1e:2000::/48 ar +2801:1e:4000::/48 ar +2801:1e:6000::/48 co +2801:1e:8000::/48 cr +2801:1e:a000::/48 ar +2801:1e:e000::/48 sv +2801:1f::/48 ar +2801:1f:1000::/48 hn +2801:1f:2000::/48 cr +2801:1f:4000::/48 cr +2801:1f:6000::/48 ar +2801:1f:8000::/48 ar +2801:1f:a000::/48 cl +2801:1f:c000::/48 cr +2801:1f:e000::/48 ar +2801:80::/48 br +2801:80:10::/48 br +2801:80:20::/48 br +2801:80:40::/48 br +2801:80:50::/48 br +2801:80:60::/48 br +2801:80:70::/48 br +2801:80:80::/48 br +2801:80:90::/48 br +2801:80:a0::/48 br +2801:80:b0::/48 br +2801:80:c0::/48 br +2801:80:d0::/48 br +2801:80:e0::/48 br +2801:80:f0::/48 br +2801:80:100::/48 br +2801:80:110::/48 br +2801:80:120::/48 br +2801:80:130::/48 br +2801:80:140::/48 br +2801:80:150::/48 br +2801:80:160::/48 br +2801:80:170::/48 br +2801:80:180::/48 br +2801:80:190::/48 br +2801:80:1a0::/48 br +2801:80:1b0::/48 br +2801:80:1c0::/48 br +2801:80:1d0::/48 br +2801:80:1e0::/48 br +2801:80:1f0::/48 br +2801:80:200::/48 br +2801:80:210::/48 br +2801:80:220::/48 br +2801:80:230::/48 br +2801:80:240::/48 br +2801:80:250::/48 br +2801:80:260::/48 br +2801:80:270::/48 br +2801:80:280::/48 br +2801:80:290::/48 br +2801:80:2a0::/48 br +2801:80:2b0::/48 br +2801:80:2c0::/48 br +2801:80:2d0::/48 br +2801:80:2e0::/48 br +2801:80:2f0::/48 br +2801:80:300::/48 br +2801:80:320::/48 br +2801:80:330::/48 br +2801:80:340::/48 br +2801:80:350::/48 br +2801:80:360::/48 br +2801:80:370::/48 br +2801:80:380::/48 br +2801:80:390::/48 br +2801:80:3a0::/48 br +2801:80:3b0::/48 br +2801:80:3c0::/48 br +2801:80:3d0::/48 br +2801:80:3e0::/48 br +2801:80:3f0::/48 br +2801:80:400::/48 br +2801:80:410::/48 br +2801:80:420::/48 br +2801:80:430::/48 br +2801:80:440::/48 br +2801:80:450::/48 br +2801:80:460::/48 br +2801:80:470::/48 br +2801:80:480::/48 br +2801:80:490::/48 br +2801:80:4a0::/48 br +2801:80:4b0::/48 br +2801:80:4c0::/48 br +2801:80:4d0::/48 br +2801:80:4e0::/48 br +2801:80:4f0::/48 br +2801:80:500::/48 br +2801:80:510::/48 br +2801:80:520::/48 br +2801:80:530::/48 br +2801:80:540::/48 br +2801:80:550::/48 br +2801:80:560::/48 br +2801:80:570::/48 br +2801:80:580::/48 br +2801:80:590::/48 br +2801:80:5a0::/48 br +2801:80:5b0::/48 br +2801:80:5c0::/48 br +2801:80:5d0::/48 br +2801:80:5e0::/48 br +2801:80:5f0::/48 br +2801:80:600::/48 br +2801:80:610::/48 br +2801:80:620::/48 br +2801:80:630::/48 br +2801:80:640::/48 br +2801:80:650::/48 br +2801:80:660::/48 br +2801:80:670::/48 br +2801:80:680::/48 br +2801:80:690::/48 br +2801:80:6a0::/48 br +2801:80:6b0::/48 br +2801:80:6c0::/48 br +2801:80:6d0::/48 br +2801:80:6e0::/48 br +2801:80:710::/48 br +2801:80:720::/48 br +2801:80:730::/48 br +2801:80:740::/48 br +2801:80:750::/48 br +2801:80:760::/48 br +2801:80:770::/48 br +2801:80:780::/48 br +2801:80:790::/48 br +2801:80:7a0::/48 br +2801:80:7b0::/48 br +2801:80:7c0::/48 br +2801:80:7d0::/48 br +2801:80:7e0::/48 br +2801:80:7f0::/48 br +2801:80:800::/48 br +2801:80:810::/48 br +2801:80:820::/48 br +2801:80:830::/48 br +2801:80:840::/48 br +2801:80:850::/48 br +2801:80:860::/48 br +2801:80:870::/48 br +2801:80:880::/48 br +2801:80:890::/48 br +2801:80:8a0::/48 br +2801:80:8b0::/48 br +2801:80:8c0::/48 br +2801:80:8d0::/48 br +2801:80:8e0::/48 br +2801:80:8f0::/48 br +2801:80:900::/48 br +2801:80:910::/48 br +2801:80:920::/48 br +2801:80:930::/48 br +2801:80:940::/48 br +2801:80:950::/48 br +2801:80:960::/48 br +2801:80:970::/48 br +2801:80:980::/48 br +2801:80:990::/48 br +2801:80:9a0::/48 br +2801:80:9b0::/48 br +2801:80:9c0::/48 br +2801:80:9d0::/48 br +2801:80:9e0::/48 br +2801:80:9f0::/48 br +2801:80:a00::/48 br +2801:80:a10::/48 br +2801:80:a20::/48 br +2801:80:a30::/48 br +2801:80:a40::/48 br +2801:80:a50::/48 br +2801:80:a60::/48 br +2801:80:a70::/48 br +2801:80:a80::/48 br +2801:80:aa0::/48 br +2801:80:ab0::/48 br +2801:80:ac0::/48 br +2801:80:ad0::/48 br +2801:80:ae0::/48 br +2801:80:af0::/48 br +2801:80:b00::/48 br +2801:80:b10::/48 br +2801:80:b20::/48 br +2801:80:b30::/48 br +2801:80:b50::/48 br +2801:80:b60::/48 br +2801:80:b70::/48 br +2801:80:b80::/48 br +2801:80:b90::/48 br +2801:80:ba0::/48 br +2801:80:bc0::/48 br +2801:80:be0::/48 br +2801:80:bf0::/48 br +2801:80:c00::/48 br +2801:80:c10::/48 br +2801:80:c20::/48 br +2801:80:c30::/48 br +2801:80:c40::/48 br +2801:80:c50::/48 br +2801:80:c60::/48 br +2801:80:c70::/48 br +2801:80:c80::/48 br +2801:80:c90::/48 br +2801:80:ca0::/48 br +2801:80:cb0::/48 br +2801:80:cc0::/48 br +2801:80:cd0::/48 br +2801:80:ce0::/48 br +2801:80:cf0::/48 br +2801:80:d00::/48 br +2801:80:d10::/48 br +2801:80:d20::/48 br +2801:80:d40::/48 br +2801:80:d50::/48 br +2801:80:d60::/48 br +2801:80:d80::/48 br +2801:80:d90::/48 br +2801:80:da0::/48 br +2801:80:dc0::/48 br +2801:80:de0::/48 br +2801:80:df0::/48 br +2801:80:e00::/48 br +2801:80:e10::/48 br +2801:80:e20::/48 br +2801:80:e30::/48 br +2801:80:e40::/48 br +2801:80:e50::/48 br +2801:80:e60::/48 br +2801:80:e70::/48 br +2801:80:e80::/48 br +2801:80:e90::/48 br +2801:80:ea0::/48 br +2801:80:eb0::/48 br +2801:80:ec0::/48 br +2801:80:ed0::/48 br +2801:80:ee0::/48 br +2801:80:ef0::/48 br +2801:80:f00::/48 br +2801:80:f10::/48 br +2801:80:f20::/48 br +2801:80:f30::/48 br +2801:80:f40::/48 br +2801:80:f60::/48 br +2801:80:f70::/48 br +2801:80:f80::/48 br +2801:80:fa0::/48 br +2801:80:fc0::/48 br +2801:80:fd0::/48 br +2801:80:fe0::/48 br +2801:80:ff0::/48 br +2801:80:1000::/48 br +2801:80:1200::/48 br +2801:80:1210::/48 br +2801:80:1220::/48 br +2801:80:1230::/48 br +2801:80:1240::/48 br +2801:80:1250::/48 br +2801:80:1260::/48 br +2801:80:1280::/48 br +2801:80:1290::/48 br +2801:80:12a0::/48 br +2801:80:12b0::/48 br +2801:80:12c0::/48 br +2801:80:12d0::/48 br +2801:80:12e0::/48 br +2801:80:12f0::/48 br +2801:80:1300::/48 br +2801:80:1310::/48 br +2801:80:1320::/48 br +2801:80:1330::/48 br +2801:80:1340::/48 br +2801:80:1350::/48 br +2801:80:1360::/48 br +2801:80:1370::/48 br +2801:80:1380::/48 br +2801:80:1390::/48 br +2801:80:13a0::/48 br +2801:80:13b0::/48 br +2801:80:13c0::/48 br +2801:80:13d0::/48 br +2801:80:13e0::/48 br +2801:80:13f0::/48 br +2801:80:1400::/48 br +2801:80:1600::/48 br +2801:80:1610::/48 br +2801:80:1620::/48 br +2801:80:1640::/48 br +2801:80:1650::/48 br +2801:80:1660::/48 br +2801:80:1670::/48 br +2801:80:1680::/48 br +2801:80:1690::/48 br +2801:80:16a0::/48 br +2801:80:16b0::/48 br +2801:80:16c0::/48 br +2801:80:1700::/48 br +2801:82::/32 br +2801:84::/32 br +2801:86::/32 br +2801:88::/32 br +2801:8a::/32 br +2801:8c::/32 br +2801:8e::/32 br +2801:90::/32 br +2801:92::/32 br +2801:94::/32 br +2801:96::/32 br +2801:98::/32 br +2801:9a::/32 br +2801:9c::/32 br +2801:9e::/32 br +2801:a0::/32 br +2801:a2::/32 br +2801:a4::/32 br +2801:a6::/32 br +2801:a8::/32 br +2801:aa::/32 br +2801:ac::/32 br +2801:ae::/32 br +2801:b0::/32 br +2801:b2::/32 br +2801:b4::/32 br +2801:b6::/32 br +2801:b8::/32 br +2801:ba::/32 br +2801:bc::/32 br +2801:be::/32 br 2801:c0::/32 mx 2801:c4::/48 mx +2801:c4:10::/48 mx +2801:c4:12::/48 mx +2801:c4:20::/48 mx +2801:c4:30::/48 mx +2801:c4:40::/48 mx +2801:c4:50::/48 mx +2801:c4:60::/48 mx +2801:c4:80::/48 mx +2801:c4:90::/48 mx +2801:c4:a0::/48 mx +2801:c4:b0::/48 mx +2801:c5::/32 mx 2801:d0::/32 mx 2801:f0::/48 mx 2801:f0:16::/48 mx 2801:f0:20::/48 mx 2801:f0:28::/48 mx +2801:100::/40 ar +2801:108::/44 co +2801:110::/35 co +2801:118::/40 ar +2801:120::/32 ar +2801:128::/36 uy +2801:130::/36 co +2801:140::/32 ar +2801:148::/40 ar +2801:150::/32 pe +2801:158::/36 pa +2801:160::/40 co +2801:168::/40 ar +2801:170::/36 co +2801:180::/44 pa +2801:188::/40 ar +2801:190::/36 co +2801:198::/32 cl +2801:1a0::/42 co +2801:1a8::/40 ar +2801:1b0::/40 co +2801:1c0::/39 ar +2801:1c8::/36 co +2801:1d0::/44 co +2801:1e0::/41 ar +2801:1e8::/40 ar +2801:1f0::/32 ar 2802::/30 co -2804::/16 br +2803::/32 ar +2803:80::/32 cl +2803:b4::/32 bz +2803:100::/32 hn +2803:140::/32 ar +2803:180::/32 ni +2803:200::/32 pa +2803:240::/32 co +2803:280::/32 ar +2803:300::/32 do +2803:380::/32 cl +2803:400::/32 ar +2803:440::/32 ar +2803:480::/32 ec +2803:500::/32 pe +2803:540::/32 cr +2803:580::/32 ar +2803:600::/32 pa +2803:640::/32 ar +2803:680::/32 ar +2803:700::/32 ar +2803:780::/32 ve +2803:800::/32 ni +2803:840::/32 ar +2803:880::/32 ar +2803:900::/32 ar +2803:940::/32 cl +2803:980::/32 cr +2803:a00::/32 ar +2803:a40::/32 ni +2803:a80::/32 co +2803:b00::/32 ec +2803:b80::/32 pa +2803:c00::/32 ar +2803:c40::/32 co +2803:c80::/32 py +2803:d00::/32 gy +2803:d40::/32 pe +2803:d80::/32 co +2803:e00::/32 cl +2803:e40::/32 ar +2803:e80::/32 co +2803:f00::/32 pe +2803:f80::/32 ar +2803:1000::/32 sv +2803:1040::/32 ni +2803:1080::/32 ar +2803:1100::/32 cw +2803:1140::/32 do +2803:1180::/32 bo +2803:1200::/32 cl +2803:1240::/32 co +2803:1280::/32 pe +2803:1300::/32 cr +2803:1380::/32 hn +2803:1400::/32 do +2803:1440::/32 gt +2803:1500::/32 tt +2803:1540::/32 pe +2803:1580::/32 co +2803:1600::/32 bq +2803:1640::/32 ni +2803:1680::/32 gf +2803:1700::/32 ar +2803:1780::/32 co +2803:1800::/32 co +2803:1840::/32 co +2803:1880::/32 pe +2803:1900::/32 ar +2803:1940::/32 ar +2803:1980::/32 co +2803:1a00::/32 co +2803:1a40::/32 ar +2803:1a80::/32 cr +2803:1b00::/32 ar +2803:1b80::/32 tt +2803:1c40::/32 ni +2803:1c80::/32 ar +2803:1d00::/32 ar +2803:1d40::/32 pe +2803:1d80::/32 ar +2803:1e00::/32 ni +2803:1e40::/32 ar +2803:1e80::/32 ar +2803:1f00::/32 ar +2803:1f80::/32 ve +2803:2000::/32 ar +2803:2040::/32 cr +2803:2080::/32 hn +2803:2100::/32 pe +2803:2140::/32 ar +2803:2180::/32 co +2803:2200::/32 ec +2803:2240::/32 ar +2803:2280::/32 bz +2803:2300::/32 ar +2803:2380::/32 ar +2803:2400::/32 ar +2803:2440::/32 ar +2803:2480::/32 pe +2803:2500::/32 pe +2803:2540::/32 ec +2803:2580::/32 hn +2803:2600::/32 ar +2803:2640::/32 co +2803:2680::/32 uy +2803:2700::/32 ar +2803:2780::/32 ar +2803:2800::/32 cl +2803:2840::/32 bz +2803:2880::/32 bo +2803:2900::/32 pa +2803:2940::/32 pa +2803:2980::/32 ar +2803:2a00::/32 py +2803:2a40::/32 ar +2803:2a80::/32 co +2803:2b00::/32 pa +2803:2b80::/32 do +2803:2c00::/32 ar +2803:2c40::/32 ve +2803:2c80::/32 ve +2803:2d00::/32 ar +2803:2d40::/32 cl +2803:2d80::/32 pa +2803:2e00::/32 ec +2803:2e40::/32 pa +2803:2e80::/32 ar +2803:2f00::/32 ar +2803:2f80::/32 cl +2803:3000::/32 pa +2803:3040::/32 cw +2803:3100::/32 cr +2803:3140::/32 pe +2803:3180::/32 ar +2803:3200::/32 cr +2803:3240::/32 bz +2803:3280::/32 gt +2803:3300::/32 pe +2803:3380::/32 ar +2803:3400::/32 pa +2803:3440::/32 cl +2803:3480::/32 ar +2803:3500::/32 ar +2803:3540::/32 ar +2803:3580::/32 pe +2803:3600::/32 cr +2803:3640::/32 do +2803:3680::/32 ar +2803:3700::/32 do +2803:3780::/32 ar +2803:3800::/32 cl +2803:3840::/32 ar +2803:3880::/32 ar +2803:3900::/32 ve +2803:3940::/32 ar +2803:3980::/32 ve +2803:3a00::/32 gt +2803:3a40::/32 cl +2803:3a80::/32 hn +2803:3b00::/32 ar +2803:3b80::/32 cl +2803:3c00::/32 ec +2803:3c40::/32 ve +2803:3c80::/32 cl +2803:3d00::/32 bz +2803:3d80::/32 ar +2803:3e00::/32 ar +2803:3e40::/32 ar +2803:3e80::/32 co +2803:3f00::/32 hn +2803:3f80::/32 ar +2803:4000::/32 ar +2803:4040::/32 ar +2803:4080::/32 ar +2803:4100::/32 ar +2803:4140::/32 ar +2803:4180::/32 ec +2803:4200::/32 cl +2803:4240::/32 py +2803:4280::/32 ar +2803:4300::/32 pa +2803:4380::/32 bo +2803:4400::/32 ar +2803:4440::/32 ar +2803:4480::/32 pe +2803:4500::/32 cw +2803:4540::/32 hn +2803:4580::/32 cr +2803:4600::/32 hn +2803:4640::/32 cl +2803:4680::/32 tt +2803:4700::/32 ar +2803:4780::/32 pe +2803:4800::/32 pe +2803:4840::/32 ar +2803:4880::/32 ar +2803:4900::/32 bq +2803:4940::/32 ar +2803:4980::/32 ar +2803:4a40::/32 cl +2803:4a80::/32 ar +2803:4b00::/32 ar +2803:4b80::/32 ar +2803:4c00::/32 ec +2803:4c40::/32 ar +2803:4c80::/32 ar +2803:4d00::/32 cl +2803:4d40::/32 ar +2803:4d80::/32 cw +2803:4e00::/32 uy +2803:4e40::/32 ar +2803:4e80::/32 cr +2803:4f00::/32 ve +2803:4f80::/32 ar +2803:5000::/32 ar +2803:5040::/32 sv +2803:5080::/32 ar +2803:5100::/32 gt +2803:5140::/32 ar +2803:5180::/32 cr +2803:5200::/32 cl +2803:5240::/32 ar +2803:5280::/32 do +2803:5300::/32 gt +2803:5380::/32 hn +2803:5400::/32 ar +2803:5440::/32 ar +2803:5480::/32 ar +2803:5500::/32 ar +2803:5540::/32 ar +2803:5580::/32 cr +2803:5600::/32 hn +2803:5640::/32 co +2803:5680::/32 ve +2803:5700::/32 bo +2803:5780::/32 ar +2803:5840::/32 cr +2803:5880::/32 ar +2803:5900::/32 gf +2803:5940::/32 pe +2803:5980::/32 ar +2803:5a00::/32 ar +2803:5a40::/32 py +2803:5a80::/32 do +2803:5b00::/32 cr +2803:5b80::/32 ar +2803:5c00::/32 bo +2803:5c40::/32 cr +2803:5c80::/32 cl +2803:5d00::/32 sv +2803:5d80::/32 bz +2803:5e00::/32 bo +2803:5e40::/32 cl +2803:5e80::/32 ar +2803:5f80::/32 ec +2803:6000::/32 cr +2803:6040::/32 ar +2803:6080::/32 us +2803:6100::/32 ar +2803:6140::/32 ar +2803:6180::/32 hn +2803:6200::/32 cl +2803:6240::/32 ve +2803:6280::/32 pa +2803:6300::/32 gt +2803:6380::/32 ar +2803:6400::/32 do +2803:6440::/32 ar +2803:6480::/32 bz +2803:6500::/32 pe +2803:6540::/32 ar +2803:6580::/32 cl +2803:6600::/32 ar +2803:6640::/32 do +2803:6680::/32 ve +2803:6700::/32 co +2803:6780::/32 sv +2803:6800::/32 ar +2803:6840::/32 ar +2803:6880::/32 ar +2803:6900::/32 cr +2803:6940::/32 py +2803:6980::/32 ar +2803:6a00::/32 ec +2803:6a40::/32 ar +2803:6a80::/32 ni +2803:6b00::/32 ar +2803:6b80::/32 ar +2803:6c00::/32 hn +2803:6c40::/32 ar +2803:6c80::/32 ar +2803:6d00::/32 ar +2803:6d40::/32 ar +2803:6d80::/32 cl +2803:6e00::/32 sr +2803:6e40::/32 ar +2803:6e80::/32 hn +2803:6f00::/32 cl +2803:6f80::/32 co +2803:7000::/32 gt +2803:7040::/32 ar +2803:7080::/32 ar +2803:7100::/32 ar +2803:7140::/32 gt +2803:7180::/32 pe +2803:7200::/32 hn +2803:7240::/32 ar +2803:7280::/32 pa +2803:7300::/32 ar +2803:7380::/32 sx +2803:7400::/32 ar +2803:7440::/32 ar +2803:7480::/32 ar +2803:7500::/32 cl +2803:7540::/32 ar +2803:7580::/32 ar +2803:7600::/32 ar +2803:7640::/32 co +2803:7680::/32 bo +2803:7700::/32 ar +2803:7780::/32 hn +2803:7800::/32 ve +2803:7840::/32 ar +2803:7880::/32 ar +2803:7900::/32 bz +2803:7940::/32 ar +2803:7980::/32 ve +2803:7a00::/32 cr +2803:7a40::/32 ar +2803:7a80::/32 cr +2803:7b00::/32 cl +2803:7b80::/32 pe +2803:7c00::/32 cr +2803:7c40::/32 ar +2803:7c80::/32 pa +2803:7d00::/32 ar +2803:7d80::/32 py +2803:7e00::/32 ar +2803:7e40::/32 ar +2803:7e80::/32 ar +2803:7f00::/32 co +2803:7f80::/32 ar +2803:8000::/32 ar +2803:8040::/32 cr +2803:8080::/32 ar +2803:8100::/32 ve +2803:8140::/32 cl +2803:8180::/32 cl +2803:8200::/32 hn +2803:8240::/32 cl +2803:8280::/32 ve +2803:8300::/32 ec +2803:8380::/32 ar +2803:8400::/32 co +2803:8440::/32 ar +2803:8480::/32 ar +2803:8500::/32 ar +2803:8540::/32 cl +2803:8580::/32 co +2803:8600::/32 ht +2803:8640::/32 ar +2803:8680::/32 ar +2803:8700::/32 cr +2803:8780::/32 bz +2803:8800::/32 cr +2803:8840::/32 sv +2803:8880::/32 ni +2803:8900::/32 ar +2803:8940::/32 cl +2803:8980::/32 co +2803:8a40::/32 ar +2803:8a80::/32 ar +2803:8b00::/32 co +2803:8b80::/32 co +2803:8c00::/32 bz +2803:8c40::/32 ar +2803:8c80::/32 pa +2803:8d00::/32 ar +2803:8d43::/32 hn +2803:8d80::/32 uy +2803:8e00::/32 cl +2803:8e40::/32 cl +2803:8e80::/32 py +2803:8f00::/32 pa +2803:8f80::/32 hn +2803:9000::/32 ar +2803:9040::/32 do +2803:9080::/32 hn +2803:9100::/32 ar +2803:9140::/32 ni +2803:9180::/32 cr +2803:9200::/32 sv +2803:9240::/32 ar +2803:9280::/32 ar +2803:9300::/32 ar +2803:9380::/32 cl +2803:9400::/32 bo +2803:9440::/32 ar +2803:9480::/32 ar +2803:9500::/32 ar +2803:9540::/32 pe +2803:9580::/32 ar +2803:9600::/32 cw +2803:9640::/32 do +2803:9680::/32 ar +2803:9700::/32 ec +2803:9780::/32 ar +2803:9800::/32 ar +2803:9840::/32 ni +2803:9880::/32 bz +2803:9900::/32 cl +2803:9940::/32 ar +2803:9980::/32 co +2803:9a00::/32 bz +2803:9a40::/32 bz +2803:9a80::/32 co +2803:9b00::/32 do +2803:9b80::/32 ar +2803:9c00::/32 ar +2803:9c40::/32 ar +2803:9c80::/32 ar +2803:9d00::/32 sv +2803:9d40::/32 hn +2803:9d80::/32 sv +2803:9e00::/32 ar +2803:9e40::/32 pa +2803:9e80::/32 cl +2803:9f00::/32 ar +2803:9f80::/32 hn +2803:a000::/32 bq +2803:a040::/32 py +2803:a080::/32 ar +2803:a100::/32 cl +2803:a140::/32 co +2803:a180::/32 do +2803:a200::/32 sr +2803:a240::/32 ec +2803:a280::/32 do +2803:a380::/32 pa +2803:a400::/32 ec +2803:a440::/32 ar +2803:a480::/32 ar +2803:a500::/32 ar +2803:a540::/32 ar +2803:a580::/32 ht +2803:a600::/32 ar +2803:a640::/32 do +2803:a680::/32 ar +2803:a700::/32 hn +2803:a780::/32 ar +2803:a800::/32 cr +2803:a840::/32 ve +2803:a880::/32 ar +2803:a900::/32 ar +2803:a940::/32 pe +2803:a980::/32 cl +2803:aa00::/32 cl +2803:aa40::/32 ar +2803:aa80::/32 cr +2803:ab00::/32 do +2803:ab80::/32 pe +2803:ac00::/32 cl +2803:ac40::/32 pa +2803:ac80::/32 co +2803:ad00::/32 ar +2803:ad40::/32 cr +2803:ad80::/32 pa +2803:ae00::/32 ar +2803:ae40::/32 pa +2803:ae80::/32 ar +2803:af00::/32 ar +2803:af80::/32 py +2803:b000::/32 co +2803:b080::/32 bz +2803:b100::/32 cr +2803:b140::/32 cr +2803:b180::/32 cl +2803:b200::/32 uy +2803:b240::/32 py +2803:b280::/32 cl +2803:b300::/32 py +2803:b380::/32 ar +2803:b400::/32 ve +2803:b440::/32 cr +2803:b480::/32 cl +2803:b500::/32 ve +2803:b540::/32 bo +2803:b580::/32 cl +2803:b600::/32 ar +2803:b640::/32 aw +2803:b680::/32 ar +2803:b700::/32 hn +2803:b780::/32 ni +2803:b800::/32 cr +2803:b840::/32 pa +2803:b880::/32 ar +2803:b900::/32 ar +2803:b940::/32 pe +2803:ba00::/32 gt +2803:ba40::/32 ar +2803:ba80::/32 ar +2803:bb00::/32 ar +2803:bb80::/32 ve +2803:bc00::/32 ar +2803:bc40::/32 co +2803:bc80::/32 co +2803:bd00::/32 ar +2803:bd80::/32 pa +2803:be00::/32 ar +2803:be40::/32 ar +2803:be80::/32 co +2803:bf00::/32 ar +2803:bf80::/32 pa +2803:c000::/32 ve +2803:c040::/32 ve +2803:c080::/32 ar +2803:c100::/32 py +2803:c140::/32 ar +2803:c180::/32 cl +2803:c200::/32 pe +2803:c240::/32 bz +2803:c280::/32 ec +2803:c300::/32 gt +2803:c380::/32 hn +2803:c400::/32 ar +2803:c440::/32 ar +2803:c480::/32 ar +2803:c500::/32 ar +2803:c540::/32 gt +2803:c580::/32 ar +2803:c600::/32 cl +2803:c640::/32 ar +2803:c680::/32 ht +2803:c700::/32 gf +2803:c780::/32 ar +2803:c800::/32 gt +2803:c840::/32 gt +2803:c880::/32 hn +2803:c900::/32 ar +2803:c940::/32 cr +2803:c980::/32 cl +2803:ca00::/32 ar +2803:ca40::/32 ar +2803:ca80::/32 cl +2803:cb00::/32 co +2803:cb80::/32 ar +2803:cc00::/32 co +2803:cc40::/32 ar +2803:cc80::/32 ar +2803:cd00::/32 ar +2803:cd40::/32 ar +2803:cd80::/32 tt +2803:ce00::/32 hn +2803:ce40::/32 ar +2803:ce80::/32 ar +2803:cf00::/32 ar +2803:cf80::/32 ar +2803:d000::/32 bz +2803:d040::/32 pa +2803:d080::/32 ar +2803:d100::/32 gt +2803:d140::/32 cl +2803:d180::/32 ec +2803:d200::/32 cr +2803:d240::/32 ar +2803:d280::/32 py +2803:d380::/32 cl +2803:d400::/32 ar +2803:d440::/32 ve +2803:d480::/32 ve +2803:d500::/32 bz +2803:d540::/32 ve +2803:d580::/32 cl +2803:d600::/32 uy +2803:d640::/32 sv +2803:d680::/32 pe +2803:d700::/32 ve +2803:d780::/32 cl +2803:d800::/32 ar +2803:d840::/32 pa +2803:d880::/32 cr +2803:d900::/32 cr +2803:d940::/32 ve +2803:d980::/32 pa +2803:da00::/32 gy +2803:da40::/32 ar +2803:da80::/32 ar +2803:db00::/32 hn +2803:db80::/32 cl +2803:dc00::/32 co +2803:dc40::/32 cl +2803:dc80::/32 ar +2803:dd00::/32 pa +2803:dd80::/32 ve +2803:de00::/32 ar +2803:de40::/32 ar +2803:de80::/32 co +2803:df00::/32 sv +2803:df80::/32 ar +2803:e000::/32 co +2803:e040::/32 ar +2803:e080::/32 ar +2803:e100::/32 ar +2803:e140::/32 py +2803:e180::/32 cl +2803:e200::/32 ar +2803:e240::/32 pa +2803:e280::/32 ar +2803:e300::/32 cr +2803:e380::/32 hn +2803:e400::/32 ar +2803:e440::/32 ar +2803:e480::/32 ar +2803:e500::/32 pe +2803:e540::/32 ar +2803:e580::/32 co +2803:e600::/32 pa +2803:e640::/32 cl +2803:e680::/32 hn +2803:e700::/32 hn +2803:e780::/32 py +2803:e800::/32 cl +2803:e840::/32 co +2803:e880::/32 gt +2803:e900::/32 ar +2803:e940::/32 ar +2803:ea00::/32 ar +2803:ea40::/32 ar +2803:ea80::/32 ar +2803:eb00::/32 ar +2803:eb80::/32 ar +2803:ec00::/32 ar +2803:ec40::/32 ec +2803:ec80::/32 ar +2803:ed00::/32 pe +2803:ed40::/32 pa +2803:ed80::/32 cl +2803:ee00::/32 ar +2803:ee40::/32 cr +2803:ee80::/32 ar +2803:ef00::/32 pa +2803:ef80::/32 cl +2803:f000::/32 ar +2803:f040::/32 ar +2803:f080::/32 pe +2803:f100::/32 ar +2803:f140::/32 ar +2803:f180::/32 hn +2803:f200::/32 ar +2803:f240::/32 ar +2803:f280::/32 do +2803:f300::/32 ar +2803:f380::/32 ar +2803:f400::/32 hn +2803:f440::/32 py +2803:f480::/32 co +2803:f500::/32 cw +2803:f540::/32 pe +2803:f580::/32 ar +2803:f600::/32 cr +2803:f640::/32 bq +2803:f680::/32 ar +2803:f700::/32 ar +2803:f780::/32 do +2803:f800::/32 cr +2803:f840::/32 co +2803:f900::/32 bz +2803:f940::/32 sx +2803:f980::/32 cl +2803:fa00::/32 bo +2803:fa40::/32 sv +2803:fa80::/32 ar +2803:fb00::/32 pa +2803:fb80::/32 ar +2803:fc00::/32 py +2803:fc40::/32 ar +2803:fc80::/32 ar +2803:fd00::/32 co +2803:fd80::/32 cl +2803:fe00::/32 co +2803:fe40::/32 cr +2803:fe80::/32 pe +2803:ff80::/32 co +2804::/32 br +2804:4::/32 br +2804:8::/32 br +2804:10::/32 br +2804:14::/32 br +2804:18::/32 br +2804:1c::/32 br +2804:20::/32 br +2804:24::/32 br +2804:28::/32 br +2804:2c::/32 br +2804:30::/32 br +2804:34::/32 br +2804:38::/32 br +2804:3c::/32 br +2804:40::/32 br +2804:44::/32 br +2804:48::/32 br +2804:4c::/32 br +2804:50::/32 br +2804:54::/32 br +2804:58::/32 br +2804:5c::/32 br +2804:60::/32 br +2804:64::/32 br +2804:68::/32 br +2804:6c::/32 br +2804:70::/32 br +2804:74::/32 br +2804:78::/32 br +2804:7c::/32 br +2804:80::/32 br +2804:84::/32 br +2804:88::/32 br +2804:8c::/32 br +2804:90::/32 br +2804:94::/32 br +2804:98::/32 br +2804:9c::/32 br +2804:a0::/32 br +2804:a4::/32 br +2804:a8::/32 br +2804:ac::/32 br +2804:b0::/32 br +2804:b4::/32 br +2804:b8::/32 br +2804:c0::/32 br +2804:c4::/32 br +2804:c8::/32 br +2804:cc::/32 br +2804:d0::/32 br +2804:d4::/32 br +2804:d8::/32 br +2804:dc::/32 br +2804:e0::/32 br +2804:e4::/32 br +2804:e8::/32 br +2804:ec::/32 br +2804:f0::/32 br +2804:f4::/32 br +2804:f8::/32 br +2804:fc::/32 br +2804:100::/32 br +2804:104::/32 br +2804:10c::/32 br +2804:110::/32 br +2804:114::/32 br +2804:118::/32 br +2804:11c::/32 br +2804:120::/32 br +2804:124::/32 br +2804:128::/32 br +2804:12c::/32 br +2804:130::/32 br +2804:134::/32 br +2804:138::/32 br +2804:13c::/32 br +2804:140::/32 br +2804:144::/32 br +2804:148::/32 br +2804:14c::/32 br +2804:150::/32 br +2804:158::/32 br +2804:15c::/32 br +2804:160::/32 br +2804:164::/32 br +2804:168::/32 br +2804:16c::/32 br +2804:170::/32 br +2804:174::/32 br +2804:178::/32 br +2804:17c::/32 br +2804:180::/32 br +2804:184::/32 br +2804:188::/32 br +2804:18c::/32 br +2804:190::/32 br +2804:194::/32 br +2804:198::/32 br +2804:19c::/32 br +2804:1a0::/32 br +2804:1a4::/32 br +2804:1a8::/32 br +2804:1ac::/32 br +2804:1b0::/32 br +2804:1bc::/32 br +2804:1c0::/32 br +2804:1c4::/32 br +2804:1c8::/32 br +2804:1cc::/32 br +2804:1d0::/32 br +2804:1d4::/32 br +2804:1d8::/32 br +2804:1dc::/32 br +2804:1e0::/32 br +2804:1e8::/32 br +2804:1ec::/32 br +2804:1f0::/32 br +2804:1f4::/32 br +2804:1f8::/32 br +2804:200::/32 br +2804:204::/32 br +2804:208::/32 br +2804:20c::/32 br +2804:210::/32 br +2804:214::/32 br +2804:218::/32 br +2804:220::/32 br +2804:224::/32 br +2804:228::/32 br +2804:22c::/32 br +2804:230::/32 br +2804:234::/32 br +2804:238::/32 br +2804:23c::/32 br +2804:240::/32 br +2804:244::/32 br +2804:248::/32 br +2804:24c::/32 br +2804:250::/32 br +2804:254::/32 br +2804:258::/32 br +2804:25c::/32 br +2804:260::/32 br +2804:268::/32 br +2804:26c::/32 br +2804:270::/32 br +2804:274::/32 br +2804:27c::/32 br +2804:280::/32 br +2804:284::/32 br +2804:288::/32 br +2804:28c::/32 br +2804:290::/32 br +2804:294::/32 br +2804:298::/32 br +2804:2a0::/32 br +2804:2a4::/32 br +2804:2a8::/32 br +2804:2ac::/32 br +2804:2b0::/32 br +2804:2b4::/32 br +2804:2b8::/32 br +2804:2bc::/32 br +2804:2c0::/32 br +2804:2c8::/32 br +2804:2cc::/32 br +2804:2d0::/32 br +2804:2d4::/32 br +2804:2d8::/32 br +2804:2dc::/32 br +2804:2e0::/32 br +2804:2e4::/32 br +2804:2e8::/32 br +2804:2ec::/32 br +2804:2f0::/32 br +2804:2f4::/32 br +2804:2f8::/32 br +2804:2fc::/32 br +2804:300::/32 br +2804:308::/32 br +2804:30c::/32 br +2804:310::/32 br +2804:314::/32 br +2804:318::/32 br +2804:31c::/32 br +2804:320::/32 br +2804:324::/32 br +2804:328::/32 br +2804:330::/32 br +2804:334::/32 br +2804:338::/32 br +2804:33c::/32 br +2804:340::/32 br +2804:344::/32 br +2804:348::/32 br +2804:350::/32 br +2804:354::/32 br +2804:358::/32 br +2804:35c::/32 br +2804:360::/32 br +2804:364::/32 br +2804:368::/32 br +2804:36c::/32 br +2804:370::/32 br +2804:374::/32 br +2804:378::/32 br +2804:37c::/32 br +2804:380::/32 br +2804:384::/32 br +2804:388::/32 br +2804:390::/32 br +2804:394::/32 br +2804:39c::/32 br +2804:3a0::/32 br +2804:3a4::/32 br +2804:3a8::/32 br +2804:3ac::/32 br +2804:3b0::/32 br +2804:3b4::/32 br +2804:3b8::/32 br +2804:3bc::/32 br +2804:3c0::/32 br +2804:3c4::/32 br +2804:3c8::/32 br +2804:3cc::/32 br +2804:3d0::/32 br +2804:3d4::/32 br +2804:3d8::/32 br +2804:3dc::/32 br +2804:3e0::/32 br +2804:3e4::/32 br +2804:3e8::/32 br +2804:3ec::/32 br +2804:3f0::/32 br +2804:3f4::/32 br +2804:3f8::/32 br +2804:3fc::/32 br +2804:400::/32 br +2804:404::/32 br +2804:40c::/32 br +2804:414::/32 br +2804:418::/32 br +2804:41c::/32 br +2804:420::/32 br +2804:424::/32 br +2804:428::/32 br +2804:430::/32 br +2804:438::/32 br +2804:43c::/32 br +2804:440::/32 br +2804:444::/32 br +2804:448::/32 br +2804:44c::/32 br +2804:450::/32 br +2804:454::/32 br +2804:458::/32 br +2804:45c::/32 br +2804:460::/32 br +2804:464::/32 br +2804:468::/32 br +2804:46c::/32 br +2804:470::/32 br +2804:474::/32 br +2804:478::/32 br +2804:47c::/32 br +2804:480::/32 br +2804:484::/32 br +2804:488::/32 br +2804:48c::/32 br +2804:490::/32 br +2804:494::/32 br +2804:498::/32 br +2804:49c::/32 br +2804:4a0::/32 br +2804:4a4::/32 br +2804:4a8::/32 br +2804:4ac::/32 br +2804:4b0::/32 br +2804:4b4::/32 br +2804:4b8::/32 br +2804:4bc::/32 br +2804:4c0::/32 br +2804:4c4::/32 br +2804:4c8::/32 br +2804:4cc::/32 br +2804:4d4::/32 br +2804:4d8::/32 br +2804:4dc::/32 br +2804:4e0::/32 br +2804:4e4::/32 br +2804:4e8::/32 br +2804:4ec::/32 br +2804:4f0::/32 br +2804:4f4::/32 br +2804:4f8::/32 br +2804:4fc::/32 br +2804:500::/32 br +2804:504::/32 br +2804:508::/32 br +2804:50c::/32 br +2804:510::/32 br +2804:514::/32 br +2804:518::/32 br +2804:51c::/32 br +2804:520::/32 br +2804:528::/32 br +2804:52c::/32 br +2804:530::/32 br +2804:534::/32 br +2804:538::/32 br +2804:53c::/32 br +2804:540::/32 br +2804:544::/32 br +2804:548::/32 br +2804:54c::/32 br +2804:550::/32 br +2804:554::/32 br +2804:558::/32 br +2804:55c::/32 br +2804:560::/32 br +2804:564::/32 br +2804:568::/32 br +2804:56c::/32 br +2804:574::/32 br +2804:578::/32 br +2804:57c::/32 br +2804:580::/32 br +2804:584::/32 br +2804:588::/32 br +2804:58c::/32 br +2804:590::/32 br +2804:594::/32 br +2804:598::/32 br +2804:59c::/32 br +2804:5a4::/32 br +2804:5a8::/32 br +2804:5ac::/32 br +2804:5b0::/32 br +2804:5b4::/32 br +2804:5b8::/32 br +2804:5bc::/32 br +2804:5c0::/32 br +2804:5c4::/32 br +2804:5c8::/32 br +2804:5cc::/32 br +2804:5d0::/32 br +2804:5d4::/32 br +2804:5d8::/32 br +2804:5dc::/32 br +2804:5e0::/32 br +2804:5e4::/32 br +2804:5e8::/32 br +2804:5ec::/32 br +2804:5f0::/32 br +2804:5f4::/32 br +2804:5f8::/32 br +2804:5fc::/32 br +2804:600::/32 br +2804:604::/32 br +2804:608::/32 br +2804:60c::/32 br +2804:610::/32 br +2804:614::/32 br +2804:618::/32 br +2804:61c::/32 br +2804:620::/32 br +2804:624::/32 br +2804:628::/32 br +2804:62c::/32 br +2804:630::/32 br +2804:634::/32 br +2804:638::/32 br +2804:63c::/32 br +2804:640::/32 br +2804:644::/32 br +2804:648::/32 br +2804:64c::/32 br +2804:650::/32 br +2804:654::/32 br +2804:658::/32 br +2804:65c::/32 br +2804:660::/32 br +2804:664::/32 br +2804:668::/32 br +2804:66c::/32 br +2804:670::/32 br +2804:674::/32 br +2804:678::/32 br +2804:680::/32 br +2804:684::/32 br +2804:688::/32 br +2804:68c::/32 br +2804:690::/32 br +2804:694::/32 br +2804:698::/32 br +2804:69c::/32 br +2804:6a0::/32 br +2804:6a4::/32 br +2804:6a8::/32 br +2804:6ac::/32 br +2804:6b0::/32 br +2804:6b4::/32 br +2804:6b8::/32 br +2804:6bc::/32 br +2804:6c0::/32 br +2804:6c4::/32 br +2804:6c8::/32 br +2804:6cc::/32 br +2804:6d0::/32 br +2804:6d4::/32 br +2804:6d8::/32 br +2804:6dc::/32 br +2804:6e0::/32 br +2804:6e4::/32 br +2804:6e8::/32 br +2804:6ec::/32 br +2804:6f0::/32 br +2804:6f4::/32 br +2804:6f8::/32 br +2804:6fc::/32 br +2804:700::/32 br +2804:704::/32 br +2804:70c::/32 br +2804:710::/32 br +2804:714::/32 br +2804:718::/32 br +2804:71c::/32 br +2804:720::/32 br +2804:724::/32 br +2804:728::/32 br +2804:72c::/32 br +2804:730::/32 br +2804:734::/32 br +2804:738::/32 br +2804:73c::/32 br +2804:740::/32 br +2804:744::/32 br +2804:748::/32 br +2804:74c::/32 br +2804:750::/32 br +2804:754::/32 br +2804:758::/32 br +2804:75c::/32 br +2804:760::/32 br +2804:764::/32 br +2804:768::/32 br +2804:76c::/32 br +2804:770::/32 br +2804:774::/32 br +2804:778::/32 br +2804:77c::/32 br +2804:780::/32 br +2804:784::/32 br +2804:788::/32 br +2804:78c::/32 br +2804:790::/32 br +2804:794::/32 br +2804:798::/32 br +2804:79c::/32 br +2804:7a0::/32 br +2804:7a4::/32 br +2804:7a8::/32 br +2804:7ac::/32 br +2804:7b0::/32 br +2804:7b4::/32 br +2804:7b8::/32 br +2804:7bc::/32 br +2804:7c0::/32 br +2804:7c4::/32 br +2804:7c8::/32 br +2804:7cc::/32 br +2804:7d0::/32 br +2804:7d4::/32 br +2804:7dc::/32 br +2804:7e0::/32 br +2804:7e4::/32 br +2804:7e8::/32 br +2804:7ec::/32 br +2804:7f0::/32 br +2804:800::/32 br +2804:804::/32 br +2804:808::/32 br +2804:80c::/32 br +2804:810::/32 br +2804:814::/32 br +2804:818::/32 br +2804:81c::/32 br +2804:820::/32 br +2804:824::/32 br +2804:828::/32 br +2804:82c::/32 br +2804:830::/32 br +2804:834::/32 br +2804:838::/32 br +2804:840::/32 br +2804:844::/32 br +2804:848::/32 br +2804:84c::/32 br +2804:850::/32 br +2804:854::/32 br +2804:858::/32 br +2804:85c::/32 br +2804:860::/32 br +2804:864::/32 br +2804:868::/32 br +2804:86c::/32 br +2804:870::/32 br +2804:874::/32 br +2804:878::/32 br +2804:87c::/32 br +2804:880::/32 br +2804:884::/32 br +2804:888::/32 br +2804:88c::/32 br +2804:890::/32 br +2804:894::/32 br +2804:898::/32 br +2804:89c::/32 br +2804:8a0::/32 br +2804:8a8::/32 br +2804:8ac::/32 br +2804:8b0::/32 br +2804:8b4::/32 br +2804:8bc::/32 br +2804:8c0::/32 br +2804:8c4::/32 br +2804:8c8::/32 br +2804:8cc::/32 br +2804:8d0::/32 br +2804:8d4::/32 br +2804:8d8::/32 br +2804:8dc::/32 br +2804:8e0::/32 br +2804:8e4::/32 br +2804:8e8::/32 br +2804:8ec::/32 br +2804:8f0::/32 br +2804:8f4::/32 br +2804:8f8::/32 br +2804:8fc::/32 br +2804:904::/32 br +2804:908::/32 br +2804:90c::/32 br +2804:910::/32 br +2804:914::/32 br +2804:918::/32 br +2804:91c::/32 br +2804:920::/32 br +2804:924::/32 br +2804:928::/32 br +2804:92c::/32 br +2804:930::/32 br +2804:934::/32 br +2804:938::/32 br +2804:93c::/32 br +2804:940::/32 br +2804:944::/32 br +2804:948::/32 br +2804:94c::/32 br +2804:950::/32 br +2804:954::/32 br +2804:958::/32 br +2804:95c::/32 br +2804:960::/32 br +2804:964::/32 br +2804:968::/32 br +2804:96c::/32 br +2804:970::/32 br +2804:978::/32 br +2804:97c::/32 br +2804:980::/32 br +2804:984::/32 br +2804:988::/32 br +2804:98c::/32 br +2804:990::/32 br +2804:994::/32 br +2804:998::/32 br +2804:99c::/32 br +2804:9a0::/32 br +2804:9a4::/32 br +2804:9a8::/32 br +2804:9ac::/32 br +2804:9b0::/32 br +2804:9b4::/32 br +2804:9b8::/32 br +2804:9bc::/32 br +2804:9c0::/32 br +2804:9c4::/32 br +2804:9c8::/32 br +2804:9cc::/32 br +2804:9d0::/32 br +2804:9d4::/32 br +2804:9d8::/32 br +2804:9dc::/32 br +2804:9e0::/32 br +2804:9e4::/32 br +2804:9e8::/32 br +2804:9ec::/32 br +2804:9f0::/32 br +2804:9f4::/32 br +2804:9f8::/32 br +2804:9fc::/32 br +2804:a00::/32 br +2804:a08::/32 br +2804:a0c::/32 br +2804:a10::/32 br +2804:a14::/32 br +2804:a18::/32 br +2804:a1c::/32 br +2804:a20::/32 br +2804:a24::/32 br +2804:a28::/32 br +2804:a2c::/32 br +2804:a30::/32 br +2804:a34::/32 br +2804:a38::/32 br +2804:a3c::/32 br +2804:a40::/32 br +2804:a44::/32 br +2804:a48::/32 br +2804:a4c::/32 br +2804:a50::/32 br +2804:a54::/32 br +2804:a58::/32 br +2804:a5c::/32 br +2804:a60::/32 br +2804:a64::/32 br +2804:a68::/32 br +2804:a6c::/32 br +2804:a70::/32 br +2804:a74::/32 br +2804:a78::/32 br +2804:a80::/32 br +2804:a84::/32 br +2804:a88::/32 br +2804:a8c::/32 br +2804:a90::/32 br +2804:a94::/32 br +2804:a98::/32 br +2804:a9c::/32 br +2804:aa0::/32 br +2804:aa4::/32 br +2804:aa8::/32 br +2804:aac::/32 br +2804:ab0::/32 br +2804:ab4::/32 br +2804:ab8::/32 br +2804:ac0::/32 br +2804:ac4::/32 br +2804:ac8::/32 br +2804:acc::/32 br +2804:ad0::/32 br +2804:ad4::/32 br +2804:ad8::/32 br +2804:adc::/32 br +2804:ae0::/32 br +2804:ae4::/32 br +2804:ae8::/32 br +2804:aec::/32 br +2804:af4::/32 br +2804:af8::/32 br +2804:afc::/32 br +2804:b00::/32 br +2804:b04::/32 br +2804:b08::/32 br +2804:b0c::/32 br +2804:b10::/32 br +2804:b14::/32 br +2804:b18::/32 br +2804:b1c::/32 br +2804:b24::/32 br +2804:b28::/32 br +2804:b2c::/32 br +2804:b30::/32 br +2804:b34::/32 br +2804:b38::/32 br +2804:b3c::/32 br +2804:b40::/32 br +2804:b44::/32 br +2804:b48::/32 br +2804:b4c::/32 br +2804:b50::/32 br +2804:b54::/32 br +2804:b58::/32 br +2804:b5c::/32 br +2804:b60::/32 br +2804:b64::/32 br +2804:b68::/32 br +2804:b6c::/32 br +2804:b70::/32 br +2804:b78::/32 br +2804:b7c::/32 br +2804:b80::/32 br +2804:b84::/32 br +2804:b88::/32 br +2804:b8c::/32 br +2804:b90::/32 br +2804:b94::/32 br +2804:b98::/32 br +2804:b9c::/32 br +2804:ba0::/32 br +2804:ba4::/32 br +2804:ba8::/32 br +2804:bac::/32 br +2804:bb0::/32 br +2804:bb4::/32 br +2804:bb8::/32 br +2804:bbc::/32 br +2804:bc4::/32 br +2804:bc8::/32 br +2804:bcc::/32 br +2804:bd0::/32 br +2804:bd4::/32 br +2804:bd8::/32 br +2804:bdc::/32 br +2804:be0::/32 br +2804:be4::/32 br +2804:be8::/32 br +2804:bec::/32 br +2804:bf0::/32 br +2804:bf4::/32 br +2804:bf8::/32 br +2804:bfc::/32 br +2804:c00::/32 br +2804:c04::/32 br +2804:c08::/32 br +2804:c0c::/32 br +2804:c10::/32 br +2804:c14::/32 br +2804:c18::/32 br +2804:c1c::/32 br +2804:c20::/32 br +2804:c24::/32 br +2804:c28::/32 br +2804:c2c::/32 br +2804:c30::/32 br +2804:c34::/32 br +2804:c38::/32 br +2804:c3c::/32 br +2804:c40::/32 br +2804:c44::/32 br +2804:c48::/32 br +2804:c4c::/32 br +2804:c50::/32 br +2804:c54::/32 br +2804:c58::/32 br +2804:c5c::/32 br +2804:c60::/32 br +2804:c64::/32 br +2804:c68::/32 br +2804:c6c::/32 br +2804:c70::/32 br +2804:c74::/32 br +2804:c78::/32 br +2804:c7c::/32 br +2804:c80::/32 br +2804:c84::/32 br +2804:c88::/32 br +2804:c90::/32 br +2804:c94::/32 br +2804:c98::/32 br +2804:c9c::/32 br +2804:ca0::/32 br +2804:ca4::/32 br +2804:ca8::/32 br +2804:cac::/32 br +2804:cb0::/32 br +2804:cb4::/32 br +2804:cb8::/32 br +2804:cbc::/32 br +2804:cc0::/32 br +2804:cc4::/32 br +2804:cc8::/32 br +2804:ccc::/32 br +2804:cd0::/32 br +2804:cd4::/32 br +2804:cd8::/32 br +2804:cdc::/32 br +2804:ce0::/32 br +2804:ce4::/32 br +2804:ce8::/32 br +2804:cec::/32 br +2804:cf0::/32 br +2804:cf4::/32 br +2804:cf8::/32 br +2804:cfc::/32 br +2804:d00::/32 br +2804:d04::/32 br +2804:d08::/32 br +2804:d0c::/32 br +2804:d10::/32 br +2804:d14::/32 br +2804:d18::/32 br +2804:d1c::/32 br +2804:d20::/32 br +2804:d24::/32 br +2804:d28::/32 br +2804:d2c::/32 br +2804:d30::/32 br +2804:d34::/32 br +2804:d38::/32 br +2804:d3c::/32 br +2804:d40::/32 br +2804:d64::/32 br +2804:d68::/32 br +2804:d6c::/32 br +2804:d70::/32 br +2804:d74::/32 br +2804:d78::/32 br +2804:d7c::/32 br +2804:d80::/32 br +2804:d84::/32 br +2804:d88::/32 br +2804:d8c::/32 br +2804:d90::/32 br +2804:d94::/32 br +2804:d98::/32 br +2804:d9c::/32 br +2804:da0::/32 br +2804:da4::/32 br +2804:da8::/32 br +2804:dac::/32 br +2804:db0::/32 br +2804:db4::/32 br +2804:db8::/32 br +2804:dbc::/32 br +2804:dc0::/32 br +2804:dc8::/32 br +2804:dcc::/32 br +2804:dd0::/32 br +2804:dd4::/32 br +2804:dd8::/32 br +2804:ddc::/32 br +2804:de0::/32 br +2804:de4::/32 br +2804:de8::/32 br +2804:dec::/32 br +2804:df0::/32 br +2804:df4::/32 br +2804:df8::/32 br +2804:dfc::/32 br +2804:e00::/32 br +2804:e04::/32 br +2804:e08::/32 br +2804:e0c::/32 br +2804:e10::/32 br +2804:e14::/32 br +2804:e18::/32 br +2804:e1c::/32 br +2804:e20::/32 br +2804:e24::/32 br +2804:e28::/32 br +2804:e2c::/32 br +2804:e30::/32 br +2804:e34::/32 br +2804:e38::/32 br +2804:e3c::/32 br +2804:e40::/32 br +2804:e44::/32 br +2804:e48::/32 br +2804:e4c::/32 br +2804:e50::/32 br +2804:e54::/32 br +2804:e58::/32 br +2804:e5c::/32 br +2804:e60::/32 br +2804:e64::/32 br +2804:e68::/32 br +2804:e6c::/32 br +2804:e70::/32 br +2804:e74::/32 br +2804:e78::/32 br +2804:e7c::/32 br +2804:e80::/32 br +2804:e84::/32 br +2804:e88::/32 br +2804:e8c::/32 br +2804:e90::/32 br +2804:e94::/32 br +2804:e98::/32 br +2804:e9c::/32 br +2804:ea0::/32 br +2804:ea4::/32 br +2804:ea8::/32 br +2804:eac::/32 br +2804:eb0::/32 br +2804:eb4::/32 br +2804:eb8::/32 br +2804:ebc::/32 br +2804:ec0::/32 br +2804:ec4::/32 br +2804:ec8::/32 br +2804:ecc::/32 br +2804:ed0::/32 br +2804:ed4::/32 br +2804:ed8::/32 br +2804:edc::/32 br +2804:ee0::/32 br +2804:ee4::/32 br +2804:ee8::/32 br +2804:eec::/32 br +2804:ef0::/32 br +2804:ef4::/32 br +2804:ef8::/32 br +2804:efc::/32 br +2804:f00::/32 br +2804:f04::/32 br +2804:f08::/32 br +2804:f0c::/32 br +2804:f10::/32 br +2804:f14::/32 br +2804:f18::/32 br +2804:f1c::/32 br +2804:f20::/32 br +2804:f24::/32 br +2804:f28::/32 br +2804:f2c::/32 br +2804:f30::/32 br +2804:f34::/32 br +2804:f38::/32 br +2804:f3c::/32 br +2804:f40::/32 br +2804:f44::/32 br +2804:f48::/32 br +2804:f4c::/32 br +2804:f50::/32 br +2804:f54::/32 br +2804:f58::/32 br +2804:f60::/32 br +2804:f64::/32 br +2804:f68::/32 br +2804:f6c::/32 br +2804:f70::/32 br +2804:f74::/32 br +2804:f78::/32 br +2804:f7c::/32 br +2804:f80::/32 br +2804:f84::/32 br +2804:f88::/32 br +2804:f8c::/32 br +2804:f90::/32 br +2804:f94::/32 br +2804:f98::/32 br +2804:f9c::/32 br +2804:fa0::/32 br +2804:fa4::/32 br +2804:fa8::/32 br +2804:fac::/32 br +2804:fb0::/32 br +2804:fb4::/32 br +2804:fb8::/32 br +2804:fbc::/32 br +2804:fc0::/32 br +2804:fc4::/32 br +2804:fc8::/32 br +2804:fcc::/32 br +2804:fd0::/32 br +2804:fd4::/32 br +2804:fd8::/32 br +2804:fdc::/32 br +2804:fe0::/32 br +2804:fe4::/32 br +2804:fe8::/32 br +2804:fec::/32 br +2804:ff0::/32 br +2804:ff4::/32 br +2804:ff8::/32 br +2804:ffc::/32 br +2804:1000::/32 br +2804:1004::/32 br +2804:1008::/32 br +2804:100c::/32 br +2804:1010::/32 br +2804:1014::/32 br +2804:1018::/32 br +2804:101c::/32 br +2804:1020::/32 br +2804:1024::/32 br +2804:1028::/32 br +2804:102c::/32 br +2804:1030::/32 br +2804:1034::/32 br +2804:1038::/32 br +2804:103c::/32 br +2804:1040::/32 br +2804:1044::/32 br +2804:1048::/32 br +2804:104c::/32 br +2804:1050::/32 br +2804:1054::/32 br +2804:1058::/32 br +2804:105c::/32 br +2804:1060::/32 br +2804:1064::/32 br +2804:1068::/32 br +2804:106c::/32 br +2804:1070::/32 br +2804:1074::/32 br +2804:1078::/32 br +2804:107c::/32 br +2804:1080::/32 br +2804:1084::/32 br +2804:1088::/32 br +2804:108c::/32 br +2804:1090::/32 br +2804:1094::/32 br +2804:1098::/32 br +2804:109c::/32 br +2804:10a0::/32 br +2804:10a4::/32 br +2804:10a8::/32 br +2804:10ac::/32 br +2804:10b0::/32 br +2804:10b4::/32 br +2804:10b8::/32 br +2804:10bc::/32 br +2804:10c0::/32 br +2804:10c4::/32 br +2804:10c8::/32 br +2804:10cc::/32 br +2804:10d4::/32 br +2804:10d8::/32 br +2804:10dc::/32 br +2804:10e0::/32 br +2804:10e4::/32 br +2804:10e8::/32 br +2804:10ec::/32 br +2804:10f0::/32 br +2804:10f4::/32 br +2804:10f8::/32 br +2804:10fc::/32 br +2804:1100::/32 br +2804:1104::/32 br +2804:1108::/32 br +2804:110c::/32 br +2804:1110::/32 br +2804:1114::/32 br +2804:1118::/32 br +2804:111c::/32 br +2804:1120::/32 br +2804:1124::/32 br +2804:1128::/32 br +2804:112c::/32 br +2804:1130::/32 br +2804:1134::/32 br +2804:1138::/32 br +2804:113c::/32 br +2804:1140::/32 br +2804:1144::/32 br +2804:1148::/32 br +2804:114c::/32 br +2804:1150::/32 br +2804:1154::/32 br +2804:1158::/32 br +2804:115c::/32 br +2804:1160::/32 br +2804:1164::/32 br +2804:1168::/32 br +2804:116c::/32 br +2804:1170::/32 br +2804:1174::/32 br +2804:1178::/32 br +2804:117c::/32 br +2804:1180::/32 br +2804:1184::/32 br +2804:1188::/32 br +2804:118c::/32 br +2804:1190::/32 br +2804:1194::/32 br +2804:1198::/32 br +2804:119c::/32 br +2804:11a0::/32 br +2804:11a4::/32 br +2804:11a8::/32 br +2804:11ac::/32 br +2804:11b0::/32 br +2804:11b4::/32 br +2804:11b8::/32 br +2804:11bc::/32 br +2804:11c0::/32 br +2804:11c4::/32 br +2804:11c8::/32 br +2804:11cc::/32 br +2804:11d0::/32 br +2804:11d4::/32 br +2804:11d8::/32 br +2804:11dc::/32 br +2804:11e0::/32 br +2804:11e4::/32 br +2804:11e8::/32 br +2804:11ec::/32 br +2804:11f0::/32 br +2804:11f4::/32 br +2804:11f8::/32 br +2804:11fc::/32 br +2804:1200::/32 br +2804:1204::/32 br +2804:1208::/32 br +2804:120c::/32 br +2804:1210::/32 br +2804:1214::/32 br +2804:1218::/32 br +2804:121c::/32 br +2804:1220::/32 br +2804:1224::/32 br +2804:1228::/32 br +2804:122c::/32 br +2804:1230::/32 br +2804:1234::/32 br +2804:1238::/32 br +2804:123c::/32 br +2804:1240::/32 br +2804:1244::/32 br +2804:1248::/32 br +2804:124c::/32 br +2804:1250::/32 br +2804:1254::/32 br +2804:1258::/32 br +2804:125c::/32 br +2804:1260::/32 br +2804:1264::/32 br +2804:1268::/32 br +2804:126c::/32 br +2804:1270::/32 br +2804:1274::/32 br +2804:1278::/32 br +2804:127c::/32 br +2804:1280::/32 br +2804:1284::/32 br +2804:1288::/32 br +2804:128c::/32 br +2804:1290::/32 br +2804:1294::/32 br +2804:1298::/32 br +2804:129c::/32 br +2804:12a0::/32 br +2804:12a4::/32 br +2804:12a8::/32 br +2804:12ac::/32 br +2804:12b0::/32 br +2804:12b4::/32 br +2804:12b8::/32 br +2804:12bc::/32 br +2804:12c0::/32 br +2804:12c4::/32 br +2804:12c8::/32 br +2804:12cc::/32 br +2804:12d0::/32 br +2804:12d4::/32 br +2804:12d8::/32 br +2804:12dc::/32 br +2804:12e0::/32 br +2804:12e4::/32 br +2804:12e8::/32 br +2804:12ec::/32 br +2804:12f0::/32 br +2804:12f4::/32 br +2804:12f8::/32 br +2804:12fc::/32 br +2804:1300::/32 br +2804:1304::/32 br +2804:1308::/32 br +2804:130c::/32 br +2804:1310::/32 br +2804:1314::/32 br +2804:1318::/32 br +2804:131c::/32 br +2804:1320::/32 br +2804:1324::/32 br +2804:1328::/32 br +2804:132c::/32 br +2804:1330::/32 br +2804:1334::/32 br +2804:1338::/32 br +2804:133c::/32 br +2804:1340::/32 br +2804:1344::/32 br +2804:1348::/32 br +2804:134c::/32 br +2804:1350::/32 br +2804:1354::/32 br +2804:1358::/32 br +2804:135c::/32 br +2804:1360::/32 br +2804:1364::/32 br +2804:1368::/32 br +2804:136c::/32 br +2804:1370::/32 br +2804:1374::/32 br +2804:1378::/32 br +2804:137c::/32 br +2804:1380::/32 br +2804:1384::/32 br +2804:1388::/32 br +2804:1390::/32 br +2804:1394::/32 br +2804:1398::/32 br +2804:139c::/32 br +2804:13a0::/32 br +2804:13a4::/32 br +2804:13a8::/32 br +2804:13ac::/32 br +2804:13b0::/32 br +2804:13b4::/32 br +2804:13b8::/32 br +2804:13bc::/32 br +2804:13c0::/32 br +2804:13c4::/32 br +2804:13c8::/32 br +2804:13cc::/32 br +2804:13d0::/32 br +2804:13d4::/32 br +2804:13d8::/32 br +2804:13dc::/32 br +2804:13e0::/32 br +2804:13e4::/32 br +2804:13e8::/32 br +2804:13ec::/32 br +2804:13f0::/32 br +2804:13f4::/32 br +2804:13f8::/32 br +2804:13fc::/32 br +2804:1400::/32 br +2804:1404::/32 br +2804:1408::/32 br +2804:140c::/32 br +2804:1410::/32 br +2804:1414::/32 br +2804:1418::/32 br +2804:141c::/32 br +2804:1420::/32 br +2804:1424::/32 br +2804:1428::/32 br +2804:142c::/32 br +2804:1430::/32 br +2804:1434::/32 br +2804:1438::/32 br +2804:143c::/32 br +2804:1440::/32 br +2804:1444::/32 br +2804:1448::/32 br +2804:144c::/32 br +2804:1450::/32 br +2804:1454::/32 br +2804:1458::/32 br +2804:145c::/32 br +2804:1460::/32 br +2804:1464::/32 br +2804:1468::/32 br +2804:146c::/32 br +2804:1470::/32 br +2804:1474::/32 br +2804:1478::/32 br +2804:147c::/32 br +2804:1480::/32 br +2804:1484::/32 br +2804:1488::/32 br +2804:148c::/32 br +2804:1490::/32 br +2804:1494::/32 br +2804:1498::/32 br +2804:149c::/32 br +2804:14a0::/32 br +2804:14a4::/32 br +2804:14a8::/32 br +2804:14ac::/32 br +2804:14b0::/32 br +2804:14b4::/32 br +2804:14b8::/32 br +2804:14bc::/32 br +2804:14c0::/32 br +2804:14c4::/32 br +2804:14c8::/32 br +2804:14cc::/32 br +2804:14d0::/32 br +2804:14d4::/32 br +2804:14d8::/32 br +2804:14dc::/32 br +2804:14e0::/32 br +2804:14e4::/32 br +2804:14e8::/32 br +2804:14ec::/32 br +2804:14f0::/32 br +2804:14f4::/32 br +2804:14f8::/32 br +2804:14fc::/32 br +2804:1500::/32 br +2804:1504::/32 br +2804:1508::/32 br +2804:150c::/32 br +2804:1510::/32 br +2804:1514::/32 br +2804:1518::/32 br +2804:151c::/32 br +2804:1520::/32 br +2804:1524::/32 br +2804:1528::/32 br +2804:152c::/32 br +2804:1530::/32 br +2804:1534::/32 br +2804:1538::/32 br +2804:153c::/32 br +2804:1540::/32 br +2804:1544::/32 br +2804:1548::/32 br +2804:154c::/32 br +2804:1550::/32 br +2804:1554::/32 br +2804:1558::/32 br +2804:155c::/32 br +2804:1560::/32 br +2804:1564::/32 br +2804:1568::/32 br +2804:156c::/32 br +2804:1570::/32 br +2804:1574::/32 br +2804:1578::/32 br +2804:157c::/32 br +2804:1580::/32 br +2804:1584::/32 br +2804:1588::/32 br +2804:158c::/32 br +2804:1590::/32 br +2804:1594::/32 br +2804:1598::/32 br +2804:159c::/32 br +2804:15a0::/32 br +2804:15a4::/32 br +2804:15a8::/32 br +2804:15ac::/32 br +2804:15b0::/32 br +2804:15b4::/32 br +2804:15b8::/32 br +2804:15bc::/32 br +2804:15c0::/32 br +2804:15c4::/32 br +2804:15c8::/32 br +2804:15cc::/32 br +2804:15d0::/32 br +2804:15d4::/32 br +2804:15d8::/32 br +2804:15dc::/32 br +2804:15e0::/32 br +2804:15e4::/32 br +2804:15e8::/32 br +2804:15ec::/32 br +2804:15f0::/32 br +2804:15f4::/32 br +2804:15f8::/32 br +2804:15fc::/32 br +2804:1600::/32 br +2804:1604::/32 br +2804:1608::/32 br +2804:160c::/32 br +2804:1610::/32 br +2804:1614::/32 br +2804:1618::/32 br +2804:161c::/32 br +2804:1620::/32 br +2804:1624::/32 br +2804:1628::/32 br +2804:162c::/32 br +2804:1630::/32 br +2804:1634::/32 br +2804:1638::/32 br +2804:163c::/32 br +2804:1644::/32 br +2804:1648::/32 br +2804:164c::/32 br +2804:1650::/32 br +2804:1654::/32 br +2804:1658::/32 br +2804:165c::/32 br +2804:1660::/32 br +2804:1664::/32 br +2804:1668::/32 br +2804:166c::/32 br +2804:1670::/32 br +2804:1674::/32 br +2804:1678::/32 br +2804:167c::/32 br +2804:1680::/32 br +2804:1684::/32 br +2804:1688::/32 br +2804:168c::/32 br +2804:1690::/32 br +2804:1694::/32 br +2804:1698::/32 br +2804:169c::/32 br +2804:16a0::/32 br +2804:16a4::/32 br +2804:16a8::/32 br +2804:16ac::/32 br +2804:16b0::/32 br +2804:16b4::/32 br +2804:16b8::/32 br +2804:16bc::/32 br +2804:16c0::/32 br +2804:16c4::/32 br +2804:16c8::/32 br +2804:16cc::/32 br +2804:16d0::/32 br +2804:16d4::/32 br +2804:16d8::/32 br +2804:16dc::/32 br +2804:16e0::/32 br +2804:16e4::/32 br +2804:16e8::/32 br +2804:16ec::/32 br +2804:16f0::/32 br +2804:16f4::/32 br +2804:16f8::/32 br +2804:16fc::/32 br +2804:1700::/32 br +2804:1704::/32 br +2804:1708::/32 br +2804:170c::/32 br +2804:1710::/32 br +2804:1714::/32 br +2804:1718::/32 br +2804:171c::/32 br +2804:1720::/32 br +2804:1724::/32 br +2804:1728::/32 br +2804:172c::/32 br +2804:1730::/32 br +2804:1734::/32 br +2804:1738::/32 br +2804:173c::/32 br +2804:1740::/32 br +2804:1744::/32 br +2804:1748::/32 br +2804:174c::/32 br +2804:1750::/32 br +2804:1754::/32 br +2804:1758::/32 br +2804:175c::/32 br +2804:1760::/32 br +2804:1764::/32 br +2804:1768::/32 br +2804:176c::/32 br +2804:1770::/32 br +2804:1774::/32 br +2804:1778::/32 br +2804:177c::/32 br +2804:1780::/32 br +2804:1784::/32 br +2804:1788::/32 br +2804:178c::/32 br +2804:1790::/32 br +2804:1794::/32 br +2804:1798::/32 br +2804:179c::/32 br +2804:17a0::/32 br +2804:17a4::/32 br +2804:17a8::/32 br +2804:17ac::/32 br +2804:17b0::/32 br +2804:17b4::/32 br +2804:17b8::/32 br +2804:17bc::/32 br +2804:17c0::/32 br +2804:17c4::/32 br +2804:17c8::/32 br +2804:17cc::/32 br +2804:17d0::/32 br +2804:17d4::/32 br +2804:17d8::/32 br +2804:17dc::/32 br +2804:17e0::/32 br +2804:17e4::/32 br +2804:17e8::/32 br +2804:17ec::/32 br +2804:17f0::/32 br +2804:17f4::/32 br +2804:17f8::/32 br +2804:17fc::/32 br +2804:1800::/32 br +2804:1804::/32 br +2804:1808::/32 br +2804:180c::/32 br +2804:1810::/32 br +2804:1814::/32 br +2804:1818::/32 br +2804:181c::/32 br +2804:1820::/32 br +2804:1824::/32 br +2804:1828::/32 br +2804:182c::/32 br +2804:1830::/32 br +2804:1834::/32 br +2804:1838::/32 br +2804:183c::/32 br +2804:1840::/32 br +2804:1844::/32 br +2804:1848::/32 br +2804:184c::/32 br +2804:1850::/32 br +2804:1854::/32 br +2804:1858::/32 br +2804:185c::/32 br +2804:1860::/32 br +2804:1864::/32 br +2804:1868::/32 br +2804:186c::/32 br +2804:1870::/32 br +2804:1874::/32 br +2804:1878::/32 br +2804:187c::/32 br +2804:1880::/32 br +2804:1884::/32 br +2804:1888::/32 br +2804:188c::/32 br +2804:1890::/32 br +2804:1894::/32 br +2804:1898::/32 br +2804:189c::/32 br +2804:18a0::/32 br +2804:18a4::/32 br +2804:18a8::/32 br +2804:18ac::/32 br +2804:18b0::/32 br +2804:18b4::/32 br +2804:18b8::/32 br +2804:18bc::/32 br +2804:18c0::/32 br +2804:18c4::/32 br +2804:18c8::/32 br +2804:18cc::/32 br +2804:18d0::/32 br +2804:18d4::/32 br +2804:18d8::/32 br +2804:18dc::/32 br +2804:18e0::/32 br +2804:18e4::/32 br +2804:18e8::/32 br +2804:18ec::/32 br +2804:18f0::/32 br +2804:18f4::/32 br +2804:18f8::/32 br +2804:18fc::/32 br +2804:1900::/32 br +2804:1904::/32 br +2804:1908::/32 br +2804:190c::/32 br +2804:1910::/32 br +2804:1914::/32 br +2804:1918::/32 br +2804:191c::/32 br +2804:1920::/32 br +2804:1924::/32 br +2804:1928::/32 br +2804:192c::/32 br +2804:1930::/32 br +2804:1934::/32 br +2804:1938::/32 br +2804:193c::/32 br +2804:1940::/32 br +2804:1944::/32 br +2804:1948::/32 br +2804:194c::/32 br +2804:1950::/32 br +2804:1954::/32 br +2804:1958::/32 br +2804:195c::/32 br +2804:1960::/32 br +2804:1964::/32 br +2804:1968::/32 br +2804:196c::/32 br +2804:1970::/32 br +2804:1974::/32 br +2804:1978::/32 br +2804:197c::/32 br +2804:1980::/32 br +2804:1984::/32 br +2804:1988::/32 br +2804:198c::/32 br +2804:1990::/32 br +2804:1994::/32 br +2804:1998::/32 br +2804:199c::/32 br +2804:19a0::/32 br +2804:19a4::/32 br +2804:19a8::/32 br +2804:19ac::/32 br +2804:19b0::/32 br +2804:19b4::/32 br +2804:19b8::/32 br +2804:19bc::/32 br +2804:19c0::/32 br +2804:19c4::/32 br +2804:19c8::/32 br +2804:19cc::/32 br +2804:19d0::/32 br +2804:19d4::/32 br +2804:19d8::/32 br +2804:19dc::/32 br +2804:19e0::/32 br +2804:19e4::/32 br +2804:19e8::/32 br +2804:19ec::/32 br +2804:19f0::/32 br +2804:19f4::/32 br +2804:19f8::/32 br +2804:19fc::/32 br +2804:1a00::/32 br +2804:1a04::/32 br +2804:1a08::/32 br +2804:1a0c::/32 br +2804:1a10::/32 br +2804:1a14::/32 br +2804:1a18::/32 br +2804:1a1c::/32 br +2804:1a20::/32 br +2804:1a24::/32 br +2804:1a28::/32 br +2804:1a2c::/32 br +2804:1a30::/32 br +2804:1a34::/32 br +2804:1a38::/32 br +2804:1a3c::/32 br +2804:1a40::/32 br +2804:1a44::/32 br +2804:1a48::/32 br +2804:1a4c::/32 br +2804:1a50::/32 br +2804:1a54::/32 br +2804:1a58::/32 br +2804:1a5c::/32 br +2804:1a60::/32 br +2804:1a64::/32 br +2804:1a68::/32 br +2804:1a6c::/32 br +2804:1a70::/32 br +2804:1a74::/32 br +2804:1a78::/32 br +2804:1a7c::/32 br +2804:1a80::/32 br +2804:1a84::/32 br +2804:1a88::/32 br +2804:1a8c::/32 br +2804:1a90::/32 br +2804:1a94::/32 br +2804:1a98::/32 br +2804:1a9c::/32 br +2804:1aa0::/32 br +2804:1aa4::/32 br +2804:1aa8::/32 br +2804:1aac::/32 br +2804:1ab0::/32 br +2804:1ab4::/32 br +2804:1ab8::/32 br +2804:1abc::/32 br +2804:1ac0::/32 br +2804:1ac4::/32 br +2804:1ac8::/32 br +2804:1acc::/32 br +2804:1ad0::/32 br +2804:1ad4::/32 br +2804:1ad8::/32 br +2804:1adc::/32 br +2804:1ae0::/32 br +2804:1ae4::/32 br +2804:1ae8::/32 br +2804:1aec::/32 br +2804:1af0::/32 br +2804:1af4::/32 br +2804:1af8::/32 br +2804:1afc::/32 br +2804:1b00::/32 br +2804:1b04::/32 br +2804:1b08::/32 br +2804:1b0c::/32 br +2804:1b10::/32 br +2804:1b14::/32 br +2804:1b18::/32 br +2804:1b1c::/32 br +2804:1b20::/32 br +2804:1b24::/32 br +2804:1b28::/32 br +2804:1b2c::/32 br +2804:1b30::/32 br +2804:1b34::/32 br +2804:1b38::/32 br +2804:1b3c::/32 br +2804:1b40::/32 br +2804:1b44::/32 br +2804:1b48::/32 br +2804:1b4c::/32 br +2804:1b50::/32 br +2804:1b54::/32 br +2804:1b58::/32 br +2804:1b5c::/32 br +2804:1b60::/32 br +2804:1b64::/32 br +2804:1b68::/32 br +2804:1b6c::/32 br +2804:1b70::/32 br +2804:1b74::/32 br +2804:1b78::/32 br +2804:1b7c::/32 br +2804:1b80::/32 br +2804:1b84::/32 br +2804:1b88::/32 br +2804:1b8c::/32 br +2804:1b90::/32 br +2804:1b94::/32 br +2804:1b98::/32 br +2804:1b9c::/32 br +2804:1ba0::/32 br +2804:1ba4::/32 br +2804:1ba8::/32 br +2804:1bac::/32 br +2804:1bb0::/32 br +2804:1bb4::/32 br +2804:1bb8::/32 br +2804:1bbc::/32 br +2804:1bc0::/32 br +2804:1bc4::/32 br +2804:1bc8::/32 br +2804:1bcc::/32 br +2804:1bd0::/32 br +2804:1bd4::/32 br +2804:1bd8::/32 br +2804:1bdc::/32 br +2804:1be0::/32 br +2804:1be4::/32 br +2804:1be8::/32 br +2804:1bec::/32 br +2804:1bf0::/32 br +2804:1bf4::/32 br +2804:1bf8::/32 br +2804:1bfc::/32 br +2804:1c00::/32 br +2804:1c04::/32 br +2804:1c08::/32 br +2804:1c0c::/32 br +2804:1c10::/32 br +2804:1c14::/32 br +2804:1c18::/32 br +2804:1c1c::/32 br +2804:1c20::/32 br +2804:1c24::/32 br +2804:1c28::/32 br +2804:1c2c::/32 br +2804:1c30::/32 br +2804:1c34::/32 br +2804:1c38::/32 br +2804:1c3c::/32 br +2804:1c40::/32 br +2804:1c44::/32 br +2804:1c48::/32 br +2804:1c4c::/32 br +2804:1c50::/32 br +2804:1c54::/32 br +2804:1c58::/32 br +2804:1c5c::/32 br +2804:1c60::/32 br +2804:1c64::/32 br +2804:1c68::/32 br +2804:1c6c::/32 br +2804:1c70::/32 br +2804:1c74::/32 br +2804:1c78::/32 br +2804:1c7c::/32 br +2804:1c80::/32 br +2804:1c84::/32 br +2804:1c88::/32 br +2804:1c8c::/32 br +2804:1c90::/32 br +2804:1c94::/32 br +2804:1c98::/32 br +2804:1c9c::/32 br +2804:1ca0::/32 br +2804:1ca4::/32 br +2804:1ca8::/32 br +2804:1cac::/32 br +2804:1cb0::/32 br +2804:1cb4::/32 br +2804:1cb8::/32 br +2804:1cbc::/32 br +2804:1cc0::/32 br +2804:1cc4::/32 br +2804:1cc8::/32 br +2804:1ccc::/32 br +2804:1cd0::/32 br +2804:1cd4::/32 br +2804:1cd8::/32 br +2804:1cdc::/32 br +2804:1ce0::/32 br +2804:1ce4::/32 br +2804:1ce8::/32 br +2804:1cec::/32 br +2804:1cf0::/32 br +2804:1cf4::/32 br +2804:1cf8::/32 br +2804:1cfc::/32 br +2804:1d00::/32 br +2804:1d04::/32 br +2804:1d08::/32 br +2804:1d0c::/32 br +2804:1d10::/32 br +2804:1d14::/32 br +2804:1d18::/32 br +2804:1d1c::/32 br +2804:1d20::/32 br +2804:1d24::/32 br +2804:1d28::/32 br +2804:1d2c::/32 br +2804:1d30::/32 br +2804:1d34::/32 br +2804:1d38::/32 br +2804:1d3c::/32 br +2804:1d40::/32 br +2804:1d44::/32 br +2804:1d48::/32 br +2804:1d4c::/32 br +2804:1d50::/32 br +2804:1d54::/32 br +2804:1d58::/32 br +2804:1d5c::/32 br +2804:1d60::/32 br +2804:1d64::/32 br +2804:1d68::/32 br +2804:1d6c::/32 br +2804:1d70::/32 br +2804:1d74::/32 br +2804:1d78::/32 br +2804:1d7c::/32 br +2804:1d80::/32 br +2804:1d84::/32 br +2804:1d88::/32 br +2804:1d8c::/32 br +2804:1d90::/32 br +2804:1d94::/32 br +2804:1d98::/32 br +2804:1d9c::/32 br +2804:1da0::/32 br +2804:1da4::/32 br +2804:1da8::/32 br +2804:1dac::/32 br +2804:1db0::/32 br +2804:1db4::/32 br +2804:1db8::/32 br +2804:1dbc::/32 br +2804:1dc0::/32 br +2804:1dc4::/32 br +2804:1dc8::/32 br +2804:1dcc::/32 br +2804:1dd0::/32 br +2804:1dd4::/32 br +2804:1dd8::/32 br +2804:1ddc::/32 br +2804:1de0::/32 br +2804:1de4::/32 br +2804:1de8::/32 br +2804:1dec::/32 br +2804:1df0::/32 br +2804:1df4::/32 br +2804:1df8::/32 br +2804:1dfc::/32 br +2804:1e00::/32 br +2804:1e04::/32 br +2804:1e08::/32 br +2804:1e0c::/32 br +2804:1e10::/32 br +2804:1e14::/32 br +2804:1e18::/32 br +2804:1e1c::/32 br +2804:1e20::/32 br +2804:1e24::/32 br +2804:1e28::/32 br +2804:1e2c::/32 br +2804:1e30::/32 br +2804:1e34::/32 br +2804:1e38::/32 br +2804:1e3c::/32 br +2804:1e40::/32 br +2804:1e44::/32 br +2804:1e48::/32 br +2804:1e4c::/32 br +2804:1e50::/32 br +2804:1e54::/32 br +2804:1e58::/32 br +2804:1e5c::/32 br +2804:1e60::/32 br +2804:1e64::/32 br +2804:1e68::/32 br +2804:1e6c::/32 br +2804:1e70::/32 br +2804:1e74::/32 br +2804:1e78::/32 br +2804:1e7c::/32 br +2804:1e80::/32 br +2804:1e84::/32 br +2804:1e88::/32 br +2804:1e8c::/32 br +2804:1e90::/32 br +2804:1e94::/32 br +2804:1e98::/32 br +2804:1e9c::/32 br +2804:1ea0::/32 br +2804:1ea4::/32 br +2804:1ea8::/32 br +2804:1eac::/32 br +2804:1eb0::/32 br +2804:1eb4::/32 br +2804:1eb8::/32 br +2804:1ebc::/32 br +2804:1ec0::/32 br +2804:1ec4::/32 br +2804:1ec8::/32 br +2804:1ecc::/32 br +2804:1ed0::/32 br +2804:1ed4::/32 br +2804:1ed8::/32 br +2804:1edc::/32 br +2804:1ee0::/32 br +2804:1ee4::/32 br +2804:1ee8::/32 br +2804:1eec::/32 br +2804:1ef0::/32 br +2804:1ef4::/32 br +2804:1ef8::/32 br +2804:1efc::/32 br +2804:1f00::/32 br +2804:1f02::/32 br +2804:1f04::/32 br +2804:1f06::/32 br +2804:1f08::/32 br +2804:1f0a::/32 br +2804:1f0c::/32 br +2804:1f0e::/35 br +2804:1f10::/32 br +2804:1f12::/32 br +2804:1f14::/32 br +2804:1f16::/32 br +2804:1f18::/32 br +2804:1f1a::/32 br +2804:1f1c::/32 br +2804:1f1e::/32 br +2804:2000::/32 br +2804:2004::/32 br +2804:2008::/32 br +2804:200c::/32 br +2804:2010::/32 br +2804:2014::/32 br +2804:2018::/32 br +2804:201c::/32 br +2804:2020::/32 br +2804:2024::/32 br +2804:2028::/32 br +2804:202c::/32 br +2804:2030::/32 br +2804:2034::/32 br +2804:2038::/32 br +2804:203c::/32 br +2804:2040::/32 br +2804:2044::/32 br +2804:2048::/32 br +2804:204c::/32 br +2804:2050::/32 br +2804:2054::/32 br +2804:2058::/32 br +2804:205c::/32 br +2804:2060::/32 br +2804:2064::/32 br +2804:2068::/32 br +2804:206c::/32 br +2804:2070::/32 br +2804:2074::/32 br +2804:2078::/32 br +2804:207c::/32 br +2804:2080::/32 br +2804:2084::/32 br +2804:2088::/32 br +2804:208c::/32 br +2804:2090::/32 br +2804:2094::/32 br +2804:2098::/32 br +2804:209c::/32 br +2804:20a0::/32 br +2804:20a4::/32 br +2804:20a8::/32 br +2804:20ac::/32 br +2804:20b0::/32 br +2804:20b4::/32 br +2804:20b8::/32 br +2804:20bc::/32 br +2804:20c0::/32 br +2804:20c4::/32 br +2804:20c8::/32 br +2804:20cc::/32 br +2804:20d0::/32 br +2804:20d4::/32 br +2804:20d8::/32 br +2804:20dc::/32 br +2804:20e0::/32 br +2804:20e4::/32 br +2804:20e8::/32 br +2804:20ec::/32 br +2804:20f0::/32 br +2804:20f4::/32 br +2804:20f8::/32 br +2804:20fc::/32 br +2804:2100::/32 br +2804:2104::/32 br +2804:2108::/32 br +2804:210c::/32 br +2804:2110::/32 br +2804:2114::/32 br +2804:2118::/32 br +2804:211c::/32 br +2804:2120::/32 br +2804:2124::/32 br +2804:2128::/32 br +2804:212c::/32 br +2804:2130::/32 br +2804:2134::/32 br +2804:2138::/32 br +2804:213c::/32 br +2804:2140::/32 br +2804:2144::/32 br +2804:2148::/32 br +2804:214c::/32 br +2804:2150::/32 br +2804:2154::/32 br +2804:2158::/32 br +2804:215c::/32 br +2804:2160::/32 br +2804:2164::/32 br +2804:2168::/32 br +2804:216c::/32 br +2804:2170::/32 br +2804:2174::/32 br +2804:2178::/32 br +2804:217c::/32 br +2804:2180::/32 br +2804:2184::/32 br +2804:2188::/32 br +2804:218c::/32 br +2804:2190::/32 br +2804:2194::/32 br +2804:2198::/32 br +2804:219c::/32 br +2804:21a0::/32 br +2804:21a4::/32 br +2804:21a8::/32 br +2804:21ac::/32 br +2804:21b0::/32 br +2804:21b4::/32 br +2804:21b8::/32 br +2804:21bc::/32 br +2804:21c0::/32 br +2804:21c4::/32 br +2804:21c8::/32 br +2804:21cc::/32 br +2804:21d0::/32 br +2804:21d4::/32 br +2804:21d8::/32 br +2804:21dc::/32 br +2804:21e0::/32 br +2804:21e4::/32 br +2804:21e8::/32 br +2804:21ec::/32 br +2804:21f0::/32 br +2804:21f4::/32 br +2804:21f8::/32 br +2804:21fc::/32 br +2804:2200::/32 br +2804:2204::/32 br +2804:2208::/32 br +2804:220c::/32 br +2804:2210::/32 br +2804:2214::/32 br +2804:2218::/32 br +2804:221c::/32 br +2804:2220::/32 br +2804:2224::/32 br +2804:2228::/32 br +2804:222c::/32 br +2804:2230::/32 br +2804:2234::/32 br +2804:2238::/32 br +2804:223c::/32 br +2804:2240::/32 br +2804:2244::/32 br +2804:2248::/32 br +2804:224c::/32 br +2804:2250::/32 br +2804:2254::/32 br +2804:2258::/32 br +2804:225c::/32 br +2804:2260::/32 br +2804:2264::/32 br +2804:2268::/32 br +2804:226c::/32 br +2804:2270::/32 br +2804:2274::/32 br +2804:2278::/32 br +2804:227c::/32 br +2804:2284::/32 br +2804:2288::/32 br +2804:228c::/32 br +2804:2290::/32 br +2804:2294::/32 br +2804:2298::/32 br +2804:229c::/32 br +2804:22a0::/32 br +2804:22a4::/32 br +2804:22a8::/32 br +2804:22ac::/32 br +2804:22b0::/32 br +2804:22b4::/32 br +2804:22b8::/32 br +2804:22bc::/32 br +2804:22c0::/32 br +2804:22c4::/32 br +2804:22c8::/32 br +2804:22cc::/32 br +2804:22d0::/32 br +2804:22d4::/32 br +2804:22d8::/32 br +2804:22dc::/32 br +2804:22e0::/32 br +2804:22e4::/32 br +2804:22e8::/32 br +2804:22ec::/32 br +2804:22f0::/32 br +2804:22f4::/32 br +2804:22f8::/32 br +2804:22fc::/32 br +2804:2300::/32 br +2804:2304::/32 br +2804:2308::/32 br +2804:230c::/32 br +2804:2310::/32 br +2804:2314::/32 br +2804:2318::/32 br +2804:231c::/32 br +2804:2320::/32 br +2804:2324::/32 br +2804:2328::/32 br +2804:232c::/32 br +2804:2330::/32 br +2804:2334::/32 br +2804:2338::/32 br +2804:233c::/32 br +2804:2340::/32 br +2804:2344::/32 br +2804:2348::/32 br +2804:234c::/32 br +2804:2350::/32 br +2804:2354::/32 br +2804:2358::/32 br +2804:235c::/32 br +2804:2360::/32 br +2804:2364::/32 br +2804:2368::/32 br +2804:236c::/32 br +2804:2370::/32 br +2804:2374::/32 br +2804:2378::/32 br +2804:237c::/32 br +2804:2380::/32 br +2804:2384::/32 br +2804:2388::/32 br +2804:238c::/32 br +2804:2390::/32 br +2804:2394::/32 br +2804:2398::/32 br +2804:239c::/32 br +2804:23a0::/32 br +2804:23a4::/32 br +2804:23a8::/32 br +2804:23ac::/32 br +2804:23b0::/32 br +2804:23b4::/32 br +2804:23b8::/32 br +2804:23bc::/32 br +2804:23c0::/32 br +2804:23c4::/32 br +2804:23c8::/32 br +2804:23cc::/32 br +2804:23d0::/32 br +2804:23d4::/32 br +2804:23d8::/32 br +2804:23dc::/32 br +2804:23e0::/32 br +2804:23e4::/32 br +2804:23e8::/32 br +2804:23ec::/32 br +2804:23f0::/32 br +2804:23f4::/32 br +2804:23f8::/32 br +2804:23fc::/32 br +2804:2400::/32 br +2804:2404::/32 br +2804:2408::/32 br +2804:240c::/32 br +2804:2410::/32 br +2804:2414::/32 br +2804:2418::/32 br +2804:241c::/32 br +2804:2420::/32 br +2804:2424::/32 br +2804:2428::/32 br +2804:242c::/32 br +2804:2430::/32 br +2804:2434::/32 br +2804:2438::/32 br +2804:243c::/32 br +2804:2440::/32 br +2804:2444::/32 br +2804:2448::/32 br +2804:244c::/32 br +2804:2450::/32 br +2804:2454::/32 br +2804:2458::/32 br +2804:245c::/32 br +2804:2460::/32 br +2804:2464::/32 br +2804:2468::/32 br +2804:246c::/32 br +2804:2474::/32 br +2804:2478::/32 br +2804:247c::/32 br +2804:2480::/32 br +2804:2484::/32 br +2804:2488::/32 br +2804:248c::/32 br +2804:2490::/32 br +2804:2494::/32 br +2804:2498::/32 br +2804:249c::/32 br +2804:24a0::/32 br +2804:24a4::/32 br +2804:24a8::/32 br +2804:24ac::/32 br +2804:24b0::/32 br +2804:24b4::/32 br +2804:24b8::/32 br +2804:24bc::/32 br +2804:24c0::/32 br +2804:24c4::/32 br +2804:24c8::/32 br +2804:24cc::/32 br +2804:24d0::/32 br +2804:24d4::/32 br +2804:24d8::/32 br +2804:24dc::/32 br +2804:24e0::/32 br +2804:24e4::/32 br +2804:24e8::/32 br +2804:24ec::/32 br +2804:24f0::/32 br +2804:24f4::/32 br +2804:24f8::/32 br +2804:24fc::/32 br +2804:2500::/32 br +2804:2504::/32 br +2804:2508::/32 br +2804:250c::/32 br +2804:2510::/32 br +2804:2514::/32 br +2804:2518::/32 br +2804:251c::/32 br +2804:2520::/32 br +2804:2524::/32 br +2804:2528::/32 br +2804:252c::/32 br +2804:2530::/32 br +2804:2534::/32 br +2804:2538::/32 br +2804:253c::/32 br +2804:2540::/32 br +2804:2544::/32 br +2804:2548::/32 br +2804:254c::/32 br +2804:2550::/32 br +2804:2554::/32 br +2804:2558::/32 br +2804:255c::/32 br +2804:2560::/32 br +2804:2564::/32 br +2804:2568::/32 br +2804:256c::/32 br +2804:2570::/32 br +2804:2574::/32 br +2804:2578::/32 br +2804:257c::/32 br +2804:2580::/32 br +2804:2584::/32 br +2804:2588::/32 br +2804:258c::/32 br +2804:2590::/32 br +2804:2594::/32 br +2804:2598::/32 br +2804:259c::/32 br +2804:25a0::/32 br +2804:25a4::/32 br +2804:25a8::/32 br +2804:25ac::/32 br +2804:25b0::/32 br +2804:25b4::/32 br +2804:25b8::/32 br +2804:25bc::/32 br +2804:25c0::/32 br +2804:25c4::/32 br +2804:25c8::/32 br +2804:25cc::/32 br +2804:25d0::/32 br +2804:25d4::/32 br +2804:25d8::/32 br +2804:25dc::/32 br +2804:25e0::/32 br +2804:25e4::/32 br +2804:25e8::/32 br +2804:25ec::/32 br +2804:25f0::/32 br +2804:25f4::/32 br +2804:25f8::/32 br +2804:25fc::/32 br +2804:2600::/32 br +2804:2604::/32 br +2804:2608::/32 br +2804:260c::/32 br +2804:2610::/32 br +2804:2614::/32 br +2804:2618::/32 br +2804:261c::/32 br +2804:2620::/32 br +2804:2624::/32 br +2804:2628::/32 br +2804:262c::/32 br +2804:2630::/32 br +2804:2634::/32 br +2804:2638::/32 br +2804:263c::/32 br +2804:2640::/32 br +2804:2644::/32 br +2804:2648::/32 br +2804:264c::/32 br +2804:2650::/32 br +2804:2654::/32 br +2804:2658::/32 br +2804:265c::/32 br +2804:2660::/32 br +2804:2664::/32 br +2804:2668::/32 br +2804:266c::/32 br +2804:2670::/32 br +2804:2674::/32 br +2804:2678::/32 br +2804:267c::/32 br +2804:2680::/32 br +2804:2684::/32 br +2804:2688::/32 br +2804:268c::/32 br +2804:2690::/32 br +2804:2694::/32 br +2804:2698::/32 br +2804:269c::/32 br +2804:26a0::/32 br +2804:26a4::/32 br +2804:26a8::/32 br +2804:26ac::/32 br +2804:26b0::/32 br +2804:26b4::/32 br +2804:26b8::/32 br +2804:26bc::/32 br +2804:26c0::/32 br +2804:26c4::/32 br +2804:26c8::/32 br +2804:26cc::/32 br +2804:26d0::/32 br +2804:26d4::/32 br +2804:26d8::/32 br +2804:26dc::/32 br +2804:26e0::/32 br +2804:26e4::/32 br +2804:26e8::/32 br +2804:26ec::/32 br +2804:26f0::/32 br +2804:26f4::/32 br +2804:26f8::/32 br +2804:26fc::/32 br +2804:2700::/32 br +2804:2704::/32 br +2804:270c::/32 br +2804:2710::/32 br +2804:2714::/32 br +2804:2718::/32 br +2804:271c::/32 br +2804:2720::/32 br +2804:2724::/32 br +2804:2728::/32 br +2804:272c::/32 br +2804:2730::/32 br +2804:2734::/32 br +2804:2738::/32 br +2804:273c::/32 br +2804:2740::/32 br +2804:2744::/32 br +2804:2748::/32 br +2804:274c::/32 br +2804:2750::/32 br +2804:2754::/32 br +2804:2758::/32 br +2804:275c::/32 br +2804:2760::/32 br +2804:2764::/32 br +2804:2768::/32 br +2804:276c::/32 br +2804:2770::/32 br +2804:2774::/32 br +2804:2778::/32 br +2804:277c::/32 br +2804:2780::/32 br +2804:2784::/32 br +2804:2788::/32 br +2804:278c::/32 br +2804:2790::/32 br +2804:2794::/32 br +2804:2798::/32 br +2804:279c::/32 br +2804:27a0::/32 br +2804:27a4::/32 br +2804:27a8::/32 br +2804:27ac::/32 br +2804:27b0::/32 br +2804:27b4::/32 br +2804:27b8::/32 br +2804:27bc::/32 br +2804:27c0::/32 br +2804:27c4::/32 br +2804:27c8::/32 br +2804:27cc::/32 br +2804:27d0::/32 br +2804:27d4::/32 br +2804:27d8::/32 br +2804:27dc::/32 br +2804:27e0::/32 br +2804:27e4::/32 br +2804:27e8::/32 br +2804:27ec::/32 br +2804:27f0::/32 br +2804:27f4::/32 br +2804:27f8::/32 br +2804:27fc::/32 br +2804:2800::/32 br +2804:2804::/32 br +2804:2808::/32 br +2804:280c::/32 br +2804:2810::/32 br +2804:2814::/32 br +2804:2818::/32 br +2804:281c::/32 br +2804:2820::/32 br +2804:2824::/32 br +2804:2828::/32 br +2804:282c::/32 br +2804:2830::/32 br +2804:2834::/32 br +2804:2838::/32 br +2804:283c::/32 br +2804:2840::/32 br +2804:2844::/32 br +2804:2848::/32 br +2804:284c::/32 br +2804:2850::/32 br +2804:2854::/32 br +2804:2858::/32 br +2804:285c::/32 br +2804:2860::/32 br +2804:2864::/32 br +2804:2868::/32 br +2804:286c::/32 br +2804:2870::/32 br +2804:2874::/32 br +2804:2878::/32 br +2804:287c::/32 br +2804:2880::/32 br +2804:2884::/32 br +2804:2888::/32 br +2804:288c::/32 br +2804:2890::/32 br +2804:2894::/32 br +2804:2898::/32 br +2804:289c::/32 br +2804:28a0::/32 br +2804:28a4::/32 br +2804:28a8::/32 br +2804:28ac::/32 br +2804:28b0::/32 br +2804:28b4::/32 br +2804:28b8::/32 br +2804:28bc::/32 br +2804:28c0::/32 br +2804:28c4::/32 br +2804:28c8::/32 br +2804:28cc::/32 br +2804:28d0::/32 br +2804:28d4::/32 br +2804:28d8::/32 br +2804:28dc::/32 br +2804:28e0::/32 br +2804:28e4::/32 br +2804:28e8::/32 br +2804:28ec::/32 br +2804:28f0::/32 br +2804:28f4::/32 br +2804:28f8::/32 br +2804:28fc::/32 br +2804:2900::/32 br +2804:2904::/32 br +2804:2908::/32 br +2804:290c::/32 br +2804:2910::/32 br +2804:2914::/32 br +2804:2918::/32 br +2804:291c::/32 br +2804:2920::/32 br +2804:2924::/32 br +2804:2928::/32 br +2804:292c::/32 br +2804:2930::/32 br +2804:2934::/32 br +2804:2938::/32 br +2804:293c::/32 br +2804:2940::/32 br +2804:2944::/32 br +2804:2948::/32 br +2804:294c::/32 br +2804:2950::/32 br +2804:2954::/32 br +2804:2958::/32 br +2804:295c::/32 br +2804:2960::/32 br +2804:2964::/32 br +2804:2968::/32 br +2804:296c::/32 br +2804:2970::/32 br +2804:2974::/32 br +2804:2978::/32 br +2804:297c::/32 br +2804:2980::/32 br +2804:2984::/32 br +2804:2988::/32 br +2804:298c::/32 br +2804:2990::/32 br +2804:2994::/32 br +2804:2998::/32 br +2804:299c::/32 br +2804:29a0::/32 br +2804:29a4::/32 br +2804:29a8::/32 br +2804:29ac::/32 br +2804:29b0::/32 br +2804:29b4::/32 br +2804:29b8::/32 br +2804:29bc::/32 br +2804:29c0::/32 br +2804:29c4::/32 br +2804:29c8::/32 br +2804:29cc::/32 br +2804:29d0::/32 br +2804:29d4::/32 br +2804:29d8::/32 br +2804:29dc::/32 br +2804:29e0::/32 br +2804:29e4::/32 br +2804:29e8::/32 br +2804:29ec::/32 br +2804:29f0::/32 br +2804:29f4::/32 br +2804:29f8::/32 br +2804:29fc::/32 br +2804:2a00::/32 br +2804:2a04::/32 br +2804:2a08::/32 br +2804:2a0c::/32 br +2804:2a10::/32 br +2804:2a14::/32 br +2804:2a18::/32 br +2804:2a1c::/32 br +2804:2a20::/32 br +2804:2a24::/32 br +2804:2a28::/32 br +2804:2a2c::/32 br +2804:2a30::/32 br +2804:2a34::/32 br +2804:2a38::/32 br +2804:2a3c::/32 br +2804:2a40::/32 br +2804:2a44::/32 br +2804:2a48::/32 br +2804:2a4c::/32 br +2804:2a50::/32 br +2804:2a54::/32 br +2804:2a58::/32 br +2804:2a5c::/32 br +2804:2a60::/32 br +2804:2a64::/32 br +2804:2a68::/32 br +2804:2a6c::/32 br +2804:2a70::/32 br +2804:2a74::/32 br +2804:2a78::/32 br +2804:2a7c::/32 br +2804:2a80::/32 br +2804:2a84::/32 br +2804:2a88::/32 br +2804:2a8c::/32 br +2804:2a90::/32 br +2804:2a94::/32 br +2804:2a98::/32 br +2804:2a9c::/32 br +2804:2aa0::/32 br +2804:2aa4::/32 br +2804:2aa8::/32 br +2804:2aac::/32 br +2804:2ab0::/32 br +2804:2ab4::/32 br +2804:2ab8::/32 br +2804:2abc::/32 br +2804:2ac0::/32 br +2804:2ac4::/32 br +2804:2ac8::/32 br +2804:2acc::/32 br +2804:2ad0::/32 br +2804:2ad4::/32 br +2804:2ad8::/32 br +2804:2adc::/32 br +2804:2ae0::/32 br +2804:2ae4::/32 br +2804:2ae8::/32 br +2804:2aec::/32 br +2804:2af0::/32 br +2804:2af4::/32 br +2804:2af8::/32 br +2804:2afc::/32 br +2804:2b00::/32 br +2804:2b04::/32 br +2804:2b08::/32 br +2804:2b0c::/32 br +2804:2b10::/32 br +2804:2b14::/32 br +2804:2b18::/32 br +2804:2b1c::/32 br +2804:2b20::/32 br +2804:2b24::/32 br +2804:2b28::/32 br +2804:2b2c::/32 br +2804:2b30::/32 br +2804:2b34::/32 br +2804:2b38::/32 br +2804:2b3c::/32 br +2804:2b40::/32 br +2804:2b44::/32 br +2804:2b48::/32 br +2804:2b4c::/32 br +2804:2b50::/32 br +2804:2b54::/32 br +2804:2b58::/32 br +2804:2b5c::/32 br +2804:2b60::/32 br +2804:2b64::/32 br +2804:2b68::/32 br +2804:2b6c::/32 br +2804:2b70::/32 br +2804:2b74::/32 br +2804:2b78::/32 br +2804:2b7c::/32 br +2804:2b80::/32 br +2804:2b84::/32 br +2804:2b88::/32 br +2804:2b8c::/32 br +2804:2b90::/32 br +2804:2b94::/32 br +2804:2b98::/32 br +2804:2b9c::/32 br +2804:2ba0::/32 br +2804:2ba4::/32 br +2804:2ba8::/32 br +2804:2bac::/32 br +2804:2bb0::/32 br +2804:2bb4::/32 br +2804:2bb8::/32 br +2804:2bbc::/32 br +2804:2bc0::/32 br +2804:2bc4::/32 br +2804:2bc8::/32 br +2804:2bcc::/32 br +2804:2bd0::/32 br +2804:2bd4::/32 br +2804:2bd8::/32 br +2804:2bdc::/32 br +2804:2be0::/32 br +2804:2be4::/32 br +2804:2be8::/32 br +2804:2bec::/32 br +2804:2bf0::/32 br +2804:2bf4::/32 br +2804:2bf8::/32 br +2804:2bfc::/32 br +2804:2c00::/32 br +2804:2c04::/32 br +2804:2c08::/32 br +2804:2c0c::/32 br +2804:2c10::/32 br +2804:2c14::/32 br +2804:2c18::/32 br +2804:2c1c::/32 br +2804:2c20::/32 br +2804:2c24::/32 br +2804:2c28::/32 br +2804:2c2c::/32 br +2804:2c30::/32 br +2804:2c34::/32 br +2804:2c38::/32 br +2804:2c3c::/32 br +2804:2c40::/32 br +2804:2c44::/32 br +2804:2c48::/32 br +2804:2c4c::/32 br +2804:2c50::/32 br +2804:2c54::/32 br +2804:2c58::/32 br +2804:2c5c::/32 br +2804:2c60::/32 br +2804:2c64::/32 br +2804:2c68::/32 br +2804:2c6c::/32 br +2804:2c70::/32 br +2804:2c74::/32 br +2804:2c78::/32 br +2804:2c7c::/32 br +2804:2c80::/32 br +2804:2c84::/32 br +2804:2c88::/32 br +2804:2c8c::/32 br +2804:2c90::/32 br +2804:2c94::/32 br +2804:2c98::/32 br +2804:2c9c::/32 br +2804:2ca0::/32 br +2804:2ca4::/32 br +2804:2ca8::/32 br +2804:2cac::/32 br +2804:2cb0::/32 br +2804:2cb4::/32 br +2804:2cb8::/32 br +2804:2cbc::/32 br +2804:2cc0::/32 br +2804:2cc4::/32 br +2804:2cc8::/32 br +2804:2ccc::/32 br +2804:2cd0::/32 br +2804:2cd4::/32 br +2804:2cd8::/32 br +2804:2cdc::/32 br +2804:2ce0::/32 br +2804:2ce4::/32 br +2804:2ce8::/32 br +2804:2cec::/32 br +2804:2cf0::/32 br +2804:2cf4::/32 br +2804:2cf8::/32 br +2804:2cfc::/32 br +2804:2d00::/32 br +2804:2d04::/32 br +2804:2d08::/32 br +2804:2d0c::/32 br +2804:2d10::/32 br +2804:2d14::/32 br +2804:2d18::/32 br +2804:2d1c::/32 br +2804:2d20::/32 br +2804:2d24::/32 br +2804:2d28::/32 br +2804:2d2c::/32 br +2804:2d30::/32 br +2804:2d34::/32 br +2804:2d38::/32 br +2804:2d3c::/32 br +2804:2d40::/32 br +2804:2d44::/32 br +2804:2d48::/32 br +2804:2d4c::/32 br +2804:2d50::/32 br +2804:2d54::/32 br +2804:2d58::/32 br +2804:2d5c::/32 br +2804:2d60::/32 br +2804:2d64::/32 br +2804:2d68::/32 br +2804:2d6c::/32 br +2804:2d70::/32 br +2804:2d74::/32 br +2804:2d78::/32 br +2804:2d7c::/32 br +2804:2d80::/32 br +2804:2d84::/32 br +2804:2d88::/32 br +2804:2d8c::/32 br +2804:2d90::/32 br +2804:2d94::/32 br +2804:2d98::/32 br +2804:2d9c::/32 br +2804:2da0::/32 br +2804:2da4::/32 br +2804:2da8::/32 br +2804:2dac::/32 br +2804:2db0::/32 br +2804:2db4::/32 br +2804:2db8::/32 br +2804:2dbc::/32 br +2804:2dc0::/32 br +2804:2dc4::/32 br +2804:2dc8::/32 br +2804:2dcc::/32 br +2804:2dd0::/32 br +2804:2dd4::/32 br +2804:2dd8::/32 br +2804:2ddc::/32 br +2804:2de0::/32 br +2804:2de4::/32 br +2804:2de8::/32 br +2804:2dec::/32 br +2804:2df0::/32 br +2804:2df4::/32 br +2804:2df8::/32 br +2804:2dfc::/32 br +2804:2e00::/32 br +2804:2e04::/32 br +2804:2e08::/32 br +2804:2e0c::/32 br +2804:2e10::/32 br +2804:2e14::/32 br +2804:2e18::/32 br +2804:2e1c::/32 br +2804:2e20::/32 br +2804:2e24::/32 br +2804:2e28::/32 br +2804:2e2c::/32 br +2804:2e30::/32 br +2804:2e34::/32 br +2804:2e38::/32 br +2804:2e3c::/32 br +2804:2e40::/32 br +2804:2e44::/32 br +2804:2e48::/32 br +2804:2e4c::/32 br +2804:2e50::/32 br +2804:2e54::/32 br +2804:2e58::/32 br +2804:2e5c::/32 br +2804:2e60::/32 br +2804:2e64::/32 br +2804:2e68::/32 br +2804:2e6c::/32 br +2804:2e70::/32 br +2804:2e74::/32 br +2804:2e78::/32 br +2804:2e7c::/32 br +2804:2e80::/32 br +2804:2e84::/32 br 2806::/28 mx -2806:200::/32 mx -2806:220::/32 mx +2806:200::/48 mx +2806:217::/32 mx +2806:230::/32 mx +2806:238::/48 mx +2806:238:10::/48 mx +2806:239::/32 mx 2806:240::/32 mx 2806:250::/32 mx +2806:260::/32 mx +2806:270::/32 mx +2806:280::/32 mx +2806:290::/32 mx +2806:2a0::/32 mx +2806:2b0::/32 mx +2806:2c0::/32 mx +2806:2d0::/32 mx +2806:2e0::/32 mx +2806:2f0::/32 mx +2806:300::/32 mx +2806:310::/32 mx +2806:320::/32 mx +2806:330::/32 mx +2806:340::/32 mx +2806:350::/32 mx +2806:360::/32 mx +2806:370::/32 mx 2806:1000::/32 mx 2a00::/22 de 2a00:800::/32 se @@ -6060,7 +16194,6 @@ 2a00:cd8::/32 nl 2a00:ce0::/32 gb 2a00:ce8::/32 ch -2a00:cf0::/32 mc 2a00:cf8::/32 at 2a00:d00::/32 nl 2a00:d08::/32 ch @@ -6069,9 +16202,7 @@ 2a00:d20::/32 ir 2a00:d28::/32 ch 2a00:d30::/32 ae -2a00:d38::/32 cz 2a00:d40::/32 it -2a00:d48::/32 ru 2a00:d50::/32 ch 2a00:d58::/32 de 2a00:d60::/32 es @@ -6082,7 +16213,6 @@ 2a00:d88::/32 at 2a00:d90::/32 se 2a00:d98::/32 ru -2a00:da0::/32 bg 2a00:da8::/32 de 2a00:db0::/32 ch 2a00:db8::/32 ru @@ -6098,15 +16228,12 @@ 2a00:e10::/32 de 2a00:e18::/32 no 2a00:e20::/32 gb -2a00:e28::/32 ru 2a00:e30::/32 de 2a00:e38::/32 be 2a00:e40::/32 bg 2a00:e48::/32 no 2a00:e50::/32 de -2a00:e58::/32 de 2a00:e60::/32 de -2a00:e68::/32 de 2a00:e70::/32 es 2a00:e78::/32 ru 2a00:e80::/32 fr @@ -6126,7 +16253,6 @@ 2a00:ef0::/32 dk 2a00:ef8::/32 no 2a00:f00::/32 ru -2a00:f08::/32 ru 2a00:f10::/32 nl 2a00:f18::/32 gb 2a00:f20::/32 it @@ -6163,7 +16289,6 @@ 2a00:1020::/32 ru 2a00:1028::/32 cz 2a00:1030::/32 de -2a00:1038::/32 ch 2a00:1040::/32 dk 2a00:1048::/32 nl 2a00:1050::/32 de @@ -6174,7 +16299,6 @@ 2a00:1078::/32 ru 2a00:1080::/32 fr 2a00:1088::/32 it -2a00:1090::/32 gb 2a00:1098::/32 gb 2a00:10a0::/32 pl 2a00:10a8::/32 ru @@ -6186,7 +16310,6 @@ 2a00:10d8::/32 sk 2a00:10e0::/32 md 2a00:10e8::/32 gb -2a00:10f0::/32 gb 2a00:10f8::/32 lu 2a00:1100::/32 de 2a00:1108::/32 rs @@ -6229,11 +16352,9 @@ 2a00:1238::/32 cz 2a00:1240::/32 pl 2a00:1248::/32 ru -2a00:1250::/32 gb 2a00:1258::/32 be 2a00:1260::/32 gb 2a00:1268::/32 cz -2a00:1270::/32 jo 2a00:1278::/32 de 2a00:1280::/32 nl 2a00:1288::/32 gb @@ -6242,14 +16363,12 @@ 2a00:12a0::/32 ru 2a00:12a8::/32 sk 2a00:12b0::/32 fr -2a00:12b8::/32 es 2a00:12c0::/32 de 2a00:12c8::/32 ru 2a00:12d0::/32 de -2a00:12d8::/32 de 2a00:12e0::/32 at 2a00:12e8::/32 de -2a00:12f0::/32 eu +2a00:12f0::/32 nl 2a00:12f8::/32 kz 2a00:1300::/32 se 2a00:1308::/32 pl @@ -6257,12 +16376,11 @@ 2a00:1318::/32 gb 2a00:1320::/32 gb 2a00:1328::/32 de -2a00:1330::/32 ch 2a00:1338::/32 de 2a00:1340::/32 de 2a00:1348::/32 de 2a00:1350::/32 gb -2a00:1358::/32 cy +2a00:1358::/32 gr 2a00:1360::/32 it 2a00:1368::/32 si 2a00:1370::/32 ru @@ -6290,7 +16408,6 @@ 2a00:1420::/32 si 2a00:1428::/32 lt 2a00:1430::/32 gb -2a00:1438::/32 si 2a00:1440::/32 ru 2a00:1448::/32 si 2a00:1450::/32 ie @@ -6321,7 +16438,6 @@ 2a00:1518::/32 ru 2a00:1520::/32 se 2a00:1528::/32 be -2a00:1530::/32 hu 2a00:1538::/32 gb 2a00:1540::/32 gb 2a00:1548::/32 no @@ -6342,15 +16458,13 @@ 2a00:15c0::/32 at 2a00:15c8::/32 ir 2a00:15d0::/32 gb -2a00:15d8::/32 sa 2a00:15e0::/32 de 2a00:15e8::/32 de 2a00:15f0::/32 hu 2a00:15f8::/32 ru 2a00:1600::/32 si -2a00:1608::/32 hu +2a00:1608::/32 eu 2a00:1610::/32 at -2a00:1618::/32 at 2a00:1620::/32 it 2a00:1628::/32 at 2a00:1630::/32 nl @@ -6358,7 +16472,6 @@ 2a00:1640::/32 ru 2a00:1648::/32 de 2a00:1650::/32 pt -2a00:1658::/32 nl 2a00:1660::/32 es 2a00:1668::/32 gb 2a00:1670::/32 gb @@ -6370,13 +16483,11 @@ 2a00:16a0::/32 fi 2a00:16a8::/32 de 2a00:16b0::/32 se -2a00:16c0::/32 sk 2a00:16c8::/32 gb 2a00:16d0::/32 ru 2a00:16d8::/32 se 2a00:16e0::/32 ee 2a00:16e8::/32 lb -2a00:16f0::/32 at 2a00:16f8::/32 gb 2a00:1700::/32 ru 2a00:1708::/32 nl @@ -6385,13 +16496,11 @@ 2a00:1720::/32 gb 2a00:1728::/32 bg 2a00:1730::/32 ru -2a00:1740::/32 ch 2a00:1748::/32 de 2a00:1750::/32 nl 2a00:1758::/32 ir 2a00:1760::/32 by 2a00:1768::/32 nl -2a00:1770::/32 hu 2a00:1778::/32 fi 2a00:1780::/32 lv 2a00:1788::/32 fr @@ -6403,7 +16512,6 @@ 2a00:17b8::/32 fi 2a00:17c0::/32 lv 2a00:17c8::/32 ch -2a00:17d0::/32 ch 2a00:17d8::/32 de 2a00:17e0::/32 ch 2a00:17e8::/32 at @@ -6413,7 +16521,6 @@ 2a00:1808::/32 cz 2a00:1810::/32 lv 2a00:1818::/32 ru -2a00:1820::/32 ru 2a00:1828::/32 de 2a00:1830::/32 de 2a00:1838::/32 ru @@ -6423,7 +16530,6 @@ 2a00:1858::/32 md 2a00:1860::/32 at 2a00:1868::/32 be -2a00:1870::/32 gb 2a00:1878::/32 hu 2a00:1880::/32 tr 2a00:1888::/32 fr @@ -6521,7 +16627,7 @@ 2a00:1b68::/32 ru 2a00:1b70::/32 dk 2a00:1b78::/32 ru -2a00:1b80::/32 si +2a00:1b80::/32 ba 2a00:1b88::/32 fr 2a00:1b90::/32 hu 2a00:1b98::/32 gb @@ -6630,7 +16736,6 @@ 2a00:1ed8::/32 ie 2a00:1ee0::/32 gb 2a00:1ee8::/32 sy -2a00:1ef0::/32 bg 2a00:1ef8::/32 sa 2a00:1f00::/32 nl 2a00:1f08::/32 de @@ -6657,7 +16762,6 @@ 2a00:1fb0::/32 gb 2a00:1fb8::/32 nl 2a00:1fc0::/32 ru -2a00:1fc8::/32 fi 2a00:1fd0::/32 gb 2a00:1fd8::/32 de 2a00:1fe0::/32 ir @@ -6666,413 +16770,1515 @@ 2a00:1ff8::/32 de 2a00:2000::/32 gb 2a00:4000::/32 ir +2a00:4020::/32 dk 2a00:4040::/32 fr +2a00:4060::/32 it 2a00:4080::/32 ro +2a00:40a0::/32 pl 2a00:40c0::/32 at +2a00:40e0::/32 it 2a00:4100::/32 de -2a00:4140::/32 ro +2a00:4120::/32 pl +2a00:4140::/32 nl +2a00:4160::/32 es 2a00:4180::/32 lu +2a00:41a0::/32 az 2a00:41c0::/32 ch +2a00:41e0::/32 fr 2a00:4200::/32 ru +2a00:4220::/32 it 2a00:4240::/32 gb +2a00:4260::/32 tr 2a00:4280::/32 fr +2a00:42a0::/32 gb 2a00:42c0::/32 fr +2a00:42e0::/32 de 2a00:4300::/32 gb +2a00:4320::/32 de 2a00:4340::/32 gb +2a00:4360::/32 iq 2a00:4380::/32 fi +2a00:43a0::/32 gb 2a00:43c0::/32 es +2a00:43e0::/32 it 2a00:4400::/32 at +2a00:4420::/32 ru 2a00:4440::/32 rs +2a00:4460::/32 dk 2a00:4480::/32 ru +2a00:44a0::/32 ru 2a00:44c0::/32 gb +2a00:44e0::/32 gb 2a00:4500::/32 ru +2a00:4520::/32 kw 2a00:4540::/32 fi +2a00:4560::/32 es 2a00:4580::/32 ru +2a00:45a0::/32 sy 2a00:45c0::/32 nl -2a00:4600::/32 at +2a00:45e0::/32 im +2a00:4600::/32 ru +2a00:4620::/32 jo 2a00:4640::/32 fr +2a00:4660::/32 fr 2a00:4680::/32 at +2a00:46a0::/32 fr 2a00:46c0::/32 it +2a00:46e0::/32 ru 2a00:4700::/32 de +2a00:4720::/32 de 2a00:4740::/32 ch +2a00:4760::/32 it 2a00:4780::/32 fr +2a00:47a0::/32 kg 2a00:47c0::/32 gb +2a00:47e0::/32 dk 2a00:4800::/32 bg +2a00:4820::/32 dk 2a00:4840::/32 de +2a00:4860::/32 ru 2a00:4880::/32 cz +2a00:48a0::/32 ua 2a00:48c0::/32 az +2a00:48e0::/32 be 2a00:4900::/32 gb +2a00:4920::/32 es 2a00:4940::/32 al +2a00:4960::/32 de 2a00:4980::/32 de 2a00:49c0::/32 dk +2a00:49e0::/32 ru 2a00:4a00::/32 gb +2a00:4a20::/32 fr 2a00:4a40::/32 it +2a00:4a60::/32 ps 2a00:4a80::/32 ru +2a00:4aa0::/32 ru 2a00:4ac0::/32 fr +2a00:4ae0::/32 gb 2a00:4b00::/32 fr +2a00:4b20::/32 no 2a00:4b40::/32 sk +2a00:4b60::/32 cy 2a00:4b80::/32 es +2a00:4ba0::/32 fi 2a00:4bc0::/32 ch +2a00:4be0::/32 ua 2a00:4c00::/32 ru +2a00:4c20::/32 lt 2a00:4c40::/32 de +2a00:4c60::/32 ir 2a00:4c80::/32 pt +2a00:4ca0::/32 fr 2a00:4cc0::/32 fi +2a00:4ce0::/32 gb 2a00:4d00::/32 cz +2a00:4d20::/32 ru 2a00:4d40::/32 gb +2a00:4d60::/32 is 2a00:4d80::/32 de +2a00:4da0::/32 gb 2a00:4dc0::/32 se +2a00:4de0::/32 es 2a00:4e00::/32 de +2a00:4e20::/32 nl 2a00:4e40::/32 nl +2a00:4e60::/32 bg 2a00:4e80::/32 ps +2a00:4ea0::/32 is +2a00:4ec0::/32 ch +2a00:4ee0::/32 gb 2a00:4f00::/32 ua +2a00:4f20::/32 es +2a00:4f40::/32 fr +2a00:4f60::/32 no 2a00:4f80::/32 ru +2a00:4fa0::/32 de +2a00:4fc0::/32 fr +2a00:4fe0::/32 es 2a00:5000::/32 is +2a00:5020::/32 nl +2a00:5040::/32 ir +2a00:5060::/32 se 2a00:5080::/32 de +2a00:50a0::/32 sa +2a00:50c0::/32 ru +2a00:50e0::/32 ro 2a00:5100::/32 cz +2a00:5120::/32 ru +2a00:5140::/32 nl +2a00:5160::/32 ru 2a00:5180::/32 ru +2a00:51a0::/32 bg +2a00:51c0::/32 nl +2a00:51e0::/32 no 2a00:5200::/32 ru -2a00:5280::/32 mt +2a00:5220::/32 cz +2a00:5240::/32 fi +2a00:5260::/32 gb +2a00:5280::/32 nl +2a00:52a0::/32 gb +2a00:52c0::/32 nl +2a00:52e0::/32 ir 2a00:5300::/32 de +2a00:5320::/32 at +2a00:5340::/32 it +2a00:5360::/32 ch 2a00:5380::/32 is +2a00:53a0::/32 pl +2a00:53c0::/32 se +2a00:53e0::/32 nl 2a00:5400::/32 sa +2a00:5420::/32 gb +2a00:5440::/32 us 2a00:5480::/32 ch +2a00:54a0::/32 tr +2a00:54c0::/32 pl +2a00:54e0::/32 it 2a00:5500::/32 fi +2a00:5520::/32 fr +2a00:5540::/32 gb +2a00:5560::/32 de 2a00:5580::/32 gb +2a00:55a0::/32 il +2a00:55c0::/32 gb +2a00:55e0::/32 sm 2a00:5600::/32 gb +2a00:5620::/32 ru +2a00:5640::/32 de 2a00:5680::/32 it +2a00:56a0::/32 tr +2a00:56c0::/32 ru +2a00:56e0::/32 pl 2a00:5700::/32 kg +2a00:5720::/32 fr +2a00:5740::/32 tr +2a00:5760::/32 gb 2a00:5780::/32 gb +2a00:57a0::/32 it +2a00:57c0::/32 nl +2a00:57e0::/32 pl 2a00:5800::/32 cz +2a00:5820::/32 ru +2a00:5840::/32 gb +2a00:5860::/32 se 2a00:5880::/32 fr +2a00:58c0::/32 tr +2a00:58e0::/32 ru 2a00:5900::/32 se +2a00:5920::/32 ie +2a00:5940::/32 hu +2a00:5960::/32 nl 2a00:5980::/32 lu +2a00:59a0::/32 de +2a00:59c0::/32 se +2a00:59e0::/32 de 2a00:5a00::/32 gb +2a00:5a20::/32 dk +2a00:5a40::/32 fr +2a00:5a60::/32 ru 2a00:5a80::/32 de +2a00:5aa0::/32 dk +2a00:5ac0::/32 es +2a00:5ae0::/32 at 2a00:5b00::/32 it +2a00:5b20::/32 pl +2a00:5b40::/32 it +2a00:5b60::/32 gb 2a00:5b80::/32 it +2a00:5ba0::/32 de +2a00:5bc0::/32 gb +2a00:5be0::/32 nl 2a00:5c00::/32 es +2a00:5c20::/32 cz +2a00:5c40::/32 mk +2a00:5c60::/32 de 2a00:5c80::/32 se +2a00:5ca0::/32 ir +2a00:5cc0::/32 ru +2a00:5ce0::/32 fr 2a00:5d00::/32 ru +2a00:5d20::/32 dk +2a00:5d40::/32 no +2a00:5d60::/32 nl 2a00:5d80::/32 gb +2a00:5da0::/32 kz +2a00:5dc0::/32 ro +2a00:5de0::/32 fr 2a00:5e00::/32 de +2a00:5e20::/32 nl +2a00:5e40::/32 no +2a00:5e60::/32 lb 2a00:5e80::/32 fr +2a00:5ea0::/32 nl +2a00:5ec0::/32 se +2a00:5ee0::/32 is 2a00:5f00::/32 gb -2a00:5f80::/32 rs +2a00:5f20::/32 pl +2a00:5f40::/32 de +2a00:5f80::/32 de +2a00:5fa0::/32 ua +2a00:5fc0::/32 de +2a00:5fe0::/32 tr 2a00:6000::/32 fr +2a00:6020::/32 de +2a00:6040::/32 tr +2a00:6060::/32 fr 2a00:6080::/32 es +2a00:60a0::/32 ru +2a00:60c0::/32 de +2a00:60e0::/32 ie 2a00:6100::/32 gb +2a00:6120::/32 fi +2a00:6140::/32 de +2a00:6160::/32 de 2a00:6180::/32 ua +2a00:61a0::/32 se +2a00:61c0::/32 rs +2a00:61e0::/32 de 2a00:6200::/32 fr +2a00:6220::/32 dk +2a00:6240::/32 ru +2a00:6260::/32 pl 2a00:6280::/32 tr +2a00:62a0::/32 gb +2a00:62c0::/32 ru +2a00:62e0::/32 gb 2a00:6300::/32 gb +2a00:6320::/32 ru +2a00:6340::/32 ch +2a00:6360::/32 de 2a00:6380::/32 ir +2a00:63a0::/32 ir +2a00:63c0::/32 at +2a00:63e0::/32 fr 2a00:6400::/32 de +2a00:6420::/32 fr +2a00:6440::/32 by +2a00:6460::/32 it 2a00:6480::/32 de +2a00:64a0::/32 be +2a00:64c0::/32 lt +2a00:64e0::/32 pl 2a00:6500::/32 cz +2a00:6520::/32 ru +2a00:6540::/32 ru +2a00:6560::/32 gb 2a00:6580::/32 bg +2a00:65a0::/32 ru +2a00:65c0::/32 it +2a00:65e0::/32 ru 2a00:6600::/32 bh -2a00:6680::/32 es +2a00:6620::/32 gr +2a00:6640::/32 es +2a00:6660::/32 se +2a00:6680::/32 de +2a00:66a0::/32 il +2a00:66c0::/32 se +2a00:66e0::/32 tr +2a00:6700::/32 de +2a00:6720::/32 de +2a00:6740::/32 ua +2a00:6760::/32 fr 2a00:6780::/32 fr +2a00:67a0::/32 gb +2a00:67c0::/32 no +2a00:67e0::/32 de 2a00:6800::/32 de -2a00:6880::/32 es +2a00:6820::/32 fr +2a00:6840::/32 si +2a00:6860::/32 es +2a00:6880::/32 lt +2a00:68a0::/32 ae +2a00:68c0::/32 fr +2a00:68e0::/32 ru 2a00:6900::/32 fr +2a00:6920::/32 lb +2a00:6940::/32 es +2a00:6960::/32 nl 2a00:6980::/32 it +2a00:69a0::/32 it +2a00:69c0::/32 ru +2a00:69e0::/32 gb 2a00:6a00::/32 ee +2a00:6a20::/32 tr +2a00:6a40::/32 fr +2a00:6a60::/32 it 2a00:6a80::/32 gb +2a00:6ac0::/32 es +2a00:6ae0::/32 lt 2a00:6b00::/32 se +2a00:6b20::/32 gr +2a00:6b40::/32 se +2a00:6b60::/32 ie 2a00:6b80::/32 al +2a00:6ba0::/32 ps +2a00:6bc0::/32 cz +2a00:6be0::/32 gb 2a00:6c00::/32 ru +2a00:6c20::/32 ru +2a00:6c40::/32 pl +2a00:6c60::/32 gb 2a00:6c80::/32 de +2a00:6ca0::/32 sa +2a00:6cc0::/32 lt +2a00:6ce0::/32 ru +2a00:6d00::/32 gb +2a00:6d20::/32 sk +2a00:6d40::/32 it +2a00:6d60::/32 ir 2a00:6d80::/32 it +2a00:6da0::/32 es +2a00:6dc0::/32 cz +2a00:6de0::/32 gb 2a00:6e00::/32 de +2a00:6e20::/32 iq +2a00:6e40::/32 fr +2a00:6e60::/32 de 2a00:6e80::/32 se +2a00:6ea0::/32 gb +2a00:6ec0::/32 be +2a00:6ee0::/32 de 2a00:6f00::/32 gb +2a00:6f20::/32 ch +2a00:6f40::/32 bg +2a00:6f60::/32 ru 2a00:6f80::/32 ru +2a00:6fa0::/32 nl +2a00:6fc0::/32 de +2a00:6fe0::/32 nl 2a00:7000::/32 be +2a00:7020::/32 gb +2a00:7040::/32 ir +2a00:7060::/32 gb 2a00:7080::/32 se +2a00:70a0::/32 sy +2a00:70c0::/32 nl +2a00:70e0::/32 ua 2a00:7100::/32 es +2a00:7120::/32 es +2a00:7140::/32 nl +2a00:7160::/32 kg 2a00:7180::/32 fr +2a00:71a0::/32 ba +2a00:71c0::/32 es +2a00:71e0::/32 is 2a00:7200::/32 fr +2a00:7220::/32 tr +2a00:7240::/32 no +2a00:7260::/32 fr 2a00:7280::/32 gb +2a00:72a0::/32 it +2a00:72c0::/32 de +2a00:72e0::/32 fr 2a00:7300::/32 tr +2a00:7320::/32 ua +2a00:7340::/32 pl +2a00:7360::/32 si 2a00:7380::/32 de +2a00:73a0::/32 rs +2a00:73c0::/32 es +2a00:73e0::/32 no 2a00:7400::/32 ie +2a00:7420::/32 nl +2a00:7440::/32 de +2a00:7460::/32 de 2a00:7480::/32 gb +2a00:74a0::/32 fi +2a00:74c0::/32 de +2a00:74e0::/32 ru 2a00:7500::/32 fr +2a00:7520::/32 at +2a00:7540::/32 ru +2a00:7560::/32 pl 2a00:7580::/32 ch +2a00:75a0::/32 ru +2a00:75c0::/32 nl +2a00:75e0::/32 no 2a00:7600::/32 lt +2a00:7620::/32 cy +2a00:7640::/32 gb +2a00:7660::/32 dk 2a00:7680::/32 sa +2a00:76a0::/32 pl +2a00:76c0::/32 ir +2a00:76e0::/32 jo 2a00:7700::/32 ru +2a00:7720::/32 es +2a00:7740::/32 nl +2a00:7760::/32 gb 2a00:7780::/32 sa +2a00:77a0::/32 ru +2a00:77c0::/32 ch +2a00:77e0::/32 gb 2a00:7800::/32 se +2a00:7820::/32 fr +2a00:7840::/32 is +2a00:7860::/32 ru 2a00:7880::/32 hr +2a00:78a0::/32 ru +2a00:78c0::/32 fr +2a00:78e0::/32 fr 2a00:7900::/32 fr +2a00:7920::/32 no +2a00:7940::/32 nl +2a00:7960::/32 nl 2a00:7980::/32 ru +2a00:79a0::/32 ru +2a00:79c0::/32 de +2a00:79e0::/32 ch 2a00:7a00::/32 no +2a00:7a20::/32 fi +2a00:7a40::/32 gb +2a00:7a60::/32 ua 2a00:7a80::/32 at +2a00:7aa0::/32 fr +2a00:7ac0::/32 ru +2a00:7ae0::/32 de 2a00:7b00::/32 es +2a00:7b40::/32 ie +2a00:7b60::/32 ru 2a00:7b80::/32 nl +2a00:7ba0::/32 gb +2a00:7bc0::/32 at +2a00:7be0::/32 qa 2a00:7c00::/32 ru +2a00:7c20::/32 de +2a00:7c60::/32 nl 2a00:7c80::/32 nl +2a00:7ca0::/32 it +2a00:7cc0::/32 de +2a00:7ce0::/32 ru 2a00:7d00::/32 ua +2a00:7d20::/32 gb +2a00:7d40::/32 ru +2a00:7d60::/32 fr 2a00:7d80::/32 ir +2a00:7da0::/32 az +2a00:7dc0::/32 nl +2a00:7de0::/32 nl 2a00:7e00::/32 ua +2a00:7e20::/32 lu +2a00:7e40::/32 fr +2a00:7e60::/32 es 2a00:7e80::/32 cz +2a00:7ea0::/32 ch +2a00:7ec0::/32 fr +2a00:7ee0::/32 fr 2a00:7f00::/32 es +2a00:7f20::/32 sk +2a00:7f40::/32 fr +2a00:7f60::/32 ae 2a00:7f80::/32 ir +2a00:7fc0::/32 de +2a00:7fe0::/32 pl +2a00:8000::/32 gb +2a00:8020::/32 it +2a00:8040::/32 ru +2a00:8060::/32 gb 2a00:8080::/32 nl +2a00:80a0::/32 nl +2a00:80c0::/32 be +2a00:80e0::/32 it 2a00:8100::/32 rs +2a00:8120::/32 de +2a00:8140::/32 de +2a00:8160::/32 fi 2a00:8180::/32 de +2a00:81a0::/32 ch +2a00:81c0::/32 gb +2a00:81e0::/32 lv 2a00:8200::/32 dk -2a00:8280::/32 pt +2a00:8220::/32 cz +2a00:8240::/32 nl +2a00:8260::/32 it +2a00:8280::/32 se +2a00:82a0::/32 bg +2a00:82c0::/32 ch +2a00:82e0::/32 it 2a00:8300::/32 gb +2a00:8320::/32 bg +2a00:8340::/32 pl +2a00:8360::/32 se 2a00:8380::/32 fr +2a00:83a0::/32 it +2a00:83c0::/32 lb +2a00:83e0::/32 es 2a00:8400::/32 ir +2a00:8420::/32 gb +2a00:8440::/32 nl +2a00:8460::/32 de 2a00:8480::/32 lv +2a00:84a0::/32 be +2a00:84c0::/32 ru +2a00:84e0::/32 es 2a00:8500::/32 ru +2a00:8520::/32 ps +2a00:8540::/32 gb +2a00:8560::/32 be 2a00:8580::/32 ru +2a00:85a0::/32 gb +2a00:85c0::/32 gb +2a00:85e0::/32 pl 2a00:8600::/32 ru +2a00:8620::/32 ba +2a00:8640::/32 nl +2a00:8660::/32 ru 2a00:8680::/32 ie +2a00:86a0::/32 it +2a00:86c0::/32 gb +2a00:86e0::/32 it 2a00:8700::/32 me +2a00:8720::/32 rs +2a00:8740::/32 ru +2a00:8760::/32 nl 2a00:8780::/32 fi +2a00:87a0::/32 dk +2a00:87c0::/32 bg +2a00:87e0::/32 gb 2a00:8800::/32 de +2a00:8820::/32 sa +2a00:8840::/32 uz +2a00:8860::/32 eu 2a00:8880::/32 fr +2a00:88a0::/32 fr +2a00:88c0::/32 ru +2a00:88e0::/32 ru 2a00:8900::/32 ru +2a00:8920::/32 de +2a00:8940::/32 gb +2a00:8960::/32 ru 2a00:8980::/32 it +2a00:89a0::/32 ru +2a00:89c0::/32 fr +2a00:89e0::/32 fi 2a00:8a00::/32 fi +2a00:8a20::/32 no +2a00:8a40::/32 pl +2a00:8a60::/32 de 2a00:8a80::/32 es +2a00:8aa0::/32 gb +2a00:8ac0::/32 iq +2a00:8ae0::/32 gb 2a00:8b00::/32 ru +2a00:8b20::/32 gb +2a00:8b40::/32 gb +2a00:8b60::/32 ru 2a00:8b80::/32 ua +2a00:8ba0::/32 al +2a00:8bc0::/32 nl +2a00:8be0::/32 no 2a00:8c00::/32 lt +2a00:8c20::/32 de +2a00:8c60::/32 it 2a00:8c80::/32 ie +2a00:8ca0::/32 ba +2a00:8cc0::/32 es +2a00:8ce0::/32 at 2a00:8d00::/32 ch +2a00:8d20::/32 kz +2a00:8d40::/32 az +2a00:8d60::/32 ru 2a00:8d80::/32 fr +2a00:8da0::/32 be +2a00:8dc0::/32 pl +2a00:8de0::/32 mt 2a00:8e00::/32 gb +2a00:8e20::/32 es +2a00:8e40::/32 de +2a00:8e60::/32 nl +2a00:8e80::/32 cz +2a00:8ea0::/32 it +2a00:8ec0::/32 de +2a00:8ee0::/32 nl 2a00:8f00::/32 es +2a00:8f20::/32 no +2a00:8f40::/32 gb +2a00:8f60::/32 no +2a00:8f80::/32 lu +2a00:8fa0::/32 gb +2a00:8fc0::/32 gb +2a00:8fe0::/32 it 2a00:9000::/32 lv +2a00:9020::/32 fr +2a00:9040::/32 gb +2a00:9060::/32 sk 2a00:9080::/32 dk +2a00:90a0::/32 ru +2a00:90c0::/32 ch 2a00:9100::/32 az -2a00:9180::/32 eu +2a00:9120::/32 om +2a00:9140::/32 is +2a00:9160::/32 sk +2a00:9180::/32 gb +2a00:91a0::/32 es +2a00:91c0::/32 gb +2a00:91e0::/32 it 2a00:9200::/32 ru +2a00:9220::/32 ch +2a00:9240::/32 hr +2a00:9260::/32 is 2a00:9280::/32 is +2a00:92a0::/32 fr +2a00:92c0::/32 is +2a00:92e0::/32 gb 2a00:9300::/32 de +2a00:9320::/32 pl +2a00:9340::/32 nl +2a00:9360::/32 pl 2a00:9380::/32 fr +2a00:93a0::/32 ru +2a00:93c0::/32 es +2a00:93e0::/32 fr 2a00:9400::/32 gb +2a00:9420::/32 hu +2a00:9440::/32 es +2a00:9460::/32 gb 2a00:9480::/32 ch +2a00:94a0::/32 es +2a00:94c0::/32 ir +2a00:94e0::/32 gb 2a00:9500::/32 rs +2a00:9520::/32 it +2a00:9540::/32 dk +2a00:9560::/32 fi 2a00:9580::/32 gb +2a00:95a0::/32 ru +2a00:95c0::/32 us +2a00:95e0::/32 gb 2a00:9600::/32 gb +2a00:9620::/32 se +2a00:9640::/32 sk +2a00:9660::/32 pl 2a00:9680::/32 de +2a00:96a0::/32 ru +2a00:96c0::/32 se +2a00:96e0::/32 de 2a00:9700::/32 ru +2a00:9720::/32 ru +2a00:9740::/32 ch +2a00:9760::/32 se 2a00:9780::/32 ru +2a00:97a0::/32 ru +2a00:97c0::/32 no +2a00:97e0::/32 dk 2a00:9800::/32 ru +2a00:9820::/32 nl +2a00:9840::/32 ch +2a00:9860::/32 hr 2a00:9880::/32 ua +2a00:98a0::/32 de +2a00:98c0::/32 at +2a00:98e0::/32 fr 2a00:9900::/32 md +2a00:9920::/32 ps +2a00:9940::/32 eu +2a00:9960::/32 lb 2a00:9980::/32 fr +2a00:99a0::/32 fr +2a00:99c0::/32 es +2a00:99e0::/32 de 2a00:9a00::/32 ru +2a00:9a20::/32 es +2a00:9a40::/32 nl +2a00:9a60::/32 es 2a00:9a80::/32 gb +2a00:9aa0::/32 gb +2a00:9ac0::/32 es +2a00:9ae0::/32 de 2a00:9b00::/32 fi +2a00:9b20::/32 ir +2a00:9b60::/32 nl 2a00:9b80::/32 be +2a00:9ba0::/32 gb +2a00:9bc0::/32 tr +2a00:9be0::/32 al 2a00:9c00::/32 se +2a00:9c20::/32 be +2a00:9c40::/32 ru +2a00:9c60::/32 gb 2a00:9c80::/32 cz +2a00:9ca0::/32 it +2a00:9cc0::/32 nl +2a00:9ce0::/32 gb 2a00:9d00::/32 gb +2a00:9d20::/32 nl +2a00:9d40::/32 pl +2a00:9d60::/32 gb 2a00:9d80::/32 de +2a00:9da0::/32 gb +2a00:9dc0::/32 pl +2a00:9de0::/32 gb 2a00:9e00::/32 de +2a00:9e20::/32 de +2a00:9e40::/32 gb +2a00:9e60::/32 it 2a00:9e80::/32 ru +2a00:9ea0::/32 pl +2a00:9ec0::/32 ee +2a00:9ee0::/32 sk 2a00:9f00::/32 pl +2a00:9f20::/32 tr +2a00:9f40::/32 al +2a00:9f60::/32 il 2a00:9f80::/32 ch +2a00:9fa0::/32 de +2a00:9fc0::/32 cz +2a00:9fe0::/32 ch 2a00:a000::/32 nl +2a00:a020::/32 de +2a00:a040::/32 il +2a00:a060::/32 gb 2a00:a080::/32 fr +2a00:a0a0::/32 de +2a00:a0c0::/32 nl +2a00:a0e0::/32 gb 2a00:a100::/32 hu +2a00:a120::/32 fr +2a00:a140::/32 se +2a00:a160::/32 cz 2a00:a180::/32 de +2a00:a1a0::/32 hu +2a00:a1c0::/32 at +2a00:a1e0::/32 gb 2a00:a200::/32 de +2a00:a220::/32 es +2a00:a240::/32 no +2a00:a260::/32 al 2a00:a280::/32 gb +2a00:a2a0::/32 it +2a00:a2c0::/32 gb +2a00:a2e0::/32 de 2a00:a300::/32 ru +2a00:a320::/32 fr +2a00:a340::/32 es +2a00:a360::/32 si 2a00:a380::/32 se +2a00:a3a0::/32 es +2a00:a3c0::/32 gb +2a00:a3e0::/32 it 2a00:a400::/32 gb +2a00:a420::/32 it +2a00:a440::/32 tr +2a00:a460::/32 at 2a00:a480::/32 it +2a00:a4a0::/32 fr +2a00:a4c0::/32 fr +2a00:a4e0::/32 gb 2a00:a500::/32 ch +2a00:a520::/32 de +2a00:a540::/32 no +2a00:a560::/32 pl 2a00:a580::/32 fr +2a00:a5a0::/32 cz +2a00:a5c0::/32 nl +2a00:a5e0::/32 ru 2a00:a600::/32 gb +2a00:a620::/32 es +2a00:a640::/32 nl +2a00:a660::/32 es 2a00:a680::/32 ch -2a00:a700::/32 ru +2a00:a6a0::/32 at +2a00:a6c0::/32 es +2a00:a6e0::/32 nl +2a00:a700::/32 de +2a00:a720::/32 it +2a00:a740::/32 ie +2a00:a760::/32 se 2a00:a780::/32 de +2a00:a7a0::/32 ru +2a00:a7c0::/32 nl +2a00:a7e0::/32 fr 2a00:a800::/32 nl +2a00:a820::/32 gb +2a00:a840::/32 es +2a00:a860::/32 gb 2a00:a880::/32 gr +2a00:a8a0::/32 sk +2a00:a8c0::/32 ru +2a00:a8e0::/32 de 2a00:a900::/32 gb +2a00:a920::/32 ch +2a00:a940::/32 nl +2a00:a960::/32 ru 2a00:a980::/32 de +2a00:a9a0::/32 it +2a00:a9c0::/32 mk +2a00:a9e0::/32 fr 2a00:aa00::/32 it +2a00:aa20::/32 it +2a00:aa40::/32 de +2a00:aa60::/32 fr 2a00:aa80::/32 ro +2a00:aaa0::/32 gb +2a00:aac0::/32 ch +2a00:aae0::/32 ru 2a00:ab00::/32 ru +2a00:ab20::/32 it +2a00:ab40::/32 kz +2a00:ab60::/32 de 2a00:ab80::/32 fr +2a00:aba0::/32 gb +2a00:abc0::/32 li +2a00:abe0::/32 ir 2a00:ac00::/32 fi +2a00:ac20::/32 es +2a00:ac40::/32 gb +2a00:ac60::/32 ru 2a00:ac80::/32 ua +2a00:aca0::/32 ua +2a00:acc0::/32 it +2a00:ace0::/32 be 2a00:ad00::/32 rs +2a00:ad20::/32 it +2a00:ad40::/32 gb +2a00:ad60::/32 ru 2a00:ad80::/32 de +2a00:adc0::/32 ch +2a00:ade0::/32 ua 2a00:ae00::/32 fi +2a00:ae20::/32 it +2a00:ae40::/32 ru +2a00:ae60::/32 fr 2a00:ae80::/32 nl +2a00:aea0::/32 gb +2a00:aec0::/32 de +2a00:aee0::/32 de 2a00:af00::/32 ru +2a00:af20::/32 it +2a00:af40::/32 ch +2a00:af60::/32 bg 2a00:af80::/32 ru +2a00:afa0::/32 dk +2a00:afc0::/32 at +2a00:afe0::/32 fr 2a00:b000::/32 sk +2a00:b020::/32 kg +2a00:b040::/32 gb +2a00:b060::/32 be 2a00:b080::/32 es +2a00:b0a0::/32 ch +2a00:b0c0::/32 hu +2a00:b0e0::/32 gb 2a00:b100::/32 ru +2a00:b120::/32 fr +2a00:b140::/32 ir +2a00:b160::/32 ru 2a00:b180::/32 fr +2a00:b1a0::/32 fr +2a00:b1c0::/32 ru +2a00:b1e0::/32 lu 2a00:b200::/32 it +2a00:b220::/32 at +2a00:b240::/32 ru +2a00:b260::/32 de 2a00:b280::/32 fr +2a00:b2a0::/32 si +2a00:b2c0::/32 be +2a00:b2e0::/32 sa 2a00:b300::/32 gb +2a00:b320::/32 gb +2a00:b340::/32 gb +2a00:b360::/32 ru 2a00:b380::/32 it +2a00:b3a0::/32 de +2a00:b3c0::/32 is +2a00:b3e0::/32 gb 2a00:b400::/32 de +2a00:b420::/32 ch +2a00:b440::/32 ru +2a00:b460::/32 nl 2a00:b480::/32 ua +2a00:b4a0::/32 ru +2a00:b4c0::/32 ru 2a00:b500::/32 ru +2a00:b520::/32 it +2a00:b540::/32 de +2a00:b560::/32 ru 2a00:b580::/32 de +2a00:b5a0::/32 fr +2a00:b5c0::/32 es +2a00:b5e0::/32 gb 2a00:b600::/32 gb +2a00:b640::/32 se +2a00:b660::/32 nl 2a00:b680::/32 se +2a00:b6a0::/32 ru +2a00:b6c0::/32 de +2a00:b6e0::/32 fr 2a00:b700::/32 ru +2a00:b720::/32 rs +2a00:b740::/32 it +2a00:b760::/32 fr 2a00:b780::/32 at +2a00:b7a0::/32 pl +2a00:b7c0::/32 fr +2a00:b7e0::/32 il 2a00:b800::/32 sy +2a00:b820::/32 pl +2a00:b840::/32 gb +2a00:b860::/32 jo 2a00:b880::/32 ru +2a00:b8a0::/32 ua +2a00:b8c0::/32 se +2a00:b8e0::/32 es 2a00:b900::/32 gb +2a00:b920::/32 dk +2a00:b940::/32 ru +2a00:b960::/32 pl 2a00:b980::/32 gb +2a00:b9a0::/32 fi +2a00:b9c0::/32 de +2a00:b9e0::/32 ee 2a00:ba00::/32 sk +2a00:ba20::/32 gb +2a00:ba40::/32 fr +2a00:ba60::/32 fr 2a00:ba80::/32 fr +2a00:baa0::/32 de +2a00:bac0::/32 de +2a00:bae0::/32 be 2a00:bb00::/32 ch +2a00:bb20::/32 dk +2a00:bb40::/32 gb +2a00:bb60::/32 ua 2a00:bb80::/32 gb +2a00:bba0::/32 nl +2a00:bbc0::/32 fr +2a00:bbe0::/32 fi 2a00:bc00::/32 ua +2a00:bc20::/32 pt +2a00:bc40::/32 es +2a00:bc60::/32 ir 2a00:bc80::/32 fr +2a00:bca0::/32 nl +2a00:bce0::/32 se 2a00:bd00::/32 ch +2a00:bd20::/32 nl +2a00:bd40::/32 ru +2a00:bd60::/32 se 2a00:bd80::/32 ch +2a00:bda0::/32 dk +2a00:bdc0::/32 ru +2a00:bde0::/32 pl 2a00:be00::/32 ru +2a00:be20::/32 ru +2a00:be40::/32 no +2a00:be60::/32 es 2a00:be80::/32 fr +2a00:bea0::/32 ae +2a00:bec0::/32 es 2a00:bf00::/32 ru +2a00:bf20::/32 pl +2a00:bf40::/32 fr +2a00:bf60::/32 ch 2a00:bf80::/32 es +2a00:bfa0::/32 es +2a00:bfc0::/32 ru +2a00:bfe0::/32 cz 2a00:c000::/32 fr +2a00:c020::/32 pl +2a00:c040::/32 ru +2a00:c060::/32 gb 2a00:c080::/32 nl +2a00:c0a0::/32 az +2a00:c0c0::/32 nl +2a00:c0e0::/32 ua 2a00:c100::/32 pl +2a00:c120::/32 fr +2a00:c140::/32 es +2a00:c160::/32 al 2a00:c180::/32 es +2a00:c1a0::/32 de +2a00:c1c0::/32 be +2a00:c1e0::/32 ch 2a00:c200::/32 ua +2a00:c220::/32 ru +2a00:c240::/32 nl +2a00:c260::/32 it 2a00:c280::/32 il +2a00:c2a0::/32 gb +2a00:c2c0::/32 nl +2a00:c2e0::/32 fr 2a00:c300::/32 ru +2a00:c320::/32 de +2a00:c340::/32 fr +2a00:c360::/32 ru 2a00:c380::/32 de +2a00:c3a0::/32 ee +2a00:c3c0::/32 hu +2a00:c3e0::/32 gb 2a00:c400::/32 gb -2a00:c480::/32 fr +2a00:c420::/32 es +2a00:c440::/32 no +2a00:c460::/32 gb +2a00:c480::/32 pl +2a00:c4a0::/32 ir +2a00:c4c0::/32 ru +2a00:c4e0::/32 be 2a00:c500::/32 cz +2a00:c520::/32 gb +2a00:c540::/32 no +2a00:c560::/32 pt 2a00:c580::/32 cz +2a00:c5a0::/32 md +2a00:c5c0::/32 gb +2a00:c5e0::/32 it 2a00:c600::/32 nl +2a00:c620::/32 ch +2a00:c640::/32 se +2a00:c660::/32 nl 2a00:c680::/32 it +2a00:c6a0::/32 lb +2a00:c6c0::/32 nl +2a00:c6e0::/32 se 2a00:c700::/32 ee +2a00:c720::/32 pl +2a00:c740::/32 se +2a00:c760::/32 hu 2a00:c780::/32 fr +2a00:c7a0::/32 gb +2a00:c7c0::/32 nl +2a00:c7e0::/32 az 2a00:c800::/32 ch +2a00:c820::/32 by +2a00:c840::/32 es +2a00:c860::/32 iq 2a00:c880::/32 it +2a00:c8a0::/32 mk +2a00:c8c0::/32 ru +2a00:c8e0::/32 de 2a00:c900::/32 ru +2a00:c920::/32 be +2a00:c940::/32 de +2a00:c960::/32 gr 2a00:c980::/32 gb +2a00:c9a0::/32 hu +2a00:c9c0::/32 ru +2a00:c9e0::/32 iq 2a00:ca00::/32 de -2a00:ca80::/32 nl +2a00:ca20::/32 ie +2a00:ca40::/32 dk +2a00:ca60::/32 lu +2a00:ca80::/32 cz +2a00:caa0::/32 jo +2a00:cac0::/32 at +2a00:cae0::/32 hu 2a00:cb00::/32 ba +2a00:cb20::/32 cz +2a00:cb40::/32 nl +2a00:cb60::/32 de 2a00:cb80::/32 fr +2a00:cba0::/32 de +2a00:cbc0::/32 ru +2a00:cbe0::/32 gb 2a00:cc00::/32 ru +2a00:cc20::/32 nl +2a00:cc40::/32 am +2a00:cc60::/32 gb 2a00:cc80::/32 fr +2a00:cca0::/32 nl +2a00:ccc0::/32 de +2a00:cce0::/32 md 2a00:cd00::/32 ru +2a00:cd20::/32 gb +2a00:cd40::/32 ch +2a00:cd60::/32 tr 2a00:cd80::/32 pl +2a00:cda0::/32 ru +2a00:cdc0::/32 de +2a00:cde0::/32 ru 2a00:ce00::/32 es +2a00:ce20::/32 ch +2a00:ce40::/32 gb +2a00:ce60::/32 no 2a00:ce80::/32 fr +2a00:cea0::/32 es +2a00:cec0::/32 ua +2a00:cee0::/32 ps 2a00:cf00::/32 rs +2a00:cf20::/32 sa +2a00:cf40::/32 de +2a00:cf60::/32 ru 2a00:cf80::/32 dk +2a00:cfa0::/32 fr +2a00:cfc0::/32 ru +2a00:cfe0::/32 ru 2a00:d000::/32 gb +2a00:d020::/32 it +2a00:d040::/32 cz +2a00:d060::/32 ua 2a00:d080::/32 es +2a00:d0a0::/32 pl +2a00:d0c0::/32 de +2a00:d0e0::/32 ru 2a00:d100::/32 es +2a00:d120::/32 nl +2a00:d140::/32 rs +2a00:d160::/32 ru 2a00:d180::/32 pt +2a00:d1a0::/32 de +2a00:d1c0::/32 nl +2a00:d1e0::/32 de 2a00:d200::/32 gb +2a00:d220::/32 nl +2a00:d240::/32 hu +2a00:d260::/32 ch 2a00:d280::/32 es +2a00:d2a0::/32 ch +2a00:d2c0::/32 ps +2a00:d2e0::/32 ch 2a00:d300::/32 gb +2a00:d320::/32 ch +2a00:d340::/32 gb +2a00:d360::/32 ch 2a00:d380::/32 nl +2a00:d3a0::/32 ch +2a00:d3c0::/32 cz +2a00:d3e0::/32 ch 2a00:d400::/32 it +2a00:d420::/32 ch +2a00:d440::/32 si 2a00:d480::/32 cz +2a00:d4a0::/32 ch +2a00:d4c0::/32 ua +2a00:d4e0::/32 ch 2a00:d500::/32 ir +2a00:d520::/32 ch +2a00:d540::/32 nl +2a00:d560::/32 ch 2a00:d580::/32 de +2a00:d5a0::/32 gb +2a00:d5c0::/32 pl +2a00:d5e0::/32 gb 2a00:d600::/32 gb +2a00:d620::/32 iq +2a00:d640::/32 nl +2a00:d660::/32 tr 2a00:d680::/32 gb +2a00:d6a0::/32 ie +2a00:d6c0::/32 de +2a00:d6e0::/32 lv 2a00:d700::/32 gb +2a00:d720::/32 gb +2a00:d740::/32 no 2a00:d780::/32 fr +2a00:d7a0::/32 it +2a00:d7c0::/32 sa +2a00:d7e0::/32 ie 2a00:d800::/32 ee +2a00:d820::/32 se +2a00:d840::/32 si +2a00:d860::/32 tr 2a00:d880::/32 nl +2a00:d8a0::/32 gb +2a00:d8c0::/32 ru +2a00:d8e0::/32 it 2a00:d900::/32 at +2a00:d920::/32 dk +2a00:d940::/32 cz +2a00:d960::/32 nl 2a00:d980::/32 de +2a00:d9a0::/32 gb +2a00:d9c0::/32 at +2a00:d9e0::/32 es 2a00:da00::/32 gb +2a00:da20::/32 gb +2a00:da40::/32 it +2a00:da60::/32 li 2a00:da80::/32 cz +2a00:daa0::/32 gb +2a00:dac0::/32 ru +2a00:dae0::/32 fr 2a00:db00::/32 cz +2a00:db20::/32 ru +2a00:db40::/32 es +2a00:db60::/32 ie 2a00:db80::/32 gb +2a00:dba0::/32 de +2a00:dbc0::/32 ch +2a00:dbe0::/32 es 2a00:dc00::/32 tr +2a00:dc20::/32 il +2a00:dc40::/32 ru +2a00:dc60::/32 de 2a00:dc80::/32 es +2a00:dca0::/32 de +2a00:dcc0::/32 it 2a00:dd00::/32 iq +2a00:dd20::/32 ua +2a00:dd40::/32 fr +2a00:dd60::/32 es 2a00:dd80::/32 eu +2a00:dda0::/32 ps +2a00:ddc0::/32 nl +2a00:dde0::/32 bh 2a00:de00::/32 cz +2a00:de20::/32 cz +2a00:de40::/32 nl +2a00:de60::/32 gb 2a00:de80::/32 ru +2a00:dea0::/32 ru +2a00:dec0::/32 no +2a00:dee0::/32 ru 2a00:df00::/32 gb +2a00:df20::/32 gb +2a00:df40::/32 fr +2a00:df60::/32 ru 2a00:df80::/32 hu -2a00:e000::/32 ir +2a00:dfa0::/32 nl +2a00:dfc0::/32 fr +2a00:dfe0::/32 cz +2a00:e000::/32 ru +2a00:e020::/32 ch +2a00:e040::/32 be +2a00:e060::/32 de 2a00:e080::/32 fr +2a00:e0a0::/32 us +2a00:e0c0::/32 gb 2a00:e100::/32 de +2a00:e120::/32 gb +2a00:e140::/32 cz +2a00:e160::/32 es 2a00:e180::/32 de +2a00:e1a0::/32 gb +2a00:e1c0::/32 gb +2a00:e1e0::/32 es 2a00:e200::/32 bg +2a00:e220::/32 it +2a00:e240::/32 ru +2a00:e260::/32 ru 2a00:e280::/32 it +2a00:e2a0::/32 ru +2a00:e2c0::/32 ch +2a00:e2e0::/32 pl 2a00:e300::/32 hu +2a00:e320::/32 ru +2a00:e340::/32 gb +2a00:e360::/32 at 2a00:e380::/32 sk +2a00:e3a0::/32 dk +2a00:e3c0::/32 us +2a00:e3e0::/32 gb 2a00:e400::/32 de +2a00:e440::/32 de +2a00:e460::/32 ru 2a00:e480::/32 nl +2a00:e4a0::/32 no +2a00:e4c0::/32 cz +2a00:e4e0::/32 gb 2a00:e500::/32 ru +2a00:e520::/32 gb +2a00:e540::/32 it +2a00:e560::/32 be 2a00:e580::/32 cz +2a00:e5a0::/32 ru +2a00:e5c0::/32 tr +2a00:e5e0::/32 nl 2a00:e600::/32 no +2a00:e620::/32 gb +2a00:e640::/32 ch +2a00:e660::/32 nl 2a00:e680::/32 ch +2a00:e6a0::/32 hu +2a00:e6c0::/32 ch +2a00:e6e0::/32 tr 2a00:e700::/32 fr +2a00:e720::/32 ie +2a00:e740::/32 gb +2a00:e760::/32 be 2a00:e780::/32 ua +2a00:e7a0::/32 gb +2a00:e7c0::/32 dk +2a00:e7e0::/32 ch 2a00:e800::/32 pl +2a00:e840::/32 fr +2a00:e860::/32 lu 2a00:e880::/32 fr +2a00:e8a0::/32 eu +2a00:e8c0::/32 ge +2a00:e8e0::/32 it 2a00:e900::/32 se +2a00:e920::/32 es +2a00:e940::/32 pl +2a00:e960::/32 gb 2a00:e980::/32 de +2a00:e9a0::/32 de +2a00:e9c0::/32 es +2a00:e9e0::/32 ru 2a00:ea00::/32 pl +2a00:ea20::/32 ru +2a00:ea40::/32 gb +2a00:ea60::/32 lt 2a00:ea80::/32 fr +2a00:eaa0::/32 fr +2a00:eac0::/32 gb +2a00:eae0::/32 de 2a00:eb00::/32 nl +2a00:eb20::/32 gb +2a00:eb40::/32 at +2a00:eb60::/32 cz 2a00:eb80::/32 fr +2a00:eba0::/32 eu +2a00:ebc0::/32 at +2a00:ebe0::/32 ru 2a00:ec00::/32 ua +2a00:ec20::/32 fr +2a00:ec40::/32 de 2a00:ec80::/32 fr -2a00:ed00::/32 eu +2a00:eca0::/32 fi +2a00:ecc0::/32 de +2a00:ece0::/32 ro +2a00:ed00::/32 gb +2a00:ed20::/32 gb +2a00:ed40::/32 gb +2a00:ed60::/32 ba 2a00:ed80::/32 no +2a00:eda0::/32 es +2a00:edc0::/32 nl +2a00:ede0::/32 ua 2a00:ee00::/32 gb -2a00:ee80::/32 nl -2a00:ef00::/32 nl +2a00:ee20::/32 fr +2a00:ee40::/32 de +2a00:ee60::/32 ru +2a00:ee80::/32 lb +2a00:eea0::/32 it +2a00:eec0::/32 dk +2a00:eee0::/32 tr +2a00:ef00::/32 gb +2a00:ef20::/32 nl +2a00:ef40::/32 pl +2a00:ef60::/32 fr 2a00:ef80::/32 fr +2a00:efa0::/32 ch +2a00:efc0::/32 de +2a00:efe0::/32 ch 2a00:f000::/32 si +2a00:f020::/32 at +2a00:f040::/32 ru +2a00:f060::/32 se 2a00:f080::/32 ch +2a00:f0a0::/32 no +2a00:f0c0::/32 gb +2a00:f0e0::/32 qa 2a00:f100::/32 cz +2a00:f120::/32 at +2a00:f140::/32 gb +2a00:f160::/32 ru 2a00:f180::/32 gb +2a00:f1a0::/32 be +2a00:f1c0::/32 gb 2a00:f200::/32 it +2a00:f220::/32 me +2a00:f240::/32 pl +2a00:f260::/32 az 2a00:f280::/32 se +2a00:f2a0::/32 ru +2a00:f2c0::/32 pl +2a00:f2e0::/32 ge 2a00:f300::/32 gb +2a00:f320::/32 nl +2a00:f340::/32 fr +2a00:f360::/32 nl 2a00:f380::/32 es -2a00:f400::/32 lu +2a00:f3a0::/32 it +2a00:f3c0::/32 gb +2a00:f3e0::/32 ru +2a00:f400::/32 se +2a00:f420::/32 de +2a00:f440::/32 ru +2a00:f460::/32 ru 2a00:f480::/32 ru +2a00:f4a0::/32 lv +2a00:f4c0::/32 se +2a00:f4e0::/32 gb 2a00:f500::/32 lt +2a00:f520::/32 de +2a00:f540::/32 gb +2a00:f560::/32 it 2a00:f580::/32 sa +2a00:f5a0::/32 hr +2a00:f5c0::/32 fi +2a00:f5e0::/32 nl 2a00:f600::/32 se +2a00:f620::/32 be +2a00:f640::/32 es +2a00:f660::/32 de 2a00:f680::/32 se +2a00:f6a0::/32 ru +2a00:f6c0::/32 pl +2a00:f6e0::/32 de 2a00:f700::/32 de +2a00:f720::/32 at +2a00:f740::/32 ch +2a00:f760::/32 pl 2a00:f780::/32 tr +2a00:f7a0::/32 iq +2a00:f7c0::/32 ba 2a00:f800::/32 es +2a00:f820::/32 de +2a00:f840::/32 ru +2a00:f860::/32 fi 2a00:f880::/32 gb +2a00:f8a0::/32 gb +2a00:f8c0::/32 li +2a00:f8e0::/32 de 2a00:f900::/32 md +2a00:f920::/32 ru +2a00:f940::/32 ru +2a00:f960::/32 is 2a00:f980::/32 no +2a00:f9a0::/32 ru +2a00:f9c0::/32 gb +2a00:f9e0::/32 cy 2a00:fa00::/32 pt +2a00:fa20::/32 ru +2a00:fa40::/32 de +2a00:fa60::/32 fr 2a00:fa80::/32 it +2a00:faa0::/32 ie +2a00:fac0::/32 de +2a00:fae0::/32 es 2a00:fb00::/32 ch +2a00:fb20::/32 pl +2a00:fb40::/32 fr +2a00:fb60::/32 it 2a00:fb80::/32 de +2a00:fba0::/32 gb +2a00:fbc0::/32 pl +2a00:fbe0::/32 dk 2a00:fc00::/32 ua +2a00:fc20::/32 cz +2a00:fc40::/32 bg +2a00:fc60::/32 ru 2a00:fc80::/32 nl +2a00:fca0::/32 ua +2a00:fcc0::/32 de +2a00:fce0::/32 gb 2a00:fd00::/32 dk -2a00:fd80::/32 ae +2a00:fd20::/32 lb +2a00:fd40::/32 nl +2a00:fd60::/32 gb +2a00:fd80::/32 gb +2a00:fda0::/32 de +2a00:fdc0::/32 es +2a00:fde0::/32 es 2a00:fe00::/32 de +2a00:fe20::/32 de +2a00:fe40::/32 es +2a00:fe60::/32 fi 2a00:fe80::/32 me +2a00:fea0::/32 cz +2a00:fec0::/32 tr +2a00:fee0::/32 ru 2a00:ff00::/32 ch +2a00:ff20::/32 ru +2a00:ff40::/32 se +2a00:ff60::/32 gb 2a00:ff80::/32 sk +2a00:ffa0::/32 nl +2a00:ffc0::/32 pl +2a00:ffe0::/32 gb 2a01::/32 fr 2a01:8::/32 pt 2a01:10::/32 pt @@ -7088,7 +18294,7 @@ 2a01:68::/32 fr 2a01:70::/32 gb 2a01:78::/32 de -2a01:80::/32 eu +2a01:80::/32 ee 2a01:88::/32 ie 2a01:90::/32 gb 2a01:98::/32 gb @@ -7108,9 +18314,7 @@ 2a01:108::/32 sk 2a01:110::/32 gb 2a01:120::/32 de -2a01:128::/32 pl 2a01:130::/32 de -2a01:138::/32 de 2a01:140::/32 gb 2a01:148::/32 ie 2a01:150::/32 gb @@ -7140,7 +18344,7 @@ 2a01:210::/32 ru 2a01:220::/32 ru 2a01:228::/32 ch -2a01:230::/32 lu +2a01:230::/32 ru 2a01:238::/32 de 2a01:240::/32 fr 2a01:248::/32 gb @@ -7166,12 +18370,10 @@ 2a01:300::/32 eu 2a01:308::/32 gb 2a01:310::/32 nl -2a01:318::/32 dk 2a01:320::/32 md 2a01:328::/32 sk 2a01:330::/32 ch 2a01:338::/32 pl -2a01:340::/32 no 2a01:348::/32 gb 2a01:350::/32 nl 2a01:358::/32 tr @@ -7184,9 +18386,8 @@ 2a01:398::/32 gb 2a01:3a0::/32 dk 2a01:3a8::/32 nl -2a01:3b0::/32 de +2a01:3b0::/32 eu 2a01:3b8::/32 se -2a01:3c0::/32 lv 2a01:3c8::/32 ir 2a01:3d8::/32 de 2a01:3e0::/32 eu @@ -7203,18 +18404,17 @@ 2a01:438::/32 de 2a01:440::/32 de 2a01:448::/32 nl -2a01:450::/32 im +2a01:450::/32 gb 2a01:458::/32 ir 2a01:460::/32 no 2a01:468::/32 at -2a01:470::/32 be +2a01:470::/32 fr 2a01:478::/32 ba 2a01:480::/32 de 2a01:488::/32 de 2a01:490::/32 cz 2a01:498::/32 be 2a01:4a0::/32 de -2a01:4a8::/32 de 2a01:4b0::/32 ie 2a01:4c0::/32 be 2a01:4c8::/32 gb @@ -7229,7 +18429,7 @@ 2a01:510::/32 cz 2a01:518::/32 nl 2a01:520::/32 no -2a01:528::/32 ch +2a01:528::/32 is 2a01:530::/32 gb 2a01:538::/32 cz 2a01:540::/32 ru @@ -7238,10 +18438,8 @@ 2a01:558::/32 dk 2a01:560::/32 no 2a01:568::/32 gb -2a01:570::/32 gb -2a01:578::/32 ie +2a01:578::/32 us 2a01:580::/32 de -2a01:588::/32 nl 2a01:590::/32 ru 2a01:598::/32 de 2a01:5a0::/32 gb @@ -7253,7 +18451,6 @@ 2a01:5d0::/32 hu 2a01:5d8::/32 ch 2a01:5e0::/32 cz -2a01:5e8::/32 at 2a01:5f0::/32 cz 2a01:5f8::/32 nl 2a01:600::/32 no @@ -7263,7 +18460,6 @@ 2a01:620::/32 ru 2a01:628::/32 ru 2a01:630::/32 dk -2a01:638::/32 gr 2a01:640::/32 is 2a01:648::/32 fr 2a01:650::/32 se @@ -7279,11 +18475,10 @@ 2a01:6a0::/32 it 2a01:6a8::/32 ch 2a01:6b0::/32 ua -2a01:6b8::/32 fr 2a01:6c0::/32 de 2a01:6c8::/32 gb 2a01:6d0::/32 se -2a01:6d8::/32 lu +2a01:6d8::/32 fr 2a01:6e0::/32 ru 2a01:6e8::/32 ru 2a01:6f0::/32 de @@ -7296,7 +18491,6 @@ 2a01:730::/32 tr 2a01:738::/32 gb 2a01:740::/32 de -2a01:748::/32 tr 2a01:750::/32 ua 2a01:758::/32 ua 2a01:760::/32 ch @@ -7325,256 +18519,1006 @@ 2a01:1000::/32 pl 2a01:2000::/32 it 2a01:4000::/32 am +2a01:4020::/32 gb +2a01:4040::/32 se +2a01:4060::/32 de 2a01:4080::/32 ru +2a01:40a0::/32 de +2a01:40c0::/32 fr +2a01:40e0::/32 nl +2a01:4100::/32 es +2a01:4120::/32 at +2a01:4140::/32 es +2a01:4160::/32 al +2a01:4180::/32 de +2a01:41a0::/32 lt +2a01:41c0::/32 ch +2a01:41e0::/32 de 2a01:4200::/32 ru +2a01:4240::/32 cz +2a01:4260::/32 dk 2a01:4280::/32 il +2a01:42a0::/32 ru +2a01:42c0::/32 no +2a01:42e0::/32 kz 2a01:4300::/32 gb +2a01:4320::/32 gb +2a01:4340::/32 be +2a01:4360::/32 ru 2a01:4380::/32 ru +2a01:43a0::/32 se +2a01:43c0::/32 iq 2a01:4400::/32 se +2a01:4420::/32 ru +2a01:4440::/32 ru +2a01:4460::/32 ru 2a01:4480::/32 es +2a01:44a0::/32 it +2a01:44c0::/32 is +2a01:44e0::/32 ua 2a01:4500::/32 ps +2a01:4520::/32 nl +2a01:4540::/32 ch 2a01:4580::/32 fr +2a01:45c0::/32 fr +2a01:45e0::/32 it 2a01:4600::/32 bh +2a01:4620::/32 fr +2a01:4640::/32 ch +2a01:4660::/32 pl 2a01:4680::/32 rs -2a01:4700::/32 it +2a01:46a0::/32 sa +2a01:46c0::/32 fr +2a01:46e0::/32 gb +2a01:4700::/32 ro +2a01:4720::/32 ru +2a01:4740::/32 us +2a01:4760::/32 gb 2a01:4780::/32 am +2a01:47a0::/32 ge +2a01:47c0::/32 hu +2a01:47e0::/32 ua 2a01:4800::/32 de +2a01:4820::/32 ie +2a01:4840::/32 it +2a01:4860::/32 iq 2a01:4880::/32 ru +2a01:48a0::/32 ru +2a01:48c0::/32 ch +2a01:48e0::/32 es 2a01:4900::/32 bh -2a01:4980::/32 hu +2a01:4920::/32 ru +2a01:4940::/32 ru +2a01:4960::/32 ch +2a01:4980::/32 be +2a01:49a0::/32 is +2a01:49c0::/32 ru +2a01:49e0::/32 az 2a01:4a00::/32 am +2a01:4a20::/32 fr +2a01:4a40::/32 bg +2a01:4a60::/32 ua 2a01:4a80::/32 es +2a01:4aa0::/32 ch +2a01:4ac0::/32 ir +2a01:4ae0::/32 gb 2a01:4b00::/32 gb +2a01:4b20::/32 de +2a01:4b40::/32 kz +2a01:4b60::/32 ru 2a01:4b80::/32 es +2a01:4ba0::/32 az +2a01:4bc0::/32 de +2a01:4be0::/32 hu 2a01:4c00::/32 nl +2a01:4c20::/32 tr +2a01:4c40::/32 dk +2a01:4c60::/32 gb 2a01:4c80::/32 ru +2a01:4ca0::/32 ru +2a01:4cc0::/32 gb +2a01:4ce0::/32 ro 2a01:4d00::/32 ru +2a01:4d20::/32 dk +2a01:4d40::/32 kz +2a01:4d60::/32 nl 2a01:4d80::/32 de +2a01:4da0::/32 de +2a01:4dc0::/32 de +2a01:4de0::/32 ru 2a01:4e00::/32 fr +2a01:4e20::/32 pl +2a01:4e40::/32 ru +2a01:4e60::/32 gb 2a01:4e80::/32 it +2a01:4ea0::/32 ru +2a01:4ec0::/32 it +2a01:4ee0::/32 ru 2a01:4f00::/32 al +2a01:4f20::/32 fr +2a01:4f40::/32 ch +2a01:4f60::/32 nl 2a01:4f80::/32 de +2a01:4fa0::/32 ru +2a01:4fc0::/32 de +2a01:4fe0::/32 nl 2a01:5000::/32 de +2a01:5020::/32 de +2a01:5040::/32 nl 2a01:5080::/32 ru +2a01:50a0::/32 de +2a01:50c0::/32 de +2a01:50e0::/32 de 2a01:5100::/32 fr +2a01:5120::/32 cy +2a01:5140::/32 nl +2a01:5160::/32 me 2a01:5180::/32 gb +2a01:51a0::/32 fi +2a01:51c0::/32 fi 2a01:5200::/32 sk +2a01:5220::/32 ru +2a01:5240::/32 de +2a01:5260::/32 ru 2a01:5280::/32 es +2a01:52a0::/32 ch +2a01:52c0::/32 de +2a01:52e0::/32 nl 2a01:5300::/32 se -2a01:5380::/32 eu +2a01:5320::/32 pl +2a01:5340::/32 ru +2a01:5360::/32 gb +2a01:5380::/32 gb +2a01:53a0::/32 pl +2a01:53c0::/32 gb +2a01:53e0::/32 se 2a01:5400::/32 gb +2a01:5420::/32 it +2a01:5440::/32 dk +2a01:5460::/32 nl 2a01:5480::/32 gg +2a01:54a0::/32 es +2a01:54c0::/32 nl +2a01:54e0::/32 ru 2a01:5500::/32 ir +2a01:5540::/32 se +2a01:5560::/32 ru 2a01:5580::/32 de +2a01:55a0::/32 ru +2a01:55c0::/32 de +2a01:55e0::/32 de 2a01:5600::/32 ua +2a01:5620::/32 nl +2a01:5640::/32 gb +2a01:5660::/32 ch 2a01:5680::/32 gb +2a01:56a0::/32 gb +2a01:56c0::/32 gb +2a01:56e0::/32 pl 2a01:5700::/32 se +2a01:5720::/32 it +2a01:5740::/32 at +2a01:5760::/32 it 2a01:5780::/32 es +2a01:57a0::/32 es +2a01:57c0::/32 ru +2a01:57e0::/32 it 2a01:5800::/32 ua -2a01:5880::/32 ru +2a01:5820::/32 gb +2a01:5840::/32 ir +2a01:5860::/32 nl +2a01:5880::/32 it +2a01:58a0::/32 iq +2a01:58c0::/32 fr +2a01:58e0::/32 il 2a01:5900::/32 de +2a01:5920::/32 it +2a01:5940::/32 it +2a01:5960::/32 be 2a01:5980::/32 gb +2a01:59a0::/32 pl +2a01:59c0::/32 gb +2a01:59e0::/32 gb 2a01:5a00::/32 be -2a01:5a80::/32 eu -2a01:5b00::/32 gb +2a01:5a20::/32 ie +2a01:5a40::/32 ru +2a01:5a60::/32 ru +2a01:5a80::/32 us +2a01:5aa0::/32 gb +2a01:5ac0::/32 gb +2a01:5ae0::/32 gb +2a01:5b20::/32 es +2a01:5b40::/32 no +2a01:5b60::/32 gb 2a01:5b80::/32 be +2a01:5ba0::/32 gb +2a01:5bc0::/32 cz +2a01:5be0::/32 nl 2a01:5c00::/32 be +2a01:5c20::/32 gb +2a01:5c40::/32 ua +2a01:5c60::/32 pl 2a01:5c80::/32 ru +2a01:5ca0::/32 kw +2a01:5cc0::/32 nl +2a01:5ce0::/32 gb 2a01:5d00::/32 gb +2a01:5d20::/32 it +2a01:5d40::/32 ua +2a01:5d60::/32 tj 2a01:5d80::/32 bh +2a01:5da0::/32 me +2a01:5dc0::/32 fr +2a01:5de0::/32 gb 2a01:5e00::/32 pl +2a01:5e20::/32 bg +2a01:5e40::/32 gb +2a01:5e60::/32 ae 2a01:5e80::/32 dk +2a01:5ea0::/32 ru +2a01:5ec0::/32 ir +2a01:5ee0::/32 pl 2a01:5f00::/32 ru +2a01:5f20::/32 ru +2a01:5f40::/32 ru +2a01:5f60::/32 it 2a01:5f80::/32 it +2a01:5fa0::/32 ua +2a01:5fc0::/32 ru +2a01:5fe0::/32 es 2a01:6000::/32 gb +2a01:6020::/32 ru +2a01:6040::/32 gb +2a01:6060::/32 no 2a01:6080::/32 it +2a01:60a0::/32 fr +2a01:60c0::/32 fi +2a01:60e0::/32 fr 2a01:6100::/32 pl +2a01:6120::/32 gb +2a01:6140::/32 fi +2a01:6160::/32 ru 2a01:6180::/32 fi +2a01:61a0::/32 gb +2a01:61c0::/32 gb +2a01:61e0::/32 ru 2a01:6200::/32 dk +2a01:6220::/32 cz +2a01:6240::/32 gb +2a01:6260::/32 it 2a01:6280::/32 ie +2a01:62a0::/32 nl +2a01:62c0::/32 cy +2a01:62e0::/32 eu 2a01:6300::/32 se +2a01:6320::/32 gr +2a01:6340::/32 nl +2a01:6360::/32 ch 2a01:6380::/32 fr +2a01:63a0::/32 tr +2a01:63c0::/32 it +2a01:63e0::/32 nl 2a01:6400::/32 cz +2a01:6420::/32 de +2a01:6440::/32 rs +2a01:6460::/32 fr 2a01:6480::/32 az +2a01:64a0::/32 ru +2a01:64c0::/32 de +2a01:64e0::/32 ru 2a01:6500::/32 il +2a01:6520::/32 ru +2a01:6540::/32 ru +2a01:6560::/32 no 2a01:6580::/32 it +2a01:65a0::/32 pl +2a01:65c0::/32 it +2a01:65e0::/32 gb 2a01:6600::/32 fr +2a01:6620::/32 be +2a01:6640::/32 ch 2a01:6680::/32 ru +2a01:66a0::/32 de +2a01:66c0::/32 fr +2a01:66e0::/32 nl 2a01:6700::/32 cy +2a01:6720::/32 iq +2a01:6740::/32 de +2a01:6760::/32 it 2a01:6780::/32 de +2a01:67a0::/32 ru +2a01:67c0::/32 nl +2a01:67e0::/32 ru 2a01:6800::/32 pl +2a01:6820::/32 ru +2a01:6840::/32 es +2a01:6860::/32 gb 2a01:6880::/32 ua +2a01:68a0::/32 es +2a01:68c0::/32 kz +2a01:68e0::/32 dk 2a01:6900::/32 es +2a01:6920::/32 nl +2a01:6940::/32 fr +2a01:6960::/32 fr 2a01:6980::/32 ch +2a01:69a0::/32 cz +2a01:69c0::/32 ie +2a01:69e0::/32 nl 2a01:6a00::/32 gb +2a01:6a20::/32 pl +2a01:6a40::/32 nl +2a01:6a60::/32 gb 2a01:6a80::/32 cz +2a01:6aa0::/32 ru +2a01:6ac0::/32 de +2a01:6ae0::/32 gb 2a01:6b00::/32 ru +2a01:6b20::/32 de +2a01:6b40::/32 cz +2a01:6b60::/32 fr 2a01:6b80::/32 sk +2a01:6ba0::/32 ru +2a01:6bc0::/32 de +2a01:6be0::/32 tr 2a01:6c00::/32 pl +2a01:6c20::/32 ru +2a01:6c40::/32 ch +2a01:6c60::/32 gb 2a01:6c80::/32 se +2a01:6ca0::/32 gb +2a01:6cc0::/32 fr +2a01:6ce0::/32 ie 2a01:6d00::/32 se +2a01:6d20::/32 fi +2a01:6d60::/32 it 2a01:6d80::/32 ua +2a01:6da0::/32 ee +2a01:6dc0::/32 md +2a01:6de0::/32 fr 2a01:6e00::/32 fr +2a01:6e20::/32 ru +2a01:6e40::/32 by +2a01:6e60::/32 gb 2a01:6e80::/32 pl +2a01:6ea0::/32 de +2a01:6ec0::/32 de +2a01:6ee0::/32 hu 2a01:6f00::/32 is +2a01:6f20::/32 gb +2a01:6f40::/32 ie +2a01:6f60::/32 de 2a01:6f80::/32 no +2a01:6fa0::/32 es +2a01:6fc0::/32 at +2a01:6fe0::/32 ua 2a01:7000::/32 it -2a01:7080::/32 lu +2a01:7020::/32 ie +2a01:7040::/32 be +2a01:7060::/32 fr +2a01:7080::/32 be +2a01:70a0::/32 de +2a01:70c0::/32 ru +2a01:70e0::/32 kw 2a01:7100::/32 ru +2a01:7120::/32 ua +2a01:7140::/32 it +2a01:7160::/32 ua 2a01:7180::/32 nl +2a01:71a0::/32 de +2a01:71c0::/32 es +2a01:71e0::/32 ch 2a01:7200::/32 es +2a01:7220::/32 lt +2a01:7240::/32 ie +2a01:7260::/32 lb 2a01:7280::/32 gb +2a01:72a0::/32 ru +2a01:72c0::/32 pl +2a01:72e0::/32 es 2a01:7300::/32 hu -2a01:7380::/32 eu +2a01:7320::/32 ir +2a01:7340::/32 nl +2a01:7360::/32 lu +2a01:7380::/32 de +2a01:73a0::/32 fr +2a01:73c0::/32 il +2a01:73e0::/32 bg 2a01:7400::/32 pl +2a01:7420::/32 de +2a01:7440::/32 ru +2a01:7460::/32 it 2a01:7480::/32 ch +2a01:74a0::/32 gb +2a01:74c0::/32 de +2a01:74e0::/32 nl 2a01:7500::/32 be +2a01:7520::/32 nl +2a01:7540::/32 it 2a01:7580::/32 es +2a01:75a0::/32 ae +2a01:75c0::/32 de +2a01:75e0::/32 eu 2a01:7600::/32 pl +2a01:7620::/32 fr +2a01:7640::/32 kz +2a01:7660::/32 de 2a01:7680::/32 es +2a01:76a0::/32 dk +2a01:76c0::/32 de +2a01:76e0::/32 pl 2a01:7700::/32 de +2a01:7720::/32 ru +2a01:7740::/32 gb +2a01:7760::/32 de 2a01:7780::/32 kw +2a01:77a0::/32 it +2a01:77c0::/32 dk +2a01:77e0::/32 nl 2a01:7800::/32 gb -2a01:7880::/32 nl +2a01:7820::/32 de +2a01:7840::/32 de +2a01:7860::/32 nl +2a01:7880::/32 es +2a01:78a0::/32 pl +2a01:78c0::/32 gb +2a01:78e0::/32 gb 2a01:7900::/32 se +2a01:7920::/32 dk +2a01:7940::/32 gb +2a01:7960::/32 de 2a01:7980::/32 gb +2a01:79a0::/32 dk +2a01:79c0::/32 cy +2a01:79e0::/32 no 2a01:7a00::/32 se +2a01:7a20::/32 nl +2a01:7a40::/32 de +2a01:7a60::/32 sm 2a01:7a80::/32 dk +2a01:7ac0::/32 ru +2a01:7ae0::/32 gb 2a01:7b00::/32 lb +2a01:7b20::/32 fr +2a01:7b40::/32 de +2a01:7b60::/32 ru 2a01:7b80::/32 ru +2a01:7ba0::/32 cz +2a01:7bc0::/32 fi +2a01:7be0::/32 de 2a01:7c00::/32 fr +2a01:7c20::/32 ge +2a01:7c40::/32 hr +2a01:7c60::/32 it 2a01:7c80::/32 lt +2a01:7ca0::/32 it +2a01:7cc0::/32 dk +2a01:7ce0::/32 cz 2a01:7d00::/32 es +2a01:7d20::/32 cz +2a01:7d40::/32 sk +2a01:7d60::/32 hu 2a01:7d80::/32 hu -2a01:7e00::/32 eu +2a01:7da0::/32 ie +2a01:7dc0::/32 dk +2a01:7de0::/32 de +2a01:7e00::/32 gb +2a01:7e20::/32 ru +2a01:7e40::/32 bh +2a01:7e60::/32 bg 2a01:7e80::/32 de +2a01:7ea0::/32 de +2a01:7ec0::/32 cz +2a01:7ee0::/32 se 2a01:7f00::/32 it +2a01:7f20::/32 ru +2a01:7f40::/32 kw +2a01:7f60::/32 gb 2a01:7f80::/32 ps +2a01:7fa0::/32 gb +2a01:7fc0::/32 gb +2a01:7fe0::/32 cz 2a01:8000::/32 gb +2a01:8020::/32 ee +2a01:8040::/32 ru +2a01:8060::/32 ae 2a01:8080::/32 ro +2a01:80a0::/32 at +2a01:80c0::/32 ch +2a01:80e0::/32 no 2a01:8100::/32 it +2a01:8120::/32 dk +2a01:8140::/32 ua +2a01:8160::/32 pl 2a01:8180::/32 de +2a01:81a0::/32 ru +2a01:81c0::/32 de +2a01:81e0::/32 fr 2a01:8200::/32 fr +2a01:8220::/32 ie +2a01:8240::/32 ru +2a01:8260::/32 ru 2a01:8280::/32 is +2a01:82a0::/32 ee +2a01:82c0::/32 hr +2a01:82e0::/32 gb 2a01:8300::/32 dk +2a01:8320::/32 it +2a01:8340::/32 gb +2a01:8360::/32 ru 2a01:8380::/32 ru +2a01:83a0::/32 ua +2a01:83c0::/32 no +2a01:83e0::/32 de 2a01:8400::/32 de +2a01:8420::/32 it +2a01:8440::/32 it +2a01:8460::/32 es 2a01:8480::/32 es +2a01:84a0::/32 it +2a01:84c0::/32 ru +2a01:84e0::/32 ch 2a01:8500::/32 nl +2a01:8520::/32 tr +2a01:8540::/32 it +2a01:8560::/32 gb 2a01:8580::/32 nl +2a01:85a0::/32 it +2a01:85c0::/32 gb +2a01:85e0::/32 ru 2a01:8600::/32 ru -2a01:8680::/32 de +2a01:8620::/32 be +2a01:8640::/32 gb +2a01:8660::/32 fr +2a01:8680::/32 gb +2a01:86a0::/32 be +2a01:86c0::/32 es +2a01:86e0::/32 gb 2a01:8700::/32 lt +2a01:8720::/32 us +2a01:8740::/32 bg +2a01:8760::/32 fr 2a01:8780::/32 de +2a01:87c0::/32 gb +2a01:87e0::/32 nl 2a01:8800::/32 nl +2a01:8820::/32 ru +2a01:8840::/32 ie +2a01:8860::/32 ch 2a01:8880::/32 bg +2a01:88a0::/32 es +2a01:88c0::/32 de +2a01:88e0::/32 ge 2a01:8900::/32 gb +2a01:8920::/32 fr +2a01:8940::/32 gb +2a01:8960::/32 ru 2a01:8980::/32 nl +2a01:89a0::/32 ua +2a01:89c0::/32 be +2a01:89e0::/32 gb 2a01:8a00::/32 ru +2a01:8a20::/32 pl +2a01:8a40::/32 de +2a01:8a60::/32 pl 2a01:8a80::/32 sk +2a01:8aa0::/32 ie +2a01:8ac0::/32 fr +2a01:8ae0::/32 nl 2a01:8b00::/32 ch +2a01:8b20::/32 ps +2a01:8b40::/32 cz +2a01:8b60::/32 be 2a01:8b80::/32 ch +2a01:8ba0::/32 pl +2a01:8bc0::/32 gb +2a01:8be0::/32 nl 2a01:8c00::/32 cz +2a01:8c20::/32 nl +2a01:8c40::/32 gi +2a01:8c60::/32 az 2a01:8c80::/32 se +2a01:8ca0::/32 lv +2a01:8cc0::/32 at +2a01:8ce0::/32 kz 2a01:8d00::/32 cz +2a01:8d20::/32 nl +2a01:8d40::/32 it 2a01:8d80::/32 no +2a01:8da0::/32 es +2a01:8dc0::/32 no +2a01:8de0::/32 hu 2a01:8e00::/32 se +2a01:8e20::/32 de +2a01:8e40::/32 jo +2a01:8e60::/32 us 2a01:8e80::/32 fr +2a01:8ec0::/32 dk +2a01:8ee0::/32 nl 2a01:8f00::/32 de +2a01:8f20::/32 pl +2a01:8f40::/32 pl +2a01:8f60::/32 es 2a01:8f80::/32 ie +2a01:8fa0::/32 de +2a01:8fc0::/32 cz +2a01:8fe0::/32 gb 2a01:9000::/32 fr +2a01:9020::/32 ru +2a01:9040::/32 si +2a01:9060::/32 se 2a01:9080::/32 se +2a01:90a0::/32 nl +2a01:90c0::/32 gb +2a01:90e0::/32 at 2a01:9100::/32 be +2a01:9120::/32 it +2a01:9140::/32 es +2a01:9160::/32 ru 2a01:9180::/32 ir +2a01:91a0::/32 at +2a01:91c0::/32 nl +2a01:91e0::/32 es +2a01:9200::/32 gb +2a01:9220::/32 it +2a01:9240::/32 az +2a01:9260::/32 tr 2a01:9280::/32 nl +2a01:92a0::/32 es +2a01:92c0::/32 fr +2a01:92e0::/32 il 2a01:9300::/32 it +2a01:9320::/32 ch +2a01:9340::/32 es +2a01:9360::/32 pl 2a01:9380::/32 pl -2a01:9400::/32 pl +2a01:93a0::/32 bg +2a01:93c0::/32 gb +2a01:93e0::/32 be +2a01:9400::/32 nl +2a01:9420::/32 cz +2a01:9440::/32 pl +2a01:9460::/32 is 2a01:9480::/32 be +2a01:94a0::/32 gb +2a01:94c0::/32 ru +2a01:94e0::/32 hu 2a01:9500::/32 fr +2a01:9520::/32 gb +2a01:9540::/32 gb +2a01:9560::/32 se 2a01:9580::/32 nl +2a01:95a0::/32 cz +2a01:95c0::/32 hu +2a01:95e0::/32 it 2a01:9600::/32 gb +2a01:9620::/32 ge +2a01:9640::/32 cz +2a01:9660::/32 nl 2a01:9680::/32 fr +2a01:96a0::/32 kg +2a01:96c0::/32 ru +2a01:96e0::/32 pl 2a01:9700::/32 jo +2a01:9720::/32 fr +2a01:9740::/32 gb +2a01:9760::/32 ky 2a01:9780::/32 nl +2a01:97a0::/32 ee +2a01:97c0::/32 no +2a01:97e0::/32 pl 2a01:9800::/32 ir +2a01:9820::/32 de +2a01:9840::/32 it +2a01:9860::/32 ru 2a01:9880::/32 gb +2a01:98a0::/32 cz +2a01:98c0::/32 ru +2a01:98e0::/32 es 2a01:9900::/32 no +2a01:9920::/32 pl +2a01:9940::/32 fr +2a01:9960::/32 be 2a01:9980::/32 ch +2a01:99a0::/32 de +2a01:99c0::/32 nl +2a01:99e0::/32 kz 2a01:9a00::/32 it +2a01:9a20::/32 tr +2a01:9a40::/32 ru +2a01:9a60::/32 gb 2a01:9a80::/32 it +2a01:9aa0::/32 pl +2a01:9ac0::/32 it +2a01:9ae0::/32 ru 2a01:9b00::/32 no +2a01:9b20::/32 kw +2a01:9b40::/32 nl +2a01:9b60::/32 de 2a01:9b80::/32 hu +2a01:9ba0::/32 de +2a01:9bc0::/32 be +2a01:9be0::/32 gb 2a01:9c00::/32 it +2a01:9c20::/32 tr +2a01:9c40::/32 gb +2a01:9c60::/32 no 2a01:9c80::/32 ge +2a01:9ca0::/32 it +2a01:9cc0::/32 gb +2a01:9ce0::/32 si 2a01:9d00::/32 kg +2a01:9d20::/32 al +2a01:9d40::/32 de +2a01:9d60::/32 pl 2a01:9d80::/32 fr +2a01:9da0::/32 it +2a01:9dc0::/32 nl +2a01:9de0::/32 fr 2a01:9e00::/32 gb +2a01:9e20::/32 gb +2a01:9e40::/32 bg +2a01:9e60::/32 gb 2a01:9e80::/32 gb +2a01:9ea0::/32 at +2a01:9ec0::/32 de 2a01:9f00::/32 ru +2a01:9f20::/32 es +2a01:9f40::/32 cz +2a01:9f60::/32 ru 2a01:9f80::/32 sk +2a01:9fa0::/32 de +2a01:9fc0::/32 se +2a01:9fe0::/32 de 2a01:a000::/32 gb +2a01:a020::/32 gb +2a01:a040::/32 cz +2a01:a060::/32 fr 2a01:a080::/32 de +2a01:a0a0::/32 de +2a01:a0c0::/32 nl +2a01:a0e0::/32 ge 2a01:a100::/32 se +2a01:a120::/32 ir +2a01:a140::/32 gb +2a01:a160::/32 pl 2a01:a180::/32 mk +2a01:a1a0::/32 fr +2a01:a1c0::/32 lt +2a01:a1e0::/32 ru 2a01:a200::/32 gb +2a01:a220::/32 gb +2a01:a240::/32 ua +2a01:a260::/32 es 2a01:a280::/32 ru +2a01:a2a0::/32 fr +2a01:a2c0::/32 gb +2a01:a2e0::/32 ch 2a01:a300::/32 ua +2a01:a320::/32 md +2a01:a340::/32 it +2a01:a360::/32 es 2a01:a380::/32 de -2a01:a400::/32 gb -2a01:a480::/32 de +2a01:a3a0::/32 tr +2a01:a3c0::/32 nl +2a01:a3e0::/32 ee +2a01:a400::/32 je +2a01:a420::/32 tr +2a01:a440::/32 ru +2a01:a460::/32 de +2a01:a480::/32 ch +2a01:a4a0::/32 lu +2a01:a4c0::/32 es +2a01:a4e0::/32 cz 2a01:a500::/32 gb +2a01:a520::/32 no +2a01:a540::/32 ir +2a01:a560::/32 se 2a01:a580::/32 fr +2a01:a5a0::/32 gb +2a01:a5c0::/32 gb +2a01:a5e0::/32 fr 2a01:a600::/32 it +2a01:a620::/32 it +2a01:a640::/32 nl +2a01:a660::/32 dk 2a01:a680::/32 nl +2a01:a6a0::/32 fr +2a01:a6c0::/32 ru +2a01:a6e0::/32 ba 2a01:a700::/32 de +2a01:a740::/32 de +2a01:a760::/32 hr 2a01:a780::/32 de +2a01:a7a0::/32 de +2a01:a7c0::/32 it +2a01:a7e0::/32 fi 2a01:a800::/32 fi +2a01:a820::/32 ch +2a01:a840::/32 no +2a01:a860::/32 gb 2a01:a880::/32 lv +2a01:a8a0::/32 es +2a01:a8c0::/32 cz +2a01:a8e0::/32 cz 2a01:a900::/32 ru +2a01:a920::/32 nl +2a01:a940::/32 es +2a01:a960::/32 al 2a01:a980::/32 de +2a01:a9a0::/32 nl +2a01:a9c0::/32 ru +2a01:a9e0::/32 us 2a01:aa00::/32 be +2a01:aa20::/32 iq +2a01:aa40::/32 ch +2a01:aa60::/32 fr 2a01:aa80::/32 se +2a01:aaa0::/32 ru +2a01:aac0::/32 tr +2a01:aae0::/32 nl 2a01:ab00::/32 it +2a01:ab20::/32 ch +2a01:ab40::/32 de +2a01:ab60::/32 fr +2a01:ab80::/32 de +2a01:aba0::/32 es +2a01:abc0::/32 mt +2a01:abe0::/32 de 2a01:ac00::/32 de +2a01:ac20::/32 ru +2a01:ac40::/32 it +2a01:ac60::/32 tr 2a01:ac80::/32 rs +2a01:aca0::/32 pl +2a01:acc0::/32 ch +2a01:ace0::/32 es 2a01:ad00::/32 ie +2a01:ad20::/32 es +2a01:ad40::/32 gb +2a01:ad60::/32 rs 2a01:ad80::/32 tr +2a01:ada0::/32 ch +2a01:adc0::/32 ru +2a01:ade0::/32 cz 2a01:ae00::/32 gb +2a01:ae20::/32 hu +2a01:ae40::/32 de +2a01:ae60::/32 pl 2a01:ae80::/32 fr +2a01:aea0::/32 at +2a01:aec0::/32 ch +2a01:aee0::/32 at 2a01:af00::/32 kz +2a01:af20::/32 tr +2a01:af40::/32 pl +2a01:af60::/32 pl 2a01:af80::/32 at +2a01:afa0::/32 dk +2a01:afc0::/32 cz +2a01:afe0::/32 tr 2a01:b000::/32 gb +2a01:b020::/32 pt +2a01:b040::/32 gb +2a01:b060::/32 es 2a01:b080::/32 it +2a01:b0a0::/32 us +2a01:b0c0::/32 kz +2a01:b0e0::/32 fr 2a01:b100::/32 ch +2a01:b120::/32 it +2a01:b140::/32 de +2a01:b160::/32 de 2a01:b180::/32 de +2a01:b1a0::/32 ie +2a01:b1c0::/32 de 2a01:b200::/32 sk +2a01:b220::/32 ru +2a01:b240::/32 gb +2a01:b260::/32 nl 2a01:b280::/32 gb +2a01:b2a0::/32 gb +2a01:b2c0::/32 gb +2a01:b2e0::/32 nl 2a01:b300::/32 es +2a01:b340::/32 ie +2a01:b360::/32 ru 2a01:b380::/32 cz +2a01:b3a0::/32 ae +2a01:b3c0::/32 ch +2a01:b3e0::/32 se 2a01:b400::/32 ch +2a01:b420::/32 ru +2a01:b440::/32 bg +2a01:b460::/32 de 2a01:b480::/32 ua +2a01:b4a0::/32 si +2a01:b4c0::/32 cz +2a01:b4e0::/32 sa 2a01:b500::/32 gr +2a01:b520::/32 fr +2a01:b540::/32 ch 2a01:b580::/32 ru +2a01:b5a0::/32 fi +2a01:b5c0::/32 es +2a01:b5e0::/32 hu 2a01:b600::/32 it +2a01:b620::/32 ge +2a01:b640::/32 ru +2a01:b660::/32 gb 2a01:b680::/32 es +2a01:b6a0::/32 bg +2a01:b6c0::/32 se 2a01:b700::/32 se +2a01:b720::/32 gb +2a01:b740::/32 ie +2a01:b760::/32 bg 2a01:b780::/32 mk +2a01:b7c0::/32 ch +2a01:b7e0::/32 fr 2a01:b800::/32 rs +2a01:b820::/32 gb +2a01:b840::/32 gb +2a01:b860::/32 gb 2a01:b880::/32 se +2a01:b8a0::/32 ru +2a01:b8c0::/32 no +2a01:b8e0::/32 pl 2a01:b900::/32 es +2a01:b920::/32 nl +2a01:b940::/32 nl +2a01:b960::/32 nl 2a01:b980::/32 gb +2a01:b9a0::/32 ru +2a01:b9c0::/32 is +2a01:b9e0::/32 fr 2a01:ba00::/32 fi +2a01:ba20::/32 gb +2a01:ba40::/32 ch +2a01:ba60::/32 ps 2a01:ba80::/32 ru +2a01:baa0::/32 nl +2a01:bac0::/32 hu +2a01:bae0::/32 lv +2a01:bb00::/32 fr +2a01:bb20::/32 de +2a01:bb40::/32 no +2a01:bb60::/32 nl 2a01:bb80::/32 pl +2a01:bba0::/32 tr +2a01:bbc0::/32 am +2a01:bbe0::/32 it 2a01:bc00::/32 ie +2a01:bc40::/32 ru +2a01:bc60::/32 ch 2a01:bc80::/32 eu +2a01:bca0::/32 gb +2a01:bcc0::/32 es +2a01:bce0::/32 it 2a01:bd00::/32 ch +2a01:bd20::/32 ch +2a01:bd40::/32 de +2a01:bd60::/32 sy 2a01:bd80::/32 ir +2a01:bda0::/32 cz +2a01:bdc0::/32 es +2a01:bde0::/32 gb 2a01:be00::/32 hu +2a01:be20::/32 sy +2a01:be40::/32 ru +2a01:be60::/32 ie 2a01:be80::/32 de -2a01:bf00::/32 gb +2a01:bea0::/32 gb +2a01:bec0::/32 ru +2a01:bee0::/32 it +2a01:bf00::/32 ch +2a01:bf20::/32 ua +2a01:bf40::/32 it +2a01:bf60::/32 us 2a01:bf80::/32 no +2a01:bfa0::/32 kg +2a01:bfc0::/32 ru +2a01:bfe0::/32 fr 2a01:c000::/32 fr 2a02::/32 lu 2a02:8::/32 eu @@ -7598,7 +19542,7 @@ 2a02:98::/32 gb 2a02:a0::/32 es 2a02:a8::/32 de -2a02:b0::/32 de +2a02:b0::/32 gb 2a02:b8::/32 lu 2a02:c0::/32 no 2a02:c8::/32 be @@ -7628,9 +19572,7 @@ 2a02:188::/32 dk 2a02:190::/32 se 2a02:198::/32 ie -2a02:1a0::/32 ru 2a02:1a8::/32 de -2a02:1b0::/32 no 2a02:1b8::/32 at 2a02:1c0::/32 bg 2a02:1c8::/32 ru @@ -7658,7 +19600,6 @@ 2a02:278::/32 ie 2a02:280::/32 ua 2a02:288::/32 ru -2a02:290::/32 ru 2a02:298::/32 gb 2a02:2a0::/32 pl 2a02:2a8::/32 ch @@ -7666,7 +19607,6 @@ 2a02:2b8::/32 fr 2a02:2c0::/32 de 2a02:2c8::/32 no -2a02:2d0::/32 fi 2a02:2d8::/32 gb 2a02:2e0::/32 de 2a02:2e8::/32 it @@ -7687,7 +19627,6 @@ 2a02:360::/32 nl 2a02:368::/32 ch 2a02:370::/32 ch -2a02:378::/32 de 2a02:380::/32 li 2a02:388::/32 ch 2a02:390::/32 gb @@ -7698,7 +19637,7 @@ 2a02:3b8::/32 es 2a02:3c0::/32 cz 2a02:3c8::/32 is -2a02:3d0::/32 eu +2a02:3d0::/32 us 2a02:3d8::/32 ie 2a02:3e0::/32 at 2a02:3e8::/32 fr @@ -7728,7 +19667,6 @@ 2a02:4a8::/32 cz 2a02:4b0::/32 be 2a02:4b8::/32 fr -2a02:4c0::/32 fr 2a02:4c8::/32 bg 2a02:4d0::/32 it 2a02:4d8::/32 lu @@ -7738,7 +19676,6 @@ 2a02:4f8::/32 nl 2a02:500::/32 lv 2a02:508::/32 se -2a02:510::/32 it 2a02:518::/32 it 2a02:520::/32 nl 2a02:530::/32 ru @@ -7763,15 +19700,12 @@ 2a02:5d0::/32 de 2a02:5d8::/32 at 2a02:5e0::/32 at -2a02:5e8::/32 de 2a02:5f0::/32 ua -2a02:5f8::/32 ch 2a02:600::/32 it 2a02:608::/32 de 2a02:610::/32 lv 2a02:618::/32 ru 2a02:620::/32 ch -2a02:628::/32 pt 2a02:630::/32 dk 2a02:638::/32 gi 2a02:640::/32 cy @@ -7816,7 +19750,6 @@ 2a02:778::/32 de 2a02:780::/32 hu 2a02:788::/32 de -2a02:790::/32 de 2a02:798::/32 fr 2a02:7a0::/32 de 2a02:7a8::/32 si @@ -7829,7 +19762,6 @@ 2a02:7e0::/32 no 2a02:7e8::/32 ua 2a02:7f0::/32 pl -2a02:7f8::/32 bg 2a02:800::/32 si 2a02:808::/32 hu 2a02:810::/32 ch @@ -7846,7 +19778,7 @@ 2a02:868::/32 de 2a02:870::/32 pt 2a02:878::/32 ru -2a02:880::/32 nl +2a02:880::/32 de 2a02:888::/32 sa 2a02:890::/32 gb 2a02:898::/32 nl @@ -7932,10 +19864,7 @@ 2a02:b18::/32 at 2a02:b20::/32 cz 2a02:b28::/32 de -2a02:b30::/32 de -2a02:b38::/32 be -2a02:b40::/32 se -2a02:b48::/32 ua +2a02:b48::/32 nl 2a02:b50::/32 gb 2a02:b58::/32 rs 2a02:b60::/32 iq @@ -7953,7 +19882,7 @@ 2a02:bc8::/32 ru 2a02:bd0::/32 nl 2a02:bd8::/32 pl -2a02:be0::/32 cy +2a02:be0::/32 gr 2a02:be8::/32 es 2a02:bf0::/32 by 2a02:bf8::/32 gb @@ -7963,7 +19892,6 @@ 2a02:c18::/32 fr 2a02:c20::/32 cz 2a02:c28::/32 je -2a02:c30::/32 gb 2a02:c38::/32 cz 2a02:c40::/32 pl 2a02:c48::/32 de @@ -7980,9 +19908,8 @@ 2a02:ca0::/32 nl 2a02:ca8::/32 gb 2a02:cb0::/32 gb -2a02:cb8::/32 gb +2a02:cb8::/32 eu 2a02:cc0::/32 nl -2a02:cc8::/32 nl 2a02:cd0::/32 de 2a02:cd8::/32 ch 2a02:ce0::/32 sa @@ -8025,7 +19952,7 @@ 2a02:e20::/32 si 2a02:e28::/32 nl 2a02:e30::/32 pl -2a02:e38::/32 gb +2a02:e38::/32 nl 2a02:e40::/32 rs 2a02:e48::/32 mk 2a02:e50::/32 it @@ -8033,7 +19960,6 @@ 2a02:e60::/32 ch 2a02:e68::/32 gb 2a02:e70::/32 ch -2a02:e78::/32 fr 2a02:e80::/32 ee 2a02:e88::/32 pl 2a02:e90::/32 fo @@ -8047,7 +19973,6 @@ 2a02:ed0::/32 il 2a02:ed8::/32 it 2a02:ee0::/32 pl -2a02:ee8::/32 it 2a02:ef0::/32 fi 2a02:ef8::/32 gb 2a02:f00::/32 be @@ -8081,7 +20006,6 @@ 2a02:fe0::/32 no 2a02:fe8::/32 nl 2a02:ff0::/32 tr -2a02:ff8::/32 ir 2a02:1000::/32 de 2a02:1200::/32 ch 2a02:1300::/32 is @@ -8125,7 +20049,6 @@ 2a02:1628::/32 de 2a02:1630::/32 it 2a02:1638::/32 cz -2a02:1640::/32 cy 2a02:1648::/32 gb 2a02:1650::/32 sa 2a02:1658::/32 gb @@ -8135,7 +20058,6 @@ 2a02:1678::/32 it 2a02:1680::/32 nl 2a02:1688::/32 at -2a02:1690::/32 se 2a02:1698::/32 de 2a02:16a0::/32 ch 2a02:16a8::/32 at @@ -8150,7 +20072,6 @@ 2a02:16f0::/32 de 2a02:16f8::/32 gb 2a02:1700::/32 gb -2a02:1708::/32 cz 2a02:1710::/32 gb 2a02:1718::/32 ae 2a02:1720::/32 nl @@ -8210,7 +20131,6 @@ 2a02:20d0::/32 gb 2a02:20d8::/32 it 2a02:20e0::/32 nl -2a02:20e8::/32 gb 2a02:20f0::/32 fr 2a02:20f8::/32 fr 2a02:2100::/32 ru @@ -8249,7 +20169,6 @@ 2a02:2220::/32 at 2a02:2228::/32 de 2a02:2230::/32 si -2a02:2238::/32 de 2a02:2240::/32 fr 2a02:2248::/32 bg 2a02:2250::/32 de @@ -8309,7 +20228,6 @@ 2a02:2400::/32 nl 2a02:2408::/32 pl 2a02:2410::/32 at -2a02:2418::/32 ch 2a02:2420::/32 it 2a02:2428::/32 cz 2a02:2430::/32 pl @@ -8319,10 +20237,9 @@ 2a02:2450::/32 de 2a02:2458::/32 gb 2a02:2460::/32 tr -2a02:2468::/32 de +2a02:2468::/32 gb 2a02:2470::/32 no 2a02:2478::/32 de -2a02:2480::/32 de 2a02:2488::/32 de 2a02:2490::/32 se 2a02:2498::/32 gb @@ -8339,7 +20256,6 @@ 2a02:24f0::/32 ru 2a02:24f8::/32 se 2a02:2500::/32 nl -2a02:2508::/32 ru 2a02:2510::/32 ru 2a02:2518::/32 ru 2a02:2520::/32 ch @@ -8348,16 +20264,13 @@ 2a02:2538::/32 se 2a02:2540::/32 ua 2a02:2548::/32 ru -2a02:2550::/32 ru 2a02:2558::/32 jo 2a02:2560::/32 ru 2a02:2568::/32 ru -2a02:2570::/32 se 2a02:2578::/32 bh 2a02:2580::/32 se 2a02:2588::/32 cz 2a02:2590::/32 si -2a02:2598::/32 cz 2a02:25a0::/32 ru 2a02:25a8::/32 pl 2a02:25b0::/32 cz @@ -8397,7 +20310,6 @@ 2a02:26c0::/32 tr 2a02:26c8::/32 pt 2a02:26d0::/32 ps -2a02:26d8::/32 ru 2a02:26e0::/32 ru 2a02:26e8::/32 pl 2a02:26f0::/32 eu @@ -8413,7 +20325,6 @@ 2a02:2740::/32 es 2a02:2748::/32 ru 2a02:2750::/32 at -2a02:2758::/32 se 2a02:2760::/32 de 2a02:2768::/32 ru 2a02:2770::/32 nl @@ -8437,7 +20348,7 @@ 2a02:2800::/32 de 2a02:2808::/32 cz 2a02:2810::/32 es -2a02:2818::/32 eu +2a02:2818::/32 ua 2a02:2820::/32 ch 2a02:2828::/32 no 2a02:2830::/32 ru @@ -8470,12 +20381,11 @@ 2a02:2908::/32 om 2a02:2910::/32 ru 2a02:2918::/32 de -2a02:2920::/32 de 2a02:2928::/32 pl 2a02:2930::/32 cz 2a02:2938::/32 nl 2a02:2940::/32 de -2a02:2948::/32 eu +2a02:2948::/32 nl 2a02:2950::/32 hu 2a02:2958::/32 de 2a02:2960::/32 ir @@ -8488,8 +20398,7 @@ 2a02:2998::/32 gb 2a02:29a0::/32 it 2a02:29a8::/32 nl -2a02:29b0::/32 nl -2a02:29b8::/32 eu +2a02:29b8::/32 ch 2a02:29c0::/32 cz 2a02:29c8::/32 gb 2a02:29d0::/32 gb @@ -8513,8 +20422,8 @@ 2a02:2a60::/32 pt 2a02:2a68::/32 es 2a02:2a70::/32 gr -2a02:2a78::/32 eu -2a02:2a80::/32 eu +2a02:2a78::/32 nl +2a02:2a80::/32 nl 2a02:2a88::/32 pl 2a02:2a90::/32 ie 2a02:2a98::/32 hu @@ -8542,6 +20451,7 @@ 2a02:2b48::/32 no 2a02:2b50::/32 nl 2a02:2b58::/32 ir +2a02:2b60::/32 es 2a02:2b80::/32 de 2a02:2b88::/32 cz 2a02:2b90::/32 gb @@ -8550,140 +20460,534 @@ 2a02:2ba8::/32 gb 2a02:2bb0::/32 ie 2a02:2bb8::/32 gb +2a02:2bc0::/32 gb +2a02:2be0::/32 de 2a02:2c00::/32 no +2a02:2c40::/32 be +2a02:2c60::/32 de 2a02:2c80::/32 it +2a02:2ca0::/32 eu +2a02:2cc0::/32 es +2a02:2ce0::/32 it 2a02:2d00::/32 be +2a02:2d20::/32 fr +2a02:2d40::/32 de +2a02:2d60::/32 pl 2a02:2d80::/32 de +2a02:2da0::/32 gb +2a02:2dc0::/32 de +2a02:2de0::/32 pl 2a02:2e00::/32 es 2a02:2f00::/32 ro 2a02:2f80::/32 es +2a02:2fc0::/32 de +2a02:2fe0::/32 it 2a02:3000::/32 de 2a02:4000::/32 cz +2a02:4020::/32 se +2a02:4040::/32 gb +2a02:4060::/32 no 2a02:4080::/32 lb +2a02:40a0::/32 il +2a02:40c0::/32 nl +2a02:40e0::/32 cz 2a02:4100::/32 it +2a02:4120::/32 ru +2a02:4140::/32 at +2a02:4160::/32 pl 2a02:4180::/32 lb +2a02:41a0::/32 ru +2a02:41c0::/32 at +2a02:41e0::/32 il 2a02:4200::/32 fr +2a02:4220::/32 fr +2a02:4240::/32 nl +2a02:4260::/32 no 2a02:4280::/32 me +2a02:42a0::/32 fr +2a02:42c0::/32 gb +2a02:42e0::/32 ru 2a02:4300::/32 tr -2a02:4380::/32 ch -2a02:4400::/32 de +2a02:4320::/32 bg +2a02:4340::/32 gb +2a02:4360::/32 pl +2a02:4380::/32 az +2a02:43a0::/32 iq +2a02:43c0::/32 ru +2a02:43e0::/32 gb +2a02:4400::/32 kz +2a02:4420::/32 es +2a02:4440::/32 qa +2a02:4460::/32 ch 2a02:4480::/32 gb +2a02:44a0::/32 de +2a02:44c0::/32 it +2a02:44e0::/32 it 2a02:4500::/32 de -2a02:4580::/32 eu +2a02:4520::/32 sy +2a02:4540::/32 ir +2a02:4560::/32 gb +2a02:4580::/32 es +2a02:45a0::/32 ru +2a02:45c0::/32 de +2a02:45e0::/32 nl 2a02:4600::/32 nl +2a02:4620::/32 ch +2a02:4640::/32 nl +2a02:4660::/32 nl 2a02:4680::/32 ru +2a02:46a0::/32 pl +2a02:46c0::/32 es +2a02:46e0::/32 it 2a02:4700::/32 cz +2a02:4720::/32 it +2a02:4740::/32 it +2a02:4760::/32 ru 2a02:4780::/32 lt +2a02:47a0::/32 ru +2a02:47c0::/32 nl +2a02:47e0::/32 be 2a02:4800::/32 ro +2a02:4820::/32 fi +2a02:4840::/32 lv +2a02:4860::/32 it 2a02:4880::/32 fi +2a02:48a0::/32 nl +2a02:48c0::/32 eu +2a02:48e0::/32 de 2a02:4900::/32 gr +2a02:4940::/32 ie +2a02:4960::/32 es 2a02:4980::/32 nl +2a02:49a0::/32 pl +2a02:49c0::/32 gb +2a02:49e0::/32 de 2a02:4a00::/32 be -2a02:4a80::/32 ua +2a02:4a20::/32 de +2a02:4a40::/32 pl +2a02:4a60::/32 nl +2a02:4a80::/32 es +2a02:4aa0::/32 gb +2a02:4ac0::/32 es +2a02:4ae0::/32 it 2a02:4b00::/32 se +2a02:4b40::/32 gb +2a02:4b60::/32 nl 2a02:4b80::/32 de +2a02:4ba0::/32 bg +2a02:4bc0::/32 dk +2a02:4be0::/32 ua 2a02:4c00::/32 de +2a02:4c20::/32 gb +2a02:4c40::/32 gb 2a02:4c80::/32 pl +2a02:4ca0::/32 gb +2a02:4cc0::/32 de +2a02:4ce0::/32 it 2a02:4d00::/32 de +2a02:4d20::/32 it +2a02:4d40::/32 de +2a02:4d60::/32 iq 2a02:4d80::/32 it -2a02:4e00::/32 ru -2a02:4e80::/32 pt +2a02:4da0::/32 dk +2a02:4dc0::/32 bg +2a02:4de0::/32 dk +2a02:4e00::/32 cy +2a02:4e20::/32 it +2a02:4e40::/32 ua +2a02:4e60::/32 ir +2a02:4e80::/32 fr +2a02:4ea0::/32 at +2a02:4ec0::/32 it +2a02:4ee0::/32 it 2a02:4f00::/32 ie -2a02:4f80::/32 ch +2a02:4f20::/32 gb +2a02:4f40::/32 ru +2a02:4f60::/32 gb +2a02:4f80::/32 nl +2a02:4fa0::/32 is +2a02:4fc0::/32 gr +2a02:4fe0::/32 ch 2a02:5000::/32 fr +2a02:5020::/32 gb +2a02:5040::/32 gr +2a02:5060::/32 nl 2a02:5080::/32 il +2a02:50a0::/32 pl +2a02:50c0::/32 kz +2a02:50e0::/32 nl 2a02:5100::/32 es +2a02:5120::/32 se +2a02:5140::/32 gb +2a02:5160::/32 nl 2a02:5180::/32 ru +2a02:51a0::/32 it +2a02:51c0::/32 ru +2a02:51e0::/32 nl 2a02:5200::/32 ru +2a02:5220::/32 bg +2a02:5240::/32 ie +2a02:5260::/32 de 2a02:5280::/32 de +2a02:52a0::/32 it +2a02:52c0::/32 cz +2a02:52e0::/32 es 2a02:5300::/32 gb +2a02:5320::/32 mt +2a02:5340::/32 se +2a02:5360::/32 fr 2a02:5380::/32 ir +2a02:53a0::/32 fr +2a02:53c0::/32 cz +2a02:53e0::/32 it 2a02:5400::/32 gb +2a02:5420::/32 cz +2a02:5440::/32 gr +2a02:5460::/32 fr 2a02:5480::/32 cz +2a02:54a0::/32 it +2a02:54c0::/32 at +2a02:54e0::/32 pl 2a02:5500::/32 ru +2a02:5520::/32 fr +2a02:5540::/32 es +2a02:5560::/32 no 2a02:5580::/32 mk +2a02:55a0::/32 sa +2a02:55c0::/32 gb +2a02:55e0::/32 pl 2a02:5600::/32 ru +2a02:5620::/32 it +2a02:5640::/32 it +2a02:5660::/32 pl 2a02:5680::/32 gb +2a02:56a0::/32 fr +2a02:56c0::/32 gb +2a02:56e0::/32 gb +2a02:5700::/32 lb +2a02:5720::/32 mk +2a02:5740::/32 ee +2a02:5760::/32 nl 2a02:5780::/32 gb +2a02:57a0::/32 fr +2a02:57c0::/32 tr +2a02:57e0::/32 at 2a02:5800::/32 ru +2a02:5820::/32 fr +2a02:5840::/32 ru +2a02:5860::/32 gb 2a02:5880::/32 it +2a02:58a0::/32 se +2a02:58c0::/32 pl +2a02:58e0::/32 nl 2a02:5900::/32 ch +2a02:5920::/32 tr +2a02:5940::/32 be +2a02:5960::/32 am 2a02:5980::/32 ie -2a02:5a00::/32 cz +2a02:59a0::/32 gb +2a02:59c0::/32 ru +2a02:59e0::/32 ro +2a02:5a00::/32 es +2a02:5a20::/32 de +2a02:5a40::/32 fr +2a02:5a60::/32 ru 2a02:5a80::/32 de +2a02:5aa0::/32 nl +2a02:5ac0::/32 pl +2a02:5ae0::/32 fr 2a02:5b00::/32 es +2a02:5b20::/32 ie +2a02:5b40::/32 be +2a02:5b60::/32 jo 2a02:5b80::/32 sk +2a02:5ba0::/32 gb +2a02:5bc0::/32 es +2a02:5be0::/32 gb +2a02:5c00::/32 pl +2a02:5c20::/32 dk +2a02:5c40::/32 ru +2a02:5c60::/32 nl 2a02:5c80::/32 it +2a02:5ca0::/32 it +2a02:5cc0::/32 fr +2a02:5ce0::/32 gb 2a02:5d00::/32 cz +2a02:5d20::/32 pl +2a02:5d40::/32 es +2a02:5d60::/32 ru 2a02:5d80::/32 gb +2a02:5da0::/32 no +2a02:5dc0::/32 es +2a02:5de0::/32 fi 2a02:5e00::/32 ie +2a02:5e20::/32 ir +2a02:5e40::/32 gb +2a02:5e60::/32 it 2a02:5e80::/32 cz +2a02:5ea0::/32 es +2a02:5ec0::/32 nl +2a02:5ee0::/32 iq 2a02:5f00::/32 de +2a02:5f20::/32 tr +2a02:5f40::/32 hr +2a02:5f60::/32 de 2a02:5f80::/32 ru +2a02:5fa0::/32 fr +2a02:5fc0::/32 es +2a02:5fe0::/32 ru 2a02:6000::/32 it -2a02:6080::/32 ru +2a02:6020::/32 ba +2a02:6040::/32 ir +2a02:6060::/32 no +2a02:6080::/32 hu +2a02:60a0::/32 de +2a02:60c0::/32 gb +2a02:60e0::/32 fr 2a02:6100::/32 fr +2a02:6120::/32 it +2a02:6140::/32 ru +2a02:6160::/32 ru 2a02:6180::/32 at +2a02:61a0::/32 rs +2a02:61c0::/32 it +2a02:61e0::/32 at 2a02:6200::/32 ch +2a02:6240::/32 pl +2a02:6260::/32 ch 2a02:6280::/32 nl +2a02:62a0::/32 dk +2a02:62c0::/32 es +2a02:62e0::/32 fr 2a02:6300::/32 sk +2a02:6320::/32 hr +2a02:6340::/32 no +2a02:6360::/32 be 2a02:6380::/32 sk +2a02:63a0::/32 sk +2a02:63c0::/32 ru +2a02:63e0::/32 it 2a02:6400::/32 pl +2a02:6420::/32 no +2a02:6440::/32 ir +2a02:6460::/32 nl 2a02:6480::/32 es +2a02:64a0::/32 si +2a02:64c0::/32 gb +2a02:64e0::/32 ru 2a02:6500::/32 ch +2a02:6520::/32 es +2a02:6540::/32 gb +2a02:6560::/32 fr 2a02:6580::/32 ie -2a02:6600::/32 lt +2a02:65a0::/32 ru +2a02:65c0::/32 lb +2a02:65e0::/32 fr +2a02:6600::/32 no +2a02:6620::/32 ru +2a02:6640::/32 pl +2a02:6660::/32 ru 2a02:6680::/32 il +2a02:66a0::/32 cz +2a02:66c0::/32 gb +2a02:66e0::/32 pl 2a02:6700::/32 tr +2a02:6720::/32 sk +2a02:6740::/32 ch +2a02:6760::/32 dk 2a02:6780::/32 fr +2a02:67a0::/32 az +2a02:67c0::/32 sy +2a02:67e0::/32 be 2a02:6800::/32 bg +2a02:6820::/32 ro +2a02:6840::/32 fr +2a02:6860::/32 ru 2a02:6880::/32 ie +2a02:68a0::/32 ee +2a02:68c0::/32 fr +2a02:68e0::/32 fr 2a02:6900::/32 se +2a02:6920::/32 ru +2a02:6940::/32 dk +2a02:6960::/32 gb 2a02:6980::/32 se +2a02:69a0::/32 es +2a02:69c0::/32 ru +2a02:69e0::/32 de 2a02:6a00::/32 de +2a02:6a20::/32 gb +2a02:6a40::/32 it +2a02:6a60::/32 nl 2a02:6a80::/32 bg +2a02:6aa0::/32 de +2a02:6ac0::/32 gb +2a02:6ae0::/32 pl 2a02:6b00::/32 gb +2a02:6b20::/32 cz +2a02:6b40::/32 es +2a02:6b60::/32 gb 2a02:6b80::/32 is +2a02:6ba0::/32 ru +2a02:6bc0::/32 ru +2a02:6be0::/32 lt 2a02:6c00::/32 gb +2a02:6c20::/32 cz +2a02:6c40::/32 fr +2a02:6c60::/32 ua 2a02:6c80::/32 ru +2a02:6ca0::/32 sk +2a02:6cc0::/32 ru +2a02:6ce0::/32 it 2a02:6d00::/32 ru +2a02:6d20::/32 gb +2a02:6d40::/32 de +2a02:6d60::/32 sa 2a02:6d80::/32 ru -2a02:6e00::/32 ro -2a02:6e80::/32 fr +2a02:6da0::/32 gb +2a02:6dc0::/32 pl +2a02:6de0::/32 de +2a02:6e20::/32 de +2a02:6e40::/32 gb +2a02:6e60::/32 ru +2a02:6ea0::/32 gb +2a02:6ec0::/32 ir +2a02:6ee0::/32 pl 2a02:6f00::/32 lu +2a02:6f20::/32 de +2a02:6f40::/32 hu +2a02:6f60::/32 dk 2a02:6f80::/32 gb +2a02:6fa0::/32 fi +2a02:6fc0::/32 gb +2a02:6fe0::/32 de 2a02:7000::/32 si +2a02:7040::/32 at +2a02:7060::/32 de 2a02:7080::/32 gb +2a02:70a0::/32 lv +2a02:70c0::/32 lu +2a02:70e0::/32 cz 2a02:7100::/32 be -2a02:7180::/32 be +2a02:7120::/32 fr +2a02:7140::/32 gb +2a02:7160::/32 es +2a02:7180::/32 es +2a02:71a0::/32 de +2a02:71c0::/32 gb +2a02:71e0::/32 si 2a02:7200::/32 ru +2a02:7220::/32 nl +2a02:7240::/32 pl +2a02:7260::/32 im 2a02:7280::/32 gb +2a02:72a0::/32 de +2a02:72c0::/32 ch +2a02:72e0::/32 fr 2a02:7300::/32 kz +2a02:7320::/32 it +2a02:7340::/32 se +2a02:7360::/32 it 2a02:7380::/32 gb -2a02:7400::/32 it -2a02:7480::/32 ru +2a02:73a0::/32 dk +2a02:73c0::/32 gb +2a02:73e0::/32 fr +2a02:7400::/32 fr +2a02:7420::/32 ch +2a02:7440::/32 de +2a02:7460::/32 mq +2a02:7480::/32 es +2a02:74a0::/32 de +2a02:74c0::/32 ir +2a02:74e0::/32 gb 2a02:7500::/32 kw +2a02:7520::/32 de +2a02:7540::/32 ua +2a02:7560::/32 dk 2a02:7580::/32 gb +2a02:75a0::/32 es +2a02:75c0::/32 fr +2a02:75e0::/32 ru 2a02:7600::/32 fi +2a02:7620::/32 gb +2a02:7640::/32 ua +2a02:7660::/32 tr 2a02:7680::/32 fr +2a02:76a0::/32 cy +2a02:76c0::/32 ru +2a02:76e0::/32 de 2a02:7700::/32 gb +2a02:7720::/32 se +2a02:7740::/32 lb +2a02:7760::/32 ru 2a02:7780::/32 cy +2a02:77a0::/32 ru +2a02:77c0::/32 gb +2a02:77e0::/32 gb 2a02:7800::/32 ru +2a02:7820::/32 nl +2a02:7840::/32 nl +2a02:7860::/32 be 2a02:7880::/32 ru +2a02:78a0::/32 cz +2a02:78c0::/32 de +2a02:78e0::/32 gb 2a02:7900::/32 bg +2a02:7920::/32 fr +2a02:7940::/32 de +2a02:7960::/32 ru 2a02:7980::/32 ee +2a02:79a0::/32 mt +2a02:79c0::/32 tr +2a02:79e0::/32 fr 2a02:7a00::/32 cz +2a02:7a20::/32 gb +2a02:7a40::/32 ru +2a02:7a60::/32 ua 2a02:7a80::/32 se +2a02:7aa0::/32 lv +2a02:7ac0::/32 se +2a02:7ae0::/32 fr 2a02:7b00::/32 de +2a02:7b20::/32 fr +2a02:7b40::/32 lt +2a02:7b60::/32 kz 2a02:7b80::/32 ch +2a02:7ba0::/32 it +2a02:7bc0::/32 ru +2a02:7be0::/32 it 2a02:7c00::/32 dk +2a02:7c20::/32 nl +2a02:7c40::/32 de +2a02:7c60::/32 es 2a02:7c80::/32 es +2a02:7ca0::/32 ps +2a02:7cc0::/32 eu +2a02:7ce0::/32 es 2a02:7d00::/32 cz +2a02:7d20::/32 se +2a02:7d40::/32 no +2a02:7d60::/32 it 2a02:7d80::/32 tr -2a02:7e00::/32 es +2a02:7da0::/32 gb +2a02:7dc0::/32 ch +2a02:7de0::/32 gb +2a02:7e00::/32 de +2a02:7e20::/32 cz +2a02:7e40::/32 ru +2a02:7e60::/32 ch 2a02:7e80::/32 ru +2a02:7ea0::/32 se +2a02:7ee0::/32 de 2a02:7f00::/32 gb +2a02:7f20::/32 dk +2a02:7f40::/32 gb +2a02:7f60::/32 sm 2a02:7f80::/32 nl +2a02:7fa0::/32 fr +2a02:7fc0::/32 ru +2a02:7fe0::/32 is +2a02:8000::/32 de 2a02:8010::/32 gb 2a02:8020::/32 de 2a02:8040::/32 ru @@ -8691,9 +20995,11 @@ 2a02:8070::/32 de 2a02:8080::/32 ie 2a02:80c0::/32 nl +2a02:80e0::/32 bg 2a02:8100::/32 de 2a02:8200::/32 de 2a02:8300::/32 cz +2a02:8380::/32 at 2a02:8400::/32 fr 2a02:8800::/32 gb 2a02:9000::/32 es @@ -8702,512 +21008,5311 @@ 2a02:a300::/32 pl 2a02:a400::/32 nl 2a02:a800::/32 es +2a02:aa00::/32 ch +2a02:ab00::/32 sk +2a02:ab40::/32 ch +2a02:ab80::/32 hu +2a02:ac00::/32 gb +2a02:ac40::/32 nl +2a02:ac80::/32 tr +2a02:acc0::/32 de +2a02:ad00::/32 gb +2a02:ad40::/32 de +2a02:ad80::/32 es +2a02:adc0::/32 de +2a02:ae00::/32 lt +2a02:ae40::/32 ro +2a02:ae80::/32 no +2a02:aec0::/32 ru +2a02:af00::/32 be +2a02:af40::/32 gb +2a02:af80::/32 ch +2a02:afc0::/32 de +2a02:b000::/32 it +2a02:c000::/32 gb +2a02:c040::/32 jo +2a02:c080::/32 ua +2a02:c0c0::/32 ru +2a02:c100::/32 de +2a02:c140::/32 de +2a02:c180::/32 ch +2a02:c1c0::/32 gb +2a02:c200::/32 de +2a02:c240::/32 eu +2a02:c280::/32 cz +2a02:c2c0::/32 gb +2a02:c300::/32 it +2a02:c340::/32 no +2a02:c380::/32 ch +2a02:c390::/32 pl +2a02:c3a0::/32 ir +2a02:c3c0::/32 bh +2a02:c400::/32 bh +2a02:c440::/32 fr +2a02:c480::/32 ru +2a02:c4c0::/32 ch +2a02:c500::/32 gr +2a02:c540::/32 it +2a02:c580::/32 ir +2a02:c5c0::/32 fi +2a02:c600::/32 ch +2a02:c640::/32 hu +2a02:c680::/32 it +2a02:c690::/32 ad +2a02:c6a0::/32 de +2a02:c6c0::/32 gb +2a02:c700::/32 it +2a02:c740::/32 de +2a02:c780::/32 lv +2a02:c7c0::/32 it +2a02:c800::/32 fr +2a02:c840::/32 gb +2a02:c880::/32 nl +2a02:c8c0::/32 uz +2a02:c900::/32 dk +2a02:c940::/32 tr +2a02:c980::/32 ru +2a02:c9c0::/32 de +2a02:ca00::/32 de +2a02:ca40::/32 ru +2a02:ca80::/32 se +2a02:cac0::/32 ua +2a02:cb00::/32 tr +2a02:cb40::/32 de +2a02:cb80::/32 sa +2a02:cbc0::/32 mk +2a02:cbe0::/32 cz +2a02:cbf0::/32 de +2a02:cc00::/32 hu +2a02:cc40::/32 no +2a02:cc80::/32 ru +2a02:ccc0::/32 fr +2a02:cd00::/32 no +2a02:cd40::/32 ru +2a02:cd80::/32 ir +2a02:cdc0::/32 it +2a02:ce00::/32 gr +2a02:ce40::/32 gb +2a02:ce80::/32 de +2a02:cec0::/32 nl +2a02:cee0::/32 ie +2a02:cf00::/32 se +2a02:cf40::/32 dk +2a02:cf80::/32 il +2a02:cfc0::/32 fr +2a02:d000::/32 ch +2a02:d040::/32 se +2a02:d080::/32 bh +2a02:d0c0::/32 ru +2a02:d100::/32 pl +2a02:d140::/32 no +2a02:d180::/32 de +2a02:d1c0::/32 it +2a02:d200::/32 fi +2a02:d240::/32 by +2a02:d280::/32 cz +2a02:d2c0::/32 ir +2a02:d300::/32 ua +2a02:d340::/32 fr +2a02:d380::/32 ir +2a02:d3c0::/32 gb +2a02:d400::/32 hu +2a02:d440::/32 se +2a02:d480::/32 de +2a02:d4c0::/32 fi +2a02:d4e0::/32 de +2a02:d500::/32 nl +2a02:d540::/32 gb +2a02:d580::/32 fr +2a02:d5c0::/32 es +2a02:d600::/32 de +2a02:d640::/32 fr +2a02:d680::/32 gb +2a02:d6a0::/32 de +2a02:d6c0::/32 bg +2a02:d700::/32 de +2a02:d740::/32 ch +2a02:d780::/32 ir +2a02:d7c0::/32 fr +2a02:d800::/32 ro +2a02:d840::/32 ru +2a02:d8c0::/32 no +2a02:d900::/32 se +2a02:d940::/32 be +2a02:d980::/32 tr +2a02:d9c0::/32 tr +2a02:da00::/32 de +2a02:da40::/32 gb +2a02:da80::/32 at +2a02:dac0::/32 ru +2a02:db00::/32 de +2a02:db40::/32 ro +2a02:db80::/32 ru +2a02:dbc0::/32 ru +2a02:dc00::/32 ru +2a02:dc40::/32 tr +2a02:dc80::/32 ru +2a02:dcc0::/32 ua +2a02:dd00::/32 al +2a02:dd40::/32 gb +2a02:dd80::/32 se +2a02:ddc0::/32 ru +2a02:de00::/32 ru +2a02:de40::/32 il +2a02:de80::/32 ru +2a02:dec0::/32 lb +2a02:df00::/32 ir +2a02:df40::/32 tr +2a02:df80::/32 gb +2a02:dfc0::/32 ir +2a02:e000::/32 fr +2a02:e040::/32 nl +2a02:e080::/32 kw +2a02:e0c0::/32 ch +2a02:e100::/32 gb +2a02:e140::/32 pl +2a02:e180::/32 gb +2a02:e1c0::/32 nl +2a02:e200::/32 at +2a02:e220::/32 hr +2a02:e240::/32 de +2a02:e280::/32 ye +2a02:e2c0::/32 it +2a02:e300::/32 by +2a02:e340::/32 no +2a02:e380::/32 it +2a02:e3c0::/32 fr +2a02:e400::/32 se +2a02:e440::/32 de +2a02:e480::/32 ru +2a02:e4c0::/32 de +2a02:e500::/32 fr +2a02:e540::/32 rs +2a02:e580::/32 no +2a02:e5c0::/32 ru +2a02:e600::/32 gb +2a02:e620::/32 ru +2a02:e640::/32 fr +2a02:e680::/32 jo +2a02:e6c0::/32 gb +2a02:e700::/32 ly +2a02:e740::/32 de +2a02:e780::/32 tr +2a02:e7c0::/32 pl +2a02:e800::/32 de +2a02:e840::/32 ru +2a02:e880::/32 ru +2a02:e8c0::/32 gb +2a02:e900::/32 ie +2a02:e940::/32 it +2a02:e980::/32 il +2a02:e9c0::/32 se +2a02:ea00::/32 ae +2a02:ea40::/32 gb +2a02:ea80::/32 pl +2a02:eac0::/32 pl +2a02:eb00::/32 ru +2a02:eb40::/32 gb +2a02:eb80::/32 ru +2a02:ebc0::/32 fr +2a02:ec00::/32 fr +2a02:ec40::/32 ru +2a02:ec80::/32 nl +2a02:ecc0::/32 az +2a02:ed00::/32 no +2a02:ed40::/32 tr +2a02:ed80::/32 de +2a02:edc0::/32 sa +2a02:ee00::/32 ua +2a02:ee40::/32 ru +2a02:ee80::/32 nl +2a02:eec0::/32 se +2a02:ef00::/32 ru +2a02:ef40::/32 ru +2a02:ef80::/32 tr +2a02:efc0::/32 ru +2a02:f000::/32 cz +2a02:f040::/32 bh +2a02:f080::/32 ua +2a02:f0a0::/32 gb +2a02:f0c0::/32 jo +2a02:f100::/32 gb +2a02:f140::/32 de +2a02:f180::/32 fr +2a02:f1c0::/32 ua +2a02:f200::/32 de +2a02:f240::/32 ir +2a02:f280::/32 fr +2a02:f2c0::/32 ru +2a02:f300::/32 no +2a02:f340::/32 de +2a02:f380::/32 gb +2a02:f3c0::/32 pl +2a02:f400::/32 ae +2a02:f440::/32 gb +2a02:f480::/32 no +2a02:f4c0::/32 es +2a02:f500::/32 ru +2a02:f540::/32 gb +2a02:f560::/32 ru +2a02:f580::/32 am +2a02:f5c0::/32 nl +2a02:f600::/32 nl +2a02:f640::/32 nl +2a02:f680::/32 ru +2a02:f6c0::/32 ru +2a02:f700::/32 lb +2a02:f740::/32 pl +2a02:f780::/32 se +2a02:f7c0::/32 uz +2a02:f800::/32 ru +2a02:f840::/32 nl +2a02:f880::/32 de +2a02:f8c0::/32 pl +2a02:f900::/32 ir +2a02:f940::/32 hu +2a02:f980::/32 gb +2a02:f9c0::/32 gb +2a02:fa00::/32 sa +2a02:fa40::/32 tr +2a02:fa80::/32 gr +2a02:faa0::/32 de +2a02:fb00::/32 de +2a02:fb40::/32 gb +2a02:fb80::/32 it +2a02:fbc0::/32 pl +2a02:fc00::/32 se +2a02:fc40::/32 dk +2a02:fc80::/32 no +2a02:fcc0::/32 gb +2a02:fd00::/32 de +2a02:fd40::/32 it +2a02:fd80::/32 dk +2a02:fdc0::/32 at +2a02:fe00::/32 nl +2a02:fe40::/32 gb +2a02:fe80::/32 gb +2a02:fec0::/32 gb +2a02:ff00::/32 it +2a02:ff40::/32 im +2a02:ff80::/32 de +2a02:ffc0::/32 gi +2a03::/32 pt +2a03:20::/32 de +2a03:40::/32 de +2a03:60::/32 nl 2a03:80::/32 de -2a03:100::/32 lv +2a03:a0::/32 hr +2a03:c0::/32 dk +2a03:e0::/32 sk +2a03:100::/32 ir +2a03:120::/32 nl +2a03:140::/32 nl +2a03:160::/32 ch 2a03:180::/32 lu +2a03:1a0::/32 fr +2a03:1c0::/32 es +2a03:1e0::/32 pl 2a03:200::/32 ru +2a03:220::/32 ru +2a03:240::/32 fr 2a03:280::/32 lt -2a03:300::/32 gb +2a03:2a0::/32 ch +2a03:2c0::/32 bg +2a03:2e0::/32 cz +2a03:320::/32 il +2a03:340::/32 ru +2a03:360::/32 fr 2a03:380::/32 ch +2a03:3a0::/32 de +2a03:3c0::/32 tr +2a03:3e0::/32 rs 2a03:400::/32 tr +2a03:420::/32 ua +2a03:440::/32 es +2a03:460::/32 us 2a03:480::/32 gb +2a03:4a0::/32 no +2a03:4c0::/32 ie +2a03:4e0::/32 gb 2a03:500::/32 ru +2a03:520::/32 no +2a03:540::/32 uz +2a03:560::/32 de 2a03:580::/32 ch +2a03:5a0::/32 gb +2a03:5c0::/32 fr +2a03:5e0::/32 am 2a03:600::/32 ru +2a03:620::/32 rs +2a03:640::/32 it +2a03:660::/32 nl 2a03:680::/32 es +2a03:6a0::/32 lv +2a03:6c0::/32 ru +2a03:6e0::/32 sk 2a03:700::/32 ru +2a03:720::/32 ru +2a03:740::/32 fr +2a03:760::/32 fr 2a03:780::/32 se +2a03:7a0::/32 me +2a03:7c0::/32 ps +2a03:7e0::/32 nl 2a03:800::/32 fr +2a03:820::/32 it +2a03:840::/32 cz +2a03:860::/32 de 2a03:880::/32 fi +2a03:8a0::/32 se +2a03:8c0::/32 az +2a03:8e0::/32 ua 2a03:900::/32 se +2a03:920::/32 de +2a03:940::/32 at +2a03:960::/32 it 2a03:980::/32 il +2a03:9a0::/32 mt +2a03:9c0::/32 it +2a03:9e0::/32 hu 2a03:a00::/32 nl +2a03:a20::/32 it +2a03:a40::/32 pl +2a03:a60::/32 it 2a03:a80::/32 md +2a03:aa0::/32 ru +2a03:ac0::/32 ie +2a03:ae0::/32 ru 2a03:b00::/32 fr +2a03:b20::/32 eu +2a03:b40::/32 es +2a03:b60::/32 ru 2a03:b80::/32 fi +2a03:ba0::/32 fr +2a03:bc0::/32 gb 2a03:c00::/32 tr +2a03:c20::/32 cz +2a03:c40::/32 ps +2a03:c60::/32 it 2a03:c80::/32 fi +2a03:ca0::/32 cz +2a03:cc0::/32 ro +2a03:ce0::/32 ru 2a03:d00::/32 dk -2a03:d80::/32 it +2a03:d20::/32 ir +2a03:d40::/32 it +2a03:d60::/32 pl +2a03:d80::/32 ir +2a03:da0::/32 pt +2a03:dc0::/32 nl +2a03:de0::/32 be 2a03:e00::/32 cz +2a03:e20::/32 ru +2a03:e40::/32 gr +2a03:e60::/32 ru 2a03:e80::/32 fr +2a03:ea0::/32 ie +2a03:ec0::/32 ru +2a03:ee0::/32 de 2a03:f00::/32 de +2a03:f40::/32 ch +2a03:f60::/32 no 2a03:f80::/32 at +2a03:fc0::/32 de +2a03:fe0::/32 bg 2a03:1000::/32 at +2a03:1020::/32 uz +2a03:1040::/32 fr +2a03:1060::/32 it 2a03:1080::/32 am +2a03:10a0::/32 cz +2a03:10c0::/32 nl +2a03:10e0::/32 il 2a03:1100::/32 dk +2a03:1120::/32 gb +2a03:1140::/32 it +2a03:1160::/32 cz 2a03:1180::/32 cz +2a03:11a0::/32 om +2a03:11c0::/32 cz +2a03:11e0::/32 sa 2a03:1200::/32 es +2a03:1220::/32 se +2a03:1240::/32 ua +2a03:1260::/32 ru 2a03:1280::/32 pl +2a03:12a0::/32 se +2a03:12c0::/32 no +2a03:12e0::/32 ae 2a03:1300::/32 cy +2a03:1320::/32 tr +2a03:1340::/32 nl +2a03:1360::/32 ch 2a03:1380::/32 pl +2a03:13a0::/32 de +2a03:13c0::/32 ru +2a03:13e0::/32 ch 2a03:1400::/32 no +2a03:1420::/32 at +2a03:1440::/32 de +2a03:1460::/32 nl 2a03:1480::/32 de +2a03:14a0::/32 fr +2a03:14c0::/32 ru +2a03:14e0::/32 gb 2a03:1500::/32 dk +2a03:1520::/32 tr +2a03:1540::/32 de +2a03:1560::/32 rs 2a03:1580::/32 be +2a03:15a0::/32 hk +2a03:15c0::/32 gb +2a03:15e0::/32 be 2a03:1600::/32 cz +2a03:1620::/32 gb +2a03:1640::/32 ru +2a03:1660::/32 kw 2a03:1680::/32 it +2a03:16a0::/32 me +2a03:16c0::/32 fr +2a03:16e0::/32 de 2a03:1700::/32 it +2a03:1740::/32 ru +2a03:1760::/32 gb 2a03:1780::/32 fr +2a03:17a0::/32 gb +2a03:17c0::/32 ru +2a03:17e0::/32 ch 2a03:1800::/32 ru +2a03:1820::/32 de +2a03:1840::/32 cz +2a03:1860::/32 gb 2a03:1880::/32 ch +2a03:18a0::/32 ru +2a03:18c0::/32 de +2a03:18e0::/32 fr 2a03:1900::/32 am +2a03:1920::/32 it +2a03:1940::/32 gb +2a03:1960::/32 lt 2a03:1980::/32 be +2a03:19a0::/32 ch +2a03:19c0::/32 dk +2a03:19e0::/32 es 2a03:1a00::/32 nl +2a03:1a20::/32 be +2a03:1a40::/32 de +2a03:1a60::/32 fr 2a03:1a80::/32 at +2a03:1aa0::/32 ca +2a03:1ac0::/32 ru +2a03:1ae0::/32 fr 2a03:1b00::/32 ru +2a03:1b20::/32 se +2a03:1b40::/32 rs +2a03:1b60::/32 gb 2a03:1b80::/32 gb +2a03:1ba0::/32 gb +2a03:1bc0::/32 fr +2a03:1be0::/32 gb 2a03:1c00::/32 bh +2a03:1c20::/32 se +2a03:1c40::/32 es +2a03:1c60::/32 se 2a03:1c80::/32 nl +2a03:1ca0::/32 no +2a03:1cc0::/32 es +2a03:1ce0::/32 se 2a03:1d00::/32 fr +2a03:1d20::/32 es +2a03:1d40::/32 gb +2a03:1d60::/32 de 2a03:1d80::/32 sk +2a03:1da0::/32 de +2a03:1dc0::/32 fr +2a03:1de0::/32 ru 2a03:1e00::/32 de +2a03:1e20::/32 cz +2a03:1e40::/32 se +2a03:1e60::/32 fr 2a03:1e80::/32 de +2a03:1ea0::/32 gb +2a03:1ec0::/32 bg +2a03:1ee0::/32 ru 2a03:1f00::/32 pl +2a03:1f20::/32 gb +2a03:1f40::/32 ie +2a03:1f60::/32 at 2a03:1f80::/32 cz +2a03:1fa0::/32 gb +2a03:1fc0::/32 us +2a03:1fe0::/32 fr 2a03:2000::/32 gb +2a03:2020::/32 nl +2a03:2040::/32 ch +2a03:2060::/32 ch 2a03:2080::/32 nl +2a03:20a0::/32 gb +2a03:20e0::/32 no 2a03:2100::/32 tr +2a03:2120::/32 ch +2a03:2140::/32 ru +2a03:2160::/32 de 2a03:2180::/32 dk +2a03:21a0::/32 gb +2a03:21c0::/32 ru +2a03:21e0::/32 de 2a03:2200::/32 be -2a03:2280::/32 gb +2a03:2220::/32 dk +2a03:2240::/32 ie +2a03:2260::/32 de +2a03:2280::/32 nl +2a03:22a0::/32 de +2a03:22c0::/32 pl +2a03:22e0::/32 nl 2a03:2300::/32 am +2a03:2320::/32 cz +2a03:2340::/32 it +2a03:2360::/32 ru 2a03:2380::/32 de +2a03:23a0::/32 es +2a03:23c0::/32 hr +2a03:23e0::/32 tr 2a03:2400::/32 de +2a03:2420::/32 nl +2a03:2440::/32 fr +2a03:2460::/32 es 2a03:2480::/32 ru +2a03:24a0::/32 lt +2a03:24c0::/32 pl +2a03:24e0::/32 ch 2a03:2500::/32 de +2a03:2520::/32 se +2a03:2540::/32 de +2a03:2560::/32 mk 2a03:2580::/32 gb +2a03:25a0::/32 no +2a03:25c0::/32 fr +2a03:25e0::/32 gb 2a03:2600::/32 ch +2a03:2620::/32 tr +2a03:2640::/32 fr +2a03:2660::/32 rs 2a03:2680::/32 fr +2a03:26a0::/32 es +2a03:26c0::/32 ru +2a03:26e0::/32 ru 2a03:2700::/32 it +2a03:2720::/32 de +2a03:2740::/32 dk +2a03:2760::/32 sk 2a03:2780::/32 se +2a03:27a0::/32 nl +2a03:27c0::/32 am +2a03:27e0::/32 cy 2a03:2800::/32 gb +2a03:2820::/32 ge +2a03:2840::/32 us +2a03:2860::/32 ru 2a03:2880::/32 ie +2a03:28a0::/32 nl +2a03:28c0::/32 tr +2a03:28e0::/32 se 2a03:2900::/32 de +2a03:2920::/32 me +2a03:2940::/32 ps +2a03:2960::/32 ch 2a03:2980::/32 ru +2a03:29a0::/32 ru +2a03:29c0::/32 ee +2a03:29e0::/32 ru 2a03:2a00::/32 de +2a03:2a20::/32 pl +2a03:2a40::/32 lb +2a03:2a60::/32 cz 2a03:2a80::/32 cz +2a03:2aa0::/32 ae +2a03:2ac0::/32 gb +2a03:2ae0::/32 be 2a03:2b00::/32 it +2a03:2b20::/32 de +2a03:2b40::/32 ru +2a03:2b60::/32 ru 2a03:2b80::/32 cz +2a03:2ba0::/32 lu +2a03:2bc0::/32 ru +2a03:2be0::/32 fr 2a03:2c00::/32 ru +2a03:2c20::/32 gb +2a03:2c40::/32 fr +2a03:2c60::/32 nl 2a03:2c80::/32 gb +2a03:2ca0::/32 nl +2a03:2cc0::/32 de +2a03:2ce0::/32 es 2a03:2d00::/32 gb +2a03:2d20::/32 gb +2a03:2d40::/32 ru +2a03:2d60::/32 fr 2a03:2d80::/32 de +2a03:2da0::/32 nl +2a03:2dc0::/32 ir +2a03:2de0::/32 al 2a03:2e00::/32 es +2a03:2e20::/32 lv +2a03:2e40::/32 gb +2a03:2e60::/32 nl +2a03:2e80::/32 nl +2a03:2ea0::/32 gb +2a03:2ec0::/32 fr +2a03:2ee0::/32 fr 2a03:2f00::/32 lu +2a03:2f20::/32 ir +2a03:2f40::/32 at +2a03:2f60::/32 hu 2a03:2f80::/32 se +2a03:2fa0::/32 nl +2a03:2fc0::/32 fr +2a03:2fe0::/32 ru 2a03:3000::/32 by -2a03:3080::/32 nl +2a03:3020::/32 gb +2a03:3040::/32 dk +2a03:3060::/32 nl +2a03:3080::/32 dk +2a03:30a0::/32 fi +2a03:30c0::/32 es +2a03:30e0::/32 ge 2a03:3100::/32 ru +2a03:3120::/32 es +2a03:3140::/32 tr +2a03:3160::/32 at 2a03:3180::/32 at +2a03:31a0::/32 gb +2a03:31c0::/32 be +2a03:31e0::/32 cz 2a03:3200::/32 ru +2a03:3220::/32 fi +2a03:3240::/32 uz +2a03:3260::/32 no 2a03:3280::/32 fr +2a03:32a0::/32 de +2a03:32c0::/32 kz +2a03:32e0::/32 ro 2a03:3300::/32 nl +2a03:3320::/32 ba +2a03:3340::/32 pl +2a03:3360::/32 fr 2a03:3380::/32 hu +2a03:33a0::/32 ru +2a03:33c0::/32 gb +2a03:33e0::/32 al 2a03:3400::/32 nl +2a03:3420::/32 li +2a03:3440::/32 lv +2a03:3460::/32 cz 2a03:3480::/32 ru +2a03:34a0::/32 gb +2a03:34c0::/32 gb +2a03:34e0::/32 ru 2a03:3500::/32 de +2a03:3520::/32 tr +2a03:3540::/32 fr 2a03:3580::/32 ge +2a03:35a0::/32 it +2a03:35c0::/32 de +2a03:35e0::/32 tr 2a03:3600::/32 be +2a03:3620::/32 nl +2a03:3640::/32 gb +2a03:3660::/32 es 2a03:3680::/32 de +2a03:36a0::/32 de +2a03:36c0::/32 ch +2a03:36e0::/32 gb 2a03:3700::/32 ru +2a03:3720::/32 il +2a03:3740::/32 nl +2a03:3760::/32 cz +2a03:3780::/32 nl +2a03:37a0::/32 it +2a03:37c0::/32 fr +2a03:37e0::/32 gb 2a03:3800::/32 pl +2a03:3820::/32 gb +2a03:3840::/32 cz 2a03:3880::/32 it +2a03:38a0::/32 nl +2a03:38c0::/32 ie +2a03:38e0::/32 lu 2a03:3900::/32 es +2a03:3920::/32 ru +2a03:3940::/32 de +2a03:3960::/32 de 2a03:3980::/32 by +2a03:39a0::/32 at +2a03:39c0::/32 fr +2a03:39e0::/32 hr 2a03:3a00::/32 cz +2a03:3a20::/32 ae +2a03:3a40::/32 gb +2a03:3a60::/32 nl 2a03:3a80::/32 ru +2a03:3aa0::/32 al +2a03:3ac0::/32 cz +2a03:3ae0::/32 ru 2a03:3b00::/32 nl +2a03:3b20::/32 cy +2a03:3b40::/32 cz +2a03:3b60::/32 ir 2a03:3b80::/32 dk +2a03:3ba0::/32 es +2a03:3bc0::/32 se +2a03:3be0::/32 es 2a03:3c00::/32 nl +2a03:3c20::/32 fr +2a03:3c40::/32 es +2a03:3c60::/32 es 2a03:3c80::/32 gb +2a03:3ca0::/32 de +2a03:3cc0::/32 ru 2a03:3d00::/32 am +2a03:3d20::/32 es +2a03:3d40::/32 ru +2a03:3d60::/32 es 2a03:3d80::/32 it +2a03:3da0::/32 hu +2a03:3dc0::/32 ru +2a03:3de0::/32 it 2a03:3e00::/32 de +2a03:3e40::/32 ru +2a03:3e60::/32 fr 2a03:3e80::/32 de +2a03:3ea0::/32 gb +2a03:3ec0::/32 gb +2a03:3ee0::/32 jo 2a03:3f00::/32 tr +2a03:3f20::/32 nl +2a03:3f40::/32 nl +2a03:3f60::/32 pt 2a03:3f80::/32 ru +2a03:3fa0::/32 dk +2a03:3fc0::/32 de +2a03:3fe0::/32 nl 2a03:4000::/32 de +2a03:4020::/32 gb +2a03:4040::/32 ru +2a03:4060::/32 ch 2a03:4080::/32 de +2a03:40a0::/32 ru +2a03:40c0::/32 se +2a03:40e0::/32 de 2a03:4100::/32 ro -2a03:4180::/32 dk +2a03:4140::/32 ru +2a03:4160::/32 gb +2a03:4180::/32 nl +2a03:41a0::/32 gb +2a03:41c0::/32 gb +2a03:41e0::/32 nl 2a03:4200::/32 gb +2a03:4220::/32 cz +2a03:4240::/32 de +2a03:4260::/32 cz 2a03:4280::/32 hr +2a03:42a0::/32 cz +2a03:42c0::/32 fr +2a03:42e0::/32 nl 2a03:4300::/32 gb +2a03:4340::/32 de +2a03:4360::/32 ee 2a03:4380::/32 ch +2a03:43a0::/32 cz +2a03:43c0::/32 no +2a03:43e0::/32 li 2a03:4400::/32 it +2a03:4420::/32 ch +2a03:4440::/32 se +2a03:4460::/32 es 2a03:4480::/32 az +2a03:44a0::/32 es +2a03:44c0::/32 hu +2a03:44e0::/32 es 2a03:4500::/32 gb +2a03:4520::/32 ge +2a03:4540::/32 it +2a03:4560::/32 it 2a03:4580::/32 it +2a03:45a0::/32 ru +2a03:45c0::/32 es +2a03:45e0::/32 ge 2a03:4600::/32 fr +2a03:4620::/32 pl +2a03:4640::/32 gb +2a03:4660::/32 ir 2a03:4680::/32 ir +2a03:46a0::/32 bg +2a03:46c0::/32 dk +2a03:46e0::/32 uz 2a03:4700::/32 ru +2a03:4720::/32 ch +2a03:4740::/32 nl +2a03:4760::/32 cz 2a03:4780::/32 kw +2a03:47a0::/32 sk +2a03:47c0::/32 iq 2a03:4800::/32 nl +2a03:4820::/32 ge +2a03:4840::/32 al 2a03:4880::/32 ru +2a03:48a0::/32 fr +2a03:48c0::/32 tr +2a03:48e0::/32 gb 2a03:4900::/32 ru +2a03:4920::/32 de +2a03:4940::/32 dk +2a03:4960::/32 rs 2a03:4980::/32 fr -2a03:4a00::/32 ru +2a03:49a0::/32 fr +2a03:49c0::/32 ir +2a03:49e0::/32 ch +2a03:4a00::/32 gb +2a03:4a20::/32 de +2a03:4a40::/32 it +2a03:4a60::/32 sa 2a03:4a80::/32 nl +2a03:4aa0::/32 nl +2a03:4ac0::/32 kz +2a03:4ae0::/32 ch 2a03:4b00::/32 pl -2a03:4b80::/32 eu +2a03:4b20::/32 de +2a03:4b40::/32 iq +2a03:4b60::/32 lb +2a03:4b80::/32 al +2a03:4ba0::/32 bg +2a03:4bc0::/32 se +2a03:4be0::/32 dk 2a03:4c00::/32 fr +2a03:4c40::/32 at +2a03:4c60::/32 gb 2a03:4c80::/32 li +2a03:4ca0::/32 hu +2a03:4cc0::/32 gb +2a03:4ce0::/32 fr 2a03:4d00::/32 ru +2a03:4d20::/32 fi +2a03:4d40::/32 de +2a03:4d60::/32 nl 2a03:4d80::/32 gb +2a03:4da0::/32 ru +2a03:4dc0::/32 de +2a03:4de0::/32 fr 2a03:4e00::/32 es +2a03:4e20::/32 nl +2a03:4e40::/32 at +2a03:4e60::/32 cz 2a03:4e80::/32 ge +2a03:4ea0::/32 gb +2a03:4ec0::/32 ru +2a03:4ee0::/32 it 2a03:4f00::/32 nl +2a03:4f20::/32 se +2a03:4f40::/32 de +2a03:4f60::/32 nl 2a03:4f80::/32 nl +2a03:4fa0::/32 tr +2a03:4fc0::/32 ru +2a03:4fe0::/32 de 2a03:5000::/32 de +2a03:5020::/32 de +2a03:5040::/32 ru +2a03:5060::/32 ru 2a03:5080::/32 de +2a03:50a0::/32 fi +2a03:50c0::/32 gi +2a03:50e0::/32 mt 2a03:5100::/32 ch +2a03:5120::/32 ch +2a03:5140::/32 gb +2a03:5160::/32 tr 2a03:5180::/32 ro +2a03:51a0::/32 ru +2a03:51c0::/32 es +2a03:51e0::/32 ru 2a03:5200::/32 ru +2a03:5220::/32 gr +2a03:5240::/32 ru +2a03:5260::/32 li 2a03:5280::/32 at +2a03:52a0::/32 de +2a03:52c0::/32 ru +2a03:52e0::/32 it 2a03:5300::/32 it +2a03:5340::/32 fr +2a03:5360::/32 li 2a03:5380::/32 nl +2a03:53a0::/32 ch +2a03:53c0::/32 dk +2a03:53e0::/32 ua 2a03:5400::/32 be +2a03:5420::/32 gb +2a03:5440::/32 dk +2a03:5460::/32 gb 2a03:5480::/32 li +2a03:54a0::/32 ir +2a03:54c0::/32 gb +2a03:54e0::/32 at 2a03:5500::/32 nl +2a03:5520::/32 ch +2a03:5540::/32 de +2a03:5560::/32 es 2a03:5580::/32 no +2a03:55c0::/32 cz +2a03:55e0::/32 ir 2a03:5600::/32 ru +2a03:5620::/32 am +2a03:5640::/32 lu +2a03:5660::/32 ru 2a03:5680::/32 de +2a03:56a0::/32 cz +2a03:56c0::/32 fr +2a03:56e0::/32 bg 2a03:5700::/32 nl +2a03:5720::/32 gb +2a03:5740::/32 it +2a03:5760::/32 fr 2a03:5780::/32 kw +2a03:57a0::/32 ru +2a03:57c0::/32 ir +2a03:57e0::/32 de 2a03:5800::/32 ru -2a03:5880::/32 eu +2a03:5820::/32 ee +2a03:5840::/32 fr +2a03:5860::/32 pl +2a03:5880::/32 ee +2a03:58a0::/32 nl +2a03:58c0::/32 ru +2a03:58e0::/32 pl 2a03:5900::/32 lb +2a03:5940::/32 es +2a03:5960::/32 fr 2a03:5980::/32 fr +2a03:59a0::/32 se +2a03:59c0::/32 nl +2a03:59e0::/32 ch 2a03:5a00::/32 ru +2a03:5a40::/32 fr +2a03:5a60::/32 ru 2a03:5a80::/32 ru -2a03:5b00::/32 tr +2a03:5aa0::/32 es +2a03:5ac0::/32 ch +2a03:5ae0::/32 hu +2a03:5b20::/32 re +2a03:5b40::/32 gb +2a03:5b60::/32 nl 2a03:5b80::/32 ru +2a03:5ba0::/32 nl +2a03:5bc0::/32 gb +2a03:5be0::/32 by 2a03:5c00::/32 it +2a03:5c20::/32 es +2a03:5c40::/32 de +2a03:5c60::/32 de 2a03:5c80::/32 ru +2a03:5ca0::/32 ru +2a03:5cc0::/32 is +2a03:5ce0::/32 bg 2a03:5d00::/32 tr +2a03:5d40::/32 fr +2a03:5d60::/32 gb 2a03:5d80::/32 nl -2a03:5e00::/32 by +2a03:5da0::/32 gr +2a03:5dc0::/32 ua +2a03:5de0::/32 ch +2a03:5e00::/32 se +2a03:5e20::/32 ch +2a03:5e40::/32 cz +2a03:5e60::/32 es 2a03:5e80::/32 ro +2a03:5ea0::/32 ru +2a03:5ec0::/32 pl +2a03:5ee0::/32 de 2a03:5f00::/32 ie +2a03:5f20::/32 nl +2a03:5f40::/32 eu +2a03:5f60::/32 hu 2a03:5f80::/32 ru +2a03:5fa0::/32 nl +2a03:5fc0::/32 fi +2a03:5fe0::/32 rs 2a03:6000::/32 nl +2a03:6020::/32 az +2a03:6040::/32 gb +2a03:6060::/32 gb 2a03:6080::/32 ru +2a03:60c0::/32 nl +2a03:60e0::/32 ru 2a03:6100::/32 hr +2a03:6120::/32 ua +2a03:6140::/32 ru +2a03:6160::/32 az 2a03:6180::/32 no +2a03:61c0::/32 gb +2a03:61e0::/32 es 2a03:6200::/32 ru +2a03:6220::/32 hr +2a03:6240::/32 no +2a03:6260::/32 fr +2a03:6280::/32 es +2a03:62a0::/32 au +2a03:62c0::/32 es +2a03:62e0::/32 de 2a03:6300::/32 ua +2a03:6320::/32 es +2a03:6340::/32 kz +2a03:6360::/32 fr 2a03:6380::/32 sk -2a03:6400::/32 eu +2a03:63a0::/32 se +2a03:63c0::/32 de +2a03:63e0::/32 pl +2a03:6400::/32 gb +2a03:6420::/32 pt +2a03:6440::/32 gb +2a03:6460::/32 nl 2a03:6480::/32 es +2a03:64a0::/32 es +2a03:64c0::/32 ua +2a03:64e0::/32 lb 2a03:6500::/32 ru +2a03:6520::/32 es +2a03:6540::/32 ua +2a03:6560::/32 fr 2a03:6580::/32 gb +2a03:65a0::/32 es +2a03:65c0::/32 nl +2a03:65e0::/32 at 2a03:6600::/32 pl +2a03:6620::/32 it +2a03:6640::/32 ch +2a03:6660::/32 ru 2a03:6680::/32 ir +2a03:66a0::/32 de +2a03:66c0::/32 ru +2a03:66e0::/32 dk 2a03:6700::/32 kw +2a03:6740::/32 lv +2a03:6760::/32 de 2a03:6780::/32 no +2a03:67a0::/32 es +2a03:67c0::/32 gb +2a03:67e0::/32 lt 2a03:6800::/32 it +2a03:6820::/32 nl +2a03:6840::/32 fr +2a03:6860::/32 be 2a03:6880::/32 de +2a03:68a0::/32 be +2a03:68c0::/32 cy +2a03:68e0::/32 fr 2a03:6900::/32 lb +2a03:6920::/32 cz +2a03:6940::/32 de +2a03:6960::/32 dk 2a03:6980::/32 nl +2a03:69a0::/32 ru +2a03:69c0::/32 fr +2a03:69e0::/32 ua 2a03:6a00::/32 gb +2a03:6a40::/32 ru +2a03:6a60::/32 gb 2a03:6a80::/32 fr +2a03:6aa0::/32 no +2a03:6ac0::/32 iq +2a03:6ae0::/32 ir 2a03:6b00::/32 jo +2a03:6b20::/32 de +2a03:6b40::/32 fr +2a03:6b60::/32 pl 2a03:6b80::/32 se +2a03:6ba0::/32 de +2a03:6bc0::/32 re +2a03:6be0::/32 pl 2a03:6c00::/32 fr +2a03:6c20::/32 de +2a03:6c40::/32 tr +2a03:6c60::/32 gb 2a03:6c80::/32 fr +2a03:6ca0::/32 es +2a03:6cc0::/32 it +2a03:6ce0::/32 gb 2a03:6d00::/32 jo +2a03:6d20::/32 fr +2a03:6d40::/32 fr +2a03:6d60::/32 ir 2a03:6d80::/32 be +2a03:6da0::/32 ir +2a03:6dc0::/32 iq +2a03:6de0::/32 fr 2a03:6e00::/32 nl +2a03:6e20::/32 es +2a03:6e40::/32 fr +2a03:6e60::/32 ie 2a03:6e80::/32 cz +2a03:6ea0::/32 ru +2a03:6ec0::/32 hu +2a03:6ee0::/32 de 2a03:6f00::/32 ru +2a03:6f20::/32 se +2a03:6f40::/32 fi +2a03:6f60::/32 be 2a03:6f80::/32 fr +2a03:6fc0::/32 gb +2a03:6fe0::/32 ro 2a03:7000::/32 nl +2a03:7020::/32 iq +2a03:7040::/32 gb +2a03:7060::/32 lb 2a03:7080::/32 se +2a03:70a0::/32 fi +2a03:70c0::/32 ru +2a03:70e0::/32 de 2a03:7100::/32 ie +2a03:7120::/32 es +2a03:7140::/32 es +2a03:7160::/32 ba 2a03:7180::/32 gr +2a03:71a0::/32 ua +2a03:71c0::/32 cz +2a03:71e0::/32 nl 2a03:7200::/32 ru +2a03:7220::/32 fr +2a03:7240::/32 cz +2a03:7260::/32 es 2a03:7280::/32 fr +2a03:72a0::/32 ch +2a03:72c0::/32 gb +2a03:72e0::/32 gb 2a03:7300::/32 fr +2a03:7320::/32 ru +2a03:7340::/32 de +2a03:7360::/32 se 2a03:7380::/32 ua +2a03:73a0::/32 nl +2a03:73c0::/32 pt +2a03:73e0::/32 ru 2a03:7400::/32 dk +2a03:7420::/32 ro +2a03:7440::/32 it +2a03:7460::/32 cz 2a03:7480::/32 es +2a03:74a0::/32 ir +2a03:74c0::/32 fr +2a03:74e0::/32 is 2a03:7500::/32 de +2a03:7520::/32 ch +2a03:7540::/32 ru +2a03:7560::/32 ps 2a03:7580::/32 pl -2a03:7600::/32 ir +2a03:75a0::/32 ch +2a03:75c0::/32 fr +2a03:75e0::/32 mt +2a03:7600::/32 gb +2a03:7620::/32 ru +2a03:7640::/32 it +2a03:7660::/32 at 2a03:7680::/32 es +2a03:76a0::/32 gb +2a03:76c0::/32 gb +2a03:76e0::/32 cz 2a03:7700::/32 de +2a03:7720::/32 ua +2a03:7740::/32 az +2a03:7760::/32 tr 2a03:7780::/32 fr +2a03:77a0::/32 fr +2a03:77c0::/32 sa +2a03:77e0::/32 gb 2a03:7800::/32 fi +2a03:7820::/32 lv +2a03:7840::/32 de +2a03:7860::/32 be 2a03:7880::/32 de +2a03:78a0::/32 at +2a03:78c0::/32 cz +2a03:78e0::/32 fr 2a03:7900::/32 nl +2a03:7920::/32 lb +2a03:7940::/32 pl +2a03:7960::/32 de +2a03:7980::/32 nl +2a03:79a0::/32 ru +2a03:79c0::/32 ru +2a03:79e0::/32 nl 2a03:7a00::/32 cz +2a03:7a20::/32 nl +2a03:7a40::/32 de +2a03:7a60::/32 nl 2a03:7a80::/32 lv +2a03:7aa0::/32 im +2a03:7ac0::/32 ad +2a03:7ae0::/32 de 2a03:7b00::/32 tr +2a03:7b20::/32 kz +2a03:7b40::/32 nl +2a03:7b60::/32 il 2a03:7b80::/32 fi +2a03:7ba0::/32 cz +2a03:7bc0::/32 de +2a03:7be0::/32 pl 2a03:7c00::/32 fi +2a03:7c20::/32 ru +2a03:7c40::/32 de +2a03:7c60::/32 ee 2a03:7c80::/32 se +2a03:7ca0::/32 ru +2a03:7cc0::/32 de +2a03:7ce0::/32 es 2a03:7d00::/32 de +2a03:7d20::/32 tr +2a03:7d40::/32 ie +2a03:7d60::/32 iq +2a03:7d80::/32 ru +2a03:7da0::/32 ru +2a03:7dc0::/32 ru +2a03:7de0::/32 be 2a03:7e00::/32 gb +2a03:7e20::/32 nl +2a03:7e40::/32 it +2a03:7e60::/32 ps 2a03:7e80::/32 gb +2a03:7ea0::/32 ch +2a03:7ec0::/32 se +2a03:7ee0::/32 ir 2a03:7f00::/32 ru +2a03:7f20::/32 se +2a03:7f40::/32 bg +2a03:7f60::/32 ru 2a03:7f80::/32 gb +2a03:7fa0::/32 fr +2a03:7fc0::/32 fr +2a03:7fe0::/32 it 2a03:8000::/32 no +2a03:8020::/32 it +2a03:8040::/32 es +2a03:8060::/32 ru 2a03:8080::/32 ru +2a03:80a0::/32 nl +2a03:80c0::/32 ru +2a03:80e0::/32 gb 2a03:8100::/32 nl +2a03:8120::/32 no +2a03:8140::/32 gb +2a03:8160::/32 us 2a03:8180::/32 nl +2a03:81a0::/32 es +2a03:81c0::/32 gb +2a03:81e0::/32 tr 2a03:8200::/32 gb +2a03:8220::/32 no +2a03:8240::/32 tr +2a03:8260::/32 ie 2a03:8280::/32 ru -2a03:8300::/32 tr +2a03:82a0::/32 at +2a03:82c0::/32 bg +2a03:82e0::/32 nl +2a03:8300::/32 nl +2a03:8320::/32 cz +2a03:8340::/32 bg +2a03:8360::/32 fr 2a03:8380::/32 ch +2a03:83a0::/32 gb +2a03:83c0::/32 bg +2a03:83e0::/32 gb 2a03:8400::/32 ru +2a03:8420::/32 fr +2a03:8440::/32 ru +2a03:8460::/32 de 2a03:8480::/32 al +2a03:84a0::/32 de +2a03:84c0::/32 ru +2a03:84e0::/32 pt 2a03:8500::/32 ua +2a03:8520::/32 gb +2a03:8540::/32 ch +2a03:8560::/32 be 2a03:8580::/32 se +2a03:85a0::/32 tr +2a03:85c0::/32 de +2a03:85e0::/32 es 2a03:8600::/32 se +2a03:8620::/32 ch +2a03:8640::/32 ru +2a03:8660::/32 it 2a03:8680::/32 gb +2a03:86a0::/32 gb +2a03:86c0::/32 es +2a03:86e0::/32 it 2a03:8700::/32 ru +2a03:8720::/32 dk +2a03:8740::/32 ru +2a03:8760::/32 lb 2a03:8780::/32 ch +2a03:87a0::/32 ps +2a03:87c0::/32 rs +2a03:87e0::/32 gb 2a03:8800::/32 ro +2a03:8820::/32 mt +2a03:8840::/32 gb +2a03:8860::/32 de 2a03:8880::/32 pl +2a03:88a0::/32 gb +2a03:88c0::/32 nl +2a03:88e0::/32 gb 2a03:8900::/32 ie +2a03:8920::/32 gb +2a03:8940::/32 nl +2a03:8960::/32 ba 2a03:8980::/32 it -2a03:8a00::/32 eu +2a03:89a0::/32 sk +2a03:89c0::/32 de +2a03:89e0::/32 fr +2a03:8a00::/32 gb +2a03:8a20::/32 gb +2a03:8a40::/32 de +2a03:8a60::/32 nl 2a03:8a80::/32 at +2a03:8aa0::/32 es +2a03:8ac0::/32 us +2a03:8ae0::/32 de 2a03:8b00::/32 sm +2a03:8b20::/32 gb +2a03:8b40::/32 nl +2a03:8b60::/32 sy 2a03:8b80::/32 nl +2a03:8ba0::/32 it +2a03:8bc0::/32 pt +2a03:8be0::/32 it 2a03:8c00::/32 gb +2a03:8c20::/32 fi +2a03:8c40::/32 tr +2a03:8c60::/32 hu 2a03:8c80::/32 it -2a03:8d00::/32 ru +2a03:8cc0::/32 gb +2a03:8ce0::/32 ru +2a03:8d00::/32 gb +2a03:8d20::/32 at +2a03:8d40::/32 ch +2a03:8d60::/32 si +2a03:8d80::/32 fr +2a03:8da0::/32 cz +2a03:8dc0::/32 de +2a03:8de0::/32 nl 2a03:8e00::/32 gb +2a03:8e20::/32 nl +2a03:8e40::/32 de +2a03:8e60::/32 dk 2a03:8e80::/32 es +2a03:8ea0::/32 pl +2a03:8ec0::/32 de +2a03:8ee0::/32 uz 2a03:8f00::/32 be +2a03:8f40::/32 de +2a03:8f60::/32 bg 2a03:8f80::/32 ro +2a03:8fa0::/32 de +2a03:8fc0::/32 de +2a03:8fe0::/32 gb 2a03:9000::/32 ru +2a03:9020::/32 se +2a03:9040::/32 gb +2a03:9060::/32 fr 2a03:9080::/32 ir +2a03:90a0::/32 se +2a03:90c0::/32 at +2a03:90e0::/32 sa 2a03:9100::/32 tr +2a03:9120::/32 by +2a03:9140::/32 pl +2a03:9160::/32 de 2a03:9180::/32 fr +2a03:91a0::/32 ch +2a03:91c0::/32 it +2a03:91e0::/32 at +2a03:9200::/32 cz +2a03:9220::/32 ua +2a03:9240::/32 ba +2a03:9260::/32 fr 2a03:9280::/32 gb +2a03:92a0::/32 cz +2a03:92c0::/32 fr +2a03:92e0::/32 lu 2a03:9300::/32 pl -2a03:9380::/32 ir +2a03:9320::/32 es +2a03:9340::/32 es +2a03:9360::/32 hr +2a03:9380::/32 gb +2a03:93a0::/32 de +2a03:93c0::/32 ru +2a03:93e0::/32 de 2a03:9400::/32 ru +2a03:9420::/32 lu +2a03:9440::/32 tr +2a03:9460::/32 ru 2a03:9480::/32 de +2a03:94a0::/32 rs +2a03:94c0::/32 gb +2a03:94e0::/32 no 2a03:9500::/32 pl +2a03:9520::/32 es +2a03:9540::/32 cz +2a03:9560::/32 pl 2a03:9580::/32 es +2a03:95a0::/32 be +2a03:95c0::/32 ee +2a03:95e0::/32 dk 2a03:9600::/32 gb -2a03:9680::/32 il +2a03:9620::/32 no +2a03:9640::/32 ps +2a03:9660::/32 ch +2a03:9680::/32 es +2a03:96a0::/32 dk +2a03:96c0::/32 ru +2a03:96e0::/32 no 2a03:9700::/32 nl +2a03:9720::/32 nl +2a03:9740::/32 ru +2a03:9760::/32 rs 2a03:9780::/32 cz +2a03:97a0::/32 ch +2a03:97c0::/32 by +2a03:97e0::/32 no 2a03:9800::/32 gb +2a03:9840::/32 ru +2a03:9860::/32 ua 2a03:9880::/32 it +2a03:98a0::/32 gb +2a03:98c0::/32 lu 2a03:9900::/32 hu +2a03:9920::/32 se +2a03:9940::/32 at +2a03:9960::/32 fr 2a03:9980::/32 de +2a03:99a0::/32 es +2a03:99c0::/32 gb +2a03:99e0::/32 ru 2a03:9a00::/32 no +2a03:9a40::/32 fr +2a03:9a60::/32 ch 2a03:9a80::/32 se +2a03:9aa0::/32 dk +2a03:9ac0::/32 pl +2a03:9ae0::/32 dk 2a03:9b00::/32 fi +2a03:9b20::/32 at +2a03:9b40::/32 de +2a03:9b60::/32 by 2a03:9b80::/32 fi +2a03:9ba0::/32 gb +2a03:9bc0::/32 es +2a03:9be0::/32 pl 2a03:9c00::/32 ro +2a03:9c20::/32 ro +2a03:9c40::/32 lu +2a03:9c60::/32 pl 2a03:9c80::/32 pt +2a03:9ca0::/32 ru +2a03:9cc0::/32 be 2a03:9d00::/32 de +2a03:9d20::/32 es +2a03:9d40::/32 nl +2a03:9d60::/32 fr 2a03:9d80::/32 rs +2a03:9da0::/32 gb +2a03:9dc0::/32 gb +2a03:9de0::/32 lb 2a03:9e00::/32 im +2a03:9e20::/32 it +2a03:9e40::/32 de 2a03:9e80::/32 gb +2a03:9ea0::/32 se +2a03:9ec0::/32 gb +2a03:9ee0::/32 hu 2a03:9f00::/32 gb +2a03:9f20::/32 de +2a03:9f40::/32 fr +2a03:9f60::/32 iq 2a03:9f80::/32 fi +2a03:9fa0::/32 us +2a03:9fc0::/32 se +2a03:9fe0::/32 ru 2a03:a000::/32 gb +2a03:a020::/32 se +2a03:a040::/32 ru +2a03:a060::/32 ru 2a03:a080::/32 de +2a03:a0a0::/32 fr +2a03:a0c0::/32 gb +2a03:a0e0::/32 ru 2a03:a100::/32 si +2a03:a120::/32 ae +2a03:a140::/32 fr +2a03:a160::/32 at 2a03:a180::/32 ru +2a03:a1a0::/32 be +2a03:a1c0::/32 ru +2a03:a1e0::/32 ru 2a03:a200::/32 sk +2a03:a220::/32 pl +2a03:a240::/32 fr +2a03:a260::/32 it 2a03:a280::/32 it +2a03:a2a0::/32 ru +2a03:a2c0::/32 fr +2a03:a2e0::/32 pl 2a03:a300::/32 kz +2a03:a320::/32 es +2a03:a360::/32 ch 2a03:a380::/32 it +2a03:a3a0::/32 nl +2a03:a3c0::/32 it +2a03:a3e0::/32 lb 2a03:a400::/32 ru +2a03:a420::/32 es +2a03:a440::/32 es +2a03:a460::/32 tr 2a03:a480::/32 dk +2a03:a4a0::/32 ru +2a03:a4c0::/32 gb +2a03:a4e0::/32 no 2a03:a500::/32 it +2a03:a520::/32 it +2a03:a540::/32 de +2a03:a560::/32 dk 2a03:a580::/32 fr +2a03:a5a0::/32 tr +2a03:a5c0::/32 gb +2a03:a5e0::/32 gb 2a03:a600::/32 ua +2a03:a620::/32 fr +2a03:a640::/32 fr +2a03:a660::/32 de 2a03:a680::/32 es +2a03:a6c0::/32 it +2a03:a6e0::/32 fr +2a03:a700::/32 it +2a03:a720::/32 fr +2a03:a740::/32 es +2a03:a760::/32 bg 2a03:a780::/32 cz +2a03:a7a0::/32 ru +2a03:a7c0::/32 ru +2a03:a7e0::/32 it 2a03:a800::/32 be +2a03:a820::/32 cz +2a03:a840::/32 ua +2a03:a880::/32 se +2a03:a8c0::/32 fr 2a03:a900::/32 cz +2a03:a940::/32 es 2a03:a980::/32 nl +2a03:a9c0::/32 ua 2a03:aa00::/32 ru +2a03:aa40::/32 de 2a03:aa80::/32 ru +2a03:aac0::/32 sk 2a03:ab00::/32 cz +2a03:ab40::/32 at 2a03:ab80::/32 es +2a03:abc0::/32 nl 2a03:ac00::/32 fr +2a03:ac40::/32 ch 2a03:ac80::/32 se +2a03:acc0::/32 fr 2a03:ad00::/32 de +2a03:ad40::/32 fr 2a03:ad80::/32 es -2a03:ae00::/32 pl +2a03:adc0::/32 tr +2a03:ae00::/32 gb +2a03:ae40::/32 pl 2a03:ae80::/32 es -2a03:af00::/32 eu +2a03:aec0::/32 nl +2a03:af00::/32 de +2a03:af40::/32 mk 2a03:af80::/32 pl +2a03:afc0::/32 ru 2a03:b000::/32 se +2a03:b040::/32 gb 2a03:b080::/32 rs +2a03:b0c0::/32 nl 2a03:b100::/32 se +2a03:b140::/32 it 2a03:b180::/32 ae +2a03:b1c0::/32 ru 2a03:b200::/32 gb +2a03:b240::/32 ch 2a03:b280::/32 cz +2a03:b2c0::/32 ch 2a03:b300::/32 gb +2a03:b340::/32 it 2a03:b380::/32 de +2a03:b3c0::/32 tr 2a03:b400::/32 de +2a03:b440::/32 gb 2a03:b480::/32 de +2a03:b4c0::/32 cz 2a03:b500::/32 be +2a03:b540::/32 bg 2a03:b580::/32 de -2a03:b600::/32 eu +2a03:b5c0::/32 fr +2a03:b600::/32 gb +2a03:b640::/32 jo 2a03:b680::/32 ir +2a03:b6c0::/32 fr 2a03:b700::/32 fr +2a03:b740::/32 es 2a03:b780::/32 cz +2a03:b7c0::/32 fr 2a03:b800::/32 gb +2a03:b840::/32 fr 2a03:b880::/32 de +2a03:b8c0::/32 gr 2a03:b900::/32 ru +2a03:b940::/32 ch 2a03:b980::/32 gb +2a03:b9c0::/32 ru 2a03:ba00::/32 no +2a03:ba40::/32 az 2a03:ba80::/32 fr +2a03:bac0::/32 fr 2a03:bb00::/32 gb +2a03:bb40::/32 hr 2a03:bb80::/32 fr +2a03:bbc0::/32 nl 2a03:bc00::/32 cz +2a03:bc40::/32 gb 2a03:bc80::/32 es +2a03:bcc0::/32 iq 2a03:bd00::/32 fr +2a03:bd40::/32 ba 2a03:bd80::/32 ch +2a03:bdc0::/32 fr 2a03:be00::/32 nl +2a03:be40::/32 gb 2a03:be80::/32 gb +2a03:bec0::/32 nl 2a03:bf00::/32 hu +2a03:bf40::/32 fr 2a03:bf80::/32 nl +2a03:bfc0::/32 gb 2a03:c000::/32 no +2a03:c040::/32 tr 2a03:c080::/32 sa +2a03:c0c0::/32 pl 2a03:c100::/32 at +2a03:c140::/32 ae 2a03:c180::/32 it +2a03:c1c0::/32 it 2a03:c200::/32 de +2a03:c240::/32 ge 2a03:c280::/32 fr +2a03:c2c0::/32 fr 2a03:c300::/32 se +2a03:c340::/32 iq 2a03:c380::/32 it +2a03:c3c0::/32 fr 2a03:c400::/32 at +2a03:c440::/32 ru 2a03:c480::/32 lu +2a03:c4c0::/32 ru 2a03:c500::/32 gb +2a03:c540::/32 fi 2a03:c580::/32 fr +2a03:c5c0::/32 il 2a03:c600::/32 es +2a03:c640::/32 gb 2a03:c680::/32 at +2a03:c6c0::/32 tr 2a03:c700::/32 ru +2a03:c740::/32 by 2a03:c780::/32 se +2a03:c7c0::/32 es 2a03:c800::/32 si +2a03:c840::/32 ee 2a03:c880::/32 es +2a03:c8c0::/32 no 2a03:c900::/32 gb +2a03:c940::/32 pl 2a03:c980::/32 ru +2a03:c9c0::/32 nl 2a03:ca00::/32 ru +2a03:ca40::/32 nl 2a03:ca80::/32 gb +2a03:cac0::/32 il 2a03:cb00::/32 mt +2a03:cb40::/32 ru 2a03:cb80::/32 ba +2a03:cbc0::/32 nl 2a03:cc00::/32 de +2a03:cc40::/32 nl 2a03:cc80::/32 ba -2a03:cd00::/32 eu +2a03:ccc0::/32 ru +2a03:cd00::/32 us +2a03:cd40::/32 se 2a03:cd80::/32 sk +2a03:cdc0::/32 it 2a03:ce00::/32 ru +2a03:ce40::/32 de 2a03:ce80::/32 ru +2a03:cec0::/32 it 2a03:cf00::/32 it +2a03:cf40::/32 ru 2a03:cf80::/32 ru +2a03:cfc0::/32 pl 2a03:d000::/32 ru +2a03:d040::/32 gb 2a03:d080::/32 de +2a03:d0c0::/32 ru 2a03:d100::/32 it +2a03:d140::/32 pl 2a03:d180::/32 bg +2a03:d1c0::/32 fr 2a03:d200::/32 it +2a03:d240::/32 bg 2a03:d280::/32 fr +2a03:d2c0::/32 it 2a03:d300::/32 es +2a03:d340::/32 fr 2a03:d380::/32 ch +2a03:d3c0::/32 de 2a03:d400::/32 de +2a03:d440::/32 hu 2a03:d480::/32 gb +2a03:d4c0::/32 gb 2a03:d500::/32 no +2a03:d540::/32 se 2a03:d580::/32 de +2a03:d5c0::/32 il 2a03:d600::/32 fr +2a03:d640::/32 fi 2a03:d680::/32 nl +2a03:d6c0::/32 gr 2a03:d700::/32 ru +2a03:d740::/32 it 2a03:d780::/32 se +2a03:d7c0::/32 se 2a03:d800::/32 nl +2a03:d840::/32 cz 2a03:d880::/32 gb +2a03:d8c0::/32 de 2a03:d900::/32 se +2a03:d940::/32 fr 2a03:d980::/32 de +2a03:d9c0::/32 cz 2a03:da00::/32 hu +2a03:da40::/32 ch 2a03:da80::/32 at +2a03:dac0::/32 bg 2a03:db00::/32 ru +2a03:db40::/32 cy 2a03:db80::/32 de +2a03:dbc0::/32 dk 2a03:dc00::/32 fr +2a03:dc40::/32 mt 2a03:dc80::/32 dk +2a03:dcc0::/32 ru 2a03:dd00::/32 gb +2a03:dd40::/32 fr 2a03:dd80::/32 rs +2a03:ddc0::/32 cz 2a03:de00::/32 it +2a03:de40::/32 es 2a03:de80::/32 it +2a03:dec0::/32 ru 2a03:df00::/32 hu +2a03:df40::/32 tr 2a03:df80::/32 al +2a03:dfc0::/32 de 2a03:e000::/32 gb +2a03:e040::/32 ru 2a03:e080::/32 es +2a03:e0c0::/32 nl 2a03:e100::/32 gb +2a03:e140::/32 ru 2a03:e180::/32 si +2a03:e1c0::/32 de 2a03:e200::/32 fr +2a03:e240::/32 gb 2a03:e280::/32 nl +2a03:e2c0::/32 ru +2a03:e300::/32 de +2a03:e340::/32 ru 2a03:e380::/32 mk +2a03:e3c0::/32 es 2a03:e400::/32 ru +2a03:e440::/32 es 2a03:e480::/32 ru +2a03:e4c0::/32 ru 2a03:e500::/32 gr +2a03:e540::/32 ru 2a03:e580::/32 fi +2a03:e5c0::/32 it 2a03:e600::/32 at +2a03:e640::/32 it 2a03:e680::/32 es +2a03:e6c0::/32 ru 2a03:e700::/32 it +2a03:e740::/32 it 2a03:e780::/32 ru +2a03:e7c0::/32 sa 2a03:e800::/32 pl +2a03:e840::/32 gb 2a03:e880::/32 de +2a03:e8c0::/32 ru 2a03:e900::/32 es -2a03:e980::/32 is +2a03:e940::/32 ch +2a03:e9c0::/32 ru 2a03:ea00::/32 no +2a03:ea40::/32 nl 2a03:ea80::/32 es +2a03:eac0::/32 gb 2a03:eb00::/32 fi +2a03:eb40::/32 ru 2a03:eb80::/32 is +2a03:ebc0::/32 gb 2a03:ec00::/32 lv +2a03:ec40::/32 gb 2a03:ec80::/32 fr +2a03:ecc0::/32 fr 2a03:ed00::/32 de +2a03:ed40::/32 pl 2a03:ed80::/32 ru +2a03:edc0::/32 fr 2a03:ee00::/32 fo +2a03:ee40::/32 gb 2a03:ee80::/32 de +2a03:eec0::/32 gb 2a03:ef00::/32 se +2a03:ef40::/32 ir 2a03:ef80::/32 it 2a03:f000::/32 gr +2a03:f040::/32 sk 2a03:f080::/32 at +2a03:f0c0::/32 se 2a03:f100::/32 nl +2a03:f140::/32 nc 2a03:f180::/32 ba +2a03:f1c0::/32 ru 2a03:f200::/32 de +2a03:f240::/32 cz 2a03:f280::/32 cz +2a03:f2c0::/32 gb 2a03:f300::/32 cz +2a03:f340::/32 al 2a03:f380::/32 dk +2a03:f3c0::/32 ru 2a03:f400::/32 ie +2a03:f440::/32 se 2a03:f480::/32 ee +2a03:f4c0::/32 fr 2a03:f500::/32 ru +2a03:f540::/32 gb 2a03:f580::/32 de +2a03:f5c0::/32 ru 2a03:f600::/32 se +2a03:f640::/32 fr 2a03:f680::/32 md +2a03:f6c0::/32 es 2a03:f700::/32 ru +2a03:f740::/32 gr 2a03:f780::/32 hu +2a03:f7c0::/32 ru 2a03:f800::/32 si +2a03:f840::/32 pl 2a03:f880::/32 gb +2a03:f8c0::/32 lu 2a03:f900::/32 nl +2a03:f940::/32 cy 2a03:f980::/32 pl +2a03:f9c0::/32 fr 2a03:fa00::/32 at +2a03:fa40::/32 at 2a03:fa80::/32 ro +2a03:fac0::/32 ba 2a03:fb00::/32 gb +2a03:fb40::/32 nl 2a03:fb80::/32 dk +2a03:fbc0::/32 gb 2a03:fc00::/32 nl +2a03:fc40::/32 rs 2a03:fc80::/32 de +2a03:fcc0::/32 fr +2a03:fd00::/32 jo +2a03:fd40::/32 de +2a03:fd80::/32 no +2a03:fdc0::/32 gl 2a03:fe00::/32 ru +2a03:fe40::/32 gb 2a03:fe80::/32 fr -2a03:ff00::/32 lv +2a03:fec0::/32 ru +2a03:ff00::/32 gb +2a03:ff40::/32 il 2a03:ff80::/32 eu +2a03:ffc0::/32 jo +2a04::/29 de +2a04:40::/32 at +2a04:80::/32 pl +2a04:c0::/32 tr +2a04:100::/32 ua +2a04:140::/32 at +2a04:180::/32 fr +2a04:1c0::/32 nl +2a04:200::/32 gb +2a04:240::/32 fi +2a04:280::/32 ru +2a04:2c0::/32 ru +2a04:300::/32 es +2a04:340::/32 cz +2a04:380::/32 fr +2a04:3c0::/32 gb +2a04:400::/32 pl +2a04:440::/32 pl +2a04:480::/32 de +2a04:4c0::/32 pl +2a04:500::/32 ch +2a04:540::/32 ru +2a04:580::/32 de +2a04:5c0::/32 ru +2a04:5e0::/32 fr +2a04:600::/32 nl +2a04:640::/32 va +2a04:680::/32 fi +2a04:6c0::/32 de +2a04:700::/32 ru +2a04:740::/32 it +2a04:780::/32 se +2a04:7c0::/32 tr +2a04:800::/32 fr +2a04:840::/32 gb +2a04:880::/32 de +2a04:8c0::/32 ru +2a04:900::/32 hr +2a04:940::/32 ps +2a04:980::/32 no +2a04:9c0::/32 de +2a04:a00::/32 fr +2a04:a40::/32 de +2a04:a80::/32 fr +2a04:b00::/32 ie +2a04:b40::/32 nl +2a04:b80::/32 be +2a04:bc0::/32 no +2a04:c00::/32 gb +2a04:c40::/32 ch +2a04:c80::/32 es +2a04:cc0::/32 ch +2a04:d00::/32 it +2a04:d40::/32 it +2a04:d80::/32 ru +2a04:dc0::/32 ru +2a04:e40::/32 fr +2a04:e80::/32 es +2a04:ec0::/32 gb +2a04:f00::/32 es +2a04:f40::/32 se +2a04:f80::/32 at +2a04:fc0::/32 no +2a04:1000::/32 gb +2a04:1040::/32 no +2a04:1080::/32 it +2a04:10c0::/32 tr +2a04:1100::/32 tr +2a04:1120::/32 nl +2a04:1140::/32 gb +2a04:1160::/32 iq +2a04:1170::/32 fr +2a04:1180::/32 it +2a04:11c0::/32 fr +2a04:1200::/32 pl +2a04:1240::/32 it +2a04:1280::/32 fr +2a04:12c0::/32 ro +2a04:1300::/32 gb +2a04:1340::/32 de +2a04:1380::/32 ir +2a04:13c0::/32 gb +2a04:1400::/32 gb +2a04:1440::/32 de +2a04:1480::/32 cy +2a04:14c0::/32 pl +2a04:1500::/32 fr +2a04:1540::/32 it +2a04:1580::/32 cz +2a04:15c0::/32 gb +2a04:1600::/32 de +2a04:1640::/32 gb +2a04:1680::/32 nl +2a04:16c0::/32 nl +2a04:1700::/32 gb +2a04:1740::/32 ua +2a04:1780::/32 gb +2a04:17c0::/32 ru +2a04:1800::/32 ua +2a04:1840::/32 gb +2a04:1880::/32 tr +2a04:18c0::/32 nl +2a04:1900::/32 ir +2a04:1940::/32 fr +2a04:1980::/32 gb +2a04:19c0::/32 ps +2a04:1a00::/32 se +2a04:1a40::/32 ua +2a04:1a80::/32 gb +2a04:1ac0::/32 ru +2a04:1b00::/32 nl +2a04:1b40::/32 se +2a04:1b80::/32 ch +2a04:1bc0::/32 ro +2a04:1c00::/32 fr +2a04:1c40::/32 de +2a04:1c80::/32 pl +2a04:1cc0::/32 nl +2a04:1d00::/32 ua +2a04:1d40::/32 ch +2a04:1d80::/32 it +2a04:1dc0::/32 rs +2a04:1e00::/32 fr +2a04:1e40::/32 de +2a04:1e80::/32 gb +2a04:1ec0::/32 es +2a04:1f00::/32 ru +2a04:1f20::/32 ua +2a04:1f40::/32 fr +2a04:1f80::/32 nl +2a04:1fc0::/32 fr +2a04:2000::/32 fr +2a04:2040::/32 ro +2a04:2080::/32 it +2a04:20c0::/32 nl +2a04:2100::/32 de +2a04:2140::/32 gb +2a04:2180::/32 lt +2a04:21c0::/32 gb +2a04:2200::/32 de +2a04:2240::/32 ru +2a04:2280::/32 nl +2a04:22c0::/32 it +2a04:2300::/32 se +2a04:2340::/32 gb +2a04:2380::/32 hu +2a04:23c0::/32 ae +2a04:2400::/32 ro +2a04:2500::/32 fr +2a04:2540::/32 pl +2a04:2580::/32 pl +2a04:25c0::/32 fi +2a04:2600::/32 ae +2a04:2640::/32 it +2a04:2680::/32 ir +2a04:26c0::/32 fr +2a04:2700::/32 it +2a04:2740::/32 no +2a04:2780::/32 tj +2a04:27c0::/32 al +2a04:2800::/32 se +2a04:2840::/32 gb +2a04:2880::/32 gb +2a04:28a0::/32 il +2a04:28b0::/32 no +2a04:28c0::/32 nl +2a04:2900::/32 gb +2a04:2940::/32 ru +2a04:2980::/32 ae +2a04:29c0::/32 de +2a04:2a00::/32 gb +2a04:2a40::/32 ch +2a04:2a80::/32 fr +2a04:2ac0::/32 gb +2a04:2b00::/32 gb +2a04:2b40::/32 pl +2a04:2b80::/32 ro +2a04:2c00::/32 ua +2a04:2c40::/32 eu +2a04:2c80::/32 ua +2a04:2cc0::/32 ru +2a04:2d00::/32 nl +2a04:2d40::/32 ir +2a04:2d80::/32 ir +2a04:2dc0::/32 iq +2a04:2e00::/32 ie +2a04:2e40::/32 rs +2a04:2e80::/32 by +2a04:2ec0::/32 jo +2a04:2f00::/32 ir +2a04:2f40::/32 gb +2a04:2f80::/32 de +2a04:2fc0::/32 ru +2a04:3000::/32 at +2a04:3040::/32 gr +2a04:3080::/32 rs +2a04:30c0::/32 nl +2a04:3100::/32 dk +2a04:3140::/32 pl +2a04:3180::/32 at +2a04:31c0::/32 nl +2a04:3200::/32 de +2a04:3240::/32 es +2a04:3280::/32 it +2a04:32c0::/32 ru +2a04:3300::/32 es +2a04:3340::/32 ee +2a04:3380::/32 nl +2a04:33c0::/32 nl +2a04:3400::/32 dk +2a04:3440::/32 gb +2a04:3480::/32 it +2a04:34c0::/32 ru +2a04:3500::/32 ie +2a04:3540::/32 fi +2a04:3580::/32 dk +2a04:35c0::/32 ie +2a04:3600::/32 ru +2a04:3640::/32 nl +2a04:3680::/32 ch +2a04:36c0::/32 gb +2a04:3700::/32 be +2a04:3740::/32 fr +2a04:3780::/32 de +2a04:37c0::/32 eu +2a04:3800::/32 ru +2a04:3840::/32 ru +2a04:3880::/32 tr +2a04:38a0::/32 ir +2a04:38c0::/32 je +2a04:3900::/32 de +2a04:3940::/32 ch +2a04:3980::/32 fr +2a04:39c0::/32 it +2a04:3a00::/32 fr +2a04:3a40::/32 es +2a04:3a50::/32 se +2a04:3a60::/32 gb +2a04:3a80::/32 kz +2a04:3ac0::/32 tr +2a04:3b00::/32 ru +2a04:3b40::/32 de +2a04:3b80::/32 es +2a04:3bc0::/32 gb +2a04:3c00::/32 nl +2a04:3c40::/32 iq +2a04:3c80::/32 pl +2a04:3cc0::/32 ru +2a04:3d00::/32 it +2a04:3d40::/32 pl +2a04:3d80::/32 fr +2a04:3dc0::/32 pl +2a04:3e00::/32 gr +2a04:3e40::/32 at +2a04:3e80::/32 ba +2a04:3ec0::/32 tr +2a04:3f00::/32 ch +2a04:3f40::/32 it +2a04:3f80::/32 dk +2a04:3fc0::/32 gb +2a04:4000::/32 pl +2a04:4040::/32 gb +2a04:4080::/32 pl +2a04:40c0::/32 fi +2a04:4100::/32 gb +2a04:4140::/32 ru +2a04:4180::/32 ua +2a04:41c0::/32 es +2a04:4200::/32 nl +2a04:4240::/32 se +2a04:4280::/32 tr +2a04:42c0::/32 ua +2a04:4300::/32 gb +2a04:4340::/32 nl +2a04:4380::/32 fr +2a04:43c0::/32 bg +2a04:4400::/32 nl +2a04:4440::/32 gb +2a04:4480::/32 gb +2a04:44c0::/32 de +2a04:4500::/32 it +2a04:4540::/32 de +2a04:4580::/32 de +2a04:45c0::/32 no +2a04:4600::/32 gb +2a04:4640::/32 fr +2a04:4680::/32 de +2a04:46c0::/32 fr +2a04:4700::/32 tr +2a04:4720::/32 be +2a04:4740::/32 pl +2a04:4780::/32 is +2a04:47c0::/32 gb +2a04:4800::/32 nl +2a04:4840::/32 ru +2a04:4880::/32 cz +2a04:48c0::/32 az +2a04:4900::/32 no +2a04:4940::/32 no +2a04:4980::/32 ru +2a04:49c0::/32 al +2a04:4a00::/32 ru +2a04:4a40::/32 gb +2a04:4a80::/32 fi +2a04:4ac0::/32 cz +2a04:4b00::/32 de +2a04:4b40::/32 nl +2a04:4b80::/32 az +2a04:4bc0::/32 it +2a04:4c00::/32 dk +2a04:4c40::/32 ua +2a04:4c80::/32 it +2a04:4cc0::/32 de +2a04:4d00::/32 ru +2a04:4d40::/32 cz +2a04:4d80::/32 se +2a04:4dc0::/32 pl +2a04:4e00::/32 lv +2a04:4e40::/32 eu +2a04:4e80::/32 no +2a04:4ec0::/32 at +2a04:4f00::/32 pl +2a04:4f40::/32 kz +2a04:4f80::/32 de +2a04:4fc0::/32 gb +2a04:4fe0::/32 de +2a04:5000::/32 it +2a04:5040::/32 ru +2a04:5080::/32 nl +2a04:50c0::/32 gb +2a04:5100::/32 ir +2a04:5140::/32 ru +2a04:5180::/32 ru +2a04:51c0::/32 pl +2a04:5200::/32 ru +2a04:5240::/32 gb +2a04:5280::/32 ro +2a04:52c0::/32 nl +2a04:5300::/32 gb +2a04:5340::/32 de +2a04:5380::/32 fr +2a04:53c0::/32 pt +2a04:5400::/32 ie +2a04:5440::/32 fr +2a04:5480::/32 tr +2a04:54c0::/32 no +2a04:5500::/32 ru +2a04:5540::/32 at +2a04:5580::/32 gb +2a04:55c0::/32 il +2a04:5600::/32 kg +2a04:5640::/32 ch +2a04:5680::/32 pl +2a04:56c0::/32 nl +2a04:5700::/32 li +2a04:5740::/32 de +2a04:5780::/32 de +2a04:57c0::/32 se +2a04:5840::/32 eu +2a04:5880::/32 it +2a04:58c0::/32 ru +2a04:5900::/32 al +2a04:5940::/32 fr +2a04:5980::/32 fi +2a04:59c0::/32 si +2a04:5a00::/32 de +2a04:5a40::/32 ch +2a04:5a80::/32 lb +2a04:5ac0::/32 gb +2a04:5b00::/32 ro +2a04:5b40::/32 de +2a04:5b80::/32 tr +2a04:5bc0::/32 gb +2a04:5c00::/32 it +2a04:5c40::/32 gb +2a04:5c80::/32 ch +2a04:5cc0::/32 de +2a04:5d00::/32 gb +2a04:5d40::/32 no +2a04:5d80::/32 de +2a04:5dc0::/32 tr +2a04:5e00::/32 iq +2a04:5e40::/32 az +2a04:5e80::/32 pl +2a04:5ec0::/32 nl +2a04:5f00::/32 de +2a04:5f40::/32 lv +2a04:5f80::/32 nl +2a04:5fc0::/32 es +2a04:6000::/32 ru +2a04:6040::/32 gb +2a04:6080::/32 fr +2a04:60c0::/32 se +2a04:6100::/32 de +2a04:6140::/32 se +2a04:6180::/32 be +2a04:61c0::/32 ru +2a04:6200::/32 jo +2a04:6240::/32 gb +2a04:6280::/32 nl +2a04:62c0::/32 at +2a04:6300::/32 gb +2a04:6340::/32 no +2a04:6380::/32 gb +2a04:63c0::/32 ae +2a04:6440::/32 de +2a04:6480::/32 be +2a04:64c0::/32 de +2a04:6500::/32 is +2a04:6540::/32 no +2a04:6580::/32 it +2a04:65c0::/32 de +2a04:6600::/32 tr +2a04:6640::/32 nl +2a04:6650::/32 fr +2a04:6660::/32 eu +2a04:6680::/32 tr +2a04:66c0::/32 gb +2a04:6700::/32 mt +2a04:6740::/32 pl +2a04:6780::/32 de +2a04:67c0::/32 ir +2a04:6800::/32 be +2a04:6840::/32 gb +2a04:6880::/32 it +2a04:68c0::/32 it +2a04:6900::/32 ua +2a04:6940::/32 gb +2a04:6980::/32 ro +2a04:69c0::/32 mk +2a04:6a00::/32 fr +2a04:6a40::/32 ru +2a04:6a80::/32 se +2a04:6ac0::/32 ua +2a04:6b00::/32 dk +2a04:6b40::/32 gg +2a04:6b80::/32 no +2a04:6bc0::/32 nl +2a04:6c00::/32 es +2a04:6c40::/32 be +2a04:6c80::/32 ro +2a04:6cc0::/32 se +2a04:6d00::/32 pl +2a04:6d40::/32 ch +2a04:6d80::/32 pt +2a04:6dc0::/32 nl +2a04:6e00::/32 ir +2a04:6e40::/32 de +2a04:6e80::/32 dk +2a04:6ec0::/32 de +2a04:6f00::/32 ch +2a04:6f40::/32 ua +2a04:6f80::/32 qa +2a04:6fa0::/32 nl +2a04:6fb0::/32 no +2a04:6fc0::/32 gb +2a04:7000::/32 rs +2a04:7040::/32 fr +2a04:7080::/32 bg +2a04:70c0::/32 gb +2a04:7100::/32 at +2a04:7140::/32 fr +2a04:7180::/32 se +2a04:71c0::/32 de +2a04:7200::/32 fr +2a04:7240::/32 ru +2a04:7280::/32 es +2a04:72c0::/32 nl +2a04:7300::/32 gb +2a04:7340::/32 gb +2a04:7380::/32 gb +2a04:73c0::/32 rs +2a04:7400::/32 me +2a04:7440::/32 de +2a04:7480::/32 de +2a04:74c0::/32 fr +2a04:7500::/32 at +2a04:7580::/32 md +2a04:75c0::/32 ua +2a04:7600::/32 no +2a04:7640::/32 ch +2a04:7680::/32 de +2a04:76c0::/32 nl +2a04:7700::/32 at +2a04:7740::/32 iq +2a04:7780::/32 ru +2a04:77c0::/32 cz +2a04:7800::/32 iq +2a04:7840::/32 pl +2a04:7880::/32 no +2a04:78c0::/32 de +2a04:78e0::/32 it +2a04:7900::/32 ru +2a04:7940::/32 es +2a04:7980::/32 fi +2a04:79c0::/32 de +2a04:7a00::/32 de +2a04:7a40::/32 ch +2a04:7a80::/32 nl +2a04:7ac0::/32 de +2a04:7b00::/32 it +2a04:7b40::/32 de +2a04:7b80::/32 tr +2a04:7bc0::/32 sa +2a04:7c00::/32 nl +2a04:7c40::/32 es +2a04:7c80::/32 ru +2a04:7cc0::/32 es +2a04:7d00::/32 nl +2a04:7d40::/32 ir +2a04:7d80::/32 de +2a04:7dc0::/32 ua +2a04:7e00::/32 it +2a04:7e40::/32 fr +2a04:7e80::/32 ee +2a04:7ec0::/32 es +2a04:7f00::/32 be +2a04:7f40::/32 no +2a04:7f80::/32 qa +2a04:7fc0::/32 gb +2a04:8000::/32 ua +2a04:8040::/32 fr +2a04:8080::/32 se +2a04:80c0::/32 ee +2a04:8100::/32 gb +2a04:8140::/32 nl +2a04:8180::/32 sy +2a04:8190::/32 nl +2a04:81a0::/32 at +2a04:81c0::/32 lu +2a04:8200::/32 it +2a04:8240::/32 ru +2a04:8280::/32 de +2a04:82c0::/32 ie +2a04:8300::/32 mt +2a04:8340::/32 tr +2a04:8380::/32 az +2a04:83c0::/32 fi +2a04:8400::/32 nl +2a04:8440::/32 at +2a04:8480::/32 de +2a04:84c0::/32 gb +2a04:8500::/32 de +2a04:8540::/32 ir +2a04:8580::/32 ru +2a04:85c0::/32 at +2a04:8600::/32 it +2a04:8640::/32 it +2a04:8680::/32 ru +2a04:86c0::/32 lb +2a04:8700::/32 mt +2a04:8740::/32 gb +2a04:8780::/32 de +2a04:87c0::/32 ir +2a04:8800::/32 at +2a04:8840::/32 pl +2a04:8880::/32 nl +2a04:88c0::/32 ru +2a04:8900::/32 de +2a04:8940::/32 pt +2a04:8980::/32 fr +2a04:89c0::/32 fr +2a04:8a00::/32 ru +2a04:8a40::/32 ru +2a04:8a80::/32 si +2a04:8ac0::/32 bh +2a04:8b00::/32 nl +2a04:8b40::/32 fr +2a04:8b80::/32 nl +2a04:8bc0::/32 es +2a04:8c00::/32 ru +2a04:8c40::/32 ru +2a04:8c80::/32 cy +2a04:8cc0::/32 ir +2a04:8d00::/32 mk +2a04:8d40::/32 se +2a04:8d80::/32 gb +2a04:8dc0::/32 lu +2a04:8e00::/32 mk +2a04:8e40::/32 nl +2a04:8e80::/32 nl +2a04:8e90::/32 ch +2a04:8ea0::/32 ru +2a04:8ec0::/32 eu +2a04:8f00::/32 ru +2a04:8f40::/32 de +2a04:8f80::/32 nl +2a04:8fc0::/32 es +2a04:9000::/32 es +2a04:9040::/32 nl +2a04:9080::/32 sy +2a04:90c0::/32 fi +2a04:9100::/32 iq +2a04:9140::/32 fr +2a04:9180::/32 be +2a04:91c0::/32 be +2a04:9200::/32 eu +2a04:9240::/32 ir +2a04:9280::/32 ua +2a04:92c0::/32 gb +2a04:9300::/32 at +2a04:9340::/32 gb +2a04:9380::/32 nl +2a04:93c0::/32 ru +2a04:9400::/32 ru +2a04:9440::/32 pl +2a04:9480::/32 gb +2a04:94c0::/32 eu +2a04:94e0::/32 gb +2a04:9500::/32 nl +2a04:9540::/32 at +2a04:9580::/32 ru +2a04:95c0::/32 gb +2a04:9600::/32 gb +2a04:9640::/32 cz +2a04:9680::/32 de +2a04:96c0::/32 cy +2a04:9700::/32 gb +2a04:9740::/32 de +2a04:9780::/32 tr +2a04:97c0::/32 ch +2a04:9800::/32 es +2a04:9840::/32 is +2a04:9880::/32 de +2a04:98c0::/32 ir +2a04:9900::/32 es +2a04:9940::/32 sa +2a04:9980::/32 es +2a04:99c0::/32 ru +2a04:9a00::/32 nl +2a04:9a40::/32 pl +2a04:9a80::/32 ir +2a04:9ac0::/32 ch +2a04:9b00::/32 gb +2a04:9b40::/32 by +2a04:9b80::/32 pl +2a04:9bc0::/32 no +2a04:9c00::/32 nl +2a04:9c40::/32 ir +2a04:9c80::/32 gb +2a04:9cc0::/32 lb +2a04:9d00::/32 nl +2a04:9d40::/32 ie +2a04:9d80::/32 nl +2a04:9dc0::/32 ro +2a04:9e00::/32 se +2a04:9e40::/32 gb +2a04:9e80::/32 at +2a04:9ec0::/32 be +2a04:9f00::/32 it +2a04:9f40::/32 es +2a04:9f80::/32 be +2a04:9fc0::/32 nl +2a04:a000::/32 nl +2a04:a040::/32 iq +2a04:a080::/32 de +2a04:a0c0::/32 nl +2a04:a100::/32 se +2a04:a140::/32 gb +2a04:a180::/32 gb +2a04:a1c0::/32 ru +2a04:a200::/32 it +2a04:a240::/32 es +2a04:a280::/32 es +2a04:a2c0::/32 ch +2a04:a300::/32 ir +2a04:a340::/32 sm +2a04:a380::/32 cz +2a04:a3c0::/32 dk +2a04:a400::/32 de +2a04:a440::/32 gb +2a04:a450::/32 es +2a04:a460::/32 pl +2a04:a470::/32 dk +2a04:a480::/32 fr +2a04:a4c0::/32 at +2a04:a500::/32 nl +2a04:a540::/32 de +2a04:a580::/32 it +2a04:a5c0::/32 gr +2a04:a600::/32 be +2a04:a640::/32 ru +2a04:a680::/32 at +2a04:a6c0::/32 ch +2a04:a700::/32 nl +2a04:a740::/32 ua +2a04:a780::/32 de +2a04:a7c0::/32 hr +2a04:a800::/32 dk +2a04:a840::/32 nl +2a04:a880::/32 dk +2a04:a8c0::/32 us +2a04:a900::/32 ua +2a04:a940::/32 pl +2a04:a980::/32 gb +2a04:a9c0::/32 it +2a04:aa00::/32 ua +2a04:aa40::/32 ch +2a04:aa80::/32 sa +2a04:aac0::/32 pl +2a04:ab00::/32 gb +2a04:ab40::/32 ir +2a04:ab80::/32 nl +2a04:abc0::/32 nl +2a04:ac00::/32 ru +2a04:ac80::/32 nl +2a04:acc0::/32 ir +2a04:ad00::/32 iq +2a04:ad40::/32 fi +2a04:ad80::/32 gb +2a04:adc0::/32 ru +2a04:ae00::/32 se +2a04:b000::/32 gb +2a04:b040::/32 nl +2a04:b080::/32 fi +2a04:b100::/32 ru +2a04:b140::/32 tr +2a04:b180::/32 fr +2a04:b1c0::/32 ie +2a04:b200::/32 it +2a04:b240::/32 im +2a04:b280::/32 fr +2a04:b2c0::/32 gb +2a04:b300::/32 se +2a04:b340::/32 kg +2a04:b380::/32 es +2a04:b3c0::/32 gb +2a04:b400::/32 se +2a04:b440::/32 es +2a04:b480::/32 ie +2a04:b4c0::/32 pl +2a04:b500::/32 ch +2a04:b540::/32 sk +2a04:b580::/32 de +2a04:b5c0::/32 be +2a04:b640::/32 de +2a04:b680::/32 gb +2a04:b6c0::/32 gb +2a04:b700::/32 nl +2a04:b740::/32 pl +2a04:b780::/32 gb +2a04:b800::/32 gb +2a04:b840::/32 pl +2a04:b880::/32 es +2a04:b8c0::/32 it +2a04:b900::/32 nl +2a04:b940::/32 ru +2a04:b980::/32 hr +2a04:b9c0::/32 se +2a04:ba00::/32 gb +2a04:ba40::/32 fr +2a04:ba80::/32 de +2a04:bac0::/32 ru +2a04:bb00::/32 at +2a04:bb40::/32 pl +2a04:bb80::/32 ru +2a04:bbc0::/32 gb +2a04:bc00::/32 cz +2a04:bc40::/32 ua +2a04:bc80::/32 ie +2a04:bcc0::/32 se +2a04:bd00::/32 fr +2a04:bd40::/32 fr +2a04:bd80::/32 fi +2a04:bdc0::/32 be +2a04:be00::/32 pl +2a04:be20::/32 ru +2a04:be40::/32 ch +2a04:be80::/32 nl +2a04:bec0::/32 it +2a04:bf00::/32 at +2a04:bf40::/32 rs +2a04:bfc0::/32 ch +2a04:c000::/32 ch +2a04:c040::/32 ru +2a04:c080::/32 fr +2a04:c0c0::/32 fi +2a04:c100::/32 it +2a04:c140::/32 ir +2a04:c180::/32 ro +2a04:c1c0::/32 it +2a04:c200::/32 ge +2a04:c240::/32 it +2a04:c280::/32 ee +2a04:c2c0::/32 dk +2a04:c300::/32 es +2a04:c340::/32 ru +2a04:c380::/32 tr +2a04:c3c0::/32 cz +2a04:c400::/32 om +2a04:c440::/32 ch +2a04:c480::/32 ru +2a04:c4c0::/32 de +2a04:c500::/32 it +2a04:c540::/32 gb +2a04:c580::/32 nl +2a04:c5c0::/32 us +2a04:c600::/32 nl +2a04:c640::/32 it +2a04:c680::/32 gb +2a04:c6c0::/32 se +2a04:c700::/32 gb +2a04:c740::/32 cz +2a04:c780::/32 nl +2a04:c7c0::/32 at +2a04:c800::/32 nl +2a04:c840::/32 az +2a04:c880::/32 gb +2a04:c8c0::/32 it +2a04:c900::/32 ru +2a04:c940::/32 de +2a04:c980::/32 gb +2a04:c9c0::/32 de +2a04:ca00::/32 gb +2a04:ca40::/32 tr +2a04:ca80::/32 fr +2a04:cac0::/32 de +2a04:cb00::/32 it +2a04:cb40::/32 nl +2a04:cb80::/32 ae +2a04:cbc0::/32 gb +2a04:cc00::/32 fr +2a04:cc40::/32 by +2a04:cc80::/32 fi +2a04:ccc0::/32 nl +2a04:cd00::/32 pl +2a04:cd40::/32 at +2a04:cd80::/32 no +2a04:cdc0::/32 pl +2a04:ce00::/32 lt +2a04:ce40::/32 de +2a04:ce80::/32 gb +2a04:cec0::/32 fr +2a04:cf00::/32 gb +2a04:cf40::/32 de +2a04:cf80::/32 sa +2a04:cfc0::/32 ru +2a04:d000::/32 de +2a04:d040::/32 ge +2a04:d080::/32 rs +2a04:d0c0::/32 no +2a04:d100::/32 iq +2a04:d140::/32 de +2a04:d180::/32 gb +2a04:d1c0::/32 lb +2a04:d200::/32 at +2a04:d240::/32 nl +2a04:d280::/32 de +2a04:d2c0::/32 ru +2a04:d300::/32 nl +2a04:d340::/32 no +2a04:d380::/32 az +2a04:d3c0::/32 at +2a04:d400::/32 ee +2a04:d440::/32 nl +2a04:d480::/32 de +2a04:d4c0::/32 gb +2a04:d500::/32 fi +2a04:d540::/32 at +2a04:d580::/32 sa +2a04:d5c0::/32 ie +2a04:d600::/32 gb +2a04:d640::/32 ie +2a04:d680::/32 it +2a04:d6c0::/32 es +2a04:d700::/32 es +2a04:d740::/32 de +2a04:d780::/32 gb +2a04:d7c0::/32 nl +2a04:d800::/32 no +2a04:d840::/32 gb +2a04:d880::/32 gb +2a04:d8c0::/32 gb +2a04:d900::/32 ru +2a04:d940::/32 nl +2a04:d980::/32 il +2a04:d9c0::/32 nl +2a04:da00::/32 ae +2a04:da40::/32 ir +2a04:da80::/32 gb +2a04:dac0::/32 dk +2a04:db00::/32 de +2a04:db40::/32 si +2a04:db80::/32 ru +2a04:dbc0::/32 ru +2a04:dbe0::/32 be +2a04:dc00::/32 gb +2a04:dc40::/32 it +2a04:dc80::/32 no +2a04:dcc0::/32 se +2a04:dd00::/32 ae +2a04:dd40::/32 si +2a04:dd80::/32 nl +2a04:ddc0::/32 se +2a04:de00::/32 de +2a04:de40::/32 gb +2a04:de80::/32 ru +2a04:dec0::/32 de +2a04:df00::/32 bg +2a04:df40::/32 lt +2a04:df80::/32 de +2a04:dfc0::/32 de +2a04:e000::/32 eu +2a04:e040::/32 pt +2a04:e080::/32 ru +2a04:e0c0::/32 sa +2a04:e100::/32 it +2a04:e140::/32 gb +2a04:e180::/32 es +2a04:e1c0::/32 nl +2a04:e200::/32 dk +2a04:e240::/32 it +2a04:e280::/32 tr +2a04:e2c0::/32 es +2a04:e300::/32 ch +2a04:e340::/32 ae +2a04:e380::/32 ru +2a04:e3c0::/32 dk +2a04:e400::/32 nl +2a04:e440::/32 de +2a04:e480::/32 it +2a04:e4c0::/32 eu +2a04:e500::/32 ru +2a04:e540::/32 de +2a04:e580::/32 nl +2a04:e5c0::/32 fr +2a04:e600::/32 pl +2a04:e640::/32 ru +2a04:e680::/32 ir +2a04:e6c0::/32 hu +2a04:e700::/32 ch +2a04:e740::/32 pl +2a04:e780::/32 gb +2a04:e7c0::/32 cz +2a04:e800::/32 fr +2a04:e840::/32 gb +2a04:e880::/32 tr +2a04:e8c0::/32 ch +2a04:e900::/32 fr +2a04:e940::/32 ru +2a04:e980::/32 il +2a04:e9c0::/32 gb +2a04:ea00::/32 ae +2a04:ea40::/32 de +2a04:ea80::/32 lb +2a04:eac0::/32 de +2a04:eb00::/32 lt +2a04:eb40::/32 al +2a04:eb80::/32 rs +2a04:ebc0::/32 gb +2a04:ec00::/32 nl +2a04:ec10::/32 gb +2a04:ec20::/32 rs +2a04:ec40::/32 gb +2a04:ec80::/32 de +2a04:ecc0::/32 gb +2a04:ed00::/32 gb +2a04:ed40::/32 ru +2a04:ed80::/32 gb +2a04:edc0::/32 pl +2a04:ee00::/32 ru +2a04:ee40::/32 ch +2a04:ee80::/32 it +2a04:eec0::/32 nl +2a04:ef00::/32 ru +2a04:ef40::/32 it +2a04:ef80::/32 gb +2a04:efc0::/32 it +2a04:f000::/32 ch +2a04:f040::/32 hu +2a04:f080::/32 ir +2a04:f0c0::/32 lv +2a04:f100::/32 at +2a04:f140::/32 cy +2a04:f180::/32 se +2a04:f1c0::/32 sa +2a04:f200::/32 pl +2a04:f240::/32 ru +2a04:f280::/32 bg +2a04:f2c0::/32 ba +2a04:f300::/32 nl +2a04:f310::/32 cz +2a04:f320::/32 sy +2a04:f340::/32 ch +2a04:f380::/32 nl +2a04:f3c0::/32 fr +2a04:f400::/32 eu +2a04:f440::/32 pl +2a04:f480::/32 sk +2a04:f4c0::/32 it +2a04:f500::/32 de +2a04:f540::/32 us +2a04:f580::/32 gb +2a04:f5c0::/32 it +2a04:f600::/32 fr +2a04:f640::/32 eu +2a04:f680::/32 at +2a04:f6c0::/32 de +2a04:f700::/32 pl +2a04:f740::/32 nl +2a04:f780::/32 in +2a04:f7c0::/32 nl +2a04:f800::/32 ru +2a04:f840::/32 nl +2a04:f880::/32 de +2a04:f8c0::/32 de +2a04:f900::/32 de +2a04:f940::/32 cz +2a04:f980::/32 ro +2a04:f9c0::/32 at +2a04:fa00::/32 nl +2a04:fa40::/32 ir +2a04:fa80::/32 ie +2a04:fac0::/32 tr +2a04:fb00::/32 ua +2a04:fb40::/32 ir +2a04:fb80::/32 gb +2a04:fbc0::/32 nl +2a04:fc00::/32 it +2a04:fc40::/32 lu +2a04:fc80::/32 tr +2a04:fcc0::/32 gb +2a04:fd00::/32 gb +2a04:fd40::/32 ru +2a04:fd80::/32 gb +2a04:fdc0::/32 ie +2a04:fe00::/32 es +2a04:fe40::/32 sa +2a04:fe80::/32 gb +2a04:fec0::/32 es +2a04:fee0::/32 ro +2a04:ff00::/32 hr +2a04:ff40::/32 at +2a04:ff80::/32 ba +2a04:ffc0::/32 hu +2a05::/29 be +2a05:40::/32 it +2a05:80::/32 ch +2a05:c0::/32 dk +2a05:100::/32 gb +2a05:140::/32 de +2a05:1c0::/32 gb +2a05:200::/32 be +2a05:240::/32 nl +2a05:280::/32 ru +2a05:2c0::/32 cz +2a05:300::/32 tr +2a05:340::/32 es +2a05:380::/32 de +2a05:400::/32 de +2a05:440::/32 pl +2a05:480::/32 ua +2a05:4c0::/32 iq +2a05:500::/32 ua +2a05:540::/32 ru +2a05:580::/32 ae +2a05:5c0::/32 es +2a05:600::/32 ch +2a05:640::/32 de +2a05:680::/32 nl +2a05:700::/32 lu +2a05:740::/32 be +2a05:780::/32 fr +2a05:7c0::/32 de +2a05:800::/32 tr +2a05:840::/32 nl +2a05:860::/32 ru +2a05:880::/32 de +2a05:8c0::/32 es +2a05:900::/32 de +2a05:940::/32 gb +2a05:980::/32 sk +2a05:9c0::/32 fr +2a05:a00::/32 pl +2a05:a40::/32 ir +2a05:a80::/32 ir +2a05:ac0::/32 ir +2a05:b00::/32 ua +2a05:b40::/32 nl +2a05:b80::/32 ru +2a05:bc0::/32 de +2a05:c00::/32 no +2a05:c40::/32 nl +2a05:c80::/32 es +2a05:cc0::/32 gb +2a05:d00::/32 ch +2a05:d40::/32 fr +2a05:d80::/32 fr +2a05:dc0::/32 es +2a05:e00::/32 fr +2a05:e40::/32 at +2a05:e80::/32 tr +2a05:ec0::/32 no +2a05:f00::/32 de +2a05:f40::/32 fr +2a05:f80::/32 gb +2a05:fc0::/32 ch +2a05:1000::/32 fr +2a05:1040::/32 gb +2a05:1080::/32 de +2a05:10c0::/32 it +2a05:1100::/32 ru +2a05:1140::/32 at +2a05:1180::/32 nl +2a05:11c0::/32 gb +2a05:1200::/32 cz +2a05:1220::/32 cz +2a05:1240::/32 de +2a05:1280::/32 ch +2a05:12c0::/32 es +2a05:1300::/32 gb +2a05:1340::/32 ir +2a05:1380::/32 it +2a05:13c0::/32 gb +2a05:1400::/32 at +2a05:1480::/32 pl +2a05:14c0::/32 ch +2a05:1500::/32 de +2a05:1540::/32 pl +2a05:1580::/32 lt +2a05:15c0::/32 de +2a05:1600::/32 lu +2a05:1640::/32 ch +2a05:1680::/32 gb +2a05:16c0::/32 nl +2a05:1700::/32 ru +2a05:1740::/32 gb +2a05:1780::/32 es +2a05:17c0::/32 nl +2a05:1800::/32 fr +2a05:1840::/32 hr +2a05:1880::/32 it +2a05:18c0::/32 it +2a05:1900::/32 ru +2a05:1980::/32 no +2a05:19c0::/32 nl +2a05:1a00::/32 ir +2a05:1c00::/32 ro +2a05:1c40::/32 cz +2a05:1c80::/32 gb +2a05:1cc0::/32 ee +2a05:1d00::/32 gb +2a05:1d40::/32 cz +2a05:1d60::/32 gb +2a05:1d80::/32 tr +2a05:1dc0::/32 ie +2a05:1e00::/32 ch +2a05:1e40::/32 fr +2a05:1e80::/32 nl +2a05:1ec0::/32 fr +2a05:1f00::/32 gb +2a05:1f40::/32 fi +2a05:1f80::/32 ba +2a05:1fc0::/32 ro +2a05:2000::/32 se +2a05:2040::/32 es +2a05:2080::/32 gb +2a05:20c0::/32 de +2a05:2100::/32 cz +2a05:2140::/32 sk +2a05:2180::/32 tm +2a05:21c0::/32 se +2a05:2200::/32 nl +2a05:2240::/32 se +2a05:2280::/32 si +2a05:22c0::/32 nl +2a05:2300::/32 nl +2a05:2340::/32 de +2a05:2380::/32 be +2a05:23c0::/32 it +2a05:2400::/32 pl +2a05:2440::/32 se +2a05:2480::/32 ae +2a05:24c0::/32 nl +2a05:2500::/32 nl +2a05:2540::/32 ie +2a05:2580::/32 ua +2a05:25c0::/32 kw +2a05:2600::/32 be +2a05:2640::/32 fr +2a05:2680::/32 gb +2a05:26c0::/32 gb +2a05:2700::/32 ch +2a05:2740::/32 ch +2a05:2780::/32 it +2a05:27c0::/32 kz +2a05:2800::/32 ie +2a05:2840::/32 no +2a05:2880::/32 be +2a05:28c0::/32 pt +2a05:2900::/32 nl +2a05:2980::/32 de +2a05:29c0::/32 ua +2a05:2a00::/32 gb +2a05:2a40::/32 tr +2a05:2a80::/32 de +2a05:2ac0::/32 es +2a05:2b00::/32 gb +2a05:2b40::/32 gb +2a05:2b80::/32 nl +2a05:2bc0::/32 gb +2a05:2c00::/32 cz +2a05:2c20::/32 cz +2a05:2c40::/32 de +2a05:2c80::/32 lb +2a05:2cc0::/32 nl +2a05:2d00::/32 nl +2a05:2d40::/32 ch +2a05:2d80::/32 us +2a05:2dc0::/32 ru +2a05:2e00::/32 gb +2a05:2e40::/32 ua +2a05:2e80::/32 de +2a05:2ec0::/32 ru +2a05:2f00::/32 de +2a05:2f40::/32 ps +2a05:2f80::/32 it +2a05:2fc0::/32 de +2a05:3000::/32 tr +2a05:3040::/32 tr +2a05:3080::/32 hu +2a05:30c0::/32 de +2a05:3100::/32 ro +2a05:3140::/32 gb +2a05:3180::/32 ru +2a05:31c0::/32 gb +2a05:3200::/32 nl +2a05:3240::/32 de +2a05:3280::/32 sa +2a05:32c0::/32 de +2a05:3300::/32 fr +2a05:3380::/32 ye +2a05:33c0::/32 si +2a05:3400::/32 se +2a05:3440::/32 it +2a05:3480::/32 fr +2a05:34c0::/32 at +2a05:3500::/32 ie +2a05:3540::/32 gb +2a05:3580::/32 ru +2a05:35c0::/32 nl +2a05:3600::/32 nl +2a05:3640::/32 pl +2a05:3680::/32 it +2a05:3700::/32 fr +2a05:3740::/32 ru +2a05:3780::/32 ch +2a05:3800::/32 ir +2a05:3840::/32 dk +2a05:3880::/32 it +2a05:38c0::/32 ua +2a05:3900::/32 es +2a05:3940::/32 gb +2a05:3950::/32 dk +2a05:3960::/32 nl +2a05:3980::/32 nl +2a05:39c0::/32 es +2a05:3a00::/32 pl +2a05:3a40::/32 ro +2a05:3a80::/32 ru +2a05:3ac0::/32 gr +2a05:3b00::/32 us +2a05:3b40::/32 ru +2a05:3b80::/32 nl +2a05:3bc0::/32 de +2a05:3c00::/32 dk +2a05:3c40::/32 ru +2a05:3c80::/32 cz +2a05:3cc0::/32 pl +2a05:3d00::/32 be +2a05:3d40::/32 cz +2a05:3d80::/32 ch +2a05:3e00::/32 de +2a05:3e40::/32 ir +2a05:3e80::/32 ru +2a05:3ec0::/32 it +2a05:3f00::/32 no +2a05:3f40::/32 nl +2a05:3f80::/32 gr +2a05:3fc0::/32 de +2a05:4000::/32 gb +2a05:4040::/32 gb +2a05:4080::/32 ee +2a05:40c0::/32 pl +2a05:4100::/32 ru +2a05:4140::/32 gb +2a05:4180::/32 ch +2a05:41c0::/32 ch +2a05:4200::/32 gb +2a05:4240::/32 tr +2a05:4280::/32 ee +2a05:42c0::/32 it +2a05:4300::/32 gb +2a05:4340::/32 gb +2a05:4380::/32 nl +2a05:43c0::/32 cz +2a05:4400::/32 dk +2a05:4440::/32 es +2a05:4480::/32 pl +2a05:44c0::/32 nl +2a05:4500::/32 cz +2a05:4540::/32 se +2a05:4580::/32 ir +2a05:45c0::/32 uz +2a05:4600::/32 dk +2a05:4640::/32 tr +2a05:4680::/32 fr +2a05:46c0::/32 fr +2a05:4700::/32 es +2a05:4740::/32 ch +2a05:4780::/32 fr +2a05:47c0::/32 fr +2a05:4800::/32 ru +2a05:4840::/32 de +2a05:4880::/32 fr +2a05:48c0::/32 it +2a05:4900::/32 pl +2a05:4940::/32 si +2a05:4980::/32 rs +2a05:49c0::/32 ir +2a05:4a00::/32 it +2a05:4a40::/32 cz +2a05:4ac0::/32 es +2a05:4b00::/32 ua +2a05:4b40::/32 ru +2a05:4b80::/32 gb +2a05:4bc0::/32 gb +2a05:4c00::/32 bg +2a05:4c40::/32 gb +2a05:4c80::/32 md +2a05:4cc0::/32 ru +2a05:4d00::/32 cz +2a05:4d40::/32 es +2a05:4d80::/32 es +2a05:4dc0::/32 at +2a05:4e00::/32 pl +2a05:4e40::/32 at +2a05:4e80::/32 fr +2a05:4ec0::/32 ru +2a05:4f00::/32 ru +2a05:4f40::/32 hr +2a05:4f80::/32 rs +2a05:4fc0::/32 ru +2a05:5000::/32 fr +2a05:5040::/32 it +2a05:5080::/32 ru +2a05:50a0::/32 ro +2a05:50c0::/32 iq +2a05:5100::/32 de +2a05:5140::/32 nl +2a05:5180::/32 nl +2a05:51c0::/32 ch +2a05:5200::/32 gb +2a05:5240::/32 gb +2a05:5280::/32 es +2a05:52a0::/32 nl +2a05:52c0::/32 ru +2a05:5300::/32 ie +2a05:5340::/32 nl +2a05:5380::/32 pl +2a05:53c0::/32 ru +2a05:5400::/32 ir +2a05:5440::/32 ir +2a05:5480::/32 nl +2a05:54c0::/32 ru +2a05:5500::/32 at +2a05:5540::/32 lv +2a05:5580::/32 se +2a05:55c0::/32 iq +2a05:5600::/32 fr +2a05:5640::/32 fr +2a05:5680::/32 ro +2a05:56c0::/32 gb +2a05:5700::/32 ro +2a05:5740::/32 ua +2a05:5780::/32 tr +2a05:57c0::/32 de +2a05:5800::/32 de +2a05:5840::/32 ru +2a05:5880::/32 no +2a05:58c0::/32 fr +2a05:5900::/32 de +2a05:5940::/32 de +2a05:5980::/32 ir +2a05:59c0::/32 fr +2a05:5a00::/32 gb +2a05:5a40::/32 de +2a05:5a80::/32 de +2a05:5ac0::/32 nl +2a05:5b00::/32 gb +2a05:5b40::/32 de +2a05:5b80::/32 lb +2a05:5bc0::/32 mk +2a05:5c00::/32 fr +2a05:5c40::/32 ru +2a05:5c80::/32 es +2a05:5cc0::/32 es +2a05:5d00::/32 ru +2a05:5d40::/32 es +2a05:5d80::/32 mk +2a05:5dc0::/32 ru +2a05:5e00::/32 ae +2a05:5e40::/32 bg +2a05:5e80::/32 ie +2a05:5ec0::/32 tr +2a05:5f00::/32 nl +2a05:5f40::/32 be +2a05:5f80::/32 gb +2a05:5fc0::/32 cz +2a05:6000::/32 ge +2a05:6040::/32 gb +2a05:6080::/32 it +2a05:60c0::/32 tr +2a05:6100::/32 tr +2a05:6140::/32 gb +2a05:6180::/32 it +2a05:61c0::/32 ch +2a05:6200::/32 nl +2a05:6240::/32 de +2a05:6280::/32 lt +2a05:62c0::/32 de +2a05:6300::/32 lt +2a05:6340::/32 fr +2a05:6380::/32 no +2a05:63c0::/32 ru +2a05:6400::/32 be +2a05:6440::/32 nl +2a05:6480::/32 ir +2a05:64c0::/32 tr +2a05:6500::/32 es +2a05:6540::/32 ru +2a05:6580::/32 es +2a05:65c0::/32 es +2a05:6600::/32 ir +2a05:6640::/32 va +2a05:6680::/32 it +2a05:66c0::/32 ru +2a05:6700::/32 ro +2a05:6740::/32 at +2a05:6780::/32 ru +2a05:67c0::/32 it +2a05:6800::/32 it +2a05:6840::/32 ru +2a05:6880::/32 gb +2a05:68c0::/32 de +2a05:6900::/32 ru +2a05:6940::/32 es +2a05:6980::/32 ru +2a05:69c0::/32 ru +2a05:6a00::/32 ch +2a05:6a40::/32 ru +2a05:6a80::/32 be +2a05:6ac0::/32 ch +2a05:6b00::/32 gb +2a05:6b40::/32 es +2a05:6b80::/32 pl +2a05:6bc0::/32 de +2a05:6c00::/32 gb +2a05:6c40::/32 gb +2a05:6c80::/32 nl +2a05:6cc0::/32 nl +2a05:6d00::/32 gb +2a05:6d40::/32 no +2a05:6d80::/32 ru +2a05:6dc0::/32 no +2a05:6e00::/32 fr +2a05:6e40::/32 gb +2a05:6e80::/32 ru +2a05:6ec0::/32 pl +2a05:6f00::/32 is +2a05:6f40::/32 ae +2a05:6f80::/32 tr +2a05:6fc0::/32 tr +2a05:7000::/32 ch +2a05:7040::/32 gb +2a05:7080::/32 es +2a05:70c0::/32 hr +2a05:7100::/32 pl +2a05:7140::/32 md +2a05:7180::/32 de +2a05:71c0::/32 ch +2a05:7200::/32 ir +2a05:7240::/32 de +2a05:7280::/32 ru +2a05:72c0::/32 gb +2a05:7300::/32 gb +2a05:7340::/32 lu +2a05:7380::/32 de +2a05:73c0::/32 bg +2a05:7400::/32 ru +2a05:7440::/32 es +2a05:7480::/32 ch +2a05:74c0::/32 jo +2a05:7500::/32 jo +2a05:7540::/32 pt +2a05:7580::/32 ir +2a05:75c0::/32 de +2a05:7600::/32 gb +2a05:7640::/32 nl +2a05:7680::/32 fr +2a05:76c0::/32 gb +2a05:7700::/32 se +2a05:7740::/32 si +2a05:7780::/32 de +2a05:77c0::/32 pl +2a05:7800::/32 pt +2a05:7840::/32 rs +2a05:7880::/32 tr +2a05:78c0::/32 sa +2a05:7900::/32 es +2a05:7940::/32 gb +2a05:7980::/32 fr +2a05:79c0::/32 nl +2a05:7a00::/32 iq +2a05:7a40::/32 ye +2a05:7a80::/32 gb +2a05:7ac0::/32 de +2a05:7b00::/32 no +2a05:7b40::/32 me +2a05:7b80::/32 gb +2a05:7bc0::/32 gb +2a05:7c00::/32 rs +2a05:7c40::/32 lu +2a05:7c80::/32 gb +2a05:7cc0::/32 lt +2a05:7d00::/32 gb +2a05:7d40::/32 tr +2a05:7d80::/32 ye +2a05:7dc0::/32 de +2a05:7de0::/32 ir +2a05:7e00::/32 ch +2a05:7e40::/32 de +2a05:7e80::/32 ru +2a05:7ec0::/32 cz +2a05:7f00::/32 at +2a05:7f40::/32 pl +2a05:7f80::/32 de +2a05:7fc0::/32 gb +2a05:8000::/32 ch +2a05:8040::/32 ir +2a05:8080::/32 ie +2a05:80c0::/32 gb +2a05:8100::/32 de +2a05:8140::/32 ch +2a05:8180::/32 se +2a05:81c0::/32 ru +2a05:8200::/32 az +2a05:8240::/32 de +2a05:8280::/32 de +2a05:82c0::/32 az +2a05:8300::/32 al +2a05:8340::/32 az +2a05:8380::/32 se +2a05:83c0::/32 at +2a05:8400::/32 nl +2a05:8440::/32 gb +2a05:8480::/32 hu +2a05:84c0::/32 ro +2a05:8500::/32 cy +2a05:8540::/32 ir +2a05:8580::/32 fi +2a05:85c0::/32 ie +2a05:8600::/32 es +2a05:8640::/32 ir +2a05:8680::/32 gb +2a05:86c0::/32 ge +2a05:8700::/32 lv +2a05:8740::/32 es +2a05:8780::/32 de +2a05:87c0::/32 gb +2a05:8800::/32 lb +2a05:8840::/32 dk +2a05:8880::/32 ro +2a05:88a0::/32 ch +2a05:88c0::/32 tr +2a05:8900::/32 at +2a05:8940::/32 gb +2a05:8980::/32 ru +2a05:89c0::/32 gb +2a05:8a00::/32 tr +2a05:8a40::/32 gb +2a05:8a80::/32 gb +2a05:8ac0::/32 ru +2a05:8b00::/32 lb +2a05:8b40::/32 il +2a05:8b80::/32 de +2a05:8bc0::/32 ru +2a05:8c00::/32 gi +2a05:8c40::/32 fi +2a05:8c80::/32 ie +2a05:8cc0::/32 bg +2a05:8d00::/32 gb +2a05:8d40::/32 il +2a05:8d80::/32 ie +2a05:8dc0::/32 gb +2a05:8e00::/32 es +2a05:8e40::/32 de +2a05:8e80::/32 gb +2a05:8ec0::/32 lb +2a05:8f00::/32 ch +2a05:8f40::/32 nl +2a05:8f80::/32 it +2a05:8fc0::/32 rs +2a05:9000::/32 sa +2a05:9040::/32 ch +2a05:9080::/32 ir +2a05:90c0::/32 nl +2a05:9100::/32 fi +2a05:9140::/32 de +2a05:9180::/32 nl +2a05:91c0::/32 ro +2a05:9200::/32 ru +2a05:9240::/32 ir +2a05:9280::/32 nl +2a05:92c0::/32 nl +2a05:9300::/32 nl +2a05:9340::/32 nl +2a05:9380::/32 gb +2a05:93c0::/32 nl +2a05:9400::/32 bg +2a05:9480::/32 iq +2a05:94c0::/32 ir +2a05:9500::/32 tr +2a05:9540::/32 it +2a05:9580::/32 hu +2a05:95c0::/32 tr +2a05:9600::/32 ie +2a05:9640::/32 gb +2a05:9680::/32 pl +2a05:96c0::/32 nl +2a05:9700::/32 fr +2a05:9740::/32 lb +2a05:9780::/32 gb +2a05:97c0::/32 ge +2a05:9800::/32 gb +2a05:9840::/32 be +2a05:9880::/32 gb +2a05:98c0::/32 gb +2a05:9900::/32 lt +2a05:9940::/32 ir +2a05:9980::/32 es +2a05:99c0::/32 ir +2a05:9a00::/32 ir +2a05:9a40::/32 fr +2a05:9a80::/32 ch +2a05:9ac0::/32 no +2a05:9b00::/32 es +2a05:9b40::/32 az +2a05:9b80::/32 be +2a05:9bc0::/32 tr +2a05:9c00::/32 gb +2a05:9c40::/32 gb +2a05:9c80::/32 us +2a05:9cc0::/32 no +2a05:9d00::/32 gb +2a05:9d40::/32 it +2a05:9d80::/32 ir +2a05:9dc0::/32 it +2a05:9e00::/32 il +2a05:9e40::/32 ir +2a05:9e80::/32 fi +2a05:9ec0::/32 tr +2a05:9f00::/32 pt +2a05:9f40::/32 eu +2a05:9f80::/32 de +2a05:9fc0::/32 ir +2a05:a000::/32 ru +2a05:a040::/32 pt +2a05:a080::/32 ru +2a05:a0c0::/32 de +2a05:a100::/32 mk +2a05:a140::/32 se +2a05:a180::/32 nl +2a05:a1c0::/32 de +2a05:a200::/32 ru +2a05:a240::/32 es +2a05:a280::/32 nl +2a05:a2c0::/32 sa +2a05:a300::/32 gb +2a05:a340::/32 gb +2a05:a380::/32 ir +2a05:a3c0::/32 it +2a05:a400::/32 ru +2a05:a440::/32 it +2a05:a480::/32 fr +2a05:a4c0::/32 es +2a05:a500::/32 fr +2a05:a540::/32 it +2a05:a580::/32 it +2a05:a5c0::/32 gr +2a05:a600::/32 dk +2a05:a640::/32 nl +2a05:a680::/32 ru +2a05:a6c0::/32 ir +2a05:a700::/32 ru +2a05:a740::/32 tr +2a05:a780::/32 gb +2a05:a7c0::/32 ru +2a05:a800::/32 es +2a05:a840::/32 ch +2a05:a880::/32 de +2a05:a8c0::/32 sy +2a05:a900::/32 dk +2a05:a940::/32 de +2a05:a980::/32 ie +2a05:a9c0::/32 at +2a05:aa00::/32 sk +2a05:aa40::/32 gb +2a05:aa80::/32 fi +2a05:aac0::/32 no +2a05:ab00::/32 gb +2a05:ab40::/32 gb +2a05:ab80::/32 ir +2a05:abc0::/32 tr +2a05:ac00::/32 gb +2a05:ac40::/32 ch +2a05:ac80::/32 tr +2a05:acc0::/32 si +2a05:ad00::/32 ch +2a05:ad40::/32 ch +2a05:ad80::/32 se +2a05:adc0::/32 ru +2a05:ae00::/32 it +2a05:ae40::/32 de +2a05:ae80::/32 ch +2a05:aec0::/32 de +2a05:af00::/32 es +2a05:af40::/32 tr +2a05:af80::/32 de +2a05:afc0::/32 fr +2a05:b000::/32 be +2a05:b040::/32 ch +2a05:b080::/32 fi +2a05:b0c0::/32 gb +2a05:b100::/32 gb +2a05:b140::/32 tr +2a05:b1c0::/32 ir +2a05:b200::/32 ru +2a05:b240::/32 it +2a05:b280::/32 gb +2a05:b2c0::/32 tr +2a05:b300::/32 fr +2a05:b340::/32 ua +2a05:b380::/32 tr +2a05:b3c0::/32 fr +2a05:b400::/32 es +2a05:b440::/32 tr +2a05:b480::/32 gb +2a05:b4c0::/32 il +2a05:b500::/32 fr +2a05:b540::/32 de +2a05:b580::/32 it +2a05:b5c0::/32 ua +2a05:b600::/32 sm +2a05:b640::/32 fr +2a05:b680::/32 ro +2a05:b6c0::/32 es +2a05:b700::/32 tr +2a05:b740::/32 it +2a05:b780::/32 fr +2a05:b7c0::/32 ru +2a05:b800::/32 cz +2a05:b840::/32 de +2a05:b880::/32 se +2a05:b900::/32 tr +2a05:b940::/32 de +2a05:b980::/32 lb +2a05:b9c0::/32 fi +2a05:ba00::/32 tr +2a05:ba40::/32 ir +2a05:ba80::/32 it +2a05:bac0::/32 tr +2a05:bb00::/32 it +2a05:bb40::/32 fr +2a05:bb80::/32 il +2a05:bbc0::/32 nl +2a05:bc00::/32 mt +2a05:bc40::/32 es +2a05:bc80::/32 gb +2a05:bcc0::/32 es +2a05:bd00::/32 de +2a05:bd40::/32 fr +2a05:bd80::/32 gb +2a05:bdc0::/32 it +2a05:be00::/32 be +2a05:be40::/32 no +2a05:be80::/32 gb +2a05:bec0::/32 de +2a05:bf00::/32 tr +2a05:bf40::/32 gb +2a05:bf80::/32 it +2a05:bfc0::/32 it +2a05:c000::/32 ir +2a05:c040::/32 ch +2a05:c080::/32 nl +2a05:c100::/32 fr +2a05:c140::/32 ru +2a05:c180::/32 gb +2a05:c1c0::/32 tr +2a05:c200::/32 be +2a05:c240::/32 es +2a05:c280::/32 de +2a05:c2c0::/32 se +2a05:c300::/32 lb +2a05:c340::/32 de +2a05:c380::/32 pl +2a05:c3c0::/32 pl +2a05:c400::/32 gb +2a05:c440::/32 nl +2a05:c480::/32 gb +2a05:c4c0::/32 nl +2a05:c500::/32 ru +2a05:c540::/32 gb +2a05:c580::/32 nl +2a05:c5c0::/32 ro +2a05:c600::/32 nl +2a05:c640::/32 tr +2a05:c680::/32 at +2a05:c6c0::/32 it +2a05:c700::/32 de +2a05:c740::/32 se +2a05:c780::/32 es +2a05:c7c0::/32 es +2a05:c800::/32 pt +2a05:c840::/32 gr +2a05:c880::/32 kg +2a05:c8c0::/32 ru +2a05:c900::/32 it +2a05:c940::/32 no +2a05:c980::/32 gb +2a05:c9c0::/32 nl +2a05:ca00::/32 it +2a05:ca40::/32 ch +2a05:ca80::/32 de +2a05:cac0::/32 cz +2a05:cb00::/32 nl +2a05:cb40::/32 ro +2a05:cb80::/32 nl +2a05:cbc0::/32 ru +2a05:cc00::/32 de +2a05:cc40::/32 ru +2a05:cc80::/32 ru +2a05:ccc0::/32 tr +2a05:cd00::/32 ir +2a05:cd40::/32 it +2a05:cd80::/32 nl +2a05:cdc0::/32 fr +2a05:ce00::/32 es +2a05:ce40::/32 fi +2a05:ce80::/32 ru +2a05:cec0::/32 de +2a05:cf00::/32 de +2a05:cf40::/32 de +2a05:cf80::/32 ru +2a05:cfc0::/32 nl +2a05:d000::/32 ie +2a05:d400::/32 ru +2a05:d440::/32 ru +2a05:d480::/32 nl +2a05:d4c0::/32 de +2a05:d500::/32 de +2a05:d580::/32 de +2a05:d5c0::/32 ge +2a05:d600::/32 lb +2a05:d640::/32 iq +2a05:d680::/32 pl +2a05:d6c0::/32 pl +2a05:d700::/32 us +2a05:d740::/32 ir +2a05:d780::/32 ua +2a05:d7c0::/32 sa +2a05:d800::/32 mk +2a05:d840::/32 gb +2a05:d880::/32 de +2a05:d900::/32 nl +2a05:d940::/32 ch +2a05:d980::/32 de +2a05:d9c0::/32 at +2a05:da00::/32 it +2a05:da40::/32 at +2a05:da80::/32 ro +2a05:dac0::/32 ch +2a05:db00::/32 gb +2a05:db40::/32 gb +2a05:db80::/32 it +2a05:dbc0::/32 hr +2a05:dc00::/32 fr +2a05:dc40::/32 de +2a05:dc80::/32 gb +2a05:dcc0::/32 ch +2a05:dd00::/32 tr +2a05:dd40::/32 fr +2a05:dd80::/32 at +2a05:ddc0::/32 ru +2a05:de00::/32 ru +2a05:de40::/32 gb +2a05:de80::/32 fr +2a05:dec0::/32 cy +2a05:df00::/32 fr +2a05:df40::/32 pt +2a05:df80::/32 hu +2a05:dfc0::/32 gb +2a05:e000::/32 dk +2a05:e040::/32 kz +2a05:e080::/32 ie +2a05:e0c0::/32 es +2a05:e100::/32 ch +2a05:e140::/32 de +2a05:e180::/32 de +2a05:e1c0::/32 nl +2a05:e200::/32 gb +2a05:e240::/32 ru +2a05:e280::/32 es +2a05:e2c0::/32 de +2a05:e300::/32 sk +2a05:e340::/32 no +2a05:e380::/32 lb +2a05:e3c0::/32 at +2a05:e400::/32 es +2a05:e440::/32 ru +2a05:e480::/32 fr +2a05:e4c0::/32 nl +2a05:e500::/32 iq +2a05:e540::/32 ru +2a05:e580::/32 ch +2a05:e5c0::/32 tr +2a05:e600::/32 az +2a05:e640::/32 ru +2a05:e680::/32 nl +2a05:e6c0::/32 es +2a05:e700::/32 de +2a05:e740::/32 de +2a05:e780::/32 ir +2a05:e7c0::/32 fr +2a05:e800::/32 sk +2a05:e840::/32 se +2a05:e880::/32 no +2a05:e8c0::/32 es +2a05:e900::/32 ua +2a05:e940::/32 gb +2a05:e980::/32 de +2a05:e9c0::/32 nl +2a05:ea00::/32 ru +2a05:ea40::/32 es +2a05:ea80::/32 gb +2a05:eac0::/32 ru +2a05:eb00::/32 it +2a05:eb20::/32 be +2a05:eb40::/32 no +2a05:eb80::/32 it +2a05:ebc0::/32 cz +2a05:ec00::/32 cz +2a05:ec40::/32 ru +2a05:ec80::/32 ae +2a05:ecc0::/32 gb +2a05:ed00::/32 it +2a05:ed40::/32 es +2a05:ed80::/32 de +2a05:edc0::/32 ru +2a05:ee00::/32 ge +2a05:ee40::/32 es +2a05:ee80::/32 it +2a05:eec0::/32 no +2a05:ef00::/32 tr +2a05:ef40::/32 nl +2a05:ef80::/32 ir +2a05:efc0::/32 ir +2a05:f000::/32 tr +2a05:f040::/32 kz +2a05:f080::/32 nl +2a05:f0c0::/32 ru +2a05:f100::/32 se +2a05:f140::/32 am +2a05:f180::/32 fr +2a05:f1c0::/32 ie +2a05:f200::/32 az +2a05:f240::/32 de +2a05:f280::/32 pl +2a05:f2c0::/32 ro +2a05:f300::/32 es +2a05:f340::/32 it +2a05:f380::/32 be +2a05:f3c0::/32 pl +2a05:f400::/32 ch +2a05:f440::/32 fr +2a05:f480::/32 fr +2a05:f4c0::/32 ro +2a05:f540::/32 fr +2a05:f580::/32 gb +2a05:f5c0::/32 hu +2a05:f600::/32 fr +2a05:f640::/32 ru +2a05:f680::/32 es +2a05:f6c0::/32 dk +2a05:f700::/32 dk +2a05:f740::/32 tr +2a05:f780::/32 de +2a05:f7c0::/32 tr +2a05:f800::/32 pl +2a05:f840::/32 nl +2a05:f880::/32 ru +2a05:f8c0::/32 pl +2a05:f900::/32 ro +2a05:f940::/32 de +2a05:f980::/32 es +2a05:f9c0::/32 fr +2a05:fa00::/32 pl +2a05:fa40::/32 de +2a05:fa80::/32 es +2a05:fac0::/32 fr +2a05:fb00::/32 se +2a05:fb80::/32 de +2a05:fbc0::/32 tr +2a05:fbe0::/32 cz +2a05:fc00::/32 at +2a05:fc40::/32 de +2a05:fc80::/32 ch +2a05:fcc0::/32 it +2a05:fd00::/32 gb +2a05:fd40::/32 lb +2a05:fd80::/32 be +2a05:fdc0::/32 al +2a05:fe00::/32 it +2a05:fe40::/32 tr +2a05:fe80::/32 de +2a05:fec0::/32 tr +2a05:ff00::/32 de +2a05:ff40::/32 se +2a05:ff80::/32 ch +2a05:ffc0::/32 pl +2a06::/29 it +2a06:40::/32 nl +2a06:80::/32 se +2a06:c0::/32 se +2a06:100::/32 it +2a06:140::/32 gb +2a06:180::/32 rs +2a06:1c0::/32 de +2a06:200::/32 de +2a06:240::/32 lb +2a06:280::/32 kw +2a06:2c0::/32 se +2a06:300::/32 ru +2a06:340::/32 nl +2a06:380::/32 tr +2a06:3c0::/32 pl +2a06:400::/32 cz +2a06:440::/32 se +2a06:480::/32 de +2a06:4c0::/32 bg +2a06:540::/32 de +2a06:580::/32 kz +2a06:5c0::/32 it +2a06:600::/32 il +2a06:640::/32 se +2a06:680::/32 gb +2a06:6c0::/32 es +2a06:700::/32 no +2a06:740::/32 nl +2a06:780::/32 hu +2a06:7c0::/32 it +2a06:800::/32 nl +2a06:840::/32 it +2a06:880::/32 it +2a06:8c0::/32 de +2a06:900::/32 nl +2a06:940::/32 kz +2a06:980::/32 ch +2a06:9c0::/32 gr +2a06:a00::/32 gb +2a06:a40::/32 nl +2a06:a80::/32 tr +2a06:ac0::/32 ch +2a06:b00::/32 dk +2a06:b40::/32 gb +2a06:b80::/32 gb +2a06:bc0::/32 ir +2a06:c00::/32 ch +2a06:c40::/32 gb +2a06:cc0::/32 sk +2a06:d00::/32 it +2a06:d40::/32 us +2a06:d80::/32 gb +2a06:dc0::/32 it +2a06:e00::/32 nl +2a06:e40::/32 gb +2a06:e80::/32 nl +2a06:ec0::/32 gb +2a06:f00::/32 tr +2a06:f40::/32 tr +2a06:f80::/32 es +2a06:fc0::/32 ru +2a06:1000::/32 se +2a06:1040::/32 pl +2a06:1080::/32 de +2a06:10c0::/32 de +2a06:1100::/32 ie +2a06:1140::/32 ru +2a06:1180::/32 nl +2a06:11c0::/32 ro +2a06:1200::/32 fr +2a06:1240::/32 cz +2a06:1280::/32 by +2a06:12c0::/32 de +2a06:1300::/32 rs +2a06:1340::/32 pl +2a06:1380::/32 it +2a06:13c0::/32 gb +2a06:1400::/32 dk +2a06:1440::/32 es +2a06:1480::/32 nl +2a06:14c0::/32 ir +2a06:1500::/32 fr +2a06:1540::/32 de +2a06:1580::/32 ge +2a06:15c0::/32 fr +2a06:1600::/32 gb +2a06:1680::/32 es +2a06:16c0::/32 kw +2a06:1700::/32 ro +2a06:1740::/32 gb +2a06:1780::/32 lu +2a06:17c0::/32 es +2a06:1800::/32 de +2a06:1840::/32 nl +2a06:1880::/32 es +2a06:18c0::/32 gb +2a06:1900::/32 cz +2a06:1940::/32 li +2a06:1980::/32 pl +2a06:19c0::/32 fr +2a06:1a00::/32 kz +2a06:1a40::/32 ch +2a06:1a80::/32 de +2a06:1ac0::/32 gb +2a06:1b00::/32 ch +2a06:1b40::/32 nl +2a06:1b80::/32 gb +2a06:1bc0::/32 gb +2a06:1c00::/32 ie +2a06:1c40::/32 de +2a06:1c80::/32 nl +2a06:1cc0::/32 fi +2a06:1d00::/32 nl +2a06:1d40::/32 gb +2a06:1d80::/32 ch +2a06:1dc0::/32 pl +2a06:1e00::/32 pl +2a06:1e40::/32 de +2a06:1e80::/32 be +2a06:1ec0::/32 gb +2a06:1f00::/32 it +2a06:1f40::/32 de +2a06:1f80::/32 es +2a06:1fc0::/32 ro +2a06:2000::/32 pt +2a06:2040::/32 fr +2a06:2080::/32 it +2a06:20c0::/32 fi +2a06:2140::/32 cz +2a06:2180::/32 sk +2a06:21c0::/32 nl +2a06:2200::/32 ir +2a06:2240::/32 no +2a06:2280::/32 ua +2a06:22c0::/32 gb +2a06:2300::/32 no +2a06:2340::/32 de +2a06:2380::/32 de +2a06:23c0::/32 de +2a06:2400::/32 no +2a06:2440::/32 es +2a06:2480::/32 gb +2a06:24c0::/32 gb +2a06:2500::/32 ru +2a06:2540::/32 fr +2a06:2580::/32 ua +2a06:25c0::/32 nl +2a06:2600::/32 nl +2a06:2640::/32 de +2a06:2680::/32 ru +2a06:26c0::/32 pl +2a06:2700::/32 ro +2a06:2740::/32 fr +2a06:2780::/32 de +2a06:27c0::/32 gb +2a06:2800::/32 de +2a06:2840::/32 gb +2a06:2880::/32 ru +2a06:28c0::/32 cz +2a06:2900::/32 de +2a06:2940::/32 ru +2a06:2980::/32 se +2a06:29c0::/32 nl +2a06:2a00::/32 de +2a06:2a40::/32 gb +2a06:2a80::/32 nl +2a06:2ac0::/32 ir +2a06:2b00::/32 gb +2a06:2b40::/32 ua +2a06:2b80::/32 es +2a06:2bc0::/32 dk +2a06:2c00::/32 ir +2a06:2c40::/32 sk +2a06:2c80::/32 ro +2a06:2cc0::/32 de +2a06:2d00::/32 tr +2a06:2d40::/32 nl +2a06:2d80::/32 ru +2a06:2dc0::/32 ru +2a06:2e00::/32 gb +2a06:2e40::/32 tr +2a06:2e80::/32 nl +2a06:2ec0::/32 nl +2a06:2f00::/32 qa +2a06:2f40::/32 se +2a06:2f80::/32 de +2a06:2fc0::/32 fr +2a06:3000::/32 gb +2a06:3040::/32 ge +2a06:3080::/32 nl +2a06:30c0::/32 de +2a06:3100::/32 nl +2a06:3180::/32 sa +2a06:31c0::/32 no +2a06:3200::/32 de +2a06:3240::/32 nl +2a06:3280::/32 it +2a06:32c0::/32 ir +2a06:3300::/32 de +2a06:3340::/32 no +2a06:3380::/32 de +2a06:33c0::/32 gb +2a06:3400::/32 gb +2a06:3440::/32 dk +2a06:3480::/32 lb +2a06:34c0::/32 de +2a06:3500::/32 be +2a06:3540::/32 gb +2a06:3580::/32 se +2a06:35c0::/32 es +2a06:3600::/32 es +2a06:3640::/32 se +2a06:3680::/32 it +2a06:36c0::/32 gb +2a06:3700::/32 de +2a06:3740::/32 ua +2a06:3780::/32 gb +2a06:37c0::/32 es +2a06:3800::/32 nl +2a06:3840::/32 be +2a06:3880::/32 nl +2a06:38c0::/32 it +2a06:3900::/32 cz +2a06:3940::/32 ir +2a06:3980::/32 at +2a06:39c0::/32 it +2a06:3a00::/32 se +2a06:3a40::/32 nl +2a06:3a80::/32 de +2a06:3ac0::/32 gr +2a06:3b00::/32 tr +2a06:3b40::/32 be +2a06:3b80::/32 il +2a06:3bc0::/32 es +2a06:3c00::/32 es +2a06:3c40::/32 at +2a06:3c80::/32 cy +2a06:3cc0::/32 gb +2a06:3d00::/32 gr +2a06:3d40::/32 ru +2a06:3d80::/32 nl +2a06:3e00::/32 de +2a06:3e40::/32 de +2a06:3e80::/32 nl +2a06:3ec0::/32 nl +2a06:3f00::/32 gb +2a06:3f80::/32 es +2a06:3fc0::/32 gb +2a06:4000::/32 dk +2a06:4040::/32 dk +2a06:4080::/32 es +2a06:40c0::/32 es +2a06:4100::/32 nl +2a06:4140::/32 nl +2a06:4180::/32 ru +2a06:41c0::/32 tr +2a06:4200::/32 iq +2a06:4240::/32 qa +2a06:4280::/32 fr +2a06:42c0::/32 it +2a06:4300::/32 es +2a06:4340::/32 is +2a06:4380::/32 tr +2a06:43c0::/32 ru +2a06:4400::/32 cz +2a06:4440::/32 it +2a06:4480::/32 ru +2a06:44c0::/32 es +2a06:4500::/32 it +2a06:4540::/32 nl +2a06:4580::/32 de +2a06:45c0::/32 gb +2a06:4600::/32 de +2a06:4640::/32 kw +2a06:4680::/32 ru +2a06:46c0::/32 ro +2a06:4700::/32 ro +2a06:4740::/32 ro +2a06:4780::/32 es +2a06:47c0::/32 ru +2a06:4800::/32 es +2a06:4840::/32 ie +2a06:4880::/32 pl +2a06:48c0::/32 pl +2a06:4900::/32 de +2a06:4940::/32 lu +2a06:4980::/32 lv +2a06:4a00::/32 pt +2a06:4a40::/32 ro +2a06:4a80::/32 nl +2a06:4ac0::/32 cz +2a06:4b00::/32 de +2a06:4b40::/32 tr +2a06:4b80::/32 ir +2a06:4bc0::/32 gb +2a06:4c40::/32 ru +2a06:4c80::/32 nl +2a06:4cc0::/32 gb +2a06:4d00::/32 fr +2a06:4d40::/32 sa +2a06:4d80::/32 ie +2a06:4dc0::/32 it +2a06:4e00::/32 nl +2a06:4e40::/32 de +2a06:4e80::/32 gb +2a06:4ec0::/32 ua +2a06:4f00::/32 nl +2a06:4f40::/32 de +2a06:4f80::/32 gb +2a06:4fc0::/32 is +2a06:5000::/32 gb +2a06:5040::/32 nl +2a06:5080::/32 il +2a06:50c0::/32 nl +2a06:5100::/32 ch +2a06:5140::/32 it +2a06:5180::/32 tr +2a06:51c0::/32 pl +2a06:5200::/32 ie +2a06:5240::/32 de +2a06:5280::/32 ro +2a06:52c0::/32 ch +2a06:5300::/32 ru +2a06:5340::/32 es +2a06:5380::/32 de +2a06:53c0::/32 fr +2a06:5400::/32 de +2a06:5440::/32 ru +2a06:5480::/32 ir +2a06:5500::/32 bg +2a06:5540::/32 ps +2a06:5580::/32 il +2a06:55c0::/32 nl +2a06:5600::/32 ua +2a06:5640::/32 de +2a06:5680::/32 at +2a06:56c0::/32 ch +2a06:5700::/32 de +2a06:5740::/32 ge +2a06:5780::/32 ro +2a06:57c0::/32 ro +2a06:5800::/32 ro +2a06:5840::/32 no +2a06:5880::/32 de +2a06:58c0::/32 es +2a06:5900::/32 gb +2a06:5940::/32 fr +2a06:5980::/32 fr +2a06:59c0::/32 sa +2a06:5a00::/32 ir +2a06:5a40::/32 ir +2a06:5a80::/32 gb +2a06:5ac0::/32 fr +2a06:5b00::/32 ru +2a06:5b40::/32 gb +2a06:5b80::/32 nl +2a06:5bc0::/32 it +2a06:5c00::/32 nl +2a06:5c40::/32 at +2a06:5c80::/32 hu +2a06:5cc0::/32 ua +2a06:5d00::/32 de +2a06:5d40::/32 ru +2a06:5d80::/32 cz +2a06:5dc0::/32 nl +2a06:5e00::/32 ir +2a06:5e40::/32 se +2a06:5e80::/32 ch +2a06:5ec0::/32 hr +2a06:5f00::/32 de +2a06:5f40::/32 lt +2a06:5f80::/32 dk +2a06:5fc0::/32 nl +2a06:6000::/32 de +2a06:6040::/32 no +2a06:6080::/32 it +2a06:60c0::/32 es +2a06:6100::/32 es +2a06:6140::/32 fr +2a06:6180::/32 se +2a06:61c0::/32 gb +2a06:6200::/32 ua +2a06:6240::/32 cz +2a06:6280::/32 tr +2a06:62c0::/32 de +2a06:6300::/32 it +2a06:6340::/32 ch +2a06:6380::/32 es +2a06:63c0::/32 rs +2a06:6400::/32 ru +2a06:6440::/32 gb +2a06:6480::/32 ru +2a06:64c0::/32 ua +2a06:6500::/32 cz +2a06:6540::/32 ch +2a06:6580::/32 de +2a06:65c0::/32 it +2a06:6600::/32 gb +2a06:6640::/32 fr +2a06:6680::/32 tr +2a06:66c0::/32 ru +2a06:6700::/32 ch +2a06:6740::/32 gb +2a06:6780::/32 kz +2a06:67c0::/32 de +2a06:6800::/32 fr +2a06:6840::/32 gb +2a06:6880::/32 ru +2a06:68c0::/32 ru +2a06:6900::/32 nl +2a06:6940::/32 nl +2a06:6980::/32 at +2a06:69c0::/32 ir +2a06:6a00::/32 fr +2a06:6a40::/32 de +2a06:6a80::/32 nl +2a06:6ac0::/32 fr +2a06:6b00::/32 it +2a06:6b40::/32 tr +2a06:6b80::/32 gb +2a06:6bc0::/32 sk +2a06:6c00::/32 de +2a06:6c40::/32 tr +2a06:6c80::/32 nl +2a06:6cc0::/32 it +2a06:6d00::/32 ro +2a06:6d40::/32 it +2a06:6d80::/32 pl +2a06:6dc0::/32 no +2a06:6e00::/32 fr +2a06:6e40::/32 be +2a06:6e80::/32 de +2a06:6ec0::/32 nl +2a06:6f00::/32 de +2a06:6f40::/32 de +2a06:6f80::/32 nl +2a06:6fc0::/32 si +2a06:7000::/32 gb +2a06:7040::/32 at +2a06:7080::/32 ie +2a06:7100::/32 nl +2a06:7140::/32 ir +2a06:7180::/32 de +2a06:71c0::/32 de +2a06:7200::/32 de +2a06:7240::/32 at +2a06:7280::/32 it +2a06:72c0::/32 nl +2a06:7300::/32 ua +2a06:7340::/32 bg +2a06:7380::/32 de +2a06:73c0::/32 al +2a06:7400::/32 ro +2a06:7440::/32 fr +2a06:7480::/32 de +2a06:74c0::/32 tr +2a06:7500::/32 de +2a06:7540::/32 es +2a06:7580::/32 gb +2a06:75c0::/32 ro +2a06:7600::/32 gb +2a06:7640::/32 de +2a06:7680::/32 ro +2a06:76c0::/32 ge +2a06:7700::/32 ru +2a06:7740::/32 ru +2a06:7780::/32 it +2a06:77c0::/32 at +2a06:7800::/32 il +2a06:7840::/32 de +2a06:7880::/32 de +2a06:78c0::/32 ru +2a06:7900::/32 ro +2a06:7940::/32 ro +2a06:7980::/32 ir +2a06:79c0::/32 gb +2a06:7a00::/32 nl +2a06:7a40::/32 gb +2a06:7a80::/32 cz +2a06:7ac0::/32 it +2a06:7b00::/32 bg +2a06:7b40::/32 fi +2a06:7b80::/32 de +2a06:7bc0::/32 nl +2a06:7c00::/32 de +2a06:7c40::/32 nl +2a06:7c80::/32 nl +2a06:7cc0::/32 ir +2a06:7d00::/32 de +2a06:7d40::/32 at +2a06:7d80::/32 fr +2a06:7dc0::/32 tr +2a06:7e00::/32 gb +2a06:7e40::/32 nl +2a06:7e80::/32 ru +2a06:7ec0::/32 nl +2a06:7f00::/32 dk +2a06:7f40::/32 nl +2a06:7f80::/32 de +2a06:7fc0::/32 fr +2a06:8000::/32 nl +2a06:8040::/32 fr +2a06:8080::/32 cz +2a06:80c0::/32 de +2a06:8100::/32 bg +2a06:8140::/32 de +2a06:8180::/32 gb +2a06:81c0::/32 no +2a06:8200::/32 ir +2a06:8240::/32 my +2a06:8280::/32 ch +2a06:82c0::/32 fr +2a06:8340::/32 pl +2a06:8380::/32 ir +2a06:83c0::/32 pl +2a06:8400::/32 se +2a06:8440::/32 de +2a06:8480::/32 sa +2a06:84c0::/32 de +2a06:8500::/32 de +2a06:8540::/32 es +2a06:8580::/32 it +2a06:85c0::/32 de +2a06:8600::/32 no +2a06:8640::/32 gb +2a06:8680::/32 fi +2a06:86c0::/32 gb +2a06:8700::/32 ir +2a06:8740::/32 ru +2a06:8780::/32 de +2a06:87c0::/32 de +2a06:8800::/32 il +2a06:8840::/32 es +2a06:8880::/32 at +2a06:88c0::/32 nl +2a06:8900::/32 kz +2a06:8940::/32 gb +2a06:8980::/32 gb +2a06:89c0::/32 tr +2a06:8a00::/32 ch +2a06:8a40::/32 pl +2a06:8a80::/32 fi +2a06:8ac0::/32 gb +2a06:8b00::/32 pl +2a06:8b40::/32 gb +2a06:8b80::/32 fr +2a06:8bc0::/32 fr +2a06:8c00::/32 fr +2a06:8c40::/32 es +2a06:8c80::/32 ua +2a06:8cc0::/32 it +2a06:8d00::/32 ir +2a06:8d40::/32 nl +2a06:8d80::/32 gb +2a06:8dc0::/32 gb +2a06:8e00::/32 gb +2a06:8e40::/32 gb +2a06:8e80::/32 gb +2a06:8ec0::/32 gb +2a06:8f00::/32 al +2a06:8f40::/32 es +2a06:8f80::/32 fi +2a06:8fc0::/32 it +2a06:9000::/32 ua +2a06:9040::/32 de +2a06:9080::/32 tr +2a06:90c0::/32 ro +2a06:9100::/32 iq +2a06:9140::/32 tr +2a06:9180::/32 dk +2a06:91c0::/32 az +2a06:9200::/32 nl +2a06:9240::/32 it +2a06:9280::/32 cz +2a06:92c0::/32 us +2a06:9300::/32 us +2a06:9340::/32 fi +2a06:9380::/32 de +2a06:93c0::/32 nl +2a06:9400::/32 rs +2a06:9440::/32 de +2a06:9480::/32 it +2a06:94c0::/32 gb +2a06:9500::/32 de +2a06:9540::/32 ie +2a06:9580::/32 pl +2a06:95c0::/32 lu +2a06:9600::/32 ie +2a06:9640::/32 ir +2a06:9680::/32 bg +2a06:96c0::/32 at +2a06:9700::/32 ir +2a06:9740::/32 de +2a06:9780::/32 cz +2a06:97c0::/32 rs +2a06:9800::/32 gb +2a06:9840::/32 fr +2a06:98c0::/32 gb +2a06:9900::/32 no +2a06:9940::/32 es +2a06:9980::/32 ru +2a06:99c0::/32 es +2a06:9a00::/32 ir +2a06:9a40::/32 il +2a06:9a80::/32 gb +2a06:9ac0::/32 ch +2a06:9b00::/32 pl +2a06:9b40::/32 ir +2a06:9b80::/32 be +2a06:9bc0::/32 ru +2a06:9c00::/32 gb +2a06:9c40::/32 se +2a06:9c80::/32 it +2a06:9cc0::/32 at +2a06:9d00::/32 gb +2a06:9d40::/32 it +2a06:9d80::/32 ua +2a06:9dc0::/32 ua +2a06:9e00::/32 nl +2a06:9e40::/32 ua +2a06:9e80::/32 gb +2a06:9ec0::/32 ir +2a06:9f00::/32 bg +2a06:9f40::/32 no +2a06:9f80::/32 va +2a06:9fc0::/32 dk +2a06:a000::/32 is +2a06:a040::/32 tr +2a06:a080::/32 nl +2a06:a0c0::/32 fi +2a06:a100::/32 is +2a06:a140::/32 nl +2a06:a180::/32 ru +2a06:a1c0::/32 il +2a06:a200::/32 es +2a06:a240::/32 gb +2a06:a280::/32 sk +2a06:a2c0::/32 gb +2a06:a300::/32 pl +2a06:a340::/32 gb +2a06:a380::/32 gb +2a06:a3c0::/32 pl +2a06:a400::/32 fr +2a06:a440::/32 pl +2a06:a480::/32 ru +2a06:a4c0::/32 ir +2a06:a500::/32 fr +2a06:a540::/32 gb +2a06:a580::/32 no +2a06:a5c0::/32 nl +2a06:a600::/32 nl +2a06:a640::/32 ru +2a06:a680::/32 tr +2a06:a6c0::/32 es +2a06:a700::/32 nl +2a06:a740::/32 no +2a06:a780::/32 cz +2a06:a7c0::/32 gb +2a06:a800::/32 gb +2a06:a840::/32 nl +2a06:a880::/32 ro +2a06:a8c0::/32 de +2a06:a900::/32 ch +2a06:a940::/32 tr +2a06:a980::/32 it +2a06:a9c0::/32 ru +2a06:aa00::/32 ru +2a06:aa40::/32 pl +2a06:aa80::/32 ru +2a06:aac0::/32 ee +2a06:ab00::/32 nl +2a06:ab40::/32 ir +2a06:ab80::/32 es +2a06:abc0::/32 ir +2a06:ac00::/32 fr +2a06:ac40::/32 gb +2a06:ac80::/32 de +2a06:acc0::/32 ru +2a06:ad00::/32 no +2a06:ad40::/32 tr +2a06:ad80::/32 fr +2a06:adc0::/32 tr +2a06:ae00::/32 fi +2a06:ae40::/32 fi +2a06:ae80::/32 es +2a06:aec0::/32 ru +2a06:af00::/32 pl +2a06:af40::/32 is +2a06:af80::/32 ir +2a06:afc0::/32 ro +2a06:b000::/32 ch +2a06:b040::/32 no +2a06:b080::/32 de +2a06:b0c0::/32 no +2a06:b100::/32 fi +2a06:b140::/32 no +2a06:b180::/32 es +2a06:b1c0::/32 pl +2a06:b200::/32 ir +2a06:b240::/32 gb +2a06:b280::/32 dk +2a06:b2c0::/32 pt +2a06:b300::/32 es +2a06:b340::/32 at +2a06:b380::/32 gb +2a06:b3c0::/32 ir +2a06:b400::/32 ru +2a06:b440::/32 ir +2a06:b480::/32 pl +2a06:b4c0::/32 ru +2a06:b500::/32 de +2a06:b540::/32 lb +2a06:b580::/32 de +2a06:b5c0::/32 nl +2a06:b600::/32 de +2a06:b640::/32 it +2a06:b680::/32 pl +2a06:b6c0::/32 nl +2a06:b700::/32 fi +2a06:b740::/32 dk +2a06:b780::/32 tr +2a06:b7c0::/32 nl +2a06:b800::/32 kz +2a06:b840::/32 fr +2a06:b880::/32 lb +2a06:b8c0::/32 lb +2a06:b900::/32 lb +2a06:b940::/32 lb +2a06:b980::/32 es +2a06:b9c0::/32 de +2a06:ba00::/32 dk +2a06:ba40::/32 nl +2a06:ba80::/32 ru +2a06:bac0::/32 cz +2a06:bb00::/32 pl +2a06:bb40::/32 ru +2a06:bb80::/32 gb +2a06:bbc0::/32 it +2a06:bc00::/32 ch +2a06:bc40::/32 us +2a06:bc80::/32 gb +2a06:bcc0::/32 de +2a06:bd00::/32 no +2a06:bd40::/32 nl +2a06:bd80::/32 is +2a06:be00::/32 de +2a06:be40::/32 it +2a06:be80::/32 de +2a06:bec0::/32 ir +2a06:bf00::/32 is +2a06:bf40::/32 nl +2a06:bf80::/32 de +2a06:bfc0::/32 sk +2a06:c000::/32 ru +2a06:c040::/32 de +2a06:c080::/32 dk +2a06:c0c0::/32 ua +2a06:c100::/32 it +2a06:c140::/32 at +2a06:c180::/32 si +2a06:c1c0::/32 nl +2a06:c200::/32 it +2a06:c240::/32 se +2a06:c280::/32 nl +2a06:c2c0::/32 it +2a06:c300::/32 dk +2a06:c340::/32 de +2a06:c380::/32 tr +2a06:c3c0::/32 ru +2a06:c400::/32 tr +2a06:c440::/32 fr +2a06:c480::/32 fr +2a06:c4c0::/32 at +2a06:c500::/32 at +2a06:c540::/32 fr +2a06:c580::/32 de +2a06:c5c0::/32 gb +2a06:c600::/32 de +2a06:c640::/32 de +2a06:c680::/32 ru +2a06:c6c0::/32 ru +2a06:c700::/32 il +2a06:c740::/32 no +2a06:c780::/32 fi +2a06:c7c0::/32 fi +2a06:c800::/32 fr +2a06:c840::/32 fi +2a06:c880::/32 it +2a06:c8c0::/32 nl +2a06:c900::/32 es +2a06:c940::/32 pl +2a06:c980::/32 es +2a06:c9c0::/32 dk +2a06:ca00::/32 gb +2a06:ca40::/32 gb +2a06:ca80::/32 ru +2a06:cac0::/32 ir +2a06:cb00::/32 lb +2a06:cb40::/32 nl +2a06:cb80::/32 ch +2a06:cbc0::/32 de +2a06:cc00::/32 ro +2a06:cc40::/32 ir +2a06:cc80::/32 no +2a06:ccc0::/32 it +2a06:cd00::/32 nl +2a06:cd40::/32 ro +2a06:cd80::/32 ir +2a06:cdc0::/32 pt +2a06:ce00::/32 es +2a06:ce40::/32 es +2a06:ce80::/32 nl +2a06:cec0::/32 ro +2a06:cf00::/32 de +2a06:cf40::/32 tr +2a06:cf80::/32 fi +2a06:cfc0::/32 it +2a06:d000::/32 ua +2a06:d040::/32 ch +2a06:d080::/32 es +2a06:d0c0::/32 fr +2a06:d100::/32 fr +2a06:d140::/32 gb +2a06:d180::/32 at +2a06:d1c0::/32 gb +2a06:d200::/32 ir +2a06:d240::/32 hu +2a06:d280::/32 ua +2a06:d2c0::/32 no +2a06:d300::/32 sy +2a06:d340::/32 de +2a06:d380::/32 dk +2a06:d3c0::/32 no +2a06:d400::/32 ir +2a06:d440::/32 it +2a06:d480::/32 dk +2a06:d4c0::/32 gb +2a06:d500::/32 at +2a06:d540::/32 cz +2a06:d580::/32 ch +2a06:d5c0::/32 gb +2a06:d600::/32 es +2a06:d640::/32 ru +2a06:d680::/32 de +2a06:d6c0::/32 lt +2a06:d700::/32 is +2a06:d740::/32 fr +2a06:d780::/32 pl +2a06:d7c0::/32 iq +2a06:d800::/32 ua +2a06:d840::/32 iq +2a06:d880::/32 fi +2a06:d8c0::/32 no +2a06:d900::/32 ru +2a06:d940::/32 ir +2a06:d980::/32 iq +2a06:d9c0::/32 ch +2a06:da00::/32 es +2a06:da40::/32 es +2a06:da80::/32 lt +2a06:dac0::/32 gb +2a06:db00::/32 dk +2a06:db40::/32 gb +2a06:db80::/32 ir +2a06:dbc0::/32 sk +2a06:dc00::/32 nl +2a06:dc40::/32 ru +2a06:dc80::/32 fr +2a06:dcc0::/32 no +2a06:dd00::/32 ru +2a06:dd40::/32 gb +2a06:dd80::/32 fr +2a06:ddc0::/32 ru +2a06:de00::/32 gb +2a06:de40::/32 it +2a06:de80::/32 fr +2a06:dec0::/32 pl +2a06:df00::/32 it +2a06:df40::/32 tr +2a06:df80::/32 bg +2a06:dfc0::/32 lt +2a06:e000::/32 ro +2a06:e040::/32 fr +2a06:e080::/32 ir +2a06:e0c0::/32 ru +2a06:e100::/32 gb +2a06:e140::/32 es +2a06:e180::/32 cz +2a06:e1c0::/32 fr +2a06:e200::/32 ru +2a06:e240::/32 es +2a06:e280::/32 gb +2a06:e2c0::/32 es +2a06:e300::/32 il +2a06:e340::/32 me +2a06:e380::/32 de +2a06:e3c0::/32 cz +2a06:e400::/32 de +2a06:e440::/32 kw +2a06:e480::/32 rs +2a06:e4c0::/32 ua +2a06:e500::/32 sk +2a06:e540::/32 es +2a06:e580::/32 it +2a06:e5c0::/32 rs +2a06:e600::/32 ru +2a06:e640::/32 pt +2a06:e680::/32 de +2a06:e6c0::/32 lu +2a06:e700::/32 de +2a06:e740::/32 ir +2a06:e780::/32 pl +2a06:e7c0::/32 fr +2a06:e800::/32 dk +2a06:e840::/32 es +2a06:e880::/32 ch +2a06:e8c0::/32 lv +2a06:e900::/32 hu +2a06:e940::/32 ru +2a06:e980::/32 fr +2a06:e9c0::/32 de +2a06:ea00::/32 it +2a06:ea40::/32 se +2a06:ea80::/32 de +2a06:eac0::/32 dk +2a06:eb00::/32 it +2a06:eb40::/32 de +2a06:eb80::/32 lb +2a06:ebc0::/32 lu +2a06:ec00::/32 de +2a06:ec40::/32 it +2a06:ec80::/32 gb +2a06:ecc0::/32 fi +2a06:ed00::/32 de +2a06:ed40::/32 cz +2a06:ed80::/32 tj +2a06:edc0::/32 de +2a06:ee00::/32 gb +2a06:ee40::/32 de +2a06:ee80::/32 iq +2a06:eec0::/32 nl +2a06:ef00::/32 fr +2a06:ef40::/32 de +2a06:ef80::/32 ru +2a06:efc0::/32 be +2a06:f000::/32 sk +2a06:f040::/32 fi +2a06:f080::/32 cz +2a06:f0c0::/32 es +2a06:f100::/32 ir +2a06:f140::/32 de +2a06:f180::/32 dk +2a06:f1c0::/32 fr +2a06:f200::/32 pl +2a06:f240::/32 dk +2a06:f280::/32 it +2a06:f2c0::/32 it +2a06:f300::/32 gb +2a06:f340::/32 it +2a06:f380::/32 es +2a06:f3c0::/32 pl +2a06:f400::/32 ru +2a06:f440::/32 cz +2a06:f480::/32 ch +2a06:f4c0::/32 be +2a06:f500::/32 in +2a06:f540::/32 cz +2a06:f580::/32 ru +2a06:f5c0::/32 gb +2a06:f600::/32 fr +2a06:f640::/32 gb +2a06:f680::/32 hu +2a06:f6c0::/32 cz +2a06:f700::/32 nl +2a06:f740::/32 lu +2a06:f780::/32 nl +2a06:f7c0::/32 tr +2a06:f800::/32 no +2a06:f840::/32 es +2a06:f880::/32 us +2a06:f8c0::/32 tr +2a06:f900::/32 nl +2a06:f940::/32 at +2a06:f980::/32 ie +2a06:f9c0::/32 nl +2a06:fa00::/32 ru +2a06:fa40::/32 tr +2a06:fa80::/32 no +2a06:fac0::/32 it +2a06:fb00::/32 bg +2a06:fb40::/32 cz +2a06:fb80::/32 at +2a06:fbc0::/32 de +2a06:fc00::/32 ru +2a06:fc40::/32 dk +2a06:fc80::/32 es +2a06:fcc0::/32 pl +2a06:fd00::/32 be +2a06:fd40::/32 de +2a06:fd80::/32 iq +2a06:fdc0::/32 ro +2a06:fe00::/32 ma +2a06:fe40::/32 uz +2a06:fe80::/32 cz +2a06:fec0::/32 be +2a06:ff00::/32 pl +2a06:ff40::/32 ua +2a06:ff80::/32 iq +2a06:ffc0::/32 cz +2a07::/29 gb +2a07:40::/32 ir +2a07:80::/32 nl +2a07:c0::/32 gb +2a07:100::/32 es +2a07:140::/32 jo +2a07:180::/32 ua +2a07:1c0::/32 fr +2a07:200::/32 by +2a07:240::/32 eu +2a07:280::/32 ru +2a07:2c0::/32 it +2a07:300::/32 lu +2a07:340::/32 nl +2a07:380::/32 ir +2a07:3c0::/32 cz +2a07:400::/32 gb +2a07:440::/32 de +2a07:480::/32 es +2a07:4c0::/32 cz +2a07:500::/32 ru +2a07:540::/32 ro +2a07:580::/32 ro +2a07:5c0::/32 ch +2a07:600::/32 ch +2a07:640::/32 no +2a07:680::/32 de +2a07:6c0::/32 se +2a07:700::/32 it +2a07:740::/32 kw +2a07:780::/32 it +2a07:7c0::/32 fr +2a07:800::/32 pl +2a07:840::/32 gb +2a07:880::/32 ru +2a07:8c0::/32 gr +2a07:900::/32 ch +2a07:940::/32 de +2a07:980::/32 fr +2a07:9c0::/32 cz +2a07:a00::/32 tr +2a07:a40::/32 de +2a07:a80::/32 nl +2a07:ac0::/32 gb +2a07:b00::/32 se +2a07:b40::/32 ru +2a07:b80::/32 gb +2a07:bc0::/32 cz +2a07:c00::/32 ru +2a07:c40::/32 no +2a07:c80::/32 ua +2a07:cc0::/32 nl +2a07:d00::/32 de +2a07:d40::/32 be +2a07:d80::/32 pl +2a07:dc0::/32 ru +2a07:e00::/32 gb +2a07:e40::/32 de +2a07:e80::/32 de +2a07:ec0::/32 dk +2a07:f00::/32 de +2a07:f40::/32 rs +2a07:f80::/32 gb +2a07:fc0::/32 is +2a07:1000::/32 ru +2a07:1040::/32 gb +2a07:1080::/32 ua +2a07:10c0::/32 nl +2a07:1100::/32 hu +2a07:1140::/32 ru +2a07:1180::/32 ee +2a07:11c0::/32 cz +2a07:1200::/32 fr +2a07:1240::/32 gb +2a07:1280::/32 it +2a07:12c0::/32 de +2a07:1300::/32 gb +2a07:1340::/32 ua +2a07:1380::/32 ir +2a07:13c0::/32 pl +2a07:1400::/32 dk +2a07:1440::/32 de +2a07:1480::/32 dk +2a07:14c0::/32 ru +2a07:1500::/32 gb +2a07:1540::/32 no +2a07:1580::/32 de +2a07:15c0::/32 tr +2a07:1600::/32 no +2a07:1640::/32 no +2a07:1680::/32 no +2a07:16c0::/32 es +2a07:1700::/32 no +2a07:1740::/32 de +2a07:1780::/32 ru +2a07:17c0::/32 ua +2a07:1800::/32 at +2a07:1840::/32 ru +2a07:1880::/32 it +2a07:18c0::/32 fr +2a07:1900::/32 fr +2a07:1940::/32 it +2a07:1980::/32 il +2a07:19c0::/32 fr +2a07:1a00::/32 es +2a07:1a40::/32 pl +2a07:1a80::/32 se +2a07:1ac0::/32 de +2a07:1b00::/32 gb +2a07:1b40::/32 gb +2a07:1b80::/32 at +2a07:1bc0::/32 pl +2a07:1c00::/32 de +2a07:1c40::/32 at +2a07:1c80::/32 se +2a07:1cc0::/32 pl +2a07:1d00::/32 ir +2a07:1d40::/32 ru +2a07:1d80::/32 fr +2a07:1dc0::/32 pl +2a07:1e00::/32 kz +2a07:1e40::/32 ru +2a07:1e80::/32 nl +2a07:1ec0::/32 it +2a07:1f00::/32 ch +2a07:1f40::/32 cz +2a07:1f80::/32 us +2a07:1fc0::/32 fr +2a07:2000::/32 iq +2a07:2040::/32 es +2a07:2080::/32 nl +2a07:20c0::/32 cz +2c0e::/20 eg +2c0e:2000::/32 za +2c0e:4000::/32 za +2c0f:f400::/32 za +2c0f:f408::/32 ke +2c0f:f410::/32 ng +2c0f:f418::/32 ng +2c0f:f420::/32 cv +2c0f:f428::/32 tz +2c0f:f430::/32 gh +2c0f:f438::/32 cv +2c0f:f440::/32 za +2c0f:f448::/32 za +2c0f:f450::/32 za +2c0f:f458::/32 ke +2c0f:f460::/32 za +2c0f:f468::/32 ke +2c0f:f470::/32 za +2c0f:f478::/32 za +2c0f:f480::/32 za +2c0f:f488::/32 za +2c0f:f490::/32 gh +2c0f:f498::/32 cv +2c0f:f4a0::/32 zw +2c0f:f4a8::/32 za +2c0f:f4b0::/32 za +2c0f:f4b8::/32 za +2c0f:f4c0::/32 za +2c0f:f4c8::/32 za +2c0f:f4d0::/32 ci +2c0f:f4d8::/32 cm +2c0f:f4e0::/32 za +2c0f:f4e8::/32 za +2c0f:f4f0::/32 za +2c0f:f4f8::/32 za +2c0f:f500::/32 za +2c0f:f508::/32 za +2c0f:f510::/32 mw +2c0f:f518::/32 ly +2c0f:f520::/32 ng +2c0f:f528::/32 za +2c0f:f530::/32 sc +2c0f:f538::/32 tz +2c0f:f540::/32 mz +2c0f:f548::/32 ke +2c0f:f550::/32 mu +2c0f:f558::/32 cd +2c0f:f560::/32 km +2c0f:f568::/32 cg +2c0f:f570::/32 za +2c0f:f578::/32 tg +2c0f:f580::/32 ke +2c0f:f588::/32 za +2c0f:f590::/32 ci +2c0f:f598::/32 za +2c0f:f5a0::/32 ng +2c0f:f5a8::/32 za +2c0f:f600::/32 gn +2c0f:f608::/32 re +2c0f:f610::/32 za +2c0f:f618::/32 gh +2c0f:f620::/32 ke +2c0f:f628::/32 rw +2c0f:f630::/32 bj +2c0f:f638::/32 ng +2c0f:f640::/32 ga +2c0f:f648::/32 td +2c0f:f650::/32 za +2c0f:f658::/32 ug +2c0f:f660::/32 cm +2c0f:f668::/32 za +2c0f:f670::/32 zm +2c0f:f678::/32 bw +2c0f:f680::/32 sc +2c0f:f688::/32 ke +2c0f:f690::/32 ss +2c0f:f698::/32 tn +2c0f:f6a0::/32 cm +2c0f:f6a8::/32 bi +2c0f:f6b0::/32 tz +2c0f:f6b8::/32 so +2c0f:f6c0::/32 cg +2c0f:f6c8::/32 cm +2c0f:f6d0::/32 ug +2c0f:f6d8::/32 za +2c0f:f6e0::/32 za +2c0f:f6e8::/32 za +2c0f:f6f0::/32 za +2c0f:f6f8::/32 za +2c0f:f700::/32 za +2c0f:f708::/32 za +2c0f:f710::/32 so +2c0f:f718::/32 bw +2c0f:f720::/32 za +2c0f:f728::/32 bw +2c0f:f730::/32 tz +2c0f:f738::/32 mu +2c0f:f740::/32 ao +2c0f:f748::/32 mu +2c0f:f750::/32 ug +2c0f:f758::/32 zw +2c0f:f760::/32 za +2c0f:f768::/32 ng +2c0f:f770::/32 bj +2c0f:f778::/32 na +2c0f:f780::/32 za +2c0f:f788::/32 bi +2c0f:f798::/32 za +2c0f:f7a0::/32 zw +2c0f:f7a8::/32 za +2c0f:f7b0::/32 tz +2c0f:f7b8::/32 za +2c0f:f7c0::/32 gh +2c0f:f7c8::/32 tn +2c0f:f7d0::/32 cm +2c0f:f7d8::/32 tz +2c0f:f7e0::/32 tn +2c0f:f7e8::/32 za +2c0f:f7f0::/32 ke +2c0f:f7f8::/32 za +2c0f:f800::/32 za +2c0f:f810::/32 ao +2c0f:f818::/32 bj +2c0f:f820::/32 gh +2c0f:f828::/32 ao +2c0f:f830::/32 mu +2c0f:f838::/32 za +2c0f:f840::/32 gq +2c0f:f848::/32 gh +2c0f:f850::/32 za +2c0f:f858::/32 dz +2c0f:f860::/32 rw +2c0f:f878::/32 ke +2c0f:f880::/32 ng +2c0f:f888::/32 ao +2c0f:f890::/32 gm +2c0f:f898::/32 mu +2c0f:f8a0::/32 ug +2c0f:f8b0::/32 bf +2c0f:f8b8::/32 za +2c0f:f8c0::/32 gq +2c0f:f8c8::/32 ne +2c0f:f8d0::/32 ng +2c0f:f8d8::/32 bw +2c0f:f8e0::/32 mu +2c0f:f8e8::/32 gh +2c0f:f8f0::/32 mu +2c0f:f8f8::/32 so +2c0f:f900::/32 ml +2c0f:f908::/32 bi +2c0f:f918::/32 re +2c0f:f920::/32 cg +2c0f:f928::/32 gw +2c0f:f930::/32 lr +2c0f:f938::/32 zm +2c0f:f940::/32 dz +2c0f:f948::/32 ga +2c0f:f950::/32 ss +2c0f:f958::/32 za +2c0f:f960::/32 tz +2c0f:f968::/32 mz +2c0f:f970::/32 za +2c0f:f978::/32 cd +2c0f:f980::/32 na +2c0f:f988::/32 za +2c0f:f990::/32 gn +2c0f:f998::/32 mr +2c0f:f9a0::/32 mw +2c0f:f9a8::/32 za +2c0f:f9b0::/32 ga +2c0f:f9b8::/32 mu +2c0f:f9c0::/32 bw +2c0f:f9c8::/32 za +2c0f:f9d0::/32 tz +2c0f:f9d8::/32 za +2c0f:f9e0::/32 ng +2c0f:f9e8::/32 za +2c0f:f9f0::/32 mg +2c0f:f9f8::/32 bj 2c0f:fa00::/32 gh 2c0f:fa08::/32 cd -2c0f:fa10::/32 zm +2c0f:fa10::/32 mu 2c0f:fa18::/32 ma -2c0f:fa20::/32 sd +2c0f:fa20::/32 ss 2c0f:fa28::/32 mg -2c0f:fa30::/32 ke 2c0f:fa38::/32 ao 2c0f:fa40::/32 za 2c0f:fa48::/32 za @@ -9224,18 +26329,46 @@ 2c0f:fab0::/32 tn 2c0f:fac0::/32 mw 2c0f:fac8::/32 bw -2c0f:fad0::/32 rw 2c0f:fad8::/32 ke 2c0f:fae0::/32 cm 2c0f:fae8::/32 ke -2c0f:fc00::/32 za +2c0f:faf0::/32 ao +2c0f:faf8::/32 za +2c0f:fb00::/32 ug +2c0f:fb08::/32 za +2c0f:fb10::/32 ly +2c0f:fb18::/32 za +2c0f:fb20::/32 ma +2c0f:fb30::/32 za +2c0f:fb38::/32 so +2c0f:fb40::/32 za +2c0f:fb48::/32 mz +2c0f:fb50::/32 ke +2c0f:fb58::/32 ao +2c0f:fb60::/32 ke +2c0f:fb68::/32 ls +2c0f:fb70::/32 ao +2c0f:fb78::/32 tz +2c0f:fb80::/32 za +2c0f:fb88::/32 tz +2c0f:fb90::/32 mz +2c0f:fb98::/32 ng +2c0f:fba0::/32 za +2c0f:fba8::/32 ng +2c0f:fbb0::/32 za +2c0f:fbb8::/32 tz +2c0f:fbc0::/32 za +2c0f:fbc8::/32 ug +2c0f:fbd0::/32 gn +2c0f:fbd8::/32 za +2c0f:fbe0::/32 za 2c0f:fc40::/32 eg 2c0f:fc48::/32 mw -2c0f:fc50::/32 zw 2c0f:fc58::/32 mw 2c0f:fc60::/32 ng 2c0f:fc68::/32 za 2c0f:fc70::/32 ke +2c0f:fc78::/32 zw 2c0f:fc80::/32 ke 2c0f:fc88::/32 eg 2c0f:fc90::/32 ng @@ -9265,7 +26398,6 @@ 2c0f:fd58::/32 za 2c0f:fd60::/32 ug 2c0f:fd68::/32 za -2c0f:fd70::/32 ug 2c0f:fd78::/32 bi 2c0f:fd80::/32 bf 2c0f:fd88::/32 gh @@ -9279,7 +26411,6 @@ 2c0f:fdc8::/32 za 2c0f:fdd0::/32 za 2c0f:fdd8::/32 za -2c0f:fde0::/32 mw 2c0f:fde8::/32 mw 2c0f:fdf0::/32 za 2c0f:fdf8::/32 za @@ -9288,9 +26419,9 @@ 2c0f:fe18::/32 za 2c0f:fe20::/32 za 2c0f:fe28::/32 za -2c0f:fe30::/32 rw +2c0f:fe30::/32 mu 2c0f:fe38::/32 ke -2c0f:fe40::/32 ke +2c0f:fe40::/32 mu 2c0f:fe48::/32 za 2c0f:fe50::/32 dz 2c0f:fe58::/32 ls @@ -9308,10 +26439,8 @@ 2c0f:feb8::/32 zm 2c0f:fec0::/32 ug 2c0f:fec8::/32 sd -2c0f:fed0::/32 ng 2c0f:fed8::/32 za 2c0f:fee0::/32 eg -2c0f:fee8::/32 za 2c0f:fef0::/32 sc 2c0f:fef8::/32 ke 2c0f:ff00::/32 bw @@ -9333,6 +26462,5 @@ 2c0f:ffc8::/32 za 2c0f:ffd0::/32 za 2c0f:ffd8::/32 za -2c0f:ffe0::/32 za 2c0f:ffe8::/32 ng 2c0f:fff0::/32 ng
View file
gtk-gnutella-1.1.9.tar.bz2/extra_files/gtk-gnutella.appdata.xml
Added
@@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright 2013 Raphael Manfredi <Raphael_Manfredi@pobox.com> --> +<!-- Copyright 2014 Jeroen Asselman <jeroen@asselman.com> --> +<application> + <id type="desktop">gtk-gnutella.desktop</id> + <metadata_license>CC0</metadata_license> + <project_license>GPL-2.0</project_license> + <summary>Access the Gnutella and G2 network via this servent</summary> + <description> + <p> + gtk-gnutella allows you to join the Gnutella and G2 network, search, share + and download files. + </p> + <p> + After joining the network, type-in words in the search area and it will + create a search for files shared on the network matching that name. + You can then click on an entry and attempt to download it. + </p> + <p> + It is compatible with all other Gnutella servents from other vendors: + it will join the same network and exchange with others seamlessly. + </p> + <p>Highlights:</p> + <ul> + <li>TLS support for Gnutella and HTTP connections</li> + <li>UPnP and NAT-PMP support to automatically enable port forwarding</li> + <li>Distributed Hash Table (DHT) to find alternate locations and + push-proxies</li> + <li>Powerful filtering engine</li> + </ul> + </description> + <screenshots> + <screenshot type="default" width="1250" height="742">http://gtk-gnutella.sourceforge.net/images/shots/1.1/gtk-gnutella-1.1-network.png</screenshot> + <screenshot width="818" height="444">http://gtk-gnutella.sourceforge.net/images/shots/1.1/gtk-gnutella-1.1-ruleset-editor.png</screenshot> + <screenshot width="1250" height="742">http://gtk-gnutella.sourceforge.net/images/shots/1.1/gtk-gnutella-1.1-searches.png</screenshot> + </screenshots> + <url type="homepage">http://gtk-gnutella.sf.net/</url> + <updatecontact>gtk-gnutella-devel@lists.sourceforge.net</updatecontact> +</application>
View file
gtk-gnutella-0.98.2.tar.bz2/extra_files/gtk-gnutella.desktop -> gtk-gnutella-1.1.9.tar.bz2/extra_files/gtk-gnutella.desktop
Changed
@@ -1,6 +1,5 @@ Desktop Entry Version=1.0 -Encoding=UTF-8 Name=gtk-gnutella Namede=gtk-gnutella Namefr=gtk-gnutella @@ -28,10 +27,11 @@ GenericNamenl=P2P programma GenericNamenn=Fildelingsprogram GenericNametr=P2P dosya paylaşım programı +Keywords=file-sharing; TryExec=gtk-gnutella Exec=gtk-gnutella StartupNotify=false Terminal=false Type=Application -Categories=GTK;Application;Network;FileTransfer;P2P; -Icon=gtk-gnutella.png +Categories=GTK;Network;FileTransfer;P2P; +Icon=gtk-gnutella
View file
gtk-gnutella-1.1.9.tar.bz2/extra_files/gwcache.boot
Added
@@ -0,0 +1,10 @@ +# +# Bootstrapping G2 web caches. +# + +http://cache.ce3c.be/ +http://cache.trillinux.org/g2/bazooka.php +http://dkac.trillinux.org/dkac/dkac.php +http://gwc.dyndns.info:28960/gwc.php +http://htmlhell.com/ +http://tenafly5k.com/gwc/skulls.php
View file
gtk-gnutella-0.98.2.tar.bz2/extra_files/hostiles.txt -> gtk-gnutella-1.1.9.tar.bz2/extra_files/hostiles.txt
Changed
@@ -1829,3 +1829,13 @@ # "fake" LimeWire node, returning "blah blah query words" results # with ever-changing (random?) GUID. 206.67.234.41 + +# servents with "fake" names that do not behave nicely (Gnutella spammers?) +66.212.143.0/24 + +# Fake Shareaza clients (Tiversa AP2P) +206.123.249.96/27 + +# Fake Shareaza clients +208.103.122.163 +208.103.122.164/30
View file
gtk-gnutella-0.98.2.tar.bz2/extra_files/ja/FAQ -> gtk-gnutella-1.1.9.tar.bz2/extra_files/ja/FAQ
Changed
@@ -210,8 +210,8 @@ </p> <pre> 012345678AB (オフセット) - NIrwqxZPFhT - ||||||||||+ <strong>T</strong>LS トンネル接続であることを示します + NIrwqxZPFhE + ||||||||||+ TLS トンネル接続であることを示します |||||||||+- Hops Flow が発生しているか (<strong>h</strong>)、あるいは全クエリーがフロー制御されています (<strong>f</strong>) ||||||||+-- フロー制御 (<strong>F</strong>)、またはキューに未処理のデータ (<strong>d</strong>) があることを示します |||||||+--- こちらが PUSH プロキシである (<strong>P</strong>) か、あちらが PUSH プロキシである (<strong>p</strong>) かを示します @@ -294,7 +294,7 @@ <q><em>受動</em></q> 検索は gtk-gnutella を通過するすべての検索結果を返してきます。これらの検索結果を<a href="index.php?page=filtering_howto">条件検索</a>に掛けると受動検索は役に立つかもしれません。 </p> <p> - <a href="#general-ultrapeer">ウルトラ</a>モードにあるなら、あなた自身の検索に加えて、すでに多くの検索結果があなたのピアを通り過ぎています。あなたは余分な Gnet トラフィックを発生させることなく、これを検索に利用することができます。例えば 200 基の <a href="#general-ultrapeer">リーフピア</a>と接続している私のウルトラピアで、受動検索を開き名前 <q><em>eminem</em></q> にヒットする検索結果のみを表示するようフィルターを設定したとします。一時間になるかならないかの内に約 1500 件ほどの検索結果を得ました。検索内容がより人気のあるものであればある程、より待てば待つ程、このテクニックが有益なものになる事は明らかです。 + <a href="#general-ultrapeer">ウルトラ</a>モードにあるなら、あなた自身の検索に加えて、すでに多くの検索結果があなたのピアを通り過ぎています。あなたは余分な Gnet トラフィックを発生させることなく、これを検索に利用することができます。例えば 200 基の <a href="#general-ultrapeer">リーフピア</a>と接続している私のウルトラピアで、受動検索を開き名前 <q><em>linux</em></q> にヒットする検索結果のみを表示するようフィルターを設定したとします。一時間になるかならないかの内に約 1500 件ほどの検索結果を得ました。検索内容がより人気のあるものであればある程、より待てば待つ程、このテクニックが有益なものになる事は明らかです。 </p> <p> リーフモードの場合、gtk-gnutella を通過していくことになる唯一の検索結果はあなた自身の検索になりますので、上記のテクニックは役に立たないでしょう。しかし、リーフモードでのみ役に立つ受動検索の使用法が別にあります。例えば、受動検索を開始してそのフィルターで mp3 ファイルのみを表示するようにすると、開いているすべての検索リスト/タブからのすべての mp3 ファイルが、便利にも一つの検索ウィンドウに集められるようになります。異なるフィルターを備えた受動検索をもっと開くことで、それぞれに違う種類のファイルを表示できるようになります。
View file
gtk-gnutella-0.98.2.tar.bz2/extra_files/ja/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/extra_files/ja/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-30 -: $X-Id: Jmake.tmpl 30 2009-10-28 07:45:28Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -50,18 +50,18 @@ $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 18 2006-12-27 10:35:09Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Start of Jmakefile -# $X-Id: Jmakefile 10280 2005-11-22 19:07:19Z rmanfredi $ +# $X-Id$ all:: FAQDIR = $(PRIVLIB)/ja -local_install:: FAQ +local_install local_install-strip:: FAQ @case '${MFLAGS}' in *i*) set +e;; esac; \ (set -x; test -d $(INSTALL_PREFIX)$(FAQDIR) || \ $(INSTALLDIR) $(INSTALL_PREFIX)$(FAQDIR)); \ @@ -89,6 +89,11 @@ $(RM) Makefile config.sh install:: local_install + @exit 0 + +install-strip:: local_install-strip + @exit 0 + install.man:: maybe_install.man deinstall:: local_deinstall deinstall.man:: maybe_deinstall.man @@ -119,12 +124,17 @@ local_clobber:: $(RM) tags +depend:: + ######################################################################## # Empty rules for directories with no sub-directories -- do not edit local_install:: @echo "install in $(CURRENT) done." +local_install-strip:: + @echo "install (strip) in $(CURRENT) done." + local_deinstall:: @echo "deinstall in $(CURRENT) done."
View file
gtk-gnutella-1.1.9.tar.bz2/extra_files/tr
Added
+(directory)
View file
gtk-gnutella-1.1.9.tar.bz2/extra_files/tr/FAQ
Added
@@ -0,0 +1,411 @@ +<html> +<head> +<meta content="text/html; charset=windows-1252" http-equiv="content-type"> +<title>gtk-gnutella Sıkça Sorulan Sorular</title> +</head> +<body> + <h1>SSS</h1> + <!-- + ** ** TOC ** --> + <h2>Genel</h2> + <ul> +<li><a href="#general0">Nedir bu Gnutella kuzum?</a></li> + <li><a href="#general-G2">Peki G2 şebekesi nedir o zaman?</a></li> + <li><a href="#general-gtkg">GTKG nedir?</a></li> + <li><a href="#general1">Bu çok fazla bant genişliği kullanıyor!</a></li> + <li><a href="#general-ultrapeer">Ultraeşler ve yaprak düğümleri +nedir?</a></li> + <li><a href="#general-firewall">Neden gtk-gnutella olmadığı hâlde +bir güvenlik duvarı arkasında bulunduğunu belirtiyor?</a></li> + </ul> +<h2>Kaynak koddan derleme</h2> + <ul> +<li><a href="#build1">Configure'ün bana bütün bu soruları sormasını +nasıl engellerim?</a></li> + </ul> +<h2>Gnutella bağlantıları</h2> + <ul> +<li><a href="#gnet0">İyi bir bağlantı sayısı nedir?</a></li> + <li><a href="#gnet1">Güvenlik duvarımda bir port yönlendirmem +gerekir mi?</a></li> + <li><a href="#gnet-forward-howto">Port yönlendirmesini nasıl +yapılandırırım?</a></li> + <li><a href="#gnet-udp">gtk-gnutella UDP kullanır mı?</a></li> + <li><a href="#gnet2">"FC" unsurunun anlamı nedir?</a></li> + <li><a href="#gnet3">Bir gönderme yaparken neden gnet bağlantılarını +kaybediyorum?</a></li> + <li><a href="#gnet4">Bayraklar sütunundaki bu şeylerin anlamı +nedir?</a></li> + <li><a href="#gnet-user-agent">Uygulama isimlerinin önündeki "!" +işaretinin anlamı nedir?</a></li> + <li><a href="#gnet5">"Zararlı sürüm yasaklandı, güncelleme gerekiyor" +mesajının anlamı nedir?</a></li> + <li><a href="#gnet6">"Eski sürüm, lütfen güncelleyin" mesajının anlamı +nedir?</a></li> + <li><a href="#gnet7">HTTP vekil sunucum neden gerektiği +gibi çalışmıyor?</a></li> + <li><a href="#gnet8">Zaman aşımı süresini nasıl arttırabilirim?</a></li> + <li><a href="#gnet-auto">Otomatik kip ultra ve yaprak kipleri arasında +seçimi neye dayanarak yapar?</a></li> + </ul> +<h2>Aramalar</h2> + <ul> +<li><a href="#search0">Nasıl daha fazla sonuç alabilirim?</a></li> + <li><a href="#search3">SHA1 değeri olmayan sonuçları nasıl +görmezden gelebilirim?</a></li> + <li><a href="#search-entry">Arama kutusu nereye gitti?</a></li> + <li><a href="#search-passive">"Pasif" aramalar nedir?</a></li> + <li><a href="#search-local">Paylaştığım bir dosyanın magnet bağlantısını +nasıl panoya kopyalayabilirim?</a></li> + </ul> +<h2>İndirmeler</h2> + <ul> +<li><a href="#down0">"İstek görmezden geliniyor SHA1|isim & boyut" +durumu ne anlama gelir?</a></li> + <li><a href="#down1">"Sunucuda URN yok" durumunun anlamı nedir?</a></li> + <li><a href="#down2">Neden bir dosya X kez indiriliyor?</a></li> + <li><a href="#down3">"Swarming" nedir?</a></li> + <li><a href="#down4">Bir "parça" nedir?</a></li> + <li><a href="#down5">"İndirme topluluğu" nedir?</a></li> + <li><a href="#down_push">"İtme isteği" nedir?</a></li> + <li><a href="#down7">Neden gtk-gnutella dosya isimlerinin sonuna +.OK ilâve ediyor?</a></li> + <li><a href="#down8">Bu dosyayı bir türlü indiremiyorum!</a></li> + <li><a href="#down9">İndirmeler sekmesinde metnin renginin siyah +yerine gri olması ne anlama gelir?</a></li> + </ul> +<h2>Göndermeler</h2> + <ul> +<li><a href="#up0">"Normalize" ne anlama gelir?</a></li> + </ul> +<h2>GTK+ 2.x</h2> + <ul> +<li><a href="#gtk2_slow">Gtk2 çooook yavaş.</a></li> + <li><a href="#gtk2_ctype">ASCII olmayan karakterler _ (alt çizgi) +olarak gösteriliyor.</a></li> + </ul> +<!-- + ** ** Questions and answers below ** --><hr> +<h2>Genel</h2> + <h3><a name="general0">Nedir bu Gnutella kuzum?</a></h3> + <p>Gnutella merkezi olmayan, eşten eşe veri alışveriş şebekesidir. Güncel olarak Gnutella ağında her türlü dosyayı indirebilir ya da yayınlayabilirsiniz. Daha fazla bilgi için <a href="http://www.wikipedia.org/wiki/Gnutella">Vikipedinin İngilizce Gnutella maddesine</a> bakabilirsiniz.</p> + <h3><a name="general-G2">Peki G2 şebekesi nedir o zaman?</a></h3> + <p><a href="http://www.wikipedia.org/wiki/Gnutella2">G2</a>, Gnutella'dan esinlenerek Michael Stokes tarafından geliştirilmiş ve 2002 yılında Windows işletim sistemine mahsus <a href="http://shareaza.sourceforge.net/">Shareaza</a> istemcisinde yayınlanmış merkezsiz, eşten eşe dosya paylaşım protokolüdür. 1.1 sürümünden beri, gtkg bu ağa bir yaprak olarak bağlanabilir ve böylece Gnutella'ya ilâve olarak G2 ağında da dosya arayıp paylaşabilir. Gnutella'daki <a href="#general-ultrapeer">ultraeşlerin</a> G2'deki karşılıkları <em>hub</em> olarak anılırlar. </p> + <h3><a name="general-gtkg">"GTKG" nedir?</a></h3> + <p>Biz sıkça gtk-gnutella'yı GTKG ya da gtkg olarak anarız (çünkü +böylesi daha kısadır). GTK, gtk-gnutella'nın kullandığı grafik araç +takımı olan GTK+'dan gelir. </p> + <h3><a name="general1">Bu çok fazla bant genişliği kullanıyor!</a></h3> + <p>Güncel olarak yavaş bir hat kullanıyorsanız (modem ile) aşağıdaki +tavsiyeleri deneyebilirsiniz: </p> + <ul> +<li>gtk-gnutella'yı yaprak kipinde çalıştırın. Eş kipi kurulumu Tercihler +penceresinin Gnutella sekmesinde değiştirilebilir. Durum çubuğunda +bir ikon hangi kipte çalışıldığını gösterecektir. </li> + <li>gnet (Gnutella ağı) bağlantı sayısını sınırlandırın. </li> + <li>İçeri gelen bağlantıları kabul edebiliyorsanız, <em>Bağlantı hızını +kontrol</em> seçeneklerinde <em>Sıkıştırılmış bağlantıları tercih +et</em> şıkkını etkinleştirin. </li> + <li>Yavaş bir bağlantı kullansanız bile dosya paylaşmak mühimdir. +<a href="#down3">Birden çok kaynaktan indirme (swarming)</a> +sayesinde diğer kişiler sizden küçük dosya parçaları alabilecektir, +dolayısıyla yavaş bir bağlantı bile Gnutella'da bir çok kaynak göz önüne + alınınca çok önemli bir katkı sağlar. Çevirmeli 56K modem kullanıyorsanız, +<em>HTTP trafiği için bant genişliği sınırları</em> - <em>Toplam +gönderme hızını</em> 1K/s değerine ayarlayın, böylece bant genişliğinizin + çoğu indirmelere atanacaktır.</li> + <li>İndirmeleriniz başladığında grafik arayüzün alt sol köşesindeki düğmeyi +basıp etkisiz hâle getirin. Bu Gnutella ağıyla bağlantıyı keser. Bunu +YAPMAMANIZI hararetle tavsiye ederiz çünkü şebekeden alternatif +kaynak bulamazsınız ve diğer kişiler dosyalarınızı arayamazlar. </li> + </ul> +<h3><a name="general-ultrapeer">Ultraeşler ve yaprak düğümleri nedir?</a></h3> + <p>0.92 sürümünden beri, gtk-gnutella <em>ultraeş</em> (ultrapeer) ve +<em>yaprak düğümleri</em> (leaf node) desteğini eklemiştir. Bu gnet +ağındaki istemcileri sadece ultraeşlere bağlanan yaprak düğümleri ve +birçok yaprak düğümü ile daha az sayıda başka ultraeşlere bağlanan +ultraeşler olarak iki kümeye ayırır (<a href="#gnet0">İyi bir bağlantı sayısı + nedir?</a> paragrafına bakınız).</p> + <p>Ultraeşler bir güvenlik duvarı ile sınırlanmış olmamalıdırlar ve yüksek +çalışma süreleri olması beklenir (iki saatten fazla), buna ek olarak gnet +şebekesine verebilecekleri kâfi miktarda bant genişliğine sahip olmalıdırlar. +Ultraeşler yaprak düğümlerinin sorgularını yönlendirirler, yaprak +düğümleri ise ultraeşlerine paylaştıkları dosyalara denk gelen anahtar +kelimelerin hash değerlerini içeren QRP tabloları (Query Routing Table, +Sorgu Yönlendirme Tablosu) yüklerler. Bir ultraeş sorgu yönlendirme +tablosuna denk gelen bir istek aldığında, sorguyu uygun yaprak düğüme +iletir. Bunun sonucu her yaprak düğümü için çok düşük gnet trafiğidir ki +bu bant genişliğinin (doğrudan P2P olarak) paylaşım ve indirmeler için +kullanılmasına imkân sağlar. Ultraeşler güvenlik duvarı arkasındaki yaprak +düğümleri için <a href="#down_push">itme vekilliği</a> de yaparlar. </p> + <h3><a name="general-firewall">Neden gtk-gnutella olmadığı hâlde bir güvenlik duvarı arkasında bulunduğunu belirtiyor?</a></h3> + <p>Dışarıdan size erişilip erişilemeyeceğini belirlemek için gtk-gnutella +içeriye gelen bir bağlantı almaya ihtiyaç duyar. Bu gerçekleşene dek, +dinlenen TCP portunu engelleyen bir güvenlik duvarı bulunduğu +varsayılır. Tespiti hızlandırmak istiyorsanız, bir ağ tarayıcısı, telnet veya +benzer bir araç ile dinlenen porta dışarıdan bağlanın. Eğer bağlantı +reddedilirse ya da görmezden gelinirse, muhtemelen portu engelleyen +bir güvenlik duvarı, yanlış yapılandırılmış bir NAT (router yani yönlendirici) +ya da benzeri bir unsur nedeniyle dışarıdan size erişilemiyor demektir. +Başka bir dinleme portu denemek isteyebilirsiniz çünkü bazı İnternet +Erişim Sağlayıcıları varsayılan Gnutella portunu (6346) engellerler. +Ayrıca <a href="#gnet1"><q>Güvenlik duvarımda bir port yönlendirmem +gerekir mi?</q></a> paragrafına bakınız.</p> + <h2>Kaynak koddan derleme</h2> + <h3><a name="build1">Configure'ün bana bütün bu soruları sormasını +nasıl engellerim?</a></h3> + <p>Varsayılan değerleri kullanması için <code>Configure</code> betiğini aşağıda gösterildiği gibi kullanabilirsiniz. Bu durumda eskiden autoconf'tan <code>configure</code> betiğinin çağrıldığı zamanki gibi davranır. </p> + <p><code>$ ./Configure -ders</code></p> + <p>Derleme seçeneklerini komut satırında da ayarlayabilirsiniz. Aşağıdaki misal gtk-gnutella'yı şu şekilde derleyecektir:</p> + <ul> +<li>özel ayarları kabul et (<code>-O</code>). Bu bulunmazsa +aşağıdaki parametrelerin hiçbir etkisi olmaz. </li> + <li>Gtk1 araç takımını kullan, uzaktaki kabuğu etkinleştir (<code>-D +gtkversion=1 -D remotectrl=y</code>) </li> + <li> MMX desteği olan bir pentium yongası için derle (<code>-Dccflags="-march=pentium +-mmmx"</code>). </li> + <li>hata ayıklama verilerini derle ve aynı zamanda tüm derleyici +optimizasyonlarını devre dışı bırak (<code>-Doptimize="-g -O0"</code>). </li> + </ul> +<p><code>$ ./Configure -ders -O -D gtkversion=1 -D remotectrl=y -Dccflags="-march=pentium -mmmx" -Doptimize="-g -O0"</code></p> + <h2>Gnutella bağlantıları</h2> + <h3><a name="gnet0">İyi bir bağlantı sayısı nedir?</a></h3> + <p><a href="#general-ultrapeer">Yaprak</a> kipinde 3 ultraeş,<a href="#general-ultrapeer"> ultraeş</a> kipinde 32/40 (asgari/azami) ultraeş ve yaklaşık +100 yaprak düğümü. Gerçek sayılar kullanılabilecek bant genişliğine bağlı +olmalıdır. Eğer "Sıkıştırılmış bağlantıları tercih et" seçeneğini etkinleştirdiyseniz +kullanılan bant genişliği çok daha düşük olacaktır. Hiçbir zaman bant genişliğinizin +tümünü gnet bağlantıları için kullanmamanız gerekir. Özellikle asimetrik bir +kablo/DSL bağlantısında çok fazla dışarıya giden trafik oluşturarak içeri gelen +trafiğin kolayca taşmasına yol açabilirsiniz (TCP/IP problemi). Dışarıya giden +bant genişliğinizin en çok yarısını gnet bağlantılarına ayırın. </p> + <p>"High outdegree" (yüksek sayıda bağlantı) işlevi desteğinin 0.95 sürümünde +eklenmesinden beri diğer ultraeşlere 32/40 bağlantı kurmanız gerekir. +Yaprak düğümler ile bağlantı sayısı mikroişlemcinizin hızına ve bant +genişliğinizin boyutuna göre değişir. Mutlak asgari değer olarak bir ultraeş +en az 20 yaprak düğüme bağlanmalıdır, ancak 100 ya da daha fazla yaprak +düğüme bağlanmak çok daha iyidir. Grafik arayüzün sol alt köşesindeki +bant genişliği sayaçlarını izleyin ve mikroişlemci kullanımı hakkında bir fikir +edinmek için top komutunu kullanın. Gnutella'ya adamak istediğiniz azami +sistem kaynaklarına erişene dek yaprak düğümler ile bağlantı sayısını arttırın. </p> + <p>Bant genişliğini kontrol ayarları gtk-gnutella'nın bant genişliği +kullanımını daha da ince bir şekilde ayarlamanıza yardımcı olur. </p> + <h3><a name="gnet1">Güvenlik duvarımda bir port yönlendirmem gerekir mi?</a></h3> + <p>gtk-gnutella'nın çalışması için herhangi bir port yönlendirmenize gerek +yoktur fakat yönlendirme yaparsanız çok daha etkin bir şekilde çalışır. +Eğer gtk-gnutella bir güvenlik duvarı tarafından engellendiğinizi +düşünüyorsa <a href="#down_push">"itme"</a> sonuçlarını göstermez +çünkü bunları nasıl olsa indiremezsiniz.<br>Diğer kişiler size doğrudan bağlanamadıkları durumlarda bile sizin +düğümünüzden <a href="#down_push">itme isteği</a> kullanarak +indirme yapabilirler.<br>gtk-gnutella'nın dinlediği portu ayarlayabilirsiniz. <em>Dinlenecek port</em> +ayarı <em>Dosya->Tercihler->Şebeke</em> konumundadır.</p> + <h3><a name="gnet-forward-howto">Port yönlendirmesini nasıl yapılandırırım?</a></h3> + <p>En popüler yönlendiriciler için talimatları İngilizce olarak <a href="http://www.portforward.com/routers.htm">http://www.portforward.com/routers.htm</a> adresinde bulabilirsiniz. Port yönlendirmenizi denemek için <a href="http://www.canyouseeme.org/">http://www.canyouseeme.org/</a> adresini kullanabilirsiniz.</p> + <h3><a name="gnet-udp">gtk-gnutella UDP kullanır mı?</a></h3> + <p>Evet, 0.95 sürümünden beri gtk-gnutella +<a href="http://tr.wikipedia.org/wiki/TCP">TCP</a>'ye ilâve olarak +<a href="http://tr.wikipedia.org/wiki/UDP">UDP</a>'de kullanır.</p> + <h3><a name="gnet2">"FC" unsurunun anlamı nedir?</a></h3> + <p><em>FC</em>, "flow control" yani "akış kontrolü" anlamına gelir.<br>Genelde, bağlandığınız istemcilerin akış kontrolü yapmamalarından emin + olmanız önerilir. <a href="#gnet4">Bayraklar</a> sütununda <em>FC</em> +bulunup bulunmadığına bakın. Genel bir kural olarak, birden fazla düğüm +akış kontrolü yapıyorsa gnete adanmış yeteri kadar dışarı giden bant +genişliği yok demektir ve bu şebekeye zarar verdiğiniz anlamına gelir: ya +bağlantı sayısını azaltın, ya <em>Sıkıştırılmış bağlantıları tercih et</em> +şıkkını seçin, ya da dışarıya giden bant genişliğini arttırın. </p> + <h3><a name="gnet3">Bir gönderme yaparken neden gnet bağlantılarını +kaybediyorum?</a></h3> + <p>Bant genişliğini sınırlamayı deneyin. Bunun bir etkisi olmazsa, +sorun İnternet Erişim Sağlayıcınızın Gnutella trafiğini bastırmasından +kaynaklanıyor olabilir. gtk-gnutella'nın şebeke ayarlarında gnutella +portunu değiştirmeyi deneyin.</p> + <h3><a name="gnet4">Bayraklar sütunundaki bu şeylerin anlamı nedir?</a></h3> + <p>Bağlantı türlerini ve bazı bağlantı ayarlarını burada görebilirsiniz. +İtme vekillerinin 0.92.1c ve sonraki sürümlerde desteklendiğini +dikkatinize sunarız. </p> + <pre>012345678AB (offset) +NIrwqxZPFhE +||||||||||+ TLS ile şifrelenmiş bir bağlantıyı gösterir (<strong>E</strong>ncrypted) +|||||||||+- hop akışı tetiklenmiş (<strong>h</strong>), ya da toplam sorgu akış kontrolü (<strong>f</strong>) +||||||||+-- akış kontrolu (flow control (<strong>F</strong>)), ya da kuyrukta beklemede olan veriler (<strong>d</strong>) +|||||||+--- düğüm için bir itme vekiliyiz (<strong>P</strong>) ya da düğüm bizim itme vekilimiz (<strong>p</strong>) +||||||+---- <strong>R</strong>x, <strong>T</strong>x ya da ikisinin de (<strong>Z</strong>) sıkıştırıldığını gösterir +|||||+----- son-atlama (last-hop) QRT tablosunu ultraeşe yolladık (<strong>X</strong>), veya yolluyoruz (<strong>x</strong>) +||||+------ <strong>Q</strong>RT aldık/gönderdik, ya da bir QRT alıyoruz/gönderiyoruz (<strong>q</strong>) +|||+------- düğümün yazılabilir (<strong>w</strong>ritable) olduğunu gösterir +||+-------- düğümün okunabilir (<strong>r</strong>eadable) olduğunu gösterir +|+--------- bağlantı türü: (<strong>I</strong>, yani içeri, <strong>O</strong>utgoing yani dışarı, ya da <strong>P</strong>ong yollayan) ++---------- eş kipi: G2 <strong>H</strong>ub, <strong>U</strong>ltra, <strong>L</strong>eaf yani yaprak, veya eski (yani <strong>N</strong>ormal)</pre> + <h3><a name="gnet-user-agent">Uygulama isimlerinin önündeki "!" +işaretinin anlamı nedir?</a></h3> + <p>Uygulama adının sahte <em>olabileceğine</em> işaret eder ancak +iki tarafın birinde gecikmiş bir saatten kaynaklanan yanlış pozitif +olması da mümkündür. </p> + <h3><a name="gnet5">"Zararlı sürüm yasaklandı, güncelleme gerekiyor" mesajının anlamı nedir?</a></h3> + <p>Bazen istemcilerin bir hata içerdikleri ya da gnet'e zaralı bir davranış +sergiledikleri keşfedilir. Mesela gtk-gnutella-0.92b çok fazla sorgu +oluşturup GWebCache sisteminde aşırı yüke yol açan bir hata +içeriyordu. Bu tür yasaklamalar istisnaidir, normalde belli sürümlere +sınırlanırlar ve istemcinin hazırlayıcısı yasaklama hakkında bilgilendirilir. </p> + <h3><a name="gnet6">"Eski sürüm, lütfen güncelleyin" mesajının anlamı +nedir?</a></h3> + <p>Bir seneden eski gtk-gnutella sürümlerin güncellenmesi önemlidir +çünkü gnet şebekesinin kararlılığı ve ölçeklenmesi için önemli +işlevlerden yoksun hâle gelmişlerdir. </p> + <h3><a name="gnet7">HTTP vekil sunucun neden gerektiği gibi çalışmıyor?</a></h3> + <p>HTTP vekilinizin <code>CONNECT</code> metotunu desteklemesi gerekir +çünkü normal <code>GET</code> Gnutella bağlantılarıyla çalışmaz. Bu, +HTTP protokolünün en çok SQUID vekilleri tarafından desteklenen bir +uzantısıdır. Ek olarak çoğu zaman devre dışı bırakılır çünkü erişim +sağlayıcıları tarafından bir güvenlik sorunu olarak değerlendirilebilir. Güncel +olarak vekil desteği - buna SOCKS da dahil olarak- pek iyi değildir. +Geliştiriciler vekil kullanmamaktadırlar, ancak bunu düzeltebileceğinizi +düşünüyorsanız yamalarınız makbule geçecektir. </p> + <h3><a name="gnet8">Zaman aşımı süresini nasıl arttırabilirim?</a></h3> + <p>İnternet bağlantınızda yüksek gecikmeler varsa zaman aşımı sürelerini +arttırmak faydalı olabilir. <em>Dosya->Tercihler->Kullanıcı arayüzüne</em> +gidip <em>Uzman kipi</em> şıkkını etkinleştirin. Bunun ardından <em>Dosya->Tercihler->Gnutella</em> konumunda değiştirilecek pek çok +ek seçenek bulursunuz. </p> + <h3><a name="gnet-auto">Otomatik kip ultra ve yaprak kipleri arasında +seçimi neye dayanarak yapar?</a></h3> + <p><a href="#general-ultrapeer">Ultra</a> kipine terfi etmek için +aşağıdaki şartların yerine getirilmesi gerekir: </p> + <ol> +<li>8192 bayt/s değerinden fazla kullanılabilecek dışarıya giden +bant genişliği bulunmalıdır. </li> + <li>Bant genişliği programlayıcıları faalse yaprak düğümler HTTP +dışarı giden bant genişliğini çalacak şekilde ayarlanmamış olmalıdır. </li> + <li>Eğer Gnet dışarı programlayıcısı faalse, gnet bağlantısı (ultraeş +ya da normal yani eski (legacy)) başına asgari 256 bayt/s bant +genişliği olmalıdır. </li> + <li>Genel olarak yapılandırılmış her yaprak düğümü için 32 bayt/s +ve her gnet bağlantısı için 256 bayt/s bulunmalıdır. </li> + </ol> +<h2>Aramalar</h2> + <h3><a name="search0">Nasıl daha fazla sonuç alabilirim?</a></h3> + <p>Aldığınız arama sonuç sayısı en çok diğer eşlerin size bağlanıp +bağlanamamalarından (<a href="#gnet1">port yönlendirme</a> +paragrafına bakınız) ve diğer makinelere <a href="#gnet0">bağlantı +sayısından</a> etkilenir. </p> + <h3><a name="search3">SHA1 değeri olmayan sonuçları nasıl görmezden +gelebilirim?</a></h3> + <p>Bunun hiçbir önemi kalmamıştır çünkü günümüzde tüm düğümler SHA1 hash değerlerini desteklerler. </p> + <h3><a name="search-entry">Arama kutusu nereye gitti?</a></h3> + <p>Aramalar artık pencerenin en üst köşesindeki <q><em>Arama</em></q> +kutusunda yapılır. </p> + <h3><a name="search-passive">"Pasif" aramalar nedir?</a></h3> + <p><q><em>Pasif</em></q> bir arama gtk-gnutella'dan geçen tüm arama +sonuçlarını sunar. Bu sonuçlar filtrelenirse pasif aramalar faydalı olabilir. </p> + <p>Eğer <a href="#general-ultrapeer">ultra</a> kipindeyseniz kendi aramalarınıza +ek olarak birçok arama sonucu sizin düğümünüzden geçer. İlâve gnet trafiği +oluşturmadan arama yapmak için bu durumdan faydalanabilirsiniz. Mesela 200 +<a href="#general-ultrapeer">yaprak düğümüne</a> bağlı ultraeşimde pasif bir +arama başlattım ve sonuçları sadece <q><em>linux</em></q> ismini içerenleri +gösterecek şekilde filtreledim. Aşağı yukarı bir saat sonunda yaklaşık 1500 +sonuç elde ettim. Tabii ki arama ne kadar popülerse, ve siz ne kadar sabırlıysanız, +bu tekniğin faydası da o kadar artacaktır. </p> + <p> Eğer yaprak kipindeyseniz gtk-gnutella'dan geçen arama sonuçları +sadece sizin aramalarınızdan kaynaklanır, dolayısıyla yukarıda +açıklanan teknik faydalı olmaz. Ancak pasif aramaları sadece yaprak +kipinde faydalı olacak şekilde kullanmanın bir yöntemi vardır. Örneğin +pasif bir arama başlatırsanız ve sonuçları sadece mp3 dosyaları +görüntüleyecek şekilde filtrelerseniz, faal aramalarınızın hepsindeki tüm +mp3 dosyaları tek bir arama penceresinde toplanır. Değişik filtreler ile ek +pasif arama başlatırsanız aramaların her birinde değişik bir dosya tipi +görüntüleyebilirsiniz.</p> + <h3><a name="search-local">Paylaştığım bir dosyanın magnet bağlantısını nasıl panoya kopyalayabilirim?</a></h3> + <p><code>local:.</code> (yerel anlamına gelir) anahtar kelimesiyle +arama yapın. "." yani nokta düzenli bir ifadedir ve burada her dosyaya +denk gelir ki bu, kütüphanenizin tamamının listesini verecektir. Bunun +ardından bir unsuru seçip sağ fare düğmesi ile tıklayıp magnet bağlantısını +panoya kopyalayabilirsiniz.</p> + <h3>İndirmeler</h3> + <h3><a name="down0">"İstek görmezden geliniyor SHA1|isim & boyut" +durumu ne anlama gelir?</a></h3> + <p>Bu, gtk-gnutella'nın veritabanında dosyanın tamamlanmış olarak kaydedildiği +manasına gelir. Bu veritabanı genelde +,<code>~/.gtk-gnutella/done.sha1</code> ve <code>~/.gtk-gnutella/done.namesize</code> konumlarında bulunur. Güncel olarak bu veritabanının +herhangi bir unsurunu grafik arayüzden silmek ya da değiştirmek mümkün +değildir fakat dosyayı herhangi bir metin düzenleyicisi ile gtk-gnutella +kapanıkken düzenleyebilirsiniz. Dosyaların birine bir unsur ekler ya da +çıkarırsanız aynı işlemi öteki dosyada da yapın. </p> + <h3><a name="down1">"Sunucuda URN yok" durumunun anlamı nedir?</a></h3> + <p>Bu, gtk-gnutella'nın bir düğümden yeni bir dosya indirmek istediğini, +ancak bu düğümün dosya için bir SHA1 değeri iletmediğini gösterir. +Dosya yeni olduğundan (henüz kısmi olarak dahi indirilmemiş), +gtk-gnutella bu dosyanın gerçekten istediğiniz dosya olup olmadığını +kontrol etmek için kaplama ve karşılaştırma yapamaz. Böyle bir durumda +uygulama uzaktaki makinenin ilettiği SHA1 değerine dayanır ancak hiçbir +SHA1 değeri iletilmediyse gtk-gnutella'nın indirmek istediği dosyanın +uzaktaki makinedeki dosyayla aynısı olduğunu garantilemek için hiçbir +seçeneği kalmaz.<br>Bu mesajlar canınızı sıkarsa <em>Dosya->Tercihler->İndirmeler</em> +penceresinde <em>İyimser ilk parça</em> şıkkını seçin (bu şıkkın +görüntülenmesi için <em>Dosya->Tercihler->Kullanıcı arayüzüne</em> +gidip <em>Uzman kipi</em> şıkkını etkinleştirmeniz gerekmektedir). </p> + <h3><a name="down2">Neden bir dosya X kez indiriliyor?</a></h3> + <p><em>Alan</em> sütununa göz atın. Buna <a href="#down3">swarming</a> ya da çoklu indirme de denir. gtk-gnutella dosyayı <a href="#down4">parçalar</a> hâlinde indirmeye çalışır ve mümkünse bir çok düğümden aynı zamanda indirme yapar. </p> + <h3><a name="down3">"Swarming" nedir?</a></h3> + <p>Swarming ya da çoklu indirme bir dosyayı birçok makineden aynı zamanda paralel olarak indirmeye denir. gtk-gnutella <a href="#down5">indirme topluluğu ya da örgüsünü</a> kullanarak ve yönlendirilen sonuçları izleyerek kuyruktaki tüm dosyalar için otomatik olarak ek kaynaklar bulmaya çalışır. </p> + <h3><a name="down4">Bir "parça" nedir?</a></h3> + <p><em>Parçalar</em> (İngilizce chunk) <em>dosyaların parçalarıdır</em>. +gtk-gnutella <a href="#down3">çoklu indirme</a> kipinde çalıştığında +indirilen dosya tamamlanana dek dosyanın bir çok parçasını aynı zamanda +indirir. <em>Alan sütunu</em> güncel olarak indirdiğiniz parçayı gösterir. </p> + <h3><a name="down5">"İndirme topluluğu" nedir?</a></h3> + <p>İndirme topluluğunu (indirme örgüsü de denir) destekleyen bir düğümden dosya indirdiğinizde, bu düğüm istenilen dosya için size ilâve kaynaklar iletir (alternatif kaynak biliyorsa). Bu kaynaklar <a href="#down3">çoklu indirme</a> yapmak için kullanılır.</p> + <h3><a name="down_push">"İtme isteği" nedir?</a></h3> + <p><em>İtme talebi</em> (bir güvenlik duvarı tarafından engellendikleri +için) doğrudan bağlanamadığınız düğümlerden dosya indirmenize yarar. +Bu düğümlere bağlanamazsınız, ancak onlar muhtemelen size +bağlanabilirler. Uzaktaki bir bilgisayara dosya indirebilmeniz için sizin +düğümünüze bağlanmasını söylemek için ona bir itme isteği gönderirsiniz.<br>Eğer itme isteği vasıtasıyla bir dosya indiriyorsanız ve başta bu dosya +için sonucu size ileten düğümle bağlantıyı kaybederseniz, <em>itme +yolunu</em> kaybetmiş olursunuz ve bu dosyayı indirmeye devam +edemezsiniz. Dolayısıyla itme yolları oldukça kırılgandır. Bir güvenlik +duvarı sizi engelliyorsa itme isteklerini kullanamazsınız +(<a href="#gnet1">port yönlendirme</a> paragrafına bakınız). </p> + <h3><a name="down7">Neden gtk-gnutella dosya isimlerinin sonuna .OK +ilâve ediyor?</a></h3> + <p>Muhtemelen indirilmiş, geçici ve bozuk dosyalar için değişik klasörler +ayarlamamışsınız demektir bu. </p> + <h3><a name="down8">Bu dosyayı bir türlü indiremiyorum!</a></h3> + <p>Eğer durum çubuğunda güneş gözlükleriyle tebessüm eden sarı bir yüz görmüyorsanız, bunu değiştirmeye çalışmanız tavsiye edilir. <a href="#gnet1">Güvenlik duvarları</a> hakkındaki paragrafa bakınız. </p> + <p>Bu sorun çözülmüşse ve yine de gtk-gnutella dosya için sadece birkaç +kaynak olduğunu belirtiyorsa (İndirmeler sekmesinin Kaynaklar kısmında +çok açık görülür) bunun iki sebebi olabilir: </p> + <ul> +<li>dosya nadirdir</li> + <li>Dosyanın eşsiz bir sürümünü seçmişsinizdir. Daha yaygın bir +sürüm bulunması mümkün olabilir. Bir dosya, birisi mesela mp3 +dosyasının mp3info verilerini değiştirirse ya da başka özel değişiklikler +yaparsa eşsiz hâle gelebilir.</li> + </ul> +<p>Dosyayı tekrar arayıp daha yaygın bir sürümünü bulmayı +deneyebilirsiniz. Genelde "#" sütunu bir dosya için sayı +gösteriyorsa bu iyiye işarettir. Sayı ne kadar büyükse, +dosyayı çabuk indirme şansınız da o kadar büyük demektir. </p> + <h3><a name="down9">İndirmeler sekmesinde metnin renginin siyah yerine +gri olması ne anlama gelir?</a></h3> + <p>Gri renk dosyanın bir <a href="#down_push">itme yolu</a> vasıtasıyla +alındığını gösterir.</p> + <h2>Göndermeler</h2> + <h3><a name="up0">"Normalize" ne anlama gelir?</a></h3> + <p>Bu, bir dosya için yollanılan toplam bayt miktarının dosya +boyutuyla bölünmüş değerini gösterir. </p> + <h2>GTK+ 2.x</h2> + <h3><a name="gtk2_slow">Gtk2 çooook yavaş.</a></h3> + <p><code>GDK_USE_XFT</code> ortam değişkenini 0 değerine ayarlayın +ve bunun bir faydasının dokunup dokunmadığını denetleyin. Bu Gtk2'nin +mikroişlemciyi çok kullanabilen antialiasing işlevini devre dışı bırakır. Gtk2 +ön yüzü Gtk1 ön yüzünden çok daha yavaştır; dolayısıyla yavaş bir +bilgisayarda Gtk1 ön yüzünü kullanmayı düşünebilirsiniz. </p> + <h3><a name="gtk2_ctype">ASCII olmayan karakterler _ (alt çizgi) +olarak gösteriliyor.</a></h3> + <p><code>LC_CTYPE</code> ya da <code>LC_ALL</code> ortam değişkenini +kullandığınız kodlamaya uygun bir değere ayarlayın. Mesela dosya isimlerinizde +özel Almanca karakterler kullanıyorsanız, değişkeni <code>de_DE.ISO8859-1</code> değerine ayarlayın. Geçerli değerler işletim sisteminize göre değişebilir, detaylar +için setlocale(3) kılavuz (man) sayfasına bakınız. İdeal olarak herkes neredeyse +tüm dilleri kapsayan UTF-8 kodlamasını kullanmalıdır. </p> + <!-- end faq --> + <!-- vi: set et ts=2 sw=2: --> + </body> +</html>
View file
gtk-gnutella-1.1.9.tar.bz2/extra_files/tr/Jmakefile
Added
@@ -0,0 +1,35 @@ +/* + * $Id$ + * + * Copyright (c) 2012 Raphael Manfredi + * + * FAQ installation in language-specific directory. + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +;# $Id$ + +all:: /* So that default target is not clobber! */ + +FAQDIR = $(PRIVLIB)/tr + +InstallNonExec(FAQ, $(FAQDIR)) +
View file
gtk-gnutella-1.1.9.tar.bz2/extra_files/tr/Makefile.SH
Added
@@ -0,0 +1,154 @@ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ + +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +CURRENT=extra_files/tr +DIR=`echo $CURRENT/ | sed -e 's/\.\///g'` +echo "Extracting ${DIR}Makefile (with variable substitutions)" + +INSTALL=`echo $install | sed -e 's,\./i,\$(TOP)/i,'` +INSTALLDIR=`echo $installdir | sed -e 's,\./i,\$(TOP)/i,'` +DATE=`date` + +$spitshell >Makefile <<!GROK!THIS! +######################################################################## +# Makefile generated from Makefile.SH on $DATE + +SHELL = /bin/sh +JMAKE = jmake +TOP = ../.. +CURRENT = $CURRENT +DIR = $DIR +INSTALL = $INSTALL +INSTALLDIR = $INSTALLDIR + +######################################################################## +# Parameters set by Configure -- edit config.sh if changes are needed + +CTAGS = ctags +JCPPFLAGS = $cppflags +MV = $mv +PRIVLIB = $installprivlib +RM = $rm -f + +!GROK!THIS! +$spitshell >>Makefile <<'!NO!SUBS!' +######################################################################## +# Jmake rules for building libraries, programs, scripts, and data files +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ + +######################################################################## +# Start of Jmakefile + +# $X-Id$ + +all:: + +FAQDIR = $(PRIVLIB)/tr + +local_install local_install-strip:: FAQ + @case '${MFLAGS}' in *i*) set +e;; esac; \ + (set -x; test -d $(INSTALL_PREFIX)$(FAQDIR) || \ + $(INSTALLDIR) $(INSTALL_PREFIX)$(FAQDIR)); \ + $(INSTALL) -c -m 444 FAQ $(INSTALL_PREFIX)$(FAQDIR) + +local_deinstall:: + $(RM) $(INSTALL_PREFIX)$(FAQDIR)/FAQ + +######################################################################## +# Common rules for all Makefiles -- do not edit + +all:: + +clean: local_clean +realclean: local_realclean +clobber: local_clobber + +local_clean:: + if test -f core; then $(RM) core; fi + $(RM) *~ *.o + +local_realclean:: local_clean + +local_clobber:: local_realclean + $(RM) Makefile config.sh + +install:: local_install + @exit 0 + +install-strip:: local_install-strip + @exit 0 + +install.man:: maybe_install.man +deinstall:: local_deinstall +deinstall.man:: maybe_deinstall.man + +install.man-no: +deinstall.man-no: + +maybe_install.man: install.man-no +maybe_deinstall.man: deinstall.man-no + +Makefile.SH: Jmakefile + -@if test -f $(TOP)/.package; then \ + if test -f Makefile.SH; then \ + echo " $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~"; \ + $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~; \ + fi; \ + echo " $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT)" ; \ + $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT) ; \ + else touch $@; fi + +Makefile: Makefile.SH + /bin/sh Makefile.SH + +tags:: + $(CTAGS) -w *.ch + $(CTAGS) -xw *.ch > tags + +local_clobber:: + $(RM) tags + +depend:: + +######################################################################## +# Empty rules for directories with no sub-directories -- do not edit + +local_install:: + @echo "install in $(CURRENT) done." + +local_install-strip:: + @echo "install (strip) in $(CURRENT) done." + +local_deinstall:: + @echo "deinstall in $(CURRENT) done." + +local_install.man:: + @echo "install.man in $(CURRENT) done." + +local_deinstall.man:: + @echo "deinstall.man in $(CURRENT) done." + +Makefiles:: + +Makefiles.SH:: + +!NO!SUBS! +chmod 644 Makefile +$eunicefix Makefile +
View file
gtk-gnutella-0.98.2.tar.bz2/gtk-gnutella.nsi -> gtk-gnutella-1.1.9.tar.bz2/gtk-gnutella.nsi
Changed
@@ -18,7 +18,7 @@ !insertmacro Script 'echo \"!define MINGW $MINGW\"' ; gtk installer name for embedding -!define GTK_INSTALLER_EXE "gtk2-runtime-2.24.8-2011-12-03-ash.exe" +!define GTK_INSTALLER_EXE "gtk2-runtime-2.24.10-2012-10-10-ash.exe" !include gtk-gnutella.nsh !define PRODUCT_NAME "gtk-gnutella" !define PRODUCT_NAME_SMALL "gtk-gnutella" @@ -171,12 +171,14 @@ File ${MINGW}\bin\libiconv-2.dll File ${MINGW}\bin\pthreadGC2.dll - ; Include gnutls - File ${DLLDIR_GNUTLS}\libgnutls-26.dll - File ${DLLDIR_GNUTLS}\libgcrypt-11.dll - File ${DLLDIR_GNUTLS}\libgpg-error-0.dll - File ${DLLDIR_GNUTLS}\libtasn1-3.dll - + ; Include gnutls -- these are for gnutls-3.4.5 + File ${DLLDIR_GNUTLS}\libgnutls-30.dll + File ${DLLDIR_GNUTLS}\libgcc_s_sjlj-1.dll + File ${DLLDIR_GNUTLS}\libgmp-10.dll + File ${DLLDIR_GNUTLS}\libhogweed-4-0.dll + File ${DLLDIR_GNUTLS}\libnettle-6-0.dll + File ${DLLDIR_GNUTLS}\libp11-kit-0.dll + SetOutPath $INSTDIR\share File /r win32\bundle\share\*.* @@ -421,7 +423,6 @@ Delete "$INSTDIR\libgnutls-26.dll" Delete "$INSTDIR\libgcrypt-11.dll" Delete "$INSTDIR\libgpg-error-0.dll" - Delete "$INSTDIR\libtasn1-3.dll" Delete "$INSTDIR\gtk-gnutella.exe" Delete "$INSTDIR\gtk-gnutella.nm"
View file
gtk-gnutella-0.98.2.tar.bz2/makensis.sh -> gtk-gnutella-1.1.9.tar.bz2/makensis.sh
Changed
@@ -4,7 +4,15 @@ # Season to taste export MINGW=C:/MinGW export WD=$MINGW/msys/1.0/bin -export PATH=$PATH:'/c/Program Files/NSIS':$MINGW/lib/gtk/bin +if test -d '/c/Program Files/NSIS'; then + NDIR='/c/Program Files/NSIS' +elif test -d '/c/Program Files (x86)/NSIS'; then + NDIR='/c/Program Files (x86)/NSIS' +else + echo "Where is NSIS installed?" + NDIR=/c +fi +export PATH=$PATH:$NDIR:$MINGW/lib/gtk/bin if makensis gtk-gnutella.nsi >makensis.log 2>&1; then echo "OK"
View file
gtk-gnutella-0.98.2.tar.bz2/osx/gtk-gnutella.bundle -> gtk-gnutella-1.1.9.tar.bz2/osx/gtk-gnutella.bundle
Changed
@@ -60,7 +60,7 @@ ${prefix}/lib/${gtkdir}/modules/*.so </binary> - <!-- Copy in GTK+ theme engines. Note the use of the + <!-- Copy in GTK+ theme engines and print backends. Note the use of the "${pkg:module:variable}" macro, which evaluates to a pkg-config variable in the specified module. Note that any libraries that binaries link to are also copied in automatically. Note also @@ -71,14 +71,18 @@ </binary> <binary> - ${prefix}/lib/gdk-pixbuf-2.0/${pkg:gdk-pixbuf-2.0:gdk_pixbuf_binary_version}/loaders/*.so + ${prefix}/lib/${gtkdir}/${pkg:${gtk}:gtk_binary_version}/printbackends/*.so </binary> - +<!-- Starting with 2.24, gdk-pixbuf installs into its own directory. --> <binary> - ${prefix}/lib/gdk-pixbuf-2.0/* + ${prefix}/lib/gdk-pixbuf-2.0/${pkg:${gtk}:gtk_binary_version}/loaders/*.so </binary> - + + <binary> + ${prefix}/lib/pango/${pkg:pango:pango_module_version}/modules/ + </binary> + <!-- Translation filenames, one for each program or library that you want to copy in to the bundle. The "dest" attribute is optional, as usual. Bundler will find all translations of that
View file
gtk-gnutella-0.98.2.tar.bz2/osx/launcher.sh -> gtk-gnutella-1.1.9.tar.bz2/osx/launcher.sh
Changed
@@ -1,22 +1,23 @@ #!/bin/sh -if test "x$IGE_DEBUG_LAUNCHER" != x; then +if test "x$GTK_DEBUG_LAUNCHER" != x; then set -x fi -if test "x$IGE_DEBUG_GDB" != x; then +if test "x$GTK_DEBUG_GDB" != x; then EXEC="gdb --args" else EXEC=exec fi -name="`basename $0`" -tmp="`pwd`/$0" +name=`basename "$0"` +tmp="$0" tmp=`dirname "$tmp"` tmp=`dirname "$tmp"` bundle=`dirname "$tmp"` bundle_contents="$bundle"/Contents bundle_res="$bundle_contents"/Resources +#bundle_fw="$bundle_contents"/Frameworks #uncomment if you need it bundle_lib="$bundle_res"/lib bundle_bin="$bundle_res"/bin bundle_data="$bundle_res"/share @@ -31,124 +32,89 @@ export GTK2_RC_FILES="$bundle_etc/gtk-2.0/gtkrc" export GTK_IM_MODULE_FILE="$bundle_etc/gtk-2.0/gtk.immodules" -export GDK_PIXBUF_MODULE_FILE="$bundle_etc/gtk-2.0/gdk-pixbuf.loaders" -export PANGO_RC_FILE="$bundle_etc/pango/pangorc" +export GDK_PIXBUF_MODULE_FILE="$bundle_lib/gdk-pixbuf-2.0/2.10.0/loaders.cache" +export PANGO_LIBDIR="$bundle_lib" +export PANGO_SYSCONFDIR="$bundle_etc" -APP=gtk-gnutella -I18NDIR="$bundle_data/locale" -# Set the locale-related variables appropriately: -unset LANG LC_MESSAGES LC_MONETARY LC_COLLATE +# Localization settings. It's better to do this inside your program +# using NSLocale if possible. -# Has a language ordering been set? -# If so, set LC_MESSAGES and LANG accordingly; otherwise skip it. -# First step uses sed to clean off the quotes and commas, to change - to _, and change the names for the chinese scripts from "Hans" to CN and "Hant" to TW. -APPLELANGUAGES=`defaults read .GlobalPreferences AppleLanguages | sed -En -e 's/\-/_/' -e 's/Hant/TW/' -e 's/Hans/CN/' -e 's/:space:*\"?(:alnum:_+)\"?,?/\1/p' ` -if test "$APPLELANGUAGES"; then - # A language ordering exists. - # Test, item per item, to see whether there is an corresponding locale. - for L in $APPLELANGUAGES; do - #test for exact matches: - if test -f "$I18NDIR/${L}/LC_MESSAGES/$APP.mo"; then - export LANG=$L - break - fi - #This is a special case, because often the original strings are in US - #English and there is no translation file. - if test "x$L" == "xen_US"; then - export LANG=$L - break - fi - #OK, now test for just the first two letters: - if test -f "$I18NDIR/${L:0:2}/LC_MESSAGES/$APP.mo"; then - export LANG=${L:0:2} - break - fi - #Same thing, but checking for any english variant. - if test "x${L:0:2}" == "xen"; then - export LANG=$L - break - fi; - done -fi -unset APPLELANGUAGES L +# Set the locale-related variables appropriaty for GnuCash. +unset LANG LC_MESSAGES LC_MONETARY -# If we didn't get a language from the language list, try the Collation preference, in case it's the only setting that exists. +# Start by trying the Collation preference, in case it's the only setting that exists. APPLECOLLATION=`defaults read .GlobalPreferences AppleCollationOrder` -if test -z ${LANG} -a -n $APPLECOLLATION; then - if test -f "$I18NDIR/${APPLECOLLATION:0:2}/LC_MESSAGES/$APP.mo"; then - export LANG=${APPLECOLLATION:0:2} - fi -fi -if test ! -z $APPLECOLLATION; then - export LC_COLLATE=$APPLECOLLATION +if test "${APPLECOLLATION}"; then + COLL=`ls -d /usr/share/locale/${APPLECOLLATION}*.UTF-8 2>> /dev/null` + if test "${COLL}"; then + # $COLL is potentially multi-line; concatenate lines by not using quotes. + export LANG=`echo ${COLL} | awk '{print $1}' | awk -F/ '{print $5}'` + fi fi -unset APPLECOLLATION +unset APPLECOLLATION COLL # Continue by attempting to find the Locale preference. APPLELOCALE=`defaults read .GlobalPreferences AppleLocale` - -if test -f "$I18NDIR/${APPLELOCALE:0:5}/LC_MESSAGES/$APP.mo"; then - if test -z $LANG; then - export LANG="${APPLELOCALE:0:5}" +if test "${APPLELOCALE}"; then + LOCALELANG=`echo "${APPLELOCALE}" | awk -F@ '{print $1".UTF-8"}'` + if test -d "/usr/share/locale/${LOCALELANG}"; then + export LANG="${LOCALELANG}" fi - -elif test -z $LANG -a -f "$I18NDIR/${APPLELOCALE:0:2}/LC_MESSAGES/$APP.mo"; then - export LANG="${APPLELOCALE:0:2}" fi +unset LOCALELANG -#Next we need to set LC_MESSAGES. If at all possilbe, we want a full -#5-character locale to avoid the "Locale not supported by C library" -#warning from Gtk -- even though Gtk will translate with a -#two-character code. -if test -n $LANG; then -#If the language code matches the applelocale, then that's the message -#locale; otherwise, if it's longer than two characters, then it's -#probably a good message locale and we'll go with it. - if test $LANG == ${APPLELOCALE:0:5} -o $LANG != ${LANG:0:2}; then - export LC_MESSAGES=$LANG -#Next try if the Applelocale is longer than 2 chars and the language -#bit matches $LANG - elif test $LANG == ${APPLELOCALE:0:2} -a $APPLELOCALE > ${APPLELOCALE:0:2}; then - export LC_MESSAGES=${APPLELOCALE:0:5} -#Fail. Get a list of the locales in $PREFIX/share/locale that match -#our two letter language code and pick the first one, special casing -#english to set en_US - elif test $LANG == "en"; then - export LC_MESSAGES="en_US" - else - LOC=`find $PREFIX/share/locale -name $LANG???` - for L in $LOC; do - export LC_MESSAGES=$L - done - fi -else -#All efforts have failed, so default to US english - export LANG="en_US" - export LC_MESSAGES="en_US" +# If there is still no locale value, then set US English as a default. +if test -z "${LANG}"; then + export LANG=en_US.UTF-8 fi -CURRENCY=`echo $APPLELOCALE | sed -En 's/.*currency=(:alpha:+).*/\1/p'` -if test "x$CURRENCY" != "x"; then -#The user has set a special currency. Gtk doesn't install LC_MONETARY files, but Apple does in /usr/share/locale, so we're going to look there for a locale to set LC_CURRENCY to. - if test -f /usr/local/share/$LC_MESSAGES/LC_MONETARY; then - if test -a `cat /usr/local/share/$LC_MESSAGES/LC_MONETARY` == $CURRENCY; then - export LC_MONETARY=$LC_MESSAGES - fi + +# The AppleLocale setting may contain a currency-related substring. +# Attempt to act on it. +# First strip the string to just the currency symbol and the language symbol +APPLECURRENCY=`echo "${APPLELOCALE}" | awk -F= '{print $2}'` +APPLELANG=`echo "${APPLELOCALE}" | awk -F_ '{print $1}'` +if test "${APPLECURRENCY}"; then + # The user has set a currency different from that of their locale. + # Search for a locale that uses that currency, and set LC_MONETARY accordingly. + + # First try to find an LC_MONETARY file that combines the language with the currency. + FILES=`find /usr/share/locale/${APPLELANG}*UTF-8 -name LC_MONETARY -exec grep -H $APPLECURRENCY {} \;` + if test -z "$FILES"; then + # Otherwise try to find any LC_MONETARY file that uses that currency. + FILES=`find /usr/share/locale/*UTF-8 -name LC_MONETARY -exec grep -H $APPLECURRENCY {} \;` fi - if test -z "$LC_MONETARY"; then - FILES=`find /usr/share/locale -name LC_MONETARY -exec grep -H $CURRENCY {} \;` - if test -n "$FILES"; then - export LC_MONETARY=`echo $FILES | sed -En 's%/usr/share/locale/(:alpha:_+)/LC_MONETARY.*%\1%p'` - fi + + if test "$FILES"; then + # We found a locale that matches; set LC_MONETARY. + export LC_MONETARY=`echo ${FILES} | awk -F: '{print $1}' | awk -F/ '{print $5}'` fi fi -#No currency value means that the AppleLocale governs: -if test -z "$LC_MONETARY"; then - LC_MONETARY=${APPLELOCALE:0:5} -fi -#For Gtk, which only looks at LC_ALL: -export LC_ALL=$LC_MESSAGES +unset APPLECURRENCY APPLELANG APPLELOCALE FILES -unset APPLELOCALE FILES LOC +# Has a language ordering been set? +# If so, set LC_MESSAGES accordingly; otherwise skip it. +APPLELANGUAGES=`defaults read .GlobalPreferences AppleLanguages | awk 'length > 2' | awk -F, '{print $1}' | sed s/\ //g | sed s/-/_/ | sed s/\"//g` +if test "$APPLELANGUAGES"; then + # A language ordering exists. + # Test, item per item, to see whether there is an corresponding locale. + for L in $APPLELANGUAGES + do + POS=`echo ${L} | awk '{print index(ENVIRON"LANG", $0)}'` + if test $POS -eq 1; then + # The language symbol is a subset of the $LANG variable. We're done! + break + fi + # NOTE: the following may fail for the alternate Chinese localizations. + LC=`ls -d /usr/share/locale/${L}*.UTF-8 2>> /dev/null` + # $LC is potentially multi-line; concatenate lines by not using quotes. + if test $LC; then + # There is a UTF-8 locale matching this language. + export LC_MESSAGES=`echo ${LC} | awk '{print $1}' | awk -F/ '{print $5}'` + break + fi + done +fi +unset APPLELANGUAGES POS LC L if test -f "$bundle_lib/charset.alias"; then export CHARSETALIASDIR="$bundle_lib" @@ -161,16 +127,10 @@ fi # Strip out the argument added by the OS. -if x`echo "x$1" | sed -e "s/^x-psn_.*//"` == x ; then +if /bin/expr "x$1" : '^x-psn_' > /dev/null; then shift 1 fi -cd "$bundle_contents/Resources/" - -export NLSPATH="$I18NDIR" - -# Number of allowed file descriptors ulimit -n 2048 +$EXEC "$bundle_contents/MacOS/$name-bin" "$@" --no-restart $EXTRA_ARGS -$EXEC "$bundle_contents/MacOS/$name-bin" $* --no-restart $EXTRA_ARGS -#$EXEC "$bundle_res/gtk-gnutella" $* $EXTRA_ARGS
View file
gtk-gnutella-0.98.2.tar.bz2/pixmaps/Jmakefile -> gtk-gnutella-1.1.9.tar.bz2/pixmaps/Jmakefile
Changed
@@ -47,15 +47,19 @@ firewall_udp.xpm \ firewall_udp_punchable.xpm \ freeze.xpm \ + go_back.xpm \ + hungup.xpm \ icon.16x16.xpm \ - icon.32x32.xpm \ + icon.48x48.xpm \ icon.xpm \ leaf.xpm \ legacy.xpm \ magnet.16x16.png \ magnet.32x32.png \ magnet.64x64.png \ + natpmp.xpm \ no_firewall.xpm \ + no_listening.xpm \ offline.xpm \ online.xpm \ pause.xpm \
View file
gtk-gnutella-0.98.2.tar.bz2/pixmaps/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/pixmaps/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-94 -: $X-Id: Jmake.tmpl 69 2011-01-09 13:57:07Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -50,12 +50,12 @@ $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 94 2011-02-10 14:06:58Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Start of Jmakefile -# $X-Id: Jmakefile 18839 2011-02-25 12:32:03Z rmanfredi $ +# $X-Id$ PIXMAPS = \ arrow_down.xpm \ @@ -77,15 +77,19 @@ firewall_udp.xpm \ firewall_udp_punchable.xpm \ freeze.xpm \ + go_back.xpm \ + hungup.xpm \ icon.16x16.xpm \ - icon.32x32.xpm \ + icon.48x48.xpm \ icon.xpm \ leaf.xpm \ legacy.xpm \ magnet.16x16.png \ magnet.32x32.png \ magnet.64x64.png \ + natpmp.xpm \ no_firewall.xpm \ + no_listening.xpm \ offline.xpm \ online.xpm \ pause.xpm \ @@ -145,6 +149,11 @@ $(RM) Makefile config.sh install:: local_install + @exit 0 + +install-strip:: local_install-strip + @exit 0 + install.man:: maybe_install.man deinstall:: local_deinstall deinstall.man:: maybe_deinstall.man @@ -183,6 +192,9 @@ local_install:: @echo "install in $(CURRENT) done." +local_install-strip:: + @echo "install (strip) in $(CURRENT) done." + local_deinstall:: @echo "deinstall in $(CURRENT) done."
View file
gtk-gnutella-1.1.9.tar.bz2/pixmaps/go_back.xpm
Added
@@ -0,0 +1,175 @@ +/* XPM */ +static char *go_back = { +/* width height num_colors chars_per_pixel */ +" 16 16 152 2", +/* colors */ +".. c None", +".# c #000205", +".a c #000925", +".b c #00102c", +".c c #001e68", +".d c #00205b", +".e c #00286e", +".f c #00358c", +".g c #0051b6", +".h c #010407", +".i c #010508", +".j c #061f39", +".k c #06316a", +".l c #07316a", +".m c #082940", +".n c #0f7bcf", +".o c #0f80cf", +".p c #114a7e", +".q c #115bb1", +".r c #135d98", +".s c #1558ab", +".t c #155d98", +".u c #1755a1", +".v c #1a6aa2", +".w c #1e648b", +".x c #2261ac", +".y c #2262ac", +".z c #239ddc", +".A c #248bd7", +".B c #2585c6", +".C c #2686c6", +".D c #279ce2", +".E c #2a75bc", +".F c #2a75be", +".G c #2a9ee1", +".H c #2b76bb", +".I c #2c7cc1", +".J c #2ca7e1", +".K c #2da4e0", +".L c #2ea3df", +".M c #2f67bb", +".N c #2f7ac1", +".O c #3070bd", +".P c #3292d4", +".Q c #3296da", +".R c #3398db", +".S c #359adb", +".T c #3695db", +".U c #36a5e0", +".V c #3783c8", +".W c #37a9e2", +".X c #389cd4", +".Y c #399ed3", +".Z c #3aabe6", +".0 c #3ca8e1", +".1 c #3e8acb", +".2 c #3f89cb", +".3 c #3fafe4", +".4 c #4098d5", +".5 c #40abdf", +".6 c #41a7df", +".7 c #4293d0", +".8 c #42abe0", +".9 c #43a6dc", +"#. c #4485c7", +"## c #44ace0", +"#a c #45b0e3", +"#b c #47a5de", +"#c c #49b3e4", +"#d c #4a90cc", +"#e c #4a90cd", +"#f c #4aace2", +"#g c #4aaee5", +"#h c #4abeed", +"#i c #4b85c6", +"#j c #4cb3e7", +"#k c #4eb3e7", +"#l c #54c1ed", +"#m c #58bbe7", +"#n c #598fc9", +"#o c #5aaedf", +"#p c #5aafdf", +"#q c #5ac3ee", +"#r c #5bb8e2", +"#s c #5ea7db", +"#t c #5ec0e7", +"#u c #5fbde8", +"#v c #60d3f7", +"#w c #62a4dc", +"#x c #62bfe8", +"#y c #62c1e8", +"#z c #63cff2", +"#A c #65bde6", +"#B c #66d3f7", +"#C c #67b6e2", +"#D c #68c5e8", +"#E c #68cdf2", +"#F c #69b6e2", +"#G c #69cef2", +"#H c #6aaadd", +"#I c #6bcaee", +"#J c #6bd2f3", +"#K c #6ed6f6", +"#L c #6fd3f4", +"#M c #70dbfc", +"#N c #71c9ee", +"#O c #71d2f3", +"#P c #71d3f3", +"#Q c #72d2f2", +"#R c #72e2ff", +"#S c #73d1f0", +"#T c #73dafd", +"#U c #74d2f1", +"#V c #74d4f5", +"#W c #75d7f5", +"#X c #75daf9", +"#Y c #76d4f4", +"#Z c #76dbf9", +"#0 c #77d7f5", +"#1 c #77dbf9", +"#2 c #78dcf9", +"#3 c #79daf6", +"#4 c #7cd4f0", +"#5 c #7edbf5", +"#6 c #7fd8f1", +"#7 c #7fdff8", +"#8 c #80caea", +"#9 c #80dbf6", +"a. c #80dcf6", +"a# c #80e4fc", +"aa c #81dcf8", +"ab c #84ceee", +"ac c #84e2fa", +"ad c #86e1fc", +"ae c #86e2f7", +"af c #89e1f8", +"ag c #89e2f8", +"ah c #8ae1f8", +"ai c #8be8fd", +"aj c #8fecfc", +"ak c #92e3f9", +"al c #93e2f7", +"am c #95e4f8", +"an c #95e7fa", +"ao c #96e5f7", +"ap c #9deeff", +"aq c #f0f2f7", +"ar c #f3f4f8", +"as c #f9f8f9", +"at c #fffefa", +"au c #fffffe", +"av c #ffffff", +/* pixels */ +".........a.d.s.u.u.s.d.a........", +".....#.c.I#r#U#7#5#S#r.I.c.#....", +"...#.f#paf#6#t#b#x#D#4ah#o.f.#..", +"...e#Cal#y.K#s#w.J.3#c#uao#F.e..", +".b#dak#m.W.4av#H.z.0.U.L.5am#e.b", +".l#8#I#a.7asav#k#k#k#k#k#k#kab.k", +".xad#f.2aravavavavavavavav.6aa.y", +".N#N#nauavavavavavavavavav.9an.F", +".1#A#iavavavavavavavavavav.oap.V", +".H#T.D#.auavavavavavavavav.n#M.E", +".p#l#B.G.Oaqav.M.n.n.n.n.n.P#v.p", +".j#g#L#K.Z.qat.M.A.S.R.Q.T#G#j.j", +"...t#E#V#1#h.M.M#R#2#Z#Xa##J.r..", +"...h.C#P#9ac#z.g#W#Q#Ya.#O.B.h..", +".....i.v#q#0ajaiagae#3#q.v.i....", +".........m.w.X##.8.Y.w.m........" +};
View file
gtk-gnutella-1.1.9.tar.bz2/pixmaps/hungup.xpm
Added
@@ -0,0 +1,163 @@ +/* XPM */ +static char *hungup = { +/* width height num_colors chars_per_pixel */ +" 16 16 140 2", +/* colors */ +".. c None", +".# c #030000", +".a c #060000", +".b c #070000", +".c c #070001", +".d c #090001", +".e c #0d0001", +".f c #1d0002", +".g c #220002", +".h c #2a0001", +".i c #2b0000", +".j c #2c0002", +".k c #300104", +".l c #3a0001", +".m c #3c0105", +".n c #3e0000", +".o c #510307", +".p c #570000", +".q c #570003", +".r c #5c0000", +".s c #5d0206", +".t c #650001", +".u c #680001", +".v c #6c0209", +".w c #780b11", +".x c #7b0008", +".y c #85030d", +".z c #870003", +".A c #880006", +".B c #8d171d", +".C c #9b0610", +".D c #9d030e", +".E c #9f1720", +".F c #a60f12", +".G c #b10912", +".H c #b50306", +".I c #b60408", +".J c #b61e13", +".K c #b82324", +".L c #bb0509", +".M c #bd0608", +".N c #c00609", +".O c #c21e1f", +".P c #c41b12", +".Q c #c61418", +".R c #c70c16", +".S c #c7373a", +".T c #cb1d26", +".U c #cf171c", +".V c #d20812", +".W c #d20c10", +".X c #d41c1f", +".Y c #d61f20", +".Z c #df4645", +".0 c #e1392f", +".1 c #e14f4d", +".2 c #e6211d", +".3 c #e71019", +".4 c #e7171c", +".5 c #e73d44", +".6 c #e81c1e", +".7 c #e93029", +".8 c #ea3126", +".9 c #ea5238", +"#. c #eb3128", +"## c #ec4442", +"#a c #ec4b34", +"#b c #ed2725", +"#c c #ee5437", +"#d c #ef3526", +"#e c #ef5a57", +"#f c #ef5b58", +"#g c #f03f46", +"#h c #f1423b", +"#i c #f37571", +"#j c #f44234", +"#k c #f55337", +"#l c #f61d21", +"#m c #f63024", +"#n c #f63434", +"#o c #f66060", +"#p c #f72422", +"#q c #f73229", +"#r c #f7573d", +"#s c #f76442", +"#t c #f83925", +"#u c #f83f24", +"#v c #f83f2c", +"#w c #f8563c", +"#x c #f8623f", +"#y c #f9151f", +"#z c #f95a5d", +"#A c #f95e40", +"#B c #f96b6b", +"#C c #fa6b46", +"#D c #fb2721", +"#E c #fb4d2e", +"#F c #fb5132", +"#G c #fb5b3b", +"#H c #fc5135", +"#I c #fc5a34", +"#J c #fc5d39", +"#K c #fc5e36", +"#L c #fc6641", +"#M c #fc673f", +"#N c #fc6844", +"#O c #fc6944", +"#P c #fc6f46", +"#Q c #fd2d29", +"#R c #fd613d", +"#S c #fd8b61", +"#T c #fd907b", +"#U c #fd9268", +"#V c #fd956c", +"#W c #fd958a", +"#X c #fe3a2e", +"#Y c #fe583a", +"#Z c #fe6f48", +"#0 c #fe7048", +"#1 c #fe754c", +"#2 c #fe764e", +"#3 c #fe976d", +"#4 c #ff2524", +"#5 c #ff4832", +"#6 c #ff4f46", +"#7 c #ff5542", +"#8 c #ff6249", +"#9 c #ff744c", +"a. c #ff7950", +"a# c #ff7a4e", +"aa c #ff7d5c", +"ab c #ff8063", +"ac c #ff9b71", +"ad c #ffa67d", +"ae c #ffa88c", +"af c #ffae96", +"ag c #ffb08b", +"ah c #ffb292", +"ai c #ffb491", +"aj c #ffc5a6", +/* pixels */ +"...............l.B.5#e#f##.E.g..", +"...........h.T#Waead#V#U#3ac#h.m", +".........t#zaj#S#P#L#O#N#9#c.J#b", +".......u#Bai#M#Z#2#1#Ca..9.H#s.O", +".....q#oag#K#0#A.Y#ja##a.I#x.X.d", +"...##gah#I#0#r.D...y.0.P#k.U.a..", +"...Gaf#J#R#w.C.......x#..Q.e....", +".i#iaa#F#G.R...........k.c......", +".w#T#E#Y.8.f....................", +".Sab#u#H#d.v....................", +".1#8#t#v#5.7.A.b................", +".Z#7#m#X#q.M.2.s................", +".K#6#D#Q.L#p.6.j................", +".o#n#4.N#l.4.n..................", +".#.F.W#y.3.p....................", +"...#.z.V.r......................" +};
View file
gtk-gnutella-1.1.9.tar.bz2/pixmaps/icon.48x48.xpm
Added
@@ -0,0 +1,54 @@ +/* XPM */ +static char * icon_xpm = { +"48 48 3 1", +" c None", +". c #080F91", +"+ c #7979B2", +" ...++ ", +" ........++++++ ", +" ..............++++++++++ ", +" ...................++++++++++++++ ", +" ................++++....++++++++++++++++++ ", +"............+++++ +++ ....++ ++++++++++++", +".....+++++.. +++ ....++ ++ ++++++", +"..++ ..++++ ....++... ...++.....++", +".. .. +++ ....++.........++.....++", +".. .. +++....++....... ++ ++", +".. .. +++....++ .. ++ ++", +".. .. ++....++ .. ++ ++", +".. .. ++....++ .. ++ ++", +".. .. ++....++ .. ++ ++", +".. .. ++....++ .. ++ ++", +".. .. ++....++ .. ++ ++", +".. .. ++....++ .. ++ ++", +".. .. ++....++ .. ++ ++", +".. .. ++....++ .. ++ ++", +"..+ .. ++....++ .. ++ .++", +"............+++ +++....++......++++++++++++", +"...................+++++....++++++++++++++++++++", +".. ........................++++++++++++++++..++", +".. ..................+++++++++++++ ++", +".. .. +++........++++++ ++ ++", +".. .. + ....++ .. ++ ++", +".. .. ++....++ .. ++ ++", +".. .. ++....++ .. ++ ++", +".. .. ++....++ .. ++ ++", +".. .. ++....++ .. ++ ++", +".. .. ++....++ .. ++ ++", +".. .. +++....++ .. ++ ++", +".. .. +++ ....++.... ++ ++", +".. .. +++ ....++.........++ ++", +"... ...+ ++ ....++. ....++....+++", +"......++ .. +++ ....++ ++..+++++", +" ....... .. ++....++ ++.++++++", +" ........ +++ ....++ +++++++ ", +" ....... +++ ....++... ++++++ ", +" .......+ ....++ .+++++++ ", +" ........ ....++ .+++++ ", +" .......+ ....++ .++++++ ", +" .............++.++++++ ", +" ...........+++++++ ", +" .........++++++ ", +" ......++++ ", +" ....++ ", +" .+ "};
View file
gtk-gnutella-0.98.2.tar.bz2/pixmaps/icon.xpm -> gtk-gnutella-1.1.9.tar.bz2/pixmaps/icon.xpm
Changed
@@ -1,54 +1,71 @@ /* XPM */ -static char * icon_xpm = { -"48 48 3 1", -" c None", -". c #080F91", -"+ c #7979B2", -" ...++ ", -" ........++++++ ", -" ..............++++++++++ ", -" ...................++++++++++++++ ", -" ................++++....++++++++++++++++++ ", -"............+++++ +++ ....++ ++++++++++++", -".....+++++.. +++ ....++ ++ ++++++", -"..++ ..++++ ....++... ...++.....++", -".. .. +++ ....++.........++.....++", -".. .. +++....++....... ++ ++", -".. .. +++....++ .. ++ ++", -".. .. ++....++ .. ++ ++", -".. .. ++....++ .. ++ ++", -".. .. ++....++ .. ++ ++", -".. .. ++....++ .. ++ ++", -".. .. ++....++ .. ++ ++", -".. .. ++....++ .. ++ ++", -".. .. ++....++ .. ++ ++", -".. .. ++....++ .. ++ ++", -"..+ .. ++....++ .. ++ .++", -"............+++ +++....++......++++++++++++", -"...................+++++....++++++++++++++++++++", -".. ........................++++++++++++++++..++", -".. ..................+++++++++++++ ++", -".. .. +++........++++++ ++ ++", -".. .. + ....++ .. ++ ++", -".. .. ++....++ .. ++ ++", -".. .. ++....++ .. ++ ++", -".. .. ++....++ .. ++ ++", -".. .. ++....++ .. ++ ++", -".. .. ++....++ .. ++ ++", -".. .. +++....++ .. ++ ++", -".. .. +++ ....++.... ++ ++", -".. .. +++ ....++.........++ ++", -"... ...+ ++ ....++. ....++....+++", -"......++ .. +++ ....++ ++..+++++", -" ....... .. ++....++ ++.++++++", -" ........ +++ ....++ +++++++ ", -" ....... +++ ....++... ++++++ ", -" .......+ ....++ .+++++++ ", -" ........ ....++ .+++++ ", -" .......+ ....++ .++++++ ", -" .............++.++++++ ", -" ...........+++++++ ", -" .........++++++ ", -" ......++++ ", -" ....++ ", -" .+ "}; +static char *icon = { +/* width height ncolors chars_per_pixel */ +"32 32 32 1", +/* colors */ +" c #7979B2", +". c #070D81", +"X c #5356A7", +"o c #050A61", +"O c #5E5E8A", +"+ c #393B80", +"@ c #383B7F", +"# c #6C6C9E", +"$ c #1E2058", +"% c #050850", +"& c #6C6DAE", +"* c #2E329C", +"= c #525287", +"- c #080F91", +"; c #060C71", +": c #212698", +"> c #5E5E8B", +", c #434363", +"< c #1D2058", +"1 c #515177", +"2 c #131775", +"3 c #202588", +"4 c #1E2268", +"5 c #525387", +"6 c #525497", +"7 c #383970", +"8 c #37396F", +"9 c #6062AB", +"0 c #474AA3", +"q c #212798", +"w c #2A2C5B", +"e c None", +/* pixels */ +"eeeeeeeeeeeeeeee%-* eeeeeeeeeeee", +"eeeeeeeeeeooo.----* #11eeeeeee", +"eeeeee-------:**--* eeee", +"oo;-----XXX$e= ,--* eeee #1", +"-:3711+-eeeee1ee--* eeeeee wXX9 ", +"-<eeeee-eeee1eee--* --oo-- *--* ", +"-eeeeee-eeeeee --* o..oee eeee ", +"-eeeeee-eeeeee, --* eooeee eeee ", +"-eeeeee-eeeeeee --* eooeee eeee ", +"-eeeeee-eeeeeee --* eooeee eeee ", +"-eeeeee-eeeeeee --* eooeee eeee ", +"-eeeeee-eeeeeee --* eooeee eeee ", +"-<eeeee-eeeeeee --* eooeee eeew ", +"-:oooo;-11eeee> --* o..o11 >119 ", +"-;;---------qXXX--* 99 ", +"-eeeee%-----------* ,eew ", +"-eeeeee-eeee1422--* 168eee eeee ", +"-eeeeee-eeeeeee>--* eooeee eeee ", +"-eeeeee-eeeeeee --* eooeee eeee ", +"-eeeeee-eeeeeee --* eooeee eeee ", +"-eeeeee-eeeeee, --* eooeee eeee ", +"-eeeeee-eeee11ee--* o.oeee eeee ", +"-%eeee%-ee>,eeee--* .oo.-- wee, ", +"--oo1e%-eeeee1ee--* eeeeee *qX ", +"eo;--%%-eeeeeee1--* eeeeee 0 #1", +"eeee----eee1,eee--* ooeeee ,ee", +"eeeeee;---@eeeee--* eeeX #1eeee", +"eeeeeeee%---o7ee--* ee5& eeeeee", +"eeeeeeeeeeo.------* 0 >eeeeeeee", +"eeeeeeeeeeee%-----* Oeeeeeeeee", +"eeeeeeeeeeeeeeeo--* 1eeeeeeeeeee", +"eeeeeeeeeeeeeeeeee*,eeeeeeeeeeee" +};
View file
gtk-gnutella-1.1.9.tar.bz2/pixmaps/natpmp.xpm
Added
@@ -0,0 +1,24 @@ +/* XPM */ +static char * upnp_xpm = { +"16 16 5 1", +" c None", +". c #FFFFFF", +"+ c #801bff", +"@ c #858585", +"# c #3A3A3A", +" ", +" ", +" ", +" +++ ", +" +++++ ", +" ++++++@@@@ ", +" +++++++ ", +" ###+++++++ ", +" ###+++++++ ", +" +++++++ ", +" ++++++@@@@ ", +" +++++ ", +" +++ ", +" ", +" ", +" "};
View file
gtk-gnutella-1.1.9.tar.bz2/pixmaps/no_listening.xpm
Added
@@ -0,0 +1,95 @@ +/* XPM */ +static char *no_listening = { +/* width height num_colors chars_per_pixel */ +" 16 16 72 2", +/* colors */ +".. c None", +".# c #0d0101", +".a c #0e0202", +".b c #0e0203", +".c c #0e0303", +".d c #0e0304", +".e c #2e0305", +".f c #2f0305", +".g c #2f0407", +".h c #300407", +".i c #300609", +".j c #30080b", +".k c #5f0007", +".l c #630008", +".m c #770009", +".n c #84000a", +".o c #8d000b", +".p c #95020d", +".q c #b00a13", +".r c #bf0e17", +".s c #c10e17", +".t c #dc161e", +".u c #dc1821", +".v c #e81921", +".w c #e8212a", +".x c #e8222b", +".y c #e9252d", +".z c #e9262e", +".A c #eb1a22", +".B c #ec252d", +".C c #ed1b23", +".D c #ed1c24", +".E c #ed2028", +".F c #ed2129", +".G c #ed252d", +".H c #ed2f37", +".I c #ed3038", +".J c #ee2f37", +".K c #ee373f", +".L c #ee3840", +".M c #ee3b43", +".N c #ef3d45", +".O c #ef464e", +".P c #f04b53", +".Q c #f0535b", +".R c #f0565f", +".S c #f05962", +".T c #f15056", +".U c #f1595f", +".V c #f1636c", +".W c #f16770", +".X c #f16c75", +".Y c #f26e77", +".Z c #f26f78", +".0 c #f48c92", +".1 c #f5888d", +".2 c #f69397", +".3 c #f79a9e", +".4 c #f79b9f", +".5 c #f79ea2", +".6 c #f7a2a6", +".7 c #f7a3a7", +".8 c #f7a4a8", +".9 c #f7a5a9", +"#. c #f7aaaf", +"## c #f8a8ac", +"#a c #f8aeb2", +"#b c #f8b0b4", +"#c c #fef7f8", +"#d c #fef9f9", +"#e c #fefafa", +"#f c #ffffff", +/* pixels */ +".........j.k.n.o.o.n.k.j........", +".....d.l.p.r.u.B.B.u.s.p.l.c....", +"...c.m.q.z.Q.X.Z.Z.X.Q.y.q.m.b..", +"...l.q.I.V.W.Y.0.0.Y.W.V.H.q.l..", +".g.p.x.R.S#.#e#f#f#b.S.S.R.w.p.i", +".k.s.M.P.7#f#f#f#a.P.P.P.P.M.r.k", +".n.t.K.O#d#f#f##.N.N.N.9.O.L.t.n", +".o.A.D.U#f#f.6.J.J.J.8#f.U.D.A.o", +".o.A.C.T#f.4.E.F.F.5#f#f.T.C.A.o", +".n.t.C.G.2.C.C.C.3#f#f#c.G.C.t.n", +".k.s.C.C.C.C.C.3#f#f#f.1.C.C.s.k", +".e.p.v.C.C.C.2#f#f#c.1.C.C.v.p.h", +"...l.q.C.C.C.G.T.T.G.C.C.C.q.l..", +"...#.m.q.v.C.C.C.C.C.C.v.q.m.a..", +".....#.l.p.s.t.A.A.t.s.p.l.a....", +".........e.k.n.o.o.n.k.f........" +};
View file
gtk-gnutella-0.98.2.tar.bz2/po/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/po/Makefile.SH
Changed
@@ -160,7 +160,7 @@ echo "# Regenerated on `date`"; \ echo ""; \ (cd $(top_srcdir); find src -name "*.ct" | xargs grep -l _\( | \ - grep -v gtk1/interface-glade.c | sort); \ + egrep -v -e gtk1/interface-glade.c -e '/gen-.*\.c' | sort); \ echo "# The End"; \ ) >POTFILES.in @@ -189,7 +189,9 @@ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ - --msgid-bugs-address='$(MSGID_BUGS_ADDRESS)' + --msgid-bugs-address='$(MSGID_BUGS_ADDRESS)' \ + --package-name='$(PACKAGE)' \ + --package-version='$(VERSION)' test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \
View file
gtk-gnutella-0.98.2.tar.bz2/po/POTFILES.in -> gtk-gnutella-1.1.9.tar.bz2/po/POTFILES.in
Changed
@@ -1,12 +1,13 @@ # List of source files containing translatable strings. -# Regenerated on Wed Nov 9 15:03:57 CET 2011 +# Regenerated on Sun Dec 13 14:34:01 CET 2015 -src/core/bitzi.c +src/core/ban.c src/core/downloads.c src/core/fileinfo.c +src/core/g2/gwc.c src/core/ghc.c -src/core/gnet_stats.c src/core/nodes.c +src/core/parq.c src/core/rx_link.c src/core/search.c src/core/settings.c @@ -15,8 +16,13 @@ src/core/uhc.c src/core/uploads.c src/core/version.c +src/coverity.c +src/if/gen/gnr_stats.c +src/if/gen/msg.c +src/if/gen/msg_drop.c src/if/gnet_property.c src/if/gui_property.c +src/lib/aje.c src/lib/iso3166.c src/lib/magnet.c src/lib/misc.c @@ -27,17 +33,21 @@ src/shell/help.c src/shell/horizon.c src/shell/intr.c +src/shell/lib.c src/shell/log.c src/shell/memory.c src/shell/node.c src/shell/print.c src/shell/props.c src/shell/quit.c +src/shell/random.c src/shell/search.c src/shell/set.c src/shell/shell.c +src/shell/stats.c +src/shell/task.c +src/shell/thread.c src/shell/whatis.c -src/ui/gtk/bitzi.c src/ui/gtk/downloads_common.c src/ui/gtk/filter.c src/ui/gtk/filter_core.c
View file
gtk-gnutella-0.98.2.tar.bz2/po/de.po -> gtk-gnutella-1.1.9.tar.bz2/po/de.po
Changed
@@ -1,32 +1,31 @@ -# $Id$ -# -# German translations for gtk-gnutella package. -# Copyright (C) 2000-2001 Yann Grossel. -# Copyright (C) 2001-2010 Raphaël Manfredi. -# This file is distributed under the same license as the gtk-gnutella package. -# Thomas Schürger <thomas@schuerger.com>, 2004-2005. -# Christian Biere <christianbiere@gmx.de>, 2005-2007. +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Raphael Manfredi +# This file is distributed under the same license as the PACKAGE package. # +# Translators: msgid "" msgstr "" -"Project-Id-Version: gtk-gnutella 0.96.7u\n" +"Project-Id-Version: gtk-gnutella\n" "Report-Msgid-Bugs-To: gtk-gnutella-devel@lists.sf.net\n" -"POT-Creation-Date: 2011-11-22 18:27+0100\n" -"PO-Revision-Date: 2008-07-05 13:20+0200\n" -"Last-Translator: Christian Biere <christianbiere@gmx.de>\n" -"Language-Team: German <gtk-gnutella-devel@lists.sourceforge.net>\n" +"POT-Creation-Date: 2016-03-06 08:49+0100\n" +"PO-Revision-Date: 2016-02-15 08:28+0000\n" +"Last-Translator: Jeroen Asselman <jeroen@asselman.com>\n" +"Language-Team: German (http://www.transifex.com/gtk-gnutella/gtk-gnutella/" +"language/de/)\n" +"Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" -#, c-format -msgid "%s%s%s%s%s fps, %s kbps" -msgstr "%s%s%s%s%s fps, %s kbps" +msgid "Harmful version banned, upgrade required" +msgstr "" -msgid "times|x" -msgstr "x" +msgid "Connection refused" +msgstr "" + +msgid "Use an open Gnutella or G2 servent" +msgstr "" #, c-format msgid "Stopped, will retry with TLS (%s)" @@ -40,9 +39,8 @@ msgid "Too many attempts (%u times)" msgstr "Zuviele Versuche (%u mal)" -#, fuzzy msgid "Requeued due to no push-proxy" -msgstr "Wegen Timeout in Warteschlange gestellt" +msgstr "" msgid "Requeued due to file removal" msgstr "Wegen gelöschter Datei wieder in Warteschlange gestellt" @@ -53,24 +51,23 @@ msgid "Duplicate download" msgstr "Doppelter download" -#, fuzzy msgid "Nothing else to switch to" -msgstr "Nichts mehr zu holen" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Switching (after error) to \"%s\"" -msgstr "Wechsel zu \"%s\"" +msgstr "" #, c-format -msgid " at %s - rescheduled for %s%s #%u" -msgstr " um %s - geplant für %s%s #%u" +msgid " at %s" +msgstr "" msgid "Suspended (SHA1 checking)" msgstr "Gestoppt (SHA1 wird überprüft)" -#, fuzzy, c-format +#, c-format msgid "Ignoring requested (%s)" -msgstr "Sende Anfrage (%u%%)" +msgstr "" msgid "Paused" msgstr "Pausiert" @@ -87,6 +84,9 @@ msgid "Download queue is frozen" msgstr "Download-Queue ist eingefroren" +msgid "Network buffer shortage" +msgstr "" + msgid "No download slot (start)" msgstr "Kein freier Download-Slot (Start)" @@ -96,12 +96,14 @@ msgid "Connection failed" msgstr "Verbindungversuch fehlgeschlagen" +msgid "SHA1 mismatch detected" +msgstr "SHA1-Prüfsummenfehler" + msgid "Waiting for server PROX publishing" msgstr "" -#, fuzzy msgid "Waiting for push route" -msgstr "Warte auf weitere Anfrage..." +msgstr "" msgid "Push route lost" msgstr "Push-Route verloren" @@ -239,13 +241,12 @@ msgid "More data to sink than expected" msgstr "" -#, fuzzy msgid "Stopped data (EOF)" -msgstr "Angehalten (%s)" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Stopped data (%s)" -msgstr "Angehalten (%s)" +msgstr "" #, c-format msgid "Failed (Read error: %s)" @@ -261,6 +262,9 @@ msgid "No support for Content-Encoding (%s)" msgstr "Keine Überstützung für Content-Encoding (%s)" +msgid "Incomplete headers during TLS upgrade" +msgstr "" + msgid "Spammer detected" msgstr "Spamversuch erkannt" @@ -301,17 +305,14 @@ msgid "Total/served sizes mismatch" msgstr "" -#, fuzzy msgid "Range start mismatch" -msgstr "Diese Suche neu starten" +msgstr "" -#, fuzzy msgid "Range end too large" -msgstr "Viel zu groß" +msgstr "" -#, fuzzy msgid "Range mismatch" -msgstr "URN aus Fileinfo stimmt nicht überein" +msgstr "" msgid "Weird server-side chunk shrinking" msgstr "" @@ -322,6 +323,12 @@ msgid "No Content-Length header" msgstr "" +msgid "Unexpected Content-Type" +msgstr "" + +msgid "No Content-Type" +msgstr "" + msgid "Search already closed" msgstr "Suche bereits geschlossen" @@ -331,9 +338,9 @@ msgid "Pipeline flow stopped" msgstr "" -#, fuzzy, c-format +#, c-format msgid "Cannot open %s: %s" -msgstr "Fehler (%s kann nicht gesendet werden: %s)" +msgstr "" msgid "Cannot resume: file gone" msgstr "Kann nicht fortsetzen: Datei nicht mehr verfügbar" @@ -358,26 +365,32 @@ msgid "Malformed push reply" msgstr "Fehlerhafte Push-Antwort" -msgid "SHA1 mismatch detected" -msgstr "SHA1-Prüfsummenfehler" - msgid ", inbound" msgstr ", eingehend" msgid ", outbound" msgstr ", ausgehend" -#, fuzzy +msgid ", no-pipeline" +msgstr "" + msgid ", banning" -msgstr "Verbannen" +msgstr "" msgid ", g2" msgstr ", g2" +msgid ", fake-g2" +msgstr "" + msgid ", vendor?" msgstr ", Anbieter?" #, c-format +msgid "<Browse G2 Host %s>" +msgstr "" + +#, c-format msgid "<Browse Host %s>" msgstr "<Host %s durchsuchen>" @@ -385,9 +398,8 @@ msgid "<THEX data for %s>" msgstr "<THEX-Daten für %s>" -#, fuzzy msgid "Browse search closed" -msgstr "Suchliste anzeigen" +msgstr "" msgid "Stopped data (EOF) <download_got_eof>" msgstr "" @@ -404,6 +416,12 @@ msgid "Requeued due to timeout" msgstr "Wegen Timeout in Warteschlange gestellt" +msgid "Partial file removed" +msgstr "" + +msgid "File info being reset" +msgstr "" + #, c-format msgid "Downloading (TR: %s)" msgstr "Lade herunter (TR: %s)" @@ -411,23 +429,20 @@ msgid "Seeding" msgstr "" -#, fuzzy msgid "Computing TTH" -msgstr "Berechne SHA1" +msgstr "" msgid "Computing SHA1" msgstr "Berechne SHA1" -#, fuzzy msgid "Waiting for TTH check" -msgstr "Warte auf SHA1-Überprüfung..." +msgstr "" msgid "Waiting for SHA1 check" msgstr "Warte auf SHA1-Überprüfung..." -#, fuzzy msgid "SHA1" -msgstr "SHA-1" +msgstr "" msgid "OK" msgstr "OK" @@ -435,13 +450,11 @@ msgid "failed" msgstr "fehlgeschlagen" -#, fuzzy msgid "not computed yet" -msgstr "Noch keine Ausgabe..." +msgstr "" -#, fuzzy msgid "Waiting for moving..." -msgstr "Warte auf SHA1-Überprüfung..." +msgstr "" msgid "Moving" msgstr "Verschiebe" @@ -459,13 +472,11 @@ msgid "Waiting" msgstr "Warte" -#, fuzzy msgid "Querying DHT" -msgstr "Suchtreffer" +msgstr "" -#, fuzzy msgid "Pending DHT query" -msgstr "Sende Anfrage" +msgstr "" #, c-format msgid "%u/%u successful DHT lookup" @@ -479,156 +490,20 @@ msgstr0 "" msgstr1 "" -#, fuzzy, c-format +#, c-format msgid "Got %d host from %s" msgid_plural "Got %d hosts from %s" -msgstr0 "%d Hostadresse von UDP-Hostcache %s erhalten" -msgstr1 "%d Hostadressen von UDP-Hostcache %s erhalten" +msgstr0 "" +msgstr1 "" #, c-format -msgid "Bootstrapping from %s" -msgstr "" - -msgid "Bad size" -msgstr "Falsche Größe" - -msgid "Too small" -msgstr "Zu klein" - -msgid "Too large" -msgstr "Zu groß" - -msgid "Way too large" -msgstr "Viel zu groß" - -msgid "Unknown message type" -msgstr "Unbekannter Pakettyp" - -msgid "Unexpected message" -msgstr "Unerwartetes Paket" - -msgid "Message sent with TTL = 0" -msgstr "Paket mit TTL = 0" - -msgid "Improper hops/ttl combination" -msgstr "Falsche Hops/TTL-Kombination" - -msgid "Max TTL exceeded" -msgstr "Maximale TTL überschritten" - -msgid "Message throttle" -msgstr "Paketdrosselung" - -#, fuzzy -msgid "Message matched limits" -msgstr "Gnet-Paketgrößenbeschränkungen" - -msgid "Unusable Pong" -msgstr "Unbenutzbares Pong" - -msgid "Hard TTL limit reached" -msgstr "Hartes TTL-Limit erreicht" - -msgid "Max hop count reached" -msgstr "Maximale Hop-Anzahl erreicht" - -msgid "Route lost" -msgstr "Route verloren" - -msgid "No route" -msgstr "Keine Route" - -msgid "Duplicate message" -msgstr "Paketduplikat" - -msgid "Message to banned GUID" -msgstr "Paket an verbannten GUID" - -#, fuzzy -msgid "Message from banned GUID" -msgstr "Paket an verbannten GUID" - -msgid "Node shutting down" -msgstr "Peer fährt herunter" - -msgid "TX flow control" -msgstr "Ausgehende Flusskontrolle" - -msgid "Query text had no trailing NUL" -msgstr "Suchanfrage ohne NUL am Ende" - -msgid "Query text too short" -msgstr "Suchanfrage zu kurz" - -msgid "Query had unnecessary overhead" -msgstr "Suchanfrage mit überflüssigem Ballast" - -msgid "Query had bad URN" -msgstr "" - -msgid "Message with malformed SHA1" -msgstr "Paket mit kaputter SHA1" - -msgid "Message with malformed UTF-8" -msgstr "Paket mit kaputtem UTF-8-String" - -msgid "Malformed Query Hit" -msgstr "Kaputter Suchtreffer" - -msgid "Bad return address" +msgid "Connecting to web cache %s" msgstr "" -msgid "Hostile IP address" -msgstr "Feindliche IP-Adresse" - -msgid "Bogus result from Morpheus" -msgstr "" - -msgid "Spam" -msgstr "Spam" - -msgid "Evil filename" -msgstr "Böser Dateiname" - -#, fuzzy -msgid "Improper media type" -msgstr "Suchbegriff" - -msgid "Payload inflating error" -msgstr "" - -msgid "Unknown header flags present" -msgstr "" - -msgid "Own search results" -msgstr "Eigene Suchergebnisse" - -#, fuzzy -msgid "Own queries" -msgstr "UTF8-Anfragen" - -msgid "Ancient query format" -msgstr "Veraltetes Anfrage-Format" - -msgid "Blank Servent ID" -msgstr "Leere Servent-ID" - -msgid "GUESS Query missing token" -msgstr "" - -msgid "GUESS Invalid query token" -msgstr "" - -msgid "DHT Invalid security token" -msgstr "" - -msgid "DHT Too many STORE requests" +#, c-format +msgid "Bootstrapping from %s" msgstr "" -#, fuzzy -msgid "DHT Malformed message" -msgstr "Fehlerhaftes Kommando" - #, c-format msgid "Shutdown (%s)" msgstr "Beenden (%s)" @@ -639,27 +514,6 @@ msgstr0 "%d Pong empfangen" msgstr1 "%d Pongs empfangen" -msgid "Sent crawling info" -msgstr "Informationen an Crawler gesendet" - -msgid "Cannot setup compressing TX stack" -msgstr "Kann komprimierenden TX-Stack nicht erzeugen" - -#, c-format -msgid "Got BYE %d %.*s" -msgstr "BYE erhalten %d %.*s" - -#, c-format -msgid "Weird HELLO %s" -msgstr "Seltsames HELLO %s" - -#, c-format -msgid "HELLO %s error %d (%s)" -msgstr "HELLO %s Fehler%d (%s)" - -msgid "Shielded node" -msgstr "Abgeschirmter Peer" - msgid "Gnet connections disabled" msgstr "Gnutella-Verbindungen deaktiviert" @@ -667,6 +521,10 @@ msgstr "Verbindung nicht komprimiert" #, c-format +msgid "Too many G2 hubs (%u max)" +msgstr "" + +#, c-format msgid "Too many leaves (%d max)" msgstr "Zu viele Leaf-Peers (max. %d)" @@ -691,6 +549,9 @@ msgid "Not an ultra node" msgstr "Kein Ultrapeer" +msgid "Unknown error" +msgstr "Unbekannter Fehler" + msgid "Unstable IP address" msgstr "Unbeständige IP-Adresse" @@ -704,22 +565,50 @@ msgid "Not connecting: %s" msgstr "Kein Verbindungsaufbau: %s" +msgid "Cannot setup compressing TX stack" +msgstr "Kann komprimierenden TX-Stack nicht erzeugen" + +msgid "Sent crawling info" +msgstr "Informationen an Crawler gesendet" + +#, c-format +msgid "Got BYE %d %.*s" +msgstr "BYE erhalten %d %.*s" + +#, c-format +msgid "Weird HELLO %s" +msgstr "Seltsames HELLO %s" + +#, c-format +msgid "HELLO %s error %d (%s)" +msgstr "HELLO %s Fehler%d (%s)" + +msgid "Shielded node" +msgstr "Abgeschirmter Peer" + msgid "Protocol not acceptable" msgstr "Protokoll nicht akzeptabel" +msgid "Conflict" +msgstr "" + +msgid "Upgrade Header Missing" +msgstr "" + msgid "Servent Shutdown" msgstr "Servent wird heruntergefahren" -#, fuzzy msgid "Not a network member" -msgstr "Gnutella Netzwerkmodus" +msgstr "" + +msgid "Need a G2 Hub" +msgstr "" msgid "Too frequent crawling" msgstr "Zu häufige Crawl-Anfragen" -#, fuzzy msgid "Already connected to this GUID" -msgstr "Bereits verbunden" +msgstr "" #, c-format msgid "Vendor would exceed %d%% of our slots" @@ -764,20 +653,23 @@ msgid "Pseudo UDP node" msgstr "Pseudo-UDP-Peer" -#, fuzzy +msgid "Pseudo semi-reliable UDP node" +msgstr "" + +msgid "Pseudo G2 UDP node" +msgstr "" + msgid "Pseudo DHT node" -msgstr "Pseudo-UDP-Peer" +msgstr "" msgid "Already connected" msgstr "Bereits verbunden" -#, fuzzy msgid "Limited connection" -msgstr "%d Pong empfangen" +msgstr "" -#, fuzzy msgid "Write error during HELLO" -msgstr "Schreibfehler während HELLO: %s" +msgstr "" #, c-format msgid "Write error during HELLO: %s" @@ -812,6 +704,9 @@ msgid "DHT" msgstr "" +msgid "G2 hub" +msgstr "" + msgid "Unknown" msgstr "Unbekannt" @@ -826,9 +721,9 @@ msgid "Must wait %u more seconds before resending \"What's New\"" msgstr "" -#, fuzzy, c-format +#, c-format msgid "mkdir(\"%s\") failed: %m" -msgstr "Schreiben fehlgeschlagen: %s" +msgstr "" msgid "Can't find your home directory!" msgstr "Kann das Heimatverzeichnis nicht finden!" @@ -840,13 +735,17 @@ msgid "creating configuration directory \"%s\"" msgstr "erstelle Konfigurationsverzeichnis \"%s\"" -#, fuzzy, c-format +#, c-format msgid "creating directory \"%s\" for %s" -msgstr "erstelle Konfigurationsverzeichnis \"%s\"" +msgstr "" -#, fuzzy -msgid "You seem to have left another gtk-gnutella running" -msgstr "Ein anderer gtk-gnutella Prozess scheint bereits zu laufen.\n" +#, c-format +msgid "Another gtk-gnutella supervisor is running as PID %lu" +msgstr "" + +#, c-format +msgid "Another gtk-gnutella is running as PID %lu" +msgstr "" msgid "Cannot proceed without valid configuration directory" msgstr "Kann ohne gültiges Konfigurationsverzeichnis nicht fortfahren" @@ -860,9 +759,6 @@ msgid "Failed to create local socket" msgstr "UNIX-Domain-Socket konnte nicht angelegt werden" -msgid "Failed to create listening sockets" -msgstr "Sockets für eingehende Verbindungen konnten nicht angelegt werden" - msgid "Can only run as a leaf when TCP-firewalled" msgstr "" "TCP-Verbindungen werden anscheined von einer Firewall blockiert, daher ist " @@ -874,6 +770,12 @@ msgid "Got EOF" msgstr "EOF erhalten" +msgid "TLS handshake failed" +msgstr "" + +msgid "Connection locally failed" +msgstr "" + msgid "Write failed (Input Exception)" msgstr "Schreiben fehlgeschlagen (Eingabefehler)" @@ -894,21 +796,111 @@ msgid "Connect back timeout" msgstr "Rückverbindungs-Timeout" +msgid "Request timeout" +msgstr "" + msgid "Timeout waiting for follow-up" msgstr "" msgid "Lifetime expired" msgstr "Lebensdauer abgelaufen" +msgid "Unauthorized" +msgstr "" + +#, c-format +msgid "Limiting connections from %s" +msgstr "" + +msgid "No reason given" +msgstr "" + +msgid "Bad Request" +msgstr "" + +msgid "Header too large" +msgstr "" + +msgid "Input buffer full" +msgstr "" + +msgid "Extra data after HTTP header" +msgstr "" + msgid "Unable to send GIV" msgstr "Konnte GIV nicht senden" +msgid "Not Found" +msgstr "" + +msgid "File was modified" +msgstr "" + +msgid "Moved Permanently" +msgstr "" + +msgid "File index/name mismatch" +msgstr "" + +msgid "URN Not Found (urn:sha1)" +msgstr "" + +msgid "SHA1 is being recomputed" +msgstr "" + +msgid "Library being rebuilt" +msgstr "" + +msgid "Malformed URN in /uri-res/N2R request" +msgstr "" + +msgid "Malformed URN in /uri-res/N2X request" +msgstr "" + +msgid "TTH is being computed" +msgstr "" + msgid "<Browse Host Request>" msgstr "<Browse-Host-Anfrage>" +msgid "Browse Host Disabled" +msgstr "" + +#, c-format +msgid "Redirected to %s:%u" +msgstr "" + +msgid "Not Modified" +msgstr "" + msgid "Stalling upload replaced" msgstr "Blockierenden Upload ersetzt" +msgid "Already downloading this file" +msgstr "" + +msgid "Malformed Range request" +msgstr "" + +msgid "Requested range not satisfiable" +msgstr "" + +msgid "Requested range not available yet" +msgstr "" + +msgid "Queue full" +msgstr "" + +msgid "Another connection is still active" +msgstr "" + +#, c-format +msgid "%s not honoured; removed from PARQ queue" +msgstr "" + +msgid "Minimum retry delay" +msgstr "" + #, c-format msgid "Queued (slot %d, ETA: %s)" msgstr "Warteschlange (Slot %d, ETA: %s)" @@ -916,9 +908,12 @@ msgid "Cannot send whole HTTP status" msgstr "Kann kompletten HTTP-Status nicht sende" +msgid "Not Acceptable" +msgstr "" + #, c-format -msgid "<Browse Host Request> %s%s%s" -msgstr "<Browse-Host-Anfrage> %s%s%s" +msgid "<Browse Host %sRequest> %s%s%s" +msgstr "" msgid "query hits" msgstr "Suchtreffer" @@ -932,6 +927,40 @@ msgid ", chunked" msgstr "" +msgid "THEX failure" +msgstr "" + +msgid "EOF while sinking" +msgstr "" + +#, c-format +msgid "Read error while sinking: %m" +msgstr "" + +msgid "Content Too Large" +msgstr "" + +msgid "Unknown/Missing Protocol Tag" +msgstr "" + +msgid "Missing Host Header" +msgstr "" + +msgid "Not Implemented" +msgstr "" + +msgid "Bad URI" +msgstr "" + +msgid "Bad Path" +msgstr "" + +msgid "No Content Allowed" +msgstr "" + +msgid "Sharing currently disabled" +msgstr "" + msgid "Write exception" msgstr "Schreibfehler" @@ -971,6 +1000,1194 @@ msgid " - Newer version available: from git %s" msgstr " - Neuere Version verfügbar: git %s" +msgid "Routing errors" +msgstr "Routing-Fehler" + +msgid "Routing table chunks" +msgstr "" + +msgid "Routing table message capacity" +msgstr "" + +msgid "Routing table message count" +msgstr "" + +msgid "Routing through transient node avoided" +msgstr "" + +msgid "Duplicates with higher TTL" +msgstr "Dupletten mit höherer TTL" + +msgid "SPAM SHA1 database hits" +msgstr "" + +msgid "SPAM filename and size hits" +msgstr "" + +msgid "SPAM fake hits" +msgstr "" + +msgid "SPAM duplicate hits" +msgstr "" + +msgid "SPAM dynamically caught hostile IP addresses" +msgstr "" + +msgid "SPAM dynamically caught hostile IP held" +msgstr "" + +msgid "SPAM spotted spamming IP addresses held" +msgstr "" + +msgid "Searches to local DB" +msgstr "Anfragen an lokale DB" + +msgid "Hits on local DB" +msgstr "Treffer in lokaler DB" + +msgid "Hits on local partial files" +msgstr "" + +msgid "Hits on \"what's new?\" queries" +msgstr "" + +msgid "Query hits received for local queries" +msgstr "" + +msgid "G2 searches to local DB" +msgstr "" + +msgid "G2 hits on local DB" +msgstr "" + +msgid "G2 hits on local partial files" +msgstr "" + +msgid "Query hits received for OOB-proxied queries" +msgstr "" + +msgid "Queries requesting OOB hit delivery" +msgstr "" + +msgid "Stripped OOB flag on queries" +msgstr "" + +msgid "Ignored OOB queries due to unclaimed hits" +msgstr "" + +msgid "Duplicate OOB-proxied queries" +msgstr "" + +msgid "OOB hits received for OOB-proxied queries" +msgstr "" + +msgid "OOB hits bearing alien IP address" +msgstr "" + +msgid "OOB hits ignored due to identified spamming address" +msgstr "" + +msgid "OOB hits ignored due to unsecure promise from known secure host" +msgstr "" + +msgid "Unclaimed locally-generated OOB hits" +msgstr "" + +msgid "Partially claimed locally-generated OOB hits" +msgstr "" + +msgid "Spurious OOB hit claiming received" +msgstr "" + +msgid "Unrequested OOB hits received" +msgstr "" + +msgid "Received query hits for untracked queries" +msgstr "" + +msgid "Tracked query MUIDs" +msgstr "" + +msgid "Compacted queries" +msgstr "Verkleinerte Suchanfragen" + +msgid "Bytes saved by compacting" +msgstr "Gesparte Bytes durch Verkleinerung" + +msgid "UTF8 queries" +msgstr "UTF8-Anfragen" + +msgid "SHA1 queries" +msgstr "SHA1-Anfragen" + +msgid "\"What's New?\" queries" +msgstr "" + +msgid "UTF8 G2 queries" +msgstr "" + +msgid "SHA1 G2 queries" +msgstr "" + +msgid "GUESS queries" +msgstr "" + +msgid "GUESS queries (0.2)" +msgstr "" + +msgid "GUESS link cache size" +msgstr "" + +msgid "GUESS cached query keys held" +msgstr "" + +msgid "GUESS cached 0.2 hosts held" +msgstr "" + +msgid "GUESS cached G2 hosts held" +msgstr "" + +msgid "GUESS locally generated queries" +msgstr "" + +msgid "GUESS currently running queries" +msgstr "" + +msgid "GUESS hits received for locally generated queries" +msgstr "" + +msgid "GUESS ultra nodes queried" +msgstr "" + +msgid "GUESS ultra nodes sending back an acknowledgment" +msgstr "" + +msgid "GUESS G2 nodes queried" +msgstr "" + +msgid "GUESS G2 nodes sending back an acknowledgment" +msgstr "" + +msgid "Throttled local push messages" +msgstr "" + +msgid "Throttled received push messages" +msgstr "" + +msgid "Broadcasted push messages" +msgstr "Versandte Push-Pakete" + +msgid "Push-proxy UDP relayed messages" +msgstr "" + +msgid "Push-proxy TCP relayed messages" +msgstr "Durch Push-Proxy weitergeleitete Pakete" + +msgid "Push-proxy TCP for FW<->FW transfers" +msgstr "" + +msgid "Push-proxy broadcasted messages" +msgstr "Durch Push-Proxy versandte Pakete" + +msgid "Push-proxy found un-proxied local route" +msgstr "" + +msgid "Push-proxy lookup failures" +msgstr "Push-Proxy nicht gefunden" + +msgid "Push relayed via local route" +msgstr "" + +msgid "Push relayed via routing table" +msgstr "" + +msgid "Locally generated dynamic queries" +msgstr "Generierte dynamische Anfragen" + +msgid "Leaf-generated dynamic queries" +msgstr "Leaf-generierte dynamische Anfragen" + +msgid "OOB-proxied leaf queries" +msgstr "" + +msgid "Fully completed dynamic queries" +msgstr "" + +msgid "Partially completed dynamic queries" +msgstr "" + +msgid "Dynamic queries ended with no results" +msgstr "" + +msgid "Fully completed dynamic queries getting late results" +msgstr "" + +msgid "Dynamic queries with partial late results" +msgstr "" + +msgid "Dynamic queries completed by late results" +msgstr "" + +msgid "Queries seen from GTKG" +msgstr "" + +msgid "Queries seen from GTKG that were re-queries" +msgstr "" + +msgid "Queries advertising support of GGEP \"H\"" +msgstr "" + +msgid "Queries advertising support of semi-reliable UDP" +msgstr "" + +msgid "GIV callbacks received" +msgstr "" + +msgid "GIV discarded due to no suitable download" +msgstr "" + +msgid "QUEUE callbacks received" +msgstr "" + +msgid "QUEUE discarded due to no suitable download" +msgstr "" + +msgid "File descriptors banned running count" +msgstr "" + +msgid "UDP read-ahead datagram running count" +msgstr "" + +msgid "UDP read-ahead datagram running bytes" +msgstr "" + +msgid "UDP read-ahead datagram \"old\" processed" +msgstr "" + +msgid "UDP read-ahead datagram max count" +msgstr "" + +msgid "UDP read-ahead datagram max bytes" +msgstr "" + +msgid "UDP read-ahead datagram max delay" +msgstr "" + +msgid "UDP push messages received for FW<->FW connections" +msgstr "" + +msgid "UDP push messages requesting FW<->FW connection with ourselves" +msgstr "" + +msgid "UDP push messages patched for FW<->FW connections" +msgstr "" + +msgid "UDP UHC pings received" +msgstr "" + +msgid "UDP UHC pongs sent" +msgstr "" + +msgid "UDP messages with bogus source IP" +msgstr "" + +msgid "UDP messages from shunned IP (discarded)" +msgstr "" + +msgid "UDP truncated incoming messages" +msgstr "" + +msgid "Alien UDP messages (non-Gnutella)" +msgstr "" + +msgid "Unprocessed UDP Gnutella messages" +msgstr "" + +msgid "Compressed UDP messages enqueued" +msgstr "" + +msgid "Compressed UDP messages received" +msgstr "" + +msgid "Candidates for UDP message compression" +msgstr "" + +msgid "Uncompressed UDP messages due to no gain" +msgstr "" + +msgid "Ambiguous UDP messages received" +msgstr "" + +msgid "Ambiguous UDP messages inspected more deeply" +msgstr "" + +msgid "Ambiguous UDP messages handled as semi-reliable UDP" +msgstr "" + +msgid "Semi-reliable UDP total messages given for transmission" +msgstr "" + +msgid "Semi-reliable UDP total messages deflated" +msgstr "" + +msgid "Semi-reliable UDP total messages unsent" +msgstr "" + +msgid "Semi-reliable UDP total messages dropped due to temporary ban" +msgstr "" + +msgid "Semi-reliable UDP total messages sent to known responsive hosts" +msgstr "" + +msgid "Semi-reliable UDP total messages partially sent due to clogging" +msgstr "" + +msgid "Semi-reliable UDP reliable messages given for transmission" +msgstr "" + +msgid "Semi-reliable UDP reliable messages correctly transmited" +msgstr "" + +msgid "Semi-reliable UDP reliable messages not fully acknowledged" +msgstr "" + +msgid "Semi-reliable UDP fragments sent" +msgstr "" + +msgid "Semi-reliable UDP fragments resent" +msgstr "" + +msgid "Semi-reliable UDP fragment sendings avoided" +msgstr "" + +msgid "Semi-reliable UDP fragments sent too many times" +msgstr "" + +msgid "Semi-reliable UDP total acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP spurious acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP invalid acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP acknowledgments re-queued for sending" +msgstr "" + +msgid "Semi-reliable UDP plain acknowledgments dropped" +msgstr "" + +msgid "Semi-reliable UDP enhanced acknowledgments dropped" +msgstr "" + +msgid "Semi-reliable UDP plain acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP EARs sent" +msgstr "" + +msgid "Semi-reliable UDP too many EARs sent" +msgstr "" + +msgid "Semi-reliable UDP EAR negative acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP acknowledgments received after sending EARs" +msgstr "" + +msgid "Semi-reliable UDP fragments received" +msgstr "" + +msgid "Semi-reliable UDP duplicate fragments received" +msgstr "" + +msgid "Semi-reliable UDP unreliable fragments received" +msgstr "" + +msgid "Semi-reliable UDP dropped received fragments" +msgstr "" + +msgid "Semi-reliable UDP fragments received whilst lingering" +msgstr "" + +msgid "Semi-reliable UDP messages expired before re-assembly" +msgstr "" + +msgid "Semi-reliable UDP messages re-assembled completely" +msgstr "" + +msgid "Semi-reliable UDP messages inflated successfully" +msgstr "" + +msgid "Semi-reliable UDP messages inflated incorrectly" +msgstr "" + +msgid "Semi-reliable UDP unreliable messages received" +msgstr "" + +msgid "Semi-reliable UDP empty messages received" +msgstr "" + +msgid "Semi-reliable UDP total acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP avoided acknowledgment sendings" +msgstr "" + +msgid "Semi-reliable UDP EARs received" +msgstr "" + +msgid "Semi-reliable UDP EARs received for unknown message" +msgstr "" + +msgid "Semi-reliable UDP EARs received whilst lingering" +msgstr "" + +msgid "Semi-reliable UDP fragments from hostile IP addresses" +msgstr "" + +msgid "UDP G2 hits rerouted to hub for delivery" +msgstr "" + +msgid "UDP G2 hits undelivered" +msgstr "" + +msgid "Consolidated servers (after GUID and IP address linking)" +msgstr "" + +msgid "Duplicate downloads found during server consolidation" +msgstr "" + +msgid "Discovered server GUIDs" +msgstr "" + +msgid "Changed server GUIDs" +msgstr "" + +msgid "Detected GUID collisions" +msgstr "" + +msgid "Detected collisions with our own GUID" +msgstr "" + +msgid "GUID dynamically banned" +msgstr "" + +msgid "Firewalled node info for known hosts received in upload requests" +msgstr "" + +msgid "Revitalized PUSH routes" +msgstr "" + +msgid "Collected new PUSH proxies from other query hits" +msgstr "" + +msgid "Attempted download resource switching on completion" +msgstr "" + +msgid "Attempted download resource switching after error" +msgstr "" + +msgid "Successful download resource switching (all kind)" +msgstr "" + +msgid "Successful download resource switching between plain files" +msgstr "" + +msgid "Successful download resource switching after error" +msgstr "" + +msgid "Actively queued after resource switching attempt" +msgstr "" + +msgid "Sunk HTTP reply data on error codes" +msgstr "" + +msgid "Ignored downloaded data" +msgstr "" + +msgid "Ignoring requested after data mismatch" +msgstr "" + +msgid "Ignoring requested to preserve connection" +msgstr "" + +msgid "Ignoring requested due to aggressive swarming" +msgstr "" + +msgid "Ignoring refused (data too large or server too slow)" +msgstr "" + +msgid "Client resource switching (all detected)" +msgstr "" + +msgid "Client resource switching between plain files" +msgstr "" + +msgid "Client follow-up request after HTTP error was returned" +msgstr "" + +msgid "PARQ client resource switching in slots (SHA-1 based)" +msgstr "" + +msgid "PARQ client retry-after violation" +msgstr "" + +msgid "PARQ client kicked out after too many retry-after violations" +msgstr "" + +msgid "PARQ upload slot limit overrides" +msgstr "" + +msgid "PARQ quick upload slots granted" +msgstr "" + +msgid "PARQ QUEUE sending attempts" +msgstr "" + +msgid "PARQ QUEUE messages sent" +msgstr "" + +msgid "PARQ QUEUE follow-up requests received" +msgstr "" + +msgid "Launched SHA-1 file verifications" +msgstr "" + +msgid "Launched TTH file verifications" +msgstr "" + +msgid "Re-seeding of orphan downloads through query hits" +msgstr "" + +msgid "Re-seeding of orphan downloads through upload requests" +msgstr "" + +msgid "RUDP sent bytes" +msgstr "" + +msgid "RUDP received bytes" +msgstr "" + +msgid "DHT estimated amount of nodes" +msgstr "" + +msgid "DHT standard error of estimated amount of nodes" +msgstr "" + +msgid "DHT k-ball theoretical frontier (bits)" +msgstr "" + +msgid "DHT k-ball furthest frontier (bits)" +msgstr "" + +msgid "DHT k-ball closeest frontier (bits)" +msgstr "" + +msgid "DHT routing table buckets" +msgstr "" + +msgid "DHT routing table leaves" +msgstr "" + +msgid "DHT routing table maximum depth" +msgstr "" + +msgid "DHT routing table good nodes" +msgstr "" + +msgid "DHT routing table stale nodes" +msgstr "" + +msgid "DHT routing table pending nodes" +msgstr "" + +msgid "DHT routing table evicted nodes" +msgstr "" + +msgid "DHT routing table evicted firewalled nodes" +msgstr "" + +msgid "DHT routing table evicted nodes due to quota" +msgstr "" + +msgid "DHT routing table promoted pending nodes" +msgstr "" + +msgid "DHT routing table pinged promoted nodes" +msgstr "" + +msgid "DHT routing table rejected node due to bucket network quota" +msgstr "" + +msgid "DHT routing table rejected node due to global network quota" +msgstr "" + +msgid "DHT completed bucket refreshes" +msgstr "" + +msgid "DHT forced bucket refreshes" +msgstr "" + +msgid "DHT forced bucket merges" +msgstr "" + +msgid "DHT bucket merges" +msgstr "" + +msgid "DHT bucket splits" +msgstr "" + +msgid "DHT denied non-splitable bucket refresh" +msgstr "" + +msgid "DHT initiated bucket alive checks" +msgstr "" + +msgid "DHT alive pings sent to good nodes" +msgstr "" + +msgid "DHT alive pings sent to stale nodes" +msgstr "" + +msgid "DHT alive pings sent to shutdowning nodes" +msgstr "" + +msgid "DHT alive pings avoided" +msgstr "" + +msgid "DHT alive pings skipped" +msgstr "" + +msgid "DHT revitalized stale nodes on RPC reply" +msgstr "" + +msgid "DHT value store rejected on IP/network quota grounds" +msgstr "" + +msgid "DHT value store rejected on creator validation grounds" +msgstr "" + +msgid "DHT nodes rejected during lookup based on network quota" +msgstr "" + +msgid "DHT nodes rejected during lookup based on suspicious proximity" +msgstr "" + +msgid "DHT nodes rejected during lookup based on frequency divergence" +msgstr "" + +msgid "DHT node contact IP addresses fixed during lookup" +msgstr "" + +msgid "DHT keys held" +msgstr "" + +msgid "DHT cached keys held" +msgstr "" + +msgid "DHT values held" +msgstr "" + +msgid "DHT cached KUID targets held" +msgstr "" + +msgid "DHT cached closest root nodes" +msgstr "" + +msgid "DHT cached roots exact hits" +msgstr "" + +msgid "DHT cached roots approximate hits" +msgstr "" + +msgid "DHT cached roots misses" +msgstr "" + +msgid "DHT cached roots lookups within k-ball" +msgstr "" + +msgid "DHT cached roots contact address refreshed" +msgstr "" + +msgid "DHT cached security tokens held" +msgstr "" + +msgid "DHT cached security tokens hits" +msgstr "" + +msgid "DHT stable node information held" +msgstr "" + +msgid "DHT local hits on value lookups" +msgstr "" + +msgid "DHT local hits returning values from cached keys" +msgstr "" + +msgid "DHT returned expanded values" +msgstr "" + +msgid "DHT returned values as secondary keys" +msgstr "" + +msgid "DHT claimed values via secondary keys" +msgstr "" + +msgid "DHT returned cached expanded values" +msgstr "" + +msgid "DHT returned cached values as secondary-keys" +msgstr "" + +msgid "DHT claimed cached values via secondary keys" +msgstr "" + +msgid "DHT successfully received value publications" +msgstr "" + +msgid "DHT successfully received value removals" +msgstr "" + +msgid "DHT replication of stale value avoided" +msgstr "" + +msgid "DHT replication of held values" +msgstr "" + +msgid "DHT republishing of held values" +msgstr "" + +msgid "DHT secondary-key value fetch issued" +msgstr "" + +msgid "DHT duplicate values returned in lookups" +msgstr "" + +msgid "DHT detected KUID collisions" +msgstr "" + +msgid "DHT detected collisions with our own KUID" +msgstr "" + +msgid "DHT caching attempts" +msgstr "" + +msgid "DHT caching ended successfully" +msgstr "" + +msgid "DHT caching partially completed" +msgstr "" + +msgid "DHT key-offloading checks after discovering new closest node" +msgstr "" + +msgid "DHT keys selected for offloading" +msgstr "" + +msgid "DHT key-offloading attempts" +msgstr "" + +msgid "DHT key-offloading ended successfully" +msgstr "" + +msgid "DHT key-offloading partially completed" +msgstr "" + +msgid "DHT values successfully offloaded" +msgstr "" + +msgid "DHT incoming messages" +msgstr "" + +msgid "DHT incoming messages with UDP-matching contact address" +msgstr "" + +msgid "DHT incoming messages with contact address fixed" +msgstr "" + +msgid "DHT incoming messages from hostile addresses" +msgstr "" + +msgid "DHT incoming messages with hostile contact address" +msgstr "" + +msgid "DHT RPC messages prepared" +msgstr "" + +msgid "DHT RPC messages cancelled" +msgstr "" + +msgid "DHT RPC timed out" +msgstr "" + +msgid "DHT RPC replies received" +msgstr "" + +msgid "DHT RPC replies with contact address fixed" +msgstr "" + +msgid "DHT RPC late replies received" +msgstr "" + +msgid "DHT RPC detected KUID mismatches on reply" +msgstr "" + +msgid "DHT RPC recent nodes held" +msgstr "" + +msgid "DHT node verifications" +msgstr "" + +msgid "DHT publishing attempts" +msgstr "" + +msgid "DHT publishing ended successfully (all roots)" +msgstr "" + +msgid "DHT publishing partially completed (root subset only)" +msgstr "" + +msgid "DHT publishing ending with proper value presence" +msgstr "" + +msgid "DHT value republishing occurring too late (after expiry)" +msgstr "" + +msgid "DHT publishing to self" +msgstr "" + +msgid "DHT background publishing completion attempts" +msgstr "" + +msgid "DHT background publishing completion showing improvements" +msgstr "" + +msgid "DHT background publishing completion successful (all roots)" +msgstr "" + +msgid "DHT SHA1 data type collisions" +msgstr "" + +msgid "DHT lookup path passively protected against attack" +msgstr "" + +msgid "DHT lookup path actively protected against attack" +msgstr "" + +msgid "DHT alt-loc lookups issued" +msgstr "" + +msgid "DHT push-proxy lookups issued" +msgstr "" + +msgid "DHT successful alt-loc lookups" +msgstr "" + +msgid "DHT successful push-proxy lookups" +msgstr "" + +msgid "DHT successful node push-entry lookups" +msgstr "" + +msgid "DHT re-seeding of orphan downloads" +msgstr "" + +msgid "Digests computed on general statistics" +msgstr "" + +msgid "Digests computed on TCP statistics" +msgstr "" + +msgid "Digests computed on UDP statistics" +msgstr "" + +msgid "Ping" +msgstr "Ping" + +msgid "Pong" +msgstr "Pong" + +msgid "Bye" +msgstr "Bye" + +msgid "QRP" +msgstr "QRP" + +msgid "HSEP" +msgstr "" + +msgid "RUDP" +msgstr "" + +msgid "Vendor spec." +msgstr "Anbieterspez." + +msgid "Vendor std." +msgstr "Anbieterstd." + +msgid "Push" +msgstr "Push" + +msgid "Query" +msgstr "Suche" + +msgid "Query hit" +msgstr "Suchtreffer" + +msgid "DHT (truncated)" +msgstr "" + +msgid "DHT Ping" +msgstr "" + +msgid "DHT Pong" +msgstr "" + +msgid "DHT Store" +msgstr "" + +msgid "DHT Store Ack" +msgstr "" + +msgid "DHT Find Node" +msgstr "" + +msgid "DHT Found Node" +msgstr "" + +msgid "DHT Find Value" +msgstr "" + +msgid "DHT Value" +msgstr "" + +msgid "G2 Crawl Request" +msgstr "" + +msgid "G2 Hub Advertisement" +msgstr "" + +msgid "G2 Hub List" +msgstr "" + +msgid "G2 Hub List Req" +msgstr "" + +msgid "G2 Hub List Ack" +msgstr "" + +msgid "G2 Local Node Info" +msgstr "" + +msgid "G2 Ping" +msgstr "" + +msgid "G2 Pong" +msgstr "" + +msgid "G2 Push" +msgstr "" + +msgid "G2 Query Key Ack" +msgstr "" + +msgid "G2 Query Key Req" +msgstr "" + +msgid "G2 Query" +msgstr "" + +msgid "G2 Query Ack" +msgstr "" + +msgid "G2 Query Hit" +msgstr "" + +msgid "G2 Query Hash Table" +msgstr "" + +msgid "G2 User Profile Check" +msgstr "" + +msgid "G2 User Profile Data" +msgstr "" + +msgid "Total" +msgstr "Insgesamt" + +msgid "Bad size" +msgstr "Falsche Größe" + +msgid "Too small" +msgstr "Zu klein" + +msgid "Too large" +msgstr "Zu groß" + +msgid "Way too large" +msgstr "Viel zu groß" + +msgid "Too old" +msgstr "" + +msgid "Unknown message type" +msgstr "Unbekannter Pakettyp" + +msgid "Unexpected message" +msgstr "Unerwartetes Paket" + +msgid "Message sent with TTL = 0" +msgstr "Paket mit TTL = 0" + +msgid "Improper hops/ttl combination" +msgstr "Falsche Hops/TTL-Kombination" + +msgid "Max TTL exceeded" +msgstr "Maximale TTL überschritten" + +msgid "Message throttle" +msgstr "Paketdrosselung" + +msgid "Message matched limits" +msgstr "" + +msgid "Transient node" +msgstr "" + +msgid "Unusable Pong" +msgstr "Unbenutzbares Pong" + +msgid "Hard TTL limit reached" +msgstr "Hartes TTL-Limit erreicht" + +msgid "Max hop count reached" +msgstr "Maximale Hop-Anzahl erreicht" + +msgid "Route lost" +msgstr "Route verloren" + +msgid "No route" +msgstr "Keine Route" + +msgid "Duplicate message" +msgstr "Paketduplikat" + +msgid "OOB Proxy MUID Conflict" +msgstr "" + +msgid "Message to banned GUID" +msgstr "Paket an verbannten GUID" + +msgid "Message from banned GUID" +msgstr "" + +msgid "Node shutting down" +msgstr "Peer fährt herunter" + +msgid "TX flow control" +msgstr "Ausgehende Flusskontrolle" + +msgid "Query text had no trailing NUL" +msgstr "Suchanfrage ohne NUL am Ende" + +msgid "Query text too short" +msgstr "Suchanfrage zu kurz" + +msgid "Query had unnecessary overhead" +msgstr "Suchanfrage mit überflüssigem Ballast" + +msgid "Query had bad URN" +msgstr "" + +msgid "Message with malformed SHA1" +msgstr "Paket mit kaputter SHA1" + +msgid "Message with malformed UTF-8" +msgstr "Paket mit kaputtem UTF-8-String" + +msgid "Malformed Query Hit" +msgstr "Kaputter Suchtreffer" + +msgid "Bad return address" +msgstr "" + +msgid "Hostile IP address" +msgstr "Feindliche IP-Adresse" + +msgid "Shunned IP address" +msgstr "" + +msgid "Bogus result from Morpheus" +msgstr "" + +msgid "Spam" +msgstr "Spam" + +msgid "Evil filename" +msgstr "Böser Dateiname" + +msgid "Improper media type" +msgstr "" + +msgid "Payload inflating error" +msgstr "" + +msgid "Unknown header flags present" +msgstr "" + +msgid "Own search results" +msgstr "Eigene Suchergebnisse" + +msgid "Own queries" +msgstr "" + +msgid "Ancient query format" +msgstr "Veraltetes Anfrage-Format" + +msgid "Blank Servent ID" +msgstr "Leere Servent-ID" + +msgid "GUESS Query missing token" +msgstr "" + +msgid "GUESS Invalid query token" +msgstr "" + +msgid "DHT Invalid security token" +msgstr "" + +msgid "DHT Too many STORE requests" +msgstr "" + +msgid "DHT Malformed message" +msgstr "" + +msgid "G2 Unexpected message" +msgstr "" + +msgid "Cannot cross networks" +msgstr "" + msgid "No proxy" msgstr "Kein Proxy" @@ -1010,9 +2227,8 @@ msgid "leaf node" msgstr "Leaf-Peer" -#, fuzzy msgid "none" -msgstr "Peers" +msgstr "" msgid "input only" msgstr "" @@ -1029,25 +2245,20 @@ msgid "own KUID lookup" msgstr "" -#, fuzzy msgid "completing" -msgstr "Beendet" +msgstr "" -#, fuzzy msgid "completed" -msgstr "Beendet" +msgstr "" -#, fuzzy msgid "shutdown" -msgstr "Beenden (%s)" +msgstr "" -#, fuzzy msgid "active (recommended)" -msgstr "Automatisch (empfohlen)" +msgstr "" -#, fuzzy msgid "passive" -msgstr " passiv)" +msgstr "" msgid "Indicates whether the hostcache file is being read." msgstr "Gibt an, ob gerade die Hostcache-Datei geladen wird." @@ -1095,16 +2306,12 @@ "normalen Peers aufrecht zu erhalten. Diese Zahl sollte kleiner als die " "maximale Anzahl sein, um eingehende Verbindungen zu erlauben." -#, fuzzy msgid "" "Don't allow more than this number of connections to other servents. As a " "rule of thumb you should reserve 256 b/s bandwidth per connection. Never use " "up all your bandwidth, leave a little space for TCP/IP overhead. It's not " "advisable that you set this to a value smaller than 40." msgstr "" -"Begrenze die Anzahl an Verbindungen zu anderen Peers auf diese Zahl. Als " -"Faustregel gilt: eine Verbindung nutzt ca. 512 b/s an Bandbreite. Es ist " -"nicht ratsam, mehr als 40 Verbindungen zuzulassen." msgid "Number of leaf nodes currently connected." msgstr "Anzahl der derzeit verbundenen Leaf-Peers." @@ -1459,9 +2666,6 @@ msgid "Debug level for code shared between gui and core." msgstr "Debug-Level für Code, der svon GUI und Kern genutzt wird." -msgid "Verbosity of Bitzi related debug messages." -msgstr "" - msgid "Verbosity of URL handling related debug messages." msgstr "" @@ -1535,8 +2739,8 @@ "support." msgstr "" -msgid "For development use: track properties." -msgstr "Für Entwickler: Properties verfolgen" +msgid "Indicates a kernel network buffer shortage." +msgstr "" msgid "For development use: don't add new hosts to the host cache." msgstr "Für Entwickler: Keine neuen Hosts zum Host-Catcher hinzufügen." @@ -1661,20 +2865,17 @@ msgid "Current number of hosts in regular node caches." msgstr "Derzeitige Anzahl Peers im Peer-Cache" -#, fuzzy msgid "Current number of IPv4 hosts in ultra node caches." -msgstr "Derzeitige Anzahl von Ultrapeers im Peer-Cache" +msgstr "" msgid "Current number of hosts in bad node caches." msgstr "Derzeitige Anzahl schlechter Peers im Peer-Cache" -#, fuzzy msgid "Maximum number of hosts in the regular node cache." -msgstr "Maximale Anzahl Legacy-Peers im Host-Cache" +msgstr "" -#, fuzzy msgid "Maximum number of IPv4 hosts in the ultra node cache." -msgstr "Maximale Anzahl an Ultrapeers im Host-Cache" +msgstr "" msgid "Maximum number of hosts in the BUSY, UNSTABLE and TIMEOUT lists." msgstr "Maximale Anzahl Peers in BUSY-, UNSTABLE- und TIMEOUT-Listen" @@ -1766,8 +2967,8 @@ "Random factor for the hops field in search packets we send (between 0 and 3 " "inclusive)." msgstr "" -"Zufallsfaktor für das Hops-Feld in von uns gesendeten Suchanfragepaketen (0-" -"3)" +"Zufallsfaktor für das Hops-Feld in von uns gesendeten Suchanfragepaketen " +"(0-3)" msgid "" "Whether or not to send push requests. If you are firewalled, gtk-gnutella " @@ -1851,9 +3052,8 @@ msgid "Number of running uploads." msgstr "Anzahl derzeit aktiver Uploads" -#, fuzzy msgid "Number of quick uploads currently running." -msgstr "Anzahl der derzeit verbundenen Ultrapeers." +msgstr "" msgid "Number of registered (pending) uploads." msgstr "Anzahl derzeit ausstehender Uploads" @@ -2020,10 +3220,8 @@ msgid "" "Maximum amount of leaves we can accept. To be promoted Ultra, you should " -"reserve 32 bytes of bandwidth per leaf." +"reserve 32 bytes/sec of bandwidth per leaf." msgstr "" -"Maximale Anzahl erlaubter Leaf-Peers. Um in den Ultrapeer-Status erhoben zu " -"werden, sollten 32 Bytes/s an Bandbreite pro Leaf-Peer eingerechnet werden." msgid "What to do with files that will be ignored for downloading." msgstr "" @@ -2211,7 +3409,6 @@ "Maximaler Prozensatz der Verbindungen, die von einem Servent-Typ belegt " "werden kann." -#, fuzzy msgid "" "Size of the RX socket buffer to be used for downloads, in kibibytes. If you " "wish to avoid Gnutella downloads using up all your bandwidth, set it to a " @@ -2220,11 +3417,6 @@ "greater value. Remember: the smaller the value, the more you will be able to " "precisely control the incoming rate." msgstr "" -"Größe des RX-Socket-Puffers für Downloads (. Um zu verhindern, dass Gtk-" -"Gnutella die gesamte Bandbreite nutzt, sollte dies auf einen niedrigen Wert " -"gesetzt werden (8 KiB). Falls das kein Problem darstellt und auch die Latenz " -"keine Rolle spielt, kann der Wert erhöht werden. Je kleiner der Wer ist, " -"desto präziser lassen Bandbreitenbegrenzungen kontrollieren." msgid "" "Size of the RX socket buffer to be used for nodes, in kbytes. The lower the " @@ -2534,7 +3726,7 @@ msgid "" "If set to TRUE, the global hostiles.txt is used as well as the private " -"$GTK_GNUTELLA_DIR/hostiles.txt. This allows to separate your private ban " +"$GTK_GNUTELLA_DIR/hostiles.txt. This allows you to separate your private ban " "list from the global one distributed with gtk-gnutella." msgstr "" @@ -2661,13 +3853,10 @@ "Gibt an, ob gtk-gnutella gerade im Hintergrund TTHs von freigegebenen " "Dateien berechnet" -#, fuzzy msgid "" "Whether gtk-gnutella is currently verifying the TTH of downloaded files in " "the background." msgstr "" -"Gibt an, ob gtk-gnutella gerade im Hintergrund die SHA1-Prüfsummen von " -"heruntergeladenen Dateien berechnet und überprüft" msgid "Maximum number of results to show in any search." msgstr "" @@ -2684,13 +3873,11 @@ msgid "Signature of the latest SVN release notification." msgstr "" -#, fuzzy msgid "Maximum number of hosts in the TLS node cache." -msgstr "Maximale Anzahl an Ultrapeers im Host-Cache" +msgstr "" -#, fuzzy msgid "Maximum time before removing hosts from the TLS cache." -msgstr "Maximale Anzahl an Ultrapeers im Host-Cache" +msgstr "" msgid "" "If set to TRUE the tigertree root hash (TTH) can be discovered on the fly. " @@ -2704,17 +3891,14 @@ "experience." msgstr "" -#, fuzzy msgid "Maximum number of hosts in the G2 node cache." -msgstr "Maximale Anzahl an Ultrapeers im Host-Cache" +msgstr "" -#, fuzzy msgid "Maximum time before removing hosts from the G2 cache." -msgstr "Maximale Anzahl an Ultrapeers im Host-Cache" +msgstr "" -#, fuzzy msgid "Debug level for management of G2-only hosts." -msgstr "Debug-Level für Download-Mesh-Management." +msgstr "" msgid "" "Whether GTKG can switch among the several files waiting to be downloaded " @@ -2727,7 +3911,6 @@ "disable unless you know what you are doing." msgstr "" -#, fuzzy msgid "" "When partial file sharing (PFSP) is enabled, gtk-gnutella will strive to " "download chunks in a random order, to maximize the spreading of the file in " @@ -2737,13 +3920,6 @@ "tail of the file as soon as possible. Set it to 0 to disable any tail-" "downloading preference." msgstr "" -"Wenn die Freigabe unvollständig heruntergeladener Dateien aktiviert ist, " -"bemüht sich gtk-gnutella um das Herunterladen der Dateistücke in zufälliger " -"Reihenfolge, um die Verbreitung der Datei im Netzwerk zu maximieren. Dies " -"erschwert jedoch das Ansehen/Anhören bestimmter Dateitypen erheblich oder " -"macht es unmöglich. Dieses Feld setzt die Anzahl der Bytes, die vom Beginn " -"der Datei heruntergeladen werden sollen, bevor das Herunterladen in " -"zufälliger Reihenfolge initiiert wird." msgid "" "Whether GTKG should post-process filenames to remove consecutive '_' in the " @@ -2757,21 +3933,17 @@ "files and push-proxies for firewalled hosts. It requires UDP support." msgstr "" -#, fuzzy msgid "Debug level for the callout queue." -msgstr "Debug-Level für die Suchanfragen" +msgstr "" -#, fuzzy msgid "Debug level for DHT node lookups." -msgstr "Debug-Level für HTTP" +msgstr "" -#, fuzzy msgid "Debug level for DHT key/value storage." -msgstr "Debug-Level für HTTP" +msgstr "" -#, fuzzy msgid "Debug level for DHT key/value publishing." -msgstr "Debug-Level für HTTP" +msgstr "" msgid "" "Bandwidth hint for DHT user lookups, in bytes/sec. This is used both for " @@ -2802,9 +3974,8 @@ "closest nodes will keep mutual knowledge about each other" msgstr "" -#, fuzzy msgid "Debug level for the DHT user lookup queue." -msgstr "Debug-Level für die Suchanfragen" +msgstr "" msgid "If TRUE, DHT storage uses memory instead of diskspace." msgstr "" @@ -2826,9 +3997,8 @@ "uploads and push-proxy exchanges." msgstr "" -#, fuzzy msgid "Debug level for (generic) file verification code." -msgstr "Debug-Level für File-Sharing-Code" +msgstr "" msgid "" "Maximum number of hosts in the local address cache, which remembers the " @@ -2840,80 +4010,63 @@ "remembers the recent IP:port combinations we had." msgstr "" -#, fuzzy msgid "Debug level for management of local address cache." -msgstr "Debug-Level für Download-Mesh-Management." +msgstr "" msgid "" "If enabled, all packets enqueued for transmission are dumped to " "$GTK_GNUTELLA_DIR/packets_tx.dump." msgstr "" -#, fuzzy msgid "Debug level the TCP message queues" -msgstr "Debug-Level für die Suchanfragen" +msgstr "" -#, fuzzy msgid "Debug level for the UDP message queue." -msgstr "Debug-Level für die Suchanfragen" +msgstr "" -#, fuzzy msgid "" "Maximum size of the UDP message queue (in bytes). Must be at least 150 " "percent of the maximum message size." msgstr "" -"Maximale Größe der Sendewarteschlange für Peers (in Bytes). Muss mindestens " -"150% der maximalen Paketgröße entsprechen" -#, fuzzy msgid "Debug level for the management of the clock accuracy." -msgstr "Debug-Level für Download-Mesh-Management." +msgstr "" -#, fuzzy msgid "Debug level for the firewalled status management." -msgstr "Debug-Level für Download-Mesh-Management." +msgstr "" -#, fuzzy msgid "Debug level for host management." -msgstr "Debug-Level für Download-Mesh-Management." +msgstr "" -#, fuzzy msgid "Debug level for DHT root node caching." -msgstr "Debug-Level für die Oberfläche" +msgstr "" -#, fuzzy msgid "Logged statistics level for code shared between GUI and core." -msgstr "Debug-Level für Code, der svon GUI und Kern genutzt wird." +msgstr "" -#, c-format msgid "" "If TRUE, the spam SHA1 database is kept in memory. If FALSE, it is kept in a " "fast disk database, which saves a large amount of core memory and reduces " "the overall footprint, at the cost of an increased I/O level. However, the " -"DB cache has typically a 90% hit rate, so the actual overhead is barely " +"DB cache has a 90 percent hit rate, so the actual overhead is barely " "noticeable when running as an ultra node and should remain completely " "unnoticed when running as a leaf." msgstr "" -#, fuzzy msgid "Debug level for spam detection." -msgstr "Debug-Level für die Oberfläche" +msgstr "" -#, fuzzy msgid "Debug level for lockfile management." -msgstr "Debug-Level für Download-Mesh-Management." +msgstr "" -#, fuzzy msgid "Debug level for the zone-based memory allocator." -msgstr "Debug-Level für die Suchanfragen" +msgstr "" -#, fuzzy msgid "Debug level for the pool-based memory allocator." -msgstr "Debug-Level für die Suchanfragen" +msgstr "" -#, fuzzy msgid "Debug level for the RX buffer allocator." -msgstr "Debug-Level für die Oberfläche" +msgstr "" msgid "" "Whether the zone-based memory allocator should always keep the zones in " @@ -2924,44 +4077,35 @@ "spam_lut_in_memory to FALSE." msgstr "" -#, fuzzy msgid "Debug level for the virtual memory manager." -msgstr "Debug-Level für Vendor-spezifische Pakete" +msgstr "" -#, fuzzy msgid "Debug level for final shutdown." -msgstr "Debug-Level für Dateiinfo" +msgstr "" -#, fuzzy msgid "Country preferences" -msgstr "_Konfiguration" +msgstr "" -#, fuzzy msgid "Debug level for country limits." -msgstr "Debug-Level für die Suchanfragen" +msgstr "" -#, fuzzy msgid "Whether to log dropped Gnutella messages" -msgstr "Debug-Level für Gnutella-Pakete" +msgstr "" -#, fuzzy msgid "Debug level for whitelist management." -msgstr "Debug-Level für Download-Mesh-Management." +msgstr "" -#, fuzzy msgid "Debug level for DHT token caching." -msgstr "Debug-Level für die Oberfläche" +msgstr "" -#, fuzzy msgid "Debug level for DHT publishing from Gnutella." -msgstr "Debug-Level für HTTP" +msgstr "" msgid "Defines which DHT messages should be traced." msgstr "" -#, fuzzy msgid "Enable bandwidth limitation for outgoing DHT traffic." -msgstr "Bandbreitenbegrenzung für ausgehenden HTTP-Verkehr aktivieren" +msgstr "" msgid "" "Bandwidth limit for outgoing DHT traffic in bytes/sec. It is always pooled " @@ -2969,35 +4113,26 @@ "enabled, so that UDP queues can flush more quickly." msgstr "" -#, fuzzy msgid "Maximum size of the DHT message queue (in bytes)." msgstr "" -"Maximale Größe von Suchtrefferpaketen, die wir an andere weiterleiten (in " -"Bytes)" -#, fuzzy msgid "Debug level for bandwidth scheduler." -msgstr "Debug-Level für Bann-Code" +msgstr "" -#, fuzzy msgid "Debug level for the DHT stable node recorder." -msgstr "Debug-Level für die Suchanfragen" +msgstr "" -#, fuzzy msgid "Debug level for the file (re)loading, on change." -msgstr "Debug-Level für File-Sharing-Code" +msgstr "" -#, fuzzy msgid "Debug level for the file moving, accross filesystems." -msgstr "Debug-Level für File-Sharing-Code" +msgstr "" -#, fuzzy msgid "Debug level for query hit message generation." -msgstr "Debug-Level für die Oberfläche" +msgstr "" -#, fuzzy msgid "Debug level for version management." -msgstr "Debug-Level für Download-Mesh-Management." +msgstr "" msgid "Minimum CPU frequency, in Hz." msgstr "" @@ -3005,9 +4140,8 @@ msgid "Maximum CPU frequency, in Hz." msgstr "" -#, fuzzy msgid "DHT bootstrap status." -msgstr "HTTP-Verkehr" +msgstr "" msgid "" "The DHT running mode. An active node will be able to store values and is a " @@ -3022,39 +4156,32 @@ msgid "Current DHT running mode." msgstr "" -#, fuzzy msgid "Debug level for the one-time memory allocator." -msgstr "Debug-Level für die Suchanfragen" +msgstr "" -#, fuzzy msgid "Debug level for the host cache." -msgstr "Debug-Level für die Suchanfragen" +msgstr "" msgid "Random bits." msgstr "" -#, fuzzy msgid "Average servent downtime." -msgstr "Mittlere Servent-Laufzeit." +msgstr "" msgid "Time when last shutdown occurred." msgstr "" -#, fuzzy msgid "Debug level for alive pings." -msgstr "Debug-Level für Dateiinfo" +msgstr "" -#, fuzzy msgid "Debug level for the versatile XML layer." -msgstr "Debug-Level für die Oberfläche" +msgstr "" -#, fuzzy msgid "Debug level for the UPnP layer." -msgstr "Debug-Level für die Oberfläche" +msgstr "" -#, fuzzy msgid "Debug level for the SOAP layer." -msgstr "Debug-Level für die Oberfläche" +msgstr "" msgid "Defines SOAP exchanges tracing type." msgstr "" @@ -3087,9 +4214,8 @@ msgid "Whether gtk-gnutella can install port mappings, if needed." msgstr "" -#, fuzzy msgid "Debug level for the NAT-PMP layer." -msgstr "Debug-Level für die Oberfläche" +msgstr "" msgid "" "Whether NAT-PMP (NAT Port Mapping Protocol) should be enabled. Support for " @@ -3106,54 +4232,37 @@ "mappings, if required." msgstr "" -#, fuzzy msgid "Debug level for the TX (transmit) network layer." -msgstr "Debug-Level für die Oberfläche" +msgstr "" -#, fuzzy msgid "Debug level for the RX (receive) network layer." -msgstr "Debug-Level für die Oberfläche" +msgstr "" -#, fuzzy msgid "Debug level for the I/O input event layer." -msgstr "Debug-Level für die Oberfläche" +msgstr "" -#, fuzzy msgid "Debug level for the background task scheduler." -msgstr "Debug-Level für Bann-Code" +msgstr "" -#, fuzzy msgid "Whether gtk-gnutella was able to configure port mappings." msgstr "" -"Gibt an, ob gtk-gnutella davon ausgeht, dass eine Verbindung zum Internet " -"besteht" -#, fuzzy msgid "Whether gtk-gnutella disabled HTTP bandwidth stealing." msgstr "" -"Gibt an, ob gtk-gnutella davon ausgeht, dass eine Verbindung zum Internet " -"besteht" -#, fuzzy msgid "Whether gtk-gnutella ignores HTTP stolen bandwidth." msgstr "" -"Gibt an, ob gtk-gnutella davon ausgeht, dass eine Verbindung zum Internet " -"besteht" msgid "Whether gtk-gnutella enforces uniform HTTP outgoing bandwidth." msgstr "" -#, fuzzy msgid "" "Whether gtk-gnutella should use HTTP request pipelining when possible, in " "order to decrease downloading latency." msgstr "" -"Gibt an, ob gtk-gnutella den eigenen Hostnamen an Downloader und in " -"Suchtreffern zurückgeben soll." -#, fuzzy msgid "Maximum chunk size when swarming with HTTP pipelining." -msgstr "Maximale Chunk-Größe beim Herunterladen von mehreren Hosts." +msgstr "" msgid "" "Whether the Gnutella UDP Extension for Scalable Searches (GUESS) should be " @@ -3175,25 +4284,20 @@ "Searches)." msgstr "" -#, fuzzy msgid "Maximum number of IPv4 hosts in the regular GUESS cache." -msgstr "Maximale Anzahl Legacy-Peers im Host-Cache" +msgstr "" -#, fuzzy msgid "Current number of IPv4 hosts in the regular GUESS cache." -msgstr "Derzeitige Anzahl Peers im Peer-Cache" +msgstr "" -#, fuzzy msgid "Maximum number of IPv4 hosts in the introduction GUESS cache." -msgstr "Maximale Anzahl an Ultrapeers im Host-Cache" +msgstr "" -#, fuzzy msgid "Current number of IPv4 hosts in the introduction GUESS cache." -msgstr "Derzeitige Anzahl von Ultrapeers im Peer-Cache" +msgstr "" -#, fuzzy msgid "Debug level for the DB disk/RAM storage layer." -msgstr "Debug-Level für die Oberfläche" +msgstr "" msgid "" "The current Session ID. This is a unique ID generated each time gtk-" @@ -3221,13 +4325,11 @@ "overall" msgstr "" -#, fuzzy msgid "Debug level for the matching code." -msgstr "Debug-Level für Bann-Code" +msgstr "" -#, fuzzy msgid "Debug level for the time synchronization code." -msgstr "Debug-Level für File-Sharing-Code" +msgstr "" msgid "" "Whether queries can request partial results hits, i.e. files which are " @@ -3240,9 +4342,8 @@ "are returned." msgstr "" -#, fuzzy msgid "Whether what's-new? queries should be answered to." -msgstr "Gibt an, ob die übertragenen Suchanfragen angezeigt werden sollen." +msgstr "" msgid "" "When set, gtk-gnutella will automatically stop opened searches from which " @@ -3250,163 +4351,240 @@ "configured expiration time." msgstr "" -#, fuzzy msgid "Maximum number of results to show in a What's New? request." msgstr "" -"Maximale Dauer in Sekunden bevor ein automatischer Downloadversuch " -"abgebrochen wird." -#, fuzzy msgid "Maximum number of results to show in a passive search request." -msgstr "Maximale Anzahl angezeigter Anfragen im Suchmonitor." +msgstr "" -#, fuzzy msgid "Whether to log duplicate Gnutella messages from same node." -msgstr "Debug-Level für Gnutella-Pakete" +msgstr "" -#, fuzzy msgid "Whether to log duplicate Gnutella messages with a higher TTL." -msgstr "Debug-Level für Gnutella-Pakete" +msgstr "" -#, fuzzy msgid "Whether to log duplicate Gnutella messages (not from same node)." -msgstr "Debug-Level für Gnutella-Pakete" +msgstr "" -#, fuzzy msgid "Whether to log new Gnutella messages, never seen before." -msgstr "Debug-Level für Gnutella-Pakete" +msgstr "" -#, fuzzy msgid "Whether to log Gnutella routing decisions." -msgstr "Debug-Level für Gnutella-Pakete" +msgstr "" -#, fuzzy msgid "Whether to log bad Gnutella messages, corrupted or unexpected." -msgstr "Debug-Level für Gnutella-Pakete" +msgstr "" msgid "Whether to log conditions triggering query hit spam flagging." msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the ultra node cache." -msgstr "Maximale Anzahl an Ultrapeers im Host-Cache" +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in ultra node caches." -msgstr "Derzeitige Anzahl von Ultrapeers im Peer-Cache" +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in the regular GUESS cache." -msgstr "Derzeitige Anzahl Peers im Peer-Cache" +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in the introduction GUESS cache." -msgstr "Derzeitige Anzahl von Ultrapeers im Peer-Cache" +msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the regular GUESS cache." -msgstr "Maximale Anzahl Legacy-Peers im Host-Cache" +msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the introduction GUESS cache." -msgstr "Maximale Anzahl an Ultrapeers im Host-Cache" +msgstr "" -#, fuzzy msgid "Debug level for the malloc() replacement allocator." -msgstr "Debug-Level für die Suchanfragen" +msgstr "" -#, fuzzy msgid "Debug level for bad query hit messages." -msgstr "Debug-Level für die Oberfläche" +msgstr "" -#, fuzzy msgid "Debug level for GUID management." -msgstr "Debug-Level für Download-Mesh-Management." +msgstr "" -msgid "disable" -msgstr "deaktiviert" +msgid "Debug level for the TX (transmit) deflating network layer." +msgstr "" -msgid "by words" -msgstr "nach Schlüsselwörtern" +msgid "Comma-separated list of TX debugging hosts (IP addresses only)" +msgstr "" -msgid "by whole query" -msgstr "nach kompletten Suchanfragen" +msgid "" +"Comma-separated list of hosts for whom we want to dump RX traffic (IP " +"addresses only)" +msgstr "" -msgid "by router" -msgstr "nach Routern" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they emit " +"(IP addresses only)" +msgstr "" -msgid "TCP & UDP" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they " +"receive (IP addresses only)" msgstr "" -msgid "TCP only" -msgstr "Nur TCP" +msgid "" +"Allow GUESS to use some of the unused Gnutella outgoing bandwidth regardless " +"of the GUESS bandwidth hint. If FALSE, only the configured bandwidth hint " +"will be used. When running as a leaf this should be set to TRUE to make " +"GUESS queries run faster." +msgstr "" -msgid "UDP only" -msgstr "Nur UDP" +msgid "Debug level for the UDP TX scheduler." +msgstr "" -msgid "Ping" -msgstr "Ping" +msgid "" +"Debugging flags for the semi-reliable UDP TX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: transmissions, 16: timeouts." +msgstr "" -msgid "Pong" -msgstr "Pong" +msgid "Comma-separated list of RX debugging hosts (IP addresses only)" +msgstr "" -msgid "Bye" -msgstr "Bye" +msgid "" +"Debugging flags for the semi-reliable UDP RX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: receptions, 16: timeouts." +msgstr "" -msgid "QRP" -msgstr "QRP" +msgid "Whether to log sent semi-reliable UDP messages." +msgstr "" -msgid "HSEP" +msgid "Whether to log received semi-reliable UDP messages." msgstr "" -msgid "RUDP" +msgid "Debug level for the secured OOB query hit claiming." msgstr "" -msgid "Vendor spec." -msgstr "Anbieterspez." +msgid "Whether to log sent vendor messages." +msgstr "" -msgid "Vendor std." -msgstr "Anbieterstd." +msgid "Whether to log received vendor messages." +msgstr "" -msgid "Push" -msgstr "Push" +msgid "Debugging flags for the DHT token cache (developers only)." +msgstr "" -msgid "Query" -msgstr "Suche" +msgid "Whether to log weird DHT message headers when debugging." +msgstr "" -msgid "Query Hit" -msgstr "Suchtreffer" +msgid "Debug level for the DHT Remote Procedure Call (RPC) code." +msgstr "" -#, fuzzy -msgid "DHT Ping" -msgstr "Ping" +msgid "Whether to log UHC pings we receive." +msgstr "" -#, fuzzy -msgid "DHT Pong" -msgstr "Pong" +msgid "Whether to log UHC pings we emit." +msgstr "" -#, fuzzy -msgid "DHT Store" -msgstr "HTTP-Verkehr" +msgid "Whether the program was properly shutdown." +msgstr "" -msgid "DHT Store Ack" +msgid "Whether the program restarted after a clean shutdown." msgstr "" -msgid "DHT Find Node" +msgid "Debug level for DHT key management." msgstr "" -msgid "DHT Found Node" +msgid "Debug level for DHT value management." msgstr "" -msgid "DHT Find Value" +msgid "ID of the current process." msgstr "" -#, fuzzy -msgid "DHT Value" -msgstr "Wert" +msgid "Debug level for HTTP range parsing / handling." +msgstr "" -msgid "Total" -msgstr "Insgesamt" +msgid "" +"Lease time when installing port mappings via UPnP or NAT-PMP, in seconds. A " +"value of 0 requests permanent mappings." +msgstr "" + +msgid "Whether the program is auto-restarting at the user's request." +msgstr "" + +msgid "Debug level for time management." +msgstr "" + +msgid "Debug level for the tmalloc() thread-magazine object distributor." +msgstr "" + +msgid "Debug level for the event queue thread." +msgstr "" + +msgid "Maximum number of G2 hubs in the hub cache." +msgstr "" + +msgid "Current number of IPv4 hosts in the G2 hub caches." +msgstr "" + +msgid "Whether the G2 protocol should be enabled." +msgstr "" + +msgid "Number of G2 nodes currently connected." +msgstr "" + +msgid "Maximum amount of G2 hubs we should connect to as a leaf." +msgstr "" + +msgid "Whether to log bad G2 messages, corrupted or unexpected." +msgstr "" + +msgid "Whether to log dropped G2 messages" +msgstr "" + +msgid "Debug level for the G2 RPC layer." +msgstr "" + +msgid "Whether to log summary of received query hits" +msgstr "" + +msgid "Whether to log summary of each record in received query hits" +msgstr "" + +msgid "Number of G2 browsing requests received in this session." +msgstr "" + +msgid "Number of G2 browsing requests fully served in this session." +msgstr "" + +msgid "Whether to log G2 messages we're attempting to send" +msgstr "" + +msgid "" +"Timestamp at which the current session was started. This stamp remains " +"unchanged when gtk-gnutella restarts after a crash or an explicit restart " +"request." +msgstr "" + +msgid "No TCP listening socket bound to allow incoming connections." +msgstr "" + +msgid "disable" +msgstr "deaktiviert" + +msgid "by words" +msgstr "nach Schlüsselwörtern" + +msgid "by whole query" +msgstr "nach kompletten Suchanfragen" + +msgid "by router" +msgstr "nach Routern" + +msgid "TCP & UDP" +msgstr "" + +msgid "TCP only" +msgstr "Nur TCP" + +msgid "UDP only" +msgstr "Nur UDP" + +msgid "Query Hit" +msgstr "Suchtreffer" msgid "Icons" msgstr "Symbole" @@ -3553,9 +4731,8 @@ msgid "Display Sidebar." msgstr "Seitenleiste anzeigen" -#, fuzzy msgid "Display Menu." -msgstr "Seitenleiste anzeigen" +msgstr "" msgid "Display statusbar." msgstr "Statusleiste anzeigen" @@ -3839,26 +5016,20 @@ "newer)." msgstr "" -#, fuzzy msgid "Automatically hide DHT bandwidth display when DHT not enabled." msgstr "" -"Automatisch Leaf-Peer-Anzeige verstecken, wenn nicht im Ultrapeer-Modus" -#, fuzzy msgid "Display incoming DHT traffic bandwidth usage." -msgstr "Bandbreite für eingehenden HTTP-Verkehr anzeigen" +msgstr "" -#, fuzzy msgid "Display outgoing DHT traffic bandwidth usage." -msgstr "Bandbreite für ausgehenden HTTP-Verkehr anzeigen" +msgstr "" -#, fuzzy msgid "Display incoming DHT traffic bandwidth as an average." -msgstr "Mittlere Bandbreite für eingehenden HTTP-Verkehr anzeigen" +msgstr "" -#, fuzzy msgid "Display outgoing DHT traffic bandwidth as an average." -msgstr "Mittlere Bandbreite für ausgehenden HTTP-Verkehr anzeigen" +msgstr "" msgid "" "Remote nodes supporting media type filtering will apply your query " @@ -3888,7 +5059,7 @@ msgstr "" msgid "" -"Discard search results whith an alien IP address, not matching the one from " +"Discard search results with an alien IP address, not matching the one from " "which the results come from." msgstr "" @@ -3897,6 +5068,17 @@ "be restarted when gtk-gnutella is launched." msgstr "" +msgid "Discard search results coming from servents with a banned GUID." +msgstr "" + +msgid "Whether a summary line with GUESS search stats should be displayed." +msgstr "" + +msgid "" +"Whether the GUESS summary line should show total statistics or ones " +"pertaining to the current search only." +msgstr "" + msgid "Anonymizing proxies" msgstr "" @@ -3984,6 +5166,9 @@ msgid "Benin" msgstr "" +msgid "Saint Barthelemy" +msgstr "" + msgid "Bermuda" msgstr "" @@ -3993,6 +5178,9 @@ msgid "Bolivia" msgstr "" +msgid "Bonaire, Sint Eustatius and Saba" +msgstr "" + msgid "Brazil" msgstr "" @@ -4002,6 +5190,9 @@ msgid "Bhutan" msgstr "" +msgid "Burma" +msgstr "" + msgid "Bouvet Island" msgstr "" @@ -4062,6 +5253,9 @@ msgid "Cape Verde" msgstr "" +msgid "Curacao" +msgstr "" + msgid "Christmas Island" msgstr "" @@ -4527,12 +5721,18 @@ msgid "Suriname" msgstr "" +msgid "South Sudan" +msgstr "" + msgid "Sao Tome and Principe" msgstr "" msgid "El Salvador" msgstr "" +msgid "Sint Maarten" +msgstr "" + msgid "Syrian Arab Republic" msgstr "" @@ -4689,11 +5889,8 @@ msgid "locale_get_language|en" msgstr "de" -#, fuzzy msgid "unofficial build, accessing files from" msgstr "" -"Dies ist eine inoffizielle kompilierte Version, die auf Dateienin diesem " -"Verzeichnis zugreift:" msgid "URL missing" msgstr "URL fehlt" @@ -4739,37 +5936,39 @@ msgid "Interactive mode turned off." msgstr "Interaktiver Modus deaktiviert." -#, fuzzy +#, c-format +msgid "Unknown operation \"show %s\"" +msgstr "" + +#, c-format +msgid "Unknown operation \"%s\"" +msgstr "" + msgid "Cannot determine current working directory" -msgstr "Kann das Heimatverzeichnis nicht finden!" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Unknown logfile name \"%s\"" -msgstr "Unbekannte Eigenschaft" +msgstr "" -#, fuzzy msgid "Unable to reopen" -msgstr "Konnte GIV nicht senden" +msgstr "" #, c-format msgid "Could not rename logfile as \"%s\": %m" msgstr "" -#, fuzzy, c-format -msgid "Unknown operation \"%s\"" -msgstr "Unbekannte Operation" - -#, fuzzy, c-format -msgid "Unknown operation \"show %s\"" -msgstr "Unbekannte Operation" - -#, fuzzy, c-format +#, c-format msgid "Unknown operation \"stats %s\"" -msgstr "Unbekannte Operation" +msgstr "" -#, fuzzy, c-format +#, c-format +msgid "Unknown operation \"check %s\"" +msgstr "" + +#, c-format msgid "Unknown operation \"usage %s\"" -msgstr "Unbekannte Operation" +msgstr "" msgid "Invalid IP/Port" msgstr "IP/Port fehlerhaft" @@ -4792,9 +5991,9 @@ msgid "Property missing" msgstr "Eigenschaft fehlt" -#, fuzzy, c-format +#, c-format msgid "Unknown property \"%s\"" -msgstr "Unbekannte Eigenschaft" +msgstr "" msgid "Value: " msgstr "Wert:" @@ -4808,6 +6007,9 @@ msgid "Good bye" msgstr "Auf Wiedersehen" +msgid "Invalid command syntax" +msgstr "" + msgid "Query string missing" msgstr "Suchanfrage fehlt" @@ -4817,9 +6019,8 @@ msgid "Search added" msgstr "Suche hinzugefügt" -#, fuzzy msgid "The search could not be created" -msgstr "Der Download konnte nicht gestartet werden" +msgstr "" msgid "Unknown property" msgstr "Unbekannte Eigenschaft" @@ -4827,6 +6028,9 @@ msgid "Value missing" msgstr "Wert fehlt" +msgid "Property cannot be changed" +msgstr "" + #, c-format msgid "Previous value was %s" msgstr "" @@ -4847,65 +6051,23 @@ msgid "unterminated single-quoted string" msgstr "" -msgid "Invalid command syntax" +msgid "too many arguments in command" msgstr "" -msgid "too many arguments in command" +#, c-format +msgid "un-parseable argument #%u in command" msgstr "" msgid "Malformed command" msgstr "Fehlerhaftes Kommando" -#, fuzzy, c-format +#, c-format msgid "Unknown command: \"%s\"" -msgstr "Unbekanntes Kommando" +msgstr "" msgid "Help: " msgstr "Hilfe:" -msgid "Bitzi|Unknown" -msgstr "Unbekannt" - -#, fuzzy -msgid "Bitzi|Unrated" -msgstr "Unterbewertet" - -msgid "Bitzi|Bitzi lookup failure" -msgstr "" - -msgid "Bitzi|Filesize mismatch" -msgstr "" - -msgid "Bitzi|Dangerous/Misleading" -msgstr "Gefährlich/Irreführend" - -msgid "Bitzi|Incomplete/Damaged" -msgstr "Unvollständig/Beschädigt" - -msgid "Bitzi|Substandard" -msgstr "Unterdurchschnittlich" - -msgid "Bitzi|Overrated" -msgstr "Überbewertet" - -msgid "Bitzi|Normal" -msgstr "Normal" - -msgid "Bitzi|Underrated" -msgstr "Unterbewertet" - -msgid "Bitzi|Complete" -msgstr "Komplett" - -msgid "Bitzi|Recommended" -msgstr "Empfohlen" - -msgid "Bitzi|Best Version" -msgstr "Beste Version" - -msgid "No other data" -msgstr "" - msgid "Filename" msgstr "Dateiname" @@ -4918,9 +6080,8 @@ msgid "SHA-1" msgstr "SHA-1" -#, fuzzy msgid "Not available" -msgstr "Keine Hilfe verfügbar" +msgstr "" msgid "Bitprint" msgstr "" @@ -4932,11 +6093,17 @@ msgid "Tigertree" msgstr "" -msgid "External metadata" +msgid "Rescheduled for" msgstr "" -msgid "Bitzi URL" -msgstr "Bitzi-URL" +msgid "Restartable since" +msgstr "" + +msgid "rescheduled for" +msgstr "" + +msgid "restartable since" +msgstr "" #, c-format msgid " (slot %u" @@ -4980,9 +6147,8 @@ msgid "Reading headers" msgstr "Lese Kopfzeilen" -#, fuzzy msgid "UDP push sent" -msgstr "Push gesendet" +msgstr "" msgid "Searching for new push-proxies" msgstr "" @@ -5009,23 +6175,21 @@ msgid "Chunk done" msgstr "Stück fertig" -#, fuzzy msgid "Waiting for TTH checking..." -msgstr "Warte auf SHA1-Überprüfung..." +msgstr "" msgid "Waiting for SHA1 checking..." msgstr "Warte auf SHA1-Überprüfung..." -#, fuzzy, c-format +#, c-format msgid "Computing %s (%.02f%%)" -msgstr "Berechne SHA1 (%.02f%%)" +msgstr "" msgid "TTH OK" msgstr "" -#, fuzzy msgid "SHA-1 OK" -msgstr "SHA-1" +msgstr "" msgid "SHA-1 MISMATCH" msgstr "" @@ -5050,31 +6214,23 @@ msgid "(stalled)" msgstr "(blockiert)" -#, fuzzy msgid "Receiving data" -msgstr "Empfange Kopfzeilen" +msgstr "" msgid "ignoring" msgstr "ignorieren" -#, fuzzy msgid "selected next" -msgstr " Ausgewählte abbrechen " +msgstr "" -#, fuzzy msgid "requesting next" -msgstr "Anfrage gesendet" +msgstr "" -#, fuzzy msgid "requested next" -msgstr "Anfrage gesendet" +msgstr "" -#, fuzzy msgid "Awaiting data" -msgstr "Warte" - -msgid "Unknown error" -msgstr "Unbekannter Fehler" +msgstr "" #, c-format msgid "Retry in %us" @@ -5090,9 +6246,8 @@ msgstr0 "%u Download verworfen" msgstr1 "%u Downloads verworfen" -#, fuzzy msgid "Filename (filtered)" -msgstr "Dateiname:" +msgstr "" msgid "Progress" msgstr "Fortschritt" @@ -5100,9 +6255,8 @@ msgid "RX" msgstr "" -#, fuzzy msgid "Downloaded" -msgstr "Heruntergeladen:" +msgstr "" msgid "Uploaded" msgstr "Hochgeladen" @@ -5116,9 +6270,8 @@ msgid "Active" msgstr "Aktiv" -#, fuzzy msgid "Incomplete" -msgstr "Fertig" +msgstr "" msgid "Orphaned" msgstr "" @@ -5126,9 +6279,9 @@ msgid "All" msgstr "" -#, fuzzy, c-format +#, c-format msgid "regex error: %s" -msgstr "Lesefehler: %s" +msgstr "" #, c-format msgid "Selected %u of %u download matching \"%s\"." @@ -5149,14 +6302,13 @@ msgstr "enthält den Substring" msgid "matches the regex pattern" -msgstr "passt auf den reguläen Ausdruck" +msgstr "passt auf den regulären Ausdruck" msgid "is exactly" msgstr "ist exakt" -#, fuzzy msgid "Built-in targets" -msgstr "Eingebaute Ziele (nicht editierbar)" +msgstr "" msgid "Global filters" msgstr "Globale Filter" @@ -5313,9 +6465,8 @@ msgid "(invalid)" msgstr "(ungültig)" -#, fuzzy msgid "<Archive>" -msgstr "Aktiv" +msgstr "" msgid "<Audio>" msgstr "" @@ -5338,643 +6489,6 @@ msgid "RETURN" msgstr "" -msgid "Query hit" -msgstr "Suchtreffer" - -msgid "DHT (truncated)" -msgstr "" - -msgid "Routing errors" -msgstr "Routing-Fehler" - -#, fuzzy -msgid "Routing table chunks" -msgstr "Laufende Nummer der Routing-Tabellengenerierung." - -msgid "Routing table message capacity" -msgstr "" - -msgid "Routing table message count" -msgstr "" - -msgid "Duplicates with higher TTL" -msgstr "Dupletten mit höherer TTL" - -msgid "SPAM SHA1 database hits" -msgstr "" - -#, fuzzy -msgid "SPAM filename and size hits" -msgstr "Falls der Dateiname mit \"%s\" endet %s" - -msgid "SPAM fake hits" -msgstr "" - -msgid "SPAM duplicate hits" -msgstr "" - -msgid "SPAM dynamically caught hostile IP addresses" -msgstr "" - -msgid "SPAM dynamically caught hostile IP held" -msgstr "" - -msgid "SPAM spotted spamming IP addresses held" -msgstr "" - -msgid "Searches to local DB" -msgstr "Anfragen an lokale DB" - -msgid "Hits on local DB" -msgstr "Treffer in lokaler DB" - -#, fuzzy -msgid "Hits on local partial files" -msgstr "Treffer in lokaler DB" - -msgid "Hits on \"what's new?\" queries" -msgstr "" - -msgid "Query hits received for local queries" -msgstr "" - -msgid "Query hits received for OOB-proxied queries" -msgstr "" - -msgid "Queries requesting OOB hit delivery" -msgstr "" - -msgid "Stripped OOB flag on queries" -msgstr "" - -msgid "Duplicate OOB-proxied queries" -msgstr "" - -msgid "OOB hits received for OOB-proxied queries" -msgstr "" - -msgid "OOB hits bearing alien IP address" -msgstr "" - -msgid "OOB hits ignored due to identified spamming address" -msgstr "" - -msgid "Unclaimed locally-generated OOB hits" -msgstr "" - -msgid "Partially claimed locally-generated OOB hits" -msgstr "" - -msgid "Spurious OOB hit claiming received" -msgstr "" - -msgid "Unrequested OOB hits received" -msgstr "" - -msgid "Received query hits for untracked queries" -msgstr "" - -msgid "Tracked query MUIDs" -msgstr "" - -msgid "Compacted queries" -msgstr "Verkleinerte Suchanfragen" - -msgid "Bytes saved by compacting" -msgstr "Gesparte Bytes durch Verkleinerung" - -msgid "UTF8 queries" -msgstr "UTF8-Anfragen" - -msgid "SHA1 queries" -msgstr "SHA1-Anfragen" - -#, fuzzy -msgid "\"What's New?\" queries" -msgstr "Generierte Anfragen" - -#, fuzzy -msgid "GUESS queries" -msgstr "UTF8-Anfragen" - -#, fuzzy -msgid "GUESS queries (0.2)" -msgstr "UTF8-Anfragen" - -msgid "GUESS cached query keys held" -msgstr "" - -msgid "GUESS cached 0.2 hosts held" -msgstr "" - -#, fuzzy -msgid "GUESS locally generated queries" -msgstr "Generierte dynamische Anfragen" - -msgid "GUESS currently running queries" -msgstr "" - -msgid "GUESS hits received for locally generated queries" -msgstr "" - -msgid "GUESS hosts queried" -msgstr "" - -msgid "GUESS hosts sending back an acknowledgment" -msgstr "" - -msgid "Broadcasted push messages" -msgstr "Versandte Push-Pakete" - -#, fuzzy -msgid "Push-proxy UDP relayed messages" -msgstr "Durch Push-Proxy weitergeleitete Pakete" - -msgid "Push-proxy TCP relayed messages" -msgstr "Durch Push-Proxy weitergeleitete Pakete" - -msgid "Push-proxy broadcasted messages" -msgstr "Durch Push-Proxy versandte Pakete" - -msgid "Push-proxy found un-proxied local route" -msgstr "" - -msgid "Push-proxy lookup failures" -msgstr "Push-Proxy nicht gefunden" - -msgid "Push relayed via local route" -msgstr "" - -msgid "Push relayed via routing table" -msgstr "" - -msgid "Locally generated dynamic queries" -msgstr "Generierte dynamische Anfragen" - -msgid "Leaf-generated dynamic queries" -msgstr "Leaf-generierte dynamische Anfragen" - -msgid "OOB-proxied leaf queries" -msgstr "" - -msgid "Fully completed dynamic queries" -msgstr "" - -msgid "Partially completed dynamic queries" -msgstr "" - -msgid "Dynamic queries ended with no results" -msgstr "" - -msgid "Fully completed dynamic queries getting late results" -msgstr "" - -msgid "Dynamic queries with partial late results" -msgstr "" - -msgid "Dynamic queries completed by late results" -msgstr "" - -msgid "Queries seen from GTKG" -msgstr "" - -msgid "Queries seen from GTKG that were re-queries" -msgstr "" - -msgid "Queries advertising support of GGEP \"H\"" -msgstr "" - -msgid "GIV callbacks received" -msgstr "" - -msgid "GIV discarded due to no suitable download" -msgstr "" - -msgid "QUEUE callbacks received" -msgstr "" - -msgid "QUEUE discarded due to no suitable download" -msgstr "" - -msgid "UDP messages with bogus source IP" -msgstr "" - -msgid "Alien UDP messages (non-Gnutella)" -msgstr "" - -msgid "Unprocessed UDP Gnutella messages" -msgstr "" - -msgid "Compressed UDP messages enqueued" -msgstr "" - -msgid "Compressed UDP messages received" -msgstr "" - -msgid "Uncompressed UDP messages due to no gain" -msgstr "" - -msgid "Consolidated servers (after GUID and IP address linking)" -msgstr "" - -msgid "Duplicate downloads found during server consolidation" -msgstr "" - -msgid "Discovered server GUIDs" -msgstr "" - -msgid "Changed server GUIDs" -msgstr "" - -msgid "Detected GUID collisions" -msgstr "" - -msgid "Detected collisions with our own GUID" -msgstr "" - -msgid "GUID dynamically banned" -msgstr "" - -msgid "Firewalled node info for known hosts received in upload requests" -msgstr "" - -msgid "Revitalized PUSH routes" -msgstr "" - -msgid "Collected new PUSH proxies from other query hits" -msgstr "" - -msgid "Attempted download resource switching on completion" -msgstr "" - -msgid "Attempted download resource switching after error" -msgstr "" - -msgid "Successful download resource switching (all kind)" -msgstr "" - -msgid "Successful download resource switching between plain files" -msgstr "" - -msgid "Successful download resource switching after error" -msgstr "" - -msgid "Actively queued after resource switching attempt" -msgstr "" - -msgid "Sunk HTTP reply data on error codes" -msgstr "" - -#, fuzzy -msgid "Ignored downloaded data" -msgstr "Heruntergeladen:" - -#, fuzzy -msgid "Ignoring requested after data mismatch" -msgstr "Sende Anfrage (%u%%)" - -#, fuzzy -msgid "Ignoring requested to preserve connection" -msgstr "Sende Anfrage (%u%%)" - -msgid "Ignoring requested due to aggressive swarming" -msgstr "" - -msgid "Ignoring refused (data too large or server too slow)" -msgstr "" - -msgid "Client resource switching (all detected)" -msgstr "" - -msgid "Client resource switching between plain files" -msgstr "" - -msgid "Client follow-up request after HTTP error was returned" -msgstr "" - -msgid "PARQ client resource switching in slots (SHA-1 based)" -msgstr "" - -msgid "PARQ client retry-after violation" -msgstr "" - -msgid "PARQ client kicked out after too many retry-after violations" -msgstr "" - -msgid "PARQ upload slot limit overrides" -msgstr "" - -msgid "PARQ quick upload slots granted" -msgstr "" - -msgid "PARQ QUEUE sending attempts" -msgstr "" - -msgid "PARQ QUEUE messages sent" -msgstr "" - -msgid "PARQ QUEUE follow-up requests received" -msgstr "" - -msgid "Launched SHA-1 file verifications" -msgstr "" - -msgid "Launched TTH file verifications" -msgstr "" - -msgid "Bitzi tickets held" -msgstr "" - -msgid "Re-seeding of orphan downloads through query hits" -msgstr "" - -#, fuzzy -msgid "Re-seeding of orphan downloads through upload requests" -msgstr "Debug-Level für Downloads" - -msgid "DHT estimated amount of nodes" -msgstr "" - -msgid "DHT k-ball theoretical frontier (bits)" -msgstr "" - -msgid "DHT k-ball furthest frontier (bits)" -msgstr "" - -msgid "DHT k-ball closeest frontier (bits)" -msgstr "" - -msgid "DHT routing table buckets" -msgstr "" - -msgid "DHT routing table leaves" -msgstr "" - -msgid "DHT routing table maximum depth" -msgstr "" - -#, fuzzy -msgid "DHT routing table good nodes" -msgstr "Laufende Nummer der Routing-Tabellengenerierung." - -msgid "DHT routing table stale nodes" -msgstr "" - -#, fuzzy -msgid "DHT routing table pending nodes" -msgstr "Laufende Nummer der Routing-Tabellengenerierung." - -msgid "DHT routing table evicted nodes" -msgstr "" - -msgid "DHT routing table evicted firewalled nodes" -msgstr "" - -#, fuzzy -msgid "DHT routing table evicted nodes due to quota" -msgstr "Laufende Nummer der Routing-Tabellengenerierung." - -msgid "DHT routing table promoted pending nodes" -msgstr "" - -#, fuzzy -msgid "DHT routing table pinged promoted nodes" -msgstr "Laufende Nummer der Routing-Tabellengenerierung." - -msgid "DHT routing table rejected node due to bucket network quota" -msgstr "" - -msgid "DHT routing table rejected node due to global network quota" -msgstr "" - -msgid "DHT completed bucket refreshes" -msgstr "" - -msgid "DHT forced bucket refreshes" -msgstr "" - -#, fuzzy -msgid "DHT forced bucket merges" -msgstr "Fehlerhaftes Kommando" - -msgid "DHT denied non-splitable bucket refresh" -msgstr "" - -msgid "DHT initiated bucket alive checks" -msgstr "" - -msgid "DHT alive pings sent to good nodes" -msgstr "" - -msgid "DHT alive pings sent to stale nodes" -msgstr "" - -msgid "DHT alive pings sent to shutdowning nodes" -msgstr "" - -msgid "DHT alive pings avoided" -msgstr "" - -msgid "DHT alive pings skipped" -msgstr "" - -msgid "DHT revitalized stale nodes on RPC reply" -msgstr "" - -msgid "DHT value store rejected on IP/network quota grounds" -msgstr "" - -msgid "DHT value store rejected on creator validation grounds" -msgstr "" - -msgid "DHT nodes rejected during lookup based on network quota" -msgstr "" - -msgid "DHT nodes rejected during lookup based on suspicious proximity" -msgstr "" - -msgid "DHT nodes rejected during lookup based on frequency divergence" -msgstr "" - -msgid "DHT keys held" -msgstr "" - -msgid "DHT cached keys held" -msgstr "" - -msgid "DHT values held" -msgstr "" - -msgid "DHT cached KUID targets held" -msgstr "" - -msgid "DHT cached closest root nodes" -msgstr "" - -msgid "DHT cached roots exact hits" -msgstr "" - -msgid "DHT cached roots approximate hits" -msgstr "" - -msgid "DHT cached roots misses" -msgstr "" - -msgid "DHT cached roots lookups within k-ball" -msgstr "" - -msgid "DHT cached roots contact address refreshed" -msgstr "" - -msgid "DHT cached security tokens held" -msgstr "" - -msgid "DHT cached security tokens hits" -msgstr "" - -#, fuzzy -msgid "DHT stable node information held" -msgstr "Detailinformation" - -msgid "DHT local hits on value lookups" -msgstr "" - -msgid "DHT local hits returning values from cached keys" -msgstr "" - -msgid "DHT returned expanded values" -msgstr "" - -msgid "DHT returned values as secondary keys" -msgstr "" - -#, fuzzy -msgid "DHT claimed values via secondary keys" -msgstr "Timeouts (alle Werte in Sekunden)" - -msgid "DHT returned cached expanded values" -msgstr "" - -msgid "DHT returned cached values as secondary-keys" -msgstr "" - -#, fuzzy -msgid "DHT claimed cached values via secondary keys" -msgstr "Timeouts (alle Werte in Sekunden)" - -msgid "DHT successfully received value publications" -msgstr "" - -msgid "DHT successfully received value removals" -msgstr "" - -msgid "DHT replication of stale value avoided" -msgstr "" - -msgid "DHT replication of held values" -msgstr "" - -msgid "DHT republishing of held values" -msgstr "" - -msgid "DHT secondary-key value fetch issued" -msgstr "" - -msgid "DHT duplicate values returned in lookups" -msgstr "" - -msgid "DHT detected KUID collisions" -msgstr "" - -msgid "DHT detected collisions with our own KUID" -msgstr "" - -msgid "DHT detected KUID mismatches on RPC reply" -msgstr "" - -msgid "DHT caching attempts" -msgstr "" - -msgid "DHT caching ended successfully" -msgstr "" - -msgid "DHT caching partially completed" -msgstr "" - -msgid "DHT key-offloading checks after discovering new closest node" -msgstr "" - -msgid "DHT keys selected for offloading" -msgstr "" - -msgid "DHT key-offloading attempts" -msgstr "" - -msgid "DHT key-offloading ended successfully" -msgstr "" - -msgid "DHT key-offloading partially completed" -msgstr "" - -msgid "DHT values successfully offloaded" -msgstr "" - -msgid "DHT publishing attempts" -msgstr "" - -msgid "DHT publishing ended successfully (all roots)" -msgstr "" - -msgid "DHT publishing partially completed (root subset only)" -msgstr "" - -msgid "DHT publishing ending with proper value presence" -msgstr "" - -msgid "DHT value republishing occurring too late (after expiry)" -msgstr "" - -msgid "DHT publishing to self" -msgstr "" - -msgid "DHT background publishing completion attempts" -msgstr "" - -msgid "DHT background publishing completion showing improvements" -msgstr "" - -msgid "DHT background publishing completion successful (all roots)" -msgstr "" - -msgid "DHT SHA1 data type collisions" -msgstr "" - -msgid "DHT lookup path passively protected against attack" -msgstr "" - -msgid "DHT lookup path actively protected against attack" -msgstr "" - -msgid "DHT alt-loc lookups issued" -msgstr "" - -#, fuzzy -msgid "DHT push-proxy lookups issued" -msgstr "Push-Proxy nicht gefunden" - -msgid "DHT successful alt-loc lookups" -msgstr "" - -msgid "DHT successful push-proxy lookups" -msgstr "" - -msgid "DHT successful node push-entry lookups" -msgstr "" - -#, fuzzy -msgid "DHT re-seeding of orphan downloads" -msgstr "Debug-Level für Downloads" - msgid "node" msgid_plural "nodes" msgstr0 "Peers" @@ -6027,13 +6541,11 @@ msgid "$Id$" msgstr "" -#, fuzzy msgid "%v/%u (%P%%)" -msgstr "%u/%u Host (%u%%)" +msgstr "" -#, fuzzy msgid "%v/%u Gnutella peers" -msgstr "%v/%u Gnutella-Peers" +msgstr "" msgid "%v/%u downloads" msgstr "%v/%u Downloads" @@ -6143,9 +6655,8 @@ msgid "Auto clear failed uploads" msgstr "Einträge für fehlgeschlagene Uploads automatisch entfernen" -#, fuzzy msgid "Automatically clear finished files" -msgstr "Angehaltene Downloads automatisch entfernen" +msgstr "" msgid "Automatically clear sources when..." msgstr "" @@ -6162,23 +6673,20 @@ msgid "Avg. uptime of this servent:" msgstr "Durchschnittliche Laufzeit dieses Servents:" -#, fuzzy msgid "Avg. downtime of this servent:" -msgstr "Durchschnittliche Laufzeit dieses Servents:" +msgstr "" msgid "Bad hosts" msgstr "Schlechte Hosts" -#, fuzzy msgid "Bandwidth limits for Gnutella traffic" -msgstr "Bandbreitenkontrolle für Gnet-Verkehr" +msgstr "" msgid "Bandwidth limits for HTTP traffic" msgstr "Bandbreitenkontrolle für HTTP-Verkehr" -#, fuzzy msgid "Bandwidth limits for the Distributed Hash Table" -msgstr "Bandbreitenkontrolle für Gnet-Verkehr" +msgstr "" msgid "Bandwidth targets for node lookups" msgstr "" @@ -6195,20 +6703,11 @@ msgid "Bind to this address" msgstr "Binde an diese Adresse" -#, fuzzy -msgid "Bitzi Metadata" -msgstr "Meta-Daten bei bitzi.com anfragen" - -#, fuzzy -msgid "Bitzi metadata" -msgstr "Meta-Daten bei bitzi.com anfragen" - msgid "Browse Host" msgstr "" -#, fuzzy msgid "Browse host" -msgstr "<Browse-Host-Anfrage>" +msgstr "" msgid "Busy" msgstr "Beschäftigt" @@ -6246,9 +6745,8 @@ msgid "Clear non-existent files" msgstr "Nicht existierende Dateien entfernen" -#, fuzzy msgid "Clear results" -msgstr "Ergebnisse _leeren" +msgstr "" msgid "Clear stopped" msgstr "Angehaltene entfernen" @@ -6265,9 +6763,8 @@ msgid "Clock synchronization" msgstr "Uhrensynchronisation" -#, fuzzy msgid "Close" -msgstr "_Schließen" +msgstr "" msgid "Collapse all" msgstr "Alles zuklappen" @@ -6320,9 +6817,8 @@ msgid "Connectin_g timeout" msgstr "Verbindungsaufbau-Timeout" -#, fuzzy msgid "Connection counters" -msgstr "Verbindungsaufbau-Timeout" +msgstr "" msgid "Connection settings" msgstr "Verbindungseinstellungen" @@ -6350,9 +6846,8 @@ msgid "Copy browse-host results to passive searches" msgstr "" -#, fuzzy msgid "Copy magnet to clipboard" -msgstr "Magnet in Zwischenablage kopieren" +msgstr "" msgid "Copy rule" msgstr "Regel kopieren" @@ -6381,13 +6876,11 @@ msgid "Currently used" msgstr "Derzeit benutzt" -#, fuzzy msgid "DHT traffic stats" -msgstr "HTTP-Verkehr" +msgstr "" -#, fuzzy msgid "DHT traffic" -msgstr "HTTP-Verkehr" +msgstr "" msgid "Debugging" msgstr "" @@ -6416,9 +6909,8 @@ msgid "Delete file on abort" msgstr "Datei nach Abbruch löschen" -#, fuzzy msgid "Delete file on mismatch" -msgstr "Datei bei Prüfsummenfehler löschen" +msgstr "" msgid "Detailed traffic information to display" msgstr "Anzuzeigende Verkehrsinformationen" @@ -6447,9 +6939,8 @@ msgid "Do you really want to quit?" msgstr "Wirklich beenden?" -#, fuzzy msgid "Download" -msgstr "Downloads" +msgstr "" msgid "Downloaded:" msgstr "Heruntergeladen:" @@ -6475,9 +6966,8 @@ msgid "Enable \"_Browse Host\" feature" msgstr "\"_Browse Host\"-Feature aktivieren" -#, fuzzy msgid "Enable _DHT" -msgstr "_UDP aktivieren" +msgstr "" msgid "Enable _UDP" msgstr "_UDP aktivieren" @@ -6565,9 +7055,8 @@ msgid "Force push mode" msgstr "Push-Modus erzwingen" -#, fuzzy msgid "Forget" -msgstr "Ziel" +msgstr "" msgid "" "Forwarded\n" @@ -6591,9 +7080,8 @@ msgid "GUID:" msgstr "GUID:" -#, fuzzy msgid "KUID:" -msgstr "GUID:" +msgstr "" msgid "Gen. queued" msgstr "" @@ -6613,44 +7101,35 @@ msgid "Generation:" msgstr "" -#, fuzzy msgid "Global DHT outgoing traffic" -msgstr "_Ausgehenden HTTP-Verkehr anzeigen" +msgstr "" -#, fuzzy msgid "Gnutella TTL settings" -msgstr "GnutellaNet-TTL-Einstellungen" +msgstr "" -#, fuzzy msgid "Gnutella _leaf traffic stats" -msgstr "_Leaf-Verkehr-Statistik" +msgstr "" -#, fuzzy msgid "Gnutella display" -msgstr "GnutellaNet-Anzeige" +msgstr "" -#, fuzzy msgid "Gnutella message size limits" -msgstr "Gnet-Paketgrößenbeschränkungen" +msgstr "" msgid "Gnutella network mode" msgstr "Gnutella Netzwerkmodus" -#, fuzzy msgid "Gnutella peers" -msgstr "Gnutella-Statistiken" +msgstr "" -#, fuzzy msgid "Gnutella timeouts (all values in seconds)" -msgstr "GnutellaNet-Timeouts (alle Werte in Sekunden)" +msgstr "" -#, fuzzy msgid "Gnutella traffic" -msgstr "GnutellaNet-Verkehr" +msgstr "" -#, fuzzy msgid "Gnutella" -msgstr "_GnutellaNet" +msgstr "" msgid "HTTP traffic" msgstr "HTTP-Verkehr" @@ -6754,20 +7233,17 @@ msgid "Large enough uptime" msgstr "Uptime genügend groß" -#, fuzzy msgid "Last Request" -msgstr "Letzter Wechsel" +msgstr "" -#, fuzzy msgid "Last Upload" -msgstr "Uploads" +msgstr "" msgid "Last check" msgstr "Letzte Überprüfung" -#, fuzzy msgid "Last chunk size" -msgstr "Größe des ersten Blocks" +msgstr "" msgid "Last scan initiated on:" msgstr "Zuletzt gestarteter Scan:" @@ -6841,13 +7317,11 @@ msgid "Max. number of browse host results" msgstr "Max. Anzahl von Browse-Host-Ergebnissen" -#, fuzzy msgid "Max. number of passive results" -msgstr "Max. _Trefferzahl" +msgstr "" -#, fuzzy msgid "Max. number of What's New? results" -msgstr "Max. _Trefferzahl" +msgstr "" msgid "Max. simultaneous downloads per file" msgstr "Max. gleichzeitige Downloads pro Datei" @@ -6985,9 +7459,8 @@ msgid "Outgoing traffic to lea_ves" msgstr "Ausgehenden Leaf-Verkehr anzeigen" -#, fuzzy msgid "Output bandwidth average" -msgstr "Gesamte ausgehende Bandbreitenbegrenzung:" +msgstr "" msgid "PARQ development:" msgstr "PARQ-Entwicklung:" @@ -7173,13 +7646,11 @@ "Filterstatistiken für\n" "diesen Filter zurücksetzen" -#, fuzzy msgid "Restart" -msgstr "_Statistik zurücksetzen" +msgstr "" -#, fuzzy msgid "Resu_me" -msgstr "Wiederaufnehmen" +msgstr "" msgid "Resume and retry" msgstr "" @@ -7235,13 +7706,11 @@ msgid "Saved" msgstr "Gespeichert" -#, fuzzy msgid "Search Monitor" -msgstr "Suchfilter" +msgstr "" -#, fuzzy msgid "Search Stats" -msgstr "Suchen" +msgstr "" msgid "Search Term" msgstr "Suchbegriff" @@ -7261,9 +7730,8 @@ msgid "Searches" msgstr "Suchen" -#, fuzzy msgid "Select files by regex" -msgstr "Alle auf Ausdruck passende selektieren" +msgstr "" msgid "Selected property:" msgstr "" @@ -7271,37 +7739,29 @@ msgid "Server" msgstr "Server" -#, fuzzy msgid "Settings" -msgstr "Einstellungen einblenden" +msgstr "" -#, fuzzy msgid "Show Search_bar" -msgstr "_Suchleiste anzeigen" +msgstr "" -#, fuzzy msgid "Show Status_bar" -msgstr "_Statusleiste anzeigen" +msgstr "" -#, fuzzy msgid "Show _Connections" -msgstr "_Verbindungen anzeigen" +msgstr "" -#, fuzzy msgid "Show _Downloads" -msgstr "_Downloads anzeigen" +msgstr "" -#, fuzzy msgid "Show _Menubar" -msgstr "Seite_nleiste anzeigen" +msgstr "" -#, fuzzy msgid "Show _Sidebar" -msgstr "Seite_nleiste anzeigen" +msgstr "" -#, fuzzy msgid "Show _Uploads" -msgstr "_Uploads anzeigen" +msgstr "" msgid "Show _bytes" msgstr "_Bytes anzeigen" @@ -7309,17 +7769,14 @@ msgid "Show _confirmation dialog when leaving gtk-gnutella" msgstr "Beim Beenden von gtk-gnutella Bestätigungsdialog anzeigen" -#, fuzzy msgid "Show _inbound Gnutella traffic" -msgstr "GnutellaNet-Verkehr" +msgstr "" -#, fuzzy msgid "Show _inbound HTTP traffic" -msgstr "e_ingehenden Gnutella-Verkehr anzeigen" +msgstr "" -#, fuzzy msgid "Show _inbound leaf traffic" -msgstr "e_ingehenden Gnutella-Verkehr anzeigen" +msgstr "" msgid "Show _last" msgstr "Zeige die _letzten" @@ -7327,17 +7784,14 @@ msgid "Show _metric units" msgstr "Metrische Einheiten anzeigen" -#, fuzzy msgid "Show _outbound Gnutella traffic" -msgstr "GnutellaNet-Verkehr" +msgstr "" -#, fuzzy msgid "Show _outbound HTTP traffic" -msgstr "_ausgehenden Gnutella-Verkehr anzeigen" +msgstr "" -#, fuzzy msgid "Show _outbound leaf traffic" -msgstr "_ausgehenden Gnutella-Verkehr anzeigen" +msgstr "" msgid "Show _percentages" msgstr "_Prozentuale Anteile anzeigen" @@ -7350,13 +7804,11 @@ "Zusätzliche Informationen und Einstellungen für _Fortgeschrittene/Experten " "anzeigen." -#, fuzzy msgid "Show inbound DHT traffic" -msgstr "e_ingehenden Gnutella-Verkehr anzeigen" +msgstr "" -#, fuzzy msgid "Show outbound DHT traffic" -msgstr "_ausgehenden Gnutella-Verkehr anzeigen" +msgstr "" msgid "Show pr_otocol:" msgstr "Zeige Pr_otokoll:" @@ -7409,9 +7861,8 @@ msgid "Start now" msgstr "Jetzt starten" -#, fuzzy msgid "Statistics" -msgstr "Statistiken" +msgstr "" msgid "Statistics:" msgstr "Statistiken" @@ -7543,9 +7994,8 @@ msgid "Update search results pane every" msgstr "Suchergebnisanzeige aktualisieren alle" -#, fuzzy msgid "Upload History" -msgstr "Upload-Historie" +msgstr "" msgid "Uploaded:" msgstr "Hochgeladen:" @@ -7665,9 +8115,8 @@ msgid "_Browse" msgstr "" -#, fuzzy msgid "_Cancel" -msgstr "Abbrechen" +msgstr "" msgid "_Compute upload connection speed" msgstr "Ermittle Upload-Bandbreite" @@ -7684,9 +8133,8 @@ msgid "_Download selected" msgstr "Ausgewählte her_unterladen" -#, fuzzy msgid "_Duplicate" -msgstr "Paketduplikat" +msgstr "" msgid "_Edit filters" msgstr "_Filter editieren" @@ -7706,9 +8154,8 @@ msgid "_Gnutella RX buffer:" msgstr "_Gnutella-Empfangspuffer: " -#, fuzzy msgid "_Gnutella traffic stats" -msgstr "Gnutella-Verkehr" +msgstr "" msgid "_HTTP traffic stats" msgstr "HTTP-Verkehr" @@ -7764,9 +8211,8 @@ msgid "_Reset stats" msgstr "_Statistik zurücksetzen" -#, fuzzy msgid "_Restart" -msgstr "_Statistik zurücksetzen" +msgstr "" msgid "_Stop" msgstr "" @@ -7792,9 +8238,8 @@ msgid "and lasted" msgstr "und dauerte" -#, fuzzy msgid "auto-hide DHT traffic stats" -msgstr "Leaf-Verkehr _automatisch ausblenden" +msgstr "" msgid "bytes" msgstr "Bytes" @@ -7834,9 +8279,8 @@ msgid "gtk-gnutella shutdown" msgstr "" -#, fuzzy msgid "gtk-gnutella" -msgstr "Über gtk-gnutella" +msgstr "" msgid "gtk-gnutella: Quit?" msgstr "gtk-gnutella: Beenden?" @@ -7856,9 +8300,8 @@ msgid "invert condition" msgstr "Bedingung invertieren" -#, fuzzy msgid "invert" -msgstr "Rückgängig" +msgstr "" msgid "items" msgstr "" @@ -7893,9 +8336,8 @@ msgid "set" msgstr "" -#, fuzzy msgid "unavailable" -msgstr "Nicht verfügbar" +msgstr "" msgid "undefined" msgstr "undefiniert" @@ -7906,13 +8348,11 @@ msgid "uploads" msgstr "Uploads" -#, fuzzy msgid "Available HTTP input bandwidth" -msgstr "Verfügbare Bandbreite" +msgstr "" -#, fuzzy msgid "Available HTTP output bandwidth" -msgstr "Verfügbare Bandbreite" +msgstr "" msgid "DHT up, passive mode." msgstr "" @@ -7926,21 +8366,17 @@ msgid "DHT looking up own KUID." msgstr "" -#, fuzzy msgid "DHT seeded." -msgstr "TX-Geschw." +msgstr "" -#, fuzzy msgid "DHT inactive." -msgstr "%u aktiv" +msgstr "" -#, fuzzy msgid "Disabled stealing of outgoing HTTP bandwidth." -msgstr "Bandbreite für ausgehenden HTTP-Verkehr anzeigen" +msgstr "" -#, fuzzy -msgid "Splitting ougoing HTTP bandwidth evenly." -msgstr "Mittlere Bandbreite für ausgehenden HTTP-Verkehr anzeigen" +msgid "Splitting outgoing HTTP bandwidth evenly." +msgstr "" msgid "Capping HTTP outgoing bandwidth." msgstr "" @@ -7948,27 +8384,26 @@ msgid "Port mapping possible through UPnP or NAT-PMP." msgstr "" -msgid "Port mapping configured through UPnP or NAT-PMP." +msgid "Port mapping configured through NAT-PMP." +msgstr "" + +msgid "Port mapping configured through UPnP." msgstr "" -#, fuzzy msgid "Enable UPnP" -msgstr "_UDP aktivieren" +msgstr "" -#, fuzzy msgid "Enable NAT-PMP" -msgstr "_UDP aktivieren" +msgstr "" msgid "Enable HTTP request pipelining" msgstr "" -#, fuzzy msgid "Pipelining max chunk size" -msgstr "Mindestblockgröße" +msgstr "" -#, fuzzy -msgid "Enable upload of patial files deemed rare" -msgstr "Erlaube das Hochladen von noch unvollständigen Dateien" +msgid "Enable upload of partial files deemed rare" +msgstr "" msgid "Enable GUESS (additional querying)" msgstr "" @@ -7976,17 +8411,14 @@ msgid "Issue GUESS queries as well" msgstr "" -#, fuzzy msgid "Bandwidth limits for GUESS queries" -msgstr "Bandbreitenkontrolle für Gnet-Verkehr" +msgstr "" -#, fuzzy msgid "Output bandwidth hint" -msgstr "Gesamte ausgehende Bandbreitenbegrenzung:" +msgstr "" -#, fuzzy msgid "Download queue is frozen." -msgstr "Download-Queue ist eingefroren" +msgstr "" msgid "Allow TTH discovery" msgstr "" @@ -7997,36 +8429,29 @@ msgid "Answer to queries for partial files" msgstr "" -#, fuzzy msgid "Answer to what's-new? queries" -msgstr "Generierte Anfragen" +msgstr "" -#, fuzzy msgid "Search Media Type" -msgstr "Suchbegriff" +msgstr "" msgid "Audio" msgstr "" -#, fuzzy msgid "Video" -msgstr "_Anzeigen" +msgstr "" -#, fuzzy msgid "Document" -msgstr "Anzahl" +msgstr "" -#, fuzzy msgid "Image" -msgstr "Bereich" +msgstr "" -#, fuzzy msgid "Archive" -msgstr "Aktiv" +msgstr "" -#, fuzzy msgid "Search Configuration" -msgstr "Suchfilter" +msgstr "" msgid "Stop search when last download completes" msgstr "" @@ -8037,9 +8462,8 @@ msgid "What's new?" msgstr "" -#, fuzzy msgid "Unspecified" -msgstr "undefiniert" +msgstr "" msgid "Search filters to apply locally on newly created searches." msgstr "" @@ -8047,12 +8471,14 @@ msgid "Discard results bearing an alien IP address" msgstr "" +msgid "Discard results bearing a banned GUID" +msgstr "" + msgid "Restart session-only searches with pending downloads" msgstr "" -#, fuzzy msgid "Configured DHT mode" -msgstr "Eingestellter Peer-Modus" +msgstr "" msgid "Store DHT keys/values in memory" msgstr "" @@ -8063,8 +8489,23 @@ msgid "Relayed queries remembered" msgstr "" -msgid "Not in database" -msgstr "Nicht in Datenbank" +msgid "Allow unused Gnutella outgoing bandwidth to supersede hint" +msgstr "" + +msgid "Display GUESS statistics" +msgstr "" + +msgid "Mapping lease time" +msgstr "" + +msgid "G2 hubs" +msgstr "" + +msgid "Enable the G2 network" +msgstr "" + +msgid " G2, " +msgstr "" msgid "owned" msgstr "Status" @@ -8087,9 +8528,6 @@ msgstr0 "%u Treffer verworfen" msgstr1 "%u Treffer verworfen" -msgid "Query queued..." -msgstr "In Warteschlange gestellt" - #, c-format msgid "%u term counted" msgid_plural "%u terms counted" @@ -8119,21 +8557,20 @@ msgid "_Close" msgstr "_Schließen" -#, fuzzy msgid "Show _Statusbar" -msgstr "_Statusleiste anzeigen" +msgstr "" -#, fuzzy msgid "Show _Peers" -msgstr "Seite_nleiste anzeigen" +msgstr "" -#, fuzzy msgid "Gnutella _traffic stats" -msgstr "Gnutella-Verkehr" +msgstr "" -#, fuzzy msgid "_Auto-hide leaf traffic stats" -msgstr "Leaf-Verkehr _automatisch ausblenden" +msgstr "" + +msgid "Glossary" +msgstr "" msgid "_Search" msgstr "_Suchen" @@ -8144,13 +8581,8 @@ msgid "Do not specify any media type (will match any kind of files remotely)" msgstr "" -#, fuzzy msgid "CPU overloaded" -msgstr "Hochgeladen" - -#, fuzzy -msgid "Splitting outgoing HTTP bandwidth evenly." -msgstr "Mittlere Bandbreite für ausgehenden HTTP-Verkehr anzeigen" +msgstr "" msgid "Connect to" msgstr "Verbinden mit" @@ -8197,12 +8629,18 @@ msgid "Served " msgstr "" -msgid "BH HTML served" +msgid "G2 served" msgstr "" msgid " / " msgstr "" +msgid "G2" +msgstr "" + +msgid "BH HTML served" +msgstr "" + msgid "BH HTML" msgstr "" @@ -8283,41 +8721,29 @@ msgid "unit_of_time|s" msgstr "" -#, fuzzy msgid "Gnutella Distributed Hash Table" -msgstr "Bandbreitenkontrolle für Gnet-Verkehr" +msgstr "" msgid "Maximum percentage of connection slots a vendor can occupy." msgstr "Max. Prozentsatz, den ein Client-Typ einnehmen kann." -#, fuzzy -msgid "Global DHT ougoing traffic" -msgstr "_Ausgehenden HTTP-Verkehr anzeigen" - msgid "attempts" msgstr "Versuche" -#, fuzzy msgid "Pipelining maximum chunk size" -msgstr "Mindestblockgröße" +msgstr "" msgid "_Remove directory" msgstr "Verzeichnis _entfernen" -#, fuzzy -msgid "Enable upload of partial files deemed rare" -msgstr "Erlaube das Hochladen von noch unvollständigen Dateien" - msgid "Minimum chunk _size" msgstr "M_inimale Stückgröße" -#, fuzzy msgid "Show a status _icon" -msgstr "Zeige G_ründe für" +msgstr "" -#, fuzzy msgid "Avg. downtime of this servent" -msgstr "Durchschnittliche Laufzeit dieses Servents:" +msgstr "" msgid "Remove completed downloads from list" msgstr "Fertige Downloads von Liste entfernen" @@ -8356,6 +8782,9 @@ msgid "Reverse lookup in progress..." msgstr "" +msgid "UDP (semi-reliable)" +msgstr "" + msgid "Size:" msgstr "Größe:" @@ -8380,12 +8809,17 @@ msgid "Valid IPv6 ultra" msgstr "" +msgid "Fresh G2 hub" +msgstr "" + +msgid "Valid G2 hub" +msgstr "" + msgid "Unstable" msgstr "Instabil" -#, fuzzy msgid "Alien" -msgstr "Aliase" +msgstr "" msgid "GUESS (IPv4 running)" msgstr "" @@ -8419,6 +8853,11 @@ "sourceforge.net/?page=faq\">FAQ online</a> instead.</p></body></html>" msgstr "" +msgid "" +"<html><head><title>Glossary</title></head><body><p>The glossary document " +"could not be loaded.</p></body></html>" +msgstr "" + #, c-format msgid "%lu file shared (%s)" msgid_plural "%lu files shared (%s)" @@ -8434,9 +8873,8 @@ msgid "Welcome sent" msgstr "Willkommen gesendet" -#, fuzzy msgid "No UDP traffic yet" -msgstr "HTTP-Verkehr" +msgstr "" #, c-format msgid "Closing: %s Stop in %us RX=%u Q=%u,%u%%" @@ -8451,6 +8889,9 @@ msgid "UNKNOWN STATUS" msgstr "" +msgid "g2" +msgstr "" + msgid "busy" msgstr "beschäftigt" @@ -8466,9 +8907,8 @@ msgid "bogus" msgstr "" -#, fuzzy msgid "alien" -msgstr "Aliase" +msgstr "" msgid "media" msgstr "" @@ -8480,9 +8920,8 @@ msgid "Flushing queue (%u results pending)" msgstr "" -#, fuzzy msgid "The search has been stopped" -msgstr "Der Download konnte nicht gestartet werden" +msgstr "" msgid "Passive search" msgstr "Passive Suche" @@ -8495,6 +8934,12 @@ msgstr "" #, c-format +msgid " %u download" +msgid_plural " %u downloads" +msgstr0 "" +msgstr1 "" + +#, c-format msgid "" "%u %s (%u skipped, %u ignored, %u hidden, %u auto-d/l, %u %s) Hits: %u (%u " "TCP, %u UDP)" @@ -8512,6 +8957,63 @@ msgstr0 "" msgstr1 "" +msgid "No GUESS queries run yet" +msgstr "" + +#, c-format +msgid " previous took %s querying %zu %s with %zu %s kept" +msgstr "" + +msgid "host" +msgid_plural "hosts" +msgstr0 "" +msgstr1 "" + +msgid "hit" +msgid_plural "hits" +msgstr0 "" +msgstr1 "" + +#, c-format +msgid "GUESS %s Total: %zu %s (%s %s, %s kept, %s queries, %s keys)%s" +msgstr "" + +msgid "idle" +msgstr "" + +msgid "query" +msgid_plural "queries" +msgstr0 "" +msgstr1 "" + +#, c-format +msgid "" +"GUESS %s %s (%zu %s, %zu kept, %s queries, %s keys) Pool: %zu %s, (%zu+" +"%zu)/%zu queried, %zu %s (%.2f%%), %zu reached, %zu pending, %zu %s%s%s" +msgstr "" + +msgid "loose" +msgstr "" + +msgid "bounded" +msgstr "" + +msgid "ack" +msgid_plural "acks" +msgstr0 "" +msgstr1 "" + +msgid "hop" +msgid_plural "hops" +msgstr0 "" +msgstr1 "" + +msgid " (load pending)" +msgstr "" + +msgid " (end if starving)" +msgstr "" + msgid "Passive" msgstr "Passiv" @@ -8525,13 +9027,11 @@ "konvertiert und die alte Datei umbenannt in\n" "%s" -#, fuzzy, c-format +#, c-format msgid "" "could not rename %s as %s: %m\n" "The XML file will not be used unless this problem is resolved." msgstr "" -"konnte Datei %s nicht in %s umbenennen: %s\n" -"Die XML-Datei wird bis zur Behebung des Problems nicht benutzt." msgid "<unparsed>" msgstr "<ignoriert>" @@ -8558,13 +9058,11 @@ msgid "Ignored unusable magnet link." msgstr "Unbrauchbarer Magnet-link wurde ignoriert." -#, fuzzy msgid "Created download from URL." -msgstr "%u Download gestartet" +msgstr "" -#, fuzzy msgid "Ignored unusable URL." -msgstr "Unbrauchbarer Magnet-link wurde ignoriert." +msgstr "" msgid "The given urn type is not supported." msgstr "Der gegebene URN-Typ ist nicht unterstützt." @@ -8613,9 +9111,8 @@ msgid "No" msgstr "Nein" -#, fuzzy msgid "Tag" -msgstr "Ziel" +msgstr "" msgid "Yes" msgstr "Ja" @@ -8626,16 +9123,24 @@ msgid "Source" msgstr "Quelle" -#, fuzzy msgid "Alien IP" -msgstr "Aliase" +msgstr "" msgid "Alt-Locs" msgstr "" -#, fuzzy msgid "Partial" -msgstr "unvollständig" +msgstr "" + +#, c-format +msgid "%s %.2f%%" +msgstr "" + +msgid "Available" +msgstr "" + +msgid "Last modification" +msgstr "" msgid "Latinized" msgstr "" @@ -8646,13 +9151,15 @@ msgid "File URL" msgstr "File-URL" -#, fuzzy msgid "Host information" -msgstr "Detailinformation" +msgstr "" msgid "Hostname" msgstr "Hostname" +msgid "banned" +msgstr "" + msgid "Servent ID" msgstr "Servent-ID" @@ -8668,9 +9175,8 @@ msgid "Push-proxies" msgstr "" -#, fuzzy msgid "Packet information" -msgstr "Detailinformation" +msgstr "" msgid "Route" msgstr "Route" @@ -8687,9 +9193,8 @@ msgid "N2R URI" msgstr "N2R-URI" -#, fuzzy msgid "Push URL" -msgstr "Push" +msgstr "" msgid "Classic URL" msgstr "Klassische URL" @@ -8712,25 +9217,12 @@ msgid "The URN in the search text is invalid." msgstr "" -msgid "SHA-1 is unknown." -msgstr "" - -msgid "No Bitzi ticket requested yet." -msgstr "" - -#, fuzzy -msgid "Not in Bitzi database." -msgstr "Nicht in Datenbank" - msgid "Encoding" msgstr "" msgid "#" msgstr "" -msgid "Metadata" -msgstr "Meta-Daten" - msgid "Never" msgstr "Nie" @@ -8763,6 +9255,12 @@ msgid "*** CPU OVERLOADED -- TRYING TO SAVE CYCLES ***" msgstr "" +msgid "*** KERNEL BUFFER SHORTAGE -- LIMITING TCP CONNECTIONS ***" +msgstr "" + +msgid "*** NO LISTENING TCP SOCKET -- NO INBOUND CONNECTIONS ***" +msgstr "" + msgid "*** UPLOADS STALLING, BANDWIDTH SHORTAGE? ***" msgstr "" @@ -8803,12 +9301,6 @@ msgstr "%u in Warteschlange" #, c-format -msgid "%u/%u connection" -msgid_plural "%u/%u connections" -msgstr0 "%u/%u Verbindung" -msgstr1 "%u/%u Verbindungen" - -#, c-format msgid "%u/%u upload" msgid_plural "%u/%u uploads" msgstr0 "%u/%u Upload" @@ -8823,6 +9315,9 @@ msgid "Queue frozen" msgstr "" +msgid "Internal" +msgstr "" + msgid "Select a property to see its description." msgstr "" @@ -8887,29 +9382,3 @@ msgid "Sent QUEUE, waiting for headers..." msgstr "QUEUE gesendet, warte auf Kopfzeilen..." - -#, fuzzy -#~ msgid "Linux archives" -#~ msgstr "%u aktiv" - -#~ msgid "Index" -#~ msgstr "Index" - -#, fuzzy -#~ msgid "Seaerch Media Type" -#~ msgstr "Suchbegriff" - -#~ msgid "Can't reach host (Push or Direct)" -#~ msgstr "Host nicht erreichbar (Push oder direkt)" - -#~ msgid "Banned: %s" -#~ msgstr "Verbannt: %s" - -#~ msgid "Banned for %s" -#~ msgstr "Verbannt wegen %s" - -#~ msgid "ShareMonkey URL" -#~ msgstr "ShareMonkey-URL" - -#~ msgid "Connecting" -#~ msgstr "Verbinde"
View file
gtk-gnutella-0.98.2.tar.bz2/po/el.po -> gtk-gnutella-1.1.9.tar.bz2/po/el.po
Changed
@@ -1,33 +1,32 @@ -# $Id$ -# -# Greek translations for gtk-gnutella package. -# Copyright (C) 2000-2001 Yann Grossel. -# Copyright (C) 2001-2010 Raphaël Manfredi. -# This file is distributed under the same license as the gtk-gnutella package. -# Bouklis Panos <panos@echidna-band.com>, 2005. +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Raphael Manfredi +# This file is distributed under the same license as the PACKAGE package. # +# Translators: +# Panos Bouklis <panos@echidna-band.com>, 2005 msgid "" msgstr "" -"Project-Id-Version: gtk-gnutella 0.96.7u\n" +"Project-Id-Version: gtk-gnutella\n" "Report-Msgid-Bugs-To: gtk-gnutella-devel@lists.sf.net\n" -"POT-Creation-Date: 2011-11-22 18:27+0100\n" -"PO-Revision-Date: 2005-11-16 18:07+0900\n" -"Last-Translator: Bouklis Panos <panos@echidna-band.com>\n" -"Language-Team: Greek <i18ngr@lists.hellug.gr>\n" +"POT-Creation-Date: 2016-03-06 08:49+0100\n" +"PO-Revision-Date: 2016-02-15 08:28+0000\n" +"Last-Translator: Jeroen Asselman <jeroen@asselman.com>\n" +"Language-Team: Greek (http://www.transifex.com/gtk-gnutella/gtk-gnutella/" +"language/el/)\n" +"Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: el\n" -"Plural-Forms: nplurals=2; plural=(1 != n);\n" -"X-Generator: KBabel 1.10.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" -#, c-format -msgid "%s%s%s%s%s fps, %s kbps" +msgid "Harmful version banned, upgrade required" msgstr "" -#, fuzzy -msgid "times|x" -msgstr "Χρόνος λειτουργίας" +msgid "Connection refused" +msgstr "" + +msgid "Use an open Gnutella or G2 servent" +msgstr "" #, c-format msgid "Stopped, will retry with TLS (%s)" @@ -41,20 +40,17 @@ msgid "Too many attempts (%u times)" msgstr "Πάρα πολλές προσπάθειες (%u φορές)" -#, fuzzy msgid "Requeued due to no push-proxy" -msgstr "Ξαναμπήκε στη λίστα αναμονής λόγω λήξης χρόνου" +msgstr "" -#, fuzzy msgid "Requeued due to file removal" -msgstr "Ξαναμπήκε στη λίστα αναμονής λόγω λήξης χρόνου" +msgstr "" msgid "Requeued by file info change" msgstr "Ξαναμπήκε στη λίστα αναμονής λόγω αλλαγής πληροφοριών αρχείου" -#, fuzzy msgid "Duplicate download" -msgstr "%u/%u λήψη" +msgstr "" msgid "Nothing else to switch to" msgstr "" @@ -63,20 +59,19 @@ msgid "Switching (after error) to \"%s\"" msgstr "" -#, fuzzy, c-format -msgid " at %s - rescheduled for %s%s #%u" -msgstr " στις %s - επαναπρογραμματίστηκε για %s" +#, c-format +msgid " at %s" +msgstr "" msgid "Suspended (SHA1 checking)" msgstr "Αναβλήθηκε (Έλεγχος SHA1)" -#, fuzzy, c-format +#, c-format msgid "Ignoring requested (%s)" -msgstr "Αποστολή αιτήματος (%u%%)" +msgstr "" -#, fuzzy msgid "Paused" -msgstr "Παθητικός" +msgstr "" msgid "Nothing more to get" msgstr "" @@ -87,9 +82,11 @@ msgid "No more gaps to fill" msgstr "" -#, fuzzy msgid "Download queue is frozen" -msgstr "Η λίστα αναμονής πάγωσε" +msgstr "" + +msgid "Network buffer shortage" +msgstr "" msgid "No download slot (start)" msgstr "Δεν υπάρχει υποδοχή λήψης (έναρξη)" @@ -100,16 +97,17 @@ msgid "Connection failed" msgstr "Η σύνδεση απέτυχε" +msgid "SHA1 mismatch detected" +msgstr "Εντοπίστηκαν αταίριαστα SHA1" + msgid "Waiting for server PROX publishing" msgstr "" -#, fuzzy msgid "Waiting for push route" -msgstr "Αναμονή περαιτέρω αιτήματος..." +msgstr "" -#, fuzzy msgid "Push route lost" -msgstr "Απώλεια δρομολόγησης" +msgstr "" msgid "Ignoring Push flag" msgstr "Παράβλεψη σημαίας Ώθησης" @@ -135,21 +133,17 @@ msgid "Dup SHA1 during creation" msgstr "" -#, fuzzy msgid "Max. number of downloads reached" -msgstr "Μέγιστος _αριθμός αποτελεσμάτων" +msgstr "" -#, fuzzy msgid "Max. number of downloads for this host reached" -msgstr "Μέγιστος _αριθμός αποτελεσμάτων" +msgstr "" -#, fuzzy msgid "Has already enough active sources" -msgstr "Ανενεργές πηγές" +msgstr "" -#, fuzzy msgid "download_start() failed" -msgstr "Λήψη επιλεγμένων αρχείων" +msgstr "" msgid "Stopped (Index changed)" msgstr "Διακόπηκε (Το ευρετήριο άλλαξε)" @@ -157,9 +151,8 @@ msgid "Explicitly requeued" msgstr "Ξαναμπήκε κατηγορηματικά στη λίστα αναμονής" -#, fuzzy msgid "Failed (Header line too large)" -msgstr "Απέτυχε (Η γραμμή κεφαλίδας είναι πολύ μεγάλη)" +msgstr "" #, c-format msgid "Failed (%s)" @@ -174,20 +167,20 @@ msgid "Stopped (EOF) <err_header_read_eof>" msgstr "" -#, fuzzy, c-format +#, c-format msgid "Can't check resume data: %s" -msgstr "Δεν είναι δυνατή η αποθήκευση δεδομένων: %s" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Can't stat opened file: %s" -msgstr "Δεν είναι δυνατή η αποθήκευση δεδομένων: %s" +msgstr "" msgid "Stopped (Output file size changed)" msgstr "Διακόπηκε (Το μέγεθος του αρχείου εξόδου άλλαξε)" -#, fuzzy, c-format +#, c-format msgid "Can't read resume data: %s" -msgstr "Δεν είναι δυνατή η αποθήκευση δεδομένων: %s" +msgstr "" msgid "Short read on resume data" msgstr "" @@ -216,21 +209,17 @@ msgid "Requeued by competing download" msgstr "Ξαναμπήκε στην λίστα αναμονής από ανταγωνιστική λήψη" -#, fuzzy msgid "Weird HTTP status" -msgstr "Παράξενη κατάσταση HTTP (ασυγχρονία πρωτοκόλλου;)" +msgstr "" -#, fuzzy msgid "Download was a duplicate" -msgstr "_Λήψη επιλεγμένων" +msgstr "" -#, fuzzy msgid "Filesize mismatch" -msgstr "Αταίριαστες πληροφορίες αρχείου URN" +msgstr "" -#, fuzzy msgid "No URN on server (required)" -msgstr "Δεν υπάρχει URN στο εξυπηρετητή για έγκριση" +msgstr "" msgid "No URN on server, waiting for overlap" msgstr "Δεν υπάρχει URN στον εξυπηρετητή, αναμονή για επικάλυψη" @@ -238,13 +227,11 @@ msgid "No URN on server to validate" msgstr "Δεν υπάρχει URN στο εξυπηρετητή για έγκριση" -#, fuzzy msgid "TTH mismatch detected" -msgstr "Εντοπίστηκαν αταίριαστα SHA1" +msgstr "" -#, fuzzy msgid "SHA-1 mismatch detected" -msgstr "Εντοπίστηκαν αταίριαστα SHA1" +msgstr "" msgid "URN fileinfo mismatch" msgstr "Αταίριαστες πληροφορίες αρχείου URN" @@ -255,30 +242,30 @@ msgid "More data to sink than expected" msgstr "" -#, fuzzy msgid "Stopped data (EOF)" -msgstr "Διακόπηκε (%s)" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Stopped data (%s)" -msgstr "Διακόπηκε (%s)" +msgstr "" #, c-format msgid "Failed (Read error: %s)" msgstr "Απέτυχε (Σφάλμα ανάγνωσης: %s)" -#, fuzzy msgid "Timeout reading HTTP status" -msgstr "Δεν είναι η αποστολή ολόκληρης της κατάστασης HTTP" +msgstr "" -#, fuzzy msgid "Timeout reading headers" -msgstr "Ανάγνωση κεφαλίδων" +msgstr "" #, c-format msgid "No support for Content-Encoding (%s)" msgstr "" +msgid "Incomplete headers during TLS upgrade" +msgstr "" + msgid "Spammer detected" msgstr "" @@ -319,17 +306,14 @@ msgid "Total/served sizes mismatch" msgstr "" -#, fuzzy msgid "Range start mismatch" -msgstr "Επανεκκίνηση αναζήτησης" +msgstr "" -#, fuzzy msgid "Range end too large" -msgstr "Πάρα πολύ μεγάλο" +msgstr "" -#, fuzzy msgid "Range mismatch" -msgstr "Αταίριαστες πληροφορίες αρχείου URN" +msgstr "" msgid "Weird server-side chunk shrinking" msgstr "" @@ -340,49 +324,47 @@ msgid "No Content-Length header" msgstr "" -#, fuzzy +msgid "Unexpected Content-Type" +msgstr "" + +msgid "No Content-Type" +msgstr "" + msgid "Search already closed" -msgstr "Προστέθηκε αναζήτηση" +msgstr "" -#, fuzzy msgid "THEX download aborted" -msgstr "Λήφθηκαν:" +msgstr "" msgid "Pipeline flow stopped" msgstr "" -#, fuzzy, c-format +#, c-format msgid "Cannot open %s: %s" -msgstr "Απέτυχε (Δεν είναι δυνατή η αποστολή %s: %s)" +msgstr "" msgid "Cannot resume: file gone" msgstr "" -#, fuzzy, c-format +#, c-format msgid "Cannot write into file: %s" -msgstr "Η εγγραφή απέτυχε: %s" +msgstr "" msgid "Stopped (Read buffer full)" msgstr "Διακόπηκε (Ενδιάμεση μνήμη ανάγνωσης πλήρης)" -#, fuzzy msgid "Failed (Completed?)" -msgstr "Ολοκληρώθηκε" +msgstr "" -#, fuzzy msgid "Could not send whole HTTP request" -msgstr "Δεν είναι η αποστολή ολόκληρης της κατάστασης HTTP" +msgstr "" #, c-format msgid "Write failed: %s" msgstr "Η εγγραφή απέτυχε: %s" -#, fuzzy msgid "Malformed push reply" -msgstr "Παραμορφωμένο χτύπημα ερωτήματος" - -msgid "SHA1 mismatch detected" -msgstr "Εντοπίστηκαν αταίριαστα SHA1" +msgstr "" msgid ", inbound" msgstr "" @@ -390,40 +372,44 @@ msgid ", outbound" msgstr "" -#, fuzzy +msgid ", no-pipeline" +msgstr "" + msgid ", banning" -msgstr "Απαγορεύσεις" +msgstr "" -#, fuzzy msgid ", g2" -msgstr ", " +msgstr "" + +msgid ", fake-g2" +msgstr "" -#, fuzzy msgid ", vendor?" -msgstr "Κατασκευαστής:" +msgstr "" + +#, c-format +msgid "<Browse G2 Host %s>" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "<Browse Host %s>" -msgstr "Εξερεύνηση Υπολογιστή" +msgstr "" #, c-format msgid "<THEX data for %s>" msgstr "" -#, fuzzy msgid "Browse search closed" -msgstr "Εμφάνιση λίστας αναζητήσεων" +msgstr "" -#, fuzzy msgid "Stopped data (EOF) <download_got_eof>" -msgstr "Παύση δεδομένων (EOF)" +msgstr "" msgid "No longer connected" msgstr "Όχι συνδεδεμένο πια" -#, fuzzy msgid "Too many data timeouts" -msgstr "Πάρα πολλές προσπάθειες (%u φορές)" +msgstr "" msgid "Timeout" msgstr "Τέλος χρόνου" @@ -431,31 +417,33 @@ msgid "Requeued due to timeout" msgstr "Ξαναμπήκε στη λίστα αναμονής λόγω λήξης χρόνου" -#, fuzzy, c-format +msgid "Partial file removed" +msgstr "" + +msgid "File info being reset" +msgstr "" + +#, c-format msgid "Downloading (TR: %s)" -msgstr "Λήψη (%s) TR: %s" +msgstr "" -#, fuzzy msgid "Seeding" -msgstr "Αποστολή ώθησης" +msgstr "" -#, fuzzy msgid "Computing TTH" -msgstr "Υπολογισμός SHA1" +msgstr "" msgid "Computing SHA1" msgstr "Υπολογισμός SHA1" -#, fuzzy msgid "Waiting for TTH check" -msgstr "Αναμονή ελέγχου SHA1" +msgstr "" msgid "Waiting for SHA1 check" msgstr "Αναμονή ελέγχου SHA1" -#, fuzzy msgid "SHA1" -msgstr "SHA1:" +msgstr "" msgid "OK" msgstr "ΟΚ" @@ -463,13 +451,11 @@ msgid "failed" msgstr "απέτυχε" -#, fuzzy msgid "not computed yet" -msgstr "Χωρίς έξοδο ακόμα..." +msgstr "" -#, fuzzy msgid "Waiting for moving..." -msgstr "; Αναμονή μετακίνησης..." +msgstr "" msgid "Moving" msgstr "Μετακίνηση" @@ -480,20 +466,18 @@ msgid "No sources" msgstr "Χωρίς πηγές" -#, fuzzy, c-format +#, c-format msgid "Queued (%u active, %u passive)" -msgstr "Μπήκε στη λίστα αναμονής (%d ενεργές, %d παθητικές)" +msgstr "" msgid "Waiting" msgstr "Αναμονή" -#, fuzzy msgid "Querying DHT" -msgstr "Χτύπημα ερωτήματος" +msgstr "" -#, fuzzy msgid "Pending DHT query" -msgstr "Τοπικά ερωτήματα που αναμένουν" +msgstr "" #, c-format msgid "%u/%u successful DHT lookup" @@ -507,161 +491,20 @@ msgstr0 "" msgstr1 "" -#, fuzzy, c-format +#, c-format msgid "Got %d host from %s" msgid_plural "Got %d hosts from %s" msgstr0 "" -"Ελήφθη %d υπολογιστής από την λανθάνουσα μνήμη UDP υπολογιστών %s:%u" msgstr1 "" -"Ελήφθη %d υπολογιστές από την λανθάνουσα μνήμη UDP υπολογιστών %s:%u" #, c-format -msgid "Bootstrapping from %s" +msgid "Connecting to web cache %s" msgstr "" -msgid "Bad size" -msgstr "Κακό μέγεθος" - -msgid "Too small" -msgstr "Πολύ μικρό" - -msgid "Too large" -msgstr "Πολύ μεγάλο" - -msgid "Way too large" -msgstr "Πάρα πολύ μεγάλο" - -msgid "Unknown message type" -msgstr "Άγνωστος τύπος μηνύματος" - -msgid "Unexpected message" -msgstr "Απρόβλεπτο μήνυμα" - -msgid "Message sent with TTL = 0" -msgstr "Το μήνυμα στάλθηκε με TTL = 0" - -msgid "Improper hops/ttl combination" -msgstr "" - -msgid "Max TTL exceeded" -msgstr "Υπέρβαση μέγιστου TTL" - -msgid "Message throttle" -msgstr "Περιορισμός μηνυμάτων" - -#, fuzzy -msgid "Message matched limits" -msgstr "Όρια μεγέθους μηνυμάτων GnutellaNet" - -msgid "Unusable Pong" -msgstr "" - -msgid "Hard TTL limit reached" -msgstr "Όριο σκληρού TTL" - -msgid "Max hop count reached" -msgstr "" - -msgid "Route lost" -msgstr "Απώλεια δρομολόγησης" - -msgid "No route" -msgstr "Χωρίς δρομολόγηση" - -msgid "Duplicate message" -msgstr "Ανατύπωση μηνύματος" - -msgid "Message to banned GUID" -msgstr "Μήνυμα σε απαγορευμένο GUID" - -#, fuzzy -msgid "Message from banned GUID" -msgstr "Μήνυμα σε απαγορευμένο GUID" - -msgid "Node shutting down" -msgstr "Ο κόμβος κλείνει" - -msgid "TX flow control" -msgstr "Έλεγχος ροής TX" - -msgid "Query text had no trailing NUL" -msgstr "" - -msgid "Query text too short" -msgstr "Το κείμενο ερωτήματος είναι πολύ μικρό" - -msgid "Query had unnecessary overhead" -msgstr "Το ερώτημα επιβαρύνθηκε χωρίς να χρειάζεται" - -msgid "Query had bad URN" -msgstr "" - -msgid "Message with malformed SHA1" -msgstr "Μήνυμα με παραμορφωμένο SHA1" - -msgid "Message with malformed UTF-8" -msgstr "Μήνυμα με παραμορφωμένο UTF-8" - -msgid "Malformed Query Hit" -msgstr "Παραμορφωμένο χτύπημα ερωτήματος" - -msgid "Bad return address" -msgstr "Κακή διεύθυνση επιστροφής" - -msgid "Hostile IP address" -msgstr "Εχθρική διεύθυνση IP" - -msgid "Bogus result from Morpheus" -msgstr "" - -msgid "Spam" -msgstr "" - -#, fuzzy -msgid "Evil filename" -msgstr "Όνομα αρχείου" - -#, fuzzy -msgid "Improper media type" -msgstr "Κριτήριο αναζήτησης" - -msgid "Payload inflating error" -msgstr "" - -msgid "Unknown header flags present" -msgstr "" - -#, fuzzy -msgid "Own search results" -msgstr "Αποτελέσματα αναζήτησης" - -#, fuzzy -msgid "Own queries" -msgstr "Ερωτήματα RX" - -msgid "Ancient query format" -msgstr "" - -#, fuzzy -msgid "Blank Servent ID" -msgstr "ID πελάτη:" - -msgid "GUESS Query missing token" -msgstr "" - -msgid "GUESS Invalid query token" -msgstr "" - -msgid "DHT Invalid security token" -msgstr "" - -msgid "DHT Too many STORE requests" +#, c-format +msgid "Bootstrapping from %s" msgstr "" -#, fuzzy -msgid "DHT Malformed message" -msgstr "Παραμορφωμένη εντολή" - #, c-format msgid "Shutdown (%s)" msgstr "Κλείσιμο (%s)" @@ -672,27 +515,6 @@ msgstr0 "" msgstr1 "" -msgid "Sent crawling info" -msgstr "" - -msgid "Cannot setup compressing TX stack" -msgstr "Δεν είναι δυνατή η ρύθμιση συμπιεσμένης στοίβας TX" - -#, c-format -msgid "Got BYE %d %.*s" -msgstr "Ελήφθη ΑΝΤΙΟ %d %.*s" - -#, c-format -msgid "Weird HELLO %s" -msgstr "Παράξενος ΧΑΙΡΕΤΙΣΜΟΣ %s" - -#, c-format -msgid "HELLO %s error %d (%s)" -msgstr "ΧΑΙΡΕΤΙΣΜΟΣ %s σφάλμα %d (%s)" - -msgid "Shielded node" -msgstr "Προστατευμένος κόμβος" - msgid "Gnet connections disabled" msgstr "Οι συνδέσεις Gnet απενεργοποιήθηκαν" @@ -700,6 +522,10 @@ msgstr "Μη συμπιεσμένη σύνδεση" #, c-format +msgid "Too many G2 hubs (%u max)" +msgstr "" + +#, c-format msgid "Too many leaves (%d max)" msgstr "Πολλοί δικτυακοί (μέγιστο %d)" @@ -724,6 +550,9 @@ msgid "Not an ultra node" msgstr "Όχι υπερ-κόμβος" +msgid "Unknown error" +msgstr "Άγνωστο σφάλμα" + msgid "Unstable IP address" msgstr "Ασταθής διεύθυνση IP" @@ -737,22 +566,50 @@ msgid "Not connecting: %s" msgstr "Δεν συνδέεται: %s" +msgid "Cannot setup compressing TX stack" +msgstr "Δεν είναι δυνατή η ρύθμιση συμπιεσμένης στοίβας TX" + +msgid "Sent crawling info" +msgstr "" + +#, c-format +msgid "Got BYE %d %.*s" +msgstr "Ελήφθη ΑΝΤΙΟ %d %.*s" + +#, c-format +msgid "Weird HELLO %s" +msgstr "Παράξενος ΧΑΙΡΕΤΙΣΜΟΣ %s" + +#, c-format +msgid "HELLO %s error %d (%s)" +msgstr "ΧΑΙΡΕΤΙΣΜΟΣ %s σφάλμα %d (%s)" + +msgid "Shielded node" +msgstr "Προστατευμένος κόμβος" + msgid "Protocol not acceptable" msgstr "Μη αποδεκτό πρωτόκολλο" +msgid "Conflict" +msgstr "" + +msgid "Upgrade Header Missing" +msgstr "" + msgid "Servent Shutdown" msgstr "Κλείσιμο πελάτη" -#, fuzzy msgid "Not a network member" -msgstr "Λειτουργία δικτύου Gnutella" +msgstr "" + +msgid "Need a G2 Hub" +msgstr "" msgid "Too frequent crawling" msgstr "" -#, fuzzy msgid "Already connected to this GUID" -msgstr "Ήδη συνδεδεμένος" +msgstr "" #, c-format msgid "Vendor would exceed %d%% of our slots" @@ -797,20 +654,23 @@ msgid "Pseudo UDP node" msgstr "Κόμβος ψευδο-UDP" -#, fuzzy +msgid "Pseudo semi-reliable UDP node" +msgstr "" + +msgid "Pseudo G2 UDP node" +msgstr "" + msgid "Pseudo DHT node" -msgstr "Κόμβος ψευδο-UDP" +msgstr "" msgid "Already connected" msgstr "Ήδη συνδεδεμένος" -#, fuzzy msgid "Limited connection" -msgstr "Παραδοσιακές συνδέσεις" +msgstr "" -#, fuzzy msgid "Write error during HELLO" -msgstr "Σφάλμα εγγραφής κατά το HELLO: %s" +msgstr "" #, c-format msgid "Write error during HELLO: %s" @@ -823,9 +683,9 @@ msgid "Kicked: %s message too big (%d bytes)" msgstr "Εκδίωξη: Το μήνυμα %s είναι πολύ μεγάλο (%d bytes)" -#, fuzzy, c-format +#, c-format msgid "Kicked: %s message too big (>= 64KiB limit)" -msgstr "Εκδίωξη: Το μήνυμα %s είναι πολύ μεγάλο (%d bytes)" +msgstr "" msgid "Leaf" msgstr "Δικτυακός κόμβος" @@ -845,6 +705,9 @@ msgid "DHT" msgstr "" +msgid "G2 hub" +msgstr "" + msgid "Unknown" msgstr "Άγνωστο" @@ -859,9 +722,9 @@ msgid "Must wait %u more seconds before resending \"What's New\"" msgstr "" -#, fuzzy, c-format +#, c-format msgid "mkdir(\"%s\") failed: %m" -msgstr "Η εγγραφή απέτυχε: %s" +msgstr "" msgid "Can't find your home directory!" msgstr "Δεν είναι δυνατή η εύρεση του αρχικού καταλόγου σας!" @@ -873,32 +736,29 @@ msgid "creating configuration directory \"%s\"" msgstr "δημιουργία καταλόγου ρυθμίσεων \"%s\"" -#, fuzzy, c-format +#, c-format msgid "creating directory \"%s\" for %s" -msgstr "δημιουργία καταλόγου ρυθμίσεων \"%s\"" +msgstr "" -#, fuzzy -msgid "You seem to have left another gtk-gnutella running" -msgstr "Φαίνεται ότι τρέχει ένα άλλο gtk-gnutella\n" +#, c-format +msgid "Another gtk-gnutella supervisor is running as PID %lu" +msgstr "" + +#, c-format +msgid "Another gtk-gnutella is running as PID %lu" +msgstr "" msgid "Cannot proceed without valid configuration directory" msgstr "Δεν είναι δυνατή η συνέχεια χωρίς έναν έγκυρο κατάλογο ρυθμίσεων" -#, fuzzy msgid "Failed to create IPv4 UDP socket" -msgstr "Αποτυχία δημιουργίας αναζήτησης" +msgstr "" -#, fuzzy msgid "Failed to create IPv6 UDP socket" -msgstr "Αποτυχία δημιουργίας αναζήτησης" +msgstr "" -#, fuzzy msgid "Failed to create local socket" -msgstr "Αποτυχία δημιουργίας αναζήτησης" - -#, fuzzy -msgid "Failed to create listening sockets" -msgstr "Αποτυχία δημιουργίας αναζήτησης" +msgstr "" msgid "Can only run as a leaf when TCP-firewalled" msgstr "Τρέχει μόνο ως δικτυακός όταν έχει τοίχος προστασίας TCP" @@ -909,6 +769,12 @@ msgid "Got EOF" msgstr "" +msgid "TLS handshake failed" +msgstr "" + +msgid "Connection locally failed" +msgstr "" + msgid "Write failed (Input Exception)" msgstr "Αποτυχία εγγραφής (Εξαίρεση εισόδου)" @@ -920,17 +786,17 @@ msgid "Sent ping to UDP host cache %s:%u" msgstr "" -#, fuzzy, c-format +#, c-format msgid "Got %d host from UDP host cache %s" msgid_plural "Got %d hosts from UDP host cache %s" msgstr0 "" -"Ελήφθη %d υπολογιστής από την λανθάνουσα μνήμη UDP υπολογιστών %s:%u" msgstr1 "" -"Ελήφθη %d υπολογιστές από την λανθάνουσα μνήμη UDP υπολογιστών %s:%u" -#, fuzzy msgid "Connect back timeout" -msgstr "Τέλος χρόνου επανασύνδεσης" +msgstr "" + +msgid "Request timeout" +msgstr "" msgid "Timeout waiting for follow-up" msgstr "" @@ -938,15 +804,102 @@ msgid "Lifetime expired" msgstr "Υπέρβαση χρόνου ζωής" +msgid "Unauthorized" +msgstr "" + +#, c-format +msgid "Limiting connections from %s" +msgstr "" + +msgid "No reason given" +msgstr "" + +msgid "Bad Request" +msgstr "" + +msgid "Header too large" +msgstr "" + +msgid "Input buffer full" +msgstr "" + +msgid "Extra data after HTTP header" +msgstr "" + msgid "Unable to send GIV" msgstr "Αδυναμία αποστολής GIV" +msgid "Not Found" +msgstr "" + +msgid "File was modified" +msgstr "" + +msgid "Moved Permanently" +msgstr "" + +msgid "File index/name mismatch" +msgstr "" + +msgid "URN Not Found (urn:sha1)" +msgstr "" + +msgid "SHA1 is being recomputed" +msgstr "" + +msgid "Library being rebuilt" +msgstr "" + +msgid "Malformed URN in /uri-res/N2R request" +msgstr "" + +msgid "Malformed URN in /uri-res/N2X request" +msgstr "" + +msgid "TTH is being computed" +msgstr "" + msgid "<Browse Host Request>" msgstr "<Αίτημα Εξερεύνησης Υπολογιστή>" +msgid "Browse Host Disabled" +msgstr "" + +#, c-format +msgid "Redirected to %s:%u" +msgstr "" + +msgid "Not Modified" +msgstr "" + msgid "Stalling upload replaced" msgstr "Η σταματημένη αποστολή αντικαταστάθηκε" +msgid "Already downloading this file" +msgstr "" + +msgid "Malformed Range request" +msgstr "" + +msgid "Requested range not satisfiable" +msgstr "" + +msgid "Requested range not available yet" +msgstr "" + +msgid "Queue full" +msgstr "" + +msgid "Another connection is still active" +msgstr "" + +#, c-format +msgid "%s not honoured; removed from PARQ queue" +msgstr "" + +msgid "Minimum retry delay" +msgstr "" + #, c-format msgid "Queued (slot %d, ETA: %s)" msgstr "Μπήκε στη λίστα αναμονής (υποδοχή %d, ETA: %s)" @@ -954,9 +907,12 @@ msgid "Cannot send whole HTTP status" msgstr "Δεν είναι η αποστολή ολόκληρης της κατάστασης HTTP" +msgid "Not Acceptable" +msgstr "" + #, c-format -msgid "<Browse Host Request> %s%s%s" -msgstr "<Αίτημα Εξερεύνησης Υπολογιστή> %s%s%s" +msgid "<Browse Host %sRequest> %s%s%s" +msgstr "" msgid "query hits" msgstr "χτυπήματα ερωτημάτων" @@ -970,6 +926,40 @@ msgid ", chunked" msgstr ", κομματιασμένο" +msgid "THEX failure" +msgstr "" + +msgid "EOF while sinking" +msgstr "" + +#, c-format +msgid "Read error while sinking: %m" +msgstr "" + +msgid "Content Too Large" +msgstr "" + +msgid "Unknown/Missing Protocol Tag" +msgstr "" + +msgid "Missing Host Header" +msgstr "" + +msgid "Not Implemented" +msgstr "" + +msgid "Bad URI" +msgstr "" + +msgid "Bad Path" +msgstr "" + +msgid "No Content Allowed" +msgstr "" + +msgid "Sharing currently disabled" +msgstr "" + msgid "Write exception" msgstr "Εξαίρεση εγγραφής" @@ -997,17 +987,1206 @@ msgid "IP denying uploads" msgstr "Η IP αρνείται τις αποστολές" -#, fuzzy, c-format +#, c-format msgid " - Newer versions available: release %s / from git %s" -msgstr " - Υπάρχουν νεότερες εκδόσεις διαθέσιμες: έκδοση %s / από git %s" +msgstr "" #, c-format msgid " - Newer version available: release %s" msgstr " - Υπάρχει νεότερη έκδοση διαθέσιμη: έκδοση %s" -#, fuzzy, c-format +#, c-format msgid " - Newer version available: from git %s" -msgstr " - Υπάρχει νεότερη έκδοση διαθέσιμη: από git %s" +msgstr "" + +msgid "Routing errors" +msgstr "Σφάλματα δρομολόγησης" + +msgid "Routing table chunks" +msgstr "" + +msgid "Routing table message capacity" +msgstr "" + +msgid "Routing table message count" +msgstr "" + +msgid "Routing through transient node avoided" +msgstr "" + +msgid "Duplicates with higher TTL" +msgstr "Ανατυπώνει με υψηλότερο TTL" + +msgid "SPAM SHA1 database hits" +msgstr "" + +msgid "SPAM filename and size hits" +msgstr "" + +msgid "SPAM fake hits" +msgstr "" + +msgid "SPAM duplicate hits" +msgstr "" + +msgid "SPAM dynamically caught hostile IP addresses" +msgstr "" + +msgid "SPAM dynamically caught hostile IP held" +msgstr "" + +msgid "SPAM spotted spamming IP addresses held" +msgstr "" + +msgid "Searches to local DB" +msgstr "Αναζητήσεις στην τοπική ΒΔ" + +msgid "Hits on local DB" +msgstr "Χτυπήματα στην τοπική ΒΔ" + +msgid "Hits on local partial files" +msgstr "" + +msgid "Hits on \"what's new?\" queries" +msgstr "" + +msgid "Query hits received for local queries" +msgstr "Ληφθέντα χτυπήματα ερωτημάτων για τοπικά ερωτήματα." + +msgid "G2 searches to local DB" +msgstr "" + +msgid "G2 hits on local DB" +msgstr "" + +msgid "G2 hits on local partial files" +msgstr "" + +msgid "Query hits received for OOB-proxied queries" +msgstr "Ληφθέντα χτυπήματα ερωτημάτων για ερωτήματα δρομολογημένα μέσω OOB" + +msgid "Queries requesting OOB hit delivery" +msgstr "Ερωτήματα αναζήτησης χτυπημάτων παράδοσης OOB" + +msgid "Stripped OOB flag on queries" +msgstr "Περικομμένη σημαία OOB στα ερωτήματα" + +msgid "Ignored OOB queries due to unclaimed hits" +msgstr "" + +msgid "Duplicate OOB-proxied queries" +msgstr "Ανατυπώνει ερωτήματα δρομολογημένα μέσω OOB" + +msgid "OOB hits received for OOB-proxied queries" +msgstr "Ληφθέντα χτυπήματα OOB για ερωτήματα δρομολογημένα μέσω OOB" + +msgid "OOB hits bearing alien IP address" +msgstr "Χτυπήματα OOB που δημιουργούν ξένες διευθύνσεις IP" + +msgid "OOB hits ignored due to identified spamming address" +msgstr "" + +msgid "OOB hits ignored due to unsecure promise from known secure host" +msgstr "" + +msgid "Unclaimed locally-generated OOB hits" +msgstr "Αδήλωτα τοπικά δημιουργημένα χτυπήματα OOB" + +msgid "Partially claimed locally-generated OOB hits" +msgstr "Μερικώς δηλωμένα τοπικά δημιουργημένα χτυπήματα OOB" + +msgid "Spurious OOB hit claiming received" +msgstr "" + +msgid "Unrequested OOB hits received" +msgstr "" + +msgid "Received query hits for untracked queries" +msgstr "" + +msgid "Tracked query MUIDs" +msgstr "" + +msgid "Compacted queries" +msgstr "Συμπαγή ερωτήματα" + +msgid "Bytes saved by compacting" +msgstr "Bytes που σώθηκαν από την μετατροπή σε συμπαγή" + +msgid "UTF8 queries" +msgstr "ερωτήματα UTF8" + +msgid "SHA1 queries" +msgstr "ερωτήματα SHA1" + +msgid "\"What's New?\" queries" +msgstr "" + +msgid "UTF8 G2 queries" +msgstr "" + +msgid "SHA1 G2 queries" +msgstr "" + +msgid "GUESS queries" +msgstr "" + +msgid "GUESS queries (0.2)" +msgstr "" + +msgid "GUESS link cache size" +msgstr "" + +msgid "GUESS cached query keys held" +msgstr "" + +msgid "GUESS cached 0.2 hosts held" +msgstr "" + +msgid "GUESS cached G2 hosts held" +msgstr "" + +msgid "GUESS locally generated queries" +msgstr "" + +msgid "GUESS currently running queries" +msgstr "" + +msgid "GUESS hits received for locally generated queries" +msgstr "" + +msgid "GUESS ultra nodes queried" +msgstr "" + +msgid "GUESS ultra nodes sending back an acknowledgment" +msgstr "" + +msgid "GUESS G2 nodes queried" +msgstr "" + +msgid "GUESS G2 nodes sending back an acknowledgment" +msgstr "" + +msgid "Throttled local push messages" +msgstr "" + +msgid "Throttled received push messages" +msgstr "" + +msgid "Broadcasted push messages" +msgstr "Μεταδιδόμενα μηνύματα ώθησης" + +msgid "Push-proxy UDP relayed messages" +msgstr "" + +msgid "Push-proxy TCP relayed messages" +msgstr "Μηνύματα διαμεσολαβητή ώθησης" + +msgid "Push-proxy TCP for FW<->FW transfers" +msgstr "" + +msgid "Push-proxy broadcasted messages" +msgstr "Μηνύματα μεταδιδόμενα από το διαμεσολαβητή ώθησης" + +msgid "Push-proxy found un-proxied local route" +msgstr "" + +msgid "Push-proxy lookup failures" +msgstr "Μηνύματα αποτυχίας εύρεσης διαμεσολαβητή ώθησης" + +msgid "Push relayed via local route" +msgstr "" + +msgid "Push relayed via routing table" +msgstr "" + +msgid "Locally generated dynamic queries" +msgstr "Τοπικά δημιουργημένα δυναμικά ερωτήματα" + +msgid "Leaf-generated dynamic queries" +msgstr "Δυναμικά ερωτήματα από δικτυακούς κόμβους" + +msgid "OOB-proxied leaf queries" +msgstr "Ερωτήματα δικτυακών κόμβων μέσω διαμεσολάβησης OOB" + +msgid "Fully completed dynamic queries" +msgstr "Πλήρως ολοκληρωμένα δυναμικά ερωτήματα" + +msgid "Partially completed dynamic queries" +msgstr "Μερικώς ολοκληρωμένα δυναμικά ερωτήματα" + +msgid "Dynamic queries ended with no results" +msgstr "Τα δυναμικά ερωτήματα τελείωσαν χωρίς αποτελέσματα" + +msgid "Fully completed dynamic queries getting late results" +msgstr "" +"Πλήρως ολοκληρωμένα δυναμικά ερωτήματα με λήψη καθυστερημένων αποτελεσμάτων" + +msgid "Dynamic queries with partial late results" +msgstr "Δυναμικά ερωτήματα με μερικά καθυστερημένα αποτελέσματα" + +msgid "Dynamic queries completed by late results" +msgstr "Δυναμικά ερωτήματα που ολοκληρώθηκαν από καθυστερημένα αποτελέσματα" + +msgid "Queries seen from GTKG" +msgstr "Ερωτήματα που προβλήθηκαν από το GTKG" + +msgid "Queries seen from GTKG that were re-queries" +msgstr "Ερωτήματα που προβλήθηκαν από το GTKG που ήταν επανερωτήματα" + +msgid "Queries advertising support of GGEP \"H\"" +msgstr "Ερωτήματα με διαφημίσεις υποστήριξης GGEP \"H\"" + +msgid "Queries advertising support of semi-reliable UDP" +msgstr "" + +msgid "GIV callbacks received" +msgstr "Ελήφθησαν πίσω κλήσεις GIV" + +msgid "GIV discarded due to no suitable download" +msgstr "" + +msgid "QUEUE callbacks received" +msgstr "Ελήφθησαν πίσω κλήσεις ΛΙΣΤΑΣ ΑΝΑΜΟΝΗΣ" + +msgid "QUEUE discarded due to no suitable download" +msgstr "" + +msgid "File descriptors banned running count" +msgstr "" + +msgid "UDP read-ahead datagram running count" +msgstr "" + +msgid "UDP read-ahead datagram running bytes" +msgstr "" + +msgid "UDP read-ahead datagram \"old\" processed" +msgstr "" + +msgid "UDP read-ahead datagram max count" +msgstr "" + +msgid "UDP read-ahead datagram max bytes" +msgstr "" + +msgid "UDP read-ahead datagram max delay" +msgstr "" + +msgid "UDP push messages received for FW<->FW connections" +msgstr "" + +msgid "UDP push messages requesting FW<->FW connection with ourselves" +msgstr "" + +msgid "UDP push messages patched for FW<->FW connections" +msgstr "" + +msgid "UDP UHC pings received" +msgstr "" + +msgid "UDP UHC pongs sent" +msgstr "" + +msgid "UDP messages with bogus source IP" +msgstr "Μηνύματα UDP με ψεύτικη πηγαία IP" + +msgid "UDP messages from shunned IP (discarded)" +msgstr "" + +msgid "UDP truncated incoming messages" +msgstr "" + +msgid "Alien UDP messages (non-Gnutella)" +msgstr "Ξένα μηνύματα UDP (όχι Gnutella)" + +msgid "Unprocessed UDP Gnutella messages" +msgstr "Ασυμπίεστα μηνύματα UDP Gnutella" + +msgid "Compressed UDP messages enqueued" +msgstr "" + +msgid "Compressed UDP messages received" +msgstr "" + +msgid "Candidates for UDP message compression" +msgstr "" + +msgid "Uncompressed UDP messages due to no gain" +msgstr "" + +msgid "Ambiguous UDP messages received" +msgstr "" + +msgid "Ambiguous UDP messages inspected more deeply" +msgstr "" + +msgid "Ambiguous UDP messages handled as semi-reliable UDP" +msgstr "" + +msgid "Semi-reliable UDP total messages given for transmission" +msgstr "" + +msgid "Semi-reliable UDP total messages deflated" +msgstr "" + +msgid "Semi-reliable UDP total messages unsent" +msgstr "" + +msgid "Semi-reliable UDP total messages dropped due to temporary ban" +msgstr "" + +msgid "Semi-reliable UDP total messages sent to known responsive hosts" +msgstr "" + +msgid "Semi-reliable UDP total messages partially sent due to clogging" +msgstr "" + +msgid "Semi-reliable UDP reliable messages given for transmission" +msgstr "" + +msgid "Semi-reliable UDP reliable messages correctly transmited" +msgstr "" + +msgid "Semi-reliable UDP reliable messages not fully acknowledged" +msgstr "" + +msgid "Semi-reliable UDP fragments sent" +msgstr "" + +msgid "Semi-reliable UDP fragments resent" +msgstr "" + +msgid "Semi-reliable UDP fragment sendings avoided" +msgstr "" + +msgid "Semi-reliable UDP fragments sent too many times" +msgstr "" + +msgid "Semi-reliable UDP total acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP spurious acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP invalid acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP acknowledgments re-queued for sending" +msgstr "" + +msgid "Semi-reliable UDP plain acknowledgments dropped" +msgstr "" + +msgid "Semi-reliable UDP enhanced acknowledgments dropped" +msgstr "" + +msgid "Semi-reliable UDP plain acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP EARs sent" +msgstr "" + +msgid "Semi-reliable UDP too many EARs sent" +msgstr "" + +msgid "Semi-reliable UDP EAR negative acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP acknowledgments received after sending EARs" +msgstr "" + +msgid "Semi-reliable UDP fragments received" +msgstr "" + +msgid "Semi-reliable UDP duplicate fragments received" +msgstr "" + +msgid "Semi-reliable UDP unreliable fragments received" +msgstr "" + +msgid "Semi-reliable UDP dropped received fragments" +msgstr "" + +msgid "Semi-reliable UDP fragments received whilst lingering" +msgstr "" + +msgid "Semi-reliable UDP messages expired before re-assembly" +msgstr "" + +msgid "Semi-reliable UDP messages re-assembled completely" +msgstr "" + +msgid "Semi-reliable UDP messages inflated successfully" +msgstr "" + +msgid "Semi-reliable UDP messages inflated incorrectly" +msgstr "" + +msgid "Semi-reliable UDP unreliable messages received" +msgstr "" + +msgid "Semi-reliable UDP empty messages received" +msgstr "" + +msgid "Semi-reliable UDP total acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP avoided acknowledgment sendings" +msgstr "" + +msgid "Semi-reliable UDP EARs received" +msgstr "" + +msgid "Semi-reliable UDP EARs received for unknown message" +msgstr "" + +msgid "Semi-reliable UDP EARs received whilst lingering" +msgstr "" + +msgid "Semi-reliable UDP fragments from hostile IP addresses" +msgstr "" + +msgid "UDP G2 hits rerouted to hub for delivery" +msgstr "" + +msgid "UDP G2 hits undelivered" +msgstr "" + +msgid "Consolidated servers (after GUID and IP address linking)" +msgstr "" + +msgid "Duplicate downloads found during server consolidation" +msgstr "" + +msgid "Discovered server GUIDs" +msgstr "" + +msgid "Changed server GUIDs" +msgstr "" + +msgid "Detected GUID collisions" +msgstr "" + +msgid "Detected collisions with our own GUID" +msgstr "" + +msgid "GUID dynamically banned" +msgstr "" + +msgid "Firewalled node info for known hosts received in upload requests" +msgstr "" + +msgid "Revitalized PUSH routes" +msgstr "" + +msgid "Collected new PUSH proxies from other query hits" +msgstr "" + +msgid "Attempted download resource switching on completion" +msgstr "" + +msgid "Attempted download resource switching after error" +msgstr "" + +msgid "Successful download resource switching (all kind)" +msgstr "" + +msgid "Successful download resource switching between plain files" +msgstr "" + +msgid "Successful download resource switching after error" +msgstr "" + +msgid "Actively queued after resource switching attempt" +msgstr "" + +msgid "Sunk HTTP reply data on error codes" +msgstr "" + +msgid "Ignored downloaded data" +msgstr "" + +msgid "Ignoring requested after data mismatch" +msgstr "" + +msgid "Ignoring requested to preserve connection" +msgstr "" + +msgid "Ignoring requested due to aggressive swarming" +msgstr "" + +msgid "Ignoring refused (data too large or server too slow)" +msgstr "" + +msgid "Client resource switching (all detected)" +msgstr "" + +msgid "Client resource switching between plain files" +msgstr "" + +msgid "Client follow-up request after HTTP error was returned" +msgstr "" + +msgid "PARQ client resource switching in slots (SHA-1 based)" +msgstr "" + +msgid "PARQ client retry-after violation" +msgstr "" + +msgid "PARQ client kicked out after too many retry-after violations" +msgstr "" + +msgid "PARQ upload slot limit overrides" +msgstr "" + +msgid "PARQ quick upload slots granted" +msgstr "" + +msgid "PARQ QUEUE sending attempts" +msgstr "" + +msgid "PARQ QUEUE messages sent" +msgstr "" + +msgid "PARQ QUEUE follow-up requests received" +msgstr "" + +msgid "Launched SHA-1 file verifications" +msgstr "" + +msgid "Launched TTH file verifications" +msgstr "" + +msgid "Re-seeding of orphan downloads through query hits" +msgstr "" + +msgid "Re-seeding of orphan downloads through upload requests" +msgstr "" + +msgid "RUDP sent bytes" +msgstr "" + +msgid "RUDP received bytes" +msgstr "" + +msgid "DHT estimated amount of nodes" +msgstr "" + +msgid "DHT standard error of estimated amount of nodes" +msgstr "" + +msgid "DHT k-ball theoretical frontier (bits)" +msgstr "" + +msgid "DHT k-ball furthest frontier (bits)" +msgstr "" + +msgid "DHT k-ball closeest frontier (bits)" +msgstr "" + +msgid "DHT routing table buckets" +msgstr "" + +msgid "DHT routing table leaves" +msgstr "" + +msgid "DHT routing table maximum depth" +msgstr "" + +msgid "DHT routing table good nodes" +msgstr "" + +msgid "DHT routing table stale nodes" +msgstr "" + +msgid "DHT routing table pending nodes" +msgstr "" + +msgid "DHT routing table evicted nodes" +msgstr "" + +msgid "DHT routing table evicted firewalled nodes" +msgstr "" + +msgid "DHT routing table evicted nodes due to quota" +msgstr "" + +msgid "DHT routing table promoted pending nodes" +msgstr "" + +msgid "DHT routing table pinged promoted nodes" +msgstr "" + +msgid "DHT routing table rejected node due to bucket network quota" +msgstr "" + +msgid "DHT routing table rejected node due to global network quota" +msgstr "" + +msgid "DHT completed bucket refreshes" +msgstr "" + +msgid "DHT forced bucket refreshes" +msgstr "" + +msgid "DHT forced bucket merges" +msgstr "" + +msgid "DHT bucket merges" +msgstr "" + +msgid "DHT bucket splits" +msgstr "" + +msgid "DHT denied non-splitable bucket refresh" +msgstr "" + +msgid "DHT initiated bucket alive checks" +msgstr "" + +msgid "DHT alive pings sent to good nodes" +msgstr "" + +msgid "DHT alive pings sent to stale nodes" +msgstr "" + +msgid "DHT alive pings sent to shutdowning nodes" +msgstr "" + +msgid "DHT alive pings avoided" +msgstr "" + +msgid "DHT alive pings skipped" +msgstr "" + +msgid "DHT revitalized stale nodes on RPC reply" +msgstr "" + +msgid "DHT value store rejected on IP/network quota grounds" +msgstr "" + +msgid "DHT value store rejected on creator validation grounds" +msgstr "" + +msgid "DHT nodes rejected during lookup based on network quota" +msgstr "" + +msgid "DHT nodes rejected during lookup based on suspicious proximity" +msgstr "" + +msgid "DHT nodes rejected during lookup based on frequency divergence" +msgstr "" + +msgid "DHT node contact IP addresses fixed during lookup" +msgstr "" + +msgid "DHT keys held" +msgstr "" + +msgid "DHT cached keys held" +msgstr "" + +msgid "DHT values held" +msgstr "" + +msgid "DHT cached KUID targets held" +msgstr "" + +msgid "DHT cached closest root nodes" +msgstr "" + +msgid "DHT cached roots exact hits" +msgstr "" + +msgid "DHT cached roots approximate hits" +msgstr "" + +msgid "DHT cached roots misses" +msgstr "" + +msgid "DHT cached roots lookups within k-ball" +msgstr "" + +msgid "DHT cached roots contact address refreshed" +msgstr "" + +msgid "DHT cached security tokens held" +msgstr "" + +msgid "DHT cached security tokens hits" +msgstr "" + +msgid "DHT stable node information held" +msgstr "" + +msgid "DHT local hits on value lookups" +msgstr "" + +msgid "DHT local hits returning values from cached keys" +msgstr "" + +msgid "DHT returned expanded values" +msgstr "" + +msgid "DHT returned values as secondary keys" +msgstr "" + +msgid "DHT claimed values via secondary keys" +msgstr "" + +msgid "DHT returned cached expanded values" +msgstr "" + +msgid "DHT returned cached values as secondary-keys" +msgstr "" + +msgid "DHT claimed cached values via secondary keys" +msgstr "" + +msgid "DHT successfully received value publications" +msgstr "" + +msgid "DHT successfully received value removals" +msgstr "" + +msgid "DHT replication of stale value avoided" +msgstr "" + +msgid "DHT replication of held values" +msgstr "" + +msgid "DHT republishing of held values" +msgstr "" + +msgid "DHT secondary-key value fetch issued" +msgstr "" + +msgid "DHT duplicate values returned in lookups" +msgstr "" + +msgid "DHT detected KUID collisions" +msgstr "" + +msgid "DHT detected collisions with our own KUID" +msgstr "" + +msgid "DHT caching attempts" +msgstr "" + +msgid "DHT caching ended successfully" +msgstr "" + +msgid "DHT caching partially completed" +msgstr "" + +msgid "DHT key-offloading checks after discovering new closest node" +msgstr "" + +msgid "DHT keys selected for offloading" +msgstr "" + +msgid "DHT key-offloading attempts" +msgstr "" + +msgid "DHT key-offloading ended successfully" +msgstr "" + +msgid "DHT key-offloading partially completed" +msgstr "" + +msgid "DHT values successfully offloaded" +msgstr "" + +msgid "DHT incoming messages" +msgstr "" + +msgid "DHT incoming messages with UDP-matching contact address" +msgstr "" + +msgid "DHT incoming messages with contact address fixed" +msgstr "" + +msgid "DHT incoming messages from hostile addresses" +msgstr "" + +msgid "DHT incoming messages with hostile contact address" +msgstr "" + +msgid "DHT RPC messages prepared" +msgstr "" + +msgid "DHT RPC messages cancelled" +msgstr "" + +msgid "DHT RPC timed out" +msgstr "" + +msgid "DHT RPC replies received" +msgstr "" + +msgid "DHT RPC replies with contact address fixed" +msgstr "" + +msgid "DHT RPC late replies received" +msgstr "" + +msgid "DHT RPC detected KUID mismatches on reply" +msgstr "" + +msgid "DHT RPC recent nodes held" +msgstr "" + +msgid "DHT node verifications" +msgstr "" + +msgid "DHT publishing attempts" +msgstr "" + +msgid "DHT publishing ended successfully (all roots)" +msgstr "" + +msgid "DHT publishing partially completed (root subset only)" +msgstr "" + +msgid "DHT publishing ending with proper value presence" +msgstr "" + +msgid "DHT value republishing occurring too late (after expiry)" +msgstr "" + +msgid "DHT publishing to self" +msgstr "" + +msgid "DHT background publishing completion attempts" +msgstr "" + +msgid "DHT background publishing completion showing improvements" +msgstr "" + +msgid "DHT background publishing completion successful (all roots)" +msgstr "" + +msgid "DHT SHA1 data type collisions" +msgstr "" + +msgid "DHT lookup path passively protected against attack" +msgstr "" + +msgid "DHT lookup path actively protected against attack" +msgstr "" + +msgid "DHT alt-loc lookups issued" +msgstr "" + +msgid "DHT push-proxy lookups issued" +msgstr "" + +msgid "DHT successful alt-loc lookups" +msgstr "" + +msgid "DHT successful push-proxy lookups" +msgstr "" + +msgid "DHT successful node push-entry lookups" +msgstr "" + +msgid "DHT re-seeding of orphan downloads" +msgstr "" + +msgid "Digests computed on general statistics" +msgstr "" + +msgid "Digests computed on TCP statistics" +msgstr "" + +msgid "Digests computed on UDP statistics" +msgstr "" + +msgid "Ping" +msgstr "Ping" + +msgid "Pong" +msgstr "Pong" + +msgid "Bye" +msgstr "Αντίο" + +msgid "QRP" +msgstr "QRP" + +msgid "HSEP" +msgstr "HSEP" + +msgid "RUDP" +msgstr "" + +msgid "Vendor spec." +msgstr "Προδ/φές Κατασκευαστή" + +msgid "Vendor std." +msgstr "" + +msgid "Push" +msgstr "Ώθηση" + +msgid "Query" +msgstr "Ερώτημα" + +msgid "Query hit" +msgstr "Χτύπημα ερωτήματος" + +msgid "DHT (truncated)" +msgstr "" + +msgid "DHT Ping" +msgstr "" + +msgid "DHT Pong" +msgstr "" + +msgid "DHT Store" +msgstr "" + +msgid "DHT Store Ack" +msgstr "" + +msgid "DHT Find Node" +msgstr "" + +msgid "DHT Found Node" +msgstr "" + +msgid "DHT Find Value" +msgstr "" + +msgid "DHT Value" +msgstr "" + +msgid "G2 Crawl Request" +msgstr "" + +msgid "G2 Hub Advertisement" +msgstr "" + +msgid "G2 Hub List" +msgstr "" + +msgid "G2 Hub List Req" +msgstr "" + +msgid "G2 Hub List Ack" +msgstr "" + +msgid "G2 Local Node Info" +msgstr "" + +msgid "G2 Ping" +msgstr "" + +msgid "G2 Pong" +msgstr "" + +msgid "G2 Push" +msgstr "" + +msgid "G2 Query Key Ack" +msgstr "" + +msgid "G2 Query Key Req" +msgstr "" + +msgid "G2 Query" +msgstr "" + +msgid "G2 Query Ack" +msgstr "" + +msgid "G2 Query Hit" +msgstr "" + +msgid "G2 Query Hash Table" +msgstr "" + +msgid "G2 User Profile Check" +msgstr "" + +msgid "G2 User Profile Data" +msgstr "" + +msgid "Total" +msgstr "Σύνολο" + +msgid "Bad size" +msgstr "Κακό μέγεθος" + +msgid "Too small" +msgstr "Πολύ μικρό" + +msgid "Too large" +msgstr "Πολύ μεγάλο" + +msgid "Way too large" +msgstr "Πάρα πολύ μεγάλο" + +msgid "Too old" +msgstr "" + +msgid "Unknown message type" +msgstr "Άγνωστος τύπος μηνύματος" + +msgid "Unexpected message" +msgstr "Απρόβλεπτο μήνυμα" + +msgid "Message sent with TTL = 0" +msgstr "Το μήνυμα στάλθηκε με TTL = 0" + +msgid "Improper hops/ttl combination" +msgstr "" + +msgid "Max TTL exceeded" +msgstr "Υπέρβαση μέγιστου TTL" + +msgid "Message throttle" +msgstr "Περιορισμός μηνυμάτων" + +msgid "Message matched limits" +msgstr "" + +msgid "Transient node" +msgstr "" + +msgid "Unusable Pong" +msgstr "" + +msgid "Hard TTL limit reached" +msgstr "Όριο σκληρού TTL" + +msgid "Max hop count reached" +msgstr "" + +msgid "Route lost" +msgstr "Απώλεια δρομολόγησης" + +msgid "No route" +msgstr "Χωρίς δρομολόγηση" + +msgid "Duplicate message" +msgstr "Ανατύπωση μηνύματος" + +msgid "OOB Proxy MUID Conflict" +msgstr "" + +msgid "Message to banned GUID" +msgstr "Μήνυμα σε απαγορευμένο GUID" + +msgid "Message from banned GUID" +msgstr "" + +msgid "Node shutting down" +msgstr "Ο κόμβος κλείνει" + +msgid "TX flow control" +msgstr "Έλεγχος ροής TX" + +msgid "Query text had no trailing NUL" +msgstr "" + +msgid "Query text too short" +msgstr "Το κείμενο ερωτήματος είναι πολύ μικρό" + +msgid "Query had unnecessary overhead" +msgstr "Το ερώτημα επιβαρύνθηκε χωρίς να χρειάζεται" + +msgid "Query had bad URN" +msgstr "" + +msgid "Message with malformed SHA1" +msgstr "Μήνυμα με παραμορφωμένο SHA1" + +msgid "Message with malformed UTF-8" +msgstr "Μήνυμα με παραμορφωμένο UTF-8" + +msgid "Malformed Query Hit" +msgstr "Παραμορφωμένο χτύπημα ερωτήματος" + +msgid "Bad return address" +msgstr "Κακή διεύθυνση επιστροφής" + +msgid "Hostile IP address" +msgstr "Εχθρική διεύθυνση IP" + +msgid "Shunned IP address" +msgstr "" + +msgid "Bogus result from Morpheus" +msgstr "" + +msgid "Spam" +msgstr "" + +msgid "Evil filename" +msgstr "" + +msgid "Improper media type" +msgstr "" + +msgid "Payload inflating error" +msgstr "" + +msgid "Unknown header flags present" +msgstr "" + +msgid "Own search results" +msgstr "" + +msgid "Own queries" +msgstr "" + +msgid "Ancient query format" +msgstr "" + +msgid "Blank Servent ID" +msgstr "" + +msgid "GUESS Query missing token" +msgstr "" + +msgid "GUESS Invalid query token" +msgstr "" + +msgid "DHT Invalid security token" +msgstr "" + +msgid "DHT Too many STORE requests" +msgstr "" + +msgid "DHT Malformed message" +msgstr "" + +msgid "G2 Unexpected message" +msgstr "" + +msgid "Cannot cross networks" +msgstr "" msgid "No proxy" msgstr "Χωρίς διαμεσολαβητή" @@ -1048,9 +2227,8 @@ msgid "leaf node" msgstr "δικτυακός κόμβος" -#, fuzzy msgid "none" -msgstr "κόμβος" +msgstr "" msgid "input only" msgstr "" @@ -1067,25 +2245,20 @@ msgid "own KUID lookup" msgstr "" -#, fuzzy msgid "completing" -msgstr "Ολοκληρώθηκε" +msgstr "" -#, fuzzy msgid "completed" -msgstr "Ολοκληρώθηκε" +msgstr "" -#, fuzzy msgid "shutdown" -msgstr "Κλείσιμο (%s)" +msgstr "" -#, fuzzy msgid "active (recommended)" -msgstr "αυτόματο (προτείνεται)" +msgstr "" -#, fuzzy msgid "passive" -msgstr " παθητικός)" +msgstr "" msgid "Indicates whether the hostcache file is being read." msgstr "Προσδιορίζει αν θα διαβάζεται η λανθάνουσα μνήμη υπολογιστών." @@ -1136,18 +2309,12 @@ "αυτόν τον αριθμό συνδέσεων με κανονικούς πελάτες. Ο αριθμός αυτός πρέπει να " "είναι μικρότερο από το μέγιστο επιτρεπόμενο αριθμό εισερχόμενων συνδέσεων." -#, fuzzy msgid "" "Don't allow more than this number of connections to other servents. As a " "rule of thumb you should reserve 256 b/s bandwidth per connection. Never use " "up all your bandwidth, leave a little space for TCP/IP overhead. It's not " "advisable that you set this to a value smaller than 40." msgstr "" -"Δεν επιτρέπονται περισσότερες από αυτόν τον αριθμό συνδέσεις με άλλους " -"πελάτες. Κατά κανόνα πρέπει να παραχωρείτε εύρος 256 b/s ανά σύνδεση. Μη " -"χρησιμοποιείτε ποτέ όλο το εύρος σύνδεσής σας, αφήστε λίγο χώρο για την " -"επιβάρυνση TCP/IP. Δεν είναι φρόνιμο να το ορίσετε σε μία τιμή μικρότερη από " -"30." msgid "Number of leaf nodes currently connected." msgstr "Αριθμός συνδεδεμένων δικτυακών κόμβων." @@ -1187,29 +2354,23 @@ "Δεν αποστέλλονται περισσότερα από αυτόν τον αριθμό αρχεία παράλληλα σε έναν " "υπολογιστή." -#, fuzzy msgid "Local IPv4 address last determined." -msgstr "Η τοπική διεύθυνση IP που ορίστηκε τελευταία." +msgstr "" -#, fuzzy msgid "Local IPv6 address last determined." -msgstr "Η τοπική διεύθυνση IP που ορίστηκε τελευταία." +msgstr "" -#, fuzzy msgid "When the current IPv4 address was determined." -msgstr "Όταν ορίστηκε η τρέχουσα διεύθυνση IP." +msgstr "" -#, fuzzy msgid "When the current IPv6 address was determined." -msgstr "Όταν ορίστηκε η τρέχουσα διεύθυνση IP." +msgstr "" -#, fuzzy msgid "Average uptime with the same IPv4 address." -msgstr "Μέσος χρόνος λειτουργίας με την ίδια διεύθυνση IP." +msgstr "" -#, fuzzy msgid "Average uptime with the same IPv6 address." -msgstr "Μέσος χρόνος λειτουργίας με την ίδια διεύθυνση IP." +msgstr "" msgid "Timestamp at which servent was started." msgstr "Χρονόσημο έναρξης πελάτη." @@ -1217,7 +2378,6 @@ msgid "Average servent uptime." msgstr "Μέσος χρόνος λειτουργίας πελάτη." -#, fuzzy msgid "" "Local TCP port gtk-gnutella is listening on. ISPs often block or throttle " "traffic on TCP port 6346 so it is a good idea to change it to something in " @@ -1225,24 +2385,15 @@ "forwarding / opening, as necessary. Note that by default, the TCP port 6346 " "is not used to guard against undue censorship." msgstr "" -"Τοπική θύρα ακρόασης TCP του gtk-gnutella. Ο προμηθευτής υπηρεσιών " -"διαδικτύου σας ίσως φράξει ή περικόψει την κυκλοφορία στη θύρα TCP 6346 έτσι " -"θα ήταν καλή ιδέα να το αλλάξετε σε κάτι στο εύρος 1024-65535. Μην ξεχάσετε " -"να ανανεώσετε ανάλογα την προώθηση/άνοιγμα θυρών του τοίχους προστασίας " -"σας. Σημειώστε ότι προεπιλεγμένα, η θύρα TCP 6346 δε χρησιμοποιείται για " -"την προστασία από άδικη λογοκρισία." msgid "Use this IP address as source address if 'force local ip' is activated." msgstr "" "Χρήση αυτής της διεύθυνσης IP ως πηγαία διεύθυνση αν είναι ενεργό το " "'εξαναγκασμός τοπικής ip'." -#, fuzzy msgid "" "Use this IPv6 address as source address if 'force local ip' is activated." msgstr "" -"Χρήση αυτής της διεύθυνσης IP ως πηγαία διεύθυνση αν είναι ενεργό το " -"'εξαναγκασμός τοπικής ip'." msgid "" "The connection bandwidth reported to other hosts. This is the speed at which " @@ -1507,9 +2658,6 @@ msgstr "" "Επίπεδο αποσφαλμάτωσης κώδικα επικοινωνίας γραφικού ενδιαμέσου και πυρήνα." -msgid "Verbosity of Bitzi related debug messages." -msgstr "" - msgid "Verbosity of URL handling related debug messages." msgstr "" @@ -1587,13 +2735,11 @@ "support." msgstr "" -msgid "For development use: track properties." -msgstr "Για ανάπτυξη: ιδιότητες κομματιού." +msgid "Indicates a kernel network buffer shortage." +msgstr "" -#, fuzzy msgid "For development use: don't add new hosts to the host cache." msgstr "" -"Για ανάπτυξη: μην προσθέτετε νέους υπολογιστές στο συλλέκτη υπολογιστών." msgid "Enable bandwidth limitation for incoming HTTP traffic." msgstr "Ενεργοποίηση περιορισμού εύρους για την εισερχόμενη κυκλοφορία HTTP." @@ -1643,9 +2789,8 @@ "Αυτόματος καθαρισμός μη διαθέσιμων λήψεων (τέλος χρόνου σύνδεσης, απώλεια " "δρομολόγησης ώθησης, κτλ...)." -#, fuzzy msgid "Auto clear finished downloads" -msgstr "Αυτόματος καθαρισμός των σταματημένων λήψεων" +msgstr "" msgid "Remove downloaded files from the search result." msgstr "Αφαίρεση των ληφθέντων αρχείων από το αποτέλεσμα της αναζήτησης." @@ -1653,9 +2798,8 @@ msgid "Enable to use forced_local_ip as local ip." msgstr "Ενεργοποίηση χρήσης forced_local_ip ως τοπική ip." -#, fuzzy msgid "Enable to use forced_local_ip6 as local ip." -msgstr "Ενεργοποίηση χρήσης forced_local_ip ως τοπική ip." +msgstr "" msgid "" "If 'forced_local_ip' is enabled, bind the socket to the forced IP address." @@ -1719,20 +2863,17 @@ msgid "Current number of hosts in regular node caches." msgstr "Αριθμός υπολογιστών στις λανθάνουσες μνήμες συνήθων κόμβων." -#, fuzzy msgid "Current number of IPv4 hosts in ultra node caches." -msgstr "Αριθμός υπολογιστών στις λανθάνουσες μνήμες υπερ-κόμβων." +msgstr "" msgid "Current number of hosts in bad node caches." msgstr "Αριθμός υπολογιστών στις λανθάνουσες μνήμες κακών κόμβων." -#, fuzzy msgid "Maximum number of hosts in the regular node cache." -msgstr "Μέγιστος αριθμός υπολογιστών στο συλλέκτη κανονικών κόμβων." +msgstr "" -#, fuzzy msgid "Maximum number of IPv4 hosts in the ultra node cache." -msgstr "Μέγιστος αριθμός υπολογιστών στο συλλέκτη υπερ-κόμβων." +msgstr "" msgid "Maximum number of hosts in the BUSY, UNSTABLE and TIMEOUT lists." msgstr "" @@ -1911,9 +3052,8 @@ msgid "Number of running uploads." msgstr "Αριθμών αποστολών αυτή τη στιγμή." -#, fuzzy msgid "Number of quick uploads currently running." -msgstr "Αριθμός συνδεδεμένων υπερ-κόμβων." +msgstr "" msgid "Number of registered (pending) uploads." msgstr "Αριθμός καταχωρημένων (σε αναμονή) αποστολών." @@ -1924,9 +3064,8 @@ msgid "Global Unique IDentifier of this node." msgstr "Global Unique IDentifier αυτού του κόμβου." -#, fuzzy msgid "Kademlia Unique IDentifier of this node in the DHT." -msgstr "Global Unique IDentifier αυτού του κόμβου." +msgstr "" msgid "Whether or not to use swarming (recommended = YES)." msgstr "Να γίνεται χρήση ή όχι της εξάπλωσης (προτεινόμενο = ΝΑΙ)." @@ -2069,10 +3208,8 @@ msgid "" "Maximum amount of leaves we can accept. To be promoted Ultra, you should " -"reserve 32 bytes of bandwidth per leaf." +"reserve 32 bytes/sec of bandwidth per leaf." msgstr "" -"Μέγιστος αριθμός δικτυακών κόμβων που γίνονται αποδεκτοί. Για να προαχθείτε " -"σε υπερ-κόμβο, πρέπει να παραχωρείτε 32-bytes εύρους ανά δικτυακό κόμβο." msgid "What to do with files that will be ignored for downloading." msgstr "Τι γίνεται με τα αρχεία που παραβλέπονται για λήψη." @@ -2245,7 +3382,6 @@ msgid "Maximum percentage of slots a vendor can occupy." msgstr "Μέγιστος αριθμός υποδοχών που μπορεί να λάβει ένας κατασκευαστής." -#, fuzzy msgid "" "Size of the RX socket buffer to be used for downloads, in kibibytes. If you " "wish to avoid Gnutella downloads using up all your bandwidth, set it to a " @@ -2254,13 +3390,6 @@ "greater value. Remember: the smaller the value, the more you will be able to " "precisely control the incoming rate." msgstr "" -"Μέγεθος της ενδιάμεσης μνήμης της υποδοχής RX που χρησιμοποιείται για τις " -"λήψεις, σε kbytes. Αν επιθυμείτε να αποτρέψετε το Gnutella από το να " -"χρησιμοποιεί όλο το εύρος της σύνδεσής σας, ορίστε το σε μία χαμηλή τιμή (το " -"προεπιλεγμένο 64K, που είναι καλό). Αν δεν σας νοιάζει να καταστρέψετε όλο " -"το διαθέσιμο εύρος, αυξάνοντας την καθυστέρηση της σύνδεσής σας, ορίστε το " -"σε μία υψηλότερη τιμή. Να θυμάστε ότι όσο χαμηλότερη είναι η τιμή τόσο " -"περισσότερο θα μπορείτε να ελέγχετε το εισερχόμενο εύρος." msgid "" "Size of the RX socket buffer to be used for nodes, in kbytes. The lower the " @@ -2334,9 +3463,8 @@ msgstr "" "Αν καλύπτεται το απαιτούμενο εύρος σύνδεσης για αναβάθμιση σε υπερ-κόμβο." -#, fuzzy msgid "Whether we meet the UDP requirements to become an Ultra node." -msgstr "Αν καλύπτεται η απαιτούμενη μνήμη για αναβάθμιση σε υπερ-κόμβο." +msgstr "" msgid "" "Size of the search queue holding the locally generated queries before they " @@ -2425,9 +3553,8 @@ msgid "Time spent indexing shared files." msgstr "Χρόνος που αναλώθηκε στη δημιουργία ευρετηρίου αρχείων ανταλλαγής." -#, fuzzy msgid "Memory used by the QRP tables" -msgstr "Αριθμός υποδοχών που χρησιμοποιούνται από τον πίνακα QRP." +msgstr "" msgid "Time at which we started query routing table generation." msgstr "Χρόνος έναρξης δημιουργίας πίνακα δρομολόγησης ερωτημάτων." @@ -2576,7 +3703,7 @@ msgid "" "If set to TRUE, the global hostiles.txt is used as well as the private " -"$GTK_GNUTELLA_DIR/hostiles.txt. This allows to separate your private ban " +"$GTK_GNUTELLA_DIR/hostiles.txt. This allows you to separate your private ban " "list from the global one distributed with gtk-gnutella." msgstr "" @@ -2596,20 +3723,16 @@ msgid "Number of HTML browsing requests received in this session." msgstr "Αριθμός αιτημάτων εξερεύνησης HTML που λήφθηκαν σε αυτή τη συνεδρία." -#, fuzzy msgid "Number of HTML browsing requests fully served in this session." -msgstr "Αριθμός αιτημάτων εξερεύνησης HTML που λήφθηκαν σε αυτή τη συνεδρία." +msgstr "" msgid "Number of Gnutella browsing requests received in this session." msgstr "" "Αριθμός αιτημάτων εξερεύνησης Gnutella που λήφθηκαν σε αυτή τη συνεδρία." -#, fuzzy msgid "Number of Gnutella browsing requests fully served in this session." msgstr "" -"Αριθμός αιτημάτων εξερεύνησης Gnutella που λήφθηκαν σε αυτή τη συνεδρία." -#, fuzzy msgid "" "The average CPU usage indicates overloading, so gtk-gnutella is reducing the " "amount of non-critical processing it is performing. Note that the " @@ -2618,13 +3741,6 @@ "persists, GUI refreshing is reduced and background tasks (SHA1 computation, " "file moving) are slowed down." msgstr "" -"Η μέση χρήση της κεντρικής μονάδας επεξεργασίας συνιστά υπερφόρτωση, έτσι το " -"gtk-gnutella μειώνει τον αριθμό των μη κρίσιμων διεργασιών του. Σημειώστε " -"ότι η υπερφόρτωση μπορεί να προκύψει αν το gtk-gnutella δε λαμβάνει αρκετό " -"χρόνο της κεντρικής μονάδας επεξεργασίας επειδή μια άλλη διεργασία το " -"ανταγωνίζεται. Κατά τη διάρκεια της υπερφόρτωσης ο ρυθμός ανανέωσης του " -"γραφικού ενδιαμέσου μειώνεται και οι εργασίες του παρασκηνίου (υπολογισμός " -"SHA1, μετακίνηση αρχείων) αναβάλλονται." msgid "" "Amount of data per downloading source that gtk-gnutella will buffer before " @@ -2657,28 +3773,22 @@ "displayed using the historical base2 convention with binary prefixes." msgstr "" -#, fuzzy msgid "Debug level for Reliable UDP (RUDP) code." -msgstr "Επίπεδο αποσφαλμάτωσης κώδικα ανταλλαγής αρχείων." +msgstr "" -#, fuzzy msgid "Debug level for the Distributed Hash Table (DHT) code." -msgstr "Επίπεδο αποσφαλμάτωσης κώδικα ανταλλαγής αρχείων." +msgstr "" -#, fuzzy msgid "Debug level for the OOB-proxying of queries." -msgstr "Επίπεδο αποσφαλμάτωσης δυναμικών ερωτημάτων." +msgstr "" msgid "" "If set gtk-gnutella also listens on a local (unix domain) socket which is " "located in ~/.gtk-gnutella/socket." msgstr "" -#, fuzzy msgid "Don't start more than this number of parallel downloads per file." msgstr "" -"Δεν αποστέλλονται περισσότερα από αυτόν τον αριθμό αρχεία παράλληλα σε έναν " -"υπολογιστή." msgid "" "If enabled, all received packets are dumped to $GTK_GNUTELLA_DIR/packets_rx." @@ -2694,57 +3804,43 @@ "of the shared files before a change becomes fully effective." msgstr "" -#, fuzzy msgid "Debug level for the shell." -msgstr "Επίπεδο αποσφαλμάτωσης γραφικού ενδιαμέσου." +msgstr "" msgid "If larger than zero, no downloads are started." msgstr "" -#, fuzzy msgid "Debug level for the search queue." -msgstr "Επίπεδο αποσφαλμάτωσης γραφικού ενδιαμέσου." +msgstr "" -#, fuzzy msgid "Debug level for push-proxy code." -msgstr "Επίπεδο αποσφαλμάτωσης κώδικα HTTP." +msgstr "" -#, fuzzy msgid "Number of THEX file requests received in this session." -msgstr "Αριθμός αιτημάτων εξερεύνησης HTML που λήφθηκαν σε αυτή τη συνεδρία." +msgstr "" -#, fuzzy msgid "Number of THEX file requests fully served in this session." -msgstr "Αριθμός αιτημάτων εξερεύνησης HTML που λήφθηκαν σε αυτή τη συνεδρία." +msgstr "" -#, fuzzy msgid "Debug level for Tigertree-related code." -msgstr "Επίπεδο αποσφαλμάτωσης κόμβων Gnutella." +msgstr "" -#, fuzzy msgid "" "Whether gtk-gnutella is currently computing TTH of shared files in the " "background." msgstr "" -"Αν το gtk-gnutella υπολογίζει τα SHA1 των αρχείων για ανταλλαγή αυτή τη " -"στιγμή στο παρασκήνιο." -#, fuzzy msgid "" "Whether gtk-gnutella is currently verifying the TTH of downloaded files in " "the background." msgstr "" -"Αν το gtk-gnutella εγκρίνει τα SHA1 των ληφθέντων αρχείων αυτή τη στιγμή στο " -"παρασκήνιο." msgid "Maximum number of results to show in any search." msgstr "" "Μέγιστος αριθμός αποτελεσμάτων που εμφανίζονται σε οποιαδήποτε αναζήτηση." -#, fuzzy msgid "Maximum number of results to show in a browse_host request." msgstr "" -"Μέγιστος αριθμός αποτελεσμάτων που εμφανίζονται σε οποιαδήποτε αναζήτηση." msgid "Date of the latest SVN release." msgstr "" @@ -2755,13 +3851,11 @@ msgid "Signature of the latest SVN release notification." msgstr "" -#, fuzzy msgid "Maximum number of hosts in the TLS node cache." -msgstr "Μέγιστος αριθμός υπολογιστών στο συλλέκτη υπερ-κόμβων." +msgstr "" -#, fuzzy msgid "Maximum time before removing hosts from the TLS cache." -msgstr "Μέγιστος αριθμός υπολογιστών στο συλλέκτη υπερ-κόμβων." +msgstr "" msgid "" "If set to TRUE the tigertree root hash (TTH) can be discovered on the fly. " @@ -2775,17 +3869,14 @@ "experience." msgstr "" -#, fuzzy msgid "Maximum number of hosts in the G2 node cache." -msgstr "Μέγιστος αριθμός υπολογιστών στο συλλέκτη υπερ-κόμβων." +msgstr "" -#, fuzzy msgid "Maximum time before removing hosts from the G2 cache." -msgstr "Μέγιστος αριθμός υπολογιστών στο συλλέκτη υπερ-κόμβων." +msgstr "" -#, fuzzy msgid "Debug level for management of G2-only hosts." -msgstr "Επίπεδο αποσφαλμάτωσης διαχείρισης πλέγματος λήψεων." +msgstr "" msgid "" "Whether GTKG can switch among the several files waiting to be downloaded " @@ -2820,21 +3911,17 @@ "files and push-proxies for firewalled hosts. It requires UDP support." msgstr "" -#, fuzzy msgid "Debug level for the callout queue." -msgstr "Επίπεδο αποσφαλμάτωσης ερωτημάτων." +msgstr "" -#, fuzzy msgid "Debug level for DHT node lookups." -msgstr "Επίπεδο αποσφαλμάτωσης κώδικα HTTP." +msgstr "" -#, fuzzy msgid "Debug level for DHT key/value storage." -msgstr "Επίπεδο αποσφαλμάτωσης κώδικα HTTP." +msgstr "" -#, fuzzy msgid "Debug level for DHT key/value publishing." -msgstr "Επίπεδο αποσφαλμάτωσης κώδικα HTTP." +msgstr "" msgid "" "Bandwidth hint for DHT user lookups, in bytes/sec. This is used both for " @@ -2865,9 +3952,8 @@ "closest nodes will keep mutual knowledge about each other" msgstr "" -#, fuzzy msgid "Debug level for the DHT user lookup queue." -msgstr "Επίπεδο αποσφαλμάτωσης γραφικού ενδιαμέσου." +msgstr "" msgid "If TRUE, DHT storage uses memory instead of diskspace." msgstr "" @@ -2889,9 +3975,8 @@ "uploads and push-proxy exchanges." msgstr "" -#, fuzzy msgid "Debug level for (generic) file verification code." -msgstr "Επίπεδο αποσφαλμάτωσης κώδικα ανταλλαγής αρχείων." +msgstr "" msgid "" "Maximum number of hosts in the local address cache, which remembers the " @@ -2903,78 +3988,63 @@ "remembers the recent IP:port combinations we had." msgstr "" -#, fuzzy msgid "Debug level for management of local address cache." -msgstr "Επίπεδο αποσφαλμάτωσης διαχείρισης πλέγματος λήψεων." +msgstr "" msgid "" "If enabled, all packets enqueued for transmission are dumped to " "$GTK_GNUTELLA_DIR/packets_tx.dump." msgstr "" -#, fuzzy msgid "Debug level the TCP message queues" -msgstr "Επίπεδο αποσφαλμάτωσης γραφικού ενδιαμέσου." +msgstr "" -#, fuzzy msgid "Debug level for the UDP message queue." -msgstr "Επίπεδο αποσφαλμάτωσης γραφικού ενδιαμέσου." +msgstr "" msgid "" "Maximum size of the UDP message queue (in bytes). Must be at least 150 " "percent of the maximum message size." msgstr "" -#, fuzzy msgid "Debug level for the management of the clock accuracy." -msgstr "Επίπεδο αποσφαλμάτωσης διαχείρισης πλέγματος λήψεων." +msgstr "" -#, fuzzy msgid "Debug level for the firewalled status management." -msgstr "Επίπεδο αποσφαλμάτωσης διαχείρισης πλέγματος λήψεων." +msgstr "" -#, fuzzy msgid "Debug level for host management." -msgstr "Επίπεδο αποσφαλμάτωσης διαχείρισης πλέγματος λήψεων." +msgstr "" -#, fuzzy msgid "Debug level for DHT root node caching." -msgstr "Επίπεδο αποσφαλμάτωσης κώδικα HTTP." +msgstr "" -#, fuzzy msgid "Logged statistics level for code shared between GUI and core." msgstr "" -"Επίπεδο αποσφαλμάτωσης κώδικα επικοινωνίας γραφικού ενδιαμέσου και πυρήνα." -#, c-format msgid "" "If TRUE, the spam SHA1 database is kept in memory. If FALSE, it is kept in a " "fast disk database, which saves a large amount of core memory and reduces " "the overall footprint, at the cost of an increased I/O level. However, the " -"DB cache has typically a 90% hit rate, so the actual overhead is barely " +"DB cache has a 90 percent hit rate, so the actual overhead is barely " "noticeable when running as an ultra node and should remain completely " "unnoticed when running as a leaf." msgstr "" -#, fuzzy msgid "Debug level for spam detection." -msgstr "Επίπεδο αποσφαλμάτωσης δρομολόγησης μηνυμάτων." +msgstr "" -#, fuzzy msgid "Debug level for lockfile management." -msgstr "Επίπεδο αποσφαλμάτωσης διαχείρισης πλέγματος λήψεων." +msgstr "" -#, fuzzy msgid "Debug level for the zone-based memory allocator." -msgstr "Επίπεδο αποσφαλμάτωσης γραφικού ενδιαμέσου." +msgstr "" -#, fuzzy msgid "Debug level for the pool-based memory allocator." -msgstr "Επίπεδο αποσφαλμάτωσης γραφικού ενδιαμέσου." +msgstr "" -#, fuzzy msgid "Debug level for the RX buffer allocator." -msgstr "Επίπεδο αποσφαλμάτωσης γραφικού ενδιαμέσου." +msgstr "" msgid "" "Whether the zone-based memory allocator should always keep the zones in " @@ -2985,44 +4055,35 @@ "spam_lut_in_memory to FALSE." msgstr "" -#, fuzzy msgid "Debug level for the virtual memory manager." -msgstr "Επίπεδο αποσφαλμάτωσης μηνυμάτων κατασκευαστή." +msgstr "" -#, fuzzy msgid "Debug level for final shutdown." -msgstr "Επίπεδο αποσφαλμάτωσης πληροφοριών αρχείων." +msgstr "" -#, fuzzy msgid "Country preferences" -msgstr "Προτιμήσεις" +msgstr "" -#, fuzzy msgid "Debug level for country limits." -msgstr "Επίπεδο αποσφαλμάτωσης ερωτημάτων." +msgstr "" -#, fuzzy msgid "Whether to log dropped Gnutella messages" -msgstr "Επίπεδο αποσφαλμάτωσης μηνυμάτων Gnutella." +msgstr "" -#, fuzzy msgid "Debug level for whitelist management." -msgstr "Επίπεδο αποσφαλμάτωσης διαχείρισης πλέγματος λήψεων." +msgstr "" -#, fuzzy msgid "Debug level for DHT token caching." -msgstr "Επίπεδο αποσφαλμάτωσης κώδικα HTTP." +msgstr "" -#, fuzzy msgid "Debug level for DHT publishing from Gnutella." -msgstr "Επίπεδο αποσφαλμάτωσης κώδικα HTTP." +msgstr "" msgid "Defines which DHT messages should be traced." msgstr "" -#, fuzzy msgid "Enable bandwidth limitation for outgoing DHT traffic." -msgstr "Ενεργοποίηση περιορισμού εύρους για την εξερχόμενη κυκλοφορία HTTP." +msgstr "" msgid "" "Bandwidth limit for outgoing DHT traffic in bytes/sec. It is always pooled " @@ -3030,35 +4091,26 @@ "enabled, so that UDP queues can flush more quickly." msgstr "" -#, fuzzy msgid "Maximum size of the DHT message queue (in bytes)." msgstr "" -"Μέγιστο μέγεθος μηνυμάτων απαντήσεων αναζήτησης που προωθούνται στους άλλους " -"(σε bytes)." -#, fuzzy msgid "Debug level for bandwidth scheduler." -msgstr "Επίπεδο αποσφαλμάτωσης γραφικού ενδιαμέσου." +msgstr "" -#, fuzzy msgid "Debug level for the DHT stable node recorder." -msgstr "Επίπεδο αποσφαλμάτωσης γραφικού ενδιαμέσου." +msgstr "" -#, fuzzy msgid "Debug level for the file (re)loading, on change." -msgstr "Επίπεδο αποσφαλμάτωσης κώδικα ανταλλαγής αρχείων." +msgstr "" -#, fuzzy msgid "Debug level for the file moving, accross filesystems." -msgstr "Επίπεδο αποσφαλμάτωσης κώδικα ανταλλαγής αρχείων." +msgstr "" -#, fuzzy msgid "Debug level for query hit message generation." -msgstr "Επίπεδο αποσφαλμάτωσης δρομολόγησης μηνυμάτων." +msgstr "" -#, fuzzy msgid "Debug level for version management." -msgstr "Επίπεδο αποσφαλμάτωσης διαχείρισης πλέγματος λήψεων." +msgstr "" msgid "Minimum CPU frequency, in Hz." msgstr "" @@ -3066,9 +4118,8 @@ msgid "Maximum CPU frequency, in Hz." msgstr "" -#, fuzzy msgid "DHT bootstrap status." -msgstr "Στατιστικά κυκλοφορίας _HTTP" +msgstr "" msgid "" "The DHT running mode. An active node will be able to store values and is a " @@ -3083,39 +4134,32 @@ msgid "Current DHT running mode." msgstr "" -#, fuzzy msgid "Debug level for the one-time memory allocator." -msgstr "Επίπεδο αποσφαλμάτωσης γραφικού ενδιαμέσου." +msgstr "" -#, fuzzy msgid "Debug level for the host cache." -msgstr "Επίπεδο αποσφαλμάτωσης γραφικού ενδιαμέσου." +msgstr "" msgid "Random bits." msgstr "" -#, fuzzy msgid "Average servent downtime." -msgstr "Μέσος χρόνος λειτουργίας πελάτη." +msgstr "" msgid "Time when last shutdown occurred." msgstr "" -#, fuzzy msgid "Debug level for alive pings." -msgstr "Επίπεδο αποσφαλμάτωσης πληροφοριών αρχείων." +msgstr "" -#, fuzzy msgid "Debug level for the versatile XML layer." -msgstr "Επίπεδο αποσφαλμάτωσης κυκλοφορίας επιπέδου UDP." +msgstr "" -#, fuzzy msgid "Debug level for the UPnP layer." -msgstr "Επίπεδο αποσφαλμάτωσης κυκλοφορίας επιπέδου UDP." +msgstr "" -#, fuzzy msgid "Debug level for the SOAP layer." -msgstr "Επίπεδο αποσφαλμάτωσης κυκλοφορίας επιπέδου UDP." +msgstr "" msgid "Defines SOAP exchanges tracing type." msgstr "" @@ -3148,9 +4192,8 @@ msgid "Whether gtk-gnutella can install port mappings, if needed." msgstr "" -#, fuzzy msgid "Debug level for the NAT-PMP layer." -msgstr "Επίπεδο αποσφαλμάτωσης κυκλοφορίας επιπέδου UDP." +msgstr "" msgid "" "Whether NAT-PMP (NAT Port Mapping Protocol) should be enabled. Support for " @@ -3167,33 +4210,26 @@ "mappings, if required." msgstr "" -#, fuzzy msgid "Debug level for the TX (transmit) network layer." -msgstr "Επίπεδο αποσφαλμάτωσης κυκλοφορίας επιπέδου UDP." +msgstr "" -#, fuzzy msgid "Debug level for the RX (receive) network layer." -msgstr "Επίπεδο αποσφαλμάτωσης κυκλοφορίας επιπέδου UDP." +msgstr "" -#, fuzzy msgid "Debug level for the I/O input event layer." -msgstr "Επίπεδο αποσφαλμάτωσης κυκλοφορίας επιπέδου UDP." +msgstr "" -#, fuzzy msgid "Debug level for the background task scheduler." -msgstr "Επίπεδο αποσφαλμάτωσης γραφικού ενδιαμέσου." +msgstr "" -#, fuzzy msgid "Whether gtk-gnutella was able to configure port mappings." -msgstr "Αν το gtk-gnutella πιστεύει ότι είναι συνδεδεμένο στο διαδίκτυο." +msgstr "" -#, fuzzy msgid "Whether gtk-gnutella disabled HTTP bandwidth stealing." -msgstr "Αν το gtk-gnutella πιστεύει ότι είναι συνδεδεμένο στο διαδίκτυο." +msgstr "" -#, fuzzy msgid "Whether gtk-gnutella ignores HTTP stolen bandwidth." -msgstr "Αν το gtk-gnutella πιστεύει ότι είναι συνδεδεμένο στο διαδίκτυο." +msgstr "" msgid "Whether gtk-gnutella enforces uniform HTTP outgoing bandwidth." msgstr "" @@ -3203,9 +4239,8 @@ "order to decrease downloading latency." msgstr "" -#, fuzzy msgid "Maximum chunk size when swarming with HTTP pipelining." -msgstr "Μέγιστο μέγεθος κομματιού κατά την εξάπλωση." +msgstr "" msgid "" "Whether the Gnutella UDP Extension for Scalable Searches (GUESS) should be " @@ -3227,25 +4262,20 @@ "Searches)." msgstr "" -#, fuzzy msgid "Maximum number of IPv4 hosts in the regular GUESS cache." -msgstr "Μέγιστος αριθμός υπολογιστών στο συλλέκτη κανονικών κόμβων." +msgstr "" -#, fuzzy msgid "Current number of IPv4 hosts in the regular GUESS cache." -msgstr "Αριθμός υπολογιστών στις λανθάνουσες μνήμες συνήθων κόμβων." +msgstr "" -#, fuzzy msgid "Maximum number of IPv4 hosts in the introduction GUESS cache." -msgstr "Μέγιστος αριθμός υπολογιστών στο συλλέκτη υπερ-κόμβων." +msgstr "" -#, fuzzy msgid "Current number of IPv4 hosts in the introduction GUESS cache." -msgstr "Αριθμός υπολογιστών στις λανθάνουσες μνήμες υπερ-κόμβων." +msgstr "" -#, fuzzy msgid "Debug level for the DB disk/RAM storage layer." -msgstr "Επίπεδο αποσφαλμάτωσης κυκλοφορίας επιπέδου UDP." +msgstr "" msgid "" "The current Session ID. This is a unique ID generated each time gtk-" @@ -3273,13 +4303,11 @@ "overall" msgstr "" -#, fuzzy msgid "Debug level for the matching code." -msgstr "Επίπεδο αποσφαλμάτωσης κώδικα απαγορεύσεων." +msgstr "" -#, fuzzy msgid "Debug level for the time synchronization code." -msgstr "Επίπεδο αποσφαλμάτωσης κώδικα ανταλλαγής αρχείων." +msgstr "" msgid "" "Whether queries can request partial results hits, i.e. files which are " @@ -3292,9 +4320,8 @@ "are returned." msgstr "" -#, fuzzy msgid "Whether what's-new? queries should be answered to." -msgstr "Αν πρέπει να εμφανίζεται οι μέτρηση των μεταφερόμενων ερωτημάτων." +msgstr "" msgid "" "When set, gtk-gnutella will automatically stop opened searches from which " @@ -3302,165 +4329,240 @@ "configured expiration time." msgstr "" -#, fuzzy msgid "Maximum number of results to show in a What's New? request." msgstr "" -"Μέγιστος αριθμός αποτελεσμάτων που εμφανίζονται σε οποιαδήποτε αναζήτηση." -#, fuzzy msgid "Maximum number of results to show in a passive search request." msgstr "" -"Μέγιστος αριθμός αποτελεσμάτων που εμφανίζονται σε οποιαδήποτε αναζήτηση." -#, fuzzy msgid "Whether to log duplicate Gnutella messages from same node." -msgstr "Επίπεδο αποσφαλμάτωσης μηνυμάτων Gnutella." +msgstr "" -#, fuzzy msgid "Whether to log duplicate Gnutella messages with a higher TTL." -msgstr "Επίπεδο αποσφαλμάτωσης μηνυμάτων Gnutella." +msgstr "" -#, fuzzy msgid "Whether to log duplicate Gnutella messages (not from same node)." -msgstr "Επίπεδο αποσφαλμάτωσης μηνυμάτων Gnutella." +msgstr "" -#, fuzzy msgid "Whether to log new Gnutella messages, never seen before." -msgstr "Επίπεδο αποσφαλμάτωσης μηνυμάτων Gnutella." +msgstr "" -#, fuzzy msgid "Whether to log Gnutella routing decisions." -msgstr "Επίπεδο αποσφαλμάτωσης μηνυμάτων Gnutella." +msgstr "" -#, fuzzy msgid "Whether to log bad Gnutella messages, corrupted or unexpected." -msgstr "Επίπεδο αποσφαλμάτωσης μηνυμάτων Gnutella." +msgstr "" msgid "Whether to log conditions triggering query hit spam flagging." msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the ultra node cache." -msgstr "Μέγιστος αριθμός υπολογιστών στο συλλέκτη υπερ-κόμβων." +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in ultra node caches." -msgstr "Αριθμός υπολογιστών στις λανθάνουσες μνήμες υπερ-κόμβων." +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in the regular GUESS cache." -msgstr "Αριθμός υπολογιστών στις λανθάνουσες μνήμες συνήθων κόμβων." +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in the introduction GUESS cache." -msgstr "Αριθμός υπολογιστών στις λανθάνουσες μνήμες υπερ-κόμβων." +msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the regular GUESS cache." -msgstr "Μέγιστος αριθμός υπολογιστών στο συλλέκτη κανονικών κόμβων." +msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the introduction GUESS cache." -msgstr "Μέγιστος αριθμός υπολογιστών στο συλλέκτη υπερ-κόμβων." +msgstr "" -#, fuzzy msgid "Debug level for the malloc() replacement allocator." -msgstr "Επίπεδο αποσφαλμάτωσης γραφικού ενδιαμέσου." +msgstr "" -#, fuzzy msgid "Debug level for bad query hit messages." -msgstr "Επίπεδο αποσφαλμάτωσης δρομολόγησης μηνυμάτων." +msgstr "" -#, fuzzy msgid "Debug level for GUID management." -msgstr "Επίπεδο αποσφαλμάτωσης διαχείρισης πλέγματος λήψεων." +msgstr "" -msgid "disable" -msgstr "απενεργοποίηση" +msgid "Debug level for the TX (transmit) deflating network layer." +msgstr "" -msgid "by words" -msgstr "ανά λέξεις" +msgid "Comma-separated list of TX debugging hosts (IP addresses only)" +msgstr "" -msgid "by whole query" -msgstr "ανά ολόκληρο το ερώτημα" +msgid "" +"Comma-separated list of hosts for whom we want to dump RX traffic (IP " +"addresses only)" +msgstr "" -msgid "by router" -msgstr "ανά δρομολογητή" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they emit " +"(IP addresses only)" +msgstr "" -msgid "TCP & UDP" -msgstr "TCP & UDP" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they " +"receive (IP addresses only)" +msgstr "" -msgid "TCP only" -msgstr "μόνο TCP" +msgid "" +"Allow GUESS to use some of the unused Gnutella outgoing bandwidth regardless " +"of the GUESS bandwidth hint. If FALSE, only the configured bandwidth hint " +"will be used. When running as a leaf this should be set to TRUE to make " +"GUESS queries run faster." +msgstr "" -msgid "UDP only" -msgstr "μόνο UDP" +msgid "Debug level for the UDP TX scheduler." +msgstr "" -msgid "Ping" -msgstr "Ping" +msgid "" +"Debugging flags for the semi-reliable UDP TX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: transmissions, 16: timeouts." +msgstr "" -msgid "Pong" -msgstr "Pong" +msgid "Comma-separated list of RX debugging hosts (IP addresses only)" +msgstr "" -msgid "Bye" -msgstr "Αντίο" +msgid "" +"Debugging flags for the semi-reliable UDP RX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: receptions, 16: timeouts." +msgstr "" -msgid "QRP" -msgstr "QRP" +msgid "Whether to log sent semi-reliable UDP messages." +msgstr "" -msgid "HSEP" -msgstr "HSEP" +msgid "Whether to log received semi-reliable UDP messages." +msgstr "" -#, fuzzy -msgid "RUDP" -msgstr "UDP" +msgid "Debug level for the secured OOB query hit claiming." +msgstr "" -msgid "Vendor spec." -msgstr "Προδ/φές Κατασκευαστή" +msgid "Whether to log sent vendor messages." +msgstr "" -msgid "Vendor std." +msgid "Whether to log received vendor messages." msgstr "" -msgid "Push" -msgstr "Ώθηση" +msgid "Debugging flags for the DHT token cache (developers only)." +msgstr "" -msgid "Query" -msgstr "Ερώτημα" +msgid "Whether to log weird DHT message headers when debugging." +msgstr "" -#, fuzzy -msgid "Query Hit" -msgstr "Χτύπημα ερωτήματος" +msgid "Debug level for the DHT Remote Procedure Call (RPC) code." +msgstr "" -#, fuzzy -msgid "DHT Ping" -msgstr "Ping" +msgid "Whether to log UHC pings we receive." +msgstr "" -#, fuzzy -msgid "DHT Pong" -msgstr "Pong" +msgid "Whether to log UHC pings we emit." +msgstr "" -#, fuzzy -msgid "DHT Store" -msgstr "Κυκλοφορία HTTP" +msgid "Whether the program was properly shutdown." +msgstr "" -msgid "DHT Store Ack" +msgid "Whether the program restarted after a clean shutdown." msgstr "" -msgid "DHT Find Node" +msgid "Debug level for DHT key management." msgstr "" -msgid "DHT Found Node" +msgid "Debug level for DHT value management." msgstr "" -msgid "DHT Find Value" +msgid "ID of the current process." msgstr "" -#, fuzzy -msgid "DHT Value" -msgstr "Τιμή" +msgid "Debug level for HTTP range parsing / handling." +msgstr "" -msgid "Total" -msgstr "Σύνολο" +msgid "" +"Lease time when installing port mappings via UPnP or NAT-PMP, in seconds. A " +"value of 0 requests permanent mappings." +msgstr "" + +msgid "Whether the program is auto-restarting at the user's request." +msgstr "" + +msgid "Debug level for time management." +msgstr "" + +msgid "Debug level for the tmalloc() thread-magazine object distributor." +msgstr "" + +msgid "Debug level for the event queue thread." +msgstr "" + +msgid "Maximum number of G2 hubs in the hub cache." +msgstr "" + +msgid "Current number of IPv4 hosts in the G2 hub caches." +msgstr "" + +msgid "Whether the G2 protocol should be enabled." +msgstr "" + +msgid "Number of G2 nodes currently connected." +msgstr "" + +msgid "Maximum amount of G2 hubs we should connect to as a leaf." +msgstr "" + +msgid "Whether to log bad G2 messages, corrupted or unexpected." +msgstr "" + +msgid "Whether to log dropped G2 messages" +msgstr "" + +msgid "Debug level for the G2 RPC layer." +msgstr "" + +msgid "Whether to log summary of received query hits" +msgstr "" + +msgid "Whether to log summary of each record in received query hits" +msgstr "" + +msgid "Number of G2 browsing requests received in this session." +msgstr "" + +msgid "Number of G2 browsing requests fully served in this session." +msgstr "" + +msgid "Whether to log G2 messages we're attempting to send" +msgstr "" + +msgid "" +"Timestamp at which the current session was started. This stamp remains " +"unchanged when gtk-gnutella restarts after a crash or an explicit restart " +"request." +msgstr "" + +msgid "No TCP listening socket bound to allow incoming connections." +msgstr "" + +msgid "disable" +msgstr "απενεργοποίηση" + +msgid "by words" +msgstr "ανά λέξεις" + +msgid "by whole query" +msgstr "ανά ολόκληρο το ερώτημα" + +msgid "by router" +msgstr "ανά δρομολογητή" + +msgid "TCP & UDP" +msgstr "TCP & UDP" + +msgid "TCP only" +msgstr "μόνο TCP" + +msgid "UDP only" +msgstr "μόνο UDP" + +msgid "Query Hit" +msgstr "" msgid "Icons" msgstr "Εικονίδια" @@ -3474,9 +4576,8 @@ msgid "Both (horizontal)" msgstr "Και τα δύο (οριζόντια)" -#, fuzzy msgid "This session" -msgstr "Συμπίεση TX" +msgstr "" msgid "1 hour" msgstr "" @@ -3518,13 +4619,11 @@ msgid "Widths of the columns in the file info table." msgstr "Πλάτη των στηλών στον πίνακα πληροφοριών αρχείου." -#, fuzzy msgid "Visibility of the columns in the file info table." -msgstr "Πλάτη των στηλών στον πίνακα πληροφοριών αρχείου." +msgstr "" -#, fuzzy msgid "Widths of the columns in the sources table." -msgstr "Πλάτη των στηλών στον πίνακα κόμβων." +msgstr "" msgid "Widths of the columns in the search list on the sidebar." msgstr "Πλάτη των στηλών στη λίστα αναζήτησης στον πλαϊνό πίνακα." @@ -3604,16 +4703,14 @@ msgid "Show tabs or search list." msgstr "Εμφάνιση καρτελών στη λίστα αναζήτησης." -#, fuzzy msgid "Display Searchbar." -msgstr "Εμφάνιση πλαϊνού πίνακα." +msgstr "" msgid "Display Sidebar." msgstr "Εμφάνιση πλαϊνού πίνακα." -#, fuzzy msgid "Display Menu." -msgstr "Εμφάνιση" +msgstr "" msgid "Display statusbar." msgstr "Εμφάνιση γραμμής κατάστασης." @@ -3891,26 +4988,20 @@ "newer)." msgstr "" -#, fuzzy msgid "Automatically hide DHT bandwidth display when DHT not enabled." msgstr "" -"Αυτόματη απόκρυψη εμφάνισης δικτυακού εύρους όταν δεν τρέχει ως υπερ-κόμβος." -#, fuzzy msgid "Display incoming DHT traffic bandwidth usage." -msgstr "Εμφάνιση χρήσης εύρους εισερχόμενης κυκλοφορίας HTTP." +msgstr "" -#, fuzzy msgid "Display outgoing DHT traffic bandwidth usage." -msgstr "Εμφάνιση χρήσης εύρους εξερχόμενης κυκλοφορίας HTTP." +msgstr "" -#, fuzzy msgid "Display incoming DHT traffic bandwidth as an average." -msgstr "Εμφάνιση μέσου εύρους εισερχόμενης κυκλοφορίας HTTP." +msgstr "" -#, fuzzy msgid "Display outgoing DHT traffic bandwidth as an average." -msgstr "Εμφάνιση μέσου εύρους εξερχόμενης κυκλοφορίας HTTP." +msgstr "" msgid "" "Remote nodes supporting media type filtering will apply your query " @@ -3940,7 +5031,7 @@ msgstr "" msgid "" -"Discard search results whith an alien IP address, not matching the one from " +"Discard search results with an alien IP address, not matching the one from " "which the results come from." msgstr "" @@ -3949,6 +5040,17 @@ "be restarted when gtk-gnutella is launched." msgstr "" +msgid "Discard search results coming from servents with a banned GUID." +msgstr "" + +msgid "Whether a summary line with GUESS search stats should be displayed." +msgstr "" + +msgid "" +"Whether the GUESS summary line should show total statistics or ones " +"pertaining to the current search only." +msgstr "" + msgid "Anonymizing proxies" msgstr "Διαμεσολαβητές ανωνυμίας" @@ -3988,9 +5090,8 @@ msgid "Antarctica" msgstr "" -#, fuzzy msgid "Argentina" -msgstr "Αρμενία" +msgstr "" msgid "American Samoa" msgstr "Αμερικανική Σαμόα" @@ -4004,13 +5105,11 @@ msgid "Aruba" msgstr "" -#, fuzzy msgid "Åland Islands" -msgstr "Νήσοι Κάιμαν" +msgstr "" -#, fuzzy msgid "Azerbaijan" -msgstr "Αζερμπαϊτζάν, Δημοκρατία του" +msgstr "" msgid "Bosnia and Herzegovina" msgstr "Βοσνία-Ερζεγοβίνη" @@ -4036,9 +5135,11 @@ msgid "Burundi" msgstr "" -#, fuzzy msgid "Benin" -msgstr "Επανένωση" +msgstr "" + +msgid "Saint Barthelemy" +msgstr "" msgid "Bermuda" msgstr "Βερμούδες" @@ -4049,6 +5150,9 @@ msgid "Bolivia" msgstr "" +msgid "Bonaire, Sint Eustatius and Saba" +msgstr "" + msgid "Brazil" msgstr "" @@ -4058,9 +5162,11 @@ msgid "Bhutan" msgstr "" -#, fuzzy +msgid "Burma" +msgstr "" + msgid "Bouvet Island" -msgstr "Νήσοι Κουκ" +msgstr "" msgid "Botswana" msgstr "" @@ -4077,16 +5183,14 @@ msgid "Cocos (Keeling) Islands" msgstr "" -#, fuzzy msgid "Congo (Democratic Republic)" -msgstr "Κονγκό, Δημοκρατία του" +msgstr "" msgid "Central African Republic" msgstr "Δημοκρατία Κεντρικής Αφρικής" -#, fuzzy msgid "Congo" -msgstr "Pong" +msgstr "" msgid "Switzerland" msgstr "" @@ -4097,9 +5201,8 @@ msgid "Cook Islands" msgstr "Νήσοι Κουκ" -#, fuzzy msgid "Chile" -msgstr "αρχείο" +msgstr "" msgid "Cameroon" msgstr "" @@ -4110,9 +5213,8 @@ msgid "Colombia" msgstr "" -#, fuzzy msgid "Costa Rica" -msgstr "Κόστα Ρίκα, Δημοκρατία της" +msgstr "" msgid "Serbia and Montenegro" msgstr "Σερβία-Μαυροβούνιο" @@ -4123,6 +5225,9 @@ msgid "Cape Verde" msgstr "" +msgid "Curacao" +msgstr "" + msgid "Christmas Island" msgstr "Νησιά Χριστουγέννων" @@ -4141,9 +5246,8 @@ msgid "Denmark" msgstr "" -#, fuzzy msgid "Dominica" -msgstr "Δομινικανή Δημοκρατία" +msgstr "" msgid "Dominican Republic" msgstr "Δομινικανή Δημοκρατία" @@ -4166,9 +5270,8 @@ msgid "Eritrea" msgstr "Ερυθραία" -#, fuzzy msgid "Spain" -msgstr "Κενό" +msgstr "" msgid "Ethiopia" msgstr "Αιθιοπία" @@ -4176,9 +5279,8 @@ msgid "Europe" msgstr "Ευρώπη" -#, fuzzy msgid "Finland" -msgstr "Γροιλανδία" +msgstr "" msgid "Fiji" msgstr "" @@ -4189,20 +5291,17 @@ msgid "Micronesia" msgstr "" -#, fuzzy msgid "Faroe Islands" -msgstr "Νήσοι Κουκ" +msgstr "" -#, fuzzy msgid "France" -msgstr "Άκυρο" +msgstr "" msgid "Gabon" msgstr "" -#, fuzzy msgid "United Kingdom" -msgstr "Σουηδία, Βασίλειο της" +msgstr "" msgid "Grenada" msgstr "Γρενάδα" @@ -4213,9 +5312,8 @@ msgid "French Guiana" msgstr "Γαλλική Γουιάνα" -#, fuzzy msgid "Guernsey" -msgstr "Γερμανία" +msgstr "" msgid "Ghana" msgstr "" @@ -4226,28 +5324,23 @@ msgid "Greenland" msgstr "Γροιλανδία" -#, fuzzy msgid "Gambia" -msgstr "Ναμίμπια" +msgstr "" -#, fuzzy msgid "Guinea" -msgstr "Γενικά" +msgstr "" -#, fuzzy msgid "Guadeloupe" -msgstr "Γουαδελούπη" +msgstr "" -#, fuzzy msgid "Equatorial Guinea" -msgstr "Ισημερινή Γουινέα, Δημοκρατία της" +msgstr "" msgid "Greece" msgstr "" -#, fuzzy msgid "South Georgia and The South Sandwich Islands" -msgstr "Νότια Γεωργία και Νότιοι Νήσοι Σάντουιτς." +msgstr "" msgid "Guatemala" msgstr "" @@ -4255,9 +5348,8 @@ msgid "Guam" msgstr "" -#, fuzzy msgid "Guinea-Bissau" -msgstr "Γουινέα Μπισάου, Δημοκρατία της" +msgstr "" msgid "Guyana" msgstr "" @@ -4265,20 +5357,17 @@ msgid "Hong Kong" msgstr "" -#, fuzzy msgid "Heard Island and McDonald Islands" -msgstr "Νήσοι Χερντ και Μακντόναλντ" +msgstr "" msgid "Honduras" msgstr "" -#, fuzzy msgid "Croatia" -msgstr "Λετονία" +msgstr "" -#, fuzzy msgid "Haiti" -msgstr "Αναμονή" +msgstr "" msgid "Hungary" msgstr "" @@ -4289,9 +5378,8 @@ msgid "Ireland" msgstr "Ιρλανδία" -#, fuzzy msgid "Israel" -msgstr "Ιρλανδία" +msgstr "" msgid "Isle of Man" msgstr "" @@ -4299,20 +5387,17 @@ msgid "India" msgstr "" -#, fuzzy msgid "British Indian Ocean Territory" -msgstr "Περιοχή Ωκεανού Βρετανικών Ινδιών (Αρχιπέλαγος Άγος)" +msgstr "" msgid "Iraq" msgstr "" -#, fuzzy msgid "Iran" -msgstr "Ιρλανδία" +msgstr "" -#, fuzzy msgid "Iceland" -msgstr "Ιρλανδία" +msgstr "" msgid "Italy" msgstr "" @@ -4335,9 +5420,8 @@ msgid "Kyrgyzstan" msgstr "" -#, fuzzy msgid "Cambodia" -msgstr "Ναμίμπια" +msgstr "" msgid "Kiribati" msgstr "" @@ -4360,24 +5444,20 @@ msgid "Cayman Islands" msgstr "Νήσοι Κάιμαν" -#, fuzzy msgid "Kazakhstan" -msgstr "Καζακστάν, Δημοκρατία του" +msgstr "" msgid "Laos" msgstr "" -#, fuzzy msgid "Lebanon" -msgstr "Αιτία" +msgstr "" -#, fuzzy msgid "Saint Lucia" -msgstr "Αγία Λουκία" +msgstr "" -#, fuzzy msgid "Liechtenstein" -msgstr "Λιχτενστάιν, Πριγκιπάτο του" +msgstr "" msgid "Sri Lanka" msgstr "" @@ -4403,35 +5483,29 @@ msgid "Morocco" msgstr "" -#, fuzzy msgid "Monaco" -msgstr "Επίβλεψη" +msgstr "" msgid "Moldova" msgstr "" -#, fuzzy msgid "Montenegro" -msgstr "Σερβία-Μαυροβούνιο" +msgstr "" -#, fuzzy msgid "Saint Martin" -msgstr "Άγιος Μαρίνος, Δημοκρατία του" +msgstr "" -#, fuzzy msgid "Madagascar" -msgstr "Μαδαγασκάρη, Δημοκρατία της" +msgstr "" msgid "Marshall Islands" msgstr "Νήσοι Μάρσαλ" -#, fuzzy msgid "Macedonia" -msgstr "Νέα Καληδονία" +msgstr "" -#, fuzzy msgid "Mali" -msgstr "Μαλαισία" +msgstr "" msgid "Myanmar" msgstr "" @@ -4448,16 +5522,14 @@ msgid "Martinique" msgstr "" -#, fuzzy msgid "Mauritania" -msgstr "Μαυρίκιος" +msgstr "" msgid "Montserrat" msgstr "" -#, fuzzy msgid "Malta" -msgstr "Μαλαισία" +msgstr "" msgid "Mauritius" msgstr "Μαυρίκιος" @@ -4465,9 +5537,8 @@ msgid "Maldives" msgstr "" -#, fuzzy msgid "Malawi" -msgstr "Μαλαισία" +msgstr "" msgid "Mexico" msgstr "" @@ -4496,9 +5567,8 @@ msgid "Nicaragua" msgstr "" -#, fuzzy msgid "Netherlands" -msgstr "Ολλανδικές Αντίλλες" +msgstr "" msgid "Norway" msgstr "" @@ -4518,13 +5588,11 @@ msgid "Oman" msgstr "" -#, fuzzy msgid "Panama" -msgstr "Καναδάς" +msgstr "" -#, fuzzy msgid "Peru" -msgstr "Κόμβος:" +msgstr "" msgid "French Polynesia" msgstr "Γαλλική Πολυνησία" @@ -4535,13 +5603,11 @@ msgid "Philippines" msgstr "" -#, fuzzy msgid "Pakistan" -msgstr "Τατζικιστάν" +msgstr "" -#, fuzzy msgid "Poland" -msgstr "Ιρλανδία" +msgstr "" msgid "Saint Pierre and Miquelon" msgstr "" @@ -4552,13 +5618,11 @@ msgid "Puerto Rico" msgstr "Πουέρτο Ρίκο" -#, fuzzy msgid "Palestinian Territory" -msgstr "Παλαιστίνη, Κατεχόμενη" +msgstr "" -#, fuzzy msgid "Portugal" -msgstr "Σύνολο" +msgstr "" msgid "Palau" msgstr "" @@ -4575,27 +5639,23 @@ msgid "Romania" msgstr "" -#, fuzzy msgid "Serbia" -msgstr "Γεωργία" +msgstr "" msgid "Russian Federation" msgstr "Ρωσική Ομοσπονδία" -#, fuzzy msgid "Rwanda" -msgstr "Καναδάς" +msgstr "" -#, fuzzy msgid "Saudi Arabia" -msgstr "Σαουδική Αραβία, Βασίλειο της" +msgstr "" msgid "Solomon Islands" msgstr "Νήσοι Σολωμόντα" -#, fuzzy msgid "Seychelles" -msgstr "Αναζητήσεις" +msgstr "" msgid "Sudan" msgstr "" @@ -4603,13 +5663,11 @@ msgid "Sweden" msgstr "" -#, fuzzy msgid "Singapore" -msgstr "παράβλεψη" +msgstr "" -#, fuzzy msgid "Saint Helena" -msgstr "Αγία Ελένη" +msgstr "" msgid "Slovenia" msgstr "Σλοβενία" @@ -4617,35 +5675,35 @@ msgid "Svalbard and Jan Mayen" msgstr "" -#, fuzzy msgid "Slovakia" -msgstr "Σλοβενία" +msgstr "" -#, fuzzy msgid "Sierra Leone" -msgstr "Σιέρα Λεόνε, Δημοκρατία της" +msgstr "" -#, fuzzy msgid "San Marino" -msgstr "Άγιος Μαρίνος, Δημοκρατία του" +msgstr "" -#, fuzzy msgid "Senegal" -msgstr "Γενικά" +msgstr "" msgid "Somalia" msgstr "" -#, fuzzy msgid "Suriname" -msgstr "όνομα" +msgstr "" + +msgid "South Sudan" +msgstr "" msgid "Sao Tome and Principe" msgstr "" -#, fuzzy msgid "El Salvador" -msgstr "Ελ Σαλβαδόρ, Δημοκρατία του" +msgstr "" + +msgid "Sint Maarten" +msgstr "" msgid "Syrian Arab Republic" msgstr "Συρία, Αραβική Δημοκρατία της" @@ -4680,27 +5738,23 @@ msgid "Turkmenistan" msgstr "Τουρκμενιστάν" -#, fuzzy msgid "Tunisia" -msgstr "Τουρκμενιστάν" +msgstr "" -#, fuzzy msgid "Tonga" -msgstr "Pong" +msgstr "" msgid "Turkey" msgstr "" -#, fuzzy msgid "Trinidad and Tobago" -msgstr "Τρίνινταντ και Τομπάγκο, Δημοκρατία του" +msgstr "" msgid "Tuvalu" msgstr "" -#, fuzzy msgid "Taiwan" -msgstr "Τατζικιστάν" +msgstr "" msgid "Tanzania" msgstr "" @@ -4708,16 +5762,14 @@ msgid "Ukraine" msgstr "Ουκρανία" -#, fuzzy msgid "Uganda" -msgstr "Καναδάς" +msgstr "" msgid "United States Minor Outlying Islands" msgstr "" -#, fuzzy msgid "United States" -msgstr "Ηνωμένες Πολιτείες Αμερικής" +msgstr "" msgid "Uruguay" msgstr "" @@ -4728,9 +5780,8 @@ msgid "Holy See (Vatican City State)" msgstr "Βατικανό, Πολιτεία του" -#, fuzzy msgid "Saint Vincent and The Grenadines" -msgstr "Άγιος Βικέντιος και Γρεναδίνες" +msgstr "" msgid "Venezuela" msgstr "" @@ -4738,9 +5789,8 @@ msgid "British Virgin Islands" msgstr "Βρετανικές Παρθένοι Νήσοι" -#, fuzzy msgid "U.S. Virgin Islands" -msgstr "Παρθένοι Νήσοι ΗΠΑ" +msgstr "" msgid "Viet Nam" msgstr "" @@ -4760,13 +5810,11 @@ msgid "Mayotte" msgstr "" -#, fuzzy msgid "South Africa" -msgstr "Νότια Αφρική, Δημοκρατία της" +msgstr "" -#, fuzzy msgid "Zambia" -msgstr "Ναμίμπια" +msgstr "" msgid "Zimbabwe" msgstr "Ζιμπάμπουε" @@ -4814,22 +5862,17 @@ msgid "locale_get_language|en" msgstr "el" -#, fuzzy msgid "unofficial build, accessing files from" msgstr "" -"Αυτή είναι ανεπίσημη έκδοση που έχει πρόσβαση στα αρχεία αυτού του καταλόγου:" -#, fuzzy msgid "URL missing" -msgstr "Λείπει η τιμή" +msgstr "" -#, fuzzy msgid "The download could not be created" -msgstr "Δεν υπάρχει υποδοχή λήψης (δημιουργία)" +msgstr "" -#, fuzzy msgid "Download added" -msgstr "Λήφθηκαν:" +msgstr "" msgid "Unknown operation" msgstr "Άγνωστη διαδικασία" @@ -4837,9 +5880,8 @@ msgid "Unknown command" msgstr "Άγνωστη εντολή" -#, fuzzy msgid "No help available" -msgstr "Μη διαθέσιμο" +msgstr "" msgid "Hops" msgstr "" @@ -4861,45 +5903,45 @@ msgid "Horizon size via HSEP node %s (%s):" msgstr "Μέγεθος ορίζοντα μέσω κόμβου HSEP %s (%s):" -#, fuzzy msgid "Interactive mode turned on." -msgstr "Ανενεργές πηγές" +msgstr "" -#, fuzzy msgid "Interactive mode turned off." -msgstr "Ανενεργές πηγές" +msgstr "" + +#, c-format +msgid "Unknown operation \"show %s\"" +msgstr "" + +#, c-format +msgid "Unknown operation \"%s\"" +msgstr "" -#, fuzzy msgid "Cannot determine current working directory" -msgstr "Δεν είναι δυνατή η εύρεση του αρχικού καταλόγου σας!" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Unknown logfile name \"%s\"" -msgstr "Άγνωστη ιδιότητα" +msgstr "" -#, fuzzy msgid "Unable to reopen" -msgstr "Αδυναμία αποστολής GIV" +msgstr "" #, c-format msgid "Could not rename logfile as \"%s\": %m" msgstr "" -#, fuzzy, c-format -msgid "Unknown operation \"%s\"" -msgstr "Άγνωστη διαδικασία" - -#, fuzzy, c-format -msgid "Unknown operation \"show %s\"" -msgstr "Άγνωστη διαδικασία" - -#, fuzzy, c-format +#, c-format msgid "Unknown operation \"stats %s\"" -msgstr "Άγνωστη διαδικασία" +msgstr "" + +#, c-format +msgid "Unknown operation \"check %s\"" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Unknown operation \"usage %s\"" -msgstr "Άγνωστη διαδικασία" +msgstr "" msgid "Invalid IP/Port" msgstr "Λανθασμένη IP/Θύρα" @@ -4907,26 +5949,24 @@ msgid "Node added" msgstr "Προστέθηκε κόμβος" -#, fuzzy msgid "Invalid IP" -msgstr "Λανθασμένη IP/Θύρα" +msgstr "" -#, fuzzy msgid "Invalid port" -msgstr "Λανθασμένη IP/Θύρα" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Removed %u node" msgid_plural "Removed %u nodes" -msgstr0 "Αφαιρέθηκε %u λήψη" -msgstr1 "Αφαιρέθηκαν %u λήψεις" +msgstr0 "" +msgstr1 "" msgid "Property missing" msgstr "Λείπει ιδιότητα" -#, fuzzy, c-format +#, c-format msgid "Unknown property \"%s\"" -msgstr "Άγνωστη ιδιότητα" +msgstr "" msgid "Value: " msgstr "Τιμή: " @@ -4940,19 +5980,20 @@ msgid "Good bye" msgstr "Αντίο" +msgid "Invalid command syntax" +msgstr "" + msgid "Query string missing" msgstr "Λείπει η συμβολοσειρά ερωτήματος" -#, fuzzy msgid "Query string is not UTF-8 encoded" -msgstr "Το ερώτημα SHA1 δεν είναι κωδικοποιημένο σε UTF-8" +msgstr "" msgid "Search added" msgstr "Προστέθηκε αναζήτηση" -#, fuzzy msgid "The search could not be created" -msgstr "Δεν υπάρχει υποδοχή λήψης (δημιουργία)" +msgstr "" msgid "Unknown property" msgstr "Άγνωστη ιδιότητα" @@ -4960,6 +6001,9 @@ msgid "Value missing" msgstr "Λείπει η τιμή" +msgid "Property cannot be changed" +msgstr "" + #, c-format msgid "Previous value was %s" msgstr "" @@ -4980,82 +6024,37 @@ msgid "unterminated single-quoted string" msgstr "" -msgid "Invalid command syntax" +msgid "too many arguments in command" msgstr "" -msgid "too many arguments in command" +#, c-format +msgid "un-parseable argument #%u in command" msgstr "" msgid "Malformed command" msgstr "Παραμορφωμένη εντολή" -#, fuzzy, c-format +#, c-format msgid "Unknown command: \"%s\"" -msgstr "Άγνωστη εντολή" +msgstr "" msgid "Help: " msgstr "Βοήθεια: " -msgid "Bitzi|Unknown" -msgstr "Άγνωστο" - -#, fuzzy -msgid "Bitzi|Unrated" -msgstr "Υποτιμημένο" - -msgid "Bitzi|Bitzi lookup failure" -msgstr "" - -msgid "Bitzi|Filesize mismatch" -msgstr "" - -msgid "Bitzi|Dangerous/Misleading" -msgstr "Επικίνδυνο/Παραπλανητικό" - -msgid "Bitzi|Incomplete/Damaged" -msgstr "Ανολοκλήρωτο/Κατεστραμμένο" - -msgid "Bitzi|Substandard" -msgstr "Υποδεέστερο" - -msgid "Bitzi|Overrated" -msgstr "Υπερεκτιμημένο" - -msgid "Bitzi|Normal" -msgstr "Κανονικό" - -msgid "Bitzi|Underrated" -msgstr "Υποτιμημένο" - -msgid "Bitzi|Complete" -msgstr "Ολοκληρωμένο" - -msgid "Bitzi|Recommended" -msgstr "Προτεινόμενο" - -msgid "Bitzi|Best Version" -msgstr "Καλύτερη Έκδοση" - -msgid "No other data" -msgstr "Όχι άλλα δεδομένα" - msgid "Filename" msgstr "Όνομα αρχείου" -#, fuzzy msgid "Created" -msgstr "Ολοκληρώθηκε" +msgstr "" msgid "Modified" msgstr "" -#, fuzzy msgid "SHA-1" -msgstr "SHA1:" +msgstr "" -#, fuzzy msgid "Not available" -msgstr "Μη διαθέσιμο" +msgstr "" msgid "Bitprint" msgstr "" @@ -5067,10 +6066,16 @@ msgid "Tigertree" msgstr "" -msgid "External metadata" +msgid "Rescheduled for" msgstr "" -msgid "Bitzi URL" +msgid "Restartable since" +msgstr "" + +msgid "rescheduled for" +msgstr "" + +msgid "restartable since" msgstr "" #, c-format @@ -5115,9 +6120,8 @@ msgid "Reading headers" msgstr "Ανάγνωση κεφαλίδων" -#, fuzzy msgid "UDP push sent" -msgstr "Ώθηση εστάλη" +msgstr "" msgid "Searching for new push-proxies" msgstr "" @@ -5144,23 +6148,21 @@ msgid "Chunk done" msgstr "Επιτυχία κομματιού" -#, fuzzy msgid "Waiting for TTH checking..." -msgstr "Αναμονή ελέγχου SHA1..." +msgstr "" msgid "Waiting for SHA1 checking..." msgstr "Αναμονή ελέγχου SHA1..." -#, fuzzy, c-format +#, c-format msgid "Computing %s (%.02f%%)" -msgstr "Υπολογισμός SHA1 (%.02f%%)" +msgstr "" msgid "TTH OK" msgstr "" -#, fuzzy msgid "SHA-1 OK" -msgstr "SHA1:" +msgstr "" msgid "SHA-1 MISMATCH" msgstr "" @@ -5185,32 +6187,23 @@ msgid "(stalled)" msgstr "(σταματημένο)" -#, fuzzy msgid "Receiving data" -msgstr "Λήψη Κεφαλίδων" +msgstr "" -#, fuzzy msgid "ignoring" -msgstr "εισερχόμενο" +msgstr "" -#, fuzzy msgid "selected next" -msgstr "Επιλεγμένη ιδιότητα:" +msgstr "" -#, fuzzy msgid "requesting next" -msgstr "Αίτημα εστάλη" +msgstr "" -#, fuzzy msgid "requested next" -msgstr "Αίτημα εστάλη" +msgstr "" -#, fuzzy msgid "Awaiting data" -msgstr "Αναμονή" - -msgid "Unknown error" -msgstr "Άγνωστο σφάλμα" +msgstr "" #, c-format msgid "Retry in %us" @@ -5226,9 +6219,8 @@ msgstr0 "Απώλεια %u λήψης" msgstr1 "Απώλεια %u λήψεων" -#, fuzzy msgid "Filename (filtered)" -msgstr "Φίλτρο ονόματος αρχείου:" +msgstr "" msgid "Progress" msgstr "Πρόοδος" @@ -5236,13 +6228,11 @@ msgid "RX" msgstr "" -#, fuzzy msgid "Downloaded" -msgstr "Λήφθηκαν:" +msgstr "" -#, fuzzy msgid "Uploaded" -msgstr "Στάλθηκαν:" +msgstr "" msgid "Sources" msgstr "Πηγές" @@ -5253,9 +6243,8 @@ msgid "Active" msgstr "Ενεργός" -#, fuzzy msgid "Incomplete" -msgstr "Ολοκληρώθηκε" +msgstr "" msgid "Orphaned" msgstr "" @@ -5263,15 +6252,15 @@ msgid "All" msgstr "" -#, fuzzy, c-format +#, c-format msgid "regex error: %s" -msgstr "Σφάλμα ανάγνωσης: %s" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Selected %u of %u download matching \"%s\"." msgid_plural "Selected %u of %u downloads matching \"%s\"." -msgstr0 "Επιλογή %u από τις %u αναμένουσα λήψη που ταιριάζουν \"%s\"." -msgstr1 "Επιλογή %u από τις %u αναμένουσες λήψεις που ταιριάζουν \"%s\"." +msgstr0 "" +msgstr1 "" msgid "starts with" msgstr "ξεκινά με" @@ -5291,9 +6280,8 @@ msgid "is exactly" msgstr "είναι ακριβώς" -#, fuzzy msgid "Built-in targets" -msgstr "Ενσωματωμένοι στόχοι (δεν επεξεργάζονται)" +msgstr "" msgid "Global filters" msgstr "Παγκόσμια φίλτρα" @@ -5353,17 +6341,17 @@ msgid "If filename contains the substring \"%s\" %s" msgstr "αν το όνομα αρχείου περιέχει την υποσυμβολοσειρά \"%s\" %s" -#, fuzzy, c-format +#, c-format msgid "If filename matches the regex pattern \"%s\" %s" -msgstr "Καμία ονομασία ιδιότητας δεν ταιριάζει με το πρότυπο \"%s\"." +msgstr "" #, c-format msgid "If filename is \"%s\" %s" msgstr "αν το όνομα αρχείου είναι \"%s\" %s" -#, fuzzy, c-format +#, c-format msgid "If IP address matches %s/%u" -msgstr "αν η διεύθυνση IP ταιριάζει με το %s/%s" +msgstr "" #, c-format msgid "If filesize is exactly %s (%s)" @@ -5450,9 +6438,8 @@ msgid "(invalid)" msgstr "(Λανθασμένο)" -#, fuzzy msgid "<Archive>" -msgstr "Ενεργός" +msgstr "" msgid "<Audio>" msgstr "" @@ -5475,649 +6462,6 @@ msgid "RETURN" msgstr "ΕΠΙΣΤΡΟΦΗ" -msgid "Query hit" -msgstr "Χτύπημα ερωτήματος" - -msgid "DHT (truncated)" -msgstr "" - -msgid "Routing errors" -msgstr "Σφάλματα δρομολόγησης" - -#, fuzzy -msgid "Routing table chunks" -msgstr "Αριθμός δημιουργίας πίνακα δρομολόγησης ερωτημάτων." - -msgid "Routing table message capacity" -msgstr "" - -msgid "Routing table message count" -msgstr "" - -msgid "Duplicates with higher TTL" -msgstr "Ανατυπώνει με υψηλότερο TTL" - -msgid "SPAM SHA1 database hits" -msgstr "" - -#, fuzzy -msgid "SPAM filename and size hits" -msgstr "αν το όνομα αρχείου τελειώνει με \"%s\" %s" - -msgid "SPAM fake hits" -msgstr "" - -msgid "SPAM duplicate hits" -msgstr "" - -msgid "SPAM dynamically caught hostile IP addresses" -msgstr "" - -msgid "SPAM dynamically caught hostile IP held" -msgstr "" - -msgid "SPAM spotted spamming IP addresses held" -msgstr "" - -msgid "Searches to local DB" -msgstr "Αναζητήσεις στην τοπική ΒΔ" - -msgid "Hits on local DB" -msgstr "Χτυπήματα στην τοπική ΒΔ" - -#, fuzzy -msgid "Hits on local partial files" -msgstr "Χτυπήματα στην τοπική ΒΔ" - -msgid "Hits on \"what's new?\" queries" -msgstr "" - -msgid "Query hits received for local queries" -msgstr "Ληφθέντα χτυπήματα ερωτημάτων για τοπικά ερωτήματα." - -msgid "Query hits received for OOB-proxied queries" -msgstr "Ληφθέντα χτυπήματα ερωτημάτων για ερωτήματα δρομολογημένα μέσω OOB" - -msgid "Queries requesting OOB hit delivery" -msgstr "Ερωτήματα αναζήτησης χτυπημάτων παράδοσης OOB" - -msgid "Stripped OOB flag on queries" -msgstr "Περικομμένη σημαία OOB στα ερωτήματα" - -msgid "Duplicate OOB-proxied queries" -msgstr "Ανατυπώνει ερωτήματα δρομολογημένα μέσω OOB" - -msgid "OOB hits received for OOB-proxied queries" -msgstr "Ληφθέντα χτυπήματα OOB για ερωτήματα δρομολογημένα μέσω OOB" - -msgid "OOB hits bearing alien IP address" -msgstr "Χτυπήματα OOB που δημιουργούν ξένες διευθύνσεις IP" - -msgid "OOB hits ignored due to identified spamming address" -msgstr "" - -msgid "Unclaimed locally-generated OOB hits" -msgstr "Αδήλωτα τοπικά δημιουργημένα χτυπήματα OOB" - -msgid "Partially claimed locally-generated OOB hits" -msgstr "Μερικώς δηλωμένα τοπικά δημιουργημένα χτυπήματα OOB" - -msgid "Spurious OOB hit claiming received" -msgstr "" - -#, fuzzy -msgid "Unrequested OOB hits received" -msgstr "Ερωτήματα αναζήτησης χτυπημάτων παράδοσης OOB" - -msgid "Received query hits for untracked queries" -msgstr "" - -msgid "Tracked query MUIDs" -msgstr "" - -msgid "Compacted queries" -msgstr "Συμπαγή ερωτήματα" - -msgid "Bytes saved by compacting" -msgstr "Bytes που σώθηκαν από την μετατροπή σε συμπαγή" - -msgid "UTF8 queries" -msgstr "ερωτήματα UTF8" - -msgid "SHA1 queries" -msgstr "ερωτήματα SHA1" - -#, fuzzy -msgid "\"What's New?\" queries" -msgstr "Δημιουργημένα ερωτήματα" - -#, fuzzy -msgid "GUESS queries" -msgstr "ερωτήματα UTF8" - -#, fuzzy -msgid "GUESS queries (0.2)" -msgstr "ερωτήματα UTF8" - -msgid "GUESS cached query keys held" -msgstr "" - -msgid "GUESS cached 0.2 hosts held" -msgstr "" - -#, fuzzy -msgid "GUESS locally generated queries" -msgstr "Τοπικά δημιουργημένα δυναμικά ερωτήματα" - -msgid "GUESS currently running queries" -msgstr "" - -#, fuzzy -msgid "GUESS hits received for locally generated queries" -msgstr "Ληφθέντα χτυπήματα ερωτημάτων για τοπικά ερωτήματα." - -msgid "GUESS hosts queried" -msgstr "" - -msgid "GUESS hosts sending back an acknowledgment" -msgstr "" - -msgid "Broadcasted push messages" -msgstr "Μεταδιδόμενα μηνύματα ώθησης" - -#, fuzzy -msgid "Push-proxy UDP relayed messages" -msgstr "Μηνύματα διαμεσολαβητή ώθησης" - -msgid "Push-proxy TCP relayed messages" -msgstr "Μηνύματα διαμεσολαβητή ώθησης" - -msgid "Push-proxy broadcasted messages" -msgstr "Μηνύματα μεταδιδόμενα από το διαμεσολαβητή ώθησης" - -msgid "Push-proxy found un-proxied local route" -msgstr "" - -msgid "Push-proxy lookup failures" -msgstr "Μηνύματα αποτυχίας εύρεσης διαμεσολαβητή ώθησης" - -msgid "Push relayed via local route" -msgstr "" - -msgid "Push relayed via routing table" -msgstr "" - -msgid "Locally generated dynamic queries" -msgstr "Τοπικά δημιουργημένα δυναμικά ερωτήματα" - -msgid "Leaf-generated dynamic queries" -msgstr "Δυναμικά ερωτήματα από δικτυακούς κόμβους" - -msgid "OOB-proxied leaf queries" -msgstr "Ερωτήματα δικτυακών κόμβων μέσω διαμεσολάβησης OOB" - -msgid "Fully completed dynamic queries" -msgstr "Πλήρως ολοκληρωμένα δυναμικά ερωτήματα" - -msgid "Partially completed dynamic queries" -msgstr "Μερικώς ολοκληρωμένα δυναμικά ερωτήματα" - -msgid "Dynamic queries ended with no results" -msgstr "Τα δυναμικά ερωτήματα τελείωσαν χωρίς αποτελέσματα" - -msgid "Fully completed dynamic queries getting late results" -msgstr "" -"Πλήρως ολοκληρωμένα δυναμικά ερωτήματα με λήψη καθυστερημένων αποτελεσμάτων" - -msgid "Dynamic queries with partial late results" -msgstr "Δυναμικά ερωτήματα με μερικά καθυστερημένα αποτελέσματα" - -msgid "Dynamic queries completed by late results" -msgstr "Δυναμικά ερωτήματα που ολοκληρώθηκαν από καθυστερημένα αποτελέσματα" - -msgid "Queries seen from GTKG" -msgstr "Ερωτήματα που προβλήθηκαν από το GTKG" - -msgid "Queries seen from GTKG that were re-queries" -msgstr "Ερωτήματα που προβλήθηκαν από το GTKG που ήταν επανερωτήματα" - -msgid "Queries advertising support of GGEP \"H\"" -msgstr "Ερωτήματα με διαφημίσεις υποστήριξης GGEP \"H\"" - -msgid "GIV callbacks received" -msgstr "Ελήφθησαν πίσω κλήσεις GIV" - -msgid "GIV discarded due to no suitable download" -msgstr "" - -msgid "QUEUE callbacks received" -msgstr "Ελήφθησαν πίσω κλήσεις ΛΙΣΤΑΣ ΑΝΑΜΟΝΗΣ" - -msgid "QUEUE discarded due to no suitable download" -msgstr "" - -msgid "UDP messages with bogus source IP" -msgstr "Μηνύματα UDP με ψεύτικη πηγαία IP" - -msgid "Alien UDP messages (non-Gnutella)" -msgstr "Ξένα μηνύματα UDP (όχι Gnutella)" - -msgid "Unprocessed UDP Gnutella messages" -msgstr "Ασυμπίεστα μηνύματα UDP Gnutella" - -#, fuzzy -msgid "Compressed UDP messages enqueued" -msgstr "Ασυμπίεστα μηνύματα UDP Gnutella" - -#, fuzzy -msgid "Compressed UDP messages received" -msgstr "Ασυμπίεστα μηνύματα UDP Gnutella" - -#, fuzzy -msgid "Uncompressed UDP messages due to no gain" -msgstr "Ασυμπίεστα μηνύματα UDP Gnutella" - -msgid "Consolidated servers (after GUID and IP address linking)" -msgstr "" - -msgid "Duplicate downloads found during server consolidation" -msgstr "" - -msgid "Discovered server GUIDs" -msgstr "" - -msgid "Changed server GUIDs" -msgstr "" - -msgid "Detected GUID collisions" -msgstr "" - -msgid "Detected collisions with our own GUID" -msgstr "" - -msgid "GUID dynamically banned" -msgstr "" - -msgid "Firewalled node info for known hosts received in upload requests" -msgstr "" - -msgid "Revitalized PUSH routes" -msgstr "" - -msgid "Collected new PUSH proxies from other query hits" -msgstr "" - -msgid "Attempted download resource switching on completion" -msgstr "" - -msgid "Attempted download resource switching after error" -msgstr "" - -msgid "Successful download resource switching (all kind)" -msgstr "" - -msgid "Successful download resource switching between plain files" -msgstr "" - -msgid "Successful download resource switching after error" -msgstr "" - -msgid "Actively queued after resource switching attempt" -msgstr "" - -msgid "Sunk HTTP reply data on error codes" -msgstr "" - -#, fuzzy -msgid "Ignored downloaded data" -msgstr "Ληφθέντα δεδομένα:" - -#, fuzzy -msgid "Ignoring requested after data mismatch" -msgstr "Αποστολή αιτήματος (%u%%)" - -#, fuzzy -msgid "Ignoring requested to preserve connection" -msgstr "Αποστολή αιτήματος (%u%%)" - -msgid "Ignoring requested due to aggressive swarming" -msgstr "" - -msgid "Ignoring refused (data too large or server too slow)" -msgstr "" - -msgid "Client resource switching (all detected)" -msgstr "" - -msgid "Client resource switching between plain files" -msgstr "" - -msgid "Client follow-up request after HTTP error was returned" -msgstr "" - -msgid "PARQ client resource switching in slots (SHA-1 based)" -msgstr "" - -msgid "PARQ client retry-after violation" -msgstr "" - -msgid "PARQ client kicked out after too many retry-after violations" -msgstr "" - -msgid "PARQ upload slot limit overrides" -msgstr "" - -msgid "PARQ quick upload slots granted" -msgstr "" - -msgid "PARQ QUEUE sending attempts" -msgstr "" - -msgid "PARQ QUEUE messages sent" -msgstr "" - -msgid "PARQ QUEUE follow-up requests received" -msgstr "" - -msgid "Launched SHA-1 file verifications" -msgstr "" - -msgid "Launched TTH file verifications" -msgstr "" - -msgid "Bitzi tickets held" -msgstr "" - -msgid "Re-seeding of orphan downloads through query hits" -msgstr "" - -#, fuzzy -msgid "Re-seeding of orphan downloads through upload requests" -msgstr "Επίπεδο αποσφαλμάτωσης λήψεων." - -msgid "DHT estimated amount of nodes" -msgstr "" - -msgid "DHT k-ball theoretical frontier (bits)" -msgstr "" - -msgid "DHT k-ball furthest frontier (bits)" -msgstr "" - -msgid "DHT k-ball closeest frontier (bits)" -msgstr "" - -msgid "DHT routing table buckets" -msgstr "" - -msgid "DHT routing table leaves" -msgstr "" - -msgid "DHT routing table maximum depth" -msgstr "" - -#, fuzzy -msgid "DHT routing table good nodes" -msgstr "Αριθμός δημιουργίας πίνακα δρομολόγησης ερωτημάτων." - -msgid "DHT routing table stale nodes" -msgstr "" - -#, fuzzy -msgid "DHT routing table pending nodes" -msgstr "Αριθμός δημιουργίας πίνακα δρομολόγησης ερωτημάτων." - -msgid "DHT routing table evicted nodes" -msgstr "" - -msgid "DHT routing table evicted firewalled nodes" -msgstr "" - -#, fuzzy -msgid "DHT routing table evicted nodes due to quota" -msgstr "Αριθμός δημιουργίας πίνακα δρομολόγησης ερωτημάτων." - -msgid "DHT routing table promoted pending nodes" -msgstr "" - -#, fuzzy -msgid "DHT routing table pinged promoted nodes" -msgstr "Αριθμός δημιουργίας πίνακα δρομολόγησης ερωτημάτων." - -msgid "DHT routing table rejected node due to bucket network quota" -msgstr "" - -msgid "DHT routing table rejected node due to global network quota" -msgstr "" - -msgid "DHT completed bucket refreshes" -msgstr "" - -msgid "DHT forced bucket refreshes" -msgstr "" - -#, fuzzy -msgid "DHT forced bucket merges" -msgstr "Παραμορφωμένη εντολή" - -msgid "DHT denied non-splitable bucket refresh" -msgstr "" - -msgid "DHT initiated bucket alive checks" -msgstr "" - -msgid "DHT alive pings sent to good nodes" -msgstr "" - -msgid "DHT alive pings sent to stale nodes" -msgstr "" - -msgid "DHT alive pings sent to shutdowning nodes" -msgstr "" - -msgid "DHT alive pings avoided" -msgstr "" - -msgid "DHT alive pings skipped" -msgstr "" - -msgid "DHT revitalized stale nodes on RPC reply" -msgstr "" - -msgid "DHT value store rejected on IP/network quota grounds" -msgstr "" - -msgid "DHT value store rejected on creator validation grounds" -msgstr "" - -msgid "DHT nodes rejected during lookup based on network quota" -msgstr "" - -msgid "DHT nodes rejected during lookup based on suspicious proximity" -msgstr "" - -msgid "DHT nodes rejected during lookup based on frequency divergence" -msgstr "" - -msgid "DHT keys held" -msgstr "" - -msgid "DHT cached keys held" -msgstr "" - -msgid "DHT values held" -msgstr "" - -msgid "DHT cached KUID targets held" -msgstr "" - -msgid "DHT cached closest root nodes" -msgstr "" - -msgid "DHT cached roots exact hits" -msgstr "" - -msgid "DHT cached roots approximate hits" -msgstr "" - -msgid "DHT cached roots misses" -msgstr "" - -msgid "DHT cached roots lookups within k-ball" -msgstr "" - -msgid "DHT cached roots contact address refreshed" -msgstr "" - -msgid "DHT cached security tokens held" -msgstr "" - -msgid "DHT cached security tokens hits" -msgstr "" - -#, fuzzy -msgid "DHT stable node information held" -msgstr "Λεπτομέρειες" - -msgid "DHT local hits on value lookups" -msgstr "" - -msgid "DHT local hits returning values from cached keys" -msgstr "" - -msgid "DHT returned expanded values" -msgstr "" - -msgid "DHT returned values as secondary keys" -msgstr "" - -#, fuzzy -msgid "DHT claimed values via secondary keys" -msgstr "Χρονικά όρια (όλες οι τιμές σε δευτερόλεπτα)" - -msgid "DHT returned cached expanded values" -msgstr "" - -msgid "DHT returned cached values as secondary-keys" -msgstr "" - -#, fuzzy -msgid "DHT claimed cached values via secondary keys" -msgstr "Χρονικά όρια (όλες οι τιμές σε δευτερόλεπτα)" - -msgid "DHT successfully received value publications" -msgstr "" - -msgid "DHT successfully received value removals" -msgstr "" - -msgid "DHT replication of stale value avoided" -msgstr "" - -msgid "DHT replication of held values" -msgstr "" - -msgid "DHT republishing of held values" -msgstr "" - -msgid "DHT secondary-key value fetch issued" -msgstr "" - -msgid "DHT duplicate values returned in lookups" -msgstr "" - -msgid "DHT detected KUID collisions" -msgstr "" - -msgid "DHT detected collisions with our own KUID" -msgstr "" - -msgid "DHT detected KUID mismatches on RPC reply" -msgstr "" - -msgid "DHT caching attempts" -msgstr "" - -msgid "DHT caching ended successfully" -msgstr "" - -msgid "DHT caching partially completed" -msgstr "" - -msgid "DHT key-offloading checks after discovering new closest node" -msgstr "" - -msgid "DHT keys selected for offloading" -msgstr "" - -msgid "DHT key-offloading attempts" -msgstr "" - -msgid "DHT key-offloading ended successfully" -msgstr "" - -msgid "DHT key-offloading partially completed" -msgstr "" - -msgid "DHT values successfully offloaded" -msgstr "" - -msgid "DHT publishing attempts" -msgstr "" - -msgid "DHT publishing ended successfully (all roots)" -msgstr "" - -msgid "DHT publishing partially completed (root subset only)" -msgstr "" - -msgid "DHT publishing ending with proper value presence" -msgstr "" - -msgid "DHT value republishing occurring too late (after expiry)" -msgstr "" - -msgid "DHT publishing to self" -msgstr "" - -msgid "DHT background publishing completion attempts" -msgstr "" - -msgid "DHT background publishing completion showing improvements" -msgstr "" - -msgid "DHT background publishing completion successful (all roots)" -msgstr "" - -msgid "DHT SHA1 data type collisions" -msgstr "" - -msgid "DHT lookup path passively protected against attack" -msgstr "" - -msgid "DHT lookup path actively protected against attack" -msgstr "" - -msgid "DHT alt-loc lookups issued" -msgstr "" - -#, fuzzy -msgid "DHT push-proxy lookups issued" -msgstr "Μηνύματα αποτυχίας εύρεσης διαμεσολαβητή ώθησης" - -msgid "DHT successful alt-loc lookups" -msgstr "" - -msgid "DHT successful push-proxy lookups" -msgstr "" - -msgid "DHT successful node push-entry lookups" -msgstr "" - -#, fuzzy -msgid "DHT re-seeding of orphan downloads" -msgstr "Επίπεδο αποσφαλμάτωσης λήψεων." - msgid "node" msgid_plural "nodes" msgstr0 "κόμβος" @@ -6171,13 +6515,11 @@ msgid "$Id$" msgstr "" -#, fuzzy msgid "%v/%u (%P%%)" -msgstr "%u/%u υπολογιστής (%u%%)" +msgstr "" -#, fuzzy msgid "%v/%u Gnutella peers" -msgstr "%v/%u κόμβοι Gnet" +msgstr "" msgid "%v/%u downloads" msgstr "%v/%u λήψεις" @@ -6185,9 +6527,8 @@ msgid "%v/%u uploads" msgstr "%v/%u αποστολές" -#, fuzzy msgid "(Disable: 0, Random: 1)" -msgstr "Απενεργοποίηση: 0, Τυχαίο: 1" +msgstr "" msgid "(no search)" msgstr "(χωρίς αναζήτηση)" @@ -6292,9 +6633,8 @@ msgid "Auto clear failed uploads" msgstr "Αυτόματος καθαρισμός των αποτυχημένων αποστολών" -#, fuzzy msgid "Automatically clear finished files" -msgstr "Αυτόματος καθαρισμός των σταματημένων λήψεων" +msgstr "" msgid "Automatically clear sources when..." msgstr "" @@ -6311,23 +6651,20 @@ msgid "Avg. uptime of this servent:" msgstr "Μέσος χρόνος λειτουργίας αυτού του πελάτη:" -#, fuzzy msgid "Avg. downtime of this servent:" -msgstr "Μέσος χρόνος λειτουργίας αυτού του πελάτη:" +msgstr "" msgid "Bad hosts" msgstr "Κακοί υπολογιστές" -#, fuzzy msgid "Bandwidth limits for Gnutella traffic" -msgstr "Όρια εύρους κυκλοφορίας GnutellaNet" +msgstr "" msgid "Bandwidth limits for HTTP traffic" msgstr "Όρια εύρους κυκλοφορίαςHTTP" -#, fuzzy msgid "Bandwidth limits for the Distributed Hash Table" -msgstr "Επίπεδο αποσφαλμάτωσης κώδικα ανταλλαγής αρχείων." +msgstr "" msgid "Bandwidth targets for node lookups" msgstr "" @@ -6341,24 +6678,14 @@ msgid "Beautify filenames by removing needless underscores" msgstr "" -#, fuzzy msgid "Bind to this address" -msgstr "Κακή διεύθυνση επιστροφής" - -#, fuzzy -msgid "Bitzi Metadata" -msgstr "Δεδομένα XML:" - -#, fuzzy -msgid "Bitzi metadata" -msgstr "Δεδομένα XML:" +msgstr "" msgid "Browse Host" msgstr "Εξερεύνηση Υπολογιστή" -#, fuzzy msgid "Browse host" -msgstr "Εξερεύνηση Υπολογιστή" +msgstr "" msgid "Busy" msgstr "Απασχολημένο" @@ -6397,9 +6724,8 @@ msgid "Clear non-existent files" msgstr "Καθαρισμός ανύπαρκτων αρχείων" -#, fuzzy msgid "Clear results" -msgstr "_Καθαρισμός αποτελεσμάτων" +msgstr "" msgid "Clear stopped" msgstr "Ο καθαρισμός διακόπηκε" @@ -6413,13 +6739,11 @@ msgid "Clock skew:" msgstr "" -#, fuzzy msgid "Clock synchronization" -msgstr "Συγχρονισμός ρολογιού" +msgstr "" -#, fuzzy msgid "Close" -msgstr "_Κλείσιμο" +msgstr "" msgid "Collapse all" msgstr "Κατάρρευση όλων" @@ -6474,9 +6798,8 @@ msgid "Connectin_g timeout" msgstr "Χρονικό όριο π_ροσπάθειας σύνδεσης" -#, fuzzy msgid "Connection counters" -msgstr "Χρονικό όριο π_ροσπάθειας σύνδεσης" +msgstr "" msgid "Connection settings" msgstr "Ρυθμίσεις σύνδεσης" @@ -6495,9 +6818,8 @@ msgid "Convert spaces to underscores in generated filenames" msgstr "Μετατροπή κενών σε κάτω παύλες στα παραγόμενα ονόματα αρχείων" -#, fuzzy msgid "Copy Magnet to clipboard" -msgstr "Αντιγραφή στο πρόχειρο" +msgstr "" msgid "Copy URL to clipboard" msgstr "Αντιγραφή URL στο πρόχειρο" @@ -6505,9 +6827,8 @@ msgid "Copy browse-host results to passive searches" msgstr "" -#, fuzzy msgid "Copy magnet to clipboard" -msgstr "Αντιγραφή στο πρόχειρο" +msgstr "" msgid "Copy rule" msgstr "Αντιγραφή κανόνα" @@ -6536,13 +6857,11 @@ msgid "Currently used" msgstr "Σε χρήση" -#, fuzzy msgid "DHT traffic stats" -msgstr "Στατιστικά κυκλοφορίας _HTTP" +msgstr "" -#, fuzzy msgid "DHT traffic" -msgstr "Κυκλοφορία HTTP" +msgstr "" msgid "Debugging" msgstr "Αποσφαλμάτωση" @@ -6573,9 +6892,8 @@ msgid "Delete file on abort" msgstr "Διαγραφή αρχείου κατά την εγκατάλειψη" -#, fuzzy msgid "Delete file on mismatch" -msgstr "Αφαίρεση αρχείου αν δεν ταιριάζουν" +msgstr "" msgid "Detailed traffic information to display" msgstr "Λεπτομέρειες κυκλοφορίας που θα εμφανίζονται" @@ -6604,9 +6922,8 @@ msgid "Do you really want to quit?" msgstr "Θέλετε πραγματικά να φύγετε;" -#, fuzzy msgid "Download" -msgstr "Λήψεις" +msgstr "" msgid "Downloaded:" msgstr "Λήφθηκαν:" @@ -6632,9 +6949,8 @@ msgid "Enable \"_Browse Host\" feature" msgstr "Ενεργοποίηση χαρακτηριστικού \"_Εξερεύνηση Υπολογιστή\"" -#, fuzzy msgid "Enable _DHT" -msgstr "Ενεργοποίηση _UDP" +msgstr "" msgid "Enable _UDP" msgstr "Ενεργοποίηση _UDP" @@ -6642,9 +6958,8 @@ msgid "Enable dynamic upload slots _allocation" msgstr "Ενεργοποίηση δυ_ναμικής κατανομής υποδοχών αποστολής" -#, fuzzy msgid "Enable remote _shell control interface" -msgstr "Ενεργοποίηση περιβάλλοντος ελέγχου από το \"_κέλυφος\"" +msgstr "" msgid "Enable s_warming" msgstr "Ενεργοποίηση εξάπλωσης" @@ -6691,9 +7006,8 @@ msgid "File scanning time:" msgstr "Χρόνος σάρωσης αρχείων:" -#, fuzzy msgid "File transfers" -msgstr "_Μεταφορές" +msgstr "" msgid "Files scanned" msgstr "Τα αρχεία σαρώθηκαν" @@ -6722,9 +7036,8 @@ msgid "Force push mode" msgstr "Εξαναγκασμός λειτουργίας ώθησης" -#, fuzzy msgid "Forget" -msgstr "Στόχος" +msgstr "" msgid "" "Forwarded\n" @@ -6748,9 +7061,8 @@ msgid "GUID:" msgstr "GUID:" -#, fuzzy msgid "KUID:" -msgstr "GUID:" +msgstr "" msgid "Gen. queued" msgstr "" @@ -6770,44 +7082,35 @@ msgid "Generation:" msgstr "Δημιουργία:" -#, fuzzy msgid "Global DHT outgoing traffic" -msgstr "Ε_ξερχόμενη κυκλοφορία" +msgstr "" -#, fuzzy msgid "Gnutella TTL settings" -msgstr "Ρυθμίσεις GnutellaNet TTL" +msgstr "" -#, fuzzy msgid "Gnutella _leaf traffic stats" -msgstr "στατιστικά _δικτυακής κυκλοφορίας Gnet" +msgstr "" -#, fuzzy msgid "Gnutella display" -msgstr "Εμφάνιση GnutellaNet" +msgstr "" -#, fuzzy msgid "Gnutella message size limits" -msgstr "Όρια μεγέθους μηνυμάτων GnutellaNet" +msgstr "" msgid "Gnutella network mode" msgstr "Λειτουργία δικτύου Gnutella" -#, fuzzy msgid "Gnutella peers" -msgstr "GnutellaNet" +msgstr "" -#, fuzzy msgid "Gnutella timeouts (all values in seconds)" -msgstr "Χρονικά όρια GnutellaNet (όλες οι τιμές σε δευτερόλεπτα)" +msgstr "" -#, fuzzy msgid "Gnutella traffic" -msgstr "Κυκλοφορία GnutellaNet" +msgstr "" -#, fuzzy msgid "Gnutella" -msgstr "GnutellaNet" +msgstr "" msgid "HTTP traffic" msgstr "Κυκλοφορία HTTP" @@ -6824,9 +7127,8 @@ msgid "Hits" msgstr "Χτυπήματα" -#, fuzzy msgid "Honor OOB flag in queries" -msgstr "Περικομμένη σημαία OOB στα ερωτήματα" +msgstr "" msgid "Hop radius for counting high TTL limit messages (#hops lower than...)" msgstr "" @@ -6852,9 +7154,8 @@ msgid "IP address stability" msgstr "Σταθερότητα διεύθυνσης IP" -#, fuzzy msgid "IP address/mask" -msgstr "Διεύθυνση IP" +msgstr "" msgid "IP settings" msgstr "Ρυθμίσεις IP" @@ -6862,13 +7163,11 @@ msgid "IP:Port:" msgstr "IP:Θύρα:" -#, fuzzy msgid "IPv4 settings" -msgstr "Ρυθμίσεις IP" +msgstr "" -#, fuzzy msgid "IPv6 settings" -msgstr "Ρυθμίσεις IP" +msgstr "" msgid "Ignore symbolically linked _directories" msgstr "Παράβλεψη συμβολικά συνδεδεμένων _καταλόγων" @@ -6907,9 +7206,8 @@ msgid "Keywords:" msgstr "Λέξεις κλειδιά:" -#, fuzzy msgid "KiB" -msgstr "KiB/s" +msgstr "" msgid "KiB/s" msgstr "KiB/s" @@ -6917,20 +7215,17 @@ msgid "Large enough uptime" msgstr "Αρκετός χρόνος λειτουργίας" -#, fuzzy msgid "Last Request" -msgstr "Τελευταία εναλλαγή" +msgstr "" -#, fuzzy msgid "Last Upload" -msgstr "Αποστολές" +msgstr "" msgid "Last check" msgstr "Τελευταίος έλεγχος" -#, fuzzy msgid "Last chunk size" -msgstr "Μέγε_θος πρώτου κομματιού" +msgstr "" msgid "Last scan initiated on:" msgstr "Έναρξη τελευταίας σάρωσης:" @@ -7001,21 +7296,17 @@ msgid "Max. file _descriptors reserved" msgstr "Μέγιστος αριθμός παραχώρησης περιγραφέων αρχείων" -#, fuzzy msgid "Max. number of browse host results" -msgstr "Μέγιστος _αριθμός αποτελεσμάτων" +msgstr "" -#, fuzzy msgid "Max. number of passive results" -msgstr "Μέγιστος _αριθμός αποτελεσμάτων" +msgstr "" -#, fuzzy msgid "Max. number of What's New? results" -msgstr "Μέγιστος _αριθμός αποτελεσμάτων" +msgstr "" -#, fuzzy msgid "Max. simultaneous downloads per file" -msgstr "Μέγιστες ταυτόχρονες λήψεις" +msgstr "" msgid "Max. simultaneous downloads" msgstr "Μέγιστες ταυτόχρονες λήψεις" @@ -7105,9 +7396,8 @@ msgid "Move corrupted downloaded files to" msgstr "Μετακίνηση των κατεστραμμένων αρχείων στο" -#, fuzzy msgid "Network protocol:" -msgstr "Δικτυακά πρωτόκολλα." +msgstr "" msgid "Network" msgstr "Δίκτυο" @@ -7160,9 +7450,8 @@ msgid "Outgoing traffic to lea_ves" msgstr "Εξερχόμενη κυκλοφορία προς δικτυακούς _κόμβους" -#, fuzzy msgid "Output bandwidth average" -msgstr "Όριο ολικού εύρους εξόδου:" +msgstr "" msgid "PARQ development:" msgstr "Ανάπτυξη PARQ:" @@ -7179,9 +7468,8 @@ msgid "Patch generation started on:" msgstr "Έναρξη δημιουργίας μπαλώματος:" -#, fuzzy msgid "Pause" -msgstr "Ώθηση" +msgstr "" msgid "Pending local queries" msgstr "Τοπικά ερωτήματα που αναμένουν" @@ -7219,9 +7507,8 @@ msgid "Property browser" msgstr "Περιηγητής ιδιοτήτων" -#, fuzzy msgid "Property pattern:" -msgstr "Πρότυπο ιδιοτήτων:" +msgstr "" msgid "Property" msgstr "Ιδιότητα" @@ -7350,13 +7637,11 @@ "Επαναφορά στατιστικών φίλτρου\n" "για αυτό το φίλτρο" -#, fuzzy msgid "Restart" -msgstr "_Επαναφορά στατιστικών" +msgstr "" -#, fuzzy msgid "Resu_me" -msgstr "Συνέχεια" +msgstr "" msgid "Resume and retry" msgstr "Συνέχεια και προσπάθεια ξανά" @@ -7408,20 +7693,17 @@ msgid "SHA1 hash (not editable, add from search popup)" msgstr "" -#, fuzzy msgid "Save" -msgstr "Αποθηκεύτηκε" +msgstr "" msgid "Saved" msgstr "Αποθηκεύτηκε" -#, fuzzy msgid "Search Monitor" -msgstr "Φίλτρα αναζήτησης" +msgstr "" -#, fuzzy msgid "Search Stats" -msgstr "Φίλτρα αναζήτησης" +msgstr "" msgid "Search Term" msgstr "Κριτήριο αναζήτησης" @@ -7450,37 +7732,29 @@ msgid "Server" msgstr "Εξυπηρετητής" -#, fuzzy msgid "Settings" -msgstr "Εμφάνιση ρυθμίσεων" +msgstr "" -#, fuzzy msgid "Show Search_bar" -msgstr "εμφάνιση _Πλαϊνού πίνακα" +msgstr "" -#, fuzzy msgid "Show Status_bar" -msgstr "εμφάνιση _Γραμμής κατάστασης" +msgstr "" -#, fuzzy msgid "Show _Connections" -msgstr "εμφάνιση _Συνδέσεων" +msgstr "" -#, fuzzy msgid "Show _Downloads" -msgstr "εμφάνιση _Λήψεων" +msgstr "" -#, fuzzy msgid "Show _Menubar" -msgstr "εμφάνιση _Πλαϊνού πίνακα" +msgstr "" -#, fuzzy msgid "Show _Sidebar" -msgstr "εμφάνιση _Πλαϊνού πίνακα" +msgstr "" -#, fuzzy msgid "Show _Uploads" -msgstr "εμφάνιση _Αποστολών" +msgstr "" msgid "Show _bytes" msgstr "Εμφάνιση _bytes" @@ -7488,36 +7762,29 @@ msgid "Show _confirmation dialog when leaving gtk-gnutella" msgstr "Εμφάνιση _διαλόγου επιβεβαίωσης κατά την έξοδο από το gtk-gnutella" -#, fuzzy msgid "Show _inbound Gnutella traffic" -msgstr "Κυκλοφορία GnutellaNet" +msgstr "" -#, fuzzy msgid "Show _inbound HTTP traffic" -msgstr "εμφάνιση _εισερχόμενης κυκλοφορίας Gnet" +msgstr "" -#, fuzzy msgid "Show _inbound leaf traffic" -msgstr "εμφάνιση _εισερχόμενης κυκλοφορίας Gnet" +msgstr "" msgid "Show _last" msgstr "Εμφάνιση _τελευταίου" -#, fuzzy msgid "Show _metric units" -msgstr "Εμφάνιση _ποσοστών" +msgstr "" -#, fuzzy msgid "Show _outbound Gnutella traffic" -msgstr "Κυκλοφορία GnutellaNet" +msgstr "" -#, fuzzy msgid "Show _outbound HTTP traffic" -msgstr "εμφάνιση ε_ξερχόμενης κυκλοφορίας Gnet" +msgstr "" -#, fuzzy msgid "Show _outbound leaf traffic" -msgstr "εμφάνιση ε_ξερχόμενης κυκλοφορίας Gnet" +msgstr "" msgid "Show _percentages" msgstr "Εμφάνιση _ποσοστών" @@ -7529,13 +7796,11 @@ msgstr "" "Εμφάνιση επιπλέον πληροφοριών και ρυθμίσεων για τους προχωρημένους χρήστες" -#, fuzzy msgid "Show inbound DHT traffic" -msgstr "εμφάνιση _εισερχόμενης κυκλοφορίας Gnet" +msgstr "" -#, fuzzy msgid "Show outbound DHT traffic" -msgstr "εμφάνιση ε_ξερχόμενης κυκλοφορίας Gnet" +msgstr "" msgid "Show pr_otocol:" msgstr "Εμφάνιση π_ρωτοκόλλου:" @@ -7589,9 +7854,8 @@ msgid "Start now" msgstr "Εκκίνηση τώρα" -#, fuzzy msgid "Statistics" -msgstr "Στατιστικά:" +msgstr "" msgid "Statistics:" msgstr "Στατιστικά:" @@ -7638,13 +7902,10 @@ msgid "Thaw queue" msgstr "" -#, fuzzy msgid "" "The current IP address and listening port for this node. To change these go " "to File->Preferences->Network." msgstr "" -"Η τρέχουσα διεύθυνση IP και η θύρα ακρόασης αυτού του κόμβου. Για να τα " -"αλλάξετε πηγαίνετε Ρυθμίσεις->Προτιμήσεις->Δίκτυο." msgid "" "There is no condition. When this rule is reached, the matching will continue " @@ -7726,9 +7987,8 @@ msgid "Update search results pane every" msgstr "Ανανέωση παραθύρου αναζήτησης κάθε" -#, fuzzy msgid "Upload History" -msgstr "Ιστορικό αποστολών" +msgstr "" msgid "Uploaded:" msgstr "Στάλθηκαν:" @@ -7791,9 +8051,8 @@ msgid "Write buffer size" msgstr "Μέγεθος ενδιάμεσης μνήμης εγγραφής" -#, fuzzy msgid "XML Metadata" -msgstr "Δεδομένα XML:" +msgstr "" msgid "Yann Grossel" msgstr "" @@ -7852,9 +8111,8 @@ msgid "_Browse" msgstr "_Εξερεύνηση" -#, fuzzy msgid "_Cancel" -msgstr "Άκυρο" +msgstr "" msgid "_Compute upload connection speed" msgstr "_Υπολογισμός ταχύτητας σύνδεσης αποστολής" @@ -7871,9 +8129,8 @@ msgid "_Download selected" msgstr "_Λήψη επιλεγμένων" -#, fuzzy msgid "_Duplicate" -msgstr "Ανατύπωση μηνύματος" +msgstr "" msgid "_Edit filters" msgstr "_Επεξεργασία φίλτρων" @@ -7893,9 +8150,8 @@ msgid "_Gnutella RX buffer:" msgstr "Ενδιάμεση μνήμη _Gnutella RX:" -#, fuzzy msgid "_Gnutella traffic stats" -msgstr "στατιστικά κυκλοφορίας _Gnet" +msgstr "" msgid "_HTTP traffic stats" msgstr "Στατιστικά κυκλοφορίας _HTTP" @@ -7951,9 +8207,8 @@ msgid "_Reset stats" msgstr "_Επαναφορά στατιστικών" -#, fuzzy msgid "_Restart" -msgstr "_Επαναφορά στατιστικών" +msgstr "" msgid "_Stop" msgstr "" @@ -7979,9 +8234,8 @@ msgid "and lasted" msgstr "και κράτησε" -#, fuzzy msgid "auto-hide DHT traffic stats" -msgstr "_αυτόματη απόκρυψη στατιστικών δικτυακής κυκλοφορίας" +msgstr "" msgid "bytes" msgstr "bytes" @@ -8007,17 +8261,12 @@ msgid "from _nodes within a" msgstr "από _κόμβους με" -#, fuzzy msgid "" "gtk-gnutella is shutting down.\n" "Sending bye messages to peers.\n" "\n" "Grace time remaining:" msgstr "" -"Το gtk-gnutella τερματίζει.\n" -"Αποστολή μηνυμάτων αποχώρησης στους κόμβους.\n" -"\n" -"Λήξη προθεσμίας:" msgid "gtk-gnutella shutdown" msgstr "τερματισμός gtk-gnutella" @@ -8043,9 +8292,8 @@ msgid "invert condition" msgstr "αντιστροφή συνθήκης" -#, fuzzy msgid "invert" -msgstr "Επαναφορά" +msgstr "" msgid "items" msgstr "αντικείμενα" @@ -8080,9 +8328,8 @@ msgid "set" msgstr "ορισμένο" -#, fuzzy msgid "unavailable" -msgstr "Μη διαθέσιμο" +msgstr "" msgid "undefined" msgstr "δεν έχει οριστεί" @@ -8093,13 +8340,11 @@ msgid "uploads" msgstr "αποστολές" -#, fuzzy msgid "Available HTTP input bandwidth" -msgstr "Διαθέσιμο εύρος" +msgstr "" -#, fuzzy msgid "Available HTTP output bandwidth" -msgstr "Διαθέσιμο εύρος" +msgstr "" msgid "DHT up, passive mode." msgstr "" @@ -8113,21 +8358,17 @@ msgid "DHT looking up own KUID." msgstr "" -#, fuzzy msgid "DHT seeded." -msgstr "Ταχύτητα TX" +msgstr "" -#, fuzzy msgid "DHT inactive." -msgstr "%u εν ενεργεία" +msgstr "" -#, fuzzy msgid "Disabled stealing of outgoing HTTP bandwidth." -msgstr "Εμφάνιση χρήσης εύρους εξερχόμενης κυκλοφορίας HTTP." +msgstr "" -#, fuzzy -msgid "Splitting ougoing HTTP bandwidth evenly." -msgstr "Εμφάνιση μέσου εύρους εξερχόμενης κυκλοφορίας HTTP." +msgid "Splitting outgoing HTTP bandwidth evenly." +msgstr "" msgid "Capping HTTP outgoing bandwidth." msgstr "" @@ -8135,27 +8376,26 @@ msgid "Port mapping possible through UPnP or NAT-PMP." msgstr "" -msgid "Port mapping configured through UPnP or NAT-PMP." +msgid "Port mapping configured through NAT-PMP." +msgstr "" + +msgid "Port mapping configured through UPnP." msgstr "" -#, fuzzy msgid "Enable UPnP" -msgstr "Ενεργοποίηση _UDP" +msgstr "" -#, fuzzy msgid "Enable NAT-PMP" -msgstr "Ενεργοποίηση _UDP" +msgstr "" msgid "Enable HTTP request pipelining" msgstr "" -#, fuzzy msgid "Pipelining max chunk size" -msgstr "Ελάχιστο μέγεθος κομματιού" +msgstr "" -#, fuzzy -msgid "Enable upload of patial files deemed rare" -msgstr "Ενεργοποίηση αποστολής ανολοκλήρωτων αρχείων" +msgid "Enable upload of partial files deemed rare" +msgstr "" msgid "Enable GUESS (additional querying)" msgstr "" @@ -8163,17 +8403,14 @@ msgid "Issue GUESS queries as well" msgstr "" -#, fuzzy msgid "Bandwidth limits for GUESS queries" -msgstr "Όρια εύρους κυκλοφορίας GnutellaNet" +msgstr "" -#, fuzzy msgid "Output bandwidth hint" -msgstr "Όριο ολικού εύρους εξόδου:" +msgstr "" -#, fuzzy msgid "Download queue is frozen." -msgstr "Η λίστα αναμονής πάγωσε" +msgstr "" msgid "Allow TTH discovery" msgstr "" @@ -8184,36 +8421,29 @@ msgid "Answer to queries for partial files" msgstr "" -#, fuzzy msgid "Answer to what's-new? queries" -msgstr "Δημιουργημένα ερωτήματα" +msgstr "" -#, fuzzy msgid "Search Media Type" -msgstr "Κριτήριο αναζήτησης" +msgstr "" msgid "Audio" msgstr "" -#, fuzzy msgid "Video" -msgstr "_Προβολή" +msgstr "" -#, fuzzy msgid "Document" -msgstr "Μέτρηση" +msgstr "" -#, fuzzy msgid "Image" -msgstr "Εύρος" +msgstr "" -#, fuzzy msgid "Archive" -msgstr "Ενεργός" +msgstr "" -#, fuzzy msgid "Search Configuration" -msgstr "Φίλτρα αναζήτησης" +msgstr "" msgid "Stop search when last download completes" msgstr "" @@ -8224,23 +8454,23 @@ msgid "What's new?" msgstr "" -#, fuzzy msgid "Unspecified" -msgstr "δεν έχει οριστεί" +msgstr "" msgid "Search filters to apply locally on newly created searches." msgstr "" -#, fuzzy msgid "Discard results bearing an alien IP address" -msgstr "Χτυπήματα OOB που δημιουργούν ξένες διευθύνσεις IP" +msgstr "" + +msgid "Discard results bearing a banned GUID" +msgstr "" msgid "Restart session-only searches with pending downloads" msgstr "" -#, fuzzy msgid "Configured DHT mode" -msgstr "Ρυθμισμένη λειτουργία κόμβου" +msgstr "" msgid "Store DHT keys/values in memory" msgstr "" @@ -8251,20 +8481,32 @@ msgid "Relayed queries remembered" msgstr "" -msgid "Not in database" -msgstr "Όχι στη βάση δεδομένων" +msgid "Allow unused Gnutella outgoing bandwidth to supersede hint" +msgstr "" + +msgid "Display GUESS statistics" +msgstr "" + +msgid "Mapping lease time" +msgstr "" + +msgid "G2 hubs" +msgstr "" + +msgid "Enable the G2 network" +msgstr "" + +msgid " G2, " +msgstr "" -#, fuzzy msgid "owned" -msgstr "Έγινε" +msgstr "" -#, fuzzy msgid "partial" -msgstr "Λετονία" +msgstr "" -#, fuzzy msgid "shared" -msgstr "διακόπηκε" +msgstr "" #, c-format msgid "Created %u download" @@ -8278,26 +8520,22 @@ msgstr0 "%u αποτέλεσμα απορρίφθηκε" msgstr1 "%u αποτελέσματα απορρίφθηκαν" -msgid "Query queued..." -msgstr "Το ερώτημα μπήκε στη λίστα αναμονής..." - #, c-format msgid "%u term counted" msgid_plural "%u terms counted" msgstr0 "Μετρήθηκε %u κριτήριο" msgstr1 "Μετρήθηκαν %u κριτήρια" -#, fuzzy, c-format +#, c-format msgid "Couldn't find pixmap file: %s" -msgstr "Αδυναμία εύρεσης του αρχείου pixmap: %s" +msgstr "" #, c-format msgid "Error loading pixmap file: %s" msgstr "Σφάλμα κατά το φόρτωμα του αρχείου pixmap: %s" -#, fuzzy msgid " (partial)" -msgstr "Και τα δύο (κάθετα)" +msgstr "" msgid "Cache contains" msgstr "Η λανθάνουσα μνήμη περιέχει" @@ -8311,21 +8549,20 @@ msgid "_Close" msgstr "_Κλείσιμο" -#, fuzzy msgid "Show _Statusbar" -msgstr "εμφάνιση _Γραμμής κατάστασης" +msgstr "" -#, fuzzy msgid "Show _Peers" -msgstr "εμφάνιση _Πλαϊνού πίνακα" +msgstr "" -#, fuzzy msgid "Gnutella _traffic stats" -msgstr "στατιστικά _κυκλοφορίας Gnet" +msgstr "" -#, fuzzy msgid "_Auto-hide leaf traffic stats" -msgstr "_αυτόματη απόκρυψη στατιστικών δικτυακής κυκλοφορίας" +msgstr "" + +msgid "Glossary" +msgstr "" msgid "_Search" msgstr "_Αναζήτηση" @@ -8336,13 +8573,8 @@ msgid "Do not specify any media type (will match any kind of files remotely)" msgstr "" -#, fuzzy msgid "CPU overloaded" -msgstr "Στάλθηκαν:" - -#, fuzzy -msgid "Splitting outgoing HTTP bandwidth evenly." -msgstr "Εμφάνιση μέσου εύρους εξερχόμενης κυκλοφορίας HTTP." +msgstr "" msgid "Connect to" msgstr "Σύνδεση σε" @@ -8387,13 +8619,18 @@ msgid "Served " msgstr "Εξυπηρέτησε " -#, fuzzy -msgid "BH HTML served" -msgstr "BH HTML" +msgid "G2 served" +msgstr "" msgid " / " msgstr "" +msgid "G2" +msgstr "" + +msgid "BH HTML served" +msgstr "" + msgid "BH HTML" msgstr "BH HTML" @@ -8439,20 +8676,17 @@ msgid "Force external IPv4 address to" msgstr "" -#, fuzzy msgid "_Bind to this address" -msgstr "Κακή διεύθυνση επιστροφής" +msgstr "" -#, fuzzy msgid "IPv_4 settings" -msgstr "Ρυθμίσεις IP" +msgstr "" msgid "Force external IPv6 address to" msgstr "" -#, fuzzy msgid "IPv_6 settings" -msgstr "Ρυθμίσεις IP" +msgstr "" msgid "Port Mapping" msgstr "" @@ -8468,50 +8702,36 @@ msgid "seconds (0 - disable)" msgstr "δευτερόλεπτα (0 - απενεργοποίηση)" -#, fuzzy msgid "slots" -msgstr "Υποδοχές:" +msgstr "" msgid "unit_of_time|s" msgstr "" -#, fuzzy msgid "Gnutella Distributed Hash Table" -msgstr "Επίπεδο αποσφαλμάτωσης κώδικα ανταλλαγής αρχείων." +msgstr "" msgid "Maximum percentage of connection slots a vendor can occupy." msgstr "" "Μέγιστο ποσοστό υποδοχών σύνδεσης που μπορεί να απασχολεί ένας κατασκευαστής." -#, fuzzy -msgid "Global DHT ougoing traffic" -msgstr "Ε_ξερχόμενη κυκλοφορία" - -#, fuzzy msgid "attempts" -msgstr "Προσπάθειες" +msgstr "" -#, fuzzy msgid "Pipelining maximum chunk size" -msgstr "Ελάχιστο μέγεθος κομματιού" +msgstr "" msgid "_Remove directory" msgstr "_Αφαίρεση καταλόγου" -#, fuzzy -msgid "Enable upload of partial files deemed rare" -msgstr "Ενεργοποίηση αποστολής ανολοκλήρωτων αρχείων" - msgid "Minimum chunk _size" msgstr "Ελά_χιστο μέγεθος κομματιού" -#, fuzzy msgid "Show a status _icon" -msgstr "Εμφάνιση αιτιών _για" +msgstr "" -#, fuzzy msgid "Avg. downtime of this servent" -msgstr "Μέσος χρόνος λειτουργίας αυτού του πελάτη:" +msgstr "" msgid "Remove completed downloads from list" msgstr "Αφαίρεση ολοκληρωμένων λήψεων από τη λίστα" @@ -8550,6 +8770,9 @@ msgid "Reverse lookup in progress..." msgstr "Ανεστραμμένη εύρεση σε εξέλιξη..." +msgid "UDP (semi-reliable)" +msgstr "" + msgid "Size:" msgstr "Μέγεθος:" @@ -8562,28 +8785,29 @@ msgid "Valid regular" msgstr "Έγκυροι συνήθεις" -#, fuzzy msgid "Fresh IPv4 ultra" -msgstr "Νέοι υπερ-κόμβοι" +msgstr "" -#, fuzzy msgid "Valid IPv4 ultra" -msgstr "Έγκυροι υπερ-κόμβοι" +msgstr "" -#, fuzzy msgid "Fresh IPv6 ultra" -msgstr "Νέοι υπερ-κόμβοι" +msgstr "" -#, fuzzy msgid "Valid IPv6 ultra" -msgstr "Έγκυροι υπερ-κόμβοι" +msgstr "" + +msgid "Fresh G2 hub" +msgstr "" + +msgid "Valid G2 hub" +msgstr "" msgid "Unstable" msgstr "Ασταθές" -#, fuzzy msgid "Alien" -msgstr "Εναλλακτικές ονομασίες" +msgstr "" msgid "GUESS (IPv4 running)" msgstr "" @@ -8611,14 +8835,16 @@ msgstr0 "%d δευτερόλεπτο" msgstr1 "%d δευτερόλεπτα" -#, fuzzy msgid "" "<html><head><title>Frequently Asked Questions</title></head><body><p>The FAQ " "document could not be loaded. Please read the <a href=\"http://gtk-gnutella." "sourceforge.net/?page=faq\">FAQ online</a> instead.</p></body></html>" msgstr "" -"Το έγγραφο FAQ δεν ήταν δυνατό να φορτωθεί. Παρακαλούμε διαβάστε το FAQ στο " -"http://gtk-gnutella.sourceforge.net/?page=faq." + +msgid "" +"<html><head><title>Glossary</title></head><body><p>The glossary document " +"could not be loaded.</p></body></html>" +msgstr "" #, c-format msgid "%lu file shared (%s)" @@ -8635,13 +8861,12 @@ msgid "Welcome sent" msgstr "Καλωσόρισμα εστάλη" -#, fuzzy msgid "No UDP traffic yet" -msgstr "Κυκλοφορία HTTP" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Closing: %s Stop in %us RX=%u Q=%u,%u%%" -msgstr "Κλείσιμο: %s Διακοπή σε %ds RX=%d Q=%d,%d%%" +msgstr "" msgid "Removing" msgstr "Αφαίρεση" @@ -8652,6 +8877,9 @@ msgid "UNKNOWN STATUS" msgstr "ΑΓΝΩΣΤΗ ΚΑΤΑΣΤΑΣΗ" +msgid "g2" +msgstr "" + msgid "busy" msgstr "απασχολημένο" @@ -8667,13 +8895,11 @@ msgid "bogus" msgstr "ψεύτικο" -#, fuzzy msgid "alien" -msgstr "Εναλλακτικές ονομασίες" +msgstr "" -#, fuzzy msgid "media" -msgstr "Αρμενία" +msgstr "" msgid "No search" msgstr "Χωρίς αναζήτηση" @@ -8682,28 +8908,30 @@ msgid "Flushing queue (%u results pending)" msgstr "" -#, fuzzy msgid "The search has been stopped" -msgstr "Δεν υπάρχει υποδοχή λήψης (δημιουργία)" +msgstr "" -#, fuzzy msgid "Passive search" -msgstr "(παθητική αναζήτηση) " +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Expires in %s" -msgstr " προσπάθεια ξανά σε %ds" +msgstr "" msgid "Expires with this session" msgstr "" -#, fuzzy, c-format +#, c-format +msgid " %u download" +msgid_plural " %u downloads" +msgstr0 "" +msgstr1 "" + +#, c-format msgid "" "%u %s (%u skipped, %u ignored, %u hidden, %u auto-d/l, %u %s) Hits: %u (%u " "TCP, %u UDP)" msgstr "" -"%s%s%u %s (%u ξεπερασμένα, %u αγνοημένα, %u κρυφά, %u αυτόματο-d/l, %u %s) " -"Χτυπήματα: %u (%u TCP, %u UDP)" msgid "item" msgid_plural "items" @@ -8715,6 +8943,63 @@ msgstr0 "" msgstr1 "" +msgid "No GUESS queries run yet" +msgstr "" + +#, c-format +msgid " previous took %s querying %zu %s with %zu %s kept" +msgstr "" + +msgid "host" +msgid_plural "hosts" +msgstr0 "" +msgstr1 "" + +msgid "hit" +msgid_plural "hits" +msgstr0 "" +msgstr1 "" + +#, c-format +msgid "GUESS %s Total: %zu %s (%s %s, %s kept, %s queries, %s keys)%s" +msgstr "" + +msgid "idle" +msgstr "" + +msgid "query" +msgid_plural "queries" +msgstr0 "" +msgstr1 "" + +#, c-format +msgid "" +"GUESS %s %s (%zu %s, %zu kept, %s queries, %s keys) Pool: %zu %s, (%zu+" +"%zu)/%zu queried, %zu %s (%.2f%%), %zu reached, %zu pending, %zu %s%s%s" +msgstr "" + +msgid "loose" +msgstr "" + +msgid "bounded" +msgstr "" + +msgid "ack" +msgid_plural "acks" +msgstr0 "" +msgstr1 "" + +msgid "hop" +msgid_plural "hops" +msgstr0 "" +msgstr1 "" + +msgid " (load pending)" +msgstr "" + +msgid " (end if starving)" +msgstr "" + msgid "Passive" msgstr "Παθητικός" @@ -8728,13 +9013,11 @@ "αποθηκεύτηκαν στη νέα μορφή XML και το παλιό αρχείο μετονομάστηκε\n" "σε %s" -#, fuzzy, c-format +#, c-format msgid "" "could not rename %s as %s: %m\n" "The XML file will not be used unless this problem is resolved." msgstr "" -"δεν είναι δυνατή η μετονομασία του %s σε %s: %s\n" -"Το αρχείο XML δε θα χρησιμοποιηθεί εκτός αν λυθεί αυτό το πρόβλημα." msgid "<unparsed>" msgstr "<δεν έχει αναλυθεί>" @@ -8742,39 +9025,36 @@ msgid "browsable" msgstr "εξερευνήσιμο" -#, fuzzy, c-format +#, c-format msgid "%u download" msgid_plural "%u downloads" -msgstr0 "%u/%u λήψη" -msgstr1 "%u/%u λήψεις" +msgstr0 "" +msgstr1 "" -#, fuzzy, c-format +#, c-format msgid "%u search" msgid_plural "%u searches" -msgstr0 "Χωρίς αναζήτηση" -msgstr1 "Χωρίς αναζήτηση" +msgstr0 "" +msgstr1 "" -#, fuzzy, c-format +#, c-format msgid "Handled magnet link (%s, %s)." -msgstr "Απέτυχε (Δεν είναι δυνατή η αποστολή %s: %s)" +msgstr "" msgid "Ignored unusable magnet link." msgstr "" -#, fuzzy msgid "Created download from URL." -msgstr "Δημιουργήθηκε %u λήψη" +msgstr "" msgid "Ignored unusable URL." msgstr "" -#, fuzzy msgid "The given urn type is not supported." -msgstr "Ο τύπος δεν υποστηρίζεται" +msgstr "" -#, fuzzy msgid "The given SHA-1 is not correctly encoded." -msgstr "Ο τύπος δεν υποστηρίζεται" +msgstr "" msgid "Still scanning for shared file, results may be inconclusive." msgstr "" @@ -8817,9 +9097,8 @@ msgid "No" msgstr "Όχι" -#, fuzzy msgid "Tag" -msgstr "Στόχος" +msgstr "" msgid "Yes" msgstr "Ναι" @@ -8827,70 +9106,69 @@ msgid "Maybe" msgstr "" -#, fuzzy msgid "Source" -msgstr "Πηγές" +msgstr "" -#, fuzzy msgid "Alien IP" -msgstr "Εναλλακτικές ονομασίες" +msgstr "" msgid "Alt-Locs" msgstr "" -#, fuzzy msgid "Partial" -msgstr "Λετονία" +msgstr "" + +#, c-format +msgid "%s %.2f%%" +msgstr "" + +msgid "Available" +msgstr "" + +msgid "Last modification" +msgstr "" msgid "Latinized" msgstr "" -#, fuzzy msgid "Pathname" -msgstr "Καναδάς" +msgstr "" -#, fuzzy msgid "File URL" -msgstr "Αρχείο" +msgstr "" -#, fuzzy msgid "Host information" -msgstr "Λεπτομέρειες" +msgstr "" -#, fuzzy msgid "Hostname" -msgstr "Λανθάνουσα μνήμη υπολογιστών" +msgstr "" + +msgid "banned" +msgstr "" -#, fuzzy msgid "Servent ID" -msgstr "ID πελάτη:" +msgstr "" -#, fuzzy msgid "Vendor" -msgstr "Κατασκευαστής:" +msgstr "" -#, fuzzy msgid "Browsable" -msgstr "εξερευνήσιμο" +msgstr "" -#, fuzzy msgid "Hostile" -msgstr "Υπολογιστής" +msgstr "" msgid "Push-proxies" msgstr "" -#, fuzzy msgid "Packet information" -msgstr "Λεπτομέρειες" +msgstr "" -#, fuzzy msgid "Route" -msgstr "έξω" +msgstr "" -#, fuzzy msgid "Protocol" -msgstr "Πουέρτο Ρίκο" +msgstr "" msgid "TTL" msgstr "" @@ -8901,9 +9179,8 @@ msgid "N2R URI" msgstr "" -#, fuzzy msgid "Push URL" -msgstr "Ώθηση" +msgstr "" msgid "Classic URL" msgstr "" @@ -8914,9 +9191,8 @@ msgid "Cannot handle the dropped data" msgstr "Δεν είναι δυνατή η διαχείριση των απορριφθέντων δεδομένων" -#, fuzzy msgid "The normalized search text is too long." -msgstr "Το κείμενο κανονικοποιημένης αναζήτησης είναι πολύ μικρό." +msgstr "" msgid "The normalized search text is too short." msgstr "Το κείμενο κανονικοποιημένης αναζήτησης είναι πολύ μικρό." @@ -8927,26 +9203,12 @@ msgid "The URN in the search text is invalid." msgstr "" -msgid "SHA-1 is unknown." -msgstr "" - -msgid "No Bitzi ticket requested yet." -msgstr "" - -#, fuzzy -msgid "Not in Bitzi database." -msgstr "Όχι στη βάση δεδομένων" - -#, fuzzy msgid "Encoding" -msgstr "εισερχόμενο" +msgstr "" msgid "#" msgstr "#" -msgid "Metadata" -msgstr "" - msgid "Never" msgstr "Ποτέ" @@ -8979,6 +9241,12 @@ msgid "*** CPU OVERLOADED -- TRYING TO SAVE CYCLES ***" msgstr "*** ΥΠΕΡΦΟΡΤΩΣΗ ΕΠΕΞΕΡΓΑΣΤΗ -- ΠΡΟΣΠΑΘΕΙΑ ΟΙΚΟΝΟΜΙΑΣ ΚΥΚΛΩΝ ***" +msgid "*** KERNEL BUFFER SHORTAGE -- LIMITING TCP CONNECTIONS ***" +msgstr "" + +msgid "*** NO LISTENING TCP SOCKET -- NO INBOUND CONNECTIONS ***" +msgstr "" + msgid "*** UPLOADS STALLING, BANDWIDTH SHORTAGE? ***" msgstr "*** ΣΤΑΜΑΤΗΜΑ ΑΠΟΣΤΟΛΩΝ, ΣΥΡΡΙΚΝΩΣΗ ΕΥΡΟΥΣ; ***" @@ -9019,12 +9287,6 @@ msgstr "%u στη λίστα αναμονής" #, c-format -msgid "%u/%u connection" -msgid_plural "%u/%u connections" -msgstr0 "%u/%u σύνδεση" -msgstr1 "%u/%u συνδέσεις" - -#, c-format msgid "%u/%u upload" msgid_plural "%u/%u uploads" msgstr0 "%u/%u αποστολή" @@ -9039,6 +9301,9 @@ msgid "Queue frozen" msgstr "Η λίστα αναμονής πάγωσε" +msgid "Internal" +msgstr "" + msgid "Select a property to see its description." msgstr "Επιλέξτε μία ιδιότητα για να δείτε την περιγραφή της." @@ -9062,9 +9327,9 @@ msgid " E=%u" msgstr "" -#, fuzzy, c-format +#, c-format msgid "%s(%s) TR: %s %s#%u" -msgstr "%s%s(%s) TR: %s" +msgstr "" msgid "stalled" msgstr "διακόπηκε" @@ -9079,9 +9344,8 @@ msgid "Waiting for further request..." msgstr "Αναμονή περαιτέρω αιτήματος..." -#, fuzzy msgid "Reading follow-up request..." -msgstr "Αναμονή περαιτέρω αιτήματος..." +msgstr "" msgid "Transmission aborted" msgstr "Η μεταφορά εγκαταλείφθηκε" @@ -9104,24 +9368,3 @@ msgid "Sent QUEUE, waiting for headers..." msgstr "Εστάλη ΛΙΣΤΑ ΑΝΑΜΟΝΗΣ, αναμονή κεφαλίδων..." - -#, fuzzy -#~ msgid "Linux archives" -#~ msgstr "%u εν ενεργεία" - -#, fuzzy -#~ msgid "Index" -#~ msgstr "Ευρετήριο:" - -#, fuzzy -#~ msgid "Seaerch Media Type" -#~ msgstr "Κριτήριο αναζήτησης" - -#~ msgid "Banned: %s" -#~ msgstr "Απαγόρευση: %s" - -#~ msgid "Banned for %s" -#~ msgstr "Απαγόρευση λόγω %s" - -#~ msgid "Connecting" -#~ msgstr "Γίνεται σύνδεση"
View file
gtk-gnutella-0.98.2.tar.bz2/po/es.po -> gtk-gnutella-1.1.9.tar.bz2/po/es.po
Changed
@@ -1,50 +1,48 @@ -# $Id$ -# -# Spanish translation for gtk-gnutella package. -# Copyright (c) 2000-2001, Yann Grossel. -# Copyright (c) 2001-2010, Raphaël Manfredi. -# This file is distributed under the same license as the gtk-gnutella package. -# Nicolás Lichtmaier <nick@technisys.com.ar>, 2003. -# Paco Arjonilla García <pacoarjonilla@yahoo.es>, 2004-2005. -# Larry Nieves <lnieves@315-web.com>, 2009. +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Raphael Manfredi +# This file is distributed under the same license as the PACKAGE package. # +# Translators: +# Larry Nieves <lnieves@315-web.com>, 2009 +# Nicolás Lichtmaier <nick@technisys.com.ar>, 2003 msgid "" msgstr "" -"Project-Id-Version: gtk-gnutella 0.96.7u\n" +"Project-Id-Version: gtk-gnutella\n" "Report-Msgid-Bugs-To: gtk-gnutella-devel@lists.sf.net\n" -"POT-Creation-Date: 2011-11-22 18:27+0100\n" -"PO-Revision-Date: 2009-03-27 00:04+0100\n" -"Last-Translator: Larry Nieves <lnieves@315-web.com>\n" -"Language-Team: Spanish <lanieves@gmail.com>\n" +"POT-Creation-Date: 2016-03-06 08:49+0100\n" +"PO-Revision-Date: 2016-02-15 08:28+0000\n" +"Last-Translator: Jeroen Asselman <jeroen@asselman.com>\n" +"Language-Team: Spanish (http://www.transifex.com/gtk-gnutella/gtk-gnutella/" +"language/es/)\n" +"Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: es\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Poedit-Language: Spanish\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" -#, c-format -msgid "%s%s%s%s%s fps, %s kbps" -msgstr "%s%s%s%s%s fps, %s kbps" +msgid "Harmful version banned, upgrade required" +msgstr "" -msgid "times|x" -msgstr "x" +msgid "Connection refused" +msgstr "" + +msgid "Use an open Gnutella or G2 servent" +msgstr "" #, c-format msgid "Stopped, will retry with TLS (%s)" -msgstr "Detenido, intentaré con TLS (%s)" +msgstr "Detenido, se intentará con TLS (%s)" #, c-format msgid "Stopped (%s)" -msgstr "Parado (%s)" +msgstr "Detenido (%s)" #, c-format msgid "Too many attempts (%u times)" msgstr "Demasiados intentos (%u veces)" -#, fuzzy msgid "Requeued due to no push-proxy" -msgstr "Reencolado debido a desconexión por tiempo" +msgstr "" msgid "Requeued due to file removal" msgstr "Reencolado por eliminación de archivo" @@ -53,7 +51,7 @@ msgstr "Reencolado por cambio en los atributos del fichero" msgid "Duplicate download" -msgstr "Bajada duplicada" +msgstr "Descarga duplicada" msgid "Nothing else to switch to" msgstr "Nada más a qué cambiarnos" @@ -63,8 +61,8 @@ msgstr "Cambiando (después de un error) a \"%s\"" #, c-format -msgid " at %s - rescheduled for %s%s #%u" -msgstr " a las %s - reprogramado para las %s%s #%u" +msgid " at %s" +msgstr " en %s" msgid "Suspended (SHA1 checking)" msgstr "Suspendido (comprobando SHA1)" @@ -88,6 +86,9 @@ msgid "Download queue is frozen" msgstr "Cola de bajada ha sido congelada" +msgid "Network buffer shortage" +msgstr "" + msgid "No download slot (start)" msgstr "No hay ranuras de bajada (inicio)" @@ -97,12 +98,14 @@ msgid "Connection failed" msgstr "Conexión fallida" +msgid "SHA1 mismatch detected" +msgstr "Detectado distinto SHA1" + msgid "Waiting for server PROX publishing" msgstr "" -#, fuzzy msgid "Waiting for push route" -msgstr "Esperando de nuevo la conexión..." +msgstr "" msgid "Push route lost" msgstr "Ruta push perdida" @@ -261,6 +264,9 @@ msgid "No support for Content-Encoding (%s)" msgstr "No hay soporte para Content-Encoding (%s)" +msgid "Incomplete headers during TLS upgrade" +msgstr "" + msgid "Spammer detected" msgstr "Spamer detectado" @@ -319,6 +325,12 @@ msgid "No Content-Length header" msgstr "Sin encabezado Content-Length" +msgid "Unexpected Content-Type" +msgstr "" + +msgid "No Content-Type" +msgstr "" + msgid "Search already closed" msgstr "Búsqueda cerrada" @@ -355,25 +367,32 @@ msgid "Malformed push reply" msgstr "Respuesta push malformada" -msgid "SHA1 mismatch detected" -msgstr "Detectado distinto SHA1" - msgid ", inbound" msgstr ", entrante" msgid ", outbound" msgstr ", saliente" +msgid ", no-pipeline" +msgstr "" + msgid ", banning" msgstr ", excluyendo" msgid ", g2" msgstr ", g2" +msgid ", fake-g2" +msgstr "" + msgid ", vendor?" msgstr ", ¿vendedor?" #, c-format +msgid "<Browse G2 Host %s>" +msgstr "" + +#, c-format msgid "<Browse Host %s>" msgstr "<Navegar Nodo %s>" @@ -399,6 +418,12 @@ msgid "Requeued due to timeout" msgstr "Reencolado debido a desconexión por tiempo" +msgid "Partial file removed" +msgstr "" + +msgid "File info being reset" +msgstr "" + #, c-format msgid "Downloading (TR: %s)" msgstr "Bajando (TR: %s)" @@ -406,23 +431,20 @@ msgid "Seeding" msgstr "Sembrando" -#, fuzzy msgid "Computing TTH" -msgstr "Calculando SHA1" +msgstr "" msgid "Computing SHA1" msgstr "Calculando SHA1" -#, fuzzy msgid "Waiting for TTH check" -msgstr "Esperando la comprobación de SHA1" +msgstr "" msgid "Waiting for SHA1 check" msgstr "Esperando la comprobación de SHA1" -#, fuzzy msgid "SHA1" -msgstr "SHA-1" +msgstr "SHA1" msgid "OK" msgstr "CORRECTO" @@ -430,13 +452,11 @@ msgid "failed" msgstr "falló" -#, fuzzy msgid "not computed yet" -msgstr "Todavía no hay salida..." +msgstr "aún no calculado" -#, fuzzy msgid "Waiting for moving..." -msgstr "; Esparando para mover..." +msgstr "Esperando a ser movido..." msgid "Moving" msgstr "Moviendo" @@ -454,19 +474,17 @@ msgid "Waiting" msgstr "Esperando" -#, fuzzy msgid "Querying DHT" -msgstr "Hit Petición" +msgstr "" -#, fuzzy msgid "Pending DHT query" -msgstr "Peticiones locales pendientes" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "%u/%u successful DHT lookup" msgid_plural "%u/%u successful DHT lookups" -msgstr0 "DHT búsquedas de 'alt-loc' exitosas" -msgstr1 "DHT búsquedas de 'alt-loc' exitosas" +msgstr0 "" +msgstr1 "" #, c-format msgid "%u DHT lookup" @@ -474,156 +492,20 @@ msgstr0 "" msgstr1 "" -#, fuzzy, c-format +#, c-format msgid "Got %d host from %s" msgid_plural "Got %d hosts from %s" -msgstr0 "Recibido %d nodo del caché de nodos UDP %s" -msgstr1 "Recibidos %d nodos del caché de nodos UDP %s" +msgstr0 "" +msgstr1 "" #, c-format -msgid "Bootstrapping from %s" -msgstr "" - -msgid "Bad size" -msgstr "Tamaño incorrecto" - -msgid "Too small" -msgstr "Demasiado pequeño" - -msgid "Too large" -msgstr "Muy grande" - -msgid "Way too large" -msgstr "Demasiado grande" - -msgid "Unknown message type" -msgstr "Tipo de mensaje desconocido" - -msgid "Unexpected message" -msgstr "Mensaje inesperado" - -msgid "Message sent with TTL = 0" -msgstr "Mensaje enviado con TTL = 0" - -msgid "Improper hops/ttl combination" -msgstr "Combinación saltos/ttl incongruente" - -msgid "Max TTL exceeded" -msgstr "TTL máximo excedido" - -msgid "Message throttle" -msgstr "Umbral de mensajes" - -#, fuzzy -msgid "Message matched limits" -msgstr "Límites de tamaño en mensajes Gnutella" - -msgid "Unusable Pong" -msgstr "Pong no usable" - -msgid "Hard TTL limit reached" -msgstr "Límite TTL duro alcanzado" - -msgid "Max hop count reached" -msgstr "Número máximo de saltos alcanzados" - -msgid "Route lost" -msgstr "Camino perdido" - -msgid "No route" -msgstr "No hay camino" - -msgid "Duplicate message" -msgstr "Mensaje duplicado" - -msgid "Message to banned GUID" -msgstr "Mensaje para GUID baneado" - -#, fuzzy -msgid "Message from banned GUID" -msgstr "Mensaje para GUID baneado" - -msgid "Node shutting down" -msgstr "Nodo apagándose" - -msgid "TX flow control" -msgstr "Control de flujo TX" - -msgid "Query text had no trailing NUL" -msgstr "Texto de la petición to terminaba en NUL" - -msgid "Query text too short" -msgstr "Texto de la petición demasiado corto" - -msgid "Query had unnecessary overhead" -msgstr "Petición tenía recarga innecesaria" - -msgid "Query had bad URN" -msgstr "Petición tenía URN incorrecto" - -msgid "Message with malformed SHA1" -msgstr "Mensaje con SHA1 incorrecto" - -msgid "Message with malformed UTF-8" -msgstr "Mensaje con UTF-8 incorrecto" - -msgid "Malformed Query Hit" -msgstr "Query Hit malformado" - -msgid "Bad return address" -msgstr "Dirección de retorno incorrecta" - -msgid "Hostile IP address" -msgstr "Dirección IP hostil" - -msgid "Bogus result from Morpheus" +msgid "Connecting to web cache %s" msgstr "" -msgid "Spam" -msgstr "Spam" - -msgid "Evil filename" -msgstr "Nombre de archivo \"malévolo\"" - -#, fuzzy -msgid "Improper media type" -msgstr "Término de búsqueda" - -msgid "Payload inflating error" -msgstr "error al inflar carga" - -msgid "Unknown header flags present" -msgstr "Indicaciones desconocidas presentes en encabezado" - -msgid "Own search results" -msgstr "Resultados de búsqueda propios" - -#, fuzzy -msgid "Own queries" -msgstr "Peticiones de recepción" - -msgid "Ancient query format" -msgstr "Formato de petición anticuado" - -msgid "Blank Servent ID" -msgstr "ID de nodo vacía" - -msgid "GUESS Query missing token" +#, c-format +msgid "Bootstrapping from %s" msgstr "" -#, fuzzy -msgid "GUESS Invalid query token" -msgstr "Símbolo de seguridad DHT inválido" - -msgid "DHT Invalid security token" -msgstr "Símbolo de seguridad DHT inválido" - -msgid "DHT Too many STORE requests" -msgstr "DHT demasiadas peticiones STORE" - -msgid "DHT Malformed message" -msgstr "Mensaje DHT malformado" - #, c-format msgid "Shutdown (%s)" msgstr "Cerrando (%s)" @@ -634,27 +516,6 @@ msgstr0 "Recibido %d pong de conexión" msgstr1 "Recibidos %d pongs de conexiones" -msgid "Sent crawling info" -msgstr "Enviada información de arrastre" - -msgid "Cannot setup compressing TX stack" -msgstr "Imposible configurar la pila de TX comprimida" - -#, c-format -msgid "Got BYE %d %.*s" -msgstr "Recibido BYE %d %.*s" - -#, c-format -msgid "Weird HELLO %s" -msgstr "HELLO extraño %s" - -#, c-format -msgid "HELLO %s error %d (%s)" -msgstr "HELLO %s error %d (%s)" - -msgid "Shielded node" -msgstr "Nodo acorazado" - msgid "Gnet connections disabled" msgstr "Conexiones Gnet deshabilitadas" @@ -662,6 +523,10 @@ msgstr "Conexión sin comprimir" #, c-format +msgid "Too many G2 hubs (%u max)" +msgstr "" + +#, c-format msgid "Too many leaves (%d max)" msgstr "Demasiadas hojas (%d max)" @@ -686,6 +551,9 @@ msgid "Not an ultra node" msgstr "No es un nodo ultra" +msgid "Unknown error" +msgstr "Error desconocido" + msgid "Unstable IP address" msgstr "Dirección IP inestable" @@ -699,22 +567,50 @@ msgid "Not connecting: %s" msgstr "No conectando: %s" +msgid "Cannot setup compressing TX stack" +msgstr "Imposible configurar la pila de TX comprimida" + +msgid "Sent crawling info" +msgstr "Enviada información de arrastre" + +#, c-format +msgid "Got BYE %d %.*s" +msgstr "Recibido BYE %d %.*s" + +#, c-format +msgid "Weird HELLO %s" +msgstr "HELLO extraño %s" + +#, c-format +msgid "HELLO %s error %d (%s)" +msgstr "HELLO %s error %d (%s)" + +msgid "Shielded node" +msgstr "Nodo acorazado" + msgid "Protocol not acceptable" msgstr "Protocolo no aceptable" +msgid "Conflict" +msgstr "" + +msgid "Upgrade Header Missing" +msgstr "" + msgid "Servent Shutdown" msgstr "Nodo Cerrado" -#, fuzzy msgid "Not a network member" -msgstr "Modo de red Gnutella" +msgstr "No es miembro de la red" + +msgid "Need a G2 Hub" +msgstr "" msgid "Too frequent crawling" msgstr "Arrastre demasiado frecuente" -#, fuzzy msgid "Already connected to this GUID" -msgstr "Ya está conectado" +msgstr "Actualmente conectado a este GUID" #, c-format msgid "Vendor would exceed %d%% of our slots" @@ -759,20 +655,23 @@ msgid "Pseudo UDP node" msgstr "Pseudo-nodo UDP" -#, fuzzy +msgid "Pseudo semi-reliable UDP node" +msgstr "" + +msgid "Pseudo G2 UDP node" +msgstr "" + msgid "Pseudo DHT node" -msgstr "Pseudo-nodo UDP" +msgstr "" msgid "Already connected" msgstr "Ya está conectado" -#, fuzzy msgid "Limited connection" -msgstr "Conexiones normales" +msgstr "Conexión limitada" -#, fuzzy msgid "Write error during HELLO" -msgstr "Error de escritura durante HELLO: %s" +msgstr "" #, c-format msgid "Write error during HELLO: %s" @@ -807,6 +706,9 @@ msgid "DHT" msgstr "DHT" +msgid "G2 hub" +msgstr "" + msgid "Unknown" msgstr "Desconocido" @@ -821,9 +723,9 @@ msgid "Must wait %u more seconds before resending \"What's New\"" msgstr "" -#, fuzzy, c-format +#, c-format msgid "mkdir(\"%s\") failed: %m" -msgstr "Escritura fallida: %s" +msgstr "" msgid "Can't find your home directory!" msgstr "¡Directorio de usuario no encontrado!" @@ -835,13 +737,17 @@ msgid "creating configuration directory \"%s\"" msgstr "creando directorio de configuración \"%s\"" -#, fuzzy, c-format +#, c-format msgid "creating directory \"%s\" for %s" -msgstr "creando directorio de configuración \"%s\"" +msgstr "" -#, fuzzy -msgid "You seem to have left another gtk-gnutella running" -msgstr "Pareces haber dejado corriendo otro gtk-gnutella\n" +#, c-format +msgid "Another gtk-gnutella supervisor is running as PID %lu" +msgstr "" + +#, c-format +msgid "Another gtk-gnutella is running as PID %lu" +msgstr "" msgid "Cannot proceed without valid configuration directory" msgstr "No se puede continuar sin una configuración de directorio válida" @@ -855,9 +761,6 @@ msgid "Failed to create local socket" msgstr "Fallo al crear socket local" -msgid "Failed to create listening sockets" -msgstr "Fallo al crear sockets de escucha" - msgid "Can only run as a leaf when TCP-firewalled" msgstr "" "Sólo se puede ejecutar en modo hoja cuando se está tras uncortafuegos TCP" @@ -868,6 +771,12 @@ msgid "Got EOF" msgstr "Recibido EOF" +msgid "TLS handshake failed" +msgstr "" + +msgid "Connection locally failed" +msgstr "" + msgid "Write failed (Input Exception)" msgstr "Escritura fallida (Excepción de entrada)" @@ -888,21 +797,111 @@ msgid "Connect back timeout" msgstr "Conexión excedió tiempo de espera" +msgid "Request timeout" +msgstr "Tiempo de espera excedido para la solicitud" + msgid "Timeout waiting for follow-up" msgstr "Tiempo de espera excedido" msgid "Lifetime expired" msgstr "Tiempo de vida expirado" +msgid "Unauthorized" +msgstr "No autorizado" + +#, c-format +msgid "Limiting connections from %s" +msgstr "Limitando conexiones desde %s" + +msgid "No reason given" +msgstr "No se indicó una razón" + +msgid "Bad Request" +msgstr "Solicitud errónea" + +msgid "Header too large" +msgstr "Encabezado demasiado grande" + +msgid "Input buffer full" +msgstr "Búfer de entrada lleno" + +msgid "Extra data after HTTP header" +msgstr "Datos adicionales posteriores al encabezado HTTP" + msgid "Unable to send GIV" -msgstr "Incapaz de enviar GIV" +msgstr "No se pudo enviar GIV" + +msgid "Not Found" +msgstr "No encontrado" + +msgid "File was modified" +msgstr "El archivo ha sido modificado" + +msgid "Moved Permanently" +msgstr "Movido permanentemente" + +msgid "File index/name mismatch" +msgstr "" + +msgid "URN Not Found (urn:sha1)" +msgstr "URN no encontrado (urn:sha1)" + +msgid "SHA1 is being recomputed" +msgstr "El SHA1 se está recalculando" + +msgid "Library being rebuilt" +msgstr "La biblioteca se está recompilando" + +msgid "Malformed URN in /uri-res/N2R request" +msgstr "" + +msgid "Malformed URN in /uri-res/N2X request" +msgstr "" + +msgid "TTH is being computed" +msgstr "" msgid "<Browse Host Request>" msgstr "<Petición de Consultar Nodo>" +msgid "Browse Host Disabled" +msgstr "" + +#, c-format +msgid "Redirected to %s:%u" +msgstr "Redirigido a %s:%u" + +msgid "Not Modified" +msgstr "No modificado" + msgid "Stalling upload replaced" msgstr "Subida atascándose reemplazada" +msgid "Already downloading this file" +msgstr "Ya se está descargando este archivo" + +msgid "Malformed Range request" +msgstr "" + +msgid "Requested range not satisfiable" +msgstr "" + +msgid "Requested range not available yet" +msgstr "" + +msgid "Queue full" +msgstr "" + +msgid "Another connection is still active" +msgstr "Aún está activa otra conexión" + +#, c-format +msgid "%s not honoured; removed from PARQ queue" +msgstr "" + +msgid "Minimum retry delay" +msgstr "" + #, c-format msgid "Queued (slot %d, ETA: %s)" msgstr "Encolado (ranura %d, ETA: %s)" @@ -910,9 +909,12 @@ msgid "Cannot send whole HTTP status" msgstr "Imposible enviar el estado completo HTTP" +msgid "Not Acceptable" +msgstr "No aceptable" + #, c-format -msgid "<Browse Host Request> %s%s%s" -msgstr "<Petición de Navegar Nodo> %s%s%s" +msgid "<Browse Host %sRequest> %s%s%s" +msgstr "" msgid "query hits" msgstr "hits de peticiones" @@ -926,6 +928,40 @@ msgid ", chunked" msgstr ", chunked" +msgid "THEX failure" +msgstr "" + +msgid "EOF while sinking" +msgstr "" + +#, c-format +msgid "Read error while sinking: %m" +msgstr "" + +msgid "Content Too Large" +msgstr "" + +msgid "Unknown/Missing Protocol Tag" +msgstr "" + +msgid "Missing Host Header" +msgstr "" + +msgid "Not Implemented" +msgstr "No implementado" + +msgid "Bad URI" +msgstr "URI errónea" + +msgid "Bad Path" +msgstr "Ruta errónea" + +msgid "No Content Allowed" +msgstr "Contenido no permitido" + +msgid "Sharing currently disabled" +msgstr "" + msgid "Write exception" msgstr "Excepción de escritura" @@ -955,15 +991,1208 @@ #, c-format msgid " - Newer versions available: release %s / from git %s" -msgstr "- Nuevas versiones disponibles: versión %s / basada en git %s" +msgstr " - Nuevas versiones disponibles: versión %s / basada en git %s" #, c-format msgid " - Newer version available: release %s" -msgstr "- Nueva versión disponible: versión %s" +msgstr " - Nueva versión disponible: versión %s" #, c-format msgid " - Newer version available: from git %s" -msgstr "- Nueva versión disponible: basada en git %s" +msgstr " - Nueva versión disponible: basada en git %s" + +msgid "Routing errors" +msgstr "Errores de enrutado" + +msgid "Routing table chunks" +msgstr "" + +msgid "Routing table message capacity" +msgstr "" + +msgid "Routing table message count" +msgstr "" + +msgid "Routing through transient node avoided" +msgstr "" + +msgid "Duplicates with higher TTL" +msgstr "Duplicados con TTL mayor" + +msgid "SPAM SHA1 database hits" +msgstr "" + +msgid "SPAM filename and size hits" +msgstr "" + +msgid "SPAM fake hits" +msgstr "" + +msgid "SPAM duplicate hits" +msgstr "" + +msgid "SPAM dynamically caught hostile IP addresses" +msgstr "" + +msgid "SPAM dynamically caught hostile IP held" +msgstr "" + +msgid "SPAM spotted spamming IP addresses held" +msgstr "" + +msgid "Searches to local DB" +msgstr "Búsquedas en BD locales" + +msgid "Hits on local DB" +msgstr "Toques en BD local" + +msgid "Hits on local partial files" +msgstr "" + +msgid "Hits on \"what's new?\" queries" +msgstr "" + +msgid "Query hits received for local queries" +msgstr "Query hits recibidos para peticiones locales" + +msgid "G2 searches to local DB" +msgstr "" + +msgid "G2 hits on local DB" +msgstr "" + +msgid "G2 hits on local partial files" +msgstr "" + +msgid "Query hits received for OOB-proxied queries" +msgstr "Query hits recibidos para peticiones a través de proxy OOB" + +msgid "Queries requesting OOB hit delivery" +msgstr "Peticiones de entrega de hit OOB" + +msgid "Stripped OOB flag on queries" +msgstr "Indicador OOB eliminado de peticiones" + +msgid "Ignored OOB queries due to unclaimed hits" +msgstr "" + +msgid "Duplicate OOB-proxied queries" +msgstr "Peticiones OOB-proxied duplicadas" + +msgid "OOB hits received for OOB-proxied queries" +msgstr "Hits OOB recibidos para peticiones OOB-proxied" + +msgid "OOB hits bearing alien IP address" +msgstr "Hits OOB con direcciones IP extrañas" + +msgid "OOB hits ignored due to identified spamming address" +msgstr "" + +msgid "OOB hits ignored due to unsecure promise from known secure host" +msgstr "" + +msgid "Unclaimed locally-generated OOB hits" +msgstr "Hits OOB generados localmente no reclamados" + +msgid "Partially claimed locally-generated OOB hits" +msgstr "Hits OOB generados localmente parcialmente reclamados" + +msgid "Spurious OOB hit claiming received" +msgstr "Reclamos de Hits OOB espurios recibidos" + +msgid "Unrequested OOB hits received" +msgstr "Hits OOB no solicitados recibidos" + +msgid "Received query hits for untracked queries" +msgstr "" + +msgid "Tracked query MUIDs" +msgstr "" + +msgid "Compacted queries" +msgstr "Peticiones compactadas" + +msgid "Bytes saved by compacting" +msgstr "Bytes ahorrados por compactación" + +msgid "UTF8 queries" +msgstr "Peticiones UTF8" + +msgid "SHA1 queries" +msgstr "Peticiones SHA1" + +msgid "\"What's New?\" queries" +msgstr "" + +msgid "UTF8 G2 queries" +msgstr "" + +msgid "SHA1 G2 queries" +msgstr "" + +msgid "GUESS queries" +msgstr "" + +msgid "GUESS queries (0.2)" +msgstr "" + +msgid "GUESS link cache size" +msgstr "" + +msgid "GUESS cached query keys held" +msgstr "" + +msgid "GUESS cached 0.2 hosts held" +msgstr "" + +msgid "GUESS cached G2 hosts held" +msgstr "" + +msgid "GUESS locally generated queries" +msgstr "" + +msgid "GUESS currently running queries" +msgstr "" + +msgid "GUESS hits received for locally generated queries" +msgstr "" + +msgid "GUESS ultra nodes queried" +msgstr "" + +msgid "GUESS ultra nodes sending back an acknowledgment" +msgstr "" + +msgid "GUESS G2 nodes queried" +msgstr "" + +msgid "GUESS G2 nodes sending back an acknowledgment" +msgstr "" + +msgid "Throttled local push messages" +msgstr "" + +msgid "Throttled received push messages" +msgstr "" + +msgid "Broadcasted push messages" +msgstr "Mensajes 'push' retransmitidos" + +msgid "Push-proxy UDP relayed messages" +msgstr "Mensajes 'push-proxy' UDP retransmitidos" + +msgid "Push-proxy TCP relayed messages" +msgstr "Mensajes 'push-proxy' TCP retransmitidos" + +msgid "Push-proxy TCP for FW<->FW transfers" +msgstr "" + +msgid "Push-proxy broadcasted messages" +msgstr "Mensajes 'push-proxy' transmitidos" + +msgid "Push-proxy found un-proxied local route" +msgstr "" + +msgid "Push-proxy lookup failures" +msgstr "Fallas de búsqueda de push-proxy" + +msgid "Push relayed via local route" +msgstr "Push entregado a través de ruta local" + +msgid "Push relayed via routing table" +msgstr "Empuje enviado a través de tabla de rutas" + +msgid "Locally generated dynamic queries" +msgstr "Peticiones dinámicas generadas localmente" + +msgid "Leaf-generated dynamic queries" +msgstr "Peticiones dinámicas generadas por hojas" + +msgid "OOB-proxied leaf queries" +msgstr "Peticiones de hojas delegadas fuera de banda" + +msgid "Fully completed dynamic queries" +msgstr "Peticiones dinámicas totalmente completadas" + +msgid "Partially completed dynamic queries" +msgstr "Peticiones dinámicas parcialmente completadas" + +msgid "Dynamic queries ended with no results" +msgstr "Peticiones dinámicas terminaron sin resultados" + +msgid "Fully completed dynamic queries getting late results" +msgstr "" +"Peticiones dinámicas totalmente completadas recibiendo resultados tardíos" + +msgid "Dynamic queries with partial late results" +msgstr "Peticiones dinámicas parcialmente recibiendo resultados tardíos" + +msgid "Dynamic queries completed by late results" +msgstr "Peticiones dinámicas completadas por resultados tardíos" + +msgid "Queries seen from GTKG" +msgstr "Peticiones vistas desde GTKG" + +msgid "Queries seen from GTKG that were re-queries" +msgstr "Peticiones vistas desde GTKG que eran repetidas" + +msgid "Queries advertising support of GGEP \"H\"" +msgstr "Peticiones anunciando soporte de GGEP \"H\"" + +msgid "Queries advertising support of semi-reliable UDP" +msgstr "" + +msgid "GIV callbacks received" +msgstr "Llamadas GIV recibidas" + +msgid "GIV discarded due to no suitable download" +msgstr "GIV descartadas al no encontrar bajadas apropiadas" + +msgid "QUEUE callbacks received" +msgstr "Llamadas QUEUE recibidas" + +msgid "QUEUE discarded due to no suitable download" +msgstr "QUEUE descartadas al no encontrar bajadas apropiadas" + +msgid "File descriptors banned running count" +msgstr "" + +msgid "UDP read-ahead datagram running count" +msgstr "" + +msgid "UDP read-ahead datagram running bytes" +msgstr "" + +msgid "UDP read-ahead datagram \"old\" processed" +msgstr "" + +msgid "UDP read-ahead datagram max count" +msgstr "" + +msgid "UDP read-ahead datagram max bytes" +msgstr "" + +msgid "UDP read-ahead datagram max delay" +msgstr "" + +msgid "UDP push messages received for FW<->FW connections" +msgstr "" + +msgid "UDP push messages requesting FW<->FW connection with ourselves" +msgstr "" + +msgid "UDP push messages patched for FW<->FW connections" +msgstr "" + +msgid "UDP UHC pings received" +msgstr "" + +msgid "UDP UHC pongs sent" +msgstr "" + +msgid "UDP messages with bogus source IP" +msgstr "Mensajes UDP con IP de origen erróneo" + +msgid "UDP messages from shunned IP (discarded)" +msgstr "" + +msgid "UDP truncated incoming messages" +msgstr "" + +msgid "Alien UDP messages (non-Gnutella)" +msgstr "Mensajes UDP alienígenas (externos a Gnutella)" + +msgid "Unprocessed UDP Gnutella messages" +msgstr "Mensajes UDP Gnutella sin procesar" + +msgid "Compressed UDP messages enqueued" +msgstr "Mensajes UDP comprimidos en cola" + +msgid "Compressed UDP messages received" +msgstr "Mensajes UDP comprimidos recibidos" + +msgid "Candidates for UDP message compression" +msgstr "" + +msgid "Uncompressed UDP messages due to no gain" +msgstr "Mensajes UDP no comprimidos debido a falta de ganancia" + +msgid "Ambiguous UDP messages received" +msgstr "" + +msgid "Ambiguous UDP messages inspected more deeply" +msgstr "" + +msgid "Ambiguous UDP messages handled as semi-reliable UDP" +msgstr "" + +msgid "Semi-reliable UDP total messages given for transmission" +msgstr "" + +msgid "Semi-reliable UDP total messages deflated" +msgstr "" + +msgid "Semi-reliable UDP total messages unsent" +msgstr "" + +msgid "Semi-reliable UDP total messages dropped due to temporary ban" +msgstr "" + +msgid "Semi-reliable UDP total messages sent to known responsive hosts" +msgstr "" + +msgid "Semi-reliable UDP total messages partially sent due to clogging" +msgstr "" + +msgid "Semi-reliable UDP reliable messages given for transmission" +msgstr "" + +msgid "Semi-reliable UDP reliable messages correctly transmited" +msgstr "" + +msgid "Semi-reliable UDP reliable messages not fully acknowledged" +msgstr "" + +msgid "Semi-reliable UDP fragments sent" +msgstr "" + +msgid "Semi-reliable UDP fragments resent" +msgstr "" + +msgid "Semi-reliable UDP fragment sendings avoided" +msgstr "" + +msgid "Semi-reliable UDP fragments sent too many times" +msgstr "" + +msgid "Semi-reliable UDP total acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP spurious acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP invalid acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP acknowledgments re-queued for sending" +msgstr "" + +msgid "Semi-reliable UDP plain acknowledgments dropped" +msgstr "" + +msgid "Semi-reliable UDP enhanced acknowledgments dropped" +msgstr "" + +msgid "Semi-reliable UDP plain acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP EARs sent" +msgstr "" + +msgid "Semi-reliable UDP too many EARs sent" +msgstr "" + +msgid "Semi-reliable UDP EAR negative acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP acknowledgments received after sending EARs" +msgstr "" + +msgid "Semi-reliable UDP fragments received" +msgstr "" + +msgid "Semi-reliable UDP duplicate fragments received" +msgstr "" + +msgid "Semi-reliable UDP unreliable fragments received" +msgstr "" + +msgid "Semi-reliable UDP dropped received fragments" +msgstr "" + +msgid "Semi-reliable UDP fragments received whilst lingering" +msgstr "" + +msgid "Semi-reliable UDP messages expired before re-assembly" +msgstr "" + +msgid "Semi-reliable UDP messages re-assembled completely" +msgstr "" + +msgid "Semi-reliable UDP messages inflated successfully" +msgstr "" + +msgid "Semi-reliable UDP messages inflated incorrectly" +msgstr "" + +msgid "Semi-reliable UDP unreliable messages received" +msgstr "" + +msgid "Semi-reliable UDP empty messages received" +msgstr "" + +msgid "Semi-reliable UDP total acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP avoided acknowledgment sendings" +msgstr "" + +msgid "Semi-reliable UDP EARs received" +msgstr "" + +msgid "Semi-reliable UDP EARs received for unknown message" +msgstr "" + +msgid "Semi-reliable UDP EARs received whilst lingering" +msgstr "" + +msgid "Semi-reliable UDP fragments from hostile IP addresses" +msgstr "" + +msgid "UDP G2 hits rerouted to hub for delivery" +msgstr "" + +msgid "UDP G2 hits undelivered" +msgstr "" + +msgid "Consolidated servers (after GUID and IP address linking)" +msgstr "Servidores consolidados (después de enlace de GUID e IP)" + +msgid "Duplicate downloads found during server consolidation" +msgstr "Encontradas bajadas duplicadas durante la consolidación de servidores" + +msgid "Discovered server GUIDs" +msgstr "GUIDs de servidores descubiertas" + +msgid "Changed server GUIDs" +msgstr "GUIDs de servidores cambiadas" + +msgid "Detected GUID collisions" +msgstr "" + +msgid "Detected collisions with our own GUID" +msgstr "Colisiones detectadas con nuestra propia GUID" + +msgid "GUID dynamically banned" +msgstr "" + +msgid "Firewalled node info for known hosts received in upload requests" +msgstr "" +"Recinida información de nodo tras cortafuego para nodo conocido en petición " +"de subida" + +msgid "Revitalized PUSH routes" +msgstr "" + +msgid "Collected new PUSH proxies from other query hits" +msgstr "" + +msgid "Attempted download resource switching on completion" +msgstr "Intento de cambio en bajada de recurso al completar" + +msgid "Attempted download resource switching after error" +msgstr "Intento de cambio en bajada de recurso después de error" + +msgid "Successful download resource switching (all kind)" +msgstr "Cambio en bajada de recurso exitoso (todo tipo)" + +msgid "Successful download resource switching between plain files" +msgstr "Cambio en bajada de recurso exitoso entre archivos planos" + +msgid "Successful download resource switching after error" +msgstr "Cambio en bajada de recurso exitoso después de error" + +msgid "Actively queued after resource switching attempt" +msgstr "Encolado activamente después de intento de cambio de recurso" + +msgid "Sunk HTTP reply data on error codes" +msgstr "Datos de respuesta HTTP hundidos por códigos de error" + +msgid "Ignored downloaded data" +msgstr "Datos descargados ignorados" + +msgid "Ignoring requested after data mismatch" +msgstr "Ignorando petición luego de discrepancia de datos" + +msgid "Ignoring requested to preserve connection" +msgstr "Ignorando petición para preservar conexión" + +msgid "Ignoring requested due to aggressive swarming" +msgstr "Ignorando petición debido a enjambre agresivo" + +msgid "Ignoring refused (data too large or server too slow)" +msgstr "" +"Ignorando rechazos (datos demasiados grandes o servidor demasiado lento)" + +msgid "Client resource switching (all detected)" +msgstr "Cambio de recursos por clientes (todos los detectados)" + +msgid "Client resource switching between plain files" +msgstr "Cambio de recursos por clientes entre archivos planos" + +msgid "Client follow-up request after HTTP error was returned" +msgstr "" +"Peticiones de seguimiento por clientes después de retorno de error HTTP" + +msgid "PARQ client resource switching in slots (SHA-1 based)" +msgstr "PARQ cambio de recursos por clientes en ranuras (basado en SHA-1)" + +msgid "PARQ client retry-after violation" +msgstr "PARQ violaciones de reintento por clientes" + +msgid "PARQ client kicked out after too many retry-after violations" +msgstr "PARQ cliente pateado por demasiadas violaciones retry-after" + +msgid "PARQ upload slot limit overrides" +msgstr "PARQ invalidaciones de límite de ranuras de subida" + +msgid "PARQ quick upload slots granted" +msgstr "PARQ ranuras de subida rápida concedidas" + +msgid "PARQ QUEUE sending attempts" +msgstr "PARQ intentos de envío QUEUE" + +msgid "PARQ QUEUE messages sent" +msgstr "PARQ mensajes QUEUE enviados" + +msgid "PARQ QUEUE follow-up requests received" +msgstr "PARQ peticiones de seguimiento QUEUE recibidas" + +msgid "Launched SHA-1 file verifications" +msgstr "" + +msgid "Launched TTH file verifications" +msgstr "" + +msgid "Re-seeding of orphan downloads through query hits" +msgstr "Re-siembra de descargas huérfanas a través de hits de peticiones" + +msgid "Re-seeding of orphan downloads through upload requests" +msgstr "" + +msgid "RUDP sent bytes" +msgstr "" + +msgid "RUDP received bytes" +msgstr "" + +msgid "DHT estimated amount of nodes" +msgstr "DHT número estimado de nodos" + +msgid "DHT standard error of estimated amount of nodes" +msgstr "" + +msgid "DHT k-ball theoretical frontier (bits)" +msgstr "" + +msgid "DHT k-ball furthest frontier (bits)" +msgstr "DHT frontera más lejana a k-bola (bits)" + +msgid "DHT k-ball closeest frontier (bits)" +msgstr "DHT frontera más cercana a k-bola (bits)" + +msgid "DHT routing table buckets" +msgstr "DHT tobos en tabla de rutas" + +msgid "DHT routing table leaves" +msgstr "DHT hojas en tabla de rutas" + +msgid "DHT routing table maximum depth" +msgstr "DHT máxima profundidad de tabla de rutas" + +msgid "DHT routing table good nodes" +msgstr "DHT Nodos buenos en tabla de rutas" + +msgid "DHT routing table stale nodes" +msgstr "DHT nodos estancados en tabla de rutas" + +msgid "DHT routing table pending nodes" +msgstr "DHT Nodos pendientes en tabla de rutas" + +msgid "DHT routing table evicted nodes" +msgstr "DHT nodos desterrados de tabla de rutas" + +msgid "DHT routing table evicted firewalled nodes" +msgstr "DHT nodos tras cortafuegos desterrados de tabla de rutas" + +msgid "DHT routing table evicted nodes due to quota" +msgstr "" + +msgid "DHT routing table promoted pending nodes" +msgstr "DHT nodos pendientes promovidos en tabla de rutas" + +msgid "DHT routing table pinged promoted nodes" +msgstr "" + +msgid "DHT routing table rejected node due to bucket network quota" +msgstr "" + +msgid "DHT routing table rejected node due to global network quota" +msgstr "" + +msgid "DHT completed bucket refreshes" +msgstr "DHT refrescos de tobos completados" + +msgid "DHT forced bucket refreshes" +msgstr "" + +msgid "DHT forced bucket merges" +msgstr "" + +msgid "DHT bucket merges" +msgstr "" + +msgid "DHT bucket splits" +msgstr "" + +msgid "DHT denied non-splitable bucket refresh" +msgstr "DHT refrescos denegados de tobos indivisibles" + +msgid "DHT initiated bucket alive checks" +msgstr "DHT revisiones de tobos vivos iniciadas" + +msgid "DHT alive pings sent to good nodes" +msgstr "DHT notificaciones \"todavía vivo\" enviadas a nodos buenos" + +msgid "DHT alive pings sent to stale nodes" +msgstr "DHT notificaciones \"todavía vivo\" enviadas a nodos estancados" + +msgid "DHT alive pings sent to shutdowning nodes" +msgstr "" + +msgid "DHT alive pings avoided" +msgstr "" + +msgid "DHT alive pings skipped" +msgstr "" + +msgid "DHT revitalized stale nodes on RPC reply" +msgstr "" + +msgid "DHT value store rejected on IP/network quota grounds" +msgstr "DHT almacén de valores rechazado debido a cuota IP/Red" + +msgid "DHT value store rejected on creator validation grounds" +msgstr "DHT almacén de valores rechazado debido a validación de creador" + +msgid "DHT nodes rejected during lookup based on network quota" +msgstr "" + +msgid "DHT nodes rejected during lookup based on suspicious proximity" +msgstr "" + +msgid "DHT nodes rejected during lookup based on frequency divergence" +msgstr "" + +msgid "DHT node contact IP addresses fixed during lookup" +msgstr "" + +msgid "DHT keys held" +msgstr "DHT claves mantenidas" + +msgid "DHT cached keys held" +msgstr "DHT claves mantenidas en caché" + +msgid "DHT values held" +msgstr "DHT valores en poder" + +msgid "DHT cached KUID targets held" +msgstr "" + +msgid "DHT cached closest root nodes" +msgstr "" + +msgid "DHT cached roots exact hits" +msgstr "" + +msgid "DHT cached roots approximate hits" +msgstr "" + +msgid "DHT cached roots misses" +msgstr "" + +msgid "DHT cached roots lookups within k-ball" +msgstr "" + +msgid "DHT cached roots contact address refreshed" +msgstr "" + +msgid "DHT cached security tokens held" +msgstr "" + +msgid "DHT cached security tokens hits" +msgstr "" + +msgid "DHT stable node information held" +msgstr "" + +msgid "DHT local hits on value lookups" +msgstr "DHT hits locales en búsquedas de valores" + +msgid "DHT local hits returning values from cached keys" +msgstr "DHT hits locales retornando valores desde claves en caché" + +msgid "DHT returned expanded values" +msgstr "DHT valores expandidos retornados" + +msgid "DHT returned values as secondary keys" +msgstr "DHT valores retornados como claves secundarias" + +msgid "DHT claimed values via secondary keys" +msgstr "DHT valores reclamados vía claves secundarias" + +msgid "DHT returned cached expanded values" +msgstr "DHT valores expandidos retornados desde caché" + +msgid "DHT returned cached values as secondary-keys" +msgstr "DHT valores retornados desde caché como claves secundarias" + +msgid "DHT claimed cached values via secondary keys" +msgstr "DHT valores reclamados del caché vía claves secundarias" + +msgid "DHT successfully received value publications" +msgstr "" + +msgid "DHT successfully received value removals" +msgstr "" + +msgid "DHT replication of stale value avoided" +msgstr "DHT replicaciones evitadas de valores estancado" + +msgid "DHT replication of held values" +msgstr "DHT replicaciones de valores en poder" + +msgid "DHT republishing of held values" +msgstr "DHT republicaciones de valores en poder" + +msgid "DHT secondary-key value fetch issued" +msgstr "" + +msgid "DHT duplicate values returned in lookups" +msgstr "DHT valores duplicados retornados en búsquedas" + +msgid "DHT detected KUID collisions" +msgstr "DHT colisiones de KUIDs detectadas" + +msgid "DHT detected collisions with our own KUID" +msgstr "DHT colisiones detectadas con nuestra propia KUID" + +msgid "DHT caching attempts" +msgstr "" + +msgid "DHT caching ended successfully" +msgstr "" + +msgid "DHT caching partially completed" +msgstr "" + +msgid "DHT key-offloading checks after discovering new closest node" +msgstr "" + +msgid "DHT keys selected for offloading" +msgstr "" + +msgid "DHT key-offloading attempts" +msgstr "" + +msgid "DHT key-offloading ended successfully" +msgstr "" + +msgid "DHT key-offloading partially completed" +msgstr "" + +msgid "DHT values successfully offloaded" +msgstr "" + +msgid "DHT incoming messages" +msgstr "" + +msgid "DHT incoming messages with UDP-matching contact address" +msgstr "" + +msgid "DHT incoming messages with contact address fixed" +msgstr "" + +msgid "DHT incoming messages from hostile addresses" +msgstr "" + +msgid "DHT incoming messages with hostile contact address" +msgstr "" + +msgid "DHT RPC messages prepared" +msgstr "" + +msgid "DHT RPC messages cancelled" +msgstr "" + +msgid "DHT RPC timed out" +msgstr "" + +msgid "DHT RPC replies received" +msgstr "" + +msgid "DHT RPC replies with contact address fixed" +msgstr "" + +msgid "DHT RPC late replies received" +msgstr "" + +msgid "DHT RPC detected KUID mismatches on reply" +msgstr "" + +msgid "DHT RPC recent nodes held" +msgstr "" + +msgid "DHT node verifications" +msgstr "" + +msgid "DHT publishing attempts" +msgstr "" + +msgid "DHT publishing ended successfully (all roots)" +msgstr "" + +msgid "DHT publishing partially completed (root subset only)" +msgstr "" + +msgid "DHT publishing ending with proper value presence" +msgstr "" + +msgid "DHT value republishing occurring too late (after expiry)" +msgstr "" + +msgid "DHT publishing to self" +msgstr "" + +msgid "DHT background publishing completion attempts" +msgstr "" + +msgid "DHT background publishing completion showing improvements" +msgstr "" + +msgid "DHT background publishing completion successful (all roots)" +msgstr "" + +msgid "DHT SHA1 data type collisions" +msgstr "" + +msgid "DHT lookup path passively protected against attack" +msgstr "" + +msgid "DHT lookup path actively protected against attack" +msgstr "" + +msgid "DHT alt-loc lookups issued" +msgstr "DHT búsquedas de 'alt-loc' emitidas" + +msgid "DHT push-proxy lookups issued" +msgstr "DHT búsquedas de 'push-proxy' emitidas" + +msgid "DHT successful alt-loc lookups" +msgstr "DHT búsquedas de 'alt-loc' exitosas" + +msgid "DHT successful push-proxy lookups" +msgstr "DHT búsquedas de 'push-proxy' exitosas" + +msgid "DHT successful node push-entry lookups" +msgstr "" + +msgid "DHT re-seeding of orphan downloads" +msgstr "DHT re-siembras de descargas huérfanas" + +msgid "Digests computed on general statistics" +msgstr "" + +msgid "Digests computed on TCP statistics" +msgstr "" + +msgid "Digests computed on UDP statistics" +msgstr "" + +msgid "Ping" +msgstr "Ping" + +msgid "Pong" +msgstr "Pong" + +msgid "Bye" +msgstr "Adiós" + +msgid "QRP" +msgstr "QRP" + +msgid "HSEP" +msgstr "HSEP" + +msgid "RUDP" +msgstr "RUDP" + +msgid "Vendor spec." +msgstr "Vendedor Específico" + +msgid "Vendor std." +msgstr "Vendedor Estándar." + +msgid "Push" +msgstr "Push" + +msgid "Query" +msgstr "Petición" + +msgid "Query hit" +msgstr "Query hit" + +msgid "DHT (truncated)" +msgstr "" + +msgid "DHT Ping" +msgstr "DHT Ping" + +msgid "DHT Pong" +msgstr "DHT Pong" + +msgid "DHT Store" +msgstr "" + +msgid "DHT Store Ack" +msgstr "" + +msgid "DHT Find Node" +msgstr "Encontrar nodo DHT" + +msgid "DHT Found Node" +msgstr "Nodo dht encontrado" + +msgid "DHT Find Value" +msgstr "Encontrar valor DHT" + +msgid "DHT Value" +msgstr "Valor DHT" + +msgid "G2 Crawl Request" +msgstr "" + +msgid "G2 Hub Advertisement" +msgstr "" + +msgid "G2 Hub List" +msgstr "" + +msgid "G2 Hub List Req" +msgstr "" + +msgid "G2 Hub List Ack" +msgstr "" + +msgid "G2 Local Node Info" +msgstr "" + +msgid "G2 Ping" +msgstr "" + +msgid "G2 Pong" +msgstr "" + +msgid "G2 Push" +msgstr "" + +msgid "G2 Query Key Ack" +msgstr "" + +msgid "G2 Query Key Req" +msgstr "" + +msgid "G2 Query" +msgstr "" + +msgid "G2 Query Ack" +msgstr "" + +msgid "G2 Query Hit" +msgstr "" + +msgid "G2 Query Hash Table" +msgstr "" + +msgid "G2 User Profile Check" +msgstr "" + +msgid "G2 User Profile Data" +msgstr "" + +msgid "Total" +msgstr "Total" + +msgid "Bad size" +msgstr "Tamaño incorrecto" + +msgid "Too small" +msgstr "Demasiado pequeño" + +msgid "Too large" +msgstr "Muy grande" + +msgid "Way too large" +msgstr "Demasiado grande" + +msgid "Too old" +msgstr "" + +msgid "Unknown message type" +msgstr "Tipo de mensaje desconocido" + +msgid "Unexpected message" +msgstr "Mensaje inesperado" + +msgid "Message sent with TTL = 0" +msgstr "Mensaje enviado con TTL = 0" + +msgid "Improper hops/ttl combination" +msgstr "Combinación saltos/ttl incongruente" + +msgid "Max TTL exceeded" +msgstr "TTL máximo excedido" + +msgid "Message throttle" +msgstr "Umbral de mensajes" + +msgid "Message matched limits" +msgstr "" + +msgid "Transient node" +msgstr "" + +msgid "Unusable Pong" +msgstr "Pong no usable" + +msgid "Hard TTL limit reached" +msgstr "Límite TTL duro alcanzado" + +msgid "Max hop count reached" +msgstr "Número máximo de saltos alcanzados" + +msgid "Route lost" +msgstr "Camino perdido" + +msgid "No route" +msgstr "No hay camino" + +msgid "Duplicate message" +msgstr "Mensaje duplicado" + +msgid "OOB Proxy MUID Conflict" +msgstr "" + +msgid "Message to banned GUID" +msgstr "Mensaje para GUID baneado" + +msgid "Message from banned GUID" +msgstr "" + +msgid "Node shutting down" +msgstr "Nodo apagándose" + +msgid "TX flow control" +msgstr "Control de flujo TX" + +msgid "Query text had no trailing NUL" +msgstr "Texto de la petición to terminaba en NUL" + +msgid "Query text too short" +msgstr "Texto de la petición demasiado corto" + +msgid "Query had unnecessary overhead" +msgstr "Petición tenía recarga innecesaria" + +msgid "Query had bad URN" +msgstr "Petición tenía URN incorrecto" + +msgid "Message with malformed SHA1" +msgstr "Mensaje con SHA1 incorrecto" + +msgid "Message with malformed UTF-8" +msgstr "Mensaje con UTF-8 incorrecto" + +msgid "Malformed Query Hit" +msgstr "Query Hit malformado" + +msgid "Bad return address" +msgstr "Dirección de retorno incorrecta" + +msgid "Hostile IP address" +msgstr "Dirección IP hostil" + +msgid "Shunned IP address" +msgstr "" + +msgid "Bogus result from Morpheus" +msgstr "" + +msgid "Spam" +msgstr "Spam" + +msgid "Evil filename" +msgstr "Nombre de archivo \"malévolo\"" + +msgid "Improper media type" +msgstr "" + +msgid "Payload inflating error" +msgstr "error al inflar carga" + +msgid "Unknown header flags present" +msgstr "Indicaciones desconocidas presentes en encabezado" + +msgid "Own search results" +msgstr "Resultados de búsqueda propios" + +msgid "Own queries" +msgstr "" + +msgid "Ancient query format" +msgstr "Formato de petición anticuado" + +msgid "Blank Servent ID" +msgstr "ID de nodo vacía" + +msgid "GUESS Query missing token" +msgstr "" + +msgid "GUESS Invalid query token" +msgstr "" + +msgid "DHT Invalid security token" +msgstr "Símbolo de seguridad DHT inválido" + +msgid "DHT Too many STORE requests" +msgstr "DHT demasiadas peticiones STORE" + +msgid "DHT Malformed message" +msgstr "Mensaje DHT malformado" + +msgid "G2 Unexpected message" +msgstr "" + +msgid "Cannot cross networks" +msgstr "" msgid "No proxy" msgstr "No hay proxy" @@ -1022,24 +2251,20 @@ msgid "own KUID lookup" msgstr "" -#, fuzzy msgid "completing" -msgstr "completadas" +msgstr "completando" msgid "completed" msgstr "completadas" -#, fuzzy msgid "shutdown" -msgstr "Cerrando (%s)" +msgstr "apagar" -#, fuzzy msgid "active (recommended)" -msgstr "auto (recomendado)" +msgstr "activo (recomendado)" -#, fuzzy msgid "passive" -msgstr " pasivo)" +msgstr "pasivo" msgid "Indicates whether the hostcache file is being read." msgstr "Indica si la caché de nodos está siendo leida." @@ -1088,17 +2313,12 @@ "cuando somos ultranodos. Debería ser más pequeño que el número máximo de " "conexiones para permitir conexiones entrantes." -#, fuzzy msgid "" "Don't allow more than this number of connections to other servents. As a " "rule of thumb you should reserve 256 b/s bandwidth per connection. Never use " "up all your bandwidth, leave a little space for TCP/IP overhead. It's not " "advisable that you set this to a value smaller than 40." msgstr "" -"No permitir más de este número de conexiones a otros nodos. Como norma " -"general, debería reservar 256 b/s de ancho de banda para cada conexión. " -"Nunca uses todo tu ancho de banda, deja algo de espacio para las " -"transacciones TCP/IP. No es recomendable que tengas un valor menor que 30." msgid "Number of leaf nodes currently connected." msgstr "Número de nodos hoja actualmente conectados." @@ -1212,7 +2432,7 @@ msgstr "" "Devolver como mucho esta cantidad de resultados a una petición, usando " "tantos paquetes de petición encontrada como sea necesario. Para evitar " -"congestión en la red, manténgalo en un valor razonable. " +"congestión en la red, manténgalo en un valor razonable." msgid "" "Unless this percentage or more of the upload bandwidth is used, allow " @@ -1448,9 +2668,6 @@ "Nivel de depuración para el código compartido entre la interfaz gráfica y el " "núcleo" -msgid "Verbosity of Bitzi related debug messages." -msgstr "Verbosidad de mensajes de depuración relacionados a Bitzi." - msgid "Verbosity of URL handling related debug messages." msgstr "" "Verbosidad de mensajes de depuración relacionados con el manejo de URLs" @@ -1545,8 +2762,8 @@ "manera que el cliente es proscrito luego de reintentar muy rápidamente 10 " "veces, que es un buen balance entre abuso y el soporte de clientes antiguos." -msgid "For development use: track properties." -msgstr "Para uso en desarrollo: Vigilar propiedades." +msgid "Indicates a kernel network buffer shortage." +msgstr "" msgid "For development use: don't add new hosts to the host cache." msgstr "Para uso en desarrollo: Dejar de añadir nodos a el caché de nodos." @@ -1684,9 +2901,8 @@ msgid "Current number of hosts in regular node caches." msgstr "Número de nodos actualmente en la reserva de nodos normales." -#, fuzzy msgid "Current number of IPv4 hosts in ultra node caches." -msgstr "Número de nodos actualmente en la reserva de ultranodos." +msgstr "" msgid "Current number of hosts in bad node caches." msgstr "Número de nodos actualmente en la reserva de nodos incorrectos." @@ -1694,9 +2910,8 @@ msgid "Maximum number of hosts in the regular node cache." msgstr "Número máximo de nodos en la caché regular." -#, fuzzy msgid "Maximum number of IPv4 hosts in the ultra node cache." -msgstr "Número máximo de nodos en la caché de ultranodos." +msgstr "" msgid "Maximum number of hosts in the BUSY, UNSTABLE and TIMEOUT lists." msgstr "Número máximo de nodos en las listas OCUPADO, INESTABLE y EXPIRADO." @@ -2043,10 +3258,8 @@ msgid "" "Maximum amount of leaves we can accept. To be promoted Ultra, you should " -"reserve 32 bytes of bandwidth per leaf." +"reserve 32 bytes/sec of bandwidth per leaf." msgstr "" -"Número máximo de nodos hoja aceptados. Para ser ascendido al modo ultra, " -"debería reservar al menos 32 bytes del ancho de banda por hoja." msgid "What to do with files that will be ignored for downloading." msgstr "Qué hacer con los archivos para descargar ignorados." @@ -2156,9 +3369,8 @@ "habilitado, el sesgo computado del reloj será ignorado. Normalmente gtk-" "gnutella determina automáticamente si se está ejecutando NTP localmente, " "pero no será capaz de determinar si está sincronizado con llamadas regulares " -"a ntpdate, por ejemplo. " +"a ntpdate, por ejemplo." -# skew - sesgo msgid "Whether a running NTP daemon was detected locally." msgstr "Si se ha detectado un demonio NTP localmente." @@ -2608,12 +3820,9 @@ msgid "" "If set to TRUE, the global hostiles.txt is used as well as the private " -"$GTK_GNUTELLA_DIR/hostiles.txt. This allows to separate your private ban " +"$GTK_GNUTELLA_DIR/hostiles.txt. This allows you to separate your private ban " "list from the global one distributed with gtk-gnutella." msgstr "" -"Si se habilita, el arhivo global hostiles.txt se usará además del archivo " -"privado $GTK_GNUTELLA_DIR/hostiles.txt. Esto permita separar la lista " -"privada de nodos baneados de la lista que se distribuye con gtk-gnutella." msgid "If set to TRUE, SO_LINGER is used for sockets." msgstr "Si se habilita, se usará SO_LINGER para los sockets." @@ -2889,7 +4098,6 @@ msgid "Debug level for DHT key/value publishing." msgstr "Nivel de depuración para publicación de claves/valores DHT" -#, fuzzy msgid "" "Bandwidth hint for DHT user lookups, in bytes/sec. This is used both for " "limiting concurrent publishing and searching. Traffic is made on the " @@ -2897,13 +4105,7 @@ "less). The larger the numbers, the more values can be looked up " "concurrently, but the more bandwidth is used." msgstr "" -"Sugerencia de ancho de banda para búsqueda de usuarios en la DHT, in bytes/" -"s. Esto es usado para limitar las publicaciones y búsquedas concurrentes. " -"Tráfico es producido en el socket UDP Gnutella y, por lo tanto, no puede ser " -"realmente controlado. Las necesidades de entrada son mucho mayores que las " -"de salida en lo que se refiere a búsquedas." -#, fuzzy msgid "" "Bandwidth hint for DHT user lookups, in bytes/sec. This is used both for " "limiting concurrent publishing and searching. Traffic is made on the " @@ -2912,10 +4114,6 @@ "times). The larger the numbers the more values can be looked up " "concurrently, but the more bandwidth is used." msgstr "" -"Sugerencia de ancho de banda para búsqueda de usuarios en la DHT, in bytes/" -"s. Esto es usado para limitar las publicaciones y búsquedas concurrentes. " -"Tráfico es producido en el socket UDP Gnutella. Las necesidades de entrada " -"son mucho mayores que las de salida en lo que se refiere a búsquedas." msgid "" "Whether the GUID should be kept accross sessions. A sticky GUID can be " @@ -3010,57 +4208,44 @@ "Tamaño máximo de la cola de mensajes UDP (en bytes). Debe ser al menos el " "150 por ciento del tamaño máximo de mensajes." -#, fuzzy msgid "Debug level for the management of the clock accuracy." -msgstr "Nivel de depuración para el manejo del caché local de direcciones." +msgstr "" -#, fuzzy msgid "Debug level for the firewalled status management." -msgstr "Nivel de depuración para el manejo de malla de descargas." +msgstr "" -#, fuzzy msgid "Debug level for host management." -msgstr "Nivel de depuración para el manejo de malla de descargas." +msgstr "" -#, fuzzy msgid "Debug level for DHT root node caching." -msgstr "Nivel de depurado para la caché de pongs." +msgstr "" -#, fuzzy msgid "Logged statistics level for code shared between GUI and core." msgstr "" -"Nivel de depuración para el código compartido entre la interfaz gráfica y el " -"núcleo" -#, c-format msgid "" "If TRUE, the spam SHA1 database is kept in memory. If FALSE, it is kept in a " "fast disk database, which saves a large amount of core memory and reduces " "the overall footprint, at the cost of an increased I/O level. However, the " -"DB cache has typically a 90% hit rate, so the actual overhead is barely " +"DB cache has a 90 percent hit rate, so the actual overhead is barely " "noticeable when running as an ultra node and should remain completely " "unnoticed when running as a leaf." msgstr "" -#, fuzzy msgid "Debug level for spam detection." -msgstr "Nivel de depurado para la caché de pongs." +msgstr "" -#, fuzzy msgid "Debug level for lockfile management." -msgstr "Nivel de depuración para el manejo de malla de descargas." +msgstr "" -#, fuzzy msgid "Debug level for the zone-based memory allocator." -msgstr "Nivel de depuración de la concha." +msgstr "" -#, fuzzy msgid "Debug level for the pool-based memory allocator." -msgstr "Nivel de depuración de la concha." +msgstr "" -#, fuzzy msgid "Debug level for the RX buffer allocator." -msgstr "Nivel de depuración de la concha." +msgstr "" msgid "" "Whether the zone-based memory allocator should always keep the zones in " @@ -3071,47 +4256,35 @@ "spam_lut_in_memory to FALSE." msgstr "" -#, fuzzy msgid "Debug level for the virtual memory manager." -msgstr "Nivel de depurado para mensajes específicos de aplicación." +msgstr "" -#, fuzzy msgid "Debug level for final shutdown." -msgstr "Nivel de depuración para información de archivos." +msgstr "" -#, fuzzy msgid "Country preferences" -msgstr "Preferencias" +msgstr "" -#, fuzzy msgid "Debug level for country limits." -msgstr "Nivel de depurado para peticiones." +msgstr "" -#, fuzzy msgid "Whether to log dropped Gnutella messages" -msgstr "Nivel de depuración para mensajes Gnutella." +msgstr "" -#, fuzzy msgid "Debug level for whitelist management." -msgstr "Nivel de depuración para el manejo de malla de descargas." +msgstr "" -#, fuzzy msgid "Debug level for DHT token caching." -msgstr "Nivel de depurado para la caché de pongs." +msgstr "" -#, fuzzy msgid "Debug level for DHT publishing from Gnutella." -msgstr "Nivel de depuración para publicación de claves/valores DHT" +msgstr "" -#, fuzzy msgid "Defines which DHT messages should be traced." msgstr "" -"Define cuáles intercambios de encabezados de subida HTTP deberán ser " -"trazados." -#, fuzzy msgid "Enable bandwidth limitation for outgoing DHT traffic." -msgstr "Activar limitación de ancho de banda para tráfico HTTP saliente." +msgstr "Habilitar limitación de ancho de banda para tráfico DHT saliente." msgid "" "Bandwidth limit for outgoing DHT traffic in bytes/sec. It is always pooled " @@ -3119,45 +4292,35 @@ "enabled, so that UDP queues can flush more quickly." msgstr "" -#, fuzzy msgid "Maximum size of the DHT message queue (in bytes)." -msgstr "" -"Tamaño máximo de los mensajes de resultados de búsqedas pasadas a otros " -"nodos (en bytes)." +msgstr "Tamaño máximo de la cola de mensaje DHT (en bytes)." -#, fuzzy msgid "Debug level for bandwidth scheduler." -msgstr "Nivel de depuración de la concha." +msgstr "" -#, fuzzy msgid "Debug level for the DHT stable node recorder." -msgstr "Nivel de depuración para búsquedas en cola de usuarios DHT." +msgstr "" -#, fuzzy msgid "Debug level for the file (re)loading, on change." -msgstr "Nivel de depuración para el código para compartir archivos." +msgstr "" -#, fuzzy msgid "Debug level for the file moving, accross filesystems." -msgstr "Nivel de depuración para el código para compartir archivos." +msgstr "" -#, fuzzy msgid "Debug level for query hit message generation." -msgstr "Nivel de depurado para el enrutado de mensajes." +msgstr "" -#, fuzzy msgid "Debug level for version management." -msgstr "Nivel de depuración para el manejo de malla de descargas." +msgstr "" msgid "Minimum CPU frequency, in Hz." -msgstr "" +msgstr "Frecuencia de CPU mínima, en Hz." msgid "Maximum CPU frequency, in Hz." -msgstr "" +msgstr "Frecuencia de CPU máxima, en Hz." -#, fuzzy msgid "DHT bootstrap status." -msgstr "Estadísticas del tráfico _HTTP" +msgstr "" msgid "" "The DHT running mode. An active node will be able to store values and is a " @@ -3172,39 +4335,32 @@ msgid "Current DHT running mode." msgstr "" -#, fuzzy msgid "Debug level for the one-time memory allocator." -msgstr "Nivel de depuración de la concha." +msgstr "" -#, fuzzy msgid "Debug level for the host cache." -msgstr "Nivel de depuración de la concha." +msgstr "" msgid "Random bits." msgstr "" -#, fuzzy msgid "Average servent downtime." -msgstr "Tiempo de ejecución promedio de la aplicación." +msgstr "" msgid "Time when last shutdown occurred." msgstr "" -#, fuzzy msgid "Debug level for alive pings." -msgstr "Nivel de depuración para información de archivos." +msgstr "" -#, fuzzy msgid "Debug level for the versatile XML layer." -msgstr "Nivel de depurado para la capra de tráfico UDP." +msgstr "" -#, fuzzy msgid "Debug level for the UPnP layer." -msgstr "Nivel de depurado para la capra de tráfico UDP." +msgstr "" -#, fuzzy msgid "Debug level for the SOAP layer." -msgstr "Nivel de depurado para la capra de tráfico UDP." +msgstr "" msgid "Defines SOAP exchanges tracing type." msgstr "" @@ -3237,9 +4393,8 @@ msgid "Whether gtk-gnutella can install port mappings, if needed." msgstr "" -#, fuzzy msgid "Debug level for the NAT-PMP layer." -msgstr "Nivel de depurado para la capra de tráfico UDP." +msgstr "" msgid "" "Whether NAT-PMP (NAT Port Mapping Protocol) should be enabled. Support for " @@ -3256,48 +4411,37 @@ "mappings, if required." msgstr "" -#, fuzzy msgid "Debug level for the TX (transmit) network layer." -msgstr "Nivel de depurado para la capra de tráfico UDP." +msgstr "" -#, fuzzy msgid "Debug level for the RX (receive) network layer." -msgstr "Nivel de depurado para la capra de tráfico UDP." +msgstr "" -#, fuzzy msgid "Debug level for the I/O input event layer." -msgstr "Nivel de depurado para la capra de tráfico UDP." +msgstr "" -#, fuzzy msgid "Debug level for the background task scheduler." -msgstr "Nivel de depuración de la concha." +msgstr "" -#, fuzzy msgid "Whether gtk-gnutella was able to configure port mappings." -msgstr "Si gtk-gnutella cree que está conectado a Internet." +msgstr "" -#, fuzzy msgid "Whether gtk-gnutella disabled HTTP bandwidth stealing." -msgstr "Si gtk-gnutella cree que está conectado a Internet." +msgstr "" -#, fuzzy msgid "Whether gtk-gnutella ignores HTTP stolen bandwidth." -msgstr "Si gtk-gnutella cree que está conectado a Internet." +msgstr "" msgid "Whether gtk-gnutella enforces uniform HTTP outgoing bandwidth." msgstr "" -#, fuzzy msgid "" "Whether gtk-gnutella should use HTTP request pipelining when possible, in " "order to decrease downloading latency." msgstr "" -"Si gtk-gnutella debe promocionar el nombre de nodo de tu servidor, tanto con " -"los descargadores como en los hits de peticiones." -#, fuzzy msgid "Maximum chunk size when swarming with HTTP pipelining." -msgstr "Tamaño de bloque máximo en descargas distribuídas." +msgstr "" msgid "" "Whether the Gnutella UDP Extension for Scalable Searches (GUESS) should be " @@ -3319,25 +4463,20 @@ "Searches)." msgstr "" -#, fuzzy msgid "Maximum number of IPv4 hosts in the regular GUESS cache." -msgstr "Número máximo de nodos en la caché regular." +msgstr "" -#, fuzzy msgid "Current number of IPv4 hosts in the regular GUESS cache." -msgstr "Número de nodos actualmente en la reserva de nodos normales." +msgstr "" -#, fuzzy msgid "Maximum number of IPv4 hosts in the introduction GUESS cache." -msgstr "Número máximo de nodos en el caché G2." +msgstr "" -#, fuzzy msgid "Current number of IPv4 hosts in the introduction GUESS cache." -msgstr "Número de nodos actualmente en la reserva de ultranodos." +msgstr "" -#, fuzzy msgid "Debug level for the DB disk/RAM storage layer." -msgstr "Nivel de depurado para la capra de tráfico UDP." +msgstr "" msgid "" "The current Session ID. This is a unique ID generated each time gtk-" @@ -3365,13 +4504,11 @@ "overall" msgstr "" -#, fuzzy msgid "Debug level for the matching code." -msgstr "Nivel de depuración para el código de exclusiones." +msgstr "" -#, fuzzy msgid "Debug level for the time synchronization code." -msgstr "Nivel de depuración para el código para compartir archivos." +msgstr "" msgid "" "Whether queries can request partial results hits, i.e. files which are " @@ -3384,9 +4521,8 @@ "are returned." msgstr "" -#, fuzzy msgid "Whether what's-new? queries should be answered to." -msgstr "Si la cuenta de las peticiones transmitidas debe mostrarse." +msgstr "" msgid "" "When set, gtk-gnutella will automatically stop opened searches from which " @@ -3394,163 +4530,240 @@ "configured expiration time." msgstr "" -#, fuzzy msgid "Maximum number of results to show in a What's New? request." msgstr "" -"Número máximo de resultados a mostrar en búsquedas de navegación de nodos." -#, fuzzy msgid "Maximum number of results to show in a passive search request." msgstr "" -"Número máximo de resultados a mostrar en búsquedas de navegación de nodos." -#, fuzzy msgid "Whether to log duplicate Gnutella messages from same node." -msgstr "Nivel de depuración para mensajes Gnutella." +msgstr "" -#, fuzzy msgid "Whether to log duplicate Gnutella messages with a higher TTL." -msgstr "Nivel de depuración para mensajes Gnutella." +msgstr "" -#, fuzzy msgid "Whether to log duplicate Gnutella messages (not from same node)." -msgstr "Nivel de depuración para mensajes Gnutella." +msgstr "" -#, fuzzy msgid "Whether to log new Gnutella messages, never seen before." -msgstr "Nivel de depuración para mensajes Gnutella." +msgstr "" -#, fuzzy msgid "Whether to log Gnutella routing decisions." -msgstr "Nivel de depuración para mensajes Gnutella." +msgstr "" -#, fuzzy msgid "Whether to log bad Gnutella messages, corrupted or unexpected." -msgstr "Nivel de depuración para mensajes Gnutella." +msgstr "" msgid "Whether to log conditions triggering query hit spam flagging." msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the ultra node cache." -msgstr "Número máximo de nodos en la caché de ultranodos." +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in ultra node caches." -msgstr "Número de nodos actualmente en la reserva de ultranodos." +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in the regular GUESS cache." -msgstr "Número de nodos actualmente en la reserva de nodos normales." +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in the introduction GUESS cache." -msgstr "Número de nodos actualmente en la reserva de ultranodos." +msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the regular GUESS cache." -msgstr "Número máximo de nodos en la caché regular." +msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the introduction GUESS cache." -msgstr "Número máximo de nodos en el caché G2." +msgstr "" -#, fuzzy msgid "Debug level for the malloc() replacement allocator." -msgstr "Nivel de depuración de la concha." +msgstr "" -#, fuzzy msgid "Debug level for bad query hit messages." -msgstr "Nivel de depurado para el enrutado de mensajes." +msgstr "" -#, fuzzy msgid "Debug level for GUID management." -msgstr "Nivel de depuración para el manejo de malla de descargas." +msgstr "" -msgid "disable" -msgstr "desactivar" +msgid "Debug level for the TX (transmit) deflating network layer." +msgstr "" -msgid "by words" -msgstr "por palabras" +msgid "Comma-separated list of TX debugging hosts (IP addresses only)" +msgstr "" -msgid "by whole query" -msgstr "por la petición completa" +msgid "" +"Comma-separated list of hosts for whom we want to dump RX traffic (IP " +"addresses only)" +msgstr "" -msgid "by router" -msgstr "por router" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they emit " +"(IP addresses only)" +msgstr "" -msgid "TCP & UDP" -msgstr "TCP & UDP" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they " +"receive (IP addresses only)" +msgstr "" -msgid "TCP only" -msgstr "sólo TCP" +msgid "" +"Allow GUESS to use some of the unused Gnutella outgoing bandwidth regardless " +"of the GUESS bandwidth hint. If FALSE, only the configured bandwidth hint " +"will be used. When running as a leaf this should be set to TRUE to make " +"GUESS queries run faster." +msgstr "" -msgid "UDP only" -msgstr "sólo UDP" +msgid "Debug level for the UDP TX scheduler." +msgstr "" -msgid "Ping" -msgstr "Ping" +msgid "" +"Debugging flags for the semi-reliable UDP TX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: transmissions, 16: timeouts." +msgstr "" -msgid "Pong" -msgstr "Pong" +msgid "Comma-separated list of RX debugging hosts (IP addresses only)" +msgstr "" -msgid "Bye" -msgstr "Adiós" +msgid "" +"Debugging flags for the semi-reliable UDP RX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: receptions, 16: timeouts." +msgstr "" -msgid "QRP" -msgstr "QRP" +msgid "Whether to log sent semi-reliable UDP messages." +msgstr "" -msgid "HSEP" -msgstr "HSEP" +msgid "Whether to log received semi-reliable UDP messages." +msgstr "" -msgid "RUDP" -msgstr "RUDP" +msgid "Debug level for the secured OOB query hit claiming." +msgstr "" -msgid "Vendor spec." -msgstr "Vendedor Específico" +msgid "Whether to log sent vendor messages." +msgstr "" -msgid "Vendor std." -msgstr "Vendedor Estándar." +msgid "Whether to log received vendor messages." +msgstr "" -msgid "Push" -msgstr "Push" +msgid "Debugging flags for the DHT token cache (developers only)." +msgstr "" -msgid "Query" -msgstr "Petición" +msgid "Whether to log weird DHT message headers when debugging." +msgstr "" -msgid "Query Hit" -msgstr "Hit Petición" +msgid "Debug level for the DHT Remote Procedure Call (RPC) code." +msgstr "" -#, fuzzy -msgid "DHT Ping" -msgstr "Ping" +msgid "Whether to log UHC pings we receive." +msgstr "" -#, fuzzy -msgid "DHT Pong" -msgstr "Pong" +msgid "Whether to log UHC pings we emit." +msgstr "" -#, fuzzy -msgid "DHT Store" -msgstr "Tráfico HTTP" +msgid "Whether the program was properly shutdown." +msgstr "" -msgid "DHT Store Ack" +msgid "Whether the program restarted after a clean shutdown." msgstr "" -msgid "DHT Find Node" +msgid "Debug level for DHT key management." msgstr "" -msgid "DHT Found Node" +msgid "Debug level for DHT value management." msgstr "" -msgid "DHT Find Value" +msgid "ID of the current process." msgstr "" -#, fuzzy -msgid "DHT Value" -msgstr "Valor" +msgid "Debug level for HTTP range parsing / handling." +msgstr "" -msgid "Total" -msgstr "Total" +msgid "" +"Lease time when installing port mappings via UPnP or NAT-PMP, in seconds. A " +"value of 0 requests permanent mappings." +msgstr "" + +msgid "Whether the program is auto-restarting at the user's request." +msgstr "" + +msgid "Debug level for time management." +msgstr "" + +msgid "Debug level for the tmalloc() thread-magazine object distributor." +msgstr "" + +msgid "Debug level for the event queue thread." +msgstr "" + +msgid "Maximum number of G2 hubs in the hub cache." +msgstr "" + +msgid "Current number of IPv4 hosts in the G2 hub caches." +msgstr "" + +msgid "Whether the G2 protocol should be enabled." +msgstr "" + +msgid "Number of G2 nodes currently connected." +msgstr "" + +msgid "Maximum amount of G2 hubs we should connect to as a leaf." +msgstr "" + +msgid "Whether to log bad G2 messages, corrupted or unexpected." +msgstr "" + +msgid "Whether to log dropped G2 messages" +msgstr "" + +msgid "Debug level for the G2 RPC layer." +msgstr "" + +msgid "Whether to log summary of received query hits" +msgstr "" + +msgid "Whether to log summary of each record in received query hits" +msgstr "" + +msgid "Number of G2 browsing requests received in this session." +msgstr "" + +msgid "Number of G2 browsing requests fully served in this session." +msgstr "" + +msgid "Whether to log G2 messages we're attempting to send" +msgstr "" + +msgid "" +"Timestamp at which the current session was started. This stamp remains " +"unchanged when gtk-gnutella restarts after a crash or an explicit restart " +"request." +msgstr "" + +msgid "No TCP listening socket bound to allow incoming connections." +msgstr "" + +msgid "disable" +msgstr "desactivar" + +msgid "by words" +msgstr "por palabras" + +msgid "by whole query" +msgstr "por la petición completa" + +msgid "by router" +msgstr "por router" + +msgid "TCP & UDP" +msgstr "TCP & UDP" + +msgid "TCP only" +msgstr "sólo TCP" + +msgid "UDP only" +msgstr "sólo UDP" + +msgid "Query Hit" +msgstr "Hit Petición" msgid "Icons" msgstr "Iconos" @@ -3986,27 +5199,22 @@ "Mostrar un icono de estado en la barra de sistema (requiere Gtk+ 2.10 o más " "reciente)." -#, fuzzy msgid "Automatically hide DHT bandwidth display when DHT not enabled." msgstr "" -"Ocultar automáticamente la visualización del ancho de banda de nodos hoja " -"cuando no se está en el modo ultranodo." +"Ocultar automáticamente ventana de ancho de banda DHT cuando DHT no está " +"habilitado." -#, fuzzy msgid "Display incoming DHT traffic bandwidth usage." -msgstr "Mostrar uso del ancho de banda del tráfico HTTP entrante." +msgstr "Mostrar uso de ancho de banda de tráfico DHT." -#, fuzzy msgid "Display outgoing DHT traffic bandwidth usage." -msgstr "Mostrar uso del ancho de banda del tráfico HTTP saliente." +msgstr "Mostrar uso de ancho de banda de tráfico DHT." -#, fuzzy msgid "Display incoming DHT traffic bandwidth as an average." -msgstr "Mostrar promedio del ancho de banda para el tráfico HTTP entrante." +msgstr "Mostrar ancho de banda entrante de tráfico DHT como un promedio." -#, fuzzy msgid "Display outgoing DHT traffic bandwidth as an average." -msgstr "Mostrar promedio del ancho de banda para el tráfico HTTP saliente." +msgstr "Mostrar ancho de banda saliente de tráfico DHT como un promedio." msgid "" "Remote nodes supporting media type filtering will apply your query " @@ -4036,7 +5244,7 @@ msgstr "" msgid "" -"Discard search results whith an alien IP address, not matching the one from " +"Discard search results with an alien IP address, not matching the one from " "which the results come from." msgstr "" @@ -4045,6 +5253,17 @@ "be restarted when gtk-gnutella is launched." msgstr "" +msgid "Discard search results coming from servents with a banned GUID." +msgstr "" + +msgid "Whether a summary line with GUESS search stats should be displayed." +msgstr "" + +msgid "" +"Whether the GUESS summary line should show total statistics or ones " +"pertaining to the current search only." +msgstr "" + msgid "Anonymizing proxies" msgstr "Anonimizando proxies" @@ -4132,6 +5351,9 @@ msgid "Benin" msgstr "Benin" +msgid "Saint Barthelemy" +msgstr "San Bartolomé" + msgid "Bermuda" msgstr "Bermuda" @@ -4141,6 +5363,9 @@ msgid "Bolivia" msgstr "Bolivia" +msgid "Bonaire, Sint Eustatius and Saba" +msgstr "" + msgid "Brazil" msgstr "Brasil" @@ -4150,6 +5375,9 @@ msgid "Bhutan" msgstr "Bhutan" +msgid "Burma" +msgstr "Birmania" + msgid "Bouvet Island" msgstr "Isla Bouvet" @@ -4210,6 +5438,9 @@ msgid "Cape Verde" msgstr "Cabo Verde" +msgid "Curacao" +msgstr "Curazao" + msgid "Christmas Island" msgstr "Isla de Navidad" @@ -4435,7 +5666,6 @@ msgid "Lebanon" msgstr "Líbano" -#, fuzzy msgid "Saint Lucia" msgstr "Santa Lucía" @@ -4475,9 +5705,8 @@ msgid "Montenegro" msgstr "Montenegro" -#, fuzzy msgid "Saint Martin" -msgstr "San Marino" +msgstr "San Martín" msgid "Madagascar" msgstr "Madagascar" @@ -4677,12 +5906,18 @@ msgid "Suriname" msgstr "Surinam" +msgid "South Sudan" +msgstr "Sudán del Sur" + msgid "Sao Tome and Principe" msgstr "Santo Tomé y Príncipe" msgid "El Salvador" msgstr "El Salvador" +msgid "Sint Maarten" +msgstr "" + msgid "Syrian Arab Republic" msgstr "República Árabe Siria" @@ -4822,28 +6057,25 @@ #, c-format msgid "%ud %uh" -msgstr "" +msgstr "%ud %uh" #, c-format msgid "%uh %um" -msgstr "" +msgstr "%uh %um" #, c-format msgid "%um %us" -msgstr "" +msgstr "%um %us" #, c-format msgid "%us" -msgstr "" +msgstr "%us" msgid "locale_get_language|en" msgstr "es" -#, fuzzy msgid "unofficial build, accessing files from" msgstr "" -"Este ejecutable ha sido compilado de forma no oficial y accede a los " -"archivos en este directorio:" msgid "URL missing" msgstr "Falta el URL" @@ -4889,40 +6121,42 @@ msgid "Interactive mode turned off." msgstr "Desactivado modo interactivo." -#, fuzzy +#, c-format +msgid "Unknown operation \"show %s\"" +msgstr "Operación desconocida «mostrar %s»" + +#, c-format +msgid "Unknown operation \"%s\"" +msgstr "Operación desconocida «%s»" + msgid "Cannot determine current working directory" -msgstr "¡Directorio de usuario no encontrado!" +msgstr "No se puede determinar el directorio de trabajo actual" -#, fuzzy, c-format +#, c-format msgid "Unknown logfile name \"%s\"" -msgstr "Propiedad desconocida" +msgstr "Nombre del archivo de registro \"%s\" desconocido" -#, fuzzy msgid "Unable to reopen" -msgstr "Incapaz de enviar GIV" +msgstr "" #, c-format msgid "Could not rename logfile as \"%s\": %m" -msgstr "" +msgstr "No se pudo renombrar el archivo de registro como \"%s\": %m" -#, fuzzy, c-format -msgid "Unknown operation \"%s\"" -msgstr "Operación desconocida" - -#, fuzzy, c-format -msgid "Unknown operation \"show %s\"" -msgstr "Operación desconocida" - -#, fuzzy, c-format +#, c-format msgid "Unknown operation \"stats %s\"" -msgstr "Operación desconocida" +msgstr "Operación desconocida «estadísticas %s»" + +#, c-format +msgid "Unknown operation \"check %s\"" +msgstr "Operación desconocida «comprobar %s»" -#, fuzzy, c-format +#, c-format msgid "Unknown operation \"usage %s\"" -msgstr "Operación desconocida" +msgstr "Operación desconocida «uso %s»" msgid "Invalid IP/Port" -msgstr "IP/Puerto inválido" +msgstr "IP/puerto no válido" msgid "Node added" msgstr "Nodo añadido" @@ -4942,9 +6176,9 @@ msgid "Property missing" msgstr "Falta la propiedad" -#, fuzzy, c-format +#, c-format msgid "Unknown property \"%s\"" -msgstr "Propiedad desconocida" +msgstr "Propiedad desconocida «%s»" msgid "Value: " msgstr "Valor: " @@ -4958,6 +6192,9 @@ msgid "Good bye" msgstr "Adiós" +msgid "Invalid command syntax" +msgstr "Sintaxis de comando inválida" + msgid "Query string missing" msgstr "Texto de la petición inexistente" @@ -4968,7 +6205,7 @@ msgstr "Búsqueda añadida" msgid "The search could not be created" -msgstr "No se pudo crear búsqueda " +msgstr "No se pudo crear búsqueda" msgid "Unknown property" msgstr "Propiedad desconocida" @@ -4976,19 +6213,22 @@ msgid "Value missing" msgstr "Falta el valor" +msgid "Property cannot be changed" +msgstr "" + #, c-format msgid "Previous value was %s" -msgstr "" +msgstr "El valor previo fue %s" #, c-format msgid "New value is %s" -msgstr "" +msgstr "El nuevo valor es %s" msgid "Value found and set" msgstr "Valor encontrado y ajustado" msgid "unterminated escape sequence" -msgstr "" +msgstr "secuencia de escape no determinada" msgid "unterminated double-quoted string" msgstr "" @@ -4996,63 +6236,22 @@ msgid "unterminated single-quoted string" msgstr "" -msgid "Invalid command syntax" -msgstr "Sintaxis de comando inválida" - msgid "too many arguments in command" +msgstr "demasiados argumentos en el comando" + +#, c-format +msgid "un-parseable argument #%u in command" msgstr "" msgid "Malformed command" msgstr "Comando malformado" -#, fuzzy, c-format +#, c-format msgid "Unknown command: \"%s\"" -msgstr "Comando desconocido" +msgstr "Orden desconocida: «%s»" msgid "Help: " -msgstr "Ayudai: " - -msgid "Bitzi|Unknown" -msgstr "Desconocido" - -msgid "Bitzi|Unrated" -msgstr "Sin valoración" - -msgid "Bitzi|Bitzi lookup failure" -msgstr "Falla en búsqueda Bitzi" - -msgid "Bitzi|Filesize mismatch" -msgstr "Discrepancia en tamaño de archivo" - -msgid "Bitzi|Dangerous/Misleading" -msgstr "Peligroso/Confuso" - -msgid "Bitzi|Incomplete/Damaged" -msgstr "Incompleto/Dañado" - -msgid "Bitzi|Substandard" -msgstr "Subestándar" - -msgid "Bitzi|Overrated" -msgstr "Sobrevalorado" - -msgid "Bitzi|Normal" -msgstr "Normal" - -msgid "Bitzi|Underrated" -msgstr "Subvalorado" - -msgid "Bitzi|Complete" -msgstr "Completo" - -msgid "Bitzi|Recommended" -msgstr "Recomendado" - -msgid "Bitzi|Best Version" -msgstr "Mejor Versión" - -msgid "No other data" -msgstr "No hay más datos" +msgstr "Ayuda: " msgid "Filename" msgstr "Archivo" @@ -5079,11 +6278,17 @@ msgid "Tigertree" msgstr "Árbol Tiger" -msgid "External metadata" -msgstr "Meta data externa" +msgid "Rescheduled for" +msgstr "" + +msgid "Restartable since" +msgstr "" + +msgid "rescheduled for" +msgstr "" -msgid "Bitzi URL" -msgstr "URL Bitzi" +msgid "restartable since" +msgstr "" #, c-format msgid " (slot %u" @@ -5097,7 +6302,7 @@ msgstr "Completados" msgid "Connecting..." -msgstr "Conectando " +msgstr "Conectando" msgid "Connected" msgstr "Conectado" @@ -5127,9 +6332,8 @@ msgid "Reading headers" msgstr "Leyendo cabaceras" -#, fuzzy msgid "UDP push sent" -msgstr "'Push' enviado" +msgstr "" msgid "Searching for new push-proxies" msgstr "Buscando nuevos push-proxies" @@ -5156,20 +6360,18 @@ msgid "Chunk done" msgstr "Bloque completado" -#, fuzzy msgid "Waiting for TTH checking..." -msgstr "Esperando la comprobación de SHA1..." +msgstr "Esperando la revisión TTH..." msgid "Waiting for SHA1 checking..." msgstr "Esperando la comprobación de SHA1..." -#, fuzzy, c-format +#, c-format msgid "Computing %s (%.02f%%)" -msgstr "Calculando SHA1 (%.02f%%)" +msgstr "" -#, fuzzy msgid "TTH OK" -msgstr "TTH" +msgstr "TTH OK" msgid "SHA-1 OK" msgstr "SHA-1 OK" @@ -5197,31 +6399,23 @@ msgid "(stalled)" msgstr "(atascado)" -#, fuzzy msgid "Receiving data" -msgstr "Recibiendo cabeceras" +msgstr "Recibiendo datos" msgid "ignoring" msgstr "ignorando" -#, fuzzy msgid "selected next" -msgstr "Propiedad seleccionada:" +msgstr "siguiente seleccionado" -#, fuzzy msgid "requesting next" -msgstr "Petición enviada" +msgstr "solicitando el siguiente" -#, fuzzy msgid "requested next" -msgstr "Petición enviada" +msgstr "siguiente solicitado" -#, fuzzy msgid "Awaiting data" -msgstr "Esperando" - -msgid "Unknown error" -msgstr "Error desconocido" +msgstr "Esperando datos" #, c-format msgid "Retry in %us" @@ -5480,665 +6674,6 @@ msgid "RETURN" msgstr "RETORNO" -msgid "Query hit" -msgstr "Query hit" - -msgid "DHT (truncated)" -msgstr "" - -msgid "Routing errors" -msgstr "Errores de enrutado" - -#, fuzzy -msgid "Routing table chunks" -msgstr "DHT tobos en tabla de rutas" - -msgid "Routing table message capacity" -msgstr "" - -#, fuzzy -msgid "Routing table message count" -msgstr "DHT nodos estancados en tabla de rutas" - -msgid "Duplicates with higher TTL" -msgstr "Duplicados con TTL mayor" - -msgid "SPAM SHA1 database hits" -msgstr "" - -#, fuzzy -msgid "SPAM filename and size hits" -msgstr "Si el nombre termina por \"%s\" %s" - -msgid "SPAM fake hits" -msgstr "" - -msgid "SPAM duplicate hits" -msgstr "" - -msgid "SPAM dynamically caught hostile IP addresses" -msgstr "" - -msgid "SPAM dynamically caught hostile IP held" -msgstr "" - -msgid "SPAM spotted spamming IP addresses held" -msgstr "" - -msgid "Searches to local DB" -msgstr "Búsquedas en BD locales" - -msgid "Hits on local DB" -msgstr "Toques en BD local" - -#, fuzzy -msgid "Hits on local partial files" -msgstr "Toques en BD local" - -msgid "Hits on \"what's new?\" queries" -msgstr "" - -msgid "Query hits received for local queries" -msgstr "Query hits recibidos para peticiones locales" - -msgid "Query hits received for OOB-proxied queries" -msgstr "Query hits recibidos para peticiones a través de proxy OOB" - -msgid "Queries requesting OOB hit delivery" -msgstr "Peticiones de entrega de hit OOB" - -msgid "Stripped OOB flag on queries" -msgstr "Indicador OOB eliminado de peticiones" - -msgid "Duplicate OOB-proxied queries" -msgstr "Peticiones OOB-proxied duplicadas" - -msgid "OOB hits received for OOB-proxied queries" -msgstr "Hits OOB recibidos para peticiones OOB-proxied" - -msgid "OOB hits bearing alien IP address" -msgstr "Hits OOB con direcciones IP extrañas" - -msgid "OOB hits ignored due to identified spamming address" -msgstr "" - -msgid "Unclaimed locally-generated OOB hits" -msgstr "Hits OOB generados localmente no reclamados" - -msgid "Partially claimed locally-generated OOB hits" -msgstr "Hits OOB generados localmente parcialmente reclamados" - -msgid "Spurious OOB hit claiming received" -msgstr "Reclamos de Hits OOB espurios recibidos " - -msgid "Unrequested OOB hits received" -msgstr "Hits OOB no solicitados recibidos" - -msgid "Received query hits for untracked queries" -msgstr "" - -msgid "Tracked query MUIDs" -msgstr "" - -msgid "Compacted queries" -msgstr "Peticiones compactadas" - -msgid "Bytes saved by compacting" -msgstr "Bytes ahorrados por compactación" - -msgid "UTF8 queries" -msgstr "Peticiones UTF8" - -msgid "SHA1 queries" -msgstr "Peticiones SHA1" - -#, fuzzy -msgid "\"What's New?\" queries" -msgstr "Peticiones generadas" - -#, fuzzy -msgid "GUESS queries" -msgstr "Peticiones UTF8" - -#, fuzzy -msgid "GUESS queries (0.2)" -msgstr "Peticiones UTF8" - -#, fuzzy -msgid "GUESS cached query keys held" -msgstr "DHT claves mantenidas en caché" - -#, fuzzy -msgid "GUESS cached 0.2 hosts held" -msgstr "DHT claves mantenidas en caché" - -#, fuzzy -msgid "GUESS locally generated queries" -msgstr "Peticiones dinámicas generadas localmente" - -msgid "GUESS currently running queries" -msgstr "" - -#, fuzzy -msgid "GUESS hits received for locally generated queries" -msgstr "Query hits recibidos para peticiones locales" - -msgid "GUESS hosts queried" -msgstr "" - -msgid "GUESS hosts sending back an acknowledgment" -msgstr "" - -msgid "Broadcasted push messages" -msgstr "Mensajes 'push' retransmitidos" - -msgid "Push-proxy UDP relayed messages" -msgstr "Mensajes 'push-proxy' UDP retransmitidos" - -msgid "Push-proxy TCP relayed messages" -msgstr "Mensajes 'push-proxy' TCP retransmitidos" - -msgid "Push-proxy broadcasted messages" -msgstr "Mensajes 'push-proxy' transmitidos" - -msgid "Push-proxy found un-proxied local route" -msgstr "" - -msgid "Push-proxy lookup failures" -msgstr "Fallas de búsqueda de push-proxy" - -msgid "Push relayed via local route" -msgstr "Push entregado a través de ruta local" - -msgid "Push relayed via routing table" -msgstr "Empuje enviado a través de tabla de rutas" - -msgid "Locally generated dynamic queries" -msgstr "Peticiones dinámicas generadas localmente" - -msgid "Leaf-generated dynamic queries" -msgstr "Peticiones dinámicas generadas por hojas" - -msgid "OOB-proxied leaf queries" -msgstr "Peticiones de hojas delegadas fuera de banda" - -msgid "Fully completed dynamic queries" -msgstr "Peticiones dinámicas totalmente completadas" - -msgid "Partially completed dynamic queries" -msgstr "Peticiones dinámicas parcialmente completadas" - -msgid "Dynamic queries ended with no results" -msgstr "Peticiones dinámicas terminaron sin resultados" - -msgid "Fully completed dynamic queries getting late results" -msgstr "" -"Peticiones dinámicas totalmente completadas recibiendo resultados tardíos" - -msgid "Dynamic queries with partial late results" -msgstr "Peticiones dinámicas parcialmente recibiendo resultados tardíos" - -msgid "Dynamic queries completed by late results" -msgstr "Peticiones dinámicas completadas por resultados tardíos" - -msgid "Queries seen from GTKG" -msgstr "Peticiones vistas desde GTKG" - -msgid "Queries seen from GTKG that were re-queries" -msgstr "Peticiones vistas desde GTKG que eran repetidas" - -msgid "Queries advertising support of GGEP \"H\"" -msgstr "Peticiones anunciando soporte de GGEP \"H\"" - -msgid "GIV callbacks received" -msgstr "Llamadas GIV recibidas" - -msgid "GIV discarded due to no suitable download" -msgstr "GIV descartadas al no encontrar bajadas apropiadas" - -msgid "QUEUE callbacks received" -msgstr "Llamadas QUEUE recibidas" - -msgid "QUEUE discarded due to no suitable download" -msgstr "QUEUE descartadas al no encontrar bajadas apropiadas" - -msgid "UDP messages with bogus source IP" -msgstr "Mensajes UDP con IP de origen erróneo" - -msgid "Alien UDP messages (non-Gnutella)" -msgstr "Mensajes UDP alienígenas (externos a Gnutella)" - -msgid "Unprocessed UDP Gnutella messages" -msgstr "Mensajes UDP Gnutella sin procesar" - -msgid "Compressed UDP messages enqueued" -msgstr "Mensajes UDP comprimidos en cola" - -msgid "Compressed UDP messages received" -msgstr "Mensajes UDP comprimidos recibidos" - -msgid "Uncompressed UDP messages due to no gain" -msgstr "Mensajes UDP no comprimidos debido a falta de ganancia" - -msgid "Consolidated servers (after GUID and IP address linking)" -msgstr "Servidores consolidados (después de enlace de GUID e IP)" - -msgid "Duplicate downloads found during server consolidation" -msgstr "Encontradas bajadas duplicadas durante la consolidación de servidores" - -msgid "Discovered server GUIDs" -msgstr "GUIDs de servidores descubiertas" - -msgid "Changed server GUIDs" -msgstr "GUIDs de servidores cambiadas" - -#, fuzzy -msgid "Detected GUID collisions" -msgstr "DHT colisiones de KUIDs detectadas" - -msgid "Detected collisions with our own GUID" -msgstr "Colisiones detectadas con nuestra propia GUID" - -msgid "GUID dynamically banned" -msgstr "" - -msgid "Firewalled node info for known hosts received in upload requests" -msgstr "" -"Recinida información de nodo tras cortafuego para nodo conocido en petición " -"de subida" - -msgid "Revitalized PUSH routes" -msgstr "" - -msgid "Collected new PUSH proxies from other query hits" -msgstr "" - -msgid "Attempted download resource switching on completion" -msgstr "Intento de cambio en bajada de recurso al completar" - -msgid "Attempted download resource switching after error" -msgstr "Intento de cambio en bajada de recurso después de error" - -msgid "Successful download resource switching (all kind)" -msgstr "Cambio en bajada de recurso exitoso (todo tipo)" - -msgid "Successful download resource switching between plain files" -msgstr "Cambio en bajada de recurso exitoso entre archivos planos" - -msgid "Successful download resource switching after error" -msgstr "Cambio en bajada de recurso exitoso después de error" - -msgid "Actively queued after resource switching attempt" -msgstr "Encolado activamente después de intento de cambio de recurso" - -msgid "Sunk HTTP reply data on error codes" -msgstr "Datos de respuesta HTTP hundidos por códigos de error" - -msgid "Ignored downloaded data" -msgstr "Datos descargados ignorados" - -msgid "Ignoring requested after data mismatch" -msgstr "Ignorando petición luego de discrepancia de datos" - -msgid "Ignoring requested to preserve connection" -msgstr "Ignorando petición para preservar conexión" - -msgid "Ignoring requested due to aggressive swarming" -msgstr "Ignorando petición debido a enjambre agresivo" - -msgid "Ignoring refused (data too large or server too slow)" -msgstr "" -"Ignorando rechazos (datos demasiados grandes o servidor demasiado lento)" - -msgid "Client resource switching (all detected)" -msgstr "Cambio de recursos por clientes (todos los detectados)" - -msgid "Client resource switching between plain files" -msgstr "Cambio de recursos por clientes entre archivos planos" - -msgid "Client follow-up request after HTTP error was returned" -msgstr "" -"Peticiones de seguimiento por clientes después de retorno de error HTTP" - -msgid "PARQ client resource switching in slots (SHA-1 based)" -msgstr "PARQ cambio de recursos por clientes en ranuras (basado en SHA-1)" - -msgid "PARQ client retry-after violation" -msgstr "PARQ violaciones de reintento por clientes" - -msgid "PARQ client kicked out after too many retry-after violations" -msgstr "PARQ cliente pateado por demasiadas violaciones retry-after" - -msgid "PARQ upload slot limit overrides" -msgstr "PARQ invalidaciones de límite de ranuras de subida" - -msgid "PARQ quick upload slots granted" -msgstr "PARQ ranuras de subida rápida concedidas" - -msgid "PARQ QUEUE sending attempts" -msgstr "PARQ intentos de envío QUEUE" - -msgid "PARQ QUEUE messages sent" -msgstr "PARQ mensajes QUEUE enviados" - -msgid "PARQ QUEUE follow-up requests received" -msgstr "PARQ peticiones de seguimiento QUEUE recibidas" - -msgid "Launched SHA-1 file verifications" -msgstr "" - -msgid "Launched TTH file verifications" -msgstr "" - -#, fuzzy -msgid "Bitzi tickets held" -msgstr "No se ha solicitado ningún ticket Bitzi." - -msgid "Re-seeding of orphan downloads through query hits" -msgstr "Re-siembra de descargas huérfanas a través de hits de peticiones" - -#, fuzzy -msgid "Re-seeding of orphan downloads through upload requests" -msgstr "Re-siembra de descargas huérfanas a través de hits de peticiones" - -msgid "DHT estimated amount of nodes" -msgstr "DHT número estimado de nodos" - -#, fuzzy -msgid "DHT k-ball theoretical frontier (bits)" -msgstr "DHT frontera más lejana a k-bola (bits)" - -msgid "DHT k-ball furthest frontier (bits)" -msgstr "DHT frontera más lejana a k-bola (bits)" - -msgid "DHT k-ball closeest frontier (bits)" -msgstr "DHT frontera más cercana a k-bola (bits)" - -msgid "DHT routing table buckets" -msgstr "DHT tobos en tabla de rutas" - -msgid "DHT routing table leaves" -msgstr "DHT hojas en tabla de rutas" - -msgid "DHT routing table maximum depth" -msgstr "DHT máxima profundidad de tabla de rutas" - -msgid "DHT routing table good nodes" -msgstr "DHT Nodos buenos en tabla de rutas" - -msgid "DHT routing table stale nodes" -msgstr "DHT nodos estancados en tabla de rutas" - -msgid "DHT routing table pending nodes" -msgstr "DHT Nodos pendientes en tabla de rutas" - -msgid "DHT routing table evicted nodes" -msgstr "DHT nodos desterrados de tabla de rutas" - -msgid "DHT routing table evicted firewalled nodes" -msgstr "DHT nodos tras cortafuegos desterrados de tabla de rutas" - -#, fuzzy -msgid "DHT routing table evicted nodes due to quota" -msgstr "DHT nodos desterrados de tabla de rutas" - -msgid "DHT routing table promoted pending nodes" -msgstr "DHT nodos pendientes promovidos en tabla de rutas" - -#, fuzzy -msgid "DHT routing table pinged promoted nodes" -msgstr "DHT Nodos buenos en tabla de rutas" - -#, fuzzy -msgid "DHT routing table rejected node due to bucket network quota" -msgstr "DHT nodos desterrados de tabla de rutas" - -#, fuzzy -msgid "DHT routing table rejected node due to global network quota" -msgstr "DHT nodos desterrados de tabla de rutas" - -msgid "DHT completed bucket refreshes" -msgstr "DHT refrescos de tobos completados" - -#, fuzzy -msgid "DHT forced bucket refreshes" -msgstr "DHT refrescos de tobos completados" - -#, fuzzy -msgid "DHT forced bucket merges" -msgstr "DHT refrescos de tobos completados" - -msgid "DHT denied non-splitable bucket refresh" -msgstr "DHT refrescos denegados de tobos indivisibles" - -msgid "DHT initiated bucket alive checks" -msgstr "DHT revisiones de tobos vivos iniciadas" - -msgid "DHT alive pings sent to good nodes" -msgstr "DHT notificaciones \"todavía vivo\" enviadas a nodos buenos" - -msgid "DHT alive pings sent to stale nodes" -msgstr "DHT notificaciones \"todavía vivo\" enviadas a nodos estancados" - -#, fuzzy -msgid "DHT alive pings sent to shutdowning nodes" -msgstr "DHT notificaciones \"todavía vivo\" enviadas a nodos estancados" - -#, fuzzy -msgid "DHT alive pings avoided" -msgstr "DHT notificaciones \"todavía vivo\" enviadas a nodos estancados" - -#, fuzzy -msgid "DHT alive pings skipped" -msgstr "DHT notificaciones \"todavía vivo\" enviadas a nodos buenos" - -#, fuzzy -msgid "DHT revitalized stale nodes on RPC reply" -msgstr "DHT colisiones de KUIDs detectadas" - -msgid "DHT value store rejected on IP/network quota grounds" -msgstr "DHT almacén de valores rechazado debido a cuota IP/Red" - -msgid "DHT value store rejected on creator validation grounds" -msgstr "DHT almacén de valores rechazado debido a validación de creador" - -msgid "DHT nodes rejected during lookup based on network quota" -msgstr "" - -msgid "DHT nodes rejected during lookup based on suspicious proximity" -msgstr "" - -msgid "DHT nodes rejected during lookup based on frequency divergence" -msgstr "" - -msgid "DHT keys held" -msgstr "DHT claves mantenidas" - -msgid "DHT cached keys held" -msgstr "DHT claves mantenidas en caché" - -msgid "DHT values held" -msgstr "DHT valores en poder" - -#, fuzzy -msgid "DHT cached KUID targets held" -msgstr "DHT claves mantenidas en caché" - -#, fuzzy -msgid "DHT cached closest root nodes" -msgstr "DHT número estimado de nodos" - -msgid "DHT cached roots exact hits" -msgstr "" - -msgid "DHT cached roots approximate hits" -msgstr "" - -#, fuzzy -msgid "DHT cached roots misses" -msgstr "DHT claves mantenidas en caché" - -msgid "DHT cached roots lookups within k-ball" -msgstr "" - -msgid "DHT cached roots contact address refreshed" -msgstr "" - -#, fuzzy -msgid "DHT cached security tokens held" -msgstr "DHT claves mantenidas en caché" - -#, fuzzy -msgid "DHT cached security tokens hits" -msgstr "Símbolo de seguridad DHT inválido" - -#, fuzzy -msgid "DHT stable node information held" -msgstr "Información de nodo" - -msgid "DHT local hits on value lookups" -msgstr "DHT hits locales en búsquedas de valores" - -msgid "DHT local hits returning values from cached keys" -msgstr "DHT hits locales retornando valores desde claves en caché" - -msgid "DHT returned expanded values" -msgstr "DHT valores expandidos retornados" - -msgid "DHT returned values as secondary keys" -msgstr "DHT valores retornados como claves secundarias" - -msgid "DHT claimed values via secondary keys" -msgstr "DHT valores reclamados vía claves secundarias" - -msgid "DHT returned cached expanded values" -msgstr "DHT valores expandidos retornados desde caché" - -msgid "DHT returned cached values as secondary-keys" -msgstr "DHT valores retornados desde caché como claves secundarias" - -msgid "DHT claimed cached values via secondary keys" -msgstr "DHT valores reclamados del caché vía claves secundarias" - -#, fuzzy -msgid "DHT successfully received value publications" -msgstr "DHT publicaciones de valores recibidas exitosamente" - -#, fuzzy -msgid "DHT successfully received value removals" -msgstr "DHT eliminación de valores recibidos exitosamente" - -msgid "DHT replication of stale value avoided" -msgstr "DHT replicaciones evitadas de valores estancado" - -msgid "DHT replication of held values" -msgstr "DHT replicaciones de valores en poder" - -msgid "DHT republishing of held values" -msgstr "DHT republicaciones de valores en poder" - -msgid "DHT secondary-key value fetch issued" -msgstr "" - -msgid "DHT duplicate values returned in lookups" -msgstr "DHT valores duplicados retornados en búsquedas" - -msgid "DHT detected KUID collisions" -msgstr "DHT colisiones de KUIDs detectadas" - -msgid "DHT detected collisions with our own KUID" -msgstr "DHT colisiones detectadas con nuestra propia KUID" - -#, fuzzy -msgid "DHT detected KUID mismatches on RPC reply" -msgstr "DHT colisiones de KUIDs detectadas" - -msgid "DHT caching attempts" -msgstr "" - -msgid "DHT caching ended successfully" -msgstr "" - -msgid "DHT caching partially completed" -msgstr "" - -msgid "DHT key-offloading checks after discovering new closest node" -msgstr "" - -msgid "DHT keys selected for offloading" -msgstr "" - -msgid "DHT key-offloading attempts" -msgstr "" - -msgid "DHT key-offloading ended successfully" -msgstr "" - -msgid "DHT key-offloading partially completed" -msgstr "" - -msgid "DHT values successfully offloaded" -msgstr "" - -#, fuzzy -msgid "DHT publishing attempts" -msgstr "DHT republicaciones de valores en poder" - -msgid "DHT publishing ended successfully (all roots)" -msgstr "" - -msgid "DHT publishing partially completed (root subset only)" -msgstr "" - -#, fuzzy -msgid "DHT publishing ending with proper value presence" -msgstr "DHT republicaciones de valores en poder" - -msgid "DHT value republishing occurring too late (after expiry)" -msgstr "" - -#, fuzzy -msgid "DHT publishing to self" -msgstr "DHT republicaciones de valores en poder" - -msgid "DHT background publishing completion attempts" -msgstr "" - -msgid "DHT background publishing completion showing improvements" -msgstr "" - -msgid "DHT background publishing completion successful (all roots)" -msgstr "" - -#, fuzzy -msgid "DHT SHA1 data type collisions" -msgstr "DHT colisiones de KUIDs detectadas" - -msgid "DHT lookup path passively protected against attack" -msgstr "" - -msgid "DHT lookup path actively protected against attack" -msgstr "" - -msgid "DHT alt-loc lookups issued" -msgstr "DHT búsquedas de 'alt-loc' emitidas" - -msgid "DHT push-proxy lookups issued" -msgstr "DHT búsquedas de 'push-proxy' emitidas" - -msgid "DHT successful alt-loc lookups" -msgstr "DHT búsquedas de 'alt-loc' exitosas" - -msgid "DHT successful push-proxy lookups" -msgstr "DHT búsquedas de 'push-proxy' exitosas" - -#, fuzzy -msgid "DHT successful node push-entry lookups" -msgstr "DHT búsquedas de 'push-proxy' exitosas" - -msgid "DHT re-seeding of orphan downloads" -msgstr "DHT re-siembras de descargas huérfanas" - msgid "node" msgid_plural "nodes" msgstr0 "nodo" @@ -6165,10 +6700,10 @@ msgstr " Limpiar completados " msgid " Gnutella browse requests" -msgstr "Peticiones de navegación Gnutella" +msgstr " Peticiones de navegación Gnutella" msgid " HTML and " -msgstr "HTML y" +msgstr " HTML y " msgid " Kill selected " msgstr " Matar seleccionadas " @@ -6329,9 +6864,8 @@ msgid "Avg. uptime of this servent:" msgstr "Tiempo promedio de ejecución:" -#, fuzzy msgid "Avg. downtime of this servent:" -msgstr "Tiempo promedio de ejecución:" +msgstr "" msgid "Bad hosts" msgstr "Nodos incorrectos" @@ -6342,10 +6876,8 @@ msgid "Bandwidth limits for HTTP traffic" msgstr "Límites para el ancho de banda del tráfico HTTP" -#, fuzzy msgid "Bandwidth limits for the Distributed Hash Table" msgstr "" -"Nivel de depuración para el código de la Tabla de Hash Distribuida (DHT)." msgid "Bandwidth targets for node lookups" msgstr "" @@ -6362,12 +6894,6 @@ msgid "Bind to this address" msgstr "Conectarse a esta dirección" -msgid "Bitzi Metadata" -msgstr "Metadatos Bitzi" - -msgid "Bitzi metadata" -msgstr "Metadatos Bitzi" - msgid "Browse Host" msgstr "Navegar Nodo" @@ -6544,13 +7070,11 @@ msgid "Currently used" msgstr "Actualmente usados" -#, fuzzy msgid "DHT traffic stats" -msgstr "Estadísticas del tráfico _HTTP" +msgstr "" -#, fuzzy msgid "DHT traffic" -msgstr "Tráfico HTTP" +msgstr "" msgid "Debugging" msgstr "Depuración" @@ -6636,9 +7160,8 @@ msgid "Enable \"_Browse Host\" feature" msgstr "Activar \"_Navegar Nodo\"" -#, fuzzy msgid "Enable _DHT" -msgstr "Activar _UDP" +msgstr "" msgid "Enable _UDP" msgstr "Activar _UDP" @@ -6743,7 +7266,7 @@ msgstr "Preguntas Frecuentes" msgid "Fully served " -msgstr "Servido completamente" +msgstr "Servido completamente " msgid "GUI development:" msgstr "Desarrollo del GUI:" @@ -6751,9 +7274,8 @@ msgid "GUID:" msgstr "GUID:" -#, fuzzy msgid "KUID:" -msgstr "GUID:" +msgstr "" msgid "Gen. queued" msgstr "Gen. encolados" @@ -6773,9 +7295,8 @@ msgid "Generation:" msgstr "Generación:" -#, fuzzy msgid "Global DHT outgoing traffic" -msgstr "Tráfico _saliente" +msgstr "" msgid "Gnutella TTL settings" msgstr "Ajustes TTL de GnutellaNet" @@ -6992,13 +7513,11 @@ msgid "Max. number of browse host results" msgstr "_Número máximo de resultados de navegación de nodos" -#, fuzzy msgid "Max. number of passive results" -msgstr "_Número máximo de resultados" +msgstr "" -#, fuzzy msgid "Max. number of What's New? results" -msgstr "_Número máximo de resultados" +msgstr "" msgid "Max. simultaneous downloads per file" msgstr "Número máximo de descargas simultáneas por archivo" @@ -7137,9 +7656,8 @@ msgid "Outgoing traffic to lea_ves" msgstr "Tráfico saliente para ho_jas" -#, fuzzy msgid "Output bandwidth average" -msgstr "Ancho de banda límite para todas las salidas" +msgstr "" msgid "PARQ development:" msgstr "desarrollo PARQ:" @@ -7489,13 +8007,11 @@ "Mostrar ajustes e información adicional para los usuarios avanzados y " "_expertos" -#, fuzzy msgid "Show inbound DHT traffic" -msgstr "Mostrar tráfico HTTP entrante" +msgstr "" -#, fuzzy msgid "Show outbound DHT traffic" -msgstr "Mostrar tráfic_o saliente HTTP" +msgstr "" msgid "Show pr_otocol:" msgstr "Mostrar pr_otocolo:" @@ -7830,7 +8346,7 @@ msgstr "Coeficiente de _borrado (0-100)" msgid "_Download RX buffer:" -msgstr "Búfer de recepción de _descargas: " +msgstr "Búfer de recepción de _descargas:" msgid "_Download selected" msgstr "_Descargar selección" @@ -7940,9 +8456,8 @@ msgid "and lasted" msgstr "y duró" -#, fuzzy msgid "auto-hide DHT traffic stats" -msgstr "Ocultar _automáticamente estadísticas de tráfico de nodos hoja" +msgstr "" msgid "bytes" msgstr "bytes" @@ -8051,13 +8566,11 @@ msgid "uploads" msgstr "subidas" -#, fuzzy msgid "Available HTTP input bandwidth" -msgstr "Ancho de banda disponible" +msgstr "" -#, fuzzy msgid "Available HTTP output bandwidth" -msgstr "Ancho de banda disponible" +msgstr "" msgid "DHT up, passive mode." msgstr "" @@ -8071,21 +8584,17 @@ msgid "DHT looking up own KUID." msgstr "" -#, fuzzy msgid "DHT seeded." -msgstr "Velocidad de transmisión" +msgstr "" -#, fuzzy msgid "DHT inactive." -msgstr "%u activos" +msgstr "" -#, fuzzy msgid "Disabled stealing of outgoing HTTP bandwidth." -msgstr "Mostrar uso del ancho de banda del tráfico HTTP saliente." +msgstr "" -#, fuzzy -msgid "Splitting ougoing HTTP bandwidth evenly." -msgstr "Mostrar promedio del ancho de banda para el tráfico HTTP saliente." +msgid "Splitting outgoing HTTP bandwidth evenly." +msgstr "" msgid "Capping HTTP outgoing bandwidth." msgstr "" @@ -8093,27 +8602,26 @@ msgid "Port mapping possible through UPnP or NAT-PMP." msgstr "" -msgid "Port mapping configured through UPnP or NAT-PMP." +msgid "Port mapping configured through NAT-PMP." +msgstr "" + +msgid "Port mapping configured through UPnP." msgstr "" -#, fuzzy msgid "Enable UPnP" -msgstr "Activar _UDP" +msgstr "" -#, fuzzy msgid "Enable NAT-PMP" -msgstr "Activar _UDP" +msgstr "" msgid "Enable HTTP request pipelining" msgstr "" -#, fuzzy msgid "Pipelining max chunk size" -msgstr "Tamaño de bloque mínimo" +msgstr "" -#, fuzzy -msgid "Enable upload of patial files deemed rare" -msgstr "Permitir la subida de archivos _parcialmente descargados" +msgid "Enable upload of partial files deemed rare" +msgstr "" msgid "Enable GUESS (additional querying)" msgstr "" @@ -8121,17 +8629,14 @@ msgid "Issue GUESS queries as well" msgstr "" -#, fuzzy msgid "Bandwidth limits for GUESS queries" -msgstr "Límites para el ancho de banda del tráfico Gnutella" +msgstr "" -#, fuzzy msgid "Output bandwidth hint" -msgstr "Ancho de banda límite para todas las salidas" +msgstr "" -#, fuzzy msgid "Download queue is frozen." -msgstr "Cola de bajada ha sido congelada" +msgstr "" msgid "Allow TTH discovery" msgstr "" @@ -8142,37 +8647,29 @@ msgid "Answer to queries for partial files" msgstr "" -#, fuzzy msgid "Answer to what's-new? queries" -msgstr "Peticiones generadas" +msgstr "" -#, fuzzy msgid "Search Media Type" -msgstr "Término de búsqueda" +msgstr "" -#, fuzzy msgid "Audio" -msgstr "<Audio>" +msgstr "" -#, fuzzy msgid "Video" -msgstr "<Video>" +msgstr "" -#, fuzzy msgid "Document" -msgstr "Cuenta" +msgstr "" -#, fuzzy msgid "Image" -msgstr "<Imagen>" +msgstr "" -#, fuzzy msgid "Archive" -msgstr "<Archivo>" +msgstr "" -#, fuzzy msgid "Search Configuration" -msgstr "Monitor de búsquedas" +msgstr "" msgid "Stop search when last download completes" msgstr "" @@ -8183,23 +8680,23 @@ msgid "What's new?" msgstr "" -#, fuzzy msgid "Unspecified" -msgstr "indefinido" +msgstr "" msgid "Search filters to apply locally on newly created searches." msgstr "" -#, fuzzy msgid "Discard results bearing an alien IP address" -msgstr "Hits OOB con direcciones IP extrañas" +msgstr "" + +msgid "Discard results bearing a banned GUID" +msgstr "" msgid "Restart session-only searches with pending downloads" msgstr "" -#, fuzzy msgid "Configured DHT mode" -msgstr "Tipo de nodo configurado" +msgstr "" msgid "Store DHT keys/values in memory" msgstr "" @@ -8210,8 +8707,23 @@ msgid "Relayed queries remembered" msgstr "" -msgid "Not in database" -msgstr "No está en la base de datos" +msgid "Allow unused Gnutella outgoing bandwidth to supersede hint" +msgstr "" + +msgid "Display GUESS statistics" +msgstr "" + +msgid "Mapping lease time" +msgstr "" + +msgid "G2 hubs" +msgstr "" + +msgid "Enable the G2 network" +msgstr "" + +msgid " G2, " +msgstr "" msgid "owned" msgstr "poseído" @@ -8234,9 +8746,6 @@ msgstr0 "Descartado %u resultado" msgstr1 "Descartados %u resultados" -msgid "Query queued..." -msgstr "Petición encolada" - #, c-format msgid "%u term counted" msgid_plural "%u terms counted" @@ -8252,7 +8761,7 @@ msgstr "Error durante la carga de la imagen: %s" msgid " (partial)" -msgstr "(parcial)" +msgstr " (parcial)" msgid "Cache contains" msgstr "Cache contiene" @@ -8278,6 +8787,9 @@ msgid "_Auto-hide leaf traffic stats" msgstr "Ocultar _automáticamente tráfico de nodos hoja" +msgid "Glossary" +msgstr "" + msgid "_Search" msgstr "_Buscar" @@ -8287,13 +8799,8 @@ msgid "Do not specify any media type (will match any kind of files remotely)" msgstr "" -#, fuzzy msgid "CPU overloaded" -msgstr "Subido" - -#, fuzzy -msgid "Splitting outgoing HTTP bandwidth evenly." -msgstr "Mostrar promedio del ancho de banda para el tráfico HTTP saliente." +msgstr "" msgid "Connect to" msgstr "Conectar a" @@ -8336,14 +8843,20 @@ msgstr "" msgid "Served " -msgstr "Servido" +msgstr "Servido " -msgid "BH HTML served" -msgstr "Servido BH HTML" +msgid "G2 served" +msgstr "" msgid " / " msgstr " / " +msgid "G2" +msgstr "" + +msgid "BH HTML served" +msgstr "Servido BH HTML" + msgid "BH HTML" msgstr "BH HTML" @@ -8423,41 +8936,29 @@ msgid "unit_of_time|s" msgstr "s" -#, fuzzy msgid "Gnutella Distributed Hash Table" msgstr "" -"Nivel de depuración para el código de la Tabla de Hash Distribuida (DHT)." msgid "Maximum percentage of connection slots a vendor can occupy." msgstr "Porcentaje máximo de las conexiones que cada aplicación puede ocupar." -#, fuzzy -msgid "Global DHT ougoing traffic" -msgstr "Tráfico _saliente" - msgid "attempts" msgstr "intentos" -#, fuzzy msgid "Pipelining maximum chunk size" -msgstr "Tamaño de bloque mínimo" +msgstr "" msgid "_Remove directory" msgstr "_Eliminar directorio" -#, fuzzy -msgid "Enable upload of partial files deemed rare" -msgstr "Permitir la subida de archivos _parcialmente descargados" - msgid "Minimum chunk _size" msgstr "Tamaño de bloque mí_nimo" msgid "Show a status _icon" msgstr "Mostrar _icono de estado" -#, fuzzy msgid "Avg. downtime of this servent" -msgstr "Tiempo promedio de ejecución:" +msgstr "" msgid "Remove completed downloads from list" msgstr "Quitar de la lista las descargas completadas" @@ -8496,6 +8997,9 @@ msgid "Reverse lookup in progress..." msgstr "Resolución inversa de nombre en progreso..." +msgid "UDP (semi-reliable)" +msgstr "" + msgid "Size:" msgstr "Tamaño:" @@ -8508,28 +9012,29 @@ msgid "Valid regular" msgstr "Normales válidos" -#, fuzzy msgid "Fresh IPv4 ultra" -msgstr "Ultra recientes" +msgstr "" -#, fuzzy msgid "Valid IPv4 ultra" -msgstr "Ultra válidos" +msgstr "" -#, fuzzy msgid "Fresh IPv6 ultra" -msgstr "Ultra recientes" +msgstr "" -#, fuzzy msgid "Valid IPv6 ultra" -msgstr "Ultra válidos" +msgstr "" + +msgid "Fresh G2 hub" +msgstr "" + +msgid "Valid G2 hub" +msgstr "" msgid "Unstable" msgstr "Inestable" -#, fuzzy msgid "Alien" -msgstr "Alias" +msgstr "" msgid "GUESS (IPv4 running)" msgstr "" @@ -8567,6 +9072,11 @@ "lea las <a href=\"http://gtk-gnutella.sourceforge.net/?page=faq\">Preguntas " "Frecuentes en línea</a>.</p></body></html>" +msgid "" +"<html><head><title>Glossary</title></head><body><p>The glossary document " +"could not be loaded.</p></body></html>" +msgstr "" + #, c-format msgid "%lu file shared (%s)" msgid_plural "%lu files shared (%s)" @@ -8598,6 +9108,9 @@ msgid "UNKNOWN STATUS" msgstr "ESTADO DESCONOCIDO" +msgid "g2" +msgstr "" + msgid "busy" msgstr "ocupado" @@ -8613,13 +9126,11 @@ msgid "bogus" msgstr "erróneo" -#, fuzzy msgid "alien" -msgstr "Alias" +msgstr "" -#, fuzzy msgid "media" -msgstr "Armenia" +msgstr "" msgid "No search" msgstr "Ninguna búsqueda" @@ -8642,6 +9153,12 @@ msgstr "Expira con esta sesión" #, c-format +msgid " %u download" +msgid_plural " %u downloads" +msgstr0 "" +msgstr1 "" + +#, c-format msgid "" "%u %s (%u skipped, %u ignored, %u hidden, %u auto-d/l, %u %s) Hits: %u (%u " "TCP, %u UDP)" @@ -8659,6 +9176,63 @@ msgstr0 "duplicado" msgstr1 "duplicados" +msgid "No GUESS queries run yet" +msgstr "" + +#, c-format +msgid " previous took %s querying %zu %s with %zu %s kept" +msgstr "" + +msgid "host" +msgid_plural "hosts" +msgstr0 "" +msgstr1 "" + +msgid "hit" +msgid_plural "hits" +msgstr0 "" +msgstr1 "" + +#, c-format +msgid "GUESS %s Total: %zu %s (%s %s, %s kept, %s queries, %s keys)%s" +msgstr "" + +msgid "idle" +msgstr "" + +msgid "query" +msgid_plural "queries" +msgstr0 "" +msgstr1 "" + +#, c-format +msgid "" +"GUESS %s %s (%zu %s, %zu kept, %s queries, %s keys) Pool: %zu %s, (%zu+" +"%zu)/%zu queried, %zu %s (%.2f%%), %zu reached, %zu pending, %zu %s%s%s" +msgstr "" + +msgid "loose" +msgstr "" + +msgid "bounded" +msgstr "" + +msgid "ack" +msgid_plural "acks" +msgstr0 "" +msgstr1 "" + +msgid "hop" +msgid_plural "hops" +msgstr0 "" +msgstr1 "" + +msgid " (load pending)" +msgstr "" + +msgid " (end if starving)" +msgstr "" + msgid "Passive" msgstr "Pasivo" @@ -8672,13 +9246,11 @@ "búsquedas se ha guardado con el nuevo formato XML y el archivo\n" "antiguo se ha renombrado a %s" -#, fuzzy, c-format +#, c-format msgid "" "could not rename %s as %s: %m\n" "The XML file will not be used unless this problem is resolved." msgstr "" -"No se pudo renombrar %s como %s: %s\n" -"El archivo XML no se usará hasta que este problema esté resuelto." msgid "<unparsed>" msgstr "<sin analizar>" @@ -8760,9 +9332,8 @@ msgid "No" msgstr "No" -#, fuzzy msgid "Tag" -msgstr "Objetivo" +msgstr "" msgid "Yes" msgstr "Sí" @@ -8773,16 +9344,24 @@ msgid "Source" msgstr "Fuente" -#, fuzzy msgid "Alien IP" -msgstr "Alias" +msgstr "" msgid "Alt-Locs" msgstr "Alt-Locs" -#, fuzzy msgid "Partial" -msgstr "parcial" +msgstr "" + +#, c-format +msgid "%s %.2f%%" +msgstr "" + +msgid "Available" +msgstr "" + +msgid "Last modification" +msgstr "" msgid "Latinized" msgstr "Latinizado" @@ -8799,6 +9378,9 @@ msgid "Hostname" msgstr "Nombre de nodo" +msgid "banned" +msgstr "" + msgid "Servent ID" msgstr "ID del nodo" @@ -8856,24 +9438,12 @@ msgid "The URN in the search text is invalid." msgstr "El URN en el texto de la búsqueda es inválido." -msgid "SHA-1 is unknown." -msgstr "SHA-1 es desconocido." - -msgid "No Bitzi ticket requested yet." -msgstr "No se ha solicitado ningún ticket Bitzi." - -msgid "Not in Bitzi database." -msgstr "No está en la base de datos Bitzi" - msgid "Encoding" msgstr "Codificación" msgid "#" msgstr "#" -msgid "Metadata" -msgstr "Metadatos" - msgid "Never" msgstr "Nunca" @@ -8911,6 +9481,12 @@ msgid "*** CPU OVERLOADED -- TRYING TO SAVE CYCLES ***" msgstr "*** SOBRECARGA DE CPU --- INTENTANDO AHORRAR CICLOS ***" +msgid "*** KERNEL BUFFER SHORTAGE -- LIMITING TCP CONNECTIONS ***" +msgstr "" + +msgid "*** NO LISTENING TCP SOCKET -- NO INBOUND CONNECTIONS ***" +msgstr "" + msgid "*** UPLOADS STALLING, BANDWIDTH SHORTAGE? ***" msgstr "*** SUBIDAS ATASCADAS, ¿ANCHO DE BANDA INSUFICIENTE? ***" @@ -8951,12 +9527,6 @@ msgstr "%u encolados" #, c-format -msgid "%u/%u connection" -msgid_plural "%u/%u connections" -msgstr0 "%u/%u conexión" -msgstr1 "%u/%u conexiones" - -#, c-format msgid "%u/%u upload" msgid_plural "%u/%u uploads" msgstr0 "%u/%u subida" @@ -8971,6 +9541,9 @@ msgid "Queue frozen" msgstr "Cola congelada" +msgid "Internal" +msgstr "" + msgid "Select a property to see its description." msgstr "Selecciona una propiedad para ver su descripción." @@ -8988,7 +9561,7 @@ msgstr "< 1º" msgid "(quick) " -msgstr "(rápido)" +msgstr "(rápido) " #, c-format msgid " E=%u" @@ -9035,42 +9608,3 @@ msgid "Sent QUEUE, waiting for headers..." msgstr "QUEUE enviado, esperando las cabeceras" - -#~ msgid "" -#~ "Maximum number of Query MUIDs to track. This allows mapping MUIDs of " -#~ "Query Hits to the original search term. In the worst case this causes " -#~ "about 300 bytes per Query of memory overhead." -#~ msgstr "" -#~ "Número máximo de MUIDs de peticiones a rastrear. Esto permite el mapeo de " -#~ "las MUIDs de los Hits de peticiones a los términos de búsqueda " -#~ "originales. En el peor de los casos, esto origina alrededor de 300 bytes " -#~ "de recargo en memoria por petición " - -#, fuzzy -#~ msgid "Linux archives" -#~ msgstr "%u activos" - -#~ msgid "Index" -#~ msgstr "Índice" - -#, fuzzy -#~ msgid "Seaerch Media Type" -#~ msgstr "Término de búsqueda" - -#~ msgid "Can't reach host (Push or Direct)" -#~ msgstr "No puedo alcanzar servidor (vía Push o Directo)" - -#~ msgid "Banned: %s" -#~ msgstr "Baneado: %s" - -#~ msgid "Banned for %s" -#~ msgstr "Baneado por %s" - -#~ msgid "The current Session ID." -#~ msgstr "La ID de sesión actual." - -#~ msgid "ShareMonkey URL" -#~ msgstr "URL Sharemonkey" - -#~ msgid "Connecting" -#~ msgstr "Conectando"
View file
gtk-gnutella-0.98.2.tar.bz2/po/fr.po -> gtk-gnutella-1.1.9.tar.bz2/po/fr.po
Changed
@@ -1,34 +1,32 @@ -# $Id$ -# -# French translations for gtk-gnutella package. -# Copyright (C) 2000-2001 Yann Grossel. -# Copyright (C) 2001-2010 Raphaël Manfredi. -# This file is distributed under the same license as the gtk-gnutella package. -# T'aZ <tazdev@punkass.com>, 2004-2005. -# FlashCode <flashcode@flashtux.org>, 2006-2007. -# Raphael Manfredi <raphael_manfredi@pobox.com>, 2011 release 0.97. +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Raphael Manfredi +# This file is distributed under the same license as the PACKAGE package. # +# Translators: +# mauron, 2014-2015 msgid "" msgstr "" -"Project-Id-Version: gtk-gnutella 0.96.7u\n" +"Project-Id-Version: gtk-gnutella\n" "Report-Msgid-Bugs-To: gtk-gnutella-devel@lists.sf.net\n" -"POT-Creation-Date: 2011-11-22 18:27+0100\n" -"PO-Revision-Date: 2011-08-07 06:02+0100\n" -"Last-Translator: \n" -"Language-Team: French <gtk-gnutella-devel@lists.sourceforge.net>\n" +"POT-Creation-Date: 2016-03-06 08:49+0100\n" +"PO-Revision-Date: 2016-02-15 08:28+0000\n" +"Last-Translator: Jeroen Asselman <jeroen@asselman.com>\n" +"Language-Team: French (http://www.transifex.com/gtk-gnutella/gtk-gnutella/" +"language/fr/)\n" +"Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Poedit-Language: French\n" -#, c-format -msgid "%s%s%s%s%s fps, %s kbps" -msgstr "%s%s%s%s%s fps, %s kbps" +msgid "Harmful version banned, upgrade required" +msgstr "Version néfaste bannie, mise à jour requise" + +msgid "Connection refused" +msgstr "Connexion refusée" -msgid "times|x" -msgstr "x" +msgid "Use an open Gnutella or G2 servent" +msgstr "Utiliser un client Gnutella ou G2 ouvert" #, c-format msgid "Stopped, will retry with TLS (%s)" @@ -43,7 +41,7 @@ msgstr "Trop de tentatives (%u fois)" msgid "Requeued due to no push-proxy" -msgstr "Remis dans la file pour manque de relai 'push'" +msgstr "Remis dans la file pour manque de relais « push »" msgid "Requeued due to file removal" msgstr "Remis dans la file pour suppression de fichier" @@ -59,11 +57,11 @@ #, c-format msgid "Switching (after error) to \"%s\"" -msgstr "Basculement sur \"%s\" après erreur" +msgstr "Basculement sur « %s » après erreur" #, c-format -msgid " at %s - rescheduled for %s%s #%u" -msgstr " à %s - replanifié pour %s%s #%u" +msgid " at %s" +msgstr " à %s" msgid "Suspended (SHA1 checking)" msgstr "Suspendu (vérification SHA1)" @@ -87,23 +85,29 @@ msgid "Download queue is frozen" msgstr "File de téléchargement figée" +msgid "Network buffer shortage" +msgstr "Insuffisance du tampon réseau" + msgid "No download slot (start)" msgstr "Pas de créneau libre pour télécharger (démarrage)" msgid "Connection failed (Out of file descriptors?)" -msgstr "Échec de connexion (plus de descripteurs de fichiers ?)" +msgstr "Échec de connexion (plus de descripteurs de fichiers ?)" msgid "Connection failed" msgstr "La connexion a échoué" +msgid "SHA1 mismatch detected" +msgstr "Disparité SHA1 détectée" + msgid "Waiting for server PROX publishing" msgstr "En attente de publication PROX par le serveur" msgid "Waiting for push route" -msgstr "En attente d'une route de 'push'" +msgstr "En attente d'une route de « push »" msgid "Push route lost" -msgstr "Route 'push' perdue" +msgstr "Route « push » perdue" msgid "Ignoring Push flag" msgstr "Ignore le drapeau Push" @@ -165,18 +169,18 @@ #, c-format msgid "Can't check resume data: %s" -msgstr "Impossible de vérifier les données de reprise : %s" +msgstr "Impossible de vérifier les données de reprise : %s" #, c-format msgid "Can't stat opened file: %s" -msgstr "Impossible d'interroger le fichier ouvert : %s" +msgstr "Impossible d'interroger le fichier ouvert : %s" msgid "Stopped (Output file size changed)" msgstr "Stoppé (La taille du fichier de sortie a changé)" #, c-format msgid "Can't read resume data: %s" -msgstr "Impossible de lire les données de reprise : %s" +msgstr "Impossible de lire les données de reprise : %s" msgid "Short read on resume data" msgstr "Lecture courte sur les données de reprise" @@ -187,7 +191,7 @@ #, c-format msgid "Can't save data: %s" -msgstr "Impossible d'enregistrer les données : %s" +msgstr "Impossible d'enregistrer les données : %s" msgid "Partial write to file" msgstr "Écriture partielle dans le fichier" @@ -200,7 +204,7 @@ #, c-format msgid "Switching to \"%s\"" -msgstr "Basculement sur \"%s\"" +msgstr "Basculement sur « %s »" msgid "Requeued by competing download" msgstr "Remis dans la file à cause de téléchargements concurrents" @@ -247,7 +251,7 @@ #, c-format msgid "Failed (Read error: %s)" -msgstr "Échec (Erreur de lecture : %s)" +msgstr "Échec (Erreur de lecture : %s)" msgid "Timeout reading HTTP status" msgstr "Timeout en lisant l'état HTTP" @@ -259,6 +263,9 @@ msgid "No support for Content-Encoding (%s)" msgstr "Pas de support pour l'en-tête Content-Encoding (%s)" +msgid "Incomplete headers during TLS upgrade" +msgstr "" + msgid "Spammer detected" msgstr "Spameur détecté" @@ -288,7 +295,7 @@ #, c-format msgid ", ETA: %s" -msgstr ", ETA : %s" +msgstr ", ETA : %s" msgid "Server did not supply identification" msgstr "Le serveur n'a pas envoyé d'identification" @@ -317,6 +324,12 @@ msgid "No Content-Length header" msgstr "Pas d'en-tête Content-Length" +msgid "Unexpected Content-Type" +msgstr "Content-Type inattendu" + +msgid "No Content-Type" +msgstr "Pas de Content-Type" + msgid "Search already closed" msgstr "Recherche déjà fermée" @@ -328,33 +341,30 @@ #, c-format msgid "Cannot open %s: %s" -msgstr "Impossible d'ouvrir %s : %s)" +msgstr "Impossible d'ouvrir %s : %s)" msgid "Cannot resume: file gone" -msgstr "Impossible de reprendre : le fichier n'est plus là" +msgstr "Impossible de reprendre : le fichier n'est plus là" #, c-format msgid "Cannot write into file: %s" -msgstr "Impossible d'écrire dans le fichier : %s" +msgstr "Impossible d'écrire dans le fichier : %s" msgid "Stopped (Read buffer full)" msgstr "Stoppé (Tampon de lecture plein)" msgid "Failed (Completed?)" -msgstr "Échec (Terminé ?)" +msgstr "Échec (Terminé ?)" msgid "Could not send whole HTTP request" msgstr "Impossible d'envoyer la requête HTTP complète" #, c-format msgid "Write failed: %s" -msgstr "Erreur d'écriture : %s" +msgstr "Erreur d'écriture : %s" msgid "Malformed push reply" -msgstr "Réponse 'push' mal formée" - -msgid "SHA1 mismatch detected" -msgstr "Disparité SHA1 détectée" +msgstr "Réponse « push » mal formée" msgid ", inbound" msgstr ", entrant" @@ -362,14 +372,24 @@ msgid ", outbound" msgstr ", sortant" +msgid ", no-pipeline" +msgstr ", pas d'emboîtement" + msgid ", banning" msgstr ", bannissement" msgid ", g2" msgstr ", g2" +msgid ", fake-g2" +msgstr ", faux-G2" + msgid ", vendor?" -msgstr ", vendeur ?" +msgstr ", vendeur ?" + +#, c-format +msgid "<Browse G2 Host %s>" +msgstr "<Parcourir l'hôte G2 %s>" #, c-format msgid "<Browse Host %s>" @@ -397,9 +417,15 @@ msgid "Requeued due to timeout" msgstr "Remis dans la file après timeout" +msgid "Partial file removed" +msgstr "Fichier partiel supprimé" + +msgid "File info being reset" +msgstr "Information sur le fichier réinitialisée" + #, c-format msgid "Downloading (TR: %s)" -msgstr "Téléchargement (TR : %s)" +msgstr "Téléchargement (TR : %s)" msgid "Seeding" msgstr "Pollinisation" @@ -472,144 +498,13 @@ msgstr1 "Reçu %d hôtes de %s" #, c-format +msgid "Connecting to web cache %s" +msgstr "Connexion au web cache %s" + +#, c-format msgid "Bootstrapping from %s" msgstr "Initialisation depuis %s" -msgid "Bad size" -msgstr "Mauvaise taille" - -msgid "Too small" -msgstr "Trop petit" - -msgid "Too large" -msgstr "Trop grand" - -msgid "Way too large" -msgstr "Beaucoup trop grand" - -msgid "Unknown message type" -msgstr "Type de message inconnu" - -msgid "Unexpected message" -msgstr "Message inattendu" - -msgid "Message sent with TTL = 0" -msgstr "Message envoyé avec un TTL = 0" - -msgid "Improper hops/ttl combination" -msgstr "Combinaison inexacte de hops/ttl" - -msgid "Max TTL exceeded" -msgstr "TTL maximum dépassé" - -msgid "Message throttle" -msgstr "Limitation du nombre de messages" - -msgid "Message matched limits" -msgstr "Taille limite de messages atteinte" - -msgid "Unusable Pong" -msgstr "Pong inutilisable" - -msgid "Hard TTL limit reached" -msgstr "Limite dure de la valeur TTL atteinte" - -msgid "Max hop count reached" -msgstr "Nombre de relais maximum atteint" - -msgid "Route lost" -msgstr "Route perdue" - -msgid "No route" -msgstr "Pas de route" - -msgid "Duplicate message" -msgstr "Message doublon" - -msgid "Message to banned GUID" -msgstr "Message vers un GUID banni" - -msgid "Message from banned GUID" -msgstr "Message depuis un GUID banni" - -msgid "Node shutting down" -msgstr "Noeud en cours d'arrêt" - -msgid "TX flow control" -msgstr "Contrôle de flux TX" - -msgid "Query text had no trailing NUL" -msgstr "Le texte de la demande n'a pas de NUL final" - -msgid "Query text too short" -msgstr "Texte de la demande trop court" - -msgid "Query had unnecessary overhead" -msgstr "La demande avait un surplus inutile" - -msgid "Query had bad URN" -msgstr "La demande avait un mauvais URN" - -msgid "Message with malformed SHA1" -msgstr "Message avec SHA1 mal formé" - -msgid "Message with malformed UTF-8" -msgstr "Message avec UTF-8 mal formé" - -msgid "Malformed Query Hit" -msgstr "Réponse à recherche malformée" - -msgid "Bad return address" -msgstr "Mauvaise adresse de retour" - -msgid "Hostile IP address" -msgstr "Adresse IP hostile" - -msgid "Bogus result from Morpheus" -msgstr "Mauvais résultat de recherche depuis Morpheus" - -msgid "Spam" -msgstr "Spam" - -msgid "Evil filename" -msgstr "Mauvais nom de fichier" - -msgid "Improper media type" -msgstr "Mauvais type de fichier" - -msgid "Payload inflating error" -msgstr "Erreur d'extraction de la charge utile" - -msgid "Unknown header flags present" -msgstr "Drapeaux d'en-tête inconnus présents" - -msgid "Own search results" -msgstr "Propres résultats de recherche" - -msgid "Own queries" -msgstr "Propres recherches" - -msgid "Ancient query format" -msgstr "Ancien format de recherche" - -msgid "Blank Servent ID" -msgstr "ID servent blanc" - -msgid "GUESS Query missing token" -msgstr "Pas de jeton dans la requête GUESS" - -msgid "GUESS Invalid query token" -msgstr "Mauvais jeton dans la requête GUESS" - -msgid "DHT Invalid security token" -msgstr "Mauvais jeton de sécurité DHT" - -msgid "DHT Too many STORE requests" -msgstr "Trop de requêtes STORE dans la DHT" - -msgid "DHT Malformed message" -msgstr "Message DHT mal formé" - #, c-format msgid "Shutdown (%s)" msgstr "Arrêt (%s)" @@ -620,27 +515,6 @@ msgstr0 "Reçu %d pong de connexion" msgstr1 "Reçu %d pongs de connexion" -msgid "Sent crawling info" -msgstr "Envoi de l'info au fouineur" - -msgid "Cannot setup compressing TX stack" -msgstr "Impossible de paramétrer la pile TX de compression" - -#, c-format -msgid "Got BYE %d %.*s" -msgstr "Reçu BYE %d %.*s" - -#, c-format -msgid "Weird HELLO %s" -msgstr "HELLO étrange %s" - -#, c-format -msgid "HELLO %s error %d (%s)" -msgstr "HELLO %s erreur %d (%s)" - -msgid "Shielded node" -msgstr "Noeud feuille sous écran" - msgid "Gnet connections disabled" msgstr "Connexions Gnet désactivées" @@ -648,6 +522,10 @@ msgstr "Connexion non compressée" #, c-format +msgid "Too many G2 hubs (%u max)" +msgstr "Trop de hubs G2 (max %u)" + +#, c-format msgid "Too many leaves (%d max)" msgstr "Trop de feuilles (%d max)" @@ -672,6 +550,9 @@ msgid "Not an ultra node" msgstr "Pas un noeud ultra" +msgid "Unknown error" +msgstr "Erreur inconnue" + msgid "Unstable IP address" msgstr "Adresse IP instable" @@ -683,17 +564,47 @@ #, c-format msgid "Not connecting: %s" -msgstr "Pas de connexion : %s" +msgstr "Pas de connexion : %s" + +msgid "Cannot setup compressing TX stack" +msgstr "Impossible de paramétrer la pile TX de compression" + +msgid "Sent crawling info" +msgstr "Envoi de l'info au fouineur" + +#, c-format +msgid "Got BYE %d %.*s" +msgstr "Reçu BYE %d %.*s" + +#, c-format +msgid "Weird HELLO %s" +msgstr "HELLO étrange %s" + +#, c-format +msgid "HELLO %s error %d (%s)" +msgstr "HELLO %s erreur %d (%s)" + +msgid "Shielded node" +msgstr "Noeud feuille sous écran" msgid "Protocol not acceptable" msgstr "Protocole non acceptable" +msgid "Conflict" +msgstr "" + +msgid "Upgrade Header Missing" +msgstr "" + msgid "Servent Shutdown" msgstr "Arrêt du servent" msgid "Not a network member" msgstr "Pas un membre du réseau" +msgid "Need a G2 Hub" +msgstr "Besoin d'un hub G2" + msgid "Too frequent crawling" msgstr "Fouinage trop fréquent" @@ -718,7 +629,7 @@ #, c-format msgid "Failed (Cannot send %s: %s)" -msgstr "Échec (Impossible d'envoyer %s : %s)" +msgstr "Échec (Impossible d'envoyer %s : %s)" #, c-format msgid "Failed (Cannot send %s atomically)" @@ -732,7 +643,7 @@ #, c-format msgid "Failed (Input error: %s)" -msgstr "Échec (Erreur d'entrée : %s)" +msgstr "Échec (Erreur d'entrée : %s)" msgid "Failed (EOF)" msgstr "Échec (fin de fichier)" @@ -743,6 +654,12 @@ msgid "Pseudo UDP node" msgstr "Noeud pseudo UDP" +msgid "Pseudo semi-reliable UDP node" +msgstr "Noeud pseudo UDP semi-fiable" + +msgid "Pseudo G2 UDP node" +msgstr "Noeud pseudo G2 UDP" + msgid "Pseudo DHT node" msgstr "Noeud pseudo DHT" @@ -757,18 +674,18 @@ #, c-format msgid "Write error during HELLO: %s" -msgstr "Erreur d'écriture pendant HELLO : %s" +msgstr "Erreur d'écriture pendant HELLO : %s" msgid "Connection reset during HELLO" msgstr "Connexion réinitialisée durant le HELLO" #, c-format msgid "Kicked: %s message too big (%d bytes)" -msgstr "Éjecté : %s message trop gros (%d octets)" +msgstr "Éjecté : %s message trop gros (%d octets)" #, c-format msgid "Kicked: %s message too big (>= 64KiB limit)" -msgstr "Éjecté : %s message trop gros (>= limite de 64 Ko)" +msgstr "Éjecté : %s message trop gros (>= limite de 64 Ko)" msgid "Leaf" msgstr "Feuille" @@ -788,6 +705,9 @@ msgid "DHT" msgstr "DHT" +msgid "G2 hub" +msgstr "Hub G2 frais" + msgid "Unknown" msgstr "Inconnu" @@ -796,32 +716,39 @@ #, c-format msgid "Read error: %s" -msgstr "Erreur de lecture : %s" +msgstr "Erreur de lecture : %s" #, c-format msgid "Must wait %u more seconds before resending \"What's New\"" msgstr "" +"Il faut attendre %u secondes de plus avant d'envoyer une nouvelle requête « " +"Quoi de neuf ? »" #, c-format msgid "mkdir(\"%s\") failed: %m" -msgstr "mkdir(\"%s\") a échoué : %m" +msgstr "mkdir(\"%s\") a échoué : %m" msgid "Can't find your home directory!" -msgstr "Ne peut trouver votre répertoire d'accueil !" +msgstr "Ne peut trouver votre répertoire d'accueil !" msgid "$GTK_GNUTELLA_DIR must point to an absolute path!" -msgstr "$GTK_GNUTELLA_DIR doit pointer vers un chemin absolu !" +msgstr "$GTK_GNUTELLA_DIR doit pointer vers un chemin absolu !" #, c-format msgid "creating configuration directory \"%s\"" -msgstr "Création du répertoire de configuration \"%s\"" +msgstr "Création du répertoire de configuration « %s »" #, c-format msgid "creating directory \"%s\" for %s" -msgstr "Création du répertoire \"%s\" pour %s" +msgstr "Création du répertoire « %s » pour %s" -msgid "You seem to have left another gtk-gnutella running" -msgstr "Vous semblez avoir un autre gtk-gnutella qui tourne" +#, c-format +msgid "Another gtk-gnutella supervisor is running as PID %lu" +msgstr "" + +#, c-format +msgid "Another gtk-gnutella is running as PID %lu" +msgstr "" msgid "Cannot proceed without valid configuration directory" msgstr "Ne peut continuer sans un répertoire de configuration valide" @@ -835,9 +762,6 @@ msgid "Failed to create local socket" msgstr "Impossible de créer la socket locale" -msgid "Failed to create listening sockets" -msgstr "Impossible de créer des sockets d'écoute" - msgid "Can only run as a leaf when TCP-firewalled" msgstr "Ne fonctionne qu'en mode feuille sans connexions TCP entrantes" @@ -847,6 +771,12 @@ msgid "Got EOF" msgstr "Reçu EOF (fin de fichier)" +msgid "TLS handshake failed" +msgstr "La négociation TLS a échoué" + +msgid "Connection locally failed" +msgstr "La connexion a échoué localement" + msgid "Write failed (Input Exception)" msgstr "Échec d'écriture (Exception d'entrée)" @@ -867,31 +797,124 @@ msgid "Connect back timeout" msgstr "Timeout sur le retour de connexion" +msgid "Request timeout" +msgstr "Demande expirée" + msgid "Timeout waiting for follow-up" msgstr "Timeout en attente de la suite" msgid "Lifetime expired" msgstr "Durée de vie expirée" +msgid "Unauthorized" +msgstr "Non autorisé" + +#, c-format +msgid "Limiting connections from %s" +msgstr "Limite les Connexions depuis %s" + +msgid "No reason given" +msgstr "Pas de raison" + +msgid "Bad Request" +msgstr "Mauvaise demande" + +msgid "Header too large" +msgstr "En-tête trop grand" + +msgid "Input buffer full" +msgstr "Tampon d'entrée plein" + +msgid "Extra data after HTTP header" +msgstr "Données en trop après l'en-tête HTTP" + msgid "Unable to send GIV" msgstr "Impossible d'envoyer un message GIV" +msgid "Not Found" +msgstr "Pas trouvé" + +msgid "File was modified" +msgstr "Le fichier a été modifié" + +msgid "Moved Permanently" +msgstr "Déplacé de manière permanente" + +msgid "File index/name mismatch" +msgstr "L'index/nom de fichier ne correspond pas" + +msgid "URN Not Found (urn:sha1)" +msgstr "URN non trouvée (urn:sha1)" + +msgid "SHA1 is being recomputed" +msgstr "SHA1 en cours de calcul" + +msgid "Library being rebuilt" +msgstr "Bibliothèque en cours de reconstruction" + +msgid "Malformed URN in /uri-res/N2R request" +msgstr "URN mal formé dans la requête /uri-res/N2R" + +msgid "Malformed URN in /uri-res/N2X request" +msgstr "URN mal formé dans la requête /uri-res/N2X" + +msgid "TTH is being computed" +msgstr "TTH en cours de calcul" + msgid "<Browse Host Request>" msgstr "<Requête de fouinage d'hôte>" +msgid "Browse Host Disabled" +msgstr "Fouille d'hôte désactivée" + +#, c-format +msgid "Redirected to %s:%u" +msgstr "Redirection vers %s:%u" + +msgid "Not Modified" +msgstr "Non modifié" + msgid "Stalling upload replaced" msgstr "Remplacement d'un envoi bloqué" +msgid "Already downloading this file" +msgstr "Téléchargement de ce fichier en cours" + +msgid "Malformed Range request" +msgstr "Intervalle de requête mal formé" + +msgid "Requested range not satisfiable" +msgstr "La plage demandée est indisponible" + +msgid "Requested range not available yet" +msgstr "La plage requise est indisponible pour l'instant" + +msgid "Queue full" +msgstr "File d'attente pleine" + +msgid "Another connection is still active" +msgstr "Connexion alternative encore en cours" + +#, c-format +msgid "%s not honoured; removed from PARQ queue" +msgstr "%s non honoré; enlevé de la file PARQ" + +msgid "Minimum retry delay" +msgstr "Délai minimum de reprise" + #, c-format msgid "Queued (slot %d, ETA: %s)" -msgstr "Dans la file (créneau %d, ETA : %s)" +msgstr "Dans la file (créneau %d, ETA : %s)" msgid "Cannot send whole HTTP status" msgstr "Impossible d'envoyer l'état HTTP complet" +msgid "Not Acceptable" +msgstr "Pas acceptable" + #, c-format -msgid "<Browse Host Request> %s%s%s" -msgstr "<Requête de fouinage d'hôte> %s%s%s" +msgid "<Browse Host %sRequest> %s%s%s" +msgstr "<%sRequête de parcours de l'hôte> %s%s%s" msgid "query hits" msgstr "résultats de recherche" @@ -905,26 +928,60 @@ msgid ", chunked" msgstr ", par morceaux" +msgid "THEX failure" +msgstr "Échec THEX" + +msgid "EOF while sinking" +msgstr "" + +#, c-format +msgid "Read error while sinking: %m" +msgstr "" + +msgid "Content Too Large" +msgstr "" + +msgid "Unknown/Missing Protocol Tag" +msgstr "Étiquette de protocole inconnu ou manquant" + +msgid "Missing Host Header" +msgstr "En-tête Host manquant" + +msgid "Not Implemented" +msgstr "Pas implémenté" + +msgid "Bad URI" +msgstr "URI mal spécifié" + +msgid "Bad Path" +msgstr "Chemin mal spécifié" + +msgid "No Content Allowed" +msgstr "Présence de contenu pas autorisé" + +msgid "Sharing currently disabled" +msgstr "Partage actuellement désactivé" + msgid "Write exception" msgstr "Exception d'écriture" #, c-format msgid "File read error: %s" -msgstr "Erreur de lecture du fichier : %s" +msgstr "Erreur de lecture du fichier : %s" msgid "File EOF?" -msgstr "Fin de fichier ?" +msgstr "Fin de fichier ?" #, c-format msgid "Data write error: %s" -msgstr "Erreur d'écriture de données : %s" +msgstr "Erreur d'écriture de données : %s" msgid "No bytes written, source may be gone" msgstr "Aucun octet écrit, la source est peut-être partie" #, c-format msgid "Special read error: %s" -msgstr "Erreur spéciale de lecture : %s" +msgstr "Erreur spéciale de lecture : %s" msgid "Explicitly killed" msgstr "Explicitement tué" @@ -934,15 +991,1221 @@ #, c-format msgid " - Newer versions available: release %s / from git %s" -msgstr " - Nouvelles versions disponibles : version %s / depuis git %s" +msgstr " - Nouvelles versions disponibles : version %s / depuis git %s" #, c-format msgid " - Newer version available: release %s" -msgstr " - Nouvelle version disponible : version %s" +msgstr " - Nouvelle version disponible : version %s" #, c-format msgid " - Newer version available: from git %s" -msgstr " - Nouvelle version disponible : depuis git %s" +msgstr " - Nouvelle version disponible : depuis git %s" + +msgid "Routing errors" +msgstr "Erreurs de routage" + +msgid "Routing table chunks" +msgstr "Nombre de morceaux dans la table de routage" + +msgid "Routing table message capacity" +msgstr "Capacité en messages de la table de routage" + +msgid "Routing table message count" +msgstr "Nombre de messages dans la table de routage" + +msgid "Routing through transient node avoided" +msgstr "Routage à travers un noeud éphémère évité" + +msgid "Duplicates with higher TTL" +msgstr "En double avec un TTL plus élevé" + +msgid "SPAM SHA1 database hits" +msgstr "SPAM trouvé dans la base de SHA1" + +msgid "SPAM filename and size hits" +msgstr "SPAM trouvé par nom et taille de fichier" + +msgid "SPAM fake hits" +msgstr "SPAM faux en écriture" + +msgid "SPAM duplicate hits" +msgstr "SPAM résultat dupliqué" + +msgid "SPAM dynamically caught hostile IP addresses" +msgstr "SPAM adresse IP hostile déterminée dynamiquement" + +msgid "SPAM dynamically caught hostile IP held" +msgstr "SPAM nombre d'adresses IP hostiles dynamiques connues" + +msgid "SPAM spotted spamming IP addresses held" +msgstr "SPAM adresses IP identifiées comme retournant du SPAM connues" + +msgid "Searches to local DB" +msgstr "Recherches dans la base locale" + +msgid "Hits on local DB" +msgstr "Correspondances dans la base locale" + +msgid "Hits on local partial files" +msgstr "Résultats depuis un fichier partiel" + +msgid "Hits on \"what's new?\" queries" +msgstr "Résultats sur une recherche « quoi de neuf ? »" + +msgid "Query hits received for local queries" +msgstr "Résultats de recherche reçus pour les recherches locales" + +msgid "G2 searches to local DB" +msgstr "G2 recherches vers la base de données locale" + +msgid "G2 hits on local DB" +msgstr "G2 correspondances sur la base de données locale" + +msgid "G2 hits on local partial files" +msgstr "G2 correspondances sur les fichiers locaux partiels" + +msgid "Query hits received for OOB-proxied queries" +msgstr "Résultats de recherche reçus pour les recherches via proxy OOB" + +msgid "Queries requesting OOB hit delivery" +msgstr "Recherches demandant un hit OOB" + +msgid "Stripped OOB flag on queries" +msgstr "Flag OOB supprimé sur les recherches" + +msgid "Ignored OOB queries due to unclaimed hits" +msgstr "Requêtes OOB ignorées en raison de correspondances non réclamées" + +msgid "Duplicate OOB-proxied queries" +msgstr "Recherches en double via proxy OOB" + +msgid "OOB hits received for OOB-proxied queries" +msgstr "Résultats OOB reçus pour des recherches via proxy OOB" + +msgid "OOB hits bearing alien IP address" +msgstr "Résultats OOB avec une adresse IP étrangère" + +msgid "OOB hits ignored due to identified spamming address" +msgstr "Résultats OOB ignorés pour cause d'adresse retournant du SPAM" + +msgid "OOB hits ignored due to unsecure promise from known secure host" +msgstr "" +"Résultats OOB ignorés pour cause de promesse non sécurisée depuis un hôte " +"sûr connu" + +msgid "Unclaimed locally-generated OOB hits" +msgstr "Résultats OOB locaux non demandés" + +msgid "Partially claimed locally-generated OOB hits" +msgstr "Résultats OOB locaux demandés partiellement" + +msgid "Spurious OOB hit claiming received" +msgstr "Fausse demande de résultats OOB reçue" + +msgid "Unrequested OOB hits received" +msgstr "Résultats OOB reçus mais non demandés" + +msgid "Received query hits for untracked queries" +msgstr "Résultats reçus pour une recherche non traquée" + +msgid "Tracked query MUIDs" +msgstr "MUIDs de recherches traqués" + +msgid "Compacted queries" +msgstr "Demandes compressées" + +msgid "Bytes saved by compacting" +msgstr "Octets sauvés en compressant" + +msgid "UTF8 queries" +msgstr "Demandes UTF8" + +msgid "SHA1 queries" +msgstr "Demandes SHA1" + +msgid "\"What's New?\" queries" +msgstr "Demandes de type « quoi de neuf ? »" + +msgid "UTF8 G2 queries" +msgstr "Requêtes G2 UTF8" + +msgid "SHA1 G2 queries" +msgstr "Requêtes G2 SHA1" + +msgid "GUESS queries" +msgstr "GUESS nombre de requêtes" + +msgid "GUESS queries (0.2)" +msgstr "GUESS nombre de requêtes (0.2)" + +msgid "GUESS link cache size" +msgstr "Taille de la mémoire tampon de liens GUESS" + +msgid "GUESS cached query keys held" +msgstr "GUESS nombre de clés de requêtes connues" + +msgid "GUESS cached 0.2 hosts held" +msgstr "GUESS nombre de clés de requêtes connues" + +msgid "GUESS cached G2 hosts held" +msgstr "GUESS hôtes G2 dans le cache maintenus" + +msgid "GUESS locally generated queries" +msgstr "GUESS demandes locales générées" + +msgid "GUESS currently running queries" +msgstr "GUESS nombre de requêtes actives" + +msgid "GUESS hits received for locally generated queries" +msgstr "GUESS résultats reçus pour les recherches locales" + +msgid "GUESS ultra nodes queried" +msgstr "GUESS noeuds ultra interrogés" + +msgid "GUESS ultra nodes sending back an acknowledgment" +msgstr "GUESS noeuds ultra renvoyant un accusé de réception" + +msgid "GUESS G2 nodes queried" +msgstr "GUESS noeuds G2 interrogés" + +msgid "GUESS G2 nodes sending back an acknowledgment" +msgstr "GUESS noeuds G2 renvoyant un accusé de réception" + +msgid "Throttled local push messages" +msgstr "Messages push locaux limités" + +msgid "Throttled received push messages" +msgstr "Messages push reçus limités" + +msgid "Broadcasted push messages" +msgstr "Messages push annoncés sur le réseau" + +msgid "Push-proxy UDP relayed messages" +msgstr "Messages Push-proxy relayés via UDP" + +msgid "Push-proxy TCP relayed messages" +msgstr "Messages Push-proxy relayés via TCP" + +msgid "Push-proxy TCP for FW<->FW transfers" +msgstr "TCP mandataire push pour les transferts PF<->PF" + +msgid "Push-proxy broadcasted messages" +msgstr "Messages Push-proxy annoncés sur le réseau" + +msgid "Push-proxy found un-proxied local route" +msgstr "Messages Push-proxy relayés par une route locale" + +msgid "Push-proxy lookup failures" +msgstr "Échecs de consultation Push-proxy" + +msgid "Push relayed via local route" +msgstr "Message Push relayés via une route locale" + +msgid "Push relayed via routing table" +msgstr "Message Push relayés via la table de routage" + +msgid "Locally generated dynamic queries" +msgstr "Demandes locales dynamiques générées" + +msgid "Leaf-generated dynamic queries" +msgstr "Demandes dynamiques générées par feuille" + +msgid "OOB-proxied leaf queries" +msgstr "Demandes de feuilles via proxy OOB" + +msgid "Fully completed dynamic queries" +msgstr "Demandes dynamiques entièrement terminées" + +msgid "Partially completed dynamic queries" +msgstr "Demande dynamiques partiellement terminées" + +msgid "Dynamic queries ended with no results" +msgstr "Demandes dynamiques terminées sans résultat" + +msgid "Fully completed dynamic queries getting late results" +msgstr "Demandes dynamiques entièrement terminées avec résultats différés" + +msgid "Dynamic queries with partial late results" +msgstr "Demandes dynamiques terminées partiellement avec résultats différés" + +msgid "Dynamic queries completed by late results" +msgstr "Demandes dynamiques terminées avec résultats différés" + +msgid "Queries seen from GTKG" +msgstr "Demandes vues par GTKG" + +msgid "Queries seen from GTKG that were re-queries" +msgstr "Demandes vues par GTKG qui étaient des re-demandes" + +msgid "Queries advertising support of GGEP \"H\"" +msgstr "Demandes avec support de GGEP \"H\"" + +msgid "Queries advertising support of semi-reliable UDP" +msgstr "Requêtes annonçant le support de l'UDP semi-fiable" + +msgid "GIV callbacks received" +msgstr "Rappel de GIV reçus" + +msgid "GIV discarded due to no suitable download" +msgstr "GIV ignorés pour cause d'absence de téléchargement adéquat" + +msgid "QUEUE callbacks received" +msgstr "Rappel de QUEUE reçus" + +msgid "QUEUE discarded due to no suitable download" +msgstr "QUEUE ignorés pour cause d'absence de téléchargement adéquat" + +msgid "File descriptors banned running count" +msgstr "Cumul du nombre de descripteurs de fichiers bannis" + +msgid "UDP read-ahead datagram running count" +msgstr "UDP lecture anticipée datagramme, nombre total" + +msgid "UDP read-ahead datagram running bytes" +msgstr "UDP lecture anticipée datagramme, taille totale en octets" + +msgid "UDP read-ahead datagram \"old\" processed" +msgstr "UDP lecture anticipée datagramme « ancien » traité" + +msgid "UDP read-ahead datagram max count" +msgstr "UDP lecture anticipée datagramme décompte max" + +msgid "UDP read-ahead datagram max bytes" +msgstr "UDP lecture anticipée datagramme octets max" + +msgid "UDP read-ahead datagram max delay" +msgstr "UDP lecture anticipée datagramme retard max" + +msgid "UDP push messages received for FW<->FW connections" +msgstr "Messages UDP push reçus pour les connexions PF<->PF" + +msgid "UDP push messages requesting FW<->FW connection with ourselves" +msgstr "Messages UDP push demandant une connexion PF<->PF avec nous" + +msgid "UDP push messages patched for FW<->FW connections" +msgstr "Messages UDP push patchés pour les connexions PF<->PF" + +msgid "UDP UHC pings received" +msgstr "UDP pings UHC reçus" + +msgid "UDP UHC pongs sent" +msgstr "Pongs UDP UDP envoyés" + +msgid "UDP messages with bogus source IP" +msgstr "Messages UDP avec source IP invalide" + +msgid "UDP messages from shunned IP (discarded)" +msgstr "Messages UDP depuis une IP évitée (rejetés)" + +msgid "UDP truncated incoming messages" +msgstr "UDP messages entrants tronqués" + +msgid "Alien UDP messages (non-Gnutella)" +msgstr "Messages UDP aliens (non-Gnutella)" + +msgid "Unprocessed UDP Gnutella messages" +msgstr "Messages UDP Gnutella non traités" + +msgid "Compressed UDP messages enqueued" +msgstr "Messages UDP compressés en file d'attente" + +msgid "Compressed UDP messages received" +msgstr "Messages UDP compressés reçus" + +msgid "Candidates for UDP message compression" +msgstr "Candidats pour la compression des messages UDP" + +msgid "Uncompressed UDP messages due to no gain" +msgstr "Messages UDP non compressés car pas de gain" + +msgid "Ambiguous UDP messages received" +msgstr "Messages UDP reçus ambigus" + +msgid "Ambiguous UDP messages inspected more deeply" +msgstr "Messages UDP ambigus inspectés plus profondément" + +msgid "Ambiguous UDP messages handled as semi-reliable UDP" +msgstr "Messages UDP ambigus gérés comme de l'UDP semi-fiable" + +msgid "Semi-reliable UDP total messages given for transmission" +msgstr "UDP semi-fiable total des messages proposés pour la transmission" + +msgid "Semi-reliable UDP total messages deflated" +msgstr "UDP semi-fiable total des messages compressés" + +msgid "Semi-reliable UDP total messages unsent" +msgstr "UDP semi-fiable total des messages non envoyés" + +msgid "Semi-reliable UDP total messages dropped due to temporary ban" +msgstr "" +"UDP semi-fiable messages totaux ignorés en raison d'un bannissement " +"temporaire" + +msgid "Semi-reliable UDP total messages sent to known responsive hosts" +msgstr "UDP semi-fiable messages totaux envoyés à des hôtes responsifs " + +msgid "Semi-reliable UDP total messages partially sent due to clogging" +msgstr "" +"UDP semi-fiable total des messages envoyés partiellement à cause d'un " +"embouteillage" + +msgid "Semi-reliable UDP reliable messages given for transmission" +msgstr "UDP semi-fiable messages fiables proposés pour la transmission" + +msgid "Semi-reliable UDP reliable messages correctly transmited" +msgstr "UDP semi-fiable messages UDP fiables transmis correctement" + +msgid "Semi-reliable UDP reliable messages not fully acknowledged" +msgstr "UDP semi-fiable messages UDP fiables non reconnus pleinement" + +msgid "Semi-reliable UDP fragments sent" +msgstr "UDP semi-fiable fragments UDP émis" + +msgid "Semi-reliable UDP fragments resent" +msgstr "UDP semi-fiable fragments UDP réexpédiés" + +msgid "Semi-reliable UDP fragment sendings avoided" +msgstr "UDP semi-fiable envois de fragments évités" + +msgid "Semi-reliable UDP fragments sent too many times" +msgstr "UDP semi-fiable fragments UDP émis trop de fois" + +msgid "Semi-reliable UDP total acknowledgments received" +msgstr "UDP semi-fiable total des accusés de réception reçus" + +msgid "Semi-reliable UDP cumulative acknowledgments received" +msgstr "UDP semi-fiable cumul des accusés de réception reçus" + +msgid "Semi-reliable UDP extended acknowledgments received" +msgstr "UDP semi-fiable accusés de réception étendues reçues" + +msgid "Semi-reliable UDP spurious acknowledgments received" +msgstr "UDP semi-fiable accusés de réception contrefaits reçues" + +msgid "Semi-reliable UDP invalid acknowledgments received" +msgstr "UDP semi-fiable accusés de réception invalides reçus" + +msgid "Semi-reliable UDP acknowledgments re-queued for sending" +msgstr "UDP semi-fiable accusés de réception remis dans le fil pour envoi" + +msgid "Semi-reliable UDP plain acknowledgments dropped" +msgstr "UDP semi-fiable accusés de réception simples non envoyés" + +msgid "Semi-reliable UDP enhanced acknowledgments dropped" +msgstr "UDP semi-fiable accusés de réception améliorés ignorés" + +msgid "Semi-reliable UDP plain acknowledgments transmitted" +msgstr "UDP semi-fiable accusés de réception simples transmis" + +msgid "Semi-reliable UDP cumulative acknowledgments transmitted" +msgstr "UDP semi-fiable UDP accusés de réception cumulatifs transmis" + +msgid "Semi-reliable UDP extended acknowledgments transmitted" +msgstr "UDP semi-fiable accusés de réception étendus transmis" + +msgid "Semi-reliable UDP EARs sent" +msgstr "UDP semi-fiable EARs émis" + +msgid "Semi-reliable UDP too many EARs sent" +msgstr "UDP semi-fiable trop d'EAR émis" + +msgid "Semi-reliable UDP EAR negative acknowledgments received" +msgstr "UDP semi-fiable EAR accusés de réception négatifs reçues" + +msgid "Semi-reliable UDP acknowledgments received after sending EARs" +msgstr "UDP semi-fiable accusés de réception reçus après l'envoi d'EARs" + +msgid "Semi-reliable UDP fragments received" +msgstr "Fragments UDP semi-fiables reçus " + +msgid "Semi-reliable UDP duplicate fragments received" +msgstr "UDP semi-fiable fragments dupliqués reçus" + +msgid "Semi-reliable UDP unreliable fragments received" +msgstr "UDP semi-fiable fragments non fiables reçus" + +msgid "Semi-reliable UDP dropped received fragments" +msgstr "UDP semi-fiable fragments reçus mis au rebut" + +msgid "Semi-reliable UDP fragments received whilst lingering" +msgstr "UDP semi-fiable fragments reçus lors de l'attente" + +msgid "Semi-reliable UDP messages expired before re-assembly" +msgstr "UDP semi-fiable messages expirés avant le ré-assemblage" + +msgid "Semi-reliable UDP messages re-assembled completely" +msgstr "UDP semi-fiable messages ré-assemblés complètement" + +msgid "Semi-reliable UDP messages inflated successfully" +msgstr "UDP semi-fiable messages décompressés avec succès" + +msgid "Semi-reliable UDP messages inflated incorrectly" +msgstr "UDP semi-fiable messages décompressés incorrectement" + +msgid "Semi-reliable UDP unreliable messages received" +msgstr "Messages UDP semi-fiables douteux reçus" + +msgid "Semi-reliable UDP empty messages received" +msgstr "Messages UDP vides semi-fiables reçus" + +msgid "Semi-reliable UDP total acknowledgments sent" +msgstr "UDP semi-fiable total des accusés de réception émis" + +msgid "Semi-reliable UDP cumulative acknowledgments sent" +msgstr "UDP semi-fiable accusés de réception cumulés émis" + +msgid "Semi-reliable UDP extended acknowledgments sent" +msgstr "UDP semi-fiable accusés de réception étendus émis" + +msgid "Semi-reliable UDP avoided acknowledgment sendings" +msgstr "UDP semi-fiable envois évités d'accusés de réception" + +msgid "Semi-reliable UDP EARs received" +msgstr "EARs UDP semi-fiables reçus" + +msgid "Semi-reliable UDP EARs received for unknown message" +msgstr "UDP semi-fiable EARs reçus pour un message inconnu" + +msgid "Semi-reliable UDP EARs received whilst lingering" +msgstr "UDP semi-fiable EARs reçus lors de l'attente" + +msgid "Semi-reliable UDP fragments from hostile IP addresses" +msgstr "Fragments UDP semi-fiables depuis les adresses IP hostiles" + +msgid "UDP G2 hits rerouted to hub for delivery" +msgstr "UDP résultats G2 redirigés vers un hub pour livraison" + +msgid "UDP G2 hits undelivered" +msgstr "UDP résultats G2 non livrés" + +msgid "Consolidated servers (after GUID and IP address linking)" +msgstr "Serveurs consolidés (après liaison de l'adresse IP et du GUID)" + +msgid "Duplicate downloads found during server consolidation" +msgstr "Téléchargements en double trouvés après consolidation des serveurs" + +msgid "Discovered server GUIDs" +msgstr "GUIDs de serveurs trouvés" + +msgid "Changed server GUIDs" +msgstr "GUIDs de serveurs changés" + +msgid "Detected GUID collisions" +msgstr "Collisions de GUID" + +msgid "Detected collisions with our own GUID" +msgstr "Collisions avec notre propre GUID" + +msgid "GUID dynamically banned" +msgstr "GUID bannis dynamiquement" + +msgid "Firewalled node info for known hosts received in upload requests" +msgstr "" +"Informations de Push-proxy pour des noeuds connus reçues dans des demandes " +"de téléchargement" + +msgid "Revitalized PUSH routes" +msgstr "Routes de PUSH ravivées" + +msgid "Collected new PUSH proxies from other query hits" +msgstr "Information de proxy pour PUSH collectés dans des résultats" + +msgid "Attempted download resource switching on completion" +msgstr "Essai de basculement de ressource téléchargée sur complétion" + +msgid "Attempted download resource switching after error" +msgstr "Essai de basculement de ressource téléchargée sur erreur" + +msgid "Successful download resource switching (all kind)" +msgstr "Succès de basculement de ressource téléchargée (tous types)" + +msgid "Successful download resource switching between plain files" +msgstr "Succès de basculement de ressource téléchargée entre fichiers" + +msgid "Successful download resource switching after error" +msgstr "Succès de basculement de ressource téléchargée après une erreur" + +msgid "Actively queued after resource switching attempt" +msgstr "" +"Tentatives de basculement de ressource téléchargée dans la queue active" + +msgid "Sunk HTTP reply data on error codes" +msgstr "Données HTTP mises à la poubelle sur code d'erreur" + +msgid "Ignored downloaded data" +msgstr "Données téléchargées ignorées" + +msgid "Ignoring requested after data mismatch" +msgstr "Données ignorées après une mésentente." + +msgid "Ignoring requested to preserve connection" +msgstr "Mises à la poubelle pour garder la connexion" + +msgid "Ignoring requested due to aggressive swarming" +msgstr "Mises à la poubelle dues au butinage agressif" + +msgid "Ignoring refused (data too large or server too slow)" +msgstr "" +"Mises à la poubelle refusées (volume de données trop grand ou serveur trop " +"lent)" + +msgid "Client resource switching (all detected)" +msgstr "Basculement de ressources demandées par les clients (détectées)" + +msgid "Client resource switching between plain files" +msgstr "Basculement de ressources demandées par les clients pour les fichiers" + +msgid "Client follow-up request after HTTP error was returned" +msgstr "Basculement de ressources demandées par les clients après erreur HTTP" + +msgid "PARQ client resource switching in slots (SHA-1 based)" +msgstr "" +"PARQ basculement de ressources dans les emplacements (basé sur le SHA-1)" + +msgid "PARQ client retry-after violation" +msgstr "PARQ violation du délai de reprise (retry-after)" + +msgid "PARQ client kicked out after too many retry-after violations" +msgstr "" +"PARQ client refoulé après de trop nombreuses violations du délai de reprise" + +msgid "PARQ upload slot limit overrides" +msgstr "" +"PARQ passe-droit accordé sur le nombre d'emplacements de téléchargements" + +msgid "PARQ quick upload slots granted" +msgstr "PARQ emplacements de téléchargement rapide accordés" + +msgid "PARQ QUEUE sending attempts" +msgstr "PARQ tentatives d'envoi de QUEUE" + +msgid "PARQ QUEUE messages sent" +msgstr "PARQ messages QUEUE reçus" + +msgid "PARQ QUEUE follow-up requests received" +msgstr "PARQ requêtes reçues après envoi de QUEUE" + +msgid "Launched SHA-1 file verifications" +msgstr "Vérifications de SHA-1 lancées" + +msgid "Launched TTH file verifications" +msgstr "Vérifications de TTH lancées" + +msgid "Re-seeding of orphan downloads through query hits" +msgstr "Reprises de téléchargements orphelins sur réception de réponse" + +msgid "Re-seeding of orphan downloads through upload requests" +msgstr "Reprises de téléchargements orphelins sur requête de téléchargement" + +msgid "RUDP sent bytes" +msgstr "Octets RUDP envoyés" + +msgid "RUDP received bytes" +msgstr "Octets RUDP reçus" + +msgid "DHT estimated amount of nodes" +msgstr "DHT estimation du nombre de noeuds" + +msgid "DHT standard error of estimated amount of nodes" +msgstr "DHT estimation de l'erreur standard du nombre de noeuds" + +msgid "DHT k-ball theoretical frontier (bits)" +msgstr "DHT frontière théorique de la boule-k (en bits)" + +msgid "DHT k-ball furthest frontier (bits)" +msgstr "DHT frontière éloignée de la boule-k (en bits)" + +msgid "DHT k-ball closeest frontier (bits)" +msgstr "DHT frontière proche de la boule-k (en bits)" + +msgid "DHT routing table buckets" +msgstr "DHT nombre d'emplacements de routage" + +msgid "DHT routing table leaves" +msgstr "DHT nombre de feuilles dans la table de routage" + +msgid "DHT routing table maximum depth" +msgstr "DHT profondeur maximum de la table de routage" + +msgid "DHT routing table good nodes" +msgstr "DHT nombre de bons noeuds dans la table de routage" + +msgid "DHT routing table stale nodes" +msgstr "DHT nombre de noeuds pourris dans la table de routage" + +msgid "DHT routing table pending nodes" +msgstr "DHT nombre de noeuds en attente dans la table de routage" + +msgid "DHT routing table evicted nodes" +msgstr "DHT nombre de noeuds évincés de la table de routage" + +msgid "DHT routing table evicted firewalled nodes" +msgstr "DHT nombre de noeuds évincés car sans connexion entrante" + +msgid "DHT routing table evicted nodes due to quota" +msgstr "DHT nombre de noeuds évincés sur quota de présence" + +msgid "DHT routing table promoted pending nodes" +msgstr "DHT nombre de noeuds en attente promus" + +msgid "DHT routing table pinged promoted nodes" +msgstr "DHT nombre de pings envoyés sur promotion de noeuds" + +msgid "DHT routing table rejected node due to bucket network quota" +msgstr "DHT nombre de noeuds rejetés pour cause de quota réseau (emplacement)" + +msgid "DHT routing table rejected node due to global network quota" +msgstr "DHT nombre de noeuds rejetés pour cause de quota réseau (global)" + +msgid "DHT completed bucket refreshes" +msgstr "DHT nombre de rafraîchissements d'emplacements effectués correctement" + +msgid "DHT forced bucket refreshes" +msgstr "DHT nombre de rafraîchissements d'emplacements forcés" + +msgid "DHT forced bucket merges" +msgstr "DHT nombre de fusions d'emplacements forcées" + +msgid "DHT bucket merges" +msgstr "DHT nombre de fusions d'emplacements" + +msgid "DHT bucket splits" +msgstr "DHT nombre de scissions d'emplacements" + +msgid "DHT denied non-splitable bucket refresh" +msgstr "DHT refus de rafraîchissement d'emplacements non partageables" + +msgid "DHT initiated bucket alive checks" +msgstr "DHT nombre de tests de vie lancés sur les emplacements de routage" + +msgid "DHT alive pings sent to good nodes" +msgstr "DHT nombre de pings envoyés à de bons noeuds" + +msgid "DHT alive pings sent to stale nodes" +msgstr "DHT nombre de pings envoyés à des noeuds pourris" + +msgid "DHT alive pings sent to shutdowning nodes" +msgstr "DHT nombre de pings envoyés à des noeuds en cours d'arrêt" + +msgid "DHT alive pings avoided" +msgstr "DHT pings de vie non envoyés" + +msgid "DHT alive pings skipped" +msgstr "DHT pings de vie évités" + +msgid "DHT revitalized stale nodes on RPC reply" +msgstr "DHT noeuds pourris ravivés sur réponse de RPC" + +msgid "DHT value store rejected on IP/network quota grounds" +msgstr "DHT stockage de valeur refusé sur la base de quota d'IP/réseau" + +msgid "DHT value store rejected on creator validation grounds" +msgstr "DHT stockage de valeur refusé sur créateur non validé" + +msgid "DHT nodes rejected during lookup based on network quota" +msgstr "DHT noeuds rejetés lors de recherches pour cause de quota réseau" + +msgid "DHT nodes rejected during lookup based on suspicious proximity" +msgstr "DHT noeuds rejetés lors de recherches pour cause de proximité suspecte" + +msgid "DHT nodes rejected during lookup based on frequency divergence" +msgstr "DHT noeuds rejetés lors de recherches sur divergence de fréquence" + +msgid "DHT node contact IP addresses fixed during lookup" +msgstr "DHT adresses IP de contact de noeud corrigées durant la recherche" + +msgid "DHT keys held" +msgstr "DHT nombre de clés contenues" + +msgid "DHT cached keys held" +msgstr "DHT nombre de clés cachées contenues" + +msgid "DHT values held" +msgstr "DHT nombre de valeurs stockées" + +msgid "DHT cached KUID targets held" +msgstr "DHT nombre d'identifiants KUIDs connus" + +msgid "DHT cached closest root nodes" +msgstr "DHT nombre de plus proches noeuds racines cachés" + +msgid "DHT cached roots exact hits" +msgstr "DHT noeuds racines trouvés dans le cache" + +msgid "DHT cached roots approximate hits" +msgstr "DHT noeuds cachés fournissant des racines approximatives" + +msgid "DHT cached roots misses" +msgstr "DHT racines non trouvées dans le cache" + +msgid "DHT cached roots lookups within k-ball" +msgstr "DHT recherches de racines dans le cache à l'intérieur de la boule-k" + +msgid "DHT cached roots contact address refreshed" +msgstr "DHT rafraîchissements des adresses de noeuds racines cachés" + +msgid "DHT cached security tokens held" +msgstr "DHT jetons de sécurité caches" + +msgid "DHT cached security tokens hits" +msgstr "DHT jetons de sécurité trouvés dans le cache" + +msgid "DHT stable node information held" +msgstr "DHT nombre de noeuds stables connus" + +msgid "DHT local hits on value lookups" +msgstr "DHT résultats locaux sur recherche de valeur" + +msgid "DHT local hits returning values from cached keys" +msgstr "DHT résultats locaux sur recherche de valeur provenant de clés cachées" + +msgid "DHT returned expanded values" +msgstr "DHT résultats retournés avec des valeurs expansées" + +msgid "DHT returned values as secondary keys" +msgstr "DHT résultats retournés avec des clés secondaires" + +msgid "DHT claimed values via secondary keys" +msgstr "DHT résultats demandés via des clés secondaires" + +msgid "DHT returned cached expanded values" +msgstr "DHT résultats cachés retournés avec des valeurs expansées" + +msgid "DHT returned cached values as secondary-keys" +msgstr "DHT résultats cachés retournés avec des clés secondaires" + +msgid "DHT claimed cached values via secondary keys" +msgstr "DHT résultats cachés demandés via des clés secondaires" + +msgid "DHT successfully received value publications" +msgstr "DHT publications reçues correctement" + +msgid "DHT successfully received value removals" +msgstr "DHT effacements reçus correctement" + +msgid "DHT replication of stale value avoided" +msgstr "DHT évitement de publication de valeur pourrie" + +msgid "DHT replication of held values" +msgstr "DHT réplication de valeurs stockées" + +msgid "DHT republishing of held values" +msgstr "DHT republication de valeurs stockées" + +msgid "DHT secondary-key value fetch issued" +msgstr "DHT demandes de valeurs par clé secondaire" + +msgid "DHT duplicate values returned in lookups" +msgstr "DHT valeurs dupliquées retournées dans les résultats" + +msgid "DHT detected KUID collisions" +msgstr "DHT collisions sur les KUIDs" + +msgid "DHT detected collisions with our own KUID" +msgstr "DHT collisions avec notre propre KUID" + +msgid "DHT caching attempts" +msgstr "DHT tentatives de cache de valeurs" + +msgid "DHT caching ended successfully" +msgstr "DHT cache de valeurs réalisé avec succès" + +msgid "DHT caching partially completed" +msgstr "DHT cache de valeurs réalisé partiellement" + +msgid "DHT key-offloading checks after discovering new closest node" +msgstr "" +"DHT tests de déchargement de clé après découverte d'un noeud plus proche" + +msgid "DHT keys selected for offloading" +msgstr "DHT clés sélectionnées pour déchargement" + +msgid "DHT key-offloading attempts" +msgstr "DHT tentatives de déchargement de clés" + +msgid "DHT key-offloading ended successfully" +msgstr "DHT déchargements de clés réalisés avec succès" + +msgid "DHT key-offloading partially completed" +msgstr "DHT déchargements de clés réalisés partiellement" + +msgid "DHT values successfully offloaded" +msgstr "DHT déchargements de valeurs réalisés" + +msgid "DHT incoming messages" +msgstr "DHT messages entrants" + +msgid "DHT incoming messages with UDP-matching contact address" +msgstr "" +"DHT messages entrants avec une adresse de contact correspondant à l'UDP" + +msgid "DHT incoming messages with contact address fixed" +msgstr "DHT messages entrants avec adresses de contact corrigées" + +msgid "DHT incoming messages from hostile addresses" +msgstr "DHT messages entrants depuis des adresses hostiles" + +msgid "DHT incoming messages with hostile contact address" +msgstr "DHT messages entrants avec une adresse de contact hostile" + +msgid "DHT RPC messages prepared" +msgstr "DHT messages RPC préparés" + +msgid "DHT RPC messages cancelled" +msgstr "DHT messages RPC annulés" + +msgid "DHT RPC timed out" +msgstr "DHT RPC dépassement du temps d'attente" + +msgid "DHT RPC replies received" +msgstr "DHT RPC réponses reçues" + +msgid "DHT RPC replies with contact address fixed" +msgstr "DHT RPC réponses avec une adresse de contact corrigée" + +msgid "DHT RPC late replies received" +msgstr "DHT RPC réponses en retard reçues" + +msgid "DHT RPC detected KUID mismatches on reply" +msgstr "DHT RPC différences de KUID détectées lors de la réponse" + +msgid "DHT RPC recent nodes held" +msgstr "DHT RPC noeuds récents connus" + +msgid "DHT node verifications" +msgstr "DHT vérifications de noeuds" + +msgid "DHT publishing attempts" +msgstr "DHT tentatives de publications envoyées" + +msgid "DHT publishing ended successfully (all roots)" +msgstr "DHT publications réussie complètement (sur toutes les racines)" + +msgid "DHT publishing partially completed (root subset only)" +msgstr "DHT publications réussies partiellement (sous-ensemble de racines)" + +msgid "DHT publishing ending with proper value presence" +msgstr "DHT publications terminés avec une présence de la valeur correcte" + +msgid "DHT value republishing occurring too late (after expiry)" +msgstr "DHT publications commencées trop tard (après expiration)" + +msgid "DHT publishing to self" +msgstr "DHT publications vers moi-même" + +msgid "DHT background publishing completion attempts" +msgstr "DHT tentatives de publication en tâche de fond" + +msgid "DHT background publishing completion showing improvements" +msgstr "DHT améliorations après publication en tâche de fond" + +msgid "DHT background publishing completion successful (all roots)" +msgstr "" +"DHT publications en tâche de fond réussies complètement (sur toutes les " +"racines)" + +msgid "DHT SHA1 data type collisions" +msgstr "DHT collisions de SHA1 sur types de données différents" + +msgid "DHT lookup path passively protected against attack" +msgstr "DHT chemin de recherche protégé passivement contre les attaques" + +msgid "DHT lookup path actively protected against attack" +msgstr "DHT chemin de recherche protégé activement contre les attaques" + +msgid "DHT alt-loc lookups issued" +msgstr "DHT recherches d'autres sources" + +msgid "DHT push-proxy lookups issued" +msgstr "DHT recherches de push-proxy" + +msgid "DHT successful alt-loc lookups" +msgstr "DHT recherches d'autres sources terminées avec succès" + +msgid "DHT successful push-proxy lookups" +msgstr "DHT recherches de push-proxy terminées avec succès" + +msgid "DHT successful node push-entry lookups" +msgstr "DHT recherches de noeuds push-proxy terminées avec succès" + +msgid "DHT re-seeding of orphan downloads" +msgstr "DHT reprises de téléchargements orphelins" + +msgid "Digests computed on general statistics" +msgstr "" + +msgid "Digests computed on TCP statistics" +msgstr "" + +msgid "Digests computed on UDP statistics" +msgstr "" + +msgid "Ping" +msgstr "Ping" + +msgid "Pong" +msgstr "Pong" + +msgid "Bye" +msgstr "Adieu" + +msgid "QRP" +msgstr "QRP" + +msgid "HSEP" +msgstr "HSEP" + +msgid "RUDP" +msgstr "RUDP" + +msgid "Vendor spec." +msgstr "Vendeur spécial" + +msgid "Vendor std." +msgstr "Vendeur standard" + +msgid "Push" +msgstr "Push" + +msgid "Query" +msgstr "Recherche" + +msgid "Query hit" +msgstr "Résultat de recherche" + +msgid "DHT (truncated)" +msgstr "DHT (tronqué)" + +msgid "DHT Ping" +msgstr "Ping DHT" + +msgid "DHT Pong" +msgstr "Pong DHT" + +msgid "DHT Store" +msgstr "Écriture DHT" + +msgid "DHT Store Ack" +msgstr "Réponse écriture DHT" + +msgid "DHT Find Node" +msgstr "Recherche de noeud DHT" + +msgid "DHT Found Node" +msgstr "Noeuds DHT trouvés" + +msgid "DHT Find Value" +msgstr "Recherche de valeur DHT" + +msgid "DHT Value" +msgstr "Valeur DHT" + +msgid "G2 Crawl Request" +msgstr "G2 requête de parcours" + +msgid "G2 Hub Advertisement" +msgstr "G2 publicité de hub" + +msgid "G2 Hub List" +msgstr "G2 liste de hubs" + +msgid "G2 Hub List Req" +msgstr "G2 Requête de liste de hubs" + +msgid "G2 Hub List Ack" +msgstr "G2 accusé de réception liste de hubs" + +msgid "G2 Local Node Info" +msgstr "G2 Info noeud local" + +msgid "G2 Ping" +msgstr "G2 Ping" + +msgid "G2 Pong" +msgstr "G2 Pong" + +msgid "G2 Push" +msgstr "G2 Push" + +msgid "G2 Query Key Ack" +msgstr "G2 accusé de réception clef de requête" + +msgid "G2 Query Key Req" +msgstr "G2 demande de clef de requête" + +msgid "G2 Query" +msgstr "G2 requête" + +msgid "G2 Query Ack" +msgstr "G2 accusé de réception de requête" + +msgid "G2 Query Hit" +msgstr "G2 résultat de recherche" + +msgid "G2 Query Hash Table" +msgstr "G2 table de hachage des requêtes" + +msgid "G2 User Profile Check" +msgstr "G2 vérification de profil d'utilisateur" + +msgid "G2 User Profile Data" +msgstr "G2 données de profil d'utilisateur" + +msgid "Total" +msgstr "Total" + +msgid "Bad size" +msgstr "Mauvaise taille" + +msgid "Too small" +msgstr "Trop petit" + +msgid "Too large" +msgstr "Trop grand" + +msgid "Way too large" +msgstr "Beaucoup trop grand" + +msgid "Too old" +msgstr "Trop ancien" + +msgid "Unknown message type" +msgstr "Type de message inconnu" + +msgid "Unexpected message" +msgstr "Message inattendu" + +msgid "Message sent with TTL = 0" +msgstr "Message envoyé avec un TTL = 0" + +msgid "Improper hops/ttl combination" +msgstr "Combinaison inexacte de hops/ttl" + +msgid "Max TTL exceeded" +msgstr "TTL maximum dépassé" + +msgid "Message throttle" +msgstr "Limitation du nombre de messages" + +msgid "Message matched limits" +msgstr "Taille limite de messages atteinte" + +msgid "Transient node" +msgstr "Noeud éphémère" + +msgid "Unusable Pong" +msgstr "Pong inutilisable" + +msgid "Hard TTL limit reached" +msgstr "Limite dure de la valeur TTL atteinte" + +msgid "Max hop count reached" +msgstr "Nombre de relais maximum atteint" + +msgid "Route lost" +msgstr "Route perdue" + +msgid "No route" +msgstr "Pas de route" + +msgid "Duplicate message" +msgstr "Message doublon" + +msgid "OOB Proxy MUID Conflict" +msgstr "Conflit de MUID de Proxy OOB" + +msgid "Message to banned GUID" +msgstr "Message vers un GUID banni" + +msgid "Message from banned GUID" +msgstr "Message depuis un GUID banni" + +msgid "Node shutting down" +msgstr "Noeud en cours d'arrêt" + +msgid "TX flow control" +msgstr "Contrôle de flux TX" + +msgid "Query text had no trailing NUL" +msgstr "Le texte de la demande n'a pas de NUL final" + +msgid "Query text too short" +msgstr "Texte de la demande trop court" + +msgid "Query had unnecessary overhead" +msgstr "La demande avait un surplus inutile" + +msgid "Query had bad URN" +msgstr "La demande avait un mauvais URN" + +msgid "Message with malformed SHA1" +msgstr "Message avec SHA1 mal formé" + +msgid "Message with malformed UTF-8" +msgstr "Message avec UTF-8 mal formé" + +msgid "Malformed Query Hit" +msgstr "Réponse à recherche mal formée" + +msgid "Bad return address" +msgstr "Mauvaise adresse de retour" + +msgid "Hostile IP address" +msgstr "Adresse IP hostile" + +msgid "Shunned IP address" +msgstr "Adresse IP évitée" + +msgid "Bogus result from Morpheus" +msgstr "Mauvais résultat de recherche depuis Morpheus" + +msgid "Spam" +msgstr "Spam" + +msgid "Evil filename" +msgstr "Mauvais nom de fichier" + +msgid "Improper media type" +msgstr "Mauvais type de fichier" + +msgid "Payload inflating error" +msgstr "Erreur d'extraction de la charge utile" + +msgid "Unknown header flags present" +msgstr "Drapeaux d'en-tête inconnus présents" + +msgid "Own search results" +msgstr "Propres résultats de recherche" + +msgid "Own queries" +msgstr "Propres recherches" + +msgid "Ancient query format" +msgstr "Ancien format de recherche" + +msgid "Blank Servent ID" +msgstr "ID servent blanc" + +msgid "GUESS Query missing token" +msgstr "Pas de jeton dans la requête GUESS" + +msgid "GUESS Invalid query token" +msgstr "Mauvais jeton dans la requête GUESS" + +msgid "DHT Invalid security token" +msgstr "Mauvais jeton de sécurité DHT" + +msgid "DHT Too many STORE requests" +msgstr "Trop de requêtes STORE dans la DHT" + +msgid "DHT Malformed message" +msgstr "Message DHT mal formé" + +msgid "G2 Unexpected message" +msgstr "G2 message inattendu" + +msgid "Cannot cross networks" +msgstr "Impossible de traverser les réseaux" msgid "No proxy" msgstr "Pas de proxy" @@ -996,7 +2259,7 @@ msgstr "entrées et sorties" msgid "seeded" -msgstr "pollenisé" +msgstr "pollinisé" msgid "own KUID lookup" msgstr "recherche de mon KUID" @@ -1145,7 +2408,7 @@ msgstr "" "Le port TCP local sur lequel gtk-gnutella écoute. Les fournisseurs d'accès " "bloquent ou limitent souvent le trafic sur le port TCP 6346, il serait " -"intéressant de le changer vers quelque-chose entre 1024-65535. N'oubliez " +"intéressant de le changer vers quelque chose entre 1024-65535. N'oubliez " "pas de mettre à jour votre routage/ouverture du port sur votre pare-feu, si " "nécessaire. Notez que par défaut, le TCP port 6346 n'est pas utilisé pour " "protéger contre la censure anormale." @@ -1179,9 +2442,9 @@ "Si la bande passante rapportée aux autres serveurs doit être calculée à " "partir de la vitesse moyenne d'envoi actuel. La vitesse rapportée correspond " "à la vitesse disponible pour un nouvel envoi, et non à celle théorique " -"maximum configurée : c'est la bande passante moyenne (ou la bande passante " -"configuré si il n'y a pas de trafic actuellement) divisée par le nombre de " -"créneaux d'envoi. Quand il est sur ON (paramètre recommandé), la vitesse de " +"maximum configurée : c'est la bande passante moyenne (ou la bande passante " +"configurée s'il n'y a pas de trafic actuellement) divisée par le nombre de " +"créneaux d'envoi. Quand il est activé (paramètre recommandé), la vitesse de " "connexion physique n'est pas utilisée." msgid "" @@ -1206,11 +2469,11 @@ "n'échoue." msgid "Number of seconds before a push request times out." -msgstr "Nombre de secondes avant qu'une requête 'push' n'échoue." +msgstr "Nombre de secondes avant qu'une requête « push » n'échoue." msgid "Number of seconds before a download times out if no data is received." msgstr "" -"Nombre de secondes avant qu'un téléchargement échoue si il n'y a plus de " +"Nombre de secondes avant qu'un téléchargement échoue s'il n'y a plus de " "données reçues." msgid "Minimum number of seconds to wait on auto-retry timeouts." @@ -1228,7 +2491,7 @@ "indications." msgstr "" "Nombre maximum de tentatives pour télécharger un fichier sans tenir compte " -"des indications 'HTTP busy'." +"des indications « HTTP busy »." msgid "Delay in seconds before retrying after a connection timed out." msgstr "" @@ -1238,15 +2501,15 @@ msgid "" "Delay in seconds before retrying after getting a 'busy' response from a host." msgstr "" -"Délai en secondes avant une nouvelle tentative après une réponse 'occupé' " +"Délai en secondes avant une nouvelle tentative suite à une réponse 'occupé' " "d'un hôte." msgid "" "Delay in seconds before retrying after getting a 'connection refused' " "response from a host." msgstr "" -"Délai en secondes avant une nouvelle tentative après une réponse 'connexion " -"refusée' d'un hôte." +"Délai en secondes avant une nouvelle tentative suite à une réponse " +"'connexion refusée' d'un hôte." msgid "" "Delay in seconds before retrying after a retry stopped (timed out, " @@ -1271,13 +2534,13 @@ "get the whole HTTP request." msgstr "" "Nombre de secondes avant qu'un envoi n'expire si aucune connexion ne peut " -"être établie durant un 'push'. C'est aussi le temps maximum d'attente pour " +"être établie durant un « push ». C'est aussi le temps maximum d'attente pour " "avoir la requête HTTP complète." msgid "" "Number of seconds after which an upload times out if no data is transmitted." msgstr "" -"Nombre de secondes après lesquelles un envoi expire si il n'y a pas de " +"Nombre de secondes après lesquelles un envoi expire s'il n'y a pas de " "données transmises." msgid "" @@ -1297,24 +2560,24 @@ "35 file descriptors. You should ensure you have around 100 file descriptors " "for efficient banning." msgstr "" -"Proportion maximum de descripteurs de fichier réservés pour bannir. Par " +"Proportion maximum de descripteurs de fichiers réservés pour bannir. Par " "exemple, si votre OS vous donne 350 descripteurs de fichiers, un rapport de " "10 va réserver au plus 35 descripteurs de fichier. Vous devriez vous " "assurer que vous avez environ 100 descripteurs de fichier pour bannir " "efficacement." msgid "Maximum number of file descriptors reserved for banning." -msgstr "Nombre maximum de descripteurs de fichier réservé pour bannir." +msgstr "Nombre maximum de descripteurs de fichiers réservés pour bannir." msgid "" "Amount of file descriptors currently used for banning, i.e. which are " "currently kept open for delayed close." msgstr "" -"Quantité de descripteurs de fichier utilisés pour bannir, càd ceux qui sont " +"Quantité de descripteurs de fichiers utilisés pour bannir, càd ceux qui sont " "gardés ouverts pour une fermeture retardée." msgid "Number of file descriptors we'll actually be using for banning." -msgstr "Nombre de descripteurs de fichier que l'on va utiliser pour bannir." +msgstr "Nombre de descripteurs de fichiers que l'on va utiliser pour bannir." msgid "" "Number of seconds an incoming connection has to start sending out its " @@ -1342,7 +2605,7 @@ "percent of the maximum message size." msgstr "" "Taille maximum de la file d'envoi pour les noeuds (en octets). Doit être au " -"moins 150% de la taille maximum d'un message." +"moins 150 % de la taille maximum d'un message." msgid "" "Maximum number of seconds a node can remain in transmit flow control before " @@ -1366,10 +2629,10 @@ "TTL greater than that, it will be trimmed down to that value. On Gnutella, " "the standard is TTL=4, so you cannot set a value lower than that." msgstr "" -"TTL maximum que nous autorisons dans les messages que nous émettons. Si un " -"message arrive avec un TTL plus grand que celui-ci, il sera réduit à cette " -"valeur. Sur Gnutella, le standard est TTL=4, donc vous ne pouvez pas mettre " -"une valeur inférieure à celle-là." +"TTL (Time to Live, durée de vie) maximum que nous autorisons dans les " +"messages que nous émettons. Si un message arrive avec un TTL plus grand que " +"celui-ci, il sera réduit à cette valeur. Sur Gnutella, le standard est " +"TTL=4, donc vous ne pouvez pas mettre une valeur inférieure à celle-là." msgid "" "The TTL we use in messages we generate. The default on Gnutella is TTL=4. " @@ -1378,8 +2641,8 @@ msgstr "" "TTL que nous utilisons dans les messages que nous générons. La valeur par " "défaut sur Gnutella est TTL=4. Si vous la mettez à une valeur trop grande, " -"vous courrez le risque d'être diminué par les autres noeuds gtk-gnutella, ou " -"bien être éjecté par d'autres servents." +"vous courrez le risque que la valeur soit réduite par les autres noeuds gtk-" +"gnutella, ou bien être éjecté par d'autres servents." msgid "" "Maximum hard TTL limit (hops + TTL) on messages we relay. This should be " @@ -1390,14 +2653,14 @@ "parameter." msgstr "" "Limite TTL dure maximum ('hops' + TTL) des messages que nous relayons. " -"Devrait être plus grand que le TTL standard de 4, car c'est aussi appliqué " +"Devrait être plus grande que le TTL standard de 4, car c'est aussi appliqué " "aux messages retournés ('query hits') qui pourraient être reroutés dans la " "cas d'une connexion perdue. Les messages standards émis ont leur TTL limité " "par le TTL maximum que vous avez configuré, et cette limite devrait être " "bien inférieure à la valeur de ce paramètre." msgid "For development use: debug level." -msgstr "Pour l'utilisation en développement : niveau de débogage." +msgstr "Pour l'utilisation en développement : niveau de débogage." msgid "Debug level for banning code." msgstr "Niveau de débogage pour le code de bannissement." @@ -1440,9 +2703,6 @@ msgid "Debug level for code shared between gui and core." msgstr "Niveau de débogage pour le code partagé entre l'interface et le noyau." -msgid "Verbosity of Bitzi related debug messages." -msgstr "Verbosité des messages de débogage liés à Bitzi." - msgid "Verbosity of URL handling related debug messages." msgstr "Verbosité des messages de débogage liés à la manipulation des URL." @@ -1509,10 +2769,10 @@ "d'attente et est toujours autorisé à continuer. Cependant, si un client " "demande à plusieurs reprises des petits blocs, les tailles des blocs " "précédemment demandés et envoyés seront comptés. Si la taille demandée est " -"plus grande que le seuil, alors nous regardons au temps théorique qu'il " -"faudra pour servir, pour savoir si nous pouvons outrepasser la file " -"d'attente. Mettre à 0 pour désactiver cette option d'outrepassage selon la " -"taille et se fier seulement sur l'outrepassage basé sur le temps." +"plus grande que le seuil, alors nous regardons le temps théorique qu'il " +"faudra à l'envoi, pour savoir si nous pouvons outrepasser la file d'attente. " +"Mettre à 0 pour désactiver cette option d'outrepassage selon la taille et se " +"fier seulement sur l'outrepassage basé sur le temps." msgid "" "When an upload is expected to take less than this setting in seconds, PARQ " @@ -1532,17 +2792,17 @@ "soon 10 times, which is a good balance between abuse and legacy client " "support." msgstr "" -"Bannir le client s'il viole l'intervalle \"Réessayer après\" trop souvent. " +"Bannir le client s'il viole l'intervalle « Réessayer après » trop souvent. " "Mettre cette valeur à 0 pour désactiver le bannissement. L'envoi sera retiré " "de la file dans tous les cas. La valeur par défaut est 10, le client est " "banni après 10 tentatives trop fréquentes." -msgid "For development use: track properties." -msgstr "Pour l'utilisation en développement : trace les propriétés." +msgid "Indicates a kernel network buffer shortage." +msgstr "Indique une insuffisance du tampon réseau du kernel." msgid "For development use: don't add new hosts to the host cache." msgstr "" -"Pour l'utilisation en développement : ne pas ajouter de nouveaux hôtes dans " +"Pour l'utilisation en développement : ne pas ajouter de nouveaux hôtes dans " "la liste." msgid "Enable bandwidth limitation for incoming HTTP traffic." @@ -1591,7 +2851,7 @@ "etc...)." msgstr "" "Effacer automatiquement les téléchargements indisponibles (timeout de " -"connexion, route 'push' perdue, etc...)." +"connexion, route « push » perdue, etc...)." msgid "Auto clear finished downloads" msgstr "Effacer automatiquement les téléchargements terminés" @@ -1622,7 +2882,7 @@ "Check this button if you want to use gtk-gnutella on your Local Area " "Network. RFC1918 will be ignored." msgstr "" -"Cochez ce bouton si vous voulez utilisez gtk-gnutella dans votre réseau " +"Cochez ce bouton si vous voulez utiliser gtk-gnutella dans votre réseau " "local. La RFC1918 sera ignorée." msgid "" @@ -1696,7 +2956,7 @@ "Amount of tolerable messages above hard TTL limit per node. See also " "MAX_HIGH_TTL_RADIUS" msgstr "" -"Quantité de messages tolérés au dessus de la limite TTL en dur par noeud. " +"Quantité de messages tolérés au-dessus de la limite TTL en dur par noeud. " "Voir aussi MAX_HIGH_TTL_RADIUS" msgid "" @@ -1739,7 +2999,7 @@ msgid "" "Maximum size of search queries messages we forward to others (in bytes)." msgstr "" -"Taille maximum des messages de requêtes que nous faisons suivre aux autres " +"Taille maximum des messages de requêtes que nous faisons suivre aux autres " "(en octets)." msgid "" @@ -1803,16 +3063,16 @@ "will never send push requests anyway. If you don't let gtk-gnutella send " "pushes, it will not show search results that would require a push." msgstr "" -"Si l'on doit envoyer ou pas des requêtes 'push'. Si vous êtes derrière un " -"pare-feu, gtk-gnutella ne va jamais envoyer de requêtes 'push' de toute " -"façon. Si vous ne laissez pas gtk-gnutella envoyer des 'push', il ne va pas " -"afficher les résultats de recherche qui demandent un 'push'." +"Si l'on doit envoyer ou pas des requêtes « push ». Si vous êtes derrière un " +"pare-feu, gtk-gnutella ne va jamais envoyer de requêtes « push » de toute " +"façon. Si vous ne laissez pas gtk-gnutella envoyer des « push », il ne va " +"pas afficher les résultats de recherche qui demandent un « push »." msgid "" "Minimum amount of dup messages to enable kicking, per node (also see " "min_dup_ratio)." msgstr "" -"Quantité minimum de messages en doubles pour autoriser l'éjection, par noeud " +"Quantité minimum de messages en double pour autoriser l'éjection, par noeud " "(voir aussi min_dup_ratio)." msgid "" @@ -1820,9 +3080,9 @@ "100.00) (also see min_dup_msg) Note: the value is stored between 0 (0.0) " "and 10000 (100.0) in the config file." msgstr "" -"Proportion minimum des doubles pour les messages reçus, par noeud (entre 0.00 " -"et 100.00) (voir aussi min_dup_msg) Note : cette valeur est encodée entre " -"0 (0.0) et 10000 (100.0) dans le fichier de configuration." +"Proportion minimum des doubles pour les messages reçus, par noeud (entre " +"0.00 et 100.00) (voir aussi min_dup_msg) Note : cette valeur est encodée " +"entre 0 (0.0) et 10000 (100.0) dans le fichier de configuration." msgid "" "Only files with the given extensions will be shared. The special --all-- " @@ -1934,9 +3194,9 @@ "for files we are sharing or already have in our mesh." msgstr "" "S'il faut ou non rajouter automatiquement au maillage du téléchargement les " -"données récupérées des 'query hits' qui circulent via notre noeud. Ça examine " -"les nouvelles entrées pour les fichiers que nous partageons ou que nous " -"avons déjà dans notre maillage." +"données récupérées des 'query hits' qui circulent via notre noeud. Ça " +"examine les nouvelles entrées pour les fichiers que nous partageons ou que " +"nous avons déjà dans notre maillage." msgid "" "When enabled, SHA1s must match. Otherwise, name and size will be sufficient." @@ -1979,30 +3239,29 @@ msgid "" "Whether gtk-gnutella is currently rebuilding its library in the background." msgstr "" -"Indique si gtk-gnutella est actuellement en train de reconstruire sa " -"bibliothèque en arrière-plan." +"Indique si gtk-gnutella est en train de reconstruire sa bibliothèque en " +"arrière-plan." msgid "" "Whether gtk-gnutella is currently computing SHA1 of shared files in the " "background." msgstr "" -"Indique si gtk-gnutella est actuellement en train de calculer le SHA1 des " -"fichiers partagés en arrière-plan." +"Indique si gtk-gnutella est en train de calculer le SHA1 des fichiers " +"partagés en arrière-plan." msgid "" "Whether gtk-gnutella is currently verifying SHA1 of downloaded files in the " "background." msgstr "" -"Indique si gtk-gnutella est actuellement en train de vérifier le SHA1 de " -"fichiers téléchargés en arrière-plan." +"Indique si gtk-gnutella est en train de vérifier le SHA1 de fichiers " +"téléchargés en arrière-plan." msgid "" "Whether gtk-gnutella is currently moving files across filesystems or simply " "copying in the background." msgstr "" -"Indique si gtk-gnutella est actuellement en train de déplacer des fichiers " -"entre des systèmes de fichiers ou simplement en train de copier en arrière-" -"plan." +"Indique si gtk-gnutella est en train de déplacer des fichiers entre des " +"systèmes de fichiers ou simplement en train de copier en arrière-plan." msgid "" "If active, only compressed incoming connections are allowed after the " @@ -2053,10 +3312,8 @@ msgid "" "Maximum amount of leaves we can accept. To be promoted Ultra, you should " -"reserve 32 bytes of bandwidth per leaf." +"reserve 32 bytes/sec of bandwidth per leaf." msgstr "" -"Nombre maximum de feuilles que l'on peut recevoir. Pour être élu ultrapeer, " -"vous devriez réserver 32 octets de bande passante par feuille." msgid "What to do with files that will be ignored for downloading." msgstr "Que faire avec les fichiers qui seront ignorés pour le téléchargement." @@ -2085,9 +3342,7 @@ msgstr "Combien de téléchargements sont actuellement dans la file d'attente." msgid "How many downloads are currently running (downloading / connecting)." -msgstr "" -"Combien de téléchargements sont actuellement en cours (téléchargement / " -"connexion)." +msgstr "Combien de téléchargements sont en cours (téléchargement / connexion)." msgid "How many downloads are currently active." msgstr "Combien de téléchargements sont actifs." @@ -2139,9 +3394,9 @@ "Quand le partage de fichier partiel est activé (PFSP), gtk-gnutella va " "essayer de télécharger des blocs dans un ordre aléatoire, pour maximiser la " "distribution du fichier sur le réseau. Cependant, cela rend la vérification " -"(type de fichier, pré-visualisation, etc) impossible. Ce champ définit la " +"(type de fichier, prévisualisation, etc) impossible. Ce champ définit la " "taille en octets du premier bloc de données qui devrait être téléchargé " -"continuellement. Ne le définissez pas trop grand." +"continuellement. Ne choisissez pas une valeur trop élevée." msgid "" "When partial file sharing (PFSP) is enabled, gtk-gnutella will not share " @@ -2230,7 +3485,7 @@ "Le nom d'hôte du serveur qui peut être utilisé par les téléchargeurs pour " "trouver l'adresse IP via une résolution DNS. Si vous avez une adresse IP " "dynamique avec un service DNS dynamique, alors c'est utile pour les " -"téléchargeurs : ils pourront trouver votre noeud même après que vous ayez " +"téléchargeurs : ils pourront trouver votre noeud même après que vous ayez " "changé votre adresse IP." msgid "" @@ -2262,7 +3517,7 @@ "votre bande passante, mettez cette valeur à une petite valeur (défaut à 64K, " "ce qui est raisonnable). Si utiliser toute votre bande passante et augmenter " "votre temps de latence ne vous dérange pas, mettez une valeur plus grande. " -"N'oubliez pas : plus la valeur est petite, plus vous pourrez contrôler " +"N'oubliez pas : plus la valeur est petite, plus vous pourrez contrôler " "précisément la vitesse entrante." msgid "" @@ -2351,15 +3606,15 @@ "connection (for locally generated queries only!). The larger the value, the " "less negative impact it has on the network." msgstr "" -"Nombre de secondes minimum entre deux demandes sur une même connexion (pour " -"les demandes générées localement seulement !). Plus la valeur est grande, " -"moins l'impact sera négatif sur le réseau." +"Nombre de secondes minimum entre deux demandes sur une même connexion " +"(uniquement pour les demandes générées localement !). Plus la valeur est " +"grande, moins l'impact sera négatif sur le réseau." msgid "" "Whether connection to gtk-gnutella via the 'shell' control interface should " "be allowed." msgstr "" -"Si les connections vers gtk-gnutella via un shell de contrôle de l'interface " +"Si les connexions vers gtk-gnutella via un shell de contrôle de l'interface " "sont autorisées." msgid "" @@ -2374,7 +3629,7 @@ "displayed by the GUI along with the termination status." msgstr "" "Nombre de secondes pendant lesquelles les entrées 'mortes' restent, de sorte " -"qu'elles sont toujours visibles par l'interface avec leur état de " +"qu'elles sont toujours visibles sur l'interface avec leur état de " "terminaison." msgid "" @@ -2400,7 +3655,7 @@ "La moitié du temps pendant lequel gtk-gnutella se rappelle des recherches " "relayées par TTL et du nombre de hop. La valeur par défaut 5 est très bien, " "mais vous pouvez expérimenter avec d'autres valeurs. Plus la valeur est " -"grande, plus vous allez ignorer facilement des recherches légitimes, donc " +"grande, plus vous allez ignorer facilement des recherches légitimes, donc " "soyez prudent." msgid "" @@ -2509,7 +3764,7 @@ msgid "If set, spaces in filenames are replaced with underscores." msgstr "" "Si activé, les espaces dans les noms de fichiers seront remplacés avec des " -"soulignés." +"tirets bas." msgid "" "If set, meta shell characters in filenames are replaced with underscores. " @@ -2527,7 +3782,7 @@ "Si activé, gtk-gnutella va, dès le démarrage, assainir les noms de fichiers " "de votre répertoire temporaire en convertissant les espaces et/ou les " "caractères spéciaux, en se basant sur votre configuration. Par défaut, cette " -"modification ne s'applique que pour les nouvelles entrées, pas celles déjà " +"modification ne s'applique que pour les nouvelles entrées, pas à celles déjà " "existantes." msgid "If set, all outgoing connections are tunneled over TLS." @@ -2535,7 +3790,7 @@ "Si activé, toutes les connexions sortantes passeront par un tunnel en TLS." msgid "If not set, support for Gnutella connection compression is disabled." -msgstr "Si pas activé, le support des connexions compressées est désactivé" +msgstr "Si pas activé, le support des connexions compressées est désactivé." msgid "" "Whether UDP shall be used in complement to TCP. When set, gtk-gnutella will " @@ -2582,8 +3837,8 @@ "trafic UDP non sollicité. Vous devez activer ce support en premier. Ceci " "peut causer la réception de grandes quantités de réponses UDP, donc vous " "pouvez choisir de désactiver cette option. Si vous le faites, vos hits vont " -"traverser le réseau gnutella et peuvent être supprimés par un noeud relais en " -"contrôle de flux, limitant les résultats que vous obtiendrez." +"traverser le réseau gnutella et peuvent être supprimés par un noeud relais " +"en contrôle de flux, limitant les résultats que vous obtiendrez." msgid "" "Whether gtk-gnutella should, when running as ultrapeer, act as proxy for " @@ -2596,8 +3851,8 @@ msgstr "" "Si gtk-gnutella doit, en mode ultrapeer, agir comme un proxy pour les " "requêtes des feuilles qui ne demandent pas la livraison OOB des hits de " -"recherche : gtk-gnutella va réclamer les hits des noeuds distants et va faire " -"suivre les hits au bon noeud feuille. C'est très bénéfique pour les " +"recherche : gtk-gnutella va réclamer les hits des noeuds distants et va " +"faire suivre les hits au bon noeud feuille. C'est très bénéfique pour les " "feuilles, mais peut causer d'énormes augmentations du trafic UDP revenant " "vers vous. Si vous désactivez ceci, tous les ultrapeers auxquels vous êtes " "connectés devront relayer les hits, en supprimant peut-être d'autres " @@ -2613,12 +3868,13 @@ msgid "" "If set to TRUE, the global hostiles.txt is used as well as the private " -"$GTK_GNUTELLA_DIR/hostiles.txt. This allows to separate your private ban " +"$GTK_GNUTELLA_DIR/hostiles.txt. This allows you to separate your private ban " "list from the global one distributed with gtk-gnutella." msgstr "" -"Si à VRAI, le fichier global hostiles.txt sera utilisé, comme le privé " -"$GTK_GNUTELLA_DIR/hostiles.txt. Ceci autorise la séparation de votre liste " -"de bannissements privés avec la globale distribuée avec gtk-gnutella." +"Si sélectionné, alors le fichier hostiles.txt global sera utilisé tout comme " +"le fichier privé $GTK_GNUTELLA_DIR/hostiles.txt. Cela vous permet de séparer " +"votre liste de bannissement privée de la liste globale distribuée avec gtk-" +"gnutella." msgid "If set to TRUE, SO_LINGER is used for sockets." msgstr "Si à VRAI, SO_LINGER sera utilisé pour les sockets." @@ -2662,7 +3918,7 @@ "L'utilisation moyenne du CPU indique une surcharge, alors gtk-gnutella " "réduit les traitements non critiques qu'il effectue. Notez que la surcharge " "peut être due à un autre processus qui demande le CPU. Tant que la surcharge " -"persiste, le rafraichissement de l'interface est réduit et les tâches de " +"persiste, le rafraîchissement de l'interface est réduit et les tâches de " "fond (calcul SHA1, déplacement de fichier) sont ralentis." msgid "" @@ -2701,11 +3957,11 @@ msgstr "" "Activez ceci si toutes les unités doivent être affichées en utilisant le " "système métrique avec les préfixes SI. Si désactivé, certaines unités comme " -"par exemple les tailles de fichiers seront affichées en utilisant la " -"convention ancienne base2 avec des préfixes binaires." +"les tailles de fichiers seront affichées en utilisant la convention ancienne " +"base2 avec des préfixes binaires." msgid "Debug level for Reliable UDP (RUDP) code." -msgstr "Niveau de débogage pour le code \"Reliable UDP\" (RUDP)." +msgstr "Niveau de débogage pour le code « Reliable UDP » (RUDP)." msgid "Debug level for the Distributed Hash Table (DHT) code." msgstr "" @@ -2740,7 +3996,7 @@ "names do not expose confidential information. You have to initiate a rescan " "of the shared files before a change becomes fully effective." msgstr "" -"Si positionné, la correspondance des requêtes est aussi testée par rapport " +"Si sélectionné, la correspondance des requêtes est aussi testée par rapport " "aux noms de répertoires qui sont relatifs à ceux qui sont partagés. De plus, " "les résultats de recherches les montreront. C'est particulièrement utile si " "les noms des fichiers partagés sont ambigus ou s'ils ne font pas sens sans " @@ -2775,15 +4031,15 @@ "Whether gtk-gnutella is currently computing TTH of shared files in the " "background." msgstr "" -"Indique si gtk-gnutella est actuellement en train de calculer le TTH des " -"fichiers partagés en arrière-plan." +"Indique si gtk-gnutella est en train de calculer le TTH des fichiers " +"partagés en arrière-plan." msgid "" "Whether gtk-gnutella is currently verifying the TTH of downloaded files in " "the background." msgstr "" -"Indique si gtk-gnutella est actuellement en train de vérifier le TTH de " -"fichiers téléchargés en arrière-plan." +"Indique si gtk-gnutella est en train de vérifier le TTH de fichiers " +"téléchargés en arrière-plan." msgid "Maximum number of results to show in any search." msgstr "Nombre maximum de résultats à afficher pour toute recherche." @@ -2863,7 +4119,7 @@ "Quand le partage de fichier partiel est activé (PFSP), gtk-gnutella va " "essayer de télécharger des blocs dans un ordre aléatoire, pour maximiser la " "distribution du fichier sur le réseau. Cependant, cela rend la vérification " -"(type de fichier, pré-visualisation, etc) impossible. Ce champ définit la " +"(type de fichier, prévisualisation, etc) impossible. Ce champ définit la " "taille en octets du dernier bloc de données qui devrait être téléchargé " "entièrement si possible. Une valeur de 0 désactive cette fonction." @@ -2882,7 +4138,7 @@ "files and push-proxies for firewalled hosts. It requires UDP support." msgstr "" "Activation ou non de la Table de Hachage Distribuée (DHT). La DHT permet la " -"résolution des URI magnet et permet aussi de trouver facilement des sources " +"résolution des URI magnet et permet aussi de trouver facilement des sources " "alternatives pour les fichiers ainsi que les push proxy pour les hôtes qui " "sont derrière un pare-feu. Elle nécessite le support de l'UDP." @@ -2906,7 +4162,7 @@ "concurrently, but the more bandwidth is used." msgstr "" "Indication de bande passante pour les recherches des utilisateurs, en octets/" -"secondes. Utilisée pour limiter à la fois les publications et recherches " +"secondes. Utilisée pour limiter à la fois les publications et les recherches " "concurrentes. Le trafic est effectué sur le socket UDP Gnutella. Les besoins " "de sortie sont inférieurs à ceux en entrée (de 3 à 5 fois). Plus les " "chiffres seront grands, plus le nombre de valeurs qui peuvent être " @@ -2923,9 +4179,9 @@ msgstr "" "Indication de bande passante pour les recherches des utilisateurs, en octets/" "secondes. Utilisée pour limiter à la fois les publications et recherches " -"concurrentes. Le trafic est effectué sur le socket UDP Gnutella et peut donc " -"être vraiment contrôlé. Les besoins en entrée sont largement supérieurs à " -"ceux en sortie tant qu'il est question de recherches (de l'ordre de 3 à 5 " +"concurrentes. Le trafic est effectué sur le socket UDP Gnutella et ne peut " +"donc être vraiment contrôlé. Les besoins en entrée sont largement supérieurs " +"à ceux en sortie tant qu'il est question de recherches (de l'ordre de 3 à 5 " "fois). Plus les chiffres seront grands, plus le nombre de valeurs qui " "peuvent être recherchées simultanément augmentera, mais davantage de bande " "passante sera utilisée." @@ -2955,8 +4211,8 @@ msgid "If TRUE, DHT storage uses memory instead of diskspace." msgstr "" -"Si positionné, le DHT utilisera de la mémoire et non de l'espace disque pour " -"le stockage des informations." +"Si sélectionné, le DHT utilisera de la mémoire et non de l'espace disque " +"pour le stockage des informations." msgid "Defines which download HTTP header exchanges should be traced." msgstr "" @@ -2969,7 +4225,8 @@ msgstr "Définit quels en-têtes Gnutella doivent être tracés." msgid "Defines which push-proxy HTTP header exchanges should be traced." -msgstr "Définit quels en-têtes HTTP doivent être tracés sur les relais 'push'." +msgstr "" +"Définit quels en-têtes HTTP doivent être tracés sur les relais « push »." msgid "" "Defines which HTTP header exchanges should be traced, other than downloads, " @@ -3036,27 +4293,28 @@ msgid "Logged statistics level for code shared between GUI and core." msgstr "" "Niveau de débogage pour le code partagé entre l'interface graphique et le " -"coeur." +"noyau." msgid "" "If TRUE, the spam SHA1 database is kept in memory. If FALSE, it is kept in a " "fast disk database, which saves a large amount of core memory and reduces " "the overall footprint, at the cost of an increased I/O level. However, the " -"DB cache has typically a 90% hit rate, so the actual overhead is barely " +"DB cache has a 90 percent hit rate, so the actual overhead is barely " "noticeable when running as an ultra node and should remain completely " "unnoticed when running as a leaf." msgstr "" -"Si positionné, la base de SHA1 connus pour être du spam est gardée en " +"Si sélectionné, la base de SHA1 connus pour être du spam est gardée en " "mémoire. Sinon, elle est gardée dans une base rapide sur le disque, ce qui " "économise de la mémoire, au prix d'un plus grand nombre d'E/S (entrées/" -"sorties). Cependant, le cache de la base a typiquement une efficacité de 90% " -"et l'incidence est très faible en mode feuille." +"sorties). Cependant, le cache de la base a typiquement une efficacité de 90 " +"pour cent donc la surcharge est à difficile à remarquer en mode ultra et " +"extrêmement faible en mode feuille." msgid "Debug level for spam detection." msgstr "Niveau de débogage pour la détection du spam." msgid "Debug level for lockfile management." -msgstr "Niveau de débogage pour la gestion des fichiers de verouillage." +msgstr "Niveau de débogage pour la gestion des fichiers de verrouillage." msgid "Debug level for the zone-based memory allocator." msgstr "Niveau de débogage pour l'allocateur par zone." @@ -3075,12 +4333,12 @@ "lower. To further minimize the footprint, you can also set " "spam_lut_in_memory to FALSE." msgstr "" -"Si positionné, l'allocateur par zone va toujours fonctionner en mode " -"\"ramasse miettes\", pour minimiser le risque de ne pas pouvoir récupérer " -"les zones allouées lors d'un pic d'allocation. Au prix d'une utilisation " -"plus grande de temps CPU, moins de mémoire sera allouée. Pour minimiser " -"encore plus la mémoire utilisée, positionner aussi la variable " -"spam_lut_in_memory à FALSE" +"Si sélectionné, l'allocateur par zone va toujours fonctionner en mode « " +"ramasse miettes », pour minimiser le risque de ne pas pouvoir récupérer les " +"zones allouées lors d'un pic d'allocation. Au prix d'une utilisation plus " +"grande de temps CPU, moins de mémoire sera allouée. Pour minimiser encore " +"plus la mémoire utilisée, positionner aussi la variable spam_lut_in_memory à " +"FALSE." msgid "Debug level for the virtual memory manager." msgstr "Niveau de débogage pour le gestionnaire de mémoire virtuelle." @@ -3095,7 +4353,7 @@ msgstr "Niveau de débogage pour les préférences par pays." msgid "Whether to log dropped Gnutella messages" -msgstr "Si positionné, trace les messages Gnutella mis au rebut." +msgstr "Si sélectionné, trace les messages Gnutella mis au rebut" msgid "Debug level for whitelist management." msgstr "Niveau de débogage pour la gestion de la liste blanche." @@ -3118,7 +4376,7 @@ "with the Gnutella UDP queue, regardless of whether bandwidth stealing is " "enabled, so that UDP queues can flush more quickly." msgstr "" -"Limites de trafic DHT sortant, en octets/sec. Le trafic est toujours " +"Limite de trafic DHT sortant, en octets/sec. Le trafic est toujours " "fusionné dans la queue UDP de Gnutella, indépendamment de la configuration " "de l'allocation dynamique de la bande passante, pour permettre à la queue " "UDP de se vider rapidement." @@ -3153,7 +4411,7 @@ msgstr "Fréquence maximum en Hz pour la CPU" msgid "DHT bootstrap status." -msgstr "État du démarrage de la DHT" +msgstr "État du démarrage de la DHT." msgid "" "The DHT running mode. An active node will be able to store values and is a " @@ -3166,12 +4424,13 @@ msgstr "" "Le mode de travail de la DHT. Un noeud actif pourra stocker des valeurs et " "devient un participant à plein titre de la DHT (Distributed Hash Table, ou " -"Table de Hash Distribuée en Français). Un noeud passif peut effectuer des " +"Table de Hachage Distribuée en français). Un noeud passif peut effectuer des " "recherches et publier mais net peut pas stocker de valeurs ni devenir un " "membre de la structure de la DHT. Un noeud sans connexion UDP entrante " "possible est nécessairement un noeud passif, mais vous pouvez forcer le mode " "passif dans tous les cas. Cependant, le mode passif n'est pas recommandé car " -"la DHT a besoin de plus de noeuds actifs que de passifs pour être performante." +"la DHT a besoin de plus de noeuds actifs que de passifs pour être " +"performante." msgid "Current DHT running mode." msgstr "Mode de travail actuel de la DHT." @@ -3210,8 +4469,8 @@ "For testing purposes, allow to run as an ultranode even if the node cannot " "accept incoming TCP connections." msgstr "" -"Pour des raisons de test, permet de tourner en mode ultra même si le noeud ne " -"peut pas accepter de connexions TCP entrantes." +"Pour des raisons de test, permet de tourner en mode ultra même si le noeud " +"ne peut pas accepter de connexions TCP entrantes." msgid "" "Whether UPnP (Universal Plug and Play) should be enabled. Support for UPnP " @@ -3400,7 +4659,7 @@ msgstr "" "Suggestion de bande passante à utiliser lors des requêtes GUESS, en octets/" "sec, limitant le niveau de parallélisme de GUESS. Des valeurs faibles " -"conduiront à des requêtes plus lentes à conduire." +"conduiront à des requêtes plus lentes à effectuer." msgid "Debug level for the matching code." msgstr "Niveau de débogage pour le code de recherche." @@ -3425,51 +4684,55 @@ "est bien entendu ignoré et seuls des résultats complets seront retournés." msgid "Whether what's-new? queries should be answered to." -msgstr "Indique si on doit répondre aux requêtes quoi-de-neuf ?" +msgstr "Indique si on doit répondre aux requêtes quoi-de-neuf ?" msgid "" "When set, gtk-gnutella will automatically stop opened searches from which " "all the requested downloads have been completed, regardless of the initially " "configured expiration time." msgstr "" -"Si positionné, gtk-gnutella va automatiquement arrêter les recherches " +"Si sélectionné, gtk-gnutella va automatiquement arrêter les recherches " "ouvertes qui n'ont plus aucun téléchargement en instance, quel que soit le " "mode d'expiration choisi initialement." msgid "Maximum number of results to show in a What's New? request." -msgstr "Nombre maximum de résultats à afficher par recherche quoi-de-neuf ?" +msgstr "Nombre maximum de résultats à afficher par recherche quoi-de-neuf ?" msgid "Maximum number of results to show in a passive search request." msgstr "Nombre maximum de résultats à afficher par recherche passive." msgid "Whether to log duplicate Gnutella messages from same node." msgstr "" -"Si positionné, trace les messages Gnutella émis en double depuis un " -"même noeud." +"Si sélectionné, trace les messages Gnutella émis en double depuis un même " +"noeud." msgid "Whether to log duplicate Gnutella messages with a higher TTL." msgstr "" -"Si positionné, trace les messages Gnutella émis en double avec " -"un TTL plus élevé." +"Si sélectionné, trace les messages Gnutella émis en double avec un TTL plus " +"élevé." msgid "Whether to log duplicate Gnutella messages (not from same node)." -msgstr "Si positionné, trace les messages Gnutella émis en double " -"(depuis un noeud différent)." +msgstr "" +"Si sélectionné, trace les messages Gnutella émis en double (depuis un noeud " +"différent)." msgid "Whether to log new Gnutella messages, never seen before." -msgstr "Si positionné, trace les nouveaux messages Gnutella, jamais vus encore." +msgstr "" +"Si sélectionné, trace les nouveaux messages Gnutella, jamais vus encore." msgid "Whether to log Gnutella routing decisions." -msgstr "Si positionné, trace les décisions de routage pour les " -"messages Gnutella." +msgstr "" +"Si sélectionné, trace les décisions de routage pour les messages Gnutella." msgid "Whether to log bad Gnutella messages, corrupted or unexpected." -msgstr "Si positionné, trace les mauvais messages Gnutella, corrompus ou " -"non attendus." +msgstr "" +"Si sélectionné, trace les mauvais messages Gnutella, corrompus ou non " +"attendus." msgid "Whether to log conditions triggering query hit spam flagging." -msgstr "Si positionné, trace les conditions provoquant le marquage d'un " -"résultat comme spam." +msgstr "" +"Si sélectionné, trace les conditions provoquant le marquage d'un résultat " +"comme spam." msgid "Maximum number of IPv6 hosts in the ultra node cache." msgstr "Nombre maximum d'hôtes IPv6 dans la liste des noeuds ultra." @@ -3481,7 +4744,8 @@ msgstr "Nombre actuel d'hôtes IPv6 dans la liste des noeuds GUESS réguliers." msgid "Current number of IPv6 hosts in the introduction GUESS cache." -msgstr "Nombre actuel d'hôtes IPv6 dans la liste d'introduction de noeuds GUESS." +msgstr "" +"Nombre actuel d'hôtes IPv6 dans la liste d'introduction de noeuds GUESS." msgid "Maximum number of IPv6 hosts in the regular GUESS cache." msgstr "Nombre maximum d'hôtes IPv6 dans la liste des noeuds GUESS réguliers." @@ -3499,86 +4763,218 @@ msgid "Debug level for GUID management." msgstr "Niveau de débogage pour la gestion des GUIDs." -msgid "disable" -msgstr "désactiver" +msgid "Debug level for the TX (transmit) deflating network layer." +msgstr "" +"Niveau de débogage pour la couche de compression réseau TX (transmission)." -msgid "by words" -msgstr "par mots" +msgid "Comma-separated list of TX debugging hosts (IP addresses only)" +msgstr "Liste d'hôtes à déboguer en transmission (adresses IP seulement)" -msgid "by whole query" -msgstr "par requête entière" +msgid "" +"Comma-separated list of hosts for whom we want to dump RX traffic (IP " +"addresses only)" +msgstr "Liste d'hôtes pour sauvegarde du trafic RX (adresses IP seulement)" -msgid "by router" -msgstr "par routeur" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they emit " +"(IP addresses only)" +msgstr "Liste d'hôtes pour sauvegarde du trafic TX (adresses IP seulement)" -msgid "TCP & UDP" -msgstr "TCP & UDP" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they " +"receive (IP addresses only)" +msgstr "" +"Liste d'hôtes pour sauvegarde du trafic TX qu'ils vont recevoir (adresses IP " +"seulement)" -msgid "TCP only" -msgstr "TCP seulement" +msgid "" +"Allow GUESS to use some of the unused Gnutella outgoing bandwidth regardless " +"of the GUESS bandwidth hint. If FALSE, only the configured bandwidth hint " +"will be used. When running as a leaf this should be set to TRUE to make " +"GUESS queries run faster." +msgstr "" +"Permet à GUESS d'utiliser la fraction de bande passante Gnutella non " +"utilisée en sortie, quelle que soit la recommandation de limite GUESS " +"positionnée. Si FAUX, seule la bande passante configurée sera utilisée. " +"Pour les hôtes en mode feuille, devrait être sélectionné pour permettre aux " +"requêtes GUESS d'aller plus vite." -msgid "UDP only" -msgstr "UDP seulement" +msgid "Debug level for the UDP TX scheduler." +msgstr "Niveau de débogage pour l'ordonnanceur UDP TX." -msgid "Ping" -msgstr "Ping" +msgid "" +"Debugging flags for the semi-reliable UDP TX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: transmissions, 16: timeouts." +msgstr "" +"Drapeaux de débogage pour la couche TX UDP semi-fiable : 1 : messages, 2 : " +"fragments, 4 : accusés de réception, 8 : transmissions, 16 : timeouts" -msgid "Pong" -msgstr "Pong" +msgid "Comma-separated list of RX debugging hosts (IP addresses only)" +msgstr "" +"Liste séparée par des virgules des hôtes de débogage RX (seulement les " +"adresses IP)" -msgid "Bye" -msgstr "Adieu" +msgid "" +"Debugging flags for the semi-reliable UDP RX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: receptions, 16: timeouts." +msgstr "" +"Drapeaux de débogage pour la couche RX UDP semi-fiable : 1 : messages, 2 : " +"fragments, 4 : accusés de réception, 8 : transmissions, 16 : timeouts" -msgid "QRP" -msgstr "QRP" +msgid "Whether to log sent semi-reliable UDP messages." +msgstr "Si sélectionné, trace les messages UDP semi-fiables émis" -msgid "HSEP" -msgstr "HSEP" +msgid "Whether to log received semi-reliable UDP messages." +msgstr "Si sélectionné, trace les messages UDP semi-fiables reçus" -msgid "RUDP" -msgstr "RUDP" +msgid "Debug level for the secured OOB query hit claiming." +msgstr "" +"Niveau de débogage pour les réclamations OOB sécurisées de \"query hit\"." -msgid "Vendor spec." -msgstr "Vendeur spécial" +msgid "Whether to log sent vendor messages." +msgstr "Si sélectionné, trace les messages \"vendor\" émis" -msgid "Vendor std." -msgstr "Vendeur standard" +msgid "Whether to log received vendor messages." +msgstr "Si sélectionné, trace les messages \"vendor\" reçus." -msgid "Push" -msgstr "Push" +msgid "Debugging flags for the DHT token cache (developers only)." +msgstr "" +"Drapeaux de débogage pour le cache des jetons DHT (pour les développeurs " +"uniquement)." -msgid "Query" -msgstr "Recherche" +msgid "Whether to log weird DHT message headers when debugging." +msgstr "" +"Si sélectionné, trace les en-têtes de messages DHT étranges lors du débogage." -msgid "Query Hit" -msgstr "Résultat" +msgid "Debug level for the DHT Remote Procedure Call (RPC) code." +msgstr "Niveau de débogage pour le code DHT Remote Procedure Call (RPC)." -msgid "DHT Ping" -msgstr "Ping DHT" +msgid "Whether to log UHC pings we receive." +msgstr "Si sélectionné, trace les pings UHC reçus." -msgid "DHT Pong" -msgstr "Pong DHT" +msgid "Whether to log UHC pings we emit." +msgstr "Si sélectionné, trace les pings UHC émis." -msgid "DHT Store" -msgstr "Écriture DHT" +msgid "Whether the program was properly shutdown." +msgstr "Indique si le logiciel s'était arrêté correctement." -msgid "DHT Store Ack" -msgstr "Réponse écriture DHT" +msgid "Whether the program restarted after a clean shutdown." +msgstr "Indique si le logiciel a redémarré suite à un arrêt correct." -msgid "DHT Find Node" -msgstr "Recherche de noeud DHT" +msgid "Debug level for DHT key management." +msgstr "Niveau de débogage pour la gestion des clefs DHT." -msgid "DHT Found Node" -msgstr "Noeuds DHT trouvés" +msgid "Debug level for DHT value management." +msgstr "Niveau de débogage pour la gestion des valeurs DHT." -msgid "DHT Find Value" -msgstr "Recherche de valeur DHT" +msgid "ID of the current process." +msgstr "ID du processus en cours." -msgid "DHT Value" -msgstr "Valeur DHT" +msgid "Debug level for HTTP range parsing / handling." +msgstr "Niveau de débogage pour l'analyse / gestion des plages HTTP." -msgid "Total" -msgstr "Total" +msgid "" +"Lease time when installing port mappings via UPnP or NAT-PMP, in seconds. A " +"value of 0 requests permanent mappings." +msgstr "" +"Durée en secondes du bail lors de l'installation de la redirection des ports " +"via UPnP ou NAT-PMP. Une valeur de 0 demande une redirection permanente." + +msgid "Whether the program is auto-restarting at the user's request." +msgstr "" +"Indique si le programme redémarre automatiquement à la demande de " +"l'utilisateur." + +msgid "Debug level for time management." +msgstr "Niveau de débogage pour la gestion du temps." + +msgid "Debug level for the tmalloc() thread-magazine object distributor." +msgstr "" +"Niveau de débogage pour tmalloc(), le magazine distributeur d'objets propre " +"à chaque fil d'exécution." + +msgid "Debug level for the event queue thread." +msgstr "" +"Niveau de débogage pour le fil d’exécution gérant la queue des événements." + +msgid "Maximum number of G2 hubs in the hub cache." +msgstr "Nombre maximal de hubs G2 dans le cache de hubs." + +msgid "Current number of IPv4 hosts in the G2 hub caches." +msgstr "Nombre actuel d'hôtes IPv4 dans les caches hub G2." + +msgid "Whether the G2 protocol should be enabled." +msgstr "Si sélectionné, active le réseau G2." + +msgid "Number of G2 nodes currently connected." +msgstr "Nombre de noeuds G2 actuellement connectés." + +msgid "Maximum amount of G2 hubs we should connect to as a leaf." +msgstr "" +"Nombre maximal de hubs G2 auxquels nous devrions nous connecter en tant que " +"feuille." + +msgid "Whether to log bad G2 messages, corrupted or unexpected." +msgstr "" +"Si sélectionné, journalise les messages G2 mauvais c'est-à-dire corrompus ou " +"inattendus." + +msgid "Whether to log dropped G2 messages" +msgstr "Si sélectionné, journalise les messages G2 ignorés" + +msgid "Debug level for the G2 RPC layer." +msgstr "Niveau de débogage pour la couche G2 RPC." + +msgid "Whether to log summary of received query hits" +msgstr "Si sélectionné, journalise un résumé des résultats de requêtes reçus" + +msgid "Whether to log summary of each record in received query hits" +msgstr "" +"Si sélectionné, journalise un résumé de chaque enregistrement dans les " +"résultats de requêtes reçus" + +msgid "Number of G2 browsing requests received in this session." +msgstr "Nombre de requêtes de parcours G2 reçues lors de cette session." + +msgid "Number of G2 browsing requests fully served in this session." +msgstr "" +"Nombre de requêtes de parcours G2 totalement servies lors de cette session." + +msgid "Whether to log G2 messages we're attempting to send" +msgstr "Si les messages G2 que nous essayons d'envoyer seront journalisés" + +msgid "" +"Timestamp at which the current session was started. This stamp remains " +"unchanged when gtk-gnutella restarts after a crash or an explicit restart " +"request." +msgstr "" + +msgid "No TCP listening socket bound to allow incoming connections." +msgstr "" + +msgid "disable" +msgstr "désactiver" + +msgid "by words" +msgstr "par mots" + +msgid "by whole query" +msgstr "par requête entière" + +msgid "by router" +msgstr "par routeur" + +msgid "TCP & UDP" +msgstr "TCP & UDP" + +msgid "TCP only" +msgstr "TCP seulement" + +msgid "UDP only" +msgstr "UDP seulement" + +msgid "Query Hit" +msgstr "Résultat" msgid "Icons" msgstr "Icônes" @@ -3706,7 +5102,7 @@ msgstr "Position du séparateur dans le panneau des informations de fichiers." msgid "Size of the sidebar." -msgstr "Taille de la sidebar." +msgstr "Taille de la barre latérale." msgid "Position of the divider in the Gnet stats pane." msgstr "Position du séparateur dans le panneau des stats Gnet." @@ -3727,7 +5123,7 @@ msgstr "Afficher la barre de recherche." msgid "Display Sidebar." -msgstr "Afficher la Sidebar." +msgstr "Afficher la barre latérale." msgid "Display Menu." msgstr "Afficher le Menu." @@ -3736,13 +5132,13 @@ msgstr "Afficher la barre d'état." msgid "Display upload statistics in sidebar." -msgstr "Afficher les statistiques d'envoi dans la sidebar." +msgstr "Afficher les statistiques d'envoi dans la barre latérale." msgid "Display download statistics in sidebar." -msgstr "Afficher les statistiques de téléchargement dans la sidebar." +msgstr "Afficher les statistiques de téléchargement dans la barre latérale." msgid "Display connection statistics in sidebar." -msgstr "Afficher les statistiques de connexion dans la sidebar." +msgstr "Afficher les statistiques de connexion dans la barre latérale." msgid "Display incoming HTTP traffic bandwidth usage." msgstr "" @@ -3814,7 +5210,8 @@ msgstr "Sauter aux recherches créées en dernier" msgid "Collect statistics about searches that go through this node." -msgstr "Collecter les statistiques sur les recherches qui passent par ce noeud." +msgstr "" +"Collecter les statistiques sur les recherches qui passent par ce noeud." msgid "Interval in which the search stats are updated." msgstr "" @@ -3834,7 +5231,7 @@ msgid "Show a helpful message when the mouse pointer lingers over a widget." msgstr "" -"Afficher un message d'aide quand le pointeur de la souris passe au dessus " +"Afficher un message d'aide quand le pointeur de la souris passe au-dessus " "d'un widget." msgid "" @@ -3962,8 +5359,8 @@ "Whether we should display message counts for duplicate, bad, weird and " "messages bearing an hostile IP address." msgstr "" -"Si nous devons afficher le le nombre de messages en doubles, mauvais, " -"bizarres, et venant d'une adresse IP hostile." +"Si nous devons afficher le nombre de messages en double, mauvais, bizarres, " +"et venant d'une adresse IP hostile." msgid "" "Whether ping/pong roundtrip times (average and last) should be displayed. " @@ -3992,9 +5389,9 @@ "pane." msgstr "" "La quantité de temps en secondes que le GUI met en tampon les résultats de " -"la recherche. Cela prévient une mise à jour trop fréquente qui peu causer " -"des clignotements, mais aussi économiser de la puissances CPU car il faut " -"moins souvent rafraîchir le panel de recherche." +"la recherche. Cela prévient une mise à jour trop fréquente qui peut causer " +"des clignotements, mais permet aussi économiser de la puissances CPU car il " +"faut moins souvent rafraîchir le panel de recherche." msgid "Expanded stati of the nodes in the treemenu." msgstr "Étendre les statuts des noeuds dans l'arborescence de menu." @@ -4020,7 +5417,7 @@ "Show a status icon in the system tray if possible (requires Gtk+ 2.10 or " "newer)." msgstr "" -"Affiche une icône de statut dans la barre système si possible (requiert Gtk+ " +"Affiche une icône d'état dans la barre système si possible (requiert Gtk+ " "2.10 ou plus récent)." msgid "Automatically hide DHT bandwidth display when DHT not enabled." @@ -4081,20 +5478,35 @@ "comme les fichiers ZIP, 7z, tar, bz2, gz, dep, rpm et autres exe." msgid "" -"Discard search results whith an alien IP address, not matching the one from " +"Discard search results with an alien IP address, not matching the one from " "which the results come from." msgstr "" -"Ignore les résultats provenant d'une autre adresse IP que celle indiquée " -"dans le message." +"Écarter les résultats portant une adresse IP étrangère, ne correspondant pas " +"l'adresse qui a envoyé les résultats." msgid "" "Whether session-only searches which happen to have pending downloads should " "be restarted when gtk-gnutella is launched." msgstr "" "Indique si les recherches dont la durée de vie est la session et qui ont des " -"téléchargements en instance doivent être relancés lorsque gtk-gnutella " +"téléchargements en instance doivent être relancées lorsque gtk-gnutella " "démarre." +msgid "Discard search results coming from servents with a banned GUID." +msgstr "Écarter les résultats de recherche venant d'hôtes avec un GUID banni." + +msgid "Whether a summary line with GUESS search stats should be displayed." +msgstr "" +"Indique si une ligne de résumé avec les statistiques de recherche GUESS doit " +"être affichée." + +msgid "" +"Whether the GUESS summary line should show total statistics or ones " +"pertaining to the current search only." +msgstr "" +"Si la ligne de résumé GUESS doit montrer un résumé ou les statistiques pour " +"la recherche en cours." + msgid "Anonymizing proxies" msgstr "Proxys anonymes" @@ -4150,7 +5562,7 @@ msgstr "Aruba" msgid "Åland Islands" -msgstr "Îles d'Åland" +msgstr "Îles d'Aaland" msgid "Azerbaijan" msgstr "Azerbaïdjan" @@ -4182,6 +5594,9 @@ msgid "Benin" msgstr "Bénin" +msgid "Saint Barthelemy" +msgstr "Saint-Barthélemy" + msgid "Bermuda" msgstr "Bermudes" @@ -4191,6 +5606,9 @@ msgid "Bolivia" msgstr "Bolivie" +msgid "Bonaire, Sint Eustatius and Saba" +msgstr "Bonaire, Saint-Eustache et Saba" + msgid "Brazil" msgstr "Brésil" @@ -4200,6 +5618,9 @@ msgid "Bhutan" msgstr "Bhoutan" +msgid "Burma" +msgstr "Birmanie" + msgid "Bouvet Island" msgstr "Île Bouvet" @@ -4260,6 +5681,9 @@ msgid "Cape Verde" msgstr "Cap Vert" +msgid "Curacao" +msgstr "Curaçao" + msgid "Christmas Island" msgstr "Île Christmas" @@ -4725,12 +6149,18 @@ msgid "Suriname" msgstr "Suriname" +msgid "South Sudan" +msgstr "Soudan du Sud" + msgid "Sao Tome and Principe" msgstr "Sao Tomé et Principe" msgid "El Salvador" msgstr "Salvador" +msgid "Sint Maarten" +msgstr "Saint-Martin" + msgid "Syrian Arab Republic" msgstr "République Arabe Syrienne" @@ -4774,7 +6204,7 @@ msgstr "Turquie" msgid "Trinidad and Tobago" -msgstr "Trinidad et Tobago" +msgstr "Trinité-et-Tobago" msgid "Tuvalu" msgstr "Tuvalu" @@ -4810,13 +6240,13 @@ msgstr "Saint-Vincent et les Grenadines" msgid "Venezuela" -msgstr "Vénézuela" +msgstr "Venezuela" msgid "British Virgin Islands" msgstr "Îles Vierges britanniques" msgid "U.S. Virgin Islands" -msgstr "Îles vierges américaines" +msgstr "Îles Vierges américaines" msgid "Viet Nam" msgstr "Viêt Nam" @@ -4870,25 +6300,25 @@ #, c-format msgid "%ud %uh" -msgstr "" +msgstr "%uj %uh" #, c-format msgid "%uh %um" -msgstr "" +msgstr "%uh %um" #, c-format msgid "%um %us" -msgstr "" +msgstr "%um %us" #, c-format msgid "%us" -msgstr "" +msgstr "%us" msgid "locale_get_language|en" msgstr "fr" msgid "unofficial build, accessing files from" -msgstr "Build non officiel avec accès aux fichiers de ce répertoire : " +msgstr "Build non officiel avec accès aux fichiers de ce répertoire :" msgid "URL missing" msgstr "URL manquant" @@ -4922,11 +6352,11 @@ #, c-format msgid "Total horizon size (%u/%u nodes support HSEP):" -msgstr "Taille de l'horizon (%u/%u noeuds supportant HSEP) :" +msgstr "Taille de l'horizon (%u/%u noeuds supportant HSEP) :" #, c-format msgid "Horizon size via HSEP node %s (%s):" -msgstr "Taille d'horizon via le noeud HSEP %s (%s) :" +msgstr "Taille d'horizon via le noeud HSEP %s (%s) :" msgid "Interactive mode turned on." msgstr "Mode interactif activé." @@ -4934,35 +6364,39 @@ msgid "Interactive mode turned off." msgstr "Mode interactif désactivé." +#, c-format +msgid "Unknown operation \"show %s\"" +msgstr "Opération « show %s » inconnue" + +#, c-format +msgid "Unknown operation \"%s\"" +msgstr "Opération « %s » inconnue" + msgid "Cannot determine current working directory" msgstr "Ne peut trouver le répertoire courant" #, c-format msgid "Unknown logfile name \"%s\"" -msgstr "Nom de fichier de log \"%s\" inconnu" +msgstr "Nom de fichier de log « %s » inconnu" msgid "Unable to reopen" msgstr "Impossible de ré-ouvrir" #, c-format msgid "Could not rename logfile as \"%s\": %m" -msgstr "Ne peut pas renommer le fichier de log en \"%s\": %m" - -#, c-format -msgid "Unknown operation \"%s\"" -msgstr "Opération \"%s\" inconnue" +msgstr "Ne peut pas renommer le fichier de log en « %s » : %m" #, c-format -msgid "Unknown operation \"show %s\"" -msgstr "Opération \"show %s\" inconnue" +msgid "Unknown operation \"stats %s\"" +msgstr "Opération « stats %s » inconnue" #, c-format -msgid "Unknown operation \"stats %s\"" -msgstr "Opération \"stats %s\" inconnue" +msgid "Unknown operation \"check %s\"" +msgstr "Opération « check %s » inconnue" #, c-format msgid "Unknown operation \"usage %s\"" -msgstr "Opération \"usage %s\" inconnue" +msgstr "Opération « usage %s » inconnue" msgid "Invalid IP/Port" msgstr "IP/Port invalide" @@ -4987,10 +6421,10 @@ #, c-format msgid "Unknown property \"%s\"" -msgstr "Propriété \"%s\" inconnue" +msgstr "Propriété « %s » inconnue" msgid "Value: " -msgstr "Valeur :" +msgstr "Valeur :" msgid "Value found and displayed" msgstr "Valeur trouvée et affichée" @@ -5001,6 +6435,9 @@ msgid "Good bye" msgstr "Au revoir" +msgid "Invalid command syntax" +msgstr "Syntaxe de commande invalide" + msgid "Query string missing" msgstr "Chaîne de recherche manquante" @@ -5019,6 +6456,9 @@ msgid "Value missing" msgstr "Valeur manquante" +msgid "Property cannot be changed" +msgstr "" + #, c-format msgid "Previous value was %s" msgstr "Valeur précédente: %s" @@ -5034,68 +6474,27 @@ msgstr "séquence d'échappement non terminée" msgid "unterminated double-quoted string" -msgstr "chaîne de guillemets doubles non teminée " +msgstr "chaîne de guillemets doubles non terminée" msgid "unterminated single-quoted string" msgstr "chaîne de guillemets simples non terminée" -msgid "Invalid command syntax" -msgstr "Syntaxe de commande invalide" - msgid "too many arguments in command" msgstr "trop d'arguments dans la commande" +#, c-format +msgid "un-parseable argument #%u in command" +msgstr "arguments #%u non compris dans la commande" + msgid "Malformed command" -msgstr "commande malformée" +msgstr "commande mal formée" #, c-format msgid "Unknown command: \"%s\"" -msgstr "Commande \"%s\" inconnue" +msgstr "Commande « %s » inconnue" msgid "Help: " -msgstr "Aide :" - -msgid "Bitzi|Unknown" -msgstr "Inconnu" - -msgid "Bitzi|Unrated" -msgstr "Non noté" - -msgid "Bitzi|Bitzi lookup failure" -msgstr "Erreur de recherche Bitzi" - -msgid "Bitzi|Filesize mismatch" -msgstr "Erreur de taille de fichier" - -msgid "Bitzi|Dangerous/Misleading" -msgstr "Dangereux/Trompeur" - -msgid "Bitzi|Incomplete/Damaged" -msgstr "Incomplet/Endommagé" - -msgid "Bitzi|Substandard" -msgstr "Inférieur" - -msgid "Bitzi|Overrated" -msgstr "Sur-estimé" - -msgid "Bitzi|Normal" -msgstr "Normal" - -msgid "Bitzi|Underrated" -msgstr "Sous-estimé" - -msgid "Bitzi|Complete" -msgstr "Terminé" - -msgid "Bitzi|Recommended" -msgstr "Recommandé" - -msgid "Bitzi|Best Version" -msgstr "Meilleure Version" - -msgid "No other data" -msgstr "Pas d'autres données" +msgstr "Aide :" msgid "Filename" msgstr "Nom de fichier" @@ -5117,16 +6516,22 @@ #, c-format msgid "leaf hashes: %lu, depth: %u, granularity: %s" -msgstr "feuilles : %lu, profondeur : %u, granularité : %s" +msgstr "feuilles : %lu, profondeur : %u, granularité : %s" msgid "Tigertree" msgstr "Tigertree" -msgid "External metadata" -msgstr "Métadonnées externes" +msgid "Rescheduled for" +msgstr "Reprogrammé pour" + +msgid "Restartable since" +msgstr "Replanifié depuis" -msgid "Bitzi URL" -msgstr "URL Bitzi" +msgid "rescheduled for" +msgstr "replanifié pour" + +msgid "restartable since" +msgstr "replanifié depuis" #, c-format msgid " (slot %u" @@ -5244,7 +6649,7 @@ msgstr "ignorant" msgid "selected next" -msgstr "suivant sélectionné :" +msgstr "suivant sélectionné :" msgid "requesting next" msgstr "suivant en demande" @@ -5255,9 +6660,6 @@ msgid "Awaiting data" msgstr "En attente des données" -msgid "Unknown error" -msgstr "Erreur inconnue" - #, c-format msgid "Retry in %us" msgstr "Nouvel essai dans %us" @@ -5307,13 +6709,13 @@ #, c-format msgid "regex error: %s" -msgstr "erreur d'expression régulière : %s" +msgstr "erreur d'expression régulière : %s" #, c-format msgid "Selected %u of %u download matching \"%s\"." msgid_plural "Selected %u of %u downloads matching \"%s\"." -msgstr0 "%u téléchargement sur %u correspondant à \"%s\"." -msgstr1 "%u téléchargements sur %u correspondant à \"%s\"." +msgstr0 "%u téléchargement sur %u correspondant à « %s »." +msgstr1 "%u téléchargements sur %u correspondant à « %s »." msgid "starts with" msgstr "commence par" @@ -5380,27 +6782,27 @@ #, c-format msgid "If filename begins with \"%s\" %s" -msgstr "Si le nom de fichier commence par \"%s\" %s" +msgstr "Si le nom de fichier commence par « %s » %s" #, c-format msgid "If filename contains the words \"%s\" %s" -msgstr "Si le nom de fichier contient les mots \"%s\" %s" +msgstr "Si le nom de fichier contient les mots « %s » %s" #, c-format msgid "If filename ends with \"%s\" %s" -msgstr "Si le nom de fichier se termine par \"%s\" %s" +msgstr "Si le nom de fichier se termine par « %s » %s" #, c-format msgid "If filename contains the substring \"%s\" %s" -msgstr "Si le nom de fichier contient la sous-chaîne \"%s\" %s" +msgstr "Si le nom de fichier contient la sous-chaîne « %s » %s" #, c-format msgid "If filename matches the regex pattern \"%s\" %s" -msgstr "Si le nom de fichier correspond à l'expression régulière \"%s\" %s" +msgstr "Si le nom de fichier correspond à l'expression régulière « %s » %s" #, c-format msgid "If filename is \"%s\" %s" -msgstr "Si le nom de fichier est \"%s\" %s" +msgstr "Si le nom de fichier est « %s » %s" #, c-format msgid "If IP address matches %s/%u" @@ -5420,7 +6822,7 @@ #, c-format msgid "If urn:sha1 is same as for \"%s\"" -msgstr "Si urn:sha1 est le même que pour \"%s\"" +msgstr "Si urn:sha1 est le même que pour « %s »" msgid "If urn:sha1 is not available" msgstr "Si urn:sha1 n'est pas disponible" @@ -5429,16 +6831,16 @@ msgstr "Toujours" msgid "busy is set" -msgstr "'busy' est activé" +msgstr "« busy » est activé" msgid "busy is not set" -msgstr "'busy' n'est pas activé" +msgstr "« busy » n'est pas activé" msgid "push is set" -msgstr "'push' est activé" +msgstr "« push » est activé" msgid "push is not set" -msgstr "'push' n'est pas activé" +msgstr "« push » n'est pas activé" msgid "stable is set" msgstr "'stable' est activé" @@ -5480,10 +6882,10 @@ #, c-format msgid "%s%s %s jump to \"%s\"" -msgstr "%s%s %s sauter à \"%s\"" +msgstr "%s%s %s sauter à « %s »" msgid "(Negated) " -msgstr "(Nié)" +msgstr "(Invalidé)" msgid "(deactivated)" msgstr "(désactivé)" @@ -5515,632 +6917,6 @@ msgid "RETURN" msgstr "RETOUR" -msgid "Query hit" -msgstr "Résultat de recherche" - -msgid "DHT (truncated)" -msgstr "DHT (tronqué)" - -msgid "Routing errors" -msgstr "Erreurs de routage" - -msgid "Routing table chunks" -msgstr "Nombre de morceaux dans la table de routage" - -msgid "Routing table message capacity" -msgstr "Capacité en messages de la table de routage" - -msgid "Routing table message count" -msgstr "Nombre de messages dans la table de routage" - -msgid "Duplicates with higher TTL" -msgstr "En double avec un TTL plus élevé" - -msgid "SPAM SHA1 database hits" -msgstr "SPAM trouvé dans la base de SHA1" - -msgid "SPAM filename and size hits" -msgstr "SPAM trouvé par nom et taille de fichier" - -msgid "SPAM fake hits" -msgstr "SPAM faux en écriture" - -msgid "SPAM duplicate hits" -msgstr "SPAM résultat dupliqué" - -msgid "SPAM dynamically caught hostile IP addresses" -msgstr "SPAM adresse IP hostile déterminée dynamiquement" - -msgid "SPAM dynamically caught hostile IP held" -msgstr "SPAM nombre d'adresses IP hostiles dynamiques connues" - -msgid "SPAM spotted spamming IP addresses held" -msgstr "SPAM adresses IP identifiées comme retournant du SPAM connues" - -msgid "Searches to local DB" -msgstr "Recherches dans la base locale" - -msgid "Hits on local DB" -msgstr "Correspondances dans la base locale" - -msgid "Hits on local partial files" -msgstr "Résultats depuis un fichier partiel" - -msgid "Hits on \"what's new?\" queries" -msgstr "Résultats sur une recherche \"quoi de neuf ?\"" - -msgid "Query hits received for local queries" -msgstr "Résultats de recherche reçus pour les recherches locales" - -msgid "Query hits received for OOB-proxied queries" -msgstr "Résultats de recherche reçus pour les recherches via proxy OOB" - -msgid "Queries requesting OOB hit delivery" -msgstr "Recherches demandant un hit OOB" - -msgid "Stripped OOB flag on queries" -msgstr "Flag OOB supprimé sur les recherches" - -msgid "Duplicate OOB-proxied queries" -msgstr "Recherches en double via proxy OOB" - -msgid "OOB hits received for OOB-proxied queries" -msgstr "Résultats OOB reçus pour des recherches via proxy OOB" - -msgid "OOB hits bearing alien IP address" -msgstr "Résultats OOB avec une adresse IP étrangère" - -msgid "OOB hits ignored due to identified spamming address" -msgstr "Résultats OOB ignorés pour cause d'adresse retournant du SPAM" - -msgid "Unclaimed locally-generated OOB hits" -msgstr "Résultats OOB locaux non demandés" - -msgid "Partially claimed locally-generated OOB hits" -msgstr "Résultats OOB locaux demandés partiellement" - -msgid "Spurious OOB hit claiming received" -msgstr "Fausse demande de résultats OOB reçue" - -msgid "Unrequested OOB hits received" -msgstr "Résultats OOB reçus mais non demandés" - -msgid "Received query hits for untracked queries" -msgstr "Résultats reçus pour une recherche non traquée" - -msgid "Tracked query MUIDs" -msgstr "MUIDs de recherches traqués" - -msgid "Compacted queries" -msgstr "Demandes compressées" - -msgid "Bytes saved by compacting" -msgstr "Octets sauvés en compressant" - -msgid "UTF8 queries" -msgstr "Demandes UTF8" - -msgid "SHA1 queries" -msgstr "Demandes SHA1" - -msgid "\"What's New?\" queries" -msgstr "Demandes de type \"quoi de neuf ?\"" - -msgid "GUESS queries" -msgstr "GUESS nombre de requêtes" - -msgid "GUESS queries (0.2)" -msgstr "GUESS nombre de requêtes (0.2)" - -msgid "GUESS cached query keys held" -msgstr "GUESS nombre de clés de requêtes connues" - -msgid "GUESS cached 0.2 hosts held" -msgstr "GUESS nombre de clés de requêtes connues" - -msgid "GUESS locally generated queries" -msgstr "GUESS demandes locales générées" - -msgid "GUESS currently running queries" -msgstr "GUESS nombre de requêtes actives" - -msgid "GUESS hits received for locally generated queries" -msgstr "GUESS résultats reçus pour les recherches locales" - -msgid "GUESS hosts queried" -msgstr "GUESS nombre d'hôtes contactés" - -msgid "GUESS hosts sending back an acknowledgment" -msgstr "GUESS nombre d'hôtes accusant réception" - -msgid "Broadcasted push messages" -msgstr "Messages push annoncés sur le réseau" - -msgid "Push-proxy UDP relayed messages" -msgstr "Messages Push-proxy relayés via UDP" - -msgid "Push-proxy TCP relayed messages" -msgstr "Messages Push-proxy relayés via TCP" - -msgid "Push-proxy broadcasted messages" -msgstr "Messages Push-proxy annoncés sur le réseau" - -msgid "Push-proxy found un-proxied local route" -msgstr "Messages Push-proxy relayés par une route locale" - -msgid "Push-proxy lookup failures" -msgstr "Échecs de consultation Push-proxy" - -msgid "Push relayed via local route" -msgstr "Message Push relayés via une route locale" - -msgid "Push relayed via routing table" -msgstr "Message Push relayés via la table de routage" - -msgid "Locally generated dynamic queries" -msgstr "Demandes locales dynamiques générées" - -msgid "Leaf-generated dynamic queries" -msgstr "Demandes dynamiques générées par feuille" - -msgid "OOB-proxied leaf queries" -msgstr "Demandes de feuilles via proxy OOB" - -msgid "Fully completed dynamic queries" -msgstr "Demandes dynamiques entièrement terminées" - -msgid "Partially completed dynamic queries" -msgstr "Demande dynamiques partiellement terminées" - -msgid "Dynamic queries ended with no results" -msgstr "Demandes dynamiques terminées sans résultat" - -msgid "Fully completed dynamic queries getting late results" -msgstr "Demandes dynamiques entièrement terminées avec résultats différés" - -msgid "Dynamic queries with partial late results" -msgstr "Demandes dynamiques terminées partiellement avec résultats différés" - -msgid "Dynamic queries completed by late results" -msgstr "Demandes dynamiques terminées avec résultats différés" - -msgid "Queries seen from GTKG" -msgstr "Demandes vues par GTKG" - -msgid "Queries seen from GTKG that were re-queries" -msgstr "Demandes vues par GTKG qui étaient des re-demandes" - -msgid "Queries advertising support of GGEP \"H\"" -msgstr "Demandes avec support de GGEP \"H\"" - -msgid "GIV callbacks received" -msgstr "Rappel de GIV reçus" - -msgid "GIV discarded due to no suitable download" -msgstr "GIV ignorés pour cause d'absence de téléchargement adéquat" - -msgid "QUEUE callbacks received" -msgstr "Rappel de QUEUE reçus" - -msgid "QUEUE discarded due to no suitable download" -msgstr "QUEUE ignorés pour cause d'absence de téléchargement adéquat" - -msgid "UDP messages with bogus source IP" -msgstr "Messages UDP avec source IP invalide" - -msgid "Alien UDP messages (non-Gnutella)" -msgstr "Messages UDP aliens (non-Gnutella)" - -msgid "Unprocessed UDP Gnutella messages" -msgstr "Messages UDP Gnutella non traités" - -msgid "Compressed UDP messages enqueued" -msgstr "Messages UDP compressés en file d'attente" - -msgid "Compressed UDP messages received" -msgstr "Messages UDP compressés reçus" - -msgid "Uncompressed UDP messages due to no gain" -msgstr "Messages UDP non compressés car pas de gain" - -msgid "Consolidated servers (after GUID and IP address linking)" -msgstr "Serveurs consolidés (après liaison de l'adresse IP et du GUID)" - -msgid "Duplicate downloads found during server consolidation" -msgstr "Téléchargements en double trouvés après consolidation des serveurs" - -msgid "Discovered server GUIDs" -msgstr "GUIDs de serveurs trouvés" - -msgid "Changed server GUIDs" -msgstr "GUIDs de serveurs changés" - -msgid "Detected GUID collisions" -msgstr "Collisions de GUID" - -msgid "Detected collisions with our own GUID" -msgstr "Collisions avec notre propre GUID" - -msgid "GUID dynamically banned" -msgstr "GUID bannis dynamiquement" - -msgid "Firewalled node info for known hosts received in upload requests" -msgstr "" -"Information de Push-proxy pour des noeuds connus reçues dans des demandes de " -"téléchargement." - -msgid "Revitalized PUSH routes" -msgstr "Routes de PUSH ravivées." - -msgid "Collected new PUSH proxies from other query hits" -msgstr "Information de proxy pour PUSH collectés dans des résultats." - -msgid "Attempted download resource switching on completion" -msgstr "Essai de basculement de ressource téléchargée sur complétion" - -msgid "Attempted download resource switching after error" -msgstr "Essai de basculement de ressource téléchargée sur erreur" - -msgid "Successful download resource switching (all kind)" -msgstr "Succès de basculement de ressource téléchargée (tous types)" - -msgid "Successful download resource switching between plain files" -msgstr "Succès de basculement de ressource téléchargée entre fichiers" - -msgid "Successful download resource switching after error" -msgstr "Succès de basculement de ressource téléchargée après une erreur" - -msgid "Actively queued after resource switching attempt" -msgstr "" -"Tentatives de basculement de ressource téléchargée dans la queue active" - -msgid "Sunk HTTP reply data on error codes" -msgstr "Données HTTP mises à la poubelle sur code d'erreur" - -msgid "Ignored downloaded data" -msgstr "Données téléchargées ignorées" - -msgid "Ignoring requested after data mismatch" -msgstr "Données ignorées après une mésentente." - -msgid "Ignoring requested to preserve connection" -msgstr "Mises à la poubelle pour garder la connexion" - -msgid "Ignoring requested due to aggressive swarming" -msgstr "Mises à la poubelle dues au butinage agressif" - -msgid "Ignoring refused (data too large or server too slow)" -msgstr "" -"Mises à la poubelle refusées (volume de données trop grand ou serveur trop " -"lent)" - -msgid "Client resource switching (all detected)" -msgstr "Basculement de ressources demandées par les clients (détectées)" - -msgid "Client resource switching between plain files" -msgstr "Basculement de ressources demandées par les clients pour les fichiers" - -msgid "Client follow-up request after HTTP error was returned" -msgstr "Basculement de ressources demandées par les clients après erreur HTTP" - -msgid "PARQ client resource switching in slots (SHA-1 based)" -msgstr "" -"PARQ basculement de ressources dans les emplacements (basé sur le SHA-1)" - -msgid "PARQ client retry-after violation" -msgstr "PARQ violation du délai de reprise (retry-after)" - -msgid "PARQ client kicked out after too many retry-after violations" -msgstr "" -"PARQ client refoulé après de trop nombreuses violations du délai de reprise" - -msgid "PARQ upload slot limit overrides" -msgstr "" -"PARQ passe-droit accordé sur le nombre d'emplacements de téléchargements" - -msgid "PARQ quick upload slots granted" -msgstr "PARQ emplacements de téléchargement rapide accordés" - -msgid "PARQ QUEUE sending attempts" -msgstr "PARQ tentatives d'envoi de QUEUE" - -msgid "PARQ QUEUE messages sent" -msgstr "PARQ messages QUEUE reçus" - -msgid "PARQ QUEUE follow-up requests received" -msgstr "PARQ requêtes reçues après envoi de QUEUE" - -msgid "Launched SHA-1 file verifications" -msgstr "Vérifications de SHA-1 lancées" - -msgid "Launched TTH file verifications" -msgstr "Vérifications de TTH lancées" - -msgid "Bitzi tickets held" -msgstr "Nombre de tickets Bitzi connus" - -msgid "Re-seeding of orphan downloads through query hits" -msgstr "Reprises de téléchargements orphelins sur réception de réponse" - -msgid "Re-seeding of orphan downloads through upload requests" -msgstr "Reprises de téléchargements orphelins sur requête de téléchargement" - -msgid "DHT estimated amount of nodes" -msgstr "DHT estimation du nombre de noeuds" - -msgid "DHT k-ball theoretical frontier (bits)" -msgstr "DHT frontière théorique de la boule-k (en bits)" - -msgid "DHT k-ball furthest frontier (bits)" -msgstr "DHT frontière éloignée de la boule-k (en bits)" - -msgid "DHT k-ball closeest frontier (bits)" -msgstr "DHT frontière proche de la boule-k (en bits)" - -msgid "DHT routing table buckets" -msgstr "DHT nombre d'emplacements de routage" - -msgid "DHT routing table leaves" -msgstr "DHT nombre de feuilles dans la table de routage" - -msgid "DHT routing table maximum depth" -msgstr "DHT profondeur maximum de la table de routage" - -msgid "DHT routing table good nodes" -msgstr "DHT nombre de bons noeuds dans la table de routage" - -msgid "DHT routing table stale nodes" -msgstr "DHT nombre de noeuds pourris dans la table de routage" - -msgid "DHT routing table pending nodes" -msgstr "DHT nombre de noeuds en attente dans la table de routage" - -msgid "DHT routing table evicted nodes" -msgstr "DHT nombre de noeuds évincés de la table de routage" - -msgid "DHT routing table evicted firewalled nodes" -msgstr "DHT nombre de noeuds évincés car sans connexion entrante" - -msgid "DHT routing table evicted nodes due to quota" -msgstr "DHT nombre de noeuds évincés sur quota de présence" - -msgid "DHT routing table promoted pending nodes" -msgstr "DHT nombre de noeuds en attente promus" - -msgid "DHT routing table pinged promoted nodes" -msgstr "DHT nombre de pings envoyés sur promotion de noeuds" - -msgid "DHT routing table rejected node due to bucket network quota" -msgstr "DHT nombre de noeuds rejetés pour cause de quota réseau (emplacement)" - -msgid "DHT routing table rejected node due to global network quota" -msgstr "DHT nombre de noeuds rejetés pour cause de quota réseau (global)" - -msgid "DHT completed bucket refreshes" -msgstr "DHT nombre de rafraîchissements d'emplacements effectués correctement" - -msgid "DHT forced bucket refreshes" -msgstr "DHT nombre de rafraîchissements d'emplacements forcés" - -msgid "DHT forced bucket merges" -msgstr "DHT nombre de fusions d'emplacements forcées" - -msgid "DHT denied non-splitable bucket refresh" -msgstr "DHT refus de rafraîchissement d'emplacements non partageables" - -msgid "DHT initiated bucket alive checks" -msgstr "DHT nombre de tests de vie lancés sur les emplacements de routage" - -msgid "DHT alive pings sent to good nodes" -msgstr "DHT nombre de pings envoyés à de bons noeuds" - -msgid "DHT alive pings sent to stale nodes" -msgstr "DHT nombre de pings envoyés à des noeuds pourris" - -msgid "DHT alive pings sent to shutdowning nodes" -msgstr "DHT nombre de pings envoyés à des noeuds en cours d'arrêt" - -msgid "DHT alive pings avoided" -msgstr "DHT pings de vie non envoyés" - -msgid "DHT alive pings skipped" -msgstr "DHT pings de vie évités" - -msgid "DHT revitalized stale nodes on RPC reply" -msgstr "DHT noeuds pourris ravivés sur réponse de RPC" - -msgid "DHT value store rejected on IP/network quota grounds" -msgstr "DHT stockage de valeur refusé sur la base de quota d'IP/réseau" - -msgid "DHT value store rejected on creator validation grounds" -msgstr "DHT stockage de valeur refusé sur créateur non validé" - -msgid "DHT nodes rejected during lookup based on network quota" -msgstr "DHT noeuds rejetés lors de recherches pour cause de quota réseau" - -msgid "DHT nodes rejected during lookup based on suspicious proximity" -msgstr "DHT noeuds rejetés lors de recherches pour cause de proximité suspecte" - -msgid "DHT nodes rejected during lookup based on frequency divergence" -msgstr "DHT noeuds rejetés lors de recherches sur divergence de fréquence" - -msgid "DHT keys held" -msgstr "DHT nombre de clés contenues" - -msgid "DHT cached keys held" -msgstr "DHT nombre de clés cachées contenues" - -msgid "DHT values held" -msgstr "DHT nombre de valeurs stockées" - -msgid "DHT cached KUID targets held" -msgstr "DHT nombre d'identifiants KUIDs connus" - -msgid "DHT cached closest root nodes" -msgstr "DHT nombre de plus proches noeuds racines cachés" - -msgid "DHT cached roots exact hits" -msgstr "DHT noeuds racines trouvés dans le cache" - -msgid "DHT cached roots approximate hits" -msgstr "DHT noeuds cachés fournissant des racines approximatives" - -msgid "DHT cached roots misses" -msgstr "DHT racines non trouvées dans le cache" - -msgid "DHT cached roots lookups within k-ball" -msgstr "DHT recherches de racines dans le cache à l'intérieur de la boule-k" - -msgid "DHT cached roots contact address refreshed" -msgstr "DHT rafraîchissements des adresses de noeuds racines cachés" - -msgid "DHT cached security tokens held" -msgstr "DHT jetons de sécurité caches" - -msgid "DHT cached security tokens hits" -msgstr "DHT jetons de sécurité trouvés dans le cache" - -msgid "DHT stable node information held" -msgstr "DHT nombre de noeuds stables connus" - -msgid "DHT local hits on value lookups" -msgstr "DHT résultats locaux sur recherche de valeur" - -msgid "DHT local hits returning values from cached keys" -msgstr "DHT résultats locaux sur recherche de valeur provenant de clés cachées" - -msgid "DHT returned expanded values" -msgstr "DHT résultats retournés avec des valeurs expansées" - -msgid "DHT returned values as secondary keys" -msgstr "DHT résultats retournés avec des clés secondaires" - -msgid "DHT claimed values via secondary keys" -msgstr "DHT résultats demandés via des clés secondaires" - -msgid "DHT returned cached expanded values" -msgstr "DHT résultats cachés retournés avec des valeurs expansées" - -msgid "DHT returned cached values as secondary-keys" -msgstr "DHT résultats cachés retournés avec des clés secondaires" - -msgid "DHT claimed cached values via secondary keys" -msgstr "DHT résultats cachés demandés via des clés secondaires" - -msgid "DHT successfully received value publications" -msgstr "DHT publications reçues correctement" - -msgid "DHT successfully received value removals" -msgstr "DHT effacements reçus correctement" - -msgid "DHT replication of stale value avoided" -msgstr "DHT évitement de publication de valeur pourrie" - -msgid "DHT replication of held values" -msgstr "DHT réplication de valeurs stockées" - -msgid "DHT republishing of held values" -msgstr "DHT republication de valeurs stockées" - -msgid "DHT secondary-key value fetch issued" -msgstr "DHT demandes de valeurs par clé secondaire" - -msgid "DHT duplicate values returned in lookups" -msgstr "DHT valeurs dupliquées retournées dans les résultats" - -msgid "DHT detected KUID collisions" -msgstr "DHT collisions sur les KUIDs" - -msgid "DHT detected collisions with our own KUID" -msgstr "DHT collisions avec notre propre KUID" - -msgid "DHT detected KUID mismatches on RPC reply" -msgstr "DHT réponses RPCs reçues avec un KUID différent" - -msgid "DHT caching attempts" -msgstr "DHT tentatives de cache de valeurs" - -msgid "DHT caching ended successfully" -msgstr "DHT cache de valeurs réalisé avec succès" - -msgid "DHT caching partially completed" -msgstr "DHT cache de valeurs réalisé partiellement" - -msgid "DHT key-offloading checks after discovering new closest node" -msgstr "" -"DHT tests de déchargement de clé après découverte d'un noeud plus proche" - -msgid "DHT keys selected for offloading" -msgstr "DHT clés sélectionnées pour déchargement" - -msgid "DHT key-offloading attempts" -msgstr "DHT tentatives de déchargement de clés" - -msgid "DHT key-offloading ended successfully" -msgstr "DHT déchargements de clés réalisés avec succès" - -msgid "DHT key-offloading partially completed" -msgstr "DHT déchargements de clés réalisés partiellement" - -msgid "DHT values successfully offloaded" -msgstr "DHT déchargements de valeurs réalisés" - -msgid "DHT publishing attempts" -msgstr "DHT tentatives de publications envoyées" - -msgid "DHT publishing ended successfully (all roots)" -msgstr "DHT publications réussie complètement (sur toutes les racines)" - -msgid "DHT publishing partially completed (root subset only)" -msgstr "DHT publications réussies partiellement (sous-ensemble de racines)" - -msgid "DHT publishing ending with proper value presence" -msgstr "DHT publications terminés avec une présence de la valeur correcte" - -msgid "DHT value republishing occurring too late (after expiry)" -msgstr "DHT publications commencées trop tard (après expiration)" - -msgid "DHT publishing to self" -msgstr "DHT publications vers moi-même" - -msgid "DHT background publishing completion attempts" -msgstr "DHT tentatives de publication en tâche de fond" - -msgid "DHT background publishing completion showing improvements" -msgstr "DHT améliorations après publication en tâche de fond" - -msgid "DHT background publishing completion successful (all roots)" -msgstr "" -"DHT publications en tâche de fond réussies complètement (sur toutes les " -"racines)" - -msgid "DHT SHA1 data type collisions" -msgstr "DHT collisions de SHA1 sur types de données différents" - -msgid "DHT lookup path passively protected against attack" -msgstr "DHT chemin de recherche protégé passivement contre les attaques" - -msgid "DHT lookup path actively protected against attack" -msgstr "DHT chemin de recherche protégé activement contre les attaques" - -msgid "DHT alt-loc lookups issued" -msgstr "DHT recherches d'autres sources" - -msgid "DHT push-proxy lookups issued" -msgstr "DHT recherches de push-proxy" - -msgid "DHT successful alt-loc lookups" -msgstr "DHT recherches d'autres sources terminées avec succès" - -msgid "DHT successful push-proxy lookups" -msgstr "DHT recherches de push-proxy terminées avec succès" - -msgid "DHT successful node push-entry lookups" -msgstr "DHT recherches de noeuds push-proxy terminées avec succès" - -msgid "DHT re-seeding of orphan downloads" -msgstr "DHT reprises de téléchargements orphelins" - msgid "node" msgid_plural "nodes" msgstr0 "noeud" @@ -6174,7 +6950,7 @@ msgstr " HTML et " msgid " Kill selected " -msgstr " Tuer les sélectionnés " +msgstr " Arrêter le sélectionné " msgid " alive with " msgstr " en vie avec " @@ -6192,7 +6968,7 @@ msgstr " avec sources" msgid "$Id$" -msgstr "" +msgstr "$Id$" msgid "%v/%u (%P%%)" msgstr "%v/%u (%P%%)" @@ -6207,7 +6983,7 @@ msgstr "%v/%u envois" msgid "(Disable: 0, Random: 1)" -msgstr "(Désactiver : 0, Aléatoire : 1)" +msgstr "(Désactiver : 0, Aléatoire : 1)" msgid "(no search)" msgstr "(pas de recherche)" @@ -6235,7 +7011,7 @@ "utilisé (utilisé comme cible dans une règle)." msgid "A passive search matches any search results routed through this node" -msgstr "Une recherche passive prends les résultats qui sont routés par ce noeud" +msgstr "Une recherche passive prend les résultats qui sont routés par ce noeud" msgid "A_ggressive mode" msgstr "Mode a_gressif" @@ -6291,7 +7067,7 @@ msgstr "Quantité d'octets à recouvrir lors de la reprise de téléchargement" msgid "Amount of tolerable messages above hard TTL limit per node" -msgstr "Nombre de messages tolérés au dessus de la limite TTL dure par noeud" +msgstr "Nombre de messages tolérés au-dessus de la limite TTL dure par noeud" msgid "" "Apply above conversions, upon startup, to existing files in the downloading " @@ -6322,16 +7098,16 @@ msgstr "Bande passante disponible" msgid "Available physical memory:" -msgstr "Mémoire physique disponible :" +msgstr "Mémoire physique disponible :" msgid "Avg. time between IP address changes:" -msgstr "Temps moyen entre les changements d'adresse IP :" +msgstr "Temps moyen entre les changements d'adresse IP :" msgid "Avg. uptime of this servent:" -msgstr "Uptime moyen de ce servent :" +msgstr "Uptime moyen de ce servent :" msgid "Avg. downtime of this servent:" -msgstr "Downtime moyen de ce servent :" +msgstr "Downtime moyen de ce servent :" msgid "Bad hosts" msgstr "Mauvais hôtes" @@ -6360,12 +7136,6 @@ msgid "Bind to this address" msgstr "Associer cette adresse" -msgid "Bitzi Metadata" -msgstr "Métadonnées Bitzi" - -msgid "Bitzi metadata" -msgstr "Métadonnées Bitzi" - msgid "Browse Host" msgstr "Parcourir l'hôte" @@ -6388,7 +7158,7 @@ msgstr "Tris sensible à la casse" msgid "Chunks/Files:" -msgstr "Blocs/fichiers :" +msgstr "Blocs/fichiers :" msgid "Cl_ose search" msgstr "_Ferme la recherche" @@ -6422,7 +7192,7 @@ msgstr "Cliquez pour alterner l'affichage." msgid "Clock skew:" -msgstr "Décalage de l'heure :" +msgstr "Décalage de l'heure :" msgid "Clock synchronization" msgstr "Synchronisation de l'horloge" @@ -6434,32 +7204,32 @@ msgstr "Tout regrouper" msgid "Compressed length:" -msgstr "Longueur compressée :" +msgstr "Longueur compressée :" msgid "Compression ratio:" -msgstr "Taux de compression :" +msgstr "Taux de compression :" msgid "Condition: If IP address matches" -msgstr "Condition : Si l'adresse IP correspond" +msgstr "Condition : Si l'adresse IP correspond" msgid "Condition: If current filter result properties match" msgstr "" -"Condition : Si les propriétés du résultat du filtre actuel correspondent" +"Condition : Si les propriétés du résultat du filtre actuel correspondent" msgid "Condition: If file size matches" -msgstr "Condition : Si la taille du fichier correspond" +msgstr "Condition : Si la taille du fichier correspond" msgid "Condition: If filename matches" -msgstr "Condition : Si le nom de fichier correspond" +msgstr "Condition : Si le nom de fichier correspond" msgid "Condition: If result has flags" -msgstr "Condition : Si le résultat a des drapeaux" +msgstr "Condition : Si le résultat a des drapeaux" msgid "Condition: If urn:sha1 matches" -msgstr "Condition : Si urn:sha1 correspond" +msgstr "Condition : Si urn:sha1 correspond" msgid "Condition: always" -msgstr "Condition : toujours" +msgstr "Condition : toujours" msgid "Configure columns" msgstr "Configurer les colonnes" @@ -6468,7 +7238,7 @@ msgstr "Peermode configuré" msgid "Conflict ratio:" -msgstr "Proportion de conflits :" +msgstr "Proportion de conflits :" msgid "Connect to host" msgstr "Se connecter à l'hôte" @@ -6492,7 +7262,7 @@ msgstr "Connexions réservées pour les noeuds gtk-gnutella" msgid "Contributors:" -msgstr "Contributeurs :" +msgstr "Contributeurs :" msgid "" "Convert \"evil\" characters (like shell meta characters) to underscores in " @@ -6520,7 +7290,7 @@ msgstr "Copier la règle" msgid "Core development:" -msgstr "Développement du noyau :" +msgstr "Développement du noyau :" msgid "Count" msgstr "Nombre" @@ -6538,7 +7308,7 @@ msgstr "Paramètres IP actuels (Adresse:Port) :" msgid "Current search:" -msgstr "Recherche actuelle :" +msgstr "Recherche actuelle :" msgid "Currently used" msgstr "Utilisé actuellement" @@ -6556,7 +7326,7 @@ msgstr "Timeout pour la _réémission de la recherche par défaut" msgid "Default value:" -msgstr "Valeur par défaut :" +msgstr "Valeur par défaut :" msgid "Delay in seconds to wait after HTTP busy indication" msgstr "Délai en secondes à attendre après l'indication HTTP busy" @@ -6604,13 +7374,13 @@ msgstr "Diverses propriétés" msgid "Do you really want to quit?" -msgstr "Voulez-vous vraiment quitter ?" +msgstr "Voulez-vous vraiment quitter ?" msgid "Download" msgstr "Téléchargement" msgid "Downloaded:" -msgstr "Téléchargé :" +msgstr "Téléchargé :" msgid "Downloading from multiple sources (swarming)" msgstr "Télécharger de plusieurs sources (swarming)" @@ -6628,10 +7398,10 @@ msgstr "M_ontrer les chemins relatifs" msgid "Edit value:" -msgstr "Éditez la valeur :" +msgstr "Éditez la valeur :" msgid "Enable \"_Browse Host\" feature" -msgstr "Activer le \"_Parcours de l'hôte\"" +msgstr "Activer le « _Parcours de l'hôte »" msgid "Enable _DHT" msgstr "Activer la _DHT" @@ -6643,7 +7413,7 @@ msgstr "Activer l'_allocation dynamique des créneaux d'envoi" msgid "Enable remote _shell control interface" -msgstr "Activer le contrôle de l'interface via un \"_shell\" distant" +msgstr "Activer le contrôle de l'interface via un « _shell » distant" msgid "Enable s_warming" msgstr "Activer le s_warming (butinage)" @@ -6672,7 +7442,7 @@ "192.168.1.0/255.255.255.0)" msgstr "" "Entrer une liste séparée par ';' de réseaux qui sont locaux pour vous, de la " -"forme ip/bits ou ip/masque (ex : 192.168.1.0/24 ou 192.168.1.0/255.255.255.0)" +"forme ip/bits ou ip/masque (ex : 192.168.1.0/24 ou 192.168.1.0/255.255.255.0)" msgid "Expand all" msgstr "Tout développer" @@ -6690,7 +7460,7 @@ msgstr "FC/_hops" msgid "File scanning time:" -msgstr "Temps de balayage des fichiers :" +msgstr "Temps de balayage des fichiers :" msgid "File transfers" msgstr "Transferts de fichiers" @@ -6699,10 +7469,10 @@ msgstr "Fichiers balayés" msgid "Filled ratio:" -msgstr "Proportion de remplissage :" +msgstr "Proportion de remplissage :" msgid "Filled slots:" -msgstr "Créneaux remplis :" +msgstr "Créneaux remplis :" msgid "Filter files by regex" msgstr "Filtrer les fichiers par expression régulière" @@ -6742,13 +7512,13 @@ msgstr "Servi entièrement " msgid "GUI development:" -msgstr "Développement de l'interface :" +msgstr "Développement de l'interface :" msgid "GUID:" -msgstr "GUID :" +msgstr "GUID :" msgid "KUID:" -msgstr "KUID :" +msgstr "KUID :" msgid "Gen. queued" msgstr "Gen. en file" @@ -6766,7 +7536,7 @@ msgstr "Demandes générées" msgid "Generation:" -msgstr "Génération :" +msgstr "Génération :" msgid "Global DHT outgoing traffic" msgstr "Trafic DHT sortant" @@ -6805,7 +7575,7 @@ msgstr "Limite TTL d_ure" msgid "H_ost:" -msgstr "H_ôte :" +msgstr "H_ôte :" msgid "Hard limit of _file descriptors used" msgstr "Limite dure des descripteurs de _fichiers utilisés" @@ -6849,7 +7619,7 @@ msgstr "Paramètres IP" msgid "IP:Port:" -msgstr "IP:Port:" +msgstr "IP:Port :" msgid "IPv4 settings" msgstr "Options IPv4" @@ -6867,13 +7637,13 @@ msgstr "Les fichiers ignorés sont" msgid "Incoming connecting timeout" -msgstr "Timeout de la connexion entrante" +msgstr "Timeout des connexions entrantes" msgid "Incoming traffic from _leaves" msgstr "Trafic entrant depuis les f_euilles" msgid "Indexing started on:" -msgstr "Indexage commencé à :" +msgstr "Indexage commencé à :" msgid "Info" msgstr "Info" @@ -6882,7 +7652,7 @@ msgstr "Bande passante entrante moyenne" msgid "Jeroen Asselman" -msgstr "" +msgstr "Jeroen Asselman" msgid "Join the users or developers mailing lists." msgstr "Rejoignez la liste de discussion des utilisateurs ou des développeurs." @@ -6891,7 +7661,7 @@ msgstr "Garder les fichiers en cours de téléchargement/incomplets dans" msgid "Keywords:" -msgstr "Mots-clés :" +msgstr "Mots-clés :" msgid "KiB" msgstr "KiB" @@ -6912,16 +7682,16 @@ msgstr "Dernière vérification" msgid "Last chunk size" -msgstr "_Taille du dernier bloc" +msgstr "Taille du dernier bloc" msgid "Last scan initiated on:" -msgstr "Dernier balayage commencé le :" +msgstr "Dernier balayage commencé le :" msgid "Last switch" msgstr "Dernier changement" msgid "Leaf requery threshold" -msgstr "Seuil de redemande des leaf" +msgstr "Seuil de redemande des feuilles" msgid "Leaf traffic" msgstr "Trafic feuille" @@ -6933,7 +7703,7 @@ msgstr "Nombres de fichiers de la bibliothèque" msgid "Library scanning:" -msgstr "Balayage de la bibliothèque :" +msgstr "Balayage de la bibliothèque :" msgid "Library size" msgstr "Taille de la bibliothèque" @@ -6990,7 +7760,7 @@ msgstr "Nombre max de résultats passifs" msgid "Max. number of What's New? results" -msgstr "Nombre max de résultats pour \"quoi de neuf ?\"" +msgstr "Nombre max de résultats pour « quoi de neuf ? »" msgid "Max. simultaneous downloads per file" msgstr "Max de téléchargements simultanés par fichier" @@ -7019,7 +7789,7 @@ "tentatives automatiques" msgid "Maximum size:" -msgstr "Taille maximum :" +msgstr "Taille maximum :" msgid "" "Maximum size\n" @@ -7032,13 +7802,13 @@ msgstr "Maximum" msgid "Measured HTTP latency:" -msgstr "Latence HTTP mesurée :" +msgstr "Latence HTTP mesurée :" msgid "Meet us on #gtk-gnutella at irc.freenode.net." msgstr "Rencontrez nous sur #gtk-gnutella sur irc.freenode.net." msgid "Min/Max:" -msgstr "Min/Max :" +msgstr "Min/Max :" msgid "Minimum chunk size" msgstr "Taille minimum des blocs" @@ -7052,7 +7822,7 @@ "tentatives automatiques" msgid "Minimum size:" -msgstr "Taille minimum :" +msgstr "Taille minimum :" msgid "Minimum upload time" msgstr "Temps minimum des envois" @@ -7082,7 +7852,7 @@ msgstr "Déplacer les fichiers corrompus vers" msgid "Network protocol:" -msgstr "Protocole réseau :" +msgstr "Protocole réseau :" msgid "Network" msgstr "Réseau" @@ -7122,7 +7892,7 @@ msgstr "Premier blo_c optimiste" msgid "Original author:" -msgstr "Auteur original :" +msgstr "Auteur original :" msgid "Originally obtained from" msgstr "Obtenu à l'origine depuis" @@ -7140,7 +7910,7 @@ msgstr "Bande passante sortante moyenne" msgid "PARQ development:" -msgstr "Développement PARQ :" +msgstr "Développement PARQ :" msgid "Partial File Sharing" msgstr "Partage de fichier partiel" @@ -7152,7 +7922,7 @@ msgstr "Coller la règle" msgid "Patch generation started on:" -msgstr "Génération du patch commencée à :" +msgstr "Génération du patch commencée à :" msgid "Pause" msgstr "Pause" @@ -7183,7 +7953,7 @@ msgstr "Latence Ping / Pong" msgid "Please confirm:" -msgstr "Veuillez confirmer :" +msgstr "Veuillez confirmer :" msgid "Prefer _compressed connections" msgstr "Préférer les connexions _compressées" @@ -7192,22 +7962,22 @@ msgstr "Préférences" msgid "Progress:" -msgstr "Progression :" +msgstr "Progression :" msgid "Project leader:" -msgstr "Chef de projet :" +msgstr "Chef de projet :" msgid "Property browser" msgstr "Navigateur de propriétés" msgid "Property pattern:" -msgstr "Motif de propriété :" +msgstr "Motif de propriété :" msgid "Property" msgstr "Propriété" msgid "Proxy _type:" -msgstr "_Type de proxy :" +msgstr "_Type de proxy :" msgid "Proxy settings" msgstr "Paramètres du proxy" @@ -7225,13 +7995,13 @@ msgstr "Les recherches demandent des résultats directs" msgid "Query Routing Protocol:" -msgstr "Protocole de routage des recherches :" +msgstr "Protocole de routage des recherches :" msgid "Query routing patch information:" -msgstr "Informations sur le patch de routage des demandes :" +msgstr "Informations sur le patch de routage des demandes :" msgid "Query routing table information:" -msgstr "Informations sur table de routage des demandes :" +msgstr "Informations sur table de routage des demandes :" msgid "Queuing details" msgstr "Détails de file d'attente" @@ -7264,13 +8034,13 @@ msgstr "Intervalle" msgid "Raphael Manfredi" -msgstr "" +msgstr "Raphaël Manfredi" msgid "Ratio of tolerable duplicate messages per _node" msgstr "Proportion de messages dupliqués tolérable par _noeud" msgid "Raw length:" -msgstr "Longueur brute :" +msgstr "Longueur brute :" msgid "Re_try search every" msgstr "Réessayer la recherche _tous les" @@ -7418,7 +8188,7 @@ msgstr "Sélectionner les fichiers par expression régulière" msgid "Selected property:" -msgstr "Propriété sélectionnée :" +msgstr "Propriété sélectionnée :" msgid "Server" msgstr "Serveur" @@ -7439,10 +8209,10 @@ msgstr "Afficher les _Téléchargements" msgid "Show _Menubar" -msgstr "Afficher la _Sidebar" +msgstr "Afficher la barre des _menus" msgid "Show _Sidebar" -msgstr "Afficher la _Sidebar" +msgstr "Afficher la _barre latérale" msgid "Show _Uploads" msgstr "Afficher les _Envois" @@ -7497,7 +8267,7 @@ msgstr "Afficher le trafic DHT _sortant" msgid "Show pr_otocol:" -msgstr "Afficher le _protocole :" +msgstr "Afficher le _protocole :" msgid "Show r_easons for" msgstr "Afficher les _raisons pour" @@ -7515,7 +8285,7 @@ "Afficher des informations visuelles sur la progression du téléchargement. " "Les blocs verts représentent les parties téléchargées, avec les parties " "vertes claires représentant celles finies lors de cette session. Les blocs " -"jaunes sont ceux actifs actuellement ; ces blocs actifs sont aussi marqués " +"jaunes sont ceux actifs actuellement ; ces blocs actifs sont aussi marqués " "avec un triangle. Les rouges n'ont pas encore été téléchargés. La ligne " "bleue indique quelles sont les parties vues sur le réseau lors de cette " "session." @@ -7531,7 +8301,7 @@ "avant d'éjecter" msgid "Slots:" -msgstr "Créneaux :" +msgstr "Créneaux :" msgid "Socket receive buffer size" msgstr "Taille du tampon pour la réception socket" @@ -7555,7 +8325,7 @@ msgstr "Statistiques" msgid "Statistics:" -msgstr "Statistiques :" +msgstr "Statistiques :" msgid "Stop" msgstr "Arrêt" @@ -7567,10 +8337,10 @@ msgstr "Uptime moyen suffisant" msgid "Swarming development:" -msgstr "Développement 'swarming' :" +msgstr "Développement 'swarming' :" msgid "TCP _Port:" -msgstr "_Port TCP :" +msgstr "_Port TCP :" msgid "TX compression" msgstr "Compression TX" @@ -7594,7 +8364,7 @@ msgstr "Timeout du contrôle de flux T_X" msgid "Table generation started on:" -msgstr "Génération de la table commencée à :" +msgstr "Génération de la table commencée à :" msgid "Thaw queue" msgstr "Débloquer la file" @@ -7612,7 +8382,7 @@ "condition. If you could, this rule would just be ignored." msgstr "" "Il n'y a pas de condition. Quand cette règle est atteinte, la correspondance " -"va continuer dans le filtre de la cible spécifié. C'est aussi pourquoi vous " +"va continuer dans le filtre de la cible spécifiée. C'est aussi pourquoi vous " "ne pouvez inverser cette condition. Si vous pouviez, cette règle serait " "simplement ignorée." @@ -7643,10 +8413,10 @@ msgstr "Outils" msgid "Total input bandwidth limit:" -msgstr "Limite totale de la bande passante entrante :" +msgstr "Limite totale de la bande passante entrante :" msgid "Total output bandwidth limit:" -msgstr "Limite totale de la bande passante sortante :" +msgstr "Limite totale de la bande passante sortante :" msgid "Transferred data" msgstr "Données transférées" @@ -7689,7 +8459,7 @@ msgstr "Historique d'envois" msgid "Uploaded:" -msgstr "Envoyé :" +msgstr "Envoyé :" msgid "Uploads" msgstr "Envois" @@ -7698,13 +8468,13 @@ msgstr "Uptime" msgid "Use IP _Type of Service (TOS)" -msgstr "Utilise le _Type de Service (TOS) IP" +msgstr "Utiliser le _Type de Service (TOS) IP" msgid "Use IPv6-to-IPv4 TRT prefix:" -msgstr "Utiliser un préfixe TRT IPv6-vers-IPv4 :" +msgstr "Utiliser un préfixe TRT IPv6-vers-IPv4 :" msgid "Use _surplus bandwidth" -msgstr "Utilise la bande passante en _excès" +msgstr "Utiliser la bande passante en _excès" msgid "Use global hostiles.txt" msgstr "Utiliser le hostiles.txt global" @@ -7730,13 +8500,13 @@ msgstr "Version" msgid "Vidar Madsen" -msgstr "" +msgstr "Vidar Madsen" msgid "Visit http://gtk-gnutella.sourceforge.net/." msgstr "Visitez http://gtk-gnutella.sourceforge.net/." msgid "Volume:" -msgstr "Volume :" +msgstr "Volume :" msgid "Watch for similar queries" msgstr "Prêter attention aux demandes similaires" @@ -7754,7 +8524,7 @@ msgstr "Métadonnées XML" msgid "Yann Grossel" -msgstr "" +msgstr "Yann Grossel" msgid "" "You appear to be TCP-firewalled, i.e. others cannot connect to you to " @@ -7808,12 +8578,12 @@ "both your incoming and outgoing paths." msgstr "" "Vos envois s'arrêtent trop fréquemment, indiquant que votre bande passante " -"est probablement saturée. Vous ne devriez pas tourner en mode noeud ultra, et " -"essayez de réduire la bande passante allouée à gtk-gnutella pour éviter de " -"saturer en même temps l'envoi et la réception." +"est probablement saturée. Vous ne devriez pas tourner en mode noeud ultra, " +"et essayez de réduire la bande passante allouée à gtk-gnutella pour éviter " +"de saturer en même temps l'envoi et la réception." msgid "_About" -msgstr "_A propos" +msgstr "À _propos" msgid "_Add directory" msgstr "_Ajouter un répertoire" @@ -7834,7 +8604,7 @@ msgstr "_Coeff. de suppression (0-100)" msgid "_Download RX buffer:" -msgstr "Tampon RX de _téléchargement :" +msgstr "Tampon RX de _téléchargement :\" " msgid "_Download selected" msgstr "_Télécharger la sélection" @@ -7843,7 +8613,7 @@ msgstr "_Doublon" msgid "_Edit filters" -msgstr "_Editer les filtres" +msgstr "Édit_er les filtres" msgid "_FAQ" msgstr "_FAQ" @@ -7858,7 +8628,7 @@ msgstr "_Général" msgid "_Gnutella RX buffer:" -msgstr "Tampon RX _Gnutella" +msgstr "Tampon RX _Gnutella :" msgid "_Gnutella traffic stats" msgstr "Stats du trafic _Gnutella" @@ -7867,7 +8637,7 @@ msgstr "Stats du trafic _HTTP" msgid "_Help" -msgstr "_Aide" +msgstr "Aid_e" msgid "_Hide downloaded files" msgstr "Cac_her les fichiers téléchargés" @@ -7933,7 +8703,7 @@ msgstr "Nom d'_utilisateur" msgid "_View" -msgstr "_Voir" +msgstr "_Affichage" msgid "_auto-hide leaf traffic stats" msgstr "cacher _automatiquement les stats du trafic feuille" @@ -7980,7 +8750,7 @@ "gtk-gnutella s'arrête.\n" "Envoi des messages 'bye' aux hôtes.\n" "\n" -"Temps de grâce restant :" +"Temps de grâce restant :" msgid "gtk-gnutella shutdown" msgstr "arrêt de gtk-gnutella" @@ -7989,7 +8759,7 @@ msgstr "gtk-gnutella" msgid "gtk-gnutella: Quit?" -msgstr "gtk-gnutella : Quitter ?" +msgstr "gtk-gnutella : Quitter ?" msgid "hops radius" msgstr "rayon des hops" @@ -8067,10 +8837,10 @@ msgstr "DHT activée, mode actif." msgid "DHT bootstrapping." -msgstr "DHT en initialisation" +msgstr "DHT en initialisation." msgid "DHT looking up own KUID." -msgstr "DHT recherche de mon KUID" +msgstr "DHT recherche de mon KUID." msgid "DHT seeded." msgstr "DHT germée." @@ -8081,17 +8851,20 @@ msgid "Disabled stealing of outgoing HTTP bandwidth." msgstr "Empêche tout vol de la bande passante HTTP sortante." -msgid "Splitting ougoing HTTP bandwidth evenly." -msgstr "Distribution régulière de la bande passante HTTP sortante." +msgid "Splitting outgoing HTTP bandwidth evenly." +msgstr "Bande passante HTTP sortante partagée également." msgid "Capping HTTP outgoing bandwidth." msgstr "Limitation de la bande passante HTTP sortante." msgid "Port mapping possible through UPnP or NAT-PMP." -msgstr "Redirection de port possible via UPnp ou NAT-PMP." +msgstr "Redirection de port possible via UPnP ou NAT-PMP." + +msgid "Port mapping configured through NAT-PMP." +msgstr "Redirection de port configurée via NAT-PMP." -msgid "Port mapping configured through UPnP or NAT-PMP." -msgstr "Redirection de port configurée via UPnP ou NAT-PMP." +msgid "Port mapping configured through UPnP." +msgstr "Redirection de port configurée via UPnP." msgid "Enable UPnP" msgstr "Activer l'UPnP" @@ -8103,10 +8876,10 @@ msgstr "Activer l'emboîtement des requêtes HTTP" msgid "Pipelining max chunk size" -msgstr "Taille minimum des blocs avec emboîtement" +msgstr "Taille maximum des blocs avec emboîtement" -msgid "Enable upload of patial files deemed rare" -msgstr "Activer l'envoi des fichiers rares partiels" +msgid "Enable upload of partial files deemed rare" +msgstr "Activer l'envoi des fichiers rares _partiellement téléchargés" msgid "Enable GUESS (additional querying)" msgstr "Autoriser GUESS (recherches additionnelles)" @@ -8121,7 +8894,7 @@ msgstr "Cible de la bande passante sortante" msgid "Download queue is frozen." -msgstr "File de téléchargement figée" +msgstr "File de téléchargement figée." msgid "Allow TTH discovery" msgstr "Permet la découverte de TTH" @@ -8130,10 +8903,10 @@ msgstr "Recherche aussi les fichiers partiels" msgid "Answer to queries for partial files" -msgstr "Répond aux recherches de fichiers partiels" +msgstr "Répondre aux recherches de fichiers partiels" msgid "Answer to what's-new? queries" -msgstr "Répond aux recherches \"quoi de neuf ?\"" +msgstr "Répondre aux recherches « quoi de neuf ? »" msgid "Search Media Type" msgstr "Type de média recherché" @@ -8163,7 +8936,7 @@ msgstr "Recherche les nouveaux fichiers partagés par les noeuds voisins" msgid "What's new?" -msgstr "Quoi de neuf ?" +msgstr "Quoi de neuf ?" msgid "Unspecified" msgstr "Non spécifié" @@ -8174,6 +8947,9 @@ msgid "Discard results bearing an alien IP address" msgstr "Ignore les résultats avec une adresse IP étrangère" +msgid "Discard results bearing a banned GUID" +msgstr "Ignore les résultats venant d'un GUID banni" + msgid "Restart session-only searches with pending downloads" msgstr "Relance les recherches de session avec téléchargements en instance" @@ -8184,13 +8960,29 @@ msgstr "Stocke les clés/valeurs DHT en mémoire" msgid "Store SPAM SHA1 table in memory" -msgstr "Stocke la table de SHA1 SPAM en mémoire" +msgstr "Stocker la table de SHA1 SPAM en mémoire" msgid "Relayed queries remembered" msgstr "Recherches relayés mémorisées" -msgid "Not in database" -msgstr "Pas dans la base de données" +msgid "Allow unused Gnutella outgoing bandwidth to supersede hint" +msgstr "" +"Autoriser la bande passante Gnutella sortante à remplacer la suggestion" + +msgid "Display GUESS statistics" +msgstr "Afficher les statistiques GUESS" + +msgid "Mapping lease time" +msgstr "Durée du bail de redirection" + +msgid "G2 hubs" +msgstr "Hubs G2" + +msgid "Enable the G2 network" +msgstr "Activer le réseau G2" + +msgid " G2, " +msgstr " G2, " msgid "owned" msgstr "détenu" @@ -8213,9 +9005,6 @@ msgstr0 "%u résultat écarté" msgstr1 "%u résultats écartés" -msgid "Query queued..." -msgstr "Demande dans la file..." - #, c-format msgid "%u term counted" msgid_plural "%u terms counted" @@ -8224,11 +9013,11 @@ #, c-format msgid "Couldn't find pixmap file: %s" -msgstr "Ne peut trouver le fichier pixmap : %s" +msgstr "Ne peut trouver le fichier pixmap : %s" #, c-format msgid "Error loading pixmap file: %s" -msgstr "Erreur lors du chargement du fichier pixmap : %s" +msgstr "Erreur lors du chargement du fichier pixmap : %s" msgid " (partial)" msgstr " (partiel)" @@ -8257,11 +9046,14 @@ msgid "_Auto-hide leaf traffic stats" msgstr "Cacher _automatiquement les stats du trafic de feuille" +msgid "Glossary" +msgstr "" + msgid "_Search" msgstr "_Recherche" msgid "What's New?" -msgstr "Quoi de neuf ?" +msgstr "Quoi de neuf ?" msgid "Do not specify any media type (will match any kind of files remotely)" msgstr "" @@ -8270,9 +9062,6 @@ msgid "CPU overloaded" msgstr "CPU surchargé" -msgid "Splitting outgoing HTTP bandwidth evenly." -msgstr "Bande passante HTTP sortante partagée également." - msgid "Connect to" msgstr "Se connecter à" @@ -8301,29 +9090,35 @@ "routing packets in the Gnutella network." msgstr "" "Le GUID (IDentifiant Unique Global) associé avec ce noeud. Il est utilisé " -"pour le cheminement des paquets dans le réseau Gnutella" +"pour le cheminement des paquets dans le réseau Gnutella." msgid "GUID placeholder" -msgstr "" +msgstr "Espace réservé au GUID" msgid "KUID placeholder" -msgstr "" +msgstr "Espace réservé au KUID" msgid "Address/Port:" -msgstr "Adresse/Port :" +msgstr "Adresse/Port :" msgid "IP:port placeholder" -msgstr "" +msgstr "Espace réservé pour IP:port" msgid "Served " msgstr "Servi " -msgid "BH HTML served" -msgstr "Servi BH HTML" +msgid "G2 served" +msgstr "G2 servi" msgid " / " msgstr " / " +msgid "G2" +msgstr "G2" + +msgid "BH HTML served" +msgstr "Servi BH HTML" + msgid "BH HTML" msgstr "BH HTML" @@ -8331,7 +9126,7 @@ msgstr "BH qhits" msgid "Current _search:" -msgstr "Recherche actuelle :" +msgstr "Recherche actuelle :" msgid "_Clear results" msgstr "Effa_cer les résultats" @@ -8343,10 +9138,10 @@ msgstr "_Reçu" msgid "Downloaded data:" -msgstr "Données téléchargées :" +msgstr "Données téléchargées :" msgid "Uploaded data:" -msgstr "Données envoyées :" +msgstr "Données envoyées :" msgid "_Columns show hops" msgstr "Les _colonnes affichent les hops" @@ -8411,21 +9206,15 @@ msgstr "" "Pourcentage maximum de créneaux de connexions qu'un vendeur peut prendre." -msgid "Global DHT ougoing traffic" -msgstr "Trafic DHT sortant" - msgid "attempts" msgstr "tentatives" msgid "Pipelining maximum chunk size" -msgstr "Taille minimum des blocs emboîtés" +msgstr "Taille maximum des blocs emboîtés" msgid "_Remove directory" msgstr "_Retirer un répertoire" -msgid "Enable upload of partial files deemed rare" -msgstr "Activer l'envoi des fichiers rares _partiellement téléchargés" - msgid "Minimum chunk _size" msgstr "Taille minimum des _blocs" @@ -8433,7 +9222,7 @@ msgstr "Afficher une _icône de statut" msgid "Avg. downtime of this servent" -msgstr "Downtime moyen de ce servent :" +msgstr "Downtime moyen de ce servent :" msgid "Remove completed downloads from list" msgstr "Enlever les téléchargements terminés de la liste" @@ -8445,10 +9234,10 @@ msgstr ", " msgid "Peer:" -msgstr "Hôte :" +msgstr "Hôte :" msgid "Peermode:" -msgstr "Mode peer :" +msgstr "Mode peer :" msgid "incoming" msgstr "entrant" @@ -8457,10 +9246,10 @@ msgstr "sortant" msgid "Country:" -msgstr "Pays :" +msgstr "Pays :" msgid "Vendor:" -msgstr "Vendeur :" +msgstr "Vendeur :" msgid "Move the cursor over a row to see details." msgstr "Déplacer le curseur sur une ligne pour voir les détails." @@ -8472,8 +9261,11 @@ msgid "Reverse lookup in progress..." msgstr "Recherche inverse en cours..." +msgid "UDP (semi-reliable)" +msgstr "UDP (semi-fiable)" + msgid "Size:" -msgstr "Taille :" +msgstr "Taille :" msgid "Done" msgstr "Terminé" @@ -8496,6 +9288,12 @@ msgid "Valid IPv6 ultra" msgstr "Ultra IPv6 valide" +msgid "Fresh G2 hub" +msgstr "Hub G2 frais" + +msgid "Valid G2 hub" +msgstr "Hub G2 valide" + msgid "Unstable" msgstr "Instable" @@ -8515,7 +9313,7 @@ msgstr "GUESS (IPv6 introductions)" msgid "gtk-gnutella: Click to minimize/restore" -msgstr "gtk-gnutella : Cliquez pour minimiser/restaurer" +msgstr "gtk-gnutella : Cliquez pour minimiser/restaurer" #. TRANSLATORS: Translate this as "Translation provided by" or similar #. and append your name to the list. @@ -8538,6 +9336,11 @@ "gnutella.sourceforge.net/?page=faq\">FAQ en ligne</a> à la place.</p></" "body></html>" +msgid "" +"<html><head><title>Glossary</title></head><body><p>The glossary document " +"could not be loaded.</p></body></html>" +msgstr "" + #, c-format msgid "%lu file shared (%s)" msgid_plural "%lu files shared (%s)" @@ -8558,7 +9361,7 @@ #, c-format msgid "Closing: %s Stop in %us RX=%u Q=%u,%u%%" -msgstr "Fermeture : %s Stop dans %us RX=%u Q=%u,%u%%" +msgstr "Fermeture : %s Stop dans %us RX=%u Q=%u,%u%%" msgid "Removing" msgstr "Retire" @@ -8569,6 +9372,9 @@ msgid "UNKNOWN STATUS" msgstr "STATUT INCONNU" +msgid "g2" +msgstr "g2" + msgid "busy" msgstr "occupé" @@ -8611,12 +9417,18 @@ msgstr "Expire avec cette session" #, c-format +msgid " %u download" +msgid_plural " %u downloads" +msgstr0 " %u téléchargement" +msgstr1 " %u téléchargements" + +#, c-format msgid "" "%u %s (%u skipped, %u ignored, %u hidden, %u auto-d/l, %u %s) Hits: %u (%u " "TCP, %u UDP)" msgstr "" "%u %s (%u sautés, %u ignorés, %u cachés, %u auto-téléchargement, %u %s) " -"Hits : %u (%u TCP, %u UDP)" +"Hits : %u (%u TCP, %u UDP)" msgid "item" msgid_plural "items" @@ -8628,6 +9440,66 @@ msgstr0 "dupliqué" msgstr1 "dupliqués" +msgid "No GUESS queries run yet" +msgstr "Pas de requête GUESS lancée pour l'instant" + +#, c-format +msgid " previous took %s querying %zu %s with %zu %s kept" +msgstr " le précédent a pris %s en interrogeant %zu %s avec %zu %s gardé" + +msgid "host" +msgid_plural "hosts" +msgstr0 "Hôte" +msgstr1 "Hôtes" + +msgid "hit" +msgid_plural "hits" +msgstr0 "résultat" +msgstr1 "résultats" + +#, c-format +msgid "GUESS %s Total: %zu %s (%s %s, %s kept, %s queries, %s keys)%s" +msgstr "GUESS %s Total: %zu %s (%s %s, %s gardé, %s requêtes, %s clés)%s" + +msgid "idle" +msgstr "inactif" + +msgid "query" +msgid_plural "queries" +msgstr0 "recherche" +msgstr1 "recherches" + +#, c-format +msgid "" +"GUESS %s %s (%zu %s, %zu kept, %s queries, %s keys) Pool: %zu %s, (%zu+" +"%zu)/%zu queried, %zu %s (%.2f%%), %zu reached, %zu pending, %zu %s%s%s" +msgstr "" +"GUESS %s %s (%zu %s, %zu gardé, %s requêtes, %s clefs) Pool: %zu %s, (%zu+" +"%zu)/%zu interrogés, %zu %s (%.2f%%), %zu atteints, %zu en attente, %zu %s%s" +"%s" + +msgid "loose" +msgstr "libre" + +msgid "bounded" +msgstr "contraint" + +msgid "ack" +msgid_plural "acks" +msgstr0 "reçu" +msgstr1 "reçus" + +msgid "hop" +msgid_plural "hops" +msgstr0 "bond" +msgstr1 "bonds" + +msgid " (load pending)" +msgstr " (chargement en attente)" + +msgid " (end if starving)" +msgstr " (fin si affamé)" + msgid "Passive" msgstr "Passif" @@ -8646,7 +9518,7 @@ "could not rename %s as %s: %m\n" "The XML file will not be used unless this problem is resolved." msgstr "" -"n'a pas pu renommer %s en %s : %m\n" +"n'a pas pu renommer %s en %s : %m\n" "Le fichier XML ne sera pas utilisé tant que ce problème n'est pas résolu." msgid "<unparsed>" @@ -8750,6 +9622,16 @@ msgid "Partial" msgstr "Partiel" +#, c-format +msgid "%s %.2f%%" +msgstr "%s %.2f%%" + +msgid "Available" +msgstr "Disponible" + +msgid "Last modification" +msgstr "Dernière modification" + msgid "Latinized" msgstr "Latinisé" @@ -8765,6 +9647,9 @@ msgid "Hostname" msgstr "Nom d'hôte" +msgid "banned" +msgstr "banni" + msgid "Servent ID" msgstr "ID servent" @@ -8817,29 +9702,17 @@ msgstr "Le texte normalisé de recherche est trop court." msgid "One cannot send \"What's New?\" queries too often." -msgstr "On ne peut pas envoyer des recherches \"Quoi de neuf ?\" trop souvent." +msgstr "On ne peut pas envoyer des recherches « Quoi de neuf ? » trop souvent." msgid "The URN in the search text is invalid." msgstr "L'URN dans le texte de recherche est invalide." -msgid "SHA-1 is unknown." -msgstr "Le SHA-1 est inconnu." - -msgid "No Bitzi ticket requested yet." -msgstr "Pas de ticket Bitzi demandé pour l'instant." - -msgid "Not in Bitzi database." -msgstr "Pas dans la base de données Bitzi" - msgid "Encoding" msgstr "Codage" msgid "#" msgstr "#" -msgid "Metadata" -msgstr "Métadonnées" - msgid "Never" msgstr "Jamais" @@ -8865,26 +9738,33 @@ "gnutella.sourceforge.net/</a> and update your copy of gtk-gnutella.</p></" "body></html>" msgstr "" -"<html><head><title>Ancienne version détectée !</title></" -"head><body><h1>Attention</h1><p>Cette version de gtk-gnutella est ancianne. " +"<html><head><title>Ancienne version détectée !</title></" +"head><body><h1>Attention</h1><p>Cette version de gtk-gnutella est ancienne. " "Merci de visiter <a href=\"http://gtk-gnutella.sourceforge.net/\">http://gtk-" "gnutella.sourceforge.net/</a> et de mettre à jour votre copie de gtk-" "gnutella.</p></body></html>" msgid "*** RUNNING AN OLD VERSION! ***" -msgstr "*** EXÉCUTION D'UNE ANCIENNE VERSION ! ***" +msgstr "*** EXÉCUTION D'UNE ANCIENNE VERSION ! ***" msgid "*** CPU OVERLOADED -- TRYING TO SAVE CYCLES ***" msgstr "*** CPU SURCHARGÉ -- ESSAI DE RÉDUCTION DES CYCLES ***" +msgid "*** KERNEL BUFFER SHORTAGE -- LIMITING TCP CONNECTIONS ***" +msgstr "" +"*** INSUFFISANCE DU TAMPON DU KERNEL -- LIMITATION DES CONNEXIONS TCP ***" + +msgid "*** NO LISTENING TCP SOCKET -- NO INBOUND CONNECTIONS ***" +msgstr "" + msgid "*** UPLOADS STALLING, BANDWIDTH SHORTAGE? ***" -msgstr "*** LES ENVOIS CALENT, BANDE PASSANTE SURCHARGÉE ? ***" +msgstr "*** LES ENVOIS CALENT, BANDE PASSANTE SURCHARGÉE ? ***" msgid "*** FILE DESCRIPTORS HAVE RUN OUT! ***" -msgstr "*** PLUS DE DESCRIPTEURS DE FICHIERS DISPONIBLES ! ***" +msgstr "*** PLUS DE DESCRIPTEURS DE FICHIERS DISPONIBLES ! ***" msgid "*** FILE DESCRIPTORS RUNNING LOW! ***" -msgstr "*** COMMENCE À MANQUER DE DESCRIPTEURS DE FICHIERS ! ***" +msgstr "*** COMMENCE À MANQUER DE DESCRIPTEURS DE FICHIERS ! ***" msgid "*** Please update gtk-gnutella ***" msgstr "*** Merci de mettre à jour gtk-gnutella ***" @@ -8892,12 +9772,12 @@ #, c-format msgid "*** VERSION WILL BECOME OLD IN %d DAY! ***" msgid_plural "*** VERSION WILL BECOME OLD IN %d DAYS! ***" -msgstr0 "*** CETTE VERSION SERA ANCIENNE DANS %d JOUR ! ***" -msgstr1 "*** CETTE VERSION SERA ANCIENNE DANS %d JOURS ! ***" +msgstr0 "*** CETTE VERSION SERA ANCIENNE DANS %d JOUR ! ***" +msgstr1 "*** CETTE VERSION SERA ANCIENNE DANS %d JOURS ! ***" #, c-format msgid "Address/port changed to: %s" -msgstr "Adresse/Port changé en : %s" +msgstr "Adresse/Port changé en : %s" msgid "no sources" msgstr "Pas de source" @@ -8917,12 +9797,6 @@ msgstr "%u dans la file" #, c-format -msgid "%u/%u connection" -msgid_plural "%u/%u connections" -msgstr0 "%u/%u connexion" -msgstr1 "%u/%u connexions" - -#, c-format msgid "%u/%u upload" msgid_plural "%u/%u uploads" msgstr0 "%u/%u envoi" @@ -8937,12 +9811,15 @@ msgid "Queue frozen" msgstr "File d'attente figée" +msgid "Internal" +msgstr "" + msgid "Select a property to see its description." msgstr "Sélectionnez une propriété pour voir sa description." #, c-format msgid "No property name matches the pattern \"%s\"." -msgstr "Aucune propriété ne correspond au motif \"%s\"." +msgstr "Aucune propriété ne correspond au motif « %s »." msgid "No output yet..." msgstr "Rien en sortie actuellement..." @@ -8958,11 +9835,11 @@ #, c-format msgid " E=%u" -msgstr "" +msgstr " E=%u" #, c-format msgid "%s(%s) TR: %s %s#%u" -msgstr "%s(%s) TR : %s %s#%u" +msgstr "%s(%s) TR : %s %s#%u" msgid "stalled" msgstr "bloqué" @@ -8972,10 +9849,10 @@ #, c-format msgid "%s %s#%u E=%u" -msgstr "" +msgstr "%s %s#%u E=%u" msgid "Waiting for further request..." -msgstr "En attente d'une requête" +msgstr "En attente d'une requête..." msgid "Reading follow-up request..." msgstr "Attente de la requête..." @@ -8994,7 +9871,7 @@ msgstr "Figé" msgid "lifetime:" -msgstr "durée de vie :" +msgstr "durée de vie :" msgid "Sending QUEUE, connecting back..." msgstr "Envoi de QUEUE, se connecte..."
View file
gtk-gnutella-0.98.2.tar.bz2/po/gtk-gnutella.pot -> gtk-gnutella-1.1.9.tar.bz2/po/gtk-gnutella.pot
Changed
@@ -6,22 +6,25 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: gtk-gnutella 1.1.9u\n" "Report-Msgid-Bugs-To: gtk-gnutella-devel@lists.sf.net\n" -"POT-Creation-Date: 2011-11-22 18:27+0100\n" +"POT-Creation-Date: 2016-03-06 08:49+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#, c-format -msgid "%s%s%s%s%s fps, %s kbps" +msgid "Harmful version banned, upgrade required" +msgstr "" + +msgid "Connection refused" msgstr "" -msgid "times|x" +msgid "Use an open Gnutella or G2 servent" msgstr "" #, c-format @@ -56,7 +59,7 @@ msgstr "" #, c-format -msgid " at %s - rescheduled for %s%s #%u" +msgid " at %s" msgstr "" msgid "Suspended (SHA1 checking)" @@ -81,6 +84,9 @@ msgid "Download queue is frozen" msgstr "" +msgid "Network buffer shortage" +msgstr "" + msgid "No download slot (start)" msgstr "" @@ -90,6 +96,9 @@ msgid "Connection failed" msgstr "" +msgid "SHA1 mismatch detected" +msgstr "" + msgid "Waiting for server PROX publishing" msgstr "" @@ -253,6 +262,9 @@ msgid "No support for Content-Encoding (%s)" msgstr "" +msgid "Incomplete headers during TLS upgrade" +msgstr "" + msgid "Spammer detected" msgstr "" @@ -311,6 +323,12 @@ msgid "No Content-Length header" msgstr "" +msgid "Unexpected Content-Type" +msgstr "" + +msgid "No Content-Type" +msgstr "" + msgid "Search already closed" msgstr "" @@ -347,25 +365,32 @@ msgid "Malformed push reply" msgstr "" -msgid "SHA1 mismatch detected" -msgstr "" - msgid ", inbound" msgstr "" msgid ", outbound" msgstr "" +msgid ", no-pipeline" +msgstr "" + msgid ", banning" msgstr "" msgid ", g2" msgstr "" +msgid ", fake-g2" +msgstr "" + msgid ", vendor?" msgstr "" #, c-format +msgid "<Browse G2 Host %s>" +msgstr "" + +#, c-format msgid "<Browse Host %s>" msgstr "" @@ -391,6 +416,12 @@ msgid "Requeued due to timeout" msgstr "" +msgid "Partial file removed" +msgstr "" + +msgid "File info being reset" +msgstr "" + #, c-format msgid "Downloading (TR: %s)" msgstr "" @@ -466,158 +497,78 @@ msgstr1 "" #, c-format -msgid "Bootstrapping from %s" -msgstr "" - -msgid "Bad size" -msgstr "" - -msgid "Too small" -msgstr "" - -msgid "Too large" -msgstr "" - -msgid "Way too large" -msgstr "" - -msgid "Unknown message type" -msgstr "" - -msgid "Unexpected message" -msgstr "" - -msgid "Message sent with TTL = 0" -msgstr "" - -msgid "Improper hops/ttl combination" -msgstr "" - -msgid "Max TTL exceeded" -msgstr "" - -msgid "Message throttle" -msgstr "" - -msgid "Message matched limits" -msgstr "" - -msgid "Unusable Pong" -msgstr "" - -msgid "Hard TTL limit reached" +msgid "Connecting to web cache %s" msgstr "" -msgid "Max hop count reached" -msgstr "" - -msgid "Route lost" -msgstr "" - -msgid "No route" -msgstr "" - -msgid "Duplicate message" -msgstr "" - -msgid "Message to banned GUID" -msgstr "" - -msgid "Message from banned GUID" -msgstr "" - -msgid "Node shutting down" -msgstr "" - -msgid "TX flow control" -msgstr "" - -msgid "Query text had no trailing NUL" -msgstr "" - -msgid "Query text too short" -msgstr "" - -msgid "Query had unnecessary overhead" -msgstr "" - -msgid "Query had bad URN" -msgstr "" - -msgid "Message with malformed SHA1" -msgstr "" - -msgid "Message with malformed UTF-8" -msgstr "" - -msgid "Malformed Query Hit" -msgstr "" - -msgid "Bad return address" +#, c-format +msgid "Bootstrapping from %s" msgstr "" -msgid "Hostile IP address" +#, c-format +msgid "Shutdown (%s)" msgstr "" -msgid "Bogus result from Morpheus" -msgstr "" +#, c-format +msgid "Got %d connection pong" +msgid_plural "Got %d connection pongs" +msgstr0 "" +msgstr1 "" -msgid "Spam" +msgid "Gnet connections disabled" msgstr "" -msgid "Evil filename" +msgid "Connection not compressed" msgstr "" -msgid "Improper media type" +#, c-format +msgid "Too many G2 hubs (%u max)" msgstr "" -msgid "Payload inflating error" +#, c-format +msgid "Too many leaves (%d max)" msgstr "" -msgid "Unknown header flags present" +#, c-format +msgid "Too many ultra nodes (%d max)" msgstr "" -msgid "Own search results" +#, c-format +msgid "Rejected normal node (%d max)" msgstr "" -msgid "Own queries" +msgid "Rejected leaf node" msgstr "" -msgid "Ancient query format" +#, c-format +msgid "Too many nodes (%d max)" msgstr "" -msgid "Blank Servent ID" +msgid "Sent shielded indication" msgstr "" -msgid "GUESS Query missing token" +msgid "Not an ultra node" msgstr "" -msgid "GUESS Invalid query token" +msgid "Unknown error" msgstr "" -msgid "DHT Invalid security token" +msgid "Unstable IP address" msgstr "" -msgid "DHT Too many STORE requests" +msgid "Servent version appears unstable" msgstr "" -msgid "DHT Malformed message" +msgid "No vendor string supplied" msgstr "" #, c-format -msgid "Shutdown (%s)" +msgid "Not connecting: %s" msgstr "" -#, c-format -msgid "Got %d connection pong" -msgid_plural "Got %d connection pongs" -msgstr0 "" -msgstr1 "" - -msgid "Sent crawling info" +msgid "Cannot setup compressing TX stack" msgstr "" -msgid "Cannot setup compressing TX stack" +msgid "Sent crawling info" msgstr "" #, c-format @@ -635,51 +586,13 @@ msgid "Shielded node" msgstr "" -msgid "Gnet connections disabled" -msgstr "" - -msgid "Connection not compressed" -msgstr "" - -#, c-format -msgid "Too many leaves (%d max)" -msgstr "" - -#, c-format -msgid "Too many ultra nodes (%d max)" -msgstr "" - -#, c-format -msgid "Rejected normal node (%d max)" -msgstr "" - -msgid "Rejected leaf node" -msgstr "" - -#, c-format -msgid "Too many nodes (%d max)" -msgstr "" - -msgid "Sent shielded indication" -msgstr "" - -msgid "Not an ultra node" -msgstr "" - -msgid "Unstable IP address" -msgstr "" - -msgid "Servent version appears unstable" -msgstr "" - -msgid "No vendor string supplied" +msgid "Protocol not acceptable" msgstr "" -#, c-format -msgid "Not connecting: %s" +msgid "Conflict" msgstr "" -msgid "Protocol not acceptable" +msgid "Upgrade Header Missing" msgstr "" msgid "Servent Shutdown" @@ -688,6 +601,9 @@ msgid "Not a network member" msgstr "" +msgid "Need a G2 Hub" +msgstr "" + msgid "Too frequent crawling" msgstr "" @@ -737,6 +653,12 @@ msgid "Pseudo UDP node" msgstr "" +msgid "Pseudo semi-reliable UDP node" +msgstr "" + +msgid "Pseudo G2 UDP node" +msgstr "" + msgid "Pseudo DHT node" msgstr "" @@ -782,6 +704,9 @@ msgid "DHT" msgstr "" +msgid "G2 hub" +msgstr "" + msgid "Unknown" msgstr "" @@ -814,7 +739,12 @@ msgid "creating directory \"%s\" for %s" msgstr "" -msgid "You seem to have left another gtk-gnutella running" +#, c-format +msgid "Another gtk-gnutella supervisor is running as PID %lu" +msgstr "" + +#, c-format +msgid "Another gtk-gnutella is running as PID %lu" msgstr "" msgid "Cannot proceed without valid configuration directory" @@ -829,9 +759,6 @@ msgid "Failed to create local socket" msgstr "" -msgid "Failed to create listening sockets" -msgstr "" - msgid "Can only run as a leaf when TCP-firewalled" msgstr "" @@ -841,6 +768,12 @@ msgid "Got EOF" msgstr "" +msgid "TLS handshake failed" +msgstr "" + +msgid "Connection locally failed" +msgstr "" + msgid "Write failed (Input Exception)" msgstr "" @@ -861,21 +794,111 @@ msgid "Connect back timeout" msgstr "" +msgid "Request timeout" +msgstr "" + msgid "Timeout waiting for follow-up" msgstr "" msgid "Lifetime expired" msgstr "" +msgid "Unauthorized" +msgstr "" + +#, c-format +msgid "Limiting connections from %s" +msgstr "" + +msgid "No reason given" +msgstr "" + +msgid "Bad Request" +msgstr "" + +msgid "Header too large" +msgstr "" + +msgid "Input buffer full" +msgstr "" + +msgid "Extra data after HTTP header" +msgstr "" + msgid "Unable to send GIV" msgstr "" +msgid "Not Found" +msgstr "" + +msgid "File was modified" +msgstr "" + +msgid "Moved Permanently" +msgstr "" + +msgid "File index/name mismatch" +msgstr "" + +msgid "URN Not Found (urn:sha1)" +msgstr "" + +msgid "SHA1 is being recomputed" +msgstr "" + +msgid "Library being rebuilt" +msgstr "" + +msgid "Malformed URN in /uri-res/N2R request" +msgstr "" + +msgid "Malformed URN in /uri-res/N2X request" +msgstr "" + +msgid "TTH is being computed" +msgstr "" + msgid "<Browse Host Request>" msgstr "" +msgid "Browse Host Disabled" +msgstr "" + +#, c-format +msgid "Redirected to %s:%u" +msgstr "" + +msgid "Not Modified" +msgstr "" + msgid "Stalling upload replaced" msgstr "" +msgid "Already downloading this file" +msgstr "" + +msgid "Malformed Range request" +msgstr "" + +msgid "Requested range not satisfiable" +msgstr "" + +msgid "Requested range not available yet" +msgstr "" + +msgid "Queue full" +msgstr "" + +msgid "Another connection is still active" +msgstr "" + +#, c-format +msgid "%s not honoured; removed from PARQ queue" +msgstr "" + +msgid "Minimum retry delay" +msgstr "" + #, c-format msgid "Queued (slot %d, ETA: %s)" msgstr "" @@ -883,8 +906,11 @@ msgid "Cannot send whole HTTP status" msgstr "" +msgid "Not Acceptable" +msgstr "" + #, c-format -msgid "<Browse Host Request> %s%s%s" +msgid "<Browse Host %sRequest> %s%s%s" msgstr "" msgid "query hits" @@ -899,6 +925,40 @@ msgid ", chunked" msgstr "" +msgid "THEX failure" +msgstr "" + +msgid "EOF while sinking" +msgstr "" + +#, c-format +msgid "Read error while sinking: %m" +msgstr "" + +msgid "Content Too Large" +msgstr "" + +msgid "Unknown/Missing Protocol Tag" +msgstr "" + +msgid "Missing Host Header" +msgstr "" + +msgid "Not Implemented" +msgstr "" + +msgid "Bad URI" +msgstr "" + +msgid "Bad Path" +msgstr "" + +msgid "No Content Allowed" +msgstr "" + +msgid "Sharing currently disabled" +msgstr "" + msgid "Write exception" msgstr "" @@ -938,6 +998,1194 @@ msgid " - Newer version available: from git %s" msgstr "" +msgid "Routing errors" +msgstr "" + +msgid "Routing table chunks" +msgstr "" + +msgid "Routing table message capacity" +msgstr "" + +msgid "Routing table message count" +msgstr "" + +msgid "Routing through transient node avoided" +msgstr "" + +msgid "Duplicates with higher TTL" +msgstr "" + +msgid "SPAM SHA1 database hits" +msgstr "" + +msgid "SPAM filename and size hits" +msgstr "" + +msgid "SPAM fake hits" +msgstr "" + +msgid "SPAM duplicate hits" +msgstr "" + +msgid "SPAM dynamically caught hostile IP addresses" +msgstr "" + +msgid "SPAM dynamically caught hostile IP held" +msgstr "" + +msgid "SPAM spotted spamming IP addresses held" +msgstr "" + +msgid "Searches to local DB" +msgstr "" + +msgid "Hits on local DB" +msgstr "" + +msgid "Hits on local partial files" +msgstr "" + +msgid "Hits on \"what's new?\" queries" +msgstr "" + +msgid "Query hits received for local queries" +msgstr "" + +msgid "G2 searches to local DB" +msgstr "" + +msgid "G2 hits on local DB" +msgstr "" + +msgid "G2 hits on local partial files" +msgstr "" + +msgid "Query hits received for OOB-proxied queries" +msgstr "" + +msgid "Queries requesting OOB hit delivery" +msgstr "" + +msgid "Stripped OOB flag on queries" +msgstr "" + +msgid "Ignored OOB queries due to unclaimed hits" +msgstr "" + +msgid "Duplicate OOB-proxied queries" +msgstr "" + +msgid "OOB hits received for OOB-proxied queries" +msgstr "" + +msgid "OOB hits bearing alien IP address" +msgstr "" + +msgid "OOB hits ignored due to identified spamming address" +msgstr "" + +msgid "OOB hits ignored due to unsecure promise from known secure host" +msgstr "" + +msgid "Unclaimed locally-generated OOB hits" +msgstr "" + +msgid "Partially claimed locally-generated OOB hits" +msgstr "" + +msgid "Spurious OOB hit claiming received" +msgstr "" + +msgid "Unrequested OOB hits received" +msgstr "" + +msgid "Received query hits for untracked queries" +msgstr "" + +msgid "Tracked query MUIDs" +msgstr "" + +msgid "Compacted queries" +msgstr "" + +msgid "Bytes saved by compacting" +msgstr "" + +msgid "UTF8 queries" +msgstr "" + +msgid "SHA1 queries" +msgstr "" + +msgid "\"What's New?\" queries" +msgstr "" + +msgid "UTF8 G2 queries" +msgstr "" + +msgid "SHA1 G2 queries" +msgstr "" + +msgid "GUESS queries" +msgstr "" + +msgid "GUESS queries (0.2)" +msgstr "" + +msgid "GUESS link cache size" +msgstr "" + +msgid "GUESS cached query keys held" +msgstr "" + +msgid "GUESS cached 0.2 hosts held" +msgstr "" + +msgid "GUESS cached G2 hosts held" +msgstr "" + +msgid "GUESS locally generated queries" +msgstr "" + +msgid "GUESS currently running queries" +msgstr "" + +msgid "GUESS hits received for locally generated queries" +msgstr "" + +msgid "GUESS ultra nodes queried" +msgstr "" + +msgid "GUESS ultra nodes sending back an acknowledgment" +msgstr "" + +msgid "GUESS G2 nodes queried" +msgstr "" + +msgid "GUESS G2 nodes sending back an acknowledgment" +msgstr "" + +msgid "Throttled local push messages" +msgstr "" + +msgid "Throttled received push messages" +msgstr "" + +msgid "Broadcasted push messages" +msgstr "" + +msgid "Push-proxy UDP relayed messages" +msgstr "" + +msgid "Push-proxy TCP relayed messages" +msgstr "" + +msgid "Push-proxy TCP for FW<->FW transfers" +msgstr "" + +msgid "Push-proxy broadcasted messages" +msgstr "" + +msgid "Push-proxy found un-proxied local route" +msgstr "" + +msgid "Push-proxy lookup failures" +msgstr "" + +msgid "Push relayed via local route" +msgstr "" + +msgid "Push relayed via routing table" +msgstr "" + +msgid "Locally generated dynamic queries" +msgstr "" + +msgid "Leaf-generated dynamic queries" +msgstr "" + +msgid "OOB-proxied leaf queries" +msgstr "" + +msgid "Fully completed dynamic queries" +msgstr "" + +msgid "Partially completed dynamic queries" +msgstr "" + +msgid "Dynamic queries ended with no results" +msgstr "" + +msgid "Fully completed dynamic queries getting late results" +msgstr "" + +msgid "Dynamic queries with partial late results" +msgstr "" + +msgid "Dynamic queries completed by late results" +msgstr "" + +msgid "Queries seen from GTKG" +msgstr "" + +msgid "Queries seen from GTKG that were re-queries" +msgstr "" + +msgid "Queries advertising support of GGEP \"H\"" +msgstr "" + +msgid "Queries advertising support of semi-reliable UDP" +msgstr "" + +msgid "GIV callbacks received" +msgstr "" + +msgid "GIV discarded due to no suitable download" +msgstr "" + +msgid "QUEUE callbacks received" +msgstr "" + +msgid "QUEUE discarded due to no suitable download" +msgstr "" + +msgid "File descriptors banned running count" +msgstr "" + +msgid "UDP read-ahead datagram running count" +msgstr "" + +msgid "UDP read-ahead datagram running bytes" +msgstr "" + +msgid "UDP read-ahead datagram \"old\" processed" +msgstr "" + +msgid "UDP read-ahead datagram max count" +msgstr "" + +msgid "UDP read-ahead datagram max bytes" +msgstr "" + +msgid "UDP read-ahead datagram max delay" +msgstr "" + +msgid "UDP push messages received for FW<->FW connections" +msgstr "" + +msgid "UDP push messages requesting FW<->FW connection with ourselves" +msgstr "" + +msgid "UDP push messages patched for FW<->FW connections" +msgstr "" + +msgid "UDP UHC pings received" +msgstr "" + +msgid "UDP UHC pongs sent" +msgstr "" + +msgid "UDP messages with bogus source IP" +msgstr "" + +msgid "UDP messages from shunned IP (discarded)" +msgstr "" + +msgid "UDP truncated incoming messages" +msgstr "" + +msgid "Alien UDP messages (non-Gnutella)" +msgstr "" + +msgid "Unprocessed UDP Gnutella messages" +msgstr "" + +msgid "Compressed UDP messages enqueued" +msgstr "" + +msgid "Compressed UDP messages received" +msgstr "" + +msgid "Candidates for UDP message compression" +msgstr "" + +msgid "Uncompressed UDP messages due to no gain" +msgstr "" + +msgid "Ambiguous UDP messages received" +msgstr "" + +msgid "Ambiguous UDP messages inspected more deeply" +msgstr "" + +msgid "Ambiguous UDP messages handled as semi-reliable UDP" +msgstr "" + +msgid "Semi-reliable UDP total messages given for transmission" +msgstr "" + +msgid "Semi-reliable UDP total messages deflated" +msgstr "" + +msgid "Semi-reliable UDP total messages unsent" +msgstr "" + +msgid "Semi-reliable UDP total messages dropped due to temporary ban" +msgstr "" + +msgid "Semi-reliable UDP total messages sent to known responsive hosts" +msgstr "" + +msgid "Semi-reliable UDP total messages partially sent due to clogging" +msgstr "" + +msgid "Semi-reliable UDP reliable messages given for transmission" +msgstr "" + +msgid "Semi-reliable UDP reliable messages correctly transmited" +msgstr "" + +msgid "Semi-reliable UDP reliable messages not fully acknowledged" +msgstr "" + +msgid "Semi-reliable UDP fragments sent" +msgstr "" + +msgid "Semi-reliable UDP fragments resent" +msgstr "" + +msgid "Semi-reliable UDP fragment sendings avoided" +msgstr "" + +msgid "Semi-reliable UDP fragments sent too many times" +msgstr "" + +msgid "Semi-reliable UDP total acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP spurious acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP invalid acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP acknowledgments re-queued for sending" +msgstr "" + +msgid "Semi-reliable UDP plain acknowledgments dropped" +msgstr "" + +msgid "Semi-reliable UDP enhanced acknowledgments dropped" +msgstr "" + +msgid "Semi-reliable UDP plain acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP EARs sent" +msgstr "" + +msgid "Semi-reliable UDP too many EARs sent" +msgstr "" + +msgid "Semi-reliable UDP EAR negative acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP acknowledgments received after sending EARs" +msgstr "" + +msgid "Semi-reliable UDP fragments received" +msgstr "" + +msgid "Semi-reliable UDP duplicate fragments received" +msgstr "" + +msgid "Semi-reliable UDP unreliable fragments received" +msgstr "" + +msgid "Semi-reliable UDP dropped received fragments" +msgstr "" + +msgid "Semi-reliable UDP fragments received whilst lingering" +msgstr "" + +msgid "Semi-reliable UDP messages expired before re-assembly" +msgstr "" + +msgid "Semi-reliable UDP messages re-assembled completely" +msgstr "" + +msgid "Semi-reliable UDP messages inflated successfully" +msgstr "" + +msgid "Semi-reliable UDP messages inflated incorrectly" +msgstr "" + +msgid "Semi-reliable UDP unreliable messages received" +msgstr "" + +msgid "Semi-reliable UDP empty messages received" +msgstr "" + +msgid "Semi-reliable UDP total acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP avoided acknowledgment sendings" +msgstr "" + +msgid "Semi-reliable UDP EARs received" +msgstr "" + +msgid "Semi-reliable UDP EARs received for unknown message" +msgstr "" + +msgid "Semi-reliable UDP EARs received whilst lingering" +msgstr "" + +msgid "Semi-reliable UDP fragments from hostile IP addresses" +msgstr "" + +msgid "UDP G2 hits rerouted to hub for delivery" +msgstr "" + +msgid "UDP G2 hits undelivered" +msgstr "" + +msgid "Consolidated servers (after GUID and IP address linking)" +msgstr "" + +msgid "Duplicate downloads found during server consolidation" +msgstr "" + +msgid "Discovered server GUIDs" +msgstr "" + +msgid "Changed server GUIDs" +msgstr "" + +msgid "Detected GUID collisions" +msgstr "" + +msgid "Detected collisions with our own GUID" +msgstr "" + +msgid "GUID dynamically banned" +msgstr "" + +msgid "Firewalled node info for known hosts received in upload requests" +msgstr "" + +msgid "Revitalized PUSH routes" +msgstr "" + +msgid "Collected new PUSH proxies from other query hits" +msgstr "" + +msgid "Attempted download resource switching on completion" +msgstr "" + +msgid "Attempted download resource switching after error" +msgstr "" + +msgid "Successful download resource switching (all kind)" +msgstr "" + +msgid "Successful download resource switching between plain files" +msgstr "" + +msgid "Successful download resource switching after error" +msgstr "" + +msgid "Actively queued after resource switching attempt" +msgstr "" + +msgid "Sunk HTTP reply data on error codes" +msgstr "" + +msgid "Ignored downloaded data" +msgstr "" + +msgid "Ignoring requested after data mismatch" +msgstr "" + +msgid "Ignoring requested to preserve connection" +msgstr "" + +msgid "Ignoring requested due to aggressive swarming" +msgstr "" + +msgid "Ignoring refused (data too large or server too slow)" +msgstr "" + +msgid "Client resource switching (all detected)" +msgstr "" + +msgid "Client resource switching between plain files" +msgstr "" + +msgid "Client follow-up request after HTTP error was returned" +msgstr "" + +msgid "PARQ client resource switching in slots (SHA-1 based)" +msgstr "" + +msgid "PARQ client retry-after violation" +msgstr "" + +msgid "PARQ client kicked out after too many retry-after violations" +msgstr "" + +msgid "PARQ upload slot limit overrides" +msgstr "" + +msgid "PARQ quick upload slots granted" +msgstr "" + +msgid "PARQ QUEUE sending attempts" +msgstr "" + +msgid "PARQ QUEUE messages sent" +msgstr "" + +msgid "PARQ QUEUE follow-up requests received" +msgstr "" + +msgid "Launched SHA-1 file verifications" +msgstr "" + +msgid "Launched TTH file verifications" +msgstr "" + +msgid "Re-seeding of orphan downloads through query hits" +msgstr "" + +msgid "Re-seeding of orphan downloads through upload requests" +msgstr "" + +msgid "RUDP sent bytes" +msgstr "" + +msgid "RUDP received bytes" +msgstr "" + +msgid "DHT estimated amount of nodes" +msgstr "" + +msgid "DHT standard error of estimated amount of nodes" +msgstr "" + +msgid "DHT k-ball theoretical frontier (bits)" +msgstr "" + +msgid "DHT k-ball furthest frontier (bits)" +msgstr "" + +msgid "DHT k-ball closeest frontier (bits)" +msgstr "" + +msgid "DHT routing table buckets" +msgstr "" + +msgid "DHT routing table leaves" +msgstr "" + +msgid "DHT routing table maximum depth" +msgstr "" + +msgid "DHT routing table good nodes" +msgstr "" + +msgid "DHT routing table stale nodes" +msgstr "" + +msgid "DHT routing table pending nodes" +msgstr "" + +msgid "DHT routing table evicted nodes" +msgstr "" + +msgid "DHT routing table evicted firewalled nodes" +msgstr "" + +msgid "DHT routing table evicted nodes due to quota" +msgstr "" + +msgid "DHT routing table promoted pending nodes" +msgstr "" + +msgid "DHT routing table pinged promoted nodes" +msgstr "" + +msgid "DHT routing table rejected node due to bucket network quota" +msgstr "" + +msgid "DHT routing table rejected node due to global network quota" +msgstr "" + +msgid "DHT completed bucket refreshes" +msgstr "" + +msgid "DHT forced bucket refreshes" +msgstr "" + +msgid "DHT forced bucket merges" +msgstr "" + +msgid "DHT bucket merges" +msgstr "" + +msgid "DHT bucket splits" +msgstr "" + +msgid "DHT denied non-splitable bucket refresh" +msgstr "" + +msgid "DHT initiated bucket alive checks" +msgstr "" + +msgid "DHT alive pings sent to good nodes" +msgstr "" + +msgid "DHT alive pings sent to stale nodes" +msgstr "" + +msgid "DHT alive pings sent to shutdowning nodes" +msgstr "" + +msgid "DHT alive pings avoided" +msgstr "" + +msgid "DHT alive pings skipped" +msgstr "" + +msgid "DHT revitalized stale nodes on RPC reply" +msgstr "" + +msgid "DHT value store rejected on IP/network quota grounds" +msgstr "" + +msgid "DHT value store rejected on creator validation grounds" +msgstr "" + +msgid "DHT nodes rejected during lookup based on network quota" +msgstr "" + +msgid "DHT nodes rejected during lookup based on suspicious proximity" +msgstr "" + +msgid "DHT nodes rejected during lookup based on frequency divergence" +msgstr "" + +msgid "DHT node contact IP addresses fixed during lookup" +msgstr "" + +msgid "DHT keys held" +msgstr "" + +msgid "DHT cached keys held" +msgstr "" + +msgid "DHT values held" +msgstr "" + +msgid "DHT cached KUID targets held" +msgstr "" + +msgid "DHT cached closest root nodes" +msgstr "" + +msgid "DHT cached roots exact hits" +msgstr "" + +msgid "DHT cached roots approximate hits" +msgstr "" + +msgid "DHT cached roots misses" +msgstr "" + +msgid "DHT cached roots lookups within k-ball" +msgstr "" + +msgid "DHT cached roots contact address refreshed" +msgstr "" + +msgid "DHT cached security tokens held" +msgstr "" + +msgid "DHT cached security tokens hits" +msgstr "" + +msgid "DHT stable node information held" +msgstr "" + +msgid "DHT local hits on value lookups" +msgstr "" + +msgid "DHT local hits returning values from cached keys" +msgstr "" + +msgid "DHT returned expanded values" +msgstr "" + +msgid "DHT returned values as secondary keys" +msgstr "" + +msgid "DHT claimed values via secondary keys" +msgstr "" + +msgid "DHT returned cached expanded values" +msgstr "" + +msgid "DHT returned cached values as secondary-keys" +msgstr "" + +msgid "DHT claimed cached values via secondary keys" +msgstr "" + +msgid "DHT successfully received value publications" +msgstr "" + +msgid "DHT successfully received value removals" +msgstr "" + +msgid "DHT replication of stale value avoided" +msgstr "" + +msgid "DHT replication of held values" +msgstr "" + +msgid "DHT republishing of held values" +msgstr "" + +msgid "DHT secondary-key value fetch issued" +msgstr "" + +msgid "DHT duplicate values returned in lookups" +msgstr "" + +msgid "DHT detected KUID collisions" +msgstr "" + +msgid "DHT detected collisions with our own KUID" +msgstr "" + +msgid "DHT caching attempts" +msgstr "" + +msgid "DHT caching ended successfully" +msgstr "" + +msgid "DHT caching partially completed" +msgstr "" + +msgid "DHT key-offloading checks after discovering new closest node" +msgstr "" + +msgid "DHT keys selected for offloading" +msgstr "" + +msgid "DHT key-offloading attempts" +msgstr "" + +msgid "DHT key-offloading ended successfully" +msgstr "" + +msgid "DHT key-offloading partially completed" +msgstr "" + +msgid "DHT values successfully offloaded" +msgstr "" + +msgid "DHT incoming messages" +msgstr "" + +msgid "DHT incoming messages with UDP-matching contact address" +msgstr "" + +msgid "DHT incoming messages with contact address fixed" +msgstr "" + +msgid "DHT incoming messages from hostile addresses" +msgstr "" + +msgid "DHT incoming messages with hostile contact address" +msgstr "" + +msgid "DHT RPC messages prepared" +msgstr "" + +msgid "DHT RPC messages cancelled" +msgstr "" + +msgid "DHT RPC timed out" +msgstr "" + +msgid "DHT RPC replies received" +msgstr "" + +msgid "DHT RPC replies with contact address fixed" +msgstr "" + +msgid "DHT RPC late replies received" +msgstr "" + +msgid "DHT RPC detected KUID mismatches on reply" +msgstr "" + +msgid "DHT RPC recent nodes held" +msgstr "" + +msgid "DHT node verifications" +msgstr "" + +msgid "DHT publishing attempts" +msgstr "" + +msgid "DHT publishing ended successfully (all roots)" +msgstr "" + +msgid "DHT publishing partially completed (root subset only)" +msgstr "" + +msgid "DHT publishing ending with proper value presence" +msgstr "" + +msgid "DHT value republishing occurring too late (after expiry)" +msgstr "" + +msgid "DHT publishing to self" +msgstr "" + +msgid "DHT background publishing completion attempts" +msgstr "" + +msgid "DHT background publishing completion showing improvements" +msgstr "" + +msgid "DHT background publishing completion successful (all roots)" +msgstr "" + +msgid "DHT SHA1 data type collisions" +msgstr "" + +msgid "DHT lookup path passively protected against attack" +msgstr "" + +msgid "DHT lookup path actively protected against attack" +msgstr "" + +msgid "DHT alt-loc lookups issued" +msgstr "" + +msgid "DHT push-proxy lookups issued" +msgstr "" + +msgid "DHT successful alt-loc lookups" +msgstr "" + +msgid "DHT successful push-proxy lookups" +msgstr "" + +msgid "DHT successful node push-entry lookups" +msgstr "" + +msgid "DHT re-seeding of orphan downloads" +msgstr "" + +msgid "Digests computed on general statistics" +msgstr "" + +msgid "Digests computed on TCP statistics" +msgstr "" + +msgid "Digests computed on UDP statistics" +msgstr "" + +msgid "Ping" +msgstr "" + +msgid "Pong" +msgstr "" + +msgid "Bye" +msgstr "" + +msgid "QRP" +msgstr "" + +msgid "HSEP" +msgstr "" + +msgid "RUDP" +msgstr "" + +msgid "Vendor spec." +msgstr "" + +msgid "Vendor std." +msgstr "" + +msgid "Push" +msgstr "" + +msgid "Query" +msgstr "" + +msgid "Query hit" +msgstr "" + +msgid "DHT (truncated)" +msgstr "" + +msgid "DHT Ping" +msgstr "" + +msgid "DHT Pong" +msgstr "" + +msgid "DHT Store" +msgstr "" + +msgid "DHT Store Ack" +msgstr "" + +msgid "DHT Find Node" +msgstr "" + +msgid "DHT Found Node" +msgstr "" + +msgid "DHT Find Value" +msgstr "" + +msgid "DHT Value" +msgstr "" + +msgid "G2 Crawl Request" +msgstr "" + +msgid "G2 Hub Advertisement" +msgstr "" + +msgid "G2 Hub List" +msgstr "" + +msgid "G2 Hub List Req" +msgstr "" + +msgid "G2 Hub List Ack" +msgstr "" + +msgid "G2 Local Node Info" +msgstr "" + +msgid "G2 Ping" +msgstr "" + +msgid "G2 Pong" +msgstr "" + +msgid "G2 Push" +msgstr "" + +msgid "G2 Query Key Ack" +msgstr "" + +msgid "G2 Query Key Req" +msgstr "" + +msgid "G2 Query" +msgstr "" + +msgid "G2 Query Ack" +msgstr "" + +msgid "G2 Query Hit" +msgstr "" + +msgid "G2 Query Hash Table" +msgstr "" + +msgid "G2 User Profile Check" +msgstr "" + +msgid "G2 User Profile Data" +msgstr "" + +msgid "Total" +msgstr "" + +msgid "Bad size" +msgstr "" + +msgid "Too small" +msgstr "" + +msgid "Too large" +msgstr "" + +msgid "Way too large" +msgstr "" + +msgid "Too old" +msgstr "" + +msgid "Unknown message type" +msgstr "" + +msgid "Unexpected message" +msgstr "" + +msgid "Message sent with TTL = 0" +msgstr "" + +msgid "Improper hops/ttl combination" +msgstr "" + +msgid "Max TTL exceeded" +msgstr "" + +msgid "Message throttle" +msgstr "" + +msgid "Message matched limits" +msgstr "" + +msgid "Transient node" +msgstr "" + +msgid "Unusable Pong" +msgstr "" + +msgid "Hard TTL limit reached" +msgstr "" + +msgid "Max hop count reached" +msgstr "" + +msgid "Route lost" +msgstr "" + +msgid "No route" +msgstr "" + +msgid "Duplicate message" +msgstr "" + +msgid "OOB Proxy MUID Conflict" +msgstr "" + +msgid "Message to banned GUID" +msgstr "" + +msgid "Message from banned GUID" +msgstr "" + +msgid "Node shutting down" +msgstr "" + +msgid "TX flow control" +msgstr "" + +msgid "Query text had no trailing NUL" +msgstr "" + +msgid "Query text too short" +msgstr "" + +msgid "Query had unnecessary overhead" +msgstr "" + +msgid "Query had bad URN" +msgstr "" + +msgid "Message with malformed SHA1" +msgstr "" + +msgid "Message with malformed UTF-8" +msgstr "" + +msgid "Malformed Query Hit" +msgstr "" + +msgid "Bad return address" +msgstr "" + +msgid "Hostile IP address" +msgstr "" + +msgid "Shunned IP address" +msgstr "" + +msgid "Bogus result from Morpheus" +msgstr "" + +msgid "Spam" +msgstr "" + +msgid "Evil filename" +msgstr "" + +msgid "Improper media type" +msgstr "" + +msgid "Payload inflating error" +msgstr "" + +msgid "Unknown header flags present" +msgstr "" + +msgid "Own search results" +msgstr "" + +msgid "Own queries" +msgstr "" + +msgid "Ancient query format" +msgstr "" + +msgid "Blank Servent ID" +msgstr "" + +msgid "GUESS Query missing token" +msgstr "" + +msgid "GUESS Invalid query token" +msgstr "" + +msgid "DHT Invalid security token" +msgstr "" + +msgid "DHT Too many STORE requests" +msgstr "" + +msgid "DHT Malformed message" +msgstr "" + +msgid "G2 Unexpected message" +msgstr "" + +msgid "Cannot cross networks" +msgstr "" + msgid "No proxy" msgstr "" @@ -1314,9 +2562,6 @@ msgid "Debug level for code shared between gui and core." msgstr "" -msgid "Verbosity of Bitzi related debug messages." -msgstr "" - msgid "Verbosity of URL handling related debug messages." msgstr "" @@ -1390,7 +2635,7 @@ "support." msgstr "" -msgid "For development use: track properties." +msgid "Indicates a kernel network buffer shortage." msgstr "" msgid "For development use: don't add new hosts to the host cache." @@ -1778,7 +3023,7 @@ msgid "" "Maximum amount of leaves we can accept. To be promoted Ultra, you should " -"reserve 32 bytes of bandwidth per leaf." +"reserve 32 bytes/sec of bandwidth per leaf." msgstr "" msgid "What to do with files that will be ignored for downloading." @@ -2180,7 +3425,7 @@ msgid "" "If set to TRUE, the global hostiles.txt is used as well as the private " -"$GTK_GNUTELLA_DIR/hostiles.txt. This allows to separate your private ban " +"$GTK_GNUTELLA_DIR/hostiles.txt. This allows you to separate your private ban " "list from the global one distributed with gtk-gnutella." msgstr "" @@ -2487,12 +3732,11 @@ msgid "Logged statistics level for code shared between GUI and core." msgstr "" -#, c-format msgid "" "If TRUE, the spam SHA1 database is kept in memory. If FALSE, it is kept in a " "fast disk database, which saves a large amount of core memory and reduces " "the overall footprint, at the cost of an increased I/O level. However, the " -"DB cache has typically a 90% hit rate, so the actual overhead is barely " +"DB cache has a 90 percent hit rate, so the actual overhead is barely " "noticeable when running as an ultra node and should remain completely " "unnoticed when running as a leaf." msgstr "" @@ -2849,85 +4093,185 @@ msgid "Debug level for GUID management." msgstr "" -msgid "disable" +msgid "Debug level for the TX (transmit) deflating network layer." msgstr "" -msgid "by words" +msgid "Comma-separated list of TX debugging hosts (IP addresses only)" msgstr "" -msgid "by whole query" +msgid "" +"Comma-separated list of hosts for whom we want to dump RX traffic (IP " +"addresses only)" msgstr "" -msgid "by router" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they emit " +"(IP addresses only)" msgstr "" -msgid "TCP & UDP" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they " +"receive (IP addresses only)" msgstr "" -msgid "TCP only" +msgid "" +"Allow GUESS to use some of the unused Gnutella outgoing bandwidth regardless " +"of the GUESS bandwidth hint. If FALSE, only the configured bandwidth hint " +"will be used. When running as a leaf this should be set to TRUE to make " +"GUESS queries run faster." msgstr "" -msgid "UDP only" +msgid "Debug level for the UDP TX scheduler." msgstr "" -msgid "Ping" +msgid "" +"Debugging flags for the semi-reliable UDP TX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: transmissions, 16: timeouts." msgstr "" -msgid "Pong" +msgid "Comma-separated list of RX debugging hosts (IP addresses only)" msgstr "" -msgid "Bye" +msgid "" +"Debugging flags for the semi-reliable UDP RX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: receptions, 16: timeouts." msgstr "" -msgid "QRP" +msgid "Whether to log sent semi-reliable UDP messages." msgstr "" -msgid "HSEP" +msgid "Whether to log received semi-reliable UDP messages." msgstr "" -msgid "RUDP" +msgid "Debug level for the secured OOB query hit claiming." msgstr "" -msgid "Vendor spec." +msgid "Whether to log sent vendor messages." msgstr "" -msgid "Vendor std." +msgid "Whether to log received vendor messages." msgstr "" -msgid "Push" +msgid "Debugging flags for the DHT token cache (developers only)." msgstr "" -msgid "Query" +msgid "Whether to log weird DHT message headers when debugging." msgstr "" -msgid "Query Hit" +msgid "Debug level for the DHT Remote Procedure Call (RPC) code." msgstr "" -msgid "DHT Ping" +msgid "Whether to log UHC pings we receive." msgstr "" -msgid "DHT Pong" +msgid "Whether to log UHC pings we emit." msgstr "" -msgid "DHT Store" +msgid "Whether the program was properly shutdown." msgstr "" -msgid "DHT Store Ack" +msgid "Whether the program restarted after a clean shutdown." msgstr "" -msgid "DHT Find Node" +msgid "Debug level for DHT key management." msgstr "" -msgid "DHT Found Node" +msgid "Debug level for DHT value management." msgstr "" -msgid "DHT Find Value" +msgid "ID of the current process." msgstr "" -msgid "DHT Value" +msgid "Debug level for HTTP range parsing / handling." msgstr "" -msgid "Total" +msgid "" +"Lease time when installing port mappings via UPnP or NAT-PMP, in seconds. A " +"value of 0 requests permanent mappings." +msgstr "" + +msgid "Whether the program is auto-restarting at the user's request." +msgstr "" + +msgid "Debug level for time management." +msgstr "" + +msgid "Debug level for the tmalloc() thread-magazine object distributor." +msgstr "" + +msgid "Debug level for the event queue thread." +msgstr "" + +msgid "Maximum number of G2 hubs in the hub cache." +msgstr "" + +msgid "Current number of IPv4 hosts in the G2 hub caches." +msgstr "" + +msgid "Whether the G2 protocol should be enabled." +msgstr "" + +msgid "Number of G2 nodes currently connected." +msgstr "" + +msgid "Maximum amount of G2 hubs we should connect to as a leaf." +msgstr "" + +msgid "Whether to log bad G2 messages, corrupted or unexpected." +msgstr "" + +msgid "Whether to log dropped G2 messages" +msgstr "" + +msgid "Debug level for the G2 RPC layer." +msgstr "" + +msgid "Whether to log summary of received query hits" +msgstr "" + +msgid "Whether to log summary of each record in received query hits" +msgstr "" + +msgid "Number of G2 browsing requests received in this session." +msgstr "" + +msgid "Number of G2 browsing requests fully served in this session." +msgstr "" + +msgid "Whether to log G2 messages we're attempting to send" +msgstr "" + +msgid "" +"Timestamp at which the current session was started. This stamp remains " +"unchanged when gtk-gnutella restarts after a crash or an explicit restart " +"request." +msgstr "" + +msgid "No TCP listening socket bound to allow incoming connections." +msgstr "" + +msgid "disable" +msgstr "" + +msgid "by words" +msgstr "" + +msgid "by whole query" +msgstr "" + +msgid "by router" +msgstr "" + +msgid "TCP & UDP" +msgstr "" + +msgid "TCP only" +msgstr "" + +msgid "UDP only" +msgstr "" + +msgid "Query Hit" msgstr "" msgid "Icons" @@ -3356,7 +4700,7 @@ msgstr "" msgid "" -"Discard search results whith an alien IP address, not matching the one from " +"Discard search results with an alien IP address, not matching the one from " "which the results come from." msgstr "" @@ -3365,6 +4709,17 @@ "be restarted when gtk-gnutella is launched." msgstr "" +msgid "Discard search results coming from servents with a banned GUID." +msgstr "" + +msgid "Whether a summary line with GUESS search stats should be displayed." +msgstr "" + +msgid "" +"Whether the GUESS summary line should show total statistics or ones " +"pertaining to the current search only." +msgstr "" + msgid "Anonymizing proxies" msgstr "" @@ -3452,6 +4807,9 @@ msgid "Benin" msgstr "" +msgid "Saint Barthelemy" +msgstr "" + msgid "Bermuda" msgstr "" @@ -3461,6 +4819,9 @@ msgid "Bolivia" msgstr "" +msgid "Bonaire, Sint Eustatius and Saba" +msgstr "" + msgid "Brazil" msgstr "" @@ -3470,6 +4831,9 @@ msgid "Bhutan" msgstr "" +msgid "Burma" +msgstr "" + msgid "Bouvet Island" msgstr "" @@ -3530,6 +4894,9 @@ msgid "Cape Verde" msgstr "" +msgid "Curacao" +msgstr "" + msgid "Christmas Island" msgstr "" @@ -3995,12 +5362,18 @@ msgid "Suriname" msgstr "" +msgid "South Sudan" +msgstr "" + msgid "Sao Tome and Principe" msgstr "" msgid "El Salvador" msgstr "" +msgid "Sint Maarten" +msgstr "" + msgid "Syrian Arab Republic" msgstr "" @@ -4204,6 +5577,14 @@ msgid "Interactive mode turned off." msgstr "" +#, c-format +msgid "Unknown operation \"show %s\"" +msgstr "" + +#, c-format +msgid "Unknown operation \"%s\"" +msgstr "" + msgid "Cannot determine current working directory" msgstr "" @@ -4219,15 +5600,11 @@ msgstr "" #, c-format -msgid "Unknown operation \"%s\"" -msgstr "" - -#, c-format -msgid "Unknown operation \"show %s\"" +msgid "Unknown operation \"stats %s\"" msgstr "" #, c-format -msgid "Unknown operation \"stats %s\"" +msgid "Unknown operation \"check %s\"" msgstr "" #, c-format @@ -4271,6 +5648,9 @@ msgid "Good bye" msgstr "" +msgid "Invalid command syntax" +msgstr "" + msgid "Query string missing" msgstr "" @@ -4289,6 +5669,9 @@ msgid "Value missing" msgstr "" +msgid "Property cannot be changed" +msgstr "" + #, c-format msgid "Previous value was %s" msgstr "" @@ -4309,10 +5692,11 @@ msgid "unterminated single-quoted string" msgstr "" -msgid "Invalid command syntax" +msgid "too many arguments in command" msgstr "" -msgid "too many arguments in command" +#, c-format +msgid "un-parseable argument #%u in command" msgstr "" msgid "Malformed command" @@ -4325,48 +5709,6 @@ msgid "Help: " msgstr "" -msgid "Bitzi|Unknown" -msgstr "" - -msgid "Bitzi|Unrated" -msgstr "" - -msgid "Bitzi|Bitzi lookup failure" -msgstr "" - -msgid "Bitzi|Filesize mismatch" -msgstr "" - -msgid "Bitzi|Dangerous/Misleading" -msgstr "" - -msgid "Bitzi|Incomplete/Damaged" -msgstr "" - -msgid "Bitzi|Substandard" -msgstr "" - -msgid "Bitzi|Overrated" -msgstr "" - -msgid "Bitzi|Normal" -msgstr "" - -msgid "Bitzi|Underrated" -msgstr "" - -msgid "Bitzi|Complete" -msgstr "" - -msgid "Bitzi|Recommended" -msgstr "" - -msgid "Bitzi|Best Version" -msgstr "" - -msgid "No other data" -msgstr "" - msgid "Filename" msgstr "" @@ -4392,10 +5734,16 @@ msgid "Tigertree" msgstr "" -msgid "External metadata" +msgid "Rescheduled for" +msgstr "" + +msgid "Restartable since" msgstr "" -msgid "Bitzi URL" +msgid "rescheduled for" +msgstr "" + +msgid "restartable since" msgstr "" #, c-format @@ -4525,9 +5873,6 @@ msgid "Awaiting data" msgstr "" -msgid "Unknown error" -msgstr "" - #, c-format msgid "Retry in %us" msgstr "" @@ -4785,621 +6130,6 @@ msgid "RETURN" msgstr "" -msgid "Query hit" -msgstr "" - -msgid "DHT (truncated)" -msgstr "" - -msgid "Routing errors" -msgstr "" - -msgid "Routing table chunks" -msgstr "" - -msgid "Routing table message capacity" -msgstr "" - -msgid "Routing table message count" -msgstr "" - -msgid "Duplicates with higher TTL" -msgstr "" - -msgid "SPAM SHA1 database hits" -msgstr "" - -msgid "SPAM filename and size hits" -msgstr "" - -msgid "SPAM fake hits" -msgstr "" - -msgid "SPAM duplicate hits" -msgstr "" - -msgid "SPAM dynamically caught hostile IP addresses" -msgstr "" - -msgid "SPAM dynamically caught hostile IP held" -msgstr "" - -msgid "SPAM spotted spamming IP addresses held" -msgstr "" - -msgid "Searches to local DB" -msgstr "" - -msgid "Hits on local DB" -msgstr "" - -msgid "Hits on local partial files" -msgstr "" - -msgid "Hits on \"what's new?\" queries" -msgstr "" - -msgid "Query hits received for local queries" -msgstr "" - -msgid "Query hits received for OOB-proxied queries" -msgstr "" - -msgid "Queries requesting OOB hit delivery" -msgstr "" - -msgid "Stripped OOB flag on queries" -msgstr "" - -msgid "Duplicate OOB-proxied queries" -msgstr "" - -msgid "OOB hits received for OOB-proxied queries" -msgstr "" - -msgid "OOB hits bearing alien IP address" -msgstr "" - -msgid "OOB hits ignored due to identified spamming address" -msgstr "" - -msgid "Unclaimed locally-generated OOB hits" -msgstr "" - -msgid "Partially claimed locally-generated OOB hits" -msgstr "" - -msgid "Spurious OOB hit claiming received" -msgstr "" - -msgid "Unrequested OOB hits received" -msgstr "" - -msgid "Received query hits for untracked queries" -msgstr "" - -msgid "Tracked query MUIDs" -msgstr "" - -msgid "Compacted queries" -msgstr "" - -msgid "Bytes saved by compacting" -msgstr "" - -msgid "UTF8 queries" -msgstr "" - -msgid "SHA1 queries" -msgstr "" - -msgid "\"What's New?\" queries" -msgstr "" - -msgid "GUESS queries" -msgstr "" - -msgid "GUESS queries (0.2)" -msgstr "" - -msgid "GUESS cached query keys held" -msgstr "" - -msgid "GUESS cached 0.2 hosts held" -msgstr "" - -msgid "GUESS locally generated queries" -msgstr "" - -msgid "GUESS currently running queries" -msgstr "" - -msgid "GUESS hits received for locally generated queries" -msgstr "" - -msgid "GUESS hosts queried" -msgstr "" - -msgid "GUESS hosts sending back an acknowledgment" -msgstr "" - -msgid "Broadcasted push messages" -msgstr "" - -msgid "Push-proxy UDP relayed messages" -msgstr "" - -msgid "Push-proxy TCP relayed messages" -msgstr "" - -msgid "Push-proxy broadcasted messages" -msgstr "" - -msgid "Push-proxy found un-proxied local route" -msgstr "" - -msgid "Push-proxy lookup failures" -msgstr "" - -msgid "Push relayed via local route" -msgstr "" - -msgid "Push relayed via routing table" -msgstr "" - -msgid "Locally generated dynamic queries" -msgstr "" - -msgid "Leaf-generated dynamic queries" -msgstr "" - -msgid "OOB-proxied leaf queries" -msgstr "" - -msgid "Fully completed dynamic queries" -msgstr "" - -msgid "Partially completed dynamic queries" -msgstr "" - -msgid "Dynamic queries ended with no results" -msgstr "" - -msgid "Fully completed dynamic queries getting late results" -msgstr "" - -msgid "Dynamic queries with partial late results" -msgstr "" - -msgid "Dynamic queries completed by late results" -msgstr "" - -msgid "Queries seen from GTKG" -msgstr "" - -msgid "Queries seen from GTKG that were re-queries" -msgstr "" - -msgid "Queries advertising support of GGEP \"H\"" -msgstr "" - -msgid "GIV callbacks received" -msgstr "" - -msgid "GIV discarded due to no suitable download" -msgstr "" - -msgid "QUEUE callbacks received" -msgstr "" - -msgid "QUEUE discarded due to no suitable download" -msgstr "" - -msgid "UDP messages with bogus source IP" -msgstr "" - -msgid "Alien UDP messages (non-Gnutella)" -msgstr "" - -msgid "Unprocessed UDP Gnutella messages" -msgstr "" - -msgid "Compressed UDP messages enqueued" -msgstr "" - -msgid "Compressed UDP messages received" -msgstr "" - -msgid "Uncompressed UDP messages due to no gain" -msgstr "" - -msgid "Consolidated servers (after GUID and IP address linking)" -msgstr "" - -msgid "Duplicate downloads found during server consolidation" -msgstr "" - -msgid "Discovered server GUIDs" -msgstr "" - -msgid "Changed server GUIDs" -msgstr "" - -msgid "Detected GUID collisions" -msgstr "" - -msgid "Detected collisions with our own GUID" -msgstr "" - -msgid "GUID dynamically banned" -msgstr "" - -msgid "Firewalled node info for known hosts received in upload requests" -msgstr "" - -msgid "Revitalized PUSH routes" -msgstr "" - -msgid "Collected new PUSH proxies from other query hits" -msgstr "" - -msgid "Attempted download resource switching on completion" -msgstr "" - -msgid "Attempted download resource switching after error" -msgstr "" - -msgid "Successful download resource switching (all kind)" -msgstr "" - -msgid "Successful download resource switching between plain files" -msgstr "" - -msgid "Successful download resource switching after error" -msgstr "" - -msgid "Actively queued after resource switching attempt" -msgstr "" - -msgid "Sunk HTTP reply data on error codes" -msgstr "" - -msgid "Ignored downloaded data" -msgstr "" - -msgid "Ignoring requested after data mismatch" -msgstr "" - -msgid "Ignoring requested to preserve connection" -msgstr "" - -msgid "Ignoring requested due to aggressive swarming" -msgstr "" - -msgid "Ignoring refused (data too large or server too slow)" -msgstr "" - -msgid "Client resource switching (all detected)" -msgstr "" - -msgid "Client resource switching between plain files" -msgstr "" - -msgid "Client follow-up request after HTTP error was returned" -msgstr "" - -msgid "PARQ client resource switching in slots (SHA-1 based)" -msgstr "" - -msgid "PARQ client retry-after violation" -msgstr "" - -msgid "PARQ client kicked out after too many retry-after violations" -msgstr "" - -msgid "PARQ upload slot limit overrides" -msgstr "" - -msgid "PARQ quick upload slots granted" -msgstr "" - -msgid "PARQ QUEUE sending attempts" -msgstr "" - -msgid "PARQ QUEUE messages sent" -msgstr "" - -msgid "PARQ QUEUE follow-up requests received" -msgstr "" - -msgid "Launched SHA-1 file verifications" -msgstr "" - -msgid "Launched TTH file verifications" -msgstr "" - -msgid "Bitzi tickets held" -msgstr "" - -msgid "Re-seeding of orphan downloads through query hits" -msgstr "" - -msgid "Re-seeding of orphan downloads through upload requests" -msgstr "" - -msgid "DHT estimated amount of nodes" -msgstr "" - -msgid "DHT k-ball theoretical frontier (bits)" -msgstr "" - -msgid "DHT k-ball furthest frontier (bits)" -msgstr "" - -msgid "DHT k-ball closeest frontier (bits)" -msgstr "" - -msgid "DHT routing table buckets" -msgstr "" - -msgid "DHT routing table leaves" -msgstr "" - -msgid "DHT routing table maximum depth" -msgstr "" - -msgid "DHT routing table good nodes" -msgstr "" - -msgid "DHT routing table stale nodes" -msgstr "" - -msgid "DHT routing table pending nodes" -msgstr "" - -msgid "DHT routing table evicted nodes" -msgstr "" - -msgid "DHT routing table evicted firewalled nodes" -msgstr "" - -msgid "DHT routing table evicted nodes due to quota" -msgstr "" - -msgid "DHT routing table promoted pending nodes" -msgstr "" - -msgid "DHT routing table pinged promoted nodes" -msgstr "" - -msgid "DHT routing table rejected node due to bucket network quota" -msgstr "" - -msgid "DHT routing table rejected node due to global network quota" -msgstr "" - -msgid "DHT completed bucket refreshes" -msgstr "" - -msgid "DHT forced bucket refreshes" -msgstr "" - -msgid "DHT forced bucket merges" -msgstr "" - -msgid "DHT denied non-splitable bucket refresh" -msgstr "" - -msgid "DHT initiated bucket alive checks" -msgstr "" - -msgid "DHT alive pings sent to good nodes" -msgstr "" - -msgid "DHT alive pings sent to stale nodes" -msgstr "" - -msgid "DHT alive pings sent to shutdowning nodes" -msgstr "" - -msgid "DHT alive pings avoided" -msgstr "" - -msgid "DHT alive pings skipped" -msgstr "" - -msgid "DHT revitalized stale nodes on RPC reply" -msgstr "" - -msgid "DHT value store rejected on IP/network quota grounds" -msgstr "" - -msgid "DHT value store rejected on creator validation grounds" -msgstr "" - -msgid "DHT nodes rejected during lookup based on network quota" -msgstr "" - -msgid "DHT nodes rejected during lookup based on suspicious proximity" -msgstr "" - -msgid "DHT nodes rejected during lookup based on frequency divergence" -msgstr "" - -msgid "DHT keys held" -msgstr "" - -msgid "DHT cached keys held" -msgstr "" - -msgid "DHT values held" -msgstr "" - -msgid "DHT cached KUID targets held" -msgstr "" - -msgid "DHT cached closest root nodes" -msgstr "" - -msgid "DHT cached roots exact hits" -msgstr "" - -msgid "DHT cached roots approximate hits" -msgstr "" - -msgid "DHT cached roots misses" -msgstr "" - -msgid "DHT cached roots lookups within k-ball" -msgstr "" - -msgid "DHT cached roots contact address refreshed" -msgstr "" - -msgid "DHT cached security tokens held" -msgstr "" - -msgid "DHT cached security tokens hits" -msgstr "" - -msgid "DHT stable node information held" -msgstr "" - -msgid "DHT local hits on value lookups" -msgstr "" - -msgid "DHT local hits returning values from cached keys" -msgstr "" - -msgid "DHT returned expanded values" -msgstr "" - -msgid "DHT returned values as secondary keys" -msgstr "" - -msgid "DHT claimed values via secondary keys" -msgstr "" - -msgid "DHT returned cached expanded values" -msgstr "" - -msgid "DHT returned cached values as secondary-keys" -msgstr "" - -msgid "DHT claimed cached values via secondary keys" -msgstr "" - -msgid "DHT successfully received value publications" -msgstr "" - -msgid "DHT successfully received value removals" -msgstr "" - -msgid "DHT replication of stale value avoided" -msgstr "" - -msgid "DHT replication of held values" -msgstr "" - -msgid "DHT republishing of held values" -msgstr "" - -msgid "DHT secondary-key value fetch issued" -msgstr "" - -msgid "DHT duplicate values returned in lookups" -msgstr "" - -msgid "DHT detected KUID collisions" -msgstr "" - -msgid "DHT detected collisions with our own KUID" -msgstr "" - -msgid "DHT detected KUID mismatches on RPC reply" -msgstr "" - -msgid "DHT caching attempts" -msgstr "" - -msgid "DHT caching ended successfully" -msgstr "" - -msgid "DHT caching partially completed" -msgstr "" - -msgid "DHT key-offloading checks after discovering new closest node" -msgstr "" - -msgid "DHT keys selected for offloading" -msgstr "" - -msgid "DHT key-offloading attempts" -msgstr "" - -msgid "DHT key-offloading ended successfully" -msgstr "" - -msgid "DHT key-offloading partially completed" -msgstr "" - -msgid "DHT values successfully offloaded" -msgstr "" - -msgid "DHT publishing attempts" -msgstr "" - -msgid "DHT publishing ended successfully (all roots)" -msgstr "" - -msgid "DHT publishing partially completed (root subset only)" -msgstr "" - -msgid "DHT publishing ending with proper value presence" -msgstr "" - -msgid "DHT value republishing occurring too late (after expiry)" -msgstr "" - -msgid "DHT publishing to self" -msgstr "" - -msgid "DHT background publishing completion attempts" -msgstr "" - -msgid "DHT background publishing completion showing improvements" -msgstr "" - -msgid "DHT background publishing completion successful (all roots)" -msgstr "" - -msgid "DHT SHA1 data type collisions" -msgstr "" - -msgid "DHT lookup path passively protected against attack" -msgstr "" - -msgid "DHT lookup path actively protected against attack" -msgstr "" - -msgid "DHT alt-loc lookups issued" -msgstr "" - -msgid "DHT push-proxy lookups issued" -msgstr "" - -msgid "DHT successful alt-loc lookups" -msgstr "" - -msgid "DHT successful push-proxy lookups" -msgstr "" - -msgid "DHT successful node push-entry lookups" -msgstr "" - -msgid "DHT re-seeding of orphan downloads" -msgstr "" - msgid "node" msgid_plural "nodes" msgstr0 "" @@ -5610,12 +6340,6 @@ msgid "Bind to this address" msgstr "" -msgid "Bitzi Metadata" -msgstr "" - -msgid "Bitzi metadata" -msgstr "" - msgid "Browse Host" msgstr "" @@ -7246,7 +7970,7 @@ msgid "Disabled stealing of outgoing HTTP bandwidth." msgstr "" -msgid "Splitting ougoing HTTP bandwidth evenly." +msgid "Splitting outgoing HTTP bandwidth evenly." msgstr "" msgid "Capping HTTP outgoing bandwidth." @@ -7255,7 +7979,10 @@ msgid "Port mapping possible through UPnP or NAT-PMP." msgstr "" -msgid "Port mapping configured through UPnP or NAT-PMP." +msgid "Port mapping configured through NAT-PMP." +msgstr "" + +msgid "Port mapping configured through UPnP." msgstr "" msgid "Enable UPnP" @@ -7270,7 +7997,7 @@ msgid "Pipelining max chunk size" msgstr "" -msgid "Enable upload of patial files deemed rare" +msgid "Enable upload of partial files deemed rare" msgstr "" msgid "Enable GUESS (additional querying)" @@ -7339,6 +8066,9 @@ msgid "Discard results bearing an alien IP address" msgstr "" +msgid "Discard results bearing a banned GUID" +msgstr "" + msgid "Restart session-only searches with pending downloads" msgstr "" @@ -7354,7 +8084,22 @@ msgid "Relayed queries remembered" msgstr "" -msgid "Not in database" +msgid "Allow unused Gnutella outgoing bandwidth to supersede hint" +msgstr "" + +msgid "Display GUESS statistics" +msgstr "" + +msgid "Mapping lease time" +msgstr "" + +msgid "G2 hubs" +msgstr "" + +msgid "Enable the G2 network" +msgstr "" + +msgid " G2, " msgstr "" msgid "owned" @@ -7378,9 +8123,6 @@ msgstr0 "" msgstr1 "" -msgid "Query queued..." -msgstr "" - #, c-format msgid "%u term counted" msgid_plural "%u terms counted" @@ -7422,6 +8164,9 @@ msgid "_Auto-hide leaf traffic stats" msgstr "" +msgid "Glossary" +msgstr "" + msgid "_Search" msgstr "" @@ -7434,9 +8179,6 @@ msgid "CPU overloaded" msgstr "" -msgid "Splitting outgoing HTTP bandwidth evenly." -msgstr "" - msgid "Connect to" msgstr "" @@ -7478,12 +8220,18 @@ msgid "Served " msgstr "" -msgid "BH HTML served" +msgid "G2 served" msgstr "" msgid " / " msgstr "" +msgid "G2" +msgstr "" + +msgid "BH HTML served" +msgstr "" + msgid "BH HTML" msgstr "" @@ -7567,9 +8315,6 @@ msgid "Maximum percentage of connection slots a vendor can occupy." msgstr "" -msgid "Global DHT ougoing traffic" -msgstr "" - msgid "attempts" msgstr "" @@ -7579,9 +8324,6 @@ msgid "_Remove directory" msgstr "" -msgid "Enable upload of partial files deemed rare" -msgstr "" - msgid "Minimum chunk _size" msgstr "" @@ -7628,6 +8370,9 @@ msgid "Reverse lookup in progress..." msgstr "" +msgid "UDP (semi-reliable)" +msgstr "" + msgid "Size:" msgstr "" @@ -7652,6 +8397,12 @@ msgid "Valid IPv6 ultra" msgstr "" +msgid "Fresh G2 hub" +msgstr "" + +msgid "Valid G2 hub" +msgstr "" + msgid "Unstable" msgstr "" @@ -7690,6 +8441,11 @@ "sourceforge.net/?page=faq\">FAQ online</a> instead.</p></body></html>" msgstr "" +msgid "" +"<html><head><title>Glossary</title></head><body><p>The glossary document " +"could not be loaded.</p></body></html>" +msgstr "" + #, c-format msgid "%lu file shared (%s)" msgid_plural "%lu files shared (%s)" @@ -7721,6 +8477,9 @@ msgid "UNKNOWN STATUS" msgstr "" +msgid "g2" +msgstr "" + msgid "busy" msgstr "" @@ -7763,6 +8522,12 @@ msgstr "" #, c-format +msgid " %u download" +msgid_plural " %u downloads" +msgstr0 "" +msgstr1 "" + +#, c-format msgid "" "%u %s (%u skipped, %u ignored, %u hidden, %u auto-d/l, %u %s) Hits: %u (%u " "TCP, %u UDP)" @@ -7778,6 +8543,63 @@ msgstr0 "" msgstr1 "" +msgid "No GUESS queries run yet" +msgstr "" + +#, c-format +msgid " previous took %s querying %zu %s with %zu %s kept" +msgstr "" + +msgid "host" +msgid_plural "hosts" +msgstr0 "" +msgstr1 "" + +msgid "hit" +msgid_plural "hits" +msgstr0 "" +msgstr1 "" + +#, c-format +msgid "GUESS %s Total: %zu %s (%s %s, %s kept, %s queries, %s keys)%s" +msgstr "" + +msgid "idle" +msgstr "" + +msgid "query" +msgid_plural "queries" +msgstr0 "" +msgstr1 "" + +#, c-format +msgid "" +"GUESS %s %s (%zu %s, %zu kept, %s queries, %s keys) Pool: %zu %s, (%zu+" +"%zu)/%zu queried, %zu %s (%.2f%%), %zu reached, %zu pending, %zu %s%s%s" +msgstr "" + +msgid "loose" +msgstr "" + +msgid "bounded" +msgstr "" + +msgid "ack" +msgid_plural "acks" +msgstr0 "" +msgstr1 "" + +msgid "hop" +msgid_plural "hops" +msgstr0 "" +msgstr1 "" + +msgid " (load pending)" +msgstr "" + +msgid " (end if starving)" +msgstr "" + msgid "Passive" msgstr "" @@ -7893,6 +8715,16 @@ msgid "Partial" msgstr "" +#, c-format +msgid "%s %.2f%%" +msgstr "" + +msgid "Available" +msgstr "" + +msgid "Last modification" +msgstr "" + msgid "Latinized" msgstr "" @@ -7908,6 +8740,9 @@ msgid "Hostname" msgstr "" +msgid "banned" +msgstr "" + msgid "Servent ID" msgstr "" @@ -7965,24 +8800,12 @@ msgid "The URN in the search text is invalid." msgstr "" -msgid "SHA-1 is unknown." -msgstr "" - -msgid "No Bitzi ticket requested yet." -msgstr "" - -msgid "Not in Bitzi database." -msgstr "" - msgid "Encoding" msgstr "" msgid "#" msgstr "" -msgid "Metadata" -msgstr "" - msgid "Never" msgstr "" @@ -8015,6 +8838,12 @@ msgid "*** CPU OVERLOADED -- TRYING TO SAVE CYCLES ***" msgstr "" +msgid "*** KERNEL BUFFER SHORTAGE -- LIMITING TCP CONNECTIONS ***" +msgstr "" + +msgid "*** NO LISTENING TCP SOCKET -- NO INBOUND CONNECTIONS ***" +msgstr "" + msgid "*** UPLOADS STALLING, BANDWIDTH SHORTAGE? ***" msgstr "" @@ -8055,12 +8884,6 @@ msgstr "" #, c-format -msgid "%u/%u connection" -msgid_plural "%u/%u connections" -msgstr0 "" -msgstr1 "" - -#, c-format msgid "%u/%u upload" msgid_plural "%u/%u uploads" msgstr0 "" @@ -8075,6 +8898,9 @@ msgid "Queue frozen" msgstr "" +msgid "Internal" +msgstr "" + msgid "Select a property to see its description." msgstr ""
View file
gtk-gnutella-0.98.2.tar.bz2/po/hu.po -> gtk-gnutella-1.1.9.tar.bz2/po/hu.po
Changed
@@ -1,59 +1,55 @@ -# $Id$ -# -# Hungarian translations for gtk-gnutella package. -# Copyright (C) 2000-2001 Yann Grossel. -# Copyright (C) 2001-2010 Raphaël Manfredi. -# This file is distributed under the same license as the gtk-gnutella package. -# Sulyok Péter <sp@elte.hu>, 2003-2004. +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Raphael Manfredi +# This file is distributed under the same license as the PACKAGE package. # +# Translators: msgid "" msgstr "" -"Project-Id-Version: gtk-gnutella 0.96.7u\n" +"Project-Id-Version: gtk-gnutella\n" "Report-Msgid-Bugs-To: gtk-gnutella-devel@lists.sf.net\n" -"POT-Creation-Date: 2011-11-22 18:27+0100\n" -"PO-Revision-Date: 2005-09-11 17:19+0900\n" -"Last-Translator: Sulyok Péter <sp@elte.hu>\n" -"Language-Team: Hungarian <translation-team-hu@lists.sourceforge.net>\n" +"POT-Creation-Date: 2016-03-06 08:49+0100\n" +"PO-Revision-Date: 2016-02-15 08:28+0000\n" +"Last-Translator: Jeroen Asselman <jeroen@asselman.com>\n" +"Language-Team: Hungarian (http://www.transifex.com/gtk-gnutella/gtk-gnutella/" +"language/hu/)\n" +"Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: hu\n" -"Plural-Forms: nplurals=1; plural=0;\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" -#, c-format -msgid "%s%s%s%s%s fps, %s kbps" +msgid "Harmful version banned, upgrade required" msgstr "" -#, fuzzy -msgid "times|x" -msgstr "Futási idő" +msgid "Connection refused" +msgstr "" + +msgid "Use an open Gnutella or G2 servent" +msgstr "" #, c-format msgid "Stopped, will retry with TLS (%s)" msgstr "" -#, fuzzy, c-format +#, c-format msgid "Stopped (%s)" -msgstr "Leálltak törlése" +msgstr "" #, c-format msgid "Too many attempts (%u times)" msgstr "" -#, fuzzy msgid "Requeued due to no push-proxy" -msgstr "Adatokat igazítva újra sorbaállítva" +msgstr "" -#, fuzzy msgid "Requeued due to file removal" -msgstr "Adatokat igazítva újra sorbaállítva" +msgstr "" msgid "Requeued by file info change" msgstr "Fájl infó változás miatt újra sorban áll" -#, fuzzy msgid "Duplicate download" -msgstr "%u/%u letöltés" +msgstr "" msgid "Nothing else to switch to" msgstr "" @@ -63,26 +59,24 @@ msgstr "" #, c-format -msgid " at %s - rescheduled for %s%s #%u" +msgid " at %s" msgstr "" msgid "Suspended (SHA1 checking)" msgstr "Felfüggesztve (SHA1 ellenőrzés)" -#, fuzzy, c-format +#, c-format msgid "Ignoring requested (%s)" -msgstr "(%d%%) kérelem elküldése" +msgstr "" -#, fuzzy msgid "Paused" -msgstr "Passzív" +msgstr "" msgid "Nothing more to get" msgstr "" -#, fuzzy msgid "Waiting for a free chunk" -msgstr "SHA1 ellenőrzésre várakozás…" +msgstr "" msgid "No more gaps to fill" msgstr "" @@ -90,28 +84,29 @@ msgid "Download queue is frozen" msgstr "" -#, fuzzy +msgid "Network buffer shortage" +msgstr "" + msgid "No download slot (start)" -msgstr "Nics letöltő nyílás" +msgstr "" -#, fuzzy msgid "Connection failed (Out of file descriptors?)" -msgstr "Használt fájleírók legnagyobb százaléka" +msgstr "" -#, fuzzy msgid "Connection failed" -msgstr "Összekapcsolva" +msgstr "" + +msgid "SHA1 mismatch detected" +msgstr "SHA1 eltérés érzékelve" msgid "Waiting for server PROX publishing" msgstr "" -#, fuzzy msgid "Waiting for push route" -msgstr "SHA1 ellenőrzésre várakozás…" +msgstr "" -#, fuzzy msgid "Push route lost" -msgstr "Út elveszett" +msgstr "" msgid "Ignoring Push flag" msgstr "Nyomás-jelzés mellőzése " @@ -120,35 +115,34 @@ msgid "No direct connection yet (%u retry)" msgid_plural "No direct connection yet (%u retries)" msgstr0 "" +msgstr1 "" #, c-format msgid "Timeout (%u retry)" msgid_plural "Timeout (%u retries)" msgstr0 "" +msgstr1 "" -#, fuzzy, c-format +#, c-format msgid "Connection refused (%u retry)" msgid_plural "Connection refused (%u retries)" -msgstr0 "Kapcsolat beállítása" +msgstr0 "" +msgstr1 "" msgid "Dup SHA1 during creation" msgstr "SHA1 készítése létrehozás közben" -#, fuzzy msgid "Max. number of downloads reached" -msgstr "Eredmények leg_nagyobb száma" +msgstr "" -#, fuzzy msgid "Max. number of downloads for this host reached" -msgstr "Eredmények leg_nagyobb száma" +msgstr "" -#, fuzzy msgid "Has already enough active sources" -msgstr "Inaktív forrás" +msgstr "" -#, fuzzy msgid "download_start() failed" -msgstr "Kijelölt fájlok letöltése" +msgstr "" msgid "Stopped (Index changed)" msgstr "" @@ -159,9 +153,9 @@ msgid "Failed (Header line too large)" msgstr "" -#, fuzzy, c-format +#, c-format msgid "Failed (%s)" -msgstr "Sikertelen" +msgstr "" msgid "Failed (Input buffer full)" msgstr "" @@ -214,17 +208,14 @@ msgid "Requeued by competing download" msgstr "Vetélkedő letöltés miatt újra sorbaállítva" -#, fuzzy msgid "Weird HTTP status" -msgstr "Furcsa HTTP állapot (szinkron elvesztve?)" +msgstr "" -#, fuzzy msgid "Download was a duplicate" -msgstr "Kijelölt le_töltése" +msgstr "" -#, fuzzy msgid "Filesize mismatch" -msgstr "URN fájlinfó eltérés" +msgstr "" msgid "No URN on server (required)" msgstr "" @@ -235,13 +226,11 @@ msgid "No URN on server to validate" msgstr "" -#, fuzzy msgid "TTH mismatch detected" -msgstr "SHA1 eltérés érzékelve" +msgstr "" -#, fuzzy msgid "SHA-1 mismatch detected" -msgstr "SHA1 eltérés érzékelve" +msgstr "" msgid "URN fileinfo mismatch" msgstr "URN fájlinfó eltérés" @@ -252,13 +241,12 @@ msgid "More data to sink than expected" msgstr "" -#, fuzzy msgid "Stopped data (EOF)" -msgstr "Leálltak törlése" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Stopped data (%s)" -msgstr "Leálltak törlése" +msgstr "" #, c-format msgid "Failed (Read error: %s)" @@ -267,17 +255,18 @@ msgid "Timeout reading HTTP status" msgstr "" -#, fuzzy msgid "Timeout reading headers" -msgstr "Fejlécek olvasása" +msgstr "" #, c-format msgid "No support for Content-Encoding (%s)" msgstr "" -#, fuzzy +msgid "Incomplete headers during TLS upgrade" +msgstr "" + msgid "Spammer detected" -msgstr "SHA1 eltérés érzékelve" +msgstr "" msgid "Partial file, bad HTTP keep-alive support" msgstr "" @@ -289,9 +278,8 @@ msgid "Partial file, no suitable range found yet" msgstr "" -#, fuzzy msgid "Partial file on server, waiting" -msgstr "Részleges fájlmegosztás (zsúfolás)" +msgstr "" #, c-format msgid "%sRequested range unavailable yet" @@ -317,17 +305,14 @@ msgid "Total/served sizes mismatch" msgstr "" -#, fuzzy msgid "Range start mismatch" -msgstr "Újrakezdi e keresést" +msgstr "" -#, fuzzy msgid "Range end too large" -msgstr "Túlontúl nagy" +msgstr "" -#, fuzzy msgid "Range mismatch" -msgstr "URN fájlinfó eltérés" +msgstr "" msgid "Weird server-side chunk shrinking" msgstr "" @@ -338,20 +323,24 @@ msgid "No Content-Length header" msgstr "" -#, fuzzy +msgid "Unexpected Content-Type" +msgstr "" + +msgid "No Content-Type" +msgstr "" + msgid "Search already closed" -msgstr "Keresések" +msgstr "" -#, fuzzy msgid "THEX download aborted" -msgstr "Letöltve" +msgstr "" msgid "Pipeline flow stopped" msgstr "" -#, fuzzy, c-format +#, c-format msgid "Cannot open %s: %s" -msgstr "Nyomás elküldése sikertelen" +msgstr "" msgid "Cannot resume: file gone" msgstr "" @@ -363,9 +352,8 @@ msgid "Stopped (Read buffer full)" msgstr "" -#, fuzzy msgid "Failed (Completed?)" -msgstr "Befejezve" +msgstr "" msgid "Could not send whole HTTP request" msgstr "" @@ -374,12 +362,8 @@ msgid "Write failed: %s" msgstr "" -#, fuzzy msgid "Malformed push reply" -msgstr "Hibás találat" - -msgid "SHA1 mismatch detected" -msgstr "SHA1 eltérés érzékelve" +msgstr "" msgid ", inbound" msgstr "" @@ -387,29 +371,35 @@ msgid ", outbound" msgstr "" -#, fuzzy +msgid ", no-pipeline" +msgstr "" + msgid ", banning" -msgstr "Foglalás" +msgstr "" -#, fuzzy msgid ", g2" -msgstr ", " +msgstr "" + +msgid ", fake-g2" +msgstr "" -#, fuzzy msgid ", vendor?" -msgstr "Eladó:" +msgstr "" + +#, c-format +msgid "<Browse G2 Host %s>" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "<Browse Host %s>" -msgstr "_Tallóz" +msgstr "" #, c-format msgid "<THEX data for %s>" msgstr "" -#, fuzzy msgid "Browse search closed" -msgstr "Keresőlista" +msgstr "" msgid "Stopped data (EOF) <download_got_eof>" msgstr "" @@ -423,55 +413,51 @@ msgid "Timeout" msgstr "Türelmi idő" -#, fuzzy msgid "Requeued due to timeout" -msgstr "Adatokat igazítva újra sorbaállítva" +msgstr "" + +msgid "Partial file removed" +msgstr "" + +msgid "File info being reset" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Downloading (TR: %s)" -msgstr "Letöltés (%.1f k/s)" +msgstr "" -#, fuzzy msgid "Seeding" -msgstr "Nyomás elküldése" +msgstr "" -#, fuzzy msgid "Computing TTH" -msgstr "SHA1 számítása (%.02f%%)" +msgstr "" -#, fuzzy msgid "Computing SHA1" -msgstr "SHA1 számítása (%.02f%%)" +msgstr "" -#, fuzzy msgid "Waiting for TTH check" -msgstr "SHA1 ellenőrzésre várakozás…" +msgstr "" -#, fuzzy msgid "Waiting for SHA1 check" -msgstr "SHA1 ellenőrzésre várakozás…" +msgstr "" -#, fuzzy msgid "SHA1" -msgstr "SHA1:" +msgstr "" msgid "OK" msgstr "JÓ" -#, fuzzy msgid "failed" -msgstr "Sikertelen" +msgstr "" msgid "not computed yet" msgstr "" -#, fuzzy msgid "Waiting for moving..." -msgstr "; Áthelyezésre várakozás…" +msgstr "" -#, fuzzy msgid "Moving" -msgstr "Eltávolítás" +msgstr "" msgid "Finished" msgstr "Befejezve" @@ -479,280 +465,150 @@ msgid "No sources" msgstr "Nincs forrás" -#, fuzzy, c-format +#, c-format msgid "Queued (%u active, %u passive)" -msgstr "Várósorban (%d aktív/ %d passzív)" +msgstr "" msgid "Waiting" msgstr "Várakozás" -#, fuzzy msgid "Querying DHT" -msgstr "Találat" +msgstr "" -#, fuzzy msgid "Pending DHT query" -msgstr "Függő helyi keresések" +msgstr "" #, c-format msgid "%u/%u successful DHT lookup" msgid_plural "%u/%u successful DHT lookups" msgstr0 "" +msgstr1 "" #, c-format msgid "%u DHT lookup" msgid_plural "%u DHT lookups" msgstr0 "" +msgstr1 "" #, c-format msgid "Got %d host from %s" msgid_plural "Got %d hosts from %s" msgstr0 "" +msgstr1 "" #, c-format -msgid "Bootstrapping from %s" +msgid "Connecting to web cache %s" msgstr "" -msgid "Bad size" -msgstr "Rossz méret" - -msgid "Too small" -msgstr "Túl kicsi" - -msgid "Too large" -msgstr "Túl nagy" - -msgid "Way too large" -msgstr "Túlontúl nagy" - -msgid "Unknown message type" -msgstr "Ismeretlen üzenetfajta" - -msgid "Unexpected message" -msgstr "Váratlan üzenet" - -msgid "Message sent with TTL = 0" -msgstr "TTL=0-val küldött üzenet" - -#, fuzzy -msgid "Improper hops/ttl combination" -msgstr "Helytelen ugrás/TTL párosítás" - -msgid "Max TTL exceeded" -msgstr "Legnagyobb TTL túllépve" - -msgid "Message throttle" -msgstr "Üzenetdobás" - -#, fuzzy -msgid "Message matched limits" -msgstr "gnutellaNet üzenetméret korlátok" - -msgid "Unusable Pong" -msgstr "Használhatatlan kop" - -msgid "Hard TTL limit reached" -msgstr "_Kemény TTL korlát elérve" - -msgid "Max hop count reached" -msgstr "Legnagyobb ugrásszám elérve" - -msgid "Route lost" -msgstr "Út elveszett" - -msgid "No route" -msgstr "Nincs út" - -msgid "Duplicate message" -msgstr "Megkettőzött üzenet" - -msgid "Message to banned GUID" -msgstr "Üzenet a kitiltott GUID-nek" - -#, fuzzy -msgid "Message from banned GUID" -msgstr "Üzenet a kitiltott GUID-nek" - -msgid "Node shutting down" -msgstr "Csomópont kilép" - -#, fuzzy -msgid "TX flow control" -msgstr "Folyamvezérlés" - -msgid "Query text had no trailing NUL" -msgstr "Keresőszöveg nincs NUL-lal lezárva" - -msgid "Query text too short" -msgstr "Keresőszöveg túl rövid" - -msgid "Query had unnecessary overhead" -msgstr "Keresőszöveg szükségtelen terheléssel" - -msgid "Query had bad URN" +#, c-format +msgid "Bootstrapping from %s" msgstr "" -msgid "Message with malformed SHA1" -msgstr "Üzenet hibás SHA1-gyel" - -msgid "Message with malformed UTF-8" -msgstr "Üzenet hibás UTF-8-cal" - -msgid "Malformed Query Hit" -msgstr "Hibás találat" - -msgid "Bad return address" +#, c-format +msgid "Shutdown (%s)" msgstr "" -msgid "Hostile IP address" -msgstr "Ellenséges IP-cím" +#, c-format +msgid "Got %d connection pong" +msgid_plural "Got %d connection pongs" +msgstr0 "" +msgstr1 "" -msgid "Bogus result from Morpheus" +msgid "Gnet connections disabled" msgstr "" -msgid "Spam" +msgid "Connection not compressed" msgstr "" -#, fuzzy -msgid "Evil filename" -msgstr "Fájlnév" - -#, fuzzy -msgid "Improper media type" -msgstr "Keresés" - -msgid "Payload inflating error" +#, c-format +msgid "Too many G2 hubs (%u max)" msgstr "" -msgid "Unknown header flags present" +#, c-format +msgid "Too many leaves (%d max)" msgstr "" -#, fuzzy -msgid "Own search results" -msgstr "Keresési eredmények" - -#, fuzzy -msgid "Own queries" -msgstr "RX keresések" - -msgid "Ancient query format" +#, c-format +msgid "Too many ultra nodes (%d max)" msgstr "" -#, fuzzy -msgid "Blank Servent ID" -msgstr "Kiszolgáló-azonosító:" - -msgid "GUESS Query missing token" +#, c-format +msgid "Rejected normal node (%d max)" msgstr "" -msgid "GUESS Invalid query token" +msgid "Rejected leaf node" msgstr "" -msgid "DHT Invalid security token" +#, c-format +msgid "Too many nodes (%d max)" msgstr "" -msgid "DHT Too many STORE requests" +msgid "Sent shielded indication" msgstr "" -#, fuzzy -msgid "DHT Malformed message" -msgstr "A gui hibajavítási szintje" - -#, c-format -msgid "Shutdown (%s)" +msgid "Not an ultra node" msgstr "" -#, fuzzy, c-format -msgid "Got %d connection pong" -msgid_plural "Got %d connection pongs" -msgstr0 "élő kapcsolatot." - -msgid "Sent crawling info" +msgid "Unknown error" msgstr "" -msgid "Cannot setup compressing TX stack" +msgid "Unstable IP address" msgstr "" -#, c-format -msgid "Got BYE %d %.*s" +msgid "Servent version appears unstable" msgstr "" -#, c-format -msgid "Weird HELLO %s" +msgid "No vendor string supplied" msgstr "" #, c-format -msgid "HELLO %s error %d (%s)" +msgid "Not connecting: %s" msgstr "" -#, fuzzy -msgid "Shielded node" -msgstr "Saját pont" - -#, fuzzy -msgid "Gnet connections disabled" -msgstr "gNet kapcsolatok" - -msgid "Connection not compressed" +msgid "Cannot setup compressing TX stack" msgstr "" -#, c-format -msgid "Too many leaves (%d max)" +msgid "Sent crawling info" msgstr "" #, c-format -msgid "Too many ultra nodes (%d max)" +msgid "Got BYE %d %.*s" msgstr "" #, c-format -msgid "Rejected normal node (%d max)" +msgid "Weird HELLO %s" msgstr "" -#, fuzzy -msgid "Rejected leaf node" -msgstr "Saját pont" - #, c-format -msgid "Too many nodes (%d max)" +msgid "HELLO %s error %d (%s)" msgstr "" -msgid "Sent shielded indication" +msgid "Shielded node" msgstr "" -#, fuzzy -msgid "Not an ultra node" -msgstr "Átjátszó üzemmód" - -#, fuzzy -msgid "Unstable IP address" -msgstr "Ellenséges IP-cím" - -msgid "Servent version appears unstable" +msgid "Protocol not acceptable" msgstr "" -msgid "No vendor string supplied" +msgid "Conflict" msgstr "" -#, fuzzy, c-format -msgid "Not connecting: %s" -msgstr "gNet kapcsolatok" - -msgid "Protocol not acceptable" +msgid "Upgrade Header Missing" msgstr "" msgid "Servent Shutdown" msgstr "" -#, fuzzy msgid "Not a network member" -msgstr "Gnutella hálózati üzemmód" +msgstr "" + +msgid "Need a G2 Hub" +msgstr "" msgid "Too frequent crawling" msgstr "" -#, fuzzy msgid "Already connected to this GUID" -msgstr "Már nincs kapcsolatban" +msgstr "" #, c-format msgid "Vendor would exceed %d%% of our slots" @@ -767,13 +623,12 @@ msgid "Cannot connect to a crawler" msgstr "" -#, fuzzy msgid "Not becoming a leaf node" -msgstr "Átjátszó üzemmód" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Failed (Cannot send %s: %s)" -msgstr "Nyomás elküldése sikertelen" +msgstr "" #, c-format msgid "Failed (Cannot send %s atomically)" @@ -789,9 +644,8 @@ msgid "Failed (Input error: %s)" msgstr "" -#, fuzzy msgid "Failed (EOF)" -msgstr "Sikertelen" +msgstr "" msgid "Failed (Extra HELLO data)" msgstr "" @@ -799,28 +653,30 @@ msgid "Pseudo UDP node" msgstr "" +msgid "Pseudo semi-reliable UDP node" +msgstr "" + +msgid "Pseudo G2 UDP node" +msgstr "" + msgid "Pseudo DHT node" msgstr "" -#, fuzzy msgid "Already connected" -msgstr "Már nincs kapcsolatban" +msgstr "" -#, fuzzy msgid "Limited connection" -msgstr "Hagyományos kapcsolatok" +msgstr "" -#, fuzzy msgid "Write error during HELLO" -msgstr "Kapcsolat beállítása" +msgstr "" #, c-format msgid "Write error during HELLO: %s" msgstr "" -#, fuzzy msgid "Connection reset during HELLO" -msgstr "Kapcsolat beállítása" +msgstr "" #, c-format msgid "Kicked: %s message too big (%d bytes)" @@ -830,20 +686,17 @@ msgid "Kicked: %s message too big (>= 64KiB limit)" msgstr "" -#, fuzzy msgid "Leaf" -msgstr "Törlés" +msgstr "" -#, fuzzy msgid "Ultrapeer" -msgstr "Átjátszók" +msgstr "" msgid "Legacy" msgstr "" -#, fuzzy msgid "Crawler" -msgstr "Törlés" +msgstr "" msgid "UDP" msgstr "" @@ -851,6 +704,9 @@ msgid "DHT" msgstr "" +msgid "G2 hub" +msgstr "" + msgid "Unknown" msgstr "Ismeretlen" @@ -879,31 +735,29 @@ msgid "creating configuration directory \"%s\"" msgstr "„%s” beállításmappa teremtése" -#, fuzzy, c-format +#, c-format msgid "creating directory \"%s\" for %s" -msgstr "„%s” beállításmappa teremtése" +msgstr "" -msgid "You seem to have left another gtk-gnutella running" +#, c-format +msgid "Another gtk-gnutella supervisor is running as PID %lu" +msgstr "" + +#, c-format +msgid "Another gtk-gnutella is running as PID %lu" msgstr "" msgid "Cannot proceed without valid configuration directory" msgstr "Nem lehet továbblépni érvényes beállításmappa nélkül" -#, fuzzy msgid "Failed to create IPv4 UDP socket" -msgstr "E keresés megkettőzése" +msgstr "" -#, fuzzy msgid "Failed to create IPv6 UDP socket" -msgstr "E keresés megkettőzése" +msgstr "" -#, fuzzy msgid "Failed to create local socket" -msgstr "E keresés megkettőzése" - -#, fuzzy -msgid "Failed to create listening sockets" -msgstr "E keresés megkettőzése" +msgstr "" msgid "Can only run as a leaf when TCP-firewalled" msgstr "" @@ -914,6 +768,12 @@ msgid "Got EOF" msgstr "" +msgid "TLS handshake failed" +msgstr "" + +msgid "Connection locally failed" +msgstr "" + msgid "Write failed (Input Exception)" msgstr "" @@ -931,27 +791,114 @@ msgstr0 "" msgstr1 "" -#, fuzzy msgid "Connect back timeout" -msgstr "Csatlakozás türelmi ideje lejárt" +msgstr "" + +msgid "Request timeout" +msgstr "" msgid "Timeout waiting for follow-up" msgstr "" -#, fuzzy msgid "Lifetime expired" -msgstr "lejárt" +msgstr "" + +msgid "Unauthorized" +msgstr "" + +#, c-format +msgid "Limiting connections from %s" +msgstr "" + +msgid "No reason given" +msgstr "" + +msgid "Bad Request" +msgstr "" + +msgid "Header too large" +msgstr "" + +msgid "Input buffer full" +msgstr "" + +msgid "Extra data after HTTP header" +msgstr "" -#, fuzzy msgid "Unable to send GIV" -msgstr "Nyomás elküldése sikertelen" +msgstr "" + +msgid "Not Found" +msgstr "" + +msgid "File was modified" +msgstr "" + +msgid "Moved Permanently" +msgstr "" + +msgid "File index/name mismatch" +msgstr "" + +msgid "URN Not Found (urn:sha1)" +msgstr "" + +msgid "SHA1 is being recomputed" +msgstr "" + +msgid "Library being rebuilt" +msgstr "" + +msgid "Malformed URN in /uri-res/N2R request" +msgstr "" + +msgid "Malformed URN in /uri-res/N2X request" +msgstr "" + +msgid "TTH is being computed" +msgstr "" msgid "<Browse Host Request>" msgstr "" +msgid "Browse Host Disabled" +msgstr "" + +#, c-format +msgid "Redirected to %s:%u" +msgstr "" + +msgid "Not Modified" +msgstr "" + msgid "Stalling upload replaced" msgstr "" +msgid "Already downloading this file" +msgstr "" + +msgid "Malformed Range request" +msgstr "" + +msgid "Requested range not satisfiable" +msgstr "" + +msgid "Requested range not available yet" +msgstr "" + +msgid "Queue full" +msgstr "" + +msgid "Another connection is still active" +msgstr "" + +#, c-format +msgid "%s not honoured; removed from PARQ queue" +msgstr "" + +msgid "Minimum retry delay" +msgstr "" + #, c-format msgid "Queued (slot %d, ETA: %s)" msgstr "" @@ -959,13 +906,15 @@ msgid "Cannot send whole HTTP status" msgstr "" +msgid "Not Acceptable" +msgstr "" + #, c-format -msgid "<Browse Host Request> %s%s%s" +msgid "<Browse Host %sRequest> %s%s%s" msgstr "" -#, fuzzy msgid "query hits" -msgstr "TX találatok" +msgstr "" msgid ", deflate" msgstr "" @@ -976,6 +925,40 @@ msgid ", chunked" msgstr "" +msgid "THEX failure" +msgstr "" + +msgid "EOF while sinking" +msgstr "" + +#, c-format +msgid "Read error while sinking: %m" +msgstr "" + +msgid "Content Too Large" +msgstr "" + +msgid "Unknown/Missing Protocol Tag" +msgstr "" + +msgid "Missing Host Header" +msgstr "" + +msgid "Not Implemented" +msgstr "" + +msgid "Bad URI" +msgstr "" + +msgid "Bad Path" +msgstr "" + +msgid "No Content Allowed" +msgstr "" + +msgid "Sharing currently disabled" +msgstr "" + msgid "Write exception" msgstr "" @@ -983,9 +966,8 @@ msgid "File read error: %s" msgstr "" -#, fuzzy msgid "File EOF?" -msgstr "Sikertelen" +msgstr "" #, c-format msgid "Data write error: %s" @@ -998,13 +980,11 @@ msgid "Special read error: %s" msgstr "" -#, fuzzy msgid "Explicitly killed" -msgstr "Kifejezetten újra sorba állítva" +msgstr "" -#, fuzzy msgid "IP denying uploads" -msgstr "Folyamatban lévő feltöltések száma" +msgstr "" #, c-format msgid " - Newer versions available: release %s / from git %s" @@ -1018,9 +998,1196 @@ msgid " - Newer version available: from git %s" msgstr "" -#, fuzzy +msgid "Routing errors" +msgstr "Útválasztó hiba" + +msgid "Routing table chunks" +msgstr "" + +msgid "Routing table message capacity" +msgstr "" + +msgid "Routing table message count" +msgstr "" + +msgid "Routing through transient node avoided" +msgstr "" + +msgid "Duplicates with higher TTL" +msgstr "" + +msgid "SPAM SHA1 database hits" +msgstr "" + +msgid "SPAM filename and size hits" +msgstr "" + +msgid "SPAM fake hits" +msgstr "" + +msgid "SPAM duplicate hits" +msgstr "" + +msgid "SPAM dynamically caught hostile IP addresses" +msgstr "" + +msgid "SPAM dynamically caught hostile IP held" +msgstr "" + +msgid "SPAM spotted spamming IP addresses held" +msgstr "" + +msgid "Searches to local DB" +msgstr "Keresés helyi AB-ban" + +msgid "Hits on local DB" +msgstr "Találat helyi AB-ban" + +msgid "Hits on local partial files" +msgstr "" + +msgid "Hits on \"what's new?\" queries" +msgstr "" + +msgid "Query hits received for local queries" +msgstr "" + +msgid "G2 searches to local DB" +msgstr "" + +msgid "G2 hits on local DB" +msgstr "" + +msgid "G2 hits on local partial files" +msgstr "" + +msgid "Query hits received for OOB-proxied queries" +msgstr "" + +msgid "Queries requesting OOB hit delivery" +msgstr "" + +msgid "Stripped OOB flag on queries" +msgstr "" + +msgid "Ignored OOB queries due to unclaimed hits" +msgstr "" + +msgid "Duplicate OOB-proxied queries" +msgstr "" + +msgid "OOB hits received for OOB-proxied queries" +msgstr "" + +msgid "OOB hits bearing alien IP address" +msgstr "" + +msgid "OOB hits ignored due to identified spamming address" +msgstr "" + +msgid "OOB hits ignored due to unsecure promise from known secure host" +msgstr "" + +msgid "Unclaimed locally-generated OOB hits" +msgstr "" + +msgid "Partially claimed locally-generated OOB hits" +msgstr "" + +msgid "Spurious OOB hit claiming received" +msgstr "" + +msgid "Unrequested OOB hits received" +msgstr "" + +msgid "Received query hits for untracked queries" +msgstr "" + +msgid "Tracked query MUIDs" +msgstr "" + +msgid "Compacted queries" +msgstr "Tömörített keresések" + +msgid "Bytes saved by compacting" +msgstr "Tömörítéssel megtakarított bájtok" + +msgid "UTF8 queries" +msgstr "UTF-8-keresések" + +msgid "SHA1 queries" +msgstr "SHA1-keresések" + +msgid "\"What's New?\" queries" +msgstr "" + +msgid "UTF8 G2 queries" +msgstr "" + +msgid "SHA1 G2 queries" +msgstr "" + +msgid "GUESS queries" +msgstr "" + +msgid "GUESS queries (0.2)" +msgstr "" + +msgid "GUESS link cache size" +msgstr "" + +msgid "GUESS cached query keys held" +msgstr "" + +msgid "GUESS cached 0.2 hosts held" +msgstr "" + +msgid "GUESS cached G2 hosts held" +msgstr "" + +msgid "GUESS locally generated queries" +msgstr "" + +msgid "GUESS currently running queries" +msgstr "" + +msgid "GUESS hits received for locally generated queries" +msgstr "" + +msgid "GUESS ultra nodes queried" +msgstr "" + +msgid "GUESS ultra nodes sending back an acknowledgment" +msgstr "" + +msgid "GUESS G2 nodes queried" +msgstr "" + +msgid "GUESS G2 nodes sending back an acknowledgment" +msgstr "" + +msgid "Throttled local push messages" +msgstr "" + +msgid "Throttled received push messages" +msgstr "" + +msgid "Broadcasted push messages" +msgstr "Szórt nyomáskérelem" + +msgid "Push-proxy UDP relayed messages" +msgstr "" + +msgid "Push-proxy TCP relayed messages" +msgstr "Proxy továbbította üzenetek nyomása" + +msgid "Push-proxy TCP for FW<->FW transfers" +msgstr "" + +msgid "Push-proxy broadcasted messages" +msgstr "Proxy szórta üzenetek nyomása" + +msgid "Push-proxy found un-proxied local route" +msgstr "" + +msgid "Push-proxy lookup failures" +msgstr "Sikertelen proxy-keresés nyomása" + +msgid "Push relayed via local route" +msgstr "" + +msgid "Push relayed via routing table" +msgstr "" + +msgid "Locally generated dynamic queries" +msgstr "" + +msgid "Leaf-generated dynamic queries" +msgstr "" + +msgid "OOB-proxied leaf queries" +msgstr "" + +msgid "Fully completed dynamic queries" +msgstr "" + +msgid "Partially completed dynamic queries" +msgstr "" + +msgid "Dynamic queries ended with no results" +msgstr "" + +msgid "Fully completed dynamic queries getting late results" +msgstr "" + +msgid "Dynamic queries with partial late results" +msgstr "" + +msgid "Dynamic queries completed by late results" +msgstr "" + +msgid "Queries seen from GTKG" +msgstr "" + +msgid "Queries seen from GTKG that were re-queries" +msgstr "" + +msgid "Queries advertising support of GGEP \"H\"" +msgstr "" + +msgid "Queries advertising support of semi-reliable UDP" +msgstr "" + +msgid "GIV callbacks received" +msgstr "" + +msgid "GIV discarded due to no suitable download" +msgstr "" + +msgid "QUEUE callbacks received" +msgstr "" + +msgid "QUEUE discarded due to no suitable download" +msgstr "" + +msgid "File descriptors banned running count" +msgstr "" + +msgid "UDP read-ahead datagram running count" +msgstr "" + +msgid "UDP read-ahead datagram running bytes" +msgstr "" + +msgid "UDP read-ahead datagram \"old\" processed" +msgstr "" + +msgid "UDP read-ahead datagram max count" +msgstr "" + +msgid "UDP read-ahead datagram max bytes" +msgstr "" + +msgid "UDP read-ahead datagram max delay" +msgstr "" + +msgid "UDP push messages received for FW<->FW connections" +msgstr "" + +msgid "UDP push messages requesting FW<->FW connection with ourselves" +msgstr "" + +msgid "UDP push messages patched for FW<->FW connections" +msgstr "" + +msgid "UDP UHC pings received" +msgstr "" + +msgid "UDP UHC pongs sent" +msgstr "" + +msgid "UDP messages with bogus source IP" +msgstr "" + +msgid "UDP messages from shunned IP (discarded)" +msgstr "" + +msgid "UDP truncated incoming messages" +msgstr "" + +msgid "Alien UDP messages (non-Gnutella)" +msgstr "" + +msgid "Unprocessed UDP Gnutella messages" +msgstr "" + +msgid "Compressed UDP messages enqueued" +msgstr "" + +msgid "Compressed UDP messages received" +msgstr "" + +msgid "Candidates for UDP message compression" +msgstr "" + +msgid "Uncompressed UDP messages due to no gain" +msgstr "" + +msgid "Ambiguous UDP messages received" +msgstr "" + +msgid "Ambiguous UDP messages inspected more deeply" +msgstr "" + +msgid "Ambiguous UDP messages handled as semi-reliable UDP" +msgstr "" + +msgid "Semi-reliable UDP total messages given for transmission" +msgstr "" + +msgid "Semi-reliable UDP total messages deflated" +msgstr "" + +msgid "Semi-reliable UDP total messages unsent" +msgstr "" + +msgid "Semi-reliable UDP total messages dropped due to temporary ban" +msgstr "" + +msgid "Semi-reliable UDP total messages sent to known responsive hosts" +msgstr "" + +msgid "Semi-reliable UDP total messages partially sent due to clogging" +msgstr "" + +msgid "Semi-reliable UDP reliable messages given for transmission" +msgstr "" + +msgid "Semi-reliable UDP reliable messages correctly transmited" +msgstr "" + +msgid "Semi-reliable UDP reliable messages not fully acknowledged" +msgstr "" + +msgid "Semi-reliable UDP fragments sent" +msgstr "" + +msgid "Semi-reliable UDP fragments resent" +msgstr "" + +msgid "Semi-reliable UDP fragment sendings avoided" +msgstr "" + +msgid "Semi-reliable UDP fragments sent too many times" +msgstr "" + +msgid "Semi-reliable UDP total acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP spurious acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP invalid acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP acknowledgments re-queued for sending" +msgstr "" + +msgid "Semi-reliable UDP plain acknowledgments dropped" +msgstr "" + +msgid "Semi-reliable UDP enhanced acknowledgments dropped" +msgstr "" + +msgid "Semi-reliable UDP plain acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP EARs sent" +msgstr "" + +msgid "Semi-reliable UDP too many EARs sent" +msgstr "" + +msgid "Semi-reliable UDP EAR negative acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP acknowledgments received after sending EARs" +msgstr "" + +msgid "Semi-reliable UDP fragments received" +msgstr "" + +msgid "Semi-reliable UDP duplicate fragments received" +msgstr "" + +msgid "Semi-reliable UDP unreliable fragments received" +msgstr "" + +msgid "Semi-reliable UDP dropped received fragments" +msgstr "" + +msgid "Semi-reliable UDP fragments received whilst lingering" +msgstr "" + +msgid "Semi-reliable UDP messages expired before re-assembly" +msgstr "" + +msgid "Semi-reliable UDP messages re-assembled completely" +msgstr "" + +msgid "Semi-reliable UDP messages inflated successfully" +msgstr "" + +msgid "Semi-reliable UDP messages inflated incorrectly" +msgstr "" + +msgid "Semi-reliable UDP unreliable messages received" +msgstr "" + +msgid "Semi-reliable UDP empty messages received" +msgstr "" + +msgid "Semi-reliable UDP total acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP avoided acknowledgment sendings" +msgstr "" + +msgid "Semi-reliable UDP EARs received" +msgstr "" + +msgid "Semi-reliable UDP EARs received for unknown message" +msgstr "" + +msgid "Semi-reliable UDP EARs received whilst lingering" +msgstr "" + +msgid "Semi-reliable UDP fragments from hostile IP addresses" +msgstr "" + +msgid "UDP G2 hits rerouted to hub for delivery" +msgstr "" + +msgid "UDP G2 hits undelivered" +msgstr "" + +msgid "Consolidated servers (after GUID and IP address linking)" +msgstr "" + +msgid "Duplicate downloads found during server consolidation" +msgstr "" + +msgid "Discovered server GUIDs" +msgstr "" + +msgid "Changed server GUIDs" +msgstr "" + +msgid "Detected GUID collisions" +msgstr "" + +msgid "Detected collisions with our own GUID" +msgstr "" + +msgid "GUID dynamically banned" +msgstr "" + +msgid "Firewalled node info for known hosts received in upload requests" +msgstr "" + +msgid "Revitalized PUSH routes" +msgstr "" + +msgid "Collected new PUSH proxies from other query hits" +msgstr "" + +msgid "Attempted download resource switching on completion" +msgstr "" + +msgid "Attempted download resource switching after error" +msgstr "" + +msgid "Successful download resource switching (all kind)" +msgstr "" + +msgid "Successful download resource switching between plain files" +msgstr "" + +msgid "Successful download resource switching after error" +msgstr "" + +msgid "Actively queued after resource switching attempt" +msgstr "" + +msgid "Sunk HTTP reply data on error codes" +msgstr "" + +msgid "Ignored downloaded data" +msgstr "" + +msgid "Ignoring requested after data mismatch" +msgstr "" + +msgid "Ignoring requested to preserve connection" +msgstr "" + +msgid "Ignoring requested due to aggressive swarming" +msgstr "" + +msgid "Ignoring refused (data too large or server too slow)" +msgstr "" + +msgid "Client resource switching (all detected)" +msgstr "" + +msgid "Client resource switching between plain files" +msgstr "" + +msgid "Client follow-up request after HTTP error was returned" +msgstr "" + +msgid "PARQ client resource switching in slots (SHA-1 based)" +msgstr "" + +msgid "PARQ client retry-after violation" +msgstr "" + +msgid "PARQ client kicked out after too many retry-after violations" +msgstr "" + +msgid "PARQ upload slot limit overrides" +msgstr "" + +msgid "PARQ quick upload slots granted" +msgstr "" + +msgid "PARQ QUEUE sending attempts" +msgstr "" + +msgid "PARQ QUEUE messages sent" +msgstr "" + +msgid "PARQ QUEUE follow-up requests received" +msgstr "" + +msgid "Launched SHA-1 file verifications" +msgstr "" + +msgid "Launched TTH file verifications" +msgstr "" + +msgid "Re-seeding of orphan downloads through query hits" +msgstr "" + +msgid "Re-seeding of orphan downloads through upload requests" +msgstr "" + +msgid "RUDP sent bytes" +msgstr "" + +msgid "RUDP received bytes" +msgstr "" + +msgid "DHT estimated amount of nodes" +msgstr "" + +msgid "DHT standard error of estimated amount of nodes" +msgstr "" + +msgid "DHT k-ball theoretical frontier (bits)" +msgstr "" + +msgid "DHT k-ball furthest frontier (bits)" +msgstr "" + +msgid "DHT k-ball closeest frontier (bits)" +msgstr "" + +msgid "DHT routing table buckets" +msgstr "" + +msgid "DHT routing table leaves" +msgstr "" + +msgid "DHT routing table maximum depth" +msgstr "" + +msgid "DHT routing table good nodes" +msgstr "" + +msgid "DHT routing table stale nodes" +msgstr "" + +msgid "DHT routing table pending nodes" +msgstr "" + +msgid "DHT routing table evicted nodes" +msgstr "" + +msgid "DHT routing table evicted firewalled nodes" +msgstr "" + +msgid "DHT routing table evicted nodes due to quota" +msgstr "" + +msgid "DHT routing table promoted pending nodes" +msgstr "" + +msgid "DHT routing table pinged promoted nodes" +msgstr "" + +msgid "DHT routing table rejected node due to bucket network quota" +msgstr "" + +msgid "DHT routing table rejected node due to global network quota" +msgstr "" + +msgid "DHT completed bucket refreshes" +msgstr "" + +msgid "DHT forced bucket refreshes" +msgstr "" + +msgid "DHT forced bucket merges" +msgstr "" + +msgid "DHT bucket merges" +msgstr "" + +msgid "DHT bucket splits" +msgstr "" + +msgid "DHT denied non-splitable bucket refresh" +msgstr "" + +msgid "DHT initiated bucket alive checks" +msgstr "" + +msgid "DHT alive pings sent to good nodes" +msgstr "" + +msgid "DHT alive pings sent to stale nodes" +msgstr "" + +msgid "DHT alive pings sent to shutdowning nodes" +msgstr "" + +msgid "DHT alive pings avoided" +msgstr "" + +msgid "DHT alive pings skipped" +msgstr "" + +msgid "DHT revitalized stale nodes on RPC reply" +msgstr "" + +msgid "DHT value store rejected on IP/network quota grounds" +msgstr "" + +msgid "DHT value store rejected on creator validation grounds" +msgstr "" + +msgid "DHT nodes rejected during lookup based on network quota" +msgstr "" + +msgid "DHT nodes rejected during lookup based on suspicious proximity" +msgstr "" + +msgid "DHT nodes rejected during lookup based on frequency divergence" +msgstr "" + +msgid "DHT node contact IP addresses fixed during lookup" +msgstr "" + +msgid "DHT keys held" +msgstr "" + +msgid "DHT cached keys held" +msgstr "" + +msgid "DHT values held" +msgstr "" + +msgid "DHT cached KUID targets held" +msgstr "" + +msgid "DHT cached closest root nodes" +msgstr "" + +msgid "DHT cached roots exact hits" +msgstr "" + +msgid "DHT cached roots approximate hits" +msgstr "" + +msgid "DHT cached roots misses" +msgstr "" + +msgid "DHT cached roots lookups within k-ball" +msgstr "" + +msgid "DHT cached roots contact address refreshed" +msgstr "" + +msgid "DHT cached security tokens held" +msgstr "" + +msgid "DHT cached security tokens hits" +msgstr "" + +msgid "DHT stable node information held" +msgstr "" + +msgid "DHT local hits on value lookups" +msgstr "" + +msgid "DHT local hits returning values from cached keys" +msgstr "" + +msgid "DHT returned expanded values" +msgstr "" + +msgid "DHT returned values as secondary keys" +msgstr "" + +msgid "DHT claimed values via secondary keys" +msgstr "" + +msgid "DHT returned cached expanded values" +msgstr "" + +msgid "DHT returned cached values as secondary-keys" +msgstr "" + +msgid "DHT claimed cached values via secondary keys" +msgstr "" + +msgid "DHT successfully received value publications" +msgstr "" + +msgid "DHT successfully received value removals" +msgstr "" + +msgid "DHT replication of stale value avoided" +msgstr "" + +msgid "DHT replication of held values" +msgstr "" + +msgid "DHT republishing of held values" +msgstr "" + +msgid "DHT secondary-key value fetch issued" +msgstr "" + +msgid "DHT duplicate values returned in lookups" +msgstr "" + +msgid "DHT detected KUID collisions" +msgstr "" + +msgid "DHT detected collisions with our own KUID" +msgstr "" + +msgid "DHT caching attempts" +msgstr "" + +msgid "DHT caching ended successfully" +msgstr "" + +msgid "DHT caching partially completed" +msgstr "" + +msgid "DHT key-offloading checks after discovering new closest node" +msgstr "" + +msgid "DHT keys selected for offloading" +msgstr "" + +msgid "DHT key-offloading attempts" +msgstr "" + +msgid "DHT key-offloading ended successfully" +msgstr "" + +msgid "DHT key-offloading partially completed" +msgstr "" + +msgid "DHT values successfully offloaded" +msgstr "" + +msgid "DHT incoming messages" +msgstr "" + +msgid "DHT incoming messages with UDP-matching contact address" +msgstr "" + +msgid "DHT incoming messages with contact address fixed" +msgstr "" + +msgid "DHT incoming messages from hostile addresses" +msgstr "" + +msgid "DHT incoming messages with hostile contact address" +msgstr "" + +msgid "DHT RPC messages prepared" +msgstr "" + +msgid "DHT RPC messages cancelled" +msgstr "" + +msgid "DHT RPC timed out" +msgstr "" + +msgid "DHT RPC replies received" +msgstr "" + +msgid "DHT RPC replies with contact address fixed" +msgstr "" + +msgid "DHT RPC late replies received" +msgstr "" + +msgid "DHT RPC detected KUID mismatches on reply" +msgstr "" + +msgid "DHT RPC recent nodes held" +msgstr "" + +msgid "DHT node verifications" +msgstr "" + +msgid "DHT publishing attempts" +msgstr "" + +msgid "DHT publishing ended successfully (all roots)" +msgstr "" + +msgid "DHT publishing partially completed (root subset only)" +msgstr "" + +msgid "DHT publishing ending with proper value presence" +msgstr "" + +msgid "DHT value republishing occurring too late (after expiry)" +msgstr "" + +msgid "DHT publishing to self" +msgstr "" + +msgid "DHT background publishing completion attempts" +msgstr "" + +msgid "DHT background publishing completion showing improvements" +msgstr "" + +msgid "DHT background publishing completion successful (all roots)" +msgstr "" + +msgid "DHT SHA1 data type collisions" +msgstr "" + +msgid "DHT lookup path passively protected against attack" +msgstr "" + +msgid "DHT lookup path actively protected against attack" +msgstr "" + +msgid "DHT alt-loc lookups issued" +msgstr "" + +msgid "DHT push-proxy lookups issued" +msgstr "" + +msgid "DHT successful alt-loc lookups" +msgstr "" + +msgid "DHT successful push-proxy lookups" +msgstr "" + +msgid "DHT successful node push-entry lookups" +msgstr "" + +msgid "DHT re-seeding of orphan downloads" +msgstr "" + +msgid "Digests computed on general statistics" +msgstr "" + +msgid "Digests computed on TCP statistics" +msgstr "" + +msgid "Digests computed on UDP statistics" +msgstr "" + +msgid "Ping" +msgstr "Kip" + +msgid "Pong" +msgstr "Kop" + +msgid "Bye" +msgstr "Viszlát" + +msgid "QRP" +msgstr "QRP" + +msgid "HSEP" +msgstr "" + +msgid "RUDP" +msgstr "" + +msgid "Vendor spec." +msgstr "" + +msgid "Vendor std." +msgstr "" + +msgid "Push" +msgstr "Nyomás" + +msgid "Query" +msgstr "Keresés" + +msgid "Query hit" +msgstr "Találat" + +msgid "DHT (truncated)" +msgstr "" + +msgid "DHT Ping" +msgstr "" + +msgid "DHT Pong" +msgstr "" + +msgid "DHT Store" +msgstr "" + +msgid "DHT Store Ack" +msgstr "" + +msgid "DHT Find Node" +msgstr "" + +msgid "DHT Found Node" +msgstr "" + +msgid "DHT Find Value" +msgstr "" + +msgid "DHT Value" +msgstr "" + +msgid "G2 Crawl Request" +msgstr "" + +msgid "G2 Hub Advertisement" +msgstr "" + +msgid "G2 Hub List" +msgstr "" + +msgid "G2 Hub List Req" +msgstr "" + +msgid "G2 Hub List Ack" +msgstr "" + +msgid "G2 Local Node Info" +msgstr "" + +msgid "G2 Ping" +msgstr "" + +msgid "G2 Pong" +msgstr "" + +msgid "G2 Push" +msgstr "" + +msgid "G2 Query Key Ack" +msgstr "" + +msgid "G2 Query Key Req" +msgstr "" + +msgid "G2 Query" +msgstr "" + +msgid "G2 Query Ack" +msgstr "" + +msgid "G2 Query Hit" +msgstr "" + +msgid "G2 Query Hash Table" +msgstr "" + +msgid "G2 User Profile Check" +msgstr "" + +msgid "G2 User Profile Data" +msgstr "" + +msgid "Total" +msgstr "Összesen" + +msgid "Bad size" +msgstr "Rossz méret" + +msgid "Too small" +msgstr "Túl kicsi" + +msgid "Too large" +msgstr "Túl nagy" + +msgid "Way too large" +msgstr "Túlontúl nagy" + +msgid "Too old" +msgstr "" + +msgid "Unknown message type" +msgstr "Ismeretlen üzenetfajta" + +msgid "Unexpected message" +msgstr "Váratlan üzenet" + +msgid "Message sent with TTL = 0" +msgstr "TTL=0-val küldött üzenet" + +msgid "Improper hops/ttl combination" +msgstr "" + +msgid "Max TTL exceeded" +msgstr "Legnagyobb TTL túllépve" + +msgid "Message throttle" +msgstr "Üzenetdobás" + +msgid "Message matched limits" +msgstr "" + +msgid "Transient node" +msgstr "" + +msgid "Unusable Pong" +msgstr "Használhatatlan kop" + +msgid "Hard TTL limit reached" +msgstr "_Kemény TTL korlát elérve" + +msgid "Max hop count reached" +msgstr "Legnagyobb ugrásszám elérve" + +msgid "Route lost" +msgstr "Út elveszett" + +msgid "No route" +msgstr "Nincs út" + +msgid "Duplicate message" +msgstr "Megkettőzött üzenet" + +msgid "OOB Proxy MUID Conflict" +msgstr "" + +msgid "Message to banned GUID" +msgstr "Üzenet a kitiltott GUID-nek" + +msgid "Message from banned GUID" +msgstr "" + +msgid "Node shutting down" +msgstr "Csomópont kilép" + +msgid "TX flow control" +msgstr "" + +msgid "Query text had no trailing NUL" +msgstr "Keresőszöveg nincs NUL-lal lezárva" + +msgid "Query text too short" +msgstr "Keresőszöveg túl rövid" + +msgid "Query had unnecessary overhead" +msgstr "Keresőszöveg szükségtelen terheléssel" + +msgid "Query had bad URN" +msgstr "" + +msgid "Message with malformed SHA1" +msgstr "Üzenet hibás SHA1-gyel" + +msgid "Message with malformed UTF-8" +msgstr "Üzenet hibás UTF-8-cal" + +msgid "Malformed Query Hit" +msgstr "Hibás találat" + +msgid "Bad return address" +msgstr "" + +msgid "Hostile IP address" +msgstr "Ellenséges IP-cím" + +msgid "Shunned IP address" +msgstr "" + +msgid "Bogus result from Morpheus" +msgstr "" + +msgid "Spam" +msgstr "" + +msgid "Evil filename" +msgstr "" + +msgid "Improper media type" +msgstr "" + +msgid "Payload inflating error" +msgstr "" + +msgid "Unknown header flags present" +msgstr "" + +msgid "Own search results" +msgstr "" + +msgid "Own queries" +msgstr "" + +msgid "Ancient query format" +msgstr "" + +msgid "Blank Servent ID" +msgstr "" + +msgid "GUESS Query missing token" +msgstr "" + +msgid "GUESS Invalid query token" +msgstr "" + +msgid "DHT Invalid security token" +msgstr "" + +msgid "DHT Too many STORE requests" +msgstr "" + +msgid "DHT Malformed message" +msgstr "" + +msgid "G2 Unexpected message" +msgstr "" + +msgid "Cannot cross networks" +msgstr "" + msgid "No proxy" -msgstr "proxy" +msgstr "" msgid "HTTP" msgstr "" @@ -1046,25 +2213,20 @@ msgid "displayed marked" msgstr "" -#, fuzzy msgid "not displayed" -msgstr "gnutellaNet kijelző" +msgstr "" -#, fuzzy msgid "auto (recommended)" -msgstr "Fogadott" +msgstr "" -#, fuzzy msgid "ultra node" -msgstr "Átjátszó üzemmód" +msgstr "" -#, fuzzy msgid "leaf node" -msgstr "Saját pont" +msgstr "" -#, fuzzy msgid "none" -msgstr "csomópont" +msgstr "" msgid "input only" msgstr "" @@ -1081,33 +2243,26 @@ msgid "own KUID lookup" msgstr "" -#, fuzzy msgid "completing" -msgstr "Befejezve" +msgstr "" -#, fuzzy msgid "completed" -msgstr "Befejezve" +msgstr "" -#, fuzzy msgid "shutdown" -msgstr "Csomópont kilép" +msgstr "" -#, fuzzy msgid "active (recommended)" -msgstr "Fogadott" +msgstr "" -#, fuzzy msgid "passive" -msgstr " passzív)" +msgstr "" -#, fuzzy msgid "Indicates whether the hostcache file is being read." -msgstr "Jelzi, hogy beolvassa-e a gépgyorstár fájlt" +msgstr "" -#, fuzzy msgid "Indicates whether the ultracache file is being read." -msgstr "Jelzi, hogy beolvassa-e a átjátszó gazdatár fájlját" +msgstr "" msgid "" "Indicates that gtk-gnutella finds the version you run very VERY old. You " @@ -1117,14 +2272,11 @@ "features." msgstr "" -#, fuzzy msgid "" "gtk-gnutella found a newer version on the Gnet and gives information about " "it here." msgstr "" -"gtk-gnutella újabb verziót talált a gNet-en és itt ad róla tájékoztatást" -#, fuzzy msgid "" "Try to keep at least this number of connections to other servents of the " "same kind as we are (normal or ultra nodes). This should be smaller than the " @@ -1132,31 +2284,19 @@ "that the default TTL on Gnutella is 4, so this needs to be more than 30 to " "provide decent range for searches." msgstr "" -"Megpróbál legalább ennyi kapcsolatot fenntartani a többi kiszolgálóval, " -"amelyek ugyan olyanok mint a miénk (hagyományos vagy átjátszó csomópont). Ez " -"legyen kisebb, mint a bejövő kapcsolatok legnagyobb száma!" -#, fuzzy msgid "" "When in ultrapeer mode, try to keep at least this number of connections to " "normal servents. This should be smaller than the maximum amount of " "connections to allow incoming connections." msgstr "" -"Átjátszó üzemmódban megpróbál legalább ennyi kapcsolatot fenntartani a többi " -"hagyományos kiszolgálóval. Ez legyen kisebb, mint a bejövő kapcsolatok " -"legnagyobb száma!" -#, fuzzy msgid "" "Don't allow more than this number of connections to other servents. As a " "rule of thumb you should reserve 256 b/s bandwidth per connection. Never use " "up all your bandwidth, leave a little space for TCP/IP overhead. It's not " "advisable that you set this to a value smaller than 40." msgstr "" -"Nem enged ennél több kapcsolatot más kiszolgálókhoz. Jusson 512b/s " -"sávszélesség minden egyes kapcsolatra! Soha ne használja fel a teljes " -"sávszélességét, hagyjon egy kis helyet a TCP/IP fejléceknek! Nem tanácsos " -"ezt az értéket 20-nál nagyobbra állítani." msgid "Number of leaf nodes currently connected." msgstr "Pillanatnyilag a végponti kapcsolatok száma." @@ -1167,21 +2307,15 @@ msgid "Number of ultra nodes currently connected." msgstr "Pillanatnyilag az átjátszó kapcsolatok száma." -#, fuzzy msgid "" "Don't start more than this number of parallel downloads. Others will remain " "in the queue waiting for a download slot." msgstr "" -"Nem kezd bele ennél több egyidejű letöltésbe. A többi letöltő nyíláshoz áll " -"sorba." -#, fuzzy msgid "" "Don't make more connections than given here to a single host to download a " "file. Be nice to others, and leave it at the default value (1)." msgstr "" -"Letöltéskor nem hoz létre ennél több kapcsolatot egy géphez. Legyen kedves " -"másokhoz, és hagyja az alapértéket (1)!" msgid "" "Don't allow more than this number of uploads in total. This also defines the " @@ -1190,44 +2324,34 @@ "Nem enged ennél több feltöltést. Ez meghatározza a PARQ sor hosszát is." "Legyen legalább 2!" -#, fuzzy msgid "" "Don't upload more than this number of files in parallel to a single host." -msgstr "Nem tölt fel ennél több fájlt egyidejűleg egy gépre." +msgstr "" -#, fuzzy msgid "Local IPv4 address last determined." -msgstr "Az utoljára meghatározott helyi IP-cím." +msgstr "" -#, fuzzy msgid "Local IPv6 address last determined." -msgstr "Az utoljára meghatározott helyi IP-cím." +msgstr "" -#, fuzzy msgid "When the current IPv4 address was determined." -msgstr "Amikor a jelenlegi IP-címet meghatározták" +msgstr "" -#, fuzzy msgid "When the current IPv6 address was determined." -msgstr "Amikor a jelenlegi IP-címet meghatározták" +msgstr "" -#, fuzzy msgid "Average uptime with the same IPv4 address." -msgstr "Átlagos futási idő ugyanazzal az IP-címmel" +msgstr "" -#, fuzzy msgid "Average uptime with the same IPv6 address." -msgstr "Átlagos futási idő ugyanazzal az IP-címmel" +msgstr "" -#, fuzzy msgid "Timestamp at which servent was started." -msgstr "A kiszolgáló indulásának időpontja" +msgstr "" -#, fuzzy msgid "Average servent uptime." -msgstr "A kiszolgáló átlagos futási ideje másodpercben" +msgstr "" -#, fuzzy msgid "" "Local TCP port gtk-gnutella is listening on. ISPs often block or throttle " "traffic on TCP port 6346 so it is a good idea to change it to something in " @@ -1235,25 +2359,13 @@ "forwarding / opening, as necessary. Note that by default, the TCP port 6346 " "is not used to guard against undue censorship." msgstr "" -"Helyi kapu, amelyen a gtk-gnutella várja a bejövő kapcsolatokat. Az ön " -"internet-szolgáltatója akadályozhatja/megállíthatja a forgalmat a 6346-os " -"kapun, ezért jó ötlet ezt megváltoztatni valamire az 1024-65535 " -"intervallumban. Ne felejtse el időszerűsíteni a tűzfal kapu-továbbítás/" -"nyitás beállítását, amennyiben szükséges! Jegyezze meg, hogy a 6346-os kapu " -"nem szokott megvédeni a cenzúrától." -#, fuzzy msgid "Use this IP address as source address if 'force local ip' is activated." msgstr "" -"Ezt az IP-címet használja forráscímként ha a „helyi ip kényszerítését” " -"bekapcsolta" -#, fuzzy msgid "" "Use this IPv6 address as source address if 'force local ip' is activated." msgstr "" -"Ezt az IP-címet használja forráscímként ha a „helyi ip kényszerítését” " -"bekapcsolta" msgid "" "The connection bandwidth reported to other hosts. This is the speed at which " @@ -1277,79 +2389,53 @@ "feltöltőnyílások számával. Bekapcsolva (ajánlott) a beállított kapcsolat " "sebessége nem használt." -#, fuzzy msgid "" "Return at most this number of results to a query, using as many query hit " "packets as necessary. To avoid network flooding, keep this to a reasonable " "value." msgstr "" -"Legfeljebb ennyi eredményt ad vissza a keresés, a szükséges számú kereső " -"csomagot használva. A hálózat elárasztását kerülendő, tartsa ezt egy ésszerű " -"értéken!" -#, fuzzy msgid "" "Unless this percentage or more of the upload bandwidth is used, allow " "additional upload slots." msgstr "" -"Amíg ezt a százalékot nem éri el a feltöltésre használt sávszélesség, " -"további feltöltések nyitását engedi." -#, fuzzy msgid "Number of seconds before a download connect attempt times out." -msgstr "A letöltő próbálkozás türelmi ideje másodpercben" +msgstr "" -#, fuzzy msgid "Number of seconds before a push request times out." -msgstr "A nyomó próbálkozás türelmi ideje másodpercben" +msgstr "" -#, fuzzy msgid "Number of seconds before a download times out if no data is received." -msgstr "A letöltés türelmi ideje másodpercben, ha nem érkezett adat" +msgstr "" -#, fuzzy msgid "Minimum number of seconds to wait on auto-retry timeouts." -msgstr "Legalább ennyi másodpercet vár mielőtt újra próbál letölteni" +msgstr "" -#, fuzzy msgid "Maximum number of seconds to wait on auto-retry timeouts." -msgstr "Legfeljebb ennyi másodpercet vár mielőtt újra próbál letölteni" +msgstr "" -#, fuzzy msgid "" "Maximum number of attempts to download a file not counting HTTP busy " "indications." msgstr "" -"Legfeljebb ennyiszer próbál egy fájlt letölteni nem számítva a HTTP foglalt " -"jelzéseket" -#, fuzzy msgid "Delay in seconds before retrying after a connection timed out." msgstr "" -"Türelmi idő lejárta utáni késleltetés másodpercben mielőtt újra próbál " -"kapcsolódni" -#, fuzzy msgid "" "Delay in seconds before retrying after getting a 'busy' response from a host." msgstr "" -"Foglalt jelzés utáni késleltetés másodpercben mielőtt újra próbál kapcsolódni" -#, fuzzy msgid "" "Delay in seconds before retrying after getting a 'connection refused' " "response from a host." msgstr "" -"A „kapcsolat visszautasítva” válasz utáni ismételt próbálkozás késleltetése " -"másodpercben" -#, fuzzy msgid "" "Delay in seconds before retrying after a retry stopped (timed out, " "connection reset by peer, etc...)." msgstr "" -"A megállított próbálkozás (türelmi idő lejárt, a társ lezárta a kapcsolatot, " -"stb.) utáni ismételt próbálkozás késleltetése" msgid "" "Amount of bytes to overlap when resuming a download. It should be at least " @@ -1360,45 +2446,32 @@ "biztonságosfolytatás érdekében, különben a gtk-gnutella nem fog folytatni " "olyan fájlt, amelyheznincs ismert SHA1, miután a kiszolgáló visszaad egyet." -#, fuzzy msgid "" "Number of seconds before an upload times out if no connection can be " "established during a push. It is also the maximum amount of time we wait to " "get the whole HTTP request." msgstr "" -"A feltöltés türelmi ideje másodpercben, ha nem sikerült kapcsolatot " -"teremteni nyomással.Ez a teljes HTTP kérelem legnagyobb várakozási ideje is." -#, fuzzy msgid "" "Number of seconds after which an upload times out if no data is transmitted." -msgstr "A feltöltés türelmi ideje, ha nem történt adatátvitel." +msgstr "" -#, fuzzy msgid "" "Amount of seconds to wait before a search is issued again to see if new " "results are available. Be very careful with this parameter, and do not set " "it too low or you will damage the Gnutella network. A delay of half an hour " "is fine." msgstr "" -"Várakozási idő másodpercben mielőtt a keresést megújítja az újabb " -"eredményekért.Legyen óvatos ezzel a paraméterrel, és ne állítsa túl " -"alacsonyra, különben a Gnutella-hálózat látja kárát. Fél óra késleltetés jó." -#, fuzzy msgid "" "Maximum ratio of file descriptors reserved for banning. For instance, if " "your OS gives you 350 file descriptors, a ratio of 10 will reserve at most " "35 file descriptors. You should ensure you have around 100 file descriptors " "for efficient banning." msgstr "" -"Legfeljebb ekkora hányadát foglalja le a fájlleíróknak. Például ha az " -"oprendszer ad 350 fájlleírót, akkor 10-es érték 35 fájlleírót jelent. Kb. " -"100 fájlleírókell a hatékony működéshez." -#, fuzzy msgid "Maximum number of file descriptors reserved for banning." -msgstr "Legfeljebb ennyi fájlleírót foglal le" +msgstr "" msgid "" "Amount of file descriptors currently used for banning, i.e. which are " @@ -1407,38 +2480,28 @@ "Fájlleírók száma foglaláshoz, azaz amelyeket nyitva tart késleltetett " "záráshoz." -#, fuzzy msgid "Number of file descriptors we'll actually be using for banning." -msgstr "Ennyi fájlleírót fog használni" +msgstr "" -#, fuzzy msgid "" "Number of seconds an incoming connection has to start sending out its " "request." msgstr "" -"Másodpercek száma, ami után egy bejövő kapcsolatnak küldenie kell a kérelmét" -#, fuzzy msgid "" "Number of seconds before a Gnet connect attempt times out if no connection " "can be established." msgstr "" -"Gnet kapcsolat létesítésének türelmi ideje másodpercben, ha nem sikerült " -"kapcsolódni" -#, fuzzy msgid "" "Number of seconds before a Gnet connection times out if no data is " "transmitted." -msgstr "Gnet kapcsolat tartásának türelmi ideje, ha nem történt adatátvitel" +msgstr "" -#, fuzzy msgid "" "Maximum size of the sendqueue for the nodes (in bytes). Must be at least 150 " "percent of the maximum message size." msgstr "" -"A küldősor legnagyobb mérete bájtban. Legalább a legnagyobb üzenet 150%-ának " -"kell lennie." msgid "" "Maximum number of seconds a node can remain in transmit flow control before " @@ -1447,37 +2510,24 @@ "A leghosszabb idő másodpercben, amíg egy pont az átvitelt vezérelheti, " "mielőtt kirúgják." -#, fuzzy msgid "" "Maximum percentage of time over 5 minutes that our node can remain in flow " "control remotely before dropping the connection. This only works with nodes " "that will send us an hops-flow message when they are flow-controlling us." msgstr "" -"Legfeljebb ennyi százalékban vezérelheti ez a pont az átvitelt távolról " -"mielőtt megszakítja a kapcsolatot. Ez csak olyan pontokkal működik, amelyek " -"küldenek „hops-flow” üzenetet, amikor az átvitelt vezérlik." -#, fuzzy msgid "" "Maximum TTL we allow in messages we broadcast. If a query comes in with a " "TTL greater than that, it will be trimmed down to that value. On Gnutella, " "the standard is TTL=4, so you cannot set a value lower than that." msgstr "" -"A legnagyobb TTL érték a szórt üzenetekben. Ha ennél nagyobb értékkelüzenet " -"érkezik, akkor az ezt az értéket kapja. A Gnutellán a szabvány a TTL=7, " -"tehát ennél kisebb értéket nem lehet beállítani." -#, fuzzy msgid "" "The TTL we use in messages we generate. The default on Gnutella is TTL=4. " "If you set it to too large a value, you run the risk of being trimmed down " "by fellow gtk-gnutella nodes, or kicked out by some other servent." msgstr "" -"A TTL, amit az üzeneteinkben használunk. Gnutellán az alapértelmezett TTL=7. " -"Ha túl nagyra állítják ezt az értéket, akkor lehet, hogy a társ gtk-gnutella " -"pontok ezt lecsökkentik, vagy kirúg egy másik kiszolgáló." -#, fuzzy msgid "" "Maximum hard TTL limit (hops + TTL) on messages we relay. This should be " "greater than the standard TTL=4, because it is also applied to routed-back " @@ -1486,123 +2536,90 @@ "configure, and that limit should be much lower than the value of this " "parameter." msgstr "" -"Legnagyobb kemény TTL korlát (hops + TTL) a küldött üzenetekre. Ez legyen " -"nagyobb, minta szabvány TTL=7, mert ezt alkalmazzák a visszairányított " -"üzenetekre is (találatok), amelyeket átirányíthatnak, ha egy kapcsolat " -"elveszett. Szabvány szórt üzenetek TTL korlátja a legnagyobb TTL érték, amit " -"ennél jóval kisebbre kell állítani." -#, fuzzy msgid "For development use: debug level." -msgstr "Fejlesztőknek: hibajavítás szintje" +msgstr "" -#, fuzzy msgid "Debug level for banning code." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "If not zero, periodic messages show the used CPU time." msgstr "" -#, fuzzy msgid "Debug level for download mesh management." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for Gnutella messages." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for file sharing code." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for Gnutella nodes." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for sockets." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for bootstrapping into the network." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for HTTP code." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for downloads." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for fileinfo." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for uploads." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for code shared between gui and core." -msgstr "Hibajavítás szintje a felhasználói felület és a mag osztott kódjára" - -msgid "Verbosity of Bitzi related debug messages." msgstr "" msgid "Verbosity of URL handling related debug messages." msgstr "" -#, fuzzy msgid "Debug level for dynamic query hit routing." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for dynamic queries." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for vendor messages." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for queries." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "Debug level for searches and search results management." msgstr "" -#, fuzzy msgid "Debug level for the UDP traffic layer." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for the Query Routing Protocol." -msgstr "Keresés-irányítás protokoll" +msgstr "" -#, fuzzy msgid "Debug level for message routing." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for GGEP." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for pong caching." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for HSEP." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for TLS." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for PARQ." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "" "If set, PARQ will calculate its ETA and retry times more optimistically. If " @@ -1635,85 +2652,62 @@ "support." msgstr "" -#, fuzzy -msgid "For development use: track properties." -msgstr "Fejlesztőknek: nyomkövetés tulajdonságai" +msgid "Indicates a kernel network buffer shortage." +msgstr "" -#, fuzzy msgid "For development use: don't add new hosts to the host cache." -msgstr "Fejlesztőknek: nem tesz új gépeket a gépfogóba" +msgstr "" -#, fuzzy msgid "Enable bandwidth limitation for incoming HTTP traffic." -msgstr "Bejövő HTTP forgalom korlátozása" +msgstr "" -#, fuzzy msgid "Enable bandwidth limitation for outgoing HTTP traffic." -msgstr "Kimenő HTTP forgalom korlátozása" +msgstr "" -#, fuzzy msgid "Enable bandwidth limitation for incoming Gnet traffic." -msgstr "Bejövő Gnet forgalom korlátozása" +msgstr "" -#, fuzzy msgid "Enable bandwidth limitation for incoming Gnet leaf traffic." -msgstr "Bejövő Gnet végponti forgalom korlátozása" +msgstr "" -#, fuzzy msgid "Enable bandwidth limitation for outgoing Gnet traffic." -msgstr "Kimenő Gnet forgalom korlátozása" +msgstr "" -#, fuzzy msgid "Enable bandwidth limitation for outgoing Gnet leaf traffic." -msgstr "Kimenő Gnet végponti forgalom korlátozása" +msgstr "" -#, fuzzy msgid "Enable dynamic upload slots allocation." -msgstr "Dinamikus feltöltő nyílás foglalása" +msgstr "" -#, fuzzy msgid "" "Allow HTTP and Gnutella to grab whatever bandwidth the other is not using. " "If FALSE, unused bandwidth is lost." msgstr "" -"Engedi, hogy HTTP és Gnutella magához ragadja a másik által nem használt " -"sávszélességet. Ha HAMIS, akkor a nem használt sávszélesség elveszik." -#, fuzzy msgid "Auto clear completed downloads." -msgstr "Befejezett letöltések automatikus takarítása" +msgstr "" -#, fuzzy msgid "" "Auto clear failed downloads (HTTP error, failure to resume, write error, " "etc...)." msgstr "" -"Sikertelen letöltések automatikus takarítása (HTTP hiba, sikertelen " -"folytatás, írási hiba, stb.)" -#, fuzzy msgid "" "Auto clear unavailable downloads (connection timeout, push route lost, " "etc...)." msgstr "" -"Elérhetetlen letöltések automatikus takarítása (türelmi idő lejárt, nyomás-" -"útvonal elveszett, stb.)" -#, fuzzy msgid "Auto clear finished downloads" -msgstr "Leállt letöltések önműködő törlése" +msgstr "" -#, fuzzy msgid "Remove downloaded files from the search result." -msgstr "Letöltött fájlok eltávolítása a találatok közül" +msgstr "" -#, fuzzy msgid "Enable to use forced_local_ip as local ip." -msgstr "A kényszerített ip használata helyi ip-ként" +msgstr "" -#, fuzzy msgid "Enable to use forced_local_ip6 as local ip." -msgstr "A kényszerített ip használata helyi ip-ként" +msgstr "" msgid "" "If 'forced_local_ip' is enabled, bind the socket to the forced IP address." @@ -1723,65 +2717,47 @@ "If 'forced_local_ip6' is enabled, bind the socket to the forced IP address." msgstr "" -#, fuzzy msgid "Try to connect to local networks first." -msgstr "A helyi hálózatokhoz próbál csatlakozni először" +msgstr "" -#, fuzzy msgid "" "Check this button if you want to use gtk-gnutella on your Local Area " "Network. RFC1918 will be ignored." msgstr "" -"Pipálja ki ezt a négyzetet, ha a helyi hálózatokon akarja használni GTK-" -"Gnutellát. RFC1918-at mellőzi." -#, fuzzy msgid "" "Check this button if you want gtk-gnutella to use IP TOS to differentiate " "interactive, normal and bulk data. This is probably a good idea in most " "cases, and can particularly help with badly misconfigured hosts, LANs, and " "ISPs." msgstr "" -"Pipálja ki ezt a négyzetet ha akarja, hogy GTK-Gnutella használja IP TOS-t " -"az interaktív, normál és ömlesztett adatok megkülönböztetéséhez. Ez jó ötlet " -"lehet a legtöbb esetben, és segíthet ha egy gép, LAN vagy ISP rosszul " -"konfigurált." -#, fuzzy msgid "Remove files of aborted downloads from disk." -msgstr "Elvetett letöltés-fájlok eltávolítása a lemezről" +msgstr "" -#, fuzzy msgid "Use username and password to authenticate to proxy." -msgstr "Azonosító és jelszó használata a proxyhoz" +msgstr "" -#, fuzzy msgid "Username for proxy." -msgstr "Azonosító a proxyhoz" +msgstr "" -#, fuzzy msgid "Password for proxy." -msgstr "Jelszó a proxyhoz" +msgstr "" -#, fuzzy msgid "Address of the proxy." -msgstr "Proxy IP-címe" +msgstr "" -#, fuzzy msgid "Hostname of the proxy." -msgstr "Proxy IP-címe" +msgstr "" -#, fuzzy msgid "TCP Port the proxy is listening on." -msgstr "TCP-Kapu, amelyen a proxy várja a kapcsolatot" +msgstr "" -#, fuzzy msgid "Protocol the proxy uses." -msgstr "Protokoll, amelyet a proxy használ" +msgstr "" -#, fuzzy msgid "Network protocols to use." -msgstr "Protokoll, amelyet a proxy használ" +msgstr "" msgid "Use an IPv6-to-IPv4 Transport Relay Translator asspecified by RFC 3142." msgstr "" @@ -1790,30 +2766,23 @@ "The IPv6 address prefix used by the IPv6-to-IPv4 Transport Relay Translator." msgstr "" -#, fuzzy msgid "Current number of hosts in regular node caches." -msgstr "Gazdák száma jelenleg a hagyományos gazdatárban" +msgstr "" -#, fuzzy msgid "Current number of IPv4 hosts in ultra node caches." -msgstr "Gazdák száma jelenleg az átjátszó gazdatárban" +msgstr "" -#, fuzzy msgid "Current number of hosts in bad node caches." -msgstr "Gazdák száma jelenleg a rossz gazdatárban" +msgstr "" -#, fuzzy msgid "Maximum number of hosts in the regular node cache." -msgstr "Gazdák maximális száma a hagyományos gazdatárban" +msgstr "" -#, fuzzy msgid "Maximum number of IPv4 hosts in the ultra node cache." -msgstr "Gazdák maximális száma az átjátszó gazdatárban" +msgstr "" -#, fuzzy msgid "Maximum number of hosts in the BUSY, UNSTABLE and TIMEOUT lists." msgstr "" -"A FOGLALT, BIZONYTALAN és ELÉRHETETLEN listákon tárolt gépek maximális száma" msgid "" "Amount of tolerable messages above hard TTL limit per node. See also " @@ -1822,74 +2791,52 @@ "Pontonkénti kemény TTL korlát feletti üzenetek tűrhető száma. Lásd " "MAX_HIGH_TTL_RADIUS" -#, fuzzy msgid "" "Hop radius for counting high TTL limit messages (# hops lower than...). See " "also MAX_HIGH_TTL_MSG" msgstr "" -"Magas TTL korlát üzenetek számolásához használt sugár. Lásd MAX_HIGH_TTL_MSG." -#, fuzzy msgid "Bandwidth limit for incoming HTTP traffic in bytes/sec." -msgstr "Bejövő HTTP forgalom sávszélesség korlátja bájt/másodpercben." +msgstr "" -#, fuzzy msgid "Bandwidth limit for outgoing HTTP traffic in bytes/sec." -msgstr "Kimenő HTTP forgalom sávszélesség korlátja bájt/másodpercben." +msgstr "" -#, fuzzy msgid "Bandwidth limit for incoming Gnet traffic in bytes/sec." -msgstr "Bejövő gNet forgalom sávszélesség korlátja bájt/másodpercben." +msgstr "" -#, fuzzy msgid "Bandwidth limit for outgoing Gnet traffic in bytes/sec." -msgstr "Kimenő gNet forgalom sávszélesség korlátja bájt/másodpercben." +msgstr "" -#, fuzzy msgid "" "Bandwidth limit for incoming Gnet leaf traffic in bytes/sec. When running as " "an ultra node, this bandwidth is stolen from the regular HTTP traffic if the " "shaper for leaves is enabled." msgstr "" -"Bejövő gNet végponti forgalom sávszélesség korlátja bájt/másodpercben. " -"Átjátszó üzemmódban ezt a sávszélességet a hagyományos HTTP forgalomtól " -"veszi el, ha engedélyezett." -#, fuzzy msgid "" "Bandwidth limit for outgoing Gnet leaf traffic in bytes/sec. When running as " "an ultra node, this bandwidth is stolen from the regular HTTP traffic, if " "the shaper for leaves is enabled." msgstr "" -"Kimenő gNet végponti forgalom sávszélesség korlátja bájt/másodpercben. " -"Átjátszó üzemmódban ezt a sávszélességet a hagyományos HTTP forgalomtól " -"veszi el, ha engedélyezett." -#, fuzzy msgid "" "Maximum size of search queries messages we forward to others (in bytes)." -msgstr "A továbbított kereső üzenetek legnagyobb mérete bájtban." +msgstr "" -#, fuzzy msgid "" "Maximum size of search queries messages we allow, otherwise close the " "connection (in bytes)." msgstr "" -"A legnagyobb engedélyezett kereső üzenetméret bájtban, különben lezárja a " -"kapcsolatot." -#, fuzzy msgid "" "Maximum size of search answers messages we forward to others (in bytes)." -msgstr "A továbbított találat üzenetek legnagyobb mérete bájtban." +msgstr "" -#, fuzzy msgid "" "Maximum size of search answers messages we allow, otherwise close the " "connection (in bytes)." msgstr "" -"A legnagyobb engedélyezett találat-üzenetméret bájtban, különben lezárja a " -"kapcsolatot." msgid "" "Maximum number of relayed Query MUIDs to track. This allows mapping MUIDs of " @@ -1903,54 +2850,38 @@ "remembers for routing." msgstr "" -#, fuzzy msgid "" "Maximum size of unknown messages we allow, otherwise close the connection " "(in bytes)." msgstr "" -"A legnagyobb engedélyezett ismeretlen üzenetméret bájtban, különben lezárja " -"a kapcsolatot." msgid "" "Random factor for the hops field in search packets we send (between 0 and 3 " "inclusive)." msgstr "Véletlen tényező a sugár mezőhöz a kereső csomagokban 0-tól 3-ig." -#, fuzzy msgid "" "Whether or not to send push requests. If you are firewalled, gtk-gnutella " "will never send push requests anyway. If you don't let gtk-gnutella send " "pushes, it will not show search results that would require a push." msgstr "" -"Küldjön-e nyomás kérelmet. Tűzfal mögött gtk-gnutella sose küld nyomás " -"kérelmet. Ezt letiltva nem jelennek meg olyan találatok, amelyekhez nyomás " -"kell." -#, fuzzy msgid "" "Minimum amount of dup messages to enable kicking, per node (also see " "min_dup_ratio)." msgstr "" -"Legalább ennyi dup üzenet kell pontonként a rúgáshoz. Lásd min_dup_ratio." -#, fuzzy msgid "" "Minimum ratio of dups on received messages, per node (between 0.00 and " "100.00) (also see min_dup_msg) Note: the value is stored between 0 (0.0) " "and 10000 (100.0) in the config file." msgstr "" -"Legalább ekkora arányban kell dup üzenetet kapni pontonként (0.00 és 100.00 " -"között)(lásd min_dup_msg) Megjegyzés: 0 és 10000 közötti érték kerül " -"tárolásra a config fájlban." -#, fuzzy msgid "" "Only files with the given extensions will be shared. The special --all-- " "extension matches all files, even if they don't have any extension. Use " "with care." msgstr "" -"Csak a megadott végű fájlokat osztja meg. Az --all-- végződés minden fájlra " -"illeszkedik, még a pont nélküliekre is. Használja óvatosan!" msgid "Ignore symbolically linked directories when scanning files to share." msgstr "Szimbólikusan kötött mappák mellőzése a megosztáskor." @@ -1958,9 +2889,8 @@ msgid "Ignore symbolically linked regular files when scanning files to share." msgstr "Szimbólikusan kötött fájlok mellőzése a megosztáskor." -#, fuzzy msgid "Store incomplete files in this directory." -msgstr "Ebben a mappában tárolja a be nem fejezett letöltésfájlokat." +msgstr "" msgid "" "Move complete files to this directory. If this is set to the SAME directory " @@ -1980,53 +2910,39 @@ "mint a befejezett vagy a be nem fejezett mappa, akkor a fájlneveket " "megtoldja a .BAD végződéssel." -#, fuzzy msgid "Directories which contain shared files." -msgstr "A megosztott fájlok mappái" +msgstr "" -#, fuzzy msgid "" "List of networks considered local. This is a list of IP addresses, " "separated by ';'. The IP address can be given out fully, as in 192.168.0.1, " "or be optionally followed by '/' and a network mask prefix length. For " "instance, 192.168.0.1/24 would represent the whole 192.168.0.* network." msgstr "" -"A helyinek tartott hálózatok felsorolása. Ez egy IP-címlista „;”-vel " -"elválasztva. Az IP-cím megadható teljesen, pl. 192.168.0.1, vagy követheti " -"„/” és a hálózati maszkprefixhossz. Pl. 192.168.0.1/24 jelenti a 192.168.0.* " -"hálózatot." -#, fuzzy msgid "Total number of completed downloads in this session." -msgstr "A program indítása óta az összes befejezett letöltés száma." +msgstr "" -#, fuzzy msgid "Number of running uploads." -msgstr "Folyamatban lévő feltöltések száma" +msgstr "" -#, fuzzy msgid "Number of quick uploads currently running." -msgstr "Pillanatnyilag az átjátszó kapcsolatok száma." +msgstr "" -#, fuzzy msgid "Number of registered (pending) uploads." -msgstr "Bejegyzett (függő) feltöltések száma" +msgstr "" -#, fuzzy msgid "Total number of completed uploads in this session." -msgstr "A program indítása óta az összes befejezett feltöltés száma." +msgstr "" -#, fuzzy msgid "Global Unique IDentifier of this node." -msgstr "E pont GUID-je" +msgstr "" -#, fuzzy msgid "Kademlia Unique IDentifier of this node in the DHT." -msgstr "E pont GUID-je" +msgstr "" -#, fuzzy msgid "Whether or not to use swarming (recommended = YES)." -msgstr "Legyen-e zsúfolás (ajánlott IGEN)" +msgstr "" msgid "" "Whether or not to launch competing downloads when swarming and there are " @@ -2035,23 +2951,18 @@ "Legyen-e egyidejűleg több forrásból letöltés zsúfoláskor, amikor sok forrás " "van néhány maradék darabbal." -#, fuzzy msgid "" "Minimum chunk size when swarming. This is only a hint as gtk-gnutella will " "download less if you only have a few bytes to get for a file..." msgstr "" -"Zsúfolás legkisebb darabja. Ez csak egy javaslat, mivel gtk-gnutella " -"kevesebbet tölt le ha már csak néhány bájt maradt a fájlból." -#, fuzzy msgid "Maximum chunk size when swarming." -msgstr "Zsúfolás legnagyobb darabja." +msgstr "" -#, fuzzy msgid "" "Whether or not to automatically queue search results that match a file in " "the download queue." -msgstr "Magától beállítsa-e a sorba a találatokat" +msgstr "" msgid "" "Whether or not to automatically feed the download mesh with data gathered " @@ -2062,35 +2973,26 @@ "átfolynak.Ez újakat keres a megosztott fájlokhoz vagy azokhoz, amelyek a " "letöltő hálóban vannak." -#, fuzzy msgid "" "When enabled, SHA1s must match. Otherwise, name and size will be sufficient." msgstr "" -"Engedélyezve SHA1-eknek meg kell egyezniük. Különben név és méret elégséges." -#, fuzzy msgid "Whether gtk-gnutella thinks you're currently firewalled, TCP-wise." -msgstr "gtk-gnutella szerint tűzfal mögött vagyunk-e" +msgstr "" -#, fuzzy msgid "Whether gtk-gnutella thinks it's connected to the Internet." -msgstr "gtk-gnutella szerint csatlakoztunk-e az Internethez" +msgstr "" -#, fuzzy msgid "Whether gtk-gnutella thinks you're currently firewalled, UDP-wise." -msgstr "gtk-gnutella szerint tűzfal mögött vagyunk-e" +msgstr "" -#, fuzzy msgid "Whether gtk-gnutella determined it could receive solicited UDP." -msgstr "gtk-gnutella szerint csatlakoztunk-e az Internethez" +msgstr "" -#, fuzzy msgid "" "Remove unnecessary ballast from query string before processing or forwarding " "them. Reduces traffic at the cost of little CPU time." msgstr "" -"Eltávolítja a felesleges terhet a kereső szövegből mielőtt feldolgozza " -"vagytovábbítja. Csökkenti a forgalmat egy kis CPU-idő árán." msgid "" "Also use sources that don't provide a SHA1 value for the first chunk of a " @@ -2103,34 +3005,24 @@ "eredményezhet átfedési problémákat később, ha az első darab egy másik " "fájlból származik. Óvatosan használja!" -#, fuzzy msgid "" "Whether gtk-gnutella is currently rebuilding its library in the background." -msgstr "Pillanatnyilag újraépíti-e gtk-gnutella a könvtárát a háttérben" +msgstr "" -#, fuzzy msgid "" "Whether gtk-gnutella is currently computing SHA1 of shared files in the " "background." msgstr "" -"Pillanatnyilag számít-e gtk-gnutella SHA1-et a megosztott fájlokra a " -"háttérben" -#, fuzzy msgid "" "Whether gtk-gnutella is currently verifying SHA1 of downloaded files in the " "background." msgstr "" -"Pillanatnyilag ellenőriz-e gtk-gnutella SHA1-et a letöltött fájlokra a " -"háttérben" -#, fuzzy msgid "" "Whether gtk-gnutella is currently moving files across filesystems or simply " "copying in the background." msgstr "" -"Pillanatnyilag mozgat-e gtk-gnutella fájlokat fájlrendszerek között vagy " -"egyszerűen másolja őket a háttérben" msgid "" "If active, only compressed incoming connections are allowed after the " @@ -2140,25 +3032,17 @@ "Bekapcsolva csak a tömörített kapcsolatokat engedi miután a legkevesebb " "kapcsolat létrejött. Mindig enged egy nem tömörített kapcsolatot" -#, fuzzy msgid "" "If deactivated, only uploads and downloads will continue. All Gnet " "connections are disabled/terminated." msgstr "" -"Kikapcsolva csak feltöltés és letöltés folytatódik. Minden gNet kapcsolatot " -"letilt/lezár" -#, fuzzy msgid "" "Whether gtk-gnutella should make sure the server confirms the URN of the " "file we're requesting when it is known locally and a traditional request by " "name is used (i.e. gtk-gnutella is not issuing a /uri-res/N2R? request). " "When set, it supersedes the optimistic first chunk setting." msgstr "" -"Meggyőződjön-e gtk-gnutella arról, hogy a kiszolgáló megerősíti a kért fájl " -"URN-ét, amikor helyben ismert és egy hagyományos kérelmet használunk (azaz " -"gtk-gnutella nem intéz /uri-res/N2R? kérelmeket) Beállítva felülbírálja a " -"derűlátó első darab beállítást." msgid "" "Whether gtk-gnutella should make sure the server gives us back a non-empty " @@ -2178,39 +3062,29 @@ "A gyorsabb kapcsolódás érdekében gtk-gnutella legfejlebb ennyi aktív " "kapcsolatot engedélyez, amíg próbálja feltölteni a kapcsolódó foglalatokat." -#, fuzzy msgid "" "Maximum amount of leaves we can accept. To be promoted Ultra, you should " -"reserve 32 bytes of bandwidth per leaf." +"reserve 32 bytes/sec of bandwidth per leaf." msgstr "" -"Fogadható végpontok legnagyobb száma. Átjátszóvá előléptetéshez legalább 32 " -"bájt sávszélességet kell fenntartani végpontonként." msgid "What to do with files that will be ignored for downloading." msgstr "Mit tesz a letöltéskor mellőzött fájlokkkal." -#, fuzzy msgid "" "The peer mode you want to operate as for gtk-gnutella. When auto is " "selected, gtk-gnutella will start as a leaf node and may be promoted to an " "ultra node if bandwidth and uptime permits, provided that you are not " "firewalled." msgstr "" -"gtk-gnutella kívánt üzemmódja. Amikor auto, végpontként kezd és előlép " -"átjátszó csomóponttá, ha a sávszélesség és a futási idő engedi, feltéve, " -"hogy nem vagyunk tűzfallal elzárva." -#, fuzzy msgid "Current peer mode for gtk-gnutella." -msgstr "gtk-gnutella jelenlegi üzemmódja" +msgstr "" -#, fuzzy msgid "How many file descriptors this process can open." -msgstr "Hány fájlleírót tud egy folyamat megnyitni." +msgstr "" -#, fuzzy msgid "How much physical memory is available." -msgstr "Hány KB fizikai memória elérhető." +msgstr "" msgid "How many downloads are currently held in the queue." msgstr "Hány letöltés van jelenleg a sorban." @@ -2246,18 +3120,13 @@ msgid "Amount of bytes uploaded so far, HTTP headers notwithstanding." msgstr "Eddig feltöltött bájtok száma, HTTP fejlécek nélkül" -#, fuzzy msgid "" "Whether gtk-gnutella should serve partial files whilst they are still " "incompletely downloaded. Recommended for network's health unless you " "already share many files, in which case it does no harm to leave it in, but " "will not matter as much." msgstr "" -"Osszon-e gtk-gnutella fájlrészleteket amíg nincsenek teljesen letöltve. " -"Ajánlott a hálózat érdekében hacsak nem oszt már sok fájlt, amely esetben " -"nem baj, ha marad, de nem sokat számít." -#, fuzzy msgid "" "When partial file sharing (PFSP) is enabled, gtk-gnutella will strive to " "download chunks in a random order, to maximize the spreading of the file in " @@ -2266,24 +3135,17 @@ "of data that should be continuously downloaded at the beginning of the " "file. Don't set it too large." msgstr "" -"Amikor a részleges fájlmegosztás (PFSP) engedélyezett, gtk-gnutella " -"igyekszik véletlen sorrendben tölteni, hogy a legjobban terítse a fájlt a " -"hálózaton. Azonban ez lehetetlenné teszi a vizsgálatokat (fájl típus, elő-" -"nézet, stb.) Ez a mező beállítja az adat első darabjának a méretét, amelyet " -"a fájl elejétől folyamatosan kell letölteni. Ne állítsa túl nagyra!" msgid "" "When partial file sharing (PFSP) is enabled, gtk-gnutella will not share " "partial files below this filesize. Don't set it too large." msgstr "" -#, fuzzy msgid "Number of crawler visits during this session." -msgstr "Csúszó látogatások az indulás óta" +msgstr "" -#, fuzzy msgid "Number of UDP crawler visits during this session." -msgstr "Csúszó látogatások az indulás óta" +msgstr "" msgid "" "Whether the clock of this host is kept accurate via NTP. When set, the " @@ -2310,16 +3172,12 @@ "Érzékelt instabil kiszolgálók IP-követése, megakadályozza a jövőbeni " "kapcsolatot velük." -#, fuzzy msgid "" "Whether gtk-gnutella should determine the servent types (as identified by " "their vendor string) that are unstable, preventing further connections to/" "from them. This only works when gtk-gnutella already keeps track of " "unstable IP addresses." msgstr "" -"Meghatározza-e gtk-gnutella a kiszolgálók típusát (az eladó szöveg alapján), " -"amelyek instabilak megakadályozandó a jövőbeni kapcsolatokat velük. Csak az " -"instabil IP-követéssel együtt műdödik." msgid "" "Whether gtk-gnutella should automatically remove the file whenever it gets a " @@ -2341,16 +3199,12 @@ "kiszolgálón, de ha a már letöltött adat rossz, akkor a visszalépés segíthet " "a helyreállításban." -#, fuzzy msgid "" "The hostname of the server that can be used by downloaders to find the IP " "address via a DNS resolution. If you have a dynamic IP address coupled with " "a dynamic DNS service, then this is valuable to downloaders: they may find " "your node even after a few rotations of your IP address." msgstr "" -"A gépnév, amelyet a letöltők használhatnak DNS névfeloldással. Ha önnek " -"dinamikus IP címe van egy dinamikus DNS szolgáltatóval, akkor ez értékes a " -"letöltőknek, mert megtalálják a gépet az IP-címváltozás után is." msgid "" "Whether gtk-gnutella should advertise the hostname of your server to " @@ -2363,11 +3217,9 @@ msgstr "" "A kapcsolatok számának százaléka, amit gtk-gnutella társaknak tartunk fent." -#, fuzzy msgid "Maximum percentage of slots a vendor can occupy." -msgstr "A nyílások legnagyobb százaléka, amelyet egy adó foglalhat" +msgstr "" -#, fuzzy msgid "" "Size of the RX socket buffer to be used for downloads, in kibibytes. If you " "wish to avoid Gnutella downloads using up all your bandwidth, set it to a " @@ -2376,12 +3228,6 @@ "greater value. Remember: the smaller the value, the more you will be able to " "precisely control the incoming rate." msgstr "" -"RX sor mérete letöltésekhez kbájtban. Ha el kívánja kerülni, hogy Gnutella-" -"letöltések felhasználják az egész sávszélességet, állítsa kicsi értékre (az " -"alapértelmezett 8K)! Ha nem bánja, hogy az egész rendelkezésre álló " -"sávszélességet lekösse növeleve a kapcsolatai késését, állítsa nagyobbra! " -"Megjegyzés: minél kisebb az érték, annál pontosabban ellenőrizhető a bejövő " -"forgalom." msgid "" "Size of the RX socket buffer to be used for nodes, in kbytes. The lower the " @@ -2431,11 +3277,10 @@ msgstr "" "Tűzfalmentes-e a hálózati kapcsolat az átjátszó üzemmódba való átálláshoz." -#, fuzzy msgid "" "Whether we meet the minimum amount of peer connections requirement to become " "an Ultra node." -msgstr "Elég sok-e a fájlleíró az átjátszó üzemmódba való átálláshoz." +msgstr "" msgid "" "Whether we meet the amount of file descriptor requirement to become an Ultra " @@ -2448,20 +3293,15 @@ msgid "Whether we meet the bandwidth requirements to become an Ultra node." msgstr "Elég nagy-e a sávszélesség az átjátszó üzemmódba való átálláshoz." -#, fuzzy msgid "Whether we meet the UDP requirements to become an Ultra node." -msgstr "Elég sok-e a memória az átjátszó üzemmódba való átálláshoz." +msgstr "" -#, fuzzy msgid "" "Size of the search queue holding the locally generated queries before they " "are sent on a given connection. When full, the oldest query is dropped " "without being sent. Set it so that it is slightly larger than the amount of " "opened searches." msgstr "" -"A helyben generált keresések kiküldés előtti sormérete. Betelve a legrégibb " -"keresést ejti küldés nélkül. Állítsa nagyobbra, mint a nyitott keresések " -"legnagyobb mérete." msgid "" "Minimum amount of seconds between two consecutive queries sent to a given " @@ -2491,7 +3331,6 @@ "A „halott” bejegyzések tartásának ideje másodpercben. Így ennyi ideig még " "láthatóak a felületen a befejező állapotukkal." -#, fuzzy msgid "" "Whether gtk-gnutella should actively monitor query strings by TTL and hop " "count and drop duplicates. Only applies when not running as a leaf node, " @@ -2499,12 +3338,7 @@ "neighbor. Dropped queries will be accounted for in the 'Message throttle' " "counter." msgstr "" -"Aktívan figyelje-e gtk-gnutella a keresőszövegeket TTL, sugár és duplikáltak " -"ejtése szerint. Csak akkor számít, ha nem végponti üzemmódban működik, és " -"csak a pozitív sugárra, azaz nem közvetlen szomszédtól származókra. Ejtett " -"keresésekről bővebben az „üzenetdobás” számlálóban." -#, fuzzy msgid "" "Half the duration during which gtk-gnutella should remember the recently " "relayed queries by TTL and hop count. The default value of 5 should be just " @@ -2512,12 +3346,7 @@ "higher it is set, the more likely you are to drop legitimate queries, so be " "careful." msgstr "" -"Fél ideje annak, ameddig tartja a legutóbbi továbbított kereséseket TTL és " -"sugár szerint. Az alapértelmezett 5 elég kell legyen, de lehet kísérletezni " -"ettől különböző beállításokkal. Minél nagyobbra állítja, annál valószínűbb, " -"hogy érvényes kereséseket ejt." -#, fuzzy msgid "" "The minimum amount of seconds to enforce between two identical queries from " "leaf nodes. If the requery too early, it is dropped and accounted for in " @@ -2527,20 +3356,15 @@ "can lower the constraint significantly. Deviations from the default of 1700 " "have exponential effects on the network traffic." msgstr "" -"Egyazon végpontból érkező két azonos keresés között kikényszerített " -"másodpercek legnagyobb száma. Ha ismételt keresés történik a megadott időn " -"belül, akkor ejti és számolja az „üzenetdobás” számlálóban." msgid "Time at which we started the last scan of the library." msgstr "Az utolsó könyvtárfelmérés kezdetének ideje." -#, fuzzy msgid "Time at which the last scan of the library finished." -msgstr "Az utolsó könyvtárfelmérés kezdetének ideje." +msgstr "" -#, fuzzy msgid "The number of seconds the last scan of the library took." -msgstr "Az utolsó könyvtárfelmérés kezdetének ideje." +msgstr "" msgid "Time at which we started shared file indexing." msgstr "A megosztott fájlok indexelésének kezdő időpontja." @@ -2548,9 +3372,8 @@ msgid "Time spent indexing shared files." msgstr "Megosztott fájlok indexelésével töltött idő." -#, fuzzy msgid "Memory used by the QRP tables" -msgstr "A QRP-tábla által használt nyílások száma." +msgstr "" msgid "Time at which we started query routing table generation." msgstr "Keresésirányító táblakészítés kezdési ideje." @@ -2582,9 +3405,8 @@ msgid "Amount of hashed keywords in our QRP table." msgstr "Hash-elt kulcsszavak mennyisége a QRP-táblában." -#, fuzzy msgid "Total raw size of the QRP table patch, in bytes." -msgstr "QRP-táblafolt összes nyers mérete bájtban." +msgstr "" msgid "Final QRP table patch length, after possible compression." msgstr "Végső QRP-folttábla hossza, lehetséges tömörítés után." @@ -2604,15 +3426,11 @@ "működés továbbra is lehetséges. Az állapot automatikusan megszűnik további " "10 perc elegendő fájlleíróval történő működés után." -#, fuzzy msgid "" "When set, gtk-gnutella has run out of file descriptors, and operations are " "necessarily degraded, if not impossible. The condition automatically clears " "itself after 10 minutes past the last occurrence." msgstr "" -"Felkapcsolva gtk-gnutella kifogyott a fájlleírókból, és a működés " -"szükségszerűen csökkent, ha nem lehetetlen. Az állapot automatikusan " -"megszűnik 10 perccel az utolsó ilyen eset után." msgid "If set, spaces in filenames are replaced with underscores." msgstr "" @@ -2680,7 +3498,7 @@ msgid "" "If set to TRUE, the global hostiles.txt is used as well as the private " -"$GTK_GNUTELLA_DIR/hostiles.txt. This allows to separate your private ban " +"$GTK_GNUTELLA_DIR/hostiles.txt. This allows you to separate your private ban " "list from the global one distributed with gtk-gnutella." msgstr "" @@ -2695,21 +3513,17 @@ msgid "If TRUE, other hosts can request a complete list of all shared files." msgstr "" -#, fuzzy msgid "Number of HTML browsing requests received in this session." -msgstr "Csúszó látogatások az indulás óta" +msgstr "" -#, fuzzy msgid "Number of HTML browsing requests fully served in this session." -msgstr "Csúszó látogatások az indulás óta" +msgstr "" -#, fuzzy msgid "Number of Gnutella browsing requests received in this session." -msgstr "Csúszó látogatások az indulás óta" +msgstr "" -#, fuzzy msgid "Number of Gnutella browsing requests fully served in this session." -msgstr "Csúszó látogatások az indulás óta" +msgstr "" msgid "" "The average CPU usage indicates overloading, so gtk-gnutella is reducing the " @@ -2743,26 +3557,22 @@ "displayed using the historical base2 convention with binary prefixes." msgstr "" -#, fuzzy msgid "Debug level for Reliable UDP (RUDP) code." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for the Distributed Hash Table (DHT) code." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for the OOB-proxying of queries." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "" "If set gtk-gnutella also listens on a local (unix domain) socket which is " "located in ~/.gtk-gnutella/socket." msgstr "" -#, fuzzy msgid "Don't start more than this number of parallel downloads per file." -msgstr "Nem tölt fel ennél több fájlt egyidejűleg egy gépre." +msgstr "" msgid "" "If enabled, all received packets are dumped to $GTK_GNUTELLA_DIR/packets_rx." @@ -2778,56 +3588,42 @@ "of the shared files before a change becomes fully effective." msgstr "" -#, fuzzy msgid "Debug level for the shell." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "If larger than zero, no downloads are started." msgstr "" -#, fuzzy msgid "Debug level for the search queue." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for push-proxy code." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Number of THEX file requests received in this session." -msgstr "Csúszó látogatások az indulás óta" +msgstr "" -#, fuzzy msgid "Number of THEX file requests fully served in this session." -msgstr "Csúszó látogatások az indulás óta" +msgstr "" -#, fuzzy msgid "Debug level for Tigertree-related code." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "" "Whether gtk-gnutella is currently computing TTH of shared files in the " "background." msgstr "" -"Pillanatnyilag számít-e gtk-gnutella SHA1-et a megosztott fájlokra a " -"háttérben" -#, fuzzy msgid "" "Whether gtk-gnutella is currently verifying the TTH of downloaded files in " "the background." msgstr "" -"Pillanatnyilag ellenőriz-e gtk-gnutella SHA1-et a letöltött fájlokra a " -"háttérben" -#, fuzzy msgid "Maximum number of results to show in any search." -msgstr "A legtöbb eredmény, amely valamely keresésből ered" +msgstr "" -#, fuzzy msgid "Maximum number of results to show in a browse_host request." -msgstr "A legtöbb eredmény, amely valamely keresésből ered" +msgstr "" msgid "Date of the latest SVN release." msgstr "" @@ -2838,13 +3634,11 @@ msgid "Signature of the latest SVN release notification." msgstr "" -#, fuzzy msgid "Maximum number of hosts in the TLS node cache." -msgstr "Gazdák maximális száma az átjátszó gazdatárban" +msgstr "" -#, fuzzy msgid "Maximum time before removing hosts from the TLS cache." -msgstr "Gazdák maximális száma az átjátszó gazdatárban" +msgstr "" msgid "" "If set to TRUE the tigertree root hash (TTH) can be discovered on the fly. " @@ -2858,17 +3652,14 @@ "experience." msgstr "" -#, fuzzy msgid "Maximum number of hosts in the G2 node cache." -msgstr "Gazdák maximális száma az átjátszó gazdatárban" +msgstr "" -#, fuzzy msgid "Maximum time before removing hosts from the G2 cache." -msgstr "Gazdák maximális száma az átjátszó gazdatárban" +msgstr "" -#, fuzzy msgid "Debug level for management of G2-only hosts." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "" "Whether GTKG can switch among the several files waiting to be downloaded " @@ -2881,7 +3672,6 @@ "disable unless you know what you are doing." msgstr "" -#, fuzzy msgid "" "When partial file sharing (PFSP) is enabled, gtk-gnutella will strive to " "download chunks in a random order, to maximize the spreading of the file in " @@ -2891,11 +3681,6 @@ "tail of the file as soon as possible. Set it to 0 to disable any tail-" "downloading preference." msgstr "" -"Amikor a részleges fájlmegosztás (PFSP) engedélyezett, gtk-gnutella " -"igyekszik véletlen sorrendben tölteni, hogy a legjobban terítse a fájlt a " -"hálózaton. Azonban ez lehetetlenné teszi a vizsgálatokat (fájl típus, elő-" -"nézet, stb.) Ez a mező beállítja az adat első darabjának a méretét, amelyet " -"a fájl elejétől folyamatosan kell letölteni. Ne állítsa túl nagyra!" msgid "" "Whether GTKG should post-process filenames to remove consecutive '_' in the " @@ -2909,21 +3694,17 @@ "files and push-proxies for firewalled hosts. It requires UDP support." msgstr "" -#, fuzzy msgid "Debug level for the callout queue." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for DHT node lookups." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for DHT key/value storage." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for DHT key/value publishing." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "" "Bandwidth hint for DHT user lookups, in bytes/sec. This is used both for " @@ -2954,9 +3735,8 @@ "closest nodes will keep mutual knowledge about each other" msgstr "" -#, fuzzy msgid "Debug level for the DHT user lookup queue." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "If TRUE, DHT storage uses memory instead of diskspace." msgstr "" @@ -2978,9 +3758,8 @@ "uploads and push-proxy exchanges." msgstr "" -#, fuzzy msgid "Debug level for (generic) file verification code." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "" "Maximum number of hosts in the local address cache, which remembers the " @@ -2992,80 +3771,63 @@ "remembers the recent IP:port combinations we had." msgstr "" -#, fuzzy msgid "Debug level for management of local address cache." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "" "If enabled, all packets enqueued for transmission are dumped to " "$GTK_GNUTELLA_DIR/packets_tx.dump." msgstr "" -#, fuzzy msgid "Debug level the TCP message queues" -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for the UDP message queue." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "" "Maximum size of the UDP message queue (in bytes). Must be at least 150 " "percent of the maximum message size." msgstr "" -"A küldősor legnagyobb mérete bájtban. Legalább a legnagyobb üzenet 150%-ának " -"kell lennie." -#, fuzzy msgid "Debug level for the management of the clock accuracy." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for the firewalled status management." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for host management." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for DHT root node caching." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Logged statistics level for code shared between GUI and core." -msgstr "Hibajavítás szintje a felhasználói felület és a mag osztott kódjára" +msgstr "" -#, c-format msgid "" "If TRUE, the spam SHA1 database is kept in memory. If FALSE, it is kept in a " "fast disk database, which saves a large amount of core memory and reduces " "the overall footprint, at the cost of an increased I/O level. However, the " -"DB cache has typically a 90% hit rate, so the actual overhead is barely " +"DB cache has a 90 percent hit rate, so the actual overhead is barely " "noticeable when running as an ultra node and should remain completely " "unnoticed when running as a leaf." msgstr "" -#, fuzzy msgid "Debug level for spam detection." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for lockfile management." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for the zone-based memory allocator." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for the pool-based memory allocator." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for the RX buffer allocator." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "" "Whether the zone-based memory allocator should always keep the zones in " @@ -3076,43 +3838,35 @@ "spam_lut_in_memory to FALSE." msgstr "" -#, fuzzy msgid "Debug level for the virtual memory manager." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for final shutdown." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "Country preferences" msgstr "" -#, fuzzy msgid "Debug level for country limits." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Whether to log dropped Gnutella messages" -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for whitelist management." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for DHT token caching." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for DHT publishing from Gnutella." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "Defines which DHT messages should be traced." msgstr "" -#, fuzzy msgid "Enable bandwidth limitation for outgoing DHT traffic." -msgstr "Kimenő HTTP forgalom korlátozása" +msgstr "" msgid "" "Bandwidth limit for outgoing DHT traffic in bytes/sec. It is always pooled " @@ -3120,33 +3874,26 @@ "enabled, so that UDP queues can flush more quickly." msgstr "" -#, fuzzy msgid "Maximum size of the DHT message queue (in bytes)." -msgstr "A továbbított találat üzenetek legnagyobb mérete bájtban." +msgstr "" -#, fuzzy msgid "Debug level for bandwidth scheduler." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for the DHT stable node recorder." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for the file (re)loading, on change." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for the file moving, accross filesystems." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for query hit message generation." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for version management." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "Minimum CPU frequency, in Hz." msgstr "" @@ -3154,9 +3901,8 @@ msgid "Maximum CPU frequency, in Hz." msgstr "" -#, fuzzy msgid "DHT bootstrap status." -msgstr "HTTP-forgalmi adatok" +msgstr "" msgid "" "The DHT running mode. An active node will be able to store values and is a " @@ -3171,39 +3917,32 @@ msgid "Current DHT running mode." msgstr "" -#, fuzzy msgid "Debug level for the one-time memory allocator." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for the host cache." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "Random bits." msgstr "" -#, fuzzy msgid "Average servent downtime." -msgstr "A kiszolgáló átlagos futási ideje másodpercben" +msgstr "" msgid "Time when last shutdown occurred." msgstr "" -#, fuzzy msgid "Debug level for alive pings." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for the versatile XML layer." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for the UPnP layer." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for the SOAP layer." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "Defines SOAP exchanges tracing type." msgstr "" @@ -3236,9 +3975,8 @@ msgid "Whether gtk-gnutella can install port mappings, if needed." msgstr "" -#, fuzzy msgid "Debug level for the NAT-PMP layer." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "" "Whether NAT-PMP (NAT Port Mapping Protocol) should be enabled. Support for " @@ -3255,46 +3993,37 @@ "mappings, if required." msgstr "" -#, fuzzy msgid "Debug level for the TX (transmit) network layer." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for the RX (receive) network layer." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for the I/O input event layer." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for the background task scheduler." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Whether gtk-gnutella was able to configure port mappings." -msgstr "gtk-gnutella szerint csatlakoztunk-e az Internethez" +msgstr "" -#, fuzzy msgid "Whether gtk-gnutella disabled HTTP bandwidth stealing." -msgstr "gtk-gnutella szerint csatlakoztunk-e az Internethez" +msgstr "" -#, fuzzy msgid "Whether gtk-gnutella ignores HTTP stolen bandwidth." -msgstr "gtk-gnutella szerint csatlakoztunk-e az Internethez" +msgstr "" msgid "Whether gtk-gnutella enforces uniform HTTP outgoing bandwidth." msgstr "" -#, fuzzy msgid "" "Whether gtk-gnutella should use HTTP request pipelining when possible, in " "order to decrease downloading latency." -msgstr "Reklámozza-e gtk-gnutella a gépnevét a letöltőknek és a keresőknek." +msgstr "" -#, fuzzy msgid "Maximum chunk size when swarming with HTTP pipelining." -msgstr "Zsúfolás legnagyobb darabja." +msgstr "" msgid "" "Whether the Gnutella UDP Extension for Scalable Searches (GUESS) should be " @@ -3316,25 +4045,20 @@ "Searches)." msgstr "" -#, fuzzy msgid "Maximum number of IPv4 hosts in the regular GUESS cache." -msgstr "Gazdák maximális száma a hagyományos gazdatárban" +msgstr "" -#, fuzzy msgid "Current number of IPv4 hosts in the regular GUESS cache." -msgstr "Gazdák száma jelenleg a hagyományos gazdatárban" +msgstr "" -#, fuzzy msgid "Maximum number of IPv4 hosts in the introduction GUESS cache." -msgstr "Gazdák maximális száma az átjátszó gazdatárban" +msgstr "" -#, fuzzy msgid "Current number of IPv4 hosts in the introduction GUESS cache." -msgstr "Gazdák száma jelenleg az átjátszó gazdatárban" +msgstr "" -#, fuzzy msgid "Debug level for the DB disk/RAM storage layer." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "" "The current Session ID. This is a unique ID generated each time gtk-" @@ -3362,13 +4086,11 @@ "overall" msgstr "" -#, fuzzy msgid "Debug level for the matching code." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for the time synchronization code." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "" "Whether queries can request partial results hits, i.e. files which are " @@ -3381,9 +4103,8 @@ "are returned." msgstr "" -#, fuzzy msgid "Whether what's-new? queries should be answered to." -msgstr "Küldött keresések számának kijelzése." +msgstr "" msgid "" "When set, gtk-gnutella will automatically stop opened searches from which " @@ -3391,171 +4112,243 @@ "configured expiration time." msgstr "" -#, fuzzy msgid "Maximum number of results to show in a What's New? request." -msgstr "A legtöbb eredmény, amely valamely keresésből ered" +msgstr "" -#, fuzzy msgid "Maximum number of results to show in a passive search request." -msgstr "A legtöbb eredmény, amely valamely keresésből ered" +msgstr "" -#, fuzzy msgid "Whether to log duplicate Gnutella messages from same node." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Whether to log duplicate Gnutella messages with a higher TTL." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Whether to log duplicate Gnutella messages (not from same node)." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Whether to log new Gnutella messages, never seen before." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Whether to log Gnutella routing decisions." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Whether to log bad Gnutella messages, corrupted or unexpected." -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "Whether to log conditions triggering query hit spam flagging." msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the ultra node cache." -msgstr "Gazdák maximális száma az átjátszó gazdatárban" +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in ultra node caches." -msgstr "Gazdák száma jelenleg az átjátszó gazdatárban" +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in the regular GUESS cache." -msgstr "Gazdák száma jelenleg a hagyományos gazdatárban" +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in the introduction GUESS cache." -msgstr "Gazdák száma jelenleg az átjátszó gazdatárban" +msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the regular GUESS cache." -msgstr "Gazdák maximális száma a hagyományos gazdatárban" +msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the introduction GUESS cache." -msgstr "Gazdák maximális száma az átjátszó gazdatárban" +msgstr "" -#, fuzzy msgid "Debug level for the malloc() replacement allocator." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for bad query hit messages." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Debug level for GUID management." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy -msgid "disable" -msgstr "biztos" +msgid "Debug level for the TX (transmit) deflating network layer." +msgstr "" -#, fuzzy -msgid "by words" -msgstr "Kulcsszók" +msgid "Comma-separated list of TX debugging hosts (IP addresses only)" +msgstr "" -msgid "by whole query" +msgid "" +"Comma-separated list of hosts for whom we want to dump RX traffic (IP " +"addresses only)" msgstr "" -#, fuzzy -msgid "by router" -msgstr "Nincs út" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they emit " +"(IP addresses only)" +msgstr "" -msgid "TCP & UDP" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they " +"receive (IP addresses only)" msgstr "" -msgid "TCP only" +msgid "" +"Allow GUESS to use some of the unused Gnutella outgoing bandwidth regardless " +"of the GUESS bandwidth hint. If FALSE, only the configured bandwidth hint " +"will be used. When running as a leaf this should be set to TRUE to make " +"GUESS queries run faster." msgstr "" -msgid "UDP only" +msgid "Debug level for the UDP TX scheduler." msgstr "" -msgid "Ping" -msgstr "Kip" +msgid "" +"Debugging flags for the semi-reliable UDP TX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: transmissions, 16: timeouts." +msgstr "" -msgid "Pong" -msgstr "Kop" +msgid "Comma-separated list of RX debugging hosts (IP addresses only)" +msgstr "" -msgid "Bye" -msgstr "Viszlát" +msgid "" +"Debugging flags for the semi-reliable UDP RX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: receptions, 16: timeouts." +msgstr "" -msgid "QRP" -msgstr "QRP" +msgid "Whether to log sent semi-reliable UDP messages." +msgstr "" -msgid "HSEP" +msgid "Whether to log received semi-reliable UDP messages." msgstr "" -msgid "RUDP" +msgid "Debug level for the secured OOB query hit claiming." msgstr "" -#, fuzzy -msgid "Vendor spec." -msgstr "Eladó leírás" +msgid "Whether to log sent vendor messages." +msgstr "" -#, fuzzy -msgid "Vendor std." -msgstr "Eladó std." +msgid "Whether to log received vendor messages." +msgstr "" -msgid "Push" -msgstr "Nyomás" +msgid "Debugging flags for the DHT token cache (developers only)." +msgstr "" -msgid "Query" -msgstr "Keresés" +msgid "Whether to log weird DHT message headers when debugging." +msgstr "" -#, fuzzy -msgid "Query Hit" -msgstr "Találat" +msgid "Debug level for the DHT Remote Procedure Call (RPC) code." +msgstr "" -#, fuzzy -msgid "DHT Ping" -msgstr "Kip" +msgid "Whether to log UHC pings we receive." +msgstr "" -#, fuzzy -msgid "DHT Pong" -msgstr "Kop" +msgid "Whether to log UHC pings we emit." +msgstr "" -#, fuzzy -msgid "DHT Store" -msgstr "HTTP-forgalom" +msgid "Whether the program was properly shutdown." +msgstr "" -msgid "DHT Store Ack" +msgid "Whether the program restarted after a clean shutdown." msgstr "" -msgid "DHT Find Node" +msgid "Debug level for DHT key management." msgstr "" -msgid "DHT Found Node" +msgid "Debug level for DHT value management." msgstr "" -msgid "DHT Find Value" +msgid "ID of the current process." msgstr "" -#, fuzzy -msgid "DHT Value" -msgstr "Méret" +msgid "Debug level for HTTP range parsing / handling." +msgstr "" -msgid "Total" -msgstr "Összesen" +msgid "" +"Lease time when installing port mappings via UPnP or NAT-PMP, in seconds. A " +"value of 0 requests permanent mappings." +msgstr "" + +msgid "Whether the program is auto-restarting at the user's request." +msgstr "" + +msgid "Debug level for time management." +msgstr "" + +msgid "Debug level for the tmalloc() thread-magazine object distributor." +msgstr "" + +msgid "Debug level for the event queue thread." +msgstr "" + +msgid "Maximum number of G2 hubs in the hub cache." +msgstr "" + +msgid "Current number of IPv4 hosts in the G2 hub caches." +msgstr "" + +msgid "Whether the G2 protocol should be enabled." +msgstr "" + +msgid "Number of G2 nodes currently connected." +msgstr "" + +msgid "Maximum amount of G2 hubs we should connect to as a leaf." +msgstr "" + +msgid "Whether to log bad G2 messages, corrupted or unexpected." +msgstr "" + +msgid "Whether to log dropped G2 messages" +msgstr "" + +msgid "Debug level for the G2 RPC layer." +msgstr "" + +msgid "Whether to log summary of received query hits" +msgstr "" + +msgid "Whether to log summary of each record in received query hits" +msgstr "" + +msgid "Number of G2 browsing requests received in this session." +msgstr "" + +msgid "Number of G2 browsing requests fully served in this session." +msgstr "" + +msgid "Whether to log G2 messages we're attempting to send" +msgstr "" + +msgid "" +"Timestamp at which the current session was started. This stamp remains " +"unchanged when gtk-gnutella restarts after a crash or an explicit restart " +"request." +msgstr "" + +msgid "No TCP listening socket bound to allow incoming connections." +msgstr "" + +msgid "disable" +msgstr "" + +msgid "by words" +msgstr "" + +msgid "by whole query" +msgstr "" + +msgid "by router" +msgstr "" + +msgid "TCP & UDP" +msgstr "" + +msgid "TCP only" +msgstr "" + +msgid "UDP only" +msgstr "" + +msgid "Query Hit" +msgstr "" -#, fuzzy msgid "Icons" -msgstr "másodperc" +msgstr "" msgid "Text" msgstr "Szöveg" @@ -3566,9 +4359,8 @@ msgid "Both (horizontal)" msgstr "" -#, fuzzy msgid "This session" -msgstr "TX tömörítés" +msgstr "" msgid "1 hour" msgstr "" @@ -3588,13 +4380,11 @@ msgid "2 weeks" msgstr "" -#, fuzzy msgid "Search monitor enabled." -msgstr "Keresésfigyelő engedélyezve" +msgstr "" -#, fuzzy msgid "Maximum number of queries visible in search monitor." -msgstr "A keresésfigyelőben látható lekérdezések száma legfeljebb" +msgstr "" msgid "" "Whether to hide hits that have been considered for auto-downloading based on " @@ -3603,209 +4393,158 @@ "Elrejtse-e az SHA1 vagy filterek alapján magától letöltésre kerülő " "találatokat" -#, fuzzy msgid "Widths of the columns in the nodes table." -msgstr "Az oszlopok szélessége a pontok táblán" +msgstr "" -#, fuzzy msgid "Which columns are visible in the nodes pane." -msgstr "Mely oszlopok láthatóak a csomóponti táblán" +msgstr "" -#, fuzzy msgid "Widths of the columns in the file info table." -msgstr "Az oszlopok szélessége a fájlinfó táblán" +msgstr "" -#, fuzzy msgid "Visibility of the columns in the file info table." -msgstr "Az oszlopok szélessége a fájlinfó táblán" +msgstr "" -#, fuzzy msgid "Widths of the columns in the sources table." -msgstr "Az oszlopok szélessége a pontok táblán" +msgstr "" -#, fuzzy msgid "Widths of the columns in the search list on the sidebar." -msgstr "Az oszlopok szélessége a keresések listájában az oldalpanelen" +msgstr "" -#, fuzzy msgid "Which columns are visible in the search results tables." -msgstr "Mely oszlopok láthatóak a keresés eredményei táblán" +msgstr "" -#, fuzzy msgid "Widths of the columns in the search results tables." -msgstr "Az oszlopok szélessége a keresés eredményei táblán" +msgstr "" -#, fuzzy msgid "Widths of the columns in the search stats table." -msgstr "Az oszlopok szélessége a keresés-statisztika táblán" +msgstr "" -#, fuzzy msgid "Widths of the columns in the upload stats table." -msgstr "Az oszlopok szélessége a feltöltés-statisztika táblán" +msgstr "" -#, fuzzy msgid "Which columns are visible in the upload stats table." -msgstr "Mely oszlopok láthatóak a feltöltési statisztikák táblán" +msgstr "" -#, fuzzy msgid "Widths of the columns in the uploads table." -msgstr "Az oszlopok szélessége a feltöltések táblán" +msgstr "" -#, fuzzy msgid "Which columns are visible in the uploads table." -msgstr "Mely oszlopok láthatóak a feltöltések táblán" +msgstr "" -#, fuzzy msgid "Widths of the columns in the rules table in the filter dialog." -msgstr "Az oszlopok szélessége a szabályok táblában a szűrő dialógusban" +msgstr "" -#, fuzzy msgid "Widths of the columns in the filter table in the filter dialog." -msgstr "Az oszlopok szélessége a szűrők táblában a szűrő dialógusban" +msgstr "" -#, fuzzy msgid "Widths of the columns in the Gnet packet stats table." -msgstr "Az oszlopok szélessége a gnet csomag-statisztika tábláján" +msgstr "" -#, fuzzy msgid "Widths of the columns in the Gnet fc ttl stats table." -msgstr "Az oszlopok szélessége a gnet fc ttl statisztika táblán" +msgstr "" -#, fuzzy msgid "Widths of the columns in the Gnet fc hops stats table." -msgstr "Az oszlopok szélessége a gnet sugár-számláló statisztika táblán" +msgstr "" -#, fuzzy msgid "Widths of the columns in the Gnet horizon stats table." -msgstr "Az oszlopok szélessége a gnet látókör statisztika táblán" +msgstr "" -#, fuzzy msgid "Widths of the columns in the Gnet stats drop reasons table." -msgstr "Az oszlopok szélessége a gnet statisztika ejtés indokai táblán" +msgstr "" -#, fuzzy msgid "Widths of the columns in the hostcache table." -msgstr "Az oszlopok szélessége a gazdatár táblán" +msgstr "" -#, fuzzy msgid "Position and size of the main window." -msgstr "A fő ablak helye és mérete" +msgstr "" -#, fuzzy msgid "Position and size of the filter dialog." -msgstr "A szűrő dialógus helye és mérete" +msgstr "" -#, fuzzy msgid "Position and size of the preferences dialog." -msgstr "A szűrő dialógus helye és mérete" +msgstr "" -#, fuzzy msgid "Position of the divider in the fileinfo panel." -msgstr "Az elválasztás helye a fájlinfó panelen" +msgstr "" -#, fuzzy msgid "Size of the sidebar." -msgstr "Az oldalpanel szélessége" +msgstr "" -#, fuzzy msgid "Position of the divider in the Gnet stats pane." -msgstr "Az elválasztás helye gnet statisztikái lapon" +msgstr "" -#, fuzzy msgid "Position of the divider in the search results pane." -msgstr "Az elválasztás helye keresések eredményei lapon" +msgstr "" -#, fuzzy msgid "Debug level for the gui." -msgstr "A gui hibajavítási szintje" +msgstr "" -#, fuzzy msgid "Size of the filter tree in the filter dialog." -msgstr "A szűrőfa mérete a szűrő dialógusban" +msgstr "" -#, fuzzy msgid "Show tabs or search list." -msgstr "Tabokat mutat a keresőlistában" +msgstr "" -#, fuzzy msgid "Display Searchbar." -msgstr "Eszköztárat mutat" +msgstr "" -#, fuzzy msgid "Display Sidebar." -msgstr "Eszköztárat mutat" +msgstr "" -#, fuzzy msgid "Display Menu." -msgstr "Kijelzés" +msgstr "" -#, fuzzy msgid "Display statusbar." -msgstr "Állapotsort mutat" +msgstr "" -#, fuzzy msgid "Display upload statistics in sidebar." -msgstr "Feltöltési satisztikákat mutat az oldalpanelen" +msgstr "" -#, fuzzy msgid "Display download statistics in sidebar." -msgstr "Letöltési satisztikákat mutat az oldalpanelen" +msgstr "" -#, fuzzy msgid "Display connection statistics in sidebar." -msgstr "Csatlakozási satisztikákat mutat az oldalpanelen" +msgstr "" -#, fuzzy msgid "Display incoming HTTP traffic bandwidth usage." -msgstr "Bejövő HTTPforgalom sávszélesség-használatát mutatja" +msgstr "" -#, fuzzy msgid "Display outgoing HTTP traffic bandwidth usage." -msgstr "Kimenő HTTPforgalom sávszélesség-használatát mutatja" +msgstr "" -#, fuzzy msgid "Display incoming Gnet traffic bandwidth usage." -msgstr "Bejövő gNetforgalom sávszélesség-használatát mutatja" +msgstr "" -#, fuzzy msgid "Display outgoing Gnet traffic bandwidth usage." -msgstr "Kimenő gNetforgalom sávszélesség-használatát mutatja" +msgstr "" -#, fuzzy msgid "Display incoming Gnet leaf traffic bandwidth usage." -msgstr "Bejövő gNet végponti forgalom sávszélesség-használatát mutatja" +msgstr "" -#, fuzzy msgid "Display outgoing Gnet leaf traffic bandwidth usage." -msgstr "Kimenő gNet végponti forgalom sávszélesség-használatát mutatja" +msgstr "" -#, fuzzy msgid "Automatically hide leaf bandwidth display when not in ultrapeer mode." -msgstr "Végpontforgalom kijelzésének elrejtése, nem átjátszó üzemmódban." +msgstr "" -#, fuzzy msgid "Display incoming HTTP traffic bandwidth average." -msgstr "Bejövő HTTPforgalom sávszélesség-használatát mutatja" +msgstr "" -#, fuzzy msgid "Display outgoing HTTP traffic bandwidth average." -msgstr "HTTPforgalom átlagos sávszélesség-használatát mutatja" +msgstr "" -#, fuzzy msgid "Display incoming Gnet traffic bandwidth average." -msgstr "Bejövő gNetforgalom átlagos sávszélesség-használatát mutatja" +msgstr "" -#, fuzzy msgid "Display outgoing Gnet traffic bandwidth average." -msgstr "Kimenő gNetforgalom átlagos sávszélesség-használatát mutatja" +msgstr "" -#, fuzzy msgid "Display incoming Gnet leaf traffic bandwidth average." -msgstr "Bejövő gNet végponti forgalom átlagos sávszélesség-használatát mutatja" +msgstr "" -#, fuzzy msgid "Display outgoing Gnet leaf traffic bandwidth average." -msgstr "Kimenő gNet végponti forgalom átlagos sávszélesség-használatát mutatja" +msgstr "" msgid "Do a case sensitive sorting." msgstr "Kis/nagybetűérzékeny rendezés." @@ -3813,9 +4552,8 @@ msgid "Default sort order for search results." msgstr "" -#, fuzzy msgid "Default sort column for search results." -msgstr "Az oszlopok szélessége a keresés eredményei táblán" +msgstr "" msgid "Discard search results which are considered spam." msgstr "" @@ -3826,13 +4564,11 @@ msgid "Jump to newly created searches" msgstr "" -#, fuzzy msgid "Collect statistics about searches that go through this node." -msgstr "E ponton átfolyó keresésekről statisztikákat gyűjt" +msgstr "" -#, fuzzy msgid "Interval in which the search stats are updated." -msgstr "A kereső-statisztikák időszerűsítésének időtartatama" +msgstr "" msgid "" "A deletion coefficient, so that small non-significant results can be " @@ -3841,63 +4577,47 @@ "Törlési együttható, hogy a kicsi, nem jelentős eredmények ejthetők.Minél " "alacsonyabb, annál több kereső-statisztika marad a memóriában." -#, fuzzy msgid "Show confirmation dialog when leaving gtk-gnutella." -msgstr "Gtk-gnutellából kilépéskor megerősítés ablakot mutat" +msgstr "" -#, fuzzy msgid "Show a helpful message when the mouse pointer lingers over a widget." -msgstr "Súgó üzenetet mutat amikor az egér egy bigyón tétovázik" +msgstr "" -#, fuzzy msgid "" "Show a lot more settings to tweak. If you tamper with them be sure to read " "up on what they are doing." msgstr "" -"Sokkal több beállítást mutat. Ha valamelyikkel babrál, nézzen utána mit is " -"csinál!" -#, fuzzy msgid "Show percentages instead of absolute values in the Gnet stats." -msgstr "Abszolút értékek helyett százalékokat mutat a gnet statisztikákban" +msgstr "" -#, fuzzy msgid "Show bytes instead of packets in the Gnet stats." -msgstr "Bájtokat mutat csomagok helyett a gnet statisztikákban" +msgstr "" -#, fuzzy msgid "Show stats per hops instead of per TTL." -msgstr "Sugár szerinti statisztikákat mutat TTL szerinti helyett" +msgstr "" -#, fuzzy msgid "Choose source of stats to be displayed." -msgstr "Küldött keresések számának kijelzése." +msgstr "" msgid "Choose message type for drop reasons." msgstr "" -#, fuzzy msgid "Include Gnutella packet header size to the volume." -msgstr "Mérethez hozzáadja a fejléceket" +msgstr "" -#, fuzzy msgid "" "Show percentages instead of absolute values in the Gnet stats (drop reasons)." msgstr "" -"Százalékokat mutat abszolút értékek helyett a gnet statisztikákban (ejtések " -"okai)" -#, fuzzy msgid "Widths of the columns in the Gnet stats general table." -msgstr "Oszlopok szélessége az általános gnet statisztikák táblán" +msgstr "" -#, fuzzy msgid "Auto clear completed uploads." -msgstr "Magától takarítja a befejezett feltöltéseket" +msgstr "" -#, fuzzy msgid "Auto clear failed uploads." -msgstr "Magától takarítja a sikertelen feltöltéseket" +msgstr "" msgid "" "Whether the node's uptime should be shown (not all nodes provide this " @@ -3924,13 +4644,11 @@ msgid "Whether RX traffic compression ratio should be displayed." msgstr "RX forgalom tömörítési arányának kijelzése." -#, fuzzy msgid "Whether to display the amount of bytes sent on the TX wire." -msgstr "A pont megosztott fájljai számának kijelzése, amikor ismert." +msgstr "" -#, fuzzy msgid "Whether to display the amount of bytes received on the RX wire." -msgstr "A pont megosztott fájljai számának kijelzése, amikor ismert." +msgstr "" msgid "Whether TX instantaneous transmission speed should be displayed." msgstr "Azonnali TX átviteli sebesség kijelzése." @@ -3963,7 +4681,6 @@ msgid "Whether count of dropped messages on RX should be displayed." msgstr "RX-en ejtett üzenetek számának kijelzése." -#, fuzzy msgid "" "Whether Query Routing Protocol statistics should be displayed. For a leaf " "node, this is simply the ratio of queries that generated a hit over the " @@ -3972,11 +4689,6 @@ "the passing threshold and 'e' the efficiency, i.e. the proportion of " "received queries that are sent to the node after QRP table filtering." msgstr "" -"Keresés irányítási protokoll (QRP) statisztika kijeljzése. Végpontban ez a " -"találatot generáló keresések és a kapott keresések hányadosa. Átjátszó " -"csomópontban a QRP-táblán levő nyílások száma, „g” a sorszám, „f” a " -"feltöltési arány, „t” az átadás késése és „e” a hatékonyság, azaz a kapott " -"keresések, amelyeket a végponthoz küldött." msgid "" "Whether we should display message counts for duplicate, bad, weird and " @@ -4010,21 +4722,17 @@ "ami a villogást okozza, és spórol a rendszernek is, mert kevesebbszer kell " "újrarajzolni a keresőlapot." -#, fuzzy msgid "Expanded stati of the nodes in the treemenu." -msgstr "Kiterjesztett statisztikák a pontokról a famenüben" +msgstr "" -#, fuzzy msgid "Widths of the columns in the Gnet packet stats table (pkg). GTK2" -msgstr "Oszlopok szélessége a gnet csomagok statisztikái táblán (pkg)GTK2" +msgstr "" -#, fuzzy msgid "Widths of the columns in the Gnet packet stats table (byte). GTK2" -msgstr "Oszlopok szélessége a gnet csomagok statisztikái táblán (byte) GTK2" +msgstr "" -#, fuzzy msgid "Configures the appearance of the toolbar." -msgstr "Beállítja az eszköztár megjelenését" +msgstr "" msgid "" "The lifetime of a search. If this time is exceeded, the search is stopped." @@ -4035,25 +4743,20 @@ "newer)." msgstr "" -#, fuzzy msgid "Automatically hide DHT bandwidth display when DHT not enabled." -msgstr "Végpontforgalom kijelzésének elrejtése, nem átjátszó üzemmódban." +msgstr "" -#, fuzzy msgid "Display incoming DHT traffic bandwidth usage." -msgstr "Bejövő HTTPforgalom sávszélesség-használatát mutatja" +msgstr "" -#, fuzzy msgid "Display outgoing DHT traffic bandwidth usage." -msgstr "Kimenő HTTPforgalom sávszélesség-használatát mutatja" +msgstr "" -#, fuzzy msgid "Display incoming DHT traffic bandwidth as an average." -msgstr "Bejövő HTTPforgalom sávszélesség-használatát mutatja" +msgstr "" -#, fuzzy msgid "Display outgoing DHT traffic bandwidth as an average." -msgstr "HTTPforgalom átlagos sávszélesség-használatát mutatja" +msgstr "" msgid "" "Remote nodes supporting media type filtering will apply your query " @@ -4083,7 +4786,7 @@ msgstr "" msgid "" -"Discard search results whith an alien IP address, not matching the one from " +"Discard search results with an alien IP address, not matching the one from " "which the results come from." msgstr "" @@ -4092,6 +4795,17 @@ "be restarted when gtk-gnutella is launched." msgstr "" +msgid "Discard search results coming from servents with a banned GUID." +msgstr "" + +msgid "Whether a summary line with GUESS search stats should be displayed." +msgstr "" + +msgid "" +"Whether the GUESS summary line should show total statistics or ones " +"pertaining to the current search only." +msgstr "" + msgid "Anonymizing proxies" msgstr "" @@ -4146,9 +4860,8 @@ msgid "Aruba" msgstr "" -#, fuzzy msgid "Åland Islands" -msgstr "Jeroen Asselman" +msgstr "" msgid "Azerbaijan" msgstr "" @@ -4162,9 +4875,8 @@ msgid "Bangladesh" msgstr "" -#, fuzzy msgid "Belgium" -msgstr "Méret" +msgstr "" msgid "Burkina Faso" msgstr "" @@ -4178,9 +4890,11 @@ msgid "Burundi" msgstr "" -#, fuzzy msgid "Benin" -msgstr "Végződés" +msgstr "" + +msgid "Saint Barthelemy" +msgstr "" msgid "Bermuda" msgstr "" @@ -4191,6 +4905,9 @@ msgid "Bolivia" msgstr "" +msgid "Bonaire, Sint Eustatius and Saba" +msgstr "" + msgid "Brazil" msgstr "" @@ -4200,9 +4917,11 @@ msgid "Bhutan" msgstr "" -#, fuzzy +msgid "Burma" +msgstr "" + msgid "Bouvet Island" -msgstr "Jeroen Asselman" +msgstr "" msgid "Botswana" msgstr "" @@ -4210,9 +4929,8 @@ msgid "Belarus" msgstr "" -#, fuzzy msgid "Belize" -msgstr "Méret" +msgstr "" msgid "Canada" msgstr "" @@ -4226,9 +4944,8 @@ msgid "Central African Republic" msgstr "" -#, fuzzy msgid "Congo" -msgstr "Kop" +msgstr "" msgid "Switzerland" msgstr "" @@ -4239,9 +4956,8 @@ msgid "Cook Islands" msgstr "" -#, fuzzy msgid "Chile" -msgstr "fájl" +msgstr "" msgid "Cameroon" msgstr "" @@ -4264,6 +4980,9 @@ msgid "Cape Verde" msgstr "" +msgid "Curacao" +msgstr "" + msgid "Christmas Island" msgstr "" @@ -4273,9 +4992,8 @@ msgid "Czech Republic" msgstr "" -#, fuzzy msgid "Germany" -msgstr "bármely" +msgstr "" msgid "Djibouti" msgstr "" @@ -4307,20 +5025,17 @@ msgid "Eritrea" msgstr "" -#, fuzzy msgid "Spain" -msgstr "Köz" +msgstr "" msgid "Ethiopia" msgstr "" -#, fuzzy msgid "Europe" -msgstr "ejtett" +msgstr "" -#, fuzzy msgid "Finland" -msgstr "továbbított" +msgstr "" msgid "Fiji" msgstr "" @@ -4331,13 +5046,11 @@ msgid "Micronesia" msgstr "" -#, fuzzy msgid "Faroe Islands" -msgstr "Jeroen Asselman" +msgstr "" -#, fuzzy msgid "France" -msgstr "Mégsem" +msgstr "" msgid "Gabon" msgstr "" @@ -4345,9 +5058,8 @@ msgid "United Kingdom" msgstr "" -#, fuzzy msgid "Grenada" -msgstr "Készített" +msgstr "" msgid "Georgia" msgstr "" @@ -4355,9 +5067,8 @@ msgid "French Guiana" msgstr "" -#, fuzzy msgid "Guernsey" -msgstr "bármely" +msgstr "" msgid "Ghana" msgstr "" @@ -4365,16 +5076,14 @@ msgid "Gibraltar" msgstr "" -#, fuzzy msgid "Greenland" -msgstr "továbbított" +msgstr "" msgid "Gambia" msgstr "" -#, fuzzy msgid "Guinea" -msgstr "Általános" +msgstr "" msgid "Guadeloupe" msgstr "" @@ -4412,9 +5121,8 @@ msgid "Croatia" msgstr "" -#, fuzzy msgid "Haiti" -msgstr "Várakozás" +msgstr "" msgid "Hungary" msgstr "" @@ -4422,13 +5130,11 @@ msgid "Indonesia" msgstr "" -#, fuzzy msgid "Ireland" -msgstr "továbbított" +msgstr "" -#, fuzzy msgid "Israel" -msgstr "továbbított" +msgstr "" msgid "Isle of Man" msgstr "" @@ -4442,13 +5148,11 @@ msgid "Iraq" msgstr "" -#, fuzzy msgid "Iran" -msgstr "továbbított" +msgstr "" -#, fuzzy msgid "Iceland" -msgstr "továbbított" +msgstr "" msgid "Italy" msgstr "" @@ -4501,9 +5205,8 @@ msgid "Laos" msgstr "" -#, fuzzy msgid "Lebanon" -msgstr "Ok" +msgstr "" msgid "Saint Lucia" msgstr "" @@ -4535,9 +5238,8 @@ msgid "Morocco" msgstr "" -#, fuzzy msgid "Monaco" -msgstr "Figyelő" +msgstr "" msgid "Moldova" msgstr "" @@ -4644,9 +5346,8 @@ msgid "Panama" msgstr "" -#, fuzzy msgid "Peru" -msgstr "Soha" +msgstr "" msgid "French Polynesia" msgstr "" @@ -4660,9 +5361,8 @@ msgid "Pakistan" msgstr "" -#, fuzzy msgid "Poland" -msgstr "továbbított" +msgstr "" msgid "Saint Pierre and Miquelon" msgstr "" @@ -4676,9 +5376,8 @@ msgid "Palestinian Territory" msgstr "" -#, fuzzy msgid "Portugal" -msgstr "Összesen" +msgstr "" msgid "Palau" msgstr "" @@ -4689,9 +5388,8 @@ msgid "Qatar" msgstr "" -#, fuzzy msgid "Reunion" -msgstr "Végződés" +msgstr "" msgid "Romania" msgstr "" @@ -4711,9 +5409,8 @@ msgid "Solomon Islands" msgstr "" -#, fuzzy msgid "Seychelles" -msgstr "Keresések" +msgstr "" msgid "Sudan" msgstr "" @@ -4721,9 +5418,8 @@ msgid "Sweden" msgstr "" -#, fuzzy msgid "Singapore" -msgstr "mellőz" +msgstr "" msgid "Saint Helena" msgstr "" @@ -4743,16 +5439,17 @@ msgid "San Marino" msgstr "" -#, fuzzy msgid "Senegal" -msgstr "Általános" +msgstr "" msgid "Somalia" msgstr "" -#, fuzzy msgid "Suriname" -msgstr "név" +msgstr "" + +msgid "South Sudan" +msgstr "" msgid "Sao Tome and Principe" msgstr "" @@ -4760,6 +5457,9 @@ msgid "El Salvador" msgstr "" +msgid "Sint Maarten" +msgstr "" + msgid "Syrian Arab Republic" msgstr "" @@ -4796,9 +5496,8 @@ msgid "Tunisia" msgstr "" -#, fuzzy msgid "Tonga" -msgstr "Kop" +msgstr "" msgid "Turkey" msgstr "" @@ -4878,24 +5577,25 @@ msgid "MAGNET URI contained source URL for an unsupported protocol" msgstr "" -#, fuzzy, c-format +#, c-format msgid "%u Byte" msgid_plural "%u Bytes" -msgstr0 "Bájt" +msgstr0 "" +msgstr1 "" -#, fuzzy, c-format +#, c-format msgid "%u Byte" msgid_plural "%u Bytes" -msgstr0 "Bájt" +msgstr0 "" +msgstr1 "" -#, fuzzy, c-format +#, c-format msgid "%s (%s bytes)" -msgstr "%s (%lu bájt)" +msgstr "" #. TRANSLATORS: Don't translate 'B', just 's' is allowed. -#, fuzzy msgid "B/s" -msgstr "K/s" +msgstr "" #, c-format msgid "%ud %uh" @@ -4922,25 +5622,20 @@ msgid "URL missing" msgstr "" -#, fuzzy msgid "The download could not be created" -msgstr "Nics letöltő nyílás" +msgstr "" -#, fuzzy msgid "Download added" -msgstr "Letöltve" +msgstr "" -#, fuzzy msgid "Unknown operation" -msgstr "Ismeretlen hiba" +msgstr "" -#, fuzzy msgid "Unknown command" -msgstr "Ismeretlen hiba" +msgstr "" -#, fuzzy msgid "No help available" -msgstr "Nem elérhető" +msgstr "" msgid "Hops" msgstr "Ugrás" @@ -4962,52 +5657,51 @@ msgid "Horizon size via HSEP node %s (%s):" msgstr "" -#, fuzzy msgid "Interactive mode turned on." -msgstr "Inaktív forrás" +msgstr "" -#, fuzzy msgid "Interactive mode turned off." -msgstr "Inaktív forrás" +msgstr "" + +#, c-format +msgid "Unknown operation \"show %s\"" +msgstr "" + +#, c-format +msgid "Unknown operation \"%s\"" +msgstr "" -#, fuzzy msgid "Cannot determine current working directory" -msgstr "Saját mappa nem található!" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Unknown logfile name \"%s\"" -msgstr "Ismeretlen hiba" +msgstr "" -#, fuzzy msgid "Unable to reopen" -msgstr "Nyomás elküldése sikertelen" +msgstr "" #, c-format msgid "Could not rename logfile as \"%s\": %m" msgstr "" -#, fuzzy, c-format -msgid "Unknown operation \"%s\"" -msgstr "Ismeretlen hiba" - -#, fuzzy, c-format -msgid "Unknown operation \"show %s\"" -msgstr "Ismeretlen hiba" - -#, fuzzy, c-format +#, c-format msgid "Unknown operation \"stats %s\"" -msgstr "Ismeretlen hiba" +msgstr "" + +#, c-format +msgid "Unknown operation \"check %s\"" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Unknown operation \"usage %s\"" -msgstr "Ismeretlen hiba" +msgstr "" msgid "Invalid IP/Port" msgstr "" -#, fuzzy msgid "Node added" -msgstr "Letöltve" +msgstr "" msgid "Invalid IP" msgstr "" @@ -5015,22 +5709,21 @@ msgid "Invalid port" msgstr "" -#, fuzzy, c-format +#, c-format msgid "Removed %u node" msgid_plural "Removed %u nodes" -msgstr0 "%v/%u letöltés" +msgstr0 "" +msgstr1 "" -#, fuzzy msgid "Property missing" -msgstr "Proxy beállítása" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Unknown property \"%s\"" -msgstr "Ismeretlen hiba" +msgstr "" -#, fuzzy msgid "Value: " -msgstr "Méret" +msgstr "" msgid "Value found and displayed" msgstr "" @@ -5041,28 +5734,29 @@ msgid "Good bye" msgstr "" -#, fuzzy +msgid "Invalid command syntax" +msgstr "" + msgid "Query string missing" -msgstr "Proxy beállítása" +msgstr "" msgid "Query string is not UTF-8 encoded" msgstr "" -#, fuzzy msgid "Search added" -msgstr "Keresések" +msgstr "" -#, fuzzy msgid "The search could not be created" -msgstr "Nics letöltő nyílás" +msgstr "" -#, fuzzy msgid "Unknown property" -msgstr "Ismeretlen hiba" +msgstr "" -#, fuzzy msgid "Value missing" -msgstr "Proxy beállítása" +msgstr "" + +msgid "Property cannot be changed" +msgstr "" #, c-format msgid "Previous value was %s" @@ -5084,89 +5778,37 @@ msgid "unterminated single-quoted string" msgstr "" -msgid "Invalid command syntax" +msgid "too many arguments in command" msgstr "" -msgid "too many arguments in command" +#, c-format +msgid "un-parseable argument #%u in command" msgstr "" msgid "Malformed command" msgstr "" -#, fuzzy, c-format +#, c-format msgid "Unknown command: \"%s\"" -msgstr "Ismeretlen hiba" - -#, fuzzy -msgid "Help: " -msgstr "Súgó" - -#, fuzzy -msgid "Bitzi|Unknown" -msgstr "Ismeretlen" - -#, fuzzy -msgid "Bitzi|Unrated" -msgstr "Készített" - -msgid "Bitzi|Bitzi lookup failure" -msgstr "" - -msgid "Bitzi|Filesize mismatch" -msgstr "" - -msgid "Bitzi|Dangerous/Misleading" msgstr "" -msgid "Bitzi|Incomplete/Damaged" -msgstr "" - -msgid "Bitzi|Substandard" -msgstr "" - -#, fuzzy -msgid "Bitzi|Overrated" -msgstr "Készített" - -#, fuzzy -msgid "Bitzi|Normal" -msgstr "Normalizált" - -#, fuzzy -msgid "Bitzi|Underrated" -msgstr "Készített" - -#, fuzzy -msgid "Bitzi|Complete" -msgstr "Kész" - -#, fuzzy -msgid "Bitzi|Recommended" -msgstr "Fogadott" - -msgid "Bitzi|Best Version" -msgstr "" - -msgid "No other data" +msgid "Help: " msgstr "" msgid "Filename" msgstr "Fájlnév" -#, fuzzy msgid "Created" -msgstr "Befejezve" +msgstr "" msgid "Modified" msgstr "" -#, fuzzy msgid "SHA-1" -msgstr "SHA1:" +msgstr "" -#, fuzzy msgid "Not available" -msgstr "Nem elérhető" +msgstr "" msgid "Bitprint" msgstr "" @@ -5178,19 +5820,25 @@ msgid "Tigertree" msgstr "" -msgid "External metadata" +msgid "Rescheduled for" msgstr "" -msgid "Bitzi URL" +msgid "Restartable since" +msgstr "" + +msgid "rescheduled for" +msgstr "" + +msgid "restartable since" msgstr "" #, c-format msgid " (slot %u" msgstr "" -#, fuzzy, c-format +#, c-format msgid " retry in %us" -msgstr " %d után újra" +msgstr "" msgid "Complete" msgstr "Kész" @@ -5226,9 +5874,8 @@ msgid "Reading headers" msgstr "Fejlécek olvasása" -#, fuzzy msgid "UDP push sent" -msgstr "Nyomás elküldve" +msgstr "" msgid "Searching for new push-proxies" msgstr "" @@ -5236,9 +5883,9 @@ msgid "Falling back to push" msgstr "Visszaállás nyomásra" -#, fuzzy, c-format +#, c-format msgid "Sending request (%u%%)" -msgstr "(%d%%) kérelem elküldése" +msgstr "" msgid "Receiving headers" msgstr "Fejlécek fogadása" @@ -5255,23 +5902,21 @@ msgid "Chunk done" msgstr "Darab kész" -#, fuzzy msgid "Waiting for TTH checking..." -msgstr "SHA1 ellenőrzésre várakozás…" +msgstr "" msgid "Waiting for SHA1 checking..." msgstr "SHA1 ellenőrzésre várakozás…" -#, fuzzy, c-format +#, c-format msgid "Computing %s (%.02f%%)" -msgstr "SHA1 számítása (%.02f%%)" +msgstr "" msgid "TTH OK" msgstr "" -#, fuzzy msgid "SHA-1 OK" -msgstr "SHA1:" +msgstr "" msgid "SHA-1 MISMATCH" msgstr "" @@ -5289,58 +5934,47 @@ msgid "; Moving (%.02f%%)" msgstr "; Áthelyezés (%.02f%%)" -#, fuzzy, c-format +#, c-format msgid "; Moved (%s) %s" -msgstr "; Áthelyezve (%.1f k/s) %s" +msgstr "" -#, fuzzy msgid "(stalled)" -msgstr " (elakadva)" +msgstr "" -#, fuzzy msgid "Receiving data" -msgstr "Fejlécek fogadása" +msgstr "" -#, fuzzy msgid "ignoring" -msgstr "mellőz" +msgstr "" -#, fuzzy msgid "selected next" -msgstr " Kijelölt lelövése " +msgstr "" -#, fuzzy msgid "requesting next" -msgstr "Kérelem elküldve" +msgstr "" -#, fuzzy msgid "requested next" -msgstr "Kérelem elküldve" +msgstr "" -#, fuzzy msgid "Awaiting data" -msgstr "Várakozás" - -#, fuzzy -msgid "Unknown error" -msgstr "Ismeretlen hiba" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Retry in %us" -msgstr "%d után újra" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Sinking (%s bytes left)" -msgstr "Sűllyedés (%u bájt maradt)" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Forgot %u download" msgid_plural "Forgot %u downloads" -msgstr0 "%v/%u letöltés" +msgstr0 "" +msgstr1 "" -#, fuzzy msgid "Filename (filtered)" -msgstr "Fájlnév:" +msgstr "" msgid "Progress" msgstr "Helyzet" @@ -5348,13 +5982,11 @@ msgid "RX" msgstr "" -#, fuzzy msgid "Downloaded" -msgstr "Letöltve" +msgstr "" -#, fuzzy msgid "Uploaded" -msgstr "Feltöltve" +msgstr "" msgid "Sources" msgstr "Forrás" @@ -5362,13 +5994,11 @@ msgid "Status" msgstr "Állapot" -#, fuzzy msgid "Active" -msgstr "aktív" +msgstr "" -#, fuzzy msgid "Incomplete" -msgstr "Kész" +msgstr "" msgid "Orphaned" msgstr "" @@ -5384,6 +6014,7 @@ msgid "Selected %u of %u download matching \"%s\"." msgid_plural "Selected %u of %u downloads matching \"%s\"." msgstr0 "" +msgstr1 "" msgid "starts with" msgstr "kezdődik" @@ -5397,16 +6028,14 @@ msgid "contains the substring" msgstr "résszöveget tartalmaz" -#, fuzzy msgid "matches the regex pattern" -msgstr "illik regkif-hez" +msgstr "" msgid "is exactly" msgstr "egyezik" -#, fuzzy msgid "Built-in targets" -msgstr "Beépített célok (nem szerkeszthető)" +msgstr "" msgid "Global filters" msgstr "Globális szűrők" @@ -5432,9 +6061,8 @@ msgid "Filter" msgstr "Szűrő" -#, fuzzy msgid "Rule" -msgstr "Szabályok" +msgstr "" msgid "Match" msgstr "Illesztés" @@ -5448,37 +6076,36 @@ msgid "Target" msgstr "Cél" -#, fuzzy msgid "(case-sensitive)" -msgstr "kis/nagybetűérzékeny" +msgstr "" #, c-format msgid "If filename begins with \"%s\" %s" msgstr "" -#, fuzzy, c-format +#, c-format msgid "If filename contains the words \"%s\" %s" -msgstr "szavakat tartalmaz" +msgstr "" #, c-format msgid "If filename ends with \"%s\" %s" msgstr "" -#, fuzzy, c-format +#, c-format msgid "If filename contains the substring \"%s\" %s" -msgstr "résszöveget tartalmaz" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "If filename matches the regex pattern \"%s\" %s" -msgstr "résszöveget tartalmaz" +msgstr "" #, c-format msgid "If filename is \"%s\" %s" msgstr "" -#, fuzzy, c-format +#, c-format msgid "If IP address matches %s/%u" -msgstr "Feltétel: ha az IP-cím illik" +msgstr "" #, c-format msgid "If filesize is exactly %s (%s)" @@ -5499,28 +6126,23 @@ msgid "If urn:sha1 is not available" msgstr "" -#, fuzzy msgid "Always" -msgstr "Álnevek" +msgstr "" -#, fuzzy msgid "busy is set" -msgstr "Nyomás elküldve" +msgstr "" msgid "busy is not set" msgstr "" -#, fuzzy msgid "push is set" -msgstr "Nyomás elküldve" +msgstr "" -#, fuzzy msgid "push is not set" -msgstr "Nyomás türelmi ideje" +msgstr "" -#, fuzzy msgid "stable is set" -msgstr "biztos" +msgstr "" msgid "stable is not set" msgstr "" @@ -5532,27 +6154,23 @@ msgid "Always (all flags ignored)" msgstr "" -#, fuzzy msgid "DISPLAY is undefined" -msgstr "meghatározatlan" +msgstr "" msgid "DISPLAY" msgstr "MUTAT" -#, fuzzy msgid "DON'T DISPLAY" -msgstr "MUTAT" +msgstr "" -#, fuzzy msgid "DOWNLOAD is undefined" -msgstr "meghatározatlan" +msgstr "" msgid "DOWNLOAD" msgstr "LETÖLTÉS" -#, fuzzy msgid "DON'T DOWNLOAD" -msgstr "LETÖLTÉS" +msgstr "" #, c-format msgid "If flag %s%s%s" @@ -5565,20 +6183,17 @@ msgid "%s%s %s jump to \"%s\"" msgstr "" -#, fuzzy msgid "(Negated) " -msgstr "(elakadva) " +msgstr "" -#, fuzzy msgid "(deactivated)" -msgstr "aktív" +msgstr "" msgid "(invalid)" msgstr "" -#, fuzzy msgid "<Archive>" -msgstr "aktív" +msgstr "" msgid "<Audio>" msgstr "" @@ -5592,665 +6207,24 @@ msgid "<Video>" msgstr "" -#, fuzzy msgid "Global (pre)" -msgstr "Globális szűrők" - -#, fuzzy -msgid "Global (post)" -msgstr "Globális szűrők" - -msgid "RETURN" -msgstr "" - -msgid "Query hit" -msgstr "Találat" - -msgid "DHT (truncated)" -msgstr "" - -msgid "Routing errors" -msgstr "Útválasztó hiba" - -#, fuzzy -msgid "Routing table chunks" -msgstr "Keresés irányító tábla (QRP) sorszáma." - -msgid "Routing table message capacity" -msgstr "" - -msgid "Routing table message count" -msgstr "" - -#, fuzzy -msgid "Duplicates with higher TTL" -msgstr "E keresés megkettőzése" - -msgid "SPAM SHA1 database hits" -msgstr "" - -msgid "SPAM filename and size hits" -msgstr "" - -msgid "SPAM fake hits" -msgstr "" - -msgid "SPAM duplicate hits" -msgstr "" - -msgid "SPAM dynamically caught hostile IP addresses" -msgstr "" - -msgid "SPAM dynamically caught hostile IP held" -msgstr "" - -msgid "SPAM spotted spamming IP addresses held" -msgstr "" - -msgid "Searches to local DB" -msgstr "Keresés helyi AB-ban" - -msgid "Hits on local DB" -msgstr "Találat helyi AB-ban" - -#, fuzzy -msgid "Hits on local partial files" -msgstr "Találat helyi AB-ban" - -msgid "Hits on \"what's new?\" queries" -msgstr "" - -msgid "Query hits received for local queries" -msgstr "" - -msgid "Query hits received for OOB-proxied queries" -msgstr "" - -msgid "Queries requesting OOB hit delivery" -msgstr "" - -msgid "Stripped OOB flag on queries" -msgstr "" - -msgid "Duplicate OOB-proxied queries" -msgstr "" - -msgid "OOB hits received for OOB-proxied queries" -msgstr "" - -msgid "OOB hits bearing alien IP address" -msgstr "" - -msgid "OOB hits ignored due to identified spamming address" msgstr "" -msgid "Unclaimed locally-generated OOB hits" -msgstr "" - -msgid "Partially claimed locally-generated OOB hits" -msgstr "" - -msgid "Spurious OOB hit claiming received" -msgstr "" - -msgid "Unrequested OOB hits received" -msgstr "" - -msgid "Received query hits for untracked queries" -msgstr "" - -msgid "Tracked query MUIDs" -msgstr "" - -msgid "Compacted queries" -msgstr "Tömörített keresések" - -msgid "Bytes saved by compacting" -msgstr "Tömörítéssel megtakarított bájtok" - -msgid "UTF8 queries" -msgstr "UTF-8-keresések" - -msgid "SHA1 queries" -msgstr "SHA1-keresések" - -#, fuzzy -msgid "\"What's New?\" queries" -msgstr "Generált keresések" - -#, fuzzy -msgid "GUESS queries" -msgstr "UTF-8-keresések" - -#, fuzzy -msgid "GUESS queries (0.2)" -msgstr "UTF-8-keresések" - -msgid "GUESS cached query keys held" -msgstr "" - -msgid "GUESS cached 0.2 hosts held" -msgstr "" - -#, fuzzy -msgid "GUESS locally generated queries" -msgstr "Generált keresések" - -msgid "GUESS currently running queries" -msgstr "" - -msgid "GUESS hits received for locally generated queries" -msgstr "" - -msgid "GUESS hosts queried" -msgstr "" - -msgid "GUESS hosts sending back an acknowledgment" -msgstr "" - -msgid "Broadcasted push messages" -msgstr "Szórt nyomáskérelem" - -#, fuzzy -msgid "Push-proxy UDP relayed messages" -msgstr "Proxy továbbította üzenetek nyomása" - -msgid "Push-proxy TCP relayed messages" -msgstr "Proxy továbbította üzenetek nyomása" - -msgid "Push-proxy broadcasted messages" -msgstr "Proxy szórta üzenetek nyomása" - -msgid "Push-proxy found un-proxied local route" -msgstr "" - -msgid "Push-proxy lookup failures" -msgstr "Sikertelen proxy-keresés nyomása" - -msgid "Push relayed via local route" -msgstr "" - -msgid "Push relayed via routing table" -msgstr "" - -#, fuzzy -msgid "Locally generated dynamic queries" -msgstr "Generált keresések" - -#, fuzzy -msgid "Leaf-generated dynamic queries" -msgstr "Generált keresések" - -msgid "OOB-proxied leaf queries" -msgstr "" - -msgid "Fully completed dynamic queries" -msgstr "" - -msgid "Partially completed dynamic queries" -msgstr "" - -msgid "Dynamic queries ended with no results" -msgstr "" - -msgid "Fully completed dynamic queries getting late results" -msgstr "" - -msgid "Dynamic queries with partial late results" -msgstr "" - -msgid "Dynamic queries completed by late results" -msgstr "" - -msgid "Queries seen from GTKG" -msgstr "" - -msgid "Queries seen from GTKG that were re-queries" -msgstr "" - -msgid "Queries advertising support of GGEP \"H\"" -msgstr "" - -msgid "GIV callbacks received" -msgstr "" - -msgid "GIV discarded due to no suitable download" -msgstr "" - -msgid "QUEUE callbacks received" -msgstr "" - -msgid "QUEUE discarded due to no suitable download" -msgstr "" - -msgid "UDP messages with bogus source IP" -msgstr "" - -msgid "Alien UDP messages (non-Gnutella)" -msgstr "" - -msgid "Unprocessed UDP Gnutella messages" -msgstr "" - -msgid "Compressed UDP messages enqueued" -msgstr "" - -msgid "Compressed UDP messages received" -msgstr "" - -msgid "Uncompressed UDP messages due to no gain" -msgstr "" - -msgid "Consolidated servers (after GUID and IP address linking)" -msgstr "" - -msgid "Duplicate downloads found during server consolidation" -msgstr "" - -msgid "Discovered server GUIDs" -msgstr "" - -msgid "Changed server GUIDs" -msgstr "" - -msgid "Detected GUID collisions" -msgstr "" - -msgid "Detected collisions with our own GUID" -msgstr "" - -msgid "GUID dynamically banned" -msgstr "" - -msgid "Firewalled node info for known hosts received in upload requests" -msgstr "" - -msgid "Revitalized PUSH routes" -msgstr "" - -msgid "Collected new PUSH proxies from other query hits" -msgstr "" - -msgid "Attempted download resource switching on completion" -msgstr "" - -msgid "Attempted download resource switching after error" -msgstr "" - -msgid "Successful download resource switching (all kind)" -msgstr "" - -msgid "Successful download resource switching between plain files" -msgstr "" - -msgid "Successful download resource switching after error" -msgstr "" - -msgid "Actively queued after resource switching attempt" -msgstr "" - -msgid "Sunk HTTP reply data on error codes" -msgstr "" - -#, fuzzy -msgid "Ignored downloaded data" -msgstr "Letöltve" - -#, fuzzy -msgid "Ignoring requested after data mismatch" -msgstr "(%d%%) kérelem elküldése" - -#, fuzzy -msgid "Ignoring requested to preserve connection" -msgstr "(%d%%) kérelem elküldése" - -msgid "Ignoring requested due to aggressive swarming" -msgstr "" - -msgid "Ignoring refused (data too large or server too slow)" -msgstr "" - -msgid "Client resource switching (all detected)" -msgstr "" - -msgid "Client resource switching between plain files" -msgstr "" - -msgid "Client follow-up request after HTTP error was returned" -msgstr "" - -msgid "PARQ client resource switching in slots (SHA-1 based)" -msgstr "" - -msgid "PARQ client retry-after violation" -msgstr "" - -msgid "PARQ client kicked out after too many retry-after violations" -msgstr "" - -msgid "PARQ upload slot limit overrides" -msgstr "" - -msgid "PARQ quick upload slots granted" -msgstr "" - -msgid "PARQ QUEUE sending attempts" -msgstr "" - -msgid "PARQ QUEUE messages sent" -msgstr "" - -msgid "PARQ QUEUE follow-up requests received" -msgstr "" - -msgid "Launched SHA-1 file verifications" -msgstr "" - -msgid "Launched TTH file verifications" -msgstr "" - -msgid "Bitzi tickets held" -msgstr "" - -msgid "Re-seeding of orphan downloads through query hits" -msgstr "" - -#, fuzzy -msgid "Re-seeding of orphan downloads through upload requests" -msgstr "A gui hibajavítási szintje" - -msgid "DHT estimated amount of nodes" -msgstr "" - -msgid "DHT k-ball theoretical frontier (bits)" -msgstr "" - -msgid "DHT k-ball furthest frontier (bits)" -msgstr "" - -msgid "DHT k-ball closeest frontier (bits)" -msgstr "" - -msgid "DHT routing table buckets" -msgstr "" - -msgid "DHT routing table leaves" -msgstr "" - -msgid "DHT routing table maximum depth" -msgstr "" - -#, fuzzy -msgid "DHT routing table good nodes" -msgstr "Keresés irányító tábla (QRP) sorszáma." - -msgid "DHT routing table stale nodes" -msgstr "" - -#, fuzzy -msgid "DHT routing table pending nodes" -msgstr "Keresés irányító tábla (QRP) sorszáma." - -msgid "DHT routing table evicted nodes" -msgstr "" - -msgid "DHT routing table evicted firewalled nodes" -msgstr "" - -#, fuzzy -msgid "DHT routing table evicted nodes due to quota" -msgstr "Keresés irányító tábla (QRP) sorszáma." - -msgid "DHT routing table promoted pending nodes" -msgstr "" - -#, fuzzy -msgid "DHT routing table pinged promoted nodes" -msgstr "Keresés irányító tábla (QRP) sorszáma." - -msgid "DHT routing table rejected node due to bucket network quota" -msgstr "" - -msgid "DHT routing table rejected node due to global network quota" -msgstr "" - -msgid "DHT completed bucket refreshes" -msgstr "" - -msgid "DHT forced bucket refreshes" -msgstr "" - -#, fuzzy -msgid "DHT forced bucket merges" -msgstr "A gui hibajavítási szintje" - -msgid "DHT denied non-splitable bucket refresh" -msgstr "" - -msgid "DHT initiated bucket alive checks" -msgstr "" - -msgid "DHT alive pings sent to good nodes" -msgstr "" - -msgid "DHT alive pings sent to stale nodes" -msgstr "" - -msgid "DHT alive pings sent to shutdowning nodes" -msgstr "" - -msgid "DHT alive pings avoided" -msgstr "" - -msgid "DHT alive pings skipped" -msgstr "" - -msgid "DHT revitalized stale nodes on RPC reply" -msgstr "" - -msgid "DHT value store rejected on IP/network quota grounds" -msgstr "" - -msgid "DHT value store rejected on creator validation grounds" -msgstr "" - -msgid "DHT nodes rejected during lookup based on network quota" -msgstr "" - -msgid "DHT nodes rejected during lookup based on suspicious proximity" -msgstr "" - -msgid "DHT nodes rejected during lookup based on frequency divergence" -msgstr "" - -msgid "DHT keys held" -msgstr "" - -msgid "DHT cached keys held" -msgstr "" - -msgid "DHT values held" -msgstr "" - -msgid "DHT cached KUID targets held" -msgstr "" - -msgid "DHT cached closest root nodes" -msgstr "" - -msgid "DHT cached roots exact hits" -msgstr "" - -msgid "DHT cached roots approximate hits" -msgstr "" - -msgid "DHT cached roots misses" -msgstr "" - -msgid "DHT cached roots lookups within k-ball" -msgstr "" - -msgid "DHT cached roots contact address refreshed" -msgstr "" - -msgid "DHT cached security tokens held" -msgstr "" - -msgid "DHT cached security tokens hits" -msgstr "" - -#, fuzzy -msgid "DHT stable node information held" -msgstr "Részletes tájékoztató" - -msgid "DHT local hits on value lookups" -msgstr "" - -msgid "DHT local hits returning values from cached keys" -msgstr "" - -msgid "DHT returned expanded values" -msgstr "" - -msgid "DHT returned values as secondary keys" -msgstr "" - -#, fuzzy -msgid "DHT claimed values via secondary keys" -msgstr "Türelmi idők (minden érték másodpercben)" - -msgid "DHT returned cached expanded values" -msgstr "" - -msgid "DHT returned cached values as secondary-keys" -msgstr "" - -#, fuzzy -msgid "DHT claimed cached values via secondary keys" -msgstr "Türelmi idők (minden érték másodpercben)" - -msgid "DHT successfully received value publications" -msgstr "" - -msgid "DHT successfully received value removals" -msgstr "" - -msgid "DHT replication of stale value avoided" -msgstr "" - -msgid "DHT replication of held values" -msgstr "" - -msgid "DHT republishing of held values" -msgstr "" - -msgid "DHT secondary-key value fetch issued" -msgstr "" - -msgid "DHT duplicate values returned in lookups" -msgstr "" - -msgid "DHT detected KUID collisions" -msgstr "" - -msgid "DHT detected collisions with our own KUID" -msgstr "" - -msgid "DHT detected KUID mismatches on RPC reply" -msgstr "" - -msgid "DHT caching attempts" -msgstr "" - -msgid "DHT caching ended successfully" -msgstr "" - -msgid "DHT caching partially completed" -msgstr "" - -msgid "DHT key-offloading checks after discovering new closest node" -msgstr "" - -msgid "DHT keys selected for offloading" -msgstr "" - -msgid "DHT key-offloading attempts" -msgstr "" - -msgid "DHT key-offloading ended successfully" -msgstr "" - -msgid "DHT key-offloading partially completed" -msgstr "" - -msgid "DHT values successfully offloaded" -msgstr "" - -msgid "DHT publishing attempts" -msgstr "" - -msgid "DHT publishing ended successfully (all roots)" -msgstr "" - -msgid "DHT publishing partially completed (root subset only)" -msgstr "" - -msgid "DHT publishing ending with proper value presence" -msgstr "" - -msgid "DHT value republishing occurring too late (after expiry)" -msgstr "" - -msgid "DHT publishing to self" -msgstr "" - -msgid "DHT background publishing completion attempts" -msgstr "" - -msgid "DHT background publishing completion showing improvements" -msgstr "" - -msgid "DHT background publishing completion successful (all roots)" -msgstr "" - -msgid "DHT SHA1 data type collisions" -msgstr "" - -msgid "DHT lookup path passively protected against attack" -msgstr "" - -msgid "DHT lookup path actively protected against attack" -msgstr "" - -msgid "DHT alt-loc lookups issued" -msgstr "" - -#, fuzzy -msgid "DHT push-proxy lookups issued" -msgstr "Sikertelen proxy-keresés nyomása" - -msgid "DHT successful alt-loc lookups" -msgstr "" - -msgid "DHT successful push-proxy lookups" +msgid "Global (post)" msgstr "" -msgid "DHT successful node push-entry lookups" +msgid "RETURN" msgstr "" -#, fuzzy -msgid "DHT re-seeding of orphan downloads" -msgstr "A gui hibajavítási szintje" - -#, fuzzy msgid "node" msgid_plural "nodes" -msgstr0 "csomópont" +msgstr0 "" +msgstr1 "" -#, fuzzy msgid "file" msgid_plural "files" -msgstr0 "fájl" +msgstr0 "" +msgstr1 "" msgid "Please choose a directory to share" msgstr "" @@ -6294,13 +6268,11 @@ msgid "$Id$" msgstr "" -#, fuzzy msgid "%v/%u (%P%%)" -msgstr "%u/%u gazda (%u%%)" +msgstr "" -#, fuzzy msgid "%v/%u Gnutella peers" -msgstr "%v/%u gNet csomópont" +msgstr "" msgid "%v/%u downloads" msgstr "%v/%u letöltés" @@ -6308,9 +6280,8 @@ msgid "%v/%u uploads" msgstr "%v/%u feltöltés" -#, fuzzy msgid "(Disable: 0, Random: 1)" -msgstr "Alapértelmezés: 6346, Véletlen: 0" +msgstr "" msgid "(no search)" msgstr "(nincs keresés)" @@ -6321,16 +6292,12 @@ msgid "0 terms counted" msgstr "0 szó számlálva" -#, fuzzy msgid "<no property selected>" -msgstr "Kijelölt takarítása" +msgstr "" -#, fuzzy msgid "" "==> We are looking for people who want to contribute to this fine tool. <==" msgstr "" -"⇒ Keresünk további személyeket, akik hozzá akarnak járulni e remek " -"eszközhöz. ⇐" msgid "" "A filter cannot be removed if it is bound to a search or if it is in use " @@ -6387,9 +6354,8 @@ msgid "Aliases" msgstr "Álnevek" -#, fuzzy msgid "Allow connections from and to _LAN addresses" -msgstr "Kapcsolatok engedélyezése LAN címekre/ről." +msgstr "" msgid "Amount of bytes to overlap when resuming download" msgstr "Átfedő bájtok száma folytatáskor" @@ -6414,9 +6380,8 @@ msgid "Auto clear failed uploads" msgstr "Magától takarítja a sikertelen feltöltéseket" -#, fuzzy msgid "Automatically clear finished files" -msgstr "Leállt letöltések önműködő törlése" +msgstr "" msgid "Automatically clear sources when..." msgstr "" @@ -6424,13 +6389,11 @@ msgid "Available bandwidth" msgstr "Használható sávszélesség" -#, fuzzy msgid "Available physical memory:" -msgstr "Elég fizikai memória" +msgstr "" -#, fuzzy msgid "Avg. time between IP address changes:" -msgstr "Átlagos futási idő ugyanazzal az IP-címmel" +msgstr "" msgid "Avg. uptime of this servent:" msgstr "" @@ -6441,17 +6404,14 @@ msgid "Bad hosts" msgstr "Rossz gazdák" -#, fuzzy msgid "Bandwidth limits for Gnutella traffic" -msgstr "GnutellaNet sávszélesség-vezérlése" +msgstr "" -#, fuzzy msgid "Bandwidth limits for HTTP traffic" -msgstr "HTTP-forgalom sávszélesség-vezérlése" +msgstr "" -#, fuzzy msgid "Bandwidth limits for the Distributed Hash Table" -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "Bandwidth targets for node lookups" msgstr "" @@ -6468,21 +6428,11 @@ msgid "Bind to this address" msgstr "" -#, fuzzy -msgid "Bitzi Metadata" -msgstr "Kereső stat" - -#, fuzzy -msgid "Bitzi metadata" -msgstr "Kereső stat" - -#, fuzzy msgid "Browse Host" -msgstr "_Tallóz" +msgstr "" -#, fuzzy msgid "Browse host" -msgstr "_Tallóz" +msgstr "" msgid "Busy" msgstr "Foglalt" @@ -6499,9 +6449,8 @@ msgid "Case-sensitive sorting" msgstr "Kisbetűérzékeny rendezés" -#, fuzzy msgid "Chunks/Files:" -msgstr "Darab/Fájl" +msgstr "" msgid "Cl_ose search" msgstr "Keresés be_zárása" @@ -6521,9 +6470,8 @@ msgid "Clear non-existent files" msgstr "Nem létező fájlok törlése" -#, fuzzy msgid "Clear results" -msgstr "Eredmények _törlése" +msgstr "" msgid "Clear stopped" msgstr "Leálltak törlése" @@ -6537,24 +6485,20 @@ msgid "Clock skew:" msgstr "Órahiba" -#, fuzzy msgid "Clock synchronization" -msgstr "Óra szinkronizálása" +msgstr "" -#, fuzzy msgid "Close" -msgstr "_Bezár" +msgstr "" msgid "Collapse all" msgstr "Minden összecsukása" -#, fuzzy msgid "Compressed length:" -msgstr "Tömörített hossz" +msgstr "" -#, fuzzy msgid "Compression ratio:" -msgstr "Tömörítési arány" +msgstr "" msgid "Condition: If IP address matches" msgstr "Feltétel: ha az IP-cím illik" @@ -6583,27 +6527,23 @@ msgid "Configured peermode" msgstr "Beállított pontmód" -#, fuzzy msgid "Conflict ratio:" -msgstr "Ütközési arány" +msgstr "" msgid "Connect to host" msgstr "Géphez csatlakozik" -#, fuzzy msgid "Connected time" -msgstr "Csatlakozás türelmi ideje lejárt" +msgstr "" msgid "Connected time_out" msgstr "Csatlakozás türelmi ideje lejárt" -#, fuzzy msgid "Connectin_g timeout" -msgstr "Kapcsolódás türelmi ideje lejárt" +msgstr "" -#, fuzzy msgid "Connection counters" -msgstr "Kapcsolódás türelmi ideje lejárt" +msgstr "" msgid "Connection settings" msgstr "Kapcsolat beállítása" @@ -6622,20 +6562,17 @@ msgid "Convert spaces to underscores in generated filenames" msgstr "" -#, fuzzy msgid "Copy Magnet to clipboard" -msgstr "Url-t vágólapra másol" +msgstr "" -#, fuzzy msgid "Copy URL to clipboard" -msgstr "Url-t vágólapra másol" +msgstr "" msgid "Copy browse-host results to passive searches" msgstr "" -#, fuzzy msgid "Copy magnet to clipboard" -msgstr "Url-t vágólapra másol" +msgstr "" msgid "Copy rule" msgstr "Szabály másolása" @@ -6646,9 +6583,8 @@ msgid "Count" msgstr "Szám" -#, fuzzy msgid "Country" -msgstr "Szám" +msgstr "" msgid "Cumulative _download rate" msgstr "" @@ -6659,20 +6595,17 @@ msgid "Current IP settings (Address:Port):" msgstr "Jelenlegi IP beállítás (cím:kapu):" -#, fuzzy msgid "Current search:" -msgstr "Jelenlegi keresés" +msgstr "" msgid "Currently used" msgstr "Jelenleg használt" -#, fuzzy msgid "DHT traffic stats" -msgstr "HTTP-forgalmi adatok" +msgstr "" -#, fuzzy msgid "DHT traffic" -msgstr "HTTP-forgalom" +msgstr "" msgid "Debugging" msgstr "Hibairányítás" @@ -6701,9 +6634,8 @@ msgid "Delete file on abort" msgstr "Abbahagyva fájl törlése" -#, fuzzy msgid "Delete file on mismatch" -msgstr "Eltérő fájlok törlése" +msgstr "" msgid "Detailed traffic information to display" msgstr "Részletes forgalmi tájékoztató kijelzőre" @@ -6726,20 +6658,17 @@ msgid "Display detailed traffic information" msgstr "Részletes forgalmi tájékoztató" -#, fuzzy msgid "Diverse properties" -msgstr "Nyomkövetés beállításai" +msgstr "" msgid "Do you really want to quit?" msgstr "Biztosan ki akar lépni?" -#, fuzzy msgid "Download" -msgstr "Letöltések" +msgstr "" -#, fuzzy msgid "Downloaded:" -msgstr "Letöltve" +msgstr "" msgid "Downloading from multiple sources (swarming)" msgstr "Letöltés több forrásból (zsúfolás)" @@ -6756,35 +6685,29 @@ msgid "E_xpose relative paths" msgstr "" -#, fuzzy msgid "Edit value:" -msgstr "Szűrők szerkesztése" +msgstr "" msgid "Enable \"_Browse Host\" feature" msgstr "" -#, fuzzy msgid "Enable _DHT" -msgstr "Engedélyezett" +msgstr "" -#, fuzzy msgid "Enable _UDP" -msgstr "Engedélyezett" +msgstr "" -#, fuzzy msgid "Enable dynamic upload slots _allocation" -msgstr "Dinamikus feltöltő nyílás foglalása" +msgstr "" -#, fuzzy msgid "Enable remote _shell control interface" -msgstr "A „shell” vezérlőfelület engedélyezése" +msgstr "" msgid "Enable s_warming" msgstr "_Zsúfolás engedélyezése" -#, fuzzy msgid "Enable upload of _partially downloaded files" -msgstr "Letöltött fájlok kézi eltávolítása" +msgstr "" msgid "Enough UDP support" msgstr "" @@ -6795,9 +6718,8 @@ msgid "Enough file descriptors" msgstr "Elég fájleíró" -#, fuzzy msgid "Enough min # of connections" -msgstr "Bejövő kapcsolat válaszideje" +msgstr "" msgid "Enough physical memory" msgstr "Elég fizikai memória" @@ -6820,39 +6742,32 @@ msgid "Expired" msgstr "Lejárt" -#, fuzzy msgid "FC/_TTL" -msgstr "FV/TTL" +msgstr "" -#, fuzzy msgid "FC/_hops" -msgstr "FV/ugrás" +msgstr "" -#, fuzzy msgid "File scanning time:" -msgstr "Fájlfelmérés ideje" +msgstr "" -#, fuzzy msgid "File transfers" -msgstr "Átvitt adat" +msgstr "" msgid "Files scanned" msgstr "Fájl felmérve" -#, fuzzy msgid "Filled ratio:" -msgstr "Telítettség" +msgstr "" -#, fuzzy msgid "Filled slots:" -msgstr "Tele nyílások" +msgstr "" msgid "Filter files by regex" msgstr "" -#, fuzzy msgid "First chunk _size" -msgstr "Első darab mérete" +msgstr "" msgid "Flags" msgstr "Jelzések" @@ -6866,9 +6781,8 @@ msgid "Force push mode" msgstr "Nyomás-üzemmódot kényszerít" -#, fuzzy msgid "Forget" -msgstr "Cél" +msgstr "" msgid "" "Forwarded\n" @@ -6892,17 +6806,14 @@ msgid "GUID:" msgstr "GUID:" -#, fuzzy msgid "KUID:" -msgstr "GUID:" +msgstr "" -#, fuzzy msgid "Gen. queued" -msgstr "Sorban" +msgstr "" -#, fuzzy msgid "Gen. sent" -msgstr "kikapcsolva" +msgstr "" msgid "General search settings (affect all searches)" msgstr "Általános keresési beállítás (minden keresésre hat)" @@ -6913,48 +6824,38 @@ msgid "Generated queries" msgstr "Generált keresések" -#, fuzzy msgid "Generation:" -msgstr "Generálás" +msgstr "" -#, fuzzy msgid "Global DHT outgoing traffic" -msgstr "kimenő HTTP forgalom" +msgstr "" -#, fuzzy msgid "Gnutella TTL settings" -msgstr "gnutellaNet TTL beállítása" +msgstr "" -#, fuzzy msgid "Gnutella _leaf traffic stats" -msgstr "gnet végponti forgalmi adatok" +msgstr "" -#, fuzzy msgid "Gnutella display" -msgstr "gnutellaNet kijelző" +msgstr "" -#, fuzzy msgid "Gnutella message size limits" -msgstr "gnutellaNet üzenetméret korlátok" +msgstr "" msgid "Gnutella network mode" msgstr "Gnutella hálózati üzemmód" -#, fuzzy msgid "Gnutella peers" -msgstr "GnutellaNet" +msgstr "" -#, fuzzy msgid "Gnutella timeouts (all values in seconds)" -msgstr "gnutellaNet türelmi idők (minden érték másodpercben)" +msgstr "" -#, fuzzy msgid "Gnutella traffic" -msgstr "GNet-forgalom" +msgstr "" -#, fuzzy msgid "Gnutella" -msgstr "GnutellaNet" +msgstr "" msgid "HTTP traffic" msgstr "HTTP-forgalom" @@ -6965,9 +6866,8 @@ msgid "H_ost:" msgstr "G_azda:" -#, fuzzy msgid "Hard limit of _file descriptors used" -msgstr "Fájleírók kemény korlátja" +msgstr "" msgid "Hits" msgstr "Találat" @@ -6975,17 +6875,14 @@ msgid "Honor OOB flag in queries" msgstr "" -#, fuzzy msgid "Hop radius for counting high TTL limit messages (#hops lower than...)" msgstr "" -"Hálózati sugár magas TTL korlát üzenetek számlálásához (sugár kisebb mint...)" msgid "Hops random factor" msgstr "Sugár véletlen szorzója" -#, fuzzy msgid "Host runs _NTP" -msgstr "NTP használata" +msgstr "" msgid "Host" msgstr "Gép" @@ -7002,9 +6899,8 @@ msgid "IP address stability" msgstr "IP-cím stabilitás" -#, fuzzy msgid "IP address/mask" -msgstr "IP-cím" +msgstr "" msgid "IP settings" msgstr "IP beállítások" @@ -7012,21 +6908,17 @@ msgid "IP:Port:" msgstr "IP:Kapu:" -#, fuzzy msgid "IPv4 settings" -msgstr "IP beállítások" +msgstr "" -#, fuzzy msgid "IPv6 settings" -msgstr "IP beállítások" +msgstr "" -#, fuzzy msgid "Ignore symbolically linked _directories" -msgstr "Szimbólikus link-mappák mellőzése" +msgstr "" -#, fuzzy msgid "Ignore symbolically linked regular _files" -msgstr "Szimbólikus link-fájlok mellőzése" +msgstr "" msgid "Ignored files are" msgstr "Mellőzött fájlok" @@ -7034,13 +6926,11 @@ msgid "Incoming connecting timeout" msgstr "Bejövő kapcsolat válaszideje" -#, fuzzy msgid "Incoming traffic from _leaves" -msgstr "Végpontoktól bejövő sávszélesség korlátja" +msgstr "" -#, fuzzy msgid "Indexing started on:" -msgstr "Indexelés kezdete" +msgstr "" msgid "Info" msgstr "Tájékoztató" @@ -7057,39 +6947,32 @@ msgid "Keep downloading/incomplete files in" msgstr "Letöltésfájlok helye" -#, fuzzy msgid "Keywords:" -msgstr "Kulcsszók" +msgstr "" -#, fuzzy msgid "KiB" -msgstr "K/s" +msgstr "" -#, fuzzy msgid "KiB/s" -msgstr "K/s" +msgstr "" msgid "Large enough uptime" msgstr "Elég hosszú futási idő" -#, fuzzy msgid "Last Request" -msgstr "Utolsó átállás" +msgstr "" -#, fuzzy msgid "Last Upload" -msgstr "Feltöltések" +msgstr "" msgid "Last check" msgstr "Utolsó ellenőrzés" -#, fuzzy msgid "Last chunk size" -msgstr "Első darab mérete" +msgstr "" -#, fuzzy msgid "Last scan initiated on:" -msgstr "Utolsó felmérés indult" +msgstr "" msgid "Last switch" msgstr "Utolsó átállás" @@ -7106,9 +6989,8 @@ msgid "Library # of files" msgstr "# fájl könyvtára" -#, fuzzy msgid "Library scanning:" -msgstr "Könyvtárfelmérés" +msgstr "" msgid "Library size" msgstr "Könyvtárméret" @@ -7134,9 +7016,8 @@ msgid "Make current sorting default" msgstr "" -#, fuzzy msgid "Max # of _high TTL msg" -msgstr "Legtöbb _magas TTL üzenet" +msgstr "" msgid "Max _TTL" msgstr "Legnagyobb _TTL" @@ -7150,32 +7031,26 @@ msgid "Max. _number of results" msgstr "Eredmények leg_nagyobb száma" -#, fuzzy msgid "Max. _percentage of file descriptors" -msgstr "Használt fájleírók legnagyobb százaléka" +msgstr "" msgid "Max. downloads from single host" msgstr "Legtöbb letöltés egy gépről" -#, fuzzy msgid "Max. file _descriptors reserved" -msgstr "Legtöbb fájlleíró foglalva" +msgstr "" -#, fuzzy msgid "Max. number of browse host results" -msgstr "Eredmények leg_nagyobb száma" +msgstr "" -#, fuzzy msgid "Max. number of passive results" -msgstr "Eredmények leg_nagyobb száma" +msgstr "" -#, fuzzy msgid "Max. number of What's New? results" -msgstr "Eredmények leg_nagyobb száma" +msgstr "" -#, fuzzy msgid "Max. simultaneous downloads per file" -msgstr "Legtöbb egyidejű letöltés" +msgstr "" msgid "Max. simultaneous downloads" msgstr "Legtöbb egyidejű letöltés" @@ -7183,13 +7058,11 @@ msgid "Max. simultaneous uploads" msgstr "Legtöbb egyidejű feltöltés" -#, fuzzy msgid "Max. uploads to a single host" -msgstr "Legtöbb feltöltés egy gépre" +msgstr "" -#, fuzzy msgid "Maximum # of leaves" -msgstr "Végpontok legnagyobb száma" +msgstr "" msgid "Maximum attempts to make, not counting HTTP busy indications" msgstr "Legtöbb próbálkozás, nem számítva a HTTP foglalt jelzéseket" @@ -7200,9 +7073,8 @@ msgid "Maximum seconds to wait on auto-retry timeouts" msgstr "Legtöbb másodperc várakozás auto-ismétlés türelem fogytán" -#, fuzzy msgid "Maximum size:" -msgstr "legnagyobb méret" +msgstr "" msgid "" "Maximum size\n" @@ -7223,24 +7095,20 @@ msgid "Min/Max:" msgstr "" -#, fuzzy msgid "Minimum chunk size" -msgstr "Leg_kisebb darabméret" +msgstr "" -#, fuzzy msgid "Minimum file size" -msgstr "legkisebb méret" +msgstr "" msgid "Minimum seconds to wait on auto-retry timeouts" msgstr "Legkevesebb másodperc várakozás auto-ismétlés türelem fogytán" -#, fuzzy msgid "Minimum size:" -msgstr "legkisebb méret" +msgstr "" -#, fuzzy msgid "Minimum upload time" -msgstr "Leg_kisebb darabméret" +msgstr "" msgid "Minimum" msgstr "Legkisebb" @@ -7266,9 +7134,8 @@ msgid "Move corrupted downloaded files to" msgstr "Rossz letöltött fájlok helye" -#, fuzzy msgid "Network protocol:" -msgstr "Protokoll, amelyet a proxy használ" +msgstr "" msgid "Network" msgstr "Hálózat" @@ -7315,20 +7182,17 @@ msgid "Out of Band Querying" msgstr "" -#, fuzzy msgid "Outgoing traffic to lea_ves" -msgstr "Végpontokhoz kimenő sávszélesség korlátja" +msgstr "" -#, fuzzy msgid "Output bandwidth average" -msgstr "Összes kimenő sávszélesség korlátja:" +msgstr "" msgid "PARQ development:" msgstr "PARQ fejlesztése:" -#, fuzzy msgid "Partial File Sharing" -msgstr "Részleges fájlmegosztás (zsúfolás)" +msgstr "" msgid "Pass_word" msgstr "_Jelszó" @@ -7336,13 +7200,11 @@ msgid "Paste rule" msgstr "Szabály beillesztése" -#, fuzzy msgid "Patch generation started on:" -msgstr "Foltgenerálás kezdete" +msgstr "" -#, fuzzy msgid "Pause" -msgstr "Nyomás" +msgstr "" msgid "Pending local queries" msgstr "Függő helyi keresések" @@ -7365,9 +7227,8 @@ msgid "Please confirm:" msgstr "Kérem erősítse meg:" -#, fuzzy msgid "Prefer _compressed connections" -msgstr "Tömörített kapcsolatokat szereti" +msgstr "" msgid "Preferences" msgstr "" @@ -7378,17 +7239,14 @@ msgid "Project leader:" msgstr "Tervvezető:" -#, fuzzy msgid "Property browser" -msgstr "Proxy beállítása" +msgstr "" -#, fuzzy msgid "Property pattern:" -msgstr "Proxy beállítása" +msgstr "" -#, fuzzy msgid "Property" -msgstr "Proxy beállítása" +msgstr "" msgid "Proxy _type:" msgstr "Proxy _típus:" @@ -7396,9 +7254,8 @@ msgid "Proxy settings" msgstr "Proxy beállítása" -#, fuzzy msgid "Public _hostname" -msgstr "Nyilvános gazdanév" +msgstr "" msgid "QRP stats" msgstr "QRP statok" @@ -7409,17 +7266,14 @@ msgid "Queries ask for OOB results" msgstr "" -#, fuzzy msgid "Query Routing Protocol:" -msgstr "Keresés-irányítás protokoll" +msgstr "" -#, fuzzy msgid "Query routing patch information:" -msgstr "Keresésirányítási foltinformáció" +msgstr "" -#, fuzzy msgid "Query routing table information:" -msgstr "Keresésirányítási-táblainformáció" +msgstr "" msgid "Queuing details" msgstr "" @@ -7445,9 +7299,8 @@ msgid "RX speed" msgstr "RX sebesség" -#, fuzzy msgid "RX wire bytes" -msgstr "bájtok" +msgstr "" msgid "Range" msgstr "Rész" @@ -7455,13 +7308,11 @@ msgid "Raphael Manfredi" msgstr "" -#, fuzzy msgid "Ratio of tolerable duplicate messages per _node" -msgstr "Kettőzött üzenetek tűrhető aránya pontonként" +msgstr "" -#, fuzzy msgid "Raw length:" -msgstr "Nyers hossz" +msgstr "" msgid "Re_try search every" msgstr "Keresést ismétel minden" @@ -7494,9 +7345,8 @@ msgid "Report an upload connection _speed of" msgstr "A következő feltöltési _sebesség jelentése" -#, fuzzy msgid "Require _URN" -msgstr "_Urn-t igénylése" +msgstr "" msgid "Require _server name" msgstr "_Kiszolgálónév igénylése" @@ -7522,13 +7372,11 @@ "Szűrőstatisztika-adatok\n" "nullázása e szűrőre" -#, fuzzy msgid "Restart" -msgstr "Adatok _nullázása" +msgstr "" -#, fuzzy msgid "Resu_me" -msgstr "Folytat" +msgstr "" msgid "Resume and retry" msgstr "Folytat és ismétel" @@ -7569,11 +7417,8 @@ msgid "Running in leaf mode." msgstr "Végpont-üzemmód" -#, fuzzy msgid "Running in legacy mode. Consider switching to auto mode." msgstr "" -"Működés hagyományos üzemmódban. Fontolja meg az automatikus üzemmódot! " -"(Beállítás->gNet beállítás->Aktuális üzemmód)" msgid "Running in ultrapeer mode." msgstr "Átjátszó üzemmód" @@ -7581,21 +7426,17 @@ msgid "SHA1 hash (not editable, add from search popup)" msgstr "SHA1 hash (nem szerkeszthető, a kereső felugróból lehet hozzáadni)" -#, fuzzy msgid "Save" -msgstr "Kiszolgáló" +msgstr "" -#, fuzzy msgid "Saved" -msgstr "Kiszolgáló" +msgstr "" -#, fuzzy msgid "Search Monitor" -msgstr "Kereső szűrők" +msgstr "" -#, fuzzy msgid "Search Stats" -msgstr "Kereső szűrők" +msgstr "" msgid "Search Term" msgstr "Keresés" @@ -7615,9 +7456,8 @@ msgid "Searches" msgstr "Keresések" -#, fuzzy msgid "Select files by regex" -msgstr "Minden illeszkedő reg.kif. törlése a sorból" +msgstr "" msgid "Selected property:" msgstr "" @@ -7625,108 +7465,84 @@ msgid "Server" msgstr "Kiszolgáló" -#, fuzzy msgid "Settings" -msgstr "Beállítások megjelenítése" +msgstr "" -#, fuzzy msgid "Show Search_bar" -msgstr "Á_llapotsor" +msgstr "" -#, fuzzy msgid "Show Status_bar" -msgstr "Á_llapotsor" +msgstr "" -#, fuzzy msgid "Show _Connections" -msgstr "_Kapcsolatok" +msgstr "" -#, fuzzy msgid "Show _Downloads" -msgstr "Le_töltések" +msgstr "" -#, fuzzy msgid "Show _Menubar" -msgstr "Á_llapotsor" +msgstr "" -#, fuzzy msgid "Show _Sidebar" -msgstr "Á_llapotsor" +msgstr "" -#, fuzzy msgid "Show _Uploads" -msgstr "_Feltöltések" +msgstr "" -#, fuzzy msgid "Show _bytes" -msgstr "Bájtok" +msgstr "" msgid "Show _confirmation dialog when leaving gtk-gnutella" msgstr "Gtk-gnutellából kilépéskor megerősítés dialógus" -#, fuzzy msgid "Show _inbound Gnutella traffic" -msgstr "GNet-forgalom" +msgstr "" -#, fuzzy msgid "Show _inbound HTTP traffic" -msgstr "bejövő gNet forgalom" +msgstr "" -#, fuzzy msgid "Show _inbound leaf traffic" -msgstr "bejövő gNet forgalom" +msgstr "" msgid "Show _last" msgstr "_Utolsó" -#, fuzzy msgid "Show _metric units" -msgstr "Százalékok" +msgstr "" -#, fuzzy msgid "Show _outbound Gnutella traffic" -msgstr "GNet-forgalom" +msgstr "" -#, fuzzy msgid "Show _outbound HTTP traffic" -msgstr "kimenő gNet forgalom" +msgstr "" -#, fuzzy msgid "Show _outbound leaf traffic" -msgstr "kimenő gNet forgalom" +msgstr "" -#, fuzzy msgid "Show _percentages" -msgstr "Százalékok" +msgstr "" -#, fuzzy msgid "Show _tooltips (does not affect all tooltips yet)" -msgstr "Tippek (még nincs hatással minden tippre)" +msgstr "" -#, fuzzy msgid "Show additional information and settings for advanced and _expert users" msgstr "" -"További információk és beállítások haladó és _gyakorlott felhasználóknak." -#, fuzzy msgid "Show inbound DHT traffic" -msgstr "bejövő gNet forgalom" +msgstr "" -#, fuzzy msgid "Show outbound DHT traffic" -msgstr "kimenő gNet forgalom" +msgstr "" msgid "Show pr_otocol:" msgstr "" -#, fuzzy msgid "Show r_easons for" -msgstr "Okok megjelenítése" +msgstr "" msgid "Show tabs" msgstr "Fülek mutatása" -#, fuzzy msgid "" "Shows visual information on the download progress. Green chunks have been " "downloaded, with the brighter green chunks touched during this session. " @@ -7734,10 +7550,6 @@ "a triangle. Red chunks have not been downloaded yet. The blue line indicates " "which parts of the file have been seen on the network in this session." msgstr "" -"Képi tájékoztatást nyújt a letöltés helyzetéről. Zöld darabok letöltve, a " -"világoszöldek a jelen futási időszakban. Sárga darabok aktívak jelenleg. " -"Piros darabok még nincsenek letöltve. A kék vonal jelzi azon részeket, " -"amelyeket a jelen futási időszakban találtak a hálózatban." msgid "Similar query half-life" msgstr "Hasonló keresés felezése" @@ -7747,9 +7559,8 @@ "before kicking" msgstr "Rúgás előttimérettűrés" -#, fuzzy msgid "Slots:" -msgstr "Nyílások" +msgstr "" msgid "Socket receive buffer size" msgstr "Foglalat fogadó sormérete" @@ -7769,13 +7580,11 @@ msgid "Start now" msgstr "Most kezd" -#, fuzzy msgid "Statistics" -msgstr "Statisztika" +msgstr "" -#, fuzzy msgid "Statistics:" -msgstr "Statisztika" +msgstr "" msgid "Stop" msgstr "" @@ -7807,27 +7616,22 @@ msgid "TX speed" msgstr "TX Sebesség" -#, fuzzy msgid "TX wire bytes" -msgstr "bájtok" +msgstr "" msgid "T_X flow control timeout" msgstr "T_X folyamvezérlés türelmi ideje" -#, fuzzy msgid "Table generation started on:" -msgstr "Táblagenerálás kezdete" +msgstr "" msgid "Thaw queue" msgstr "Sor olvasztása" -#, fuzzy msgid "" "The current IP address and listening port for this node. To change these go " "to File->Preferences->Network." msgstr "" -"E pont jelenlegi IP-címe és bejövő kapuja. Megváltoztatása: " -"Beállítások→Hálózat" msgid "" "There is no condition. When this rule is reached, the matching will continue " @@ -7866,9 +7670,8 @@ msgid "Total output bandwidth limit:" msgstr "Összes kimenő sávszélesség korlátja:" -#, fuzzy msgid "Transferred data" -msgstr "Átvitt adat" +msgstr "" msgid "Try to connect to specified address" msgstr "Először a megadott címhez próbál kapcsolódni" @@ -7894,24 +7697,19 @@ msgid "Ultrapeers" msgstr "Átjátszók" -#, fuzzy msgid "" "Until the configured percentage of outgoing HTTP bandwidth is in use, open " "additional upload slots on request." msgstr "" -"Újabb feltöltő-nyílásokat enged, amíg a kimenő HTTP sávszélességből xx% nem " -"használt." msgid "Update search results pane every" msgstr "Keresési eredmények lap frissítése" -#, fuzzy msgid "Upload History" -msgstr "Feltöltés-napló" +msgstr "" -#, fuzzy msgid "Uploaded:" -msgstr "Feltöltve" +msgstr "" msgid "Uploads" msgstr "Feltöltések" @@ -7919,16 +7717,14 @@ msgid "Uptime" msgstr "Futási idő" -#, fuzzy msgid "Use IP _Type of Service (TOS)" -msgstr "IP-szolgáltatástípus használata" +msgstr "" msgid "Use IPv6-to-IPv4 TRT prefix:" msgstr "" -#, fuzzy msgid "Use _surplus bandwidth" -msgstr "Többlet sávszélesség használata" +msgstr "" msgid "Use global hostiles.txt" msgstr "" @@ -7945,55 +7741,44 @@ msgid "User-Agent" msgstr "Alkalmazás" -#, fuzzy msgid "Value" -msgstr "Méret" +msgstr "" -#, fuzzy msgid "Version" -msgstr "Végződés" +msgstr "" msgid "Vidar Madsen" msgstr "" -#, fuzzy msgid "Visit http://gtk-gnutella.sourceforge.net/." -msgstr "Böngészd a „http://gtk-gnutella.sourceforge.net”-et!" +msgstr "" -#, fuzzy msgid "Volume:" -msgstr "Méret" +msgstr "" msgid "Watch for similar queries" msgstr "Hasonló keresések figyelése" -#, fuzzy msgid "Watch hits for _alternate sources" -msgstr "_Alternatív találatok figyelése" +msgstr "" msgid "What other people see as your connection speed." msgstr "Amit a többiek látnak mint kapcsolat sebessége" -#, fuzzy msgid "Write buffer size" -msgstr "Foglalat fogadó sormérete" +msgstr "" -#, fuzzy msgid "XML Metadata" -msgstr "Kereső stat" +msgstr "" msgid "Yann Grossel" msgstr "" -#, fuzzy msgid "" "You appear to be TCP-firewalled, i.e. others cannot connect to you to " "download files. You will not see push results, which may prevent you from " "seeing a large amount of results." msgstr "" -"gtk-gnutella szerint tűzfal mögött van. Senki sem csatlakozott be eddig. " -"Nyomás nem működik befelé, ami megakadályozhatja nagy mennyiségű adat " -"fogadását." msgid "" "You appear to be UDP-firewalled, i.e. you cannot receive unsolicited traffic " @@ -8009,15 +7794,12 @@ "firewall, so you will be able to send out-of-band query hits." msgstr "" -#, fuzzy msgid "" "You appear to be firewalled, both TCP-wise and UDP-wise. You will not see " "any push results, which may prevent you from seeing a large amount of " "results. You will not be able to send queries requesting out-of-band " "delivery of query hits." msgstr "" -"gtk-gnutella szerint tűzfal mögött van. Senki sem csatlakozott be eddig. " -"Nyomás nem működik, amely megakadályozhatja nagy mennyiségű adat fogadását." msgid "You seem to be offline." msgstr "Úgy tűnik ön nincs vonalban." @@ -8032,42 +7814,35 @@ msgid "_About" msgstr "_Névjegy" -#, fuzzy msgid "_Add directory" -msgstr " Mappa hozzáadása " +msgstr "" msgid "_Browse" msgstr "_Tallóz" -#, fuzzy msgid "_Cancel" -msgstr "Mégsem" +msgstr "" -#, fuzzy msgid "_Compute upload connection speed" -msgstr "Feltöltési sebesség számítása" +msgstr "" -#, fuzzy msgid "_Create filter" -msgstr "Szűrő létrehozása" +msgstr "" msgid "_Deletion coeff. (0-100)" msgstr "_Törlési együttható (1-100)" -#, fuzzy msgid "_Download RX buffer:" -msgstr "Letöltő RX sor: " +msgstr "" msgid "_Download selected" msgstr "Kijelölt le_töltése" -#, fuzzy msgid "_Duplicate" -msgstr "Megkettőzött üzenet" +msgstr "" -#, fuzzy msgid "_Edit filters" -msgstr "Szűrők szerkesztése" +msgstr "" msgid "_FAQ" msgstr "" @@ -8078,40 +7853,32 @@ msgid "_File" msgstr "_Fájl" -#, fuzzy msgid "_General" -msgstr "Általános" +msgstr "" -#, fuzzy msgid "_Gnutella RX buffer:" -msgstr "Gnutella RX sor: " +msgstr "" -#, fuzzy msgid "_Gnutella traffic stats" -msgstr "gnet-forgalmi adatok" +msgstr "" -#, fuzzy msgid "_HTTP traffic stats" -msgstr "HTTP-forgalmi adatok" +msgstr "" -#, fuzzy msgid "_Help" -msgstr "Súgó" +msgstr "" msgid "_Hide downloaded files" msgstr "Letöltött fájlok el_rejtése" -#, fuzzy msgid "_Horizon" -msgstr "Látóköri stat" +msgstr "" -#, fuzzy msgid "_Include headers" -msgstr "Fejlécek fogadása" +msgstr "" -#, fuzzy msgid "_Incoming traffic" -msgstr "bejövő HTTP forgalom" +msgstr "" msgid "_Listen port" msgstr "_Bejövő kapu" @@ -8119,9 +7886,8 @@ msgid "_Messages" msgstr "_Üzenetek" -#, fuzzy msgid "_Outgoing traffic" -msgstr "kimenő HTTP forgalom" +msgstr "" msgid "_Overlap when resuming" msgstr "Át_fedés folytatáskor" @@ -8150,9 +7916,8 @@ msgid "_Reset stats" msgstr "Adatok _nullázása" -#, fuzzy msgid "_Restart" -msgstr "Adatok _nullázása" +msgstr "" msgid "_Stop" msgstr "" @@ -8169,9 +7934,8 @@ msgid "_View" msgstr "_Nézet" -#, fuzzy msgid "_auto-hide leaf traffic stats" -msgstr "gnet végpontforgalmi adatok rejtése" +msgstr "" msgid "active" msgstr "aktív" @@ -8179,9 +7943,8 @@ msgid "and lasted" msgstr "és tartott" -#, fuzzy msgid "auto-hide DHT traffic stats" -msgstr "gnet végpontforgalmi adatok rejtése" +msgstr "" msgid "bytes" msgstr "bájt" @@ -8189,9 +7952,8 @@ msgid "case sensitive" msgstr "kis/nagybetűérzékeny" -#, fuzzy msgid "case-sensitive" -msgstr "kis/nagybetűérzékeny" +msgstr "" msgid "do" msgstr "tegye" @@ -8208,17 +7970,12 @@ msgid "from _nodes within a" msgstr "_pontoktól a köv-n belül" -#, fuzzy msgid "" "gtk-gnutella is shutting down.\n" "Sending bye messages to peers.\n" "\n" "Grace time remaining:" msgstr "" -"gtk-gnutella leáll.\n" -"Elköszönés a többi csomóponttól.\n" -"\n" -"Várakozási idő:" msgid "gtk-gnutella shutdown" msgstr "gtk-gnutella leállítása" @@ -8244,16 +8001,14 @@ msgid "invert condition" msgstr "Fordított feltétel" -#, fuzzy msgid "invert" -msgstr "Visszaállít" +msgstr "" msgid "items" msgstr "elem" -#, fuzzy msgid "kbps to peers" -msgstr "kbit/s csomópontokhoz" +msgstr "" msgid "mark only" msgstr "csak megjelöl" @@ -8264,9 +8019,8 @@ msgid "out" msgstr "ki" -#, fuzzy msgid "queued" -msgstr "Sorban" +msgstr "" msgid "searches" msgstr "keresés megjelenítése" @@ -8283,9 +8037,8 @@ msgid "set" msgstr "bekapcsolva" -#, fuzzy msgid "unavailable" -msgstr "Nem elérhető" +msgstr "" msgid "undefined" msgstr "meghatározatlan" @@ -8296,13 +8049,11 @@ msgid "uploads" msgstr "feltöltés" -#, fuzzy msgid "Available HTTP input bandwidth" -msgstr "Használható sávszélesség" +msgstr "" -#, fuzzy msgid "Available HTTP output bandwidth" -msgstr "Használható sávszélesség" +msgstr "" msgid "DHT up, passive mode." msgstr "" @@ -8316,21 +8067,17 @@ msgid "DHT looking up own KUID." msgstr "" -#, fuzzy msgid "DHT seeded." -msgstr "TX Sebesség" +msgstr "" -#, fuzzy msgid "DHT inactive." -msgstr "%u aktív" +msgstr "" -#, fuzzy msgid "Disabled stealing of outgoing HTTP bandwidth." -msgstr "Kimenő HTTPforgalom sávszélesség-használatát mutatja" +msgstr "" -#, fuzzy -msgid "Splitting ougoing HTTP bandwidth evenly." -msgstr "HTTPforgalom átlagos sávszélesség-használatát mutatja" +msgid "Splitting outgoing HTTP bandwidth evenly." +msgstr "" msgid "Capping HTTP outgoing bandwidth." msgstr "" @@ -8338,27 +8085,26 @@ msgid "Port mapping possible through UPnP or NAT-PMP." msgstr "" -msgid "Port mapping configured through UPnP or NAT-PMP." +msgid "Port mapping configured through NAT-PMP." +msgstr "" + +msgid "Port mapping configured through UPnP." msgstr "" -#, fuzzy msgid "Enable UPnP" -msgstr "Engedélyezett" +msgstr "" -#, fuzzy msgid "Enable NAT-PMP" -msgstr "Engedélyezett" +msgstr "" msgid "Enable HTTP request pipelining" msgstr "" -#, fuzzy msgid "Pipelining max chunk size" -msgstr "Leg_kisebb darabméret" +msgstr "" -#, fuzzy -msgid "Enable upload of patial files deemed rare" -msgstr "Letöltött fájlok kézi eltávolítása" +msgid "Enable upload of partial files deemed rare" +msgstr "" msgid "Enable GUESS (additional querying)" msgstr "" @@ -8366,13 +8112,11 @@ msgid "Issue GUESS queries as well" msgstr "" -#, fuzzy msgid "Bandwidth limits for GUESS queries" -msgstr "GnutellaNet sávszélesség-vezérlése" +msgstr "" -#, fuzzy msgid "Output bandwidth hint" -msgstr "Összes kimenő sávszélesség korlátja:" +msgstr "" msgid "Download queue is frozen." msgstr "" @@ -8386,36 +8130,29 @@ msgid "Answer to queries for partial files" msgstr "" -#, fuzzy msgid "Answer to what's-new? queries" -msgstr "Generált keresések" +msgstr "" -#, fuzzy msgid "Search Media Type" -msgstr "Keresés" +msgstr "" msgid "Audio" msgstr "" -#, fuzzy msgid "Video" -msgstr "_Nézet" +msgstr "" -#, fuzzy msgid "Document" -msgstr "Szám" +msgstr "" -#, fuzzy msgid "Image" -msgstr "Rész" +msgstr "" -#, fuzzy msgid "Archive" -msgstr "aktív" +msgstr "" -#, fuzzy msgid "Search Configuration" -msgstr "Kereső szűrők" +msgstr "" msgid "Stop search when last download completes" msgstr "" @@ -8426,9 +8163,8 @@ msgid "What's new?" msgstr "" -#, fuzzy msgid "Unspecified" -msgstr "meghatározatlan" +msgstr "" msgid "Search filters to apply locally on newly created searches." msgstr "" @@ -8436,12 +8172,14 @@ msgid "Discard results bearing an alien IP address" msgstr "" +msgid "Discard results bearing a banned GUID" +msgstr "" + msgid "Restart session-only searches with pending downloads" msgstr "" -#, fuzzy msgid "Configured DHT mode" -msgstr "Beállított pontmód" +msgstr "" msgid "Store DHT keys/values in memory" msgstr "" @@ -8452,24 +8190,38 @@ msgid "Relayed queries remembered" msgstr "" -msgid "Not in database" +msgid "Allow unused Gnutella outgoing bandwidth to supersede hint" +msgstr "" + +msgid "Display GUESS statistics" +msgstr "" + +msgid "Mapping lease time" +msgstr "" + +msgid "G2 hubs" +msgstr "" + +msgid "Enable the G2 network" +msgstr "" + +msgid " G2, " msgstr "" -#, fuzzy msgid "owned" -msgstr "Kész" +msgstr "" msgid "partial" msgstr "" -#, fuzzy msgid "shared" -msgstr " (elakadva)" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Created %u download" msgid_plural "Created %u downloads" -msgstr0 "%v/%u letöltés" +msgstr0 "" +msgstr1 "" #, c-format msgid "Discarded %u result" @@ -8477,14 +8229,11 @@ msgstr0 "" msgstr1 "" -#, fuzzy -msgid "Query queued..." -msgstr "%u sorban" - -#, fuzzy, c-format +#, c-format msgid "%u term counted" msgid_plural "%u terms counted" -msgstr0 "0 szó számlálva" +msgstr0 "" +msgstr1 "" #, c-format msgid "Couldn't find pixmap file: %s" @@ -8500,36 +8249,32 @@ msgid "Cache contains" msgstr "Gyorstár tartalmaz" -#, fuzzy msgid "Copy to clipboard" -msgstr "Url-t vágólapra másol" +msgstr "" -#, fuzzy msgid "_Remove filter" -msgstr "Szűrő eltávolítása" +msgstr "" msgid "_Close" msgstr "_Bezár" -#, fuzzy msgid "Show _Statusbar" -msgstr "Á_llapotsor" +msgstr "" -#, fuzzy msgid "Show _Peers" -msgstr "Á_llapotsor" +msgstr "" -#, fuzzy msgid "Gnutella _traffic stats" -msgstr "gnet-forgalmi adatok" +msgstr "" -#, fuzzy msgid "_Auto-hide leaf traffic stats" -msgstr "gnet végpontforgalmi adatok rejtése" +msgstr "" + +msgid "Glossary" +msgstr "" -#, fuzzy msgid "_Search" -msgstr "_Keresés:" +msgstr "" msgid "What's New?" msgstr "" @@ -8537,13 +8282,8 @@ msgid "Do not specify any media type (will match any kind of files remotely)" msgstr "" -#, fuzzy msgid "CPU overloaded" -msgstr "Feltöltve" - -#, fuzzy -msgid "Splitting outgoing HTTP bandwidth evenly." -msgstr "HTTPforgalom átlagos sávszélesség-használatát mutatja" +msgstr "" msgid "Connect to" msgstr "Kapcsolódás" @@ -8587,25 +8327,29 @@ msgid "IP:port placeholder" msgstr "" -#, fuzzy msgid "Served " -msgstr "Kiszolgáló" +msgstr "" -msgid "BH HTML served" +msgid "G2 served" msgstr "" msgid " / " msgstr "" +msgid "G2" +msgstr "" + +msgid "BH HTML served" +msgstr "" + msgid "BH HTML" msgstr "" msgid "BH qhits" msgstr "" -#, fuzzy msgid "Current _search:" -msgstr "Jelenlegi keresés" +msgstr "" msgid "_Clear results" msgstr "Eredmények _törlése" @@ -8616,24 +8360,20 @@ msgid "_Received" msgstr "_Kapott" -#, fuzzy msgid "Downloaded data:" -msgstr "Letöltve" +msgstr "" -#, fuzzy msgid "Uploaded data:" -msgstr "Feltöltve" +msgstr "" -#, fuzzy msgid "_Columns show hops" -msgstr "Ugrások" +msgstr "" msgid " " msgstr " " -#, fuzzy msgid "Show reasons _for" -msgstr "Okok megjelenítése" +msgstr "" msgid "Delete" msgstr "Törlés" @@ -8650,76 +8390,55 @@ msgid "_Bind to this address" msgstr "" -#, fuzzy msgid "IPv_4 settings" -msgstr "IP beállítások" +msgstr "" msgid "Force external IPv6 address to" msgstr "" -#, fuzzy msgid "IPv_6 settings" -msgstr "IP beállítások" +msgstr "" msgid "Port Mapping" msgstr "" -#, fuzzy msgid "" "This option can give performance boosts to those on a large network with " "many peers by trying to locate files on the local networks first." msgstr "" -"Ez a kapcsoló megnövelheti a teljesítményt sokpontú, nagy hálózatban azzal, " -"hogy először a helyi hálózatokon keresi a fájlokat." -#, fuzzy msgid "_Addresses of local network(s)" -msgstr "Helyi hálózatok _címei" +msgstr "" msgid "seconds (0 - disable)" msgstr "másodperc (0 - tiltás)" -#, fuzzy msgid "slots" -msgstr "Nyílások" +msgstr "" msgid "unit_of_time|s" msgstr "" -#, fuzzy msgid "Gnutella Distributed Hash Table" -msgstr "A gui hibajavítási szintje" +msgstr "" msgid "Maximum percentage of connection slots a vendor can occupy." msgstr "Az egy adó által foglalható legnagyobb nyílásszázalék." -#, fuzzy -msgid "Global DHT ougoing traffic" -msgstr "kimenő HTTP forgalom" - -#, fuzzy msgid "attempts" -msgstr "Próbálkozás" +msgstr "" -#, fuzzy msgid "Pipelining maximum chunk size" -msgstr "Leg_kisebb darabméret" +msgstr "" -#, fuzzy msgid "_Remove directory" -msgstr " Mappa hozzáadása " - -#, fuzzy -msgid "Enable upload of partial files deemed rare" -msgstr "Letöltött fájlok kézi eltávolítása" +msgstr "" -#, fuzzy msgid "Minimum chunk _size" -msgstr "Leg_kisebb darabméret" +msgstr "" -#, fuzzy msgid "Show a status _icon" -msgstr "Okok megjelenítése" +msgstr "" msgid "Avg. downtime of this servent" msgstr "" @@ -8733,13 +8452,11 @@ msgid ", " msgstr ", " -#, fuzzy msgid "Peer:" -msgstr "Soha" +msgstr "" -#, fuzzy msgid "Peermode:" -msgstr "Átjátszó üzemmód" +msgstr "" msgid "incoming" msgstr "" @@ -8747,9 +8464,8 @@ msgid "outgoing" msgstr "" -#, fuzzy msgid "Country:" -msgstr "Szám" +msgstr "" msgid "Vendor:" msgstr "Eladó:" @@ -8764,6 +8480,9 @@ msgid "Reverse lookup in progress..." msgstr "" +msgid "UDP (semi-reliable)" +msgstr "" + msgid "Size:" msgstr "Méret:" @@ -8776,28 +8495,29 @@ msgid "Valid regular" msgstr "Érvényes hagyományos" -#, fuzzy msgid "Fresh IPv4 ultra" -msgstr "Friss átjátszó" +msgstr "" -#, fuzzy msgid "Valid IPv4 ultra" -msgstr "Érvényes átjátszó" +msgstr "" -#, fuzzy msgid "Fresh IPv6 ultra" -msgstr "Friss átjátszó" +msgstr "" -#, fuzzy msgid "Valid IPv6 ultra" -msgstr "Érvényes átjátszó" +msgstr "" + +msgid "Fresh G2 hub" +msgstr "" + +msgid "Valid G2 hub" +msgstr "" msgid "Unstable" msgstr "Bizonytalan" -#, fuzzy msgid "Alien" -msgstr "Álnevek" +msgstr "" msgid "GUESS (IPv4 running)" msgstr "" @@ -8819,10 +8539,11 @@ msgid "translation_credit|" msgstr "" -#, fuzzy, c-format +#, c-format msgid "%d second" msgid_plural "%d seconds" -msgstr0 "másodperc" +msgstr0 "" +msgstr1 "" msgid "" "<html><head><title>Frequently Asked Questions</title></head><body><p>The FAQ " @@ -8830,10 +8551,16 @@ "sourceforge.net/?page=faq\">FAQ online</a> instead.</p></body></html>" msgstr "" -#, fuzzy, c-format +msgid "" +"<html><head><title>Glossary</title></head><body><p>The glossary document " +"could not be loaded.</p></body></html>" +msgstr "" + +#, c-format msgid "%lu file shared (%s)" msgid_plural "%lu files shared (%s)" -msgstr0 "%lu fájl megosztva (%s)" +msgstr0 "" +msgstr1 "" msgid "(avg)" msgstr "(átl)" @@ -8844,25 +8571,24 @@ msgid "Welcome sent" msgstr "" -#, fuzzy msgid "No UDP traffic yet" -msgstr "HTTP-forgalom" +msgstr "" #, c-format msgid "Closing: %s Stop in %us RX=%u Q=%u,%u%%" msgstr "" -#, fuzzy msgid "Removing" -msgstr "Eltávolítás" +msgstr "" -#, fuzzy msgid "Receiving hello" -msgstr "Fejlécek fogadása" +msgstr "" -#, fuzzy msgid "UNKNOWN STATUS" -msgstr "ISMERETLEN ÁLLAPOT %u" +msgstr "" + +msgid "g2" +msgstr "" msgid "busy" msgstr "foglalt" @@ -8876,13 +8602,11 @@ msgid "proxy" msgstr "proxy" -#, fuzzy msgid "bogus" -msgstr "foglalt" +msgstr "" -#, fuzzy msgid "alien" -msgstr "Álnevek" +msgstr "" msgid "media" msgstr "" @@ -8894,37 +8618,98 @@ msgid "Flushing queue (%u results pending)" msgstr "" -#, fuzzy msgid "The search has been stopped" -msgstr "Nics letöltő nyílás" +msgstr "" -#, fuzzy msgid "Passive search" -msgstr "(passzív keresés)" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Expires in %s" -msgstr " %d után újra" +msgstr "" msgid "Expires with this session" msgstr "" #, c-format +msgid " %u download" +msgid_plural " %u downloads" +msgstr0 "" +msgstr1 "" + +#, c-format msgid "" "%u %s (%u skipped, %u ignored, %u hidden, %u auto-d/l, %u %s) Hits: %u (%u " "TCP, %u UDP)" msgstr "" -#, fuzzy msgid "item" msgid_plural "items" -msgstr0 "elem" +msgstr0 "" +msgstr1 "" msgid "dupe" msgid_plural "dupes" msgstr0 "" msgstr1 "" +msgid "No GUESS queries run yet" +msgstr "" + +#, c-format +msgid " previous took %s querying %zu %s with %zu %s kept" +msgstr "" + +msgid "host" +msgid_plural "hosts" +msgstr0 "" +msgstr1 "" + +msgid "hit" +msgid_plural "hits" +msgstr0 "" +msgstr1 "" + +#, c-format +msgid "GUESS %s Total: %zu %s (%s %s, %s kept, %s queries, %s keys)%s" +msgstr "" + +msgid "idle" +msgstr "" + +msgid "query" +msgid_plural "queries" +msgstr0 "" +msgstr1 "" + +#, c-format +msgid "" +"GUESS %s %s (%zu %s, %zu kept, %s queries, %s keys) Pool: %zu %s, (%zu+" +"%zu)/%zu queried, %zu %s (%.2f%%), %zu reached, %zu pending, %zu %s%s%s" +msgstr "" + +msgid "loose" +msgstr "" + +msgid "bounded" +msgstr "" + +msgid "ack" +msgid_plural "acks" +msgstr0 "" +msgstr1 "" + +msgid "hop" +msgid_plural "hops" +msgstr0 "" +msgstr1 "" + +msgid " (load pending)" +msgstr "" + +msgid " (end if starving)" +msgstr "" + msgid "Passive" msgstr "Passzív" @@ -8938,41 +8723,39 @@ "XML-formátumban elmentve és a régi fájl átnevezve\n" "%s-re." -#, fuzzy, c-format +#, c-format msgid "" "could not rename %s as %s: %m\n" "The XML file will not be used unless this problem is resolved." msgstr "" -"Nem sikerült átnevezni %s-t %s-re: %s\n" -"Az XML-fájl nem lesz használatban, amig ez a probléma meg nem oldódik." msgid "<unparsed>" msgstr "<feldolgozatlan>" -#, fuzzy msgid "browsable" -msgstr "biztos" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "%u download" msgid_plural "%u downloads" -msgstr0 "%u/%u letöltés" +msgstr0 "" +msgstr1 "" -#, fuzzy, c-format +#, c-format msgid "%u search" msgid_plural "%u searches" -msgstr0 "Nincs keresés" +msgstr0 "" +msgstr1 "" -#, fuzzy, c-format +#, c-format msgid "Handled magnet link (%s, %s)." -msgstr "Nyomás elküldése sikertelen" +msgstr "" msgid "Ignored unusable magnet link." msgstr "" -#, fuzzy msgid "Created download from URL." -msgstr "%v/%u letöltés" +msgstr "" msgid "Ignored unusable URL." msgstr "" @@ -9024,9 +8807,8 @@ msgid "No" msgstr "Nem" -#, fuzzy msgid "Tag" -msgstr "Cél" +msgstr "" msgid "Yes" msgstr "Igen" @@ -9034,66 +8816,66 @@ msgid "Maybe" msgstr "" -#, fuzzy msgid "Source" -msgstr "Forrás" +msgstr "" -#, fuzzy msgid "Alien IP" -msgstr "Álnevek" +msgstr "" msgid "Alt-Locs" msgstr "" -#, fuzzy msgid "Partial" -msgstr "Összesen" +msgstr "" + +#, c-format +msgid "%s %.2f%%" +msgstr "" + +msgid "Available" +msgstr "" + +msgid "Last modification" +msgstr "" msgid "Latinized" msgstr "" -#, fuzzy msgid "Pathname" -msgstr "Gazdatár" +msgstr "" -#, fuzzy msgid "File URL" -msgstr "Fájl" +msgstr "" -#, fuzzy msgid "Host information" -msgstr "Részletes tájékoztató" +msgstr "" -#, fuzzy msgid "Hostname" -msgstr "Gazdatár" +msgstr "" + +msgid "banned" +msgstr "" -#, fuzzy msgid "Servent ID" -msgstr "Kiszolgáló-azonosító:" +msgstr "" -#, fuzzy msgid "Vendor" -msgstr "Eladó:" +msgstr "" -#, fuzzy msgid "Browsable" -msgstr "biztos" +msgstr "" -#, fuzzy msgid "Hostile" -msgstr "Gép" +msgstr "" msgid "Push-proxies" msgstr "" -#, fuzzy msgid "Packet information" -msgstr "Részletes tájékoztató" +msgstr "" -#, fuzzy msgid "Route" -msgstr "ki" +msgstr "" msgid "Protocol" msgstr "" @@ -9107,9 +8889,8 @@ msgid "N2R URI" msgstr "" -#, fuzzy msgid "Push URL" -msgstr "Nyomás" +msgstr "" msgid "Classic URL" msgstr "" @@ -9132,31 +8913,20 @@ msgid "The URN in the search text is invalid." msgstr "" -msgid "SHA-1 is unknown." -msgstr "" - -msgid "No Bitzi ticket requested yet." -msgstr "" - -msgid "Not in Bitzi database." -msgstr "" - msgid "Encoding" msgstr "" msgid "#" msgstr "#" -msgid "Metadata" -msgstr "" - msgid "Never" msgstr "Soha" -#, fuzzy, c-format +#, c-format msgid "%u/%u host (%u%%)" msgid_plural "%u/%u hosts (%u%%)" -msgstr0 "%u/%u gazda (%u%%)" +msgstr0 "" +msgstr1 "" msgid "loading..." msgstr "töltés…" @@ -9181,6 +8951,12 @@ msgid "*** CPU OVERLOADED -- TRYING TO SAVE CYCLES ***" msgstr "" +msgid "*** KERNEL BUFFER SHORTAGE -- LIMITING TCP CONNECTIONS ***" +msgstr "" + +msgid "*** NO LISTENING TCP SOCKET -- NO INBOUND CONNECTIONS ***" +msgstr "" + msgid "*** UPLOADS STALLING, BANDWIDTH SHORTAGE? ***" msgstr "" @@ -9193,10 +8969,11 @@ msgid "*** Please update gtk-gnutella ***" msgstr "" -#, fuzzy, c-format +#, c-format msgid "*** VERSION WILL BECOME OLD IN %d DAY! ***" msgid_plural "*** VERSION WILL BECOME OLD IN %d DAYS! ***" -msgstr0 "☹☹☹ VÁLTOZAT %d NAPON BELÜL ELAVUL! ☹☹☹" +msgstr0 "" +msgstr1 "" #, c-format msgid "Address/port changed to: %s" @@ -9205,10 +8982,11 @@ msgid "no sources" msgstr "nincs forrás" -#, fuzzy, c-format +#, c-format msgid "%u source" msgid_plural "%u sources" -msgstr0 "%u forrás" +msgstr0 "" +msgstr1 "" #, c-format msgid "%u active" @@ -9218,24 +8996,24 @@ msgid "%u queued" msgstr "%u sorban" -#, fuzzy, c-format -msgid "%u/%u connection" -msgid_plural "%u/%u connections" -msgstr0 "%u/%u kapcsolat" - -#, fuzzy, c-format +#, c-format msgid "%u/%u upload" msgid_plural "%u/%u uploads" -msgstr0 "%u/%u feltöltés" +msgstr0 "" +msgstr1 "" -#, fuzzy, c-format +#, c-format msgid "%u/%u download" msgid_plural "%u/%u downloads" -msgstr0 "%u/%u letöltés" +msgstr0 "" +msgstr1 "" msgid "Queue frozen" msgstr "" +msgid "Internal" +msgstr "" + msgid "Select a property to see its description." msgstr "" @@ -9263,13 +9041,11 @@ msgid "%s(%s) TR: %s %s#%u" msgstr "" -#, fuzzy msgid "stalled" -msgstr " (elakadva)" +msgstr "" -#, fuzzy msgid "Waiting for headers..." -msgstr "SHA1 ellenőrzésre várakozás…" +msgstr "" #, c-format msgid "%s %s#%u E=%u" @@ -9278,9 +9054,8 @@ msgid "Waiting for further request..." msgstr "" -#, fuzzy msgid "Reading follow-up request..." -msgstr "Kérelem elküldése" +msgstr "" msgid "Transmission aborted" msgstr "" @@ -9303,18 +9078,3 @@ msgid "Sent QUEUE, waiting for headers..." msgstr "" - -#, fuzzy -#~ msgid "Linux archives" -#~ msgstr "%u aktív" - -#, fuzzy -#~ msgid "Index" -#~ msgstr "Index:" - -#, fuzzy -#~ msgid "Seaerch Media Type" -#~ msgstr "Keresés" - -#~ msgid "Connecting" -#~ msgstr "Kapcsolódás"
View file
gtk-gnutella-0.98.2.tar.bz2/po/it.po -> gtk-gnutella-1.1.9.tar.bz2/po/it.po
Changed
@@ -1,38 +1,38 @@ -# $Id$ -# -# Messaggi in italiano per gtk-gnutella. -# Copyright (C) 2000-2001 Yann Grossel. -# Copyright (C) 2001-2010 Raphaël Manfredi. -# This file is distributed under the same license as the gtk-gnutella package. -# Lorenzo Gaifas <lorenzo@artiemestieri.tn.it>, 2006. +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Raphael Manfredi +# This file is distributed under the same license as the PACKAGE package. # +# Translators: +# Lorenzo Gaifas <lorenzo@artiemestieri.tn.it>, 2006 +# Lucio Marinelli, 2015-2016 +# Sebastiano Pistore <olatusrooc@virgilio.it>, 2016 msgid "" msgstr "" -"Project-Id-Version: gtk-gnutella 0.96.7u\n" +"Project-Id-Version: gtk-gnutella\n" "Report-Msgid-Bugs-To: gtk-gnutella-devel@lists.sf.net\n" -"POT-Creation-Date: 2011-11-22 18:27+0100\n" -"PO-Revision-Date: 2006-04-30 16:30+0200\n" -"Last-Translator: Lorenzo Gaifas <lorenzo@artiemestieri.tn.it>\n" -"Language-Team: Italian <it@li.org>\n" +"POT-Creation-Date: 2016-03-06 08:49+0100\n" +"PO-Revision-Date: 2016-02-20 17:09+0000\n" +"Last-Translator: Lucio Marinelli\n" +"Language-Team: Italian (http://www.transifex.com/gtk-gnutella/gtk-gnutella/" +"language/it/)\n" +"Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=n==1?0:1;\n" -"Language-Code: it\n" -"Language-Name: Italiano\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" -#, c-format -msgid "%s%s%s%s%s fps, %s kbps" -msgstr "" +msgid "Harmful version banned, upgrade required" +msgstr "Questa versione contiene dei bug, appena possibile aggiornarla" -#, fuzzy -msgid "times|x" -msgstr "Attività" +msgid "Connection refused" +msgstr "Connessione rifiutata" + +msgid "Use an open Gnutella or G2 servent" +msgstr "Usa un server Gnutella o G2 aperto" #, c-format msgid "Stopped, will retry with TLS (%s)" -msgstr "" +msgstr "Interrotto, riproverò con TLS (%s)" #, c-format msgid "Stopped (%s)" @@ -42,77 +42,77 @@ msgid "Too many attempts (%u times)" msgstr "Troppi tentativi (%u volte)" -#, fuzzy msgid "Requeued due to no push-proxy" -msgstr "Riaccodato per timeout" +msgstr "Riaccodato per mancanza del push-proxy" -#, fuzzy msgid "Requeued due to file removal" -msgstr "Riaccodato per timeout" +msgstr "Riaccodato per file rimosso" msgid "Requeued by file info change" msgstr "Riaccodato in seguito a cambiamento delle informazioni" -#, fuzzy msgid "Duplicate download" -msgstr "%u scaricamento di %u" +msgstr "Download duplicato" msgid "Nothing else to switch to" -msgstr "" +msgstr "Nient'altro a cui passare" #, c-format msgid "Switching (after error) to \"%s\"" -msgstr "" +msgstr "Passo a \"%s\" causa errore" -#, fuzzy, c-format -msgid " at %s - rescheduled for %s%s #%u" -msgstr " alle %s - riprogrammato per le %s" +#, c-format +msgid " at %s" +msgstr "a %s" msgid "Suspended (SHA1 checking)" msgstr "Sospeso (verifica SHA1)" -#, fuzzy, c-format +#, c-format msgid "Ignoring requested (%s)" -msgstr "Invio richiesta (%u%%)" +msgstr "Ignoro richiesta (%s)" -#, fuzzy msgid "Paused" -msgstr "Passivo" +msgstr "In pausa" msgid "Nothing more to get" -msgstr "" +msgstr "Nient'altro da recuperare" msgid "Waiting for a free chunk" -msgstr "In attesa di un posto libero" +msgstr "In attesa di un chunk libero" msgid "No more gaps to fill" -msgstr "" +msgstr "Niente più buchi da riempire" msgid "Download queue is frozen" -msgstr "" +msgstr "La coda di download è congelata" + +msgid "Network buffer shortage" +msgstr "Carenza di buffer di rete" msgid "No download slot (start)" -msgstr "Nessun posto di scaricamento (avvia)" +msgstr "Nessuno slot di scaricamento (avvia)" msgid "Connection failed (Out of file descriptors?)" -msgstr "Connessione fallita (Mancanza di descrizioni dei file?)" +msgstr "Connessione fallita (Mancanza dei descrittori dei file?)" msgid "Connection failed" msgstr "Connessione fallita" +msgid "SHA1 mismatch detected" +msgstr "Rilevato errore SHA1" + msgid "Waiting for server PROX publishing" -msgstr "" +msgstr "Attendo che il server pubblichi PROX" -#, fuzzy msgid "Waiting for push route" -msgstr "In attesa di ulteriori richieste..." +msgstr "In attesa del routing" -#, fuzzy msgid "Push route lost" -msgstr "Perso instradamento" +msgstr "Instradamento perso" msgid "Ignoring Push flag" -msgstr "Ignoro flag spinta" +msgstr "Ignoro flag Push" #, c-format msgid "No direct connection yet (%u retry)" @@ -135,21 +135,17 @@ msgid "Dup SHA1 during creation" msgstr "Duplica SHA1 alla creazione" -#, fuzzy msgid "Max. number of downloads reached" -msgstr "Numero massimo risultati di consultazione host" +msgstr "Raggiunto il numero massimo di download" -#, fuzzy msgid "Max. number of downloads for this host reached" -msgstr "Numero massimo risultati di consultazione host" +msgstr "Raggiunto il numero massimo di connessioni per questo host" -#, fuzzy msgid "Has already enough active sources" -msgstr "Sorgenti inattive" +msgstr "Già presenti abbastanza sorgenti attive" -#, fuzzy msgid "download_start() failed" -msgstr "Scarica i file selezionati" +msgstr "download_start() fallito" msgid "Stopped (Index changed)" msgstr "Fermato (indice cambiato)" @@ -157,51 +153,50 @@ msgid "Explicitly requeued" msgstr "Riaccodato esplicitamente" -#, fuzzy msgid "Failed (Header line too large)" -msgstr "Fallito (raga dei titoli troppo lunga)" +msgstr "Fallito (Header troppo lungo)" #, c-format msgid "Failed (%s)" msgstr "Fallito (%s)" msgid "Failed (Input buffer full)" -msgstr "Fallito (contenitore ingresso pieno)" +msgstr "Fallito (buffer d'ingresso pieno)" msgid "Connection not kept-alive (EOF)" msgstr "Connessione non mantenuta attiva (EOF)" msgid "Stopped (EOF) <err_header_read_eof>" -msgstr "" +msgstr "Interrotto (EOF) <err_header_read_eof>" -#, fuzzy, c-format +#, c-format msgid "Can't check resume data: %s" -msgstr "Non posso salvare i dati: %s" +msgstr "Impossibile recuperare i dati: %s" -#, fuzzy, c-format +#, c-format msgid "Can't stat opened file: %s" -msgstr "Non posso salvare i dati: %s" +msgstr "Non posso analizzare un file aperto: %s" msgid "Stopped (Output file size changed)" msgstr "Fermato (dimensione del file di output cambiata)" -#, fuzzy, c-format +#, c-format msgid "Can't read resume data: %s" -msgstr "Non posso salvare i dati: %s" +msgstr "Non posso leggere i dati ripresi: %s" msgid "Short read on resume data" -msgstr "" +msgstr "Lettura breve sui dati ripresi" #, c-format msgid "Resuming data mismatch @ %s" -msgstr "" +msgstr "Sto riprendendo dati discordanti @ %s" #, c-format msgid "Can't save data: %s" msgstr "Non posso salvare i dati: %s" msgid "Partial write to file" -msgstr "" +msgstr "Scrittura parziale sul file" msgid "Requeued after trimmed data" msgstr "Riaccodato dopo regolazione dei dati" @@ -211,40 +206,34 @@ #, c-format msgid "Switching to \"%s\"" -msgstr "" +msgstr "Passo a \"%s\"" msgid "Requeued by competing download" msgstr "Riaccodato per scaricamento concorrente" -#, fuzzy msgid "Weird HTTP status" -msgstr "Stato HTTP misterioso (de-sincronizzazione protocollo?)" +msgstr "Stato HTTP strano" -#, fuzzy msgid "Download was a duplicate" -msgstr "_Scarica selezionato" +msgstr "Il download era un duplicato" -#, fuzzy msgid "Filesize mismatch" -msgstr "Errore nelle informazioni del file dell'URN" +msgstr "Dimensione file discordante" -#, fuzzy msgid "No URN on server (required)" -msgstr "Nessun URN sul server da convalidare" +msgstr "Nessun URN sul server (richiesto)" msgid "No URN on server, waiting for overlap" msgstr "Nessun URN sul server, attesa di sovrascrittura" msgid "No URN on server to validate" -msgstr "Nessun URN sul server da convalidare" +msgstr "Nessun URN da convalidare sul server" -#, fuzzy msgid "TTH mismatch detected" -msgstr "Rilevato errore SHA1" +msgstr "Rilevata discordanza TTH" -#, fuzzy msgid "SHA-1 mismatch detected" -msgstr "Rilevato errore SHA1" +msgstr "Rilevata discordanza SHA-1" msgid "URN fileinfo mismatch" msgstr "Errore nelle informazioni del file dell'URN" @@ -253,51 +242,51 @@ msgstr "Riscontrata duplicazione SHA1" msgid "More data to sink than expected" -msgstr "" +msgstr "Più dati di quanto atteso nel sink" -#, fuzzy msgid "Stopped data (EOF)" -msgstr "Arrestati (%s)" +msgstr "Dati terminati (EOF)" -#, fuzzy, c-format +#, c-format msgid "Stopped data (%s)" -msgstr "Arrestati (%s)" +msgstr "Dati terminati (%s)" #, c-format msgid "Failed (Read error: %s)" msgstr "Fallito (Errore lettura: %s)" -#, fuzzy msgid "Timeout reading HTTP status" -msgstr "Non posso inviare lo stato HTTP completo" +msgstr "Tempo scaduto leggendo lo stato HTTP" -#, fuzzy msgid "Timeout reading headers" -msgstr "Lettura titoli" +msgstr "Tempo scaduto leggendo gli header" #, c-format msgid "No support for Content-Encoding (%s)" -msgstr "" +msgstr "Nessun supporto per Content-Encoding (%s)" + +msgid "Incomplete headers during TLS upgrade" +msgstr "Header incompleti durante l'upgrade TLS" msgid "Spammer detected" msgstr "Rilevato spammer" msgid "Partial file, bad HTTP keep-alive support" -msgstr "" +msgstr "File parziale, cattivo supporto keep-alive" #, c-format msgid "Partial file, too much data to sink (%s bytes)" -msgstr "" +msgstr "File parziale, troppi dati verso il sink (%s bytes)" msgid "Partial file, no suitable range found yet" -msgstr "" +msgstr "File parziale, range adatto non ancora trovato" msgid "Partial file on server, waiting" msgstr "File parziale sul server, attesa" #, c-format msgid "%sRequested range unavailable yet" -msgstr "" +msgstr "Range richiesto %s non ancora disponibile" msgid "Queued" msgstr "Accodati" @@ -308,165 +297,167 @@ #, c-format msgid ", ETA: %s" -msgstr "" +msgstr ", ETA: %s" msgid "Server did not supply identification" -msgstr "" +msgstr "Il server non ha fornito l'identificativo" msgid "Unparseable Content-Length" -msgstr "" +msgstr "Contenuto-Lunghezza inutilizzabile" msgid "Total/served sizes mismatch" -msgstr "" +msgstr "Discrepanza dimensioni totale/servita" -#, fuzzy msgid "Range start mismatch" -msgstr "Riavvia questa ricerca" +msgstr "Discrepanza range d'inizio" msgid "Range end too large" -msgstr "" +msgstr "Range finale troppo grande" -#, fuzzy msgid "Range mismatch" -msgstr "Errore nelle informazioni del file dell'URN" +msgstr "Discrepanza di range" msgid "Weird server-side chunk shrinking" -msgstr "" +msgstr "Strano compattamento dei pezzi lato server" msgid "Content-Length mismatch" -msgstr "" +msgstr "Discrepanza contenuto-lunghezza" msgid "No Content-Length header" -msgstr "" +msgstr "Nessuno header contenuto-lunghezza" + +msgid "Unexpected Content-Type" +msgstr "Tipo di contenuto inatteso" + +msgid "No Content-Type" +msgstr "Nessuna tipologia di contenuto" -#, fuzzy msgid "Search already closed" -msgstr "Aggiunta ricerca" +msgstr "Ricerca già chiusa" -#, fuzzy msgid "THEX download aborted" -msgstr "Scaricati:" +msgstr "Download THEX interrotto" msgid "Pipeline flow stopped" -msgstr "" +msgstr "Flusso del traffico parallelo interrotto" -#, fuzzy, c-format +#, c-format msgid "Cannot open %s: %s" -msgstr "Fallito (non è possibile inviare %s: %s)" +msgstr "Non posso aprire %s: %s" msgid "Cannot resume: file gone" -msgstr "" +msgstr "Non posso riprendere: il file è sparito" -#, fuzzy, c-format +#, c-format msgid "Cannot write into file: %s" -msgstr "Scrittura fallita : %s" +msgstr "Non posso scrivere nel file %s" msgid "Stopped (Read buffer full)" msgstr "Arrestato (contenitore lettura pieno)" -#, fuzzy msgid "Failed (Completed?)" -msgstr "Completati" +msgstr "Fallito (completato?)" -#, fuzzy msgid "Could not send whole HTTP request" -msgstr "Non posso inviare lo stato HTTP completo" +msgstr "Non posso inviare la richiesta HTTP completa" #, c-format msgid "Write failed: %s" msgstr "Scrittura fallita : %s" -#, fuzzy msgid "Malformed push reply" -msgstr "Tentativo di query malformata" - -msgid "SHA1 mismatch detected" -msgstr "Rilevato errore SHA1" +msgstr "Risposta push malformata" msgid ", inbound" -msgstr "" +msgstr ", in ingresso" msgid ", outbound" -msgstr "" +msgstr ", in uscita" + +msgid ", no-pipeline" +msgstr ", nessun traffico parallelo" -#, fuzzy msgid ", banning" -msgstr "Scartamento" +msgstr ", in espulsione" msgid ", g2" -msgstr "" +msgstr ", g2" + +msgid ", fake-g2" +msgstr ", falso-g2" -#, fuzzy msgid ", vendor?" -msgstr "Offerente:" +msgstr ", programma?" + +#, c-format +msgid "<Browse G2 Host %s>" +msgstr "<Consulta host G2 %s>" #, c-format msgid "<Browse Host %s>" -msgstr "<Sfoglia host %s>" +msgstr "<Consulta host %s>" #, c-format msgid "<THEX data for %s>" -msgstr "" +msgstr "<dati THEX per %s>" -#, fuzzy msgid "Browse search closed" -msgstr "Mostra elenco ricerca" +msgstr "Consultazione interrotta" -#, fuzzy msgid "Stopped data (EOF) <download_got_eof>" -msgstr "Dati fermati (EOF)" +msgstr "Dati terminati (EOF) <download_got_eof>" msgid "No longer connected" msgstr "Disconnesso" -#, fuzzy msgid "Too many data timeouts" -msgstr "Troppi tentativi (%u volte)" +msgstr "Troppi tentativi" msgid "Timeout" -msgstr "" +msgstr "Tempo scaduto" msgid "Requeued due to timeout" msgstr "Riaccodato per timeout" -#, fuzzy, c-format +msgid "Partial file removed" +msgstr "File parziale rimosso" + +msgid "File info being reset" +msgstr "Le informazioni del file vengono resettate" + +#, c-format msgid "Downloading (TR: %s)" -msgstr "Scaricamento (%s) TR: %s" +msgstr "Sto scaricando (TR: %s)" -#, fuzzy msgid "Seeding" -msgstr "Invio spinta" +msgstr "In distribuzione" -#, fuzzy msgid "Computing TTH" -msgstr "Calcolo SHA1" +msgstr "Calcolo TTH" msgid "Computing SHA1" msgstr "Calcolo SHA1" -#, fuzzy msgid "Waiting for TTH check" -msgstr "In attesa del controllo SHA1" +msgstr "In attesa del controllo TTH" msgid "Waiting for SHA1 check" msgstr "In attesa del controllo SHA1" msgid "SHA1" -msgstr "" +msgstr "SHA1" msgid "OK" -msgstr "" +msgstr "OK" msgid "failed" msgstr "fallito" -#, fuzzy msgid "not computed yet" -msgstr "Non c'è ancora un output..." +msgstr "Non ancora calcolato" -#, fuzzy msgid "Waiting for moving..." -msgstr "; In attesa di spostamento..." +msgstr "In attesa per lo spostamento..." msgid "Moving" msgstr "Spostamento" @@ -477,185 +468,44 @@ msgid "No sources" msgstr "Nessuna sorgente" -#, fuzzy, c-format +#, c-format msgid "Queued (%u active, %u passive)" -msgstr "Accodati (%d attivi, %d passivi)" +msgstr "Accodati (%u attivi, %u passivi)" msgid "Waiting" msgstr "In attesa" -#, fuzzy msgid "Querying DHT" -msgstr "Tentativo query" +msgstr "Accodando DHT" -#, fuzzy msgid "Pending DHT query" -msgstr "Query locali in attesa" +msgstr "Query DHT in sospeso" #, c-format msgid "%u/%u successful DHT lookup" msgid_plural "%u/%u successful DHT lookups" -msgstr0 "" -msgstr1 "" +msgstr0 "%u/%u controllo DHT riuscito" +msgstr1 "%u/%u ricerche DHT riuscite" #, c-format msgid "%u DHT lookup" msgid_plural "%u DHT lookups" -msgstr0 "" -msgstr1 "" +msgstr0 "%u controllo DHT" +msgstr1 "%u ricerche DHT" -#, fuzzy, c-format +#, c-format msgid "Got %d host from %s" msgid_plural "Got %d hosts from %s" -msgstr0 "Ricerca cache dell'host UDP %s" -msgstr1 "Ricerca cache dell'host UDP %s" +msgstr0 "Ricevuto %d host da %s" +msgstr1 "Ricevuti %d host da %s" #, c-format -msgid "Bootstrapping from %s" -msgstr "" - -msgid "Bad size" -msgstr "Dimensione errata" - -msgid "Too small" -msgstr "Troppo piccolo" - -msgid "Too large" -msgstr "Troppo grande" - -msgid "Way too large" -msgstr "" - -msgid "Unknown message type" -msgstr "Tipo di messaggio sconosciuto" - -msgid "Unexpected message" -msgstr "Messaggio inatteso" - -msgid "Message sent with TTL = 0" -msgstr "Messaggio inviato via TTL = 0" - -msgid "Improper hops/ttl combination" -msgstr "Combinazione salti/ttl impropria" - -msgid "Max TTL exceeded" -msgstr "Superato massimo TTL" - -msgid "Message throttle" -msgstr "Soffocamento messaggio" - -#, fuzzy -msgid "Message matched limits" -msgstr "Limiti dimensioni messaggi rete Gnutella" - -msgid "Unusable Pong" -msgstr "Pong inusabile" - -msgid "Hard TTL limit reached" -msgstr "Raggiunto il limite TTL hardware" - -msgid "Max hop count reached" -msgstr "Raggiunto il massimo del conteggio per salto" - -msgid "Route lost" -msgstr "Perso instradamento" - -msgid "No route" -msgstr "Nessun instradamento" - -msgid "Duplicate message" -msgstr "Duplica messaggio" - -msgid "Message to banned GUID" -msgstr "Messaggio ai GUID esclusi" +msgid "Connecting to web cache %s" +msgstr "In connessione alla cache web %s" -#, fuzzy -msgid "Message from banned GUID" -msgstr "Messaggio ai GUID esclusi" - -msgid "Node shutting down" -msgstr "Nodo in spegnimento" - -msgid "TX flow control" -msgstr "Controllo flusso TX" - -msgid "Query text had no trailing NUL" -msgstr "Il testo della query non ha NUL ripetuti" - -msgid "Query text too short" -msgstr "Testo query troppo breve" - -msgid "Query had unnecessary overhead" -msgstr "La query aveva una intestazione non necessaria" - -msgid "Query had bad URN" -msgstr "" - -msgid "Message with malformed SHA1" -msgstr "Messaggio con SHA1 malformato" - -msgid "Message with malformed UTF-8" -msgstr "Messaggio con UTF-8 malformato" - -msgid "Malformed Query Hit" -msgstr "Tentativo di query malformata" - -msgid "Bad return address" -msgstr "Indirizzo di ritorno errato" - -msgid "Hostile IP address" -msgstr "Indirizzo IP ostile" - -msgid "Bogus result from Morpheus" -msgstr "" - -msgid "Spam" -msgstr "" - -#, fuzzy -msgid "Evil filename" -msgstr "Nome del file" - -#, fuzzy -msgid "Improper media type" -msgstr "Termina ricerca" - -msgid "Payload inflating error" -msgstr "" - -msgid "Unknown header flags present" -msgstr "" - -#, fuzzy -msgid "Own search results" -msgstr "Risultati ricerca" - -#, fuzzy -msgid "Own queries" -msgstr "Query RX" - -msgid "Ancient query format" -msgstr "" - -#, fuzzy -msgid "Blank Servent ID" -msgstr "ID server:" - -msgid "GUESS Query missing token" -msgstr "" - -msgid "GUESS Invalid query token" -msgstr "" - -msgid "DHT Invalid security token" -msgstr "" - -msgid "DHT Too many STORE requests" -msgstr "" - -#, fuzzy -msgid "DHT Malformed message" -msgstr "Comando malformato" +#, c-format +msgid "Bootstrapping from %s" +msgstr "Inizializzazione da %s in corso" #, c-format msgid "Shutdown (%s)" @@ -667,27 +517,6 @@ msgstr0 "Ottieni %d pong della connessione" msgstr1 "Ottieni %d pong della connessione" -msgid "Sent crawling info" -msgstr "" - -msgid "Cannot setup compressing TX stack" -msgstr "" - -#, c-format -msgid "Got BYE %d %.*s" -msgstr "Arrivederci %d %.*s" - -#, c-format -msgid "Weird HELLO %s" -msgstr "" - -#, c-format -msgid "HELLO %s error %d (%s)" -msgstr "" - -msgid "Shielded node" -msgstr "Nodo protetto" - msgid "Gnet connections disabled" msgstr "Connessioni Gnet disabilitate" @@ -695,6 +524,10 @@ msgstr "Connessione non compressa" #, c-format +msgid "Too many G2 hubs (%u max)" +msgstr "Troppi hub G2 (massimo %u)" + +#, c-format msgid "Too many leaves (%d max)" msgstr "Troppe foglie (massimo %d)" @@ -719,45 +552,76 @@ msgid "Not an ultra node" msgstr "Non ci sono ultra nodi" +msgid "Unknown error" +msgstr "Errore sconosciuto" + msgid "Unstable IP address" msgstr "Indirizzo IP instabile" msgid "Servent version appears unstable" -msgstr "La versione del server sembra instabile" +msgstr "La versione del servent sembra instabile" msgid "No vendor string supplied" -msgstr "Non viene fornita alcuna stringa dell'offerente" +msgstr "Non viene fornita alcuna stringa del programma" #, c-format msgid "Not connecting: %s" -msgstr "No connessione: %s" +msgstr "Nessuna connessione: %s" + +msgid "Cannot setup compressing TX stack" +msgstr "Impossibile impostare la compressione del flusso in trasmissione" + +msgid "Sent crawling info" +msgstr "Invio informazioni di crawling" + +#, c-format +msgid "Got BYE %d %.*s" +msgstr "Arrivederci %d %.*s" + +#, c-format +msgid "Weird HELLO %s" +msgstr "Strano HELLO %s" + +#, c-format +msgid "HELLO %s error %d (%s)" +msgstr "HELLO %s errore %d (%s)" + +msgid "Shielded node" +msgstr "Nodo protetto" msgid "Protocol not acceptable" msgstr "Protocollo non accettabile" +msgid "Conflict" +msgstr "Conflitto" + +msgid "Upgrade Header Missing" +msgstr "Header di upgrade mancante" + msgid "Servent Shutdown" -msgstr "Spegnimento server" +msgstr "Spegnimento servent" -#, fuzzy msgid "Not a network member" -msgstr "Modalità rete Gnutella" +msgstr "Non un membro del network" + +msgid "Need a G2 Hub" +msgstr "Serve uno hub G2" msgid "Too frequent crawling" -msgstr "" +msgstr "Crawling troppo frequente" -#, fuzzy msgid "Already connected to this GUID" -msgstr "Già connesso" +msgstr "Già connesso a questo GUID" #, c-format msgid "Vendor would exceed %d%% of our slots" -msgstr "L'offerente eccederebbe di %d%% delle nostre posizioni" +msgstr "Il programma eccederebbe di %d%% dei nostri slot" msgid "Reserved slot" msgstr "Posizione riservata" msgid "High Outdegree and Dynamic Querying Required" -msgstr "" +msgstr "Richieste elevate diramazioni e interrogazioni dinamiche" msgid "Cannot connect to a crawler" msgstr "Non riesco a connettere un robot" @@ -787,58 +651,64 @@ msgstr "Fallito (EOF)" msgid "Failed (Extra HELLO data)" -msgstr "Fallito (dati extra SALUTO)" +msgstr "Fallito (dati extra HELLO)" msgid "Pseudo UDP node" msgstr "Nodo pseudo-UDP" -#, fuzzy +msgid "Pseudo semi-reliable UDP node" +msgstr "Nodo UDP pseudo semi-affidabile" + +msgid "Pseudo G2 UDP node" +msgstr "Nodo UDP pseudo G2" + msgid "Pseudo DHT node" -msgstr "Nodo pseudo-UDP" +msgstr "Nodo pseudo DHT" msgid "Already connected" msgstr "Già connesso" -#, fuzzy msgid "Limited connection" -msgstr "Connessioni ereditate" +msgstr "Connessione limitata" -#, fuzzy msgid "Write error during HELLO" -msgstr "Errore di scrittura durante il SALUTO: %s" +msgstr "Errore di scrittura durante HELLO" #, c-format msgid "Write error during HELLO: %s" -msgstr "Errore di scrittura durante il SALUTO: %s" +msgstr "Errore di scrittura durante HELLO: %s" msgid "Connection reset during HELLO" -msgstr "Connessione azzerata durante il SALUTO" +msgstr "Connessione azzerata durante HELLO" #, c-format msgid "Kicked: %s message too big (%d bytes)" msgstr "Sbarrati: %s messaggi troppo grandi (%d byte)" -#, fuzzy, c-format +#, c-format msgid "Kicked: %s message too big (>= 64KiB limit)" -msgstr "Sbarrati: %s messaggi troppo grandi (%d byte)" +msgstr "Rifiutato: messaggio %s troppo grande (>=64KiB)" msgid "Leaf" msgstr "Foglia" msgid "Ultrapeer" -msgstr "" +msgstr "Ultrapeer" msgid "Legacy" -msgstr "Eredità" +msgstr "Legacy" msgid "Crawler" -msgstr "Robot" +msgstr "Crawler" msgid "UDP" -msgstr "" +msgstr "UDP" msgid "DHT" -msgstr "" +msgstr "DHT" + +msgid "G2 hub" +msgstr "Hub G2" msgid "Unknown" msgstr "Sconosciuto" @@ -852,48 +722,45 @@ #, c-format msgid "Must wait %u more seconds before resending \"What's New\"" -msgstr "" +msgstr "Devi aspettare altri %u secondi prima di rimandare il \"Novità?\"" -#, fuzzy, c-format +#, c-format msgid "mkdir(\"%s\") failed: %m" -msgstr "Scrittura fallita : %s" +msgstr "mkdir(\"%s\") fallito: %m" msgid "Can't find your home directory!" msgstr "Non riesco a trovare la tua cartella personale!" msgid "$GTK_GNUTELLA_DIR must point to an absolute path!" -msgstr "" +msgstr "$GTK_GNUTELLA_DIR deve contenere un path assoluto!" #, c-format msgid "creating configuration directory \"%s\"" msgstr "creazione della cartella di configurazione \"%s\"" -#, fuzzy, c-format +#, c-format msgid "creating directory \"%s\" for %s" -msgstr "creazione della cartella di configurazione \"%s\"" +msgstr "Creazione directory \"%s\" per %s" -#, fuzzy -msgid "You seem to have left another gtk-gnutella running" -msgstr "Sembra che tu abbia lasciato attiva un'altra istanza di gtk-gnutella\n" +#, c-format +msgid "Another gtk-gnutella supervisor is running as PID %lu" +msgstr "Un altro supervisore gtk-gnutella è in esecuzione come PID %lu" + +#, c-format +msgid "Another gtk-gnutella is running as PID %lu" +msgstr "Un altro gtk-gnutella è in esecuzione come PID %lu" msgid "Cannot proceed without valid configuration directory" msgstr "Non posso procedere senza una cartella di configurazione valida" -#, fuzzy msgid "Failed to create IPv4 UDP socket" -msgstr "Creazione ricerca fallita" +msgstr "Impossibile creare un socket IPv4 UDP" -#, fuzzy msgid "Failed to create IPv6 UDP socket" -msgstr "Creazione ricerca fallita" +msgstr "Impossibile creare un socket IPv6 UDP" -#, fuzzy msgid "Failed to create local socket" -msgstr "Creazione ricerca fallita" - -#, fuzzy -msgid "Failed to create listening sockets" -msgstr "Creazione ricerca fallita" +msgstr "Impossibile creare un socket locale" msgid "Can only run as a leaf when TCP-firewalled" msgstr "" @@ -904,7 +771,13 @@ msgstr "Errore di lettura" msgid "Got EOF" -msgstr "" +msgstr "EOF ricevuto" + +msgid "TLS handshake failed" +msgstr "Handshake TLS fallito" + +msgid "Connection locally failed" +msgstr "Connessione fallita localmente" msgid "Write failed (Input Exception)" msgstr "Scrittura fallita (eccezione in ingresso)" @@ -917,30 +790,120 @@ msgid "Sent ping to UDP host cache %s:%u" msgstr "Inviato ping alla cache dell'host UDP %s:%u" -#, fuzzy, c-format +#, c-format msgid "Got %d host from UDP host cache %s" msgid_plural "Got %d hosts from UDP host cache %s" -msgstr0 "Ricerca cache dell'host UDP %s" -msgstr1 "Ricerca cache dell'host UDP %s" +msgstr0 "Ricevuto %d host dalla cache dell'host UDP %s" +msgstr1 "Ricevuti %d host dalla cache dell'host UDP %s" msgid "Connect back timeout" -msgstr "Tempo massimo riconnessione" +msgstr "Tempo di riconnessione scaduto" + +msgid "Request timeout" +msgstr "Richiesta scaduta" msgid "Timeout waiting for follow-up" -msgstr "" +msgstr "Attesa per il follow-up terminata" msgid "Lifetime expired" -msgstr "Tempo di vita spirato" +msgstr "Tempo di vita terminato" + +msgid "Unauthorized" +msgstr "Non autorizzato" + +#, c-format +msgid "Limiting connections from %s" +msgstr "Connessioni da %s in limitazione" + +msgid "No reason given" +msgstr "Nessuna spiegazione fornita" + +msgid "Bad Request" +msgstr "Richiesta sbagliata" + +msgid "Header too large" +msgstr "Header troppo grande" + +msgid "Input buffer full" +msgstr "Buffer in ingresso pieno" + +msgid "Extra data after HTTP header" +msgstr "Dati aggiuntivi dopo l'header HTTP" msgid "Unable to send GIV" msgstr "Non posso inviare GIV" +msgid "Not Found" +msgstr "Non trovato" + +msgid "File was modified" +msgstr "Il file è stato modificato" + +msgid "Moved Permanently" +msgstr "Spostato permanentemente" + +msgid "File index/name mismatch" +msgstr "Incongruenza indice/nome del file" + +msgid "URN Not Found (urn:sha1)" +msgstr "URN non trovato (urn:sha1)" + +msgid "SHA1 is being recomputed" +msgstr "SHA1 in ricalcolo" + +msgid "Library being rebuilt" +msgstr "Biblioteca in ricostruzione" + +msgid "Malformed URN in /uri-res/N2R request" +msgstr "URN malformato nella richiesta /uri-res/N2R" + +msgid "Malformed URN in /uri-res/N2X request" +msgstr "URN malformato nella richiesta /uri-res/N2X" + +msgid "TTH is being computed" +msgstr "TTH in ricalcolo" + msgid "<Browse Host Request>" msgstr "<Richiesta consultazione host>" +msgid "Browse Host Disabled" +msgstr "Consultazione host disabilitata" + +#, c-format +msgid "Redirected to %s:%u" +msgstr "Reindirizzato verso %s:%u" + +msgid "Not Modified" +msgstr "Non modificato" + msgid "Stalling upload replaced" msgstr "Rimpiazzato il caricamento fermato" +msgid "Already downloading this file" +msgstr "File già in download" + +msgid "Malformed Range request" +msgstr "Richiesta di range malformata" + +msgid "Requested range not satisfiable" +msgstr "Range richiesto non soddisfabile" + +msgid "Requested range not available yet" +msgstr "Range richiesto non ancora disponibile" + +msgid "Queue full" +msgstr "Coda piena" + +msgid "Another connection is still active" +msgstr "Un'altra connessione è ancora attiva" + +#, c-format +msgid "%s not honoured; removed from PARQ queue" +msgstr "%s non soddisfatto; rimosso dalla coda PARQ" + +msgid "Minimum retry delay" +msgstr "Ritardo minimo di ripetizione" + #, c-format msgid "Queued (slot %d, ETA: %s)" msgstr "Accodato (posizione %d, ETA: %s)" @@ -948,21 +911,58 @@ msgid "Cannot send whole HTTP status" msgstr "Non posso inviare lo stato HTTP completo" +msgid "Not Acceptable" +msgstr "Non accettabile" + #, c-format -msgid "<Browse Host Request> %s%s%s" -msgstr "<Richiesta consultazione host> %s%s%s" +msgid "<Browse Host %sRequest> %s%s%s" +msgstr "<Consulta Host %sRichiesta> %s%s%s" msgid "query hits" -msgstr "tentativi query" +msgstr "risultati della query" msgid ", deflate" -msgstr "" +msgstr ", scompatta" msgid ", gzip" -msgstr "" +msgstr ", gzip" msgid ", chunked" -msgstr "" +msgstr ", a pezzetti" + +msgid "THEX failure" +msgstr "fallimento TEX" + +msgid "EOF while sinking" +msgstr "Fine del file durante il sinking" + +#, c-format +msgid "Read error while sinking: %m" +msgstr "Errore di lettura durante il sinking: %m" + +msgid "Content Too Large" +msgstr "Contenuto troppo grande" + +msgid "Unknown/Missing Protocol Tag" +msgstr "Etichetta protocollo sconosciuta o mancante" + +msgid "Missing Host Header" +msgstr "Header dell'host mancante" + +msgid "Not Implemented" +msgstr "Non implementato" + +msgid "Bad URI" +msgstr "URI errato" + +msgid "Bad Path" +msgstr "Percorso errato" + +msgid "No Content Allowed" +msgstr "Nessun contenuto permesso" + +msgid "Sharing currently disabled" +msgstr "Condivisione al momento disabilitata" msgid "Write exception" msgstr "Eccezione in scrittura" @@ -991,29 +991,1230 @@ msgid "IP denying uploads" msgstr "IP che rifiuta caricamenti" -#, fuzzy, c-format +#, c-format msgid " - Newer versions available: release %s / from git %s" -msgstr " - Versioni più recenti disponibili: rilascio %s / dal git %s" +msgstr "- Nuove versioni disponibili: rilascio %s / da git %s" #, c-format msgid " - Newer version available: release %s" msgstr " - Versione più recente disponibile: rilascio %s" -#, fuzzy, c-format +#, c-format msgid " - Newer version available: from git %s" -msgstr " - Versione più recente disponibile: dal git %s" +msgstr "- Nuova versione disponibile: da git %s" -msgid "No proxy" +msgid "Routing errors" +msgstr "Errore instradamento" + +msgid "Routing table chunks" +msgstr "Pezzo della tabella di instradamento" + +msgid "Routing table message capacity" +msgstr "Capacità di messaggi della tabella di instradamento" + +msgid "Routing table message count" +msgstr "Conteggio messaggi della tabella di instradamento" + +msgid "Routing through transient node avoided" +msgstr "Evitato l'instradamento attraverso un nodo transitorio" + +msgid "Duplicates with higher TTL" +msgstr "Duplicati con TTL più alto" + +msgid "SPAM SHA1 database hits" +msgstr "Risultati del database per SHA1 SPAM" + +msgid "SPAM filename and size hits" +msgstr "Risultati di nome file e dimensione SPAM" + +msgid "SPAM fake hits" +msgstr "Risultati fasulli SPAM" + +msgid "SPAM duplicate hits" +msgstr "Risultati duplicati SPAM" + +msgid "SPAM dynamically caught hostile IP addresses" +msgstr "Indirizzi IP ostili catturati dinamicamente SPAM" + +msgid "SPAM dynamically caught hostile IP held" +msgstr "Indirizzi IP ostili catturati dinamicamente e mantenuti SPAM" + +msgid "SPAM spotted spamming IP addresses held" +msgstr "Indirizzi IP spammer identificati e mantenuti" + +msgid "Searches to local DB" +msgstr "Ricerche nel DB locale" + +msgid "Hits on local DB" +msgstr "Risultati sul DB locale" + +msgid "Hits on local partial files" +msgstr "Risultati sui file parziali locali" + +msgid "Hits on \"what's new?\" queries" +msgstr "Risultati delle ricerche \"novità?\"" + +msgid "Query hits received for local queries" +msgstr "Risultati di ricerche locali" + +msgid "G2 searches to local DB" +msgstr "Ricerche G2 verso il database locale" + +msgid "G2 hits on local DB" +msgstr "Ricerche G2 sul database locale" + +msgid "G2 hits on local partial files" +msgstr "Risultati G2 su file parziali locali" + +msgid "Query hits received for OOB-proxied queries" +msgstr "Risultati ricevuti via OOB" + +msgid "Queries requesting OOB hit delivery" +msgstr "Ricerche richiedenti consegna OOB" + +msgid "Stripped OOB flag on queries" +msgstr "Flag OOB rimosso dalle ricerche" + +msgid "Ignored OOB queries due to unclaimed hits" +msgstr "Ricerche OOB ignorare per risultati non richiesti" + +msgid "Duplicate OOB-proxied queries" +msgstr "Ricerche vicariate OOB duplicate" + +msgid "OOB hits received for OOB-proxied queries" +msgstr "Risultati ricevuti per ricerche vicariate OOB" + +msgid "OOB hits bearing alien IP address" +msgstr "Risultati OOB con indirizzo IP non corrispondente" + +msgid "OOB hits ignored due to identified spamming address" +msgstr "Risultato OOB ignorato per indirizzo identificato come spammer" + +msgid "OOB hits ignored due to unsecure promise from known secure host" +msgstr "Risultato OOB ignorato per promessa insicura da host sicuro conosciuto" + +msgid "Unclaimed locally-generated OOB hits" +msgstr "RIsultato OOB generato localmente e non richiesto" + +msgid "Partially claimed locally-generated OOB hits" +msgstr "Risultato OOB generato localmente e parzialmente richiesto" + +msgid "Spurious OOB hit claiming received" +msgstr "Ricevuta richiesta di risultato OOB spuria" + +msgid "Unrequested OOB hits received" +msgstr "Ricevuto risultato OOB non richiesto" + +msgid "Received query hits for untracked queries" +msgstr "Ricevuti risultati per query non tracciate" + +msgid "Tracked query MUIDs" +msgstr "Interrogazione MUID tracciata" + +msgid "Compacted queries" +msgstr "Ricerche compattate" + +msgid "Bytes saved by compacting" +msgstr "Byte salvati compattando" + +msgid "UTF8 queries" +msgstr "Ricerche UTF8" + +msgid "SHA1 queries" +msgstr "Ricerche SHA1" + +msgid "\"What's New?\" queries" +msgstr "Ricerche \"Novità?\"" + +msgid "UTF8 G2 queries" +msgstr "Ricerche UTF8 G2" + +msgid "SHA1 G2 queries" +msgstr "Ricerche SHA1 G2" + +msgid "GUESS queries" +msgstr "Ricerche GUESS" + +msgid "GUESS queries (0.2)" +msgstr "Ricerche GUESS (0.2)" + +msgid "GUESS link cache size" +msgstr "Dimensione cache del collegamento GUESS" + +msgid "GUESS cached query keys held" +msgstr "Chiavi di query mantenute in cache GUESS" + +msgid "GUESS cached 0.2 hosts held" +msgstr "Host 0.2 mantenuti in cache GUESS" + +msgid "GUESS cached G2 hosts held" +msgstr "Host G2 mantenuti in cache GUESS" + +msgid "GUESS locally generated queries" +msgstr "Ricerche generale localmente GUESS" + +msgid "GUESS currently running queries" +msgstr "GUESS sta effettuando interrogazioni" + +msgid "GUESS hits received for locally generated queries" +msgstr "Risultati ricevuti per ricerche locali GUESS" + +msgid "GUESS ultra nodes queried" +msgstr "Ultranodi GUESS interrogati" + +msgid "GUESS ultra nodes sending back an acknowledgment" +msgstr "Ultranodi GUESS che mandano indietro un riscontro" + +msgid "GUESS G2 nodes queried" +msgstr "Nodi G2 GUESS interrogati" + +msgid "GUESS G2 nodes sending back an acknowledgment" +msgstr "Nodi G2 GUESS che mandano indietro un riscontro" + +msgid "Throttled local push messages" +msgstr "Messaggi push locali inibiti" + +msgid "Throttled received push messages" +msgstr "Messaggi push ricevuti inibiti" + +msgid "Broadcasted push messages" +msgstr "Messaggi push trasmessi" + +msgid "Push-proxy UDP relayed messages" +msgstr "Messaggi UDP ritrasmessi da push-proxy" + +msgid "Push-proxy TCP relayed messages" +msgstr "Messaggi TCP ritrasmessi da push-proxy" + +msgid "Push-proxy TCP for FW<->FW transfers" +msgstr "TCP push-proxy per trasferimenti FW<->FW" + +msgid "Push-proxy broadcasted messages" +msgstr "Messaggi trasmessi da push-proxy" + +msgid "Push-proxy found un-proxied local route" +msgstr "Il push-proxy ha trovato un percorso locale senza proxy" + +msgid "Push-proxy lookup failures" +msgstr "Errori nella ricerca del push-proxy" + +msgid "Push relayed via local route" +msgstr "Push inviato tramite percorso locale" + +msgid "Push relayed via routing table" +msgstr "Push ritrasmesso mediante tabella di routing" + +msgid "Locally generated dynamic queries" +msgstr "Ricerche dinamiche generate localmente" + +msgid "Leaf-generated dynamic queries" +msgstr "Ricerche dinamiche generate da foglie" + +msgid "OOB-proxied leaf queries" +msgstr "Ricerche di foglie vicariate OOB" + +msgid "Fully completed dynamic queries" +msgstr "Ricerche dinamiche completate" + +msgid "Partially completed dynamic queries" +msgstr "Ricerche dinamiche incomplete" + +msgid "Dynamic queries ended with no results" +msgstr "Ricerche dinamiche senza risultati" + +msgid "Fully completed dynamic queries getting late results" +msgstr "Ricerche dinamiche completate che ricevono risultati tardivi" + +msgid "Dynamic queries with partial late results" +msgstr "Ricerche dinamiche con risultati parziali tardivi" + +msgid "Dynamic queries completed by late results" +msgstr "Ricerche dinamiche completate con risultati tardivi" + +msgid "Queries seen from GTKG" +msgstr "Ricerche viste da GTKG" + +msgid "Queries seen from GTKG that were re-queries" +msgstr "Ricerche viste da GTKG che sono state nuovamente ricercate" + +msgid "Queries advertising support of GGEP \"H\"" +msgstr "Ricerche che supportano GGEP \"H\"" + +msgid "Queries advertising support of semi-reliable UDP" +msgstr "Ricerche che supportano UDP semi-affidabile" + +msgid "GIV callbacks received" +msgstr "Richiamata GIV ricevuta" + +msgid "GIV discarded due to no suitable download" +msgstr "GIV scartato a causa di download non adatto" + +msgid "QUEUE callbacks received" +msgstr "Richiamata QUEUE ricevuta" + +msgid "QUEUE discarded due to no suitable download" +msgstr "QUEUE scartato a causa di download non adatto" + +msgid "File descriptors banned running count" +msgstr "Descrittori di file esclusi durante il conteggio" + +msgid "UDP read-ahead datagram running count" +msgstr "Conteggio dei pacchetti UDP in arrivo accodati" + +msgid "UDP read-ahead datagram running bytes" +msgstr "Byte dei pacchetti UDP in arrivo accodati" + +msgid "UDP read-ahead datagram \"old\" processed" +msgstr "Pacchetti UDP \"vecchi\" accodati processati" + +msgid "UDP read-ahead datagram max count" +msgstr "Conta massima dei pacchetti UDP accodati" + +msgid "UDP read-ahead datagram max bytes" +msgstr "Byte massimi dei pacchetti UDP accodati" + +msgid "UDP read-ahead datagram max delay" +msgstr "Ritardo massimo dei pacchetti UDP accodati" + +msgid "UDP push messages received for FW<->FW connections" +msgstr "Messaggi push UDP ricevuti per connessioni FW <-> FW" + +msgid "UDP push messages requesting FW<->FW connection with ourselves" +msgstr "Messaggi push UDP richiedenti connessioni FW <-> FW con noi stessi" + +msgid "UDP push messages patched for FW<->FW connections" +msgstr "Messaggi push UDP sistemati per connessioni FW <-> FW" + +msgid "UDP UHC pings received" +msgstr "Ping UDP UDC ricevuti" + +msgid "UDP UHC pongs sent" +msgstr "Pong UDP UHC inviati" + +msgid "UDP messages with bogus source IP" +msgstr "Messaggi UDP con IP di origine fasullo" + +msgid "UDP messages from shunned IP (discarded)" +msgstr "Messaggi UDP da IP evitato (scartati)" + +msgid "UDP truncated incoming messages" +msgstr "Messaggi UDP in arrivo troncati" + +msgid "Alien UDP messages (non-Gnutella)" +msgstr "Messaggi UDP non corrispondenti (non-Gnutella)" + +msgid "Unprocessed UDP Gnutella messages" +msgstr "Messaggi Gnutella UDP non processati" + +msgid "Compressed UDP messages enqueued" +msgstr "Messaggi UDP compressi accodati" + +msgid "Compressed UDP messages received" +msgstr "Messaggi UDP compressi ricevuti" + +msgid "Candidates for UDP message compression" +msgstr "Candidati per compressione messaggi UDP" + +msgid "Uncompressed UDP messages due to no gain" +msgstr "Messaggi UDP non compressi per mancata convenienza" + +msgid "Ambiguous UDP messages received" +msgstr "Messaggi UDP ambigui ricevuti" + +msgid "Ambiguous UDP messages inspected more deeply" +msgstr "Messaggi UDP ambigui analizzati più a fondo" + +msgid "Ambiguous UDP messages handled as semi-reliable UDP" +msgstr "Messaggi UDP ambigui gestiti come UDP semi-affidabili" + +msgid "Semi-reliable UDP total messages given for transmission" +msgstr "Messaggi totali UDP semi-affidabili consegnati per la trasmissione" + +msgid "Semi-reliable UDP total messages deflated" +msgstr "Messaggi totali UDP semi-affidabili sgonfiati" + +msgid "Semi-reliable UDP total messages unsent" +msgstr "Messaggi totali UDP semi-affidabili non inviati" + +msgid "Semi-reliable UDP total messages dropped due to temporary ban" msgstr "" +"Messaggi totali UDP semi-affidabili abbandonati per esclusione temporanea" -msgid "HTTP" +msgid "Semi-reliable UDP total messages sent to known responsive hosts" msgstr "" +"Messaggi totali UDP semi-affidabili inviati a host responsivi conosciuti" -msgid "SOCKS v4" +msgid "Semi-reliable UDP total messages partially sent due to clogging" msgstr "" +"Messaggi totali UDP semi-affidabili parzialmente inviati causa intasamento" -msgid "SOCKS v5" +msgid "Semi-reliable UDP reliable messages given for transmission" +msgstr "Messaggi affidabili UDP semi-affidabili forniti per trasmissione" + +msgid "Semi-reliable UDP reliable messages correctly transmited" +msgstr "Messaggi affidabili UDP semi-affidabili trasmessi correttamente" + +msgid "Semi-reliable UDP reliable messages not fully acknowledged" +msgstr "Messaggi affidabili UDP semi-affidabili non del tutto riconosciuti" + +msgid "Semi-reliable UDP fragments sent" +msgstr "Frammenti UDP semi-affidabili inviati" + +msgid "Semi-reliable UDP fragments resent" +msgstr "Frammenti UDP semi-affidabili reinviati" + +msgid "Semi-reliable UDP fragment sendings avoided" +msgstr "Frammenti UDP semi-affidabili non inviati" + +msgid "Semi-reliable UDP fragments sent too many times" +msgstr "Frammenti UDP semi-affidabili inviati troppe volte" + +msgid "Semi-reliable UDP total acknowledgments received" +msgstr "Riconoscimenti totali di UDP semi-affidabili ricevuti" + +msgid "Semi-reliable UDP cumulative acknowledgments received" +msgstr "Riconoscimenti cumulativi di UDP semi-affidabili ricevuti" + +msgid "Semi-reliable UDP extended acknowledgments received" +msgstr "Riconoscimenti estesi di UDP semi-affidabili ricevuti" + +msgid "Semi-reliable UDP spurious acknowledgments received" +msgstr "Riconoscimenti spuri di UDP semi-affidabili ricevuti" + +msgid "Semi-reliable UDP invalid acknowledgments received" +msgstr "Riconoscimenti non validi di UDP semi-affidabili ricevuti" + +msgid "Semi-reliable UDP acknowledgments re-queued for sending" +msgstr "Riconoscimenti di UDP semi-affidabili riaccodati per l'invio" + +msgid "Semi-reliable UDP plain acknowledgments dropped" +msgstr "Riconoscimenti semplici di UDP semi-affidabili abbandonati" + +msgid "Semi-reliable UDP enhanced acknowledgments dropped" +msgstr "Riconoscimenti avanzati di UDP semi-affidabili abbandonati" + +msgid "Semi-reliable UDP plain acknowledgments transmitted" +msgstr "Riconoscimenti semplici di UDP semi-affidabili trasmessi" + +msgid "Semi-reliable UDP cumulative acknowledgments transmitted" +msgstr "Riconoscimenti cumulativi di UDP semi-affidabili trasmessi" + +msgid "Semi-reliable UDP extended acknowledgments transmitted" +msgstr "Riconoscimenti estesi di UDP semi-affidabili trasmessi" + +msgid "Semi-reliable UDP EARs sent" +msgstr "EAR UDP semi-affidabili inviate" + +msgid "Semi-reliable UDP too many EARs sent" +msgstr "Troppi EAR UDP semi-affidabili inviati" + +msgid "Semi-reliable UDP EAR negative acknowledgments received" +msgstr "Riconoscimenti UDP semi-affidabili ricevuti dopo aver inviato EAR" + +msgid "Semi-reliable UDP acknowledgments received after sending EARs" +msgstr "Riconoscimenti UDP semi-affidabili ricevuti dopo aver inviato EAR" + +msgid "Semi-reliable UDP fragments received" +msgstr "Frammenti UDP semi-affidabili ricevuti" + +msgid "Semi-reliable UDP duplicate fragments received" +msgstr "Frammenti duplicati UDP semi-affidabili ricevuti" + +msgid "Semi-reliable UDP unreliable fragments received" +msgstr "Frammenti inaffidabili UDP semi-affidabili ricevuti" + +msgid "Semi-reliable UDP dropped received fragments" +msgstr "Frammenti ricevuti UDP semi-affidabili abbandonati" + +msgid "Semi-reliable UDP fragments received whilst lingering" +msgstr "Frammenti UDP semi-affidabili ricevuti durante l'attesa" + +msgid "Semi-reliable UDP messages expired before re-assembly" +msgstr "Messaggi UDP semi-affidabili scaduti prima del riassemblamento" + +msgid "Semi-reliable UDP messages re-assembled completely" +msgstr "Messaggi UDP semi-affidabili riassemblati completamente" + +msgid "Semi-reliable UDP messages inflated successfully" +msgstr "Messaggi UDP semi-affidabili gonfiati con successo" + +msgid "Semi-reliable UDP messages inflated incorrectly" +msgstr "Messaggi UDP semi-affidabili gonfiati in modo scorretto" + +msgid "Semi-reliable UDP unreliable messages received" +msgstr "Messaggi non affidabili UDP semi-affidabili ricevuti" + +msgid "Semi-reliable UDP empty messages received" +msgstr "Messaggi UDP semi-affidabili vuoti ricevuti" + +msgid "Semi-reliable UDP total acknowledgments sent" +msgstr "Riconoscimenti UDP semi-affidabili totali inviati" + +msgid "Semi-reliable UDP cumulative acknowledgments sent" +msgstr "Riconoscimenti cumulativi UDP semi-affidabili inviati" + +msgid "Semi-reliable UDP extended acknowledgments sent" +msgstr "Riconoscimenti UDP semi-affidabili estesi inviati" + +msgid "Semi-reliable UDP avoided acknowledgment sendings" +msgstr "Invii di riconoscimenti UDP semi-affidabili evitati" + +msgid "Semi-reliable UDP EARs received" +msgstr "EAR UDP semi-affidabile ricevuto" + +msgid "Semi-reliable UDP EARs received for unknown message" +msgstr "EAR UDP semi-affidabile ricevuto per messaggio sconosciuto" + +msgid "Semi-reliable UDP EARs received whilst lingering" +msgstr "Frammenti EAR UDP semi-affidabili ricevuti durante l'attesa" + +msgid "Semi-reliable UDP fragments from hostile IP addresses" +msgstr "Frammenti UDP semi-affidabile da indirizzo IP ostile" + +msgid "UDP G2 hits rerouted to hub for delivery" +msgstr "Hit G2 UDP rediretto allo hub per la consegna" + +msgid "UDP G2 hits undelivered" +msgstr "Hit G2 UDP non consegnato" + +msgid "Consolidated servers (after GUID and IP address linking)" +msgstr "Server consolidati (dopo collegamento degli indirizzi GUID e IP)" + +msgid "Duplicate downloads found during server consolidation" +msgstr "Download duplicati trovati durante consolidamento del server" + +msgid "Discovered server GUIDs" +msgstr "Scoperti GUID del server" + +msgid "Changed server GUIDs" +msgstr "Cambiati GUID del server" + +msgid "Detected GUID collisions" +msgstr "Collisioni GUID rilevate" + +msgid "Detected collisions with our own GUID" +msgstr "Collisioni rilevate con il nostro stesso GUID" + +msgid "GUID dynamically banned" +msgstr "GUID esclusa dinamicamente" + +msgid "Firewalled node info for known hosts received in upload requests" msgstr "" +"Informazioni per il nodo dietro firewall per host conosciuti ricevuti nelle " +"richieste di upload" + +msgid "Revitalized PUSH routes" +msgstr "Percorsi PUSH rivitalizzati" + +msgid "Collected new PUSH proxies from other query hits" +msgstr "Nuovi proxy PUSH raccolti da altre query hits" + +msgid "Attempted download resource switching on completion" +msgstr "Tentato cambiamento delle risorse di download al completamento" + +msgid "Attempted download resource switching after error" +msgstr "Tentato cambiamento delle risorse di download dopo errore" + +msgid "Successful download resource switching (all kind)" +msgstr "Cambiamento delle risorse di download riuscito (tutti i tipi)" + +msgid "Successful download resource switching between plain files" +msgstr "Cambiamento delle risorse di download riuscito tra file normali" + +msgid "Successful download resource switching after error" +msgstr "Cambiamento delle risorse di download riuscito dopo errore" + +msgid "Actively queued after resource switching attempt" +msgstr "Accodato attivamente dopo tentativo di cambio risorsa" + +msgid "Sunk HTTP reply data on error codes" +msgstr "Ignorata risposta HTTP con dati su codici di errore" + +msgid "Ignored downloaded data" +msgstr "Dati scaricati ignorati" + +msgid "Ignoring requested after data mismatch" +msgstr "Richieste ignorate per incongruenza dei dati" + +msgid "Ignoring requested to preserve connection" +msgstr "Richieste ignorare per preservare la connessione" + +msgid "Ignoring requested due to aggressive swarming" +msgstr "Richieste ignorate a causa di frammentazione aggressiva" + +msgid "Ignoring refused (data too large or server too slow)" +msgstr "Dati rifiutati ignorati (troppi dati o server troppo lento)" + +msgid "Client resource switching (all detected)" +msgstr "Cambiamento delle risorse del client (rilevate tutte)" + +msgid "Client resource switching between plain files" +msgstr "Cambiamento delle risorse del client tra file normali" + +msgid "Client follow-up request after HTTP error was returned" +msgstr "" +"Richiesta di follow-up del client dopo che un errore HTTP è tornato indietro" + +msgid "PARQ client resource switching in slots (SHA-1 based)" +msgstr "" +"Cambiamento delle risorse del client PARQ nelle posizioni (basato su SHA-1)" + +msgid "PARQ client retry-after violation" +msgstr "Violazione di riprova-dopo del client PARQ" + +msgid "PARQ client kicked out after too many retry-after violations" +msgstr "Client PARQ respinto dopo eccesso di violazioni riprova-dopo" + +msgid "PARQ upload slot limit overrides" +msgstr "Sovrascritto limite della posizione di upload PARQ" + +msgid "PARQ quick upload slots granted" +msgstr "Garantita posizione di upload veloce PARQ" + +msgid "PARQ QUEUE sending attempts" +msgstr "Tentativi di invio PARQ QUEUE" + +msgid "PARQ QUEUE messages sent" +msgstr "Messaggi PARQ QUEUE inviati" + +msgid "PARQ QUEUE follow-up requests received" +msgstr "Richieste di follow-up PARQ QUEUE ricevute" + +msgid "Launched SHA-1 file verifications" +msgstr "Verifiche file SHA-1 lanciate" + +msgid "Launched TTH file verifications" +msgstr "Verifiche file TTH lanciate" + +msgid "Re-seeding of orphan downloads through query hits" +msgstr "Ri-semino download orfani attraverso query hits" + +msgid "Re-seeding of orphan downloads through upload requests" +msgstr "Ri-semino download orfani tramite richieste di upload" + +msgid "RUDP sent bytes" +msgstr "Byte RUDP inviati" + +msgid "RUDP received bytes" +msgstr "Byte RUDP ricevuti" + +msgid "DHT estimated amount of nodes" +msgstr "Stima DHT del numero di nodi" + +msgid "DHT standard error of estimated amount of nodes" +msgstr "Errore standard della stima DHT del numero di nodi" + +msgid "DHT k-ball theoretical frontier (bits)" +msgstr "Frontiera teorica DHT k-ball (bits)" + +msgid "DHT k-ball furthest frontier (bits)" +msgstr "Frontiera più lontana DHT k-ball (bits)" + +msgid "DHT k-ball closeest frontier (bits)" +msgstr "Frontiera più vicina DHT k-ball (bits)" + +msgid "DHT routing table buckets" +msgstr "Bucket della tabella di routing DHT" + +msgid "DHT routing table leaves" +msgstr "Foglie della tabella di routing DHT" + +msgid "DHT routing table maximum depth" +msgstr "Profondità massima della tabella di routing DHT" + +msgid "DHT routing table good nodes" +msgstr "Nodi buoni della tabella di routing DHT" + +msgid "DHT routing table stale nodes" +msgstr "Nodi obsoleti della tabella di routing DHT" + +msgid "DHT routing table pending nodes" +msgstr "Nodi in attesa della tabella di routing DHT" + +msgid "DHT routing table evicted nodes" +msgstr "Nodi sfrattati della tabella di routing DHT" + +msgid "DHT routing table evicted firewalled nodes" +msgstr "Nodi sfrattati dietro firewall della tabella di routing DHT" + +msgid "DHT routing table evicted nodes due to quota" +msgstr "Nodi sfrattati causa quota della tabella di routing DHT" + +msgid "DHT routing table promoted pending nodes" +msgstr "Nodi in attesa promossi della tabella di routing DHT" + +msgid "DHT routing table pinged promoted nodes" +msgstr "Nodi promossi pingati della tabella di routing DHT" + +msgid "DHT routing table rejected node due to bucket network quota" +msgstr "" +"Nodi della tabella di routing DHT rigettati a causa della quota dei bucket " +"di rete" + +msgid "DHT routing table rejected node due to global network quota" +msgstr "" +"Nodi rigettati causa quota di rete globale della tabella di routing DHT" + +msgid "DHT completed bucket refreshes" +msgstr "Aggiornamenti dei bucket DHT completati" + +msgid "DHT forced bucket refreshes" +msgstr "Aggiornamenti forzati dei bucket DHT" + +msgid "DHT forced bucket merges" +msgstr "Unioni forzate dei bucket DHT" + +msgid "DHT bucket merges" +msgstr "Unioni dei bucket DHT" + +msgid "DHT bucket splits" +msgstr "Divisioni dei bucket DHT" + +msgid "DHT denied non-splitable bucket refresh" +msgstr "Aggiornamento rifiutato di bucket DHT non divisibili" + +msgid "DHT initiated bucket alive checks" +msgstr "Controllo funzione di nuovi bucket DHT" + +msgid "DHT alive pings sent to good nodes" +msgstr "Ping alive DHT inviati ai nodi buoni" + +msgid "DHT alive pings sent to stale nodes" +msgstr "Ping alive DHT inviati ai nodi obsoleti" + +msgid "DHT alive pings sent to shutdowning nodes" +msgstr "Ping alive DHT inviati ai nodi in spegnimento" + +msgid "DHT alive pings avoided" +msgstr "Ping alive DHT evitati" + +msgid "DHT alive pings skipped" +msgstr "Ping alive DHT saltati" + +msgid "DHT revitalized stale nodes on RPC reply" +msgstr "Nodi obsoleti DHT rivitalizzati a seguito di risposta RCP" + +msgid "DHT value store rejected on IP/network quota grounds" +msgstr "Impostazione valore DHT rigettata per motivi di quota IP/rete" + +msgid "DHT value store rejected on creator validation grounds" +msgstr "Impostazione valore DHT rigettata per motivi di convalida del creatore" + +msgid "DHT nodes rejected during lookup based on network quota" +msgstr "Nodi DHT rigettati durante ricerca basata su quota di rete" + +msgid "DHT nodes rejected during lookup based on suspicious proximity" +msgstr "Nodi DHT rigettati durante ricerca basata su prossimità sospetta" + +msgid "DHT nodes rejected during lookup based on frequency divergence" +msgstr "" +"Nodi DHT rigettati durante ricerca basata sulla frequenza di divergenza" + +msgid "DHT node contact IP addresses fixed during lookup" +msgstr "Indirizzo IP del nodo DHT aggiustato durante lookup" + +msgid "DHT keys held" +msgstr "Chiavi DHT mantenute" + +msgid "DHT cached keys held" +msgstr "Chiavi DHT in cache mantenute" + +msgid "DHT values held" +msgstr "Valori DHT mantenuti" + +msgid "DHT cached KUID targets held" +msgstr "Obiettivi KUID in cache DHT mantenuti" + +msgid "DHT cached closest root nodes" +msgstr "Nodi radice più vicini in cache DHT" + +msgid "DHT cached roots exact hits" +msgstr "Risultati esatti delle radici in cache DHT" + +msgid "DHT cached roots approximate hits" +msgstr "Risultati approssimati delle radici in cache DHT" + +msgid "DHT cached roots misses" +msgstr "Risultati mancanti delle radici in cache DHT" + +msgid "DHT cached roots lookups within k-ball" +msgstr "Lookup delle radici entro k-ball della cache DHT" + +msgid "DHT cached roots contact address refreshed" +msgstr "Indirizzo contatto radici in cache DHT aggiornati" + +msgid "DHT cached security tokens held" +msgstr "Elementi di sicurezza in cache DHT mantenuto" + +msgid "DHT cached security tokens hits" +msgstr "Risposte di elementi di sicurezza in cache DHT" + +msgid "DHT stable node information held" +msgstr "Informazioni mantenute per nodo stabile DHT" + +msgid "DHT local hits on value lookups" +msgstr "Risultati DHT locali su ricerche del valore" + +msgid "DHT local hits returning values from cached keys" +msgstr "Risultati locali DHT riportanti valori da chiavi in cache" + +msgid "DHT returned expanded values" +msgstr "Valori espansi DHT restituiti" + +msgid "DHT returned values as secondary keys" +msgstr "Valori DHT restituiti come chiavi secondarie" + +msgid "DHT claimed values via secondary keys" +msgstr "Valori DHT richiesti tramite chiavi secondarie" + +msgid "DHT returned cached expanded values" +msgstr "Valori DHT espansi in cache restituiti" + +msgid "DHT returned cached values as secondary-keys" +msgstr "Valori DHT restituiti in cache come chiavi secondarie" + +msgid "DHT claimed cached values via secondary keys" +msgstr "Valori DHT richiesti in cache tramite chiavi secondarie" + +msgid "DHT successfully received value publications" +msgstr "Pubblicazioni di valori DHT ricevuti con successo" + +msgid "DHT successfully received value removals" +msgstr "Rimozioni di valori DHT ricevuti con successo" + +msgid "DHT replication of stale value avoided" +msgstr "Valori DHT di replicazione di stato evitati" + +msgid "DHT replication of held values" +msgstr "Replicati DHT di valori mantenuti" + +msgid "DHT republishing of held values" +msgstr "Ripubblicazione DHT di valori mantenuti" + +msgid "DHT secondary-key value fetch issued" +msgstr "Recuperi di valori di chiave secondaria DHT" + +msgid "DHT duplicate values returned in lookups" +msgstr "Valori DHT duplicati ritornati dopo ricerche" + +msgid "DHT detected KUID collisions" +msgstr "Collisioni rilevate DHT KUID" + +msgid "DHT detected collisions with our own KUID" +msgstr "Collisioni DHT rilevate con il nostro stesso KUID" + +msgid "DHT caching attempts" +msgstr "Tentativi di caching DHT" + +msgid "DHT caching ended successfully" +msgstr "Caching DHT terminato con successo" + +msgid "DHT caching partially completed" +msgstr "Caching DHT parzialmente completato" + +msgid "DHT key-offloading checks after discovering new closest node" +msgstr "Controlli di scarico chiave DHT dopo scoperta di nuovo nodo vicino" + +msgid "DHT keys selected for offloading" +msgstr "Chiavi DHT selezionate per scarico" + +msgid "DHT key-offloading attempts" +msgstr "Tentativi di scarico chiavi DHT" + +msgid "DHT key-offloading ended successfully" +msgstr "Scarico chiavi DHT terminato con successo" + +msgid "DHT key-offloading partially completed" +msgstr "Scarico chiavi DHT completato parzialmente" + +msgid "DHT values successfully offloaded" +msgstr "Valori DHT scaricati con successo" + +msgid "DHT incoming messages" +msgstr "Messaggi DHT in arrivo" + +msgid "DHT incoming messages with UDP-matching contact address" +msgstr "Messaggi DHT in arrivo con indirizzo di contatto UDP corrispondente" + +msgid "DHT incoming messages with contact address fixed" +msgstr "Messaggi DHT in arrivo con indirizzo di contatto aggiustato" + +msgid "DHT incoming messages from hostile addresses" +msgstr "Messaggi in arrivo da indirizzi ostili" + +msgid "DHT incoming messages with hostile contact address" +msgstr "Messaggi DHT in arrivo con indirizzo di contatto ostile" + +msgid "DHT RPC messages prepared" +msgstr "Messaggi RPC DHT preparati" + +msgid "DHT RPC messages cancelled" +msgstr "Messaggi RPC DHT cancellati" + +msgid "DHT RPC timed out" +msgstr "DPC DHT tempo scaduto" + +msgid "DHT RPC replies received" +msgstr "Risposte RPC DHT ricevute" + +msgid "DHT RPC replies with contact address fixed" +msgstr "Risposte RPC DHT con indirizzo di contatto aggiustato" + +msgid "DHT RPC late replies received" +msgstr "Risposte tardive RPC DHT ricevute" + +msgid "DHT RPC detected KUID mismatches on reply" +msgstr "Incongruenze KUID rilevate RPC DHT dopo risposta" + +msgid "DHT RPC recent nodes held" +msgstr "Nodi recenti RPC DHT mantenuti" + +msgid "DHT node verifications" +msgstr "Verifiche di nodo DHT" + +msgid "DHT publishing attempts" +msgstr "Tentativi di pubblicazione DHT" + +msgid "DHT publishing ended successfully (all roots)" +msgstr "Pubblicazione DHT conclusa con successo (tutte le radici)" + +msgid "DHT publishing partially completed (root subset only)" +msgstr "Pubblicazioni DHT parzialmente completate (solo sottogruppo radice)" + +msgid "DHT publishing ending with proper value presence" +msgstr "Pubblicazioni DHT completate con presenza di valore appropriato" + +msgid "DHT value republishing occurring too late (after expiry)" +msgstr "Ripubblicazione di valore DHT avvenuto troppo tardi (dopo scadenza)" + +msgid "DHT publishing to self" +msgstr "Pubblicazione DHT a se stesso" + +msgid "DHT background publishing completion attempts" +msgstr "Tentativi di completamento pubblicazione in background DHT" + +msgid "DHT background publishing completion showing improvements" +msgstr "" +"Completamento pubblicazione in background DHT che mostrano miglioramenti" + +msgid "DHT background publishing completion successful (all roots)" +msgstr "" +"Pubblicazione in background DHT completata con successo (tutte le radici)" + +msgid "DHT SHA1 data type collisions" +msgstr "Collisioni tipi dati SHA1 DHT" + +msgid "DHT lookup path passively protected against attack" +msgstr "Percorsi di ricerca DHT protetti passivamente contro attacchi" + +msgid "DHT lookup path actively protected against attack" +msgstr "Percorsi di ricerca DHT protetti attivamente contro attacchi" + +msgid "DHT alt-loc lookups issued" +msgstr "Ricerche DHT alt-loc eseguite" + +msgid "DHT push-proxy lookups issued" +msgstr "Ricerche DHT push-proxy eseguite" + +msgid "DHT successful alt-loc lookups" +msgstr "Ricerche DHT alt-loc riuscite" + +msgid "DHT successful push-proxy lookups" +msgstr "Ricerche DHT push-proxy riuscite" + +msgid "DHT successful node push-entry lookups" +msgstr "Ricerche DHT push-entry del nodo riuscite" + +msgid "DHT re-seeding of orphan downloads" +msgstr "Ri-semina DHT di download orfani" + +msgid "Digests computed on general statistics" +msgstr "Riassunti calcolati sulle statistiche generali" + +msgid "Digests computed on TCP statistics" +msgstr "Riassunti calcolati sulle statistiche TCP" + +msgid "Digests computed on UDP statistics" +msgstr "Riassunti calcolati sulle statistiche UDP" + +msgid "Ping" +msgstr "Ping" + +msgid "Pong" +msgstr "Pong" + +msgid "Bye" +msgstr "Bye" + +msgid "QRP" +msgstr "QRP" + +msgid "HSEP" +msgstr "HSEP" + +msgid "RUDP" +msgstr "RUDP" + +msgid "Vendor spec." +msgstr "Specifiche del programma" + +msgid "Vendor std." +msgstr "Standard del programma" + +msgid "Push" +msgstr "Push" + +msgid "Query" +msgstr "Query" + +msgid "Query hit" +msgstr "Tentativi query" + +msgid "DHT (truncated)" +msgstr "DHT (troncato)" + +msgid "DHT Ping" +msgstr "Ping DHT" + +msgid "DHT Pong" +msgstr "Pong DHT" + +msgid "DHT Store" +msgstr "Deposito DHT" + +msgid "DHT Store Ack" +msgstr "Deposito Ack DHT" + +msgid "DHT Find Node" +msgstr "Ricerca nodo DHT" + +msgid "DHT Found Node" +msgstr "Nodo trovato DHT" + +msgid "DHT Find Value" +msgstr "Cerca valore DHT" + +msgid "DHT Value" +msgstr "Valore DHT" + +msgid "G2 Crawl Request" +msgstr "Richiesta di crawl G2" + +msgid "G2 Hub Advertisement" +msgstr "Annuncio di Hub G2" + +msgid "G2 Hub List" +msgstr "Lista Hub G2" + +msgid "G2 Hub List Req" +msgstr "Richiesta lista Hub G2" + +msgid "G2 Hub List Ack" +msgstr "Risposta lista Hub G2" + +msgid "G2 Local Node Info" +msgstr "Informazioni nodo locale G2" + +msgid "G2 Ping" +msgstr "Ping G2" + +msgid "G2 Pong" +msgstr "Pong G2" + +msgid "G2 Push" +msgstr "Push G2" + +msgid "G2 Query Key Ack" +msgstr "Risposta chiave ricerca G2" + +msgid "G2 Query Key Req" +msgstr "Richiesta chiave ricerca G2" + +msgid "G2 Query" +msgstr "Ricerca G2" + +msgid "G2 Query Ack" +msgstr "Risposta ricerca G2" + +msgid "G2 Query Hit" +msgstr "Risultato ricerca G2" + +msgid "G2 Query Hash Table" +msgstr "Tavola Hash di ricerca G2" + +msgid "G2 User Profile Check" +msgstr "Controllo profilo utente G2" + +msgid "G2 User Profile Data" +msgstr "Dati di profilo utente G2" + +msgid "Total" +msgstr "Totale" + +msgid "Bad size" +msgstr "Dimensione errata" + +msgid "Too small" +msgstr "Troppo piccolo" + +msgid "Too large" +msgstr "Troppo grande" + +msgid "Way too large" +msgstr "Eccessivamente grande" + +msgid "Too old" +msgstr "Troppo vecchio" + +msgid "Unknown message type" +msgstr "Tipo di messaggio sconosciuto" + +msgid "Unexpected message" +msgstr "Messaggio inatteso" + +msgid "Message sent with TTL = 0" +msgstr "Messaggio inviato via TTL = 0" + +msgid "Improper hops/ttl combination" +msgstr "Combinazione salti/ttl impropria" + +msgid "Max TTL exceeded" +msgstr "Superato massimo TTL" + +msgid "Message throttle" +msgstr "Inibizione messaggio" + +msgid "Message matched limits" +msgstr "Limiti dei messaggi incontrato" + +msgid "Transient node" +msgstr "Noto transitorio" + +msgid "Unusable Pong" +msgstr "Pong inusabile" + +msgid "Hard TTL limit reached" +msgstr "Raggiunto il limite TTL hardware" + +msgid "Max hop count reached" +msgstr "Raggiunto il massimo del conteggio per salto" + +msgid "Route lost" +msgstr "Perso instradamento" + +msgid "No route" +msgstr "Nessun instradamento" + +msgid "Duplicate message" +msgstr "Duplica messaggio" + +msgid "OOB Proxy MUID Conflict" +msgstr "Conflitto MUID proxy OOB" + +msgid "Message to banned GUID" +msgstr "Messaggio ai GUID esclusi" + +msgid "Message from banned GUID" +msgstr "Messaggio da GUID esclusi" + +msgid "Node shutting down" +msgstr "Nodo in spegnimento" + +msgid "TX flow control" +msgstr "Controllo flusso in trasmissione" + +msgid "Query text had no trailing NUL" +msgstr "Il testo della query non ha NUL ripetuti" + +msgid "Query text too short" +msgstr "Testo query troppo breve" + +msgid "Query had unnecessary overhead" +msgstr "La query aveva una intestazione non necessaria" + +msgid "Query had bad URN" +msgstr "La ricerca aveva un cattivo URN" + +msgid "Message with malformed SHA1" +msgstr "Messaggio con SHA1 malformato" + +msgid "Message with malformed UTF-8" +msgstr "Messaggio con UTF-8 malformato" + +msgid "Malformed Query Hit" +msgstr "Tentativo di query malformata" + +msgid "Bad return address" +msgstr "Indirizzo di ritorno errato" + +msgid "Hostile IP address" +msgstr "Indirizzo IP ostile" + +msgid "Shunned IP address" +msgstr "Indirizzi IP evitati" + +msgid "Bogus result from Morpheus" +msgstr "Risultati fasulli da Morpheus" + +msgid "Spam" +msgstr "Spam" + +msgid "Evil filename" +msgstr "Nome file malvagio" + +msgid "Improper media type" +msgstr "Tipo di media improprio" + +msgid "Payload inflating error" +msgstr "Errore nel riempire il carico" + +msgid "Unknown header flags present" +msgstr "Presenti flag di header sconosciuto" + +msgid "Own search results" +msgstr "Risultati di ricerca propri" + +msgid "Own queries" +msgstr "Ricerche proprie" + +msgid "Ancient query format" +msgstr "Formato query antico" + +msgid "Blank Servent ID" +msgstr "Identificativo servent vuoto" + +msgid "GUESS Query missing token" +msgstr "Elemento della richiesta GUESS mancante" + +msgid "GUESS Invalid query token" +msgstr "Elemento della richiesta GUESS non valido" + +msgid "DHT Invalid security token" +msgstr "Elemento di sicurezza DHT non valido" + +msgid "DHT Too many STORE requests" +msgstr "Troppe richieste STORE DHT" + +msgid "DHT Malformed message" +msgstr "Messaggio DHT malformato" + +msgid "G2 Unexpected message" +msgstr "Messaggio G2 inatteso" + +msgid "Cannot cross networks" +msgstr "Non posso incrociare le reti" + +msgid "No proxy" +msgstr "Nessun proxy" + +msgid "HTTP" +msgstr "HTTP" + +msgid "SOCKS v4" +msgstr "SOCKS v4" + +msgid "SOCKS v5" +msgstr "SOCKS v5" msgid "IPv4 only" msgstr "Solo IPv4" @@ -1042,44 +2243,38 @@ msgid "leaf node" msgstr "nodo foglia" -#, fuzzy msgid "none" -msgstr "nodo" +msgstr "nessuno" msgid "input only" -msgstr "" +msgstr "solo input" msgid "output only" -msgstr "" +msgstr "solo output" msgid "input & output" -msgstr "" +msgstr "input & output" msgid "seeded" -msgstr "" +msgstr "disseminato" msgid "own KUID lookup" -msgstr "" +msgstr "Ricerca del proprio KUID" -#, fuzzy msgid "completing" -msgstr "Completati" +msgstr "in completamento" -#, fuzzy msgid "completed" -msgstr "Completati" +msgstr "completato" -#, fuzzy msgid "shutdown" -msgstr "Spegnimento (%s)" +msgstr "chiusura" -#, fuzzy msgid "active (recommended)" -msgstr "auto (raccomandato)" +msgstr "attivo (raccomandato)" -#, fuzzy msgid "passive" -msgstr " passivi)" +msgstr "passivo" msgid "Indicates whether the hostcache file is being read." msgstr "Indica se sta per essere letto il file di cache dell'host." @@ -1095,10 +2290,10 @@ "features." msgstr "" "Indica che gtk-gnutella considera molto vecchia questa versione. Dovresti " -"aggiornarla il prima possibile per evitare di sperimentare condizioni non " -"ottimali del supporto Gnutella che non solo può danneggiare le tue " -"possibilità di ricerca e di scaricamento ma anche incrinare la rete in " -"quanto ti mancano nuove funzionalità." +"aggiornarla il prima possibile per evitare di sperimentare condizioni di " +"supporto Gnutella non ottimali che non solo possono danneggiare le tue " +"possibilità di ricerca e di scaricamento ma anche la stessa rete in quanto " +"ti mancano nuove funzionalità." msgid "" "gtk-gnutella found a newer version on the Gnet and gives information about " @@ -1115,9 +2310,9 @@ "provide decent range for searches." msgstr "" "Cerca di mantenere come minimo questo numero di connessioni agli altri " -"server dello stesso tipo del nostro (normali o ultra-nodi). Per consentire " -"connessioni in ingresso, questo dovrebbe essere inferiore al numero massimo " -"delle connessioni. Tenere presente che il TTL predefinito per Gnutella è 4 e " +"servent del nostro stesso tipo (normali o ultra-nodi). Questo dovrebbe " +"essere inferiore al numero massimo di connessioni per consentire connessione " +"in ingresso. Tenere presente che il TTL predefinito per Gnutella è 4 e " "quindi questo deve essere maggiore di 30 per consentire delle possibilità di " "ricerca decenti." @@ -1126,22 +2321,21 @@ "normal servents. This should be smaller than the maximum amount of " "connections to allow incoming connections." msgstr "" -"Cerca di mantenere come minimo questo numero di connessioni ai server " +"Cerca di mantenere come minimo questo numero di connessioni ai servent " "normali quando si è in modalità ultrapeer. Per consentire connessioni in " "ingresso, questo dovrebbe essere inferiore al numero massimo delle " "connessioni." -#, fuzzy msgid "" "Don't allow more than this number of connections to other servents. As a " "rule of thumb you should reserve 256 b/s bandwidth per connection. Never use " "up all your bandwidth, leave a little space for TCP/IP overhead. It's not " "advisable that you set this to a value smaller than 40." msgstr "" -"Non consentire un numero superiore a questo di connessioni agli altri " -"server. Come regola base si dovrebbero riservare 256 b/s a connessione. Non " -"usare mai tutta la banda a disposizione, lasciare una piccola quantità per " -"il carico TCP/IP. Non è consigliabile impostare questo valore inferiore a 30." +"Non permettere più di questo numero di connessioni verso altri servent. Come " +"regola dovresti riservare 256 b/s di banda per ciascuna connessione. Non " +"usare mai tutta la tua banda, lasciane un po' per l'overhead TCP/IP. Non è " +"consigliabile impostarlo a un valore inferiore a 40." msgid "Number of leaf nodes currently connected." msgstr "Numero di nodi foglia attualmente connessi." @@ -1156,8 +2350,8 @@ "Don't start more than this number of parallel downloads. Others will remain " "in the queue waiting for a download slot." msgstr "" -"Non avviare un numero maggiore di questo di scaricamenti paralleli. Gli " -"altri rimangono in coda in attesa di uno spazio di scaricamento." +"Non avviare un numero di scaricamenti paralleli maggiore di questo. Gli " +"altri rimarranno in coda in attesa di una posizione di download." msgid "" "Don't make more connections than given here to a single host to download a " @@ -1181,37 +2375,30 @@ "Non caricare da un singolo host in parallelo un numero di file maggiore di " "questo." -#, fuzzy msgid "Local IPv4 address last determined." -msgstr "Ultimo indirizzo IP locale determinato." +msgstr "Indirizzo IPv4 locale ultimo determinato." -#, fuzzy msgid "Local IPv6 address last determined." -msgstr "Ultimo indirizzo IP locale determinato." +msgstr "Indirizzo IPv6 locale ultimo determinato." -#, fuzzy msgid "When the current IPv4 address was determined." -msgstr "Quando è stato determinato l'indirizzo IP locale." +msgstr "Quando l'indirizzo IPv4 corrente è stato determinato." -#, fuzzy msgid "When the current IPv6 address was determined." -msgstr "Quando è stato determinato l'indirizzo IP locale." +msgstr "Quando l'indirizzo IPv6 corrente è stato determinato." -#, fuzzy msgid "Average uptime with the same IPv4 address." -msgstr "Media tempo di funzionamento con il medesimo indirizzo IP." +msgstr "Tempo medio di attività con lo stesso indirizzo IPv4." -#, fuzzy msgid "Average uptime with the same IPv6 address." -msgstr "Media tempo di funzionamento con il medesimo indirizzo IP." +msgstr "Tempo medio di attività con lo stesso indirizzo IPv6." msgid "Timestamp at which servent was started." -msgstr "Ora di avvio del server." +msgstr "Ora di avvio del servent." msgid "Average servent uptime." -msgstr "Media tempo di funzionamento del server." +msgstr "Media tempo di funzionamento del servent." -#, fuzzy msgid "" "Local TCP port gtk-gnutella is listening on. ISPs often block or throttle " "traffic on TCP port 6346 so it is a good idea to change it to something in " @@ -1219,24 +2406,23 @@ "forwarding / opening, as necessary. Note that by default, the TCP port 6346 " "is not used to guard against undue censorship." msgstr "" -"La porta locale su cui gtk-gnutella è in ascolto. L'ISP può bloccare o " -"fermare il traffico sulla porta TCP 6346 e quindi può essere una buona idea " -"quella di cambiarla con una nell'intervallo 1024-65535. Non dimenticare, se " -"necessario, di aggiornare l'apertura e l'inoltro delle porte del firewall. " -"Notare che l'impostazione predefinita è che la porta 6346 non viene " -"utilizzata per ovviare a una eccessiva censura." +"Porta locale TCP in cui gtk-gnutella è in ascolto. I provider spesso " +"bloccano o inibiscono il traffico sulla port 6346 per cui è una buona idea " +"sceglierne un'altra nel range 1024-65535. Non dimenticare di aggiornare il " +"port-forwanding o apertura della porta tuo firewall, se necessario. Nota che " +"di default la porta TCP 6346 non è usata come protezione verso censura " +"indebita." msgid "Use this IP address as source address if 'force local ip' is activated." msgstr "" "Utilizza questo indirizzo IP come indirizzo sorgente se l'opzione 'forza " "l'IP locale' è attivata." -#, fuzzy msgid "" "Use this IPv6 address as source address if 'force local ip' is activated." msgstr "" -"Utilizza questo indirizzo IP come indirizzo sorgente se l'opzione 'forza " -"l'IP locale' è attivata." +"Usa questo indirizzo IPv6 come indirizzo sorgente se 'forza ip locale' è " +"attivo." msgid "" "The connection bandwidth reported to other hosts. This is the speed at which " @@ -1254,12 +2440,12 @@ "the hardwired connection speed is not used." msgstr "" "Se la banda di connessione riportata agli altri host debba essere calcolata " -"sulla base dell'attuale velocità media di caricamento. La velocità riportata " -"è la velocità disponibile per un nuovo caricamento e non il massimo teorico " -"configurato: è la media della banda passante (o la velocità massima " -"configurata se non c'è ancora traffico) divisa per il numero di istanze di " -"caricamento. Quando è messa a ON (impostazione consigliata) la velocità di " -"connessione impostata (hardwired) non viene utilizzata." +"sulla base dell'attuale velocità media di upload. La velocità riportata è la " +"velocità disponibile per un nuovo upload e non il massimo teorico " +"configurato: è la media della banda (o la banda massima configurata se non " +"c'è ancora traffico) divisa per il numero di posizioni di upload. Quando è " +"messa a ON (impostazione consigliata) la velocità di connessione hardwired " +"non viene utilizzata." msgid "" "Return at most this number of results to a query, using as many query hit " @@ -1274,15 +2460,15 @@ "Unless this percentage or more of the upload bandwidth is used, allow " "additional upload slots." msgstr "" -"Se per i caricamenti viene superata questa percentuale di uso di banda " -"consenti l'apertura di ulteriori posizioni." +"Se per gli upload viene superata questa percentuale di uso di banda consenti " +"l'apertura di ulteriori posizioni." msgid "Number of seconds before a download connect attempt times out." msgstr "" "Numero di secondi prima che un tentativo di scaricamento venga interrotto." msgid "Number of seconds before a push request times out." -msgstr "Numero di secondi prima che una richiesta di spinta venga interrotta." +msgstr "Numero di secondi prima che una richiesta di push venga interrotta." msgid "Number of seconds before a download times out if no data is received." msgstr "" @@ -1345,7 +2531,7 @@ "get the whole HTTP request." msgstr "" "Numero di secondi prima di dare il timeout di caricamento quando non è " -"possibile stabilire una connessione durante una spinta. È anche il tempo " +"possibile stabilire una connessione durante un push. È anche il tempo " "massimo di attesa per ottenere l'intera richiesta HTTP." msgid "" @@ -1449,10 +2635,10 @@ "If you set it to too large a value, you run the risk of being trimmed down " "by fellow gtk-gnutella nodes, or kicked out by some other servent." msgstr "" -"Il TTL che utilizziamo nella generazione dei messaggi. Per Gnutella il " -"valore predefinito è TTL=4. Se si imposta un valore troppo grande si corre " -"il rischio di vederselo abbassato dai nodi gtk-gnutella successivi o esclusi " -"da qualche altro server." +"Il TTL che utilizziamo nei messaggi che generiamo. Per Gnutella il valore " +"predefinito è TTL=4. Se lo imposti a un valore troppo grande, corri il " +"rischio di averlo decurtato dagli altri nodi gtk-gnutella, o essere esclusi " +"da qualche altro servent." msgid "" "Maximum hard TTL limit (hops + TTL) on messages we relay. This should be " @@ -1481,7 +2667,7 @@ "CPU." msgid "Debug level for download mesh management." -msgstr "Livello di collaudo per la gestione del gruppo scarocato." +msgstr "Livello di collaudo per la gestione del download mesh." msgid "Debug level for Gnutella messages." msgstr "Livello di collaudo per i messaggi Gnutella." @@ -1490,73 +2676,73 @@ msgstr "Livello di collaudo per il codice condiviso dei file." msgid "Debug level for Gnutella nodes." -msgstr "" +msgstr "Livello di debug per i nodi Gnutella." msgid "Debug level for sockets." -msgstr "" +msgstr "Livello di debug per i socket." msgid "Debug level for bootstrapping into the network." -msgstr "" +msgstr "Livello di debug per entrare nella rete." msgid "Debug level for HTTP code." -msgstr "" +msgstr "Livello di debug per codice HTTP." msgid "Debug level for downloads." -msgstr "" +msgstr "Livello di debug per i download." msgid "Debug level for fileinfo." -msgstr "" +msgstr "Livello di debug per fileinfo." msgid "Debug level for uploads." -msgstr "" +msgstr "Livello di debug per gli upload." msgid "Debug level for code shared between gui and core." msgstr "" - -msgid "Verbosity of Bitzi related debug messages." -msgstr "" +"Livello di debug per il codice condiviso tra interfaccia grafica e core." msgid "Verbosity of URL handling related debug messages." -msgstr "" +msgstr "Verbosità della gestione URL correlata ai messaggi di debug." msgid "Debug level for dynamic query hit routing." msgstr "" +"Livello di debug per il routing delle risposte delle ricerche dinamiche." msgid "Debug level for dynamic queries." -msgstr "" +msgstr "Livello di debug per ricerche dinamiche." msgid "Debug level for vendor messages." -msgstr "" +msgstr "Livello di debug per i messaggi del programma." msgid "Debug level for queries." -msgstr "" +msgstr "Livello di debug per le ricerche." msgid "Debug level for searches and search results management." msgstr "" +"Livello di debug per le ricerche e gestione dei risultati della ricerca." msgid "Debug level for the UDP traffic layer." -msgstr "" +msgstr "Livello di debug per il livello di traffico UDP" msgid "Debug level for the Query Routing Protocol." -msgstr "" +msgstr "Livello di debug per il Query Routing Protocol." msgid "Debug level for message routing." -msgstr "" +msgstr "Livello di debug per il routing dei messaggi." msgid "Debug level for GGEP." -msgstr "" +msgstr "Livello di debug per GGEP." msgid "Debug level for pong caching." -msgstr "" +msgstr "Livello di debug per caching dei pong." msgid "Debug level for HSEP." -msgstr "" +msgstr "Livello di debug per HSEP." msgid "Debug level for TLS." -msgstr "" +msgstr "Livello di debug per TLS." msgid "Debug level for PARQ." -msgstr "" +msgstr "Livello di debug per PARQ." msgid "" "If set, PARQ will calculate its ETA and retry times more optimistically. If " @@ -1597,7 +2783,6 @@ "file. Impostare a 0 per disabilitare questa funzionalità di sorpasso basata " "sul tempo." -#, fuzzy msgid "" "Ban the client if it violates the Retry-After interval too often. Set this " "to 0 to disable the banning. The upload will be removed from the queue in " @@ -1605,17 +2790,17 @@ "soon 10 times, which is a good balance between abuse and legacy client " "support." msgstr "" -"Caccia il client se non onora l'intervallo Riprova-Dopo altrettanto spesso. " -"Impostare a 0 per disattivare la cacciata (ma il caricamento è ancora " -"rimosso dalla coda). Il valore predefinito è 1 così il client è cacciato " -"dopo una sola riprova." +"Escludi il client se viola l'intervallo Riprova-Dopo troppo spesso. Imposta " +"questo a 0 per disabilitare l'esclusione. L'upload sarò rimosso dalla coda " +"in ogni caso. Il valore di default è 10, per cui il client è escluso dopo " +"aver riprovato troppo presto per 10 volte, un buon compromesso tra abuso e " +"supporto dei vecchi client." -msgid "For development use: track properties." -msgstr "Per lo sviluppo: traccia proprietà." +msgid "Indicates a kernel network buffer shortage." +msgstr "Indica carenza del buffer di rete del kernel." -#, fuzzy msgid "For development use: don't add new hosts to the host cache." -msgstr "Per lo sviluppo: non aggiungere nuovi host alla ricerca di host." +msgstr "Solo per sviluppo: non aggiungere nuovi host alla host cache." msgid "Enable bandwidth limitation for incoming HTTP traffic." msgstr "Abilita limitazione della banda per il traffico HTTP in ingresso." @@ -1664,9 +2849,8 @@ "Ripulisci automaticamente gli scaricamenti non disponibili (timeout delle " "connessioni, perdita instradamenti, ecc..)" -#, fuzzy msgid "Auto clear finished downloads" -msgstr "Ripulisci automaticamente gli scaricamenti fermati" +msgstr "Rimuovi automaticamente i download completati" msgid "Remove downloaded files from the search result." msgstr "Rimuovi i file scaricati dai risultati della ricerca." @@ -1674,17 +2858,18 @@ msgid "Enable to use forced_local_ip as local ip." msgstr "Abilita l'uso come ip locale (forced_local_ip)" -#, fuzzy msgid "Enable to use forced_local_ip6 as local ip." -msgstr "Abilita l'uso come ip locale (forced_local_ip)" +msgstr "Attiva l'uso forced_local_ip6 come ip locale." msgid "" "If 'forced_local_ip' is enabled, bind the socket to the forced IP address." msgstr "" +"Se 'forced_local_ip' è attivato, lega il socket all'indirizzo IP forzato." msgid "" "If 'forced_local_ip6' is enabled, bind the socket to the forced IP address." msgstr "" +"Se 'forced_local_ip6' è attivato, lega il socket all'indirizzo IP forzato." msgid "Try to connect to local networks first." msgstr "Prova a connettere prima le reti locali." @@ -1703,7 +2888,7 @@ "ISPs." msgstr "" "Spunta questo pulsante se desideri che gtk-gnutella usi il servizio IP TOS " -"per differenziare i dat interattivi, normali ed estesi. È probabilmente una " +"per differenziare i dati interattivi, normali ed estesi. È probabilmente una " "buona idea in molti casi e in particolare può essere d'aiuto con host mal-" "configurati, reti locali e ISP." @@ -1736,28 +2921,28 @@ msgid "Use an IPv6-to-IPv4 Transport Relay Translator asspecified by RFC 3142." msgstr "" +"Usa un IPv6-to-IPv4 Transport Relay Translator come specificato da RFC 3142." msgid "" "The IPv6 address prefix used by the IPv6-to-IPv4 Transport Relay Translator." msgstr "" +"Il prefisso di indirizzo IPv6 usato dal IPv6-to-IPv4 Transport Relay " +"Translator." msgid "Current number of hosts in regular node caches." msgstr "Numero attuale degli host nelle cache dei nodi regolari." -#, fuzzy msgid "Current number of IPv4 hosts in ultra node caches." -msgstr "Numero attuale degli host nelle cache degli ultra-nodi" +msgstr "Numero corrente di host IPv4 nella cache ultra nodi." msgid "Current number of hosts in bad node caches." msgstr "Numero attuale degli host nelle cache dei nodi errati." -#, fuzzy msgid "Maximum number of hosts in the regular node cache." -msgstr "Numero massimo degli host nel contenitore dei nodi regolari." +msgstr "Numero massimo di host nella cache dei nodi regolari." -#, fuzzy msgid "Maximum number of IPv4 hosts in the ultra node cache." -msgstr "Numero massimo degli host nel contenitore degli ultra-nodi" +msgstr "Numero massimo di host IPv4 nella cache ultra nodi." msgid "Maximum number of hosts in the BUSY, UNSTABLE and TIMEOUT lists." msgstr "Numero massimo degli host negli elenchi OCCUPATI, INSTABILI, SCADUTI" @@ -1843,6 +3028,16 @@ "will automatically cap the amount of tracked MUIDs to fit the queries it " "remembers for routing." msgstr "" +"Numero massimo di MUID di ricerca ritrasmessi da tracciare. Questo permette " +"di mappare i MUID di Query Hit al termine di ricerca originale e il " +"filtraggio del tipo di media al fine di evitare di ritrasmettere spam e " +"risultati scorrelati. Nel caso peggiore questo causa circa 300 bytes per " +"Query di dati in eccesso, ma in pratica sarà molto meno (dimensione minima " +"circa 40 bytes). Questo è usato solo quando in esecuzione come Ultrapeer. " +"Quando il valore specificato è più grande della quantità di messaggi che la " +"tavola di routing di Gnutella può tracciare, gtk-gnutella limiterà " +"automaticamente la quantità di MUID tracciati per rientrare nelle ricerche " +"che memorizza per il routing." msgid "" "Maximum size of unknown messages we allow, otherwise close the connection " @@ -1863,10 +3058,10 @@ "will never send push requests anyway. If you don't let gtk-gnutella send " "pushes, it will not show search results that would require a push." msgstr "" -"Se inviare o meno richieste di spinta. Comunque, Se si è dietro un\n" -"firewall, gtk-gnutella non potrà mai inviare richieste di spinta. Se\n" -"non si consente a gtk-gnutella di inviare richieste di spinta non\n" -"potrà mostrare i risultati delle ricerche che richiedono la spinta." +"Se inviare o meno richieste di push. Se si è dietro un firewall, gtk-" +"gnutella non potrà comunque inviare richieste di push. Se non si consente a " +"gtk-gnutella di inviare richieste di push, non verranno mostrati i risultati " +"delle ricerche che richiederebbero un push." msgid "" "Minimum amount of dup messages to enable kicking, per node (also see " @@ -1944,9 +3139,8 @@ msgid "Number of running uploads." msgstr "Numero di caricamenti in atto." -#, fuzzy msgid "Number of quick uploads currently running." -msgstr "Numero di ultra nodi attualmente connessi." +msgstr "Numero di caricamenti rapidi in corso." msgid "Number of registered (pending) uploads." msgstr "Numero di caricamenti registrati (in attesa)." @@ -1957,9 +3151,8 @@ msgid "Global Unique IDentifier of this node." msgstr "Global Unique IDentifier di questo nodo." -#, fuzzy msgid "Kademlia Unique IDentifier of this node in the DHT." -msgstr "Global Unique IDentifier di questo nodo." +msgstr "Kademlia Unique IDentifier di questo nodo nel DHT" msgid "Whether or not to use swarming (recommended = YES)." msgstr "" @@ -1995,11 +3188,15 @@ "from the query hits that flow through our node. This looks for new entries " "for files we are sharing or already have in our mesh." msgstr "" +"Se contribuire automaticamente al download mesh tramite i dati ottenuti " +"dalle query hits che fluiscono attraverso il nostro nodo. Questo cerca cerca " +"nuove corrispondenze per file che stiamo condividendo o che già sono nel " +"nostro gruppo." msgid "" "When enabled, SHA1s must match. Otherwise, name and size will be sufficient." msgstr "" -"Se attivato l'SHA1 deve corrispondere, altrimenti sono sufficenti il nome e " +"Se attivato l'SHA1 deve corrispondere, altrimenti sono sufficienti il nome e " "la dimensione." msgid "Whether gtk-gnutella thinks you're currently firewalled, TCP-wise." @@ -2108,10 +3305,10 @@ msgid "" "Maximum amount of leaves we can accept. To be promoted Ultra, you should " -"reserve 32 bytes of bandwidth per leaf." +"reserve 32 bytes/sec of bandwidth per leaf." msgstr "" -"Numero massimo di foglie da accettare. Per promuoverle a ultra si devono " -"riservare 32 byte di banda per ciascuna foglia." +"Numero massimo di foglie che possiamo accettare. Per essere promosso " +"Ultrapeer, devi riservare 32 bytes/sec di banda per ogni foglia." msgid "What to do with files that will be ignored for downloading." msgstr "Cosa fare con i file che saranno ignorati nello scaricamento." @@ -2163,8 +3360,8 @@ "How many queued downloads are currently responsive (remote servent answering " "requests)." msgstr "" -"Quanti sono gli scaricamenti che rispondono attualmente accodati (server " -"remoto che risponde alle richieste)." +"Quanti download in coda sono al momento responsivi (servent remoto che " +"risponde alle richieste)." msgid "Amount of bytes downloaded so far, HTTP headers notwithstanding." msgstr "Numero di byte scaricati sinora, nonostante le informazioni HTTP." @@ -2191,7 +3388,7 @@ "of data that should be continuously downloaded at the beginning of the " "file. Don't set it too large." msgstr "" -"Quando è abilitata la condivisione parziale dei file (PFSP), gtk-gnutella " +"Quando è abilitata la condivisione di file parziali (PFSP), gtk-gnutella " "cercherà di scaricare pezzi in ordine sparso per massimizzare la copertura " "del file nella rete. Questo comunque rende impossibile la consultazione dei " "metadati (auditing: tipo file, anteprima, ecc...). Questo campo imposta la " @@ -2202,9 +3399,9 @@ "When partial file sharing (PFSP) is enabled, gtk-gnutella will not share " "partial files below this filesize. Don't set it too large." msgstr "" -"Quando è abilitata la condivisione parziale dei file (PFSP), gtk-gnutella " -"non condividerà file parziali al di sotto di questa dimensione. Non " -"impostarla troppo grande." +"Quando è abilitata la condivisione di file parziali (PFSP), gtk-gnutella non " +"condividerà file parziali al di sotto di questa dimensione. Non impostarla " +"troppo grande." msgid "Number of crawler visits during this session." msgstr "Numero di visite dei motori di ricerca durante questa sessione." @@ -2239,8 +3436,9 @@ "Whether gtk-gnutella should keep track of the IP of unstable servents it " "encounters, preventing further connections attempts to/from them." msgstr "" -"Se gtk-gnutella debba tenere traccia dei server instabili che incontra per " -"prevenire ulteriori tentativi di connessione da e per." +"Se gtk-gnutella debba tenere traccia degli indirizzi IP dei servent " +"instabili che incontra, al fine di prevenire ulteriori tentativi di " +"connessione da e verso di loro." msgid "" "Whether gtk-gnutella should determine the servent types (as identified by " @@ -2248,10 +3446,10 @@ "from them. This only works when gtk-gnutella already keeps track of " "unstable IP addresses." msgstr "" -"Se gtk-gnutella debba determinare il tipo dei server instabili " -"(identificandoli tramite la stringa dell'offerente) per prevenire ulteriori " -"tentativi di connessione da e per. Questo funziona solamente se gtk-gnutella " -"tiene già traccia degli indirizzi IP instabili." +"Se gtk-gnutella debba determinare il tipo di servent (identificati tramite " +"la stringa del programma) instabili, prevenendo ulteriori connessione verso " +"e da loro. Questo funziona solo se gtk-gnutella tiene già traccia degli " +"indirizzi IP instabili." msgid "" "Whether gtk-gnutella should automatically remove the file whenever it gets a " @@ -2302,9 +3500,8 @@ "gnutella." msgid "Maximum percentage of slots a vendor can occupy." -msgstr "Percentuale massima di posizioni che un offerente può occupare." +msgstr "Percentuale massima di posizioni che un programma può occupare." -#, fuzzy msgid "" "Size of the RX socket buffer to be used for downloads, in kibibytes. If you " "wish to avoid Gnutella downloads using up all your bandwidth, set it to a " @@ -2313,13 +3510,13 @@ "greater value. Remember: the smaller the value, the more you will be able to " "precisely control the incoming rate." msgstr "" -"Dimensione del contenitore (buffer) di ricezione RX da usare per gli " -"scaricamenti, in kbyte. Se si vuol evitare che, quando Gnutella scarica, " -"utilizzi l'intera banda passante, impostarlo a un valore basso " -"(l'impostazione predefinita è 64K che va bene). Se non ha importanza che " -"venga usata tutta la banda, aumentando la latenza della connessione, " -"impostarlo a un valore maggiore. Ricordare: più il valore è piccolo più si è " -"in grado di controllare con precisione il tasso in entrata." +"Dimensione del buffer del socket RX da usare per i download, in kibibytes. " +"Se volete evitare che i download di Gnutella utilizzino tutta la vostra " +"banda, impostatelo a un valore basso (il default è 64K, che va bene). Se non " +"vi importa che venga utilizzata tutta la banda disponibile, aumentando la " +"latenza della connessione, impostatelo a un valore più alto. Ricordate: " +"minore il valore, più sarete in grado di controllare con precisione la " +"velocità in arrivo." msgid "" "Size of the RX socket buffer to be used for nodes, in kbytes. The lower the " @@ -2334,6 +3531,8 @@ msgid "Size of the TX socket buffer to be used for uploads, in kibibytes." msgstr "" +"Dimensione del buffer del socket di trasmissione da usare per gli upload, in " +"kibibytes" msgid "" "Average recent latency between the sending of the HTTP request and the " @@ -2402,11 +3601,8 @@ "Se è stato raggiunto il requisito della banda passante per diventare un " "ultra-nodo." -#, fuzzy msgid "Whether we meet the UDP requirements to become an Ultra node." -msgstr "" -"Se è stato raggiunto il requisito della quantità di memoria per diventare un " -"ultra-nodo." +msgstr "Se rispondiamo ai requisiti UDP per diventare un Ultra nodo." msgid "" "Size of the search queue holding the locally generated queries before they " @@ -2439,6 +3635,8 @@ "Amount of seconds until an idle remote shell session gets disconnected. If " "set to zero, no timeout occurs." msgstr "" +"Numero di secondi finché una sessione shell remota inattiva viene " +"disconnessa. Se pari a zero il tempo non scade." msgid "" "Amount of seconds to leave 'dead' entries around so that they can still be " @@ -2454,11 +3652,12 @@ "neighbor. Dropped queries will be accounted for in the 'Message throttle' " "counter." msgstr "" -"Se gtk-gnutella debba monitorare attivamente le stringhe delle query con TTL " -"e conteggio dei salti e dei duplicati dei rilasci. Si applica solamente " +"Se gtk-gnutella debba monitorare attivamente le stringhe delle query con " +"TTL, il conteggio dei salti e abbandonare i duplicati. Si applica solamente " "quando non si sta funzionando come nodo foglia e solo per le query con " -"conteggio > 0, p.es.non dal nostro immediato vicino. Le query cadute saranno " -"conteggiate nel contatore 'messaggi soffocati'." +"conteggio dei salti > 0, per esempio non dal nostro immediato vicinato. Le " +"query abbandonate saranno tenute in considerazione nel contatore 'messaggi " +"inibiti'." msgid "" "Half the duration during which gtk-gnutella should remember the recently " @@ -2482,14 +3681,14 @@ "can lower the constraint significantly. Deviations from the default of 1700 " "have exponential effects on the network traffic." msgstr "" -"Il numero minimo di secondi da far trascorrere tra due query identiche " -"provenienti dai nodi foglia. Se la riproposizione è troppo anticipata questa " -"viene fatta cadere e messa nel contatore dei 'messaggi soffocati'. Una " -"riproposizione è troppo frequente è dannosa per la rete tuttavia dobbiamo " -"permettere una certa quantità di riproposizioni data dalla natura dinamica " -"delle connessioni Gnutella. Non si può disabilitare questo controllo ma si " -"può ridurre significativamente il vincolo. Scostamenti dal valore " -"predefinito di 1700 ha effetti esponenziali sul traffico di rete." +"Il numero minimo di secondi da far trascorrere tra due interrogazioni " +"identiche provenienti da nodi foglia. Se la nuova interrogazione è troppo " +"anticipata, questa viene fatta cadere e inclusa nel contatore dei 'messaggi " +"inibiti'. Interrogazioni troppo frequenti sono dannose per la rete, tuttavia " +"dobbiamo permettere una certa quantità di reinterrogazioni data la natura " +"dinamica delle connessioni Gnutella. Non puoi disabilitare questo controllo, " +"ma puoi ridurre significativamente il vincolo. Scostamenti dal valore " +"predefinito di 1700 hanno effetti esponenziali sul traffico di rete." msgid "Time at which we started the last scan of the library." msgstr "Ora di avvio dell'ultimo aggiornamento della libreria." @@ -2506,9 +3705,8 @@ msgid "Time spent indexing shared files." msgstr "Tempo richiesto dall'indicizzazione dei file condivisi." -#, fuzzy msgid "Memory used by the QRP tables" -msgstr "Numero di posizioni utilizzate nella nostra tabella QRP." +msgstr "Memoria utilizzata dalle tabelle QRP" msgid "Time at which we started query routing table generation." msgstr "" @@ -2538,12 +3736,14 @@ msgid "Percentage of hashing conflicts whilst inserting data in our QRP table." msgstr "" +"Percentuale di conflitti di hashing durante l'inserimento nella nostra " +"tavola QRP." msgid "Amount of hashed keywords in our QRP table." -msgstr "" +msgstr "Quantità di parole chiavi con hash nella nostra tavola QRP." msgid "Total raw size of the QRP table patch, in bytes." -msgstr "" +msgstr "Dimensione grezza della patch della tavola QRP, in bytes." msgid "Final QRP table patch length, after possible compression." msgstr "" @@ -2563,12 +3763,18 @@ "operations are still possible. The condition automatically clears itself " "after 10 minutes without any more shortage." msgstr "" +"Quando impostato, gtk-gnutella è a corto di descrittori di file, ma le " +"operazioni normali sono ancora possibili. La condizione si risolve " +"automaticamente dopo 10 minuti senza ulteriori carenze." msgid "" "When set, gtk-gnutella has run out of file descriptors, and operations are " "necessarily degraded, if not impossible. The condition automatically clears " "itself after 10 minutes past the last occurrence." msgstr "" +"Quando impostato, gtk-gnutella ha esaurito i descrittori di file e le " +"operazioni sono necessariamente problematiche, se non impossibili. Questa " +"condizione si risolve automaticamente dopo 10 minuti dopo l'ultimo evento." msgid "If set, spaces in filenames are replaced with underscores." msgstr "" @@ -2681,21 +3887,22 @@ msgid "" "If set to TRUE, the global hostiles.txt is used as well as the private " -"$GTK_GNUTELLA_DIR/hostiles.txt. This allows to separate your private ban " +"$GTK_GNUTELLA_DIR/hostiles.txt. This allows you to separate your private ban " "list from the global one distributed with gtk-gnutella." msgstr "" -"Se impostato a VERO viene utilizzato sia il file hostile.txt sia il file " -"$GTK_GNUTELLA_DIR/hostiles.txt. Questo consente di tenere separato il " -"proprio elenco di esclusioni privato da quello globale distribuito con Gtk-" -"Gnutella." +"Se impostato a VERO, il file hostiles.txt è usato insieme al " +"$GTK_GNUTELLA_DIR/hostiles.txt privato. Questo permette di separare la lista " +"privata di espulsi da quella globale distribuita con gtk-gnutella." msgid "If set to TRUE, SO_LINGER is used for sockets." -msgstr "" +msgstr "Se settato su VERO, SO_LINGER è usato per i socket." msgid "" "See the man page for tcp(7). This feature typically only available on Linux " "systems." msgstr "" +"Guarda la pagina di manuale per tcp(7). Questa caratteristica è tipicamente " +"disponibile solo sui sistemi Linux." msgid "If TRUE, other hosts can request a complete list of all shared files." msgstr "" @@ -2727,6 +3934,13 @@ "persists, GUI refreshing is reduced and background tasks (SHA1 computation, " "file moving) are slowed down." msgstr "" +"L'utilizzo medio della CPU indica overloading, per cui gtk-gnutella sta " +"riducendo il numero di processi non indispensabili da eseguire. Nota che " +"l'overloading può risultare dal fatto che gtk-gnutella non ottiene " +"abbastanza tempo di CPU a causa di un altro processo in competizione. " +"Durante la persitenza della condizione di overload, l'aggiornamento " +"dell'interfaccia grafica è ridotto e i compiti in background (calcolo SHA1, " +"spostamento file) sono rallentati." msgid "" "Amount of data per downloading source that gtk-gnutella will buffer before " @@ -2762,34 +3976,36 @@ "prefixes. If disabled, certain units, for example, filesizes will be " "displayed using the historical base2 convention with binary prefixes." msgstr "" +"Abilita questo se tutte le unità dovrebbero essere mostrate utilizzando il " +"sistema metrico con prefissi standard internazionali. Se disabilitato, " +"alcune unità, per esempio le dimensioni dei file, saranno mostrati con la " +"convenzione storica base2con prefissi binari." -#, fuzzy msgid "Debug level for Reliable UDP (RUDP) code." -msgstr "Livello di collaudo per il codice condiviso dei file." +msgstr "Livello di debug per codice Reliable UDP (RUDP)." -#, fuzzy msgid "Debug level for the Distributed Hash Table (DHT) code." -msgstr "Livello di collaudo per il codice condiviso dei file." +msgstr "Livello di debug per codice della Distributed Hash Table (DHT)." -#, fuzzy msgid "Debug level for the OOB-proxying of queries." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per l'OOB-proxying delle ricerche." msgid "" "If set gtk-gnutella also listens on a local (unix domain) socket which is " "located in ~/.gtk-gnutella/socket." msgstr "" +"Se impostato, gtk-gnutella ascolta anche su un socket locale (dominio unix) " +"posto in ~/.gtk-gnutella/socket." -#, fuzzy msgid "Don't start more than this number of parallel downloads per file." -msgstr "" -"Non caricare da un singolo host in parallelo un numero di file maggiore di " -"questo." +msgstr "Non avviare più di questo numero di download paralleli per file." msgid "" "If enabled, all received packets are dumped to $GTK_GNUTELLA_DIR/packets_rx." "dump." msgstr "" +"Se attivato, tutti i pacchetti ricevuti saranno inviati a $GTK_GNUTELLA_DIR/" +"packets_rx.dump." msgid "" "If enabled, queries are also matched against the directory names which are " @@ -2799,51 +4015,47 @@ "names do not expose confidential information. You have to initiate a rescan " "of the shared files before a change becomes fully effective." msgstr "" +"Se abilitato, le ricerche sono anche confrontate con il nome della directory " +"relativa a quella condivisa. Inoltre, queste verranno mostrate nei risultati " +"di ricerca. Questo è particolarmente utile se i nomi dei file condivisi sono " +"ambigui o senza significato senza sapere anche il nome della directory. " +"Naturalmente, accertarsi che i nomi delle directory non mostrino " +"informazioni riservate. E' necessario riavviare un nuovo scan dei file " +"condivisi prima che i cambiamenti diventino effettivi." -#, fuzzy msgid "Debug level for the shell." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per la shell." msgid "If larger than zero, no downloads are started." -msgstr "" +msgstr "Se maggiore di zero, nessun download viene avviato" -#, fuzzy msgid "Debug level for the search queue." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per la coda di ricerca" -#, fuzzy msgid "Debug level for push-proxy code." -msgstr "Livello di collaudo per il codice condiviso dei file." +msgstr "Livello di debug per il codice push-proxy." -#, fuzzy msgid "Number of THEX file requests received in this session." -msgstr "Numero di richieste di consultazione HTML ricevute in questa sessione." +msgstr "Numero di richieste file THEX ricevute in questa sessione." -#, fuzzy msgid "Number of THEX file requests fully served in this session." msgstr "" -"Numero di richieste di consultazione HTML completamente soddisfatte in " -"questa sessione." +"Numero di richieste file THEX pienamente soddisfatte in questa sessione" -#, fuzzy msgid "Debug level for Tigertree-related code." -msgstr "Livello di collaudo per il codice da scartare." +msgstr "Livello di debug per codice correlato al Tigertree." -#, fuzzy msgid "" "Whether gtk-gnutella is currently computing TTH of shared files in the " "background." msgstr "" -"gtk-gnutella sta attualmente calcolando l'SHA1 dei file condivisi in " -"background." +"Se gtk-gnutella sta calcolando in background il TTH dei file condivisi." -#, fuzzy msgid "" "Whether gtk-gnutella is currently verifying the TTH of downloaded files in " "the background." msgstr "" -"gtk-gnutella sta attualmente verificando l'SHA1 dei file scaricati in " -"background." +"Se gtk-gnutella sta verificando in background il TTH dei file scaricati." msgid "Maximum number of results to show in any search." msgstr "Massimo numero di risultati da mostrare in ogni ricerca." @@ -2854,58 +4066,64 @@ "consultazione host." msgid "Date of the latest SVN release." -msgstr "" +msgstr "Data dell'ultima release SVN." msgid "Revision of the latest SVN release." -msgstr "" +msgstr "Revisione dell'ultima release SVN." msgid "Signature of the latest SVN release notification." -msgstr "" +msgstr "Firma dell'ultima notifica di release SVN." -#, fuzzy msgid "Maximum number of hosts in the TLS node cache." -msgstr "Numero massimo degli host nel contenitore degli ultra-nodi" +msgstr "Numero massimo di host nella cache nodi TLS." -#, fuzzy msgid "Maximum time before removing hosts from the TLS cache." -msgstr "Numero massimo degli host nel contenitore degli ultra-nodi" +msgstr "Tempo massimo prima della rimozione host dalla cache TLS." msgid "" "If set to TRUE the tigertree root hash (TTH) can be discovered on the fly. " "Otherwise, the TTH is only accepted if provided by the user, for example, by " "a magnet link." msgstr "" +"Se impostato a VERO il Tigertree Root Hash (TTH) può essere scoperto al " +"volo. Altrimenti, il TTH è accettato solo se fornito dall'utente, per " +"esempio tramite magnet link." msgid "" "If set to TRUE, gtk-gnutella will turn on some hacks which, unfortunately, " "have to exist at all. The aim is to improve the overall downloading " "experience." msgstr "" +"Se impostato a VERO, gtk-gnutella attiverà alcuni trucchetti che, " +"sfortunatamente, sono indispensabili. Lo scopo è di migliorare l'esperienza " +"globale di download." -#, fuzzy msgid "Maximum number of hosts in the G2 node cache." -msgstr "Numero massimo degli host nel contenitore degli ultra-nodi" +msgstr "Numero massimo di host nella cache dei nodi G2." -#, fuzzy msgid "Maximum time before removing hosts from the G2 cache." -msgstr "Numero massimo degli host nel contenitore degli ultra-nodi" +msgstr "Tempo massimo prima di rimuovere host dalla cache G2." -#, fuzzy msgid "Debug level for management of G2-only hosts." -msgstr "Livello di collaudo per la gestione del gruppo scarocato." +msgstr "Livello di debug per la gestione di host solo-G2." msgid "" "Whether GTKG can switch among the several files waiting to be downloaded " "from a given server, when making a follow-up HTTP request. Turn it off only " "if you witness problems with a particular servent you're downloading from." msgstr "" +"Se gtk-gnutella può saltare tra i vari file che attendono di essere " +"scaricati da un certo server, mentre viene fatta una ulteriore richiesta " +"HTTP. Deselezionalo solo se riscontri problemi con un particolare servent da " +"cui stai scaricando." msgid "" "If set to TRUE, PARQ (Passive/Active Remote Queuing) is enabled. Do not " "disable unless you know what you are doing." msgstr "" +"Se impostato a VERO, il PARQ (Passive/Active Remote Queuing) è abilitato. " +"Non disabilitare a meno che non sappiate cosa state facendo." -#, fuzzy msgid "" "When partial file sharing (PFSP) is enabled, gtk-gnutella will strive to " "download chunks in a random order, to maximize the spreading of the file in " @@ -2915,40 +4133,43 @@ "tail of the file as soon as possible. Set it to 0 to disable any tail-" "downloading preference." msgstr "" -"Quando è abilitata la condivisione parziale dei file (PFSP), gtk-gnutella " -"cercherà di scaricare pezzi in ordine sparso per massimizzare la copertura " -"del file nella rete. Questo comunque rende impossibile la consultazione dei " -"metadati (auditing: tipo file, anteprima, ecc...). Questo campo imposta la " -"dimensione in byte del primo pezzo dei dati che deve essere permanentemente " -"scaricato come primo del file. Non impostarlo troppo grande." +"Quando la condivisione dei file parziali (PFSP) è abilitata, gtk-gnutella " +"cercherà di scaricare i pezzi in ordine casuale per massimizzare la " +"diffusione del file nella rete. Tuttavia, questo può rendere impossibile " +"l'anteprima del file, in quanto alcuni formati usano la parte finale per " +"ospitare meta-informazioni o indici di ricerca. GTKG cercherà di scaricare " +"la quantità specificata di dati alla fine del file il prima possibile. " +"Impostare a 0 per disabilitare il recupero preferenziale della coda del file." msgid "" "Whether GTKG should post-process filenames to remove consecutive '_' in the " "name, or extra '_' surrounding punctuation for instance, to make the name " "prettier." msgstr "" +"Se GTKG debba post-processare i nomi dei file per rimuovere '_' consecutivi " +"nel nome o '_' in eccesso in prossimità della punteggiatura, per esempio, " +"per rendere il nome più leggibile." msgid "" "Whether the Distributed Hash Table (DHT) should be enabled. The DHT allows " "you to resolve magnet: URIs and to easily locate alternate locations for " "files and push-proxies for firewalled hosts. It requires UDP support." msgstr "" +"Se la Distributed Hash Table (DHT) debba essere abilitata. La DHT permette " +"di tradurre i magnet URI, individuare facilmente locazioni alternative dei " +"file e i push-proxy per gli host dietro firewall. Richiede il supporto UDP." -#, fuzzy msgid "Debug level for the callout queue." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per la coda di callout." -#, fuzzy msgid "Debug level for DHT node lookups." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per ricerche DHT del nodo" -#, fuzzy msgid "Debug level for DHT key/value storage." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per lo stoccaggio di chiave/valore DHT." -#, fuzzy msgid "Debug level for DHT key/value publishing." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per la pubblicazione di chiave/valore DHT." msgid "" "Bandwidth hint for DHT user lookups, in bytes/sec. This is used both for " @@ -2957,6 +4178,11 @@ "less). The larger the numbers, the more values can be looked up " "concurrently, but the more bandwidth is used." msgstr "" +"Banda consigliata per le ricerche utente DHT, in bytes/sec. Questo è usato " +"per limitare pubblicazione e ricerca concorrenti. Il traffico avviene sul " +"socket UDP Gnutella. L'output deve essere minore dell'input (tra 3 e 5 volte " +"meno). Maggiori i numeri, più valori possono essere cercati " +"contemporaneamente, ma più banda è utilizzata." msgid "" "Bandwidth hint for DHT user lookups, in bytes/sec. This is used both for " @@ -2966,130 +4192,146 @@ "times). The larger the numbers the more values can be looked up " "concurrently, but the more bandwidth is used." msgstr "" +"Banda consigliata per le ricerche utente DHT, in bytes/sec. Questo è usato " +"per limitare pubblicazione e ricerca concorrenti. Il traffico avviene sul " +"socket UDP Gnutella e quindi non può essere realmente controllato. Le " +"necessità di input sono molto maggiori rispetto all'output per quanto " +"riguarda le ricerche (tra 3 e 5 volte). Maggiori i numeri, più valori " +"possono essere cercati contemporaneamente, ma più banda è utilizzata." msgid "" "Whether the GUID should be kept accross sessions. A sticky GUID can be " "helpful if you are firewalled and share files because the downloaders will " "be able to contact you again more easily when you come back online." msgstr "" +"Se il GUID debba essere mantenuto di sessione in sessione. Un GUID " +"permanente può essere utile se si è dietro firewall e si condividono file in " +"quanto chi scarica sarà in grado di contattarvi più facilmente quando " +"tornate online." msgid "" "Whether the KUID should be kept accross sessions. A sticky KUID is helpful " "for the DHT because it promotes routing table stability and ensures that " "closest nodes will keep mutual knowledge about each other" msgstr "" +"Se il KUID debba essere mantenuto di sessione in sessione. Un KUID " +"permanente è utile per il DHT in quanto promuove la stabilità della tavola " +"di routing e garantisce che i nodi più vicini mantengano una reciproca " +"conoscenza." -#, fuzzy msgid "Debug level for the DHT user lookup queue." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello debug per la coda di ricerca utente DHT." msgid "If TRUE, DHT storage uses memory instead of diskspace." -msgstr "" +msgstr "Se vero, il DHT utilizza memoria invece di spazio disco." msgid "Defines which download HTTP header exchanges should be traced." msgstr "" +"Definisce quale scambio intestazione HTTP del download debba essere " +"tracciato." msgid "Defines which upload HTTP header exchanges should be traced." msgstr "" +"Definisce quale scambio intestazione HTTP dell'upload debba essere tracciato." msgid "Defines which Gnutella header exchanges should be traced." -msgstr "" +msgstr "Definisce quale scambio intestazione Gnutella debba essere tracciato." msgid "Defines which push-proxy HTTP header exchanges should be traced." msgstr "" +"Definisce quale scambio intestazione push-proxy HTTP debba essere tracciato." msgid "" "Defines which HTTP header exchanges should be traced, other than downloads, " "uploads and push-proxy exchanges." msgstr "" +"Definisce quale scambio intestazione HTTP debba essere tracciato, a parte " +"download, upload e scambi push-proxy." -#, fuzzy msgid "Debug level for (generic) file verification code." -msgstr "Livello di collaudo per il codice condiviso dei file." +msgstr "Livello di debug per il codice di verifica file (generico)." msgid "" "Maximum number of hosts in the local address cache, which remembers the " "recent IP:port combinations we had." msgstr "" +"Numero massimo di host nella cache dell'indirizzo locale, che ricorda " +"l'ultima combinazione IP:porta che abbiamo avuto." msgid "" "Maximum time before removing hosts from the local address cache, which " "remembers the recent IP:port combinations we had." msgstr "" +"Tempo massimo prima di rimuovere gli host dalla cache dell'indirizzo locale, " +"che ricorda la combinazione recente IP:porta che avevamo." -#, fuzzy msgid "Debug level for management of local address cache." -msgstr "Livello di collaudo per la gestione del gruppo scarocato." +msgstr "Livello di debug per la gestione della cache dell'indirizzo locale." msgid "" "If enabled, all packets enqueued for transmission are dumped to " "$GTK_GNUTELLA_DIR/packets_tx.dump." msgstr "" +"Se abilitato, tutti i pacchetti in coda per la trasmissione sono inviati a " +"$GTK_GNUTELLA_DIR/packets_tx.dump." -#, fuzzy msgid "Debug level the TCP message queues" -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per la coda messaggi TCP" -#, fuzzy msgid "Debug level for the UDP message queue." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per la coda messaggi UDP" -#, fuzzy msgid "" "Maximum size of the UDP message queue (in bytes). Must be at least 150 " "percent of the maximum message size." msgstr "" -"Dimensione massima della coda di invio per i nodi (in byte). Dev'essere come " -"monimo il 150 per cento della dimensione massima del messaggio." +"Dimensione massima della coda messaggi UDP (in bytes). Deve essere almeno il " +"150 percento della dimensione massima del messaggio." -#, fuzzy msgid "Debug level for the management of the clock accuracy." -msgstr "Livello di collaudo per la gestione del gruppo scarocato." +msgstr "Livello di debug per la gestione dell'accuratezza dell'orologio." -#, fuzzy msgid "Debug level for the firewalled status management." -msgstr "Livello di collaudo per la gestione del gruppo scarocato." +msgstr "Livello di debug per la gestione dello stato del firewall." -#, fuzzy msgid "Debug level for host management." -msgstr "Livello di collaudo per la gestione del gruppo scarocato." +msgstr "Livello di debug per la gestione dell'host." -#, fuzzy msgid "Debug level for DHT root node caching." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per la cache del nodo radice DHT." msgid "Logged statistics level for code shared between GUI and core." -msgstr "" +msgstr "Livello statistiche loggate per il codice condiviso tra GUI e core." -#, c-format msgid "" "If TRUE, the spam SHA1 database is kept in memory. If FALSE, it is kept in a " "fast disk database, which saves a large amount of core memory and reduces " "the overall footprint, at the cost of an increased I/O level. However, the " -"DB cache has typically a 90% hit rate, so the actual overhead is barely " +"DB cache has a 90 percent hit rate, so the actual overhead is barely " "noticeable when running as an ultra node and should remain completely " "unnoticed when running as a leaf." msgstr "" +"Se VERO, il database SHA1 spam è mantenuto in memoria. Se FALSO, è mantenuto " +"in un database veloce su disco, che risparmia parecchia memoria core e " +"riduce il footprint globale, al costo di aumentato livello di I/O. Tuttavia, " +"la cache del database ha una hit rate del 90%, per cui l'overhead reale è " +"appena percepibile quando in esecuzione come ultra nodo e dovrebbe restare " +"completamente trascurabile quando in esecuzione come foglia." -#, fuzzy msgid "Debug level for spam detection." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per la rilevazione dello spam." -#, fuzzy msgid "Debug level for lockfile management." -msgstr "Livello di collaudo per la gestione del gruppo scarocato." +msgstr "Livello di debug per la gestione dl lockfile." -#, fuzzy msgid "Debug level for the zone-based memory allocator." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per l'allocatore di memoria basato su zona." -#, fuzzy msgid "Debug level for the pool-based memory allocator." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per l'allocatore di memoria basato sul pool." -#, fuzzy msgid "Debug level for the RX buffer allocator." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per l'allocatore del buffer RX." msgid "" "Whether the zone-based memory allocator should always keep the zones in " @@ -3099,91 +4341,81 @@ "lower. To further minimize the footprint, you can also set " "spam_lut_in_memory to FALSE." msgstr "" +"Se l'allocatore di memoria basata su zona dovrebbe sempre mantenere le zone " +"in modalità di recupero spazzatura, aumentando le possibilità di riottenere " +"zone libere dopo un allocation burst. Questo causa un lieve overhead della " +"CPU al tempo libero di blocco ma il footprint di memoria rimarrà molto " +"minore. Per ridurre ulteriormente il footprint, è possibile impostare a " +"FALSO spam_lut_in_memory." -#, fuzzy msgid "Debug level for the virtual memory manager." -msgstr "Livello di collaudo per i messaggi Gnutella." +msgstr "Livello di debug per il gestore della memoria virtuale." -#, fuzzy msgid "Debug level for final shutdown." -msgstr "Livello di collaudo per il codice condiviso dei file." +msgstr "Livello di debug per lo spegnimento finale." -#, fuzzy msgid "Country preferences" -msgstr "Preferenze" +msgstr "Opzioni nazione" -#, fuzzy msgid "Debug level for country limits." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per i limiti della nazione." -#, fuzzy msgid "Whether to log dropped Gnutella messages" -msgstr "Livello di collaudo per i messaggi Gnutella." +msgstr "Quando loggare messaggi Gnutella abbandonati" -#, fuzzy msgid "Debug level for whitelist management." -msgstr "Livello di collaudo per la gestione del gruppo scarocato." +msgstr "Livello di debug per la gestione della whitelist." -#, fuzzy msgid "Debug level for DHT token caching." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello debug per cache elementi DHT" -#, fuzzy msgid "Debug level for DHT publishing from Gnutella." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per la pubblicazione DHT da Gnutella." msgid "Defines which DHT messages should be traced." -msgstr "" +msgstr "Definisce quali messaggi DHT dovrebbero essere tracciati." -#, fuzzy msgid "Enable bandwidth limitation for outgoing DHT traffic." -msgstr "Abilita limitazione della banda per il traffico HTTP in uscita." +msgstr "Attiva i limiti di banda per il traffico DHT in uscita." msgid "" "Bandwidth limit for outgoing DHT traffic in bytes/sec. It is always pooled " "with the Gnutella UDP queue, regardless of whether bandwidth stealing is " "enabled, so that UDP queues can flush more quickly." msgstr "" +"Limite di banda per il traffico DHT in uscita in bytes/sec. E' sempre unito " +"alla coda UDP Gnutella, indipendentemente se è attivo il furto di banda, " +"così che le code UDP possono esaurirsi più rapidamente." -#, fuzzy msgid "Maximum size of the DHT message queue (in bytes)." -msgstr "" -"Dimensione massima dei messaggi di risposta alle ricerche inoltrate agli " -"altri (in byte)." +msgstr "Dimensione massima della coda messaggi DHT (in bytes)." -#, fuzzy msgid "Debug level for bandwidth scheduler." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per il programmatore di banda." -#, fuzzy msgid "Debug level for the DHT stable node recorder." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per il registratore di nodi stabili DHT." -#, fuzzy msgid "Debug level for the file (re)loading, on change." -msgstr "Livello di collaudo per il codice condiviso dei file." +msgstr "Livello di debug per (ri)caricare i file a seguito di cambiamenti." -#, fuzzy msgid "Debug level for the file moving, accross filesystems." -msgstr "Livello di collaudo per il codice condiviso dei file." +msgstr "Livello di debug per lo spostamento file tra filesystem." -#, fuzzy msgid "Debug level for query hit message generation." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per la generazione di messaggi query hit." -#, fuzzy msgid "Debug level for version management." -msgstr "Livello di collaudo per la gestione del gruppo scarocato." +msgstr "Livello di debug per la gestione versione." msgid "Minimum CPU frequency, in Hz." -msgstr "" +msgstr "Frequenza CPU minima in Hz." msgid "Maximum CPU frequency, in Hz." -msgstr "" +msgstr "Frequenza CPU massima in Hz." -#, fuzzy msgid "DHT bootstrap status." -msgstr "statistiche traffico _HTTP" +msgstr "Stato inizializzazione DHT." msgid "" "The DHT running mode. An active node will be able to store values and is a " @@ -3194,51 +4426,54 @@ "recommended because the DHT requires far more active nodes that passive ones " "to be efficient." msgstr "" +"La modalità di esecuzione del DHT. Un nodo attivo sarà in grado di " +"immagazzinare valori ed è un membro completamente partecipe della " +"Distributed Hash Table. Un nodo passivo può effettuare lookup e pubblicare " +"ma non può immagazzinare valori e non può essere un membro della struttura " +"DHT. Un nodo dietro firewall è necessariamente passivo, ma la modalità " +"passiva può essere forzata anche se non si è dietro firewall, sebbene ciò " +"non sia raccomandato in quanto il DHT richiede che siano efficienti molti " +"più nodi attivi che passivi." msgid "Current DHT running mode." -msgstr "" +msgstr "Modalità di esecuzione attuale del DHT." -#, fuzzy msgid "Debug level for the one-time memory allocator." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per l'allocatore di memoria one-time." -#, fuzzy msgid "Debug level for the host cache." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per la host cache." msgid "Random bits." -msgstr "" +msgstr "Bit casuali." -#, fuzzy msgid "Average servent downtime." -msgstr "Media tempo di funzionamento del server." +msgstr "Tempo di inattività medio del servent." msgid "Time when last shutdown occurred." -msgstr "" +msgstr "Quando è avvenuto l'ultimo spegnimento." -#, fuzzy msgid "Debug level for alive pings." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per i ping alive." -#, fuzzy msgid "Debug level for the versatile XML layer." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per i layer XML versatili." -#, fuzzy msgid "Debug level for the UPnP layer." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per il layer UPnP" -#, fuzzy msgid "Debug level for the SOAP layer." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per il layer SOAP." msgid "Defines SOAP exchanges tracing type." -msgstr "" +msgstr "Definisce il tipo di tracciamento degli scambi SOAP." msgid "" "For testing purposes, allow to run as an ultranode even if the node cannot " "accept incoming TCP connections." msgstr "" +"A scopo di test, permette l'esecuzione in modalità ultra nodo anche se il " +"nodo non può accettare connessione TCP in ingresso." msgid "" "Whether UPnP (Universal Plug and Play) should be enabled. Support for UPnP " @@ -3249,23 +4484,33 @@ "network equipment manually to prevent the firewalled condition for both TCP " "and UDP." msgstr "" +"Se attivare UPnP (Universal Plug and Play). Il supporto UPnP significa che " +"gtk-gnutella sarà in grado di identificare il proprio Internet Gateway " +"Device (router) e richiedere l'apertura della porta in ingresso " +"indirizzandola alla propria macchina, per essere certi di non rimanere " +"dietro firewall. Di default dovreste lasciarlo abilitato a meno che non " +"sappiate configurare manualmente la rete per evitare che i pacchetti TCP e " +"UDP rimangano bloccati dal firewall." msgid "" "Whether gtk-gnutella was able to locate an Internet Gateway Device to " "install port mappings, if required." msgstr "" +"Se gtk-gnutella sia in grado di localizzare un Internet Gateway Device per " +"installare il mappaggio porte, se richiesto." msgid "" "Whether gtk-gnutella thinks it needs to install port mappings on your " "network router to avoid the firewalled condition." msgstr "" +"Se gtk-gnutella ritiene necessario installare il port mapping sul proprio " +"router per evitare di restare bloccati dal firewall." msgid "Whether gtk-gnutella can install port mappings, if needed." -msgstr "" +msgstr "Se gtk-gnutella può installare il port mapping in caso di necessità." -#, fuzzy msgid "Debug level for the NAT-PMP layer." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per il layer NAT-PMP." msgid "" "Whether NAT-PMP (NAT Port Mapping Protocol) should be enabled. Support for " @@ -3276,54 +4521,56 @@ "you know how to configure your network equipment manually to prevent the " "firewalled condition for both TCP and UDP." msgstr "" +"Se abilitare il NAT-PMP (NAT Port Mapping Protocol). Il supporto NAT-PMP " +"significa che gtk-gnutella sarà in grado di capire se il gateway di default " +"(router) supporta il PMP per garantire un redirezionamento trasparente delle " +"porte esterne del router verso la macchina locale, accertandosi che non ci " +"si trovi dietro firewall. Di default è meglio lasciarlo abilitato ameno che " +"non sappiate come configurare la rete per evitare che i pacchetti TCP e UDP " +"rimangano bloccati dal firewall." msgid "" "Whether gtk-gnutella was able to locate a NAT-PMP gateway to install port " "mappings, if required." msgstr "" +"Se gtk-gnutella sia capace di localizzare un gateway NAP-PMP per installare " +"il port mapping, se necessario." -#, fuzzy msgid "Debug level for the TX (transmit) network layer." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per il layer di rete di trasmissione (TX)." -#, fuzzy msgid "Debug level for the RX (receive) network layer." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per il layer di rete di ricezione (RX)." -#, fuzzy msgid "Debug level for the I/O input event layer." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per il layer di eventi input I/O." -#, fuzzy msgid "Debug level for the background task scheduler." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per il programmatore compiti in background." -#, fuzzy msgid "Whether gtk-gnutella was able to configure port mappings." -msgstr "gtk-gnutella crede di essere connesso ad internet." +msgstr "Se gtk-gnutella sia in grado di configurare il port mapping." -#, fuzzy msgid "Whether gtk-gnutella disabled HTTP bandwidth stealing." -msgstr "gtk-gnutella crede di essere connesso ad internet." +msgstr "Se gtk-gnutella debba disabilitare il furto banda HTTP." -#, fuzzy msgid "Whether gtk-gnutella ignores HTTP stolen bandwidth." -msgstr "gtk-gnutella crede di essere connesso ad internet." +msgstr "Se gtk-gnutella debba ignorare la banda rubata HTTP." msgid "Whether gtk-gnutella enforces uniform HTTP outgoing bandwidth." -msgstr "" +msgstr "Se gtk-gnutella debba imporre una banda uscente HTTP uniforme." -#, fuzzy msgid "" "Whether gtk-gnutella should use HTTP request pipelining when possible, in " "order to decrease downloading latency." msgstr "" -"Se gtk-gnutella debba comunicare il nome host del server a chi scarica e ai " -"tentativi di query." +"Se gtk-gnutella debba inviare più richieste HTTP in parallelo quando " +"possibile, per ridurre la latenza del download." -#, fuzzy msgid "Maximum chunk size when swarming with HTTP pipelining." -msgstr "Dimensione massima dei pezzi della frammentazione" +msgstr "" +"Dimensione massima del pezzo durante frammentazione con traffico HTTP " +"parallelo." msgid "" "Whether the Gnutella UDP Extension for Scalable Searches (GUESS) should be " @@ -3334,42 +4581,51 @@ "enabled as well as this setting only governs mostly the server-side of GUESS " "(required to allow the client-side)." msgstr "" +"Se abilitare l'estensione UDP per ricerche scalabili (GUESS). Con " +"l'attivazione di GUESS, gtk-gnutella offre alla rete l'abilità di effettuare " +"ricerche Ultrapeer ripetute al posto della semplice trasmissione, " +"permettendo ricerche più approfondite nella rete Gnutella. Se si desidera " +"effettuare ricerche GUESS, occorre verificare che anche il lato client sia " +"attivo, dal momento che questo settaggio controlla solo il lato server di " +"GUESS (necessario per permettere il lato client)." msgid "" "Debug level for server-side GUESS (Gnutella UDP Extension for Scalable " "Searches)." msgstr "" +"Livello di debug per il GUESS (estensione Gnutella per ricerche scalabili) " +"lato server." msgid "" "Debug level for client-side GUESS (Gnutella UDP Extension for Scalable " "Searches)." msgstr "" +"Livello di debug per il GUESS (estensione Gnutella per ricerche scalabili) " +"lato client." -#, fuzzy msgid "Maximum number of IPv4 hosts in the regular GUESS cache." -msgstr "Numero massimo degli host nel contenitore dei nodi regolari." +msgstr "Numero massimo di host IPv4 nella cache GUESS regolare." -#, fuzzy msgid "Current number of IPv4 hosts in the regular GUESS cache." -msgstr "Numero attuale degli host nelle cache dei nodi regolari." +msgstr "Numero attuale di host IPv4 nella cache GUESS regolare." -#, fuzzy msgid "Maximum number of IPv4 hosts in the introduction GUESS cache." -msgstr "Numero massimo degli host nel contenitore degli ultra-nodi" +msgstr "Numero massimo di host IPv4 nella cache GUESS di introduzione." -#, fuzzy msgid "Current number of IPv4 hosts in the introduction GUESS cache." -msgstr "Numero attuale degli host nelle cache degli ultra-nodi" +msgstr "Numero attuale di host IPv4 nella cache GUESS di introduzione." -#, fuzzy msgid "Debug level for the DB disk/RAM storage layer." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per il layer di stoccaggio per disco/RAM del DB" msgid "" "The current Session ID. This is a unique ID generated each time gtk-" "gnutella starts and it can be monitored from the shell interface to check " "whether gtk-gnutella has been restarted since the last check." msgstr "" +"L'iD di sessione attuale. Questo ID unico è generato ogni volta che gtk-" +"gnutella si avvia e può essere monitorato dall'interfaccia shell per " +"controllare se gtk-gnutella è stato riavviato dopo l'ultimo controllo." msgid "" "Whether gtk-gnutella should serve partial files which are rare on the " @@ -3377,6 +4633,11 @@ "network to always leave this enabled. This setting supersedes the disabling " "of global partial file sharing for rare files only." msgstr "" +"Se gtk-gnutella debba mettere a disposizione file parziali che sono rari " +"nella rete per incrementare il loro livello di diffusione. E' ottimale per " +"il benessere della rete lasciare questo sempre attivo. Questa impostazione " +"rimpiazza la disattivazione della condivisione file parziali per i soli file " +"rari." msgid "" "Whether the Gnutella UDP Extension for Scalable Searches (GUESS) client side " @@ -3384,199 +4645,312 @@ "queries instead of just broadcasting them. If enabled, it requires general " "GUESS support enabled as well or it will simply be ignored." msgstr "" +"Se abilitare l'estensione UDP per ricerche scalabili (GUESS) lat client, in " +"modo che gtk-gnutella possa generare richieste iterative Ultrapeer invece " +"che inoltrarle semplicemente. Se attivato, richiede anche l'attivazione " +"globale del supporto GUESS, altrimenti sarà ignorato." msgid "" "Bandwidth hint for GUESS querying, in bytes/sec, limiting the amount of " "concurrency that can be used for GUESS. Lower numbers mean slower querying " "overall" msgstr "" +"Banda consigliata per le ricerche GUESS, in bytes/sec, che limita la " +"quantità di operazioni contemporanee per GUESS. Numeri minori corrispondono " +"a ricerca più lenta" -#, fuzzy msgid "Debug level for the matching code." -msgstr "Livello di collaudo per il codice da scartare." +msgstr "Livello di debug per il codice corrispondente." -#, fuzzy msgid "Debug level for the time synchronization code." -msgstr "Livello di collaudo per il codice condiviso dei file." +msgstr "Livello di debug per il codice di sincronizzazione del tempo." msgid "" "Whether queries can request partial results hits, i.e. files which are " "incompletely available on remote hosts." msgstr "" +"Se le ricerche possano richiedere risultati parziali, ovvero file incompleti " +"disponibili sugli host remoti." msgid "" "Whether queries for partial files should be answered to.When Partial File " "Sharing is disabled this setting is of course ignored and no partial results " "are returned." msgstr "" +"Se rispondere a ricerche di file parziali. Quando la Condivisione di File " +"Parziali è disabilitata questo settaggio è ovviamente ignorato e non vengono " +"restituiti risultati parziali." -#, fuzzy msgid "Whether what's-new? queries should be answered to." -msgstr "Se debba essere mostrato il conteggio delle query trasmesse." +msgstr "Se rispondere alle ricerche \"novità?\"" msgid "" "When set, gtk-gnutella will automatically stop opened searches from which " "all the requested downloads have been completed, regardless of the initially " "configured expiration time." msgstr "" +"Se impostato, gtk-gnutella interromperà automaticamente le ricerche in corso " +"per cui i download richiesti sono stati completati, indipendentemente dal " +"tempo di scadenza inizialmente impostato." -#, fuzzy msgid "Maximum number of results to show in a What's New? request." -msgstr "" -"Massimo numero di risultati da mostrare in una richiesta di una " -"consultazione host." +msgstr "Numero massimo di risultati a seguito delle richieste \"Novità?\"" -#, fuzzy msgid "Maximum number of results to show in a passive search request." msgstr "" -"Massimo numero di risultati da mostrare in una richiesta di una " -"consultazione host." +"Numero massimo di risultati da mostrare nelle richieste di ricerca passive." -#, fuzzy msgid "Whether to log duplicate Gnutella messages from same node." -msgstr "Livello di collaudo per i messaggi Gnutella." +msgstr "Quando loggare messaggi Gnutella duplicati dallo stesso nodo." -#, fuzzy msgid "Whether to log duplicate Gnutella messages with a higher TTL." -msgstr "Livello di collaudo per i messaggi Gnutella." +msgstr "Quando loggare messaggi Gnutella duplicati con TTL più alto." -#, fuzzy msgid "Whether to log duplicate Gnutella messages (not from same node)." -msgstr "Livello di collaudo per i messaggi Gnutella." +msgstr "Quando loggare messaggi Gnutella duplicati (non dallo stesso nodo)." -#, fuzzy msgid "Whether to log new Gnutella messages, never seen before." -msgstr "Livello di collaudo per i messaggi Gnutella." +msgstr "Quando loggare nuovi messaggi Gnutella, mai visti prima." -#, fuzzy msgid "Whether to log Gnutella routing decisions." -msgstr "Livello di collaudo per i messaggi Gnutella." +msgstr "Quando loggare scelte di routing di Gnutella." -#, fuzzy msgid "Whether to log bad Gnutella messages, corrupted or unexpected." -msgstr "Livello di collaudo per i messaggi Gnutella." +msgstr "Quando loggare messaggi Gnutella cattivi, corrotti o inattesi." msgid "Whether to log conditions triggering query hit spam flagging." msgstr "" +"Quando loggare condizioni che determinano identificazione di query hit come " +"spam." -#, fuzzy msgid "Maximum number of IPv6 hosts in the ultra node cache." -msgstr "Numero massimo degli host nel contenitore degli ultra-nodi" +msgstr "Numero massimo di host IPv6 nella cache ultra nodi." -#, fuzzy msgid "Current number of IPv6 hosts in ultra node caches." -msgstr "Numero attuale degli host nelle cache degli ultra-nodi" +msgstr "Numero attuale di host IPv6 nella cache ultra nodi." -#, fuzzy msgid "Current number of IPv6 hosts in the regular GUESS cache." -msgstr "Numero attuale degli host nelle cache dei nodi regolari." +msgstr "Numero attuale di host IPv6 nella cache GUESS regolari." -#, fuzzy msgid "Current number of IPv6 hosts in the introduction GUESS cache." -msgstr "Numero attuale degli host nelle cache degli ultra-nodi" +msgstr "Numero attuale di host IPv6 nella cache GUESS di introduzione." -#, fuzzy msgid "Maximum number of IPv6 hosts in the regular GUESS cache." -msgstr "Numero massimo degli host nel contenitore dei nodi regolari." +msgstr "Numero massimo di host IPv6 nella cache GUESS regolari." -#, fuzzy msgid "Maximum number of IPv6 hosts in the introduction GUESS cache." -msgstr "Numero massimo degli host nel contenitore degli ultra-nodi" +msgstr "Numero massimo di host IPv6 nella cache GUESS di introduzione." -#, fuzzy msgid "Debug level for the malloc() replacement allocator." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per l'allocatore di rimpiazzo malloc()." -#, fuzzy msgid "Debug level for bad query hit messages." -msgstr "Livello di collaudo per l'interfaccia utente." +msgstr "Livello di debug per i messaggi query hit cattivi." -#, fuzzy msgid "Debug level for GUID management." -msgstr "Livello di collaudo per la gestione del gruppo scarocato." +msgstr "Livello di debug per la gestione GUID." -msgid "disable" -msgstr "disabilita" +msgid "Debug level for the TX (transmit) deflating network layer." +msgstr "Livello di debug per il layer di rete deflating di trasmissione (TX)." -msgid "by words" -msgstr "per parola" +msgid "Comma-separated list of TX debugging hosts (IP addresses only)" +msgstr "Lista separata da virgole degli host in debug TX (solo indirizzi IP)" -msgid "by whole query" -msgstr "per query intera" +msgid "" +"Comma-separated list of hosts for whom we want to dump RX traffic (IP " +"addresses only)" +msgstr "" +"Lista separata da virgole degli host per i quali vogliamo inviare il " +"traffico RX (soli indirizzi IP)." -msgid "by router" -msgstr "per router" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they emit " +"(IP addresses only)" +msgstr "" +"Lista separata da virgole degli host per i quali vogliamo inviare il " +"traffico TX che emettono (soli indirizzi IP)." -msgid "TCP & UDP" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they " +"receive (IP addresses only)" msgstr "" +"Lista separata da virgole degli host per i quali vogliamo inviare il " +"traffico TX che ricevono (soli indirizzi IP)." -msgid "TCP only" -msgstr "solo TCP" +msgid "" +"Allow GUESS to use some of the unused Gnutella outgoing bandwidth regardless " +"of the GUESS bandwidth hint. If FALSE, only the configured bandwidth hint " +"will be used. When running as a leaf this should be set to TRUE to make " +"GUESS queries run faster." +msgstr "" +"Permette a GUESS di usare parte della banda uscente Gnutella inutilizzata, " +"indipendentemente dalla banda GUESS consigliata. Se FALSO, verrà usata solo " +"la banda impostata. Se in esecuzione come foglia questo andrebbe settato a " +"VERO per velocizzare le ricerche GUESS." -msgid "UDP only" -msgstr "solo UDP" +msgid "Debug level for the UDP TX scheduler." +msgstr "Livello di debug per il programmatore TX UDP." -msgid "Ping" +msgid "" +"Debugging flags for the semi-reliable UDP TX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: transmissions, 16: timeouts." msgstr "" +"Flag di debug per layer TX UDP semi-affidabili: 1: messaggi, 2: frammenti, " +"4: riconoscimenti, 8: transmissioni, 16: tempo scaduto." -msgid "Pong" +msgid "Comma-separated list of RX debugging hosts (IP addresses only)" +msgstr "Lista separata da virgole degli host in debug RX (solo indirizzi IP)" + +msgid "" +"Debugging flags for the semi-reliable UDP RX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: receptions, 16: timeouts." msgstr "" +"Flag di debug per layer RX UDP semi-affidabili: 1: messaggi, 2: frammenti, " +"4: riconoscimenti, 8: transmissioni, 16: tempo scaduto." -msgid "Bye" -msgstr "Ciao" +msgid "Whether to log sent semi-reliable UDP messages." +msgstr "Quando loggare messaggi UDP semi-affidabili inviati." -msgid "QRP" -msgstr "" +msgid "Whether to log received semi-reliable UDP messages." +msgstr "Quando loggare messaggi UDP semi-affidabili ricevuti." -msgid "HSEP" -msgstr "" +msgid "Debug level for the secured OOB query hit claiming." +msgstr "Livello di debug per richieste di query hit OOB sicuri." -msgid "RUDP" -msgstr "" +msgid "Whether to log sent vendor messages." +msgstr "Se loggare messaggi del programma inviati." -msgid "Vendor spec." -msgstr "Specifiche offerente" +msgid "Whether to log received vendor messages." +msgstr "Se loggare messaggi del programma ricevuti." -msgid "Vendor std." -msgstr "Standard offerente" +msgid "Debugging flags for the DHT token cache (developers only)." +msgstr "Flag di debug per la cache di elementi DHT (solo sviluppatori)." -msgid "Push" -msgstr "Spinta" +msgid "Whether to log weird DHT message headers when debugging." +msgstr "Quando loggare strani messaggi dell'intestazione DHT durante il debug." -msgid "Query" -msgstr "" +msgid "Debug level for the DHT Remote Procedure Call (RPC) code." +msgstr "Livello di debug per il codice Chiamata Procedura Remora (RPC) DHT." -msgid "Query Hit" -msgstr "Tentativo query" +msgid "Whether to log UHC pings we receive." +msgstr "Quando loggare i ping UHC che riceviamo" -msgid "DHT Ping" -msgstr "" +msgid "Whether to log UHC pings we emit." +msgstr "Quando loggare i ping UHC che emettiamo." -msgid "DHT Pong" -msgstr "" +msgid "Whether the program was properly shutdown." +msgstr "Se il programma è stato opportunamente chiuso" -#, fuzzy -msgid "DHT Store" -msgstr "Traffico HTTP" +msgid "Whether the program restarted after a clean shutdown." +msgstr "Se il programma è stato riavviato dopo una chiusura pulita." -msgid "DHT Store Ack" -msgstr "" +msgid "Debug level for DHT key management." +msgstr "Livello di debug per la gestione chiavi DHT." -msgid "DHT Find Node" +msgid "Debug level for DHT value management." +msgstr "Livello di debug per la gestione valori DHT." + +msgid "ID of the current process." +msgstr "ID del processo corrente." + +msgid "Debug level for HTTP range parsing / handling." +msgstr "Livello di debug per il range HTTP di parsing / handling." + +msgid "" +"Lease time when installing port mappings via UPnP or NAT-PMP, in seconds. A " +"value of 0 requests permanent mappings." msgstr "" +"Tempo di prestito a seguito dell'attivazione del mappaggio porte tramite " +"UPnP o NAT-PMP, in secondi. Un valore di 0 richiede mappatura permanente." -msgid "DHT Found Node" +msgid "Whether the program is auto-restarting at the user's request." +msgstr "Se il programma si riavvia da solo a seguito di richiesta dell'utente." + +msgid "Debug level for time management." +msgstr "Livello di debug per gestione del tempo." + +msgid "Debug level for the tmalloc() thread-magazine object distributor." +msgstr "Livello di debug per il tmalloc() thread-magazine object distributor." + +msgid "Debug level for the event queue thread." +msgstr "Livello di debug per l'event queue thread." + +msgid "Maximum number of G2 hubs in the hub cache." +msgstr "Numero massimo di hub G2 nella cache." + +msgid "Current number of IPv4 hosts in the G2 hub caches." +msgstr "Numero corrente di host IPv4 nella cache hub G2." + +msgid "Whether the G2 protocol should be enabled." +msgstr "Se il protocollo G2 debba essere attivato." + +msgid "Number of G2 nodes currently connected." +msgstr "Numero di nodi G2 attualmente connessi." + +msgid "Maximum amount of G2 hubs we should connect to as a leaf." +msgstr "Numero massimo di hub G2 a cui connettersi come foglia." + +msgid "Whether to log bad G2 messages, corrupted or unexpected." +msgstr "Quando loggare messaggi G2 cattivi, corrotti o inattesi." + +msgid "Whether to log dropped G2 messages" +msgstr "Quando loggare messaggi G2 abbandonati" + +msgid "Debug level for the G2 RPC layer." +msgstr "Livello di debug per il layer RPC G2." + +msgid "Whether to log summary of received query hits" +msgstr "Quando loggare un riassunto delle query hit ricevute" + +msgid "Whether to log summary of each record in received query hits" +msgstr "Quando loggare un riassunto di ciascun record nelle query hit ricevute" + +msgid "Number of G2 browsing requests received in this session." +msgstr "Numero di richieste di consultazione G2 ricevute in questa sessione." + +msgid "Number of G2 browsing requests fully served in this session." msgstr "" +"Numero di richieste consultazioni G2 pienamente soddisfatte in questa " +"sessione. " -msgid "DHT Find Value" +msgid "Whether to log G2 messages we're attempting to send" +msgstr "Quando loggare messaggi G2 che stiamo cercando di mandare" + +msgid "" +"Timestamp at which the current session was started. This stamp remains " +"unchanged when gtk-gnutella restarts after a crash or an explicit restart " +"request." msgstr "" +"Timestamp dell'avvio della sessione corrente. Questo valore rimane invariato " +"quando gtk-gnutella si riavvia dopo un crash o una esplicita richiesta di " +"riavvio." -#, fuzzy -msgid "DHT Value" -msgstr "Valore" +msgid "No TCP listening socket bound to allow incoming connections." +msgstr "Nessun socket TCP in ascolto per permettere connessioni in ingresso." -msgid "Total" -msgstr "Totale" +msgid "disable" +msgstr "disabilita" + +msgid "by words" +msgstr "per parola" + +msgid "by whole query" +msgstr "per query intera" + +msgid "by router" +msgstr "per router" + +msgid "TCP & UDP" +msgstr "TCP & UDP" + +msgid "TCP only" +msgstr "solo TCP" + +msgid "UDP only" +msgstr "solo UDP" + +msgid "Query Hit" +msgstr "Tentativo query" msgid "Icons" msgstr "Icone" @@ -3585,10 +4959,10 @@ msgstr "Testo" msgid "Both (vertical)" -msgstr "" +msgstr "Entrambi (verticale)" msgid "Both (horizontal)" -msgstr "" +msgstr "Entrambi (orizzontale)" msgid "This session" msgstr "Questa sessione" @@ -3612,7 +4986,7 @@ msgstr "2 settimane" msgid "Search monitor enabled." -msgstr "Monitor di ricerca abilitato." +msgstr "Monitoraggio ricerche abilitato." msgid "Maximum number of queries visible in search monitor." msgstr "Numero massimo di query visibili nel monitor di ricerca." @@ -3633,13 +5007,11 @@ msgid "Widths of the columns in the file info table." msgstr "Larghezza delle colonne nella tabella di informazioni del file." -#, fuzzy msgid "Visibility of the columns in the file info table." -msgstr "Larghezza delle colonne nella tabella di informazioni del file." +msgstr "Visibilità delle colonne nella tabella informazioni file." -#, fuzzy msgid "Widths of the columns in the sources table." -msgstr "Larghezza delle colonne nella tabella dei nodi." +msgstr "Larghezza delle colonne nella tabella delle sorgenti." msgid "Widths of the columns in the search list on the sidebar." msgstr "Larghezza delle colonne nell'elenco di ricerca della barra laterale." @@ -3695,8 +5067,7 @@ msgid "Widths of the columns in the Gnet stats drop reasons table." msgstr "" -"Larghezza delle colonne nella tabella delle statistiche dei motivi dei " -"rilasci di Gnet." +"Larghezza delle colonne nella tabella statistiche motivi di abbandono Gnet." msgid "Widths of the columns in the hostcache table." msgstr "Larghezza delle colonne nella tabella della cache dell'host." @@ -3731,16 +5102,14 @@ msgid "Show tabs or search list." msgstr "Mostra le schede o l'elenco ricerca." -#, fuzzy msgid "Display Searchbar." -msgstr "Mostra barra laterale" +msgstr "Mostra barra ricerca." msgid "Display Sidebar." msgstr "Mostra barra laterale" -#, fuzzy msgid "Display Menu." -msgstr "Visualizzazione" +msgstr "Mostra il Menu." msgid "Display statusbar." msgstr "Mostra barra di stato" @@ -3805,13 +5174,13 @@ msgstr "Ordinamento predefinito delle colonne per i risultati delle ricerche." msgid "Discard search results which are considered spam." -msgstr "" +msgstr "Scarta i risultati di ricerca considerati spam." msgid "Discard search results which carry no hashsum." -msgstr "" +msgstr "Scarta i risultati di ricerca senza hashsum." msgid "Jump to newly created searches" -msgstr "" +msgstr "Passa alle ricerche appena create." msgid "Collect statistics about searches that go through this node." msgstr "Colleziona le statistiche sulle ricerche che attraversano questo nodo." @@ -3823,7 +5192,7 @@ "A deletion coefficient, so that small non-significant results can be " "dropped. The lower it is, the more search statistics will be kept in memory." msgstr "" -"Un coefficente di eliminazione, in modo da rilasciare i risultati piccoli e " +"Un coefficente di eliminazione, in modo da abbandonare i risultati piccoli e " "insignificanti. Più è basso, più statistiche sulla ricerca verranno " "conservate in memoria." @@ -3856,7 +5225,7 @@ msgstr "Scelta del sorgente delle statistiche da mostrare." msgid "Choose message type for drop reasons." -msgstr "Scelta del tipo di messaggio per le ragioni di rilascio." +msgstr "Scelta messaggio per il tipo di ragioni di abbandono." msgid "Include Gnutella packet header size to the volume." msgstr "Include nel volume la dimensione dei titoli dei pacchetti Gnutella." @@ -3864,8 +5233,8 @@ msgid "" "Show percentages instead of absolute values in the Gnet stats (drop reasons)." msgstr "" -"Mostra le percentuali anziché i valori assoluti nelle statistiche Gnet " -"(motivi rilasci)." +"Mostra percentuale invece che valori assoluti nelle statistiche Gnet " +"(ragioni di abbandono)." msgid "Widths of the columns in the Gnet stats general table." msgstr "Larghezza delle colonne nella tabella generale delle statistiche Gnet." @@ -3940,10 +5309,10 @@ "trasmissione." msgid "Whether count of dropped messages on TX should be displayed." -msgstr "Se debba essere mostrato il conteggio dei messaggi rilasciati in TX." +msgstr "Se debba essere mostrato il conteggio dei messaggi abbandonati in TX." msgid "Whether count of dropped messages on RX should be displayed." -msgstr "Se debba essere mostrato il conteggio dei messaggi rilasciati in RX." +msgstr "Se debba essere mostrato il conteggio dei messaggi abbandonati in RX." msgid "" "Whether Query Routing Protocol statistics should be displayed. For a leaf " @@ -3953,18 +5322,27 @@ "the passing threshold and 'e' the efficiency, i.e. the proportion of " "received queries that are sent to the node after QRP table filtering." msgstr "" +"Se le statistiche del Query Routing Protocol debbano essere mostrate. Per un " +"nodo foglia, questo è semplicemente il rapporto delle richieste che hanno " +"generato un risultato rispetto al totale delle richieste ricevute. Per un " +"ultrapeer, mostra la quantità di slot nella tabella QRP, 'g' il numero di " +"generazione, 'f' il rapporto di riempimento e 'e' l'efficienza, i.e. la " +"proporzione delle richieste ricevute che sono inviate al nodo dopo " +"filtraggio della tabella QRP." msgid "" "Whether we should display message counts for duplicate, bad, weird and " "messages bearing an hostile IP address." msgstr "" +"Se si debba mostrare il conteggio per messaggi duplicati, cattivi, strano e " +"caratterizzati da indirizzo IP ostile." msgid "" "Whether ping/pong roundtrip times (average and last) should be displayed. " "Values shown are in milliseconds." msgstr "" -"Se debbano essere mostrati i tempi (medio e ultimo) del giro ping/pong. I " -"valori mostrati sono in millisecondi." +"Se debbano essere mostrati i tempi di andata e ritorno ping/pong (medio e " +"ultimo). I valori mostrati sono in millisecondi." msgid "" "Whether we should display the size of the node's library, when it is known " @@ -3985,9 +5363,14 @@ "but also saves CPU cycles since less redrawing has to occur in the search " "pane." msgstr "" +"La quantità di tempo in secondi per cui l'interfaccia grafica dovrebbe " +"attendere prima di mostrare i risultati di ricerca mentre arrivano. Questo " +"previene aggiornamenti troppo frequenti che causerebbero sfarfallio, ma " +"anche risparmiano cicli di CPU grazie al minor numero di aggiornamenti del " +"pannello di ricerca." msgid "Expanded stati of the nodes in the treemenu." -msgstr "" +msgstr "Condizioni dei nodi espanse nell'albero menù." msgid "Widths of the columns in the Gnet packet stats table (pkg). GTK2" msgstr "" @@ -4012,65 +5395,92 @@ "Show a status icon in the system tray if possible (requires Gtk+ 2.10 or " "newer)." msgstr "" +"Se possibile mostra un'icona di stato nel vassoio di sistema (richiede Gtk+ " +"2.10 o più recente)." -#, fuzzy msgid "Automatically hide DHT bandwidth display when DHT not enabled." msgstr "" -"Nascondi automaticamente l'utilizzo della banda di traffico quando non si è " -"in modalità ultrapeer." +"Nascondi automaticamente la visualizzazione della banda DHT quando DHT non è " +"abilitato." -#, fuzzy msgid "Display incoming DHT traffic bandwidth usage." -msgstr "Mostra l'utilizzo della banda di traffico HTTP in ingresso." +msgstr "Mostra utilizzo di banda per il traffico DHT in ingresso." -#, fuzzy msgid "Display outgoing DHT traffic bandwidth usage." -msgstr "Mostra l'utilizzo della banda di traffico HTTP in uscita." +msgstr "Mostra utilizzo di banda per il traffico DHT in uscita." -#, fuzzy msgid "Display incoming DHT traffic bandwidth as an average." -msgstr "Mostra la media della banda di traffico HTTP in ingresso." +msgstr "Mostra banda per il traffico in ingresso DHT come media." -#, fuzzy msgid "Display outgoing DHT traffic bandwidth as an average." -msgstr "Mostra la media della banda di traffico HTTP in uscita." +msgstr "Mostra banda il traffico DHT in uscita come media." msgid "" "Remote nodes supporting media type filtering will apply your query " "specifically on their audio files." msgstr "" +"I nodi remoti che supportano il filtraggio per tipo applicheranno la ricerca " +"specificamente sui file audio." msgid "" "Remote nodes supporting media type filtering will apply your query " "specifically on their video files." msgstr "" +"I nodi remoti che supportano il filtraggio per tipo applicheranno la ricerca " +"specificamente sui file video." msgid "" "Remote nodes supporting media type filtering will apply your query " "specifically on their document files. Document files are XML, HTML, Word, " "PDF, etc..." msgstr "" +"I nodi remoti che supportano il filtraggio dei tipi di file applicheranno la " +"query direttamente sui propri file documento. I file documento sono XML, " +"HTML, Word, PDF, ecc." msgid "" "Remote nodes supporting media type filtering will apply your query " "specifically on their image files." msgstr "" +"I nodi remoti che supportano il filtraggio dei tipi di file applicheranno la " +"query direttamente sui propri file immagine." msgid "" "Remote nodes supporting media type filtering will apply your query " "specifically on archive / program files such as ZIP, 7z, tar, bz2, gz, dep, " "rpm and also exe files." msgstr "" +"I nodi remoti che supportano il filtraggio dei tipi di file applicheranno la " +"query direttamente sui propri file archivio come ZIP, 7z, tar, bz2, gz, deb, " +"rpm e anche exe." msgid "" -"Discard search results whith an alien IP address, not matching the one from " +"Discard search results with an alien IP address, not matching the one from " "which the results come from." msgstr "" +"Scarta i risultati di ricerca con un indirizzo IP non corrispondente a " +"quello da cui provengono i risultati." msgid "" "Whether session-only searches which happen to have pending downloads should " "be restarted when gtk-gnutella is launched." msgstr "" +"Se le ricerche session-only che capita abbiano download in attesa debbano " +"essere rieseguite quando gtk-gnutella viene lanciato." + +msgid "Discard search results coming from servents with a banned GUID." +msgstr "" +"Scarta i risultati di ricerche provenienti da servent con un GUID bandito." + +msgid "Whether a summary line with GUESS search stats should be displayed." +msgstr "Se mostrare un linea di riassunto con le statistiche di ricerca GUESS." + +msgid "" +"Whether the GUESS summary line should show total statistics or ones " +"pertaining to the current search only." +msgstr "" +"Se la linea di riassunto GUESS debba mostrare le statistiche totali o solo " +"quelle riferite alla ricerca corrente." msgid "Anonymizing proxies" msgstr "Anonimizzazione dei proxy" @@ -4079,58 +5489,56 @@ msgstr "Fornitori satellite" msgid "Andorra" -msgstr "" +msgstr "Andorra" msgid "United Arab Emirates" msgstr "Emirati Arabi" msgid "Afghanistan" -msgstr "" +msgstr "Afghanistan" msgid "Antigua and Barbuda" -msgstr "" +msgstr "Antigua e Barbuda" msgid "Anguilla" -msgstr "" +msgstr "Anguilla" msgid "Albania" -msgstr "" +msgstr "Albania" msgid "Armenia" -msgstr "" +msgstr "Armenia" msgid "Netherlands Antilles" msgstr "Antille Olandesi" msgid "Angola" -msgstr "" +msgstr "Angola" msgid "Asia/Pacific Region" msgstr "Asia/Pacifico" msgid "Antarctica" -msgstr "" +msgstr "Antartide" msgid "Argentina" -msgstr "" +msgstr "Argentina" msgid "American Samoa" msgstr "Samoa americane" msgid "Austria" -msgstr "" +msgstr "Austria" msgid "Australia" -msgstr "" +msgstr "Australia" msgid "Aruba" -msgstr "" +msgstr "Aruba" -#, fuzzy msgid "Åland Islands" -msgstr "Isole Cayman" +msgstr "Isole Åland" -#, fuzzy msgid "Azerbaijan" msgstr "Azerbaijan" @@ -4138,100 +5546,104 @@ msgstr "Bosnia Herzegovina" msgid "Barbados" -msgstr "" +msgstr "Barbados" msgid "Bangladesh" -msgstr "" +msgstr "Bangladesh" msgid "Belgium" -msgstr "" +msgstr "Belgio" msgid "Burkina Faso" -msgstr "" +msgstr "Burkina Faso" msgid "Bulgaria" -msgstr "" +msgstr "Bulgaria" msgid "Bahrain" -msgstr "" +msgstr "Bahrain" msgid "Burundi" -msgstr "" +msgstr "Burundi" -#, fuzzy msgid "Benin" -msgstr "Scartamento" +msgstr "Benin" + +msgid "Saint Barthelemy" +msgstr "Saint Barthelemy" msgid "Bermuda" -msgstr "" +msgstr "Bermuda" msgid "Brunei Darussalam" msgstr "Brunei" msgid "Bolivia" -msgstr "" +msgstr "Bolivia" + +msgid "Bonaire, Sint Eustatius and Saba" +msgstr "Bonaire, Sint Eustatius e Saba" msgid "Brazil" -msgstr "" +msgstr "Brasile" msgid "Bahamas" -msgstr "" +msgstr "Bahamas" msgid "Bhutan" -msgstr "" +msgstr "Bhutan" + +msgid "Burma" +msgstr "Burma" -#, fuzzy msgid "Bouvet Island" msgstr "Isola Bouvet" msgid "Botswana" -msgstr "" +msgstr "Botswana" msgid "Belarus" msgstr "Bielorussia" msgid "Belize" -msgstr "" +msgstr "Belize" msgid "Canada" -msgstr "" +msgstr "Canada" msgid "Cocos (Keeling) Islands" msgstr "Isole Cocos (Keeling)" -#, fuzzy msgid "Congo (Democratic Republic)" -msgstr "Congo, Repubblica democratica" +msgstr "Repubblica Democratica del Congo" msgid "Central African Republic" -msgstr "Repubblica Centro Africa" +msgstr "Repubblica Centro Africana" msgid "Congo" -msgstr "" +msgstr "Congo" msgid "Switzerland" -msgstr "" +msgstr "Svizzera" msgid "Cote d'Ivoire" -msgstr "" +msgstr "Costa d'Avorio" msgid "Cook Islands" msgstr "Isole Cook" -#, fuzzy msgid "Chile" -msgstr "file" +msgstr "Cile" msgid "Cameroon" -msgstr "" +msgstr "Cameroon" msgid "China" -msgstr "" +msgstr "Cina" msgid "Colombia" -msgstr "" +msgstr "Colombia" -#, fuzzy msgid "Costa Rica" msgstr "Costa Rica" @@ -4239,17 +5651,19 @@ msgstr "Serbia e Montenegro" msgid "Cuba" -msgstr "" +msgstr "Cuba" -#, fuzzy msgid "Cape Verde" msgstr "Capo Verde" +msgid "Curacao" +msgstr "Curacao" + msgid "Christmas Island" -msgstr "Isola Christmas" +msgstr "Isola di Natale" msgid "Cyprus" -msgstr "" +msgstr "Cipro" msgid "Czech Republic" msgstr "Repubblica Ceca" @@ -4258,39 +5672,37 @@ msgstr "Germania" msgid "Djibouti" -msgstr "" +msgstr "Gibuti" msgid "Denmark" -msgstr "" +msgstr "Danimarca" -#, fuzzy msgid "Dominica" -msgstr "Repubblica Dominicana" +msgstr "Dominica" msgid "Dominican Republic" msgstr "Repubblica Dominicana" msgid "Algeria" -msgstr "" +msgstr "Algeria" msgid "Ecuador" -msgstr "" +msgstr "Ecuador" msgid "Estonia" -msgstr "" +msgstr "Estonia" msgid "Egypt" -msgstr "" +msgstr "Egitto" msgid "Western Sahara" msgstr "Sahara occidentale" msgid "Eritrea" -msgstr "" +msgstr "Eritrea" -#, fuzzy msgid "Spain" -msgstr "Spaziatura" +msgstr "Spagna" msgid "Ethiopia" msgstr "Etiopia" @@ -4298,265 +5710,242 @@ msgid "Europe" msgstr "Europa" -#, fuzzy msgid "Finland" -msgstr "Fallito" +msgstr "Finlandia" msgid "Fiji" -msgstr "" +msgstr "Isole Fiji" msgid "Falkland Islands (Malvinas)" msgstr "Isole Falkland (Malvine)" msgid "Micronesia" -msgstr "" +msgstr "Micronesia" -#, fuzzy msgid "Faroe Islands" -msgstr "Isole Faeroe" +msgstr "Isole Faroe" -#, fuzzy msgid "France" -msgstr "Cancella" +msgstr "Francia" msgid "Gabon" -msgstr "" +msgstr "Gabon" -#, fuzzy msgid "United Kingdom" -msgstr "Svezia" +msgstr "Inghilterra" msgid "Grenada" -msgstr "" +msgstr "Grenada" msgid "Georgia" -msgstr "" +msgstr "Georgia" msgid "French Guiana" msgstr "Guiana Francese" -#, fuzzy msgid "Guernsey" -msgstr "Germania" +msgstr "Guernsey" msgid "Ghana" -msgstr "" +msgstr "Ghana" msgid "Gibraltar" msgstr "Gibilterra" msgid "Greenland" -msgstr "" +msgstr "Groenlandia" msgid "Gambia" -msgstr "" +msgstr "Gambia" -#, fuzzy msgid "Guinea" -msgstr "Generale" +msgstr "Guinea" -#, fuzzy msgid "Guadeloupe" -msgstr "Guadalupe" +msgstr "Guadeloupe" -#, fuzzy msgid "Equatorial Guinea" msgstr "Guinea Equatoriale" msgid "Greece" -msgstr "" +msgstr "Gracia" msgid "South Georgia and The South Sandwich Islands" -msgstr "" +msgstr "Georgia del Sud e Isole Sandwich Meridionali" msgid "Guatemala" -msgstr "" +msgstr "Guatemala" msgid "Guam" -msgstr "" +msgstr "Guam" -#, fuzzy msgid "Guinea-Bissau" msgstr "Guinea-Bissau" msgid "Guyana" -msgstr "" +msgstr "Guyana" msgid "Hong Kong" -msgstr "" +msgstr "Hong Kong" -#, fuzzy msgid "Heard Island and McDonald Islands" msgstr "Isole Heard e McDonald" msgid "Honduras" -msgstr "" +msgstr "Honduras" msgid "Croatia" -msgstr "" +msgstr "Croazia" -#, fuzzy msgid "Haiti" -msgstr "In attesa" +msgstr "Haiti" msgid "Hungary" -msgstr "" +msgstr "Ungheria" msgid "Indonesia" -msgstr "" +msgstr "Indonesia" msgid "Ireland" msgstr "Irlanda" -#, fuzzy msgid "Israel" -msgstr "Irlanda" +msgstr "Israele" msgid "Isle of Man" -msgstr "" +msgstr "Isola di Man" msgid "India" -msgstr "" +msgstr "India" -#, fuzzy msgid "British Indian Ocean Territory" -msgstr "Arcipelago Chagos" +msgstr "Territorio dell'Oceano Indiano Britannico" msgid "Iraq" -msgstr "" +msgstr "Iraq" -#, fuzzy msgid "Iran" -msgstr "Irlanda" +msgstr "Iran" -#, fuzzy msgid "Iceland" -msgstr "Irlanda" +msgstr "Islanda" msgid "Italy" -msgstr "" +msgstr "Italia" msgid "Jersey" -msgstr "" +msgstr "Isola di Jersey" msgid "Jamaica" -msgstr "" +msgstr "Giamaica" msgid "Jordan" -msgstr "" +msgstr "Giordania" msgid "Japan" msgstr "Giappone" msgid "Kenya" -msgstr "" +msgstr "Kenya" msgid "Kyrgyzstan" -msgstr "" +msgstr "Kyrgyzstan" msgid "Cambodia" -msgstr "" +msgstr "Cambogia" msgid "Kiribati" -msgstr "" +msgstr "Kiribati" msgid "Comoros" -msgstr "" +msgstr "Isole Comore" msgid "Saint Kitts and Nevis" -msgstr "" +msgstr "Saint Kitts and Nevis" msgid "North Korea" -msgstr "" +msgstr "Corea del Nord" msgid "South Korea" -msgstr "" +msgstr "Corea del Sud" msgid "Kuwait" -msgstr "" +msgstr "Kuwait" msgid "Cayman Islands" msgstr "Isole Cayman" -#, fuzzy msgid "Kazakhstan" -msgstr "Kazakistan" +msgstr "Kazakhstan" msgid "Laos" -msgstr "" +msgstr "Laos" -#, fuzzy msgid "Lebanon" -msgstr "Motivo" +msgstr "Libano" msgid "Saint Lucia" -msgstr "" +msgstr "Santa Lucia" -#, fuzzy msgid "Liechtenstein" msgstr "Liechtenstein" msgid "Sri Lanka" -msgstr "" +msgstr "Sri Lanka" msgid "Liberia" -msgstr "" +msgstr "Liberia" msgid "Lesotho" -msgstr "" +msgstr "Lesotho" msgid "Lithuania" msgstr "Lituania" msgid "Luxembourg" -msgstr "" +msgstr "Lussemburgo" msgid "Latvia" -msgstr "" +msgstr "Latvia" msgid "Libyan Arab Jamahiriya" msgstr "Libia" msgid "Morocco" -msgstr "" +msgstr "Marocco" msgid "Monaco" -msgstr "" +msgstr "Monaco e Montecarlo" msgid "Moldova" -msgstr "" +msgstr "Moldova" -#, fuzzy msgid "Montenegro" -msgstr "Serbia e Montenegro" +msgstr "Montenegro" -#, fuzzy msgid "Saint Martin" -msgstr "San Marino" +msgstr "Saint Martin" -#, fuzzy msgid "Madagascar" msgstr "Madagascar" msgid "Marshall Islands" msgstr "Isole Marshall" -#, fuzzy msgid "Macedonia" -msgstr "Nuova Caledonia" +msgstr "Macedonia" -#, fuzzy msgid "Mali" -msgstr "Malesia" +msgstr "Mali" msgid "Myanmar" -msgstr "" +msgstr "Birmania" msgid "Mongolia" -msgstr "" +msgstr "Mongolia" msgid "Macao" -msgstr "" +msgstr "Macao" msgid "Northern Mariana Islands" msgstr "Isole Marianne del nord" @@ -4564,81 +5953,77 @@ msgid "Martinique" msgstr "Martinica" -#, fuzzy msgid "Mauritania" -msgstr "Lituania" +msgstr "Mauritania" msgid "Montserrat" -msgstr "" +msgstr "Montserrat" -#, fuzzy msgid "Malta" -msgstr "Malesia" +msgstr "Malta" msgid "Mauritius" -msgstr "" +msgstr "Mauritius" msgid "Maldives" -msgstr "" +msgstr "Maldive" -#, fuzzy msgid "Malawi" -msgstr "Malesia" +msgstr "Malawi" msgid "Mexico" -msgstr "" +msgstr "Messico" msgid "Malaysia" msgstr "Malesia" msgid "Mozambique" -msgstr "" +msgstr "Mozambico" msgid "Namibia" -msgstr "" +msgstr "Namibia" msgid "New Caledonia" msgstr "Nuova Caledonia" msgid "Niger" -msgstr "" +msgstr "Nigeria" msgid "Norfolk Island" msgstr "Isole Norfolk" msgid "Nigeria" -msgstr "" +msgstr "Nigeria" msgid "Nicaragua" -msgstr "" +msgstr "Nicaragua" -#, fuzzy msgid "Netherlands" -msgstr "Antille Olandesi" +msgstr "Olanda" msgid "Norway" -msgstr "" +msgstr "Norvegia" msgid "Nepal" -msgstr "" +msgstr "Nepal" msgid "Nauru" -msgstr "" +msgstr "Repubblica di Nauru" msgid "Niue" -msgstr "" +msgstr "Niue" msgid "New Zealand" msgstr "Nuova Zelanda" msgid "Oman" -msgstr "" +msgstr "Oman" msgid "Panama" -msgstr "" +msgstr "Panama" msgid "Peru" -msgstr "" +msgstr "Peru" msgid "French Polynesia" msgstr "Polinesia Francese" @@ -4647,238 +6032,227 @@ msgstr "Papua Nuova Guinea" msgid "Philippines" -msgstr "" +msgstr "Filippine" -#, fuzzy msgid "Pakistan" -msgstr "Tagikistan" +msgstr "Pakistan" -#, fuzzy msgid "Poland" -msgstr "Irlanda" +msgstr "Polonia" msgid "Saint Pierre and Miquelon" -msgstr "" +msgstr "Saint Pierre e Miquelon" msgid "Pitcairn" -msgstr "" +msgstr "Isole Pitcairn" msgid "Puerto Rico" -msgstr "" +msgstr "Porto Rico" -#, fuzzy msgid "Palestinian Territory" -msgstr "Palestina" +msgstr "Territorio Palestinese" -#, fuzzy msgid "Portugal" -msgstr "Totale" +msgstr "Portogallo" msgid "Palau" -msgstr "" +msgstr "Palau" msgid "Paraguay" -msgstr "" +msgstr "Paraguay" msgid "Qatar" -msgstr "" +msgstr "Qatar" msgid "Reunion" -msgstr "" +msgstr "Isola Riunione" msgid "Romania" -msgstr "" +msgstr "Romania" msgid "Serbia" -msgstr "" +msgstr "Serbia" msgid "Russian Federation" msgstr "Russia" msgid "Rwanda" -msgstr "" +msgstr "Ruanda" -#, fuzzy msgid "Saudi Arabia" -msgstr "Arabia del sud" +msgstr "Arabia Saudita" msgid "Solomon Islands" msgstr "Isole Solomon" -#, fuzzy msgid "Seychelles" -msgstr "Ricerche" +msgstr "Seychelles" msgid "Sudan" -msgstr "" +msgstr "Sudan" msgid "Sweden" -msgstr "" +msgstr "Svezia" -#, fuzzy msgid "Singapore" -msgstr "ignora" +msgstr "Singapore" msgid "Saint Helena" -msgstr "" +msgstr "Isola di Sant'Elena" msgid "Slovenia" -msgstr "" +msgstr "Slovenia" -#, fuzzy msgid "Svalbard and Jan Mayen" -msgstr "Isole Svalbard" +msgstr "Svalbard e Jan Mayen" msgid "Slovakia" -msgstr "" +msgstr "Slovacchia" -#, fuzzy msgid "Sierra Leone" msgstr "Sierra Leone" -#, fuzzy msgid "San Marino" msgstr "San Marino" -#, fuzzy msgid "Senegal" -msgstr "Generale" +msgstr "Senegal" msgid "Somalia" -msgstr "" +msgstr "Somalia" -#, fuzzy msgid "Suriname" -msgstr "nome" +msgstr "Suriname" + +msgid "South Sudan" +msgstr "Sudan del Sud" msgid "Sao Tome and Principe" -msgstr "" +msgstr "Sao Tome e Principe" -#, fuzzy msgid "El Salvador" msgstr "El Salvador" +msgid "Sint Maarten" +msgstr "Sint Maarten" + msgid "Syrian Arab Republic" msgstr "Siria" msgid "Swaziland" -msgstr "" +msgstr "Swaziland" msgid "Turks and Caicos Islands" msgstr "Isole Turks e Caicos" msgid "Chad" -msgstr "" +msgstr "Chad" msgid "French Southern Territories" -msgstr "" +msgstr "Territori Francesi del Sud" msgid "Togo" -msgstr "" +msgstr "Togo" msgid "Thailand" -msgstr "" +msgstr "Tailandia" msgid "Tajikistan" msgstr "Tagikistan" msgid "Tokelau" -msgstr "" +msgstr "Tokelau" msgid "Timor-leste" -msgstr "" +msgstr "Timor Est" msgid "Turkmenistan" -msgstr "" +msgstr "Turkmenistan" msgid "Tunisia" -msgstr "" +msgstr "Tunisia" msgid "Tonga" -msgstr "" +msgstr "Tonga" msgid "Turkey" -msgstr "" +msgstr "Turchia" -#, fuzzy msgid "Trinidad and Tobago" msgstr "Trinidad e Tobago" msgid "Tuvalu" -msgstr "" +msgstr "Tuvalu" -#, fuzzy msgid "Taiwan" -msgstr "Tagikistan" +msgstr "Taiwan" msgid "Tanzania" -msgstr "" +msgstr "Tanzania" msgid "Ukraine" msgstr "Ucraina" msgid "Uganda" -msgstr "" +msgstr "Uganda" msgid "United States Minor Outlying Islands" -msgstr "" +msgstr "Isole minori esterne degli Stati Uniti d'America" -#, fuzzy msgid "United States" msgstr "Stati Uniti d'America" msgid "Uruguay" -msgstr "" +msgstr "Uruguay" msgid "Uzbekistan" -msgstr "" +msgstr "Uzbekistan" msgid "Holy See (Vatican City State)" msgstr "Vaticano" msgid "Saint Vincent and The Grenadines" -msgstr "" +msgstr "Saint Vincent e Grenadines" msgid "Venezuela" -msgstr "" +msgstr "Venezuela" msgid "British Virgin Islands" -msgstr "Isole Vergini" +msgstr "Isole Vergini Britanniche" -#, fuzzy msgid "U.S. Virgin Islands" -msgstr "Isole Vergini US" +msgstr "Isole Vergini Americane" msgid "Viet Nam" -msgstr "" +msgstr "Vietnam" msgid "Vanuatu" -msgstr "" +msgstr "Vanuatu" msgid "Wallis and Futuna" -msgstr "" +msgstr "Wallis e Futuna" msgid "Samoa" -msgstr "" +msgstr "Samoa" msgid "Yemen" -msgstr "" +msgstr "Yemen" msgid "Mayotte" -msgstr "" +msgstr "Mayotte" -#, fuzzy msgid "South Africa" -msgstr "Sud Africa" +msgstr "Sudafrica" msgid "Zambia" -msgstr "" +msgstr "Zambia" msgid "Zimbabwe" -msgstr "" +msgstr "Zimbabwe" msgid "MAGNET URI contained source URL for an unsupported protocol" msgstr "" +"Il MAGNET URI conteneva un URL sorgente per un protocollo non supportato" #, c-format msgid "%u Byte" @@ -4898,41 +6272,38 @@ #. TRANSLATORS: Don't translate 'B', just 's' is allowed. msgid "B/s" -msgstr "" +msgstr "B/s" #, c-format msgid "%ud %uh" -msgstr "" +msgstr "%ud %uh" #, c-format msgid "%uh %um" -msgstr "" +msgstr "%uh %um" #, c-format msgid "%um %us" -msgstr "" +msgstr "%um %us" #, c-format msgid "%us" -msgstr "" +msgstr "%us" msgid "locale_get_language|en" msgstr "it" msgid "unofficial build, accessing files from" -msgstr "" +msgstr "versione non ufficiale, accedo ai file da" -#, fuzzy msgid "URL missing" -msgstr "Valore assente" +msgstr "URL mancante" -#, fuzzy msgid "The download could not be created" -msgstr "Nessun posto di scaricamento (crea)" +msgstr "Il download non può essere creato" -#, fuzzy msgid "Download added" -msgstr "Scaricati:" +msgstr "Download aggiunto" msgid "Unknown operation" msgstr "Operazione sconosciuta" @@ -4940,9 +6311,8 @@ msgid "Unknown command" msgstr "Comando sconosciuto" -#, fuzzy msgid "No help available" -msgstr "Non disponibile" +msgstr "Aiuto non disponibile" msgid "Hops" msgstr "Salti" @@ -4964,45 +6334,45 @@ msgid "Horizon size via HSEP node %s (%s):" msgstr "Dimensione horizon via nodo HSEP %s (%s):" -#, fuzzy msgid "Interactive mode turned on." -msgstr "Sorgenti inattive" +msgstr "Modalità interattiva in esecuzione." -#, fuzzy msgid "Interactive mode turned off." -msgstr "Sorgenti inattive" +msgstr "Modalità interattiva spenta." + +#, c-format +msgid "Unknown operation \"show %s\"" +msgstr "Operazione sconosciuta \"mostra %s\"" + +#, c-format +msgid "Unknown operation \"%s\"" +msgstr "Operazione sconosciuta \"%s\"" -#, fuzzy msgid "Cannot determine current working directory" -msgstr "Non riesco a trovare la tua cartella personale!" +msgstr "Non posso determinare la cartella di lavoro corrente" -#, fuzzy, c-format +#, c-format msgid "Unknown logfile name \"%s\"" -msgstr "Proprietà sconoscìuta" +msgstr "Nome del file di log \"%s\" sconosciuto" -#, fuzzy msgid "Unable to reopen" -msgstr "Non posso inviare GIV" +msgstr "Riapertura non eseguibile" #, c-format msgid "Could not rename logfile as \"%s\": %m" -msgstr "" - -#, fuzzy, c-format -msgid "Unknown operation \"%s\"" -msgstr "Operazione sconosciuta" - -#, fuzzy, c-format -msgid "Unknown operation \"show %s\"" -msgstr "Operazione sconosciuta" +msgstr "Non posso rinominare il file log in \"%s\": %m" -#, fuzzy, c-format +#, c-format msgid "Unknown operation \"stats %s\"" -msgstr "Operazione sconosciuta" +msgstr "Operazione sconosciuta \"stats %s\"" + +#, c-format +msgid "Unknown operation \"check %s\"" +msgstr "Operazione sconosciuta \"controlla %s\"" -#, fuzzy, c-format +#, c-format msgid "Unknown operation \"usage %s\"" -msgstr "Operazione sconosciuta" +msgstr "Operazione sconosciuta \"utilizzo %s\"" msgid "Invalid IP/Port" msgstr "IP/Porta invalidi" @@ -5010,26 +6380,24 @@ msgid "Node added" msgstr "Aggiunto nodo" -#, fuzzy msgid "Invalid IP" -msgstr "IP/Porta invalidi" +msgstr "IP non valido" -#, fuzzy msgid "Invalid port" -msgstr "IP/Porta invalidi" +msgstr "Porta non valida" -#, fuzzy, c-format +#, c-format msgid "Removed %u node" msgid_plural "Removed %u nodes" -msgstr0 "Rimosso %u scaricamento" -msgstr1 "Rimossi %u scaricamenti" +msgstr0 "Rimosso %u nodo" +msgstr1 "Rimossi %u nodi" msgid "Property missing" msgstr "Proprietà assente" -#, fuzzy, c-format +#, c-format msgid "Unknown property \"%s\"" -msgstr "Proprietà sconoscìuta" +msgstr "Proprietà sconosciuta \"%s\"" msgid "Value: " msgstr "Valore: " @@ -5038,24 +6406,25 @@ msgstr "Valore trovato e mostrato" msgid "No matching property." -msgstr "" +msgstr "Nessuna proprietà corrispondente." msgid "Good bye" msgstr "Arrivederci" +msgid "Invalid command syntax" +msgstr "Sintassi del comando non valida" + msgid "Query string missing" msgstr "Stringa di richiesta assente" -#, fuzzy msgid "Query string is not UTF-8 encoded" -msgstr "La stringa della query non è codificata UTF-8" +msgstr "La stringa di ricerca non è codificata UTF-8" msgid "Search added" msgstr "Aggiunta ricerca" -#, fuzzy msgid "The search could not be created" -msgstr "Nessun posto di scaricamento (crea)" +msgstr "La ricerca non può essere generata" msgid "Unknown property" msgstr "Proprietà sconoscìuta" @@ -5063,116 +6432,82 @@ msgid "Value missing" msgstr "Valore assente" +msgid "Property cannot be changed" +msgstr "La proprietà non può essere cambiata" + #, c-format msgid "Previous value was %s" -msgstr "" +msgstr "Il valore precedente era %s" #, c-format msgid "New value is %s" -msgstr "" +msgstr "Il nuovo valore è %s" msgid "Value found and set" msgstr "Valore trovato e impostato" msgid "unterminated escape sequence" -msgstr "" +msgstr "sequenza escape non completata" msgid "unterminated double-quoted string" -msgstr "" +msgstr "stringa in doppi apici non completata" msgid "unterminated single-quoted string" -msgstr "" - -msgid "Invalid command syntax" -msgstr "" +msgstr "stringa in singoli apici non completata" msgid "too many arguments in command" -msgstr "" +msgstr "troppi argomenti nel comando" + +#, c-format +msgid "un-parseable argument #%u in command" +msgstr "argomento #%u non interpretabile nel comando" msgid "Malformed command" msgstr "Comando malformato" -#, fuzzy, c-format +#, c-format msgid "Unknown command: \"%s\"" -msgstr "Comando sconosciuto" +msgstr "Comando sconosciuto: \"%s\"" msgid "Help: " msgstr "Aiuto: " -msgid "Bitzi|Unknown" -msgstr "" - -msgid "Bitzi|Unrated" -msgstr "" - -msgid "Bitzi|Bitzi lookup failure" -msgstr "" - -msgid "Bitzi|Filesize mismatch" -msgstr "" - -msgid "Bitzi|Dangerous/Misleading" -msgstr "" - -msgid "Bitzi|Incomplete/Damaged" -msgstr "" - -msgid "Bitzi|Substandard" -msgstr "" - -msgid "Bitzi|Overrated" -msgstr "" - -msgid "Bitzi|Normal" -msgstr "" - -msgid "Bitzi|Underrated" -msgstr "" - -msgid "Bitzi|Complete" -msgstr "" - -msgid "Bitzi|Recommended" -msgstr "" - -msgid "Bitzi|Best Version" -msgstr "" - -msgid "No other data" -msgstr "" - msgid "Filename" msgstr "Nome del file" -#, fuzzy msgid "Created" -msgstr "Completati" +msgstr "Creato" msgid "Modified" -msgstr "" +msgstr "Modificato" msgid "SHA-1" -msgstr "" +msgstr "SHA-1" -#, fuzzy msgid "Not available" msgstr "Non disponibile" msgid "Bitprint" -msgstr "" +msgstr "Bitprint" #, c-format msgid "leaf hashes: %lu, depth: %u, granularity: %s" -msgstr "" +msgstr "hash foglia: %lu, profondità: %u, granularità: %s" msgid "Tigertree" -msgstr "" +msgstr "Tigertree" -msgid "External metadata" -msgstr "" +msgid "Rescheduled for" +msgstr "Riprogrammato per" -msgid "Bitzi URL" -msgstr "" +msgid "Restartable since" +msgstr "Rieseguibile da" + +msgid "rescheduled for" +msgstr "riprogrammato per" + +msgid "restartable since" +msgstr "rieseguibile da" #, c-format msgid " (slot %u" @@ -5192,20 +6527,20 @@ msgstr "Connesso" msgid "Push sent directly" -msgstr "Spinta inviata direttamente" +msgstr "Push inviato direttamente" msgid "Push sent" -msgstr "Spinta inviata" +msgstr "Push inviato" msgid "Failed to send push" -msgstr "Invio spinta fallito" +msgstr "Invio push fallito" msgid "Sending push" -msgstr "Invio spinta" +msgstr "Invio push" #, c-format msgid " via %s" -msgstr "" +msgstr " via %s" msgid "Sending request" msgstr "Invio richiesta" @@ -5216,15 +6551,14 @@ msgid "Reading headers" msgstr "Lettura titoli" -#, fuzzy msgid "UDP push sent" -msgstr "Spinta inviata" +msgstr "Push UDP inviato" msgid "Searching for new push-proxies" -msgstr "" +msgstr "Cercando i nuovi push-proxy" msgid "Falling back to push" -msgstr "" +msgstr "Ricadendo nel push" #, c-format msgid "Sending request (%u%%)" @@ -5245,31 +6579,30 @@ msgid "Chunk done" msgstr "Pezzo fatto" -#, fuzzy msgid "Waiting for TTH checking..." -msgstr "Attesa per controllo SHA1..." +msgstr "In attesa del controllo TTH..." msgid "Waiting for SHA1 checking..." msgstr "Attesa per controllo SHA1..." -#, fuzzy, c-format +#, c-format msgid "Computing %s (%.02f%%)" -msgstr "Calcolo SHA1 (%.02f%%)" +msgstr "Calcolando %s (%.02f%%)" msgid "TTH OK" -msgstr "" +msgstr "TTH OK" msgid "SHA-1 OK" -msgstr "" +msgstr "SHA-1 OK" msgid "SHA-1 MISMATCH" -msgstr "" +msgstr "SHA-1 INCONGRUENTE" msgid "SHA-1 calculated" -msgstr "" +msgstr "SHA-1 calcolato" msgid "SHA-1 VERIFICATION FAILED" -msgstr "" +msgstr "VERIFICA SHA-1 FALLITA" msgid "; Waiting for moving..." msgstr "; In attesa di spostamento..." @@ -5285,32 +6618,23 @@ msgid "(stalled)" msgstr "(in stallo)" -#, fuzzy msgid "Receiving data" -msgstr "Ricezione titoli" +msgstr "Ricezione dati" -#, fuzzy msgid "ignoring" -msgstr "in ingresso" +msgstr "ignorando" -#, fuzzy msgid "selected next" -msgstr "Proprietà selezionata:" +msgstr "successivo selezionato" -#, fuzzy msgid "requesting next" -msgstr "Richiesta inviata" +msgstr "richiedendo il successivo" -#, fuzzy msgid "requested next" -msgstr "Richiesta inviata" +msgstr "successivo richiesto" -#, fuzzy msgid "Awaiting data" -msgstr "In attesa" - -msgid "Unknown error" -msgstr "Errore sconosciuto" +msgstr "In attesa dei dati" #, c-format msgid "Retry in %us" @@ -5318,7 +6642,7 @@ #, c-format msgid "Sinking (%s bytes left)" -msgstr "" +msgstr "Sinking (%s bytes rimanenti)" #, c-format msgid "Forgot %u download" @@ -5326,23 +6650,20 @@ msgstr0 "Dimenticato %u scaricamento" msgstr1 "Dimenticati %u scaricamenti" -#, fuzzy msgid "Filename (filtered)" -msgstr "Filtro nome del file:" +msgstr "Nome file (filtrato)" msgid "Progress" msgstr "Progresso" msgid "RX" -msgstr "" +msgstr "RX" -#, fuzzy msgid "Downloaded" -msgstr "Scaricati:" +msgstr "Scaricato" -#, fuzzy msgid "Uploaded" -msgstr "Caricati:" +msgstr "Caricati" msgid "Sources" msgstr "Sorgenti" @@ -5353,26 +6674,24 @@ msgid "Active" msgstr "Attivi" -#, fuzzy msgid "Incomplete" -msgstr "Completo" +msgstr "Incompleti" msgid "Orphaned" -msgstr "" +msgstr "Orfani" msgid "All" -msgstr "" +msgstr "Tutti" -#, fuzzy, c-format +#, c-format msgid "regex error: %s" -msgstr "Errore lettura: %s" +msgstr "errore regex: %s" -#, fuzzy, c-format +#, c-format msgid "Selected %u of %u download matching \"%s\"." msgid_plural "Selected %u of %u downloads matching \"%s\"." -msgstr0 "Selezionato %u scaricamento di %u accodati corrispondenti a \"%s\"." -msgstr1 "" -"Selezionato %u scaricamenti di %u accodati corrispondenti a \\\"%s\\\"." +msgstr0 "Selezionato %u di %u download corrispondenti a \"%s\"." +msgstr1 "Selezionati %u di %u download corrispondenti a \"%s\"." msgid "starts with" msgstr "inizia con" @@ -5392,9 +6711,8 @@ msgid "is exactly" msgstr "è esattamente" -#, fuzzy msgid "Built-in targets" -msgstr "Destinatari builtin (non modificabili)" +msgstr "Obiettivi incorporati" msgid "Global filters" msgstr "Filtri globali" @@ -5415,7 +6733,7 @@ msgstr "nessun filtro predefinito" msgid "no hash" -msgstr "" +msgstr "nessun hash" msgid "Filter" msgstr "Filtro" @@ -5427,7 +6745,7 @@ msgstr "Corrisponde" msgid "!" -msgstr "" +msgstr "!" msgid "Condition" msgstr "Condizione" @@ -5496,10 +6814,10 @@ msgstr "non è impostato occupato" msgid "push is set" -msgstr "è impostata la spinta" +msgstr "push impostato" msgid "push is not set" -msgstr "non è impostata la spinta" +msgstr "push non impostato" msgid "stable is set" msgstr "è impostato stabile" @@ -5515,22 +6833,22 @@ msgstr "Sempre (tutte le flag sono ignorate)" msgid "DISPLAY is undefined" -msgstr "" +msgstr "MOSTRA non è definito" msgid "DISPLAY" -msgstr "" +msgstr "MOSTRA" msgid "DON'T DISPLAY" -msgstr "" +msgstr "NON MOSTRARE" msgid "DOWNLOAD is undefined" -msgstr "" +msgstr "DOWNLOAD non è definito" msgid "DOWNLOAD" -msgstr "" +msgstr "DOWNLOAD" msgid "DON'T DOWNLOAD" -msgstr "" +msgstr "NON SCARICARE" #, c-format msgid "If flag %s%s%s" @@ -5550,23 +6868,22 @@ msgstr "(disattivato)" msgid "(invalid)" -msgstr "(invalido)" +msgstr "(non valido)" -#, fuzzy msgid "<Archive>" -msgstr "Attivi" +msgstr "<Archivio>" msgid "<Audio>" -msgstr "" +msgstr "<Audio>" msgid "<Image>" -msgstr "" +msgstr "<Immagine>" msgid "<Literature>" -msgstr "" +msgstr "<Letteratura>" msgid "<Video>" -msgstr "" +msgstr "<Video>" msgid "Global (pre)" msgstr "Globale (pre)" @@ -5575,641 +6892,7 @@ msgstr "Globale (post)" msgid "RETURN" -msgstr "" - -msgid "Query hit" -msgstr "Tentativi query" - -msgid "DHT (truncated)" -msgstr "" - -msgid "Routing errors" -msgstr "Errore instradamento" - -#, fuzzy -msgid "Routing table chunks" -msgstr "Numero di generazione della tabella di instradamento delle query." - -msgid "Routing table message capacity" -msgstr "" - -msgid "Routing table message count" -msgstr "" - -msgid "Duplicates with higher TTL" -msgstr "" - -msgid "SPAM SHA1 database hits" -msgstr "" - -#, fuzzy -msgid "SPAM filename and size hits" -msgstr "Se il nome del file termina con \"%s\" %s" - -msgid "SPAM fake hits" -msgstr "" - -msgid "SPAM duplicate hits" -msgstr "" - -msgid "SPAM dynamically caught hostile IP addresses" -msgstr "" - -msgid "SPAM dynamically caught hostile IP held" -msgstr "" - -msgid "SPAM spotted spamming IP addresses held" -msgstr "" - -msgid "Searches to local DB" -msgstr "Ricerche nel DB locale" - -msgid "Hits on local DB" -msgstr "Tentativi nel DB locale" - -#, fuzzy -msgid "Hits on local partial files" -msgstr "Tentativi nel DB locale" - -msgid "Hits on \"what's new?\" queries" -msgstr "" - -msgid "Query hits received for local queries" -msgstr "Tentativi di query ricevuti da query locali" - -msgid "Query hits received for OOB-proxied queries" -msgstr "" - -msgid "Queries requesting OOB hit delivery" -msgstr "" - -msgid "Stripped OOB flag on queries" -msgstr "" - -msgid "Duplicate OOB-proxied queries" -msgstr "" - -msgid "OOB hits received for OOB-proxied queries" -msgstr "" - -msgid "OOB hits bearing alien IP address" -msgstr "" - -msgid "OOB hits ignored due to identified spamming address" -msgstr "" - -msgid "Unclaimed locally-generated OOB hits" -msgstr "" - -msgid "Partially claimed locally-generated OOB hits" -msgstr "" - -msgid "Spurious OOB hit claiming received" -msgstr "" - -msgid "Unrequested OOB hits received" -msgstr "" - -msgid "Received query hits for untracked queries" -msgstr "" - -msgid "Tracked query MUIDs" -msgstr "" - -msgid "Compacted queries" -msgstr "" - -msgid "Bytes saved by compacting" -msgstr "" - -msgid "UTF8 queries" -msgstr "" - -msgid "SHA1 queries" -msgstr "" - -#, fuzzy -msgid "\"What's New?\" queries" -msgstr "Query generate" - -#, fuzzy -msgid "GUESS queries" -msgstr "Query RX" - -#, fuzzy -msgid "GUESS queries (0.2)" -msgstr "Query RX" - -msgid "GUESS cached query keys held" -msgstr "" - -msgid "GUESS cached 0.2 hosts held" -msgstr "" - -#, fuzzy -msgid "GUESS locally generated queries" -msgstr "Query generate" - -msgid "GUESS currently running queries" -msgstr "" - -#, fuzzy -msgid "GUESS hits received for locally generated queries" -msgstr "Tentativi di query ricevuti da query locali" - -msgid "GUESS hosts queried" -msgstr "" - -msgid "GUESS hosts sending back an acknowledgment" -msgstr "" - -msgid "Broadcasted push messages" -msgstr "" - -msgid "Push-proxy UDP relayed messages" -msgstr "" - -msgid "Push-proxy TCP relayed messages" -msgstr "" - -msgid "Push-proxy broadcasted messages" -msgstr "" - -msgid "Push-proxy found un-proxied local route" -msgstr "" - -msgid "Push-proxy lookup failures" -msgstr "" - -msgid "Push relayed via local route" -msgstr "" - -msgid "Push relayed via routing table" -msgstr "" - -msgid "Locally generated dynamic queries" -msgstr "" - -msgid "Leaf-generated dynamic queries" -msgstr "" - -msgid "OOB-proxied leaf queries" -msgstr "" - -msgid "Fully completed dynamic queries" -msgstr "" - -msgid "Partially completed dynamic queries" -msgstr "" - -msgid "Dynamic queries ended with no results" -msgstr "" - -msgid "Fully completed dynamic queries getting late results" -msgstr "" - -msgid "Dynamic queries with partial late results" -msgstr "" - -msgid "Dynamic queries completed by late results" -msgstr "" - -msgid "Queries seen from GTKG" -msgstr "" - -msgid "Queries seen from GTKG that were re-queries" -msgstr "" - -msgid "Queries advertising support of GGEP \"H\"" -msgstr "" - -msgid "GIV callbacks received" -msgstr "" - -msgid "GIV discarded due to no suitable download" -msgstr "" - -msgid "QUEUE callbacks received" -msgstr "" - -msgid "QUEUE discarded due to no suitable download" -msgstr "" - -msgid "UDP messages with bogus source IP" -msgstr "" - -msgid "Alien UDP messages (non-Gnutella)" -msgstr "" - -msgid "Unprocessed UDP Gnutella messages" -msgstr "" - -msgid "Compressed UDP messages enqueued" -msgstr "" - -msgid "Compressed UDP messages received" -msgstr "" - -msgid "Uncompressed UDP messages due to no gain" -msgstr "" - -msgid "Consolidated servers (after GUID and IP address linking)" -msgstr "" - -msgid "Duplicate downloads found during server consolidation" -msgstr "" - -msgid "Discovered server GUIDs" -msgstr "" - -msgid "Changed server GUIDs" -msgstr "" - -msgid "Detected GUID collisions" -msgstr "" - -msgid "Detected collisions with our own GUID" -msgstr "" - -msgid "GUID dynamically banned" -msgstr "" - -msgid "Firewalled node info for known hosts received in upload requests" -msgstr "" - -msgid "Revitalized PUSH routes" -msgstr "" - -msgid "Collected new PUSH proxies from other query hits" -msgstr "" - -msgid "Attempted download resource switching on completion" -msgstr "" - -msgid "Attempted download resource switching after error" -msgstr "" - -msgid "Successful download resource switching (all kind)" -msgstr "" - -msgid "Successful download resource switching between plain files" -msgstr "" - -msgid "Successful download resource switching after error" -msgstr "" - -msgid "Actively queued after resource switching attempt" -msgstr "" - -msgid "Sunk HTTP reply data on error codes" -msgstr "" - -#, fuzzy -msgid "Ignored downloaded data" -msgstr "Dati scaricati:" - -#, fuzzy -msgid "Ignoring requested after data mismatch" -msgstr "Invio richiesta (%u%%)" - -#, fuzzy -msgid "Ignoring requested to preserve connection" -msgstr "Invio richiesta (%u%%)" - -msgid "Ignoring requested due to aggressive swarming" -msgstr "" - -msgid "Ignoring refused (data too large or server too slow)" -msgstr "" - -msgid "Client resource switching (all detected)" -msgstr "" - -msgid "Client resource switching between plain files" -msgstr "" - -msgid "Client follow-up request after HTTP error was returned" -msgstr "" - -msgid "PARQ client resource switching in slots (SHA-1 based)" -msgstr "" - -msgid "PARQ client retry-after violation" -msgstr "" - -msgid "PARQ client kicked out after too many retry-after violations" -msgstr "" - -msgid "PARQ upload slot limit overrides" -msgstr "" - -msgid "PARQ quick upload slots granted" -msgstr "" - -msgid "PARQ QUEUE sending attempts" -msgstr "" - -msgid "PARQ QUEUE messages sent" -msgstr "" - -msgid "PARQ QUEUE follow-up requests received" -msgstr "" - -msgid "Launched SHA-1 file verifications" -msgstr "" - -msgid "Launched TTH file verifications" -msgstr "" - -msgid "Bitzi tickets held" -msgstr "" - -msgid "Re-seeding of orphan downloads through query hits" -msgstr "" - -msgid "Re-seeding of orphan downloads through upload requests" -msgstr "" - -msgid "DHT estimated amount of nodes" -msgstr "" - -msgid "DHT k-ball theoretical frontier (bits)" -msgstr "" - -msgid "DHT k-ball furthest frontier (bits)" -msgstr "" - -msgid "DHT k-ball closeest frontier (bits)" -msgstr "" - -msgid "DHT routing table buckets" -msgstr "" - -msgid "DHT routing table leaves" -msgstr "" - -msgid "DHT routing table maximum depth" -msgstr "" - -#, fuzzy -msgid "DHT routing table good nodes" -msgstr "Numero di generazione della tabella di instradamento delle query." - -msgid "DHT routing table stale nodes" -msgstr "" - -#, fuzzy -msgid "DHT routing table pending nodes" -msgstr "Numero di generazione della tabella di instradamento delle query." - -msgid "DHT routing table evicted nodes" -msgstr "" - -msgid "DHT routing table evicted firewalled nodes" -msgstr "" - -#, fuzzy -msgid "DHT routing table evicted nodes due to quota" -msgstr "Numero di generazione della tabella di instradamento delle query." - -msgid "DHT routing table promoted pending nodes" -msgstr "" - -#, fuzzy -msgid "DHT routing table pinged promoted nodes" -msgstr "Numero di generazione della tabella di instradamento delle query." - -msgid "DHT routing table rejected node due to bucket network quota" -msgstr "" - -msgid "DHT routing table rejected node due to global network quota" -msgstr "" - -msgid "DHT completed bucket refreshes" -msgstr "" - -msgid "DHT forced bucket refreshes" -msgstr "" - -#, fuzzy -msgid "DHT forced bucket merges" -msgstr "Comando malformato" - -msgid "DHT denied non-splitable bucket refresh" -msgstr "" - -msgid "DHT initiated bucket alive checks" -msgstr "" - -msgid "DHT alive pings sent to good nodes" -msgstr "" - -msgid "DHT alive pings sent to stale nodes" -msgstr "" - -msgid "DHT alive pings sent to shutdowning nodes" -msgstr "" - -msgid "DHT alive pings avoided" -msgstr "" - -msgid "DHT alive pings skipped" -msgstr "" - -msgid "DHT revitalized stale nodes on RPC reply" -msgstr "" - -msgid "DHT value store rejected on IP/network quota grounds" -msgstr "" - -msgid "DHT value store rejected on creator validation grounds" -msgstr "" - -msgid "DHT nodes rejected during lookup based on network quota" -msgstr "" - -msgid "DHT nodes rejected during lookup based on suspicious proximity" -msgstr "" - -msgid "DHT nodes rejected during lookup based on frequency divergence" -msgstr "" - -msgid "DHT keys held" -msgstr "" - -msgid "DHT cached keys held" -msgstr "" - -msgid "DHT values held" -msgstr "" - -msgid "DHT cached KUID targets held" -msgstr "" - -msgid "DHT cached closest root nodes" -msgstr "" - -msgid "DHT cached roots exact hits" -msgstr "" - -msgid "DHT cached roots approximate hits" -msgstr "" - -msgid "DHT cached roots misses" -msgstr "" - -msgid "DHT cached roots lookups within k-ball" -msgstr "" - -msgid "DHT cached roots contact address refreshed" -msgstr "" - -msgid "DHT cached security tokens held" -msgstr "" - -msgid "DHT cached security tokens hits" -msgstr "" - -#, fuzzy -msgid "DHT stable node information held" -msgstr "Informazione dettagliata" - -msgid "DHT local hits on value lookups" -msgstr "" - -msgid "DHT local hits returning values from cached keys" -msgstr "" - -msgid "DHT returned expanded values" -msgstr "" - -msgid "DHT returned values as secondary keys" -msgstr "" - -#, fuzzy -msgid "DHT claimed values via secondary keys" -msgstr "Timeout (valori in secondi)" - -msgid "DHT returned cached expanded values" -msgstr "" - -msgid "DHT returned cached values as secondary-keys" -msgstr "" - -#, fuzzy -msgid "DHT claimed cached values via secondary keys" -msgstr "Timeout (valori in secondi)" - -msgid "DHT successfully received value publications" -msgstr "" - -msgid "DHT successfully received value removals" -msgstr "" - -msgid "DHT replication of stale value avoided" -msgstr "" - -msgid "DHT replication of held values" -msgstr "" - -msgid "DHT republishing of held values" -msgstr "" - -msgid "DHT secondary-key value fetch issued" -msgstr "" - -msgid "DHT duplicate values returned in lookups" -msgstr "" - -msgid "DHT detected KUID collisions" -msgstr "" - -msgid "DHT detected collisions with our own KUID" -msgstr "" - -msgid "DHT detected KUID mismatches on RPC reply" -msgstr "" - -msgid "DHT caching attempts" -msgstr "" - -msgid "DHT caching ended successfully" -msgstr "" - -msgid "DHT caching partially completed" -msgstr "" - -msgid "DHT key-offloading checks after discovering new closest node" -msgstr "" - -msgid "DHT keys selected for offloading" -msgstr "" - -msgid "DHT key-offloading attempts" -msgstr "" - -msgid "DHT key-offloading ended successfully" -msgstr "" - -msgid "DHT key-offloading partially completed" -msgstr "" - -msgid "DHT values successfully offloaded" -msgstr "" - -msgid "DHT publishing attempts" -msgstr "" - -msgid "DHT publishing ended successfully (all roots)" -msgstr "" - -msgid "DHT publishing partially completed (root subset only)" -msgstr "" - -msgid "DHT publishing ending with proper value presence" -msgstr "" - -msgid "DHT value republishing occurring too late (after expiry)" -msgstr "" - -msgid "DHT publishing to self" -msgstr "" - -msgid "DHT background publishing completion attempts" -msgstr "" - -msgid "DHT background publishing completion showing improvements" -msgstr "" - -msgid "DHT background publishing completion successful (all roots)" -msgstr "" - -msgid "DHT SHA1 data type collisions" -msgstr "" - -msgid "DHT lookup path passively protected against attack" -msgstr "" - -msgid "DHT lookup path actively protected against attack" -msgstr "" - -msgid "DHT alt-loc lookups issued" -msgstr "" - -msgid "DHT push-proxy lookups issued" -msgstr "" - -msgid "DHT successful alt-loc lookups" -msgstr "" - -msgid "DHT successful push-proxy lookups" -msgstr "" - -msgid "DHT successful node push-entry lookups" -msgstr "" - -msgid "DHT re-seeding of orphan downloads" -msgstr "" +msgstr "RITORNO" msgid "node" msgid_plural "nodes" @@ -6261,15 +6944,13 @@ msgstr " con i sorgenti" msgid "$Id$" -msgstr "" +msgstr "$Id$" -#, fuzzy msgid "%v/%u (%P%%)" -msgstr "%u/%u host (%u%%)" +msgstr "%v/%u (%P%%)" -#, fuzzy msgid "%v/%u Gnutella peers" -msgstr "%v/%u nodi Gnet" +msgstr "%v/%u peer Gnutella" msgid "%v/%u downloads" msgstr "%v/%u scaricamenti" @@ -6277,9 +6958,8 @@ msgid "%v/%u uploads" msgstr "%v/%u caricamenti" -#, fuzzy msgid "(Disable: 0, Random: 1)" -msgstr "Disabilita: 0, Casuale: 1" +msgstr "(Disabilita: 0, Casuale: 1)" msgid "(no search)" msgstr "(nessuna ricerca)" @@ -6303,6 +6983,8 @@ "A filter cannot be removed if it is bound to a search or if it is in use " "(used as a target in a rule)." msgstr "" +"Un filtro non può essere rimosso se legato a una ricerca o se in uso (usato " +"come target in una regola)." msgid "A passive search matches any search results routed through this node" msgstr "" @@ -6354,7 +7036,7 @@ msgstr "Aggiungi" msgid "Aliases" -msgstr "Sininimi" +msgstr "Alias" msgid "Allow connections from and to _LAN addresses" msgstr "Consenti connessioni da e a indirizzi _LAN" @@ -6385,12 +7067,11 @@ msgid "Auto clear failed uploads" msgstr "Ripulisci automaticamente dai caricamenti falliti" -#, fuzzy msgid "Automatically clear finished files" -msgstr "Ripulisci automaticamente gli scaricamenti fermati" +msgstr "Ripulisci automaticamente i file completati" msgid "Automatically clear sources when..." -msgstr "" +msgstr "Ripulisci automaticamente le sorgenti quando..." msgid "Available bandwidth" msgstr "Banda disponibile" @@ -6402,28 +7083,25 @@ msgstr "Media tempo tra modifiche di indirizzo IP:" msgid "Avg. uptime of this servent:" -msgstr "Media attività di questo server:" +msgstr "Attività media di questo servent:" -#, fuzzy msgid "Avg. downtime of this servent:" -msgstr "Media attività di questo server:" +msgstr "Tempo di inattività medio di questo servent:" msgid "Bad hosts" msgstr "Host sbagliati" -#, fuzzy msgid "Bandwidth limits for Gnutella traffic" -msgstr "Limite di banda per il traffico della rete Gnutella" +msgstr "Limiti di banda per il traffico Gnutella" msgid "Bandwidth limits for HTTP traffic" msgstr "Limite di banda per il traffico HTTP" -#, fuzzy msgid "Bandwidth limits for the Distributed Hash Table" -msgstr "Livello di collaudo per il codice condiviso dei file." +msgstr "Limiti di banda per la Distributed Hash Table" msgid "Bandwidth targets for node lookups" -msgstr "" +msgstr "Obiettivi di larghezza di banda per lookup di nodi" msgid "Bandwidth" msgstr "Banda" @@ -6432,24 +7110,14 @@ msgstr "Scartamento" msgid "Beautify filenames by removing needless underscores" -msgstr "" +msgstr "Abbellisci i nomi dei file eliminando i trattini bassi non necessari" -#, fuzzy msgid "Bind to this address" -msgstr "Indirizzo di ritorno errato" - -#, fuzzy -msgid "Bitzi Metadata" -msgstr "Metadati bitzi" - -#, fuzzy -msgid "Bitzi metadata" -msgstr "Metadati bitzi" +msgstr "Collega a questo indirizzo" msgid "Browse Host" msgstr "Sfoglia l'host" -#, fuzzy msgid "Browse host" msgstr "Sfoglia l'host" @@ -6460,7 +7128,7 @@ msgstr "Byte da eliminare in caso di errore" msgid "Cache" -msgstr "" +msgstr "Cache" msgid "Cancel" msgstr "Cancella" @@ -6490,9 +7158,8 @@ msgid "Clear non-existent files" msgstr "Ripulisci dai file inesistenti" -#, fuzzy msgid "Clear results" -msgstr "Pulis_ci risultati" +msgstr "Ripulisci i risultati" msgid "Clear stopped" msgstr "Ripulisci fermati" @@ -6509,7 +7176,6 @@ msgid "Clock synchronization" msgstr "Sincronizzazione orologio" -#, fuzzy msgid "Close" msgstr "Chiudi" @@ -6565,9 +7231,8 @@ msgid "Connectin_g timeout" msgstr "Timeo_ut in fase di connessione" -#, fuzzy msgid "Connection counters" -msgstr "Timeo_ut in fase di connessione" +msgstr "Connessioni" msgid "Connection settings" msgstr "Impostazioni connessione" @@ -6588,9 +7253,8 @@ msgid "Convert spaces to underscores in generated filenames" msgstr "Nei nomi dei file generati converti gli spazi in sottolineature" -#, fuzzy msgid "Copy Magnet to clipboard" -msgstr "Copia negli appunti" +msgstr "Copia il Magnet negli appunti" msgid "Copy URL to clipboard" msgstr "Copia l'URL negli appunti" @@ -6598,9 +7262,8 @@ msgid "Copy browse-host results to passive searches" msgstr "Copia i risultati di consultazione host nelle ricerche passive" -#, fuzzy msgid "Copy magnet to clipboard" -msgstr "Copia negli appunti" +msgstr "Copia il magnet negli appunti" msgid "Copy rule" msgstr "Copia regola" @@ -6629,16 +7292,14 @@ msgid "Currently used" msgstr "Attualmente usato" -#, fuzzy msgid "DHT traffic stats" -msgstr "statistiche traffico _HTTP" +msgstr "Statistiche traffico DHT" -#, fuzzy msgid "DHT traffic" -msgstr "Traffico HTTP" +msgstr "Traffico DHT" msgid "Debugging" -msgstr "" +msgstr "Debug in corso" msgid "Default search _reissue timeout" msgstr "Ritardo predefinito _ripetizione ricerca" @@ -6664,21 +7325,20 @@ msgid "Delete file on abort" msgstr "Elimina il file in caso di annullamento" -#, fuzzy msgid "Delete file on mismatch" -msgstr "Elimina il file in caso di errore" +msgstr "Cancella il file se non corrispondente" msgid "Detailed traffic information to display" msgstr "Informazioni dettagliate sul traffico da mostrare" msgid "Details" -msgstr "" +msgstr "Dettagli" msgid "Discard results without SHA-1 hashes" -msgstr "" +msgstr "Scarta i risultati senza hash SHA-1" msgid "Discard spam" -msgstr "" +msgstr "Scarta lo spam" msgid "Disconnect from selected nodes" msgstr "Disconnetti dai nodi selezionati" @@ -6695,9 +7355,8 @@ msgid "Do you really want to quit?" msgstr "Vuoi veramente uscire?" -#, fuzzy msgid "Download" -msgstr "Scaricamenti" +msgstr "Download" msgid "Downloaded:" msgstr "Scaricati:" @@ -6709,13 +7368,13 @@ msgstr "Scaricamenti" msgid "Dropped" -msgstr "Rilasciati" +msgstr "Abbandonati" msgid "Dup / Bad / Weird" msgstr "Duplicati/sbagliati/strani" msgid "E_xpose relative paths" -msgstr "" +msgstr "E_sponi i percorsi relativi" msgid "Edit value:" msgstr "Modifica valore:" @@ -6723,9 +7382,8 @@ msgid "Enable \"_Browse Host\" feature" msgstr "Abilita funzionalità \"Co_nsulta host\"" -#, fuzzy msgid "Enable _DHT" -msgstr "Abilita _UDP" +msgstr "Abilita _DHT" msgid "Enable _UDP" msgstr "Abilita _UDP" @@ -6733,9 +7391,8 @@ msgid "Enable dynamic upload slots _allocation" msgstr "Abilita _allocazione dinamica delle posizioni dei caricamenti" -#, fuzzy msgid "Enable remote _shell control interface" -msgstr "Abilita interfaccia di controllo \"_terminale\"" +msgstr "Attiva l'interfaccia di controllo della _shell remota" msgid "Enable s_warming" msgstr "Abilita f_rammentazione" @@ -6744,7 +7401,7 @@ msgstr "Abilita caricamento dei file solo _parzialmente scaricati" msgid "Enough UDP support" -msgstr "" +msgstr "Abbastanza supporto UDP" msgid "Enough available bandwidth" msgstr "Banda disponibile sufficente" @@ -6777,7 +7434,7 @@ msgstr "Spirati" msgid "FC/_TTL" -msgstr "" +msgstr "FC/_TTL" msgid "FC/_hops" msgstr "FC/_salti" @@ -6785,9 +7442,8 @@ msgid "File scanning time:" msgstr "Tempo di lettura del file:" -#, fuzzy msgid "File transfers" -msgstr "_Trasferimenti" +msgstr "Trasferimenti file" msgid "Files scanned" msgstr "File trovati (scanned)" @@ -6799,7 +7455,7 @@ msgstr "Posizioni riempite:" msgid "Filter files by regex" -msgstr "" +msgstr "Filtra i file mediante regex" msgid "First chunk _size" msgstr "Dimensione _primo pezzo" @@ -6808,17 +7464,16 @@ msgstr "Flag" msgid "Force external IPv_4 address to" -msgstr "" +msgstr "Forza indirizzo esterno IPv_4 a" msgid "Force external IPv_6 address to" -msgstr "" +msgstr "Forza indirizzo esterno IPv_6 a" msgid "Force push mode" -msgstr "Forza modalità spinta" +msgstr "Forza modalità push" -#, fuzzy msgid "Forget" -msgstr "Destinatario" +msgstr "DImentica" msgid "" "Forwarded\n" @@ -6840,10 +7495,10 @@ msgstr "Sviluppo GUI:" msgid "GUID:" -msgstr "" +msgstr "GUID:" msgid "KUID:" -msgstr "" +msgstr "KUID:" msgid "Gen. queued" msgstr "Gen. accodati" @@ -6863,44 +7518,35 @@ msgid "Generation:" msgstr "Generazione:" -#, fuzzy msgid "Global DHT outgoing traffic" -msgstr "Traffico in _uscita" +msgstr "Traffico DHT globale in uscita" -#, fuzzy msgid "Gnutella TTL settings" -msgstr "Impostazioni TTL di GnutellaNet" +msgstr "Impostazioni TTL Gnutella" -#, fuzzy msgid "Gnutella _leaf traffic stats" -msgstr "Statistiche traffico _foglia Gnet" +msgstr "Statistiche traffico _foglia Gnutella" -#, fuzzy msgid "Gnutella display" -msgstr "Statistiche Gnutella" +msgstr "Visualizzazione Gnutella" -#, fuzzy msgid "Gnutella message size limits" -msgstr "Limiti dimensioni messaggi rete Gnutella" +msgstr "Limiti dimensione messaggio Gnutella" msgid "Gnutella network mode" msgstr "Modalità rete Gnutella" -#, fuzzy msgid "Gnutella peers" -msgstr "Rete Gnutella" +msgstr "Peer Gnutella" -#, fuzzy msgid "Gnutella timeouts (all values in seconds)" -msgstr "Timeout della rete Gnutella (tutti i valori sono in secondi)" +msgstr "Tempo scaduto Gnutella (tutti i valori in secondi)" -#, fuzzy msgid "Gnutella traffic" -msgstr "Traffico GnutellaNet" +msgstr "Traffico Gnutella" -#, fuzzy msgid "Gnutella" -msgstr "Rete Gnutella" +msgstr "Gnutella" msgid "HTTP traffic" msgstr "Traffico HTTP" @@ -6909,7 +7555,7 @@ msgstr "Limite TTL h_ard" msgid "H_ost:" -msgstr "" +msgstr "H_ost:" msgid "Hard limit of _file descriptors used" msgstr "Limite hard delle descrizioni di _file utilizzate" @@ -6932,13 +7578,13 @@ msgstr "L'host usa _NTP" msgid "Host" -msgstr "" +msgstr "Host" msgid "Hostcache capacity" msgstr "Capacità cache dell'host" msgid "Hostcache" -msgstr "Cache host" +msgstr "Cache" msgid "Hosts" msgstr "Host" @@ -6955,13 +7601,11 @@ msgid "IP:Port:" msgstr "IP:Porta:" -#, fuzzy msgid "IPv4 settings" -msgstr "Impostazioni IP" +msgstr "Impostazioni IPv4" -#, fuzzy msgid "IPv6 settings" -msgstr "Impostazioni IP" +msgstr "Impostazioni IPv6" msgid "Ignore symbolically linked _directories" msgstr "Ignora le carte_lle con collegamenti simbolici" @@ -6973,7 +7617,7 @@ msgstr "I file ignorati sono" msgid "Incoming connecting timeout" -msgstr "Timeout connessioni in ingresso" +msgstr "Tempo scaduto connessioni in ingresso" msgid "Incoming traffic from _leaves" msgstr "Traffico in arrivo dalle _foglie" @@ -6982,13 +7626,13 @@ msgstr "Indicizzazione avviata per:" msgid "Info" -msgstr "" +msgstr "Info" msgid "Input bandwidth average" -msgstr "" +msgstr "Banda media in ingresso" msgid "Jeroen Asselman" -msgstr "" +msgstr "Jeroen Asselman" msgid "Join the users or developers mailing lists." msgstr "Registrati alla lista degli utenti o a quella degli sviluppatori." @@ -7000,28 +7644,25 @@ msgstr "Parole chiave:" msgid "KiB" -msgstr "" +msgstr "KiB" msgid "KiB/s" -msgstr "" +msgstr "KiB/s" msgid "Large enough uptime" msgstr "Tempo di attività sufficente" -#, fuzzy msgid "Last Request" -msgstr "Ultimo scambio" +msgstr "Ultima richiesta" -#, fuzzy msgid "Last Upload" -msgstr "Caricamenti" +msgstr "Ultimo caricamento" msgid "Last check" msgstr "Ultimo controllo" -#, fuzzy msgid "Last chunk size" -msgstr "Dimensione _primo pezzo" +msgstr "Dimensione dell'ultimo pezzo" msgid "Last scan initiated on:" msgstr "Ultima lettura iniziata alle:" @@ -7075,7 +7716,7 @@ msgstr "_TTL max" msgid "Max connections allowed per unique vendor" -msgstr "Numero massimo connessioni concesse ad un unico offerente" +msgstr "Numero massimo connessioni concesse ad un unico programma" msgid "Max hard TTL limit (hop+ttl) on message" msgstr "Limite TTL hard massimo (salto+tt1) sul messaggio" @@ -7095,17 +7736,14 @@ msgid "Max. number of browse host results" msgstr "Numero massimo risultati di consultazione host" -#, fuzzy msgid "Max. number of passive results" -msgstr "_Numero massimo di risultati" +msgstr "Numero massimo dei risultati passivi" -#, fuzzy msgid "Max. number of What's New? results" -msgstr "_Numero massimo di risultati" +msgstr "Numero massimo di risultati \"Novità?\"" -#, fuzzy msgid "Max. simultaneous downloads per file" -msgstr "Numero massimo scaricamenti simultanei" +msgstr "Download massimi simultanei per file" msgid "Max. simultaneous downloads" msgstr "Numero massimo scaricamenti simultanei" @@ -7128,7 +7766,8 @@ msgstr "Numero massimo di _tentativi" msgid "Maximum seconds to wait on auto-retry timeouts" -msgstr "Massimo numero di secondi di attesa nei ri-tentativi dopo i timeout" +msgstr "" +"Massimo numero di secondi di attesa nei ri-tentativi dopo tempo scaduto" msgid "Maximum size:" msgstr "Dimensione massima:" @@ -7150,7 +7789,7 @@ msgstr "Raggiungici su #gtk-gnutella at irc.freenode.net" msgid "Min/Max:" -msgstr "" +msgstr "Min/Max:" msgid "Minimum chunk size" msgstr "Dimensione minima pezzo" @@ -7159,7 +7798,7 @@ msgstr "Dimensione file minima" msgid "Minimum seconds to wait on auto-retry timeouts" -msgstr "Minimo numero di secondi di attesa nei ri-tentativi dopo i timeout" +msgstr "Minimo numero di secondi di attesa nei ri-tentativi dopo tempo scaduto" msgid "Minimum size:" msgstr "Dimensione minima:" @@ -7177,7 +7816,7 @@ msgstr "Persi" msgid "Monitor and auto-ban unstable servent types" -msgstr "Controlla e auto escludi i tipi di server instabili" +msgstr "Controlla e auto escludi servent instabili" msgid "Monitor bad node IP addresses" msgstr "Controlla gli indirizzi IP sbagliati dei nodi" @@ -7198,7 +7837,7 @@ msgstr "Rete" msgid "Never send a push request" -msgstr "Non inviare mai richiesta di spinta" +msgstr "Non inviare mai richiesta di push" msgid "New" msgstr "Nuovo" @@ -7211,20 +7850,21 @@ msgid "Number of seconds before timeout for a 'push sent' download" msgstr "" -"Numero di secondi prima del timeout per uno scaricamento 'inviato' (push " +"Numero di secondi prima della scadenza per uno scaricamento 'inviato' (push " "sent)" msgid "Number of seconds before timeout for a connected download" -msgstr "Numero di secondi prima del timeout per uno scaricamento attivo" +msgstr "Numero di secondi prima della scadenza per uno scaricamento attivo" msgid "Number of seconds before timeout for a connecting download" -msgstr "Numero di secondi prima del timeout per un tentativo di scaricamento" +msgstr "" +"Numero di secondi prima della scadenza per un tentativo di scaricamento" msgid "Number of tolerable _duplicate messages per node" msgstr "Numero tollerabile di messaggi _duplicati per nodo" msgid "Ok" -msgstr "" +msgstr "Ok" msgid "Optimistic first _chunk" msgstr "Calcolo ottimisti_co del primo pezzo" @@ -7244,18 +7884,17 @@ msgid "Outgoing traffic to lea_ves" msgstr "Traffico in uscita per fo_glie" -#, fuzzy msgid "Output bandwidth average" -msgstr "Limite complessivo della banda in uscita" +msgstr "Banda media in uscita" msgid "PARQ development:" msgstr "Sviluppo PARQ" msgid "Partial File Sharing" -msgstr "Condivisione parziale file" +msgstr "Condivisione di File Parziali" msgid "Pass_word" -msgstr "" +msgstr "Pass_word" msgid "Paste rule" msgstr "Incolla regola" @@ -7263,9 +7902,8 @@ msgid "Patch generation started on:" msgstr "Generazione patch avviata alle:" -#, fuzzy msgid "Pause" -msgstr "Spinta" +msgstr "Pausa" msgid "Pending local queries" msgstr "Query locali in attesa" @@ -7285,8 +7923,9 @@ "People can connect to you, using both TCP and UDP. Push should work and you " "will be able to receive out-of-band results for your queries." msgstr "" -"Gli altri possono connettersi con te usando sia TCP che UDP. La spinta " -"funziona e sarai in grado di ricevere risultati fuori banda per le tue query." +"Gli altri possono connettersi con te usando sia TCP che UDP. Il push " +"dovrebbe funzionare e sarai in grado di ricevere risultati fuori banda per " +"le tue query." msgid "Ping / Pong round trip" msgstr "Tempi giro ping / pong" @@ -7307,7 +7946,7 @@ msgstr "Leader del progetto:" msgid "Property browser" -msgstr "Proprietà browser" +msgstr "Elenco delle proprietà" msgid "Property pattern:" msgstr "Modello proprietà:" @@ -7346,13 +7985,13 @@ msgstr "Dettagli accodamento" msgid "Quick-connect pool size" -msgstr "" +msgstr "Dimensione della riserva per connessione rapida" msgid "RX compression" msgstr "Compressione RX" msgid "RX dropped" -msgstr "RX rilasciati" +msgstr "RX abbandonati" msgid "RX flow control ratio" msgstr "Livello controllo di flusso RX" @@ -7370,10 +8009,10 @@ msgstr "Byte cavo RX" msgid "Range" -msgstr "Intervallo" +msgstr "Range" msgid "Raphael Manfredi" -msgstr "" +msgstr "Raphael Manfredi" msgid "Ratio of tolerable duplicate messages per _node" msgstr "Livello di tollerabilità della duplicazione dei messaggi per _nodo" @@ -7382,7 +8021,7 @@ msgstr "Lunghezza grezza:" msgid "Re_try search every" -msgstr "Riprova la ricerca ogni" +msgstr "Riprova la _ricerca ogni" msgid "Reason" msgstr "Motivo" @@ -7394,7 +8033,7 @@ msgstr "Host regolari" msgid "Relayed" -msgstr "Collegati" +msgstr "Ritrasmessi" msgid "" "Remove all rules\n" @@ -7439,13 +8078,11 @@ "Azzera le statistiche\n" "di questo filtro" -#, fuzzy msgid "Restart" -msgstr "Azze_ra statistiche" +msgstr "Riavvia" -#, fuzzy msgid "Resu_me" -msgstr "Recupera" +msgstr "Ripre_ndi" msgid "Resume and retry" msgstr "Recupera e riprova" @@ -7463,19 +8100,19 @@ msgstr "Ritardo riproposizione arrestati" msgid "Retry timeout delay" -msgstr "Ritardo riproposizione timeout" +msgstr "Tempo da attendere per riprovare" msgid "Retry timeout max" -msgstr "Ritardo massimo timeout" +msgstr "Tempo massimo per riprovare" msgid "Retry timeout min" -msgstr "Ritardo minimo timeout" +msgstr "Tempo minimo per riprovare" msgid "Revert" msgstr "Ripristina" msgid "Richard Eckart" -msgstr "" +msgstr "Richard Eckart" msgid "Rules" msgstr "Regole" @@ -7493,22 +8130,19 @@ msgstr "Avviato in modalità ultrapeer." msgid "SHA1 hash (not editable, add from search popup)" -msgstr "" +msgstr "Hash SHA-1 (non editabile, aggiunto da popup di ricerca)" -#, fuzzy msgid "Save" -msgstr "Salvato" +msgstr "Salva" msgid "Saved" msgstr "Salvato" -#, fuzzy msgid "Search Monitor" -msgstr "Filtri ricerca" +msgstr "Monitoraggio ricerche" -#, fuzzy msgid "Search Stats" -msgstr "Filtri ricerca" +msgstr "Statistiche ricerche" msgid "Search Term" msgstr "Termina ricerca" @@ -7517,7 +8151,7 @@ msgstr "_Estensioni ricerche" msgid "Search _monitor enabled" -msgstr "Monitor di ricerca abilitato" +msgstr "Monitora_ggio ricerche abilitato" msgid "Search queue" msgstr "Coda di ricerca" @@ -7528,48 +8162,38 @@ msgid "Searches" msgstr "Ricerche" -#, fuzzy msgid "Select files by regex" -msgstr "" -"Seleziona tutte le corrispondenze di una espressione regolare dalla coda" +msgstr "Selezione file tramite regex" msgid "Selected property:" msgstr "Proprietà selezionata:" msgid "Server" -msgstr "" +msgstr "Server" -#, fuzzy msgid "Settings" -msgstr "Mostra impostazioni" +msgstr "Impostazioni" -#, fuzzy msgid "Show Search_bar" -msgstr "mostra _barra ricerca" +msgstr "Mostra _barra di Ricerca" -#, fuzzy msgid "Show Status_bar" -msgstr "mostra barra dello _stato" +msgstr "Mostra _barra di Stato" -#, fuzzy msgid "Show _Connections" -msgstr "mostra co_nnessioni" +msgstr "Mostra _Connessioni" -#, fuzzy msgid "Show _Downloads" -msgstr "mostra _scaricamenti" +msgstr "Mostra _Download" -#, fuzzy msgid "Show _Menubar" -msgstr "mostra barra _laterale" +msgstr "Mostra barra _menu" -#, fuzzy msgid "Show _Sidebar" -msgstr "mostra barra _laterale" +msgstr "Mostra barra _laterale" -#, fuzzy msgid "Show _Uploads" -msgstr "mostra _caricamenti" +msgstr "Mostra _Caricamenti" msgid "Show _bytes" msgstr "Mostra _byte" @@ -7577,36 +8201,29 @@ msgid "Show _confirmation dialog when leaving gtk-gnutella" msgstr "Mostra un dialogo di _conferma quando chiudi gtk-gnutella" -#, fuzzy msgid "Show _inbound Gnutella traffic" -msgstr "Traffico GnutellaNet" +msgstr "Mostra traffico Gnutella _entrante" -#, fuzzy msgid "Show _inbound HTTP traffic" -msgstr "mostra traffico Gnet in _ingresso" +msgstr "Mostra traffico HTTP in _ingresso" -#, fuzzy msgid "Show _inbound leaf traffic" -msgstr "mostra traffico Gnet in _ingresso" +msgstr "Mostra traffico foglia _entrante" msgid "Show _last" msgstr "Mostra le _ultime" -#, fuzzy msgid "Show _metric units" -msgstr "Mostra _percentuali" +msgstr "Mostra unità _metriche" -#, fuzzy msgid "Show _outbound Gnutella traffic" -msgstr "Traffico GnutellaNet" +msgstr "Mostra traffico Gnutella _uscente" -#, fuzzy msgid "Show _outbound HTTP traffic" -msgstr "mostra traffico Gnet in _uscita" +msgstr "Mostra traffico HTTP in _uscita" -#, fuzzy msgid "Show _outbound leaf traffic" -msgstr "mostra traffico Gnet in _uscita" +msgstr "Mostra traffico foglia _uscente" msgid "Show _percentages" msgstr "Mostra _percentuali" @@ -7619,13 +8236,11 @@ "Mostra informazioni addizionali e impostazioni per gli utenti avanzati ed " "esperti" -#, fuzzy msgid "Show inbound DHT traffic" -msgstr "mostra traffico Gnet in _ingresso" +msgstr "Mostra traffico DHT entrante" -#, fuzzy msgid "Show outbound DHT traffic" -msgstr "mostra traffico Gnet in _uscita" +msgstr "Mostra traffico DHT uscente" msgid "Show pr_otocol:" msgstr "Mostra pr_otocollo" @@ -7664,10 +8279,10 @@ msgstr "Posizioni:" msgid "Socket receive buffer size" -msgstr "Dimensione dei contenitori di ricezione" +msgstr "Dimensione del buffer di ricezione" msgid "Somebody tell me a sensible tooltip for this." -msgstr "" +msgstr "Qualcuno mi dia un suggerimento sensato per questo." msgid "Source quality" msgstr "Qualità sorgente" @@ -7681,15 +8296,14 @@ msgid "Start now" msgstr "Avvia ora" -#, fuzzy msgid "Statistics" -msgstr "Statistiche:" +msgstr "Statistiche" msgid "Statistics:" msgstr "Statistiche:" msgid "Stop" -msgstr "" +msgstr "Stop" msgid "Strict SHA_1 matching" msgstr "Corrispondenza SHA_1 severa" @@ -7707,7 +8321,7 @@ msgstr "Compressione TX" msgid "TX dropped" -msgstr "TX rilasciati" +msgstr "TX abbandonati" msgid "TX queries" msgstr "Query TX" @@ -7722,7 +8336,7 @@ msgstr "Byte cavo TX" msgid "T_X flow control timeout" -msgstr "Timeout per controllo flusso in T_X" +msgstr "Scadenza per controllo flusso in T_X" msgid "Table generation started on:" msgstr "Generazione tabella avviata per:" @@ -7765,13 +8379,13 @@ "http://maxmind.com/" msgid "Timeouts (all values in seconds)" -msgstr "Timeout (valori in secondi)" +msgstr "Scadenza (valori in secondi)" msgid "Toolbar style" msgstr "Stile barra degli strumenti" msgid "Tools" -msgstr "" +msgstr "Strumenti" msgid "Total input bandwidth limit:" msgstr "Limite complessivo della banda in ingresso:" @@ -7804,7 +8418,7 @@ msgstr "Ultrapeer in modalità foglia" msgid "Ultrapeers" -msgstr "" +msgstr "Ultrapeer" msgid "" "Until the configured percentage of outgoing HTTP bandwidth is in use, open " @@ -7816,9 +8430,8 @@ msgid "Update search results pane every" msgstr "Aggiorna il pannello dei risultati delle ricerche ogni" -#, fuzzy msgid "Upload History" -msgstr "Storia caricamenti" +msgstr "Storico caricamenti" msgid "Uploaded:" msgstr "Caricati:" @@ -7833,7 +8446,7 @@ msgstr "Usa il _tipo di servizio IP (TOS)" msgid "Use IPv6-to-IPv4 TRT prefix:" -msgstr "" +msgstr "Usa prefisso TRT IPv6-to-IPv4:" msgid "Use _surplus bandwidth" msgstr "Usa la banda in _surplus" @@ -7851,7 +8464,7 @@ msgstr "Interfaccia utente" msgid "User-Agent" -msgstr "" +msgstr "Programma" msgid "Value" msgstr "Valore" @@ -7860,13 +8473,13 @@ msgstr "Versione" msgid "Vidar Madsen" -msgstr "" +msgstr "Vidar Madsen" msgid "Visit http://gtk-gnutella.sourceforge.net/." msgstr "Visita http://gtk-gnutella.sourceforge.net/." msgid "Volume:" -msgstr "" +msgstr "Volume:" msgid "Watch for similar queries" msgstr "Guarda per richieste simili" @@ -7878,23 +8491,22 @@ msgstr "Quali altre persone vedono la velocità della tua connessione." msgid "Write buffer size" -msgstr "Dimensione contenitore scrittura" +msgstr "Dimensione del buffer di scrittura" -#, fuzzy msgid "XML Metadata" -msgstr "Metadati" +msgstr "Metadati XML" msgid "Yann Grossel" -msgstr "" +msgstr "Yann Grossel" msgid "" "You appear to be TCP-firewalled, i.e. others cannot connect to you to " "download files. You will not see push results, which may prevent you from " "seeing a large amount of results." msgstr "" -"Tu appari dietro un firewall TCP, p.es. gli altri non possono connettersi " -"per scaricare i tuoi file. Tu non potrai vedere alcun risultato di spinta, " -"cioé non sarai in grado di vedere una gran parte dei risultati." +"Tu appari dietro un firewall TCP, per esempio gli altri non possono " +"connettersi per scaricare i tuoi file. Tu non potrai vedere alcun risultato " +"di push, cioè non sarai in grado di vedere una gran parte dei risultati." msgid "" "You appear to be UDP-firewalled, i.e. you cannot receive unsolicited traffic " @@ -7912,11 +8524,11 @@ "delivery of query hits. However, it is possible to punch a hole into the UDP " "firewall, so you will be able to send out-of-band query hits." msgstr "" -"Tu appari dietro un firewall, sia lato TCP che UDP. Tu non potrai vedere " -"alcun risultato di spinta, cioé non sarai in grado di vedere una gran parte " -"dei risultati. Non potrai inviare query di richiesta di spedizione fuori " -"banda di tentativi di query. Comunque è possibile creare un passagggio nel " -"firewall UDP in modo da poter inviare tentativi di query fuori banda." +"Sembri dietro un firewall, sia lato TCP che UDP. Non vedrai alcun risultato " +"di push, impedendoti di vedere parecchi risultati. Non potrai inviare query " +"richiedendo consegna di query hit fuori banda. Comunque è possibile creare " +"un passaggio nel firewall UDP in modo da poter inviare alcune query hit " +"fuori banda." msgid "" "You appear to be firewalled, both TCP-wise and UDP-wise. You will not see " @@ -7924,10 +8536,9 @@ "results. You will not be able to send queries requesting out-of-band " "delivery of query hits." msgstr "" -"Tu appari dietro un firewall, sia lato TCP che UDP. Tu non potrai vedere " -"alcun risultato di spinta, cioé non sarai in grado di vedere una gran parte " -"dei risultati. Non potrai inviare query di richiesta di spedizione fuori " -"banda di tentativi di query." +"Sembri dietro un firewall, sia lato TCP che UDP. Non vedrai alcun risultato " +"di push, impedendoti di vedere parecchi risultati. Non potrai inviare query " +"richiedendo consegna di query hit fuori banda." msgid "You seem to be offline." msgstr "Sembra che tu sia scollegato (offline)." @@ -7951,14 +8562,13 @@ msgstr "_Aggiungi cartella" msgid "_Browse" -msgstr "_Sfoglia" +msgstr "_Consulta" -#, fuzzy msgid "_Cancel" -msgstr "Cancella" +msgstr "_Annulla" msgid "_Compute upload connection speed" -msgstr "_Calcola la velocità della connessione di carico" +msgstr "_Calcola la velocità in caricamento" msgid "_Create filter" msgstr "Crea filtro" @@ -7967,20 +8577,19 @@ msgstr "Coeff. _eliminazione (0-100)" msgid "_Download RX buffer:" -msgstr "Contenitore _RX scaricamento" +msgstr "Buffer _RX scaricamento" msgid "_Download selected" msgstr "_Scarica selezionato" -#, fuzzy msgid "_Duplicate" -msgstr "Duplica messaggio" +msgstr "_Duplicato" msgid "_Edit filters" msgstr "_Modifica filtri" msgid "_FAQ" -msgstr "" +msgstr "_FAQ" msgid "_Feed mesh from hits" msgstr "_Alimenta il gruppo con i tentativi" @@ -7992,14 +8601,13 @@ msgstr "_Generale" msgid "_Gnutella RX buffer:" -msgstr "Contenitore RX _Gnutella:" +msgstr "Buffer RX _Gnutella:" -#, fuzzy msgid "_Gnutella traffic stats" -msgstr "statistiche traffico _gnet" +msgstr "Statistiche traffico _Gnutella" msgid "_HTTP traffic stats" -msgstr "statistiche traffico _HTTP" +msgstr "Statistiche traffico _HTTP" msgid "_Help" msgstr "_Aiuto" @@ -8008,7 +8616,7 @@ msgstr "_Nascondi i file scaricati" msgid "_Horizon" -msgstr "" +msgstr "_Orizzonte" msgid "_Include headers" msgstr "_Includi titoli" @@ -8038,7 +8646,7 @@ msgstr "_Preferenze" msgid "_Push sent timeout" -msgstr "Timeout invio s_pinta" +msgstr "Scadenza invio s_pinta" msgid "_Quit" msgstr "_Esci" @@ -8052,18 +8660,17 @@ msgid "_Reset stats" msgstr "Azze_ra statistiche" -#, fuzzy msgid "_Restart" -msgstr "Azze_ra statistiche" +msgstr "_Riavvia" msgid "_Stop" -msgstr "" +msgstr "_Stop" msgid "_Try to connect to local networks first" msgstr "Cerca di conne_ttere prima le reti locali" msgid "_Update interval (sec)" -msgstr "Intervallo aggiornamento (sec)" +msgstr "Intervallo _aggiornamento (sec)" msgid "_Username" msgstr "Nome _utente" @@ -8072,7 +8679,7 @@ msgstr "_Visualizza" msgid "_auto-hide leaf traffic stats" -msgstr "_auto-nascondi statistiche traffico foglia" +msgstr "_Auto-nascondi statistiche traffico foglia" msgid "active" msgstr "attiva" @@ -8080,9 +8687,8 @@ msgid "and lasted" msgstr "e ultimato" -#, fuzzy msgid "auto-hide DHT traffic stats" -msgstr "_auto-nascondi statistiche traffico foglia" +msgstr "Auto-nascondi statistiche traffico DHT" msgid "bytes" msgstr "byte" @@ -8108,24 +8714,22 @@ msgid "from _nodes within a" msgstr "da _nodi entro un raggio di salto di" -#, fuzzy msgid "" "gtk-gnutella is shutting down.\n" "Sending bye messages to peers.\n" "\n" "Grace time remaining:" msgstr "" -"gtk-gnutella sta per spegnersi.\n" -"Invio messaggio di saluto ai peers.\n" +"gtk-gnutella sta spegnendosi.\n" +"Sto inviando un messaggio di saluto ai peer.\n" "\n" -"Tempo rimasto:" +"Tempo di cortesia rimanente:" msgid "gtk-gnutella shutdown" msgstr "spegnimento gtk-gnutella" -#, fuzzy msgid "gtk-gnutella" -msgstr "A proposito di gtk-gnutella" +msgstr "gtk-gnutella" msgid "gtk-gnutella: Quit?" msgstr "gtk-gnutella: Esco?" @@ -8140,14 +8744,13 @@ msgstr "ignorato" msgid "in" -msgstr "" +msgstr "in" msgid "invert condition" msgstr "inverti condizioni" -#, fuzzy msgid "invert" -msgstr "Ripristina" +msgstr "inverti" msgid "items" msgstr "elementi" @@ -8162,7 +8765,7 @@ msgstr "ancora indeterminato" msgid "out" -msgstr "" +msgstr "fuori" msgid "queued" msgstr "accodato" @@ -8182,9 +8785,8 @@ msgid "set" msgstr "impostato" -#, fuzzy msgid "unavailable" -msgstr "Non disponibile" +msgstr "non disponibile" msgid "undefined" msgstr "indefinito" @@ -8195,175 +8797,174 @@ msgid "uploads" msgstr "caricamenti" -#, fuzzy msgid "Available HTTP input bandwidth" -msgstr "Banda disponibile" +msgstr "Banda HTTP in ingresso disponibile" -#, fuzzy msgid "Available HTTP output bandwidth" -msgstr "Banda disponibile" +msgstr "Banda HTTP in uscita disponibile" msgid "DHT up, passive mode." -msgstr "" +msgstr "DHT funzionante, modalità passiva." msgid "DHT up, active mode." -msgstr "" +msgstr "DHT funzionante, modalità attiva." msgid "DHT bootstrapping." -msgstr "" +msgstr "Inizializzazione DHT." msgid "DHT looking up own KUID." -msgstr "" +msgstr "DHT sta cercando il proprio KUID." -#, fuzzy msgid "DHT seeded." -msgstr "Velocità TX" +msgstr "DHT seminato." -#, fuzzy msgid "DHT inactive." -msgstr "%u attivi" +msgstr "DHT inattivo." -#, fuzzy msgid "Disabled stealing of outgoing HTTP bandwidth." -msgstr "Mostra l'utilizzo della banda di traffico HTTP in uscita." +msgstr "Furto di banda HTTP uscente disabilitato" -#, fuzzy -msgid "Splitting ougoing HTTP bandwidth evenly." -msgstr "Mostra la media della banda di traffico HTTP in uscita." +msgid "Splitting outgoing HTTP bandwidth evenly." +msgstr "Divisione equa della banda HTTP uscente" msgid "Capping HTTP outgoing bandwidth." -msgstr "" +msgstr "Limitando la banda HTTP uscente." msgid "Port mapping possible through UPnP or NAT-PMP." -msgstr "" +msgstr "Mappaggio porta possibile tramite UPnP o NAT-PMP." -msgid "Port mapping configured through UPnP or NAT-PMP." -msgstr "" +msgid "Port mapping configured through NAT-PMP." +msgstr "Mappaggio porta configurato attraverso NAT-PMP." + +msgid "Port mapping configured through UPnP." +msgstr "Mappaggio porta configurato tramite UPnP." -#, fuzzy msgid "Enable UPnP" -msgstr "Abilita _UDP" +msgstr "Attiva UPnP" -#, fuzzy msgid "Enable NAT-PMP" -msgstr "Abilita _UDP" +msgstr "Attiva NAT-PMP" msgid "Enable HTTP request pipelining" -msgstr "" +msgstr "Attiva invio parallelo di richieste HTTP" -#, fuzzy msgid "Pipelining max chunk size" -msgstr "Dimensione minima pezzo" +msgstr "Massima dimensione del pezzo durante l'invio parallelo" -#, fuzzy -msgid "Enable upload of patial files deemed rare" -msgstr "Abilita caricamento dei file solo _parzialmente scaricati" +msgid "Enable upload of partial files deemed rare" +msgstr "Attiva il caricamento dei file parziali ritenuti rari" msgid "Enable GUESS (additional querying)" -msgstr "" +msgstr "Attiva GUESS (ricerche aggiuntive)" msgid "Issue GUESS queries as well" -msgstr "" +msgstr "Crea anche ricerche GUESS" -#, fuzzy msgid "Bandwidth limits for GUESS queries" -msgstr "Limite di banda per il traffico della rete Gnutella" +msgstr "Limiti di banda per ricerche GUESS" -#, fuzzy msgid "Output bandwidth hint" -msgstr "Limite complessivo della banda in uscita" +msgstr "Banda uscente consigliata" msgid "Download queue is frozen." -msgstr "" +msgstr "La coda di download è congelata." msgid "Allow TTH discovery" -msgstr "" +msgstr "Permetti scoperta TTH" msgid "Query for partial files as well" -msgstr "" +msgstr "Ricerca anche file parziali" msgid "Answer to queries for partial files" -msgstr "" +msgstr "Risposte a ricerche per file parziali" -#, fuzzy msgid "Answer to what's-new? queries" -msgstr "Query generate" +msgstr "Risposte alle ricerche \"Novità?\"" -#, fuzzy msgid "Search Media Type" -msgstr "Termina ricerca" +msgstr "Tipo di contenuto della ricerca" msgid "Audio" -msgstr "" +msgstr "Audio" -#, fuzzy msgid "Video" -msgstr "_Visualizza" +msgstr "Video" -#, fuzzy msgid "Document" -msgstr "Conteggio" +msgstr "Testo" -#, fuzzy msgid "Image" -msgstr "Intervallo" +msgstr "Immagine" -#, fuzzy msgid "Archive" -msgstr "Attivi" +msgstr "Archivio" -#, fuzzy msgid "Search Configuration" -msgstr "Filtri ricerca" +msgstr "Configurazione della ricerca" msgid "Stop search when last download completes" -msgstr "" +msgstr "Interrompi la ricerca quando l'ultimo download si completa" msgid "Look for newest files shared by nodes in the network vicinity" -msgstr "" +msgstr "Cerca i file più recentemente condivisi dai nodi vicini" msgid "What's new?" -msgstr "" +msgstr "Novità?" -#, fuzzy msgid "Unspecified" -msgstr "indefinito" +msgstr "Non specificato" msgid "Search filters to apply locally on newly created searches." -msgstr "" +msgstr "Filtri di ricerca da applicare localmente sulle nuove ricerche." msgid "Discard results bearing an alien IP address" -msgstr "" +msgstr "Scarta i risultati con indirizzo IP non corrispondente" + +msgid "Discard results bearing a banned GUID" +msgstr "Scarta i risultati con un GUID escluso" msgid "Restart session-only searches with pending downloads" -msgstr "" +msgstr "Riavvia le ricerche session-only con download in attesa" -#, fuzzy msgid "Configured DHT mode" -msgstr "Modalità peer configurata" +msgstr "Modalità DHT configurata" msgid "Store DHT keys/values in memory" -msgstr "" +msgstr "Immagazzina chiavi/valori DHT in memoria" msgid "Store SPAM SHA1 table in memory" -msgstr "" +msgstr "Immagazzina tabella SHA1 SPAM in memoria" msgid "Relayed queries remembered" +msgstr "Query ritrasmesse ricordate" + +msgid "Allow unused Gnutella outgoing bandwidth to supersede hint" msgstr "" +"Permetti di utilizzare banda uscente Gnutella per sforare quella consigliata" + +msgid "Display GUESS statistics" +msgstr "Mostra statistiche GUESS" + +msgid "Mapping lease time" +msgstr "Tempo di prestito per il mappaggio" + +msgid "G2 hubs" +msgstr "Hub G2" + +msgid "Enable the G2 network" +msgstr "Attiva la rete G2" -msgid "Not in database" -msgstr "Non c'è nel database" +msgid " G2, " +msgstr " G2, " -#, fuzzy msgid "owned" -msgstr "Terminato" +msgstr "posseduto" msgid "partial" -msgstr "" +msgstr "parziale" -#, fuzzy msgid "shared" -msgstr "in stallo" +msgstr "condiviso" #, c-format msgid "Created %u download" @@ -8377,9 +8978,6 @@ msgstr0 "Scartato %u risultato" msgstr1 "Scartati %u risultati" -msgid "Query queued..." -msgstr "Query accodata..." - #, c-format msgid "%u term counted" msgid_plural "%u terms counted" @@ -8395,7 +8993,7 @@ msgstr "Errore di lettura del file pixmap: %s" msgid " (partial)" -msgstr "" +msgstr "(parziale)" msgid "Cache contains" msgstr "Contenuti cache" @@ -8407,46 +9005,41 @@ msgstr "_Rimuovi il filtro" msgid "_Close" -msgstr "Chiudi" +msgstr "_Chiudi" -#, fuzzy msgid "Show _Statusbar" -msgstr "mostra barra dello _stato" +msgstr "Mostra barra di _stato" -#, fuzzy msgid "Show _Peers" -msgstr "mostra barra _laterale" +msgstr "Mostra _Peer" -#, fuzzy msgid "Gnutella _traffic stats" -msgstr "Statistiche del _traffico Gnet" +msgstr "Statistiche _traffico Gnutella" -#, fuzzy msgid "_Auto-hide leaf traffic stats" -msgstr "_auto-nascondi statistiche traffico foglia" +msgstr "_Auto-nascondi statistiche traffico foglia" + +msgid "Glossary" +msgstr "" msgid "_Search" msgstr "_Cerca" msgid "What's New?" -msgstr "" +msgstr "Novità?" msgid "Do not specify any media type (will match any kind of files remotely)" msgstr "" +"Non specificare alcun tipo di file (identifica tutti i tipi di file remoti)" -#, fuzzy msgid "CPU overloaded" -msgstr "Caricati:" - -#, fuzzy -msgid "Splitting outgoing HTTP bandwidth evenly." -msgstr "Mostra la media della banda di traffico HTTP in uscita." +msgstr "CPU sovraccarica" msgid "Connect to" msgstr "Connetti a" msgid "ultrapeers" -msgstr "" +msgstr "ultrapeer" msgid "Try to keep at least" msgstr "Cerca di mantenere almeno" @@ -8473,28 +9066,34 @@ "pacchetti di instradamento della rete Gnutella." msgid "GUID placeholder" -msgstr "" +msgstr "segnaposto GUID" msgid "KUID placeholder" -msgstr "" +msgstr "segnaposto KUID" msgid "Address/Port:" msgstr "Indirizzo/Porta:" msgid "IP:port placeholder" -msgstr "" +msgstr "segnaposto IP:port" msgid "Served " msgstr "Servite " -msgid "BH HTML served" -msgstr "BH HTML serviti" +msgid "G2 served" +msgstr "fornito da G2" msgid " / " -msgstr "" +msgstr " / " + +msgid "G2" +msgstr "G2" + +msgid "BH HTML served" +msgstr "BH HTML serviti" msgid "BH HTML" -msgstr "" +msgstr "BH HTML" msgid "BH qhits" msgstr "BH qtent." @@ -8518,10 +9117,10 @@ msgstr "Dati caricati:" msgid "_Columns show hops" -msgstr "Mostra salti nelle colonne" +msgstr "Mostra _salti nelle colonne" msgid " " -msgstr "" +msgstr " " msgid "Show reasons _for" msgstr "Mostra motivo _per" @@ -8536,30 +9135,30 @@ msgstr "Inversione DNS" msgid "Force external IPv4 address to" -msgstr "" +msgstr "Forza indirizzi IPv4 esterni a" -#, fuzzy msgid "_Bind to this address" -msgstr "Indirizzo di ritorno errato" +msgstr "_Lega a questo indirizzo" -#, fuzzy msgid "IPv_4 settings" -msgstr "Impostazioni IP" +msgstr "Impostazioni IPv_4" msgid "Force external IPv6 address to" -msgstr "" +msgstr "Forza indirizzi IPv6 esterni a" -#, fuzzy msgid "IPv_6 settings" -msgstr "Impostazioni IP" +msgstr "Impostazioni IPv_6" msgid "Port Mapping" -msgstr "" +msgstr "Mappaggio porta" msgid "" "This option can give performance boosts to those on a large network with " "many peers by trying to locate files on the local networks first." msgstr "" +"Questa opzione può migliorare la performance per coloro che si trovano in " +"una rete ampia con molti peer, cercando di localizzare prima i file sulla " +"rete locale" msgid "_Addresses of local network(s)" msgstr "_Indirizzo(i)i della(e) rete(i) locale(i)" @@ -8573,43 +9172,31 @@ msgid "unit_of_time|s" msgstr "s" -#, fuzzy msgid "Gnutella Distributed Hash Table" -msgstr "Livello di collaudo per il codice condiviso dei file." +msgstr "Gnutella Distributed Hash Table" msgid "Maximum percentage of connection slots a vendor can occupy." msgstr "" -"Peercentuale massima di posizioni di connessioni che può occupare un " -"offerente." - -#, fuzzy -msgid "Global DHT ougoing traffic" -msgstr "Traffico in _uscita" +"Percentuale massima di slot per il collegamento che un programma può " +"occupare." msgid "attempts" msgstr "tentativi" -#, fuzzy msgid "Pipelining maximum chunk size" -msgstr "Dimensione minima pezzo" +msgstr "Massima dimensione del pezzo durante l'invio parallelo" msgid "_Remove directory" msgstr "_Rimuovi cartella" -#, fuzzy -msgid "Enable upload of partial files deemed rare" -msgstr "Abilita caricamento dei file solo _parzialmente scaricati" - msgid "Minimum chunk _size" msgstr "_Dimensione minima pezzo" -#, fuzzy msgid "Show a status _icon" -msgstr "Mostra motivo _per" +msgstr "Mostra _icona di stato" -#, fuzzy msgid "Avg. downtime of this servent" -msgstr "Media attività di questo server:" +msgstr "Tempo di inattività medio di questo servent" msgid "Remove completed downloads from list" msgstr "Rimuovi dall'elenco gli scaricamenti completati" @@ -8618,10 +9205,10 @@ msgstr "Ri_pulisci completati" msgid ", " -msgstr "" +msgstr ", " msgid "Peer:" -msgstr "" +msgstr "Peer:" msgid "Peermode:" msgstr "Modo peer:" @@ -8636,7 +9223,7 @@ msgstr "Paese:" msgid "Vendor:" -msgstr "Offerente:" +msgstr "Programma:" msgid "Move the cursor over a row to see details." msgstr "Posizionare il cursore sopra una riga per vedere i dettagli." @@ -8648,6 +9235,9 @@ msgid "Reverse lookup in progress..." msgstr "Inversione DNS in progressione..." +msgid "UDP (semi-reliable)" +msgstr "UDP (semi-affidabile)" + msgid "Size:" msgstr "Dimensione:" @@ -8655,48 +9245,49 @@ msgstr "Terminato" msgid "Fresh regular" -msgstr "Fresco regolare" +msgstr "Regolare fresco" msgid "Valid regular" -msgstr "Valido regolare" +msgstr "Regolare valido" -#, fuzzy msgid "Fresh IPv4 ultra" -msgstr "Fresco ultra" +msgstr "IPv4 ultra, fresco" -#, fuzzy msgid "Valid IPv4 ultra" -msgstr "Valido ultra" +msgstr "IPv4 ultra, valido" -#, fuzzy msgid "Fresh IPv6 ultra" -msgstr "Fresco ultra" +msgstr "IPv6 ultra, fresco" -#, fuzzy msgid "Valid IPv6 ultra" -msgstr "Valido ultra" +msgstr "IPv6 ultra, valido" + +msgid "Fresh G2 hub" +msgstr "Hub G2 fresco" + +msgid "Valid G2 hub" +msgstr "Hub G2 valido" msgid "Unstable" msgstr "Instabile" -#, fuzzy msgid "Alien" -msgstr "Sininimi" +msgstr "Non corrispondente" msgid "GUESS (IPv4 running)" -msgstr "" +msgstr "GUESS (eseguendo IPv4)" msgid "GUESS (IPv4 introductions)" -msgstr "" +msgstr "GUESS (introduzioni IPv4)" msgid "GUESS (IPv6 running)" -msgstr "" +msgstr "GUESS (eseguendo IPv6)" msgid "GUESS (IPv6 introductions)" -msgstr "" +msgstr "GUESS (introduzioni IPv6)" msgid "gtk-gnutella: Click to minimize/restore" -msgstr "" +msgstr "gtk-gnutella: Clicca per ridurre a icona/ripristinare" #. TRANSLATORS: Translate this as "Translation provided by" or similar #. and append your name to the list. @@ -8709,14 +9300,19 @@ msgstr0 "%d secondo" msgstr1 "%d secondi" -#, fuzzy msgid "" "<html><head><title>Frequently Asked Questions</title></head><body><p>The FAQ " "document could not be loaded. Please read the <a href=\"http://gtk-gnutella." "sourceforge.net/?page=faq\">FAQ online</a> instead.</p></body></html>" msgstr "" -"Il documento con le FAQ non può essere letto. Prego leggere le FAQ in linea " -"all'indirizzo http://gtk-gnutella.sourceforge.net/?page=faq." +"<html><head><title>Domande frequenti - FAQ</title></head><body><p>Le FAQ non " +"possono essere caricate. Leggere le <a href=\"http://gtk-gnutella." +"sourceforge.net/?page=faq\">FAQ online</a>.</p></body></html>" + +msgid "" +"<html><head><title>Glossary</title></head><body><p>The glossary document " +"could not be loaded.</p></body></html>" +msgstr "" #, c-format msgid "%lu file shared (%s)" @@ -8728,18 +9324,17 @@ msgstr "(media)" msgid "Hello sent" -msgstr "Saluti inviati" +msgstr "Inviato Hello" msgid "Welcome sent" -msgstr "Benvenuto inviato" +msgstr "Inviato Welcome" -#, fuzzy msgid "No UDP traffic yet" -msgstr "Traffico HTTP" +msgstr "Ancora nessun traffico UDP" -#, fuzzy, c-format +#, c-format msgid "Closing: %s Stop in %us RX=%u Q=%u,%u%%" -msgstr "Chiusura: %s Stop in %ds RX=%d Q=%d,%d%%" +msgstr "In chiusura: %s Stop in %us RX=%u Q=%u,%u%%" msgid "Removing" msgstr "Rimozione" @@ -8750,6 +9345,9 @@ msgid "UNKNOWN STATUS" msgstr "STATO SCONOSCIUTO" +msgid "g2" +msgstr "g2" + msgid "busy" msgstr "occupato" @@ -8757,31 +9355,29 @@ msgstr "stabile" msgid "push" -msgstr "spinta" +msgstr "push" msgid "proxy" -msgstr "" +msgstr "proxy" msgid "bogus" -msgstr "fittizio" +msgstr "fasullo" -#, fuzzy msgid "alien" -msgstr "Sininimi" +msgstr "non corrispondente" msgid "media" -msgstr "" +msgstr "media" msgid "No search" msgstr "Nessuna ricerca" #, c-format msgid "Flushing queue (%u results pending)" -msgstr "" +msgstr "Coda in esaurimento (%u risultati rimanenti)" -#, fuzzy msgid "The search has been stopped" -msgstr "Nessun posto di scaricamento (crea)" +msgstr "La ricerca è stata interrotta" msgid "Passive search" msgstr "Ricerca passiva" @@ -8794,12 +9390,18 @@ msgstr "Spira al termine di questa sessione" #, c-format +msgid " %u download" +msgid_plural " %u downloads" +msgstr0 " %u download" +msgstr1 " %u download" + +#, c-format msgid "" "%u %s (%u skipped, %u ignored, %u hidden, %u auto-d/l, %u %s) Hits: %u (%u " "TCP, %u UDP)" msgstr "" -"%u %s (%u saltati, %u ignorati, %u nascosti, %u auto-d/l, %u %s) Tentativi: %" -"u (%u TCP, %u UDP)" +"%u %s (%u saltati, %u ignorati, %u nascosti, %u auto-d/l, %u %s) Tentativi: " +"%u (%u TCP, %u UDP)" msgid "item" msgid_plural "items" @@ -8811,6 +9413,67 @@ msgstr0 "duplicato" msgstr1 "duplicati" +msgid "No GUESS queries run yet" +msgstr "Ancora nessuna ricerca GUESS eseguita" + +#, c-format +msgid " previous took %s querying %zu %s with %zu %s kept" +msgstr " precedente ha preso %s ricerche %zu %s con %zu %s mantenuti" + +msgid "host" +msgid_plural "hosts" +msgstr0 "host" +msgstr1 "host" + +msgid "hit" +msgid_plural "hits" +msgstr0 "risultato" +msgstr1 "risultati" + +#, c-format +msgid "GUESS %s Total: %zu %s (%s %s, %s kept, %s queries, %s keys)%s" +msgstr "" +"GUESS %s Totale: %zu %s (%s %s, %s mantenuti, %s ricerche, %s chiavi)%s" + +msgid "idle" +msgstr "inattivo" + +msgid "query" +msgid_plural "queries" +msgstr0 "ricerca" +msgstr1 "ricerche" + +#, c-format +msgid "" +"GUESS %s %s (%zu %s, %zu kept, %s queries, %s keys) Pool: %zu %s, (%zu+" +"%zu)/%zu queried, %zu %s (%.2f%%), %zu reached, %zu pending, %zu %s%s%s" +msgstr "" +"GUESS %s %s (%zu %s, %zu mantenuti, %s interrogazioni, %s chiavi) Gruppo: " +"%zu %s, (%zu+%zu)/%zu interrogati, %zu %s (%.2f%%), %zu raggiunti, %zu in " +"attesa, %zu %s%s%s" + +msgid "loose" +msgstr "libero" + +msgid "bounded" +msgstr "legato" + +msgid "ack" +msgid_plural "acks" +msgstr0 "ack" +msgstr1 "ack" + +msgid "hop" +msgid_plural "hops" +msgstr0 "hop" +msgstr1 "hop" + +msgid " (load pending)" +msgstr " (carico rimanente)" + +msgid " (end if starving)" +msgstr "(concludi se allo stremo)" + msgid "Passive" msgstr "Passivo" @@ -8824,69 +9487,67 @@ "sono state salvate nel nuovo formato XML e il vecchio file\n" "è stato rinominato a %s" -#, fuzzy, c-format +#, c-format msgid "" "could not rename %s as %s: %m\n" "The XML file will not be used unless this problem is resolved." msgstr "" -"non è possibile rinominare %s come %s: %s\n" -"Il file XML non verrà usato se non si risolve questo problema." +"non posso rinominare %s in %s: %m\n" +"Il file XML non sarà usato finché questo problema non sarà risolto." msgid "<unparsed>" -msgstr "" +msgstr "<non elaborato>" msgid "browsable" msgstr "consultabile" -#, fuzzy, c-format +#, c-format msgid "%u download" msgid_plural "%u downloads" -msgstr0 "%u scaricamento di %u" -msgstr1 "%u scaricamenti di %u" +msgstr0 "%u download" +msgstr1 "%u download" -#, fuzzy, c-format +#, c-format msgid "%u search" msgid_plural "%u searches" -msgstr0 "Nessuna ricerca" -msgstr1 "Nessuna ricerca" +msgstr0 "%u ricerca" +msgstr1 "%u ricerche" -#, fuzzy, c-format +#, c-format msgid "Handled magnet link (%s, %s)." -msgstr "Fallito (non è possibile inviare %s: %s)" +msgstr "Magnet link gestito (%s, %s)." msgid "Ignored unusable magnet link." -msgstr "" +msgstr "Magnet link inutilizzabile ignorato." -#, fuzzy msgid "Created download from URL." -msgstr "Creato %u scaricamento" +msgstr "Download creato da URL." msgid "Ignored unusable URL." -msgstr "" +msgstr "URL inutilizzabili ignorati." -#, fuzzy msgid "The given urn type is not supported." -msgstr "Tipo non supportato" +msgstr "Il tipo di urn fornito non è supportato" -#, fuzzy msgid "The given SHA-1 is not correctly encoded." -msgstr "Tipo non supportato" +msgstr "Lo SHA-1 fornito non è codificato correttamente." msgid "Still scanning for shared file, results may be inconclusive." msgstr "" +"Ancora alla ricerca di file condivisi, i risultati potrebbero essere " +"inconcludenti." msgid "Missing port number" -msgstr "" +msgstr "Numero porta mancante" -#, fuzzy msgid "Could not parse host address" -msgstr "Non posso lanciare la consultazione per l'host %s" +msgstr "Non posso elaborare l'indirizzo dell'host" msgid "The query string is not UTF-8 encoded" msgstr "La stringa della query non è codificata UTF-8" msgid "Unhandled search prefix." -msgstr "" +msgstr "Prefisso di ricerca non gestito." #, c-format msgid "Added search showing browsing results for %s" @@ -8903,146 +9564,128 @@ msgstr "Estensione" msgid "MIME type" -msgstr "" +msgstr "Tipo MIME" msgid "TTH" -msgstr "" +msgstr "TTH" msgid "Owned" -msgstr "" +msgstr "Possieduto" msgid "No" -msgstr "" +msgstr "No" -#, fuzzy msgid "Tag" -msgstr "Destinatario" +msgstr "Tag" msgid "Yes" msgstr "Si" msgid "Maybe" -msgstr "" +msgstr "Forse" -#, fuzzy msgid "Source" -msgstr "Sorgenti" +msgstr "Sorgente" -#, fuzzy msgid "Alien IP" -msgstr "Sininimi" +msgstr "IP non corrispondente" msgid "Alt-Locs" -msgstr "" +msgstr "Alt-Locs" -#, fuzzy msgid "Partial" -msgstr "Totale" +msgstr "Parziale" + +#, c-format +msgid "%s %.2f%%" +msgstr "%s %.2f%%" + +msgid "Available" +msgstr "Disponibile" + +msgid "Last modification" +msgstr "Ultima modifica" -#, fuzzy msgid "Latinized" -msgstr "Martinica" +msgstr "Latinizzato" -#, fuzzy msgid "Pathname" -msgstr "Cache host" +msgstr "Nome percorso" -#, fuzzy msgid "File URL" -msgstr "File" +msgstr "File URL" -#, fuzzy msgid "Host information" -msgstr "Informazione dettagliata" +msgstr "Informazioni host" -#, fuzzy msgid "Hostname" -msgstr "Cache host" +msgstr "Nome host" + +msgid "banned" +msgstr "escluso" -#, fuzzy msgid "Servent ID" -msgstr "ID server:" +msgstr "Identificativo del servent" -#, fuzzy msgid "Vendor" -msgstr "Offerente:" +msgstr "Programma" -#, fuzzy msgid "Browsable" -msgstr "consultabile" +msgstr "Consultabile" -#, fuzzy msgid "Hostile" -msgstr "Host" +msgstr "Ostile" msgid "Push-proxies" -msgstr "" +msgstr "Push-prox" -#, fuzzy msgid "Packet information" -msgstr "Informazione dettagliata" +msgstr "Informazioni pacchetto" -#, fuzzy msgid "Route" -msgstr "Perso instradamento" +msgstr "Percorso" -#, fuzzy msgid "Protocol" -msgstr "Mostra pr_otocollo" +msgstr "Protocoll" msgid "TTL" -msgstr "" +msgstr "TTL" msgid "URLs" -msgstr "" +msgstr "URL" msgid "N2R URI" -msgstr "" +msgstr "N2R URI" -#, fuzzy msgid "Push URL" -msgstr "Spinta" +msgstr "Push URL" msgid "Classic URL" -msgstr "" +msgstr "URL classico" msgid "Support for this protocol is not yet implemented" -msgstr "" +msgstr "Protocollo non ancora supportato" msgid "Cannot handle the dropped data" -msgstr "" +msgstr "Non posso gestire i dati abbandonati" -#, fuzzy msgid "The normalized search text is too long." -msgstr "Il testo normalizzato della ricerca è troppo breve." +msgstr "Il testo di ricerca normalizzato è troppo lungo." msgid "The normalized search text is too short." msgstr "Il testo normalizzato della ricerca è troppo breve." msgid "One cannot send \"What's New?\" queries too often." -msgstr "" +msgstr "Non è possibile lanciare ricerche \"Novità?\" troppo spesso." msgid "The URN in the search text is invalid." -msgstr "" - -msgid "SHA-1 is unknown." -msgstr "" - -msgid "No Bitzi ticket requested yet." -msgstr "" - -#, fuzzy -msgid "Not in Bitzi database." -msgstr "Non c'è nel database" +msgstr "Lo URN nel testo di ricerca non è valido" msgid "Encoding" msgstr "Codifica" msgid "#" -msgstr "" - -msgid "Metadata" -msgstr "Metadati" +msgstr "#" msgid "Never" msgstr "Mai" @@ -9069,30 +9712,42 @@ "gnutella.sourceforge.net/</a> and update your copy of gtk-gnutella.</p></" "body></html>" msgstr "" +"<html><head><title>Rilevata versione obsoleta!</title></" +"head><body><h1>Attenzione</h1><p>Questa versione di gtk-gnutella is " +"decisamente vecchia. Visitate <a href=\"http://gtk-gnutella.sourceforge.net/" +"\">http://gtk-gnutella.sourceforge.net/</a> e aggiornate la vostra copia di " +"gtk-gnutella.</p></body></html>" msgid "*** RUNNING AN OLD VERSION! ***" -msgstr "" +msgstr "*** IN FUNZIONE VERSIONE OBSOLETA! ***" msgid "*** CPU OVERLOADED -- TRYING TO SAVE CYCLES ***" +msgstr "*** CPU SOVRACCARICA -- TENTATIVO DI RISPARMIARE CICLI ***" + +msgid "*** KERNEL BUFFER SHORTAGE -- LIMITING TCP CONNECTIONS ***" +msgstr "*** CARENZA BUFFER DEL KERNEL --LIMITAZIONE DELLE CONNESSIONI TCP ***" + +msgid "*** NO LISTENING TCP SOCKET -- NO INBOUND CONNECTIONS ***" msgstr "" +"*** NESSUN SOCKET TCP IN ASCOLTO -- NESSUNA CONNESSIONE IN INGRESSO ***" msgid "*** UPLOADS STALLING, BANDWIDTH SHORTAGE? ***" -msgstr "" +msgstr "*** CARICAMENTI IN STALLO, BANDA SCARSA? ***" msgid "*** FILE DESCRIPTORS HAVE RUN OUT! ***" -msgstr "" +msgstr "*** ESAURITI I DESCRITTORI DI FILE! ***" msgid "*** FILE DESCRIPTORS RUNNING LOW! ***" -msgstr "" +msgstr "*** I DESCRITTORI DI FILE SI STANNO ESAURENDO! ***" msgid "*** Please update gtk-gnutella ***" -msgstr "" +msgstr "*** Cortesemente aggiornate gtk-gnutella ***" #, c-format msgid "*** VERSION WILL BECOME OLD IN %d DAY! ***" msgid_plural "*** VERSION WILL BECOME OLD IN %d DAYS! ***" -msgstr0 "" -msgstr1 "" +msgstr0 "*** QUESTA VERSIONE DIVERRA' OBSOLETA IN %d GIORNO! ***" +msgstr1 "*** QUESTA VERSIONE DIVERRA' OBSOLETA IN %d GIORNI! ***" #, c-format msgid "Address/port changed to: %s" @@ -9116,12 +9771,6 @@ msgstr "%u in coda" #, c-format -msgid "%u/%u connection" -msgid_plural "%u/%u connections" -msgstr0 "%u connessione di %u" -msgstr1 "%u connessioni di %u" - -#, c-format msgid "%u/%u upload" msgid_plural "%u/%u uploads" msgstr0 "%u caricamento di %u" @@ -9134,7 +9783,10 @@ msgstr1 "%u scaricamenti di %u" msgid "Queue frozen" -msgstr "" +msgstr "Coda congelata" + +msgid "Internal" +msgstr "Interno" msgid "Select a property to see its description." msgstr "Seleziona una proprietà per vedere la sua descrizione." @@ -9147,21 +9799,21 @@ msgstr "Non c'è ancora un output..." msgid "Got push, connecting back..." -msgstr "Spinta ottenuta, riconnessione..." +msgstr "Push ricevuto, riconnessione..." msgid "< 1s" -msgstr "" +msgstr "< 1s" msgid "(quick) " -msgstr "" +msgstr "(veloce)" #, c-format msgid " E=%u" -msgstr "" +msgstr " E=%u" #, c-format msgid "%s(%s) TR: %s %s#%u" -msgstr "" +msgstr "%s(%s) TR: %s %s#%u" msgid "stalled" msgstr "in stallo" @@ -9171,14 +9823,13 @@ #, c-format msgid "%s %s#%u E=%u" -msgstr "" +msgstr "%s %s#%u E=%u" msgid "Waiting for further request..." msgstr "In attesa di ulteriori richieste..." -#, fuzzy msgid "Reading follow-up request..." -msgstr "In attesa di ulteriori richieste..." +msgstr "Leggendo richieste successive..." msgid "Transmission aborted" msgstr "Trasmissione interrotta" @@ -9191,7 +9842,7 @@ msgstr "%s %d (posizione %d/%d)%s %s %s" msgid "Frozen" -msgstr "" +msgstr "Congelato" msgid "lifetime:" msgstr "tempo di vita:" @@ -9201,24 +9852,3 @@ msgid "Sent QUEUE, waiting for headers..." msgstr "Coda inviata, in attesa dei titoli" - -#, fuzzy -#~ msgid "Linux archives" -#~ msgstr "%u attivi" - -#, fuzzy -#~ msgid "Index" -#~ msgstr "Indice:" - -#, fuzzy -#~ msgid "Seaerch Media Type" -#~ msgstr "Termina ricerca" - -#~ msgid "Banned: %s" -#~ msgstr "Esclusi: %s" - -#~ msgid "Banned for %s" -#~ msgstr "Esclusi per %s" - -#~ msgid "Connecting" -#~ msgstr "In connessione"
View file
gtk-gnutella-0.98.2.tar.bz2/po/ja.po -> gtk-gnutella-1.1.9.tar.bz2/po/ja.po
Changed
@@ -1,97 +1,31 @@ -# $Id$ -# -# Japanese translations for gtk-gnutella package. -# Copyright (C) 2000-2001 Yann Grossel. -# Copyright (C) 2001-2010 Raphaël Manfredi. -# This file is distributed under the same license as the gtk-gnutella package. -# Daichi Kawahata <daichik@users.sourceforge.net>, 2004-2010. -# -# 対訳一覧: -# -# Horizon Size Estimation Protocol 到達領域サイズ推計プロトコル (HSEP) -# Host Browse ホスト参照 -# Partial File Sharing Protocol 部分ファイル共有プロトコル (PFSP) -# Passive/Active Remote Queuing 受動/能動遠隔キューイング (RARQ) -# Reliable UDP 高信頼性 UDP (RUDP) -# Swarming 多元 (マルチソース) ダウンロード -# -# DHT 分散ハッシュツリー -# TX/RX 送信/受信 -# acknowledgement 受信確認応答 (ACK) -# activated 有効にする -# active 動作中、有効な、アクティブ -# alternate 別の (代わりの) -# bandwidth 帯域幅 -# banning 禁止処理 -# deactivated 無効にする、非活生化 -# directory フォルダ -# filter フィルター -# filtering フィルター処理 (振り分け) -# flag フラッグ -# forwarding 転送 -# global 全体、システム用 -# inactive 動作していない、無効 -# incoming/outgoing (ピア) 内への/外への -# invalid 無効な -# jump 分岐 -# lifetime 有効期限 -# matching 一致 -# matching 一致する、マッチ処理 -# query, queries 検索クエリー (クエリー)、検索語、問合わせ -# querying 問い合わせ -# queue, queues キュー、待機列 -# queued 待機中、キュー/待機列へ入れられる -# requery 再問合わせ -# requeued (再び)キュー/待機列へ入れられる -# route 経路 (ルート) -# routing 経路制御 (ルート制御) -# servent サーバント -# server サーバー -# shielded 保護ノード (註: リーフまたはファイアウォール内にある状態) -# shutdown 停止 (シャットダウン) -# slot スロット -# source 送信元 -# stats 統計 -# status ステータス -# timeout タイムアウト -# vendor ベンダー -# -# TODO: -# -# フィルターに関する訳がきわめて不明瞭なので、これを何とかする。 -# まだ各ペインの情報欄に翻訳不可能な文字列が存在するので、対処可能 -# なコードを考える。 -# -# NOTE: -# -# UI等で単独使用される句を除き、可読性を増すために英単語との間には -# スペースを入れる。 -# -# CONTACT: -# -# 誤訳の指摘・P2P用語のより正確な訳 (より分かり易い訳)・パッチの -# 送付は Last-Translator: にあるアドレスまでお願いします。 +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Raphael Manfredi +# This file is distributed under the same license as the PACKAGE package. # +# Translators: msgid "" msgstr "" -"Project-Id-Version: gtk-gnutella 0.96.7u\n" +"Project-Id-Version: gtk-gnutella\n" "Report-Msgid-Bugs-To: gtk-gnutella-devel@lists.sf.net\n" -"POT-Creation-Date: 2011-11-22 18:27+0100\n" -"PO-Revision-Date: 2010-01-11 02:32+0900\n" -"Last-Translator: Daichi Kawahata <daichik@users.sourceforge.net>\n" -"Language-Team: Japanese <gtk-gnutella-devel@lists.sourceforge.net>\n" +"POT-Creation-Date: 2016-03-06 08:49+0100\n" +"PO-Revision-Date: 2016-02-15 08:28+0000\n" +"Last-Translator: Jeroen Asselman <jeroen@asselman.com>\n" +"Language-Team: Japanese (http://www.transifex.com/gtk-gnutella/gtk-gnutella/" +"language/ja/)\n" +"Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: ja\n" "Plural-Forms: nplurals=1; plural=0;\n" -#, c-format -msgid "%s%s%s%s%s fps, %s kbps" -msgstr "%s%s%s%s%s·フレーム/秒,·%s·kb/秒" +msgid "Harmful version banned, upgrade required" +msgstr "" -msgid "times|x" -msgstr "回" +msgid "Connection refused" +msgstr "" + +msgid "Use an open Gnutella or G2 servent" +msgstr "" #, c-format msgid "Stopped, will retry with TLS (%s)" @@ -105,9 +39,8 @@ msgid "Too many attempts (%u times)" msgstr "要求回数が多すぎます (%u 回)" -#, fuzzy msgid "Requeued due to no push-proxy" -msgstr "キューに戻されました (タイムアウト)" +msgstr "" msgid "Requeued due to file removal" msgstr "キューに戻されました (ファイル削除)" @@ -118,18 +51,16 @@ msgid "Duplicate download" msgstr "ダウンロードをコピーしました" -#, fuzzy msgid "Nothing else to switch to" -msgstr "これ以上取得するデータはありません" +msgstr "" #, c-format msgid "Switching (after error) to \"%s\"" msgstr "" -# NOTE: both `s' show localized timestamp #, c-format -msgid " at %s - rescheduled for %s%s #%u" -msgstr " (現在時: %s - 再予定時: %s%s #%u)" +msgid " at %s" +msgstr "" msgid "Suspended (SHA1 checking)" msgstr "一時休止 (SHA1確認中)" @@ -153,7 +84,9 @@ msgid "Download queue is frozen" msgstr "ダウンロードキューが凍結されました" -# FIXME: what does `start' mean? +msgid "Network buffer shortage" +msgstr "" + msgid "No download slot (start)" msgstr "ダウンロードスロットがありません (開始)" @@ -163,12 +96,14 @@ msgid "Connection failed" msgstr "接続に失敗しました" +msgid "SHA1 mismatch detected" +msgstr "SHA1が一致しません" + msgid "Waiting for server PROX publishing" msgstr "" -#, fuzzy msgid "Waiting for push route" -msgstr "リクエストの詳細を待受中..." +msgstr "" msgid "Push route lost" msgstr "PUSH経路を喪失" @@ -191,7 +126,6 @@ msgid_plural "Connection refused (%u retries)" msgstr0 "接続を拒否されました (%u 回目)" -# FIXME: gtkg found duplicated SHA1 or duplicates SHA1, which? msgid "Dup SHA1 during creation" msgstr "重複するSHA1を検知しました" @@ -201,7 +135,6 @@ msgid "Max. number of downloads for this host reached" msgstr "このホストの最大ダウンロード数に達しました。" -# FIXME: should be revised. msgid "Has already enough active sources" msgstr "既に十分な送信元があります。" @@ -326,6 +259,9 @@ msgid "No support for Content-Encoding (%s)" msgstr "Content-Encoding (%s) はサポートされていません" +msgid "Incomplete headers during TLS upgrade" +msgstr "" + msgid "Spammer detected" msgstr "迷惑ファイル送信者を発見しました" @@ -384,6 +320,12 @@ msgid "No Content-Length header" msgstr "コンテンツの長さを示すヘッダーがありません" +msgid "Unexpected Content-Type" +msgstr "" + +msgid "No Content-Type" +msgstr "" + msgid "Search already closed" msgstr "検索は既に閉じられています" @@ -420,26 +362,32 @@ msgid "Malformed push reply" msgstr "" -msgid "SHA1 mismatch detected" -msgstr "SHA1が一致しません" - msgid ", inbound" msgstr ", 受信" msgid ", outbound" msgstr ", 送信" +msgid ", no-pipeline" +msgstr "" + msgid ", banning" msgstr ", 禁止処理" -# NOTE: it shouldn't be translated, you can simply copy & paste msgid ", g2" msgstr ", g2" +msgid ", fake-g2" +msgstr "" + msgid ", vendor?" msgstr ", ベンダー?" #, c-format +msgid "<Browse G2 Host %s>" +msgstr "" + +#, c-format msgid "<Browse Host %s>" msgstr "<ホスト %s の参照>" @@ -459,66 +407,51 @@ msgid "Too many data timeouts" msgstr "データ転送時のタイムアウトが多発しています" -# FIXME: separation (src/core/downloads.c, src/core/nodes.c: Timeout -> Timed out?) msgid "Timeout" msgstr "タイムアウト" msgid "Requeued due to timeout" msgstr "キューに戻されました (タイムアウト)" +msgid "Partial file removed" +msgstr "" + +msgid "File info being reset" +msgstr "" + #, c-format msgid "Downloading (TR: %s)" msgstr "ダウンロード中 (残り時間: %s)" -# XXX: # # # ####### ####### -# # # # # # -# # # # # # -# # # # # ##### -# # # # # # -# ##### # # -# msgid "Seeding" msgstr "シード中" -#, fuzzy msgid "Computing TTH" -msgstr "SHA1を算出しています" +msgstr "" msgid "Computing SHA1" msgstr "SHA1を算出しています" -#, fuzzy msgid "Waiting for TTH check" -msgstr "SHA1の確認を待っています" +msgstr "" msgid "Waiting for SHA1 check" msgstr "SHA1の確認を待っています" -#, fuzzy msgid "SHA1" -msgstr "SHA-1" +msgstr "" msgid "OK" msgstr "OK" -# FIXME: should be distinguished from the other, perhaps... -# -# NOTE: -# Automatically clear sources when... -# completed -# failed -# unavailable -# msgid "failed" msgstr "失敗した時" -#, fuzzy msgid "not computed yet" -msgstr "まだ出力はありません..." +msgstr "" -#, fuzzy msgid "Waiting for moving..." -msgstr "; 移動を待っています..." +msgstr "" msgid "Moving" msgstr "移動しています" @@ -536,13 +469,11 @@ msgid "Waiting" msgstr "待受中" -#, fuzzy msgid "Querying DHT" -msgstr "検索クエリーヒット" +msgstr "" -#, fuzzy msgid "Pending DHT query" -msgstr "保留ローカル検索クエリー数" +msgstr "" #, c-format msgid "%u/%u successful DHT lookup" @@ -554,160 +485,19 @@ msgid_plural "%u DHT lookups" msgstr0 "" -#, fuzzy, c-format +#, c-format msgid "Got %d host from %s" msgid_plural "Got %d hosts from %s" -msgstr0 "UDP ホストキャッシュ %2$s から %1$d 基のホストを取得しました。" +msgstr0 "" #, c-format -msgid "Bootstrapping from %s" -msgstr "" - -msgid "Bad size" -msgstr "不正な大きさ" - -msgid "Too small" -msgstr "小さ過ぎる" - -msgid "Too large" -msgstr "大き過ぎる" - -msgid "Way too large" -msgstr "遥かに大き過ぎる" - -msgid "Unknown message type" -msgstr "種類不明のメッセージ" - -msgid "Unexpected message" -msgstr "想定外のメッセージ" - -msgid "Message sent with TTL = 0" -msgstr "TTLがゼロの送信メッセージ" - -msgid "Improper hops/ttl combination" -msgstr "ホップ数/TTLの組合せが無効" - -msgid "Max TTL exceeded" -msgstr "最大TTLを超過" - -msgid "Message throttle" -msgstr "メッセージスロットル" - -# NOTE: `Gnutella' may be redundant -#, fuzzy -msgid "Message matched limits" -msgstr "メッセージサイズの制限" - -msgid "Unusable Pong" -msgstr "無効なPong" - -msgid "Hard TTL limit reached" -msgstr "TTLの固定上限に到達" - -msgid "Max hop count reached" -msgstr "最大ホップ数に到達" - -msgid "Route lost" -msgstr "経路を喪失" - -msgid "No route" -msgstr "経路が無い" - -msgid "Duplicate message" -msgstr "重複メッセージ" - -msgid "Message to banned GUID" -msgstr "禁止GUIDへのメッセージ" - -#, fuzzy -msgid "Message from banned GUID" -msgstr "禁止GUIDへのメッセージ" - -# FIXME: Node -> Peer -msgid "Node shutting down" -msgstr "ピアが停止中" - -msgid "TX flow control" -msgstr "送信フロー制御" - -msgid "Query text had no trailing NUL" -msgstr "NULLで終わらない検索クエリー" - -msgid "Query text too short" -msgstr "短過ぎる検索クエリー" - -msgid "Query had unnecessary overhead" -msgstr "不要オーバーへッドがある検索クエリー" - -msgid "Query had bad URN" -msgstr "不正URNがある検索クエリー" - -msgid "Message with malformed SHA1" -msgstr "変なSHA1があるメッセージ" - -msgid "Message with malformed UTF-8" -msgstr "変なUTF-8があるメッセージ" - -msgid "Malformed Query Hit" -msgstr "変な検索クエリーヒット" - -msgid "Bad return address" -msgstr "不正な返却アドレス" - -msgid "Hostile IP address" -msgstr "有害IPアドレス" - -msgid "Bogus result from Morpheus" -msgstr "" - -msgid "Spam" -msgstr "スパム" - -msgid "Evil filename" -msgstr "有害ファイル名" - -# FIXME: `Search Term' -> `Searches' or `Search queries' -#, fuzzy -msgid "Improper media type" -msgstr "検索クエリー" - -# XXX: wtf -msgid "Payload inflating error" -msgstr "ペイロード膨張エラー" - -msgid "Unknown header flags present" -msgstr "不明なヘッダーフラッグが存在" - -# FIXME: should be revised. -msgid "Own search results" -msgstr "自分自身の検索結果数" - -#, fuzzy -msgid "Own queries" -msgstr "RX (受信) 検索クエリー数" - -msgid "Ancient query format" -msgstr "古いクエリー形式" - -msgid "Blank Servent ID" -msgstr "空のサーバントID" - -msgid "GUESS Query missing token" -msgstr "" - -msgid "GUESS Invalid query token" -msgstr "" - -msgid "DHT Invalid security token" +msgid "Connecting to web cache %s" msgstr "" -msgid "DHT Too many STORE requests" +#, c-format +msgid "Bootstrapping from %s" msgstr "" -#, fuzzy -msgid "DHT Malformed message" -msgstr "変なコマンドです" - #, c-format msgid "Shutdown (%s)" msgstr "停止 (%s)" @@ -717,27 +507,6 @@ msgid_plural "Got %d connection pongs" msgstr0 "%d の接続 Pong を受信しました。" -msgid "Sent crawling info" -msgstr "クローリング情報を送信しました" - -msgid "Cannot setup compressing TX stack" -msgstr "圧縮送信スタックを準備できません" - -#, c-format -msgid "Got BYE %d %.*s" -msgstr "BYE %d %.*s を受信しました" - -#, c-format -msgid "Weird HELLO %s" -msgstr "変なHELLO %s" - -#, c-format -msgid "HELLO %s error %d (%s)" -msgstr "HELLO %s エラー %d (%s)" - -msgid "Shielded node" -msgstr "保護ノードです" - msgid "Gnet connections disabled" msgstr "Gnet 接続が無効になっています" @@ -745,10 +514,13 @@ msgstr "接続が圧縮されていません" #, c-format +msgid "Too many G2 hubs (%u max)" +msgstr "" + +#, c-format msgid "Too many leaves (%d max)" msgstr "リーフの数が多すぎます (最大 %d 基)" -# FIXME: nodes -> peers #, c-format msgid "Too many ultra nodes (%d max)" msgstr "ウルトラピアの数が多すぎます (最大 %d 基)" @@ -757,11 +529,9 @@ msgid "Rejected normal node (%d max)" msgstr "通常のピアを拒否しました (最大 %d 基)" -# FIXME: node -> peer msgid "Rejected leaf node" msgstr "リーフを拒否しました" -# FIXME: nodes -> peers #, c-format msgid "Too many nodes (%d max)" msgstr "ピアの数が多すぎます (最大 %d 基)" @@ -769,11 +539,12 @@ msgid "Sent shielded indication" msgstr "保護ノードである事を知らせました" -# FIXME: node -> peer msgid "Not an ultra node" msgstr "ウルトラピアではありません" -# FIXME: how's unstable? +msgid "Unknown error" +msgstr "不明なエラー" + msgid "Unstable IP address" msgstr "不安定な IP アドレスです" @@ -787,21 +558,50 @@ msgid "Not connecting: %s" msgstr "接続しません: %s" +msgid "Cannot setup compressing TX stack" +msgstr "圧縮送信スタックを準備できません" + +msgid "Sent crawling info" +msgstr "クローリング情報を送信しました" + +#, c-format +msgid "Got BYE %d %.*s" +msgstr "BYE %d %.*s を受信しました" + +#, c-format +msgid "Weird HELLO %s" +msgstr "変なHELLO %s" + +#, c-format +msgid "HELLO %s error %d (%s)" +msgstr "HELLO %s エラー %d (%s)" + +msgid "Shielded node" +msgstr "保護ノードです" + msgid "Protocol not acceptable" msgstr "このプロトコルは受け付けられません" +msgid "Conflict" +msgstr "" + +msgid "Upgrade Header Missing" +msgstr "" + msgid "Servent Shutdown" msgstr "サーバントが停止します" msgid "Not a network member" msgstr "ネットワークのメンバーではありません" +msgid "Need a G2 Hub" +msgstr "" + msgid "Too frequent crawling" msgstr "クローリングの頻度が多過ぎます" -#, fuzzy msgid "Already connected to this GUID" -msgstr "既に接続しています" +msgstr "" #, c-format msgid "Vendor would exceed %d%% of our slots" @@ -810,14 +610,12 @@ msgid "Reserved slot" msgstr "スロットは予約されています" -# FIXME: wtf msgid "High Outdegree and Dynamic Querying Required" msgstr "高い出次数と動的問い合わせが必要です" msgid "Cannot connect to a crawler" msgstr "クロウラーに接続できません" -# FIXME: node -> peer msgid "Not becoming a leaf node" msgstr "リーフになっていません" @@ -845,11 +643,15 @@ msgid "Failed (Extra HELLO data)" msgstr "失敗しました (余計な HELLO データがあります)" -# FIXME: node -> peer msgid "Pseudo UDP node" msgstr "擬似UDPピア" -# FIXME: node -> peer +msgid "Pseudo semi-reliable UDP node" +msgstr "" + +msgid "Pseudo G2 UDP node" +msgstr "" + msgid "Pseudo DHT node" msgstr "擬似DHTピア" @@ -859,9 +661,8 @@ msgid "Limited connection" msgstr "制限接続" -#, fuzzy msgid "Write error during HELLO" -msgstr "HELLOの最中に書込エラー: %s" +msgstr "" #, c-format msgid "Write error during HELLO: %s" @@ -896,6 +697,9 @@ msgid "DHT" msgstr "DHT" +msgid "G2 hub" +msgstr "" + msgid "Unknown" msgstr "不明" @@ -910,9 +714,9 @@ msgid "Must wait %u more seconds before resending \"What's New\"" msgstr "" -#, fuzzy, c-format +#, c-format msgid "mkdir(\"%s\") failed: %m" -msgstr "書き込みに失敗しました: %s" +msgstr "" msgid "Can't find your home directory!" msgstr "ホームフォルダが見つかりません!" @@ -924,12 +728,17 @@ msgid "creating configuration directory \"%s\"" msgstr "設定フォルダ \"%s\" を作成しています" -#, fuzzy, c-format +#, c-format msgid "creating directory \"%s\" for %s" -msgstr "設定フォルダ \"%s\" を作成しています" +msgstr "" -msgid "You seem to have left another gtk-gnutella running" -msgstr "他の gtk-gnutella を走らせたままにしているようです" +#, c-format +msgid "Another gtk-gnutella supervisor is running as PID %lu" +msgstr "" + +#, c-format +msgid "Another gtk-gnutella is running as PID %lu" +msgstr "" msgid "Cannot proceed without valid configuration directory" msgstr "適当な設定フォルダが無いと先に進めません" @@ -943,9 +752,6 @@ msgid "Failed to create local socket" msgstr "ローカルソケットの作成に失敗しました" -msgid "Failed to create listening sockets" -msgstr "待ち受けポートの作成に失敗しました" - msgid "Can only run as a leaf when TCP-firewalled" msgstr "TCP がファイアウォール内にある場合はリーフとしてのみ動作します" @@ -955,6 +761,12 @@ msgid "Got EOF" msgstr "EOFを受信しました" +msgid "TLS handshake failed" +msgstr "" + +msgid "Connection locally failed" +msgstr "" + msgid "Write failed (Input Exception)" msgstr "書込み失敗 (入力例外が発生しました)" @@ -974,21 +786,111 @@ msgid "Connect back timeout" msgstr "折り返しの接続がタイムアウトしました" +msgid "Request timeout" +msgstr "" + msgid "Timeout waiting for follow-up" msgstr "後続リクエストの待合せがタイムアウトしました" msgid "Lifetime expired" msgstr "有効期限が切れました" +msgid "Unauthorized" +msgstr "" + +#, c-format +msgid "Limiting connections from %s" +msgstr "" + +msgid "No reason given" +msgstr "" + +msgid "Bad Request" +msgstr "" + +msgid "Header too large" +msgstr "" + +msgid "Input buffer full" +msgstr "" + +msgid "Extra data after HTTP header" +msgstr "" + msgid "Unable to send GIV" msgstr "GIV を送信できません" +msgid "Not Found" +msgstr "" + +msgid "File was modified" +msgstr "" + +msgid "Moved Permanently" +msgstr "" + +msgid "File index/name mismatch" +msgstr "" + +msgid "URN Not Found (urn:sha1)" +msgstr "" + +msgid "SHA1 is being recomputed" +msgstr "" + +msgid "Library being rebuilt" +msgstr "" + +msgid "Malformed URN in /uri-res/N2R request" +msgstr "" + +msgid "Malformed URN in /uri-res/N2X request" +msgstr "" + +msgid "TTH is being computed" +msgstr "" + msgid "<Browse Host Request>" msgstr "<ホスト参照リクエスト>" +msgid "Browse Host Disabled" +msgstr "" + +#, c-format +msgid "Redirected to %s:%u" +msgstr "" + +msgid "Not Modified" +msgstr "" + msgid "Stalling upload replaced" msgstr "停滞中のアップロードが置換えられました" +msgid "Already downloading this file" +msgstr "" + +msgid "Malformed Range request" +msgstr "" + +msgid "Requested range not satisfiable" +msgstr "" + +msgid "Requested range not available yet" +msgstr "" + +msgid "Queue full" +msgstr "" + +msgid "Another connection is still active" +msgstr "" + +#, c-format +msgid "%s not honoured; removed from PARQ queue" +msgstr "" + +msgid "Minimum retry delay" +msgstr "" + #, c-format msgid "Queued (slot %d, ETA: %s)" msgstr "待機中 (スロット %d, 予定時間: %s)" @@ -996,25 +898,59 @@ msgid "Cannot send whole HTTP status" msgstr "HTTPステータス全体を送信できません" +msgid "Not Acceptable" +msgstr "" + #, c-format -msgid "<Browse Host Request> %s%s%s" -msgstr "<ホスト参照リクエスト> %s%s%s" +msgid "<Browse Host %sRequest> %s%s%s" +msgstr "" msgid "query hits" msgstr "検索クエリーヒット" -# FIXME: wtf msgid ", deflate" msgstr ", deflate" -# FIXME: wtf msgid ", gzip" msgstr ", gzip" -# FIXME: wtf msgid ", chunked" msgstr ", チャンク化" +msgid "THEX failure" +msgstr "" + +msgid "EOF while sinking" +msgstr "" + +#, c-format +msgid "Read error while sinking: %m" +msgstr "" + +msgid "Content Too Large" +msgstr "" + +msgid "Unknown/Missing Protocol Tag" +msgstr "" + +msgid "Missing Host Header" +msgstr "" + +msgid "Not Implemented" +msgstr "" + +msgid "Bad URI" +msgstr "" + +msgid "Bad Path" +msgstr "" + +msgid "No Content Allowed" +msgstr "" + +msgid "Sharing currently disabled" +msgstr "" + msgid "Write exception" msgstr "書込み例外が発生しました" @@ -1054,6 +990,1194 @@ msgid " - Newer version available: from git %s" msgstr " - 新しいバージョンが利用可能です: git %s" +msgid "Routing errors" +msgstr "経路制御エラー" + +msgid "Routing table chunks" +msgstr "" + +msgid "Routing table message capacity" +msgstr "" + +msgid "Routing table message count" +msgstr "" + +msgid "Routing through transient node avoided" +msgstr "" + +msgid "Duplicates with higher TTL" +msgstr "高TTLでの重複" + +msgid "SPAM SHA1 database hits" +msgstr "" + +msgid "SPAM filename and size hits" +msgstr "" + +msgid "SPAM fake hits" +msgstr "" + +msgid "SPAM duplicate hits" +msgstr "" + +msgid "SPAM dynamically caught hostile IP addresses" +msgstr "" + +msgid "SPAM dynamically caught hostile IP held" +msgstr "" + +msgid "SPAM spotted spamming IP addresses held" +msgstr "" + +msgid "Searches to local DB" +msgstr "あなたの共有ファイルへの検索" + +msgid "Hits on local DB" +msgstr "あなたの共有ファイルにヒット" + +msgid "Hits on local partial files" +msgstr "" + +msgid "Hits on \"what's new?\" queries" +msgstr "" + +msgid "Query hits received for local queries" +msgstr "あなたの検索クエリーが受取った検索クエリーヒット" + +msgid "G2 searches to local DB" +msgstr "" + +msgid "G2 hits on local DB" +msgstr "" + +msgid "G2 hits on local partial files" +msgstr "" + +msgid "Query hits received for OOB-proxied queries" +msgstr "OOBプロキシ検索クエリーで受取った検索クエリーヒット" + +msgid "Queries requesting OOB hit delivery" +msgstr "OOBヒット配送を要求する検索クエリー" + +msgid "Stripped OOB flag on queries" +msgstr "検索クエリーでの削除済OOBフラッグ" + +msgid "Ignored OOB queries due to unclaimed hits" +msgstr "" + +msgid "Duplicate OOB-proxied queries" +msgstr "重複するOOBプロキシ検索クエリー" + +msgid "OOB hits received for OOB-proxied queries" +msgstr "OOBプロキシ検索クエリーで受取ったOOBヒット" + +msgid "OOB hits bearing alien IP address" +msgstr "無関係なIPアドレスに関するOOBヒット" + +msgid "OOB hits ignored due to identified spamming address" +msgstr "" + +msgid "OOB hits ignored due to unsecure promise from known secure host" +msgstr "" + +msgid "Unclaimed locally-generated OOB hits" +msgstr "要求のないローカル生成OOBヒット" + +msgid "Partially claimed locally-generated OOB hits" +msgstr "一部要求されているローカル生成OOBヒット" + +msgid "Spurious OOB hit claiming received" +msgstr "受信した偽のOOBヒット要求" + +msgid "Unrequested OOB hits received" +msgstr "リクエストしていないOOBヒットの受信数" + +msgid "Received query hits for untracked queries" +msgstr "" + +msgid "Tracked query MUIDs" +msgstr "" + +msgid "Compacted queries" +msgstr "圧縮検索クエリー" + +msgid "Bytes saved by compacting" +msgstr "圧縮保存済バイト" + +msgid "UTF8 queries" +msgstr "UTF8検索クエリー" + +msgid "SHA1 queries" +msgstr "SHA1検索クエリー" + +msgid "\"What's New?\" queries" +msgstr "" + +msgid "UTF8 G2 queries" +msgstr "" + +msgid "SHA1 G2 queries" +msgstr "" + +msgid "GUESS queries" +msgstr "" + +msgid "GUESS queries (0.2)" +msgstr "" + +msgid "GUESS link cache size" +msgstr "" + +msgid "GUESS cached query keys held" +msgstr "" + +msgid "GUESS cached 0.2 hosts held" +msgstr "" + +msgid "GUESS cached G2 hosts held" +msgstr "" + +msgid "GUESS locally generated queries" +msgstr "" + +msgid "GUESS currently running queries" +msgstr "" + +msgid "GUESS hits received for locally generated queries" +msgstr "" + +msgid "GUESS ultra nodes queried" +msgstr "" + +msgid "GUESS ultra nodes sending back an acknowledgment" +msgstr "" + +msgid "GUESS G2 nodes queried" +msgstr "" + +msgid "GUESS G2 nodes sending back an acknowledgment" +msgstr "" + +msgid "Throttled local push messages" +msgstr "" + +msgid "Throttled received push messages" +msgstr "" + +msgid "Broadcasted push messages" +msgstr "広域送信PUSHメッセージ" + +msgid "Push-proxy UDP relayed messages" +msgstr "PUSHプロキシUDP中継メッセージ" + +msgid "Push-proxy TCP relayed messages" +msgstr "PUSHプロキシTCP中継メッセージ" + +msgid "Push-proxy TCP for FW<->FW transfers" +msgstr "" + +msgid "Push-proxy broadcasted messages" +msgstr "PUSHプロキシ広域送信メッセージ" + +msgid "Push-proxy found un-proxied local route" +msgstr "" + +msgid "Push-proxy lookup failures" +msgstr "PUSHプロキシ参照失敗" + +msgid "Push relayed via local route" +msgstr "" + +msgid "Push relayed via routing table" +msgstr "" + +msgid "Locally generated dynamic queries" +msgstr "ローカル生成の動的検索クエリー" + +msgid "Leaf-generated dynamic queries" +msgstr "リーフ生成の動的検索クエリー" + +msgid "OOB-proxied leaf queries" +msgstr "プロキシOOBリーフ検索クエリー" + +msgid "Fully completed dynamic queries" +msgstr "完全完成の動的検索クエリー" + +msgid "Partially completed dynamic queries" +msgstr "部分完成の動的検索クエリー" + +msgid "Dynamic queries ended with no results" +msgstr "結果無しで終了した動的検索クエリー" + +msgid "Fully completed dynamic queries getting late results" +msgstr "後に結果を得る完全完成の動的検索クエリー" + +msgid "Dynamic queries with partial late results" +msgstr "後の部分的な結果を伴う動的検索クエリー" + +msgid "Dynamic queries completed by late results" +msgstr "後の結果で完成する動的検索クエリー" + +msgid "Queries seen from GTKG" +msgstr "GTKGからの検索クエリー" + +msgid "Queries seen from GTKG that were re-queries" +msgstr "GTKGからの検索クエリー (再問合わせ)" + +msgid "Queries advertising support of GGEP \"H\"" +msgstr "GGEP「H」への対応を知らせる検索クエリー" + +msgid "Queries advertising support of semi-reliable UDP" +msgstr "" + +msgid "GIV callbacks received" +msgstr "受信したGIVコールバック" + +msgid "GIV discarded due to no suitable download" +msgstr "" + +msgid "QUEUE callbacks received" +msgstr "受信したQUEUEコールバック" + +msgid "QUEUE discarded due to no suitable download" +msgstr "" + +msgid "File descriptors banned running count" +msgstr "" + +msgid "UDP read-ahead datagram running count" +msgstr "" + +msgid "UDP read-ahead datagram running bytes" +msgstr "" + +msgid "UDP read-ahead datagram \"old\" processed" +msgstr "" + +msgid "UDP read-ahead datagram max count" +msgstr "" + +msgid "UDP read-ahead datagram max bytes" +msgstr "" + +msgid "UDP read-ahead datagram max delay" +msgstr "" + +msgid "UDP push messages received for FW<->FW connections" +msgstr "" + +msgid "UDP push messages requesting FW<->FW connection with ourselves" +msgstr "" + +msgid "UDP push messages patched for FW<->FW connections" +msgstr "" + +msgid "UDP UHC pings received" +msgstr "" + +msgid "UDP UHC pongs sent" +msgstr "" + +msgid "UDP messages with bogus source IP" +msgstr "UDPメッセージ (偽の送信元IP)" + +msgid "UDP messages from shunned IP (discarded)" +msgstr "" + +msgid "UDP truncated incoming messages" +msgstr "" + +msgid "Alien UDP messages (non-Gnutella)" +msgstr "無関係なUDPメッセージ (非Gnutella)" + +msgid "Unprocessed UDP Gnutella messages" +msgstr "未処理のUDPメッセージ (Gnutella)" + +msgid "Compressed UDP messages enqueued" +msgstr "キューにある圧縮UDPメッセージ" + +msgid "Compressed UDP messages received" +msgstr "受信した圧縮UDPメッセージ" + +msgid "Candidates for UDP message compression" +msgstr "" + +msgid "Uncompressed UDP messages due to no gain" +msgstr "有効性が無いため圧縮されないUDPメッセージ" + +msgid "Ambiguous UDP messages received" +msgstr "" + +msgid "Ambiguous UDP messages inspected more deeply" +msgstr "" + +msgid "Ambiguous UDP messages handled as semi-reliable UDP" +msgstr "" + +msgid "Semi-reliable UDP total messages given for transmission" +msgstr "" + +msgid "Semi-reliable UDP total messages deflated" +msgstr "" + +msgid "Semi-reliable UDP total messages unsent" +msgstr "" + +msgid "Semi-reliable UDP total messages dropped due to temporary ban" +msgstr "" + +msgid "Semi-reliable UDP total messages sent to known responsive hosts" +msgstr "" + +msgid "Semi-reliable UDP total messages partially sent due to clogging" +msgstr "" + +msgid "Semi-reliable UDP reliable messages given for transmission" +msgstr "" + +msgid "Semi-reliable UDP reliable messages correctly transmited" +msgstr "" + +msgid "Semi-reliable UDP reliable messages not fully acknowledged" +msgstr "" + +msgid "Semi-reliable UDP fragments sent" +msgstr "" + +msgid "Semi-reliable UDP fragments resent" +msgstr "" + +msgid "Semi-reliable UDP fragment sendings avoided" +msgstr "" + +msgid "Semi-reliable UDP fragments sent too many times" +msgstr "" + +msgid "Semi-reliable UDP total acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP spurious acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP invalid acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP acknowledgments re-queued for sending" +msgstr "" + +msgid "Semi-reliable UDP plain acknowledgments dropped" +msgstr "" + +msgid "Semi-reliable UDP enhanced acknowledgments dropped" +msgstr "" + +msgid "Semi-reliable UDP plain acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP EARs sent" +msgstr "" + +msgid "Semi-reliable UDP too many EARs sent" +msgstr "" + +msgid "Semi-reliable UDP EAR negative acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP acknowledgments received after sending EARs" +msgstr "" + +msgid "Semi-reliable UDP fragments received" +msgstr "" + +msgid "Semi-reliable UDP duplicate fragments received" +msgstr "" + +msgid "Semi-reliable UDP unreliable fragments received" +msgstr "" + +msgid "Semi-reliable UDP dropped received fragments" +msgstr "" + +msgid "Semi-reliable UDP fragments received whilst lingering" +msgstr "" + +msgid "Semi-reliable UDP messages expired before re-assembly" +msgstr "" + +msgid "Semi-reliable UDP messages re-assembled completely" +msgstr "" + +msgid "Semi-reliable UDP messages inflated successfully" +msgstr "" + +msgid "Semi-reliable UDP messages inflated incorrectly" +msgstr "" + +msgid "Semi-reliable UDP unreliable messages received" +msgstr "" + +msgid "Semi-reliable UDP empty messages received" +msgstr "" + +msgid "Semi-reliable UDP total acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP avoided acknowledgment sendings" +msgstr "" + +msgid "Semi-reliable UDP EARs received" +msgstr "" + +msgid "Semi-reliable UDP EARs received for unknown message" +msgstr "" + +msgid "Semi-reliable UDP EARs received whilst lingering" +msgstr "" + +msgid "Semi-reliable UDP fragments from hostile IP addresses" +msgstr "" + +msgid "UDP G2 hits rerouted to hub for delivery" +msgstr "" + +msgid "UDP G2 hits undelivered" +msgstr "" + +msgid "Consolidated servers (after GUID and IP address linking)" +msgstr "" + +msgid "Duplicate downloads found during server consolidation" +msgstr "" + +msgid "Discovered server GUIDs" +msgstr "発見されたサーバントGUID" + +msgid "Changed server GUIDs" +msgstr "変更されたサーバントGUID" + +msgid "Detected GUID collisions" +msgstr "競合しているGUID" + +msgid "Detected collisions with our own GUID" +msgstr "競合しているGTKGのGUID" + +msgid "GUID dynamically banned" +msgstr "" + +msgid "Firewalled node info for known hosts received in upload requests" +msgstr "" + +msgid "Revitalized PUSH routes" +msgstr "" + +msgid "Collected new PUSH proxies from other query hits" +msgstr "" + +msgid "Attempted download resource switching on completion" +msgstr "" + +msgid "Attempted download resource switching after error" +msgstr "" + +msgid "Successful download resource switching (all kind)" +msgstr "" + +msgid "Successful download resource switching between plain files" +msgstr "" + +msgid "Successful download resource switching after error" +msgstr "" + +msgid "Actively queued after resource switching attempt" +msgstr "" + +msgid "Sunk HTTP reply data on error codes" +msgstr "" + +msgid "Ignored downloaded data" +msgstr "破棄されたダウンロード済データ" + +msgid "Ignoring requested after data mismatch" +msgstr "" + +msgid "Ignoring requested to preserve connection" +msgstr "" + +msgid "Ignoring requested due to aggressive swarming" +msgstr "" + +msgid "Ignoring refused (data too large or server too slow)" +msgstr "" + +msgid "Client resource switching (all detected)" +msgstr "" + +msgid "Client resource switching between plain files" +msgstr "" + +msgid "Client follow-up request after HTTP error was returned" +msgstr "" + +msgid "PARQ client resource switching in slots (SHA-1 based)" +msgstr "" + +msgid "PARQ client retry-after violation" +msgstr "" + +msgid "PARQ client kicked out after too many retry-after violations" +msgstr "" + +msgid "PARQ upload slot limit overrides" +msgstr "" + +msgid "PARQ quick upload slots granted" +msgstr "" + +msgid "PARQ QUEUE sending attempts" +msgstr "" + +msgid "PARQ QUEUE messages sent" +msgstr "" + +msgid "PARQ QUEUE follow-up requests received" +msgstr "" + +msgid "Launched SHA-1 file verifications" +msgstr "" + +msgid "Launched TTH file verifications" +msgstr "" + +msgid "Re-seeding of orphan downloads through query hits" +msgstr "" + +msgid "Re-seeding of orphan downloads through upload requests" +msgstr "" + +msgid "RUDP sent bytes" +msgstr "" + +msgid "RUDP received bytes" +msgstr "" + +msgid "DHT estimated amount of nodes" +msgstr "" + +msgid "DHT standard error of estimated amount of nodes" +msgstr "" + +msgid "DHT k-ball theoretical frontier (bits)" +msgstr "" + +msgid "DHT k-ball furthest frontier (bits)" +msgstr "" + +msgid "DHT k-ball closeest frontier (bits)" +msgstr "" + +msgid "DHT routing table buckets" +msgstr "" + +msgid "DHT routing table leaves" +msgstr "" + +msgid "DHT routing table maximum depth" +msgstr "" + +msgid "DHT routing table good nodes" +msgstr "" + +msgid "DHT routing table stale nodes" +msgstr "" + +msgid "DHT routing table pending nodes" +msgstr "" + +msgid "DHT routing table evicted nodes" +msgstr "" + +msgid "DHT routing table evicted firewalled nodes" +msgstr "" + +msgid "DHT routing table evicted nodes due to quota" +msgstr "" + +msgid "DHT routing table promoted pending nodes" +msgstr "" + +msgid "DHT routing table pinged promoted nodes" +msgstr "" + +msgid "DHT routing table rejected node due to bucket network quota" +msgstr "" + +msgid "DHT routing table rejected node due to global network quota" +msgstr "" + +msgid "DHT completed bucket refreshes" +msgstr "" + +msgid "DHT forced bucket refreshes" +msgstr "" + +msgid "DHT forced bucket merges" +msgstr "" + +msgid "DHT bucket merges" +msgstr "" + +msgid "DHT bucket splits" +msgstr "" + +msgid "DHT denied non-splitable bucket refresh" +msgstr "" + +msgid "DHT initiated bucket alive checks" +msgstr "" + +msgid "DHT alive pings sent to good nodes" +msgstr "" + +msgid "DHT alive pings sent to stale nodes" +msgstr "" + +msgid "DHT alive pings sent to shutdowning nodes" +msgstr "" + +msgid "DHT alive pings avoided" +msgstr "" + +msgid "DHT alive pings skipped" +msgstr "" + +msgid "DHT revitalized stale nodes on RPC reply" +msgstr "" + +msgid "DHT value store rejected on IP/network quota grounds" +msgstr "" + +msgid "DHT value store rejected on creator validation grounds" +msgstr "" + +msgid "DHT nodes rejected during lookup based on network quota" +msgstr "" + +msgid "DHT nodes rejected during lookup based on suspicious proximity" +msgstr "" + +msgid "DHT nodes rejected during lookup based on frequency divergence" +msgstr "" + +msgid "DHT node contact IP addresses fixed during lookup" +msgstr "" + +msgid "DHT keys held" +msgstr "" + +msgid "DHT cached keys held" +msgstr "" + +msgid "DHT values held" +msgstr "" + +msgid "DHT cached KUID targets held" +msgstr "" + +msgid "DHT cached closest root nodes" +msgstr "" + +msgid "DHT cached roots exact hits" +msgstr "" + +msgid "DHT cached roots approximate hits" +msgstr "" + +msgid "DHT cached roots misses" +msgstr "" + +msgid "DHT cached roots lookups within k-ball" +msgstr "" + +msgid "DHT cached roots contact address refreshed" +msgstr "" + +msgid "DHT cached security tokens held" +msgstr "" + +msgid "DHT cached security tokens hits" +msgstr "" + +msgid "DHT stable node information held" +msgstr "" + +msgid "DHT local hits on value lookups" +msgstr "" + +msgid "DHT local hits returning values from cached keys" +msgstr "" + +msgid "DHT returned expanded values" +msgstr "" + +msgid "DHT returned values as secondary keys" +msgstr "" + +msgid "DHT claimed values via secondary keys" +msgstr "" + +msgid "DHT returned cached expanded values" +msgstr "" + +msgid "DHT returned cached values as secondary-keys" +msgstr "" + +msgid "DHT claimed cached values via secondary keys" +msgstr "" + +msgid "DHT successfully received value publications" +msgstr "" + +msgid "DHT successfully received value removals" +msgstr "" + +msgid "DHT replication of stale value avoided" +msgstr "" + +msgid "DHT replication of held values" +msgstr "" + +msgid "DHT republishing of held values" +msgstr "" + +msgid "DHT secondary-key value fetch issued" +msgstr "" + +msgid "DHT duplicate values returned in lookups" +msgstr "" + +msgid "DHT detected KUID collisions" +msgstr "" + +msgid "DHT detected collisions with our own KUID" +msgstr "" + +msgid "DHT caching attempts" +msgstr "" + +msgid "DHT caching ended successfully" +msgstr "" + +msgid "DHT caching partially completed" +msgstr "" + +msgid "DHT key-offloading checks after discovering new closest node" +msgstr "" + +msgid "DHT keys selected for offloading" +msgstr "" + +msgid "DHT key-offloading attempts" +msgstr "" + +msgid "DHT key-offloading ended successfully" +msgstr "" + +msgid "DHT key-offloading partially completed" +msgstr "" + +msgid "DHT values successfully offloaded" +msgstr "" + +msgid "DHT incoming messages" +msgstr "" + +msgid "DHT incoming messages with UDP-matching contact address" +msgstr "" + +msgid "DHT incoming messages with contact address fixed" +msgstr "" + +msgid "DHT incoming messages from hostile addresses" +msgstr "" + +msgid "DHT incoming messages with hostile contact address" +msgstr "" + +msgid "DHT RPC messages prepared" +msgstr "" + +msgid "DHT RPC messages cancelled" +msgstr "" + +msgid "DHT RPC timed out" +msgstr "" + +msgid "DHT RPC replies received" +msgstr "" + +msgid "DHT RPC replies with contact address fixed" +msgstr "" + +msgid "DHT RPC late replies received" +msgstr "" + +msgid "DHT RPC detected KUID mismatches on reply" +msgstr "" + +msgid "DHT RPC recent nodes held" +msgstr "" + +msgid "DHT node verifications" +msgstr "" + +msgid "DHT publishing attempts" +msgstr "" + +msgid "DHT publishing ended successfully (all roots)" +msgstr "" + +msgid "DHT publishing partially completed (root subset only)" +msgstr "" + +msgid "DHT publishing ending with proper value presence" +msgstr "" + +msgid "DHT value republishing occurring too late (after expiry)" +msgstr "" + +msgid "DHT publishing to self" +msgstr "" + +msgid "DHT background publishing completion attempts" +msgstr "" + +msgid "DHT background publishing completion showing improvements" +msgstr "" + +msgid "DHT background publishing completion successful (all roots)" +msgstr "" + +msgid "DHT SHA1 data type collisions" +msgstr "" + +msgid "DHT lookup path passively protected against attack" +msgstr "" + +msgid "DHT lookup path actively protected against attack" +msgstr "" + +msgid "DHT alt-loc lookups issued" +msgstr "" + +msgid "DHT push-proxy lookups issued" +msgstr "" + +msgid "DHT successful alt-loc lookups" +msgstr "" + +msgid "DHT successful push-proxy lookups" +msgstr "" + +msgid "DHT successful node push-entry lookups" +msgstr "" + +msgid "DHT re-seeding of orphan downloads" +msgstr "" + +msgid "Digests computed on general statistics" +msgstr "" + +msgid "Digests computed on TCP statistics" +msgstr "" + +msgid "Digests computed on UDP statistics" +msgstr "" + +msgid "Ping" +msgstr "Ping" + +msgid "Pong" +msgstr "Pong" + +msgid "Bye" +msgstr "Bye" + +msgid "QRP" +msgstr "QRP" + +msgid "HSEP" +msgstr "HSEP" + +msgid "RUDP" +msgstr "RUDP" + +msgid "Vendor spec." +msgstr "ベンダー特定" + +msgid "Vendor std." +msgstr "ベンダー標準" + +msgid "Push" +msgstr "PUSH" + +msgid "Query" +msgstr "検索クエリー" + +msgid "Query hit" +msgstr "検索クエリーヒット" + +msgid "DHT (truncated)" +msgstr "" + +msgid "DHT Ping" +msgstr "" + +msgid "DHT Pong" +msgstr "" + +msgid "DHT Store" +msgstr "" + +msgid "DHT Store Ack" +msgstr "" + +msgid "DHT Find Node" +msgstr "" + +msgid "DHT Found Node" +msgstr "" + +msgid "DHT Find Value" +msgstr "" + +msgid "DHT Value" +msgstr "" + +msgid "G2 Crawl Request" +msgstr "" + +msgid "G2 Hub Advertisement" +msgstr "" + +msgid "G2 Hub List" +msgstr "" + +msgid "G2 Hub List Req" +msgstr "" + +msgid "G2 Hub List Ack" +msgstr "" + +msgid "G2 Local Node Info" +msgstr "" + +msgid "G2 Ping" +msgstr "" + +msgid "G2 Pong" +msgstr "" + +msgid "G2 Push" +msgstr "" + +msgid "G2 Query Key Ack" +msgstr "" + +msgid "G2 Query Key Req" +msgstr "" + +msgid "G2 Query" +msgstr "" + +msgid "G2 Query Ack" +msgstr "" + +msgid "G2 Query Hit" +msgstr "" + +msgid "G2 Query Hash Table" +msgstr "" + +msgid "G2 User Profile Check" +msgstr "" + +msgid "G2 User Profile Data" +msgstr "" + +msgid "Total" +msgstr "合計" + +msgid "Bad size" +msgstr "不正な大きさ" + +msgid "Too small" +msgstr "小さ過ぎる" + +msgid "Too large" +msgstr "大き過ぎる" + +msgid "Way too large" +msgstr "遥かに大き過ぎる" + +msgid "Too old" +msgstr "" + +msgid "Unknown message type" +msgstr "種類不明のメッセージ" + +msgid "Unexpected message" +msgstr "想定外のメッセージ" + +msgid "Message sent with TTL = 0" +msgstr "TTLがゼロの送信メッセージ" + +msgid "Improper hops/ttl combination" +msgstr "ホップ数/TTLの組合せが無効" + +msgid "Max TTL exceeded" +msgstr "最大TTLを超過" + +msgid "Message throttle" +msgstr "メッセージスロットル" + +msgid "Message matched limits" +msgstr "" + +msgid "Transient node" +msgstr "" + +msgid "Unusable Pong" +msgstr "無効なPong" + +msgid "Hard TTL limit reached" +msgstr "TTLの固定上限に到達" + +msgid "Max hop count reached" +msgstr "最大ホップ数に到達" + +msgid "Route lost" +msgstr "経路を喪失" + +msgid "No route" +msgstr "経路が無い" + +msgid "Duplicate message" +msgstr "重複メッセージ" + +msgid "OOB Proxy MUID Conflict" +msgstr "" + +msgid "Message to banned GUID" +msgstr "禁止GUIDへのメッセージ" + +msgid "Message from banned GUID" +msgstr "" + +msgid "Node shutting down" +msgstr "ピアが停止中" + +msgid "TX flow control" +msgstr "送信フロー制御" + +msgid "Query text had no trailing NUL" +msgstr "NULLで終わらない検索クエリー" + +msgid "Query text too short" +msgstr "短過ぎる検索クエリー" + +msgid "Query had unnecessary overhead" +msgstr "不要オーバーへッドがある検索クエリー" + +msgid "Query had bad URN" +msgstr "不正URNがある検索クエリー" + +msgid "Message with malformed SHA1" +msgstr "変なSHA1があるメッセージ" + +msgid "Message with malformed UTF-8" +msgstr "変なUTF-8があるメッセージ" + +msgid "Malformed Query Hit" +msgstr "変な検索クエリーヒット" + +msgid "Bad return address" +msgstr "不正な返却アドレス" + +msgid "Hostile IP address" +msgstr "有害IPアドレス" + +msgid "Shunned IP address" +msgstr "" + +msgid "Bogus result from Morpheus" +msgstr "" + +msgid "Spam" +msgstr "スパム" + +msgid "Evil filename" +msgstr "有害ファイル名" + +msgid "Improper media type" +msgstr "" + +msgid "Payload inflating error" +msgstr "ペイロード膨張エラー" + +msgid "Unknown header flags present" +msgstr "不明なヘッダーフラッグが存在" + +msgid "Own search results" +msgstr "自分自身の検索結果数" + +msgid "Own queries" +msgstr "" + +msgid "Ancient query format" +msgstr "古いクエリー形式" + +msgid "Blank Servent ID" +msgstr "空のサーバントID" + +msgid "GUESS Query missing token" +msgstr "" + +msgid "GUESS Invalid query token" +msgstr "" + +msgid "DHT Invalid security token" +msgstr "" + +msgid "DHT Too many STORE requests" +msgstr "" + +msgid "DHT Malformed message" +msgstr "" + +msgid "G2 Unexpected message" +msgstr "" + +msgid "Cannot cross networks" +msgstr "" + msgid "No proxy" msgstr "使用しない" @@ -1087,11 +2211,9 @@ msgid "auto (recommended)" msgstr "自動設定 (推奨)" -# FIXME: node -> peer msgid "ultra node" msgstr "ウルトラピア" -# FIXME: node -> peer msgid "leaf node" msgstr "リーフ" @@ -1113,40 +2235,20 @@ msgid "own KUID lookup" msgstr "" -# FIXME: should be distinguished from the other, perhaps... -# -# NOTE: -# Automatically clear sources when... -# completed -# failed -# unavailable -# -#, fuzzy msgid "completing" -msgstr "完了した時" +msgstr "" -# FIXME: should be distinguished from the other, perhaps... -# -# NOTE: -# Automatically clear sources when... -# completed -# failed -# unavailable -# msgid "completed" msgstr "完了した時" -#, fuzzy msgid "shutdown" -msgstr "停止 (%s)" +msgstr "" -#, fuzzy msgid "active (recommended)" -msgstr "自動設定 (推奨)" +msgstr "" -#, fuzzy msgid "passive" -msgstr " 件が受動状態)" +msgstr "" msgid "Indicates whether the hostcache file is being read." msgstr "ホストのキャッシュファイルは読み込める状態にあります。" @@ -1195,17 +2297,12 @@ "持するようにします。ピア内へ許可する接続の最大件数よりも少なくしたほうが良い" "でしょう。" -#, fuzzy msgid "" "Don't allow more than this number of connections to other servents. As a " "rule of thumb you should reserve 256 b/s bandwidth per connection. Never use " "up all your bandwidth, leave a little space for TCP/IP overhead. It's not " "advisable that you set this to a value smaller than 40." msgstr "" -"他のサーバントへの接続をこの数以上許可しません。経験的に言うと、接続毎に 256 " -"ビット/秒の帯域幅が取られるものだと思って下さい。全ての帯域幅を使いきらずに、" -"TCP/IP オーバーへッドのための小さな空きを残して置いて下さい。この値を 30 より" -"小さくする事は望ましくありません。" msgid "Number of leaf nodes currently connected." msgstr "現在接続しているリーフの数です。" @@ -1275,10 +2372,10 @@ "is not used to guard against undue censorship." msgstr "" "gtk-gnutella が利用するローカル TCP ポートです。加入するプロバイダが TCP " -"6346 番ポートのトラフィックを遮断したり絞り込むかもしれませんので、1024-" -"65535 の範囲内で他の所へ変更するのが良いでしょう。必要に応じてファイアウォー" -"ルのポートを転送する/開けるのを忘れないで下さい。行き過ぎた検閲に対する防護の" -"ため、標準では TCP 6346番ポートは使用されない事を覚えておいて下さい。" +"6346 番ポートのトラフィックを遮断したり絞り込むかもしれませんので、" +"1024-65535 の範囲内で他の所へ変更するのが良いでしょう。必要に応じてファイア" +"ウォールのポートを転送する/開けるのを忘れないで下さい。行き過ぎた検閲に対する" +"防護のため、標準では TCP 6346番ポートは使用されない事を覚えておいて下さい。" msgid "Use this IP address as source address if 'force local ip' is activated." msgstr "「強制ローカルIP」を有効にすると、これを発信元アドレスとして用います。" @@ -1541,9 +2638,6 @@ msgid "Debug level for code shared between gui and core." msgstr "GUI とコアの間で共有されるコードのデバッグレベルです。" -msgid "Verbosity of Bitzi related debug messages." -msgstr "Bitzi 関連のデバッグメッセージの冗長度です。" - msgid "Verbosity of URL handling related debug messages." msgstr "URL ハンドリング関連のデバッグメッセージの冗長度です。" @@ -1622,7 +2716,6 @@ "を基にする迂回処理の「後に」なされます。この時間を基にする迂回措置を無効にす" "るには 0 を設定して下さい。" -#, fuzzy msgid "" "Ban the client if it violates the Retry-After interval too often. Set this " "to 0 to disable the banning. The upload will be removed from the queue in " @@ -1630,13 +2723,9 @@ "soon 10 times, which is a good balance between abuse and legacy client " "support." msgstr "" -"Retry-After の間隔を何度も違反するクライアントを接続禁止にします。これを無効" -"にするには 0 を設定しますが、アップロードに関しては、無効にしていてもキューか" -"ら削除されます。標準では 1 になっていますので、あまりにも早く再接続してくるク" -"ライアントは接続禁止にされます。" -msgid "For development use: track properties." -msgstr "開発用: 経路情報です。" +msgid "Indicates a kernel network buffer shortage." +msgstr "" msgid "For development use: don't add new hosts to the host cache." msgstr "開発用: 新規ホストをホストキャッシュへ追加しません。" @@ -1769,9 +2858,8 @@ msgid "Current number of hosts in regular node caches." msgstr "通常ピアキャッシュの現在のホスト数です。" -#, fuzzy msgid "Current number of IPv4 hosts in ultra node caches." -msgstr "ウルトラピアキャッシュの現在のホスト数です。" +msgstr "" msgid "Current number of hosts in bad node caches." msgstr "不正ピアキャッシュの現在のホスト数です。" @@ -1779,9 +2867,8 @@ msgid "Maximum number of hosts in the regular node cache." msgstr "リーフピアのキャッシュの最大ホスト数です。" -#, fuzzy msgid "Maximum number of IPv4 hosts in the ultra node cache." -msgstr "ウルトラピアのキャッシュの最大ホスト数です。" +msgstr "" msgid "Maximum number of hosts in the BUSY, UNSTABLE and TIMEOUT lists." msgstr "「使用中」、「不安定」、「タイムアウト」リストの最大ホスト数です。" @@ -2116,10 +3203,8 @@ msgid "" "Maximum amount of leaves we can accept. To be promoted Ultra, you should " -"reserve 32 bytes of bandwidth per leaf." +"reserve 32 bytes/sec of bandwidth per leaf." msgstr "" -"受け付け可能なリーフの最大数です。ウルトラピアへと昇格するには、リーフ毎に " -"32 バイトの帯域幅が必要になります。" msgid "What to do with files that will be ignored for downloading." msgstr "無視するファイルの表示方法です。" @@ -2390,7 +3475,6 @@ msgid "Whether we meet the bandwidth requirements to become an Ultra node." msgstr "ウルトラピアになるのに必要な帯域幅があるのかどうかを表します。" -# FIXME: should be revised. msgid "Whether we meet the UDP requirements to become an Ultra node." msgstr "ウルトラピアになるのに必要なUDPサポートがあるかどうかを表します。" @@ -2652,12 +3736,9 @@ msgid "" "If set to TRUE, the global hostiles.txt is used as well as the private " -"$GTK_GNUTELLA_DIR/hostiles.txt. This allows to separate your private ban " +"$GTK_GNUTELLA_DIR/hostiles.txt. This allows you to separate your private ban " "list from the global one distributed with gtk-gnutella." msgstr "" -"有効にすると、システム用の hostiles.txt が個人用の $GTK_GNUTELLA_DIR/" -"hostiles.txt と同様に使用されます。これにより個人用の禁止リストと Gtk-" -"Gnutella と共に配布されるシステム用の禁止リストを分ける事が可能になります。" msgid "If set to TRUE, SO_LINGER is used for sockets." msgstr "有効にすると、ソケットに SO_LINGER が使用されます。" @@ -2856,9 +3937,8 @@ msgid "Maximum time before removing hosts from the G2 cache." msgstr "G2キャッシュからホストを除外するまでの最長時間です。" -#, fuzzy msgid "Debug level for management of G2-only hosts." -msgstr "ダウンロード・メッシュ管理のデバッグレベルです。" +msgstr "" msgid "" "Whether GTKG can switch among the several files waiting to be downloaded " @@ -2871,7 +3951,6 @@ "disable unless you know what you are doing." msgstr "" -#, fuzzy msgid "" "When partial file sharing (PFSP) is enabled, gtk-gnutella will strive to " "download chunks in a random order, to maximize the spreading of the file in " @@ -2881,12 +3960,6 @@ "tail of the file as soon as possible. Set it to 0 to disable any tail-" "downloading preference." msgstr "" -"部分ファイル共有プロトコル (PFSP - Partial File Sharing Protocol ) が使用され" -"ると、順序に捕らわれずにチャンクをダウンロードしたり、ネットワーク内でのファ" -"イルの取得範囲を最大化されるようになります。しかし、これはファイルの監視(ファ" -"イルタイプ、プレビュー等)を不可能にしてしまいます。ここには、ファイルの先頭で" -"連続してダウンロードされるデータの最初のチャンクの大きさをバイトで設定して下" -"さい。大き過ぎる値は設定しないで下さい。" msgid "" "Whether GTKG should post-process filenames to remove consecutive '_' in the " @@ -2964,9 +4037,8 @@ "uploads and push-proxy exchanges." msgstr "" -#, fuzzy msgid "Debug level for (generic) file verification code." -msgstr "ファイル共有コードのデバッグレベルです。" +msgstr "" msgid "" "Maximum number of hosts in the local address cache, which remembers the " @@ -2981,13 +4053,10 @@ msgid "Debug level for management of local address cache." msgstr "ローカルアドレス・キャッシュ管理機能のデバッグレベルです。" -#, fuzzy msgid "" "If enabled, all packets enqueued for transmission are dumped to " "$GTK_GNUTELLA_DIR/packets_tx.dump." msgstr "" -"有効にすると、受信した全てのパケットを $GTK_GNUTELLA_DIR/packets_rx.dump にダ" -"ンプします。" msgid "Debug level the TCP message queues" msgstr "TCPメッセージキューのデバッグレベルです。" @@ -2995,13 +4064,10 @@ msgid "Debug level for the UDP message queue." msgstr "UDPメッセージキューのデバッグレベルです。" -#, fuzzy msgid "" "Maximum size of the UDP message queue (in bytes). Must be at least 150 " "percent of the maximum message size." msgstr "" -"ピアへの送信キューの最大サイズ (バイト単位) です。少なくとも最大メッセージサ" -"イズの 150 パーセントでなければなりません。" msgid "Debug level for the management of the clock accuracy." msgstr "クロック精度管理機能のデバッグレベルです。" @@ -3012,20 +4078,17 @@ msgid "Debug level for host management." msgstr "ホスト管理機能のデバッグレベルです。" -#, fuzzy msgid "Debug level for DHT root node caching." -msgstr "Pong キャッシュのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Logged statistics level for code shared between GUI and core." -msgstr "GUI とコアの間で共有されるコードのデバッグレベルです。" +msgstr "" -#, c-format msgid "" "If TRUE, the spam SHA1 database is kept in memory. If FALSE, it is kept in a " "fast disk database, which saves a large amount of core memory and reduces " "the overall footprint, at the cost of an increased I/O level. However, the " -"DB cache has typically a 90% hit rate, so the actual overhead is barely " +"DB cache has a 90 percent hit rate, so the actual overhead is barely " "noticeable when running as an ultra node and should remain completely " "unnoticed when running as a leaf." msgstr "" @@ -3036,13 +4099,11 @@ msgid "Debug level for lockfile management." msgstr "ロックファイル管理機能のデバッグレベルです。" -#, fuzzy msgid "Debug level for the zone-based memory allocator." -msgstr "シェルのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Debug level for the pool-based memory allocator." -msgstr "シェルのデバッグレベルです。" +msgstr "" msgid "Debug level for the RX buffer allocator." msgstr "受信バッファ割り当て機能のデバッグレベルです。" @@ -3059,32 +4120,26 @@ msgid "Debug level for the virtual memory manager." msgstr "仮想メモリ管理機能のデバッグレベルです。" -#, fuzzy msgid "Debug level for final shutdown." -msgstr "ファイル情報のデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Country preferences" -msgstr "国別環境設定" +msgstr "" -#, fuzzy msgid "Debug level for country limits." -msgstr "検索クエリーのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Whether to log dropped Gnutella messages" -msgstr "Gnutella メッセージのデバッグレベルです。" +msgstr "" msgid "Debug level for whitelist management." msgstr "ホワイトリスト管理機能のデバッグレベルです。" -#, fuzzy msgid "Debug level for DHT token caching." -msgstr "Pong キャッシュのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Debug level for DHT publishing from Gnutella." -msgstr "ファイル共有コードのデバッグレベルです。" +msgstr "" msgid "Defines which DHT messages should be traced." msgstr "" @@ -3104,21 +4159,17 @@ msgid "Debug level for bandwidth scheduler." msgstr "帯域幅スケジューラー機能のデバッグレベルです。" -#, fuzzy msgid "Debug level for the DHT stable node recorder." -msgstr "DHT ユーザー参照キューのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Debug level for the file (re)loading, on change." -msgstr "ファイル共有コードのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Debug level for the file moving, accross filesystems." -msgstr "ファイル共有コードのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Debug level for query hit message generation." -msgstr "メッセージ経路制御のデバッグレベルです。" +msgstr "" msgid "Debug level for version management." msgstr "バージョン管理機能のデバッグレベルです。" @@ -3129,9 +4180,8 @@ msgid "Maximum CPU frequency, in Hz." msgstr "" -#, fuzzy msgid "DHT bootstrap status." -msgstr "DHTトラフィック統計" +msgstr "" msgid "" "The DHT running mode. An active node will be able to store values and is a " @@ -3146,39 +4196,32 @@ msgid "Current DHT running mode." msgstr "" -#, fuzzy msgid "Debug level for the one-time memory allocator." -msgstr "シェルのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Debug level for the host cache." -msgstr "シェルのデバッグレベルです。" +msgstr "" msgid "Random bits." msgstr "" -#, fuzzy msgid "Average servent downtime." -msgstr "サーバントの平均稼動時間です。" +msgstr "" msgid "Time when last shutdown occurred." msgstr "" -#, fuzzy msgid "Debug level for alive pings." -msgstr "ファイル情報のデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Debug level for the versatile XML layer." -msgstr "UDP トラフィックレイヤのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Debug level for the UPnP layer." -msgstr "UDP トラフィックレイヤのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Debug level for the SOAP layer." -msgstr "UDP トラフィックレイヤのデバッグレベルです。" +msgstr "" msgid "Defines SOAP exchanges tracing type." msgstr "" @@ -3211,9 +4254,8 @@ msgid "Whether gtk-gnutella can install port mappings, if needed." msgstr "" -#, fuzzy msgid "Debug level for the NAT-PMP layer." -msgstr "UDP トラフィックレイヤのデバッグレベルです。" +msgstr "" msgid "" "Whether NAT-PMP (NAT Port Mapping Protocol) should be enabled. Support for " @@ -3230,48 +4272,37 @@ "mappings, if required." msgstr "" -#, fuzzy msgid "Debug level for the TX (transmit) network layer." -msgstr "UDP トラフィックレイヤのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Debug level for the RX (receive) network layer." -msgstr "UDP トラフィックレイヤのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Debug level for the I/O input event layer." -msgstr "UDP トラフィックレイヤのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Debug level for the background task scheduler." -msgstr "帯域幅スケジューラー機能のデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Whether gtk-gnutella was able to configure port mappings." -msgstr "インターネットに接続しています。" +msgstr "" -#, fuzzy msgid "Whether gtk-gnutella disabled HTTP bandwidth stealing." -msgstr "インターネットに接続しています。" +msgstr "" -#, fuzzy msgid "Whether gtk-gnutella ignores HTTP stolen bandwidth." -msgstr "インターネットに接続しています。" +msgstr "" msgid "Whether gtk-gnutella enforces uniform HTTP outgoing bandwidth." msgstr "" -#, fuzzy msgid "" "Whether gtk-gnutella should use HTTP request pipelining when possible, in " "order to decrease downloading latency." msgstr "" -"あなたのサーバーのホスト名を、ダウンローダーや検索クエリーヒットで知らせま" -"す。" -#, fuzzy msgid "Maximum chunk size when swarming with HTTP pipelining." -msgstr "多元ダウンロードする時の最大チャンクサイズです。" +msgstr "" msgid "" "Whether the Gnutella UDP Extension for Scalable Searches (GUESS) should be " @@ -3293,25 +4324,20 @@ "Searches)." msgstr "" -#, fuzzy msgid "Maximum number of IPv4 hosts in the regular GUESS cache." -msgstr "リーフピアのキャッシュの最大ホスト数です。" +msgstr "" -#, fuzzy msgid "Current number of IPv4 hosts in the regular GUESS cache." -msgstr "通常ピアキャッシュの現在のホスト数です。" +msgstr "" -#, fuzzy msgid "Maximum number of IPv4 hosts in the introduction GUESS cache." -msgstr "G2ノードのキャッシュの最大ホスト数です。" +msgstr "" -#, fuzzy msgid "Current number of IPv4 hosts in the introduction GUESS cache." -msgstr "ウルトラピアキャッシュの現在のホスト数です。" +msgstr "" -#, fuzzy msgid "Debug level for the DB disk/RAM storage layer." -msgstr "UDP トラフィックレイヤのデバッグレベルです。" +msgstr "" msgid "" "The current Session ID. This is a unique ID generated each time gtk-" @@ -3339,13 +4365,11 @@ "overall" msgstr "" -#, fuzzy msgid "Debug level for the matching code." -msgstr "禁止処理コードのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Debug level for the time synchronization code." -msgstr "ファイル共有コードのデバッグレベルです。" +msgstr "" msgid "" "Whether queries can request partial results hits, i.e. files which are " @@ -3358,9 +4382,8 @@ "are returned." msgstr "" -#, fuzzy msgid "Whether what's-new? queries should be answered to." -msgstr "伝送した検索クエリーの数を表示するかどうかを選択します。" +msgstr "" msgid "" "When set, gtk-gnutella will automatically stop opened searches from which " @@ -3368,162 +4391,240 @@ "configured expiration time." msgstr "" -#, fuzzy msgid "Maximum number of results to show in a What's New? request." -msgstr "ホスト参照リクエストで表示する最大数です。" +msgstr "" -#, fuzzy msgid "Maximum number of results to show in a passive search request." -msgstr "ホスト参照リクエストで表示する最大数です。" +msgstr "" -#, fuzzy msgid "Whether to log duplicate Gnutella messages from same node." -msgstr "Gnutella メッセージのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Whether to log duplicate Gnutella messages with a higher TTL." -msgstr "Gnutella メッセージのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Whether to log duplicate Gnutella messages (not from same node)." -msgstr "Gnutella メッセージのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Whether to log new Gnutella messages, never seen before." -msgstr "Gnutella メッセージのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Whether to log Gnutella routing decisions." -msgstr "Gnutella メッセージのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Whether to log bad Gnutella messages, corrupted or unexpected." -msgstr "Gnutella メッセージのデバッグレベルです。" +msgstr "" msgid "Whether to log conditions triggering query hit spam flagging." msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the ultra node cache." -msgstr "ウルトラピアのキャッシュの最大ホスト数です。" +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in ultra node caches." -msgstr "ウルトラピアキャッシュの現在のホスト数です。" +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in the regular GUESS cache." -msgstr "通常ピアキャッシュの現在のホスト数です。" +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in the introduction GUESS cache." -msgstr "ウルトラピアキャッシュの現在のホスト数です。" +msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the regular GUESS cache." -msgstr "リーフピアのキャッシュの最大ホスト数です。" +msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the introduction GUESS cache." -msgstr "G2ノードのキャッシュの最大ホスト数です。" +msgstr "" -#, fuzzy msgid "Debug level for the malloc() replacement allocator." -msgstr "シェルのデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Debug level for bad query hit messages." -msgstr "メッセージ経路制御のデバッグレベルです。" +msgstr "" -#, fuzzy msgid "Debug level for GUID management." -msgstr "ホスト管理機能のデバッグレベルです。" +msgstr "" -msgid "disable" -msgstr "表示しない" +msgid "Debug level for the TX (transmit) deflating network layer." +msgstr "" -msgid "by words" -msgstr "単語に分けて表示" +msgid "Comma-separated list of TX debugging hosts (IP addresses only)" +msgstr "" -msgid "by whole query" -msgstr "クエリー全体を表示" +msgid "" +"Comma-separated list of hosts for whom we want to dump RX traffic (IP " +"addresses only)" +msgstr "" -msgid "by router" -msgstr "隣接ピアからのクエリーを表示" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they emit " +"(IP addresses only)" +msgstr "" -msgid "TCP & UDP" -msgstr "TCPとUDP" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they " +"receive (IP addresses only)" +msgstr "" -msgid "TCP only" -msgstr "TCPのみ" +msgid "" +"Allow GUESS to use some of the unused Gnutella outgoing bandwidth regardless " +"of the GUESS bandwidth hint. If FALSE, only the configured bandwidth hint " +"will be used. When running as a leaf this should be set to TRUE to make " +"GUESS queries run faster." +msgstr "" -msgid "UDP only" -msgstr "UDPのみ" +msgid "Debug level for the UDP TX scheduler." +msgstr "" -msgid "Ping" -msgstr "Ping" +msgid "" +"Debugging flags for the semi-reliable UDP TX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: transmissions, 16: timeouts." +msgstr "" -msgid "Pong" -msgstr "Pong" +msgid "Comma-separated list of RX debugging hosts (IP addresses only)" +msgstr "" -msgid "Bye" -msgstr "Bye" +msgid "" +"Debugging flags for the semi-reliable UDP RX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: receptions, 16: timeouts." +msgstr "" -msgid "QRP" -msgstr "QRP" +msgid "Whether to log sent semi-reliable UDP messages." +msgstr "" -msgid "HSEP" -msgstr "HSEP" +msgid "Whether to log received semi-reliable UDP messages." +msgstr "" -msgid "RUDP" -msgstr "RUDP" +msgid "Debug level for the secured OOB query hit claiming." +msgstr "" -msgid "Vendor spec." -msgstr "ベンダー特定" +msgid "Whether to log sent vendor messages." +msgstr "" -msgid "Vendor std." -msgstr "ベンダー標準" +msgid "Whether to log received vendor messages." +msgstr "" -msgid "Push" -msgstr "PUSH" +msgid "Debugging flags for the DHT token cache (developers only)." +msgstr "" -msgid "Query" -msgstr "検索クエリー" +msgid "Whether to log weird DHT message headers when debugging." +msgstr "" -msgid "Query Hit" -msgstr "検索クエリーヒット" +msgid "Debug level for the DHT Remote Procedure Call (RPC) code." +msgstr "" -#, fuzzy -msgid "DHT Ping" -msgstr "Ping" +msgid "Whether to log UHC pings we receive." +msgstr "" -#, fuzzy -msgid "DHT Pong" -msgstr "Pong" +msgid "Whether to log UHC pings we emit." +msgstr "" -#, fuzzy -msgid "DHT Store" -msgstr "DHTトラフィック" +msgid "Whether the program was properly shutdown." +msgstr "" -msgid "DHT Store Ack" +msgid "Whether the program restarted after a clean shutdown." msgstr "" -msgid "DHT Find Node" +msgid "Debug level for DHT key management." msgstr "" -msgid "DHT Found Node" +msgid "Debug level for DHT value management." msgstr "" -msgid "DHT Find Value" +msgid "ID of the current process." msgstr "" -#, fuzzy -msgid "DHT Value" -msgstr "値" +msgid "Debug level for HTTP range parsing / handling." +msgstr "" -# FIXME: separation (src/if/gui_property.c: Total -> All) -msgid "Total" -msgstr "合計" +msgid "" +"Lease time when installing port mappings via UPnP or NAT-PMP, in seconds. A " +"value of 0 requests permanent mappings." +msgstr "" + +msgid "Whether the program is auto-restarting at the user's request." +msgstr "" + +msgid "Debug level for time management." +msgstr "" + +msgid "Debug level for the tmalloc() thread-magazine object distributor." +msgstr "" + +msgid "Debug level for the event queue thread." +msgstr "" + +msgid "Maximum number of G2 hubs in the hub cache." +msgstr "" + +msgid "Current number of IPv4 hosts in the G2 hub caches." +msgstr "" + +msgid "Whether the G2 protocol should be enabled." +msgstr "" + +msgid "Number of G2 nodes currently connected." +msgstr "" + +msgid "Maximum amount of G2 hubs we should connect to as a leaf." +msgstr "" + +msgid "Whether to log bad G2 messages, corrupted or unexpected." +msgstr "" + +msgid "Whether to log dropped G2 messages" +msgstr "" + +msgid "Debug level for the G2 RPC layer." +msgstr "" + +msgid "Whether to log summary of received query hits" +msgstr "" + +msgid "Whether to log summary of each record in received query hits" +msgstr "" + +msgid "Number of G2 browsing requests received in this session." +msgstr "" + +msgid "Number of G2 browsing requests fully served in this session." +msgstr "" + +msgid "Whether to log G2 messages we're attempting to send" +msgstr "" + +msgid "" +"Timestamp at which the current session was started. This stamp remains " +"unchanged when gtk-gnutella restarts after a crash or an explicit restart " +"request." +msgstr "" + +msgid "No TCP listening socket bound to allow incoming connections." +msgstr "" + +msgid "disable" +msgstr "表示しない" + +msgid "by words" +msgstr "単語に分けて表示" + +msgid "by whole query" +msgstr "クエリー全体を表示" + +msgid "by router" +msgstr "隣接ピアからのクエリーを表示" + +msgid "TCP & UDP" +msgstr "TCPとUDP" + +msgid "TCP only" +msgstr "TCPのみ" + +msgid "UDP only" +msgstr "UDPのみ" + +msgid "Query Hit" +msgstr "検索クエリーヒット" msgid "Icons" msgstr "アイコンのみ" @@ -3558,7 +4659,6 @@ msgid "2 weeks" msgstr "2週間" -# XXX: it's completely free translation msgid "Search monitor enabled." msgstr "あなたのピアを通過する検索クエリーをチェックします。" @@ -3984,7 +5084,7 @@ msgstr "" msgid "" -"Discard search results whith an alien IP address, not matching the one from " +"Discard search results with an alien IP address, not matching the one from " "which the results come from." msgstr "" @@ -3993,6 +5093,17 @@ "be restarted when gtk-gnutella is launched." msgstr "" +msgid "Discard search results coming from servents with a banned GUID." +msgstr "" + +msgid "Whether a summary line with GUESS search stats should be displayed." +msgstr "" + +msgid "" +"Whether the GUESS summary line should show total statistics or ones " +"pertaining to the current search only." +msgstr "" + msgid "Anonymizing proxies" msgstr "匿名プロキシサーバー" @@ -4080,6 +5191,9 @@ msgid "Benin" msgstr "ベナン共和国" +msgid "Saint Barthelemy" +msgstr "" + msgid "Bermuda" msgstr "英領バミューダ諸島" @@ -4089,6 +5203,9 @@ msgid "Bolivia" msgstr "ボリビア共和国" +msgid "Bonaire, Sint Eustatius and Saba" +msgstr "" + msgid "Brazil" msgstr "ブラジル連邦共和国" @@ -4098,6 +5215,9 @@ msgid "Bhutan" msgstr "ブータン王国" +msgid "Burma" +msgstr "" + msgid "Bouvet Island" msgstr "諾領ブーヴェ島" @@ -4158,6 +5278,9 @@ msgid "Cape Verde" msgstr "カーボヴェルデ共和国" +msgid "Curacao" +msgstr "" + msgid "Christmas Island" msgstr "豪領クリスマス諸島" @@ -4383,9 +5506,8 @@ msgid "Lebanon" msgstr "レバノン共和国" -#, fuzzy msgid "Saint Lucia" -msgstr "セントルシア" +msgstr "" msgid "Liechtenstein" msgstr "リヒテンシュタイン公国" @@ -4423,9 +5545,8 @@ msgid "Montenegro" msgstr "モンテネグロ共和国" -#, fuzzy msgid "Saint Martin" -msgstr "サンマリノ共和国" +msgstr "" msgid "Madagascar" msgstr "マダガスカル共和国" @@ -4625,12 +5746,18 @@ msgid "Suriname" msgstr "スリナム共和国" +msgid "South Sudan" +msgstr "" + msgid "Sao Tome and Principe" msgstr "サントメ・プリンシペ民主共和国" msgid "El Salvador" msgstr "エルサルバドル共和国" +msgid "Sint Maarten" +msgstr "" + msgid "Syrian Arab Republic" msgstr "シリア・アラブ共和国" @@ -4785,9 +5912,8 @@ msgid "locale_get_language|en" msgstr "ja" -#, fuzzy msgid "unofficial build, accessing files from" -msgstr "これは非公式ビルドです、このフォルダのファイルにアクセスします:" +msgstr "" msgid "URL missing" msgstr "URLがありません" @@ -4807,15 +5933,12 @@ msgid "No help available" msgstr "ヘルプは参照できません" -# FIXME: separation (src/ui/gtk/gtk2/gnet_stats.c) msgid "Hops" msgstr "ホップ数" -# FIXME: separation (src/ui/gtk/gtk2/gnet_stats.c) msgid "Nodes" msgstr "ピア数" -# FIXME: separation (src/ui/gtk/gtk2/gnet_stats.c) msgid "Files" msgstr "ファイル数" @@ -4836,37 +5959,39 @@ msgid "Interactive mode turned off." msgstr "インタラクティブモードが無効になりました。" -#, fuzzy +#, c-format +msgid "Unknown operation \"show %s\"" +msgstr "" + +#, c-format +msgid "Unknown operation \"%s\"" +msgstr "" + msgid "Cannot determine current working directory" -msgstr "ホームフォルダが見つかりません!" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Unknown logfile name \"%s\"" -msgstr "不明なプロパティ \"%s\"" +msgstr "" -#, fuzzy msgid "Unable to reopen" -msgstr "GIV を送信できません" +msgstr "" #, c-format msgid "Could not rename logfile as \"%s\": %m" msgstr "" -#, fuzzy, c-format -msgid "Unknown operation \"%s\"" -msgstr "不明な操作です" - -#, fuzzy, c-format -msgid "Unknown operation \"show %s\"" -msgstr "不明な操作です" - -#, fuzzy, c-format +#, c-format msgid "Unknown operation \"stats %s\"" -msgstr "不明な操作です" +msgstr "" + +#, c-format +msgid "Unknown operation \"check %s\"" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Unknown operation \"usage %s\"" -msgstr "不明な操作です" +msgstr "" msgid "Invalid IP/Port" msgstr "無効なIP/ポート" @@ -4880,7 +6005,6 @@ msgid "Invalid port" msgstr "無効なポート" -# FIXME: node -> peer #, c-format msgid "Removed %u node" msgid_plural "Removed %u nodes" @@ -4905,6 +6029,9 @@ msgid "Good bye" msgstr "Good Bye" +msgid "Invalid command syntax" +msgstr "無効なコマンド行です" + msgid "Query string missing" msgstr "検索クエリー文字列がありません" @@ -4923,6 +6050,9 @@ msgid "Value missing" msgstr "値がありません" +msgid "Property cannot be changed" +msgstr "" + #, c-format msgid "Previous value was %s" msgstr "" @@ -4943,12 +6073,13 @@ msgid "unterminated single-quoted string" msgstr "" -msgid "Invalid command syntax" -msgstr "無効なコマンド行です" - msgid "too many arguments in command" msgstr "引数が多すぎます" +#, c-format +msgid "un-parseable argument #%u in command" +msgstr "" + msgid "Malformed command" msgstr "変なコマンドです" @@ -4959,101 +6090,6 @@ msgid "Help: " msgstr "へルプ: " -msgid "Bitzi|Unknown" -msgstr "不明" - -# NOTE: (from http://bitzi.com/help/judge) -# -# You believe others have incorrectly judged the file negatively. -# -msgid "Bitzi|Unrated" -msgstr "未評価" - -msgid "Bitzi|Bitzi lookup failure" -msgstr "参照失敗" - -msgid "Bitzi|Filesize mismatch" -msgstr "ファイルサイズの不一致" - -# NOTE: (from http://bitzi.com/help/judge) -# -# The file is potentially dangerous (e.g., software containing a virus) -# or purposefully misleading (e.g., music files containing advertisements -# or noise after the first 30 seconds). -# -msgid "Bitzi|Dangerous/Misleading" -msgstr "危険/誤解を招く" - -# NOTE: (from http://bitzi.com/help/judge) -# -# The file is truncated or otherwise incomplete or contains serious -# errors (e.g., skips in the case of an audio file). -# -msgid "Bitzi|Incomplete/Damaged" -msgstr "不完全/欠損あり" - -# NOTE: (from http://bitzi.com/help/judge) -# -# The file's overall quality is low (e.g., obvious pixelization in the -# case of a video file). -# -msgid "Bitzi|Substandard" -msgstr "標準以下" - -# NOTE: (from http://bitzi.com/help/judge) -# -# You believe others have incorrectly judged the file positively. -# -msgid "Bitzi|Overrated" -msgstr "過大評価" - -# NOTE: (from http://bitzi.com/help/judge) -# -# You can't vouch for the file's quality, but can't find anything to -# complain about either. -# -msgid "Bitzi|Normal" -msgstr "普通" - -# NOTE: (from http://bitzi.com/help/judge) -# -# You believe others have incorrectly judged the file negatively. -# -msgid "Bitzi|Underrated" -msgstr "過小評価" - -# NOTE: (from http://bitzi.com/help/judge) -# -# The file in question isn't truncated or otherwise damaged. -# -msgid "Bitzi|Complete" -msgstr "完全" - -# NOTE: (from http://bitzi.com/help/judge) -# -# You recommend this copy to others interested in the encapsulated work. -# Presumably this means the file is complete and has no obvious flaws. -# This is a good judgement to use if you wholeheartedly endorse a file, -# but aren't so sure that better versions aren't likely to exist. -# -msgid "Bitzi|Recommended" -msgstr "推奨" - -# NOTE: (from http://bitzi.com/help/judge) -# -# There's no reason to think a superior copy exists. Note that there -# could be multiple "best" copies. For example, a 192kbps encoding of a -# song and a 64kbps encoding may both be the "best" available copies in -# different contexts - the first where uncompromising quality is most -# important, the second where small filesize is most important. This is -# a very fuzzy area - use your best bitizen judgement! -# -msgid "Bitzi|Best Version" -msgstr "最良版" - -msgid "No other data" -msgstr "他のデータはありません" - msgid "Filename" msgstr "ファイル名" @@ -5079,11 +6115,17 @@ msgid "Tigertree" msgstr "TigerTree" -msgid "External metadata" -msgstr "外部メタデータ" +msgid "Rescheduled for" +msgstr "" -msgid "Bitzi URL" -msgstr "Bitzi URL" +msgid "Restartable since" +msgstr "" + +msgid "rescheduled for" +msgstr "" + +msgid "restartable since" +msgstr "" #, c-format msgid " (slot %u" @@ -5093,7 +6135,6 @@ msgid " retry in %us" msgstr " %u秒後に再実行" -# FIXME: separation (src/ui/gtk/gtk2/upload_stats.c: Complete -> Completes) msgid "Complete" msgstr "完了" @@ -5115,13 +6156,6 @@ msgid "Sending push" msgstr "PUSH を送信しています" -# NOTE: this string is used as follows -# -# 'Failed to send push via 127.0.0.1:6346' -# 'Push sent directly via 127.0.0.1:6346' -# 'Push sent push via 127.0.0.1:6346' -# 'Sending push via 127.0.0.1:6346' -# #, c-format msgid " via %s" msgstr " (%s 経由)" @@ -5135,9 +6169,8 @@ msgid "Reading headers" msgstr "へッダを読込んでいます" -#, fuzzy msgid "UDP push sent" -msgstr "PUSH を送信しました" +msgstr "" msgid "Searching for new push-proxies" msgstr "" @@ -5164,20 +6197,18 @@ msgid "Chunk done" msgstr "チャンクが完了しました" -#, fuzzy msgid "Waiting for TTH checking..." -msgstr "SHA1 確認を待っています..." +msgstr "" msgid "Waiting for SHA1 checking..." msgstr "SHA1 確認を待っています..." -#, fuzzy, c-format +#, c-format msgid "Computing %s (%.02f%%)" -msgstr "SHA1 を算出しています (%.02f%%)" +msgstr "" -#, fuzzy msgid "TTH OK" -msgstr "TTH" +msgstr "" msgid "SHA-1 OK" msgstr "SHA-1 OK" @@ -5205,31 +6236,23 @@ msgid "(stalled)" msgstr "(停滞中)" -#, fuzzy msgid "Receiving data" -msgstr "ヘッダーを受信しています" +msgstr "" msgid "ignoring" msgstr "無視します" -#, fuzzy msgid "selected next" -msgstr "選択されたプロパティ:" +msgstr "" -#, fuzzy msgid "requesting next" -msgstr "リクエストを送信しました" +msgstr "" -#, fuzzy msgid "requested next" -msgstr "リクエストを送信しました" +msgstr "" -#, fuzzy msgid "Awaiting data" -msgstr "待受中" - -msgid "Unknown error" -msgstr "不明なエラー" +msgstr "" #, c-format msgid "Retry in %us" @@ -5331,7 +6354,6 @@ msgid "Filter" msgstr "フィルター" -# MERGLEBLE: Rule -> Rules msgid "Rule" msgstr "ルール数" @@ -5347,7 +6369,6 @@ msgid "Target" msgstr "ターゲット" -# MERGEBLE: msgid "(case-sensitive)" msgstr "(大・小文字を区別)" @@ -5401,27 +6422,21 @@ msgid "Always" msgstr "常に" -# FIXME: msgid "busy is set" msgstr "「使用中」になっている" -# FIXME: msgid "busy is not set" msgstr "「使用中」になっていない" -# FIXME: msgid "push is set" msgstr "「PUSH」になっている" -# FIXME: msgid "push is not set" msgstr "「PUSH」になっていない" -# FIXME: msgid "stable is set" msgstr "「安定」になっている" -# FIXME: msgid "stable is not set" msgstr "「安定」になっていない" @@ -5432,22 +6447,18 @@ msgid "Always (all flags ignored)" msgstr "常に (全てのフラッグを無視)" -# FIXME: msgid "DISPLAY is undefined" msgstr "「表示する」が未定義" -# FIXME: separation msgid "DISPLAY" msgstr "表示する" msgid "DON'T DISPLAY" msgstr "表示しない" -# FIXME: msgid "DOWNLOAD is undefined" msgstr "「ダウンロードする」が未定義" -# FIXME: separation msgid "DOWNLOAD" msgstr "ダウンロードする" @@ -5498,664 +6509,6 @@ msgid "RETURN" msgstr "リターン" -msgid "Query hit" -msgstr "検索クエリーヒット" - -msgid "DHT (truncated)" -msgstr "" - -msgid "Routing errors" -msgstr "経路制御エラー" - -#, fuzzy -msgid "Routing table chunks" -msgstr "検索クエリー経路制御テーブルの生成番号です。" - -msgid "Routing table message capacity" -msgstr "" - -msgid "Routing table message count" -msgstr "" - -# XXX: wtf -msgid "Duplicates with higher TTL" -msgstr "高TTLでの重複" - -msgid "SPAM SHA1 database hits" -msgstr "" - -#, fuzzy -msgid "SPAM filename and size hits" -msgstr "ファイル名が「%s」%s で終わる" - -msgid "SPAM fake hits" -msgstr "" - -msgid "SPAM duplicate hits" -msgstr "" - -msgid "SPAM dynamically caught hostile IP addresses" -msgstr "" - -msgid "SPAM dynamically caught hostile IP held" -msgstr "" - -msgid "SPAM spotted spamming IP addresses held" -msgstr "" - -# XXX: free translation -msgid "Searches to local DB" -msgstr "あなたの共有ファイルへの検索" - -# XXX: free translation -msgid "Hits on local DB" -msgstr "あなたの共有ファイルにヒット" - -# XXX: free translation -#, fuzzy -msgid "Hits on local partial files" -msgstr "あなたの共有ファイルにヒット" - -msgid "Hits on \"what's new?\" queries" -msgstr "" - -# XXX: free translation -msgid "Query hits received for local queries" -msgstr "あなたの検索クエリーが受取った検索クエリーヒット" - -# XXX: wtf -msgid "Query hits received for OOB-proxied queries" -msgstr "OOBプロキシ検索クエリーで受取った検索クエリーヒット" - -# XXX: wtf -msgid "Queries requesting OOB hit delivery" -msgstr "OOBヒット配送を要求する検索クエリー" - -# XXX: wtf -msgid "Stripped OOB flag on queries" -msgstr "検索クエリーでの削除済OOBフラッグ" - -# XXX: wtf -msgid "Duplicate OOB-proxied queries" -msgstr "重複するOOBプロキシ検索クエリー" - -# XXX: wtf -msgid "OOB hits received for OOB-proxied queries" -msgstr "OOBプロキシ検索クエリーで受取ったOOBヒット" - -# XXX: wtf -msgid "OOB hits bearing alien IP address" -msgstr "無関係なIPアドレスに関するOOBヒット" - -msgid "OOB hits ignored due to identified spamming address" -msgstr "" - -# XXX: wtf -msgid "Unclaimed locally-generated OOB hits" -msgstr "要求のないローカル生成OOBヒット" - -# XXX: wtf -msgid "Partially claimed locally-generated OOB hits" -msgstr "一部要求されているローカル生成OOBヒット" - -# XXX: wtf -msgid "Spurious OOB hit claiming received" -msgstr "受信した偽のOOBヒット要求" - -# XXX: wtf -msgid "Unrequested OOB hits received" -msgstr "リクエストしていないOOBヒットの受信数" - -msgid "Received query hits for untracked queries" -msgstr "" - -msgid "Tracked query MUIDs" -msgstr "" - -msgid "Compacted queries" -msgstr "圧縮検索クエリー" - -# XXX: wtf -msgid "Bytes saved by compacting" -msgstr "圧縮保存済バイト" - -msgid "UTF8 queries" -msgstr "UTF8検索クエリー" - -msgid "SHA1 queries" -msgstr "SHA1検索クエリー" - -#, fuzzy -msgid "\"What's New?\" queries" -msgstr "生成検索クエリー数" - -#, fuzzy -msgid "GUESS queries" -msgstr "UTF8検索クエリー" - -#, fuzzy -msgid "GUESS queries (0.2)" -msgstr "UTF8検索クエリー" - -msgid "GUESS cached query keys held" -msgstr "" - -msgid "GUESS cached 0.2 hosts held" -msgstr "" - -#, fuzzy -msgid "GUESS locally generated queries" -msgstr "ローカル生成の動的検索クエリー" - -msgid "GUESS currently running queries" -msgstr "" - -# XXX: free translation -#, fuzzy -msgid "GUESS hits received for locally generated queries" -msgstr "あなたの検索クエリーが受取った検索クエリーヒット" - -msgid "GUESS hosts queried" -msgstr "" - -msgid "GUESS hosts sending back an acknowledgment" -msgstr "" - -msgid "Broadcasted push messages" -msgstr "広域送信PUSHメッセージ" - -msgid "Push-proxy UDP relayed messages" -msgstr "PUSHプロキシUDP中継メッセージ" - -msgid "Push-proxy TCP relayed messages" -msgstr "PUSHプロキシTCP中継メッセージ" - -msgid "Push-proxy broadcasted messages" -msgstr "PUSHプロキシ広域送信メッセージ" - -msgid "Push-proxy found un-proxied local route" -msgstr "" - -msgid "Push-proxy lookup failures" -msgstr "PUSHプロキシ参照失敗" - -msgid "Push relayed via local route" -msgstr "" - -msgid "Push relayed via routing table" -msgstr "" - -msgid "Locally generated dynamic queries" -msgstr "ローカル生成の動的検索クエリー" - -msgid "Leaf-generated dynamic queries" -msgstr "リーフ生成の動的検索クエリー" - -# XXX: wtf -msgid "OOB-proxied leaf queries" -msgstr "プロキシOOBリーフ検索クエリー" - -# XXX: wtf -msgid "Fully completed dynamic queries" -msgstr "完全完成の動的検索クエリー" - -# XXX: wtf -msgid "Partially completed dynamic queries" -msgstr "部分完成の動的検索クエリー" - -msgid "Dynamic queries ended with no results" -msgstr "結果無しで終了した動的検索クエリー" - -# XXX: wtf -msgid "Fully completed dynamic queries getting late results" -msgstr "後に結果を得る完全完成の動的検索クエリー" - -# XXX: wtf -msgid "Dynamic queries with partial late results" -msgstr "後の部分的な結果を伴う動的検索クエリー" - -# XXX: wtf -msgid "Dynamic queries completed by late results" -msgstr "後の結果で完成する動的検索クエリー" - -msgid "Queries seen from GTKG" -msgstr "GTKGからの検索クエリー" - -msgid "Queries seen from GTKG that were re-queries" -msgstr "GTKGからの検索クエリー (再問合わせ)" - -msgid "Queries advertising support of GGEP \"H\"" -msgstr "GGEP「H」への対応を知らせる検索クエリー" - -msgid "GIV callbacks received" -msgstr "受信したGIVコールバック" - -msgid "GIV discarded due to no suitable download" -msgstr "" - -msgid "QUEUE callbacks received" -msgstr "受信したQUEUEコールバック" - -msgid "QUEUE discarded due to no suitable download" -msgstr "" - -msgid "UDP messages with bogus source IP" -msgstr "UDPメッセージ (偽の送信元IP)" - -msgid "Alien UDP messages (non-Gnutella)" -msgstr "無関係なUDPメッセージ (非Gnutella)" - -msgid "Unprocessed UDP Gnutella messages" -msgstr "未処理のUDPメッセージ (Gnutella)" - -msgid "Compressed UDP messages enqueued" -msgstr "キューにある圧縮UDPメッセージ" - -msgid "Compressed UDP messages received" -msgstr "受信した圧縮UDPメッセージ" - -# XXX: wtf -msgid "Uncompressed UDP messages due to no gain" -msgstr "有効性が無いため圧縮されないUDPメッセージ" - -msgid "Consolidated servers (after GUID and IP address linking)" -msgstr "" - -msgid "Duplicate downloads found during server consolidation" -msgstr "" - -msgid "Discovered server GUIDs" -msgstr "発見されたサーバントGUID" - -msgid "Changed server GUIDs" -msgstr "変更されたサーバントGUID" - -msgid "Detected GUID collisions" -msgstr "競合しているGUID" - -msgid "Detected collisions with our own GUID" -msgstr "競合しているGTKGのGUID" - -msgid "GUID dynamically banned" -msgstr "" - -msgid "Firewalled node info for known hosts received in upload requests" -msgstr "" - -msgid "Revitalized PUSH routes" -msgstr "" - -msgid "Collected new PUSH proxies from other query hits" -msgstr "" - -msgid "Attempted download resource switching on completion" -msgstr "" - -msgid "Attempted download resource switching after error" -msgstr "" - -msgid "Successful download resource switching (all kind)" -msgstr "" - -msgid "Successful download resource switching between plain files" -msgstr "" - -msgid "Successful download resource switching after error" -msgstr "" - -msgid "Actively queued after resource switching attempt" -msgstr "" - -msgid "Sunk HTTP reply data on error codes" -msgstr "" - -msgid "Ignored downloaded data" -msgstr "破棄されたダウンロード済データ" - -msgid "Ignoring requested after data mismatch" -msgstr "" - -msgid "Ignoring requested to preserve connection" -msgstr "" - -msgid "Ignoring requested due to aggressive swarming" -msgstr "" - -msgid "Ignoring refused (data too large or server too slow)" -msgstr "" - -msgid "Client resource switching (all detected)" -msgstr "" - -msgid "Client resource switching between plain files" -msgstr "" - -msgid "Client follow-up request after HTTP error was returned" -msgstr "" - -msgid "PARQ client resource switching in slots (SHA-1 based)" -msgstr "" - -msgid "PARQ client retry-after violation" -msgstr "" - -msgid "PARQ client kicked out after too many retry-after violations" -msgstr "" - -msgid "PARQ upload slot limit overrides" -msgstr "" - -msgid "PARQ quick upload slots granted" -msgstr "" - -msgid "PARQ QUEUE sending attempts" -msgstr "" - -msgid "PARQ QUEUE messages sent" -msgstr "" - -msgid "PARQ QUEUE follow-up requests received" -msgstr "" - -msgid "Launched SHA-1 file verifications" -msgstr "" - -msgid "Launched TTH file verifications" -msgstr "" - -msgid "Bitzi tickets held" -msgstr "" - -msgid "Re-seeding of orphan downloads through query hits" -msgstr "" - -#, fuzzy -msgid "Re-seeding of orphan downloads through upload requests" -msgstr "ダウンロードのデバッグレベルです。" - -msgid "DHT estimated amount of nodes" -msgstr "" - -msgid "DHT k-ball theoretical frontier (bits)" -msgstr "" - -msgid "DHT k-ball furthest frontier (bits)" -msgstr "" - -msgid "DHT k-ball closeest frontier (bits)" -msgstr "" - -msgid "DHT routing table buckets" -msgstr "" - -msgid "DHT routing table leaves" -msgstr "" - -msgid "DHT routing table maximum depth" -msgstr "" - -#, fuzzy -msgid "DHT routing table good nodes" -msgstr "検索クエリー経路制御テーブルの生成番号です。" - -msgid "DHT routing table stale nodes" -msgstr "" - -#, fuzzy -msgid "DHT routing table pending nodes" -msgstr "検索クエリー経路制御テーブルの生成番号です。" - -msgid "DHT routing table evicted nodes" -msgstr "" - -msgid "DHT routing table evicted firewalled nodes" -msgstr "" - -#, fuzzy -msgid "DHT routing table evicted nodes due to quota" -msgstr "検索クエリー経路制御テーブルの生成番号です。" - -msgid "DHT routing table promoted pending nodes" -msgstr "" - -#, fuzzy -msgid "DHT routing table pinged promoted nodes" -msgstr "検索クエリー経路制御テーブルの生成番号です。" - -msgid "DHT routing table rejected node due to bucket network quota" -msgstr "" - -msgid "DHT routing table rejected node due to global network quota" -msgstr "" - -msgid "DHT completed bucket refreshes" -msgstr "" - -msgid "DHT forced bucket refreshes" -msgstr "" - -#, fuzzy -msgid "DHT forced bucket merges" -msgstr "変なコマンドです" - -msgid "DHT denied non-splitable bucket refresh" -msgstr "" - -msgid "DHT initiated bucket alive checks" -msgstr "" - -msgid "DHT alive pings sent to good nodes" -msgstr "" - -msgid "DHT alive pings sent to stale nodes" -msgstr "" - -msgid "DHT alive pings sent to shutdowning nodes" -msgstr "" - -msgid "DHT alive pings avoided" -msgstr "" - -msgid "DHT alive pings skipped" -msgstr "" - -msgid "DHT revitalized stale nodes on RPC reply" -msgstr "" - -msgid "DHT value store rejected on IP/network quota grounds" -msgstr "" - -msgid "DHT value store rejected on creator validation grounds" -msgstr "" - -msgid "DHT nodes rejected during lookup based on network quota" -msgstr "" - -msgid "DHT nodes rejected during lookup based on suspicious proximity" -msgstr "" - -msgid "DHT nodes rejected during lookup based on frequency divergence" -msgstr "" - -msgid "DHT keys held" -msgstr "" - -msgid "DHT cached keys held" -msgstr "" - -msgid "DHT values held" -msgstr "" - -msgid "DHT cached KUID targets held" -msgstr "" - -msgid "DHT cached closest root nodes" -msgstr "" - -msgid "DHT cached roots exact hits" -msgstr "" - -msgid "DHT cached roots approximate hits" -msgstr "" - -msgid "DHT cached roots misses" -msgstr "" - -msgid "DHT cached roots lookups within k-ball" -msgstr "" - -msgid "DHT cached roots contact address refreshed" -msgstr "" - -msgid "DHT cached security tokens held" -msgstr "" - -msgid "DHT cached security tokens hits" -msgstr "" - -#, fuzzy -msgid "DHT stable node information held" -msgstr "ホスト情報" - -msgid "DHT local hits on value lookups" -msgstr "" - -msgid "DHT local hits returning values from cached keys" -msgstr "" - -msgid "DHT returned expanded values" -msgstr "" - -msgid "DHT returned values as secondary keys" -msgstr "" - -#, fuzzy -msgid "DHT claimed values via secondary keys" -msgstr "タイムアウト (全て秒単位)" - -msgid "DHT returned cached expanded values" -msgstr "" - -msgid "DHT returned cached values as secondary-keys" -msgstr "" - -#, fuzzy -msgid "DHT claimed cached values via secondary keys" -msgstr "タイムアウト (全て秒単位)" - -msgid "DHT successfully received value publications" -msgstr "" - -msgid "DHT successfully received value removals" -msgstr "" - -msgid "DHT replication of stale value avoided" -msgstr "" - -msgid "DHT replication of held values" -msgstr "" - -msgid "DHT republishing of held values" -msgstr "" - -msgid "DHT secondary-key value fetch issued" -msgstr "" - -msgid "DHT duplicate values returned in lookups" -msgstr "" - -msgid "DHT detected KUID collisions" -msgstr "" - -msgid "DHT detected collisions with our own KUID" -msgstr "" - -msgid "DHT detected KUID mismatches on RPC reply" -msgstr "" - -msgid "DHT caching attempts" -msgstr "" - -msgid "DHT caching ended successfully" -msgstr "" - -msgid "DHT caching partially completed" -msgstr "" - -msgid "DHT key-offloading checks after discovering new closest node" -msgstr "" - -msgid "DHT keys selected for offloading" -msgstr "" - -msgid "DHT key-offloading attempts" -msgstr "" - -msgid "DHT key-offloading ended successfully" -msgstr "" - -msgid "DHT key-offloading partially completed" -msgstr "" - -msgid "DHT values successfully offloaded" -msgstr "" - -msgid "DHT publishing attempts" -msgstr "" - -msgid "DHT publishing ended successfully (all roots)" -msgstr "" - -msgid "DHT publishing partially completed (root subset only)" -msgstr "" - -msgid "DHT publishing ending with proper value presence" -msgstr "" - -msgid "DHT value republishing occurring too late (after expiry)" -msgstr "" - -msgid "DHT publishing to self" -msgstr "" - -msgid "DHT background publishing completion attempts" -msgstr "" - -msgid "DHT background publishing completion showing improvements" -msgstr "" - -msgid "DHT background publishing completion successful (all roots)" -msgstr "" - -msgid "DHT SHA1 data type collisions" -msgstr "" - -msgid "DHT lookup path passively protected against attack" -msgstr "" - -msgid "DHT lookup path actively protected against attack" -msgstr "" - -msgid "DHT alt-loc lookups issued" -msgstr "" - -#, fuzzy -msgid "DHT push-proxy lookups issued" -msgstr "PUSHプロキシ参照失敗" - -msgid "DHT successful alt-loc lookups" -msgstr "" - -msgid "DHT successful push-proxy lookups" -msgstr "" - -msgid "DHT successful node push-entry lookups" -msgstr "" - -#, fuzzy -msgid "DHT re-seeding of orphan downloads" -msgstr "ダウンロードのデバッグレベルです。" - msgid "node" msgid_plural "nodes" msgstr0 "基のピア" @@ -6179,17 +6532,9 @@ msgid " Clear completed " msgstr " 完了したものを消去 " -# NOTE: this string is used as follows -# -# 'Fully served 0 / 0 HTML and 0 / 0 Gnutella browse requests' -# msgid " Gnutella browse requests" msgstr "件のGnutella参照リクエストに応じました。" -# NOTE: this string is used as follows -# -# 'Fully served 0 / 0 HTML and 0 / 0 Gnutella browse requests' -# msgid " HTML and " msgstr "件のHTMLと" @@ -6252,14 +6597,12 @@ "検索と一意化していたり、現在使用中のフィルター (ルール内でターゲットとして利" "用されているもの) は削除できません。" -# NOTE: it works as a tooltip msgid "A passive search matches any search results routed through this node" msgstr "受動検索はこのピアを通過したいずれの検索結果にもマッチします。" msgid "A_ggressive mode" msgstr "積極モード(_G)" -# NOTE: it works as a tooltip msgid "Abort and remove all selected uploads" msgstr "選択した全てのアップロードを中止して削除します。" @@ -6316,7 +6659,6 @@ "directory" msgstr "上記の変換を起動時にダウンロードフォルダにあるファイルに適用する" -# FIXME: should be accelerated msgid "Apply" msgstr "適用" @@ -6332,12 +6674,6 @@ msgid "Automatically clear finished files" msgstr "完了したファイルの自動消去" -# NOTE: -# Automatically clear sources when... -# completed -# failed -# unavailable -# msgid "Automatically clear sources when..." msgstr "送信元を自動的に消去します..." @@ -6353,9 +6689,8 @@ msgid "Avg. uptime of this servent:" msgstr "このサーバントの平均稼働時間:" -#, fuzzy msgid "Avg. downtime of this servent:" -msgstr "このサーバントの平均稼働時間:" +msgstr "" msgid "Bad hosts" msgstr "不正なホスト" @@ -6366,9 +6701,8 @@ msgid "Bandwidth limits for HTTP traffic" msgstr "HTTPトラフィックの帯域幅制限" -#, fuzzy msgid "Bandwidth limits for the Distributed Hash Table" -msgstr "分散ハッシュテーブル (DHT) のデバッグレベルです。" +msgstr "" msgid "Bandwidth targets for node lookups" msgstr "" @@ -6385,12 +6719,6 @@ msgid "Bind to this address" msgstr "このアドレスにバインドする" -msgid "Bitzi Metadata" -msgstr "Bitziメタデータ" - -msgid "Bitzi metadata" -msgstr "Bitziメタデータ" - msgid "Browse Host" msgstr "ホストの参照" @@ -6406,11 +6734,9 @@ msgid "Cache" msgstr "キャッシュ" -# FIXME: should be accelerated msgid "Cancel" msgstr "キャンセル" -# MERGEBLE: msgid "Case-sensitive sorting" msgstr "大・小文字を区別して並べ替える" @@ -6426,11 +6752,9 @@ msgid "Clear all" msgstr "全て消去" -# NOTE: it works as a tooltip msgid "Clear already completed uploads from list" msgstr "既に完了したアップロードはリストから消去します。" -# NOTE: it works as a tooltip msgid "Clear completed, failed and unavailable downloads from list" msgstr "完了・失敗・取得不可のダウンロードをリストから消去します。" @@ -6503,13 +6827,9 @@ msgid "Connected time" msgstr "接続時間" -# NOTE: `timeout' may be redundant -# XXX: `Connected' by which? msgid "Connected time_out" msgstr "内への接続(_O)" -# NOTE: `timeout' may be redundant -# XXX: `Connecting' to which? msgid "Connectin_g timeout" msgstr "外への接続(_G)" @@ -6587,19 +6907,15 @@ msgid "Default value:" msgstr "標準の値:" -# FIXME: messy msgid "Delay in seconds to wait after HTTP busy indication" msgstr "HTTP 使用中と示された後の遅延秒数" -# FIXME: messy msgid "Delay in seconds to wait after connection failure" msgstr "接続失敗後の遅延秒数" -# FIXME: messy msgid "Delay in seconds to wait if connection is refused" msgstr "接続が拒否されるかどうかを待つ遅延秒数" -# FIXME: messy msgid "Delay in seconds to wait when running download stops" msgstr "実働中のダウンロードが中止した場合の待機遅延秒数" @@ -6624,7 +6940,6 @@ msgid "Discard spam" msgstr "スパムを破棄する" -# NOTE: it works as a tooltip msgid "Disconnect from selected nodes" msgstr "選択したピアとの接続を解除します。" @@ -6658,7 +6973,6 @@ msgid "Dup / Bad / Weird" msgstr "重複/不正/変なメッセージ数" -# XXX: is not opposite of "absolute paths". msgid "E_xpose relative paths" msgstr "上位パスを公開する(_X)" @@ -6686,7 +7000,6 @@ msgid "Enable upload of _partially downloaded files" msgstr "部分ファイルのアップロードを有効にする(_P)" -# FIXME: should be revised. msgid "Enough UDP support" msgstr "UDPをサポートしている" @@ -6775,10 +7088,6 @@ msgid "Frequently Asked Questions" msgstr "よくある質問を表示します。" -# NOTE: this string is used as follows -# -# 'Fully served 0 / 0 HTML and 0 / 0 Gnutella browse requests' -# msgid "Fully served " msgstr " " @@ -6788,9 +7097,8 @@ msgid "GUID:" msgstr "GUID:" -#, fuzzy msgid "KUID:" -msgstr "GUID:" +msgstr "" msgid "Gen. queued" msgstr "生成 (待機)" @@ -6810,38 +7118,30 @@ msgid "Generation:" msgstr "生成:" -#, fuzzy msgid "Global DHT outgoing traffic" -msgstr "ピア外へのトラフィック(_O)" +msgstr "" msgid "Gnutella TTL settings" msgstr "TTL (Time-To-Live) の設定" -# NOTE: `Gnutella' may be redundant msgid "Gnutella _leaf traffic stats" msgstr "リーフトラフィック統計(_L)" -# NOTE: `Gnutella' may be redundant msgid "Gnutella display" msgstr "詳細表示" -# NOTE: `Gnutella' may be redundant msgid "Gnutella message size limits" msgstr "メッセージサイズの制限" -# NOTE: `Gnutella' may be redundant msgid "Gnutella network mode" msgstr "ネットワークモード" -# NOTE: `Gnutella' may be redundant msgid "Gnutella peers" msgstr "ピア" -# NOTE: `Gnutella' may be redundant msgid "Gnutella timeouts (all values in seconds)" msgstr "タイムアウト (全て秒単位)" -# NOTE: `Gnutella' may be redundant msgid "Gnutella traffic" msgstr "トラフィック" @@ -6914,7 +7214,6 @@ msgid "Ignored files are" msgstr "無視するファイルは" -# NOTE: `timeout' may be redundant msgid "Incoming connecting timeout" msgstr "ピア内への接続" @@ -7035,13 +7334,11 @@ msgid "Max. number of browse host results" msgstr "ホスト参照結果の最大数" -#, fuzzy msgid "Max. number of passive results" -msgstr "結果表示の最大数(_N)" +msgstr "" -#, fuzzy msgid "Max. number of What's New? results" -msgstr "結果表示の最大数(_N)" +msgstr "" msgid "Max. simultaneous downloads per file" msgstr "一つのファイルに対する同時ダウンロードの最大数" @@ -7064,7 +7361,6 @@ msgid "Maximum number of _retries" msgstr "再実行の最大回数(_R)" -# FIXME: messy msgid "Maximum seconds to wait on auto-retry timeouts" msgstr "自動再実行タイムアウトの最長待機秒数" @@ -7078,7 +7374,6 @@ "許可する\n" "大きさの最大値" -# FIXME: not enough description msgid "Maximum" msgstr "最大" @@ -7097,7 +7392,6 @@ msgid "Minimum file size" msgstr "最小のファイルサイズ" -# FIXME: messy msgid "Minimum seconds to wait on auto-retry timeouts" msgstr "自動再実行タイムアウトの最短待機秒数" @@ -7107,7 +7401,6 @@ msgid "Minimum upload time" msgstr "最短アップロード時間" -# FIXME: not enough description msgid "Minimum" msgstr "最小" @@ -7162,7 +7455,6 @@ msgid "Number of tolerable _duplicate messages per node" msgstr "ピアにつき受容可能な重複メッセージ数(_D)" -# FIXME: should be accelerated msgid "Ok" msgstr "OK" @@ -7248,7 +7540,6 @@ msgid "Property browser" msgstr "プロパティの参照" -# MERGEBLE: msgid "Property pattern:" msgstr "プロパティのパターン:" @@ -7285,7 +7576,6 @@ msgid "Queuing details" msgstr "キューの詳細" -# FIXME: should be revised msgid "Quick-connect pool size" msgstr "簡易接続のプールサイズ" @@ -7322,10 +7612,6 @@ msgid "Raw length:" msgstr "そのままの長さ:" -# NOTE: this string is used as follows -# -# 'Re_try search every <seconds> secs ' -# msgid "Re_try search every" msgstr "検索の再実行を(_T)" @@ -7396,38 +7682,30 @@ msgid "Resume" msgstr "再開する" -# FIXME: messy msgid "Retry busy delay" msgstr "再実行使用中の遅延秒数" -# FIXME: messy msgid "Retry refused delay" msgstr "再実行拒否の遅延秒数" -# FIXME: messy msgid "Retry stopped delay" msgstr "再実行中断の遅延秒数" -# FIXME: messy msgid "Retry timeout delay" msgstr "再実行タイムアウトの遅延秒数" -# FIXME: messy msgid "Retry timeout max" msgstr "再実行タイムアウトの最長秒数" -# FIXME: messy msgid "Retry timeout min" msgstr "再実行タイムアウトの最短秒数" -# FIXME: should be accelerated msgid "Revert" msgstr "戻す" msgid "Richard Eckart" msgstr "Richard Eckart" -# MERGEBLE: msgid "Rules" msgstr "ルール数" @@ -7458,11 +7736,9 @@ msgid "Search Stats" msgstr "検索ステータス" -# FIXME: `Search Term' -> `Searches' or `Search queries' msgid "Search Term" msgstr "検索クエリー" -# FIXME: `Shared' rather than `Search' msgid "Search _extensions" msgstr "共有対象とする拡張子(_E)" @@ -7526,10 +7802,6 @@ msgid "Show _inbound leaf traffic" msgstr "内へのリーフトラフィック(_I)" -# NOTE: this string is used as follows -# -# 'Show _last 0 searches' -# msgid "Show _last" msgstr "最新(_L)" @@ -7652,7 +7924,6 @@ msgid "TX wire bytes" msgstr "TX (送信) 伝送バイト数" -# NOTE: `timeout' may be redundant msgid "T_X flow control timeout" msgstr "送信フロー制御(_X)" @@ -7713,7 +7984,6 @@ msgid "Transferred data" msgstr "転送済データ" -# NOTE: it works as a tooltip msgid "Try to connect to specified address" msgstr "指定アドレスへの接続を試みます。" @@ -8012,11 +8282,9 @@ msgid "bytes" msgstr "バイト" -# MERGEBLE: msgid "case sensitive" msgstr "大・小文字を区別" -# MERGEBLE: msgid "case-sensitive" msgstr "大・小文字を区別" @@ -8064,10 +8332,6 @@ msgid "ignored" msgstr "無視" -# NOTE: this string is used as follows -# -# '17KiB/s in (avg)' -# msgid "in" msgstr "(平均) で内へ" @@ -8089,30 +8353,18 @@ msgid "not yet determined" msgstr "まだ確定していません" -# NOTE: this string is used as follows -# -# '17KiB/s out (avg)' -# msgid "out" msgstr "(平均) で外へ" msgid "queued" msgstr "" -# NOTE: this string is used as follows -# -# 'Show _last 0 searches' -# msgid "searches" msgstr "件の検索を表示" msgid "seconds" msgstr "秒" -# NOTE: this string is used as follows -# -# 'Re_try search every <seconds> secs ' -# msgid "secs " msgstr "秒毎に実行 " @@ -8122,14 +8374,6 @@ msgid "set" msgstr "○" -# FIXME: should be distinguished from the other, perhaps... -# -# NOTE: -# Automatically clear sources when... -# completed -# failed -# unavailable -# msgid "unavailable" msgstr "利用できない時" @@ -8142,13 +8386,11 @@ msgid "uploads" msgstr "アップロード" -#, fuzzy msgid "Available HTTP input bandwidth" -msgstr "使用可能な帯域幅" +msgstr "" -#, fuzzy msgid "Available HTTP output bandwidth" -msgstr "使用可能な帯域幅" +msgstr "" msgid "DHT up, passive mode." msgstr "" @@ -8162,21 +8404,17 @@ msgid "DHT looking up own KUID." msgstr "" -#, fuzzy msgid "DHT seeded." -msgstr "TX (送信) 伝送速度" +msgstr "" -#, fuzzy msgid "DHT inactive." -msgstr "%u 件が動作中" +msgstr "" -#, fuzzy msgid "Disabled stealing of outgoing HTTP bandwidth." -msgstr "ピア外への HTTP トラフィックの帯域幅使用量を表示します。" +msgstr "" -#, fuzzy -msgid "Splitting ougoing HTTP bandwidth evenly." -msgstr "ピア外への HTTP トラフィックの帯域幅平均値を表示します。" +msgid "Splitting outgoing HTTP bandwidth evenly." +msgstr "" msgid "Capping HTTP outgoing bandwidth." msgstr "" @@ -8184,27 +8422,26 @@ msgid "Port mapping possible through UPnP or NAT-PMP." msgstr "" -msgid "Port mapping configured through UPnP or NAT-PMP." +msgid "Port mapping configured through NAT-PMP." +msgstr "" + +msgid "Port mapping configured through UPnP." msgstr "" -#, fuzzy msgid "Enable UPnP" -msgstr "UDPを有効にする(_U)" +msgstr "" -#, fuzzy msgid "Enable NAT-PMP" -msgstr "DHTを有効にする(_D)" +msgstr "" msgid "Enable HTTP request pipelining" msgstr "" -#, fuzzy msgid "Pipelining max chunk size" -msgstr "最小チャンクサイズ" +msgstr "" -#, fuzzy -msgid "Enable upload of patial files deemed rare" -msgstr "部分ファイルのアップロードを有効にする(_P)" +msgid "Enable upload of partial files deemed rare" +msgstr "" msgid "Enable GUESS (additional querying)" msgstr "" @@ -8212,17 +8449,14 @@ msgid "Issue GUESS queries as well" msgstr "" -#, fuzzy msgid "Bandwidth limits for GUESS queries" -msgstr "Gnutellaトラフィックの帯域幅制限" +msgstr "" -#, fuzzy msgid "Output bandwidth hint" -msgstr "出力帯域幅の平均" +msgstr "" -#, fuzzy msgid "Download queue is frozen." -msgstr "ダウンロードキューが凍結されました" +msgstr "" msgid "Allow TTH discovery" msgstr "" @@ -8233,38 +8467,29 @@ msgid "Answer to queries for partial files" msgstr "" -#, fuzzy msgid "Answer to what's-new? queries" -msgstr "生成検索クエリー数" +msgstr "" -# FIXME: `Search Term' -> `Searches' or `Search queries' -#, fuzzy msgid "Search Media Type" -msgstr "検索クエリー" +msgstr "" -#, fuzzy msgid "Audio" -msgstr "<音楽>" +msgstr "" -#, fuzzy msgid "Video" -msgstr "<動画>" +msgstr "" -#, fuzzy msgid "Document" -msgstr "回数" +msgstr "" -#, fuzzy msgid "Image" -msgstr "<画像>" +msgstr "" -#, fuzzy msgid "Archive" -msgstr "<アーカイブ>" +msgstr "" -#, fuzzy msgid "Search Configuration" -msgstr "検索モニター" +msgstr "" msgid "Stop search when last download completes" msgstr "" @@ -8275,24 +8500,23 @@ msgid "What's new?" msgstr "" -#, fuzzy msgid "Unspecified" -msgstr "未定義" +msgstr "" msgid "Search filters to apply locally on newly created searches." msgstr "" -# XXX: wtf -#, fuzzy msgid "Discard results bearing an alien IP address" -msgstr "無関係なIPアドレスに関するOOBヒット" +msgstr "" + +msgid "Discard results bearing a banned GUID" +msgstr "" msgid "Restart session-only searches with pending downloads" msgstr "" -#, fuzzy msgid "Configured DHT mode" -msgstr "設定するピアモード" +msgstr "" msgid "Store DHT keys/values in memory" msgstr "" @@ -8303,41 +8527,43 @@ msgid "Relayed queries remembered" msgstr "" -msgid "Not in database" -msgstr "データベースにありません" +msgid "Allow unused Gnutella outgoing bandwidth to supersede hint" +msgstr "" + +msgid "Display GUESS statistics" +msgstr "" + +msgid "Mapping lease time" +msgstr "" + +msgid "G2 hubs" +msgstr "" + +msgid "Enable the G2 network" +msgstr "" + +msgid " G2, " +msgstr "" msgid "owned" msgstr "取得済" -# FIXME: should be revised. msgid "partial" msgstr "部分取得済" -# FIXME: should be revised. msgid "shared" msgstr "共有中" -# NOTE: this string is used as follows -# -# 'Created 0 downloads from the 0 selected items' -# #, c-format msgid "Created %u download" msgid_plural "Created %u downloads" msgstr0 "%u 件のダウンロードを作成しました。" -# NOTE: this string is used as follows -# -# 'Discarded 0 results from the 0 selected items' -# #, c-format msgid "Discarded %u result" msgid_plural "Discarded %u results" msgstr0 "%u 件の結果を破棄しました。" -msgid "Query queued..." -msgstr "検索クエリーをキューに入れました..." - #, c-format msgid "%u term counted" msgid_plural "%u terms counted" @@ -8378,6 +8604,9 @@ msgid "_Auto-hide leaf traffic stats" msgstr "自動的に隠す(_A)" +msgid "Glossary" +msgstr "" + msgid "_Search" msgstr "検索(_S)" @@ -8387,48 +8616,27 @@ msgid "Do not specify any media type (will match any kind of files remotely)" msgstr "" -#, fuzzy msgid "CPU overloaded" -msgstr "アップロード" - -#, fuzzy -msgid "Splitting outgoing HTTP bandwidth evenly." -msgstr "ピア外への HTTP トラフィックの帯域幅平均値を表示します。" +msgstr "" -# NOTE: this string is used as follows -# -# 'Connect to 0 ultrapeers' -# msgid "Connect to" msgstr "リーフ時には" -# NOTE: see above msgid "ultrapeers" msgstr "基のウルトラピアに接続する。" -# NOTE: this string is used as follows -# -# 'Try to keep at least 0 and allow at most 0 total connections up.' -# msgid "Try to keep at least" msgstr "ウルトラピア時に、最小" -# NOTE: see above msgid "and allow at most" msgstr "件の接続を確保し、多くても" -# NOTE: see above msgid "total connections up." msgstr "件までの接続数にする。" -# NOTE: this string is used as follows -# -# 'Use up to 0 connections to connect more quickly while not all slots are used.' -# msgid "Use up to " msgstr "全てのスロットが使用されるまでの間、より素早く接続するために " -# NOTE: see above msgid "connections to connect more quickly while not all slots are used." msgstr "件までの接続を使用する。" @@ -8451,29 +8659,24 @@ msgid "IP:port placeholder" msgstr "" -# NOTE: this string is used as follows -# -# 'Served 0 HTML and 0 Gnutella browse requests' -# msgid "Served " msgstr " " -# NOTE: it shouldn't be translated, you can simply copy & paste -msgid "BH HTML served" -msgstr "BH HTML served" +msgid "G2 served" +msgstr "" -# NOTE: this string is used as follows -# -# 'Fully served 0 / 0 HTML and 0 / 0 Gnutella browse requests' -# msgid " / " msgstr "/" -# NOTE: it shouldn't be translated, you can simply copy & paste +msgid "G2" +msgstr "" + +msgid "BH HTML served" +msgstr "BH HTML served" + msgid "BH HTML" msgstr "BH HTML" -# NOTE: it shouldn't be translated, you can simply copy & paste msgid "BH qhits" msgstr "BH qhits" @@ -8498,7 +8701,6 @@ msgid "_Columns show hops" msgstr "ホップ数を表示(_C)" -# FIXME: could be removed msgid " " msgstr " " @@ -8551,40 +8753,29 @@ msgid "unit_of_time|s" msgstr "秒" -#, fuzzy msgid "Gnutella Distributed Hash Table" -msgstr "分散ハッシュテーブル (DHT) のデバッグレベルです。" +msgstr "" msgid "Maximum percentage of connection slots a vendor can occupy." msgstr "ベンダーが占有できる接続スロットの最大割合です。" -#, fuzzy -msgid "Global DHT ougoing traffic" -msgstr "ピア外へのトラフィック(_O)" - msgid "attempts" msgstr "回" -#, fuzzy msgid "Pipelining maximum chunk size" -msgstr "最小チャンクサイズ" +msgstr "" msgid "_Remove directory" msgstr "フォルダを削除(_R)" -#, fuzzy -msgid "Enable upload of partial files deemed rare" -msgstr "部分ファイルのアップロードを有効にする(_P)" - msgid "Minimum chunk _size" msgstr "最小チャンクサイズ(_S)" msgid "Show a status _icon" msgstr "ステータスアイコンを表示する(_I)" -#, fuzzy msgid "Avg. downtime of this servent" -msgstr "このサーバントの平均稼働時間:" +msgstr "" msgid "Remove completed downloads from list" msgstr "完了したダウンロードを一覧から削除する" @@ -8592,7 +8783,6 @@ msgid "_Clear completed" msgstr "完了したものを消去(_C)" -# NOTE: it shouldn't be translated, you can simply copy & paste msgid ", " msgstr ", " @@ -8624,47 +8814,44 @@ msgid "Reverse lookup in progress..." msgstr "逆引き検索を実行中..." +msgid "UDP (semi-reliable)" +msgstr "" + msgid "Size:" msgstr "大きさ:" -# FIXME: msgid "Done" msgstr "終了" -# FIXME: messy msgid "Fresh regular" msgstr "新規の通常ピア" -# FIXME: messy msgid "Valid regular" msgstr "有効な通常ピア" -# FIXME: messy -#, fuzzy msgid "Fresh IPv4 ultra" -msgstr "新規のウルトラピア" +msgstr "" -# FIXME: messy -#, fuzzy msgid "Valid IPv4 ultra" -msgstr "有効なウルトラピア" +msgstr "" -# FIXME: messy -#, fuzzy msgid "Fresh IPv6 ultra" -msgstr "新規のウルトラピア" +msgstr "" -# FIXME: messy -#, fuzzy msgid "Valid IPv6 ultra" -msgstr "有効なウルトラピア" +msgstr "" + +msgid "Fresh G2 hub" +msgstr "" + +msgid "Valid G2 hub" +msgstr "" msgid "Unstable" msgstr "不安定" -#, fuzzy msgid "Alien" -msgstr "別名" +msgstr "" msgid "GUESS (IPv4 running)" msgstr "" @@ -8700,15 +8887,16 @@ "ドされませんでした。代わりに <a href=\"http://gtk-gnutella.sourceforge.net/?" "page=faq\">FAQ オンライン</a> をご覧ください。</p></body></html>" +msgid "" +"<html><head><title>Glossary</title></head><body><p>The glossary document " +"could not be loaded.</p></body></html>" +msgstr "" + #, c-format msgid "%lu file shared (%s)" msgid_plural "%lu files shared (%s)" msgstr0 "%lu 個のファイルを共有 (%s)" -# NOTE: this string is used as follows -# -# '17KiB/s in/out (avg)' -# msgid "(avg)" msgstr " " @@ -8734,6 +8922,9 @@ msgid "UNKNOWN STATUS" msgstr "不明なステータス" +msgid "g2" +msgstr "" + msgid "busy" msgstr "使用中" @@ -8749,13 +8940,11 @@ msgid "bogus" msgstr "偽IP" -#, fuzzy msgid "alien" -msgstr "別名" +msgstr "" -#, fuzzy msgid "media" -msgstr "アルメニア共和国" +msgstr "" msgid "No search" msgstr "検索無し" @@ -8778,6 +8967,11 @@ msgstr "このセッションで無効になります" #, c-format +msgid " %u download" +msgid_plural " %u downloads" +msgstr0 "" + +#, c-format msgid "" "%u %s (%u skipped, %u ignored, %u hidden, %u auto-d/l, %u %s) Hits: %u (%u " "TCP, %u UDP)" @@ -8793,6 +8987,58 @@ msgid_plural "dupes" msgstr0 "重複" +msgid "No GUESS queries run yet" +msgstr "" + +#, c-format +msgid " previous took %s querying %zu %s with %zu %s kept" +msgstr "" + +msgid "host" +msgid_plural "hosts" +msgstr0 "" + +msgid "hit" +msgid_plural "hits" +msgstr0 "" + +#, c-format +msgid "GUESS %s Total: %zu %s (%s %s, %s kept, %s queries, %s keys)%s" +msgstr "" + +msgid "idle" +msgstr "" + +msgid "query" +msgid_plural "queries" +msgstr0 "" + +#, c-format +msgid "" +"GUESS %s %s (%zu %s, %zu kept, %s queries, %s keys) Pool: %zu %s, (%zu+" +"%zu)/%zu queried, %zu %s (%.2f%%), %zu reached, %zu pending, %zu %s%s%s" +msgstr "" + +msgid "loose" +msgstr "" + +msgid "bounded" +msgstr "" + +msgid "ack" +msgid_plural "acks" +msgstr0 "" + +msgid "hop" +msgid_plural "hops" +msgstr0 "" + +msgid " (load pending)" +msgstr "" + +msgid " (end if starving)" +msgstr "" + msgid "Passive" msgstr "受動検索" @@ -8805,13 +9051,11 @@ "古い検索ファイルがあります。検索情報は新しい XML 形式で保管\n" "されますので、この古いファイルは %s に名前変更されます。" -#, fuzzy, c-format +#, c-format msgid "" "could not rename %s as %s: %m\n" "The XML file will not be used unless this problem is resolved." msgstr "" -"%s を %s に名前変更できませんでした: %s \n" -"XML ファイルはこの問題が解決されるまで使用されません。" msgid "<unparsed>" msgstr "<未解析>" @@ -8860,7 +9104,6 @@ msgid "The query string is not UTF-8 encoded" msgstr "この検索クエリーはUTF-8でエンコードされていません。" -# FIXME: should be revised. msgid "Unhandled search prefix." msgstr "この検索プリフィクスは無効です。" @@ -8884,16 +9127,14 @@ msgid "TTH" msgstr "TTH" -# XXX: Putting the word 'p0wnage' here is highly misleading. msgid "Owned" msgstr "取得状況" msgid "No" msgstr "いいえ" -#, fuzzy msgid "Tag" -msgstr "ターゲット" +msgstr "" msgid "Yes" msgstr "はい" @@ -8904,17 +9145,24 @@ msgid "Source" msgstr "送信元" -#, fuzzy msgid "Alien IP" -msgstr "別名" +msgstr "" msgid "Alt-Locs" msgstr "別の送信元" -# FIXME: should be revised. -#, fuzzy msgid "Partial" -msgstr "部分取得済" +msgstr "" + +#, c-format +msgid "%s %.2f%%" +msgstr "" + +msgid "Available" +msgstr "" + +msgid "Last modification" +msgstr "" msgid "Latinized" msgstr "ローマ字表記" @@ -8931,6 +9179,9 @@ msgid "Hostname" msgstr "ホスト名" +msgid "banned" +msgstr "" + msgid "Servent ID" msgstr "サーバントID" @@ -8988,24 +9239,12 @@ msgid "The URN in the search text is invalid." msgstr "検索文字列中のURNが不正です。" -msgid "SHA-1 is unknown." -msgstr "SHA-1が不明です。" - -msgid "No Bitzi ticket requested yet." -msgstr "" - -msgid "Not in Bitzi database." -msgstr "Bitziデータベースにありません" - msgid "Encoding" msgstr "エンコード方式" msgid "#" msgstr "数" -msgid "Metadata" -msgstr "メタデータ" - msgid "Never" msgstr "未発生" @@ -9041,6 +9280,12 @@ msgid "*** CPU OVERLOADED -- TRYING TO SAVE CYCLES ***" msgstr "** CPU が高負荷状態になっています --- サイクルを減らすよう試みます ***" +msgid "*** KERNEL BUFFER SHORTAGE -- LIMITING TCP CONNECTIONS ***" +msgstr "" + +msgid "*** NO LISTENING TCP SOCKET -- NO INBOUND CONNECTIONS ***" +msgstr "" + msgid "*** UPLOADS STALLING, BANDWIDTH SHORTAGE? ***" msgstr "*** アップロードが停滞しています --- 帯域幅が不足していませんか? ***" @@ -9062,7 +9307,6 @@ msgid "Address/port changed to: %s" msgstr "アドレス/ポートが変更されました: %s" -# MERGEBLE: not yet reported msgid "no sources" msgstr "送信元はありません" @@ -9080,11 +9324,6 @@ msgstr "%u 件が待機中" #, c-format -msgid "%u/%u connection" -msgid_plural "%u/%u connections" -msgstr0 "%u/%u 件の接続" - -#, c-format msgid "%u/%u upload" msgid_plural "%u/%u uploads" msgstr0 "%u/%u 件のアップロード" @@ -9097,6 +9336,9 @@ msgid "Queue frozen" msgstr "キューが凍結されました" +msgid "Internal" +msgstr "" + msgid "Select a property to see its description." msgstr "説明を見るにはプロパティを選択して下さい。" @@ -9161,42 +9403,3 @@ msgid "Sent QUEUE, waiting for headers..." msgstr "QUEUE送信完了、ヘッダーを待受中..." - -#~ msgid "" -#~ "Maximum number of Query MUIDs to track. This allows mapping MUIDs of " -#~ "Query Hits to the original search term. In the worst case this causes " -#~ "about 300 bytes per Query of memory overhead." -#~ msgstr "" -#~ "記録しておくクエリーMUIDの最大数です。これで、クエリーヒットのMUIDを元の検" -#~ "索語のままでマッピングしておくことが可能になります。ただし最悪の場合、クエ" -#~ "リーごとに300バイトのメモリのオーバーヘッドが発生します。" - -#, fuzzy -#~ msgid "Linux archives" -#~ msgstr "%u 件が動作中" - -#~ msgid "Index" -#~ msgstr "インデックス" - -# FIXME: `Search Term' -> `Searches' or `Search queries' -#, fuzzy -#~ msgid "Seaerch Media Type" -#~ msgstr "検索クエリー" - -#~ msgid "Can't reach host (Push or Direct)" -#~ msgstr "ホストに到達できません (PUSHまたは直接)" - -#~ msgid "Banned: %s" -#~ msgstr "禁止されました: %s" - -#~ msgid "Banned for %s" -#~ msgstr "%s を禁止します" - -#~ msgid "The current Session ID." -#~ msgstr "現在のセッションIDです。" - -#~ msgid "ShareMonkey URL" -#~ msgstr "ShareMonkey URL" - -#~ msgid "Connecting" -#~ msgstr "接続しています"
View file
gtk-gnutella-0.98.2.tar.bz2/po/nb.po -> gtk-gnutella-1.1.9.tar.bz2/po/nb.po
Changed
@@ -1,32 +1,32 @@ -# $Id$ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Raphael Manfredi +# This file is distributed under the same license as the PACKAGE package. # -# Norwegian Bokmal translations for gtk-gnutella package. -# Copyright (C) 2000-2001 Yann Grossel. -# Copyright (C) 2001-2010 Raphaël Manfredi. -# This file is distributed under the same license as the gtk-gnutella package. -# -# Alexander Nicolaysen Sørnes <alex@thehandofagony.com>, 2005, 2006, 2007, 2008, 2009. +# Translators: +# Alexander Nicolaysen Sørnes <alex@thehandofagony.com>, 2005-2009 msgid "" msgstr "" -"Project-Id-Version: gtk-gnutella 0.96.7u\n" +"Project-Id-Version: gtk-gnutella\n" "Report-Msgid-Bugs-To: gtk-gnutella-devel@lists.sf.net\n" -"POT-Creation-Date: 2011-11-22 18:27+0100\n" -"PO-Revision-Date: 2009-03-31 23:39+0200\n" -"Last-Translator: Alexander Nicolaysen Sørnes <alex@thehandofagony.com>\n" -"Language-Team: Norsk (bokmål) <nb@li.org>\n" +"POT-Creation-Date: 2016-03-06 08:49+0100\n" +"PO-Revision-Date: 2016-02-15 08:28+0000\n" +"Last-Translator: Jeroen Asselman <jeroen@asselman.com>\n" +"Language-Team: Norwegian Bokmål (http://www.transifex.com/gtk-gnutella/gtk-" +"gnutella/language/nb/)\n" +"Language: nb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: \n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" -#, c-format -msgid "%s%s%s%s%s fps, %s kbps" -msgstr "%s%s%s%s%s fps, %s kbps" +msgid "Harmful version banned, upgrade required" +msgstr "" -msgid "times|x" -msgstr "x" +msgid "Connection refused" +msgstr "" + +msgid "Use an open Gnutella or G2 servent" +msgstr "" #, c-format msgid "Stopped, will retry with TLS (%s)" @@ -40,9 +40,8 @@ msgid "Too many attempts (%u times)" msgstr "For mange forsøk (%u ganger)" -#, fuzzy msgid "Requeued due to no push-proxy" -msgstr "Lagt i kø på nytt grunnet tidsavbrudd" +msgstr "" msgid "Requeued due to file removal" msgstr "Lagt i kø på nytt fordi filen ble slettet" @@ -61,8 +60,8 @@ msgstr "Bytter (etter feil) til «%s»" #, c-format -msgid " at %s - rescheduled for %s%s #%u" -msgstr " på %s - planlagt på nytt for %s%s #%u" +msgid " at %s" +msgstr "" msgid "Suspended (SHA1 checking)" msgstr "Suspendert (SHA1-kontrollering)" @@ -86,6 +85,9 @@ msgid "Download queue is frozen" msgstr "Nedlastingskøen er frosset" +msgid "Network buffer shortage" +msgstr "" + msgid "No download slot (start)" msgstr "Ingen nedlastingsplass (start)" @@ -95,12 +97,14 @@ msgid "Connection failed" msgstr "Tilkobling feilet" +msgid "SHA1 mismatch detected" +msgstr "Fant upassende SHA1" + msgid "Waiting for server PROX publishing" msgstr "" -#, fuzzy msgid "Waiting for push route" -msgstr "Venter på videre forespørsel . . ." +msgstr "" msgid "Push route lost" msgstr "Tapt rute" @@ -259,6 +263,9 @@ msgid "No support for Content-Encoding (%s)" msgstr "Tegnkodingen «%s» støttes ikke" +msgid "Incomplete headers during TLS upgrade" +msgstr "" + msgid "Spammer detected" msgstr "Kjøttmann oppdaget" @@ -317,6 +324,12 @@ msgid "No Content-Length header" msgstr "Ingen informasjon om innholdslengde" +msgid "Unexpected Content-Type" +msgstr "" + +msgid "No Content-Type" +msgstr "" + msgid "Search already closed" msgstr "Søket er allerede lukket" @@ -353,25 +366,32 @@ msgid "Malformed push reply" msgstr "Traff feilformet spørring" -msgid "SHA1 mismatch detected" -msgstr "Fant upassende SHA1" - msgid ", inbound" msgstr ", innkommende" msgid ", outbound" msgstr ", utgående" +msgid ", no-pipeline" +msgstr "" + msgid ", banning" msgstr ", bannlysing" msgid ", g2" msgstr ", g2, " +msgid ", fake-g2" +msgstr "" + msgid ", vendor?" msgstr "program?" #, c-format +msgid "<Browse G2 Host %s>" +msgstr "" + +#, c-format msgid "<Browse Host %s>" msgstr "<Bla i personen %s>" @@ -397,6 +417,12 @@ msgid "Requeued due to timeout" msgstr "Lagt i kø på nytt grunnet tidsavbrudd" +msgid "Partial file removed" +msgstr "" + +msgid "File info being reset" +msgstr "" + #, c-format msgid "Downloading (TR: %s)" msgstr "Laster ned (%s igjen)" @@ -404,23 +430,20 @@ msgid "Seeding" msgstr "Deler" -#, fuzzy msgid "Computing TTH" -msgstr "Kalkulerer SHA1" +msgstr "" msgid "Computing SHA1" msgstr "Kalkulerer SHA1" -#, fuzzy msgid "Waiting for TTH check" -msgstr "Venter på SHA1-kontroll" +msgstr "" msgid "Waiting for SHA1 check" msgstr "Venter på SHA1-kontroll" -#, fuzzy msgid "SHA1" -msgstr "SHA-1" +msgstr "" msgid "OK" msgstr "OK" @@ -428,13 +451,11 @@ msgid "failed" msgstr "feilet" -#, fuzzy msgid "not computed yet" -msgstr "Ingen utdata ennå . . ." +msgstr "" -#, fuzzy msgid "Waiting for moving..." -msgstr "; venter på flytting . . ." +msgstr "" msgid "Moving" msgstr "Flytter" @@ -452,19 +473,17 @@ msgid "Waiting" msgstr "Venter" -#, fuzzy msgid "Querying DHT" -msgstr "Spørringstreff" +msgstr "" -#, fuzzy msgid "Pending DHT query" -msgstr "Uavgjorte lokale spørringer" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "%u/%u successful DHT lookup" msgid_plural "%u/%u successful DHT lookups" -msgstr0 "Vellykkede DHT alt loc-oppslag" -msgstr1 "Vellykkede DHT alt loc-oppslag" +msgstr0 "" +msgstr1 "" #, c-format msgid "%u DHT lookup" @@ -472,156 +491,20 @@ msgstr0 "" msgstr1 "" -#, fuzzy, c-format +#, c-format msgid "Got %d host from %s" msgid_plural "Got %d hosts from %s" -msgstr0 "Fikk %d vert fra UPD-vertmine %s" -msgstr1 "Fikk %d verter fra UPD-vertminne %s" +msgstr0 "" +msgstr1 "" #, c-format -msgid "Bootstrapping from %s" -msgstr "" - -msgid "Bad size" -msgstr "Ugyldig størrelse" - -msgid "Too small" -msgstr "For liten" - -msgid "Too large" -msgstr "For stor" - -msgid "Way too large" -msgstr "Altfor stor" - -msgid "Unknown message type" -msgstr "Ukjent meldingstype" - -msgid "Unexpected message" -msgstr "Uventet melding" - -msgid "Message sent with TTL = 0" -msgstr "Melding sendt med TTL = 0" - -msgid "Improper hops/ttl combination" -msgstr "Feil «hops»/«ttl»-kombinasjon" - -msgid "Max TTL exceeded" -msgstr "Høyeste TTL er overgått" - -msgid "Message throttle" -msgstr "Meldingskveling" - -#, fuzzy -msgid "Message matched limits" -msgstr "Størrelsesbegrensninger på Gnutella-meldinger" - -msgid "Unusable Pong" -msgstr "Ubrukelig pong" - -msgid "Hard TTL limit reached" -msgstr "Nådde hard TTL-begrensning" - -msgid "Max hop count reached" -msgstr "Nådde høyste antall «hop»" - -msgid "Route lost" -msgstr "Tapt rute" - -msgid "No route" -msgstr "Ingen rute" - -msgid "Duplicate message" -msgstr "Duplisert melding" - -msgid "Message to banned GUID" -msgstr "Melding til bannlyst GUID" - -#, fuzzy -msgid "Message from banned GUID" -msgstr "Melding til bannlyst GUID" - -msgid "Node shutting down" -msgstr "Node slås av" - -msgid "TX flow control" -msgstr "Kontroll av TX-flyt" - -msgid "Query text had no trailing NUL" -msgstr "Spørringsteksten sluttet ikke med «NUL»" - -msgid "Query text too short" -msgstr "Spørringsteksten er for kort" - -msgid "Query had unnecessary overhead" -msgstr "Spørringen hadde unødvendig overhode" - -msgid "Query had bad URN" -msgstr "Forespørselen hadde ugyldig URN" - -msgid "Message with malformed SHA1" -msgstr "Melding med feilformet SHA1" - -msgid "Message with malformed UTF-8" -msgstr "Melding med feilformet UTF-8" - -msgid "Malformed Query Hit" -msgstr "Traff feilformet spørring" - -msgid "Bad return address" -msgstr "Ugyldig returadresse" - -msgid "Hostile IP address" -msgstr "Fiendtlig IP-adresse" - -msgid "Bogus result from Morpheus" +msgid "Connecting to web cache %s" msgstr "" -msgid "Spam" -msgstr "Spam" - -msgid "Evil filename" -msgstr "Ondt filnavn" - -#, fuzzy -msgid "Improper media type" -msgstr "Søkeuttrykk" - -msgid "Payload inflating error" -msgstr "Klarte ikke øke lasten" - -msgid "Unknown header flags present" -msgstr "Fikk ukjent meldingshode" - -msgid "Own search results" -msgstr "Egne søkeresultater" - -#, fuzzy -msgid "Own queries" -msgstr "RX-spørringer" - -msgid "Ancient query format" -msgstr "Gammelt spørringsformat" - -msgid "Blank Servent ID" -msgstr "Tom tjenent-ID" - -msgid "GUESS Query missing token" +#, c-format +msgid "Bootstrapping from %s" msgstr "" -#, fuzzy -msgid "GUESS Invalid query token" -msgstr "DHT: Ugyldig sikkerhetstegn" - -msgid "DHT Invalid security token" -msgstr "DHT: Ugyldig sikkerhetstegn" - -msgid "DHT Too many STORE requests" -msgstr "DHT: For mange STORE-forespørsler" - -msgid "DHT Malformed message" -msgstr "DHT: Feilformet kommando" - #, c-format msgid "Shutdown (%s)" msgstr "Slå av (%s)" @@ -632,27 +515,6 @@ msgstr0 "Fikk %d tilkoblings-pong" msgstr1 "Fikk %d tilkoblings-ponger" -msgid "Sent crawling info" -msgstr "Sendte krypeinformasjon" - -msgid "Cannot setup compressing TX stack" -msgstr "Klarte ikke sette opp komprimering av TX-stabel" - -#, c-format -msgid "Got BYE %d %.*s" -msgstr "Fikk «BYE» %d %.*s" - -#, c-format -msgid "Weird HELLO %s" -msgstr "Rar «HELLO» %s" - -#, c-format -msgid "HELLO %s error %d (%s)" -msgstr "«HELLO» %s feil %d (%s)" - -msgid "Shielded node" -msgstr "Noden har skjold" - msgid "Gnet connections disabled" msgstr "Gnet-forbindelser er slått av" @@ -660,6 +522,10 @@ msgstr "Tilkoblingen er ikke komprimert" #, c-format +msgid "Too many G2 hubs (%u max)" +msgstr "" + +#, c-format msgid "Too many leaves (%d max)" msgstr "Forlater for mange ganger (grensen er %d)" @@ -684,6 +550,9 @@ msgid "Not an ultra node" msgstr "Ikke en ultranode" +msgid "Unknown error" +msgstr "Ukjent feil" + msgid "Unstable IP address" msgstr "Ustabil IP-adresse" @@ -697,22 +566,50 @@ msgid "Not connecting: %s" msgstr "Kobler ikke til: %s" +msgid "Cannot setup compressing TX stack" +msgstr "Klarte ikke sette opp komprimering av TX-stabel" + +msgid "Sent crawling info" +msgstr "Sendte krypeinformasjon" + +#, c-format +msgid "Got BYE %d %.*s" +msgstr "Fikk «BYE» %d %.*s" + +#, c-format +msgid "Weird HELLO %s" +msgstr "Rar «HELLO» %s" + +#, c-format +msgid "HELLO %s error %d (%s)" +msgstr "«HELLO» %s feil %d (%s)" + +msgid "Shielded node" +msgstr "Noden har skjold" + msgid "Protocol not acceptable" msgstr "Protokollen er ikke akseptabel" +msgid "Conflict" +msgstr "" + +msgid "Upgrade Header Missing" +msgstr "" + msgid "Servent Shutdown" msgstr "Tjenent-avslutting" -#, fuzzy msgid "Not a network member" -msgstr "Nettverksmodus for Gnutella" +msgstr "" + +msgid "Need a G2 Hub" +msgstr "" msgid "Too frequent crawling" msgstr "For ofte kravling" -#, fuzzy msgid "Already connected to this GUID" -msgstr "Allerede koblet til" +msgstr "" #, c-format msgid "Vendor would exceed %d%% of our slots" @@ -757,20 +654,23 @@ msgid "Pseudo UDP node" msgstr "Pseudo UDP-node" -#, fuzzy +msgid "Pseudo semi-reliable UDP node" +msgstr "" + +msgid "Pseudo G2 UDP node" +msgstr "" + msgid "Pseudo DHT node" -msgstr "Pseudo UDP-node" +msgstr "" msgid "Already connected" msgstr "Allerede koblet til" -#, fuzzy msgid "Limited connection" -msgstr "Arvforbindelser" +msgstr "" -#, fuzzy msgid "Write error during HELLO" -msgstr "Feil ved skriving under «HELLO»: %s" +msgstr "" #, c-format msgid "Write error during HELLO: %s" @@ -805,6 +705,9 @@ msgid "DHT" msgstr "DHT" +msgid "G2 hub" +msgstr "" + msgid "Unknown" msgstr "Ukjent" @@ -819,9 +722,9 @@ msgid "Must wait %u more seconds before resending \"What's New\"" msgstr "" -#, fuzzy, c-format +#, c-format msgid "mkdir(\"%s\") failed: %m" -msgstr "Klarte ikke skrive: %s" +msgstr "" msgid "Can't find your home directory!" msgstr "Klarte ikke finne hjemmekatalogen din." @@ -833,13 +736,17 @@ msgid "creating configuration directory \"%s\"" msgstr "Lager oppsettskatalogen «%s»" -#, fuzzy, c-format +#, c-format msgid "creating directory \"%s\" for %s" -msgstr "Lager oppsettskatalogen «%s»" +msgstr "" + +#, c-format +msgid "Another gtk-gnutella supervisor is running as PID %lu" +msgstr "" -#, fuzzy -msgid "You seem to have left another gtk-gnutella running" -msgstr "Det ser ut til at gtk-gnutella kjører allerede\n" +#, c-format +msgid "Another gtk-gnutella is running as PID %lu" +msgstr "" msgid "Cannot proceed without valid configuration directory" msgstr "Kan ikke fortsette uten gyldig oppsettskatalog" @@ -853,9 +760,6 @@ msgid "Failed to create local socket" msgstr "Klarte ikke lage lokal lyttesokkel" -msgid "Failed to create listening sockets" -msgstr "Klarte ikke lage lyttesokler" - msgid "Can only run as a leaf when TCP-firewalled" msgstr "Kan kun kjøre som blad når TCP er bak brannmur" @@ -865,6 +769,12 @@ msgid "Got EOF" msgstr "Fikk filslutt" +msgid "TLS handshake failed" +msgstr "" + +msgid "Connection locally failed" +msgstr "" + msgid "Write failed (Input Exception)" msgstr "Skrivefeil (Inndatafeil)" @@ -885,21 +795,111 @@ msgid "Connect back timeout" msgstr "Tidsavbrudd for tilbakekobling" +msgid "Request timeout" +msgstr "" + msgid "Timeout waiting for follow-up" msgstr "Tidsavbrudd ved venting på oppfølging" msgid "Lifetime expired" msgstr "Levetiden er utløpt" +msgid "Unauthorized" +msgstr "" + +#, c-format +msgid "Limiting connections from %s" +msgstr "" + +msgid "No reason given" +msgstr "" + +msgid "Bad Request" +msgstr "" + +msgid "Header too large" +msgstr "" + +msgid "Input buffer full" +msgstr "" + +msgid "Extra data after HTTP header" +msgstr "" + msgid "Unable to send GIV" msgstr "Klarte ikke sende GIV" +msgid "Not Found" +msgstr "" + +msgid "File was modified" +msgstr "" + +msgid "Moved Permanently" +msgstr "" + +msgid "File index/name mismatch" +msgstr "" + +msgid "URN Not Found (urn:sha1)" +msgstr "" + +msgid "SHA1 is being recomputed" +msgstr "" + +msgid "Library being rebuilt" +msgstr "" + +msgid "Malformed URN in /uri-res/N2R request" +msgstr "" + +msgid "Malformed URN in /uri-res/N2X request" +msgstr "" + +msgid "TTH is being computed" +msgstr "" + msgid "<Browse Host Request>" msgstr "<Forespørsel om å bla i vert>" +msgid "Browse Host Disabled" +msgstr "" + +#, c-format +msgid "Redirected to %s:%u" +msgstr "" + +msgid "Not Modified" +msgstr "" + msgid "Stalling upload replaced" msgstr "Stoppende opplasting erstattet" +msgid "Already downloading this file" +msgstr "" + +msgid "Malformed Range request" +msgstr "" + +msgid "Requested range not satisfiable" +msgstr "" + +msgid "Requested range not available yet" +msgstr "" + +msgid "Queue full" +msgstr "" + +msgid "Another connection is still active" +msgstr "" + +#, c-format +msgid "%s not honoured; removed from PARQ queue" +msgstr "" + +msgid "Minimum retry delay" +msgstr "" + #, c-format msgid "Queued (slot %d, ETA: %s)" msgstr "Lagt i kø (plass %d, forventes ferdig: %s)" @@ -907,9 +907,12 @@ msgid "Cannot send whole HTTP status" msgstr "Klarte ikke sende hele HTTP-statusen" +msgid "Not Acceptable" +msgstr "" + #, c-format -msgid "<Browse Host Request> %s%s%s" -msgstr "<Forespørsel om å bla i vert> %s%s%s" +msgid "<Browse Host %sRequest> %s%s%s" +msgstr "" msgid "query hits" msgstr "spørringstreff" @@ -923,6 +926,40 @@ msgid ", chunked" msgstr ", delt opp" +msgid "THEX failure" +msgstr "" + +msgid "EOF while sinking" +msgstr "" + +#, c-format +msgid "Read error while sinking: %m" +msgstr "" + +msgid "Content Too Large" +msgstr "" + +msgid "Unknown/Missing Protocol Tag" +msgstr "" + +msgid "Missing Host Header" +msgstr "" + +msgid "Not Implemented" +msgstr "" + +msgid "Bad URI" +msgstr "" + +msgid "Bad Path" +msgstr "" + +msgid "No Content Allowed" +msgstr "" + +msgid "Sharing currently disabled" +msgstr "" + msgid "Write exception" msgstr "Klarte ikke skrive" @@ -962,6 +999,1198 @@ msgid " - Newer version available: from git %s" msgstr " - Nyere versjon tilgjengelig: fra git %s" +msgid "Routing errors" +msgstr "Dirigeringsfeil" + +msgid "Routing table chunks" +msgstr "" + +msgid "Routing table message capacity" +msgstr "" + +msgid "Routing table message count" +msgstr "" + +msgid "Routing through transient node avoided" +msgstr "" + +msgid "Duplicates with higher TTL" +msgstr "Duplikater med høyere TTL" + +msgid "SPAM SHA1 database hits" +msgstr "" + +msgid "SPAM filename and size hits" +msgstr "" + +msgid "SPAM fake hits" +msgstr "" + +msgid "SPAM duplicate hits" +msgstr "" + +msgid "SPAM dynamically caught hostile IP addresses" +msgstr "" + +msgid "SPAM dynamically caught hostile IP held" +msgstr "" + +msgid "SPAM spotted spamming IP addresses held" +msgstr "" + +msgid "Searches to local DB" +msgstr "Søk i lokal database" + +msgid "Hits on local DB" +msgstr "Treff i lokal database" + +msgid "Hits on local partial files" +msgstr "" + +msgid "Hits on \"what's new?\" queries" +msgstr "" + +msgid "Query hits received for local queries" +msgstr "Spørringstreff mottatt for lokale spørringer" + +msgid "G2 searches to local DB" +msgstr "" + +msgid "G2 hits on local DB" +msgstr "" + +msgid "G2 hits on local partial files" +msgstr "" + +msgid "Query hits received for OOB-proxied queries" +msgstr "Spørringstreff mottatt fra OOB-mellomtjente spørringer" + +msgid "Queries requesting OOB hit delivery" +msgstr "Spørringer som ber om OOB-treffleveranse" + +msgid "Stripped OOB flag on queries" +msgstr "Fjernet OOB-flagg på spørringer" + +msgid "Ignored OOB queries due to unclaimed hits" +msgstr "" + +msgid "Duplicate OOB-proxied queries" +msgstr "Dupliser OOB-mellomtjente spørringer" + +msgid "OOB hits received for OOB-proxied queries" +msgstr "OOB-treff mottatt for OOB-mellomtjente spørringer" + +msgid "OOB hits bearing alien IP address" +msgstr "OOB-treff som bærer fremmed IP-adresse" + +msgid "OOB hits ignored due to identified spamming address" +msgstr "" + +msgid "OOB hits ignored due to unsecure promise from known secure host" +msgstr "" + +msgid "Unclaimed locally-generated OOB hits" +msgstr "Ukrevde lokallagde OOB-treff" + +msgid "Partially claimed locally-generated OOB hits" +msgstr "Delvis krevde lokallagde OOB-treff" + +msgid "Spurious OOB hit claiming received" +msgstr "Mottok flask OOB-treff" + +msgid "Unrequested OOB hits received" +msgstr "Ikke forespurte OOB-treff mottatt" + +msgid "Received query hits for untracked queries" +msgstr "" + +msgid "Tracked query MUIDs" +msgstr "" + +msgid "Compacted queries" +msgstr "Sammenpakkede spørringer" + +msgid "Bytes saved by compacting" +msgstr "Byte spart med sammenpakking" + +msgid "UTF8 queries" +msgstr "UTF-8-spørringer" + +msgid "SHA1 queries" +msgstr "SHA1-spørringer" + +msgid "\"What's New?\" queries" +msgstr "" + +msgid "UTF8 G2 queries" +msgstr "" + +msgid "SHA1 G2 queries" +msgstr "" + +msgid "GUESS queries" +msgstr "" + +msgid "GUESS queries (0.2)" +msgstr "" + +msgid "GUESS link cache size" +msgstr "" + +msgid "GUESS cached query keys held" +msgstr "" + +msgid "GUESS cached 0.2 hosts held" +msgstr "" + +msgid "GUESS cached G2 hosts held" +msgstr "" + +msgid "GUESS locally generated queries" +msgstr "" + +msgid "GUESS currently running queries" +msgstr "" + +msgid "GUESS hits received for locally generated queries" +msgstr "" + +msgid "GUESS ultra nodes queried" +msgstr "" + +msgid "GUESS ultra nodes sending back an acknowledgment" +msgstr "" + +msgid "GUESS G2 nodes queried" +msgstr "" + +msgid "GUESS G2 nodes sending back an acknowledgment" +msgstr "" + +msgid "Throttled local push messages" +msgstr "" + +msgid "Throttled received push messages" +msgstr "" + +msgid "Broadcasted push messages" +msgstr "Kringkastede dyttemeldinger" + +msgid "Push-proxy UDP relayed messages" +msgstr "UDP-relésendte push-mellomtjenermeldinger" + +msgid "Push-proxy TCP relayed messages" +msgstr "TCP-relésendte push-mellomtjenermeldinger" + +msgid "Push-proxy TCP for FW<->FW transfers" +msgstr "" + +msgid "Push-proxy broadcasted messages" +msgstr "Kringkastede push-mellomtjenermeldinger" + +msgid "Push-proxy found un-proxied local route" +msgstr "Push-mellomtjener fant lokal rute uten mellomtjener" + +msgid "Push-proxy lookup failures" +msgstr "Feilede push-mellomtjeneroppslag" + +msgid "Push relayed via local route" +msgstr "Push ble relésendte via en lokal rute" + +msgid "Push relayed via routing table" +msgstr "Push relésendte via rutingstabell" + +msgid "Locally generated dynamic queries" +msgstr "Lokallagde dynamiske spøringer" + +msgid "Leaf-generated dynamic queries" +msgstr "Bladlagde dynamiske spørringer" + +msgid "OOB-proxied leaf queries" +msgstr "OOB-mellomtjente bladspørringer" + +msgid "Fully completed dynamic queries" +msgstr "Fullt utførte dynamiske spørringer" + +msgid "Partially completed dynamic queries" +msgstr "Delvis fullførte dynamiske spørringer" + +msgid "Dynamic queries ended with no results" +msgstr "Dynamiske spørringer avsluttet uten resultater" + +msgid "Fully completed dynamic queries getting late results" +msgstr "Fullt utførte dynamiske spørringer som får seine resultater" + +msgid "Dynamic queries with partial late results" +msgstr "Dynamiske spørringer med delvis seine resultater" + +msgid "Dynamic queries completed by late results" +msgstr "Dynamiske spørringer fullført av seine resultater" + +msgid "Queries seen from GTKG" +msgstr "Spørringer sett fra gtk-gnutella" + +msgid "Queries seen from GTKG that were re-queries" +msgstr "Gjentatte spørringer sett fra gtk-gnutella" + +msgid "Queries advertising support of GGEP \"H\"" +msgstr "Spørringer som viser støtte for GGEP «H»" + +msgid "Queries advertising support of semi-reliable UDP" +msgstr "" + +msgid "GIV callbacks received" +msgstr "Mottatte GIV-tilbakekall" + +msgid "GIV discarded due to no suitable download" +msgstr "GIV ble oversett fordi nedlastingen ikke passet" + +msgid "QUEUE callbacks received" +msgstr "Mottok KØ-tilbakekall" + +msgid "QUEUE discarded due to no suitable download" +msgstr "QUEUE forkastet grunnet upassende nedlasting" + +msgid "File descriptors banned running count" +msgstr "" + +msgid "UDP read-ahead datagram running count" +msgstr "" + +msgid "UDP read-ahead datagram running bytes" +msgstr "" + +msgid "UDP read-ahead datagram \"old\" processed" +msgstr "" + +msgid "UDP read-ahead datagram max count" +msgstr "" + +msgid "UDP read-ahead datagram max bytes" +msgstr "" + +msgid "UDP read-ahead datagram max delay" +msgstr "" + +msgid "UDP push messages received for FW<->FW connections" +msgstr "" + +msgid "UDP push messages requesting FW<->FW connection with ourselves" +msgstr "" + +msgid "UDP push messages patched for FW<->FW connections" +msgstr "" + +msgid "UDP UHC pings received" +msgstr "" + +msgid "UDP UHC pongs sent" +msgstr "" + +msgid "UDP messages with bogus source IP" +msgstr "UDP-meldinger med svindelkilde-IP" + +msgid "UDP messages from shunned IP (discarded)" +msgstr "" + +msgid "UDP truncated incoming messages" +msgstr "" + +msgid "Alien UDP messages (non-Gnutella)" +msgstr "Fremmede UDP-meldinger (ikke Gnutella)" + +msgid "Unprocessed UDP Gnutella messages" +msgstr "Ubehandlede UDP Gnutella-meldinger" + +msgid "Compressed UDP messages enqueued" +msgstr "Komprimerte UDP-meldinger lagt i køen" + +msgid "Compressed UDP messages received" +msgstr "Komprimerte UDP-meldinger mottatt" + +msgid "Candidates for UDP message compression" +msgstr "" + +msgid "Uncompressed UDP messages due to no gain" +msgstr "Ukomprimerte UDP-meldinger fordi det ikke var noe å tjene" + +msgid "Ambiguous UDP messages received" +msgstr "" + +msgid "Ambiguous UDP messages inspected more deeply" +msgstr "" + +msgid "Ambiguous UDP messages handled as semi-reliable UDP" +msgstr "" + +msgid "Semi-reliable UDP total messages given for transmission" +msgstr "" + +msgid "Semi-reliable UDP total messages deflated" +msgstr "" + +msgid "Semi-reliable UDP total messages unsent" +msgstr "" + +msgid "Semi-reliable UDP total messages dropped due to temporary ban" +msgstr "" + +msgid "Semi-reliable UDP total messages sent to known responsive hosts" +msgstr "" + +msgid "Semi-reliable UDP total messages partially sent due to clogging" +msgstr "" + +msgid "Semi-reliable UDP reliable messages given for transmission" +msgstr "" + +msgid "Semi-reliable UDP reliable messages correctly transmited" +msgstr "" + +msgid "Semi-reliable UDP reliable messages not fully acknowledged" +msgstr "" + +msgid "Semi-reliable UDP fragments sent" +msgstr "" + +msgid "Semi-reliable UDP fragments resent" +msgstr "" + +msgid "Semi-reliable UDP fragment sendings avoided" +msgstr "" + +msgid "Semi-reliable UDP fragments sent too many times" +msgstr "" + +msgid "Semi-reliable UDP total acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP spurious acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP invalid acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP acknowledgments re-queued for sending" +msgstr "" + +msgid "Semi-reliable UDP plain acknowledgments dropped" +msgstr "" + +msgid "Semi-reliable UDP enhanced acknowledgments dropped" +msgstr "" + +msgid "Semi-reliable UDP plain acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP EARs sent" +msgstr "" + +msgid "Semi-reliable UDP too many EARs sent" +msgstr "" + +msgid "Semi-reliable UDP EAR negative acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP acknowledgments received after sending EARs" +msgstr "" + +msgid "Semi-reliable UDP fragments received" +msgstr "" + +msgid "Semi-reliable UDP duplicate fragments received" +msgstr "" + +msgid "Semi-reliable UDP unreliable fragments received" +msgstr "" + +msgid "Semi-reliable UDP dropped received fragments" +msgstr "" + +msgid "Semi-reliable UDP fragments received whilst lingering" +msgstr "" + +msgid "Semi-reliable UDP messages expired before re-assembly" +msgstr "" + +msgid "Semi-reliable UDP messages re-assembled completely" +msgstr "" + +msgid "Semi-reliable UDP messages inflated successfully" +msgstr "" + +msgid "Semi-reliable UDP messages inflated incorrectly" +msgstr "" + +msgid "Semi-reliable UDP unreliable messages received" +msgstr "" + +msgid "Semi-reliable UDP empty messages received" +msgstr "" + +msgid "Semi-reliable UDP total acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP avoided acknowledgment sendings" +msgstr "" + +msgid "Semi-reliable UDP EARs received" +msgstr "" + +msgid "Semi-reliable UDP EARs received for unknown message" +msgstr "" + +msgid "Semi-reliable UDP EARs received whilst lingering" +msgstr "" + +msgid "Semi-reliable UDP fragments from hostile IP addresses" +msgstr "" + +msgid "UDP G2 hits rerouted to hub for delivery" +msgstr "" + +msgid "UDP G2 hits undelivered" +msgstr "" + +msgid "Consolidated servers (after GUID and IP address linking)" +msgstr "Sammenkjørte tjenere (etter kobling av GUID og IP-adresse)" + +msgid "Duplicate downloads found during server consolidation" +msgstr "Fant dupliserte nedlastinger under tjenersammenkjøring" + +msgid "Discovered server GUIDs" +msgstr "Oppdagede tjener-GUID'er" + +msgid "Changed server GUIDs" +msgstr "Endrede tjener-GUID'er" + +msgid "Detected GUID collisions" +msgstr "" + +msgid "Detected collisions with our own GUID" +msgstr "Oppdaget kollisjoner med vår egen GUID" + +msgid "GUID dynamically banned" +msgstr "" + +msgid "Firewalled node info for known hosts received in upload requests" +msgstr "" +"Info om noder med brannmur for kjente adresser mottatt i " +"opplastingsforespørsler" + +msgid "Revitalized PUSH routes" +msgstr "" + +msgid "Collected new PUSH proxies from other query hits" +msgstr "" + +msgid "Attempted download resource switching on completion" +msgstr "Prøvde bytting av nedlastingsressurser ved fullføring" + +msgid "Attempted download resource switching after error" +msgstr "Prøvde bytting av nedlastingsressurser etter en feil" + +msgid "Successful download resource switching (all kind)" +msgstr "Vellykkede bytter av nedlastingsressurser (alle typer)" + +msgid "Successful download resource switching between plain files" +msgstr "Vellykkede bytter av nedlastingsressurser mellom enkle filer" + +msgid "Successful download resource switching after error" +msgstr "Vellykkede bytter av nedlastingsressurser etter feil" + +msgid "Actively queued after resource switching attempt" +msgstr "Aktivt i kø etter forsøk på bytte av nedlastingsressurser" + +msgid "Sunk HTTP reply data on error codes" +msgstr "Sunket HTTP-svardata ved feilkoder" + +msgid "Ignored downloaded data" +msgstr "Ignorert nedlastet data" + +msgid "Ignoring requested after data mismatch" +msgstr "Ignorerer forespurte data etter feile verdier" + +msgid "Ignoring requested to preserve connection" +msgstr "Forespørsel om ignorering for å beholde forbindelsen" + +msgid "Ignoring requested due to aggressive swarming" +msgstr "Ignoerering forespurt etter aggressiv sverming" + +msgid "Ignoring refused (data too large or server too slow)" +msgstr "Ignorering nektet (for mye data eller for treig tjener)" + +msgid "Client resource switching (all detected)" +msgstr "Klient-ressursbytte (alle oppdagede)" + +msgid "Client resource switching between plain files" +msgstr "Klient-ressursbytting mellom enkle filer" + +msgid "Client follow-up request after HTTP error was returned" +msgstr "Forespørsel om klient-oppfølging etter mottatt HTTP-feil" + +msgid "PARQ client resource switching in slots (SHA-1 based)" +msgstr "Bytte av PARQ-klientressurser i plasser (SHA-1-basert)" + +msgid "PARQ client retry-after violation" +msgstr "Nytt PARQ-klientforsøk etter brudd" + +msgid "PARQ client kicked out after too many retry-after violations" +msgstr "" +"PARQ-klient ble sparket ut etter for mange brudd på «prøv på nytt etter»-" +"funksjonen" + +msgid "PARQ upload slot limit overrides" +msgstr "Overstyring av grenser for PARQ-opplastingsplasser" + +msgid "PARQ quick upload slots granted" +msgstr "Raske PARQ-opplastingsplasser ble innvilget" + +msgid "PARQ QUEUE sending attempts" +msgstr "PARQ QUEUE-sendingsforsøk" + +msgid "PARQ QUEUE messages sent" +msgstr "Sendte PARQ QUEUE-meldinger" + +msgid "PARQ QUEUE follow-up requests received" +msgstr "Mottatte PARQ QUEUE oppfølgingsforespørsler" + +msgid "Launched SHA-1 file verifications" +msgstr "" + +msgid "Launched TTH file verifications" +msgstr "" + +msgid "Re-seeding of orphan downloads through query hits" +msgstr "Gjenoppta kildeløse nedlastinger via søketreff" + +msgid "Re-seeding of orphan downloads through upload requests" +msgstr "" + +msgid "RUDP sent bytes" +msgstr "" + +msgid "RUDP received bytes" +msgstr "" + +msgid "DHT estimated amount of nodes" +msgstr "DHT beregnet mengde noder" + +msgid "DHT standard error of estimated amount of nodes" +msgstr "" + +msgid "DHT k-ball theoretical frontier (bits)" +msgstr "" + +msgid "DHT k-ball furthest frontier (bits)" +msgstr "DHT k-ball fjerneste grense (biter)" + +msgid "DHT k-ball closeest frontier (bits)" +msgstr "DHT k-ball nærmeste grense (biter)" + +msgid "DHT routing table buckets" +msgstr "DHT rutingstabellbøtter" + +msgid "DHT routing table leaves" +msgstr "DHT rutingstabell-blad" + +msgid "DHT routing table maximum depth" +msgstr "DHT rutingstabellens største dybde" + +msgid "DHT routing table good nodes" +msgstr "DHT rutingstabellens gode noder" + +msgid "DHT routing table stale nodes" +msgstr "DHT rutingstabellens oppstoppede noder" + +msgid "DHT routing table pending nodes" +msgstr "DHT rutingstabellens ventende noder" + +msgid "DHT routing table evicted nodes" +msgstr "DHT rutingstabellens utviste noder" + +msgid "DHT routing table evicted firewalled nodes" +msgstr "DHT rutingstabellens utviste noder bak brannmur" + +msgid "DHT routing table evicted nodes due to quota" +msgstr "" + +msgid "DHT routing table promoted pending nodes" +msgstr "DHT rutingstabellens forfremmede ventende noder" + +msgid "DHT routing table pinged promoted nodes" +msgstr "" + +msgid "DHT routing table rejected node due to bucket network quota" +msgstr "" + +msgid "DHT routing table rejected node due to global network quota" +msgstr "" + +msgid "DHT completed bucket refreshes" +msgstr "DHT fullførte oppdateringer av bøtter" + +msgid "DHT forced bucket refreshes" +msgstr "" + +msgid "DHT forced bucket merges" +msgstr "" + +msgid "DHT bucket merges" +msgstr "" + +msgid "DHT bucket splits" +msgstr "" + +msgid "DHT denied non-splitable bucket refresh" +msgstr "DHT nektet oppdatering av bøtte som ikke kunne splittes" + +msgid "DHT initiated bucket alive checks" +msgstr "DHT startede kontroller om bøtter er aktive" + +msgid "DHT alive pings sent to good nodes" +msgstr "DHT status-pinger sendt til gode noder" + +msgid "DHT alive pings sent to stale nodes" +msgstr "" + +msgid "DHT alive pings sent to shutdowning nodes" +msgstr "" + +msgid "DHT alive pings avoided" +msgstr "" + +msgid "DHT alive pings skipped" +msgstr "" + +msgid "DHT revitalized stale nodes on RPC reply" +msgstr "" + +msgid "DHT value store rejected on IP/network quota grounds" +msgstr "" + +msgid "DHT value store rejected on creator validation grounds" +msgstr "" + +msgid "DHT nodes rejected during lookup based on network quota" +msgstr "" + +msgid "DHT nodes rejected during lookup based on suspicious proximity" +msgstr "" + +msgid "DHT nodes rejected during lookup based on frequency divergence" +msgstr "" + +msgid "DHT node contact IP addresses fixed during lookup" +msgstr "" + +msgid "DHT keys held" +msgstr "Holdte DHT-nøkler" + +msgid "DHT cached keys held" +msgstr "Lagrede DHT-nøkler" + +msgid "DHT values held" +msgstr "Holdte DHT-verdier" + +msgid "DHT cached KUID targets held" +msgstr "" + +msgid "DHT cached closest root nodes" +msgstr "" + +msgid "DHT cached roots exact hits" +msgstr "" + +msgid "DHT cached roots approximate hits" +msgstr "" + +msgid "DHT cached roots misses" +msgstr "" + +msgid "DHT cached roots lookups within k-ball" +msgstr "" + +msgid "DHT cached roots contact address refreshed" +msgstr "" + +msgid "DHT cached security tokens held" +msgstr "" + +msgid "DHT cached security tokens hits" +msgstr "" + +msgid "DHT stable node information held" +msgstr "" + +msgid "DHT local hits on value lookups" +msgstr "Lokale treff for oppslag av DHT-verdier" + +msgid "DHT local hits returning values from cached keys" +msgstr "" + +msgid "DHT returned expanded values" +msgstr "" + +msgid "DHT returned values as secondary keys" +msgstr "" + +msgid "DHT claimed values via secondary keys" +msgstr "" + +msgid "DHT returned cached expanded values" +msgstr "" + +msgid "DHT returned cached values as secondary-keys" +msgstr "" + +msgid "DHT claimed cached values via secondary keys" +msgstr "" + +msgid "DHT successfully received value publications" +msgstr "" + +msgid "DHT successfully received value removals" +msgstr "" + +msgid "DHT replication of stale value avoided" +msgstr "DHT-duplisering av utgått verdi unngått" + +msgid "DHT replication of held values" +msgstr "Duplisering av DHT holdte verdier" + +msgid "DHT republishing of held values" +msgstr "Republisering av DHT holdte verdier" + +msgid "DHT secondary-key value fetch issued" +msgstr "Sendte forespørsler for sekundære DHT-nøkkelverdier" + +msgid "DHT duplicate values returned in lookups" +msgstr "Dupliserte DHT-verdier returnert i oppslag" + +msgid "DHT detected KUID collisions" +msgstr "DHT-oppdagede KUID-kollisjoner" + +msgid "DHT detected collisions with our own KUID" +msgstr "DHT oppdaget kollisjoner med vår lokale KUID" + +msgid "DHT caching attempts" +msgstr "" + +msgid "DHT caching ended successfully" +msgstr "" + +msgid "DHT caching partially completed" +msgstr "" + +msgid "DHT key-offloading checks after discovering new closest node" +msgstr "" + +msgid "DHT keys selected for offloading" +msgstr "" + +msgid "DHT key-offloading attempts" +msgstr "" + +msgid "DHT key-offloading ended successfully" +msgstr "" + +msgid "DHT key-offloading partially completed" +msgstr "" + +msgid "DHT values successfully offloaded" +msgstr "" + +msgid "DHT incoming messages" +msgstr "" + +msgid "DHT incoming messages with UDP-matching contact address" +msgstr "" + +msgid "DHT incoming messages with contact address fixed" +msgstr "" + +msgid "DHT incoming messages from hostile addresses" +msgstr "" + +msgid "DHT incoming messages with hostile contact address" +msgstr "" + +msgid "DHT RPC messages prepared" +msgstr "" + +msgid "DHT RPC messages cancelled" +msgstr "" + +msgid "DHT RPC timed out" +msgstr "" + +msgid "DHT RPC replies received" +msgstr "" + +msgid "DHT RPC replies with contact address fixed" +msgstr "" + +msgid "DHT RPC late replies received" +msgstr "" + +msgid "DHT RPC detected KUID mismatches on reply" +msgstr "" + +msgid "DHT RPC recent nodes held" +msgstr "" + +msgid "DHT node verifications" +msgstr "" + +msgid "DHT publishing attempts" +msgstr "" + +msgid "DHT publishing ended successfully (all roots)" +msgstr "" + +msgid "DHT publishing partially completed (root subset only)" +msgstr "" + +msgid "DHT publishing ending with proper value presence" +msgstr "" + +msgid "DHT value republishing occurring too late (after expiry)" +msgstr "" + +msgid "DHT publishing to self" +msgstr "" + +msgid "DHT background publishing completion attempts" +msgstr "" + +msgid "DHT background publishing completion showing improvements" +msgstr "" + +msgid "DHT background publishing completion successful (all roots)" +msgstr "" + +msgid "DHT SHA1 data type collisions" +msgstr "" + +msgid "DHT lookup path passively protected against attack" +msgstr "" + +msgid "DHT lookup path actively protected against attack" +msgstr "" + +msgid "DHT alt-loc lookups issued" +msgstr "Sendte DHT alt loc-oppslag" + +msgid "DHT push-proxy lookups issued" +msgstr "Sendte DHT push-mellomtjener-oppslag" + +msgid "DHT successful alt-loc lookups" +msgstr "Vellykkede DHT alt loc-oppslag" + +msgid "DHT successful push-proxy lookups" +msgstr "Vellykkede DHT-oppslag i push-mellomtjenere" + +msgid "DHT successful node push-entry lookups" +msgstr "" + +msgid "DHT re-seeding of orphan downloads" +msgstr "Gjenopta nedlastinger uten kilder ved hjelp av DHT" + +msgid "Digests computed on general statistics" +msgstr "" + +msgid "Digests computed on TCP statistics" +msgstr "" + +msgid "Digests computed on UDP statistics" +msgstr "" + +msgid "Ping" +msgstr "Ping" + +msgid "Pong" +msgstr "Pong" + +msgid "Bye" +msgstr "Farvel" + +msgid "QRP" +msgstr "QRP" + +msgid "HSEP" +msgstr "HSEP" + +msgid "RUDP" +msgstr "RUDP" + +msgid "Vendor spec." +msgstr "Program spes." + +msgid "Vendor std." +msgstr "Program std." + +msgid "Push" +msgstr "Dytt" + +msgid "Query" +msgstr "Spørring" + +msgid "Query hit" +msgstr "Spørringstreff" + +msgid "DHT (truncated)" +msgstr "" + +msgid "DHT Ping" +msgstr "" + +msgid "DHT Pong" +msgstr "" + +msgid "DHT Store" +msgstr "" + +msgid "DHT Store Ack" +msgstr "" + +msgid "DHT Find Node" +msgstr "" + +msgid "DHT Found Node" +msgstr "" + +msgid "DHT Find Value" +msgstr "" + +msgid "DHT Value" +msgstr "" + +msgid "G2 Crawl Request" +msgstr "" + +msgid "G2 Hub Advertisement" +msgstr "" + +msgid "G2 Hub List" +msgstr "" + +msgid "G2 Hub List Req" +msgstr "" + +msgid "G2 Hub List Ack" +msgstr "" + +msgid "G2 Local Node Info" +msgstr "" + +msgid "G2 Ping" +msgstr "" + +msgid "G2 Pong" +msgstr "" + +msgid "G2 Push" +msgstr "" + +msgid "G2 Query Key Ack" +msgstr "" + +msgid "G2 Query Key Req" +msgstr "" + +msgid "G2 Query" +msgstr "" + +msgid "G2 Query Ack" +msgstr "" + +msgid "G2 Query Hit" +msgstr "" + +msgid "G2 Query Hash Table" +msgstr "" + +msgid "G2 User Profile Check" +msgstr "" + +msgid "G2 User Profile Data" +msgstr "" + +msgid "Total" +msgstr "Total" + +msgid "Bad size" +msgstr "Ugyldig størrelse" + +msgid "Too small" +msgstr "For liten" + +msgid "Too large" +msgstr "For stor" + +msgid "Way too large" +msgstr "Altfor stor" + +msgid "Too old" +msgstr "" + +msgid "Unknown message type" +msgstr "Ukjent meldingstype" + +msgid "Unexpected message" +msgstr "Uventet melding" + +msgid "Message sent with TTL = 0" +msgstr "Melding sendt med TTL = 0" + +msgid "Improper hops/ttl combination" +msgstr "Feil «hops»/«ttl»-kombinasjon" + +msgid "Max TTL exceeded" +msgstr "Høyeste TTL er overgått" + +msgid "Message throttle" +msgstr "Meldingskveling" + +msgid "Message matched limits" +msgstr "" + +msgid "Transient node" +msgstr "" + +msgid "Unusable Pong" +msgstr "Ubrukelig pong" + +msgid "Hard TTL limit reached" +msgstr "Nådde hard TTL-begrensning" + +msgid "Max hop count reached" +msgstr "Nådde høyste antall «hop»" + +msgid "Route lost" +msgstr "Tapt rute" + +msgid "No route" +msgstr "Ingen rute" + +msgid "Duplicate message" +msgstr "Duplisert melding" + +msgid "OOB Proxy MUID Conflict" +msgstr "" + +msgid "Message to banned GUID" +msgstr "Melding til bannlyst GUID" + +msgid "Message from banned GUID" +msgstr "" + +msgid "Node shutting down" +msgstr "Node slås av" + +msgid "TX flow control" +msgstr "Kontroll av TX-flyt" + +msgid "Query text had no trailing NUL" +msgstr "Spørringsteksten sluttet ikke med «NUL»" + +msgid "Query text too short" +msgstr "Spørringsteksten er for kort" + +msgid "Query had unnecessary overhead" +msgstr "Spørringen hadde unødvendig overhode" + +msgid "Query had bad URN" +msgstr "Forespørselen hadde ugyldig URN" + +msgid "Message with malformed SHA1" +msgstr "Melding med feilformet SHA1" + +msgid "Message with malformed UTF-8" +msgstr "Melding med feilformet UTF-8" + +msgid "Malformed Query Hit" +msgstr "Traff feilformet spørring" + +msgid "Bad return address" +msgstr "Ugyldig returadresse" + +msgid "Hostile IP address" +msgstr "Fiendtlig IP-adresse" + +msgid "Shunned IP address" +msgstr "" + +msgid "Bogus result from Morpheus" +msgstr "" + +msgid "Spam" +msgstr "Spam" + +msgid "Evil filename" +msgstr "Ondt filnavn" + +msgid "Improper media type" +msgstr "" + +msgid "Payload inflating error" +msgstr "Klarte ikke øke lasten" + +msgid "Unknown header flags present" +msgstr "Fikk ukjent meldingshode" + +msgid "Own search results" +msgstr "Egne søkeresultater" + +msgid "Own queries" +msgstr "" + +msgid "Ancient query format" +msgstr "Gammelt spørringsformat" + +msgid "Blank Servent ID" +msgstr "Tom tjenent-ID" + +msgid "GUESS Query missing token" +msgstr "" + +msgid "GUESS Invalid query token" +msgstr "" + +msgid "DHT Invalid security token" +msgstr "DHT: Ugyldig sikkerhetstegn" + +msgid "DHT Too many STORE requests" +msgstr "DHT: For mange STORE-forespørsler" + +msgid "DHT Malformed message" +msgstr "DHT: Feilformet kommando" + +msgid "G2 Unexpected message" +msgstr "" + +msgid "Cannot cross networks" +msgstr "" + msgid "No proxy" msgstr "Ingen mellomtjener" @@ -1019,24 +2248,20 @@ msgid "own KUID lookup" msgstr "" -#, fuzzy msgid "completing" -msgstr "ferdig" +msgstr "" msgid "completed" msgstr "ferdig" -#, fuzzy msgid "shutdown" -msgstr "Slå av (%s)" +msgstr "" -#, fuzzy msgid "active (recommended)" -msgstr "automatisk (anbefalt)" +msgstr "" -#, fuzzy msgid "passive" -msgstr " passiv)" +msgstr "" msgid "Indicates whether the hostcache file is being read." msgstr "Viser hvorvidt vertsminnefilen leses." @@ -1084,17 +2309,12 @@ "er i ultralikemannmodus. Dette bør være mindre enn høyeste antall " "forbindelser for å itllate innkommende forbindelser." -#, fuzzy msgid "" "Don't allow more than this number of connections to other servents. As a " "rule of thumb you should reserve 256 b/s bandwidth per connection. Never use " "up all your bandwidth, leave a little space for TCP/IP overhead. It's not " "advisable that you set this to a value smaller than 40." msgstr "" -"Ikke tillat mer enn dette antallet forbindelser til andre tjenenter. Som en " -"tommelregel bør du reservere 256B/s per forbindelse. Aldri bruk opp all " -"båndbredden din; la litt være igjen for TCP/IP-overhode. Det er ikke lurt " -"velge en verdi mindre enn 30." msgid "Number of leaf nodes currently connected." msgstr "Antall bladnoder som er tilkoblet for øyeblikket." @@ -1444,9 +2664,6 @@ msgid "Debug level for code shared between gui and core." msgstr "Feilsøkingsnivå for kode som deles mellom grensesnitt og kjerne." -msgid "Verbosity of Bitzi related debug messages." -msgstr "Utdypetheten til «Bitzi»-relaterte feilsøkingsmeldinger." - msgid "Verbosity of URL handling related debug messages." msgstr "Utdypethet for URL-håndteringsrelaterte feilsøkingsmeldinger." @@ -1538,8 +2755,8 @@ "for tidlig 10 ganger, som gir en god balanse mellom beskyttelse mot misbruk " "og støtte for gamle programmer." -msgid "For development use: track properties." -msgstr "For utviklere: spor verdier." +msgid "Indicates a kernel network buffer shortage." +msgstr "" msgid "For development use: don't add new hosts to the host cache." msgstr "For utviklere: ikke legg til nye maskiner i vertsminnet." @@ -1673,9 +2890,8 @@ msgid "Current number of hosts in regular node caches." msgstr "Gjeldende antall verter i normalt nodeminne." -#, fuzzy msgid "Current number of IPv4 hosts in ultra node caches." -msgstr "Gjeldende antall verter i ultranodeminne." +msgstr "" msgid "Current number of hosts in bad node caches." msgstr "Antal verter i minnet for dårlige noder." @@ -1683,9 +2899,8 @@ msgid "Maximum number of hosts in the regular node cache." msgstr "Høyeste antall maskiner i den normale nodeoversikten." -#, fuzzy msgid "Maximum number of IPv4 hosts in the ultra node cache." -msgstr "Høyeste antall maskiner i ultranodelisten." +msgstr "" msgid "Maximum number of hosts in the BUSY, UNSTABLE and TIMEOUT lists." msgstr "Høyeste antall verter i listene for «BUSY», «UNSTABLE» og «TIMEOUT»." @@ -2023,10 +3238,8 @@ msgid "" "Maximum amount of leaves we can accept. To be promoted Ultra, you should " -"reserve 32 bytes of bandwidth per leaf." +"reserve 32 bytes/sec of bandwidth per leaf." msgstr "" -"Høyeste antall blader vi kan godta. For å bli forfremmet til Ultra bør du " -"reservere 32 byte av båndbredden per blad." msgid "What to do with files that will be ignored for downloading." msgstr "Hva som skal gjøres med filer som vil bli ignorert for nedlasting." @@ -2562,13 +3775,9 @@ msgid "" "If set to TRUE, the global hostiles.txt is used as well as the private " -"$GTK_GNUTELLA_DIR/hostiles.txt. This allows to separate your private ban " +"$GTK_GNUTELLA_DIR/hostiles.txt. This allows you to separate your private ban " "list from the global one distributed with gtk-gnutella." msgstr "" -"Hvis dette slås på, brukes den globale «hostfiles.txt» i tillegg til den " -"private «$GTK_GNUTELLA_DIR/hostfiles.txt». Dette gjør det mulig å separere " -"den private bannlysingslisten din fra den globale som distribueres med Gtk-" -"Gnutella." msgid "If set to TRUE, SO_LINGER is used for sockets." msgstr "Hvis dette er satt til «TRUE» brukes «SO_LINGERfor sokler." @@ -2832,7 +4041,6 @@ msgid "Debug level for DHT key/value publishing." msgstr "Feilsøkingsnivå for publisering av DHT-nøkler/verdier." -#, fuzzy msgid "" "Bandwidth hint for DHT user lookups, in bytes/sec. This is used both for " "limiting concurrent publishing and searching. Traffic is made on the " @@ -2840,11 +4048,7 @@ "less). The larger the numbers, the more values can be looked up " "concurrently, but the more bandwidth is used." msgstr "" -"Hint om båndbredden for DHT-oppslag av brukere, i bytes/s. Dette brukes både " -"for å begrense publlisering og søking. Trafikken går over Gnutella UDP-" -"sokkelen. Det kreves mindre for opplasting enn det gjør for nedlasting." -#, fuzzy msgid "" "Bandwidth hint for DHT user lookups, in bytes/sec. This is used both for " "limiting concurrent publishing and searching. Traffic is made on the " @@ -2853,10 +4057,6 @@ "times). The larger the numbers the more values can be looked up " "concurrently, but the more bandwidth is used." msgstr "" -"Hint om båndbredden for DHT-oppslag av brukere, i bytes/s. Dette brukes både " -"for å begrense publlisering og søking. Trafikken går over Gnutella UDP-" -"sokkelen, og kan derfor ikke kontrolleres ordentlig. Det kreves mer for " -"nedlasting enn det gjør for opplasting" msgid "" "Whether the GUID should be kept accross sessions. A sticky GUID can be " @@ -2928,71 +4128,55 @@ "$GTK_GNUTELLA_DIR/packets_tx.dump." msgstr "Dump alle mottatte pakker til $GTK_GNUTELLA_DIR/packets_rx.dump." -#, fuzzy msgid "Debug level the TCP message queues" -msgstr "Feilsøkingsnivå for søkekøen." +msgstr "" -#, fuzzy msgid "Debug level for the UDP message queue." -msgstr "Feilsøkingsnivå for søkekøen." +msgstr "" -#, fuzzy msgid "" "Maximum size of the UDP message queue (in bytes). Must be at least 150 " "percent of the maximum message size." msgstr "" -"Høyeste størrelse på nodenes sendekø (i byte). Må være minst 150 prosent av " -"høyeste meldingsstørrelse." -#, fuzzy msgid "Debug level for the management of the clock accuracy." -msgstr "Feilsøkingsnivå for behandlingen av lokalt lagrede adresser." +msgstr "" -#, fuzzy msgid "Debug level for the firewalled status management." -msgstr "Feilsøkingsnivå for behandling av nedlastingsmaske." +msgstr "" -#, fuzzy msgid "Debug level for host management." -msgstr "Feilsøkingsnivå for behandling av nedlastingsmaske." +msgstr "" -#, fuzzy msgid "Debug level for DHT root node caching." -msgstr "Feilsøkingsnivå for pong-minnelagring." +msgstr "" -#, fuzzy msgid "Logged statistics level for code shared between GUI and core." -msgstr "Feilsøkingsnivå for kode som deles mellom grensesnitt og kjerne." +msgstr "" -#, c-format msgid "" "If TRUE, the spam SHA1 database is kept in memory. If FALSE, it is kept in a " "fast disk database, which saves a large amount of core memory and reduces " "the overall footprint, at the cost of an increased I/O level. However, the " -"DB cache has typically a 90% hit rate, so the actual overhead is barely " +"DB cache has a 90 percent hit rate, so the actual overhead is barely " "noticeable when running as an ultra node and should remain completely " "unnoticed when running as a leaf." msgstr "" -#, fuzzy msgid "Debug level for spam detection." -msgstr "Feilsøkingsnivå for pong-minnelagring." +msgstr "" -#, fuzzy msgid "Debug level for lockfile management." -msgstr "Feilsøkingsnivå for behandling av nedlastingsmaske." +msgstr "" -#, fuzzy msgid "Debug level for the zone-based memory allocator." -msgstr "Feilsøkingsnivå for grensesnittet." +msgstr "" -#, fuzzy msgid "Debug level for the pool-based memory allocator." -msgstr "Feilsøkingsnivå for grensesnittet." +msgstr "" -#, fuzzy msgid "Debug level for the RX buffer allocator." -msgstr "Feilsøkingsnivå for grensesnittet." +msgstr "" msgid "" "Whether the zone-based memory allocator should always keep the zones in " @@ -3003,45 +4187,35 @@ "spam_lut_in_memory to FALSE." msgstr "" -#, fuzzy msgid "Debug level for the virtual memory manager." -msgstr "Feilsøkingsnivå for programmeldinger." +msgstr "" -#, fuzzy msgid "Debug level for final shutdown." -msgstr "Feilsøkingsnivå for filinformasjon." +msgstr "" -#, fuzzy msgid "Country preferences" -msgstr "Oppsett" +msgstr "" -#, fuzzy msgid "Debug level for country limits." -msgstr "Feilsøkingsnivå for spørringer." +msgstr "" -#, fuzzy msgid "Whether to log dropped Gnutella messages" -msgstr "Feilsøkingsnivå for Gnutella-meldinger." +msgstr "" -#, fuzzy msgid "Debug level for whitelist management." -msgstr "Feilsøkingsnivå for behandling av nedlastingsmaske." +msgstr "" -#, fuzzy msgid "Debug level for DHT token caching." -msgstr "Feilsøkingsnivå for pong-minnelagring." +msgstr "" -#, fuzzy msgid "Debug level for DHT publishing from Gnutella." -msgstr "Feilsøkingsnivå for publisering av DHT-nøkler/verdier." +msgstr "" -#, fuzzy msgid "Defines which DHT messages should be traced." -msgstr "Velg hvilke utvekslinger av HTTP-hoder for opplasting som skal spores." +msgstr "" -#, fuzzy msgid "Enable bandwidth limitation for outgoing DHT traffic." -msgstr "Bruk begrensning av båndbredde for utgående HTTP-trafikk." +msgstr "" msgid "" "Bandwidth limit for outgoing DHT traffic in bytes/sec. It is always pooled " @@ -3049,34 +4223,26 @@ "enabled, so that UDP queues can flush more quickly." msgstr "" -#, fuzzy msgid "Maximum size of the DHT message queue (in bytes)." msgstr "" -"Høyeste størrelse på søkesvarmeldinger vi videresender til andre (i byte)." -#, fuzzy msgid "Debug level for bandwidth scheduler." -msgstr "Feilsøkingsnivå for grensesnittet." +msgstr "" -#, fuzzy msgid "Debug level for the DHT stable node recorder." -msgstr "Feilsøkingsnivå for køen for oppslagskøen av DHT-brukere." +msgstr "" -#, fuzzy msgid "Debug level for the file (re)loading, on change." -msgstr "Feilsøkingsnivå for fildelingskode." +msgstr "" -#, fuzzy msgid "Debug level for the file moving, accross filesystems." -msgstr "Feilsøkingsnivå for fildelingskode." +msgstr "" -#, fuzzy msgid "Debug level for query hit message generation." -msgstr "Feilsøkingsnivå for meldingsdirigering." +msgstr "" -#, fuzzy msgid "Debug level for version management." -msgstr "Feilsøkingsnivå for behandling av nedlastingsmaske." +msgstr "" msgid "Minimum CPU frequency, in Hz." msgstr "" @@ -3084,9 +4250,8 @@ msgid "Maximum CPU frequency, in Hz." msgstr "" -#, fuzzy msgid "DHT bootstrap status." -msgstr "_HTTP-trafikkstatistikk" +msgstr "" msgid "" "The DHT running mode. An active node will be able to store values and is a " @@ -3101,39 +4266,32 @@ msgid "Current DHT running mode." msgstr "" -#, fuzzy msgid "Debug level for the one-time memory allocator." -msgstr "Feilsøkingsnivå for grensesnittet." +msgstr "" -#, fuzzy msgid "Debug level for the host cache." -msgstr "Feilsøkingsnivå for grensesnittet." +msgstr "" msgid "Random bits." msgstr "" -#, fuzzy msgid "Average servent downtime." -msgstr "Gjennomsnittlig tjenent-oppetid." +msgstr "" msgid "Time when last shutdown occurred." msgstr "" -#, fuzzy msgid "Debug level for alive pings." -msgstr "Feilsøkingsnivå for filinformasjon." +msgstr "" -#, fuzzy msgid "Debug level for the versatile XML layer." -msgstr "Feilsøkingsnivå for UDP-trafikklaget." +msgstr "" -#, fuzzy msgid "Debug level for the UPnP layer." -msgstr "Feilsøkingsnivå for UDP-trafikklaget." +msgstr "" -#, fuzzy msgid "Debug level for the SOAP layer." -msgstr "Feilsøkingsnivå for UDP-trafikklaget." +msgstr "" msgid "Defines SOAP exchanges tracing type." msgstr "" @@ -3166,9 +4324,8 @@ msgid "Whether gtk-gnutella can install port mappings, if needed." msgstr "" -#, fuzzy msgid "Debug level for the NAT-PMP layer." -msgstr "Feilsøkingsnivå for UDP-trafikklaget." +msgstr "" msgid "" "Whether NAT-PMP (NAT Port Mapping Protocol) should be enabled. Support for " @@ -3185,48 +4342,37 @@ "mappings, if required." msgstr "" -#, fuzzy msgid "Debug level for the TX (transmit) network layer." -msgstr "Feilsøkingsnivå for UDP-trafikklaget." +msgstr "" -#, fuzzy msgid "Debug level for the RX (receive) network layer." -msgstr "Feilsøkingsnivå for UDP-trafikklaget." +msgstr "" -#, fuzzy msgid "Debug level for the I/O input event layer." -msgstr "Feilsøkingsnivå for UDP-trafikklaget." +msgstr "" -#, fuzzy msgid "Debug level for the background task scheduler." -msgstr "Feilsøkingsnivå for grensesnittet." +msgstr "" -#, fuzzy msgid "Whether gtk-gnutella was able to configure port mappings." -msgstr "Hvorvidt gtk-gnutella tror det er koblet til Internett." +msgstr "" -#, fuzzy msgid "Whether gtk-gnutella disabled HTTP bandwidth stealing." -msgstr "Hvorvidt gtk-gnutella tror det er koblet til Internett." +msgstr "" -#, fuzzy msgid "Whether gtk-gnutella ignores HTTP stolen bandwidth." -msgstr "Hvorvidt gtk-gnutella tror det er koblet til Internett." +msgstr "" msgid "Whether gtk-gnutella enforces uniform HTTP outgoing bandwidth." msgstr "" -#, fuzzy msgid "" "Whether gtk-gnutella should use HTTP request pipelining when possible, in " "order to decrease downloading latency." msgstr "" -"Hvorvidt gtk-gnutella skal reklamere for tjeneren din sitt vertsnavn til " -"nedlastere og i spørringstreff." -#, fuzzy msgid "Maximum chunk size when swarming with HTTP pipelining." -msgstr "Høyeste bitstørrelse for sverming." +msgstr "" msgid "" "Whether the Gnutella UDP Extension for Scalable Searches (GUESS) should be " @@ -3248,25 +4394,20 @@ "Searches)." msgstr "" -#, fuzzy msgid "Maximum number of IPv4 hosts in the regular GUESS cache." -msgstr "Høyeste antall maskiner i den normale nodeoversikten." +msgstr "" -#, fuzzy msgid "Current number of IPv4 hosts in the regular GUESS cache." -msgstr "Gjeldende antall verter i normalt nodeminne." +msgstr "" -#, fuzzy msgid "Maximum number of IPv4 hosts in the introduction GUESS cache." -msgstr "Høyeste antall brukere i G2-nodeminnet." +msgstr "" -#, fuzzy msgid "Current number of IPv4 hosts in the introduction GUESS cache." -msgstr "Gjeldende antall verter i ultranodeminne." +msgstr "" -#, fuzzy msgid "Debug level for the DB disk/RAM storage layer." -msgstr "Feilsøkingsnivå for UDP-trafikklaget." +msgstr "" msgid "" "The current Session ID. This is a unique ID generated each time gtk-" @@ -3294,13 +4435,11 @@ "overall" msgstr "" -#, fuzzy msgid "Debug level for the matching code." -msgstr "Feilsøkingsnivå for bannlysingskode." +msgstr "" -#, fuzzy msgid "Debug level for the time synchronization code." -msgstr "Feilsøkingsnivå for fildelingskode." +msgstr "" msgid "" "Whether queries can request partial results hits, i.e. files which are " @@ -3313,9 +4452,8 @@ "are returned." msgstr "" -#, fuzzy msgid "Whether what's-new? queries should be answered to." -msgstr "Hvorvidt antall sende spørringer skal vises." +msgstr "" msgid "" "When set, gtk-gnutella will automatically stop opened searches from which " @@ -3323,163 +4461,240 @@ "configured expiration time." msgstr "" -#, fuzzy msgid "Maximum number of results to show in a What's New? request." msgstr "" -"Høyeste antall resultater å vise i en «browse_host» (bla i vert)-forespørsel." -#, fuzzy msgid "Maximum number of results to show in a passive search request." msgstr "" -"Høyeste antall resultater å vise i en «browse_host» (bla i vert)-forespørsel." -#, fuzzy msgid "Whether to log duplicate Gnutella messages from same node." -msgstr "Feilsøkingsnivå for Gnutella-meldinger." +msgstr "" -#, fuzzy msgid "Whether to log duplicate Gnutella messages with a higher TTL." -msgstr "Feilsøkingsnivå for Gnutella-meldinger." +msgstr "" -#, fuzzy msgid "Whether to log duplicate Gnutella messages (not from same node)." -msgstr "Feilsøkingsnivå for Gnutella-meldinger." +msgstr "" -#, fuzzy msgid "Whether to log new Gnutella messages, never seen before." -msgstr "Feilsøkingsnivå for Gnutella-meldinger." +msgstr "" -#, fuzzy msgid "Whether to log Gnutella routing decisions." -msgstr "Feilsøkingsnivå for Gnutella-meldinger." +msgstr "" -#, fuzzy msgid "Whether to log bad Gnutella messages, corrupted or unexpected." -msgstr "Feilsøkingsnivå for Gnutella-meldinger." +msgstr "" msgid "Whether to log conditions triggering query hit spam flagging." msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the ultra node cache." -msgstr "Høyeste antall maskiner i ultranodelisten." +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in ultra node caches." -msgstr "Gjeldende antall verter i ultranodeminne." +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in the regular GUESS cache." -msgstr "Gjeldende antall verter i normalt nodeminne." +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in the introduction GUESS cache." -msgstr "Gjeldende antall verter i ultranodeminne." +msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the regular GUESS cache." -msgstr "Høyeste antall maskiner i den normale nodeoversikten." +msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the introduction GUESS cache." -msgstr "Høyeste antall brukere i G2-nodeminnet." +msgstr "" -#, fuzzy msgid "Debug level for the malloc() replacement allocator." -msgstr "Feilsøkingsnivå for grensesnittet." +msgstr "" -#, fuzzy msgid "Debug level for bad query hit messages." -msgstr "Feilsøkingsnivå for meldingsdirigering." +msgstr "" -#, fuzzy msgid "Debug level for GUID management." -msgstr "Feilsøkingsnivå for behandling av nedlastingsmaske." +msgstr "" -msgid "disable" -msgstr "slå av" +msgid "Debug level for the TX (transmit) deflating network layer." +msgstr "" -msgid "by words" -msgstr "etter ord" +msgid "Comma-separated list of TX debugging hosts (IP addresses only)" +msgstr "" -msgid "by whole query" -msgstr "etter hel spørring" +msgid "" +"Comma-separated list of hosts for whom we want to dump RX traffic (IP " +"addresses only)" +msgstr "" -msgid "by router" -msgstr "etter dirigerer" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they emit " +"(IP addresses only)" +msgstr "" -msgid "TCP & UDP" -msgstr "TCP & UDP" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they " +"receive (IP addresses only)" +msgstr "" -msgid "TCP only" -msgstr "kun TCP" +msgid "" +"Allow GUESS to use some of the unused Gnutella outgoing bandwidth regardless " +"of the GUESS bandwidth hint. If FALSE, only the configured bandwidth hint " +"will be used. When running as a leaf this should be set to TRUE to make " +"GUESS queries run faster." +msgstr "" -msgid "UDP only" -msgstr "kun UDP" +msgid "Debug level for the UDP TX scheduler." +msgstr "" -msgid "Ping" -msgstr "Ping" +msgid "" +"Debugging flags for the semi-reliable UDP TX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: transmissions, 16: timeouts." +msgstr "" -msgid "Pong" -msgstr "Pong" +msgid "Comma-separated list of RX debugging hosts (IP addresses only)" +msgstr "" -msgid "Bye" -msgstr "Farvel" +msgid "" +"Debugging flags for the semi-reliable UDP RX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: receptions, 16: timeouts." +msgstr "" -msgid "QRP" -msgstr "QRP" +msgid "Whether to log sent semi-reliable UDP messages." +msgstr "" -msgid "HSEP" -msgstr "HSEP" +msgid "Whether to log received semi-reliable UDP messages." +msgstr "" -msgid "RUDP" -msgstr "RUDP" +msgid "Debug level for the secured OOB query hit claiming." +msgstr "" -msgid "Vendor spec." -msgstr "Program spes." +msgid "Whether to log sent vendor messages." +msgstr "" -msgid "Vendor std." -msgstr "Program std." +msgid "Whether to log received vendor messages." +msgstr "" -msgid "Push" -msgstr "Dytt" +msgid "Debugging flags for the DHT token cache (developers only)." +msgstr "" -msgid "Query" -msgstr "Spørring" +msgid "Whether to log weird DHT message headers when debugging." +msgstr "" -msgid "Query Hit" -msgstr "Spørringstreff" +msgid "Debug level for the DHT Remote Procedure Call (RPC) code." +msgstr "" -#, fuzzy -msgid "DHT Ping" -msgstr "Ping" +msgid "Whether to log UHC pings we receive." +msgstr "" -#, fuzzy -msgid "DHT Pong" -msgstr "Pong" +msgid "Whether to log UHC pings we emit." +msgstr "" -#, fuzzy -msgid "DHT Store" -msgstr "HTTP-trafikk" +msgid "Whether the program was properly shutdown." +msgstr "" -msgid "DHT Store Ack" +msgid "Whether the program restarted after a clean shutdown." msgstr "" -msgid "DHT Find Node" +msgid "Debug level for DHT key management." msgstr "" -msgid "DHT Found Node" +msgid "Debug level for DHT value management." msgstr "" -msgid "DHT Find Value" +msgid "ID of the current process." msgstr "" -#, fuzzy -msgid "DHT Value" -msgstr "Verdi" +msgid "Debug level for HTTP range parsing / handling." +msgstr "" -msgid "Total" -msgstr "Total" +msgid "" +"Lease time when installing port mappings via UPnP or NAT-PMP, in seconds. A " +"value of 0 requests permanent mappings." +msgstr "" + +msgid "Whether the program is auto-restarting at the user's request." +msgstr "" + +msgid "Debug level for time management." +msgstr "" + +msgid "Debug level for the tmalloc() thread-magazine object distributor." +msgstr "" + +msgid "Debug level for the event queue thread." +msgstr "" + +msgid "Maximum number of G2 hubs in the hub cache." +msgstr "" + +msgid "Current number of IPv4 hosts in the G2 hub caches." +msgstr "" + +msgid "Whether the G2 protocol should be enabled." +msgstr "" + +msgid "Number of G2 nodes currently connected." +msgstr "" + +msgid "Maximum amount of G2 hubs we should connect to as a leaf." +msgstr "" + +msgid "Whether to log bad G2 messages, corrupted or unexpected." +msgstr "" + +msgid "Whether to log dropped G2 messages" +msgstr "" + +msgid "Debug level for the G2 RPC layer." +msgstr "" + +msgid "Whether to log summary of received query hits" +msgstr "" + +msgid "Whether to log summary of each record in received query hits" +msgstr "" + +msgid "Number of G2 browsing requests received in this session." +msgstr "" + +msgid "Number of G2 browsing requests fully served in this session." +msgstr "" + +msgid "Whether to log G2 messages we're attempting to send" +msgstr "" + +msgid "" +"Timestamp at which the current session was started. This stamp remains " +"unchanged when gtk-gnutella restarts after a crash or an explicit restart " +"request." +msgstr "" + +msgid "No TCP listening socket bound to allow incoming connections." +msgstr "" + +msgid "disable" +msgstr "slå av" + +msgid "by words" +msgstr "etter ord" + +msgid "by whole query" +msgstr "etter hel spørring" + +msgid "by router" +msgstr "etter dirigerer" + +msgid "TCP & UDP" +msgstr "TCP & UDP" + +msgid "TCP only" +msgstr "kun TCP" + +msgid "UDP only" +msgstr "kun UDP" + +msgid "Query Hit" +msgstr "Spørringstreff" msgid "Icons" msgstr "Ikoner" @@ -3896,26 +5111,20 @@ "Viser et ikon i systemkurven hvis det er mulig (krever GTK+ 2.10 eller " "høyere)." -#, fuzzy msgid "Automatically hide DHT bandwidth display when DHT not enabled." msgstr "" -"Skjul bladbåndbreddevisningen automatisk når ikke i ultralikemannmodus." -#, fuzzy msgid "Display incoming DHT traffic bandwidth usage." -msgstr "Vis båndbreddebruk for innkommende HTTP-trafikk." +msgstr "" -#, fuzzy msgid "Display outgoing DHT traffic bandwidth usage." -msgstr "Vis båndbreddebruk for utgående HTTP-trafikk." +msgstr "" -#, fuzzy msgid "Display incoming DHT traffic bandwidth as an average." -msgstr "Vis gjennomsnittlig båndbreddebruk for innkommende HTTP-trafikk." +msgstr "" -#, fuzzy msgid "Display outgoing DHT traffic bandwidth as an average." -msgstr "Vis gjennomsnittlig båndbreddebruk for utgående HTTP-trafikk." +msgstr "" msgid "" "Remote nodes supporting media type filtering will apply your query " @@ -3945,7 +5154,7 @@ msgstr "" msgid "" -"Discard search results whith an alien IP address, not matching the one from " +"Discard search results with an alien IP address, not matching the one from " "which the results come from." msgstr "" @@ -3954,6 +5163,17 @@ "be restarted when gtk-gnutella is launched." msgstr "" +msgid "Discard search results coming from servents with a banned GUID." +msgstr "" + +msgid "Whether a summary line with GUESS search stats should be displayed." +msgstr "" + +msgid "" +"Whether the GUESS summary line should show total statistics or ones " +"pertaining to the current search only." +msgstr "" + msgid "Anonymizing proxies" msgstr "Anonymiserende mellomtjenere" @@ -4041,6 +5261,9 @@ msgid "Benin" msgstr "Benin" +msgid "Saint Barthelemy" +msgstr "" + msgid "Bermuda" msgstr "Bermuda" @@ -4050,6 +5273,9 @@ msgid "Bolivia" msgstr "Bolivia" +msgid "Bonaire, Sint Eustatius and Saba" +msgstr "" + msgid "Brazil" msgstr "Brasil" @@ -4059,6 +5285,9 @@ msgid "Bhutan" msgstr "Bhutan" +msgid "Burma" +msgstr "" + msgid "Bouvet Island" msgstr "Bouvetøya" @@ -4119,6 +5348,9 @@ msgid "Cape Verde" msgstr "Kapp Verde" +msgid "Curacao" +msgstr "" + msgid "Christmas Island" msgstr "Christmasøyen" @@ -4344,9 +5576,8 @@ msgid "Lebanon" msgstr "Libanon" -#, fuzzy msgid "Saint Lucia" -msgstr "St. Lucia" +msgstr "" msgid "Liechtenstein" msgstr "Liechtenstein" @@ -4384,9 +5615,8 @@ msgid "Montenegro" msgstr "Montenegro" -#, fuzzy msgid "Saint Martin" -msgstr "San Marino" +msgstr "" msgid "Madagascar" msgstr "Madagaskar" @@ -4586,12 +5816,18 @@ msgid "Suriname" msgstr "Surinam" +msgid "South Sudan" +msgstr "" + msgid "Sao Tome and Principe" msgstr "São Tomé og Príncipe" msgid "El Salvador" msgstr "El Salvador" +msgid "Sint Maarten" +msgstr "" + msgid "Syrian Arab Republic" msgstr "Syria" @@ -4748,10 +5984,8 @@ msgid "locale_get_language|en" msgstr "nb" -#, fuzzy msgid "unofficial build, accessing files from" msgstr "" -"Dette er en uoffisielt bygget versjon som bruker filer i denne katalogen:" msgid "URL missing" msgstr "Manglende URL" @@ -4797,37 +6031,39 @@ msgid "Interactive mode turned off." msgstr "Interaktiv modus slått av" -#, fuzzy +#, c-format +msgid "Unknown operation \"show %s\"" +msgstr "" + +#, c-format +msgid "Unknown operation \"%s\"" +msgstr "" + msgid "Cannot determine current working directory" -msgstr "Klarte ikke finne hjemmekatalogen din." +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Unknown logfile name \"%s\"" -msgstr "Ukjent verdi" +msgstr "" -#, fuzzy msgid "Unable to reopen" -msgstr "Klarte ikke sende GIV" +msgstr "" #, c-format msgid "Could not rename logfile as \"%s\": %m" msgstr "" -#, fuzzy, c-format -msgid "Unknown operation \"%s\"" -msgstr "Ukjent operasjon" - -#, fuzzy, c-format -msgid "Unknown operation \"show %s\"" -msgstr "Ukjent operasjon" - -#, fuzzy, c-format +#, c-format msgid "Unknown operation \"stats %s\"" -msgstr "Ukjent operasjon" +msgstr "" + +#, c-format +msgid "Unknown operation \"check %s\"" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Unknown operation \"usage %s\"" -msgstr "Ukjent operasjon" +msgstr "" msgid "Invalid IP/Port" msgstr "Ugyldig IP/port" @@ -4850,9 +6086,9 @@ msgid "Property missing" msgstr "Manglende verdi" -#, fuzzy, c-format +#, c-format msgid "Unknown property \"%s\"" -msgstr "Ukjent verdi" +msgstr "" msgid "Value: " msgstr "Verdi: " @@ -4866,6 +6102,9 @@ msgid "Good bye" msgstr "Farvel" +msgid "Invalid command syntax" +msgstr "Ugyldig kommandoform" + msgid "Query string missing" msgstr "Manglende spørringsstreng" @@ -4884,6 +6123,9 @@ msgid "Value missing" msgstr "Manglende verdi" +msgid "Property cannot be changed" +msgstr "" + #, c-format msgid "Previous value was %s" msgstr "" @@ -4904,64 +6146,23 @@ msgid "unterminated single-quoted string" msgstr "" -msgid "Invalid command syntax" -msgstr "Ugyldig kommandoform" - msgid "too many arguments in command" msgstr "" +#, c-format +msgid "un-parseable argument #%u in command" +msgstr "" + msgid "Malformed command" msgstr "Feilformet kommando" -#, fuzzy, c-format +#, c-format msgid "Unknown command: \"%s\"" -msgstr "Ukjent kommando" +msgstr "" msgid "Help: " msgstr "Hjelp: " -msgid "Bitzi|Unknown" -msgstr "Ukjent" - -msgid "Bitzi|Unrated" -msgstr "Urangert" - -msgid "Bitzi|Bitzi lookup failure" -msgstr "Feil ved Bitzi-oppslag" - -msgid "Bitzi|Filesize mismatch" -msgstr "Filstørrelsen stemmer ikke" - -msgid "Bitzi|Dangerous/Misleading" -msgstr "Farlig/Villedende" - -msgid "Bitzi|Incomplete/Damaged" -msgstr "Uferdig/Skadet" - -msgid "Bitzi|Substandard" -msgstr "Understandard" - -msgid "Bitzi|Overrated" -msgstr "Overrangert" - -msgid "Bitzi|Normal" -msgstr "Normal" - -msgid "Bitzi|Underrated" -msgstr "Underrangert" - -msgid "Bitzi|Complete" -msgstr "Fullført" - -msgid "Bitzi|Recommended" -msgstr "Anbefalt" - -msgid "Bitzi|Best Version" -msgstr "Beste versjon" - -msgid "No other data" -msgstr "Ikke andre data" - msgid "Filename" msgstr "Filnavn" @@ -4987,11 +6188,17 @@ msgid "Tigertree" msgstr "Tigertre" -msgid "External metadata" -msgstr "Extern metadata" +msgid "Rescheduled for" +msgstr "" + +msgid "Restartable since" +msgstr "" + +msgid "rescheduled for" +msgstr "" -msgid "Bitzi URL" -msgstr "Bitzi-URL" +msgid "restartable since" +msgstr "" #, c-format msgid " (slot %u" @@ -5035,9 +6242,8 @@ msgid "Reading headers" msgstr "Leser hoder" -#, fuzzy msgid "UDP push sent" -msgstr "Dytt sendt" +msgstr "" msgid "Searching for new push-proxies" msgstr "Søker etter nye push-mellomtjenere" @@ -5064,20 +6270,18 @@ msgid "Chunk done" msgstr "Bit ferdig" -#, fuzzy msgid "Waiting for TTH checking..." -msgstr "Venter på SHA1-kontrollering . . ." +msgstr "" msgid "Waiting for SHA1 checking..." msgstr "Venter på SHA1-kontrollering . . ." -#, fuzzy, c-format +#, c-format msgid "Computing %s (%.02f%%)" -msgstr "Kalkulerer SHA! (%.02f%%)" +msgstr "" -#, fuzzy msgid "TTH OK" -msgstr "TTH" +msgstr "" msgid "SHA-1 OK" msgstr "SHA-1 OK" @@ -5105,31 +6309,23 @@ msgid "(stalled)" msgstr "(stanset)" -#, fuzzy msgid "Receiving data" -msgstr "Mottar hoder" +msgstr "" msgid "ignoring" msgstr "Ignorerer" -#, fuzzy msgid "selected next" -msgstr "Valgte verdi:" +msgstr "" -#, fuzzy msgid "requesting next" -msgstr "Forespørsel sendt" +msgstr "" -#, fuzzy msgid "requested next" -msgstr "Forespørsel sendt" +msgstr "" -#, fuzzy msgid "Awaiting data" -msgstr "Venter" - -msgid "Unknown error" -msgstr "Ukjent feil" +msgstr "" #, c-format msgid "Retry in %us" @@ -5388,666 +6584,6 @@ msgid "RETURN" msgstr "RETUR" -msgid "Query hit" -msgstr "Spørringstreff" - -msgid "DHT (truncated)" -msgstr "" - -msgid "Routing errors" -msgstr "Dirigeringsfeil" - -#, fuzzy -msgid "Routing table chunks" -msgstr "DHT rutingstabellbøtter" - -msgid "Routing table message capacity" -msgstr "" - -#, fuzzy -msgid "Routing table message count" -msgstr "DHT rutingstabellens oppstoppede noder" - -msgid "Duplicates with higher TTL" -msgstr "Duplikater med høyere TTL" - -msgid "SPAM SHA1 database hits" -msgstr "" - -#, fuzzy -msgid "SPAM filename and size hits" -msgstr "Hvis filnavnet slutter med «%s» %s" - -msgid "SPAM fake hits" -msgstr "" - -msgid "SPAM duplicate hits" -msgstr "" - -msgid "SPAM dynamically caught hostile IP addresses" -msgstr "" - -msgid "SPAM dynamically caught hostile IP held" -msgstr "" - -msgid "SPAM spotted spamming IP addresses held" -msgstr "" - -msgid "Searches to local DB" -msgstr "Søk i lokal database" - -msgid "Hits on local DB" -msgstr "Treff i lokal database" - -#, fuzzy -msgid "Hits on local partial files" -msgstr "Treff i lokal database" - -msgid "Hits on \"what's new?\" queries" -msgstr "" - -msgid "Query hits received for local queries" -msgstr "Spørringstreff mottatt for lokale spørringer" - -msgid "Query hits received for OOB-proxied queries" -msgstr "Spørringstreff mottatt fra OOB-mellomtjente spørringer" - -msgid "Queries requesting OOB hit delivery" -msgstr "Spørringer som ber om OOB-treffleveranse" - -msgid "Stripped OOB flag on queries" -msgstr "Fjernet OOB-flagg på spørringer" - -msgid "Duplicate OOB-proxied queries" -msgstr "Dupliser OOB-mellomtjente spørringer" - -msgid "OOB hits received for OOB-proxied queries" -msgstr "OOB-treff mottatt for OOB-mellomtjente spørringer" - -msgid "OOB hits bearing alien IP address" -msgstr "OOB-treff som bærer fremmed IP-adresse" - -msgid "OOB hits ignored due to identified spamming address" -msgstr "" - -msgid "Unclaimed locally-generated OOB hits" -msgstr "Ukrevde lokallagde OOB-treff" - -msgid "Partially claimed locally-generated OOB hits" -msgstr "Delvis krevde lokallagde OOB-treff" - -msgid "Spurious OOB hit claiming received" -msgstr "Mottok flask OOB-treff" - -msgid "Unrequested OOB hits received" -msgstr "Ikke forespurte OOB-treff mottatt" - -msgid "Received query hits for untracked queries" -msgstr "" - -msgid "Tracked query MUIDs" -msgstr "" - -msgid "Compacted queries" -msgstr "Sammenpakkede spørringer" - -msgid "Bytes saved by compacting" -msgstr "Byte spart med sammenpakking" - -msgid "UTF8 queries" -msgstr "UTF-8-spørringer" - -msgid "SHA1 queries" -msgstr "SHA1-spørringer" - -#, fuzzy -msgid "\"What's New?\" queries" -msgstr "Lagde spørringer" - -#, fuzzy -msgid "GUESS queries" -msgstr "UTF-8-spørringer" - -#, fuzzy -msgid "GUESS queries (0.2)" -msgstr "UTF-8-spørringer" - -#, fuzzy -msgid "GUESS cached query keys held" -msgstr "Lagrede DHT-nøkler" - -#, fuzzy -msgid "GUESS cached 0.2 hosts held" -msgstr "Lagrede DHT-nøkler" - -#, fuzzy -msgid "GUESS locally generated queries" -msgstr "Lokallagde dynamiske spøringer" - -msgid "GUESS currently running queries" -msgstr "" - -#, fuzzy -msgid "GUESS hits received for locally generated queries" -msgstr "Spørringstreff mottatt for lokale spørringer" - -msgid "GUESS hosts queried" -msgstr "" - -msgid "GUESS hosts sending back an acknowledgment" -msgstr "" - -msgid "Broadcasted push messages" -msgstr "Kringkastede dyttemeldinger" - -msgid "Push-proxy UDP relayed messages" -msgstr "UDP-relésendte push-mellomtjenermeldinger" - -msgid "Push-proxy TCP relayed messages" -msgstr "TCP-relésendte push-mellomtjenermeldinger" - -msgid "Push-proxy broadcasted messages" -msgstr "Kringkastede push-mellomtjenermeldinger" - -msgid "Push-proxy found un-proxied local route" -msgstr "Push-mellomtjener fant lokal rute uten mellomtjener" - -msgid "Push-proxy lookup failures" -msgstr "Feilede push-mellomtjeneroppslag" - -msgid "Push relayed via local route" -msgstr "Push ble relésendte via en lokal rute" - -msgid "Push relayed via routing table" -msgstr "Push relésendte via rutingstabell" - -msgid "Locally generated dynamic queries" -msgstr "Lokallagde dynamiske spøringer" - -msgid "Leaf-generated dynamic queries" -msgstr "Bladlagde dynamiske spørringer" - -msgid "OOB-proxied leaf queries" -msgstr "OOB-mellomtjente bladspørringer" - -msgid "Fully completed dynamic queries" -msgstr "Fullt utførte dynamiske spørringer" - -msgid "Partially completed dynamic queries" -msgstr "Delvis fullførte dynamiske spørringer" - -msgid "Dynamic queries ended with no results" -msgstr "Dynamiske spørringer avsluttet uten resultater" - -msgid "Fully completed dynamic queries getting late results" -msgstr "Fullt utførte dynamiske spørringer som får seine resultater" - -msgid "Dynamic queries with partial late results" -msgstr "Dynamiske spørringer med delvis seine resultater" - -msgid "Dynamic queries completed by late results" -msgstr "Dynamiske spørringer fullført av seine resultater" - -msgid "Queries seen from GTKG" -msgstr "Spørringer sett fra gtk-gnutella" - -msgid "Queries seen from GTKG that were re-queries" -msgstr "Gjentatte spørringer sett fra gtk-gnutella" - -msgid "Queries advertising support of GGEP \"H\"" -msgstr "Spørringer som viser støtte for GGEP «H»" - -msgid "GIV callbacks received" -msgstr "Mottatte GIV-tilbakekall" - -msgid "GIV discarded due to no suitable download" -msgstr "GIV ble oversett fordi nedlastingen ikke passet" - -msgid "QUEUE callbacks received" -msgstr "Mottok KØ-tilbakekall" - -msgid "QUEUE discarded due to no suitable download" -msgstr "QUEUE forkastet grunnet upassende nedlasting" - -msgid "UDP messages with bogus source IP" -msgstr "UDP-meldinger med svindelkilde-IP" - -msgid "Alien UDP messages (non-Gnutella)" -msgstr "Fremmede UDP-meldinger (ikke Gnutella)" - -msgid "Unprocessed UDP Gnutella messages" -msgstr "Ubehandlede UDP Gnutella-meldinger" - -msgid "Compressed UDP messages enqueued" -msgstr "Komprimerte UDP-meldinger lagt i køen" - -msgid "Compressed UDP messages received" -msgstr "Komprimerte UDP-meldinger mottatt" - -msgid "Uncompressed UDP messages due to no gain" -msgstr "Ukomprimerte UDP-meldinger fordi det ikke var noe å tjene" - -msgid "Consolidated servers (after GUID and IP address linking)" -msgstr "Sammenkjørte tjenere (etter kobling av GUID og IP-adresse)" - -msgid "Duplicate downloads found during server consolidation" -msgstr "Fant dupliserte nedlastinger under tjenersammenkjøring" - -msgid "Discovered server GUIDs" -msgstr "Oppdagede tjener-GUID'er" - -msgid "Changed server GUIDs" -msgstr "Endrede tjener-GUID'er" - -#, fuzzy -msgid "Detected GUID collisions" -msgstr "DHT-oppdagede KUID-kollisjoner" - -msgid "Detected collisions with our own GUID" -msgstr "Oppdaget kollisjoner med vår egen GUID" - -msgid "GUID dynamically banned" -msgstr "" - -msgid "Firewalled node info for known hosts received in upload requests" -msgstr "" -"Info om noder med brannmur for kjente adresser mottatt i " -"opplastingsforespørsler" - -msgid "Revitalized PUSH routes" -msgstr "" - -msgid "Collected new PUSH proxies from other query hits" -msgstr "" - -msgid "Attempted download resource switching on completion" -msgstr "Prøvde bytting av nedlastingsressurser ved fullføring" - -msgid "Attempted download resource switching after error" -msgstr "Prøvde bytting av nedlastingsressurser etter en feil" - -msgid "Successful download resource switching (all kind)" -msgstr "Vellykkede bytter av nedlastingsressurser (alle typer)" - -msgid "Successful download resource switching between plain files" -msgstr "Vellykkede bytter av nedlastingsressurser mellom enkle filer" - -msgid "Successful download resource switching after error" -msgstr "Vellykkede bytter av nedlastingsressurser etter feil" - -msgid "Actively queued after resource switching attempt" -msgstr "Aktivt i kø etter forsøk på bytte av nedlastingsressurser" - -msgid "Sunk HTTP reply data on error codes" -msgstr "Sunket HTTP-svardata ved feilkoder" - -msgid "Ignored downloaded data" -msgstr "Ignorert nedlastet data" - -msgid "Ignoring requested after data mismatch" -msgstr "Ignorerer forespurte data etter feile verdier" - -msgid "Ignoring requested to preserve connection" -msgstr "Forespørsel om ignorering for å beholde forbindelsen" - -msgid "Ignoring requested due to aggressive swarming" -msgstr "Ignoerering forespurt etter aggressiv sverming" - -msgid "Ignoring refused (data too large or server too slow)" -msgstr "Ignorering nektet (for mye data eller for treig tjener)" - -msgid "Client resource switching (all detected)" -msgstr "Klient-ressursbytte (alle oppdagede)" - -msgid "Client resource switching between plain files" -msgstr "Klient-ressursbytting mellom enkle filer" - -msgid "Client follow-up request after HTTP error was returned" -msgstr "Forespørsel om klient-oppfølging etter mottatt HTTP-feil" - -msgid "PARQ client resource switching in slots (SHA-1 based)" -msgstr "Bytte av PARQ-klientressurser i plasser (SHA-1-basert)" - -msgid "PARQ client retry-after violation" -msgstr "Nytt PARQ-klientforsøk etter brudd" - -msgid "PARQ client kicked out after too many retry-after violations" -msgstr "" -"PARQ-klient ble sparket ut etter for mange brudd på «prøv på nytt etter»-" -"funksjonen" - -msgid "PARQ upload slot limit overrides" -msgstr "Overstyring av grenser for PARQ-opplastingsplasser" - -msgid "PARQ quick upload slots granted" -msgstr "Raske PARQ-opplastingsplasser ble innvilget" - -msgid "PARQ QUEUE sending attempts" -msgstr "PARQ QUEUE-sendingsforsøk" - -msgid "PARQ QUEUE messages sent" -msgstr "Sendte PARQ QUEUE-meldinger" - -msgid "PARQ QUEUE follow-up requests received" -msgstr "Mottatte PARQ QUEUE oppfølgingsforespørsler" - -msgid "Launched SHA-1 file verifications" -msgstr "" - -msgid "Launched TTH file verifications" -msgstr "" - -#, fuzzy -msgid "Bitzi tickets held" -msgstr "Ingen Bitzi-billettforespørsler ennå." - -msgid "Re-seeding of orphan downloads through query hits" -msgstr "Gjenoppta kildeløse nedlastinger via søketreff" - -#, fuzzy -msgid "Re-seeding of orphan downloads through upload requests" -msgstr "Gjenoppta kildeløse nedlastinger via søketreff" - -msgid "DHT estimated amount of nodes" -msgstr "DHT beregnet mengde noder" - -#, fuzzy -msgid "DHT k-ball theoretical frontier (bits)" -msgstr "DHT k-ball fjerneste grense (biter)" - -msgid "DHT k-ball furthest frontier (bits)" -msgstr "DHT k-ball fjerneste grense (biter)" - -msgid "DHT k-ball closeest frontier (bits)" -msgstr "DHT k-ball nærmeste grense (biter)" - -msgid "DHT routing table buckets" -msgstr "DHT rutingstabellbøtter" - -msgid "DHT routing table leaves" -msgstr "DHT rutingstabell-blad" - -msgid "DHT routing table maximum depth" -msgstr "DHT rutingstabellens største dybde" - -msgid "DHT routing table good nodes" -msgstr "DHT rutingstabellens gode noder" - -msgid "DHT routing table stale nodes" -msgstr "DHT rutingstabellens oppstoppede noder" - -msgid "DHT routing table pending nodes" -msgstr "DHT rutingstabellens ventende noder" - -msgid "DHT routing table evicted nodes" -msgstr "DHT rutingstabellens utviste noder" - -msgid "DHT routing table evicted firewalled nodes" -msgstr "DHT rutingstabellens utviste noder bak brannmur" - -#, fuzzy -msgid "DHT routing table evicted nodes due to quota" -msgstr "DHT rutingstabellens utviste noder" - -msgid "DHT routing table promoted pending nodes" -msgstr "DHT rutingstabellens forfremmede ventende noder" - -#, fuzzy -msgid "DHT routing table pinged promoted nodes" -msgstr "DHT rutingstabellens gode noder" - -#, fuzzy -msgid "DHT routing table rejected node due to bucket network quota" -msgstr "DHT rutingstabellens utviste noder" - -#, fuzzy -msgid "DHT routing table rejected node due to global network quota" -msgstr "DHT rutingstabellens utviste noder" - -msgid "DHT completed bucket refreshes" -msgstr "DHT fullførte oppdateringer av bøtter" - -#, fuzzy -msgid "DHT forced bucket refreshes" -msgstr "DHT fullførte oppdateringer av bøtter" - -#, fuzzy -msgid "DHT forced bucket merges" -msgstr "DHT fullførte oppdateringer av bøtter" - -msgid "DHT denied non-splitable bucket refresh" -msgstr "DHT nektet oppdatering av bøtte som ikke kunne splittes" - -msgid "DHT initiated bucket alive checks" -msgstr "DHT startede kontroller om bøtter er aktive" - -msgid "DHT alive pings sent to good nodes" -msgstr "DHT status-pinger sendt til gode noder" - -msgid "DHT alive pings sent to stale nodes" -msgstr "" - -#, fuzzy -msgid "DHT alive pings sent to shutdowning nodes" -msgstr "DHT status-pinger sendt til gode noder" - -#, fuzzy -msgid "DHT alive pings avoided" -msgstr "DHT status-pinger sendt til gode noder" - -#, fuzzy -msgid "DHT alive pings skipped" -msgstr "DHT status-pinger sendt til gode noder" - -#, fuzzy -msgid "DHT revitalized stale nodes on RPC reply" -msgstr "DHT-oppdagede KUID-kollisjoner" - -msgid "DHT value store rejected on IP/network quota grounds" -msgstr "" - -msgid "DHT value store rejected on creator validation grounds" -msgstr "" - -msgid "DHT nodes rejected during lookup based on network quota" -msgstr "" - -msgid "DHT nodes rejected during lookup based on suspicious proximity" -msgstr "" - -msgid "DHT nodes rejected during lookup based on frequency divergence" -msgstr "" - -msgid "DHT keys held" -msgstr "Holdte DHT-nøkler" - -msgid "DHT cached keys held" -msgstr "Lagrede DHT-nøkler" - -msgid "DHT values held" -msgstr "Holdte DHT-verdier" - -#, fuzzy -msgid "DHT cached KUID targets held" -msgstr "Lagrede DHT-nøkler" - -#, fuzzy -msgid "DHT cached closest root nodes" -msgstr "DHT beregnet mengde noder" - -msgid "DHT cached roots exact hits" -msgstr "" - -msgid "DHT cached roots approximate hits" -msgstr "" - -#, fuzzy -msgid "DHT cached roots misses" -msgstr "Lagrede DHT-nøkler" - -msgid "DHT cached roots lookups within k-ball" -msgstr "" - -msgid "DHT cached roots contact address refreshed" -msgstr "" - -#, fuzzy -msgid "DHT cached security tokens held" -msgstr "Lagrede DHT-nøkler" - -#, fuzzy -msgid "DHT cached security tokens hits" -msgstr "DHT: Ugyldig sikkerhetstegn" - -#, fuzzy -msgid "DHT stable node information held" -msgstr "Maskininformasjon" - -msgid "DHT local hits on value lookups" -msgstr "Lokale treff for oppslag av DHT-verdier" - -#, fuzzy -msgid "DHT local hits returning values from cached keys" -msgstr "Lokale treff for oppslag av DHT-verdier" - -#, fuzzy -msgid "DHT returned expanded values" -msgstr "Duplisering av DHT holdte verdier" - -msgid "DHT returned values as secondary keys" -msgstr "" - -#, fuzzy -msgid "DHT claimed values via secondary keys" -msgstr "Tidsavbrudd (i sekunder)" - -msgid "DHT returned cached expanded values" -msgstr "" - -msgid "DHT returned cached values as secondary-keys" -msgstr "" - -#, fuzzy -msgid "DHT claimed cached values via secondary keys" -msgstr "Tidsavbrudd (i sekunder)" - -msgid "DHT successfully received value publications" -msgstr "" - -msgid "DHT successfully received value removals" -msgstr "" - -msgid "DHT replication of stale value avoided" -msgstr "DHT-duplisering av utgått verdi unngått" - -msgid "DHT replication of held values" -msgstr "Duplisering av DHT holdte verdier" - -msgid "DHT republishing of held values" -msgstr "Republisering av DHT holdte verdier" - -msgid "DHT secondary-key value fetch issued" -msgstr "Sendte forespørsler for sekundære DHT-nøkkelverdier" - -msgid "DHT duplicate values returned in lookups" -msgstr "Dupliserte DHT-verdier returnert i oppslag" - -msgid "DHT detected KUID collisions" -msgstr "DHT-oppdagede KUID-kollisjoner" - -msgid "DHT detected collisions with our own KUID" -msgstr "DHT oppdaget kollisjoner med vår lokale KUID" - -#, fuzzy -msgid "DHT detected KUID mismatches on RPC reply" -msgstr "DHT-oppdagede KUID-kollisjoner" - -msgid "DHT caching attempts" -msgstr "" - -msgid "DHT caching ended successfully" -msgstr "" - -msgid "DHT caching partially completed" -msgstr "" - -msgid "DHT key-offloading checks after discovering new closest node" -msgstr "" - -msgid "DHT keys selected for offloading" -msgstr "" - -msgid "DHT key-offloading attempts" -msgstr "" - -msgid "DHT key-offloading ended successfully" -msgstr "" - -msgid "DHT key-offloading partially completed" -msgstr "" - -msgid "DHT values successfully offloaded" -msgstr "" - -#, fuzzy -msgid "DHT publishing attempts" -msgstr "Republisering av DHT holdte verdier" - -msgid "DHT publishing ended successfully (all roots)" -msgstr "" - -msgid "DHT publishing partially completed (root subset only)" -msgstr "" - -#, fuzzy -msgid "DHT publishing ending with proper value presence" -msgstr "Republisering av DHT holdte verdier" - -msgid "DHT value republishing occurring too late (after expiry)" -msgstr "" - -#, fuzzy -msgid "DHT publishing to self" -msgstr "Republisering av DHT holdte verdier" - -msgid "DHT background publishing completion attempts" -msgstr "" - -msgid "DHT background publishing completion showing improvements" -msgstr "" - -msgid "DHT background publishing completion successful (all roots)" -msgstr "" - -#, fuzzy -msgid "DHT SHA1 data type collisions" -msgstr "DHT-oppdagede KUID-kollisjoner" - -msgid "DHT lookup path passively protected against attack" -msgstr "" - -msgid "DHT lookup path actively protected against attack" -msgstr "" - -msgid "DHT alt-loc lookups issued" -msgstr "Sendte DHT alt loc-oppslag" - -msgid "DHT push-proxy lookups issued" -msgstr "Sendte DHT push-mellomtjener-oppslag" - -msgid "DHT successful alt-loc lookups" -msgstr "Vellykkede DHT alt loc-oppslag" - -msgid "DHT successful push-proxy lookups" -msgstr "Vellykkede DHT-oppslag i push-mellomtjenere" - -#, fuzzy -msgid "DHT successful node push-entry lookups" -msgstr "Vellykkede DHT-oppslag i push-mellomtjenere" - -msgid "DHT re-seeding of orphan downloads" -msgstr "Gjenopta nedlastinger uten kilder ved hjelp av DHT" - msgid "node" msgid_plural "nodes" msgstr0 "node" @@ -6236,9 +6772,8 @@ msgid "Avg. uptime of this servent:" msgstr "Denne tjenentens gjennomsnittlige oppetid:" -#, fuzzy msgid "Avg. downtime of this servent:" -msgstr "Denne tjenentens gjennomsnittlige oppetid:" +msgstr "" msgid "Bad hosts" msgstr "Dårlige verter" @@ -6249,9 +6784,8 @@ msgid "Bandwidth limits for HTTP traffic" msgstr "Båndbreddebegrensninger for HTTP-trafikk" -#, fuzzy msgid "Bandwidth limits for the Distributed Hash Table" -msgstr "Feilsøkingsnivå for distribuert kontrollnøkkeltabell (DHT)-koden" +msgstr "" msgid "Bandwidth targets for node lookups" msgstr "" @@ -6268,12 +6802,6 @@ msgid "Bind to this address" msgstr "Bind til denne adressen" -msgid "Bitzi Metadata" -msgstr "Bitzi-metadata" - -msgid "Bitzi metadata" -msgstr "Bitzi-metadata" - msgid "Browse Host" msgstr "Vis delte filer" @@ -6447,13 +6975,11 @@ msgid "Currently used" msgstr "I bruk" -#, fuzzy msgid "DHT traffic stats" -msgstr "_HTTP-trafikkstatistikk" +msgstr "" -#, fuzzy msgid "DHT traffic" -msgstr "HTTP-trafikk" +msgstr "" msgid "Debugging" msgstr "Feilsøking" @@ -6539,9 +7065,8 @@ msgid "Enable \"_Browse Host\" feature" msgstr "Slå på «_Bla i vert»-funksjonen" -#, fuzzy msgid "Enable _DHT" -msgstr "Slå på _UDP" +msgstr "" msgid "Enable _UDP" msgstr "Slå på _UDP" @@ -6655,9 +7180,8 @@ msgid "GUID:" msgstr "GUID:" -#, fuzzy msgid "KUID:" -msgstr "GUID:" +msgstr "" msgid "Gen. queued" msgstr "Gen. lagt i kø" @@ -6677,9 +7201,8 @@ msgid "Generation:" msgstr "Laging:" -#, fuzzy msgid "Global DHT outgoing traffic" -msgstr "_Utgående trafikk" +msgstr "" msgid "Gnutella TTL settings" msgstr "GnutellaNet TTL-innstillinger" @@ -6896,13 +7419,11 @@ msgid "Max. number of browse host results" msgstr "Høyeste antall bla i vert-resultater" -#, fuzzy msgid "Max. number of passive results" -msgstr "Høyeste a_ntall resultater" +msgstr "" -#, fuzzy msgid "Max. number of What's New? results" -msgstr "Høyeste a_ntall resultater" +msgstr "" msgid "Max. simultaneous downloads per file" msgstr "Høyeste antall samtidige nedlastinger per fil" @@ -7042,9 +7563,8 @@ msgid "Outgoing traffic to lea_ves" msgstr "Utgående trafikk til _blader" -#, fuzzy msgid "Output bandwidth average" -msgstr "Begrensning på total utbåndbredde:" +msgstr "" msgid "PARQ development:" msgstr "PARQ-utvikling:" @@ -7393,13 +7913,11 @@ msgstr "" "Viser ekstra informasjon og innstillinger for _erfarne og mesterbrukere" -#, fuzzy msgid "Show inbound DHT traffic" -msgstr "Vis _innkommende HTTP-trafikk" +msgstr "" -#, fuzzy msgid "Show outbound DHT traffic" -msgstr "Vis _utgående HTTP-trafikk" +msgstr "" msgid "Show pr_otocol:" msgstr "Vis pr_otokoll:" @@ -7844,9 +8362,8 @@ msgid "and lasted" msgstr "og varte" -#, fuzzy msgid "auto-hide DHT traffic stats" -msgstr "Skjul bl_adstatistikk automatisk" +msgstr "" msgid "bytes" msgstr "byte" @@ -7955,13 +8472,11 @@ msgid "uploads" msgstr "opplastinger" -#, fuzzy msgid "Available HTTP input bandwidth" -msgstr "Tilgjengelig båndbredde" +msgstr "" -#, fuzzy msgid "Available HTTP output bandwidth" -msgstr "Tilgjengelig båndbredde" +msgstr "" msgid "DHT up, passive mode." msgstr "" @@ -7975,21 +8490,17 @@ msgid "DHT looking up own KUID." msgstr "" -#, fuzzy msgid "DHT seeded." -msgstr "TX-fart" +msgstr "" -#, fuzzy msgid "DHT inactive." -msgstr "%u aktiv" +msgstr "" -#, fuzzy msgid "Disabled stealing of outgoing HTTP bandwidth." -msgstr "Vis båndbreddebruk for utgående HTTP-trafikk." +msgstr "" -#, fuzzy -msgid "Splitting ougoing HTTP bandwidth evenly." -msgstr "Vis gjennomsnittlig båndbreddebruk for utgående HTTP-trafikk." +msgid "Splitting outgoing HTTP bandwidth evenly." +msgstr "" msgid "Capping HTTP outgoing bandwidth." msgstr "" @@ -7997,27 +8508,26 @@ msgid "Port mapping possible through UPnP or NAT-PMP." msgstr "" -msgid "Port mapping configured through UPnP or NAT-PMP." +msgid "Port mapping configured through NAT-PMP." +msgstr "" + +msgid "Port mapping configured through UPnP." msgstr "" -#, fuzzy msgid "Enable UPnP" -msgstr "Slå på _UDP" +msgstr "" -#, fuzzy msgid "Enable NAT-PMP" -msgstr "Slå på _UDP" +msgstr "" msgid "Enable HTTP request pipelining" msgstr "" -#, fuzzy msgid "Pipelining max chunk size" -msgstr "Minste bitstørrelse" +msgstr "" -#, fuzzy -msgid "Enable upload of patial files deemed rare" -msgstr "Slå på opplasting av _delvis nedlastede filer" +msgid "Enable upload of partial files deemed rare" +msgstr "" msgid "Enable GUESS (additional querying)" msgstr "" @@ -8025,17 +8535,14 @@ msgid "Issue GUESS queries as well" msgstr "" -#, fuzzy msgid "Bandwidth limits for GUESS queries" -msgstr "Fartsgrenser for Gnutella-trafikk" +msgstr "" -#, fuzzy msgid "Output bandwidth hint" -msgstr "Begrensning på total utbåndbredde:" +msgstr "" -#, fuzzy msgid "Download queue is frozen." -msgstr "Nedlastingskøen er frosset" +msgstr "" msgid "Allow TTH discovery" msgstr "" @@ -8046,37 +8553,29 @@ msgid "Answer to queries for partial files" msgstr "" -#, fuzzy msgid "Answer to what's-new? queries" -msgstr "Lagde spørringer" +msgstr "" -#, fuzzy msgid "Search Media Type" -msgstr "Søkeuttrykk" +msgstr "" -#, fuzzy msgid "Audio" -msgstr "<Lyd>" +msgstr "" -#, fuzzy msgid "Video" -msgstr "<Video>" +msgstr "" -#, fuzzy msgid "Document" -msgstr "Antall" +msgstr "" -#, fuzzy msgid "Image" -msgstr "<Bilde>" +msgstr "" -#, fuzzy msgid "Archive" -msgstr "<Arkiv>" +msgstr "" -#, fuzzy msgid "Search Configuration" -msgstr "Søkeovervåker" +msgstr "" msgid "Stop search when last download completes" msgstr "" @@ -8087,23 +8586,23 @@ msgid "What's new?" msgstr "" -#, fuzzy msgid "Unspecified" -msgstr "udefinert" +msgstr "" msgid "Search filters to apply locally on newly created searches." msgstr "" -#, fuzzy msgid "Discard results bearing an alien IP address" -msgstr "OOB-treff som bærer fremmed IP-adresse" +msgstr "" + +msgid "Discard results bearing a banned GUID" +msgstr "" msgid "Restart session-only searches with pending downloads" msgstr "" -#, fuzzy msgid "Configured DHT mode" -msgstr "Sett opp likemannmodus" +msgstr "" msgid "Store DHT keys/values in memory" msgstr "" @@ -8114,8 +8613,23 @@ msgid "Relayed queries remembered" msgstr "" -msgid "Not in database" -msgstr "Ikke i databasen" +msgid "Allow unused Gnutella outgoing bandwidth to supersede hint" +msgstr "" + +msgid "Display GUESS statistics" +msgstr "" + +msgid "Mapping lease time" +msgstr "" + +msgid "G2 hubs" +msgstr "" + +msgid "Enable the G2 network" +msgstr "" + +msgid " G2, " +msgstr "" msgid "owned" msgstr "eid" @@ -8138,9 +8652,6 @@ msgstr0 "Overså %u resultat" msgstr1 "Overså %u resultater" -msgid "Query queued..." -msgstr "Spørring lagt i kø . . ." - #, c-format msgid "%u term counted" msgid_plural "%u terms counted" @@ -8182,6 +8693,9 @@ msgid "_Auto-hide leaf traffic stats" msgstr "Skjul bl_adstatistikk automatisk" +msgid "Glossary" +msgstr "" + msgid "_Search" msgstr "_Søk" @@ -8191,13 +8705,8 @@ msgid "Do not specify any media type (will match any kind of files remotely)" msgstr "" -#, fuzzy msgid "CPU overloaded" -msgstr "Lastet opp" - -#, fuzzy -msgid "Splitting outgoing HTTP bandwidth evenly." -msgstr "Vis gjennomsnittlig båndbreddebruk for utgående HTTP-trafikk." +msgstr "" msgid "Connect to" msgstr "Koble til" @@ -8242,12 +8751,18 @@ msgid "Served " msgstr "Tjent " -msgid "BH HTML served" -msgstr "BH HTML betjent" +msgid "G2 served" +msgstr "" msgid " / " msgstr " av " +msgid "G2" +msgstr "" + +msgid "BH HTML served" +msgstr "BH HTML betjent" + msgid "BH HTML" msgstr "BH HTML" @@ -8327,40 +8842,29 @@ msgid "unit_of_time|s" msgstr "s" -#, fuzzy msgid "Gnutella Distributed Hash Table" -msgstr "Feilsøkingsnivå for distribuert kontrollnøkkeltabell (DHT)-koden" +msgstr "" msgid "Maximum percentage of connection slots a vendor can occupy." msgstr "Høyeste prosentdel av tilkoblingsplasser ett program kan bruke." -#, fuzzy -msgid "Global DHT ougoing traffic" -msgstr "_Utgående trafikk" - msgid "attempts" msgstr "forsøk" -#, fuzzy msgid "Pipelining maximum chunk size" -msgstr "Minste bitstørrelse" +msgstr "" msgid "_Remove directory" msgstr "Fje_rn katalog" -#, fuzzy -msgid "Enable upload of partial files deemed rare" -msgstr "Slå på opplasting av _delvis nedlastede filer" - msgid "Minimum chunk _size" msgstr "Minste bit_størrelse" msgid "Show a status _icon" msgstr "Vis et status_ikon" -#, fuzzy msgid "Avg. downtime of this servent" -msgstr "Denne tjenentens gjennomsnittlige oppetid:" +msgstr "" msgid "Remove completed downloads from list" msgstr "Fjern ferdige nedlastinger fra listen" @@ -8399,6 +8903,9 @@ msgid "Reverse lookup in progress..." msgstr "Holder på med omvendt oppslag . . ." +msgid "UDP (semi-reliable)" +msgstr "" + msgid "Size:" msgstr "Størrelse:" @@ -8411,28 +8918,29 @@ msgid "Valid regular" msgstr "Gyldig vanlig" -#, fuzzy msgid "Fresh IPv4 ultra" -msgstr "Fersk ultra" +msgstr "" -#, fuzzy msgid "Valid IPv4 ultra" -msgstr "Gyldig ultra" +msgstr "" -#, fuzzy msgid "Fresh IPv6 ultra" -msgstr "Fersk ultra" +msgstr "" -#, fuzzy msgid "Valid IPv6 ultra" -msgstr "Gyldig ultra" +msgstr "" + +msgid "Fresh G2 hub" +msgstr "" + +msgid "Valid G2 hub" +msgstr "" msgid "Unstable" msgstr "Ustabil" -#, fuzzy msgid "Alien" -msgstr "Aliaser" +msgstr "" msgid "GUESS (IPv4 running)" msgstr "" @@ -8469,6 +8977,11 @@ "laste dokumentet. Les <a href=\"http://gtk-gnutella.sourceforge.net/?page=faq" "\">spørsmålene på Internett</a> i stedet.</p></body></html>" +msgid "" +"<html><head><title>Glossary</title></head><body><p>The glossary document " +"could not be loaded.</p></body></html>" +msgstr "" + #, c-format msgid "%lu file shared (%s)" msgid_plural "%lu files shared (%s)" @@ -8500,6 +9013,9 @@ msgid "UNKNOWN STATUS" msgstr "UKJENT STATUS" +msgid "g2" +msgstr "" + msgid "busy" msgstr "opptatt" @@ -8515,13 +9031,11 @@ msgid "bogus" msgstr "svindel" -#, fuzzy msgid "alien" -msgstr "Aliaser" +msgstr "" -#, fuzzy msgid "media" -msgstr "Armenia" +msgstr "" msgid "No search" msgstr "Intet søk" @@ -8544,12 +9058,18 @@ msgstr "Utløper med denne økten" #, c-format +msgid " %u download" +msgid_plural " %u downloads" +msgstr0 "" +msgstr1 "" + +#, c-format msgid "" "%u %s (%u skipped, %u ignored, %u hidden, %u auto-d/l, %u %s) Hits: %u (%u " "TCP, %u UDP)" msgstr "" -"%u %s (%u hoppet over, %u ignorert, %u skjult, %u lastet ned automatisk, %u %" -"s) Treff: %u %u TCP, %u UDP)" +"%u %s (%u hoppet over, %u ignorert, %u skjult, %u lastet ned automatisk, %u " +"%s) Treff: %u %u TCP, %u UDP)" msgid "item" msgid_plural "items" @@ -8561,6 +9081,63 @@ msgstr0 "duplikat" msgstr1 "duplikater" +msgid "No GUESS queries run yet" +msgstr "" + +#, c-format +msgid " previous took %s querying %zu %s with %zu %s kept" +msgstr "" + +msgid "host" +msgid_plural "hosts" +msgstr0 "" +msgstr1 "" + +msgid "hit" +msgid_plural "hits" +msgstr0 "" +msgstr1 "" + +#, c-format +msgid "GUESS %s Total: %zu %s (%s %s, %s kept, %s queries, %s keys)%s" +msgstr "" + +msgid "idle" +msgstr "" + +msgid "query" +msgid_plural "queries" +msgstr0 "" +msgstr1 "" + +#, c-format +msgid "" +"GUESS %s %s (%zu %s, %zu kept, %s queries, %s keys) Pool: %zu %s, (%zu+" +"%zu)/%zu queried, %zu %s (%.2f%%), %zu reached, %zu pending, %zu %s%s%s" +msgstr "" + +msgid "loose" +msgstr "" + +msgid "bounded" +msgstr "" + +msgid "ack" +msgid_plural "acks" +msgstr0 "" +msgstr1 "" + +msgid "hop" +msgid_plural "hops" +msgstr0 "" +msgstr1 "" + +msgid " (load pending)" +msgstr "" + +msgid " (end if starving)" +msgstr "" + msgid "Passive" msgstr "Passiv" @@ -8574,13 +9151,11 @@ "XML-formatet, og den gamle filen har fått navnet\n" "«%s»" -#, fuzzy, c-format +#, c-format msgid "" "could not rename %s as %s: %m\n" "The XML file will not be used unless this problem is resolved." msgstr "" -"Klarte ikke gi «%s» det nye navnet «%s»: %s\n" -"XML-filen brukes ikke med mindre dette problemet løses." msgid "<unparsed>" msgstr "<uspaltet>" @@ -8660,9 +9235,8 @@ msgid "No" msgstr "Nei" -#, fuzzy msgid "Tag" -msgstr "Mål" +msgstr "" msgid "Yes" msgstr "Ja" @@ -8673,16 +9247,24 @@ msgid "Source" msgstr "Kilde" -#, fuzzy msgid "Alien IP" -msgstr "Aliaser" +msgstr "" msgid "Alt-Locs" msgstr "Alt-låser" -#, fuzzy msgid "Partial" -msgstr "delvis" +msgstr "" + +#, c-format +msgid "%s %.2f%%" +msgstr "" + +msgid "Available" +msgstr "" + +msgid "Last modification" +msgstr "" msgid "Latinized" msgstr "Latinisert" @@ -8699,6 +9281,9 @@ msgid "Hostname" msgstr "Vertnavn" +msgid "banned" +msgstr "" + msgid "Servent ID" msgstr "Tjenent-ID:" @@ -8756,24 +9341,12 @@ msgid "The URN in the search text is invalid." msgstr "URN'en i søketeksten er ugyldig." -msgid "SHA-1 is unknown." -msgstr "SHA-1 er ukjent" - -msgid "No Bitzi ticket requested yet." -msgstr "Ingen Bitzi-billettforespørsler ennå." - -msgid "Not in Bitzi database." -msgstr "Ikke i Bitzi-databasen" - msgid "Encoding" msgstr "Koding" msgid "#" msgstr "#" -msgid "Metadata" -msgstr "Metadata" - msgid "Never" msgstr "Aldri" @@ -8810,6 +9383,12 @@ msgid "*** CPU OVERLOADED -- TRYING TO SAVE CYCLES ***" msgstr "*** PROSESSOREN ER OVERLASTET; PRØVER Å SPARE ***" +msgid "*** KERNEL BUFFER SHORTAGE -- LIMITING TCP CONNECTIONS ***" +msgstr "" + +msgid "*** NO LISTENING TCP SOCKET -- NO INBOUND CONNECTIONS ***" +msgstr "" + msgid "*** UPLOADS STALLING, BANDWIDTH SHORTAGE? ***" msgstr "*** OPPLASTINGER STOPPER; BÅNDBREDDEMANGEL? ***" @@ -8850,12 +9429,6 @@ msgstr "%u i kø" #, c-format -msgid "%u/%u connection" -msgid_plural "%u/%u connections" -msgstr0 "%u/%u forbindelse" -msgstr1 "%u/%u forbindelseer" - -#, c-format msgid "%u/%u upload" msgid_plural "%u/%u uploads" msgstr0 "%u/%u opplasting" @@ -8870,6 +9443,9 @@ msgid "Queue frozen" msgstr "Køen er frosset" +msgid "Internal" +msgstr "" + msgid "Select a property to see its description." msgstr "Velg en egenskap for å se beskrivelsen." @@ -8934,41 +9510,3 @@ msgid "Sent QUEUE, waiting for headers..." msgstr "Sendte KØ, venter på hoder . . ." - -#~ msgid "" -#~ "Maximum number of Query MUIDs to track. This allows mapping MUIDs of " -#~ "Query Hits to the original search term. In the worst case this causes " -#~ "about 300 bytes per Query of memory overhead." -#~ msgstr "" -#~ "Høyeste antall forespørsel-MUID'er som skal spores. Dette gjør det mulig " -#~ "å koble MUID'er fra søkeforespørsler til det opprinnelige søkeuttrykket. " -#~ "I verste tilfelle bruker dette 300 byte med minne per forespørsel." - -#, fuzzy -#~ msgid "Linux archives" -#~ msgstr "%u aktiv" - -#~ msgid "Index" -#~ msgstr "Indeks" - -#, fuzzy -#~ msgid "Seaerch Media Type" -#~ msgstr "Søkeuttrykk" - -#~ msgid "Can't reach host (Push or Direct)" -#~ msgstr "Klarte ikke nå maskinen (dytt eller direkte)" - -#~ msgid "Banned: %s" -#~ msgstr "Bannlyst: %s" - -#~ msgid "Banned for %s" -#~ msgstr "Bannlyst for %s" - -#~ msgid "The current Session ID." -#~ msgstr "Gjeldende økt-ID:" - -#~ msgid "ShareMonkey URL" -#~ msgstr "ShareMonkey-URL" - -#~ msgid "Connecting" -#~ msgstr "Kobler til"
View file
gtk-gnutella-0.98.2.tar.bz2/po/nl.po -> gtk-gnutella-1.1.9.tar.bz2/po/nl.po
Changed
@@ -1,32 +1,34 @@ -# $Id$ -# -# Dutch translations for gtk-gnutella package. -# Copyright (C) 2000-2001 Yann Grossel. -# Copyright (C) 2001-2010 Raphaël Manfredi. -# This file is distributed under the same license as the gtk-gnutella package. -# Jeroen Asselman <jeroen@asselman.com>, 2003-2005. +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Raphael Manfredi +# This file is distributed under the same license as the PACKAGE package. # +# Translators: +# Jeroen Asselman <jeroen@asselman.com>, 2013-2015 +# Jeroen Asselman <jeroen@asselman.com>, 2013 +# richard koppenaal <buildid@gmail.com>, 2015 msgid "" msgstr "" -"Project-Id-Version: gtk-gnutella 0.96.7u\n" +"Project-Id-Version: gtk-gnutella\n" "Report-Msgid-Bugs-To: gtk-gnutella-devel@lists.sf.net\n" -"POT-Creation-Date: 2011-11-22 18:27+0100\n" -"PO-Revision-Date: 2011-06-07 09:21+0100\n" -"Last-Translator: Jeroen Asselman <j.asselman@rubicongroup.biz>\n" -"Language-Team: Dutch <jeroen@asselman.com>\n" +"POT-Creation-Date: 2016-03-06 08:49+0100\n" +"PO-Revision-Date: 2016-02-15 08:28+0000\n" +"Last-Translator: Jeroen Asselman <jeroen@asselman.com>\n" +"Language-Team: Dutch (http://www.transifex.com/gtk-gnutella/gtk-gnutella/" +"language/nl/)\n" +"Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Poedit-Bookmarks: 1043,-1,-1,-1,-1,-1,-1,-1,-1,-1\n" -#, c-format -msgid "%s%s%s%s%s fps, %s kbps" -msgstr "%s%s%s%s%s fps, %s kbps" +msgid "Harmful version banned, upgrade required" +msgstr "Schadelijke versie, upgrade vereist" + +msgid "Connection refused" +msgstr "Verbinding geweigerd" -msgid "times|x" -msgstr "x" +msgid "Use an open Gnutella or G2 servent" +msgstr "Gebruik een open Gnutella of G2 servent " #, c-format msgid "Stopped, will retry with TLS (%s)" @@ -61,8 +63,8 @@ msgstr "Omshakelen (na fout) naar \"%s\"" #, c-format -msgid " at %s - rescheduled for %s%s #%u" -msgstr " op %s - opnieuw gepland voor %s%s #%u" +msgid " at %s" +msgstr "op %s" msgid "Suspended (SHA1 checking)" msgstr "Opgeschort (SHA1 verifieren)" @@ -86,6 +88,9 @@ msgid "Download queue is frozen" msgstr "Download wachtrij bevroren" +msgid "Network buffer shortage" +msgstr "Netwerk buffer tekort" + msgid "No download slot (start)" msgstr "Geen download slot (start)" @@ -95,6 +100,9 @@ msgid "Connection failed" msgstr "Verbinding mislukt" +msgid "SHA1 mismatch detected" +msgstr "SHA1 komt niet overeen" + msgid "Waiting for server PROX publishing" msgstr "Wacht op server voor PROX publicatie" @@ -258,6 +266,9 @@ msgid "No support for Content-Encoding (%s)" msgstr "Geen ondersteuning voor Content-Encoding (%s)" +msgid "Incomplete headers during TLS upgrade" +msgstr "" + msgid "Spammer detected" msgstr "Spammer gedetecteerd" @@ -316,6 +327,12 @@ msgid "No Content-Length header" msgstr "Geen Content-Length header" +msgid "Unexpected Content-Type" +msgstr "Onverwacht Content-Type" + +msgid "No Content-Type" +msgstr "Geen Content-Type" + msgid "Search already closed" msgstr "Zoek opdracht reeds gesloten" @@ -352,23 +369,30 @@ msgid "Malformed push reply" msgstr "Push reply misvormd" -msgid "SHA1 mismatch detected" -msgstr "SHA1 komt niet overeen" - msgid ", inbound" msgstr ", inkomend" msgid ", outbound" msgstr ", uitgaand" +msgid ", no-pipeline" +msgstr ", geen-pipeline" + msgid ", banning" msgstr ", wordt verbannen" msgid ", g2" -msgstr ", g2,." +msgstr ", g2" + +msgid ", fake-g2" +msgstr ", nep-g2" msgid ", vendor?" -msgstr ", fabrikant?" +msgstr ", vendor?" + +#, c-format +msgid "<Browse G2 Host %s>" +msgstr "<Blader G2 Host %s>" #, c-format msgid "<Browse Host %s>" @@ -396,6 +420,12 @@ msgid "Requeued due to timeout" msgstr "Opnieuw in de wacht omdat de tijd is verstreken" +msgid "Partial file removed" +msgstr "Gedeeltelijk bestand verwijderd" + +msgid "File info being reset" +msgstr "Bestandsinformatie wordt gereset" + #, c-format msgid "Downloading (TR: %s)" msgstr "Bezig met downloaden (Resterende tijd: %s)" @@ -464,151 +494,19 @@ msgstr0 "%u DHT lookup" msgstr1 "%u DHT lookups" -#, fuzzy, c-format +#, c-format msgid "Got %d host from %s" msgid_plural "Got %d hosts from %s" -msgstr0 "Ontving %d host van de UDP host cache %s" -msgstr1 "Ontving %d hosts van de UDP host cache %s" - -#, fuzzy, c-format -msgid "Bootstrapping from %s" -msgstr "DHT bootstrapping." - -msgid "Bad size" -msgstr "Verkeerde grootte" - -msgid "Too small" -msgstr "Te klein" - -msgid "Too large" -msgstr "Te groot" - -msgid "Way too large" -msgstr "Veelste groot" - -msgid "Unknown message type" -msgstr "Bericht type onbekend" - -msgid "Unexpected message" -msgstr "Bericht niet verwacht" - -msgid "Message sent with TTL = 0" -msgstr "Berricht verzonden met TTL = 1" - -msgid "Improper hops/ttl combination" -msgstr "Ongeldige hops/TTL combinatie" - -msgid "Max TTL exceeded" -msgstr "Over de Max TTL " - -msgid "Message throttle" -msgstr "Berichten smoren" - -msgid "Message matched limits" -msgstr "Bericht kwam overeen met limieten" - -msgid "Unusable Pong" -msgstr "\"Pong\" niet bruikbaar" - -msgid "Hard TTL limit reached" -msgstr "Harde TTL limit bereikt" - -msgid "Max hop count reached" -msgstr "Max hop teller bereikt" - -msgid "Route lost" -msgstr "Route verloren" - -msgid "No route" -msgstr "Geen route" - -msgid "Duplicate message" -msgstr "Dubbel bericht" - -msgid "Message to banned GUID" -msgstr "Bericht naar verbande GUID" - -#, fuzzy -msgid "Message from banned GUID" -msgstr "Bericht naar verbande GUID" - -msgid "Node shutting down" -msgstr "Node is aan het afsluiten" - -msgid "TX flow control" -msgstr "TX flow control" - -msgid "Query text had no trailing NUL" -msgstr "Query tekst bevatte geen afsluitende NUL" - -msgid "Query text too short" -msgstr "Query tekst te kort" - -msgid "Query had unnecessary overhead" -msgstr "Query had onnodige bagage" - -msgid "Query had bad URN" -msgstr "Query had onjuiste URN" - -msgid "Message with malformed SHA1" -msgstr "Bericht met ongeldige SHA1" - -msgid "Message with malformed UTF-8" -msgstr "Bericht met ongeldige UTF-8" - -msgid "Malformed Query Hit" -msgstr "Query Hit ongeldig" - -msgid "Bad return address" -msgstr "Fout antwoord adres." - -msgid "Hostile IP address" -msgstr "Vijandig IP-adres" - -msgid "Bogus result from Morpheus" -msgstr "Bogus resultaten van Morpheus" - -msgid "Spam" -msgstr "Spam" - -msgid "Evil filename" -msgstr "Slechte bestandsnaam" - -msgid "Improper media type" -msgstr "Ongeschikt media type" - -msgid "Payload inflating error" -msgstr "Payload inflating fout" - -msgid "Unknown header flags present" -msgstr "Onbekende header flags aanwezig" - -msgid "Own search results" -msgstr "Eigen zoekresultaten" - -msgid "Own queries" -msgstr "Eigen query's" +msgstr0 "%d host ontvangen van %s" +msgstr1 "%d hosts ontvangen van %s" -msgid "Ancient query format" -msgstr "Verouderd query formaat" - -msgid "Blank Servent ID" -msgstr "Leeg Servent ID" - -msgid "GUESS Query missing token" -msgstr "GUESS Query mist token" - -msgid "GUESS Invalid query token" -msgstr "GUESS ongeldige query token" - -msgid "DHT Invalid security token" -msgstr "DHT ongeldige security token" - -msgid "DHT Too many STORE requests" -msgstr "DHT te veel STORE verzoeken" +#, c-format +msgid "Connecting to web cache %s" +msgstr "Verbinden met webcache %s" -msgid "DHT Malformed message" -msgstr "DHT bericht misvormd" +#, c-format +msgid "Bootstrapping from %s" +msgstr "Bootstrapping vanaf %s" #, c-format msgid "Shutdown (%s)" @@ -620,27 +518,6 @@ msgstr0 "%d connectie pong ontvangen" msgstr1 "%d connectie pongs ontvangen" -msgid "Sent crawling info" -msgstr "Crawling informatie verstuurd" - -msgid "Cannot setup compressing TX stack" -msgstr "Kon TX compressie niet initialiseren." - -#, c-format -msgid "Got BYE %d %.*s" -msgstr "Ontving BYE %d %.*s" - -#, c-format -msgid "Weird HELLO %s" -msgstr "Vreemde HELLO %s" - -#, c-format -msgid "HELLO %s error %d (%s)" -msgstr "HELLO %s fout %d (%s)" - -msgid "Shielded node" -msgstr "Afgeschermde node" - msgid "Gnet connections disabled" msgstr "Gnet connecties uitgeschakeld" @@ -648,6 +525,10 @@ msgstr "Verbinding niet gecomprimeerd" #, c-format +msgid "Too many G2 hubs (%u max)" +msgstr "Teveel G2 hubs (max %u)" + +#, c-format msgid "Too many leaves (%d max)" msgstr "Teveel leaves (maximaal %d)" @@ -672,6 +553,9 @@ msgid "Not an ultra node" msgstr "Geen ultranode" +msgid "Unknown error" +msgstr "Onbekende error" + msgid "Unstable IP address" msgstr "Instabiel IP-adres" @@ -685,21 +569,50 @@ msgid "Not connecting: %s" msgstr "Niet verbinden met: %s" +msgid "Cannot setup compressing TX stack" +msgstr "Kon TX compressie niet initialiseren." + +msgid "Sent crawling info" +msgstr "Crawling informatie verstuurd" + +#, c-format +msgid "Got BYE %d %.*s" +msgstr "Ontving BYE %d %.*s" + +#, c-format +msgid "Weird HELLO %s" +msgstr "Vreemde HELLO %s" + +#, c-format +msgid "HELLO %s error %d (%s)" +msgstr "HELLO %s fout %d (%s)" + +msgid "Shielded node" +msgstr "Afgeschermde node" + msgid "Protocol not acceptable" msgstr "Protocol wordt niet ondersteund" +msgid "Conflict" +msgstr "" + +msgid "Upgrade Header Missing" +msgstr "" + msgid "Servent Shutdown" msgstr "Servent afgesloten" msgid "Not a network member" msgstr "Geen lid van het netwerk" +msgid "Need a G2 Hub" +msgstr "G2 Hub benodigd" + msgid "Too frequent crawling" msgstr "Te snel crawling" -#, fuzzy msgid "Already connected to this GUID" -msgstr "Reeds verbonden" +msgstr "Reeds verbonden met deze GUID" #, c-format msgid "Vendor would exceed %d%% of our slots" @@ -744,6 +657,12 @@ msgid "Pseudo UDP node" msgstr "Pseudo UDP node" +msgid "Pseudo semi-reliable UDP node" +msgstr "Semi-betrouwbare pseudo UDP node" + +msgid "Pseudo G2 UDP node" +msgstr "Pseudo G2 UDP node" + msgid "Pseudo DHT node" msgstr "Pseudo DHT node" @@ -789,6 +708,9 @@ msgid "DHT" msgstr "DHT" +msgid "G2 hub" +msgstr "G2 hub" + msgid "Unknown" msgstr "Onbekend" @@ -802,10 +724,12 @@ #, c-format msgid "Must wait %u more seconds before resending \"What's New\"" msgstr "" +"Moet nog %u seconden wachten voordat een \"Wat is er nieuw\" opnieuw kan " +"worden verzonden" -#, fuzzy, c-format +#, c-format msgid "mkdir(\"%s\") failed: %m" -msgstr "mkdir(\"%s\") mislukt: \"%s\"" +msgstr "mkdir(\"%s\") mislukt: %m" msgid "Can't find your home directory!" msgstr "Kan Thuis map niet vinden" @@ -821,8 +745,13 @@ msgid "creating directory \"%s\" for %s" msgstr "Directory \"%s\" voor %s wordt aangemaakt" -msgid "You seem to have left another gtk-gnutella running" -msgstr "Het ziet er naar uit dat je nog een andere gtk-gnutella hebt draaien" +#, c-format +msgid "Another gtk-gnutella supervisor is running as PID %lu" +msgstr "" + +#, c-format +msgid "Another gtk-gnutella is running as PID %lu" +msgstr "" msgid "Cannot proceed without valid configuration directory" msgstr "Kan niet doorgaan zonder geldige configuratie directorie" @@ -836,9 +765,6 @@ msgid "Failed to create local socket" msgstr "Aanmaken van lokale socket mislukt" -msgid "Failed to create listening sockets" -msgstr "Aanmaken van een luisterende sockets mislukt" - msgid "Can only run as a leaf when TCP-firewalled" msgstr "Als TCP-firewalled kan er alleen als leaf worden geopereerd" @@ -848,6 +774,12 @@ msgid "Got EOF" msgstr "Ontving EOF" +msgid "TLS handshake failed" +msgstr "TLS handshake mislukt" + +msgid "Connection locally failed" +msgstr "lokale verbinding mislukt" + msgid "Write failed (Input Exception)" msgstr "Schrijf fout (Invoer fout)" @@ -868,21 +800,111 @@ msgid "Connect back timeout" msgstr "Terug verbinden tijd verstreken" +msgid "Request timeout" +msgstr "Verzoek timeout" + msgid "Timeout waiting for follow-up" msgstr "Time-out tijdens het wachten op de volgende" msgid "Lifetime expired" msgstr "Levenstijd verstreken" +msgid "Unauthorized" +msgstr "Onbevoegd" + +#, c-format +msgid "Limiting connections from %s" +msgstr "Connecties naar %s worden gelimiteerd" + +msgid "No reason given" +msgstr "Geen reden opgegeven" + +msgid "Bad Request" +msgstr "Ongeldig verzoek" + +msgid "Header too large" +msgstr "Header te groot" + +msgid "Input buffer full" +msgstr "Invoer buffer vol" + +msgid "Extra data after HTTP header" +msgstr "Extra data achter HTTP-header" + msgid "Unable to send GIV" msgstr "Niet mogelijk om GIV te verzenden" +msgid "Not Found" +msgstr "Niet gevonden" + +msgid "File was modified" +msgstr "Bestand is gewijzigd" + +msgid "Moved Permanently" +msgstr "Permanent verplaatst" + +msgid "File index/name mismatch" +msgstr "Bestandsnaam/index komt niet overeen" + +msgid "URN Not Found (urn:sha1)" +msgstr "URN niet gevonden (urn:sha1)" + +msgid "SHA1 is being recomputed" +msgstr "SHA1 wordt opnieuw berekend" + +msgid "Library being rebuilt" +msgstr "Bibiliotheek wordt opnieuw opgebouwd" + +msgid "Malformed URN in /uri-res/N2R request" +msgstr "Ongeldige URN in /uri-res/N2R aanvraag" + +msgid "Malformed URN in /uri-res/N2X request" +msgstr "Ongeldige URN in /uri-res/N2X aanvraag" + +msgid "TTH is being computed" +msgstr "TTH wordt berekend" + msgid "<Browse Host Request>" msgstr "<Browse host verzoek>" +msgid "Browse Host Disabled" +msgstr "Host bladeren uitgeschakeld" + +#, c-format +msgid "Redirected to %s:%u" +msgstr "Doorgestuurd naar %s:%u" + +msgid "Not Modified" +msgstr "Niet gewijzigd" + msgid "Stalling upload replaced" msgstr "Hangende upload vervangen" +msgid "Already downloading this file" +msgstr "Bestand wordt reeds gedownload" + +msgid "Malformed Range request" +msgstr "Misvormd bereik verzoek" + +msgid "Requested range not satisfiable" +msgstr "Opgevraagd bereik niet vervulbaar" + +msgid "Requested range not available yet" +msgstr "Opgevraagd bereik nog niet beschikbaar" + +msgid "Queue full" +msgstr "Wachtrij vol" + +msgid "Another connection is still active" +msgstr "Een andere connectie is nog steeds actief" + +#, c-format +msgid "%s not honoured; removed from PARQ queue" +msgstr "%s niet gehonoreerd; verwijderd van PARQ queue" + +msgid "Minimum retry delay" +msgstr "Opnieuw proberen minimum vertraging" + #, c-format msgid "Queued (slot %d, ETA: %s)" msgstr "In de wacht (slot %d, geschatte resterende tijd: %s)" @@ -890,9 +912,12 @@ msgid "Cannot send whole HTTP status" msgstr "Kon niet de hele HTTP status versturen" +msgid "Not Acceptable" +msgstr "Onaccepteerbaar" + #, c-format -msgid "<Browse Host Request> %s%s%s" -msgstr "<Browse host verzoek> %s%s%s" +msgid "<Browse Host %sRequest> %s%s%s" +msgstr "<Browse Host %sVerzoek> %s%s%s" msgid "query hits" msgstr "query hits" @@ -906,6 +931,40 @@ msgid ", chunked" msgstr ", chunked" +msgid "THEX failure" +msgstr "THEX mislukt" + +msgid "EOF while sinking" +msgstr "" + +#, c-format +msgid "Read error while sinking: %m" +msgstr "" + +msgid "Content Too Large" +msgstr "" + +msgid "Unknown/Missing Protocol Tag" +msgstr "Onbekend/ontbrekende protocol tag" + +msgid "Missing Host Header" +msgstr "Ontbrekende Host Header" + +msgid "Not Implemented" +msgstr "Niet geïmplementeerd" + +msgid "Bad URI" +msgstr "Ongeldige URI" + +msgid "Bad Path" +msgstr "Ongeldig pad" + +msgid "No Content Allowed" +msgstr "Inhoud niet toegestaan" + +msgid "Sharing currently disabled" +msgstr "Delen is momenteel uitgeschakeld" + msgid "Write exception" msgstr "Schrijf exceptie" @@ -945,6 +1004,1206 @@ msgid " - Newer version available: from git %s" msgstr " - Nieuwere versie beschikbaar van git %s" +msgid "Routing errors" +msgstr "Errors dmv routeren" + +msgid "Routing table chunks" +msgstr "Route tabel fragmenten" + +msgid "Routing table message capacity" +msgstr "Route tabel bericht capaciteit" + +msgid "Routing table message count" +msgstr "Route table berichten aantal" + +msgid "Routing through transient node avoided" +msgstr "Routering via vluchtige node voorkomen" + +msgid "Duplicates with higher TTL" +msgstr "Duplicaten met een hogere TTL" + +msgid "SPAM SHA1 database hits" +msgstr "SPAM SHA1 database hits" + +msgid "SPAM filename and size hits" +msgstr "SPAM bestandsnaam en grootte overeenkomsten" + +msgid "SPAM fake hits" +msgstr "SPAM namaak hits" + +msgid "SPAM duplicate hits" +msgstr "SPAM dubbele hits" + +msgid "SPAM dynamically caught hostile IP addresses" +msgstr "SPAM dynamisch opgevangen vijandige IP-adressen" + +msgid "SPAM dynamically caught hostile IP held" +msgstr "SPAM dynamisch opgevangen vijandige IP-adressen vastgehouden" + +msgid "SPAM spotted spamming IP addresses held" +msgstr "SPAM opgemerkte spammende IP adressen in bezit" + +msgid "Searches to local DB" +msgstr "Zoek opdracht tegen lokale DB" + +msgid "Hits on local DB" +msgstr "Zoek resultaten tegen lokale DB" + +msgid "Hits on local partial files" +msgstr "Hits op lokale gedeeltelijke bestanden" + +msgid "Hits on \"what's new?\" queries" +msgstr "Hits voor \"Wat is er nieuw?\" query's" + +msgid "Query hits received for local queries" +msgstr "Query hits ontvangen voor lokale opdrachten" + +msgid "G2 searches to local DB" +msgstr "G2 opdrachten tegen lokale DB" + +msgid "G2 hits on local DB" +msgstr "G2 zoekresultaten tegen lokale DB" + +msgid "G2 hits on local partial files" +msgstr "G2 hits op lokale gedeeltelijke bestanden" + +msgid "Query hits received for OOB-proxied queries" +msgstr "Query hits ontvangen voor OOB geproxiede opdrachten" + +msgid "Queries requesting OOB hit delivery" +msgstr "Query hits die OOB bezorging verzoeken" + +msgid "Stripped OOB flag on queries" +msgstr "De OOB vlag verwijderd van query's" + +msgid "Ignored OOB queries due to unclaimed hits" +msgstr "Genegeerde OOB query's vanwege niet geclaimde treffers" + +msgid "Duplicate OOB-proxied queries" +msgstr "Dubbele OOB geproxyde query's" + +msgid "OOB hits received for OOB-proxied queries" +msgstr "OOB resultaat ontvangen voor OOB geproxyde query's" + +msgid "OOB hits bearing alien IP address" +msgstr "OOB resultaten welke een vreemd IP-adres dragen" + +msgid "OOB hits ignored due to identified spamming address" +msgstr "OOB hits genegeerd vanwege een geconstateerde spam-adres" + +msgid "OOB hits ignored due to unsecure promise from known secure host" +msgstr "" +"OOB treffer genegeerd vanwege onbeveiligde toezegging van bekende veilige " +"host" + +msgid "Unclaimed locally-generated OOB hits" +msgstr "Ongevraagde lokaal gegenereerde OOB resultaat" + +msgid "Partially claimed locally-generated OOB hits" +msgstr "Gedeeltelijke toegeeiste lokaal gegenereerde OOB resultaten" + +msgid "Spurious OOB hit claiming received" +msgstr "Vals OOB hit beweert te zijn ontvangen" + +msgid "Unrequested OOB hits received" +msgstr "Ongevraagde OOB overeenkomsten ontvangen" + +msgid "Received query hits for untracked queries" +msgstr "Ontvangen query hits voor niet getraceerd query's" + +msgid "Tracked query MUIDs" +msgstr "Getraceerde query MUID's" + +msgid "Compacted queries" +msgstr "Verkleinde zoekopdrachten" + +msgid "Bytes saved by compacting" +msgstr "Bytes bespaard door te verdichten" + +msgid "UTF8 queries" +msgstr "UTF8 zoekopdrachten" + +msgid "SHA1 queries" +msgstr "SHA1 zoekopdrachten" + +msgid "\"What's New?\" queries" +msgstr "\"Wat is er nieuw?\" query's" + +msgid "UTF8 G2 queries" +msgstr "UTF8 G2 query's" + +msgid "SHA1 G2 queries" +msgstr "SHA1 G2 query's" + +msgid "GUESS queries" +msgstr "GUESS query's" + +msgid "GUESS queries (0.2)" +msgstr "GUESS query's (0.2)" + +msgid "GUESS link cache size" +msgstr "GUESS verbinding cache grootte" + +msgid "GUESS cached query keys held" +msgstr "GUESS gecachte query sleutels in bezit" + +msgid "GUESS cached 0.2 hosts held" +msgstr "GUESS aantal gecachete 0.2 hosts" + +msgid "GUESS cached G2 hosts held" +msgstr "GUESS aantal gecachete G2 hosts" + +msgid "GUESS locally generated queries" +msgstr "GUESS lokaal gegenereerde query's" + +msgid "GUESS currently running queries" +msgstr "GUESS momenteel draaiende query's" + +msgid "GUESS hits received for locally generated queries" +msgstr "GUESS treffers ontvangen voor lokaal gegenereerde verzoeken" + +msgid "GUESS ultra nodes queried" +msgstr "GUESS ultranodes gequeryd" + +msgid "GUESS ultra nodes sending back an acknowledgment" +msgstr "GUESS ultranode welke een bevesting terugsturen" + +msgid "GUESS G2 nodes queried" +msgstr "GUESS G2 nodes gequeried" + +msgid "GUESS G2 nodes sending back an acknowledgment" +msgstr "GUESS g2 nodes welke een bevesting terugsturen" + +msgid "Throttled local push messages" +msgstr "Afgeknepen lokale \"push\" berichten" + +msgid "Throttled received push messages" +msgstr "Afgeknepen ontvangen \"push\" berichten" + +msgid "Broadcasted push messages" +msgstr "Broadcast \"push\" berichten" + +msgid "Push-proxy UDP relayed messages" +msgstr "Push-proxy doorgegeven berichten" + +msgid "Push-proxy TCP relayed messages" +msgstr "Push-proxy gerouteerde berichten" + +msgid "Push-proxy TCP for FW<->FW transfers" +msgstr "Push-proxy TCP voor FW<->FW overdracht" + +msgid "Push-proxy broadcasted messages" +msgstr "Push-proxy broadcast berichten" + +msgid "Push-proxy found un-proxied local route" +msgstr "Push-proxy vond een niet geproxyd lokale route." + +msgid "Push-proxy lookup failures" +msgstr "Push-proxy kon niet worden opgezocht" + +msgid "Push relayed via local route" +msgstr "Push wordt via lokale route doorgegeven" + +msgid "Push relayed via routing table" +msgstr "Door wordt via route tabel doorgegeven" + +msgid "Locally generated dynamic queries" +msgstr "Lokaal dynamisch gegenereerde opdrachten" + +msgid "Leaf-generated dynamic queries" +msgstr "Leaf dynamisch gegenereerde opdrachten" + +msgid "OOB-proxied leaf queries" +msgstr "OOB geproxiede leaf opdrachten" + +msgid "Fully completed dynamic queries" +msgstr "Volledig afgeronde dynamische opdrachten" + +msgid "Partially completed dynamic queries" +msgstr "Gedeeltelijk afgeronde dynamische opdrachten" + +msgid "Dynamic queries ended with no results" +msgstr "Dynamische opdracht beïndigd zonder resultaten" + +msgid "Fully completed dynamic queries getting late results" +msgstr "" +"Volledig afgeronde dynamische opdrachten die laatte resultaten ontvangen" + +msgid "Dynamic queries with partial late results" +msgstr "Dynamische opdrachten met gedeeltelijke verlate resultaten" + +msgid "Dynamic queries completed by late results" +msgstr "Dynamische opdrachten afgerond met verlate resultaten" + +msgid "Queries seen from GTKG" +msgstr "Opdrachten gezien vanuit GTKG" + +msgid "Queries seen from GTKG that were re-queries" +msgstr "Opdrachten gezien vanuit GTKG die opnieuw werden uitgevoerd" + +msgid "Queries advertising support of GGEP \"H\"" +msgstr "Opdrachten die ondersteuning voor GGEP \"H\" aangaven" + +msgid "Queries advertising support of semi-reliable UDP" +msgstr "Query's die ondersteuning voor semibetrouwbaar UDP adverteren" + +msgid "GIV callbacks received" +msgstr "GIV terug verbinden ontvangen" + +msgid "GIV discarded due to no suitable download" +msgstr "GIV afgedankt aangezien er geen geschikte download is" + +msgid "QUEUE callbacks received" +msgstr "QUEUE terug verbinden ontvangen" + +msgid "QUEUE discarded due to no suitable download" +msgstr "QUEUE afgedankt aangezien er geen geschikte download is" + +msgid "File descriptors banned running count" +msgstr "Aantal File descriptor geopend t.b.v. banning." + +msgid "UDP read-ahead datagram running count" +msgstr "UDP vooruit lezen datagram draaiend aantal" + +msgid "UDP read-ahead datagram running bytes" +msgstr "UDP vooruit lezen datagram draaiend bytes" + +msgid "UDP read-ahead datagram \"old\" processed" +msgstr "UDP vooruit lezen datagram \"oude\" verwerkte" + +msgid "UDP read-ahead datagram max count" +msgstr "UDP vooruit lezen datagram maximum aantal" + +msgid "UDP read-ahead datagram max bytes" +msgstr "UDP vooruit lezen datagram maximum bytes" + +msgid "UDP read-ahead datagram max delay" +msgstr "UDP vooruit lezen datagram maximum vertraging" + +msgid "UDP push messages received for FW<->FW connections" +msgstr "UDP push berichten ontvangen voor FW<->FW connecties" + +msgid "UDP push messages requesting FW<->FW connection with ourselves" +msgstr "UDP push berichten welke een FW<->FW connectie verzoeken met onszelf" + +msgid "UDP push messages patched for FW<->FW connections" +msgstr "UDP push berichten opgelapt voor FW<->FW connecties" + +msgid "UDP UHC pings received" +msgstr "UDP UHC pings ontvangen" + +msgid "UDP UHC pongs sent" +msgstr "UDP UHC pongs verzonden" + +msgid "UDP messages with bogus source IP" +msgstr "UDP berichten met ongeldig bron IP" + +msgid "UDP messages from shunned IP (discarded)" +msgstr "UDP berichten van een vermeden IP (genegeerd)" + +msgid "UDP truncated incoming messages" +msgstr "UDP afgeknotte inkomende berichten" + +msgid "Alien UDP messages (non-Gnutella)" +msgstr "Vreemde UDP berichten (niet-Gnutella)" + +msgid "Unprocessed UDP Gnutella messages" +msgstr "Niet verwerkte UDP Gnutella berichten" + +msgid "Compressed UDP messages enqueued" +msgstr "Gecomprimeerde UDP berichten in de wachtrij gezet" + +msgid "Compressed UDP messages received" +msgstr "Gecomprimeerde UDP berichten ontvangen" + +msgid "Candidates for UDP message compression" +msgstr "Kandidaten voor compressie van UDP berichten" + +msgid "Uncompressed UDP messages due to no gain" +msgstr "UDP bericht gedecomprimeerd aangezien dit geen winst opleverde" + +msgid "Ambiguous UDP messages received" +msgstr "Dubbelzinnige UDP berichten ontvangen" + +msgid "Ambiguous UDP messages inspected more deeply" +msgstr "Dubbelzinnige UDP berichten grondiger bekeken" + +msgid "Ambiguous UDP messages handled as semi-reliable UDP" +msgstr "Dubbelzinnige UDP berichten behandeld als semibetrouwbare UDP" + +msgid "Semi-reliable UDP total messages given for transmission" +msgstr "" +"Semibetrouwbare UDP totaal aantal berichten voor verzending overhandigt" + +msgid "Semi-reliable UDP total messages deflated" +msgstr "Semibetrouwbare UDP totaal aantal berichten deflated" + +msgid "Semi-reliable UDP total messages unsent" +msgstr "Semibetrouwbare UDP totaal aantal berichten niet verzonden" + +msgid "Semi-reliable UDP total messages dropped due to temporary ban" +msgstr "" +"Semibetrouwbare UDP totaal aantal berichten vanwege een tijdelijke ban " +"genegeerd genegeerd" + +msgid "Semi-reliable UDP total messages sent to known responsive hosts" +msgstr "" +"Semibetrouwbare UDP totaal aantal bericht verzonden naar responsive hosts" + +msgid "Semi-reliable UDP total messages partially sent due to clogging" +msgstr "" +"Semibetrouwbare UDP totaal aantal berichten vanwege verstopping maar " +"gedeeltelijk verzonden" + +msgid "Semi-reliable UDP reliable messages given for transmission" +msgstr "Semibetrouwbare UDP betrouwbare berichten overhandigd voor verzending" + +msgid "Semi-reliable UDP reliable messages correctly transmited" +msgstr "Semibetrouwbare UDP betrouwbare berichten correct verzonden" + +msgid "Semi-reliable UDP reliable messages not fully acknowledged" +msgstr "Semibetrouwbare UDP betrouwbare berichten nog niet volledig bevestigd" + +msgid "Semi-reliable UDP fragments sent" +msgstr "Semibetrouwbare UDP fragmenten verzonden" + +msgid "Semi-reliable UDP fragments resent" +msgstr "Semibetrouwbare UDP fragmenten opnieuw verzonden" + +msgid "Semi-reliable UDP fragment sendings avoided" +msgstr "Semibetrouwbare UDP fragmenten verzending voorkomen" + +msgid "Semi-reliable UDP fragments sent too many times" +msgstr "Semibetrouwbare UDP fragmenten te vaak verzonden" + +msgid "Semi-reliable UDP total acknowledgments received" +msgstr "Semibetrouwbare UDP totaal aantal bevestigingen ontvangen" + +msgid "Semi-reliable UDP cumulative acknowledgments received" +msgstr "Semibetrouwbare UDP cumulatieve bevestigingen ontvangen" + +msgid "Semi-reliable UDP extended acknowledgments received" +msgstr "Semibetrouwbare UDP uitgebreide bevestigingen ontvangen" + +msgid "Semi-reliable UDP spurious acknowledgments received" +msgstr "Semibetrouwbare UDP onechte bevestigingen ontvangen" + +msgid "Semi-reliable UDP invalid acknowledgments received" +msgstr "Semibetrouwbare UDP ongeldige bevestigingen ontvangen" + +msgid "Semi-reliable UDP acknowledgments re-queued for sending" +msgstr "Semibetrouwbare UDP bevestiging opnieuw gequeued voor verzending" + +msgid "Semi-reliable UDP plain acknowledgments dropped" +msgstr "Semibetrouwbare UDP reguliere bevestigingen genegeerd" + +msgid "Semi-reliable UDP enhanced acknowledgments dropped" +msgstr "Semibetrouwbare UDP uitgebreidere bevestigingen genegeerd" + +msgid "Semi-reliable UDP plain acknowledgments transmitted" +msgstr "Semibetrouwbare UDP reguliere bevestigingen verzonden" + +msgid "Semi-reliable UDP cumulative acknowledgments transmitted" +msgstr "Semibetrouwbare UDP totaal aantal bevestigingen verzonden" + +msgid "Semi-reliable UDP extended acknowledgments transmitted" +msgstr "Semibetrouwbare UDP uitgebreidere bevestigingen verzonden" + +msgid "Semi-reliable UDP EARs sent" +msgstr "Semibetrouwbare UDP EARs verzonden" + +msgid "Semi-reliable UDP too many EARs sent" +msgstr "Semibetrouwbare UDP teveel EARs verzonden" + +msgid "Semi-reliable UDP EAR negative acknowledgments received" +msgstr "Semibetrouwbare UDP EAR negatieve bevestigingen ontvangen" + +msgid "Semi-reliable UDP acknowledgments received after sending EARs" +msgstr "Semibetrouwbare UDP bevestigingen ontvangen na het versturen van EARs" + +msgid "Semi-reliable UDP fragments received" +msgstr "Semibetrouwbare UDP fragmenten ontvangen" + +msgid "Semi-reliable UDP duplicate fragments received" +msgstr "Semibetrouwbare UDP dubbele fragmenten ontvangen" + +msgid "Semi-reliable UDP unreliable fragments received" +msgstr "Semibetrouwbare UDP onbetrouwbare fragmenten ontvangen" + +msgid "Semi-reliable UDP dropped received fragments" +msgstr "Semibetrouwbare UDP ontvangen fragmenten gedropt" + +msgid "Semi-reliable UDP fragments received whilst lingering" +msgstr "Semibetrouwbare UDP fragment ontvangen tijdens treuzelen" + +msgid "Semi-reliable UDP messages expired before re-assembly" +msgstr "" +"Semibetrouwbare UDP berichten verlopen voordat ze opnieuw zijn opgebouwd" + +msgid "Semi-reliable UDP messages re-assembled completely" +msgstr "Semibetrouwbare UDP berichten compleet opnieuw opgebouwd" + +msgid "Semi-reliable UDP messages inflated successfully" +msgstr "Semibetrouwbare UDP berichten succesvol geinflate" + +msgid "Semi-reliable UDP messages inflated incorrectly" +msgstr "Semibetrouwbare UDP berichten niet succesvol geinflate" + +msgid "Semi-reliable UDP unreliable messages received" +msgstr "Semibetrouwbare UDP berichten onbetrouwbare berichten ontvangen" + +msgid "Semi-reliable UDP empty messages received" +msgstr "Semibetrouwbare UDP lege berichten ontvangen" + +msgid "Semi-reliable UDP total acknowledgments sent" +msgstr "Semibetrouwbare UDP totaal aantal bevestigingen verstuurd" + +msgid "Semi-reliable UDP cumulative acknowledgments sent" +msgstr "Semibetrouwbare UDP cumulatief aantal bevestigingen verstuurd" + +msgid "Semi-reliable UDP extended acknowledgments sent" +msgstr "Semibetrouwbare UDP uitgebreide bevestigingen verstuurd" + +msgid "Semi-reliable UDP avoided acknowledgment sendings" +msgstr "Semibetrouwbare UDP aantal te versturen bevestigingen voorkomen" + +msgid "Semi-reliable UDP EARs received" +msgstr "Semibetrouwbare UDP EARs ontvangen" + +msgid "Semi-reliable UDP EARs received for unknown message" +msgstr "Semibetrouwbare UDP EARs ontvangen voor onbekende berichten" + +msgid "Semi-reliable UDP EARs received whilst lingering" +msgstr "Semibetrouwbare UDP EARs ontvangen tijdens treuzelen" + +msgid "Semi-reliable UDP fragments from hostile IP addresses" +msgstr "Semibetrouwbare UDP fragmenten van vijandige IP adressen" + +msgid "UDP G2 hits rerouted to hub for delivery" +msgstr "UDP G2 treffers omgeleid naar hub voor aflevering" + +msgid "UDP G2 hits undelivered" +msgstr "UDP G2 treffers niet afgeleverd" + +msgid "Consolidated servers (after GUID and IP address linking)" +msgstr "Servers geconsolideerd (na het linken van GUID en IP adres)" + +msgid "Duplicate downloads found during server consolidation" +msgstr "Dubbele downloads gevonden tijdens het consolideren van server" + +msgid "Discovered server GUIDs" +msgstr "Server GUID's gevonden" + +msgid "Changed server GUIDs" +msgstr "Server GUID's veranderd" + +msgid "Detected GUID collisions" +msgstr "GUID collision gedetecteerd" + +msgid "Detected collisions with our own GUID" +msgstr "GUID botsing met onze eigen GUID gedetecteerd" + +msgid "GUID dynamically banned" +msgstr "GUID dynamisch verbannen" + +msgid "Firewalled node info for known hosts received in upload requests" +msgstr "Firewalled node info voor bekende host ontvangen in een upload verzoek" + +msgid "Revitalized PUSH routes" +msgstr "PUSH routes gerevitaliseerd" + +msgid "Collected new PUSH proxies from other query hits" +msgstr "Nieuwe PUSH proxy's verzameld van andere query hits" + +msgid "Attempted download resource switching on completion" +msgstr "Gepoogd om tijdens voltooiing de download resource over te schakelen" + +msgid "Attempted download resource switching after error" +msgstr "Gepoogd om na een fout van download resource over te schakelen" + +msgid "Successful download resource switching (all kind)" +msgstr "Succesvol van download resource overgeschakeld (alle types)" + +msgid "Successful download resource switching between plain files" +msgstr "Succesvol van download resource overgeschakeld tussen gewone bestanden" + +msgid "Successful download resource switching after error" +msgstr "Succesvol van download resource overgeschakeld na een fout" + +msgid "Actively queued after resource switching attempt" +msgstr "Na poging toe overschakelen van download resource actief gequeued" + +msgid "Sunk HTTP reply data on error codes" +msgstr "HTTP reply data verzonken bij error codes" + +msgid "Ignored downloaded data" +msgstr "Gedownloade gegevens genegeerd" + +msgid "Ignoring requested after data mismatch" +msgstr "Verzoek voor gegevens wordt genegeerd na niet overeenkomen" + +msgid "Ignoring requested to preserve connection" +msgstr "Verzoek tot bewaren van de connectie wordt genegeerd" + +msgid "Ignoring requested due to aggressive swarming" +msgstr "Het verzochte wordt genegeerd door te agressieve swarming" + +msgid "Ignoring refused (data too large or server too slow)" +msgstr "Negeren geweigerd (data te groot of server te langzaam)" + +msgid "Client resource switching (all detected)" +msgstr "Overschakelen van client resource (alle gedetecteerd)" + +msgid "Client resource switching between plain files" +msgstr "Overschakelen van client resource tussen gewone bestanden" + +msgid "Client follow-up request after HTTP error was returned" +msgstr "Opvolgende verzoek van client nadat een HTTP error was teruggeven" + +msgid "PARQ client resource switching in slots (SHA-1 based)" +msgstr "Overschakelen van PARQ client resource in sporen (SHA-1 gebasseerd)" + +msgid "PARQ client retry-after violation" +msgstr "PARQ client retry-after schending" + +msgid "PARQ client kicked out after too many retry-after violations" +msgstr "PARQ client eruit geschopt na teveel retry-after schendingen" + +msgid "PARQ upload slot limit overrides" +msgstr "PARQ upload slot limiet overrides" + +msgid "PARQ quick upload slots granted" +msgstr "PARQ quick upload sporen toegekend" + +msgid "PARQ QUEUE sending attempts" +msgstr "PARQ QUEUE pogingen verzenden" + +msgid "PARQ QUEUE messages sent" +msgstr "PARQ QUEUE berichten verstuurd" + +msgid "PARQ QUEUE follow-up requests received" +msgstr "PARQ QUEUE opvolgend verzoek ontvangen" + +msgid "Launched SHA-1 file verifications" +msgstr "SHA-1 bestandsverificatie begonnen" + +msgid "Launched TTH file verifications" +msgstr "TTH bestandsverificatie begonnen" + +msgid "Re-seeding of orphan downloads through query hits" +msgstr "Re-seeding of orphan-downloads dmv query hits" + +msgid "Re-seeding of orphan downloads through upload requests" +msgstr "Orphan-downloads worden opnieuw geseed door upload verzoek" + +msgid "RUDP sent bytes" +msgstr "RUDP bytes verzonden" + +msgid "RUDP received bytes" +msgstr "RUDP bytes ontvangen" + +msgid "DHT estimated amount of nodes" +msgstr "DHT geschat aantal nodes" + +msgid "DHT standard error of estimated amount of nodes" +msgstr "DHT standaard fout van het geschatte aantal nodes" + +msgid "DHT k-ball theoretical frontier (bits)" +msgstr "DHT k-ball theoretische grens (bits)" + +msgid "DHT k-ball furthest frontier (bits)" +msgstr "DHT k-ball verste grens (bits)" + +msgid "DHT k-ball closeest frontier (bits)" +msgstr "DHT k-ball dichtstbijzijnde grens (bits)" + +msgid "DHT routing table buckets" +msgstr "DHT routetabel buckets" + +msgid "DHT routing table leaves" +msgstr "DHT routetabel leaves" + +msgid "DHT routing table maximum depth" +msgstr "DHT routetabel maximum diepte" + +msgid "DHT routing table good nodes" +msgstr "DHT route tabel goede nodes" + +msgid "DHT routing table stale nodes" +msgstr "DHT routetabel verouderde nodes" + +msgid "DHT routing table pending nodes" +msgstr "DHT route tabel wachtende nodes" + +msgid "DHT routing table evicted nodes" +msgstr "DHT routetabel verdreven nodes" + +msgid "DHT routing table evicted firewalled nodes" +msgstr "DHT routetabel verdreven firewalled-nodes" + +msgid "DHT routing table evicted nodes due to quota" +msgstr "DHT route tabel nodes verstoten vanwege quota" + +msgid "DHT routing table promoted pending nodes" +msgstr "DHT routetabel gepromoveerde wachtende nodes" + +msgid "DHT routing table pinged promoted nodes" +msgstr "DHT route tabel gepromoveerde nodes gepinged" + +msgid "DHT routing table rejected node due to bucket network quota" +msgstr "DHT routing tabel node afgewezen door bucket netwerk quota" + +msgid "DHT routing table rejected node due to global network quota" +msgstr "DHT routing tabel node afgewezen door globale netwerk quota" + +msgid "DHT completed bucket refreshes" +msgstr "DHT afgeronde bucket verversingen" + +msgid "DHT forced bucket refreshes" +msgstr "DHT geforceerde bucket verversingen" + +msgid "DHT forced bucket merges" +msgstr "DHT geforceerde bucket samenvoegingen" + +msgid "DHT bucket merges" +msgstr "DHT bucket samenvoegingen" + +msgid "DHT bucket splits" +msgstr "DHT buckets gesplitst" + +msgid "DHT denied non-splitable bucket refresh" +msgstr "DHT niet splitsbare bucket vernieuwing geweigerd" + +msgid "DHT initiated bucket alive checks" +msgstr "DHT geïnitieerde bucket in leven controles" + +msgid "DHT alive pings sent to good nodes" +msgstr "DHT in leven pings verzonden aan goede nodes" + +msgid "DHT alive pings sent to stale nodes" +msgstr "DHT in leven pings verstuurd aan verouderde nodes" + +msgid "DHT alive pings sent to shutdowning nodes" +msgstr "DHT in leven pings verstuurd aan afsluitende nodes" + +msgid "DHT alive pings avoided" +msgstr "DHT alive pings voorkomen" + +msgid "DHT alive pings skipped" +msgstr "DHT alive pings overgeslagen" + +msgid "DHT revitalized stale nodes on RPC reply" +msgstr "DHT verouderde nodes gerevitaliseerd n.a.v. RPC antwoord" + +msgid "DHT value store rejected on IP/network quota grounds" +msgstr "DHT opslaan waarde geweigerd op basis van IP/netwerk quota" + +msgid "DHT value store rejected on creator validation grounds" +msgstr "DHT opslaan waarde geweigerd op basis van schepper" + +msgid "DHT nodes rejected during lookup based on network quota" +msgstr "DHT nodes geweigerd tijdens lookup op basis van netwerk quota" + +msgid "DHT nodes rejected during lookup based on suspicious proximity" +msgstr "DHT nodes geweigerd tijdens lookup op basis van verdachte nabijheid" + +msgid "DHT nodes rejected during lookup based on frequency divergence" +msgstr "DHT nodes geweigerd tijdens lookup op basis van frequentie divergentie" + +msgid "DHT node contact IP addresses fixed during lookup" +msgstr "DHT node vast contact IP adres tijdens opzoeken" + +msgid "DHT keys held" +msgstr "DHT sleutels vastgehouden" + +msgid "DHT cached keys held" +msgstr "DHT gecachte sleutels vastgehouden" + +msgid "DHT values held" +msgstr "DHT waardes in bezit" + +msgid "DHT cached KUID targets held" +msgstr "DHT gecachte KUID doelen in bezit" + +msgid "DHT cached closest root nodes" +msgstr "DHT gecachte dichtstbijzijnde root nodes" + +msgid "DHT cached roots exact hits" +msgstr "DHT gecachte roots exacte hits" + +msgid "DHT cached roots approximate hits" +msgstr "DHT gecachte roots bijna gelijke hits" + +msgid "DHT cached roots misses" +msgstr "DHT gecachte roots gemist" + +msgid "DHT cached roots lookups within k-ball" +msgstr "DHT gecachte roots lookups binnen de k-ball" + +msgid "DHT cached roots contact address refreshed" +msgstr "DHT gecachte roots contact adres ververst" + +msgid "DHT cached security tokens held" +msgstr "DHT gecachte security tokens in bezit" + +msgid "DHT cached security tokens hits" +msgstr "DHT gecachte security tokens hits" + +msgid "DHT stable node information held" +msgstr "DHT stabiele node informatie vastgehouden" + +msgid "DHT local hits on value lookups" +msgstr "DHT lokale hits op lookup van waarde" + +msgid "DHT local hits returning values from cached keys" +msgstr "DHT lokale hits waardes geretourneerd van gecachte sleutels" + +msgid "DHT returned expanded values" +msgstr "DHT geretourneerde geëxpandeerde waardes" + +msgid "DHT returned values as secondary keys" +msgstr "DHT geretourneerde waardes als secundaire sleutels" + +msgid "DHT claimed values via secondary keys" +msgstr "DHT waardes via secundaire sleutels geclaimed" + +msgid "DHT returned cached expanded values" +msgstr "DHT geretourneerde gecachte geëxpandeerde waardes" + +msgid "DHT returned cached values as secondary-keys" +msgstr "DHT geretourneerde gecachte waardes als secundaire sleutels" + +msgid "DHT claimed cached values via secondary keys" +msgstr "DHT gecachte waardes via secundaire sleutels geclaimd" + +msgid "DHT successfully received value publications" +msgstr "DHT succesvol ontvangen waarde publicaties" + +msgid "DHT successfully received value removals" +msgstr "DHT succesvol ontvangen waarde verwijderingen" + +msgid "DHT replication of stale value avoided" +msgstr "DHT replicatie van verouderde waardes voorkomen" + +msgid "DHT replication of held values" +msgstr "DHT replicatie van vastgehouden waardes" + +msgid "DHT republishing of held values" +msgstr "DHT opnieuw gepubliceerde vastgehouden waardes" + +msgid "DHT secondary-key value fetch issued" +msgstr "DHT secundaire sleutel waarde ophalen uitgevaardigd" + +msgid "DHT duplicate values returned in lookups" +msgstr "DHT dubbele waardes teruggegeven in lookups" + +msgid "DHT detected KUID collisions" +msgstr "DHT KUID botsingen gedetecteerd" + +msgid "DHT detected collisions with our own KUID" +msgstr "DHT botsingen gedetecteerd met onze eigen KUID" + +msgid "DHT caching attempts" +msgstr "DHT cache pogingen" + +msgid "DHT caching ended successfully" +msgstr "DHT cache poging succesvol afgerond" + +msgid "DHT caching partially completed" +msgstr "DHT cache pogingen gedeeltelijk afgerond" + +msgid "DHT key-offloading checks after discovering new closest node" +msgstr "" +"DHT verlading van sleutel checks na het vinden van nieuwe dichtstbijzijnde " +"node" + +msgid "DHT keys selected for offloading" +msgstr "DHT sleutels geselecteert voor verlading van sleutels" + +msgid "DHT key-offloading attempts" +msgstr "DHT sleutel verlading pogingen" + +msgid "DHT key-offloading ended successfully" +msgstr "DHT sleutel verladingen succesvol afgerond" + +msgid "DHT key-offloading partially completed" +msgstr "DHT sleutel verladingen gedeeltelijk afgerond" + +msgid "DHT values successfully offloaded" +msgstr "DHT waardes succesvol gelost" + +msgid "DHT incoming messages" +msgstr "DHT inkomende berichten" + +msgid "DHT incoming messages with UDP-matching contact address" +msgstr "DHT inkomende berichten met een UDP-overeenkomend contact adres" + +msgid "DHT incoming messages with contact address fixed" +msgstr "DHT inkomende berichten met een vast contact adres" + +msgid "DHT incoming messages from hostile addresses" +msgstr "DHT inkomende berichten van vijandige adressen" + +msgid "DHT incoming messages with hostile contact address" +msgstr "DHT inkomende berichten met een vijandig contact adres" + +msgid "DHT RPC messages prepared" +msgstr "DHT RPC voorbereidde berichten" + +msgid "DHT RPC messages cancelled" +msgstr "DHT RPC geannuleerde berichten" + +msgid "DHT RPC timed out" +msgstr "DHT RPC tijd verstreken" + +msgid "DHT RPC replies received" +msgstr "DHT RPC ontvangen antwoorden" + +msgid "DHT RPC replies with contact address fixed" +msgstr "DHT RPC antwoorden met een vast contact adres" + +msgid "DHT RPC late replies received" +msgstr "DHT RPC laat ontvangen antwoorden " + +msgid "DHT RPC detected KUID mismatches on reply" +msgstr "DHT RPC gedetecteerde verkeerde KUID combinaties bij antwoord" + +msgid "DHT RPC recent nodes held" +msgstr "DHT RPC recente nodes behouden" + +msgid "DHT node verifications" +msgstr "DHT node verificaties" + +msgid "DHT publishing attempts" +msgstr "DHT publicatie pogingen" + +msgid "DHT publishing ended successfully (all roots)" +msgstr "DHT publicaties succesvol afgerond (alle roots)" + +msgid "DHT publishing partially completed (root subset only)" +msgstr "DHT publicaties gedeeltelijk afgerond (alleen root subset)" + +msgid "DHT publishing ending with proper value presence" +msgstr "DHT publicaties geëindigd met juiste waarde aanwezig" + +msgid "DHT value republishing occurring too late (after expiry)" +msgstr "DHT waarde herpublicaties te laat opgetreden (na afloop)" + +msgid "DHT publishing to self" +msgstr "DHT publicatie aan onszelf" + +msgid "DHT background publishing completion attempts" +msgstr "DHT achtergrond publicatie afrond pogingen" + +msgid "DHT background publishing completion showing improvements" +msgstr "DHT achtergrond publicatie afrond poging succesvol afgerond" + +msgid "DHT background publishing completion successful (all roots)" +msgstr "DHT achtergrond publicaties succesvol afgerond (alle roots)" + +msgid "DHT SHA1 data type collisions" +msgstr "DHT SHA1 data type botsingen" + +msgid "DHT lookup path passively protected against attack" +msgstr "DHT lookup pad passief beveiligd tegen aanvallen" + +msgid "DHT lookup path actively protected against attack" +msgstr "DHT lookup pad actief beveiligd tegen aanvallen" + +msgid "DHT alt-loc lookups issued" +msgstr "DHT alt-loc lookups geïnitieerd" + +msgid "DHT push-proxy lookups issued" +msgstr "DHT push-proxy lookup verzocht" + +msgid "DHT successful alt-loc lookups" +msgstr "DHT succesvolle alt-loc lookups" + +msgid "DHT successful push-proxy lookups" +msgstr "DHT succesvolle push-proxy lookups" + +msgid "DHT successful node push-entry lookups" +msgstr "DHT succesvolle node push-entry lookups" + +msgid "DHT re-seeding of orphan downloads" +msgstr "DHT opnieuw seeden van orphan-downloads" + +msgid "Digests computed on general statistics" +msgstr "" + +msgid "Digests computed on TCP statistics" +msgstr "" + +msgid "Digests computed on UDP statistics" +msgstr "" + +msgid "Ping" +msgstr "Ping" + +msgid "Pong" +msgstr "Pong" + +msgid "Bye" +msgstr "Bye" + +msgid "QRP" +msgstr "QRP" + +msgid "HSEP" +msgstr "HSEP" + +msgid "RUDP" +msgstr "RUDP" + +msgid "Vendor spec." +msgstr "Vendor spec." + +msgid "Vendor std." +msgstr "Vendor std." + +msgid "Push" +msgstr "Push" + +msgid "Query" +msgstr "Query" + +msgid "Query hit" +msgstr "Query hit" + +msgid "DHT (truncated)" +msgstr "DHT (ingekort)" + +msgid "DHT Ping" +msgstr "DHT Ping" + +msgid "DHT Pong" +msgstr "DHT Pong" + +msgid "DHT Store" +msgstr "DHT Opslag" + +msgid "DHT Store Ack" +msgstr "DHT Store Ack" + +msgid "DHT Find Node" +msgstr "DHT Zoek Node" + +msgid "DHT Found Node" +msgstr "DHT Gevonden Node" + +msgid "DHT Find Value" +msgstr "DHT Zoek Waarde" + +msgid "DHT Value" +msgstr "DHT Waarde" + +msgid "G2 Crawl Request" +msgstr "G2 Crawl Verzoek" + +msgid "G2 Hub Advertisement" +msgstr "G2 Hub Aankondiging" + +msgid "G2 Hub List" +msgstr "G2 Hub Lijst" + +msgid "G2 Hub List Req" +msgstr "G2 Hub Lijst Verzoek" + +msgid "G2 Hub List Ack" +msgstr "G2 Hub Lijst Bevestiging" + +msgid "G2 Local Node Info" +msgstr "G2 Lokale Node Informatie" + +msgid "G2 Ping" +msgstr "G2 Ping" + +msgid "G2 Pong" +msgstr "G2 Pong" + +msgid "G2 Push" +msgstr "G2 Push" + +msgid "G2 Query Key Ack" +msgstr "G2 Query Sleutel Bevestiging" + +msgid "G2 Query Key Req" +msgstr "G2 Query Sleutel Verzoek" + +msgid "G2 Query" +msgstr "G2 Query" + +msgid "G2 Query Ack" +msgstr "G2 Query Bevestiging" + +msgid "G2 Query Hit" +msgstr "G2 Query Treffer" + +msgid "G2 Query Hash Table" +msgstr "G2 Query Hash Table" + +msgid "G2 User Profile Check" +msgstr "G2 Gebruikers Profiel Controle" + +msgid "G2 User Profile Data" +msgstr "G2 Gebruikers Profiel Data" + +msgid "Total" +msgstr "Totaal" + +msgid "Bad size" +msgstr "Verkeerde grootte" + +msgid "Too small" +msgstr "Te klein" + +msgid "Too large" +msgstr "Te groot" + +msgid "Way too large" +msgstr "Veelste groot" + +msgid "Too old" +msgstr "Te oud" + +msgid "Unknown message type" +msgstr "Bericht type onbekend" + +msgid "Unexpected message" +msgstr "Bericht niet verwacht" + +msgid "Message sent with TTL = 0" +msgstr "Berricht verzonden met TTL = 1" + +msgid "Improper hops/ttl combination" +msgstr "Ongeldige hops/TTL combinatie" + +msgid "Max TTL exceeded" +msgstr "Over de Max TTL " + +msgid "Message throttle" +msgstr "Berichten smoren" + +msgid "Message matched limits" +msgstr "Bericht kwam overeen met limieten" + +msgid "Transient node" +msgstr "Vluchtige node" + +msgid "Unusable Pong" +msgstr "\"Pong\" niet bruikbaar" + +msgid "Hard TTL limit reached" +msgstr "Harde TTL limit bereikt" + +msgid "Max hop count reached" +msgstr "Max hop teller bereikt" + +msgid "Route lost" +msgstr "Route verloren" + +msgid "No route" +msgstr "Geen route" + +msgid "Duplicate message" +msgstr "Dubbel bericht" + +msgid "OOB Proxy MUID Conflict" +msgstr "OOB Proxy MUID Conflict" + +msgid "Message to banned GUID" +msgstr "Bericht naar verbande GUID" + +msgid "Message from banned GUID" +msgstr "Bericht van verbande GUID" + +msgid "Node shutting down" +msgstr "Node is aan het afsluiten" + +msgid "TX flow control" +msgstr "TX flow control" + +msgid "Query text had no trailing NUL" +msgstr "Query tekst bevatte geen afsluitende NUL" + +msgid "Query text too short" +msgstr "Query tekst te kort" + +msgid "Query had unnecessary overhead" +msgstr "Query had onnodige bagage" + +msgid "Query had bad URN" +msgstr "Query had onjuiste URN" + +msgid "Message with malformed SHA1" +msgstr "Bericht met ongeldige SHA1" + +msgid "Message with malformed UTF-8" +msgstr "Bericht met ongeldige UTF-8" + +msgid "Malformed Query Hit" +msgstr "Query Hit ongeldig" + +msgid "Bad return address" +msgstr "Fout antwoord adres." + +msgid "Hostile IP address" +msgstr "Vijandig IP-adres" + +msgid "Shunned IP address" +msgstr "Vermeden IP adres" + +msgid "Bogus result from Morpheus" +msgstr "Bogus resultaten van Morpheus" + +msgid "Spam" +msgstr "Spam" + +msgid "Evil filename" +msgstr "Slechte bestandsnaam" + +msgid "Improper media type" +msgstr "Ongeschikt media type" + +msgid "Payload inflating error" +msgstr "Payload inflating fout" + +msgid "Unknown header flags present" +msgstr "Onbekende header vlag aanwezig" + +msgid "Own search results" +msgstr "Eigen zoekresultaten" + +msgid "Own queries" +msgstr "Eigen query's" + +msgid "Ancient query format" +msgstr "Verouderd query formaat" + +msgid "Blank Servent ID" +msgstr "Leeg Servent ID" + +msgid "GUESS Query missing token" +msgstr "GUESS Query mist token" + +msgid "GUESS Invalid query token" +msgstr "GUESS ongeldige query token" + +msgid "DHT Invalid security token" +msgstr "DHT ongeldige security token" + +msgid "DHT Too many STORE requests" +msgstr "DHT te veel STORE verzoeken" + +msgid "DHT Malformed message" +msgstr "DHT bericht misvormd" + +msgid "G2 Unexpected message" +msgstr "G2 bericht onverwacht" + +msgid "Cannot cross networks" +msgstr "Kan niet over meerdere netwerken" + msgid "No proxy" msgstr "Geen proxy" @@ -1435,9 +2694,6 @@ msgid "Debug level for code shared between gui and core." msgstr "Debug level voor code die wordt gedeelt tussen de GUI en de core." -msgid "Verbosity of Bitzi related debug messages." -msgstr "Detail level voor Bitiz gerelateerde debug berichten." - msgid "Verbosity of URL handling related debug messages." msgstr "Detail level voor URL afhandeling gerelateerde debug berichten." @@ -1529,8 +2785,8 @@ "wordt verbannen als het 10 keer te vroeg opnieuw probeerd, dit is een goede " "balans tussen misbruik en legacy client ondersteuning." -msgid "For development use: track properties." -msgstr "Voor ontwikkeling: volg eigenschappen." +msgid "Indicates a kernel network buffer shortage." +msgstr "Wijst op een kernel netwerk buffer tekort." msgid "For development use: don't add new hosts to the host cache." msgstr "Voor ontwikkeling: voeg geen nieuwe hosts toe aan de host cache." @@ -1668,9 +2924,8 @@ msgid "Current number of hosts in regular node caches." msgstr "Het aantal hosts in de reguliere node caches." -#, fuzzy msgid "Current number of IPv4 hosts in ultra node caches." -msgstr "Het aantal hosts in de ultra node caches." +msgstr "Het aantal IPv4 hosts in de ultra node caches." msgid "Current number of hosts in bad node caches." msgstr "Het aantal hosts in de foute node caches." @@ -1678,9 +2933,8 @@ msgid "Maximum number of hosts in the regular node cache." msgstr "Maximum aantal of hosts in de normale node cache." -#, fuzzy msgid "Maximum number of IPv4 hosts in the ultra node cache." -msgstr "Maximum aantal hosts in de ultra node cache." +msgstr "Maximum aantal IPv4 hosts in de ultra node cache." msgid "Maximum number of hosts in the BUSY, UNSTABLE and TIMEOUT lists." msgstr "" @@ -2017,7 +3271,7 @@ "If deactivated, only uploads and downloads will continue. All Gnet " "connections are disabled/terminated." msgstr "" -"Alle gNet verbindingen zullen worden verbroken als dit wordt gedeactiveerd. " +"Alle gNet connecties zullen worden verbroken als dit wordt gedeactiveerd. " "Alle uploads en downloads zullen gewoon doorgaan." msgid "" @@ -2053,10 +3307,8 @@ msgid "" "Maximum amount of leaves we can accept. To be promoted Ultra, you should " -"reserve 32 bytes of bandwidth per leaf." +"reserve 32 bytes/sec of bandwidth per leaf." msgstr "" -"Maximum aantal leaves dat we accepteren. Om naar een Ultra-status " -"gepromoveerd te worden moet je 32 bytes bandbreedte per leaf reserveren." msgid "What to do with files that will be ignored for downloading." msgstr "Wat te doen met bestanden die voor downloading genegeerd worden." @@ -2200,9 +3452,9 @@ "unstable IP addresses." msgstr "" "Of gtk-gnutella moet bepalen welke servent types (zoals geïndentificeerd " -"door hun leveranciersnaam) instabiel zijn, en zorgen dat we geen nieuwe " -"connecties van of naar ze maken. Dit werkt alleen als gtk-gnutella al " -"bepaalt welke IP-adressen instabiel zijn." +"door hun vendornaam) instabiel zijn, en zorgen dat we geen nieuwe connecties " +"van of naar ze maken. Dit werkt alleen als gtk-gnutella al bepaalt welke IP-" +"adressen instabiel zijn." msgid "" "Whether gtk-gnutella should automatically remove the file whenever it gets a " @@ -2250,11 +3502,11 @@ "Percentage of the number of connections we should reserve for gtk-gnutella " "nodes." msgstr "" -"Percentage van het aantal verbindingen dat we zullen reserveren voor gtk-" -"gnutella nodes." +"Percentage van het aantal connecties wordt gereserveerd voor gtk-gnutella " +"nodes." msgid "Maximum percentage of slots a vendor can occupy." -msgstr "Maximum percentage van slots dat een leverancier kan gebruiken." +msgstr "Maximum percentage van slots dat een vendor kan gebruiken." msgid "" "Size of the RX socket buffer to be used for downloads, in kibibytes. If you " @@ -2549,13 +3801,12 @@ "toegepast op nieuwe items, niet op bestaande." msgid "If set, all outgoing connections are tunneled over TLS." -msgstr "" -"Indien geactiveerd worden alle uitgaande verbindingen getunneld via TLS." +msgstr "Indien geactiveerd worden alle uitgaande connecties getunneld via TLS." msgid "If not set, support for Gnutella connection compression is disabled." msgstr "" "Indien niet geactiveerd dan wordt de ondersteuning voor compressie over " -"gnutella verbindingen uitgeschakeld." +"gnutella connecties uitgeschakeld." msgid "" "Whether UDP shall be used in complement to TCP. When set, gtk-gnutella will " @@ -2631,13 +3882,13 @@ msgid "" "If set to TRUE, the global hostiles.txt is used as well as the private " -"$GTK_GNUTELLA_DIR/hostiles.txt. This allows to separate your private ban " +"$GTK_GNUTELLA_DIR/hostiles.txt. This allows you to separate your private ban " "list from the global one distributed with gtk-gnutella." msgstr "" -"Indien TRUE, dan zal zowel de algemene hostiles.txt als de $GTK_GNUTELLA_DIR/" -"hostiles.txt worden gebruikt. Op deze manier is het mogelijk een eigen prive " -"ban lijst bij te houden naast de algemene lijst welke met gtk-gnutella mee " -"komt." +"Indien TRUE, dan zal zowel de globale hostiles.txt als de privé " +"$GTK_GNUTELLA_DIR/hostiles.txt. worden gebruikt. Dit biedt je de " +"mogelijkheid om je eigen privé banlijst gescheiden te houden van de globale " +"versie zoals deze wordt gedistributeerd bij gtk-gnutella." msgid "If set to TRUE, SO_LINGER is used for sockets." msgstr "Indien TRUE dan wordt SO_LINGER gebruikt voor sockets." @@ -2740,10 +3991,6 @@ msgid "Don't start more than this number of parallel downloads per file." msgstr "Start per bestand niet meer dan dit aantal parallele downloads" -# Stopped -> Gestopped -# gaps -> gaten -# publish -> publiceren -# Partial -> Gedeeltelijk msgid "" "If enabled, all received packets are dumped to $GTK_GNUTELLA_DIR/packets_rx." "dump." @@ -3051,21 +4298,20 @@ msgid "Logged statistics level for code shared between GUI and core." msgstr "Statistieken gelogged over gedeelde code tussen de GUI en de core." -#, c-format msgid "" "If TRUE, the spam SHA1 database is kept in memory. If FALSE, it is kept in a " "fast disk database, which saves a large amount of core memory and reduces " "the overall footprint, at the cost of an increased I/O level. However, the " -"DB cache has typically a 90% hit rate, so the actual overhead is barely " +"DB cache has a 90 percent hit rate, so the actual overhead is barely " "noticeable when running as an ultra node and should remain completely " "unnoticed when running as a leaf." msgstr "" -"Als TRUE dan wordt de spam SHA1 database in het werkgeheugen bewaard. Als " -"FALSE dan wordt deze bewaard in een snelle database op de schijf wat een " -"grote hoeveel basic geheugen bespaard en verminderd de algehele voetafdruk " -"ten koste van een hoger I/O level. De DB cache heeft echter normaal een 90% " -"hit rate waardoor de daadwerkelijke overhead nauwelijks merkbaar is als in " -"ultra node mode en zou niet merkbaar moeten zijn als in leaf mode." +"Als WAAR dan wordt de SHA1 in het werkgeheugen bewaard.Als NIET WAAR dan " +"wordt deze bewaard in een snelle database op de schijf wat een grote " +"hoeveelheid basic geheugen bespaard en verminderd de algehele voetafdruk ten " +"koste van een hoger I/O level. De DB cache heeft echter normaal een 90% hit " +"rate waardoor de daadwerkelijke overhead nauwelijks merkbaar is als in ultra " +"node mode en zou niet merkbaar moeten zijn als in leaf mode." msgid "Debug level for spam detection." msgstr "Debug level voor spam detectie." @@ -3223,7 +4469,7 @@ "accept incoming TCP connections." msgstr "" "Alleen voor testdoeleinden, sta toe om in ultrapeer mode te draaien, zelfs " -"als de node geen inkomende TCP verbindingen accepteert." +"als de node geen inkomende TCP connecties accepteert." msgid "" "Whether UPnP (Universal Plug and Play) should be enabled. Support for UPnP " @@ -3253,12 +4499,12 @@ "Whether gtk-gnutella thinks it needs to install port mappings on your " "network router to avoid the firewalled condition." msgstr "" -"Of gtk-gnutella denkt dat het een poort mapping moet aanvragen op uw netwerk " -"router om de firewalled status te vermijden." +"Of gtk-gnutella denkt dat het een poort toewijzing moet aanvragen op uw " +"netwerk router om de firewalled status te vermijden." msgid "Whether gtk-gnutella can install port mappings, if needed." msgstr "" -"Of gtk-gnutella, indien nodig, een poort mappingen verzoek kan versturen" +"Of gtk-gnutella, indien nodig, een poort toewijzing verzoek kan versturen" msgid "Debug level for the NAT-PMP layer." msgstr "Debug level voor de NAT-PMP laag." @@ -3285,7 +4531,7 @@ "mappings, if required." msgstr "" "Of gtk-gnutella, indien nodig, in staat was de NAT-PMP gateway te " -"lokaliseren en poort mapping aan te vragen." +"lokaliseren en poort toewijzing aan te vragen." msgid "Debug level for the TX (transmit) network layer." msgstr "Debug level voor de TX (verzenden) netwerk laag." @@ -3300,7 +4546,7 @@ msgstr "Debug level voor de achtergrond taak planner." msgid "Whether gtk-gnutella was able to configure port mappings." -msgstr "Of poort mapping configuratie succesvol mogelijk was." +msgstr "Of de poort toewijzing configuratie succesvol was." msgid "Whether gtk-gnutella disabled HTTP bandwidth stealing." msgstr "Of gtk-gnutella HTTP bandbreedte gebruik heeft uitgeschakeld." @@ -3353,21 +4599,17 @@ "Debug level voor de client-side GUESS (Gnutella UDP Extension for Scalable " "Searches)." -#, fuzzy msgid "Maximum number of IPv4 hosts in the regular GUESS cache." -msgstr "Maximum aantal of hosts in de normale GUESS cache." +msgstr "Maximum aantal IPv4 hosts in de reguliere GUESS cache." -#, fuzzy msgid "Current number of IPv4 hosts in the regular GUESS cache." -msgstr "Huidige aantal hosts in de normale GUESS cache." +msgstr "Het aantal IPv4 hosts in de normale GUESS cache." -#, fuzzy msgid "Maximum number of IPv4 hosts in the introduction GUESS cache." -msgstr "Maximum aantal hosts in de introduction GUESS cache." +msgstr "Maximum aantal IPv4 hosts in de GUESS introductie cache." -#, fuzzy msgid "Current number of IPv4 hosts in the introduction GUESS cache." -msgstr "Huidig aantal hosts in de introduction GUESS cache." +msgstr "Het aantal IPv4 hosts in de GUESS introductie cache." msgid "Debug level for the DB disk/RAM storage layer." msgstr "Debug level voor de DB disk/RAM storage layer." @@ -3457,149 +4699,266 @@ msgstr "" "Maximum aantal te tonen resultaten tijdens een passieve zoekopdracht verzoek." -#, fuzzy msgid "Whether to log duplicate Gnutella messages from same node." -msgstr "Moeten vervallen gnutella berichten gelogd worden" +msgstr "Moeten dubbele Gnutella berichten van dezelfde node gelogd worden." -#, fuzzy msgid "Whether to log duplicate Gnutella messages with a higher TTL." -msgstr "Moeten vervallen gnutella berichten gelogd worden" +msgstr "Moeten dubbele Gnutella berichten met een hoger TTL worden gelogd" -#, fuzzy msgid "Whether to log duplicate Gnutella messages (not from same node)." -msgstr "Moeten vervallen gnutella berichten gelogd worden" +msgstr "" +"Moeten dubbele Gnutella berichten (niet afkomstig van dezelfde node) worden " +"gelogd." -#, fuzzy msgid "Whether to log new Gnutella messages, never seen before." -msgstr "Moeten vervallen gnutella berichten gelogd worden" +msgstr "" +"Moeten nieuwe Gnutella berichten, welke nooit eerder zijn gezien, worden " +"gelogd." -#, fuzzy msgid "Whether to log Gnutella routing decisions." -msgstr "Moeten vervallen gnutella berichten gelogd worden" +msgstr "Moeten Gnutella routering besluiten worden gelogd" -#, fuzzy msgid "Whether to log bad Gnutella messages, corrupted or unexpected." -msgstr "Moeten vervallen gnutella berichten gelogd worden" +msgstr "" +"Moeten foute - corrupte of onverwachte - Gnutella berichten worden gelogd." msgid "Whether to log conditions triggering query hit spam flagging." msgstr "" +"Moeten condities die leiden tot het markeren van een query hit als spam " +"worden gelogd. " -#, fuzzy msgid "Maximum number of IPv6 hosts in the ultra node cache." -msgstr "Maximum aantal hosts in de ultra node cache." +msgstr "Maximum aantal IPv6 hosts in de ultra node cache." -#, fuzzy msgid "Current number of IPv6 hosts in ultra node caches." -msgstr "Het aantal hosts in de ultra node caches." +msgstr "Het aantal IPv6 hosts in de ultra node caches." -#, fuzzy msgid "Current number of IPv6 hosts in the regular GUESS cache." -msgstr "Huidige aantal hosts in de normale GUESS cache." +msgstr "Het aantal IPv6 hosts in de reguliere GUESS cache." -#, fuzzy msgid "Current number of IPv6 hosts in the introduction GUESS cache." -msgstr "Huidig aantal hosts in de introduction GUESS cache." +msgstr "Het aantal IPv6 hosts in the GUESS introductie cache." -#, fuzzy msgid "Maximum number of IPv6 hosts in the regular GUESS cache." -msgstr "Maximum aantal of hosts in de normale GUESS cache." +msgstr "Maximum aantal IPv6 hosts in de reguliere GUESS cache." -#, fuzzy msgid "Maximum number of IPv6 hosts in the introduction GUESS cache." -msgstr "Maximum aantal hosts in de introduction GUESS cache." +msgstr "Maximum aantal IPv6 hosts in de GUESS introductie cache." -#, fuzzy msgid "Debug level for the malloc() replacement allocator." -msgstr "Debug level voor de zone-based memory allocator." +msgstr "Debug level voor de vervangende malloc() allocator." -#, fuzzy msgid "Debug level for bad query hit messages." -msgstr "Debug level voor de query hit bericht generatie." +msgstr "Debug level voor ongeldige query hit berichten." -#, fuzzy msgid "Debug level for GUID management." -msgstr "Debug level voor het host beheer" +msgstr "Debug level voor GUID beheer." -msgid "disable" -msgstr "uitschakelen" +msgid "Debug level for the TX (transmit) deflating network layer." +msgstr "Debug level voor de TX (verzenden) deflating netwerk laag." -msgid "by words" -msgstr "op woorden" +msgid "Comma-separated list of TX debugging hosts (IP addresses only)" +msgstr "Komma gescheiden lijst van te debuggen TX hosts (alleen IP-adressen)" -msgid "by whole query" -msgstr "op hele query" +msgid "" +"Comma-separated list of hosts for whom we want to dump RX traffic (IP " +"addresses only)" +msgstr "" +"Komma gescheiden lijst van hosts waarvan we het RX verkeer willen dumpen " +"(alleen IP-adressen)" -msgid "by router" -msgstr "per router" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they emit " +"(IP addresses only)" +msgstr "" +"Komma gescheiden lijst van hosts waarvan we het TX verkeer wat ze versturen " +"willen dumpen (alleen IP-adressen)" -msgid "TCP & UDP" -msgstr "TCP & UDP" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they " +"receive (IP addresses only)" +msgstr "" +"Komma gescheiden lijst van hosts waarvan we het TX verkeer wat ze ontvangen " +"willen dumpen (alleen IP-adressen)" -msgid "TCP only" -msgstr "Alleen TCP" +msgid "" +"Allow GUESS to use some of the unused Gnutella outgoing bandwidth regardless " +"of the GUESS bandwidth hint. If FALSE, only the configured bandwidth hint " +"will be used. When running as a leaf this should be set to TRUE to make " +"GUESS queries run faster." +msgstr "" +"Sta toe dat GUESS een beetje van het ongebruikte Gnutella uitgaande verkeer " +"gebruikt, zonder rekening te houden met de GUESS bandbreedte hint. Als " +"ONWAAR dan wordt alleen de geconfigureerde bandbreedte hint gebruikt. Als er " +"gebruik wordt gemaakt van leaf-mode dan zou deze waarde als WAAR ingesteld " +"moeten zijn zodat GUESS query's sneller worden uitgevoerd." -msgid "UDP only" -msgstr "Alleen UDP" +msgid "Debug level for the UDP TX scheduler." +msgstr "Debug level voor de UDP TX scheduler." -msgid "Ping" -msgstr "Ping" +msgid "" +"Debugging flags for the semi-reliable UDP TX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: transmissions, 16: timeouts." +msgstr "" +"Debug vlaggen voor de semibetrouwbare UDP TX laag: 1, berichten; 2, " +"fragmenten; 4, bevestigingen; 8, transmissies; 16, timeouts." -msgid "Pong" -msgstr "Pong" +msgid "Comma-separated list of RX debugging hosts (IP addresses only)" +msgstr "Komma gescheiden lijst van te debuggen RX hosts (alleen IP-adres)" -msgid "Bye" -msgstr "Bye" +msgid "" +"Debugging flags for the semi-reliable UDP RX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: receptions, 16: timeouts." +msgstr "" +"Debug vlaggen voor de semibetrouwbare UDP RX laag: 1, berichten; 2, " +"fragmenten; 4, bevestigingen; 8, ontvangsten; 16, timeouts." -msgid "QRP" -msgstr "QRP" +msgid "Whether to log sent semi-reliable UDP messages." +msgstr "Moeten verzonden semibetrouwbare UDP berichten worden gelogd." -msgid "HSEP" -msgstr "HSEP" +msgid "Whether to log received semi-reliable UDP messages." +msgstr "Moeten ontvangen semibetrouwbare UDP berichten worden gelogd." -msgid "RUDP" -msgstr "RUDP" +msgid "Debug level for the secured OOB query hit claiming." +msgstr "Debug level voor de geclaimde beveiligde OOB query hit." -msgid "Vendor spec." -msgstr "Verkoper spec." +msgid "Whether to log sent vendor messages." +msgstr "Moeten verzonden vendor berichten worden gelogd." -msgid "Vendor std." -msgstr "Verkoper:" +msgid "Whether to log received vendor messages." +msgstr "Moeten ontvangen vendor berichten worden gelogd." -msgid "Push" -msgstr "Push" +msgid "Debugging flags for the DHT token cache (developers only)." +msgstr "Debug vlaggen voor de DHT token cache (alleen voor ontwikkelaars)." -msgid "Query" -msgstr "Query" +msgid "Whether to log weird DHT message headers when debugging." +msgstr "" +"Moeten afwijkende DHT bericht headers worden gelogd tijdens het debuggen." -msgid "Query Hit" -msgstr "Query Hit" +msgid "Debug level for the DHT Remote Procedure Call (RPC) code." +msgstr "Debug level voor de DHT Remote Procedure Call (RPC) code." -msgid "DHT Ping" -msgstr "DHT Ping" +msgid "Whether to log UHC pings we receive." +msgstr "Moeten ontvangen UHC pings worden gelogd." -msgid "DHT Pong" -msgstr "DHT Pong" +msgid "Whether to log UHC pings we emit." +msgstr "Moeten verzonden UHC pings worden gelogd." -msgid "DHT Store" -msgstr "DHT Opslag" +msgid "Whether the program was properly shutdown." +msgstr "Of het programma normaal was afgesloten." -msgid "DHT Store Ack" -msgstr "DHT Store Ack" +msgid "Whether the program restarted after a clean shutdown." +msgstr "Of het programma na een normale afsluiting opnieuw is opgestart." -msgid "DHT Find Node" -msgstr "DHT Zoek Node" +msgid "Debug level for DHT key management." +msgstr "Debug level voor DHT sleutel beheer." -msgid "DHT Found Node" -msgstr "DHT Gevonden Node" +msgid "Debug level for DHT value management." +msgstr "debug level voor DHT waarde beheer." -msgid "DHT Find Value" -msgstr "DHT Zoek Waarde" +msgid "ID of the current process." +msgstr "Huidig proces ID." -msgid "DHT Value" -msgstr "DHT Waarde" +msgid "Debug level for HTTP range parsing / handling." +msgstr "Debug level voor HTTP bereik verwerking / afhandeling." -msgid "Total" -msgstr "Totaal" +msgid "" +"Lease time when installing port mappings via UPnP or NAT-PMP, in seconds. A " +"value of 0 requests permanent mappings." +msgstr "" +"Lease tijd in seconden wanneer poort toewijzing is geactiveerd via UPnP of " +"NAT-PMP. De waarde 0 verzoekt een permanente toewijzing." + +msgid "Whether the program is auto-restarting at the user's request." +msgstr "" +"Of het programma automatisch opnieuw is opgestart op verzoek van de " +"gebruiker." + +msgid "Debug level for time management." +msgstr "Debug level voor het tijdsbeheer" + +msgid "Debug level for the tmalloc() thread-magazine object distributor." +msgstr "Debug level voor de tmalloc() thread-magazine object distributor." + +msgid "Debug level for the event queue thread." +msgstr "Debug level voor de event queue thread." + +msgid "Maximum number of G2 hubs in the hub cache." +msgstr "Maximum aantal G2 hubs in de hub cache." + +msgid "Current number of IPv4 hosts in the G2 hub caches." +msgstr "Het aantal IPv4 hosts in de G2 hub caches." + +msgid "Whether the G2 protocol should be enabled." +msgstr "Of het G2 protocol moet worden geactiveerd." + +msgid "Number of G2 nodes currently connected." +msgstr "Aantal momenteel verbonden G2 nodes." + +msgid "Maximum amount of G2 hubs we should connect to as a leaf." +msgstr "" +"maximum aantal G2 hubs waar we mee moeten verbinden als we in leaf modus " +"zijn." + +msgid "Whether to log bad G2 messages, corrupted or unexpected." +msgstr "Moeten foute, corrupte of onverwachte G2-berichten gelogd worden." + +msgid "Whether to log dropped G2 messages" +msgstr "Moeten vervallen G2-berichten gelogd worden" + +msgid "Debug level for the G2 RPC layer." +msgstr "Debug level voor de G2-RPC laag." + +msgid "Whether to log summary of received query hits" +msgstr "" +"Moet een samenvatting van het totaal ontvangen query treffers worden gelogd." + +msgid "Whether to log summary of each record in received query hits" +msgstr "" +"Moet een samenvatting voor elke record in een ontvangen query treffer worden " +"gelogd" + +msgid "Number of G2 browsing requests received in this session." +msgstr "Aantal G2 bladeren verzoeken ontvangen tijdens deze sessie." + +msgid "Number of G2 browsing requests fully served in this session." +msgstr "Aantal G2 bladeren verzoeken compleet afgehandeld tijdens deze sessie." + +msgid "Whether to log G2 messages we're attempting to send" +msgstr "Moeten G2-berichten welke we proberen te verzonden worden gelogd" + +msgid "" +"Timestamp at which the current session was started. This stamp remains " +"unchanged when gtk-gnutella restarts after a crash or an explicit restart " +"request." +msgstr "" + +msgid "No TCP listening socket bound to allow incoming connections." +msgstr "" + +msgid "disable" +msgstr "uitschakelen" + +msgid "by words" +msgstr "op woorden" + +msgid "by whole query" +msgstr "op hele query" + +msgid "by router" +msgstr "per router" + +msgid "TCP & UDP" +msgstr "TCP & UDP" + +msgid "TCP only" +msgstr "Alleen TCP" + +msgid "UDP only" +msgstr "Alleen UDP" + +msgid "Query Hit" +msgstr "Query Hit" msgid "Icons" msgstr "Iconen" @@ -4098,11 +5457,11 @@ "gz2, gz, deb, rpm en ook exe bestanden." msgid "" -"Discard search results whith an alien IP address, not matching the one from " +"Discard search results with an alien IP address, not matching the one from " "which the results come from." msgstr "" -"Resultaten negeren met een vreemd IP-adres: die niet overeen komen met waar " -"de resultaten vandaan kwamen." +"Zoekresultaten van een vreemd IP-adres negeren; als het niet overeenkomt met " +"het IP-adres waar het resultaat vandaan kwam." msgid "" "Whether session-only searches which happen to have pending downloads should " @@ -4111,6 +5470,22 @@ "Of alleen-sessie zoekopdracht welke een wachtende download hebben opnieuw " "gestart moeten worden zodra gtk-gnutella is opgestart." +msgid "Discard search results coming from servents with a banned GUID." +msgstr "" +"Zoekresultaten negeren welke afkomstig zijn van verbande servents op basis " +"van GUID." + +msgid "Whether a summary line with GUESS search stats should be displayed." +msgstr "" +"Of een samenvattingsregel met GUESS zoek statistieken moet worden getoond." + +msgid "" +"Whether the GUESS summary line should show total statistics or ones " +"pertaining to the current search only." +msgstr "" +"Of de GUESS samenvattingsregel de totale statistieken moet tonen, of alleen " +"de statistieken met betrekking tot de huidige zoekopdracht." + msgid "Anonymizing proxies" msgstr "Anonieme proxies" @@ -4198,6 +5573,9 @@ msgid "Benin" msgstr "Benin" +msgid "Saint Barthelemy" +msgstr "Saint Barthelemy" + msgid "Bermuda" msgstr "Bermuda" @@ -4207,6 +5585,9 @@ msgid "Bolivia" msgstr "Bolivia" +msgid "Bonaire, Sint Eustatius and Saba" +msgstr "Bonaire, Sint Eustatius en Saba" + msgid "Brazil" msgstr "Brazilië" @@ -4216,6 +5597,9 @@ msgid "Bhutan" msgstr "Bhutan" +msgid "Burma" +msgstr "Birma" + msgid "Bouvet Island" msgstr "Bouvet (eiland)" @@ -4276,6 +5660,9 @@ msgid "Cape Verde" msgstr "Kaapverdische eilanden" +msgid "Curacao" +msgstr "Curaçao" + msgid "Christmas Island" msgstr "Christmaseiland" @@ -4741,12 +6128,18 @@ msgid "Suriname" msgstr "Suriname" +msgid "South Sudan" +msgstr "Zuid-Soedan" + msgid "Sao Tome and Principe" msgstr "Sao Tomé en Principe (eilanden)" msgid "El Salvador" msgstr "El Salvador" +msgid "Sint Maarten" +msgstr "Sint Maarten" + msgid "Syrian Arab Republic" msgstr "Syrië" @@ -4887,19 +6280,19 @@ #, c-format msgid "%ud %uh" -msgstr "" +msgstr "%ud %uh" #, c-format msgid "%uh %um" -msgstr "" +msgstr "%uh %um" #, c-format msgid "%um %us" -msgstr "" +msgstr "%um %us" #, c-format msgid "%us" -msgstr "" +msgstr "%us" msgid "locale_get_language|en" msgstr "nl" @@ -4951,37 +6344,39 @@ msgid "Interactive mode turned off." msgstr "Interactieve mode uitgeschakeld" -#, fuzzy +#, c-format +msgid "Unknown operation \"show %s\"" +msgstr "Onbekende bewerking \"toon %s\"" + +#, c-format +msgid "Unknown operation \"%s\"" +msgstr "Onbekende bewerking \"%s\"" + msgid "Cannot determine current working directory" -msgstr "Kan Thuis map niet vinden" +msgstr "Kan de huidige directory niet bepalen" -#, fuzzy, c-format +#, c-format msgid "Unknown logfile name \"%s\"" -msgstr "Onbekende eigenschap \"%s\"" +msgstr "Onbekend logbestand genaamd \"%s\"" -#, fuzzy msgid "Unable to reopen" -msgstr "Niet mogelijk om GIV te verzenden" +msgstr "Opnieuw openen niet mogelijk" #, c-format msgid "Could not rename logfile as \"%s\": %m" -msgstr "" - -#, fuzzy, c-format -msgid "Unknown operation \"%s\"" -msgstr "Onbekende error" - -#, fuzzy, c-format -msgid "Unknown operation \"show %s\"" -msgstr "Onbekende error" +msgstr "Kon logbestand niet hernoemen naar \"%s\": %m" -#, fuzzy, c-format +#, c-format msgid "Unknown operation \"stats %s\"" -msgstr "Onbekende error" +msgstr "Onbekende bewerking \"%s statistieken\"" + +#, c-format +msgid "Unknown operation \"check %s\"" +msgstr "Onbekende bewerking \"controleer %s\"" -#, fuzzy, c-format +#, c-format msgid "Unknown operation \"usage %s\"" -msgstr "Onbekende error" +msgstr "Onbekende bewerking \"gebruik %s\"" msgid "Invalid IP/Port" msgstr "Ongeldige IP/Poort" @@ -5020,6 +6415,9 @@ msgid "Good bye" msgstr "Tot ziens" +msgid "Invalid command syntax" +msgstr "Ongeldige command syntax" + msgid "Query string missing" msgstr "Query string mist" @@ -5038,13 +6436,16 @@ msgid "Value missing" msgstr "Waarde mist" +msgid "Property cannot be changed" +msgstr "" + #, c-format msgid "Previous value was %s" -msgstr "" +msgstr "Vorige waarde was %s" #, c-format msgid "New value is %s" -msgstr "" +msgstr "Nieuwe waarde is %s" msgid "Value found and set" msgstr "Waarde gevonden en gezet" @@ -5058,12 +6459,13 @@ msgid "unterminated single-quoted string" msgstr "onafgesloten single-tekenreeks tussen aanhalingstekens" -msgid "Invalid command syntax" -msgstr "Ongeldige command syntax" - msgid "too many arguments in command" msgstr "Teveel argumenten in command" +#, c-format +msgid "un-parseable argument #%u in command" +msgstr "Onverwerkbaar argument #%u in opdracht" + msgid "Malformed command" msgstr "Commando ongeldig" @@ -5074,48 +6476,6 @@ msgid "Help: " msgstr "Help:" -msgid "Bitzi|Unknown" -msgstr "Onbekend" - -msgid "Bitzi|Unrated" -msgstr "Zonder waardering" - -msgid "Bitzi|Bitzi lookup failure" -msgstr "Bitzi lookup failure" - -msgid "Bitzi|Filesize mismatch" -msgstr "Bestandsgrootte komt niet overeen" - -msgid "Bitzi|Dangerous/Misleading" -msgstr "Gevaarlijk/Misleidend" - -msgid "Bitzi|Incomplete/Damaged" -msgstr "Incompleet/Beschadigd" - -msgid "Bitzi|Substandard" -msgstr "Sub-standaard" - -msgid "Bitzi|Overrated" -msgstr "Overgewaardeerd" - -msgid "Bitzi|Normal" -msgstr "Normaal" - -msgid "Bitzi|Underrated" -msgstr "Ondergewaardeerd" - -msgid "Bitzi|Complete" -msgstr "Compleet" - -msgid "Bitzi|Recommended" -msgstr "Aanbevolen" - -msgid "Bitzi|Best Version" -msgstr "Beste versie" - -msgid "No other data" -msgstr "Geen andere gegevens" - msgid "Filename" msgstr "Bestandsnaam" @@ -5141,11 +6501,17 @@ msgid "Tigertree" msgstr "Tigertree" -msgid "External metadata" -msgstr "Externe metadata" +msgid "Rescheduled for" +msgstr "Opnieuw ingepland voor" + +msgid "Restartable since" +msgstr "Opnieuw opstartbaar sinds" -msgid "Bitzi URL" -msgstr "Bitzi URL" +msgid "rescheduled for" +msgstr "opnieuw gepland voor" + +msgid "restartable since" +msgstr "opnieuw opstartbaar sinds" #, c-format msgid " (slot %u" @@ -5274,9 +6640,6 @@ msgid "Awaiting data" msgstr "Wacht op data" -msgid "Unknown error" -msgstr "Onbekende error" - #, c-format msgid "Retry in %us" msgstr "Opnieuw proberen in %us" @@ -5534,628 +6897,6 @@ msgid "RETURN" msgstr "TERUG" -msgid "Query hit" -msgstr "Query hit" - -msgid "DHT (truncated)" -msgstr "DHT (ingekort)" - -msgid "Routing errors" -msgstr "Errors dmv routeren" - -#, fuzzy -msgid "Routing table chunks" -msgstr "DHT routetabel buckets" - -msgid "Routing table message capacity" -msgstr "" - -#, fuzzy -msgid "Routing table message count" -msgstr "DHT routetabel verouderde nodes" - -msgid "Duplicates with higher TTL" -msgstr "Duplicaten met een hogere TTL" - -msgid "SPAM SHA1 database hits" -msgstr "SPAM SHA1 database hits" - -msgid "SPAM filename and size hits" -msgstr "SPAM bestandsnaam en grootte overeenkomsten" - -msgid "SPAM fake hits" -msgstr "SPAM namaak hits" - -msgid "SPAM duplicate hits" -msgstr "SPAM dubbele hits" - -msgid "SPAM dynamically caught hostile IP addresses" -msgstr "SPAM dynamisch opgevangen vijandige IP-adressen" - -msgid "SPAM dynamically caught hostile IP held" -msgstr "SPAM dynamisch opgevangen vijandige IP-adressen vastgehouden" - -msgid "SPAM spotted spamming IP addresses held" -msgstr "SPAM opgemerkte spammende IP adressen in bezit" - -msgid "Searches to local DB" -msgstr "Zoek opdracht tegen lokale DB" - -msgid "Hits on local DB" -msgstr "Zoek resultaten tegen lokale DB" - -msgid "Hits on local partial files" -msgstr "Hits op lokale gedeeltelijke bestanden" - -msgid "Hits on \"what's new?\" queries" -msgstr "Hits voor \"Wat is er nieuw?\" query's" - -msgid "Query hits received for local queries" -msgstr "Query hits ontvangen voor lokale opdrachten" - -msgid "Query hits received for OOB-proxied queries" -msgstr "Query hits ontvangen voor OOB geproxiede opdrachten" - -msgid "Queries requesting OOB hit delivery" -msgstr "Query hits die OOB bezorging verzoeken" - -msgid "Stripped OOB flag on queries" -msgstr "De OOB vlag verwijderd van query's" - -msgid "Duplicate OOB-proxied queries" -msgstr "Dubbele OOB geproxyde query's" - -msgid "OOB hits received for OOB-proxied queries" -msgstr "OOB resultaat ontvangen voor OOB geproxyde query's" - -msgid "OOB hits bearing alien IP address" -msgstr "OOB resultaten welke een vreemd IP-adres dragen" - -msgid "OOB hits ignored due to identified spamming address" -msgstr "OOB hits genegeerd vanwege een geconstateerde spam-adres" - -msgid "Unclaimed locally-generated OOB hits" -msgstr "Ongevraagde lokaal gegenereerde OOB resultaat" - -msgid "Partially claimed locally-generated OOB hits" -msgstr "Gedeeltelijke toegeeiste lokaal gegenereerde OOB resultaten" - -msgid "Spurious OOB hit claiming received" -msgstr "Vals OOB hit beweert te zijn ontvangen" - -msgid "Unrequested OOB hits received" -msgstr "Ongevraagde OOB overeenkomsten ontvangen" - -msgid "Received query hits for untracked queries" -msgstr "Ontvangen query hits voor niet getraceerd query's" - -msgid "Tracked query MUIDs" -msgstr "Getraceerde query MUID's" - -msgid "Compacted queries" -msgstr "Verkleinde zoekopdrachten" - -msgid "Bytes saved by compacting" -msgstr "Bytes bespaard door te verdichten" - -msgid "UTF8 queries" -msgstr "UTF8 zoekopdrachten" - -msgid "SHA1 queries" -msgstr "SHA1 zoekopdrachten" - -msgid "\"What's New?\" queries" -msgstr "\"Wat is er nieuw?\" query's" - -msgid "GUESS queries" -msgstr "GUESS query's" - -#, fuzzy -msgid "GUESS queries (0.2)" -msgstr "GUESS query's" - -msgid "GUESS cached query keys held" -msgstr "GUESS gecachte query sleutels in bezit" - -#, fuzzy -msgid "GUESS cached 0.2 hosts held" -msgstr "GUESS gecachte query sleutels in bezit" - -msgid "GUESS locally generated queries" -msgstr "GUESS lokaal gegenereerde query's" - -msgid "GUESS currently running queries" -msgstr "GUESS momenteel draaiende query's" - -msgid "GUESS hits received for locally generated queries" -msgstr "GUESS treffers ontvangen voor lokaal gegenereerde verzoeken" - -msgid "GUESS hosts queried" -msgstr "GUESS hosts gequeried" - -msgid "GUESS hosts sending back an acknowledgment" -msgstr "GUESS hosts welke een erkenning terugsturen" - -msgid "Broadcasted push messages" -msgstr "Broadcast \"push\" berichten" - -msgid "Push-proxy UDP relayed messages" -msgstr "Push-proxy doorgegeven berichten" - -msgid "Push-proxy TCP relayed messages" -msgstr "Push-proxy gerouteerde berichten" - -msgid "Push-proxy broadcasted messages" -msgstr "Push-proxy broadcast berichten" - -msgid "Push-proxy found un-proxied local route" -msgstr "Push-proxy vond een niet geproxyd lokale route." - -msgid "Push-proxy lookup failures" -msgstr "Push-proxy kon niet worden opgezocht" - -msgid "Push relayed via local route" -msgstr "Push wordt via lokale route doorgegeven" - -msgid "Push relayed via routing table" -msgstr "Door wordt via route tabel doorgegeven" - -msgid "Locally generated dynamic queries" -msgstr "Lokaal dynamisch gegenereerde opdrachten" - -msgid "Leaf-generated dynamic queries" -msgstr "Leaf dynamisch gegenereerde opdrachten" - -msgid "OOB-proxied leaf queries" -msgstr "OOB geproxiede leaf opdrachten" - -msgid "Fully completed dynamic queries" -msgstr "Volledig afgeronde dynamische opdrachten" - -msgid "Partially completed dynamic queries" -msgstr "Gedeeltelijk afgeronde dynamische opdrachten" - -msgid "Dynamic queries ended with no results" -msgstr "Dynamische opdracht beïndigd zonder resultaten" - -msgid "Fully completed dynamic queries getting late results" -msgstr "" -"Volledig afgeronde dynamische opdrachten die laatte resultaten ontvangen" - -msgid "Dynamic queries with partial late results" -msgstr "Dynamische opdrachten met gedeeltelijke verlate resultaten" - -msgid "Dynamic queries completed by late results" -msgstr "Dynamische opdrachten afgerond met verlate resultaten" - -msgid "Queries seen from GTKG" -msgstr "Opdrachten gezien vanuit GTKG" - -msgid "Queries seen from GTKG that were re-queries" -msgstr "Opdrachten gezien vanuit GTKG die opnieuw werden uitgevoerd" - -msgid "Queries advertising support of GGEP \"H\"" -msgstr "Opdrachten die ondersteuning voor GGEP \"H\" aangaven" - -msgid "GIV callbacks received" -msgstr "GIV terug verbinden ontvangen" - -msgid "GIV discarded due to no suitable download" -msgstr "GIV afgedankt aangezien er geen geschikte download is" - -msgid "QUEUE callbacks received" -msgstr "QUEUE terug verbinden ontvangen" - -msgid "QUEUE discarded due to no suitable download" -msgstr "QUEUE afgedankt aangezien er geen geschikte download is" - -msgid "UDP messages with bogus source IP" -msgstr "UDP berichten met ongeldig bron IP" - -msgid "Alien UDP messages (non-Gnutella)" -msgstr "Vreemde UDP berichten (niet-Gnutella)" - -msgid "Unprocessed UDP Gnutella messages" -msgstr "Niet verwerkte UDP Gnutella berichten" - -msgid "Compressed UDP messages enqueued" -msgstr "Gecomprimeerde UDP berichten in de wachtrij gezet" - -msgid "Compressed UDP messages received" -msgstr "Gecomprimeerde UDP berichten ontvangen" - -msgid "Uncompressed UDP messages due to no gain" -msgstr "UDP bericht gedecomprimeerd aangezien dit geen winst opleverde" - -msgid "Consolidated servers (after GUID and IP address linking)" -msgstr "Servers geconsolideerd (na het linken van GUID en IP adres)" - -msgid "Duplicate downloads found during server consolidation" -msgstr "Dubbele downloads gevonden tijdens het consolideren van server" - -msgid "Discovered server GUIDs" -msgstr "Server GUID's gevonden" - -msgid "Changed server GUIDs" -msgstr "Server GUID's veranderd" - -msgid "Detected GUID collisions" -msgstr "GUID collision gedetecteerd" - -msgid "Detected collisions with our own GUID" -msgstr "GUID botsing met onze eigen GUID gedetecteerd" - -msgid "GUID dynamically banned" -msgstr "" - -msgid "Firewalled node info for known hosts received in upload requests" -msgstr "Firewalled node info voor bekende host ontvangen in een upload verzoek" - -msgid "Revitalized PUSH routes" -msgstr "PUSH routes gerevitaliseerd" - -msgid "Collected new PUSH proxies from other query hits" -msgstr "Nieuwe PUSH proxy's verzameld van andere query hits" - -msgid "Attempted download resource switching on completion" -msgstr "Gepoogd om tijdens voltooiing de download resource over te schakelen" - -msgid "Attempted download resource switching after error" -msgstr "Gepoogd om na een fout van download resource over te schakelen" - -msgid "Successful download resource switching (all kind)" -msgstr "Succesvol van download resource overgeschakeld (alle types)" - -msgid "Successful download resource switching between plain files" -msgstr "Succesvol van download resource overgeschakeld tussen gewone bestanden" - -msgid "Successful download resource switching after error" -msgstr "Succesvol van download resource overgeschakeld na een fout" - -msgid "Actively queued after resource switching attempt" -msgstr "Na poging toe overschakelen van download resource actief gequeued" - -msgid "Sunk HTTP reply data on error codes" -msgstr "HTTP reply data verzonken bij error codes" - -msgid "Ignored downloaded data" -msgstr "Gedownloade gegevens genegeerd" - -msgid "Ignoring requested after data mismatch" -msgstr "Verzoek voor gegevens wordt genegeerd na niet overeenkomen" - -msgid "Ignoring requested to preserve connection" -msgstr "Verzoek tot bewaren van de connectie wordt genegeerd" - -msgid "Ignoring requested due to aggressive swarming" -msgstr "Het verzochte wordt genegeerd door te agressieve swarming" - -msgid "Ignoring refused (data too large or server too slow)" -msgstr "Negeren geweigerd (data te groot of server te langzaam)" - -msgid "Client resource switching (all detected)" -msgstr "Overschakelen van client resource (alle gedetecteerd)" - -msgid "Client resource switching between plain files" -msgstr "Overschakelen van client resource tussen gewone bestanden" - -msgid "Client follow-up request after HTTP error was returned" -msgstr "Opvolgende verzoek van client nadat een HTTP error was teruggeven" - -msgid "PARQ client resource switching in slots (SHA-1 based)" -msgstr "Overschakelen van PARQ client resource in sporen (SHA-1 gebasseerd)" - -msgid "PARQ client retry-after violation" -msgstr "PARQ client retry-after schending" - -msgid "PARQ client kicked out after too many retry-after violations" -msgstr "PARQ client eruit geschopt na teveel retry-after schendingen" - -msgid "PARQ upload slot limit overrides" -msgstr "PARQ upload slot limiet overrides" - -msgid "PARQ quick upload slots granted" -msgstr "PARQ quick upload sporen toegekend" - -msgid "PARQ QUEUE sending attempts" -msgstr "PARQ QUEUE pogingen verzenden" - -msgid "PARQ QUEUE messages sent" -msgstr "PARQ QUEUE berichten verstuurd" - -msgid "PARQ QUEUE follow-up requests received" -msgstr "PARQ QUEUE opvolgend verzoek ontvangen" - -msgid "Launched SHA-1 file verifications" -msgstr "SHA-1 bestandsverificatie begonnen" - -msgid "Launched TTH file verifications" -msgstr "TTH bestandsverificatie begonnen" - -msgid "Bitzi tickets held" -msgstr "Bitzi tickets vastgehouden" - -msgid "Re-seeding of orphan downloads through query hits" -msgstr "Re-seeding of orphan-downloads dmv query hits" - -msgid "Re-seeding of orphan downloads through upload requests" -msgstr "Orphan-downloads worden opnieuw geseed door upload verzoek" - -msgid "DHT estimated amount of nodes" -msgstr "DHT geschat aantal nodes" - -msgid "DHT k-ball theoretical frontier (bits)" -msgstr "DHT k-ball theoretische grens (bits)" - -msgid "DHT k-ball furthest frontier (bits)" -msgstr "DHT k-ball verste grens (bits)" - -msgid "DHT k-ball closeest frontier (bits)" -msgstr "DHT k-ball dichtstbijzijnde grens (bits)" - -msgid "DHT routing table buckets" -msgstr "DHT routetabel buckets" - -msgid "DHT routing table leaves" -msgstr "DHT routetabel leaves" - -msgid "DHT routing table maximum depth" -msgstr "DHT routetabel maximum diepte" - -msgid "DHT routing table good nodes" -msgstr "DHT route tabel goede nodes" - -msgid "DHT routing table stale nodes" -msgstr "DHT routetabel verouderde nodes" - -msgid "DHT routing table pending nodes" -msgstr "DHT route tabel wachtende nodes" - -msgid "DHT routing table evicted nodes" -msgstr "DHT routetabel verdreven nodes" - -msgid "DHT routing table evicted firewalled nodes" -msgstr "DHT routetabel verdreven firewalled-nodes" - -msgid "DHT routing table evicted nodes due to quota" -msgstr "DHT route tabel nodes verstoten vanwege quota" - -msgid "DHT routing table promoted pending nodes" -msgstr "DHT routetabel gepromoveerde wachtende nodes" - -msgid "DHT routing table pinged promoted nodes" -msgstr "DHT route tabel gepromoveerde nodes gepinged" - -msgid "DHT routing table rejected node due to bucket network quota" -msgstr "DHT routing tabel node afgewezen door bucket netwerk quota" - -msgid "DHT routing table rejected node due to global network quota" -msgstr "DHT routing tabel node afgewezen door globale netwerk quota" - -msgid "DHT completed bucket refreshes" -msgstr "DHT afgeronde bucket verversingen" - -msgid "DHT forced bucket refreshes" -msgstr "DHT geforceerde bucket verversingen" - -msgid "DHT forced bucket merges" -msgstr "DHT geforceerde bucket samenvoegingen" - -msgid "DHT denied non-splitable bucket refresh" -msgstr "DHT niet splitsbare bucket vernieuwing geweigerd" - -msgid "DHT initiated bucket alive checks" -msgstr "DHT geïnitieerde bucket in leven controles" - -msgid "DHT alive pings sent to good nodes" -msgstr "DHT in leven pings verzonden aan goede nodes" - -msgid "DHT alive pings sent to stale nodes" -msgstr "DHT in leven pings verstuurd aan verouderde nodes" - -msgid "DHT alive pings sent to shutdowning nodes" -msgstr "DHT in leven pings verstuurd aan afsluitende nodes" - -msgid "DHT alive pings avoided" -msgstr "DHT alive pings voorkomen" - -msgid "DHT alive pings skipped" -msgstr "DHT alive pings overgeslagen" - -msgid "DHT revitalized stale nodes on RPC reply" -msgstr "DHT verouderde nodes gerevitaliseerd n.a.v. RPC antwoord" - -msgid "DHT value store rejected on IP/network quota grounds" -msgstr "DHT opslaan waarde geweigerd op basis van IP/netwerk quota" - -msgid "DHT value store rejected on creator validation grounds" -msgstr "DHT opslaan waarde geweigerd op basis van schepper" - -msgid "DHT nodes rejected during lookup based on network quota" -msgstr "DHT nodes geweigerd tijdens lookup op basis van netwerk quota" - -msgid "DHT nodes rejected during lookup based on suspicious proximity" -msgstr "DHT nodes geweigerd tijdens lookup op basis van verdachte nabijheid" - -msgid "DHT nodes rejected during lookup based on frequency divergence" -msgstr "DHT nodes geweigerd tijdens lookup op basis van frequentie divergentie" - -msgid "DHT keys held" -msgstr "DHT sleutels vastgehouden" - -msgid "DHT cached keys held" -msgstr "DHT gecachte sleutels vastgehouden" - -msgid "DHT values held" -msgstr "DHT waardes in bezit" - -msgid "DHT cached KUID targets held" -msgstr "DHT gecachte KUID doelen in bezit" - -msgid "DHT cached closest root nodes" -msgstr "DHT gecachte dichtstbijzijnde root nodes" - -msgid "DHT cached roots exact hits" -msgstr "DHT gecachte roots exacte hits" - -msgid "DHT cached roots approximate hits" -msgstr "DHT gecachte roots bijna gelijke hits" - -msgid "DHT cached roots misses" -msgstr "DHT gecachte roots gemist" - -msgid "DHT cached roots lookups within k-ball" -msgstr "DHT gecachte roots lookups binnen de k-ball" - -msgid "DHT cached roots contact address refreshed" -msgstr "DHT gecachte roots contact adres ververst" - -msgid "DHT cached security tokens held" -msgstr "DHT gecachte security tokens in bezit" - -msgid "DHT cached security tokens hits" -msgstr "DHT gecachte security tokens hits" - -msgid "DHT stable node information held" -msgstr "DHT stabiele node informatie vastgehouden" - -msgid "DHT local hits on value lookups" -msgstr "DHT lokale hits op lookup van waarde" - -msgid "DHT local hits returning values from cached keys" -msgstr "DHT lokale hits waardes geretourneerd van gecachte sleutels" - -msgid "DHT returned expanded values" -msgstr "DHT geretourneerde geëxpandeerde waardes" - -msgid "DHT returned values as secondary keys" -msgstr "DHT geretourneerde waardes als secundaire sleutels" - -msgid "DHT claimed values via secondary keys" -msgstr "DHT waardes via secundaire sleutels geclaimed" - -msgid "DHT returned cached expanded values" -msgstr "DHT geretourneerde gecachte geëxpandeerde waardes" - -msgid "DHT returned cached values as secondary-keys" -msgstr "DHT geretourneerde gecachte waardes als secundaire sleutels" - -msgid "DHT claimed cached values via secondary keys" -msgstr "DHT gecachte waardes via secundaire sleutels geclaimd" - -msgid "DHT successfully received value publications" -msgstr "DHT succesvol ontvangen waarde publicaties" - -msgid "DHT successfully received value removals" -msgstr "DHT succesvol ontvangen waarde verwijderingen" - -msgid "DHT replication of stale value avoided" -msgstr "DHT replicatie van verouderde waardes voorkomen" - -msgid "DHT replication of held values" -msgstr "DHT replicatie van vastgehouden waardes" - -msgid "DHT republishing of held values" -msgstr "DHT opnieuw gepubliceerde vastgehouden waardes" - -msgid "DHT secondary-key value fetch issued" -msgstr "DHT secundaire sleutel waarde ophalen uitgevaardigd" - -msgid "DHT duplicate values returned in lookups" -msgstr "DHT dubbele waardes teruggegeven in lookups" - -msgid "DHT detected KUID collisions" -msgstr "DHT KUID botsingen gedetecteerd" - -msgid "DHT detected collisions with our own KUID" -msgstr "DHT botsingen gedetecteerd met onze eigen KUID" - -msgid "DHT detected KUID mismatches on RPC reply" -msgstr "DHT verkeerde KUID combinaties gedetecteerd n.a.v. RPC reply" - -msgid "DHT caching attempts" -msgstr "DHT cache pogingen" - -msgid "DHT caching ended successfully" -msgstr "DHT cache poging succesvol afgerond" - -msgid "DHT caching partially completed" -msgstr "DHT cache pogingen gedeeltelijk afgerond" - -msgid "DHT key-offloading checks after discovering new closest node" -msgstr "" -"DHT verlading van sleutel checks na het vinden van nieuwe dichtstbijzijnde " -"node" - -msgid "DHT keys selected for offloading" -msgstr "DHT sleutels geselecteert voor verlading van sleutels" - -msgid "DHT key-offloading attempts" -msgstr "DHT sleutel verlading pogingen" - -msgid "DHT key-offloading ended successfully" -msgstr "DHT sleutel verladingen succesvol afgerond" - -msgid "DHT key-offloading partially completed" -msgstr "DHT sleutel verladingen gedeeltelijk afgerond" - -msgid "DHT values successfully offloaded" -msgstr "DHT waardes succesvol gelost" - -msgid "DHT publishing attempts" -msgstr "DHT publicatie pogingen" - -msgid "DHT publishing ended successfully (all roots)" -msgstr "DHT publicaties succesvol afgerond (alle roots)" - -msgid "DHT publishing partially completed (root subset only)" -msgstr "DHT publicaties gedeeltelijk afgerond (alleen root subset)" - -msgid "DHT publishing ending with proper value presence" -msgstr "DHT publicaties geëindigd met juiste waarde aanwezig" - -msgid "DHT value republishing occurring too late (after expiry)" -msgstr "DHT waarde herpublicaties te laat opgetreden (na afloop)" - -msgid "DHT publishing to self" -msgstr "DHT publicatie aan onszelf" - -msgid "DHT background publishing completion attempts" -msgstr "DHT achtergrond publicatie afrond pogingen" - -msgid "DHT background publishing completion showing improvements" -msgstr "DHT achtergrond publicatie afrond poging succesvol afgerond" - -msgid "DHT background publishing completion successful (all roots)" -msgstr "DHT achtergrond publicaties succesvol afgerond (alle roots)" - -msgid "DHT SHA1 data type collisions" -msgstr "DHT SHA1 data type botsingen" - -msgid "DHT lookup path passively protected against attack" -msgstr "DHT lookup pad passief beveiligd tegen aanvallen" - -msgid "DHT lookup path actively protected against attack" -msgstr "DHT lookup pad actief beveiligd tegen aanvallen" - -msgid "DHT alt-loc lookups issued" -msgstr "DHT alt-loc lookups geïnitieerd" - -msgid "DHT push-proxy lookups issued" -msgstr "DHT push-proxy lookup verzocht" - -msgid "DHT successful alt-loc lookups" -msgstr "DHT succesvolle alt-loc lookups" - -msgid "DHT successful push-proxy lookups" -msgstr "DHT succesvolle push-proxy lookups" - -msgid "DHT successful node push-entry lookups" -msgstr "DHT succesvolle node push-entry lookups" - -msgid "DHT re-seeding of orphan downloads" -msgstr "DHT opnieuw seeden van orphan-downloads" - msgid "node" msgid_plural "nodes" msgstr0 "node" @@ -6382,12 +7123,6 @@ msgid "Bind to this address" msgstr "Koppel aan dit adres" -msgid "Bitzi Metadata" -msgstr "Bitzi Metadata" - -msgid "Bitzi metadata" -msgstr "Bitzi Metadata" - msgid "Browse Host" msgstr "Host bladeren" @@ -6475,7 +7210,7 @@ msgstr "Voorwaarde: Als bestandsnaam overeenkomt" msgid "Condition: If result has flags" -msgstr "Voorwaarde: Als resultaat de flag heeft" +msgstr "Voorwaarde: Als resultaat de vlag heeft" msgid "Condition: If urn:sha1 matches" msgstr "Voorwaarde: Als urn:sha1 overeenkomt" @@ -6683,7 +7418,7 @@ msgstr "Voldoende \"file descriptors\"" msgid "Enough min # of connections" -msgstr "Genoeg min aantal verbindingen" +msgstr "Genoeg min aantal connecties" msgid "Enough physical memory" msgstr "Voldoende physiek geheugen" @@ -6734,7 +7469,7 @@ msgstr "Eerste stuk grootte" msgid "Flags" -msgstr "Vlag" +msgstr "Vlaggen" msgid "Force external IPv_4 address to" msgstr "Forceer extern IPv_4 adres op" @@ -6950,7 +7685,7 @@ msgstr "Leaf verkeer" msgid "Legacy connections" -msgstr "Legacy verbindingen" +msgstr "Legacy connecties" msgid "Library # of files" msgstr "Bibliotheek aantal bestanden" @@ -6989,7 +7724,7 @@ msgstr "Max _TTL" msgid "Max connections allowed per unique vendor" -msgstr "Maximum aantal verbindingen toegestaan per unieke leverancier" +msgstr "Maximum aantal connecties toegestaan per unieke vendor" msgid "Max hard TTL limit (hop+ttl) on message" msgstr "Maximum harde TTL limiet (hop+ttl) voor berichten" @@ -7208,7 +7943,7 @@ msgstr "Bevestig aub:" msgid "Prefer _compressed connections" -msgstr "Geef voorkeur aan gecomprimeerde verbindingen" +msgstr "Geef voorkeur aan gecomprimeerde connecties" msgid "Preferences" msgstr "Voorkeuren" @@ -8103,17 +8838,20 @@ msgid "Disabled stealing of outgoing HTTP bandwidth." msgstr "Gebruiken van uitgaande HTTP bandbreedte uitgeschakeld" -msgid "Splitting ougoing HTTP bandwidth evenly." +msgid "Splitting outgoing HTTP bandwidth evenly." msgstr "HTTP bandbreedte wordt evenredig verdeeld." msgid "Capping HTTP outgoing bandwidth." msgstr "Uitgaande HTTP bandbreedte afgetopt" msgid "Port mapping possible through UPnP or NAT-PMP." -msgstr "Poort mapping mogelijk via UPnP of NAT-PMP." +msgstr "Poort toewijzing is mogelijk via UPnP of NAT-PMP." -msgid "Port mapping configured through UPnP or NAT-PMP." -msgstr "Poort mapping geconfigureerd via UPnP of NAT-PMP." +msgid "Port mapping configured through NAT-PMP." +msgstr "Poort toewijzing geconfigureerd d.m.v. NAT-PMP." + +msgid "Port mapping configured through UPnP." +msgstr "Poort toewijzing geconfigureerd d.m.v. UPnP." msgid "Enable UPnP" msgstr "Gebruik UPnP" @@ -8127,14 +8865,14 @@ msgid "Pipelining max chunk size" msgstr "Pipelining max chunk grootte" -msgid "Enable upload of patial files deemed rare" +msgid "Enable upload of partial files deemed rare" msgstr "Upload zeldzame gedeeltelijke bestanden" msgid "Enable GUESS (additional querying)" msgstr "Gebruik GUESS (extra queryen)" msgid "Issue GUESS queries as well" -msgstr "Geef ook GUESS queries uit" +msgstr "Geef ook GUESS query's uit" msgid "Bandwidth limits for GUESS queries" msgstr "Bandbreedte limiet voor GUESS verzoek" @@ -8197,6 +8935,9 @@ msgid "Discard results bearing an alien IP address" msgstr "Resultaten van een vreemd IP adres negeren" +msgid "Discard results bearing a banned GUID" +msgstr "Negeer resultaten die een verbannen GUID dragen" + msgid "Restart session-only searches with pending downloads" msgstr "Start alleen-sessie zoekopdracht met wachtende downloads opnieuw" @@ -8212,8 +8953,24 @@ msgid "Relayed queries remembered" msgstr "Doorgegeven query's onthouden" -msgid "Not in database" -msgstr "Niet in de database" +msgid "Allow unused Gnutella outgoing bandwidth to supersede hint" +msgstr "" +"Geef ongebruikte uitgaande Gnutella bandbreedte voorrang boven aanwijzing" + +msgid "Display GUESS statistics" +msgstr "Toon GUESS statistieken" + +msgid "Mapping lease time" +msgstr "Toewijzing lease tijd" + +msgid "G2 hubs" +msgstr "G2-hubs" + +msgid "Enable the G2 network" +msgstr "Activeer het G2 netwerk" + +msgid " G2, " +msgstr "G2," msgid "owned" msgstr "eigenaar" @@ -8236,9 +8993,6 @@ msgstr0 "%u resultaat genegeerd" msgstr1 "%u resultaten genegeerd" -msgid "Query queued..." -msgstr "Query in de wacht gezet..." - #, c-format msgid "%u term counted" msgid_plural "%u terms counted" @@ -8280,6 +9034,9 @@ msgid "_Auto-hide leaf traffic stats" msgstr "Leaf verkeer statistieken _automatisch verbergen" +msgid "Glossary" +msgstr "" + msgid "_Search" msgstr "Zoek" @@ -8292,9 +9049,6 @@ msgid "CPU overloaded" msgstr "CPU overbelast" -msgid "Splitting outgoing HTTP bandwidth evenly." -msgstr "HTTP bandbreedte wordt evenredig verdeeld." - msgid "Connect to" msgstr "Verbind met" @@ -8305,17 +9059,17 @@ msgstr "Probeer tenminste" msgid "and allow at most" -msgstr "en sta maximaal toe" +msgstr "en maximaal" msgid "total connections up." -msgstr "totaal aantal verbonden connecties." +msgstr "connecties aan te houden." msgid "Use up to " msgstr "Gebruik maximaal" msgid "connections to connect more quickly while not all slots are used." msgstr "" -"verbindingen om sneller te verbinden zolang niet alle sloten in gebruik zijn." +"connecties om sneller te verbinden zolang niet alle sloten in gebruik zijn." msgid "" "The Global Unique IDentifier associated with this node. It's used for " @@ -8339,12 +9093,18 @@ msgid "Served " msgstr "Geserveerd" -msgid "BH HTML served" -msgstr "BH HTML geserveerd" +msgid "G2 served" +msgstr "G2 afgehandeld" msgid " / " msgstr " / " +msgid "G2" +msgstr "G2" + +msgid "BH HTML served" +msgstr "BH HTML geserveerd" + msgid "BH HTML" msgstr "BH HTML" @@ -8403,7 +9163,7 @@ msgstr "IPv_6 instellingen" msgid "Port Mapping" -msgstr "Poort Mapping" +msgstr "Poort Toewijzing" msgid "" "This option can give performance boosts to those on a large network with " @@ -8429,10 +9189,7 @@ msgstr "Gedistributeerde hash table (DHT)" msgid "Maximum percentage of connection slots a vendor can occupy." -msgstr "Maximum percentage verbindingen dat een leverancier kan bezetten." - -msgid "Global DHT ougoing traffic" -msgstr "Globale DHT uitgaand verkeer" +msgstr "Maximum percentage connecties dat een vendor kan bezetten." msgid "attempts" msgstr "pogingen" @@ -8443,9 +9200,6 @@ msgid "_Remove directory" msgstr "Verwijder directory" -msgid "Enable upload of partial files deemed rare" -msgstr "Upload zeldzame gedeeltelijke bestanden" - msgid "Minimum chunk _size" msgstr "Minimale stuk grootte" @@ -8480,7 +9234,7 @@ msgstr "Land:" msgid "Vendor:" -msgstr "Maker:" +msgstr "Vendor:" msgid "Move the cursor over a row to see details." msgstr "Beweeg de cursor over een rij om de details te zien" @@ -8492,6 +9246,9 @@ msgid "Reverse lookup in progress..." msgstr "Bezig met omgekeerd opzoeken..." +msgid "UDP (semi-reliable)" +msgstr "UDP (semibetrouwbaar)" + msgid "Size:" msgstr "Grootte:" @@ -8504,21 +9261,23 @@ msgid "Valid regular" msgstr "Regulier geldig" -#, fuzzy msgid "Fresh IPv4 ultra" -msgstr "Verse ultra" +msgstr "Verse IPv4 ultra" -#, fuzzy msgid "Valid IPv4 ultra" -msgstr "Ultra geldig" +msgstr "Geldige IPv4 ultra" -#, fuzzy msgid "Fresh IPv6 ultra" -msgstr "Verse ultra" +msgstr "Verse IPv6 ultra" -#, fuzzy msgid "Valid IPv6 ultra" -msgstr "Ultra geldig" +msgstr "Geldige IPv6 ultra" + +msgid "Fresh G2 hub" +msgstr "Verse G2-hub" + +msgid "Valid G2 hub" +msgstr "Geldige G2-hub" msgid "Unstable" msgstr "Instabiel" @@ -8526,21 +9285,17 @@ msgid "Alien" msgstr "Vreemd" -#, fuzzy msgid "GUESS (IPv4 running)" -msgstr "GUESS (draaid)" +msgstr "GUESS (IPv4 draaiend)" -#, fuzzy msgid "GUESS (IPv4 introductions)" -msgstr "GUESS (introducties)" +msgstr "GUESS (IPv4 introducties)" -#, fuzzy msgid "GUESS (IPv6 running)" -msgstr "GUESS (draaid)" +msgstr "GUESS (IPv6 draaiend)" -#, fuzzy msgid "GUESS (IPv6 introductions)" -msgstr "GUESS (introducties)" +msgstr "GUESS (IPv6 introducties)" msgid "gtk-gnutella: Click to minimize/restore" msgstr "gtk-gnutella: Klik om te minimaliseren / herstellen" @@ -8565,6 +9320,11 @@ "bestand niet laden. Lees in plaats hiervan de <a href=\"http://gtk-gnutella." "sourceforge.net/?page=faq\">FAQ online</a>.</p></body></html>" +msgid "" +"<html><head><title>Glossary</title></head><body><p>The glossary document " +"could not be loaded.</p></body></html>" +msgstr "" + #, c-format msgid "%lu file shared (%s)" msgid_plural "%lu files shared (%s)" @@ -8596,6 +9356,9 @@ msgid "UNKNOWN STATUS" msgstr "STATUS NIET BEKEND" +msgid "g2" +msgstr "g2" + msgid "busy" msgstr "bezig" @@ -8638,6 +9401,12 @@ msgstr "Vervalt in deze sessie" #, c-format +msgid " %u download" +msgid_plural " %u downloads" +msgstr0 " %u download" +msgstr1 " %u downloads" + +#, c-format msgid "" "%u %s (%u skipped, %u ignored, %u hidden, %u auto-d/l, %u %s) Hits: %u (%u " "TCP, %u UDP)" @@ -8655,6 +9424,68 @@ msgstr0 "dupl." msgstr1 "dupl." +msgid "No GUESS queries run yet" +msgstr "Nog geen GUESS query's gedraaid" + +#, c-format +msgid " previous took %s querying %zu %s with %zu %s kept" +msgstr "" +"vorige duurde %s tijdens het queryen van %zu %s waarbij %zu %s behouden" + +msgid "host" +msgid_plural "hosts" +msgstr0 "host" +msgstr1 "hosts" + +msgid "hit" +msgid_plural "hits" +msgstr0 "treffer" +msgstr1 "treffers" + +#, c-format +msgid "GUESS %s Total: %zu %s (%s %s, %s kept, %s queries, %s keys)%s" +msgstr "" +"GUESS %s Totaal: %zu %s (%s %s, %s behouden, %s query's, %s sleutels)%s" + +msgid "idle" +msgstr "niet aan het werk" + +msgid "query" +msgid_plural "queries" +msgstr0 "query" +msgstr1 "query's" + +#, c-format +msgid "" +"GUESS %s %s (%zu %s, %zu kept, %s queries, %s keys) Pool: %zu %s, (%zu+" +"%zu)/%zu queried, %zu %s (%.2f%%), %zu reached, %zu pending, %zu %s%s%s" +msgstr "" +"GUESS %s %s (%zu %s, %zu behouden, %s query's, %s sleutels) Pool: %zu %s, " +"(%zu+%zu)/%zu gequeryd, %zu %s (%.2f%%), %zu bereikt, %zu afwachtend, %zu %s" +"%s%s" + +msgid "loose" +msgstr "losse" + +msgid "bounded" +msgstr "begrensde" + +msgid "ack" +msgid_plural "acks" +msgstr0 "ack" +msgstr1 "acks" + +msgid "hop" +msgid_plural "hops" +msgstr0 "hop" +msgstr1 "hops" + +msgid " (load pending)" +msgstr "(lading verwacht)" + +msgid " (end if starving)" +msgstr "(stoppen wanneer uitgehongerd)" + msgid "Passive" msgstr "Passief" @@ -8668,13 +9499,14 @@ "in een nieuw XML formaat en het oude bestand is hernoemd naar\n" "%s" -#, fuzzy, c-format +#, c-format msgid "" "could not rename %s as %s: %m\n" "The XML file will not be used unless this problem is resolved." msgstr "" -"kon \"%s\"niet hernomen naar \"%s\": %s\n" -"Het XML bestand zal niet worden gebruikt totdat dit probleem is opgelost." +"kon %s niet hernoemen naar %s: %m\n" +"Zolang het probleem niet is opgelost zal het XML bestand niet worden " +"gebruikt." msgid "<unparsed>" msgstr "<niet verwerkt>" @@ -8777,6 +9609,16 @@ msgid "Partial" msgstr "Gedeeltelijk" +#, c-format +msgid "%s %.2f%%" +msgstr "%s %.2f%%" + +msgid "Available" +msgstr "Beschikbaar" + +msgid "Last modification" +msgstr "Laatst aangepast" + msgid "Latinized" msgstr "Latinized" @@ -8792,11 +9634,14 @@ msgid "Hostname" msgstr "Hostname" +msgid "banned" +msgstr "verbannen" + msgid "Servent ID" msgstr "Servent ID" msgid "Vendor" -msgstr "Maker" +msgstr "Vendor" msgid "Browsable" msgstr "Bladerbaar" @@ -8850,24 +9695,12 @@ msgid "The URN in the search text is invalid." msgstr "De URN in het zoekveld is ongeldig." -msgid "SHA-1 is unknown." -msgstr "SHA-1 onbekend." - -msgid "No Bitzi ticket requested yet." -msgstr "Nog geen Bitzi ticket verzocht." - -msgid "Not in Bitzi database." -msgstr "Niet in de Bitzi database." - msgid "Encoding" msgstr "Encoding" msgid "#" msgstr "#" -msgid "Metadata" -msgstr "Metagegevens" - msgid "Never" msgstr "Nooit" @@ -8905,6 +9738,12 @@ msgid "*** CPU OVERLOADED -- TRYING TO SAVE CYCLES ***" msgstr "*** CPU OVERBELAST --- ER WORDT GEPOOGD KRACHT TE BESPAREN ***" +msgid "*** KERNEL BUFFER SHORTAGE -- LIMITING TCP CONNECTIONS ***" +msgstr "*** KERNEL BUFFER TEKORT -- TCP CONNECTIES WORDEN GELIMITEERD ***" + +msgid "*** NO LISTENING TCP SOCKET -- NO INBOUND CONNECTIONS ***" +msgstr "" + msgid "*** UPLOADS STALLING, BANDWIDTH SHORTAGE? ***" msgstr "*** UPLOADS BLIJVEN HANGEN, TE KORT AAN BANDBREEDTE? ***" @@ -8945,12 +9784,6 @@ msgstr "%u wachtende" #, c-format -msgid "%u/%u connection" -msgid_plural "%u/%u connections" -msgstr0 "%u/%u verbinding" -msgstr1 "%u/%u verbindingen" - -#, c-format msgid "%u/%u upload" msgid_plural "%u/%u uploads" msgstr0 "%u/%u upload" @@ -8965,6 +9798,9 @@ msgid "Queue frozen" msgstr "Wachtrij bevroren" +msgid "Internal" +msgstr "" + msgid "Select a property to see its description." msgstr "Selecteer een eigenschap om de omschrijving te bekijken." @@ -9029,45 +9865,3 @@ msgid "Sent QUEUE, waiting for headers..." msgstr "QUEUE verstuurd, wacht op koppen..." - -#~ msgid "" -#~ "Maximum number of Query MUIDs to track. This allows mapping MUIDs of " -#~ "Query Hits to the original search term. In the worst case this causes " -#~ "about 300 bytes per Query of memory overhead." -#~ msgstr "" -#~ "Maximum aantal te volgen Query MUID's . Hiermee is is het mogelijk om " -#~ "MUID's van Query Hits in te delen bij de orginele zoek term. Dit kan " -#~ "maximaal 300 bytes per Query aan extra geheugen betekenen." - -#~ msgid "" -#~ "Remote nodes supporting media type filtering will apply your query " -#~ "specifically on their Windows archive / program files such as ZIP or EXE " -#~ "files and other Windows-centric extensions." -#~ msgstr "" -#~ "Externe nodes die media type filtering ondersteunen zullen uw query " -#~ "specifiek op hun Windows archief / programma bestanden uitvoeren zoals " -#~ "ZIP, EXE en andere Windows-specifieke extensies." - -#~ msgid "Windows archives" -#~ msgstr "Windows archieven" - -#~ msgid "Linux archives" -#~ msgstr "Linux archieven" - -#~ msgid "UNIX archives" -#~ msgstr "UNIX archieven" - -#~ msgid "Index" -#~ msgstr "Index" - -#~ msgid "Seaerch Media Type" -#~ msgstr "Zoek Media Type" - -#~ msgid "Banned: %s" -#~ msgstr "Verbannen: %s" - -#~ msgid "Banned for %s" -#~ msgstr "Verbannen voor %s" - -#~ msgid "Connecting" -#~ msgstr "Bezig met verbinden"
View file
gtk-gnutella-0.98.2.tar.bz2/po/tr.po -> gtk-gnutella-1.1.9.tar.bz2/po/tr.po
Changed
@@ -1,35 +1,34 @@ -# $Id$ -# -# Turkish translations for gtk-gnutella package. -# Copyright (C) 2000-2001 Yann Grossel. -# Copyright (C) 2001-2010 Raphaël Manfredi. -# This file is distributed under the same license as the gtk-gnutella package. -# Uğur Çetin <ugur.jnmbk@gmail.com>, 2006. +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Raphael Manfredi +# This file is distributed under the same license as the PACKAGE package. # +# Translators: +# mauron, 2013 +# mauron, 2013-2015 +# Uğur Çetin <ugur.jnmbk@gmail.com>, 2006 msgid "" msgstr "" -"Project-Id-Version: gtk-gnutella 0.96.7u\n" +"Project-Id-Version: gtk-gnutella\n" "Report-Msgid-Bugs-To: gtk-gnutella-devel@lists.sf.net\n" -"POT-Creation-Date: 2011-11-22 18:27+0100\n" -"PO-Revision-Date: 2011-12-11 12:04+0100\n" -"Last-Translator: \n" -"Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\n" +"POT-Creation-Date: 2016-03-06 08:49+0100\n" +"PO-Revision-Date: 2016-02-15 08:28+0000\n" +"Last-Translator: Jeroen Asselman <jeroen@asselman.com>\n" +"Language-Team: Turkish (http://www.transifex.com/gtk-gnutella/gtk-gnutella/" +"language/tr/)\n" +"Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: tr\n" -"Plural-Forms: nplurals=1; plural=0\n" -"X-Generator: KBabel 1.11.4\n" -"X-Poedit-Language: Turkish\n" -"X-Poedit-Country: TURKEY\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" -#, c-format -msgid "%s%s%s%s%s fps, %s kbps" -msgstr "%s%s%s%s%s fps, %s kbps" - -# to be reviewed. -msgid "times|x" -msgstr "kez|x" +msgid "Harmful version banned, upgrade required" +msgstr "Zararlı sürüm yasaklandı, güncelleme gerekiyor" + +msgid "Connection refused" +msgstr "Bağlantı reddedildi" + +msgid "Use an open Gnutella or G2 servent" +msgstr "Açık bir Gnutella ya da G2 istemcisi kullan" #, c-format msgid "Stopped, will retry with TLS (%s)" @@ -41,7 +40,7 @@ #, c-format msgid "Too many attempts (%u times)" -msgstr "Çok fazla deneme (%u kez)" +msgstr "Çok fazla deneme (%u defa)" msgid "Requeued due to no push-proxy" msgstr "İtme vekili bulunamadığından kuyruğa eklendi" @@ -56,15 +55,15 @@ msgstr "Kopya indirme" msgid "Nothing else to switch to" -msgstr "Geçilecek bir şey yok" +msgstr "Geçilecek başka bir şey yok" #, c-format msgid "Switching (after error) to \"%s\"" msgstr "\"%s\" değerine geçiş (hatadan sonra)" #, c-format -msgid " at %s - rescheduled for %s%s #%u" -msgstr " şu saatte: %s - şu vakte ertelendi: %s%s #%u" +msgid " at %s" +msgstr " şu saatte: %s" msgid "Suspended (SHA1 checking)" msgstr "Askıya alındı (SHA1 kontrolü)" @@ -88,6 +87,9 @@ msgid "Download queue is frozen" msgstr "İndirme kuyruğu dondurulmuş" +msgid "Network buffer shortage" +msgstr "Şebeke arabelleği yetersizliği" + msgid "No download slot (start)" msgstr "İndirme oluğu yok (başlangıç)" @@ -97,6 +99,9 @@ msgid "Connection failed" msgstr "Bağlantı başarısız" +msgid "SHA1 mismatch detected" +msgstr "SHA1 uyumsuzluğu tespit edildi" + msgid "Waiting for server PROX publishing" msgstr "Sunucunun PROX yayınlaması bekleniyor" @@ -112,17 +117,20 @@ #, c-format msgid "No direct connection yet (%u retry)" msgid_plural "No direct connection yet (%u retries)" -msgstr0 "Henüz doğrudan bağlantı yok (%u yeni deneme)" +msgstr0 "Henüz doğrudan bağlantı yok (%u yeni teşebbüs)" +msgstr1 "Henüz doğrudan bağlantı yok (%u yeni teşebbüs)" #, c-format msgid "Timeout (%u retry)" msgid_plural "Timeout (%u retries)" -msgstr0 "Zaman aşımı (%u deneme)" +msgstr0 "Zaman aşımı (%u teşebbüs)" +msgstr1 "Zaman aşımı (%u teşebbüs)" #, c-format msgid "Connection refused (%u retry)" msgid_plural "Connection refused (%u retries)" -msgstr0 "Bağlantı reddedildi (%u deneme)" +msgstr0 "Bağlantı reddedildi (%u teşebbüs)" +msgstr1 "Bağlantı reddedildi (%u teşebbüs)" msgid "Dup SHA1 during creation" msgstr "Oluşturma sırasında çift SHA1" @@ -257,6 +265,9 @@ msgid "No support for Content-Encoding (%s)" msgstr "İçerik-Kodlama (Content-Encoding) desteklenmiyor (%s)" +msgid "Incomplete headers during TLS upgrade" +msgstr "" + msgid "Spammer detected" msgstr "Spamcı tespit edildi" @@ -315,6 +326,12 @@ msgid "No Content-Length header" msgstr "Content-Length başlığı mevcut değil" +msgid "Unexpected Content-Type" +msgstr "Beklenmeyen içerik türü (Content-Type)" + +msgid "No Content-Type" +msgstr "Boş içerik türü (Content-Type)" + msgid "Search already closed" msgstr "Arama zaten kapatıldı" @@ -351,27 +368,34 @@ msgid "Malformed push reply" msgstr "Yanlış yapılandırılmış itme yanıtı" -msgid "SHA1 mismatch detected" -msgstr "SHA1 uyumsuzluğu tespit edildi" - msgid ", inbound" -msgstr ", giren" +msgstr ", içeriye giren" msgid ", outbound" msgstr ", çıkan" +msgid ", no-pipeline" +msgstr ", uç uca ekleme yok" + msgid ", banning" msgstr ", yasaklama" msgid ", g2" msgstr ", g2" +msgid ", fake-g2" +msgstr ", sahte-g2" + msgid ", vendor?" msgstr ", sağlayıcı?" #, c-format +msgid "<Browse G2 Host %s>" +msgstr "<%s G2 makinesine gözat>" + +#, c-format msgid "<Browse Host %s>" -msgstr "<Kişiye Gözat %s>" +msgstr "<%s makinesine gözat>" #, c-format msgid "<THEX data for %s>" @@ -395,6 +419,12 @@ msgid "Requeued due to timeout" msgstr "Zaman aşımı yüzünden kuyruğa alındı" +msgid "Partial file removed" +msgstr "Kısmi dosya kaldırıldı" + +msgid "File info being reset" +msgstr "Dosya verileri sıfırlanmakta" + #, c-format msgid "Downloading (TR: %s)" msgstr "İndiriliyor (KZ: %s)" @@ -455,155 +485,27 @@ msgid "%u/%u successful DHT lookup" msgid_plural "%u/%u successful DHT lookups" msgstr0 "%u/%u başarılı DHT araması" +msgstr1 "%u/%u başarılı DHT araması" #, c-format msgid "%u DHT lookup" msgid_plural "%u DHT lookups" msgstr0 "%u DHT araması" +msgstr1 "%u DHT araması" #, c-format msgid "Got %d host from %s" msgid_plural "Got %d hosts from %s" -msgstr0 "%d bilgisayar %s bilgisayar arabelleğinden alındı" +msgstr0 "%d makine %s bilgisayar arabelleğinden alındı" +msgstr1 "%d makine %s bilgisayar arabelleğinden alındı" #, c-format -msgid "Bootstrapping from %s" -msgstr "%s konumundan önyükleme." - -msgid "Bad size" -msgstr "Yanlış boyut" - -msgid "Too small" -msgstr "Küçük" +msgid "Connecting to web cache %s" +msgstr "%s web makine arabelleğine bağlanılıyor" -msgid "Too large" -msgstr "Büyük" - -msgid "Way too large" -msgstr "Çok büyük" - -msgid "Unknown message type" -msgstr "Bilinmeyen mesaj türü" - -msgid "Unexpected message" -msgstr "Beklenmeyen mesaj" - -msgid "Message sent with TTL = 0" -msgstr "Mesaj TTL = 0 değeri ile yollandı" - -msgid "Improper hops/ttl combination" -msgstr "Yanlış hop/ttl kombinasyonu" - -msgid "Max TTL exceeded" -msgstr "Azami TTL aşıldı" - -msgid "Message throttle" -msgstr "Mesaj sayısı sınırlaması" - -msgid "Message matched limits" -msgstr "Mesaj boyutu sınırına erişildi" - -msgid "Unusable Pong" -msgstr "Kullanılamaz pong" - -msgid "Hard TTL limit reached" -msgstr "Sabit TTL sınırına erişildi" - -msgid "Max hop count reached" -msgstr "Azami hop sayısına ulaşıldı" - -msgid "Route lost" -msgstr "Yol kaybedildi" - -msgid "No route" -msgstr "Yol yok" - -msgid "Duplicate message" -msgstr "Kopya mesaj" - -msgid "Message to banned GUID" -msgstr "Yasaklanmış GUİD'ye mesaj" - -msgid "Message from banned GUID" -msgstr "Yasaklanmış GUİD'den mesaj" - -msgid "Node shutting down" -msgstr "Düğüm kapanıyor" - -msgid "TX flow control" -msgstr "TX akış kontrolü" - -msgid "Query text had no trailing NUL" -msgstr "Sorgu metni NUL ile bitmiyor" - -msgid "Query text too short" -msgstr "Sorgu metni çok kısa" - -msgid "Query had unnecessary overhead" -msgstr "Gereksiz veri taşıyan sorgular" - -msgid "Query had bad URN" -msgstr "Sorgu bozuk URN içeriyor" - -msgid "Message with malformed SHA1" -msgstr "Yanlış yapılandırılmış SHA1 içeren mesaj" - -msgid "Message with malformed UTF-8" -msgstr "Yanlış yapılandırılmış UTF-8 içeren mesaj" - -msgid "Malformed Query Hit" -msgstr "Yanlış yapılandırılmış arama cevabı" - -msgid "Bad return address" -msgstr "Hatalı dönüş adresi" - -msgid "Hostile IP address" -msgstr "Kötücül İP adresi" - -msgid "Bogus result from Morpheus" -msgstr "Morpheus istemcisinden hatalı sonuç" - -msgid "Spam" -msgstr "Spam" - -msgid "Evil filename" -msgstr "Şer dosya adı" - -msgid "Improper media type" -msgstr "Uygun olmayan dosya tipi" - -msgid "Payload inflating error" -msgstr "Yük genişletilmesinde hata" - -msgid "Unknown header flags present" -msgstr "Bilinmeyen başlık bayrakları mevcut" - -msgid "Own search results" -msgstr "Kendi arama sonuçlarımız" - -msgid "Own queries" -msgstr "Kendi sorgularımız" - -msgid "Ancient query format" -msgstr "Eski sorgu biçimi" - -msgid "Blank Servent ID" -msgstr "Boş istemci kimliği" - -msgid "GUESS Query missing token" -msgstr "GUESS sorgusunda jeton eksik" - -msgid "GUESS Invalid query token" -msgstr "Geçersiz GUESS sorgu jetonu" - -msgid "DHT Invalid security token" -msgstr "Geçersiz DHT güvenlik jetonu" - -msgid "DHT Too many STORE requests" -msgstr "DHT'de çok fazla STORE talebi" - -msgid "DHT Malformed message" -msgstr "Yanlış yapılandırılmış DHT mesajı" +#, c-format +msgid "Bootstrapping from %s" +msgstr "%s konumundan ön yükleme." #, c-format msgid "Shutdown (%s)" @@ -613,27 +515,7 @@ msgid "Got %d connection pong" msgid_plural "Got %d connection pongs" msgstr0 "%d bağlantı pong'u alındı" - -msgid "Sent crawling info" -msgstr "Tarayıcıya bilgi gönderildi" - -msgid "Cannot setup compressing TX stack" -msgstr "TX yığınının sıkıştırılması kurulamadı" - -#, c-format -msgid "Got BYE %d %.*s" -msgstr "BYE alındı %d %.*s" - -#, c-format -msgid "Weird HELLO %s" -msgstr "Garip HELLO %s" - -#, c-format -msgid "HELLO %s error %d (%s)" -msgstr "HELLO %s hatası %d (%s)" - -msgid "Shielded node" -msgstr "Kalkan arkasında düğüm" +msgstr1 "%d bağlantı pong'u alındı" msgid "Gnet connections disabled" msgstr "Gnet bağlantıları devre dışı" @@ -642,6 +524,10 @@ msgstr "Bağlantı sıkıştırılmamış" #, c-format +msgid "Too many G2 hubs (%u max)" +msgstr "Çok fazla G2 hub'ı (azami %u)" + +#, c-format msgid "Too many leaves (%d max)" msgstr "Çok fazla yaprak (azami %d)" @@ -666,6 +552,9 @@ msgid "Not an ultra node" msgstr "Ultra düğüm değil" +msgid "Unknown error" +msgstr "Bilinmeyen hata" + msgid "Unstable IP address" msgstr "Kararsız İP adresi" @@ -679,15 +568,45 @@ msgid "Not connecting: %s" msgstr "Bağlanılmıyor: %s" +msgid "Cannot setup compressing TX stack" +msgstr "TX yığınının sıkıştırılması kurulamadı" + +msgid "Sent crawling info" +msgstr "Tarayıcıya bilgi gönderildi" + +#, c-format +msgid "Got BYE %d %.*s" +msgstr "BYE alındı %d %.*s" + +#, c-format +msgid "Weird HELLO %s" +msgstr "Garip HELLO %s" + +#, c-format +msgid "HELLO %s error %d (%s)" +msgstr "HELLO %s hatası %d (%s)" + +msgid "Shielded node" +msgstr "Güvenlik duvarı arkasında düğüm" + msgid "Protocol not acceptable" msgstr "Kabul edilemez protokol" +msgid "Conflict" +msgstr "" + +msgid "Upgrade Header Missing" +msgstr "" + msgid "Servent Shutdown" msgstr "İstemci kapanıyor" msgid "Not a network member" msgstr "Şebeke üyesi değil" +msgid "Need a G2 Hub" +msgstr "Bir G2 hub'ı lazım" + msgid "Too frequent crawling" msgstr "Çok sık tarama" @@ -737,6 +656,12 @@ msgid "Pseudo UDP node" msgstr "Sözde UDP düğümü" +msgid "Pseudo semi-reliable UDP node" +msgstr "Sözde yarı güvenilir UDP düğümü" + +msgid "Pseudo G2 UDP node" +msgstr "Sözde G2 UDP düğümü" + msgid "Pseudo DHT node" msgstr "Sözde DHT düğümü" @@ -782,6 +707,9 @@ msgid "DHT" msgstr "DHT" +msgid "G2 hub" +msgstr "G2 hub" + msgid "Unknown" msgstr "Bilinmeyen" @@ -794,31 +722,37 @@ #, c-format msgid "Must wait %u more seconds before resending \"What's New\"" -msgstr "\"Yeni olanlar\" sorgusunu tekrar göndermeden önce %u saniye beklemeniz lâzım" +msgstr "" +"\"Yeni olanlar\" sorgusunu tekrar göndermeden önce %u saniye beklemeniz lâzım" #, c-format msgid "mkdir(\"%s\") failed: %m" msgstr "mkdir(\"%s\") başarısız oldu: %m" msgid "Can't find your home directory!" -msgstr "Ev dizininiz bulunamadı!" +msgstr "Ev klasörünüz bulunamadı!" msgid "$GTK_GNUTELLA_DIR must point to an absolute path!" msgstr "$GTK_GNUTELLA_DIR mutlak bir yola işaret etmelidir!" #, c-format msgid "creating configuration directory \"%s\"" -msgstr "yapılandırma dizini oluşturuluyor \"%s\"" +msgstr "yapılandırma klasörü oluşturuluyor \"%s\"" #, c-format msgid "creating directory \"%s\" for %s" -msgstr "\"%s\" dizini %s için oluşturuluyor" +msgstr "\"%s\" klasörü %s için oluşturuluyor" -msgid "You seem to have left another gtk-gnutella running" -msgstr "Başka bir gtk-gnutella çalışıyor gibi görünüyor" +#, c-format +msgid "Another gtk-gnutella supervisor is running as PID %lu" +msgstr "" + +#, c-format +msgid "Another gtk-gnutella is running as PID %lu" +msgstr "" msgid "Cannot proceed without valid configuration directory" -msgstr "Geçerli bir yapılandırma dizini olmadan devam edilemez" +msgstr "Geçerli bir yapılandırma klasörü olmadan devam edilemez" msgid "Failed to create IPv4 UDP socket" msgstr "İPv4 UDP soketi oluşturulamadı" @@ -829,9 +763,6 @@ msgid "Failed to create local socket" msgstr "Yerel soket oluşturulamadı" -msgid "Failed to create listening sockets" -msgstr "Dinleme soketleri oluşturulamadı" - msgid "Can only run as a leaf when TCP-firewalled" msgstr "TCP veri duvarı arkasındayken sadece yaprak kipi mümkündür" @@ -841,40 +772,137 @@ msgid "Got EOF" msgstr "EOF (dosya sonu) alındı" +msgid "TLS handshake failed" +msgstr "TLS anlaşması başarısız oldu" + +msgid "Connection locally failed" +msgstr "Bağlantı yerel olarak başarısız oldu" + msgid "Write failed (Input Exception)" msgstr "Yazma başarısız oldu (Giriş istisnası)" #, c-format msgid "Looking for UDP host cache %s" -msgstr "%s UDP bilgisayar arabelleği aranıyor" +msgstr "%s UDP makine arabelleği aranıyor" #, c-format msgid "Sent ping to UDP host cache %s:%u" -msgstr "UDP bilgisayar arabelleğine ping gönderildi %s:%u" +msgstr "UDP makine arabelleğine ping gönderildi %s:%u" #, c-format msgid "Got %d host from UDP host cache %s" msgid_plural "Got %d hosts from UDP host cache %s" -msgstr0 "%d bilgisayar %s UDP bilgisayar arabelleğinden alındı" +msgstr0 "%d makine %s UDP bilgisayar arabelleğinden alındı" +msgstr1 "%d makine %s UDP bilgisayar arabelleğinden alındı" msgid "Connect back timeout" msgstr "Geri bağlanım zaman aşımına uğradı" +msgid "Request timeout" +msgstr "İstek zaman aşımı" + msgid "Timeout waiting for follow-up" msgstr "Devam beklemesi zaman aşımına uğradı" msgid "Lifetime expired" msgstr "Ömrünü doldurdu" +msgid "Unauthorized" +msgstr "İzinsiz" + +#, c-format +msgid "Limiting connections from %s" +msgstr "%s unsurundan gelen bağlantılar sınırlanıyor" + +msgid "No reason given" +msgstr "Herhangi bir sebep gösterilmemiş" + +msgid "Bad Request" +msgstr "Kötü istek" + +msgid "Header too large" +msgstr "Çok büyük başlık" + +msgid "Input buffer full" +msgstr "Giriş tamponu dolu" + +msgid "Extra data after HTTP header" +msgstr "HTTP başlığının ardından ilâve veri" + msgid "Unable to send GIV" msgstr "GIV gönderilemiyor" +msgid "Not Found" +msgstr "Bulanamadı" + +msgid "File was modified" +msgstr "Dosya değiştirilmiş" + +msgid "Moved Permanently" +msgstr "Daimi olarak taşınmış" + +msgid "File index/name mismatch" +msgstr "Dosya indeksi/ismi uyumsuzluğu" + +msgid "URN Not Found (urn:sha1)" +msgstr "URN bulunamadı (urn:sha1)" + +msgid "SHA1 is being recomputed" +msgstr "SHA1 yeniden hesaplanmakta" + +msgid "Library being rebuilt" +msgstr "Kütüphane yeniden yapılandırılmakta" + +msgid "Malformed URN in /uri-res/N2R request" +msgstr "/uri-res/N2R isteğinde yanlış yapılandırılmış URN" + +msgid "Malformed URN in /uri-res/N2X request" +msgstr "/uri-res/N2X isteğinde yanlış yapılandırılmış URN" + +msgid "TTH is being computed" +msgstr "TTH hesaplanmakta" + msgid "<Browse Host Request>" -msgstr "<Kişiye Gözatma İstemi>" +msgstr "<Kişiye Gözatma Talebi>" + +msgid "Browse Host Disabled" +msgstr "Kişiye Gözat devre dışı" + +#, c-format +msgid "Redirected to %s:%u" +msgstr "%s:%u konumuna yönlendirildi" + +msgid "Not Modified" +msgstr "Değiştirilmemiş" msgid "Stalling upload replaced" msgstr "Duraklayan gönderme yenilendi" +msgid "Already downloading this file" +msgstr "Bu dosya zaten indirilmekte" + +msgid "Malformed Range request" +msgstr "Yanlış yapılandırılmış alan isteği" + +msgid "Requested range not satisfiable" +msgstr "İstenilen veri alanı mevcut değil" + +msgid "Requested range not available yet" +msgstr "İstenilen veri alanı henüz müsait değil" + +msgid "Queue full" +msgstr "Kuyruk dolu" + +msgid "Another connection is still active" +msgstr "Başka bir bağlantı hâlâ faaldir" + +#, c-format +msgid "%s not honoured; removed from PARQ queue" +msgstr "%s görmezden gelindi, PARQ kuyruğundan kaldırıldı" + +msgid "Minimum retry delay" +msgstr "Asgari tekrar deneme aralığı" + #, c-format msgid "Queued (slot %d, ETA: %s)" msgstr "Kuyrukta (oluk %d, ETA: %s)" @@ -882,12 +910,15 @@ msgid "Cannot send whole HTTP status" msgstr "Tüm HTTP durumu gönderilemiyor" +msgid "Not Acceptable" +msgstr "Kabul edilemez" + #, c-format -msgid "<Browse Host Request> %s%s%s" -msgstr "<Kişiye Gözatma İstemi> %s%s%s" +msgid "<Browse Host %sRequest> %s%s%s" +msgstr "<Makineye gözatma %stalebi> %s%s%s" msgid "query hits" -msgstr "arama sonuçları" +msgstr "sorgu isabetleri" msgid ", deflate" msgstr ", sıkıştırılmış" @@ -896,10 +927,44 @@ msgstr ", gzip" msgid ", chunked" -msgstr ", parçalar halinde" +msgstr ", parçalar hâlinde" + +msgid "THEX failure" +msgstr "THEX başarısızlığı" + +msgid "EOF while sinking" +msgstr "" + +#, c-format +msgid "Read error while sinking: %m" +msgstr "" + +msgid "Content Too Large" +msgstr "" + +msgid "Unknown/Missing Protocol Tag" +msgstr "Bilinmeyen/Eksik protokol etiketi" + +msgid "Missing Host Header" +msgstr "Host başlığı eksik" + +msgid "Not Implemented" +msgstr "Destek programlanmamış" + +msgid "Bad URI" +msgstr "Yanlış URI" + +msgid "Bad Path" +msgstr "Yanlış yol" + +msgid "No Content Allowed" +msgstr "Hiçbir içeriğe izin verilmemiş" + +msgid "Sharing currently disabled" +msgstr "Paylaşım şu anda devre dışı bırakılmış" msgid "Write exception" -msgstr "Yazma istinası" +msgstr "Yazma istisnası" #, c-format msgid "File read error: %s" @@ -937,6 +1002,1208 @@ msgid " - Newer version available: from git %s" msgstr " - Yeni bir sürüm mevcuttur: git'ten %s" +msgid "Routing errors" +msgstr "Yönlendirme hataları" + +msgid "Routing table chunks" +msgstr "Yönlendirme tablosundaki parçalar" + +msgid "Routing table message capacity" +msgstr "Yönlendirme tablosu mesaj kapasitesi" + +msgid "Routing table message count" +msgstr "Yönlendirme tablosundaki parça sayısı" + +msgid "Routing through transient node avoided" +msgstr "Geçici düğüm üzerinden yönlendirilmeden kaçınıldı" + +msgid "Duplicates with higher TTL" +msgstr "Daha yüksek TTL'li kopyalar" + +msgid "SPAM SHA1 database hits" +msgstr "SPAM SHA1 isabetleri" + +msgid "SPAM filename and size hits" +msgstr "SPAM dosya adı ve boyutu isabetleri" + +msgid "SPAM fake hits" +msgstr "SPAM hile dosya isabetleri" + +msgid "SPAM duplicate hits" +msgstr "SPAM kopya isabetleri" + +msgid "SPAM dynamically caught hostile IP addresses" +msgstr "SPAM dinamik olarak yakalanan kötücül İP adresleri" + +msgid "SPAM dynamically caught hostile IP held" +msgstr "SPAM saklanan dinamik olarak yakalanmış kötücül İP adresleri" + +msgid "SPAM spotted spamming IP addresses held" +msgstr "SPAM tutulan tespit edilmiş spamcı İP adresleri" + +msgid "Searches to local DB" +msgstr "Yerel veritabanında aramalar" + +msgid "Hits on local DB" +msgstr "Yerel veritabanına isabetler" + +msgid "Hits on local partial files" +msgstr "Yerel tamamlanmamış dosyalara isabetler" + +msgid "Hits on \"what's new?\" queries" +msgstr "\"Yeni olanlar\" sorgularına isabetler" + +msgid "Query hits received for local queries" +msgstr "Yerel sorgular için alınan sorgu isabetleri" + +msgid "G2 searches to local DB" +msgstr "Yerel veritabanına G2 aramaları" + +msgid "G2 hits on local DB" +msgstr "Yerel veritabanında G2 isabetleri" + +msgid "G2 hits on local partial files" +msgstr "Yerel kısmi dosyalara G2 isabetleri" + +msgid "Query hits received for OOB-proxied queries" +msgstr "OOB vekilli sorgular için alınan sorgu isabetleri" + +msgid "Queries requesting OOB hit delivery" +msgstr "OOB isabet teslimi talep eden sorgular" + +msgid "Stripped OOB flag on queries" +msgstr "Sorgulardan kaldırılan OOB bayrağı" + +msgid "Ignored OOB queries due to unclaimed hits" +msgstr "" +"Talep edilmeyen isabetler sebebiyle görmezden gelinen OOB (bant dışı) " +"sorguları" + +msgid "Duplicate OOB-proxied queries" +msgstr "Kopya OOB vekilli sorgular" + +msgid "OOB hits received for OOB-proxied queries" +msgstr "OOB vekilli sorgular için alınan OOB isabetleri" + +msgid "OOB hits bearing alien IP address" +msgstr "Yabancı İP adresi taşıyan OOB isabetleri" + +msgid "OOB hits ignored due to identified spamming address" +msgstr "Bilinen spamcı adresi nedeniyle görmezden gelinen OOB isabetleri" + +msgid "OOB hits ignored due to unsecure promise from known secure host" +msgstr "" +"Bilinen güvenli makineden güvensiz söz verme sebebiyle görmezden gelinen OOB " +"isabetleri" + +msgid "Unclaimed locally-generated OOB hits" +msgstr "Talep edilmeyen yerel olarak oluşturulmuş OOB isabetleri" + +msgid "Partially claimed locally-generated OOB hits" +msgstr "Kısmi olarak talep edilen yerel olarak oluşturulmuş OOB isabetleri" + +msgid "Spurious OOB hit claiming received" +msgstr "Sahte OOB isabet talebi alındı" + +msgid "Unrequested OOB hits received" +msgstr "Talep edilmeden alınan OOB isabetleri" + +msgid "Received query hits for untracked queries" +msgstr "İzlenmeyen sorgular için alınan sorgu isabetleri" + +msgid "Tracked query MUIDs" +msgstr "İzlenen eşsiz mesaj kimlikleri (MUİD)" + +msgid "Compacted queries" +msgstr "Sıkıştırılmış sorgular" + +msgid "Bytes saved by compacting" +msgstr "Sıkıştırılmayla tasarruf edilen baytlar" + +msgid "UTF8 queries" +msgstr "UTF8 sorgular" + +msgid "SHA1 queries" +msgstr "SHA1 sorgular" + +msgid "\"What's New?\" queries" +msgstr "\"Yeni olanlar\" sorguları" + +msgid "UTF8 G2 queries" +msgstr "UTF8 G2 sorguları" + +msgid "SHA1 G2 queries" +msgstr "SHA1 G2 sorguları" + +msgid "GUESS queries" +msgstr "GUESS sorguları" + +msgid "GUESS queries (0.2)" +msgstr "GUESS sorguları (0.2)" + +msgid "GUESS link cache size" +msgstr "GUESS bağlantı ara bellek boyutu" + +msgid "GUESS cached query keys held" +msgstr "GUESS tutulan sorgu anahtarları" + +msgid "GUESS cached 0.2 hosts held" +msgstr "GUESS tutulan 0.2 bilgisayarları" + +msgid "GUESS cached G2 hosts held" +msgstr "GUESS arabellekteki tutulan G2 makineleri" + +msgid "GUESS locally generated queries" +msgstr "GUESS yerel olarak oluşturulan sorgular" + +msgid "GUESS currently running queries" +msgstr "GUESS şu anda etkin olan sorgular" + +msgid "GUESS hits received for locally generated queries" +msgstr "GUESS yerel olarak oluşturulan sorgulara erişimler" + +msgid "GUESS ultra nodes queried" +msgstr "GUESS sorgulanan ultra düğümler" + +msgid "GUESS ultra nodes sending back an acknowledgment" +msgstr "GUESS geri onay gönderen ultra düğümler" + +msgid "GUESS G2 nodes queried" +msgstr "GUSS sorgulanan G2 düğümleri" + +msgid "GUESS G2 nodes sending back an acknowledgment" +msgstr "GUESS geri onay gönderen G2 düğümleri" + +msgid "Throttled local push messages" +msgstr "Kısılmış yerel itme mesajları" + +msgid "Throttled received push messages" +msgstr "Kısılmış alınan itme mesajları" + +msgid "Broadcasted push messages" +msgstr "Yayınlanan itme mesajları" + +msgid "Push-proxy UDP relayed messages" +msgstr "İtme vekilince yönlendirilen UDP mesajları" + +msgid "Push-proxy TCP relayed messages" +msgstr "İtme vekilince yönlendirilen TCP mesajları" + +msgid "Push-proxy TCP for FW<->FW transfers" +msgstr "GD<->GD transferleri için TCP itme vekili" + +msgid "Push-proxy broadcasted messages" +msgstr "Yayınlanan itme vekili mesajları" + +msgid "Push-proxy found un-proxied local route" +msgstr "İtme vekili vekilsiz yerel bir yol buldu" + +msgid "Push-proxy lookup failures" +msgstr "İtme vekili danışma başarısızlıkları" + +msgid "Push relayed via local route" +msgstr "İtme yerel yol ile yönlendirildi" + +msgid "Push relayed via routing table" +msgstr "İtme yönlendirme tablosuyla yönlendirildi" + +msgid "Locally generated dynamic queries" +msgstr "Yerel olarak oluşturulan dinamik sorgular" + +msgid "Leaf-generated dynamic queries" +msgstr "Yapraklar tarafından oluşturulan dinamik sorgular" + +msgid "OOB-proxied leaf queries" +msgstr "OOB vekilli yaprak sorguları" + +msgid "Fully completed dynamic queries" +msgstr "Eksiksiz tamamlanan dinamik sorgular" + +msgid "Partially completed dynamic queries" +msgstr "Kısmen tamamlanan dinamik sorgular" + +msgid "Dynamic queries ended with no results" +msgstr "Sonuçsuz sona eren dinamik sorgular" + +msgid "Fully completed dynamic queries getting late results" +msgstr "Gecikmiş cevap alan eksiksiz tamamlanmış dinamik sorgular" + +msgid "Dynamic queries with partial late results" +msgstr "Kısmi geç sonuçları bulunan dinamik sorgular" + +msgid "Dynamic queries completed by late results" +msgstr "Geç sonuçlarla tamamlanan dinamik sorgular" + +msgid "Queries seen from GTKG" +msgstr "GTKG'den görülen sorgular" + +msgid "Queries seen from GTKG that were re-queries" +msgstr "GTKG'nın gördüğü tekrar olan sorgular" + +msgid "Queries advertising support of GGEP \"H\"" +msgstr "GGEP \"H\" desteği bildiren sorgular" + +msgid "Queries advertising support of semi-reliable UDP" +msgstr "Yarı güvenilir UDP desteği bildiren sorgular" + +msgid "GIV callbacks received" +msgstr "Alınan GİV geri çağrıları" + +msgid "GIV discarded due to no suitable download" +msgstr "Uygun indirme bulunmadığı için atılan GİV" + +msgid "QUEUE callbacks received" +msgstr "Alınan QUEUE geri çağrıları" + +msgid "QUEUE discarded due to no suitable download" +msgstr "Uygun indirme bulunmadığı için atılan QUEUE" + +msgid "File descriptors banned running count" +msgstr "Yasaklı dosya tanımlayıcısı sayısının toplamı" + +msgid "UDP read-ahead datagram running count" +msgstr "UDP önceden okuma veri birimi, toplam sayı" + +msgid "UDP read-ahead datagram running bytes" +msgstr "UDP önceden okuma veri birimi, bayt olarak toplam boyut" + +msgid "UDP read-ahead datagram \"old\" processed" +msgstr "UDP önceden okuma veri birimi işlenen \"eskiler\"" + +msgid "UDP read-ahead datagram max count" +msgstr "UDP önceden okuma veri birimi azami sayısı" + +msgid "UDP read-ahead datagram max bytes" +msgstr "UDP önceden okuma veri birimi azami bayt" + +msgid "UDP read-ahead datagram max delay" +msgstr "UDP önceden okuma veri birimi azami gecikme" + +msgid "UDP push messages received for FW<->FW connections" +msgstr "GD<->GD bağlantıları için alınan UDP itme mesajları" + +msgid "UDP push messages requesting FW<->FW connection with ourselves" +msgstr "Bizimle GD<->GD bağlantısı talep eden UDP itme mesajları" + +msgid "UDP push messages patched for FW<->FW connections" +msgstr "" +"GD<->GD (güvenlik duvarı) bağlantıları için yamalanmış UDP itme mesajları" + +msgid "UDP UHC pings received" +msgstr "UDP alınan UHC pingleri" + +msgid "UDP UHC pongs sent" +msgstr "UDP gönderilen UHC pongları" + +msgid "UDP messages with bogus source IP" +msgstr "Bozuk kaynak İP adresi içeren UDP mesajları" + +msgid "UDP messages from shunned IP (discarded)" +msgstr "Kaçınılan IP'den UDP mesajları (görmezden gelinir)" + +msgid "UDP truncated incoming messages" +msgstr "UDP içeriye gelen kesilmiş mesajlar" + +msgid "Alien UDP messages (non-Gnutella)" +msgstr "Yabancı UDP mesajları (Gnutella'dan olmayan)" + +msgid "Unprocessed UDP Gnutella messages" +msgstr "İşlenmeyen Gnutella UDP mesajları" + +msgid "Compressed UDP messages enqueued" +msgstr "Kuyruğa eklenen sıkıştırılmış UDP mesajları" + +msgid "Compressed UDP messages received" +msgstr "Alınan sıkıştırılmış UDP mesajları" + +msgid "Candidates for UDP message compression" +msgstr "UDP mesaj sıkıştırması adayları" + +msgid "Uncompressed UDP messages due to no gain" +msgstr "Kazanım olmadığı için sıkıştırılmayan UDP mesajları" + +msgid "Ambiguous UDP messages received" +msgstr "Alınan belirsiz UDP mesajları" + +msgid "Ambiguous UDP messages inspected more deeply" +msgstr "Daha derin incelenen belirsiz UDP mesajları" + +msgid "Ambiguous UDP messages handled as semi-reliable UDP" +msgstr "Yarı güvenilir UDP olarak ele alınan belirsiz UDP mesajları" + +msgid "Semi-reliable UDP total messages given for transmission" +msgstr "Yarı güvenilir UDP iletim için verilen toplam mesajlar" + +msgid "Semi-reliable UDP total messages deflated" +msgstr "Yarı güvenilir UDP toplam sıkıştırılmış mesajlar" + +msgid "Semi-reliable UDP total messages unsent" +msgstr "Yarı güvenilir UDP toplam gönderilmeyen mesajlar" + +msgid "Semi-reliable UDP total messages dropped due to temporary ban" +msgstr "" +"Yarı güvenilir UDP geçici yasaklama nedeniyle görmezden gelinen toplam " +"mesajlar" + +msgid "Semi-reliable UDP total messages sent to known responsive hosts" +msgstr "" +"Yarı güvenilir UDP bilinen cevap veren makinelere gönderilen toplam mesajlar" + +msgid "Semi-reliable UDP total messages partially sent due to clogging" +msgstr "Yarı güvenilir UDP tıkanma sebebiyle kısmen gönderilen toplam mesajlar" + +msgid "Semi-reliable UDP reliable messages given for transmission" +msgstr "Yarı güvenilir UDP iletim için verilen güvenli mesajlar" + +msgid "Semi-reliable UDP reliable messages correctly transmited" +msgstr "Yarı güvenilir UDP doğru aktarılan güvenilir mesajlar" + +msgid "Semi-reliable UDP reliable messages not fully acknowledged" +msgstr "Yarı güvenilir UDP tamamen teyit edilmeyen güvenilir mesajlar" + +msgid "Semi-reliable UDP fragments sent" +msgstr "Yarı güvenilir UDP yollanan parçalar" + +msgid "Semi-reliable UDP fragments resent" +msgstr "Yarı güvenilir UDP tekrar yollanan parçalar" + +msgid "Semi-reliable UDP fragment sendings avoided" +msgstr "Yarı güvenilir UDP yollanılması önlenen parçalar" + +msgid "Semi-reliable UDP fragments sent too many times" +msgstr "Yarı güvenilir UDP fazla kez yollanan parçalar" + +msgid "Semi-reliable UDP total acknowledgments received" +msgstr "Yarı güvenilir UDP alınan toplam teyitler" + +msgid "Semi-reliable UDP cumulative acknowledgments received" +msgstr "Yarı güvenilir UDP alınan kümülatif teyitler" + +msgid "Semi-reliable UDP extended acknowledgments received" +msgstr "Yarı güvenilir UDP alınan genişletilmiş teyitler" + +msgid "Semi-reliable UDP spurious acknowledgments received" +msgstr "Yarı güvenilir UDP alınan sahte teyitler" + +msgid "Semi-reliable UDP invalid acknowledgments received" +msgstr "Yarı güvenilir UDP alınan geçersiz teyitler" + +msgid "Semi-reliable UDP acknowledgments re-queued for sending" +msgstr "Yarı güvenilir UDP gönderilmek için tekrar kuyruğa konulan teyitler" + +msgid "Semi-reliable UDP plain acknowledgments dropped" +msgstr "Yarı güvenilir UDP görmezden gelinen sade teyitler" + +msgid "Semi-reliable UDP enhanced acknowledgments dropped" +msgstr "Yarı güvenilir UDP görmezden gelinen gelişmiş teyitler" + +msgid "Semi-reliable UDP plain acknowledgments transmitted" +msgstr "Yarı güvenilir UDP aktarılmış sade teyitler" + +msgid "Semi-reliable UDP cumulative acknowledgments transmitted" +msgstr "Yarı güvenilir UDP kümülatif aktarılmış teyitler" + +msgid "Semi-reliable UDP extended acknowledgments transmitted" +msgstr "Yarı güvenilir UDP aktarılmış genişletilmiş teyitler" + +msgid "Semi-reliable UDP EARs sent" +msgstr "Yarı güvenilir UDP gönderilen EAR'ler" + +msgid "Semi-reliable UDP too many EARs sent" +msgstr "Yarı güvenilir UDP çok fazla gönderilen EAR'ler" + +msgid "Semi-reliable UDP EAR negative acknowledgments received" +msgstr "Yarı güvenilir UDP alınan EAR negatif teyitler" + +msgid "Semi-reliable UDP acknowledgments received after sending EARs" +msgstr "Yarı güvenilir UDP EAR gönderildikten sonra alınan teyitler" + +msgid "Semi-reliable UDP fragments received" +msgstr "Yarı güvenilir UDP alınan UDP parçaları" + +msgid "Semi-reliable UDP duplicate fragments received" +msgstr "Yarı güvenilir UDP alınan çift parçalar" + +msgid "Semi-reliable UDP unreliable fragments received" +msgstr "Yarı güvenilir UDP alınan güvenilmez parçalar" + +msgid "Semi-reliable UDP dropped received fragments" +msgstr "Yarı güvenilir UDP alınan ve çöpe atılan parçalar" + +msgid "Semi-reliable UDP fragments received whilst lingering" +msgstr "Yarı güvenilir UDP beklenirken alınan parçalar" + +msgid "Semi-reliable UDP messages expired before re-assembly" +msgstr "Yarı güvenilir UDP yeniden birleştirme öncesi ömrü dolan mesajlar" + +msgid "Semi-reliable UDP messages re-assembled completely" +msgstr "Yarı güvenilir UDP tamamen yeniden birleştirilen mesajlar" + +msgid "Semi-reliable UDP messages inflated successfully" +msgstr "Yarı güvenilir UDP sıkıştırılması başarıyla açılmış mesajlar" + +msgid "Semi-reliable UDP messages inflated incorrectly" +msgstr "Yarı güvenilir UDP sıkıştırılması yanlış açılmış mesajlar" + +msgid "Semi-reliable UDP unreliable messages received" +msgstr "Yarı güvenilir UDP alınan güvenilmez mesajlar" + +msgid "Semi-reliable UDP empty messages received" +msgstr "Yarı güvenilir UDP alınan boş mesajlar" + +msgid "Semi-reliable UDP total acknowledgments sent" +msgstr "Yarı güvenilir UDP yollanan toplam teyitler" + +msgid "Semi-reliable UDP cumulative acknowledgments sent" +msgstr "Yarı güvenilir UDP yollanan kümülatif teyitler" + +msgid "Semi-reliable UDP extended acknowledgments sent" +msgstr "Yarı güvenilir UDP yollanan genişletilmiş teyitler" + +msgid "Semi-reliable UDP avoided acknowledgment sendings" +msgstr "Yarı güvenilir UDP önlenen teyit gönderimleri" + +msgid "Semi-reliable UDP EARs received" +msgstr "Yarı güvenilir UDP alınan EAR'ler" + +msgid "Semi-reliable UDP EARs received for unknown message" +msgstr "Yarı güvenilir UDP bilinmeyen mesaj için alınan EAR'ler" + +msgid "Semi-reliable UDP EARs received whilst lingering" +msgstr "Yarı güvenilir UDP beklerken alınan EAR'ler" + +msgid "Semi-reliable UDP fragments from hostile IP addresses" +msgstr "Yarı güvenilir UDP kötücül İP adreslerinden gelen parçalar" + +msgid "UDP G2 hits rerouted to hub for delivery" +msgstr "UDP teslim için hub'a tekrar yönlendirilmiş G2 isabetleri" + +msgid "UDP G2 hits undelivered" +msgstr "UDP teslim edilmemiş G2 isabetleri" + +msgid "Consolidated servers (after GUID and IP address linking)" +msgstr "Konsolide sunucular (GUİD ve İP adresi eşleşmesinden sonra)" + +msgid "Duplicate downloads found during server consolidation" +msgstr "Sunucu konsolide edilirken bulunan çift indirmeler" + +msgid "Discovered server GUIDs" +msgstr "Keşfedilen sunucu GUİD'leri" + +msgid "Changed server GUIDs" +msgstr "Değişmeye uğrayan sunucu GUİD'leri" + +msgid "Detected GUID collisions" +msgstr "Tespit edilen GUİD çarpışmaları" + +msgid "Detected collisions with our own GUID" +msgstr "Bizim GUİD'mizle tespit edilen çarpışmalar" + +msgid "GUID dynamically banned" +msgstr "GUİD dinamik olarak yasaklandı" + +msgid "Firewalled node info for known hosts received in upload requests" +msgstr "" +"Gönderme isteklerinde bilinen bilgisayarlar için güvenlik duvarı arkasında " +"düğüm bilgisi" + +msgid "Revitalized PUSH routes" +msgstr "Tekrar canlandırılan itme yolları" + +msgid "Collected new PUSH proxies from other query hits" +msgstr "Diğer sorgu isabetlerinden toplanan yeni İTME vekilleri" + +msgid "Attempted download resource switching on completion" +msgstr "Tamamlanma ardından indirme kaynak değiştirme teşebbüsü" + +msgid "Attempted download resource switching after error" +msgstr "Hata sonrası indirme kaynağı değiştirme teşebbüsü" + +msgid "Successful download resource switching (all kind)" +msgstr "Başarılı indirme kaynağı değiştirmesi (her tür)" + +msgid "Successful download resource switching between plain files" +msgstr "Başarılı dosyalar arası indirme kaynağı değiştirmeleri" + +msgid "Successful download resource switching after error" +msgstr "Hata sonrası başarılı indirme kaynağı (dosya) değiştirmesi" + +msgid "Actively queued after resource switching attempt" +msgstr "Kaynak değiştirme teşebbüsü ardından aktif bir şekilde kuyruğa eklendi" + +msgid "Sunk HTTP reply data on error codes" +msgstr "HTTP cevap verileri hata kodu nedeniyle atıldı" + +msgid "Ignored downloaded data" +msgstr "İndirilen veri görmezden gelindi" + +msgid "Ignoring requested after data mismatch" +msgstr "İstenen veri uyumsuzluğu ardından görmezden geliniyor" + +msgid "Ignoring requested to preserve connection" +msgstr "İstenen bağlantıyı korumak için görmezden geliniyor" + +msgid "Ignoring requested due to aggressive swarming" +msgstr "Agresif çoklu indirme nedeniyle görmezden gelinenler" + +msgid "Ignoring refused (data too large or server too slow)" +msgstr "" +"Reddedilen görmezden gelmeler (veriler çok büyük veya sunucu çok yavaş)" + +msgid "Client resource switching (all detected)" +msgstr "İstemci kaynak değiştirmeleri (tüm tespitler)" + +msgid "Client resource switching between plain files" +msgstr "İstemciler tarafından istenen dosyalar için kaynak değiştirmeleri" + +msgid "Client follow-up request after HTTP error was returned" +msgstr "HTTP hatası yollanmasını izleyen istemci isteği" + +msgid "PARQ client resource switching in slots (SHA-1 based)" +msgstr "PARQ oluklarda istemcinin kaynak değiştirmesi (SHA-1 değerine dayalı)" + +msgid "PARQ client retry-after violation" +msgstr "PARQ istemcisi sonra-tekrar dene ihlâli" + +msgid "PARQ client kicked out after too many retry-after violations" +msgstr "PARQ istemcisi fazla sonra-tekrar dene ihlâli nedeniyle kovulması" + +msgid "PARQ upload slot limit overrides" +msgstr "PARQ gönderme oluk sınırı aşımları" + +msgid "PARQ quick upload slots granted" +msgstr "Verilen PARQ çabuk gönderme olukları" + +msgid "PARQ QUEUE sending attempts" +msgstr "PARQ QUEUE yollama teşebbüsleri" + +msgid "PARQ QUEUE messages sent" +msgstr "Yollanan PARQ QUEUE mesajları" + +msgid "PARQ QUEUE follow-up requests received" +msgstr "PARQ QUEUE yollanımından sonra alınan istekler" + +msgid "Launched SHA-1 file verifications" +msgstr "Başlatılan SHA-1 dosya doğrulamaları" + +msgid "Launched TTH file verifications" +msgstr "Başlatılan TTH dosya doğrulamaları" + +msgid "Re-seeding of orphan downloads through query hits" +msgstr "Öksüz indirmelerin sorgu isabetleri yoluyla tekrar sunumu" + +msgid "Re-seeding of orphan downloads through upload requests" +msgstr "Öksüz indirmelerin gönderme istekleri yoluyla tekrar sunumu" + +msgid "RUDP sent bytes" +msgstr "Gönderilen RUDP baytları" + +msgid "RUDP received bytes" +msgstr "Alınan RUDP baytları" + +msgid "DHT estimated amount of nodes" +msgstr "DHT tahmini düğüm sayısı" + +msgid "DHT standard error of estimated amount of nodes" +msgstr "DHT standart tahmini düğüm sayı hatası" + +msgid "DHT k-ball theoretical frontier (bits)" +msgstr "DHT teorik k-topu sınırı (bit olarak)" + +msgid "DHT k-ball furthest frontier (bits)" +msgstr "DHT en uzak k-topu sınırı (bit olarak)" + +msgid "DHT k-ball closeest frontier (bits)" +msgstr "DHT en yakın k-topu sınırı (bit olarak)" + +msgid "DHT routing table buckets" +msgstr "DHT yönlendirme tablosu konumları" + +msgid "DHT routing table leaves" +msgstr "DHT yönlendirme tablosundaki yapraklar" + +msgid "DHT routing table maximum depth" +msgstr "DHT yönlendirme tablosunun azami derinliği" + +msgid "DHT routing table good nodes" +msgstr "DHT yönlendirme tablosundaki iyi düğümler" + +msgid "DHT routing table stale nodes" +msgstr "DHT yönlendirme tablosundaki kötü düğümler" + +msgid "DHT routing table pending nodes" +msgstr "DHT yönlendirme tablosundaki bekleyen düğümler" + +msgid "DHT routing table evicted nodes" +msgstr "DHT yönlendirme tablosundan çıkarılan düğümler" + +msgid "DHT routing table evicted firewalled nodes" +msgstr "" +"DHT yönlendirme tablosundan çıkarılan güvenlik duvarı arkasındaki düğümler" + +msgid "DHT routing table evicted nodes due to quota" +msgstr "DHT yönlendirme tablosundan kota nedeniyle çıkarılan düğümler" + +msgid "DHT routing table promoted pending nodes" +msgstr "DHT yönlendirme tablosundaki bekleyen terfi etmiş düğümler" + +msgid "DHT routing table pinged promoted nodes" +msgstr "DHT yönlendirme tablosunda terfi etmiş düğümlere yollanan pingler" + +msgid "DHT routing table rejected node due to bucket network quota" +msgstr "" +"DHT yönlendirme tablosunda konum ağ kotası nedeniyle reddedilen düğümler" + +msgid "DHT routing table rejected node due to global network quota" +msgstr "" +"DHT yönlendirme tablosunda genel ağ kotası nedeniyle reddedilen düğümler" + +msgid "DHT completed bucket refreshes" +msgstr "DHT tamamlanan konum tazelemeleri" + +msgid "DHT forced bucket refreshes" +msgstr "DHT zorlanan konum tazelemeleri" + +msgid "DHT forced bucket merges" +msgstr "DHT zorlanan konum birleşmeleri" + +msgid "DHT bucket merges" +msgstr "DHT konum birleşmeleri" + +msgid "DHT bucket splits" +msgstr "DHT konum bölünmeleri" + +msgid "DHT denied non-splitable bucket refresh" +msgstr "DHT reddedilen bölünemez konum tazelemeleri" + +msgid "DHT initiated bucket alive checks" +msgstr "DHT başlatılan konum denetlemeleri" + +msgid "DHT alive pings sent to good nodes" +msgstr "DHT iyi düğümlere yollanan pingler" + +msgid "DHT alive pings sent to stale nodes" +msgstr "DHT kötü düğümlere yollanan pingler" + +msgid "DHT alive pings sent to shutdowning nodes" +msgstr "DHT kapanan düğümlere yollanan pingler" + +msgid "DHT alive pings avoided" +msgstr "DHT kaçınılan pingler" + +msgid "DHT alive pings skipped" +msgstr "DHT atlanan pingler" + +msgid "DHT revitalized stale nodes on RPC reply" +msgstr "DHT RPC cevabıyla tekrar canlandırılan kötü düğümler" + +msgid "DHT value store rejected on IP/network quota grounds" +msgstr "DHT İP/ağ kotası nedeniyle değer tutulması retleri" + +msgid "DHT value store rejected on creator validation grounds" +msgstr "DHT oluşturucu onaylaması temelinde değer tutulması retleri" + +msgid "DHT nodes rejected during lookup based on network quota" +msgstr "DHT aramalar sırasında ağ kotası nedeniyle reddedilen düğümler" + +msgid "DHT nodes rejected during lookup based on suspicious proximity" +msgstr "DHT aramalar sırasında şüpheli yakınlık nedeniyle reddedilen düğümler" + +msgid "DHT nodes rejected during lookup based on frequency divergence" +msgstr "DHT aramalar sırasında frekans sapması nedeniyle reddedilen düğümler" + +msgid "DHT node contact IP addresses fixed during lookup" +msgstr "DHT arama sırasında düzeltilen düğümle irtibat İP adresleri" + +msgid "DHT keys held" +msgstr "DHT tutulan anahtarlar" + +msgid "DHT cached keys held" +msgstr "DHT arabellekte tutulan anahtarlar" + +msgid "DHT values held" +msgstr "DHT tutulan anahtarlar" + +msgid "DHT cached KUID targets held" +msgstr "DHT arabellekte tutulan KUİD hedefleri" + +msgid "DHT cached closest root nodes" +msgstr "DHT arabelleğindeki en yakın kök düğümler" + +msgid "DHT cached roots exact hits" +msgstr "DHT arabelleğinde bulunan kök düğümler" + +msgid "DHT cached roots approximate hits" +msgstr "DHT arabelleğinde yaklaşık kök sunan düğümler" + +msgid "DHT cached roots misses" +msgstr "DHT arabelleğinde bulunamayan kök düğümler" + +msgid "DHT cached roots lookups within k-ball" +msgstr "DHT arabelleğinde k-topu içerisinde kök aramaları" + +msgid "DHT cached roots contact address refreshed" +msgstr "DHT arabellekteki kök adresleri tazelemesi" + +msgid "DHT cached security tokens held" +msgstr "DHT arabelleğinde tutulan güvenlik jetonları" + +msgid "DHT cached security tokens hits" +msgstr "DHT arabellekteki güvenlik jetonu isabetleri" + +msgid "DHT stable node information held" +msgstr "DHT tutulan kararlı düğüm bilgisi" + +msgid "DHT local hits on value lookups" +msgstr "DHT değer aramalarında yerel isabetler" + +msgid "DHT local hits returning values from cached keys" +msgstr "DHT arabellekteki anahtarlardan değer geri gönderen yerel isabetler" + +msgid "DHT returned expanded values" +msgstr "DHT geri gönderilen genişletilmiş değerler" + +msgid "DHT returned values as secondary keys" +msgstr "DHT ikincil anahtarlar olarak geri gönderilen değerler" + +msgid "DHT claimed values via secondary keys" +msgstr "DHT ikincil anahtarlar yoluyla istenen değerler" + +msgid "DHT returned cached expanded values" +msgstr "DHT geri gönderilen arabellekteki genişletilmiş değerler" + +msgid "DHT returned cached values as secondary-keys" +msgstr "DHT arabellekte ikincil anahtar olarak geri gönderilen değerler" + +msgid "DHT claimed cached values via secondary keys" +msgstr "DHT arabellekte ikincil anahtar olarak istenen değerler" + +msgid "DHT successfully received value publications" +msgstr "DHT başarılı olarak alınan değer yayınları" + +msgid "DHT successfully received value removals" +msgstr "DHT başarılı olarak alınan değer silinmeleri" + +msgid "DHT replication of stale value avoided" +msgstr "DHT çoğaltılmasından kaçınılan bayat değerler" + +msgid "DHT replication of held values" +msgstr "DHT tutulan değerlerin çoğaltılması" + +msgid "DHT republishing of held values" +msgstr "DHT tutulan değerlerin tekrar yayını" + +msgid "DHT secondary-key value fetch issued" +msgstr "DHT ikincil anahtarlar ile değer istekleri" + +msgid "DHT duplicate values returned in lookups" +msgstr "DHT aramalarda sonuç olarak çift/kopya değerler" + +msgid "DHT detected KUID collisions" +msgstr "DHT tespit edilen KUİD çarpışmaları" + +msgid "DHT detected collisions with our own KUID" +msgstr "DHT Tespit edilen bizim KUİD'mizle çarpışmalar" + +msgid "DHT caching attempts" +msgstr "DHT önbelleğe koyma teşebbüsleri" + +msgid "DHT caching ended successfully" +msgstr "DHT başarılı önbelleğe koymalar" + +msgid "DHT caching partially completed" +msgstr "DHT tamamlanmamış önbelleğe koymalar" + +msgid "DHT key-offloading checks after discovering new closest node" +msgstr "DHT yeni en yakın düğüm bulunduğunda anahtar kaldırma denetimleri" + +msgid "DHT keys selected for offloading" +msgstr "DHT kaldırmak için seçilen anahtarlar" + +msgid "DHT key-offloading attempts" +msgstr "DHT anahtar kaldırma teşebbüsleri" + +msgid "DHT key-offloading ended successfully" +msgstr "DHT başarılı bir şekilde tamamlanan anahtar kaldırmaları" + +msgid "DHT key-offloading partially completed" +msgstr "DHT kısmen tamamlanan anahtar kaldırmaları" + +msgid "DHT values successfully offloaded" +msgstr "DHT başarılı bir şekilde kaldırılan değerler" + +msgid "DHT incoming messages" +msgstr "DHT içeriye gelen mesajlar" + +msgid "DHT incoming messages with UDP-matching contact address" +msgstr "DHT UDP ile denkleşen irtibat adresiyle alınan mesajlar" + +msgid "DHT incoming messages with contact address fixed" +msgstr "DHT içeriye gelen irtibat adresi düzeltilmiş mesajlar" + +msgid "DHT incoming messages from hostile addresses" +msgstr "DHT kötücül adreslerden gelen mesajlar" + +msgid "DHT incoming messages with hostile contact address" +msgstr "DHT kötücül irtibat adresiyle alınan mesajlar" + +msgid "DHT RPC messages prepared" +msgstr "DHT RPC hazırlanan mesajlar" + +msgid "DHT RPC messages cancelled" +msgstr "DHT RPC iptal edilen mesajlar" + +msgid "DHT RPC timed out" +msgstr "DHT RPC zaman aşımı" + +msgid "DHT RPC replies received" +msgstr "DHT RPC alınan cevaplar" + +msgid "DHT RPC replies with contact address fixed" +msgstr "DHT RPC irtibat adresi düzeltilmiş cevaplar" + +msgid "DHT RPC late replies received" +msgstr "DHT RPC alınan gecikmiş cevaplar" + +msgid "DHT RPC detected KUID mismatches on reply" +msgstr "DHT RCP cevaplarda tespit edilen KUİD uyumsuzlukları" + +msgid "DHT RPC recent nodes held" +msgstr "DHT RPC yakın geçmişte karşılaşılan ve hatırlanan düğümler" + +msgid "DHT node verifications" +msgstr "DHT düğüm doğrulamaları" + +msgid "DHT publishing attempts" +msgstr "DHT yayın teşebbüsleri" + +msgid "DHT publishing ended successfully (all roots)" +msgstr "DHT başarılı bir şekilde sona eren yayınlar (tüm kökler)" + +msgid "DHT publishing partially completed (root subset only)" +msgstr "DHT kısmen tamamlanan yayınlar (sadece kök altkümesi)" + +msgid "DHT publishing ending with proper value presence" +msgstr "DHT uygun değer varlığı ile biten yayınlar" + +msgid "DHT value republishing occurring too late (after expiry)" +msgstr "DHT çok geç meydana gelen (ömründen sonra) değer tekrar yayını" + +msgid "DHT publishing to self" +msgstr "DHT kendine yayın" + +msgid "DHT background publishing completion attempts" +msgstr "DHT arka planda yayın tamamlama teşebbüsleri" + +msgid "DHT background publishing completion showing improvements" +msgstr "DHT iyileşme gösteren arka planda yayın tamamlanması" + +msgid "DHT background publishing completion successful (all roots)" +msgstr "DHT arka planda başarılı yayınlama tamamlanması (tüm kökler)" + +msgid "DHT SHA1 data type collisions" +msgstr "DHT SHA1 veri tipi çarpışmaları" + +msgid "DHT lookup path passively protected against attack" +msgstr "DHT arama yolunun saldırılara karşı pasif olarak korunması" + +msgid "DHT lookup path actively protected against attack" +msgstr "DHT arama yolunun saldırılara karşı aktif olarak korunması" + +msgid "DHT alt-loc lookups issued" +msgstr "DHT yollanan alternatif kaynak (alt-loc) aramaları" + +msgid "DHT push-proxy lookups issued" +msgstr "DHT yollanan itme vekili aramaları" + +msgid "DHT successful alt-loc lookups" +msgstr "DHT başarılı alt-loc aramaları" + +msgid "DHT successful push-proxy lookups" +msgstr "DHT başarılı itme vekili aramaları" + +msgid "DHT successful node push-entry lookups" +msgstr "DHT başarılı itme vekili aramaları" + +msgid "DHT re-seeding of orphan downloads" +msgstr "DHT öksüz indirmelerin tekrar sunumu" + +msgid "Digests computed on general statistics" +msgstr "" + +msgid "Digests computed on TCP statistics" +msgstr "" + +msgid "Digests computed on UDP statistics" +msgstr "" + +msgid "Ping" +msgstr "Ping" + +msgid "Pong" +msgstr "Pong" + +msgid "Bye" +msgstr "Bye (Hoşçakal)" + +msgid "QRP" +msgstr "QRP" + +msgid "HSEP" +msgstr "HSEP" + +msgid "RUDP" +msgstr "RUDP" + +msgid "Vendor spec." +msgstr "Özel sağlayıcı" + +msgid "Vendor std." +msgstr "Standart sağlayıcı" + +msgid "Push" +msgstr "İtme" + +msgid "Query" +msgstr "Sorgu" + +msgid "Query hit" +msgstr "Sorgu isabeti" + +msgid "DHT (truncated)" +msgstr "DHT (kesilmiş)" + +msgid "DHT Ping" +msgstr "DHT Ping'i" + +msgid "DHT Pong" +msgstr "DHT pong'u" + +msgid "DHT Store" +msgstr "DHT'ye yazma" + +msgid "DHT Store Ack" +msgstr "DHT'ye yazma cevabı" + +msgid "DHT Find Node" +msgstr "DHT düğüm araması" + +msgid "DHT Found Node" +msgstr "Bulunan DHT düğümleri" + +msgid "DHT Find Value" +msgstr "DHT değer araması" + +msgid "DHT Value" +msgstr "DHT Değeri" + +msgid "G2 Crawl Request" +msgstr "G2 Tarama talebi" + +msgid "G2 Hub Advertisement" +msgstr "G2 Hub bildirimi" + +msgid "G2 Hub List" +msgstr "G2 Hub listesi" + +msgid "G2 Hub List Req" +msgstr "G2 Hub listesi talebi" + +msgid "G2 Hub List Ack" +msgstr "G2 Hub listesi onayı" + +msgid "G2 Local Node Info" +msgstr "G2 Yerel düğüm bilgisi" + +msgid "G2 Ping" +msgstr "G2 Ping" + +msgid "G2 Pong" +msgstr "G2 Pong" + +msgid "G2 Push" +msgstr "G2 İtme" + +msgid "G2 Query Key Ack" +msgstr "G2 Sorgu anahtarı onayı" + +msgid "G2 Query Key Req" +msgstr "G2 Sorgu anahtarı talebi" + +msgid "G2 Query" +msgstr "G2 Sorgu" + +msgid "G2 Query Ack" +msgstr "G2 Sorgu onayı" + +msgid "G2 Query Hit" +msgstr "G2 Sorgu isabeti" + +msgid "G2 Query Hash Table" +msgstr "G2 Sorgu Hash tablosu" + +msgid "G2 User Profile Check" +msgstr "G2 Kullanıcı profili kontrolü" + +msgid "G2 User Profile Data" +msgstr "G2 Kullanıcı profili verileri" + +msgid "Total" +msgstr "Toplam" + +msgid "Bad size" +msgstr "Yanlış boyut" + +msgid "Too small" +msgstr "Küçük" + +msgid "Too large" +msgstr "Büyük" + +msgid "Way too large" +msgstr "Çok büyük" + +msgid "Too old" +msgstr "Çok eski" + +msgid "Unknown message type" +msgstr "Bilinmeyen mesaj türü" + +msgid "Unexpected message" +msgstr "Beklenmedik mesaj" + +msgid "Message sent with TTL = 0" +msgstr "Mesaj TTL = 0 değeri ile yollandı" + +msgid "Improper hops/ttl combination" +msgstr "Yanlış hop/ttl kombinasyonu" + +msgid "Max TTL exceeded" +msgstr "Azami TTL aşıldı" + +msgid "Message throttle" +msgstr "Mesaj sayısı sınırlaması" + +msgid "Message matched limits" +msgstr "Mesaj boyutu sınırına erişildi" + +msgid "Transient node" +msgstr "Geçici düğüm" + +msgid "Unusable Pong" +msgstr "Kullanılamaz pong" + +msgid "Hard TTL limit reached" +msgstr "Sabit TTL sınırına erişildi" + +msgid "Max hop count reached" +msgstr "Azami hop sayısına ulaşıldı" + +msgid "Route lost" +msgstr "Yol kaybedildi" + +msgid "No route" +msgstr "Yol yok" + +msgid "Duplicate message" +msgstr "Kopya mesaj" + +msgid "OOB Proxy MUID Conflict" +msgstr "OOB vekili MUID çakışması" + +msgid "Message to banned GUID" +msgstr "Yasaklanmış GUİD'ye mesaj" + +msgid "Message from banned GUID" +msgstr "Yasaklanmış GUİD'den mesaj" + +msgid "Node shutting down" +msgstr "Düğüm kapanıyor" + +msgid "TX flow control" +msgstr "TX akış kontrolü" + +msgid "Query text had no trailing NUL" +msgstr "Sorgu metni NUL ile bitmiyor" + +msgid "Query text too short" +msgstr "Sorgu metni çok kısa" + +msgid "Query had unnecessary overhead" +msgstr "Gereksiz veri taşıyan sorgular" + +msgid "Query had bad URN" +msgstr "Sorgu bozuk URN içeriyor" + +msgid "Message with malformed SHA1" +msgstr "Yanlış yapılandırılmış SHA1 içeren mesaj" + +msgid "Message with malformed UTF-8" +msgstr "Yanlış yapılandırılmış UTF-8 içeren mesaj" + +msgid "Malformed Query Hit" +msgstr "Yanlış yapılandırılmış arama cevabı" + +msgid "Bad return address" +msgstr "Hatalı dönüş adresi" + +msgid "Hostile IP address" +msgstr "Kötücül İP adresi" + +msgid "Shunned IP address" +msgstr "Kaçınılan İP adresi" + +msgid "Bogus result from Morpheus" +msgstr "Morpheus istemcisinden hatalı sonuç" + +msgid "Spam" +msgstr "Spam" + +msgid "Evil filename" +msgstr "Şer dosya adı" + +msgid "Improper media type" +msgstr "Uygun olmayan dosya tipi" + +msgid "Payload inflating error" +msgstr "Yük genişletilmesinde hata" + +msgid "Unknown header flags present" +msgstr "Bilinmeyen başlık bayrakları mevcut" + +msgid "Own search results" +msgstr "Kendi arama sonuçlarımız" + +msgid "Own queries" +msgstr "Kendi sorgularımız" + +msgid "Ancient query format" +msgstr "Eski sorgu biçimi" + +msgid "Blank Servent ID" +msgstr "Boş istemci kimliği" + +msgid "GUESS Query missing token" +msgstr "GUESS sorgusunda jeton eksik" + +msgid "GUESS Invalid query token" +msgstr "Geçersiz GUESS sorgu jetonu" + +msgid "DHT Invalid security token" +msgstr "Geçersiz DHT güvenlik jetonu" + +msgid "DHT Too many STORE requests" +msgstr "DHT'de çok fazla STORE talebi" + +msgid "DHT Malformed message" +msgstr "Yanlış yapılandırılmış DHT mesajı" + +msgid "G2 Unexpected message" +msgstr "G2 Beklenmedik mesaj" + +msgid "Cannot cross networks" +msgstr "Ağlar arası geçiş yapılamaz" + msgid "No proxy" msgstr "Vekil sunucusuz" @@ -1015,20 +2282,57 @@ msgid "Indicates whether the ultracache file is being read." msgstr "Ultra düğümler arabelleğinin okunup okunmadığını gösterir." -msgid "Indicates that gtk-gnutella finds the version you run very VERY old. You should upgrade as soon as possible to avoid suffering from non-optimal Gnutella support that may not only damage your abilities to search and download but also harm the network since you're not supporting the newest features." -msgstr "gtk-gnutella'nın kullandığınız sürümü ÇOK eski bulduğunu gösterir. En yeni işlevleri içermeyen Gnutella desteğinin sadece sizin arama ve indirmelerinizin verimini düşürmekle kalmayıp ağa da kötü bir etkisi olabileceğinden en kısa zamanda sürümünüzü güncellemeniz önerilir." +msgid "" +"Indicates that gtk-gnutella finds the version you run very VERY old. You " +"should upgrade as soon as possible to avoid suffering from non-optimal " +"Gnutella support that may not only damage your abilities to search and " +"download but also harm the network since you're not supporting the newest " +"features." +msgstr "" +"gtk-gnutella'nın kullandığınız sürümü ÇOK eski bulduğunu gösterir. En yeni " +"işlevleri içermeyen Gnutella desteğinin sadece sizin arama ve " +"indirmelerinizin verimini düşürmekle kalmayıp ağa da kötü bir etkisi " +"olabileceğinden en kısa zamanda sürümünüzü güncellemeniz önerilir." -msgid "gtk-gnutella found a newer version on the Gnet and gives information about it here." -msgstr "gtk-gnutella Gnutella'da yeni bir sürüm buldu ve hakkındaki bilgileri burada sunuyor." +msgid "" +"gtk-gnutella found a newer version on the Gnet and gives information about " +"it here." +msgstr "" +"gtk-gnutella Gnutella'da yeni bir sürüm buldu ve hakkındaki bilgileri burada " +"sunuyor." -msgid "Try to keep at least this number of connections to other servents of the same kind as we are (normal or ultra nodes). This should be smaller than the maximum amount of connections to allow incoming connections. Keep in mind that the default TTL on Gnutella is 4, so this needs to be more than 30 to provide decent range for searches." -msgstr "Bizimle aynı kipte (normal ya da ultra düğüm) olan istemcilerle en az bu sayıda bağlantıyı korur. Bu sayı içeriye gelen bağlantılara izin verebilmek için azami bağlantı sayısından düşük olmalıdır. Gnutella'da varsayılan TTL'in 4 olduğunu unutmayınız, dolayısıyla aramalar için iyi bir kapsama alanı bulunması için bu sayının 30'un üzerinde olması gerekir." +msgid "" +"Try to keep at least this number of connections to other servents of the " +"same kind as we are (normal or ultra nodes). This should be smaller than the " +"maximum amount of connections to allow incoming connections. Keep in mind " +"that the default TTL on Gnutella is 4, so this needs to be more than 30 to " +"provide decent range for searches." +msgstr "" +"Bizimle aynı kipte (normal ya da ultra düğüm) olan istemcilerle en az bu " +"sayıda bağlantıyı korur. Bu sayı içeriye gelen bağlantılara izin verebilmek " +"için azami bağlantı sayısından düşük olmalıdır. Gnutella'da varsayılan " +"TTL'in 4 olduğunu unutmayınız, dolayısıyla aramalar için iyi bir kapsama " +"alanı bulunması için bu sayının 30'un üzerinde olması gerekir." -msgid "When in ultrapeer mode, try to keep at least this number of connections to normal servents. This should be smaller than the maximum amount of connections to allow incoming connections." -msgstr "Ultraeş olduğunuzda normal istemcilerle en az bu sayıda bağlantıyı koru. İçeriye gelen bağlantılara izin verebilmek için bu sayının azami bağlantı sayısından küçük olması gerekir." +msgid "" +"When in ultrapeer mode, try to keep at least this number of connections to " +"normal servents. This should be smaller than the maximum amount of " +"connections to allow incoming connections." +msgstr "" +"Ultraeş olduğunuzda normal istemcilerle en az bu sayıda bağlantıyı koru. " +"İçeriye gelen bağlantılara izin verebilmek için bu sayının azami bağlantı " +"sayısından küçük olması gerekir." -msgid "Don't allow more than this number of connections to other servents. As a rule of thumb you should reserve 256 b/s bandwidth per connection. Never use up all your bandwidth, leave a little space for TCP/IP overhead. It's not advisable that you set this to a value smaller than 40." -msgstr "Diğer istemcilerle bu sayıdan yüksek bağlantı kurma. Genel bir kural olarak her bağlantı için 256 b/s bant genişliği ayırmanız gerekir. Hiçbir zaman tüm bant genişliğinizi kullanmayın ve TCP/İP fazlası için biraz bant genişliği bırakın. Bu değeri 40'ın altında indirmeniz önerilmez." +msgid "" +"Don't allow more than this number of connections to other servents. As a " +"rule of thumb you should reserve 256 b/s bandwidth per connection. Never use " +"up all your bandwidth, leave a little space for TCP/IP overhead. It's not " +"advisable that you set this to a value smaller than 40." +msgstr "" +"Diğer istemcilerle bu sayıdan yüksek bağlantı kurma. Genel bir kural olarak " +"her bağlantı için 256 b/s bant genişliği ayırmanız gerekir. Hiçbir zaman tüm " +"bant genişliğinizi kullanmayın ve TCP/İP fazlası için biraz bant genişliği " +"bırakın. Bu değeri 40'ın altına indirmeniz önerilmez." msgid "Number of leaf nodes currently connected." msgstr "Şimdi bağlı olan yaprak düğüm sayısı." @@ -1039,16 +2343,31 @@ msgid "Number of ultra nodes currently connected." msgstr "Şimdi bağlı olan ultra düğüm sayısı." -msgid "Don't start more than this number of parallel downloads. Others will remain in the queue waiting for a download slot." -msgstr "Bu sayının üstünde eşzamanlı indirme başlatma. Diğer indirmeler kuyrukta bir oluk açılmasını bekleyecektir." +msgid "" +"Don't start more than this number of parallel downloads. Others will remain " +"in the queue waiting for a download slot." +msgstr "" +"Bu sayının üstünde eşzamanlı indirme başlatma. Diğer indirmeler kuyrukta bir " +"oluk açılmasını bekleyecektir." -msgid "Don't make more connections than given here to a single host to download a file. Be nice to others, and leave it at the default value (1)." -msgstr "Bir dosya indirmek için herhangi bir bilgisayarla burada belirtilenden fazla bağlantı kurma. Diğer kullanıcılara iyi davranın ve varsayılan değeri olduğu gibi bırakın (1)." +msgid "" +"Don't make more connections than given here to a single host to download a " +"file. Be nice to others, and leave it at the default value (1)." +msgstr "" +"Bir dosya indirmek için herhangi bir bilgisayarla burada belirtilenden fazla " +"bağlantı kurma. Diğer kullanıcılara iyi davranın ve varsayılan değeri olduğu " +"gibi bırakın (1)." -msgid "Don't allow more than this number of uploads in total. This also defines the amount of PARQ queues that will be used. You should at least set it to 2." -msgstr "Toplam olarak bu sayının üzerinde göndermelere izin verme. Bu aynı zamanda kullanılacak PARQ kuyruklarını da belirler. En az 2 değerini girmeniz gerekir." +msgid "" +"Don't allow more than this number of uploads in total. This also defines the " +"amount of PARQ queues that will be used. You should at least set it to 2." +msgstr "" +"Toplam olarak bu sayının üzerinde göndermelere izin verme. Bu aynı zamanda " +"kullanılacak PARQ kuyruklarını da belirler. En az 2 değerini girmeniz " +"gerekir." -msgid "Don't upload more than this number of files in parallel to a single host." +msgid "" +"Don't upload more than this number of files in parallel to a single host." msgstr "Bu sayıdan yüksek dosyayı aynı zamanda tek bir eşe gönderme." msgid "Local IPv4 address last determined." @@ -1058,124 +2377,277 @@ msgstr "Yerel İPv4 adresinin son belirlendiği zaman." msgid "When the current IPv4 address was determined." -msgstr "Şimdiki İPv4 adresinin belirlendiği zaman" +msgstr "Şimdiki İPv4 adresinin belirlendiği zaman." msgid "When the current IPv6 address was determined." -msgstr "Şimdiki İPv6 adresinin belirlendiği zaman" +msgstr "Şimdiki İPv6 adresinin belirlendiği vakit." msgid "Average uptime with the same IPv4 address." -msgstr "Aynı İPv4 adresi ile çalışma süresi (uptime)" +msgstr "Aynı İPv4 adresi ile çalışma süresi (uptime)." msgid "Average uptime with the same IPv6 address." -msgstr "Aynı İPv6 adresi ile çalışma süresi (uptime)" +msgstr "Aynı İPv6 adresi ile çalışma süresi (uptime)." msgid "Timestamp at which servent was started." msgstr "İstemcinin başlatıldığı zaman." msgid "Average servent uptime." -msgstr "Ortalama istemci çalışma süresi (uptime)" +msgstr "Ortalama istemci çalışma süresi (uptime)." -msgid "Local TCP port gtk-gnutella is listening on. ISPs often block or throttle traffic on TCP port 6346 so it is a good idea to change it to something in the range of 1024-65535. Don't forget to update your firewall port forwarding / opening, as necessary. Note that by default, the TCP port 6346 is not used to guard against undue censorship." -msgstr "gtk-gnutella'nın dinlediği yerel port. İnternet Erişim Sağlayıcıları çoğu zaman 6346 numaralı portu engeller ya da sınırlarlar, dolayısıyla bu sayıyı 1024 ilâ 65535 arası bir sayıyla değiştirmek iyi bir fikirdir. Güvenlik duvarınızın port açılışını gerektiği gibi ayarlamayı unutmayınız. Sansüre karşı korunmak amacıyla bu programda 6346 numaralı portun TCP için kullanılmadığı dikkatinize sunulur." +msgid "" +"Local TCP port gtk-gnutella is listening on. ISPs often block or throttle " +"traffic on TCP port 6346 so it is a good idea to change it to something in " +"the range of 1024-65535. Don't forget to update your firewall port " +"forwarding / opening, as necessary. Note that by default, the TCP port 6346 " +"is not used to guard against undue censorship." +msgstr "" +"gtk-gnutella'nın dinlediği yerel port. İnternet Erişim Sağlayıcıları çoğu " +"zaman 6346 numaralı portu engeller ya da sınırlarlar, dolayısıyla bu sayıyı " +"1024 ilâ 65535 arası bir sayıyla değiştirmek iyi bir fikirdir. Güvenlik " +"duvarınızın port açılışını gerektiği gibi ayarlamayı unutmayınız. Sansüre " +"karşı korunmak amacıyla bu programda 6346 numaralı portun TCP için " +"kullanılmadığı dikkatinize sunulur." msgid "Use this IP address as source address if 'force local ip' is activated." -msgstr "'yerel İP'yi zorla' etkinleştirildiyse bu İP adresini kaynak adres olarak kullan." +msgstr "" +"'yerel İP'yi zorla' etkinleştirildiyse bu İP adresini kaynak adres olarak " +"kullan." -msgid "Use this IPv6 address as source address if 'force local ip' is activated." -msgstr "'yerel İP'yi zorla' etkinleştirildiyse bu İPv6 adresini kaynak adres olarak kullan." +msgid "" +"Use this IPv6 address as source address if 'force local ip' is activated." +msgstr "" +"'yerel İP'yi zorla' etkinleştirildiyse bu İPv6 adresini kaynak adres olarak " +"kullan." -msgid "The connection bandwidth reported to other hosts. This is the speed at which you can upload things to others." -msgstr "Diğer bilgisayarlara bildirilen bant genişliğiniz. Başkalarına gönderme yapma hızınızdır bu." +msgid "" +"The connection bandwidth reported to other hosts. This is the speed at which " +"you can upload things to others." +msgstr "" +"Diğer bilgisayarlara bildirilen bant genişliğiniz. Başkalarına gönderme " +"yapma hızınızdır bu." -msgid "Whether the connection bandwidth reported to other hosts should be computed based on the current average upload speed. The reported speed is the available speed for a new upload, not the theoretical maximum configured: it is the average bandwidth (or the max configured bandwidth if no traffic yet) divided by the number of upload slots. When it is ON (recommended setting), the hardwired connection speed is not used." -msgstr "Diğer bilgisayarlara iletilen bant genişliğinin güncel gönderme hızı ortalamasına dayalı olup olmayacağını ayarlar. İletilen hız yapılandırmada belirtilen azami hız değil yeni bir gönderme için kullanılabilecek hızdır, yani ortalama gönderme oluklarıyla bölünen bant genişliğidir (ya da henüz hiçbir trafik yoksa yapılandırmada belirtilen azami bant genişliği). Seçilince (ki bu önerilir) fiziki bağlantı hızı kullanılmaz. " +msgid "" +"Whether the connection bandwidth reported to other hosts should be computed " +"based on the current average upload speed. The reported speed is the " +"available speed for a new upload, not the theoretical maximum configured: it " +"is the average bandwidth (or the max configured bandwidth if no traffic yet) " +"divided by the number of upload slots. When it is ON (recommended setting), " +"the hardwired connection speed is not used." +msgstr "" +"Diğer bilgisayarlara iletilen bant genişliğinin güncel gönderme hızı " +"ortalamasına dayalı olup olmayacağını ayarlar. İletilen hız yapılandırmada " +"belirtilen azami hız değil yeni bir gönderme için kullanılabilecek hızdır, " +"yani ortalama gönderme oluklarıyla bölünen bant genişliğidir (ya da henüz " +"hiçbir trafik yoksa yapılandırmada belirtilen azami bant genişliği). " +"Seçilince (ki bu önerilir) fiziki bağlantı hızı kullanılmaz." -msgid "Return at most this number of results to a query, using as many query hit packets as necessary. To avoid network flooding, keep this to a reasonable value." -msgstr "Bir sorguya en çok bu sayıda sonucu, ne kadar sorgu denkleşme paketi gerekiyorsa o kadarını kullanarak gönder. Şebekede aşırı yüke sebep olmamak için makûl bir değer tutunuz." +msgid "" +"Return at most this number of results to a query, using as many query hit " +"packets as necessary. To avoid network flooding, keep this to a reasonable " +"value." +msgstr "" +"Bir sorguya en çok bu sayıda sonucu, ne kadar sorgu isabet paketi " +"gerekiyorsa o kadarını kullanarak gönder. Şebekede aşırı yüke sebep olmamak " +"için makul bir değer tutunuz." -msgid "Unless this percentage or more of the upload bandwidth is used, allow additional upload slots." -msgstr "Gönderme bant genişliğinin bu yüzdesi ya da fazlası kullanılmadığı sürece ek gönderme oluklarına izin ver." +msgid "" +"Unless this percentage or more of the upload bandwidth is used, allow " +"additional upload slots." +msgstr "" +"Gönderme bant genişliğinin bu yüzdesi ya da fazlası kullanılmadığı sürece ek " +"gönderme oluklarına izin ver." msgid "Number of seconds before a download connect attempt times out." -msgstr "Bağlantı denemelerinin zaman aşımına uğrama süresi, saniye olarak" +msgstr "Bağlantı denemelerinin zaman aşımına uğrama süresi, saniye olarak." msgid "Number of seconds before a push request times out." -msgstr "İtme isteklerinin zaman aşımına uğrama süresi, saniye olarak" +msgstr "İtme isteklerinin zaman aşımına uğrama süresi, saniye olarak." msgid "Number of seconds before a download times out if no data is received." -msgstr "Hiçbir veri alınmazsa indirmelerin zaman aşımına uğrama süresi, saniye olarak" +msgstr "" +"Hiçbir veri alınmazsa indirmelerin zaman aşımına uğrama süresi, saniye " +"olarak." msgid "Minimum number of seconds to wait on auto-retry timeouts." -msgstr "Zaman aşımına uğrayan otomatik yeniden denemeler arası beklenecek asgari süre, saniye olarak." +msgstr "" +"Zaman aşımına uğrayan otomatik yeniden denemeler arası beklenecek asgari " +"süre, saniye olarak." msgid "Maximum number of seconds to wait on auto-retry timeouts." -msgstr "Zaman aşımına uğrayan otomatik yeniden denemeler arası beklenecek azami süre, saniye olarak." +msgstr "" +"Zaman aşımına uğrayan otomatik yeniden denemeler arası beklenecek azami " +"süre, saniye olarak." -msgid "Maximum number of attempts to download a file not counting HTTP busy indications." -msgstr "Bir dosyayı indirmek için azami deneme sayısı, HTTP meşgul belirtmeleri dikkate alınmadan." +msgid "" +"Maximum number of attempts to download a file not counting HTTP busy " +"indications." +msgstr "" +"Bir dosyayı indirmek için azami deneme sayısı, HTTP meşgul belirtmeleri " +"dikkate alınmadan." msgid "Delay in seconds before retrying after a connection timed out." -msgstr "Zaman aşımına uğrayan bir bağlantının tekrar denenmesi öncesi süre, saniye olarak." +msgstr "" +"Zaman aşımına uğrayan bir bağlantının tekrar denenmesi öncesi süre, saniye " +"olarak." -msgid "Delay in seconds before retrying after getting a 'busy' response from a host." -msgstr "Bir bilgisayardan 'meşgul' cevabı alındıktan sonra tekrar deneme aralığı, saniye olarak." +msgid "" +"Delay in seconds before retrying after getting a 'busy' response from a host." +msgstr "" +"Bir bilgisayardan 'meşgul' cevabı alındıktan sonra tekrar deneme aralığı, " +"saniye olarak." -msgid "Delay in seconds before retrying after getting a 'connection refused' response from a host." -msgstr "Bir bilgisayardan 'bağlantı reddedildi' cevabı alındıktan sonra tekrar deneme aralığı, saniye olarak." +msgid "" +"Delay in seconds before retrying after getting a 'connection refused' " +"response from a host." +msgstr "" +"Bir bilgisayardan 'bağlantı reddedildi' cevabı alındıktan sonra tekrar " +"deneme aralığı, saniye olarak." -msgid "Delay in seconds before retrying after a retry stopped (timed out, connection reset by peer, etc...)." -msgstr "Bir yeniden deneme sona erdikten sonra (zaman aşımı, eşin bağlantıyı kesmesi) tekrar deneme aralığı, saniye olarak." +msgid "" +"Delay in seconds before retrying after a retry stopped (timed out, " +"connection reset by peer, etc...)." +msgstr "" +"Bir yeniden deneme sona erdikten sonra (zaman aşımı, eşin bağlantıyı " +"kesmesi) tekrar deneme aralığı, saniye olarak." -msgid "Amount of bytes to overlap when resuming a download. It should be at least 64 bytes for safe resuming, otherwise gtk-gnutella will not accept to resume a file for which we had no SHA1 known, after a server gives one back." -msgstr "Bir indirme duraklatılıp sürdürüldüğünde kaplanacak bayt sayısı. Sürdürmenin güvenli olması için en az 64 bayt olmalıdır, aksi takdirde gtk-gnutella SHA1 değerini önceden bilmediğimiz bir indirmeyi, bir sunucu bu değeri verdiğinde sürdürmeyi kabul etmeyecektir." +msgid "" +"Amount of bytes to overlap when resuming a download. It should be at least " +"64 bytes for safe resuming, otherwise gtk-gnutella will not accept to resume " +"a file for which we had no SHA1 known, after a server gives one back." +msgstr "" +"Bir indirme duraklatılıp sürdürüldüğünde kaplanacak bayt sayısı. Sürdürmenin " +"güvenli olması için en az 64 bayt olmalıdır, aksi takdirde gtk-gnutella SHA1 " +"değerini önceden bilmediğimiz bir indirmeyi, bir sunucu bu değeri verdiğinde " +"sürdürmeyi kabul etmeyecektir." -msgid "Number of seconds before an upload times out if no connection can be established during a push. It is also the maximum amount of time we wait to get the whole HTTP request." -msgstr "İtme sırasında bağlantı sağlanamazsa, bir göndermenin saniye olarak zaman aşımına uğrama süresi. Bu aynı zamanda bir HTTP isteğinin tamamını almak için bekleyeceğimiz azami süredir." +msgid "" +"Number of seconds before an upload times out if no connection can be " +"established during a push. It is also the maximum amount of time we wait to " +"get the whole HTTP request." +msgstr "" +"İtme sırasında bağlantı sağlanamazsa, bir göndermenin saniye olarak zaman " +"aşımına uğrama süresi. Bu aynı zamanda bir HTTP isteğinin tamamını almak " +"için bekleyeceğimiz azami süredir." -msgid "Number of seconds after which an upload times out if no data is transmitted." -msgstr "Göndermelerin hiçbir veri aktarımı olmazsa zaman aşımına uğrama süresi, saniye olarak." +msgid "" +"Number of seconds after which an upload times out if no data is transmitted." +msgstr "" +"Göndermelerin hiçbir veri aktarımı olmazsa zaman aşımına uğrama süresi, " +"saniye olarak." -msgid "Amount of seconds to wait before a search is issued again to see if new results are available. Be very careful with this parameter, and do not set it too low or you will damage the Gnutella network. A delay of half an hour is fine." -msgstr "Yeni sonuçların bulunup bulunmadığına bakmak için bir aramanın saniye olarak yenilenme süresi. Bu ayarı değiştirirken dikkatli olun ve Gnutella ağına zarar verebilecek düşük bir değer seçmeyin. Yarım saat gibi bir süre uygundur." +msgid "" +"Amount of seconds to wait before a search is issued again to see if new " +"results are available. Be very careful with this parameter, and do not set " +"it too low or you will damage the Gnutella network. A delay of half an hour " +"is fine." +msgstr "" +"Yeni sonuçların bulunup bulunmadığına bakmak için bir aramanın saniye olarak " +"yenilenme süresi. Bu ayarı değiştirirken dikkatli olun ve Gnutella ağına " +"zarar verebilecek düşük bir değer seçmeyin. Yarım saat gibi bir süre " +"uygundur." -msgid "Maximum ratio of file descriptors reserved for banning. For instance, if your OS gives you 350 file descriptors, a ratio of 10 will reserve at most 35 file descriptors. You should ensure you have around 100 file descriptors for efficient banning." -msgstr "Yasaklama için ayrılan dosya tanımlayıcılarının azami oranı. Örneğin, işletim sisteminiz size 350 dosya tanımlayıcısı veriyorsa, 10 oranı en fazla 35 dosya tanımlayıcısı ayırır. Etkin yasaklama için 100 civarı dosya tanımlayıcınız olması önerilir." +msgid "" +"Maximum ratio of file descriptors reserved for banning. For instance, if " +"your OS gives you 350 file descriptors, a ratio of 10 will reserve at most " +"35 file descriptors. You should ensure you have around 100 file descriptors " +"for efficient banning." +msgstr "" +"Yasaklama için ayrılan dosya tanımlayıcılarının azami oranı. Örneğin, " +"işletim sisteminiz size 350 dosya tanımlayıcısı veriyorsa, 10 oranı en fazla " +"35 dosya tanımlayıcısı ayırır. Etkin yasaklama için 100 civarı dosya " +"tanımlayıcınız olması önerilir." msgid "Maximum number of file descriptors reserved for banning." msgstr "Yasaklamalar için ayrılan dosya tanımlayıcıları." -msgid "Amount of file descriptors currently used for banning, i.e. which are currently kept open for delayed close." -msgstr "Şu anda yasaklamalar için kullanılan dosya tanımlayıcı miktarı, yani halihazırda açık tutulan, sonra kapatılacak tanımlayıcılar." +msgid "" +"Amount of file descriptors currently used for banning, i.e. which are " +"currently kept open for delayed close." +msgstr "" +"Şu anda yasaklamalar için kullanılan dosya tanımlayıcı miktarı, yani " +"hâlihazırda açık tutulan, sonra kapatılacak tanımlayıcılar." msgid "Number of file descriptors we'll actually be using for banning." msgstr "Yasaklamalar için kullanacağımız dosya tanımlayıcıları." -msgid "Number of seconds an incoming connection has to start sending out its request." -msgstr "İçeriye gelen bir bağlantının sorgularını göndermeye başlaması için saniye olarak verilen süre." +msgid "" +"Number of seconds an incoming connection has to start sending out its " +"request." +msgstr "" +"İçeriye gelen bir bağlantının sorgularını göndermeye başlaması için saniye " +"olarak verilen süre." -msgid "Number of seconds before a Gnet connect attempt times out if no connection can be established." -msgstr "Bir Gnet bağlantı teşebbüsünün bağlantı kurulamazsa saniye olarak zaman aşımı süresi." +msgid "" +"Number of seconds before a Gnet connect attempt times out if no connection " +"can be established." +msgstr "" +"Bir Gnet bağlantı teşebbüsünün bağlantı kurulamazsa saniye olarak zaman " +"aşımı süresi." -msgid "Number of seconds before a Gnet connection times out if no data is transmitted." -msgstr "Hiçbir veri aktarılmazsa saniye olarak bir Gnet bağlantısının zaman aşımı süresi." +msgid "" +"Number of seconds before a Gnet connection times out if no data is " +"transmitted." +msgstr "" +"Hiçbir veri aktarılmazsa saniye olarak bir Gnet bağlantısının zaman aşımı " +"süresi." -msgid "Maximum size of the sendqueue for the nodes (in bytes). Must be at least 150 percent of the maximum message size." -msgstr "Düğümler için gönderim kuyruğunun azami boyutu (bayt olarak). Azami mesaj boyutunun en az yüzde 150'sine denk gelmelidir." +msgid "" +"Maximum size of the sendqueue for the nodes (in bytes). Must be at least 150 " +"percent of the maximum message size." +msgstr "" +"Düğümler için gönderim kuyruğunun azami boyutu (bayt olarak). Azami mesaj " +"boyutunun en az yüzde 150'sine denk gelmelidir." -msgid "Maximum number of seconds a node can remain in transmit flow control before being kicked out." -msgstr "Bir düğümün kovulmadan iletim akış kontrolünde kalabileceği azami saniye sayısı." +msgid "" +"Maximum number of seconds a node can remain in transmit flow control before " +"being kicked out." +msgstr "" +"Bir düğümün kovulmadan iletim akış kontrolünde kalabileceği azami saniye " +"sayısı." -msgid "Maximum percentage of time over 5 minutes that our node can remain in flow control remotely before dropping the connection. This only works with nodes that will send us an hops-flow message when they are flow-controlling us." -msgstr "5 dakika boyunca düğümümüzün bağlantıyı kesmeden uzaktan akış kontrolünde kalabileceği süre yüzdesi. Bu sadece bizi akış kontrolünde tuttukça bize hops-flow (atlama akışı) mesajı yollayan düğümler ile çalışır." +msgid "" +"Maximum percentage of time over 5 minutes that our node can remain in flow " +"control remotely before dropping the connection. This only works with nodes " +"that will send us an hops-flow message when they are flow-controlling us." +msgstr "" +"5 dakika boyunca düğümümüzün bağlantıyı kesmeden uzaktan akış kontrolünde " +"kalabileceği süre yüzdesi. Bu sadece bizi akış kontrolünde tuttukça bize " +"hops-flow (atlama akışı) mesajı yollayan düğümler ile çalışır." -msgid "Maximum TTL we allow in messages we broadcast. If a query comes in with a TTL greater than that, it will be trimmed down to that value. On Gnutella, the standard is TTL=4, so you cannot set a value lower than that." -msgstr "Yayınladığımız mesajlarda izin verdiğimiz azami TTL (Time to Live) değeri. Eğer bir sorgu bundan yüksek bir TTL ile gelirse bu değere düşürülecektir. Gnutella'da standart TTL değeri 4'tür dolayısıyla bundan az bir değer seçemezsiniz." +msgid "" +"Maximum TTL we allow in messages we broadcast. If a query comes in with a " +"TTL greater than that, it will be trimmed down to that value. On Gnutella, " +"the standard is TTL=4, so you cannot set a value lower than that." +msgstr "" +"Yayınladığımız mesajlarda izin verdiğimiz azami TTL (Time to Live) değeri. " +"Eğer bir sorgu bundan yüksek bir TTL ile gelirse bu değere düşürülecektir. " +"Gnutella'da standart TTL değeri 4'tür dolayısıyla bundan az bir değer " +"seçemezsiniz." -msgid "The TTL we use in messages we generate. The default on Gnutella is TTL=4. If you set it to too large a value, you run the risk of being trimmed down by fellow gtk-gnutella nodes, or kicked out by some other servent." -msgstr "Oluşturduğumuz mesajlarda kullandığımız TTL değeri. Gnutella'da varsayılan TTL=4'tür. Çok yüksek bir değer seçilmesi, diğer gtk-gnutella düğümleri tarafından bu değerin düşürülmesi ve başka istemcilerin sizi yasaklaması riskini taşır." +msgid "" +"The TTL we use in messages we generate. The default on Gnutella is TTL=4. " +"If you set it to too large a value, you run the risk of being trimmed down " +"by fellow gtk-gnutella nodes, or kicked out by some other servent." +msgstr "" +"Oluşturduğumuz mesajlarda kullandığımız TTL değeri. Gnutella'da varsayılan " +"TTL=4'tür. Çok yüksek bir değer seçilmesi, diğer gtk-gnutella düğümleri " +"tarafından bu değerin düşürülmesi ve başka istemcilerin sizi yasaklaması " +"riskini taşır." -msgid "Maximum hard TTL limit (hops + TTL) on messages we relay. This should be greater than the standard TTL=4, because it is also applied to routed-back messages (query hits) that could be re-routed in case a connection is lost. Standard broadcasted messages have their TTL limited by the maximum TTL you configure, and that limit should be much lower than the value of this parameter." -msgstr "Aktardığımız mesajlardaki azami TTL sınırı (hop + TTL). Bu standart TTL=4 değerinden daha büyük olmalıdır çünkü aynı zamanda bağlantı kaybı meydana geldiğinde yeniden yönlendirilebilecek geri yönlendirilen mesajları da (sorgu denkleşmeleri) kapsar. Yayınlanan standart mesajların TTL'i (Time to Live, ömürleri) yapılandırdığınız azami TTL ile sınırlandırılır ve bu değerden çok daha küçük olmalıdır." +msgid "" +"Maximum hard TTL limit (hops + TTL) on messages we relay. This should be " +"greater than the standard TTL=4, because it is also applied to routed-back " +"messages (query hits) that could be re-routed in case a connection is lost. " +"Standard broadcasted messages have their TTL limited by the maximum TTL you " +"configure, and that limit should be much lower than the value of this " +"parameter." +msgstr "" +"Aktardığımız mesajlardaki azami TTL sınırı (hop + TTL). Bu standart TTL=4 " +"değerinden daha büyük olmalıdır çünkü aynı zamanda bağlantı kaybı meydana " +"geldiğinde yeniden yönlendirilebilecek geri yönlendirilen mesajları da " +"(sorgu isabetlerini) kapsar. Yayınlanan standart mesajların TTL'i (Time to " +"Live, ömürleri) yapılandırdığınız azami TTL ile sınırlandırılır ve bu " +"değerden çok daha küçük olmalıdır." msgid "For development use: debug level." msgstr "Geliştirmede kullanım için: hata ayıklama seviyesi." @@ -1184,7 +2656,8 @@ msgstr "Yasaklama kodu için hata ayıklama seviyesi." msgid "If not zero, periodic messages show the used CPU time." -msgstr "Sıfır değilse periyodik mesajlar kullanılan mikroişlemci zamanını gösterir." +msgstr "" +"Sıfır değilse periyodik mesajlar kullanılan mikroişlemci zamanını gösterir." msgid "Debug level for download mesh management." msgstr "Birden çok kaynaktan indirme yönetimi için hata ayıklama seviyesi." @@ -1217,10 +2690,9 @@ msgstr "Göndermeler için hata ayıklama seviyesi." msgid "Debug level for code shared between gui and core." -msgstr "Çekirdek ve grafik arayüz arasında paylaşılan kod için hata ayıklama seviyesi." - -msgid "Verbosity of Bitzi related debug messages." -msgstr "Bitzi hakkında hata ayıklama mesajlarının gevezeliği." +msgstr "" +"Çekirdek ve grafik arayüz arasında paylaşılan kod için hata ayıklama " +"seviyesi." msgid "Verbosity of URL handling related debug messages." msgstr "URL yönetimi hakkında hata ayıklama mesajlarının gevezeliği." @@ -1229,7 +2701,7 @@ msgstr "Dinamik sorgu yönlendirmesi için hata ayıklama seviyesi." msgid "Debug level for dynamic queries." -msgstr "Dinamik sorgular için hata ayıklama seviyesi" +msgstr "Dinamik sorgular için hata ayıklama seviyesi." msgid "Debug level for vendor messages." msgstr "Sağlayıcı mesajları için hata ayıklama seviyesi." @@ -1264,56 +2736,117 @@ msgid "Debug level for PARQ." msgstr "PARQ için hata ayıklama seviyesi." -msgid "If set, PARQ will calculate its ETA and retry times more optimistically. If not set PARQ will calculate using a worst case scenario. The default is to be optimistic." -msgstr "Seçilirse, PARQ ETA'sını (tahmini sona erme zamanı) ve tekrar deneme zamanlarını iyimser olarak hesaplayacaktır. Seçilmezse, PARQ en kötü durum senaryosunu kullanarak yapacaktır bu hesapları. Varsayılan değer iyimser olmaktır." +msgid "" +"If set, PARQ will calculate its ETA and retry times more optimistically. If " +"not set PARQ will calculate using a worst case scenario. The default is to " +"be optimistic." +msgstr "" +"Seçilirse, PARQ ETA'sını (tahmini sona erme zamanı) ve tekrar deneme " +"zamanlarını iyimser olarak hesaplayacaktır. Seçilmezse, PARQ en kötü durum " +"senaryosunu kullanarak yapacaktır bu hesapları. Varsayılan değer iyimser " +"olmaktır." -msgid "Maximum size in bytes of an upload which PARQ shall not queue and is always allowed to continue. However, if a client requests small chunks over and over the chunk sizes previously requested and uploaded are also counted. If the size requested is greater than the threshold then, and only then, we look at the theoretical time it would take to serve the whole amount to see whether we can still bypass queuing. Set to 0 to disable this size-based bypassing feature and only rely on time-based bypassing." -msgstr "PARQ'ın devam etmesine izin verilecek ve kuyruğa koymayacağı azami gönerme boyutu. Bununla beraber, bir istemci art arda küçük parçalar isterse, daha önce istenen ve gönderilen parçaların boyutu da dikkate alınacaktır. İstenen boyut eşiği geçerse, ve sadece eşiği geçtiği durumda, bütün miktarı göndermenin alacağı teorik süreyi dikkate alıp kuyruğa konulmayı atlayıp atlamayacağına karar veririz. Boyuta göre kuyruğu atlama işlevini devre dışı bırakıp sadece süreye göre kuyruk atlamaya dayanmak istiyorsanız, 0 değerini seçiniz." +msgid "" +"Maximum size in bytes of an upload which PARQ shall not queue and is always " +"allowed to continue. However, if a client requests small chunks over and " +"over the chunk sizes previously requested and uploaded are also counted. If " +"the size requested is greater than the threshold then, and only then, we " +"look at the theoretical time it would take to serve the whole amount to see " +"whether we can still bypass queuing. Set to 0 to disable this size-based " +"bypassing feature and only rely on time-based bypassing." +msgstr "" +"PARQ'ın devam etmesine izin verilecek ve kuyruğa koymayacağı azami gönerme " +"boyutu. Bununla beraber, bir istemci art arda küçük parçalar isterse, daha " +"önce istenen ve gönderilen parçaların boyutu da dikkate alınacaktır. İstenen " +"boyut eşiği geçerse, ve sadece eşiği geçtiği durumda, bütün miktarı " +"göndermenin alacağı teorik süreyi dikkate alıp kuyruğa konulmayı atlayıp " +"atlamayacağına karar veririz. Boyuta göre kuyruğu atlama işlevini devre dışı " +"bırakıp sadece süreye göre kuyruk atlamaya dayanmak istiyorsanız, 0 değerini " +"seçiniz." -msgid "When an upload is expected to take less than this setting in seconds, PARQ will be instructed to not queue the upload. This check is done AFTER the file size-based bypassing. Set to 0 to disable this time-based bypassing feature." -msgstr "Bir göndermenin burada saniye olarak belirtilen süreden daha az sürmesi beklendiğinde, PARQ bu göndermeyi kuyruğa eklemeyecektir. Bu denetleme dosya boyutuna dayalı olarak kuyruğa konulmanın görmezden gelinmesinden SONRA yapılacaktır. Süreye dayalı olarak kuyruğa koymayı atlama işlevini devre dışı bırakmak için 0 değerini seçiniz." +msgid "" +"When an upload is expected to take less than this setting in seconds, PARQ " +"will be instructed to not queue the upload. This check is done AFTER the " +"file size-based bypassing. Set to 0 to disable this time-based bypassing " +"feature." +msgstr "" +"Bir göndermenin burada saniye olarak belirtilen süreden daha az sürmesi " +"beklendiğinde, PARQ bu göndermeyi kuyruğa eklemeyecektir. Bu denetleme dosya " +"boyutuna dayalı olarak kuyruğa konulmanın görmezden gelinmesinden SONRA " +"yapılacaktır. Süreye dayalı olarak kuyruğa koymayı atlama işlevini devre " +"dışı bırakmak için 0 değerini seçiniz." -msgid "Ban the client if it violates the Retry-After interval too often. Set this to 0 to disable the banning. The upload will be removed from the queue in any case though. Default is 10, so the client is banned after retrying too soon 10 times, which is a good balance between abuse and legacy client support." -msgstr "İstemciyi tekrar deneme aralığını çok sık ihlâl ediyorsa yasakla. Yasaklamayı devre dışı bırakmak için bunu sıfıra ayarlayın, ancak her durumda gönderme kuyruktan kaldırılacaktır. Varsayılan değer 10'dur, böylece istemci çok erken 10 denemeden sonra yasaklanır ki bu eski istemcileri destekleme ve suistimal yapanlardan korunma arasında iyi bir dengedir." +msgid "" +"Ban the client if it violates the Retry-After interval too often. Set this " +"to 0 to disable the banning. The upload will be removed from the queue in " +"any case though. Default is 10, so the client is banned after retrying too " +"soon 10 times, which is a good balance between abuse and legacy client " +"support." +msgstr "" +"İstemciyi tekrar deneme aralığını çok sık ihlâl ediyorsa yasakla. " +"Yasaklamayı devre dışı bırakmak için bunu sıfıra ayarlayın, ancak her " +"durumda gönderme kuyruktan kaldırılacaktır. Varsayılan değer 10'dur, böylece " +"istemci çok erken 10 denemeden sonra yasaklanır ki bu eski istemcileri " +"destekleme ve suistimal yapanlardan korunma arasında iyi bir dengedir." -msgid "For development use: track properties." -msgstr "Geliştirmede kullanım için: özellikleri izle." +msgid "Indicates a kernel network buffer shortage." +msgstr "Kernel şebeke arabelleğinin yetersizliğine işaret eder." msgid "For development use: don't add new hosts to the host cache." -msgstr "Geliştirmede kullanım için: bilgisayar arabelleğine yeni bilgisayar ekleme." +msgstr "" +"Geliştirmede kullanım için: bilgisayar arabelleğine yeni makine ekleme." msgid "Enable bandwidth limitation for incoming HTTP traffic." -msgstr "İçeriye gelen HTTP trafiği için bant genişliği sınırlamasını etkinleştir." +msgstr "" +"İçeriye gelen HTTP trafiği için bant genişliği sınırlamasını etkinleştir." msgid "Enable bandwidth limitation for outgoing HTTP traffic." -msgstr "Dışarıya giden HTTP trafiği için bant genişliği sınırlamasını etkinleştir." +msgstr "" +"Dışarıya giden HTTP trafiği için bant genişliği sınırlamasını etkinleştir." msgid "Enable bandwidth limitation for incoming Gnet traffic." -msgstr "İçeriye gelen Gnet trafiği için bant genişliği sınırlamasını etkinleştir." +msgstr "" +"İçeriye gelen Gnet trafiği için bant genişliği sınırlamasını etkinleştir." msgid "Enable bandwidth limitation for incoming Gnet leaf traffic." -msgstr "İçeriye gelen yaprak Gnet trafiği için bant genişliği sınırlamasını etkinleştir." +msgstr "" +"İçeriye gelen yaprak Gnet trafiği için bant genişliği sınırlamasını " +"etkinleştir." msgid "Enable bandwidth limitation for outgoing Gnet traffic." -msgstr "Dışarıya giden Gnet trafiği için bant genişliği sınırlamasını etkinleştir." +msgstr "" +"Dışarıya giden Gnet trafiği için bant genişliği sınırlamasını etkinleştir." msgid "Enable bandwidth limitation for outgoing Gnet leaf traffic." -msgstr "Dışarıya giden Gnet yaprak trafiği için bant genişliği sınırlamasını etkinleştir." +msgstr "" +"Dışarıya giden Gnet yaprak trafiği için bant genişliği sınırlamasını " +"etkinleştir." msgid "Enable dynamic upload slots allocation." msgstr "Dinamik oluk atamasını etkinleştir." -msgid "Allow HTTP and Gnutella to grab whatever bandwidth the other is not using. If FALSE, unused bandwidth is lost." -msgstr "HTTP ve Gnutella'ya diğerinin kullanmadığı bant genişliğini kullanma izni ver. Devre dışıysa, kullanılmayan bant genişliği kaybedilir." +msgid "" +"Allow HTTP and Gnutella to grab whatever bandwidth the other is not using. " +"If FALSE, unused bandwidth is lost." +msgstr "" +"HTTP ve Gnutella'ya diğerinin kullanmadığı bant genişliğini kullanma izni " +"ver. Devre dışıysa, kullanılmayan bant genişliği kaybedilir." msgid "Auto clear completed downloads." msgstr "Tamamlanan indirmeleri otomatik temizle." -msgid "Auto clear failed downloads (HTTP error, failure to resume, write error, etc...)." -msgstr "Başarısız indirmeleri (HTTP, sürdürme, yazma hatası, vs.) otomatik temizle." +msgid "" +"Auto clear failed downloads (HTTP error, failure to resume, write error, " +"etc...)." +msgstr "" +"Başarısız indirmeleri (HTTP, sürdürme, yazma hatası, vs.) otomatik temizle." -msgid "Auto clear unavailable downloads (connection timeout, push route lost, etc...)." -msgstr "Müsait olmayan indirmeleri (zaman aşımı, itme yolu kaybedilmesi vs.) otomatik temizle." +msgid "" +"Auto clear unavailable downloads (connection timeout, push route lost, " +"etc...)." +msgstr "" +"Müsait olmayan indirmeleri (zaman aşımı, itme yolu kaybedilmesi vs.) " +"otomatik temizle." msgid "Auto clear finished downloads" msgstr "Sona eren indirmeleri otomatik temizle" @@ -1322,43 +2855,61 @@ msgstr "İndirilen dosyaları arama sonuçlarından kaldır." msgid "Enable to use forced_local_ip as local ip." -msgstr "forced_local_ip değerini yerel İP olarak kullanmak için etkinleştirebilirsiniz." +msgstr "" +"forced_local_ip değerini yerel İP olarak kullanmak için " +"etkinleştirebilirsiniz." msgid "Enable to use forced_local_ip6 as local ip." -msgstr "forced_local_ip6 değerini yerel İP olarak kullanmak için etkinleştirebilirsiniz." +msgstr "" +"forced_local_ip6 değerini yerel İP olarak kullanmak için " +"etkinleştirebilirsiniz." -msgid "If 'forced_local_ip' is enabled, bind the socket to the forced IP address." +msgid "" +"If 'forced_local_ip' is enabled, bind the socket to the forced IP address." msgstr "Eğer 'forced_local_ip' etkinse, soketi zorlanan İP adresine bağla." -msgid "If 'forced_local_ip6' is enabled, bind the socket to the forced IP address." +msgid "" +"If 'forced_local_ip6' is enabled, bind the socket to the forced IP address." msgstr "Eğer 'forced_local_ip6' etkinse, soketi zorlanan İP adresine bağla." msgid "Try to connect to local networks first." msgstr "Önce yerel ağlara bağlanmayı dene." -msgid "Check this button if you want to use gtk-gnutella on your Local Area Network. RFC1918 will be ignored." -msgstr "gtk-gnutella'yı yerel şebekenizde kullanmak istiyorsanız bu şıkkı seçiniz. RFC1918 görmezden gelinir." +msgid "" +"Check this button if you want to use gtk-gnutella on your Local Area " +"Network. RFC1918 will be ignored." +msgstr "" +"gtk-gnutella'yı yerel şebekenizde kullanmak istiyorsanız bu şıkkı seçiniz. " +"RFC1918 görmezden gelinir." -msgid "Check this button if you want gtk-gnutella to use IP TOS to differentiate interactive, normal and bulk data. This is probably a good idea in most cases, and can particularly help with badly misconfigured hosts, LANs, and ISPs." -msgstr "gtk-gnutella'nın İP TOS kullanarak etkileşimli, toplu ve normal verileri ayırt etmesini istiyorsanız bu şıkkı seçiniz. Bu muhtemelen çoğu durumda iyi bir fikirdir ve özellikle yanlış yapılandırılmış bilgisayarlar, LAN, ve erişim sağlayıcıları bulunduğu durumda yardımcı olabilir." +msgid "" +"Check this button if you want gtk-gnutella to use IP TOS to differentiate " +"interactive, normal and bulk data. This is probably a good idea in most " +"cases, and can particularly help with badly misconfigured hosts, LANs, and " +"ISPs." +msgstr "" +"gtk-gnutella'nın İP TOS kullanarak etkileşimli, toplu ve normal verileri " +"ayırt etmesini istiyorsanız bu şıkkı seçiniz. Bu muhtemelen çoğu durumda iyi " +"bir fikirdir ve özellikle yanlış yapılandırılmış bilgisayarlar, LAN, ve " +"erişim sağlayıcıları bulunduğu durumda yardımcı olabilir." msgid "Remove files of aborted downloads from disk." msgstr "İptal edilen indirmelerin dosyalarını diskten sil." msgid "Use username and password to authenticate to proxy." -msgstr "Vekil sunucu için kullanıcı adı ve şifre kullan." +msgstr "Vekil sunucu için kullanıcı adı ve parola kullan." msgid "Username for proxy." msgstr "Vekil için kullanıcı adı." msgid "Password for proxy." -msgstr "Vekil sunucu için şifre." +msgstr "Vekil sunucu için parola." msgid "Address of the proxy." msgstr "Vekil sunucunun adresi." msgid "Hostname of the proxy." -msgstr "Vekilin bilgisayar ismi." +msgstr "Vekilin makine ismi." msgid "TCP Port the proxy is listening on." msgstr "Vekil sunucunun dinlediği TCP portu." @@ -1370,22 +2921,27 @@ msgstr "Kullanılacak ağ protokolleri." msgid "Use an IPv6-to-IPv4 Transport Relay Translator asspecified by RFC 3142." -msgstr "RFC 3142'de belirtildiği gibi İPv6'dan İPv4'e çeviri (Transport Relay Translator) kullan." +msgstr "" +"RFC 3142'de belirtildiği gibi İPv6'dan İPv4'e çeviri (Transport Relay " +"Translator) kullan." -msgid "The IPv6 address prefix used by the IPv6-to-IPv4 Transport Relay Translator." -msgstr "İPv6 ve İPv4 Ulaştırma Röle Tercümanı tarafından kullanılan İPv6 adresi öneki." +msgid "" +"The IPv6 address prefix used by the IPv6-to-IPv4 Transport Relay Translator." +msgstr "" +"İPv6 ve İPv4 Ulaştırma Röle Tercümanı tarafından kullanılan İPv6 adresi " +"öneki." msgid "Current number of hosts in regular node caches." -msgstr "Normal düğüm arabelleklerindeki güncel bilgisayar sayısı." +msgstr "Normal düğüm arabelleklerindeki güncel makine sayısı." msgid "Current number of IPv4 hosts in ultra node caches." msgstr "Ultra düğüm arabelleklerindeki güncel İPv4 bilgisayar sayısı." msgid "Current number of hosts in bad node caches." -msgstr "Kötü düğüm arabelleklerindeki güncel bilgisayar sayısı." +msgstr "Kötü düğüm arabelleklerindeki güncel makine sayısı." msgid "Maximum number of hosts in the regular node cache." -msgstr "Normal düğüm arabelleğindeki azami bilgisayar sayısı." +msgstr "Normal düğüm arabelleğindeki azami makine sayısı." msgid "Maximum number of IPv4 hosts in the ultra node cache." msgstr "Ultra düğüm arabelleğindeki azami İPv4 bilgisayar sayısı." @@ -1393,83 +2949,188 @@ msgid "Maximum number of hosts in the BUSY, UNSTABLE and TIMEOUT lists." msgstr "BUSY, UNSTABLE ve TIMEOUT listelerindeki azami bilgisayar sayısı." -msgid "Amount of tolerable messages above hard TTL limit per node. See also MAX_HIGH_TTL_RADIUS" -msgstr "Her düğüm için sabit TTL sınırı üzeri kabul edilebilir mesaj miktarı. MAX_HIGH_TTL_RADIUS'a da bakınız." +msgid "" +"Amount of tolerable messages above hard TTL limit per node. See also " +"MAX_HIGH_TTL_RADIUS" +msgstr "" +"Her düğüm için sabit TTL sınırı üzeri kabul edilebilir mesaj miktarı. " +"MAX_HIGH_TTL_RADIUS'a da bakınız." -msgid "Hop radius for counting high TTL limit messages (# hops lower than...). See also MAX_HIGH_TTL_MSG" -msgstr "Yüksek TTL'li mesajları saymak için hop (atlama) yarıçapı (hop sayısı bundan düşük...) MAX_HIGH_TTL_MSG öğesine de bakınız." +msgid "" +"Hop radius for counting high TTL limit messages (# hops lower than...). See " +"also MAX_HIGH_TTL_MSG" +msgstr "" +"Yüksek TTL'li mesajları saymak için hop (atlama) yarıçapı (hop sayısı bundan " +"düşük...) MAX_HIGH_TTL_MSG öğesine de bakınız." msgid "Bandwidth limit for incoming HTTP traffic in bytes/sec." -msgstr "İçeriye gelen HTTP trafiği için bant genişliği sınırı, bayt/saniye olarak." +msgstr "" +"İçeriye gelen HTTP trafiği için bant genişliği sınırı, bayt/saniye olarak." msgid "Bandwidth limit for outgoing HTTP traffic in bytes/sec." -msgstr "Dışarıya giden HTTP trafiği için bant genişliği sınırı, bayt/saniye olarak." +msgstr "" +"Dışarıya giden HTTP trafiği için bant genişliği sınırı, bayt/saniye olarak." msgid "Bandwidth limit for incoming Gnet traffic in bytes/sec." -msgstr "İçeriye gelen Gnet trafiği için bant genişliği sınırı, bayt/saniye olarak." +msgstr "" +"İçeriye gelen Gnet trafiği için bant genişliği sınırı, bayt/saniye olarak." msgid "Bandwidth limit for outgoing Gnet traffic in bytes/sec." -msgstr "Dışarıya giden Gnet trafiği için bant genişliği sınırı, bayt/saniye olarak." +msgstr "" +"Dışarıya giden Gnet trafiği için bant genişliği sınırı, bayt/saniye olarak." -msgid "Bandwidth limit for incoming Gnet leaf traffic in bytes/sec. When running as an ultra node, this bandwidth is stolen from the regular HTTP traffic if the shaper for leaves is enabled." -msgstr "İçeriye gelen Gnutella trafiği için bant genişliği sınırlaması. Ultra düğüm olduğunuzda, bu bant genişliği, yapraklar için bant genişliği sınırı etkinse normal HTTP trafiğinden çalınacaktır." +msgid "" +"Bandwidth limit for incoming Gnet leaf traffic in bytes/sec. When running as " +"an ultra node, this bandwidth is stolen from the regular HTTP traffic if the " +"shaper for leaves is enabled." +msgstr "" +"İçeriye gelen Gnutella trafiği için bant genişliği sınırlaması. Ultra düğüm " +"olduğunuzda, bu bant genişliği, yapraklar için bant genişliği sınırı etkinse " +"normal HTTP trafiğinden çalınacaktır." -msgid "Bandwidth limit for outgoing Gnet leaf traffic in bytes/sec. When running as an ultra node, this bandwidth is stolen from the regular HTTP traffic, if the shaper for leaves is enabled." -msgstr "Dışarıya giden Gnutella trafiği için bant genişliği sınırlaması. Ultra düğüm olduğunuzda, bu bant genişliği, yapraklar için bant genişliği sınırı etkinse normal HTTP trafiğinden çalınacaktır." +msgid "" +"Bandwidth limit for outgoing Gnet leaf traffic in bytes/sec. When running as " +"an ultra node, this bandwidth is stolen from the regular HTTP traffic, if " +"the shaper for leaves is enabled." +msgstr "" +"Dışarıya giden Gnutella trafiği için bant genişliği sınırlaması. Ultra düğüm " +"olduğunuzda, bu bant genişliği, yapraklar için bant genişliği sınırı etkinse " +"normal HTTP trafiğinden çalınacaktır." -msgid "Maximum size of search queries messages we forward to others (in bytes)." -msgstr "Başkalarına ileteceğimiz arama sorgu mesajlarının azami boyutu (bayt olarak)." +msgid "" +"Maximum size of search queries messages we forward to others (in bytes)." +msgstr "" +"Başkalarına ileteceğimiz arama sorgu mesajlarının azami boyutu (bayt olarak)." -msgid "Maximum size of search queries messages we allow, otherwise close the connection (in bytes)." -msgstr "İzin verdiğimiz azami arama sorgu mesajı boyutu (bayt olarak), aksi takdirde bağlantı kesilir." +msgid "" +"Maximum size of search queries messages we allow, otherwise close the " +"connection (in bytes)." +msgstr "" +"İzin verdiğimiz azami arama sorgu mesajı boyutu (bayt olarak), aksi takdirde " +"bağlantı kesilir." -msgid "Maximum size of search answers messages we forward to others (in bytes)." -msgstr "Başkalarına ileteceğimiz arama sonuç mesajlarının azami boyutu (bayt olarak)." +msgid "" +"Maximum size of search answers messages we forward to others (in bytes)." +msgstr "" +"Başkalarına ileteceğimiz arama sonuç mesajlarının azami boyutu (bayt olarak)." -msgid "Maximum size of search answers messages we allow, otherwise close the connection (in bytes)." -msgstr "İzin verdiğimiz azami arama sonuç mesajı boyutu (bayt olarak), aksi takdirde bağlantı kesilir." +msgid "" +"Maximum size of search answers messages we allow, otherwise close the " +"connection (in bytes)." +msgstr "" +"İzin verdiğimiz azami arama sonuç mesajı boyutu (bayt olarak), aksi takdirde " +"bağlantı kesilir." -msgid "Maximum number of relayed Query MUIDs to track. This allows mapping MUIDs of Query Hits to the original search term and media type filtering to be able to avoid relaying spam and non-matching results. In the worst case this causes about 300 bytes per Query of memory overhead, but will be much lower than that in practice (minimum size is about 40 bytes). This is only used when running as an Ultrapeer. When the value specified is greater than the amount of messages that the Gnutella routing table can track, gtk-gnutella will automatically cap the amount of tracked MUIDs to fit the queries it remembers for routing." -msgstr "İzlenecek azami yönlendirilen sorgu MUİD (eşsiz kimlik) sayısı. Bu sorgu denkleşmelerininin MUİD'lerine karşılık gelen özgün arama terimleri ve dosya türü filtrelemelerini izlememizi sağlar, böylece spam ve denk gelmeyen sonuçları aktarmamızı önler. En kötü durumda bu belleğe sorgu başına 300 bayt yük ekler, ancak olağan durumlarda bu yük çok daha düşüktür (asgari boyut 40 bayttır). Bu ayar sadece ultraeş kipinde kullanılır. Belirtilen değer Gnutella yönlendirme tablosunun izleyebileceği miktardan büyük olduğunda, gtk-gnutella yönlendirmek için hatırladığı sorgulara uygun olması için izlediği MUİD miktarını otomatik olarak sınırlayacaktır." +msgid "" +"Maximum number of relayed Query MUIDs to track. This allows mapping MUIDs of " +"Query Hits to the original search term and media type filtering to be able " +"to avoid relaying spam and non-matching results. In the worst case this " +"causes about 300 bytes per Query of memory overhead, but will be much lower " +"than that in practice (minimum size is about 40 bytes). This is only used " +"when running as an Ultrapeer. When the value specified is greater than the " +"amount of messages that the Gnutella routing table can track, gtk-gnutella " +"will automatically cap the amount of tracked MUIDs to fit the queries it " +"remembers for routing." +msgstr "" +"İzlenecek azami yönlendirilen sorgu MUİD (eşsiz kimlik) sayısı. Bu sorgu " +"isabetlerinin MUİD'lerine karşılık gelen özgün arama terimleri ve dosya türü " +"filtrelemelerini izlememizi sağlar, böylece spam ve denk gelmeyen sonuçları " +"aktarmamızı önler. En kötü durumda bu belleğe sorgu başına 300 bayt yük " +"ekler, ancak olağan durumlarda bu yük çok daha düşüktür (asgari boyut 40 " +"bayttır). Bu ayar sadece ultraeş kipinde kullanılır. Belirtilen değer " +"Gnutella yönlendirme tablosunun izleyebileceği miktardan büyük olduğunda, " +"gtk-gnutella yönlendirmek için hatırladığı sorgulara uygun olması için " +"izlediği MUİD miktarını otomatik olarak sınırlayacaktır." -msgid "Maximum size of unknown messages we allow, otherwise close the connection (in bytes)." -msgstr "Bilinmeyen mesajlar için verdiğimiz azami boyut (bayt olarak), geçerse bağlantı kapatılır." +msgid "" +"Maximum size of unknown messages we allow, otherwise close the connection " +"(in bytes)." +msgstr "" +"Bilinmeyen mesajlar için izin verdiğimiz azami boyut (bayt olarak), geçerse " +"bağlantı kapatılır." -msgid "Random factor for the hops field in search packets we send (between 0 and 3 inclusive)." -msgstr "Gönderdiğimiz arama paketlerin hop (atlama) alanı için rastgele faktörü (0 ilâ 3 dahil)." +msgid "" +"Random factor for the hops field in search packets we send (between 0 and 3 " +"inclusive)." +msgstr "" +"Gönderdiğimiz arama paketlerin hop (atlama) alanı için rastgele faktörü (0 " +"ilâ 3 dahil)." -msgid "Whether or not to send push requests. If you are firewalled, gtk-gnutella will never send push requests anyway. If you don't let gtk-gnutella send pushes, it will not show search results that would require a push." -msgstr "gtk-gnutella'nın itme istekleri gönderip göndermeyeceğini belirler. Güvenlik duvarı arkasındaysanız gtk-gnutella hiçbir zaman itme isteği göndermez. Eğer gtk-gnutella'nın itme isteği göndermesini engellerseniz itme gerektiren arama sonuçlarını size göstermez." +msgid "" +"Whether or not to send push requests. If you are firewalled, gtk-gnutella " +"will never send push requests anyway. If you don't let gtk-gnutella send " +"pushes, it will not show search results that would require a push." +msgstr "" +"gtk-gnutella'nın itme istekleri gönderip göndermeyeceğini belirler. Güvenlik " +"duvarı arkasındaysanız gtk-gnutella hiçbir zaman itme isteği göndermez. Eğer " +"gtk-gnutella'nın itme isteği göndermesini engellerseniz itme gerektiren " +"arama sonuçlarını size göstermez." -msgid "Minimum amount of dup messages to enable kicking, per node (also see min_dup_ratio)." -msgstr "Kovmayı etkinleştirmek için düğüm başına dikkate alınacak asgari çift mesajlar (min_dup_ratio değerine de bakınız)." +msgid "" +"Minimum amount of dup messages to enable kicking, per node (also see " +"min_dup_ratio)." +msgstr "" +"Kovmayı etkinleştirmek için düğüm başına dikkate alınacak asgari çift " +"mesajlar (min_dup_ratio değerine de bakınız)." -msgid "Minimum ratio of dups on received messages, per node (between 0.00 and 100.00) (also see min_dup_msg) Note: the value is stored between 0 (0.0) and 10000 (100.0) in the config file." -msgstr "Düğüm başına asgari çift mesaj oranı (0.00 ilâ 100.00 arası) (min_dup_msg değerine de bakınız.) Not: bu değer yapılandırma dosyasında 0 (0.00) ile 10000 (100.0) arası tutulur." +msgid "" +"Minimum ratio of dups on received messages, per node (between 0.00 and " +"100.00) (also see min_dup_msg) Note: the value is stored between 0 (0.0) " +"and 10000 (100.0) in the config file." +msgstr "" +"Düğüm başına asgari çift mesaj oranı (0.00 ilâ 100.00 arası) (min_dup_msg " +"değerine de bakınız.) Not: bu değer yapılandırma dosyasında 0 (0.00) ile " +"10000 (100.0) arası tutulur." -msgid "Only files with the given extensions will be shared. The special --all-- extension matches all files, even if they don't have any extension. Use with care." -msgstr "Sadece bu uzantılarla biten dosyalar paylaşılacaktır. Özel --all-- uzantısı tüm dosyalar demek olur ve bu dosyaların uzantısı olmasa da geçerlidir. İtinalı kullanın." +msgid "" +"Only files with the given extensions will be shared. The special --all-- " +"extension matches all files, even if they don't have any extension. Use " +"with care." +msgstr "" +"Sadece bu uzantılarla biten dosyalar paylaşılacaktır. Özel --all-- uzantısı " +"tüm dosyalar demek olur ve bu dosyaların uzantısı olmasa da geçerlidir. " +"İtinalı kullanın." msgid "Ignore symbolically linked directories when scanning files to share." -msgstr "Sembolik olarak bağlantılı dizinleri analiz sırasında yok say." +msgstr "Sembolik olarak bağlantılı klasörleri analiz sırasında yok say." msgid "Ignore symbolically linked regular files when scanning files to share." msgstr "Sembolik olarak bağlantılı normal dosyaları analiz sırasında yok say." msgid "Store incomplete files in this directory." -msgstr "Tamamlanmamış dosyaları bu dizinde tut." +msgstr "Tamamlanmamış dosyaları bu klasörde tut." -msgid "Move complete files to this directory. If this is set to the SAME directory as the incomplete or corrupted files, files will be renamed with a trailing .OK" -msgstr "Tamamlanan dosyaları bu dizine taşı. Eğer bu tamamlanmamış ya da bozuk dosyaların dizini ile aynı ise tamamlanan dosyaların isminin sonuna .OK eklenecektir." +msgid "" +"Move complete files to this directory. If this is set to the SAME directory " +"as the incomplete or corrupted files, files will be renamed with a trailing ." +"OK" +msgstr "" +"Tamamlanan dosyaları bu klasöre taşı. Eğer bu tamamlanmamış ya da bozuk " +"dosyaların klasörü ile aynı ise tamamlanan dosyaların isminin sonuna .OK " +"eklenecektir." -msgid "Move corrupted, downloaded files to this directory. If this is set to the SAME directory as the incomplete or completed files, files will be renamed with a trailing .BAD" -msgstr "Tamamlanan bozuk dosyaları bu dizine taşı. Eğer bu tamamlanmamış ya da tamamlanan dosyaların dizini ile aynı ise dosyaların isminin sonuna .BAD eklenecektir." +msgid "" +"Move corrupted, downloaded files to this directory. If this is set to the " +"SAME directory as the incomplete or completed files, files will be renamed " +"with a trailing .BAD" +msgstr "" +"Tamamlanan bozuk dosyaları bu klasöre taşı. Eğer bu tamamlanmamış ya da " +"tamamlanan dosyaların klasörü ile aynı ise dosyaların isminin sonuna .BAD " +"eklenecektir." msgid "Directories which contain shared files." -msgstr "Paylaşılan dosyaları içeren dizinler." +msgstr "Paylaşılan dosyaları içeren klasörler." -msgid "List of networks considered local. This is a list of IP addresses, separated by ';'. The IP address can be given out fully, as in 192.168.0.1, or be optionally followed by '/' and a network mask prefix length. For instance, 192.168.0.1/24 would represent the whole 192.168.0.* network." -msgstr "Yerel kabul edilen ağların listesi. Bu, ';' karakteri ile ayrılan İP adres listesidir. İP adresleri 192.168.0.1 gibi tamamen girilebilir ya da '/' karakterini izleyen ağ uzunluğu ön ekiyle bitirilebilir. Örneğin 192.168.0.1/24 tüm 192.168.0.* ağı yerine geçer." +msgid "" +"List of networks considered local. This is a list of IP addresses, " +"separated by ';'. The IP address can be given out fully, as in 192.168.0.1, " +"or be optionally followed by '/' and a network mask prefix length. For " +"instance, 192.168.0.1/24 would represent the whole 192.168.0.* network." +msgstr "" +"Yerel kabul edilen ağların listesi. Bu, ';' karakteri ile ayrılan İP adres " +"listesidir. İP adresleri 192.168.0.1 gibi tamamen girilebilir ya da '/' " +"karakterini izleyen ağ uzunluğu ön ekiyle bitirilebilir. Örneğin " +"192.168.0.1/24 tüm 192.168.0.* ağı yerine geçer." msgid "Total number of completed downloads in this session." msgstr "Bu oturumda tamamlanan indirmelerin sayısı." @@ -1478,7 +3139,7 @@ msgstr "Etkin gönderme sayısı." msgid "Number of quick uploads currently running." -msgstr "Halihazırda sürmekte olan çabuk göndermeler." +msgstr "Hâlihazırda sürmekte olan çabuk göndermeler." msgid "Number of registered (pending) uploads." msgstr "Bekleyen gönderme sayısı." @@ -1490,85 +3151,180 @@ msgstr "Bu düğümün global benzersiz tanımlayıcısı (Global Unique IDentifier)." msgid "Kademlia Unique IDentifier of this node in the DHT." -msgstr "Bu düğümün DHT üzerinde Kademlia benzersiz tanımlayıcısı (Kademlia Unique IDentifier)." +msgstr "" +"Bu düğümün DHT üzerinde Kademlia benzersiz tanımlayıcısı (Kademlia Unique " +"IDentifier)." msgid "Whether or not to use swarming (recommended = YES)." msgstr "Çoklu indirmelerin kullanılıp kullanılmayacağı (önerilen = EVET)." -msgid "Whether or not to launch competing downloads when swarming and there are many sources available with a few chunks left." -msgstr "Çoklu indirim yapılırken ve birçok kaynaktan alınacak az sayıda parça kalmışken eşzamanlı indirmelerin başlatılıp başlatılmayacağını ayarlar." +msgid "" +"Whether or not to launch competing downloads when swarming and there are " +"many sources available with a few chunks left." +msgstr "" +"Çoklu indirim yapılırken ve birçok kaynaktan alınacak az sayıda parça " +"kalmışken eşzamanlı indirmelerin başlatılıp başlatılmayacağını ayarlar." -msgid "Minimum chunk size when swarming. This is only a hint as gtk-gnutella will download less if you only have a few bytes to get for a file..." -msgstr "Birden çok kaynaktan indirirken azami parça boyutu. Bu sadece bir ipucudur çünkü gtk-gnutella bir dosyayı tamamlamak sadece birkaç bayt kaldığında bu boyuttan küçük parçaları da indirecektir..." +msgid "" +"Minimum chunk size when swarming. This is only a hint as gtk-gnutella will " +"download less if you only have a few bytes to get for a file..." +msgstr "" +"Birden çok kaynaktan indirirken azami parça boyutu. Bu sadece bir ipucudur " +"çünkü gtk-gnutella bir dosyayı tamamlamak sadece birkaç bayt kaldığında bu " +"boyuttan küçük parçaları da indirecektir..." msgid "Maximum chunk size when swarming." msgstr "Birden çok kaynaktan indirirken azami parça boyutu." -msgid "Whether or not to automatically queue search results that match a file in the download queue." -msgstr "İndirme kuyruğunda bir dosyaya denk gelen arama sonuçlarının otomatik olarak kuyruğa eklenip eklenmeyeceğini belirler." +msgid "" +"Whether or not to automatically queue search results that match a file in " +"the download queue." +msgstr "" +"İndirme kuyruğunda bir dosyaya denk gelen arama sonuçlarının otomatik olarak " +"kuyruğa eklenip eklenmeyeceğini belirler." -msgid "Whether or not to automatically feed the download mesh with data gathered from the query hits that flow through our node. This looks for new entries for files we are sharing or already have in our mesh." -msgstr "Bizim düğümümüzden geçen sorgu denkleştirmelerinden elde ettiğimiz verileri indirme topluluğuna verip vermeyeceğimizi ayarlar. Bu, paylaştığımız ya da indirme grubumuzda bulunan dosyalar için yeni kaynaklar arar." +msgid "" +"Whether or not to automatically feed the download mesh with data gathered " +"from the query hits that flow through our node. This looks for new entries " +"for files we are sharing or already have in our mesh." +msgstr "" +"Bizim düğümümüzden geçen sorgu isabetlerinden elde ettiğimiz verileri " +"indirme topluluğuna verip vermeyeceğimizi ayarlar. Bu, paylaştığımız ya da " +"indirme grubumuzda bulunan dosyalar için yeni kaynaklar arar." -msgid "When enabled, SHA1s must match. Otherwise, name and size will be sufficient." -msgstr "Etkinse SHA1 değerlerinin eşleşmesi gerekir, yoksa isim ve boyut yeterli olacaktır." +msgid "" +"When enabled, SHA1s must match. Otherwise, name and size will be sufficient." +msgstr "" +"Etkinse SHA1 değerlerinin eşleşmesi gerekir, yoksa isim ve boyut yeterli " +"olacaktır." msgid "Whether gtk-gnutella thinks you're currently firewalled, TCP-wise." -msgstr "gtk-gnutella'nın TCP bağlantıları için bir güvenlik duvarı arkasında olduğunuzu düşünüp düşünmediğini gösterir." +msgstr "" +"gtk-gnutella'nın TCP bağlantıları için bir güvenlik duvarı arkasında " +"olduğunuzu düşünüp düşünmediğini gösterir." msgid "Whether gtk-gnutella thinks it's connected to the Internet." msgstr "gtk-gnutella'nın çevrimiçi olduğunu düşünüp düşünmediğini gösterir." msgid "Whether gtk-gnutella thinks you're currently firewalled, UDP-wise." -msgstr "gtk-gnutella'nın UDP bağlantıları için bir güvenlik duvarı arkasında olduğunuzu düşünüp düşünmediğini gösterir." +msgstr "" +"gtk-gnutella'nın UDP bağlantıları için bir güvenlik duvarı arkasında " +"olduğunuzu düşünüp düşünmediğini gösterir." msgid "Whether gtk-gnutella determined it could receive solicited UDP." -msgstr "gtk-gnutella'nın istediği UDP verilerini alabileceğini tespit edip etmediğini gösterir." +msgstr "" +"gtk-gnutella'nın istediği UDP verilerini alabileceğini tespit edip " +"etmediğini gösterir." -msgid "Remove unnecessary ballast from query string before processing or forwarding them. Reduces traffic at the cost of little CPU time." -msgstr "Sorgulardan onları işlemeden ya da yönlendirmeden önce gereksiz verileri kaldırır. Mikroişlemciye biraz yük eklenmesi karşılığında ağ trafiğini azaltır." +msgid "" +"Remove unnecessary ballast from query string before processing or forwarding " +"them. Reduces traffic at the cost of little CPU time." +msgstr "" +"Sorgulardan onları işlemeden ya da yönlendirmeden önce gereksiz verileri " +"kaldırır. Mikroişlemciye biraz yük eklenmesi karşılığında ağ trafiğini " +"azaltır." -msgid "Also use sources that don't provide a SHA1 value for the first chunk of a file. This dramatically reduces the 'No URN on server' messages, but may result in overlap problems later if the first chunk was actually from a different file. Use with caution." -msgstr "Dosyaların ilk parçası için SHA1 değeri sunmayan kaynakları da kullan. Bu 'sunucuda URN bulunmuyor' mesajlarını önemli ölçüde azaltır, ama ilk parça başka bir dosyadan indirildiyse sonradan kaplama problemlerine neden olabilir. Dikkatli kullanın." +msgid "" +"Also use sources that don't provide a SHA1 value for the first chunk of a " +"file. This dramatically reduces the 'No URN on server' messages, but may " +"result in overlap problems later if the first chunk was actually from a " +"different file. Use with caution." +msgstr "" +"Dosyaların ilk parçası için SHA1 değeri sunmayan kaynakları da kullan. Bu " +"'sunucuda URN bulunmuyor' mesajlarını önemli ölçüde azaltır, ama ilk parça " +"başka bir dosyadan indirildiyse sonradan kaplama problemlerine neden " +"olabilir. Dikkatli kullanın." -msgid "Whether gtk-gnutella is currently rebuilding its library in the background." -msgstr "gtk-gnutella'nın arka planda kütüphanesini yeniden yapılandırıp yapılandırmadığını gösterir." +msgid "" +"Whether gtk-gnutella is currently rebuilding its library in the background." +msgstr "" +"gtk-gnutella'nın arka planda kütüphanesini yeniden yapılandırıp " +"yapılandırmadığını gösterir." -msgid "Whether gtk-gnutella is currently computing SHA1 of shared files in the background." -msgstr "gtk-gnutella'nın arka planda paylaşılan dosyaların SHA1 değerlerini hesaplayıp hesaplamadığını gösterir." +msgid "" +"Whether gtk-gnutella is currently computing SHA1 of shared files in the " +"background." +msgstr "" +"gtk-gnutella'nın arka planda paylaşılan dosyaların SHA1 değerlerini " +"hesaplayıp hesaplamadığını gösterir." -msgid "Whether gtk-gnutella is currently verifying SHA1 of downloaded files in the background." -msgstr "gtk-gnutella'nın arka planda indirilen dosyaların SHA1 değerlerini kontrol edip etmediğini gösterir." +msgid "" +"Whether gtk-gnutella is currently verifying SHA1 of downloaded files in the " +"background." +msgstr "" +"gtk-gnutella'nın arka planda indirilen dosyaların SHA1 değerlerini kontrol " +"edip etmediğini gösterir." -msgid "Whether gtk-gnutella is currently moving files across filesystems or simply copying in the background." -msgstr "Şu anda gtk-gnutella'nın dosya sistemleri arasında taşıma ya da sadece arka planda dosya kopyalama yapıp yapmadığını gösterir." +msgid "" +"Whether gtk-gnutella is currently moving files across filesystems or simply " +"copying in the background." +msgstr "" +"Şu anda gtk-gnutella'nın dosya sistemleri arasında taşıma ya da sadece arka " +"planda dosya kopyalama yapıp yapmadığını gösterir." -msgid "If active, only compressed incoming connections are allowed after the minimum number of connections has been established. Always allows for one non-compressed connection." -msgstr "Etkinse, asgari bağlantı sayısına erişildikten sonra sadece içeriye gelen sıkıştırılmış bağlantılara izin verilecektir. Her durumda en az bir sıkıştırılmamış bağlantıya izin verilir." +msgid "" +"If active, only compressed incoming connections are allowed after the " +"minimum number of connections has been established. Always allows for one " +"non-compressed connection." +msgstr "" +"Etkinse, asgari bağlantı sayısına erişildikten sonra sadece içeriye gelen " +"sıkıştırılmış bağlantılara izin verilecektir. Her durumda en az bir " +"sıkıştırılmamış bağlantıya izin verilir." -msgid "If deactivated, only uploads and downloads will continue. All Gnet connections are disabled/terminated." -msgstr "Devre dışı bırakılırsa, sadece göndermeler ve indirmeler devam edecek ve tüm Gnet bağlantıları sona erdirilecektir." +msgid "" +"If deactivated, only uploads and downloads will continue. All Gnet " +"connections are disabled/terminated." +msgstr "" +"Devre dışı bırakılırsa, sadece göndermeler ve indirmeler devam edecek ve tüm " +"Gnet bağlantıları sona erdirilecektir." -msgid "Whether gtk-gnutella should make sure the server confirms the URN of the file we're requesting when it is known locally and a traditional request by name is used (i.e. gtk-gnutella is not issuing a /uri-res/N2R? request). When set, it supersedes the optimistic first chunk setting." -msgstr "İstediğimiz dosya eğer yerel olarak tanınıyorsa ve isme dayalı klasik bir istek kullanıldığında (yani gtk-gnutella /uri-res/N2R? isteği yollamadığında), gtk-gnutella'nın sunucunun URN değerini doğruladığına emin olup olmayacağını ayarlar. Seçildiğinde, iyimser ilk parça ayarının yerini alır." +msgid "" +"Whether gtk-gnutella should make sure the server confirms the URN of the " +"file we're requesting when it is known locally and a traditional request by " +"name is used (i.e. gtk-gnutella is not issuing a /uri-res/N2R? request). " +"When set, it supersedes the optimistic first chunk setting." +msgstr "" +"İstediğimiz dosya eğer yerel olarak tanınıyorsa ve isme dayalı klasik bir " +"istek kullanıldığında (yani gtk-gnutella /uri-res/N2R? isteği " +"yollamadığında), gtk-gnutella'nın sunucunun URN değerini doğruladığına emin " +"olup olmayacağını ayarlar. Seçildiğinde, iyimser ilk parça ayarının yerini " +"alır." -msgid "Whether gtk-gnutella should make sure the server gives us back a non-empty identifying token." -msgstr "gtk-gnutella'nın, sunucunun bize boş olmayan bir kimlik jetonu gönderdiğinden emin olup olmayacağını ayarlar." +msgid "" +"Whether gtk-gnutella should make sure the server gives us back a non-empty " +"identifying token." +msgstr "" +"gtk-gnutella'nın, sunucunun bize boş olmayan bir kimlik jetonu " +"gönderdiğinden emin olup olmayacağını ayarlar." msgid "Maximum amount of Ultrapeers we should connect to as a leaf." msgstr "Yaprak olarak bağlanacağımız azami Ultraeş sayısı." -msgid "To connect more quickly, gtk-gnutella will allow up to this many connections to be active while trying to fill up the connection slots." -msgstr "Daha hızlı bağlanmak için tüm bağlantı oluklara dolana dek gtk-gnutella bu sayıya kadar bağlantının etkin olmasına izin verecektir." +msgid "" +"To connect more quickly, gtk-gnutella will allow up to this many connections " +"to be active while trying to fill up the connection slots." +msgstr "" +"Daha hızlı bağlanmak için tüm bağlantı oluklara dolana dek gtk-gnutella bu " +"sayıya kadar bağlantının etkin olmasına izin verecektir." -msgid "Maximum amount of leaves we can accept. To be promoted Ultra, you should reserve 32 bytes of bandwidth per leaf." -msgstr "Kabul edebileceğimiz azami yaprak sayısı. Ultra durumuna terfi etmek için yaprak başına 32 bayt bant genişliği ayırmanız önerilir." +msgid "" +"Maximum amount of leaves we can accept. To be promoted Ultra, you should " +"reserve 32 bytes/sec of bandwidth per leaf." +msgstr "" msgid "What to do with files that will be ignored for downloading." msgstr "İndirmeler için görmezden gelinecek dosyalar ile ne yapılacağı." -msgid "The peer mode you want to operate as for gtk-gnutella. When auto is selected, gtk-gnutella will start as a leaf node and may be promoted to an ultra node if bandwidth and uptime permits, provided that you are not firewalled." -msgstr "gtk-gnutella'nın eş kipini ayarlar. Otomatik seçildiğinde, gtk-gnutella bir yaprak düğümü olarak çalışmaya başlayacak, ardından güvenlik duvarı arkasında değilseniz ve bant genişliği ile çalışma süresi uygunsa ultra düğüm durumuna terfi edecektir." +msgid "" +"The peer mode you want to operate as for gtk-gnutella. When auto is " +"selected, gtk-gnutella will start as a leaf node and may be promoted to an " +"ultra node if bandwidth and uptime permits, provided that you are not " +"firewalled." +msgstr "" +"gtk-gnutella'nın eş kipini ayarlar. Otomatik seçildiğinde, gtk-gnutella bir " +"yaprak düğümü olarak çalışmaya başlayacak, ardından güvenlik duvarı " +"arkasında değilseniz ve bant genişliği ile çalışma süresi uygunsa ultra " +"düğüm durumuna terfi edecektir." msgid "Current peer mode for gtk-gnutella." msgstr "gtk-gnutella'nın güncel eş durumu." @@ -1577,13 +3333,13 @@ msgstr "Bu işlemin açabileceği dosya tanımlayıcısı miktarı." msgid "How much physical memory is available." -msgstr "Kullanılabilecek fiziksel bellek boyutu." +msgstr "Kullanılabilecek fiziki bellek boyutu." msgid "How many downloads are currently held in the queue." msgstr "Şu anda kuyrukta tutulan indirme sayısı." msgid "How many downloads are currently running (downloading / connecting)." -msgstr "Şu anda çalışan indirme sayısı (indirme / bağlanma)" +msgstr "Şu anda çalışan indirme sayısı (indirme / bağlanma)." msgid "How many downloads are currently active." msgstr "Şu anda etkin olan indirme sayısı." @@ -1595,13 +3351,17 @@ msgstr "Pasif olarak kuyruğa eklenen indirme sayısı." msgid "How many fileinfo do we have." -msgstr "Sahip olduğumuz dosya bilgisi sayısı" +msgstr "Sahip olduğumuz dosya bilgisi sayısı." msgid "How many fileinfo with sources do we have." -msgstr "Sahip olduğumuz kaynağı bulunan dosya bilgisi sayısı" +msgstr "Sahip olduğumuz kaynağı bulunan dosya bilgisi sayısı." -msgid "How many queued downloads are currently responsive (remote servent answering requests)." -msgstr "Kuyruktaki canlı indirme sayısı (sunucu isteklere cevap veriyor anlamına gelir). " +msgid "" +"How many queued downloads are currently responsive (remote servent answering " +"requests)." +msgstr "" +"Kuyruktaki canlı indirme sayısı (sunucu isteklere cevap veriyor anlamına " +"gelir)." msgid "Amount of bytes downloaded so far, HTTP headers notwithstanding." msgstr "Şimdiye kadar indirilen bayt miktarı, HTTP başlıklarını saymadan." @@ -1609,14 +3369,39 @@ msgid "Amount of bytes uploaded so far, HTTP headers notwithstanding." msgstr "Şimdiye kadar yollanan bayt miktarı, HTTP başlıklarını saymadan." -msgid "Whether gtk-gnutella should serve partial files whilst they are still incompletely downloaded. Recommended for network's health unless you already share many files, in which case it does no harm to leave it in, but will not matter as much." -msgstr "gtk-gnutella'nın tamamlanmamış dosyaları sunup sunmayacağını ayarlar. Şebekenin sağlığı için bu dosyaları sunmanız önerilir. Eğer birçok dosya paylaşıyorsanız bu şıkkı seçmemeniz o kadar önemli olmaz, ama gene de seçmenizin hiçbir kötü etkisi olmayacaktır." +msgid "" +"Whether gtk-gnutella should serve partial files whilst they are still " +"incompletely downloaded. Recommended for network's health unless you " +"already share many files, in which case it does no harm to leave it in, but " +"will not matter as much." +msgstr "" +"gtk-gnutella'nın tamamlanmamış dosyaları sunup sunmayacağını ayarlar. " +"Şebekenin sağlığı için bu dosyaları sunmanız önerilir. Eğer birçok dosya " +"paylaşıyorsanız bu şıkkı seçmemeniz o kadar önemli olmaz, ama gene de " +"seçmenizin hiçbir kötü etkisi olmayacaktır." -msgid "When partial file sharing (PFSP) is enabled, gtk-gnutella will strive to download chunks in a random order, to maximize the spreading of the file in the network. However, this makes auditing (file type, pre-viewing, etc...) of the file impossible. This field sets the size in bytes of the first chunk of data that should be continuously downloaded at the beginning of the file. Don't set it too large." -msgstr "Tamamlanmamış dosya paylaşımı (PFSP) etkinleştirildiğinde, gtk-gnutella dosyaların şebekede dağılımını arttırmak için indirilen parçaların sırasını rastgele seçer. Ancak bu, dosya tipinin indirme bitmeden belirlenmesi ya da önizleme gibi işlevleri imkânsız kılar. Bu alan dosyaların başlangıcında indirilecek ilk parçanın boyutunu bayt olarak belirler. Çok yüksek bir değer seçmeyiniz." +msgid "" +"When partial file sharing (PFSP) is enabled, gtk-gnutella will strive to " +"download chunks in a random order, to maximize the spreading of the file in " +"the network. However, this makes auditing (file type, pre-viewing, etc...) " +"of the file impossible. This field sets the size in bytes of the first chunk " +"of data that should be continuously downloaded at the beginning of the " +"file. Don't set it too large." +msgstr "" +"Tamamlanmamış dosya paylaşımı (PFSP) etkinleştirildiğinde, gtk-gnutella " +"dosyaların şebekede dağılımını arttırmak için indirilen parçaların sırasını " +"rastgele seçer. Ancak bu, dosya tipinin indirme bitmeden belirlenmesi ya da " +"önizleme gibi işlevleri imkânsız kılar. Bu alan dosyaların başlangıcında " +"indirilecek ilk parçanın boyutunu bayt olarak belirler. Çok yüksek bir değer " +"seçmeyiniz." -msgid "When partial file sharing (PFSP) is enabled, gtk-gnutella will not share partial files below this filesize. Don't set it too large." -msgstr "Tamamlanmamış dosya paylaşımı (PFSP) ekinleştirildiğinde gtk-gnutella bu boyuttan küçük tamamlanmamış dosyaları paylaşmayacaktır. Fazla büyük bir değer girmeyiniz." +msgid "" +"When partial file sharing (PFSP) is enabled, gtk-gnutella will not share " +"partial files below this filesize. Don't set it too large." +msgstr "" +"Tamamlanmamış dosya paylaşımı (PFSP) ekinleştirildiğinde gtk-gnutella bu " +"boyuttan küçük tamamlanmamış dosyaları paylaşmayacaktır. Fazla büyük bir " +"değer girmeyiniz." msgid "Number of crawler visits during this session." msgstr "Bu oturum süresinde tarayıcı ziyareti sayısı." @@ -1624,50 +3409,138 @@ msgid "Number of UDP crawler visits during this session." msgstr "Bu oturum süresinde UDP tarayıcı ziyareti sayısı." -msgid "Whether the clock of this host is kept accurate via NTP. When set, the computed clock skew is ignored. Normally, gtk-gnutella automatically determines whether you are running NTP locally, but it won't be able to determine whether your host is kept synchronized by regular calls to ntpdate, for instance." -msgstr "Bu bilgisayarın saatinin NTP ile doğru tutulup tutulmadığını gösterir. Seçildiğinde, saatin geri kalması ya da ileri gitmesi görmezden gelinecektir. Normalde gtk-gnutella yerel olarak NTP çalıştırılıp çalıştırılmadığını kendisi belirler, ama örnek olarak bilgisayarınızın saatinin periyodik ntpdate çağrıları ile senkronize edilip edilmediğini belirleyemez." +msgid "" +"Whether the clock of this host is kept accurate via NTP. When set, the " +"computed clock skew is ignored. Normally, gtk-gnutella automatically " +"determines whether you are running NTP locally, but it won't be able to " +"determine whether your host is kept synchronized by regular calls to " +"ntpdate, for instance." +msgstr "" +"Bu bilgisayarın saatinin NTP ile doğru tutulup tutulmadığını gösterir. " +"Seçildiğinde, saatin geri kalması ya da ileri gitmesi görmezden " +"gelinecektir. Normalde gtk-gnutella yerel olarak NTP çalıştırılıp " +"çalıştırılmadığını kendisi belirler, ama örnek olarak bilgisayarınızın " +"saatinin periyodik ntpdate çağrıları ile senkronize edilip edilmediğini " +"belirleyemez." msgid "Whether a running NTP daemon was detected locally." -msgstr "Çalışmakta olan bir NTP servisinin (daemon) yerel olarak tespit edilip edilmediği." +msgstr "" +"Çalışmakta olan bir NTP servisinin (daemon) yerel olarak tespit edilip " +"edilmediği." -msgid "The signed clock skew of this host compared to absolute time. Adding this skew to the host clock should give the true time." -msgstr "Mutlak saate göre bu bilgisayarın imzalı saat gecikmesi ya da ilerlemesi. Sapmayı bu bilgisayarın saatine eklemenin gerçek zamanı vermesi gerekir." +msgid "" +"The signed clock skew of this host compared to absolute time. Adding this " +"skew to the host clock should give the true time." +msgstr "" +"Mutlak saate göre bu bilgisayarın imzalı saat gecikmesi ya da ilerlemesi. " +"Sapmayı bu bilgisayarın saatine eklemenin gerçek zamanı vermesi gerekir." -msgid "Whether gtk-gnutella should keep track of the IP of unstable servents it encounters, preventing further connections attempts to/from them." -msgstr "gtk-gnutella'nın rastladığı kararsız istemcilere bağlanmasını engellemek için bu istemcilerin İP adreslerinin izlenip izlenmeyeceği." +msgid "" +"Whether gtk-gnutella should keep track of the IP of unstable servents it " +"encounters, preventing further connections attempts to/from them." +msgstr "" +"gtk-gnutella'nın rastladığı kararsız istemcilere bağlanmasını engellemek " +"için bu istemcilerin İP adreslerinin izlenip izlenmeyeceği." -msgid "Whether gtk-gnutella should determine the servent types (as identified by their vendor string) that are unstable, preventing further connections to/from them. This only works when gtk-gnutella already keeps track of unstable IP addresses." -msgstr "gtk-gnutella'nın kararsız istemci tiplerini (sağlayıcı metnine dayalı olarak) tespit edip, onlarla bağlantıları önleyip önlemeyeceğini ayarlar. Bu işlev sadece gtk-gnutella halihazırda kararsız İP adreslerini izliyorsa çalışabilir." +msgid "" +"Whether gtk-gnutella should determine the servent types (as identified by " +"their vendor string) that are unstable, preventing further connections to/" +"from them. This only works when gtk-gnutella already keeps track of " +"unstable IP addresses." +msgstr "" +"gtk-gnutella'nın kararsız istemci tiplerini (sağlayıcı metnine dayalı " +"olarak) tespit edip, onlarla bağlantıları önleyip önlemeyeceğini ayarlar. Bu " +"işlev sadece gtk-gnutella hâlihazırda kararsız İP adreslerini izliyorsa " +"çalışabilir." -msgid "Whether gtk-gnutella should automatically remove the file whenever it gets a resuming mismatch and retry from scratch. Until Tiger Tree Hashes are widespread, this is the easiest option." -msgstr "Bir uyumsuzluk meydana geldiğinde, gtk-gnutella'nın dosyayı kaldırıp indirmeye yeniden başlayıp başlamayacağını ayarlar. Tiger Tree Hash değerleri genel olarak kullanılmaya başlanana dek bu en kolay seçenektir." +msgid "" +"Whether gtk-gnutella should automatically remove the file whenever it gets a " +"resuming mismatch and retry from scratch. Until Tiger Tree Hashes are " +"widespread, this is the easiest option." +msgstr "" +"Bir uyumsuzluk meydana geldiğinde, gtk-gnutella'nın dosyayı kaldırıp " +"indirmeye yeniden başlayıp başlamayacağını ayarlar. Tiger Tree Hash " +"değerleri genel olarak kullanılmaya başlanana dek bu en kolay seçenektir." -msgid "The amount of bytes which gtk-gnutella will strip off the already downloaded bytes after a resuming mismatch, in the hope that only this amount was corrupted, preventing proper resuming. Most of the time, a resuming mismatch indicates bad data on the server, but if the already downloaded data is bad then backing out some of it may allow us to recover from the problem." -msgstr "Sürdürmede uyumsuzluk çıkarsa, gtk-gnutella'nın sadece bu alanın bozuk olması umuduyla sileceği bayt miktarı. Çoğu zaman sürdürme uyumsuzlukları sunucuda bozuk veri olmasından kaynaklanır, ancak bozuk olan zaten indirilmiş veriler ise bunun bir kısmını silmek bazen bu problemi çözmemize imkân verir." +msgid "" +"The amount of bytes which gtk-gnutella will strip off the already downloaded " +"bytes after a resuming mismatch, in the hope that only this amount was " +"corrupted, preventing proper resuming. Most of the time, a resuming mismatch " +"indicates bad data on the server, but if the already downloaded data is bad " +"then backing out some of it may allow us to recover from the problem." +msgstr "" +"Sürdürmede uyumsuzluk çıkarsa, gtk-gnutella'nın sadece bu alanın bozuk " +"olması umuduyla sileceği bayt miktarı. Çoğu zaman sürdürme uyumsuzlukları " +"sunucuda bozuk veri olmasından kaynaklanır, ancak bozuk olan zaten " +"indirilmiş veriler ise bunun bir kısmını silmek bazen bu problemi çözmemize " +"imkân verir." -msgid "The hostname of the server that can be used by downloaders to find the IP address via a DNS resolution. If you have a dynamic IP address coupled with a dynamic DNS service, then this is valuable to downloaders: they may find your node even after a few rotations of your IP address." -msgstr "İndirme yapanlar tarafından DNS çözümlemesi yoluyla İP adresini bulmak için kullanılabilecek bilgisayar ismi. Dinamik bir DNS servisiyle ilişik dinamik İP adresi kullanıyorsanız bu ayarın indirme yapanlara çok faydası olur: sizin düğümünüzü İP adresiniz birkaç kez değişse bile bulabilirler." +msgid "" +"The hostname of the server that can be used by downloaders to find the IP " +"address via a DNS resolution. If you have a dynamic IP address coupled with " +"a dynamic DNS service, then this is valuable to downloaders: they may find " +"your node even after a few rotations of your IP address." +msgstr "" +"İndirme yapanlar tarafından DNS çözümlemesi yoluyla İP adresini bulmak için " +"kullanılabilecek bilgisayar ismi. Dinamik bir DNS servisiyle ilişik dinamik " +"İP adresi kullanıyorsanız bu ayarın indirme yapanlara çok faydası olur: " +"sizin düğümünüzü İP adresiniz birkaç kez değişse bile bulabilirler." -msgid "Whether gtk-gnutella should advertise the hostname of your server to downloaders and in query hits." -msgstr "gtk-gnutella'nın sorgu cevaplarında ve indirme yapanlara bilgisayar isminizi iletip iletmeyeceğini ayarlar." +msgid "" +"Whether gtk-gnutella should advertise the hostname of your server to " +"downloaders and in query hits." +msgstr "" +"gtk-gnutella'nın sorgu cevaplarında ve indirme yapanlara bilgisayar isminizi " +"iletip iletmeyeceğini ayarlar." -msgid "Percentage of the number of connections we should reserve for gtk-gnutella nodes." -msgstr "Toplam bağlantılardan gtk-gnutella düğümlerine ayrılan oran, yüzde olarak." +msgid "" +"Percentage of the number of connections we should reserve for gtk-gnutella " +"nodes." +msgstr "" +"Toplam bağlantılardan gtk-gnutella düğümlerine ayrılan oran, yüzde olarak." msgid "Maximum percentage of slots a vendor can occupy." -msgstr "Bir yazılımın (sağlayıcı metnine dayalı olarak) kullanabileceği azami oluk yüzdesi." +msgstr "" +"Bir yazılımın (sağlayıcı metnine dayalı olarak) kullanabileceği azami oluk " +"yüzdesi." -msgid "Size of the RX socket buffer to be used for downloads, in kibibytes. If you wish to avoid Gnutella downloads using up all your bandwidth, set it to a low value (default is 64K, which is fine). If you don't mind sucking up all the available bandwidth, increasing your connection latency, set it to a greater value. Remember: the smaller the value, the more you will be able to precisely control the incoming rate." -msgstr "İndirmeler için kullanılan RX (alım) soket tamponunun boyutu, kibibayt olarak. Gnutella indirmelerinin tüm bant genişliğinizi kullanmasını engellemek istiyorsanız düşük bir değer giriniz (varsayılan değer 64K'dır ki bu uygundur). Mevcut bütün bant genişliğinizin kullanılması ve bunun bağlantınızda gecikmelere yol açması sorun yaratmıyorsa büyük bir değer girebilirsiniz. Unutmayın ki bu değer ne kadar küçükse içeri gelen bant genişliğini o denli ince bir şekilde yönetebilirsiniz." +msgid "" +"Size of the RX socket buffer to be used for downloads, in kibibytes. If you " +"wish to avoid Gnutella downloads using up all your bandwidth, set it to a " +"low value (default is 64K, which is fine). If you don't mind sucking up all " +"the available bandwidth, increasing your connection latency, set it to a " +"greater value. Remember: the smaller the value, the more you will be able to " +"precisely control the incoming rate." +msgstr "" +"İndirmeler için kullanılan RX (alım) soket tamponunun boyutu, kibibayt " +"olarak. Gnutella indirmelerinin tüm bant genişliğinizi kullanmasını " +"engellemek istiyorsanız düşük bir değer giriniz (varsayılan değer 64K'dır ki " +"bu uygundur). Mevcut bütün bant genişliğinizin kullanılması ve bunun " +"bağlantınızda gecikmelere yol açması sorun yaratmıyorsa büyük bir değer " +"girebilirsiniz. Unutmayın ki bu değer ne kadar küçükse içeri gelen bant " +"genişliğini o denli ince bir şekilde yönetebilirsiniz." -msgid "Size of the RX socket buffer to be used for nodes, in kbytes. The lower the value, the faster the remote end will flow-control at the TCP/IP level if you don't read quickly enough, which would be the case if you limit the incoming bandwidth." -msgstr "Düğümler için kullanılacak RX soket tamponunun boyutu, kbayt olarak. Bu değer ne kadar küçükse, yeteri kadar hızlı okumadığınızda, ki bu içeriye gelen bant genişiğlinizi kısıtlarsanız meydana gelebilir, diğer düğümlerin TCP/İP seviyesinde akış kontrolü yapması o kadar hızlanacaktır." +msgid "" +"Size of the RX socket buffer to be used for nodes, in kbytes. The lower the " +"value, the faster the remote end will flow-control at the TCP/IP level if " +"you don't read quickly enough, which would be the case if you limit the " +"incoming bandwidth." +msgstr "" +"Düğümler için kullanılacak RX soket tamponunun boyutu, kbayt olarak. Bu " +"değer ne kadar küçükse, yeteri kadar hızlı okumadığınızda, ki bu içeriye " +"gelen bant genişiğlinizi kısıtlarsanız meydana gelebilir, diğer düğümlerin " +"TCP/İP seviyesinde akış kontrolü yapması o kadar hızlanacaktır." msgid "Size of the TX socket buffer to be used for uploads, in kibibytes." -msgstr "Göndermeler için kullanılacak TX soket tamponunun boyutu, kibibayt olarak." +msgstr "" +"Göndermeler için kullanılacak TX soket tamponunun boyutu, kibibayt olarak." -msgid "Average recent latency between the sending of the HTTP request and the reception of the reply from the remote server, in msecs." -msgstr "Son HTTP istekleri ile uzaktaki sunucudan alınan cevap arasındaki milisaniye olarak ortalama zaman aralığı." +msgid "" +"Average recent latency between the sending of the HTTP request and the " +"reception of the reply from the remote server, in msecs." +msgstr "" +"Son HTTP istekleri ile uzaktaki sunucudan alınan cevap arasındaki milisaniye " +"olarak ortalama zaman aralığı." msgid "Last time at which we performed the ultrapeer requirement checks." msgstr "Ultraeş gereksinimleri denetlemesini son yaptığımız zaman." @@ -1675,56 +3548,142 @@ msgid "Last time an automatic switch between ultra and leaf mode occurred." msgstr "Ultra ve yaprak kipleri arasında otomatik geçişin en son olduğu zaman." -msgid "Whether we meet the sufficient average uptime requirement to become an Ultra node." -msgstr "Utra düğüm olmak için yeterli ortalama çalışma süresi gereksinimini karşılayıp karşılamadığımızı gösterir." +msgid "" +"Whether we meet the sufficient average uptime requirement to become an Ultra " +"node." +msgstr "" +"Utra düğüm olmak için yeterli ortalama çalışma süresi gereksinimini " +"karşılayıp karşılamadığımızı gösterir." -msgid "Whether we meet the sufficient average IP address uptime requirement to become an Ultra node." -msgstr "Ultra düğüm olmak için yeterli İP adresi çalışma süresi (uptime) gereksinimini karşılayıp karşılamadığımızı gösterir." +msgid "" +"Whether we meet the sufficient average IP address uptime requirement to " +"become an Ultra node." +msgstr "" +"Ultra düğüm olmak için yeterli İP adresi çalışma süresi (uptime) " +"gereksinimini karşılayıp karşılamadığımızı gösterir." -msgid "Whether we meet the sufficient node uptime requirement to become an Ultra node." -msgstr "Ultra düğüm olmak için yeterli çalışma süresi gereksinimini karşılayıp karşılamadığımızı gösterir." +msgid "" +"Whether we meet the sufficient node uptime requirement to become an Ultra " +"node." +msgstr "" +"Ultra düğüm olmak için yeterli çalışma süresi gereksinimini karşılayıp " +"karşılamadığımızı gösterir." msgid "Whether we meet the non-firewalled requirement to become an Ultra node." -msgstr "Ultra düğüm olmak için bir güvenlik duvarı tarafından engellenmeme kriterini yerine getirip getirmediğimizi gösterir." +msgstr "" +"Ultra düğüm olmak için bir güvenlik duvarı tarafından engellenmeme kriterini " +"yerine getirip getirmediğimizi gösterir." -msgid "Whether we meet the minimum amount of peer connections requirement to become an Ultra node." -msgstr "Ultra düğüm olmak için asgari eş bağlantıları gereksinimini karşılayıp karşılamadığımızı gösterir." +msgid "" +"Whether we meet the minimum amount of peer connections requirement to become " +"an Ultra node." +msgstr "" +"Ultra düğüm olmak için asgari eş bağlantıları gereksinimini karşılayıp " +"karşılamadığımızı gösterir." -msgid "Whether we meet the amount of file descriptor requirement to become an Ultra node." -msgstr "Ultra düğüm olmak için dosya tanımlayıcısı gereksinimini karşılayıp karşılamadığımızı gösterir." +msgid "" +"Whether we meet the amount of file descriptor requirement to become an Ultra " +"node." +msgstr "" +"Ultra düğüm olmak için dosya tanımlayıcısı gereksinimini karşılayıp " +"karşılamadığımızı gösterir." msgid "Whether we meet the memory requirements to become an Ultra node." -msgstr "Ultra düğüm olmak için bellek gereksinimini karşılayıp karşılamadığımızı gösterir." +msgstr "" +"Ultra düğüm olmak için bellek gereksinimini karşılayıp karşılamadığımızı " +"gösterir." msgid "Whether we meet the bandwidth requirements to become an Ultra node." -msgstr "Ultra düğüm olmak için bant genişliği gereksinimini karşılayıp karşılamadığımızı gösterir." +msgstr "" +"Ultra düğüm olmak için bant genişliği gereksinimini karşılayıp " +"karşılamadığımızı gösterir." msgid "Whether we meet the UDP requirements to become an Ultra node." -msgstr "Ultra düğüm olmak için UDP gereksinimini karşılayıp karşılamadığımızı gösterir." +msgstr "" +"Ultra düğüm olmak için UDP gereksinimini karşılayıp karşılamadığımızı " +"gösterir." -msgid "Size of the search queue holding the locally generated queries before they are sent on a given connection. When full, the oldest query is dropped without being sent. Set it so that it is slightly larger than the amount of opened searches." -msgstr "Yerel olarak oluşturulan sorguları gönderilmelerinden önce muhafaza eden arama kuyruğunun boyutu. Dolduğunda en eski sorgu gönderilmeden atılır. Bu değeri etkin aramaların sayısından biraz büyük olacak şekilde ayarlayın." +msgid "" +"Size of the search queue holding the locally generated queries before they " +"are sent on a given connection. When full, the oldest query is dropped " +"without being sent. Set it so that it is slightly larger than the amount of " +"opened searches." +msgstr "" +"Yerel olarak oluşturulan sorguları gönderilmelerinden önce muhafaza eden " +"arama kuyruğunun boyutu. Dolduğunda en eski sorgu gönderilmeden atılır. Bu " +"değeri etkin aramaların sayısından biraz büyük olacak şekilde ayarlayın." -msgid "Minimum amount of seconds between two consecutive queries sent to a given connection (for locally generated queries only!). The larger the value, the less negative impact it has on the network." -msgstr "Belli bir bağlantıya gönderilen iki ardışık sorgu arasındaki süre, saniye olarak (sadece yerel olarak oluşturulan sorgular için!). Bu değer ne kadar büyükse şebekeye olumsuz etkisi o kadar azalır." +msgid "" +"Minimum amount of seconds between two consecutive queries sent to a given " +"connection (for locally generated queries only!). The larger the value, the " +"less negative impact it has on the network." +msgstr "" +"Belli bir bağlantıya gönderilen iki ardışık sorgu arasındaki süre, saniye " +"olarak (sadece yerel olarak oluşturulan sorgular için!). Bu değer ne kadar " +"büyükse şebekeye olumsuz etkisi o kadar azalır." -msgid "Whether connection to gtk-gnutella via the 'shell' control interface should be allowed." -msgstr "gtk-gnutella'ya 'kabuk' (shell) kontrol arayüzü ile bağlanılıp bağlanılamayacağını ayarlar." +msgid "" +"Whether connection to gtk-gnutella via the 'shell' control interface should " +"be allowed." +msgstr "" +"gtk-gnutella'ya 'kabuk' (shell) kontrol arayüzü ile bağlanılıp " +"bağlanılamayacağını ayarlar." -msgid "Amount of seconds until an idle remote shell session gets disconnected. If set to zero, no timeout occurs." -msgstr "Aylak bir uzak kabuk oturumunun bağlantısının kesilmeden önce beklenecek saniye sayısı. Sıfır seçilirse zaman aşımı oluşmaz." +msgid "" +"Amount of seconds until an idle remote shell session gets disconnected. If " +"set to zero, no timeout occurs." +msgstr "" +"Aylak bir uzak kabuk oturumunun bağlantısının kesilmeden önce beklenecek " +"saniye sayısı. Sıfır seçilirse zaman aşımı oluşmaz." -msgid "Amount of seconds to leave 'dead' entries around so that they can still be displayed by the GUI along with the termination status." -msgstr "'Ölü' girdilerin grafik arayüzde bitme durumlarıyla gösterilmeleri için tutulacakları saniye sayısı." +msgid "" +"Amount of seconds to leave 'dead' entries around so that they can still be " +"displayed by the GUI along with the termination status." +msgstr "" +"'Ölü' girdilerin grafik arayüzde bitme durumlarıyla gösterilmeleri için " +"tutulacakları saniye sayısı." -msgid "Whether gtk-gnutella should actively monitor query strings by TTL and hop count and drop duplicates. Only applies when not running as a leaf node, and only for queries with hop count > 0, i.e. not from our immediate neighbor. Dropped queries will be accounted for in the 'Message throttle' counter." -msgstr "gtk-gnutella'nın sorgu dizelerinin TTL ve hop sayılarını etkin bir şekilde izleyip izlemeyeceğini ve çift sorguları atıp atmayacağını ayarlar. Sadece yaprak düğüm olunmadığı zaman ve hop sayısı sıfırdan büyük olan, yani doğrudan komşularımızdan gelmeyen sorgular için geçerlidir. Atılan mesaj sayısı 'mesaj sayısı sınırlaması' sayacına eklenir." +msgid "" +"Whether gtk-gnutella should actively monitor query strings by TTL and hop " +"count and drop duplicates. Only applies when not running as a leaf node, " +"and only for queries with hop count > 0, i.e. not from our immediate " +"neighbor. Dropped queries will be accounted for in the 'Message throttle' " +"counter." +msgstr "" +"gtk-gnutella'nın sorgu dizelerinin TTL ve hop sayılarını etkin bir şekilde " +"izleyip izlemeyeceğini ve çift sorguları atıp atmayacağını ayarlar. Sadece " +"yaprak düğüm olunmadığı zaman ve hop sayısı sıfırdan büyük olan, yani " +"doğrudan komşularımızdan gelmeyen sorgular için geçerlidir. Atılan mesaj " +"sayısı 'mesaj sayısı sınırlaması' sayacına eklenir." -msgid "Half the duration during which gtk-gnutella should remember the recently relayed queries by TTL and hop count. The default value of 5 should be just fine, but you can experiment with different settings if you want. The higher it is set, the more likely you are to drop legitimate queries, so be careful." -msgstr "gtk-gnutella'nın yönlendirilen sorguları TTL ve hop sayısına dayalı olarak hatırlayacağı sürenin yarısı. Varsayılan 5 değeri uygundur ama isterseniz başka değerleri deneyebilirsiniz. Bu değer ne kadar büyükse meşru sorguları atma oranı o kadar artacaktır, dolayısıyla dikkatli olunuz." +msgid "" +"Half the duration during which gtk-gnutella should remember the recently " +"relayed queries by TTL and hop count. The default value of 5 should be just " +"fine, but you can experiment with different settings if you want. The " +"higher it is set, the more likely you are to drop legitimate queries, so be " +"careful." +msgstr "" +"gtk-gnutella'nın yönlendirilen sorguları TTL ve hop sayısına dayalı olarak " +"hatırlayacağı sürenin yarısı. Varsayılan 5 değeri uygundur ama isterseniz " +"başka değerleri deneyebilirsiniz. Bu değer ne kadar büyükse meşru sorguları " +"atma oranı o kadar artacaktır, dolayısıyla dikkatli olunuz." -msgid "The minimum amount of seconds to enforce between two identical queries from leaf nodes. If the requery too early, it is dropped and accounted for in the 'Message throttle' counter. Too frequent requeries are harmful for the network, yet we must allow some amount of requerying given the dynamic nature of Gnutella connections. You can't disable this checking, but you can lower the constraint significantly. Deviations from the default of 1700 have exponential effects on the network traffic." -msgstr "Yaprak düğümlerinden iki özdeş sorgu arasında zorlanacak saniye sayısı. Eğer yeniden sorgulama erken gelirse atılır ve 'mesaj sayısı sınırlaması' sayacına eklenir. Erken yeniden sorgulamalar şebeke için zararlıdır ancak Gnutella bağlantılarının dinamik yapısı göz önüne alındığında bir miktarına izin vermemiz gerekir. Bu denetimi devre dışı bırakamazsınız ancak kısıtlamayı önemli ölçüde düşürebilirsiniz. Varsayılan 1700 değerinden sapmanın şebeke trafiği üzerinde üstel etkisi olur." +msgid "" +"The minimum amount of seconds to enforce between two identical queries from " +"leaf nodes. If the requery too early, it is dropped and accounted for in " +"the 'Message throttle' counter. Too frequent requeries are harmful for the " +"network, yet we must allow some amount of requerying given the dynamic " +"nature of Gnutella connections. You can't disable this checking, but you " +"can lower the constraint significantly. Deviations from the default of 1700 " +"have exponential effects on the network traffic." +msgstr "" +"Yaprak düğümlerinden iki özdeş sorgu arasında zorlanacak saniye sayısı. Eğer " +"yeniden sorgulama erken gelirse atılır ve 'mesaj sayısı sınırlaması' " +"sayacına eklenir. Erken yeniden sorgulamalar şebeke için zararlıdır ancak " +"Gnutella bağlantılarının dinamik yapısı göz önüne alındığında bir miktarına " +"izin vermemiz gerekir. Bu denetimi devre dışı bırakamazsınız ancak " +"kısıtlamayı önemli ölçüde düşürebilirsiniz. Varsayılan 1700 değerinden " +"sapmanın şebeke trafiği üzerinde üstel etkisi olur." msgid "Time at which we started the last scan of the library." msgstr "Kütüphanenin son analizini başlattığımız zaman." @@ -1769,7 +3728,7 @@ msgstr "QRP tablomuzda dolan olukların yüzdesi." msgid "Percentage of hashing conflicts whilst inserting data in our QRP table." -msgstr "QRP tablomuza veri yerleştirirken meydana gelen hash çatışma yüzdesi. " +msgstr "QRP tablomuza veri yerleştirirken meydana gelen hash çatışma yüzdesi." msgid "Amount of hashed keywords in our QRP table." msgstr "QRP tablomuzdaki anahtar kelime hash değeri miktarı." @@ -1781,58 +3740,161 @@ msgstr "Son QRP tablo yaması uzunluğu, mümkün olan sıkıştırma ardından." msgid "QRP table patch compression ratio, in percent, 0 means none." -msgstr "QRP tablo yaması sıkıştırma oranı, yüzde olarak. 0 sıkıştırma olmadığını gösterir." +msgstr "" +"QRP tablo yaması sıkıştırma oranı, yüzde olarak. 0 sıkıştırma olmadığını " +"gösterir." msgid "Indicates that gtk-gnutella will expire in that many days." msgstr "gtk-gnutella'nın bu sayıda gün sonra eski sayılacağını gösterir." -msgid "When set, gtk-gnutella is running short on file descriptors, but normal operations are still possible. The condition automatically clears itself after 10 minutes without any more shortage." -msgstr "Etkin olduğunda, gtk-gnutella için dosya tanımlayıcıları kalmadığını ancak işlemlerin normal olarak devam edebildiğini gösterir. Bu kip sorunun son meydana gelişinden 10 dakika sonra otomatik olarak kaldırılır." +msgid "" +"When set, gtk-gnutella is running short on file descriptors, but normal " +"operations are still possible. The condition automatically clears itself " +"after 10 minutes without any more shortage." +msgstr "" +"Etkin olduğunda, gtk-gnutella için dosya tanımlayıcıları kalmadığını ancak " +"işlemlerin normal olarak devam edebildiğini gösterir. Bu kip sorunun son " +"meydana gelişinden 10 dakika sonra otomatik olarak kaldırılır." -msgid "When set, gtk-gnutella has run out of file descriptors, and operations are necessarily degraded, if not impossible. The condition automatically clears itself after 10 minutes past the last occurrence." -msgstr "Etkin olduğunda, gtk-gnutella için dosya tanımlayıcıları kalmadığını ve işlemlerin bozulmuş hatta imkânsız olduğunu gösterir. Bu kip sorunun son meydana gelişinden 10 dakika sonra otomatik olarak kaldırılır." +msgid "" +"When set, gtk-gnutella has run out of file descriptors, and operations are " +"necessarily degraded, if not impossible. The condition automatically clears " +"itself after 10 minutes past the last occurrence." +msgstr "" +"Etkin olduğunda, gtk-gnutella için dosya tanımlayıcıları kalmadığını ve " +"işlemlerin bozulmuş hatta imkânsız olduğunu gösterir. Bu kip sorunun son " +"meydana gelişinden 10 dakika sonra otomatik olarak kaldırılır." msgid "If set, spaces in filenames are replaced with underscores." -msgstr "Seçiliyse, dosya isimlerindeki boşluk karakterlerinin yerine alt çizgiler konacaktır." +msgstr "" +"Seçiliyse, dosya isimlerindeki boşluk karakterlerinin yerine alt çizgiler " +"konacaktır." -msgid "If set, meta shell characters in filenames are replaced with underscores. (This must also be enabled for FAT partitions.)" -msgstr "Seçiliyse, dosya isimlerindeki kabuk (shell) meta karakterlerinin yerine alt çizgiler koyulacaktır. (Bu şıkkın FAT disk bölümleri için etkin olması gerekir.)" +msgid "" +"If set, meta shell characters in filenames are replaced with underscores. " +"(This must also be enabled for FAT partitions.)" +msgstr "" +"Seçiliyse, dosya isimlerindeki kabuk (shell) meta karakterlerinin yerine alt " +"çizgiler koyulacaktır. (Bu şıkkın FAT disk bölümleri için etkin olması " +"gerekir.)" -msgid "If set, gtk-gnutella will, upon startup, sanitize filenames by converting spaces and/or evil characters in them, according to your settings, on existing filenames in your temporary downloading directory. By default, the above settings apply only on newly created entries, not existing ones." -msgstr "Seçiliyse, gtk-gnutella başlatıldığında, ayarlarınıza uygun olarak tamamlanmamış indirmeler dizininizdeki dosyaların isimlerini, içerdikleri şer ve/veya boşluk karakterlerini değiştirerek güzelleştirir. Varsayılan değer, bu ayarların zaten mevcut olan dosyalara değil, sadece yeni yaratılan dosyalara uygulanmasıdır." +msgid "" +"If set, gtk-gnutella will, upon startup, sanitize filenames by converting " +"spaces and/or evil characters in them, according to your settings, on " +"existing filenames in your temporary downloading directory. By default, the " +"above settings apply only on newly created entries, not existing ones." +msgstr "" +"Seçiliyse, gtk-gnutella başlatıldığında, ayarlarınıza uygun olarak " +"tamamlanmamış indirmeler klasörünüzdeki dosyaların isimlerini, içerdikleri " +"şer ve/veya boşluk karakterlerini değiştirerek güzelleştirir. Varsayılan " +"değer, bu ayarların zaten mevcut olan dosyalara değil, sadece yeni yaratılan " +"dosyalara uygulanmasıdır." msgid "If set, all outgoing connections are tunneled over TLS." msgstr "Seçiliyse, dışarıya giden tüm bağlantılar TLS ile tünellenir." msgid "If not set, support for Gnutella connection compression is disabled." -msgstr "Seçili değilse, Gnutella bağlantı sıkıştırma desteği devre dışı bırakılır." +msgstr "" +"Seçili değilse, Gnutella bağlantı sıkıştırma desteği devre dışı bırakılır." -msgid "Whether UDP shall be used in complement to TCP. When set, gtk-gnutella will also listen for UDP traffic on the same port as the one configured for TCP and process incoming Gnutella traffic in almost the same way as if it was received via TCP. It is safe to leave this set, which is the default behavior." -msgstr "TCP'ye takviye olarak UDP'nin kullanılıp kullanılmayacağını belirler. Seçildiğinde, gtk-gnutella TCP için ayarlanan portta UDP trafiğine de dinleyecek ve alınan Gnutella trafiğini TCP'den alınmışa çok benzer bir şekilde işleyecektir. Bu şıkkı etkin bırakmak güvenlidir ve varsayılan değerdir." +msgid "" +"Whether UDP shall be used in complement to TCP. When set, gtk-gnutella will " +"also listen for UDP traffic on the same port as the one configured for TCP " +"and process incoming Gnutella traffic in almost the same way as if it was " +"received via TCP. It is safe to leave this set, which is the default " +"behavior." +msgstr "" +"TCP'ye takviye olarak UDP'nin kullanılıp kullanılmayacağını belirler. " +"Seçildiğinde, gtk-gnutella TCP için ayarlanan portta UDP trafiğini de " +"dinleyecek ve alınan Gnutella trafiğini TCP'den alınmışa çok benzer bir " +"şekilde işleyecektir. Bu şıkkı etkin bırakmak güvenlidir ve varsayılan " +"değerdir." -msgid "Whether gtk-gnutella should honor the request for out-of-band delivery of query hits via UDP, provided UDP support is enabled. It should not be necessary to add a port forwarding to enable this as your node will be the origin of the UDP traffic and can therefore receive replies sent to the transient UDP port opened by a masquerading firewall. It is enabled by default because it is deemed safe, as your node controls the bulk of the emitted traffic and honors the bandwidth limitations." -msgstr "gtk-gnutella'nın UDP desteği etkinse, bant dışı (out-of-band, OOB) sorgu denkleşmesi teslimat taleplerine UDP yoluyla olumlu cevap verip vermeyeceğini ayarlar. Port haritalama, UDP trafiğinin kaynağı sizin düğümünüz olacağı ve dolayısıyla sözde bir (masquerading) güvenlik duvarının açtığı geçici UDP portuna yollanan cevapları muhtemelen alabileceği için gerekmez. Varsayılan değer bu seçeneğin etkin olmasıdır çünkü düğümünüz yollanan trafiği kontrol ettiğinden ve bant genişliği sınırlarına uyduğundan dolayı bu ayarın güvenli olduğu kabul edilir." +msgid "" +"Whether gtk-gnutella should honor the request for out-of-band delivery of " +"query hits via UDP, provided UDP support is enabled. It should not be " +"necessary to add a port forwarding to enable this as your node will be the " +"origin of the UDP traffic and can therefore receive replies sent to the " +"transient UDP port opened by a masquerading firewall. It is enabled by " +"default because it is deemed safe, as your node controls the bulk of the " +"emitted traffic and honors the bandwidth limitations." +msgstr "" +"gtk-gnutella'nın UDP desteği etkinse, bant dışı (out-of-band, OOB) sorgu " +"isabetleri teslimat taleplerine UDP yoluyla olumlu cevap verip vermeyeceğini " +"ayarlar. Port haritalama, UDP trafiğinin kaynağı sizin düğümünüz olacağı ve " +"dolayısıyla sözde bir (masquerading) güvenlik duvarının açtığı geçici UDP " +"portuna yollanan cevapları muhtemelen alabileceği için gerekmez. Varsayılan " +"değer bu seçeneğin etkin olmasıdır çünkü düğümünüz yollanan trafiği kontrol " +"ettiğinden ve bant genişliği sınırlarına uyduğundan dolayı bu ayarın güvenli " +"olduğu kabul edilir." -msgid "Whether gtk-gnutella should send queries requesting out-of-band delivery of query hits via UDP. The setting is ignored if you seem to be UDP-firewalled, i.e. cannot receive unsolicited UDP traffic. You need to enable UDP support first. This can cause the reception of vast quantities of UDP replies, so you may choose to disable this feature. If disabled, your hits will travel through the Gnutella network and can be dropped by any flow-controlled relaying node, limiting the results you can get." -msgstr "gtk-gnutella'nın UDP yoluyla bant dışı sorgu denkleşmesi talep eden sorgular yollayıp yollamayacağını belirler. UDP açısından bir güvenlik duvarı tarafından engelleniyor gibi görünüyorsanız bu ayar görmezden gelinir. Bu ayarın çalışması için UDP desteğini etkinleştirmeniz gerekir. Aynı zamanda bu ayar büyük miktarda UDP cevapları almanıza yol açabilir, bu durumda devre dışı bırakabilirsiniz. Devre dışı bırakıldığında sorgu denkleşmeleri doğrudan gelmeyip Gnutella ağında seyahat edecektir ve akış kontrolünde bulunan yönlendirici düğümler tarafından atılabilir, ki bu aldığınız sonuçları sınırlar." +msgid "" +"Whether gtk-gnutella should send queries requesting out-of-band delivery of " +"query hits via UDP. The setting is ignored if you seem to be UDP-" +"firewalled, i.e. cannot receive unsolicited UDP traffic. You need to enable " +"UDP support first. This can cause the reception of vast quantities of UDP " +"replies, so you may choose to disable this feature. If disabled, your hits " +"will travel through the Gnutella network and can be dropped by any flow-" +"controlled relaying node, limiting the results you can get." +msgstr "" +"gtk-gnutella'nın UDP vasıtasıyla bant dışı sorgu isabeti talep eden sorgular " +"yollayıp yollamayacağını belirler. UDP açısından bir güvenlik duvarı " +"tarafından engelleniyor gibi görünüyorsanız bu ayar görmezden gelinir. Bu " +"ayarın çalışması için UDP desteğini etkinleştirmeniz gerekir. Aynı zamanda " +"bu ayar büyük miktarda UDP cevapları almanıza yol açabilir, bu durumda devre " +"dışı bırakabilirsiniz. Devre dışı bırakıldığında sorgu isabetleri doğrudan " +"gelmeyip Gnutella ağında seyahat edecektir ve akış kontrolünde bulunan " +"yönlendirici düğümler tarafından atılabilir, ki bu aldığınız sonuçları " +"sınırlar." -msgid "Whether gtk-gnutella should, when running as ultrapeer, act as proxy for leaf queries that are not requesting OOB delivery of query hits: gtk-gnutella will claim the hits from the remote nodes and forward the hits to the proper leaf. This is very beneficial for the leaves, but can cause huge bursts of UDP traffic coming back to you. If you disable it all ultrapeers connected to you will have to relay the hits, possibly dropping other query messages and lowering the efficiency of the search network." -msgstr "gtk-gnutella'nın ultraeş durumundayken bant dışı (OOB) doğrudan sorgu denkleşmeleri talep etmeyen yaprak sorguları için vekillik yapıp yapmayacağını ayarlar: etkinleştirildiğinde, gtk-gnutella uzaktaki düğümlerden sorgu denkleşmelerini talep edecek ve bunları uygun yaprağa iletecektir. Bunun yapraklara çok faydası dokunur ama size gelen UDP trafiğinde yükselmelere yol açabilir. Devre dışı bırakırsanız, size bağlı tüm ultraeşler denkleşmeleri yönlendirmek ve muhtemelen başka sorgu mesajlarını çöpe atmak zorunda kalacaktır, ki bu şebekenin verimini düşürür." +msgid "" +"Whether gtk-gnutella should, when running as ultrapeer, act as proxy for " +"leaf queries that are not requesting OOB delivery of query hits: gtk-" +"gnutella will claim the hits from the remote nodes and forward the hits to " +"the proper leaf. This is very beneficial for the leaves, but can cause huge " +"bursts of UDP traffic coming back to you. If you disable it all ultrapeers " +"connected to you will have to relay the hits, possibly dropping other query " +"messages and lowering the efficiency of the search network." +msgstr "" +"gtk-gnutella'nın ultraeş durumundayken bant dışı (OOB) doğrudan sorgu " +"isabetleri talep etmeyen yaprak sorguları için vekillik yapıp yapmayacağını " +"ayarlar: etkinleştirildiğinde, gtk-gnutella uzaktaki düğümlerden sorgu " +"isabetlerini talep edecek ve bunları uygun yaprağa iletecektir. Bunun " +"yapraklara çok faydası dokunur ama size gelen UDP trafiğinde yükselmelere " +"yol açabilir. Devre dışı bırakırsanız, size bağlı tüm ultraeşler isabetleri " +"yönlendirmek ve muhtemelen başka sorgu mesajlarını çöpe atmak zorunda " +"kalacaktır, ki bu şebekenin verimini düşürür." -msgid "Whether uploads are frequently stalling, indicating that the bandwidth is saturated. Avoid running as an ultra-node under those conditions." -msgstr "Göndermelerin sıkça durakladığını gösterir. Bu durumda ultra düğüm durumuna geçmekten kaçınınız." +msgid "" +"Whether uploads are frequently stalling, indicating that the bandwidth is " +"saturated. Avoid running as an ultra-node under those conditions." +msgstr "" +"Göndermelerin sıkça durakladığını gösterir. Bu durumda ultra düğüm durumuna " +"geçmekten kaçınınız." -msgid "If set to TRUE, the global hostiles.txt is used as well as the private $GTK_GNUTELLA_DIR/hostiles.txt. This allows to separate your private ban list from the global one distributed with gtk-gnutella." -msgstr "DOĞRU seçilirse kişisel $GTK_GNUTELLA_DIR/hostiles.txt dosyasına ek olarak genel hostiles.txt dosyası da kullanılacaktır. Bu kişisel yasaklama listenizi, gtk-gnutella ile dağıtılan genel listeden ayırmanıza imkân verir." +msgid "" +"If set to TRUE, the global hostiles.txt is used as well as the private " +"$GTK_GNUTELLA_DIR/hostiles.txt. This allows you to separate your private ban " +"list from the global one distributed with gtk-gnutella." +msgstr "" +"Eğer DOĞRU olarak seçiliyse, gobal hostiles.txt ile özel $GTK_GNUTELLA_DIR/" +"hostiles.txt dosyası da kullanılacaktır. Bu, sizin özel yasaklama listenizi " +"gtk-gnutella ile dağıtılan global listeden ayırmanıza imkân sağlar." msgid "If set to TRUE, SO_LINGER is used for sockets." msgstr "DOĞRU seçiliyse soketler için SO_LINGER kullanılır." -msgid "See the man page for tcp(7). This feature typically only available on Linux systems." -msgstr "tcp(7) için man sayfasına bakınız. Bu işlev tipik olarak sadece GNU/Linux sistemlerinde bulunur." +msgid "" +"See the man page for tcp(7). This feature typically only available on Linux " +"systems." +msgstr "" +"tcp(7) için man sayfasına bakınız. Bu işlev tipik olarak sadece GNU/Linux " +"sistemlerinde bulunur." msgid "If TRUE, other hosts can request a complete list of all shared files." -msgstr "EVET seçiliyse, diğer bilgisayarların paylaşılan bütün dosyaların listesini istemesine izin verilir." +msgstr "" +"EVET seçiliyse, diğer bilgisayarların paylaşılan bütün dosyaların listesini " +"istemesine izin verilir." msgid "Number of HTML browsing requests received in this session." msgstr "Bu oturumda alınan HTML kişiye gözatma isteklerinin sayısı." @@ -1844,19 +3906,61 @@ msgstr "Bu oturumda Gnutella kişiye gözatma isteklerinin sayısı." msgid "Number of Gnutella browsing requests fully served in this session." -msgstr "Bu oturumda tamamen cevaplanan Gnutella kişiye gözatma istekleri." +msgstr "Bu oturumda tamamen cevaplanan Gnutella kişiye gözatma talepleri." -msgid "The average CPU usage indicates overloading, so gtk-gnutella is reducing the amount of non-critical processing it is performing. Note that the overloading can result from gtk-gnutella not getting enough CPU time because another process is competing for the CPU. Whilst the overloading condition persists, GUI refreshing is reduced and background tasks (SHA1 computation, file moving) are slowed down." -msgstr "Ortalama mikroişlemci kullanımı çipin aşırı yüklendiğine işaret ediyor, dolayısıyla gtk-gnutella yaptığı kritik olmayan işlem miktarını azaltıyor. Unutmayın ki bu aşırı yük, başka bir işlemin mikroişlemciye erişim için rekabet etmesi nedeniyle gtk-gnutella'nın yeteri kadar mikroişlemci zamanına ulaşamamasından kaynaklanabilir. Bu aşırı yük durumu sürdükçe grafik arayüz tazelemesi azaltılacak ve arka plan işlemleri (SHA1 hesaplamaları, dosya taşımalar) yavaşlatılacaktır." +msgid "" +"The average CPU usage indicates overloading, so gtk-gnutella is reducing the " +"amount of non-critical processing it is performing. Note that the " +"overloading can result from gtk-gnutella not getting enough CPU time because " +"another process is competing for the CPU. Whilst the overloading condition " +"persists, GUI refreshing is reduced and background tasks (SHA1 computation, " +"file moving) are slowed down." +msgstr "" +"Ortalama mikroişlemci kullanımı çipin aşırı yüklendiğine işaret ediyor, " +"dolayısıyla gtk-gnutella yaptığı kritik olmayan işlem miktarını azaltıyor. " +"Unutmayın ki bu aşırı yük, başka bir işlemin mikroişlemciye erişim için " +"rekabet etmesi nedeniyle gtk-gnutella'nın yeteri kadar mikroişlemci zamanına " +"ulaşamamasından kaynaklanabilir. Bu aşırı yük durumu sürdükçe grafik arayüz " +"tazelemesi azaltılacak ve arka plan işlemleri (SHA1 hesaplamaları, dosya " +"taşımalar) yavaşlatılacaktır." -msgid "Amount of data per downloading source that gtk-gnutella will buffer before writing to disk. When swarming from many sources, a larger value will help avoid using too many system calls and should also reduce the fragmentation on the filesystem. The downside is that it uses more memory per active source. Use 0 to disable all buffering, i.e. have gtk-gnutella write to disk as soon as it receives some data. Increase to maximum value if you have RAM." -msgstr "Her indirme kaynağı için gtk-gnutella'nın diske yazmadan önce tampona alacağı veri miktarı. Çoklu indirim sırasında yüksek bir değer sistem çağrılarının sayısının çok yükselmesini önler ve dosya sisteminin parçalanmasını da azaltabilir. Dezavantajı ise aktif kaynak başına daha fazla bellek kullanılmasıdır. Tampona veri alınmasını devre dışı bırakmak için 0 değerini seçin, bu durumda gtk-gnutella veri alır almaz bunu diske yazar. RAM belleğiniz müsaitse azami değerine çıkarın." +msgid "" +"Amount of data per downloading source that gtk-gnutella will buffer before " +"writing to disk. When swarming from many sources, a larger value will help " +"avoid using too many system calls and should also reduce the fragmentation " +"on the filesystem. The downside is that it uses more memory per active " +"source. Use 0 to disable all buffering, i.e. have gtk-gnutella write to " +"disk as soon as it receives some data. Increase to maximum value if you have " +"RAM." +msgstr "" +"Her indirme kaynağı için gtk-gnutella'nın diske yazmadan önce tampona " +"alacağı veri miktarı. Çoklu indirim sırasında yüksek bir değer sistem " +"çağrılarının sayısının çok yükselmesini önler ve dosya sisteminin " +"parçalanmasını da azaltabilir. Dezavantajı ise aktif kaynak başına daha " +"fazla bellek kullanılmasıdır. Tampona veri alınmasını devre dışı bırakmak " +"için 0 değerini seçin, bu durumda gtk-gnutella veri alır almaz bunu diske " +"yazar. RAM belleğiniz müsaitse azami değerine çıkarın." -msgid "When set, all search results from host browsing are dispatched to all opened passive searches. This is useful if you have different selection filters on your passive searches because it lets you classify files easily, regardless of the origin of the files." -msgstr "Seçildiğinde, kişiye gözatmalardan gelen sonuçlar tüm açık pasif aramalara yollanır. Pasif aramalarınızda değişik filtreleriniz varsa bu yararlıdır çünkü dosyaları kökenlerini dikkate almadan kolayca sınıflandırmanıza imkân verir." +msgid "" +"When set, all search results from host browsing are dispatched to all opened " +"passive searches. This is useful if you have different selection filters on " +"your passive searches because it lets you classify files easily, regardless " +"of the origin of the files." +msgstr "" +"Seçildiğinde, kişiye gözatmalardan gelen sonuçlar tüm açık pasif aramalara " +"yollanır. Pasif aramalarınızda değişik filtreleriniz varsa bu yararlıdır " +"çünkü dosyaları kökenlerini dikkate almadan kolayca sınıflandırmanıza imkân " +"verir." -msgid "Enable this if all units should be displayed using the metric system with SI prefixes. If disabled, certain units, for example, filesizes will be displayed using the historical base2 convention with binary prefixes." -msgstr "Tüm birimlerin metrik sistem kullanarak Sİ ekleri ile görüntülenmesini istiyorsanız etkinleştirin. Devre dışı bırakılırsa, dosya boyutları gibi bazı birimler ikili ekler kullanılarak eski base2 sistemi ile görüntülenecektir." +msgid "" +"Enable this if all units should be displayed using the metric system with SI " +"prefixes. If disabled, certain units, for example, filesizes will be " +"displayed using the historical base2 convention with binary prefixes." +msgstr "" +"Tüm birimlerin metrik sistem kullanarak Sİ ekleri ile görüntülenmesini " +"istiyorsanız etkinleştirin. Devre dışı bırakılırsa, dosya boyutları gibi " +"bazı birimler ikili ekler kullanılarak eski base2 sistemi ile " +"görüntülenecektir." msgid "Debug level for Reliable UDP (RUDP) code." msgstr "\"Reliable UDP\" (RUDP) kodu için hata ayıklama seviyesi." @@ -1867,17 +3971,38 @@ msgid "Debug level for the OOB-proxying of queries." msgstr "Sorguların OOB vekili ile işlemleri için hata ayıklama seviyesi." -msgid "If set gtk-gnutella also listens on a local (unix domain) socket which is located in ~/.gtk-gnutella/socket." -msgstr "Etkinleştirilirse, gtk-gnutella aynı zamanda ~/.gtk-gnutella/socket konumundaki yerel (Unix alanı) soketi de dinleyecektir." +msgid "" +"If set gtk-gnutella also listens on a local (unix domain) socket which is " +"located in ~/.gtk-gnutella/socket." +msgstr "" +"Etkinleştirilirse, gtk-gnutella aynı zamanda ~/.gtk-gnutella/socket " +"konumundaki yerel (Unix alanı) soketi de dinleyecektir." msgid "Don't start more than this number of parallel downloads per file." msgstr "Dosya başına bu sayıdan yüksek eşzamanlı indirme başlatma." -msgid "If enabled, all received packets are dumped to $GTK_GNUTELLA_DIR/packets_rx.dump." -msgstr "Seçiliyse, alınan tüm paketler $GTK_GNUTELLA_DIR/packets_rx.dump dosyasına dökülecektir." +msgid "" +"If enabled, all received packets are dumped to $GTK_GNUTELLA_DIR/packets_rx." +"dump." +msgstr "" +"Seçiliyse, alınan tüm paketler $GTK_GNUTELLA_DIR/packets_rx.dump dosyasına " +"dökülecektir." -msgid "If enabled, queries are also matched against the directory names which are relative to the shared ones. Further, search results will show these. This is especially useful if the shared filenames are ambiguous or meaningless without knowing the directory names as well. However, be sure the directory names do not expose confidential information. You have to initiate a rescan of the shared files before a change becomes fully effective." -msgstr "Etkinleştirildiğinde, sorguların paylaşılan dosyaları içeren dizinlerin isimlerine denk gelip gelmediği dikkate alınacaktır. Ek olarak arama sonuçları bu dizin isimlerini gösterecektir. Bu, dosya isimleri dizin isimleri olmadan anlamsız ya da müphem olduklarında çok faydalıdır; ancak dizin isimlerinin özel verilerinizi sızdırmayacağından emin olmanız gerekir. Bu şıkkın tamamen etkili olması için paylaşılan dosyaların analizini tekrarlamanız gerekir." +msgid "" +"If enabled, queries are also matched against the directory names which are " +"relative to the shared ones. Further, search results will show these. This " +"is especially useful if the shared filenames are ambiguous or meaningless " +"without knowing the directory names as well. However, be sure the directory " +"names do not expose confidential information. You have to initiate a rescan " +"of the shared files before a change becomes fully effective." +msgstr "" +"Etkinleştirildiğinde, sorguların paylaşılan dosyaları içeren klasörlerin " +"isimlerine denk gelip gelmediği dikkate alınacaktır. Ek olarak arama " +"sonuçları bu dizin isimlerini gösterecektir. Bu, dosya isimleri dizin " +"isimleri olmadan anlamsız ya da müphem olduklarında çok faydalıdır; ancak " +"klasör isimlerinin özel verilerinizi sızdırmayacağından emin olmanız " +"gerekir. Bu şıkkın tamamen etkili olması için paylaşılan dosyaların " +"analizini tekrarlamanız gerekir." msgid "Debug level for the shell." msgstr "Kabuk için hata ayıklama seviyesi." @@ -1900,14 +4025,22 @@ msgid "Debug level for Tigertree-related code." msgstr "Tigertree hakkında kod için hata ayıklama seviyesi." -msgid "Whether gtk-gnutella is currently computing TTH of shared files in the background." -msgstr "gtk-gnutella'nın arka planda paylaşılan dosyaların TTH değerlerini hesaplayıp hesaplamadığını gösterir." +msgid "" +"Whether gtk-gnutella is currently computing TTH of shared files in the " +"background." +msgstr "" +"gtk-gnutella'nın arka planda paylaşılan dosyaların TTH değerlerini " +"hesaplayıp hesaplamadığını gösterir." -msgid "Whether gtk-gnutella is currently verifying the TTH of downloaded files in the background." -msgstr "gtk-gnutella'nın arka planda indirilen dosyaların TTH değerlerini kontrol edip etmediğini gösterir." +msgid "" +"Whether gtk-gnutella is currently verifying the TTH of downloaded files in " +"the background." +msgstr "" +"gtk-gnutella'nın arka planda indirilen dosyaların TTH değerlerini kontrol " +"edip etmediğini gösterir." msgid "Maximum number of results to show in any search." -msgstr "Aramalarda gösterilecek azami sonuç sayısı" +msgstr "Aramalarda gösterilecek azami sonuç sayısı." msgid "Maximum number of results to show in a browse_host request." msgstr "Kişiye gözatmalarda gösterilecek azami sonuç sayısı." @@ -1922,40 +4055,93 @@ msgstr "Son SVN sürümü bildiriminin imzası." msgid "Maximum number of hosts in the TLS node cache." -msgstr "TLS düğümleri arabelleğindeki azami bilgisayar sayısı." +msgstr "TLS düğümleri arabelleğindeki azami makine sayısı." msgid "Maximum time before removing hosts from the TLS cache." -msgstr "Bilgisayarları TLS arabelleğinden kaldırmadan önce beklenecek azami süre." +msgstr "" +"Bilgisayarları TLS arabelleğinden kaldırmadan önce beklenecek azami süre." -msgid "If set to TRUE the tigertree root hash (TTH) can be discovered on the fly. Otherwise, the TTH is only accepted if provided by the user, for example, by a magnet link." -msgstr "Etkinleştirildiyse, Tigertree kök hash değerleri indirme sırasında keşfedilebilir. Aksi takdirde TTH değerleri sadece kullanıcı tarafından mesela bir magnet bağlantısı yoluyla girildiğinde kabul edilir." +msgid "" +"If set to TRUE the tigertree root hash (TTH) can be discovered on the fly. " +"Otherwise, the TTH is only accepted if provided by the user, for example, by " +"a magnet link." +msgstr "" +"Etkinleştirildiyse, Tigertree kök hash değerleri indirme sırasında " +"keşfedilebilir. Aksi takdirde TTH değerleri sadece kullanıcı tarafından " +"mesela bir magnet bağlantısı vasıtasıyla girildiğinde kabul edilir." -msgid "If set to TRUE, gtk-gnutella will turn on some hacks which, unfortunately, have to exist at all. The aim is to improve the overall downloading experience." -msgstr "Seçildiğinde, gtk-gnutella maalesef bazen kullanılması gereken bazı numararaları etkinleştirecektir. Bunun amacı genel indirme deneyimini iyileştirmektir." +msgid "" +"If set to TRUE, gtk-gnutella will turn on some hacks which, unfortunately, " +"have to exist at all. The aim is to improve the overall downloading " +"experience." +msgstr "" +"Seçildiğinde, gtk-gnutella maalesef bazen kullanılması gereken bazı " +"numararaları etkinleştirecektir. Bunun amacı genel indirme deneyimini " +"iyileştirmektir." msgid "Maximum number of hosts in the G2 node cache." -msgstr "G2 düğüm arabelleğindeki azami bilgisayar sayısı." +msgstr "G2 düğüm arabelleğindeki azami makine sayısı." msgid "Maximum time before removing hosts from the G2 cache." -msgstr "Bilgisayarları G2 arabelleğinden kaldırmadan önce beklenecek azami süre." +msgstr "" +"Bilgisayarları G2 arabelleğinden kaldırmadan önce beklenecek azami süre." msgid "Debug level for management of G2-only hosts." msgstr "Salt G2 düğümleri yönetimi için hata ayıklama seviyesi." -msgid "Whether GTKG can switch among the several files waiting to be downloaded from a given server, when making a follow-up HTTP request. Turn it off only if you witness problems with a particular servent you're downloading from." -msgstr "İndirme sırasında HTTP isteğinde bulunurken GTKG'nin belli bir sunucudan indirilen dosyalar arasında geçiş yapıp yapamayacağını belirler. Belli bir sunucu-istemciden indirme yaparken sorunla karşılamadığınız sürece devre dışı bırakınız." +msgid "" +"Whether GTKG can switch among the several files waiting to be downloaded " +"from a given server, when making a follow-up HTTP request. Turn it off only " +"if you witness problems with a particular servent you're downloading from." +msgstr "" +"İndirme sırasında HTTP isteğinde bulunurken GTKG'nin belli bir sunucudan " +"indirilen dosyalar arasında geçiş yapıp yapamayacağını belirler. Belli bir " +"sunucu-istemciden indirme yaparken sorunla karşılamadığınız sürece devre " +"dışı bırakınız." -msgid "If set to TRUE, PARQ (Passive/Active Remote Queuing) is enabled. Do not disable unless you know what you are doing." -msgstr "Seçildiğinde, PARQ (Passive/Active Remote Queuing - Pasif/Aktif uzakta kuyruğa ekleme) etkinleştirilir. Ne yaptığınızdan emin değilseniz devre dışı bırakmayın." +msgid "" +"If set to TRUE, PARQ (Passive/Active Remote Queuing) is enabled. Do not " +"disable unless you know what you are doing." +msgstr "" +"Seçildiğinde, PARQ (Passive/Active Remote Queuing - Pasif/Aktif uzakta " +"kuyruğa ekleme) etkinleştirilir. Ne yaptığınızdan emin değilseniz devre dışı " +"bırakmayın." -msgid "When partial file sharing (PFSP) is enabled, gtk-gnutella will strive to download chunks in a random order, to maximize the spreading of the file in the network. However, this may make pre-viewing of the file impossible as some file formats make use of a trailer to hold meta-information or seeking indices. GTKG will attempt to download the specified amount of data at the tail of the file as soon as possible. Set it to 0 to disable any tail-downloading preference." -msgstr "Tamamlanmamış dosya paylaşımı (partial file sharing (PFSP)) etkinleştirildiğinde, dosyaların şebekede dağılımını arttırmak için gtk-gnutella parçaları rastgele sırayla indirmeye çalışır. Ancak bu, sonlarında indeks ya da metaveri bulunan bazı dosya biçimleri için önizleme yapılmasını engeller. GTKG belirtilen veri miktarını dosyanın sonundan mümkün olan en erken vakitte indirmeye çalışacaktır. Dosya sonundan veri indirimi tercihini devre dışı bırakmak için 0 değerini seçiniz." +msgid "" +"When partial file sharing (PFSP) is enabled, gtk-gnutella will strive to " +"download chunks in a random order, to maximize the spreading of the file in " +"the network. However, this may make pre-viewing of the file impossible as " +"some file formats make use of a trailer to hold meta-information or seeking " +"indices. GTKG will attempt to download the specified amount of data at the " +"tail of the file as soon as possible. Set it to 0 to disable any tail-" +"downloading preference." +msgstr "" +"Tamamlanmamış dosya paylaşımı (partial file sharing (PFSP)) " +"etkinleştirildiğinde, dosyaların şebekede dağılımını arttırmak için gtk-" +"gnutella parçaları rastgele sırayla indirmeye çalışır. Ancak bu, sonlarında " +"indeks ya da metaveri bulunan bazı dosya biçimleri için önizleme yapılmasını " +"engeller. GTKG belirtilen veri miktarını dosyanın sonundan mümkün olan en " +"erken vakitte indirmeye çalışacaktır. Dosya sonundan veri indirimi tercihini " +"devre dışı bırakmak için 0 değerini seçiniz." -msgid "Whether GTKG should post-process filenames to remove consecutive '_' in the name, or extra '_' surrounding punctuation for instance, to make the name prettier." -msgstr "GTKG'nin dosya isimlerininin daha okunaklı olmaları için mesela ardışık, noktalama işaretlerinden önceki ya da bunları izleyen '_' karakterlerini kaldırıp kaldırmayacağını ayarlar." +msgid "" +"Whether GTKG should post-process filenames to remove consecutive '_' in the " +"name, or extra '_' surrounding punctuation for instance, to make the name " +"prettier." +msgstr "" +"GTKG'nin dosya isimlerininin daha okunaklı olmaları için mesela ardışık, " +"noktalama işaretlerinden önceki ya da bunları izleyen '_' karakterlerini " +"kaldırıp kaldırmayacağını ayarlar." -msgid "Whether the Distributed Hash Table (DHT) should be enabled. The DHT allows you to resolve magnet: URIs and to easily locate alternate locations for files and push-proxies for firewalled hosts. It requires UDP support." -msgstr "Dağıtılmış Hash Tablosunun (DHT) etkinleştirilip etkinleştirilmeyeceğini belirler. DHT magnet: bağlantılarını (URİ) çözümlemenize ve dosyalar için alternatif konumlar ile güvenlik duvarı arkasında bulunan bilgisayarlar için itme vekilleri bulmanıza olanak sağlar. UDP desteği gerektirir." +msgid "" +"Whether the Distributed Hash Table (DHT) should be enabled. The DHT allows " +"you to resolve magnet: URIs and to easily locate alternate locations for " +"files and push-proxies for firewalled hosts. It requires UDP support." +msgstr "" +"Dağıtılmış Hash Tablosunun (DHT) etkinleştirilip etkinleştirilmeyeceğini " +"belirler. DHT magnet: bağlantılarını (URİ) çözümlemenize ve dosyalar için " +"alternatif konumlar ile güvenlik duvarı arkasında bulunan bilgisayarlar için " +"itme vekilleri bulmanıza olanak sağlar. UDP desteği gerektirir." msgid "Debug level for the callout queue." msgstr "Bekleyen çağrılar kuyruğu için hata ayıklama seviyesi." @@ -1969,17 +4155,55 @@ msgid "Debug level for DHT key/value publishing." msgstr "DHT anahtar/değer yayını için hata ayıklama seviyesi." -msgid "Bandwidth hint for DHT user lookups, in bytes/sec. This is used both for limiting concurrent publishing and searching. Traffic is made on the Gnutella UDP socket. Output needs are lower than input (between 3 to 5 times less). The larger the numbers, the more values can be looked up concurrently, but the more bandwidth is used." -msgstr "DHT kullanıcıların aramaları için bant genişliği önerisi, bayt/saniye olarak. Bu hem eşzamanlı aramaları hem de eşzamanlı yayınları sınırlamak için kullanılır. Trafik Gnutella UDP soketinde yer alır. Çıkış gereksinimleri giriş gereksinimlerinden düşüktür (3 ilâ 5 kez). Bu rakam ne kadar yüksekse o denli çok değer eşzamanlı olarak aranabilir, ancak bu durumda daha fazla bant genişliği kullanılır." +msgid "" +"Bandwidth hint for DHT user lookups, in bytes/sec. This is used both for " +"limiting concurrent publishing and searching. Traffic is made on the " +"Gnutella UDP socket. Output needs are lower than input (between 3 to 5 times " +"less). The larger the numbers, the more values can be looked up " +"concurrently, but the more bandwidth is used." +msgstr "" +"DHT kullanıcıların aramaları için bant genişliği önerisi, bayt/saniye " +"olarak. Bu hem eşzamanlı aramaları hem de eşzamanlı yayınları sınırlamak " +"için kullanılır. Trafik Gnutella UDP soketinde yer alır. Çıkış " +"gereksinimleri giriş gereksinimlerinden düşüktür (3 ilâ 5 kez). Bu rakam ne " +"kadar yüksekse o denli çok değer eşzamanlı olarak aranabilir, ancak bu " +"durumda daha fazla bant genişliği kullanılır." -msgid "Bandwidth hint for DHT user lookups, in bytes/sec. This is used both for limiting concurrent publishing and searching. Traffic is made on the Gnutella UDP socket and cannot therefore be truly controlled. Input needs are much larger than output as far as lookups are concerned (between 3 to 5 times). The larger the numbers the more values can be looked up concurrently, but the more bandwidth is used." -msgstr "DHT kullanıcıların aramaları için bant genişliği önerisi, bayt/saniye olarak. Bu hem eşzamanlı aramaları hem de eşzamanlı yayınları sınırlamak için kullanılır. Trafik Gnutella UDP soketinde yer alır ve dolayısıyla gerçekten yönetilemez. Giriş gereksinimleri çıkış gereksinimlerinden çok daha yüksektir (3 ilâ 5 kez). Bu rakam ne kadar yüksekse o denli çok değer eşzamanlı olarak aranabilir, ancak bu durumda daha fazla bant genişliği kullanılır." +msgid "" +"Bandwidth hint for DHT user lookups, in bytes/sec. This is used both for " +"limiting concurrent publishing and searching. Traffic is made on the " +"Gnutella UDP socket and cannot therefore be truly controlled. Input needs " +"are much larger than output as far as lookups are concerned (between 3 to 5 " +"times). The larger the numbers the more values can be looked up " +"concurrently, but the more bandwidth is used." +msgstr "" +"DHT kullanıcıların aramaları için bant genişliği önerisi, bayt/saniye " +"olarak. Bu hem eşzamanlı aramaları hem de eşzamanlı yayınları sınırlamak " +"için kullanılır. Trafik Gnutella UDP soketinde yer alır ve dolayısıyla " +"gerçekten yönetilemez. Giriş gereksinimleri çıkış gereksinimlerinden çok " +"daha yüksektir (3 ilâ 5 kez). Bu rakam ne kadar yüksekse o denli çok değer " +"eşzamanlı olarak aranabilir, ancak bu durumda daha fazla bant genişliği " +"kullanılır." -msgid "Whether the GUID should be kept accross sessions. A sticky GUID can be helpful if you are firewalled and share files because the downloaders will be able to contact you again more easily when you come back online." -msgstr "GUİD'nin bir oturumdan diğerine tutulup tutulmayacağını ayarlar. Bir güvenlik duvarı tarafından engelleniyorsanız ve dosya paylaşıyorsanız aynı GUİD'yi tutmanız yararlı olacaktır çünkü böylece sizden indirme yapanlar tekrar çevrimiçine geldiğinizde sizinle daha kolay iletişime geçebilirler." +msgid "" +"Whether the GUID should be kept accross sessions. A sticky GUID can be " +"helpful if you are firewalled and share files because the downloaders will " +"be able to contact you again more easily when you come back online." +msgstr "" +"GUİD'nin bir oturumdan diğerine tutulup tutulmayacağını ayarlar. Bir " +"güvenlik duvarı tarafından engelleniyorsanız ve dosya paylaşıyorsanız aynı " +"GUİD'yi tutmanız yararlı olacaktır çünkü böylece sizden indirme yapanlar " +"tekrar çevrimiçine geldiğinizde sizinle daha kolay iletişime geçebilirler." -msgid "Whether the KUID should be kept accross sessions. A sticky KUID is helpful for the DHT because it promotes routing table stability and ensures that closest nodes will keep mutual knowledge about each other" -msgstr "KUİD'nin bir oturumdan diğerine tutulup tutulmayacağını ayarlar. Tutulan bir KUİD DHT için yararlıdır çünkü yönlendirme tablosunun kararlılığını destekler ve en yakın düğümlerin birbirleri hakkında verileri korumalarını sağlar." +msgid "" +"Whether the KUID should be kept accross sessions. A sticky KUID is helpful " +"for the DHT because it promotes routing table stability and ensures that " +"closest nodes will keep mutual knowledge about each other" +msgstr "" +"KUİD'nin bir oturumdan diğerine tutulup tutulmayacağını ayarlar. Tutulan bir " +"KUİD DHT için yararlıdır çünkü yönlendirme tablosunun kararlılığını " +"destekler ve en yakın düğümlerin birbirleri hakkında verileri korumalarını " +"sağlar." msgid "Debug level for the DHT user lookup queue." msgstr "DHT kullanıcı aramaları kuyruğu için hata ayıklama seviyesi." @@ -1999,23 +4223,39 @@ msgid "Defines which push-proxy HTTP header exchanges should be traced." msgstr "Hangi itme vekili HTTP başlık alışverişlerinin izleneceğini tanımlar." -msgid "Defines which HTTP header exchanges should be traced, other than downloads, uploads and push-proxy exchanges." -msgstr "İndirmeler, göndermeler ve itme vekili alışverişleri dışında hangi HTTP başlık alışverişlerinin izleneceğini tanımlar." +msgid "" +"Defines which HTTP header exchanges should be traced, other than downloads, " +"uploads and push-proxy exchanges." +msgstr "" +"İndirmeler, göndermeler ve itme vekili alışverişleri dışında hangi HTTP " +"başlık alışverişlerinin izleneceğini tanımlar." msgid "Debug level for (generic) file verification code." msgstr "(Jenerik) dosya doğrulama kodu için hata ayıklama seviyesi." -msgid "Maximum number of hosts in the local address cache, which remembers the recent IP:port combinations we had." -msgstr "İP:port kombinasyonlarımızı hatırlayan yerel adres arabelleğindeki azami bilgisayar sayısı." +msgid "" +"Maximum number of hosts in the local address cache, which remembers the " +"recent IP:port combinations we had." +msgstr "" +"İP:port kombinasyonlarımızı hatırlayan yerel adres arabelleğindeki azami " +"makine sayısı." -msgid "Maximum time before removing hosts from the local address cache, which remembers the recent IP:port combinations we had." -msgstr "Son kullandığımız İP:port kombinasyonlarını içeren yerel arabellekten bilgisayarları çıkarmadan önce beklenecek azami süre. " +msgid "" +"Maximum time before removing hosts from the local address cache, which " +"remembers the recent IP:port combinations we had." +msgstr "" +"Son kullandığımız İP:port kombinasyonlarını içeren yerel arabellekten " +"bilgisayarları çıkarmadan önce beklenecek azami süre." msgid "Debug level for management of local address cache." msgstr "Yerel adres arabelleği yönetimi için hata ayıklama seviyesi." -msgid "If enabled, all packets enqueued for transmission are dumped to $GTK_GNUTELLA_DIR/packets_tx.dump." -msgstr "Seçiliyse, aktarım için kuyruğa konan tüm paketler $GTK_GNUTELLA_DIR/packets_tx.dump konumuna kopyalanır." +msgid "" +"If enabled, all packets enqueued for transmission are dumped to " +"$GTK_GNUTELLA_DIR/packets_tx.dump." +msgstr "" +"Seçiliyse, aktarım için kuyruğa konan tüm paketler $GTK_GNUTELLA_DIR/" +"packets_tx.dump konumuna kopyalanır." msgid "Debug level the TCP message queues" msgstr "TCP mesaj kuyrukları için hata ayıklama seviyesi" @@ -2023,8 +4263,12 @@ msgid "Debug level for the UDP message queue." msgstr "UDP mesaj kuyrukları için hata ayıklama seviyesi." -msgid "Maximum size of the UDP message queue (in bytes). Must be at least 150 percent of the maximum message size." -msgstr "UDP mesaj kuyruğunun azami boyutu (bayt olarak). Azami mesaj boyutunun yüzde 150'sine denk gelmesi gerekir. " +msgid "" +"Maximum size of the UDP message queue (in bytes). Must be at least 150 " +"percent of the maximum message size." +msgstr "" +"UDP mesaj kuyruğunun azami boyutu (bayt olarak). Azami mesaj boyutunun yüzde " +"150'sine denk gelmesi gerekir." msgid "Debug level for the management of the clock accuracy." msgstr "Saat hassasiyeti yönetimi için hata ayıklama seviyesi." @@ -2039,12 +4283,24 @@ msgstr "DHT kök düğümlerinin arabelleğe alınması hata ayıklama seviyesi." msgid "Logged statistics level for code shared between GUI and core." -msgstr "GUİ ve çekirdek arasında paylaşılan kod hakkındaki kütükte tutulan istatistiklerin seviyesi." +msgstr "" +"GUİ ve çekirdek arasında paylaşılan kod hakkındaki kütükte tutulan " +"istatistiklerin seviyesi." -# Marked as fuzzy apparently because poedit returns "format specifications in 'msgid' and 'msgstr' for argument 1 are not the same" due to the % sign. -#, fuzzy, c-format -msgid "If TRUE, the spam SHA1 database is kept in memory. If FALSE, it is kept in a fast disk database, which saves a large amount of core memory and reduces the overall footprint, at the cost of an increased I/O level. However, the DB cache has typically a 90% hit rate, so the actual overhead is barely noticeable when running as an ultra node and should remain completely unnoticed when running as a leaf." -msgstr "Eğer DOĞRU ise spam SHA1 veritabanı bellekte tutulur. YANLIŞ ise hızlı disk veritabanında tutulur, ki bu İ/O (girdi/çıktı) oranını arttırır ama aynı zamanda bellek kullanımının düşürülmesine izin verir. Bununla beraber veritabanının erişim oranı yüzde 90 civarı olduğundan hafızada tutulmasının yarattığı ek yük ultra düğüm kipinde farkına varılması zor, yaprak kipinde ise farkına varılmayacak denli küçüktür." +msgid "" +"If TRUE, the spam SHA1 database is kept in memory. If FALSE, it is kept in a " +"fast disk database, which saves a large amount of core memory and reduces " +"the overall footprint, at the cost of an increased I/O level. However, the " +"DB cache has a 90 percent hit rate, so the actual overhead is barely " +"noticeable when running as an ultra node and should remain completely " +"unnoticed when running as a leaf." +msgstr "" +"Eğer DOĞRU ise spam SHA1 veritabanı bellekte tutulur. YANLIŞ ise hızlı disk " +"veritabanında tutulur, ki bu İ/O (girdi/çıktı) oranını arttırır ama aynı " +"zamanda bellek kullanımının düşürülmesine izin verir. Bununla beraber " +"veritabanının erişim oranı yüzde 90 civarı olduğundan hafızada tutulmasının " +"yarattığı ek yük ultra düğüm kipinde farkına varılması zor, yaprak kipinde " +"ise farkına varılmayacak denli küçüktür." msgid "Debug level for spam detection." msgstr "Spam tespiti için hata ayıklama seviyesi." @@ -2056,13 +4312,26 @@ msgstr "Bölge tabanlı bellek ayırıcısı için hata ayıklama seviyesi." msgid "Debug level for the pool-based memory allocator." -msgstr "Önayrımlı nesnelere dayalı bellek ayırıcısı için hata ayıklama seviyesi." +msgstr "" +"Önayrımlı nesnelere dayalı bellek ayırıcısı için hata ayıklama seviyesi." msgid "Debug level for the RX buffer allocator." msgstr "RX tampon ayırıcısı için hata ayıklama seviyesi." -msgid "Whether the zone-based memory allocator should always keep the zones in garbage-collecting mode, thereby maximizing the chances of being able to quickly reclaim empty zones after an allocation burst. This causes a slight CPU overhead at block free time but the memory footprint will remain much lower. To further minimize the footprint, you can also set spam_lut_in_memory to FALSE." -msgstr "Bölge tabanlı bellek ayırıcısının, hızlı bir ayırma yükselmesi sonrası boş bölgeleri geri kazanma şansını maksimize etmek için bölgeleri çöp toplama (garbage collecting) kipinde tutup tutmayacağını ayarlar. Bu blok boşalması durumunda hafif bir CPU yüküne neden olur ancak bellek kullanımı düşük kalacaktır. Bellek kullanımını daha da düşürmek için spam_lut_in_memory ayarını devre dışı bırakabilirsiniz." +msgid "" +"Whether the zone-based memory allocator should always keep the zones in " +"garbage-collecting mode, thereby maximizing the chances of being able to " +"quickly reclaim empty zones after an allocation burst. This causes a slight " +"CPU overhead at block free time but the memory footprint will remain much " +"lower. To further minimize the footprint, you can also set " +"spam_lut_in_memory to FALSE." +msgstr "" +"Bölge tabanlı bellek ayırıcısının, hızlı bir ayırma yükselmesi sonrası boş " +"bölgeleri geri kazanma şansını maksimize etmek için bölgeleri çöp toplama " +"(garbage collecting) kipinde tutup tutmayacağını ayarlar. Bu blok boşalması " +"durumunda hafif bir CPU yüküne neden olur ancak bellek kullanımı düşük " +"kalacaktır. Bellek kullanımını daha da düşürmek için spam_lut_in_memory " +"ayarını devre dışı bırakabilirsiniz." msgid "Debug level for the virtual memory manager." msgstr "Sanal bellek yöneticisi için hata ayıklama seviyesi." @@ -2092,10 +4361,18 @@ msgstr "Hangi DHT mesajlarının izleneceğini tanımlar." msgid "Enable bandwidth limitation for outgoing DHT traffic." -msgstr "Dışarıya giden DHT trafiği için bant genişliği sınırlamasını etkinleştir." +msgstr "" +"Dışarıya giden DHT trafiği için bant genişliği sınırlamasını etkinleştir." -msgid "Bandwidth limit for outgoing DHT traffic in bytes/sec. It is always pooled with the Gnutella UDP queue, regardless of whether bandwidth stealing is enabled, so that UDP queues can flush more quickly." -msgstr "Dışarıya giden DHT trafiği için bant genişliği sınırı, bayt/saniye olarak. Bu, trafik bant genişliği çalınmasının etkin durumda olup olmadığına bakılmaksızın daima Gnutella UDP kuyruğuyla birleştirilir, böylece UDP kuyrukları daha çabuk boşalabilir." +msgid "" +"Bandwidth limit for outgoing DHT traffic in bytes/sec. It is always pooled " +"with the Gnutella UDP queue, regardless of whether bandwidth stealing is " +"enabled, so that UDP queues can flush more quickly." +msgstr "" +"Dışarıya giden DHT trafiği için bant genişliği sınırı, bayt/saniye olarak. " +"Bu, trafik bant genişliği çalınmasının etkin durumda olup olmadığına " +"bakılmaksızın daima Gnutella UDP kuyruğuyla birleştirilir, böylece UDP " +"kuyrukları daha çabuk boşalabilir." msgid "Maximum size of the DHT message queue (in bytes)." msgstr "DHT mesaj kuyruğunun azami boyutu (bayt olarak)." @@ -2113,7 +4390,7 @@ msgstr "Dosya sistemleri arası dosya taşımaları için hata ayıklama seviyesi." msgid "Debug level for query hit message generation." -msgstr "Sorgu denkleşme mesajları oluşturumu için hata ayıklama seviyesi." +msgstr "Sorgu isabeti mesajları oluşturumu için hata ayıklama seviyesi." msgid "Debug level for version management." msgstr "Sürüm yönetimi için hata ayıklama seviyesi." @@ -2127,17 +4404,32 @@ msgid "DHT bootstrap status." msgstr "DHT önbaşlama durumu." -msgid "The DHT running mode. An active node will be able to store values and is a fully participating member of the Distributed Hash Table. A passive node can perform lookups and publish but will not store values and cannot be a member of the DHT structure. A firewalled node is necessarily passive, but you can force the passive mode even if you are not firewalled, although that is not recommended because the DHT requires far more active nodes that passive ones to be efficient." -msgstr "DHT'nin çalışma kipi. Aktif bir düğüm değerleri hatırlayabilir ve Dağıtılmış Hash Tablosuna tam üyedir. Pasif bir düğüm aramalarda ve yayınlamalarda bulunabilir ancak değerleri hafızaya alamaz ve DHT yapısının üyesi olamaz. Güvenlik duvarı tarafından engellenen bir düğüm zorunlu olarak pasiftir ancak güvenlik duvarı arkasında olmasanız bile pasif kipini zorlayabilirsiniz. Bununla beraber pasif kipini zorlamanız önerilmez çünkü DHT'nin verimli olabilmesi için pasif düğümlerden çok daha yüksek sayıda aktif düğüme ihtiyacı vardır." +msgid "" +"The DHT running mode. An active node will be able to store values and is a " +"fully participating member of the Distributed Hash Table. A passive node can " +"perform lookups and publish but will not store values and cannot be a member " +"of the DHT structure. A firewalled node is necessarily passive, but you can " +"force the passive mode even if you are not firewalled, although that is not " +"recommended because the DHT requires far more active nodes that passive ones " +"to be efficient." +msgstr "" +"DHT'nin çalışma kipi. Aktif bir düğüm değerleri hatırlayabilir ve Dağıtılmış " +"Hash Tablosuna tam üyedir. Pasif bir düğüm aramalarda ve yayınlamalarda " +"bulunabilir ancak değerleri hafızaya alamaz ve DHT yapısının üyesi olamaz. " +"Güvenlik duvarı tarafından engellenen bir düğüm zorunlu olarak pasiftir " +"ancak güvenlik duvarı arkasında olmasanız bile pasif kipini " +"zorlayabilirsiniz. Bununla beraber pasif kipini zorlamanız önerilmez çünkü " +"DHT'nin verimli olabilmesi için pasif düğümlerden çok daha yüksek sayıda " +"aktif düğüme ihtiyacı vardır." msgid "Current DHT running mode." -msgstr "Şu andaki DHT çalışma kipi" +msgstr "Şu andaki DHT çalışma kipi." msgid "Debug level for the one-time memory allocator." msgstr "Bir kerelik bellek ayırıcısı için hata ayıklama seviyesi." msgid "Debug level for the host cache." -msgstr "Bilgisayar arabelleği için hata ayıklama seviyesi." +msgstr "Makine arabelleği için hata ayıklama seviyesi." msgid "Random bits." msgstr "Rastgele bitler." @@ -2163,29 +4455,75 @@ msgid "Defines SOAP exchanges tracing type." msgstr "SOAP alış verişleri izleme türünü tanımlar." -msgid "For testing purposes, allow to run as an ultranode even if the node cannot accept incoming TCP connections." -msgstr "Deneme amaçlı olarak, içeriye gelen TCP bağlantıları kabul edilemese bile ultra düğüm olarak çalışmasına izin ver." +msgid "" +"For testing purposes, allow to run as an ultranode even if the node cannot " +"accept incoming TCP connections." +msgstr "" +"Deneme amaçlı olarak, içeriye gelen TCP bağlantıları kabul edilemese bile " +"ultra düğüm olarak çalışmasına izin ver." -msgid "Whether UPnP (Universal Plug and Play) should be enabled. Support for UPnP means gtk-gnutella will be able to discover your Internet Gateway Device (router) and request that the listening port be opened and redirected to your machine, thereby auto-configuring to make sure you are not firewalled. By default you should leave it enabled unless you know how to configure your network equipment manually to prevent the firewalled condition for both TCP and UDP." -msgstr "UPnP'nin (Universal Plug and Play) etkinleştirilip etkinleştirilmeyeceğini ayarlar. UPnP desteği, gtk-gnutella'nın İnternet Geçit Cihazınızı (yönlendiricinizi) keşfedebilmesi ve dinlenen portun açılıp bilgisayarınıza yönlendirilmesi, yani cihazın sizin bir güvenlik duvarı tarafından engellenmeyeceğiniz şekilde otomatik olarak yapılandırılması anlamına gelir. TCP ve UDP açısından bir güvenlik duvarı tarafından engellenmemek için şebeke cihazınızı elle yapılandırmayı bilmiyorsanız, UPnP'yi etkin kılmanız önerilir." +msgid "" +"Whether UPnP (Universal Plug and Play) should be enabled. Support for UPnP " +"means gtk-gnutella will be able to discover your Internet Gateway Device " +"(router) and request that the listening port be opened and redirected to " +"your machine, thereby auto-configuring to make sure you are not firewalled. " +"By default you should leave it enabled unless you know how to configure your " +"network equipment manually to prevent the firewalled condition for both TCP " +"and UDP." +msgstr "" +"UPnP'nin (Universal Plug and Play) etkinleştirilip etkinleştirilmeyeceğini " +"ayarlar. UPnP desteği, gtk-gnutella'nın İnternet Geçit Cihazınızı " +"(yönlendiricinizi) keşfedebilmesi ve dinlenen portun açılıp bilgisayarınıza " +"yönlendirilmesi, yani cihazın sizin bir güvenlik duvarı tarafından " +"engellenmeyeceğiniz şekilde otomatik olarak yapılandırılması anlamına gelir. " +"TCP ve UDP açısından bir güvenlik duvarı tarafından engellenmemek için " +"şebeke cihazınızı elle yapılandırmayı bilmiyorsanız, UPnP'yi etkin kılmanız " +"önerilir." -msgid "Whether gtk-gnutella was able to locate an Internet Gateway Device to install port mappings, if required." -msgstr "gtk-gnutella'nın port haritalamasını kurmak için bir İnternet Geçit Cihazı (mesela bir yönlendirici) tespit edip etmediğini gösterir." +msgid "" +"Whether gtk-gnutella was able to locate an Internet Gateway Device to " +"install port mappings, if required." +msgstr "" +"gtk-gnutella'nın port haritalamasını kurmak için bir İnternet Geçit Cihazı " +"(mesela bir yönlendirici) tespit edip etmediğini gösterir." -msgid "Whether gtk-gnutella thinks it needs to install port mappings on your network router to avoid the firewalled condition." -msgstr "gtk-gnutella'nın güvenlik duvarı tarafından engellenmemek için yönlendiricinizde port haritalama kurmaya gerek görüp görmediğini gösterir." +msgid "" +"Whether gtk-gnutella thinks it needs to install port mappings on your " +"network router to avoid the firewalled condition." +msgstr "" +"gtk-gnutella'nın güvenlik duvarı tarafından engellenmemek için " +"yönlendiricinizde port haritalama kurmaya gerek görüp görmediğini gösterir." msgid "Whether gtk-gnutella can install port mappings, if needed." -msgstr "gtk-gnutella'nın gerekirse port haritalamayı kurup kuramayacağını gösterir." +msgstr "" +"gtk-gnutella'nın gerekirse port haritalamayı kurup kuramayacağını gösterir." msgid "Debug level for the NAT-PMP layer." msgstr "NAT-PMP katmanı için hata ayıklama seviyesi." -msgid "Whether NAT-PMP (NAT Port Mapping Protocol) should be enabled. Support for NAT-PMP means gtk-gnutella will be able to look whether your default gateway (router) supports the Port Mapping Protocol to allow transparent redirection of the external ports on the router to the local machine, thereby making sure you are not firewalled. By default you should leave it enabled unless you know how to configure your network equipment manually to prevent the firewalled condition for both TCP and UDP." -msgstr "NAT-PMP'nin (NAT Port Mapping Protocol) etkinleştirilip etkinleştirilmeyeceğini ayarlar. NAT-PMP desteği bir güvenlik duvarının sizi engellememesi amacıyla gtk-gnutella'nın, yönlendiricinizin harici portların yerel makinenize aktarılması için port haritalama protokolünü destekleyip desteklemediğini görebileceği anlamına gelir. TCP ve UDP açısından bir güvenlik duvarı tarafından engellenmemek için şebeke cihazınızı elle yapılandırmayı bilmiyorsanız, bu şıkkı etkin bırakmanız önerilir." +msgid "" +"Whether NAT-PMP (NAT Port Mapping Protocol) should be enabled. Support for " +"NAT-PMP means gtk-gnutella will be able to look whether your default gateway " +"(router) supports the Port Mapping Protocol to allow transparent redirection " +"of the external ports on the router to the local machine, thereby making " +"sure you are not firewalled. By default you should leave it enabled unless " +"you know how to configure your network equipment manually to prevent the " +"firewalled condition for both TCP and UDP." +msgstr "" +"NAT-PMP'nin (NAT Port Mapping Protocol) etkinleştirilip " +"etkinleştirilmeyeceğini ayarlar. NAT-PMP desteği bir güvenlik duvarının sizi " +"engellememesi amacıyla gtk-gnutella'nın, yönlendiricinizin harici portların " +"yerel makinenize aktarılması için port haritalama protokolünü destekleyip " +"desteklemediğini görebileceği anlamına gelir. TCP ve UDP açısından bir " +"güvenlik duvarı tarafından engellenmemek için şebeke cihazınızı elle " +"yapılandırmayı bilmiyorsanız, bu şıkkı etkin bırakmanız önerilir." -msgid "Whether gtk-gnutella was able to locate a NAT-PMP gateway to install port mappings, if required." -msgstr "gtk-gnutella'nın gerekirse port haritalamasını kurmak için kullanabileceği bir NAT-PMP geçidi bulup bulamadığını gösterir." +msgid "" +"Whether gtk-gnutella was able to locate a NAT-PMP gateway to install port " +"mappings, if required." +msgstr "" +"gtk-gnutella'nın gerekirse port haritalamasını kurmak için kullanabileceği " +"bir NAT-PMP geçidi bulup bulamadığını gösterir." msgid "Debug level for the TX (transmit) network layer." msgstr "TX (gönderme) ağ katmanı için hata ayıklama seviyesi." @@ -2200,31 +4538,69 @@ msgstr "Arka plan görev zamanlayıcısı için hata ayıklama seviyesi." msgid "Whether gtk-gnutella was able to configure port mappings." -msgstr "gtk-gnutella'nın port haritalamasını yapılandırıp yapılandıramadığını gösterir." +msgstr "" +"gtk-gnutella'nın port haritalamasını yapılandırıp yapılandıramadığını " +"gösterir." msgid "Whether gtk-gnutella disabled HTTP bandwidth stealing." -msgstr "gtk-gnutella'nın HTTP bant genişliği çalmasını devre dışı bırakıp bırakmadığını gösterir." +msgstr "" +"gtk-gnutella'nın HTTP bant genişliği çalmasını devre dışı bırakıp " +"bırakmadığını gösterir." msgid "Whether gtk-gnutella ignores HTTP stolen bandwidth." -msgstr "gtk-gnutella'nın çalınan HTTP bant genişliğini görmezden geldiğini gösterir." +msgstr "" +"gtk-gnutella'nın çalınan HTTP bant genişliğini görmezden geldiğini gösterir." msgid "Whether gtk-gnutella enforces uniform HTTP outgoing bandwidth." -msgstr "gtk-gnutella'nın dışarıya giden HTTP bant genişliğini tekdüze olmaya zorladığını gösterir." +msgstr "" +"gtk-gnutella'nın dışarıya giden HTTP bant genişliğini tekdüze olmaya " +"zorladığını gösterir." -msgid "Whether gtk-gnutella should use HTTP request pipelining when possible, in order to decrease downloading latency." -msgstr "gtk-gnutella'nın indirme gecikmelerini azaltmak için HTTP isteklerinin uç uca eklenmesini mümkün olduğu zaman bunun etkinleştirip etkinleştirmeyeceğini belirler." +msgid "" +"Whether gtk-gnutella should use HTTP request pipelining when possible, in " +"order to decrease downloading latency." +msgstr "" +"gtk-gnutella'nın indirme gecikmelerini azaltmak için HTTP isteklerinin uç " +"uca eklenmesinin mümkün olduğunda etkinleştirip etkinleştirmeyeceğini " +"belirler." msgid "Maximum chunk size when swarming with HTTP pipelining." msgstr "Uç uca isteklerle çoklu indirmelerde azami parça boyutu." -msgid "Whether the Gnutella UDP Extension for Scalable Searches (GUESS) should be enabled. With GUESS enabled, gtk-gnutella offers the network the ability to perform iterative Ultrapeer queries instead of just broadcasting, allowing searches to more places within the Gnutella network. If you want gtk-gnutella to issue GUESS queries, you need to make sure the client-side is enabled as well as this setting only governs mostly the server-side of GUESS (required to allow the client-side)." -msgstr "Gnutella ölçeklenebilir aramalar için UDP uzantısının (Gnutella UDP Extension for Scalable Searches (GUESS)) etkinleştirilip etkinleştirilmeyeceğini ayarlar. GUESS, gtk-gnutella'nın sorguları sadece yayınlamak yerine yinelemeli olarak ultraeşlere yollamasına ve dolayısıyla Gnutella ağında daha geniş arama yapmasına imkân verir. gtk-gnutella'nın GUESS sorguları yollamasını istiyorsanız istemci tarafının da etkinleştirildiğinden emin olmanız gerekir çünkü bu ayar en çok sunucu tarafını kapsar (ki bu istemci tarafının etkinleştirilebilmesi için lâzımdır)." +msgid "" +"Whether the Gnutella UDP Extension for Scalable Searches (GUESS) should be " +"enabled. With GUESS enabled, gtk-gnutella offers the network the ability to " +"perform iterative Ultrapeer queries instead of just broadcasting, allowing " +"searches to more places within the Gnutella network. If you want gtk-" +"gnutella to issue GUESS queries, you need to make sure the client-side is " +"enabled as well as this setting only governs mostly the server-side of GUESS " +"(required to allow the client-side)." +msgstr "" +"Gnutella ölçeklenebilir aramalar için UDP uzantısının (Gnutella UDP " +"Extension for Scalable Searches (GUESS)) etkinleştirilip " +"etkinleştirilmeyeceğini ayarlar. GUESS, gtk-gnutella'nın sorguları sadece " +"yayınlamak yerine yinelemeli olarak ultraeşlere yollamasına ve dolayısıyla " +"Gnutella ağında daha geniş arama yapmasına imkân verir. gtk-gnutella'nın " +"GUESS sorguları yollamasını istiyorsanız istemci tarafının da " +"etkinleştirildiğinden emin olmanız gerekir çünkü bu ayar en çok sunucu " +"tarafını kapsar (ki bu istemci tarafının etkinleştirilebilmesi için " +"lâzımdır)." -msgid "Debug level for server-side GUESS (Gnutella UDP Extension for Scalable Searches)." -msgstr "Sunucu tarafı GUESS (Gnutella UDP Extension for Scalable Searches - ölçeklenebilir aramalar için Gnutella UDP uzantısı) için hata ayıklama seviyesi." +msgid "" +"Debug level for server-side GUESS (Gnutella UDP Extension for Scalable " +"Searches)." +msgstr "" +"Sunucu tarafı GUESS (Gnutella UDP Extension for Scalable Searches - " +"ölçeklenebilir aramalar için Gnutella UDP uzantısı) için hata ayıklama " +"seviyesi." -msgid "Debug level for client-side GUESS (Gnutella UDP Extension for Scalable Searches)." -msgstr "İstemci tarafı GUESS (Gnutella UDP Extension for Scalable Searches - ölçeklenebilir aramalar için Gnutella UDP uzantısı) için hata ayıklama seviyesi." +msgid "" +"Debug level for client-side GUESS (Gnutella UDP Extension for Scalable " +"Searches)." +msgstr "" +"İstemci tarafı GUESS (Gnutella UDP Extension for Scalable Searches - " +"ölçeklenebilir aramalar için Gnutella UDP uzantısı) için hata ayıklama " +"seviyesi." msgid "Maximum number of IPv4 hosts in the regular GUESS cache." msgstr "Normal GUESS düğümleri arabelleğindeki azami İPv4 bilgisayar sayısı." @@ -2241,17 +4617,48 @@ msgid "Debug level for the DB disk/RAM storage layer." msgstr "RAM/disk üzerinde saklatım katmanı için hata ayıklama seviyesi." -msgid "The current Session ID. This is a unique ID generated each time gtk-gnutella starts and it can be monitored from the shell interface to check whether gtk-gnutella has been restarted since the last check." -msgstr "Şimdiki oturumun kimliği (İD). Bu eşsiz İD gtk-gnutella'nın her başlayışında oluşturulur ve kabuk (shell) arayüzünden gtk-gnutella'nın son denetlemeden beri tekrar başlatılıp başlatılmadığını izlemek için kullanılabilir." +msgid "" +"The current Session ID. This is a unique ID generated each time gtk-" +"gnutella starts and it can be monitored from the shell interface to check " +"whether gtk-gnutella has been restarted since the last check." +msgstr "" +"Şimdiki oturumun kimliği (İD). Bu eşsiz İD gtk-gnutella'nın her başlayışında " +"oluşturulur ve kabuk (shell) arayüzünden gtk-gnutella'nın son denetlemeden " +"beri tekrar başlatılıp başlatılmadığını izlemek için kullanılabilir." -msgid "Whether gtk-gnutella should serve partial files which are rare on the network to increase their spreading rate. It is good for the health of the network to always leave this enabled. This setting supersedes the disabling of global partial file sharing for rare files only." -msgstr "gtk-gnutella'nın nadir sayılan tamamlanmamış dosyaları dağılımlarını arttırmak için paylaşıp paylaşmayacağını belirler. Şebekenin sağlığı için bunu daima etkin bırakmak en iyisidir. Bu seçenek, tamamlanmamış dosyaların paylaşımının devre dışı bırakılması genel ayarını sadece nadir dosyalar için görmezden gelir." +msgid "" +"Whether gtk-gnutella should serve partial files which are rare on the " +"network to increase their spreading rate. It is good for the health of the " +"network to always leave this enabled. This setting supersedes the disabling " +"of global partial file sharing for rare files only." +msgstr "" +"gtk-gnutella'nın nadir sayılan tamamlanmamış dosyaları dağılımlarını " +"arttırmak için paylaşıp paylaşmayacağını belirler. Şebekenin sağlığı için " +"bunu daima etkin bırakmak en iyisidir. Bu seçenek, tamamlanmamış dosyaların " +"paylaşımının devre dışı bırakılması genel ayarını sadece nadir dosyalar için " +"görmezden gelir." -msgid "Whether the Gnutella UDP Extension for Scalable Searches (GUESS) client side should be enabled, so that gtk-gnutella can indeed issue iterative Ultrapeer queries instead of just broadcasting them. If enabled, it requires general GUESS support enabled as well or it will simply be ignored." -msgstr "Gnutella ölçeklenebilir aramalar için UDP uzantısının (Gnutella UDP Extension for Scalable Searches (GUESS)) istemci tarafında etkinleştirilip etkinleştirilmeyeceğini ayarlar. GUESS, gtk-gnutella'nın sorguları sadece yayınlamak yerine yinelemeli olarak ultraeşlere yollamasına imkân verir. Seçildiyse genel GUESS desteğinin de etkinleştirilmiş olması gerekir, yoksa bu ayar görmezden gelinecektir." +msgid "" +"Whether the Gnutella UDP Extension for Scalable Searches (GUESS) client side " +"should be enabled, so that gtk-gnutella can indeed issue iterative Ultrapeer " +"queries instead of just broadcasting them. If enabled, it requires general " +"GUESS support enabled as well or it will simply be ignored." +msgstr "" +"Gnutella ölçeklenebilir aramalar için UDP uzantısının (Gnutella UDP " +"Extension for Scalable Searches (GUESS)) istemci tarafında etkinleştirilip " +"etkinleştirilmeyeceğini ayarlar. GUESS, gtk-gnutella'nın sorguları sadece " +"yayınlamak yerine yinelemeli olarak ultraeşlere yollamasına imkân verir. " +"Seçildiyse genel GUESS desteğinin de etkinleştirilmiş olması gerekir, yoksa " +"bu ayar görmezden gelinecektir." -msgid "Bandwidth hint for GUESS querying, in bytes/sec, limiting the amount of concurrency that can be used for GUESS. Lower numbers mean slower querying overall" -msgstr "GUESS sorgulamaları için bant genişliği önerisi, bayt/saniye olarak, ki bu GUESS sorgularının eşzamanlılığını sınırlar. Düşük değerler daha yavaş sorgulama anlamına gelir." +msgid "" +"Bandwidth hint for GUESS querying, in bytes/sec, limiting the amount of " +"concurrency that can be used for GUESS. Lower numbers mean slower querying " +"overall" +msgstr "" +"GUESS sorgulamaları için bant genişliği önerisi, bayt/saniye olarak, ki bu " +"GUESS sorgularının eşzamanlılığını sınırlar. Düşük değerler daha yavaş " +"sorgulama anlamına gelir." msgid "Debug level for the matching code." msgstr "Denkleşme kodu için hata ayıklama seviyesi." @@ -2259,17 +4666,34 @@ msgid "Debug level for the time synchronization code." msgstr "Zaman senkronizasyon kodu için hata ayıklama seviyesi." -msgid "Whether queries can request partial results hits, i.e. files which are incompletely available on remote hosts." -msgstr "Sorguların diğer bilgisayarlardaki tamamlanmamış dosyaları isteyip isteyemeyeceğini belirler." +msgid "" +"Whether queries can request partial results hits, i.e. files which are " +"incompletely available on remote hosts." +msgstr "" +"Sorguların diğer bilgisayarlardaki tamamlanmamış dosyaları isteyip " +"isteyemeyeceğini belirler." -msgid "Whether queries for partial files should be answered to.When Partial File Sharing is disabled this setting is of course ignored and no partial results are returned." -msgstr "Tamamlanmamış dosyalar için sorgulara cevap verilip verilmeyeceğini belirler. Tamamlanmamış Dosya Paylaşımı devre dışı bırakıldığında bu ayar tabii ki görmezden gelinecek ve hiçbir tamamlanmamış dosya cevabı yollanmayacaktır." +msgid "" +"Whether queries for partial files should be answered to.When Partial File " +"Sharing is disabled this setting is of course ignored and no partial results " +"are returned." +msgstr "" +"Tamamlanmamış dosyalar için sorgulara cevap verilip verilmeyeceğini " +"belirler. Tamamlanmamış Dosya Paylaşımı devre dışı bırakıldığında bu ayar " +"tabii ki görmezden gelinecek ve hiçbir tamamlanmamış dosya cevabı " +"yollanmayacaktır." msgid "Whether what's-new? queries should be answered to." msgstr "Yeni olanlar sorgularının cevaplanıp cevaplanmayacağı." -msgid "When set, gtk-gnutella will automatically stop opened searches from which all the requested downloads have been completed, regardless of the initially configured expiration time." -msgstr "Seçildiğinde, gtk-gnutella istenilen tüm indirmeleri tamamlanan açık aramaları, başlangıçta belirlenen geçerlilik süresini dikkate almadan durduracaktır." +msgid "" +"When set, gtk-gnutella will automatically stop opened searches from which " +"all the requested downloads have been completed, regardless of the initially " +"configured expiration time." +msgstr "" +"Seçildiğinde, gtk-gnutella istenilen tüm indirmeleri tamamlanan açık " +"aramaları, başlangıçta belirlenen geçerlilik süresini dikkate almadan " +"durduracaktır." msgid "Maximum number of results to show in a What's New? request." msgstr "Yeni olanlar isteklerinde gösterilecek azami sonuç sayısı." @@ -2278,25 +4702,38 @@ msgstr "Pasif arama isteklerinde gösterilecek azami sonuç sayısı." msgid "Whether to log duplicate Gnutella messages from same node." -msgstr "Aynı düğümden gelen çift Gnutella mesajları için kütük tutulup tutulmayacağını ayarlar." +msgstr "" +"Aynı düğümden gelen çift Gnutella mesajları için kütük tutulup " +"tutulmayacağını ayarlar." msgid "Whether to log duplicate Gnutella messages with a higher TTL." -msgstr "Daha yüksek TTL'li çift Gnutella mesajları için kütük tutulup tutulmayacağını ayarlar." +msgstr "" +"Daha yüksek TTL'li çift Gnutella mesajları için kütük tutulup " +"tutulmayacağını ayarlar." msgid "Whether to log duplicate Gnutella messages (not from same node)." -msgstr "(Aynı düğümden olmayan) çift Gnutella mesajları için kütük tutulup tutulmayacağını ayarlar." +msgstr "" +"(Aynı düğümden olmayan) çift Gnutella mesajları için kütük tutulup " +"tutulmayacağını ayarlar." msgid "Whether to log new Gnutella messages, never seen before." -msgstr "Daha önce hiç görülmemiş olan yeni Gnutella mesajları için kütük tutulup tutulmayacağını ayarlar." +msgstr "" +"Daha önce hiç görülmemiş olan yeni Gnutella mesajları için kütük tutulup " +"tutulmayacağını ayarlar." msgid "Whether to log Gnutella routing decisions." -msgstr "Gnutella yönlendirme kararları için kütük tutulup tutulmayacağını ayarlar." +msgstr "" +"Gnutella yönlendirme kararları için kütük tutulup tutulmayacağını ayarlar." msgid "Whether to log bad Gnutella messages, corrupted or unexpected." -msgstr "Kötü (bozuk veya beklenmeyen) Gnutella mesajları için kütük tutulup tutulmayacağını ayarlar." +msgstr "" +"Kötü (bozuk veya beklenmedik) Gnutella mesajları için kütük tutulup " +"tutulmayacağını ayarlar." msgid "Whether to log conditions triggering query hit spam flagging." -msgstr "Sorgu denkleşme mesajlarını spam olarak işaretleyen koşullar için kütük tutulup tutulmayacağını ayarlar." +msgstr "" +"Sorgu isabeti mesajlarını spam olarak işaretleyen koşullar için kütük " +"tutulup tutulmayacağını ayarlar." msgid "Maximum number of IPv6 hosts in the ultra node cache." msgstr "Ultra düğüm arabelleğindeki azami İPv6 bilgisayar sayısı." @@ -2320,91 +4757,229 @@ msgstr "malloc() değiştirme ayırıcısı için hata ayıklama seviyesi." msgid "Debug level for bad query hit messages." -msgstr "Kötü sorgu denkleşme mesajları için hata ayıklama seviyesi." +msgstr "Kötü sorgu isabeti mesajları için hata ayıklama seviyesi." msgid "Debug level for GUID management." msgstr "GUİD yönetimi için hata ayıklama seviyesi." -msgid "disable" -msgstr "devre dışı" +msgid "Debug level for the TX (transmit) deflating network layer." +msgstr "TX (göndermeleri) sıkıştırma ağ katmanı için hata ayıklama seviyesi." -msgid "by words" -msgstr "sözcüklere dayalı" +msgid "Comma-separated list of TX debugging hosts (IP addresses only)" +msgstr "" +"TX hata ayıklama makinelerinin virgülle ayırılmış listesi (sadece İP " +"adresleri)" -msgid "by whole query" -msgstr "tüm sorguya dayalı" +msgid "" +"Comma-separated list of hosts for whom we want to dump RX traffic (IP " +"addresses only)" +msgstr "" +"RX trafiğinin dökümünü istediğimiz makinelerin virgülle ayırılmış listesi " +"(sadece İP adresleri)" -msgid "by router" -msgstr "yönlendiriciye dayalı" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they emit " +"(IP addresses only)" +msgstr "" +"Gönderdikleri TX trafiğinin dökümünü istediğimiz makinelerin virgülle " +"ayırılmış listesi (sadece İP adresleri)" -msgid "TCP & UDP" -msgstr "TCP & UDP" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they " +"receive (IP addresses only)" +msgstr "" +"Aldıkları TX trafiğinin dökümünü istediğimiz makinelerin virgülle ayırılmış " +"listesi (sadece İP adresleri)" -msgid "TCP only" -msgstr "Salt TCP" +msgid "" +"Allow GUESS to use some of the unused Gnutella outgoing bandwidth regardless " +"of the GUESS bandwidth hint. If FALSE, only the configured bandwidth hint " +"will be used. When running as a leaf this should be set to TRUE to make " +"GUESS queries run faster." +msgstr "" +"GUESS'in dışarıya giden ancak kullanılmayan Gnutella trafiğinin bir kısmını " +"GUESS bant genişliği değerini görnezden gelerek kullanmasına izin ver. " +"Seçilmediyse, sadece ayarlanan bant genişliği kullanılacaktır. Bu şık, " +"yaprak kipinde GUESS sorgularının daha çabuk işlemesi için seçilmelidir." -msgid "UDP only" -msgstr "Salt UDP" +msgid "Debug level for the UDP TX scheduler." +msgstr "UDP TX programlayıcısı için hata ayıklama seviyesi." -msgid "Ping" -msgstr "Ping" +msgid "" +"Debugging flags for the semi-reliable UDP TX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: transmissions, 16: timeouts." +msgstr "" +"Yarı güvenilir UDP TX katmanı için hata ayıklama bayrakları: 1: mesajlar, 2: " +"parçalar, 4: teyitler, 8: iletimler, 16: zaman aşımları." -msgid "Pong" -msgstr "Pong" +msgid "Comma-separated list of RX debugging hosts (IP addresses only)" +msgstr "" +"RX hata ayıklama makinelerinin virgülle ayırılmış listesi (sadece İP " +"adresleri)" -msgid "Bye" -msgstr "Bye (Hoşçakal)" +msgid "" +"Debugging flags for the semi-reliable UDP RX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: receptions, 16: timeouts." +msgstr "" +"Yarı güvenilir UDP RX katmanı için hata ayıklama bayrakları: 1: mesajlar, 2: " +"parçalar, 4: teyitler, 8: iletimler, 16: zaman aşımları." -msgid "QRP" -msgstr "QRP" +msgid "Whether to log sent semi-reliable UDP messages." +msgstr "" +"Gönderilen yarı güvenli UDP mesajları için kütük tutulup tutulmayacağını " +"ayarlar." -msgid "HSEP" -msgstr "HSEP" +msgid "Whether to log received semi-reliable UDP messages." +msgstr "" +"Alınan yarı güvenli UDP mesajları için kütük tutulup tutulmayacağını ayarlar." -msgid "RUDP" -msgstr "RUDP" +msgid "Debug level for the secured OOB query hit claiming." +msgstr "Güvenli OOB sorgu isabeti talepleri için hata ayıklama seviyesi." -msgid "Vendor spec." -msgstr "Özel sağlayıcı" +msgid "Whether to log sent vendor messages." +msgstr "" +"Gönderilen uygulama sağlayıcı mesajları için kütük tutulup tutulmayacağını " +"ayarlar." -msgid "Vendor std." -msgstr "Standart sağlayıcı" +msgid "Whether to log received vendor messages." +msgstr "" +"Alınan uygulama sağlayıcı mesajları için kütük tutulup tutulmayacağını " +"ayarlar." -msgid "Push" -msgstr "İtme" +msgid "Debugging flags for the DHT token cache (developers only)." +msgstr "" +"DHT jetonları arabelleği için hata ayıklama bayrakları (sadece " +"geliştiriciler için)." -msgid "Query" -msgstr "Sorgu" +msgid "Whether to log weird DHT message headers when debugging." +msgstr "" +"Garip DHT mesaj başlıkları için hata ayıklama yapılırken kütük tutulup " +"tutulmayacağını ayarlar." -msgid "Query Hit" -msgstr "Sorgu denkleşmesi" +msgid "Debug level for the DHT Remote Procedure Call (RPC) code." +msgstr "DHT Remote Procedure Call (RPC) kodu için hata ayıklama seviyesi." -msgid "DHT Ping" -msgstr "DHT Ping'i" +msgid "Whether to log UHC pings we receive." +msgstr "Aldığımız UHC pingleri için kütük tutulup tutulmayacağını ayarlar." -msgid "DHT Pong" -msgstr "DHT pong'u" +msgid "Whether to log UHC pings we emit." +msgstr "Yollanan UHC pingleri için kütük tutulup tutulmayacağını ayarlar." -msgid "DHT Store" -msgstr "DHT'ye yazma" +msgid "Whether the program was properly shutdown." +msgstr "Programın düzgün kapatılıp kapatılmadığı." -msgid "DHT Store Ack" -msgstr "DHT'ye yazma cevabı" +msgid "Whether the program restarted after a clean shutdown." +msgstr "Programın düzgün kapatılma ardından tekrar başlatılıp başlatılmadığı." -msgid "DHT Find Node" -msgstr "DHT düğüm araması" +msgid "Debug level for DHT key management." +msgstr "DHT anahtar yönetimi için hata ayıklama seviyesi." -msgid "DHT Found Node" -msgstr "Bulunan DHT düğümleri" +msgid "Debug level for DHT value management." +msgstr "DHT değer yönetimi için hata ayıklama seviyesi." -msgid "DHT Find Value" -msgstr "DHT değer araması" +msgid "ID of the current process." +msgstr "Güncel sürecin kimliği." -msgid "DHT Value" -msgstr "DHT Değeri" +msgid "Debug level for HTTP range parsing / handling." +msgstr "HTTP alan analizi / yönetimi için hata ayıklama seviyesi" -msgid "Total" -msgstr "Toplam" +msgid "" +"Lease time when installing port mappings via UPnP or NAT-PMP, in seconds. A " +"value of 0 requests permanent mappings." +msgstr "" +"UPnP veya NAT-PMP ile port haritalamasının kurulmasında saniye olarak kira " +"süresi. 0 değeri daimi haritalama talep eder." + +msgid "Whether the program is auto-restarting at the user's request." +msgstr "" +"Programın kullanıcının isteği doğrultusunda otomatik olarak tekrar başlayıp " +"başlamayacağını belirler." + +msgid "Debug level for time management." +msgstr "Zaman yönetimi için hata ayıklama seviyesi" + +msgid "Debug level for the tmalloc() thread-magazine object distributor." +msgstr "" +"Her iş parçacığına özel nesne dağıtıcı tmalloc() için hata ayıklama seviyesi." + +msgid "Debug level for the event queue thread." +msgstr "Olay kuyruğu iş parçacığı için hata ayıklama seviyesi." + +msgid "Maximum number of G2 hubs in the hub cache." +msgstr "Hub arabelleğindeki azami G2 hub sayısı." + +msgid "Current number of IPv4 hosts in the G2 hub caches." +msgstr "G2 hub arabelleğindeki güncel İPv4 makine sayısı." + +msgid "Whether the G2 protocol should be enabled." +msgstr "G2 protokolünün etkinleştirilip etkinleştirilmeyeceğini ayarlar." + +msgid "Number of G2 nodes currently connected." +msgstr "Güncel olarak bağlı bulunduğumuz G2 hubları sayısı." + +msgid "Maximum amount of G2 hubs we should connect to as a leaf." +msgstr "Yaprak olarak bağlanacağımız azami G2 hub sayısı." + +msgid "Whether to log bad G2 messages, corrupted or unexpected." +msgstr "" +"Kötü, yani beklenmedik ya da bozuk G2 mesajlarının kütüğünün tutulup " +"tutulmayacağı." + +msgid "Whether to log dropped G2 messages" +msgstr "Görmezden gelinen G2 mesajlarının kütüğünün tutulup tutulmayacağı" + +msgid "Debug level for the G2 RPC layer." +msgstr "G2 RPC katmanı için hata ayıklama seviyesi." + +msgid "Whether to log summary of received query hits" +msgstr "Alınan sorgu isabetlerinin özetlerinin kütüğünün tutulup tutulmayacağı" + +msgid "Whether to log summary of each record in received query hits" +msgstr "" +"Alınan sorgu isabetlerinde her kaydın özetinin kütüğünün tutulup " +"tutulmayacağı" + +msgid "Number of G2 browsing requests received in this session." +msgstr "Bu oturumda alınan G2 tarama taleplerinin sayısı." + +msgid "Number of G2 browsing requests fully served in this session." +msgstr "Bu oturumda tamamen yanıtlanan G2 tarama taleplerinin sayısı." + +msgid "Whether to log G2 messages we're attempting to send" +msgstr "Yollamayı denediğimiz G2 mesajlarının kütüğünün tutulup tutulmayacağı" + +msgid "" +"Timestamp at which the current session was started. This stamp remains " +"unchanged when gtk-gnutella restarts after a crash or an explicit restart " +"request." +msgstr "" + +msgid "No TCP listening socket bound to allow incoming connections." +msgstr "" + +msgid "disable" +msgstr "devre dışı" + +msgid "by words" +msgstr "sözcüklere dayalı" + +msgid "by whole query" +msgstr "tüm sorguya dayalı" + +msgid "by router" +msgstr "yönlendiriciye dayalı" + +msgid "TCP & UDP" +msgstr "TCP & UDP" + +msgid "TCP only" +msgstr "Salt TCP" + +msgid "UDP only" +msgstr "Salt UDP" + +msgid "Query Hit" +msgstr "Sorgu isabeti" msgid "Icons" msgstr "Simge" @@ -2445,8 +5020,12 @@ msgid "Maximum number of queries visible in search monitor." msgstr "Arama izleyicisinde görüntülenecek azami sorgu sayısı." -msgid "Whether to hide hits that have been considered for auto-downloading based on the SHA1 or your filters." -msgstr "SHA1 ya da filtrelerinize dayanarak otomatik indirmeler için dikkate alınan denkleşmelerin saklanıp saklanmayacağını belirler." +msgid "" +"Whether to hide hits that have been considered for auto-downloading based on " +"the SHA1 or your filters." +msgstr "" +"SHA1 ya da filtrelerinize dayanarak otomatik indirmeler için dikkate alınan " +"isabetlerin saklanıp saklanmayacağını belirler." msgid "Widths of the columns in the nodes table." msgstr "Düğümler tablosundaki sütunların genişliği." @@ -2467,7 +5046,7 @@ msgstr "Kenar çubuğundaki arama listesinde sütunların genişliği." msgid "Which columns are visible in the search results tables." -msgstr "Arama sonuçları tablosunda hangi sütunların görüntüleneceği" +msgstr "Arama sonuçları tablosunda hangi sütunların görüntüleneceği." msgid "Widths of the columns in the search results tables." msgstr "Arama sonuçları tablosundaki sütunların genişliği." @@ -2479,7 +5058,8 @@ msgstr "Göndermeler istatistikleri tablosundaki sütunların genişliği." msgid "Which columns are visible in the upload stats table." -msgstr "Göndermeler istatistikleri tablosunda hangi sütunların görüntüleneceği." +msgstr "" +"Göndermeler istatistikleri tablosunda hangi sütunların görüntüleneceği." msgid "Widths of the columns in the uploads table." msgstr "Göndermeler tablosundaki sütunların genişliği." @@ -2578,10 +5158,11 @@ msgstr "İçeriye gelen Gnutella yaprak bant genişliği kullanımını göster." msgid "Display outgoing Gnet leaf traffic bandwidth usage." -msgstr "Dışarıya giden Gnutella yaprak bant genişliği kullanımını göster" +msgstr "Dışarıya giden Gnutella yaprak bant genişliği kullanımını göster." msgid "Automatically hide leaf bandwidth display when not in ultrapeer mode." -msgstr "Ultraeş olmadığımızda yaprak bant genişliği kullanımını otomatik sakla." +msgstr "" +"Ultraeş olmadığımızda yaprak bant genişliği kullanımını otomatik sakla." msgid "Display incoming HTTP traffic bandwidth average." msgstr "İçeriye gelen HTTP bant genişliği ortalamasını göster." @@ -2625,8 +5206,12 @@ msgid "Interval in which the search stats are updated." msgstr "Arama istatistiklerini tazeleme aralığı." -msgid "A deletion coefficient, so that small non-significant results can be dropped. The lower it is, the more search statistics will be kept in memory." -msgstr "Küçük, anlamı olmayan sonuçların atılması için silme katsayısı. Bu katsayı ne kadar küçükse bellekte tutulacak istatistikler o kadar artacaktır." +msgid "" +"A deletion coefficient, so that small non-significant results can be " +"dropped. The lower it is, the more search statistics will be kept in memory." +msgstr "" +"Küçük, anlamı olmayan sonuçların atılması için silme katsayısı. Bu katsayı " +"ne kadar küçükse bellekte tutulacak istatistikler o kadar artacaktır." msgid "Show confirmation dialog when leaving gtk-gnutella." msgstr "gtk-gnutella'dan çıkarken onaylama diyaloğu göster." @@ -2634,8 +5219,12 @@ msgid "Show a helpful message when the mouse pointer lingers over a widget." msgstr "Fare imleci bir unsurun üzerinde tutulduğunda yardımcı mesaj göster." -msgid "Show a lot more settings to tweak. If you tamper with them be sure to read up on what they are doing." -msgstr "Değiştirilebilecek daha fazla seçenek göster. Bunları değiştirirseniz ne yaptığınızı bilmeniz gerekir." +msgid "" +"Show a lot more settings to tweak. If you tamper with them be sure to read " +"up on what they are doing." +msgstr "" +"Değiştirilebilecek daha fazla seçenek göster. Bunları değiştirirseniz ne " +"yaptığınızı bilmeniz gerekir." msgid "Show percentages instead of absolute values in the Gnet stats." msgstr "Gnutella istatistiklerinde mutlak değerler yerine yüzdeleri göster." @@ -2655,8 +5244,11 @@ msgid "Include Gnutella packet header size to the volume." msgstr "Gnutella paket başlıklarının boyutunu hacme ekle." -msgid "Show percentages instead of absolute values in the Gnet stats (drop reasons)." -msgstr "Gnutella istatistiklerinde (atma nedenleri) mutlak değerler yerine yüzdeleri göster." +msgid "" +"Show percentages instead of absolute values in the Gnet stats (drop reasons)." +msgstr "" +"Gnutella istatistiklerinde (atma nedenleri) mutlak değerler yerine yüzdeleri " +"göster." msgid "Widths of the columns in the Gnet stats general table." msgstr "Gnutella istatistikleri tablosundaki sütunların genişliği." @@ -2667,26 +5259,44 @@ msgid "Auto clear failed uploads." msgstr "Başarısız göndermeleri otomatik temizle." -msgid "Whether the node's uptime should be shown (not all nodes provide this information)." -msgstr "Düğümün çalışma süresinin gösterilip gösterilmeyeceğini ayarlar (tüm düğümler bu veriyi iletmez)." +msgid "" +"Whether the node's uptime should be shown (not all nodes provide this " +"information)." +msgstr "" +"Düğümün çalışma süresinin gösterilip gösterilmeyeceğini ayarlar (tüm " +"düğümler bu veriyi iletmez)." msgid "Whether the handshaking version number should be displayed." -msgstr "Bağlantı anlaşması versiyon numarasının gösterilip gösterilmeyeceğini ayarlar." +msgstr "" +"Bağlantı anlaşması versiyon numarasının gösterilip gösterilmeyeceğini " +"ayarlar." -msgid "Whether detailed traffic information should be shown for the node. When enabled, it is possible to also customize how much information to display. When disabled, only TX and RX message counts are displayed, followed by the message queue info." -msgstr "Düğüm için ayrıntılı trafik verilerinin gösterilip gösterilmeyeceğini belirler. Etkinleştirildiğinde, gösterilecek veri miktarını ayarlamak mümkündür. Devre dışı bırakıldığında sadece mesaj kuyruğu verileri ile TX ve RX mesaj sayıları gösterilir." +msgid "" +"Whether detailed traffic information should be shown for the node. When " +"enabled, it is possible to also customize how much information to display. " +"When disabled, only TX and RX message counts are displayed, followed by the " +"message queue info." +msgstr "" +"Düğüm için ayrıntılı trafik verilerinin gösterilip gösterilmeyeceğini " +"belirler. Etkinleştirildiğinde, gösterilecek veri miktarını ayarlamak " +"mümkündür. Devre dışı bırakıldığında sadece mesaj kuyruğu verileri ile TX ve " +"RX mesaj sayıları gösterilir." msgid "Whether TX traffic compression ratio should be displayed." -msgstr "TX trafiğinin sıkıştırılma oranının gösterilip gösterilmeyeceğini ayarlar." +msgstr "" +"TX trafiğinin sıkıştırılma oranının gösterilip gösterilmeyeceğini ayarlar." msgid "Whether RX traffic compression ratio should be displayed." -msgstr "RX trafiğinin sıkıştırılma oranının gösterilip gösterilmeyeceğini ayarlar." +msgstr "" +"RX trafiğinin sıkıştırılma oranının gösterilip gösterilmeyeceğini ayarlar." msgid "Whether to display the amount of bytes sent on the TX wire." -msgstr "TX telinde gönderilen bayt miktarının gösterilip gösterilmeyeceğini ayarlar." +msgstr "" +"TX telinde gönderilen bayt miktarının gösterilip gösterilmeyeceğini ayarlar." msgid "Whether to display the amount of bytes received on the RX wire." -msgstr "RX telinde alınan bayt miktarının gösterilip gösterilmeyeceğini ayarlar." +msgstr "" +"RX telinde alınan bayt miktarının gösterilip gösterilmeyeceğini ayarlar." msgid "Whether TX instantaneous transmission speed should be displayed." msgstr "TX anlık aktarım hızının gösterilip gösterilmeyeceğini belirler." @@ -2695,67 +5305,123 @@ msgstr "RX anlık aktarım hızının gösterilip gösterilmeyeceğini belirler." msgid "Whether count of transmitted queries should be displayed." -msgstr "Başkalarına aktarılan sorguların gösterilip gösterilmeyeceğini ayarlar." +msgstr "" +"Başkalarına aktarılan sorguların gösterilip gösterilmeyeceğini ayarlar." msgid "Whether count of received queries should be displayed." msgstr "Alınan sorgu sayısının gösterilip gösterilmeyeceğini ayarlar." msgid "Whether count of transmitted query hits should be displayed." -msgstr "Aktarılan sorgu denkleşme sayısının gösterilip gösterilmeyeceğini belirler." +msgstr "" +"Aktarılan sorgu isabeti sayısının gösterilip gösterilmeyeceğini belirler." msgid "Whether count of received query hits should be displayed." -msgstr "Alınan sorgu denkleşme sayısının gösterilip gösterilmeyeceğini belirler." +msgstr "Alınan sorgu isabeti sayısının gösterilip gösterilmeyeceğini belirler." msgid "Whether count of locally generated queries should be displayed." -msgstr "Yerel olarak oluşturulan sorguların sayısının gösterilip gösterilmeyeceğini ayarlar." +msgstr "" +"Yerel olarak oluşturulan sorguların sayısının gösterilip gösterilmeyeceğini " +"ayarlar." -msgid "Whether count of local queries pending transmission should be displayed." -msgstr "Aktarılmayı bekleyen yerel sorguların sayısının gösterilip gösterilmeyeceğini ayarlar." +msgid "" +"Whether count of local queries pending transmission should be displayed." +msgstr "" +"Aktarılmayı bekleyen yerel sorguların sayısının gösterilip " +"gösterilmeyeceğini ayarlar." msgid "Whether count of dropped messages on TX should be displayed." -msgstr "TX'de (çöpe) atılan mesaj sayısının gösterilip gösterilmeyeceğini ayarlar." +msgstr "" +"TX'de (çöpe) atılan mesaj sayısının gösterilip gösterilmeyeceğini ayarlar." msgid "Whether count of dropped messages on RX should be displayed." -msgstr "RX'de (çöpe) atılan mesaj sayısının gösterilip gösterilmeyeceğini ayarlar." +msgstr "" +"RX'de (çöpe) atılan mesaj sayısının gösterilip gösterilmeyeceğini ayarlar." -msgid "Whether Query Routing Protocol statistics should be displayed. For a leaf node, this is simply the ratio of queries that generated a hit over the amount of received queries. For an ultrapeer, it displays the amount of slots in the QRP table, 'g' the generation number, 'f' the fill ratio, 't' the passing threshold and 'e' the efficiency, i.e. the proportion of received queries that are sent to the node after QRP table filtering." -msgstr "Sorgu yönetim protokolü (Query Routing Protocol) istatistiklerinin gösterilip gösterilmeyeceğini belirler. Bir yaprak düğümü için, bu sadece denkleşme yaratan sorguların toplam alınan sorgulara oranıdır. Bir ultraeş için, QRP tablosundaki olukların miktarını, 'g' nesil sayısını, 'f' dolma oranını, 't' sınır aşımını ve 'e' verimi, yani alındıktan sonra QRP tablosunda aracılığıyla süzülüp düğüme gönderilen sorguların oranını gösterir." +msgid "" +"Whether Query Routing Protocol statistics should be displayed. For a leaf " +"node, this is simply the ratio of queries that generated a hit over the " +"amount of received queries. For an ultrapeer, it displays the amount of " +"slots in the QRP table, 'g' the generation number, 'f' the fill ratio, 't' " +"the passing threshold and 'e' the efficiency, i.e. the proportion of " +"received queries that are sent to the node after QRP table filtering." +msgstr "" +"Sorgu yönetim protokolü (Query Routing Protocol) istatistiklerinin " +"gösterilip gösterilmeyeceğini belirler. Bir yaprak düğümü için, bu sadece " +"isabet yaratan sorguların toplam alınan sorgulara oranıdır. Bir ultraeş " +"için, QRP tablosundaki olukların miktarını, 'g' nesil sayısını, 'f' dolma " +"oranını, 't' sınır aşımını ve 'e' verimi, yani alındıktan sonra QRP " +"tablosunda aracılığıyla süzülüp düğüme gönderilen sorguların oranını " +"gösterir." -msgid "Whether we should display message counts for duplicate, bad, weird and messages bearing an hostile IP address." -msgstr "Çift, bozuk, garip ve kötücül İP adresi taşıyan mesajların sayısının gösterilip gösterilmeyeceğini ayarlar." +msgid "" +"Whether we should display message counts for duplicate, bad, weird and " +"messages bearing an hostile IP address." +msgstr "" +"Çift, bozuk, garip ve kötücül İP adresi taşıyan mesajların sayısının " +"gösterilip gösterilmeyeceğini ayarlar." -msgid "Whether ping/pong roundtrip times (average and last) should be displayed. Values shown are in milliseconds." -msgstr "Ping/pong (ortalama ve en son) geliş gidiş sürelerinin gösterilip gösterilmeyeceğini belirler. Değerler milisaniye olarak görüntülenir." +msgid "" +"Whether ping/pong roundtrip times (average and last) should be displayed. " +"Values shown are in milliseconds." +msgstr "" +"Ping/pong (ortalama ve en son) geliş gidiş sürelerinin gösterilip " +"gösterilmeyeceğini belirler. Değerler milisaniye olarak görüntülenir." -msgid "Whether we should display the size of the node's library, when it is known to us." -msgstr "Veri bulunduğunda diğer düğümün kütüphane boyutunun gösterilip gösterilmeyeceğini ayarlar." +msgid "" +"Whether we should display the size of the node's library, when it is known " +"to us." +msgstr "" +"Veri bulunduğunda diğer düğümün kütüphane boyutunun gösterilip " +"gösterilmeyeceğini ayarlar." -msgid "Whether we should display the amount of files shared by nodes, when that is known to us." -msgstr "Veri bulunduğunda düğümlerin paylaştığı dosya sayısının gösterilip gösterilmeyeceğini ayarlar." +msgid "" +"Whether we should display the amount of files shared by nodes, when that is " +"known to us." +msgstr "" +"Veri bulunduğunda düğümlerin paylaştığı dosya sayısının gösterilip " +"gösterilmeyeceğini ayarlar." -msgid "The amount of time in seconds that the GUI should buffer search results as they come in. This prevents too frequent updates that may cause flickering, but also saves CPU cycles since less redrawing has to occur in the search pane." -msgstr "Grafik arayüzün gelen sonuçları tampon bellekte tutma süresi, saniye olarak. Bu titremelere neden olabilen gereğinden sık güncellemeleri engeller, ayrıca arama panosunda daha az yeniden çizim olacağı için mikroişlemci yükünü de azaltır." +msgid "" +"The amount of time in seconds that the GUI should buffer search results as " +"they come in. This prevents too frequent updates that may cause flickering, " +"but also saves CPU cycles since less redrawing has to occur in the search " +"pane." +msgstr "" +"Grafik arayüzün gelen sonuçları tampon bellekte tutma süresi, saniye olarak. " +"Bu titremelere neden olabilen gereğinden sık güncellemeleri engeller, ayrıca " +"arama panosunda daha az yeniden çizim olacağı için mikroişlemci yükünü de " +"azaltır." msgid "Expanded stati of the nodes in the treemenu." msgstr "Menü ağacında düğümlerin durumlarını genişlet." msgid "Widths of the columns in the Gnet packet stats table (pkg). GTK2" -msgstr "Gnutella paket istatistikleri tablosundaki sütunların genişliği (pkg). GTK2" +msgstr "" +"Gnutella paket istatistikleri tablosundaki sütunların genişliği (pkg). GTK2" msgid "Widths of the columns in the Gnet packet stats table (byte). GTK2" -msgstr "Gnutella paket istatistikleri tablosundaki sütunların genişliği (bayt). GTK2" +msgstr "" +"Gnutella paket istatistikleri tablosundaki sütunların genişliği (bayt). " +"GTK2" msgid "Configures the appearance of the toolbar." msgstr "Araç çubuğunun görünümünü ayarlar." -msgid "The lifetime of a search. If this time is exceeded, the search is stopped." +msgid "" +"The lifetime of a search. If this time is exceeded, the search is stopped." msgstr "Aramanın ömrü. Bu süre geçilirse arama durdurulur." -msgid "Show a status icon in the system tray if possible (requires Gtk+ 2.10 or newer)." -msgstr "Mümkünse sistem çubuğunda durum ikonu göster (Gtk+ 2.10 ya da üzerini gerektirir)." +msgid "" +"Show a status icon in the system tray if possible (requires Gtk+ 2.10 or " +"newer)." +msgstr "" +"Mümkünse sistem çubuğunda durum ikonu göster (Gtk+ 2.10 ya da üzerini " +"gerektirir)." msgid "Automatically hide DHT bandwidth display when DHT not enabled." -msgstr "DHT etkinleştirilmediğinde, DHT bant genişliği gösterimini otomatik olarak sakla." +msgstr "" +"DHT etkinleştirilmediğinde, DHT bant genişliği gösterimini otomatik olarak " +"sakla." msgid "Display incoming DHT traffic bandwidth usage." msgstr "İçeriye gelen DHT bant genişliği trafiğini göster." @@ -2769,26 +5435,72 @@ msgid "Display outgoing DHT traffic bandwidth as an average." msgstr "Dışarıya giden DHT trafiği bant genişliğini ortalama olarak göster." -msgid "Remote nodes supporting media type filtering will apply your query specifically on their audio files." -msgstr "Dosya tipi filtrelemesini destekleyen diğer düğümler sorgunuzu ses dosyalarına uygulayacaktır." +msgid "" +"Remote nodes supporting media type filtering will apply your query " +"specifically on their audio files." +msgstr "" +"Dosya tipi filtrelemesini destekleyen diğer düğümler sorgunuzu ses " +"dosyalarına uygulayacaktır." -msgid "Remote nodes supporting media type filtering will apply your query specifically on their video files." -msgstr "Dosya tipi filtrelemesini destekleyen diğer düğümler sorgunuzu video dosyalarına uygulayacaktır." +msgid "" +"Remote nodes supporting media type filtering will apply your query " +"specifically on their video files." +msgstr "" +"Dosya tipi filtrelemesini destekleyen diğer düğümler sorgunuzu video " +"dosyalarına uygulayacaktır." -msgid "Remote nodes supporting media type filtering will apply your query specifically on their document files. Document files are XML, HTML, Word, PDF, etc..." -msgstr "Dosya tipi filtrelemesini destekleyen diğer düğümler sorgunuzu belge dosyalarına uygulayacaktır. Belge dosyaları XML, HTML, Word, PDF vb. dosyalardır." +msgid "" +"Remote nodes supporting media type filtering will apply your query " +"specifically on their document files. Document files are XML, HTML, Word, " +"PDF, etc..." +msgstr "" +"Dosya tipi filtrelemesini destekleyen diğer düğümler sorgunuzu belge " +"dosyalarına uygulayacaktır. Belge dosyaları XML, HTML, Word, PDF vb. " +"dosyalardır." -msgid "Remote nodes supporting media type filtering will apply your query specifically on their image files." -msgstr "Dosya tipi filtrelemesini destekleyen diğer düğümler sorgunuzu görsel dosyalarına uygulayacaktır." +msgid "" +"Remote nodes supporting media type filtering will apply your query " +"specifically on their image files." +msgstr "" +"Dosya tipi filtrelemesini destekleyen diğer düğümler sorgunuzu görsel " +"dosyalarına uygulayacaktır." -msgid "Remote nodes supporting media type filtering will apply your query specifically on archive / program files such as ZIP, 7z, tar, bz2, gz, dep, rpm and also exe files." -msgstr "Dosya tipi filtrelemesini destekleyen diğer düğümler sorgunuzu ZİP, 7z, tar, bz2, gz, deb, rpm ve exe gibi arşiv ve program dosyalarına uygulayacaktır." +msgid "" +"Remote nodes supporting media type filtering will apply your query " +"specifically on archive / program files such as ZIP, 7z, tar, bz2, gz, dep, " +"rpm and also exe files." +msgstr "" +"Dosya tipi filtrelemesini destekleyen diğer düğümler sorgunuzu ZİP, 7z, tar, " +"bz2, gz, deb, rpm ve exe gibi arşiv ve program dosyalarına uygulayacaktır." -msgid "Discard search results whith an alien IP address, not matching the one from which the results come from." -msgstr "Sonuçların geldiği adresle denkleşmeyen, yabancı İP adresi taşıyan arama sonuçlarını at." +msgid "" +"Discard search results with an alien IP address, not matching the one from " +"which the results come from." +msgstr "" +"Sonuçların geldiği adresle eşleşmeyen, yabancı İP adresi taşıyan arama " +"sonuçlarını at." -msgid "Whether session-only searches which happen to have pending downloads should be restarted when gtk-gnutella is launched." -msgstr "Bekleyen indirmeleri bulunan oturumla sınırlı aramaların gtk-gnutella başlatıldığında tekrar başlatılıp başlatılmayacaklarını ayarlar." +msgid "" +"Whether session-only searches which happen to have pending downloads should " +"be restarted when gtk-gnutella is launched." +msgstr "" +"Bekleyen indirmeleri bulunan oturumla sınırlı aramaların gtk-gnutella " +"başlatıldığında tekrar başlatılıp başlatılmayacaklarını ayarlar." + +msgid "Discard search results coming from servents with a banned GUID." +msgstr "Yasaklanmış GUİD'li istemcilerden gelen arama sonuçlarını at." + +msgid "Whether a summary line with GUESS search stats should be displayed." +msgstr "" +"GUESS arama istatistiklerini içeren bir özet satırının görüntülenip " +"görüntülenmeyeceğini belirler." + +msgid "" +"Whether the GUESS summary line should show total statistics or ones " +"pertaining to the current search only." +msgstr "" +"GUESS özet satırının toplam istatistikleri mi yoksa sadece güncel aramanın " +"istatistikerini mi göstereceğini belirler." msgid "Anonymizing proxies" msgstr "Anonimleştiren vekil sunucular" @@ -2877,6 +5589,9 @@ msgid "Benin" msgstr "Benin" +msgid "Saint Barthelemy" +msgstr "Saint Barthelemy" + msgid "Bermuda" msgstr "Bermuda Adaları" @@ -2886,6 +5601,9 @@ msgid "Bolivia" msgstr "Bolivya" +msgid "Bonaire, Sint Eustatius and Saba" +msgstr "Bonaire Adası, Statia ve Saba" + msgid "Brazil" msgstr "Brezilya" @@ -2895,6 +5613,9 @@ msgid "Bhutan" msgstr "Bhutan" +msgid "Burma" +msgstr "Myanmar" + msgid "Bouvet Island" msgstr "Bouvet Adası" @@ -2955,6 +5676,9 @@ msgid "Cape Verde" msgstr "Yeşil Burun Adaları" +msgid "Curacao" +msgstr "Curaçao" + msgid "Christmas Island" msgstr "Christmas Adası" @@ -3420,12 +6144,18 @@ msgid "Suriname" msgstr "Surinam" +msgid "South Sudan" +msgstr "Güney Sudan" + msgid "Sao Tome and Principe" msgstr "Sao Tome ve Principe" msgid "El Salvador" msgstr "El Salvador" +msgid "Sint Maarten" +msgstr "Saint Martin" + msgid "Syrian Arab Republic" msgstr "Suriye Arap Cumhuriyeti" @@ -3541,17 +6271,20 @@ msgstr "Zimbabve" msgid "MAGNET URI contained source URL for an unsupported protocol" -msgstr "MAGNET URİ'si desteklenmeyen bir protokol için bir kaynak URL'i içeriyordu" +msgstr "" +"MAGNET URİ'si desteklenmeyen bir protokol için bir kaynak URL'i içeriyordu" #, c-format msgid "%u Byte" msgid_plural "%u Bytes" msgstr0 "%u Bayt" +msgstr1 "%u Bayt" #, c-format msgid "%u Byte" msgid_plural "%u Bytes" msgstr0 "%u Bayt" +msgstr1 "%u Bayt" #, c-format msgid "%s (%s bytes)" @@ -3563,15 +6296,15 @@ #, c-format msgid "%ud %uh" -msgstr "%ud %uh" +msgstr "%ug %us" #, c-format msgid "%uh %um" -msgstr "%uh %um" +msgstr "%us %ud" #, c-format msgid "%um %us" -msgstr "%um %us" +msgstr "%ud %us" #, c-format msgid "%us" @@ -3627,8 +6360,16 @@ msgid "Interactive mode turned off." msgstr "Etkileşimli mod devre dışı." +#, c-format +msgid "Unknown operation \"show %s\"" +msgstr "Bilinmeyen işlem: \"show %s\"" + +#, c-format +msgid "Unknown operation \"%s\"" +msgstr "Bilinmeyen işlem: \"%s\"" + msgid "Cannot determine current working directory" -msgstr "Güncel çalışma dizini belirlenemedi" +msgstr "Güncel çalışma klasörü belirlenemedi" #, c-format msgid "Unknown logfile name \"%s\"" @@ -3642,18 +6383,14 @@ msgstr "Kütük dosyasının ismi \"%s\": %m olarak değiştirilemedi" #, c-format -msgid "Unknown operation \"%s\"" -msgstr "Bilinmeyen işlem: \"%s\"" - -#, c-format -msgid "Unknown operation \"show %s\"" -msgstr "Bilinmeyen işlem: \"show %s\"" - -#, c-format msgid "Unknown operation \"stats %s\"" msgstr "Bilinmeyen işlem: \"stats %s\"" #, c-format +msgid "Unknown operation \"check %s\"" +msgstr "Bilinmeyen işlem: \"check %s\"" + +#, c-format msgid "Unknown operation \"usage %s\"" msgstr "Bilinmeyen işlem: \"usage %s\"" @@ -3673,6 +6410,7 @@ msgid "Removed %u node" msgid_plural "Removed %u nodes" msgstr0 "%u düğümü kaldırıldı" +msgstr1 "%u düğümü kaldırıldı" msgid "Property missing" msgstr "Özellik eksik" @@ -3682,17 +6420,20 @@ msgstr "Bilinmeyen özellik \"%s\"" msgid "Value: " -msgstr "Değer:" +msgstr "Değer: " msgid "Value found and displayed" msgstr "Değer bulundu ve görüntülendi" msgid "No matching property." -msgstr "Denk gelen özellik yok" +msgstr "Denk gelen özellik yok." msgid "Good bye" msgstr "Hoşçakal" +msgid "Invalid command syntax" +msgstr "Geçersiz komut sözdizimi" + msgid "Query string missing" msgstr "Arama metni eksik" @@ -3711,6 +6452,9 @@ msgid "Value missing" msgstr "Değer eksik" +msgid "Property cannot be changed" +msgstr "" + #, c-format msgid "Previous value was %s" msgstr "Önceki değer şuydu: %s" @@ -3731,12 +6475,13 @@ msgid "unterminated single-quoted string" msgstr "sonlandırılmamış tek tırnaklı dize" -msgid "Invalid command syntax" -msgstr "Geçersiz komut sözdizimi" - msgid "too many arguments in command" msgstr "komutta çok fazla argüman" +#, c-format +msgid "un-parseable argument #%u in command" +msgstr "komutta ayrıştılamaz #%u argümanı" + msgid "Malformed command" msgstr "Yanlış yapılandırılmış komut" @@ -3745,49 +6490,7 @@ msgstr "Bilinmeyen komut: \"%s\"" msgid "Help: " -msgstr "Yardım:" - -msgid "Bitzi|Unknown" -msgstr "Bitzi|Bilinmiyor" - -msgid "Bitzi|Unrated" -msgstr "Bitzi|Yorumlanmamış" - -msgid "Bitzi|Bitzi lookup failure" -msgstr "Bitzi|Arama hatası" - -msgid "Bitzi|Filesize mismatch" -msgstr "Bitzi|Dosya boyutu uyumsuzluğu" - -msgid "Bitzi|Dangerous/Misleading" -msgstr "Bitzi|Tehlikeli/Yanıltıcı" - -msgid "Bitzi|Incomplete/Damaged" -msgstr "Bitzi|Tamamlanmamış/Hasarlı" - -msgid "Bitzi|Substandard" -msgstr "Bitzi|Vasat" - -msgid "Bitzi|Overrated" -msgstr "Bitzi|Şişirilmiş not" - -msgid "Bitzi|Normal" -msgstr "Bitzi|Normal" - -msgid "Bitzi|Underrated" -msgstr "Bitzi|Gerekenden düşük not" - -msgid "Bitzi|Complete" -msgstr "Bitzi|Tamamlanmış" - -msgid "Bitzi|Recommended" -msgstr "Bitzi|Tavsiye edilen" - -msgid "Bitzi|Best Version" -msgstr "Bitzi|En iyi versiyon" - -msgid "No other data" -msgstr "Başka veri yok" +msgstr "Yardım: " msgid "Filename" msgstr "Dosya adı" @@ -3814,11 +6517,17 @@ msgid "Tigertree" msgstr "Tigertree" -msgid "External metadata" -msgstr "Harici metaveriler" +msgid "Rescheduled for" +msgstr "Şu vakte ertelendi" + +msgid "Restartable since" +msgstr "Şu vakitten beri tekrar başlatılabilir" + +msgid "rescheduled for" +msgstr "şu vakte ertelendi" -msgid "Bitzi URL" -msgstr "Bitzi URL'i" +msgid "restartable since" +msgstr "şu vakitten beri tekrar başlatılabilir" #, c-format msgid " (slot %u" @@ -3826,7 +6535,7 @@ #, c-format msgid " retry in %us" -msgstr " %us sonra teşebbüs" +msgstr " %us sonra yine denenecek" msgid "Complete" msgstr "Tamamlandı" @@ -3851,7 +6560,7 @@ #, c-format msgid " via %s" -msgstr "%s yoluyla" +msgstr " %s yoluyla" msgid "Sending request" msgstr "İstek gönderiliyor" @@ -3916,11 +6625,11 @@ msgstr "SHA-1 DOĞRULAMASI BAŞARISIZ" msgid "; Waiting for moving..." -msgstr "; Taşıma bekleniyor" +msgstr "; Taşıma bekleniyor..." #, c-format msgid "; Moving (%.02f%%)" -msgstr "; Taşıma (%%%.02f)" +msgstr "; Taşınıyor (%%%.02f)" #, c-format msgid "; Moved (%s) %s" @@ -3947,9 +6656,6 @@ msgid "Awaiting data" msgstr "Veri bekleniyor" -msgid "Unknown error" -msgstr "Bilinmeyen hata" - #, c-format msgid "Retry in %us" msgstr "%us sonra tekrar dene" @@ -3962,6 +6668,7 @@ msgid "Forgot %u download" msgid_plural "Forgot %u downloads" msgstr0 "%u indirim unutuldu" +msgstr1 "%u indirim unutuldu" msgid "Filename (filtered)" msgstr "Dosya adı (filtrelendi)" @@ -4003,7 +6710,10 @@ #, c-format msgid "Selected %u of %u download matching \"%s\"." msgid_plural "Selected %u of %u downloads matching \"%s\"." -msgstr0 "%u indirme (toplam %u üzerinden) \"%s\" değerine denk geldiğinden seçildi." +msgstr0 "" +"%u indirme (toplam %u üzerinden) \"%s\" değerine denk geldiğinden seçildi." +msgstr1 "" +"%u indirme (toplam %u üzerinden) \"%s\" değerine denk geldiğinden seçildi." msgid "starts with" msgstr "bu kelimelerle başlıyorsa" @@ -4110,7 +6820,7 @@ #, c-format msgid "If urn:sha1 is same as for \"%s\"" -msgstr "urn:sha1 \"%s\" ile aynıysa " +msgstr "urn:sha1 \"%s\" ile aynıysa" msgid "If urn:sha1 is not available" msgstr "urn:sha1 mevcut değilse" @@ -4118,7 +6828,6 @@ msgid "Always" msgstr "Her zaman" -# to be reviewed msgid "busy is set" msgstr "meşgul koyulmuşsa" @@ -4139,13 +6848,13 @@ #, c-format msgid "If flag %s%s%s%s%s" -msgstr "Eğer bayrak %s%s%s%s%s" +msgstr "Bayrak şuysa %s%s%s%s%s" msgid "Always (all flags ignored)" msgstr "Her zaman (tüm bayraklar görmezden gelinir)" msgid "DISPLAY is undefined" -msgstr "DISPLAY tanımlanmamış" +msgstr "GÖSTER tanımlanmamış" msgid "DISPLAY" msgstr "GÖSTER" @@ -4154,7 +6863,7 @@ msgstr "GÖSTERME" msgid "DOWNLOAD is undefined" -msgstr "DOWLOAD tanımlanmamış" +msgstr "İNDİR tanımlanmamış" msgid "DOWNLOAD" msgstr "İNDİR" @@ -4174,7 +6883,7 @@ msgstr "%s%s %s şuna atla \"%s\"" msgid "(Negated) " -msgstr "(olumsuzlanmış)" +msgstr "(olumsuzlanmış) " msgid "(deactivated)" msgstr "(devre dışı)" @@ -4206,634 +6915,22 @@ msgid "RETURN" msgstr "GERİ DÖN" -msgid "Query hit" -msgstr "Sorgu denkleşmesi" - -msgid "DHT (truncated)" -msgstr "DHT (kesilmiş)" - -msgid "Routing errors" -msgstr "Yönlendirme hataları" - -msgid "Routing table chunks" -msgstr "Yönlendirme tablosundaki parçalar" - -msgid "Routing table message capacity" -msgstr "Yönlendirme tablosu mesaj kapasitesi" - -msgid "Routing table message count" -msgstr "Yönlendirme tablosundaki parça sayısı" - -msgid "Duplicates with higher TTL" -msgstr "Daha yüksek TTL'li kopyalar" - -msgid "SPAM SHA1 database hits" -msgstr "SPAM SHA1 denkleşmeleri" - -msgid "SPAM filename and size hits" -msgstr "SPAM dosya adı ve boyutu denkleşmeleri" - -msgid "SPAM fake hits" -msgstr "SPAM hile dosya denkleşmeleri" - -msgid "SPAM duplicate hits" -msgstr "SPAM kopya denkleşmeleri" - -msgid "SPAM dynamically caught hostile IP addresses" -msgstr "SPAM dinamik olarak yakalanan kötücül İP adresleri" - -msgid "SPAM dynamically caught hostile IP held" -msgstr "SPAM saklanan dinamik olarak yakalanmış kötücül İP adresleri" - -msgid "SPAM spotted spamming IP addresses held" -msgstr "SPAM tutulan tespit edilmiş spamcı İP adresleri" - -msgid "Searches to local DB" -msgstr "Yerel veritabanında aramalar" - -msgid "Hits on local DB" -msgstr "Yerel veritabanıyla denkleşmeler" - -msgid "Hits on local partial files" -msgstr "Yerel tamamlanmamış dosyalarla denkleşmeler" - -msgid "Hits on \"what's new?\" queries" -msgstr "\"Yeni olanlar\" sorgularıyla denkleşmeler" - -msgid "Query hits received for local queries" -msgstr "Yerel sorgular için alınan sorgu denkleşmeleri" - -msgid "Query hits received for OOB-proxied queries" -msgstr "OOB vekilli sorgular için alınan sorgu denkleşmeleri" - -msgid "Queries requesting OOB hit delivery" -msgstr "OOB denkleşmesi talep eden sorgular" - -msgid "Stripped OOB flag on queries" -msgstr "Sorgulardan kaldırılan OOB bayrağı" - -msgid "Duplicate OOB-proxied queries" -msgstr "Kopya OOB vekilli sorgular" - -msgid "OOB hits received for OOB-proxied queries" -msgstr "OOB vekilli sorgular için alınan OOB denkleşmeleri" - -msgid "OOB hits bearing alien IP address" -msgstr "Yabancı İP adresi taşıyan OOB denkleşmeleri" - -msgid "OOB hits ignored due to identified spamming address" -msgstr "Bilinen spamcı adresi nedeniyle görmezden gelinen OOB denkleşmeleri" - -msgid "Unclaimed locally-generated OOB hits" -msgstr "Talep edilmeyen yerel olarak oluşturulmuş OOB denkleşmeleri" - -msgid "Partially claimed locally-generated OOB hits" -msgstr "Kısmi olarak talep edilen yerel olarak oluşturulmuş OOB denkleşmeleri" - -msgid "Spurious OOB hit claiming received" -msgstr "Sahte OOB denkleşmesi talebi alındı" - -msgid "Unrequested OOB hits received" -msgstr "Talep edilmeden alınan OOB denkleşmeleri" - -msgid "Received query hits for untracked queries" -msgstr "İzlenmeyen sorgular için alınan sorgu denkleşmeleri" - -msgid "Tracked query MUIDs" -msgstr "İzlenen eşsiz mesaj kimlikleri (MUİD)" - -msgid "Compacted queries" -msgstr "Sıkıştırılmış sorgular" - -msgid "Bytes saved by compacting" -msgstr "Sıkıştırılmayla tasarruf edilen baytlar" - -msgid "UTF8 queries" -msgstr "UTF8 sorgular" - -msgid "SHA1 queries" -msgstr "SHA1 sorgular" - -msgid "\"What's New?\" queries" -msgstr "\"Yeni olanlar\" sorguları" - -msgid "GUESS queries" -msgstr "GUESS sorguları" - -msgid "GUESS queries (0.2)" -msgstr "GUESS sorguları (0.2)" - -msgid "GUESS cached query keys held" -msgstr "GUESS tutulan sorgu anahtarları" - -msgid "GUESS cached 0.2 hosts held" -msgstr "GUESS tutulan 0.2 bilgisayarları" - -msgid "GUESS locally generated queries" -msgstr "GUESS yerel olarak oluşturulan sorgular" - -msgid "GUESS currently running queries" -msgstr "GUESS şu anda etkin olan sorgular" - -msgid "GUESS hits received for locally generated queries" -msgstr "GUESS yerel olarak oluşturulan sorgulara erişimler" - -msgid "GUESS hosts queried" -msgstr "Sorgulanan GUESS bilgisayarları" - -msgid "GUESS hosts sending back an acknowledgment" -msgstr "Bildirim geri gönderen GUESS bilgisayarları" - -msgid "Broadcasted push messages" -msgstr "Yayınlanan itme mesajları" - -msgid "Push-proxy UDP relayed messages" -msgstr "İtme vekilince yönlendirilen UDP mesajları" - -msgid "Push-proxy TCP relayed messages" -msgstr "İtme vekilince yönlendirilen TCP mesajları" - -msgid "Push-proxy broadcasted messages" -msgstr "Yayınlanan itme vekili mesajları" - -msgid "Push-proxy found un-proxied local route" -msgstr "İtme vekili vekilsiz yerel bir yol buldu" - -msgid "Push-proxy lookup failures" -msgstr "İtme vekili danışma başarısızlıkları" - -msgid "Push relayed via local route" -msgstr "İtme yerel yol ile yönlendirildi" - -msgid "Push relayed via routing table" -msgstr "İtme yönlendirme tablosuyla yönlendirildi" - -msgid "Locally generated dynamic queries" -msgstr "Yerel olarak oluşturulan dinamik sorgular" - -msgid "Leaf-generated dynamic queries" -msgstr "Yapraklar tarafından oluşturulan dinamik sorgular" - -msgid "OOB-proxied leaf queries" -msgstr "OOB vekilli yaprak sorguları" - -msgid "Fully completed dynamic queries" -msgstr "Eksiksiz tamamlanan dinamik sorgular" - -msgid "Partially completed dynamic queries" -msgstr "Kısmen tamamlanan dinamik sorgular" - -msgid "Dynamic queries ended with no results" -msgstr "Sonuçsuz sona eren dinamik sorgular" - -msgid "Fully completed dynamic queries getting late results" -msgstr "Gecikmiş cevap alan eksiksiz tamamlanmış dinamik sorgular" - -msgid "Dynamic queries with partial late results" -msgstr "Kısmi geç sonuçları bulunan dinamik sorgular" - -msgid "Dynamic queries completed by late results" -msgstr "Geç sonuçlarla tamamlanan dinamik sorgular" - -msgid "Queries seen from GTKG" -msgstr "GTKG'den görülen sorgular" - -msgid "Queries seen from GTKG that were re-queries" -msgstr "GTKG'nın gördüğü tekrar olan sorgular" - -msgid "Queries advertising support of GGEP \"H\"" -msgstr "GGEP \"H\" desteği bildiren sorgular" - -msgid "GIV callbacks received" -msgstr "Alınan GİV geri çağrıları" - -msgid "GIV discarded due to no suitable download" -msgstr "Uygun indirme bulunmadığı için atılan GİV" - -msgid "QUEUE callbacks received" -msgstr "Alınan QUEUE geri çağrıları" - -msgid "QUEUE discarded due to no suitable download" -msgstr "Uygun indirme bulunmadığı için atılan QUEUE" - -msgid "UDP messages with bogus source IP" -msgstr "Bozuk kaynak İP adresi içeren UDP mesajları" - -msgid "Alien UDP messages (non-Gnutella)" -msgstr "Yabancı UDP mesajları (Gnutella'dan olmayan)" - -msgid "Unprocessed UDP Gnutella messages" -msgstr "İşlenmeyen Gnutella UDP mesajları" - -msgid "Compressed UDP messages enqueued" -msgstr "Kuyruğa eklenen sıkıştırılmış UDP mesajları" - -msgid "Compressed UDP messages received" -msgstr "Alınan sıkıştırılmış UDP mesajları" - -msgid "Uncompressed UDP messages due to no gain" -msgstr "Kazanım olmadığı için sıkıştırılmayan UDP mesajları" - -msgid "Consolidated servers (after GUID and IP address linking)" -msgstr "Konsolide sunucular (GUİD ve İP adresi eşleşmesinden sonra)" - -msgid "Duplicate downloads found during server consolidation" -msgstr "Sunucu konsolide edilirken bulunan çift indirmeler" - -msgid "Discovered server GUIDs" -msgstr "Keşfedilen sunucu GUİD'leri" - -msgid "Changed server GUIDs" -msgstr "Değişmeye uğrayan sunucu GUİD'leri" - -msgid "Detected GUID collisions" -msgstr "Tespit edilen GUİD çarpışmaları" - -msgid "Detected collisions with our own GUID" -msgstr "Bizim GUİD'mizle tespit edilen çarpışmalar" - -msgid "GUID dynamically banned" -msgstr "GUİD dinamik olarak yasaklandı" - -msgid "Firewalled node info for known hosts received in upload requests" -msgstr "Gönderme isteklerinde bilinen bilgisayarlar için güvenlik duvarı arkasında düğüm bilgisi" - -msgid "Revitalized PUSH routes" -msgstr "Tekrar canlandırılan itme yolları" - -msgid "Collected new PUSH proxies from other query hits" -msgstr "Diğer sorgu denkleşmelerinden toplanan yeni İTME vekilleri" - -msgid "Attempted download resource switching on completion" -msgstr "Tamamlanma ardından indirme kaynak değiştirme teşebbüsü" - -msgid "Attempted download resource switching after error" -msgstr "Hata sonrası indirme kaynağı değiştirme teşebbüsü" - -msgid "Successful download resource switching (all kind)" -msgstr "Başarılı indirme kaynağı değiştirmesi (her tür)" - -msgid "Successful download resource switching between plain files" -msgstr "Başarılı dosyalar arası indirme kaynağı değiştirmeleri " - -msgid "Successful download resource switching after error" -msgstr "Hata sonrası başarılı indirme kaynağı (dosya) değiştirmesi" - -msgid "Actively queued after resource switching attempt" -msgstr "Kaynak değiştirme teşebbüsü ardından aktif bir şekilde kuyruğa eklendi" - -msgid "Sunk HTTP reply data on error codes" -msgstr "HTTP cevap verileri hata kodu nedeniyle atıldı" - -msgid "Ignored downloaded data" -msgstr "İndirilen veri görmezden gelindi" - -msgid "Ignoring requested after data mismatch" -msgstr "İstenen veri uyumsuzluğu ardından görmezden geliniyor" - -msgid "Ignoring requested to preserve connection" -msgstr "İstenen bağlantıyı korumak için görmezden geliniyor" - -msgid "Ignoring requested due to aggressive swarming" -msgstr "Agresif çoklu indirme nedeniyle görmezden gelinenler" - -msgid "Ignoring refused (data too large or server too slow)" -msgstr "Reddedilen görmezden gelmeler (veriler çok büyük veya sunucu çok yavaş)" - -msgid "Client resource switching (all detected)" -msgstr "İstemci kaynak değiştirmeleri (tüm tespitler)" - -msgid "Client resource switching between plain files" -msgstr "İstemciler tarafından istenen dosyalar için kaynak değiştirmeleri" - -msgid "Client follow-up request after HTTP error was returned" -msgstr "HTTP hatası yollanmasını izleyen istemci isteği" - -msgid "PARQ client resource switching in slots (SHA-1 based)" -msgstr "PARQ oluklarda istemcinin kaynak değiştirmesi (SHA-1 değerine dayalı)" - -msgid "PARQ client retry-after violation" -msgstr "PARQ istemcisi sonra-tekrar dene ihlâli" - -msgid "PARQ client kicked out after too many retry-after violations" -msgstr "PARQ istemcisi fazla sonra-tekrar dene ihlâli nedeniyle kovulması" - -msgid "PARQ upload slot limit overrides" -msgstr "PARQ gönderme oluk sınırı aşımları" - -msgid "PARQ quick upload slots granted" -msgstr "Verilen PARQ çabuk gönderme olukları" - -msgid "PARQ QUEUE sending attempts" -msgstr "PARQ QUEUE yollama teşebbüsleri" - -msgid "PARQ QUEUE messages sent" -msgstr "Yollanan PARQ QUEUE mesajları" - -msgid "PARQ QUEUE follow-up requests received" -msgstr "PARQ QUEUE yollanımından sonra alınan istekler" - -msgid "Launched SHA-1 file verifications" -msgstr "Başlatılan SHA-1 dosya doğrulamaları" - -msgid "Launched TTH file verifications" -msgstr "Başlatılan TTH dosya doğrulamaları" - -msgid "Bitzi tickets held" -msgstr "Elde tutulan Bitzi biletleri" - -msgid "Re-seeding of orphan downloads through query hits" -msgstr "Öksüz indirmelerin sorgu denkleşmeleri yoluyla tekrar sunumu" - -msgid "Re-seeding of orphan downloads through upload requests" -msgstr "Öksüz indirmelerin gönderme istekleri yoluyla tekrar sunumu" - -msgid "DHT estimated amount of nodes" -msgstr "DHT tahmini düğüm sayısı" - -msgid "DHT k-ball theoretical frontier (bits)" -msgstr "DHT teorik k-topu sınırı (bit olarak)" - -msgid "DHT k-ball furthest frontier (bits)" -msgstr "DHT en uzak k-topu sınırı (bit olarak)" - -msgid "DHT k-ball closeest frontier (bits)" -msgstr "DHT en yakın k-topu sınırı (bit olarak)" - -msgid "DHT routing table buckets" -msgstr "DHT yönlendirme tablosu konumları" - -msgid "DHT routing table leaves" -msgstr "DHT yönlendirme tablosundaki yapraklar" - -msgid "DHT routing table maximum depth" -msgstr "DHT yönlendirme tablosunun azami derinliği" - -msgid "DHT routing table good nodes" -msgstr "DHT yönlendirme tablosundaki iyi düğümler" - -msgid "DHT routing table stale nodes" -msgstr "DHT yönlendirme tablosundaki kötü düğümler" - -msgid "DHT routing table pending nodes" -msgstr "DHT yönlendirme tablosundaki bekleyen düğümler" - -msgid "DHT routing table evicted nodes" -msgstr "DHT yönlendirme tablosundan çıkarılan düğümler" - -msgid "DHT routing table evicted firewalled nodes" -msgstr "DHT yönlendirme tablosundan çıkarılan güvenlik duvarı arkasındaki düğümler" - -msgid "DHT routing table evicted nodes due to quota" -msgstr "DHT yönlendirme tablosundan kota nedeniyle çıkarılan düğümler" - -msgid "DHT routing table promoted pending nodes" -msgstr "DHT yönlendirme tablosundaki bekleyen terfi etmiş düğümler" - -msgid "DHT routing table pinged promoted nodes" -msgstr "DHT yönlendirme tablosunda terfi etmiş düğümlere yollanan pingler" - -msgid "DHT routing table rejected node due to bucket network quota" -msgstr "DHT yönlendirme tablosunda konum ağ kotası nedeniyle reddedilen düğümler" - -msgid "DHT routing table rejected node due to global network quota" -msgstr "DHT yönlendirme tablosunda genel ağ kotası nedeniyle reddedilen düğümler" - -msgid "DHT completed bucket refreshes" -msgstr "DHT tamamlanan konum tazelemeleri" - -msgid "DHT forced bucket refreshes" -msgstr "DHT zorlanan konum tazelemeleri" - -msgid "DHT forced bucket merges" -msgstr "DHT zorlanan konum birleşmeleri" - -msgid "DHT denied non-splitable bucket refresh" -msgstr "DHT reddedilen bölünemez konum tazelemeleri" - -msgid "DHT initiated bucket alive checks" -msgstr "DHT başlatılan konum denetlemeleri" - -msgid "DHT alive pings sent to good nodes" -msgstr "DHT iyi düğümlere yollanan pingler" - -msgid "DHT alive pings sent to stale nodes" -msgstr "DHT kötü düğümlere yollanan pingler" - -msgid "DHT alive pings sent to shutdowning nodes" -msgstr "DHT kapanan düğümlere yollanan pingler" - -msgid "DHT alive pings avoided" -msgstr "DHT kaçınılan pingler" - -msgid "DHT alive pings skipped" -msgstr "DHT atlanan pingler" - -msgid "DHT revitalized stale nodes on RPC reply" -msgstr "DHT RPC cevabıyla tekrar canlandırılan kötü düğümler" - -msgid "DHT value store rejected on IP/network quota grounds" -msgstr "DHT İP/ağ kotası nedeniyle değer tutulması retleri" - -msgid "DHT value store rejected on creator validation grounds" -msgstr "DHT oluşturucu onaylaması temelinde değer tutulması retleri" - -msgid "DHT nodes rejected during lookup based on network quota" -msgstr "DHT aramalar sırasında ağ kotası nedeniyle reddedilen düğümler" - -msgid "DHT nodes rejected during lookup based on suspicious proximity" -msgstr "DHT aramalar sırasında şüpheli yakınlık nedeniyle reddedilen düğümler" - -msgid "DHT nodes rejected during lookup based on frequency divergence" -msgstr "DHT aramalar sırasında frekans sapması nedeniyle reddedilen düğümler" - -msgid "DHT keys held" -msgstr "DHT tutulan anahtarlar" - -msgid "DHT cached keys held" -msgstr "DHT arabellekte tutulan anahtarlar" - -msgid "DHT values held" -msgstr "DHT tutulan anahtarlar" - -msgid "DHT cached KUID targets held" -msgstr "DHT arabellekte tutulan KUİD hedefleri" - -msgid "DHT cached closest root nodes" -msgstr "DHT arabelleğindeki en yakın kök düğümler" - -msgid "DHT cached roots exact hits" -msgstr "DHT arabelleğinde bulunan kök düğümler" - -msgid "DHT cached roots approximate hits" -msgstr "DHT arabelleğinde yaklaşık kök sunan düğümler" - -msgid "DHT cached roots misses" -msgstr "DHT arabelleğinde bulunamayan kök düğümler" - -msgid "DHT cached roots lookups within k-ball" -msgstr "DHT arabelleğinde k-topu içerisinde kök aramaları" - -msgid "DHT cached roots contact address refreshed" -msgstr "DHT arabellekteki kök adresleri tazelemesi" - -msgid "DHT cached security tokens held" -msgstr "DHT arabelleğinde tutulan güvenlik jetonları" - -msgid "DHT cached security tokens hits" -msgstr "DHT arabellekteki güvenlik jetonu denkleşmeleri" - -msgid "DHT stable node information held" -msgstr "DHT tutulan kararlı düğüm bilgisi" - -msgid "DHT local hits on value lookups" -msgstr "DHT değer aramalarında yerel denkleşmeler" - -msgid "DHT local hits returning values from cached keys" -msgstr "DHT arabellekteki anahtarlardan değer geri gönderen yerel denkleşmeler" - -msgid "DHT returned expanded values" -msgstr "DHT geri gönderilen genişletilmiş değerler" - -msgid "DHT returned values as secondary keys" -msgstr "DHT ikincil anahtarlar olarak geri gönderilen değerler" - -msgid "DHT claimed values via secondary keys" -msgstr "DHT ikincil anahtarlar yoluyla istenen değerler" - -msgid "DHT returned cached expanded values" -msgstr "DHT geri gönderilen arabellekteki genişletilmiş değerler" - -msgid "DHT returned cached values as secondary-keys" -msgstr "DHT arabellekte ikincil anahtar olarak geri gönderilen değerler" - -msgid "DHT claimed cached values via secondary keys" -msgstr "DHT arabellekte ikincil anahtar olarak istenen değerler" - -msgid "DHT successfully received value publications" -msgstr "DHT başarılı olarak alınan değer yayınları" - -msgid "DHT successfully received value removals" -msgstr "DHT başarılı olarak alınan değer silinmeleri" - -msgid "DHT replication of stale value avoided" -msgstr "DHT çoğaltılmasından kaçınılan bayat değerler" - -msgid "DHT replication of held values" -msgstr "DHT tutulan değerlerin çoğaltılması" - -msgid "DHT republishing of held values" -msgstr "DHT tutulan değerlerin tekrar yayını" - -msgid "DHT secondary-key value fetch issued" -msgstr "DHT ikincil anahtarlar ile değer istekleri" - -msgid "DHT duplicate values returned in lookups" -msgstr "DHT aramalarda sonuç olarak çift/kopya değerler" - -msgid "DHT detected KUID collisions" -msgstr "DHT tespit edilen KUİD çarpışmaları" - -msgid "DHT detected collisions with our own KUID" -msgstr "DHT Tespit edilen bizim KUİD'mizle çarpışmalar" - -msgid "DHT detected KUID mismatches on RPC reply" -msgstr "DHT RCP cevaplarında tespit edilen KUİD uyumsuzlukları" - -msgid "DHT caching attempts" -msgstr "DHT önbelleğe koyma teşebbüsleri" - -msgid "DHT caching ended successfully" -msgstr "DHT başarılı önbelleğe koymalar" - -msgid "DHT caching partially completed" -msgstr "DHT tamamlanmamış önbelleğe koymalar" - -msgid "DHT key-offloading checks after discovering new closest node" -msgstr "DHT yeni en yakın düğüm bulunduğunda anahtar kaldırma denetimleri" - -msgid "DHT keys selected for offloading" -msgstr "DHT kaldırmak için seçilen anahtarlar" - -msgid "DHT key-offloading attempts" -msgstr "DHT anahtar kaldırma teşebbüsleri" - -msgid "DHT key-offloading ended successfully" -msgstr "DHT başarılı bir şekilde tamamlanan anahtar kaldırmaları" - -msgid "DHT key-offloading partially completed" -msgstr "DHT kısmen tamamlanan anahtar kaldırmaları" - -msgid "DHT values successfully offloaded" -msgstr "DHT başarılı bir şekilde kaldırılan değerler" - -msgid "DHT publishing attempts" -msgstr "DHT yayın teşebbüsleri" - -msgid "DHT publishing ended successfully (all roots)" -msgstr "DHT başarılı bir şekilde sona eren yayınlar (tüm kökler)" - -msgid "DHT publishing partially completed (root subset only)" -msgstr "DHT kısmen tamamlanan yayınlar (sadece kök altkümesi)" - -msgid "DHT publishing ending with proper value presence" -msgstr "DHT uygun değer varlığı ile biten yayınlar" - -msgid "DHT value republishing occurring too late (after expiry)" -msgstr "DHT çok geç meydana gelen (ömründen sonra) değer tekrar yayını" - -msgid "DHT publishing to self" -msgstr "DHT kendine yayın" - -msgid "DHT background publishing completion attempts" -msgstr "DHT arka planda yayın tamamlama teşebbüsleri" - -msgid "DHT background publishing completion showing improvements" -msgstr "DHT iyileşme gösteren arka planda yayın tamamlanması" - -msgid "DHT background publishing completion successful (all roots)" -msgstr "DHT arka planda başarılı yayınlama tamamlanması (tüm kökler)" - -msgid "DHT SHA1 data type collisions" -msgstr "DHT SHA1 veri tipi çarpışmaları" - -msgid "DHT lookup path passively protected against attack" -msgstr "DHT arama yolunun saldırılara karşı pasif olarak korunması" - -msgid "DHT lookup path actively protected against attack" -msgstr "DHT arama yolunun saldırılara karşı aktif olarak korunması" - -msgid "DHT alt-loc lookups issued" -msgstr "DHT yollanan alternatif kaynak (alt-loc) aramaları" - -msgid "DHT push-proxy lookups issued" -msgstr "DHT yollanan itme vekili aramaları" - -msgid "DHT successful alt-loc lookups" -msgstr "DHT başarılı alt-loc aramaları" - -msgid "DHT successful push-proxy lookups" -msgstr "DHT başarılı itme vekili aramaları" - -msgid "DHT successful node push-entry lookups" -msgstr "DHT başarılı itme vekili aramaları" - -msgid "DHT re-seeding of orphan downloads" -msgstr "DHT öksüz indirmelerin tekrar sunumu" - msgid "node" msgid_plural "nodes" msgstr0 "düğüm" +msgstr1 "düğüm" msgid "file" msgid_plural "files" msgstr0 "dosya" +msgstr1 "dosya" msgid "Please choose a directory to share" -msgstr "Lütfen paylaşılacak dizini seçin" +msgstr "Lütfen paylaşılacak klasörü seçin" msgid "Please choose where to move files after successful download" -msgstr "Dosyaların başarılı bir indirimden sonra nereye taşınacaklarını seçiniz" +msgstr "" +"Dosyaların başarılı bir indirimden sonra nereye taşınacaklarını seçiniz" msgid "Please choose where to store files while downloading" msgstr "Dosyaların indirilirken nereye konulacağını seçiniz" @@ -4842,7 +6939,7 @@ msgstr "Bozuk dosyaların nereye taşınacağını seçiniz" msgid " Clear completed " -msgstr " Tamamlananları temizle" +msgstr " Tamamlananları temizle " msgid " Gnutella browse requests" msgstr " Gnutella gözatma isteği" @@ -4851,7 +6948,7 @@ msgstr " HTML ve " msgid " Kill selected " -msgstr "Seçilenleri durdur" +msgstr " Seçileni durdur " msgid " alive with " msgstr " zinde ve " @@ -4898,11 +6995,16 @@ msgid "<no property selected>" msgstr "<hiçbir özellik seçilmedi>" -msgid "==> We are looking for people who want to contribute to this fine tool. <==" +msgid "" +"==> We are looking for people who want to contribute to this fine tool. <==" msgstr "==> Bu güzel araca katkıda bulunacak kişiler arıyoruz. <==" -msgid "A filter cannot be removed if it is bound to a search or if it is in use (used as a target in a rule)." -msgstr "Bir filtre herhangi bir aramaya bağlı ise ya da kullanılmakta ise (bir kuralda hedef olarak) kaldırılamaz." +msgid "" +"A filter cannot be removed if it is bound to a search or if it is in use " +"(used as a target in a rule)." +msgstr "" +"Bir filtre herhangi bir aramaya bağlı ise ya da kullanılmakta ise (bir " +"kuralda hedef olarak) kaldırılamaz." msgid "A passive search matches any search results routed through this node" msgstr "Pasif aramalar bu düğümden geçen tüm arama sonuçlarını dikkate alır" @@ -4911,7 +7013,7 @@ msgstr "Atılgan kip" msgid "Abort and remove all selected uploads" -msgstr "Tüm göndermeleri iptal et ve kaldır" +msgstr "Seçilen tüm göndermeleri iptal et ve kaldır" msgid "Abort" msgstr "İptal et" @@ -4923,7 +7025,8 @@ msgstr "Yapraklar için OOB vekilliği yap" msgid "Actual amount of file descriptors used -- cannot be changed at runtime" -msgstr "Kullanılan dosya tanımlayıcı miktarı -- çalışma sırasında değiştirilemez" +msgstr "" +"Kullanılan dosya tanımlayıcı miktarı -- çalışma sırasında değiştirilemez" msgid "Add IP rule" msgstr "İP kuralı ekle" @@ -4961,8 +7064,12 @@ msgid "Amount of tolerable messages above hard TTL limit per node" msgstr "Her düğüm için sabit TTL sınırı üzeri kabul edilebilir mesaj miktarı" -msgid "Apply above conversions, upon startup, to existing files in the downloading directory" -msgstr "Yukarıdaki değişiklikleri başlangıçta indirme dizininde mevcut dosyalara uygula" +msgid "" +"Apply above conversions, upon startup, to existing files in the downloading " +"directory" +msgstr "" +"Yukarıdaki değişiklikleri başlangıçta indirme klasöründe mevcut dosyalara " +"uygula" msgid "Apply" msgstr "Uygula" @@ -5024,12 +7131,6 @@ msgid "Bind to this address" msgstr "Bu adrese bağla" -msgid "Bitzi Metadata" -msgstr "Bitzi verileri" - -msgid "Bitzi metadata" -msgstr "Bitzi verileri" - msgid "Browse Host" msgstr "Kişiye Gözat" @@ -5067,7 +7168,8 @@ msgstr "Zaten tamamlanmış olan göndermeleri listeden temizle" msgid "Clear completed, failed and unavailable downloads from list" -msgstr "Tamamlanan, başarısız olan ve mevcut olmayan indirmeleri listeden temizle" +msgstr "" +"Tamamlanan, başarısız olan ve mevcut olmayan indirmeleri listeden temizle" msgid "Clear non-existent files" msgstr "Mevcut olmayan dosyaları temizle" @@ -5154,10 +7256,14 @@ msgstr "gtk-gnutella düğümleri için ayrılan bağlantılar" msgid "Contributors:" -msgstr "Katkıda bulunanlar" +msgstr "İştirâk edenler:" -msgid "Convert \"evil\" characters (like shell meta characters) to underscores in generated filenames" -msgstr "Oluşturulan dosya isimlerindeki meta kabuk karakterleri gibi \"şer\" karakterleri alt çizgilere dönüştür" +msgid "" +"Convert \"evil\" characters (like shell meta characters) to underscores in " +"generated filenames" +msgstr "" +"Oluşturulan dosya isimlerindeki meta kabuk karakterleri gibi \"şer\" " +"karakterleri alt çizgilere dönüştür" msgid "Convert spaces to underscores in generated filenames" msgstr "Oluşturulan dosya isimlerinde alt çizgileri boşluklara dönüştür" @@ -5193,7 +7299,7 @@ msgstr "Toplam _gönderme hızı" msgid "Current IP settings (Address:Port):" -msgstr "Halihazırdaki İP ayarları (Adres:Port)" +msgstr "Hâlihazırdaki İP ayarları (Adres:Port):" msgid "Current search:" msgstr "Şu anki arama:" @@ -5277,7 +7383,7 @@ msgstr "İndirmeler" msgid "Dropped" -msgstr "Atılan" +msgstr "Görmezden gelinen" msgid "Dup / Bad / Weird" msgstr "Kopya / Kötü / Garip" @@ -5286,10 +7392,10 @@ msgstr "Göreli yolları eşlere göster" msgid "Edit value:" -msgstr "Değeri düzenle" +msgstr "Değeri düzenle:" msgid "Enable \"_Browse Host\" feature" -msgstr "\"_Kişiye Gözat\" işlevini etkinleştir." +msgstr "\"_Kişiye Gözat\" işlevini etkinleştir" msgid "Enable _DHT" msgstr "_DHT'yi etkinleştir" @@ -5322,10 +7428,16 @@ msgstr "Yeterli asgari bağlantı sayısı" msgid "Enough physical memory" -msgstr "Yeterli fiziksel bellek" +msgstr "Yeterli fiziki bellek" -msgid "Enter a semicolon separated list of networks that are local to you in the form of ip/bits or ip/netmask (eg 192.168.1.0/24 or 192.168.1.0/255.255.255.0)" -msgstr "Sizin için yerel olan ağların listesini noktalı virgüllerle ayırarak İP/bits ya da İP/netmask şeklinde giriniz (mesela 192.168.1.0/24 ya da 192.168.1.0/255.255.255.0 gibi)." +msgid "" +"Enter a semicolon separated list of networks that are local to you in the " +"form of ip/bits or ip/netmask (eg 192.168.1.0/24 or " +"192.168.1.0/255.255.255.0)" +msgstr "" +"Sizin için yerel olan ağların listesini noktalı virgüllerle ayırarak İP/bits " +"ya da İP/netmask şeklinde giriniz (mesela 192.168.1.0/24 ya da " +"192.168.1.0/255.255.255.0 gibi)" msgid "Expand all" msgstr "Tümünü genişlet" @@ -5392,7 +7504,7 @@ msgstr "Sık Sorulan Sorular" msgid "Fully served " -msgstr "Tamamen cevaplanan" +msgstr "Tamamen cevaplanan " msgid "GUI development:" msgstr "GUİ geliştirimi:" @@ -5464,13 +7576,15 @@ msgstr "Kullanılan dosya _tanımlayıcılarının sabit sınırı" msgid "Hits" -msgstr "Denkleşmeler" +msgstr "İsabetler" msgid "Honor OOB flag in queries" msgstr "Sorgulardaki OOB bayrağını dikkate al" msgid "Hop radius for counting high TTL limit messages (#hops lower than...)" -msgstr "Yüksek TTL'li mesajları saymak için hop yarıçapı (hop sayısı bundan daha küçük...)" +msgstr "" +"Yüksek TTL'li mesajları saymak için hop yarıçapı (hop sayısı bundan daha " +"küçük...)" msgid "Hops random factor" msgstr "Hopların rastgele faktörü" @@ -5509,13 +7623,13 @@ msgstr "İPv6 ayarları" msgid "Ignore symbolically linked _directories" -msgstr "Sembolik bağlantılı _dizinleri görmezden gel" +msgstr "Sembolik bağlantılı klas_örleri görmezden gel" msgid "Ignore symbolically linked regular _files" msgstr "Sembolik bağlantılı olağan d_osyaları görmezden gel" msgid "Ignored files are" -msgstr "Yoksayılan dosyalar" +msgstr "Yoksayılan dosyaları" msgid "Incoming connecting timeout" msgstr "İçeriye gelen bağlantı zaman aşımı süresi" @@ -5532,7 +7646,6 @@ msgid "Input bandwidth average" msgstr "Ortalama içeriye giren bant genişliği" -# wtf? That's a proper noun. msgid "Jeroen Asselman" msgstr "Jeroen Asselman" @@ -5591,7 +7704,7 @@ msgstr "Kütüphane boyutu" msgid "Limit search _results to " -msgstr "Arama sonuçlarını şu sayıyla sını_rla" +msgstr "Arama sonuçlarını şu sayıyla sını_rla " msgid "Local networks" msgstr "Yerel ağlar" @@ -5688,7 +7801,7 @@ msgstr "Bizimle irc.freenode.net #gtk-gnutella'da görüşün." msgid "Min/Max:" -msgstr "Asgari/Azami" +msgstr "Asgari/Azami:" msgid "Minimum chunk size" msgstr "Asgari parça boyutu" @@ -5775,7 +7888,7 @@ msgstr "Diğer" msgid "Out of Band Querying" -msgstr "Bant Dışı (OOB) Sorgulama " +msgstr "Bant Dışı (OOB) Sorgulama" msgid "Outgoing traffic to lea_ves" msgstr "_Yapraklara giden trafik" @@ -5790,7 +7903,7 @@ msgstr "Tamamlanmamış Dosya Paylaşımı" msgid "Pass_word" -msgstr "_Şifre" +msgstr "Par_ola" msgid "Paste rule" msgstr "Kuralı yapıştır" @@ -5804,11 +7917,23 @@ msgid "Pending local queries" msgstr "Bekleyen yerel sorgular" -msgid "People can connect to you via TCP, but you are UDP-firewalled. However, you can punch a hole into that firewall, allowing reception of replies to your UDP packets. You will be able to send out-of-band query hits, but you won't be able to receive any." -msgstr "Başkaları size TCP yoluyla bağlanabilir ancak UDP açısından güvenlik duvarı arkasındasınız. Bununla beraber bu duvarda bir delik açabiliyorsunuz, ki bu UDP paketlerinize yollanan cevapları almanıza olanak veriyor. Out-of-band (doğrudan) sorgu yollayabileceksiniz ancak bu tip sorgu alamayacaksınız." +msgid "" +"People can connect to you via TCP, but you are UDP-firewalled. However, you " +"can punch a hole into that firewall, allowing reception of replies to your " +"UDP packets. You will be able to send out-of-band query hits, but you won't " +"be able to receive any." +msgstr "" +"Başkaları size TCP yoluyla bağlanabilir ancak UDP açısından güvenlik duvarı " +"arkasındasınız. Bununla beraber bu duvarda bir delik açabiliyorsunuz, ki bu " +"UDP paketlerinize yollanan cevapları almanıza olanak veriyor. Out-of-band " +"(doğrudan) sorgu yollayabileceksiniz ancak bu tip sorgu alamayacaksınız." -msgid "People can connect to you, using both TCP and UDP. Push should work and you will be able to receive out-of-band results for your queries." -msgstr "Diğer kişiler size hem TCP hem UDP ile bağlanabilir. İtme çalışabilecek ve sorgularınıza bant-dışı (out-of-band) cevapları alabileceksiniz." +msgid "" +"People can connect to you, using both TCP and UDP. Push should work and you " +"will be able to receive out-of-band results for your queries." +msgstr "" +"Diğer kişiler size hem TCP hem UDP ile bağlanabilir. İtme çalışabilecek ve " +"sorgularınıza bant-dışı (out-of-band) cevapları alabileceksiniz." msgid "Ping / Pong round trip" msgstr "Ping / Pong gecikmesi" @@ -5862,7 +7987,7 @@ msgstr "Sorgu yönlendirme yama bilgisi:" msgid "Query routing table information:" -msgstr "Sorgu yönlendirme tablo bilgisi:" +msgstr "Sorgu yönlendirme tablosu verileri:" msgid "Queuing details" msgstr "Kuyruğa ekleme ayrıntıları" @@ -5883,7 +8008,7 @@ msgstr "RX sorgular" msgid "RX query hits" -msgstr "RX sorgu denkleşmeleri" +msgstr "RX sorgu isabetleri" msgid "RX speed" msgstr "RX hız" @@ -5894,9 +8019,8 @@ msgid "Range" msgstr "Alan" -# wft? That's a proper noun. msgid "Raphael Manfredi" -msgstr "Raphael Manfredi" +msgstr "Raphaël Manfredi" msgid "Ratio of tolerable duplicate messages per _node" msgstr "_Düğüm başına kabul edilebilir kopya mesaj oranı" @@ -5910,7 +8034,6 @@ msgid "Reason" msgstr "Sebep" -# to be reviewed: see on GUI search results and on mesaj sats table. msgid "Received" msgstr "Alınan" @@ -5996,7 +8119,6 @@ msgid "Revert" msgstr "Geri dön" -# wtf? That's a proper noun. msgid "Richard Eckart" msgstr "Richard Eckart" @@ -6013,7 +8135,7 @@ msgstr "Kalıt modunda çalışıyor. Otomatik moda geçmeniz önerilir." msgid "Running in ultrapeer mode." -msgstr "Ultraeş modunda çalışıyor" +msgstr "Ultraeş modunda çalışıyor." msgid "SHA1 hash (not editable, add from search popup)" msgstr "SHA1 hash değeri (düzenlenemez, arama sekmesinden eklenmiştir)" @@ -6120,7 +8242,6 @@ msgid "Show additional information and settings for advanced and _expert users" msgstr "_Uzman kullanıcılar için ek bilgi ve ayarlar göster" -# no keyboard shortcuts for DHT settings? msgid "Show inbound DHT traffic" msgstr "İçeriye gelen DHT trafiğini göster" @@ -6136,8 +8257,18 @@ msgid "Show tabs" msgstr "Sekmeleri göster" -msgid "Shows visual information on the download progress. Green chunks have been downloaded, with the brighter green chunks touched during this session. Yellow chunks are active right now; these active chunks are also marked with a triangle. Red chunks have not been downloaded yet. The blue line indicates which parts of the file have been seen on the network in this session." -msgstr "İndirmenin ilerlemesini görsel olarak yansıtır. Yeşil parçalar zaten indirilmiştir, açık yeşil parçalar bu oturumda indirimi tamamlanan parçaları gösterir. Sarı parçalar halihazırda etkin olanlardır, bu etkin parçalar ayrıca bir üçgen ile işaretlenirler. Kırmızı parçalar henüz indirilmemiştir. Mavi çizgi bu oturum sırasında şebekede görülen parçaları temsil eder." +msgid "" +"Shows visual information on the download progress. Green chunks have been " +"downloaded, with the brighter green chunks touched during this session. " +"Yellow chunks are active right now; these active chunks are also marked with " +"a triangle. Red chunks have not been downloaded yet. The blue line indicates " +"which parts of the file have been seen on the network in this session." +msgstr "" +"İndirmenin ilerlemesini görsel olarak yansıtır. Yeşil parçalar zaten " +"indirilmiştir, açık yeşil parçalar bu oturumda indirimi tamamlanan parçaları " +"gösterir. Sarı parçalar hâlihazırda faal olanlardır, bu etkin parçalar " +"ayrıca bir üçgen ile işaretlenirler. Kırmızı parçalar henüz indirilmemiştir. " +"Mavi çizgi bu oturum sırasında şebekede görülen parçaları temsil eder." msgid "Similar query half-life" msgstr "Benzer sorguların yarılanma süresi" @@ -6201,7 +8332,7 @@ msgstr "TX sorgular" msgid "TX query hits" -msgstr "TX sorgu denkleşmeleri" +msgstr "TX sorgu isabetleri" msgid "TX speed" msgstr "TX hız" @@ -6218,17 +8349,32 @@ msgid "Thaw queue" msgstr "Kuyruğu serbest bırak" -msgid "The current IP address and listening port for this node. To change these go to File->Preferences->Network." -msgstr "Bu düğüm için İP adresi ve dinleme portu. Değiştirmek için Dosya->Tercihler->Şebeke'ye gidiniz." +msgid "" +"The current IP address and listening port for this node. To change these go " +"to File->Preferences->Network." +msgstr "" +"Bu düğüm için İP adresi ve dinleme portu. Değiştirmek için Dosya->Tercihler-" +">Şebeke'ye gidiniz." -msgid "There is no condition. When this rule is reached, the matching will continue in the specified target filter. That's also why you can't invert this condition. If you could, this rule would just be ignored." -msgstr "Hiçbir koşul yok. Bu kurala ulaşıldığında eşleşme belirtilen hedef filtresinde devam edecektir. Bu, koşulu neden tersine tersine çeviremeyeceğinizin nedenidir, çünkü bunu yapabilseydiniz bu kural görmezden gelinirdi." +msgid "" +"There is no condition. When this rule is reached, the matching will continue " +"in the specified target filter. That's also why you can't invert this " +"condition. If you could, this rule would just be ignored." +msgstr "" +"Hiçbir koşul yok. Bu kurala ulaşıldığında eşleşme belirtilen hedef " +"filtresinde devam edecektir. Bu, koşulu neden tersine tersine " +"çeviremeyeceğinizin nedenidir, çünkü bunu yapabilseydiniz bu kural görmezden " +"gelinirdi." msgid "This Interval" msgstr "Bu aralık" -msgid "This limits how many results gnutella returns to other people searching your files." -msgstr "Bu Gnutella'nın dosyalarınızı arayanlara ne kadar sonuç gönderdiğini sınırlar." +msgid "" +"This limits how many results gnutella returns to other people searching your " +"files." +msgstr "" +"Bu Gnutella'nın dosyalarınızı arayanlara ne kadar sonuç gönderdiğini " +"sınırlar." msgid "" "This product includes GeoIP data created by MaxMind, available from\n" @@ -6279,8 +8425,12 @@ msgid "Ultrapeers" msgstr "Ultraeşler" -msgid "Until the configured percentage of outgoing HTTP bandwidth is in use, open additional upload slots on request." -msgstr "Ayarlanan dışarıya giden HTTP bant genişliği yüzdesine erişilmediği sürece istendiğinde yeni gönderme olukları aç." +msgid "" +"Until the configured percentage of outgoing HTTP bandwidth is in use, open " +"additional upload slots on request." +msgstr "" +"Ayarlanan dışarıya giden HTTP bant genişliği yüzdesine erişilmediği sürece " +"istendiğinde yeni gönderme olukları aç." msgid "Update search results pane every" msgstr "Arama sonuçları panosunu bu aralıkta güncelle" @@ -6313,7 +8463,7 @@ msgstr "Gerçekçi PARQ tahmini kullan" msgid "Use username and password to _authenticate to proxy" -msgstr "Vekilde oturum açmak için kullanıcı ismi ve _şifre kullan" +msgstr "Vekilde oturum açmak için kullanıcı ismi ve par_ola kullan" msgid "User Interface" msgstr "Kullanıcı arayüzü" @@ -6327,7 +8477,6 @@ msgid "Version" msgstr "Sürüm" -# wtf? That's a proper noun. msgid "Vidar Madsen" msgstr "Vidar Madsen" @@ -6341,10 +8490,10 @@ msgstr "Benzer sorguları izle" msgid "Watch hits for _alternate sources" -msgstr "Denkeşmeleri _alternatif kaynak bulmak için izle" +msgstr "İsabetlerii _alternatif kaynak bulmak için izle" msgid "What other people see as your connection speed." -msgstr "Başkalarının gördüğü bağlantı hızınız" +msgstr "Başkalarının gördüğü bağlantı hızınız." msgid "Write buffer size" msgstr "Yazma tampon boyutu" @@ -6352,33 +8501,72 @@ msgid "XML Metadata" msgstr "XML bilgisi" -# wtf? That's a proper noun. msgid "Yann Grossel" msgstr "Yann Grossel" -msgid "You appear to be TCP-firewalled, i.e. others cannot connect to you to download files. You will not see push results, which may prevent you from seeing a large amount of results." -msgstr "TCP protokolü açısından bir güvenlik duvarı arkasındasınız gibi görünüyor, ki bu başkalarının dosya indirmek için size bağlanamayacağı anlamına gelir. İtme sonuçlarını göremeyeceksiniz, bu arama sonuçlarının önemli bir kısmını göremeyeceksiniz demektir." +msgid "" +"You appear to be TCP-firewalled, i.e. others cannot connect to you to " +"download files. You will not see push results, which may prevent you from " +"seeing a large amount of results." +msgstr "" +"TCP protokolü açısından bir güvenlik duvarı arkasındasınız gibi görünüyor, " +"ki bu başkalarının dosya indirmek için size bağlanamayacağı anlamına gelir. " +"İtme sonuçlarını göremeyeceksiniz, bu arama sonuçlarının önemli bir kısmını " +"göremeyeceksiniz demektir." -msgid "You appear to be UDP-firewalled, i.e. you cannot receive unsolicited traffic via UDP. You will not be able to send queries requesting out-of-band delivery of query hits." -msgstr "UDP açısından bir güvenlik duvarı arkasındasınız gibi görünüyor, yani talep etmediğiniz UDP trafiğini alamayacaksınız. Bant dışı (OOB) sonuçlar isteyen sorgular da gönderemeyeceksiniz." +msgid "" +"You appear to be UDP-firewalled, i.e. you cannot receive unsolicited traffic " +"via UDP. You will not be able to send queries requesting out-of-band " +"delivery of query hits." +msgstr "" +"UDP açısından bir güvenlik duvarı arkasındasınız gibi görünüyor, yani talep " +"etmediğiniz UDP trafiğini alamayacaksınız. Bant dışı (OOB) sonuçlar isteyen " +"sorgular da gönderemeyeceksiniz." -msgid "You appear to be firewalled, both TCP-wise and UDP-wise. You will not see any push results, which may prevent you from seeing a large amount of results. You will not be able to send queries requesting out-of-band delivery of query hits. However, it is possible to punch a hole into the UDP firewall, so you will be able to send out-of-band query hits." -msgstr "Hem TCP hem de UDP açısından bir güvenlik duvarı arkasındasınız gibi görünüyor. Hiçbir itilen arama sonucu göremeyeceksiniz, ki bu yüksek sayıda arama sonucu göremeyeceğiniz anlamına gelir. Bant dışı (OOB) sonuçlar isteyen sorgular da gönderemeyeceksiniz. Ancak UDP güvenlik duvarında bir delik açmak mümkün, bunun sayesinde bant dışı arama sonuçları gönderebileceksiniz." +msgid "" +"You appear to be firewalled, both TCP-wise and UDP-wise. You will not see " +"any push results, which may prevent you from seeing a large amount of " +"results. You will not be able to send queries requesting out-of-band " +"delivery of query hits. However, it is possible to punch a hole into the UDP " +"firewall, so you will be able to send out-of-band query hits." +msgstr "" +"Hem TCP hem de UDP açısından bir güvenlik duvarı arkasındasınız gibi " +"görünüyor. Hiçbir itilen arama sonucu göremeyeceksiniz, ki bu yüksek sayıda " +"arama sonucu göremeyeceğiniz anlamına gelir. Bant dışı (OOB) sonuçlar " +"isteyen sorgular da gönderemeyeceksiniz. Ancak UDP güvenlik duvarında bir " +"delik açmak mümkün, bunun sayesinde bant dışı arama sonuçları " +"gönderebileceksiniz." -msgid "You appear to be firewalled, both TCP-wise and UDP-wise. You will not see any push results, which may prevent you from seeing a large amount of results. You will not be able to send queries requesting out-of-band delivery of query hits." -msgstr "Hem TCP hem de UDP açısından bir güvenlik duvarı arkasındasınız gibi görünüyor. Hiçbir itilen arama sonucu göremeyeceksiniz, ki bu yüksek sayıda arama sonucu göremeyeceğiniz anlamına gelir. Bant dışı (OOB) sonuçlar isteyen sorgular da gönderemeyeceksiniz." +msgid "" +"You appear to be firewalled, both TCP-wise and UDP-wise. You will not see " +"any push results, which may prevent you from seeing a large amount of " +"results. You will not be able to send queries requesting out-of-band " +"delivery of query hits." +msgstr "" +"Hem TCP hem de UDP açısından bir güvenlik duvarı arkasındasınız gibi " +"görünüyor. Hiçbir itilen arama sonucu göremeyeceksiniz, ki bu yüksek sayıda " +"arama sonucu göremeyeceğiniz anlamına gelir. Bant dışı (OOB) sonuçlar " +"isteyen sorgular da gönderemeyeceksiniz." msgid "You seem to be offline." msgstr "Çevrimdışı görünüyorsunuz." -msgid "Your uploads are stalling at an abnormal rate, indicating that your bandwidth is probably saturated. You should not run as an ultra node, and try to reduce the allocated bandwidth to gtk-gnutella to avoid saturating both your incoming and outgoing paths." -msgstr "Göndermeleriniz anormal bir oranda duraklıyor, ki bu bant genişliğinizin muhtemelen aşırı dolduğunu gösterir. Bu durumda ultra düğüm olarak bulunmamalısınız. Ayrıca gelen ve giden bağlantıların sıkışmasını önlemek için gtk-gnutella'ya ayrılan bant genişliğini azaltmanız önerilir." +msgid "" +"Your uploads are stalling at an abnormal rate, indicating that your " +"bandwidth is probably saturated. You should not run as an ultra node, and " +"try to reduce the allocated bandwidth to gtk-gnutella to avoid saturating " +"both your incoming and outgoing paths." +msgstr "" +"Göndermeleriniz anormal bir oranda duraklıyor, ki bu bant genişliğinizin " +"muhtemelen aşırı dolduğunu gösterir. Bu durumda ultra düğüm olarak " +"bulunmamalısınız. Ayrıca gelen ve giden bağlantıların sıkışmasını önlemek " +"için gtk-gnutella'ya ayrılan bant genişliğini azaltmanız önerilir." msgid "_About" msgstr "_Hakkında" msgid "_Add directory" -msgstr "Dizin _ekle" +msgstr "Klasör _ekle" msgid "_Browse" msgstr "_Gözat" @@ -6411,7 +8599,7 @@ msgstr "_SSS" msgid "_Feed mesh from hits" -msgstr "Topluluğa denkleşmelerden _veri ver" +msgstr "Topluluğa isabetlerden _veri ver" msgid "_File" msgstr "_Dosya" @@ -6574,7 +8762,6 @@ msgid "items" msgstr "öğe" -# note: 'to peers' is translated in the first part of the complete sentence. msgid "kbps to peers" msgstr "kbps" @@ -6597,7 +8784,7 @@ msgstr "saniye" msgid "secs " -msgstr "saniyede yeniden dene" +msgstr "saniyede yeniden dene " msgid "secs" msgstr "sn" @@ -6644,8 +8831,8 @@ msgid "Disabled stealing of outgoing HTTP bandwidth." msgstr "Dışarıya giden HTTP bant genişliğini çalma devre dışı." -msgid "Splitting ougoing HTTP bandwidth evenly." -msgstr "Dışarıya giden HTTP bant genişliği eşit dağıtılıyor." +msgid "Splitting outgoing HTTP bandwidth evenly." +msgstr "Dışarıya giden HTTP bant genişliği eşit bir şekilde paylaştırılıyor." msgid "Capping HTTP outgoing bandwidth." msgstr "Dışarıya HTTP bant genişliği sınırlanıyor." @@ -6653,8 +8840,11 @@ msgid "Port mapping possible through UPnP or NAT-PMP." msgstr "Port haritalaması UPnP ve NAT-PMP ile mümkün." -msgid "Port mapping configured through UPnP or NAT-PMP." -msgstr "Port haritalama UPnP ya da NAT-PMP ile yapılandırıldı." +msgid "Port mapping configured through NAT-PMP." +msgstr "Port haritalama NAT-PMP ile yapılandırıldı." + +msgid "Port mapping configured through UPnP." +msgstr "Port haritalama UPnP ile yapılandırıldı." msgid "Enable UPnP" msgstr "UPnP'yi etkinleştir" @@ -6668,8 +8858,8 @@ msgid "Pipelining max chunk size" msgstr "Uç uca ekleme azami parça boyutu" -msgid "Enable upload of patial files deemed rare" -msgstr "Nadir varsayılan tamamlanmamış dosyaların gönderimini etkinleştir" +msgid "Enable upload of partial files deemed rare" +msgstr "Tamamlanmamış nadir dosyaların gönderilmesine izin ver" msgid "Enable GUESS (additional querying)" msgstr "GUESS'i etkinleştir (ek sorgular)" @@ -6737,6 +8927,9 @@ msgid "Discard results bearing an alien IP address" msgstr "Yabancı İP adresi taşıyan sonuçları at" +msgid "Discard results bearing a banned GUID" +msgstr "Yasaklı GUİD taşıyan sonuçları at" + msgid "Restart session-only searches with pending downloads" msgstr "Oturuma mahsus ve bekleyen indirmeleri olan aramaları sürdür" @@ -6752,8 +8945,25 @@ msgid "Relayed queries remembered" msgstr "Hatırlanan aktarılmış sorgular" -msgid "Not in database" -msgstr "Veritabanında mevcut değil" +msgid "Allow unused Gnutella outgoing bandwidth to supersede hint" +msgstr "" +"Kullanılmayan dışarıya giden Gnutella bant genişliğinin ayarlanan değerin " +"yerine geçmesine izin ver" + +msgid "Display GUESS statistics" +msgstr "GUESS istatistiklerini göster" + +msgid "Mapping lease time" +msgstr "Haritalama kira süresi" + +msgid "G2 hubs" +msgstr "G2 hubları" + +msgid "Enable the G2 network" +msgstr "G2 şebekesini etkinleştir" + +msgid " G2, " +msgstr " G2, " msgid "owned" msgstr "sahibiz" @@ -6768,19 +8978,19 @@ msgid "Created %u download" msgid_plural "Created %u downloads" msgstr0 "%u indirme oluşturuldu" +msgstr1 "%u indirme oluşturuldu" #, c-format msgid "Discarded %u result" msgid_plural "Discarded %u results" msgstr0 "%u sonuç atıldı" - -msgid "Query queued..." -msgstr "Sorgu kuyruğa eklendi..." +msgstr1 "%u sonuç atıldı" #, c-format msgid "%u term counted" msgid_plural "%u terms counted" msgstr0 "%u terim sayıldı" +msgstr1 "%u terim sayıldı" #, c-format msgid "Couldn't find pixmap file: %s" @@ -6791,7 +9001,7 @@ msgstr "Pixmap dosyası yüklenemedi: %s" msgid " (partial)" -msgstr "(kısmi)" +msgstr " (kısmi)" msgid "Cache contains" msgstr "Önbellekteki İP'ler" @@ -6817,8 +9027,11 @@ msgid "_Auto-hide leaf traffic stats" msgstr "Yaprak trafiği istatistiklerini _otomatik sakla" +msgid "Glossary" +msgstr "" + msgid "_Search" -msgstr "A_rama" +msgstr "A_ra" msgid "What's New?" msgstr "Yeni olanlar" @@ -6829,9 +9042,6 @@ msgid "CPU overloaded" msgstr "Mikroişlemcide aşırı yük" -msgid "Splitting outgoing HTTP bandwidth evenly." -msgstr "Dışarıya giden HTTP bant genişliği eşit bir şekilde paylaştırılıyor." - msgid "Connect to" msgstr "Bağlan" @@ -6853,8 +9063,12 @@ msgid "connections to connect more quickly while not all slots are used." msgstr "bağlantı kullan." -msgid "The Global Unique IDentifier associated with this node. It's used for routing packets in the Gnutella network." -msgstr "Bu düğüm ile ilişkili global benzersiz tanımlayıcı (Global Unique IDentifier). Gnutella ağında paketleri yönlendirme için kullanılır." +msgid "" +"The Global Unique IDentifier associated with this node. It's used for " +"routing packets in the Gnutella network." +msgstr "" +"Bu düğüm ile ilişkili global benzersiz tanımlayıcı (Global Unique " +"IDentifier). Gnutella ağında paketleri yönlendirme için kullanılır." msgid "GUID placeholder" msgstr "GUID alan tutucu" @@ -6869,13 +9083,19 @@ msgstr "IP:port alan tutucu" msgid "Served " -msgstr "Tamamlanmış " +msgstr "Sunulmuş" -msgid "BH HTML served" -msgstr "BH HTML yollandı" +msgid "G2 served" +msgstr "G2 sunulmuş" msgid " / " -msgstr "/" +msgstr " / " + +msgid "G2" +msgstr "G2" + +msgid "BH HTML served" +msgstr "BH HTML yollandı" msgid "BH HTML" msgstr "BH HTML" @@ -6937,8 +9157,12 @@ msgid "Port Mapping" msgstr "Port haritalama" -msgid "This option can give performance boosts to those on a large network with many peers by trying to locate files on the local networks first." -msgstr "Bu seçenek dosyaları önce yerel ağlarda bulamaya çalışarak çok eşler bulunan büyük bir şebekedeki kullanıcıların performansını arttırabilir." +msgid "" +"This option can give performance boosts to those on a large network with " +"many peers by trying to locate files on the local networks first." +msgstr "" +"Bu seçenek dosyaları önce yerel ağlarda bulamaya çalışarak çok eşler bulunan " +"büyük bir şebekedeki kullanıcıların performansını arttırabilir." msgid "_Addresses of local network(s)" msgstr "Yerel ağ _adresleri" @@ -6949,7 +9173,6 @@ msgid "slots" msgstr "oluk" -# Used the French translation as a basis and copied from there (assuming s stands for seconds or saniye in Turkish). msgid "unit_of_time|s" msgstr "s" @@ -6959,9 +9182,6 @@ msgid "Maximum percentage of connection slots a vendor can occupy." msgstr "Bir sağlayıcının kullanabileceği azami oluk yüzdesi." -msgid "Global DHT ougoing traffic" -msgstr "Genel dışarıya çıkan DHT trafiği" - msgid "attempts" msgstr "deneme" @@ -6969,10 +9189,7 @@ msgstr "Uç uca parçaların azami boyutu" msgid "_Remove directory" -msgstr "Dizini _kaldır" - -msgid "Enable upload of partial files deemed rare" -msgstr "Tamamlanmamış nadir dosyaların gönderilmesine izin ver" +msgstr "Klasörü _kaldır" msgid "Minimum chunk _size" msgstr "Asgari parça _boyutu" @@ -6980,7 +9197,6 @@ msgid "Show a status _icon" msgstr "Durum ikonu göster" -# original: colon missing? msgid "Avg. downtime of this servent" msgstr "Bu istemcinin ortalama devre dışı süresi" @@ -7021,6 +9237,9 @@ msgid "Reverse lookup in progress..." msgstr "Ters arama sürüyor..." +msgid "UDP (semi-reliable)" +msgstr "UDP (yarı güvenilir)" + msgid "Size:" msgstr "Boyut:" @@ -7045,6 +9264,12 @@ msgid "Valid IPv6 ultra" msgstr "Geçerli İPv6 ultra" +msgid "Fresh G2 hub" +msgstr "Taze G2 hub" + +msgid "Valid G2 hub" +msgstr "Geçerli G2 hub" + msgid "Unstable" msgstr "Kararsız" @@ -7075,17 +9300,30 @@ msgid "%d second" msgid_plural "%d seconds" msgstr0 "%d saniye" +msgstr1 "%d saniye" -msgid "<html><head><title>Frequently Asked Questions</title></head><body><p>The FAQ document could not be loaded. Please read the <a href=\"http://gtk-gnutella.sourceforge.net/?page=faq\">FAQ online</a> instead.</p></body></html>" -msgstr "<html><head><title>Sık Sorulan Sorular</title></head><body><p>SSS belgesi yüklenemedi. Yerine çevrimiçi <a href=\"http://gtk-gnutella.sourceforge.net/?page=faq\">belgeyi</a> okuyunuz.</p></body></html>" +msgid "" +"<html><head><title>Frequently Asked Questions</title></head><body><p>The FAQ " +"document could not be loaded. Please read the <a href=\"http://gtk-gnutella." +"sourceforge.net/?page=faq\">FAQ online</a> instead.</p></body></html>" +msgstr "" +"<html><head><title>Sık Sorulan Sorular</title></head><body><p>SSS belgesi " +"yüklenemedi. Yerine çevrimiçi <a href=\"http://gtk-gnutella.sourceforge.net/?" +"page=faq\">belgeyi</a> okuyunuz.</p></body></html>" + +msgid "" +"<html><head><title>Glossary</title></head><body><p>The glossary document " +"could not be loaded.</p></body></html>" +msgstr "" #, c-format msgid "%lu file shared (%s)" msgid_plural "%lu files shared (%s)" msgstr0 "%lu paylaşılan dosya (%s)" +msgstr1 "%lu paylaşılan dosya (%s)" msgid "(avg)" -msgstr "(ortalama)" +msgstr "(vasati)" msgid "Hello sent" msgstr "Hello gönderildi" @@ -7101,7 +9339,7 @@ msgstr "Kapatılıyor: %s %us sonra duracak RX=%u Q=%u,%u%%" msgid "Removing" -msgstr "Kaldırıyor" +msgstr "Kaldırılıyor" msgid "Receiving hello" msgstr "Hello alınıyor" @@ -7109,6 +9347,9 @@ msgid "UNKNOWN STATUS" msgstr "BİLİNMEYEN DURUM" +msgid "g2" +msgstr "g2" + msgid "busy" msgstr "meşgul" @@ -7151,16 +9392,88 @@ msgstr "Bu oturumla beraber sona erecektir" #, c-format -msgid "%u %s (%u skipped, %u ignored, %u hidden, %u auto-d/l, %u %s) Hits: %u (%u TCP, %u UDP)" -msgstr "%u %s (%u atlandı, %u görmezden gelindi, %u saklı, %u otomatik-indirme, %u %s) Sonuçlar: %u (%u TCP, %u UDP)" +msgid " %u download" +msgid_plural " %u downloads" +msgstr0 " %u indirme" +msgstr1 " %u indirme" + +#, c-format +msgid "" +"%u %s (%u skipped, %u ignored, %u hidden, %u auto-d/l, %u %s) Hits: %u (%u " +"TCP, %u UDP)" +msgstr "" +"%u %s (%u atlandı, %u görmezden gelindi, %u saklı, %u otomatik-indirme, %u " +"%s) Sonuçlar: %u (%u TCP, %u UDP)" msgid "item" msgid_plural "items" msgstr0 "öğe" +msgstr1 "öğe" msgid "dupe" msgid_plural "dupes" msgstr0 "çift" +msgstr1 "çift" + +msgid "No GUESS queries run yet" +msgstr "Henüz hiçbir GUESS sorgusu kullanılmamıştır" + +#, c-format +msgid " previous took %s querying %zu %s with %zu %s kept" +msgstr " önceki %s aldı sorgulanan %zu %s ile %zu %s tutuldu" + +msgid "host" +msgid_plural "hosts" +msgstr0 "makine" +msgstr1 "makine" + +msgid "hit" +msgid_plural "hits" +msgstr0 "eşleşme" +msgstr1 "eşleşme" + +#, c-format +msgid "GUESS %s Total: %zu %s (%s %s, %s kept, %s queries, %s keys)%s" +msgstr "GUESS %s Toplam: %zu %s (%s %s, %s tutuldu, %s sorgu, %s anahtar)%s" + +msgid "idle" +msgstr "aylak" + +msgid "query" +msgid_plural "queries" +msgstr0 "sorgu" +msgstr1 "sorgu" + +#, c-format +msgid "" +"GUESS %s %s (%zu %s, %zu kept, %s queries, %s keys) Pool: %zu %s, (%zu+" +"%zu)/%zu queried, %zu %s (%.2f%%), %zu reached, %zu pending, %zu %s%s%s" +msgstr "" +"GUESS %s %s (%zu %s, %zu tutulmuş, %s sorgu, %s anahtar) Pool: %zu %s, " +"(%zu+%zu)/%zu sorgulanmış, %zu %s (%.2f%%), %zu erişilmiş, %zu beklemede, " +"%zu %s%s%s" + +msgid "loose" +msgstr "serbest" + +msgid "bounded" +msgstr "kısıtlı" + +msgid "ack" +msgid_plural "acks" +msgstr0 "acks" +msgstr1 "acks" + +msgid "hop" +msgid_plural "hops" +msgstr0 "hops" +msgstr1 "hops" + +msgid " (load pending)" +msgstr " (yükleme bekleniyor)" + +msgid " (end if starving)" +msgstr " (bittiyse dur)" msgid "Passive" msgstr "Pasif" @@ -7193,11 +9506,13 @@ msgid "%u download" msgid_plural "%u downloads" msgstr0 "%u indirme" +msgstr1 "%u indirme" #, c-format msgid "%u search" msgid_plural "%u searches" msgstr0 "%u arama" +msgstr1 "%u arama" #, c-format msgid "Handled magnet link (%s, %s)." @@ -7228,7 +9543,7 @@ msgstr "Bilgisayar adresi okunamadı" msgid "The query string is not UTF-8 encoded" -msgstr "Sorgu metni UTF-8 ile kodlanmamıştır." +msgstr "Sorgu metni UTF-8 ile kodlanmamıştır" msgid "Unhandled search prefix." msgstr "İşlenmeyen arama ön eki." @@ -7242,7 +9557,7 @@ msgstr "%s için kişiye gözatım başlatılamadı" msgid "Show search list" -msgstr "Arama listesini göster." +msgstr "Arama listesini göster" msgid "Extension" msgstr "Uzantı" @@ -7280,6 +9595,16 @@ msgid "Partial" msgstr "Kısmi" +#, c-format +msgid "%s %.2f%%" +msgstr "%s %.2f%%" + +msgid "Available" +msgstr "Mevcut" + +msgid "Last modification" +msgstr "Son değişim" + msgid "Latinized" msgstr "Latinleştirilmiş" @@ -7293,7 +9618,10 @@ msgstr "Bilgisayar hakkında" msgid "Hostname" -msgstr "Bilgisayar adı" +msgstr "Makine adı" + +msgid "banned" +msgstr "yasaklandı" msgid "Servent ID" msgstr "İstemci kimliği" @@ -7352,43 +9680,42 @@ msgid "The URN in the search text is invalid." msgstr "Arama metnindeki URN geçersiz." -msgid "SHA-1 is unknown." -msgstr "SHA-1 bilinmiyor." - -msgid "No Bitzi ticket requested yet." -msgstr "Henüz hiçbir Bitzi bileti istenmedi." - -msgid "Not in Bitzi database." -msgstr "Bitzi veritabanında mevcut değil" - msgid "Encoding" msgstr "Kodlama" msgid "#" msgstr "#" -msgid "Metadata" -msgstr "Metaveriler" - msgid "Never" msgstr "Hiçbir zaman" #, c-format msgid "%u/%u host (%u%%)" msgid_plural "%u/%u hosts (%u%%)" -msgstr0 "%u/%u bilgisayar (%u%%)" +msgstr0 "%u/%u makine (%u%%)" +msgstr1 "%u/%u makine (%u%%)" msgid "loading..." msgstr "yükleniyor..." msgid "Reading host cache..." -msgstr "Bilgisayar arabelleği okunuyor..." +msgstr "Makine arabelleği okunuyor..." msgid "Reading ultra cache..." msgstr "Ultra arabelleği okunuyor..." -msgid "<html><head><title>Ancient version detected!</title></head><body><h1>Warning</h1><p>This version of gtk-gnutella is pretty old. Please visit <a href=\"http://gtk-gnutella.sourceforge.net/\">http://gtk-gnutella.sourceforge.net/</a> and update your copy of gtk-gnutella.</p></body></html>" -msgstr "<html><head><title>Eski sürüm tespit edildi!</title></head><body><h1>Dikkat</h1><p>Bu gtk-gnutella sürümü artık eski kabul edilir. Lüften <a href=\"http://gtk-gnutella.sourceforge.net/\">http://gtk-gnutella.sourceforge.net/</a> sitesini ziyaret edin ve gtk-gnutella kopyanızı güncelleştirin.</p></body></html>" +msgid "" +"<html><head><title>Ancient version detected!</title></" +"head><body><h1>Warning</h1><p>This version of gtk-gnutella is pretty old. " +"Please visit <a href=\"http://gtk-gnutella.sourceforge.net/\">http://gtk-" +"gnutella.sourceforge.net/</a> and update your copy of gtk-gnutella.</p></" +"body></html>" +msgstr "" +"<html><head><title>Eski sürüm tespit edildi!</title></head><body><h1>Dikkat</" +"h1><p>Bu gtk-gnutella sürümü artık eski kabul edilir. Lüften <a href=" +"\"http://gtk-gnutella.sourceforge.net/\">http://gtk-gnutella.sourceforge.net/" +"</a> sitesini ziyaret edin ve gtk-gnutella kopyanızı güncelleştirin.</p></" +"body></html>" msgid "*** RUNNING AN OLD VERSION! ***" msgstr "*** ESKİ BİR SÜRÜM KULLANIYORSUNUZ! ***" @@ -7396,6 +9723,13 @@ msgid "*** CPU OVERLOADED -- TRYING TO SAVE CYCLES ***" msgstr "*** MİKROİŞLEMCİDE AŞIRI YÜK -- AZALTMAYA ÇALIŞIYORUZ ***" +msgid "*** KERNEL BUFFER SHORTAGE -- LIMITING TCP CONNECTIONS ***" +msgstr "" +"*** KERNEL ARABELLEĞİ YETERSİZLİĞİ -- TCP BAĞLANTILARI SINIRLANIYOR ***" + +msgid "*** NO LISTENING TCP SOCKET -- NO INBOUND CONNECTIONS ***" +msgstr "" + msgid "*** UPLOADS STALLING, BANDWIDTH SHORTAGE? ***" msgstr "*** GÖNDERMELER DURAKLIYOR, BANT GENİŞLİĞİ YETERSİZ Mİ? ***" @@ -7412,6 +9746,7 @@ msgid "*** VERSION WILL BECOME OLD IN %d DAY! ***" msgid_plural "*** VERSION WILL BECOME OLD IN %d DAYS! ***" msgstr0 "*** BU SÜRÜM %d GÜN SONRA ESKİ SAYILACAKTIR! ***" +msgstr1 "*** BU SÜRÜM %d GÜN SONRA ESKİ SAYILACAKTIR! ***" #, c-format msgid "Address/port changed to: %s" @@ -7424,6 +9759,7 @@ msgid "%u source" msgid_plural "%u sources" msgstr0 "%u kaynak" +msgstr1 "%u kaynak" #, c-format msgid "%u active" @@ -7434,23 +9770,23 @@ msgstr "%u kuyrukta" #, c-format -msgid "%u/%u connection" -msgid_plural "%u/%u connections" -msgstr0 "%u/%u bağlantı" - -#, c-format msgid "%u/%u upload" msgid_plural "%u/%u uploads" msgstr0 "%u/%u gönderme" +msgstr1 "%u/%u gönderme" #, c-format msgid "%u/%u download" msgid_plural "%u/%u downloads" msgstr0 "%u/%u indirme" +msgstr1 "%u/%u indirme" msgid "Queue frozen" msgstr "Kuyruk donduruldu" +msgid "Internal" +msgstr "" + msgid "Select a property to see its description." msgstr "Görüntülemek için bir özellik seçin." @@ -7468,7 +9804,7 @@ msgstr "< 1s" msgid "(quick) " -msgstr "(çabuk)" +msgstr "(çabuk) " #, c-format msgid " E=%u" @@ -7492,7 +9828,7 @@ msgstr "İstek bekleniyor..." msgid "Reading follow-up request..." -msgstr "İstek bekleniyor..." +msgstr "Sonraki istek bekleniyor..." msgid "Transmission aborted" msgstr "Aktarım iptal edildi" @@ -7515,16 +9851,3 @@ msgid "Sent QUEUE, waiting for headers..." msgstr "QUEUE yollandı, başlıklar bekleniyor..." - -#, fuzzy -#~ msgid "Index" -#~ msgstr "İçerik:" - -#, fuzzy -#~ msgid "Seaerch Media Type" -#~ msgstr "Arama terimi" -#~ msgid "Banned: %s" -#~ msgstr "Yasaklandı: %s" -#~ msgid "Connecting" -#~ msgstr "Bağlanıyor" -
View file
gtk-gnutella-0.98.2.tar.bz2/po/uk.po -> gtk-gnutella-1.1.9.tar.bz2/po/uk.po
Changed
@@ -1,31 +1,34 @@ -# $Id$ -# -# Ukrainian translation for gtk-gnutella package. -# Copyright (C) 2000-2001 Yann Grossel. -# Copyright (C) 2001-2010 Raphaël Manfredi. -# This file is distributed under the same license as the gtk-gnutella package. -# Vitaliy Buyar <vetal17@gmail.com>, 2005. +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Raphael Manfredi +# This file is distributed under the same license as the PACKAGE package. # +# Translators: +# Igor Seryogin <igor.v.seryogin@gmail.com>, 2015 +# Vitaliy Buyar <vetal17@gmail.com>, 2005 +# Yuri Chornoivan <yurchor@ukr.net>, 2012 msgid "" msgstr "" -"Project-Id-Version: gtk-gnutella 0.96.7u\n" +"Project-Id-Version: gtk-gnutella\n" "Report-Msgid-Bugs-To: gtk-gnutella-devel@lists.sf.net\n" -"POT-Creation-Date: 2011-11-22 18:27+0100\n" -"PO-Revision-Date: 2006-07-13 22:09-0400\n" -"Last-Translator: Vitalik\n" -"Language-Team: <uk@li.org>\n" +"POT-Creation-Date: 2016-03-06 08:49+0100\n" +"PO-Revision-Date: 2016-02-15 08:28+0000\n" +"Last-Translator: Jeroen Asselman <jeroen@asselman.com>\n" +"Language-Team: Ukrainian (http://www.transifex.com/gtk-gnutella/gtk-gnutella/" +"language/uk/)\n" +"Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: \n" -"Plural-Forms: nplurals=2; plural=(n%10==1 && n%100!=11 ? 0 : 1);\n" -"X-Generator: KBabel 1.11.1\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#, c-format -msgid "%s%s%s%s%s fps, %s kbps" +msgid "Harmful version banned, upgrade required" +msgstr "" + +msgid "Connection refused" msgstr "" -msgid "times|x" +msgid "Use an open Gnutella or G2 servent" msgstr "" #, c-format @@ -36,24 +39,21 @@ msgid "Stopped (%s)" msgstr "Зупинено (%s)" -#, fuzzy, c-format +#, c-format msgid "Too many attempts (%u times)" -msgstr "Забагато спроб (%d раз(а)(ів))" +msgstr "Забагато спроб (%u раз)" -#, fuzzy msgid "Requeued due to no push-proxy" -msgstr "Поставлено в чергу через зміну інформації про файл" +msgstr "" -#, fuzzy msgid "Requeued due to file removal" -msgstr "Поставлено в чергу через зміну інформації про файл" +msgstr "" msgid "Requeued by file info change" msgstr "Поставлено в чергу через зміну інформації про файл" -#, fuzzy msgid "Duplicate download" -msgstr "показувати _Звантаження" +msgstr "" msgid "Nothing else to switch to" msgstr "" @@ -63,7 +63,7 @@ msgstr "" #, c-format -msgid " at %s - rescheduled for %s%s #%u" +msgid " at %s" msgstr "" msgid "Suspended (SHA1 checking)" @@ -74,24 +74,25 @@ msgstr "" msgid "Paused" -msgstr "" +msgstr "Призупинено" msgid "Nothing more to get" msgstr "" msgid "Waiting for a free chunk" -msgstr "Чекаєм на вільний кусок (chunk)" +msgstr "Очікуємо на вільний шматок" msgid "No more gaps to fill" msgstr "" -#, fuzzy msgid "Download queue is frozen" -msgstr "Черга затримана" +msgstr "" + +msgid "Network buffer shortage" +msgstr "" -#, fuzzy msgid "No download slot (start)" -msgstr "Немає слоту для скачування" +msgstr "" msgid "Connection failed (Out of file descriptors?)" msgstr "З'єднання провалилось (більше немає описів файла)" @@ -99,37 +100,41 @@ msgid "Connection failed" msgstr "З'єднання не відбулось" +msgid "SHA1 mismatch detected" +msgstr "" + msgid "Waiting for server PROX publishing" msgstr "" -#, fuzzy msgid "Waiting for push route" -msgstr "Чекаєм на вільний кусок (chunk)" +msgstr "" -#, fuzzy msgid "Push route lost" -msgstr "Шлях втрачено" +msgstr "" msgid "Ignoring Push flag" -msgstr "Ігноруєм Push прапорець" +msgstr "Ігноруємо прапорець Push" -#, fuzzy, c-format +#, c-format msgid "No direct connection yet (%u retry)" msgid_plural "No direct connection yet (%u retries)" -msgstr0 "Прямого з'єднання поки що немає (%d спроба)" -msgstr1 "Прямого з'єднання поки що немає (%d спроб)" +msgstr0 "" +msgstr1 "" +msgstr2 "" -#, fuzzy, c-format +#, c-format msgid "Timeout (%u retry)" msgid_plural "Timeout (%u retries)" -msgstr0 "Тайм-аут (%d спроба)" -msgstr1 "Тайм-аут (%d спроб)" +msgstr0 "" +msgstr1 "" +msgstr2 "" -#, fuzzy, c-format +#, c-format msgid "Connection refused (%u retry)" msgid_plural "Connection refused (%u retries)" -msgstr0 "У з'єднанні відмовленно (%d спроба)" -msgstr1 "У з'єднанні відмовленно (%d спроб)" +msgstr0 "" +msgstr1 "" +msgstr2 "" msgid "Dup SHA1 during creation" msgstr "Dup SHA1 during creation" @@ -152,13 +157,12 @@ msgid "Explicitly requeued" msgstr "Потрібне роз'яснення" -#, fuzzy msgid "Failed (Header line too large)" -msgstr "Провалилось (Помилка: %s)" +msgstr "" #, c-format msgid "Failed (%s)" -msgstr "" +msgstr "Помилка (%s)" msgid "Failed (Input buffer full)" msgstr "" @@ -169,20 +173,20 @@ msgid "Stopped (EOF) <err_header_read_eof>" msgstr "" -#, fuzzy, c-format +#, c-format msgid "Can't check resume data: %s" -msgstr "Не можливо зберегти дані: %s" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Can't stat opened file: %s" -msgstr "Не можливо зберегти дані: %s" +msgstr "" msgid "Stopped (Output file size changed)" msgstr "Зупинено (Змінився розмір кінцевого файла)" -#, fuzzy, c-format +#, c-format msgid "Can't read resume data: %s" -msgstr "Не можливо зберегти дані: %s" +msgstr "" msgid "Short read on resume data" msgstr "" @@ -202,7 +206,7 @@ msgstr "" msgid "Chunk done, connection closed" -msgstr "Кусок закінчено, з'єднання закрито" +msgstr "Шматок отримано, з'єднання закрито" #, c-format msgid "Switching to \"%s\"" @@ -211,13 +215,11 @@ msgid "Requeued by competing download" msgstr "" -#, fuzzy msgid "Weird HTTP status" -msgstr "Незвичайний статус HTTP (protocol desync?)" +msgstr "" -#, fuzzy msgid "Download was a duplicate" -msgstr "Скачано" +msgstr "" msgid "Filesize mismatch" msgstr "" @@ -246,13 +248,12 @@ msgid "More data to sink than expected" msgstr "" -#, fuzzy msgid "Stopped data (EOF)" -msgstr "Зупинено (%s)" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Stopped data (%s)" -msgstr "Зупинено (%s)" +msgstr "" #, c-format msgid "Failed (Read error: %s)" @@ -268,6 +269,9 @@ msgid "No support for Content-Encoding (%s)" msgstr "" +msgid "Incomplete headers during TLS upgrade" +msgstr "" + msgid "Spammer detected" msgstr "" @@ -289,7 +293,7 @@ msgstr "" msgid "Queued" -msgstr "Поставлено в чергу" +msgstr "Поставлено до черги" #, c-format msgid " (slot %d" @@ -297,7 +301,7 @@ #, c-format msgid ", ETA: %s" -msgstr "" +msgstr ", час: %s" msgid "Server did not supply identification" msgstr "" @@ -326,20 +330,24 @@ msgid "No Content-Length header" msgstr "" -#, fuzzy +msgid "Unexpected Content-Type" +msgstr "" + +msgid "No Content-Type" +msgstr "" + msgid "Search already closed" -msgstr "Пошук додано" +msgstr "" -#, fuzzy msgid "THEX download aborted" -msgstr "Скачано" +msgstr "" msgid "Pipeline flow stopped" msgstr "" -#, fuzzy, c-format +#, c-format msgid "Cannot open %s: %s" -msgstr "Не можливо зберегти дані: %s" +msgstr "" msgid "Cannot resume: file gone" msgstr "" @@ -359,29 +367,35 @@ #, c-format msgid "Write failed: %s" -msgstr "" +msgstr "Помилка запису: %s" msgid "Malformed push reply" msgstr "" -msgid "SHA1 mismatch detected" -msgstr "" - msgid ", inbound" -msgstr "" +msgstr ", вхідне" msgid ", outbound" +msgstr ", вихідне" + +msgid ", no-pipeline" msgstr "" msgid ", banning" -msgstr "" +msgstr ", блокуємо" msgid ", g2" +msgstr ", g2" + +msgid ", fake-g2" msgstr "" -#, fuzzy msgid ", vendor?" -msgstr "Версія" +msgstr ", виробник?" + +#, c-format +msgid "<Browse G2 Host %s>" +msgstr "" #, c-format msgid "<Browse Host %s>" @@ -400,9 +414,8 @@ msgid "No longer connected" msgstr "Роз'єднано" -#, fuzzy msgid "Too many data timeouts" -msgstr "Забагато спроб (%d раз(а)(ів))" +msgstr "" msgid "Timeout" msgstr "Тайм-аут" @@ -410,12 +423,18 @@ msgid "Requeued due to timeout" msgstr "" +msgid "Partial file removed" +msgstr "" + +msgid "File info being reset" +msgstr "" + #, c-format msgid "Downloading (TR: %s)" msgstr "" msgid "Seeding" -msgstr "" +msgstr "Поширення" msgid "Computing TTH" msgstr "" @@ -423,23 +442,20 @@ msgid "Computing SHA1" msgstr "" -#, fuzzy msgid "Waiting for TTH check" -msgstr "Чекаєм на вільний кусок (chunk)" +msgstr "" -#, fuzzy msgid "Waiting for SHA1 check" -msgstr "Чекаєм на вільний кусок (chunk)" +msgstr "" msgid "SHA1" -msgstr "" +msgstr "SHA1" msgid "OK" -msgstr "" +msgstr "Гаразд" -#, fuzzy msgid "failed" -msgstr "файл" +msgstr "помилка" msgid "not computed yet" msgstr "" @@ -448,20 +464,20 @@ msgstr "" msgid "Moving" -msgstr "" +msgstr "Пересування" msgid "Finished" -msgstr "" +msgstr "Завершено" msgid "No sources" -msgstr "Немає " +msgstr "Немає джерел" #, c-format msgid "Queued (%u active, %u passive)" -msgstr "" +msgstr "У черзі (активних: %u, пасивних: %u)" msgid "Waiting" -msgstr "" +msgstr "Очікування" msgid "Querying DHT" msgstr "" @@ -474,162 +490,30 @@ msgid_plural "%u/%u successful DHT lookups" msgstr0 "" msgstr1 "" +msgstr2 "" #, c-format msgid "%u DHT lookup" msgid_plural "%u DHT lookups" msgstr0 "" msgstr1 "" +msgstr2 "" #, c-format msgid "Got %d host from %s" msgid_plural "Got %d hosts from %s" msgstr0 "" msgstr1 "" +msgstr2 "" #, c-format -msgid "Bootstrapping from %s" -msgstr "" - -msgid "Bad size" -msgstr "Неправильний розмір" - -msgid "Too small" -msgstr "Замаленьке" - -msgid "Too large" -msgstr "Завелике" - -msgid "Way too large" -msgstr "" - -msgid "Unknown message type" -msgstr "Невідомий ти повідомлення" - -msgid "Unexpected message" -msgstr "Неочікуване повідомлення" - -msgid "Message sent with TTL = 0" -msgstr "Повідомлення відіслане з TTL = 0" - -msgid "Improper hops/ttl combination" -msgstr "" - -msgid "Max TTL exceeded" -msgstr "Досягнено кількість TTL" - -msgid "Message throttle" -msgstr "" - -#, fuzzy -msgid "Message matched limits" -msgstr "Загальна статистика" - -msgid "Unusable Pong" -msgstr "" - -msgid "Hard TTL limit reached" -msgstr "" - -msgid "Max hop count reached" -msgstr "" - -msgid "Route lost" -msgstr "Шлях втрачено" - -msgid "No route" -msgstr "Немає роуту" - -msgid "Duplicate message" -msgstr "" - -msgid "Message to banned GUID" -msgstr "" - -msgid "Message from banned GUID" -msgstr "" - -msgid "Node shutting down" -msgstr "" - -msgid "TX flow control" -msgstr "" - -msgid "Query text had no trailing NUL" -msgstr "" - -msgid "Query text too short" -msgstr "" - -msgid "Query had unnecessary overhead" -msgstr "" - -msgid "Query had bad URN" -msgstr "" - -msgid "Message with malformed SHA1" -msgstr "" - -msgid "Message with malformed UTF-8" -msgstr "" - -msgid "Malformed Query Hit" -msgstr "" - -msgid "Bad return address" -msgstr "" - -msgid "Hostile IP address" -msgstr "" - -msgid "Bogus result from Morpheus" -msgstr "" - -msgid "Spam" -msgstr "Спем" - -#, fuzzy -msgid "Evil filename" -msgstr "Назва файла:" - -#, fuzzy -msgid "Improper media type" -msgstr "Пошук додано" - -msgid "Payload inflating error" -msgstr "" - -msgid "Unknown header flags present" -msgstr "" - -msgid "Own search results" -msgstr "" - -msgid "Own queries" -msgstr "" - -msgid "Ancient query format" -msgstr "" - -msgid "Blank Servent ID" -msgstr "" - -msgid "GUESS Query missing token" -msgstr "" - -msgid "GUESS Invalid query token" -msgstr "" - -msgid "DHT Invalid security token" +msgid "Connecting to web cache %s" msgstr "" -msgid "DHT Too many STORE requests" +#, c-format +msgid "Bootstrapping from %s" msgstr "" -#, fuzzy -msgid "DHT Malformed message" -msgstr "Спотворена команда" - #, c-format msgid "Shutdown (%s)" msgstr "" @@ -639,34 +523,18 @@ msgid_plural "Got %d connection pongs" msgstr0 "" msgstr1 "" +msgstr2 "" -msgid "Sent crawling info" -msgstr "" - -msgid "Cannot setup compressing TX stack" +msgid "Gnet connections disabled" msgstr "" -#, c-format -msgid "Got BYE %d %.*s" -msgstr "До побачення %d %.*s" - -#, c-format -msgid "Weird HELLO %s" -msgstr "Дивне HELLO %s" +msgid "Connection not compressed" +msgstr "З'єднання без стискання" #, c-format -msgid "HELLO %s error %d (%s)" -msgstr "" - -msgid "Shielded node" -msgstr "Захищений вузол" - -msgid "Gnet connections disabled" +msgid "Too many G2 hubs (%u max)" msgstr "" -msgid "Connection not compressed" -msgstr "З'єднання не компресоване" - #, c-format msgid "Too many leaves (%d max)" msgstr "" @@ -692,6 +560,9 @@ msgid "Not an ultra node" msgstr "" +msgid "Unknown error" +msgstr "Невідома помилка" + msgid "Unstable IP address" msgstr "Нестабільна IP адреса" @@ -705,15 +576,45 @@ msgid "Not connecting: %s" msgstr "" +msgid "Cannot setup compressing TX stack" +msgstr "" + +msgid "Sent crawling info" +msgstr "" + +#, c-format +msgid "Got BYE %d %.*s" +msgstr "До побачення %d %.*s" + +#, c-format +msgid "Weird HELLO %s" +msgstr "Дивне HELLO %s" + +#, c-format +msgid "HELLO %s error %d (%s)" +msgstr "" + +msgid "Shielded node" +msgstr "Захищений вузол" + msgid "Protocol not acceptable" msgstr "" +msgid "Conflict" +msgstr "" + +msgid "Upgrade Header Missing" +msgstr "" + msgid "Servent Shutdown" msgstr "" msgid "Not a network member" msgstr "" +msgid "Need a G2 Hub" +msgstr "" + msgid "Too frequent crawling" msgstr "" @@ -763,12 +664,17 @@ msgid "Pseudo UDP node" msgstr "Псевдо UDP вузол" -#, fuzzy +msgid "Pseudo semi-reliable UDP node" +msgstr "" + +msgid "Pseudo G2 UDP node" +msgstr "" + msgid "Pseudo DHT node" -msgstr "Псевдо UDP вузол" +msgstr "" msgid "Already connected" -msgstr "" +msgstr "Вже з'єднано" msgid "Limited connection" msgstr "" @@ -792,25 +698,28 @@ msgstr "" msgid "Leaf" -msgstr "" +msgstr "Листок" msgid "Ultrapeer" msgstr "" msgid "Legacy" -msgstr "" +msgstr "Застаріле" msgid "Crawler" msgstr "" msgid "UDP" -msgstr "" +msgstr "UDP" msgid "DHT" +msgstr "DHT" + +msgid "G2 hub" msgstr "" msgid "Unknown" -msgstr "" +msgstr "Невідомо" msgid "Read failed (Input Exception)" msgstr "" @@ -841,7 +750,12 @@ msgid "creating directory \"%s\" for %s" msgstr "" -msgid "You seem to have left another gtk-gnutella running" +#, c-format +msgid "Another gtk-gnutella supervisor is running as PID %lu" +msgstr "" + +#, c-format +msgid "Another gtk-gnutella is running as PID %lu" msgstr "" msgid "Cannot proceed without valid configuration directory" @@ -856,9 +770,6 @@ msgid "Failed to create local socket" msgstr "" -msgid "Failed to create listening sockets" -msgstr "" - msgid "Can only run as a leaf when TCP-firewalled" msgstr "" @@ -866,6 +777,12 @@ msgstr "Помилка зчитування" msgid "Got EOF" +msgstr "Отримано EOF" + +msgid "TLS handshake failed" +msgstr "" + +msgid "Connection locally failed" msgstr "" msgid "Write failed (Input Exception)" @@ -884,25 +801,116 @@ msgid_plural "Got %d hosts from UDP host cache %s" msgstr0 "" msgstr1 "" +msgstr2 "" msgid "Connect back timeout" msgstr "" +msgid "Request timeout" +msgstr "Час очікування запиту" + msgid "Timeout waiting for follow-up" msgstr "" msgid "Lifetime expired" msgstr "" +msgid "Unauthorized" +msgstr "Не уповноважено" + +#, c-format +msgid "Limiting connections from %s" +msgstr "" + +msgid "No reason given" +msgstr "Причину не вказано" + +msgid "Bad Request" +msgstr "Некоректний запит" + +msgid "Header too large" +msgstr "" + +msgid "Input buffer full" +msgstr "" + +msgid "Extra data after HTTP header" +msgstr "" + msgid "Unable to send GIV" msgstr "" +msgid "Not Found" +msgstr "Не знайдено" + +msgid "File was modified" +msgstr "" + +msgid "Moved Permanently" +msgstr "" + +msgid "File index/name mismatch" +msgstr "" + +msgid "URN Not Found (urn:sha1)" +msgstr "" + +msgid "SHA1 is being recomputed" +msgstr "" + +msgid "Library being rebuilt" +msgstr "" + +msgid "Malformed URN in /uri-res/N2R request" +msgstr "" + +msgid "Malformed URN in /uri-res/N2X request" +msgstr "" + +msgid "TTH is being computed" +msgstr "" + msgid "<Browse Host Request>" msgstr "" +msgid "Browse Host Disabled" +msgstr "" + +#, c-format +msgid "Redirected to %s:%u" +msgstr "" + +msgid "Not Modified" +msgstr "Не змінено" + msgid "Stalling upload replaced" msgstr "" +msgid "Already downloading this file" +msgstr "" + +msgid "Malformed Range request" +msgstr "" + +msgid "Requested range not satisfiable" +msgstr "" + +msgid "Requested range not available yet" +msgstr "" + +msgid "Queue full" +msgstr "" + +msgid "Another connection is still active" +msgstr "" + +#, c-format +msgid "%s not honoured; removed from PARQ queue" +msgstr "" + +msgid "Minimum retry delay" +msgstr "" + #, c-format msgid "Queued (slot %d, ETA: %s)" msgstr "" @@ -910,22 +918,59 @@ msgid "Cannot send whole HTTP status" msgstr "" +msgid "Not Acceptable" +msgstr "Дані не прийнято" + #, c-format -msgid "<Browse Host Request> %s%s%s" +msgid "<Browse Host %sRequest> %s%s%s" msgstr "" msgid "query hits" -msgstr "" +msgstr "спроб запиту" msgid ", deflate" -msgstr "" +msgstr ", deflate" msgid ", gzip" -msgstr "" +msgstr ", gzip" msgid ", chunked" msgstr "" +msgid "THEX failure" +msgstr "" + +msgid "EOF while sinking" +msgstr "" + +#, c-format +msgid "Read error while sinking: %m" +msgstr "" + +msgid "Content Too Large" +msgstr "" + +msgid "Unknown/Missing Protocol Tag" +msgstr "" + +msgid "Missing Host Header" +msgstr "" + +msgid "Not Implemented" +msgstr "Не реалізовано" + +msgid "Bad URI" +msgstr "Помилкова адреса" + +msgid "Bad Path" +msgstr "" + +msgid "No Content Allowed" +msgstr "" + +msgid "Sharing currently disabled" +msgstr "" + msgid "Write exception" msgstr "" @@ -965,6 +1010,1194 @@ msgid " - Newer version available: from git %s" msgstr "" +msgid "Routing errors" +msgstr "" + +msgid "Routing table chunks" +msgstr "" + +msgid "Routing table message capacity" +msgstr "" + +msgid "Routing table message count" +msgstr "" + +msgid "Routing through transient node avoided" +msgstr "" + +msgid "Duplicates with higher TTL" +msgstr "" + +msgid "SPAM SHA1 database hits" +msgstr "" + +msgid "SPAM filename and size hits" +msgstr "" + +msgid "SPAM fake hits" +msgstr "" + +msgid "SPAM duplicate hits" +msgstr "" + +msgid "SPAM dynamically caught hostile IP addresses" +msgstr "" + +msgid "SPAM dynamically caught hostile IP held" +msgstr "" + +msgid "SPAM spotted spamming IP addresses held" +msgstr "" + +msgid "Searches to local DB" +msgstr "" + +msgid "Hits on local DB" +msgstr "" + +msgid "Hits on local partial files" +msgstr "" + +msgid "Hits on \"what's new?\" queries" +msgstr "" + +msgid "Query hits received for local queries" +msgstr "" + +msgid "G2 searches to local DB" +msgstr "" + +msgid "G2 hits on local DB" +msgstr "" + +msgid "G2 hits on local partial files" +msgstr "" + +msgid "Query hits received for OOB-proxied queries" +msgstr "" + +msgid "Queries requesting OOB hit delivery" +msgstr "" + +msgid "Stripped OOB flag on queries" +msgstr "" + +msgid "Ignored OOB queries due to unclaimed hits" +msgstr "" + +msgid "Duplicate OOB-proxied queries" +msgstr "" + +msgid "OOB hits received for OOB-proxied queries" +msgstr "" + +msgid "OOB hits bearing alien IP address" +msgstr "" + +msgid "OOB hits ignored due to identified spamming address" +msgstr "" + +msgid "OOB hits ignored due to unsecure promise from known secure host" +msgstr "" + +msgid "Unclaimed locally-generated OOB hits" +msgstr "" + +msgid "Partially claimed locally-generated OOB hits" +msgstr "" + +msgid "Spurious OOB hit claiming received" +msgstr "" + +msgid "Unrequested OOB hits received" +msgstr "" + +msgid "Received query hits for untracked queries" +msgstr "" + +msgid "Tracked query MUIDs" +msgstr "" + +msgid "Compacted queries" +msgstr "" + +msgid "Bytes saved by compacting" +msgstr "" + +msgid "UTF8 queries" +msgstr "" + +msgid "SHA1 queries" +msgstr "" + +msgid "\"What's New?\" queries" +msgstr "" + +msgid "UTF8 G2 queries" +msgstr "" + +msgid "SHA1 G2 queries" +msgstr "" + +msgid "GUESS queries" +msgstr "" + +msgid "GUESS queries (0.2)" +msgstr "" + +msgid "GUESS link cache size" +msgstr "" + +msgid "GUESS cached query keys held" +msgstr "" + +msgid "GUESS cached 0.2 hosts held" +msgstr "" + +msgid "GUESS cached G2 hosts held" +msgstr "" + +msgid "GUESS locally generated queries" +msgstr "" + +msgid "GUESS currently running queries" +msgstr "" + +msgid "GUESS hits received for locally generated queries" +msgstr "" + +msgid "GUESS ultra nodes queried" +msgstr "" + +msgid "GUESS ultra nodes sending back an acknowledgment" +msgstr "" + +msgid "GUESS G2 nodes queried" +msgstr "" + +msgid "GUESS G2 nodes sending back an acknowledgment" +msgstr "" + +msgid "Throttled local push messages" +msgstr "" + +msgid "Throttled received push messages" +msgstr "" + +msgid "Broadcasted push messages" +msgstr "" + +msgid "Push-proxy UDP relayed messages" +msgstr "" + +msgid "Push-proxy TCP relayed messages" +msgstr "" + +msgid "Push-proxy TCP for FW<->FW transfers" +msgstr "" + +msgid "Push-proxy broadcasted messages" +msgstr "" + +msgid "Push-proxy found un-proxied local route" +msgstr "" + +msgid "Push-proxy lookup failures" +msgstr "" + +msgid "Push relayed via local route" +msgstr "" + +msgid "Push relayed via routing table" +msgstr "" + +msgid "Locally generated dynamic queries" +msgstr "" + +msgid "Leaf-generated dynamic queries" +msgstr "" + +msgid "OOB-proxied leaf queries" +msgstr "" + +msgid "Fully completed dynamic queries" +msgstr "" + +msgid "Partially completed dynamic queries" +msgstr "" + +msgid "Dynamic queries ended with no results" +msgstr "" + +msgid "Fully completed dynamic queries getting late results" +msgstr "" + +msgid "Dynamic queries with partial late results" +msgstr "" + +msgid "Dynamic queries completed by late results" +msgstr "" + +msgid "Queries seen from GTKG" +msgstr "" + +msgid "Queries seen from GTKG that were re-queries" +msgstr "" + +msgid "Queries advertising support of GGEP \"H\"" +msgstr "" + +msgid "Queries advertising support of semi-reliable UDP" +msgstr "" + +msgid "GIV callbacks received" +msgstr "" + +msgid "GIV discarded due to no suitable download" +msgstr "" + +msgid "QUEUE callbacks received" +msgstr "" + +msgid "QUEUE discarded due to no suitable download" +msgstr "" + +msgid "File descriptors banned running count" +msgstr "" + +msgid "UDP read-ahead datagram running count" +msgstr "" + +msgid "UDP read-ahead datagram running bytes" +msgstr "" + +msgid "UDP read-ahead datagram \"old\" processed" +msgstr "" + +msgid "UDP read-ahead datagram max count" +msgstr "" + +msgid "UDP read-ahead datagram max bytes" +msgstr "" + +msgid "UDP read-ahead datagram max delay" +msgstr "" + +msgid "UDP push messages received for FW<->FW connections" +msgstr "" + +msgid "UDP push messages requesting FW<->FW connection with ourselves" +msgstr "" + +msgid "UDP push messages patched for FW<->FW connections" +msgstr "" + +msgid "UDP UHC pings received" +msgstr "" + +msgid "UDP UHC pongs sent" +msgstr "" + +msgid "UDP messages with bogus source IP" +msgstr "" + +msgid "UDP messages from shunned IP (discarded)" +msgstr "" + +msgid "UDP truncated incoming messages" +msgstr "" + +msgid "Alien UDP messages (non-Gnutella)" +msgstr "Чужі UDP повідомлення (не Gnutella)" + +msgid "Unprocessed UDP Gnutella messages" +msgstr "" + +msgid "Compressed UDP messages enqueued" +msgstr "" + +msgid "Compressed UDP messages received" +msgstr "" + +msgid "Candidates for UDP message compression" +msgstr "" + +msgid "Uncompressed UDP messages due to no gain" +msgstr "" + +msgid "Ambiguous UDP messages received" +msgstr "" + +msgid "Ambiguous UDP messages inspected more deeply" +msgstr "" + +msgid "Ambiguous UDP messages handled as semi-reliable UDP" +msgstr "" + +msgid "Semi-reliable UDP total messages given for transmission" +msgstr "" + +msgid "Semi-reliable UDP total messages deflated" +msgstr "" + +msgid "Semi-reliable UDP total messages unsent" +msgstr "" + +msgid "Semi-reliable UDP total messages dropped due to temporary ban" +msgstr "" + +msgid "Semi-reliable UDP total messages sent to known responsive hosts" +msgstr "" + +msgid "Semi-reliable UDP total messages partially sent due to clogging" +msgstr "" + +msgid "Semi-reliable UDP reliable messages given for transmission" +msgstr "" + +msgid "Semi-reliable UDP reliable messages correctly transmited" +msgstr "" + +msgid "Semi-reliable UDP reliable messages not fully acknowledged" +msgstr "" + +msgid "Semi-reliable UDP fragments sent" +msgstr "" + +msgid "Semi-reliable UDP fragments resent" +msgstr "" + +msgid "Semi-reliable UDP fragment sendings avoided" +msgstr "" + +msgid "Semi-reliable UDP fragments sent too many times" +msgstr "" + +msgid "Semi-reliable UDP total acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP spurious acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP invalid acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP acknowledgments re-queued for sending" +msgstr "" + +msgid "Semi-reliable UDP plain acknowledgments dropped" +msgstr "" + +msgid "Semi-reliable UDP enhanced acknowledgments dropped" +msgstr "" + +msgid "Semi-reliable UDP plain acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP EARs sent" +msgstr "" + +msgid "Semi-reliable UDP too many EARs sent" +msgstr "" + +msgid "Semi-reliable UDP EAR negative acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP acknowledgments received after sending EARs" +msgstr "" + +msgid "Semi-reliable UDP fragments received" +msgstr "" + +msgid "Semi-reliable UDP duplicate fragments received" +msgstr "" + +msgid "Semi-reliable UDP unreliable fragments received" +msgstr "" + +msgid "Semi-reliable UDP dropped received fragments" +msgstr "" + +msgid "Semi-reliable UDP fragments received whilst lingering" +msgstr "" + +msgid "Semi-reliable UDP messages expired before re-assembly" +msgstr "" + +msgid "Semi-reliable UDP messages re-assembled completely" +msgstr "" + +msgid "Semi-reliable UDP messages inflated successfully" +msgstr "" + +msgid "Semi-reliable UDP messages inflated incorrectly" +msgstr "" + +msgid "Semi-reliable UDP unreliable messages received" +msgstr "" + +msgid "Semi-reliable UDP empty messages received" +msgstr "" + +msgid "Semi-reliable UDP total acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP avoided acknowledgment sendings" +msgstr "" + +msgid "Semi-reliable UDP EARs received" +msgstr "" + +msgid "Semi-reliable UDP EARs received for unknown message" +msgstr "" + +msgid "Semi-reliable UDP EARs received whilst lingering" +msgstr "" + +msgid "Semi-reliable UDP fragments from hostile IP addresses" +msgstr "" + +msgid "UDP G2 hits rerouted to hub for delivery" +msgstr "" + +msgid "UDP G2 hits undelivered" +msgstr "" + +msgid "Consolidated servers (after GUID and IP address linking)" +msgstr "" + +msgid "Duplicate downloads found during server consolidation" +msgstr "" + +msgid "Discovered server GUIDs" +msgstr "" + +msgid "Changed server GUIDs" +msgstr "" + +msgid "Detected GUID collisions" +msgstr "" + +msgid "Detected collisions with our own GUID" +msgstr "" + +msgid "GUID dynamically banned" +msgstr "" + +msgid "Firewalled node info for known hosts received in upload requests" +msgstr "" + +msgid "Revitalized PUSH routes" +msgstr "" + +msgid "Collected new PUSH proxies from other query hits" +msgstr "" + +msgid "Attempted download resource switching on completion" +msgstr "" + +msgid "Attempted download resource switching after error" +msgstr "" + +msgid "Successful download resource switching (all kind)" +msgstr "" + +msgid "Successful download resource switching between plain files" +msgstr "" + +msgid "Successful download resource switching after error" +msgstr "" + +msgid "Actively queued after resource switching attempt" +msgstr "" + +msgid "Sunk HTTP reply data on error codes" +msgstr "" + +msgid "Ignored downloaded data" +msgstr "" + +msgid "Ignoring requested after data mismatch" +msgstr "" + +msgid "Ignoring requested to preserve connection" +msgstr "" + +msgid "Ignoring requested due to aggressive swarming" +msgstr "" + +msgid "Ignoring refused (data too large or server too slow)" +msgstr "" + +msgid "Client resource switching (all detected)" +msgstr "" + +msgid "Client resource switching between plain files" +msgstr "" + +msgid "Client follow-up request after HTTP error was returned" +msgstr "" + +msgid "PARQ client resource switching in slots (SHA-1 based)" +msgstr "" + +msgid "PARQ client retry-after violation" +msgstr "" + +msgid "PARQ client kicked out after too many retry-after violations" +msgstr "" + +msgid "PARQ upload slot limit overrides" +msgstr "" + +msgid "PARQ quick upload slots granted" +msgstr "" + +msgid "PARQ QUEUE sending attempts" +msgstr "" + +msgid "PARQ QUEUE messages sent" +msgstr "" + +msgid "PARQ QUEUE follow-up requests received" +msgstr "" + +msgid "Launched SHA-1 file verifications" +msgstr "" + +msgid "Launched TTH file verifications" +msgstr "" + +msgid "Re-seeding of orphan downloads through query hits" +msgstr "" + +msgid "Re-seeding of orphan downloads through upload requests" +msgstr "" + +msgid "RUDP sent bytes" +msgstr "" + +msgid "RUDP received bytes" +msgstr "" + +msgid "DHT estimated amount of nodes" +msgstr "" + +msgid "DHT standard error of estimated amount of nodes" +msgstr "" + +msgid "DHT k-ball theoretical frontier (bits)" +msgstr "" + +msgid "DHT k-ball furthest frontier (bits)" +msgstr "" + +msgid "DHT k-ball closeest frontier (bits)" +msgstr "" + +msgid "DHT routing table buckets" +msgstr "" + +msgid "DHT routing table leaves" +msgstr "" + +msgid "DHT routing table maximum depth" +msgstr "" + +msgid "DHT routing table good nodes" +msgstr "" + +msgid "DHT routing table stale nodes" +msgstr "" + +msgid "DHT routing table pending nodes" +msgstr "" + +msgid "DHT routing table evicted nodes" +msgstr "" + +msgid "DHT routing table evicted firewalled nodes" +msgstr "" + +msgid "DHT routing table evicted nodes due to quota" +msgstr "" + +msgid "DHT routing table promoted pending nodes" +msgstr "" + +msgid "DHT routing table pinged promoted nodes" +msgstr "" + +msgid "DHT routing table rejected node due to bucket network quota" +msgstr "" + +msgid "DHT routing table rejected node due to global network quota" +msgstr "" + +msgid "DHT completed bucket refreshes" +msgstr "" + +msgid "DHT forced bucket refreshes" +msgstr "" + +msgid "DHT forced bucket merges" +msgstr "" + +msgid "DHT bucket merges" +msgstr "" + +msgid "DHT bucket splits" +msgstr "" + +msgid "DHT denied non-splitable bucket refresh" +msgstr "" + +msgid "DHT initiated bucket alive checks" +msgstr "" + +msgid "DHT alive pings sent to good nodes" +msgstr "" + +msgid "DHT alive pings sent to stale nodes" +msgstr "" + +msgid "DHT alive pings sent to shutdowning nodes" +msgstr "" + +msgid "DHT alive pings avoided" +msgstr "" + +msgid "DHT alive pings skipped" +msgstr "" + +msgid "DHT revitalized stale nodes on RPC reply" +msgstr "" + +msgid "DHT value store rejected on IP/network quota grounds" +msgstr "" + +msgid "DHT value store rejected on creator validation grounds" +msgstr "" + +msgid "DHT nodes rejected during lookup based on network quota" +msgstr "" + +msgid "DHT nodes rejected during lookup based on suspicious proximity" +msgstr "" + +msgid "DHT nodes rejected during lookup based on frequency divergence" +msgstr "" + +msgid "DHT node contact IP addresses fixed during lookup" +msgstr "" + +msgid "DHT keys held" +msgstr "" + +msgid "DHT cached keys held" +msgstr "" + +msgid "DHT values held" +msgstr "" + +msgid "DHT cached KUID targets held" +msgstr "" + +msgid "DHT cached closest root nodes" +msgstr "" + +msgid "DHT cached roots exact hits" +msgstr "" + +msgid "DHT cached roots approximate hits" +msgstr "" + +msgid "DHT cached roots misses" +msgstr "" + +msgid "DHT cached roots lookups within k-ball" +msgstr "" + +msgid "DHT cached roots contact address refreshed" +msgstr "" + +msgid "DHT cached security tokens held" +msgstr "" + +msgid "DHT cached security tokens hits" +msgstr "" + +msgid "DHT stable node information held" +msgstr "" + +msgid "DHT local hits on value lookups" +msgstr "" + +msgid "DHT local hits returning values from cached keys" +msgstr "" + +msgid "DHT returned expanded values" +msgstr "" + +msgid "DHT returned values as secondary keys" +msgstr "" + +msgid "DHT claimed values via secondary keys" +msgstr "" + +msgid "DHT returned cached expanded values" +msgstr "" + +msgid "DHT returned cached values as secondary-keys" +msgstr "" + +msgid "DHT claimed cached values via secondary keys" +msgstr "" + +msgid "DHT successfully received value publications" +msgstr "" + +msgid "DHT successfully received value removals" +msgstr "" + +msgid "DHT replication of stale value avoided" +msgstr "" + +msgid "DHT replication of held values" +msgstr "" + +msgid "DHT republishing of held values" +msgstr "" + +msgid "DHT secondary-key value fetch issued" +msgstr "" + +msgid "DHT duplicate values returned in lookups" +msgstr "" + +msgid "DHT detected KUID collisions" +msgstr "" + +msgid "DHT detected collisions with our own KUID" +msgstr "" + +msgid "DHT caching attempts" +msgstr "" + +msgid "DHT caching ended successfully" +msgstr "" + +msgid "DHT caching partially completed" +msgstr "" + +msgid "DHT key-offloading checks after discovering new closest node" +msgstr "" + +msgid "DHT keys selected for offloading" +msgstr "" + +msgid "DHT key-offloading attempts" +msgstr "" + +msgid "DHT key-offloading ended successfully" +msgstr "" + +msgid "DHT key-offloading partially completed" +msgstr "" + +msgid "DHT values successfully offloaded" +msgstr "" + +msgid "DHT incoming messages" +msgstr "" + +msgid "DHT incoming messages with UDP-matching contact address" +msgstr "" + +msgid "DHT incoming messages with contact address fixed" +msgstr "" + +msgid "DHT incoming messages from hostile addresses" +msgstr "" + +msgid "DHT incoming messages with hostile contact address" +msgstr "" + +msgid "DHT RPC messages prepared" +msgstr "" + +msgid "DHT RPC messages cancelled" +msgstr "" + +msgid "DHT RPC timed out" +msgstr "" + +msgid "DHT RPC replies received" +msgstr "" + +msgid "DHT RPC replies with contact address fixed" +msgstr "" + +msgid "DHT RPC late replies received" +msgstr "" + +msgid "DHT RPC detected KUID mismatches on reply" +msgstr "" + +msgid "DHT RPC recent nodes held" +msgstr "" + +msgid "DHT node verifications" +msgstr "" + +msgid "DHT publishing attempts" +msgstr "" + +msgid "DHT publishing ended successfully (all roots)" +msgstr "" + +msgid "DHT publishing partially completed (root subset only)" +msgstr "" + +msgid "DHT publishing ending with proper value presence" +msgstr "" + +msgid "DHT value republishing occurring too late (after expiry)" +msgstr "" + +msgid "DHT publishing to self" +msgstr "" + +msgid "DHT background publishing completion attempts" +msgstr "" + +msgid "DHT background publishing completion showing improvements" +msgstr "" + +msgid "DHT background publishing completion successful (all roots)" +msgstr "" + +msgid "DHT SHA1 data type collisions" +msgstr "" + +msgid "DHT lookup path passively protected against attack" +msgstr "" + +msgid "DHT lookup path actively protected against attack" +msgstr "" + +msgid "DHT alt-loc lookups issued" +msgstr "" + +msgid "DHT push-proxy lookups issued" +msgstr "" + +msgid "DHT successful alt-loc lookups" +msgstr "" + +msgid "DHT successful push-proxy lookups" +msgstr "" + +msgid "DHT successful node push-entry lookups" +msgstr "" + +msgid "DHT re-seeding of orphan downloads" +msgstr "" + +msgid "Digests computed on general statistics" +msgstr "" + +msgid "Digests computed on TCP statistics" +msgstr "" + +msgid "Digests computed on UDP statistics" +msgstr "" + +msgid "Ping" +msgstr "Пінг" + +msgid "Pong" +msgstr "Понг" + +msgid "Bye" +msgstr "Бувай" + +msgid "QRP" +msgstr "QRP" + +msgid "HSEP" +msgstr "HSEP" + +msgid "RUDP" +msgstr "RUDP" + +msgid "Vendor spec." +msgstr "" + +msgid "Vendor std." +msgstr "" + +msgid "Push" +msgstr "Надіслати" + +msgid "Query" +msgstr "Запит" + +msgid "Query hit" +msgstr "" + +msgid "DHT (truncated)" +msgstr "" + +msgid "DHT Ping" +msgstr "" + +msgid "DHT Pong" +msgstr "" + +msgid "DHT Store" +msgstr "" + +msgid "DHT Store Ack" +msgstr "" + +msgid "DHT Find Node" +msgstr "" + +msgid "DHT Found Node" +msgstr "" + +msgid "DHT Find Value" +msgstr "" + +msgid "DHT Value" +msgstr "" + +msgid "G2 Crawl Request" +msgstr "" + +msgid "G2 Hub Advertisement" +msgstr "" + +msgid "G2 Hub List" +msgstr "" + +msgid "G2 Hub List Req" +msgstr "" + +msgid "G2 Hub List Ack" +msgstr "" + +msgid "G2 Local Node Info" +msgstr "" + +msgid "G2 Ping" +msgstr "" + +msgid "G2 Pong" +msgstr "" + +msgid "G2 Push" +msgstr "" + +msgid "G2 Query Key Ack" +msgstr "" + +msgid "G2 Query Key Req" +msgstr "" + +msgid "G2 Query" +msgstr "" + +msgid "G2 Query Ack" +msgstr "" + +msgid "G2 Query Hit" +msgstr "" + +msgid "G2 Query Hash Table" +msgstr "" + +msgid "G2 User Profile Check" +msgstr "" + +msgid "G2 User Profile Data" +msgstr "" + +msgid "Total" +msgstr "Загалом" + +msgid "Bad size" +msgstr "Неправильний розмір" + +msgid "Too small" +msgstr "Замале" + +msgid "Too large" +msgstr "Завелике" + +msgid "Way too large" +msgstr "" + +msgid "Too old" +msgstr "" + +msgid "Unknown message type" +msgstr "Невідомий ти повідомлення" + +msgid "Unexpected message" +msgstr "Неочікуване повідомлення" + +msgid "Message sent with TTL = 0" +msgstr "Повідомлення відіслане з TTL = 0" + +msgid "Improper hops/ttl combination" +msgstr "" + +msgid "Max TTL exceeded" +msgstr "Перевищено максимум TTL" + +msgid "Message throttle" +msgstr "" + +msgid "Message matched limits" +msgstr "" + +msgid "Transient node" +msgstr "" + +msgid "Unusable Pong" +msgstr "" + +msgid "Hard TTL limit reached" +msgstr "" + +msgid "Max hop count reached" +msgstr "" + +msgid "Route lost" +msgstr "Шлях втрачено" + +msgid "No route" +msgstr "Немає маршруту" + +msgid "Duplicate message" +msgstr "" + +msgid "OOB Proxy MUID Conflict" +msgstr "" + +msgid "Message to banned GUID" +msgstr "" + +msgid "Message from banned GUID" +msgstr "" + +msgid "Node shutting down" +msgstr "" + +msgid "TX flow control" +msgstr "" + +msgid "Query text had no trailing NUL" +msgstr "" + +msgid "Query text too short" +msgstr "" + +msgid "Query had unnecessary overhead" +msgstr "" + +msgid "Query had bad URN" +msgstr "" + +msgid "Message with malformed SHA1" +msgstr "" + +msgid "Message with malformed UTF-8" +msgstr "" + +msgid "Malformed Query Hit" +msgstr "" + +msgid "Bad return address" +msgstr "" + +msgid "Hostile IP address" +msgstr "" + +msgid "Shunned IP address" +msgstr "" + +msgid "Bogus result from Morpheus" +msgstr "Непотрібний результат від Morpheus" + +msgid "Spam" +msgstr "Спам" + +msgid "Evil filename" +msgstr "" + +msgid "Improper media type" +msgstr "" + +msgid "Payload inflating error" +msgstr "" + +msgid "Unknown header flags present" +msgstr "" + +msgid "Own search results" +msgstr "" + +msgid "Own queries" +msgstr "" + +msgid "Ancient query format" +msgstr "" + +msgid "Blank Servent ID" +msgstr "" + +msgid "GUESS Query missing token" +msgstr "" + +msgid "GUESS Invalid query token" +msgstr "" + +msgid "DHT Invalid security token" +msgstr "" + +msgid "DHT Too many STORE requests" +msgstr "" + +msgid "DHT Malformed message" +msgstr "" + +msgid "G2 Unexpected message" +msgstr "" + +msgid "Cannot cross networks" +msgstr "" + msgid "No proxy" msgstr "Немає проксі" @@ -1004,41 +2237,38 @@ msgid "leaf node" msgstr "гілка вузол" -#, fuzzy msgid "none" -msgstr "вузол" +msgstr "немає" msgid "input only" -msgstr "" +msgstr "лише вхід" msgid "output only" -msgstr "" +msgstr "лише вихід" msgid "input & output" -msgstr "" +msgstr "вхід і вихід" msgid "seeded" -msgstr "" +msgstr "поширено" msgid "own KUID lookup" msgstr "" -#, fuzzy msgid "completing" -msgstr "Завершено" +msgstr "виконуємо" -#, fuzzy msgid "completed" -msgstr "Завершено" +msgstr "виконано" msgid "shutdown" -msgstr "" +msgstr "завершення роботи" msgid "active (recommended)" -msgstr "" +msgstr "активний (рекомендовано)" msgid "passive" -msgstr "" +msgstr "пасивний" msgid "Indicates whether the hostcache file is being read." msgstr "" @@ -1344,9 +2574,6 @@ msgid "Debug level for code shared between gui and core." msgstr "" -msgid "Verbosity of Bitzi related debug messages." -msgstr "" - msgid "Verbosity of URL handling related debug messages." msgstr "" @@ -1420,7 +2647,7 @@ "support." msgstr "" -msgid "For development use: track properties." +msgid "Indicates a kernel network buffer shortage." msgstr "" msgid "For development use: don't add new hosts to the host cache." @@ -1808,7 +3035,7 @@ msgid "" "Maximum amount of leaves we can accept. To be promoted Ultra, you should " -"reserve 32 bytes of bandwidth per leaf." +"reserve 32 bytes/sec of bandwidth per leaf." msgstr "" msgid "What to do with files that will be ignored for downloading." @@ -2210,7 +3437,7 @@ msgid "" "If set to TRUE, the global hostiles.txt is used as well as the private " -"$GTK_GNUTELLA_DIR/hostiles.txt. This allows to separate your private ban " +"$GTK_GNUTELLA_DIR/hostiles.txt. This allows you to separate your private ban " "list from the global one distributed with gtk-gnutella." msgstr "" @@ -2517,12 +3744,11 @@ msgid "Logged statistics level for code shared between GUI and core." msgstr "" -#, c-format msgid "" "If TRUE, the spam SHA1 database is kept in memory. If FALSE, it is kept in a " "fast disk database, which saves a large amount of core memory and reduces " "the overall footprint, at the cost of an increased I/O level. However, the " -"DB cache has typically a 90% hit rate, so the actual overhead is barely " +"DB cache has a 90 percent hit rate, so the actual overhead is barely " "noticeable when running as an ultra node and should remain completely " "unnoticed when running as a leaf." msgstr "" @@ -2557,9 +3783,8 @@ msgid "Debug level for final shutdown." msgstr "" -#, fuzzy msgid "Country preferences" -msgstr "Вподобання" +msgstr "" msgid "Debug level for country limits." msgstr "" @@ -2615,9 +3840,8 @@ msgid "Maximum CPU frequency, in Hz." msgstr "" -#, fuzzy msgid "DHT bootstrap status." -msgstr "статистика HTTP трафіка" +msgstr "" msgid "" "The DHT running mode. An active node will be able to store values and is a " @@ -2881,89 +4105,185 @@ msgid "Debug level for GUID management." msgstr "" -msgid "disable" +msgid "Debug level for the TX (transmit) deflating network layer." msgstr "" -msgid "by words" +msgid "Comma-separated list of TX debugging hosts (IP addresses only)" msgstr "" -msgid "by whole query" +msgid "" +"Comma-separated list of hosts for whom we want to dump RX traffic (IP " +"addresses only)" msgstr "" -msgid "by router" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they emit " +"(IP addresses only)" msgstr "" -msgid "TCP & UDP" -msgstr "TCP і UDP" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they " +"receive (IP addresses only)" +msgstr "" -msgid "TCP only" +msgid "" +"Allow GUESS to use some of the unused Gnutella outgoing bandwidth regardless " +"of the GUESS bandwidth hint. If FALSE, only the configured bandwidth hint " +"will be used. When running as a leaf this should be set to TRUE to make " +"GUESS queries run faster." msgstr "" -msgid "UDP only" +msgid "Debug level for the UDP TX scheduler." msgstr "" -msgid "Ping" -msgstr "Пінг" +msgid "" +"Debugging flags for the semi-reliable UDP TX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: transmissions, 16: timeouts." +msgstr "" -msgid "Pong" -msgstr "Понг" +msgid "Comma-separated list of RX debugging hosts (IP addresses only)" +msgstr "" -msgid "Bye" -msgstr "Бувай" +msgid "" +"Debugging flags for the semi-reliable UDP RX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: receptions, 16: timeouts." +msgstr "" -msgid "QRP" +msgid "Whether to log sent semi-reliable UDP messages." msgstr "" -msgid "HSEP" +msgid "Whether to log received semi-reliable UDP messages." msgstr "" -msgid "RUDP" +msgid "Debug level for the secured OOB query hit claiming." msgstr "" -msgid "Vendor spec." +msgid "Whether to log sent vendor messages." msgstr "" -msgid "Vendor std." +msgid "Whether to log received vendor messages." msgstr "" -msgid "Push" +msgid "Debugging flags for the DHT token cache (developers only)." msgstr "" -msgid "Query" +msgid "Whether to log weird DHT message headers when debugging." msgstr "" -msgid "Query Hit" +msgid "Debug level for the DHT Remote Procedure Call (RPC) code." msgstr "" -#, fuzzy -msgid "DHT Ping" -msgstr "Пінг" +msgid "Whether to log UHC pings we receive." +msgstr "" -#, fuzzy -msgid "DHT Pong" -msgstr "Понг" +msgid "Whether to log UHC pings we emit." +msgstr "" -#, fuzzy -msgid "DHT Store" -msgstr "HTTP трафік" +msgid "Whether the program was properly shutdown." +msgstr "" -msgid "DHT Store Ack" +msgid "Whether the program restarted after a clean shutdown." msgstr "" -msgid "DHT Find Node" +msgid "Debug level for DHT key management." msgstr "" -msgid "DHT Found Node" +msgid "Debug level for DHT value management." msgstr "" -msgid "DHT Find Value" +msgid "ID of the current process." msgstr "" -#, fuzzy -msgid "DHT Value" -msgstr "Значення" +msgid "Debug level for HTTP range parsing / handling." +msgstr "" -msgid "Total" +msgid "" +"Lease time when installing port mappings via UPnP or NAT-PMP, in seconds. A " +"value of 0 requests permanent mappings." +msgstr "" + +msgid "Whether the program is auto-restarting at the user's request." +msgstr "" + +msgid "Debug level for time management." +msgstr "" + +msgid "Debug level for the tmalloc() thread-magazine object distributor." +msgstr "" + +msgid "Debug level for the event queue thread." +msgstr "" + +msgid "Maximum number of G2 hubs in the hub cache." +msgstr "" + +msgid "Current number of IPv4 hosts in the G2 hub caches." +msgstr "" + +msgid "Whether the G2 protocol should be enabled." +msgstr "" + +msgid "Number of G2 nodes currently connected." +msgstr "" + +msgid "Maximum amount of G2 hubs we should connect to as a leaf." +msgstr "" + +msgid "Whether to log bad G2 messages, corrupted or unexpected." +msgstr "" + +msgid "Whether to log dropped G2 messages" +msgstr "" + +msgid "Debug level for the G2 RPC layer." +msgstr "" + +msgid "Whether to log summary of received query hits" +msgstr "" + +msgid "Whether to log summary of each record in received query hits" +msgstr "" + +msgid "Number of G2 browsing requests received in this session." +msgstr "" + +msgid "Number of G2 browsing requests fully served in this session." +msgstr "" + +msgid "Whether to log G2 messages we're attempting to send" +msgstr "" + +msgid "" +"Timestamp at which the current session was started. This stamp remains " +"unchanged when gtk-gnutella restarts after a crash or an explicit restart " +"request." +msgstr "" + +msgid "No TCP listening socket bound to allow incoming connections." +msgstr "" + +msgid "disable" +msgstr "вимкнути" + +msgid "by words" +msgstr "" + +msgid "by whole query" +msgstr "" + +msgid "by router" +msgstr "" + +msgid "TCP & UDP" +msgstr "TCP і UDP" + +msgid "TCP only" +msgstr "" + +msgid "UDP only" +msgstr "" + +msgid "Query Hit" msgstr "" msgid "Icons" @@ -2979,7 +4299,7 @@ msgstr "" msgid "This session" -msgstr "" +msgstr "Цей сеанс роботи" msgid "1 hour" msgstr "1 година" @@ -3103,16 +4423,14 @@ msgid "Show tabs or search list." msgstr "" -#, fuzzy msgid "Display Searchbar." -msgstr "показувати _Панель статусу" +msgstr "" msgid "Display Sidebar." msgstr "" -#, fuzzy msgid "Display Menu." -msgstr "показувати _Панель статусу" +msgstr "" msgid "Display statusbar." msgstr "" @@ -3394,7 +4712,7 @@ msgstr "" msgid "" -"Discard search results whith an alien IP address, not matching the one from " +"Discard search results with an alien IP address, not matching the one from " "which the results come from." msgstr "" @@ -3403,787 +4721,809 @@ "be restarted when gtk-gnutella is launched." msgstr "" -msgid "Anonymizing proxies" +msgid "Discard search results coming from servents with a banned GUID." msgstr "" -msgid "Satellite providers" +msgid "Whether a summary line with GUESS search stats should be displayed." msgstr "" -msgid "Andorra" +msgid "" +"Whether the GUESS summary line should show total statistics or ones " +"pertaining to the current search only." msgstr "" +msgid "Anonymizing proxies" +msgstr "Анонімні проксі-сервери" + +msgid "Satellite providers" +msgstr "Супутникові провайдери" + +msgid "Andorra" +msgstr "Андорра" + msgid "United Arab Emirates" -msgstr "" +msgstr "Об’єднані Арабські Емірати" msgid "Afghanistan" -msgstr "" +msgstr "Афганістан" msgid "Antigua and Barbuda" -msgstr "" +msgstr "Антигуа і Барбуда" msgid "Anguilla" -msgstr "" +msgstr "Ангілья" msgid "Albania" -msgstr "" +msgstr "Албанія" msgid "Armenia" -msgstr "" +msgstr "Вірменія" msgid "Netherlands Antilles" -msgstr "" +msgstr "Нідерландські Антильські Острови" msgid "Angola" -msgstr "" +msgstr "Ангола" msgid "Asia/Pacific Region" -msgstr "" +msgstr "Азійсько-тихоокеанський регіон" msgid "Antarctica" -msgstr "" +msgstr "Антарктида" msgid "Argentina" -msgstr "" +msgstr "Аргентина" msgid "American Samoa" -msgstr "" +msgstr "Американське Самоа" msgid "Austria" -msgstr "" +msgstr "Австрія" msgid "Australia" -msgstr "" +msgstr "Австралія" msgid "Aruba" -msgstr "" +msgstr "Аруба" msgid "Åland Islands" -msgstr "" +msgstr "Аландські острови" msgid "Azerbaijan" -msgstr "" +msgstr "Азербайджан" msgid "Bosnia and Herzegovina" -msgstr "" +msgstr "Боснія та Герцеговина" msgid "Barbados" -msgstr "" +msgstr "Барбадос" msgid "Bangladesh" -msgstr "" +msgstr "Бангладеш" msgid "Belgium" -msgstr "" +msgstr "Бельгія" msgid "Burkina Faso" -msgstr "" +msgstr "Буркіна-Фасо" msgid "Bulgaria" -msgstr "" +msgstr "Болгарія" msgid "Bahrain" -msgstr "" +msgstr "Бахрейн" msgid "Burundi" -msgstr "" +msgstr "Бурунді" msgid "Benin" -msgstr "" +msgstr "Бенін" + +msgid "Saint Barthelemy" +msgstr "Сен-Бартельмі" msgid "Bermuda" -msgstr "" +msgstr "Бермуди" msgid "Brunei Darussalam" -msgstr "" +msgstr "Бруней" msgid "Bolivia" -msgstr "" +msgstr "Болівія" + +msgid "Bonaire, Sint Eustatius and Saba" +msgstr "Бонайре, Сінт-Естатіус і Саба" msgid "Brazil" -msgstr "" +msgstr "Бразилія" msgid "Bahamas" -msgstr "" +msgstr "Багамські острови" msgid "Bhutan" -msgstr "" +msgstr "Бутан" + +msgid "Burma" +msgstr "Бірма" msgid "Bouvet Island" -msgstr "" +msgstr "Острів Буве" msgid "Botswana" -msgstr "" +msgstr "Ботсвана" msgid "Belarus" -msgstr "" +msgstr "Білорусь" msgid "Belize" -msgstr "" +msgstr "Беліз" msgid "Canada" -msgstr "" +msgstr "Канада" msgid "Cocos (Keeling) Islands" -msgstr "" +msgstr "Кокосові (Кілінг) острови" msgid "Congo (Democratic Republic)" -msgstr "" +msgstr "Конго (Демократична республіка)" msgid "Central African Republic" -msgstr "" +msgstr "Центральноафриканська Республіка" -#, fuzzy msgid "Congo" -msgstr "Понг" +msgstr "Конго" msgid "Switzerland" -msgstr "" +msgstr "Швейцарія" msgid "Cote d'Ivoire" -msgstr "" +msgstr "Кот-д'Івуар" msgid "Cook Islands" -msgstr "" +msgstr "Острови Кука" -#, fuzzy msgid "Chile" -msgstr "файл" +msgstr "Чилі" msgid "Cameroon" -msgstr "" +msgstr "Камерун" msgid "China" -msgstr "" +msgstr "Китай" msgid "Colombia" -msgstr "" +msgstr "Колумбія" msgid "Costa Rica" -msgstr "" +msgstr "Коста-Рика" msgid "Serbia and Montenegro" -msgstr "" +msgstr "Сербія і Чорногорія" msgid "Cuba" -msgstr "" +msgstr "Куба" msgid "Cape Verde" -msgstr "" +msgstr "Кабо-Верде" + +msgid "Curacao" +msgstr "Кюрасао" msgid "Christmas Island" -msgstr "" +msgstr "Острів Різдва" msgid "Cyprus" -msgstr "" +msgstr "Кіпр" msgid "Czech Republic" -msgstr "" +msgstr "Чеська республіка" msgid "Germany" -msgstr "" +msgstr "Німеччина" msgid "Djibouti" -msgstr "" +msgstr "Джибуті" msgid "Denmark" -msgstr "" +msgstr "Данія" msgid "Dominica" -msgstr "" +msgstr "Домініка" msgid "Dominican Republic" -msgstr "" +msgstr "Домініканська республіка" msgid "Algeria" -msgstr "" +msgstr "Алжир" msgid "Ecuador" -msgstr "" +msgstr "Еквадор" msgid "Estonia" -msgstr "" +msgstr "Естонія" msgid "Egypt" -msgstr "" +msgstr "Єгипет" msgid "Western Sahara" -msgstr "" +msgstr "Західна Сахара" msgid "Eritrea" -msgstr "" +msgstr "Еритрея" -#, fuzzy msgid "Spain" -msgstr "Спем" +msgstr "Іспанія" msgid "Ethiopia" -msgstr "" +msgstr "Ефіопія" msgid "Europe" -msgstr "" +msgstr "Європа" msgid "Finland" -msgstr "" +msgstr "Фінляндія" msgid "Fiji" -msgstr "" +msgstr "Фіджі" msgid "Falkland Islands (Malvinas)" -msgstr "" +msgstr "Фолклендські острови (Британія)" msgid "Micronesia" -msgstr "" +msgstr "Мікронезія" msgid "Faroe Islands" -msgstr "" +msgstr "Фарерські острови" -#, fuzzy msgid "France" -msgstr "Україна" +msgstr "Франція" msgid "Gabon" -msgstr "" +msgstr "Габон" msgid "United Kingdom" -msgstr "" +msgstr "Великобританія" msgid "Grenada" -msgstr "" +msgstr "Гренада" msgid "Georgia" -msgstr "" +msgstr "Грузія" msgid "French Guiana" -msgstr "" +msgstr "Французька Гвіана" msgid "Guernsey" -msgstr "" +msgstr "Острів Гернсі" msgid "Ghana" -msgstr "" +msgstr "Гана" msgid "Gibraltar" -msgstr "" +msgstr "Гібралтар" msgid "Greenland" -msgstr "" +msgstr "Гренландія" msgid "Gambia" -msgstr "" +msgstr "Гамбія" msgid "Guinea" -msgstr "" +msgstr "Гвінея" msgid "Guadeloupe" -msgstr "" +msgstr "Гваделупа" msgid "Equatorial Guinea" -msgstr "" +msgstr "Екваторіальна Гвінея" msgid "Greece" -msgstr "" +msgstr "Греція" msgid "South Georgia and The South Sandwich Islands" -msgstr "" +msgstr "Південна Георгія і Південні Сандвічеві Острови" msgid "Guatemala" -msgstr "" +msgstr "Гватемала" msgid "Guam" -msgstr "" +msgstr "Гуам" msgid "Guinea-Bissau" -msgstr "" +msgstr "Гвінея-Бісау" msgid "Guyana" -msgstr "" +msgstr "Гайяна" msgid "Hong Kong" -msgstr "" +msgstr "Гонконг" msgid "Heard Island and McDonald Islands" -msgstr "" +msgstr "Острови Херд і Мак-Дональд" msgid "Honduras" -msgstr "" +msgstr "Гондурас" msgid "Croatia" -msgstr "" +msgstr "Хорватія" -#, fuzzy msgid "Haiti" -msgstr "Хіти" +msgstr "Гаїті" msgid "Hungary" -msgstr "" +msgstr "Угорщина" msgid "Indonesia" -msgstr "" +msgstr "Індонезія" msgid "Ireland" -msgstr "" +msgstr "Ірландія" msgid "Israel" -msgstr "" +msgstr "Ізраїль" msgid "Isle of Man" -msgstr "" +msgstr "Острів Мен" msgid "India" -msgstr "" +msgstr "Індія" msgid "British Indian Ocean Territory" -msgstr "" +msgstr "Британські Території в Індійському океані" msgid "Iraq" -msgstr "" +msgstr "Ірак" msgid "Iran" -msgstr "" +msgstr "Іран" msgid "Iceland" -msgstr "" +msgstr "Ісландія" msgid "Italy" -msgstr "" +msgstr "Італія" msgid "Jersey" -msgstr "" +msgstr "Джерсі" msgid "Jamaica" -msgstr "" +msgstr "Ямайка" msgid "Jordan" -msgstr "" +msgstr "Йорданія" msgid "Japan" -msgstr "" +msgstr "Японія" msgid "Kenya" -msgstr "" +msgstr "Кенія" msgid "Kyrgyzstan" -msgstr "" +msgstr "Киргизстан" msgid "Cambodia" -msgstr "" +msgstr "Камбоджа" msgid "Kiribati" -msgstr "" +msgstr "Кірибаті" msgid "Comoros" -msgstr "" +msgstr "Коморські острови" msgid "Saint Kitts and Nevis" -msgstr "" +msgstr "Сент-Кітс і Невіс" msgid "North Korea" -msgstr "" +msgstr "Північна Корея" msgid "South Korea" -msgstr "" +msgstr "Південна Корея" msgid "Kuwait" -msgstr "" +msgstr "Кувейт" msgid "Cayman Islands" -msgstr "" +msgstr "Кайманові острови" msgid "Kazakhstan" -msgstr "" +msgstr "Казахстан" msgid "Laos" -msgstr "" +msgstr "Лаос" -#, fuzzy msgid "Lebanon" -msgstr "Причина" +msgstr "Ліван" msgid "Saint Lucia" -msgstr "" +msgstr "Сент-Люсія" msgid "Liechtenstein" -msgstr "" +msgstr "Ліхтенштейн" msgid "Sri Lanka" -msgstr "" +msgstr "Шрі-Ланка" msgid "Liberia" -msgstr "" +msgstr "Ліберія" msgid "Lesotho" -msgstr "" +msgstr "Лесото" msgid "Lithuania" -msgstr "" +msgstr "Литва" msgid "Luxembourg" -msgstr "" +msgstr "Люксембург" msgid "Latvia" -msgstr "" +msgstr "Латвія" msgid "Libyan Arab Jamahiriya" -msgstr "" +msgstr "Лівійська Арабська Джамахірія" msgid "Morocco" -msgstr "" +msgstr "Марокко" msgid "Monaco" -msgstr "" +msgstr "Монако" msgid "Moldova" -msgstr "" +msgstr "Молдова" msgid "Montenegro" -msgstr "" +msgstr "Чорногорія" msgid "Saint Martin" -msgstr "" +msgstr "Сен-Мартен" msgid "Madagascar" -msgstr "" +msgstr "Мадагаскар" msgid "Marshall Islands" -msgstr "" +msgstr "Маршаллові острови" msgid "Macedonia" -msgstr "" +msgstr "Македонія" msgid "Mali" -msgstr "" +msgstr "Малі" msgid "Myanmar" -msgstr "" +msgstr "М’янма" msgid "Mongolia" -msgstr "" +msgstr "Монголія" msgid "Macao" -msgstr "" +msgstr "Макао" msgid "Northern Mariana Islands" -msgstr "" +msgstr "Північні Маріанські Острови" msgid "Martinique" -msgstr "" +msgstr "Мартиніка" msgid "Mauritania" -msgstr "" +msgstr "Мавританія" msgid "Montserrat" -msgstr "" +msgstr "Монтсеррат" msgid "Malta" -msgstr "" +msgstr "Мальта" msgid "Mauritius" -msgstr "" +msgstr "Маврикій" msgid "Maldives" -msgstr "" +msgstr "Мальдіви" msgid "Malawi" -msgstr "" +msgstr "Малаві" msgid "Mexico" -msgstr "" +msgstr "Мексика" msgid "Malaysia" -msgstr "" +msgstr "Малайзія" msgid "Mozambique" -msgstr "" +msgstr "Мозамбік" msgid "Namibia" -msgstr "" +msgstr "Намібія" msgid "New Caledonia" -msgstr "" +msgstr "Нова Каледонія" msgid "Niger" -msgstr "" +msgstr "Нігер" msgid "Norfolk Island" -msgstr "" +msgstr "Острів Норфолк" msgid "Nigeria" -msgstr "" +msgstr "Нігерія" msgid "Nicaragua" -msgstr "" +msgstr "Нікарагуа" msgid "Netherlands" -msgstr "" +msgstr "Нідерланди" msgid "Norway" -msgstr "" +msgstr "Норвегія" msgid "Nepal" -msgstr "" +msgstr "Непал" msgid "Nauru" -msgstr "" +msgstr "Науру" msgid "Niue" -msgstr "" +msgstr "Ніуе" msgid "New Zealand" -msgstr "" +msgstr "Нова Зеландія" msgid "Oman" -msgstr "" +msgstr "Оман" msgid "Panama" -msgstr "" +msgstr "Панама" msgid "Peru" -msgstr "" +msgstr "Перу" msgid "French Polynesia" -msgstr "" +msgstr "Французька Полінезія" msgid "Papua New Guinea" -msgstr "" +msgstr "Папуа-Нова Гвінея" msgid "Philippines" -msgstr "" +msgstr "Філіппіни" msgid "Pakistan" -msgstr "" +msgstr "Пакистан" msgid "Poland" -msgstr "" +msgstr "Польща" msgid "Saint Pierre and Miquelon" -msgstr "" +msgstr "Сен-П'єр і Мікелон" msgid "Pitcairn" -msgstr "" +msgstr "Піткерн" msgid "Puerto Rico" -msgstr "" +msgstr "Пуерто-Рико" msgid "Palestinian Territory" -msgstr "" +msgstr "Палестинська територія" msgid "Portugal" -msgstr "" +msgstr "Португалія" msgid "Palau" -msgstr "" +msgstr "Палау" msgid "Paraguay" -msgstr "" +msgstr "Парагвай" msgid "Qatar" -msgstr "" +msgstr "Катар" msgid "Reunion" -msgstr "" +msgstr "Реюньйон" msgid "Romania" -msgstr "" +msgstr "Румунія" msgid "Serbia" -msgstr "" +msgstr "Сербія" msgid "Russian Federation" -msgstr "Кацапи" +msgstr "Російська Федерація" msgid "Rwanda" -msgstr "" +msgstr "Руанда" msgid "Saudi Arabia" -msgstr "" +msgstr "Саудівська Аравія" msgid "Solomon Islands" -msgstr "" +msgstr "Соломонові Острови" msgid "Seychelles" -msgstr "" +msgstr "Сейшели" msgid "Sudan" -msgstr "" +msgstr "Судан" msgid "Sweden" -msgstr "" +msgstr "Швеція" msgid "Singapore" -msgstr "" +msgstr "Сінгапур" msgid "Saint Helena" -msgstr "" +msgstr "Острів Святої Єлени" msgid "Slovenia" -msgstr "" +msgstr "Словенія" msgid "Svalbard and Jan Mayen" -msgstr "" +msgstr "Острови Свальбард і Ян Маєн" msgid "Slovakia" -msgstr "" +msgstr "Словаччина" msgid "Sierra Leone" -msgstr "" +msgstr "Сьєрра-Леоне" msgid "San Marino" -msgstr "" +msgstr "Сан-Марино" -#, fuzzy msgid "Senegal" -msgstr "Загальна статистика" +msgstr "Сенегал" msgid "Somalia" -msgstr "" +msgstr "Сомалі" msgid "Suriname" -msgstr "" +msgstr "Суринам" + +msgid "South Sudan" +msgstr "Південний Судан" msgid "Sao Tome and Principe" -msgstr "" +msgstr "Сан-Томе і Принсипі" msgid "El Salvador" -msgstr "" +msgstr "Сальвадор" + +msgid "Sint Maarten" +msgstr "Сінт-Мартен" msgid "Syrian Arab Republic" -msgstr "" +msgstr "Сирійська Арабська Республіка" msgid "Swaziland" -msgstr "" +msgstr "Свазіленд" msgid "Turks and Caicos Islands" -msgstr "" +msgstr "Острови Теркс і Кайкос" msgid "Chad" -msgstr "" +msgstr "Чад" msgid "French Southern Territories" -msgstr "" +msgstr "Французькі Південні Території" msgid "Togo" -msgstr "" +msgstr "Того" msgid "Thailand" -msgstr "" +msgstr "Таїланд" msgid "Tajikistan" -msgstr "" +msgstr "Таджикистан" msgid "Tokelau" -msgstr "" +msgstr "Токелау" msgid "Timor-leste" -msgstr "" +msgstr "Східний Тимор" msgid "Turkmenistan" -msgstr "" +msgstr "Туркменістан" msgid "Tunisia" -msgstr "" +msgstr "Туніс" -#, fuzzy msgid "Tonga" -msgstr "Понг" +msgstr "Тонга" msgid "Turkey" -msgstr "" +msgstr "Туреччина" msgid "Trinidad and Tobago" -msgstr "" +msgstr "Тринідад та Тобаго" msgid "Tuvalu" -msgstr "" +msgstr "Тувалу" msgid "Taiwan" -msgstr "" +msgstr "Тайвань" msgid "Tanzania" -msgstr "" +msgstr "Танзанія" msgid "Ukraine" msgstr "Україна" msgid "Uganda" -msgstr "" +msgstr "Уганда" msgid "United States Minor Outlying Islands" -msgstr "" +msgstr "Американські Малі Віддалені Острови" msgid "United States" -msgstr "" +msgstr "США" msgid "Uruguay" -msgstr "" +msgstr "Уругвай" msgid "Uzbekistan" -msgstr "" +msgstr "Узбекистан" msgid "Holy See (Vatican City State)" -msgstr "" +msgstr "Святий Престол (Ватикан, Місто-Держава)" msgid "Saint Vincent and The Grenadines" -msgstr "" +msgstr "Сент-Вінсент і Гренадіни" msgid "Venezuela" -msgstr "" +msgstr "Венесуела" msgid "British Virgin Islands" -msgstr "" +msgstr "Віргінські острови (Британія)" msgid "U.S. Virgin Islands" -msgstr "" +msgstr "Американські Віргінські Острови (США)" msgid "Viet Nam" -msgstr "" +msgstr "В'єтнам" msgid "Vanuatu" -msgstr "" +msgstr "Вануату" msgid "Wallis and Futuna" -msgstr "" +msgstr "Уолліс і Футуна" -#, fuzzy msgid "Samoa" -msgstr "Спем" +msgstr "Самоа" msgid "Yemen" -msgstr "" +msgstr "Ємен" msgid "Mayotte" -msgstr "" +msgstr "Майотта" msgid "South Africa" -msgstr "" +msgstr "Південна Африка" msgid "Zambia" -msgstr "" +msgstr "Замбія" msgid "Zimbabwe" -msgstr "" +msgstr "Зімбабве" msgid "MAGNET URI contained source URL for an unsupported protocol" msgstr "" -#, fuzzy, c-format +#, c-format msgid "%u Byte" msgid_plural "%u Bytes" -msgstr0 "%u Байтів" -msgstr1 "%u Байтів" +msgstr0 "%u байт" +msgstr1 "%u байти" +msgstr2 "%u байтів" -#, fuzzy, c-format +#, c-format msgid "%u Byte" msgid_plural "%u Bytes" -msgstr0 "%u Байтів" -msgstr1 "%u Байтів" +msgstr0 "%u байт" +msgstr1 "%u байти" +msgstr2 "%u байтів" #, c-format msgid "%s (%s bytes)" -msgstr "" +msgstr "%s (%s байтів)" #. TRANSLATORS: Don't translate 'B', just 's' is allowed. msgid "B/s" -msgstr "" +msgstr "Б/с" #, c-format msgid "%ud %uh" @@ -4199,7 +5539,7 @@ #, c-format msgid "%us" -msgstr "" +msgstr "%uс" msgid "locale_get_language|en" msgstr "uk" @@ -4210,22 +5550,20 @@ msgid "URL missing" msgstr "" -#, fuzzy msgid "The download could not be created" -msgstr "Немає слоту для скачування" +msgstr "" -#, fuzzy msgid "Download added" -msgstr "Скачано" +msgstr "Додано звантаження" msgid "Unknown operation" msgstr "Невідома операція" msgid "Unknown command" -msgstr "НЕвідома команда" +msgstr "Невідома команда" msgid "No help available" -msgstr "" +msgstr "Довідки не передбачено" msgid "Hops" msgstr "" @@ -4253,13 +5591,20 @@ msgid "Interactive mode turned off." msgstr "" -#, fuzzy +#, c-format +msgid "Unknown operation \"show %s\"" +msgstr "" + +#, c-format +msgid "Unknown operation \"%s\"" +msgstr "Невідома дія «%s»" + msgid "Cannot determine current working directory" -msgstr "Не можу знайти вашу домашню директорію" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Unknown logfile name \"%s\"" -msgstr "Невідома властивість" +msgstr "" msgid "Unable to reopen" msgstr "" @@ -4268,21 +5613,17 @@ msgid "Could not rename logfile as \"%s\": %m" msgstr "" -#, fuzzy, c-format -msgid "Unknown operation \"%s\"" -msgstr "Невідома операція" - -#, fuzzy, c-format -msgid "Unknown operation \"show %s\"" -msgstr "Невідома операція" - -#, fuzzy, c-format +#, c-format msgid "Unknown operation \"stats %s\"" -msgstr "Невідома операція" +msgstr "" -#, fuzzy, c-format +#, c-format +msgid "Unknown operation \"check %s\"" +msgstr "" + +#, c-format msgid "Unknown operation \"usage %s\"" -msgstr "Невідома операція" +msgstr "" msgid "Invalid IP/Port" msgstr "Неправильний IP/порт" @@ -4290,29 +5631,28 @@ msgid "Node added" msgstr "Вузол додано" -#, fuzzy msgid "Invalid IP" -msgstr "Неправильний IP/порт" +msgstr "" -#, fuzzy msgid "Invalid port" -msgstr "Неправильний IP/порт" +msgstr "Некоректний порт" #, c-format msgid "Removed %u node" msgid_plural "Removed %u nodes" msgstr0 "" msgstr1 "" +msgstr2 "" msgid "Property missing" msgstr "Властивість відсутня" -#, fuzzy, c-format +#, c-format msgid "Unknown property \"%s\"" -msgstr "Невідома властивість" +msgstr "Невідома властивість «%s»" msgid "Value: " -msgstr "Значення" +msgstr "Значення " msgid "Value found and displayed" msgstr "" @@ -4323,9 +5663,11 @@ msgid "Good bye" msgstr "До побачення" -#, fuzzy +msgid "Invalid command syntax" +msgstr "" + msgid "Query string missing" -msgstr "Властивість відсутня" +msgstr "" msgid "Query string is not UTF-8 encoded" msgstr "" @@ -4333,16 +5675,17 @@ msgid "Search added" msgstr "Пошук додано" -#, fuzzy msgid "The search could not be created" -msgstr "Немає слоту для скачування" +msgstr "" msgid "Unknown property" msgstr "Невідома властивість" -#, fuzzy msgid "Value missing" -msgstr "Властивість відсутня" +msgstr "Не вистачає значення" + +msgid "Property cannot be changed" +msgstr "" #, c-format msgid "Previous value was %s" @@ -4364,79 +5707,37 @@ msgid "unterminated single-quoted string" msgstr "" -msgid "Invalid command syntax" +msgid "too many arguments in command" msgstr "" -msgid "too many arguments in command" +#, c-format +msgid "un-parseable argument #%u in command" msgstr "" msgid "Malformed command" msgstr "Спотворена команда" -#, fuzzy, c-format +#, c-format msgid "Unknown command: \"%s\"" -msgstr "НЕвідома команда" +msgstr "Невідома команда: «%s»" msgid "Help: " -msgstr "Допомога:" - -msgid "Bitzi|Unknown" -msgstr "" - -msgid "Bitzi|Unrated" -msgstr "" - -msgid "Bitzi|Bitzi lookup failure" -msgstr "" - -msgid "Bitzi|Filesize mismatch" -msgstr "" - -msgid "Bitzi|Dangerous/Misleading" -msgstr "" - -msgid "Bitzi|Incomplete/Damaged" -msgstr "" - -msgid "Bitzi|Substandard" -msgstr "" - -msgid "Bitzi|Overrated" -msgstr "" - -msgid "Bitzi|Normal" -msgstr "" - -msgid "Bitzi|Underrated" -msgstr "" - -msgid "Bitzi|Complete" -msgstr "" - -msgid "Bitzi|Recommended" -msgstr "" - -msgid "Bitzi|Best Version" -msgstr "" - -msgid "No other data" -msgstr "" +msgstr "Допомога: " msgid "Filename" -msgstr "" +msgstr "Назва файла" -#, fuzzy msgid "Created" -msgstr "З'єднано" +msgstr "Створено" msgid "Modified" -msgstr "" +msgstr "Змінено" msgid "SHA-1" -msgstr "" +msgstr "SHA-1" msgid "Not available" -msgstr "" +msgstr "Недоступний" msgid "Bitprint" msgstr "" @@ -4448,10 +5749,16 @@ msgid "Tigertree" msgstr "" -msgid "External metadata" +msgid "Rescheduled for" +msgstr "" + +msgid "Restartable since" msgstr "" -msgid "Bitzi URL" +msgid "rescheduled for" +msgstr "" + +msgid "restartable since" msgstr "" #, c-format @@ -4496,9 +5803,8 @@ msgid "Reading headers" msgstr "" -#, fuzzy msgid "UDP push sent" -msgstr "Push відіслано" +msgstr "" msgid "Searching for new push-proxies" msgstr "" @@ -4517,17 +5823,16 @@ msgstr "" msgid "Aborted" -msgstr "" +msgstr "Припинено" msgid "Completed" -msgstr "" +msgstr "Завершено" msgid "Chunk done" msgstr "" -#, fuzzy msgid "Waiting for TTH checking..." -msgstr "Чекаєм на вільний кусок (chunk)" +msgstr "" msgid "Waiting for SHA1 checking..." msgstr "" @@ -4563,11 +5868,10 @@ msgstr "" msgid "(stalled)" -msgstr "" +msgstr "(застрягло)" -#, fuzzy msgid "Receiving data" -msgstr "Отримано" +msgstr "Отримання даних…" msgid "ignoring" msgstr "" @@ -4584,9 +5888,6 @@ msgid "Awaiting data" msgstr "" -msgid "Unknown error" -msgstr "Невідома помилка" - #, c-format msgid "Retry in %us" msgstr "" @@ -4600,53 +5901,51 @@ msgid_plural "Forgot %u downloads" msgstr0 "" msgstr1 "" +msgstr2 "" -#, fuzzy msgid "Filename (filtered)" -msgstr "Назва файла:" +msgstr "" msgid "Progress" msgstr "Прогрес" msgid "RX" -msgstr "" +msgstr "RX" -#, fuzzy msgid "Downloaded" -msgstr "Скачано" +msgstr "Звантажено" -#, fuzzy msgid "Uploaded" -msgstr "Завантажено" +msgstr "Вивантажено" msgid "Sources" msgstr "Джерела" msgid "Status" -msgstr "" +msgstr "Стан" msgid "Active" -msgstr "" +msgstr "Активний" -#, fuzzy msgid "Incomplete" -msgstr "Завершено" +msgstr "Не завершено" msgid "Orphaned" -msgstr "" +msgstr "Осиротілий" msgid "All" -msgstr "" +msgstr "Всі" -#, fuzzy, c-format +#, c-format msgid "regex error: %s" -msgstr "Провалилось (Помилка: %s)" +msgstr "помилка у формальному виразі: %s" #, c-format msgid "Selected %u of %u download matching \"%s\"." msgid_plural "Selected %u of %u downloads matching \"%s\"." msgstr0 "" msgstr1 "" +msgstr2 "" msgid "starts with" msgstr "починається на" @@ -4658,16 +5957,16 @@ msgstr "закінчується на" msgid "contains the substring" -msgstr "" +msgstr "містить підрядок" msgid "matches the regex pattern" -msgstr "" +msgstr "відповідає формальному виразу" msgid "is exactly" -msgstr "" +msgstr "дорівнює" msgid "Built-in targets" -msgstr "" +msgstr "Вбудовані цілі" msgid "Global filters" msgstr "Глобальні фільтри" @@ -4697,19 +5996,19 @@ msgstr "Правило" msgid "Match" -msgstr "" +msgstr "Відповідність" msgid "!" -msgstr "" +msgstr "!" msgid "Condition" msgstr "Стан" msgid "Target" -msgstr "Ціль" +msgstr "Призначення" msgid "(case-sensitive)" -msgstr "" +msgstr "(з врахуванням регістру)" #, c-format msgid "If filename begins with \"%s\" %s" @@ -4819,10 +6118,10 @@ msgstr "" msgid "(deactivated)" -msgstr "" +msgstr "(вимкнено)" msgid "(invalid)" -msgstr "" +msgstr "(некоректне)" msgid "<Archive>" msgstr "" @@ -4848,647 +6147,32 @@ msgid "RETURN" msgstr "" -msgid "Query hit" -msgstr "" - -msgid "DHT (truncated)" -msgstr "" - -msgid "Routing errors" -msgstr "" - -msgid "Routing table chunks" -msgstr "" - -msgid "Routing table message capacity" -msgstr "" - -msgid "Routing table message count" -msgstr "" - -msgid "Duplicates with higher TTL" -msgstr "" - -msgid "SPAM SHA1 database hits" -msgstr "" - -msgid "SPAM filename and size hits" -msgstr "" - -msgid "SPAM fake hits" -msgstr "" - -msgid "SPAM duplicate hits" -msgstr "" - -msgid "SPAM dynamically caught hostile IP addresses" -msgstr "" - -msgid "SPAM dynamically caught hostile IP held" -msgstr "" - -msgid "SPAM spotted spamming IP addresses held" -msgstr "" - -msgid "Searches to local DB" -msgstr "" - -msgid "Hits on local DB" -msgstr "" - -msgid "Hits on local partial files" -msgstr "" - -msgid "Hits on \"what's new?\" queries" -msgstr "" - -msgid "Query hits received for local queries" -msgstr "" - -msgid "Query hits received for OOB-proxied queries" -msgstr "" - -msgid "Queries requesting OOB hit delivery" -msgstr "" - -msgid "Stripped OOB flag on queries" -msgstr "" - -msgid "Duplicate OOB-proxied queries" -msgstr "" - -msgid "OOB hits received for OOB-proxied queries" -msgstr "" - -msgid "OOB hits bearing alien IP address" -msgstr "" - -msgid "OOB hits ignored due to identified spamming address" -msgstr "" - -msgid "Unclaimed locally-generated OOB hits" -msgstr "" - -msgid "Partially claimed locally-generated OOB hits" -msgstr "" - -msgid "Spurious OOB hit claiming received" -msgstr "" - -msgid "Unrequested OOB hits received" -msgstr "" - -msgid "Received query hits for untracked queries" -msgstr "" - -msgid "Tracked query MUIDs" -msgstr "" - -msgid "Compacted queries" -msgstr "" - -msgid "Bytes saved by compacting" -msgstr "" - -msgid "UTF8 queries" -msgstr "" - -msgid "SHA1 queries" -msgstr "" - -msgid "\"What's New?\" queries" -msgstr "" - -msgid "GUESS queries" -msgstr "" - -msgid "GUESS queries (0.2)" -msgstr "" - -msgid "GUESS cached query keys held" -msgstr "" - -msgid "GUESS cached 0.2 hosts held" -msgstr "" - -msgid "GUESS locally generated queries" -msgstr "" - -msgid "GUESS currently running queries" -msgstr "" - -msgid "GUESS hits received for locally generated queries" -msgstr "" - -msgid "GUESS hosts queried" -msgstr "" - -msgid "GUESS hosts sending back an acknowledgment" -msgstr "" - -msgid "Broadcasted push messages" -msgstr "" - -msgid "Push-proxy UDP relayed messages" -msgstr "" - -msgid "Push-proxy TCP relayed messages" -msgstr "" - -msgid "Push-proxy broadcasted messages" -msgstr "" - -msgid "Push-proxy found un-proxied local route" -msgstr "" - -msgid "Push-proxy lookup failures" -msgstr "" - -msgid "Push relayed via local route" -msgstr "" - -msgid "Push relayed via routing table" -msgstr "" - -msgid "Locally generated dynamic queries" -msgstr "" - -msgid "Leaf-generated dynamic queries" -msgstr "" - -msgid "OOB-proxied leaf queries" -msgstr "" - -msgid "Fully completed dynamic queries" -msgstr "" - -msgid "Partially completed dynamic queries" -msgstr "" - -msgid "Dynamic queries ended with no results" -msgstr "" - -msgid "Fully completed dynamic queries getting late results" -msgstr "" - -msgid "Dynamic queries with partial late results" -msgstr "" - -msgid "Dynamic queries completed by late results" -msgstr "" - -msgid "Queries seen from GTKG" -msgstr "" - -msgid "Queries seen from GTKG that were re-queries" -msgstr "" - -msgid "Queries advertising support of GGEP \"H\"" -msgstr "" - -msgid "GIV callbacks received" -msgstr "" - -msgid "GIV discarded due to no suitable download" -msgstr "" - -msgid "QUEUE callbacks received" -msgstr "" - -msgid "QUEUE discarded due to no suitable download" -msgstr "" - -msgid "UDP messages with bogus source IP" -msgstr "" - -msgid "Alien UDP messages (non-Gnutella)" -msgstr "Чужі UDP повідомлення (не Gnutella)" - -msgid "Unprocessed UDP Gnutella messages" -msgstr "" - -msgid "Compressed UDP messages enqueued" -msgstr "" - -msgid "Compressed UDP messages received" -msgstr "" - -msgid "Uncompressed UDP messages due to no gain" -msgstr "" - -msgid "Consolidated servers (after GUID and IP address linking)" -msgstr "" - -msgid "Duplicate downloads found during server consolidation" -msgstr "" - -msgid "Discovered server GUIDs" -msgstr "" - -msgid "Changed server GUIDs" -msgstr "" - -msgid "Detected GUID collisions" -msgstr "" - -msgid "Detected collisions with our own GUID" -msgstr "" - -msgid "GUID dynamically banned" -msgstr "" - -msgid "Firewalled node info for known hosts received in upload requests" -msgstr "" - -msgid "Revitalized PUSH routes" -msgstr "" - -msgid "Collected new PUSH proxies from other query hits" -msgstr "" - -msgid "Attempted download resource switching on completion" -msgstr "" - -msgid "Attempted download resource switching after error" -msgstr "" - -msgid "Successful download resource switching (all kind)" -msgstr "" - -msgid "Successful download resource switching between plain files" -msgstr "" - -msgid "Successful download resource switching after error" -msgstr "" - -msgid "Actively queued after resource switching attempt" -msgstr "" - -msgid "Sunk HTTP reply data on error codes" -msgstr "" - -msgid "Ignored downloaded data" -msgstr "" - -msgid "Ignoring requested after data mismatch" -msgstr "" - -msgid "Ignoring requested to preserve connection" -msgstr "" - -msgid "Ignoring requested due to aggressive swarming" -msgstr "" - -msgid "Ignoring refused (data too large or server too slow)" -msgstr "" - -msgid "Client resource switching (all detected)" -msgstr "" - -msgid "Client resource switching between plain files" -msgstr "" - -msgid "Client follow-up request after HTTP error was returned" -msgstr "" - -msgid "PARQ client resource switching in slots (SHA-1 based)" -msgstr "" - -msgid "PARQ client retry-after violation" -msgstr "" - -msgid "PARQ client kicked out after too many retry-after violations" -msgstr "" - -msgid "PARQ upload slot limit overrides" -msgstr "" - -msgid "PARQ quick upload slots granted" -msgstr "" - -msgid "PARQ QUEUE sending attempts" -msgstr "" - -msgid "PARQ QUEUE messages sent" -msgstr "" - -msgid "PARQ QUEUE follow-up requests received" -msgstr "" - -msgid "Launched SHA-1 file verifications" -msgstr "" - -msgid "Launched TTH file verifications" -msgstr "" - -msgid "Bitzi tickets held" -msgstr "" - -msgid "Re-seeding of orphan downloads through query hits" -msgstr "" - -msgid "Re-seeding of orphan downloads through upload requests" -msgstr "" - -msgid "DHT estimated amount of nodes" -msgstr "" - -msgid "DHT k-ball theoretical frontier (bits)" -msgstr "" - -msgid "DHT k-ball furthest frontier (bits)" -msgstr "" - -msgid "DHT k-ball closeest frontier (bits)" -msgstr "" - -msgid "DHT routing table buckets" -msgstr "" - -msgid "DHT routing table leaves" -msgstr "" - -msgid "DHT routing table maximum depth" -msgstr "" - -msgid "DHT routing table good nodes" -msgstr "" - -msgid "DHT routing table stale nodes" -msgstr "" - -msgid "DHT routing table pending nodes" -msgstr "" - -msgid "DHT routing table evicted nodes" -msgstr "" - -msgid "DHT routing table evicted firewalled nodes" -msgstr "" - -msgid "DHT routing table evicted nodes due to quota" -msgstr "" - -msgid "DHT routing table promoted pending nodes" -msgstr "" - -msgid "DHT routing table pinged promoted nodes" -msgstr "" - -msgid "DHT routing table rejected node due to bucket network quota" -msgstr "" - -msgid "DHT routing table rejected node due to global network quota" -msgstr "" - -msgid "DHT completed bucket refreshes" -msgstr "" - -msgid "DHT forced bucket refreshes" -msgstr "" - -#, fuzzy -msgid "DHT forced bucket merges" -msgstr "Спотворена команда" - -msgid "DHT denied non-splitable bucket refresh" -msgstr "" - -msgid "DHT initiated bucket alive checks" -msgstr "" - -msgid "DHT alive pings sent to good nodes" -msgstr "" - -msgid "DHT alive pings sent to stale nodes" -msgstr "" - -msgid "DHT alive pings sent to shutdowning nodes" -msgstr "" - -msgid "DHT alive pings avoided" -msgstr "" - -msgid "DHT alive pings skipped" -msgstr "" - -msgid "DHT revitalized stale nodes on RPC reply" -msgstr "" - -msgid "DHT value store rejected on IP/network quota grounds" -msgstr "" - -msgid "DHT value store rejected on creator validation grounds" -msgstr "" - -msgid "DHT nodes rejected during lookup based on network quota" -msgstr "" - -msgid "DHT nodes rejected during lookup based on suspicious proximity" -msgstr "" - -msgid "DHT nodes rejected during lookup based on frequency divergence" -msgstr "" - -msgid "DHT keys held" -msgstr "" - -msgid "DHT cached keys held" -msgstr "" - -msgid "DHT values held" -msgstr "" - -msgid "DHT cached KUID targets held" -msgstr "" - -msgid "DHT cached closest root nodes" -msgstr "" - -msgid "DHT cached roots exact hits" -msgstr "" - -msgid "DHT cached roots approximate hits" -msgstr "" - -msgid "DHT cached roots misses" -msgstr "" - -msgid "DHT cached roots lookups within k-ball" -msgstr "" - -msgid "DHT cached roots contact address refreshed" -msgstr "" - -msgid "DHT cached security tokens held" -msgstr "" - -msgid "DHT cached security tokens hits" -msgstr "" - -#, fuzzy -msgid "DHT stable node information held" -msgstr "Детальна інформація" - -msgid "DHT local hits on value lookups" -msgstr "" - -msgid "DHT local hits returning values from cached keys" -msgstr "" - -msgid "DHT returned expanded values" -msgstr "" - -msgid "DHT returned values as secondary keys" -msgstr "" - -msgid "DHT claimed values via secondary keys" -msgstr "" - -msgid "DHT returned cached expanded values" -msgstr "" - -msgid "DHT returned cached values as secondary-keys" -msgstr "" - -msgid "DHT claimed cached values via secondary keys" -msgstr "" - -msgid "DHT successfully received value publications" -msgstr "" - -msgid "DHT successfully received value removals" -msgstr "" - -msgid "DHT replication of stale value avoided" -msgstr "" - -msgid "DHT replication of held values" -msgstr "" - -msgid "DHT republishing of held values" -msgstr "" - -msgid "DHT secondary-key value fetch issued" -msgstr "" - -msgid "DHT duplicate values returned in lookups" -msgstr "" - -msgid "DHT detected KUID collisions" -msgstr "" - -msgid "DHT detected collisions with our own KUID" -msgstr "" - -msgid "DHT detected KUID mismatches on RPC reply" -msgstr "" - -msgid "DHT caching attempts" -msgstr "" - -msgid "DHT caching ended successfully" -msgstr "" - -msgid "DHT caching partially completed" -msgstr "" - -msgid "DHT key-offloading checks after discovering new closest node" -msgstr "" - -msgid "DHT keys selected for offloading" -msgstr "" - -msgid "DHT key-offloading attempts" -msgstr "" - -msgid "DHT key-offloading ended successfully" -msgstr "" - -msgid "DHT key-offloading partially completed" -msgstr "" - -msgid "DHT values successfully offloaded" -msgstr "" - -msgid "DHT publishing attempts" -msgstr "" - -msgid "DHT publishing ended successfully (all roots)" -msgstr "" - -msgid "DHT publishing partially completed (root subset only)" -msgstr "" - -msgid "DHT publishing ending with proper value presence" -msgstr "" - -msgid "DHT value republishing occurring too late (after expiry)" -msgstr "" - -msgid "DHT publishing to self" -msgstr "" - -msgid "DHT background publishing completion attempts" -msgstr "" - -msgid "DHT background publishing completion showing improvements" -msgstr "" - -msgid "DHT background publishing completion successful (all roots)" -msgstr "" - -msgid "DHT SHA1 data type collisions" -msgstr "" - -msgid "DHT lookup path passively protected against attack" -msgstr "" - -msgid "DHT lookup path actively protected against attack" -msgstr "" - -msgid "DHT alt-loc lookups issued" -msgstr "" - -msgid "DHT push-proxy lookups issued" -msgstr "" - -msgid "DHT successful alt-loc lookups" -msgstr "" - -msgid "DHT successful push-proxy lookups" -msgstr "" - -msgid "DHT successful node push-entry lookups" -msgstr "" - -msgid "DHT re-seeding of orphan downloads" -msgstr "" - msgid "node" msgid_plural "nodes" msgstr0 "вузол" -msgstr1 "вузлів" +msgstr1 "вузли" +msgstr2 "вузлів" msgid "file" msgid_plural "files" msgstr0 "файл" -msgstr1 "файлів" +msgstr1 "файли" +msgstr2 "файлів" msgid "Please choose a directory to share" -msgstr "" +msgstr "Будь ласка, вкажіть каталог для оприлюднення" msgid "Please choose where to move files after successful download" -msgstr "Будь-ласка вкажіть куди класти файли після вдалого скачування файлів" +msgstr "Будь ласка, вкажіть, куди пересувати файли після вдалого отримання" msgid "Please choose where to store files while downloading" -msgstr "Будь-ласка вкажіть куди класти файли під час скачування" +msgstr "Будь ласка, вкажіть, де зберігати файли під час отримання" msgid "Please choose where to move corrupted files" -msgstr "Будь-ласка вкажіть куди класти пошкоджені файли" +msgstr "Будь ласка, вкажіть, куди слід пересувати пошкоджені файли" msgid " Clear completed " -msgstr "" +msgstr " Спорожнення завершено " msgid " Gnutella browse requests" msgstr "" @@ -5503,31 +6187,31 @@ msgstr "" msgid " passive)" -msgstr "" +msgstr " пасивний)" msgid " queued (" -msgstr "" +msgstr " у черзі (" msgid " registered, " -msgstr "" +msgstr " зареєстровано, " msgid " with sources" msgstr "" msgid "$Id$" -msgstr "" +msgstr "$Id$" msgid "%v/%u (%P%%)" -msgstr "" +msgstr "%v/%u (%P%%)" msgid "%v/%u Gnutella peers" msgstr "" msgid "%v/%u downloads" -msgstr "" +msgstr "%v/%u звантажень" msgid "%v/%u uploads" -msgstr "" +msgstr "%v/%u вивантажень" msgid "(Disable: 0, Random: 1)" msgstr "" @@ -5536,7 +6220,7 @@ msgstr "" msgid "(not forwarded)" -msgstr "" +msgstr "(не переспрямовано)" msgid "0 terms counted" msgstr "" @@ -5563,7 +6247,7 @@ msgstr "" msgid "Abort" -msgstr "" +msgstr "Перервати" msgid "About gtk-gnutella" msgstr "про gtk-gnutella" @@ -5575,31 +6259,31 @@ msgstr "" msgid "Add IP rule" -msgstr "" +msgstr "Додати правило IP-адреси" msgid "Add as search" -msgstr "" +msgstr "Додати як пошук" msgid "Add flag rule" -msgstr "" +msgstr "Додати правило прапорця" msgid "Add jump rule" -msgstr "" +msgstr "Додати правило переходу" msgid "Add name rule" -msgstr "" +msgstr "Додати правило назви" msgid "Add size rule" -msgstr "" +msgstr "Додати правило розміру" msgid "Add state rule" -msgstr "" +msgstr "Додати правило стану" msgid "Add" msgstr "Додати" msgid "Aliases" -msgstr "" +msgstr "Псевдоніми" msgid "Allow connections from and to _LAN addresses" msgstr "" @@ -5616,28 +6300,28 @@ msgstr "" msgid "Apply" -msgstr "" +msgstr "Застосувати" msgid "Attempts" -msgstr "" +msgstr "Спроби" msgid "Auto clear completed uploads" -msgstr "" +msgstr "Автоматично вилучати завершені вивантаження" msgid "Auto clear failed uploads" -msgstr "" +msgstr "Автоматично вилучати вивантаження з помилками" msgid "Automatically clear finished files" -msgstr "" +msgstr "Автоматично вилучати завершені файли" msgid "Automatically clear sources when..." -msgstr "" +msgstr "Автоматично вилучати джерела, якщо…" msgid "Available bandwidth" -msgstr "" +msgstr "Доступна ширина каналу" msgid "Available physical memory:" -msgstr "" +msgstr "Доступна фізична пам’ять:" msgid "Avg. time between IP address changes:" msgstr "" @@ -5649,7 +6333,7 @@ msgstr "" msgid "Bad hosts" -msgstr "" +msgstr "Помилкові вузли" msgid "Bandwidth limits for Gnutella traffic" msgstr "" @@ -5664,10 +6348,10 @@ msgstr "" msgid "Bandwidth" -msgstr "" +msgstr "Ширина каналу" msgid "Banning" -msgstr "" +msgstr "Блокування" msgid "Beautify filenames by removing needless underscores" msgstr "" @@ -5675,12 +6359,6 @@ msgid "Bind to this address" msgstr "" -msgid "Bitzi Metadata" -msgstr "" - -msgid "Bitzi metadata" -msgstr "" - msgid "Browse Host" msgstr "" @@ -5688,22 +6366,22 @@ msgstr "" msgid "Busy" -msgstr "" +msgstr "Зайнятий" msgid "Bytes to back off on mismatch" msgstr "" msgid "Cache" -msgstr "" +msgstr "Кеш" msgid "Cancel" -msgstr "" +msgstr "Скасувати" msgid "Case-sensitive sorting" -msgstr "" +msgstr "Впорядкування з урахуванням регістру" msgid "Chunks/Files:" -msgstr "Кусків/Файлів:" +msgstr "Шматків/Файлів:" msgid "Cl_ose search" msgstr "" @@ -5712,7 +6390,7 @@ msgstr "" msgid "Clear all" -msgstr "" +msgstr "Вилучити все" msgid "Clear already completed uploads from list" msgstr "" @@ -5724,13 +6402,13 @@ msgstr "" msgid "Clear results" -msgstr "" +msgstr "Вилучити результати" msgid "Clear stopped" msgstr "" msgid "Clear" -msgstr "" +msgstr "Очистити" msgid "Click to toggle display." msgstr "" @@ -5741,12 +6419,11 @@ msgid "Clock synchronization" msgstr "" -#, fuzzy msgid "Close" -msgstr "_Закрити" +msgstr "Закрити" msgid "Collapse all" -msgstr "" +msgstr "Згорнути всі" msgid "Compressed length:" msgstr "" @@ -5776,7 +6453,7 @@ msgstr "" msgid "Configure columns" -msgstr "" +msgstr "Налаштувати стовпчики" msgid "Configured peermode" msgstr "" @@ -5788,20 +6465,19 @@ msgstr "" msgid "Connected time" -msgstr "Час, скікльки з'єднаний" +msgstr "Тривалість з’єднання" msgid "Connected time_out" -msgstr "" +msgstr "Час о_чікування з’єднання" msgid "Connectin_g timeout" -msgstr "" +msgstr "Час очі_кування на встановлення з’єднання" -#, fuzzy msgid "Connection counters" -msgstr "З'єднання не компресоване" +msgstr "Лічильники з’єднання" msgid "Connection settings" -msgstr "" +msgstr "Параметри з’єднання" msgid "Connections reserved for gtk-gnutella nodes" msgstr "" @@ -5821,7 +6497,7 @@ msgstr "" msgid "Copy URL to clipboard" -msgstr "" +msgstr "Скопіювати адресу до буфера" msgid "Copy browse-host results to passive searches" msgstr "" @@ -5830,16 +6506,16 @@ msgstr "" msgid "Copy rule" -msgstr "" +msgstr "Скопіювати правило" msgid "Core development:" msgstr "Розробка ядра:" msgid "Count" -msgstr "" +msgstr "Кількість" msgid "Country" -msgstr "" +msgstr "Країна" msgid "Cumulative _download rate" msgstr "" @@ -5851,27 +6527,25 @@ msgstr "Поточні налаштування IP (Адреса:Порт):" msgid "Current search:" -msgstr "" +msgstr "Поточний пошук:" msgid "Currently used" msgstr "" -#, fuzzy msgid "DHT traffic stats" -msgstr "статистика HTTP трафіка" +msgstr "" -#, fuzzy msgid "DHT traffic" -msgstr "HTTP трафік" +msgstr "DHT трафік" msgid "Debugging" -msgstr "" +msgstr "Діагностика" msgid "Default search _reissue timeout" msgstr "" msgid "Default value:" -msgstr "" +msgstr "Типове значення:" msgid "Delay in seconds to wait after HTTP busy indication" msgstr "" @@ -5898,7 +6572,7 @@ msgstr "" msgid "Details" -msgstr "" +msgstr "Подробиці" msgid "Discard results without SHA-1 hashes" msgstr "" @@ -5921,18 +6595,17 @@ msgid "Do you really want to quit?" msgstr "Ви справді хочете вийти?" -#, fuzzy msgid "Download" -msgstr "Скачано" +msgstr "Звантажити" msgid "Downloaded:" -msgstr "Скачано" +msgstr "Отримано:" msgid "Downloading from multiple sources (swarming)" msgstr "" msgid "Downloads" -msgstr "" +msgstr "Звантаження" msgid "Dropped" msgstr "" @@ -5949,9 +6622,8 @@ msgid "Enable \"_Browse Host\" feature" msgstr "" -#, fuzzy msgid "Enable _DHT" -msgstr "Включити _UDP" +msgstr "" msgid "Enable _UDP" msgstr "Включити _UDP" @@ -5990,13 +6662,13 @@ msgstr "" msgid "Expand all" -msgstr "" +msgstr "Розгорнути всі" msgid "Expert mode" -msgstr "" +msgstr "Режим експерта" msgid "Expired" -msgstr "" +msgstr "Застаріло" msgid "FC/_TTL" msgstr "" @@ -6007,9 +6679,8 @@ msgid "File scanning time:" msgstr "" -#, fuzzy msgid "File transfers" -msgstr "Даних перенесено" +msgstr "Перенесення файлів" msgid "Files scanned" msgstr "" @@ -6038,9 +6709,8 @@ msgid "Force push mode" msgstr "" -#, fuzzy msgid "Forget" -msgstr "Ціль" +msgstr "Забути" msgid "" "Forwarded\n" @@ -6051,7 +6721,7 @@ msgstr "" msgid "Frequently Asked Questions" -msgstr "" +msgstr "Поширені запитання" msgid "Fully served " msgstr "" @@ -6062,9 +6732,8 @@ msgid "GUID:" msgstr "GUID:" -#, fuzzy msgid "KUID:" -msgstr "GUID:" +msgstr "" msgid "Gen. queued" msgstr "" @@ -6076,50 +6745,43 @@ msgstr "" msgid "General" -msgstr "" +msgstr "Загальне" msgid "Generated queries" msgstr "" msgid "Generation:" -msgstr "" +msgstr "Створення:" msgid "Global DHT outgoing traffic" msgstr "" -#, fuzzy msgid "Gnutella TTL settings" -msgstr "Загальна статистика" +msgstr "" -#, fuzzy msgid "Gnutella _leaf traffic stats" -msgstr "статистика Gnet трафіка" +msgstr "" -#, fuzzy msgid "Gnutella display" -msgstr "Загальна статистика" +msgstr "" -#, fuzzy msgid "Gnutella message size limits" -msgstr "Загальна статистика" +msgstr "" msgid "Gnutella network mode" msgstr "" -#, fuzzy msgid "Gnutella peers" -msgstr "Загальна статистика" +msgstr "" msgid "Gnutella timeouts (all values in seconds)" msgstr "" -#, fuzzy msgid "Gnutella traffic" -msgstr "GnutellaNet трафік" +msgstr "Gnutella трафік" -#, fuzzy msgid "Gnutella" -msgstr "GnutellaNet трафік" +msgstr "" msgid "HTTP traffic" msgstr "HTTP трафік" @@ -6128,13 +6790,13 @@ msgstr "" msgid "H_ost:" -msgstr "Х_ост" +msgstr "В_узол:" msgid "Hard limit of _file descriptors used" msgstr "" msgid "Hits" -msgstr "Хіти" +msgstr "Спроб" msgid "Honor OOB flag in queries" msgstr "" @@ -6149,7 +6811,7 @@ msgstr "" msgid "Host" -msgstr "Хост" +msgstr "Вузол" msgid "Hostcache capacity" msgstr "" @@ -6172,13 +6834,11 @@ msgid "IP:Port:" msgstr "IP:порт" -#, fuzzy msgid "IPv4 settings" -msgstr "Налаштування IP" +msgstr "" -#, fuzzy msgid "IPv6 settings" -msgstr "Налаштування IP" +msgstr "" msgid "Ignore symbolically linked _directories" msgstr "" @@ -6214,13 +6874,13 @@ msgstr "" msgid "Keywords:" -msgstr "" +msgstr "Ключові слова:" msgid "KiB" -msgstr "" +msgstr "КіБ" msgid "KiB/s" -msgstr "" +msgstr "КіБ/с" msgid "Large enough uptime" msgstr "" @@ -6228,9 +6888,8 @@ msgid "Last Request" msgstr "" -#, fuzzy msgid "Last Upload" -msgstr "Завантажено" +msgstr "" msgid "Last check" msgstr "" @@ -6266,7 +6925,7 @@ msgstr "" msgid "Local networks" -msgstr "" +msgstr "Локальні мережі" msgid "Local node" msgstr "Локальний вузол" @@ -6320,7 +6979,7 @@ msgstr "" msgid "Max. simultaneous downloads" -msgstr "" +msgstr "Максимальна кількість одночасних завантажень" msgid "Max. simultaneous uploads" msgstr "" @@ -6341,7 +7000,7 @@ msgstr "" msgid "Maximum size:" -msgstr "" +msgstr "Максимальний розмір:" msgid "" "Maximum size\n" @@ -6370,7 +7029,7 @@ msgstr "" msgid "Minimum size:" -msgstr "" +msgstr "Мінімальний розмір:" msgid "Minimum upload time" msgstr "" @@ -6379,10 +7038,10 @@ msgstr "Мінімум" msgid "Miscellaneous" -msgstr "" +msgstr "Інше" msgid "Misses" -msgstr "" +msgstr "Промахів" msgid "Monitor and auto-ban unstable servent types" msgstr "" @@ -6403,16 +7062,16 @@ msgstr "" msgid "Network" -msgstr "" +msgstr "Мережа" msgid "Never send a push request" msgstr "" msgid "New" -msgstr "Новий" +msgstr "Створити" msgid "Normalized" -msgstr "" +msgstr "Нормалізована" msgid "Not firewalled" msgstr "" @@ -6430,7 +7089,7 @@ msgstr "" msgid "Ok" -msgstr "" +msgstr "Гаразд" msgid "Optimistic first _chunk" msgstr "" @@ -6442,7 +7101,7 @@ msgstr "" msgid "Other" -msgstr "" +msgstr "Інше" msgid "Out of Band Querying" msgstr "" @@ -6460,7 +7119,7 @@ msgstr "" msgid "Pass_word" -msgstr "" +msgstr "_Пароль:" msgid "Paste rule" msgstr "" @@ -6469,7 +7128,7 @@ msgstr "" msgid "Pause" -msgstr "" +msgstr "Пауза" msgid "Pending local queries" msgstr "" @@ -6490,7 +7149,7 @@ msgstr "" msgid "Please confirm:" -msgstr "Будь-ласка, підтвердіть" +msgstr "Будь ласка, підтвердіть:" msgid "Prefer _compressed connections" msgstr "" @@ -6499,7 +7158,7 @@ msgstr "Вподобання" msgid "Progress:" -msgstr "" +msgstr "Поступ:" msgid "Project leader:" msgstr "Голова проекту:" @@ -6507,12 +7166,11 @@ msgid "Property browser" msgstr "" -#, fuzzy msgid "Property pattern:" -msgstr "Голова проекту:" +msgstr "" msgid "Property" -msgstr "" +msgstr "Властивість" msgid "Proxy _type:" msgstr "Тип _проксі" @@ -6569,7 +7227,7 @@ msgstr "" msgid "Range" -msgstr "" +msgstr "Діапазон" msgid "Raphael Manfredi" msgstr "" @@ -6601,11 +7259,10 @@ msgstr "" msgid "Remove filter" -msgstr "" +msgstr "Вилучити фільтр" -#, fuzzy msgid "Remove" -msgstr "Видалити" +msgstr "Вилучити" msgid "Report an upload connection _speed of" msgstr "" @@ -6632,17 +7289,16 @@ msgstr "" msgid "Restart" -msgstr "" +msgstr "Продовжити" -#, fuzzy msgid "Resu_me" -msgstr "Видалити" +msgstr "" msgid "Resume and retry" msgstr "" msgid "Resume" -msgstr "" +msgstr "Продовжити" msgid "Retry busy delay" msgstr "" @@ -6663,16 +7319,16 @@ msgstr "" msgid "Revert" -msgstr "" +msgstr "Відновити" msgid "Richard Eckart" msgstr "" msgid "Rules" -msgstr "" +msgstr "Правила" msgid "Ruleset editor" -msgstr "" +msgstr "Редактор наборів правил" msgid "Running in leaf mode." msgstr "" @@ -6687,21 +7343,19 @@ msgstr "" msgid "Save" -msgstr "" +msgstr "Зберегти" msgid "Saved" -msgstr "" +msgstr "Збережено" -#, fuzzy msgid "Search Monitor" -msgstr "Пошукові фільтри" +msgstr "" -#, fuzzy msgid "Search Stats" -msgstr "Пошукові фільтри" +msgstr "Історія пошуку" msgid "Search Term" -msgstr "" +msgstr "Ключ пошуку" msgid "Search _extensions" msgstr "" @@ -6710,72 +7364,62 @@ msgstr "" msgid "Search queue" -msgstr "" +msgstr "Черга пошуків" msgid "Search" msgstr "Пошук" msgid "Searches" -msgstr "" +msgstr "Пошуки" msgid "Select files by regex" -msgstr "" +msgstr "Вибрати файли за формальним виразом" msgid "Selected property:" -msgstr "" +msgstr "Вибрана властивість:" msgid "Server" -msgstr "" +msgstr "Сервер" -#, fuzzy msgid "Settings" -msgstr "Налаштування IP" +msgstr "Параметри" -#, fuzzy msgid "Show Search_bar" -msgstr "показувати _Панель статусу" +msgstr "Показувати панель по_шуку" -#, fuzzy msgid "Show Status_bar" -msgstr "показувати _Панель статусу" +msgstr "Показувати па_нель стану" -#, fuzzy msgid "Show _Connections" -msgstr "показувати _З'єднання" +msgstr "Показувати _з’єднання" -#, fuzzy msgid "Show _Downloads" -msgstr "показувати _Звантаження" +msgstr "Показувати з_вантаження" -#, fuzzy msgid "Show _Menubar" -msgstr "показувати _Панель статусу" +msgstr "Показувати смужку _меню" -#, fuzzy msgid "Show _Sidebar" -msgstr "показувати _Панель статусу" +msgstr "Показувати _бічну панель" -#, fuzzy msgid "Show _Uploads" -msgstr "показувати _Завантаження" +msgstr "Показувати в_ивантаження" msgid "Show _bytes" -msgstr "" +msgstr "Показувати _байти" msgid "Show _confirmation dialog when leaving gtk-gnutella" msgstr "" +"Показувати діалогове вікно пі_дтвердження під час виходу з gtk-gnutella" -#, fuzzy msgid "Show _inbound Gnutella traffic" -msgstr "GnutellaNet трафік" +msgstr "" -#, fuzzy msgid "Show _inbound HTTP traffic" -msgstr "показувати вхідний Gnet трафік" +msgstr "" -#, fuzzy msgid "Show _inbound leaf traffic" -msgstr "показувати вхідний Gnet трафік" +msgstr "" msgid "Show _last" msgstr "" @@ -6783,17 +7427,14 @@ msgid "Show _metric units" msgstr "" -#, fuzzy msgid "Show _outbound Gnutella traffic" -msgstr "GnutellaNet трафік" +msgstr "" -#, fuzzy msgid "Show _outbound HTTP traffic" -msgstr "показувати вихідний Gnet трафік" +msgstr "" -#, fuzzy msgid "Show _outbound leaf traffic" -msgstr "показувати вихідний Gnet трафік" +msgstr "" msgid "Show _percentages" msgstr "" @@ -6804,22 +7445,20 @@ msgid "Show additional information and settings for advanced and _expert users" msgstr "" -#, fuzzy msgid "Show inbound DHT traffic" -msgstr "показувати вхідний Gnet трафік" +msgstr "" -#, fuzzy msgid "Show outbound DHT traffic" -msgstr "показувати вихідний Gnet трафік" +msgstr "" msgid "Show pr_otocol:" -msgstr "" +msgstr "Показувати п_ротокол:" msgid "Show r_easons for" msgstr "" msgid "Show tabs" -msgstr "" +msgstr "Показувати вкладки" msgid "" "Shows visual information on the download progress. Green chunks have been " @@ -6838,7 +7477,7 @@ msgstr "" msgid "Slots:" -msgstr "" +msgstr "Слоти:" msgid "Socket receive buffer size" msgstr "" @@ -6850,23 +7489,22 @@ msgstr "" msgid "Spacing" -msgstr "" +msgstr "Інтервал" msgid "Stable" -msgstr "" +msgstr "Стабільний" msgid "Start now" -msgstr "" +msgstr "Розпочати" -#, fuzzy msgid "Statistics" -msgstr "_Установки" +msgstr "Статистика" msgid "Statistics:" -msgstr "" +msgstr "Статистика:" msgid "Stop" -msgstr "" +msgstr "Зупинити" msgid "Strict SHA_1 matching" msgstr "" @@ -6919,7 +7557,7 @@ msgstr "" msgid "This Interval" -msgstr "" +msgstr "Цей інтервал" msgid "" "This limits how many results gnutella returns to other people searching your " @@ -6935,10 +7573,10 @@ msgstr "" msgid "Toolbar style" -msgstr "" +msgstr "Стиль панелі інструментів" msgid "Tools" -msgstr "" +msgstr "Інструменти" msgid "Total input bandwidth limit:" msgstr "" @@ -6967,7 +7605,6 @@ msgid "Ultrapeer promotion statistics" msgstr "" -# шо? msgid "Ultrapeers in leaf mode" msgstr "" @@ -6982,18 +7619,17 @@ msgid "Update search results pane every" msgstr "" -#, fuzzy msgid "Upload History" -msgstr "показувати _Завантаження" +msgstr "Історія Вивантажень" msgid "Uploaded:" msgstr "Завантажено" msgid "Uploads" -msgstr "" +msgstr "Вивантаження" msgid "Uptime" -msgstr "" +msgstr "Час роботи" msgid "Use IP _Type of Service (TOS)" msgstr "" @@ -7005,7 +7641,7 @@ msgstr "" msgid "Use global hostiles.txt" -msgstr "" +msgstr "Використовувати загальний hostiles.txt" msgid "Use realistic PARQ estimates" msgstr "" @@ -7014,22 +7650,22 @@ msgstr "" msgid "User Interface" -msgstr "" +msgstr "Інтерфейс користувача" msgid "User-Agent" msgstr "Програма користувача" msgid "Value" -msgstr "" +msgstr "Значення" msgid "Version" -msgstr "" +msgstr "Версія" msgid "Vidar Madsen" -msgstr "" +msgstr "Vidar Madsen" msgid "Visit http://gtk-gnutella.sourceforge.net/." -msgstr "" +msgstr "Відвідайте http://gtk-gnutella.sourceforge.net/." msgid "Volume:" msgstr "Розмір:" @@ -7044,13 +7680,13 @@ msgstr "" msgid "Write buffer size" -msgstr "" +msgstr "Розмір буфера запису" msgid "XML Metadata" -msgstr "" +msgstr "Метадані XML" msgid "Yann Grossel" -msgstr "" +msgstr "Yann Grossel" msgid "" "You appear to be TCP-firewalled, i.e. others cannot connect to you to " @@ -7093,20 +7729,19 @@ msgstr "_Про" msgid "_Add directory" -msgstr "" +msgstr "_Додати каталог" msgid "_Browse" -msgstr "" +msgstr "Ви_брати" -#, fuzzy msgid "_Cancel" -msgstr "Україна" +msgstr "_Скасувати" msgid "_Compute upload connection speed" msgstr "" msgid "_Create filter" -msgstr "" +msgstr "С_творити фільтр" msgid "_Deletion coeff. (0-100)" msgstr "" @@ -7118,13 +7753,13 @@ msgstr "" msgid "_Duplicate" -msgstr "" +msgstr "_Дублювати" msgid "_Edit filters" -msgstr "" +msgstr "_Редагувати фільтри" msgid "_FAQ" -msgstr "" +msgstr "_ЧаП" msgid "_Feed mesh from hits" msgstr "" @@ -7132,113 +7767,107 @@ msgid "_File" msgstr "_Файл" -#, fuzzy msgid "_General" -msgstr "Загальна статистика" +msgstr "_Загальне" msgid "_Gnutella RX buffer:" msgstr "" -#, fuzzy msgid "_Gnutella traffic stats" -msgstr "статистика Gnet трафіка" +msgstr "" -#, fuzzy msgid "_HTTP traffic stats" -msgstr "статистика HTTP трафіка" +msgstr "" msgid "_Help" -msgstr "" +msgstr "_Довідка" msgid "_Hide downloaded files" -msgstr "" +msgstr "П_риховати отримані файли" msgid "_Horizon" msgstr "" msgid "_Include headers" -msgstr "" +msgstr "В_ключити заголовки" msgid "_Incoming traffic" -msgstr "" +msgstr "В_хідний канал" msgid "_Listen port" -msgstr "" +msgstr "П_орт очікування" msgid "_Messages" -msgstr "" +msgstr "По_відомлення" msgid "_Outgoing traffic" -msgstr "" +msgstr "В_ихідний канал" msgid "_Overlap when resuming" msgstr "" msgid "_Passive" -msgstr "" +msgstr "_Пасивний" msgid "_Path(s) to files" -msgstr "" +msgstr "_Шлях до файлів" msgid "_Preferences" -msgstr "_Вподобання" +msgstr "_Параметри" msgid "_Push sent timeout" msgstr "" msgid "_Quit" -msgstr "_Вийти" +msgstr "Ви_йти" msgid "_Remove manually downloaded files" -msgstr "" +msgstr "Ви_лучити отримані вручну файли" msgid "_Rescan" -msgstr "" +msgstr "Перес_канувати" msgid "_Reset stats" -msgstr "" +msgstr "Ски_нути статистику" -#, fuzzy msgid "_Restart" -msgstr "Результати" +msgstr "_Перезапустити" msgid "_Stop" -msgstr "" +msgstr "З_упинити" msgid "_Try to connect to local networks first" -msgstr "" +msgstr "_Намагатися спочатку встановити з’єднання з локальною мережею" msgid "_Update interval (sec)" -msgstr "" +msgstr "Інтервал _оновлення (у секундах)" msgid "_Username" -msgstr "" +msgstr "_Користувач" msgid "_View" msgstr "_Вигляд" -#, fuzzy msgid "_auto-hide leaf traffic stats" -msgstr "статистика Gnet трафіка" +msgstr "" msgid "active" -msgstr "" +msgstr "активний" msgid "and lasted" msgstr "" -#, fuzzy msgid "auto-hide DHT traffic stats" -msgstr "статистика Gnet трафіка" +msgstr "" msgid "bytes" -msgstr "" +msgstr "байтів" msgid "case sensitive" -msgstr "" +msgstr "з врахуванням регістру" msgid "case-sensitive" -msgstr "" +msgstr "з врахуванням регістру" msgid "do" msgstr "" @@ -7250,22 +7879,17 @@ msgstr "звантаження" msgid "enabled" -msgstr "" +msgstr "увімкнено" msgid "from _nodes within a" msgstr "" -#, fuzzy msgid "" "gtk-gnutella is shutting down.\n" "Sending bye messages to peers.\n" "\n" "Grace time remaining:" msgstr "" -"gtk-gnutella закривається. \n" -"Надсилаю 'бувай' до peers. \n" -"\n" -"Часу на 'відстрочку' залишилось:" msgid "gtk-gnutella shutdown" msgstr "" @@ -7280,22 +7904,22 @@ msgstr "" msgid "ignore" -msgstr "" +msgstr "ігнорувати" msgid "ignored" -msgstr "" +msgstr "ігнорується" msgid "in" -msgstr "" +msgstr "у" msgid "invert condition" -msgstr "" +msgstr "обернена умова" msgid "invert" -msgstr "" +msgstr "інвертувати" msgid "items" -msgstr "" +msgstr "об’єкти" msgid "kbps to peers" msgstr "" @@ -7307,35 +7931,34 @@ msgstr "ще не визначено" msgid "out" -msgstr "" +msgstr "вих" -#, fuzzy msgid "queued" -msgstr "Поставлено в чергу" +msgstr "у черзі" msgid "searches" -msgstr "" +msgstr "пошуки" msgid "seconds" -msgstr "" +msgstr "секунд" msgid "secs " -msgstr "" +msgstr "секунд " msgid "secs" -msgstr "" +msgstr "сек" msgid "set" -msgstr "" +msgstr "встановити" msgid "unavailable" -msgstr "" +msgstr "недоступне" msgid "undefined" -msgstr "" +msgstr "невизначено" msgid "unset" -msgstr "" +msgstr "зняти" msgid "uploads" msgstr "завантаження" @@ -7367,7 +7990,7 @@ msgid "Disabled stealing of outgoing HTTP bandwidth." msgstr "" -msgid "Splitting ougoing HTTP bandwidth evenly." +msgid "Splitting outgoing HTTP bandwidth evenly." msgstr "" msgid "Capping HTTP outgoing bandwidth." @@ -7376,16 +7999,17 @@ msgid "Port mapping possible through UPnP or NAT-PMP." msgstr "" -msgid "Port mapping configured through UPnP or NAT-PMP." +msgid "Port mapping configured through NAT-PMP." +msgstr "" + +msgid "Port mapping configured through UPnP." msgstr "" -#, fuzzy msgid "Enable UPnP" -msgstr "Включити _UDP" +msgstr "" -#, fuzzy msgid "Enable NAT-PMP" -msgstr "Включити _UDP" +msgstr "" msgid "Enable HTTP request pipelining" msgstr "" @@ -7393,7 +8017,7 @@ msgid "Pipelining max chunk size" msgstr "" -msgid "Enable upload of patial files deemed rare" +msgid "Enable upload of partial files deemed rare" msgstr "" msgid "Enable GUESS (additional querying)" @@ -7408,9 +8032,8 @@ msgid "Output bandwidth hint" msgstr "" -#, fuzzy msgid "Download queue is frozen." -msgstr "Черга затримана" +msgstr "" msgid "Allow TTH discovery" msgstr "" @@ -7424,29 +8047,26 @@ msgid "Answer to what's-new? queries" msgstr "" -#, fuzzy msgid "Search Media Type" -msgstr "Пошук додано" +msgstr "Тип Пошукових Даних" msgid "Audio" -msgstr "" +msgstr "Звук" -#, fuzzy msgid "Video" -msgstr "_Вигляд" +msgstr "Відео" msgid "Document" -msgstr "" +msgstr "Документ" msgid "Image" -msgstr "" +msgstr "Зображення" msgid "Archive" -msgstr "" +msgstr "Архів" -#, fuzzy msgid "Search Configuration" -msgstr "Пошукові фільтри" +msgstr "Налаштування пошуку" msgid "Stop search when last download completes" msgstr "" @@ -7455,10 +8075,10 @@ msgstr "" msgid "What's new?" -msgstr "" +msgstr "Що нового?" msgid "Unspecified" -msgstr "" +msgstr "Не вказано" msgid "Search filters to apply locally on newly created searches." msgstr "" @@ -7466,6 +8086,9 @@ msgid "Discard results bearing an alien IP address" msgstr "" +msgid "Discard results bearing a banned GUID" +msgstr "" + msgid "Restart session-only searches with pending downloads" msgstr "" @@ -7481,98 +8104,106 @@ msgid "Relayed queries remembered" msgstr "" -msgid "Not in database" +msgid "Allow unused Gnutella outgoing bandwidth to supersede hint" +msgstr "" + +msgid "Display GUESS statistics" +msgstr "" + +msgid "Mapping lease time" +msgstr "" + +msgid "G2 hubs" +msgstr "" + +msgid "Enable the G2 network" +msgstr "" + +msgid " G2, " msgstr "" -#, fuzzy msgid "owned" -msgstr "Виконано" +msgstr "" msgid "partial" -msgstr "" +msgstr "частково" msgid "shared" -msgstr "" +msgstr "спільний" #, c-format msgid "Created %u download" msgid_plural "Created %u downloads" msgstr0 "" msgstr1 "" +msgstr2 "" #, c-format msgid "Discarded %u result" msgid_plural "Discarded %u results" msgstr0 "" msgstr1 "" - -msgid "Query queued..." -msgstr "" +msgstr2 "" #, c-format msgid "%u term counted" msgid_plural "%u terms counted" msgstr0 "" msgstr1 "" +msgstr2 "" #, c-format msgid "Couldn't find pixmap file: %s" -msgstr "" +msgstr "Не вдалося знайти файл зображення: %s" #, c-format msgid "Error loading pixmap file: %s" -msgstr "" +msgstr "Помилка під час завантаження файла зображення: %s" msgid " (partial)" -msgstr "" +msgstr " (частково)" msgid "Cache contains" msgstr "" msgid "Copy to clipboard" -msgstr "" +msgstr "Скопіювати до буфера" -#, fuzzy msgid "_Remove filter" -msgstr "Назва файла:" +msgstr "" msgid "_Close" msgstr "_Закрити" -#, fuzzy msgid "Show _Statusbar" -msgstr "показувати _Панель статусу" +msgstr "" -#, fuzzy msgid "Show _Peers" -msgstr "показувати _Панель статусу" +msgstr "" -#, fuzzy msgid "Gnutella _traffic stats" -msgstr "статистика Gnet трафіка" +msgstr "" -#, fuzzy msgid "_Auto-hide leaf traffic stats" -msgstr "статистика Gnet трафіка" +msgstr "" + +msgid "Glossary" +msgstr "" msgid "_Search" msgstr "Пошук" msgid "What's New?" -msgstr "" +msgstr "Що нового?" msgid "Do not specify any media type (will match any kind of files remotely)" msgstr "" -#, fuzzy msgid "CPU overloaded" -msgstr "Завантажено" - -msgid "Splitting outgoing HTTP bandwidth evenly." msgstr "" msgid "Connect to" -msgstr "" +msgstr "З'єднатися з" msgid "ultrapeers" msgstr "" @@ -7612,12 +8243,18 @@ msgid "Served " msgstr "" -msgid "BH HTML served" +msgid "G2 served" msgstr "" msgid " / " msgstr "" +msgid "G2" +msgstr "" + +msgid "BH HTML served" +msgstr "" + msgid "BH HTML" msgstr "" @@ -7646,13 +8283,13 @@ msgstr "" msgid " " -msgstr "" +msgstr " " msgid "Show reasons _for" msgstr "" msgid "Delete" -msgstr "" +msgstr "Вилучити" msgid "You can use suffixes such as KB, KiB, MB, MiB, GB, GiB etc." msgstr "" @@ -7666,16 +8303,14 @@ msgid "_Bind to this address" msgstr "" -#, fuzzy msgid "IPv_4 settings" -msgstr "Налаштування IP" +msgstr "" msgid "Force external IPv6 address to" msgstr "" -#, fuzzy msgid "IPv_6 settings" -msgstr "Налаштування IP" +msgstr "" msgid "Port Mapping" msgstr "" @@ -7692,7 +8327,7 @@ msgstr "" msgid "slots" -msgstr "" +msgstr "слоти" msgid "unit_of_time|s" msgstr "" @@ -7703,11 +8338,8 @@ msgid "Maximum percentage of connection slots a vendor can occupy." msgstr "" -msgid "Global DHT ougoing traffic" -msgstr "" - msgid "attempts" -msgstr "" +msgstr "спроби" msgid "Pipelining maximum chunk size" msgstr "" @@ -7715,9 +8347,6 @@ msgid "_Remove directory" msgstr "" -msgid "Enable upload of partial files deemed rare" -msgstr "" - msgid "Minimum chunk _size" msgstr "" @@ -7734,25 +8363,25 @@ msgstr "" msgid ", " -msgstr "" +msgstr ", " msgid "Peer:" -msgstr "" +msgstr "Вузол:" msgid "Peermode:" msgstr "" msgid "incoming" -msgstr "" +msgstr "вхідних" msgid "outgoing" -msgstr "" +msgstr "вихідних" msgid "Country:" -msgstr "" +msgstr "Країна:" msgid "Vendor:" -msgstr "" +msgstr "Виробник:" msgid "Move the cursor over a row to see details." msgstr "" @@ -7764,6 +8393,9 @@ msgid "Reverse lookup in progress..." msgstr "" +msgid "UDP (semi-reliable)" +msgstr "" + msgid "Size:" msgstr "Розмір:" @@ -7788,12 +8420,18 @@ msgid "Valid IPv6 ultra" msgstr "" -msgid "Unstable" +msgid "Fresh G2 hub" msgstr "" -msgid "Alien" +msgid "Valid G2 hub" msgstr "" +msgid "Unstable" +msgstr "Нестабільна" + +msgid "Alien" +msgstr "Чужинець" + msgid "GUESS (IPv4 running)" msgstr "" @@ -7807,7 +8445,7 @@ msgstr "" msgid "gtk-gnutella: Click to minimize/restore" -msgstr "" +msgstr "gtk-gnutella: натисніть, щоб згорнути або розгорнути" #. TRANSLATORS: Translate this as "Translation provided by" or similar #. and append your name to the list. @@ -7817,8 +8455,9 @@ #, c-format msgid "%d second" msgid_plural "%d seconds" -msgstr0 "" -msgstr1 "" +msgstr0 "%d секунда" +msgstr1 "%d секунди" +msgstr2 "%d секунд" msgid "" "<html><head><title>Frequently Asked Questions</title></head><body><p>The FAQ " @@ -7826,82 +8465,95 @@ "sourceforge.net/?page=faq\">FAQ online</a> instead.</p></body></html>" msgstr "" +msgid "" +"<html><head><title>Glossary</title></head><body><p>The glossary document " +"could not be loaded.</p></body></html>" +msgstr "" + #, c-format msgid "%lu file shared (%s)" msgid_plural "%lu files shared (%s)" msgstr0 "" msgstr1 "" +msgstr2 "" msgid "(avg)" -msgstr "" +msgstr "(сер.)" msgid "Hello sent" -msgstr "" +msgstr "Надіслано вітання" msgid "Welcome sent" -msgstr "" +msgstr "Надіслано запрошення" -#, fuzzy msgid "No UDP traffic yet" -msgstr "HTTP трафік" +msgstr "" #, c-format msgid "Closing: %s Stop in %us RX=%u Q=%u,%u%%" msgstr "" msgid "Removing" -msgstr "" +msgstr "Вилучення" msgid "Receiving hello" -msgstr "" +msgstr "Отримуємо привітання" msgid "UNKNOWN STATUS" +msgstr "НЕВІДОМИЙ СТАН" + +msgid "g2" msgstr "" msgid "busy" -msgstr "" +msgstr "зайнято" msgid "stable" -msgstr "" +msgstr "стабільне" msgid "push" msgstr "" msgid "proxy" -msgstr "" +msgstr "проксі" msgid "bogus" -msgstr "" +msgstr "фіктивний" -#, fuzzy msgid "alien" -msgstr "Спем" +msgstr "чужинець" msgid "media" -msgstr "" +msgstr "носій" msgid "No search" -msgstr "" +msgstr "Немає пошуку" #, c-format msgid "Flushing queue (%u results pending)" msgstr "" -#, fuzzy msgid "The search has been stopped" -msgstr "Немає слоту для скачування" +msgstr "Пошук було зупинено" msgid "Passive search" -msgstr "" +msgstr "Пасивний пошук" #, c-format msgid "Expires in %s" -msgstr "" +msgstr "Застаріє за %s" msgid "Expires with this session" msgstr "" #, c-format +msgid " %u download" +msgid_plural " %u downloads" +msgstr0 "" +msgstr1 "" +msgstr2 "" + +#, c-format msgid "" "%u %s (%u skipped, %u ignored, %u hidden, %u auto-d/l, %u %s) Hits: %u (%u " "TCP, %u UDP)" @@ -7909,17 +8561,81 @@ msgid "item" msgid_plural "items" -msgstr0 "" -msgstr1 "" +msgstr0 "об’єкт" +msgstr1 "об’єкти" +msgstr2 "об’єкт" msgid "dupe" msgid_plural "dupes" msgstr0 "" msgstr1 "" +msgstr2 "" -msgid "Passive" +msgid "No GUESS queries run yet" +msgstr "" + +#, c-format +msgid " previous took %s querying %zu %s with %zu %s kept" +msgstr "" + +msgid "host" +msgid_plural "hosts" +msgstr0 "вузол" +msgstr1 "вузли" +msgstr2 "вузлів" + +msgid "hit" +msgid_plural "hits" +msgstr0 "" +msgstr1 "" +msgstr2 "" + +#, c-format +msgid "GUESS %s Total: %zu %s (%s %s, %s kept, %s queries, %s keys)%s" +msgstr "" + +msgid "idle" +msgstr "бездіяльний" + +msgid "query" +msgid_plural "queries" +msgstr0 "черга" +msgstr1 "черги" +msgstr2 "черг" + +#, c-format +msgid "" +"GUESS %s %s (%zu %s, %zu kept, %s queries, %s keys) Pool: %zu %s, (%zu+" +"%zu)/%zu queried, %zu %s (%.2f%%), %zu reached, %zu pending, %zu %s%s%s" +msgstr "" + +msgid "loose" +msgstr "довільне" + +msgid "bounded" +msgstr "обмежене" + +msgid "ack" +msgid_plural "acks" +msgstr0 "" +msgstr1 "" +msgstr2 "" + +msgid "hop" +msgid_plural "hops" +msgstr0 "" +msgstr1 "" +msgstr2 "" + +msgid " (load pending)" msgstr "" +msgid " (end if starving)" +msgstr "" + +msgid "Passive" +msgstr "Пасивний" + #, c-format msgid "" "Found old searches file. The search information has been\n" @@ -7939,17 +8655,19 @@ msgid "browsable" msgstr "" -#, fuzzy, c-format +#, c-format msgid "%u download" msgid_plural "%u downloads" -msgstr0 "показувати _Звантаження" -msgstr1 "показувати _Звантаження" +msgstr0 "" +msgstr1 "" +msgstr2 "" -#, fuzzy, c-format +#, c-format msgid "%u search" msgid_plural "%u searches" -msgstr0 "Пошук" -msgstr1 "Пошук" +msgstr0 "" +msgstr1 "" +msgstr2 "" #, c-format msgid "Handled magnet link (%s, %s)." @@ -7964,13 +8682,11 @@ msgid "Ignored unusable URL." msgstr "" -#, fuzzy msgid "The given urn type is not supported." -msgstr "Протокол не підтримується" +msgstr "" -#, fuzzy msgid "The given SHA-1 is not correctly encoded." -msgstr "Протокол не підтримується" +msgstr "" msgid "Still scanning for shared file, results may be inconclusive." msgstr "" @@ -7999,33 +8715,31 @@ msgstr "" msgid "Extension" -msgstr "" +msgstr "Суфікс назви" msgid "MIME type" -msgstr "" +msgstr "Тип MIME" msgid "TTH" -msgstr "" +msgstr "TTH" msgid "Owned" -msgstr "" +msgstr "Має власника" msgid "No" -msgstr "" +msgstr "Ні" -#, fuzzy msgid "Tag" -msgstr "Ціль" +msgstr "Мітка" msgid "Yes" msgstr "Так" msgid "Maybe" -msgstr "" +msgstr "Можливо" -#, fuzzy msgid "Source" -msgstr "Джерела" +msgstr "Джерело" msgid "Alien IP" msgstr "" @@ -8034,60 +8748,65 @@ msgstr "" msgid "Partial" +msgstr "Частково" + +#, c-format +msgid "%s %.2f%%" msgstr "" +msgid "Available" +msgstr "Доступно" + +msgid "Last modification" +msgstr "Час останньої зміни" + msgid "Latinized" msgstr "" -#, fuzzy msgid "Pathname" -msgstr "Хост" +msgstr "Назва шляху" -#, fuzzy msgid "File URL" -msgstr "Файл" +msgstr "Адреса файла" -#, fuzzy msgid "Host information" -msgstr "Детальна інформація" +msgstr "" -#, fuzzy msgid "Hostname" -msgstr "Хост" +msgstr "Назва вузла" + +msgid "banned" +msgstr "заблоковано" msgid "Servent ID" msgstr "" -#, fuzzy msgid "Vendor" -msgstr "Версія" +msgstr "Виробник" msgid "Browsable" msgstr "" -#, fuzzy msgid "Hostile" -msgstr "Хост" +msgstr "" msgid "Push-proxies" msgstr "" -#, fuzzy msgid "Packet information" -msgstr "Детальна інформація" +msgstr "" -#, fuzzy msgid "Route" -msgstr "Немає роуту" +msgstr "Маршрут" msgid "Protocol" -msgstr "" +msgstr "Протокол" msgid "TTL" -msgstr "" +msgstr "TTL" msgid "URLs" -msgstr "" +msgstr "Адреси" msgid "N2R URI" msgstr "" @@ -8116,35 +8835,24 @@ msgid "The URN in the search text is invalid." msgstr "" -msgid "SHA-1 is unknown." -msgstr "" - -msgid "No Bitzi ticket requested yet." -msgstr "" - -msgid "Not in Bitzi database." -msgstr "" - msgid "Encoding" -msgstr "" +msgstr "Кодування" msgid "#" -msgstr "" - -msgid "Metadata" -msgstr "" +msgstr "№" msgid "Never" -msgstr "" +msgstr "Ніколи" #, c-format msgid "%u/%u host (%u%%)" msgid_plural "%u/%u hosts (%u%%)" msgstr0 "" msgstr1 "" +msgstr2 "" msgid "loading..." -msgstr "" +msgstr "завантаження…" msgid "Reading host cache..." msgstr "" @@ -8166,6 +8874,12 @@ msgid "*** CPU OVERLOADED -- TRYING TO SAVE CYCLES ***" msgstr "" +msgid "*** KERNEL BUFFER SHORTAGE -- LIMITING TCP CONNECTIONS ***" +msgstr "" + +msgid "*** NO LISTENING TCP SOCKET -- NO INBOUND CONNECTIONS ***" +msgstr "" + msgid "*** UPLOADS STALLING, BANDWIDTH SHORTAGE? ***" msgstr "" @@ -8183,19 +8897,21 @@ msgid_plural "*** VERSION WILL BECOME OLD IN %d DAYS! ***" msgstr0 "" msgstr1 "" +msgstr2 "" #, c-format msgid "Address/port changed to: %s" msgstr "" msgid "no sources" -msgstr "" +msgstr "без джерел" #, c-format msgid "%u source" msgid_plural "%u sources" msgstr0 "" msgstr1 "" +msgstr2 "" #, c-format msgid "%u active" @@ -8206,26 +8922,25 @@ msgstr "" #, c-format -msgid "%u/%u connection" -msgid_plural "%u/%u connections" -msgstr0 "" -msgstr1 "" - -#, c-format msgid "%u/%u upload" msgid_plural "%u/%u uploads" msgstr0 "" msgstr1 "" +msgstr2 "" #, c-format msgid "%u/%u download" msgid_plural "%u/%u downloads" msgstr0 "" msgstr1 "" +msgstr2 "" msgid "Queue frozen" msgstr "Черга затримана" +msgid "Internal" +msgstr "" + msgid "Select a property to see its description." msgstr "" @@ -8240,10 +8955,10 @@ msgstr "" msgid "< 1s" -msgstr "" +msgstr "< 1 с" msgid "(quick) " -msgstr "" +msgstr "(швидко) " #, c-format msgid " E=%u" @@ -8254,7 +8969,7 @@ msgstr "" msgid "stalled" -msgstr "" +msgstr "застрягло" msgid "Waiting for headers..." msgstr "" @@ -8270,7 +8985,7 @@ msgstr "" msgid "Transmission aborted" -msgstr "" +msgstr "Перенесення перервано" msgid "Transmission complete" msgstr "" @@ -8280,7 +8995,7 @@ msgstr "" msgid "Frozen" -msgstr "" +msgstr "Заморожено" msgid "lifetime:" msgstr "" @@ -8290,17 +9005,3 @@ msgid "Sent QUEUE, waiting for headers..." msgstr "" - -#, fuzzy -#~ msgid "Index" -#~ msgstr "вузол" - -#, fuzzy -#~ msgid "Seaerch Media Type" -#~ msgstr "Пошук додано" - -#~ msgid "Banned: %s" -#~ msgstr "Забанено: %s" - -#~ msgid "Banned for %s" -#~ msgstr "Забанено за %s"
View file
gtk-gnutella-0.98.2.tar.bz2/po/zh_CN.po -> gtk-gnutella-1.1.9.tar.bz2/po/zh_CN.po
Changed
@@ -1,30 +1,32 @@ -# Chinese (Simplified) translations for gtk-gnutella package. -# Copyright (C) 2000-2001 Yann Grossel. -# Copyright (C) 2001-2007 Raphaël Manfredi. -# Copyright (C) 2009 Free Software Foundation, Inc. -# This file is distributed under the same license as the gtk-gnutella package. -# Wu Xiaoguang <wxgnj@yahoo.com.cn>, 2005. -# Aron Xu <happyaron.xu@gmail.com>, 2009. +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Raphael Manfredi +# This file is distributed under the same license as the PACKAGE package. # +# Translators: +# Aron Xu <happyaron.xu@gmail.com>, 2009 +# Wu Xiaoguang <wxgnj@yahoo.com.cn>, 2005 msgid "" msgstr "" -"Project-Id-Version: gtk-gnutella 0.96.7u\n" +"Project-Id-Version: gtk-gnutella\n" "Report-Msgid-Bugs-To: gtk-gnutella-devel@lists.sf.net\n" -"POT-Creation-Date: 2011-11-22 18:27+0100\n" -"PO-Revision-Date: 2009-12-05 16:18+0800\n" -"Last-Translator: Aron Xu <happyaron.xu@gmail.com>\n" -"Language-Team: Chinese (Simplified) <i18n-zh@googlegroups.com>\n" +"POT-Creation-Date: 2016-03-06 08:49+0100\n" +"PO-Revision-Date: 2016-02-15 08:28+0000\n" +"Last-Translator: Jeroen Asselman <jeroen@asselman.com>\n" +"Language-Team: Chinese (China) (http://www.transifex.com/gtk-gnutella/gtk-" +"gnutella/language/zh_CN/)\n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: \n" "Plural-Forms: nplurals=1; plural=0;\n" -#, c-format -msgid "%s%s%s%s%s fps, %s kbps" +msgid "Harmful version banned, upgrade required" +msgstr "" + +msgid "Connection refused" msgstr "" -msgid "times|x" +msgid "Use an open Gnutella or G2 servent" msgstr "" #, c-format @@ -39,13 +41,11 @@ msgid "Too many attempts (%u times)" msgstr "尝试次数过多 (%u 次)" -#, fuzzy msgid "Requeued due to no push-proxy" -msgstr "因超时重新排队" +msgstr "" -#, fuzzy msgid "Requeued due to file removal" -msgstr "一段数据后重新排队" +msgstr "" msgid "Requeued by file info change" msgstr "因文件信息改变后而请求" @@ -61,7 +61,7 @@ msgstr "" #, c-format -msgid " at %s - rescheduled for %s%s #%u" +msgid " at %s" msgstr "" msgid "Suspended (SHA1 checking)" @@ -86,36 +86,37 @@ msgid "Download queue is frozen" msgstr "下载队列已冻结" -#, fuzzy +msgid "Network buffer shortage" +msgstr "" + msgid "No download slot (start)" -msgstr "没有下载插口" +msgstr "" -#, fuzzy msgid "Connection failed (Out of file descriptors?)" -msgstr "连接失败 (超出了file descriptors的范围?)" +msgstr "" msgid "Connection failed" msgstr "连接失败" +msgid "SHA1 mismatch detected" +msgstr "检测到SHA不匹配" + msgid "Waiting for server PROX publishing" msgstr "" -#, fuzzy msgid "Waiting for push route" -msgstr "正等待进一步的请求..." +msgstr "" msgid "Push route lost" msgstr "路由丢失" -#, fuzzy msgid "Ignoring Push flag" -msgstr "忽略push标志" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "No direct connection yet (%u retry)" msgid_plural "No direct connection yet (%u retries)" -msgstr0 "尚无直接的连接 (%d次尝试)" -msgstr1 "尚无直接的连接 (%d次尝试)" +msgstr0 "" #, c-format msgid "Timeout (%u retry)" @@ -193,13 +194,11 @@ msgid "Partial write to file" msgstr "部分写入到文件" -#, fuzzy msgid "Requeued after trimmed data" -msgstr "一段数据后重新排队" +msgstr "" -#, fuzzy msgid "Chunk done, connection closed" -msgstr "块下载完毕,连接关闭" +msgstr "" #, c-format msgid "Switching to \"%s\"" @@ -262,6 +261,9 @@ msgid "No support for Content-Encoding (%s)" msgstr "不支持 Content-Encoding (%s)" +msgid "Incomplete headers during TLS upgrade" +msgstr "" + msgid "Spammer detected" msgstr "检测到 SPAM" @@ -320,6 +322,12 @@ msgid "No Content-Length header" msgstr "无 Content-Length 头" +msgid "Unexpected Content-Type" +msgstr "" + +msgid "No Content-Type" +msgstr "" + msgid "Search already closed" msgstr "搜索已关闭" @@ -353,12 +361,8 @@ msgid "Write failed: %s" msgstr "写入失败:%s" -#, fuzzy msgid "Malformed push reply" -msgstr "变形的查询命中" - -msgid "SHA1 mismatch detected" -msgstr "检测到SHA不匹配" +msgstr "" msgid ", inbound" msgstr "" @@ -366,16 +370,26 @@ msgid ", outbound" msgstr "" +msgid ", no-pipeline" +msgstr "" + msgid ", banning" msgstr ",禁止中" msgid ", g2" msgstr "" +msgid ", fake-g2" +msgstr "" + msgid ", vendor?" msgstr "" #, c-format +msgid "<Browse G2 Host %s>" +msgstr "" + +#, c-format msgid "<Browse Host %s>" msgstr "<浏览主机 %s>" @@ -383,13 +397,11 @@ msgid "<THEX data for %s>" msgstr "<%s 的 THEX 数据>" -#, fuzzy msgid "Browse search closed" -msgstr "显示搜索列表" +msgstr "" -#, fuzzy msgid "Stopped data (EOF) <download_got_eof>" -msgstr "中止的数据 (EOF)" +msgstr "" msgid "No longer connected" msgstr "已断开" @@ -403,6 +415,12 @@ msgid "Requeued due to timeout" msgstr "因超时重新排队" +msgid "Partial file removed" +msgstr "" + +msgid "File info being reset" +msgstr "" + #, c-format msgid "Downloading (TR: %s)" msgstr "正在下载(TR:%s)" @@ -410,23 +428,20 @@ msgid "Seeding" msgstr "做种中" -#, fuzzy msgid "Computing TTH" -msgstr "正在计算 SHA1" +msgstr "" msgid "Computing SHA1" msgstr "正在计算 SHA1" -#, fuzzy msgid "Waiting for TTH check" -msgstr "等待 SHA1 检查" +msgstr "" msgid "Waiting for SHA1 check" msgstr "等待 SHA1 检查" -#, fuzzy msgid "SHA1" -msgstr "SHA-1" +msgstr "" msgid "OK" msgstr "完成" @@ -434,13 +449,11 @@ msgid "failed" msgstr "失败" -#, fuzzy msgid "not computed yet" -msgstr "尚没有输出..." +msgstr "" -#, fuzzy msgid "Waiting for moving..." -msgstr "正等待头部..." +msgstr "" msgid "Moving" msgstr "正在移动" @@ -458,9 +471,8 @@ msgid "Waiting" msgstr "等待中" -#, fuzzy msgid "Querying DHT" -msgstr "变形的查询命中" +msgstr "" msgid "Pending DHT query" msgstr "" @@ -475,160 +487,19 @@ msgid_plural "%u DHT lookups" msgstr0 "" -#, fuzzy, c-format +#, c-format msgid "Got %d host from %s" msgid_plural "Got %d hosts from %s" -msgstr0 "从 UDP 主机缓存 %2$s 中获取到 %1$d 个主机" +msgstr0 "" #, c-format -msgid "Bootstrapping from %s" -msgstr "" - -msgid "Bad size" -msgstr "尺寸错误" - -msgid "Too small" -msgstr "太小" - -msgid "Too large" -msgstr "太大" - -#, fuzzy -msgid "Way too large" -msgstr "Way过大" - -msgid "Unknown message type" -msgstr "未知的消息类型" - -msgid "Unexpected message" -msgstr "意外的消息" - -msgid "Message sent with TTL = 0" -msgstr "以 TTL = 0 发送消息" - -msgid "Improper hops/ttl combination" -msgstr "hops/ttl 组合不合适" - -msgid "Max TTL exceeded" -msgstr "超过了最大 TTL 值" - -msgid "Message throttle" -msgstr "" - -#, fuzzy -msgid "Message matched limits" -msgstr "Gnutella 消息尺寸限制" - -msgid "Unusable Pong" -msgstr "不可用的 Pong" - -msgid "Hard TTL limit reached" -msgstr "达到了 TTL 硬性限额" - -msgid "Max hop count reached" -msgstr "达到了最大跃点数" - -msgid "Route lost" -msgstr "路由丢失" - -msgid "No route" -msgstr "没有路由" - -msgid "Duplicate message" -msgstr "复制消息" - -msgid "Message to banned GUID" -msgstr "发往被禁止 GUID 的消息" - -#, fuzzy -msgid "Message from banned GUID" -msgstr "发往被禁止 GUID 的消息" - -msgid "Node shutting down" -msgstr "节点正在关闭" - -msgid "TX flow control" -msgstr "TX 流控制" - -msgid "Query text had no trailing NUL" -msgstr "查询文本没有尾随 NUL" - -msgid "Query text too short" -msgstr "查询文本太短" - -#, fuzzy -msgid "Query had unnecessary overhead" -msgstr "查询包括额外的花销" - -msgid "Query had bad URN" -msgstr "" - -msgid "Message with malformed SHA1" -msgstr "消息包括变形的SHA1" - -msgid "Message with malformed UTF-8" -msgstr "消息包括变形的UTF-8" - -#, fuzzy -msgid "Malformed Query Hit" -msgstr "变形的查询命中" - -msgid "Bad return address" -msgstr "返回地址错误" - -msgid "Hostile IP address" -msgstr "有害的IP地址" - -msgid "Bogus result from Morpheus" -msgstr "" - -msgid "Spam" -msgstr "SPAM" - -msgid "Evil filename" -msgstr "" - -#, fuzzy -msgid "Improper media type" -msgstr "搜索项目" - -msgid "Payload inflating error" -msgstr "" - -msgid "Unknown header flags present" -msgstr "" - -#, fuzzy -msgid "Own search results" -msgstr "将搜索结果限制为(_r)" - -#, fuzzy -msgid "Own queries" -msgstr "RX 查询" - -msgid "Ancient query format" +msgid "Connecting to web cache %s" msgstr "" -#, fuzzy -msgid "Blank Servent ID" -msgstr "Servent关闭" - -msgid "GUESS Query missing token" +#, c-format +msgid "Bootstrapping from %s" msgstr "" -#, fuzzy -msgid "GUESS Invalid query token" -msgstr "无效的 DHT 安全令牌" - -msgid "DHT Invalid security token" -msgstr "无效的 DHT 安全令牌" - -msgid "DHT Too many STORE requests" -msgstr "DHT 上 STORE 请求过多" - -msgid "DHT Malformed message" -msgstr "DHT 消息格式错误" - #, c-format msgid "Shutdown (%s)" msgstr "关闭 (%s)" @@ -638,27 +509,6 @@ msgid_plural "Got %d connection pongs" msgstr0 "收到%d个连接 pong" -msgid "Sent crawling info" -msgstr "发送正爬行的消息" - -msgid "Cannot setup compressing TX stack" -msgstr "无法开始压缩 TX 栈" - -#, c-format -msgid "Got BYE %d %.*s" -msgstr "收到 BYE %d %.*s" - -#, c-format -msgid "Weird HELLO %s" -msgstr "异常的 HELLO %s" - -#, c-format -msgid "HELLO %s error %d (%s)" -msgstr "HELLO %1$s错误%2$d (%3$s)" - -msgid "Shielded node" -msgstr "被防御的节点" - msgid "Gnet connections disabled" msgstr "Gnet 连接被禁用" @@ -666,6 +516,10 @@ msgstr "连接没有被压缩" #, c-format +msgid "Too many G2 hubs (%u max)" +msgstr "" + +#, c-format msgid "Too many leaves (%d max)" msgstr "叶节点太多(最大值为%d)" @@ -690,6 +544,9 @@ msgid "Not an ultra node" msgstr "不是一个超级节点" +msgid "Unknown error" +msgstr "" + msgid "Unstable IP address" msgstr "不稳定的 IP 地址" @@ -703,22 +560,50 @@ msgid "Not connecting: %s" msgstr "没有连接:%s" +msgid "Cannot setup compressing TX stack" +msgstr "无法开始压缩 TX 栈" + +msgid "Sent crawling info" +msgstr "发送正爬行的消息" + +#, c-format +msgid "Got BYE %d %.*s" +msgstr "收到 BYE %d %.*s" + +#, c-format +msgid "Weird HELLO %s" +msgstr "异常的 HELLO %s" + +#, c-format +msgid "HELLO %s error %d (%s)" +msgstr "HELLO %1$s错误%2$d (%3$s)" + +msgid "Shielded node" +msgstr "被防御的节点" + msgid "Protocol not acceptable" msgstr "协议不可接受" +msgid "Conflict" +msgstr "" + +msgid "Upgrade Header Missing" +msgstr "" + msgid "Servent Shutdown" msgstr "Servent 关闭" -#, fuzzy msgid "Not a network member" -msgstr "Gnutella 网络模式" +msgstr "" + +msgid "Need a G2 Hub" +msgstr "" msgid "Too frequent crawling" msgstr "网络爬行太过频繁" -#, fuzzy msgid "Already connected to this GUID" -msgstr "已连接" +msgstr "" #, c-format msgid "Vendor would exceed %d%% of our slots" @@ -763,20 +648,23 @@ msgid "Pseudo UDP node" msgstr "伪 UDP 节点" -#, fuzzy +msgid "Pseudo semi-reliable UDP node" +msgstr "" + +msgid "Pseudo G2 UDP node" +msgstr "" + msgid "Pseudo DHT node" -msgstr "伪 UDP 节点" +msgstr "" msgid "Already connected" msgstr "已连接" -#, fuzzy msgid "Limited connection" -msgstr "传统连接" +msgstr "" -#, fuzzy msgid "Write error during HELLO" -msgstr "HELLO 时发生写错误:%s" +msgstr "" #, c-format msgid "Write error during HELLO: %s" @@ -789,9 +677,9 @@ msgid "Kicked: %s message too big (%d bytes)" msgstr "踢出:消息%1$s过大 (%2$d字节)" -#, fuzzy, c-format +#, c-format msgid "Kicked: %s message too big (>= 64KiB limit)" -msgstr "踢出:消息%1$s过大 (%2$d字节)" +msgstr "" msgid "Leaf" msgstr "页节点" @@ -811,6 +699,9 @@ msgid "DHT" msgstr "DHP" +msgid "G2 hub" +msgstr "" + msgid "Unknown" msgstr "未知" @@ -825,9 +716,9 @@ msgid "Must wait %u more seconds before resending \"What's New\"" msgstr "" -#, fuzzy, c-format +#, c-format msgid "mkdir(\"%s\") failed: %m" -msgstr "写入失败:%s" +msgstr "" msgid "Can't find your home directory!" msgstr "无法找到您的主目录!" @@ -839,13 +730,17 @@ msgid "creating configuration directory \"%s\"" msgstr "正在新建配置目录 \"%s\"" -#, fuzzy, c-format +#, c-format msgid "creating directory \"%s\" for %s" -msgstr "正在新建配置目录 \"%s\"" +msgstr "" + +#, c-format +msgid "Another gtk-gnutella supervisor is running as PID %lu" +msgstr "" -#, fuzzy -msgid "You seem to have left another gtk-gnutella running" -msgstr "有其他 gtk-gnutella 实例在运行\n" +#, c-format +msgid "Another gtk-gnutella is running as PID %lu" +msgstr "" msgid "Cannot proceed without valid configuration directory" msgstr "没有合适的配置目录则无法继续" @@ -859,9 +754,6 @@ msgid "Failed to create local socket" msgstr "创建本地套接字失败" -msgid "Failed to create listening sockets" -msgstr "创建监听套接字失败" - msgid "Can only run as a leaf when TCP-firewalled" msgstr "被 TCP 防火墙阻挡时只能作为叶节点运行" @@ -871,6 +763,12 @@ msgid "Got EOF" msgstr "得到 EOF" +msgid "TLS handshake failed" +msgstr "" + +msgid "Connection locally failed" +msgstr "" + msgid "Write failed (Input Exception)" msgstr "写入失败(输入异常)" @@ -890,21 +788,110 @@ msgid "Connect back timeout" msgstr "返回连接超时" +msgid "Request timeout" +msgstr "" + msgid "Timeout waiting for follow-up" msgstr "" msgid "Lifetime expired" msgstr "超出生命周期" +msgid "Unauthorized" +msgstr "" + +#, c-format +msgid "Limiting connections from %s" +msgstr "" + +msgid "No reason given" +msgstr "" + +msgid "Bad Request" +msgstr "" + +msgid "Header too large" +msgstr "" + +msgid "Input buffer full" +msgstr "" + +msgid "Extra data after HTTP header" +msgstr "" + msgid "Unable to send GIV" msgstr "无法发送 GIV" +msgid "Not Found" +msgstr "" + +msgid "File was modified" +msgstr "" + +msgid "Moved Permanently" +msgstr "" + +msgid "File index/name mismatch" +msgstr "" + +msgid "URN Not Found (urn:sha1)" +msgstr "" + +msgid "SHA1 is being recomputed" +msgstr "" + +msgid "Library being rebuilt" +msgstr "" + +msgid "Malformed URN in /uri-res/N2R request" +msgstr "" + +msgid "Malformed URN in /uri-res/N2X request" +msgstr "" + +msgid "TTH is being computed" +msgstr "" + msgid "<Browse Host Request>" msgstr "<请求浏览主机>" -#, fuzzy +msgid "Browse Host Disabled" +msgstr "" + +#, c-format +msgid "Redirected to %s:%u" +msgstr "" + +msgid "Not Modified" +msgstr "" + msgid "Stalling upload replaced" -msgstr "停止的上传将被替换" +msgstr "" + +msgid "Already downloading this file" +msgstr "" + +msgid "Malformed Range request" +msgstr "" + +msgid "Requested range not satisfiable" +msgstr "" + +msgid "Requested range not available yet" +msgstr "" + +msgid "Queue full" +msgstr "" + +msgid "Another connection is still active" +msgstr "" + +#, c-format +msgid "%s not honoured; removed from PARQ queue" +msgstr "" + +msgid "Minimum retry delay" +msgstr "" #, c-format msgid "Queued (slot %d, ETA: %s)" @@ -913,9 +900,12 @@ msgid "Cannot send whole HTTP status" msgstr "无法发送整个 HTTP 状态" -#, fuzzy, c-format -msgid "<Browse Host Request> %s%s%s" -msgstr "<请求浏览主机>" +msgid "Not Acceptable" +msgstr "" + +#, c-format +msgid "<Browse Host %sRequest> %s%s%s" +msgstr "" msgid "query hits" msgstr "" @@ -929,6 +919,40 @@ msgid ", chunked" msgstr "" +msgid "THEX failure" +msgstr "" + +msgid "EOF while sinking" +msgstr "" + +#, c-format +msgid "Read error while sinking: %m" +msgstr "" + +msgid "Content Too Large" +msgstr "" + +msgid "Unknown/Missing Protocol Tag" +msgstr "" + +msgid "Missing Host Header" +msgstr "" + +msgid "Not Implemented" +msgstr "" + +msgid "Bad URI" +msgstr "" + +msgid "Bad Path" +msgstr "" + +msgid "No Content Allowed" +msgstr "" + +msgid "Sharing currently disabled" +msgstr "" + msgid "Write exception" msgstr "写入异常" @@ -946,9 +970,9 @@ msgid "No bytes written, source may be gone" msgstr "" -#, fuzzy, c-format +#, c-format msgid "Special read error: %s" -msgstr "文件读取出错:%s" +msgstr "" msgid "Explicitly killed" msgstr "显式结束" @@ -968,6 +992,1194 @@ msgid " - Newer version available: from git %s" msgstr " - 新版本可用:git 版本 %s" +msgid "Routing errors" +msgstr "路由错误" + +msgid "Routing table chunks" +msgstr "" + +msgid "Routing table message capacity" +msgstr "" + +msgid "Routing table message count" +msgstr "" + +msgid "Routing through transient node avoided" +msgstr "" + +msgid "Duplicates with higher TTL" +msgstr "" + +msgid "SPAM SHA1 database hits" +msgstr "" + +msgid "SPAM filename and size hits" +msgstr "" + +msgid "SPAM fake hits" +msgstr "" + +msgid "SPAM duplicate hits" +msgstr "" + +msgid "SPAM dynamically caught hostile IP addresses" +msgstr "" + +msgid "SPAM dynamically caught hostile IP held" +msgstr "" + +msgid "SPAM spotted spamming IP addresses held" +msgstr "" + +msgid "Searches to local DB" +msgstr "本地数据库查询" + +msgid "Hits on local DB" +msgstr "本地数据库查询命中" + +msgid "Hits on local partial files" +msgstr "" + +msgid "Hits on \"what's new?\" queries" +msgstr "" + +msgid "Query hits received for local queries" +msgstr "" + +msgid "G2 searches to local DB" +msgstr "" + +msgid "G2 hits on local DB" +msgstr "" + +msgid "G2 hits on local partial files" +msgstr "" + +msgid "Query hits received for OOB-proxied queries" +msgstr "" + +msgid "Queries requesting OOB hit delivery" +msgstr "" + +msgid "Stripped OOB flag on queries" +msgstr "" + +msgid "Ignored OOB queries due to unclaimed hits" +msgstr "" + +msgid "Duplicate OOB-proxied queries" +msgstr "" + +msgid "OOB hits received for OOB-proxied queries" +msgstr "" + +msgid "OOB hits bearing alien IP address" +msgstr "" + +msgid "OOB hits ignored due to identified spamming address" +msgstr "" + +msgid "OOB hits ignored due to unsecure promise from known secure host" +msgstr "" + +msgid "Unclaimed locally-generated OOB hits" +msgstr "" + +msgid "Partially claimed locally-generated OOB hits" +msgstr "" + +msgid "Spurious OOB hit claiming received" +msgstr "" + +msgid "Unrequested OOB hits received" +msgstr "" + +msgid "Received query hits for untracked queries" +msgstr "" + +msgid "Tracked query MUIDs" +msgstr "" + +msgid "Compacted queries" +msgstr "" + +msgid "Bytes saved by compacting" +msgstr "" + +msgid "UTF8 queries" +msgstr "UTF-8 查询" + +msgid "SHA1 queries" +msgstr "SHA1 查询" + +msgid "\"What's New?\" queries" +msgstr "" + +msgid "UTF8 G2 queries" +msgstr "" + +msgid "SHA1 G2 queries" +msgstr "" + +msgid "GUESS queries" +msgstr "" + +msgid "GUESS queries (0.2)" +msgstr "" + +msgid "GUESS link cache size" +msgstr "" + +msgid "GUESS cached query keys held" +msgstr "" + +msgid "GUESS cached 0.2 hosts held" +msgstr "" + +msgid "GUESS cached G2 hosts held" +msgstr "" + +msgid "GUESS locally generated queries" +msgstr "" + +msgid "GUESS currently running queries" +msgstr "" + +msgid "GUESS hits received for locally generated queries" +msgstr "" + +msgid "GUESS ultra nodes queried" +msgstr "" + +msgid "GUESS ultra nodes sending back an acknowledgment" +msgstr "" + +msgid "GUESS G2 nodes queried" +msgstr "" + +msgid "GUESS G2 nodes sending back an acknowledgment" +msgstr "" + +msgid "Throttled local push messages" +msgstr "" + +msgid "Throttled received push messages" +msgstr "" + +msgid "Broadcasted push messages" +msgstr "" + +msgid "Push-proxy UDP relayed messages" +msgstr "" + +msgid "Push-proxy TCP relayed messages" +msgstr "" + +msgid "Push-proxy TCP for FW<->FW transfers" +msgstr "" + +msgid "Push-proxy broadcasted messages" +msgstr "" + +msgid "Push-proxy found un-proxied local route" +msgstr "" + +msgid "Push-proxy lookup failures" +msgstr "" + +msgid "Push relayed via local route" +msgstr "" + +msgid "Push relayed via routing table" +msgstr "" + +msgid "Locally generated dynamic queries" +msgstr "" + +msgid "Leaf-generated dynamic queries" +msgstr "" + +msgid "OOB-proxied leaf queries" +msgstr "" + +msgid "Fully completed dynamic queries" +msgstr "" + +msgid "Partially completed dynamic queries" +msgstr "" + +msgid "Dynamic queries ended with no results" +msgstr "" + +msgid "Fully completed dynamic queries getting late results" +msgstr "" + +msgid "Dynamic queries with partial late results" +msgstr "" + +msgid "Dynamic queries completed by late results" +msgstr "" + +msgid "Queries seen from GTKG" +msgstr "" + +msgid "Queries seen from GTKG that were re-queries" +msgstr "" + +msgid "Queries advertising support of GGEP \"H\"" +msgstr "" + +msgid "Queries advertising support of semi-reliable UDP" +msgstr "" + +msgid "GIV callbacks received" +msgstr "" + +msgid "GIV discarded due to no suitable download" +msgstr "" + +msgid "QUEUE callbacks received" +msgstr "" + +msgid "QUEUE discarded due to no suitable download" +msgstr "" + +msgid "File descriptors banned running count" +msgstr "" + +msgid "UDP read-ahead datagram running count" +msgstr "" + +msgid "UDP read-ahead datagram running bytes" +msgstr "" + +msgid "UDP read-ahead datagram \"old\" processed" +msgstr "" + +msgid "UDP read-ahead datagram max count" +msgstr "" + +msgid "UDP read-ahead datagram max bytes" +msgstr "" + +msgid "UDP read-ahead datagram max delay" +msgstr "" + +msgid "UDP push messages received for FW<->FW connections" +msgstr "" + +msgid "UDP push messages requesting FW<->FW connection with ourselves" +msgstr "" + +msgid "UDP push messages patched for FW<->FW connections" +msgstr "" + +msgid "UDP UHC pings received" +msgstr "" + +msgid "UDP UHC pongs sent" +msgstr "" + +msgid "UDP messages with bogus source IP" +msgstr "" + +msgid "UDP messages from shunned IP (discarded)" +msgstr "" + +msgid "UDP truncated incoming messages" +msgstr "" + +msgid "Alien UDP messages (non-Gnutella)" +msgstr "" + +msgid "Unprocessed UDP Gnutella messages" +msgstr "" + +msgid "Compressed UDP messages enqueued" +msgstr "" + +msgid "Compressed UDP messages received" +msgstr "" + +msgid "Candidates for UDP message compression" +msgstr "" + +msgid "Uncompressed UDP messages due to no gain" +msgstr "" + +msgid "Ambiguous UDP messages received" +msgstr "" + +msgid "Ambiguous UDP messages inspected more deeply" +msgstr "" + +msgid "Ambiguous UDP messages handled as semi-reliable UDP" +msgstr "" + +msgid "Semi-reliable UDP total messages given for transmission" +msgstr "" + +msgid "Semi-reliable UDP total messages deflated" +msgstr "" + +msgid "Semi-reliable UDP total messages unsent" +msgstr "" + +msgid "Semi-reliable UDP total messages dropped due to temporary ban" +msgstr "" + +msgid "Semi-reliable UDP total messages sent to known responsive hosts" +msgstr "" + +msgid "Semi-reliable UDP total messages partially sent due to clogging" +msgstr "" + +msgid "Semi-reliable UDP reliable messages given for transmission" +msgstr "" + +msgid "Semi-reliable UDP reliable messages correctly transmited" +msgstr "" + +msgid "Semi-reliable UDP reliable messages not fully acknowledged" +msgstr "" + +msgid "Semi-reliable UDP fragments sent" +msgstr "" + +msgid "Semi-reliable UDP fragments resent" +msgstr "" + +msgid "Semi-reliable UDP fragment sendings avoided" +msgstr "" + +msgid "Semi-reliable UDP fragments sent too many times" +msgstr "" + +msgid "Semi-reliable UDP total acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP spurious acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP invalid acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP acknowledgments re-queued for sending" +msgstr "" + +msgid "Semi-reliable UDP plain acknowledgments dropped" +msgstr "" + +msgid "Semi-reliable UDP enhanced acknowledgments dropped" +msgstr "" + +msgid "Semi-reliable UDP plain acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments transmitted" +msgstr "" + +msgid "Semi-reliable UDP EARs sent" +msgstr "" + +msgid "Semi-reliable UDP too many EARs sent" +msgstr "" + +msgid "Semi-reliable UDP EAR negative acknowledgments received" +msgstr "" + +msgid "Semi-reliable UDP acknowledgments received after sending EARs" +msgstr "" + +msgid "Semi-reliable UDP fragments received" +msgstr "" + +msgid "Semi-reliable UDP duplicate fragments received" +msgstr "" + +msgid "Semi-reliable UDP unreliable fragments received" +msgstr "" + +msgid "Semi-reliable UDP dropped received fragments" +msgstr "" + +msgid "Semi-reliable UDP fragments received whilst lingering" +msgstr "" + +msgid "Semi-reliable UDP messages expired before re-assembly" +msgstr "" + +msgid "Semi-reliable UDP messages re-assembled completely" +msgstr "" + +msgid "Semi-reliable UDP messages inflated successfully" +msgstr "" + +msgid "Semi-reliable UDP messages inflated incorrectly" +msgstr "" + +msgid "Semi-reliable UDP unreliable messages received" +msgstr "" + +msgid "Semi-reliable UDP empty messages received" +msgstr "" + +msgid "Semi-reliable UDP total acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP cumulative acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP extended acknowledgments sent" +msgstr "" + +msgid "Semi-reliable UDP avoided acknowledgment sendings" +msgstr "" + +msgid "Semi-reliable UDP EARs received" +msgstr "" + +msgid "Semi-reliable UDP EARs received for unknown message" +msgstr "" + +msgid "Semi-reliable UDP EARs received whilst lingering" +msgstr "" + +msgid "Semi-reliable UDP fragments from hostile IP addresses" +msgstr "" + +msgid "UDP G2 hits rerouted to hub for delivery" +msgstr "" + +msgid "UDP G2 hits undelivered" +msgstr "" + +msgid "Consolidated servers (after GUID and IP address linking)" +msgstr "" + +msgid "Duplicate downloads found during server consolidation" +msgstr "" + +msgid "Discovered server GUIDs" +msgstr "" + +msgid "Changed server GUIDs" +msgstr "" + +msgid "Detected GUID collisions" +msgstr "" + +msgid "Detected collisions with our own GUID" +msgstr "" + +msgid "GUID dynamically banned" +msgstr "" + +msgid "Firewalled node info for known hosts received in upload requests" +msgstr "" + +msgid "Revitalized PUSH routes" +msgstr "" + +msgid "Collected new PUSH proxies from other query hits" +msgstr "" + +msgid "Attempted download resource switching on completion" +msgstr "" + +msgid "Attempted download resource switching after error" +msgstr "" + +msgid "Successful download resource switching (all kind)" +msgstr "" + +msgid "Successful download resource switching between plain files" +msgstr "" + +msgid "Successful download resource switching after error" +msgstr "" + +msgid "Actively queued after resource switching attempt" +msgstr "" + +msgid "Sunk HTTP reply data on error codes" +msgstr "" + +msgid "Ignored downloaded data" +msgstr "" + +msgid "Ignoring requested after data mismatch" +msgstr "" + +msgid "Ignoring requested to preserve connection" +msgstr "" + +msgid "Ignoring requested due to aggressive swarming" +msgstr "" + +msgid "Ignoring refused (data too large or server too slow)" +msgstr "" + +msgid "Client resource switching (all detected)" +msgstr "" + +msgid "Client resource switching between plain files" +msgstr "" + +msgid "Client follow-up request after HTTP error was returned" +msgstr "" + +msgid "PARQ client resource switching in slots (SHA-1 based)" +msgstr "" + +msgid "PARQ client retry-after violation" +msgstr "" + +msgid "PARQ client kicked out after too many retry-after violations" +msgstr "" + +msgid "PARQ upload slot limit overrides" +msgstr "" + +msgid "PARQ quick upload slots granted" +msgstr "" + +msgid "PARQ QUEUE sending attempts" +msgstr "" + +msgid "PARQ QUEUE messages sent" +msgstr "" + +msgid "PARQ QUEUE follow-up requests received" +msgstr "" + +msgid "Launched SHA-1 file verifications" +msgstr "" + +msgid "Launched TTH file verifications" +msgstr "" + +msgid "Re-seeding of orphan downloads through query hits" +msgstr "" + +msgid "Re-seeding of orphan downloads through upload requests" +msgstr "" + +msgid "RUDP sent bytes" +msgstr "" + +msgid "RUDP received bytes" +msgstr "" + +msgid "DHT estimated amount of nodes" +msgstr "" + +msgid "DHT standard error of estimated amount of nodes" +msgstr "" + +msgid "DHT k-ball theoretical frontier (bits)" +msgstr "" + +msgid "DHT k-ball furthest frontier (bits)" +msgstr "" + +msgid "DHT k-ball closeest frontier (bits)" +msgstr "" + +msgid "DHT routing table buckets" +msgstr "" + +msgid "DHT routing table leaves" +msgstr "" + +msgid "DHT routing table maximum depth" +msgstr "" + +msgid "DHT routing table good nodes" +msgstr "" + +msgid "DHT routing table stale nodes" +msgstr "" + +msgid "DHT routing table pending nodes" +msgstr "" + +msgid "DHT routing table evicted nodes" +msgstr "" + +msgid "DHT routing table evicted firewalled nodes" +msgstr "" + +msgid "DHT routing table evicted nodes due to quota" +msgstr "" + +msgid "DHT routing table promoted pending nodes" +msgstr "" + +msgid "DHT routing table pinged promoted nodes" +msgstr "" + +msgid "DHT routing table rejected node due to bucket network quota" +msgstr "" + +msgid "DHT routing table rejected node due to global network quota" +msgstr "" + +msgid "DHT completed bucket refreshes" +msgstr "" + +msgid "DHT forced bucket refreshes" +msgstr "" + +msgid "DHT forced bucket merges" +msgstr "" + +msgid "DHT bucket merges" +msgstr "" + +msgid "DHT bucket splits" +msgstr "" + +msgid "DHT denied non-splitable bucket refresh" +msgstr "" + +msgid "DHT initiated bucket alive checks" +msgstr "" + +msgid "DHT alive pings sent to good nodes" +msgstr "" + +msgid "DHT alive pings sent to stale nodes" +msgstr "" + +msgid "DHT alive pings sent to shutdowning nodes" +msgstr "" + +msgid "DHT alive pings avoided" +msgstr "" + +msgid "DHT alive pings skipped" +msgstr "" + +msgid "DHT revitalized stale nodes on RPC reply" +msgstr "" + +msgid "DHT value store rejected on IP/network quota grounds" +msgstr "" + +msgid "DHT value store rejected on creator validation grounds" +msgstr "" + +msgid "DHT nodes rejected during lookup based on network quota" +msgstr "" + +msgid "DHT nodes rejected during lookup based on suspicious proximity" +msgstr "" + +msgid "DHT nodes rejected during lookup based on frequency divergence" +msgstr "" + +msgid "DHT node contact IP addresses fixed during lookup" +msgstr "" + +msgid "DHT keys held" +msgstr "" + +msgid "DHT cached keys held" +msgstr "" + +msgid "DHT values held" +msgstr "" + +msgid "DHT cached KUID targets held" +msgstr "" + +msgid "DHT cached closest root nodes" +msgstr "" + +msgid "DHT cached roots exact hits" +msgstr "" + +msgid "DHT cached roots approximate hits" +msgstr "" + +msgid "DHT cached roots misses" +msgstr "" + +msgid "DHT cached roots lookups within k-ball" +msgstr "" + +msgid "DHT cached roots contact address refreshed" +msgstr "" + +msgid "DHT cached security tokens held" +msgstr "" + +msgid "DHT cached security tokens hits" +msgstr "" + +msgid "DHT stable node information held" +msgstr "" + +msgid "DHT local hits on value lookups" +msgstr "" + +msgid "DHT local hits returning values from cached keys" +msgstr "" + +msgid "DHT returned expanded values" +msgstr "" + +msgid "DHT returned values as secondary keys" +msgstr "" + +msgid "DHT claimed values via secondary keys" +msgstr "" + +msgid "DHT returned cached expanded values" +msgstr "" + +msgid "DHT returned cached values as secondary-keys" +msgstr "" + +msgid "DHT claimed cached values via secondary keys" +msgstr "" + +msgid "DHT successfully received value publications" +msgstr "" + +msgid "DHT successfully received value removals" +msgstr "" + +msgid "DHT replication of stale value avoided" +msgstr "" + +msgid "DHT replication of held values" +msgstr "" + +msgid "DHT republishing of held values" +msgstr "" + +msgid "DHT secondary-key value fetch issued" +msgstr "" + +msgid "DHT duplicate values returned in lookups" +msgstr "" + +msgid "DHT detected KUID collisions" +msgstr "" + +msgid "DHT detected collisions with our own KUID" +msgstr "" + +msgid "DHT caching attempts" +msgstr "" + +msgid "DHT caching ended successfully" +msgstr "" + +msgid "DHT caching partially completed" +msgstr "" + +msgid "DHT key-offloading checks after discovering new closest node" +msgstr "" + +msgid "DHT keys selected for offloading" +msgstr "" + +msgid "DHT key-offloading attempts" +msgstr "" + +msgid "DHT key-offloading ended successfully" +msgstr "" + +msgid "DHT key-offloading partially completed" +msgstr "" + +msgid "DHT values successfully offloaded" +msgstr "" + +msgid "DHT incoming messages" +msgstr "" + +msgid "DHT incoming messages with UDP-matching contact address" +msgstr "" + +msgid "DHT incoming messages with contact address fixed" +msgstr "" + +msgid "DHT incoming messages from hostile addresses" +msgstr "" + +msgid "DHT incoming messages with hostile contact address" +msgstr "" + +msgid "DHT RPC messages prepared" +msgstr "" + +msgid "DHT RPC messages cancelled" +msgstr "" + +msgid "DHT RPC timed out" +msgstr "" + +msgid "DHT RPC replies received" +msgstr "" + +msgid "DHT RPC replies with contact address fixed" +msgstr "" + +msgid "DHT RPC late replies received" +msgstr "" + +msgid "DHT RPC detected KUID mismatches on reply" +msgstr "" + +msgid "DHT RPC recent nodes held" +msgstr "" + +msgid "DHT node verifications" +msgstr "" + +msgid "DHT publishing attempts" +msgstr "" + +msgid "DHT publishing ended successfully (all roots)" +msgstr "" + +msgid "DHT publishing partially completed (root subset only)" +msgstr "" + +msgid "DHT publishing ending with proper value presence" +msgstr "" + +msgid "DHT value republishing occurring too late (after expiry)" +msgstr "" + +msgid "DHT publishing to self" +msgstr "" + +msgid "DHT background publishing completion attempts" +msgstr "" + +msgid "DHT background publishing completion showing improvements" +msgstr "" + +msgid "DHT background publishing completion successful (all roots)" +msgstr "" + +msgid "DHT SHA1 data type collisions" +msgstr "" + +msgid "DHT lookup path passively protected against attack" +msgstr "" + +msgid "DHT lookup path actively protected against attack" +msgstr "" + +msgid "DHT alt-loc lookups issued" +msgstr "" + +msgid "DHT push-proxy lookups issued" +msgstr "" + +msgid "DHT successful alt-loc lookups" +msgstr "" + +msgid "DHT successful push-proxy lookups" +msgstr "" + +msgid "DHT successful node push-entry lookups" +msgstr "" + +msgid "DHT re-seeding of orphan downloads" +msgstr "" + +msgid "Digests computed on general statistics" +msgstr "" + +msgid "Digests computed on TCP statistics" +msgstr "" + +msgid "Digests computed on UDP statistics" +msgstr "" + +msgid "Ping" +msgstr "Ping" + +msgid "Pong" +msgstr "Pong" + +msgid "Bye" +msgstr "Bye" + +msgid "QRP" +msgstr "QRP" + +msgid "HSEP" +msgstr "HSEP" + +msgid "RUDP" +msgstr "RUDP" + +msgid "Vendor spec." +msgstr "" + +msgid "Vendor std." +msgstr "" + +msgid "Push" +msgstr "" + +msgid "Query" +msgstr "查询" + +msgid "Query hit" +msgstr "查询命中" + +msgid "DHT (truncated)" +msgstr "" + +msgid "DHT Ping" +msgstr "" + +msgid "DHT Pong" +msgstr "" + +msgid "DHT Store" +msgstr "" + +msgid "DHT Store Ack" +msgstr "" + +msgid "DHT Find Node" +msgstr "" + +msgid "DHT Found Node" +msgstr "" + +msgid "DHT Find Value" +msgstr "" + +msgid "DHT Value" +msgstr "" + +msgid "G2 Crawl Request" +msgstr "" + +msgid "G2 Hub Advertisement" +msgstr "" + +msgid "G2 Hub List" +msgstr "" + +msgid "G2 Hub List Req" +msgstr "" + +msgid "G2 Hub List Ack" +msgstr "" + +msgid "G2 Local Node Info" +msgstr "" + +msgid "G2 Ping" +msgstr "" + +msgid "G2 Pong" +msgstr "" + +msgid "G2 Push" +msgstr "" + +msgid "G2 Query Key Ack" +msgstr "" + +msgid "G2 Query Key Req" +msgstr "" + +msgid "G2 Query" +msgstr "" + +msgid "G2 Query Ack" +msgstr "" + +msgid "G2 Query Hit" +msgstr "" + +msgid "G2 Query Hash Table" +msgstr "" + +msgid "G2 User Profile Check" +msgstr "" + +msgid "G2 User Profile Data" +msgstr "" + +msgid "Total" +msgstr "总计" + +msgid "Bad size" +msgstr "尺寸错误" + +msgid "Too small" +msgstr "太小" + +msgid "Too large" +msgstr "太大" + +msgid "Way too large" +msgstr "" + +msgid "Too old" +msgstr "" + +msgid "Unknown message type" +msgstr "未知的消息类型" + +msgid "Unexpected message" +msgstr "意外的消息" + +msgid "Message sent with TTL = 0" +msgstr "以 TTL = 0 发送消息" + +msgid "Improper hops/ttl combination" +msgstr "hops/ttl 组合不合适" + +msgid "Max TTL exceeded" +msgstr "超过了最大 TTL 值" + +msgid "Message throttle" +msgstr "" + +msgid "Message matched limits" +msgstr "" + +msgid "Transient node" +msgstr "" + +msgid "Unusable Pong" +msgstr "不可用的 Pong" + +msgid "Hard TTL limit reached" +msgstr "达到了 TTL 硬性限额" + +msgid "Max hop count reached" +msgstr "达到了最大跃点数" + +msgid "Route lost" +msgstr "路由丢失" + +msgid "No route" +msgstr "没有路由" + +msgid "Duplicate message" +msgstr "复制消息" + +msgid "OOB Proxy MUID Conflict" +msgstr "" + +msgid "Message to banned GUID" +msgstr "发往被禁止 GUID 的消息" + +msgid "Message from banned GUID" +msgstr "" + +msgid "Node shutting down" +msgstr "节点正在关闭" + +msgid "TX flow control" +msgstr "TX 流控制" + +msgid "Query text had no trailing NUL" +msgstr "查询文本没有尾随 NUL" + +msgid "Query text too short" +msgstr "查询文本太短" + +msgid "Query had unnecessary overhead" +msgstr "" + +msgid "Query had bad URN" +msgstr "" + +msgid "Message with malformed SHA1" +msgstr "消息包括变形的SHA1" + +msgid "Message with malformed UTF-8" +msgstr "消息包括变形的UTF-8" + +msgid "Malformed Query Hit" +msgstr "" + +msgid "Bad return address" +msgstr "返回地址错误" + +msgid "Hostile IP address" +msgstr "有害的IP地址" + +msgid "Shunned IP address" +msgstr "" + +msgid "Bogus result from Morpheus" +msgstr "" + +msgid "Spam" +msgstr "SPAM" + +msgid "Evil filename" +msgstr "" + +msgid "Improper media type" +msgstr "" + +msgid "Payload inflating error" +msgstr "" + +msgid "Unknown header flags present" +msgstr "" + +msgid "Own search results" +msgstr "" + +msgid "Own queries" +msgstr "" + +msgid "Ancient query format" +msgstr "" + +msgid "Blank Servent ID" +msgstr "" + +msgid "GUESS Query missing token" +msgstr "" + +msgid "GUESS Invalid query token" +msgstr "" + +msgid "DHT Invalid security token" +msgstr "无效的 DHT 安全令牌" + +msgid "DHT Too many STORE requests" +msgstr "DHT 上 STORE 请求过多" + +msgid "DHT Malformed message" +msgstr "DHT 消息格式错误" + +msgid "G2 Unexpected message" +msgstr "" + +msgid "Cannot cross networks" +msgstr "" + msgid "No proxy" msgstr "无代理" @@ -1025,24 +2237,20 @@ msgid "own KUID lookup" msgstr "" -#, fuzzy msgid "completing" -msgstr "完成" +msgstr "" msgid "completed" msgstr "完成" -#, fuzzy msgid "shutdown" -msgstr "关闭 (%s)" +msgstr "" -#, fuzzy msgid "active (recommended)" -msgstr "自动 (推荐)" +msgstr "" -#, fuzzy msgid "passive" -msgstr " 被动)" +msgstr "" msgid "Indicates whether the hostcache file is being read." msgstr "标识主机缓存文件是否被读取" @@ -1082,15 +2290,12 @@ "当使用超级节点模式时,至少保持这么多对同等servent连接数量。此数量要比最大允许" "进入连接数小。" -#, fuzzy msgid "" "Don't allow more than this number of connections to other servents. As a " "rule of thumb you should reserve 256 b/s bandwidth per connection. Never use " "up all your bandwidth, leave a little space for TCP/IP overhead. It's not " "advisable that you set this to a value smaller than 40." msgstr "" -"不允许跟其他servent的连接数超过此值。原则上,您得为每个连接准备256 b/s的带" -"宽。注意不要将带宽都分配完,留点给TCP/IP的花销。建议该值不要小于30。" msgid "Number of leaf nodes currently connected." msgstr "当前连接的叶节点数量。" @@ -1146,7 +2351,6 @@ msgid "Average servent uptime." msgstr "servent 的平均在线时间。" -#, fuzzy msgid "" "Local TCP port gtk-gnutella is listening on. ISPs often block or throttle " "traffic on TCP port 6346 so it is a good idea to change it to something in " @@ -1154,17 +2358,13 @@ "forwarding / opening, as necessary. Note that by default, the TCP port 6346 " "is not used to guard against undue censorship." msgstr "" -"gtk-gnutall侦听的本地TCP端口。您的ISP可能会封掉或者阻塞TCP端口6346,所以建议" -"您在1024-65535之间随意选择端口号。别忘了修改您的防火墙以放行该端口。请注意," -"为避免被监视,不要使用默认的TCP端口6346。" msgid "Use this IP address as source address if 'force local ip' is activated." msgstr "如果本地IP地址固定,则使用该IP作为源地址。" -#, fuzzy msgid "" "Use this IPv6 address as source address if 'force local ip' is activated." -msgstr "如果本地IP地址固定,则使用该IP作为源地址。" +msgstr "" msgid "" "The connection bandwidth reported to other hosts. This is the speed at which " @@ -1197,16 +2397,14 @@ "additional upload slots." msgstr "只有大于等于该上传带宽的百分比时,才允许额外的上传插口。" -#, fuzzy msgid "Number of seconds before a download connect attempt times out." -msgstr "下载连接维持活动的秒数。" +msgstr "" msgid "Number of seconds before a push request times out." msgstr "敲门请求能够维持活动的秒数。" -#, fuzzy msgid "Number of seconds before a download times out if no data is received." -msgstr "没有数据接收,一个下载能够坚持的秒数。" +msgstr "" msgid "Minimum number of seconds to wait on auto-retry timeouts." msgstr "自动重试等待的最少秒数" @@ -1214,11 +2412,10 @@ msgid "Maximum number of seconds to wait on auto-retry timeouts." msgstr "自动重试等待的最大秒数" -#, fuzzy msgid "" "Maximum number of attempts to download a file not counting HTTP busy " "indications." -msgstr "对文件尝试下载的最大次数,该文件没有HTTP busy标识。" +msgstr "" msgid "Delay in seconds before retrying after a connection timed out." msgstr "一个连接超时后,再次重试的等待秒数。" @@ -1237,14 +2434,11 @@ "connection reset by peer, etc...)." msgstr "前一次尝试被中断(由于超时、连接被peer重置等),再次重试需等待的秒数。" -#, fuzzy msgid "" "Amount of bytes to overlap when resuming a download. It should be at least " "64 bytes for safe resuming, otherwise gtk-gnutella will not accept to resume " "a file for which we had no SHA1 known, after a server gives one back." msgstr "" -"续传下载所重叠的字节数。安全的续传,至少需设成64字节,否则gtk-gnutella将不会" -"接受续传文件,因为对方返回一个针对的SHA1后,我们没有获知。" msgid "" "Number of seconds before an upload times out if no connection can be " @@ -1279,26 +2473,23 @@ msgid "Maximum number of file descriptors reserved for banning." msgstr "可禁止文件描述符的最大数量。" -#, fuzzy msgid "" "Amount of file descriptors currently used for banning, i.e. which are " "currently kept open for delayed close." -msgstr "用于禁止的文件描述符数量,也就是当前为延迟目的而作保留的。" +msgstr "" msgid "Number of file descriptors we'll actually be using for banning." msgstr "实际用作禁止的文件描述符数量。" -#, fuzzy msgid "" "Number of seconds an incoming connection has to start sending out its " "request." -msgstr "进入连接发送其请求需要的秒数。" +msgstr "" -#, fuzzy msgid "" "Number of seconds before a Gnet connect attempt times out if no connection " "can be established." -msgstr "Gnet尝试建立连接,但总是失败,判为超时的秒数。" +msgstr "" msgid "" "Number of seconds before a Gnet connection times out if no data is " @@ -1310,20 +2501,16 @@ "percent of the maximum message size." msgstr "针对节点的发送排队的最大值(以字节为单位)。至少是最大消息尺寸的150%。" -#, fuzzy msgid "" "Maximum number of seconds a node can remain in transmit flow control before " "being kicked out." -msgstr "被踢出前,节点在传输流控中保留的最大秒数。" +msgstr "" -#, fuzzy msgid "" "Maximum percentage of time over 5 minutes that our node can remain in flow " "control remotely before dropping the connection. This only works with nodes " "that will send us an hops-flow message when they are flow-controlling us." msgstr "" -"时间超过5分钟,而我们的节点仍可保留在远程的流控中,而不会被断掉连接的最大百分" -"比。这只有在那些节点流控我们的时候,给我们发送中转流消息时才有效。" msgid "" "Maximum TTL we allow in messages we broadcast. If a query comes in with a " @@ -1333,14 +2520,11 @@ "消息广播的最大允许TTL。如果查询大于该值,将被截为该值。Gnutella的标准TTL=4," "所以您的设定不能小于该值。" -#, fuzzy msgid "" "The TTL we use in messages we generate. The default on Gnutella is TTL=4. " "If you set it to too large a value, you run the risk of being trimmed down " "by fellow gtk-gnutella nodes, or kicked out by some other servent." msgstr "" -"我们在消息中生成并使用的TTL。 Gnutella中默认的TTL=4。如果您将该值设得过大,将" -"可能导致该值被其他gtk-gnutella节点截短,甚至被其他servent踢出。" msgid "" "Maximum hard TTL limit (hops + TTL) on messages we relay. This should be " @@ -1357,36 +2541,29 @@ msgid "For development use: debug level." msgstr "用于开发:debug级别。" -#, fuzzy msgid "Debug level for banning code." -msgstr "用于HTTP代码的debug级别。" +msgstr "" msgid "If not zero, periodic messages show the used CPU time." msgstr "" -#, fuzzy msgid "Debug level for download mesh management." -msgstr "用于下载的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for Gnutella messages." -msgstr "制造商信息的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for file sharing code." -msgstr "用于上传的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for Gnutella nodes." -msgstr "用于上传的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for sockets." -msgstr "用于上传的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for bootstrapping into the network." -msgstr "消息路由的debug级别。" +msgstr "" msgid "Debug level for HTTP code." msgstr "用于HTTP代码的debug级别。" @@ -1394,9 +2571,8 @@ msgid "Debug level for downloads." msgstr "用于下载的debug级别。" -#, fuzzy msgid "Debug level for fileinfo." -msgstr "用于上传的debug级别。" +msgstr "" msgid "Debug level for uploads." msgstr "用于上传的debug级别。" @@ -1404,15 +2580,11 @@ msgid "Debug level for code shared between gui and core." msgstr "用于在gui跟core间分享代码的debug级别" -msgid "Verbosity of Bitzi related debug messages." -msgstr "与debug信息有关的Bitzi冗余" - msgid "Verbosity of URL handling related debug messages." msgstr "与debug信息有关的URL处理冗余" -#, fuzzy msgid "Debug level for dynamic query hit routing." -msgstr "动态查询后命中路由的debug级别" +msgstr "" msgid "Debug level for dynamic queries." msgstr "动态查询的debug级别。" @@ -1429,9 +2601,8 @@ msgid "Debug level for the UDP traffic layer." msgstr "UDP交通布局的debug级别。" -#, fuzzy msgid "Debug level for the Query Routing Protocol." -msgstr "查询路由协议的debug级别。" +msgstr "" msgid "Debug level for message routing." msgstr "消息路由的debug级别。" @@ -1445,13 +2616,11 @@ msgid "Debug level for HSEP." msgstr "HSEP的debug级别。" -#, fuzzy msgid "Debug level for TLS." -msgstr "HSEP的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for PARQ." -msgstr "GGEP的debug级别。" +msgstr "" msgid "" "If set, PARQ will calculate its ETA and retry times more optimistically. If " @@ -1484,12 +2653,11 @@ "support." msgstr "" -msgid "For development use: track properties." -msgstr "用于开发:跟踪属性。" +msgid "Indicates a kernel network buffer shortage." +msgstr "" -#, fuzzy msgid "For development use: don't add new hosts to the host cache." -msgstr "用于开发:不要给hostcatcher增加新的主机。" +msgstr "" msgid "Enable bandwidth limitation for incoming HTTP traffic." msgstr "对进入的HTTP流量进行带宽限制。" @@ -1530,9 +2698,8 @@ "etc...)." msgstr "自动清除不可用的下载。(由于连接超时,push路由丢失等)" -#, fuzzy msgid "Auto clear finished downloads" -msgstr "自动清除已下载完毕的项目。" +msgstr "" msgid "Remove downloaded files from the search result." msgstr "从搜索结果中去掉已下载的文件。" @@ -1540,9 +2707,8 @@ msgid "Enable to use forced_local_ip as local ip." msgstr "采用forced_local_ip作为本地IP。" -#, fuzzy msgid "Enable to use forced_local_ip6 as local ip." -msgstr "采用forced_local_ip作为本地IP。" +msgstr "" msgid "" "If 'forced_local_ip' is enabled, bind the socket to the forced IP address." @@ -1582,9 +2748,8 @@ msgid "Password for proxy." msgstr "代理的密码" -#, fuzzy msgid "Address of the proxy." -msgstr "代理的IP地址" +msgstr "" msgid "Hostname of the proxy." msgstr "代理的主机名" @@ -1595,9 +2760,8 @@ msgid "Protocol the proxy uses." msgstr "代理用的协议" -#, fuzzy msgid "Network protocols to use." -msgstr "代理用的协议" +msgstr "" msgid "Use an IPv6-to-IPv4 Transport Relay Translator asspecified by RFC 3142." msgstr "" @@ -1609,20 +2773,17 @@ msgid "Current number of hosts in regular node caches." msgstr "目前正常节点缓存中的主机数量" -#, fuzzy msgid "Current number of IPv4 hosts in ultra node caches." -msgstr "目前超级节点缓存中的主机数量" +msgstr "" msgid "Current number of hosts in bad node caches." msgstr "目前坏节点缓存中的主机数量" -#, fuzzy msgid "Maximum number of hosts in the regular node cache." -msgstr "正常节点捕捉器中的最大主机数量" +msgstr "" -#, fuzzy msgid "Maximum number of IPv4 hosts in the ultra node cache." -msgstr "超级节点捕捉器中的最大主机数量" +msgstr "" msgid "Maximum number of hosts in the BUSY, UNSTABLE and TIMEOUT lists." msgstr "BUSY、UNSTABLE以及TIMEOUT列表中的最大主机数量" @@ -1649,14 +2810,11 @@ msgid "Bandwidth limit for outgoing Gnet traffic in bytes/sec." msgstr "Gnet出去流量的带宽限制,以字节/秒为单位。" -#, fuzzy msgid "" "Bandwidth limit for incoming Gnet leaf traffic in bytes/sec. When running as " "an ultra node, this bandwidth is stolen from the regular HTTP traffic if the " "shaper for leaves is enabled." msgstr "" -"Gnet叶节点进入流量的带宽限制,以字节/秒为单位。若以超级节点运行,如果叶可变" -"化,则该带宽将从正常的HTTP流量中分用。" msgid "" "Bandwidth limit for outgoing Gnet leaf traffic in bytes/sec. When running as " @@ -1701,11 +2859,10 @@ "(in bytes)." msgstr "未知消息可允许的最大值,若不满足连接将关闭(以字节为单位)。" -#, fuzzy msgid "" "Random factor for the hops field in search packets we send (between 0 and 3 " "inclusive)." -msgstr "我们发送的0到3的搜索包中,针对hops域的随机因素。" +msgstr "" msgid "" "Whether or not to send push requests. If you are firewalled, gtk-gnutella " @@ -1774,9 +2931,8 @@ msgid "Number of running uploads." msgstr "在运行的上传数量" -#, fuzzy msgid "Number of quick uploads currently running." -msgstr "当前连接的超级节点数量。" +msgstr "" msgid "Number of registered (pending) uploads." msgstr "已注册(但推延了)的上传数量" @@ -1787,9 +2943,8 @@ msgid "Global Unique IDentifier of this node." msgstr "节点的全局唯一标识" -#, fuzzy msgid "Kademlia Unique IDentifier of this node in the DHT." -msgstr "节点的全局唯一标识" +msgstr "" msgid "Whether or not to use swarming (recommended = YES)." msgstr "是否使用蜂群(建议=YES)" @@ -1898,7 +3053,7 @@ msgid "" "Maximum amount of leaves we can accept. To be promoted Ultra, you should " -"reserve 32 bytes of bandwidth per leaf." +"reserve 32 bytes/sec of bandwidth per leaf." msgstr "" msgid "What to do with files that will be ignored for downloading." @@ -1935,9 +3090,8 @@ msgid "How many downloads are currently passively queued." msgstr "" -#, fuzzy msgid "How many fileinfo do we have." -msgstr "我们有多少文件信息" +msgstr "" msgid "How many fileinfo with sources do we have." msgstr "我们有多少带源的文件信息" @@ -2169,9 +3323,8 @@ msgid "Time at which the last scan of the library finished." msgstr "" -#, fuzzy msgid "The number of seconds the last scan of the library took." -msgstr "自动重试等待的最少秒数" +msgstr "" msgid "Time at which we started shared file indexing." msgstr "" @@ -2302,7 +3455,7 @@ msgid "" "If set to TRUE, the global hostiles.txt is used as well as the private " -"$GTK_GNUTELLA_DIR/hostiles.txt. This allows to separate your private ban " +"$GTK_GNUTELLA_DIR/hostiles.txt. This allows you to separate your private ban " "list from the global one distributed with gtk-gnutella." msgstr "" @@ -2361,26 +3514,22 @@ "displayed using the historical base2 convention with binary prefixes." msgstr "" -#, fuzzy msgid "Debug level for Reliable UDP (RUDP) code." -msgstr "用于上传的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for the Distributed Hash Table (DHT) code." -msgstr "用于上传的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for the OOB-proxying of queries." -msgstr "动态查询的debug级别。" +msgstr "" msgid "" "If set gtk-gnutella also listens on a local (unix domain) socket which is " "located in ~/.gtk-gnutella/socket." msgstr "" -#, fuzzy msgid "Don't start more than this number of parallel downloads per file." -msgstr "对一个主机,同时上传文件的最大文件数。" +msgstr "" msgid "" "If enabled, all received packets are dumped to $GTK_GNUTELLA_DIR/packets_rx." @@ -2396,31 +3545,26 @@ "of the shared files before a change becomes fully effective." msgstr "" -#, fuzzy msgid "Debug level for the shell." -msgstr "用于上传的debug级别。" +msgstr "" msgid "If larger than zero, no downloads are started." msgstr "" -#, fuzzy msgid "Debug level for the search queue." -msgstr "动态查询的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for push-proxy code." -msgstr "用于HTTP代码的debug级别。" +msgstr "" msgid "Number of THEX file requests received in this session." msgstr "" -#, fuzzy msgid "Number of THEX file requests fully served in this session." -msgstr "本次会话中已完成的总数" +msgstr "" -#, fuzzy msgid "Debug level for Tigertree-related code." -msgstr "用于上传的debug级别。" +msgstr "" msgid "" "Whether gtk-gnutella is currently computing TTH of shared files in the " @@ -2435,9 +3579,8 @@ msgid "Maximum number of results to show in any search." msgstr "" -#, fuzzy msgid "Maximum number of results to show in a browse_host request." -msgstr "自动重试等待的最大秒数" +msgstr "" msgid "Date of the latest SVN release." msgstr "" @@ -2448,13 +3591,11 @@ msgid "Signature of the latest SVN release notification." msgstr "" -#, fuzzy msgid "Maximum number of hosts in the TLS node cache." -msgstr "超级节点捕捉器中的最大主机数量" +msgstr "" -#, fuzzy msgid "Maximum time before removing hosts from the TLS cache." -msgstr "超级节点捕捉器中的最大主机数量" +msgstr "" msgid "" "If set to TRUE the tigertree root hash (TTH) can be discovered on the fly. " @@ -2468,17 +3609,14 @@ "experience." msgstr "" -#, fuzzy msgid "Maximum number of hosts in the G2 node cache." -msgstr "超级节点捕捉器中的最大主机数量" +msgstr "" -#, fuzzy msgid "Maximum time before removing hosts from the G2 cache." -msgstr "超级节点捕捉器中的最大主机数量" +msgstr "" -#, fuzzy msgid "Debug level for management of G2-only hosts." -msgstr "用于下载的debug级别。" +msgstr "" msgid "" "Whether GTKG can switch among the several files waiting to be downloaded " @@ -2513,21 +3651,17 @@ "files and push-proxies for firewalled hosts. It requires UDP support." msgstr "" -#, fuzzy msgid "Debug level for the callout queue." -msgstr "查询的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for DHT node lookups." -msgstr "用于HTTP代码的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for DHT key/value storage." -msgstr "用于HTTP代码的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for DHT key/value publishing." -msgstr "用于HTTP代码的debug级别。" +msgstr "" msgid "" "Bandwidth hint for DHT user lookups, in bytes/sec. This is used both for " @@ -2558,9 +3692,8 @@ "closest nodes will keep mutual knowledge about each other" msgstr "" -#, fuzzy msgid "Debug level for the DHT user lookup queue." -msgstr "动态查询的debug级别。" +msgstr "" msgid "If TRUE, DHT storage uses memory instead of diskspace." msgstr "" @@ -2582,9 +3715,8 @@ "uploads and push-proxy exchanges." msgstr "" -#, fuzzy msgid "Debug level for (generic) file verification code." -msgstr "用于上传的debug级别。" +msgstr "" msgid "" "Maximum number of hosts in the local address cache, which remembers the " @@ -2596,78 +3728,63 @@ "remembers the recent IP:port combinations we had." msgstr "" -#, fuzzy msgid "Debug level for management of local address cache." -msgstr "用于下载的debug级别。" +msgstr "" msgid "" "If enabled, all packets enqueued for transmission are dumped to " "$GTK_GNUTELLA_DIR/packets_tx.dump." msgstr "" -#, fuzzy msgid "Debug level the TCP message queues" -msgstr "动态查询的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for the UDP message queue." -msgstr "动态查询的debug级别。" +msgstr "" -#, fuzzy msgid "" "Maximum size of the UDP message queue (in bytes). Must be at least 150 " "percent of the maximum message size." -msgstr "针对节点的发送排队的最大值(以字节为单位)。至少是最大消息尺寸的150%。" +msgstr "" -#, fuzzy msgid "Debug level for the management of the clock accuracy." -msgstr "用于下载的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for the firewalled status management." -msgstr "用于下载的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for host management." -msgstr "用于下载的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for DHT root node caching." -msgstr "pong缓存的debug级别。" +msgstr "" -#, fuzzy msgid "Logged statistics level for code shared between GUI and core." -msgstr "用于在gui跟core间分享代码的debug级别" +msgstr "" -#, c-format msgid "" "If TRUE, the spam SHA1 database is kept in memory. If FALSE, it is kept in a " "fast disk database, which saves a large amount of core memory and reduces " "the overall footprint, at the cost of an increased I/O level. However, the " -"DB cache has typically a 90% hit rate, so the actual overhead is barely " +"DB cache has a 90 percent hit rate, so the actual overhead is barely " "noticeable when running as an ultra node and should remain completely " "unnoticed when running as a leaf." msgstr "" -#, fuzzy msgid "Debug level for spam detection." -msgstr "pong缓存的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for lockfile management." -msgstr "用于下载的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for the zone-based memory allocator." -msgstr "用于上传的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for the pool-based memory allocator." -msgstr "用于上传的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for the RX buffer allocator." -msgstr "用于上传的debug级别。" +msgstr "" msgid "" "Whether the zone-based memory allocator should always keep the zones in " @@ -2678,44 +3795,35 @@ "spam_lut_in_memory to FALSE." msgstr "" -#, fuzzy msgid "Debug level for the virtual memory manager." -msgstr "制造商信息的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for final shutdown." -msgstr "用于上传的debug级别。" +msgstr "" -#, fuzzy msgid "Country preferences" -msgstr "首选项" +msgstr "" -#, fuzzy msgid "Debug level for country limits." -msgstr "查询的debug级别。" +msgstr "" -#, fuzzy msgid "Whether to log dropped Gnutella messages" -msgstr "制造商信息的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for whitelist management." -msgstr "用于下载的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for DHT token caching." -msgstr "pong缓存的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for DHT publishing from Gnutella." -msgstr "用于HTTP代码的debug级别。" +msgstr "" msgid "Defines which DHT messages should be traced." msgstr "" -#, fuzzy msgid "Enable bandwidth limitation for outgoing DHT traffic." -msgstr "对出去的HTTP流量进行带宽限制。" +msgstr "" msgid "" "Bandwidth limit for outgoing DHT traffic in bytes/sec. It is always pooled " @@ -2723,33 +3831,26 @@ "enabled, so that UDP queues can flush more quickly." msgstr "" -#, fuzzy msgid "Maximum size of the DHT message queue (in bytes)." -msgstr "向其他节点发送的搜索回应消息的最大值(以字节为单位)" +msgstr "" -#, fuzzy msgid "Debug level for bandwidth scheduler." -msgstr "用于上传的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for the DHT stable node recorder." -msgstr "动态查询的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for the file (re)loading, on change." -msgstr "用于上传的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for the file moving, accross filesystems." -msgstr "用于上传的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for query hit message generation." -msgstr "消息路由的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for version management." -msgstr "用于下载的debug级别。" +msgstr "" msgid "Minimum CPU frequency, in Hz." msgstr "" @@ -2757,9 +3858,8 @@ msgid "Maximum CPU frequency, in Hz." msgstr "" -#, fuzzy msgid "DHT bootstrap status." -msgstr "_HTTP 浏量统计" +msgstr "" msgid "" "The DHT running mode. An active node will be able to store values and is a " @@ -2774,39 +3874,32 @@ msgid "Current DHT running mode." msgstr "" -#, fuzzy msgid "Debug level for the one-time memory allocator." -msgstr "用于上传的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for the host cache." -msgstr "用于上传的debug级别。" +msgstr "" msgid "Random bits." msgstr "" -#, fuzzy msgid "Average servent downtime." -msgstr "servent 的平均在线时间。" +msgstr "" msgid "Time when last shutdown occurred." msgstr "" -#, fuzzy msgid "Debug level for alive pings." -msgstr "用于上传的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for the versatile XML layer." -msgstr "UDP交通布局的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for the UPnP layer." -msgstr "UDP交通布局的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for the SOAP layer." -msgstr "UDP交通布局的debug级别。" +msgstr "" msgid "Defines SOAP exchanges tracing type." msgstr "" @@ -2839,9 +3932,8 @@ msgid "Whether gtk-gnutella can install port mappings, if needed." msgstr "" -#, fuzzy msgid "Debug level for the NAT-PMP layer." -msgstr "UDP交通布局的debug级别。" +msgstr "" msgid "" "Whether NAT-PMP (NAT Port Mapping Protocol) should be enabled. Support for " @@ -2858,21 +3950,17 @@ "mappings, if required." msgstr "" -#, fuzzy msgid "Debug level for the TX (transmit) network layer." -msgstr "UDP交通布局的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for the RX (receive) network layer." -msgstr "UDP交通布局的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for the I/O input event layer." -msgstr "UDP交通布局的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for the background task scheduler." -msgstr "查询的debug级别。" +msgstr "" msgid "Whether gtk-gnutella was able to configure port mappings." msgstr "" @@ -2914,25 +4002,20 @@ "Searches)." msgstr "" -#, fuzzy msgid "Maximum number of IPv4 hosts in the regular GUESS cache." -msgstr "正常节点捕捉器中的最大主机数量" +msgstr "" -#, fuzzy msgid "Current number of IPv4 hosts in the regular GUESS cache." -msgstr "目前正常节点缓存中的主机数量" +msgstr "" -#, fuzzy msgid "Maximum number of IPv4 hosts in the introduction GUESS cache." -msgstr "超级节点捕捉器中的最大主机数量" +msgstr "" -#, fuzzy msgid "Current number of IPv4 hosts in the introduction GUESS cache." -msgstr "目前超级节点缓存中的主机数量" +msgstr "" -#, fuzzy msgid "Debug level for the DB disk/RAM storage layer." -msgstr "UDP交通布局的debug级别。" +msgstr "" msgid "" "The current Session ID. This is a unique ID generated each time gtk-" @@ -2960,13 +4043,11 @@ "overall" msgstr "" -#, fuzzy msgid "Debug level for the matching code." -msgstr "用于HTTP代码的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for the time synchronization code." -msgstr "用于上传的debug级别。" +msgstr "" msgid "" "Whether queries can request partial results hits, i.e. files which are " @@ -2988,161 +4069,240 @@ "configured expiration time." msgstr "" -#, fuzzy msgid "Maximum number of results to show in a What's New? request." -msgstr "自动重试等待的最大秒数" +msgstr "" -#, fuzzy msgid "Maximum number of results to show in a passive search request." -msgstr "自动重试等待的最大秒数" +msgstr "" -#, fuzzy msgid "Whether to log duplicate Gnutella messages from same node." -msgstr "制造商信息的debug级别。" +msgstr "" -#, fuzzy msgid "Whether to log duplicate Gnutella messages with a higher TTL." -msgstr "制造商信息的debug级别。" +msgstr "" -#, fuzzy msgid "Whether to log duplicate Gnutella messages (not from same node)." -msgstr "制造商信息的debug级别。" +msgstr "" -#, fuzzy msgid "Whether to log new Gnutella messages, never seen before." -msgstr "制造商信息的debug级别。" +msgstr "" -#, fuzzy msgid "Whether to log Gnutella routing decisions." -msgstr "制造商信息的debug级别。" +msgstr "" -#, fuzzy msgid "Whether to log bad Gnutella messages, corrupted or unexpected." -msgstr "制造商信息的debug级别。" +msgstr "" msgid "Whether to log conditions triggering query hit spam flagging." msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the ultra node cache." -msgstr "超级节点捕捉器中的最大主机数量" +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in ultra node caches." -msgstr "目前超级节点缓存中的主机数量" +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in the regular GUESS cache." -msgstr "目前正常节点缓存中的主机数量" +msgstr "" -#, fuzzy msgid "Current number of IPv6 hosts in the introduction GUESS cache." -msgstr "目前超级节点缓存中的主机数量" +msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the regular GUESS cache." -msgstr "正常节点捕捉器中的最大主机数量" +msgstr "" -#, fuzzy msgid "Maximum number of IPv6 hosts in the introduction GUESS cache." -msgstr "超级节点捕捉器中的最大主机数量" +msgstr "" -#, fuzzy msgid "Debug level for the malloc() replacement allocator." -msgstr "用于上传的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for bad query hit messages." -msgstr "消息路由的debug级别。" +msgstr "" -#, fuzzy msgid "Debug level for GUID management." -msgstr "用于下载的debug级别。" +msgstr "" -msgid "disable" -msgstr "禁用" +msgid "Debug level for the TX (transmit) deflating network layer." +msgstr "" -msgid "by words" +msgid "Comma-separated list of TX debugging hosts (IP addresses only)" msgstr "" -msgid "by whole query" -msgstr "按整个查询" +msgid "" +"Comma-separated list of hosts for whom we want to dump RX traffic (IP " +"addresses only)" +msgstr "" -msgid "by router" -msgstr "按路由" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they emit " +"(IP addresses only)" +msgstr "" -msgid "TCP & UDP" -msgstr "TCP 和 UDP" +msgid "" +"Comma-separated list of hosts for whom we want to dump TX traffic they " +"receive (IP addresses only)" +msgstr "" -msgid "TCP only" -msgstr "仅 TCP" +msgid "" +"Allow GUESS to use some of the unused Gnutella outgoing bandwidth regardless " +"of the GUESS bandwidth hint. If FALSE, only the configured bandwidth hint " +"will be used. When running as a leaf this should be set to TRUE to make " +"GUESS queries run faster." +msgstr "" -msgid "UDP only" -msgstr "仅 UDP" +msgid "Debug level for the UDP TX scheduler." +msgstr "" -msgid "Ping" -msgstr "Ping" +msgid "" +"Debugging flags for the semi-reliable UDP TX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: transmissions, 16: timeouts." +msgstr "" -msgid "Pong" -msgstr "Pong" +msgid "Comma-separated list of RX debugging hosts (IP addresses only)" +msgstr "" -msgid "Bye" -msgstr "Bye" +msgid "" +"Debugging flags for the semi-reliable UDP RX layer: 1: messages, 2: " +"fragments, 4: acknowledgments, 8: receptions, 16: timeouts." +msgstr "" -msgid "QRP" -msgstr "QRP" +msgid "Whether to log sent semi-reliable UDP messages." +msgstr "" -msgid "HSEP" -msgstr "HSEP" +msgid "Whether to log received semi-reliable UDP messages." +msgstr "" -msgid "RUDP" -msgstr "RUDP" +msgid "Debug level for the secured OOB query hit claiming." +msgstr "" -msgid "Vendor spec." +msgid "Whether to log sent vendor messages." msgstr "" -msgid "Vendor std." +msgid "Whether to log received vendor messages." msgstr "" -msgid "Push" +msgid "Debugging flags for the DHT token cache (developers only)." msgstr "" -msgid "Query" -msgstr "查询" +msgid "Whether to log weird DHT message headers when debugging." +msgstr "" -#, fuzzy -msgid "Query Hit" -msgstr "变形的查询命中" +msgid "Debug level for the DHT Remote Procedure Call (RPC) code." +msgstr "" -#, fuzzy -msgid "DHT Ping" -msgstr "Ping" +msgid "Whether to log UHC pings we receive." +msgstr "" -#, fuzzy -msgid "DHT Pong" -msgstr "Pong" +msgid "Whether to log UHC pings we emit." +msgstr "" -msgid "DHT Store" +msgid "Whether the program was properly shutdown." msgstr "" -msgid "DHT Store Ack" +msgid "Whether the program restarted after a clean shutdown." msgstr "" -msgid "DHT Find Node" +msgid "Debug level for DHT key management." msgstr "" -msgid "DHT Found Node" +msgid "Debug level for DHT value management." msgstr "" -msgid "DHT Find Value" +msgid "ID of the current process." msgstr "" -#, fuzzy -msgid "DHT Value" -msgstr "值" +msgid "Debug level for HTTP range parsing / handling." +msgstr "" -msgid "Total" -msgstr "总计" +msgid "" +"Lease time when installing port mappings via UPnP or NAT-PMP, in seconds. A " +"value of 0 requests permanent mappings." +msgstr "" + +msgid "Whether the program is auto-restarting at the user's request." +msgstr "" + +msgid "Debug level for time management." +msgstr "" + +msgid "Debug level for the tmalloc() thread-magazine object distributor." +msgstr "" + +msgid "Debug level for the event queue thread." +msgstr "" + +msgid "Maximum number of G2 hubs in the hub cache." +msgstr "" + +msgid "Current number of IPv4 hosts in the G2 hub caches." +msgstr "" + +msgid "Whether the G2 protocol should be enabled." +msgstr "" + +msgid "Number of G2 nodes currently connected." +msgstr "" + +msgid "Maximum amount of G2 hubs we should connect to as a leaf." +msgstr "" + +msgid "Whether to log bad G2 messages, corrupted or unexpected." +msgstr "" + +msgid "Whether to log dropped G2 messages" +msgstr "" + +msgid "Debug level for the G2 RPC layer." +msgstr "" + +msgid "Whether to log summary of received query hits" +msgstr "" + +msgid "Whether to log summary of each record in received query hits" +msgstr "" + +msgid "Number of G2 browsing requests received in this session." +msgstr "" + +msgid "Number of G2 browsing requests fully served in this session." +msgstr "" + +msgid "Whether to log G2 messages we're attempting to send" +msgstr "" + +msgid "" +"Timestamp at which the current session was started. This stamp remains " +"unchanged when gtk-gnutella restarts after a crash or an explicit restart " +"request." +msgstr "" + +msgid "No TCP listening socket bound to allow incoming connections." +msgstr "" + +msgid "disable" +msgstr "禁用" + +msgid "by words" +msgstr "" + +msgid "by whole query" +msgstr "按整个查询" + +msgid "by router" +msgstr "按路由" + +msgid "TCP & UDP" +msgstr "TCP 和 UDP" + +msgid "TCP only" +msgstr "仅 TCP" + +msgid "UDP only" +msgstr "仅 UDP" + +msgid "Query Hit" +msgstr "" msgid "Icons" msgstr "图标" @@ -3570,7 +4730,7 @@ msgstr "" msgid "" -"Discard search results whith an alien IP address, not matching the one from " +"Discard search results with an alien IP address, not matching the one from " "which the results come from." msgstr "" @@ -3579,6 +4739,17 @@ "be restarted when gtk-gnutella is launched." msgstr "" +msgid "Discard search results coming from servents with a banned GUID." +msgstr "" + +msgid "Whether a summary line with GUESS search stats should be displayed." +msgstr "" + +msgid "" +"Whether the GUESS summary line should show total statistics or ones " +"pertaining to the current search only." +msgstr "" + msgid "Anonymizing proxies" msgstr "匿名代理" @@ -3666,6 +4837,9 @@ msgid "Benin" msgstr "贝宁" +msgid "Saint Barthelemy" +msgstr "" + msgid "Bermuda" msgstr "百慕大" @@ -3675,6 +4849,9 @@ msgid "Bolivia" msgstr "波利维亚" +msgid "Bonaire, Sint Eustatius and Saba" +msgstr "" + msgid "Brazil" msgstr "巴西" @@ -3684,6 +4861,9 @@ msgid "Bhutan" msgstr "不丹" +msgid "Burma" +msgstr "" + msgid "Bouvet Island" msgstr "布维群岛" @@ -3702,9 +4882,8 @@ msgid "Cocos (Keeling) Islands" msgstr "科科斯群岛" -#, fuzzy msgid "Congo (Democratic Republic)" -msgstr "德意志民主共和国" +msgstr "" msgid "Central African Republic" msgstr "中非" @@ -3715,9 +4894,8 @@ msgid "Switzerland" msgstr "瑞士" -#, fuzzy msgid "Cote d'Ivoire" -msgstr "科特迪瓦" +msgstr "" msgid "Cook Islands" msgstr "库克群岛" @@ -3746,6 +4924,9 @@ msgid "Cape Verde" msgstr "佛得角" +msgid "Curacao" +msgstr "" + msgid "Christmas Island" msgstr "圣诞岛" @@ -3806,9 +4987,8 @@ msgid "Falkland Islands (Malvinas)" msgstr "福克兰群岛(马尔维纳斯)" -#, fuzzy msgid "Micronesia" -msgstr "印度尼西亚" +msgstr "" msgid "Faroe Islands" msgstr "法罗群岛" @@ -3858,9 +5038,8 @@ msgid "Greece" msgstr "希腊" -#, fuzzy msgid "South Georgia and The South Sandwich Islands" -msgstr "南乔治亚岛和南桑德韦奇岛" +msgstr "" msgid "Guatemala" msgstr "瓜地马拉" @@ -3913,9 +5092,8 @@ msgid "Iraq" msgstr "伊拉克" -#, fuzzy msgid "Iran" -msgstr "伊拉克" +msgstr "" msgid "Iceland" msgstr "冰岛" @@ -3956,9 +5134,8 @@ msgid "North Korea" msgstr "" -#, fuzzy msgid "South Korea" -msgstr "南非" +msgstr "" msgid "Kuwait" msgstr "科威特" @@ -3975,9 +5152,8 @@ msgid "Lebanon" msgstr "黎巴嫩" -#, fuzzy msgid "Saint Lucia" -msgstr "圣路西亚" +msgstr "" msgid "Liechtenstein" msgstr "列支敦士登" @@ -4015,9 +5191,8 @@ msgid "Montenegro" msgstr "黑山" -#, fuzzy msgid "Saint Martin" -msgstr "圣马力诺" +msgstr "" msgid "Madagascar" msgstr "马达加斯加" @@ -4025,9 +5200,8 @@ msgid "Marshall Islands" msgstr "马绍尔群岛" -#, fuzzy msgid "Macedonia" -msgstr "新喀里多尼亚" +msgstr "" msgid "Mali" msgstr "马里" @@ -4143,9 +5317,8 @@ msgid "Puerto Rico" msgstr "波多黎各" -#, fuzzy msgid "Palestinian Territory" -msgstr "巴勒斯坦被占领土" +msgstr "" msgid "Portugal" msgstr "葡萄牙" @@ -4219,12 +5392,18 @@ msgid "Suriname" msgstr "苏里南" +msgid "South Sudan" +msgstr "" + msgid "Sao Tome and Principe" msgstr "圣多美和普林西比" msgid "El Salvador" msgstr "萨尔瓦多" +msgid "Sint Maarten" +msgstr "" + msgid "Syrian Arab Republic" msgstr "叙利亚" @@ -4252,9 +5431,8 @@ msgid "Tokelau" msgstr "托克劳群岛" -#, fuzzy msgid "Timor-leste" -msgstr "东帝汶" +msgstr "" msgid "Turkmenistan" msgstr "土库曼斯坦" @@ -4301,9 +5479,8 @@ msgid "Holy See (Vatican City State)" msgstr "梵地冈" -#, fuzzy msgid "Saint Vincent and The Grenadines" -msgstr "圣文森特和格林纳丁斯" +msgstr "" msgid "Venezuela" msgstr "委内瑞拉" @@ -4311,9 +5488,8 @@ msgid "British Virgin Islands" msgstr "英属维京群岛" -#, fuzzy msgid "U.S. Virgin Islands" -msgstr "英属维京群岛" +msgstr "" msgid "Viet Nam" msgstr "越南" @@ -4388,9 +5564,8 @@ msgid "URL missing" msgstr "URL 缺失" -#, fuzzy msgid "The download could not be created" -msgstr "没有下载插口" +msgstr "" msgid "Download added" msgstr "下载已添加" @@ -4420,9 +5595,9 @@ msgid "Total horizon size (%u/%u nodes support HSEP):" msgstr "水平总尺寸 (%1$u/%2$u的节点支持HSEP)" -#, fuzzy, c-format +#, c-format msgid "Horizon size via HSEP node %s (%s):" -msgstr "经由HSEP节点%1$s的水平尺寸 (%2$s):" +msgstr "" msgid "Interactive mode turned on." msgstr "" @@ -4430,37 +5605,39 @@ msgid "Interactive mode turned off." msgstr "" -#, fuzzy +#, c-format +msgid "Unknown operation \"show %s\"" +msgstr "" + +#, c-format +msgid "Unknown operation \"%s\"" +msgstr "" + msgid "Cannot determine current working directory" -msgstr "无法找到您的主目录!" +msgstr "" -#, fuzzy, c-format +#, c-format msgid "Unknown logfile name \"%s\"" -msgstr "未知的属性" +msgstr "" -#, fuzzy msgid "Unable to reopen" -msgstr "无法发送 GIV" +msgstr "" #, c-format msgid "Could not rename logfile as \"%s\": %m" msgstr "" -#, fuzzy, c-format -msgid "Unknown operation \"%s\"" -msgstr "未知操作" - -#, fuzzy, c-format -msgid "Unknown operation \"show %s\"" -msgstr "未知操作" - -#, fuzzy, c-format +#, c-format msgid "Unknown operation \"stats %s\"" -msgstr "未知操作" +msgstr "" -#, fuzzy, c-format +#, c-format +msgid "Unknown operation \"check %s\"" +msgstr "" + +#, c-format msgid "Unknown operation \"usage %s\"" -msgstr "未知操作" +msgstr "" msgid "Invalid IP/Port" msgstr "非法的 IP/端口" @@ -4474,17 +5651,17 @@ msgid "Invalid port" msgstr "非法的 端口" -#, fuzzy, c-format +#, c-format msgid "Removed %u node" msgid_plural "Removed %u nodes" -msgstr0 "下载 %1$u/%2$u" +msgstr0 "" msgid "Property missing" msgstr "属性丢失" -#, fuzzy, c-format +#, c-format msgid "Unknown property \"%s\"" -msgstr "未知的属性" +msgstr "" msgid "Value: " msgstr "值:" @@ -4498,19 +5675,20 @@ msgid "Good bye" msgstr "再见" +msgid "Invalid command syntax" +msgstr "" + msgid "Query string missing" msgstr "查询字符串丢失" -#, fuzzy msgid "Query string is not UTF-8 encoded" -msgstr "查询字符串丢失" +msgstr "" msgid "Search added" msgstr "增加搜索" -#, fuzzy msgid "The search could not be created" -msgstr "没有下载插口" +msgstr "" msgid "Unknown property" msgstr "未知的属性" @@ -4518,6 +5696,9 @@ msgid "Value missing" msgstr "丢失的值" +msgid "Property cannot be changed" +msgstr "" + #, c-format msgid "Previous value was %s" msgstr "" @@ -4538,64 +5719,23 @@ msgid "unterminated single-quoted string" msgstr "" -msgid "Invalid command syntax" +msgid "too many arguments in command" msgstr "" -msgid "too many arguments in command" +#, c-format +msgid "un-parseable argument #%u in command" msgstr "" msgid "Malformed command" msgstr "命令有误" -#, fuzzy, c-format +#, c-format msgid "Unknown command: \"%s\"" -msgstr "未知命令" +msgstr "" msgid "Help: " msgstr "帮助:" -msgid "Bitzi|Unknown" -msgstr "Bitzi|未知" - -msgid "Bitzi|Unrated" -msgstr "" - -msgid "Bitzi|Bitzi lookup failure" -msgstr "Bitzi|Bitzi 查询失败" - -msgid "Bitzi|Filesize mismatch" -msgstr "Bitzi|文件大小不匹配" - -msgid "Bitzi|Dangerous/Misleading" -msgstr "" - -msgid "Bitzi|Incomplete/Damaged" -msgstr "" - -msgid "Bitzi|Substandard" -msgstr "" - -msgid "Bitzi|Overrated" -msgstr "" - -msgid "Bitzi|Normal" -msgstr "Bitzi|正常" - -msgid "Bitzi|Underrated" -msgstr "" - -msgid "Bitzi|Complete" -msgstr "Bitzi|完成" - -msgid "Bitzi|Recommended" -msgstr "Bitzi|推荐" - -msgid "Bitzi|Best Version" -msgstr "Bitzi|最佳版本" - -msgid "No other data" -msgstr "无其他数据" - msgid "Filename" msgstr "文件名" @@ -4621,11 +5761,17 @@ msgid "Tigertree" msgstr "" -msgid "External metadata" -msgstr "外部元数据" +msgid "Rescheduled for" +msgstr "" + +msgid "Restartable since" +msgstr "" -msgid "Bitzi URL" -msgstr "Bitzi URL" +msgid "rescheduled for" +msgstr "" + +msgid "restartable since" +msgstr "" #, c-format msgid " (slot %u" @@ -4697,9 +5843,8 @@ msgid "Chunk done" msgstr "" -#, fuzzy msgid "Waiting for TTH checking..." -msgstr "等待 SHA1 检查" +msgstr "" msgid "Waiting for SHA1 checking..." msgstr "" @@ -4708,9 +5853,8 @@ msgid "Computing %s (%.02f%%)" msgstr "" -#, fuzzy msgid "TTH OK" -msgstr "TTH" +msgstr "" msgid "SHA-1 OK" msgstr "" @@ -4738,17 +5882,14 @@ msgid "(stalled)" msgstr "" -#, fuzzy msgid "Receiving data" -msgstr "正在接收 hello" +msgstr "" -#, fuzzy msgid "ignoring" -msgstr "流入:" +msgstr "" -#, fuzzy msgid "selected next" -msgstr "已选择的属性:" +msgstr "" msgid "requesting next" msgstr "" @@ -4756,11 +5897,7 @@ msgid "requested next" msgstr "" -#, fuzzy msgid "Awaiting data" -msgstr "等待中" - -msgid "Unknown error" msgstr "" #, c-format @@ -5018,634 +6155,6 @@ msgid "RETURN" msgstr "返回" -msgid "Query hit" -msgstr "查询命中" - -msgid "DHT (truncated)" -msgstr "" - -msgid "Routing errors" -msgstr "路由错误" - -msgid "Routing table chunks" -msgstr "" - -msgid "Routing table message capacity" -msgstr "" - -msgid "Routing table message count" -msgstr "" - -msgid "Duplicates with higher TTL" -msgstr "" - -msgid "SPAM SHA1 database hits" -msgstr "" - -#, fuzzy -msgid "SPAM filename and size hits" -msgstr "当文件名结束于“%s” %s" - -msgid "SPAM fake hits" -msgstr "" - -msgid "SPAM duplicate hits" -msgstr "" - -msgid "SPAM dynamically caught hostile IP addresses" -msgstr "" - -msgid "SPAM dynamically caught hostile IP held" -msgstr "" - -msgid "SPAM spotted spamming IP addresses held" -msgstr "" - -msgid "Searches to local DB" -msgstr "本地数据库查询" - -msgid "Hits on local DB" -msgstr "本地数据库查询命中" - -#, fuzzy -msgid "Hits on local partial files" -msgstr "本地数据库查询命中" - -msgid "Hits on \"what's new?\" queries" -msgstr "" - -msgid "Query hits received for local queries" -msgstr "" - -msgid "Query hits received for OOB-proxied queries" -msgstr "" - -msgid "Queries requesting OOB hit delivery" -msgstr "" - -msgid "Stripped OOB flag on queries" -msgstr "" - -msgid "Duplicate OOB-proxied queries" -msgstr "" - -msgid "OOB hits received for OOB-proxied queries" -msgstr "" - -msgid "OOB hits bearing alien IP address" -msgstr "" - -msgid "OOB hits ignored due to identified spamming address" -msgstr "" - -msgid "Unclaimed locally-generated OOB hits" -msgstr "" - -msgid "Partially claimed locally-generated OOB hits" -msgstr "" - -msgid "Spurious OOB hit claiming received" -msgstr "" - -msgid "Unrequested OOB hits received" -msgstr "" - -msgid "Received query hits for untracked queries" -msgstr "" - -msgid "Tracked query MUIDs" -msgstr "" - -msgid "Compacted queries" -msgstr "" - -msgid "Bytes saved by compacting" -msgstr "" - -msgid "UTF8 queries" -msgstr "UTF-8 查询" - -msgid "SHA1 queries" -msgstr "SHA1 查询" - -#, fuzzy -msgid "\"What's New?\" queries" -msgstr "已生成的查询" - -#, fuzzy -msgid "GUESS queries" -msgstr "UTF-8 查询" - -#, fuzzy -msgid "GUESS queries (0.2)" -msgstr "UTF-8 查询" - -msgid "GUESS cached query keys held" -msgstr "" - -msgid "GUESS cached 0.2 hosts held" -msgstr "" - -#, fuzzy -msgid "GUESS locally generated queries" -msgstr "已生成的查询" - -msgid "GUESS currently running queries" -msgstr "" - -msgid "GUESS hits received for locally generated queries" -msgstr "" - -msgid "GUESS hosts queried" -msgstr "" - -msgid "GUESS hosts sending back an acknowledgment" -msgstr "" - -msgid "Broadcasted push messages" -msgstr "" - -msgid "Push-proxy UDP relayed messages" -msgstr "" - -msgid "Push-proxy TCP relayed messages" -msgstr "" - -msgid "Push-proxy broadcasted messages" -msgstr "" - -msgid "Push-proxy found un-proxied local route" -msgstr "" - -msgid "Push-proxy lookup failures" -msgstr "" - -msgid "Push relayed via local route" -msgstr "" - -msgid "Push relayed via routing table" -msgstr "" - -msgid "Locally generated dynamic queries" -msgstr "" - -msgid "Leaf-generated dynamic queries" -msgstr "" - -msgid "OOB-proxied leaf queries" -msgstr "" - -msgid "Fully completed dynamic queries" -msgstr "" - -msgid "Partially completed dynamic queries" -msgstr "" - -msgid "Dynamic queries ended with no results" -msgstr "" - -msgid "Fully completed dynamic queries getting late results" -msgstr "" - -msgid "Dynamic queries with partial late results" -msgstr "" - -msgid "Dynamic queries completed by late results" -msgstr "" - -msgid "Queries seen from GTKG" -msgstr "" - -msgid "Queries seen from GTKG that were re-queries" -msgstr "" - -msgid "Queries advertising support of GGEP \"H\"" -msgstr "" - -msgid "GIV callbacks received" -msgstr "" - -msgid "GIV discarded due to no suitable download" -msgstr "" - -msgid "QUEUE callbacks received" -msgstr "" - -msgid "QUEUE discarded due to no suitable download" -msgstr "" - -msgid "UDP messages with bogus source IP" -msgstr "" - -msgid "Alien UDP messages (non-Gnutella)" -msgstr "" - -msgid "Unprocessed UDP Gnutella messages" -msgstr "" - -msgid "Compressed UDP messages enqueued" -msgstr "" - -msgid "Compressed UDP messages received" -msgstr "" - -msgid "Uncompressed UDP messages due to no gain" -msgstr "" - -msgid "Consolidated servers (after GUID and IP address linking)" -msgstr "" - -msgid "Duplicate downloads found during server consolidation" -msgstr "" - -msgid "Discovered server GUIDs" -msgstr "" - -msgid "Changed server GUIDs" -msgstr "" - -msgid "Detected GUID collisions" -msgstr "" - -msgid "Detected collisions with our own GUID" -msgstr "" - -msgid "GUID dynamically banned" -msgstr "" - -msgid "Firewalled node info for known hosts received in upload requests" -msgstr "" - -msgid "Revitalized PUSH routes" -msgstr "" - -msgid "Collected new PUSH proxies from other query hits" -msgstr "" - -msgid "Attempted download resource switching on completion" -msgstr "" - -msgid "Attempted download resource switching after error" -msgstr "" - -msgid "Successful download resource switching (all kind)" -msgstr "" - -msgid "Successful download resource switching between plain files" -msgstr "" - -msgid "Successful download resource switching after error" -msgstr "" - -msgid "Actively queued after resource switching attempt" -msgstr "" - -msgid "Sunk HTTP reply data on error codes" -msgstr "" - -#, fuzzy -msgid "Ignored downloaded data" -msgstr "已下载数据:" - -msgid "Ignoring requested after data mismatch" -msgstr "" - -msgid "Ignoring requested to preserve connection" -msgstr "" - -msgid "Ignoring requested due to aggressive swarming" -msgstr "" - -msgid "Ignoring refused (data too large or server too slow)" -msgstr "" - -msgid "Client resource switching (all detected)" -msgstr "" - -msgid "Client resource switching between plain files" -msgstr "" - -msgid "Client follow-up request after HTTP error was returned" -msgstr "" - -msgid "PARQ client resource switching in slots (SHA-1 based)" -msgstr "" - -msgid "PARQ client retry-after violation" -msgstr "" - -msgid "PARQ client kicked out after too many retry-after violations" -msgstr "" - -msgid "PARQ upload slot limit overrides" -msgstr "" - -msgid "PARQ quick upload slots granted" -msgstr "" - -msgid "PARQ QUEUE sending attempts" -msgstr "" - -msgid "PARQ QUEUE messages sent" -msgstr "" - -msgid "PARQ QUEUE follow-up requests received" -msgstr "" - -msgid "Launched SHA-1 file verifications" -msgstr "" - -msgid "Launched TTH file verifications" -msgstr "" - -msgid "Bitzi tickets held" -msgstr "" - -msgid "Re-seeding of orphan downloads through query hits" -msgstr "" - -#, fuzzy -msgid "Re-seeding of orphan downloads through upload requests" -msgstr "用于下载的debug级别。" - -msgid "DHT estimated amount of nodes" -msgstr "" - -msgid "DHT k-ball theoretical frontier (bits)" -msgstr "" - -msgid "DHT k-ball furthest frontier (bits)" -msgstr "" - -msgid "DHT k-ball closeest frontier (bits)" -msgstr "" - -msgid "DHT routing table buckets" -msgstr "" - -msgid "DHT routing table leaves" -msgstr "" - -msgid "DHT routing table maximum depth" -msgstr "" - -msgid "DHT routing table good nodes" -msgstr "" - -msgid "DHT routing table stale nodes" -msgstr "" - -msgid "DHT routing table pending nodes" -msgstr "" - -msgid "DHT routing table evicted nodes" -msgstr "" - -msgid "DHT routing table evicted firewalled nodes" -msgstr "" - -msgid "DHT routing table evicted nodes due to quota" -msgstr "" - -msgid "DHT routing table promoted pending nodes" -msgstr "" - -msgid "DHT routing table pinged promoted nodes" -msgstr "" - -msgid "DHT routing table rejected node due to bucket network quota" -msgstr "" - -msgid "DHT routing table rejected node due to global network quota" -msgstr "" - -msgid "DHT completed bucket refreshes" -msgstr "" - -msgid "DHT forced bucket refreshes" -msgstr "" - -#, fuzzy -msgid "DHT forced bucket merges" -msgstr "DHT 消息格式错误" - -msgid "DHT denied non-splitable bucket refresh" -msgstr "" - -msgid "DHT initiated bucket alive checks" -msgstr "" - -msgid "DHT alive pings sent to good nodes" -msgstr "" - -msgid "DHT alive pings sent to stale nodes" -msgstr "" - -msgid "DHT alive pings sent to shutdowning nodes" -msgstr "" - -msgid "DHT alive pings avoided" -msgstr "" - -msgid "DHT alive pings skipped" -msgstr "" - -msgid "DHT revitalized stale nodes on RPC reply" -msgstr "" - -msgid "DHT value store rejected on IP/network quota grounds" -msgstr "" - -msgid "DHT value store rejected on creator validation grounds" -msgstr "" - -msgid "DHT nodes rejected during lookup based on network quota" -msgstr "" - -msgid "DHT nodes rejected during lookup based on suspicious proximity" -msgstr "" - -msgid "DHT nodes rejected during lookup based on frequency divergence" -msgstr "" - -msgid "DHT keys held" -msgstr "" - -msgid "DHT cached keys held" -msgstr "" - -msgid "DHT values held" -msgstr "" - -msgid "DHT cached KUID targets held" -msgstr "" - -msgid "DHT cached closest root nodes" -msgstr "" - -msgid "DHT cached roots exact hits" -msgstr "" - -msgid "DHT cached roots approximate hits" -msgstr "" - -msgid "DHT cached roots misses" -msgstr "" - -msgid "DHT cached roots lookups within k-ball" -msgstr "" - -msgid "DHT cached roots contact address refreshed" -msgstr "" - -#, fuzzy -msgid "DHT cached security tokens held" -msgstr "无效的 DHT 安全令牌" - -#, fuzzy -msgid "DHT cached security tokens hits" -msgstr "无效的 DHT 安全令牌" - -#, fuzzy -msgid "DHT stable node information held" -msgstr "主机信息" - -msgid "DHT local hits on value lookups" -msgstr "" - -msgid "DHT local hits returning values from cached keys" -msgstr "" - -msgid "DHT returned expanded values" -msgstr "" - -msgid "DHT returned values as secondary keys" -msgstr "" - -msgid "DHT claimed values via secondary keys" -msgstr "" - -msgid "DHT returned cached expanded values" -msgstr "" - -msgid "DHT returned cached values as secondary-keys" -msgstr "" - -msgid "DHT claimed cached values via secondary keys" -msgstr "" - -msgid "DHT successfully received value publications" -msgstr "" - -msgid "DHT successfully received value removals" -msgstr "" - -msgid "DHT replication of stale value avoided" -msgstr "" - -msgid "DHT replication of held values" -msgstr "" - -msgid "DHT republishing of held values" -msgstr "" - -msgid "DHT secondary-key value fetch issued" -msgstr "" - -msgid "DHT duplicate values returned in lookups" -msgstr "" - -msgid "DHT detected KUID collisions" -msgstr "" - -msgid "DHT detected collisions with our own KUID" -msgstr "" - -msgid "DHT detected KUID mismatches on RPC reply" -msgstr "" - -msgid "DHT caching attempts" -msgstr "" - -msgid "DHT caching ended successfully" -msgstr "" - -msgid "DHT caching partially completed" -msgstr "" - -msgid "DHT key-offloading checks after discovering new closest node" -msgstr "" - -msgid "DHT keys selected for offloading" -msgstr "" - -msgid "DHT key-offloading attempts" -msgstr "" - -msgid "DHT key-offloading ended successfully" -msgstr "" - -msgid "DHT key-offloading partially completed" -msgstr "" - -msgid "DHT values successfully offloaded" -msgstr "" - -msgid "DHT publishing attempts" -msgstr "" - -msgid "DHT publishing ended successfully (all roots)" -msgstr "" - -msgid "DHT publishing partially completed (root subset only)" -msgstr "" - -msgid "DHT publishing ending with proper value presence" -msgstr "" - -msgid "DHT value republishing occurring too late (after expiry)" -msgstr "" - -msgid "DHT publishing to self" -msgstr "" - -msgid "DHT background publishing completion attempts" -msgstr "" - -msgid "DHT background publishing completion showing improvements" -msgstr "" - -msgid "DHT background publishing completion successful (all roots)" -msgstr "" - -msgid "DHT SHA1 data type collisions" -msgstr "" - -msgid "DHT lookup path passively protected against attack" -msgstr "" - -msgid "DHT lookup path actively protected against attack" -msgstr "" - -msgid "DHT alt-loc lookups issued" -msgstr "" - -msgid "DHT push-proxy lookups issued" -msgstr "" - -msgid "DHT successful alt-loc lookups" -msgstr "" - -msgid "DHT successful push-proxy lookups" -msgstr "" - -msgid "DHT successful node push-entry lookups" -msgstr "" - -#, fuzzy -msgid "DHT re-seeding of orphan downloads" -msgstr "用于下载的debug级别。" - msgid "node" msgid_plural "nodes" msgstr0 "" @@ -5750,9 +6259,8 @@ msgid "Act as OOB proxy for leaves" msgstr "对叶节点作为OOB代理" -#, fuzzy msgid "Actual amount of file descriptors used -- cannot be changed at runtime" -msgstr "实际使用的文件描述符数量。运行时无法被修改。" +msgstr "" msgid "Add IP rule" msgstr "增加IP规则" @@ -5760,9 +6268,8 @@ msgid "Add as search" msgstr "" -#, fuzzy msgid "Add flag rule" -msgstr "增加参数规则" +msgstr "" msgid "Add jump rule" msgstr "增加跳转规则" @@ -5838,9 +6345,8 @@ msgid "Bandwidth limits for HTTP traffic" msgstr "HTTP 流量带宽限制" -#, fuzzy msgid "Bandwidth limits for the Distributed Hash Table" -msgstr "用于上传的debug级别。" +msgstr "" msgid "Bandwidth targets for node lookups" msgstr "" @@ -5857,12 +6363,6 @@ msgid "Bind to this address" msgstr "绑定到此地址" -msgid "Bitzi Metadata" -msgstr "Bitzi 元数据" - -msgid "Bitzi metadata" -msgstr "Bitzi 元数据" - msgid "Browse Host" msgstr "浏览主机" @@ -6036,13 +6536,11 @@ msgid "Currently used" msgstr "当前使用" -#, fuzzy msgid "DHT traffic stats" -msgstr "_HTTP 浏量统计" +msgstr "" -#, fuzzy msgid "DHT traffic" -msgstr "HTTP 浏览" +msgstr "" msgid "Debugging" msgstr "调试" @@ -6128,9 +6626,8 @@ msgid "Enable \"_Browse Host\" feature" msgstr "启用“浏览主机”功能" -#, fuzzy msgid "Enable _DHT" -msgstr "启用 _UDP" +msgstr "" msgid "Enable _UDP" msgstr "启用 _UDP" @@ -6241,9 +6738,8 @@ msgid "GUID:" msgstr "GUID:" -#, fuzzy msgid "KUID:" -msgstr "GUID:" +msgstr "" msgid "Gen. queued" msgstr "" @@ -6263,9 +6759,8 @@ msgid "Generation:" msgstr "" -#, fuzzy msgid "Global DHT outgoing traffic" -msgstr "出站流量(_O)" +msgstr "" msgid "Gnutella TTL settings" msgstr "Gnutella TTL 设置" @@ -6405,16 +6900,14 @@ msgid "Last check" msgstr "最近核实" -#, fuzzy msgid "Last chunk size" -msgstr "最小体积:" +msgstr "" msgid "Last scan initiated on:" msgstr "最近一次扫描开始于:" -#, fuzzy msgid "Last switch" -msgstr "最近切换" +msgstr "" msgid "Leaf requery threshold" msgstr "" @@ -6422,9 +6915,8 @@ msgid "Leaf traffic" msgstr "" -#, fuzzy msgid "Legacy connections" -msgstr "传统连接" +msgstr "" msgid "Library # of files" msgstr "" @@ -6456,9 +6948,8 @@ msgid "Make current sorting default" msgstr "" -#, fuzzy msgid "Max # of _high TTL msg" -msgstr "高TTL消息的最大数量" +msgstr "" msgid "Max _TTL" msgstr "最大TTL(_T)" @@ -6484,13 +6975,11 @@ msgid "Max. number of browse host results" msgstr "" -#, fuzzy msgid "Max. number of passive results" -msgstr "最大结果数(_N)" +msgstr "" -#, fuzzy msgid "Max. number of What's New? results" -msgstr "最大结果数(_N)" +msgstr "" msgid "Max. simultaneous downloads per file" msgstr "" @@ -6536,9 +7025,8 @@ msgid "Min/Max:" msgstr "最小/最大:" -#, fuzzy msgid "Minimum chunk size" -msgstr "最小体积:" +msgstr "" msgid "Minimum file size" msgstr "最小文件尺寸:" @@ -6621,16 +7109,14 @@ msgid "Other" msgstr "其他" -#, fuzzy msgid "Out of Band Querying" -msgstr "超出波段查询" +msgstr "" msgid "Outgoing traffic to lea_ves" msgstr "到叶节点的出站流量(_V)" -#, fuzzy msgid "Output bandwidth average" -msgstr "总出站带宽限制:" +msgstr "" msgid "PARQ development:" msgstr "PARQ开发:" @@ -6707,9 +7193,8 @@ msgid "Quality management" msgstr "质量控制" -#, fuzzy msgid "Queries ask for OOB results" -msgstr "查询请求OOB结果" +msgstr "" msgid "Query Routing Protocol:" msgstr "" @@ -6932,9 +7417,8 @@ msgid "Show _confirmation dialog when leaving gtk-gnutella" msgstr "退出 gtk-gnutella 时要求确认(_C)" -#, fuzzy msgid "Show _inbound Gnutella traffic" -msgstr "Gnutella RX 缓冲(_G):" +msgstr "" msgid "Show _inbound HTTP traffic" msgstr "" @@ -6945,13 +7429,11 @@ msgid "Show _last" msgstr "显示最近" -#, fuzzy msgid "Show _metric units" -msgstr "显示搜索列表" +msgstr "" -#, fuzzy msgid "Show _outbound Gnutella traffic" -msgstr "Gnutella RX 缓冲(_G):" +msgstr "" msgid "Show _outbound HTTP traffic" msgstr "" @@ -6968,13 +7450,11 @@ msgid "Show additional information and settings for advanced and _expert users" msgstr "为高级用户显示额外的信息和选项" -#, fuzzy msgid "Show inbound DHT traffic" -msgstr "Gnutella RX 缓冲(_G):" +msgstr "" -#, fuzzy msgid "Show outbound DHT traffic" -msgstr "Gnutella RX 缓冲(_G):" +msgstr "" msgid "Show pr_otocol:" msgstr "显示协议(_O):" @@ -7013,9 +7493,8 @@ msgid "Source quality" msgstr "来源质量" -#, fuzzy msgid "Spacing" -msgstr "空" +msgstr "" msgid "Stable" msgstr "稳定" @@ -7076,14 +7555,11 @@ "to File->Preferences->Network." msgstr "" -#, fuzzy msgid "" "There is no condition. When this rule is reached, the matching will continue " "in the specified target filter. That's also why you can't invert this " "condition. If you could, this rule would just be ignored." msgstr "" -"没有条件。如果此符合此规则,将在指定目标的过滤器中继续尝试匹配。这就是为什么" -"您不能反转该条件。如果您可以的话,该规则将被忽略。" msgid "This Interval" msgstr "本次" @@ -7388,9 +7864,8 @@ msgid "and lasted" msgstr "并持续" -#, fuzzy msgid "auto-hide DHT traffic stats" -msgstr "自动隐藏叶节点流量统计(_A)" +msgstr "" msgid "bytes" msgstr "字节" @@ -7499,13 +7974,11 @@ msgid "uploads" msgstr "上传" -#, fuzzy msgid "Available HTTP input bandwidth" -msgstr "可用带宽" +msgstr "" -#, fuzzy msgid "Available HTTP output bandwidth" -msgstr "可用带宽" +msgstr "" msgid "DHT up, passive mode." msgstr "" @@ -7519,19 +7992,16 @@ msgid "DHT looking up own KUID." msgstr "" -#, fuzzy msgid "DHT seeded." -msgstr "TX 速率" +msgstr "" -#, fuzzy msgid "DHT inactive." -msgstr "%u 个活动" +msgstr "" -#, fuzzy msgid "Disabled stealing of outgoing HTTP bandwidth." -msgstr "对出去的HTTP流量进行带宽限制。" +msgstr "" -msgid "Splitting ougoing HTTP bandwidth evenly." +msgid "Splitting outgoing HTTP bandwidth evenly." msgstr "" msgid "Capping HTTP outgoing bandwidth." @@ -7540,27 +8010,26 @@ msgid "Port mapping possible through UPnP or NAT-PMP." msgstr "" -msgid "Port mapping configured through UPnP or NAT-PMP." +msgid "Port mapping configured through NAT-PMP." +msgstr "" + +msgid "Port mapping configured through UPnP." msgstr "" -#, fuzzy msgid "Enable UPnP" -msgstr "启用 _UDP" +msgstr "" -#, fuzzy msgid "Enable NAT-PMP" -msgstr "启用 _UDP" +msgstr "" msgid "Enable HTTP request pipelining" msgstr "" -#, fuzzy msgid "Pipelining max chunk size" -msgstr "最小体积:" +msgstr "" -#, fuzzy -msgid "Enable upload of patial files deemed rare" -msgstr "启用对部分下载文件的上传(_P)" +msgid "Enable upload of partial files deemed rare" +msgstr "" msgid "Enable GUESS (additional querying)" msgstr "" @@ -7568,17 +8037,14 @@ msgid "Issue GUESS queries as well" msgstr "" -#, fuzzy msgid "Bandwidth limits for GUESS queries" -msgstr "Gnutella 流量带宽限制" +msgstr "" -#, fuzzy msgid "Output bandwidth hint" -msgstr "总出站带宽限制:" +msgstr "" -#, fuzzy msgid "Download queue is frozen." -msgstr "下载队列已冻结" +msgstr "" msgid "Allow TTH discovery" msgstr "" @@ -7589,37 +8055,29 @@ msgid "Answer to queries for partial files" msgstr "" -#, fuzzy msgid "Answer to what's-new? queries" -msgstr "已生成的查询" +msgstr "" -#, fuzzy msgid "Search Media Type" -msgstr "搜索项目" +msgstr "" -#, fuzzy msgid "Audio" -msgstr "<音频>" +msgstr "" -#, fuzzy msgid "Video" -msgstr "<视频>" +msgstr "" -#, fuzzy msgid "Document" -msgstr "计数" +msgstr "" -#, fuzzy msgid "Image" -msgstr "<图像>" +msgstr "" -#, fuzzy msgid "Archive" -msgstr "<归档>" +msgstr "" -#, fuzzy msgid "Search Configuration" -msgstr "搜索监视器" +msgstr "" msgid "Stop search when last download completes" msgstr "" @@ -7630,9 +8088,8 @@ msgid "What's new?" msgstr "" -#, fuzzy msgid "Unspecified" -msgstr "未定义" +msgstr "" msgid "Search filters to apply locally on newly created searches." msgstr "" @@ -7640,12 +8097,14 @@ msgid "Discard results bearing an alien IP address" msgstr "" +msgid "Discard results bearing a banned GUID" +msgstr "" + msgid "Restart session-only searches with pending downloads" msgstr "" -#, fuzzy msgid "Configured DHT mode" -msgstr "节点模式" +msgstr "" msgid "Store DHT keys/values in memory" msgstr "" @@ -7656,8 +8115,23 @@ msgid "Relayed queries remembered" msgstr "" -msgid "Not in database" -msgstr "不在数据库中" +msgid "Allow unused Gnutella outgoing bandwidth to supersede hint" +msgstr "" + +msgid "Display GUESS statistics" +msgstr "" + +msgid "Mapping lease time" +msgstr "" + +msgid "G2 hubs" +msgstr "" + +msgid "Enable the G2 network" +msgstr "" + +msgid " G2, " +msgstr "" msgid "owned" msgstr "" @@ -7678,9 +8152,6 @@ msgid_plural "Discarded %u results" msgstr0 "丢弃 %u 个结果" -msgid "Query queued..." -msgstr "已将查询加入队列..." - #, c-format msgid "%u term counted" msgid_plural "%u terms counted" @@ -7721,6 +8192,9 @@ msgid "_Auto-hide leaf traffic stats" msgstr "自动隐藏叶节点流量统计(_A):" +msgid "Glossary" +msgstr "" + msgid "_Search" msgstr "搜索(_S)" @@ -7730,11 +8204,7 @@ msgid "Do not specify any media type (will match any kind of files remotely)" msgstr "" -#, fuzzy msgid "CPU overloaded" -msgstr "已上传" - -msgid "Splitting outgoing HTTP bandwidth evenly." msgstr "" msgid "Connect to" @@ -7778,12 +8248,18 @@ msgid "Served " msgstr "" -msgid "BH HTML served" +msgid "G2 served" msgstr "" msgid " / " msgstr " / " +msgid "G2" +msgstr "" + +msgid "BH HTML served" +msgstr "" + msgid "BH HTML" msgstr "BH HTML" @@ -7829,9 +8305,8 @@ msgid "Force external IPv4 address to" msgstr "强制外部 IPv4 地址" -#, fuzzy msgid "_Bind to this address" -msgstr "返回地址错误" +msgstr "" msgid "IPv_4 settings" msgstr "IPv_4 设置" @@ -7862,34 +8337,23 @@ msgid "unit_of_time|s" msgstr "" -#, fuzzy msgid "Gnutella Distributed Hash Table" -msgstr "用于上传的debug级别。" +msgstr "" msgid "Maximum percentage of connection slots a vendor can occupy." msgstr "" -#, fuzzy -msgid "Global DHT ougoing traffic" -msgstr "出站流量(_O)" - msgid "attempts" msgstr "尝试 " -#, fuzzy msgid "Pipelining maximum chunk size" -msgstr "最小体积:" +msgstr "" msgid "_Remove directory" msgstr "删除目录(_R)" -#, fuzzy -msgid "Enable upload of partial files deemed rare" -msgstr "启用对部分下载文件的上传(_P)" - -#, fuzzy msgid "Minimum chunk _size" -msgstr "最小体积:" +msgstr "" msgid "Show a status _icon" msgstr "显示状态图标(_I)" @@ -7934,6 +8398,9 @@ msgid "Reverse lookup in progress..." msgstr "" +msgid "UDP (semi-reliable)" +msgstr "" + msgid "Size:" msgstr "大小:" @@ -7946,28 +8413,29 @@ msgid "Valid regular" msgstr "有效常规节点" -#, fuzzy msgid "Fresh IPv4 ultra" -msgstr "新超级节点" +msgstr "" -#, fuzzy msgid "Valid IPv4 ultra" -msgstr "有效超级节点" +msgstr "" -#, fuzzy msgid "Fresh IPv6 ultra" -msgstr "新超级节点" +msgstr "" -#, fuzzy msgid "Valid IPv6 ultra" -msgstr "有效超级节点" +msgstr "" + +msgid "Fresh G2 hub" +msgstr "" + +msgid "Valid G2 hub" +msgstr "" msgid "Unstable" msgstr "不稳定" -#, fuzzy msgid "Alien" -msgstr "别名" +msgstr "" msgid "GUESS (IPv4 running)" msgstr "" @@ -8002,6 +8470,11 @@ "sourceforge.net/?page=faq\">FAQ online</a> instead.</p></body></html>" msgstr "" +msgid "" +"<html><head><title>Glossary</title></head><body><p>The glossary document " +"could not be loaded.</p></body></html>" +msgstr "" + #, c-format msgid "%lu file shared (%s)" msgid_plural "%lu files shared (%s)" @@ -8032,6 +8505,9 @@ msgid "UNKNOWN STATUS" msgstr "未知状态" +msgid "g2" +msgstr "" + msgid "busy" msgstr "忙碌" @@ -8047,13 +8523,11 @@ msgid "bogus" msgstr "" -#, fuzzy msgid "alien" -msgstr "别名" +msgstr "" -#, fuzzy msgid "media" -msgstr "亚美尼亚" +msgstr "" msgid "No search" msgstr "无搜索" @@ -8076,6 +8550,11 @@ msgstr "随此会话退出过期" #, c-format +msgid " %u download" +msgid_plural " %u downloads" +msgstr0 "" + +#, c-format msgid "" "%u %s (%u skipped, %u ignored, %u hidden, %u auto-d/l, %u %s) Hits: %u (%u " "TCP, %u UDP)" @@ -8090,6 +8569,58 @@ msgid_plural "dupes" msgstr0 "" +msgid "No GUESS queries run yet" +msgstr "" + +#, c-format +msgid " previous took %s querying %zu %s with %zu %s kept" +msgstr "" + +msgid "host" +msgid_plural "hosts" +msgstr0 "" + +msgid "hit" +msgid_plural "hits" +msgstr0 "" + +#, c-format +msgid "GUESS %s Total: %zu %s (%s %s, %s kept, %s queries, %s keys)%s" +msgstr "" + +msgid "idle" +msgstr "" + +msgid "query" +msgid_plural "queries" +msgstr0 "" + +#, c-format +msgid "" +"GUESS %s %s (%zu %s, %zu kept, %s queries, %s keys) Pool: %zu %s, (%zu+" +"%zu)/%zu queried, %zu %s (%.2f%%), %zu reached, %zu pending, %zu %s%s%s" +msgstr "" + +msgid "loose" +msgstr "" + +msgid "bounded" +msgstr "" + +msgid "ack" +msgid_plural "acks" +msgstr0 "" + +msgid "hop" +msgid_plural "hops" +msgstr0 "" + +msgid " (load pending)" +msgstr "" + +msgid " (end if starving)" +msgstr "" + msgid "Passive" msgstr "被动" @@ -8182,9 +8713,8 @@ msgid "No" msgstr "否" -#, fuzzy msgid "Tag" -msgstr "目标" +msgstr "" msgid "Yes" msgstr "是" @@ -8192,20 +8722,27 @@ msgid "Maybe" msgstr "" -#, fuzzy msgid "Source" -msgstr "%u 个源" +msgstr "" -#, fuzzy msgid "Alien IP" -msgstr "别名" +msgstr "" msgid "Alt-Locs" msgstr "" -#, fuzzy msgid "Partial" -msgstr "部分" +msgstr "" + +#, c-format +msgid "%s %.2f%%" +msgstr "" + +msgid "Available" +msgstr "" + +msgid "Last modification" +msgstr "" msgid "Latinized" msgstr "" @@ -8222,6 +8759,9 @@ msgid "Hostname" msgstr "主机名" +msgid "banned" +msgstr "" + msgid "Servent ID" msgstr "Servent ID" @@ -8231,9 +8771,8 @@ msgid "Browsable" msgstr "可浏览" -#, fuzzy msgid "Hostile" -msgstr "主机(_o):" +msgstr "" msgid "Push-proxies" msgstr "" @@ -8280,24 +8819,12 @@ msgid "The URN in the search text is invalid." msgstr "" -msgid "SHA-1 is unknown." -msgstr "SHA-1 未知。" - -msgid "No Bitzi ticket requested yet." -msgstr "" - -msgid "Not in Bitzi database." -msgstr "不在 Bitzi 数据库中。" - msgid "Encoding" msgstr "编码" msgid "#" msgstr "#" -msgid "Metadata" -msgstr "元数据" - msgid "Never" msgstr "从不" @@ -8329,6 +8856,12 @@ msgid "*** CPU OVERLOADED -- TRYING TO SAVE CYCLES ***" msgstr "*** CPU 超载 -- 尝试保存周期 ***" +msgid "*** KERNEL BUFFER SHORTAGE -- LIMITING TCP CONNECTIONS ***" +msgstr "" + +msgid "*** NO LISTENING TCP SOCKET -- NO INBOUND CONNECTIONS ***" +msgstr "" + msgid "*** UPLOADS STALLING, BANDWIDTH SHORTAGE? ***" msgstr "*** 上传受阻,带宽紧张? ***" @@ -8367,11 +8900,6 @@ msgstr "已将 %u 个加入队列" #, c-format -msgid "%u/%u connection" -msgid_plural "%u/%u connections" -msgstr0 "连接 %1$u/%2$u" - -#, c-format msgid "%u/%u upload" msgid_plural "%u/%u uploads" msgstr0 "上传 %1$u/%2$u" @@ -8384,6 +8912,9 @@ msgid "Queue frozen" msgstr "队列已冻结" +msgid "Internal" +msgstr "" + msgid "Select a property to see its description." msgstr "" @@ -8424,9 +8955,8 @@ msgid "Waiting for further request..." msgstr "正等待进一步的请求..." -#, fuzzy msgid "Reading follow-up request..." -msgstr "正等待进一步的请求..." +msgstr "" msgid "Transmission aborted" msgstr "传输中止" @@ -8434,9 +8964,9 @@ msgid "Transmission complete" msgstr "传输完成" -#, fuzzy, c-format +#, c-format msgid "%s %d (slot %d/%d)%s %s %s" -msgstr "ETA排队(插口%1$d/%2$d):%3$s" +msgstr "" msgid "Frozen" msgstr "已冻结" @@ -8449,26 +8979,3 @@ msgid "Sent QUEUE, waiting for headers..." msgstr "发送队列,正等待头部..." - -#, fuzzy -#~ msgid "Linux archives" -#~ msgstr "%u 个活动" - -#~ msgid "Index" -#~ msgstr "索引" - -#, fuzzy -#~ msgid "Seaerch Media Type" -#~ msgstr "搜索项目" - -#~ msgid "Banned: %s" -#~ msgstr "禁止:%s" - -#~ msgid "Banned for %s" -#~ msgstr "因为 %s 而禁止" - -#~ msgid "(" -#~ msgstr "(" - -#~ msgid "Unavailable range, waiting retry..." -#~ msgstr "超出范围,请稍候重试..."
View file
gtk-gnutella-1.1.9.tar.bz2/scripts/enum-msg.pl
Added
@@ -0,0 +1,356 @@ +#!/usr/bin/perl + eval 'exec perl5 -S $0 ${1+"$@"}' + if $running_under_some_shell; + +# +# Copyright (c) 2014, Raphael Manfredi +# +#---------------------------------------------------------------------- +# This file is part of gtk-gnutella. +# +# gtk-gnutella 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 2 of the License, or +# (at your option) any later version. +# +# gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software +# Foundation, Inc.: +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +#---------------------------------------------------------------------- +# +# +# This program takes a list of variable definitions and their associated +# English translations and generates the associated C data structures so +# that we can symbolically handle the constants and yet obtain human-readable +# translation of these constants. +# +# The input is made up of tabulated names and strings, such as: +# +# CONSTANT "Description of the constant" +# +# The generation of the C data structures is controlled by a set of textual +# definitions that make up the parameters of this script: +# +# Count: FOO -- name of additional enum representing count of items +# Prefix: MSG_ -- prefix to add to C constants +# Lowercase: yes -- Whether constant symbolic names should be lower-cased +# I18N: yes -- Whether to make descriptions translatable +# Enum: constant_enum -- Name of the C enum for symbolic constants +# Enum-Init: 0 -- Value of the first enum symbol +# Symbolic: sym_name -- Name of C string array for symbolic names +# Description: sym_desc -- Name of C array containing textual descriptions +# Enum-File: foo.h -- Name of C file for enum definitions +# Enum-to-Symbolic: foo -- Routine name to translate enum to symbolic text +# Enum-to-Description: foo -- Routine name to translate enum to English text +# Enum-to-Code: foo.c -- Filename where translation routine are generated +# Enum-to-Header: foo.h -- Filename for translation routine declarations +# Protection-Prefix: xxx -- String to prepend to #ifndef for header file +# +# Assuming the constants are held in "file.lst" and the parameters of this +# script are at the top (header), then the generation process can be launched +# by running: +# +# enum-msg.pl file.lst +# + +use strict; + +my $KEY_COUNT = "count"; +my $KEY_PREFIX = "prefix"; +my $KEY_LOWERCASE = "lowercase"; +my $KEY_I18N = "i18n"; +my $KEY_ENUM = "enum"; +my $KEY_ENUM_INIT = "enum-init"; +my $KEY_SYMBOLIC = "symbolic"; +my $KEY_DESCRIPTION = "description"; +my $KEY_ENUM_FILE = "enum-file"; +my $KEY_ENUM_TO_SYMBOLIC = "enum-to-symbolic"; +my $KEY_ENUM_TO_DESCRIPTION = "enum-to-description"; +my $KEY_ENUM_TO_CODE = "enum-to-code"; +my $KEY_ENUM_TO_HEADER = "enum-to-header"; +my $KEY_PROTECTION_PREFIX = "protection-prefix"; + +(my $me = $0) =~ s|.*/(.*)|$1|; + +use Getopt::Std; + +use vars qw/$opt_h/; + +&usage unless getopts("h"); +&usage if $opt_h; +&usage unless 1 == @ARGV; + +sub usage { + die <<EOM; +Usage: $me -h file.lst + -h : print this message and exit +EOM +} + + +my ($input) = @ARGV; + +my %desc; +my (@sym, @text); +my (%files, %hprotect); + +open(INPUT, $input) || die "$me: cannot open $input: $!\n"; + +load_desc(\*INPUT, \%desc); +load_input(\*INPUT, \@sym, \@text); + +my $enum = $desc{$KEY_ENUM}; +my $init = $desc{$KEY_ENUM_INIT}; +my $fname = $desc{$KEY_ENUM_FILE}; +my $prefix = $desc{$KEY_PREFIX}; +my $count = $desc{$KEY_COUNT}; +my $protect = $desc{$KEY_PROTECTION_PREFIX}; +my $symbolic = $desc{$KEY_SYMBOLIC}; +my $etext = $desc{$KEY_DESCRIPTION}; +my $sym_cfile = $desc{$KEY_ENUM_TO_CODE}; +my $sym_hfile = $desc{$KEY_ENUM_TO_HEADER}; +my $e2sym = $desc{$KEY_ENUM_TO_SYMBOLIC}; +my $e2txt = $desc{$KEY_ENUM_TO_DESCRIPTION}; +my $lowercase = $desc{$KEY_LOWERCASE} =~ /yes/i; +my $i18n = $desc{$KEY_I18N} =~ /yes/i; + +die "$me: missing $KEY_ENUM_TO_CODE key in $input to handle $KEY_SYMBOLIC\n" + if defined $symbolic && !defined $sym_cfile; + +die "$me: missing $KEY_ENUM_TO_HEADER key in $input to handle $KEY_SYMBOLIC\n" + if defined $symbolic && !defined $sym_hfile; + +# +# Generation of the enum {} definition. +# + +if (defined $fname && defined $enum) { + my $fd = create_file($fname); + my $n = scalar @sym; + print $fd <<EOC; +/* + * Enum count: $n + */ +typedef enum { +EOC + my $done = 0; + foreach my $e (@sym) { + print $fd ",\n" if $done++; + print $fd "\t$prefix$e"; + print $fd " = $init" if 1 == $done && defined $init; + } + if (defined $count) { + print $fd ",\n\n\t$prefix$count\n"; + } else { + print $fd "\n"; + } + print $fd <<EOC; +} $enum; + +EOC +} + +# +# Generation of the symbolic enum code array. +# + +if (defined $sym_cfile) { + my $fdc = create_file($sym_cfile); + print $fdc <<EOC; +#include "common.h" + +EOC + print $fdc <<EOC if defined $sym_hfile; +#include "$sym_hfile" +EOC + print $fdc <<EOC; + +#include "lib/str.h" +#include "lib/override.h" /* Must be the last header included */ + +EOC +} + +if (defined $sym_cfile && defined $symbolic) { + my $fdc = create_file($sym_cfile); + my $fdh = create_file($sym_hfile) if defined $sym_hfile; + die "$me: key $KEY_ENUM missing in header" + unless defined $enum; + print $fdh <<EOH if defined $fdh && defined $e2sym; +const char *$e2sym($enum x); + +EOH + print $fdc <<EOC; +/* + * Symbolic descriptions for $enum. + */ +static const char *$symbolic\ = { +EOC + foreach my $e (@sym) { + my $s = $lowercase ? lc($e) : $e; + print $fdc "\t\"$s\",\n"; + } + print $fdc <<EOC; +}; + +EOC + print $fdc <<EOC if defined $e2sym; +/** + * \@return the symbolic description of the enum value. + */ +const char * +$e2sym($enum x) +{ + if G_UNLIKELY(UNSIGNED(x) >= G_N_ELEMENTS($symbolic)) { + str_t *s = str_private(G_STRFUNC, 80); + str_printf(s, "Invalid $enum code: %d", (int) x); + return str_2c(s); + } + + return $symbolic\x; +} + +EOC +} + +# +# Generation of the English description array. +# + +if (defined $sym_cfile && defined $etext) { + my $fdc = create_file($sym_cfile); + my $fdh = create_file($sym_hfile) if defined $sym_hfile; + die "$me: key $KEY_ENUM missing in header" + unless defined $enum; + print $fdh <<EOH if defined $fdh && defined $e2txt; +const char *$e2txt($enum x); + +EOH + print $fdc <<EOC; +/* + * English descriptions for $enum. + */ +static const char *$etext\ = { +EOC + foreach my $t (@text) { + my $d = $i18n ? "N_(\"$t\")" : "\"$t\""; + print $fdc "\t$d,\n"; + } + print $fdc <<EOC; +}; + +EOC + print $fdc <<EOC if defined $e2txt; +/** + * \@return the English description of the enum value. + */ +const char * +$e2txt($enum x) +{ + if G_UNLIKELY(UNSIGNED(x) >= G_N_ELEMENTS($etext)) { + str_t *s = str_private(G_STRFUNC, 80); + str_printf(s, "Invalid $enum code: %d", (int) x); + return str_2c(s); + } + + return $etext\x; +} + +EOC +} + +# Close all files requiring protection +while (my ($f, $psym) = each %hprotect) { + my $fd = $files{$f}; + print $fd "#endif /* $psym */\n\n"; +} + +# Close all the opened files +while (my ($f, $fd) = each %files) { + print $fd "/* vi: set ts=4 sw=4 cindent: */\n"; + close $fd; +} + +# Create file, if not already done in this session +# Returns the opened file descriptor +sub create_file { + my ($name) = @_; + return $files{$name} if defined $files{$name}; + # Unlinking file to break filesystem hard links to the file + unlink($name); + my $fd; + open(my $fd, ">$name") || die "$me: cannot create file $name: $!\n"; + $files{$name} = $fd; + my $time = scalar localtime; + print $fd <<EOC; +/* + * Generated on $time by $me -- DO NOT EDIT + * + * Command: $0 $input + */ + +EOC + if ($name =~ /\.h$/) { + my $symbol = $name; + $symbol =~ s/.-/_/g; + my $psym = "_${protect}_${symbol}_"; + $hprotect{$name} = $psym; + print $fd <<EOC; +#ifndef $psym +#define $psym + +EOC + } + return $fd; +} + +# Load description: what we need to generate and where +sub load_desc { + my ($fd, $href) = @_; + my $seen_header = 0; + local $_, $.; + while (<$fd>) { + chomp; + last if $seen_header && /^\s*$/; # End of header + next if /^#/ || /^\s*$/; + my ($key, $value) = /^(-\w+):\s*(.*)/; + unless (defined $key) { + warn "$me: skipping bad line #$. '$_'\n"; + next; + } + $href->{lc($key)} = $value; + $seen_header++; + } +} + +# Load input: the symbols to define and their English description +sub load_input { + my ($fd, $sref, $tref) = @_; + local $_, $.; + while (<$fd>) { + chomp; + next if /^#/ || /^\s*$/; + my ($sym, $text) = /^(\w+)\s*"(.*)"/; + unless (defined $sym) { + # Handle continuations: symbol followed by text on next line + ($sym) = /^(\w+)/; + if (defined $sym) { + $_ = <INPUT>; + ($text) = /^\s+"(.*)"/; # Continuation must be indented + } + if (!defined($sym) || !defined($text)) { + warn "$me: skipping bad line #$. '$_'\n"; + next; + } + } + push(@$sref, $sym); + push(@$tref, $text); + } +} +
View file
gtk-gnutella-0.98.2.tar.bz2/scripts/generic-cat -> gtk-gnutella-1.1.9.tar.bz2/scripts/generic-cat
Changed
@@ -52,8 +52,9 @@ */ EOH -grep -v '^;#' $header -echo " " +if test -s $header; then + (cat $header; echo " ") | grep -v '^;#' +fi GENERIC=`echo $generic | tr 'a-z' 'A-Z'` sed -e "/^;#/d" \ -e "s/<generic>/$generic/g" \
View file
gtk-gnutella-1.1.9.tar.bz2/scripts/generic-pp
Added
@@ -0,0 +1,82 @@ +#!/bin/sh + +# +# $Id$ +# +# Copyright (c) 2012, Raphael Manfredi +# +# Catenate a .xt header file with a generic .xt file, substituting the +# "generic" string in the second .xt file with the supplied parameter, +# plus operating a variant selection via a crude pre-processor. +# +# All ";#" comments from both files are stripped out during the process. +# +#---------------------------------------------------------------------- +# This file is part of gtk-gnutella. +# +# gtk-gnutella 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 2 of the License, or +# (at your option) any later version. +# +# gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software +# Foundation, Inc.: +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +#---------------------------------------------------------------------- +# + +LC_ALL=C +export LC_ALL + +header=$1 +template=$2 +generic=$3 +iterator=$4 +variant=$5 + +date=`date` + +cat <<EOH +/* + * THIS FILE WAS AUTOMATICALLY GENERATED -- DO NOT EDIT. + * + * Generating command: + * + * $0 $@ + * + * Generated on $date. + */ + +EOH +if test -s $header; then + (cat $header; echo " ") | grep -v '^;#' +fi +GENERIC=`echo $generic | tr 'a-z' 'A-Z'` +awk -v "sym=$variant" ' + BEGIN { + s = 0; + skips = 0; + } + /^@if / { + val = $2; + skip++s = (val == sym) ? 0 : 1; + next; + } + /^@end/ { s--; next; } + { + if (!skips) + print; + } +' $template | +sed -e "/^;#/d" \ + -e "s/<generic>/$generic/g" \ + -e "s/<GENERIC>/$GENERIC/g" \ + -e "s/_generic_/_${generic}_/g" \ + -e "s/_GENERIC_/_${GENERIC}_/g" \ + -e "s/<iterator>/$iterator/g"
View file
gtk-gnutella-0.98.2.tar.bz2/scripts/geo-to-db.pl -> gtk-gnutella-1.1.9.tar.bz2/scripts/geo-to-db.pl
Changed
@@ -31,9 +31,8 @@ # "2.0.0.0","2.6.190.55","33554432","33996343","ZA","South Africa" # -require 'getopt.pl'; - -&Getopt; +use Getopt::Std; +getopts('c'); print "# From http://www.maxmind.com/app/geoip_country\n"; print "# Redistributed under the OPEN DATA LICENSE (see GEO_LICENCE)\n";
View file
gtk-gnutella-0.98.2.tar.bz2/scripts/geo6-to-db.pl -> gtk-gnutella-1.1.9.tar.bz2/scripts/geo6-to-db.pl
Changed
@@ -24,9 +24,8 @@ # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #---------------------------------------------------------------------- -require 'getopt.pl'; - -&Getopt; +use Getopt::Std; +getopts('g'); # # Converts the Geo IPv6 database into a suitable format for GTKG
View file
gtk-gnutella-1.1.9.tar.bz2/scripts/lntool.sh
Added
@@ -0,0 +1,105 @@ +#! /bin/sh + +# The purpose is the same as the lndir tool of X11. +# Duplicates the directory structure of DIRECTORY into the current +# working directory with all regular files replaced by symlinks. +# This is useful for compiling without littering the source tree +# with object files and such. + +set -e + +# Don't overwrite by default +force='' + +usage() { + if "x$1" != 'x' + then echo "ERROR: $1" >&2 + fi + cat << EOM >&2 +USAGE: lntool.sh OPTIONS SOURCE DESTINATION + SOURCE is the directory tree to copy. + DESTINATION is optional and the leaf directory of SOURCE by default. +EXAMPLES: + lntool.sh /example/test -> copies tree to ./test + lntool.sh /example/test blah -> copies tree to ./blah +OPTIONS: + --force | -f Force ln to overwrite existing files or links. + Useful when updating an existing tree. + --help | -h Display this information. +EOM + exit 1; +} + +trimslash() { + arg="$1" + while "/" != "$arg" && "x${arg}" != "x${arg%/}" + do + arg="${arg%/}" + done + echo "$arg" +} + +pathify() { + arg="$(trimslash "$1")" + case "$arg" in + /*|./*|'') echo "$arg";; + *) echo "./$arg";; + esac +} + +test $# -gt 0 || usage + +while $# -gt 0 +do + case "$1" in + --) shift + break + ;; + -h|--help) usage + ;; + -f|--force) force='-f' + ;; + -*) usage 'Unknown option' + ;; + *) break + ;; + esac + shift +done + +test $# -gt 0 || usage 'Missing argument' +test $# -lt 3 || usage 'ERROR: Too many arguments' + +src="$(pathify "$1")" +shift + +test -d "$src" || usage 'Argument is not a directory' + +if $# -eq 0 +then dst="${src##*/}" +else dst="$1" +fi + +dst="$(pathify "$dst")" + +mkdir -p "$dst" +cd "$dst" + +find "$src" ! -type d -print | while read item +do + relpath="${item#$src/}" + case "$relpath" in + */*) dir="${relpath%/*}" + ;; + *) dir='.' + ;; + esac + mkdir -p "$dir" + ( + cd "$dir" + ln -s ${force} "$item" + ) +done + +exit 0 +
View file
gtk-gnutella-1.1.9.tar.bz2/scripts/nm-list
Added
@@ -0,0 +1,88 @@ +#!/bin/sh + +# +# Copyright (c) 2013, Raphael Manfredi +# +# Generates a decorated "nm" list of specified file, with a HTTP-like header. +# +# The header includes both the SHA1 of the executable as built, and the SHA1 +# of the stripped executable. +# +#---------------------------------------------------------------------- +# This file is part of gtk-gnutella. +# +# gtk-gnutella 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 2 of the License, or +# (at your option) any later version. +# +# gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software +# Foundation, Inc.: +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +#---------------------------------------------------------------------- +# + +LC_ALL=C +export LC_ALL + +file=$1 +nm=$2 + +TMP="stripped-$file" +trap "rm -f $TMP; exit 1" 1 2 3 15 + +# Locate top of the source tree +if test -f Configure; then TOP=.; +elif test -f ../Configure; then TOP=..; +elif test -f ../../Configure; then TOP=../..; +elif test -f ../../../Configure; then TOP=../../..; +else + echo "Can't find Configure."; exit 1 +fi + +# See whether their native sha1sum executable will work, if present at all +SHA1SUM=sha1sum +empty=`$SHA1SUM /dev/null 2>/dev/null | cut -f1 -d' '` +case "$empty" in +da39a3ee5e6b4b0d3255bfef95601890afd80709) ;; +*) SHA1SUM=$TOP/src/bin/sha1sum ;; +esac + +date=`date` +sha1=`$SHA1SUM $file 2>/dev/null | cut -f1 -d' '` +case "$sha1" in +'') echo "Failed to compute SHA1 of $file" >&2; exit 1;; +esac + +cp $file $TMP +if strip $TMP 2>/dev/null; then + stripped_sha1=`$SHA1SUM $TMP 2>/dev/null | cut -f1 -d' '` +fi +rm -f $TMP + +NM=${nm-nm} + +cat <<EOH +NM/1.0 +Date: $date +File: $file +EOH + +case "$stripped_sha1" in +'') ;; +*) echo "SHA1: $stripped_sha1";; +esac + +cat <<EOH +SHA1: $sha1 + +EOH + +exec $NM -p $file +
View file
gtk-gnutella-0.98.2.tar.bz2/src/Jmakefile -> gtk-gnutella-1.1.9.tar.bz2/src/Jmakefile
Changed
@@ -29,7 +29,7 @@ all:: /* So that default target is not clobber! */ -SetSubdirs(core shell dht lib ui if sdbm upnp xml) +SetSubdirs(bin core shell dht lib ui if sdbm upnp xml) DependSubdirs() SRC = main.c @@ -76,6 +76,7 @@ -Lupnp -lupnp \ -Ldht -ldht \ -Lcore -lcore \ + -Lcore/g2 -lg2 \ |case d_headless in undef -Lui/gtk -lgtk-common -lgtkx -lgtk-common \ -case @@ -86,6 +87,7 @@ RemoteTargetDependency(gtk-gnutella, lib, libshared.a) RemoteTargetDependency(gtk-gnutella, core, libcore.a) +RemoteTargetDependency(gtk-gnutella, core/g2, libg2.a) RemoteTargetDependency(gtk-gnutella, shell, libshell.a) RemoteTargetDependency(gtk-gnutella, dht, libdht.a) RemoteTargetDependency(gtk-gnutella, sdbm, libsdbm.a) @@ -101,10 +103,11 @@ RemoteTargetDependency(gtk-gnutella, if, gui_property.o) RemoteTargetDependency(main.o, if, gnet_property.h) RemoteTargetDependency(main.o, if, gui_property.h) +RemoteTargetDependency(main.o, lib, htable.h) DependTarget() NormalProgramTarget(gtk-gnutella, $(SRC), $(OBJ) $(EXTRA)) -InstallProgramNoStrip(gtk-gnutella, $(BINDIR)) +InstallProgram(gtk-gnutella, $(BINDIR)) InstallManPage(gtk-gnutella, $(MANSRC)) /* @@ -136,8 +139,30 @@ */ AllTarget(gtk-gnutella.nm) +RemoteTargetDependency(gtk-gnutella.nm, bin, sha1sum) gtk-gnutella.nm: gtk-gnutella - $(NM) -p gtk-gnutella$(_EXE) > $@ + $(TOP)/scripts/nm-list gtk-gnutella$(_EXE) $(NM) > $@ InstallNonExec(gtk-gnutella.nm, $(ARCHLIB)) + +/* + * Local Coverity builds + */ + +coverity.tgz: .FORCE + @if cov-build 2>/dev/null | grep Coverity >/dev/null 2>&1; \ + then \ + : ok; \ + else \ + echo "cov-build not found in PATH"; \ + exit 1; \ + fi + $(MAKE) realclean + $(MAKE) depend + cov-build --dir cov-int $(MAKE) gtk-gnutella.nm + tar czf $@ cov-int + +local_realclean:: + $(RM) -rf cov-int + $(RM) -f coverity.tgz
View file
gtk-gnutella-0.98.2.tar.bz2/src/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/src/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-96 -: $X-Id: Jmake.tmpl 69 2011-01-09 13:57:07Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -45,9 +45,9 @@ CC = $cc CTAGS = ctags _EXE = $_exe -JCFLAGS = \$(CFLAGS) $optimize $ccflags $large +JCFLAGS = \$(CFLAGS) $optimize $pthread $ccflags $large JCPPFLAGS = $cppflags -JLDFLAGS = \$(LDFLAGS) $optimize $ldflags +JLDFLAGS = \$(LDFLAGS) $optimize $pthread $ldflags L = $manext LIBS = $libs MANSRC = $installmansrc @@ -60,7 +60,7 @@ ######################################################################## # Automatically generated parameters -- do not edit -SUBDIRS = core shell dht lib ui if sdbm upnp xml +SUBDIRS = bin core shell dht lib ui if sdbm upnp xml USRINC = $usrinc SOURCES = \$(SRC) SOCKER_CFLAGS = $sockercflags @@ -83,7 +83,7 @@ $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 94 2011-02-10 14:06:58Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Force 'make depend' to be performed first -- do not edit @@ -131,6 +131,7 @@ -Lupnp -lupnp \ -Ldht -ldht \ -Lcore -lcore \ + -Lcore/g2 -lg2 \ !NO!SUBS! case "$d_headless" in undef) @@ -161,6 +162,13 @@ gtk-gnutella: core/libcore.a +core/g2/libg2.a: .FORCE + @echo "Checking "libg2.a" in "core/g2"..." + cd core/g2; $(MAKE) libg2.a + @echo "Continuing in $(CURRENT)..." + +gtk-gnutella: core/g2/libg2.a + shell/libshell.a: .FORCE @echo "Checking "libshell.a" in "shell"..." cd shell; $(MAKE) libshell.a @@ -260,6 +268,13 @@ main.o: if/gui_property.h +lib/htable.h: .FORCE + @echo "Checking "htable.h" in "lib"..." + cd lib; $(MAKE) htable.h + @echo "Continuing in $(CURRENT)..." + +main.o: lib/htable.h + local_depend:: ../mkdep ../mkdep: @@ -294,6 +309,12 @@ $(INSTALLDIR) $(INSTALL_PREFIX)$(BINDIR)); \ $(INSTALL) -c -m 555 gtk-gnutella$(_EXE) $(INSTALL_PREFIX)$(BINDIR) +local_install-strip:: gtk-gnutella + @case '${MFLAGS}' in *i*) set +e;; esac; \ + (set -x; test -d $(INSTALL_PREFIX)$(BINDIR) || \ + $(INSTALLDIR) $(INSTALL_PREFIX)$(BINDIR)); \ + $(INSTALL) -c -s -m 555 gtk-gnutella$(_EXE) $(INSTALL_PREFIX)$(BINDIR) + local_deinstall:: $(RM) $(INSTALL_PREFIX)$(BINDIR)/gtk-gnutella$(_EXE) @@ -316,10 +337,17 @@ local_realclean:: $(RM) gtk-gnutella.nm +bin/sha1sum: .FORCE + @echo "Checking "sha1sum" in "bin"..." + cd bin; $(MAKE) sha1sum + @echo "Continuing in $(CURRENT)..." + +gtk-gnutella.nm: bin/sha1sum + gtk-gnutella.nm: gtk-gnutella - $(NM) -p gtk-gnutella$(_EXE) > $@ + $(TOP)/scripts/nm-list gtk-gnutella$(_EXE) $(NM) > $@ -local_install:: gtk-gnutella.nm +local_install local_install-strip:: gtk-gnutella.nm @case '${MFLAGS}' in *i*) set +e;; esac; \ (set -x; test -d $(INSTALL_PREFIX)$(ARCHLIB) || \ $(INSTALLDIR) $(INSTALL_PREFIX)$(ARCHLIB)); \ @@ -328,6 +356,23 @@ local_deinstall:: $(RM) $(INSTALL_PREFIX)$(ARCHLIB)/gtk-gnutella.nm +coverity.tgz: .FORCE + @if cov-build 2>/dev/null | grep Coverity >/dev/null 2>&1; \ + then \ + : ok; \ + else \ + echo "cov-build not found in PATH"; \ + exit 1; \ + fi + $(MAKE) realclean + $(MAKE) depend + cov-build --dir cov-int $(MAKE) gtk-gnutella.nm + tar czf $@ cov-int + +local_realclean:: + $(RM) -rf cov-int + $(RM) -f coverity.tgz + ######################################################################## # Common rules for all Makefiles -- do not edit @@ -347,6 +392,11 @@ $(RM) Makefile config.sh install:: local_install sub_install + @exit 0 + +install-strip:: local_install-strip sub_install-strip + @exit 0 + install.man:: maybe_install.man sub_install.man deinstall:: sub_deinstall local_deinstall deinstall.man:: sub_deinstall.man maybe_deinstall.man @@ -396,13 +446,16 @@ @case '${MFLAGS}' in *ik*) set +e;; esac; \ for i in $(SUBDIRS) ;\ do \ - (cd $$i ; echo $(VERB) "in $(DIR)$$i..."; \ + (cd $$i ; echo "$(VERB) in $(DIR)$$i..."; \ $(MAKE) $(MFLAGS) $(FLAGS) $(TARGET)) || exit 1; \ done sub_install:: @$(MAKE) subdirs TARGET=install VERB="Installing" FLAGS= +sub_install-strip:: + @$(MAKE) subdirs TARGET=install-strip VERB="Installing (strip)" FLAGS= + sub_deinstall:: @$(MAKE) subdirs TARGET=deinstall VERB="Deinstalling" FLAGS= @echo "Back to $(CURRENT) for "deinstall... @@ -471,6 +524,7 @@ @$(MAKE) subdirs TARGET=all VERB="Making all" FLAGS= local_install:: +local_install-strip:: local_deinstall:: local_install.man:: local_deinstall.man::
View file
gtk-gnutella-1.1.9.tar.bz2/src/bin
Added
+(directory)
View file
gtk-gnutella-1.1.9.tar.bz2/src/bin/Jmakefile
Added
@@ -0,0 +1,45 @@ +/* + * $Id$ + * + * Copyright (c) 2013, Raphael Manfredi + * + * Jmakefile for bin sources. + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/* Additional flags for glib compilation, added in the substituted section */ +++GLIB_CFLAGS $glibcflags + +;# Those extra flags are expected to be user-defined +CFLAGS = -I$(TOP) -I.. $(GLIB_CFLAGS) -DCURDIR=$(CURRENT) +DPFLAGS = $(CFLAGS) + +DependTarget() + +++GLIB_LDFLAGS $glibldflags +++COMMON_LIBS $libs + +LDFLAGS = +LIBS = -L../lib -lshared $(GLIB_LDFLAGS) $(COMMON_LIBS) + +RemoteTargetDependency(sha1sum, ../lib, libshared.a) + +NormalProgramLibTarget(sha1sum, sha1sum.c, sha1sum.o, /**/)
View file
gtk-gnutella-1.1.9.tar.bz2/src/bin/Makefile.SH
Added
@@ -0,0 +1,215 @@ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ + +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +CURRENT=src/bin +DIR=`echo $CURRENT/ | sed -e 's/\.\///g'` +echo "Extracting ${DIR}Makefile (with variable substitutions)" + +DATE=`date` + +$spitshell >Makefile <<!GROK!THIS! +######################################################################## +# Makefile generated from Makefile.SH on $DATE + +SHELL = /bin/sh +JMAKE = jmake +TOP = ../.. +CURRENT = $CURRENT +DIR = $DIR + +######################################################################## +# Parameters set by Configure -- edit config.sh if changes are needed + +CC = $cc +CTAGS = ctags +_EXE = $_exe +JCFLAGS = \$(CFLAGS) $optimize $pthread $ccflags $large +JCPPFLAGS = $cppflags +JLDFLAGS = \$(LDFLAGS) $optimize $pthread $ldflags +LIBS = $libs +MKDEP = $mkdep \$(DPFLAGS) \$(JCPPFLAGS) -- +MV = $mv +RM = $rm -f +SED = $sed + +######################################################################## +# Automatically generated parameters -- do not edit + +USRINC = $usrinc +GLIB_LDFLAGS = $glibldflags +SOURCES = sha1sum.c +OBJECTS = sha1sum.o +GLIB_CFLAGS = $glibcflags +COMMON_LIBS = $libs + +######################################################################## +# New suffixes and associated building rules -- edit with care + +.c.o: + \$(CC) -c \$(JCFLAGS) \$< + +!GROK!THIS! +$spitshell >>Makefile <<'!NO!SUBS!' +######################################################################## +# Jmake rules for building libraries, programs, scripts, and data files +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ + +######################################################################## +# Force 'make depend' to be performed first -- do not edit + +all:: .FORCE_DEPEND + +.FORCE_DEPEND:: + +######################################################################## +# Start of Jmakefile + +# Those extra flags are expected to be user-defined +CFLAGS = -I$(TOP) -I.. $(GLIB_CFLAGS) -DCURDIR=$(CURRENT) +DPFLAGS = $(CFLAGS) + +local_depend:: ../../mkdep + +../../mkdep: + @echo "You have to run Configure in $(TOP) first."; exit 1 + +depend:: local_depend +local_depend:: + ($(SED) '/^# DO NOT DELETE/q' Makefile && \ + $(MKDEP) $(SOURCES) | \ + $(SED) -e 's:/usr/lib^ *::g; s:$(USRINC)^ *::g; ' \ + -e '/: / b print' -e '$$ b print' -e 'H; d; n; : print' \ + -e 'x; s/\\$$//; s/\\\n//g; s/ */ /g; s/ :/:/;' -e '/: *$$/d' \ + ) > Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) Makefile.new + +LDFLAGS = +LIBS = -L../lib -lshared $(GLIB_LDFLAGS) $(COMMON_LIBS) + +.FORCE: + +../lib/libshared.a: .FORCE + @echo "Checking "libshared.a" in "../lib"..." + cd ../lib; $(MAKE) libshared.a + @echo "Continuing in $(CURRENT)..." + +sha1sum: ../lib/libshared.a + +all:: sha1sum + +local_realclean:: + $(RM) sha1sum$(_EXE) + +sha1sum: sha1sum.o + -$(RM) $@$(_EXE) + if test -f $@$(_EXE); then \ + $(MV) $@$(_EXE) $@~$(_EXE); fi + $(CC) -o $@$(_EXE) sha1sum.o $(JLDFLAGS) $(LIBS) + +######################################################################## +# Common rules for all Makefiles -- do not edit + +all:: + +clean: local_clean +realclean: local_realclean +clobber: local_clobber + +local_clean:: + if test -f core; then $(RM) core; fi + $(RM) *~ *.o + +local_realclean:: local_clean + +local_clobber:: local_realclean + $(RM) Makefile config.sh + +install:: local_install + @exit 0 + +install-strip:: local_install-strip + @exit 0 + +install.man:: maybe_install.man +deinstall:: local_deinstall +deinstall.man:: maybe_deinstall.man + +install.man-no: +deinstall.man-no: + +maybe_install.man: install.man-no +maybe_deinstall.man: deinstall.man-no + +Makefile.SH: Jmakefile + -@if test -f $(TOP)/.package; then \ + if test -f Makefile.SH; then \ + echo " $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~"; \ + $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~; \ + fi; \ + echo " $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT)" ; \ + $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT) ; \ + else touch $@; fi + +Makefile: Makefile.SH + /bin/sh Makefile.SH + +tags:: + $(CTAGS) -w *.ch + $(CTAGS) -xw *.ch > tags + +local_clobber:: + $(RM) tags + +depend:: + +######################################################################## +# Empty rules for directories with no sub-directories -- do not edit + +local_install:: + @echo "install in $(CURRENT) done." + +local_install-strip:: + @echo "install (strip) in $(CURRENT) done." + +local_deinstall:: + @echo "deinstall in $(CURRENT) done." + +local_install.man:: + @echo "install.man in $(CURRENT) done." + +local_deinstall.man:: + @echo "deinstall.man in $(CURRENT) done." + +Makefiles:: + +Makefiles.SH:: + +######################################################################## +# Dependencies generated by make depend +# DO NOT DELETE THIS LINE -- make depend relies on it + +# Put nothing here or make depend will gobble it up +.FORCE_DEPEND:: + @echo "You must run 'make depend' in $(TOP) first."; exit 1 +!NO!SUBS! +chmod 644 Makefile +$eunicefix Makefile +
View file
gtk-gnutella-1.1.9.tar.bz2/src/bin/sha1sum.c
Added
@@ -0,0 +1,107 @@ +/* + * sha1sum -- computes the SHA1 of a single file. + * + * Copyright (c) 2013 Raphael Manfredi <Raphael_Manfredi@pobox.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the authors nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "common.h" + +#include "lib/base16.h" +#include "lib/file.h" +#include "lib/log.h" +#include "lib/misc.h" +#include "lib/path.h" +#include "lib/progname.h" +#include "lib/sha1.h" + +#include "lib/override.h" + +static void G_NORETURN +usage(void) +{ + fprintf(stderr, + "Usage: %s -h filename\n" + " -h : prints this help message\n" + , getprogname()); + exit(EXIT_FAILURE); +} + +int +main(int argc, char **argv) +{ + int c; + int fd; + SHA1_context ctx; + struct sha1 digest; + bool done; + /* getopt() variables: */ + extern int optind; + + progstart(argc, argv); + + while ((c = getopt(argc, argv, "h")) != EOF) { + switch (c) { + case 'h': /* show help */ + default: + usage(); + break; + } + } + + if ((argc -= optind) != 1) + usage(); + + argv += optind; + + fd = file_open(argv0, O_RDONLY, 0); + if (-1 == fd) + exit(EXIT_FAILURE); + + SHA1_reset(&ctx); + + for (done = FALSE; !done; /* empty */) { + static char buf128 * 1024; + int r; + + r = read(fd, buf, sizeof buf); + + if (-1 == r) + s_fatal_exit(EXIT_FAILURE, "read() error: %m"); + + done = r != sizeof buf; + SHA1_input(&ctx, buf, r); + } + + SHA1_result(&ctx, &digest); + close(fd); + + printf("%s\n", sha1_base16(&digest)); + return 0; +} +
View file
gtk-gnutella-0.98.2.tar.bz2/src/casts.h -> gtk-gnutella-1.1.9.tar.bz2/src/casts.h
Changed
@@ -24,7 +24,7 @@ /** * @file * - * Functions for safer casting. + * Functions for safer casting. * * @author Christian Biere * @date 2006 @@ -35,116 +35,181 @@ /* @note This file is only for inclusion by common.h. */ -/** - * Cast a ``const gchar *'' to ``gchar *''. This allows the compiler to +/* + * Cast a ``const type *'' to ``type *''. This allows the compiler to * print a diagnostic message if you accidently try to deconstify an * incompatible type. A direct typecast would hide such a mistake. */ -static inline G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE gboolean * + +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE gboolean * deconstify_gboolean(const gboolean *p) { return (gboolean *) p; } -static inline G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE char * +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE bool * +deconstify_bool(const bool *p) +{ + return (bool *) p; +} + +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE char * deconstify_gchar(const char *p) { return (char *) p; } -static inline G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE char * +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE char * deconstify_char(const char *p) { return (char *) p; } -static inline G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE guint32 * -deconstify_guint32(const guint32 *p) +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE uint32 * +deconstify_uint32(const uint32 *p) { - return (guint32 *) p; + return (uint32 *) p; } -static inline G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * deconstify_gpointer(const void *p) { return (void *) p; } -static inline G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE const void * +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * +deconstify_pointer(const void *p) +{ + return (void *) p; +} + +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE const void * cast_to_gconstpointer(const void *p) { - return p; + return p; +} + +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE const void * +cast_to_constpointer(const void *p) +{ + return p; } -static inline G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * cast_to_gpointer(void *p) { return p; } -static inline G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE char * +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * +cast_to_pointer(void *p) +{ + return p; +} + +#ifndef __cplusplus +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE char * cast_to_gchar_ptr(void *p) { return p; } +#endif /* !C++ */ -static inline G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * cast_to_void_ptr(void *p) { return p; } -static inline G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE char * +#ifndef __cplusplus +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE char * cast_to_char_ptr(void *p) { return p; } -static inline G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE unsigned char * +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE unsigned char * cast_to_guchar_ptr(void *p) { return p; } +#endif /* !C++ */ -static inline G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * ulong_to_pointer(unsigned long value) { return (void *) value; } -static inline G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE unsigned long +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * +long_to_pointer(long value) +{ + return (void *) value; +} + +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * +size_to_pointer(size_t value) +{ + return (void *) value; +} + +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE unsigned long pointer_to_ulong(const void *p) { return (unsigned long) p; } -static inline G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE long +pointer_to_long(const void *p) +{ + return (long) p; +} + +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE size_t +pointer_to_size(const void *p) +{ + return (size_t) p; +} + +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * uint_to_pointer(unsigned value) { return ulong_to_pointer(value); } -static inline G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE unsigned +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE unsigned pointer_to_uint(const void *p) { return pointer_to_ulong(p); } -static inline G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * int_to_pointer(int value) { return uint_to_pointer(value); } -static inline G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE int +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE int pointer_to_int(const void *p) { return pointer_to_uint(p); } +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * +bool_to_pointer(bool value) +{ + return ulong_to_pointer(value); +} + +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE bool +pointer_to_bool(const void *p) +{ + return p != NULL; +} + typedef void (*func_ptr_t)(); -static inline G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE func_ptr_t +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE func_ptr_t cast_pointer_to_func(const void *p) { union { @@ -155,7 +220,7 @@ return tmp.func; } -static inline G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * cast_func_to_pointer(func_ptr_t func) { union { @@ -166,6 +231,12 @@ return tmp.ptr; } +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE free_fn_t +cast_to_free_fn(const func_ptr_t fn) +{ + return (free_fn_t) fn; +} + /** * Casting of a random function pointer to "void *" is cumbersome if * you want to spell it out in a pedantic-safe way. That's where the @@ -173,34 +244,44 @@ */ #define func_to_pointer(x) cast_func_to_pointer((func_ptr_t) (x)) -static inline size_t G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE +static inline size_t G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE ptr_diff(const void *a, const void *b) { return (const char *) a - (const char *) b; } -static inline void * G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE +static inline void * G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE ptr_add_offset(void *p, size_t offset) { /* Using size_t instead of 'char *' because pointers don't wrap. */ return (void *) ((size_t) p + offset); } -static inline const void * G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE +static inline const void * G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE const_ptr_add_offset(const void *p, size_t offset) { /* Using size_t instead of 'char *' because pointers don't wrap. */ return (const void *) ((size_t) p + offset); } +/* + * Deconstify resulting pointer. + */ +static inline void * G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE +ptr_add_offset_const(const void *p, size_t offset) +{ + /* Using size_t instead of 'char *' because pointers don't wrap. */ + return (void *) ((size_t) p + offset); +} + + /** * Compare two generic pointers. */ -static inline int G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE +static inline int G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE ptr_cmp(const void *a, const void *b) { - return a == b ? 0 : - (const char *) a < (const char *) b ? -1 : +1; + return CMP((const char *) a, (const char *) b); } /** @@ -208,7 +289,7 @@ * * @return On failure (fileoffset_t) -1 is returned. */ -static inline fileoffset_t G_GNUC_CONST WARN_UNUSED_RESULT ALWAYS_INLINE +static inline fileoffset_t G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE filesize_to_fileoffset_t(filesize_t pos) { fileoffset_t offset = pos > OFF_T_MAX ? @@ -224,20 +305,24 @@ } /** - * Implicit promotion to an unsigned integer. It allows to avoid comparision of - * signed values with unsigned values without resorting to harmful explicit - * casts. + * Implicit promotion to an unsigned integer. It allows one to avoid + * comparision of signed values with unsigned values without resorting + * to harmful explicit casts. */ #if defined(UINTMAX_C) #define UNSIGNED(value) ((value) + (UINTMAX_C(0))) #elif defined(UINTMAX_MAX) #define UNSIGNED(value) ((value) + (UINTMAX_MAX - UINTMAX_MAX)) #else -#define UNSIGNED(value) ((value) + ((guint64)0U)) +#define UNSIGNED(value) ((value) + ((uint64)0U)) #endif /* UINTMAX_C */ /* Normalize boolean-like values to TRUE(1) or FALSE(0) */ -#define booleanize(x) ((x) ? 1 : 0) +#define booleanize(x) (0 != (x)) + +/* Common logic operations missing an operator in C */ +#define implies(p, q) (!(p) || (q)) +#define equiv(p, q) (!(p) == !(q)) #endif /* _casts_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/common.h -> gtk-gnutella-1.1.9.tar.bz2/src/common.h
Changed
@@ -36,6 +36,31 @@ #include "config.h" +/** + * Undefining this symbol will cause gkt-gnutella to avoid using uninitialized + * values on the stack to collect initial entropy for random number seeds, + * and will prevent errors about "uninitialized value usage" when running under + * valgrind. + * + * By default, this symbol is defined because reading the uninitialized bytes + * results in undefined behaviour that precisely adds uncertainety, aka entropy. + */ +#if 1 +#define ALLOW_UNINIT_VALUES +#endif + +#ifdef MINGW32 +/* + * Must set WINVER before including ANY include on recent MinGW installations + * because otherwise <sdkddkver.h> is going to redefine the values improperly. + * We want to state Windows XP support and set WINVER, deriving _WIN32_WINNT + * from that value. + */ +#ifndef WINVER +#define WINVER 0x0501 /* Windows XP */ +#endif +#endif + /* * Main includes */ @@ -131,8 +156,6 @@ #include <dirent.h> #endif -#include <setjmp.h> - #ifdef I_TIME #include <time.h> #endif @@ -171,6 +194,30 @@ #endif /* + * Endianness, as determined by Configure. + */ + +#if BYTEORDER == 0x1234 +#define IS_LITTLE_ENDIAN 1 +#define IS_BIG_ENDIAN 0 +#elif BYTEORDER == 0x4321 +#define IS_BIG_ENDIAN 1 +#define IS_LITTLE_ENDIAN 0 +#else +#error "unknown endianness" +#endif + +#if IEEE754_BYTEORDER == 0x1234 +#define IS_LITTLE_ENDIAN_FLOAT 1 +#define IS_BIG_ENDIAN_FLOAT 0 +#elif IEEE754_BYTEORDER == 0x4321 +#define IS_BIG_ENDIAN_FLOAT 1 +#define IS_LITTLE_ENDIAN_FLOAT 0 +#else +#error "float must use IEEE 754." +#endif + +/* * Determine how large an I/O vector the kernel can accept. */ @@ -187,6 +234,23 @@ #endif /* + * These macros determine the maximum/minimum value of the given integer type + * "t". This works for signed as well as unsigned types. This code does + * carefully avoid integer overflows and undefined behaviour. + * However, it's assumed the type consists of exactly sizeof(type) * CHAR_BIT + * bits. + */ + +#define MAX_INT_VAL_STEP(t) \ + ((t) 1 << (CHAR_BIT * sizeof(t) - 1 - ((t) -1 < 1))) + +#define MAX_INT_VAL(t) \ + ((MAX_INT_VAL_STEP(t) - 1) + MAX_INT_VAL_STEP(t)) + +#define MIN_INT_VAL(t) \ + ((t) -MAX_INT_VAL(t) - 1) + +/* * For pedantic lint checks, define USE_LINT. We override some definitions * and hide ``inline'' to prevent certain useless warnings. */ @@ -196,13 +260,7 @@ #endif #include <glib.h> - -#ifdef USE_LINT -#undef G_GNUC_INTERNAL -#define G_GNUC_INTERNAL -#undef G_INLINE_FUNC -#define G_INLINE_FUNC -#endif +#include "types.h" #if defined(USE_GLIB1) && !defined(GLIB_MAJOR_VERSION) #error "Install GLib 1.2 to compile gtk-gnutella against GLib 1.2." @@ -212,10 +270,14 @@ #error "Install GLib 2.x to compile gtk-gnutella against GLib 2.x." #endif -typedef guint64 filesize_t; /**< Use filesize_t to hold filesizes */ +typedef uint64 filesize_t; /**< Use filesize_t to hold filesizes */ +#ifdef HAS_SCHED_YIELD +#define do_sched_yield() sched_yield() /* See lib/mingw32.h */ +#endif + +#include "gcc.h" /* Must precede inclusion of mingw32.h */ #include "lib/mingw32.h" -#include "lib/exit.h" /* Transparent exit() trapping */ #ifndef MINGW32 @@ -251,6 +313,13 @@ iov->iov_len = len; } +static inline void +iovec_set(struct iovec *iov, const void *base, size_t len) +{ + iov->iov_base = (void *) base; + iov->iov_len = len; +} + /* FIXME: Get rid of these: */ typedef int socket_fd_t; #define INVALID_SOCKET (-1) @@ -292,20 +361,26 @@ #include "lib/regex.h" #endif /* HAS_REGCOMP */ -#ifdef USE_GLIB1 -typedef void (*GCallback) (void); +#ifdef USE_GLIB2 +#undef G_STRLOC /* Want our version */ +#undef G_STRFUNC /* Version from glib uses __PRETTY_FUNCTION__ */ +#endif /* USE_GLIB2 */ + +/* + * G_STRLOC is the current source location (file:line). + * G_STRFUNC is the name of the current function, or location if unavailable. + */ + #define G_STRLOC __FILE__ ":" STRINGIFY(__LINE__) #if defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 19901L) #define G_STRFUNC (__func__) #elif defined(__GNUC__) -#define G_STRFUNC (__PRETTY_FUNCTION__) +#define G_STRFUNC (__FUNCTION__) #else #define G_STRFUNC (G_STRLOC) #endif -#endif /* USE_GLIB1 */ - #ifdef USE_GLIB2 #include <glib-object.h> #endif /* USE_GLIB2 */ @@ -313,9 +388,7 @@ /* * Array size determination */ -#ifndef G_N_ELEMENTS -#define G_N_ELEMENTS(arr) (sizeof (arr) / sizeof ((arr)0)) -#endif +#define N_ITEMS(arr) (sizeof (arr) / sizeof ((arr)0)) /* * Portability macros. @@ -347,6 +420,13 @@ #define VA_COPY(dest, src) (dest) = (src) #endif +/** + * @returns the offset of the given field F within the given type T, in bytes. + */ +#ifndef offsetof +#define offsetof(T, F) ((unsigned) ((char *) &((T *)0L)->F - (char *) 0L)) +#endif + /* * Standard file descriptor numbers */ @@ -377,23 +457,6 @@ #define lstat(_p,_b) stat((_p),(_b)) #endif -/* - * These macros determine the maximum/minimum value of the given integer type - * "t". This works for signed as well as unsigned types. This code does - * carefully avoid integer overflows and undefined behaviour. - * However, it's assumed the type consists of exactly sizeof(type) * CHAR_BIT - * bits. - */ - -#define MAX_INT_VAL_STEP(t) \ - ((t) 1 << (CHAR_BIT * sizeof(t) - 1 - ((t) -1 < 1))) - -#define MAX_INT_VAL(t) \ - ((MAX_INT_VAL_STEP(t) - 1) + MAX_INT_VAL_STEP(t)) - -#define MIN_INT_VAL(t) \ - ((t) -MAX_INT_VAL(t) - 1) - #ifndef TIME_T_MAX /* This assumes time_t is an integer, not a float */ #define TIME_T_MAX MAX_INT_VAL(time_t) @@ -411,6 +474,14 @@ #define SSIZE_MAX MAX_INT_VAL(ssize_t) #endif +#ifndef POINTER_MAX +#ifdef UINTPTR_MAX +#define POINTER_MAX ((void *) UINTPTR_MAX) +#else +#define POINTER_MAX ((void *) MAX_INT_VAL(size_t)) +#endif +#endif + /* * Other common macros. */ @@ -439,188 +510,13 @@ PACKAGE_SOURCE_DIR G_DIR_SEPARATOR_S "extra_files" #endif -#if defined(__GNUC__) && defined(__GNUC_MINOR__) - /** - * HAS_GCC allows conditionalization depending on the version of gcc - * being used to compile the source. + * CMP() returns the sign of a-b, that means <0, 0, or >0. * - * Check each version at "http://gcc.gnu.org/onlinedocs/" for - * support. Specific functionality may also be broken in some - * compiler revisions, so it is useful to conditionalize on the - * version. - */ -#define HAS_GCC(major, minor) \ - ((__GNUC__ > (major)) || \ - (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))) -#else -#define HAS_GCC(major, minor) 0 -#endif - -/* - * If functions have this attribute GCC warns if it one of the specified - * parameters is NULL. This macro takes a list of parameter indices. The - * list must be embraced with parentheses for compatibility with C89 - * compilers. Example: - * - * void my_memcpy(void *dst, const void *src, size_t n) NON_NULL_PARAM((1, 2)); - */ -#if defined(HASATTRIBUTE) && HAS_GCC(3, 3) -#define NON_NULL_PARAM(x) __attribute__((__nonnull__ x)) -#else /* GCC < 3.3 */ -#define NON_NULL_PARAM(x) -#endif - -/** - * This is the same G_GNUC_FORMAT() but for function pointers. Older versions - * of GCC do not allow function attributes for function pointers. - */ -#if defined(HASATTRIBUTE) && HAS_GCC(3, 0) -#define PRINTF_FUNC_PTR(x, y) __attribute__((format(__printf__, (x), (y)))) -#else /* GCC < 3.0 */ -#define PRINTF_FUNC_PTR(x, y) -#endif - -/* - * Functions using this attribute cause a warning if the returned - * value is not used. - */ -#if defined(HASATTRIBUTE) && HAS_GCC(3, 4) -#define WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) -#else /* GCC < 3.4 */ -#define WARN_UNUSED_RESULT -#endif - -/* - * Instructs the compiler to emit code for this function even if it is - * or seems to be unused. - */ -#if defined(HASATTRIBUTE) && HAS_GCC(3, 1) -#define KEEP_FUNCTION __attribute__((__used__)) -#else /* GCC < 3.1 || !GCC */ -#define KEEP_FUNCTION -#endif - -/* - * The antidote for WARN_UNUSED_RESULT. This attribute is sometimes - * misused for functions that return a result which SHOULD NOT be - * ignored in contrast to MUST NOT. Unfortunately, a simple "(void)" - * does not suppress this warning. - */ -#define IGNORE_RESULT(x) \ - G_STMT_START { switch (0 != (x)) { default: ; } } G_STMT_END - -/* - * Functions using this attribute cause a warning if the variable - * argument list does not contain a NULL pointer. - */ -#ifndef G_GNUC_NULL_TERMINATED -#if defined(HASATTRIBUTE) && HAS_GCC(4, 0) -#define G_GNUC_NULL_TERMINATED __attribute__((__sentinel__)) -#else /* GCC < 4 */ -#define G_GNUC_NULL_TERMINATED -#endif /* GCC >= 4 */ -#endif /* G_GNUC_NULL_TERMINATED */ - -/* - * Define G_LIKELY() and G_UNLIKELY() so that they are available when - * using GLib 1.2 as well. These allow optimization by static branch - * prediction with GCC. - */ -#ifndef G_LIKELY -#if HAS_GCC(3, 4) /* Just a guess, a Configure check would be better */ -#define G_LIKELY(x) (__builtin_expect(x, 1)) -#define G_UNLIKELY(x) (__builtin_expect(x, 0)) -#else /* !GCC >= 3.4 */ -#define G_LIKELY(x) (x) -#define G_UNLIKELY(x) (x) -#endif /* GCC >= 3.4 */ -#endif /* !G_LIKELY */ - -/** - * A pure function has no effects except its return value and the return value - * depends only on the parameters and/or global variables. - */ -#ifndef G_GNUC_PURE -#if defined(HASATTRIBUTE) && HAS_GCC(2, 96) -#define G_GNUC_PURE __attribute__((__pure__)) -#else -#define G_GNUC_PURE -#endif /* GCC >= 2.96 */ -#endif /* G_GNUC_PURE */ - -#ifndef G_GNUC_MALLOC -#if defined(HASATTRIBUTE) && HAS_GCC(3, 0) -#define G_GNUC_MALLOC __attribute__((__malloc__)) -#else -#define G_GNUC_MALLOC -#endif /* GCC >= 3.0 */ -#endif /* G_GNUC_MALLOC */ - -/** - * A hot function is optimized more aggressively. + * This version avoids branches, which should be faster on all types of CPUs. + * --RAM, 2015-04-15 */ -#ifndef G_GNUC_HOT -#if defined(HASATTRIBUTE) && HAS_GCC(4, 3) -#define G_GNUC_HOT __attribute__((hot)) -#else -#define G_GNUC_HOT -#endif /* GCC >= 4.3 */ -#endif /* G_GNUC_HOT */ - -/** - * A cold function is unlikely executed, and is optimized for size rather - * than speed. All branch tests leading to it are marked "unlikely". - */ -#ifndef G_GNUC_COLD -#if defined(HASATTRIBUTE) && HAS_GCC(4, 3) -#define G_GNUC_COLD __attribute__((cold)) -#else -#define G_GNUC_COLD -#endif /* GCC >= 4.3 */ -#endif /* G_GNUC_COLD */ - -#if defined(HASATTRIBUTE) && HAS_GCC(3, 1) -#define ALWAYS_INLINE __attribute__((always_inline)) -#else -#define ALWAYS_INLINE -#endif /* GCC >= 3.1 */ - -#if defined(HASATTRIBUTE) && HAS_GCC(3, 1) -#define NO_INLINE __attribute__((noinline)) -#else -#define NO_INLINE -#endif /* GCC >= 3.1 */ - -#if defined(HASATTRIBUTE) && defined(HAS_REGPARM) -#define REGPARM(n) __attribute__((__regparm__((n)))) -#else -#define REGPARM(n) -#endif /* HAS_REGPARM */ - -/* - * Redefine G_GNUC_PRINTF to use "GNU printf" argument form (gcc >= 4.4). - * This ensures that "%m" is recognized as valid since the GNU libc supports it. - */ -#if defined(HASATTRIBUTE) && HAS_GCC(4, 4) -#undef G_GNUC_PRINTF -#define G_GNUC_PRINTF(_fmt_, _arg_) \ - __attribute__((__format__ (__gnu_printf__, _fmt_, _arg_))) -#endif - -/** - * IS_CONSTANT() returns TRUE if the expression is a compile-time constant. - */ -#if HAS_GCC(3, 0) -#define IS_CONSTANT(x) __builtin_constant_p(x) -#else -#define IS_CONSTANT(x) FALSE -#endif - -/** - * CMP() returns the sign of a-b, that means -1, 0, or 1. - */ -#define CMP(a, b) (G_UNLIKELY((a) == (b)) ? 0 : (a) > (b) ? 1 : (-1)) +#define CMP(a, b) (((a) > (b)) - ((a) < (b))) /** * SIGN() returns the sign of an integer value. @@ -628,28 +524,18 @@ #define SIGN(x) (G_UNLIKELY((x) == 0) ? 0 : (x) > 0 ? 1 : (-1)) /** - * GUINT32_SWAP_CONSTANT() byte-swaps a 32-bit word, preferrably a constant. - * If the value is a variable, use GUINT32_SWAP(). - */ -#define GUINT32_SWAP_CONSTANT(x_) ((guint32) ( \ - (((guint32) (x_) & (guint32) 0x000000ffU) << 24) | \ - (((guint32) (x_) & (guint32) 0x0000ff00U) << 8) | \ - (((guint32) (x_) & (guint32) 0x00ff0000U) >> 8) | \ - (((guint32) (x_) & (guint32) 0xff000000U) >> 24))) - -/** - * GUINT32_SWAP() byte-swaps a 32-bit word. - * - * Avoid using glib's GUINT32_SWAP_LE_BE(): it triggers compile-time - * warnings on a wrong __asm__ statement with glib 1.2. This version - * should be as efficient as the one defined by glib. - */ -#if HAS_GCC(4, 0) -#define GUINT32_SWAP(x_) \ - (IS_CONSTANT(x_) ? GUINT32_SWAP_CONSTANT(x_) : __builtin_bswap32(x_)) -#else -#define GUINT32_SWAP(x_) GUINT32_SWAP_CONSTANT(x_) -#endif + * Byte-wise swap two items of specified size. + */ +#define SWAP(a, b, size) G_STMT_START { \ + register size_t __size = (size); \ + register char *__a = (a), *__b = (b); \ + \ + do { \ + char __tmp = *__a; \ + *__a++ = *__b; \ + *__b++ = __tmp; \ + } while (--__size > 0); \ +} G_STMT_END /** * STATIC_ASSERT() can be used to verify conditions at compile-time. For @@ -697,6 +583,18 @@ #define MAX_PATH_LEN 2048 #endif +/** + * A NULL pointer, to make sure it is sized as a pointer and not as an integer. + * + * This should be used as sentinel at the tail of variable argument lists + * that expect a NULL pointer to terminate the list, and not integer 0. + * + * Depending on how variable argument lists are handled, this can prevent + * bugs on 64-bit machines with 32-bit integers. + * --RAM, 2015-10-22 + */ +#define NULL_PTR ((void *) 0) + /* * Forbidden glib calls. */ @@ -736,12 +634,8 @@ # define Q_(String) g_strip_context ((String), (String)) #endif /* ENABLE_NLS */ -static inline const gchar * -ngettext_(const gchar *msg1, const gchar *msg2, gulong n) -G_GNUC_FORMAT(1) G_GNUC_FORMAT(2); - -static inline const gchar * -ngettext_(const gchar *msg1, const gchar *msg2, gulong n) +static inline const char * G_FORMAT(1) G_FORMAT(2) +ngettext_(const char *msg1, const char *msg2, ulong n) { return ngettext(msg1, msg2, n); } @@ -756,18 +650,74 @@ * in big endian byte order. */ #define FOURCC_NATIVE(a,b,c,d) ( \ - ((guint32) (unsigned char) ((a) & 0xffU) << 24) | \ - ((guint32) (unsigned char) ((b) & 0xffU) << 16) | \ - ((guint32) (unsigned char) ((c) & 0xffU) << 8) | \ - ((guint32) (unsigned char) ((d) & 0xffU))) + ((uint32) (uchar) ((a) & 0xffU) << 24) | \ + ((uint32) (uchar) ((b) & 0xffU) << 16) | \ + ((uint32) (uchar) ((c) & 0xffU) << 8) | \ + ((uint32) (uchar) ((d) & 0xffU))) /** * Zero memory used by structure pointed at. */ #define ZERO(x) memset((x), 0, sizeof *(x)) +/** + * Generate argument list for the address of `x' and its size, so that we can + * process the content of that variable. + * + * The aim is to prevent typos and make sure the two arguments are in sync. + */ +#define VARLEN(x) &(x), sizeof(x) + +/** + * Generate argument list for the address pointed at by `x' and its size, so + * that we can process the structure content, pointed at by that variable. + * + * The aim is to prevent typos and make sure the two arguments are in sync. + */ +#define PTRLEN(x) (x), sizeof *(x) + +/* + * Support for alloca(). + */ + +#if HAS_GCC(3, 0) +#ifndef alloca +#define alloca(size) __builtin_alloca(size) +#endif +#else /* !HAS_GCC(3, 0) */ +#ifdef I_ALLOCA +#include <alloca.h> +#endif +#ifndef alloca +#define EMULATE_ALLOCA +#include "lib/alloca.h" +#endif /* alloca */ +#endif /* HAS_GCC(3, 0) */ + +/** + * Let the program use sigprocmask() but remap it to pthread_sigmask() + * to ensure that we manipulate the thread's signal mask only. + * + * On linux, sigprocmask() always manipulates the thread's signal mask, but + * this is not guaranteed by POSIX. + * + * On Windows, we are implementing our own sigprocmask() which will correctly + * manipulate the thread's signal mask. + */ +#ifdef MINGW32 +#define sigprocmask(h,s,o) mingw_sigprocmask((h), (s), (o)) +#elif defined(HAS_SIGPROCMASK) && defined(I_PTHREAD) +#define sigprocmask(h,s,o) pthread_sigmask((h), (s), (o)) +#endif + +/* + * Common inclusions, likely to be needed by most files. + */ + #include "casts.h" +#include "lib/compat_setjmp.h" #include "lib/fast_assert.h" +#include "lib/exit.h" /* Transparent exit() trapping */ #include "lib/glog.h" #endif /* _common_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/Jmakefile -> gtk-gnutella-1.1.9.tar.bz2/src/core/Jmakefile
Changed
@@ -1,6 +1,4 @@ /* - * $Id$ - * * Copyright (c) 2003, Raphael Manfredi * * Jmakefile for the core part. @@ -25,14 +23,14 @@ *---------------------------------------------------------------------- */ -;# $Id$ +SetSubdirs(g2) +DependSubdirs() SRC = \ alive.c \ ban.c \ bh_download.c \ bh_upload.c \ - bitzi.c \ bogons.c \ bsched.c \ clock.c \ @@ -45,9 +43,15 @@ dump.c \ extensions.c \ features.c \ - file_object.c \ fileinfo.c \ gdht.c \ + gen-dmesh_url.c \ + gen-gnr_stats.c \ + gen-http_async.c \ + gen-http_url.c \ + gen-ignore.c \ + gen-msg.c \ + gen-msg_drop.c \ geo_ip.c \ ggep.c \ ggep_type.c \ @@ -90,6 +94,7 @@ rx_chunk.c \ rx_inflate.c \ rx_link.c \ + rx_ut.c \ rxbuf.c \ search.c \ settings.c \ @@ -111,7 +116,9 @@ tx_deflate.c \ tx_dgram.c \ tx_link.c \ + tx_ut.c \ udp.c \ + udp_sched.c \ uhc.c \ upload_stats.c \ uploads.c \ @@ -138,13 +145,24 @@ /* Add the Socker flags */ ++SOCKER_CFLAGS $sockercflags +IF = ../if +GNET_PROPS = gnet_property.h + ;# Those extra flags are expected to be user-defined -CFLAGS = -I$(TOP) -I.. $(GLIB_CFLAGS) $(GNUTLS_CFLAGS) \ +CFLAGS = -I$(TOP) -I.. -I$(IF)/gen $(GLIB_CFLAGS) $(GNUTLS_CFLAGS) \ $(SOCKER_CFLAGS) -DCORE_SOURCES -DCURDIR=$(CURRENT) DPFLAGS = $(CFLAGS) -IF = ../if -GNET_PROPS = gnet_property.h +#define LinkGenInterface(file) @!\ +LinkSourceFileAlias(file, $(IF)/gen, gen-file) + +LinkGenInterface(dmesh_url.c) +LinkGenInterface(gnr_stats.c) +LinkGenInterface(http_async.c) +LinkGenInterface(http_url.c) +LinkGenInterface(ignore.c) +LinkGenInterface(msg.c) +LinkGenInterface(msg_drop.c) RemoteTargetDependency(libcore.a, $(IF), $(GNET_PROPS)) NormalLibraryTarget(core, $(SRC), $(OBJ))
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/src/core/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-96 -: $X-Id: Jmake.tmpl 69 2011-01-09 13:57:07Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -39,8 +39,9 @@ AR = ar rc CC = $cc CTAGS = ctags -JCFLAGS = \$(CFLAGS) $optimize $ccflags $large +JCFLAGS = \$(CFLAGS) $optimize $pthread $ccflags $large JCPPFLAGS = $cppflags +LN = $ln MKDEP = $mkdep \$(DPFLAGS) \$(JCPPFLAGS) -- MV = $mv RANLIB = $ranlib @@ -50,6 +51,7 @@ ######################################################################## # Automatically generated parameters -- do not edit +SUBDIRS = g2 USRINC = $usrinc SOURCES = \$(SRC) OBJECTS = \$(OBJ) @@ -68,7 +70,7 @@ $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 94 2011-02-10 14:06:58Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Force 'make depend' to be performed first -- do not edit @@ -80,14 +82,21 @@ ######################################################################## # Start of Jmakefile -# $X-Id$ +depend:: sub_depend + +sub_depend:: + @case '${MFLAGS}' in *ik*) set +e;; esac; \ + for i in $(SUBDIRS) ;\ + do \ + (cd $$i ; echo "Depending" "in $(DIR)$$i..."; \ + $(MAKE) $(MFLAGS) depend) || exit 1; \ + done SRC = \ alive.c \ ban.c \ bh_download.c \ bh_upload.c \ - bitzi.c \ bogons.c \ bsched.c \ clock.c \ @@ -100,9 +109,15 @@ dump.c \ extensions.c \ features.c \ - file_object.c \ fileinfo.c \ gdht.c \ + gen-dmesh_url.c \ + gen-gnr_stats.c \ + gen-http_async.c \ + gen-http_url.c \ + gen-ignore.c \ + gen-msg.c \ + gen-msg_drop.c \ geo_ip.c \ ggep.c \ ggep_type.c \ @@ -145,6 +160,7 @@ rx_chunk.c \ rx_inflate.c \ rx_link.c \ + rx_ut.c \ rxbuf.c \ search.c \ settings.c \ @@ -166,7 +182,9 @@ tx_deflate.c \ tx_dgram.c \ tx_link.c \ + tx_ut.c \ udp.c \ + udp_sched.c \ uhc.c \ upload_stats.c \ uploads.c \ @@ -183,7 +201,6 @@ ban.o \ bh_download.o \ bh_upload.o \ - bitzi.o \ bogons.o \ bsched.o \ clock.o \ @@ -196,9 +213,15 @@ dump.o \ extensions.o \ features.o \ - file_object.o \ fileinfo.o \ gdht.o \ + gen-dmesh_url.o \ + gen-gnr_stats.o \ + gen-http_async.o \ + gen-http_url.o \ + gen-ignore.o \ + gen-msg.o \ + gen-msg_drop.o \ geo_ip.o \ ggep.o \ ggep_type.o \ @@ -241,6 +264,7 @@ rx_chunk.o \ rx_inflate.o \ rx_link.o \ + rx_ut.o \ rxbuf.o \ search.o \ settings.o \ @@ -262,7 +286,9 @@ tx_deflate.o \ tx_dgram.o \ tx_link.o \ + tx_ut.o \ udp.o \ + udp_sched.o \ uhc.o \ upload_stats.o \ uploads.o \ @@ -274,13 +300,76 @@ vmsg.o \ whitelist.o +IF = ../if +GNET_PROPS = gnet_property.h + # Those extra flags are expected to be user-defined -CFLAGS = -I$(TOP) -I.. $(GLIB_CFLAGS) $(GNUTLS_CFLAGS) \ +CFLAGS = -I$(TOP) -I.. -I$(IF)/gen $(GLIB_CFLAGS) $(GNUTLS_CFLAGS) \ $(SOCKER_CFLAGS) -DCORE_SOURCES -DCURDIR=$(CURRENT) DPFLAGS = $(CFLAGS) -IF = ../if -GNET_PROPS = gnet_property.h +gen-dmesh_url.c: $(IF)/gen/dmesh_url.c + $(RM) -f $@ + $(LN) $? $@ + +local_depend:: gen-dmesh_url.c + +local_realclean:: + $(RM) -f gen-dmesh_url.c + +gen-gnr_stats.c: $(IF)/gen/gnr_stats.c + $(RM) -f $@ + $(LN) $? $@ + +local_depend:: gen-gnr_stats.c + +local_realclean:: + $(RM) -f gen-gnr_stats.c + +gen-http_async.c: $(IF)/gen/http_async.c + $(RM) -f $@ + $(LN) $? $@ + +local_depend:: gen-http_async.c + +local_realclean:: + $(RM) -f gen-http_async.c + +gen-http_url.c: $(IF)/gen/http_url.c + $(RM) -f $@ + $(LN) $? $@ + +local_depend:: gen-http_url.c + +local_realclean:: + $(RM) -f gen-http_url.c + +gen-ignore.c: $(IF)/gen/ignore.c + $(RM) -f $@ + $(LN) $? $@ + +local_depend:: gen-ignore.c + +local_realclean:: + $(RM) -f gen-ignore.c + +gen-msg.c: $(IF)/gen/msg.c + $(RM) -f $@ + $(LN) $? $@ + +local_depend:: gen-msg.c + +local_realclean:: + $(RM) -f gen-msg.c + +gen-msg_drop.c: $(IF)/gen/msg_drop.c + $(RM) -f $@ + $(LN) $? $@ + +local_depend:: gen-msg_drop.c + +local_realclean:: + $(RM) -f gen-msg_drop.c .FORCE: @@ -323,9 +412,9 @@ all:: -clean: local_clean -realclean: local_realclean -clobber: local_clobber +clean: sub_clean local_clean +realclean: sub_realclean local_realclean +clobber: sub_clobber local_clobber local_clean:: if test -f core; then $(RM) core; fi @@ -336,10 +425,15 @@ local_clobber:: local_realclean $(RM) Makefile config.sh -install:: local_install -install.man:: maybe_install.man -deinstall:: local_deinstall -deinstall.man:: maybe_deinstall.man +install:: local_install sub_install + @exit 0 + +install-strip:: local_install-strip sub_install-strip + @exit 0 + +install.man:: maybe_install.man sub_install.man +deinstall:: sub_deinstall local_deinstall +deinstall.man:: sub_deinstall.man maybe_deinstall.man install.man-no: deinstall.man-no: @@ -370,23 +464,94 @@ depend:: ######################################################################## -# Empty rules for directories with no sub-directories -- do not edit +# Rules for building in sub-directories -- do not edit -local_install:: - @echo "install in $(CURRENT) done." +subdirs: + @case '${MFLAGS}' in *ik*) set +e;; esac; \ + for i in $(SUBDIRS) ;\ + do \ + (cd $$i ; echo "$(VERB) in $(DIR)$$i..."; \ + $(MAKE) $(MFLAGS) $(FLAGS) $(TARGET)) || exit 1; \ + done -local_deinstall:: - @echo "deinstall in $(CURRENT) done." +sub_install:: + @$(MAKE) subdirs TARGET=install VERB="Installing" FLAGS= -local_install.man:: - @echo "install.man in $(CURRENT) done." +sub_install-strip:: + @$(MAKE) subdirs TARGET=install-strip VERB="Installing (strip)" FLAGS= -local_deinstall.man:: - @echo "deinstall.man in $(CURRENT) done." +sub_deinstall:: + @$(MAKE) subdirs TARGET=deinstall VERB="Deinstalling" FLAGS= + @echo "Back to $(CURRENT) for "deinstall... + +sub_install.man:: + @$(MAKE) subdirs TARGET=install.man VERB="Installing man pages" FLAGS= + +sub_deinstall.man:: + @$(MAKE) subdirs TARGET=deinstall.man VERB="Deinstalling man pages" FLAGS= + @echo "Back to $(CURRENT) for "deinstall.man... + +sub_clean:: + @$(MAKE) subdirs TARGET=clean VERB="Cleaning" FLAGS= + @echo "Back to $(CURRENT) for "clean... + +sub_realclean:: + @$(MAKE) subdirs TARGET=realclean VERB="Real cleaning" FLAGS= + @echo "Back to $(CURRENT) for "realclean... + +sub_clobber:: + @$(MAKE) subdirs TARGET=clobber VERB="Clobbering" FLAGS= + @echo "Back to $(CURRENT) for "clobber... + +tag:: + @case '${MFLAGS}' in *ik*) set +e;; esac; \ + for i in $(SUBDIRS) ;\ + do \ + (cd $$i ; echo "Tagging" "in $(DIR)$$i..."; \ + $(MAKE) $(MFLAGS) tag) || exit 1; \ + done Makefiles:: + @case '${MFLAGS}' in *ik*) set +e;; esac; \ + for i in $(SUBDIRS);\ + do \ + echo "Making "Makefiles" in $(DIR)$$i..."; \ + (cd $$i || exit 1; \ + if test ! -f Makefile; then /bin/sh Makefile.SH; fi; \ + $(MAKE) $(MFLAGS) Makefiles) || exit 1;\ + done + +Makefiles.SH:: Makefile.SH + @case '${MFLAGS}' in *ik*) set +e;; esac; \ + for i in $(SUBDIRS);\ + do \ + case "$(DIR)$$i/" in \ + */*/*/*/) newtop=../../../..;; \ + */*/*/) newtop=../../..;; \ + */*/) newtop=../..;; \ + */) newtop=..;; \ + esac; \ + case "$(TOP)" in \ + /*) newtop="$(TOP)" ;; \ + esac; \ + echo "Making Makefiles.SH in $(DIR)$$i..."; \ + (cd $$i || exit 1; \ + if test -f Jmakefile; then \ + $(MAKE) $(MFLAGS) -f ../Makefile \ + Makefile TOP=$$newtop CURRENT=$(DIR)$$i && \ + $(MAKE) $(MFLAGS) Makefiles.SH; \ + fi; \ + ) || exit 1; \ + done -Makefiles.SH:: +all:: + @$(MAKE) subdirs TARGET=all VERB="Making all" FLAGS= + +local_install:: +local_install-strip:: +local_deinstall:: +local_install.man:: +local_deinstall.man:: ######################################################################## # Dependencies generated by make depend
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/alive.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/alive.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2014 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,48 +28,64 @@ * Alive status checking ping/pongs. * * @author Raphael Manfredi - * @date 2002-2003 + * @date 2002-2003, 2014 */ #include "common.h" #include "alive.h" -#include "nodes.h" -#include "guid.h" + #include "gmsg.h" +#include "guid.h" #include "mq.h" +#include "nodes.h" #include "pcache.h" + +#include "core/g2/build.h" +#include "core/g2/node.h" + #include "lib/atoms.h" -#include "lib/glib-missing.h" +#include "lib/eslist.h" #include "lib/pmsg.h" #include "lib/tm.h" #include "lib/walloc.h" + #include "if/gnet_property_priv.h" + #include "lib/override.h" /* Must be the last header included */ #define INFINITY 0xffffffff +enum alive_magic { ALIVE_MAGIC = 0x778b64bb }; + /** * Structure used to keep track of the alive pings we sent, and stats. */ struct alive { - struct gnutella_node *node; - GSList *pings; /**< Pings we sent (struct alive_ping) */ - int count; /**< Amount of pings in list */ - int maxcount; /**< Maximum amount of pings we remember */ - guint32 min_rt; /**< Minimum roundtrip time (ms) */ - guint32 max_rt; /**< Maximim roundtrip time (ms) */ - guint32 avg_rt; /**< Average (EMA) roundtrip time (ms) */ - guint32 last_rt; /**< Last roundtrip time (ms) */ + enum alive_magic magic; /**< Magic number */ + gnutella_node_t *node; /**< The node to which we are attached */ + eslist_t pings; /**< Pings we sent (struct alive_ping) */ + time_t last_sent; /**< When we last sent a ping */ + uint maxcount; /**< Maximum amount of pings we remember */ + uint32 min_rt; /**< Minimum roundtrip time (ms) */ + uint32 max_rt; /**< Maximim roundtrip time (ms) */ + uint32 avg_rt; /**< Average (EMA) roundtrip time (ms) */ + uint32 last_rt; /**< Last roundtrip time (ms) */ }; +static inline void +alive_check(const struct alive * const a) +{ + g_assert(a != NULL); + g_assert(ALIVE_MAGIC == a->magic); +} + struct alive_ping { const struct guid *muid; /**< The GUID of the message */ tm_t sent; /**< Time at which we sent the message */ + slink_t ap_link; /**< Links sent alive pings */ }; -static void alive_trim_upto(struct alive *a, GSList *item); - /** * Create an alive_ping, with proper message ID. */ @@ -80,19 +96,28 @@ WALLOC(ap); - ap->muid = atom_guid_get(muid); + ap->muid = NULL == muid ? NULL : atom_guid_get(muid); tm_now_exact(&ap->sent); return ap; } /** + * Clear an alive ping. + */ +static void +ap_clear(struct alive_ping *ap) +{ + atom_guid_free_null(&ap->muid); +} + +/** * Free an alive_ping. */ static void ap_free(struct alive_ping *ap) { - atom_guid_free(ap->muid); + ap_clear(ap); WFREE(ap); } @@ -100,15 +125,24 @@ * Create the alive structure. * Returned as an opaque pointer. */ -gpointer -alive_make(struct gnutella_node *n, int max) +alive_t * +alive_make(gnutella_node_t *n, int max) { - struct alive *a; + alive_t *a; WALLOC0(a); + a->magic = ALIVE_MAGIC; a->node = n; - a->maxcount = max; a->min_rt = INFINITY; + a->last_sent = tm_time(); + eslist_init(&a->pings, offsetof(struct alive_ping, ap_link)); + + /* + * For G2 nodes, we only allow 1 pending ping: the /PI message has no + * MUID and therefore we cannot know which /PI a /PO would acknowledge. + */ + + a->maxcount = NODE_TALKS_G2(n) ? 1 : max; return a; } @@ -117,46 +151,29 @@ * Dispose the alive structure. */ void -alive_free(gpointer obj) +alive_free(alive_t *a) { - struct alive *a = obj; - GSList *sl; + alive_check(a); - for (sl = a->pings; sl; sl = g_slist_next(sl)) - ap_free(sl->data); - - gm_slist_free_null(&a->pings); + eslist_foreach(&a->pings, (data_fn_t) ap_clear, NULL); + eslist_wfree(&a->pings, sizeof(struct alive_ping)); + eslist_discard(&a->pings); + a->magic = 0; WFREE(a); } /** - * Remove and free specified "alive ping" list entry. - */ -static void -alive_remove_link(struct alive *a, GSList *item) -{ - g_assert(a->count > 0); - g_assert(a->pings != NULL); - - a->pings = g_slist_remove_link(a->pings, item); - a->count--; - ap_free(item->data); - g_slist_free_1(item); -} - -/** * Drop alive ping record when message is dropped. */ static void -alive_ping_drop(struct alive *a, const struct guid *muid) +alive_ping_drop(alive_t *a, const struct guid *muid) { - GSList *sl; - - for (sl = a->pings; sl; sl = g_slist_next(sl)) { - struct alive_ping *ap = sl->data; + struct alive_ping *ap; - if (guid_eq(ap->muid, muid)) { /* Found it! */ - alive_remove_link(a, sl); + ESLIST_FOREACH_DATA(&a->pings, ap) { + if (NULL == muid || guid_eq(ap->muid, muid)) { /* Found it! */ + eslist_remove(&a->pings, ap); + ap_free(ap); return; } } @@ -166,24 +183,22 @@ * Test whether an alive ping can be sent. * We send only the LATEST registered one. */ -static gboolean -alive_ping_can_send(pmsg_t *mb, const mqueue_t *q) +static bool +alive_ping_can_send(const pmsg_t *mb, const void *q) { const gnutella_node_t *n = mq_node(q); - struct alive *a = n->alive_pings; + alive_t *a = n->alive_pings; const struct guid *muid = cast_to_guid_ptr_const(pmsg_start(mb)); g_assert(gnutella_header_get_function(muid) == GTA_MSG_INIT); - g_assert(a->count == 0 || a->pings != NULL); /* * We can send the message only if it's the latest in the list, * i.e. the latest one we enqueued. */ - if (a->count) { - const GSList *l = g_slist_last(a->pings); - const struct alive_ping *ap = l->data; + if (0 != eslist_count(&a->pings)) { + const struct alive_ping *ap = eslist_tail(&a->pings); if (guid_eq(ap->muid, muid)) /* It's the latest one */ return TRUE; /* We can send it */ @@ -196,8 +211,8 @@ alive_ping_drop(a, muid); if (GNET_PROPERTY(alive_debug)) - g_debug("ALIVE %s dropped old alive ping %s, %d remain", - node_infostr(a->node), guid_hex_str(muid), a->count); + g_debug("ALIVE %s dropped old alive ping #%s, %zd remain", + node_infostr(a->node), guid_hex_str(muid), eslist_count(&a->pings)); return FALSE; /* Don't send message */ } @@ -206,24 +221,41 @@ * Free routine for extended "alive ping" message block. */ static void -alive_pmsg_free(pmsg_t *mb, gpointer arg) +alive_pmsg_free(pmsg_t *mb, void *arg) { - struct gnutella_node *n = arg; + gnutella_node_t *n = arg; g_assert(pmsg_is_extended(mb)); if (pmsg_was_sent(mb)) { n->n_ping_sent++; - if (GNET_PROPERTY(alive_debug)) - g_debug("ALIVE sent ping %s to %s", - guid_hex_str(cast_to_guid_ptr_const(pmsg_start(mb))), - node_infostr(n)); + + if (GNET_PROPERTY(alive_debug)) { + if (NODE_TALKS_G2(n)) { + g_debug("ALIVE sent ping to %s", node_infostr(n)); + } else { + g_debug("ALIVE sent ping #%s to %s", + guid_hex_str(cast_to_guid_ptr_const(pmsg_start(mb))), + node_infostr(n)); + } + } } else { - struct guid *muid = cast_to_guid_ptr(pmsg_start(mb)); - struct alive *a = n->alive_pings; + struct guid *muid; + alive_t *a = n->alive_pings; g_assert(a->node == n); + muid = NODE_TALKS_G2(n) ? NULL : cast_to_guid_ptr(pmsg_start(mb)); + + if (GNET_PROPERTY(alive_debug)) { + if (NODE_TALKS_G2(n)) { + g_debug("ALIVE dropped ping to %s", node_infostr(n)); + } else { + g_debug("ALIVE dropped ping #%s to %s", + guid_hex_str(muid), node_infostr(n)); + } + } + alive_ping_drop(a, muid); } } @@ -233,41 +265,55 @@ * * @return TRUE if we sent it, FALSE if there are too many ACK-pending pings. */ -gboolean -alive_send_ping(gpointer obj) +bool +alive_send_ping(alive_t *a) { - struct alive *a = obj; - struct guid muid; struct alive_ping *ap; - gnutella_msg_init_t *m; - guint32 size; pmsg_t *mb; - g_assert(a->count == 0 || a->pings != NULL); + alive_check(a); - if (a->count >= a->maxcount) + if (eslist_count(&a->pings) >= a->maxcount) return FALSE; - guid_ping_muid(&muid); + if (NODE_TALKS_G2(a->node)) { + pmsg_t *emb; - ap = ap_make(&muid); - a->count++; - a->pings = g_slist_append(a->pings, ap); - a->node->last_alive_ping = tm_time(); + /* + * G2 pings do not bear any MUID. + */ - /* - * Build ping message and attach a pre-sender callback, as well as - * a free routine to see whether the message is sent. - */ + ap = ap_make(NULL); + mb = g2_build_alive_ping(); + emb = pmsg_clone_extend(mb, alive_pmsg_free, a->node); + pmsg_free(mb); + g2_node_send(a->node, emb); + } else { + struct guid muid; + gnutella_msg_init_t *m; + uint32 size; + + guid_ping_muid(&muid); + + ap = ap_make(&muid); - m = build_ping_msg(&muid, 1, FALSE, &size); + /* + * Build ping message and attach a pre-sender callback, as well as + * a free routine to see whether the message is sent. + */ - g_assert(size == sizeof(*m)); /* No trailing GGEP extension */ + m = build_ping_msg(&muid, 1, FALSE, &size); - mb = gmsg_to_ctrl_pmsg_extend(m, size, alive_pmsg_free, a->node); - pmsg_set_check(mb, alive_ping_can_send); + g_assert(size == sizeof(*m)); /* No trailing GGEP extension */ - gmsg_mb_sendto_one(a->node, mb); + mb = gmsg_to_ctrl_pmsg_extend(m, size, alive_pmsg_free, a->node); + pmsg_set_check(mb, alive_ping_can_send); + + gmsg_mb_sendto_one(a->node, mb); + } + + eslist_append(&a->pings, ap); + a->last_sent = tm_time(); return TRUE; } @@ -278,7 +324,7 @@ static void ap_ack(const struct alive_ping *ap, struct alive *a) { - GTimeVal now; + tm_t now; int delay; /**< Between sending and reception, in ms */ tm_now_exact(&now); @@ -307,30 +353,30 @@ a->avg_rt += (delay >> 2) - (a->avg_rt >> 2); - if (GNET_PROPERTY(alive_debug) > 1) + if (GNET_PROPERTY(alive_debug) > 1) { g_debug("ALIVE %s " - "delay=%dms min=%dms, max=%dms, agv=%dms %d queued", + "delay=%dms min=%dms, max=%dms, agv=%dms %zd queued", node_infostr(a->node), - a->last_rt, a->min_rt, a->max_rt, a->avg_rt, a->count); + a->last_rt, a->min_rt, a->max_rt, a->avg_rt, + eslist_count(&a->pings)); + } } /** - * Trim list of pings upto the specified linkable `item', included. + * Trim list of pings upto the specified `item', included. */ static void -alive_trim_upto(struct alive *a, GSList *item) +alive_trim_upto(struct alive *a, struct alive_ping *item) { - GSList *sl; - gboolean found = FALSE; - - g_assert(a->count && a->pings != NULL); + struct alive_ping *ap; - for (sl = a->pings; sl && !found; sl = a->pings) { - found = sl == item; - alive_remove_link(a, sl); + while (NULL != (ap = eslist_shift(&a->pings))) { + ap_free(ap); + if (ap == item) + return; } - g_assert(found); /* Must have found the item */ - g_assert(a->count >= 0); + + g_assert(NULL == item); /* Must have found the item if given */ } /** @@ -338,24 +384,38 @@ * * @return TRUE if it was indeed an ACK for a ping we sent. */ -gboolean -alive_ack_ping(gpointer obj, const struct guid *muid) +bool +alive_ack_ping(alive_t *a, const guid_t *muid) { - struct alive *a = obj; - GSList *sl; + struct alive_ping *ap; - g_assert(a->count == 0 || a->pings != NULL); + alive_check(a); + g_assert(equiv(NODE_TALKS_G2(a->node), NULL == muid)); - for (sl = a->pings; sl; sl = g_slist_next(sl)) { - const struct alive_ping *ap = sl->data; + if (NULL == muid) { + /* + * G2 pong, no MUID so we only have one pending ping at a time. + */ - if (guid_eq(ap->muid, muid)) { /* Found it! */ - if (GNET_PROPERTY(alive_debug)) - g_debug("ALIVE got alive pong %s from %s", - guid_hex_str(muid), node_infostr(a->node)); + ap = eslist_shift(&a->pings); + if (ap != NULL) { + if (GNET_PROPERTY(alive_debug)) { + g_debug("ALIVE got alive pong from %s", node_infostr(a->node)); + } ap_ack(ap, a); - alive_trim_upto(a, sl); - return TRUE; + alive_trim_upto(a, NULL); /* Paranoid: remove everything */ + } + } else { + ESLIST_FOREACH_DATA(&a->pings, ap) { + if (guid_eq(ap->muid, muid)) { /* Found it! */ + if (GNET_PROPERTY(alive_debug)) { + g_debug("ALIVE got alive pong #%s from %s", + guid_hex_str(muid), node_infostr(a->node)); + } + ap_ack(ap, a); + alive_trim_upto(a, ap); + return TRUE; + } } } @@ -367,38 +427,34 @@ * replying to an alive ping. */ void -alive_ack_first(gpointer obj, const struct guid *muid) +alive_ack_first(alive_t *a, const struct guid *muid) { - struct alive *a = obj; struct alive_ping *ap; - GSList *sl; - g_assert(a->count == 0 || a->pings != NULL); + alive_check(a); /* * Maybe they're reusing the same MUID we used for our "alive ping"? */ - if (alive_ack_ping(obj, muid)) + if (alive_ack_ping(a, muid)) return; /* * Assume they're replying to the first ping we sent, ignore otherwise. */ - sl = a->pings; /* First ping we sent, chronologically */ + ap = eslist_shift(&a->pings); /* First ping we sent, chronologically */ - if (NULL == sl) + if (NULL == ap) return; - ap = sl->data; - if (GNET_PROPERTY(alive_debug)) - g_debug("ALIVE TTL=0 ping from %s, assuming it acks %s", + g_debug("ALIVE TTL=0 ping from %s, assuming it acks #%s", node_infostr(a->node), guid_hex_str(ap->muid)); ap_ack(ap, a); - alive_remove_link(a, sl); + ap_free(ap); } /** @@ -406,14 +462,23 @@ * Values are expressed in milliseconds. */ void -alive_get_roundtrip_ms(gconstpointer obj, guint32 *avg, guint32 *last) +alive_get_roundtrip_ms(const alive_t *a, uint32 *avg, uint32 *last) { - const struct alive *a = obj; - - g_assert(NULL != obj); + alive_check(a); if (avg) *avg = a->avg_rt; if (last) *last = a->last_rt; } +/** + * @return how much time elapsed since the last alive ping. + */ +time_delta_t +alive_elapsed(const alive_t *a) +{ + alive_check(a); + + return delta_time(tm_time(), a->last_sent); +} + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/alive.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/alive.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2014 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,7 +28,7 @@ * Alive status checking ping/pongs. * * @author Raphael Manfredi - * @date 2002-2003 + * @date 2002-2003, 2014 */ #ifndef _core_alive_h_ @@ -36,19 +36,25 @@ #include "common.h" +#include "lib/timestamp.h" /* For time_delta_t */ + struct gnutella_node; struct guid; +struct alive; +typedef struct alive alive_t; + /* * Public interface. */ -gpointer alive_make(struct gnutella_node *n, int max); -void alive_free(gpointer obj); -gboolean alive_send_ping(gpointer obj); -gboolean alive_ack_ping(gpointer obj, const struct guid *); -void alive_ack_first(gpointer obj, const struct guid *); -void alive_get_roundtrip_ms(gconstpointer obj, guint32 *avg, guint32 *last); +alive_t *alive_make(struct gnutella_node *n, int max); +void alive_free(alive_t *a); +bool alive_send_ping(alive_t *a); +bool alive_ack_ping(alive_t *a, const struct guid *); +void alive_ack_first(alive_t *a, const struct guid *); +void alive_get_roundtrip_ms(const alive_t *a, uint32 *avg, uint32 *last); +time_delta_t alive_elapsed(const alive_t *a); #endif /* _core_alive_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/ban.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/ban.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2012 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -25,25 +25,51 @@ * @ingroup core * @file * - * Banning control. + * Banning logic. + * + * Each time an event occurs for a given IP address (connection attempt, + * lack of OOB hit claiming), we record the event in the proper banning + * object. Once a threshold is reached, the IP address is "banned" for + * some time. + * + * The application code entry point is ban_allow(). It returns a code telling + * we can proceeed further with the event or if we had too many events of + * the same kind already for the address. + * + * For connection attempts that are deemed hammering, it is possible to force + * the file descriptor (the connected socket) to be kept opened for some time + * in an attempt to slow down the request rate on the other end. + * + * Such banned file descriptors are kept in a FIFO queue and will be closed + * when we need to ban a new file descriptor and we reached the maximum amount + * of banned fds, or when we start lacking file descriptors for establishing + * socket connections. * * @author Raphael Manfredi - * @date 2002-2003 + * @date 2002-2003, 2012 */ #include "common.h" #include "ban.h" + +#include "gnet_stats.h" #include "sockets.h" /* For socket_register_fd_reclaimer() */ #include "token.h" #include "whitelist.h" #include "lib/atoms.h" +#include "lib/cq.h" #include "lib/fd.h" +#include "lib/fifo.h" #include "lib/file.h" /* For file_register_fd_reclaimer() */ -#include "lib/cq.h" +#include "lib/hevset.h" #include "lib/misc.h" +#include "lib/parse.h" +#include "lib/spinlock.h" +#include "lib/stringify.h" /* For plural() */ #include "lib/tm.h" +#include "lib/unsigned.h" #include "lib/walloc.h" #include "if/gnet_property.h" @@ -52,7 +78,7 @@ #include "lib/override.h" /* Must be the last header included */ /* - * We keep a hash table, indexed by IP address, which records all the + * We keep a hash set, indexed by IP address, which records all the * requests we have from the various IPs. When hammering is detected, * the IP address is banned for some time. * @@ -61,56 +87,158 @@ */ #define BAN_DELAY 300 /**< Initial ban delay: 5 minutes */ -#define MAX_REQUEST 5 /**< Maximum of 5 requests... */ -#define MAX_PERIOD 60 /**< ...per minute */ -#define MAX_BAN 10800 /**< 3 hours */ -#define BAN_REMIND 5 /**< Every so many attemps, tell them about it */ #define BAN_CALLOUT 1000 /**< Every 1 second */ +#define MAX_SOCK_REQUEST 5 /**< Maximum of 5 requests... */ +#define MAX_SOCK_PERIOD 60 /**< ...per minute */ +#define MAX_SOCK_BAN 10800 /**< 3 hours */ +#define BAN_SOCK_REMIND 5 /**< Every so many attempts, remind them */ + +#define MAX_OOB_REQUEST 5 /**< Maximum of 5 unanswered claims... */ +#define MAX_OOB_PERIOD 60 /**< ...per minute */ +#define MAX_OOB_BAN 3600 /**< 1 hour */ + #define ban_reason(p) ((p)->ban_msg ? (p)->ban_msg : "N/A") -static GHashTable *info; /**< Info by IP address */ -static cqueue_t *ban_cq; /**< Private callout queue */ +#define FORCE_ASSIGN(t,s,f,v) G_STMT_START { \ + *(t *) &(s)->f = v; \ +} G_STMT_END -/**< Decay coefficient, per second */ -static const float decay_coeff = (float) MAX_REQUEST / MAX_PERIOD; +enum ban_magic { BAN_MAGIC = 0x01d2f60d }; -/*** - *** Hammering-specific banning. - ***/ +/** + * A banning object. + */ +struct ban { + enum ban_magic magic; /**< Magic number */ + const ban_category_t cat; /**< Category of banning object */ + unsigned delay; /**< Initial ban delay, in seconds */ + unsigned requests; /**< Maximum amount of requests before ban */ + unsigned period; /**< Period (seconds) for request threshold */ + unsigned bantime; /**< Banning time, in seconds */ + unsigned remind; /**< Reminding period, every so many attempts */ + const float decay_coeff; /**< Decay coefficient, per second */ + hevset_t *info; /**< Info by IP address */ +}; + +static inline void +ban_check(const struct ban * const b) +{ + g_assert(b != NULL); + g_assert(BAN_MAGIC == b->magic); +} + +/** + * Known ban objects, indexed by categories. + * These are created at ban_init() time. + */ +static struct ban *ban_objectBAN_CAT_COUNT; + +static cqueue_t *ban_cq; /**< Private callout queue */ + +enum addr_info_magic { ADDR_INFO_MAGIC = 0x2546b3bb }; /** * Information kept in the info table, per IP address. */ struct addr_info { - float counter; /**< Counts connection, decayed linearily */ - host_addr_t addr; /**< IP address */ - time_t created; /**< When did last connection occur? */ + enum addr_info_magic magic; /**< Magic number */ + host_addr_t addr; /**< IP address -- the embedded key */ + const char *ban_msg; /**< Banning message (atom) */ cevent_t *cq_ev; /**< Scheduled callout event */ - int ban_delay; /**< Banning delay, in seconds */ + const struct ban *owner; /**< Owning ban object */ + time_t created; /**< When did last connection occur? */ + unsigned ban_delay; /**< Banning delay, in seconds */ int ban_count; /**< Amount of time we banned this source */ - const char *ban_msg; /**< Banning message (atom) */ - gboolean banned; /**< Is this IP currently banned? */ + float counter; /**< Counts connection, decayed linearily */ + unsigned banned:1; /**< Is this IP currently banned? */ }; -static void ipf_destroy(cqueue_t *cq, gpointer obj); +static inline void +addr_info_check(const struct addr_info * const ipf) +{ + g_assert(ipf != NULL); + g_assert(ADDR_INFO_MAGIC == ipf->magic); +} + +static void ipf_destroy(cqueue_t *cq, void *obj); + +const char * +ban_category_string(const ban_category_t cat) +{ + switch (cat) { + case BAN_CAT_SOCKET: return "socket"; + case BAN_CAT_OOB_CLAIM: return "OOB claim"; + case BAN_CAT_COUNT: + break; + } + + g_assert_not_reached(); + return NULL; +} + +/** + * Create a new ban object. + * + * @param cat Category of banning events we handle + * @param delay Initial ban delay, in seconds + * @param requests Maximum amount of requests before ban + * @param period; Period (seconds) for request threshold + * @param bantime Banning time, in seconds + * @param remind Reminding period, every so many attempts + * + * @return new ban object. + */ +static struct ban * +ban_make(const ban_category_t cat, + unsigned delay, unsigned requests, unsigned period, + unsigned bantime, unsigned remind) +{ + struct ban *b; + + g_assert(period != 0); + + WALLOC0(b); + + b->magic = BAN_MAGIC; + b->delay = delay; + b->requests = requests; + b->period = period; + b->bantime = bantime; + b->remind = remind; + b->info = hevset_create_any(offsetof(struct addr_info, addr), + host_addr_hash_func, host_addr_hash_func2, host_addr_eq_func); + + /* + * Assignments to read-only fields at creation time. + */ + + FORCE_ASSIGN(ban_category_t, b, cat, cat); + FORCE_ASSIGN(float, b, decay_coeff, (float) requests / period); + + return b; +} /** * Create new addr_info structure for said IP. */ static struct addr_info * -ipf_make(const host_addr_t addr, time_t now) +ipf_make(const host_addr_t addr, time_t now, const struct ban *owner) { struct addr_info *ipf; - WALLOC(ipf); + ban_check(owner); + + WALLOC0(ipf); + ipf->magic = ADDR_INFO_MAGIC; ipf->counter = 1.0; ipf->addr = addr; ipf->created = now; ipf->ban_delay = 0; ipf->ban_count = 0; ipf->ban_msg = NULL; + ipf->owner = owner; ipf->banned = FALSE; /* @@ -122,7 +250,8 @@ */ { int delay; - + const float decay_coeff = owner->decay_coeff; + delay = 1000.0 / decay_coeff; delay = MAX(delay, 1); ipf->cq_ev = cq_insert(ban_cq, delay, ipf_destroy, ipf); @@ -137,32 +266,53 @@ static void ipf_free(struct addr_info *ipf) { - g_assert(ipf); + addr_info_check(ipf); cq_cancel(&ipf->cq_ev); atom_str_free_null(&ipf->ban_msg); + ipf->magic = 0; WFREE(ipf); } +static void +free_info(void *value, void *unused_udata) +{ + (void) unused_udata; + ipf_free(value); +} + +/** + * Destroy a ban object. + */ +static void +ban_free(struct ban *b) +{ + ban_check(b); + + hevset_foreach(b->info, free_info, NULL); + hevset_free_null(&b->info); + b->magic = 0; + WFREE(b); +} + /** * Called from callout queue when it's time to destroy the record. */ static void -ipf_destroy(cqueue_t *unused_cq, gpointer obj) +ipf_destroy(cqueue_t *cq, void *obj) { struct addr_info *ipf = obj; - (void) unused_cq; - g_assert(ipf); + addr_info_check(ipf); g_assert(!ipf->banned); - g_assert(ipf == g_hash_table_lookup(info, &ipf->addr)); if (GNET_PROPERTY(ban_debug) > 8) - g_debug("disposing of BAN %s: %s", + g_debug("disposing of %s BAN %s: %s", + ban_category_string(ipf->owner->cat), host_addr_to_string(ipf->addr), ban_reason(ipf)); - g_hash_table_remove(info, &ipf->addr); - ipf->cq_ev = NULL; + hevset_remove(ipf->owner->info, &ipf->addr); + cq_zero(cq, &ipf->cq_ev); ipf_free(ipf); } @@ -170,16 +320,19 @@ * Called from callout queue when it's time to unban the IP. */ static void -ipf_unban(cqueue_t *unused_cq, gpointer obj) +ipf_unban(cqueue_t *cq, void *obj) { struct addr_info *ipf = obj; time_t now = tm_time(); int delay; + float decay_coeff; - (void) unused_cq; - g_assert(ipf); + addr_info_check(ipf); g_assert(ipf->banned); - g_assert(ipf == g_hash_table_lookup(info, &ipf->addr)); + ban_check(ipf->owner); + + cq_zero(cq, &ipf->cq_ev); + decay_coeff = ipf->owner->decay_coeff; /* * Decay counter by measuring the amount of seconds since last connection @@ -207,11 +360,11 @@ if (delay <= 0) { if (GNET_PROPERTY(ban_debug) > 8) - g_debug("disposing of BAN %s: %s", + g_debug("disposing of %s BAN %s: %s", + ban_category_string(ipf->owner->cat), host_addr_to_string(ipf->addr), ban_reason(ipf)); - g_hash_table_remove(info, &ipf->addr); - ipf->cq_ev = NULL; + hevset_remove(ipf->owner->info, &ipf->addr); ipf_free(ipf); return; } @@ -222,20 +375,26 @@ } /** - * Check whether we can allow connection from `ip' to proceed. + * Check whether we can allow connection / event from `ip' to proceed. * * Returns: * - * BAN_OK ok, can proceed with connection. + * BAN_OK ok, can proceed with connection / event. * BAN_FIRST will ban, but send back message, then close connection. * BAN_FORCE don't send back anything, and call ban_force(). * BAN_MSG will ban with explicit message and tailored error code. */ ban_type_t -ban_allow(const host_addr_t addr) +ban_allow(const ban_category_t cat, const host_addr_t addr) { struct addr_info *ipf; time_t now = tm_time(); + struct ban *b; + + g_assert(uint_is_non_negative(cat) && cat < BAN_CAT_COUNT); + + b = ban_objectcat; + ban_check(b); switch (host_addr_net(addr)) { case NET_TYPE_IPV4: @@ -248,24 +407,26 @@ if (whitelist_check(addr)) return BAN_OK; - ipf = g_hash_table_lookup(info, &addr); + ipf = hevset_lookup(b->info, &addr); /* * First time we see this IP? It's OK then. */ if (NULL == ipf) { - ipf = ipf_make(addr, now); - g_hash_table_insert(info, &ipf->addr, ipf); + ipf = ipf_make(addr, now, b); + hevset_insert(b->info, ipf); return BAN_OK; } + addr_info_check(ipf); + /* * Decay counter by measuring the amount of seconds since last connection * and applying the linear decay coefficient. */ - ipf->counter -= delta_time(now, ipf->created) * decay_coeff; + ipf->counter -= delta_time(now, ipf->created) * b->decay_coeff; if (ipf->counter < 0.0) ipf->counter = 0.0; @@ -280,11 +441,13 @@ ipf->counter += 1.0; ipf->created = now; - if (GNET_PROPERTY(ban_debug) > 4) - g_debug("BAN %s, counter = %.3f (%s)", + if (GNET_PROPERTY(ban_debug) > 4) { + g_debug("BAN %s %s, counter = %.3f (%s)", + ban_category_string(b->cat), host_addr_to_string(ipf->addr), ipf->counter, ipf->banned ? "already banned" : - ipf->counter > (float) MAX_REQUEST ? "banning" : "OK"); + ipf->counter > (float) b->requests ? "banning" : "OK"); + } g_assert(ipf->cq_ev); @@ -301,13 +464,13 @@ return BAN_MSG; /** - * Every BAN_REMIND attempts, return BAN_FIRST to let them know + * Every ``remind'' attempts, return BAN_FIRST to let them know * that they have been banned, in case they "missed" our previous * indications or did not get the Retry-After right. * --RAM, 2004-06-21 */ - if (++(ipf->ban_count) % BAN_REMIND == 0) + if (0 != b->remind && 0 == ++(ipf->ban_count) % b->remind) return BAN_FIRST; return BAN_FORCE; @@ -317,7 +480,7 @@ * Ban the IP if it crossed the request limit. */ - if (ipf->counter > (float) MAX_REQUEST) { + if (ipf->counter > (float) b->requests) { cq_cancel(&ipf->cq_ev); /* Cancel ipf_destroy */ ipf->banned = TRUE; @@ -328,8 +491,8 @@ else ipf->ban_delay = BAN_DELAY; - if (ipf->ban_delay > MAX_BAN) - ipf->ban_delay = MAX_BAN; + if (ipf->ban_delay > b->bantime) + ipf->ban_delay = b->bantime; ipf->cq_ev = cq_insert(ban_cq, 1000 * ipf->ban_delay, ipf_unban, ipf); @@ -342,7 +505,7 @@ { int delay; - delay = 1000.0 * ipf->counter / decay_coeff; + delay = 1000.0 * ipf->counter / b->decay_coeff; delay = MAX(delay, 1); cq_resched(ipf->cq_ev, delay); } @@ -352,37 +515,46 @@ /** * Record banning with specific message for a given IP, for MAX_BAN seconds. + * + * This applies on the BAN_CAT_SOCKET banning category implicitly */ void ban_record(const host_addr_t addr, const char *msg) { struct addr_info *ipf; + struct ban *b = ban_objectBAN_CAT_SOCKET; + + ban_check(b); /* * If is possible that we already have an addr_info for that host. */ - ipf = g_hash_table_lookup(info, &addr); + ipf = hevset_lookup(b->info, &addr); if (NULL == ipf) { - ipf = ipf_make(addr, tm_time()); - g_hash_table_insert(info, &ipf->addr, ipf); + ipf = ipf_make(addr, tm_time(), b); + hevset_insert(b->info, ipf); } + addr_info_check(ipf); + atom_str_change(&ipf->ban_msg, msg); - ipf->ban_delay = MAX_BAN; + ipf->ban_delay = b->bantime; - if (GNET_PROPERTY(ban_debug)) - g_debug("BAN %s record %s: %s", + if (GNET_PROPERTY(ban_debug)) { + g_debug("BAN %s %s record %s: %s", + ban_category_string(b->cat), ipf->banned ? "updating" : "new", host_addr_to_string(ipf->addr), ban_reason(ipf)); + } if (ipf->banned) - cq_resched(ipf->cq_ev, MAX_BAN * 1000); + cq_resched(ipf->cq_ev, b->bantime * 1000); else { cq_cancel(&ipf->cq_ev); /* Cancel ipf_destroy */ ipf->banned = TRUE; - ipf->cq_ev = cq_insert(ban_cq, MAX_BAN * 1000, ipf_unban, ipf); + ipf->cq_ev = cq_insert(ban_cq, b->bantime * 1000, ipf_unban, ipf); } } @@ -395,14 +567,18 @@ #define SOCK_BUFFER 512 /**< Reduced socket buffer */ -static GList *banned_head = NULL; -static GList *banned_tail = NULL; +static fifo_t *banned_fds; +static spinlock_t banned_fds_slk = SPINLOCK_INIT; + +#define BANNED_FDS_LOCK spinlock(&banned_fds_slk) +#define BANNED_FDS_UNLOCK spinunlock(&banned_fds_slk) +#define BANNED_FDS_IS_LOCKED spinlock_is_held(&banned_fds_slk) static void ban_close_fd(void **data_ptr) { void *data = *data_ptr; - int fd = GPOINTER_TO_INT(data); + int fd = pointer_to_int(data); g_assert(is_valid_fd(fd)); g_assert(fd > STDERR_FILENO); /* fd 0-2 are not used for sockets */ @@ -411,7 +587,7 @@ g_debug("closing BAN fd #%d", fd); } fd_close(&fd); /* Reclaim fd */ - *data_ptr = GINT_TO_POINTER(-1); + *data_ptr = int_to_pointer(-1); } /** @@ -421,28 +597,48 @@ * * @returns TRUE if we did reclaim something, FALSE if there was nothing. */ -static gboolean +static bool reclaim_fd(void) { - GList *prev; + void *fd; + + g_assert(BANNED_FDS_IS_LOCKED); - if (banned_tail == NULL) { - g_assert(banned_head == NULL); + fd = fifo_remove(banned_fds); + + if (NULL == fd) { g_assert(GNET_PROPERTY(banned_count) == 0); return FALSE; /* Empty list */ } - g_assert(banned_head != NULL); g_assert(GNET_PROPERTY(banned_count) > 0); - ban_close_fd(&banned_tail->data); + ban_close_fd(&fd); + gnet_prop_decr_guint32(PROP_BANNED_COUNT); + + /* + * Don't assert that: + * + * fifo_count(banned_fds) == GNET_PROPERTY(banned_count) + * + * at this stage because the compiler does not know that the call to + * gnet_prop_decr_guint32(PROP_BANNED_COUNT) will actually modify the + * value of GNET_PROPERTY(banned_count) and it can generate bad code. + * + * To make it work, we need to fetch the property value through + * the gnet_prop_get_guint32_val() interface. + * --RAM, 2013-12-29 + */ + + { + uint32 banned_count; - prev = g_list_previous(banned_tail); - banned_head = g_list_remove_link(banned_head, banned_tail); - g_list_free_1(banned_tail); - banned_tail = prev; + gnet_prop_get_guint32_val(PROP_BANNED_COUNT, &banned_count); - gnet_prop_decr_guint32(PROP_BANNED_COUNT); + g_assert_log(fifo_count(banned_fds) == banned_count, + "fifo_count=%u, banned_count=%u", + fifo_count(banned_fds), banned_count); + } return TRUE; } @@ -459,10 +655,12 @@ * * @returns TRUE if we did reclaim something, FALSE if there was nothing. */ -static gboolean +static bool ban_reclaim_fd(void) { - gboolean reclaimed; + bool reclaimed; + + BANNED_FDS_LOCK; reclaimed = reclaim_fd(); @@ -476,6 +674,8 @@ else gnet_prop_set_boolean_val(PROP_FILE_DESCRIPTOR_RUNOUT, TRUE); + BANNED_FDS_UNLOCK; + return reclaimed; } @@ -494,14 +694,6 @@ g_return_if_fail(is_valid_fd(fd)); g_return_if_fail(fd > STDERR_FILENO); /* fd 0-2 are not used for sockets */ - if (GNET_PROPERTY(banned_count) >= GNET_PROPERTY(max_banned_fd)) { - g_assert(banned_tail); - g_assert(GNET_PROPERTY(max_banned_fd) <= 1 || - banned_tail != banned_head); - - reclaim_fd(); - } - /* Ensure we're not listening to I/O events anymore. */ socket_evt_clear(s); @@ -524,50 +716,108 @@ * Insert banned fd in the list. */ - banned_head = g_list_prepend(banned_head, GINT_TO_POINTER(fd)); - if (banned_tail == NULL) - banned_tail = banned_head; + BANNED_FDS_LOCK; + + g_assert_log(fifo_count(banned_fds) == GNET_PROPERTY(banned_count), + "fifo_count=%u, banned_count=%u", + fifo_count(banned_fds), GNET_PROPERTY(banned_count)); + + while (fifo_count(banned_fds) >= GNET_PROPERTY(max_banned_fd)) { + if (!reclaim_fd()) + break; + } + + fifo_put(banned_fds, int_to_pointer(fd)); gnet_prop_incr_guint32(PROP_BANNED_COUNT); + gnet_stats_inc_general(GNR_BANNED_FDS_TOTAL); + + /* + * Don't assert that: + * + * fifo_count(banned_fds) == GNET_PROPERTY(banned_count) + * + * at this stage because the compiler does not know that the call to + * gnet_prop_incr_guint32(PROP_BANNED_COUNT) will actually modify the + * value of GNET_PROPERTY(banned_count) and it generates bad code. + * + * To make it work, we need to fetch the property value through + * the gnet_prop_get_guint32_val() interface. + * --RAM, 2013-12-29 + */ + + { + uint32 banned_count; + + gnet_prop_get_guint32_val(PROP_BANNED_COUNT, &banned_count); + + g_assert_log(fifo_count(banned_fds) == banned_count, + "fifo_count=%u, banned_count=%u", + fifo_count(banned_fds), banned_count); + } + + BANNED_FDS_UNLOCK; } /** - * Check whether IP is already recorded as being banned. + * Check whether IP is already recorded as being banned for this category. */ -gboolean -ban_is_banned(const host_addr_t addr) +bool +ban_is_banned(const ban_category_t cat, const host_addr_t addr) { struct addr_info *ipf; + struct ban *b; - ipf = g_hash_table_lookup(info, &addr); + g_assert(uint_is_non_negative(cat) && cat < BAN_CAT_COUNT); + + b = ban_objectcat; + ban_check(b); + + ipf = hevset_lookup(b->info, &addr); + g_assert(NULL == ipf || ADDR_INFO_MAGIC == ipf->magic); return ipf != NULL && ipf->banned; } /** - * @return banning delay for banned IP. + * @return banning delay for banned IP in the given category. */ int -ban_delay(const host_addr_t addr) +ban_delay(const ban_category_t cat, const host_addr_t addr) { struct addr_info *ipf; + struct ban *b; + + g_assert(uint_is_non_negative(cat) && cat < BAN_CAT_COUNT); - ipf = g_hash_table_lookup(info, &addr); - g_assert(ipf); + b = ban_objectcat; + ban_check(b); + + ipf = hevset_lookup(b->info, &addr); + addr_info_check(ipf); return ipf->ban_delay; } /** + * Get banning message for banned IP. + * + * This only applies to BAN_CAT_SOCKET type of bans since there needs to be + * a configured reminder period whereby we explicitly tell them that they + * are banned, so we need a communication channel for that. + * * @return banning message for banned IP. */ const char * ban_message(const host_addr_t addr) { struct addr_info *ipf; + struct ban *b = ban_objectBAN_CAT_SOCKET; + + ban_check(b); - ipf = g_hash_table_lookup(info, &addr); - g_assert(ipf); + ipf = hevset_lookup(b->info, &addr); + addr_info_check(ipf); return ipf->ban_msg; } @@ -575,12 +825,17 @@ /** * Initialize the banning system. */ -G_GNUC_COLD void +void G_COLD ban_init(void) { - info = g_hash_table_new(host_addr_hash_func, host_addr_eq_func); - ban_cq = cq_submake("ban", callout_queue, BAN_CALLOUT); + ban_cq = cq_main_submake("ban", BAN_CALLOUT); + ban_objectBAN_CAT_SOCKET = ban_make(BAN_CAT_SOCKET, BAN_DELAY, + MAX_SOCK_REQUEST, MAX_SOCK_PERIOD, MAX_SOCK_BAN, BAN_SOCK_REMIND); + ban_objectBAN_CAT_OOB_CLAIM = ban_make(BAN_CAT_OOB_CLAIM, BAN_DELAY, + MAX_OOB_REQUEST, MAX_OOB_PERIOD, MAX_OOB_BAN, 0); + + banned_fds = fifo_make(); ban_max_recompute(); file_register_fd_reclaimer(ban_reclaim_fd); socket_register_fd_reclaimer(ban_reclaim_fd); @@ -592,7 +847,7 @@ void ban_max_recompute(void) { - guint32 max; + uint32 max; max = (GNET_PROPERTY(sys_nofile) * GNET_PROPERTY(ban_ratio_fds)) / 100; max = MIN(GNET_PROPERTY(ban_max_fds), max); @@ -600,35 +855,48 @@ if (GNET_PROPERTY(ban_debug)) g_info("will use at most %d file descriptor%s for banning", - max, max == 1 ? "" : "s"); + max, plural(max)); gnet_prop_set_guint32_val(PROP_MAX_BANNED_FD, max); + + /* + * Close file descriptors kept opened if we now have more banned slots + * than the new maximum allowed. + */ + + BANNED_FDS_LOCK; + + while (GNET_PROPERTY(banned_count) > max) { + if (!reclaim_fd()) + break; + } + + BANNED_FDS_UNLOCK; } static void -free_info(gpointer unused_key, gpointer value, gpointer unused_udata) +ban_fifo_fd_free(void *data, void *unused) { - (void) unused_key; - (void) unused_udata; - ipf_free(value); + int fd = pointer_to_int(data); + + (void) unused; + + fd_close(&fd); } /** * Called at shutdown time to reclaim all memory. */ -G_GNUC_COLD void +void G_COLD ban_close(void) { - GList *l; - - g_hash_table_foreach(info, free_info, NULL); - gm_hash_table_destroy_null(&info); + int n; - for (l = banned_head; NULL != l; l = g_list_next(l)) { - ban_close_fd(&l->data); /* Reclaim fd */ + for (n = 0; n < BAN_CAT_COUNT; n++) { + ban_free(ban_objectn); } - gm_list_free_null(&banned_head); + fifo_free_all_null(&banned_fds, ban_fifo_fd_free, NULL); cq_free_null(&ban_cq); } @@ -639,8 +907,9 @@ /* * These messages are sent to the remote site. Don't localize them. */ -static const char harmful = "Harmful version banned, upgrade required"; -static const char refused = "Connection refused"; +static const char harmful = N_("Harmful version banned, upgrade required"); +static const char refused = N_("Connection refused"); +static const char alien_net = N_("Use an open Gnutella or G2 servent"); /** * Check whether servent identified by its vendor string should be banned. @@ -675,27 +944,29 @@ * network is far from being mature, and we need to ensure newer * features are deployed reasonably quickly. * --RAM, 03/01/2002. + * + * As of 2014-06-16, any version older than 0.98 is deemed harmful to + * the network, since they are too ancient. */ if (gtkg_version) { - static const char * const versions = { - "0.90", - "0.91u", - "0.92b", - "0.93", - "0.94", - }; - guint i; - - for (i = 0; i < G_N_ELEMENTS(versions); i++) { - if (is_strprefix(gtkg_version, versionsi)) - return harmful; - } + uint major, minor; + + if (0 != parse_major_minor(gtkg_version, NULL, &major, &minor)) + return refused; /* Cannot parse */ + + if (0 == major && minor <= 97) + return harmful; /* Too old */ return NULL; } - if (vendor0 == 'G') { + if ('F' == vendor0) { + if (is_strprefix(vendor, "Foxy ")) + return alien_net; + } + + if ('G' == vendor0) { const char *ver; if (NULL != (ver = is_strprefix(vendor, "Gnucleus "))) {
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/ban.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/ban.h
Changed
@@ -40,6 +40,16 @@ struct gnutella_socket; /** + * Known banning categories. + */ +typedef enum { + BAN_CAT_SOCKET = 0, /**< Socket connection */ + BAN_CAT_OOB_CLAIM, /**< OOB hit claims */ + + BAN_CAT_COUNT /**< Total amount of banning categories */ +} ban_category_t; + +/** * @return codes for ban_allow(). */ @@ -52,12 +62,12 @@ void ban_init(void); void ban_close(void); -ban_type_t ban_allow(const host_addr_t addr); +ban_type_t ban_allow(const ban_category_t cat, const host_addr_t addr); void ban_record(const host_addr_t addr, const char *msg); void ban_force(struct gnutella_socket *s); -int ban_delay(const host_addr_t addr); +int ban_delay(const ban_category_t cat, const host_addr_t addr); const char *ban_message(const host_addr_t addr); -gboolean ban_is_banned(const host_addr_t addr); +bool ban_is_banned(const ban_category_t cat, const host_addr_t addr); void ban_max_recompute(void); const char *ban_vendor(const char *vendor);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/bh_download.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/bh_download.c
Changed
@@ -40,36 +40,44 @@ #include "gnet_stats.h" #include "rx_inflate.h" +#include "g2/frame.h" +#include "g2/msg.h" +#include "g2/tfmt.h" +#include "g2/tree.h" + #include "lib/atoms.h" #include "lib/endian.h" -#include "lib/pmsg.h" #include "lib/halloc.h" +#include "lib/pmsg.h" +#include "lib/stringify.h" /* For plural */ #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ #define BH_DL_DEFAULT_SIZE 4096 /* Default data buffer size */ #define BH_DL_MAX_SIZE 65536 /* Maximum payload size we allow */ struct browse_ctx { - gpointer owner; /**< Download owning us */ - rxdrv_t *rx; /**< RX stack top */ - gnet_host_t host; /**< Host we're browsing, for logging */ - gnet_search_t sh; /**< Search ID to which hits are given */ + void *owner; /**< Download owning us */ + rxdrv_t *rx; /**< RX stack top */ + gnet_host_t host; /**< Host we're browsing, for logging */ + gnet_search_t sh; /**< Search ID to which hits are given */ const char *vendor; /**< Vendor version string (atom) */ - gnutella_header_t header; /**< Received header */ + gnutella_header_t header; /**< Received header */ char *data; /**< Where payload data is stored */ - guint data_size; /**< Size of data buffer */ - guint pos; /**< Reading position */ - guint32 size; /**< Payload size */ - gboolean has_header; /**< True when header has been read */ - gboolean closed; /**< Set when search is closed */ + uint data_size; /**< Size of data buffer */ + uint pos; /**< Reading position */ + uint32 size; /**< Payload size */ + unsigned has_header:1; /**< True when header has been read */ + unsigned closed:1; /**< Set when search is closed */ + unsigned g2:1; /**< Expecting G2 hits */ }; /** * Initialize the browse host context. */ struct browse_ctx * -browse_host_dl_create(gpointer owner, gnet_host_t *host, gnet_search_t sh) +browse_host_dl_create(void *owner, gnet_host_t *host, gnet_search_t sh) { struct browse_ctx *bc; @@ -84,7 +92,7 @@ /** * Check sure the browse-host context is for the proper search ID. */ -gboolean +bool browse_host_dl_for_search(struct browse_ctx *bc, gnet_search_t sh) { g_assert(bc != NULL); @@ -97,7 +105,7 @@ * * @return TRUE whilst we think there is more data to read in the buffer. */ -static gboolean +static bool browse_data_read(struct browse_ctx *bc, pmsg_t *mb) { /* @@ -105,7 +113,7 @@ */ if (!bc->has_header) { - char *w = cast_to_gpointer(&bc->header); + char *w = cast_to_pointer(&bc->header); g_assert(sizeof bc->header >= bc->pos); bc->pos += pmsg_read(mb, &wbc->pos, sizeof bc->header - bc->pos); @@ -162,7 +170,7 @@ * * @return FALSE if an error was reported (processing aborted). */ -static gboolean +static bool browse_data_process(struct browse_ctx *bc) { gnutella_node_t *n; @@ -183,29 +191,207 @@ gnet_stats_count_received_header(n); gnet_stats_count_received_payload(n, bc->data); - search_browse_results(n, bc->sh); + search_browse_results(n, bc->sh, NULL); node_browse_cleanup(n); return TRUE; } /** + * Read data from the message buffer we just received. + * + * @return TRUE whilst we think there is more data to read in the buffer. + */ +static bool +browse_data_g2_read(struct browse_ctx *bc, pmsg_t *mb) +{ + int r; + + /* + * Grabbing of the G2 frame works thusly: + * + * As long as bc->has_header is FALSE, we read bytes until we have enough + * to figure out the length of the whole frame. + */ + + if (!bc->has_header) { + char *w; + size_t len; + + if G_UNLIKELY(NULL == bc->data) { + g_assert(0 == bc->data_size); + bc->data_size = BH_DL_DEFAULT_SIZE; + bc->data = halloc(bc->data_size); + } + + w = bc->data; + + /* + * We need 4 bytes at most to completely determine the size of the + * whole G2 frame. + */ + + if (0 == bc->pos) { + r = pmsg_read(mb, w, 4); + if G_UNLIKELY(0 == r) + return FALSE; /* Reached end of buffer */ + bc->pos += r; + len = g2_frame_whole_length(w, bc->pos); + if (0 == len) + return FALSE; /* Not read enough to compute length */ + } else { + for (;;) { + g_assert(bc->pos < sizeof bc->header); + + r = pmsg_read(mb, &wbc->pos, 1); + bc->pos += r; + len = g2_frame_whole_length(w, bc->pos); + if (len != 0) + break; + if (0 == r) + return FALSE; /* Reached end of buffer */ + if (bc->pos >= sizeof bc->header) { + download_stop(bc->owner, GTA_DL_ERROR, "Garbled input"); + return FALSE; + } + } + } + + /* + * If the length is 1, we reached the "end of stream" byte. + */ + + if G_UNLIKELY(1 == len) { + download_stop(bc->owner, GTA_DL_ERROR, "Got End-of-Stream byte"); + return FALSE; + } + + /* + * Protect against too large data. + */ + + if (len > BH_DL_MAX_SIZE) { + download_stop(bc->owner, GTA_DL_ERROR, "G2 payload too big"); + return FALSE; + } + + bc->has_header = TRUE; /* We have read the full header */ + bc->size = len; + + /* + * Resize payload buffer if needed + */ + + if (bc->size > bc->data_size) { + bc->data_size = MAX(BH_DL_DEFAULT_SIZE, bc->size); + bc->data = hrealloc(bc->data, bc->data_size); + } + + /* FALL THROUGH */ + } + + /* + * Read the whole frame data. + */ + + r = pmsg_read(mb, bc->data + bc->pos, bc->size - bc->pos); + + bc->pos += r; + + if (bc->pos >= bc->size) { + bc->has_header = FALSE; /* For next message */ + bc->pos = 0; + return TRUE; /* Must process message and continue */ + } else { + return FALSE; + } +} + +/** + * Process the whole message we read. + * + * @return FALSE if an error was reported (processing aborted). + */ +static bool +browse_data_g2_process(struct browse_ctx *bc) +{ + gnutella_node_t *n; + g2_tree_t *t; + size_t plen; + + /* + * Deserialize the message. + */ + + t = g2_frame_deserialize(bc->data, bc->size, &plen, FALSE); + + if (NULL == t) { + download_stop(bc->owner, GTA_DL_ERROR, "Cannot deserialize message"); + return FALSE; + } else if (plen != bc->size) { + download_stop(bc->owner, GTA_DL_ERROR, "Incomplete deserialization"); + g2_tree_free_null(&t); + return FALSE; + } + + /* + * We accept only query hits (/QH2), ignore the rest. + * + * Contratry to Gnutella host browsing, G2 hosts can send other messages + * when being browsed, such as /UPROD, or other /VF (undocumented anyway), + * which we need to ignore. + */ + + if (G2_MSG_QH2 != g2_msg_name_type(g2_tree_name(t))) { + if (GNET_PROPERTY(download_debug) || GNET_PROPERTY(log_dropped_g2)) { + g_debug("BROWSE %s(): ignoring unexpected /%s (%u byte%s) from %s", + G_STRFUNC, g2_tree_name(t), bc->size, plural(bc->size), + gnet_host_to_string(&bc->host)); + if (GNET_PROPERTY(log_bad_g2)) + g2_tfmt_tree_dump(t, stderr, G2FMT_O_PAYLEN | G2FMT_O_PAYLOAD); + } + goto done; + } + + n = node_browse_prepare(&bc->host, bc->vendor, NULL, bc->data, bc->size); + + dump_rx_packet(n); + gnet_stats_count_received_payload(n, bc->data); + + search_browse_results(n, bc->sh, t); + node_browse_cleanup(n); + +done: + g2_tree_free_null(&t); + return TRUE; +} + +/** * RX data indication callback used to give us some new Gnet traffic in a * low-level message structure (which can contain several Gnet messages). * * @return FALSE if an error occurred. */ -static gboolean +static bool browse_data_ind(rxdrv_t *rx, pmsg_t *mb) { struct browse_ctx *bc = rx_owner(rx); struct download *d; - gboolean error = FALSE; - - while (browse_data_read(bc, mb)) { - if (!browse_data_process(bc)) { - error = TRUE; - break; + bool error = FALSE; + + if (bc->g2) { + while (browse_data_g2_read(bc, mb)) { + if (!browse_data_g2_process(bc)) { + error = TRUE; + break; + } + } + } else { + while (browse_data_read(bc, mb)) { + if (!browse_data_process(bc)) { + error = TRUE; + break; + } } } @@ -237,15 +423,15 @@ ***/ static void -browse_rx_given(gpointer o, ssize_t r) +browse_rx_given(void *o, ssize_t r) { struct browse_ctx *bc = o; download_data_received(bc->owner, r); } -static G_GNUC_PRINTF(2, 3) void -browse_rx_error(gpointer o, const char *reason, ...) +static G_PRINTF(2, 3) void +browse_rx_error(void *o, const char *reason, ...) { struct browse_ctx *bc = o; va_list args; @@ -256,7 +442,7 @@ } static void -browse_rx_got_eof(gpointer o) +browse_rx_got_eof(void *o) { struct browse_ctx *bc = o; @@ -264,7 +450,7 @@ } static void -browse_rx_done(gpointer o) +browse_rx_done(void *o) { struct browse_ctx *bc = o; @@ -293,10 +479,10 @@ * @return TRUE if we may continue with the download, FALSE if the search * was already closed in the GUI. */ -gboolean +bool browse_host_dl_receive( struct browse_ctx *bc, gnet_host_t *host, wrap_io_t *wio, - const char *vendor, guint32 flags) + const char *vendor, uint32 flags) { g_assert(bc != NULL); @@ -344,9 +530,19 @@ bc->rx = rx_make_above(bc->rx, rx_inflate_get_ops(), &args); } + bc->g2 = booleanize(flags & BH_DL_G2); + rx_set_data_ind(bc->rx, browse_data_ind); rx_enable(bc->rx); + if (GNET_PROPERTY(download_debug)) { + g_debug("BROWSE %s(): setup %s%s%slink with %s", + G_STRFUNC, bc->g2 ? "G2 " : "", + (flags & BH_DL_INFLATE) ? "deflated " : "", + (flags & BH_DL_CHUNKED) ? "chunked " : "", + gnet_host_to_string(&bc->host)); + } + return TRUE; } @@ -409,7 +605,7 @@ { struct browse_ctx *bc = *ptr; - if (bc) { + if (bc) { atom_str_free_null(&bc->vendor); if (bc->rx) { rx_free(bc->rx);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/bh_download.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/bh_download.h
Changed
@@ -44,6 +44,7 @@ #define BH_DL_INFLATE (1 << 0) /**< Inflate input */ #define BH_DL_GUNZIP (1 << 1) /**< gunzip input */ #define BH_DL_CHUNKED (1 << 2) /**< Getting chunked data */ +#define BH_DL_G2 (1 << 3) /**< Expecting G2 query hits */ /* * Public interface. @@ -53,13 +54,13 @@ struct bio_source; struct browse_ctx *browse_host_dl_create( - gpointer owner, gnet_host_t *host, gnet_search_t sh); + void *owner, gnet_host_t *host, gnet_search_t sh); void browse_host_dl_free(struct browse_ctx **ptr); -gboolean browse_host_dl_for_search(struct browse_ctx *bc, gnet_search_t sh); +bool browse_host_dl_for_search(struct browse_ctx *bc, gnet_search_t sh); void browse_host_dl_write(struct browse_ctx *bc, char *data, size_t len); -gboolean browse_host_dl_receive( +bool browse_host_dl_receive( struct browse_ctx *bc, gnet_host_t *host, struct wrap_io *wio, - const char *vendor, guint32 flags); + const char *vendor, uint32 flags); struct bio_source *browse_host_io_source(struct browse_ctx *bc); void browse_host_dl_close(struct browse_ctx *bc); void browse_host_dl_search_closed(struct browse_ctx *bc, gnet_search_t sh);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/bh_upload.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/bh_upload.c
Changed
@@ -46,18 +46,20 @@ #include "guid.h" #include "version.h" +#include "g2/build.h" + #include "if/gnet_property.h" #include "if/gnet_property_priv.h" #include "lib/array.h" -#include "lib/header.h" -#include "lib/glib-missing.h" -#include "lib/gnet_host.h" #include "lib/concat.h" +#include "lib/gnet_host.h" #include "lib/halloc.h" +#include "lib/header.h" #include "lib/product.h" -#include "lib/unsigned.h" +#include "lib/pslist.h" #include "lib/stringify.h" +#include "lib/unsigned.h" #include "lib/url.h" #include "lib/walloc.h" @@ -72,6 +74,7 @@ */ #define BH_MAX_QHIT_SIZE 3500 /**< Flush hits larger than this */ +#define BH_MAX_QH2_SIZE 16384 /**< Flush hits larger than this */ #define BH_SCAN_AHEAD 100 /**< Amount of files scanned ahead */ #define BH_BUFSIZ 16384 /**< Buffer size for TX deflation */ @@ -102,16 +105,17 @@ const char *b_data; /**< Current data block */ size_t b_offset; /**< Offset in data block */ size_t b_size; /**< Size of the data block */ - guint file_index; /**< Current file index (iterator) */ + uint file_index; /**< Current file index (iterator) */ enum bh_state state; /**< Current state of the state machine */ - GSList *hits; /**< Pending query hits to send back */ + pslist_t *hits; /**< Pending query hits to send back */ special_upload_closed_t cb; /**< Callback to invoke when TX fully flushed */ - gpointer cb_arg; /**< Callback argument */ + void *cb_arg; /**< Callback argument */ }; static struct browse_host_upload * cast_to_browse_host_upload(struct special_upload *p) { + special_upload_browse_check(p); return (void *) p; } @@ -180,7 +184,7 @@ */ static ssize_t browse_host_read_html(struct special_upload *ctx, - gpointer const dest, size_t size) + void *const dest, size_t size) { static const char header = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\r\n" @@ -216,17 +220,17 @@ case BH_STATE_LIBRARY_INFO: if (!bh->b_data) { bh->w_buf_size = w_concat_strings(&bh->w_buf, - "<h1>", product_get_name(), "</h1>\r\n" + "<h1>", product_name(), "</h1>\r\n" "<h3>", version_get_string(), " sharing ", uint64_to_string(shared_files_scanned()), " file", - shared_files_scanned() == 1 ? "" : "s", + plural(shared_files_scanned()), " ", short_kb_size(shared_kbytes_scanned(), GNET_PROPERTY(display_metric_units)), " total</h3>\r\n" - "<ul>\r\n", (void *) 0); + "<ul>\r\n", NULL_PTR); bh->b_data = bh->w_buf; bh->b_size = bh->w_buf_size - 1; /* minus trailing NUL */ bh->b_offset = 0; @@ -256,7 +260,7 @@ } if (!bh->b_data) { - const shared_file_t *sf; + shared_file_t *sf; bh->file_index++; sf = shared_file_sorted(bh->file_index); @@ -275,12 +279,12 @@ { const char *dir; char *name; - + dir = shared_file_relative_path(sf); if (dir) { - name = h_strconcat(dir, "/", name_nfc, (void *) 0); + name = h_strconcat(dir, "/", name_nfc, NULL_PTR); } else { - name = deconstify_gchar(name_nfc); + name = deconstify_char(name_nfc); } html_size = 1 + html_escape(name, NULL, 0); @@ -301,7 +305,7 @@ short_html_size(file_size, GNET_PROPERTY(display_metric_units)), "</li>\r\n", - (void *) 0); + NULL_PTR); } else { char *escaped; @@ -313,7 +317,7 @@ " ", short_html_size(file_size, GNET_PROPERTY(display_metric_units)), - "</li>\r\n", (void *) 0); + "</li>\r\n", NULL_PTR); if (escaped != name_nfc) { HFREE_NULL(escaped); @@ -325,6 +329,7 @@ bh->b_size = bh->w_buf_size - 1; /* minus trailing NUL */ bh->b_offset = 0; } + shared_file_unref(&sf); } if (bh->b_data) @@ -351,14 +356,14 @@ break; case BH_STATE_EOF: - return p - cast_to_gchar_ptr(dest); + return p - cast_to_char_ptr(dest); case NUM_BH_STATES: g_assert_not_reached(); } } while (size > 0); - return p - cast_to_gchar_ptr(dest); + return p - cast_to_char_ptr(dest); } /** @@ -366,11 +371,25 @@ * Callback for qhit_build_results(). */ static void -browse_host_record_hit(gpointer data, size_t len, gpointer udata) +browse_host_record_hit(void *data, size_t len, void *udata) { struct browse_host_upload *bh = udata; - bh->hits = g_slist_prepend(bh->hits, gmsg_to_pmsg(data, len)); + special_upload_browse_check(udata); + bh->hits = pslist_prepend(bh->hits, gmsg_to_pmsg(data, len)); +} + +/** + * Enqueue /QH2 built as a message. + * Callback for g2_build_qh2_results(). + */ +static void +browse_host_record_qh2(pmsg_t *mb, void *udata) +{ + struct browse_host_upload *bh = udata; + + special_upload_browse_check(udata); + bh->hits = pslist_prepend(bh->hits, mb); } /** @@ -390,7 +409,7 @@ */ static ssize_t browse_host_read_qhits(struct special_upload *ctx, - gpointer const dest, size_t size) + void *const dest, size_t size) { struct browse_host_upload *bh = cast_to_browse_host_upload(ctx); size_t remain = size; @@ -401,11 +420,11 @@ */ if (NULL == bh->hits) { - GSList *files = NULL; + pslist_t *files = NULL, *sl; int i; for (i = 0; i < BH_SCAN_AHEAD; i++) { - const shared_file_t *sf; + shared_file_t *sf; do { /* Skip holes in indices */ @@ -415,8 +434,8 @@ if (SHARE_REBUILDING == sf || NULL == sf) break; - - files = g_slist_prepend(files, deconstify_gpointer(sf)); + + files = pslist_prepend(files, sf); } if (NULL == files) /* Did not find any more file to include */ @@ -426,15 +445,24 @@ * Now build the query hits containing the files we selected. */ - files = g_slist_reverse(files); /* Preserve order */ + files = pslist_reverse(files); /* Preserve order */ - qhit_build_results(files, i, BH_MAX_QHIT_SIZE, - browse_host_record_hit, bh, &blank_guid, FALSE, &zero_array); + if (bh->flags & BH_F_G2) { + g2_build_qh2_results(files, i, BH_MAX_QH2_SIZE, + browse_host_record_qh2, bh, &blank_guid, 0); + } else { + qhit_build_results(files, i, BH_MAX_QHIT_SIZE, + browse_host_record_hit, bh, &blank_guid, 0, &zero_array); + } g_assert(bh->hits != NULL); /* At least 1 hit enqueued */ - bh->hits = g_slist_reverse(bh->hits); /* Preserve order */ - gm_slist_free_null(&files); + bh->hits = pslist_reverse(bh->hits); /* Preserve order */ + PSLIST_FOREACH(files, sl) { + shared_file_t *sf = sl->data; + shared_file_unref(&sf); + } + pslist_free_null(&files); } /* @@ -450,7 +478,7 @@ remain -= r; if (r == 0 || 0 == pmsg_size(mb)) { - bh->hits = g_slist_remove(bh->hits, mb); + bh->hits = pslist_remove(bh->hits, mb); pmsg_free(mb); } } @@ -462,7 +490,7 @@ * Write data to the TX stack. */ static ssize_t -browse_host_write(struct special_upload *ctx, gconstpointer data, size_t size) +browse_host_write(struct special_upload *ctx, const void *data, size_t size) { struct browse_host_upload *bh = cast_to_browse_host_upload(ctx); @@ -475,10 +503,11 @@ * Callback invoked when the TX stack is fully flushed. */ static void -browse_tx_flushed(txdrv_t *unused_tx, gpointer arg) +browse_tx_flushed(txdrv_t *unused_tx, void *arg) { struct browse_host_upload *bh = arg; + special_upload_browse_check(arg); (void) unused_tx; /* @@ -493,7 +522,7 @@ */ static void browse_host_flush(struct special_upload *ctx, - special_upload_closed_t cb, gpointer arg) + special_upload_closed_t cb, void *arg) { struct browse_host_upload *bh = cast_to_browse_host_upload(ctx); @@ -516,18 +545,18 @@ * @return An initialized browse host context. */ static void -browse_host_close(struct special_upload *ctx, gboolean fully_served) +browse_host_close(struct special_upload *ctx, bool fully_served) { struct browse_host_upload *bh = cast_to_browse_host_upload(ctx); - GSList *sl; + pslist_t *sl; g_assert(bh); - for (sl = bh->hits; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(bh->hits, sl) { pmsg_t *mb = sl->data; pmsg_free(mb); } - gm_slist_free_null(&bh->hits); + pslist_free_null(&bh->hits); if (bh->w_buf) { wfree(bh->w_buf, bh->w_buf_size); @@ -542,12 +571,15 @@ if (fully_served) { if (bh->flags & BH_F_HTML) { gnet_prop_incr_guint32(PROP_HTML_BROWSE_SERVED); + } else if (bh->flags & BH_F_G2) { + gnet_prop_incr_guint32(PROP_G2_BROWSE_SERVED); } else if (bh->flags & BH_F_QHITS) { gnet_prop_incr_guint32(PROP_QHITS_BROWSE_SERVED); } } - wfree(bh, sizeof *bh); + ctx->magic = 0; + WFREE(bh); } /** @@ -566,7 +598,7 @@ */ struct special_upload * browse_host_open( - gpointer owner, + void *owner, struct gnutella_host *host, special_upload_writable_t writable, const struct tx_deflate_cb *deflate_cb, @@ -581,7 +613,8 @@ g_assert((flags & (BH_F_HTML|BH_F_QHITS)) != (BH_F_HTML|BH_F_QHITS)); WALLOC(bh); - bh->special.read = (flags & BH_F_HTML) + bh->special.magic = SPECIAL_UPLOAD_BROWSE_MAGIC; + bh->special.read = (flags & BH_F_HTML) ? browse_host_read_html : browse_host_read_qhits; bh->special.write = browse_host_write; @@ -614,7 +647,7 @@ struct tx_deflate_args args; txdrv_t *tx; - args.cq = callout_queue; + args.cq = cq_main(); args.cb = deflate_cb; args.nagle = FALSE; args.reduced = FALSE; @@ -625,7 +658,8 @@ tx = tx_make_above(bh->tx, tx_deflate_get_ops(), &args); if (tx == NULL) { tx_free(bh->tx); - link_cb->eof_remove(owner, "Cannot setup compressing TX stack"); + link_cb->eof_remove(owner, + "%s(): cannot setup compressing TX stack", G_STRFUNC); WFREE(bh); return NULL; } @@ -647,6 +681,8 @@ if (flags & BH_F_HTML) { gnet_prop_incr_guint32(PROP_HTML_BROWSE_COUNT); + } else if (flags & BH_F_G2) { + gnet_prop_incr_guint32(PROP_G2_BROWSE_COUNT); } else if (flags & BH_F_QHITS) { gnet_prop_incr_guint32(PROP_QHITS_BROWSE_COUNT); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/bh_upload.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/bh_upload.h
Changed
@@ -50,11 +50,12 @@ */ enum { - BH_F_DEFLATE = 1 << 0, /**< Deflate output */ - BH_F_GZIP = 1 << 1, /**< gzip output */ - BH_F_CHUNKED = 1 << 2, /**< Emit chunked data */ + BH_F_G2 = 1 << 5, /**< Use G2 query hits */ + BH_F_QHITS = 1 << 4, /**< Emit query hits */ BH_F_HTML = 1 << 3, /**< Emit HTML data */ - BH_F_QHITS = 1 << 4 /**< Emit Gnutella query hits */ + BH_F_CHUNKED = 1 << 2, /**< Emit chunked data */ + BH_F_GZIP = 1 << 1, /**< gzip output */ + BH_F_DEFLATE = 1 << 0 /**< Deflate output */ }; struct gnutella_host; @@ -63,7 +64,7 @@ struct wrap_io; struct special_upload *browse_host_open( - gpointer owner, + void *owner, struct gnutella_host *host, special_upload_writable_t writable, const struct tx_deflate_cb *deflate_cb,
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/bogons.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/bogons.c
Changed
@@ -38,12 +38,12 @@ #include "lib/ascii.h" #include "lib/file.h" -#include "lib/glib-missing.h" #include "lib/halloc.h" #include "lib/host_addr.h" #include "lib/iprange.h" #include "lib/parse.h" #include "lib/path.h" +#include "lib/str.h" #include "lib/tm.h" #include "lib/walloc.h" #include "lib/watcher.h" @@ -53,8 +53,6 @@ #include "lib/override.h" /* Must be the last header included */ -static const char bogon = "bogon"; - static const char bogons_file = "bogons.txt"; static const char bogons_what = "Bogus IP addresses"; @@ -66,11 +64,11 @@ * * @returns the amount of entries loaded. */ -static G_GNUC_COLD int +static int G_COLD bogons_load(FILE *f) { char line1024; - guint32 ip, netmask; + uint32 ip, netmask; int linenum = 0; int bits; iprange_err_t error; @@ -136,7 +134,7 @@ * addresses changed. */ static void -bogons_changed(const char *filename, gpointer unused_udata) +bogons_changed(const char *filename, void *unused_udata) { FILE *f; char buf80; @@ -150,8 +148,9 @@ bogons_close(); count = bogons_load(f); + fclose(f); - gm_snprintf(buf, sizeof(buf), "Reloaded %d bogus IP ranges.", count); + str_bprintf(buf, sizeof(buf), "Reloaded %d bogus IP ranges.", count); gcu_statusbar_message(buf); } @@ -168,32 +167,23 @@ * The selected file will then be monitored and a reloading will occur * shortly after a modification. */ -static G_GNUC_COLD void +static void G_COLD bogons_retrieve(void) { FILE *f; int idx; char *filename; file_path_t fp4; - unsigned length = 0; - char *tmp; + unsigned length; - file_path_set(&fplength++, settings_config_dir(), bogons_file); - tmp = get_folder_path(PRIVLIB_PATH, NULL); - if (tmp != NULL) - file_path_set(&fplength++, tmp, bogons_file); - - file_path_set(&fplength++, PRIVLIB_EXP, bogons_file); -#ifndef OFFICIAL_BUILD - file_path_set(&fplength++, PACKAGE_EXTRA_SOURCE_DIR, bogons_file); -#endif + length = settings_file_path_load(fp, bogons_file, SFP_DFLT); - g_assert(length <= G_N_ELEMENTS(fp)); + g_assert(length <= N_ITEMS(fp)); f = file_config_open_read_norename_chosen(bogons_what, fp, length, &idx); if (NULL == f) - goto done; + return; filename = make_pathname(fpidx.dir, fpidx.name); watcher_register(filename, bogons_changed, NULL); @@ -201,9 +191,6 @@ bogons_load(f); fclose(f); - -done: - HFREE_NULL(tmp); } /** @@ -229,7 +216,7 @@ * * @returns TRUE if found, and FALSE if not. */ -gboolean +bool bogons_check(const host_addr_t ha) { if G_UNLIKELY(NULL == bogons_db)
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/bogons.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/bogons.h
Changed
@@ -37,7 +37,7 @@ #include "common.h" #include "lib/host_addr.h" -gboolean bogons_check(const host_addr_t addr); +bool bogons_check(const host_addr_t addr); void bogons_init(void); void bogons_close(void);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/bsched.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/bsched.c
Changed
@@ -41,12 +41,16 @@ #include "if/core/wrap.h" /* For wrapped_io_t */ #include "if/gnet_property_priv.h" -#include "lib/glib-missing.h" +#include "lib/compat_sendfile.h" +#include "lib/entropy.h" #include "lib/halloc.h" -#include "lib/walloc.h" +#include "lib/inputevt.h" #include "lib/parse.h" +#include "lib/plist.h" +#include "lib/pslist.h" #include "lib/stringify.h" #include "lib/vmm.h" +#include "lib/walloc.h" #include "lib/override.h" /* Must be the last header included */ @@ -113,8 +117,8 @@ struct bsched { enum bsched_magic magic; tm_t last_period; /**< Last time we ran our period */ - GList *sources; /**< List of bio_source_t */ - GSList *stealers; /**< List of bsched_t stealing bw */ + plist_t *sources; /**< List of bio_source_t */ + pslist_t *stealers; /**< List of bsched_t stealing bw */ char *name; /**< Name, for tracing purposes */ int count; /**< Amount of sources */ int type; /**< Scheduling type */ @@ -139,7 +143,7 @@ int current_used; /**< Nb of active sources this period */ int bw_urgent; /**< Urgent b/w required in stealing */ int io_favours; /**< Amount of sources wanting favours */ - gboolean looped; /**< True when looped once over sources */ + unsigned looped:1; /**< True when looped once over sources */ }; /* @@ -148,9 +152,9 @@ static bsched_t *bws_setNUM_BSCHED_BWS; -static GSList *bws_list = NULL; -static GSList *bws_out_list = NULL; -static GSList *bws_in_list = NULL; +static pslist_t *bws_list = NULL; +static pslist_t *bws_out_list = NULL; +static pslist_t *bws_in_list = NULL; static int bws_out_ema = 0; static int bws_in_ema = 0; @@ -160,6 +164,7 @@ #define BW_OUT_GNET_MIN 128 /**< Minimum out bandwidth per Gnet connection */ #define BW_OUT_LEAF_MIN 32 /**< Minimum out bandwidth per leaf connection */ #define BW_UL_STALL_TIM 21600 /**< Hysteresis for upload stalling condition */ +#define BW_UL_RUN_TIME 3600 /**< Check period for running uploads */ #define BW_TCP_MSG 40 /**< Smallest size of a TCP message */ #define BW_UDP_MSG 28 /**< Minimal IP+UDP overhead for a UDP message */ @@ -190,7 +195,7 @@ * @param `period' is the scheduling period in ms. */ static bsched_t * -bsched_make(const char *name, int type, guint32 mode, +bsched_make(const char *name, int type, uint32 mode, int bandwidth, int period) { bsched_t *bs; @@ -223,10 +228,10 @@ static bsched_t * bsched_get(bsched_bws_t bws) { - guint i = (guint) bws; + uint i = (uint) bws; g_assert(i < NUM_BSCHED_BWS); - bsched_check(bws_seti); + bsched_check(bws_seti); return bws_seti; } @@ -240,11 +245,11 @@ static void bsched_free(bsched_t *bs) { - GList *iter; + plist_t *iter; bsched_check(bs); - - for (iter = bs->sources; iter; iter = g_list_next(iter)) { + + PLIST_FOREACH(bs->sources, iter) { bio_source_t *bio = iter->data; bio_check(bio); @@ -252,8 +257,8 @@ bio->bws = BSCHED_BWS_INVALID; /* Mark orphan source */ } - gm_list_free_null(&bs->sources); - gm_slist_free_null(&bs->stealers); + plist_free_null(&bs->sources); + pslist_free_null(&bs->stealers); HFREE_NULL(bs->name); bs->magic = 0; WFREE(bs); @@ -262,7 +267,7 @@ /** * Is bandwidth scheduler saturated currently? */ -gboolean +bool bsched_saturated(bsched_bws_t bws) { const bsched_t *bs = bsched_get(bws); @@ -271,34 +276,51 @@ return bs->bw_actual > bs->bw_max; } -gulong +/** + * @return amount of unused bandwidth in this scheduler during the + * last period, in bytes. + */ +uint +bsched_unused(bsched_bws_t bws) +{ + const bsched_t *bs = bsched_get(bws); + uint unused; + + if (!(bs->flags & BS_F_ENABLED)) /* Scheduler disabled */ + return BS_BW_MAX; + + unused = uint_saturate_sub(bs->bw_max, bs->bw_last_period); + return uint_saturate_sub(unused, bs->bw_urgent); +} + +ulong bsched_bps(bsched_bws_t bws) { const bsched_t *bs = bsched_get(bws); return bs->bw_last_period * 1000 / bs->period; } -gulong +ulong bsched_avg_bps(bsched_bws_t bws) { const bsched_t *bs = bsched_get(bws); return bs->bw_ema * 1000 / bs->period; } -gulong +ulong bsched_bw_per_second(bsched_bws_t bws) { const bsched_t *bs = bsched_get(bws); return bs->bw_per_second; } -gulong +ulong bsched_pct(bsched_bws_t bws) { return bsched_bps(bws) * 100 / (1 + bsched_bw_per_second(bws)); } -gulong +ulong bsched_avg_pct(bsched_bws_t bws) { return bsched_avg_bps(bws) * 100 / (1 + bsched_bw_per_second(bws)); @@ -332,14 +354,14 @@ bsched_add_stealer(bsched_bws_t bws, bsched_bws_t bws_stealer) { bsched_t *bs, *stealer; - + g_assert(bws != bws_stealer); bs = bsched_get(bws); stealer = bsched_get(bws_stealer); g_assert((bs->flags & BS_F_RW) == (stealer->flags & BS_F_RW)); - bs->stealers = g_slist_prepend(bs->stealers, stealer); + bs->stealers = pslist_prepend(bs->stealers, stealer); } /** @@ -350,13 +372,13 @@ { bsched_check(bs); - gm_slist_free_null(&bs->stealers); + pslist_free_null(&bs->stealers); } /** * Configure outband DHT traffic cross-stealing with Gnutella UDP */ -static G_GNUC_COLD void +static void G_COLD bsched_dht_cross_stealing(void) { bsched_add_stealer(BSCHED_BWS_GOUT_UDP, BSCHED_BWS_DHT_OUT); @@ -366,13 +388,13 @@ /** * Allow cross-stealing of unused bandwidth between HTTP/gnet. */ -G_GNUC_COLD void +void G_COLD bsched_config_steal_http_gnet(void) { - GSList *iter; + pslist_t *iter; - for (iter = bws_list; iter; iter = g_slist_next(iter)) { - bsched_bws_t bws = GPOINTER_TO_UINT(iter->data); + PSLIST_FOREACH(bws_list, iter) { + bsched_bws_t bws = pointer_to_uint(iter->data); bsched_reset_stealers(bsched_get(bws)); } @@ -416,12 +438,12 @@ /** * Allow cross-stealing of unused bandwidth between TCP and UDP gnet only. */ -G_GNUC_COLD void +void G_COLD bsched_config_steal_gnet(void) { - GSList *iter; + pslist_t *iter; - for (iter = bws_list; iter; iter = g_slist_next(iter)) { + PSLIST_FOREACH(bws_list, iter) { bsched_bws_t bws = GPOINTER_TO_UINT(iter->data); bsched_reset_stealers(bsched_get(bws)); } @@ -437,7 +459,7 @@ * This is called BEFORE settings_init(), bandwidth values are the default * values, not the configured ones. */ -G_GNUC_COLD void +void G_COLD bsched_early_init(void) { bws_setBSCHED_BWS_OUT = bsched_make("out", @@ -482,70 +504,70 @@ bws_setBSCHED_BWS_DHT_IN = bsched_make("DHT in", BS_T_STREAM, BS_F_READ, 0, 1000); - bws_list = g_slist_prepend(bws_list, - GUINT_TO_POINTER(BSCHED_BWS_LOOPBACK_IN)); - bws_list = g_slist_prepend(bws_list, - GUINT_TO_POINTER(BSCHED_BWS_PRIVATE_IN)); - bws_list = g_slist_prepend(bws_list, - GUINT_TO_POINTER(BSCHED_BWS_GLIN)); - bws_list = g_slist_prepend(bws_list, - GUINT_TO_POINTER(BSCHED_BWS_GIN)); - bws_list = g_slist_prepend(bws_list, - GUINT_TO_POINTER(BSCHED_BWS_GIN_UDP)); - bws_list = g_slist_prepend(bws_list, - GUINT_TO_POINTER(BSCHED_BWS_IN)); - bws_list = g_slist_prepend(bws_list, - GUINT_TO_POINTER(BSCHED_BWS_DHT_IN)); - bws_list = g_slist_prepend(bws_list, - GUINT_TO_POINTER(BSCHED_BWS_LOOPBACK_OUT)); - bws_list = g_slist_prepend(bws_list, - GUINT_TO_POINTER(BSCHED_BWS_PRIVATE_OUT)); - bws_list = g_slist_prepend(bws_list, - GUINT_TO_POINTER(BSCHED_BWS_GLOUT)); - bws_list = g_slist_prepend(bws_list, - GUINT_TO_POINTER(BSCHED_BWS_GOUT)); - bws_list = g_slist_prepend(bws_list, - GUINT_TO_POINTER(BSCHED_BWS_GOUT_UDP)); - bws_list = g_slist_prepend(bws_list, - GUINT_TO_POINTER(BSCHED_BWS_OUT)); - bws_list = g_slist_prepend(bws_list, - GUINT_TO_POINTER(BSCHED_BWS_DHT_OUT)); - - bws_in_list = g_slist_prepend(bws_in_list, - GUINT_TO_POINTER(BSCHED_BWS_LOOPBACK_IN)); - bws_in_list = g_slist_prepend(bws_in_list, - GUINT_TO_POINTER(BSCHED_BWS_PRIVATE_IN)); - bws_in_list = g_slist_prepend(bws_in_list, - GUINT_TO_POINTER(BSCHED_BWS_GLIN)); - bws_in_list = g_slist_prepend(bws_in_list, - GUINT_TO_POINTER(BSCHED_BWS_GIN)); - bws_in_list = g_slist_prepend(bws_in_list, - GUINT_TO_POINTER(BSCHED_BWS_GIN_UDP)); - bws_in_list = g_slist_prepend(bws_in_list, - GUINT_TO_POINTER(BSCHED_BWS_IN)); - bws_in_list = g_slist_prepend(bws_in_list, - GUINT_TO_POINTER(BSCHED_BWS_DHT_IN)); - - bws_out_list = g_slist_prepend(bws_out_list, - GUINT_TO_POINTER(BSCHED_BWS_LOOPBACK_OUT)); - bws_out_list = g_slist_prepend(bws_out_list, - GUINT_TO_POINTER(BSCHED_BWS_PRIVATE_OUT)); - bws_out_list = g_slist_prepend(bws_out_list, - GUINT_TO_POINTER(BSCHED_BWS_GLOUT)); - bws_out_list = g_slist_prepend(bws_out_list, - GUINT_TO_POINTER(BSCHED_BWS_GOUT)); - bws_out_list = g_slist_prepend(bws_out_list, - GUINT_TO_POINTER(BSCHED_BWS_GOUT_UDP)); - bws_out_list = g_slist_prepend(bws_out_list, - GUINT_TO_POINTER(BSCHED_BWS_OUT)); - bws_out_list = g_slist_prepend(bws_out_list, - GUINT_TO_POINTER(BSCHED_BWS_DHT_OUT)); + bws_list = pslist_prepend(bws_list, + uint_to_pointer(BSCHED_BWS_LOOPBACK_IN)); + bws_list = pslist_prepend(bws_list, + uint_to_pointer(BSCHED_BWS_PRIVATE_IN)); + bws_list = pslist_prepend(bws_list, + uint_to_pointer(BSCHED_BWS_GLIN)); + bws_list = pslist_prepend(bws_list, + uint_to_pointer(BSCHED_BWS_GIN)); + bws_list = pslist_prepend(bws_list, + uint_to_pointer(BSCHED_BWS_GIN_UDP)); + bws_list = pslist_prepend(bws_list, + uint_to_pointer(BSCHED_BWS_IN)); + bws_list = pslist_prepend(bws_list, + uint_to_pointer(BSCHED_BWS_DHT_IN)); + bws_list = pslist_prepend(bws_list, + uint_to_pointer(BSCHED_BWS_LOOPBACK_OUT)); + bws_list = pslist_prepend(bws_list, + uint_to_pointer(BSCHED_BWS_PRIVATE_OUT)); + bws_list = pslist_prepend(bws_list, + uint_to_pointer(BSCHED_BWS_GLOUT)); + bws_list = pslist_prepend(bws_list, + uint_to_pointer(BSCHED_BWS_GOUT)); + bws_list = pslist_prepend(bws_list, + uint_to_pointer(BSCHED_BWS_GOUT_UDP)); + bws_list = pslist_prepend(bws_list, + uint_to_pointer(BSCHED_BWS_OUT)); + bws_list = pslist_prepend(bws_list, + uint_to_pointer(BSCHED_BWS_DHT_OUT)); + + bws_in_list = pslist_prepend(bws_in_list, + uint_to_pointer(BSCHED_BWS_LOOPBACK_IN)); + bws_in_list = pslist_prepend(bws_in_list, + uint_to_pointer(BSCHED_BWS_PRIVATE_IN)); + bws_in_list = pslist_prepend(bws_in_list, + uint_to_pointer(BSCHED_BWS_GLIN)); + bws_in_list = pslist_prepend(bws_in_list, + uint_to_pointer(BSCHED_BWS_GIN)); + bws_in_list = pslist_prepend(bws_in_list, + uint_to_pointer(BSCHED_BWS_GIN_UDP)); + bws_in_list = pslist_prepend(bws_in_list, + uint_to_pointer(BSCHED_BWS_IN)); + bws_in_list = pslist_prepend(bws_in_list, + uint_to_pointer(BSCHED_BWS_DHT_IN)); + + bws_out_list = pslist_prepend(bws_out_list, + uint_to_pointer(BSCHED_BWS_LOOPBACK_OUT)); + bws_out_list = pslist_prepend(bws_out_list, + uint_to_pointer(BSCHED_BWS_PRIVATE_OUT)); + bws_out_list = pslist_prepend(bws_out_list, + uint_to_pointer(BSCHED_BWS_GLOUT)); + bws_out_list = pslist_prepend(bws_out_list, + uint_to_pointer(BSCHED_BWS_GOUT)); + bws_out_list = pslist_prepend(bws_out_list, + uint_to_pointer(BSCHED_BWS_GOUT_UDP)); + bws_out_list = pslist_prepend(bws_out_list, + uint_to_pointer(BSCHED_BWS_OUT)); + bws_out_list = pslist_prepend(bws_out_list, + uint_to_pointer(BSCHED_BWS_DHT_OUT)); } /** * Configure schedules with actual limits set by the user. */ -static G_GNUC_COLD void +static void G_COLD bsched_correct_init(void) { bsched_set_bandwidth(BSCHED_BWS_OUT, GNET_PROPERTY(bw_http_out)); @@ -563,7 +585,7 @@ /** * Initialize global bandwidth schedulers. */ -G_GNUC_COLD void +void G_COLD bsched_init(void) { bsched_correct_init(); /* Fix badnwidth using user-configured values */ @@ -585,20 +607,20 @@ /** * Discard global bandwidth schedulers. */ -G_GNUC_COLD void +void G_COLD bsched_close(void) { - GSList *iter; - guint i; + pslist_t *iter; + uint i; - for (iter = bws_list; iter; iter = g_slist_next(iter)) { - bsched_bws_t bws = GPOINTER_TO_UINT(iter->data); + PSLIST_FOREACH(bws_list, iter) { + bsched_bws_t bws = pointer_to_uint(iter->data); bsched_free(bsched_get(bws)); } - gm_slist_free_null(&bws_list); - gm_slist_free_null(&bws_out_list); - gm_slist_free_null(&bws_in_list); + pslist_free_null(&bws_list); + pslist_free_null(&bws_out_list); + pslist_free_null(&bws_in_list); for (i = 0; i < NUM_BSCHED_BWS; i++) { bws_seti = NULL; @@ -615,7 +637,7 @@ void bsched_set_peermode(node_peer_t mode) { - guint32 steal; + uint32 steal; switch (mode) { case NODE_P_NORMAL: @@ -749,18 +771,50 @@ * Disable all known bandwidth schedulers, so that any pending I/O can * go through as quickly as possible. */ -G_GNUC_COLD void +void G_COLD bsched_shutdown(void) { - GSList *sl; + pslist_t *sl; - for (sl = bws_list; sl; sl = g_slist_next(sl)) { - bsched_bws_t bws = GPOINTER_TO_UINT(sl->data); + PSLIST_FOREACH(bws_list, sl) { + bsched_bws_t bws = pointer_to_uint(sl->data); bsched_disable(bws); } } /** + * @return b/w per second configured for the scheduler to which this I/O + * source belongs. + */ +ulong +bio_bw_per_second(const bio_source_t *bio) +{ + const bsched_t *bs; + + bio_check(bio); + + bs = bsched_get(bio->bws); + return bs->bw_per_second; +} + +/** + * Trigger the "passive" callback to signify that a new timeslice has begun + * and that I/Os can resume on the source. + */ +static void +bio_trigger(const bio_source_t *bio) +{ + bio_check(bio); + g_assert(0 == bio->io_tag); + g_assert(bio->io_callback != NULL); + g_assert(bio->flags & BIO_F_PASSIVE); + wrap_io_check(bio->wio); + + (*bio->io_callback)(bio->io_arg, bio->wio->fd(bio->wio), + (bio->flags & BIO_F_READ) ? INPUT_EVENT_R : INPUT_EVENT_W); +} + +/** * Enable an I/O source. */ static void @@ -769,6 +823,8 @@ bio_check(bio); g_assert(0 == bio->io_tag); g_assert(bio->io_callback); /* "passive" sources not concerned */ + g_assert(0 == (bio->flags & BIO_F_PASSIVE)); + wrap_io_check(bio->wio); bio->io_tag = inputevt_add(bio->wio->fd(bio->wio), (bio->flags & BIO_F_READ) ? INPUT_EVENT_RX : INPUT_EVENT_WX, @@ -786,6 +842,7 @@ bio_get_bufsize(const bio_source_t *bio, enum socket_buftype type) { bio_check(bio); + wrap_io_check(bio->wio); return bio->wio->bufsize(bio->wio, type); } @@ -802,15 +859,20 @@ bio_check(bio); g_assert(bio->io_tag); g_assert(bio->io_callback); /* "passive" sources not concerned */ + g_assert(0 == (bio->flags & BIO_F_PASSIVE)); inputevt_remove(&bio->io_tag); } /** - * Add I/O callback to a "passive" I/O source. + * Add I/O callback to a "passive" I/O source, making it active. + * + * The source will be added to the input event dispatcher and the callback + * will be invoked as soon as something happens on that source (for instance + * it becomes readable, writable, or an exception occurs). */ void -bio_add_callback(bio_source_t *bio, inputevt_handler_t callback, gpointer arg) +bio_add_callback(bio_source_t *bio, inputevt_handler_t callback, void *arg) { bio_check(bio); g_assert(bio->io_callback == NULL); /* "passive" source */ @@ -818,12 +880,37 @@ bio->io_callback = callback; bio->io_arg = arg; + bio->flags &= ~BIO_F_PASSIVE; if (!(bsched_get(bio->bws)->flags & BS_F_NOBW)) bio_enable(bio); } /** + * Adds I/O callback to a "passive" I/O source, without making it active. + * + * The callback will be invoked with read/write events each time a new + * scheduling time slice begins (which should indicate that bandwidth is + * available for I/Os) but the source will not be added to the input event + * dispatcher. + * + * Typically that would be useful on never-blocking sources (like files, on + * which we would like to limit read/writes) or on UDP sockets where the + * kernel will not buffer data, hence making them always writable. + */ +void +bio_add_passive_callback(bio_source_t *bio, inputevt_handler_t cb, void *arg) +{ + bio_check(bio); + g_assert(bio->io_callback == NULL); /* "passive" source */ + g_assert(cb != NULL); + + bio->io_callback = cb; + bio->io_arg = arg; + bio->flags |= BIO_F_PASSIVE; /* Don't call bio_enable() */ +} + +/** * Remove I/O callback from I/O source. */ void @@ -835,6 +922,7 @@ if (bio->io_tag) bio_disable(bio); + bio->flags &= ~BIO_F_PASSIVE; bio->io_callback = NULL; bio->io_arg = NULL; } @@ -846,10 +934,10 @@ static void bsched_no_more_bandwidth(bsched_t *bs) { - GList *iter; + plist_t *iter; bsched_check(bs); - for (iter = bs->sources; iter; iter = g_list_next(iter)) { + PLIST_FOREACH(bs->sources, iter) { bio_source_t *bio = iter->data; bio_check(bio); @@ -867,10 +955,10 @@ static void bsched_clear_active(bsched_t *bs) { - GList *iter; + plist_t *iter; bsched_check(bs); - for (iter = bs->sources; iter; iter = g_list_next(iter)) { + PLIST_FOREACH(bs->sources, iter) { bio_source_t *bio = iter->data; bio_check(bio); @@ -888,8 +976,8 @@ static void bsched_begin_timeslice(bsched_t *bs) { - GList *iter; - GList *last = NULL; + plist_t *iter, *last = NULL; + pslist_t *trigger = NULL; double norm_factor; int count; unsigned bw_max; @@ -918,8 +1006,7 @@ if (bs->bw_stolen != 0) { if (GNET_PROPERTY(bsched_debug)) { g_debug("BSCHED %s: \"%s\" ignoring stolen %d byte%s", - G_STRFUNC, bs->name, bs->bw_stolen, - 1 == bs->bw_stolen ? "" : "s"); + G_STRFUNC, bs->name, bs->bw_stolen, plural(bs->bw_stolen)); } bs->bw_stolen = 0; } @@ -927,7 +1014,7 @@ if (GNET_PROPERTY(bsched_debug)) { g_debug("BSCHED %s: \"%s\" ignoring %d byte%s of capped b/w", G_STRFUNC, bs->name, bs->bw_last_capped, - 1 == bs->bw_last_capped ? "" : "s"); + plural(bs->bw_last_capped)); } bs->bw_last_capped = 0; } @@ -936,19 +1023,25 @@ norm_factor = 1000.0 / bs->period; bs->io_favours = 0; bw_max = bs->bw_max; + count = 0; - for (count = 0, iter = bs->sources; iter; iter = g_list_next(iter)) { + PLIST_FOREACH(bs->sources, iter) { bio_source_t *bio = iter->data; - guint32 actual; + uint32 actual; bio_check(bio); - last = iter; /* Remember last seen source for rotation */ + last = iter; /* Remember last seen source for rotation */ count++; /* Count them for assertion */ bio->flags &= ~(BIO_F_ACTIVE | BIO_F_USED); - if (bio->io_tag == 0 && bio->io_callback) - bio_enable(bio); + + if (bio->io_tag == 0 && bio->io_callback) { + if (bio->flags & BIO_F_PASSIVE) + trigger = pslist_prepend(trigger, bio); + else + bio_enable(bio); + } if (bio->flags & BIO_F_FAVOUR) bs->io_favours++; @@ -981,7 +1074,7 @@ actual = bio->bw_actual << BIO_EMA_SHIFT; bio->bw_fast_ema += (actual >> 1) - (bio->bw_fast_ema >> 1); bio->bw_slow_ema += (actual >> 6) - (bio->bw_slow_ema >> 6); - bio->bw_last_bps = (guint) (bio->bw_actual * norm_factor); + bio->bw_last_bps = (uint) (bio->bw_actual * norm_factor); bio->bw_actual = 0; } @@ -1000,8 +1093,8 @@ g_assert(bs->sources != NULL); bio = bs->sources->data; bio_check(bio); - bs->sources = g_list_remove(bs->sources, bio); - bs->sources = gm_list_insert_after(bs->sources, last, bio); + bs->sources = plist_remove(bs->sources, bio); + bs->sources = plist_insert_after(bs->sources, last, bio); } bs->flags &= ~(BS_F_NOBW|BS_F_FROZEN_SLOT|BS_F_CHANGED_BW|BS_F_CLEARED); @@ -1066,6 +1159,17 @@ bs->current_used = 0; bs->looped = FALSE; + + /* + * If there are passive callbacks installed, trigger them now. + */ + + while (trigger != NULL) { + bio_source_t *bio = trigger->data; + + trigger = pslist_remove(trigger, bio); + bio_trigger(bio); + } } /** @@ -1077,7 +1181,7 @@ bsched_check(bs); bio_check(bio); - bs->sources = g_list_append(bs->sources, bio); + bs->sources = plist_append(bs->sources, bio); bs->count++; bs->bw_slot = (bs->bw_max + bs->bw_stolen) / bs->count; @@ -1098,11 +1202,11 @@ bsched_bio_remove(bsched_bws_t bws, bio_source_t *bio) { bsched_t *bs; - + bs = bsched_get(bws); bio_check(bio); - bs->sources = g_list_remove(bs->sources, bio); + bs->sources = plist_remove(bs->sources, bio); bs->count--; if (bs->count) @@ -1123,12 +1227,14 @@ */ bio_source_t * bsched_source_add( - bsched_bws_t bws, wrap_io_t *wio, guint32 flags, - inputevt_handler_t callback, gpointer arg) + bsched_bws_t bws, wrap_io_t *wio, uint32 flags, + inputevt_handler_t callback, void *arg) { bio_source_t *bio; bsched_t *bs; + wrap_io_check(wio); + /* * Must insert reading sources in reading scheduler and writing ones * in a writing scheduler. @@ -1238,12 +1344,13 @@ bsched_t *bs; int available; int result; - gboolean capped = FALSE; - gboolean used; - gboolean active; - gboolean favoured; + bool capped = FALSE; + bool used; + bool active; + bool favoured; bio_check(bio); + wrap_io_check(bio->wio); /* Make sure socket still allocated */ bs = bsched_get(bio->bws); @@ -1253,7 +1360,12 @@ if (bs->flags & BS_F_NOBW) /* No more bandwidth */ return 0; /* Grant nothing */ - if (bio->io_callback && !bio->io_tag) /* Source already disabled */ + /* + * Source is already disabled if there is a callback and no tag on a + * non-passive source. + */ + + if (bio->io_callback && !bio->io_tag && !(bio->flags & BIO_F_PASSIVE)) return 0; /* No bandwidth available */ /* @@ -1555,10 +1667,10 @@ * * @return previous status: TRUE if it was favoured, FALSE otheriwse. */ -gboolean -bio_set_favour(bio_source_t *bio, gboolean on) +bool +bio_set_favour(bio_source_t *bio, bool on) { - gboolean old; + bool old; bio_check(bio); @@ -1595,7 +1707,7 @@ * errno set to EAGAIN. */ ssize_t -bio_write(bio_source_t *bio, gconstpointer data, size_t len) +bio_write(bio_source_t *bio, const void *data, size_t len) { size_t available; size_t amount; @@ -1779,7 +1891,7 @@ */ ssize_t bio_sendto(bio_source_t *bio, const gnet_host_t *to, - gconstpointer data, size_t len) + const void *data, size_t len) { size_t available; ssize_t r; @@ -1880,7 +1992,7 @@ g_assert(ctx); bio_check(bio); - g_assert(bio->wio); + wrap_io_check(bio->wio); g_assert(bio->flags & BIO_F_WRITE); g_assert(offset); g_assert(len > 0); @@ -1916,7 +2028,7 @@ if ( ctx->map == NULL || start < ctx->map_start || - start + amount > ctx->map_end + (fileoffset_t) (start + amount) > ctx->map_end ) { static const size_t min_map_size = 64 * 1024; size_t map_len, old_len; @@ -1938,7 +2050,7 @@ if ( map_len < min_map_size && - MAX_INT_VAL(fileoffset_t) - map_start >= min_map_size + (size_t) (MAX_INT_VAL(fileoffset_t) - map_start) >= min_map_size ) { map_len = min_map_size; } @@ -1983,9 +2095,9 @@ g_assert(start >= ctx->map_start); data = &datastart - ctx->map_start; - + g_assert(ctx->map_end > start); - amount = MIN(ctx->map_end - start, amount); + amount = MIN((size_t) (ctx->map_end - start), amount); r = s_write(out_fd, data, amount); switch (r) { @@ -2000,48 +2112,7 @@ } } #else /* !USE_MMAP */ -#ifdef USE_BSD_SENDFILE - /* - * The FreeBSD semantics for sendfile() differ from the Linux one: - * - * . FreeBSD sendfile() returns 0 on success, -1 on failure. - * . FreeBSD sendfile() returns the amount of written bytes via a parameter - * when EAGAIN. - * . FreeBSD sendfile() does not update the offset inplace. - * - * Emulate the Linux semantics: set `r' to the amount of bytes written, - * and update the `offset' variable. - */ - - { - fileoffset_t written = 0; - - r = sendfile(in_fd, out_fd, start, amount, NULL, &written, 0); - if ((ssize_t) -1 == r) { - if (is_temporary_error(errno)) - r = written > 0 ? (ssize_t) written : (ssize_t) -1; - } else { - r = amount; /* Everything written, but returns 0 if OK */ - } - if (r > 0) - *offset = start + r; - } - -#else /* !USE_BSD_SENDFILE */ - - r = sendfile(out_fd, in_fd, offset, amount); - - if (r >= 0 && *offset != start + r) { /* Paranoid, as usual */ - g_warning("FIXED SENDFILE returned offset: " - "was set to %s instead of %s (%zu byte%s written)", - uint64_to_string(*offset), uint64_to_string2(start + r), - r, r == 1 ? "" : "s"); - *offset = start + r; - } else if ((ssize_t) -1 == r) { - *offset = start; /* Paranoid: in case sendfile() touched it */ - } - -#endif /* USE_BSD_SENDFILE */ + r = compat_sendfile(out_fd, in_fd, offset, amount); #endif /* USE_MMAP */ if (r > 0) { @@ -2061,7 +2132,7 @@ * bandwidth constraints. */ ssize_t -bio_read(bio_source_t *bio, gpointer data, size_t len) +bio_read(bio_source_t *bio, void *data, size_t len) { size_t available; size_t amount; @@ -2164,7 +2235,7 @@ if (curlen > available) { slen = iovec_len(siov); /* Save for later restore */ - iovec_set_len(siov, + iovec_set_len(siov, iovec_len(siov) - (curlen - available) ); iovcnt = r + 1; @@ -2232,7 +2303,7 @@ * @return The amount of bytes written or (-1) if an error occurred. */ ssize_t -bws_write(bsched_bws_t bws, wrap_io_t *wio, gconstpointer data, size_t len) +bws_write(bsched_bws_t bws, wrap_io_t *wio, const void *data, size_t len) { bsched_t *bs; ssize_t r; @@ -2240,7 +2311,7 @@ bs = bsched_get(bws); g_assert(bs->flags & BS_F_WRITE); - g_assert(wio); + wrap_io_check(wio); g_assert(wio->write); g_assert(len <= INT_MAX); @@ -2257,7 +2328,7 @@ * average, we stick to the requested bandwidth rate. */ ssize_t -bws_read(bsched_bws_t bws, wrap_io_t *wio, gpointer data, size_t len) +bws_read(bsched_bws_t bws, wrap_io_t *wio, void *data, size_t len) { bsched_t *bs; ssize_t r; @@ -2265,7 +2336,7 @@ bs = bsched_get(bws); g_assert(bs->flags & BS_F_READ); - g_assert(wio); + wrap_io_check(wio); g_assert(wio->read); g_assert(len <= INT_MAX); @@ -2282,7 +2353,7 @@ * Account for read data from UDP. */ void -bws_udp_count_read(int len, gboolean dht) +bws_udp_count_read(int len, bool dht) { int count = BW_UDP_MSG + len; bsched_t *bs; @@ -2297,11 +2368,11 @@ * * @return whether bandwidth stealing was enabled. */ -gboolean -bws_allow_stealing(bsched_bws_t bws, gboolean allow) +bool +bws_allow_stealing(bsched_bws_t bws, bool allow) { bsched_t *bs; - gboolean was_disabled; + bool was_disabled; bs = bsched_get(bws); was_disabled = booleanize(bs->flags & BS_F_NO_STEALING); @@ -2319,11 +2390,11 @@ * * @return whether bandwidth stealing was ignored. */ -gboolean -bws_ignore_stolen(bsched_bws_t bws, gboolean ignore) +bool +bws_ignore_stolen(bsched_bws_t bws, bool ignore) { bsched_t *bs; - gboolean was_ignoring; + bool was_ignoring; bs = bsched_get(bws); was_ignoring = booleanize(bs->flags & BS_F_STOLEN_IGN); @@ -2342,11 +2413,11 @@ * * @return whether uniform allocation was already enabled. */ -gboolean -bws_uniform_allocation(bsched_bws_t bws, gboolean uniform) +bool +bws_uniform_allocation(bsched_bws_t bws, bool uniform) { bsched_t *bs; - gboolean was_uniform; + bool was_uniform; bs = bsched_get(bws); was_uniform = booleanize(bs->flags & BS_F_UNIFORM_BW); @@ -2391,7 +2462,7 @@ break; } if (BSCHED_BWS_INVALID == bws) { - g_warning("bs_socket: unhandled socket type %d", type); + g_warning("%s(): unhandled socket type %d", G_STRFUNC, type); bws = SOCK_CONN_OUTGOING == dir ? BSCHED_BWS_OUT : BSCHED_BWS_IN; } return bsched_get(bws); @@ -2497,7 +2568,7 @@ * The connection was closed, remotely if `remote' is true. */ void -bws_sock_closed(enum socket_type type, gboolean remote) +bws_sock_closed(enum socket_type type, bool remote) { bsched_t *bsout = bs_socket(SOCK_CONN_OUTGOING, type); bsched_t *bsin = bs_socket(SOCK_CONN_INCOMING, type); @@ -2524,7 +2595,7 @@ /** * Do we have the bandwidth to issue a new TCP/IP connection of `type'? */ -gboolean +bool bws_can_connect(enum socket_type type) { bsched_t *bsout = bs_socket(SOCK_CONN_OUTGOING, type); @@ -2568,7 +2639,7 @@ static void bsched_heartbeat(bsched_t *bs, tm_t *tv) { - GList *iter; + plist_t *iter; int delay; int overused; int theoric; @@ -2576,6 +2647,7 @@ int last_bw_max; int last_capped; int last_used; + time_delta_t elapsed; bsched_check(bs); @@ -2583,14 +2655,7 @@ * How much time elapsed since last call? */ - delay = (int) ((tv->tv_sec - bs->last_period.tv_sec) * 1000 + - (tv->tv_usec - bs->last_period.tv_usec) / 1000); - - if (GNET_PROPERTY(bsched_debug) > 9) - g_debug("BSCHED %s tv = %d,%d bs = %d,%d, delay = %d", - bs->name, (int) tv->tv_sec, (int) tv->tv_usec, - (int) bs->last_period.tv_sec, (int) bs->last_period.tv_usec, - delay); + delay = elapsed = tm_elapsed_ms(tv, &bs->last_period); /* * It is possible to get a negative delay (i.e. have the current time @@ -2608,14 +2673,16 @@ */ if (delay < bs->min_period) { - if (GNET_PROPERTY(bsched_debug) && bs->last_period.tv_sec) - g_warning("heartbeat (%s) noticed time jumped backwards (~%d ms)", - bs->name, bs->period - delay); + if (GNET_PROPERTY(bsched_debug) && bs->last_period.tv_sec) { + g_warning("%s(): \"%s\" noticed time jumped backwards (~%d ms)", + G_STRFUNC, bs->name, bs->period - delay); + } delay = bs->period; } else if (delay > bs->max_period) { - if (GNET_PROPERTY(bsched_debug) && bs->last_period.tv_sec) - g_warning("heartbeat (%s) noticed time jumped forwards (~%d ms)", - bs->name, delay - bs->period); + if (GNET_PROPERTY(bsched_debug) && bs->last_period.tv_sec) { + g_warning("%s(): \"%s\" noticed time jumped forwards (~%d ms)", + G_STRFUNC, bs->name, delay - bs->period); + } delay = bs->period; } @@ -2662,6 +2729,8 @@ overused -= bs->bw_stolen; /* Correct for computations below */ + entropy_harvest_single(VARLEN(overused)); + bs->bw_max = (int) (bs->bw_per_second / 1000.0 * bs->period_ema); /* @@ -2716,7 +2785,7 @@ last_used = 0; - for (iter = bs->sources; iter; iter = g_list_next(iter)) { + PLIST_FOREACH(bs->sources, iter) { bio_source_t *bio = iter->data; bio_check(bio); @@ -2743,7 +2812,7 @@ bs->count ? bs->bw_max / bs->count : 0, bs->count ? (bs->bw_max + bs->bw_capped) / bs->count : 0, bs->bw_per_second, bs->count, - bs->count == 1 ? "" : "s", bs->bw_actual * 1000.0 / delay); + plural(bs->count), bs->bw_actual * 1000.0 / delay); } /* @@ -2763,11 +2832,11 @@ static void bsched_stealbeat(bsched_t *bs) { - GSList *l; - GSList *all_used = NULL; /* List of bsched_t that used all b/w */ + pslist_t *l; + pslist_t *all_used = NULL; /* List of bsched_t that used all b/w */ int all_used_count = 0; /* Amount of bsched_t that used all b/w */ int all_favour_count = 0; /* I/O sources wanting favours */ - guint all_bw_count = 0; /* Sum of configured bandwidth */ + uint all_bw_count = 0; /* Sum of configured bandwidth */ int steal_count = 0; int underused; @@ -2820,9 +2889,9 @@ if (bs->flags & BS_F_WRITE) { int half_contribution = bs->count ? bs->bw_max / (2 * bs->count) : 0; - GList *bl; + plist_t *bl; - for (bl = bs->sources; bl && underused > 0; bl = g_list_next(bl)) { + for (bl = bs->sources; bl && underused > 0; bl = plist_next(bl)) { bio_source_t *bio = (bio_source_t *) bl->data; if (bio->io_callback != NULL && !(bio->flags & BIO_F_USED)) @@ -2831,6 +2900,8 @@ } #endif + entropy_harvest_single(VARLEN(underused)); + if (underused <= 0) /* Nothing to redistribute */ return; @@ -2838,14 +2909,14 @@ * Determine who used up all its bandwidth among our stealers. */ - for (l = bs->stealers; l; l = g_slist_next(l)) { + PSLIST_FOREACH(bs->stealers, l) { bsched_t *xbs = l->data; steal_count++; all_favour_count += xbs->io_favours; if (xbs->bw_last_period >= xbs->bw_max) { - all_used = g_slist_prepend(all_used, xbs); + all_used = pslist_prepend(all_used, xbs); all_used_count++; all_bw_count += xbs->bw_max; } @@ -2886,7 +2957,7 @@ */ if (all_favour_count != 0) { - for (l = bs->stealers; l; l = g_slist_next(l)) { + PSLIST_FOREACH(bs->stealers, l) { bsched_t *xbs = l->data; double amount; @@ -2905,10 +2976,10 @@ g_debug("BSCHED %s: \"%s\" giving %d bytes to \"%s\" " "(%d favour%s)", G_STRFUNC, bs->name, (int) amount, xbs->name, - xbs->io_favours, 1 == xbs->io_favours ? "" : "s"); + xbs->io_favours, plural(xbs->io_favours)); } } else if (all_used_count == 0) { - for (l = bs->stealers; l; l = g_slist_next(l)) { + PSLIST_FOREACH(bs->stealers, l) { bsched_t *xbs = l->data; xbs->bw_stolen += underused / steal_count; @@ -2917,7 +2988,7 @@ G_STRFUNC, bs->name, underused / steal_count, xbs->name); } } else { - for (l = all_used; l; l = g_slist_next(l)) { + PSLIST_FOREACH(all_used, l) { bsched_t *xbs = l->data; double amount; @@ -2938,7 +3009,7 @@ } done: - g_slist_free(all_used); + pslist_free(all_used); } /** @@ -2948,10 +3019,10 @@ bsched_timer(void) { tm_t tv; - GSList *l; + pslist_t *l; int out_used = 0; int in_used = 0; - gboolean read_data = FALSE; + bool read_data = FALSE; tm_now(&tv); @@ -2959,8 +3030,8 @@ * First pass: compute bandwidth used. */ - for (l = bws_list; l; l = g_slist_next(l)) { - bsched_bws_t bws = GPOINTER_TO_UINT(l->data); + PSLIST_FOREACH(bws_list, l) { + bsched_bws_t bws = pointer_to_uint(l->data); bsched_heartbeat(bsched_get(bws), &tv); } @@ -2969,8 +3040,8 @@ * have not used up all their quota. */ - for (l = bws_list; l; l = g_slist_next(l)) { - bsched_bws_t bws = GPOINTER_TO_UINT(l->data); + PSLIST_FOREACH(bws_list, l) { + bsched_bws_t bws = pointer_to_uint(l->data); bsched_stealbeat(bsched_get(bws)); } @@ -2978,8 +3049,8 @@ * Third pass: begin new timeslice. */ - for (l = bws_list; l; l = g_slist_next(l)) { - bsched_bws_t bws = GPOINTER_TO_UINT(l->data); + PSLIST_FOREACH(bws_list, l) { + bsched_bws_t bws = pointer_to_uint(l->data); bsched_begin_timeslice(bsched_get(bws)); } @@ -2987,8 +3058,8 @@ * Fourth pass: update the average bandwidth used. */ - for (l = bws_out_list; l; l = g_slist_next(l)) { - bsched_bws_t bws = GPOINTER_TO_UINT(l->data); + PSLIST_FOREACH(bws_out_list, l) { + bsched_bws_t bws = pointer_to_uint(l->data); bsched_t *bs = bsched_get(bws); out_used += (int) (bs->bw_last_period * 1000.0 / bs->period_ema); } @@ -2998,8 +3069,8 @@ if (GNET_PROPERTY(bsched_debug) > 3) g_debug("BSCHED outgoing b/w EMA = %d bytes/s", bws_out_ema); - for (l = bws_in_list; l; l = g_slist_next(l)) { - bsched_bws_t bws = GPOINTER_TO_UINT(l->data); + PSLIST_FOREACH(bws_in_list, l) { + bsched_bws_t bws = pointer_to_uint(l->data); bsched_t *bs = bsched_get(bws); in_used += (int) (bs->bw_last_period * 1000.0 / bs->period_ema); @@ -3007,6 +3078,7 @@ if (bs->flags & BS_F_DATA_READ) { read_data = TRUE; bs->flags &= ~BS_F_DATA_READ; + entropy_harvest_single(VARLEN(in_used)); } } @@ -3026,7 +3098,7 @@ inet_read_activity(); } -static gboolean +static bool true_expr(const char *expr) { if (GNET_PROPERTY(bsched_debug)) { @@ -3038,25 +3110,24 @@ #define noisy_check(expr) ((expr) ? true_expr(G_STRLOC ": " #expr) : 0) /** - * Needs very short description so that doxygen can parse the following - * list properly. - * - * Determine whether we have enough bandwidth to possibly become an - * ultra node: + * Determine whether we have enough bandwidth to possibly become an ultra node: * * -# Uploads must not be frequently stalling. + * -# If the servent is not sharing anything, use its bandwidth for ultra mode. * -# If bandwidth schedulers are enabled, leaf nodes must not be configured * to steal all the HTTP outgoing bandwidth, unless they disabled uploads. * -# If Gnet out scheduler is enabled, there must be at least BW_OUT_GNET_MIN * bytes per gnet connection. * -# Overall, there must be BW_OUT_LEAF_MIN bytes per configured leaf plus * BW_OUT_GNET_MIN bytes per gnet connection available. + * + * @return TRUE if we have enough bandwidth to become an ultra node. */ -gboolean +bool bsched_enough_up_bandwidth(void) { - static time_t last_stall; - guint32 total = 0; + static time_t last_stall, last_uploads; + uint32 total = 0; /* * Stalling uploads are an indication that the output bandwidth is @@ -3078,14 +3149,43 @@ if (noisy_check(delta_time(tm_time(), last_stall) < BW_UL_STALL_TIM)) return FALSE; /* 1. */ + /* + * Servents not sharing anything should be able to devote their outgoing + * bandwidth to serve as ultra nodes. + */ + + if (noisy_check(!upload_is_enabled())) + goto upload_bw_irrelevant; /* 2. */ + + if (noisy_check(delta_time(tm_time(), last_uploads) >= BW_UL_RUN_TIME)) { + if (0 != GNET_PROPERTY(ul_registered)) + last_uploads = tm_time(); + else + goto upload_bw_irrelevant; /* 2. */ + } + + /* + * Servent is uploading, make sure configured schedulers would not steal + * out all the HTTP bandwidth if promoted to ultra mode (since leaves + * take their bandwidth out of the configured HTTP limit). + */ + if ( noisy_check( GNET_PROPERTY(bws_glout_enabled) && GNET_PROPERTY(bws_out_enabled) && - GNET_PROPERTY(bw_gnet_lout) >= GNET_PROPERTY(bw_http_out) && - upload_is_enabled()) + GNET_PROPERTY(bw_gnet_lout) >= GNET_PROPERTY(bw_http_out) + ) ) - return FALSE; /* 2. */ + return FALSE; /* 3. */ + +upload_bw_irrelevant: + + /* + * If they configured outgoing limits for the Gnutella traffic, make + * sure we have a reasonable setup, compatible with the predicted ultra + * node usage. + */ if ( noisy_check( @@ -3093,7 +3193,7 @@ GNET_PROPERTY(bw_gnet_out) < BW_OUT_GNET_MIN * (GNET_PROPERTY(up_connections) + GNET_PROPERTY(max_connections)) / 2) ) - return FALSE; /* 3. */ + return FALSE; /* 4. */ if (GNET_PROPERTY(bws_gout_enabled)) total += GNET_PROPERTY(bw_gnet_out); @@ -3103,12 +3203,15 @@ else if (GNET_PROPERTY(bws_glout_enabled)) total += GNET_PROPERTY(bw_gnet_lout); + if (noisy_check(0 == total)) + return TRUE; /* No bandwidth limits configured */ + if ( noisy_check(total < (BW_OUT_GNET_MIN * GNET_PROPERTY(max_connections) + BW_OUT_LEAF_MIN * GNET_PROPERTY(max_leaves))) ) { - return FALSE; /* 4. */ + return FALSE; /* 5. */ } return TRUE;
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/bsched.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/bsched.h
Changed
@@ -60,27 +60,30 @@ void bsched_enable(bsched_bws_t bs); void bsched_disable(bsched_bws_t bs); void bsched_enable_all(void); -bio_source_t *bsched_source_add(bsched_bws_t bs, wrap_io_t *wio, guint32 flags, - inputevt_handler_t callback, gpointer arg); +bio_source_t *bsched_source_add(bsched_bws_t bs, wrap_io_t *wio, uint32 flags, + inputevt_handler_t callback, void *arg); void bsched_source_remove(bio_source_t *bio); void bsched_set_bandwidth(bsched_bws_t bs, int bandwidth); +ulong bio_bw_per_second(const bio_source_t *bio); void bio_add_callback(bio_source_t *bio, - inputevt_handler_t callback, gpointer arg); + inputevt_handler_t callback, void *arg); +void bio_add_passive_callback(bio_source_t *bio, + inputevt_handler_t cb, void *arg); void bio_remove_callback(bio_source_t *bio); unsigned bio_get_bufsize(const bio_source_t *bio, enum socket_buftype type); -gboolean bio_set_favour(bio_source_t *bio, gboolean on); +bool bio_set_favour(bio_source_t *bio, bool on); unsigned bio_add_allocated(bio_source_t *bio, unsigned bw); -ssize_t bio_write(bio_source_t *bio, gconstpointer data, size_t len); +ssize_t bio_write(bio_source_t *bio, const void *data, size_t len); ssize_t bio_writev(bio_source_t *bio, iovec_t *iov, int iovcnt); ssize_t bio_sendto(bio_source_t *bio, const gnet_host_t *to, - gconstpointer data, size_t len); + const void *data, size_t len); ssize_t bio_sendfile(sendfile_ctx_t *ctx, bio_source_t *bio, int in_fd, fileoffset_t *offset, size_t len); -ssize_t bio_read(bio_source_t *bio, gpointer data, size_t len); +ssize_t bio_read(bio_source_t *bio, void *data, size_t len); ssize_t bio_readv(bio_source_t *bio, iovec_t *iov, int iovcnt); ssize_t bws_write(bsched_bws_t bs, wrap_io_t *wio, - gconstpointer data, size_t len); -ssize_t bws_read(bsched_bws_t bs, wrap_io_t *wio, gpointer data, size_t len); + const void *data, size_t len); +ssize_t bws_read(bsched_bws_t bs, wrap_io_t *wio, void *data, size_t len); void bsched_timer(void); void bws_sock_connect(enum socket_type type); @@ -88,21 +91,22 @@ void bws_sock_accepted(enum socket_type type); void bws_sock_connect_timeout(enum socket_type type); void bws_sock_connect_failed(enum socket_type type); -void bws_sock_closed(enum socket_type type, gboolean remote); -gboolean bws_can_connect(enum socket_type type); +void bws_sock_closed(enum socket_type type, bool remote); +bool bws_can_connect(enum socket_type type); -void bws_udp_count_read(int len, gboolean dht); -gboolean bws_allow_stealing(bsched_bws_t bws, gboolean allow); -gboolean bws_ignore_stolen(bsched_bws_t bws, gboolean ignore); -gboolean bws_uniform_allocation(bsched_bws_t bws, gboolean uniform); +void bws_udp_count_read(int len, bool dht); +bool bws_allow_stealing(bsched_bws_t bws, bool allow); +bool bws_ignore_stolen(bsched_bws_t bws, bool ignore); +bool bws_uniform_allocation(bsched_bws_t bws, bool uniform); -gboolean bsched_enough_up_bandwidth(void); -gboolean bsched_saturated(bsched_bws_t bws); -gulong bsched_bps(bsched_bws_t bws); -gulong bsched_avg_bps(bsched_bws_t bws); -gulong bsched_pct(bsched_bws_t bws); -gulong bsched_avg_pct(bsched_bws_t bws); -gulong bsched_bw_per_second(bsched_bws_t bws); +bool bsched_enough_up_bandwidth(void); +bool bsched_saturated(bsched_bws_t bws); +uint bsched_unused(bsched_bws_t bws); +ulong bsched_bps(bsched_bws_t bws); +ulong bsched_avg_bps(bsched_bws_t bws); +ulong bsched_pct(bsched_bws_t bws); +ulong bsched_avg_pct(bsched_bws_t bws); +ulong bsched_bw_per_second(bsched_bws_t bws); int bsched_urgent(bsched_bws_t bws); void bsched_set_urgent(bsched_bws_t bws, int amount);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/clock.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/clock.c
Changed
@@ -36,17 +36,19 @@ #include "clock.h" -#include "lib/cq.h" -#include "lib/misc.h" -#include "lib/halloc.h" -#include "lib/walloc.h" - #include "if/gnet_property.h" #include "if/gnet_property_priv.h" +#include "lib/cq.h" +#include "lib/entropy.h" #include "lib/glib-missing.h" +#include "lib/halloc.h" +#include "lib/hevset.h" +#include "lib/misc.h" #include "lib/stats.h" #include "lib/tm.h" +#include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ #define REUSE_DELAY 10800 /**< 3 hours */ @@ -61,7 +63,7 @@ int precision; /**< The precision used for the last update */ }; -static GHashTable *used; /**< Records the IP address used */ +static hevset_t *used; /**< Records the IP address used */ /** * This container holds the data points (clock offset between the real UTC @@ -103,16 +105,15 @@ * Called from callout queue when it's time to destroy the record. */ static void -val_destroy(cqueue_t *unused_cq, gpointer obj) +val_destroy(cqueue_t *cq, void *obj) { struct used_val *v = obj; - (void) unused_cq; g_assert(v); g_assert(is_host_addr(v->addr)); - g_hash_table_remove(used, &v->addr); - v->cq_ev = NULL; + hevset_remove(used, &v->addr); + cq_zero(cq, &v->cq_ev); val_free(v); } @@ -129,7 +130,7 @@ WALLOC(v); v->addr = addr; v->precision = precision; - v->cq_ev = cq_insert(callout_queue, REUSE_DELAY * 1000, val_destroy, v); + v->cq_ev = cq_main_insert(REUSE_DELAY * 1000, val_destroy, v); return v; } @@ -151,16 +152,16 @@ void clock_init(void) { - used = g_hash_table_new(host_addr_hash_func, host_addr_eq_func); + used = hevset_create_any(offsetof(struct used_val, addr), + host_addr_hash_func, host_addr_hash_func2, host_addr_eq_func); datapoints = statx_make(); } static void -used_free_kv(gpointer unused_key, gpointer val, gpointer unused_x) +used_free_kv(void *val, void *unused_x) { struct used_val *v = val; - (void) unused_key; (void) unused_x; val_free(v); } @@ -171,8 +172,8 @@ void clock_close(void) { - g_hash_table_foreach(used, used_free_kv, NULL); - gm_hash_table_destroy_null(&used); + hevset_foreach(used, used_free_kv, NULL); + hevset_free_null(&used); statx_free(datapoints); } @@ -188,7 +189,7 @@ double min; double max; int i; - guint32 new_skew; + uint32 new_skew; int k; /* @@ -196,9 +197,14 @@ */ n = statx_n(datapoints); + + g_assert(n > 1); /* To be able to compute the standard deviation */ + avg = statx_avg(datapoints); sdev = statx_sdev(datapoints); + entropy_harvest_many(VARLEN(n), VARLEN(avg), VARLEN(sdev), NULL); + /* * Incrementally remove aberration points. */ @@ -206,6 +212,8 @@ for (k = 0; k < CLEAN_STEPS; k++) { double *value = statx_data(datapoints); + g_assert(value != NULL); /* Since n > 1, there are data points */ + if (GNET_PROPERTY(clock_debug) > 1) g_debug("CLOCK before #%d: n=%d avg=%g sdev=%g", k, n, avg, sdev); @@ -234,6 +242,10 @@ */ n = statx_n(datapoints); + + if (n < 2) + break; /* Not enough data to compute standard deviation */ + avg = statx_avg(datapoints); sdev = statx_sdev(datapoints); @@ -261,12 +273,12 @@ statx_clear(datapoints); - new_skew = GNET_PROPERTY(clock_skew) + (gint32) avg; + new_skew = GNET_PROPERTY(clock_skew) + (int32) avg; if (GNET_PROPERTY(clock_debug)) g_debug("CLOCK with n=%d avg=%g sdev=%g => SKEW old=%d new=%d", - n, avg, sdev, (gint32) GNET_PROPERTY(clock_skew), - (gint32) new_skew); + n, avg, sdev, (int32) GNET_PROPERTY(clock_skew), + (int32) new_skew); gnet_prop_set_guint32_val(PROP_CLOCK_SKEW, new_skew); } @@ -281,7 +293,7 @@ clock_update(time_t update, int precision, const host_addr_t addr) { time_t now; - gint32 delta; + int32 delta; struct used_val *v; g_assert(used); @@ -296,24 +308,27 @@ * end is running NTP. */ - if ((v = g_hash_table_lookup(used, &addr))) { + if ((v = hevset_lookup(used, &addr))) { if (precision && precision >= v->precision) return; val_reused(v, precision); } else { v = val_create(addr, precision); - g_hash_table_insert(used, &v->addr, v); + hevset_insert(used, v); } + entropy_harvest_small( + VARLEN(update), VARLEN(precision), VARLEN(addr), NULL); + now = tm_time(); - delta = delta_time(update, (now + (gint32) GNET_PROPERTY(clock_skew))); + delta = delta_time(update, (now + (int32) GNET_PROPERTY(clock_skew))); statx_add(datapoints, (double) (delta + precision)); statx_add(datapoints, (double) (delta - precision)); if (GNET_PROPERTY(clock_debug) > 1) g_debug("CLOCK skew=%d delta=%d +/-%d %s (n=%d avg=%g sdev=%g)", - (gint32) GNET_PROPERTY(clock_skew), + (int32) GNET_PROPERTY(clock_skew), delta, precision, host_addr_to_string(addr), statx_n(datapoints), statx_avg(datapoints), statx_sdev(datapoints)); @@ -330,7 +345,7 @@ if (GNET_PROPERTY(host_runs_ntp)) return stamp; - return stamp + (gint32) GNET_PROPERTY(clock_skew); + return stamp + (int32) GNET_PROPERTY(clock_skew); } /** @@ -342,7 +357,7 @@ if (GNET_PROPERTY(host_runs_ntp)) return stamp; - return stamp - (gint32) GNET_PROPERTY(clock_skew); + return stamp - (int32) GNET_PROPERTY(clock_skew); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/ctl.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/ctl.c
Changed
@@ -38,10 +38,11 @@ #include "whitelist.h" #include "lib/ascii.h" +#include "lib/halloc.h" +#include "lib/htable.h" #include "lib/iso3166.h" -#include "lib/glib-missing.h" #include "lib/misc.h" -#include "lib/halloc.h" +#include "lib/pslist.h" #include "lib/walloc.h" #include "if/gnet_property_priv.h" @@ -121,7 +122,7 @@ /** * Free parsed token and nullify holding variable. */ -static void +static void ctl_token_free_null(struct ctl_tok **tok_ptr) { struct ctl_tok *tok = *tok_ptr; @@ -249,7 +250,7 @@ if (flags & CTL_D_CACHE) *p++ = 'c'; if (flags & CTL_D_WHITELIST) *p++ = 'w'; if (flags & CTL_D_QHITS) *p++ = 'r'; - + *p++ = '\0'; return buf; } @@ -272,18 +273,14 @@ static unsigned ctl_get_flags(char opt) { -#define GET_KEY(i) (ctl_options(i).c) -#define FOUND(i) G_STMT_START { \ - return ctl_options(i).flag; \ - /* NOTREACHED */ \ -} G_STMT_END +#define GET(i) (ctl_options(i).c) +#define FOUND(i) return ctl_options(i).flag /* Perform a binary search to find ``opt'' */ - BINARY_SEARCH(char, opt, G_N_ELEMENTS(ctl_options), charcmp, - GET_KEY, FOUND); + BINARY_SEARCH(char, opt, N_ITEMS(ctl_options), charcmp, GET, FOUND); #undef FOUND -#undef GET_KEY +#undef GET return 0; /* Not found */ } @@ -335,17 +332,17 @@ } } -static GHashTable *ctl_by_country; /**< Options per country */ +static htable_t *ctl_by_country; /**< Options per country */ static unsigned ctl_all_flags; /**< Set of flags used */ /** * Parse a single country held in the token. * @return list containing the parsed country code, an empty list if invalid. */ -static GSList * +static pslist_t * ctl_parse_country(struct ctl_string *s, const struct ctl_tok *tok) { - guint16 code; + uint16 code; g_assert(CTL_TOK_ID == tok->type); @@ -356,17 +353,17 @@ return NULL; } - return g_slist_append(NULL, uint_to_pointer(code)); + return pslist_append(NULL, uint_to_pointer(code)); } /** * Parse a list of countries until closing brace. * @return list containing the parsed country code, an empty list if invalid. */ -static GSList * +static pslist_t * ctl_parse_countries(struct ctl_string *s) { - GSList *sl = NULL; + pslist_t *sl = NULL; for (;;) { struct ctl_tok *tok = ctl_next_token(s); @@ -379,7 +376,7 @@ ctl_token_free_null(&tok); goto out; case CTL_TOK_ID: - sl = g_slist_concat(sl, ctl_parse_country(s, tok)); + sl = pslist_concat(sl, ctl_parse_country(s, tok)); ctl_token_free_null(&tok); break; case CTL_TOK_EOF: @@ -418,15 +415,15 @@ * Parse a list entry. * @return TRUE when done with input. */ -static gboolean +static bool ctl_parse_list_entry(struct ctl_string *s) { struct ctl_tok *tok = ctl_next_token(s); - GSList *countries = NULL; - GSList *sl; + pslist_t *countries = NULL; + pslist_t *sl; char *opt = NULL; unsigned flags; - gboolean done = FALSE; + bool done = FALSE; switch (tok->type) { case CTL_TOK_EOF: done = TRUE; goto out; @@ -483,10 +480,10 @@ * Nevermind superseding, the latest parsed is the winner. */ - GM_SLIST_FOREACH(countries, sl) { + PSLIST_FOREACH(countries, sl) { unsigned code = pointer_to_uint(sl->data); - g_hash_table_replace(ctl_by_country, + htable_insert(ctl_by_country, uint_to_pointer(code), uint_to_pointer(flags)); ctl_all_flags |= flags; @@ -498,7 +495,7 @@ } out: - g_slist_free(countries); + pslist_free(countries); HFREE_NULL(opt); ctl_token_free_null(&tok); @@ -513,7 +510,7 @@ { while (!ctl_parse_list_entry(s)) { struct ctl_tok *tok = ctl_next_token(s); - gboolean done = TRUE; + bool done = TRUE; switch (tok->type) { case CTL_TOK_EOF: break; @@ -528,25 +525,12 @@ } /** - * Hashtable iterator callback returning TRUE. - */ -static gboolean -ctl_true(gpointer ukey, gpointer uvalue, gpointer udata) -{ - (void) ukey; - (void) uvalue; - (void) udata; - - return TRUE; -} - -/** * Reset limits. */ static void ctl_reset(void) { - g_hash_table_foreach_remove(ctl_by_country, ctl_true, NULL); + htable_clear(ctl_by_country); ctl_all_flags = 0; } @@ -602,10 +586,10 @@ /** * Are specified flags all set for the country to which the IP address belongs? */ -gboolean +bool ctl_limit(const host_addr_t ha, unsigned flags) { - guint16 code; + uint16 code; unsigned cflags; /* @@ -629,7 +613,7 @@ return FALSE; cflags = pointer_to_uint( - g_hash_table_lookup(ctl_by_country, uint_to_pointer(code))); + htable_lookup(ctl_by_country, uint_to_pointer(code))); if ((cflags & flags) != flags) return FALSE; @@ -646,7 +630,7 @@ void ctl_init(void) { - ctl_by_country = g_hash_table_new(NULL, NULL); + ctl_by_country = htable_create(HASH_KEY_SELF, 0); } /** @@ -656,7 +640,7 @@ ctl_close(void) { ctl_reset(); - gm_hash_table_destroy_null(&ctl_by_country); + htable_free_null(&ctl_by_country); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/ctl.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/ctl.h
Changed
@@ -69,7 +69,7 @@ void ctl_init(void); void ctl_close(void); void ctl_parse(const char *s); -gboolean ctl_limit(const host_addr_t ha, unsigned flags); +bool ctl_limit(const host_addr_t ha, unsigned flags); #endif /* _core_ctl_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/dh.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/dh.c
Changed
@@ -42,7 +42,9 @@ #include "lib/atoms.h" #include "lib/glib-missing.h" +#include "lib/htable.h" #include "lib/misc.h" +#include "lib/stringify.h" #include "lib/tm.h" #include "lib/walloc.h" @@ -60,18 +62,18 @@ * Information about query hits received. */ typedef struct dqhit { - guint32 msg_recv; /**< Amount of individual messages we got */ - guint32 msg_queued; /**< # of messages queued */ - guint32 hits_recv; /**< Total amount of results we saw */ - guint32 hits_sent; /**< Total amount of results we sent back */ - guint32 hits_queued; /**< Amount of hits queued */ + uint32 msg_recv; /**< Amount of individual messages we got */ + uint32 msg_queued; /**< # of messages queued */ + uint32 hits_recv; /**< Total amount of results we saw */ + uint32 hits_sent; /**< Total amount of results we sent back */ + uint32 hits_queued; /**< Amount of hits queued */ } dqhit_t; /* * Meta-information about the query hit message. */ struct dh_pmsg_info { - guint32 hits; /**< Amount of query hits held in message */ + uint32 hits; /**< Amount of query hits held in message */ }; /** @@ -92,16 +94,16 @@ * * The keys are MUIDs (GUID atoms), the values are the dqhit_t object. */ -static GHashTable *by_muid = NULL; -static GHashTable *by_muid_old = NULL; +static htable_t *by_muid = NULL; +static htable_t *by_muid_old = NULL; static time_t last_rotation; /** * Hashtable iteration callback to free the MUIDs in the `by_muid' table, * and the associated dqhit_t objects. */ -static gboolean -free_muid_true(gpointer key, gpointer value, gpointer unused_udata) +static bool +free_muid_true(const void *key, void *value, void *unused_udata) { (void) unused_udata; atom_guid_free(key); @@ -113,24 +115,23 @@ * Clear specified hash table. */ static void -dh_table_clear(GHashTable *ht) +dh_table_clear(htable_t *ht) { g_assert(ht != NULL); - g_hash_table_foreach_remove(ht, free_muid_true, NULL); + htable_foreach_remove(ht, free_muid_true, NULL); } /** * Free specified hash table. */ static void -dh_table_free(GHashTable **ptr) +dh_table_free(htable_t **ptr) { if (*ptr) { - GHashTable *ht = *ptr; - g_hash_table_foreach_remove(ht, free_muid_true, NULL); - g_hash_table_destroy(ht); - *ptr = NULL; + htable_t *ht = *ptr; + htable_foreach_remove(ht, free_muid_true, NULL); + htable_free_null(ptr); } } @@ -142,9 +143,9 @@ static dqhit_t * dh_locate(const struct guid *muid) { - gboolean found = FALSE; - gpointer key; - gpointer value; + bool found = FALSE; + const void *key; + void *value; if (NULL == by_muid_old) return NULL; /* DH layer shutdown occurred already */ @@ -155,16 +156,16 @@ * for this query. */ - found = g_hash_table_lookup_extended(by_muid_old, muid, &key, &value); + found = htable_lookup_extended(by_muid_old, muid, &key, &value); if (found) { - g_hash_table_remove(by_muid_old, key); - g_assert(!g_hash_table_lookup(by_muid, key)); - g_hash_table_insert(by_muid, key, value); + htable_remove(by_muid_old, key); + g_assert(!htable_contains(by_muid, key)); + htable_insert(by_muid, key, value); return value; } - return g_hash_table_lookup(by_muid, muid); + return htable_lookup(by_muid, muid); } /** @@ -180,7 +181,7 @@ WALLOC0(dh); key = atom_guid_get(muid); - gm_hash_table_insert_const(by_muid, key, dh); + htable_insert(by_muid, key, dh); return dh; } @@ -209,7 +210,7 @@ void dh_timer(time_t now) { - GHashTable *tmp; + htable_t *tmp; if (delta_time(now, last_rotation) < DH_HALF_LIFE) return; @@ -226,16 +227,17 @@ last_rotation = now; - if (GNET_PROPERTY(dh_debug) > 19) - g_debug("DH rotated tables, current has %d, old has %d", - g_hash_table_size(by_muid), g_hash_table_size(by_muid_old)); + if (GNET_PROPERTY(dh_debug) > 19) { + g_debug("DH rotated tables, current has %zu, old has %zu", + htable_count(by_muid), htable_count(by_muid_old)); + } } /** * Free routine for query hit message. */ static void -dh_pmsg_free(pmsg_t *mb, gpointer arg) +dh_pmsg_free(pmsg_t *mb, void *arg) { struct dh_pmsg_info *pmi = arg; const struct guid *muid; @@ -281,7 +283,7 @@ * message on the floor or forward it. */ static enum dh_drop -dh_can_forward(dqhit_t *dh, mqueue_t *mq, gboolean test) +dh_can_forward(dqhit_t *dh, mqueue_t *mq, bool test) { const char *teststr = test ? "test " : ""; @@ -449,9 +451,9 @@ g_assert(dh != NULL); /* Must have called dh_got_results() first! */ if (GNET_PROPERTY(dh_debug) > 19) { - g_debug("DH %s got %d hit%s: " + g_debug("DH #%s got %d hit%s: " "msg=%u, hits_recv=%u, hits_sent=%u, hits_queued=%u", - guid_hex_str(muid), count, count == 1 ? "" : "s", + guid_hex_str(muid), count, plural(count), dh->msg_recv, dh->hits_recv, dh->hits_sent, dh->hits_queued); } @@ -505,17 +507,38 @@ */ if (GNET_PROPERTY(guess_server_debug) > 19) { - g_debug("GUESS sending %d hit%s (%s) for %s to %s", - count, 1 == count ? "" : "s", + g_debug("GUESS sending %d hit%s (%s) for #%s to %s", + count, plural(count), + NODE_CAN_SR_UDP(dest) ? "reliably" : NODE_CAN_INFLATE(dest) ? "possibly deflated" : "uncompressed", guid_hex_str(muid), node_infostr(dest)); } - mb = gmsg_split_to_deflated_pmsg(&src->header, src->data, - src->size + GTA_HEADER_SIZE); + /* + * Attempt to compress query hit if the destination supports it. + * + * If we're going to send the hit using semi-reliable UDP, there's + * no need to compress beforehand, since the transport layer will + * attempt its own compression anyway. + */ + + if (!NODE_CAN_SR_UDP(dest) && NODE_CAN_INFLATE(dest)) { + mb = gmsg_split_to_deflated_pmsg(&src->header, src->data, + src->size + GTA_HEADER_SIZE); + + if (gnutella_header_get_ttl(pmsg_start(mb)) & GTA_UDP_DEFLATED) + gnet_stats_inc_general(GNR_UDP_TX_COMPRESSED); + } else { + mb = gmsg_split_to_pmsg(&src->header, src->data, + src->size + GTA_HEADER_SIZE); + } + mbe = pmsg_clone_extend(mb, dh_pmsg_free, pmi); pmsg_free(mb); + if (NODE_CAN_SR_UDP(dest)) + pmsg_mark_reliable(mbe); + mq_udp_putq(mq, mbe, &to); } else { mb = gmsg_split_to_pmsg_extend(&src->header, src->data, @@ -523,8 +546,8 @@ mq_tcp_putq(mq, mb, src); if (GNET_PROPERTY(dh_debug) > 19) { - g_debug("DH enqueued %d hit%s for %s to %s", - count, count == 1 ? "" : "s", guid_hex_str(muid), + g_debug("DH enqueued %d hit%s for #%s to %s", + count, plural(count), guid_hex_str(muid), node_infostr(dest)); } } @@ -552,7 +575,7 @@ /** * If we had to route hits to the specified node destination, would we? */ -gboolean +bool dh_would_route(const struct guid *muid, gnutella_node_t *dest) { dqhit_t *dh; @@ -571,18 +594,18 @@ /** * Initialize dynamic hits. */ -G_GNUC_COLD void +void G_COLD dh_init(void) { - by_muid = g_hash_table_new(guid_hash, guid_eq); - by_muid_old = g_hash_table_new(guid_hash, guid_eq); + by_muid = htable_create(HASH_KEY_FIXED, GUID_RAW_SIZE); + by_muid_old = htable_create(HASH_KEY_FIXED, GUID_RAW_SIZE); last_rotation = tm_time(); } /** * Cleanup data structures used by dynamic querying. */ -G_GNUC_COLD void +void G_COLD dh_close(void) { dh_table_free(&by_muid);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/dh.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/dh.h
Changed
@@ -50,7 +50,7 @@ void dh_timer(time_t now); void dh_route( struct gnutella_node *src, struct gnutella_node *dest, int count); -gboolean dh_would_route(const struct guid *muid, struct gnutella_node *dest); +bool dh_would_route(const struct guid *muid, struct gnutella_node *dest); #endif /* _core_dh_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/dime.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/dime.c
Changed
@@ -38,6 +38,8 @@ #include "dime.h" #include "lib/endian.h" +#include "lib/mempcpy.h" +#include "lib/stringify.h" #include "lib/walloc.h" #include "lib/override.h" @@ -65,10 +67,10 @@ const char *options; const char *type; const char *id; - guint32 data_length; - guint16 options_length; - guint16 type_length; - guint16 id_length; + uint32 data_length; + uint16 options_length; + uint16 type_length; + uint16 id_length; unsigned char flags; unsigned char version; @@ -99,18 +101,18 @@ } void -dime_list_free(GSList **list_ptr) +dime_list_free(pslist_t **list_ptr) { - GSList *list = *list_ptr; + pslist_t *list = *list_ptr; if (list) { - GSList *iter; + pslist_t *iter; - for (iter = list; NULL != iter; iter = g_slist_next(iter)) { + PSLIST_FOREACH(list, iter) { struct dime_record *record = iter->data; dime_record_free(&record); } - g_slist_free(list); + pslist_free(list); *list_ptr = NULL; } } @@ -129,7 +131,7 @@ */ static void dime_fill_record_header(const struct dime_record *record, - char *data, size_t size, guint flags) + char *data, size_t size, uint flags) { unsigned char value; @@ -155,11 +157,12 @@ { size_t pad; - g_assert(NULL != src || 0 == size); + g_assert(NULL != src || 0 == size); if (size > 0) { + void *p; pad = dime_ceil(size) - size; - memcpy(dst, src, size); - memset(&dstsize, 0, pad); + p = mempcpy(dst, src, size); + memset(p, 0, pad); } else { pad = 0; } @@ -168,7 +171,7 @@ size_t dime_create_record(const struct dime_record *record, - char **data_ptr, gboolean first, gboolean last) + char **data_ptr, bool first, bool last) { size_t size; @@ -180,7 +183,7 @@ if (data_ptr) { char *data0, *data; - guint flags; + uint flags; data0 = g_malloc(size); data = data0; @@ -228,7 +231,7 @@ (header->flags & DIME_F_MB) ? " MB" : "", (header->flags & DIME_F_ME) ? " ME" : "", (header->flags & DIME_F_CF) ? " CF" : "", - announced, dime_ceil(announced), real, 1 == real ? "" : "s"); + announced, dime_ceil(announced), real, plural(real)); } /** @@ -244,7 +247,7 @@ { const char * const data0 = data; size_t n; - + g_assert(data); g_assert(header); @@ -252,13 +255,13 @@ if (size < n) { goto failure; } - + header->version = peek_u8(&data0) >> 3; if (DIME_VERSION != header->version) { - g_warning("dime_parse_record_header(): Cannot parse dime version %u, " + g_warning("%s(): cannot parse dime version %u, " "only version %u is supported", - header->version, DIME_VERSION); + G_STRFUNC, header->version, DIME_VERSION); goto failure; } @@ -317,19 +320,19 @@ return 0; } -GSList * +pslist_t * dime_parse_records(const char *data, size_t size) { const char * const data0 = data; - GSList *list = NULL; + pslist_t *list = NULL; for (;;) { struct dime_record *record; size_t ret; - + record = dime_record_alloc(); - list = g_slist_prepend(list, record); - + list = pslist_prepend(list, record); + ret = dime_parse_record_header(data, size, record); if (0 == ret) { goto error; @@ -348,7 +351,7 @@ } } - return g_slist_reverse(list); + return pslist_reverse(list); error: @@ -356,7 +359,7 @@ return NULL; } -gboolean +bool dime_record_set_data(struct dime_record *record, const void *data, size_t size) { g_return_val_if_fail(record, FALSE); @@ -366,38 +369,38 @@ */ g_return_val_if_fail(NULL != data || 0 == size, FALSE); #endif - g_return_val_if_fail(size < (guint32)-1, FALSE); + g_return_val_if_fail(size < (uint32)-1, FALSE); record->data = data; record->data_length = size; return TRUE; } - -gboolean + +bool dime_record_set_id(struct dime_record *record, const char *id) { size_t length; - + g_return_val_if_fail(record, FALSE); length = id ? strlen(id) : 0; - g_return_val_if_fail(length < (guint16)-1, FALSE); + g_return_val_if_fail(length < (uint16)-1, FALSE); record->id = id; record->id_length = length; return TRUE; } -static gboolean +static bool dime_record_set_type(struct dime_record *record, enum dime_type_t type_t, const char *type) { size_t length; - + g_return_val_if_fail(record, FALSE); length = type ? strlen(type) : 0; - g_return_val_if_fail(length < (guint16)-1, FALSE); + g_return_val_if_fail(length < (uint16)-1, FALSE); record->type = type; record->type_length = length; @@ -405,13 +408,13 @@ return TRUE; } -gboolean +bool dime_record_set_type_uri(struct dime_record *record, const char *type) { return dime_record_set_type(record, DIME_T_URI, type); } -gboolean +bool dime_record_set_type_mime(struct dime_record *record, const char *type) { return dime_record_set_type(record, DIME_T_MIME, type);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/dime.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/dime.h
Changed
@@ -39,21 +39,22 @@ #include "common.h" struct dime_record; +struct pslist; struct dime_record *dime_record_alloc(void); void dime_record_free(struct dime_record **record_ptr); size_t dime_create_record(const struct dime_record *record, - char **data_ptr, gboolean first, gboolean last); + char **data_ptr, bool first, bool last); -gboolean dime_record_set_data(struct dime_record *record, +bool dime_record_set_data(struct dime_record *record, const void *data, size_t size); -gboolean dime_record_set_id(struct dime_record *record, const char *id); -gboolean dime_record_set_type_uri(struct dime_record *, const char *type); -gboolean dime_record_set_type_mime(struct dime_record *, const char *type); +bool dime_record_set_id(struct dime_record *record, const char *id); +bool dime_record_set_type_uri(struct dime_record *, const char *type); +bool dime_record_set_type_mime(struct dime_record *, const char *type); -void dime_list_free(GSList **list_ptr); -GSList *dime_parse_records(const char *data, size_t size); +void dime_list_free(struct pslist **list_ptr); +struct pslist *dime_parse_records(const char *data, size_t size); const char *dime_record_type(const struct dime_record *record); size_t dime_record_type_length(const struct dime_record *record);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/dmesh.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/dmesh.c
Changed
@@ -61,14 +61,19 @@ #include "lib/concat.h" #include "lib/cq.h" #include "lib/endian.h" +#include "lib/entropy.h" #include "lib/file.h" #include "lib/getdate.h" -#include "lib/glib-missing.h" #include "lib/halloc.h" +#include "lib/hashing.h" #include "lib/hashlist.h" #include "lib/header.h" +#include "lib/hikset.h" +#include "lib/htable.h" #include "lib/parse.h" -#include "lib/random.h" +#include "lib/pslist.h" +#include "lib/shuffle.h" +#include "lib/str.h" #include "lib/strtok.h" #include "lib/timestamp.h" #include "lib/tm.h" @@ -86,14 +91,14 @@ * It is implemented as a big hash table, where SHA1 are keys, each value * being a struct dmesh pointer. */ -static GHashTable *mesh = NULL; +static hikset_t *mesh = NULL; struct dmesh { /**< A download mesh bucket */ list_t *entries; /**< The download mesh entries, dmesh_entry data */ - GHashTable *by_host; /**< Entries indexed by host (IP:port) */ - GHashTable *by_guid; /**< Entries indexed by GUID (firewalled entries) */ + htable_t *by_host; /**< Entries indexed by host (IP:port) */ + htable_t *by_guid; /**< Entries indexed by GUID (firewalled entries) */ time_t last_update; /**< Timestamp of last insert/expire in the mesh */ - const struct sha1 *sha1; /**< The SHA1 of this mesh */ + const sha1_t *sha1; /**< The SHA1 of this mesh */ }; struct dmesh_entry { @@ -104,16 +109,17 @@ dmesh_fwinfo_t fwh; /**< Firewalled host */ } e; hash_list_t *bad; /**< Keeps track of IPs reporting entry as bad */ - guint8 good; /**< Whether marked as being a good entry */ - guint8 fw_entry; /**< Whether entry is that of a firewalled host */ + uint8 good; /**< Whether marked as being a good entry */ + uint8 fw_entry; /**< Whether entry is that of a firewalled host */ }; #define MAX_LIFETIME 43200 /**< half a day */ #define MAX_LIBLIFETIME 3600 /**< 1 hour for shared/seeded files */ #define MAX_ENTRIES 256 /**< Max amount of entries kept per SHA1 */ -#define MIN_BAD_REPORT 2 /**< Don't ban before that many X-Nalt */ +#define MIN_BAD_REPORT 3 /**< Don't ban before that many X-Nalt */ #define DMESH_CALLOUT 5000 /**< Callout heartbeat every 5 seconds */ +#define DMESH_BAN_VETO 300 /**< 5 minutes, to keep banned entry */ #define EXPIRE_DELAY 600 /**< 10 minutes after last update */ #define FW_MAX_PROXIES 4 /**< At most 4 push-proxies */ @@ -135,7 +141,7 @@ * * The table is persisted at regular intervals. */ -static GHashTable *ban_mesh = NULL; +static hikset_t *ban_mesh = NULL; struct dmesh_banned { dmesh_urlinfo_t *info; /**< The banned URL (same as key) */ @@ -145,12 +151,12 @@ }; typedef void (*dmesh_add_cb)( - const struct sha1 *sha1, host_addr_t addr, guint16 port, gpointer udata); + const struct sha1 *sha1, host_addr_t addr, uint16 port, void *udata); /** * This table stores the banned entries by SHA1. */ -static GHashTable *ban_mesh_by_sha1 = NULL; +static htable_t *ban_mesh_by_sha1 = NULL; #define BAN_LIFETIME 7200 /**< 2 hours */ @@ -164,16 +170,15 @@ /** * Hash a URL info. */ -static guint -urlinfo_hash(gconstpointer key) +static uint +urlinfo_hash(const void *key) { const dmesh_urlinfo_t *info = key; - guint hash; + uint hash; - hash = host_addr_hash(info->addr); - hash ^= ((guint32) info->port << 16) | info->port; - hash ^= info->idx; - hash ^= g_str_hash(info->name); + hash = host_addr_port_hash(info->addr, info->port); + hash += integer_hash_fast(info->idx); + hash ^= string_mix_hash(info->name); return hash; } @@ -182,26 +187,28 @@ * Test equality of two URL infos. */ static int -urlinfo_eq(gconstpointer a, gconstpointer b) +urlinfo_eq(const void *a, const void *b) { const dmesh_urlinfo_t *ia = a, *ib = b; return ia->port == ib->port && ia->idx == ib->idx && - host_addr_equal(ia->addr, ib->addr) && + host_addr_equiv(ia->addr, ib->addr) && (ia->name == ib->name || 0 == strcmp(ia->name, ib->name)); } /** * Initialize the download mesh. */ -G_GNUC_COLD void +void G_COLD dmesh_init(void) { - mesh = g_hash_table_new(sha1_hash, sha1_eq); - ban_mesh = g_hash_table_new(urlinfo_hash, urlinfo_eq); - ban_mesh_by_sha1 = g_hash_table_new(sha1_hash, sha1_eq); - dmesh_cq = cq_submake("dmesh", callout_queue, DMESH_CALLOUT); + mesh = hikset_create(offsetof(struct dmesh, sha1), + HASH_KEY_FIXED, SHA1_RAW_SIZE); + ban_mesh = hikset_create_any(offsetof(struct dmesh_banned, info), + urlinfo_hash, urlinfo_eq); + ban_mesh_by_sha1 = htable_create(HASH_KEY_FIXED, SHA1_RAW_SIZE); + dmesh_cq = cq_main_submake("dmesh", DMESH_CALLOUT); dmesh_retrieve(); dmesh_ban_retrieve(); } @@ -234,7 +241,7 @@ static void dmesh_fill_info(dmesh_urlinfo_t *info, const struct sha1 *sha1, const host_addr_t addr, - guint16 port, guint idx, const char *name) + uint16 port, uint idx, const char *name) { static const char urnsha1 = "urn:sha1:"; static char urnSHA1_BASE32_SIZE + sizeof urnsha1; @@ -244,7 +251,7 @@ info->idx = idx; if (sha1) { - concat_strings(urn, sizeof urn, urnsha1, sha1_base32(sha1), (void *) 0); + concat_strings(urn, sizeof urn, urnsha1, sha1_base32(sha1), NULL_PTR); info->name = urn; } else { info->name = name; @@ -270,7 +277,7 @@ dmesh_ban_remove_entry(struct dmesh_banned *dmb) { g_assert(dmb); - g_assert(dmb == g_hash_table_lookup(ban_mesh, dmb->info)); + g_assert(dmb == hikset_lookup(ban_mesh, dmb->info)); /* * Also remove the banned entry from the IP list by SHA1 which is ussed @@ -278,28 +285,27 @@ * -- JA 24/10/2003 */ if (dmb->sha1 != NULL) { - GSList *by_addr; - GSList *head; - gpointer key; /* The SHA1 atom used for key in table */ - gpointer x; - gboolean found; - - found = g_hash_table_lookup_extended( - ban_mesh_by_sha1, dmb->sha1, &key, &x); + pslist_t *by_addr; + pslist_t *head; + const void *key; /* The SHA1 atom used for key in table */ + void *x; + bool found; + + found = htable_lookup_extended(ban_mesh_by_sha1, dmb->sha1, &key, &x); g_assert(found); head = by_addr = x; - by_addr = g_slist_remove(by_addr, dmb); + by_addr = pslist_remove(by_addr, dmb); if (by_addr == NULL) { - g_hash_table_remove(ban_mesh_by_sha1, key); + htable_remove(ban_mesh_by_sha1, key); atom_sha1_free(key); } else if (by_addr != head) - g_hash_table_insert(ban_mesh_by_sha1, key, by_addr); + htable_insert(ban_mesh_by_sha1, key, by_addr); atom_sha1_free(dmb->sha1); } - g_hash_table_remove(ban_mesh, dmb->info); + hikset_remove(ban_mesh, dmb->info); dmesh_urlinfo_free(dmb->info); WFREE(dmb); } @@ -308,7 +314,7 @@ * Called from callout queue when it's time to expire the URL ban. */ static void -dmesh_ban_expire(cqueue_t *unused_cq, gpointer obj) +dmesh_ban_expire(cqueue_t *unused_cq, void *obj) { struct dmesh_banned *dmb = obj; @@ -321,7 +327,8 @@ * If stamp is 0, the current timestamp is used. */ static void -dmesh_ban_add(const struct sha1 *sha1, dmesh_urlinfo_t *info, time_t stamp) +dmesh_ban_add(const struct sha1 *sha1, + const dmesh_urlinfo_t *info, time_t stamp) { time_t now = tm_time(); struct dmesh_banned *dmb; @@ -344,7 +351,7 @@ * Insert new entry, or update old entry if the new one is more recent. */ - dmb = g_hash_table_lookup(ban_mesh, info); + dmb = hikset_lookup(ban_mesh, info); if (dmb == NULL) { dmesh_urlinfo_t *ui; @@ -361,7 +368,10 @@ dmb->cq_ev = cq_insert(dmesh_cq, lifetime*1000, dmesh_ban_expire, dmb); dmb->sha1 = NULL; - g_hash_table_insert(ban_mesh, dmb->info, dmb); + hikset_insert(ban_mesh, dmb); + + entropy_harvest_many(VARLEN(ui), VARLEN(dmb), + ui->name, strsize(ui->name), PTRLEN(sha1), NULL); /* * Keep record of banned hosts by SHA1 Hash. We will use this to send @@ -370,24 +380,25 @@ */ if (sha1 != NULL) { - GSList *by_addr; - gboolean existed; + pslist_t *by_addr; + bool existed; dmb->sha1 = atom_sha1_get(sha1); /* * Don't fear for duplicates here. The dmb lookup above * makes sure that if a XNalt with the IP already exists, - * the appropriate dmb will be updates (else-case below). + * the appropriate dmb will be updated (else-case below). * -- BLUE 16/01/2004 */ - by_addr = g_hash_table_lookup(ban_mesh_by_sha1, sha1); + by_addr = htable_lookup(ban_mesh_by_sha1, sha1); existed = by_addr != NULL; - by_addr = g_slist_append(by_addr, dmb); + by_addr = pslist_append(by_addr, dmb); - if (!existed) - gm_hash_table_insert_const(ban_mesh_by_sha1, + if (!existed) { + htable_insert_const(ban_mesh_by_sha1, atom_sha1_get(sha1), by_addr); + } } } else if (delta_time(dmb->created, stamp) < 0) { @@ -397,36 +408,42 @@ } /** - * Forcefully remove an entry from the banned mesh. + * Conditionally remove an entry from the banned mesh provided it has not + * been updated in the last DMESH_BAN_VETO seconds. + * + * @return TRUE if ban was lifted, FALSE otherwise. */ -static void -dmesh_ban_remove(const struct sha1 *sha1, host_addr_t addr, guint16 port) +static bool +dmesh_ban_remove(const struct sha1 *sha1, host_addr_t addr, uint16 port) { dmesh_urlinfo_t info; struct dmesh_banned *dmb; dmesh_fill_info(&info, sha1, addr, port, URN_INDEX, NULL); - dmb = g_hash_table_lookup(ban_mesh, &info); + dmb = hikset_lookup(ban_mesh, &info); - if (dmb) { + if (dmb != NULL && delta_time(tm_time(), dmb->created) > DMESH_BAN_VETO) { cq_cancel(&dmb->cq_ev); dmesh_ban_remove_entry(dmb); + return TRUE; } + + return FALSE; } /** * Check whether URL is banned from the mesh. */ -static gboolean +static bool dmesh_is_banned(const dmesh_urlinfo_t *info) { - return NULL != g_hash_table_lookup(ban_mesh, info); + return hikset_contains(ban_mesh, info); } /** * Are we capable of using firewalled alternate locations? */ -gboolean +bool dmesh_can_use_fwalt(void) { return !GNET_PROPERTY(is_firewalled) && GNET_PROPERTY(send_pushes); @@ -436,35 +453,23 @@ *** Mesh URL parsing. ***/ -static const char * const parse_errstr = { - "OK", /**< DMESH_URL_OK */ - "HTTP parsing error", /**< DMESH_URL_HTTP_PARSER */ - "File prefix neither /uri-res nor /get",/**< DMESH_URL_BAD_FILE_PREFIX */ - "Index in /get/index is reserved", /**< DMESH_URL_RESERVED_INDEX */ - "No filename after /get/index", /**< DMESH_URL_NO_FILENAME */ - "Bad URL encoding", /**< DMESH_URL_BAD_ENCODING */ - "Malformed /uri-res/N2R?", /**< DMESH_URL_BAD_URI_RES */ -}; - /** * @return human-readable error string corresponding to error code `errnum'. */ const char * dmesh_url_strerror(dmesh_url_error_t errnum) { - if (UNSIGNED(errnum) >= G_N_ELEMENTS(parse_errstr)) - return "Invalid error code"; + if (DMESH_URL_HTTP_PARSER == errnum) { + str_t *s = str_private(G_STRFUNC, 80); - if (errnum == DMESH_URL_HTTP_PARSER) { - static char http_error_str128; + str_printf(s, "%s: %s", + dmesh_url_error_to_string(errnum), + http_url_strerror(http_url_errno)); - concat_strings(http_error_str, sizeof http_error_str, - parse_errstrerrnum, ": ", http_url_strerror(http_url_errno), - (void *) 0); - return http_error_str; + return str_2c(s); } - return parse_errstrerrnum; + return dmesh_url_error_to_string(errnum); } /** @@ -473,12 +478,12 @@ * @return TRUE if OK, FALSE if we could not parse it. * The variable `dmesh_url_errno' is set accordingly. */ -gboolean +bool dmesh_url_parse(const char *url, dmesh_urlinfo_t *info) { host_addr_t addr; - guint16 port; - guint idx; + uint16 port; + uint idx; const char *endptr, *file, *host = NULL, *path = NULL; if (!http_url_parse(url, &port, &host, &path)) { @@ -546,7 +551,7 @@ */ if (idx != URN_INDEX) { - char *unescaped = url_unescape(deconstify_gchar(file), FALSE); + char *unescaped = url_unescape(deconstify_char(file), FALSE); if (!unescaped) { dmesh_url_errno = DMESH_URL_BAD_ENCODING; return FALSE; @@ -557,7 +562,7 @@ } } else { struct sha1 sha1; - + if (!urn_get_sha1(file, &sha1)) { dmesh_url_errno = DMESH_URL_BAD_URI_RES; return FALSE; @@ -583,8 +588,9 @@ dm->last_update = 0; dm->entries = list_new(); dm->sha1 = atom_sha1_get(sha1); - dm->by_host = g_hash_table_new(packed_host_hash_func, packed_host_eq_func); - dm->by_guid = g_hash_table_new(guid_hash, guid_eq); + dm->by_host = htable_create_any(packed_host_hash_func, + packed_host_hash_func2, packed_host_eq_func); + dm->by_guid = htable_create(HASH_KEY_FIXED, GUID_RAW_SIZE); return dm; } @@ -602,12 +608,12 @@ * Values in the dme->by_host table were the dmesh_entry structures * we just disposed of above, so we only need to get rid of the keys. */ - - gm_hash_table_foreach_key(dm->by_host, wfree_packed_host, NULL); - gm_hash_table_destroy_null(&dm->by_host); + + htable_foreach_key(dm->by_host, wfree_packed_host, NULL); + htable_free_null(&dm->by_host); /* Keys were GUID in the dmesh_entry, no need to free them */ - gm_hash_table_destroy_null(&dm->by_guid); + htable_free_null(&dm->by_guid); atom_sha1_free_null(&dm->sha1); WFREE(dm); @@ -620,14 +626,14 @@ dm_remove_entry(struct dmesh *dm, struct dmesh_entry *dme) { struct packed_host packed; - gpointer key; - gpointer value; - gboolean found; + const void *key; + void *value; + bool found; g_assert(dm); g_assert(list_length(dm->entries) > 0); - if (GNET_PROPERTY(dmesh_debug)) { + if (GNET_PROPERTY(dmesh_debug) > 1) { g_debug("dmesh %sentry removed for urn:sha1:%s at %s", dme->fw_entry ? "firewalled " : "", sha1_base32(dm->sha1), dme->fw_entry ? @@ -636,16 +642,16 @@ } if (dme->fw_entry) { - found = g_hash_table_lookup_extended(dm->by_guid, + found = htable_lookup_extended(dm->by_guid, dme->e.fwh.guid, &key, &value); } else { packed = host_pack(dme->e.url.addr, dme->e.url.port); - found = g_hash_table_lookup_extended(dm->by_host, + found = htable_lookup_extended(dm->by_host, &packed, &key, &value); } g_assert(found); - g_assert(value == (gpointer) dme); + g_assert(value == (void *) dme); found = list_remove(dm->entries, dme); /* Remove from list... */ @@ -654,10 +660,10 @@ /* ...and from the proper hash table */ if (dme->fw_entry) { - g_hash_table_remove(dm->by_guid, dme->e.fwh.guid); + htable_remove(dm->by_guid, dme->e.fwh.guid); } else { - g_hash_table_remove(dm->by_host, &packed); - wfree_packed_host(key, NULL); + htable_remove(dm->by_host, &packed); + wfree_packed_host(deconstify_pointer(key), NULL); } dmesh_entry_free(dme); @@ -667,23 +673,23 @@ * Remove the addr:port entry from mesh bucket, if present. */ static void -dm_remove(struct dmesh *dm, const host_addr_t addr, guint16 port) +dm_remove(struct dmesh *dm, const host_addr_t addr, uint16 port) { struct packed_host packed; struct dmesh_entry *dme; - gpointer key; - gpointer value; - gboolean found; + const void *key; + void *value; + bool found; g_assert(dm); packed = host_pack(addr, port); - found = g_hash_table_lookup_extended(dm->by_host, &packed, &key, &value); + found = htable_lookup_extended(dm->by_host, &packed, &key, &value); if (!found) return; - if (GNET_PROPERTY(dmesh_debug)) { + if (GNET_PROPERTY(dmesh_debug) > 1) { g_debug("dmesh entry removed for urn:sha1:%s at %s", sha1_base32(dm->sha1), host_addr_port_to_string(addr, port)); } @@ -694,8 +700,8 @@ g_assert(found); g_assert(!dme->fw_entry); - g_hash_table_remove(dm->by_host, &packed); /* And from hash table */ - wfree_packed_host(key, NULL); + htable_remove(dm->by_host, &packed); /* And from hash table */ + wfree_packed_host(deconstify_pointer(key), NULL); dmesh_entry_free(dme); } @@ -704,22 +710,26 @@ * Is the SHA1 that of a finished file (either shared in the library or * seeded after completion)? */ -static gboolean +static bool sha1_of_finished_file(const struct sha1 *sha1) { - const shared_file_t *sf = shared_file_by_sha1(sha1); + shared_file_t *sf = shared_file_by_sha1(sha1); + bool finished; + + finished = sf && sf != SHARE_REBUILDING && shared_file_is_finished(sf); + shared_file_unref(&sf); - return sf && sf != SHARE_REBUILDING && shared_file_is_finished(sf); + return finished; } /** * Compute suitable life time for mesh entries. * * Complete files have no download HTTP transactions, hence the alt-locs - * we get are only from uploaders. To keep only the ones that are fresh-enough, + * we get are only from uploaders. To keep only the ones that are fresh-enough, * reduce the lifetime of each entry. */ -static glong +static long dm_lifetime(const struct dmesh *dm) { g_assert(dm); @@ -734,10 +744,10 @@ static void dm_expire(struct dmesh *dm) { - GSList *expired = NULL; - GSList *sl; + pslist_t *expired = NULL; + pslist_t *sl; time_t now = tm_time(); - glong agemax; + long agemax; list_iter_t *iter; agemax = dm_lifetime(dm); @@ -765,18 +775,18 @@ dmesh_urlinfo_to_string(&dme->e.url), (unsigned) delta_time(now, dme->stamp)); - expired = g_slist_prepend(expired, dme); + expired = pslist_prepend(expired, dme); } list_iter_free(&iter); - for (sl = expired; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(expired, sl) { struct dmesh_entry *dme = sl->data; dm_remove_entry(dm, dme); } - g_slist_free(expired); + pslist_free(expired); dm->last_update = tm_time(); } @@ -787,30 +797,28 @@ static void dmesh_dispose(const struct sha1 *sha1) { - gpointer key; - gpointer value; - gboolean found; + void *value; + bool found; struct dmesh *dm; - found = g_hash_table_lookup_extended(mesh, sha1, &key, &value); + found = hikset_lookup_extended(mesh, sha1, &value); dm = value; g_assert(found); g_assert(list_length(dm->entries) == 0); - /* Remove it from the hashtable before freeing key, just in case - * that sha1 == key. */ - g_hash_table_remove(mesh, sha1); - atom_sha1_free(key); + hikset_remove(mesh, sha1); dm_free(dm); + + entropy_harvest_single(PTRLEN(sha1)); } /** * Remove entry from mesh due to a failed download attempt. */ -gboolean -dmesh_remove(const struct sha1 *sha1, const host_addr_t addr, guint16 port, - guint idx, const char *name) +bool +dmesh_remove(const struct sha1 *sha1, const host_addr_t addr, uint16 port, + uint idx, const char *name) { struct dmesh *dm; dmesh_urlinfo_t info; @@ -827,7 +835,7 @@ * Lookup SHA1 in the mesh to see if we already have entries for it. */ - dm = g_hash_table_lookup(mesh, sha1); + dm = hikset_lookup(mesh, sha1); if (dm == NULL) /* Nothing for this SHA1 key */ return FALSE; @@ -856,7 +864,7 @@ g_assert(sha1); - dm = g_hash_table_lookup(mesh, sha1); + dm = hikset_lookup(mesh, sha1); /* * If we have an entry and the last update was done more than @@ -894,10 +902,10 @@ * than the one we're trying to add). */ - dm = g_hash_table_lookup(mesh, sha1); + dm = hikset_lookup(mesh, sha1); if (dm == NULL) { dm = dm_alloc(sha1); - gm_hash_table_insert_const(mesh, atom_sha1_get(sha1), dm); + hikset_insert(mesh, dm); } else { dm_expire(dm); } @@ -912,19 +920,19 @@ * If `idx' is URN_INDEX, then we can access this file only through an * /uri-res request, the URN being given as `name'. * - * @return whether the entry was added in the mesh, or was discarded because - * it was the oldest record and we have enough already. + * @return TRUE if the entry was added in the mesh, FALSE if it was discarded + * because it was the oldest record and we have enough already. */ -static gboolean +static bool dmesh_raw_add(const struct sha1 *sha1, const dmesh_urlinfo_t *info, - time_t stamp, gboolean swarm) + time_t stamp, bool swarm) { struct dmesh_entry *dme; struct dmesh *dm; time_t now = tm_time(); host_addr_t addr = info->addr; - guint16 port = info->port; - guint idx = info->idx; + uint16 port = info->port; + uint idx = info->idx; const char *name = info->name; struct packed_host packed; const char *reason = NULL; @@ -959,8 +967,8 @@ goto rejected; } - if (hostiles_check(addr)) { - reason = "hostile address"; + if (hostiles_is_bad(addr)) { + reason = "bad hostile address"; goto rejected; } @@ -990,14 +998,14 @@ */ packed = host_pack(addr, port); - dme = g_hash_table_lookup(dm->by_host, &packed); + dme = htable_lookup(dm->by_host, &packed); if (dme) { /* * Entry for this host existed. */ - g_assert(host_addr_equal(dme->e.url.addr, addr)); + g_assert(host_addr_equiv(dme->e.url.addr, addr)); g_assert(dme->e.url.port == port); /* @@ -1012,7 +1020,7 @@ if (stamp > dme->stamp) /* Don't move stamp back in the past */ dme->stamp = stamp; - if (GNET_PROPERTY(dmesh_debug)) + if (GNET_PROPERTY(dmesh_debug) > 1) g_debug("dmesh entry reused for urn:sha1:%s at %s", sha1_base32(sha1), host_addr_port_to_string(addr, port)); } else { @@ -1032,7 +1040,10 @@ dme->good = FALSE; dme->fw_entry = FALSE; - if (GNET_PROPERTY(dmesh_debug)) + entropy_harvest_many(name, strlen(name), + VARLEN(dme), PTRLEN(sha1), NULL); + + if (GNET_PROPERTY(dmesh_debug) > 1) g_debug("dmesh entry created for urn:sha1:%s at %s", sha1_base32(sha1), host_addr_port_to_string(addr, port)); @@ -1044,7 +1055,7 @@ list_append(dm->entries, dme); dm->last_update = now; - g_hash_table_insert(dm->by_host, walloc_packed_host(addr, port), dme); + htable_insert(dm->by_host, walloc_packed_host(addr, port), dme); if (list_length(dm->entries) == MAX_ENTRIES) { struct dmesh_entry *oldest = list_head(dm->entries); @@ -1071,7 +1082,7 @@ if (GNET_PROPERTY(dmesh_debug) > 4) g_debug("MESH %s: rejecting \"%s\", stamp=%u age=%u: %s", sha1_base32(sha1), - dmesh_urlinfo_to_string(info), (guint) stamp, + dmesh_urlinfo_to_string(info), (uint) stamp, (unsigned) delta_time(now, stamp), reason); @@ -1087,9 +1098,9 @@ * @return whether the entry was added in the mesh, or was discarded because * it was the oldest record and we have enough already. */ -static gboolean +static bool dmesh_raw_fw_add(const struct sha1 *sha1, const dmesh_fwinfo_t *info, - time_t stamp, gboolean swarm) + time_t stamp, bool swarm) { struct dmesh_entry *dme; struct dmesh *dm; @@ -1121,7 +1132,7 @@ * See whether we knew something about this host already. */ - dme = g_hash_table_lookup(dm->by_guid, info->guid); + dme = htable_lookup(dm->by_guid, info->guid); if (dme) { /* @@ -1144,7 +1155,7 @@ dme->inserted = now; /* List of push-proxies changed */ } - if (GNET_PROPERTY(dmesh_debug)) + if (GNET_PROPERTY(dmesh_debug) > 1) g_debug("dmesh entry reused for urn:sha1:%s for %s (%s proxies)", sha1_base32(sha1), guid_hex_str(info->guid), info->proxies ? "new" : "no new"); @@ -1163,7 +1174,10 @@ dme->good = FALSE; dme->fw_entry = TRUE; - if (GNET_PROPERTY(dmesh_debug)) + entropy_harvest_many(PTRLEN(info->guid), + VARLEN(dme), PTRLEN(sha1), NULL); + + if (GNET_PROPERTY(dmesh_debug) > 1) g_debug("dmesh entry created for urn:sha1:%s for %s", sha1_base32(sha1), guid_hex_str(info->guid)); @@ -1175,7 +1189,7 @@ list_append(dm->entries, dme); dm->last_update = now; - gm_hash_table_insert_const(dm->by_guid, dme->e.fwh.guid, dme); + htable_insert(dm->by_guid, dme->e.fwh.guid, dme); if (list_length(dm->entries) == MAX_ENTRIES) { struct dmesh_entry *oldest = list_head(dm->entries); @@ -1197,7 +1211,7 @@ if (GNET_PROPERTY(dmesh_debug) > 4) g_debug("MESH %s: rejecting \"%s\", stamp=%u age=%u: %s", sha1_base32(sha1), - dmesh_fwinfo_to_string(info), (guint) stamp, + dmesh_fwinfo_to_string(info), (uint) stamp, (unsigned) delta_time(now, stamp), reason); @@ -1207,9 +1221,9 @@ /** * Same as dmesh_raw_add(), but this is for public consumption. */ -gboolean +bool dmesh_add(const struct sha1 *sha1, const host_addr_t addr, - guint16 port, guint idx, const char *name, time_t stamp) + uint16 port, uint idx, const char *name, time_t stamp) { dmesh_urlinfo_t info; @@ -1227,7 +1241,7 @@ * Add addr:port as a known alternate location for given sha1. */ void -dmesh_add_alternate(const struct sha1 *sha1, host_addr_t addr, guint16 port) +dmesh_add_alternate(const struct sha1 *sha1, host_addr_t addr, uint16 port) { dmesh_urlinfo_t info; @@ -1240,7 +1254,7 @@ */ void dmesh_add_good_alternate(const struct sha1 *sha1, - host_addr_t addr, guint16 port) + host_addr_t addr, uint16 port) { dmesh_urlinfo_t info; @@ -1260,7 +1274,7 @@ for (i = gnet_host_vec_count(alt) - 1; i >= 0; i--) { struct gnutella_host host; host_addr_t addr; - guint16 port; + uint16 port; host = gnet_host_vec_get(alt, i); addr = gnet_host_get_addr(&host); @@ -1275,7 +1289,7 @@ * This inserts the location into the banned mesh. */ void -dmesh_remove_alternate(const struct sha1 *sha1, host_addr_t addr, guint16 port) +dmesh_remove_alternate(const struct sha1 *sha1, host_addr_t addr, uint16 port) { dmesh_remove(sha1, addr, port, URN_INDEX, NULL); } @@ -1283,45 +1297,50 @@ /** * Record that addr:port was signalled negatively as an alternate location * for given sha1. The reporter's address is also given so that we can wait - * until we have sufficient evidence from at least 2 different parties. + * until we have sufficient evidence from at least MIN_BAD_REPORT different + * parties from different networks to mitigate local collusion. * * When there is sufficient evidence, the entry is evicted from the mesh * and placed into the banned mesh. */ void dmesh_negative_alt(const struct sha1 *sha1, host_addr_t reporter, - host_addr_t addr, guint16 port) + host_addr_t addr, uint16 port) { struct dmesh *dm; struct packed_host packed; struct dmesh_entry *dme; + host_addr_t net; /* * Lookup SHA1 in the mesh to see if we already have entries for it. */ - dm = g_hash_table_lookup(mesh, sha1); + dm = hikset_lookup(mesh, sha1); if (dm == NULL) /* Nothing for this SHA1 key */ return; packed = host_pack(addr, port); - dme = g_hash_table_lookup(dm->by_host, &packed); + dme = htable_lookup(dm->by_host, &packed); if (dme == NULL) return; g_assert(dme->e.url.port == port); - g_assert(host_addr_equal(dme->e.url.addr, addr)); + g_assert(host_addr_equiv(dme->e.url.addr, addr)); if (dme->bad == NULL) dme->bad = hash_list_new(host_addr_hash_func, host_addr_eq_func); /* - * If this host already reported this addr:port as being bad, ignore. + * If this host already reported this network as being bad, ignore. + * We define "network" as CIDR/16 for IPv4 and CIDR/64 for IPv6. */ - if (hash_list_contains(dme->bad, &reporter)) + net = host_addr_mask_net(reporter, 16, 64); + + if (hash_list_contains(dme->bad, &net)) return; /* @@ -1329,13 +1348,15 @@ */ if (hash_list_length(dme->bad) + 1 < MIN_BAD_REPORT) { - host_addr_t *raddr; + hash_list_append(dme->bad, WCOPY(&net)); + } else { + /* Add entry to the banned mesh if not a firewalled source */ + + if (!dme->fw_entry) + dmesh_ban_add(sha1, &dme->e.url, 0); - WALLOC(raddr); - *raddr = reporter; - hash_list_append(dme->bad, raddr); - } else dm_remove_entry(dm, dme); + } } /** @@ -1343,21 +1364,21 @@ */ void dmesh_good_mark(const struct sha1 *sha1, - host_addr_t addr, guint16 port, gboolean good) + host_addr_t addr, uint16 port, bool good) { struct dmesh *dm; struct packed_host packed; struct dmesh_entry *dme; - gboolean retried = FALSE; + bool retried = FALSE; - dm = g_hash_table_lookup(mesh, sha1); + dm = hikset_lookup(mesh, sha1); if (dm == NULL) return; /* Weird, but it doesn't matter */ packed = host_pack(addr, port); retry: - dme = g_hash_table_lookup(dm->by_host, &packed); + dme = htable_lookup(dm->by_host, &packed); if (dme == NULL) { /* @@ -1373,7 +1394,8 @@ } if (good) { - dmesh_ban_remove(sha1, addr, port); + if (!dmesh_ban_remove(sha1, addr, port)) + return; /* Entry too recent to lift ban yet */ dmesh_add_alternate(sha1, addr, port); retried = TRUE; goto retry; @@ -1382,7 +1404,7 @@ } g_assert(dme->e.url.port == port); - g_assert(host_addr_equal(dme->e.url.addr, addr)); + g_assert(host_addr_equiv(dme->e.url.addr, addr)); /* * Get rid of the "bad" reporting if we're flagging it as good! @@ -1417,16 +1439,16 @@ */ static void dmesh_good_fw_mark(const struct sha1 *sha1, - const struct guid *guid, gboolean good) + const struct guid *guid, bool good) { struct dmesh *dm; struct dmesh_entry *dme; - dm = g_hash_table_lookup(mesh, sha1); + dm = hikset_lookup(mesh, sha1); if (dm == NULL) return; /* Weird, but it doesn't matter */ - dme = g_hash_table_lookup(dm->by_guid, guid); + dme = htable_lookup(dm->by_guid, guid); if (dme == NULL) return; @@ -1498,7 +1520,7 @@ */ static size_t dmesh_urlinfo_to_string_buf(const dmesh_urlinfo_t *info, char *buf, - size_t len, gboolean *quoting) + size_t len, bool *quoting) { size_t rw; size_t maxslen = len - 1; /* Account for trailing NUL */ @@ -1511,16 +1533,16 @@ host = info->port == HTTP_PORT ? host_addr_to_string(info->addr) : host_addr_port_to_string(info->addr, info->port); - rw = concat_strings(buf, len, "http://", host, (void *) 0); + rw = concat_strings(buf, len, "http://", host, NULL_PTR); if (rw >= maxslen) return (size_t) -1; if (info->idx == URN_INDEX) { - rw += gm_snprintf(&bufrw, len - rw, "/uri-res/N2R?%s", info->name); + rw += str_bprintf(&bufrw, len - rw, "/uri-res/N2R?%s", info->name); if (quoting != NULL) *quoting = FALSE; /* No "," in the generated URL */ } else { - rw += gm_snprintf(&bufrw, len - rw, "/get/%u/", info->idx); + rw += str_bprintf(&bufrw, len - rw, "/get/%u/", info->idx); /* * Write filename, URL-escaping it directly into the buffer. @@ -1581,7 +1603,7 @@ g_assert(len <= INT_MAX); g_assert(info->guid != NULL); - rw = gm_snprintf(buf, len, "%s", guid_hex_str(info->guid)); + rw = str_bprintf(buf, len, "%s", guid_hex_str(info->guid)); if (rw >= maxslen) goto done; @@ -1593,7 +1615,7 @@ while (hash_list_iter_has_next(iter) && rw < maxslen) { gnet_host_t *host = hash_list_iter_next(iter); - rw += gm_snprintf(&bufrw, len - rw, ";%s", + rw += str_bprintf(&bufrw, len - rw, ";%s", host_addr_port_to_string( gnet_host_get_addr(host), gnet_host_get_port(host))); } @@ -1658,7 +1680,7 @@ dmesh_entry_url_stamp(const struct dmesh_entry *dme, char *buf, size_t size) { size_t rw; - gboolean quoting; + bool quoting; g_assert(!dme->fw_entry); g_assert(size > 0); @@ -1692,7 +1714,7 @@ */ rw += concat_strings(&bufrw, size - rw, - " ", timestamp_utc_to_string(dme->stamp), (void *) 0); + " ", timestamp_utc_to_string(dme->stamp), NULL_PTR); return rw < size ? rw : (size_t) -1; } @@ -1726,7 +1748,7 @@ */ rw += concat_strings(&bufrw, size - rw, - ";", timestamp_utc_to_string(dme->stamp), (void *) 0); + ";", timestamp_utc_to_string(dme->stamp), NULL_PTR); return rw < size ? rw : (size_t) -1; } @@ -1764,14 +1786,14 @@ int nselected; int i; int j; - gboolean complete_file; + bool complete_file; list_iter_t *iter; /* * Fetch the mesh entry for this SHA1. */ - dm = g_hash_table_lookup(mesh, sha1); + dm = hikset_lookup(mesh, sha1); if (dm == NULL) /* SHA1 unknown */ return 0; @@ -1826,38 +1848,18 @@ /* * Second pass: choose at most `hcnt' entries at random. + * + * We do this by randomly shuffling the whole array and then selecting + * the first `hcnt' entries. */ - for (i = j = 0; i < nselected && j < hcnt; i++) { - struct dmesh_entry *dme; - int nleft = nselected - i; - int npick = random_value(nleft - 1); - int k; - int n; - - /* - * The `npick' variable is the index of the selected entry, all - * NULL pointers we can encounter on our path not-withstanding. - */ - - for (k = 0, n = npick; n >= 0; /* empty */) { - g_assert(k < nselected); - if (selectedk == NULL) { - k++; - continue; - } - n--; - } - - g_assert(k < nselected); - - dme = selectedk; - selectedk = NULL; /* Can't select same entry twice */ + SHUFFLE_ARRAY_N(selected, nselected); - g_assert(j < hcnt); + for (i = j = 0; i < nselected && j < hcnt; i++, j++) { + struct dmesh_entry *dme; + dme = selectedi; gnet_host_set(&hvecj, dme->e.url.addr, dme->e.url.port); - j++; } return j; /* Amount we filled in vector */ @@ -1878,20 +1880,20 @@ */ static size_t dmesh_fwalt_string(char *buf, size_t size, - const guid_t *guid, host_addr_t addr, guint16 port, sequence_t *proxies, + const guid_t *guid, host_addr_t addr, uint16 port, sequence_t *proxies, host_net_t net) { size_t rw; - rw = gm_snprintf(buf, size, "%s", guid_to_string(guid)); + rw = str_bprintf(buf, size, "%s", guid_to_string(guid)); #if 0 /* No FWT support yet */ - rw += gm_snprintf(&bufrw, size - rw, ";fwt/1"); + rw += str_bprintf(&bufrw, size - rw, ";fwt/1"); #endif if (host_is_valid(addr, port)) { - rw += gm_snprintf(&bufrw, size - rw, ";%s", + rw += str_bprintf(&bufrw, size - rw, ";%s", port_host_addr_to_string(port, addr)); } @@ -1907,7 +1909,7 @@ if (!hcache_addr_within_net(haddr, net)) continue; - rw += gm_snprintf(&bufrw, size - rw, ";%s", + rw += str_bprintf(&bufrw, size - rw, ";%s", host_addr_port_to_string(haddr, gnet_host_get_port(host))); } sequence_iterator_release(&iter); @@ -1957,23 +1959,23 @@ dmesh_alternate_location(const struct sha1 *sha1, char *buf, size_t size, const host_addr_t addr, time_t last_sent, const char *vendor, - fileinfo_t *fi, gboolean request, const struct guid *guid, + fileinfo_t *fi, bool request, const struct guid *guid, host_net_t net) { char url1024; struct dmesh *dm; size_t len = 0; - GSList *l; + pslist_t *l; int nselected = 0; struct dmesh_entry *selectedMAX_ENTRIES; int i; - GSList *by_addr; + pslist_t *by_addr; size_t maxlinelen = 0; header_fmt_t *fmt; - gboolean added; + bool added; list_iter_t *iter; - gboolean complete_file; - gboolean can_share_partials; + bool complete_file; + bool can_share_partials; g_assert(sha1); g_assert(buf); @@ -2021,7 +2023,7 @@ * -- JA, 1/11/2003 */ - by_addr = g_hash_table_lookup(ban_mesh_by_sha1, sha1); + by_addr = htable_lookup(ban_mesh_by_sha1, sha1); if (by_addr != NULL) { fmt = header_fmt_make("X-Nalt", ", ", size, size / 3); @@ -2030,7 +2032,7 @@ added = FALSE; /* Loop through the X-Nalts */ - for (l = by_addr; l != NULL; l = g_slist_next(l)) { + PSLIST_FOREACH(by_addr, l) { struct dmesh_banned *banned = l->data; dmesh_urlinfo_t *info = banned->info; @@ -2067,7 +2069,7 @@ } /* Find mesh entry for this SHA1 */ - dm = (struct dmesh *) g_hash_table_lookup(mesh, sha1); + dm = hikset_lookup(mesh, sha1); /* * Start filling the buffer. @@ -2182,7 +2184,7 @@ if (delta_time(dme->inserted, last_sent) <= 0) continue; - if (host_addr_equal(dme->e.url.addr, addr)) + if (host_addr_equiv(dme->e.url.addr, addr)) continue; if (!hcache_addr_within_net(dme->e.url.addr, net)) @@ -2214,33 +2216,12 @@ * Second pass. */ + SHUFFLE_ARRAY_N(selected, nselected); + for (i = 0; i < nselected; i++) { - struct dmesh_entry *dme; - int nleft = nselected - i; - int npick = random_value(nleft - 1); - int j; - int n; + struct dmesh_entry *dme = selectedi; size_t url_len; - /* - * The `npick' variable is the index of the selected entry, all - * NULL pointers we can encounter on our path not-withstanding. - */ - - for (j = 0, n = npick; n >= 0; /* empty */) { - g_assert(j < nselected); - if (selectedj == NULL) { - j++; - continue; - } - n--; - } - - g_assert(j < nselected); - - dme = selectedj; - selectedj = NULL; /* Can't select same entry twice */ - g_assert(delta_time(dme->inserted, last_sent) > 0); url_len = dmesh_entry_compact(dme, url, sizeof url); @@ -2317,7 +2298,7 @@ struct dmesh_entry *dme = list_iter_next(iter); sequence_t *proxies; host_addr_t servent_addr; - guint16 servent_port; + uint16 servent_port; if (!dme->fw_entry) continue; @@ -2407,18 +2388,54 @@ } /** + * Trace funny value of the specified header field name, if not + * already done before. + * + * @param warned set to TRUE after tracing + * @param field the header field name whose value we're given + * @param value the funny field value to trace + * @param origin if not-NULL, the host supplying us with the alt-locs + * @param user_agent the advertised servent name giving us the value + */ +static void +dmesh_field_trace(bool *warned, const char *field, const char *value, + const gnet_host_t *origin, const char *user_agent) +{ + str_t *s; + + if (*warned) + return; /* Already warned for that value */ + + *warned = TRUE; + + s = str_new(256); + str_printf(s, "funny %s", field); + + if (user_agent != NULL) + str_catf(s, " from <%s>", user_agent); + + if (origin != NULL) + str_catf(s, " at %s", gnet_host_to_string(origin)); + + str_catf(s, ": %s", value); + + g_warning("%s", str_2c(s)); + str_destroy_null(&s); +} + +/** * Parse the value of the X-(Gnutella-)Content-URN header in `value', looking * for a SHA1. When found, the SHA1 is extracted and placed into the given * `digest' buffer. * * @return whether we successfully extracted the SHA1. */ -gboolean +bool dmesh_collect_sha1(const char *value, struct sha1 *sha1) { strtok_t *st; const char *tok; - gboolean found = FALSE; + bool found = FALSE; st = strtok_make_strip(value); @@ -2429,7 +2446,7 @@ } } - strtok_free(st); + strtok_free_null(&st); return found; } @@ -2443,12 +2460,15 @@ * func(sha1, addr, port, udata); * * where udata is opaque user-supplied data. + * + * @return whether we successfully parsed all the altnernate locations. */ -static void +static bool dmesh_parse_addr_port_list(const struct sha1 *sha1, const char *value, - dmesh_add_cb func, gpointer udata) + dmesh_add_cb func, void *udata) { const char *tls_hex, *p, *next; + bool good = TRUE; tls_hex = NULL; next = value; @@ -2456,8 +2476,8 @@ while (NULL != (p = next)) { const char *start, *endptr; host_addr_t addr; - guint16 port; - gboolean ok; + uint16 port; + bool ok; start = skip_ascii_blanks(p); if ('\0' == *start) @@ -2479,50 +2499,85 @@ * was advertised in X-Features. * * Therefore, we only parse a list of IP:port in X-Alt and X-Nalt. - */ + */ ok = string_to_host_addr(start, &endptr, &addr); if (ok && ':' == *endptr) { int error; - + port = parse_uint16(&endptr1, &endptr, 10, &error); - ok = !error && port > 0; + ok = !error && port > 0; } else { port = GTA_PORT; } - + if (ok) { (*func)(sha1, addr, port, udata); - } else if (GNET_PROPERTY(dmesh_debug)) { - g_warning("ignoring invalid compact alt-loc \"%s\"", start); + } else { + good = FALSE; + if (GNET_PROPERTY(dmesh_debug)) + g_warning("ignoring invalid compact alt-loc \"%s\"", start); } } + + return good; } static void dmesh_collect_compact_locations_cback( - const struct sha1 *sha1, host_addr_t addr, guint16 port, - gpointer unused_udata) + const sha1_t *sha1, host_addr_t addr, uint16 port, void *udata) { - (void) unused_udata; - (void) dmesh_add_alternate(sha1, addr, port); + const gnet_host_t *origin = udata; + + dmesh_add_alternate(sha1, addr, port); + + /* + * If entering an alt-loc in the mesh for an URN located on the + * origin, then we know it is a good one since it is being advertised + * by the server itself. + * --RAM, 2012-12-03 + */ + + if ( + origin != NULL && + port == gnet_host_get_port(origin) && + host_addr_equiv(addr, gnet_host_get_addr(origin)) + ) { + dmesh_good_mark(sha1, addr, port, TRUE); + + if (GNET_PROPERTY(dmesh_debug) > 3) { + g_debug("MESH %s: good self alt-loc from %s", + sha1_base32(sha1), gnet_host_to_string(origin)); + } + } } /** * Parse the value of the "X-Alt" header to extract alternate sources * for a given SHA1 key given in the new compact form. + * + * @param sha1 the SHA1 for which we're collecting alt-locs + * @param value the value of the header field we're parsing + * @param origin if not-NULL, the host supplying us with the alt-locs */ void -dmesh_collect_compact_locations(const struct sha1 *sha1, const char *value) +dmesh_collect_compact_locations(const sha1_t *sha1, const char *value, + const gnet_host_t *origin, const char *user_agent) { - dmesh_parse_addr_port_list(sha1, value, - dmesh_collect_compact_locations_cback, NULL); + bool ok; + + ok = dmesh_parse_addr_port_list(sha1, value, + dmesh_collect_compact_locations_cback, deconstify_pointer(origin)); + + if G_UNLIKELY(!ok && GNET_PROPERTY(dmesh_debug)) { + dmesh_field_trace(&ok, "X-Alt", value, origin, user_agent); + } } static void dmesh_collect_negative_locations_cback( - const struct sha1 *sha1, host_addr_t addr, guint16 port, - gpointer udata) + const struct sha1 *sha1, host_addr_t addr, uint16 port, + void *udata) { host_addr_t *reporter = udata; @@ -2536,32 +2591,79 @@ * @param reporter the address of the host supplying the X-Nalt header */ void -dmesh_collect_negative_locations( - const struct sha1 *sha1, const char *value, host_addr_t reporter) +dmesh_collect_negative_locations(const sha1_t *sha1, const char *value, + host_addr_t reporter, const char *user_agent) { - dmesh_parse_addr_port_list(sha1, value, + bool ok; + + ok = dmesh_parse_addr_port_list(sha1, value, dmesh_collect_negative_locations_cback, &reporter); + + if G_UNLIKELY(!ok && GNET_PROPERTY(dmesh_debug)) { + gnet_host_t host; + + gnet_host_set(&host, reporter, 0); + dmesh_field_trace(&ok, "X-Nalt", value, &host, user_agent); + } +} + +/** + * Trace funny value of the "Alternate-Location" header, if not + * already done before. + * + * @param warned set to TRUE after tracing + * @param value the funny value to trace + * @param origin if not-NULL, the host supplying us with the alt-locs + * @param user_agent the advertised servent name giving us the value + */ +static void +dmesh_location_trace(bool *warned, const char *value, + const gnet_host_t *origin, const char *user_agent) +{ + dmesh_field_trace(warned, "Alternate-Location", value, origin, user_agent); +} + +/** + * Trace funny value of the "X-Falt" header, if not already done before. + * + * @param warned set to TRUE after tracing + * @param value the funny value to trace + * @param origin if not-NULL, the host giving us with the firewalled locs + * @param user_agent the advertised servent name giving us the value + */ +static void +dmesh_fw_altloc_trace(bool *warned, const char *value, + const gnet_host_t *origin, const char *user_agent) +{ + dmesh_field_trace(warned, "X-Falt", value, origin, user_agent); } /** * Parse value of the "X-Gnutella-Alternate-Location" to extract alternate * sources for a given SHA1 key. + * + * @param sha1 the SHA1 for which we're collecting alt-locs + * @param value the value of the header field we're parsing + * @param origin if not NULL, the host supplying us with the alt-locs + * @param user_agent if not NULL, advertised servent name giving the value */ void -dmesh_collect_locations(const struct sha1 *sha1, const char *value) +dmesh_collect_locations(const sha1_t *sha1, const char *value, + const gnet_host_t *origin, const char *user_agent) { const char *p = value; - guchar c; + uchar c; time_t now = tm_time(); - gboolean finished = FALSE; + bool finished = FALSE; + bool warned = FALSE; do { const char *date_start, *url_start; time_t stamp; - gboolean ok; + bool ok; dmesh_urlinfo_t info; - gboolean skip_date; - gboolean in_quote; + bool skip_date; + bool in_quote; /* * Find next space, colon or EOS (End of String). @@ -2585,9 +2687,11 @@ * Quoted identifiers are one big token. */ - if (in_quote && c == '\\' && p1 == '"') + if (in_quote && c == '\\' && p1 == '"') { + dmesh_location_trace(&warned, value, origin, user_agent); g_warning("unsupported \\\" escape sequence in quoted section " "for Alternate-Location: should use URL escaping instead!"); + } if (c == '"') { in_quote = !in_quote; @@ -2625,13 +2729,15 @@ * Parse URL. */ - g_assert((guchar) *p == c); + g_assert((uchar) *p == c); if (*url_start == '"') { /* URL enclosed in quotes? */ url_start++; /* Skip that needless quote */ - if (c != '"') + if (c != '"') { + dmesh_location_trace(&warned, value, origin, user_agent); g_warning("Alternate-Location URL \"%s\" started with leading " "quote, but did not end with one!", url_start); + } } /* @@ -2651,9 +2757,9 @@ g_debug("MESH (parsed=%d): \"%s\"", ok, url); if (!ok && - (GNET_PROPERTY(dmesh_debug) > 1 || - !is_strprefix(url, "ed2kftp://")) + (GNET_PROPERTY(dmesh_debug) || !is_strprefix(url, "ed2kftp://")) ) { + dmesh_location_trace(&warned, value, origin, user_agent); g_warning("cannot parse Alternate-Location URL \"%s\": %s", url, dmesh_url_strerror(dmesh_url_errno)); } @@ -2719,18 +2825,44 @@ if (p != date_start) { char *date; - g_assert((guchar) *p == c); + g_assert((uchar) *p == c); date = h_strndup(date_start, p - date_start); stamp = date2time(date, now); - if (GNET_PROPERTY(dmesh_debug) > 6) + if ((time_t) -1 == stamp) { + const char *d; + + if (GNET_PROPERTY(dmesh_debug)) + dmesh_location_trace(&warned, value, origin, user_agent); + + /* + * Some broken servents propagate two ISO dates separated by + * a space, such as: "2015-03-06T16:00Z 2015-03-06T19:09Z". + * So try to skip past the first space, if any, to see whether + * we can be more successful. + * --RAM, 2015-03-06 + * + * Actually, there can be more than two ISO dates, so just + * keep the LAST one (since a valid ISO date does not contain + * any space), by looking at the last space in the string. + * --RAM, 2015-03-07 + */ + + if (NULL != (d = strrchr(date, ' '))) + stamp = date2time(++d, now); /* Skip the space */ + + if ((time_t) -1 == stamp) { + dmesh_location_trace(&warned, value, origin, user_agent); + g_warning("cannot parse Alternate-Location date: %s", date); + stamp = 0; + } + } + + if (GNET_PROPERTY(dmesh_debug) > 6) { g_debug("MESH (stamp=%s): \"%s\"", timestamp_to_string(stamp), date); - - if (stamp == (time_t) -1) { - g_warning("cannot parse Alternate-Location date: %s", date); - stamp = 0; } + HFREE_NULL(date); } else stamp = 0; @@ -2743,13 +2875,14 @@ if (info.idx == URN_INDEX) { struct sha1 digest; - + ok = urn_get_sha1(info.name, &digest); g_assert(ok); ok = sha1_eq(sha1, &digest); if (!ok) { g_assert(sha1); + dmesh_location_trace(&warned, value, origin, user_agent); g_warning("mismatch in /uri-res/N2R? Alternate-Location " "for SHA1=%s: got %s", sha1_base32(sha1), info.name); goto skip_add; @@ -2765,12 +2898,33 @@ } ok = dmesh_raw_add(sha1, &info, stamp, TRUE); + /* + * If entering an alt-loc in the mesh for an URN located on the + * origin, then we know it is a good one since it is being advertised + * by the server itself. + * --RAM, 2012-12-03 + */ + + if ( + URN_INDEX == info.idx && + origin != NULL && + info.port == gnet_host_get_port(origin) && + host_addr_equiv(info.addr, gnet_host_get_addr(origin)) + ) { + dmesh_good_mark(sha1, info.addr, info.port, TRUE); + + if (GNET_PROPERTY(dmesh_debug) > 3) { + g_debug("MESH %s: good self alt-loc from %s", + sha1_base32(sha1), gnet_host_to_string(origin)); + } + } + skip_add: if (GNET_PROPERTY(dmesh_debug) > 4) g_debug("MESH %s: %s \"%s\", stamp=%u age=%u", sha1_base32(sha1), ok ? "added" : "rejected", - dmesh_urlinfo_to_string(&info), (guint) stamp, + dmesh_urlinfo_to_string(&info), (uint) stamp, (unsigned) delta_time(now, stamp)); if (c == '\0') /* Reached end of string */ @@ -2801,7 +2955,7 @@ g_assert(buf); g_assert(count > 0); - dm = g_hash_table_lookup(mesh, sha1); + dm = hikset_lookup(mesh, sha1); if (dm == NULL) /* SHA1 unknown */ return 0; @@ -2828,20 +2982,29 @@ /** * Parse a single firewalled location. + * + * @return TRUE if parsing was OK. */ -void +static bool dmesh_collect_fw_host(const struct sha1 *sha1, const char *value) { struct guid guid; - gboolean seen_proxy = FALSE; - gboolean seen_guid = FALSE; - gboolean seen_pptls = FALSE; + bool seen_proxy = FALSE, seen_guid = FALSE, seen_pptls = FALSE, ok; time_t stamp = 0; - const char *tok; + const char *tok, *start; strtok_t *st; dmesh_fwinfo_t info; /* + * If we're given an empty value, assume it's OK. + */ + + start = skip_ascii_blanks(value); + + if G_UNLIKELY('\0' == *start) + return TRUE; + + /* * An X-Falt header is formatted as: * * X-Falt: 9DBC52EEEBCA2C8A79036D626B959900;fwt/1; @@ -2858,13 +3021,13 @@ * at the end (e.g "2010-02-23 16:06:55Z"). */ - st = strtok_make_strip(value); + st = strtok_make_strip(start); info.guid = NULL; info.proxies = NULL; while ((tok = strtok_next(st, ";"))) { host_addr_t addr; - guint16 port; + uint16 port; gnet_host_t host; /* GUID is the first item we expect */ @@ -2880,7 +3043,7 @@ if (strstr(tok, "/")) continue; - /* Skip first "pptsl=" indication */ + /* Skip first "pptls=" indication */ if (!seen_pptls) { /* TODO: handle pptls=<hex> */ if (is_strcaseprefix(tok, "pptls=")) { @@ -2911,16 +3074,13 @@ if (!string_to_host_addr_port(tok, NULL, &addr, &port)) continue; - if (!seen_guid) - break; /* No GUID before proxy list, something is wrong */ - seen_proxy = TRUE; /* Entering the push-proxy list */ if (is_private_addr(addr) || !host_is_valid(addr, port)) continue; if (info.proxies == NULL) - info.proxies = hash_list_new(gnet_host_hash, gnet_host_eq); + info.proxies = hash_list_new(gnet_host_hash, gnet_host_equal); gnet_host_set(&host, addr, port); if (!hash_list_contains(info.proxies, &host)) { @@ -2928,28 +3088,47 @@ } } - strtok_free(st); + strtok_free_null(&st); + + /* + * The GUID is the only mandatory part we need to parse correctly: it + * is that of the firewalled node serving the file. + * + * Missing associated push proxies is fine, we can always collect + * these later. + */ if (NULL == info.guid) { + ok = FALSE; if (GNET_PROPERTY(dmesh_debug)) g_warning("could not parse 'X-Falt: %s'", value); } else { + ok = TRUE; if (!dmesh_raw_fw_add(sha1, &info, stamp, TRUE)) { hash_list_free_all(&info.proxies, gnet_host_free); } atom_guid_free_null(&info.guid); } + + return ok; } /** * Parse value of the "X-Falt" header to extract alternate firewalled sources * for a given SHA1 key. + * + * @param sha1 the SHA1 for which we're collecting alt-locs + * @param value the value of the header field we're parsing + * @param origin if not NULL, the host supplying us with the alt-locs + * @param user_agent if not NULL, advertised servent name giving the value */ void -dmesh_collect_fw_hosts(const struct sha1 *sha1, const char *value) +dmesh_collect_fw_hosts(const struct sha1 *sha1, const char *value, + const gnet_host_t *origin, const char *user_agent) { const char *tok; strtok_t *st; + bool ok = TRUE; /* * An X-Falt header can contain several items, separated by ",". @@ -2957,9 +3136,13 @@ st = strtok_make_strip(value); while ((tok = strtok_next(st, ","))) { - dmesh_collect_fw_host(sha1, tok); + ok &= dmesh_collect_fw_host(sha1, tok); + } + strtok_free_null(&st); + + if G_UNLIKELY(!ok && GNET_PROPERTY(dmesh_debug)) { + dmesh_fw_altloc_trace(&ok, value, origin, user_agent); } - strtok_free(st); } /** @@ -2969,13 +3152,13 @@ void dmesh_check_results_set(gnet_results_set_t *rs) { - GSList *sl; + pslist_t *sl; time_t now = tm_time(); - for (sl = rs->records; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(rs->records, sl) { gnet_record_t *rc = sl->data; dmesh_urlinfo_t info; - gboolean has = FALSE; + bool has = FALSE; if (rc->sha1 == NULL) continue; @@ -2988,13 +3171,14 @@ * sharing this SHA1. */ - has = NULL != g_hash_table_lookup(mesh, rc->sha1); + has = hikset_contains(mesh, rc->sha1); if (!has) { - const shared_file_t *sf = shared_file_by_sha1(rc->sha1); + shared_file_t *sf = shared_file_by_sha1(rc->sha1); has = sf != NULL && sf != SHARE_REBUILDING && !shared_file_is_partial(sf); + shared_file_unref(&sf); } if (has) { @@ -3013,7 +3197,7 @@ for (i = gnet_host_vec_count(alt) - 1; i >= 0; i--) { struct gnutella_host host; - + host = gnet_host_vec_get(alt, i); dmesh_fill_info(&info, rc->sha1, gnet_host_get_addr(&host), gnet_host_get_port(&host), @@ -3082,14 +3266,13 @@ * Store key/value pair in file. */ static void -dmesh_store_kv(gpointer key, gpointer value, gpointer udata) +dmesh_store_kv(void *value, void *udata) { const struct dmesh *dm = value; FILE *out = udata; list_iter_t *iter; - g_assert(key); - fprintf(out, "%s\n", sha1_base32(key)); + fprintf(out, "%s\n", sha1_base32(dm->sha1)); iter = list_iter_before_head(dm->entries); @@ -3113,8 +3296,8 @@ * The storing callback for each item is `store_cb'. */ static void -dmesh_store_hash(const char *what, GHashTable *hash, const char *file, - header_func_t header_cb, GHFunc store_cb) +dmesh_store_hikset(const char *what, hikset_t *hash, const char *file, + header_func_t header_cb, data_fn_t store_cb) { FILE *out; file_path_t fp; @@ -3126,7 +3309,7 @@ return; header_cb(out); - g_hash_table_foreach(hash, store_cb, out); + hikset_foreach(hash, store_cb, out); file_config_close(out, &fp); } @@ -3156,7 +3339,7 @@ void dmesh_store(void) { - dmesh_store_hash("download mesh", + dmesh_store_hikset("download mesh", mesh, dmesh_file, dmesh_header_print, dmesh_store_kv); } @@ -3164,19 +3347,19 @@ * Retrieve download mesh and add entries that have not expired yet. * The mesh is normally retrieved from ~/.gtk-gnutella/dmesh. */ -static G_GNUC_COLD void +static void G_COLD dmesh_retrieve(void) { FILE *f; char tmp4096; struct sha1 sha1; - gboolean has_sha1 = FALSE; - gboolean skip = FALSE, truncated = FALSE; + bool has_sha1 = FALSE; + bool skip = FALSE, truncated = FALSE; int line = 0; file_path_t fp1; file_path_set(fp, settings_config_dir(), dmesh_file); - f = file_config_open_read("download mesh", fp, G_N_ELEMENTS(fp)); + f = file_config_open_read("download mesh", fp, N_ITEMS(fp)); if (!f) return; @@ -3214,17 +3397,17 @@ continue; if (has_sha1) { - if (GNET_PROPERTY(dmesh_debug)) + if (GNET_PROPERTY(dmesh_debug) > 3) g_debug("%s(): parsing %s", G_STRFUNC, tmp); if (is_strprefix(tmp, "http://")) { - dmesh_collect_locations(&sha1, tmp); + dmesh_collect_locations(&sha1, tmp, NULL, "download mesh"); } else { - dmesh_collect_fw_hosts(&sha1, tmp); + dmesh_collect_fw_hosts(&sha1, tmp, NULL, "download mesh"); } } else { if ( strlen(tmp) < SHA1_BASE32_SIZE || - SHA1_RAW_SIZE != base32_decode(sha1.data, sizeof sha1.data, + SHA1_RAW_SIZE != base32_decode(&sha1, sizeof sha1, tmp, SHA1_BASE32_SIZE) ) { g_warning("%s: bad base32 SHA1 '%.32s' at line #%d, ignoring", @@ -3243,15 +3426,13 @@ * Store key/value pair in file. */ static void -dmesh_ban_store_kv(gpointer key, gpointer value, gpointer udata) +dmesh_ban_store_kv(void *value, void *udata) { const struct dmesh_banned *dmb = value; FILE *out = udata; - g_assert(key == dmb->info); - fprintf(out, "%lu %s\n", - (gulong) dmb->created, dmesh_urlinfo_to_string(dmb->info)); + (ulong) dmb->created, dmesh_urlinfo_to_string(dmb->info)); } /** @@ -3274,7 +3455,7 @@ void dmesh_ban_store(void) { - dmesh_store_hash("banned mesh", + dmesh_store_hikset("banned mesh", ban_mesh, dmesh_ban_file, dmesh_ban_header_print, dmesh_ban_store_kv); } @@ -3282,7 +3463,7 @@ * Retrieve banned mesh and add entries that have not expired yet. * The mesh is normally retrieved from ~/.gtk-gnutella/dmesh_ban. */ -static G_GNUC_COLD void +static void G_COLD dmesh_ban_retrieve(void) { FILE *in; @@ -3343,46 +3524,41 @@ /** * Free key/value pair in download mesh hash. */ -static gboolean -dmesh_free_kv(gpointer key, gpointer value, gpointer unused_udata) +static void +dmesh_free_kv(void *value, void *unused_udata) { struct dmesh *dm = value; (void) unused_udata; - atom_sha1_free(key); dm_free(dm); - - return TRUE; } /** * Prepend the value to the list, given by reference. */ static void -dmesh_ban_prepend_list(gpointer key, gpointer value, gpointer user) +dmesh_ban_prepend_list(void *value, void *user) { struct dmesh_banned *dmb = value; - GSList **listref = user; - - g_assert(key == dmb->info); + pslist_t **listref = user; - *listref = g_slist_prepend(*listref, dmb); + *listref = pslist_prepend(*listref, dmb); } /** * Called at servent shutdown time. */ -G_GNUC_COLD void +void G_COLD dmesh_close(void) { - GSList *banned = NULL; - GSList *sl; + pslist_t *banned = NULL; + pslist_t *sl; dmesh_store(); dmesh_ban_store(); - g_hash_table_foreach_remove(mesh, dmesh_free_kv, NULL); - gm_hash_table_destroy_null(&mesh); + hikset_foreach(mesh, dmesh_free_kv, NULL); + hikset_free_null(&mesh); /* * Construct a list of banned mesh entries to remove, then manually @@ -3390,17 +3566,17 @@ * and `ban_mesh_by_sha1' as well. */ - g_hash_table_foreach(ban_mesh, dmesh_ban_prepend_list, &banned); + hikset_foreach(ban_mesh, dmesh_ban_prepend_list, &banned); - for (sl = banned; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(banned, sl) { struct dmesh_banned *dmb = sl->data; cq_cancel(&dmb->cq_ev); dmesh_ban_expire(dmesh_cq, dmb); } - gm_slist_free_null(&banned); - gm_hash_table_destroy_null(&ban_mesh); - gm_hash_table_destroy_null(&ban_mesh_by_sha1); + pslist_free_null(&banned); + hikset_free_null(&ban_mesh); + htable_free_null(&ban_mesh_by_sha1); cq_free_null(&dmesh_cq); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/dmesh.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/dmesh.h
Changed
@@ -38,7 +38,10 @@ #include "downloads.h" #include "hcache.h" /* For host_net_t */ +#include "if/gen/dmesh_url.h" + #include "lib/hashlist.h" +#include "lib/gnet_host.h" /** * Our level of support for firewalled alt-locs. @@ -60,8 +63,8 @@ typedef struct { const char *name; /**< File name (atom) */ host_addr_t addr; /**< Host address */ - guint idx; /**< File index (URN_INDEX means URN access) */ - guint16 port; /**< Host port */ + uint idx; /**< File index (URN_INDEX means URN access) */ + uint16 port; /**< Host port */ } dmesh_urlinfo_t; /** @@ -75,17 +78,6 @@ /** * Error codes from dmesh_url_parse(). */ - -typedef enum { - DMESH_URL_OK = 0, /**< All OK */ - DMESH_URL_HTTP_PARSER, /**< Error from http_url_parse() */ - DMESH_URL_BAD_FILE_PREFIX, /**< File prefix neither /uri-res nor /get */ - DMESH_URL_RESERVED_INDEX, /**< Index in /get/index is reserved */ - DMESH_URL_NO_FILENAME, /**< No filename after /get/index */ - DMESH_URL_BAD_ENCODING, /**< Bad URL encoding */ - DMESH_URL_BAD_URI_RES /**< Malformed /uri-res/N2R? */ -} dmesh_url_error_t; - extern dmesh_url_error_t dmesh_url_errno; /* @@ -95,51 +87,53 @@ void dmesh_init(void); void dmesh_close(void); -gboolean dmesh_can_use_fwalt(void); +bool dmesh_can_use_fwalt(void); const char *dmesh_url_strerror(dmesh_url_error_t errnum); -gboolean dmesh_url_parse(const char *url, dmesh_urlinfo_t *info); +bool dmesh_url_parse(const char *url, dmesh_urlinfo_t *info); -gboolean dmesh_add( - const struct sha1 *sha1, const host_addr_t addr, guint16 port, guint idx, +bool dmesh_add( + const struct sha1 *sha1, const host_addr_t addr, uint16 port, uint idx, const char *name, time_t stamp); -gboolean dmesh_remove( - const struct sha1 *sha1, const host_addr_t addr, guint16 port, guint idx, +bool dmesh_remove( + const struct sha1 *sha1, const host_addr_t addr, uint16 port, uint idx, const char *name); void dmesh_add_alternate(const struct sha1 *sha1, - host_addr_t addr, guint16 port); + host_addr_t addr, uint16 port); void dmesh_add_good_alternate(const struct sha1 *sha1, - host_addr_t addr, guint16 port); + host_addr_t addr, uint16 port); void dmesh_remove_alternate(const struct sha1 *sha1, - host_addr_t addr, guint16 port); + host_addr_t addr, uint16 port); void dmesh_add_alternates(const struct sha1 *sha1, const gnet_host_vec_t *vec); void dmesh_add_good_firewalled(const struct sha1 *sha1, const struct guid *guid); void dmesh_negative_alt(const struct sha1 *sha1, - host_addr_t reporter, host_addr_t addr, guint16 port); + host_addr_t reporter, host_addr_t addr, uint16 port); void dmesh_good_mark(const struct sha1 *sha1, - host_addr_t addr, guint16 port, gboolean good); + host_addr_t addr, uint16 port, bool good); int dmesh_count(const struct sha1 *sha1); -gboolean dmesh_collect_sha1(const char *value, struct sha1 *sha1); -void dmesh_collect_locations(const struct sha1 *sha1, const char *value); +bool dmesh_collect_sha1(const char *value, struct sha1 *sha1); +void dmesh_collect_locations(const struct sha1 *sha1, const char *value, + const gnet_host_t *origin, const char *user_agent); void dmesh_collect_compact_locations(const struct sha1 *sha1, - const char *value); -void dmesh_collect_fw_hosts(const struct sha1 *sha1, const char *value); + const char *value, const gnet_host_t *origin, const char *user_agent); +void dmesh_collect_fw_hosts(const struct sha1 *sha1, const char *value, + const gnet_host_t *origin, const char *user_agent); void dmesh_collect_negative_locations(const struct sha1 *sha1, - const char *value, host_addr_t reporter); + const char *value, host_addr_t reporter, const char *user_agent); int dmesh_fill_alternate(const struct sha1 *sha1, gnet_host_t *hvec, int hcnt); int dmesh_alternate_location( const struct sha1 *sha1, char * buf, size_t size, const host_addr_t addr, time_t last_sent, const char *vendor, fileinfo_t *fi, - gboolean request, const struct guid *guid, host_net_t net); + bool request, const struct guid *guid, host_net_t net); void dmesh_multiple_downloads( const struct sha1 *sha1, filesize_t size, fileinfo_t *fi);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/downloads.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/downloads.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2001-2011, Raphael Manfredi + * Copyright (c) 2001-2011, 2015 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -36,6 +36,7 @@ #include "gtk-gnutella.h" #include "downloads.h" + #include "ban.h" #include "bh_download.h" #include "bh_upload.h" @@ -44,7 +45,6 @@ #include "ctl.h" #include "dmesh.h" #include "features.h" -#include "file_object.h" #include "gdht.h" #include "geo_ip.h" #include "gmsg.h" @@ -77,6 +77,9 @@ #include "version.h" #include "vmsg.h" +#include "g2/build.h" +#include "g2/node.h" + #include "if/gnet_property.h" #include "if/gnet_property_priv.h" #include "if/bridge/c2ui.h" @@ -84,6 +87,7 @@ #include "if/dht/dht.h" #include "lib/adns.h" +#include "lib/aging.h" #include "lib/array.h" #include "lib/ascii.h" #include "lib/atoms.h" @@ -92,18 +96,25 @@ #include "lib/dbus_util.h" #include "lib/dualhash.h" #include "lib/endian.h" +#include "lib/entropy.h" #include "lib/file.h" +#include "lib/file_object.h" #include "lib/filename.h" #include "lib/getdate.h" #include "lib/getline.h" -#include "lib/glib-missing.h" #include "lib/halloc.h" +#include "lib/hashing.h" #include "lib/hashlist.h" +#include "lib/hikset.h" +#include "lib/htable.h" +#include "lib/http_range.h" #include "lib/idtable.h" #include "lib/iso3166.h" #include "lib/magnet.h" #include "lib/palloc.h" #include "lib/parse.h" +#include "lib/plist.h" +#include "lib/pslist.h" #include "lib/random.h" #include "lib/sequence.h" #include "lib/str.h" @@ -143,60 +154,63 @@ #define DOWNLOAD_CONNECT_DELAY 12 /**< Seconds between connections */ #define DOWNLOAD_PIPELINE_MSECS 10000 /**< Less than 10 secs away */ #define DOWNLOAD_FS_SPACE 16384 /**< Min filesystem free space */ +#define DOWNLOAD_PUSH_FREQ 30 /**< Each 30 secs, we allow sending... */ +#define DOWNLOAD_PUSH_MAX 4 /**< ...4 PUSHes max to a server */ #define IO_AVG_RATE 5 /**< Compute global recv rate every 5 secs */ static hash_list_t *sl_downloads; /**< All downloads (queued + unqueued) */ static hash_list_t *sl_unqueued; /**< Unqueued downloads only */ -static GSList *sl_removed; /**< Removed downloads only */ -static GSList *sl_removed_servers; /**< Removed servers only */ - -static const char DL_OK_EXT = ".OK"; /**< Extension to mark OK files */ -static const char DL_BAD_EXT = ".BAD"; /**< "Bad" files (SHA1 mismatch) */ -static const char DL_UNKN_EXT = ".UNKN"; /**< For unchecked files */ -static const char no_reason = "<no reason>"; /**< Don't translate this */ -static const char dev_null = "/dev/null"; +static pslist_t *sl_removed; /**< Removed downloads only */ +static pslist_t *sl_removed_servers;/**< Removed servers only */ +static aging_table_t *local_pushes; /**< Throttle push messages to a server */ + +static const char DL_OK_EXT = ".OK"; /**< Extension to mark OK files */ +static const char DL_BAD_EXT = ".BAD"; /**< "Bad" files (SHA1 mismatch) */ +static const char DL_UNKN_EXT = ".UNKN"; /**< For unchecked files */ +static const char no_reason = "<no reason>"; /**< Don't translate this */ +static const char dev_null = "/dev/null"; +static const char APP_G2 = "application/x-gnutella2"; +static const char APP_GNUTELLA = "application/x-gnutella-packets"; static void download_add_to_list(struct download *d, enum dl_list idx); -static gboolean download_send_push_request( - struct download *d, gboolean, gboolean); -static gboolean download_read(struct download *d, pmsg_t *mb); -static gboolean download_ignore_data(struct download *d, pmsg_t *mb); -static void download_request(struct download *d, header_t *header, gboolean ok); +static bool download_send_push_request( + struct download *d, bool, bool); +static bool download_read(struct download *d, pmsg_t *mb); +static bool download_ignore_data(struct download *d, pmsg_t *mb); +static void download_reply(struct download *d, header_t *header, bool ok); static void download_push_ready(struct download *d, getline_t *empty); -static void download_push(struct download *d, gboolean on_timeout); +static void download_push(struct download *d, bool on_timeout); static void download_resume_bg_tasks(void); static void download_incomplete_header(struct download *d); -static gboolean has_blank_guid(const struct download *d); +static bool has_blank_guid(const struct download *d); static void download_verify_sha1(struct download *d); static void download_verify_tigertree(struct download *d); -static gboolean download_get_server_name(struct download *d, header_t *header); -static gboolean use_push_proxy(struct download *d); +static bool download_get_server_name(struct download *d, header_t *header); +static bool use_push_proxy(struct download *d); static void download_unavailable(struct download *d, download_status_t new_status, - const char * reason, ...) G_GNUC_PRINTF(3, 4); -static void download_queue_delay(struct download *d, guint32 delay, - const char *fmt, ...) G_GNUC_PRINTF(3, 4); -static void download_queue_hold(struct download *d, guint32 hold, - const char *fmt, ...) G_GNUC_PRINTF(3, 4); -static void download_force_stop(struct download *d, - download_status_t new_status, const char * reason, ...); + const char * reason, ...) G_PRINTF(3, 4); +static void download_queue_delay(struct download *d, uint32 delay, + const char *fmt, ...) G_PRINTF(3, 4); +static void download_queue_hold(struct download *d, uint32 hold, + const char *fmt, ...) G_PRINTF(3, 4); +static void download_force_stop(struct download *d, const char * reason, ...); static void download_reparent(struct download *d, struct dl_server *new_server); static void download_silent_flush(struct download *d); static void change_server_addr(struct dl_server *server, - const host_addr_t new_addr, const guint16 new_port); -static struct download *download_pick_another( - const struct download *d, const struct download *pd); + const host_addr_t new_addr, const uint16 new_port); +static struct download *download_pick_another(const struct download *d); static void download_got_push_route(const guid_t *guid); -static gboolean download_dirty; -static gboolean download_shutdown; -static gboolean queue_frozen_on_write_error; +static bool download_dirty; +static bool download_shutdown; +static bool queue_frozen_on_write_error; static void download_store(void); static void download_retrieve(void); -gboolean +bool download_is_alive(const struct download *d) { download_check(d); @@ -239,7 +253,7 @@ /** * Did we successfully connect to the server recently? */ -static gboolean +bool download_is_active(const struct download *d) { download_check(d); @@ -280,11 +294,11 @@ /** * Is download in a "running" list? */ -static gboolean +static bool download_is_running(const struct download *d) { download_check(d); - dl_server_valid(d->server); + g_assert(dl_server_valid(d->server)); return DL_LIST_RUNNING == d->list_idx; } @@ -292,10 +306,12 @@ /** * Return download status string. */ -static const char * -download_status_to_code_str(download_status_t status) +const char * +download_status_to_string(const download_t *d) { - switch (status) { + download_check(d); + + switch (d->status) { case GTA_DL_INVALID: return "INVALID"; case GTA_DL_ACTIVE_QUEUED: return "ACTIVE_QUEUED"; case GTA_DL_CONNECTING: return "CONNECTING"; @@ -328,7 +344,7 @@ static void download_set_status(struct download *d, download_status_t status) { - gboolean was_alive, is_alive; + bool was_alive, is_alive; download_check(d); @@ -381,12 +397,15 @@ if (server->hostname) { concat_strings(name, sizeof name, " (", server->hostname, ") ", - (void *) 0); + NULL_PTR); } concat_strings(info, sizeof info, - "<", host, name, " \'", server->vendor ? server->vendor : "", "\'>", - (void *) 0); + "<", + (server->attrs & DLS_A_G2_ONLY) ? "G2 " : "", + host, name, " \'", server->vendor ? server->vendor : "", "\'>", + NULL_PTR); + return info; } @@ -400,15 +419,15 @@ * where hosts are sorted based on their retry time. */ -static GHashTable *dl_by_host; +static hikset_t *dl_by_host; #define DHASH_SIZE (1UL << 10) /**< Hash list size, must be a power of 2 */ #define DHASH_MASK (DHASH_SIZE - 1) #define DL_HASH(x) ((x) & DHASH_MASK) static struct { - GList *serversDHASH_SIZE; /**< Lists of servers, by retry time */ - int changeDHASH_SIZE; /**< Counts changes to the list */ + plist_t *serversDHASH_SIZE; /**< Lists of servers, by retry time */ + int changeDHASH_SIZE; /**< Counts changes to the list */ } dl_by_time; /** @@ -421,21 +440,21 @@ * one such entry, ever. If there is more, it means the server changed its * GUID, which is possible, in which case we simply supersede the old entry. */ -static GHashTable *dl_by_addr; +static htable_t *dl_by_addr; /** * To be able to handle push-proxy lookups from the DHT, we remember servers * by GUID as well. In case there is a conflict (two hosts bearing the same * GUID), we keep only the first server we see with that GUID. */ -static GHashTable *dl_by_guid; +static htable_t *dl_by_guid; /** * Each source is given a random unique GUID so that we can easily associate * a download with its THEX download. The dl_by_id hashtable maps a GUID * to its corresponding download. */ -static GHashTable *dl_by_id; +static hikset_t *dl_by_id; /** * Associates a plain download with its corresponding THEX download in a @@ -448,11 +467,11 @@ */ struct dl_addr { host_addr_t addr; /**< IP address of server */ - guint16 port; /**< Port of server */ + uint16 port; /**< Port of server */ }; -static guint dl_establishing = 0; /**< Establishing downloads */ -static guint dl_active = 0; /**< Active downloads */ +static uint dl_establishing = 0; /**< Establishing downloads */ +static uint dl_active = 0; /**< Active downloads */ /** * Keep track of downloads per SHA1. @@ -463,23 +482,23 @@ * This is used to determine whether a SHA1 is rare on the network (has only * partial sources). */ -static GHashTable *dhl_by_sha1; +static htable_t *dhl_by_sha1; -static inline guint +static inline uint count_running_downloads(void) { return dl_establishing + dl_active; } -static inline guint +static inline uint server_list_length(const struct dl_server *server, enum dl_list idx) { g_assert(dl_server_valid(server)); - g_assert((guint) idx < DL_LIST_SZ); + g_assert((uint) idx < DL_LIST_SZ); return server->listidx ? list_length(server->listidx) : 0; } -static inline guint +static inline uint count_running_on_server(const struct dl_server *server) { return server_list_length(server, DL_LIST_RUNNING); @@ -572,7 +591,7 @@ /** * Can we issue a pipelined request for a given download? */ -static gboolean +static bool download_pipeline_can_initiate(const struct download *d) { fileinfo_t *fi; @@ -611,6 +630,9 @@ if ((DLS_A_FOOBAR & d->server->attrs) && 0 == d->served_reqs) return FALSE; + if (d->server->attrs & DLS_A_NO_PIPELINE) + return FALSE; /* Server seems to choke on pipelining */ + /* * If we have a pending THEX download, do not use pipelining so that * we can switch to the THEX download once the current chunk is done @@ -619,7 +641,7 @@ if (dualhash_contains_key(dl_thex, d->id)) { struct guid *id = dualhash_lookup_key(dl_thex, d->id); - struct download *dt = g_hash_table_lookup(dl_by_id, id); + struct download *dt = hikset_lookup(dl_by_id, id); download_check(dt); g_assert(dt->flags & DL_F_THEX); @@ -649,7 +671,7 @@ avg_bps = download_speed_avg(d); s = remain / (avg_bps ? avg_bps : 1); - dl_server_valid(d->server); + g_assert(dl_server_valid(d->server)); threshold = MAX(DOWNLOAD_PIPELINE_MSECS, GNET_PROPERTY(dl_http_latency)); threshold = MAX(threshold, d->server->latency); @@ -753,10 +775,10 @@ g_assert(d->file_info != NULL); g_assert(d->file_info->sha1 != NULL); - hl = g_hash_table_lookup(dhl_by_sha1, d->file_info->sha1); + hl = htable_lookup(dhl_by_sha1, d->file_info->sha1); if (NULL == hl) { - hl = hash_list_new(pointer_hash_func, NULL); - gm_hash_table_insert_const(dhl_by_sha1, d->file_info->sha1, hl); + hl = hash_list_new(pointer_hash, NULL); + htable_insert(dhl_by_sha1, d->file_info->sha1, hl); } g_soft_assert(!hash_list_contains(hl, d)); @@ -776,14 +798,14 @@ g_assert(d->file_info != NULL); g_assert(d->file_info->sha1 != NULL); - hl = g_hash_table_lookup(dhl_by_sha1, d->file_info->sha1); + hl = htable_lookup(dhl_by_sha1, d->file_info->sha1); g_assert(hl != NULL); g_soft_assert(hash_list_contains(hl, d)); hash_list_remove(hl, d); if (0 == hash_list_length(hl)) { - g_hash_table_remove(dhl_by_sha1, d->file_info->sha1); + htable_remove(dhl_by_sha1, d->file_info->sha1); hash_list_free(&hl); } } @@ -791,16 +813,16 @@ /** * Check whether all the active sources for a SHA1 are partial. */ -gboolean +bool download_sha1_is_rare(const struct sha1 *sha1) { hash_list_t *hl; hash_list_iter_t *iter; - gboolean rare = TRUE; + bool rare = TRUE; g_assert(sha1 != NULL); - hl = g_hash_table_lookup(dhl_by_sha1, sha1); + hl = htable_lookup(dhl_by_sha1, sha1); if (NULL == hl) return TRUE; /* No source */ @@ -836,8 +858,8 @@ *** RX link callbacks ***/ -static G_GNUC_PRINTF(2, 3) void -download_rx_error(gpointer o, const char *reason, ...) +static void G_PRINTF(2, 3) +download_rx_error(void *o, const char *reason, ...) { struct download *d = o; char msg1024; @@ -845,14 +867,33 @@ download_check(d); + /* + * If we sent a pipelined request and got an RX error with the server not + * known to support pipelining, them flag it as not supporting pipelining! + * --RAM, 2012-12-09 + */ + + if ( + 0 == (d->server->attrs & DLS_A_PIPELINING) && + d->pipeline != NULL && + GTA_DL_PIPE_SENT == d->pipeline->status + ) { + d->server->attrs |= DLS_A_NO_PIPELINE; /* Disable pipelining */ + + if (GNET_PROPERTY(download_debug)) { + g_message("disabled pipelining to %s on I/O error", + download_host_info(d)); + } + } + va_start(args, reason); - gm_vsnprintf(msg, sizeof msg, reason, args); + str_vbprintf(msg, sizeof msg, reason, args); download_repair(d, msg); va_end(args); } static void -download_rx_got_eof(gpointer o) +download_rx_got_eof(void *o) { struct download *d = o; @@ -866,7 +907,7 @@ * * @return FALSE if an error occurred. */ -static gboolean +static bool download_data_ind(rxdrv_t *rx, pmsg_t *mb) { struct download *d = rx_owner(rx); @@ -897,7 +938,7 @@ * * @return FALSE if an error occurred. */ -static gboolean +static bool download_ignore_data_ind(rxdrv_t *rx, pmsg_t *mb) { struct download *d = rx_owner(rx); @@ -929,7 +970,7 @@ }; static void -download_chunk_rx_done(gpointer o) +download_chunk_rx_done(void *o) { struct download *d = o; @@ -951,8 +992,8 @@ * Received data from outside the RX stack. */ static void -download_write(struct download *d, gpointer data, size_t len, - gboolean pipelined_response) +download_write(struct download *d, void *data, size_t len, + bool pipelined_response) { pdata_t *db; pmsg_t *mb; @@ -997,11 +1038,9 @@ static struct download * download_alloc(void) { - static const struct download zero_download; struct download *d; - - WALLOC(d); - *d = zero_download; + + WALLOC0(d); d->magic = DOWNLOAD_MAGIC; return d; } @@ -1017,12 +1056,12 @@ download_free(struct download **d_ptr) { struct download *d; - + g_assert(d_ptr); d = *d_ptr; download_check(d); - g_hash_table_remove(dl_by_id, d->id); + hikset_remove(dl_by_id, d->id); dualhash_remove_key(dl_thex, d->id); atom_guid_free_null(&d->id); d->magic = 0; @@ -1033,15 +1072,14 @@ /** * Hashing of a `dl_key' structure. */ -static guint -dl_key_hash(gconstpointer key) +static uint +dl_key_hash(const void *key) { const struct dl_key *k = key; - guint hash; + uint hash; hash = guid_hash(k->guid); - hash ^= host_addr_hash(k->addr); - hash ^= (k->port << 16) | k->port; + hash ^= host_addr_port_hash(k->addr, k->port); return hash; } @@ -1050,11 +1088,11 @@ * Comparison of `dl_key' structures. */ static int -dl_key_eq(gconstpointer a, gconstpointer b) +dl_key_eq(const void *a, const void *b) { const struct dl_key *ak = a, *bk = b; - return host_addr_equal(ak->addr, bk->addr) && + return host_addr_equiv(ak->addr, bk->addr) && ak->port == bk->port && guid_eq(ak->guid, bk->guid); } @@ -1062,27 +1100,27 @@ /** * Hashing of a `dl_addr' structure. */ -static guint -dl_addr_hash(gconstpointer key) +static uint +dl_addr_hash(const void *key) { const struct dl_addr *k = key; - guint32 hash; + uint32 hash; hash = host_addr_hash(k->addr); hash ^= (k->port << 16) | k->port; - return (guint) hash; + return (uint) hash; } /** * Comparison of `dl_addr' structures. */ static int -dl_addr_eq(gconstpointer a, gconstpointer b) +dl_addr_eq(const void *a, const void *b) { const struct dl_addr *ak = a, *bk = b; - return host_addr_equal(ak->addr, bk->addr) && ak->port == bk->port; + return host_addr_equiv(ak->addr, bk->addr) && ak->port == bk->port; } /** @@ -1090,7 +1128,7 @@ * The smaller that time, the smaller the structure is. */ static int -dl_retry_cmp(gconstpointer p, gconstpointer q) +dl_retry_cmp(const void *p, const void *q) { const struct download *a = p, *b = q; @@ -1102,7 +1140,7 @@ * The smaller that time, the smaller the structure is. */ static int -dl_server_retry_cmp(gconstpointer p, gconstpointer q) +dl_server_retry_cmp(const void *p, const void *q) { const struct dl_server *a = p, *b = q; @@ -1112,22 +1150,22 @@ /** * @returns whether download has a blank (fake) GUID. */ -static gboolean +static bool has_blank_guid(const struct download *d) { return guid_is_blank(download_guid(d)); } -gboolean +bool download_has_blank_guid(const struct download *d) { return d->server && has_blank_guid(d); } - + /** * @returns whether download was faked to reparent a complete orphaned file. */ -gboolean +bool is_faked_download(const struct download *d) { return !is_host_addr(download_addr(d)) && @@ -1138,7 +1176,7 @@ /** * Was downloaded file verified to have a SHA1 matching the advertised one? */ -static gboolean +static bool has_good_sha1(const struct download *d) { fileinfo_t *fi = d->file_info; @@ -1147,32 +1185,6 @@ } /** - * Allocate random GUID to use as the download ID. - * - * @return a GUID atom, refcount incremented already. - */ -static const guid_t * -dl_random_guid_atom(void) -{ - struct guid id; - size_t i; - - /* - * Paranoid, in case the random number generator is broken. - */ - - for (i = 0; i < 100; i++) { - guid_random_fill(&id); - - if (NULL == g_hash_table_lookup(dl_by_id, &id)) - return atom_guid_get(&id); - } - - g_error("no luck with random number generator"); - return NULL; -} - -/** * Determine the set of networks we can return for alt-locs and push-proxies. */ static host_net_t @@ -1296,15 +1308,18 @@ /** * Initialize downloading data structures. */ -G_GNUC_COLD void +void G_COLD download_init(void) { - dl_by_host = g_hash_table_new(dl_key_hash, dl_key_eq); - dl_by_addr = g_hash_table_new(dl_addr_hash, dl_addr_eq); - dl_by_guid = g_hash_table_new(guid_hash, guid_eq); - dl_by_id = g_hash_table_new(guid_hash, guid_eq); - dhl_by_sha1 = g_hash_table_new(sha1_hash, sha1_eq); + dl_by_host = hikset_create_any( + offsetof(struct dl_server, key), dl_key_hash, dl_key_eq); + dl_by_addr = htable_create_any(dl_addr_hash, NULL, dl_addr_eq); + dl_by_guid = htable_create(HASH_KEY_FIXED, GUID_RAW_SIZE); + dl_by_id = hikset_create( + offsetof(struct download, id), HASH_KEY_FIXED, GUID_RAW_SIZE); + dhl_by_sha1 = htable_create(HASH_KEY_FIXED, SHA1_RAW_SIZE); dl_thex = dualhash_new(guid_hash, guid_eq, guid_hash, guid_eq); + local_pushes = aging_make(DOWNLOAD_PUSH_FREQ, dl_key_hash, dl_key_eq, NULL); header_features_add_guarded(FEATURES_DOWNLOADS, "browse", BH_VERSION_MAJOR, BH_VERSION_MINOR, @@ -1333,7 +1348,7 @@ /** * Initialize downloading data structures. */ -G_GNUC_COLD void +void G_COLD download_restore_state(void) { /* @@ -1438,7 +1453,7 @@ g_assert(b->mode == DL_BUF_READING); g_assert(b->held > 0); g_assert(b->list); - + iov = pmsg_slist_to_iovec(b->list, iov_cnt, &held); g_assert(iov); g_assert(*iov_cnt > 0); @@ -1476,7 +1491,7 @@ /** * Check whether reception buffers are full. */ -static inline gboolean +static inline bool buffers_full(const struct download *d) { const struct dl_buffers *b; @@ -1534,9 +1549,9 @@ pmsg_free(mb); if (GNET_PROPERTY(download_debug) > 10) - g_debug("buffers_add_read(): copied %d bytes " + g_debug("%s(): copied %d bytes " "into %d-byte long previous #%d (had %d bytes free)", - written, pmsg_size(prev_mb) - written, + G_STRFUNC, written, pmsg_size(prev_mb) - written, slist_length(b->list), available); } else slist_append(b->list, mb); @@ -1553,7 +1568,7 @@ /** * Check whether we should request flushing of the buffered data. */ -static inline gboolean +static inline bool buffers_should_flush(const struct download *d) { const struct dl_buffers *b; @@ -1576,7 +1591,7 @@ * * @return TRUE if data match. */ -static gboolean +static bool buffers_match(const struct download *d, const char *data, size_t len) { const struct dl_buffers *b; @@ -1595,7 +1610,7 @@ const pmsg_t *mb; size_t n; - g_assert(slist_iter_has_next(iter)); + g_assert(slist_iter_has_next(iter)); mb = slist_iter_next(iter); g_assert(mb); @@ -1747,12 +1762,12 @@ static void dl_by_time_insert(struct dl_server *server) { - guint idx = DL_HASH(server->retry_after); + uint idx = DL_HASH(server->retry_after); g_assert(dl_server_valid(server)); dl_by_time.changeidx++; - dl_by_time.serversidx = g_list_insert_sorted(dl_by_time.serversidx, + dl_by_time.serversidx = plist_insert_sorted(dl_by_time.serversidx, server, dl_server_retry_cmp); } @@ -1762,12 +1777,12 @@ static void dl_by_time_remove(struct dl_server *server) { - guint idx = DL_HASH(server->retry_after); + uint idx = DL_HASH(server->retry_after); g_assert(dl_server_valid(server)); dl_by_time.changeidx++; - dl_by_time.serversidx = g_list_remove(dl_by_time.serversidx, server); + dl_by_time.serversidx = plist_remove(dl_by_time.serversidx, server); } /** @@ -1790,8 +1805,8 @@ * * @return TRUE if host was added, FALSE if we already knew it. */ -static gboolean -add_proxy(struct dl_server *server, const host_addr_t addr, guint16 port) +static bool +add_proxy(struct dl_server *server, const host_addr_t addr, uint16 port) { g_assert(dl_server_valid(server)); @@ -1805,7 +1820,7 @@ * Remove push proxy from server. */ static void -remove_proxy(struct dl_server *server, const host_addr_t addr, guint16 port) +remove_proxy(struct dl_server *server, const host_addr_t addr, uint16 port) { g_assert(dl_server_valid(server)); @@ -1817,7 +1832,7 @@ * Allocate new server structure. */ static struct dl_server * -allocate_server(const struct guid *guid, const host_addr_t addr, guint16 port) +allocate_server(const struct guid *guid, const host_addr_t addr, uint16 port) { struct dl_key *key; struct dl_server *server; @@ -1834,9 +1849,9 @@ server->key = key; server->retry_after = tm_time(); server->country = gip_country(addr); - server->sha1_counts = g_hash_table_new(sha1_hash, sha1_eq); + server->sha1_counts = htable_create(HASH_KEY_FIXED, SHA1_RAW_SIZE); - g_hash_table_insert(dl_by_host, key, server); + hikset_insert_key(dl_by_host, &server->key); dl_by_time_insert(server); /* @@ -1846,15 +1861,15 @@ if (host_is_valid(addr, port)) { struct dl_addr *ipk; - gpointer ipkey; - gpointer x; /* Don't care about freeing values */ - gboolean existed; + const void *ipkey; + void *x; /* Don't care about freeing values */ + bool existed; WALLOC(ipk); ipk->addr = addr; /* Struct copy */ ipk->port = port; - existed = g_hash_table_lookup_extended(dl_by_addr, ipk, &ipkey, &x); + existed = htable_lookup_extended(dl_by_addr, ipk, &ipkey, &x); /* * For the rare cases where the key already existed, we "take @@ -1864,13 +1879,13 @@ */ if (existed) { - struct dl_addr *da = ipkey; + const struct dl_addr *da = ipkey; g_assert(da != ipk); g_assert(host_addr_initialized(da->addr)); WFREE(ipk); /* Keep the old key */ - g_hash_table_insert(dl_by_addr, da, server); + htable_insert(dl_by_addr, da, server); } else - g_hash_table_insert(dl_by_addr, ipk, server); + htable_insert(dl_by_addr, ipk, server); } /* @@ -1880,11 +1895,10 @@ */ if (!guid_is_blank(guid)) { - gboolean existed; - gpointer x; - gpointer value; + bool existed; + void *value; - existed = g_hash_table_lookup_extended(dl_by_guid, guid, &x, &value); + existed = htable_lookup_extended(dl_by_guid, guid, NULL, &value); if (existed) { struct dl_server *old = value; @@ -1896,7 +1910,7 @@ host_addr_port_to_string2( server->key->addr, server->key->port)); } else { - gm_hash_table_insert_const(dl_by_guid, server->key->guid, server); + htable_insert(dl_by_guid, server->key->guid, server); } } @@ -1906,7 +1920,7 @@ static void server_list_free_all(struct dl_server *server) { - guint i; + uint i; g_assert(dl_server_valid(server)); g_assert(0 == count_running_on_server(server)); @@ -1917,6 +1931,16 @@ } /** + * Unregister server key from the tables that could reference it. + */ +static void +server_key_unregister(const struct dl_key *key) +{ + hikset_remove(dl_by_host, key); + aging_remove(local_pushes, key); +} + +/** * Unregister server so that get_server() may no longer find it. */ static void @@ -1925,7 +1949,7 @@ g_assert(dl_server_valid(server)); dl_by_time_remove(server); - g_hash_table_remove(dl_by_host, server->key); + server_key_unregister(server->key); /* * We only inserted the server in the `dl_addr' table if it was "reachable". @@ -1933,13 +1957,12 @@ { struct dl_addr ipk; - gpointer ipkey; - gpointer x; /* Don't care about freeing values */ + const void *ipkey; + void *x; ipk.addr = server->key->addr; ipk.port = server->key->port; - /* * Only remove server in the `dl_by_addr' table if it is the one * for which the IP key is recored. Otherwise, what can happen @@ -1949,11 +1972,11 @@ * we'll free the key of the new server. */ - if (g_hash_table_lookup_extended(dl_by_addr, &ipk, &ipkey, &x)) { - struct dl_addr *da = ipkey; + if (htable_lookup_extended(dl_by_addr, &ipk, &ipkey, &x)) { + struct dl_addr *da = deconstify_pointer(ipkey); g_assert(host_addr_initialized(da->addr)); if (x == server) { /* We own the key */ - g_hash_table_remove(dl_by_addr, &ipk); + htable_remove(dl_by_addr, &ipk); WFREE(da); } } @@ -1966,9 +1989,9 @@ if ( !guid_is_blank(server->key->guid) && - g_hash_table_lookup(dl_by_guid, server->key->guid) == server + htable_lookup(dl_by_guid, server->key->guid) == server ) { - g_hash_table_remove(dl_by_guid, server->key->guid); + htable_remove(dl_by_guid, server->key->guid); } } @@ -1994,7 +2017,7 @@ route_starving_remove(server->key->guid); { - guint n = g_hash_table_size(server->sha1_counts); + uint n = htable_count(server->sha1_counts); if (0 != n) { g_warning("server->sha1_counts (%s) contains still %u items", host_addr_port_to_string(server->key->addr, server->key->port), @@ -2002,7 +2025,7 @@ } } - gm_hash_table_destroy_null(&server->sha1_counts); + htable_free_null(&server->sha1_counts); atom_str_free_null(&server->vendor); atom_guid_free_null(&server->key->guid); WFREE(server->key); @@ -2020,7 +2043,7 @@ g_assert(!(server->attrs & DLS_A_REMOVED)); server->attrs |= DLS_A_REMOVED; /* Insert once in list */ - sl_removed_servers = g_slist_prepend(sl_removed_servers, server); + sl_removed_servers = pslist_prepend(sl_removed_servers, server); } /** @@ -2033,7 +2056,7 @@ g_assert(server->attrs & DLS_A_REMOVED); server->attrs &= ~DLS_A_REMOVED; /* Clear flag */ - sl_removed_servers = g_slist_remove(sl_removed_servers, server); + sl_removed_servers = pslist_remove(sl_removed_servers, server); } /** @@ -2044,7 +2067,7 @@ */ void download_found_server(const struct guid *guid, - const host_addr_t addr, guint16 port) + const host_addr_t addr, uint16 port) { struct dl_server *server; @@ -2061,7 +2084,7 @@ * XXX --RAM, 2008-09-01 */ - server = g_hash_table_lookup(dl_by_guid, guid); + server = htable_lookup(dl_by_guid, guid); if (NULL == server) { /* @@ -2071,7 +2094,7 @@ */ if (guid_eq(guid, GNET_PROPERTY(servent_guid))) { - gnet_stats_count_general(GNR_OWN_GUID_COLLISIONS, 1); + gnet_stats_inc_general(GNR_OWN_GUID_COLLISIONS); if (GNET_PROPERTY(download_debug)) { g_warning("discovered that host %s bears our GUID!", @@ -2087,7 +2110,7 @@ ipk.addr = addr; ipk.port = port; - server = g_hash_table_lookup(dl_by_addr, &ipk); + server = htable_lookup(dl_by_addr, &ipk); if (server && guid_is_blank(server->key->guid)) { struct dl_key *key = server->key; @@ -2098,11 +2121,11 @@ host_addr_port_to_string(addr, port)); } - g_hash_table_remove(dl_by_host, key); - gnet_stats_count_general(GNR_DISCOVERED_SERVER_GUID, 1); + server_key_unregister(key); + gnet_stats_inc_general(GNR_DISCOVERED_SERVER_GUID); atom_guid_change(&key->guid, guid); - gm_hash_table_insert_const(dl_by_guid, key->guid, server); - g_hash_table_insert(dl_by_host, key, server); + htable_insert(dl_by_guid, key->guid, server); + hikset_insert_key(dl_by_host, &server->key); } } else { if (GNET_PROPERTY(download_debug)) { @@ -2121,7 +2144,7 @@ * Check whether something changed at all. */ - if (host_addr_equal(addr, server->key->addr) && port == server->key->port) + if (host_addr_equiv(addr, server->key->addr) && port == server->key->port) return; if (GNET_PROPERTY(download_debug)) @@ -2142,7 +2165,7 @@ { struct download *next; - gnet_stats_count_general(GNR_CONSOLIDATED_SERVERS, 1); + gnet_stats_inc_general(GNR_CONSOLIDATED_SERVERS); next = hash_list_head(sl_downloads); while (next) { @@ -2177,10 +2200,10 @@ g_assert(dl_server_valid(server)); - for (i = 0; i < G_N_ELEMENTS(listnum); i++) { + for (i = 0; i < N_ITEMS(listnum); i++) { enum dl_list idx = listnumi; list_iter_t *iter; - + iter = list_iter_before_head(server->listidx); while (list_iter_has_next(iter)) { struct download *d; @@ -2205,8 +2228,8 @@ * server->key->port after calling get_server(). */ static struct dl_server * -get_server(const struct guid *guid, const host_addr_t addr, guint16 port, - gboolean allocate) +get_server(const struct guid *guid, const host_addr_t addr, uint16 port, + bool allocate) { struct dl_addr ikey; struct dl_key key; @@ -2223,7 +2246,7 @@ * server that has been deleted, we need to "undelete" it. */ - server = g_hash_table_lookup(dl_by_addr, &ikey); + server = htable_lookup(dl_by_addr, &ikey); if (server) { if (server->attrs & DLS_A_REMOVED) server_undelete(server); @@ -2235,11 +2258,11 @@ * So if we did not find it there, look in the table listing all servers. */ - key.guid = deconstify_gpointer(guid); + key.guid = deconstify_pointer(guid); key.addr = addr; key.port = port; - server = g_hash_table_lookup(dl_by_host, &key); + server = hikset_lookup(dl_by_host, &key); g_assert(server == NULL || dl_server_valid(server)); if (server) { @@ -2255,11 +2278,11 @@ */ if (!guid_is_blank(guid)) { - server = g_hash_table_lookup(dl_by_guid, guid); + server = htable_lookup(dl_by_guid, guid); if (server) { struct dl_key *skey = server->key; - guint16 new_country = gip_country(addr); + uint16 new_country = gip_country(addr); if (server->attrs & DLS_A_REMOVED) server_undelete(server); @@ -2276,7 +2299,7 @@ if (!allocate) goto allocated; - g_assert(!host_addr_equal(skey->addr, addr) || skey->port != port); + g_assert(!host_addr_equiv(skey->addr, addr) || skey->port != port); /* * We knew this server, and it bears a new IP or port. @@ -2287,7 +2310,7 @@ */ if ( - host_addr_equal(skey->addr, addr) || + host_addr_equiv(skey->addr, addr) || server->country == new_country || ( /* Address becomes routable */ @@ -2332,7 +2355,7 @@ */ if (!is_my_address_and_port(addr, port)) { - gnet_stats_count_general(GNR_OWN_GUID_COLLISIONS, 1); + gnet_stats_inc_general(GNR_OWN_GUID_COLLISIONS); if (GNET_PROPERTY(download_debug)) { g_warning("host %s bears our GUID!", @@ -2370,10 +2393,7 @@ allocated: if (g2_cache_lookup(addr, port)) { - server->attrs |= DLS_A_G2_ONLY | DLS_A_MINIMAL_HTTP; - if (GNET_PROPERTY(enable_hackarounds)) { - server->attrs |= DLS_A_FAKE_G2; - } + server->attrs |= DLS_A_G2_ONLY; } /* @@ -2406,7 +2426,7 @@ struct dl_server *correct; download_found_server(guid, addr, port); - correct = g_hash_table_lookup(dl_by_guid, guid); + correct = htable_lookup(dl_by_guid, guid); if (correct != NULL && correct != server) { if (GNET_PROPERTY(download_debug)) { @@ -2431,7 +2451,7 @@ if (GNET_PROPERTY(download_debug) > 1) { if ( - !host_addr_equal(addr, server->key->addr) || + !host_addr_equiv(addr, server->key->addr) || server->key->port != port || !guid_eq(server->key->guid, guid) ) { @@ -2452,7 +2472,7 @@ */ static void change_server_addr(struct dl_server *server, - const host_addr_t new_addr, const guint16 new_port) + const host_addr_t new_addr, const uint16 new_port) { struct dl_key *key = server->key; struct dl_server *duplicate; @@ -2460,7 +2480,7 @@ g_assert(dl_server_valid(server)); g_assert(host_addr_initialized(new_addr)); - g_hash_table_remove(dl_by_host, key); + server_key_unregister(key); /* * We only inserted the server in the `dl_addr' table if it was "reachable". @@ -2468,17 +2488,17 @@ if (host_is_valid(key->addr, key->port)) { struct dl_addr ipk; - gpointer ipkey; - gpointer x; /* Don't care about freeing values */ + const void *ipkey; + void *x; /* Don't care about freeing values */ ipk.addr = key->addr; ipk.port = key->port; - if (g_hash_table_lookup_extended(dl_by_addr, &ipk, &ipkey, &x)) { - struct dl_addr *da = ipkey; + if (htable_lookup_extended(dl_by_addr, &ipk, &ipkey, &x)) { + struct dl_addr *da = deconstify_pointer(ipkey); g_assert(host_addr_initialized(da->addr)); if (x == server) { /* We "own" the key -- see free_server() */ - g_hash_table_remove(dl_by_addr, da); + htable_remove(dl_by_addr, da); WFREE(da); } } @@ -2523,7 +2543,7 @@ if (duplicate != NULL && duplicate != server) { g_assert(dl_server_valid(duplicate)); - g_assert(host_addr_equal(duplicate->key->addr, key->addr)); + g_assert(host_addr_equiv(duplicate->key->addr, key->addr)); g_assert(duplicate->key->port == key->port); if (GNET_PROPERTY(download_debug)) { @@ -2552,16 +2572,16 @@ ) { struct dl_server *old; - old = g_hash_table_lookup(dl_by_guid, duplicate->key->guid); + old = htable_lookup(dl_by_guid, duplicate->key->guid); atom_guid_change(&key->guid, duplicate->key->guid); if (duplicate == old) - gm_hash_table_insert_const(dl_by_guid, key->guid, server); + htable_insert(dl_by_guid, key->guid, server); } else if ( !guid_eq(key->guid, duplicate->key->guid) && !guid_is_blank(duplicate->key->guid) ) { /* Remote node changed its GUID (after restart?) */ - gnet_stats_count_general(GNR_CHANGED_SERVER_GUID, 1); + gnet_stats_inc_general(GNR_CHANGED_SERVER_GUID); if (GNET_PROPERTY(download_debug)) g_warning( "found two distinct GUID for <%s> at %s:%u, keeping %s", @@ -2586,19 +2606,19 @@ g_assert(server->key == key); - g_hash_table_insert(dl_by_host, key, server); + hikset_insert_key(dl_by_host, &server->key); if (host_is_valid(key->addr, key->port)) { struct dl_addr *ipk; - gpointer ipkey; - gpointer x; /* Don't care about freeing values */ - gboolean existed; + const void *ipkey; + void *x; /* Don't care about freeing values */ + bool existed; WALLOC(ipk); ipk->addr = new_addr; ipk->port = key->port; - existed = g_hash_table_lookup_extended(dl_by_addr, ipk, &ipkey, &x); + existed = htable_lookup_extended(dl_by_addr, ipk, &ipkey, &x); /* * For the rare cases where the key already existed, we "take @@ -2608,13 +2628,13 @@ */ if (existed) { - struct dl_addr *da = ipkey; + const struct dl_addr *da = ipkey; g_assert(host_addr_initialized(da->addr)); g_assert(da != ipk); WFREE(ipk); /* Keep the old key around */ - g_hash_table_insert(dl_by_addr, da, server); + htable_insert(dl_by_addr, da, server); } else - g_hash_table_insert(dl_by_addr, ipk, server); + htable_insert(dl_by_addr, ipk, server); } /* @@ -2634,11 +2654,11 @@ * We're only interested in downloads to which we could switch an already * established connection. */ -static gboolean -download_has_pending_on_server(const struct download *d, gboolean retry_after) +static bool +download_has_pending_on_server(const struct download *d, bool retry_after) { list_iter_t *iter; - gboolean result = FALSE; + bool result = FALSE; time_t now = tm_time(); download_check(d); @@ -2676,11 +2696,11 @@ * * @return TRUE if we successfully setup the downloaded data to be ignored. */ -static gboolean +static bool download_can_ignore(struct download *d) { filesize_t remain; - guint speed_avg; + uint speed_avg; download_check(d); @@ -2704,11 +2724,11 @@ download_has_pending_on_server(d, FALSE) ) { if (GNET_PROPERTY(download_debug)) { - guint count = server_list_length(d->server, DL_LIST_WAITING); + uint count = server_list_length(d->server, DL_LIST_WAITING); g_debug("download \"%s\" has incoming connection from %s " "and %u waiting file%s on that server -- will sink %s bytes", download_basename(d), download_host_info(d), - count, 1 == count ? "" : "s", uint64_to_string(remain)); + count, plural(count), uint64_to_string(remain)); } goto sink_data; @@ -2751,7 +2771,7 @@ return TRUE; refused: - gnet_stats_count_general(GNR_IGNORING_REFUSED, 1); + gnet_stats_inc_general(GNR_IGNORING_REFUSED); return FALSE; } @@ -2763,7 +2783,7 @@ { struct dl_server *server; - server = g_hash_table_lookup(dl_by_guid, guid); + server = htable_lookup(dl_by_guid, guid); if (server == NULL) return; @@ -2784,11 +2804,11 @@ */ void download_add_push_proxy(const struct guid *guid, - host_addr_t addr, guint16 port) + host_addr_t addr, uint16 port) { struct dl_server *server; - server = g_hash_table_lookup(dl_by_guid, guid); + server = htable_lookup(dl_by_guid, guid); if (server == NULL) return; @@ -2808,7 +2828,7 @@ g_assert(proxies); - server = g_hash_table_lookup(dl_by_guid, guid); + server = htable_lookup(dl_by_guid, guid); if (server == NULL) return; @@ -2828,12 +2848,12 @@ */ static void download_push_proxy_wakeup(struct dl_server *server, - gboolean udp, gboolean broadcast) + bool udp, bool broadcast) { list_iter_t *iter; - guint32 n = GNET_PROPERTY(max_host_downloads); + uint32 n = GNET_PROPERTY(max_host_downloads); time_t now; - guint sent = 0; + uint sent = 0; /* * Send a UDP push request to the `n' first download we find waiting @@ -2893,7 +2913,7 @@ if (GNET_PROPERTY(download_debug) > 1) { g_debug("PUSH %s %u message%s on wakeup for GUID %s at %s", broadcast ? "broadcasted" : "sent", - sent, 1 == sent ? "" : "s", + sent, plural(sent), guid_hex_str(server->key->guid), server_host_info(server)); } } @@ -2907,8 +2927,8 @@ download_push_proxy_sleep(struct dl_server *server) { list_iter_t *iter; - GSList *to_sleep = NULL; - GSList *sl; + pslist_t *to_sleep = NULL; + pslist_t *sl; iter = list_iter_before_head(server->listDL_LIST_RUNNING); while (list_iter_has_next(iter)) { @@ -2916,7 +2936,7 @@ download_check(d); if (DOWNLOAD_IS_EXPECTING_GIV(d)) { /* Not moving the download out of the list over which we iterate */ - to_sleep = g_slist_prepend(to_sleep, d); + to_sleep = pslist_prepend(to_sleep, d); } } list_iter_free(&iter); @@ -2926,9 +2946,9 @@ * that will cause them to move to the waiting list. */ - for (sl = to_sleep; sl != NULL; sl = g_slist_next(sl)) { + PSLIST_FOREACH(to_sleep, sl) { struct download *d = sl->data; - guint32 delay = GNET_PROPERTY(download_retry_timeout_delay); + uint32 delay = GNET_PROPERTY(download_retry_timeout_delay); if (d->retries < GNET_PROPERTY(download_max_retries) - 1) { d->retries++; } else if (d->server->attrs & DLS_A_DHT_PUBLISH) { @@ -2941,7 +2961,7 @@ * --RAM, 2010-10-06 */ - delay = guint32_saturate_mult(delay, 2); + delay = uint32_saturate_mult(delay, 2); } else { d->retries++; } @@ -2950,7 +2970,7 @@ _("Requeued due to no push-proxy")); } - g_slist_free(to_sleep); + pslist_free(to_sleep); } /** @@ -2961,7 +2981,7 @@ { struct dl_server *server; - server = g_hash_table_lookup(dl_by_guid, guid); + server = htable_lookup(dl_by_guid, guid); if (server == NULL) return; @@ -2982,7 +3002,7 @@ * @return TRUE if we are looking for proxies, FALSE if there is nothing * to query. */ -static gboolean +static bool server_dht_query(struct download *d) { struct dl_server *server = d->server; @@ -2996,7 +3016,7 @@ if (!dht_bootstrapped()) return TRUE; /* Wait until bootstrapped */ - known = g_hash_table_lookup(dl_by_guid, server->key->guid); + known = htable_lookup(dl_by_guid, server->key->guid); /* XXX BUG: if two entries have the same GUID and we free the first server * XXX which removes the entry from the dl_by_guid, then known can be NULL @@ -3029,7 +3049,7 @@ * * @return TRUE if we changed the value, FALSE otherwise. */ -static gboolean +static bool set_server_hostname(struct dl_server *server, const char *hostname) { g_assert(dl_server_valid(server)); @@ -3054,9 +3074,9 @@ * Check whether we can safely ignore Push indication for this server, * identified by its GUID, IP and port. */ -gboolean +bool download_server_nopush(const struct guid *guid, - const host_addr_t addr, guint16 port) + const host_addr_t addr, uint16 port) { struct dl_server *server = get_server(guid, addr, port, FALSE); @@ -3107,15 +3127,15 @@ sha1 = download_get_sha1(d); if (sha1) { - gpointer value; - guint n; + void *value; + uint n; - value = g_hash_table_lookup(server->sha1_counts, sha1); + value = htable_lookup(server->sha1_counts, sha1); n = GPOINTER_TO_UINT(value); - g_assert(n < (guint) -1); + g_assert(n < (uint) -1); n++; value = GUINT_TO_POINTER(n); - gm_hash_table_insert_const(server->sha1_counts, sha1, value); + htable_insert(server->sha1_counts, sha1, value); } } @@ -3129,10 +3149,10 @@ sha1 = download_get_sha1(d); if (sha1) { - gpointer value; - guint n; + void *value; + uint n; - value = g_hash_table_lookup(server->sha1_counts, sha1); + value = htable_lookup(server->sha1_counts, sha1); n = GPOINTER_TO_UINT(value); /* Counter is sometimes off, make it non-fatal -- RAM, 2006-08-29 */ @@ -3146,9 +3166,9 @@ n--; if (n > 0) { value = GUINT_TO_POINTER(n); - gm_hash_table_insert_const(server->sha1_counts, sha1, value); + htable_insert(server->sha1_counts, sha1, value); } else { - g_hash_table_remove(server->sha1_counts, sha1); + htable_remove(server->sha1_counts, sha1); } } } @@ -3159,8 +3179,8 @@ * If both have a SHA-1, then they must match, otherwise both the file * size and name must be identical. */ -static gboolean -download_eq(gconstpointer p, gconstpointer q) +static bool +download_eq(const void *p, const void *q) { const struct download *a = p, *b = q; const struct sha1 *a_sha1, *b_sha1; @@ -3170,7 +3190,7 @@ a_sha1 = download_get_sha1(a); b_sha1 = download_get_sha1(b); - + if (a_sha1 || b_sha1) { return a_sha1 == b_sha1; /* These are atoms! */ } else if ( @@ -3197,16 +3217,16 @@ struct download *d = NULL; g_assert(dl_server_valid(server)); - g_assert((guint) idx < DL_LIST_SZ); + g_assert((uint) idx < DL_LIST_SZ); if (server->listidx) { static const struct download zero_key; struct download key = zero_key; - gpointer orig_key; + void *orig_key; key.magic = DOWNLOAD_MAGIC; key.sha1 = sha1 ? atom_sha1_get(sha1) : NULL; - key.file_name = deconstify_gpointer(file); + key.file_name = deconstify_pointer(file); key.file_size = size; if (list_contains(server->listidx, &key, download_eq, &orig_key)) { @@ -3222,7 +3242,7 @@ server_list_by_index(struct dl_server *server, enum dl_list idx) { g_assert(dl_server_valid(server)); - g_assert((guint) idx < DL_LIST_SZ); + g_assert((uint) idx < DL_LIST_SZ); if (!server->listidx) { server->listidx = list_new(); @@ -3268,7 +3288,7 @@ { g_assert(dl_server_valid(server)); - return server_list_length(server, idx) > 0 + return server_list_length(server, idx) > 0 ? list_head(server_list_by_index(server, idx)) : NULL; } @@ -3278,7 +3298,7 @@ struct download *d) { g_assert(dl_server_valid(server)); - g_assert((guint) idx < DL_LIST_SZ); + g_assert((uint) idx < DL_LIST_SZ); g_assert(server->listidx); download_check(d); @@ -3302,11 +3322,11 @@ { static const enum dl_list listnum = { DL_LIST_WAITING, DL_LIST_RUNNING }; struct download *d; - guint i; + uint i; g_assert(dl_server_valid(server)); - if (sha1 && NULL == g_hash_table_lookup(server->sha1_counts, sha1)) { + if (sha1 && !htable_contains(server->sha1_counts, sha1)) { return NULL; } @@ -3317,7 +3337,7 @@ * running! */ - for (i = 0; i < G_N_ELEMENTS(listnum); i++) { + for (i = 0; i < N_ITEMS(listnum); i++) { d = server_list_lookup(server, i, sha1, file, size); if (d) { download_check(d); @@ -3338,14 +3358,14 @@ static struct download * has_same_download( const char *file, const struct sha1 *sha1, filesize_t size, - const struct guid *guid, const host_addr_t addr, guint16 port) + const struct guid *guid, const host_addr_t addr, uint16 port) { struct dl_server *server = get_server(guid, addr, port, FALSE); return server ? server_has_same_download(server, file, sha1, size) : NULL; } -static gboolean +static bool download_has_enough_active_sources(struct download *d) { fileinfo_t *fi; @@ -3389,7 +3409,7 @@ * Mark a download as being actively queued. */ void -download_actively_queued(struct download *d, gboolean queued) +download_actively_queued(struct download *d, bool queued) { download_check(d); @@ -3423,7 +3443,7 @@ * Mark download as being passively queued. */ static void -download_passively_queued(struct download *d, gboolean queued) +download_passively_queued(struct download *d, bool queued) { download_check(d); @@ -3454,7 +3474,7 @@ /** * @returns whether the download file exists in the temporary directory. */ -gboolean +bool download_file_exists(const struct download *d) { filestat_t sb; @@ -3466,7 +3486,7 @@ static void download_requeue_all_active(const fileinfo_t *fi) { - GSList *sources, *iter; + pslist_t *sources, *iter; file_info_check(fi); @@ -3475,7 +3495,7 @@ */ sources = file_info_get_sources(fi); - for (iter = sources; iter; iter = g_slist_next(iter)) { + PSLIST_FOREACH(sources, iter) { struct download *d = iter->data; download_check(d); @@ -3507,7 +3527,7 @@ download_queue(d, _("Requeued due to file removal")); } } - gm_slist_free_null(&sources); + pslist_free_null(&sources); } /** @@ -3519,7 +3539,7 @@ * when the file is missing). */ void -download_remove_file(struct download *d, gboolean reset) +download_remove_file(struct download *d, bool reset) { fileinfo_t *fi; @@ -3545,15 +3565,15 @@ void download_info_change_all(fileinfo_t *old_fi, fileinfo_t *new_fi) { - GSList *sources, *iter; + pslist_t *sources, *iter; file_info_check(old_fi); file_info_check(new_fi); sources = file_info_get_sources(old_fi); - for (iter = sources; iter; iter = g_slist_next(iter)) { + PSLIST_FOREACH(sources, iter) { struct download *d = iter->data; - gboolean is_running; + bool is_running; download_check(d); g_assert(d->file_info == old_fi); @@ -3596,7 +3616,7 @@ if (is_running) download_queue(d, _("Requeued by file info change")); } - gm_slist_free_null(&sources); + pslist_free_null(&sources); } /** @@ -3610,15 +3630,15 @@ */ int download_remove_all_from_peer(const struct guid *guid, - const host_addr_t addr, guint16 port, gboolean unavailable) + const host_addr_t addr, uint16 port, bool unavailable) { struct dl_server *server2; int n = 0; enum dl_list listnum = { DL_LIST_RUNNING, DL_LIST_WAITING }; - GSList *to_remove = NULL; - GSList *sl; + pslist_t *to_remove = NULL; + pslist_t *sl; int i; - guint j; + uint j; /* * There can be two distinct server entries for a given IP:port. @@ -3643,10 +3663,10 @@ if (serveri == NULL) continue; - for (j = 0; j < G_N_ELEMENTS(listnum); j++) { + for (j = 0; j < N_ITEMS(listnum); j++) { enum dl_list idx = listnumj; list_iter_t *iter; - + iter = list_iter_before_head(serveri->listidx); while (list_iter_has_next(iter)) { struct download *d; @@ -3656,7 +3676,7 @@ g_assert(d->status != GTA_DL_REMOVED); n++; - to_remove = g_slist_prepend(to_remove, d); + to_remove = pslist_prepend(to_remove, d); } list_iter_free(&iter); } @@ -3669,12 +3689,12 @@ * Do NOT mark the fileinfo as "discard". */ - for (sl = to_remove; sl != NULL; sl = g_slist_next(sl)) { + PSLIST_FOREACH(to_remove, sl) { struct download *d = sl->data; download_forget(d, unavailable); } - g_slist_free(to_remove); + pslist_free(to_remove); return n; } @@ -3868,19 +3888,21 @@ download_check(d); g_assert(!(d->flags & (DL_F_ACTIVE_QUEUED|DL_F_PASSIVE_QUEUED))); - if (s->getline) { - getline_free(s->getline); /* No longer need this */ - s->getline = NULL; - } + entropy_harvest_time(); + + /* The socket can be NULL if we're acting on a queued source */ + + if (s != NULL) + getline_free_null(&s->getline); /* No longer need this */ if (d->flags & (DL_F_BROWSE | DL_F_THEX)) { g_assert(NULL == d->buffers); - if (d->io_opaque) { + if (d->io_opaque != NULL) { io_free(d->io_opaque); g_assert(NULL == d->io_opaque); } } else if (NULL == d->io_opaque) { - g_assert(d->buffers); + g_assert(d->buffers != NULL); g_assert(d->buffers->held == 0); /* All data flushed */ } else { io_free(d->io_opaque); /* Cloned after error, not when receiving */ @@ -3890,12 +3912,12 @@ fi = d->file_info; cd = download_alloc(); - *cd = *d; /* Struct copy */ - cd->file_info = NULL; /* has not been added to fi sources list */ - cd->src_handle_valid = FALSE; - file_info_add_source(fi, cd); /* add cloned source */ + *cd = *d; /* Struct copy */ + file_info_cloned_source(fi, d, cd); /* Replace by cloned source */ + + if (s != NULL) + socket_change_owner(cd->socket, cd); /* Takes ownership of socket */ - cd->socket->resource.download = cd; /* Takes ownership of socket */ cd->list_idx = DL_LIST_INVALID; cd->sha1 = d->sha1 ? atom_sha1_get(d->sha1) : NULL; cd->file_name = atom_str_get(d->file_name); @@ -3905,7 +3927,7 @@ DL_F_FROM_PLAIN | DL_F_FROM_ERROR | DL_F_CLONED | DL_F_NO_PIPELINE); cd->server->refcnt++; - if (cd->file_info->sha1 != NULL) + if (fi->sha1 != NULL) download_by_sha1_add(cd); download_add_to_list(cd, DL_LIST_WAITING); /* Will add SHA1 to server */ @@ -3987,7 +4009,6 @@ time_t after; g_assert(dl_server_valid(server)); - g_assert(server_list_length(server, DL_LIST_WAITING) > 0); /* * Always consider the earliest time in the future for all the downloads @@ -4001,8 +4022,24 @@ */ d = server_list_head(server, DL_LIST_WAITING); - download_check(d); - after = d->retry_after; + + /* + * We used to required that there be something waiting for this server, + * but this is way too strong. If there is something, good, use its + * retry_after as a basis, otherwise use the current time. + * + * This avoids crashes when we get EOF conditions for downloads at the + * same time we've completed the whole file and wait to attempt file + * verification. + * --RAM, 2012-12-25 + */ + + if (d != NULL) { + download_check(d); + after = d->retry_after; + } else { + after = now; /* Nothing waiting on server, weird! */ + } /* * We impose a minimum of DOWNLOAD_SERVER_HOLD seconds between retries. @@ -4037,7 +4074,7 @@ * If `delayed' is true, we're performing a batch free of downloads. */ static void -download_reclaim_server(struct download *d, gboolean delayed) +download_reclaim_server(struct download *d, bool delayed) { struct dl_server *server; @@ -4080,7 +4117,7 @@ * Reclaim server if this was the last download held and `reclaim' is true. */ static void -download_remove_from_server(struct download *d, gboolean reclaim) +download_remove_from_server(struct download *d, bool reclaim) { struct dl_server *server; enum dl_list idx; @@ -4210,7 +4247,7 @@ download_basename(other)); } - download_force_stop(d, GTA_DL_ERROR, _("Duplicate download")); + download_force_stop(d, _("Duplicate download")); goto dup_found; stop_other: @@ -4222,12 +4259,12 @@ new_server->key->addr, new_server->key->port)); } - download_force_stop(other, GTA_DL_ERROR, _("Duplicate download")); + download_force_stop(other, _("Duplicate download")); /* FALL THROUGH */ dup_found: - gnet_stats_count_general(GNR_DUP_DOWNLOADS_IN_CONSOLIDATION, 1); + gnet_stats_inc_general(GNR_DUP_DOWNLOADS_IN_CONSOLIDATION); goto reparent; } @@ -4237,7 +4274,7 @@ */ void download_redirect_to_server(struct download *d, - const host_addr_t addr, guint16 port) + const host_addr_t addr, uint16 port) { struct dl_server *server; struct guid old_guid; @@ -4251,7 +4288,7 @@ */ server = d->server; - if (host_addr_equal(server->key->addr, addr) && server->key->port == port) + if (host_addr_equiv(server->key->addr, addr) && server->key->port == port) return; /* @@ -4290,10 +4327,10 @@ * * @return TRUE if we can consider switching to another resource. */ -static gboolean +static bool download_switchable(struct download *d, const header_t *header) { - guint64 len; + uint64 len; const char *buf; int error; @@ -4311,74 +4348,228 @@ if (error || len != 0) return FALSE; /* XXX would require we set sinking up */ - if (GNET_PROPERTY(download_debug)) + if (GNET_PROPERTY(download_debug)) { g_debug("download \"%s\" on %s could be switchable", download_basename(d), download_host_info(d)); + } if (!download_has_pending_on_server(d, TRUE)) return FALSE; - if (GNET_PROPERTY(download_debug)) + if (GNET_PROPERTY(download_debug)) { g_debug("pending downloads found on %s, \"%s\" is switchable", download_host_info(d), download_basename(d)); + } return TRUE; } /** - * Switch download to another resource on the same server if we can find one. - * - * @param d the download we need to switch from - * @param pd the parent download we just stopped and need to avoid + * Is download special? + */ +static inline bool +download_is_special(const struct download *d) +{ + return 0 != (d->flags & (DL_F_THEX | DL_F_BROWSE)); +} + +/** + * Callback invoked when socket is destroyed. + */ +static void +download_socket_destroy(gnutella_socket_t *s, void *owner, const char *reason) +{ + struct download *d = owner; + + download_check(d); + g_assert(s == d->socket); + + /* + * If we were TLS-upgrading, we got cut in the middle of the operation. + * Flag the server as not supporting TLS upgrades correctly. + */ + + if (d->flags & DL_F_TLS_UPGRADING) { + g_assert(dl_server_valid(d->server)); + d->server->attrs |= DLS_A_NO_TLS_UPGRD; + d->flags &= ~DL_F_TLS_UPGRADING | DL_F_TLS_PROPOSED; + + if (GNET_PROPERTY(download_debug)) { + g_warning("%s(): TLS upgrade failed for \"%s\" on %s", + G_STRFUNC, download_basename(d), download_host_info(d)); + } + } + + download_queue(d, "%s", reason); +} + +/** + * Callback invoked when socket is connected. + */ +static void +download_socket_connected(gnutella_socket_t *s, void *owner) +{ + struct download *d = owner; + + download_check(d); + g_assert(s == d->socket); + + download_connected(d); +} + +/** + * Callback invoked when connection failed. */ static void -download_switch(struct download *d, const struct download *pd) +download_socket_connect_failed(gnutella_socket_t *s, void *owner, + const char *errmsg) +{ + struct download *d = owner; + + download_check(d); + g_assert(s == d->socket); + + (void) errmsg; + + /* + * Socket will be closed by download_fallback_to_push(). + * + * We need to call that routine regardless of whether we are + * firewalled or whether the user denied pushes: that will be + * checked in download_push(), and there is important processing + * that needs to be done by the download layer. + */ + + download_fallback_to_push(d, FALSE, FALSE); +} + +/** + * Socket-layer callbacks for downloads. + */ +static struct socket_ops download_socket_ops = { + download_socket_connect_failed, /* connect_failed */ + download_socket_connected, /* connected */ + download_socket_destroy, /* destroy */ +}; + +/** + * Attach socket to download on remote connections (QUEUE or GIV callbacks). + */ +void +download_attach_socket(struct download *d, gnutella_socket_t *s) +{ + download_check(d); + + if (d->socket != NULL) { /* Paranoid, defensive programming */ + g_carp("%s(): download had non-NULL %s socket already (%s)", + G_STRFUNC, s == d->socket ? "identical" : "distinct", + download_basename(d)); + if (d->socket != s) { + socket_detach_ops(d->socket); + socket_free_null(&d->socket); + } + } + + /* + * At this stage, we already parsed the "GIV" or "QUEUE" indication from + * the socket, so we no longer need its line parser + */ + + getline_free_null(&s->getline); + + d->socket = s; + socket_attach_ops(s, SOCK_TYPE_DOWNLOAD, &download_socket_ops, d); +} + +/** + * Switch socket of old download to new one. + * + * Caller must then either stop or queue the old download, as appropriate. + * + * @param od the old download we're switching from + * @param nd the new download we're switching to + * @param on_error was switching consecutive to an HTTP error? + */ +void +download_switch(struct download *od, struct download *nd, bool on_error) { struct gnutella_socket *s; - struct download *next; + + download_check(od); + download_check(nd); + g_assert(od != nd); + + if (GNET_PROPERTY(download_debug)) { + g_debug("switching from \"%s\" %sto \"%s\" (%.2f%%) at %s", + download_basename(od), on_error ? "(on error) " : "", + download_basename(nd), + 100.0 * download_total_progress(nd), download_host_info(nd)); + } + + gnet_stats_inc_general( + on_error ? GNR_ATTEMPTED_RESOURCE_SWITCHING_AFTER_ERROR : + GNR_ATTEMPTED_RESOURCE_SWITCHING); + + entropy_harvest_small(VARLEN(od), VARLEN(nd), VARLEN(on_error), NULL); + + g_assert(NULL == nd->socket); /* FIXME: there is a fair amount of code similarity with the trailing * part of download_continue(). --RAM, 2009-03-08 */ /* Steal the socket because download_stop() would free it. */ - s = d->socket; - s->resource.download = NULL; - d->socket = NULL; + s = od->socket; + socket_detach_ops(s); + od->socket = NULL; if (s->pos > 0) { - g_warning("download_switch(): Clearing socket buffer of %s", - download_host_info(d)); + g_carp("%s(): clearing socket buffer of %s", + G_STRFUNC, download_host_info(od)); } s->pos = 0; - g_assert(0 == s->pos); + nd->socket = s; + socket_attach_ops(s, SOCK_TYPE_DOWNLOAD, &download_socket_ops, nd); + nd->flags |= DL_F_SWITCHED; + if (on_error) + nd->flags |= DL_F_FROM_ERROR; + if (!download_is_special(od)) + nd->flags |= DL_F_FROM_PLAIN; +} + +/** + * Switch download to another resource on the same server if we can find one + * and issue request immediately to the new download. + * + * @param d the download we need to switch from + */ +static void +download_attempt_switch(struct download *d) +{ + struct download *next; + + if (GNET_PROPERTY(download_debug)) { + g_debug("%s(): trying to reuse connection for \"%s\" on %s", + G_STRFUNC, download_basename(d), download_host_info(d)); + } - next = download_pick_another(d, pd); + next = download_pick_another(d); if (NULL == next) { + if (GNET_PROPERTY(download_debug)) { + g_debug("%s(): closing connection to %s", + G_STRFUNC, download_host_info(d)); + } download_stop(d, GTA_DL_COMPLETED, _("Nothing else to switch to")); - socket_free_null(&s); return; } - g_assert(next != d && next != pd); - - if (GNET_PROPERTY(download_debug)) - g_debug("switching from \"%s\" (on error) to \"%s\" (%.2f%%) at %s", - download_basename(d), download_basename(next), - 100.0 * download_total_progress(next), download_host_info(next)); - - gnet_stats_count_general(GNR_ATTEMPTED_RESOURCE_SWITCHING_AFTER_ERROR, 1); - - g_assert(NULL == next->socket); - - next->socket = s; - next->socket->resource.download = next; - next->flags |= DL_F_SWITCHED | DL_F_FROM_ERROR; + g_assert(next != d); + download_switch(d, next, TRUE); /* Switching after HTTP error */ download_stop(d, GTA_DL_COMPLETED, - _("Switching (after error) to \"%s\""), download_basename(next)); + _("Switching (after error) to \"%s\""), download_basename(d)); if (download_start_prepare(next)) { next->keep_alive = TRUE; /* Was reset by _prepare() */ @@ -4393,9 +4584,10 @@ download_stop_v(struct download *d, download_status_t new_status, const char *reason, va_list ap) { - gboolean store_queue = FALSE; /* Shall we call download_store()? */ + bool store_queue = FALSE; /* Shall we call download_store()? */ enum dl_list list_target; - gboolean verify_sha1 = FALSE; + bool verify_sha1 = FALSE; + bool was_active = FALSE; download_check(d); file_info_check(d->file_info); @@ -4408,6 +4600,8 @@ g_assert(d->file_info->recvcount <= d->file_info->refcount); g_assert(d->file_info->recvcount <= d->file_info->lifecount); + was_active = TRUE; + /* * If there is unflushed downloaded data, try to flush it now, * unless the file is already complete. @@ -4455,55 +4649,45 @@ list_target = DL_LIST_WAITING; break; default: - g_error("unexpected new status %u !", (guint) new_status); + g_error("unexpected new status %u !", (uint) new_status); return; } - switch (new_status) { - case GTA_DL_COMPLETED: - { - /* - * Update average download speed, computing a fast EMA on the - * last 3 terms. Average is initialized with the actual download - * rate the first time we compute it. - */ + if (GTA_DL_COMPLETED == new_status) { + /* + * Update average download speed, computing a fast EMA on the + * last 3 terms. Average is initialized with the actual download + * rate the first time we compute it. + */ - time_delta_t t = delta_time(d->last_update, d->start_date); - struct dl_server *server = d->server; + time_delta_t t = delta_time(d->last_update, d->start_date); + struct dl_server *server = d->server; - g_assert(server != NULL); + g_assert(server != NULL); - if (t > 0) { - filesize_t amount = - d->chunk.end - d->chunk.start + d->chunk.overlap; - guint avg = amount / t; + if (t > 0) { + filesize_t amount = + d->chunk.end - d->chunk.start + d->chunk.overlap; + uint avg = amount / t; - if (server->speed_avg == 0) - server->speed_avg = avg; /* First time */ - else - server->speed_avg += (avg >> 1) - (server->speed_avg >> 1); - } + if (server->speed_avg == 0) + server->speed_avg = avg; /* First time */ + else + server->speed_avg += (avg >> 1) - (server->speed_avg >> 1); } - d->data_timeouts = 0; /* Got a full chunk all right */ - /* FALL THROUGH */ - case GTA_DL_ABORTED: - case GTA_DL_ERROR: - break; - default: - break; - } - - /* - * Do not reset the start_date field when the dowmload is completed. - * The GUI is going to use this field to compute the average download - * speed. And it does not matter now for this request. - */ + d->data_timeouts = 0; /* Got a full chunk all right */ - if (new_status != GTA_DL_COMPLETED) + /* + * Do not reset the start_date field when the dowmload is completed. + * The GUI is going to use this field to compute the average download + * speed. And it does not matter now for this request. + */ + } else { d->start_date = 0; /* Download no longer running */ + } if (reason && no_reason != reason) { - gm_vsnprintf(d->error_str, sizeof(d->error_str), reason, ap); + str_vbprintf(d->error_str, sizeof(d->error_str), reason, ap); d->remove_msg = d->error_str; } else d->remove_msg = NULL; @@ -4562,8 +4746,7 @@ switch (new_status) { case GTA_DL_ERROR: case GTA_DL_ABORTED: - http_range_free(d->ranges); - d->ranges = NULL; + http_rangeset_free_null(&d->ranges); break; default: break; @@ -4590,14 +4773,27 @@ file_info_clear_download(d, FALSE); download_pipeline_free_null(&d->pipeline); file_info_changed(d->file_info); - d->flags &= ~(DL_F_CHUNK_CHOSEN | DL_F_SWITCHED | - DL_F_FROM_PLAIN | DL_F_FROM_ERROR | DL_F_NO_PIPELINE); + d->flags &= ~(DL_F_CHUNK_CHOSEN | DL_F_SWITCHED | DL_F_REPLIED | + DL_F_FROM_PLAIN | DL_F_FROM_ERROR | DL_F_NO_PIPELINE | + DL_F_TLS_PROPOSED | DL_F_TLS_UPGRADING); download_actively_queued(d, FALSE); gnet_prop_set_guint32_val(PROP_DL_RUNNING_COUNT, count_running_downloads()); gnet_prop_set_guint32_val(PROP_DL_ACTIVE_COUNT, dl_active); /* + * If the download was active and we have not completed the chunk, then + * we abruptly stopped and therefore we need to update the list of live + * chunks in the file. + * + * We cleared the DL_F_REPLIED flag above to make sure this source is no + * longer considered to determine the live chunks. + */ + + if (was_active && new_status != GTA_DL_COMPLETED) + fi_src_ranges_changed(d); + + /* * If by stopping this download we completed the file, launch SHA1 * verification. */ @@ -4615,7 +4811,7 @@ * therefore know we're not unqueuing to schedule the download. */ static void -download_unqueue(struct download *d, gboolean removing) +download_unqueue(struct download *d, bool removing) { download_check(d); g_assert(DOWNLOAD_IS_QUEUED(d)); @@ -4658,12 +4854,11 @@ * * @param d the download (with d->keep_alive correctly set) * @param header the reply headers, to get at the Content-Length - * @param new_status the new download status * @param reason the reason for stopping, followed by arguments */ static void download_stop_switch(struct download *d, const header_t *header, - download_status_t new_status, const char * reason, ...) + const char * reason, ...) { struct download *cd = NULL; va_list args; @@ -4677,19 +4872,18 @@ } va_start(args, reason); - download_stop_v(d, new_status, reason, args); + download_stop_v(d, GTA_DL_ERROR, reason, args); va_end(args); - if (cd) - download_switch(cd, d); + if (cd != NULL) + download_attempt_switch(cd); } /** * Forcefully stop a download, whether active or queued. */ static void -download_force_stop(struct download *d, - download_status_t new_status, const char * reason, ...) +download_force_stop(struct download *d, const char * reason, ...) { va_list args; @@ -4707,7 +4901,7 @@ download_move_to_list(d, DL_LIST_RUNNING); va_start(args, reason); - download_stop_v(d, new_status, reason, args); + download_stop_v(d, GTA_DL_ERROR, reason, args); va_end(args); } @@ -4728,40 +4922,32 @@ va_end(args); } +/** + * Update the status string of a queued download. + * + * We add the time at which the queuing occurred, plus PFS indication if + * the source is a partial one. + * + * This string is meant to be displayed in the GUI, hence the care taken + * to make sure the result is in the proper encoding. + */ static void download_queue_update_status(struct download *d) { - char event80, resched80, pfs40, *buf; - size_t size; - time_t rescheduled; - - /* - * Rescheduling time is the largest of `retry_after' (absolute) and - * `timeout_delay' secs after `last_update'. - * See download_pickup_queued() for details on how this is handled. - * --RAM, 2007-05-06 - */ - - rescheduled = d->last_update + d->timeout_delay; - rescheduled = MAX(rescheduled, d->retry_after); + char event80; + size_t rw; - /* Append times of event/reschedule */ + /* Append times of event */ time_locale_to_string_buf(tm_time(), event, sizeof event); - time_locale_to_string_buf(rescheduled, resched, sizeof resched); - - /* Append PFS indication */ - pfs0 = '\0'; - if (d->ranges_size) - gm_snprintf(pfs, sizeof pfs, " <PFS %4.02f%%>", - d->ranges_size * 100.0 / download_filesize(d)); - - buf = &d->error_strstrlen(d->error_str); - size = sizeof d->error_str - strlen(d->error_str); - - gm_snprintf(buf, size, - _(" at %s - rescheduled for %s%s #%u"), - lazy_locale_to_ui_string(event), - lazy_locale_to_ui_string2(resched), pfs, d->retries); + rw = strlen(d->error_str); + rw += str_bprintf(&d->error_strrw, sizeof d->error_str - rw, + _(" at %s"), lazy_locale_to_ui_string(event)); + + /* Append PFS indication if needed */ + if (download_is_partial(d)) { + str_bprintf(&d->error_strrw, sizeof d->error_str - rw, + " <PFS %4.02f%%>", d->ranges_size * 100.0 / download_filesize(d)); + } } /** @@ -4792,7 +4978,7 @@ */ if (fmt) { - gm_vsnprintf(d->error_str, sizeof d->error_str, fmt, ap); + str_vbprintf(d->error_str, sizeof d->error_str, fmt, ap); } else { g_strlcpy(d->error_str, "", sizeof d->error_str); } @@ -4847,7 +5033,7 @@ if (GNET_PROPERTY(download_debug)) { g_debug("re-queued download \"%s\" (%s) at %s: %s", - download_basename(d), download_status_to_code_str(d->status), + download_basename(d), download_status_to_string(d), download_host_info(d), fmt ? d->error_str : "<no reason>"); } } @@ -4874,7 +5060,7 @@ void download_freeze_queue(void) { - g_return_if_fail(GNET_PROPERTY(download_queue_frozen) < (guint32)-1); + g_return_if_fail(GNET_PROPERTY(download_queue_frozen) < (uint32)-1); gnet_prop_incr_guint32(PROP_DOWNLOAD_QUEUE_FROZEN); } @@ -4892,7 +5078,7 @@ /** * Test whether download queue is frozen. */ -gboolean +bool download_queue_is_frozen(void) { return GNET_PROPERTY(download_queue_frozen) > 0; @@ -4927,7 +5113,7 @@ * before the next `delay' seconds. -- RAM, 03/09/2001 */ static void -download_queue_delay(struct download *d, guint32 delay, const char *fmt, ...) +download_queue_delay(struct download *d, uint32 delay, const char *fmt, ...) { va_list args; @@ -4949,7 +5135,7 @@ */ static void download_queue_delay_switch(struct download *d, const header_t *header, - guint32 delay, const char *fmt, ...) + uint32 delay, const char *fmt, ...) { struct download *cd = NULL; va_list args; @@ -4964,7 +5150,7 @@ va_end(args); if (cd) - download_switch(cd, d); + download_attempt_switch(cd); } /** @@ -4973,7 +5159,7 @@ * the holding delay. */ static void -download_queue_hold(struct download *d, guint32 hold, const char *fmt, ...) +download_queue_hold(struct download *d, uint32 hold, const char *fmt, ...) { va_list args; @@ -4985,19 +5171,10 @@ } /** - * Is download special? - */ -static inline gboolean -download_is_special(const struct download *d) -{ - return 0 != (d->flags & (DL_F_THEX | DL_F_BROWSE)); -} - -/** * Iterator callback to send a HEAD ping. */ static void -send_head_ping(gpointer key, gpointer data) +send_head_ping(void *key, void *data) { gnet_host_t *host = key; struct download *d = data; @@ -5109,10 +5286,10 @@ download_info_reget(struct download *d) { fileinfo_t *fi; - gboolean file_size_known; + bool file_size_known; download_check(d); - + fi = d->file_info; g_assert(fi); g_assert(fi->lifecount > 0); @@ -5150,14 +5327,14 @@ * `suspend' is TRUE, or clear that mark if FALSE. */ static void -queue_suspend_downloads_with_file(fileinfo_t *fi, gboolean suspend) +queue_suspend_downloads_with_file(fileinfo_t *fi, bool suspend) { - GSList *sources, *iter; + pslist_t *sources, *iter; file_info_check(fi); sources = file_info_get_sources(fi); - for (iter = sources; iter; iter = g_slist_next(iter)) { + PSLIST_FOREACH(sources, iter) { struct download *d = iter->data; download_check(d); @@ -5190,8 +5367,8 @@ if (DOWNLOAD_IS_ESTABLISHING(d)) { d->flags |= DL_F_MUST_IGNORE; } else if (download_can_ignore(d)) { - gnet_stats_count_general( - GNR_IGNORING_TO_PRESERVE_CONNECTION, 1); + gnet_stats_inc_general( + GNR_IGNORING_TO_PRESERVE_CONNECTION); } else { download_queue(d, _("Suspended (SHA1 checking)")); } @@ -5203,7 +5380,7 @@ d->flags &= ~DL_F_SUSPENDED; } } - gm_slist_free_null(&sources); + pslist_free_null(&sources); if (suspend) fi->flags |= FI_F_SUSPEND; @@ -5223,7 +5400,7 @@ * `sl_removed' list where it will be reclaimed later on via * download_free_removed(). */ -gboolean +bool download_remove(struct download *d) { download_check(d); @@ -5241,9 +5418,9 @@ case GTA_DL_MOVE_WAIT: case GTA_DL_MOVING: if (GNET_PROPERTY(download_debug)) { - g_carp("download_remove(): skipping \"%s\", status=%s", - download_basename(d), - download_status_to_code_str(d->status)); + g_carp("%s(): skipping \"%s\", status=%s", + G_STRFUNC, download_basename(d), + download_status_to_string(d)); } return FALSE; default: @@ -5261,7 +5438,7 @@ if (DOWNLOAD_IS_RUNNING(d)) { download_stop(d, GTA_DL_ABORTED, no_reason); - } + } g_assert(d->io_opaque == NULL); g_assert(d->buffers == NULL); @@ -5281,10 +5458,7 @@ if (d->file_info->sha1 != NULL) download_by_sha1_remove(d); - if (d->ranges) { - http_range_free(d->ranges); - d->ranges = NULL; - } + http_rangeset_free_null(&d->ranges); if (d->req) { http_buffer_free(d->req); @@ -5306,7 +5480,7 @@ file_info_remove_source(d->file_info, d, FALSE); /* Keep fileinfo around */ download_check(d); - sl_removed = g_slist_prepend(sl_removed, d); + sl_removed = pslist_prepend(sl_removed, d); /* download structure will be freed in download_free_removed() */ return TRUE; @@ -5320,12 +5494,12 @@ static void queue_remove_downloads_with_file(fileinfo_t *fi, struct download *skip) { - GSList *sources, *iter; + pslist_t *sources, *iter; file_info_check(fi); sources = file_info_get_sources(fi); - for (iter = sources; iter; iter = g_slist_next(iter)) { + PSLIST_FOREACH(sources, iter) { struct download *d = iter->data; download_check(d); @@ -5351,7 +5525,7 @@ download_remove(d); } - gm_slist_free_null(&sources); + pslist_free_null(&sources); } @@ -5360,10 +5534,10 @@ * * @returns whether download was stopped (i.e. if it must be ignored). */ -static gboolean +static bool download_ignore_requested(struct download *d) { - enum ignore_val reason = IGNORE_FALSE; + ignore_val_t reason = IGNORE_FALSE; fileinfo_t *fi; download_check(d); @@ -5377,7 +5551,7 @@ if (!(SOCK_F_FORCE & d->cflags)) { if (is_my_address_and_port(download_addr(d), download_port(d))) { reason = IGNORE_OURSELVES; - } else if (hostiles_check(download_addr(d))) { + } else if (hostiles_is_bad(download_addr(d))) { reason = IGNORE_HOSTILE; } else if (ctl_limit(download_addr(d), CTL_D_OUTGOING)) { reason = IGNORE_LIMIT; @@ -5389,10 +5563,10 @@ if (reason != IGNORE_FALSE) { const char *s_reason; - + s_reason = ignore_reason_to_string(reason); g_assert(s_reason); - + download_stop(d, GTA_DL_ERROR, _("Ignoring requested (%s)"), s_reason); /* @@ -5421,7 +5595,7 @@ case IGNORE_FALSE: g_assert_not_reached(); } - + return TRUE; } @@ -5435,7 +5609,7 @@ * @returns TRUE if we may continue with the download, FALSE if it has been * stopped due to a problem. */ -gboolean +bool download_start_prepare_running(struct download *d) { fileinfo_t *fi; @@ -5549,7 +5723,7 @@ * @returns TRUE if we may continue with the download, FALSE if it has been * stopped due to a problem. */ -gboolean +bool download_start_prepare(struct download *d) { download_check(d); @@ -5573,7 +5747,7 @@ * we start issuing requests for a queued download, or after we cloned * a completed download. * - * Since download_start_prepare_running() is called from download_request(), + * Since download_start_prepare_running() is called from download_reply(), * we must reset DL_F_SUNK_DATA here, since we want to sink only ONCE * per session. */ @@ -5597,7 +5771,7 @@ * * @returns TRUE (meaning we can continue with the download) */ -static gboolean +static bool download_pick_random_byte(struct download *d, struct dl_chunk *chunk) { chunk->start = get_random_file_offset(download_filesize(d)); @@ -5619,9 +5793,9 @@ * @returns TRUE if we can continue with the download, FALSE if no chunk * was selected and download was stopped (if allowed). */ -static gboolean +static bool download_pick_chunk(struct download *d, - struct dl_chunk *chunk, gboolean may_stop) + struct dl_chunk *chunk, bool may_stop) { enum dl_chunk_status status; filesize_t from, to; @@ -5688,7 +5862,7 @@ * @returns TRUE if we selected a chunk, FALSE if we can't select a chunk * (e.g. we have everything the remote server makes available). */ -static gboolean +static bool download_pick_available(struct download *d, struct dl_chunk *chunk) { filesize_t from, to; @@ -5711,7 +5885,7 @@ g_debug("PFSP no interesting chunks from %s for \"%s\", " "available was: %s", host_addr_port_to_string(download_addr(d), download_port(d)), - download_basename(d), http_range_to_string(d->ranges)); + download_basename(d), http_rangeset_to_string(d->ranges)); return FALSE; } @@ -5738,7 +5912,7 @@ file_info_chunk_status(d->file_info, from - GNET_PROPERTY(download_overlap_range), from) == DL_CHUNK_DONE && - http_range_contains(d->ranges, + http_rangeset_contains(d->ranges, from - GNET_PROPERTY(download_overlap_range), from - 1) ) @@ -5749,7 +5923,7 @@ "from %s for \"%s\", available was: %s", uint64_to_string(from), uint64_to_string2(to - 1), chunk->overlap, host_addr_port_to_string(download_addr(d), download_port(d)), - download_basename(d), http_range_to_string(d->ranges)); + download_basename(d), http_rangeset_to_string(d->ranges)); return TRUE; } @@ -5778,8 +5952,9 @@ download_connect(struct download *d) { struct dl_server *server; - guint16 port; - guint32 tls = GNET_PROPERTY(tls_enforce) ? SOCK_F_TLS : 0; + uint16 port; + uint32 tls = GNET_PROPERTY(tls_enforce) ? SOCK_F_TLS : 0; + gnutella_socket_t *s; download_check(d); @@ -5828,20 +6003,25 @@ d->flags |= DL_F_DNS_LOOKUP; server->attrs &= ~DLS_A_DNS_LOOKUP; server->dns_lookup = tm_time(); - return socket_connect_by_name( + s = socket_connect_by_name( server->hostname, port, SOCK_TYPE_DOWNLOAD, d->cflags | tls); } else { server->last_connect = tm_time(); - return socket_connect(download_addr(d), port, SOCK_TYPE_DOWNLOAD, + s = socket_connect(download_addr(d), port, SOCK_TYPE_DOWNLOAD, d->cflags | tls); } + + if (s != NULL) + socket_attach_ops(s, SOCK_TYPE_DOWNLOAD, &download_socket_ops, d); + + return s; } /** * (Re)start a stopped or queued download. */ static void -download_start(struct download *d, gboolean check_allowed) +download_start(struct download *d, bool check_allowed) { download_check(d); file_info_check(d->file_info); @@ -5849,7 +6029,7 @@ g_return_if_fail(!DOWNLOAD_IS_MOVING(d)); g_return_if_fail(!DOWNLOAD_IS_RUNNING(d)); g_return_if_fail(!DOWNLOAD_IS_VERIFYING(d)); - + g_return_if_fail( GTA_DL_INVALID == d->status || DOWNLOAD_IS_QUEUED(d) || @@ -5868,6 +6048,13 @@ return; } + if (GNET_PROPERTY(net_buffer_shortage)) { + if (!DOWNLOAD_IS_QUEUED(d)) { + download_queue(d, _("Network buffer shortage")); + } + return; + } + /* * If caller did not check whether we were allowed to start downloading * this file, do it now. --RAM, 03/09/2001 @@ -5954,7 +6141,6 @@ return; } - d->socket->resource.download = d; d->socket->pos = 0; } else { /* We have to send a push request */ download_set_status(d, GTA_DL_PUSH_SENT); @@ -5982,6 +6168,37 @@ } /** + * Restart a download after a failed SHA1 + TTH verification. + */ +static void +download_restart(struct download *d) +{ + g_assert(DL_LIST_STOPPED == d->list_idx); + + /* Reset status to "timeout wait" so that we can stop/start it again */ + + download_set_status(d, GTA_DL_TIMEOUT_WAIT); + download_move_to_list(d, DL_LIST_WAITING); + + /* + * If we already downloaded more than the file size from that source, + * stop using it. This is only a crude check to avoid endless loops. + * --RAM, 2012-05-17 + */ + + if (d->downloaded > d->file_size) { + g_message("SHA1 mismatch for \"%s\", discarding source at %s", + download_basename(d), download_host_info(d)); + download_stop(d, GTA_DL_ERROR, _("SHA1 mismatch detected")); + } else { + g_message("SHA1 mismatch for \"%s\", " + "will be restarting download at %s", + download_basename(d), download_host_info(d)); + download_start(d, TRUE); + } +} + +/** * Pause a download. */ static void @@ -6023,11 +6240,11 @@ * Return FALSE if we must continue, TRUE if we can break out of the loop * because we found the proper target download. */ -static gboolean +static bool download_pick_process( struct download **dp, struct download *cur, - gboolean was_plain_incomplete, const struct sha1 *sha1, - gboolean retry_after) + bool was_plain_incomplete, const struct sha1 *sha1, + bool retry_after) { struct download *d; @@ -6124,8 +6341,8 @@ download_pick_followup(struct download *d, const struct sha1 *sha1) { list_iter_t *iter; - gboolean was_plain_incomplete; - gboolean found = FALSE; + bool was_plain_incomplete; + bool found = FALSE; download_check(d); g_assert(d->list_idx == DL_LIST_WAITING); @@ -6175,11 +6392,11 @@ */ if (id != NULL) { - struct download *dt = g_hash_table_lookup(dl_by_id, id); + struct download *dt = hikset_lookup(dl_by_id, id); download_check(dt); g_assert(dt->flags & DL_F_THEX); - + if (DOWNLOAD_IS_SWITCHABLE(dt)) { if (GNET_PROPERTY(download_debug)) { g_debug("TTH requesting switching from " @@ -6244,36 +6461,32 @@ } /** - * Pick-up another source from this server, for the next HTTP request. - * We must avoid the current download and its parent download, which has - * just been stopped / requeued. - * - * We pay attention to the d->retry_after field because we're switching after - * an error condition and we don't want to go back and forth between two - * downloads on the same host without respecting the delays we have configured. + * Pick-up another waiting source from this server, for the next HTTP request + * we're going to send. * * @param d the current download - * @param pd the parent download * * @return the download we found, or NULL if none could be chosen. */ -static struct download * -download_pick_another(const struct download *d, const struct download *pd) +struct download * +download_pick_another_waiting(const struct download *d) { list_iter_t *iter; struct download *other = NULL; download_check(d); - g_assert(d->list_idx == DL_LIST_WAITING); - iter = list_iter_before_head(d->server->listDL_LIST_RUNNING); + iter = list_iter_before_head(d->server->listDL_LIST_WAITING); while (list_iter_has_next(iter)) { struct download *cur; cur = list_iter_next(iter); download_check(cur); - g_assert(cur != d && cur != pd); + /* Make sure we're not targetting the same file */ + + if (cur->file_info == d->file_info) + continue; /* Pay attention to retry_after */ @@ -6282,17 +6495,43 @@ } list_iter_free(&iter); - if (other) - goto done; + return other; +} - iter = list_iter_before_head(d->server->listDL_LIST_WAITING); +/** + * Pick-up another source from this server, for the next HTTP request. + * We must avoid the current download and its parent download, which has + * just been stopped / requeued. + * + * We pay attention to the d->retry_after field because we're switching after + * an error condition and we don't want to go back and forth between two + * downloads on the same host without respecting the delays we have configured. + * + * @param d the current download + * + * @return the download we found, or NULL if none could be chosen. + */ +static struct download * +download_pick_another(const struct download *d) +{ + list_iter_t *iter; + struct download *other = NULL; + + download_check(d); + g_assert(d->list_idx == DL_LIST_WAITING); + + iter = list_iter_before_head(d->server->listDL_LIST_RUNNING); while (list_iter_has_next(iter)) { struct download *cur; cur = list_iter_next(iter); download_check(cur); - if (cur == d || cur == pd) + g_assert(cur != d); + + /* Make sure we're not targetting the same file */ + + if (cur->file_info == d->file_info) continue; /* Pay attention to retry_after */ @@ -6303,9 +6542,11 @@ list_iter_free(&iter); if (NULL == other) + other = download_pick_another_waiting(d); + + if (NULL == other) return NULL; -done: /* * If we have elected a "running" download (awaiting push results or * connecting), then we need to move it back temporarily to the @@ -6314,8 +6555,14 @@ * the socket structure. */ - if (other->list_idx == DL_LIST_RUNNING) + if (other->list_idx == DL_LIST_RUNNING) { + if (GNET_PROPERTY(download_debug)) { + g_debug("%s(): stopping %s \"%s\" on %s", + G_STRFUNC, download_status_to_string(d), + download_basename(other), download_host_info(other)); + } download_stop(other, GTA_DL_TIMEOUT_WAIT, no_reason); + } g_assert(other->list_idx == DL_LIST_WAITING); @@ -6329,7 +6576,7 @@ download_pickup_queued(void) { time_t now = tm_time(); - guint i; + uint i; /* * To select downloads, we iterate over the sorted `dl_by_time' list and @@ -6341,7 +6588,7 @@ */ for (i = 0; i < DHASH_SIZE; i++) { - GList *l; + plist_t *l; int last_change; if (download_queue_is_frozen()) @@ -6352,17 +6599,17 @@ if (!bws_can_connect(SOCK_TYPE_DOWNLOAD)) break; - + retry: l = dl_by_time.serversi; last_change = dl_by_time.changei; - for (/* NOTHING */; NULL != l; l = g_list_next(l)) { + for (/* NOTHING */; NULL != l; l = plist_next(l)) { struct dl_server *server = l->data; list_iter_t *iter; struct download *d; - guint n; - gboolean only_special = FALSE; + uint n; + bool only_special = FALSE; g_assert(dl_server_valid(server)); @@ -6404,7 +6651,7 @@ * period of time as this can be frowned upon. */ - if (delta_time(now, server->last_connect) < DOWNLOAD_CONNECT_DELAY) + if (delta_time(now, server->last_connect) < DOWNLOAD_CONNECT_DELAY) continue; /* @@ -6512,29 +6759,65 @@ */ void download_got_push_proxies(const struct guid *guid, - const gnet_host_vec_t *proxies) + const gnet_host_vec_t *proxies, bool g2) { struct dl_server *server; int i; size_t added = 0; + bool g2_server; - server = g_hash_table_lookup(dl_by_guid, guid); + server = htable_lookup(dl_by_guid, guid); if (server == NULL) return; g_assert(dl_server_valid(server)); + /* + * We can only keep push-proxies that are compatible with the protocol + * supported by the server: + * + * - If we're handling proxies coming from a G2 query, and the server is + * not flagged as being a G2 server, flag it as G2 and discard any + * known push-proxies (which were necessarily Gnutella ultrapeers). + * + * - If we're handling proxies coming from a Gnutella query and the server + * is already flagged as a G2 server, don't update anything. + */ + + g2_server = booleanize(server->attrs & DLS_A_G2_ONLY); + + if (g2) { + if (!g2_server) { + if (GNET_PROPERTY(download_debug)) { + g_debug("%s(): flagging %s as a G2 host%s", + G_STRFUNC, server_host_info(server), + server->proxies != NULL ? + " and discarding known push-proxies" : ""); + } + server->attrs |= DLS_A_G2_ONLY; + } + } else { + if (g2_server) + return; /* Ignore Gnutella push-proxies for known G2 host */ + } + + /* + * Always supersede the previously known push-proxies with the newest ones. + */ + + pproxy_set_free_null(&server->proxies); + for (i = gnet_host_vec_count(proxies) - 1; i >= 0; i--) { struct gnutella_host host; host_addr_t addr; - guint16 port; + uint16 port; host = gnet_host_vec_get(proxies, i); addr = gnet_host_get_addr(&host); port = gnet_host_get_port(&host); if ( - host_addr_equal(addr, server->key->addr) && + host_addr_equiv(addr, server->key->addr) && port == server->key->port ) continue; /* We always try the server's own IP:port */ @@ -6547,10 +6830,10 @@ if (GNET_PROPERTY(download_debug)) { g_debug("PUSH found %zu new push prox%s in query hit " "for GUID %s at %s", - added, 1 == added ? "y" : "ies", + added, plural_y(added), guid_hex_str(guid), server_host_info(server)); } - gnet_stats_count_general(GNR_COLLECTED_PUSH_PROXIES, +1); + gnet_stats_inc_general(GNR_COLLECTED_PUSH_PROXIES); download_push_proxy_wakeup(server, TRUE, FALSE); } } @@ -6563,7 +6846,7 @@ { struct dl_server *server; - server = g_hash_table_lookup(dl_by_guid, guid); + server = htable_lookup(dl_by_guid, guid); if (server == NULL) return; @@ -6573,7 +6856,7 @@ * push-proxies known. */ - gnet_stats_count_general(GNR_REVITALIZED_PUSH_ROUTES, +1); + gnet_stats_inc_general(GNR_REVITALIZED_PUSH_ROUTES); download_push_proxy_wakeup(server, FALSE, TRUE); if (server->proxies != NULL && pproxy_set_count(server->proxies) > 0) { route_starving_remove(guid); @@ -6589,16 +6872,16 @@ * Attempt to get this download connected to the server through a PUSH request. */ static void -download_push(struct download *d, gboolean on_timeout) +download_push(struct download *d, bool on_timeout) { - gboolean ignore_push = FALSE; - gboolean udp_push; + bool ignore_push = FALSE; + bool udp_push; download_check(d); if (GNET_PROPERTY(download_debug) > 2) - g_debug("download_push timeout=%s for \"%s\" at %s", - on_timeout ? "y" : "n", + g_debug("%s(): timeout=%s for \"%s\" at %s", + G_STRFUNC, on_timeout ? "y" : "n", download_basename(d), download_host_info(d)); if ( @@ -6609,7 +6892,7 @@ ignore_push = TRUE; if ( - ignore_push || + ignore_push || GNET_PROPERTY(is_firewalled) || !GNET_PROPERTY(send_pushes) ) @@ -6796,15 +7079,14 @@ */ void download_fallback_to_push(struct download *d, - gboolean on_timeout, gboolean user_request) + bool on_timeout, bool user_request) { g_return_if_fail(d); download_check(d); if (GNET_PROPERTY(download_debug) > 2) - g_debug("download_fallback_to_push " - "timeout=%s, user=%s for \"%s\" at %s", - on_timeout ? "y" : "n", user_request ? "y" : "n", + g_debug("%s(): timeout=%s, user=%s for \"%s\" at %s", + G_STRFUNC, on_timeout ? "y" : "n", user_request ? "y" : "n", download_basename(d), download_host_info(d)); /* @@ -6836,8 +7118,7 @@ return; if (!d->socket) { - g_warning("download_fallback_to_push(): no socket for '%s'", - download_basename(d)); + g_warning("%s(): no socket for '%s'", G_STRFUNC, download_basename(d)); } else { /* * If a DNS lookup error occurred, discard the hostname we have. @@ -6885,10 +7166,10 @@ fi_src_status_changed(d); } -static guint32 +static uint32 get_index_from_uri(const char *uri) { - guint32 idx = 0; + uint32 idx = 0; if (uri) { const char *endptr; @@ -6932,7 +7213,7 @@ const char *uri, filesize_t size, const host_addr_t addr, - guint16 port, + uint16 port, const struct guid *guid, const char *hostname, const struct sha1 *sha1, @@ -6940,7 +7221,7 @@ time_t stamp, fileinfo_t *file_info, const gnet_host_vec_t *proxies, - guint32 cflags, + uint32 cflags, const char *parq_id) { struct dl_server *server; @@ -6949,14 +7230,40 @@ fileinfo_t *fi; const char *msg = NULL; const char *file_name = NULL; - gboolean use_mesh = FALSE; + bool use_mesh = FALSE; g_assert(host_addr_initialized(addr)); - if (file_info) { + /* + * Harvest entropy each time we attempt to create a new download. + */ + + entropy_harvest_many(file, strsize(file), VARLEN(size), VARLEN(addr), + VARLEN(port), VARLEN(file_info), VARLEN(stamp), VARLEN(guid), + VARLEN(sha1), VARLEN(tth), VARLEN(proxies), VARLEN(parq_id), NULL); + + /* + * If a file_info is supplied, its SHA1 must match the one we supply and + * the TTH must also match when it is known. + */ + + if (file_info != NULL) { g_return_val_if_fail(!sha1 || sha1_eq(file_info->sha1, sha1), NULL); - if (file_info->tth) { - g_return_val_if_fail(!tth || tth_eq(file_info->tth, tth), NULL); + if (file_info->tth != NULL) { + if (tth != NULL && !tth_eq(file_info->tth, tth)) { + char bufTTH_BASE32_SIZE + 1; + + tth_to_base32_buf(tth, buf, sizeof buf); + g_warning("ignoring new source for %s at %s: its TTH %s " + "differs from known %s (SHA1 is %s)", + filepath_basename(file_info->pathname), + host_addr_port_to_string(addr, port), buf, + tth_base32(file_info->tth), + NULL == file_info->sha1 ? "unknown" : + sha1_base32(file_info->sha1)); + + return NULL; + } } } @@ -6988,7 +7295,7 @@ { char *s; char *b; - + b = s = filename_sanitize(file, FALSE, FALSE); if (GNET_PROPERTY(beautify_filenames)) @@ -7010,6 +7317,16 @@ } server = get_server(guid, addr, port, TRUE); + /* + * Set the G2 flag if needed, which will be sticky for the server. + */ + + if (SOCK_F_G2 & cflags) { + cflags &= ~SOCK_F_G2; /* Don't propagate this further down */ + server->attrs &= ~DLS_A_FAKE_G2; + server->attrs |= DLS_A_G2_ONLY; + } + g_assert(dl_server_valid(server)); /* @@ -7093,8 +7410,8 @@ d->last_update = tm_time(); d->server = server; d->server->refcnt++; - d->id = dl_random_guid_atom(); - gm_hash_table_insert_const(dl_by_id, d->id, d); + d->id = guid_unique_atom(dl_by_id, FALSE); + hikset_insert_key(dl_by_id, &d->id); /* * If we know that this server can be directly connected to, ignore @@ -7186,13 +7503,12 @@ */ if (d->sha1 != NULL && fi->sha1 == NULL) { - gboolean success = file_info_got_sha1(fi, d->sha1); + bool success = file_info_got_sha1(fi, d->sha1); if (success) { g_message("forced SHA1 %s after %s byte%s " "downloaded for %s", sha1_base32(d->sha1), uint64_to_string(fi->done), - fi->done == 1 ? "" : "s", - download_basename(d)); + plural(fi->done), download_basename(d)); download_by_sha1_add(d); if (DOWNLOAD_IS_QUEUED(d)) { /* file_info_got_sha1() can queue */ return d; @@ -7226,7 +7542,7 @@ if (GTA_DL_INVALID == d->status) { /* Ensure it has a time for status display */ - d->retry_after = time_advance(tm_time(), (random_u32() % 4) + 1); + d->retry_after = time_advance(tm_time(), random_value(3) + 1); download_queue(d, "%s", reason); } @@ -7253,8 +7569,8 @@ fail: if (GNET_PROPERTY(download_debug)) { - g_debug("create_download(\"%s\", SHA1=%s): %s", - file, sha1 ? sha1_base32(sha1) : "none", msg); + g_debug("%s(\"%s\", SHA1=%s): %s", + G_STRFUNC, file, sha1 ? sha1_base32(sha1) : "none", msg); } atom_str_free_null(&file_name); return NULL; @@ -7267,7 +7583,7 @@ download_auto_new_common(const char *file_name, filesize_t size, const host_addr_t addr, - guint16 port, + uint16 port, const struct guid *guid, const char *hostname, const struct sha1 *sha1, @@ -7275,10 +7591,10 @@ time_t stamp, fileinfo_t *fi, gnet_host_vec_t *proxies, - guint32 flags) + uint32 flags) { const char *reason; - enum ignore_val ign_reason; + ignore_val_t ign_reason; /* * Make sure host is reacheable, especially if we come from the GUI, @@ -7305,7 +7621,7 @@ reason = ignore_reason_to_string(ign_reason); if (!reason) { g_error("ignore_is_requested() returned unexpected %u", - (guint) ign_reason); + (uint) ign_reason); } goto abort_download; } @@ -7344,7 +7660,7 @@ download_auto_new(const char *file_name, filesize_t size, const host_addr_t addr, - guint16 port, + uint16 port, const struct guid *guid, const char *hostname, const struct sha1 *sha1, @@ -7352,9 +7668,9 @@ time_t stamp, fileinfo_t *fi, gnet_host_vec_t *proxies, - guint32 flags) + uint32 flags) { - gboolean was_orphan = fi && 0 == fi->refcount; + bool was_orphan = fi && 0 == fi->refcount; /* * Even though this routine can be called for sources collected out of @@ -7371,7 +7687,7 @@ */ if (was_orphan && 0 != fi->refcount) { - gboolean from_qhit; + bool from_qhit; /* * If the GUID is blank then we're most certainly not processing @@ -7381,8 +7697,8 @@ */ from_qhit = !guid_is_blank(guid); - gnet_stats_count_general(from_qhit ? - GNR_QHIT_SEEDING_OF_ORPHAN : GNR_UPLOAD_SEEDING_OF_ORPHAN, +1); + gnet_stats_inc_general(from_qhit ? + GNR_QHIT_SEEDING_OF_ORPHAN : GNR_UPLOAD_SEEDING_OF_ORPHAN); if (GNET_PROPERTY(download_debug)) g_debug("%s seeding of orphan \"%s\" with %s:%u", @@ -7400,15 +7716,15 @@ filesize_t size, const char *hostname, const host_addr_t addr, - guint16 port, + uint16 port, const struct guid *guid, const struct sha1 *sha1, const struct tth *tth, time_t stamp, fileinfo_t *fi, - guint32 flags) + uint32 flags) { - gboolean was_orphan = fi && 0 == fi->refcount; + bool was_orphan = fi && 0 == fi->refcount; download_auto_new_common( file_name, size, addr, port, guid, hostname, @@ -7421,7 +7737,7 @@ */ if (was_orphan && 0 != fi->refcount) { - gnet_stats_count_general(GNR_DHT_SEEDING_OF_ORPHAN, 1); + gnet_stats_inc_general(GNR_DHT_SEEDING_OF_ORPHAN); if (GNET_PROPERTY(dht_debug) || GNET_PROPERTY(download_debug)) g_debug("DHT seeding of orphan \"%s\" with %s:%u", file_name, hostname ? hostname : host_addr_to_string(addr), port); @@ -7432,14 +7748,14 @@ * Search has detected index change in queued download. */ void -download_index_changed(const host_addr_t addr, guint16 port, - const struct guid *guid, guint32 from, guint32 to) +download_index_changed(const host_addr_t addr, uint16 port, + const struct guid *guid, uint32 from, uint32 to) { struct dl_server *server = get_server(guid, addr, port, FALSE); - guint nfound = 0; - GSList *to_stop = NULL; - GSList *sl; - guint n; + uint nfound = 0; + pslist_t *to_stop = NULL; + pslist_t *sl; + uint n; enum dl_list listnum = { DL_LIST_RUNNING, DL_LIST_WAITING }; if (!server) @@ -7447,7 +7763,7 @@ g_assert(dl_server_valid(server)); - for (n = 0; n < G_N_ELEMENTS(listnum); n++) { + for (n = 0; n < N_ITEMS(listnum); n++) { list_iter_t *iter; iter = list_iter_before_head(server->listn); @@ -7478,7 +7794,7 @@ */ g_message("stopping request for \"%s\": index changed", download_basename(d)); - to_stop = g_slist_prepend(to_stop, d); + to_stop = pslist_prepend(to_stop, d); break; case GTA_DL_RECEIVING: /* @@ -7503,13 +7819,13 @@ list_iter_free(&iter); } - for (sl = to_stop; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(to_stop, sl) { struct download *d = sl->data; download_check(d); download_queue_delay(d, GNET_PROPERTY(download_retry_stopped_delay), _("Stopped (Index changed)")); } - gm_slist_free_null(&to_stop); + pslist_free_null(&to_stop); /* * This is a sanity check: we should not have any duplicate request @@ -7518,7 +7834,7 @@ if (nfound > 1) { g_info("found %u requests for index %u (now %u) at %s", - nfound, (guint) from, (guint) to, + nfound, (uint) from, (uint) to, host_addr_port_to_string(addr, port)); } } @@ -7539,8 +7855,8 @@ fileinfo_t *fi; filesize_t size; time_t stamp; - guint32 flags; - guint16 port; + uint32 flags; + uint16 port; }; /* @@ -7554,14 +7870,14 @@ const char *uri, filesize_t size, host_addr_t addr, - guint16 port, + uint16 port, const struct guid *guid, const char *hostname, const struct sha1 *sha1, const struct tth *tth, time_t stamp, fileinfo_t *fi, - guint32 flags, + uint32 flags, const gnet_host_vec_t *proxies, const char *parq_id) { @@ -7598,7 +7914,7 @@ download_request_free(struct download_request **req_ptr) { struct download_request *req; - + g_assert(req_ptr); req = *req_ptr; @@ -7625,7 +7941,7 @@ */ static void download_new_by_hostname_helper(const host_addr_t *addrs, size_t n, - gpointer user_data) + void *user_data) { struct download_request *req = user_data; @@ -7633,7 +7949,7 @@ g_assert(req); if (n > 0) { - size_t i = random_u32() % n; + size_t i = random_value(n - 1); /** * @todo TODO: All resolved addresses should be attempted. @@ -7675,12 +7991,12 @@ * * @return whether download was created. */ -gboolean +bool download_new(const char *filename, const char *uri, filesize_t size, const host_addr_t addr, - guint16 port, + uint16 port, const struct guid *guid, const char *hostname, const struct sha1 *sha1, @@ -7688,7 +8004,7 @@ time_t stamp, fileinfo_t *fi, const gnet_host_vec_t *proxies, - guint32 flags, + uint32 flags, const char *parq_id) { if (hostname) { @@ -7727,7 +8043,7 @@ { time_t ntime; struct download *d; - + file_info_check(fi); ntime = fi->ntime; @@ -7760,12 +8076,12 @@ void download_free_removed(void) { - GSList *sl; + pslist_t *sl; if (sl_removed == NULL) return; - for (sl = sl_removed; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(sl_removed, sl) { struct download *d = sl->data; download_check(d); @@ -7779,14 +8095,14 @@ download_free(&d); } - gm_slist_free_null(&sl_removed); + pslist_free_null(&sl_removed); - for (sl = sl_removed_servers; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(sl_removed_servers, sl) { struct dl_server *s = sl->data; free_server(s); } - gm_slist_free_null(&sl_removed_servers); + pslist_free_null(&sl_removed_servers); } /* ----------------------------------------- */ @@ -7802,13 +8118,13 @@ * It is up to the caller to release the memory allocated for the proxies * sequence through a call to sequence_release(). */ -gboolean +bool download_known_guid(const struct guid *guid, - host_addr_t *addr, guint16 *port, sequence_t **proxies) + host_addr_t *addr, uint16 *port, sequence_t **proxies) { struct dl_server *server; - server = g_hash_table_lookup(dl_by_guid, guid); + server = htable_lookup(dl_by_guid, guid); if (server == NULL) return FALSE; @@ -7829,7 +8145,7 @@ * When `unavailable' is TRUE, mark the download as unavailable. */ void -download_forget(struct download *d, gboolean unavailable) +download_forget(struct download *d, bool unavailable) { download_check(d); @@ -7900,7 +8216,7 @@ if ( server_has_same_download(d->server, d->file_name, d->sha1, d->file_size) ) { - download_force_stop(d, GTA_DL_ERROR, _("Duplicate download")); + download_force_stop(d, _("Duplicate download")); return; } @@ -7958,7 +8274,7 @@ /** * Do we have push-proxies to use for a download? */ -static gboolean +static bool has_push_proxies(const struct download *d) { struct dl_server *server = d->server; @@ -7975,7 +8291,7 @@ * * @returns TRUE is we can use a push proxy. */ -static gboolean +static bool use_push_proxy(struct download *d) { struct dl_server *server = d->server; @@ -8019,7 +8335,7 @@ * * @return TRUE if we selected a new push-proxy. */ -static gboolean +static bool next_push_proxy(struct download *d) { download_check(d); @@ -8088,21 +8404,20 @@ */ /** - * Send an UDP push packet to specified host. + * Send a UDP push packet to specified host. * * @return TRUE on success. */ -gboolean +bool download_send_udp_push( - const struct array packet, host_addr_t addr, guint16 port) + const struct array packet, host_addr_t addr, uint16 port) { - gboolean success = FALSE; - + bool success = FALSE; + if (host_is_valid(addr, port)) { - struct gnutella_node *n; - - n = node_udp_get_addr_port(addr, port); - if (n) { + gnutella_node_t *n = node_udp_get_addr_port(addr, port); + + if (n != NULL) { success = TRUE; udp_send_msg(n, packet.data, packet.size); } @@ -8111,8 +8426,91 @@ } /** - * Send a push request to the target GUID, in order to request the push of - * the file whose index is `file_id' there onto our local port `port'. + * Send a UDP push packet to specified G2 host. + * + * @return TRUE on success. + */ +static bool +download_g2_send_udp_push(const pmsg_t *mb, host_addr_t addr, uint16 port) +{ + bool success = FALSE; + + if (host_is_valid(addr, port)) { + gnutella_node_t *n = node_udp_g2_get_addr_port(addr, port); + + if (n != NULL) { + success = TRUE; + g2_node_send(n, pmsg_clone(mb)); + } + } + return success; +} + +/** + * Send a push request to the target GUID, in order to request a remote + * connection from the host. + * + * We're very aggressive: we can send a PUSH via UDP to the host itself, + * as well as the 4 most recent push proxies when `udp' is set. + * We can also broadcast to the G2 nodes if `broadcast' is set. + * + * @returns TRUE if the request could be sent, FALSE if we don't have the route. + */ +static bool +download_g2_send_push(struct download *d, const pmsg_t *mb, + bool udp, bool broadcast) +{ + bool success = FALSE; + + download_check(d); + + /* Pure luck: try to reach the remote host directly via UDP... */ + if (udp) { + download_g2_send_udp_push(mb, download_addr(d), download_port(d)); + } + + if (udp && has_push_proxies(d)) { + sequence_t *seq = pproxy_set_sequence(d->server->proxies); + sequence_iter_t *iter = sequence_forward_iterator(seq); + int i = 0; + + while (i < DOWNLOAD_MAX_UDP_PUSH && sequence_iter_has_next(iter)) { + gnet_host_t *host = sequence_iter_next(iter); + + if ( + download_g2_send_udp_push(mb, + gnet_host_get_addr(host), gnet_host_get_port(host)) + ) { + i++; + } + } + sequence_iterator_release(&iter); + sequence_release(&seq); + success = i > 0; + } + + if (broadcast) { + const pslist_t *sl; + + /* + * Send the message to all the hubs since on G2 we cannot track + * push routes at the leaf-node level. + */ + + PSLIST_FOREACH(node_all_g2_nodes(), sl) { + const gnutella_node_t *n = sl->data; + + g2_node_send(n, pmsg_clone(mb)); + success = TRUE; + } + } + + return success; +} + +/** + * Send a push request to the target GUID, in order to request a connection + * from the remote host. * * We're very aggressive: we can send a PUSH via UDP to the host itself, * as well as the 4 most recent push proxies when `udp' is set. @@ -8120,11 +8518,75 @@ * * @returns TRUE if the request could be sent, FALSE if we don't have the route. */ -static gboolean -download_send_push_request(struct download *d, gboolean udp, gboolean broadcast) +static bool +download_send_push(struct download *d, const struct array packet, + bool udp, bool broadcast) +{ + bool success = FALSE; + + download_check(d); + + /* Pure luck: try to reach the remote host directly via UDP... */ + if (udp) { + download_send_udp_push(packet, download_addr(d), download_port(d)); + } + + if (udp && has_push_proxies(d)) { + sequence_t *seq = pproxy_set_sequence(d->server->proxies); + sequence_iter_t *iter = sequence_forward_iterator(seq); + int i = 0; + + while (i < DOWNLOAD_MAX_UDP_PUSH && sequence_iter_has_next(iter)) { + gnet_host_t *host = sequence_iter_next(iter); + + if ( + download_send_udp_push(packet, + gnet_host_get_addr(host), gnet_host_get_port(host)) + ) { + i++; + } + } + sequence_iterator_release(&iter); + sequence_release(&seq); + success = i > 0; + } + + if (broadcast) { + pslist_t *nodes = route_towards_guid(download_guid(d)); + + if (nodes != NULL) { + /* + * Send the message to all the nodes that can route our + * request back to the source of the query hit. + */ + + gmsg_sendto_all(nodes, packet.data, packet.size); + pslist_free(nodes); + success = TRUE; + } + } + + return success; +} + +/** + * Send a push request to the target GUID, in order to request a remote + * connection from the host. + * + * We're very aggressive: we can send a PUSH via UDP to the host itself, + * as well as the 4 most recent push proxies when `udp' is set. + * We can also broadcast to the proper routes if `broadcast' is set. + * + * @returns TRUE if the request could be sent, FALSE if we don't have the route + * or we reached the throttle limit for the server. + */ +static bool +download_send_push_request(struct download *d, bool udp, bool broadcast) { - struct array packet; - guint16 port; + uint16 port; + bool success = FALSE; + int push_count; + struct dl_server *server; download_check(d); @@ -8135,66 +8597,78 @@ if (0 == port) return FALSE; - packet = build_push(GNET_PROPERTY(my_ttl), 0 /* Hops */, - download_guid(d), listen_addr(), listen_addr6(), port, - d->record_index, tls_enabled()); + /* + * Throttle the amount of push requests we can send for a given server. + * + * There are many places in the code that can call this routine (when a + * request times out and we try to fallback to push, or when we have + * a known firewalled server and we get new push proxies for it) and if + * there is a long list of files awaiting for download, this can generate + * a high PUSH message sending rate. + * --RAM, 2014-10-04 + */ - if (packet.data) { - gboolean success = FALSE; + server = d->server; + g_assert(dl_server_valid(server)); - /* Pure luck: try to reach the remote host directly via UDP... */ - if (udp) { - download_send_udp_push(packet, download_addr(d), download_port(d)); + push_count = pointer_to_int(aging_lookup(local_pushes, server->key)); + + if (push_count >= DOWNLOAD_PUSH_MAX) { + if (GNET_PROPERTY(download_debug) > 1) { + g_debug("throttling %sPUSH (udp=%s, %s=%s) " + "for %s", + download_is_g2(d) ? "G2 " : "", + udp ? "y" : "n", + download_is_g2(d) ? "g2" : "gnet", broadcast ? "y" : "n", + server_host_info(server)); } + gnet_stats_inc_general(GNR_LOCAL_PUSH_THROTTLED); + return FALSE; + } - if (udp && has_push_proxies(d)) { - sequence_t *seq = pproxy_set_sequence(d->server->proxies); - sequence_iter_t *iter = sequence_forward_iterator(seq); - int i = 0; + /* + * OK, we can send the push message. + */ - while (i < DOWNLOAD_MAX_UDP_PUSH && sequence_iter_has_next(iter)) { - gnet_host_t *host = sequence_iter_next(iter); + if (download_is_g2(d)) { + pmsg_t *mb = g2_build_push(download_guid(d)); - if ( - download_send_udp_push(packet, - gnet_host_get_addr(host), gnet_host_get_port(host)) - ) { - i++; - } - } - sequence_iterator_release(&iter); - sequence_release(&seq); - success = i > 0; - } + if (NULL == mb) + goto done; - if (broadcast) { - GSList *nodes = route_towards_guid(download_guid(d)); + success = download_g2_send_push(d, mb, udp, broadcast); + pmsg_free(mb); + } else { + const struct array packet = + build_push(GNET_PROPERTY(max_ttl), 0 /* Hops */, + download_guid(d), listen_addr(), listen_addr6(), port, + d->record_index, tls_enabled()); - if (nodes) { - /* - * Send the message to all the nodes that can route our - * request back to the source of the query hit. - */ + if (NULL == packet.data) + goto done; - gmsg_sendto_all(nodes, packet.data, packet.size); - g_slist_free(nodes); - success = TRUE; - } - } - if (success && download_is_running(d)) { - d->last_update = tm_time(); - } - return success; - } else { - if (GNET_PROPERTY(download_debug)) { - g_warning("failed to send PUSH (udp=%s, gnet=%s) " - "for %s (index=%lu)", - udp ? "y" : "n", broadcast ? "y" : "n", - host_addr_port_to_string(download_addr(d), download_port(d)), - (gulong) d->record_index); - } - return FALSE; + success = download_send_push(d, packet, udp, broadcast); + } + + if (success && download_is_running(d)) { + d->last_update = tm_time(); + } + + /* FALL THROUGH */ + +done: + if (success) { + aging_insert(local_pushes, server->key, int_to_pointer(push_count + 1)); + } else if (GNET_PROPERTY(download_debug)) { + g_warning("failed to send %sPUSH (udp=%s, %s=%s) " + "for %s (index=%lu)", + download_is_g2(d) ? "G2 " : "", + udp ? "y" : "n", + download_is_g2(d) ? "g2" : "gnet", broadcast ? "y" : "n", + server_host_info(d->server), (ulong) d->record_index); } + + return success; } /** @@ -8202,11 +8676,11 @@ * * @returns whether new server name was found. */ -static gboolean +static bool download_get_server_name(struct download *d, header_t *header) { const char *user_agent; - gboolean got_new_server = FALSE; + bool got_new_server = FALSE; download_check(d); @@ -8219,8 +8693,8 @@ const char *vendor; char *wbuf = NULL; size_t size = 0; - gboolean faked; - + bool faked; + g_assert(dl_server_valid(server)); if (NULL == user_agent || !is_strprefix(user_agent, "gtk-gnutella/")) { @@ -8243,17 +8717,21 @@ if (server->vendor == NULL) { got_new_server = TRUE; if (faked) - size = w_concat_strings(&wbuf, "!", user_agent, (void *) 0); + size = w_concat_strings(&wbuf, "!", user_agent, NULL_PTR); vendor = wbuf ? wbuf : user_agent; } else if (!faked && 0 != strcmp(server->vendor, user_agent)) { /* Name changed? */ got_new_server = TRUE; atom_str_free_null(&server->vendor); vendor = user_agent; + + /* Maybe the server was upgraded to a newer version? */ + server->attrs &= ~(DLS_A_NO_TLS_UPGRD | DLS_A_PIPELINING | + DLS_A_NO_PIPELINE | DLS_A_TLS | DLS_A_NO_HTTP_1_1); } else { vendor = NULL; } - + if (vendor) { server->vendor = atom_str_get(lazy_iso8859_1_to_utf8(vendor)); server->attrs &= ~DLS_A_FAKED_VENDOR; @@ -8272,7 +8750,7 @@ ***/ static inline struct download * -cast_to_download(gpointer p) +cast_to_download(void *p) { struct download *d = p; download_check(d); @@ -8280,7 +8758,7 @@ } static void -err_line_too_long(gpointer o, header_t *head) +err_line_too_long(void *o, header_t *head) { struct download *d = cast_to_download(o); @@ -8289,21 +8767,21 @@ } static void -err_header_error(gpointer o, int error) +err_header_error(void *o, int error) { download_stop(cast_to_download(o), GTA_DL_ERROR, _("Failed (%s)"), header_strerror(error)); } static void -err_input_buffer_full(gpointer o) +err_input_buffer_full(void *o) { struct download *d = cast_to_download(o); download_stop(d, GTA_DL_ERROR, _("Failed (Input buffer full)")); } static void -err_header_read_error(gpointer o, int error) +err_header_read_error(void *o, int error) { struct download *d = cast_to_download(o); @@ -8312,10 +8790,10 @@ } static void -err_header_read_eof(gpointer o, header_t *header) +err_header_read_eof(void *o, header_t *header) { struct download *d = cast_to_download(o); - guint32 delay = GNET_PROPERTY(download_retry_stopped_delay); + uint32 delay = GNET_PROPERTY(download_retry_stopped_delay); download_get_server_name(d, header); @@ -8445,11 +8923,11 @@ }; static void -download_start_reading(gpointer o) +download_start_reading(void *o) { struct download *d = cast_to_download(o); tm_t now; - guint32 latency; + uint32 latency; /* * Compute the time it took since we sent the headers, and update @@ -8465,6 +8943,7 @@ tm_now(&now); elapsed = tm_elapsed_ms(&now, &d->header_sent); + entropy_harvest_single(VARLEN(elapsed)); g_assert(dl_server_valid(server)); @@ -8485,13 +8964,13 @@ } static void -call_download_request(gpointer o, header_t *header) +call_download_reply(void *o, header_t *header) { - download_request(cast_to_download(o), header, TRUE); + download_reply(cast_to_download(o), header, TRUE); } static void -call_download_push_ready(gpointer o, header_t *unused_header) +call_download_push_ready(void *o, header_t *unused_header) { struct download *d = cast_to_download(o); @@ -8507,7 +8986,7 @@ download_backout(struct download *d) { filesize_t begin, end; - guint32 backout; + uint32 backout; /* * It is most likely that we have a mismatch because @@ -8529,7 +9008,7 @@ file_info_update(d, begin, end, DL_CHUNK_EMPTY); g_message("resuming data mismatch on %s, backed out %u bytes block" " from %s to %s", - download_basename(d), (guint) backout, + download_basename(d), (uint) backout, uint64_to_string(begin), uint64_to_string2(end)); } @@ -8540,12 +9019,12 @@ * @returns TRUE if the data match, FALSE if they don't, in which case the * download is stopped. */ -static gboolean +static bool download_overlap_check(struct download *d) { - struct file_object *fo; + file_object_t *fo; fileinfo_t *fi; - gboolean success = FALSE; + bool success = FALSE; char *data = NULL; download_check(d); @@ -8555,27 +9034,18 @@ g_assert(d->buffers->held >= d->chunk.overlap); fo = file_object_open(fi->pathname, O_RDONLY); - if (!fo) { - int fd = file_absolute_open(fi->pathname, O_RDONLY, 0); - if (fd >= 0) { - fo = file_object_new(fd, fi->pathname, O_RDONLY); - } else { - const char *error = g_strerror(errno); - g_warning("cannot check resuming for \"%s\": %m", - filepath_basename(fi->pathname)); - download_stop(d, GTA_DL_ERROR, _("Can't check resume data: %s"), - error); - } - } - - if (!fo) { + if (NULL == fo) { + const char *error = g_strerror(errno); + g_warning("cannot check resuming for \"%s\": %m", + filepath_basename(fi->pathname)); + download_stop(d, GTA_DL_ERROR, _("Can't check resume data: %s"), error); goto out; } { filestat_t sb; - if (-1 == fstat(file_object_get_fd(fo), &sb)) { + if (-1 == file_object_fstat(fo, &sb)) { /* Should never happen */ const char *error = g_strerror(errno); g_warning("cannot stat opened \"%s\": %m", fi->pathname); @@ -8616,7 +9086,7 @@ goto out; } else if ((size_t) r != d->chunk.overlap) { g_warning( - "short read (got %zu instead of %zu bytes at offset %zu) " + "short read (got %zu instead of %u bytes at offset %zu) " "on resuming data for \"%s\"", r, d->chunk.overlap, (size_t) d->chunk.start - d->chunk.overlap, fi->pathname); @@ -8632,7 +9102,7 @@ if (GNET_PROPERTY(download_debug) > 1) { g_debug("%u overlapping bytes UNMATCHED at offset %s for \"%s\"", - (guint) d->chunk.overlap, + (uint) d->chunk.overlap, uint64_to_string(d->chunk.start - d->chunk.overlap), download_basename(d)); } @@ -8666,7 +9136,7 @@ download_can_ignore(d) ) { success = TRUE; /* Act as if overlapping was OK */ - gnet_stats_count_general(GNR_IGNORING_AFTER_MISMATCH, 1); + gnet_stats_inc_general(GNR_IGNORING_AFTER_MISMATCH); goto out; } @@ -8700,7 +9170,7 @@ if (GNET_PROPERTY(download_debug) > 3) g_debug("%u overlapping bytes MATCHED " "at offset %s for \"%s\"", - (guint) d->chunk.overlap, + (uint) d->chunk.overlap, uint64_to_string(d->chunk.start - d->chunk.overlap), download_basename(d)); @@ -8722,8 +9192,8 @@ * * @return TRUE if OK, FALSE on failure. */ -static gboolean -download_flush(struct download *d, gboolean *trimmed, gboolean may_stop) +static bool +download_flush(struct download *d, bool *trimmed, bool may_stop) { struct dl_buffers *b; ssize_t written; @@ -8737,7 +9207,7 @@ if (GNET_PROPERTY(download_debug) > 10) g_debug("flushing %lu bytes (%u buffers) for \"%s\"%s", - (gulong) b->held, slist_length(b->list), + (ulong) b->held, slist_length(b->list), download_basename(d), may_stop ? "" : " on stop"); /* @@ -8752,7 +9222,7 @@ if (GNET_PROPERTY(download_debug)) g_debug( "server %s gave us %s more byte%s than requested for \"%s\"", download_host_info(d), uint64_to_string(extra), - extra == 1 ? "" : "s", download_basename(d)); + plural(extra), download_basename(d)); buffers_check_held(d); buffers_strip_trailing(d, extra); @@ -8766,8 +9236,7 @@ *trimmed = FALSE; } - - /** + /* * writev() and others do not necessarily flush the complete buffer * to disk, especially if the configured buffer size is large. As * this is not handled gracefully i.e., the non-flushed buffer content @@ -8782,6 +9251,8 @@ old_held = download_buffered(d); old_pos = d->pos; + entropy_harvest_small(VARLEN(d), VARLEN(old_held), VARLEN(old_pos), NULL); + do { iovec_t *iov; ssize_t ret; @@ -8793,7 +9264,7 @@ * Prepare I/O vector for writing. */ - iov = buffers_to_iovec(d, &n); + iov = buffers_to_iovec(d, &n); ret = file_object_pwritev(d->out_file, iov, n, d->pos); HFREE_NULL(iov); @@ -8806,7 +9277,7 @@ break; } else { size_t size = (size_t) ret; - + g_assert(size <= b->held); file_info_update(d, d->pos, d->pos + size, DL_CHUNK_DONE); @@ -8836,10 +9307,10 @@ } break; } - + error = g_strerror(errno); g_warning("write of %lu bytes to file \"%s\" failed: %m", - (gulong) b->held, download_basename(d)); + (ulong) b->held, download_basename(d)); /* FIXME: We should never discard downloaded data! This * causes a re-download of the same data. Instead we should @@ -8858,7 +9329,7 @@ if (b->held > 0) { g_warning("partial write (written=%lu, still held=%lu) to file \"%s\"", - (gulong) written, (gulong) b->held, download_basename(d)); + (ulong) written, (ulong) b->held, download_basename(d)); if (may_stop) download_queue_delay(d, GNET_PROPERTY(download_retry_busy_delay), @@ -8908,15 +9379,17 @@ * @param trimmed whether we had to trim the tail of the received data */ static void -download_continue(struct download *d, gboolean trimmed) +download_continue(struct download *d, bool trimmed) { struct download *cd, *next = NULL; struct gnutella_socket *s; - gboolean can_continue; + bool can_continue; const struct sha1 *sha1 = NULL; download_check(d); + entropy_harvest_single(VARLEN(d)); + /* * Determine whether we can use this download for a follow-up request if * download_pick_followup() finds no better candidate. @@ -8975,19 +9448,19 @@ /* Steal the socket because download_stop() would free it. */ s = cd->socket; - s->resource.download = NULL; + socket_detach_ops(s); cd->socket = NULL; /* - * NOTE: Resetting s->pos was missing in download_request() for THEX + * NOTE: Resetting s->pos was missing in download_reply() for THEX * and browse downloads causing a "Weird HTTP status". Keep this * a warning instead of an assertion for now until it has seen * some testing. 2007-09-12 */ if (s->pos > 0) { /* This should have already been fed to the RX stack. */ - g_warning("download_continue(): clearing socket buffer of %s", - download_host_info(d)); + g_carp("%s(): clearing socket buffer of %s", + G_STRFUNC, download_host_info(d)); } s->pos = 0; @@ -9011,10 +9484,10 @@ g_assert(NULL == next->socket); - gnet_stats_count_general(GNR_ATTEMPTED_RESOURCE_SWITCHING, 1); + gnet_stats_inc_general(GNR_ATTEMPTED_RESOURCE_SWITCHING); next->socket = s; - next->socket->resource.download = next; + socket_attach_ops(s, SOCK_TYPE_DOWNLOAD, &download_socket_ops, next); next->flags |= DL_F_SWITCHED; if (!download_is_special(cd)) next->flags |= DL_F_FROM_PLAIN; @@ -9029,7 +9502,7 @@ } else if (can_continue) { next = cd; next->socket = s; - next->socket->resource.download = next; + socket_attach_ops(s, SOCK_TYPE_DOWNLOAD, &download_socket_ops, next); } else { download_stop(cd, GTA_DL_COMPLETED, _("Nothing else to switch to")); socket_free_null(&s); @@ -9050,14 +9523,14 @@ * * @return FALSE if an error occurred. */ -static gboolean +static bool download_write_data(struct download *d) { struct dl_buffers *b; fileinfo_t *fi; - gboolean trimmed = FALSE; + bool trimmed = FALSE; enum dl_chunk_status status = DL_CHUNK_BUSY; - gboolean should_flush; + bool should_flush; download_check(d); @@ -9122,7 +9595,7 @@ "%s: %sflushing pending %lu bytes for \"%s\", pos=%s, end=%s", download_host_info(d), should_flush ? "" : "NOT ", - (gulong) b->held, download_basename(d), + (ulong) b->held, download_basename(d), uint64_to_string(d->pos), uint64_to_string2(d->chunk.end)); } @@ -9167,13 +9640,11 @@ ) goto done; /* Will ignore data until we can switch to another file */ - gnet_stats_count_general( - GNR_IGNORING_TO_PRESERVE_CONNECTION, 1); + gnet_stats_inc_general(GNR_IGNORING_TO_PRESERVE_CONNECTION); } else if (d->pos == d->chunk.end) { goto partial_done; } else if (download_can_ignore(d)) { - gnet_stats_count_general( - GNR_IGNORING_DURING_AGGRESSIVE_SWARMING, 1); + gnet_stats_inc_general(GNR_IGNORING_DURING_AGGRESSIVE_SWARMING); } else download_queue(d, _("Requeued by competing download")); break; @@ -9230,7 +9701,7 @@ */ { - gboolean pipelining = download_pipelining(d); + bool pipelining = download_pipelining(d); g_assert(FILE_INFO_COMPLETE(fi)); @@ -9254,7 +9725,7 @@ */ { - gboolean pipelining = download_pipelining(d); + bool pipelining = download_pipelining(d); download_continue(d, trimmed); return pipelining; @@ -9268,13 +9739,13 @@ * * @returns TRUE if we managed to parse the new location. */ -static gboolean +static bool download_moved_permanently(struct download *d, header_t *header) { const char *buf; dmesh_urlinfo_t info; host_addr_t addr; - guint16 port; + uint16 port; download_check(d); @@ -9295,7 +9766,7 @@ * If ip/port changed, accept the new ones but warn. */ - if (!host_addr_equal(info.addr, addr) || info.port != port) { + if (!host_addr_equiv(info.addr, addr) || info.port != port) { g_warning("server %s (file \"%s\") redirecting us to alien %s", host_addr_port_to_string(addr, port), download_basename(d), buf); } @@ -9339,7 +9810,7 @@ atom_str_free_null(&d->file_name); - d->file_name = deconstify_gchar(info.name); /* Already an atom */ + d->file_name = deconstify_char(info.name); /* Already an atom */ } else atom_str_free_null(&info.name); @@ -9360,7 +9831,7 @@ * * @return TRUE if we can continue. */ -static gboolean +static bool download_check_status(struct download *d, header_t *header, int code) { download_check(d); @@ -9421,7 +9892,7 @@ * @returns TRUE if OK, FALSE if we stopped the download because we finally * spotted it as being a duplicate! */ -static gboolean +static bool download_convert_to_urires(struct download *d) { struct download *xd; @@ -9467,11 +9938,11 @@ /** * Extract Retry-After delay from header, returning 0 if none. */ -guint +uint extract_retry_after(struct download *d, const header_t *header) { const char *buf; - guint32 delay; + uint32 delay; int error; download_check(d); @@ -9514,13 +9985,13 @@ * * @return TRUE if we found a valid urn:bitprint and filled the information. */ -static gboolean +static bool extract_bitprint(const char *buf, struct sha1 *sha1, struct tth *tth) { strtok_t *st; const char *tok; size_t len; - gboolean found = FALSE; + bool found = FALSE; st = strtok_make_strip(buf); @@ -9531,7 +10002,7 @@ } } - strtok_free(st); + strtok_free_null(&st); return found; } @@ -9557,7 +10028,7 @@ uri_start = header_get(header, "X-Thex-URI"); if (NULL == uri_start) return; - + if ('/' != uri_start0) { if (GNET_PROPERTY(tigertree_debug)) { g_debug("TTH X-Thex-URI header has no valid URI (%s): \"%s\"", @@ -9648,7 +10119,7 @@ tt_good_depth(download_filesize(d)) > tt_depth(d->file_info->tigertree.num_leaves) ) { - guint32 cflags = 0; + uint32 cflags = 0; gnet_host_vec_t *proxies; char *uri; struct download *dt; @@ -9825,7 +10296,7 @@ { const char *buf; host_addr_t addr; - guint16 port; + uint16 port; download_check(d); g_assert(d->got_giv); @@ -9847,7 +10318,7 @@ * the server knew its real IP address. */ - if (!host_addr_equal(addr, download_addr(d)) || port != download_port(d)) + if (!host_addr_equiv(addr, download_addr(d)) || port != download_port(d)) download_redirect_to_server(d, addr, port); /* @@ -9863,7 +10334,7 @@ d->flags |= DL_F_PUSH_IGN; } -static gboolean +static bool content_range_check(struct download *d, header_t *header) { filesize_t start, end, total; @@ -9873,7 +10344,7 @@ buf = header_get(header, "Content-Range"); /* Optional */ if (NULL == buf) return TRUE; - + if (0 != http_content_range_parse(buf, &start, &end, &total)) return TRUE; @@ -9885,7 +10356,7 @@ if (fi->size == total) return TRUE; - + download_bad_source(d); download_stop(d, GTA_DL_ERROR, _("Filesize mismatch")); return FALSE; @@ -9896,10 +10367,10 @@ * * @returns FALSE if we cannot continue with the download. */ -static gboolean +static bool handle_content_urn(struct download *d, header_t *header) { - gboolean found_sha1 = FALSE; + bool found_sha1 = FALSE; struct sha1 sha1; struct tth tth; const char *buf; @@ -9930,7 +10401,7 @@ buf = header_get(header, "X-Content-URN"); if (buf == NULL) { - gboolean n2r = FALSE; + bool n2r = FALSE; /* * We don't have any X-Gnutella-Content-URN header on this server. @@ -10096,12 +10567,19 @@ file_info_check(d->file_info); g_assert(d->sha1 || d->file_info->sha1); - huge_collect_locations(d->sha1 ? d->sha1 : d->file_info->sha1, header); + { + gnet_host_t host; + const sha1_t *dsha1 = d->sha1 != NULL ? d->sha1 : d->file_info->sha1; - buf = header_get(header, "X-Nalt"); - if (buf) - dmesh_collect_negative_locations( - d->sha1 ? d->sha1 : d->file_info->sha1, buf, download_addr(d)); + gnet_host_set(&host, download_addr(d), download_port(d)); + huge_collect_locations(dsha1, header, &host); + + buf = header_get(header, "X-Nalt"); + if (buf != NULL) { + dmesh_collect_negative_locations(dsha1, buf, + download_addr(d), download_vendor(d)); + } + } return TRUE; } @@ -10133,14 +10611,14 @@ * @return TRUE if we got push-proxies, FALSE if the header did not contain any * that we did not know about. */ -static gboolean +static bool check_fw_node_info(struct dl_server *server, const char *fwinfo) { struct dl_key *key = server->key; struct guid guid; - gboolean seen_proxy = FALSE; - gboolean seen_guid = FALSE; - gboolean seen_pptls = FALSE; + bool seen_proxy = FALSE; + bool seen_guid = FALSE; + bool seen_pptls = FALSE; const char *tok; const char *msg = NULL; size_t added = 0; @@ -10161,7 +10639,7 @@ while ((tok = strtok_next(st, ";"))) { host_addr_t addr; - guint16 port; + uint16 port; /* GUID is the first item we expect */ if (!seen_guid) { @@ -10170,7 +10648,7 @@ break; } if (guid_eq(&guid, GNET_PROPERTY(servent_guid))) { - gnet_stats_count_general(GNR_OWN_GUID_COLLISIONS, 1); + gnet_stats_inc_general(GNR_OWN_GUID_COLLISIONS); msg = "node bears our GUID"; break; } @@ -10201,7 +10679,7 @@ string_to_port_host_addr(tok, NULL, &port, &addr) ) { if (!is_private_addr(addr) && host_addr_is_routable(addr)) { - if (!host_addr_equal(key->addr, addr) || key->port != port) { + if (!host_addr_equiv(key->addr, addr) || key->port != port) { change_server_addr(server, addr, port); } download_found_server(&guid, addr, port); @@ -10224,7 +10702,7 @@ } } - strtok_free(st); + strtok_free_null(&st); if (!seen_guid && NULL == msg) msg = "missing GUID"; @@ -10255,29 +10733,29 @@ */ void download_got_fw_node_info(const struct guid *guid, - host_addr_t addr, guint16 port, const char *fwinfo) + host_addr_t addr, uint16 port, const char *fwinfo) { struct dl_server *server; /* * See whether we know this server by GUID, then by addr+port. */ - - server = g_hash_table_lookup(dl_by_guid, guid); + + server = htable_lookup(dl_by_guid, guid); if (NULL == server && host_is_valid(addr, port)) { struct dl_addr ipk; ipk.addr = addr; ipk.port = port; - - server = g_hash_table_lookup(dl_by_addr, &ipk); + + server = htable_lookup(dl_by_addr, &ipk); } if (NULL == server) return; /* Don't know this server, ignore */ - gnet_stats_count_general(GNR_RECEIVED_KNOWN_FW_NODE_INFO, 1); + gnet_stats_inc_general(GNR_RECEIVED_KNOWN_FW_NODE_INFO); check_fw_node_info(server, fwinfo); } @@ -10337,7 +10815,7 @@ while ((tok = strtok_next(st, ","))) { host_addr_t addr; - guint16 port; + uint16 port; /* TODO: handle pptls=<hex> */ if (is_strcaseprefix(tok, "pptls=")) @@ -10355,7 +10833,7 @@ } } - strtok_free(st); + strtok_free_null(&st); if (added > 0) download_push_proxy_wakeup(d->server, TRUE, FALSE); @@ -10374,17 +10852,20 @@ * @return TRUE if we have seen one of the X-Available headers, indicating * that the remote file is partial. */ -static gboolean +static bool update_available_ranges(struct download *d, const header_t *header) { static const char available_ranges = "X-Available-Ranges"; static const char available = "X-Available"; const char *buf; filesize_t available_bytes = 0; - gboolean seen_available = FALSE; + bool seen_available = FALSE; + bool has_new_ranges = FALSE; + bool was_complete; download_check(d); + was_complete = !(d->flags & DL_F_PARTIAL); d->flags &= ~DL_F_PARTIAL; /* Assume file is complete now */ if (!d->file_info->use_swarming) @@ -10402,11 +10883,11 @@ int error; char *p = is_strprefix(buf, "bytes"); - d->flags |= DL_F_PARTIAL; /* Definitevely a partial file */ + d->flags |= DL_F_PARTIAL; /* Definitely a partial file */ seen_available = TRUE; if (p) { - guint64 v; + uint64 v; p = skip_ascii_blanks(p); v = parse_uint64(p, NULL, 10, &error); @@ -10429,10 +10910,19 @@ buf = header_get(header, available_ranges); + if (NULL == buf && !seen_available) { + /* + * Neither X-Available nor X-Available-Ranges were seen, therefore + * file must be complete. + */ + + available_bytes = download_filesize(d); + } + if (NULL == buf || download_filesize(d) == 0) goto send_event; - d->flags |= DL_F_PARTIAL; /* Definitevely a partial file */ + d->flags |= DL_F_PARTIAL; /* Definitely a partial file */ seen_available = TRUE; /* @@ -10442,7 +10932,7 @@ if (0 == strcmp(buf, "bytes")) goto send_event; - + /* * Update available range list and total size available remotely. * @@ -10451,17 +10941,30 @@ */ { - GSList *old_ranges = d->ranges; - GSList *new_ranges; + filesize_t old_length, new_length; + http_rangeset_t *new_ranges; + + old_length = NULL == d->ranges ? 0 : http_rangeset_length(d->ranges); - new_ranges = http_range_parse(available_ranges, buf, + new_ranges = http_rangeset_extract(available_ranges, buf, download_filesize(d), download_vendor_str(d)); - d->ranges = http_range_merge(old_ranges, new_ranges); - d->ranges_size = http_range_size(d->ranges); + if (new_ranges != NULL) { + if (d->ranges != NULL) { + new_length = http_rangeset_merge(d->ranges, new_ranges); + } else { + new_length = http_rangeset_length(new_ranges); + d->ranges = new_ranges; + } + } else { + new_length = old_length; + } + + d->ranges_size = new_length; + has_new_ranges = old_length != new_length; - http_range_free(old_ranges); - http_range_free(new_ranges); + if (d->ranges != new_ranges) + http_rangeset_free_null(&new_ranges); } /* FALL THROUGH */ @@ -10475,9 +10978,11 @@ if (available_bytes > d->ranges_size) { d->ranges_size = available_bytes; + has_new_ranges = TRUE; if (GNET_PROPERTY(download_debug)) { - g_debug("X-Available header from %s: has %s bytes for \"%s\"", + g_debug("%s X-Available header from %s: has %s bytes for \"%s\"", + seen_available ? "seen some" : "no", download_host_info(d), uint64_to_string(available_bytes), download_basename(d)); } @@ -10487,27 +10992,37 @@ * If they have the whole file, we can discard the ranges. */ - if (download_filesize(d) != 0 && d->ranges_size >= download_filesize(d)) { + if ( + !was_complete && + download_filesize(d) != 0 && + d->ranges_size >= download_filesize(d) + ) { if (GNET_PROPERTY(download_debug)) { g_debug("server %s now has the whole file (%s bytes) for \"%s\"", download_host_info(d), uint64_to_string(available_bytes), download_basename(d)); } - http_range_free(d->ranges); - d->ranges = NULL; - d->ranges_size = download_filesize(d); + http_rangeset_free_null(&d->ranges); d->flags &= ~DL_F_PARTIAL; + has_new_ranges = TRUE; } /* - * We should always send an update event for the ranges, even when - * not using swarming or when there are no available ranges. That - * way the receiver of this event can still determine that the - * whole range for this file is available. + * For complete files, make sure ``ranges_size'' is set to the whole file. + */ + + if (0 == (d->flags & DL_F_PARTIAL)) + d->ranges_size = download_filesize(d); + + /* + * Send an update event for the ranges when there is a change, or when + * we are processing the first request, to let listeners initialize the + * range list */ - fi_src_ranges_changed(d); + if (has_new_ranges || 0 == d->served_reqs) + fi_src_ranges_changed(d); return seen_available; } @@ -10558,7 +11073,7 @@ * Read callback for file data. */ static void -download_sink_read(gpointer data, int unused_source, +download_sink_read(void *data, int unused_source, inputevt_cond_t unused_cond) { struct download *d = data; @@ -10602,12 +11117,12 @@ { static char *prev; char *s; - + g_assert(src); g_assert(src != prev); G_FREE_NULL(prev); - + if (is_ascii_string(src)) return src; @@ -10623,7 +11138,7 @@ * Mark download as receiving data: download is becoming active. */ static void -download_mark_active(struct download *d, gboolean must_ignore) +download_mark_active(struct download *d, bool must_ignore, bool is_followup) { fileinfo_t *fi; @@ -10633,10 +11148,40 @@ d->start_date = tm_time(); download_set_status(d, must_ignore ? GTA_DL_IGNORING : GTA_DL_RECEIVING); - if (fi->recvcount == 0) { /* First source to begin receiving */ - fi->recv_last_time = d->start_date; - fi->recv_last_rate = 0; + /* + * If we're a browse/THEX download, we're not really receiving data + * for the file so we don't need to increase fi->recvcount nor set the + * fileinfo as dirty. + */ + + if (!download_is_special(d)) { + /* + * If first source to begin receiving, reset receive rate. + * + * The fi->recvcount is not enough to determine whether we're the first + * source, since we download_clone() between each request and then stop + * the parent. Therefore, we need to to look at whether is_followup + * is TRUE, meaning we're following-up on a request and fi->recvcount + * being 0 means we're the only source for the file... + * --RAM, 2013-11-03 + */ + + if ( + !is_followup && + 0 == fi->recvcount + ) { + fi->recv_last_time = d->start_date; + fi->recv_last_rate = 0; + } + + /* + * Prepare reading buffers for regular download. + */ + + buffers_alloc(d); + buffers_reset_reading(d); } + fi->recvcount++; fi->dirty_status = TRUE; @@ -10664,15 +11209,6 @@ socket_tos_lowdelay(s); socket_recv_buf(s, GNET_PROPERTY(download_rx_size) * 1024, TRUE); } - - /* - * If not a browse-host request, prepare reading buffers. - */ - - if (!(d->flags & (DL_F_BROWSE | DL_F_THEX))) { - buffers_alloc(d); - buffers_reset_reading(d); - } } /** @@ -10683,13 +11219,13 @@ * @returns TRUE if the given User-Agent string is known to be used by * spammers only, FALSE otherwise. */ -static gboolean +static bool is_dumb_spammer(const char *user_agent) { const char *endptr; g_return_val_if_fail(user_agent, FALSE); - + endptr = is_strcaseprefix(user_agent, "LimeWire/"); if (endptr) { if (is_strprefix(endptr, "3.6.") || is_strprefix(endptr, "4.8.10.")) { @@ -10703,12 +11239,12 @@ return FALSE; } -static gboolean +static bool xalt_detect_tls_support(struct download *d, header_t *header) { const char *tls_hex = NULL, *next; size_t host_index = 0; - gboolean found = FALSE; + bool found = FALSE; download_check(d); @@ -10716,8 +11252,8 @@ while (NULL != next) { const char *start, *endptr, *p; host_addr_t addr; - guint16 port; - gboolean ok; + uint16 port; + bool ok; p = next; start = skip_ascii_blanks(p); @@ -10735,7 +11271,7 @@ /* * There could be a GUID here if the host is not directly connectible * but we ignore this apparently. - */ + */ ok = string_to_host_addr(start, &endptr, &addr); if (ok && ':' == *endptr) { int error; @@ -10750,7 +11286,7 @@ if ( port == download_port(d) && - host_addr_equal(addr, download_addr(d)) + host_addr_equiv(addr, download_addr(d)) ) { found = TRUE; break; @@ -10776,7 +11312,7 @@ } } } - + return FALSE; } @@ -10787,16 +11323,26 @@ static void download_detect_tls_support(struct download *d, header_t *header) { + bool advertises_tls; + download_check(d); - dl_server_valid(d->server); + g_assert(dl_server_valid(d->server)); if (d->got_giv) return; - if ( - header_get_feature("tls", header, NULL, NULL) || - xalt_detect_tls_support(d, header) - ) { + /* + * If the node does not advertise TLS in its features, it will not + * support TLS upgrades at all, so don't even bother advertising + * that we can upgrade. + */ + + advertises_tls = header_get_feature("tls", header, NULL, NULL); + + if (!advertises_tls) + d->server->attrs |= DLS_A_NO_TLS_UPGRD; + + if (advertises_tls || xalt_detect_tls_support(d, header)) { tls_cache_insert(download_addr(d), download_port(d)); d->server->attrs |= DLS_A_TLS; } @@ -10811,35 +11357,8 @@ * * @return the created file object, NULL if file could not be opened. */ -struct file_object * -download_open(const char * const pathname) -{ - struct file_object *fo; - - /* - * Try to reusing existing file descriptor attached to the path. - */ - - fo = file_object_open(pathname, O_WRONLY); - - if (!fo) { - int fd; - - /* - * Since there was no file object initially, a new one is created - * for reading AND writing, in order to allow sharing the file - * descriptor with uploading as well (PFSP support). A request through - * file_object_open() for O_WRONLY or O_RDONLY will still return the - * same file descriptor. - */ - - fd = file_open_missing(pathname, O_RDWR); - if (fd >= 0) - fo = file_object_new(fd, pathname, O_RDWR); - } - - return fo; -} +#define download_open(p) \ + file_object_open((p), O_WRONLY) /** * We discovered the total size of the resource. @@ -10866,6 +11385,131 @@ } /** + * Discard HTTP header parsing / collecting structures. + */ +static void +download_io_header_free(struct download *d) +{ + gnutella_socket_t *s; + + download_check(d); + socket_check(d->socket); + + s = d->socket; + + g_assert(d->io_opaque != NULL); + g_assert(s->getline != NULL); + + io_free(d->io_opaque); + getline_free_null(&s->getline); + + g_assert(NULL == d->io_opaque); +} + +/** + * Wait for HTTP reply from remote host. + */ +static void +download_wait_reply(struct download *d) +{ + download_check(d); + + g_assert(d->io_opaque == NULL); + socket_check(d->socket); + + io_get_header(d, &d->io_opaque, + bsched_in_select_by_addr(d->socket->addr), d->socket, IO_SAVE_FIRST, + call_download_reply, download_start_reading, &download_io_error); +} + +/** + * Invoked by the socket layer when the TLS upgrade was successful. + */ +static void +download_tls_upgraded(void *arg) +{ + struct download *d = arg; + + download_check(d); + socket_check(d->socket); + g_assert(socket_uses_tls(d->socket)); + + d->flags &= ~DL_F_TLS_UPGRADING; + d->tls_upgraded = TRUE; + + if (GNET_PROPERTY(download_debug)) { + g_debug("%s(): TLS upgrade successful for \"%s\" on %s", + G_STRFUNC, download_basename(d), download_host_info(d)); + } + + /* + * Now that the upgrade to TLS was done, we need to wait for the header + * reply from the server that will follow the "101 Switching Protocols" + * continuation. + */ + + download_wait_reply(d); +} + +/** + * Got a "101 Switching Protocols" reply back. + * + * This is a continuation header, and the server is not done replying. + * Once processed, we will need to read following header again before + * going back to download_reply() to handle the server reply. + */ +static void +download_switch_protocols(struct download *d, const header_t *header) +{ + const char *field; + + /* + * See whether server wants to upgrade to TLS. + */ + + field = header_get(header, "Connection"); + if (NULL == field || 0 != ascii_strcasecmp(field, "upgrade")) + goto no_tls_upgrade; + + field = header_get(header, "Upgrade"); + if (NULL == field || !is_strprefix(field, "TLS/1.0, HTTP/")) + goto no_tls_upgrade; + + /* + * The server is going to switch protocols before sending us the reply + * to our request. To read anything from now on, we need to use TLS. + * + * Note that if we cannot perform the TLS handshake, the connection will + * be closed. This is why we need to remember that we attempted an + * upgrade so that, should the upgrade fail, we can mark the server as + * not able to conduct the TLS upgrade properly, to avoid requesting it + * the next time we connect. + */ + + d->flags |= DL_F_TLS_UPGRADING; + d->flags &= ~DL_F_TLS_PROPOSED; + + if (GNET_PROPERTY(download_debug) > 1) { + g_debug("%s(): attempting TLS upgrade with %s", + G_STRFUNC, download_host_info(d)); + } + + download_io_header_free(d); + socket_tls_upgrade(d->socket, download_tls_upgraded, d); + + return; + +no_tls_upgrade: + if (GNET_PROPERTY(download_debug)) { + g_warning("%s(): strange, no opportunity for TLS upgrade with %s", + G_STRFUNC, download_host_info(d)); + } + + download_io_header_free(d); + download_wait_reply(d); +} + +/** * Called to initiate the download once all the HTTP headers have been read. * If `ok' is false, we timed out reading the header, and have therefore * something incomplete. @@ -10874,30 +11518,30 @@ * Otherwise, stop the download. */ static void -download_request(struct download *d, header_t *header, gboolean ok) +download_reply(struct download *d, header_t *header, bool ok) { struct gnutella_socket *s; const char *status; - guint ack_code; + uint ack_code; const char *ack_message = ""; const char *buf; - gboolean got_content_length = FALSE; + bool got_content_length = FALSE; filesize_t content_length = 0; - gboolean is_chunked; - gboolean must_ignore; + bool is_chunked; + bool must_ignore; http_content_encoding_t content_encoding; filesize_t check_content_range = 0, requested_size; - guint http_major = 0, http_minor = 0; - gboolean is_followup; + uint http_major = 0, http_minor = 0; + bool is_followup; fileinfo_t *fi; char short_read80; - guint delay; - guint hold = 0; - guint fixed_ack_code; - gboolean pipelined_response = FALSE; + uint delay; + uint hold = 0; + uint fixed_ack_code; + bool pipelined_response = FALSE; download_check(d); - + is_followup = d->keep_alive; s = d->socket; fi = d->file_info; @@ -10938,12 +11582,29 @@ return; } - if (d->flags & DL_F_FAKE_G2) { + /* + * The DL_F_FAKE_G2 was set when we decided to attempt advertising as + * a G2 node. Since GTKG supports both Gnutella and G2, we're not really + * faking anything, it's just that we decide to "appear" as a G2 node to + * be able to correctly download from another G2-only servent. + * + * (The Gnutella and G2 protocols are just "search engines", file exchange + * is HTTP, which could not care less about the way the resource location + * was obtained.) + * + * If we get here, it means advertising as G2 worked, hence the remote side + * must be flagged as a G2 host. This information will be persisted in + * the download magnet, as well as in the G2 cache (to be able to handle + * other resources on the same server when this resource is fully fetched). + */ + + if ((d->flags & DL_F_FAKE_G2) || (d->server->attrs & DLS_A_FAKE_G2)) { if (GNET_PROPERTY(download_debug)) g_debug("server %s responded well to G2 faking for \"%s\"", download_host_info(d), download_basename(d)); d->flags &= ~DL_F_FAKE_G2; + d->server->attrs &= ~DLS_A_FAKE_G2; d->server->attrs |= DLS_A_G2_ONLY; if (download_port(d) != 0 && is_host_addr(download_addr(d))) { @@ -11154,15 +11815,45 @@ if (ok) short_read0 = '\0'; else { - guint count = header_num_lines(header); - gm_snprintf(short_read, sizeof short_read, - "short %u line%s header ", count, count == 1 ? "" : "s"); + uint count = header_num_lines(header); + str_bprintf(short_read, sizeof short_read, + "short %u line%s header ", count, plural(count)); d->keep_alive = FALSE; /* Got incomplete headers -> close */ } - if (is_dumb_spammer(download_vendor_str(d))) { - hostiles_dynamic_add(download_addr(d), "dumb spammer"); + /* + * Handle TLS upgrades early. + */ + + if (101 == ack_code) { + if (ok) { + download_switch_protocols(d, header); + } else { + download_stop(d, GTA_DL_ERROR, "%s", + _("Incomplete headers during TLS upgrade")); + } + return; + } + + /* + * If we proposed a TLS upgrade but we're not using TLS yet, mark + * the server as not understanding TLS upgrades so that we're not + * constantly proposing them when initiating requests. + */ + + if ((d->flags & DL_F_TLS_PROPOSED) && !socket_uses_tls(d->socket)) { + d->flags &= ~DL_F_TLS_PROPOSED; + d->server->attrs |= DLS_A_NO_TLS_UPGRD; + + if (GNET_PROPERTY(download_debug) > 1) { + g_message("server %s does not support TLS upgrades", + download_host_info(d)); + } + } + + if (is_dumb_spammer(download_vendor_str(d))) { + hostiles_dynamic_add(download_addr(d), "dumb spammer", HSTL_DUMB); download_bad_source(d); download_stop(d, GTA_DL_ERROR, "%s", _("Spammer detected")); return; @@ -11180,7 +11871,7 @@ */ if ( ack_code == 503 && d->ranges != NULL && - !http_range_contains(d->ranges, + !http_rangeset_contains(d->ranges, d->chunk.start, d->chunk.end - 1) && NULL == header_get(header, "X-Queue") && NULL == header_get(header, "X-Queued") @@ -11227,7 +11918,7 @@ if (d->flags & DL_F_SWITCHED) { d->flags &= ~(DL_F_SWITCHED | DL_F_FROM_PLAIN | DL_F_FROM_ERROR); - gnet_stats_count_general(GNR_QUEUED_AFTER_SWITCHING, 1); + gnet_stats_inc_general(GNR_QUEUED_AFTER_SWITCHING); } return; @@ -11250,7 +11941,7 @@ * replies are possible with PFSP. */ - if (d->ranges && d->keep_alive && d->file_info->use_swarming) { + if (d->ranges != NULL && d->keep_alive && d->file_info->use_swarming) { switch (ack_code) { case 503: /* Range not available, maybe */ case 416: /* Range not satisfiable */ @@ -11260,18 +11951,19 @@ */ if ( - http_range_contains( - d->ranges, d->chunk.start, d->chunk.end - 1) + http_rangeset_contains(d->ranges, + d->chunk.start, d->chunk.end - 1) ) { - if (GNET_PROPERTY(download_debug) > 3) + if (GNET_PROPERTY(download_debug) > 3) { g_debug("PFSP currently requested chunk %s-%s from %s " "for \"%s\" already in the available ranges: %s", uint64_to_string(d->chunk.start), uint64_to_string2(d->chunk.end - 1), host_addr_port_to_string(download_addr(d), download_port(d)), - download_basename(d), http_range_to_string(d->ranges)); - + download_basename(d), + http_rangeset_to_string(d->ranges)); + } break; } @@ -11299,7 +11991,7 @@ */ if (delay == 0 && download_pick_available(d, &d->chunk)) { - guint64 v; + uint64 v; int error; /* @@ -11355,9 +12047,7 @@ return; } - io_free(d->io_opaque); - getline_free(s->getline); /* No longer need this */ - s->getline = NULL; + download_io_header_free(d); d->flags |= DL_F_CHUNK_CHOSEN; d->flags |= DL_F_SUNK_DATA; /* Sink only once per session */ @@ -11510,20 +12200,20 @@ download_passively_queued(d, TRUE); - rw = gm_snprintf(tmp, sizeof(tmp), "%s", _("Queued")); + rw = str_bprintf(tmp, sizeof(tmp), "%s", _("Queued")); if (pos > 0) { - rw += gm_snprintf(&tmprw, sizeof(tmp)-rw, + rw += str_bprintf(&tmprw, sizeof(tmp)-rw, _(" (slot %d"), pos); /* ) */ if (length > 0) - rw += gm_snprintf(&tmprw, sizeof(tmp)-rw, + rw += str_bprintf(&tmprw, sizeof(tmp)-rw, "/%d", length); if (eta > 0) - rw += gm_snprintf(&tmprw, sizeof(tmp)-rw, + rw += str_bprintf(&tmprw, sizeof(tmp)-rw, _(", ETA: %s"), short_time(eta)); - rw += gm_snprintf(&tmprw, sizeof(tmp)-rw, /* ( */ ")"); + rw += str_bprintf(&tmprw, sizeof(tmp)-rw, /* ( */ ")"); } download_queue_delay(d, @@ -11566,7 +12256,7 @@ */ if (is_strprefix(download_vendor_str(d), "gtk-gnutella/")) { - gboolean was_banning = d->server->attrs & DLS_A_BANNING; + bool was_banning = d->server->attrs & DLS_A_BANNING; d->server->attrs &= ~DLS_A_BANNING; d->server->attrs &= ~DLS_A_MINIMAL_HTTP; @@ -11585,7 +12275,8 @@ case 403: if (is_strprefix(ack_message, "Network Disabled")) { if (GNET_PROPERTY(enable_hackarounds)) { - d->server->attrs |= DLS_A_FAKE_G2; + if (0 == (d->server->attrs & DLS_A_G2_ONLY)) + d->server->attrs |= DLS_A_FAKE_G2; } d->server->attrs |= DLS_A_G2_ONLY; hold = MAX(delay, 320); /* To be safe */ @@ -11609,8 +12300,10 @@ case 503: /* Shareaza >= 2.2.3.0 misunderstands everything */ fixed_ack_code = 403; /* Fix their error */ hold = MAX(delay, 7260); /* To be safe */ - if (GNET_PROPERTY(enable_hackarounds)) - d->server->attrs |= DLS_A_FAKE_G2; + if (GNET_PROPERTY(enable_hackarounds)) { + if (0 == (d->server->attrs & DLS_A_G2_ONLY)) + d->server->attrs |= DLS_A_FAKE_G2; + } d->server->attrs |= DLS_A_G2_ONLY; if (download_port(d) != 0 && is_host_addr(download_addr(d))) { g2_cache_insert(download_addr(d), download_port(d)); @@ -11664,25 +12357,25 @@ } genuine_error: - download_stop_switch(d, header, GTA_DL_ERROR, - "%sHTTP %u %s", short_read, ack_code, ack_message); - return; - } + download_stop_switch(d, header, "%sHTTP %u %s", + short_read, ack_code, ack_message); + return; + } - /* - * We got a success status from the remote servent. Parse header. - */ + /* + * We got a success status from the remote servent. Parse header. + */ - g_assert(ok); + g_assert(ok); - /* - * Even upon a 2xx reply, a PARQ-compliant server may send us an ID. - * That ID will be used when the server sends us a QUEUE, so it's good - * to remember it. - * --RAM, 17/05/2003 - */ + /* + * Even upon a 2xx reply, a PARQ-compliant server may send us an ID. + * That ID will be used when the server sends us a QUEUE, so it's good + * to remember it. + * --RAM, 17/05/2003 + */ - (void) parq_download_parse_queue_status(d, header, ack_code); + (void) parq_download_parse_queue_status(d, header, ack_code); /* * If they configured us to require a server name, and we have none @@ -11824,7 +12517,7 @@ ) { char got64; - gm_snprintf(got, sizeof got, "got %s - %s", + str_bprintf(got, sizeof got, "got %s - %s", uint64_to_string(start), uint64_to_string2(end)); /* XXX: Should we check whether we can use this range @@ -11944,13 +12637,12 @@ */ if (d->flags & DL_F_SWITCHED) { - gnet_stats_count_general(GNR_SUCCESSFUL_RESOURCE_SWITCHING, 1); + gnet_stats_inc_general(GNR_SUCCESSFUL_RESOURCE_SWITCHING); if (!download_is_special(d) && (d->flags & DL_F_FROM_PLAIN)) { - gnet_stats_count_general( - GNR_SUCCESSFUL_PLAIN_RESOURCE_SWITCHING, 1); + gnet_stats_inc_general(GNR_SUCCESSFUL_PLAIN_RESOURCE_SWITCHING); } else if (d->flags & DL_F_FROM_ERROR) { - gnet_stats_count_general( - GNR_SUCCESSFUL_RESOURCE_SWITCHING_AFTER_ERROR, 1); + gnet_stats_inc_general( + GNR_SUCCESSFUL_RESOURCE_SWITCHING_AFTER_ERROR); } d->flags &= ~(DL_F_SWITCHED | DL_F_FROM_PLAIN | DL_F_FROM_ERROR); } @@ -11960,10 +12652,10 @@ */ if (d->flags & DL_F_PREFIX_HEAD) { - /* Ignore the rest */ + /* Ignore the rest */ } else if (d->flags & DL_F_BROWSE) { gnet_host_t host; - guint32 flags = 0; + uint32 flags = 0; g_assert(d->browse != NULL); @@ -11976,6 +12668,29 @@ flags |= BH_DL_CHUNKED; } + /* + * Are we getting proper query hits? + */ + + buf = header_get(header, "Content-Type"); /* Mandatory */ + if (buf != NULL) { + if (strtok_case_has(buf, ",", APP_GNUTELLA)) { + /* OK, nothing to do */ + } else if (strtok_case_has(buf, ",", APP_G2)) { + flags |= BH_DL_G2; + } else { + if (GNET_PROPERTY(download_debug)) { + g_debug("unknown Content-Type \"%s\" from %s", + buf, download_host_info(d)); + } + download_stop(d, GTA_DL_ERROR, _("Unexpected Content-Type")); + return; + } + } else { + download_stop(d, GTA_DL_ERROR, _("No Content-Type")); + return; + } + if ( !browse_host_dl_receive(d->browse, &host, &d->socket->wio, download_vendor_str(d), flags) @@ -11987,7 +12702,7 @@ d->bio = browse_host_io_source(d->browse); } else if (d->flags & DL_F_THEX) { gnet_host_t host; - guint32 flags = 0; + uint32 flags = 0; g_assert(d->thex != NULL); @@ -12021,9 +12736,7 @@ * Cleanup header-reading data structures. */ - io_free(d->io_opaque); - getline_free(s->getline); /* No longer need this */ - s->getline = NULL; + download_io_header_free(d); if (d->flags & DL_F_PREFIX_HEAD) { d->flags &= ~DL_F_PREFIX_HEAD; @@ -12036,11 +12749,11 @@ } /* - * Done for a browse-host request. + * Done for a special request (e.g. THEX or browse downloads). */ - if (d->flags & (DL_F_BROWSE | DL_F_THEX)) { - download_mark_active(d, FALSE); + if (download_is_special(d)) { + download_mark_active(d, FALSE, is_followup); /* * If we have something in the socket buffer, feed it to the RX stack. @@ -12127,7 +12840,7 @@ d->flags &= ~DL_F_MUST_IGNORE; must_ignore = TRUE; rx_set_data_ind(d->rx, download_ignore_data_ind); - gnet_stats_count_general(GNR_IGNORING_TO_PRESERVE_CONNECTION, 1); + gnet_stats_inc_general(GNR_IGNORING_TO_PRESERVE_CONNECTION); } else { must_ignore = FALSE; rx_set_data_ind(d->rx, download_data_ind); @@ -12168,7 +12881,7 @@ } d->out_file = download_open(fi->pathname); - if (d->out_file) { + if (d->out_file != NULL) { /* File exists, we'll append the data to it */ if (!fi->use_swarming && (fi->done != d->chunk.start)) { g_message("file '%s' changed size (now %s, but was %s)", @@ -12182,11 +12895,9 @@ download_stop(d, GTA_DL_ERROR, _("Cannot resume: file gone")); return; } else { - int fd = file_create(fi->pathname, O_RDWR, DOWNLOAD_FILE_MODE); - if (fd >= 0) { - d->out_file = file_object_new(fd, fi->pathname, O_RDWR); - } - if (!d->out_file) { + d->out_file = + file_object_create(fi->pathname, O_WRONLY, DOWNLOAD_FILE_MODE); + if (NULL == d->out_file) { const char *error = g_strerror(errno); download_stop(d, GTA_DL_ERROR, _("Cannot write into file: %s"), error); @@ -12201,7 +12912,7 @@ * We're ready to receive. */ - download_mark_active(d, must_ignore); + download_mark_active(d, must_ignore, is_followup); g_assert(s->gdk_tag == 0); g_assert(d->bio == NULL || pipelined_response); @@ -12217,7 +12928,7 @@ if (s->pos > 0) { size_t n = s->pos; - + s->pos = 0; download_write(d, s->buf, n, pipelined_response); fi->recv_amount += n; @@ -12234,16 +12945,17 @@ download_check(d); header = io_header(d->io_opaque); - download_request(d, header, FALSE); + download_reply(d, header, FALSE); } /** * Read callback for file data from the RX stack. */ -static gboolean +static bool download_read(struct download *d, pmsg_t *mb) { fileinfo_t *fi; + int received; download_check(d); socket_check(d->socket); @@ -12304,7 +13016,9 @@ } } - fi->recv_amount += pmsg_size(mb); + received = pmsg_size(mb); + fi->recv_amount += received; + d->downloaded += received; buffers_add_read(d, mb); /* mb will be kept and freed as needed */ d->last_update = tm_time(); @@ -12325,7 +13039,7 @@ * Read callback for file data from the RX stack, used when we ignore those * data after a failed resuming check. */ -static gboolean +static bool download_ignore_data(struct download *d, pmsg_t *mb) { download_check(d); @@ -12365,7 +13079,7 @@ if (d->pos >= d->chunk.end) { fileinfo_t *fi = d->file_info; - gboolean pipelining = download_pipelining(d); + bool pipelining = download_pipelining(d); /* * We finished our request, go on with a new one, hoping it will @@ -12433,14 +13147,9 @@ /* * Now prepare to read the status line and the headers. - * XXX separate this to swallow 100 continuations? */ - g_assert(d->io_opaque == NULL); - - io_get_header(d, &d->io_opaque, - bsched_in_select_by_addr(d->socket->addr), d->socket, IO_SAVE_FIRST, - call_download_request, download_start_reading, &download_io_error); + download_wait_reply(d); } /** @@ -12448,7 +13157,7 @@ * sending the HTTP request. */ static void -download_write_request(gpointer data, int unused_source, inputevt_cond_t cond) +download_write_request(void *data, int unused_source, inputevt_cond_t cond) { struct download *d = data; struct gnutella_socket *s; @@ -12563,10 +13272,11 @@ struct dl_chunk *req = NULL; download_check(d); - s = d->socket; - g_assert(s != NULL); + s = d->socket; fi = d->file_info; + + socket_check(s); file_info_check(fi); g_assert(fi->lifecount > 0); g_assert(fi->lifecount <= fi->refcount); @@ -12583,7 +13293,7 @@ * the pipelined request may have been incompletely sent (in the * GTA_DL_PIPE_SENDING state). In that case, we act as if we had just * selected a new request to send and move the download to the - * GTA_DL_REQ_SENDING state so that it continues to wait for the full + * GTA_DL_REQ_SENDING state so that it continues to wait for the full * request flush to the server. * * Or the second time the request can be in the GTA_DL_PIPE_SENT state, @@ -12622,6 +13332,18 @@ d->req = dp->req; /* Currently pending request */ dp->req = NULL; /* Transferred to the download now */ } + + /* + * Since we went this far, assume the server supports pipelining. + * + * Some broken servers will close the connection as soon as they + * receive extra data on the HTTP socket (the pipelined request) + * and this is detected by download_rx_error() now. + * --RAM, 2012-12-09 + */ + + d->server->attrs |= DLS_A_PIPELINING; + /* * Before discarding the pipeline structure (because we're now * going to process the reply to the pipelined request soon), @@ -12632,6 +13354,7 @@ * A NULL pipeline structure will signal download_request_sent() * that it can parse the HTTP reply. */ + download_pipeline_read(d); download_pipeline_free_null(&d->pipeline); if (GTA_DL_PIPE_SENDING == status) @@ -12640,8 +13363,8 @@ goto fully_sent; } - g_error("impossible state %d for HTTP pipelined request of \"%s\"", - dp->status, download_basename(d)); + g_error("%s(): impossible state %d of HTTP pipelined " + "request for \"%s\"", G_STRFUNC, dp->status, download_basename(d)); } else { req = &d->chunk; } @@ -12665,11 +13388,18 @@ /* * If we're swarming, pick a free chunk. * (will set d->chunk.start and d->chunk.overlap). + * + * We combine use_swarming + file_size_known because when the file size + * is not known, we only know to request the trailing part. For the upper + * file part, we cannot swarm obviously since we do not know when the file + * will end. For lower (inner) parts that could be missing or have been + * invalidated for some reason, we could one day support swarming, but + * it remains to be determined that this is useful and will happpen: we + * have no reason to invalidate inner parts (no TTH or the file size would + * necessarily be known). */ - if (fi->use_swarming) { - g_assert(fi->file_size_known); - + if (fi->use_swarming && fi->file_size_known) { /* * PFSP -- client side * @@ -12681,14 +13411,16 @@ d->flags &= ~DL_F_CHUNK_CHOSEN; else { if (NULL == d->ranges || !download_pick_available(d, &d->chunk)) { - http_range_free(d->ranges); /* May have changed on server */ - d->ranges = NULL; /* Request normally */ + /* + * Ranges may have changed on server, attempt to grab + * any chunk, regardless of what we can think is available. + */ if (!download_pick_chunk(d, &d->chunk, TRUE)) return; } } - } else if (!fi->file_size_known) { + } else { /* XXX -- revisit this encapsulation violation after 0.96 -- RAM */ /* XXX (when filesize is not known, fileinfo should handle this) */ d->chunk.start = fi->done; /* XXX no overlapping here */ @@ -12745,21 +13477,21 @@ char *escaped_uri; escaped_uri = url_fix_escape(d->uri); - rw = gm_snprintf(request_buf, maxsize, + rw = str_bprintf(request_buf, maxsize, "%s %s HTTP/1.1\r\n", method, escaped_uri); if (escaped_uri != d->uri) { HFREE_NULL(escaped_uri); } } else if (sha1) { - rw = gm_snprintf(request_buf, maxsize, + rw = str_bprintf(request_buf, maxsize, "%s /uri-res/N2R?urn:sha1:%s HTTP/1.1\r\n", method, sha1_base32(sha1)); } else { char *escaped = url_escape(d->file_name); - rw = gm_snprintf(request_buf, maxsize, + rw = str_bprintf(request_buf, maxsize, "%s /get/%lu/%s HTTP/1.1\r\n", - method, (gulong) d->record_index, escaped); + method, (ulong) d->record_index, escaped); if (escaped != d->file_name) { HFREE_NULL(escaped); @@ -12776,18 +13508,35 @@ return; } - rw += gm_snprintf(&request_bufrw, maxsize - rw, - "Host: %s\r\n" - "User-Agent: %s\r\n", + /* + * When sending a follow-up request to a GTKG server, we do not need + * to include the User-Agent string again. Other vendors do require + * the field, unfortunately. + * --RAM, 2012-11-19 + */ + + if ( + !d->keep_alive || + !is_strprefix(download_vendor_str(d), "gtk-gnutella/") + ) { + rw += str_bprintf(&request_bufrw, maxsize - rw, + "User-Agent: %s\r\n", version_string); + } + + rw += str_bprintf(&request_bufrw, maxsize - rw, + "Host: %s\r\n", d->server->hostname ? d->server->hostname - : host_addr_port_to_string(download_addr(d), download_port(d)), - version_string); + : host_addr_port_to_string(download_addr(d), download_port(d))); - if (d->server->attrs & DLS_A_FAKE_G2) { - rw += gm_snprintf(&request_bufrw, maxsize - rw, + if (d->server->attrs & (DLS_A_FAKE_G2 | DLS_A_G2_ONLY)) { + rw += str_bprintf(&request_bufrw, maxsize - rw, "X-Features: g2/1.0\r\n"); - } else { + } else if (!d->keep_alive) { /* Not a follow-up HTTP request */ + /* + * We never send X-Features or X-Token on follow-up requests. + */ + header_features_generate(FEATURES_DOWNLOADS, request_buf, maxsize, &rw); @@ -12796,24 +13545,49 @@ * not a Gnutella peer, unless it's a THEX or browse request. */ if (!d->uri || (d->flags & (DL_F_THEX | DL_F_BROWSE))) { - rw += gm_snprintf(&request_bufrw, maxsize - rw, + rw += str_bprintf(&request_bufrw, maxsize - rw, "X-Token: %s\r\n", tok_version()); } } if (d->flags & DL_F_BROWSE) { - rw += gm_snprintf(&request_bufrw, maxsize - rw, + rw += str_bprintf(&request_bufrw, maxsize - rw, + (d->server->attrs & (DLS_A_FAKE_G2 | DLS_A_G2_ONLY)) ? + "Accept: application/x-gnutella2\r\n" : "Accept: application/x-gnutella-packets\r\n"); } if (d->flags & DL_F_THEX) { - rw += gm_snprintf(&request_bufrw, maxsize - rw, + rw += str_bprintf(&request_bufrw, maxsize - rw, "Accept: application/dime\r\n"); } - rw += gm_snprintf(&request_bufrw, maxsize - rw, + rw += str_bprintf(&request_bufrw, maxsize - rw, "Accept-Encoding: deflate\r\n"); /* + * If we support TLS and the socket was not established on top of TLS, + * we can propose a TLS upgrade if this is the first request sent to + * the server. See RFC-2817 for the upgrade protocol details. + * + * The check for DLS_A_NO_TLS_UPGRD is to avoid us proposing an upgrade + * if we already know that server is not supporting TLS (it does not + * advertise the feature in its X-Features) or if a previous upgrade + * attempt failed in this session. + */ + + if ( + 0 == (d->server->attrs & DLS_A_NO_TLS_UPGRD) && + !d->keep_alive && + tls_enabled() && + !socket_uses_tls(d->socket) + ) { + rw += str_bprintf(&request_bufrw, maxsize - rw, + "Upgrade: TLS/1.0\r\nConnection: Upgrade\r\n"); + + d->flags |= DL_F_TLS_PROPOSED; + } + + /* * Add X-Queue / X-Queued information into the header */ parq_download_add_header(request_buf, maxsize, &rw, d); @@ -12838,7 +13612,7 @@ if (req->size != download_filesize(d)) { filesize_t start = req->start - req->overlap; - rw += gm_snprintf(&request_bufrw, maxsize - rw, + rw += str_bprintf(&request_bufrw, maxsize - rw, "Range: bytes=%s-%s\r\n", uint64_to_string(start), uint64_to_string2(req->end - 1)); } @@ -12848,7 +13622,7 @@ req->end = fi->file_size_known ? download_filesize(d) : (filesize_t) -1; if (req->start > req->overlap) - rw += gm_snprintf(&request_bufrw, maxsize - rw, + rw += str_bprintf(&request_bufrw, maxsize - rw, "Range: bytes=%s-\r\n", uint64_to_string(req->start - req->overlap)); } @@ -12869,7 +13643,7 @@ */ if (!download_is_special(d) && !(d->server->attrs & DLS_A_FAKE_G2)) { - rw += gm_snprintf(&request_bufrw, maxsize - rw, + rw += str_bprintf(&request_bufrw, maxsize - rw, "X-Downloaded: %s\r\n", uint64_to_string(download_filedone(d))); } @@ -12881,7 +13655,8 @@ if ( GNET_PROPERTY(is_firewalled) && - !(d->server->attrs & (DLS_A_MINIMAL_HTTP | DLS_A_FAKE_G2)) + !(d->server->attrs & + (DLS_A_MINIMAL_HTTP | DLS_A_G2_ONLY | DLS_A_FAKE_G2)) ) { rw += node_http_fw_node_info_add( @@ -12920,7 +13695,7 @@ altloc_size = maxsize; altloc_size -= MIN(altloc_size, rw); altloc_size -= MIN(altloc_size, sha1_room); - + /* * If we're short on HTTP output bandwidth, limit the size of * the alt-locs we send and don't provide our fileinfo, so that @@ -12973,9 +13748,15 @@ if (wmesh) { g_assert(sha1); - rw += gm_snprintf(&request_bufrw, maxsize - rw, - "X-Gnutella-Content-URN: urn:sha1:%s\r\n", - sha1_base32(sha1)); + if (d->server->attrs & (DLS_A_FAKE_G2 | DLS_A_G2_ONLY)) { + rw += str_bprintf(&request_bufrw, maxsize - rw, + "X-Content-URN: urn:sha1:%s\r\n", + sha1_base32(sha1)); + } else { + rw += str_bprintf(&request_bufrw, maxsize - rw, + "X-Gnutella-Content-URN: urn:sha1:%s\r\n", + sha1_base32(sha1)); + } } } @@ -12985,7 +13766,7 @@ g_assert(rw + 3U <= sizeof request_buf); /* Has room for final "\r\n" */ - rw += gm_snprintf(&request_bufrw, sizeof request_buf - rw, "\r\n"); + rw += str_bprintf(&request_bufrw, sizeof request_buf - rw, "\r\n"); /* * Send the HTTP Request @@ -13029,7 +13810,7 @@ g_message("partial HTTP %s write to %s: wrote %u out of %u bytes", download_pipelining(d) ? "pipelined request" : "request", host_addr_port_to_string(download_addr(d), download_port(d)), - (guint) sent, (guint) rw); + (uint) sent, (uint) rw); if (download_pipelining(d)) { g_assert(NULL == d->pipeline->req); @@ -13048,15 +13829,18 @@ socket_evt_set(s, INPUT_EVENT_WX, download_write_request, d); return; } else if (GNET_PROPERTY(download_trace) & SOCK_TRACE_OUT) { - g_debug("----Sent Request (%s%s%s%s%s%s) to %s (%u bytes):", + g_debug("----Sent Request (%s%s%s%s%s%s%s) to %s (%u bytes):", download_pipelining(d) ? "pipelined " : "", d->keep_alive ? "follow-up" : "initial", (d->server->attrs & DLS_A_NO_HTTP_1_1) ? "" : ", HTTP/1.1", (d->server->attrs & DLS_A_PUSH_IGN) ? ", ign-push" : "", (d->server->attrs & DLS_A_MINIMAL_HTTP) ? ", minimal" : "", - (d->server->attrs & DLS_A_FAKE_G2) ? ", g2" : "", + DLS_A_G2_ONLY == + (d->server->attrs & (DLS_A_FAKE_G2 | DLS_A_G2_ONLY)) ? + ", g2" : "", + (d->server->attrs & DLS_A_FAKE_G2) ? ", fake-g2" : "", host_addr_port_to_string(download_addr(d), download_port(d)), - (guint) rw); + (uint) rw); dump_string(stderr, request_buf, rw, "----"); } @@ -13071,14 +13855,30 @@ download_connected(struct download *d) { struct gnutella_socket *s; + time_t now = tm_time(); + struct dl_server *server; download_check(d); - dl_server_valid(d->server); + g_assert(dl_server_valid(d->server)); socket_check(d->socket); g_assert(!download_pipelining(d)); /* Just got connected */ - d->server->last_connect = tm_time(); + /* + * Entropy harvesting... + */ + + server = d->server; s = d->socket; + + { + time_delta_t e; /* elapsed time since last connection to server */ + host_addr_t addr = server->key->addr; + + e = delta_time(now, server->last_connect); + entropy_harvest_small(VARLEN(s->port), VARLEN(addr), VARLEN(e), NULL); + } + + server->last_connect = now; socket_nodelay(s, TRUE); /* @@ -13086,12 +13886,12 @@ */ if (d->flags & DL_F_DNS_LOOKUP) { - if (!host_addr_equal(download_addr(d), s->addr)) { + if (!host_addr_equiv(download_addr(d), s->addr)) { if (GNET_PROPERTY(download_debug)) { g_debug("DNS lookup revealed server %s moved to %s", - server_host_info(d->server), host_addr_to_string(s->addr)); + server_host_info(server), host_addr_to_string(s->addr)); } - change_server_addr(d->server, s->addr, download_port(d)); + change_server_addr(server, s->addr, download_port(d)); } } @@ -13119,14 +13919,6 @@ return; } - /* - * Free up the s->getline structure which holds the GIV line. - */ - - g_assert(d->socket->getline); - getline_free(d->socket->getline); - d->socket->getline = NULL; - io_free(d->io_opaque); download_send_request(d); /* Will install new I/O data */ } @@ -13138,9 +13930,9 @@ * @returns the selected download, or NULL if we could not find one. */ static struct download * -select_push_download(GSList *servers) +select_push_download(pslist_t *servers) { - GSList *sl; + pslist_t *sl; time_t now = tm_time(); struct download *d = NULL; int found = 0; /* No a boolean to trace where it was found from */ @@ -13155,7 +13947,7 @@ * --RAM, 19/07/2003 */ - for (sl = servers; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(servers, sl) { struct dl_server *server = sl->data; list_t *prepare; list_iter_t *iter; @@ -13286,7 +14078,7 @@ struct server_select { const struct guid *guid; /* The GUID that must match */ host_addr_t addr; /* The IP address that must match */ - GSList *servers; /* List of servers matching criteria */ + pslist_t *servers; /* List of servers matching criteria */ int count; /* Amount of servers inserted */ }; @@ -13297,20 +14089,21 @@ * This routine is a hash table iterator callback. */ static void -select_matching_servers(gpointer key, gpointer value, gpointer user) +select_matching_servers(void *value, void *user) { - const struct dl_key *skey = key; + const struct dl_key *skey; struct dl_server *server = value; struct server_select *ctx = user; g_assert(dl_server_valid(server)); - g_assert(server->key == skey); + + skey = server->key; if ( guid_eq(skey->guid, ctx->guid) || - host_addr_equal(skey->addr, ctx->addr) + host_addr_equiv(skey->addr, ctx->addr) ) { - ctx->servers = g_slist_prepend(ctx->servers, server); + ctx->servers = pslist_prepend(ctx->servers, server); ctx->count++; } } @@ -13322,9 +14115,9 @@ * @return a list a servers matching, with `count' being updated with the * amount of matching servers we found. - * @note It is up to the caller to g_slist_free() the returned list. + * @note It is up to the caller to pslist_free() the returned list. */ -static GSList * +static pslist_t * select_servers(const struct guid *guid, const host_addr_t addr, int *count) { struct server_select ctx; @@ -13334,7 +14127,7 @@ ctx.servers = NULL; ctx.count = 0; - g_hash_table_foreach(dl_by_host, select_matching_servers, &ctx); + hikset_foreach(dl_by_host, select_matching_servers, &ctx); *count = ctx.count; return ctx.servers; @@ -13356,22 +14149,22 @@ * server kept is the one with the non-blank GUID and it is set with the * proper address (taken from the line with the blank GUID). * - * @return a new GSList with the blank GUID removed, or the initial list + * @return a new pslist_t with the blank GUID removed, or the initial list * if we could not perform the merging. */ -static GSList * -merge_push_servers(GSList *servers, const struct guid *guid) +static pslist_t * +merge_push_servers(pslist_t *servers, const struct guid *guid) { struct dl_server *serv2; struct dl_server *duplicate; /* blank GUID */ struct dl_server *server; /* non-blank GUID */ host_addr_t addr; - guint16 port; + uint16 port; - g_assert(2 == g_slist_length(servers)); + g_assert(2 == pslist_length(servers)); - serv0 = g_slist_nth_data(servers, 0); - serv1 = g_slist_nth_data(servers, 1); + serv0 = pslist_nth_data(servers, 0); + serv1 = pslist_nth_data(servers, 1); if (serv0 == NULL || serv1 == NULL) return servers; @@ -13397,16 +14190,15 @@ * We can merge... */ - addr = host_address_is_usable(duplicate->key->addr) ? + addr = host_address_is_usable(duplicate->key->addr) ? duplicate->key->addr : server->key->addr; port = port_is_valid(duplicate->key->port) ? duplicate->key->port : server->key->port; if (GNET_PROPERTY(download_debug)) { - g_debug("merging servers: GUID %s at %s into GUID %s at %s" - " (using %s:%u)", - guid_hex_str(duplicate->key->guid), + g_debug("%s(): GUID %s at %s into GUID %s at %s (using %s:%u)", + G_STRFUNC, guid_hex_str(duplicate->key->guid), host_addr_port_to_string( duplicate->key->addr, duplicate->key->port), guid_to_string(server->key->guid), @@ -13416,9 +14208,9 @@ download_reparent_all(duplicate, server); change_server_addr(server, addr, port); - g_slist_free(servers); + pslist_free(servers); - return g_slist_prepend(NULL, server); + return pslist_prepend(NULL, server); } /** @@ -13426,14 +14218,14 @@ * * @return new list of (hopefully merged) servers. */ -static GSList * -merge_servers(GSList *servers, const struct guid *guid) +static pslist_t * +merge_servers(pslist_t *servers, const struct guid *guid) { - GSList *sided = NULL; + pslist_t *sided = NULL; - while (g_slist_length(servers) >= 2) { - GSList *sl; - GSList *tuple = NULL; + while (pslist_length(servers) >= 2) { + pslist_t *sl; + pslist_t *tuple = NULL; struct dl_server *non_blank = NULL; /* @@ -13441,12 +14233,12 @@ * then no further merging is possible. */ - for (sl = servers; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(servers, sl) { struct dl_server *serv = sl->data; if (!guid_is_blank(serv->key->guid)) { non_blank = serv; - servers = g_slist_remove(servers, non_blank); + servers = pslist_remove(servers, non_blank); break; } } @@ -13460,16 +14252,16 @@ */ tuple = servers; - servers = g_slist_remove_link(servers, servers); - tuple = g_slist_prepend(tuple, non_blank); + servers = pslist_remove_link(servers, servers); + tuple = pslist_prepend(tuple, non_blank); - g_assert(2 == g_slist_length(tuple)); + g_assert(2 == pslist_length(tuple)); tuple = merge_push_servers(tuple, guid); - if (1 == g_slist_length(tuple)) { - servers = g_slist_prepend(servers, tuple->data); - g_slist_free(tuple); + if (1 == pslist_length(tuple)) { + servers = pslist_prepend(servers, tuple->data); + pslist_free(tuple); continue; } @@ -13480,49 +14272,82 @@ * the other one to re-inject it later. */ - g_assert(2 == g_slist_length(tuple)); + g_assert(2 == pslist_length(tuple)); - tuple = g_slist_remove(tuple, non_blank); + tuple = pslist_remove(tuple, non_blank); - g_assert(1 == g_slist_length(tuple)); + g_assert(1 == pslist_length(tuple)); - sided = g_slist_prepend(sided, tuple->data); - g_slist_free(tuple); - servers = g_slist_prepend(servers, non_blank); + sided = pslist_prepend(sided, tuple->data); + pslist_free(tuple); + servers = pslist_prepend(servers, non_blank); } /* * Bring back the un-mergeable servers we may have put aside. */ - return g_slist_concat(servers, sided); + return pslist_concat(servers, sided); } /** - * @return FALSE on failure, TRUE if the GIV was successfully parsed. + * Parse a GIV (Gnutella push callback) or PUSH (G2 push callback) line. + * + * @param line the GIV or PUSH line we got + * @param hex_guid array of 33 bytes where the hexadecimal GUID is extracted + * @param size the length of the hex_guid buffer + * + * @return FALSE on failure, TRUE if the GIV / PUSH was successfully parsed. */ -static gboolean +static bool parse_giv(const char *line, char *hex_guid, size_t size) { - static const guint hex_guid_len = 32; + static const uint hex_guid_len = 32; const char *endptr; - guint i; + uint i; int error; + bool g2 = FALSE; /* Assume it's a Gnutella GIV line */ g_return_val_if_fail(line, FALSE); g_return_val_if_fail(hex_guid, FALSE); g_return_val_if_fail(size > hex_guid_len, FALSE); endptr = is_strprefix(line, "GIV "); - if (!endptr) - return FALSE; + if (NULL == endptr) { + endptr = is_strprefix(line, "PUSH "); + if (NULL == endptr) + return FALSE; + g2 = TRUE; /* A G2 PUSH line */ + } - /* A file index must be given but we don't care about its value. */ - (void) parse_uint32(endptr, &endptr, 10, &error); - if (error || ':' != *endptr) - return FALSE; + /* + * A Gnutella GIV line has the following format: + * + * GIV <index>:<hexadecimal GUID>/\n\n + * + * A G2 PUSH line has the following format: + * + * PUSH guid:<hexadecimal GUID>\r\n\r\n + */ + + if (g2) { + /* Skip the guid: part */ + endptr = skip_ascii_spaces(endptr); + endptr = is_strprefix(endptr, "guid:"); + if (NULL == endptr) + return FALSE; + } else { + /* A file index must be given but we don't care about its value. */ + (void) parse_uint32(endptr, &endptr, 10, &error); + if (error || ':' != *endptr) + return FALSE; + endptr++; /* Skip the ':' separator */ + } + + /* + * Now extract the 32 bytes of the hexadecimal GUID. + */ - endptr++; for (i = 0; i < hex_guid_len; i++) { char c = *endptr++; @@ -13532,14 +14357,14 @@ } hex_guidi = '\0'; - return '/' == *endptr; + return (g2 ? '\0' : '/') == *endptr; } /** * Initiate download on the remotely initiated connection. * - * This is called when an incoming "GIV" request is received in answer to - * some of our pushes. + * This is called when an incoming "GIV" or "PUSH" request is received in + * answer to some of our pushes. */ void download_push_ack(struct gnutella_socket *s) @@ -13548,14 +14373,14 @@ const char *giv; char hex_guid33; /* The hexadecimal GUID */ struct guid guid; /* The decoded (binary) GUID */ - GSList *servers; /* Potential targets for the download */ + pslist_t *servers; /* Potential targets for the download */ int count; /* Amount of potential targets found */ socket_check(s); g_assert(s->getline); giv = getline_str(s->getline); - gnet_stats_count_general(GNR_GIV_CALLBACKS, 1); + gnet_stats_inc_general(GNR_GIV_CALLBACKS); if (GNET_PROPERTY(download_trace) & SOCK_TRACE_IN) { g_debug("----Got GIV from %s:", host_addr_to_string(s->addr)); @@ -13567,10 +14392,12 @@ * HTTP request, eventually. */ - if (hostiles_check(s->addr)) { + if (hostiles_is_bad(s->addr)) { if (GNET_PROPERTY(download_debug) || GNET_PROPERTY(socket_debug)) { - g_warning("discarding GIV string \"%s\" from hostile %s", - giv, host_addr_to_string(s->addr)); + hostiles_flags_t flags = hostiles_check(s->addr); + g_warning("discarding GIV string \"%s\" from hostile %s (%s)", + giv, host_addr_to_string(s->addr), + hostiles_flags_to_string(flags)); } goto discard; } @@ -13585,7 +14412,7 @@ /* * To find out which download this is, we have to parse the incoming - * GIV request, which is stored in "s->getline". + * GIV / PUSH request, which is stored in "s->getline". */ if (!parse_giv(giv, hex_guid, sizeof hex_guid)) { @@ -13599,8 +14426,8 @@ */ if (!hex_to_guid(hex_guid, &guid)) { - g_warning("discarding GIV with malformed GUID %s from %s", - hex_guid, host_addr_to_string(s->addr)); + g_warning("discarding GIV \"%s\" with malformed GUID %s from %s", + giv, hex_guid, host_addr_to_string(s->addr)); goto discard; } @@ -13627,13 +14454,13 @@ break; default: if (GNET_PROPERTY(download_debug)) { - GSList *sl; - guint i; + pslist_t *sl; + uint i; g_warning("found %d possible targets for GIV from GUID %s at %s", count, hex_guid, host_addr_to_string(s->addr)); - for (sl = servers, i = 0; sl; sl = g_slist_next(sl), i++) { + for (sl = servers, i = 0; sl; sl = pslist_next(sl), i++) { struct dl_server *serv = sl->data; g_debug(" #%u is GUID %s at %s <%s>", i + 1, guid_hex_str(serv->key->guid), @@ -13649,7 +14476,7 @@ } d = select_push_download(servers); - g_slist_free(servers); + pslist_free(servers); if (d) { download_check(d); @@ -13666,7 +14493,7 @@ giv, download_basename(d), download_host_info(d)); if (d->io_opaque) { - g_warning("d->io_opaque is already set!"); + g_carp("%s(): d->io_opaque is already set!", G_STRFUNC); goto discard; } @@ -13688,8 +14515,8 @@ d->got_giv = TRUE; d->last_update = tm_time(); - d->socket = s; - s->resource.download = d; + + download_attach_socket(d, s); /* * Since we got a GIV, we now know the remote IP of the host and its GUID. @@ -13697,28 +14524,32 @@ g_assert(!host_addr_is_unspecified(s->addr)); - if (!host_addr_equal(download_addr(d), s->addr)) + if (!host_addr_equiv(download_addr(d), s->addr)) change_server_addr(d->server, s->addr, download_port(d)); download_found_server(&guid, s->addr, download_port(d)); - g_assert(host_addr_equal(download_addr(d), s->addr)); + g_assert(host_addr_equiv(download_addr(d), s->addr)); fi_src_info_changed(d); /* - * Now we have to read that trailing "\n" which comes right afterwards. + * Now we have to read that trailing "\n" (for Gnutella GIV) or "\r\n" + * (for G2 PUSH) which comes right afterwards. + * + * We can use the same code because getline_read() parses lines ending with + * a single '\n' and will swallow any preceding '\r' character. */ g_assert(NULL == d->io_opaque); + io_get_header(d, &d->io_opaque, bsched_in_select_by_addr(s->addr), s, IO_SINGLE_LINE, call_download_push_ready, NULL, &download_io_error); return; discard: - gnet_stats_count_general(GNR_GIV_DISCARDED, 1); - g_assert(s->resource.download == NULL); /* Hence socket_free() below */ + gnet_stats_inc_general(GNR_GIV_DISCARDED); socket_free_null(&s); } @@ -13729,12 +14560,12 @@ * @returns NULL if none, the download we found otherwise. */ struct download * -download_find_waiting_unparq(const host_addr_t addr, guint16 port) +download_find_waiting_unparq(const host_addr_t addr, uint16 port) { struct dl_server *server = get_server(&blank_guid, addr, port, FALSE); list_iter_t *iter; struct download *d = NULL; - gboolean found = FALSE; + bool found = FALSE; if (server == NULL) return NULL; @@ -13769,7 +14600,7 @@ static const char download_file = "downloads"; static const char file_what = "downloads"; /**< What is persisted to file */ -static gboolean retrieving = FALSE; +static bool retrieving = FALSE; static char * download_build_magnet(const struct download *d) @@ -13777,7 +14608,7 @@ const fileinfo_t *fi; char *url; char *dl_url; - + download_check(d); fi = d->file_info; @@ -13791,7 +14622,7 @@ const struct tth *tth; const char *parq_id; const char *vendor; - + magnet = magnet_resource_new(); /* The filename used for the magnet must be UTF-8 encoded */ @@ -13829,6 +14660,7 @@ } magnet_set_dht(magnet, booleanize(d->server->attrs & DLS_A_DHT_PUBLISH)); + magnet_set_g2(magnet, booleanize(d->server->attrs & DLS_A_G2_ONLY)); magnet_add_source_by_url(magnet, dl_url); G_FREE_NULL(dl_url); url = magnet_to_string(magnet); @@ -13887,7 +14719,7 @@ f = file_config_open_write(file_what, &fp); if (f) { hash_list_iter_t *iter; - + file_config_preamble(f, "Downloads"); iter = hash_list_iterator(sl_downloads); @@ -13942,16 +14774,16 @@ /** * Retrieve stored downloads, saved as magnet URIs. */ -static gboolean +static bool download_retrieve_magnets(FILE *f) { const size_t buffer_size = 64 * 1024; char *buffer = NULL; - gboolean expect_old_format = TRUE; + bool expect_old_format = TRUE; if (f) { - gboolean truncated = FALSE; - guint line = 0; + bool truncated = FALSE; + uint line = 0; buffer = halloc(buffer_size); while (fgets(buffer, buffer_size, f)) { @@ -13977,14 +14809,14 @@ } if (is_strcaseprefix(buffer, "magnet:?")) { - guint created; + uint created; expect_old_format = FALSE; created = download_handle_magnet(buffer); if (GNET_PROPERTY(download_debug)) { g_debug("created %d download%s from %s", - created, created == 1 ? "" : "s", buffer); + created, plural(created), buffer); } } else { g_warning("%s, line %u: Ignored unknown item", @@ -14001,21 +14833,21 @@ { char dl_tmp4096; filesize_t d_size = 0; /* The d_ vars are what we deserialize */ - guint64 size64; + uint64 size64; int error; const char *d_name; host_addr_t d_addr; - guint16 d_port; - guint32 flags; + uint16 d_port; + uint32 flags; char d_hexguid33; char d_hostname256; /* Server hostname */ int recline; /* Record line number */ unsigned line; /* File line number */ struct guid d_guid; struct sha1 sha1; - gboolean has_sha1 = FALSE; + bool has_sha1 = FALSE; int maxlines = -1; - gboolean allow_comments = TRUE; + bool allow_comments = TRUE; char *parq_id = NULL; const char *endptr; struct download *d; @@ -14040,7 +14872,7 @@ line++; if (!file_line_chomp_tail(dl_tmp, sizeof dl_tmp, NULL)) { - g_warning("%s: line %u too long, aborting", G_STRFUNC, line); + g_warning("%s(): line %u too long, aborting", G_STRFUNC, line); break; } @@ -14105,7 +14937,7 @@ } d_size = size64; - if ((guint64) d_size != size64) { + if ((uint64) d_size != size64) { g_warning("%s(): filesize is too large in line #%u: %s", G_STRFUNC, line, dl_tmp); goto out; @@ -14170,7 +15002,7 @@ goto no_sha1; if ( strlen(dl_tmp) != (1+SHA1_BASE32_SIZE) || /* Final "\n" */ - SHA1_RAW_SIZE != base32_decode(sha1.data, sizeof sha1.data, + SHA1_RAW_SIZE != base32_decode(&sha1, sizeof sha1, dl_tmp, SHA1_BASE32_SIZE) ) { g_warning("%s(): bad base32 SHA1 '%32s' at line #%u, ignoring", @@ -14254,7 +15086,7 @@ FILE *f; file_path_set(fp, settings_config_dir(), download_file); - f = file_config_open_read(file_what, fp, G_N_ELEMENTS(fp)); + f = file_config_open_read(file_what, fp, N_ITEMS(fp)); if (f) { retrieving = TRUE; /* Prevent download_store() runs */ @@ -14289,20 +15121,22 @@ * If it was a faked download or has a bad bitprint, we cannot resume. */ - if (d->file_info && fi_has_bad_bitprint(d->file_info)) { + if (fi_has_bad_bitprint(d->file_info)) { g_warning("SHA1 mismatch for \"%s\" but TTH was good, cannot restart", download_basename(d)); + goto pause; } else if (is_faked_download(d)) { g_warning("SHA1 mismatch for \"%s\", and cannot restart download", download_basename(d)); + goto pause; } else { - g_message("SHA1 mismatch for \"%s\", will be restarting download", - download_basename(d)); - file_info_reset(d->file_info); - download_queue(d, _("SHA1 mismatch detected")); + download_restart(d); } + return; + +pause: /* * FIXME: If the download is not paused, the file would be downloaded * over and over again, even if there is just a single known @@ -14328,7 +15162,7 @@ { fileinfo_t *fi; char *dest = NULL; - gboolean common_dir; + bool common_dir; const char *name; filesize_t free_space; @@ -14345,12 +15179,14 @@ name = file_info_readable_filename(fi); + entropy_harvest_many(VARLEN(d), name, strsize(name), VARLEN(fi), NULL); + /* * If the target directory is the same as the source directory, we'll * use the supplied extension and simply rename the file. */ { - gboolean same_dir; + bool same_dir; char *path; /* FIXME: This could be done without copying. */ @@ -14473,13 +15309,16 @@ * Called when file has been moved/renamed with its fileinfo trailer stripped. */ void -download_move_done(struct download *d, const char *pathname, guint elapsed) +download_move_done(struct download *d, const char *pathname, uint elapsed) { fileinfo_t *fi; download_check(d); g_assert(d->status == GTA_DL_MOVING); + entropy_harvest_many(VARLEN(d), pathname, strsize(pathname), + VARLEN(elapsed), NULL); + fi = d->file_info; fi->copy_elapsed = elapsed; fi->copied = fi->size; @@ -14510,7 +15349,7 @@ download_moved_with_bad_sha1(d); } file_info_changed(fi); - fi_src_status_changed(d); + fi_src_status_changed(d); } /** @@ -14570,14 +15409,14 @@ g_assert(d->list_idx == DL_LIST_STOPPED); download_set_status(d, GTA_DL_VERIFYING); - gnet_stats_count_general(GRN_SHA1_VERIFICATIONS, 1); + gnet_stats_inc_general(GNR_SHA1_VERIFICATIONS); } /** * Called to register the current verification progress. */ static void -download_verify_sha1_progress(struct download *d, guint32 hashed) +download_verify_sha1_progress(struct download *d, uint32 hashed) { download_check(d); g_assert(d->status == GTA_DL_VERIFYING); @@ -14617,7 +15456,7 @@ */ static void download_verify_sha1_done(struct download *d, - const struct sha1 *sha1, guint elapsed) + const struct sha1 *sha1, uint elapsed) { fileinfo_t *fi; @@ -14627,6 +15466,13 @@ fi = d->file_info; file_info_check(fi); + + entropy_harvest_many(VARLEN(elapsed), PTRLEN(sha1), + /* include the TTH value if not NULL, otherwise the download variable */ + fi->tth != NULL ? (void *) fi->tth : (void *) &d, + fi->tth != NULL ? sizeof *fi->tth : sizeof d, + NULL); + fi->cha1 = atom_sha1_get(sha1); fi->vrfy_elapsed = elapsed; fi->vrfy_hashed = fi->size; @@ -14689,7 +15535,7 @@ download_verify_status_unknown(d, "SHA1"); } -static gboolean +static bool download_verify_sha1_callback(const struct verify *ctx, enum verify_status status, void *user_data) { @@ -14730,7 +15576,7 @@ static void download_verify_sha1(struct download *d) { - gboolean inserted; + bool inserted; fileinfo_t *fi; download_check(d); @@ -14742,6 +15588,8 @@ g_assert(!(d->flags & DL_F_SUSPENDED)); g_assert(d->list_idx == DL_LIST_STOPPED); + entropy_harvest_single(VARLEN(d)); + if (FI_F_VERIFYING & fi->flags) /* Already verifying */ return; @@ -14797,14 +15645,14 @@ g_assert(d->list_idx == DL_LIST_STOPPED); download_set_status(d, GTA_DL_VERIFYING); - gnet_stats_count_general(GRN_TTH_VERIFICATIONS, 1); + gnet_stats_inc_general(GNR_TTH_VERIFICATIONS); } /** * Called to register the current verification progress. */ static void -download_verify_tigertree_progress(struct download *d, guint32 hashed) +download_verify_tigertree_progress(struct download *d, uint32 hashed) { download_check(d); g_assert(d->status == GTA_DL_VERIFYING); @@ -14842,10 +15690,12 @@ uint64_to_string(fi->tigertree.slice_size)); } + entropy_harvest_many(VARLEN(d), PTRLEN(leaves), VARLEN(num_leaves), NULL); + if (num_leaves > fi->tigertree.num_leaves) { size_t dst; - nodes = halloc0(num_leaves * sizeof nodes0); + HALLOC0_ARRAY(nodes, num_leaves); dst = num_leaves; do { @@ -14887,12 +15737,12 @@ if (bad_slices > 0) { if (GNET_PROPERTY(tigertree_debug)) { g_warning("TTH tree sweep: %zu/%zu bad slice%s", - bad_slices, num_leaves, 1 == bad_slices ? "" : "s"); + bad_slices, num_leaves, plural(bad_slices)); } } else { if (GNET_PROPERTY(tigertree_debug)) { g_debug("TTH tree sweep: all %zu slice%s okay", - num_leaves, 1 == num_leaves ? "" : "s"); + num_leaves, plural(num_leaves)); } } HFREE_NULL(nodes); @@ -14903,7 +15753,7 @@ */ static void download_verify_tigertree_done(struct download *d, - const struct tth *tth, guint elapsed, + const struct tth *tth, uint elapsed, const struct tth *leaves, size_t num_leaves) { fileinfo_t *fi; @@ -14912,6 +15762,8 @@ g_assert(d->status == GTA_DL_VERIFYING); g_assert(d->list_idx == DL_LIST_STOPPED); + entropy_harvest_many(VARLEN(elapsed), PTRLEN(tth), NULL); + fi = d->file_info; file_info_check(fi); fi->flags &= ~FI_F_VERIFYING; @@ -14928,7 +15780,7 @@ fi->tigertree.num_leaves > 0 ) { /* NOTE: For testing only */ - download_tigertree_sweep(d, leaves, num_leaves); + download_tigertree_sweep(d, leaves, num_leaves); } if (!has_good_sha1(d)) { @@ -14956,6 +15808,7 @@ download_tigertree_sweep(d, leaves, num_leaves); queue_suspend_downloads_with_file(fi, FALSE); + download_restart(d); } else { g_message("TTH unavailable (file=\"%s\")", download_basename(d)); download_verifying_done(d); @@ -14972,7 +15825,7 @@ download_verify_status_unknown(d, "TTH"); } -static gboolean +static bool download_verify_tigertree_callback(const struct verify *ctx, enum verify_status status, void *user_data) { @@ -15035,6 +15888,8 @@ download_pathname(d)); } + entropy_harvest_single(VARLEN(d)); + /* * Even if download was aborted or in error, we have a complete file * anyway, so start verifying its TTH. @@ -15060,7 +15915,7 @@ download_resume_bg_tasks(void) { struct download *next; - GSList *sl, *to_remove = NULL; + pslist_t *sl, *to_remove = NULL; next = hash_list_head(sl_downloads); while (next) { @@ -15141,11 +15996,13 @@ if (has_good_sha1(d)) download_move(d, GNET_PROPERTY(move_file_path), DL_OK_EXT); + else if (fi->tth != NULL) + download_verify_tigertree(d); else download_move(d, GNET_PROPERTY(bad_file_path), DL_BAD_EXT); - + if (!(fi->flags & FI_F_SEEDING)) - to_remove = g_slist_prepend(to_remove, d->file_info); + to_remove = pslist_prepend(to_remove, d->file_info); } } @@ -15153,9 +16010,9 @@ * Remove queued downloads referencing a complete file. */ - for (sl = to_remove; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(to_remove, sl) { fileinfo_t *fi = sl->data; - + file_info_check(fi); /* @@ -15167,7 +16024,7 @@ } } - gm_slist_free_null(&to_remove); + pslist_free_null(&to_remove); /* * Clear the marks. @@ -15213,7 +16070,7 @@ /** * Terminating processing, cleanup data structures. */ -G_GNUC_COLD void +void G_COLD download_close(void) { gcu_download_gui_updates_freeze(); @@ -15236,11 +16093,12 @@ hash_list_free(&sl_downloads); hash_list_free(&sl_unqueued); - gm_hash_table_destroy_null(&dl_by_guid); - gm_hash_table_destroy_null(&dl_by_host); - gm_hash_table_destroy_null(&dl_by_addr); - gm_hash_table_destroy_null(&dl_by_id); - gm_hash_table_destroy_null(&dhl_by_sha1); + aging_destroy(&local_pushes); + htable_free_null(&dl_by_guid); + hikset_free_null(&dl_by_host); + htable_free_null(&dl_by_addr); + hikset_free_null(&dl_by_id); + htable_free_null(&dhl_by_sha1); dualhash_destroy_null(&dl_thex); } @@ -15253,7 +16111,7 @@ const char *host; char *hostp = NULL; host_addr_t addr; - guint16 port; + uint16 port; g_return_val_if_fail(d, NULL); g_return_val_if_fail(uri, NULL); @@ -15276,7 +16134,7 @@ sequence_release(&seq); guid_to_string_buf(download_guid(d), guid_buf, sizeof guid_buf); concat_strings(prefix_buf, sizeof prefix_buf, - "push://", guid_buf, (void *) 0); + "push://", guid_buf, NULL_PTR); prefix = prefix_buf; } else if (0 != port && is_host_addr(addr)) { host = host_port_to_string(download_hostname(d), addr, port); @@ -15288,7 +16146,7 @@ if ('/' == uri0) uri++; - result = g_strconcat(prefix, host, "/", uri, (void *) 0); + result = g_strconcat(prefix, host, "/", uri, NULL_PTR); HFREE_NULL(hostp); @@ -15320,11 +16178,11 @@ concat_strings(uri, sizeof uri, "/uri-res/N2R?", bitprint_to_urn_string(download_get_sha1(d), download_get_tth(d)), - (void *) 0); + NULL_PTR); url = download_url_for_uri(d, uri); } else { char *escaped, *uri; - + escaped = url_escape(d->file_name); uri = h_strdup_printf("/get/%u/%s", d->record_index, escaped); url = download_url_for_uri(d, uri); @@ -15340,9 +16198,9 @@ download_get_hostname(const struct download *d) { static char bufMAX_HOSTLEN + 1024; - gboolean encrypted, inbound, outbound; + bool encrypted, inbound, outbound; host_addr_t addr; - guint port; + uint port; download_check(d); if (is_faked_download(d)) @@ -15368,15 +16226,18 @@ host_addr_port_to_string(addr, port), inbound ? _(", inbound") : "", outbound ? _(", outbound") : "", - encrypted ? ", TLS" : "", + encrypted ? (d->tls_upgraded ? ", +TLS" : ", TLS") : "", + (d->server->attrs & DLS_A_NO_PIPELINE) ? _(", no-pipeline") : "", (d->server->attrs & DLS_A_BANNING) ? _(", banning") : "", - (d->server->attrs & (DLS_A_G2_ONLY | DLS_A_FAKE_G2)) ? _(", g2") : "", + (d->server->attrs & (DLS_A_G2_ONLY | DLS_A_FAKE_G2)) == DLS_A_G2_ONLY ? + _(", g2") : "", + (d->server->attrs & DLS_A_FAKE_G2) ? _(", fake-g2") : "", (d->server->attrs & DLS_A_FAKED_VENDOR) ? _(", vendor?") : "", d->server->hostname ? ", (" : "", d->server->hostname ? d->server->hostname : "", d->server->hostname ? ")" : "", - (void *) 0); - + NULL_PTR); + return buf; } @@ -15395,11 +16256,11 @@ * Checks unqueued list to see if there are any downloads that are finished and * therefore ready to be cleared. */ -gboolean +bool download_something_to_clear(void) { hash_list_iter_t *iter; - gboolean found = FALSE; + bool found = FALSE; iter = hash_list_iterator(sl_unqueued); @@ -15447,8 +16308,8 @@ */ struct download * download_browse_start(const char *hostname, - host_addr_t addr, guint16 port, const struct guid *guid, - const gnet_host_vec_t *proxies, gnet_search_t search, guint32 flags) + host_addr_t addr, uint16 port, const struct guid *guid, + const gnet_host_vec_t *proxies, gnet_search_t search, uint32 flags) { struct download *d; fileinfo_t *fi; @@ -15458,8 +16319,13 @@ { char *dname; - dname = str_cmsg(_("<Browse Host %s>"), - host_port_to_string(hostname, addr, port)); + if (SOCK_F_G2 & flags) { + dname = str_cmsg(_("<Browse G2 Host %s>"), + host_port_to_string(hostname, addr, port)); + } else { + dname = str_cmsg(_("<Browse Host %s>"), + host_port_to_string(hostname, addr, port)); + } fi = file_info_get_transient(dname); HFREE_NULL(dname); @@ -15498,7 +16364,7 @@ const struct tth *tth, *leaves; size_t num_leaves; fileinfo_t *fi; - gboolean cancel_all = FALSE; + bool cancel_all = FALSE; download_check(d); g_return_if_fail(d->thex); @@ -15519,7 +16385,7 @@ if (NULL == fi) { if (GNET_PROPERTY(tigertree_debug)) { g_debug("TTH discarding tigertree data from %s: No more download", - download_host_info(d)); + download_host_info(d)); } cancel_all = TRUE; goto finish; @@ -15548,7 +16414,7 @@ download_remove_all_thex(sha1, d); } } - + /** * Create special non-persisted download that will request THEX data from the * remote host. @@ -15570,10 +16436,10 @@ filesize_t filesize, const char *hostname, host_addr_t addr, - guint16 port, + uint16 port, const struct guid *guid, const gnet_host_vec_t *proxies, - guint32 flags) + uint32 flags) { struct download *d; fileinfo_t *fi; @@ -15587,7 +16453,7 @@ char *dname; fi = file_info_by_sha1(sha1); - + dname = str_cmsg(_("<THEX data for %s>"), fi ? filepath_basename(fi->pathname) : bitprint_to_urn_string(sha1, tth)); @@ -15700,7 +16566,7 @@ download_rx_done(struct download *d) { fileinfo_t *fi; - gboolean was_receiving; + bool was_receiving; download_check(d); fi = d->file_info; @@ -15749,14 +16615,36 @@ download_data_received(struct download *d, ssize_t received) { fileinfo_t *fi; + filesize_t upper; download_check(d); fi = d->file_info; file_info_check(fi); - file_info_update(d, d->pos, d->pos + received, DL_CHUNK_DONE); + upper = d->pos + received; + + /* + * If we're receiving "chunked" data, we do not know the size of what + * we'll be receiving in advance, so we need to dynamically extend + * the fileinfo. + */ + + if (fi->size < upper) { + if (fi->file_size_known) { + file_info_size_unknown(fi); + g_warning("%s(): receiving extra data for \"%s\" from %s: " + "thought size was %s bytes, receiving %zu byte%s at %s -> %s", + G_STRFUNC, fi->pathname, download_host_info(d), + filesize_to_string(fi->size), received, plural(received), + filesize_to_string2(d->pos), + filesize_to_string3(upper)); + } + file_info_resize(fi, upper); + } + + file_info_update(d, d->pos, upper, DL_CHUNK_DONE); - d->pos += received; + d->pos = upper; d->last_update = tm_time(); fi->recv_amount += received; } @@ -15781,26 +16669,26 @@ /** * Create a download based on the information from the magnet URI. */ -guint +uint download_handle_magnet(const char *url) { struct magnet_resource *res; - guint n_downloads = 0; + uint n_downloads = 0; const char *error_str; res = magnet_parse(url, &error_str); if (res) { char *filename; /* strdup */ - GSList *sl; + pslist_t *sl; - filename = g_strdup(res->display_name); + filename = h_strdup(res->display_name); if (!filename) { - for (sl = res->sources; sl != NULL; sl = g_slist_next(sl)) { + PSLIST_FOREACH(res->sources, sl) { struct magnet_source *ms = sl->data; if (ms->path) { const char *endptr; - + /* * If the path contains a '?', this is most-likely a * `search' with parameters e.g., "/index.php?yadda=1", @@ -15828,27 +16716,27 @@ if (filename && '\0' != filename0) { break; } - G_FREE_NULL(filename); + HFREE_NULL(filename); } } } if (!filename) { if (res->sha1) { - filename = g_strconcat("urn:sha1:", - sha1_base32(res->sha1), (void *) 0); + filename = h_strconcat("urn:sha1:", + sha1_base32(res->sha1), NULL_PTR); } else { - filename = g_strdup("magnet-download"); + filename = h_strdup("magnet-download"); } } - for (sl = res->sources; sl != NULL; sl = g_slist_next(sl)) { + PSLIST_FOREACH(res->sources, sl) { struct magnet_source *ms = sl->data; gnet_host_vec_t *proxies; const struct guid *guid; const struct guid *guid_atom = NULL; host_addr_t addr; - guint16 port; - guint32 flags; + uint16 port; + uint32 flags; if ( (NULL == ms->path && NULL == res->sha1) || @@ -15876,7 +16764,7 @@ port = 0; flags |= SOCK_F_PUSH; guid = ms->guid; - proxies = gnet_host_vec_from_gslist(ms->proxies); + proxies = gnet_host_vec_from_pslist(ms->proxies); } else { addr = is_host_addr(ms->addr) ? ms->addr : ipv4_unspecified; port = ms->port; @@ -15914,7 +16802,7 @@ * - DHT support indication. */ - if (res->vendor || res->dht) { + if (res->vendor || res->dht || res->g2) { struct dl_server *server = get_server(guid, addr, port, FALSE); if (server && res->vendor != NULL && NULL == server->vendor) { server->vendor = @@ -15923,6 +16811,9 @@ if (server && res->dht) { server->attrs |= DLS_A_DHT_PUBLISH; } + if (server && res->g2) { + server->attrs |= DLS_A_G2_ONLY; + } } if (guid_atom != NULL) @@ -15959,8 +16850,7 @@ file_info_dht_query(res->sha1); } - G_FREE_NULL(filename); - + HFREE_NULL(filename); magnet_resource_free(&res); } else { if (GNET_PROPERTY(download_debug)) { @@ -15973,11 +16863,11 @@ /** * Create a download based on an HTTP URL. */ -gboolean +bool download_handle_http(const char *url) { char *magnet_url; - gboolean success; + bool success; g_return_val_if_fail(url, FALSE); g_return_val_if_fail(is_strcaseprefix(url, "http://"), FALSE); @@ -16001,7 +16891,7 @@ magnet_url = magnet_to_string(magnet); magnet_resource_free(&magnet); } - + success = download_handle_magnet(magnet_url); HFREE_NULL(magnet_url); @@ -16012,11 +16902,11 @@ * @return average download speed overall for the server, and if not available * yet, for this particular source if it is active. */ -guint +uint download_speed_avg(const struct download *d) { - guint speed_avg; - guint source_avg = 0; + uint speed_avg; + uint source_avg = 0; download_check(d); g_assert(d->server); @@ -16040,7 +16930,7 @@ * @return whether download is stalled, not having received data for some * time now. */ -gboolean +bool download_is_stalled(const struct download *d) { return delta_time(tm_time(), d->last_update) > DOWNLOAD_STALLED; @@ -16059,9 +16949,8 @@ * idle since at least "entry_removal_timeout" seconds */ void -download_clear_stopped(gboolean complete, - gboolean failed, gboolean unavailable, gboolean finished, - gboolean now) +download_clear_stopped(bool complete, + bool failed, bool unavailable, bool finished, bool now) { struct download *next; @@ -16115,7 +17004,7 @@ file_info_purge(d->file_info); continue; } - + if (d->flags & DL_F_TRANSIENT) { file_info_purge(d->file_info); } else { @@ -16150,17 +17039,21 @@ * Update the global average reception rate periodically. */ - { + if (!download_is_special(d)) { fileinfo_t *fi = d->file_info; time_delta_t delta = delta_time(now, fi->recv_last_time); g_assert(fi->recvcount > 0); if (delta > IO_AVG_RATE) { + double rate = fi->recv_amount / (double) delta; + fi->recv_last_rate = fi->recv_amount / delta; fi->recv_amount = 0; fi->recv_last_time = now; file_info_changed(fi); + + entropy_harvest_single(VARLEN(rate)); } } @@ -16195,8 +17088,11 @@ continue; /* Was requeued */ } - http_range_free(d->ranges); /* May have changed on server */ - d->ranges = NULL; /* Request normally next time */ + /* + * Ranges may have changed on server, pick a chunk without + * relying on what we think is available. If that fails, + * we'll get an updated range list from the server. + */ if (!download_pick_chunk(d, &d->pipeline->chunk, FALSE)) { d->flags |= DL_F_NO_PIPELINE; @@ -16438,7 +17334,7 @@ /* * Is the filename that of a completed download? */ -gboolean +bool download_is_completed_filename(const char *name) { static const char *ext = { DL_OK_EXT, DL_BAD_EXT, DL_UNKN_EXT }; @@ -16449,7 +17345,7 @@ namelen = strlen(name); - for (i = 0; i < G_N_ELEMENTS(ext); i++) { + for (i = 0; i < N_ITEMS(ext); i++) { if (is_strsuffix(name, namelen, exti)) return TRUE; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/downloads.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/downloads.h
Changed
@@ -57,69 +57,72 @@ void download_orphan_new(const char *file, filesize_t size, const struct sha1 *sha1, fileinfo_t *fi); void download_queue(struct download *d, - const char *fmt, ...) G_GNUC_PRINTF(2, 3); + const char *fmt, ...) G_PRINTF(2, 3); void download_stop(struct download *, download_status_t, - const char *, ...) G_GNUC_PRINTF(3, 4); + const char *, ...) G_PRINTF(3, 4); void download_stop_v(struct download *d, download_status_t new_status, const char * reason, va_list ap); void download_push_ack(struct gnutella_socket *); -void download_forget(struct download *, gboolean unavailable); -gboolean download_start_prepare(struct download *d); -gboolean download_start_prepare_running(struct download *d); +void download_forget(struct download *, bool unavailable); +bool download_start_prepare(struct download *d); +bool download_start_prepare_running(struct download *d); void download_send_request(struct download *); void download_connected(struct download *); void download_close(void); -gboolean download_server_nopush(const struct guid *, - const host_addr_t addr, guint16 port); +bool download_server_nopush(const struct guid *, + const host_addr_t addr, uint16 port); void download_free_removed(void); void download_redirect_to_server(struct download *d, - const host_addr_t addr, guint16 port); -void download_actively_queued(struct download *d, gboolean queued); + const host_addr_t addr, uint16 port); +void download_actively_queued(struct download *d, bool queued); +struct download *download_pick_another_waiting(const struct download *d); +void download_switch(struct download *od, struct download *nd, bool on_error); void download_server_publishes_in_dht(const struct guid *); -gboolean download_send_udp_push( - const struct array packet, host_addr_t addr, guint16 port); +bool download_send_udp_push( + const struct array packet, host_addr_t addr, uint16 port); void download_add_push_proxy(const struct guid *guid, - host_addr_t addr, guint16 port); + host_addr_t addr, uint16 port); void download_add_push_proxies(const struct guid *, gnet_host_t *proxies, int proxy_count); void download_proxy_dht_lookup_done(const struct guid *); void download_found_server(const struct guid *, - const host_addr_t addr, guint16 port); + const host_addr_t addr, uint16 port); +void download_attach_socket(struct download *d, struct gnutella_socket *s); void download_move_start(struct download *d); void download_move_progress(struct download *d, filesize_t copied); void download_move_done(struct download *d, const char *pathname, - guint elapsed); + uint elapsed); void download_move_error(struct download *d); -guint extract_retry_after(struct download *d, const header_t *header); -gboolean is_faked_download(const struct download *d); +uint extract_retry_after(struct download *d, const header_t *header); +bool is_faked_download(const struct download *d); struct download *download_find_waiting_unparq(const host_addr_t addr, - guint16 port); + uint16 port); void download_set_socket_rx_size(unsigned rx_size); void download_proxy_newstate(struct download *d); void download_proxy_sent(struct download *d); void download_proxy_failed(struct download *d); -gboolean download_known_guid(const struct guid *guid, - host_addr_t *addr, guint16 *port, sequence_t **proxies); +bool download_known_guid(const struct guid *guid, + host_addr_t *addr, uint16 *port, sequence_t **proxies); void download_got_push_proxies(const struct guid *guid, - const gnet_host_vec_t *proxies); + const gnet_host_vec_t *proxies, bool g2); struct download * download_browse_start( - const char *hostname, host_addr_t addr, guint16 port, + const char *hostname, host_addr_t addr, uint16 port, const struct guid *, const gnet_host_vec_t *proxies, - gnet_search_t search, guint32 flags); + gnet_search_t search, uint32 flags); struct download * download_thex_start(const char *uri, const struct sha1 *sha1, const struct tth *tth, filesize_t filesize, - const char *hostname, host_addr_t addr, guint16 port, + const char *hostname, host_addr_t addr, uint16 port, const struct guid *, const gnet_host_vec_t *proxies, - guint32 flags); + uint32 flags); void download_abort_browse_host(struct download *d, gnet_search_t sh); void download_got_eof(struct download *d); @@ -128,20 +131,22 @@ void download_data_received(struct download *d, ssize_t received); void download_maybe_finished(struct download *d); -gboolean download_handle_http(const char *url); -gboolean download_is_stalled(const struct download *); -gboolean download_is_alive(const struct download *); -gboolean download_is_completed_filename(const char *name); +bool download_handle_http(const char *url); +bool download_is_stalled(const struct download *); +bool download_is_alive(const struct download *); +bool download_is_active(const struct download *); +bool download_is_completed_filename(const char *name); -gboolean download_sha1_is_rare(const struct sha1 *sha1); +bool download_sha1_is_rare(const struct sha1 *sha1); -gboolean download_remove(struct download *d); +bool download_remove(struct download *d); void download_abort(struct download *d); void download_got_fw_node_info(const struct guid *guid, - host_addr_t addr, guint16 port, const char *fwinfo); + host_addr_t addr, uint16 port, const char *fwinfo); const char *server_host_info(const struct dl_server *server); +const char *download_status_to_string(const struct download *d); static inline const char * download_host_info(const struct download *d)
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/dq.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/dq.c
Changed
@@ -37,20 +37,23 @@ #include <math.h> /* For pow() */ #endif /* I_MATH */ +#define SEARCH_SOURCES +#include "search.h" + #include "dq.h" + +#include "alive.h" #include "gmsg.h" #include "gmsg.h" -#include "nodes.h" #include "gnet_stats.h" -#include "qrp.h" -#include "vmsg.h" -#include "search.h" -#include "alive.h" +#include "hosts.h" /* For host_is_valid() */ +#include "nodes.h" #include "oob_proxy.h" -#include "sockets.h" /* For udp_active() */ +#include "qrp.h" #include "settings.h" /* For listen_addr() */ -#include "hosts.h" /* For host_is_valid() */ #include "share.h" /* For query_strip_oob_flag() */ +#include "sockets.h" /* For udp_active() */ +#include "vmsg.h" #include "if/gnet_property_priv.h" @@ -59,9 +62,15 @@ #include "lib/endian.h" #include "lib/glib-missing.h" #include "lib/halloc.h" +#include "lib/hevset.h" +#include "lib/hikset.h" +#include "lib/hset.h" +#include "lib/htable.h" #include "lib/nid.h" +#include "lib/pslist.h" #include "lib/stringify.h" #include "lib/tm.h" +#include "lib/vsort.h" #include "lib/walloc.h" #include "lib/override.h" /* Must be the last header included */ @@ -133,33 +142,33 @@ */ typedef struct dquery { dquery_magic_t magic; - guint32 flags; /**< Operational flags */ + uint32 flags; /**< Operational flags */ struct nid *node_id; /**< ID of the node that originated the query */ struct nid qid; /**< Unique query ID, to detect ghosts */ gnet_search_t sh; /**< Search handle, if node ID = NODE_ID_SELF */ pmsg_t *mb; /**< The search messsage "template" */ query_hashvec_t *qhv; /**< Query hash vector for QRP filtering */ - GHashTable *queried; /**< Contains node IDs that we queried so far */ - GHashTable *enqueued; /**< Contains node IDs with enqueued queries */ + htable_t *queried; /**< Contains node IDs that we queried so far */ + hset_t *enqueued; /**< Contains node IDs with enqueued queries */ const struct guid *lmuid;/**< For proxied query: the original leaf MUID */ - guint16 query_flags; /**< Flags from the marked query speed field */ - guint8 ttl; /**< Initial query TTL */ - guint32 horizon; /**< Theoretical horizon reached thus far */ - guint32 up_sent; /**< # of UPs to which we really sent our query */ - guint32 last_status; /**< How many UP queried last time we got status */ - guint32 pending; /**< Pending query messages not ACK'ed yet by mq */ - guint32 max_results; /**< Max results we're targetting for */ - guint32 fin_results; /**< # of results terminating leaf-guided query */ - guint32 oob_results; /**< Amount of unclaimed OOB results reported */ - guint32 results; /**< Results we got so far for the query */ - guint32 linger_results; /**< Results we got whilst lingering */ - guint32 new_results; /**< New we got since last query status request */ - guint32 kept_results; /**< Results they say they kept after filtering */ - guint32 result_timeout; /**< The current timeout for getting results */ - guint32 stat_timeouts; /**< The amount of status request timeouts we had */ + uint16 query_flags; /**< Flags from the marked query speed field */ + uint8 ttl; /**< Initial query TTL */ + uint32 horizon; /**< Theoretical horizon reached thus far */ + uint32 up_sent; /**< # of UPs to which we really sent our query */ + uint32 last_status; /**< How many UP queried last time we got status */ + uint32 pending; /**< Pending query messages not ACK'ed yet by mq */ + uint32 max_results; /**< Max results we're targetting for */ + uint32 fin_results; /**< # of results terminating leaf-guided query */ + uint32 oob_results; /**< Amount of unclaimed OOB results reported */ + uint32 results; /**< Results we got so far for the query */ + uint32 linger_results; /**< Results we got whilst lingering */ + uint32 new_results; /**< New we got since last query status request */ + uint32 kept_results; /**< Results they say they kept after filtering */ + uint32 result_timeout; /**< The current timeout for getting results */ + uint32 stat_timeouts; /**< The amount of status request timeouts we had */ cevent_t *expire_ev; /**< Callout queue global expiration event */ cevent_t *results_ev; /**< Callout queue results expiration event */ - gpointer alive; /**< Alive ping stats for computing timeouts */ + void *alive; /**< Alive ping stats for computing timeouts */ time_t start; /**< Time at which it started */ time_t stop; /**< Time at which it was terminated */ struct next_up *nv; /**< Previous "next UP vector" */ @@ -184,14 +193,14 @@ * This table keeps track of all the dynamic query objects that we have * created and which are alive. */ -static GHashTable *dqueries; +static hevset_t *dqueries; /** * This table keeps track of all the dynamic query objects created * for a given node ID. The key is the node ID (converted to a pointer) and - * the value is a GSList containing all the queries for that node. + * the value is a pslist_t containing all the queries for that node. */ -static GHashTable *by_node_id; +static htable_t *by_node_id; /** * This table keeps track of the association between a MUID and the @@ -200,7 +209,7 @@ * * The keys are MUIDs (GUID atoms), the values are the dquery_t object. */ -static GHashTable *by_muid; +static htable_t *by_muid; /** * This table keeps track of the association between a leaf MUID and the @@ -208,7 +217,7 @@ * account them for the relevant query (since for OOB-proxied query, the * MUID we'll get is the one the leaf knows about). */ -static GHashTable *by_leaf_muid; +static hikset_t *by_leaf_muid; /** * Information about query messages sent. @@ -227,9 +236,9 @@ struct dq_pmsg_info { struct nid qid; /**< Query ID of the dynamic query */ struct nid *node_id;/**< The ID of the node we sent it to */ - guint16 degree; /**< The advertised degree of the destination node */ - guint8 ttl; /**< The TTL used for that query */ - guint8 probe; /**< Whether query is just a probe */ + uint16 degree; /**< The advertised degree of the destination node */ + uint8 ttl; /**< The TTL used for that query */ + uint8 probe; /**< Whether query is just a probe */ }; /* @@ -243,7 +252,7 @@ #define MAX_DEGREE 50 #define MAX_TTL 5 -static guint32 hostsMAX_DEGREEMAX_TTL; /**< Pre-computed horizon */ +static uint32 hostsMAX_DEGREEMAX_TTL; /**< Pre-computed horizon */ static void dq_send_next(dquery_t *dq); static void dq_terminate(dquery_t *dq); @@ -289,7 +298,7 @@ * We adjust the horizon by DQ_FUZZY_FACTOR, assuming that at each hop there * is deperdition due to flow-control, network cycles, etc... */ -static guint32 +static uint32 dq_get_horizon(int degree, int ttl) { int i; @@ -308,7 +317,7 @@ * Compute amount of results "kept" for the query, if we have this * information available. */ -static guint32 +static uint32 dq_kept_results(dquery_t *dq) { dquery_check(dq); @@ -345,8 +354,8 @@ static unsigned dq_select_ttl(dquery_t *dq, gnutella_node_t *node, int connections) { - guint32 needed; - guint32 results; + uint32 needed; + uint32 results; double results_per_up; double hosts_to_reach; double hosts_to_reach_via_node; @@ -393,11 +402,11 @@ * @param probe whether the query is just a probe, with a lower TTL */ static struct dq_pmsg_info * -dq_pmi_alloc(dquery_t *dq, guint16 degree, guint8 ttl, - const struct nid *node_id, gboolean probe) +dq_pmi_alloc(dquery_t *dq, uint16 degree, uint8 ttl, + const struct nid *node_id, bool probe) { struct dq_pmsg_info *pmi; - const struct nid *key = nid_ref(node_id); + const struct nid *key = nid_ref(node_id); dquery_check(dq); g_assert(ttl != 0); @@ -413,7 +422,7 @@ * Remember that we've queried this node, and with which TTL. */ - gm_hash_table_insert_const(dq->queried, key, + htable_insert(dq->queried, key, uint_to_pointer(ttl | (pmi->probe ? DQ_TTL_PROBE : 0))); /* @@ -421,7 +430,7 @@ * forbid further sending should this query be stuck in the TX queue. */ - gm_hash_table_insert_const(dq->enqueued, pmi->node_id, int_to_pointer(1)); + hset_insert(dq->enqueued, pmi->node_id); return pmi; } @@ -432,7 +441,7 @@ static void dq_pmi_free(struct dq_pmsg_info *pmi) { - nid_unref(pmi->node_id); + nid_unref(pmi->node_id); WFREE(pmi); } @@ -448,7 +457,7 @@ /* NOTE: dqueries might have been freed already, as dq_pmsg_free() * might still call this function after dq_close(). */ - dq = dqueries ? g_hash_table_lookup(dqueries, &qid) : NULL; + dq = dqueries ? hevset_lookup(dqueries, &qid) : NULL; if (dq) { dquery_check(dq); } @@ -459,7 +468,7 @@ * Free routine for an extended message block. */ static void -dq_pmsg_free(pmsg_t *mb, gpointer arg) +dq_pmsg_free(pmsg_t *mb, void *arg) { struct dq_pmsg_info *pmi = arg; dquery_t *dq; @@ -467,13 +476,13 @@ /* NOTE: No dquery_check() because the memory might have been freed * already! See dq_alive and the comment below. */ - + g_assert(pmsg_is_extended(mb)); /* * It is possible that whilst the message was in the message queue, * the dynamic query was cancelled. Therefore, we need to ensure that - * the recorded query is still alive. + * the recorded query is still alive. */ dq = dq_alive(pmi->qid); @@ -482,12 +491,13 @@ g_assert(dq->pending > 0); dq->pending--; - g_hash_table_remove(dq->enqueued, pmi->node_id); + hset_remove(dq->enqueued, pmi->node_id); if (!pmsg_was_sent(mb)) { - struct nid *key; - gboolean found; - void *knid, *ttlv; + const struct nid *key; + bool found; + const void *knid; + void *ttlv; unsigned ttl; /* @@ -496,8 +506,7 @@ * make it through the network. */ - found = g_hash_table_lookup_extended(dq->queried, pmi->node_id, - &knid, &ttlv); + found = htable_lookup_extended(dq->queried, pmi->node_id, &knid, &ttlv); g_assert(found); /* Or something is seriously corrupted */ @@ -507,10 +516,10 @@ g_assert(pmi->ttl >= (ttl & DQ_TTL_MASK)); if ((ttl & DQ_TTL_MASK) > 1) { - g_hash_table_replace(dq->queried, key, + htable_insert(dq->queried, key, uint_to_pointer((ttl - 1) | (ttl & DQ_TTL_PROBE))); } else { - g_hash_table_remove(dq->queried, key); + htable_remove(dq->queried, key); nid_unref(key); } @@ -554,7 +563,7 @@ nid_to_string(&dq->qid), node_id_self(dq->node_id) ? "local " : "", (int) (tm_time() - dq->start), - dq->up_sent, dq->up_sent == 1 ? "" :"s", + dq->up_sent, plural(dq->up_sent), dq->horizon, dq->results); } } @@ -599,7 +608,7 @@ * Patch the TTL in the new data buffer. */ { - gnutella_header_t *header = cast_to_gpointer(pdata_start(db)); + gnutella_header_t *header = cast_to_pointer(pdata_start(db)); gnutella_header_set_ttl(header, ttl); } @@ -626,13 +635,13 @@ static int dq_fill_probe_up(dquery_t *dq, gnutella_node_t **nv, int ncount) { - const GSList *sl; + const pslist_t *sl; int i = 0; dquery_check(dq); - GM_SLIST_FOREACH(node_all_ultranodes(), sl) { - struct gnutella_node *n; + PSLIST_FOREACH(node_all_ultranodes(), sl) { + gnutella_node_t *n; if (i >= ncount) break; @@ -702,7 +711,7 @@ for (i = 0; i < dq->nv_found; i++) { nid_unref(dq->nvi.node_id); } - wfree(dq->nv, dq->nv_count * sizeof dq->nv0); + WFREE_ARRAY(dq->nv, dq->nv_count); dq->nv = NULL; dq->nv_count = 0; dq->nv_found = 0; @@ -721,9 +730,9 @@ static int dq_fill_next_up(dquery_t *dq, struct next_up *nv, int ncount) { - const GSList *sl; + const pslist_t *sl; int i = 0; - GHashTable *old = NULL; + htable_t *old = NULL; dquery_check(dq); @@ -736,11 +745,11 @@ if (dq->nv != NULL) { int j; - old = g_hash_table_new(nid_hash, nid_equal); + old = htable_create_any(nid_hash, nid_hash2, nid_equal); for (j = 0; j < dq->nv_found; j++) { struct next_up *nup = &dq->nvj; - gm_hash_table_insert_const(old, nup->node_id, nup); + htable_insert(old, nup->node_id, nup); } } @@ -748,11 +757,12 @@ * Select candidate ultra peers for sending query. */ - GM_SLIST_FOREACH(node_all_ultranodes(), sl) { + PSLIST_FOREACH(node_all_ultranodes(), sl) { struct next_up *nup, *old_nup; - struct gnutella_node *n; - void *knid, *ttlv; - gboolean found; + gnutella_node_t *n; + const void *knid; + void *ttlv; + bool found; if (i >= ncount) break; @@ -771,7 +781,7 @@ * Skip node if we already have a pending query. */ - if (gm_hash_table_contains(dq->enqueued, NODE_ID(n))) + if (hset_contains(dq->enqueued, NODE_ID(n))) continue; /* @@ -783,8 +793,7 @@ if (n->received == 0) continue; - found = g_hash_table_lookup_extended(dq->queried, NODE_ID(n), - &knid, &ttlv); + found = htable_lookup_extended(dq->queried, NODE_ID(n), &knid, &ttlv); if (found) { if (!(n->attrs & NODE_A_DQ_PROBE)) @@ -815,10 +824,7 @@ nup->node_id = nid_ref(NODE_ID(n)); /* To be able to compare */ nup->qhv = dq->qhv; - if ( - old && - (old_nup = g_hash_table_lookup(old, nup->node_id)) - ) { + if (old && NULL != (old_nup = htable_lookup(old, nup->node_id))) { g_assert(nid_equal(NODE_ID(n), old_nup->node_id)); nup->can_route = old_nup->can_route; } else @@ -832,7 +838,7 @@ if (old) { g_assert(dq->nv != NULL); dq_free_next_up(dq); - g_hash_table_destroy(old); + htable_free_null(&old); } dq->nv = nv; @@ -849,11 +855,11 @@ static void dq_sendto_leaves(dquery_t *dq, gnutella_node_t *source) { - gconstpointer head; - GSList *nodes; + const void *head; + pslist_t *nodes; dquery_check(dq); - head = cast_to_gconstpointer(pmsg_start(dq->mb)); + head = cast_to_constpointer(pmsg_start(dq->mb)); /* * NB: In order to avoid qrt_build_query_target() selecting neighbouring @@ -862,27 +868,26 @@ */ nodes = qrt_build_query_target(dq->qhv, - gnutella_header_get_hops(head), 0, source); + gnutella_header_get_hops(head), 0, TRUE, source); if (GNET_PROPERTY(dq_debug) > 4) - g_debug("DQ QRP %s (%d word%s%s) forwarded to %d/%d leaves", + g_debug("DQ QRP %s (%d word%s%s) forwarded to %zd/%d leaves", gmsg_infostr_full(head, pmsg_written_size(dq->mb)), - qhvec_count(dq->qhv), qhvec_count(dq->qhv) == 1 ? "" : "s", + qhvec_count(dq->qhv), plural(qhvec_count(dq->qhv)), qhvec_has_urn(dq->qhv) ? " + URN" : "", - g_slist_length(nodes), GNET_PROPERTY(node_leaf_count)); + pslist_length(nodes), GNET_PROPERTY(node_leaf_count)); gmsg_mb_sendto_all(nodes, dq->mb); - g_slist_free(nodes); + pslist_free(nodes); } -static gboolean -free_node_id(gpointer key, gpointer unused_value, gpointer unused_udata) +static void +free_node_id(const void *key, void *unused_value, void *unused_udata) { (void) unused_value; (void) unused_udata; nid_unref(key); - return TRUE; } /** @@ -895,7 +900,7 @@ dquery_check(dq); g_assert((dq->flags & DQ_F_EXITING) || - g_hash_table_lookup(dqueries, &dq->qid) == dq); + hevset_lookup(dqueries, &dq->qid) == dq); if (GNET_PROPERTY(dq_debug) > 2) g_debug("DQ%s %s(%d secs; +%d secs) node #%s ending: " @@ -924,24 +929,24 @@ dq->kept_results / (node_id_self(dq->node_id) ? 1 : DQ_AVG_ULTRA_NODES) >= dq->max_results ) - gnet_stats_count_general(GNR_DYN_QUERIES_COMPLETED_FULL, 1); + gnet_stats_inc_general(GNR_DYN_QUERIES_COMPLETED_FULL); else if (dq->results > 0) - gnet_stats_count_general(GNR_DYN_QUERIES_COMPLETED_PARTIAL, 1); + gnet_stats_inc_general(GNR_DYN_QUERIES_COMPLETED_PARTIAL); else - gnet_stats_count_general(GNR_DYN_QUERIES_COMPLETED_ZERO, 1); + gnet_stats_inc_general(GNR_DYN_QUERIES_COMPLETED_ZERO); if (dq->linger_results) { if (dq->results >= dq->max_results) - gnet_stats_count_general(GNR_DYN_QUERIES_LINGER_EXTRA, 1); + gnet_stats_inc_general(GNR_DYN_QUERIES_LINGER_EXTRA); else if (dq->linger_results >= dq->max_results - dq->results) - gnet_stats_count_general(GNR_DYN_QUERIES_LINGER_COMPLETED, 1); + gnet_stats_inc_general(GNR_DYN_QUERIES_LINGER_COMPLETED); else - gnet_stats_count_general(GNR_DYN_QUERIES_LINGER_RESULTS, 1); + gnet_stats_inc_general(GNR_DYN_QUERIES_LINGER_RESULTS); } - g_hash_table_foreach_remove(dq->queried, free_node_id, NULL); - gm_hash_table_destroy_null(&dq->queried); - gm_hash_table_destroy_null(&dq->enqueued); + htable_foreach(dq->queried, free_node_id, NULL); + htable_free_null(&dq->queried); + hset_free_null(&dq->enqueued); qhvec_free(dq->qhv); dq_free_next_up(dq); @@ -954,7 +959,7 @@ } if (!(dq->flags & DQ_F_EXITING)) - g_hash_table_remove(dqueries, &dq->qid); + hevset_remove(dqueries, &dq->qid); /* * Remove query from the `by_node_id' table but only if the node ID @@ -967,31 +972,29 @@ */ if (!node_id_self(dq->node_id) && !(dq->flags & DQ_F_ID_CLEANING)) { - gpointer value; - gboolean found; - GSList *list; + void *value; + bool found; + pslist_t *list; - found = g_hash_table_lookup_extended(by_node_id, dq->node_id, - NULL, &value); + found = htable_lookup_extended(by_node_id, dq->node_id, NULL, &value); if (!found) { - g_error("%s: missing %s", G_STRLOC, nid_to_string(dq->node_id)); + g_error("%s: missing %s", G_STRFUNC, nid_to_string(dq->node_id)); } list = value; - list = g_slist_remove(list, dq); + list = pslist_remove(list, dq); if (list == NULL) { /* Last item removed, get rid of the entry */ - g_hash_table_remove(by_node_id, dq->node_id); - g_assert(!g_hash_table_lookup_extended(by_node_id, dq->node_id, - NULL, NULL)); + htable_remove(by_node_id, dq->node_id); + g_assert(!htable_contains(by_node_id, dq->node_id)); } else if (list != value) { dquery_t *key = list->data; dquery_check(key); - gm_hash_table_replace_const(by_node_id, key->node_id, list); - g_assert(g_hash_table_lookup(by_node_id, dq->node_id) == list); + htable_insert(by_node_id, key->node_id, list); + g_assert(htable_lookup(by_node_id, dq->node_id) == list); } } @@ -999,15 +1002,16 @@ * Remove query's MUID. */ { - gpointer key, value; - gboolean found; + const void *key; + void *value; + bool found; - found = g_hash_table_lookup_extended(by_muid, - gnutella_header_get_muid(pmsg_start(dq->mb)), &key, &value); + found = htable_lookup_extended(by_muid, + gnutella_header_get_muid(pmsg_start(dq->mb)), &key, &value); if (found) { /* Could be missing if a MUID conflict occurred */ if (value == dq) { /* Make sure it's for us in case of conflicts */ - g_hash_table_remove(by_muid, key); + htable_remove(by_muid, key); atom_guid_free(key); } } @@ -1018,13 +1022,12 @@ */ if (dq->lmuid != NULL) { - gpointer key, value; - gboolean found; + void *value; + bool found; - found = g_hash_table_lookup_extended( - by_leaf_muid, dq->lmuid, &key, &value); + found = hikset_lookup_extended(by_leaf_muid, dq->lmuid, &value); if (found && value == dq) - g_hash_table_remove(by_leaf_muid, key); + hikset_remove(by_leaf_muid, dq->lmuid); atom_guid_free(dq->lmuid); } @@ -1040,19 +1043,17 @@ * Callout queue callback invoked when the dynamic query has expired. */ static void -dq_expired(cqueue_t *unused_cq, gpointer obj) +dq_expired(cqueue_t *cq, void *obj) { dquery_t *dq = obj; dquery_check(dq); g_assert(dq->expire_ev != NULL); - (void) unused_cq; - if (GNET_PROPERTY(dq_debug) > 3) g_debug("DQ%s expired", nid_to_string(&dq->qid)); - dq->expire_ev = NULL; /* Indicates callback fired */ + cq_zero(cq, &dq->expire_ev); /* Indicates callback fired */ /* * If query was lingering, free it. @@ -1076,21 +1077,20 @@ * Callout queue callback invoked when the result timer has expired. */ static void -dq_results_expired(cqueue_t *unused_cq, gpointer obj) +dq_results_expired(cqueue_t *cq, void *obj) { dquery_t *dq = obj; gnutella_node_t *n; int timeout; - guint32 avg; - guint32 last; - gboolean was_waiting = FALSE; + uint32 avg; + uint32 last; + bool was_waiting = FALSE; - (void) unused_cq; dquery_check(dq); g_assert(!(dq->flags & DQ_F_LINGER)); g_assert(dq->results_ev != NULL); - dq->results_ev = NULL; /* Indicates callback fired */ + cq_zero(cq, &dq->results_ev); /* Indicates callback fired */ /* * If we were waiting for a status reply from the queryier, well, we @@ -1141,8 +1141,7 @@ if (GNET_PROPERTY(dq_debug) > 1) g_debug( "DQ%s terminating unguided & unrouted (queried %u UP%s)", - nid_to_string(&dq->qid), dq->up_sent, - dq->up_sent == 1 ? "" : "s"); + nid_to_string(&dq->qid), dq->up_sent, plural(dq->up_sent)); dq_terminate(dq); return; } @@ -1290,8 +1289,8 @@ static int node_mq_qrp_cmp(const void *np1, const void *np2) { - struct next_up *nu1 = deconstify_gpointer(np1); - struct next_up *nu2 = deconstify_gpointer(np2); + struct next_up *nu1 = deconstify_pointer(np1); + struct next_up *nu2 = deconstify_pointer(np2); const gnutella_node_t *n1, *n2; int qs1 = nu1->queue_pending; int qs2 = nu2->queue_pending; @@ -1341,13 +1340,13 @@ * adjusted down accordingly. */ static void -dq_send_query(dquery_t *dq, gnutella_node_t *n, int ttl, gboolean probe) +dq_send_query(dquery_t *dq, gnutella_node_t *n, int ttl, bool probe) { struct dq_pmsg_info *pmi; pmsg_t *mb; dquery_check(dq); - g_assert(!g_hash_table_lookup(dq->queried, NODE_ID(n))); + g_assert(!htable_contains(dq->queried, NODE_ID(n))); g_assert(NODE_IS_WRITABLE(n)); pmi = dq_pmi_alloc(dq, n->degree, MIN(n->max_ttl, ttl), NODE_ID(n), probe); @@ -1400,8 +1399,8 @@ int found; int timeout; int i; - gboolean sent = FALSE; - guint32 results; + bool sent = FALSE; + uint32 results; dquery_check(dq); g_assert(dq->results_ev == NULL); @@ -1488,14 +1487,14 @@ return; } - nv = walloc(ncount * sizeof nv0); + WALLOC_ARRAY(nv, ncount); found = dq_fill_next_up(dq, nv, ncount); g_assert(dq->nv == nv); /* Saved for next time */ if (GNET_PROPERTY(dq_debug) > 19) g_debug("DQ%s still %d UP%s to query (results %sso far: %u)", - nid_to_string(&dq->qid), found, found == 1 ? "" : "s", + nid_to_string(&dq->qid), found, plural(found), (dq->flags & DQ_F_GOT_GUIDANCE) ? "reported kept " : "", results); if (found == 0) @@ -1507,7 +1506,7 @@ * with a QRP match. */ - qsort(nv, found, sizeof nv0, node_mq_qrp_cmp); + vsort(nv, found, sizeof nv0, node_mq_qrp_cmp); /* * Select the first node, and compute the proper TTL for the query. @@ -1517,9 +1516,10 @@ */ for (i = 0; i < found; i++) { - struct gnutella_node *node; + gnutella_node_t *node; struct nid *nid = nvi.node_id; - void *knid, *ttlv; + const void *knid; + void *ttlv; unsigned ttl; node = node_by_id(nid); @@ -1530,7 +1530,7 @@ * a probe and the TTL is greater now. */ - if (g_hash_table_lookup_extended(dq->queried, nid, &knid, &ttlv)) { + if (htable_lookup_extended(dq->queried, nid, &knid, &ttlv)) { unsigned prev_ttl = pointer_to_uint(ttlv); if (prev_ttl & DQ_TTL_PROBE) { @@ -1544,7 +1544,7 @@ nid_to_string2(NODE_ID(node)), node_infostr(node), ttl, sttl); } - g_hash_table_remove(dq->queried, knid); + htable_remove(dq->queried, knid); nid_unref(knid); g_assert(ttl > 1); } else { @@ -1592,7 +1592,7 @@ timeout = dq->result_timeout; if (dq->pending > 1) { - guint t = timeout; + uint t = timeout; t += (dq->pending - 1) * DQ_PENDING_TIMEOUT; timeout = t > UNSIGNED(timeout) ? t : INT_MAX; @@ -1628,12 +1628,12 @@ g_assert(dq->results_ev == NULL); g_assert(!(dq->flags & DQ_F_LINGER)); - nv = walloc(ncount * sizeof nv0); + WALLOC_ARRAY(nv, ncount); found = dq_fill_probe_up(dq, nv, ncount); if (GNET_PROPERTY(dq_debug) > 19) g_debug("DQ%s found %d UP%s to probe", - nid_to_string(&dq->qid), found, found == 1 ? "" : "s"); + nid_to_string(&dq->qid), found, plural(found)); /* * If we don't find any suitable UP holding that content, then @@ -1664,7 +1664,7 @@ * the less pending data are listed first. */ - qsort(nv, found, sizeof nv0, node_mq_cmp); + vsort(nv, found, sizeof nv0, node_mq_cmp); /* * Send the probe query to the first DQ_PROBE_UP nodes. @@ -1686,7 +1686,7 @@ dq_results_expired, dq); cleanup: - wfree(nv, ncount * sizeof nv0); + WFREE_ARRAY(nv, ncount); } static struct nid @@ -1703,13 +1703,14 @@ static void dq_common_init(dquery_t *dq) { - gconstpointer head; + const void *head; const guid_t *muid; + void *value; dquery_check(dq); dq->qid = dquery_id_create(); - dq->queried = g_hash_table_new(nid_hash, nid_equal); - dq->enqueued = g_hash_table_new(nid_hash, nid_equal); + dq->queried = htable_create_any(nid_hash, nid_hash2, nid_equal); + dq->enqueued = hset_create_any(nid_hash, nid_hash2, nid_equal); dq->result_timeout = DQ_QUERY_TIMEOUT; dq->start = tm_time(); @@ -1724,28 +1725,26 @@ * Record the query as being "alive". */ - g_hash_table_insert(dqueries, &dq->qid, dq); + hevset_insert_key(dqueries, &dq->qid); /* * If query is not for the local node, insert it in `by_node_id'. */ if (!(dq->flags & DQ_F_LOCAL)) { - gpointer value; - gboolean found; - GSList *list; + bool found; + pslist_t *list; - found = g_hash_table_lookup_extended(by_node_id, dq->node_id, - NULL, &value); + found = htable_lookup_extended(by_node_id, dq->node_id, NULL, &value); if (found) { list = value; - list = gm_slist_insert_after(list, list, dq); + list = pslist_insert_after(list, list, dq); g_assert(list == value); /* Head not changed */ } else { - list = g_slist_prepend(NULL, dq); - gm_hash_table_replace_const(by_node_id, dq->node_id, list); - g_assert(g_hash_table_lookup(by_node_id, dq->node_id) == list); + list = pslist_prepend(NULL, dq); + htable_insert(by_node_id, dq->node_id, list); + g_assert(htable_lookup(by_node_id, dq->node_id) == list); } } @@ -1753,14 +1752,19 @@ * Record the MUID of this query, warning if a conflict occurs. */ - head = cast_to_gconstpointer(pmsg_start(dq->mb)); + head = cast_to_constpointer(pmsg_start(dq->mb)); muid = gnutella_header_get_muid(head); - if (g_hash_table_lookup(by_muid, muid)) { - g_warning("conflicting MUID \"%s\" for dynamic query from %s, " - "ignoring.", guid_hex_str(muid), node_id_infostr(dq->node_id)); + if (htable_lookup_extended(by_muid, muid, NULL, &value)) { + dquery_t *odq = value; + dquery_check(odq); + g_warning("ignoring conflicting MUID \"%s\" for dynamic query from %s, " + "already used by %s.", + guid_hex_str(muid), node_id_infostr(dq->node_id), + dq->node_id == odq->node_id ? + "same node" : node_id_infostr2(odq->node_id)); } else { - gm_hash_table_insert_const(by_muid, atom_guid_get(muid), dq); + htable_insert(by_muid, atom_guid_get(muid), dq); } /* @@ -1770,19 +1774,22 @@ */ if (dq->lmuid != NULL) { - if (g_hash_table_lookup(by_leaf_muid, dq->lmuid)) { + if (hikset_lookup_extended(by_leaf_muid, dq->lmuid, &value)) { + dquery_t *odq = value; + dquery_check(odq); g_warning("ignoring conflicting leaf MUID \"%s\" for " - "dynamic query from %s", - guid_hex_str(dq->lmuid), node_id_infostr(dq->node_id)); + "dynamic query from %s, already used by %s", + guid_hex_str(dq->lmuid), node_id_infostr(dq->node_id), + dq->node_id == odq->node_id ? + "same node" : node_id_infostr2(odq->node_id)); } else { - g_hash_table_insert(by_leaf_muid, - deconstify_gpointer(dq->lmuid), dq); + hikset_insert_key(by_leaf_muid, &dq->lmuid); } } if (GNET_PROPERTY(dq_debug) > 1) { - gconstpointer packet; - guint16 flags; + const void *packet; + uint16 flags; packet = pmsg_start(dq->mb); flags = gnutella_msg_search_get_flags(packet); @@ -1814,25 +1821,30 @@ * * @param n leaf node from which query comes from * @param qhv computed query hash vector, for routing query via QRT - * @param media_types requested media type filters (0 if none) + * @param sri query information from pre-processing stage */ void -dq_launch_net(gnutella_node_t *n, query_hashvec_t *qhv, unsigned media_types) +dq_launch_net( + gnutella_node_t *n, + query_hashvec_t *qhv, const search_request_info_t *sri) { dquery_t *dq; - guint16 flags; - gboolean flags_valid; - const struct guid *leaf_muid; + uint16 flags; + bool flags_valid, proxied = FALSE, need_proxying = FALSE; + const guid_t *leaf_muid; + guid_t orig_muid; /* Query from leaf node */ g_assert(NODE_IS_LEAF(n)); g_assert(gnutella_header_get_hops(&n->header) == 1); g_assert(NODE_IS_CONNECTED(n)); + memcpy(&orig_muid, gnutella_header_get_muid(&n->header), GUID_RAW_SIZE); + WALLOC0(dq); dq->magic = DQUERY_MAGIC; - flags = peek_be16(n->data); + flags = sri->flags; flags_valid = 0 != (flags & QUERY_F_MARK); /* @@ -1855,70 +1867,155 @@ dq->flags |= DQ_F_LEAF_GUIDED; /* - * If the query is not leaf-guided and not OOB proxied already, then we - * need to ensure results are routed back to us. + * If the query is not leaf-guided, then we need to ensure results are + * routed back to us by OOB-proxying the query. + * * We won't know how much they filter out however, but they just have * to implement proper leaf-guidance for better results as leaves... * --RAM, 2006-08-16 + * + * If the leaf node is firewalled and won't be able to get UDP hits back, + * make sure we also OOB-proxy the query (even if they support leaf + * guidance) to avoid extra TCP traffic from the neighbouring ultrapeers. + * + * If the leaf node did not request OOB results, we also OOB-proxy it, + * again to avoid extra TCP relaying from neighbouring ultrapeers. + * + * Because gtk-gnutella supports OOB-v3, we do not honour the no-proxying + * flag that the host could send us. This indication was devised by + * LimeWire before the OOB-v3 days and is considered obsolete and useless + * nowadays. + * --RAM, 2014-03-10 */ + need_proxying = !(dq->flags & DQ_F_LEAF_GUIDED) || + (flags & QUERY_F_FIREWALLED) || !sri->oob; + if ( - !(dq->flags & DQ_F_LEAF_GUIDED) && - NULL == oob_proxy_muid_proxied(gnutella_header_get_muid(&n->header)) + need_proxying && + !GNET_PROPERTY(is_udp_firewalled) && + GNET_PROPERTY(proxy_oob_queries) && + udp_active() && + host_is_valid(listen_addr(), socket_listen_port()) + /* NOTE: IPv6 OOB proxying won't work, so don't check for IPv6 */ ) { - gboolean proxied = FALSE; - if ( - !GNET_PROPERTY(is_udp_firewalled) && - GNET_PROPERTY(proxy_oob_queries) && - udp_active() && - host_is_valid(listen_addr(), socket_listen_port()) - /* NOTE: IPv6 OOB proxying won't work, so don't check for IPv6 */ - ) { - /* - * Running with UDP support. - * OOB-proxy the query so that we can control how much results - * they get by routing the results ourselves to the leaf. - */ + /* + * Running with UDP support. + * OOB-proxy the query so that we can control how much results + * they get by routing the results ourselves to the leaf. + */ - if (GNET_PROPERTY(dq_debug) > 19) - g_debug("DQ %s #%s OOB-proxying query \"%s\" (%s)", + if (GNET_PROPERTY(dq_debug) > 3) { + g_debug("DQ %s #%s OOB-proxying query \"%s\" (%s)", + node_infostr(n), nid_to_string(NODE_ID(n)), + n->data + 2, + (flags_valid && (flags & QUERY_F_LEAF_GUIDED)) ? + "guided" : "unguided" + ); + } + + if (oob_proxy_create(n)) { + proxied = TRUE; + } else { + if (GNET_PROPERTY(dq_debug)) { + g_warning("DQ %s #%s: " + "cannot OOB-proxy query \"%s\" (%s): MUID collision", node_infostr(n), nid_to_string(NODE_ID(n)), n->data + 2, (flags_valid && (flags & QUERY_F_LEAF_GUIDED)) ? - "guided" : "unguided" - ); + "guided" : "unguided"); + } + } + } + + if (!proxied && sri->oob) { + /* + * Running without UDP support, or UDP-firewalled... + * Must remove the OOB flag so that results be routed back. + */ + + query_strip_oob_flag(n, n->data); + flags = peek_be16(n->data); /* Refresh our cache */ + + if (GNET_PROPERTY(dq_debug) > 1) { + g_debug( + "DQ %s #%s stripped OOB on query \"%s\" (%s)", + node_infostr(n), nid_to_string(NODE_ID(n)), + n->data + 2, + (flags_valid && (flags & QUERY_F_LEAF_GUIDED)) ? + "guided" : "unguided" + ); + } + } + + /* + * The so-called leaf MUID is the MUID of the query originally isssued by + * the leaf node if the query is being OOB-proxied locally. It will be + * NULL if the query is not being OOB-proxied. + * + * When non-NULL, it must not be already known (associated to another + * running DQ). + */ - if (oob_proxy_create(n)) { - gnet_stats_count_general(GNR_OOB_PROXIED_QUERIES, 1); - proxied = TRUE; + leaf_muid = oob_proxy_muid_proxied(gnutella_header_get_muid(&n->header)); + + if (leaf_muid != NULL) { + dquery_t *odq = hikset_lookup(by_leaf_muid, leaf_muid); + + if (odq != NULL) { + dquery_check(odq); + + if (odq->flags & DQ_F_LINGER) { + /* No longer active, can remove this association */ + hikset_remove(by_leaf_muid, leaf_muid); } else { - if (GNET_PROPERTY(dq_debug)) { - g_warning("DQ %s #%s: " - "cannot OOB-proxy query \"%s\" (%s): MUID collision", - node_infostr(n), nid_to_string(NODE_ID(n)), - n->data + 2, - (flags_valid && (flags & QUERY_F_LEAF_GUIDED)) ? - "guided" : "unguided"); - } + g_warning("leaf MUID \"%s\" for dynamic query from %s, " + "would OOB-proxy to same MUID as \"%s\" already used by %s" + " -- dropping", + guid_hex_str(&orig_muid), node_infostr(n), + guid_to_string(leaf_muid), + NODE_ID(n) == odq->node_id ? + "same node" : node_id_infostr(odq->node_id)); + goto oob_proxy_conflict; } } - if (!proxied && flags_valid && (flags & QUERY_F_OOB_REPLY)) { - /* - * Running without UDP support, or UDP-firewalled... - * Must remove the OOB flag so that results be routed back. - */ + } - query_strip_oob_flag(n, n->data); - flags = peek_be16(n->data); /* Refresh our cache */ + /* + * Likewise, the query MUID must not already be known. + * + * If the query MUID is not being OOB-proxied, it should already have + * been caught by the routing table (as a duplicate incoming query). + */ - if (GNET_PROPERTY(dq_debug) > 19) - g_debug( - "DQ %s #%s stripped OOB on query \"%s\" (%s)", - node_infostr(n), nid_to_string(NODE_ID(n)), - n->data + 2, - (flags_valid && (flags & QUERY_F_LEAF_GUIDED)) ? - "guided" : "unguided" - ); + { + const guid_t *muid = gnutella_header_get_muid(&n->header); + dquery_t *odq = htable_lookup(by_muid, muid); + + if (odq != NULL) { + dquery_check(odq); + + if (odq->flags & DQ_F_LINGER) { + const void *key; + const guid_t *muid_key; + bool found; + + found = htable_lookup_extended(by_muid, muid, &key, NULL); + g_assert(found); + + /* No longer active, can remove this association */ + htable_remove(by_muid, muid); + muid_key = key; + atom_guid_free_null(&muid_key); + } else { + g_warning("OOB-proxied MUID \"%s\" for dynamic query from %s, " + "is already used by another active query from %s" + " -- dropping", + guid_hex_str(muid), node_infostr(n), + NODE_ID(n) == odq->node_id ? + "same node" : node_id_infostr(odq->node_id)); + goto oob_proxy_conflict; + } } } @@ -1926,18 +2023,45 @@ * See whether we'll be seeing all the hits... */ - if ( - NULL != oob_proxy_muid_proxied(gnutella_header_get_muid(&n->header)) || - (flags_valid && !(flags & QUERY_F_OOB_REPLY)) - ) + if (NULL != leaf_muid || (flags_valid && !(flags & QUERY_F_OOB_REPLY))) dq->flags |= DQ_F_ROUTING_HITS; /* + * We're going to launch this query coming from our leaf. + */ + + if (proxied) { + gnet_stats_inc_general(GNR_OOB_PROXIED_QUERIES); + + /* + * We're supporting OOBv3, so make sure the "SO" key is present in + * the query if we're OOB-proxying it. + */ + + n->msg_flags &= ~NODE_M_STRIP_GE_SO; + n->msg_flags |= NODE_M_ADD_GE_SO | NODE_M_EXT_CLEANUP; + + /* + * If they did not want us to OOB-proxy their query, emit a small + * warning when debugging. + */ + + if (NODE_NO_OOB_PROXY(n)) { + if (GNET_PROPERTY(dq_debug) || GNET_PROPERTY(oob_proxy_debug)) { + g_warning("OOB-proxied MUID \"%s\" for dynamic query from %s, " + "despite host vetoing it", + guid_to_string(leaf_muid), node_infostr(n)); + } + } + } + + /* * Compact query if requested. */ if ( - GNET_PROPERTY(gnet_compact_query) || (n->msg_flags & NODE_M_EXT_CLEANUP) + GNET_PROPERTY(gnet_compact_query) || + (n->msg_flags & NODE_M_EXT_CLEANUP) ) search_compact(n); @@ -1954,7 +2078,6 @@ if (flags_valid) dq->query_flags = flags; - leaf_muid = oob_proxy_muid_proxied(gnutella_header_get_muid(&n->header)); if (leaf_muid != NULL) dq->lmuid = atom_guid_get(leaf_muid); @@ -1963,7 +2086,7 @@ packet = pmsg_start(dq->mb); record_query_string(gnutella_header_get_muid(packet), - gnutella_msg_search_get_text(packet), media_types); + gnutella_msg_search_get_text(packet), sri->media_types); } if (GNET_PROPERTY(dq_debug) > 1) { @@ -1981,11 +2104,24 @@ HFREE_NULL(safe_qstr); } - gnet_stats_count_general(GNR_LEAF_DYN_QUERIES, 1); + gnet_stats_inc_general(GNR_LEAF_DYN_QUERIES); dq_common_init(dq); dq_sendto_leaves(dq, n); dq_send_probe(dq); + return; + +oob_proxy_conflict: + gnet_stats_count_dropped(n, MSG_DROP_OOB_PROXY_CONFLICT); + + /* + * Do not launch this dynamic query. Since we have not yet created any + * data structure when we're re-routed here, we can free up local DQ and + * return. + */ + + dq->magic = 0; + WFREE(dq); } /** @@ -2044,7 +2180,7 @@ if (GNET_PROPERTY(dq_debug) > 1) { const char *qstr = gnutella_msg_search_get_text(pmsg_start(dq->mb)); char *safe_qstr = hex_escape(qstr, FALSE); - guint16 qflags = gnutella_msg_search_get_flags(pmsg_start(dq->mb)); + uint16 qflags = gnutella_msg_search_get_flags(pmsg_start(dq->mb)); g_debug("DQ local %squeries \"%s\" for %u hits", (qflags & QUERY_F_OOB_REPLY) ? "OOB-" : "", safe_qstr, dq->max_results); @@ -2052,7 +2188,7 @@ HFREE_NULL(safe_qstr); } - gnet_stats_count_general(GNR_LOCAL_DYN_QUERIES, 1); + gnet_stats_inc_general(GNR_LOCAL_DYN_QUERIES); dq_common_init(dq); search_starting(dq->sh); @@ -2076,16 +2212,16 @@ void dq_node_removed(const struct nid *node_id) { - gpointer value; - GSList *sl; + void *value; + pslist_t *sl; - if (!g_hash_table_lookup_extended(by_node_id, node_id, NULL, &value)) + if (!htable_lookup_extended(by_node_id, node_id, NULL, &value)) return; /* No dynamic query for this node */ - g_hash_table_remove(by_node_id, node_id); - g_assert(!g_hash_table_lookup_extended(by_node_id, node_id, NULL, NULL)); + htable_remove(by_node_id, node_id); + g_assert(!htable_contains(by_node_id, node_id)); - GM_SLIST_FOREACH(value, sl) { + PSLIST_FOREACH(value, sl) { dquery_t *dq = sl->data; dquery_check(dq); @@ -2093,15 +2229,15 @@ if (GNET_PROPERTY(dq_debug) > 1) g_debug("DQ%s terminated by node #%s removal (queried %u UP%s)", nid_to_string(&dq->qid), nid_to_string2(dq->node_id), - dq->up_sent, dq->up_sent == 1 ? "" : "s"); - + dq->up_sent, plural(dq->up_sent)); + /* Don't remove query from the table in dq_free() */ dq->flags |= DQ_F_ID_CLEANING; dq_free(dq); } - g_assert(!g_hash_table_lookup_extended(by_node_id, node_id, NULL, NULL)); - g_slist_free(value); + g_assert(!htable_contains(by_node_id, node_id)); + pslist_free(value); } /** @@ -2118,15 +2254,14 @@ * @return FALSE if the query was explicitly cancelled by the user or if we * should not forward the results anyway. */ -static gboolean -dq_count_results(const struct guid *muid, - int count, guint16 status, gboolean oob) +static bool +dq_count_results(const struct guid *muid, int count, uint16 status, bool oob) { dquery_t *dq; g_assert(count > 0); /* Query hits with no result are bad! */ - dq = g_hash_table_lookup(by_muid, muid); + dq = htable_lookup(by_muid, muid); if (dq == NULL) return TRUE; @@ -2224,8 +2359,8 @@ * results should be dropped, TRUE otherwise. In other words, returns * whether we should forward the results. */ -gboolean -dq_got_results(const struct guid *muid, guint count, guint32 status) +bool +dq_got_results(const struct guid *muid, uint count, uint32 status) { return dq_count_results(muid, count, status, FALSE); } @@ -2237,7 +2372,7 @@ * @return FALSE if the query was explicitly cancelled by the user and * results should not be claimed. */ -gboolean +bool dq_oob_results_ind(const struct guid *muid, int count) { return dq_count_results(muid, count, 0, TRUE); @@ -2250,14 +2385,14 @@ * were finally claimed and parsed). */ void -dq_oob_results_got(const struct guid *muid, guint count) +dq_oob_results_got(const struct guid *muid, uint count) { dquery_t *dq; /* Query hits with no result are bad! */ g_assert(count > 0 && count <= INT_MAX); - dq = g_hash_table_lookup(by_muid, muid); + dq = htable_lookup(by_muid, muid); if (dq == NULL) return; @@ -2289,11 +2424,11 @@ */ void dq_got_query_status(const struct guid *muid, - const struct nid *node_id, guint16 kept) + const struct nid *node_id, uint16 kept) { dquery_t *dq; - dq = g_hash_table_lookup(by_muid, muid); + dq = htable_lookup(by_muid, muid); /* * Could be an OOB-proxied query, but the leaf does not know the MUID @@ -2301,7 +2436,7 @@ */ if (dq == NULL) - dq = g_hash_table_lookup(by_leaf_muid, muid); + dq = hikset_lookup(by_leaf_muid, muid); if (dq == NULL) return; @@ -2353,8 +2488,7 @@ if (kept == 0xffff) { if (GNET_PROPERTY(dq_debug) > 1) g_debug("DQ%s terminating at user's request (queried %u UP%s)", - nid_to_string(&dq->qid), dq->up_sent, - dq->up_sent == 1 ? "" : "s"); + nid_to_string(&dq->qid), dq->up_sent, plural(dq->up_sent)); dq->flags |= DQ_F_USR_CANCELLED; @@ -2382,7 +2516,7 @@ struct cancel_context { gnet_search_t handle; - GSList *cancelled; + pslist_t *cancelled; }; /** @@ -2390,16 +2524,15 @@ * -- hash table iterator callback */ static void -dq_cancel_local(gpointer key, gpointer value, gpointer udata) +dq_cancel_local(void *value, void *udata) { struct cancel_context *ctx = udata; dquery_t *dq = value; dquery_check(dq); - g_assert(&dq->qid == key); if ((dq->flags & DQ_F_LOCAL) && dq->sh == ctx->handle) { - ctx->cancelled = g_slist_prepend(ctx->cancelled, dq); + ctx->cancelled = pslist_prepend(ctx->cancelled, dq); } } @@ -2410,17 +2543,17 @@ dq_search_closed(gnet_search_t handle) { struct cancel_context ctx; - GSList *sl; + pslist_t *sl; ctx.handle = handle; ctx.cancelled = NULL; - g_hash_table_foreach(dqueries, dq_cancel_local, &ctx); + hevset_foreach(dqueries, dq_cancel_local, &ctx); - GM_SLIST_FOREACH(ctx.cancelled, sl) { + PSLIST_FOREACH(ctx.cancelled, sl) { dq_free(sl->data); } - gm_slist_free_null(&ctx.cancelled); + pslist_free_null(&ctx.cancelled); } /** @@ -2435,12 +2568,12 @@ * @return TRUE if the query is still active, FALSE if it does not exist * any more, in which case nothing is returned into `wanted'. */ -gboolean -dq_get_results_wanted(const struct guid *muid, guint32 *wanted) +bool +dq_get_results_wanted(const struct guid *muid, uint32 *wanted) { dquery_t *dq; - dq = g_hash_table_lookup(by_muid, muid); + dq = htable_lookup(by_muid, muid); if (dq == NULL) return FALSE; @@ -2449,7 +2582,7 @@ if (dq->flags & DQ_F_USR_CANCELLED) *wanted = 0; else { - guint32 kept = dq_kept_results(dq); + uint32 kept = dq_kept_results(dq); /* * d->kept_results is the true amount of total results they got, which @@ -2482,13 +2615,15 @@ /** * Initialize dynamic querying. */ -G_GNUC_COLD void +void G_COLD dq_init(void) { - dqueries = g_hash_table_new(nid_hash, nid_equal); - by_node_id = g_hash_table_new(nid_hash, nid_equal); - by_muid = g_hash_table_new(guid_hash, guid_eq); - by_leaf_muid = g_hash_table_new(guid_hash, guid_eq); + dqueries = hevset_create_any( + offsetof(struct dquery, qid), nid_hash, nid_hash2, nid_equal); + by_node_id = htable_create_any(nid_hash, nid_hash2, nid_equal); + by_muid = htable_create(HASH_KEY_FIXED, GUID_RAW_SIZE); + by_leaf_muid = hikset_create( + offsetof(struct dquery, lmuid), HASH_KEY_FIXED, GUID_RAW_SIZE); fill_hosts(); } @@ -2496,12 +2631,11 @@ * Hashtable iteration callback to free the dquery_t object held as the key. */ static void -free_query(gpointer key, gpointer value, gpointer unused_udata) +free_query(void *value, void *unused_udata) { dquery_t *dq = value; dquery_check(dq); - g_assert(&dq->qid == key); (void) unused_udata; dq->flags |= DQ_F_EXITING; /* So nothing is removed from the table */ @@ -2514,16 +2648,16 @@ * there should not be anything remaining, hence warn! */ static void -free_query_list(gpointer key, gpointer value, gpointer unused_udata) +free_query_list(const void *key, void *value, void *unused_udata) { - GSList *sl, *list = value; - int count = g_slist_length(list); + pslist_t *sl, *list = value; + int count = pslist_length(list); (void) unused_udata; g_warning("remained %d un-freed dynamic quer%s for node #%u", - count, count == 1 ? "y" : "ies", GPOINTER_TO_UINT(key)); + count, plural_y(count), GPOINTER_TO_UINT(key)); - GM_SLIST_FOREACH(list, sl) { + PSLIST_FOREACH(list, sl) { dquery_t *dq = sl->data; dquery_check(dq); @@ -2532,7 +2666,7 @@ dq_free(dq); } - g_slist_free(list); + pslist_free(list); } /** @@ -2541,7 +2675,7 @@ * anything remaining, hence warn! */ static void -free_muid(gpointer key, gpointer unused_value, gpointer unused_udata) +free_muid(const void *key, void *unused_value, void *unused_udata) { (void) unused_value; (void) unused_udata; @@ -2557,31 +2691,32 @@ * anything remaining, hence warn! */ static void -free_leaf_muid(gpointer key, gpointer unused_value, gpointer unused_udata) +free_leaf_muid(void *value, void *unused_udata) { - (void) unused_value; + const dquery_t *dq = value; + (void) unused_udata; g_warning("remained un-freed leaf MUID \"%s\" in dynamic queries", - guid_hex_str(key)); + guid_hex_str(dq->lmuid)); } /** * Cleanup data structures used by dynamic querying. */ -G_GNUC_COLD void +void G_COLD dq_close(void) { - g_hash_table_foreach(dqueries, free_query, NULL); - gm_hash_table_destroy_null(&dqueries); + hevset_foreach(dqueries, free_query, NULL); + hevset_free_null(&dqueries); - g_hash_table_foreach(by_node_id, free_query_list, NULL); - gm_hash_table_destroy_null(&by_node_id); + htable_foreach(by_node_id, free_query_list, NULL); + htable_free_null(&by_node_id); - g_hash_table_foreach(by_muid, free_muid, NULL); - gm_hash_table_destroy_null(&by_muid); + htable_foreach(by_muid, free_muid, NULL); + htable_free_null(&by_muid); - g_hash_table_foreach(by_leaf_muid, free_leaf_muid, NULL); - gm_hash_table_destroy_null(&by_leaf_muid); + hikset_foreach(by_leaf_muid, free_leaf_muid, NULL); + hikset_free_null(&by_leaf_muid); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/dq.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/dq.h
Changed
@@ -55,16 +55,16 @@ void dq_close(void); void dq_launch_net(struct gnutella_node *n, - struct query_hashvec *qhv, unsigned media_mask); + struct query_hashvec *qhv, const search_request_info_t *sri); void dq_node_removed(const struct nid *node_id); -gboolean dq_got_results(const struct guid *muid, guint count, guint32 status); -gboolean dq_oob_results_ind(const struct guid *muid, int count); -void dq_oob_results_got(const struct guid *muid, guint count); +bool dq_got_results(const struct guid *muid, uint count, uint32 status); +bool dq_oob_results_ind(const struct guid *muid, int count); +void dq_oob_results_got(const struct guid *muid, uint count); void dq_got_query_status(const struct guid *muid, const struct nid *node_id, - guint16 kept); + uint16 kept); void dq_launch_local(gnet_search_t handle, pmsg_t *mb, query_hashvec_t *qhv); void dq_search_closed(gnet_search_t handle); -gboolean dq_get_results_wanted(const struct guid *muid, guint32 *wanted); +bool dq_get_results_wanted(const struct guid *muid, uint32 *wanted); #endif /* _core_dq_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/dump.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/dump.c
Changed
@@ -1,6 +1,6 @@ /* - * Copyright (c) 2009, Raphael Manfredi - * Copyright (c) 2006, Christian Biere + * Copyright (c) 2009, 2012 Raphael Manfredi + * Copyright (c) 2006 Christian Biere * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,8 +28,63 @@ * * Traffic dumping, for later analysis with barracuda. * + * To use traffic dumping, one needs to create named pipes in the + * configuration directory (~/.gtk-gnutella, usually). + * + * When told to dump data, gtk-gnutella opens the corresponding named + * pipe for writing, the user needing to open it for reading to get + * the traffic dumps. + * + * Dumping is non-blocking and automatically stops when the pipe becomes + * full, meaning the reader stopped or cannot extract data fast enough. + * + * Two properties (which can be set through a shell command) are governing + * whether traffic dumping should be done, with explicit names: + * + * dump_received_gnutella_packets + * dump_transmitted_gnutella_packets + * + * Because indiscriminate traffic dumping can create a lot of output, three + * additional properties are used (RX = receive, TX = transmit): + * + * dump_rx_addrs + * dump_tx_from_addrs + * dump_tx_to_addrs + * + * These contain a comma-separated list of IP addresses that are used to + * filter traffic: only traffic sent to or originating from the listed + * addresses (depending on whether we're filtering for TX or RX) is dumped. + * An empty set means no filtering is done at all, i.e. everything is logged. + * + * When dumping TX traffic, we can filter on both from/to, but RX traffic + * can only be filtered on its from address. This is because RX traffic is + * dumped just after being received and before we know the fate of the packet, + * whereas TX traffic is dumped when the packet is sent out, at which time we + * know both its origin and its destination. + * + * Dumps are made with a header, hence one must use "barracuda -D" to + * post-process the logs. + * + * Here is a sample traffic dumping session: + * + * # create the named pipes + * mknod ~/.gtk-gnutella/packets_rx.dump p + * mknod ~/.gtk-gnutella/packets_tx.dump p + * + * # prepare TX traffic reading + * gzip -9 <~/.gtk-gnutella/packets_tx.dump >traffic.gz + * + * # request gtk-gnutella dumpping + * echo set dump_transmitted_gnutella_packets TRUE | gtk-gnutella --shell + * + * # when done, hit ^C and post-process with barracuda + * gzcat traffic.gz | barracuda -D | less + * + * # to cleanly stop dumps, use this instead of hitting ^C + * echo set dump_transmitted_gnutella_packets FALSE | gtk-gnutella --shell + * * @author Raphael Manfredi - * @date 2009 + * @date 2009, 2012 * @author Christian Biere * @date 2006 */ @@ -42,6 +97,7 @@ #include "lib/fd.h" #include "lib/file.h" #include "lib/halloc.h" +#include "lib/ipset.h" #include "lib/path.h" #include "lib/pmsg.h" #include "lib/slist.h" @@ -51,10 +107,12 @@ #include "lib/override.h" /* Must be the last header included */ +#define DUMP_BUFFER_MAX (256 * 1024UL) /* Max amount we keep in memory */ + /** * Barracuda header flags. */ -enum dump_header_flags { +enum dump_header_flags { DH_F_UDP = (1 << 0), DH_F_TCP = (1 << 1), DH_F_IPV4 = (1 << 2), @@ -76,7 +134,7 @@ * uint8_t addr16; * uint8_t port2; */ - guchar data19; + uchar data19; }; /** @@ -85,7 +143,7 @@ struct dump { const char * const filename; slist_t *slist; - const gboolean *dump_var; + const bool *dump_var; size_t fill; int fd; int initialized; @@ -112,11 +170,15 @@ PROP_DUMP_TRANSMITTED_GNUTELLA_PACKETS, /* dump_property */ }; +static ipset_t dump_rx_addrs = IPSET_INIT; +static ipset_t dump_tx_from_addrs = IPSET_INIT; +static ipset_t dump_tx_to_addrs = IPSET_INIT; + /** * Fill dump header with node address information. */ static void -dump_header_set(struct dump_header *dh, const struct gnutella_node *node) +dump_header_set(struct dump_header *dh, const gnutella_node_t *node) { ZERO(dh); @@ -124,8 +186,8 @@ switch (host_addr_net(node->addr)) { case NET_TYPE_IPV4: { - guint32 ip; - + uint32 ip; + dh->data0 |= DH_F_IPV4; ip = host_addr_ipv4(node->addr); poke_be32(&dh->data1, ip); @@ -153,7 +215,7 @@ if (dump->fd >= 0) fd_close(&dump->fd); - + dump->initialized = FALSE; if (*dump->dump_var) gnet_prop_set_boolean_val(dump->dump_property, FALSE); @@ -164,7 +226,7 @@ * * @return TRUE if initialized. */ -static gboolean +static bool dump_initialize(struct dump *dump) { char *pathname; @@ -231,7 +293,7 @@ dump->filename); dump_disable(dump); } - if (dump->fill >= 256 * 1024UL) { + if (dump->fill >= DUMP_BUFFER_MAX) { g_warning( "queue is full: %s -- disabling dumping", dump->filename); dump_disable(dump); @@ -254,13 +316,18 @@ * Dump packet received from node. */ static void -dump_packet_from(struct dump *dump, const struct gnutella_node *node) +dump_packet_from(struct dump *dump, const gnutella_node_t *node) { - struct dump_header dh; + struct dump_header dh; + + g_assert(node != NULL); if (!dump_initialize(dump)) return; + if (!ipset_contains_addr(&dump_rx_addrs, node->addr, TRUE)) + return; + dump_header_set(&dh, node); dump_append(dump, dh.data, sizeof dh.data); dump_append(dump, node->header, sizeof node->header); @@ -274,11 +341,11 @@ */ static void dump_packet_from_to(struct dump *dump, - const struct gnutella_node *from, const struct gnutella_node *to, + const gnutella_node_t *from, const gnutella_node_t *to, const pmsg_t *mb) { - struct dump_header dh_to; - struct dump_header dh_from; + struct dump_header dh_to; + struct dump_header dh_from; g_assert(to != NULL); g_assert(mb != NULL); @@ -294,13 +361,20 @@ if (GTA_MSG_DHT == gnutella_header_get_function(pmsg_start(mb))) return; + if (!ipset_contains_addr(&dump_tx_to_addrs, to->addr, TRUE)) + return; + if (NULL == from) { - struct gnutella_node local; + gnutella_node_t local; local.peermode = NODE_IS_UDP(to) ? NODE_P_UDP : NODE_P_NORMAL; local.addr = listen_addr(); local.port = GNET_PROPERTY(listen_port); + if (!ipset_contains_addr(&dump_tx_from_addrs, local.addr, TRUE)) + return; dump_header_set(&dh_from, &local); } else { + if (!ipset_contains_addr(&dump_tx_from_addrs, from->addr, TRUE)) + return; dump_header_set(&dh_from, from); } @@ -308,7 +382,7 @@ dh_to.data0 |= DH_F_TO; if (pmsg_prio(mb) != PMSG_P_DATA) dh_to.data0 |= DH_F_CTRL; - + dump_append(dump, dh_to.data, sizeof dh_to.data); dump_append(dump, dh_from.data, sizeof dh_from.data); dump_append(dump, pmsg_read_base(mb), pmsg_size(mb)); @@ -319,7 +393,7 @@ * Dump packet received from node. */ void -dump_rx_packet(const struct gnutella_node *node) +dump_rx_packet(const gnutella_node_t *node) { if (GNET_PROPERTY(dump_received_gnutella_packets)) { dump_packet_from(&dump_rx, node); @@ -334,7 +408,7 @@ */ void dump_tx_tcp_packet( - const struct gnutella_node *from, const struct gnutella_node *to, + const gnutella_node_t *from, const gnutella_node_t *to, const pmsg_t *mb) { if (GNET_PROPERTY(dump_transmitted_gnutella_packets)) { @@ -355,7 +429,7 @@ dump_tx_udp_packet(const gnet_host_t *to, const pmsg_t *mb) { if (GNET_PROPERTY(dump_transmitted_gnutella_packets)) { - struct gnutella_node udp; + gnutella_node_t udp; g_assert(to != NULL); g_assert(mb != NULL); @@ -376,6 +450,31 @@ } /** + * Dump RX traffic coming from listed addresses, all addresses if empty. + */ +void +dump_rx_set_addrs(const char *s) +{ + ipset_set_addrs(&dump_rx_addrs, s); +} + +/** + * Dump TX traffic coming from listed addresses, all addresses if empty. + */ +void dump_tx_set_from_addrs(const char *s) +{ + ipset_set_addrs(&dump_tx_from_addrs, s); +} + +/** + * Dump TX traffic sent to listed addresses, all addresses if empty. + */ +void dump_tx_set_to_addrs(const char *s) +{ + ipset_set_addrs(&dump_tx_to_addrs, s); +} + +/** * Initialize traffic dumping. */ void @@ -394,6 +493,10 @@ dump_disable(&dump_rx); if (dump_tx.initialized) dump_disable(&dump_tx); + + ipset_clear(&dump_rx_addrs); + ipset_clear(&dump_tx_from_addrs); + ipset_clear(&dump_tx_to_addrs); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/dump.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/dump.h
Changed
@@ -46,6 +46,10 @@ const struct gnutella_node *to, const pmsg_t *mb); void dump_tx_udp_packet(const gnet_host_t *to, const pmsg_t *mb); +void dump_rx_set_addrs(const char *s); +void dump_tx_set_from_addrs(const char *s); +void dump_tx_set_to_addrs(const char *s); + void dump_init(void); void dump_close(void);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/extensions.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/extensions.c
Changed
@@ -39,13 +39,16 @@ #include "extensions.h" #include "ggep.h" -#include "lib/atoms.h" #include "lib/ascii.h" -#include "lib/glib-missing.h" -#include "lib/stringify.h" +#include "lib/atoms.h" #include "lib/halloc.h" +#include "lib/htable.h" #include "lib/log.h" +#include "lib/mempcpy.h" +#include "lib/str.h" +#include "lib/stringify.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ #include "if/gnet_property_priv.h" @@ -97,16 +100,16 @@ typedef struct extdesc { const char *ext_phys_payload; /**< Start of payload buffer */ const char *ext_payload; /**< "virtual" payload */ - guint16 ext_phys_len; /**< Extension length (header + payload) */ - guint16 ext_phys_paylen; /**< Extension payload length */ - guint16 ext_paylen; /**< "virtual" payload length */ - guint16 ext_rpaylen; /**< Length of buffer for "virtual" payload */ + uint16 ext_phys_len; /**< Extension length (header + payload) */ + uint16 ext_phys_paylen; /**< Extension payload length */ + uint16 ext_paylen; /**< "virtual" payload length */ + uint16 ext_rpaylen; /**< Length of buffer for "virtual" payload */ union { struct { - gboolean extu_cobs; /**< Payload is COBS-encoded */ - gboolean extu_deflate; /**< Payload is deflated */ - const char *extu_id; /**< Extension ID */ + bool extu_cobs; /**< Payload is COBS-encoded */ + bool extu_deflate; /**< Payload is deflated */ + const char *extu_id; /**< Extension ID */ } extu_ggep; } ext_u; @@ -153,6 +156,9 @@ static const struct rwtable urntable = { { "bitprint", EXT_T_URN_BITPRINT }, + { "btih", EXT_T_URN_BTIH }, + { "ed2khash", EXT_T_URN_ED2KHASH }, + { "md5", EXT_T_URN_MD5 }, { "sha1", EXT_T_URN_SHA1 }, { "ttroot", EXT_T_URN_TTH }, }; @@ -254,8 +260,8 @@ * @return the keyword token value upon success, EXT_T_UNKNOWN if not found. * If keyword was found, its static shared string is returned in `retkw'. */ -static G_GNUC_HOT ext_token_t -rw_screen(gboolean case_sensitive, +static ext_token_t G_HOT +rw_screen(bool case_sensitive, const struct rwtable *table, size_t size, const char *word, const char **retkw) { @@ -286,7 +292,7 @@ /** * Ensure the reserved-word table is lexically sorted. */ -static G_GNUC_COLD void +static void G_COLD rw_is_sorted(const char *name, const struct rwtable *table, size_t size) { @@ -327,7 +333,7 @@ { ext_token_t t; - t = rw_screen(TRUE, ggeptable, G_N_ELEMENTS(ggeptable), word, retkw); + t = rw_screen(TRUE, ggeptable, N_ITEMS(ggeptable), word, retkw); return (t == EXT_T_UNKNOWN) ? EXT_T_UNKNOWN_GGEP : t; } @@ -341,7 +347,7 @@ { ext_token_t t; - t = rw_screen(FALSE, urntable, G_N_ELEMENTS(urntable), word, retkw); + t = rw_screen(FALSE, urntable, N_ITEMS(urntable), word, retkw); return EXT_T_UNKNOWN == t ? EXT_T_URN_UNKNOWN : t; } @@ -350,7 +356,7 @@ *** Extension name atoms. ***/ -static GHashTable *ext_names = NULL; +static htable_t *ext_names = NULL; /** * Transform the name into a printable form. @@ -367,7 +373,7 @@ * Look whether we already known about this name. */ - atom = g_hash_table_lookup(ext_names, name); + atom = htable_lookup(ext_names, name); if (atom != NULL) return atom; @@ -383,7 +389,7 @@ key = wcopy(name, 1 + strlen(name)); atom = hex_escape(key, TRUE); /* strict escaping */ - g_hash_table_insert(ext_names, key, atom); + htable_insert(ext_names, key, atom); return atom; } @@ -391,17 +397,15 @@ /** * Callback for freeing entries in the `ext_names' hash table. */ -static gboolean -ext_names_kv_free(gpointer key, gpointer value, gpointer unused_udata) +static void +ext_names_kv_free(const void *key, void *value, void *unused_udata) { (void) unused_udata; if (key != value) HFREE_NULL(value); - wfree(key, 1 + strlen(key)); - - return TRUE; + wfree(deconstify_pointer(key), 1 + strlen(key)); } /*** @@ -425,7 +429,7 @@ /** * Parses a GGEP block (can hold several extensions). */ -static G_GNUC_HOT int +static int G_HOT ext_ggep_parse(const char **retp, int len, extvec_t *exv, int exvcnt) { const char *p = *retp; @@ -434,10 +438,10 @@ int count; for (count = 0; count < exvcnt && p < end; /* empty */) { - guchar flags; + uchar flags; char idGGEP_F_IDLEN + 1; - guint id_len, data_length, i; - gboolean length_ended = FALSE; + uint id_len, data_length, i; + bool length_ended = FALSE; const char *name; extdesc_t *d; @@ -447,7 +451,7 @@ * First byte is GGEP flags. */ - flags = (guchar) *p++; + flags = (uchar) *p++; if (flags & GGEP_F_MBZ) /* A byte that Must Be Zero is set */ goto abort; @@ -475,7 +479,7 @@ int c = *p++; if (c == '\0' || !isascii(c) || is_ascii_cntrl(c)) goto abort; - idi = c; + idi = c; } idi = '\0'; @@ -485,7 +489,7 @@ data_length = 0; for (i = 0; i < 3 && p < end; i++) { - guchar b = *p++; + uchar b = *p++; /* * Either GGEP_L_CONT or GGEP_L_LAST must be set, thereby @@ -523,7 +527,7 @@ */ if (flags & (GGEP_F_COBS|GGEP_F_DEFLATE)) { - guint d_len = data_length; + uint d_len = data_length; if (flags & GGEP_F_COBS) { if (d_len == 0 || !cobs_is_valid(p, d_len)) @@ -532,7 +536,7 @@ } if (flags & GGEP_F_DEFLATE) { - guint offset = 0; + uint offset = 0; if (d_len < 6) goto abort; @@ -548,7 +552,7 @@ */ if (flags & GGEP_F_COBS) { - if ((guchar) *p < 3) + if ((uchar) *p < 3) goto abort; offset = 1; /* Skip leading byte */ } @@ -730,25 +734,32 @@ /* * Some broken servents don't include the trailing ':', which is a * mistake. Try to accomodate them by looking up the next HUGE - * field separator. + * or GGEP field separator. */ - if (NULL == name_end) { + if G_UNLIKELY(NULL == name_end) { name_end = memchr(p, HUGE_FS, end - name_start); + if (NULL == name_end) + name_end = memchr(p, GGEP_MAGIC, end - name_start); } name_len = (name_end != NULL) ? name_end - name_start : 0; - if (0 == name_len) { + if G_UNLIKELY(0 == name_len) { return 0; /* No sperator found, extension is weird */ } else if (name_len >= sizeof name_buf) { /* We shall treat this URN extension as being unknown */ token = EXT_T_URN_UNKNOWN; } else { + char *nend; /* Lookup the name token to determine the URN type */ - memcpy(name_buf, name_start, name_len); - name_bufname_len = '\0'; + nend = mempcpy(name_buf, name_start, name_len); + *nend = '\0'; token = rw_urn_screen(name_buf, &name); + + if (EXT_T_URN_UNKNOWN == token && GNET_PROPERTY(ggep_debug)) { + g_info("unknown URN name \"%s\" in HUGE extension", name_buf); + } } p = &name_end1; /* Skip the ':' following the URN name */ } @@ -761,7 +772,7 @@ payload_start = p; for (/* NOTHING*/; p < end; p++) { - guchar c = *p; + uchar c = *p; if (!(is_ascii_alnum(c) || '.' == c) || c == GGEP_MAGIC) { break; } @@ -810,7 +821,7 @@ g_assert(exv->opaque == NULL); for (/* NOTHING */; p != end; p++) { - guchar c = *p; + uchar c = *p; if (c == '\0' || c == HUGE_FS) { break; } @@ -850,12 +861,12 @@ */ static int ext_unknown_parse(const char **retp, int len, extvec_t *exv, - int exvcnt, gboolean skip) + int exvcnt, bool skip) { const char *p = *retp; const char *lastp = p; /* Last parsed point */ extdesc_t *d; - gboolean separator = FALSE; + bool separator = FALSE; g_assert(exvcnt > 0); g_assert(exv->opaque == NULL); @@ -866,9 +877,9 @@ */ for (/* NOTHING*/; len > 0; p++, len--) { - gboolean found; + bool found; - switch ((guchar) *p) { + switch ((uchar) *p) { case '\0': case HUGE_FS: separator = TRUE; @@ -881,12 +892,12 @@ found = len >= 4 && is_strcaseprefix(p, "urn:"); break; case '<': - found = len >= 2 && is_ascii_alpha((guchar) p1); + found = len >= 2 && is_ascii_alpha((uchar) p1); break; default: found = FALSE; } - + if (found) { if (skip) { skip = FALSE; @@ -942,7 +953,7 @@ g_assert(exv->opaque == NULL); for (/* NOTHING */; p != end; p++) { - guchar c = *p; + uchar c = *p; if (c != '\0' && c != HUGE_FS) break; } @@ -988,7 +999,7 @@ const char *end; const char *nend; const char *nbase; - guint16 added; + uint16 added; extdesc_t *d = exv->opaque; extdesc_t *nd = next->opaque; @@ -1050,7 +1061,7 @@ * * @return the number of filled entries. */ -static G_GNUC_HOT int +static int G_HOT ext_parse_buffer(const char *buf, size_t len, int flags, extvec_t *exv, int exvcnt, char **endptr) { @@ -1075,7 +1086,7 @@ * that predate GGEP (HUGE and XML) and were not properly encapsulated. */ - switch ((guchar) *p) { + switch ((uchar) *p) { case GGEP_MAGIC: p++; if (p == end) @@ -1115,7 +1126,7 @@ g_assert(found == 0 || p != old_p); if (found == 0) { - g_assert((guchar) *old_p == GGEP_MAGIC || p == old_p); + g_assert((uchar) *old_p == GGEP_MAGIC || p == old_p); /* * If we were initially on a GGEP magic byte, and since we did @@ -1123,7 +1134,7 @@ * about to skip the first synchronization point... */ - if ((guchar) *old_p == GGEP_MAGIC) { + if ((uchar) *old_p == GGEP_MAGIC) { p--; g_assert(p == old_p); } @@ -1171,7 +1182,7 @@ out: if (endptr != NULL) - *endptr = deconstify_gpointer(p); /* Beyond what we parsed */ + *endptr = deconstify_pointer(p); /* Beyond what we parsed */ return cnt; } @@ -1224,7 +1235,7 @@ if (len <= 2) return NULL; /* Cannot hold a valid GGEP block in so few bytes */ - ext_prepare(exv, G_N_ELEMENTS(exv)); + ext_prepare(exv, N_ITEMS(exv)); while (p < end) { const char *old_p = p; @@ -1232,32 +1243,32 @@ g_assert(len > 0); - switch ((guchar) *p) { + switch ((uchar) *p) { case GGEP_MAGIC: p++; if (p == end) return NULL; /* Cannot possibly be a GGEP block */ - return deconstify_gpointer(p); /* Start of GGEP data */ + return deconstify_pointer(p); /* Start of GGEP data */ case 'u': case 'U': - found = ext_huge_parse(&p, len, exv, G_N_ELEMENTS(exv)); + found = ext_huge_parse(&p, len, exv, N_ITEMS(exv)); break; case '<': - found = ext_xml_parse(&p, len, exv, G_N_ELEMENTS(exv)); + found = ext_xml_parse(&p, len, exv, N_ITEMS(exv)); break; case HUGE_FS: case '\0': p++; if (p == end) return NULL; - found = ext_none_parse(&p, len-1, exv, G_N_ELEMENTS(exv)); + found = ext_none_parse(&p, len-1, exv, N_ITEMS(exv)); if (!found) { len--; continue; /* Single separator, no bloat then */ } break; default: - found = ext_unknown_parse(&p, len, exv, G_N_ELEMENTS(exv), FALSE); + found = ext_unknown_parse(&p, len, exv, N_ITEMS(exv), FALSE); break; } @@ -1270,16 +1281,16 @@ if (found == 0) { g_assert(p == old_p); - found = ext_unknown_parse(&p, len, exv, G_N_ELEMENTS(exv), TRUE); + found = ext_unknown_parse(&p, len, exv, N_ITEMS(exv), TRUE); } g_assert(found > 0); - g_assert(UNSIGNED(found) <= G_N_ELEMENTS(exv)); + g_assert(UNSIGNED(found) <= N_ITEMS(exv)); g_assert(p != old_p); len -= p - old_p; - ext_reset(exv, G_N_ELEMENTS(exv)); + ext_reset(exv, N_ITEMS(exv)); } return NULL; /* Did not find any GGEP start */ @@ -1299,7 +1310,7 @@ */ static int ext_ggep_stripkey(char *buf, int len, const char *key, - const char **endptr, gboolean *emptied) + const char **endptr, bool *emptied) { char *p = buf; const char *end = &buflen; @@ -1315,17 +1326,17 @@ *emptied = FALSE; while (p < end) { - guchar flags; + uchar flags; char idGGEP_F_IDLEN + 1; - guint id_len, data_length, i; - gboolean length_ended = FALSE; + uint id_len, data_length, i; + bool length_ended = FALSE; char *cur_flags = p; /* This is the start of the key/value pair */ /* * First byte is GGEP flags. */ - flags = (guchar) *p++; + flags = (uchar) *p++; if (flags & GGEP_F_MBZ) /* A byte that Must Be Zero is set */ goto abort; @@ -1353,7 +1364,7 @@ int c = *p++; if (c == '\0' || !isascii(c) || is_ascii_cntrl(c)) goto abort; - idi = c; + idi = c; } idi = '\0'; @@ -1363,7 +1374,7 @@ data_length = 0; for (i = 0; i < 3 && p < end; i++) { - guchar b = *p++; + uchar b = *p++; /* * Either GGEP_L_CONT or GGEP_L_LAST must be set, thereby @@ -1486,7 +1497,7 @@ while (NULL != (p = ext_ggep_nextblock(start, end - start))) { const char *endp; - gboolean emptied; + bool emptied; int newlen; int stripped; @@ -1502,7 +1513,7 @@ end -= stripped; g_assert(endp <= end); - start = deconstify_gpointer(endp); + start = deconstify_pointer(endp); /* * If GGEP block was completely emptied, remove the GGEP marker. @@ -1512,7 +1523,7 @@ char *q = p - 1; /* GGEP Magic */ g_assert(q >= buf); - g_assert(GGEP_MAGIC == *(guchar *) q); + g_assert(GGEP_MAGIC == *(uchar *) q); memmove(q, p, end - p); end--; @@ -1534,7 +1545,7 @@ (start == end || HUGE_FS == *start || '\0' == *start) ) { char *r = q - 1; /* Char before GGEP magic */ - + g_assert(r >= buf); if (HUGE_FS == *r) { @@ -1556,8 +1567,8 @@ int newlen = end - buf; g_debug("GGEP stripping of \"%s\" in %u block%s removed %d bytes " "(emptied %u block%s)", - key, blocks, 1 == blocks ? "" : "s", len - newlen, - removed, 1 == removed ? "" : "s"); + key, blocks, plural(blocks), len - newlen, + removed, plural(removed)); } return end - buf; @@ -1571,14 +1582,14 @@ * or NULL on error. */ static char * -ext_ggep_inflate(const char *buf, int len, guint16 *retlen, const char *name) +ext_ggep_inflate(const char *buf, int len, uint16 *retlen, const char *name) { char *result; /* Inflated buffer */ int rsize; /* Result's buffer size */ z_streamp inz; int ret; int inflated; /* Amount of inflated data so far */ - gboolean failed = FALSE; + bool failed = FALSE; g_assert(buf); g_assert(len > 0); @@ -1611,7 +1622,7 @@ * Prepare call to inflate(). */ - inz->next_in = (gpointer) buf; + inz->next_in = (void *) buf; inz->avail_in = len; inflated = 0; @@ -1627,7 +1638,7 @@ if (GNET_PROPERTY(ggep_debug)) { g_warning("GGEP payload \"%s\" (%d byte%s) would " "decompress to more than %d bytes", - name, len, 1 == len ? "" : "s", GGEP_MAXLEN); + name, len, plural(len), GGEP_MAXLEN); } failed = TRUE; break; @@ -1641,7 +1652,7 @@ g_assert(rsize > inflated); - inz->next_out = (guchar *) result + inflated; + inz->next_out = (uchar *) result + inflated; inz->avail_out = rsize - inflated; /* @@ -1656,7 +1667,7 @@ if (ret == Z_STREAM_END) { /* All done! */ if (GNET_PROPERTY(ggep_debug) > 3) { g_info("GGEP payload \"%s\" inflated %d byte%s into %d", - name, len, 1 == len ? "" : "s", inflated); + name, len, plural(len), inflated); } break; } @@ -1668,8 +1679,7 @@ if (GNET_PROPERTY(ggep_debug)) { g_warning("GGEP payload \"%s\" does not decompress properly " "(consumed %d/%d byte%s inflated into %d)", - name, len - inz->avail_in, len, 1 == len ? "" : "s", - inflated); + name, len - inz->avail_in, len, plural(len), inflated); } failed = TRUE; break; @@ -1679,7 +1689,7 @@ if (GNET_PROPERTY(ggep_debug)) { g_warning("decompression of GGEP payload \"%s\"" " (%d byte%s) failed: %s consumed %d, inflated into %d", - name, len, 1 == len ? "" : "s", zlib_strerror(ret), + name, len, plural(len), zlib_strerror(ret), len - inz->avail_in, inflated); } failed = TRUE; @@ -1716,7 +1726,7 @@ if (GNET_PROPERTY(ggep_debug) > 5) { g_debug("decompressed GGEP payload \"%s\" (%d byte%s) into %d", - name, len, 1 == len ? "" : "s", inflated); + name, len, plural(len), inflated); } return result; /* OK, successfully inflated */ @@ -1829,7 +1839,7 @@ /** * @returns a pointer to the extension's payload. */ -gconstpointer +const void * ext_payload(const extvec_t *e) { extdesc_t *d = e->opaque; @@ -1846,9 +1856,9 @@ } /** - * @returns a pointer to the extension's payload length. + * @returns the extension's payload length (after possible decompression). */ -guint16 +uint16 ext_paylen(const extvec_t *e) { extdesc_t *d = e->opaque; @@ -1865,6 +1875,19 @@ } /** + * @returns the extension's payload physical length (as transmitted). + */ +static uint16 +ext_phys_paylen(const extvec_t *e) +{ + extdesc_t *d = e->opaque; + + g_assert(e->opaque != NULL); + + return d->ext_phys_paylen; +} + +/** * @returns a pointer to the extension's header. * * @warning the actual "virtual" payload may not be contiguous to the end @@ -1884,7 +1907,7 @@ /** * @returns the length of the extensions's header. */ -guint16 +uint16 ext_headlen(const extvec_t *e) { extdesc_t *d = e->opaque; @@ -1897,7 +1920,7 @@ /** * @returns the total length of the extension (payload + extension header). */ -guint16 +uint16 ext_len(const extvec_t *e) { extdesc_t *d = e->opaque; @@ -1922,8 +1945,11 @@ { switch (e->ext_token) { case EXT_T_URN_BITPRINT: return "urn:bitprint"; + case EXT_T_URN_BTIH: return "urn:btih"; case EXT_T_URN_SHA1: return "urn:sha1"; case EXT_T_URN_TTH: return "urn:ttroot"; + case EXT_T_URN_ED2KHASH: return "urn:ed2khash"; + case EXT_T_URN_MD5: return "urn:md5"; case EXT_T_URN_EMPTY: return "urn"; case EXT_T_URN_UNKNOWN: return "urn:*"; /* Parsed but unknown */ default: return ""; @@ -1949,7 +1975,7 @@ /** * @return whether GGEP extension is deflated. */ -gboolean +bool ext_ggep_is_deflated(const extvec_t *e) { extdesc_t *d = e->opaque; @@ -1965,10 +1991,10 @@ /** * @return TRUE if extension is printable. */ -gboolean +bool ext_is_printable(const extvec_t *e) { - const guchar *p = ext_payload(e); + const uchar *p = ext_payload(e); size_t len; for (len = ext_paylen(e); len > 0; len--, p++) { @@ -1981,10 +2007,10 @@ /** * @return TRUE if extension is ASCII. */ -gboolean +bool ext_is_ascii(const extvec_t *e) { - const guchar *p = ext_payload(e); + const uchar *p = ext_payload(e); size_t len; for (len = ext_paylen(e); len > 0; len--, p++) { @@ -1997,12 +2023,12 @@ /** * @return TRUE if extension is ASCII and contains at least a character. */ -gboolean +bool ext_has_ascii_word(const extvec_t *e) { - const guchar *p = ext_payload(e); + const uchar *p = ext_payload(e); size_t len; - gboolean has_alnum = FALSE; + bool has_alnum = FALSE; for (len = ext_paylen(e); len > 0; len--, p++) { if (!isascii(*p)) @@ -2025,7 +2051,7 @@ g_assert(buf != NULL); g_assert(size_is_non_negative(len)); - rw = gm_snprintf(buf, len, "%s ", extypee->ext_type); + rw = str_bprintf(buf, len, "%s ", extypee->ext_type); switch (e->ext_type) { case EXT_UNKNOWN: @@ -2039,30 +2065,31 @@ case EXT_T_URN_BITPRINT: case EXT_T_URN_SHA1: case EXT_T_URN_TTH: + case EXT_T_URN_ED2KHASH: case EXT_T_URN_UNKNOWN: case EXT_T_URN_EMPTY: what = ext_huge_urn_name(e); break; case EXT_T_URN_BAD: what = "bad URN"; break; default: what = "<unknown>"; break; } - rw += gm_snprintf(&bufrw, len - rw, "%s ", what); + rw += str_bprintf(&bufrw, len - rw, "%s ", what); } break; case EXT_GGEP: { extdesc_t *d = e->opaque; - rw += gm_snprintf(&bufrw, len - rw, "\"%s\" ", d->ext_ggep_id); + rw += str_bprintf(&bufrw, len - rw, "\"%s\" ", d->ext_ggep_id); if (d->ext_ggep_cobs) - rw += gm_snprintf(&bufrw, len - rw, "COBS "); + rw += str_bprintf(&bufrw, len - rw, "COBS "); if (d->ext_ggep_deflate) - rw += gm_snprintf(&bufrw, len - rw, "deflated "); + rw += str_bprintf(&bufrw, len - rw, "deflated "); } break; case EXT_TYPE_COUNT: g_assert_not_reached(); } - rw += gm_snprintf(&bufrw, len - rw, "(%u byte%s)", - ext_paylen(e), 1 == ext_paylen(e) ? "" : "s"); + rw += str_bprintf(&bufrw, len - rw, "(%u byte%s)", + ext_paylen(e), plural(ext_paylen(e))); return rw; } @@ -2084,9 +2111,9 @@ */ static void ext_dump_one(FILE *f, const extvec_t *e, const char *prefix, - const char *postfix, gboolean payload) + const char *postfix, bool payload) { - guint16 paylen; + uint16 paylen, phys_paylen; g_assert(e->ext_type < EXT_TYPE_COUNT); g_assert(e->opaque != NULL); @@ -2101,8 +2128,14 @@ fprintf(f, "\"%s\" ", e->ext_name); paylen = ext_paylen(e); + phys_paylen = ext_phys_paylen(e); - fprintf(f, "%u byte%s", paylen, paylen == 1 ? "" : "s"); + if (paylen == phys_paylen) { + fprintf(f, "%u byte%s", paylen, plural(paylen)); + } else { + fprintf(f, "%u byte%s <%u byte%s>", + paylen, plural(paylen), phys_paylen, plural(phys_paylen)); + } if (e->ext_type == EXT_GGEP) { extdesc_t *d = e->opaque; @@ -2143,7 +2176,7 @@ */ void ext_dump(FILE *fd, const extvec_t *exv, int exvcnt, - const char *prefix, const char *postfix, gboolean payload) + const char *prefix, const char *postfix, bool payload) { int i; @@ -2175,7 +2208,7 @@ ext_reset(extvec_t *exv, int exvcnt) { int i; - + for (i = 0; i < exvcnt; i++) { extvec_t *e = &exvi; extdesc_t *d; @@ -2186,7 +2219,7 @@ d = e->opaque; if (d->ext_payload != NULL && d->ext_payload != d->ext_phys_payload) { - gpointer p = deconstify_gpointer(d->ext_payload); + void *p = deconstify_pointer(d->ext_payload); if (d->ext_rpaylen == 0) { HFREE_NULL(p); } else { @@ -2210,7 +2243,7 @@ g_assert(id >= ggeptable0.rw_token); i = id - ggeptable0.rw_token; - g_assert(i < G_N_ELEMENTS(ggeptable)); + g_assert(i < N_ITEMS(ggeptable)); g_assert(id == ggeptablei.rw_token); return ggeptablei.rw_name; @@ -2226,10 +2259,10 @@ void ext_init(void) { - ext_names = g_hash_table_new(g_str_hash, g_str_equal); + ext_names = htable_create(HASH_KEY_STRING, 0); - rw_is_sorted("ggeptable", ggeptable, G_N_ELEMENTS(ggeptable)); - rw_is_sorted("urntable", urntable, G_N_ELEMENTS(urntable)); + rw_is_sorted("ggeptable", ggeptable, N_ITEMS(ggeptable)); + rw_is_sorted("urntable", urntable, N_ITEMS(urntable)); } /** @@ -2238,8 +2271,8 @@ void ext_close(void) { - g_hash_table_foreach_remove(ext_names, ext_names_kv_free, NULL); - gm_hash_table_destroy_null(&ext_names); + htable_foreach(ext_names, ext_names_kv_free, NULL); + htable_free_null(&ext_names); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/extensions.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/extensions.h
Changed
@@ -65,6 +65,9 @@ typedef enum ext_token { EXT_T_UNKNOWN = 0, /**< Unknown */ EXT_T_URN_BITPRINT, /**< urn:bitprint: */ + EXT_T_URN_BTIH, /**< urn:btih: */ + EXT_T_URN_ED2KHASH, /**< urn:ed2khash: */ + EXT_T_URN_MD5, /**< urn:md5: */ EXT_T_URN_SHA1, /**< urn:sha1: */ EXT_T_URN_TTH, /**< urn:ttroot: */ EXT_T_URN_UNKNOWN, /**< Unknown (but syntactically correct) URN */ @@ -188,7 +191,7 @@ const char *ext_name; /**< Extension name (may be NULL) */ ext_token_t ext_token; /**< Extension token */ ext_type_t ext_type; /**< Extension type */ - gpointer opaque; /**< Internal information */ + void *opaque; /**< Internal information */ } extvec_t; #define MAX_EXTVEC 32 /**< Maximum amount of extensions in vector */ @@ -205,20 +208,20 @@ int ext_parse_nul(const char *buf, int len, char **endptr, extvec_t *, int); void ext_reset(extvec_t *exv, int exvcnt); -gboolean ext_is_printable(const extvec_t *e); -gboolean ext_is_ascii(const extvec_t *e); -gboolean ext_has_ascii_word(const extvec_t *e); +bool ext_is_printable(const extvec_t *e); +bool ext_is_ascii(const extvec_t *e); +bool ext_has_ascii_word(const extvec_t *e); void ext_dump(FILE *fd, const extvec_t *extvec, int extcnt, - const char *prefix, const char *postfix, gboolean payload); + const char *prefix, const char *postfix, bool payload); -gconstpointer ext_payload(const extvec_t *e); -guint16 ext_paylen(const extvec_t *e); +const void *ext_payload(const extvec_t *e); +uint16 ext_paylen(const extvec_t *e); const char *ext_base(const extvec_t *e); -guint16 ext_headlen(const extvec_t *e); -guint16 ext_len(const extvec_t *e); +uint16 ext_headlen(const extvec_t *e); +uint16 ext_len(const extvec_t *e); const char *ext_ggep_id_str(const extvec_t *e); -gboolean ext_ggep_is_deflated(const extvec_t *e); +bool ext_ggep_is_deflated(const extvec_t *e); const char *ext_huge_urn_name(const extvec_t *e); const char *ext_ggep_name(ext_token_t id);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/features.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/features.c
Changed
@@ -40,8 +40,9 @@ #include "lib/ascii.h" #include "lib/header.h" -#include "lib/glib-missing.h" #include "lib/parse.h" +#include "lib/pslist.h" +#include "lib/str.h" #include "lib/walloc.h" #include "lib/override.h" /* Must be the last header included */ @@ -50,22 +51,22 @@ char *name; int major; int minor; - const gboolean *guard; - gboolean (*guardfn)(void); + const bool *guard; + bool (*guardfn)(void); }; struct features { - GList *list; + pslist_t *list; }; -static struct features * +static struct features * features_get(xfeature_t xf) { static struct features featuresNUM_FEATURES; - guint i; + uint i; - i = (guint) xf; - g_return_val_if_fail(i < G_N_ELEMENTS(features), NULL); + i = (uint) xf; + g_return_val_if_fail(i < N_ITEMS(features), NULL); return &featuresi; } @@ -74,31 +75,30 @@ ***/ /** - * Removes all memory used by the header_features_add. + * Removes all memory used by header_features_add(). */ static void header_features_cleanup(xfeature_t xf) { struct features *features; - GList *cur; + pslist_t *cur; features = features_get(xf); g_return_if_fail(features); - cur = g_list_first(features->list); - for (/* NOTHING */; NULL != cur; cur = g_list_next(cur)) { + PSLIST_FOREACH(features->list, cur) { struct header_x_feature *header = cur->data; G_FREE_NULL(header->name); WFREE(header); } - gm_list_free_null(&features->list); + pslist_free_null(&features->list); } void features_close(void) { - guint i; + uint i; for (i = 0; i < NUM_FEATURES; i++) { header_features_cleanup(i); @@ -111,7 +111,7 @@ */ void header_features_add_guarded(xfeature_t xf, - const char *name, int major, int minor, const gboolean *guard) + const char *name, int major, int minor, const bool *guard) { struct header_x_feature *item; struct features *features; @@ -126,16 +126,16 @@ item->guard = guard; item->guardfn = NULL; - features->list = g_list_append(features->list, item); + features->list = pslist_append(features->list, item); } - + /** * Add conditional support for feature ``name'': if at run-time the value * returned by the ``guardfn'' function is FALSE, the feature is not emitted. */ void header_features_add_guarded_function(xfeature_t xf, - const char *name, int major, int minor, gboolean (*guardfn)(void)) + const char *name, int major, int minor, bool (*guardfn)(void)) { struct header_x_feature *item; struct features *features; @@ -150,9 +150,9 @@ item->guard = NULL; item->guardfn = guardfn; - features->list = g_list_append(features->list, item); + features->list = pslist_append(features->list, item); } - + /** * Add support for feature ``name'' with the specified version to the * X-Features header. @@ -178,7 +178,7 @@ { static const char hdr = "X-Features"; struct features *features; - GList *cur; + pslist_t *cur; header_fmt_t *fmt; g_assert(len <= INT_MAX); @@ -191,12 +191,12 @@ features = features_get(xf); g_return_if_fail(features); - if (g_list_first(features->list) == NULL) + if (features->list == NULL) return; fmt = header_fmt_make(hdr, ", ", 0, len - *rw); - for (cur = g_list_first(features->list); cur; cur = g_list_next(cur)) { + PSLIST_FOREACH(features->list, cur) { struct header_x_feature *item = cur->data; char buf50; @@ -206,7 +206,7 @@ if (item->guardfn && !(*item->guardfn)()) continue; - gm_snprintf(buf, sizeof buf, "%s/%d.%d", + str_bprintf(buf, sizeof buf, "%s/%d.%d", item->name, item->major, item->minor); header_fmt_append_value(fmt, buf); @@ -227,9 +227,9 @@ * header, if no support was found both major and minor are 0 and FALSE * is returned. */ -gboolean +bool header_get_feature(const char *name, const header_t *header, - guint *major, guint *minor) + uint *major, uint *minor) { static const char x_features = "X-Features"; char *buf, *start;
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/features.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/features.h
Changed
@@ -42,6 +42,7 @@ FEATURES_DOWNLOADS, FEATURES_UPLOADS, FEATURES_CONNECTIONS, + FEATURES_G2_CONNECTIONS, NUM_FEATURES } xfeature_t; @@ -50,13 +51,13 @@ * Public interface. */ -gboolean header_get_feature(const char *name, const header_t *header, - guint *major, guint *minor); +bool header_get_feature(const char *name, const header_t *header, + uint *major, uint *minor); void header_features_add(xfeature_t xf, const char *name, int major, int minor); void header_features_add_guarded(xfeature_t xf, const char *name, - int major, int minor, const gboolean *guard); + int major, int minor, const bool *guard); void header_features_add_guarded_function(xfeature_t xf, - const char *name, int major, int minor, gboolean (*guardfn)(void)); + const char *name, int major, int minor, bool (*guardfn)(void)); void header_features_generate(xfeature_t xf, char *buf, size_t len, size_t *rw); void features_close(void);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/fileinfo.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/fileinfo.c
Changed
@@ -1,7 +1,7 @@ /* * Copyright (c) 2002-2003, Vidar Madsen * Copyright (c) 2004-2008, Christian Biere - * Copyright (c) 2002-2010, Raphael Manfredi + * Copyright (c) 2002-2012, Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -46,12 +46,10 @@ #include "bsched.h" #include "dmesh.h" #include "downloads.h" -#include "file_object.h" #include "gdht.h" #include "gmsg.h" #include "guid.h" #include "hosts.h" -#include "http.h" /* For http_range_t */ #include "huge.h" #include "namesize.h" #include "nodes.h" @@ -64,29 +62,42 @@ #include "sockets.h" #include "uploads.h" -#include "lib/atoms.h" +#include "lib/array_util.h" #include "lib/ascii.h" +#include "lib/atoms.h" #include "lib/base32.h" #include "lib/concat.h" +#include "lib/eclist.h" #include "lib/endian.h" +#include "lib/entropy.h" #include "lib/fd.h" #include "lib/file.h" +#include "lib/file_object.h" #include "lib/filename.h" +#include "lib/glib-missing.h" #include "lib/halloc.h" #include "lib/header.h" +#include "lib/hikset.h" +#include "lib/htable.h" +#include "lib/http_range.h" #include "lib/idtable.h" #include "lib/magnet.h" +#include "lib/mempcpy.h" #include "lib/parse.h" #include "lib/path.h" +#include "lib/pslist.h" #include "lib/random.h" +#include "lib/rbtree.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/tigertree.h" #include "lib/tm.h" +#include "lib/tokenizer.h" #include "lib/unsigned.h" #include "lib/url.h" #include "lib/utf8.h" #include "lib/walloc.h" -#include "lib/glib-missing.h" +#include "lib/xmalloc.h" #include "if/dht/dht.h" @@ -104,18 +115,62 @@ #define FI_DHT_RECV_DELAY 600 /**< Penalty per active source */ #define FI_DHT_RECV_THRESH 5 /**< No query if that many active */ -enum dl_file_chunk_magic { - DL_FILE_CHUNK_MAGIC = 0x563b483dU -}; +/* + * Aligning requested blocks is just a convenience, to make it easier later + * to validate the file against the TTH, and also because it is likely + * to be slightly more efficient when doing aligned disk I/Os. + */ +#define FI_OFFSET_BOUNDARY ((filesize_t) 128 * 1024) +#define FI_OFFSET_ALIGNMASK (FI_OFFSET_BOUNDARY - 1) + +enum dl_file_chunk_magic { DL_FILE_CHUNK_MAGIC = 0x563b483d }; +/** + * Download file chunks. + * + * These are linked to form the chunklist, the list of all the chunks defined + * for the file and which are either completed, reserved, or empty (not yet + * downloaded). + */ struct dl_file_chunk { enum dl_file_chunk_magic magic; + enum dl_chunk_status status; /**< Status of range */ filesize_t from; /**< Range offset start (byte included) */ filesize_t to; /**< Range offset end (byte EXCLUDED) */ - const struct download *download; /**< Download which "reserved" range */ - enum dl_chunk_status status; /**< Status of range */ + const download_t *download; /**< Download which "reserved" range */ + slink_t lk; /**< Embedded one-way link */ +}; + +static inline void +dl_file_chunk_check(const struct dl_file_chunk * const fc) +{ + g_assert(fc != NULL); + g_assert(DL_FILE_CHUNK_MAGIC == fc->magic); +} + +enum dl_avail_chunk_magic { DL_AVAIL_CHUNK_MAGIC = 0x3e69cf33 }; + +/** + * Available chunks. + * + * For each chunk of the file, we compute the amount of sources that can + * serve the chunk, allowing us to pick the rarest chunk when downloading. + */ +struct dl_avail_chunk { + enum dl_avail_chunk_magic magic; + filesize_t from; /**< Range offset start (byte included) */ + filesize_t to; /**< Range offset end (byte EXCLUDED) */ + size_t sources; /**< Amount of sources offering chunk */ + slink_t lk; /**< Embedded one-way link */ }; +static inline void +dl_avail_chunk_check(const struct dl_avail_chunk * const ac) +{ + g_assert(ac != NULL); + g_assert(DL_AVAIL_CHUNK_MAGIC == ac->magic); +} + /* * File information is uniquely describing an output file in the download * directory. There is a many-to-one relationship between downloads and @@ -143,21 +198,21 @@ * The `fi_by_guid' hash table keeps track of the GUID -> fi association. */ -static GHashTable *fi_by_sha1; -static GHashTable *fi_by_namesize; -static GHashTable *fi_by_outname; -static GHashTable *fi_by_guid; +static hikset_t *fi_by_sha1; +static htable_t *fi_by_namesize; +static hikset_t *fi_by_outname; +static hikset_t *fi_by_guid; static const char file_info_file = "fileinfo"; static const char file_info_what = "fileinfo database"; -static gboolean fileinfo_dirty = FALSE; -static gboolean can_swarm = FALSE; /**< Set by file_info_retrieve() */ -static gboolean can_publish_partial_sha1; +static bool fileinfo_dirty = FALSE; +static bool can_swarm = FALSE; /**< Set by file_info_retrieve() */ +static bool can_publish_partial_sha1; #define FILE_INFO_MAGIC32 0xD1BB1ED0U #define FILE_INFO_MAGIC64 0X91E63640U -typedef guint32 fi_magic_t; +typedef uint32 fi_magic_t; #define FILE_INFO_VERSION 6 @@ -177,7 +232,7 @@ }; #define FI_STORE_DELAY 60 /**< Max delay (secs) for flushing fileinfo */ -#define FI_TRAILER_INT 6 /**< Amount of guint32 in the trailer */ +#define FI_TRAILER_INT 6 /**< Amount of uint32 in the trailer */ /** * The swarming trailer is built within a memory buffer first, to avoid having @@ -236,7 +291,7 @@ * If `writing' is TRUE, we update the write pointer. */ static void -tbuf_extend(size_t x, gboolean writing) +tbuf_extend(size_t x, bool writing) { size_t new_size = round_grow(x + tbuf.size); size_t offset; @@ -294,11 +349,11 @@ tbuf_extend(size, TRUE); } -static WARN_UNUSED_RESULT gboolean -TBUF_GETCHAR(guint8 *x) +static WARN_UNUSED_RESULT bool +TBUF_GETCHAR(uint8 *x) { tbuf_check(); - + if ((size_t) (tbuf.end - tbuf.rptr) >= sizeof *x) { *x = *tbuf.rptr; tbuf.rptr += sizeof *x; @@ -308,8 +363,8 @@ } } -static WARN_UNUSED_RESULT gboolean -TBUF_GET_UINT32(guint32 *x) +static WARN_UNUSED_RESULT bool +TBUF_GET_UINT32(uint32 *x) { tbuf_check(); @@ -322,7 +377,7 @@ } } -static WARN_UNUSED_RESULT gboolean +static WARN_UNUSED_RESULT bool TBUF_READ(char *x, size_t size) { tbuf_check(); @@ -337,7 +392,7 @@ } static void -TBUF_PUT_CHAR(guint8 x) +TBUF_PUT_CHAR(uint8 x) { TBUF_CHECK(sizeof x); *tbuf.wptr = x; @@ -345,27 +400,25 @@ } static void -TBUF_PUT_UINT32(guint32 x) +TBUF_PUT_UINT32(uint32 x) { TBUF_CHECK(sizeof x); - memcpy(tbuf.wptr, &x, sizeof x); - tbuf.wptr += sizeof x; + tbuf.wptr = mempcpy(tbuf.wptr, &x, sizeof x); } static void TBUF_WRITE(const char *data, size_t size) { TBUF_CHECK(size); - memcpy(tbuf.wptr, data, size); - tbuf.wptr += size; + tbuf.wptr = mempcpy(tbuf.wptr, data, size); } static inline void -file_info_checksum(guint32 *checksum, gconstpointer data, size_t len) +file_info_checksum(uint32 *checksum, const void *data, size_t len) { - const guchar *p = data; + const uchar *p = data; while (len--) - *checksum = (*checksum << 1) ^ (*checksum >> 31) ^ *p++; + *checksum = UINT32_ROTL(*checksum, 1) ^ *p++; } /* @@ -373,14 +426,14 @@ */ static void -WRITE_CHAR(guint8 val, guint32 *checksum) +WRITE_CHAR(uint8 val, uint32 *checksum) { TBUF_PUT_CHAR(val); file_info_checksum(checksum, &val, sizeof val); } static void -WRITE_UINT32(guint32 val, guint32 *checksum) +WRITE_UINT32(uint32 val, uint32 *checksum) { val = htonl(val); TBUF_PUT_UINT32(val); @@ -388,7 +441,7 @@ } static void -WRITE_STR(const char *data, size_t size, guint32 *checksum) +WRITE_STR(const char *data, size_t size, uint32 *checksum) { TBUF_WRITE(data, size); file_info_checksum(checksum, data, size); @@ -398,8 +451,8 @@ * High-level read macros. */ -static WARN_UNUSED_RESULT gboolean -READ_CHAR(guint8 *val, guint32 *checksum) +static WARN_UNUSED_RESULT bool +READ_CHAR(uint8 *val, uint32 *checksum) { if (TBUF_GETCHAR(val)) { file_info_checksum(checksum, val, sizeof *val); @@ -409,11 +462,11 @@ } } -static WARN_UNUSED_RESULT gboolean -READ_UINT32(guint32 *val_ptr, guint32 *checksum) +static WARN_UNUSED_RESULT bool +READ_UINT32(uint32 *val_ptr, uint32 *checksum) { - guint32 val; - + uint32 val; + if (TBUF_GET_UINT32(&val)) { *val_ptr = ntohl(val); file_info_checksum(checksum, &val, sizeof val); @@ -423,8 +476,8 @@ } } -static WARN_UNUSED_RESULT gboolean -READ_STR(char *data, size_t size, guint32 *checksum) +static WARN_UNUSED_RESULT bool +READ_STR(char *data, size_t size, uint32 *checksum) { if (TBUF_READ(data, size)) { file_info_checksum(checksum, data, size); @@ -439,8 +492,8 @@ */ static void -FIELD_ADD(enum dl_file_info_field id, size_t n, gconstpointer data, - guint32 *checksum) +FIELD_ADD(enum dl_file_info_field id, size_t n, const void *data, + uint32 *checksum) { WRITE_UINT32(id, checksum); WRITE_UINT32(n, checksum); @@ -452,10 +505,10 @@ */ struct trailer { - guint64 filesize; /**< Real file size */ - guint32 generation; /**< Generation number */ - guint32 length; /**< Total trailer length */ - guint32 checksum; /**< Trailer checksum */ + uint64 filesize; /**< Real file size */ + uint32 generation; /**< Generation number */ + uint32 length; /**< Total trailer length */ + uint32 checksum; /**< Trailer checksum */ fi_magic_t magic; /**< Magic number */ }; @@ -463,7 +516,7 @@ static void fi_free(fileinfo_t *fi); static void fi_update_seen_on_network(gnet_src_t srcid); static const char *file_info_new_outname(const char *dir, const char *name); -static gboolean looks_like_urn(const char *filename); +static bool looks_like_urn(const char *filename); static idtable_t *fi_handle_map; static idtable_t *src_handle_map; @@ -512,7 +565,7 @@ * * @return TRUE if the trailer is the 64-bit version, FALSE if it's 32-bit. */ -static inline gboolean +static inline bool trailer_is_64bit(const struct trailer *tb) { switch (tb->magic) { @@ -528,7 +581,7 @@ * Write trailer buffer at current position on `fd', whose name is `name'. */ static void -tbuf_write(const struct file_object *fo, filesize_t offset) +tbuf_write(const file_object_t *fo, filesize_t offset) { size_t size = TBUF_WRITTEN_LEN(); ssize_t ret; @@ -543,7 +596,7 @@ error = (ssize_t) -1 == ret ? g_strerror(errno) : "Unknown error"; g_warning("error while flushing trailer info for \"%s\": %s", - file_object_get_pathname(fo), error); + file_object_pathname(fo), error); } } @@ -567,7 +620,7 @@ { static const struct dl_file_chunk zero_fc; struct dl_file_chunk *fc; - + WALLOC(fc); *fc = zero_fc; fc->magic = DL_FILE_CHUNK_MAGIC; @@ -575,25 +628,53 @@ } static void -dl_file_chunk_check(const struct dl_file_chunk *fc) -{ - g_assert(fc); - g_assert(DL_FILE_CHUNK_MAGIC == fc->magic); -} - -static void dl_file_chunk_free(struct dl_file_chunk **fc_ptr) { g_assert(fc_ptr); if (*fc_ptr) { struct dl_file_chunk *fc = *fc_ptr; + dl_file_chunk_check(fc); fc->magic = 0; WFREE(fc); *fc_ptr = NULL; } } +static struct dl_avail_chunk * +dl_avail_chunk_alloc(void) +{ + struct dl_avail_chunk *ac; + + WALLOC0(ac); + ac->magic = DL_AVAIL_CHUNK_MAGIC; + return ac; +} + +static struct dl_avail_chunk * +dl_avail_chunk_new(filesize_t from, filesize_t to, size_t sources) +{ + struct dl_avail_chunk *ac; + + g_assert(from < to); + g_assert(size_is_positive(sources)); + + ac = dl_avail_chunk_alloc(); + ac->from = from; + ac->to = to; + ac->sources = sources; + return ac; +} + +static void +dl_avail_chunk_free(void *p) +{ + struct dl_avail_chunk *ac = p; + dl_avail_chunk_check(ac); + ac->magic = 0; + WFREE(ac); +} + /** * Given a fileinfo GUID, return the fileinfo_t associated with it, or NULL * if it does not exist. @@ -601,7 +682,7 @@ fileinfo_t * file_info_by_guid(const struct guid *guid) { - return g_hash_table_lookup(fi_by_guid, guid); + return hikset_lookup(fi_by_guid, guid); } /** @@ -612,10 +693,10 @@ * * @return TRUE if chunklist is consistent, FALSE otherwise. */ -static gboolean -file_info_check_chunklist(const fileinfo_t *fi, gboolean assertion) +static bool +file_info_check_chunklist(const fileinfo_t *fi, bool assertion) { - GSList *sl; + const struct dl_file_chunk *fc; filesize_t last = 0; /* @@ -623,14 +704,12 @@ * are run. Do that only when debugging. */ - if (assertion && !GNET_PROPERTY(fileinfo_debug)) + if (assertion && GNET_PROPERTY(fileinfo_debug) < 10) return TRUE; file_info_check(fi); - for (sl = fi->chunklist; NULL != sl; sl = g_slist_next(sl)) { - const struct dl_file_chunk *fc = sl->data; - + ESLIST_FOREACH_DATA(&fi->chunklist, fc) { dl_file_chunk_check(fc); if (last != fc->from || fc->from >= fc->to) return FALSE; @@ -638,7 +717,7 @@ last = fc->to; if (!fi->file_size_known || 0 == fi->size) continue; - + if (fc->from >= fi->size || fc->to > fi->size) return FALSE; } @@ -654,11 +733,12 @@ * have elapsed since last flush to disk. */ static void -file_info_fd_store_binary(fileinfo_t *fi, const struct file_object *fo) +file_info_fd_store_binary(fileinfo_t *fi, const file_object_t *fo) { - const GSList *fclist, *sl; - guint32 checksum = 0; - guint32 length; + const pslist_t *sl; + const slink_t *cl; + uint32 checksum = 0; + uint32 length; g_assert(fo); @@ -683,9 +763,9 @@ FIELD_ADD(FILE_INFO_FIELD_TTH, TTH_RAW_SIZE, fi->tth, &checksum); if (fi->tigertree.leaves) { - gconstpointer data; + const void *data; size_t size; - + STATIC_ASSERT(TTH_RAW_SIZE == sizeof(struct tth)); data = fi->tigertree.leaves; size = fi->tigertree.num_leaves * TTH_RAW_SIZE; @@ -698,7 +778,7 @@ if (fi->cha1) FIELD_ADD(FILE_INFO_FIELD_CHA1, SHA1_RAW_SIZE, fi->cha1, &checksum); - for (sl = fi->alias; NULL != sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(fi->alias, sl) { size_t len = strlen(sl->data); /* Do not store the trailing NUL */ g_assert(len <= INT_MAX); if (len < FI_MAX_FIELD_LEN) @@ -706,19 +786,20 @@ } g_assert(file_info_check_chunklist(fi, TRUE)); - for (fclist = fi->chunklist; fclist; fclist = g_slist_next(fclist)) { - const struct dl_file_chunk *fc = fclist->data; - guint32 from_hi, to_hi; - guint32 chunk5; + + ESLIST_FOREACH(&fi->chunklist, cl) { + const struct dl_file_chunk *fc = eslist_data(&fi->chunklist, cl); + uint32 from_hi, to_hi; + uint32 chunk5; dl_file_chunk_check(fc); - from_hi = (guint64) fc->from >> 32; - to_hi = (guint64) fc->to >> 32; + from_hi = (uint64) fc->from >> 32; + to_hi = (uint64) fc->to >> 32; chunk0 = htonl(from_hi), - chunk1 = htonl((guint32) fc->from), + chunk1 = htonl((uint32) fc->from), chunk2 = htonl(to_hi), - chunk3 = htonl((guint32) fc->to), + chunk3 = htonl((uint32) fc->to), chunk4 = htonl(fc->status); FIELD_ADD(FILE_INFO_FIELD_CHUNK, sizeof chunk, chunk, &checksum); } @@ -727,12 +808,12 @@ WRITE_UINT32(FILE_INFO_FIELD_END, &checksum); - STATIC_ASSERT((guint64) -1 >= (filesize_t) -1); - WRITE_UINT32((guint64) fi->size >> 32, &checksum); + STATIC_ASSERT((uint64) -1 >= (filesize_t) -1); + WRITE_UINT32((uint64) fi->size >> 32, &checksum); WRITE_UINT32(fi->size, &checksum); WRITE_UINT32(fi->generation, &checksum); - length = TBUF_WRITTEN_LEN() + 3 * sizeof(guint32); + length = TBUF_WRITTEN_LEN() + 3 * sizeof(uint32); WRITE_UINT32(length, &checksum); /* Total trailer size */ WRITE_UINT32(checksum, &checksum); @@ -741,13 +822,15 @@ /* Flush buffer at current position */ tbuf_write(fo, fi->size); - if (0 != ftruncate(file_object_get_fd(fo), fi->size + length)) { + if (0 != file_object_ftruncate(fo, fi->size + length)) { g_warning("%s(): truncate() failed for \"%s\": %m", G_STRFUNC, file_info_readable_filename(fi)); } fi->dirty = FALSE; fileinfo_dirty = TRUE; + + entropy_harvest_time(); } /** @@ -755,9 +838,9 @@ * output file, if it exists. */ void -file_info_store_binary(fileinfo_t *fi, gboolean force) +file_info_store_binary(fileinfo_t *fi, bool force) { - struct file_object *fo; + file_object_t *fo; g_assert(!(fi->flags & (FI_F_TRANSIENT | FI_F_SEEDING))); @@ -789,13 +872,8 @@ */ fo = file_object_open(fi->pathname, O_WRONLY); - if (!fo) { - int fd = file_open_missing(fi->pathname, O_WRONLY); - if (fd >= 0) { - fo = file_object_new(fd, fi->pathname, O_WRONLY); - } - } - if (fo) { + + if (fo != NULL) { file_info_fd_store_binary(fi, fo); file_object_release(&fo); } @@ -805,7 +883,7 @@ file_info_got_tth(fileinfo_t *fi, const struct tth *tth) { file_info_check(fi); - + g_return_if_fail(tth); g_return_if_fail(NULL == fi->tth); fi->tth = atom_tth_get(tth); @@ -818,8 +896,7 @@ g_assert((NULL != fi->tigertree.leaves) ^ (0 == fi->tigertree.num_leaves)); if (fi->tigertree.leaves) { - wfree(fi->tigertree.leaves, - fi->tigertree.num_leaves * sizeof fi->tigertree.leaves0); + WFREE_ARRAY(fi->tigertree.leaves, fi->tigertree.num_leaves); fi->tigertree.slice_size = 0; fi->tigertree.num_leaves = 0; fi->tigertree.leaves = NULL; @@ -828,19 +905,19 @@ void file_info_got_tigertree(fileinfo_t *fi, - const struct tth *leaves, size_t num_leaves, gboolean mark_dirty) + const struct tth *leaves, size_t num_leaves, bool mark_dirty) { filesize_t num_blocks; file_info_check(fi); - + g_return_if_fail(leaves); g_return_if_fail(num_leaves > 0); g_return_if_fail(fi->tigertree.num_leaves < num_leaves); g_return_if_fail(fi->file_size_known); fi_tigertree_free(fi); - fi->tigertree.leaves = wcopy(leaves, num_leaves * sizeof leaves0); + fi->tigertree.leaves = WCOPY_ARRAY(leaves, num_leaves); fi->tigertree.num_leaves = num_leaves; fi->tigertree.slice_size = TTH_BLOCKSIZE; @@ -870,7 +947,7 @@ { file_info_check(fi); g_assert(!((FI_F_TRANSIENT | FI_F_SEEDING | FI_F_STRIPPED) & fi->flags)); - + fi_tigertree_free(fi); if (-1 == truncate(pathname, fi->size)) { @@ -921,12 +998,12 @@ char buf64; concat_strings(buf, sizeof buf, - uint64_to_string(dfi->done), "/", - uint64_to_string2(dfi->size), (void *) 0); + filesize_to_string(dfi->done), "/", + filesize_to_string2(dfi->size), NULL_PTR); g_warning("could not chop fileinfo trailer off \"%s\": file was " "different than expected (%s bytes done instead of %s/%s)", pathname, buf, - uint64_to_string(fi->done), uint64_to_string2(fi->size)); + filesize_to_string(fi->done), filesize_to_string2(fi->size)); } else { file_info_strip_trailer(fi, pathname); } @@ -943,15 +1020,24 @@ static void file_info_chunklist_free(fileinfo_t *fi) { - GSList *sl; + file_info_check(fi); + + eslist_wfree(&fi->chunklist, sizeof(struct dl_file_chunk)); +} +/** + * Frees the chunklist and all its elements of a fileinfo struct. Note that + * the consistency of the list isn't checked to explicitely allow freeing + * inconsistent chunklists. + * + * @param fi the fileinfo struct. + */ +static void +file_info_available_free(fileinfo_t *fi) +{ file_info_check(fi); - for (sl = fi->chunklist; NULL != sl; sl = g_slist_next(sl)) { - struct dl_file_chunk *fc = sl->data; - dl_file_chunk_free(&fc); - } - gm_slist_free_null(&fi->chunklist); + eslist_wfree(&fi->available, sizeof(struct dl_avail_chunk)); } /** @@ -964,22 +1050,21 @@ g_assert(!fi->hashed); g_assert(NULL == fi->sf); - if (fi->chunklist) { - g_assert(file_info_check_chunklist(fi, TRUE)); - file_info_chunklist_free(fi); - } - if (fi->alias) { - GSList *sl; + g_assert(file_info_check_chunklist(fi, TRUE)); + file_info_chunklist_free(fi); + file_info_available_free(fi); + + if (fi->alias != NULL) { + pslist_t *sl; - for (sl = fi->alias; NULL != sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(fi->alias, sl) { const char *s = sl->data; atom_str_free_null(&s); } - gm_slist_free_null(&fi->alias); - } - if (fi->seen_on_network) { - fi_free_ranges(fi->seen_on_network); + pslist_free_null(&fi->alias); } + + http_rangeset_free_null(&fi->seen_on_network); fi_tigertree_free(fi); atom_guid_free_null(&fi->guid); @@ -996,7 +1081,7 @@ file_info_hash_insert_name_size(fileinfo_t *fi) { namesize_t nsk; - GSList *sl; + pslist_t *sl, *aliases; file_info_check(fi); g_assert(fi->file_size_known); @@ -1005,6 +1090,17 @@ return; /* + * Prepend the filename to the list of aliases, for the purpose of + * recording the entry by name+size. This is useful when recovering + * downloads with no SHA1, so that we can associate their persisted + * magnet with the proper fileinfo. + * --RAM, 2014-04-23 + */ + + aliases = fi->alias; + aliases = pslist_prepend_const(aliases, filepath_basename(fi->pathname)); + + /* * The (name, size) tuples also point to a list of entries, one for * each of the name aliases. Ideally, we'd want only one, but there * can be name conflicts. This does not matter unless they disabled @@ -1013,43 +1109,84 @@ nsk.size = fi->size; - for (sl = fi->alias; NULL != sl; sl = g_slist_next(sl)) { - GSList *slist; - + PSLIST_FOREACH(aliases, sl) { + pslist_t *slist; + nsk.name = sl->data; - slist = g_hash_table_lookup(fi_by_namesize, &nsk); + slist = htable_lookup(fi_by_namesize, &nsk); if (NULL != slist) { - slist = g_slist_append(slist, fi); + pslist_append(slist, fi); /* Head not changing */ } else { namesize_t *ns = namesize_make(nsk.name, nsk.size); - slist = g_slist_append(slist, fi); - gm_hash_table_insert_const(fi_by_namesize, ns, slist); + slist = pslist_append(NULL, fi); + htable_insert(fi_by_namesize, ns, slist); + } + } + + pslist_shift(&aliases); /* Get rid of extra leading item */ +} + +static void +file_info_hash_remove_name_size(fileinfo_t *fi) +{ + namesize_t nsk; + pslist_t *sl; + + /* + * Remove all the aliases from the (name, size) table. + */ + + nsk.size = fi->size; + + PSLIST_FOREACH(fi->alias, sl) { + namesize_t *ns; + pslist_t *slist, *head; + const void *key; + void *value; + bool found; + + nsk.name = sl->data; + + found = htable_lookup_extended(fi_by_namesize, &nsk, &key, &value); + + ns = deconstify_pointer(key); + slist = value; + g_assert(found); + g_assert(NULL != slist); + g_assert(ns->size == fi->size); + + head = slist; + slist = pslist_remove(slist, fi); + + if (NULL == slist) { + htable_remove(fi_by_namesize, ns); + namesize_free(ns); + } else if (head != slist) { + htable_insert(fi_by_namesize, ns, slist); /* Head changed */ } } } /** - * Resize fileinfo to be `size' bytes, by adding empty chunk at the tail. + * Extend chunk list from `fi->size' to the new specified size. */ static void -fi_resize(fileinfo_t *fi, filesize_t size) +fi_extend_chunklist(fileinfo_t *fi, filesize_t size) { struct dl_file_chunk *fc; - file_info_check(fi); g_assert(fi->size < size); - g_assert(!fi->hashed); fc = dl_file_chunk_alloc(); fc->from = fi->size; fc->to = size; fc->status = DL_CHUNK_EMPTY; - fi->chunklist = g_slist_append(fi->chunklist, fc); + eslist_append(&fi->chunklist, fc); /* * Don't remove/re-insert `fi' from hash tables: when this routine is - * called, `fi' is no longer "hashed", or has never been "hashed". + * called, `fi' may not be "hashed". */ fi->size = size; @@ -1058,14 +1195,46 @@ } /** + * Resize fileinfo to be `size' bytes, by adding empty chunk at the tail. + */ +static void +fi_resize(fileinfo_t *fi, filesize_t size) +{ + file_info_check(fi); + g_assert(!fi->hashed); + + fi_extend_chunklist(fi, size); +} + +/** + * Resize fileinfo if size was not known already. + */ +void +file_info_resize(fileinfo_t *fi, filesize_t size) +{ + file_info_check(fi); + g_return_unless(!fi->file_size_known); /* Can't resize if size known */ + + fi_extend_chunklist(fi, size); + file_info_merge_adjacent(fi); + + fi_event_trigger(fi, EV_FI_INFO_CHANGED); + + if (!(fi->flags & FI_F_TRANSIENT)) { + fi->dirty = TRUE; + fileinfo_dirty = TRUE; + } +} + +/** * Add `name' as an alias for `fi' if not already known. * If `record' is TRUE, also record new alias entry in `fi_by_namesize'. */ static void -fi_alias(fileinfo_t *fi, const char *name, gboolean record) +fi_alias(fileinfo_t *fi, const char *name, bool record) { namesize_t *ns; - GSList *list; + pslist_t *list; file_info_check(fi); g_assert(!record || fi->hashed); /* record => fi->hashed */ @@ -1075,28 +1244,26 @@ * fi_by_namesize table, since all the aliases are inserted into * that table. */ - + ns = namesize_make(name, fi->size); - list = g_hash_table_lookup(fi_by_namesize, ns); - if (NULL != list && NULL != g_slist_find(list, fi)) { + list = htable_lookup(fi_by_namesize, ns); + if (NULL != list && NULL != pslist_find(list, fi)) { /* Alias already known */ } else if (looks_like_urn(name)) { /* This is often caused by (URN entries in) the dmesh */ } else { - /* * Insert new alias for `fi'. */ - fi->alias = g_slist_append(fi->alias, - deconstify_gchar(atom_str_get(name))); + fi->alias = pslist_append_const(fi->alias, atom_str_get(name)); if (record) { - if (NULL != list) - list = g_slist_append(list, fi); - else { - list = g_slist_append(list, fi); - gm_hash_table_insert_const(fi_by_namesize, ns, list); + if (NULL != list) { + pslist_append(list, fi); + } else { + list = pslist_append(list, fi); + htable_insert(fi_by_namesize, ns, list); ns = NULL; /* Prevent freeing */ } } @@ -1111,16 +1278,16 @@ * * @returns TRUE if the trailer is "validated", FALSE otherwise. */ -static gboolean +static bool file_info_get_trailer(int fd, struct trailer *tb, filestat_t *sb, const char *name) { ssize_t r; fi_magic_t magic; - guint32 trFI_TRAILER_INT; + uint32 trFI_TRAILER_INT; filestat_t buf; fileoffset_t offset; - guint64 filesize_hi; + uint64 filesize_hi; size_t i = 0; g_assert(fd >= 0); @@ -1177,10 +1344,10 @@ magic = ntohl(tr5); switch (magic) { case FILE_INFO_MAGIC64: - filesize_hi = ((guint64) ((guint32) ntohl(tr0))) << 32; + filesize_hi = ((uint64) ((uint32) ntohl(tr0))) << 32; /* FALLTHROUGH */ case FILE_INFO_MAGIC32: - tb->filesize = filesize_hi | ((guint32) ntohl(tr1)); + tb->filesize = filesize_hi | ((uint32) ntohl(tr1)); i = 2; break; } @@ -1188,8 +1355,8 @@ return FALSE; } - for (/* NOTHING */; i < G_N_ELEMENTS(tr); i++) { - guint32 v = ntohl(tri); + for (/* NOTHING */; i < N_ITEMS(tr); i++) { + uint32 v = ntohl(tri); switch (i) { case 2: tb->generation = v; break; @@ -1207,7 +1374,7 @@ * Now, sanity checks... We must make sure this is a valid trailer. */ - if ((guint64) buf.st_size != tb->filesize + tb->length) { + if ((uint64) buf.st_size != tb->filesize + tb->length) { return FALSE; } @@ -1226,7 +1393,7 @@ { struct trailer trailer; int fd; - gboolean valid; + bool valid; fd = file_open_missing(path, O_RDONLY); if (fd < 0) @@ -1243,7 +1410,27 @@ { g_return_val_if_fail(sha1, NULL); g_return_val_if_fail(fi_by_sha1, NULL); - return g_hash_table_lookup(fi_by_sha1, sha1); + return hikset_lookup(fi_by_sha1, sha1); +} + +/** + * Detects some loops in a one-way list. + * + * @return TRUE if the given slist contains a loop; FALSE otherwise. + */ +static bool +fi_alias_list_is_looping(const pslist_t *slist) +{ + const pslist_t *sl, *p; + + p = sl = slist; + for (sl = slist; /* NOTHING */; sl = pslist_next(sl)) { + p = pslist_next(pslist_next(p)); + if (p == sl || p == pslist_next(sl)) + break; + } + + return NULL != p; } /** @@ -1257,14 +1444,14 @@ file_info_lookup(const char *name, filesize_t size, const struct sha1 *sha1) { fileinfo_t *fi; - GSList *list; + pslist_t *list; /* * If we have a SHA1, this is our unique key. */ if (sha1) { - fi = g_hash_table_lookup(fi_by_sha1, sha1); + fi = hikset_lookup(fi_by_sha1, sha1); if (fi) { file_info_check(fi); return fi; @@ -1290,15 +1477,15 @@ { struct namesize nsk; - nsk.name = deconstify_gchar(name); + nsk.name = deconstify_char(name); nsk.size = size; - list = g_hash_table_lookup(fi_by_namesize, &nsk); - g_assert(!gm_slist_is_looping(list)); - g_assert(!g_slist_find(list, NULL)); + list = htable_lookup(fi_by_namesize, &nsk); + g_assert(!fi_alias_list_is_looping(list)); + g_assert(NULL == pslist_find(list, NULL)); } - if (NULL != list && NULL == g_slist_next(list)) { + if (NULL != list && NULL == pslist_next(list)) { fi = list->data; file_info_check(fi); @@ -1325,7 +1512,7 @@ file_info_check(fi); g_assert(fi->pathname); - dfi = g_hash_table_lookup(fi_by_outname, fi->pathname); + dfi = hikset_lookup(fi_by_outname, fi->pathname); if (dfi) { file_info_check(dfi); return dfi; @@ -1336,7 +1523,7 @@ */ if (fi->sha1) { - dfi = g_hash_table_lookup(fi_by_sha1, fi->sha1); + dfi = hikset_lookup(fi_by_sha1, fi->sha1); if (dfi) { file_info_check(dfi); return dfi; @@ -1348,7 +1535,7 @@ */ g_assert(fi->guid); - dfi = g_hash_table_lookup(fi_by_guid, fi->guid); + dfi = hikset_lookup(fi_by_guid, fi->guid); if (dfi) { file_info_check(dfi); return dfi; @@ -1359,17 +1546,17 @@ /** * Check whether filename looks like an URN. */ -static gboolean +static bool looks_like_urn(const char *filename) { const char *p, *q; - guint i; + uint i; /* Check for the following pattern: * * (urn.)?(sha1|bitprint).a-zA-Z0-9{SHA1_BASE32_SIZE,} */ - + p = is_strcaseprefix(filename, "urn"); /* Skip a single character after the prefix */ if (p) { @@ -1378,7 +1565,7 @@ } else { p = filename; } - + q = is_strcaseprefix(p, "sha1"); if (!q) q = is_strcaseprefix(p, "bitprint"); @@ -1404,14 +1591,15 @@ const char * file_info_readable_filename(const fileinfo_t *fi) { - const GSList *sl; const char *filename; file_info_check(fi); filename = filepath_basename(fi->pathname); if (looks_like_urn(filename)) { - for (sl = fi->alias; sl; sl = g_slist_next(sl)) { + const pslist_t *sl; + + PSLIST_FOREACH(fi->alias, sl) { const char *name = sl->data; if (!looks_like_urn(name)) return name; @@ -1435,7 +1623,7 @@ { fileinfo_t *fi; - fi = g_hash_table_lookup(fi_by_sha1, sha1); + fi = hikset_lookup(fi_by_sha1, sha1); if (fi) { file_info_check(fi); @@ -1481,22 +1669,7 @@ static const guid_t * fi_random_guid_atom(void) { - struct guid guid; - size_t i; - - /* - * Paranoid, in case the random number generator is broken. - */ - - for (i = 0; i < 100; i++) { - guid_random_fill(&guid); - - if (NULL == g_hash_table_lookup(fi_by_guid, &guid)) - return atom_guid_get(&guid); - } - - g_error("no luck with random number generator"); - return NULL; + return guid_unique_atom(fi_by_guid, FALSE); } /** @@ -1505,10 +1678,10 @@ * * @return TRUE if an upgrade was necessary. */ -static gboolean +static bool fi_upgrade_older_version(fileinfo_t *fi) { - gboolean upgraded = FALSE; + bool upgraded = FALSE; file_info_check(fi); @@ -1583,6 +1756,22 @@ } /** + * Allocates a new fileinfo. + */ +static fileinfo_t * +file_info_allocate(void) +{ + fileinfo_t *fi; + + WALLOC0(fi); + fi->magic = FI_MAGIC; + eslist_init(&fi->chunklist, offsetof(struct dl_file_chunk, lk)); + eslist_init(&fi->available, offsetof(struct dl_avail_chunk, lk)); + + return fi; +} + +/** * Reads the file metainfo from the trailer of a file, if it exists. * * @returns a pointer to the info structure if found, and NULL otherwise. @@ -1590,19 +1779,18 @@ static fileinfo_t * file_info_retrieve_binary(const char *pathname) { - guint32 tmpchunk5; - guint32 tmpguint; - guint32 checksum = 0; + uint32 tmpchunk5; + uint32 tmpuint; + uint32 checksum = 0; fileinfo_t *fi = NULL; enum dl_file_info_field field; char tmpFI_MAX_FIELD_LEN + 1; /* +1 for trailing NUL on strings */ const char *reason; int fd; - guint32 version; + uint32 version; struct trailer trailer; filestat_t sb; - gboolean t64; - GSList *chunklist = NULL; + bool t64; #define BAILOUT(x) \ G_STMT_START { \ @@ -1635,8 +1823,8 @@ t64 = trailer_is_64bit(&trailer); { - gboolean ret; - + bool ret; + if (trailer.filesize > (filesize_t) -1) { errno = ERANGE; ret = -1; @@ -1645,7 +1833,7 @@ } if (0 != ret) { g_warning("seek to position %s within \"%s\" failed: %m", - uint64_to_string(trailer.filesize), pathname); + filesize_to_string(trailer.filesize), pathname); goto eof; } } @@ -1657,7 +1845,7 @@ if (-1 == tbuf_read(fd, trailer.length)) { g_warning("%s(): " "unable to read whole trailer %s bytes) from \"%s\": %m", - G_STRFUNC, uint64_to_string(trailer.filesize), pathname); + G_STRFUNC, filesize_to_string(trailer.filesize), pathname); goto eof; } @@ -1665,13 +1853,11 @@ if (!READ_UINT32(&version, &checksum)) goto eof; if ((t64 && version > FILE_INFO_VERSION) || (!t64 && version > 5)) { - g_warning("file_info_retrieve_binary(): strange version; %u", version); + g_warning("%s(): strange version; %u", G_STRFUNC, version); goto eof; } - WALLOC0(fi); - - fi->magic = FI_MAGIC; + fi = file_info_allocate(); fi->pathname = atom_str_get(pathname); fi->size = trailer.filesize; fi->generation = trailer.generation; @@ -1685,7 +1871,7 @@ */ if (version >= 4) { - guint32 val; + uint32 val; if (!READ_UINT32(&val, &checksum)) goto eof; @@ -1696,7 +1882,7 @@ } if (version >= 5) { - guint8 c; + uint8 c; if (!READ_CHAR(&c, &checksum)) goto eof; fi->file_size_known = 0 != c; @@ -1707,34 +1893,34 @@ */ for (;;) { - tmpguint = FILE_INFO_FIELD_END; /* in case read() fails. */ - if (!READ_UINT32(&tmpguint, &checksum)) /* Read a field ID */ + tmpuint = FILE_INFO_FIELD_END; /* in case read() fails. */ + if (!READ_UINT32(&tmpuint, &checksum)) /* Read a field ID */ goto eof; - if (FILE_INFO_FIELD_END == tmpguint) + if (FILE_INFO_FIELD_END == tmpuint) break; - field = tmpguint; + field = tmpuint; - if (!READ_UINT32(&tmpguint, &checksum)) /* Read field data length */ + if (!READ_UINT32(&tmpuint, &checksum)) /* Read field data length */ goto eof; - if (0 == tmpguint) { - gm_snprintf(tmp, sizeof tmp, "field #%d has zero size", field); + if (0 == tmpuint) { + str_bprintf(tmp, sizeof tmp, "field #%d has zero size", field); BAILOUT(tmp); /* NOT REACHED */ } - if (tmpguint > FI_MAX_FIELD_LEN) { - gm_snprintf(tmp, sizeof tmp, - "field #%d is too large (%u bytes) ", field, (guint) tmpguint); + if (tmpuint > FI_MAX_FIELD_LEN) { + str_bprintf(tmp, sizeof tmp, + "field #%d is too large (%u bytes) ", field, (uint) tmpuint); BAILOUT(tmp); /* NOT REACHED */ } - g_assert(tmpguint < sizeof tmp); + g_assert(tmpuint < sizeof tmp); - if (!READ_STR(tmp, tmpguint, &checksum)) + if (!READ_STR(tmp, tmpuint, &checksum)) goto eof; - tmptmpguint = '\0'; /* Did not store trailing NUL */ + tmptmpuint = '\0'; /* Did not store trailing NUL */ switch (field) { case FILE_INFO_FIELD_NAME: @@ -1752,53 +1938,53 @@ fi_alias(fi, tmp, FALSE); break; case FILE_INFO_FIELD_GUID: - if (GUID_RAW_SIZE == tmpguint) + if (GUID_RAW_SIZE == tmpuint) fi->guid = atom_guid_get(cast_to_guid_ptr_const(tmp)); else g_warning("bad length %d for GUID in fileinfo v%u for \"%s\"", - tmpguint, version, pathname); + tmpuint, version, pathname); break; case FILE_INFO_FIELD_TTH: - if (TTH_RAW_SIZE == tmpguint) { + if (TTH_RAW_SIZE == tmpuint) { struct tth tth; memcpy(tth.data, tmp, TTH_RAW_SIZE); file_info_got_tth(fi, &tth); } else { g_warning("bad length %d for TTH in fileinfo v%u for \"%s\"", - tmpguint, version, pathname); + tmpuint, version, pathname); } break; case FILE_INFO_FIELD_TIGERTREE: - if (tmpguint > 0 && 0 == (tmpguint % TTH_RAW_SIZE)) { + if (tmpuint > 0 && 0 == (tmpuint % TTH_RAW_SIZE)) { const struct tth *leaves; - + STATIC_ASSERT(TTH_RAW_SIZE == sizeof(struct tth)); leaves = (const struct tth *) &tmp0; file_info_got_tigertree(fi, - leaves, tmpguint / TTH_RAW_SIZE, FALSE); + leaves, tmpuint / TTH_RAW_SIZE, FALSE); } else { g_warning("bad length %d for TIGERTREE in fileinfo v%u " "for \"%s\"", - tmpguint, version, pathname); + tmpuint, version, pathname); } break; case FILE_INFO_FIELD_SHA1: - if (SHA1_RAW_SIZE == tmpguint) { + if (SHA1_RAW_SIZE == tmpuint) { struct sha1 sha1; memcpy(sha1.data, tmp, SHA1_RAW_SIZE); fi->sha1 = atom_sha1_get(&sha1); } else g_warning("bad length %d for SHA1 in fileinfo v%u for \"%s\"", - tmpguint, version, pathname); + tmpuint, version, pathname); break; case FILE_INFO_FIELD_CHA1: - if (SHA1_RAW_SIZE == tmpguint) { + if (SHA1_RAW_SIZE == tmpuint) { struct sha1 sha1; memcpy(sha1.data, tmp, SHA1_RAW_SIZE); fi->cha1 = atom_sha1_get(&sha1); } else g_warning("bad length %d for CHA1 in fileinfo v%u for \"%s\"", - tmpguint, version, pathname); + tmpuint, version, pathname); break; case FILE_INFO_FIELD_CHUNK: { @@ -1826,7 +2012,7 @@ fc->status = ntohl(tmpchunk2); } } else { - guint64 hi, lo; + uint64 hi, lo; g_assert(version >= 6); hi = ntohl(tmpchunk0); @@ -1841,18 +2027,16 @@ if (DL_CHUNK_BUSY == fc->status) fc->status = DL_CHUNK_EMPTY; - /* Prepend now and reverse later for better efficiency */ - chunklist = g_slist_prepend(chunklist, fc); + eslist_append(&fi->chunklist, fc); } break; default: - g_warning("file_info_retrieve_binary(): " - "unhandled field ID %u (%d bytes long)", field, tmpguint); + g_warning("%s(): unhandled field ID %u (%d bytes long)", + G_STRFUNC, field, tmpuint); break; } } - fi->chunklist = g_slist_reverse(chunklist); if (!file_info_check_chunklist(fi, FALSE)) { file_info_chunklist_free(fi); BAILOUT("File contains inconsistent chunk list"); @@ -1886,15 +2070,15 @@ /* file size */ if (t64) { /* Upper 32 bits since version 6 */ - if (!READ_UINT32(&tmpguint, &checksum)) + if (!READ_UINT32(&tmpuint, &checksum)) goto eof; } - if (!READ_UINT32(&tmpguint, &checksum)) /* Lower bits */ + if (!READ_UINT32(&tmpuint, &checksum)) /* Lower bits */ goto eof; - if (!READ_UINT32(&tmpguint, &checksum)) /* generation number */ + if (!READ_UINT32(&tmpuint, &checksum)) /* generation number */ goto eof; - if (!READ_UINT32(&tmpguint, &checksum)) /* trailer length */ + if (!READ_UINT32(&tmpuint, &checksum)) /* trailer length */ goto eof; if (checksum != trailer.checksum) { @@ -1910,13 +2094,13 @@ if (GNET_PROPERTY(fileinfo_debug) > 3) g_debug("FILEINFO: " "good trailer info (v%u, %s bytes) in \"%s\"", - version, uint64_to_string(trailer.length), pathname); + version, filesize_to_string(trailer.length), pathname); return fi; bailout: - g_warning("file_info_retrieve_binary(): %s in \"%s\"", reason, pathname); + g_warning("%s(): %s in \"%s\"", G_STRFUNC, reason, pathname); eof: if (fi) { @@ -1935,7 +2119,8 @@ static void file_info_store_one(FILE *f, fileinfo_t *fi) { - const GSList *sl; + slink_t *cl; + pslist_t *sl; char *path; file_info_check(fi); @@ -1974,7 +2159,7 @@ fi->generation); HFREE_NULL(path); - for (sl = fi->alias; NULL != sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(fi->alias, sl) { const char *alias = sl->data; g_assert(NULL != alias); @@ -1993,23 +2178,24 @@ if (fi->cha1) fprintf(f, "CHA1 %s\n", sha1_base32(fi->cha1)); - fprintf(f, "SIZE %s\n", uint64_to_string(fi->size)); + fprintf(f, "SIZE %s\n", filesize_to_string(fi->size)); fprintf(f, "FSKN %u\n", fi->file_size_known ? 1 : 0); fprintf(f, "PAUS %u\n", (FI_F_PAUSED & fi->flags) ? 1 : 0); - fprintf(f, "DONE %s\n", uint64_to_string(fi->done)); - fprintf(f, "TIME %s\n", uint64_to_string(fi->stamp)); - fprintf(f, "CTIM %s\n", uint64_to_string(fi->created)); - fprintf(f, "NTIM %s\n", uint64_to_string(fi->ntime)); + fprintf(f, "DONE %s\n", filesize_to_string(fi->done)); + fprintf(f, "TIME %s\n", time_t_to_string(fi->stamp)); + fprintf(f, "CTIM %s\n", time_t_to_string(fi->created)); + fprintf(f, "NTIM %s\n", time_t_to_string(fi->ntime)); fprintf(f, "SWRM %u\n", fi->use_swarming ? 1 : 0); g_assert(file_info_check_chunklist(fi, TRUE)); - for (sl = fi->chunklist; NULL != sl; sl = g_slist_next(sl)) { - const struct dl_file_chunk *fc = sl->data; + + ESLIST_FOREACH(&fi->chunklist, cl) { + const struct dl_file_chunk *fc = eslist_data(&fi->chunklist, cl); dl_file_chunk_check(fc); fprintf(f, "CHNK %s %s %u\n", - uint64_to_string(fc->from), uint64_to_string2(fc->to), - (guint) fc->status); + filesize_to_string(fc->from), filesize_to_string2(fc->to), + (uint) fc->status); } fprintf(f, "\n"); } @@ -2018,13 +2204,11 @@ * Callback for hash table iterator. Used by file_info_store(). */ static void -file_info_store_list(gpointer key, gpointer value, gpointer user_data) +file_info_store_list(void *value, void *user_data) { - fileinfo_t *fi; + fileinfo_t *fi = value; - fi = value; file_info_check(fi); - g_assert(key == fi->pathname); file_info_store_one(user_data, fi); } @@ -2071,7 +2255,7 @@ f ); - g_hash_table_foreach(fi_by_outname, file_info_store_list, f); + hikset_foreach(fi_by_outname, file_info_store_list, f); file_config_close(f, &fp); fileinfo_dirty = FALSE; @@ -2108,8 +2292,8 @@ */ if (fi->refcount) - g_warning("fi_dispose() refcount = %u for \"%s\"", - fi->refcount, fi->pathname); + g_warning("%s(): refcount = %u for \"%s\"", + G_STRFUNC, fi->refcount, fi->pathname); fi->hashed = FALSE; fi_free(fi); @@ -2119,14 +2303,12 @@ * Callback for hash table iterator. Used by file_info_close(). */ static void -file_info_free_sha1_kv(gpointer key, gpointer val, gpointer unused_x) +file_info_free_sha1_kv(void *val, void *unused_x) { - const struct sha1 *sha1 = key; const fileinfo_t *fi = val; (void) unused_x; file_info_check(fi); - g_assert(sha1 == fi->sha1); /* SHA1 shared with fi's, don't free */ /* fi structure in value not freed, shared with other hash tables */ } @@ -2135,14 +2317,14 @@ * Callback for hash table iterator. Used by file_info_close(). */ static void -file_info_free_namesize_kv(gpointer key, gpointer val, gpointer unused_x) +file_info_free_namesize_kv(const void *key, void *val, void *unused_x) { - namesize_t *ns = key; - GSList *list = val; + namesize_t *ns = deconstify_pointer(key); + pslist_t *list = val; (void) unused_x; namesize_free(ns); - g_slist_free(list); + pslist_free(list); /* fi structure in value not freed, shared with other hash tables */ } @@ -2151,14 +2333,12 @@ * Callback for hash table iterator. Used by file_info_close(). */ static void -file_info_free_guid_kv(gpointer key, gpointer val, gpointer unused_x) +file_info_free_guid_kv(void *val, void *unused_x) { - const struct guid *guid = key; fileinfo_t *fi = val; (void) unused_x; file_info_check(fi); - g_assert(guid == fi->guid); /* GUID shared with fi's, don't free */ /* * fi structure in value not freed, shared with other hash tables @@ -2173,17 +2353,13 @@ * Callback for hash table iterator. Used by file_info_close(). */ static void -file_info_free_outname_kv(gpointer key, gpointer val, gpointer unused_x) +file_info_free_outname_kv(void *val, void *unused_x) { - const char *name = key; fileinfo_t *fi = val; (void) unused_x; file_info_check(fi); - /* name shared with fi's, don't free */ - g_assert(name == fi->pathname); - /* * This table is the last one to be freed, and it is also guaranteed to * contain ALL fileinfo, and only ONCE, by definition. Thus freeing @@ -2254,7 +2430,7 @@ /** * Close and free all file_info structs in the list. */ -G_GNUC_COLD void +void G_COLD file_info_close(void) { unsigned i; @@ -2265,15 +2441,15 @@ * all the known `fi' structs by definition). */ - g_hash_table_foreach(fi_by_sha1, file_info_free_sha1_kv, NULL); - g_hash_table_foreach(fi_by_namesize, file_info_free_namesize_kv, NULL); - g_hash_table_foreach(fi_by_guid, file_info_free_guid_kv, NULL); - g_hash_table_foreach(fi_by_outname, file_info_free_outname_kv, NULL); + hikset_foreach(fi_by_sha1, file_info_free_sha1_kv, NULL); + htable_foreach(fi_by_namesize, file_info_free_namesize_kv, NULL); + hikset_foreach(fi_by_guid, file_info_free_guid_kv, NULL); + hikset_foreach(fi_by_outname, file_info_free_outname_kv, NULL); - g_assert(0 == idtable_ids(src_handle_map)); + g_assert(0 == idtable_count(src_handle_map)); idtable_destroy(src_handle_map); - for (i = 0; i < G_N_ELEMENTS(src_events); i++) { + for (i = 0; i < N_ITEMS(src_events); i++) { event_destroy(src_eventsi); } @@ -2283,16 +2459,16 @@ * --Richard, 9/3/2003 */ - g_assert(0 == idtable_ids(fi_handle_map)); + g_assert(0 == idtable_count(fi_handle_map)); idtable_destroy(fi_handle_map); - for (i = 0; i < G_N_ELEMENTS(fi_events); i++) { + for (i = 0; i < N_ITEMS(fi_events); i++) { event_destroy(fi_eventsi); } - gm_hash_table_destroy_null(&fi_by_sha1); - gm_hash_table_destroy_null(&fi_by_namesize); - gm_hash_table_destroy_null(&fi_by_guid); - gm_hash_table_destroy_null(&fi_by_outname); + hikset_free_null(&fi_by_sha1); + htable_free_null(&fi_by_namesize); + hikset_free_null(&fi_by_guid); + hikset_free_null(&fi_by_outname); HFREE_NULL(tbuf.arena); } @@ -2313,8 +2489,8 @@ if (GNET_PROPERTY(fileinfo_debug) > 4) g_debug("FILEINFO insert 0x%p \"%s\" " "(%s/%s bytes done) sha1=%s", - cast_to_gconstpointer(fi), fi->pathname, - uint64_to_string(fi->done), uint64_to_string2(fi->size), + cast_to_constpointer(fi), fi->pathname, + filesize_to_string(fi->done), filesize_to_string2(fi->size), fi->sha1 ? sha1_base32(fi->sha1) : "none"); /* @@ -2331,12 +2507,12 @@ * --RAM, 01/09/2002 */ - xfi = g_hash_table_lookup(fi_by_outname, fi->pathname); + xfi = hikset_lookup(fi_by_outname, fi->pathname); if (xfi) { file_info_check(xfi); g_assert(xfi == fi); - } else { - gm_hash_table_insert_const(fi_by_outname, fi->pathname, fi); + } else { + hikset_insert_key(fi_by_outname, &fi->pathname); } /* @@ -2347,13 +2523,13 @@ */ if (fi->sha1) { - xfi = g_hash_table_lookup(fi_by_sha1, fi->sha1); + xfi = hikset_lookup(fi_by_sha1, fi->sha1); if (NULL != xfi && xfi != fi) /* See comment above */ g_error("xfi = %p, fi = %p", (void *) xfi, (void *) fi); if (NULL == xfi) - gm_hash_table_insert_const(fi_by_sha1, fi->sha1, fi); + hikset_insert_key(fi_by_sha1, &fi->sha1); /* * To be able to return hits on partial files for which we have SHA1, @@ -2361,7 +2537,7 @@ */ shared_file_from_fileinfo(fi); - if (fi->sf != NULL) + if (fi->sf != NULL) share_add_partial(fi->sf); } @@ -2374,13 +2550,13 @@ * Obviously, GUID entries must be unique as well. */ - xfi = g_hash_table_lookup(fi_by_guid, fi->guid); + xfi = hikset_lookup(fi_by_guid, fi->guid); if (NULL != xfi && xfi != fi) /* See comment above */ g_error("xfi = %p, fi = %p", (void *) xfi, (void *) fi); if (NULL == xfi) - gm_hash_table_insert_const(fi_by_guid, fi->guid, fi); + hikset_insert_key(fi_by_guid, &fi->guid); /* * Notify interested parties, update counters. @@ -2401,8 +2577,6 @@ file_info_hash_remove(fileinfo_t *fi) { const fileinfo_t *xfi; - namesize_t nsk; - gboolean found; file_info_check(fi); g_assert(fi->hashed); @@ -2411,11 +2585,12 @@ if (GNET_PROPERTY(fileinfo_debug) > 4) { g_debug("FILEINFO remove %p \"%s\" (%s/%s bytes done) sha1=%s", (void *) fi, fi->pathname, - uint64_to_string(fi->done), uint64_to_string2(fi->size), + filesize_to_string(fi->done), filesize_to_string2(fi->size), fi->sha1 ? sha1_base32(fi->sha1) : "none"); } file_info_drop_handle(fi, "Discarding file info"); + entropy_harvest_single(PTRLEN(fi->guid)); g_assert(GNET_PROPERTY(fi_all_count) > 0); gnet_prop_decr_guint32(PROP_FI_ALL_COUNT); @@ -2431,56 +2606,21 @@ * Remove from plain hash tables: by output name, by SHA1 and by GUID. */ - xfi = g_hash_table_lookup(fi_by_outname, fi->pathname); + xfi = hikset_lookup(fi_by_outname, fi->pathname); if (xfi) { file_info_check(xfi); g_assert(xfi == fi); - g_hash_table_remove(fi_by_outname, fi->pathname); + hikset_remove(fi_by_outname, fi->pathname); } if (fi->sha1) - g_hash_table_remove(fi_by_sha1, fi->sha1); + hikset_remove(fi_by_sha1, fi->sha1); - if (fi->file_size_known) { - GSList *sl, *head; - - /* - * Remove all the aliases from the (name, size) table. - */ - - nsk.size = fi->size; - - for (sl = fi->alias; NULL != sl; sl = g_slist_next(sl)) { - namesize_t *ns; - GSList *slist; - gpointer key, value; - - nsk.name = sl->data; - - found = g_hash_table_lookup_extended(fi_by_namesize, &nsk, - &key, &value); - - ns = key; - slist = value; - g_assert(found); - g_assert(NULL != slist); - g_assert(ns->size == fi->size); - - head = slist; - slist = g_slist_remove(slist, fi); - - if (NULL == slist) { - g_hash_table_remove(fi_by_namesize, ns); - namesize_free(ns); - } else if (head != slist) { - gm_hash_table_insert_const(fi_by_namesize, ns, slist); - /* Head changed */ - } - } - } + if (fi->file_size_known) + file_info_hash_remove_name_size(fi); transient: - g_hash_table_remove(fi_by_guid, fi->guid); + hikset_remove(fi_by_guid, fi->guid); fi->hashed = FALSE; } @@ -2496,7 +2636,7 @@ if (fi->sf) { upload_stop_all(fi, reason); share_remove_partial(fi->sf); - shared_file_unref(&fi->sf); + shared_file_fileinfo_unref(&fi->sf); fi->flags &= ~FI_F_SEEDING; file_info_changed(fi); fileinfo_dirty = TRUE; @@ -2539,7 +2679,7 @@ * requesting it are terminated. */ - file_info_upload_stop(fi, "Partial file removed"); + file_info_upload_stop(fi, N_("Partial file removed")); if (fi->flags & (FI_F_TRANSIENT|FI_F_SEEDING|FI_F_STRIPPED|FI_F_UNLINKED)) return; @@ -2547,7 +2687,7 @@ /* * Only try to unlink partials because completed files are * already moved or renamed and this could in theory match - * the filename of another download started afterwards which + * the filename of another download started afterwards which * means the wrong file would be removed. */ if (FILE_INFO_COMPLETE(fi)) @@ -2563,7 +2703,7 @@ } else { g_warning("unlinked \"%s\" (%s/%s bytes or %u%% done, %s SHA1%s%s)", fi->pathname, - uint64_to_string(fi->done), uint64_to_string2(fi->size), + filesize_to_string(fi->done), filesize_to_string2(fi->size), (unsigned) (fi->done * 100U / (fi->size == 0 ? 1 : fi->size)), fi->sha1 ? "with" : "no", fi->sha1 ? ": " : "", @@ -2604,7 +2744,7 @@ * * @returns TRUE if OK, FALSE if a duplicate record with the same SHA1 exists. */ -gboolean +bool file_info_got_sha1(fileinfo_t *fi, const struct sha1 *sha1) { fileinfo_t *xfi; @@ -2613,11 +2753,11 @@ g_assert(sha1); g_assert(NULL == fi->sha1); - xfi = g_hash_table_lookup(fi_by_sha1, sha1); + xfi = hikset_lookup(fi_by_sha1, sha1); if (NULL == xfi) { fi->sha1 = atom_sha1_get(sha1); - gm_hash_table_insert_const(fi_by_sha1, fi->sha1, fi); + hikset_insert_key(fi_by_sha1, &fi->sha1); if (can_publish_partial_sha1) publisher_add(fi->sha1); return TRUE; @@ -2641,24 +2781,24 @@ char buf64; concat_strings(buf, sizeof buf, - uint64_to_string(xfi->done), "/", - uint64_to_string2(xfi->size), (void *) 0); + filesize_to_string(xfi->done), "/", + filesize_to_string2(xfi->size), NULL_PTR); g_debug("CONFLICT found same SHA1 %s in \"%s\" " "(%s bytes done) and \"%s\" (%s/%s bytes done)\n", sha1_base32(sha1), xfi->pathname, buf, fi->pathname, - uint64_to_string(fi->done), uint64_to_string2(fi->size)); + filesize_to_string(fi->done), filesize_to_string2(fi->size)); } if (fi->done && xfi->done) { char buf64; concat_strings(buf, sizeof buf, - uint64_to_string(xfi->done), "/", - uint64_to_string2(xfi->size), (void *) 0); + filesize_to_string(xfi->done), "/", + filesize_to_string2(xfi->size), NULL_PTR); g_warning("found same SHA1 %s in \"%s\" (%s bytes done) and \"%s\" " "(%s/%s bytes done) -- aborting last one", sha1_base32(sha1), xfi->pathname, buf, fi->pathname, - uint64_to_string(fi->done), uint64_to_string2(fi->size)); + filesize_to_string(fi->done), filesize_to_string2(fi->size)); return FALSE; } @@ -2666,7 +2806,7 @@ g_assert(0 == xfi->done); fi->sha1 = atom_sha1_get(sha1); file_info_reparent_all(xfi, fi); /* All `xfi' replaced by `fi' */ - gm_hash_table_insert_const(fi_by_sha1, fi->sha1, fi); + hikset_insert_key(fi_by_sha1, &fi->sha1); } else { g_assert(0 == fi->done); file_info_reparent_all(fi, xfi); /* All `fi' replaced by `xfi' */ @@ -2708,8 +2848,7 @@ if (strlen(s) < SHA1_BASE32_SIZE) return NULL; - if (SHA1_RAW_SIZE != base32_decode(sha1.data, sizeof sha1.data, - s, SHA1_BASE32_SIZE)) + if (SHA1_RAW_SIZE != base32_decode(&sha1, sizeof sha1, s, SHA1_BASE32_SIZE)) return NULL; return atom_sha1_get(&sha1); @@ -2723,14 +2862,13 @@ if (strlen(s) < TTH_BASE32_SIZE) return NULL; - if (TTH_RAW_SIZE != base32_decode(tth.data, sizeof tth.data, - s, TTH_BASE32_SIZE)) + if (TTH_RAW_SIZE != base32_decode(&tth, sizeof tth, s, TTH_BASE32_SIZE)) return NULL; return atom_tth_get(&tth); } -typedef enum { +enum fi_tag { FI_TAG_UNKNOWN = 0, FI_TAG_ALIA, FI_TAG_CHA1, @@ -2748,61 +2886,41 @@ FI_TAG_SIZE, FI_TAG_SWRM, FI_TAG_TIME, - FI_TAG_TTH, - - NUM_FI_TAGS -} fi_tag_t; + FI_TAG_TTH +}; -static const struct fi_tag { - fi_tag_t tag; - const char *str; -} fi_tag_map = { +static const tokenizer_t fi_tags = { /* Must be sorted alphabetically for dichotomic search */ - { FI_TAG_ALIA, "ALIA" }, - { FI_TAG_CHA1, "CHA1" }, - { FI_TAG_CHNK, "CHNK" }, - { FI_TAG_CTIM, "CTIM" }, - { FI_TAG_DONE, "DONE" }, - { FI_TAG_FSKN, "FSKN" }, - { FI_TAG_GENR, "GENR" }, - { FI_TAG_GUID, "GUID" }, - { FI_TAG_NAME, "NAME" }, - { FI_TAG_NTIM, "NTIM" }, - { FI_TAG_PATH, "PATH" }, - { FI_TAG_PAUS, "PAUS" }, - { FI_TAG_SHA1, "SHA1" }, - { FI_TAG_SIZE, "SIZE" }, - { FI_TAG_SWRM, "SWRM" }, - { FI_TAG_TIME, "TIME" }, - { FI_TAG_TTH, "TTH" }, +#define FI_TAG(x) { #x, CAT2(FI_TAG_,x) } + + FI_TAG(ALIA), + FI_TAG(CHA1), + FI_TAG(CHNK), + FI_TAG(CTIM), + FI_TAG(DONE), + FI_TAG(FSKN), + FI_TAG(GENR), + FI_TAG(GUID), + FI_TAG(NAME), + FI_TAG(NTIM), + FI_TAG(PATH), + FI_TAG(PAUS), + FI_TAG(SHA1), + FI_TAG(SIZE), + FI_TAG(SWRM), + FI_TAG(TIME), + FI_TAG(TTH), /* Above line intentionally left blank (for "!}sort" on vi) */ + +#undef FI_TAG }; -/** - * Transform fileinfo tag string into tag constant. - * For instance, "TIME" would yield FI_TAG_TIME. - * An unknown tag yieldd FI_TAG_UNKNOWN. - */ -static fi_tag_t +static inline enum fi_tag file_info_string_to_tag(const char *s) { - STATIC_ASSERT(G_N_ELEMENTS(fi_tag_map) == (NUM_FI_TAGS - 1)); - -#define GET_KEY(i) (fi_tag_map(i).str) -#define FOUND(i) G_STMT_START { \ - return fi_tag_map(i).tag; \ - /* NOTREACHED */ \ -} G_STMT_END - - /* Perform a binary search to find ``uc'' */ - BINARY_SEARCH(const char *, s, G_N_ELEMENTS(fi_tag_map), strcmp, - GET_KEY, FOUND); - -#undef FOUND -#undef GET_KEY - return FI_TAG_UNKNOWN; + return TOKENIZE(s, fi_tags); } /** @@ -2815,11 +2933,12 @@ if (fi->file_size_known) { struct dl_file_chunk *fc; + file_info_chunklist_free(fi); fc = dl_file_chunk_alloc(); fc->from = 0; fc->to = fi->size; fc->status = DL_CHUNK_EMPTY; - fi->chunklist = g_slist_append(fi->chunklist, fc); + eslist_append(&fi->chunklist, fc); } fi->generation = 0; /* Restarting from scratch... */ @@ -2833,28 +2952,23 @@ static void fi_copy_chunks(fileinfo_t *fi, fileinfo_t *trailer) { - GSList *sl; + const struct dl_file_chunk *fc; file_info_check(fi); file_info_check(trailer); - g_assert(NULL == fi->chunklist); + g_assert(0 == eslist_count(&fi->chunklist)); g_assert(file_info_check_chunklist(trailer, TRUE)); fi->generation = trailer->generation; if (trailer->cha1) fi->cha1 = atom_sha1_get(trailer->cha1); - for (sl = trailer->chunklist; NULL != sl; sl = g_slist_next(sl)) { - const struct dl_file_chunk *fc = sl->data; - - g_assert(fc); + ESLIST_FOREACH_DATA(&trailer->chunklist, fc) { + dl_file_chunk_check(fc); g_assert(fc->from <= fc->to); - g_assert(sl != trailer->chunklist || 0 == fc->from); - /* Prepend now and reverse later for better efficiency */ - fi->chunklist = g_slist_prepend(fi->chunklist, wcopy(fc, sizeof *fc)); - } - fi->chunklist = g_slist_reverse(fi->chunklist); + eslist_append(&fi->chunklist, WCOPY(fc)); + } file_info_merge_adjacent(fi); /* Recalculates also fi->done */ } @@ -2862,14 +2976,14 @@ /** * Loads the fileinfo database from disk, and saves a copy in fileinfo.orig. */ -G_GNUC_COLD void +void G_COLD file_info_retrieve(void) { FILE *f; char line1024; fileinfo_t *fi = NULL; - gboolean empty = TRUE; - gboolean last_was_truncated = FALSE; + bool empty = TRUE; + bool last_was_truncated = FALSE; file_path_t fp; const char *old_filename = NULL; /* In case we must rename the file */ const char *path = NULL; @@ -2896,10 +3010,10 @@ while (fgets(line, sizeof line, f)) { int error; - gboolean truncated = FALSE, damaged; + bool truncated = FALSE, damaged; const char *ep; char *value; - guint64 v; + uint64 v; /* * The following semi-complex logic attempts to determine whether @@ -2932,8 +3046,8 @@ if ('\0' == *line && fi) { fileinfo_t *dfi; - gboolean upgraded; - gboolean reload_chunks = FALSE; + bool upgraded; + bool reload_chunks = FALSE; if (filename && path) { char *pathname = make_pathname(path, filename); @@ -2950,7 +3064,7 @@ * There can't be duplicates! */ - dfi = g_hash_table_lookup(fi_by_outname, fi->pathname); + dfi = hikset_lookup(fi_by_outname, fi->pathname); if (NULL != dfi) { g_warning("discarding DUPLICATE fileinfo entry for \"%s\"", filepath_basename(fi->pathname)); @@ -2980,7 +3094,7 @@ * --RAM, 31/12/2003 */ - if (NULL == fi->chunklist) { + if (0 == eslist_count(&fi->chunklist)) { if (fi->file_size_known) g_warning("no CHNK info for \"%s\"", fi->pathname); fi_reset_chunks(fi); @@ -3006,7 +3120,7 @@ if (NULL != old_filename) { const char *new_pathname; char *old_path; - gboolean renamed = TRUE; + bool renamed = TRUE; old_path = filepath_directory(fi->pathname); new_pathname = file_info_new_outname(old_path, @@ -3050,9 +3164,11 @@ if (dfi != NULL && reload_chunks) { fi_copy_chunks(fi, dfi); - if (fi->chunklist) g_message( - "recovered %s downloaded bytes from trailer of \"%s\"", + if (0 != eslist_count(&fi->chunklist)) { + g_message("recovered %s downloaded bytes " + "from trailer of \"%s\"", filesize_to_string(fi->done), fi->pathname); + } } else if (reload_chunks) g_warning("lost all CHNK info for \"%s\" -- downloading again", fi->pathname); @@ -3096,7 +3212,7 @@ g_warning("discarding cached metainfo for \"%s\": " "file had %s bytes downloaded " "but is now gone!", fi->pathname, - uint64_to_string(fi->done)); + filesize_to_string(fi->done)); goto reset; } } @@ -3125,8 +3241,8 @@ if (NULL != dfi) { g_warning("found DUPLICATE entry for \"%s\" " "(%s bytes) with \"%s\" (%s bytes)", - fi->pathname, uint64_to_string(fi->size), - dfi->pathname, uint64_to_string2(dfi->size)); + fi->pathname, filesize_to_string(fi->size), + dfi->pathname, filesize_to_string2(dfi->size)); goto reset; } @@ -3156,19 +3272,19 @@ */ if (fi->alias) { - GSList *aliases, *sl; + pslist_t *aliases, *sl; /* For efficiency each alias has been prepended to * the list. To preserve the order between sessions, * the original list order is restored here. */ - aliases = g_slist_reverse(fi->alias); + aliases = pslist_reverse(fi->alias); fi->alias = NULL; - for (sl = aliases; NULL != sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(aliases, sl) { const char *s = sl->data; fi_alias(fi, s, TRUE); atom_str_free_null(&s); } - gm_slist_free_null(&aliases); + pslist_free_null(&aliases); } empty = FALSE; @@ -3177,10 +3293,7 @@ } if (!fi) { - WALLOC0(fi); - fi->magic = FI_MAGIC; - fi->refcount = 0; - fi->seen_on_network = NULL; + fi = file_info_allocate(); fi->file_size_known = TRUE; /* Unless stated otherwise below */ old_filename = NULL; } @@ -3265,8 +3378,7 @@ * utilizing fi_free(). * The list should be reversed once it's complete. */ - fi->alias = g_slist_prepend(fi->alias, - deconstify_gchar(atom_str_get(b))); + fi->alias = pslist_prepend_const(fi->alias, atom_str_get(b)); if (s != value) { if (strcmp(s, value)) { g_warning("fileinfo database contained an " @@ -3279,14 +3391,14 @@ break; case FI_TAG_GENR: v = parse_uint32(value, &ep, 10, &error); - damaged = error || '\0' != *ep || v > (guint32) INT_MAX; + damaged = error || '\0' != *ep || v > (uint32) INT_MAX; fi->generation = v; break; case FI_TAG_SIZE: v = parse_uint64(value, &ep, 10, &error); damaged = error || '\0' != *ep - || v >= ((guint64) 1UL << 63) + || v >= ((uint64) 1UL << 63) || (!fi->file_size_known && 0 == v); fi->size = v; break; @@ -3315,7 +3427,7 @@ break; case FI_TAG_DONE: v = parse_uint64(value, &ep, 10, &error); - damaged = error || '\0' != *ep || v >= ((guint64) 1UL << 63); + damaged = error || '\0' != *ep || v >= ((uint64) 1UL << 63); fi->done = v; break; case FI_TAG_SWRM: @@ -3342,12 +3454,12 @@ case FI_TAG_CHNK: { filesize_t from, to; - guint32 status; + uint32 status; from = v = parse_uint64(value, &ep, 10, &error); damaged = error || *ep != ' ' - || v >= ((guint64) 1UL << 63) + || v >= ((uint64) 1UL << 63) || from > fi->size; if (!damaged) { @@ -3356,7 +3468,7 @@ to = v = parse_uint64(s, &ep, 10, &error); damaged = error || ' ' != *ep - || v >= ((guint64) 1UL << 63) + || v >= ((uint64) 1UL << 63) || v <= from || to > fi->size; } else { @@ -3379,14 +3491,13 @@ if (DL_CHUNK_BUSY == status) status = DL_CHUNK_EMPTY; fc->status = status; - prev = fi->chunklist - ? g_slist_last(fi->chunklist)->data : NULL; + prev = eslist_tail(&fi->chunklist); if (fc->from != (prev ? prev->to : 0)) { - g_warning("Chunklist is inconsistent (fi->size=%s)", - uint64_to_string(fi->size)); + g_warning("chunklist is inconsistent (fi->size=%s)", + filesize_to_string(fi->size)); damaged = TRUE; } else { - fi->chunklist = g_slist_append(fi->chunklist, fc); + eslist_append(&fi->chunklist, fc); } } } @@ -3395,8 +3506,6 @@ if (*line) g_warning("ignoring fileinfo line: \"%s %s\"", line, value); break; - case NUM_FI_TAGS: - g_assert_not_reached(); } if (damaged) @@ -3428,10 +3537,10 @@ fclose(f); } -static gboolean +static bool file_info_name_is_uniq(const char *pathname) { - return NULL == g_hash_table_lookup(fi_by_outname, pathname) && + return !hikset_contains(fi_by_outname, pathname) && path_does_not_exist(pathname); } @@ -3445,7 +3554,7 @@ { return filename_unique(path, file, ext, file_info_name_is_uniq); } - + /** * Allocate unique output name for file `name', stored in `dir'. * @@ -3491,7 +3600,7 @@ pathname = atom_str_get(uniq); HFREE_NULL(uniq); - g_assert(NULL == g_hash_table_lookup(fi_by_outname, pathname)); + g_assert(!hikset_contains(fi_by_outname, pathname)); return pathname; } else { return NULL; @@ -3505,7 +3614,7 @@ */ static fileinfo_t * file_info_create(const char *file, const char *path, filesize_t size, - const struct sha1 *sha1, gboolean file_size_known) + const struct sha1 *sha1, bool file_size_known) { const char *pathname; fileinfo_t *fi; @@ -3514,14 +3623,9 @@ pathname = file_info_new_outname(path, file); g_return_val_if_fail(pathname, NULL); - WALLOC0(fi); - fi->magic = FI_MAGIC; - - /* Get unique file name */ - fi->pathname = pathname; - - /* Get unique ID */ - fi->guid = fi_random_guid_atom(); + fi = file_info_allocate(); + fi->pathname = pathname; /* Get unique file name */ + fi->guid = fi_random_guid_atom(); /* Get unique ID */ if (sha1) fi->sha1 = atom_sha1_get(sha1); @@ -3536,16 +3640,15 @@ if (-1 != stat(fi->pathname, &st) && S_ISREG(st.st_mode)) { struct dl_file_chunk *fc; - g_warning("file_info_create(): " - "assuming file \"%s\" is complete up to %s bytes", - fi->pathname, uint64_to_string(st.st_size)); + g_warning("%s(): assuming file \"%s\" is complete up to %s bytes", + G_STRFUNC, fi->pathname, filesize_to_string(st.st_size)); fc = dl_file_chunk_alloc(); fc->from = 0; fi->size = fc->to = st.st_size; fc->status = DL_CHUNK_DONE; fi->modified = st.st_mtime; - fi->chunklist = g_slist_append(fi->chunklist, fc); + eslist_append(&fi->chunklist, fc); fi->dirty = TRUE; } @@ -3566,15 +3669,13 @@ fileinfo_t *fi; char *path; - WALLOC0(fi); - fi->magic = FI_MAGIC; + fi = file_info_allocate(); path = make_pathname("/non-existent", name); fi->pathname = atom_str_get(path); HFREE_NULL(path); - /* Get unique ID */ - fi->guid = fi_random_guid_atom(); + fi->guid = fi_random_guid_atom(); /* Get unique ID */ fi->size = 0; /* Will be updated by fi_resize() */ fi->file_size_known = FALSE; @@ -3630,7 +3731,7 @@ file_info_moved(fileinfo_t *fi, const char *pathname) { const fileinfo_t *xfi; - + file_info_check(fi); g_assert(pathname); g_assert(is_absolute_path(pathname)); @@ -3639,21 +3740,21 @@ if (!fi->hashed) return; - xfi = g_hash_table_lookup(fi_by_outname, fi->pathname); + xfi = hikset_lookup(fi_by_outname, fi->pathname); if (xfi) { file_info_check(xfi); g_assert(xfi == fi); - g_hash_table_remove(fi_by_outname, fi->pathname); + hikset_remove(fi_by_outname, fi->pathname); } atom_str_change(&fi->pathname, pathname); - g_assert(NULL == g_hash_table_lookup(fi_by_outname, fi->pathname)); - gm_hash_table_insert_const(fi_by_outname, fi->pathname, fi); + g_assert(NULL == hikset_lookup(fi_by_outname, fi->pathname)); + hikset_insert_key(fi_by_outname, &fi->pathname); if (fi->sf) { filestat_t sb; - + shared_file_set_path(fi->sf, fi->pathname); if ( stat(fi->pathname, &sb) || @@ -3680,7 +3781,7 @@ */ fileinfo_t * file_info_get(const char *file, const char *path, filesize_t size, - const struct sha1 *sha1, gboolean file_size_known) + const struct sha1 *sha1, bool file_size_known) { fileinfo_t *fi; const char *pathname; @@ -3728,7 +3829,7 @@ g_warning("file \"%s\" (SHA1 %s) was %s bytes, resizing to %s", fi->pathname, sha1_base32(fi->sha1), - uint64_to_string(fi->size), uint64_to_string2(size)); + filesize_to_string(fi->size), filesize_to_string2(size)); file_info_hash_remove(fi); fi_resize(fi, size); @@ -3797,7 +3898,7 @@ fi_rename_dead(fi, pathname); fi_free(fi); fi = NULL; - } else if (NULL != g_hash_table_lookup(fi_by_guid, fi->guid)) { + } else if (hikset_contains(fi_by_guid, fi->guid)) { g_warning("found DEAD file \"%s\" with conflicting ID %s", pathname, guid_hex_str(fi->guid)); @@ -3812,7 +3913,8 @@ */ g_warning("found existing file \"%s\" size=%s, increasing to %s", - pathname, uint64_to_string(fi->size), uint64_to_string2(size)); + pathname, filesize_to_string(fi->size), + filesize_to_string2(size)); fi_resize(fi, size); } @@ -3886,7 +3988,7 @@ * Set or clear the discard state for a fileinfo. */ void -file_info_set_discard(fileinfo_t *fi, gboolean state) +file_info_set_discard(fileinfo_t *fi, bool state) { file_info_check(fi); @@ -3903,9 +4005,8 @@ void file_info_merge_adjacent(fileinfo_t *fi) { - GSList *fclist; + slink_t *sl, *next; struct dl_file_chunk *fc1, *fc2; - GSList *next = NULL; filesize_t done; file_info_check(fi); @@ -3914,14 +4015,13 @@ done = 0; fc2 = NULL; - for (fclist = fi->chunklist; fclist; fclist = next) { + for (sl = eslist_first(&fi->chunklist); sl != NULL; sl = next) { fc1 = fc2; /* fc1 = previous chunk in list */ - fc2 = fclist->data; /* fc2 = current chunk */ - next = g_slist_next(fclist); + fc2 = eslist_data(&fi->chunklist, sl); /* fc2 = current chunk */ + next = eslist_next(sl); - if (fc2->download) { + if (fc2->download != NULL) download_check(fc2->download); - } if (DL_CHUNK_DONE == fc2->status) { fc2->download = NULL; /* Done, no longer reserved */ @@ -3939,10 +4039,13 @@ */ if (fc1->status == fc2->status && DL_CHUNK_BUSY != fc2->status) { + void *removed; + fc1->to = fc2->to; - fi->chunklist = g_slist_remove(fi->chunklist, fc2); + removed = eslist_remove_after(&fi->chunklist, fc1); + g_assert(removed == fc2); dl_file_chunk_free(&fc2); - fc2 = fc1; + fc2 = fc1; /* new current chunk */ } } @@ -3950,13 +4053,36 @@ * When file size is unknown, there may be no chunklist. */ - if (fi->chunklist != NULL) + if (0 != eslist_count(&fi->chunklist)) fi->done = done; g_assert(file_info_check_chunklist(fi, TRUE)); } /** + * Signals that the file size became suddenly unknown. + * + * This happens when we are receiving data past what we thought would be + * the end of the file. + */ +void +file_info_size_unknown(fileinfo_t *fi) +{ + file_info_check(fi); + g_assert(fi->file_size_known); + + if (0 == (fi->flags & FI_F_TRANSIENT)) { + file_info_hash_remove_name_size(fi); + fi->dirty = TRUE; + fileinfo_dirty = TRUE; + } + + fi->file_size_known = FALSE; + fi_event_trigger(fi, EV_FI_INFO_CHANGED); + +} + +/** * Signals that file size became known suddenly. * * The download becomes the owner of the "busy" part between what we @@ -3973,22 +4099,35 @@ file_info_check(fi); g_assert(!fi->file_size_known); - g_assert(!fi->use_swarming); - g_assert(fi->chunklist == NULL); /* * Mark everything we have so far as done. */ if (fi->done) { - struct dl_file_chunk *fc; + struct dl_file_chunk *fc = eslist_head(&fi->chunklist); - fc = dl_file_chunk_alloc(); - fc->from = 0; - fc->to = fi->done; /* Byte at that offset is excluded */ - fc->status = DL_CHUNK_DONE; + if (NULL == fc) { + fc = dl_file_chunk_alloc(); + fc->from = 0; + fc->to = fi->done; /* Byte at that offset is excluded */ + fc->status = DL_CHUNK_DONE; - fi->chunklist = g_slist_prepend(fi->chunklist, fc); + eslist_append(&fi->chunklist, fc); + } else { + fc->to = fi->done; + + /* + * Remove subsequent chunks. + */ + + while (NULL != eslist_next(&fc->lk)) { + struct dl_file_chunk *fcn; + + fcn = eslist_remove_after(&fi->chunklist, fc); + dl_file_chunk_free(&fcn); + } + } } /* @@ -4004,13 +4143,14 @@ fc->to = size; /* Byte at that offset is excluded */ fc->status = DL_CHUNK_BUSY; fc->download = d; - fi->chunklist = g_slist_append(fi->chunklist, fc); + eslist_append(&fi->chunklist, fc); } fi->file_size_known = TRUE; fi->use_swarming = TRUE; - fi->size = size; + fi->size = MAX(size, fi->done); fi->dirty = TRUE; + fileinfo_dirty = TRUE; if (0 == (FI_F_TRANSIENT & fi->flags)) { file_info_hash_insert_name_size(fi); @@ -4033,11 +4173,11 @@ enum dl_chunk_status status) { struct dl_file_chunk *fc, *nfc, *prevfc; - GSList *fclist; + slink_t *sl; fileinfo_t *fi; - gboolean found = FALSE; + bool found = FALSE; int n, againcount = 0; - gboolean need_merging; + bool need_merging; const struct download *newval; download_check(d); @@ -4066,12 +4206,11 @@ status_ok: /* - * If file size is not known yet, the chunk list will be empty. + * If file size is not known yet, the chunk list could be empty. * Simply update the downloaded amount if the chunk is marked as done. */ - if (!fi->file_size_known) { - g_assert(fi->chunklist == NULL); + if (!fi->file_size_known && 0 == eslist_count(&fi->chunklist)) { g_assert(!fi->use_swarming); if (status == DL_CHUNK_DONE) { @@ -4095,10 +4234,8 @@ /* I think the algorithm is safe now, but hey... */ if (++againcount > 10) { - g_error("Eek! Internal error! " - "file_info_update(%s, %s, %d) " - "is looping for \"%s\"! Man battle stations!", - uint64_to_string(from), uint64_to_string2(to), + g_error("%s(%s, %s, %d) is looping for \"%s\"! Man battle stations!", + G_STRFUNC, filesize_to_string(from), filesize_to_string2(to), status, d->file_name); return; } @@ -4113,11 +4250,11 @@ */ for ( - n = 0, prevfc = NULL, fclist = fi->chunklist; - fclist; - n++, prevfc = fc, fclist = g_slist_next(fclist) + n = 0, prevfc = NULL, sl = eslist_first(&fi->chunklist); + sl != NULL; + n++, prevfc = fc, sl = eslist_next(sl) ) { - fc = fclist->data; + fc = eslist_data(&fi->chunklist, sl); dl_file_chunk_check(fc); @@ -4154,7 +4291,7 @@ g_assert(file_info_check_chunklist(fi, TRUE)); continue; - } else if ((fc->from == from) && (fc->to > to)) { + } else if (fc->from == from && fc->to > to) { if (DL_CHUNK_DONE == fc->status) need_merging = TRUE; /* Writing to completed chunk! */ @@ -4181,14 +4318,14 @@ fc->to = to; fc->status = status; fc->download = newval; - gm_slist_insert_after(fi->chunklist, fclist, nfc); + eslist_insert_after(&fi->chunklist, fc, nfc); g_assert(file_info_check_chunklist(fi, TRUE)); } found = TRUE; break; - } else if ((fc->from < from) && (fc->to >= to)) { + } else if (fc->from < from && fc->to >= to) { /* * New chunk from, to lies within fc->from, fc->to. @@ -4206,7 +4343,7 @@ nfc->to = fc->to; nfc->status = fc->status; nfc->download = fc->download; - gm_slist_insert_after(fi->chunklist, fclist, nfc); + eslist_insert_after(&fi->chunklist, fc, nfc); if (DL_CHUNK_BUSY == nfc->status) { /* @@ -4225,7 +4362,7 @@ nfc->to = to; nfc->status = status; nfc->download = newval; - gm_slist_insert_after(fi->chunklist, fclist, nfc); + eslist_insert_after(&fi->chunklist, fc, nfc); fc->to = from; @@ -4233,7 +4370,7 @@ g_assert(file_info_check_chunklist(fi, TRUE)); break; - } else if ((fc->from < from) && (fc->to < to)) { + } else if (fc->from < from && fc->to < to) { filesize_t tmp; @@ -4248,7 +4385,7 @@ nfc->to = fc->to; nfc->status = status; nfc->download = newval; - gm_slist_insert_after(fi->chunklist, fclist, nfc); + eslist_insert_after(&fi->chunklist, fc, nfc); tmp = fc->to; fc->to = from; @@ -4260,15 +4397,17 @@ if (!found) { /* Should never happen. */ - g_warning("file_info_update(): " - "(%s) Didn't find matching chunk for <%s-%s> (%u)", - fi->pathname, uint64_to_string(from), - uint64_to_string2(to), status); - - for (fclist = fi->chunklist; fclist; fclist = g_slist_next(fclist)) { - fc = fclist->data; - g_warning("... %s %s %u", uint64_to_string(fc->from), - uint64_to_string2(fc->to), fc->status); + g_critical("%s(): didn't find matching chunk for <%s-%s> (%u) " + "for \"%s\" (%s%s bytes)", + G_STRFUNC, filesize_to_string(from), filesize_to_string2(to), + status, fi->pathname, + fi->file_size_known ? "" : "unknown size, currently ", + filesize_to_string3(fi->size)); + + ESLIST_FOREACH(&fi->chunklist, sl) { + fc = eslist_data(&fi->chunklist, sl); + g_warning("... %s %s %u", filesize_to_string(fc->from), + filesize_to_string2(fc->to), fc->status); } } @@ -4301,9 +4440,9 @@ * and this is only used for assertions. */ void -file_info_clear_download(struct download *d, gboolean lifecount) +file_info_clear_download(struct download *d, bool lifecount) { - GSList *fclist; + struct dl_file_chunk *fc; fileinfo_t *fi; int busy = 0; /**< For assertions only */ int pipelined = 0; /**< For assertions only */ @@ -4313,9 +4452,7 @@ file_info_check(fi); g_assert(file_info_check_chunklist(fi, TRUE)); - for (fclist = fi->chunklist; fclist; fclist = fclist->next) { - struct dl_file_chunk *fc = fclist->data; - + ESLIST_FOREACH_DATA(&fi->chunklist, fc) { dl_file_chunk_check(fc); if (DL_CHUNK_BUSY == fc->status) { @@ -4351,7 +4488,7 @@ void file_info_reset(fileinfo_t *fi) { - GSList *list; + struct dl_file_chunk *fc; file_info_check(fi); g_assert(file_info_check_chunklist(fi, TRUE)); @@ -4359,17 +4496,16 @@ atom_sha1_free_null(&fi->cha1); /* File possibly shared */ - file_info_upload_stop(fi, "File info being reset"); + file_info_upload_stop(fi, N_("File info being reset")); fi->flags &= ~(FI_F_STRIPPED | FI_F_UNLINKED); restart: - for (list = fi->chunklist; list; list = g_slist_next(list)) { - struct dl_file_chunk *fc = list->data; - struct download *d; + ESLIST_FOREACH_DATA(&fi->chunklist, fc) { + struct download *d; dl_file_chunk_check(fc); - d = deconstify_gpointer(fc->download); + d = deconstify_pointer(fc->download); if (d) { download_check(d); @@ -4381,8 +4517,7 @@ } } - for (list = fi->chunklist; list; list = g_slist_next(list)) { - struct dl_file_chunk *fc = list->data; + ESLIST_FOREACH_DATA(&fi->chunklist, fc) { dl_file_chunk_check(fc); g_assert(NULL == fc->download); fc->status = DL_CHUNK_EMPTY; @@ -4400,14 +4535,12 @@ enum dl_chunk_status file_info_chunk_status(fileinfo_t *fi, filesize_t from, filesize_t to) { - const GSList *fclist; + const struct dl_file_chunk *fc; file_info_check(fi); g_assert(file_info_check_chunklist(fi, TRUE)); - for (fclist = fi->chunklist; fclist; fclist = g_slist_next(fclist)) { - const struct dl_file_chunk *fc = fclist->data; - + ESLIST_FOREACH_DATA(&fi->chunklist, fc) { dl_file_chunk_check(fc); if (from >= fc->from && to <= fc->to) @@ -4437,17 +4570,17 @@ file_info_new_chunk_owner(const struct download *d, filesize_t from, filesize_t to) { - const GSList *fclist; fileinfo_t *fi; const struct download *old = NULL; + const slink_t *sl; download_check(d); fi = d->file_info; file_info_check(fi); g_assert(file_info_check_chunklist(fi, TRUE)); - for (fclist = fi->chunklist; fclist; fclist = g_slist_next(fclist)) { - struct dl_file_chunk *fc = fclist->data; + ESLIST_FOREACH(&fi->chunklist, sl) { + struct dl_file_chunk *fc = eslist_data(&fi->chunklist, sl); dl_file_chunk_check(fc); @@ -4457,7 +4590,7 @@ */ if (DL_CHUNK_BUSY != fc->status) - continue; + continue; if ( (from >= fc->from && from < fc->to) || @@ -4474,12 +4607,8 @@ } if (old != NULL) { - for ( - fclist = g_slist_next(fclist); - fclist != NULL; - fclist = g_slist_next(fclist) - ) { - struct dl_file_chunk *fc = fclist->data; + for (sl = eslist_next(sl); sl != NULL; sl = eslist_next(sl)) { + struct dl_file_chunk *fc = eslist_data(&fi->chunklist, sl); dl_file_chunk_check(fc); @@ -4498,23 +4627,21 @@ enum dl_chunk_status file_info_pos_status(fileinfo_t *fi, filesize_t pos) { - const GSList *fclist; + const struct dl_file_chunk *fc; file_info_check(fi); g_assert(file_info_check_chunklist(fi, TRUE)); - for (fclist = fi->chunklist; fclist; fclist = g_slist_next(fclist)) { - const struct dl_file_chunk *fc = fclist->data; - + ESLIST_FOREACH_DATA(&fi->chunklist, fc) { dl_file_chunk_check(fc); if (pos >= fc->from && pos < fc->to) return fc->status; } if (pos > fi->size) { - g_warning("file_info_pos_status(): unreachable position %s " - "in %s-byte file \"%s\"", uint64_to_string(pos), - uint64_to_string2(fi->size), fi->pathname); + g_warning("%s(): unreachable position %s in %s-byte file \"%s\"", + G_STRFUNC, filesize_to_string(pos), + filesize_to_string2(fi->size), fi->pathname); } return DL_CHUNK_DONE; @@ -4558,7 +4685,7 @@ static int fi_busy_count(fileinfo_t *fi, const struct download *d) { - const GSList *sl; + const struct dl_file_chunk *fc; int count = 0; int pipelined = 0; @@ -4566,9 +4693,7 @@ file_info_check(fi); g_assert(file_info_check_chunklist(fi, TRUE)); - for (sl = fi->chunklist; sl; sl = g_slist_next(sl)) { - const struct dl_file_chunk *fc = sl->data; - + ESLIST_FOREACH_DATA(&fi->chunklist, fc) { dl_file_chunk_check(fc); if (fc->download != NULL) { download_check(d); @@ -4586,23 +4711,288 @@ } /** - * Clone fileinfo's chunk list, shifting the origin of the list to a randomly - * selected offset within the file. + * Compares two offered ranges so that two ranges are equal when they overlap. + */ +static int +fi_chunk_overlap_cmp(const void *a, const void *b) +{ + const struct dl_file_chunk *ca = a, *cb = b; + + if (ca->to <= cb->from) /* `to' is NOT part of the chunk range */ + return -1; + + if (cb->to <= ca->from) + return +1; + + return 0; /* Overlapping chunks are equal */ +} + +/** + * Select a chunk randomly among the rarest chunks offered on the network. + * + * If no download source is provided, then we assume we can pick any missing + * chunk. Otherwise, we make sure to select a chunk that is available from + * that source. * * If the first chunk is not completed or not at least "pfsp_first_chunk" bytes - * long, the original list is returned. + * long, returns the first chunk. * - * We also strive to get the latest "pfsp_first_chunk" bytes of the file as + * @param fi the fileinfo where we have to pick a chunk from + * @param d the possibly partial download source (may be NULL) + * @param size the targeted chunk size + * + * @return the picked chunk among the fileinfo's chunklist. + */ +static const struct dl_file_chunk * +fi_pick_rarest_chunk(fileinfo_t *fi, const download_t *d, filesize_t size) +{ + rbtree_t *missing; + http_rangeset_t *offered; + const struct dl_file_chunk *fc; + const struct dl_file_chunk *first, *candidate = NULL; + uint32 rarest_count = 0; + const struct dl_avail_chunk *rarest = NULL, *fa; + + file_info_check(fi); + g_assert(0 != eslist_count(&fi->chunklist)); + + first = eslist_head(&fi->chunklist); /* First chunk */ + dl_file_chunk_check(first); + + if (!fi->file_size_known) + return first; + + if (GNET_PROPERTY(pfsp_first_chunk) > 0) { + /* + * See whether chunks up to ``pfsp_first_chunk'' bytes are free. + */ + + ESLIST_FOREACH_DATA(&fi->chunklist, fc) { + if (fc->from >= GNET_PROPERTY(pfsp_first_chunk)) + break; + + if (DL_CHUNK_EMPTY == fc->status) { + if (GNET_PROPERTY(download_debug)) { + g_debug("%s(): less than %u bytes, using first chunk", + G_STRFUNC, GNET_PROPERTY(pfsp_first_chunk)); + } + + candidate = first; + goto done; + } + } + } + + /* + * The `missing' red-black tree contains the file chunks that are still + * empty and need to be downloaded. + * + * The `offered' set contains the HTTP ranges offered by the source, + * if any given. If NULL, it means the source covers the whole file. + */ + + missing = rbtree_create(fi_chunk_overlap_cmp); + offered = NULL == d ? NULL : d->ranges; + + ESLIST_FOREACH_DATA(&fi->chunklist, fc) { + dl_file_chunk_check(fc); + + if (DL_CHUNK_EMPTY == fc->status) { + rbtree_insert(missing, fc); + } + } + + /* + * Find the first missing chunk that is also offered, starting with the + * rarest available chunk: the fi->available list is sorted by increasing + * source count. + */ + + ESLIST_FOREACH_DATA(&fi->available, fa) { + struct dl_file_chunk *dfc; + struct dl_file_chunk crange; + + dl_avail_chunk_check(fa); + + /* + * If we have already found a candidate and this chunk has more + * sources, we're done. + */ + + if (rarest != NULL && fa->sources > rarest->sources) + break; + + if ( + offered != NULL && + !http_rangeset_contains(offered, fa->from, fa->to - 1) + ) + continue; /* Range not offered */ + + crange.from = fa->from; + crange.to = fa->to; + + dfc = rbtree_lookup(missing, &crange); + + if (dfc != NULL) { + /* Rare range overlaps with missing range */ + + if ( + GNET_PROPERTY(fileinfo_debug) > 2 || + GNET_PROPERTY(download_debug) > 1 + ) { + g_debug("%s(): possible rarest candidate #%u for \"%s\" is " + "%s, %s (%zu source%s)", + G_STRFUNC, rarest_count + 1, fi->pathname, + filesize_to_string(fa->from), filesize_to_string2(fa->to), + fa->sources, plural(fa->sources)); + } + + /* + * If this is not the first rarest candidate we see, then randomly + * select it, maybe. + * + * The second rarest chunk has exactly 1/2 chance to supersede + * the candidate, the third has 1/3 chance, etc... This allows + * us to randomly select a candidate without knowing beforehand how + * many we will find, whilst retaining an equal probability for + * all the chunks to be selected. + */ + + g_assert(dfc->download == NULL); /* Chunk is empty */ + + if (++rarest_count > 1 && 0 != random_value(rarest_count - 1)) + continue; + + rarest = fa; + candidate = dfc; + + /* + * If we're not a PFSP server, we retain the first candidate we see. + */ + + if (!GNET_PROPERTY(pfsp_server)) + break; + } + } + + /* + * If we have a candidate, then randomly pick the starting point in the + * range to maximize the dispersion if we are a PFSP server and if the + * chunk is larger than the targeted size. + */ + + if (rarest != NULL) { + struct dl_file_chunk *dfc = deconstify_pointer(candidate); + struct dl_file_chunk *nfc; + filesize_t start, end; + + g_assert(candidate != NULL); + + /* + * start, end is the intersection of the rarest chunk we selected + * with the candidate chunk (missing part to be downloaded still). + */ + + start = MAX(rarest->from, candidate->from); + end = MIN(rarest->to, candidate->to); + + if ( + GNET_PROPERTY(fileinfo_debug) > 2 || + GNET_PROPERTY(download_debug) > 1 + ) { + g_debug("%s(): rarest intersection chunk for \"%s\" is " + "%s, %s (%zu source%s)", + G_STRFUNC, fi->pathname, + filesize_to_string(start), filesize_to_string2(end), + rarest->sources, plural(rarest->sources)); + } + + g_assert(start < end); /* Because the two MUST overlap */ + + if (end - start > size && GNET_PROPERTY(pfsp_server)) { + filesize_t offset, length; + + length = end - start; + length -= size; + offset = start + get_random_file_offset(length); + offset &= ~FI_OFFSET_ALIGNMASK; /* Align on natural boundary */ + offset = MAX(offset, start); + + g_assert(offset >= candidate->from && offset <= candidate->to); + + start = offset; /* Randomly selected starting point */ + + if ( + GNET_PROPERTY(fileinfo_debug) > 2 || + GNET_PROPERTY(download_debug) > 1 + ) { + g_debug("%s(): randomly selected starting point is %s", + G_STRFUNC, filesize_to_string(start)); + } + } + + if (start > dfc->from && start < dfc->to) { + /* + * dfc was from, to. It becomes from, start. + * nfc is start, to and is inserted after fc. + */ + + nfc = dl_file_chunk_alloc(); + nfc->from = start; + nfc->to = dfc->to; + nfc->status = dfc->status; + dfc->to = start; + + eslist_insert_after(&fi->chunklist, dfc, nfc); + candidate = nfc; + + if ( + GNET_PROPERTY(fileinfo_debug) > 2 || + GNET_PROPERTY(download_debug) > 1 + ) { + g_debug("%s(): selected chunk is %s, %s", + G_STRFUNC, filesize_to_string(nfc->from), + filesize_to_string2(nfc->to)); + } + } + } + + /* + * If we found no candidate, use the first chunk since we have to + * return something that will be a valid lookup starting point. + */ + + if (NULL == candidate) + candidate = first; + + rbtree_free_null(&missing); + +done: + if (GNET_PROPERTY(fileinfo_debug) || GNET_PROPERTY(download_debug)) { + g_debug("%s(): returning %s, %s (%u) for \"%s\"", + G_STRFUNC, filesize_to_string(candidate->from), + filesize_to_string2(candidate->to), candidate->status, + fi->pathname); + } + + return candidate; +} + +/** + * Select a chunk randomly. + * + * If the first chunk is not completed or not at least "pfsp_first_chunk" bytes + * long, returns the first chunk. + * + * We also strive to get the latest "pfsp_last_chunk" bytes of the file as * well, since some file formats store important information at the tail of - * the file as well, so we put the latest chunks at the head of the list. + * the file as well, so we can select some of the latest chunks. */ -static GSList * -list_clone_shift(fileinfo_t *fi) +static const struct dl_file_chunk * +fi_pick_chunk(fileinfo_t *fi) { filesize_t offset = 0; - GSList *clone; - GSList *sl; - GSList *tail; + slink_t *sl; file_info_check(fi); g_assert(file_info_check_chunklist(fi, TRUE)); @@ -4612,24 +5002,21 @@ /* * Check whether first chunk is at least "pfsp_first_chunk" bytes - * long. If not, return original chunk list so that we select - * the first chunk (if available remotely, naturally, but that will - * be checked later by our caller). + * long. If not, return that first chunk. */ - - fc = fi->chunklist->data; /* First chunk */ + + fc = eslist_head(&fi->chunklist); /* First chunk */ dl_file_chunk_check(fc); if ( DL_CHUNK_DONE != fc->status || fc->to < GNET_PROPERTY(pfsp_first_chunk) ) - return fi->chunklist; + return fc; } if (GNET_PROPERTY(pfsp_last_chunk) > 0) { const struct dl_file_chunk *fc; - const GSList *iter; filesize_t last_chunk_offset; /* @@ -4642,8 +5029,7 @@ ? fi->size - GNET_PROPERTY(pfsp_last_chunk) : 0; - for (iter = fi->chunklist; NULL != iter; iter = g_slist_next(iter)) { - fc = iter->data; + ESLIST_FOREACH_DATA(&fi->chunklist, fc) { dl_file_chunk_check(fc); if (DL_CHUNK_DONE == fc->status) @@ -4666,34 +5052,24 @@ if (0 == offset) { offset = get_random_file_offset(fi->size); - - /* - * Aligning blocks is just a convenience here, to make it easier later to - * validate the file against the TTH, and also because it is likely to be - * slightly more efficient when doing aligned disk I/Os. - */ - offset &= ~((filesize_t)128 * 1024 - 1); + offset &= ~FI_OFFSET_ALIGNMASK; /* Align on natural boundary */ } /* - * First pass: clone the list starting at the first chunk whose start is - * after the offset. + * Pick the first chunk whose start is after the offset. */ - clone = NULL; - - for (sl = fi->chunklist; sl; sl = g_slist_next(sl)) { - const struct dl_file_chunk *fc = sl->data; + ESLIST_FOREACH(&fi->chunklist, sl) { + const struct dl_file_chunk *fc = eslist_data(&fi->chunklist, sl); dl_file_chunk_check(fc); - if (fc->from >= offset) { - clone = g_slist_copy(sl); - break; - } + + if (fc->from >= offset) + return fc; /* * If offset lies within a free chunk, it will get split below. - * So exit without cloning anything yet. + * So exit without selecting anything yet. */ if (DL_CHUNK_EMPTY == fc->status && fc->to - 1 > offset) @@ -4701,77 +5077,45 @@ } /* - * If we have not cloned anything, it means we have encountered a big chunk + * If we have not picked anything, it means we have encountered a big chunk * and the selected offset lies within that chunk. * Be smarter and break-up any free chunk into two at the selected offset. */ - if (NULL == clone) { - for (sl = fi->chunklist; sl; sl = g_slist_next(sl)) { - struct dl_file_chunk *fc = sl->data; + ESLIST_FOREACH(&fi->chunklist, sl) { + struct dl_file_chunk *fc = eslist_data(&fi->chunklist, sl); - dl_file_chunk_check(fc); - if (DL_CHUNK_EMPTY == fc->status && fc->to - 1 > offset) { - struct dl_file_chunk *nfc; + dl_file_chunk_check(fc); - g_assert(fc->from < offset); /* Or we'd have cloned above */ - g_assert(fc->download == NULL); /* Chunk is empty */ + if (DL_CHUNK_EMPTY == fc->status && fc->to - 1 > offset) { + struct dl_file_chunk *nfc; - /* - * fc was from, to. It becomes from, offset. - * nfc is offset, to and is inserted after fc. - */ + g_assert(fc->from < offset); /* Or we'd have cloned above */ + g_assert(fc->download == NULL); /* Chunk is empty */ - nfc = dl_file_chunk_alloc(); - nfc->from = offset; - nfc->to = fc->to; - nfc->status = DL_CHUNK_EMPTY; - fc->to = nfc->from; - - fi->chunklist = gm_slist_insert_after(fi->chunklist, sl, nfc); - clone = g_slist_copy(g_slist_next(sl)); + /* + * fc was from, to. It becomes from, offset. + * nfc is offset, to and is inserted after fc. + */ - g_assert(clone != NULL); /* The `nfc' chunk is there */ + nfc = dl_file_chunk_alloc(); + nfc->from = offset; + nfc->to = fc->to; + nfc->status = DL_CHUNK_EMPTY; + fc->to = nfc->from; - break; - } + eslist_insert_after(&fi->chunklist, fc, nfc); + return nfc; } - - g_assert(file_info_check_chunklist(fi, TRUE)); } + g_assert(file_info_check_chunklist(fi, TRUE)); + /* - * If still no luck, never mind. Use original list. + * If still no luck, never mind. Use first chunk. */ - if (clone) { - struct dl_file_chunk *fc; - - /* - * Second pass: append to the `clone' list all the chunks that end - * before the "from" of the first item in that list. - */ - - fc = clone->data; - dl_file_chunk_check(fc); - offset = fc->from; /* Cloning point: start of first chunk */ - tail = g_slist_last(clone); - - for (sl = fi->chunklist; sl; sl = g_slist_next(sl)) { - fc = sl->data; - - dl_file_chunk_check(fc); - if (fc->to > offset) /* Not ">=" or we'd miss one chunk */ - break; /* We've reached the cloning point */ - g_assert(fc->from < offset); - clone = gm_slist_insert_after(clone, tail, fc); - tail = g_slist_next(tail); - } - - return clone; - } else { - return fi->chunklist; - } + return eslist_head(&fi->chunklist); } /** @@ -4782,7 +5126,7 @@ { filesize_t chunksize; int src_count; - guint32 max; + uint32 max; file_info_check(fi); @@ -4834,11 +5178,11 @@ static double fi_missing_coverage(const struct download *d) { - GSList *ranges; + http_rangeset_t *ranges; fileinfo_t *fi; filesize_t missing_size = 0; filesize_t covered_size = 0; - GSList *fclist; + const struct dl_file_chunk *fc; download_check(d); fi = d->file_info; @@ -4862,9 +5206,8 @@ return available ? (available * 1.0) / (fi->size * 1.0) : 1.0; } - for (fclist = fi->chunklist; fclist; fclist = g_slist_next(fclist)) { - const struct dl_file_chunk *fc = fclist->data; - const GSList *sl; + ESLIST_FOREACH_DATA(&fi->chunklist, fc) { + const http_range_t *r; if (DL_CHUNK_EMPTY != fc->status) continue; @@ -4875,30 +5218,28 @@ * Look whether this empty chunk intersects with one of the * available ranges. * - * NB: the list of ranges is sorted. And contrary to fi chunks, - * the upper boundary of the range (r->end) is part of the range. + * NB: Contrary to fi chunks, the upper boundary of the range + * (r->end) is part of the range. */ - for (sl = ranges; sl; sl = g_slist_next(sl)) { - const http_range_t *r = sl->data; - filesize_t from, to; - - if (r->start > fc->to) - break; /* No further range will intersect */ - - if (r->start >= fc->from && r->start < fc->to) { - from = r->start; - to = MIN(r->end + 1, fc->to); - covered_size += to - from; - continue; - } + r = http_rangeset_lookup_first(ranges, fc->from, fc->to - 1); - if (r->end >= fc->from && r->end < fc->to) { - from = MAX(r->start, fc->from); - to = r->end + 1; - covered_size += to - from; - continue; - } + while (r != NULL) { + filesize_t start, end; + + /* + * Compute the intersection between range and chunk. + */ + + start = MAX(r->start, fc->from); + end = r->end + 1; + end = MIN(end, fc->to); + + if (start >= end) + break; /* No longer intersecting */ + + covered_size += end - start; + r = http_range_next(ranges, r); } } @@ -4919,12 +5260,10 @@ static const struct dl_file_chunk * fi_find_largest(const fileinfo_t *fi, const struct download *d) { - GSList *fclist; + const struct dl_file_chunk *fc; const struct dl_file_chunk *largest = NULL; - for (fclist = fi->chunklist; fclist; fclist = g_slist_next(fclist)) { - const struct dl_file_chunk *fc = fclist->data; - + ESLIST_FOREACH_DATA(&fi->chunklist, fc) { dl_file_chunk_check(fc); if (DL_CHUNK_BUSY != fc->status) @@ -4959,13 +5298,12 @@ static const struct dl_file_chunk * fi_find_slowest(const fileinfo_t *fi, const struct download *d) { - GSList *fclist; + const struct dl_file_chunk *fc; const struct dl_file_chunk *slowest = NULL; - guint slowest_speed_avg = MAX_INT_VAL(guint); + uint slowest_speed_avg = MAX_INT_VAL(uint); - for (fclist = fi->chunklist; fclist; fclist = g_slist_next(fclist)) { - const struct dl_file_chunk *fc = fclist->data; - guint speed_avg; + ESLIST_FOREACH_DATA(&fi->chunklist, fc) { + uint speed_avg; dl_file_chunk_check(fc); @@ -5012,16 +5350,16 @@ * @return TRUE if we were able to find a candidate, with `from' and `to' * being filled with the chunk we could be requesting. */ -static gboolean +static bool fi_find_aggressive_candidate( - const struct download *d, guint busy, filesize_t *from, filesize_t *to, + const struct download *d, uint busy, filesize_t *from, filesize_t *to, const struct dl_file_chunk **chunk) { fileinfo_t *fi = d->file_info; const struct dl_file_chunk *fc; int starving; filesize_t minchunk; - gboolean can_be_aggressive = FALSE; + bool can_be_aggressive = FALSE; double missing_coverage; /* @@ -5035,7 +5373,7 @@ */ starving = fi->lifecount - busy; /* Starving downloads */ - minchunk = (fi->size - fi->done) / (2 * starving); + minchunk = (fi->size - fi->done) / (0 == starving ? 1 : 2 * starving); minchunk = MIN(minchunk, GNET_PROPERTY(dl_minchunksize)); minchunk = MAX(minchunk, FI_MIN_CHUNK_SPLIT); @@ -5143,7 +5481,7 @@ return TRUE; } - + /** * Mark from, to as now being a chunk reserved by given download. * If ``chunk'' is non-NULL, then the from, to belongs to that chunk @@ -5215,15 +5553,14 @@ enum dl_chunk_status file_info_find_hole(const struct download *d, filesize_t *from, filesize_t *to) { - GSList *fclist; + slink_t *sl; fileinfo_t *fi = d->file_info; filesize_t chunksize; unsigned busy = 0; unsigned pipelined = 0; int reserved; - GSList *cklist; - gboolean cloned = FALSE; - const struct dl_file_chunk *chunk = NULL; /* Chunk, if aggressive */ + eclist_t cklist; + const struct dl_file_chunk *chunk = NULL; file_info_check(fi); g_assert(fi->refcount > 0); @@ -5255,7 +5592,7 @@ if (fi->size < d->file_size) { g_warning("fi->size=%s < d->file_size=%s for \"%s\"", - uint64_to_string(fi->size), uint64_to_string2(d->file_size), + filesize_to_string(fi->size), filesize_to_string2(d->file_size), fi->pathname); } @@ -5291,7 +5628,7 @@ chunksize = GNET_PROPERTY(dl_minchunksize); else { filesize_t missing; - + missing = GNET_PROPERTY(pfsp_minimum_filesize) - fi->done; chunksize = MAX(chunksize, missing); chunksize = MIN(chunksize, GNET_PROPERTY(dl_maxchunksize)); @@ -5303,17 +5640,29 @@ * Therefore, it is interesting to request chunks in random order, to * avoid everyone having the same chunks should full sources disappear. * --RAM, 11/10/2003 + * + * If we have some partial sources, use a more complex chunk picking + * algorithm to select the rarest chunks first. + * --RAM, 2012-12-01 */ - if (GNET_PROPERTY(pfsp_server)) { - cklist = list_clone_shift(fi); - if (cklist != fi->chunklist) - cloned = TRUE; - } else - cklist = fi->chunklist; + if (eslist_count(&fi->available) > 1) { + chunk = fi_pick_rarest_chunk(fi, NULL, chunksize); + } else { + chunk = GNET_PROPERTY(pfsp_server) ? + fi_pick_chunk(fi) : eslist_head(&fi->chunklist); + } + + /* + * Iteration is done using a "circular" list illusion, to be able to + * nicely iterate even if we don't start from the head. + */ + + eclist_init(&cklist, &fi->chunklist, chunk); + chunk = NULL; /* Will be set if we pick a chunk aggressively */ - for (fclist = cklist; fclist; fclist = g_slist_next(fclist)) { - const struct dl_file_chunk *fc = fclist->data; + ECLIST_FOREACH(&cklist, sl) { + const struct dl_file_chunk *fc = eclist_data(&cklist, sl); dl_file_chunk_check(fc); @@ -5335,7 +5684,7 @@ } busy -= pipelined; - g_assert(fi->lifecount > (gint32) busy); /* Or we'd found a chunk before */ + g_assert(fi->lifecount > (int32) busy); /* Or we'd found a chunk before */ if (GNET_PROPERTY(use_aggressive_swarming)) { filesize_t start, end; @@ -5349,18 +5698,12 @@ /* No holes found. */ - if (cloned) - g_slist_free(cklist); - return (fi->done == fi->size) ? DL_CHUNK_DONE : DL_CHUNK_BUSY; selected: /* Selected a hole to download */ file_info_reserve(d, *from, *to, chunk); - if (cloned) - g_slist_free(cklist); - return DL_CHUNK_EMPTY; } @@ -5374,21 +5717,21 @@ * NB: In accordance with other fileinfo semantics, `to' is NOT the last byte * of the range but one byte AFTER the end. */ -gboolean +bool file_info_find_available_hole( - const struct download *d, GSList *ranges, filesize_t *from, filesize_t *to) + const struct download *d, http_rangeset_t *ranges, + filesize_t *from, filesize_t *to) { - GSList *fclist; + slink_t *sl; fileinfo_t *fi; - filesize_t chunksize; - GSList *cklist; - gboolean cloned = FALSE; - guint busy = 0; - guint pipelined = 0; + filesize_t chunksize = 0; + eclist_t cklist; + uint busy = 0; + uint pipelined = 0; const struct dl_file_chunk *chunk = NULL; download_check(d); - g_assert(ranges); + g_assert(ranges != NULL); fi = d->file_info; file_info_check(fi); @@ -5412,18 +5755,31 @@ * Therefore, it is interesting to request chunks in random order, to * avoid everyone having the same chunks should full sources disappear. * --RAM, 11/10/2003 + * + * If we have some partial sources, use a more complex chunk picking + * algorithm to select the rarest chunks first. + * --RAM, 2012-12-01 + */ + + if (eslist_count(&fi->available) > 1) { + chunksize = fi_chunksize(fi); + chunk = fi_pick_rarest_chunk(fi, d, chunksize); + } else { + chunk = GNET_PROPERTY(pfsp_server) ? + fi_pick_chunk(fi) : eslist_head(&fi->chunklist); + } + + /* + * Iteration is done using a "circular" list illusion, to be able to + * nicely iterate even if we don't start from the head. */ - if (GNET_PROPERTY(pfsp_server)) { - cklist = list_clone_shift(fi); - if (cklist != fi->chunklist) - cloned = TRUE; - } else - cklist = fi->chunklist; - - for (fclist = cklist; fclist; fclist = g_slist_next(fclist)) { - const struct dl_file_chunk *fc = fclist->data; - const GSList *sl; + eclist_init(&cklist, &fi->chunklist, chunk); + chunk = NULL; /* Will be set if we pick a chunk aggressively */ + + ECLIST_FOREACH(&cklist, sl) { + const struct dl_file_chunk *fc = eclist_data(&cklist, sl); + const http_range_t *r; if (DL_CHUNK_EMPTY != fc->status) { if (DL_CHUNK_BUSY == fc->status) { @@ -5440,16 +5796,14 @@ * Look whether this empty chunk intersects with one of the * available ranges. * - * NB: the list of ranges is sorted. And contrary to fi chunks, - * the upper boundary of the range (r->end) is part of the range. + * NB: Contrary to fi chunks, the upper boundary of the range + * (r->end) is part of the range. */ - for (sl = ranges; sl; sl = g_slist_next(sl)) { - const http_range_t *r = sl->data; - filesize_t start, end; + r = http_rangeset_lookup(ranges, fc->from, fc->to - 1); - if (r->start > fc->to) - break; /* No further range will intersect */ + if (r != NULL) { + filesize_t start, end; /* * Intersect range and chunk, start, end is the result. @@ -5459,15 +5813,11 @@ end = r->end + 1; end = MIN(end, fc->to); - /* - * If intersection is non-null, we got our chunk. - */ + g_assert(start < end); /* Intersection is non-empty */ - if (start < end) { - *from = start; - *to = end; - goto found; - } + *from = start; + *to = end; + goto found; } } @@ -5477,39 +5827,36 @@ filesize_t start, end; if (fi_find_aggressive_candidate(d, busy, &start, &end, &chunk)) { - const GSList *sl; + const http_range_t *r; /* * Look whether this candidate chunk is fully held in the * available remote chunks. * - * NB: the list of ranges is sorted. And contrary to fi chunks, - * the upper boundary of the range (r->end) is part of the range. + * NB: contrary to fi chunks, the upper boundary of the range + * (r->end) is part of the range. */ - for (sl = ranges; sl; sl = g_slist_next(sl)) { - const http_range_t *r = sl->data; + r = http_rangeset_lookup(ranges, start, end - 1); - if (r->start > end) - break; /* No further range will intersect */ - - if (r->start <= start && r->end >= (end - 1)) { - /* Selected chunk is fully contained in remote range */ - *from = start; - *to = end; - goto selected; - } + if ( + r != NULL && + r->start <= start && + r->end >= end - 1 + ) { + /* Selected chunk is fully contained in remote range */ + *from = start; + *to = end; + goto selected; } } } - if (cloned) - g_slist_free(cklist); - return FALSE; found: - chunksize = fi_chunksize(fi); + if (0 == chunksize) + chunksize = fi_chunksize(fi); if ((*to - *from) > chunksize) *to = *from + chunksize; @@ -5519,9 +5866,6 @@ selected: file_info_reserve(d, *from, *to, chunk); - if (cloned) - g_slist_free(cklist); - return TRUE; } @@ -5539,7 +5883,7 @@ */ void file_info_try_to_swarm_with( - const char *file_name, const host_addr_t addr, guint16 port, + const char *file_name, const host_addr_t addr, uint16 port, const struct sha1 *sha1) { fileinfo_t *fi; @@ -5699,7 +6043,6 @@ } HFREE_NULL(pathname); - dir_entry_filename(NULL); /* release memory */ closedir(d); } @@ -5707,15 +6050,13 @@ * Callback for hash table iterator. Used by file_info_completed_orphans(). */ static void -fi_spot_completed_kv(gpointer key, gpointer val, gpointer unused_x) +fi_spot_completed_kv(void *val, void *unused_x) { fileinfo_t *fi = val; (void) unused_x; file_info_check(fi); - g_assert(key == fi->pathname); /* name shared with fi's, don't free */ - if (fi->refcount) /* Attached to a download */ return; @@ -5742,16 +6083,16 @@ void file_info_spot_completed_orphans(void) { - g_hash_table_foreach(fi_by_outname, fi_spot_completed_kv, NULL); + hikset_foreach(fi_by_outname, fi_spot_completed_kv, NULL); } void fi_add_listener(fi_listener_t cb, gnet_fi_ev_t ev, - frequency_t t, guint32 interval) + frequency_t t, uint32 interval) { g_assert(ev < EV_FI_EVENTS); - event_add_subscriber(fi_eventsev, (GCallback) cb, t, interval); + event_add_subscriber(fi_eventsev, (callback_fn_t) cb, t, interval); } void @@ -5759,16 +6100,16 @@ { g_assert(ev < EV_FI_EVENTS); - event_remove_subscriber(fi_eventsev, (GCallback) cb); + event_remove_subscriber(fi_eventsev, (callback_fn_t) cb); } void src_add_listener(src_listener_t cb, gnet_src_ev_t ev, - frequency_t t, guint32 interval) + frequency_t t, uint32 interval) { g_assert(UNSIGNED(ev) < EV_SRC_EVENTS); - event_add_subscriber(src_eventsev, (GCallback) cb, t, interval); + event_add_subscriber(src_eventsev, (callback_fn_t) cb, t, interval); } void @@ -5776,7 +6117,7 @@ { g_assert(UNSIGNED(ev) < EV_SRC_EVENTS); - event_remove_subscriber(src_eventsev, (GCallback) cb); + event_remove_subscriber(src_eventsev, (callback_fn_t) cb); } /** @@ -5832,7 +6173,7 @@ fi_increase_uploaded(fileinfo_t *fi, size_t amount) { file_info_check(fi); - fi->uploaded += amount; + fi->uploaded += amount; file_info_changed(fi); } @@ -5890,14 +6231,13 @@ fi_get_chunks(gnet_fi_t fih) { const fileinfo_t *fi = file_info_find_by_handle(fih); - const GSList *sl; + const struct dl_file_chunk *fc; GSList *chunks = NULL; file_info_check(fi); g_assert(file_info_check_chunklist(fi, TRUE)); - for (sl = fi->chunklist; NULL != sl; sl = g_slist_next(sl)) { - const struct dl_file_chunk *fc = sl->data; + ESLIST_FOREACH_DATA(&fi->chunklist, fc) { gnet_fi_chunks_t *chunk; WALLOC(chunk); @@ -5938,14 +6278,14 @@ fi_get_ranges(gnet_fi_t fih) { fileinfo_t *fi = file_info_find_by_handle(fih); - http_range_t *range = NULL; GSList *ranges = NULL; - const GSList *sl; + const http_range_t *r; file_info_check(fi); - for (sl = fi->seen_on_network; NULL != sl; sl = g_slist_next(sl)) { - const http_range_t *r = sl->data; + HTTP_RANGE_FOREACH(fi->seen_on_network, r) { + http_range_t *range; + WALLOC(range); range->start = r->start; range->end = r->end; @@ -5956,6 +6296,9 @@ return g_slist_reverse(ranges); } +/** + * Frees list of http_range_t items. + */ void fi_free_ranges(GSList *ranges) { @@ -5971,7 +6314,7 @@ /** * @return NULL terminated array of char * pointing to the aliases. - * You can easily free the returned array with g_strfreev(). + * You can easily free the returned array with xstrfreev(). * * O(2n) - n: number of aliases */ @@ -5979,19 +6322,19 @@ fi_get_aliases(gnet_fi_t fih) { char **a; - guint len; - GSList *sl; - guint n; + uint len; + pslist_t *sl; + uint n; fileinfo_t *fi = file_info_find_by_handle(fih); - len = g_slist_length(fi->alias); + len = pslist_length(fi->alias); - a = g_malloc((len + 1) * sizeof a0); + XMALLOC_ARRAY(a, len + 1); alen = NULL; /* terminate with NULL */; - for (sl = fi->alias, n = 0; NULL != sl; sl = g_slist_next(sl), n++) { + for (sl = fi->alias, n = 0; NULL != sl; sl = pslist_next(sl), n++) { g_assert(n < len); - an = g_strdup(sl->data); + an = xstrdup(sl->data); } return a; @@ -6022,7 +6365,7 @@ d->file_info = fi; d->src_handle = idtable_new_id(src_handle_map, d); d->src_handle_valid = TRUE; - fi->sources = g_slist_prepend(fi->sources, d); + fi->sources = pslist_prepend(fi->sources, d); if (download_is_alive(d)) { g_assert(fi->refcount > fi->lifecount); @@ -6036,6 +6379,16 @@ } src_event_trigger(d, EV_SRC_ADDED); + + /* + * Source was added, but we do not need to call fi_update_seen_on_network(). + * This will be done through a fi_src_ranges_changed() by the download + * code when it will learn about new ranges for the file or when the first + * HTTP reply will be processed after a connection is established. + * + * Until then, the source will not be taken into consideration for the + * computation of the seen chunk since it lacks the DL_F_REPLIED mark. + */ } /** @@ -6045,27 +6398,33 @@ * This replaces file_info_free() */ void -file_info_remove_source(fileinfo_t *fi, struct download *d, gboolean discard) +file_info_remove_source(fileinfo_t *fi, struct download *d, bool discard) { file_info_check(fi); - g_assert(NULL != d->file_info); + g_assert(fi == d->file_info); g_assert(d->src_handle_valid); g_assert(fi->refcount > 0); g_assert(fi->refcount >= fi->lifecount); g_assert(fi->hashed); + /* + * Source is removed: inform whoever is monitoring the sources via an event. + * Then remove the source from the fileinfo before recomputing the available + * chunks in the file. + */ + src_event_trigger(d, EV_SRC_REMOVED); + fi->sources = pslist_remove(fi->sources, d); idtable_free_id(src_handle_map, d->src_handle); d->src_handle_valid = FALSE; - if (download_is_alive(d)) { + if (download_is_alive(d)) fi->lifecount--; - } + fi->refcount--; fi->dirty_status = TRUE; d->file_info = NULL; - fi->sources = g_slist_remove(fi->sources, d); /* * We don't free the structure when `discard' is FALSE: keeping the @@ -6088,11 +6447,49 @@ } /** + * Add a cloned source. + * + * This is a specialized form of file_info_add_source(). + * + * Since we're handling a cloned source, there is no need to update the + * list of seen parts of the file on the network, because we already have + * this information computed from the original download that has been cloned. + * + * @param fi the fileinfo + * @param d the original download being cloned + * @param cd the new cloned download + */ +void +file_info_cloned_source(fileinfo_t *fi, download_t *d, download_t *cd) +{ + file_info_check(fi); + g_assert(NULL != d->file_info); + g_assert(cd->src_handle_valid); /* Because it's a clone! */ + g_assert(fi->refcount > 0); + g_assert(fi->refcount >= fi->lifecount); + g_assert(fi->hashed); + + cd->src_handle = idtable_new_id(src_handle_map, cd); + fi->sources = pslist_prepend(fi->sources, cd); + src_event_trigger(cd, EV_SRC_ADDED); + + /* + * Do not mark fileinfo dirty, we're just increasing counters. + */ + + fi->refcount++; + if (download_is_alive(d)) { + g_assert(fi->refcount > fi->lifecount); + fi->lifecount++; + } +} + +/** * Is file rare on the network? * * A file is deemed rare when all the known sources are partial ones. */ -gboolean +bool file_info_is_rare(const fileinfo_t *fi) { file_info_check(fi); @@ -6106,7 +6503,7 @@ /** * Can a partial file be shared? */ -gboolean +bool file_info_partial_shareable(const fileinfo_t *fi) { file_info_check(fi); @@ -6132,12 +6529,12 @@ * * @return A copy of the sources list. */ -GSList * +pslist_t * file_info_get_sources(const fileinfo_t *fi) { file_info_check(fi); - return g_slist_copy(fi->sources); + return pslist_copy(fi->sources); } /** @@ -6154,11 +6551,10 @@ } static void -fi_notify_helper(gpointer unused_key, gpointer value, gpointer unused_udata) +fi_notify_helper(void *value, void *unused_udata) { fileinfo_t *fi = value; - (void) unused_key; (void) unused_udata; file_info_check(fi); @@ -6175,7 +6571,7 @@ void file_info_timer(void) { - g_hash_table_foreach(fi_by_outname, fi_notify_helper, NULL); + hikset_foreach(fi_by_outname, fi_notify_helper, NULL); } /** @@ -6249,7 +6645,7 @@ * * @return TRUE if query can proceed, FALSE otherwise. */ -gboolean +bool file_info_dht_query_starting(fileinfo_t *fi) { file_info_check(fi); @@ -6281,7 +6677,7 @@ * Signals that a DHT query was completed. */ void -file_info_dht_query_completed(fileinfo_t *fi, gboolean launched, gboolean found) +file_info_dht_query_completed(fileinfo_t *fi, bool launched, bool found) { file_info_check(fi); g_return_if_fail(fi->flags & FI_F_DHT_LOOKUP); @@ -6301,11 +6697,10 @@ * Hash table iterator to launch DHT queries. */ static void -fi_dht_check(gpointer unused_key, gpointer value, gpointer unused_udata) +fi_dht_check(void *value, void *unused_udata) { fileinfo_t *fi = value; - (void) unused_key; (void) unused_udata; fi_dht_query(fi); @@ -6339,18 +6734,17 @@ if (!dht_bootstrapped() || GNET_PROPERTY(ancient_version)) return; - g_hash_table_foreach(fi_by_outname, fi_dht_check, NULL); + hikset_foreach(fi_by_outname, fi_dht_check, NULL); } /** * Hash table iterator to publish into the DHT. */ static void -fi_dht_publish(gpointer unused_key, gpointer value, gpointer unused_udata) +fi_dht_publish(void *value, void *unused_udata) { fileinfo_t *fi = value; - (void) unused_key; (void) unused_udata; if (fi->sha1 != NULL) @@ -6363,7 +6757,7 @@ static void fi_publish_all(void) { - g_hash_table_foreach(fi_by_outname, fi_dht_publish, NULL); + hikset_foreach(fi_by_outname, fi_dht_publish, NULL); } /** @@ -6373,30 +6767,29 @@ * use, e.g. when it is being verified. * -- JA 25/10/03 */ -gboolean +bool file_info_purge(fileinfo_t *fi) { - GSList *sl; - GSList *csl; - gboolean do_remove; + pslist_t *sl, *csl; + bool do_remove; file_info_check(fi); g_assert(fi->hashed); do_remove = !(fi->flags & FI_F_DISCARD) || NULL == fi->sources; - csl = g_slist_copy(fi->sources); /* Clone list, orig can be modified */ + csl = pslist_copy(fi->sources); /* Clone list, orig can be modified */ - for (sl = csl; NULL != sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(csl, sl) { struct download *d = sl->data; download_abort(d); if (!download_remove(d)) { - g_slist_free(csl); + pslist_free(csl); return FALSE; } } - g_slist_free(csl); + pslist_free(csl); if (do_remove) { /* @@ -6418,7 +6811,7 @@ return TRUE; } -gboolean +bool fi_purge(gnet_fi_t fih) { return file_info_purge(file_info_find_by_handle(fih)); @@ -6436,7 +6829,7 @@ file_info_resume(file_info_find_by_handle(fih)); } -gboolean +bool fi_rename(gnet_fi_t fih, const char *filename) { return file_info_rename(file_info_find_by_handle(fih), filename); @@ -6462,7 +6855,7 @@ UINT64_DEC_BUFLEN + sizeof("X-Available: bytes") + 2, size); header_fmt_append_value(fmt, "bytes"); - header_fmt_append_value(fmt, uint64_to_string(fi->done)); + header_fmt_append_value(fmt, filesize_to_string(fi->done)); header_fmt_end(fmt); len = header_fmt_length(fmt); @@ -6491,9 +6884,9 @@ { const struct dl_file_chunk **fc_ary; header_fmt_t *fmt, *fmta = NULL; - gboolean is_first = TRUE; + bool is_first = TRUE; char range2 * UINT64_DEC_BUFLEN + sizeof(" bytes "); - GSList *sl; + slink_t *sl; int count; int nleft; int i; @@ -6506,16 +6899,16 @@ fmt = header_fmt_make(x_available_ranges, ", ", size, size); - for (sl = fi->chunklist; NULL != sl; sl = g_slist_next(sl)) { - const struct dl_file_chunk *fc = sl->data; + ESLIST_FOREACH(&fi->chunklist, sl) { + const struct dl_file_chunk *fc = eslist_data(&fi->chunklist, sl); dl_file_chunk_check(fc); if (DL_CHUNK_DONE != fc->status) continue; - gm_snprintf(range, sizeof range, "%s%s-%s", + str_bprintf(range, sizeof range, "%s%s-%s", is_first ? "bytes " : "", - uint64_to_string(fc->from), uint64_to_string2(fc->to - 1)); + filesize_to_string(fc->from), filesize_to_string2(fc->to - 1)); if (!header_fmt_append_value(fmt, range)) break; @@ -6543,7 +6936,7 @@ UINT64_DEC_BUFLEN + sizeof("X-Available: bytes") + 2, size); header_fmt_append_value(fmta, "bytes"); - header_fmt_append_value(fmta, uint64_to_string(fi->done)); + header_fmt_append_value(fmta, filesize_to_string(fi->done)); header_fmt_end(fmta); len = header_fmt_length(fmta); @@ -6558,8 +6951,9 @@ * See how many chunks we have. */ - for (count = 0, sl = fi->chunklist; NULL != sl; sl = g_slist_next(sl)) { - const struct dl_file_chunk *fc = sl->data; + count = 0; + ESLIST_FOREACH(&fi->chunklist, sl) { + const struct dl_file_chunk *fc = eslist_data(&fi->chunklist, sl); dl_file_chunk_check(fc); if (DL_CHUNK_DONE == fc->status) count++; @@ -6571,11 +6965,13 @@ g_assert(count > 0); /* Or there would be nothing to emit */ - fc_ary = halloc(count * sizeof fc_ary0); + HALLOC_ARRAY(fc_ary, count); + i = 0; - for (i = 0, sl = fi->chunklist; NULL != sl; sl = g_slist_next(sl)) { - const struct dl_file_chunk *fc = sl->data; + ESLIST_FOREACH(&fi->chunklist, sl) { + const struct dl_file_chunk *fc = eslist_data(&fi->chunklist, sl); dl_file_chunk_check(fc); + if (DL_CHUNK_DONE == fc->status) fc_aryi++ = fc; } @@ -6594,12 +6990,12 @@ g_assert(j >= 0 && j < nleft); fc = fc_aryj; - dl_file_chunk_check(fc); + dl_file_chunk_check(fc); g_assert(DL_CHUNK_DONE == fc->status); - gm_snprintf(range, sizeof range, "%s%s-%s", + str_bprintf(range, sizeof range, "%s%s-%s", is_first ? "bytes " : "", - uint64_to_string(fc->from), uint64_to_string2(fc->to - 1)); + filesize_to_string(fc->from), filesize_to_string2(fc->to - 1)); if (header_fmt_append_value(fmt, range)) is_first = FALSE; @@ -6608,9 +7004,7 @@ * Shift upper (nleft - j - 1) items down 1 position. */ - if (nleft - 1 != j) - memmove(&fc_aryj, &fc_aryj + 1, - (nleft - j - 1) * sizeof fc_ary0); + ARRAY_REMOVE(fc_ary, j, nleft); } HFREE_NULL(fc_ary); @@ -6650,18 +7044,16 @@ * FALSE is the request cannot be satisfied because `start' is not within * an available chunk. */ -gboolean +bool file_info_restrict_range(fileinfo_t *fi, filesize_t start, filesize_t *end) { - GSList *sl; + const struct dl_file_chunk *fc; file_info_check(fi); g_assert(file_info_check_chunklist(fi, TRUE)); - for (sl = fi->chunklist; NULL != sl; sl = g_slist_next(sl)) { - const struct dl_file_chunk *fc = sl->data; - - dl_file_chunk_check(fc); + ESLIST_FOREACH_DATA(&fi->chunklist, fc) { + dl_file_chunk_check(fc); if (DL_CHUNK_DONE != fc->status) continue; @@ -6695,10 +7087,10 @@ { struct magnet_resource *magnet; const fileinfo_t *fi; - const GSList *sl; + const pslist_t *sl; char *url; int n; - + fi = file_info_find_by_handle(handle); g_return_val_if_fail(fi, NULL); file_info_check(fi); @@ -6721,7 +7113,7 @@ } n = 0; - for (sl = fi->sources; NULL != sl && n++ < 20; sl = g_slist_next(sl)) { + for (sl = fi->sources; NULL != sl && n++ < 20; sl = pslist_next(sl)) { struct download *d = sl->data; const char *dl_url; @@ -6747,139 +7139,554 @@ file_info_get_file_url(gnet_fi_t handle) { fileinfo_t *fi; - + fi = file_info_find_by_handle(handle); g_return_val_if_fail(fi, NULL); file_info_check(fi); - + /* Allow partials but not unstarted files */ return fi->done > 0 ? url_from_absolute_path(fi->pathname) : NULL; } /** - * Create a ranges list with one item covering the whole file. - * This may be better placed in http.c, but since it is only - * used here as a utility function for fi_update_seen_on_network - * it is now placed here. + * Compares two available ranges. + * + * Our relative order is a lexicographic order on (start, length), and + * two chunks are identical only when they start on the same position are + * have the same length. + */ +static int +fi_avail_cmp(const void *a, const void *b) +{ + const struct dl_avail_chunk *ca = a, *cb = b; + + if (ca->from == cb->from) { + size_t la = ca->to - ca->from; + size_t lb = cb->to - cb->from; + + return CMP(la, lb); + } + + return CMP(ca->from, cb->from); +} + +/** + * Compares two available ranges so that two ranges are equal when they + * overlap. + */ +static int +fi_overlap_cmp(const void *a, const void *b) +{ + const struct dl_avail_chunk *ca = a, *cb = b; + + if (ca->to <= cb->from) + return -1; + + if (cb->to <= ca->from) + return +1; + + return 0; /* Overlapping ranges are equal */ +} + +/** + * Compares two available ranges on the amount of sources that provide them. + */ +static int +fi_avail_source_cmp(const void *a, const void *b) +{ + const struct dl_avail_chunk *ca = a, *cb = b; + int c; + + c = CMP(ca->sources, cb->sources); + return 0 == c ? CMP(ca->from, cb->from) : c; +} + +/** + * Count one more source offering chunk from, to. + * + * @param rbt the red-black tree where we store available chunks + * @param from start of chunk + * @param to first byte beyond chunk + */ +static void +fi_count_source(rbtree_t *rbt, filesize_t from, filesize_t to) +{ + struct dl_avail_chunk *ac; + struct dl_avail_chunk key; + + key.from = from; + key.to = to; + + ac = rbtree_lookup(rbt, &key); + if (NULL == ac) { + ac = dl_avail_chunk_new(from, to, 1); + rbtree_insert(rbt, ac); + } else { + ac->sources++; + } +} + +/** + * Spread offered chunk `ac' to the list of available chunks held in the + * red-black tree, updating the amount of sources offering each range of + * the file. + * + * This is an important step in our computation of the rarest chunks offered + * on the network. * - * @paramin size File size to be used in range creation + * @param arbt red-black tree listing available chunks with source count + * @param ac the offered chunk we're adding to the existing set + */ +static void +fi_update_available_forward(rbtree_t *arbt, const struct dl_avail_chunk *ac) +{ + filesize_t from; /* Starting point of added chunk */ + + dl_avail_chunk_check(ac); + + from = ac->from; + + do { + struct dl_avail_chunk key; + struct dl_avail_chunk *avc; /* Available chunk */ + rbnode_t *node; /* Tree node for faster iteration */ + + key.from = from; + key.to = ac->to; + + avc = rbtree_lookup_node(arbt, &key, &node); + + if (NULL == avc) { + struct dl_avail_chunk *anew; + + /* Chunk overlaps with nothing -> new entry and we're done */ + + anew = dl_avail_chunk_new(from, ac->to, ac->sources); + rbtree_insert(arbt, anew); + break; + } + + /* + * Chunk `avc' overlaps with `ac'. + * There are six main configurations possible, with case #0 being + * handled flexibly (i.e. it can start / end on the same boundaries): + * + * #0: =avc= + * ---ac-- + * + * #1: ====avc==== + * ---ac-- + * + * #2: ====avc==== + * ---ac-- + * + * #3: ====avc==== + * ---ac-- + * + * #4: ====avc==== + * ---ac-- + * + * #5: ====avc==== + * ---ac-- + * + * We want to find the first available chunk which overlaps with `ac'. + */ + + for (;;) { + struct dl_avail_chunk *prev; + rbnode_t *pnode = node; + + prev = rbtree_prev_node(arbt, &pnode); + if (NULL == prev) + break; /* No other available chunk before `avc' */ + + if (prev->to <= from) + break; /* No overlap with `ac' */ + + avc = prev; + node = pnode; + } + + /* + * Handle cases #0 and #1 by creating a new available chunk at + * the beginning, then handling the overlapping part. + */ + + if (from < avc->from) { + struct dl_avail_chunk *anew; + + g_assert(avc->from < ac->to); /* Overlaps with `ac' */ + + anew = dl_avail_chunk_new(from, avc->from, ac->sources); + rbtree_insert(arbt, anew); + from = avc->from; + } + + /* + * Handle cases #2, #3, #4 and #5 by splitting the existing available + * chunk up to the start of the offered chunk `ac', and anything + * following the end of `ac'. + */ + + if (avc->from <= from) { + struct dl_avail_chunk *anew; + filesize_t to = MIN(avc->to, ac->to); /* Upper intersection */ + filesize_t avc_to = avc->to; + size_t sources = avc->sources; + + g_assert(avc->to > from); /* Overlaps with `ac' */ + + if (avc->from == from) { + /* Case #2, or case #0 with matching start */ + avc->sources += ac->sources; /* For the common part */ + + if (avc->to > ac->to) /* `avc' longer than `ac' */ + avc->to = ac->to; /* Extra part added below */ + } else { + /* Not case #2 */ + avc->to = from; /* Truncates `avc' */ + + /* + * Insert the common part with added source counts. + */ + + anew = dl_avail_chunk_new(from, to, ac->sources + avc->sources); + rbtree_insert(arbt, anew); + + avc = rbtree_next_node(arbt, &node); + g_soft_assert(avc == anew); /* The chunk we just inserted */ + } + + /* Handle rightmost part of cases #2 and #3 */ + + if (avc_to > to) { + anew = dl_avail_chunk_new(to, avc_to, sources); + rbtree_insert(arbt, anew); + + avc = rbtree_next_node(arbt, &node); + g_soft_assert(avc == anew); + + break; /* We've consumed the whole `ac' */ + } + + from = to; + } + } while (from < ac->to); +} + +/** + * Recompute rarest chunk information based on all the available sources. */ -static GSList * -fi_range_for_complete_file(filesize_t size) +static void +fi_update_rarest_chunks(fileinfo_t *fi) { - http_range_t *range; + pslist_t *sl; + rbtree_t *rbt, *arbt; + rbtree_iter_t *iter; + size_t sources; + const void *item; + + if (!fi->file_size_known) + return; + + if (GNET_PROPERTY(fileinfo_debug) > 5) + g_debug("%s(): updating available for %s", G_STRFUNC, fi->pathname); + + /* + * The following comments highlight the important steps needed to compute + * the list of chunks available for the file with, for each chunk, the + * amount of source that can serve it. + * + * We have the following scenario, depicting the chunks offered: + * + * Source #1: -A-- ---B-- --C--- + * Source #2: -----------------D----------------- (whole file) + * Source #3: ------E------ ---F---- + * Source #4: -----------------G----------------- (whole file) + * + * We want to build: + * + * Available: =a==b==c===d=ef=g==h= + * # of sources: 3 3 4 3 2 3 4 3 + * + * The rarest chunk is "e" (2 sources only provide that range) so this is + * the part of the file that needs to be downloaded first. + * + * To compute this, we loop over all the "alive" sources we know about + * for a file and for which we have chunk availability information. + * + * Each of the chunks (A, B, C, D, etc..) is inserted into a red-black tree + * whose ordering function is based on the chunk starting offset, then the + * length of the chunk (smallest length is smaller). + * When a chunk is already present, we increase its availability count: + * for instance, chunks D and G are identical according to our ordering + * function, hence when G is inserted, we simply increase the availability + * from 1 to 2. + */ + + rbt = rbtree_create(fi_avail_cmp); + sources = 0; + + PSLIST_FOREACH(fi->sources, sl) { + const download_t *d = sl->data; + + download_check(d); + g_assert(fi == d->file_info); + + sources++; + + if (!fi->use_swarming || !(d->flags & DL_F_PARTIAL)) { + /* Whole range available */ + fi_count_source(rbt, 0, fi->size); + } else if (NULL == d->ranges) { + /* Partial file with no known ranges, ignore */ + continue; + } else { + const http_range_t *r; + + HTTP_RANGE_FOREACH(d->ranges, r) { + fi_count_source(rbt, r->start, r->end + 1); + } + } + } + + if (GNET_PROPERTY(fileinfo_debug) > 5) { + g_debug("- collected %zu range%s out of %zu source%s:", + rbtree_count(rbt), plural(rbtree_count(rbt)), + sources, plural(sources)); + + iter = rbtree_iter_new(rbt); + while (rbtree_iter_next(iter, &item)) { + const struct dl_avail_chunk *ac = item; /* Chunk offered */ + g_debug(" %s, %s (%.2f%%) %zu source%s", + filesize_to_string(ac->from), filesize_to_string2(ac->to), + 100.0 * (ac->to - ac->from) / (0 == fi->size ? 1 : fi->size), + ac->sources, plural(ac->sources)); + } + rbtree_iter_release(&iter); + } + + /* + * All the unique chunks are in the red-black tree, we can iterate in order + * (so our visiting order will be A, D, E, B, etc..) and create the list + * of chunks representing the available regions and the amount of times they + * are offered (list of chunks a, b, c, d etc...). + * + * In our example, starting with "A" we get: + * + * --A- + * ==== + * 1 + * + * because chunk "A" is present once. Then we process "D" so the list now + * becomes: + * + * ----------------D------------------ + * ================================= + * 3 2 + * + * because "A" and "D" overlap so the "A" part is available twice but the + * count associated to "D" was 2 (chunks "D" and "G" are equal). Then we + * process "E" and we further split the second chunk in our list: + * + * ------E------ + * =============================== + * 3 3 2 + * + * Encountering "B" + * + * ---B-- + * =========================== + * 3 3 4 3 2 + * + * we further split the chunk, counting one more occurrence for the region + * covered by "B". + * + * This list is also held in a red-black tree during construction, to + * optimize lookups, but here we have only non-overlapping chunks + * so we use a different comparison function. The red-black tree will + * be linearized into an embedded list at the end. + */ + + file_info_available_free(fi); /* Discard previous computation */ + + arbt = rbtree_create(fi_overlap_cmp); + iter = rbtree_iter_new(rbt); + + while (rbtree_iter_next(iter, &item)) { + const struct dl_avail_chunk *ac = item; /* Chunk offered */ + + fi_update_available_forward(arbt, ac); + } + + rbtree_iter_release(&iter); + + if (GNET_PROPERTY(fileinfo_debug) > 5) { + filesize_t available = 0; + + iter = rbtree_iter_new(arbt); + + g_debug("- identified %zu available range%s over file:", + rbtree_count(arbt), plural(rbtree_count(arbt))); + + while (rbtree_iter_next(iter, &item)) { + const struct dl_avail_chunk *avc = item; + + dl_avail_chunk_check(avc); + + g_debug(" %s, %s %zu source%s", + filesize_to_string(avc->from), filesize_to_string2(avc->to), + avc->sources, plural(avc->sources)); + + available += avc->to - avc->from; /* For logging */ + } + + g_soft_assert_log(available <= fi->size, + "available=%s, fi->size=%s", + filesize_to_string(available), filesize_to_string2(fi->size)); + + g_debug("=> %s out of %s bytes available (%.2f%%)", + filesize_to_string(available), filesize_to_string2(fi->size), + 100.0 * available / fi->size); + + rbtree_iter_release(&iter); + } + + /* + * In the end, we can dispose of the red-black trees and need only to keep + * the list of chunks available along with their availability count. + */ + + rbtree_discard(rbt, dl_avail_chunk_free); + rbtree_free_null(&rbt); + + iter = rbtree_iter_new(arbt); + + while (rbtree_iter_next(iter, &item)) { + struct dl_avail_chunk *avc = deconstify_pointer(item); + + dl_avail_chunk_check(avc); + eslist_append(&fi->available, avc); + } + + rbtree_iter_release(&iter); + rbtree_free_null(&arbt); /* Its items are now listed in fi->available */ - WALLOC(range); - range->start = 0; - range->end = size - 1; + /* + * Sort the list so that the rarest chunks come first. + * + * Note that when there are no partial sources, there is only one available + * chunk in the list: the chunk representing the whole file. + */ - return g_slist_append(NULL, range); + eslist_sort(&fi->available, fi_avail_source_cmp); } /** * Callback for updates to ranges available on the network. * - * This function gets triggered by an event when new ranges - * information has become available for a download source. - * We collect the set of currently available ranges in - * file_info->seen_on_network. Currently we only fold in new ranges - * from a download source, but we should also remove sets of ranges when - * a download source is no longer available. + * This function gets triggered by an event when new ranges information has + * become available for a download source. * - * @paramin srcid The abstract id of the source that had its ranges updated. + * We collect the set of currently available ranges in fi->seen_on_network. + * We fold in new ranges from a download source, and also remove sets of + * ranges when a download source is no longer available. * - * @bug - * FIXME: also remove ranges when a download source is no longer available. + * @paramin srcid The abstract id of the source that had its ranges updated. */ static void fi_update_seen_on_network(gnet_src_t srcid) { struct download *d; - GSList *old_list; /* The previous list of ranges, no longer needed */ - GSList *sl; /* Temporary pointer to help remove old_list */ - GSList *r = NULL; - GSList *new_r = NULL; + http_rangeset_t *hrs; + pslist_t *sl; + fileinfo_t *fi; d = src_get_download(srcid); download_check(d); - old_list = d->file_info->seen_on_network; + fi = d->file_info; + file_info_check(fi); /* - * FIXME: this code is currently only triggered by new HTTP ranges - * information becoming available. In addition to that we should perhaps - * also include add_source and delete_source. We will miss the latter in - * this setup especially. + * We have new range information probably, so we need to recompute + * the rarest chunks. */ + fi_update_rarest_chunks(fi); + + if (GNET_PROPERTY(fileinfo_debug) > 5) + g_debug("%s(): updating ranges for %s", G_STRFUNC, fi->pathname); + /* * Look at all the download sources for this fileinfo and calculate the - * overall ranges info for this file. + * overall ranges info for this file, as determined by active sources + * which replied to us recently -- we not not take into account all sources. */ - if (GNET_PROPERTY(fileinfo_debug) > 5) - g_debug("*** Fileinfo: %s\n", d->file_info->pathname); - for (sl = d->file_info->sources; sl; sl = g_slist_next(sl)) { + http_rangeset_free_null(&fi->seen_on_network); + hrs = fi->seen_on_network = http_rangeset_create(); + + PSLIST_FOREACH(fi->sources, sl) { struct download *src = sl->data; + fileinfo_t *sfi; + + download_check(src); + + sfi = src->file_info; + file_info_check(sfi); + /* * We only count the ranges of a file if it has replied to a recent * request, and if the download request is not done or in an error * state. */ + if ( - src->flags & DL_F_REPLIED && - !( - GTA_DL_COMPLETED == src->status || - GTA_DL_ERROR == src->status || - GTA_DL_ABORTED == src->status || - GTA_DL_REMOVED == src->status || - GTA_DL_DONE == src->status - ) + (src->flags & DL_F_REPLIED) && + download_is_active(src) ) { if (GNET_PROPERTY(fileinfo_debug) > 5) - g_debug(" %s:%d replied (%x, %x), ", + g_debug("- %s:%d replied (%s, flags=0x%x), ", host_addr_to_string(src->server->key->addr), - src->server->key->port, src->flags, src->status); + src->server->key->port, + download_status_to_string(src), src->flags); - if (!src->file_info->use_swarming || !(src->flags & DL_F_PARTIAL)) { + if (!sfi->use_swarming || !(src->flags & DL_F_PARTIAL)) { /* * Indicate that the whole file is available. - * We could just stop here and assign the complete file range, - * but I'm leaving the code as-is so that we can play with the - * info more, e.g. show different colors for ranges that are - * available more. */ if (GNET_PROPERTY(fileinfo_debug) > 5) - g_debug(" whole file is now available"); - - { - GSList *full_r; + g_debug(" whole file is now available"); - full_r = fi_range_for_complete_file(d->file_info->size); - new_r = http_range_merge(r, full_r); - fi_free_ranges(full_r); - } + http_rangeset_clear(hrs); + http_rangeset_insert(hrs, 0, fi->size - 1); + break; + } else if (NULL == src->ranges) { + /* Partial file with no known ranges, ignore */ + continue; } else { /* Merge in the new ranges */ - if (GNET_PROPERTY(fileinfo_debug) > 5) - g_debug(" ranges %s available", - http_range_to_string(src->ranges)); - new_r = http_range_merge(r, src->ranges); + if (GNET_PROPERTY(fileinfo_debug) > 5) { + g_debug(" ranges available: %s", + http_rangeset_to_string(src->ranges)); + } + + http_rangeset_merge(hrs, src->ranges); } - fi_free_ranges(r); - r = new_r; + + /* + * Stop looping if we have the full range covered. + */ + + if (http_rangeset_length(hrs) == fi->size) + break; } } - d->file_info->seen_on_network = r; if (GNET_PROPERTY(fileinfo_debug) > 5) - g_debug(" final ranges: %s", http_range_to_string(r)); - - /* - * Remove the old list and free its range elements - */ - fi_free_ranges(old_list); + g_debug("=> final ranges: %s", http_rangeset_to_string(hrs)); /* * Trigger a changed ranges event so that others can use the updated info. @@ -6889,74 +7696,72 @@ struct file_info_foreach { file_info_foreach_cb callback; - gpointer udata; + void *udata; }; static void -file_info_foreach_helper(gpointer unused_key, gpointer value, gpointer udata) +file_info_foreach_helper(void *value, void *udata) { struct file_info_foreach *data = udata; fileinfo_t *fi = value; - (void) unused_key; - file_info_check(fi); data->callback(fi->fi_handle, data->udata); } void -file_info_foreach(file_info_foreach_cb callback, gpointer udata) +file_info_foreach(file_info_foreach_cb callback, void *udata) { struct file_info_foreach data; - + g_return_if_fail(fi_by_guid); g_return_if_fail(callback); data.callback = callback; data.udata = udata; - g_hash_table_foreach(fi_by_guid, file_info_foreach_helper, &data); + hikset_foreach(fi_by_guid, file_info_foreach_helper, &data); } const char * file_info_status_to_string(const gnet_fi_status_t *status) { - static char buf4096; + static char buf512; g_return_val_if_fail(status, NULL); if (status->recvcount) { - guint32 secs; + uint32 secs; if (status->recv_last_rate) { secs = (status->size - status->done) / status->recv_last_rate; } else { secs = 0; } - gm_snprintf(buf, sizeof buf, _("Downloading (TR: %s)"), + str_bprintf(buf, sizeof buf, _("Downloading (TR: %s)"), secs ? short_time(secs) : "-"); goto dht_status; } else if (status->seeding) { return _("Seeding"); } else if (status->verifying) { if (status->vrfy_hashed > 0) { - gm_snprintf(buf, sizeof buf, + str_bprintf(buf, sizeof buf, "%s %s (%.1f%%)", status->tth_check ? _("Computing TTH") : _("Computing SHA1"), short_size(status->vrfy_hashed, GNET_PROPERTY(display_metric_units)), - (1.0 * status->vrfy_hashed / status->size) * 100.0); + (1.0 * status->vrfy_hashed / MAX(1, status->size)) * 100.0); return buf; } else { return status->tth_check ? _("Waiting for TTH check") : _("Waiting for SHA1 check"); } } else if (status->complete) { - static char msg_sha11024, msg_copy1024; + char msg_sha1128, msg_copy128; msg_sha10 = '\0'; if (status->has_sha1) { - gm_snprintf(msg_sha1, sizeof msg_sha1, "%s %s", + str_bprintf(msg_sha1, sizeof msg_sha1, "%s %s", _("SHA1"), status->sha1_matched ? _("OK") : status->sha1_failed ? _("failed") : _("not computed yet")); @@ -6965,10 +7770,10 @@ msg_copy0 = '\0'; if (status->moving) { if (0 == status->copied) { - gm_snprintf(msg_copy, sizeof msg_copy, "%s", + str_bprintf(msg_copy, sizeof msg_copy, "%s", _("Waiting for moving...")); } else if (status->copied > 0 && status->copied < status->size) { - gm_snprintf(msg_copy, sizeof msg_copy, + str_bprintf(msg_copy, sizeof msg_copy, "%s %s (%.1f%%)", _("Moving"), short_size(status->copied, GNET_PROPERTY(display_metric_units)), @@ -6979,14 +7784,14 @@ concat_strings(buf, sizeof buf, _("Finished"), '\0' != msg_sha10 ? "; " : "", msg_sha1, '\0' != msg_copy0 ? "; " : "", msg_copy, - (void *) 0); + NULL_PTR); return buf; } else if (0 == status->lifecount) { g_strlcpy(buf, _("No sources"), sizeof buf); goto dht_status; } else if (status->active_queued || status->passive_queued) { - gm_snprintf(buf, sizeof buf, + str_bprintf(buf, sizeof buf, _("Queued (%u active, %u passive)"), status->active_queued, status->passive_queued); goto dht_status; @@ -7002,26 +7807,26 @@ size_t w = strlen(buf); if (status->dht_lookup_running) { - w += gm_snprintf(&bufw, sizeof buf - w, "; "); - w += gm_snprintf(&bufw, sizeof buf - w, + w += str_bprintf(&bufw, sizeof buf - w, "; "); + w += str_bprintf(&bufw, sizeof buf - w, _("Querying DHT")); } else if (status->dht_lookup_pending) { - w += gm_snprintf(&bufw, sizeof buf - w, "; "); - w += gm_snprintf(&bufw, sizeof buf - w, + w += str_bprintf(&bufw, sizeof buf - w, "; "); + w += str_bprintf(&bufw, sizeof buf - w, _("Pending DHT query")); } if (status->dht_lookups != 0) { - w += gm_snprintf(&bufw, sizeof buf - w, "; "); + w += str_bprintf(&bufw, sizeof buf - w, "; "); if (status->dht_values != 0) { - w += gm_snprintf(&bufw, sizeof buf - w, + w += str_bprintf(&bufw, sizeof buf - w, NG_( "%u/%u successful DHT lookup", "%u/%u successful DHT lookups", status->dht_lookups), status->dht_values, status->dht_lookups); } else { - w += gm_snprintf(&bufw, sizeof buf - w, + w += str_bprintf(&bufw, sizeof buf - w, NG_("%u DHT lookup", "%u DHT lookups", status->dht_lookups), status->dht_lookups); } @@ -7035,10 +7840,10 @@ * Change the basename of a filename and rename it on-disk. * @return TRUE in case of success, FALSE on error. */ -gboolean +bool file_info_rename(fileinfo_t *fi, const char *filename) { - gboolean success = FALSE; + bool success = FALSE; char *pathname; file_info_check(fi); @@ -7053,7 +7858,7 @@ { char *directory, *name; - + directory = filepath_directory(fi->pathname); name = filename_sanitize(filename, FALSE, FALSE); @@ -7090,22 +7895,20 @@ /** * Initialize fileinfo handling. */ -G_GNUC_COLD void +void G_COLD file_info_init(void) { + TOKENIZE_CHECK_SORTED(fi_tags); -#define bs_nop(x) (x) - - BINARY_ARRAY_SORTED(fi_tag_map, struct fi_tag, str, strcmp, bs_nop); - -#undef bs_nop - - fi_by_sha1 = g_hash_table_new(sha1_hash, sha1_eq); - fi_by_namesize = g_hash_table_new(namesize_hash, namesize_eq); - fi_by_guid = g_hash_table_new(guid_hash, guid_eq); - fi_by_outname = g_hash_table_new(g_str_hash, g_str_equal); + fi_by_sha1 = hikset_create(offsetof(fileinfo_t, sha1), + HASH_KEY_FIXED, SHA1_RAW_SIZE); + fi_by_namesize = htable_create_any(namesize_hash, NULL, namesize_eq); + fi_by_guid = hikset_create(offsetof(fileinfo_t, guid), + HASH_KEY_FIXED, GUID_RAW_SIZE); + fi_by_outname = hikset_create(offsetof(fileinfo_t, pathname), + HASH_KEY_STRING, 0); - fi_handle_map = idtable_new(); + fi_handle_map = idtable_new(32); fi_eventsEV_FI_ADDED = event_new("fi_added"); fi_eventsEV_FI_REMOVED = event_new("fi_removed"); @@ -7115,7 +7918,7 @@ fi_eventsEV_FI_STATUS_CHANGED_TRANSIENT = event_new("fi_status_changed_transient"); - src_handle_map = idtable_new(); + src_handle_map = idtable_new(32); src_eventsEV_SRC_ADDED = event_new("src_added"); src_eventsEV_SRC_REMOVED = event_new("src_removed"); @@ -7132,7 +7935,7 @@ file_info_init_post(void) { /* - * The listener we set up here is set up in download_init, but that must + * The listener we set up here is set up in download_init(), but that must * be called after file_info_init() to subscribe to src events on available * range updates */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/fileinfo.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/fileinfo.h
Changed
@@ -56,29 +56,30 @@ int file_info_has_trailer(const char *path); void file_info_retrieve(void); void file_info_store(void); -void file_info_store_binary(fileinfo_t *fi, gboolean force); +void file_info_store_binary(fileinfo_t *fi, bool force); void file_info_store_if_dirty(void); -void file_info_set_discard(fileinfo_t *fi, gboolean state); +void file_info_set_discard(fileinfo_t *fi, bool state); enum dl_chunk_status file_info_find_hole( const struct download *d, filesize_t *from, filesize_t *to); -gboolean file_info_find_available_hole(const struct download *d, - GSList *ranges, filesize_t *from, filesize_t *to); +bool file_info_find_available_hole(const struct download *d, + http_rangeset_t *ranges, filesize_t *from, filesize_t *to); void file_info_merge_adjacent(fileinfo_t *fi); -void file_info_clear_download(struct download *d, gboolean lifecount); +void file_info_clear_download(struct download *d, bool lifecount); enum dl_chunk_status file_info_chunk_status( fileinfo_t *fi, filesize_t from, filesize_t to); void file_info_reset(fileinfo_t *fi); void file_info_recreate(struct download *d); fileinfo_t *file_info_get( const char *file, const char *path, filesize_t size, - const struct sha1 *sha1, gboolean file_size_known); + const struct sha1 *sha1, bool file_size_known); void file_info_strip_binary(fileinfo_t *fi); void file_info_strip_binary_from_file(fileinfo_t *fi, const char *file); -gboolean file_info_got_sha1(fileinfo_t *fi, const struct sha1 *sha1); +bool file_info_got_sha1(fileinfo_t *fi, const struct sha1 *sha1); void file_info_got_tth(fileinfo_t *fi, const struct tth *tth); void file_info_got_tigertree(fileinfo_t *fi, - const struct tth *leaves, size_t num_leaves, gboolean mark_dirty); + const struct tth *leaves, size_t num_leaves, bool mark_dirty); void file_info_size_known(struct download *d, filesize_t size); +void file_info_size_unknown(fileinfo_t *fi); void file_info_update(const struct download *d, filesize_t from, filesize_t to, enum dl_chunk_status status); void file_info_new_chunk_owner(const struct download *d, @@ -89,14 +90,16 @@ void file_info_close_pre(void); void file_info_try_to_swarm_with( const char *file_name, const host_addr_t addr, - guint16 port, const struct sha1 *sha1); + uint16 port, const struct sha1 *sha1); void file_info_try_to_swarm_with_firewalled( const guid_t *guid, hash_list_t *proxies, const struct sha1 *sha1); void file_info_spot_completed_orphans(void); void file_info_add_source(fileinfo_t *fi, struct download *dl); void file_info_add_new_source(fileinfo_t *fi, struct download *dl); void file_info_remove_source( - fileinfo_t *fi, struct download *dl, gboolean discard); + fileinfo_t *fi, struct download *dl, bool discard); +void file_info_cloned_source(fileinfo_t *fi, + struct download *d, struct download *cd); void file_info_timer(void); void file_info_slow_timer(void); void file_info_unlink(fileinfo_t *fi); @@ -107,29 +110,30 @@ fileinfo_t *file_info_by_guid(const struct guid *guid); void file_info_dht_query(const sha1_t *sha1); void file_info_dht_query_queued(fileinfo_t *fi); -gboolean file_info_dht_query_starting(fileinfo_t *fi); -void file_info_dht_query_completed(fileinfo_t *fi, gboolean l, gboolean f); +bool file_info_dht_query_starting(fileinfo_t *fi); +void file_info_dht_query_completed(fileinfo_t *fi, bool l, bool f); shared_file_t *file_info_shared_sha1(const struct sha1 *sha1); size_t file_info_available(const fileinfo_t *fi, char *buf, size_t size); size_t file_info_available_ranges(const fileinfo_t *fi, char *buf, size_t size); -gboolean file_info_restrict_range( +bool file_info_restrict_range( fileinfo_t *fi, filesize_t start, filesize_t *end); fileinfo_t *file_info_has_identical(const struct sha1 *sha1, filesize_t size); -gboolean file_info_is_rare(const fileinfo_t *fi); -gboolean file_info_partial_shareable(const fileinfo_t *fi); +bool file_info_is_rare(const fileinfo_t *fi); +bool file_info_partial_shareable(const fileinfo_t *fi); fileinfo_t *file_info_get_transient(const char *name); fileinfo_t *file_info_by_sha1(const struct sha1 *sha1); void file_info_remove(fileinfo_t *fi); void file_info_moved(fileinfo_t *fi, const char *pathname); void file_info_mark_stripped(fileinfo_t *fi); -gboolean file_info_rename(fileinfo_t *fi, const char *filename); +bool file_info_rename(fileinfo_t *fi, const char *filename); +void file_info_resize(fileinfo_t *fi, filesize_t size); -typedef void (*file_info_foreach_cb)(gnet_fi_t fi_handle, gpointer udata); -void file_info_foreach(file_info_foreach_cb callback, gpointer udata); -gboolean file_info_purge(fileinfo_t *fi); +typedef void (*file_info_foreach_cb)(gnet_fi_t fi_handle, void *udata); +void file_info_foreach(file_info_foreach_cb callback, void *udata); +bool file_info_purge(fileinfo_t *fi); char *file_info_unique_filename(const char *path, const char *file, const char *ext); @@ -138,7 +142,7 @@ void fi_src_ranges_changed(struct download *); void fi_src_status_changed(struct download *); -GSList *file_info_get_sources(const fileinfo_t *); +struct pslist *file_info_get_sources(const fileinfo_t *); /*** *** Inlined routines. @@ -147,7 +151,7 @@ /** * Return amount of currently active sources. */ -static inline G_GNUC_PURE WARN_UNUSED_RESULT guint32 +static inline G_PURE WARN_UNUSED_RESULT uint32 fi_alive_count(const fileinfo_t *fi) { return fi->active_queued + fi->passive_queued + fi->recvcount;
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/g2
Added
+(directory)
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/g2/Jmakefile
Added
@@ -0,0 +1,51 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + * Jmakefile for the core/g2 part. + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +SRC = \ + build.c \ + frame.c \ + gwc.c \ + msg.c \ + node.c \ + rpc.c \ + tfmt.c \ + tree.c + +OBJ = \ +|expand f!$(SRC)! + !f:\.c=.o \ +-expand \\ + + +/* Additional flags for GTK compilation, added in the substituted section */ +++GLIB_CFLAGS $glibcflags + +;# Those extra flags are expected to be user-defined +CFLAGS = -I$(TOP) -I../.. $(GLIB_CFLAGS) -DCORE_SOURCES -DCURDIR=$(CURRENT) +DPFLAGS = $(CFLAGS) + +NormalLibraryTarget(g2, $(SRC), $(OBJ)) +DependTarget() +
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/g2/Makefile.SH
Added
@@ -0,0 +1,220 @@ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ + +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +CURRENT=src/core/g2 +DIR=`echo $CURRENT/ | sed -e 's/\.\///g'` +echo "Extracting ${DIR}Makefile (with variable substitutions)" + +DATE=`date` + +$spitshell >Makefile <<!GROK!THIS! +######################################################################## +# Makefile generated from Makefile.SH on $DATE + +SHELL = /bin/sh +JMAKE = jmake +TOP = ../../.. +CURRENT = $CURRENT +DIR = $DIR + +######################################################################## +# Parameters set by Configure -- edit config.sh if changes are needed + +AR = ar rc +CC = $cc +CTAGS = ctags +JCFLAGS = \$(CFLAGS) $optimize $pthread $ccflags $large +JCPPFLAGS = $cppflags +MKDEP = $mkdep \$(DPFLAGS) \$(JCPPFLAGS) -- +MV = $mv +RANLIB = $ranlib +RM = $rm -f +SED = $sed + +######################################################################## +# Automatically generated parameters -- do not edit + +USRINC = $usrinc +SOURCES = \$(SRC) +OBJECTS = \$(OBJ) +GLIB_CFLAGS = $glibcflags + +######################################################################## +# New suffixes and associated building rules -- edit with care + +.c.o: + \$(RM) \$@ + \$(CC) -c \$(JCFLAGS) \$< + +!GROK!THIS! +$spitshell >>Makefile <<'!NO!SUBS!' +######################################################################## +# Jmake rules for building libraries, programs, scripts, and data files +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ + +######################################################################## +# Force 'make depend' to be performed first -- do not edit + +all:: .FORCE_DEPEND + +.FORCE_DEPEND:: + +######################################################################## +# Start of Jmakefile + +SRC = \ + build.c \ + frame.c \ + gwc.c \ + msg.c \ + node.c \ + rpc.c \ + tfmt.c \ + tree.c + +OBJ = \ + build.o \ + frame.o \ + gwc.o \ + msg.o \ + node.o \ + rpc.o \ + tfmt.o \ + tree.o + +# Those extra flags are expected to be user-defined +CFLAGS = -I$(TOP) -I../.. $(GLIB_CFLAGS) -DCORE_SOURCES -DCURDIR=$(CURRENT) +DPFLAGS = $(CFLAGS) + +all:: libg2.a + +local_realclean:: + $(RM) libg2.a + +libg2.a: $(OBJ) + $(RM) $@ + $(AR) $@ $(OBJ) + $(RANLIB) $@ + +local_depend:: ../../../mkdep + +../../../mkdep: + @echo "You have to run Configure in $(TOP) first."; exit 1 + +depend:: local_depend +local_depend:: + ($(SED) '/^# DO NOT DELETE/q' Makefile && \ + $(MKDEP) $(SOURCES) | \ + $(SED) -e 's:/usr/lib^ *::g; s:$(USRINC)^ *::g; ' \ + -e '/: / b print' -e '$$ b print' -e 'H; d; n; : print' \ + -e 'x; s/\\$$//; s/\\\n//g; s/ */ /g; s/ :/:/;' -e '/: *$$/d' \ + ) > Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) Makefile.new + +######################################################################## +# Common rules for all Makefiles -- do not edit + +all:: + +clean: local_clean +realclean: local_realclean +clobber: local_clobber + +local_clean:: + if test -f core; then $(RM) core; fi + $(RM) *~ *.o + +local_realclean:: local_clean + +local_clobber:: local_realclean + $(RM) Makefile config.sh + +install:: local_install + @exit 0 + +install-strip:: local_install-strip + @exit 0 + +install.man:: maybe_install.man +deinstall:: local_deinstall +deinstall.man:: maybe_deinstall.man + +install.man-no: +deinstall.man-no: + +maybe_install.man: install.man-no +maybe_deinstall.man: deinstall.man-no + +Makefile.SH: Jmakefile + -@if test -f $(TOP)/.package; then \ + if test -f Makefile.SH; then \ + echo " $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~"; \ + $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~; \ + fi; \ + echo " $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT)" ; \ + $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT) ; \ + else touch $@; fi + +Makefile: Makefile.SH + /bin/sh Makefile.SH + +tags:: + $(CTAGS) -w *.ch + $(CTAGS) -xw *.ch > tags + +local_clobber:: + $(RM) tags + +depend:: + +######################################################################## +# Empty rules for directories with no sub-directories -- do not edit + +local_install:: + @echo "install in $(CURRENT) done." + +local_install-strip:: + @echo "install (strip) in $(CURRENT) done." + +local_deinstall:: + @echo "deinstall in $(CURRENT) done." + +local_install.man:: + @echo "install.man in $(CURRENT) done." + +local_deinstall.man:: + @echo "deinstall.man in $(CURRENT) done." + +Makefiles:: + +Makefiles.SH:: + +######################################################################## +# Dependencies generated by make depend +# DO NOT DELETE THIS LINE -- make depend relies on it + +# Put nothing here or make depend will gobble it up +.FORCE_DEPEND:: + @echo "You must run 'make depend' in $(TOP) first."; exit 1 +!NO!SUBS! +chmod 644 Makefile +$eunicefix Makefile +
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/g2/build.c
Added
@@ -0,0 +1,1298 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * G2 message factory. + * + * @author Raphael Manfredi + * @date 2014 + */ + +#include "common.h" +#include "gtk-gnutella.h" /* For GTA_VENDOR_CODE */ + +#include "build.h" + +#include "frame.h" +#include "msg.h" +#include "node.h" +#include "tfmt.h" +#include "tree.h" + +#include "core/dmesh.h" +#include "core/gnet_stats.h" +#include "core/ggep_type.h" /* For ggept_gtkgv_build() and GTKGV_MAX_LEN */ +#include "core/nodes.h" +#include "core/guid.h" /* For guid_query_muid_is_gtkg() */ +#include "core/qhit.h" +#include "core/settings.h" /* For listen_addr_primary() */ +#include "core/share.h" /* For shared_files_scanned() */ +#include "core/sockets.h" /* For socket_listen_port() */ +#include "core/tls_common.h" /* For tls_enabled() */ + +#include "if/core/search.h" /* For SEARCH_* meta type flags */ + +#include "lib/endian.h" +#include "lib/halloc.h" +#include "lib/hset.h" +#include "lib/mempcpy.h" +#include "lib/misc.h" /* For CONST_STRLEN() */ +#include "lib/nid.h" +#include "lib/once.h" +#include "lib/pmsg.h" +#include "lib/pow2.h" +#include "lib/pslist.h" +#include "lib/sha1.h" +#include "lib/stacktrace.h" +#include "lib/stringify.h" +#include "lib/walloc.h" + +#include "lib/override.h" /* Must be the last header included */ + +#define G2_BUILD_QH2_THRESH 8192 /**< Flush /QH2 larger than this */ +#define G2_BUILD_QH2_MAX_ALT 16 /**< Max amount of alt-locs we send */ + +enum g2_qht_type { + G2_QHT_RESET = 0, + G2_QHT_PATCH = 1, +}; + +const char G2_URN_SHA1 = "sha1"; +const char G2_URN_BITPRINT = "bp"; + +static pmsg_t *build_alive_pi; /* Single alive ping */ +static once_flag_t build_alive_pi_done; + +static pmsg_t *build_po; /* Single pong */ +static once_flag_t build_po_done; + +enum g2_qh2_pmi_magic { G2_QH2_PMI_MAGIC = 0x79ec9986 }; + +/** + * Information about the /QH2 messages we sent to the semi-reliable UDP + * layer, which allows up to monitor their fate. + */ +struct g2_qh2_pmsg_info { + enum g2_qh2_pmi_magic magic; + struct nid *hub_id; /**< ID of the hub which sent us the /Q2 */ +}; + +static inline void +g2_qh2_pmsg_info_check(const struct g2_qh2_pmsg_info * const pmi) +{ + g_assert(pmi != NULL); + g_assert(G2_QH2_PMI_MAGIC == pmi->magic); +} + +/** + * Create new message holding serialized tree. + * + * @param t the tree to serialize + * @param prio priority of the message + * @param freecb if non-NULL, the free routine to attach to message + * @param arg additional argument for the free routine + * + * @return a message containing the serialized tree. + */ +static pmsg_t * +g2_build_pmsg_prio(const g2_tree_t *t, int prio, pmsg_free_t freecb, void *arg) +{ + size_t len; + pmsg_t *mb; + + len = g2_frame_serialize(t, NULL, 0); + if (NULL == freecb) + mb = pmsg_new(prio, NULL, len); + else + mb = pmsg_new_extend(prio, NULL, len, freecb, arg); + g2_frame_serialize(t, pmsg_start(mb), len); + pmsg_seek(mb, len); + + g_assert(UNSIGNED(pmsg_size(mb)) == len); + + return mb; +} + +/** + * Create new control message holding serialized tree. + * + * @param t the tree to serialize + * + * @return a message containing the serialized tree. + */ +static inline pmsg_t * +g2_build_ctrl_pmsg(const g2_tree_t *t) +{ + return g2_build_pmsg_prio(t, PMSG_P_CONTROL, NULL, NULL); +} + +/** + * Create new message holding serialized tree. + * + * @param t the tree to serialize + * + * @return a message containing the serialized tree. + */ +static inline pmsg_t * +g2_build_pmsg(const g2_tree_t *t) +{ + return g2_build_pmsg_prio(t, PMSG_P_DATA, NULL, NULL); +} + +/** + * Create new message holding serialized tree, with associated free routine. + * + * @param t the tree to serialize + * @param freecb the freeing callback to invoke + * @param arg additional argument for the freeing callback + * + * @return a message containing the serialized tree. + */ +static inline pmsg_t * +g2_build_pmsg_extended(const g2_tree_t *t, pmsg_free_t freecb, void *arg) +{ + return g2_build_pmsg_prio(t, PMSG_P_DATA, freecb, arg); +} + +/** + * Create a pong message, once. + */ +static void +g2_build_pong_once(void) +{ + g2_tree_t *t; + + t = g2_tree_alloc_empty(G2_NAME(PO)); + build_po = g2_build_pmsg(t); + g2_tree_free_null(&t); +} + +/** + * Build a pong message. + * + * @return a /PO message. + */ +pmsg_t * +g2_build_pong(void) +{ + ONCE_FLAG_RUN(build_po_done, g2_build_pong_once); + + return pmsg_clone(build_po); +} + +/** + * Create an alive ping message, once. + */ +static void +g2_build_alive_ping_once(void) +{ + g2_tree_t *t; + + t = g2_tree_alloc_empty(G2_NAME(PI)); + build_alive_pi = g2_build_ctrl_pmsg(t); /* Prioritary */ + g2_tree_free_null(&t); +} + +/** + * Build an alive ping message. + * + * @return a /PI message. + */ +pmsg_t * +g2_build_alive_ping(void) +{ + ONCE_FLAG_RUN(build_alive_pi_done, g2_build_alive_ping_once); + + return pmsg_clone(build_alive_pi); +} + +/** + * Build a QHT RESET message. + * + * @param slots amount of slots in the table (power of 2) + * @param inf_val infinity value (1) + * + * @return a /QHT message with a RESET payload. + */ +pmsg_t * +g2_build_qht_reset(int slots, int inf_val) +{ + g2_tree_t *t; + char body6; + void *p = &body0; + pmsg_t *mb; + + g_assert(is_pow2(slots)); + g_assert(1 == inf_val); /* Only 1-bit patches in G2 */ + + p = poke_u8(p, G2_QHT_RESET); + p = poke_le32(p, slots); + p = poke_u8(p, inf_val); + + t = g2_tree_alloc(G2_NAME(QHT), body, sizeof body); + mb = g2_build_pmsg(t); + g2_tree_free_null(&t); + + return mb; +} + +/** + * Build a QHT PATCH message. + * + * @param seqno the patch sequence number + * @param seqsize the total length of the sequence + * @param compressed whether patch is compressed + * @param bits amount of bits for each entry (1) + * @param buf start of patch data + * @param len length in byte of patch data + * + * @return a /QHT message with a PATCH payload. + */ +pmsg_t * +g2_build_qht_patch(int seqno, int seqsize, bool compressed, int bits, + char *buf, int len) +{ + g2_tree_t *t; + char body5; /* The start of the payload */ + void *payload, *p; + pmsg_t *mb; + + g_assert(1 == bits); /* Only 1-bit patches in G2 */ + + p = payload = halloc(len + sizeof body); + + p = poke_u8(p, G2_QHT_PATCH); + p = poke_u8(p, seqno); + p = poke_u8(p, seqsize); + p = poke_u8(p, compressed ? 0x1 : 0x0); + p = poke_u8(p, bits); + + memcpy(p, buf, len); + + t = g2_tree_alloc(G2_NAME(QHT), payload, len + sizeof body); + mb = g2_build_pmsg(t); + g2_tree_free_null(&t); + hfree(payload); + + return mb; +} + +/** + * Add the local node GUID as a "GU" child to the root. + */ +static void +g2_build_add_guid(g2_tree_t *t) +{ + g2_tree_t *c; + + c = g2_tree_alloc_copy("GU", GNET_PROPERTY(servent_guid), GUID_RAW_SIZE); + g2_tree_add_child(t, c); +} + +/** + * Add the vendor code as a "V" child to the root. + */ +static void +g2_build_add_vendor(g2_tree_t *t) +{ + g2_tree_t *c; + + c = g2_tree_alloc("V", GTA_VENDOR_CODE, CONST_STRLEN(GTA_VENDOR_CODE)); + g2_tree_add_child(t, c); +} + +/** + * Add child to the node, carrying an IP:port. + * + * @param t the tree node where child must be added + * @param name the name of the child + * @param addr the IP address + * @param port the port address + * + * @return the added child node + */ +static g2_tree_t * +g2_build_add_host(g2_tree_t *t, const char *name, host_addr_t addr, uint16 port) +{ + struct packed_host_addr packed; + uint alen; + char payload18; /* Large enough for IPv6 as well, one day? */ + void *p; + g2_tree_t *c; + + packed = host_addr_pack(addr); + alen = packed_host_addr_size(packed) - 1; /* skip network byte */ + + p = mempcpy(payload, &packed.addr, alen); + p = poke_le16(p, port); + + c = g2_tree_alloc_copy(name, payload, ptr_diff(p, payload)); + g2_tree_add_child(t, c); + + return c; +} + +/** + * Add child to the node, carrying our listening IP:port. + * + * @param t the tree node where child must be added + * @param name the name of the child + * + * @return the added child node + */ +static g2_tree_t * +g2_build_add_listening_address(g2_tree_t *t, const char *name) +{ + return g2_build_add_host(t, name, + listen_addr_primary(), socket_listen_port()); +} + +/** + * Add the local node address as a "NA" child to the root. + */ +static void +g2_build_add_node_address(g2_tree_t *t) +{ + g2_build_add_listening_address(t, "NA"); +} + +/** + * Add the servent update as a "UP" child to the root. + */ +static void +g2_build_add_uptime(g2_tree_t *t) +{ + time_delta_t uptime; + char payload8; + int n; + g2_tree_t *c; + + /* + * The uptime will typically be small, hence it is encoded as a variable + * length little-endian value, with trailing zeros removed. Usually + * only 2 or 3 bytes will be necesssary to encode the uptime (in seconds). + */ + + uptime = delta_time(tm_time(), GNET_PROPERTY(start_stamp)); + n = vlint_encode(uptime, payload); + + c = g2_tree_alloc_copy("UP", payload, n); /* No trailing 0s */ + g2_tree_add_child(t, c); +} + +/** + * Generate a "FW" child in the root if the node is firewalled. + */ +static void +g2_build_add_firewalled(g2_tree_t *t) +{ + if (GNET_PROPERTY(is_firewalled) || GNET_PROPERTY(is_udp_firewalled)) { + g2_tree_t *c = g2_tree_alloc_empty("FW"); + g2_tree_add_child(t, c); + } +} + +/** + * Generate a "BH" child in the root if the node is browsable. + */ +static void +g2_build_add_browsable(g2_tree_t *t) +{ + if (GNET_PROPERTY(browse_host_enabled)) { + g2_tree_t *c = g2_tree_alloc_empty("BH"); + g2_tree_add_child(t, c); + } +} + +/** + * Generate a "TLS" child in the root if the node supports TLS connections. + * This is a documented GTKG extension. + */ +static void +g2_build_add_tls(g2_tree_t *t) +{ + if (tls_enabled()) { + g2_tree_t *c = g2_tree_alloc_empty("TLS"); + g2_tree_add_child(t, c); + } +} + +/** + * Generate a "HN" child in the root to hold the DNS hostname, if defined. + * This is a documented GTKG extension. + */ +static void +g2_build_add_hostname(g2_tree_t *t) +{ + if ( + !GNET_PROPERTY(is_firewalled) && + GNET_PROPERTY(give_server_hostname) && + !is_null_or_empty(GNET_PROPERTY(server_hostname)) + ) { + g2_tree_t *c; + const char *hostname = GNET_PROPERTY(server_hostname); + + c = g2_tree_alloc_copy("HN", hostname, strlen(hostname)); + g2_tree_add_child(t, c); + } +} + +/** + * Generate as many "NH" children to the root as we have neihbouring hubs, + * when the node is firewalled. They can act as "push proxies", as in Gnutella. + */ +static void +g2_build_add_neighbours(g2_tree_t *t) +{ + if (GNET_PROPERTY(is_firewalled) || GNET_PROPERTY(is_udp_firewalled)) { + const pslist_t *sl; + + PSLIST_FOREACH(node_all_g2_nodes(), sl) { + const gnutella_node_t *n = sl->data; + + node_check(n); + g_assert(NODE_TALKS_G2(n)); + + if (NODE_IS_ESTABLISHED(n) && node_address_known(n)) + g2_build_add_host(t, "NH", n->gnet_addr, n->gnet_port); + } + } +} + +/** + * Add a "gtkgV" child to propagate GTKG version information. + */ +static void +g2_build_add_gtkgv(g2_tree_t *t) +{ + char bufGTKGV_MAX_LEN; + size_t len; + g2_tree_t *c; + + len = ggept_gtkgv_build(buf, sizeof buf); + c = g2_tree_alloc_copy("gtkgV", buf, len); + g2_tree_add_child(t, c); +} + +/** + * Build a Local Node Info message. + * + * @return a /LNI message. + */ +pmsg_t * +g2_build_lni(void) +{ + g2_tree_t *t; + pmsg_t *mb; + + t = g2_tree_alloc_empty(G2_NAME(LNI)); + + /* LS -- library statistics */ + + { + uint32 files, kbytes; + char payload8; + void *p = payload; + g2_tree_t *c; + + files = MIN(shared_files_scanned(), ~((uint32) 0U)); + kbytes = MIN(shared_kbytes_scanned(), ~((uint32) 0U)); + + p = poke_le32(p, files); + p = poke_le32(p, kbytes); + + c = g2_tree_alloc_copy("LS", payload, sizeof payload); + g2_tree_add_child(t, c); + } + + g2_build_add_firewalled(t); /* FW -- whether servent is firewalled */ + g2_build_add_uptime(t); /* UP -- servent uptime */ + g2_build_add_vendor(t); /* V -- vendor code */ + g2_build_add_guid(t); /* GU -- the GUID of this node */ + g2_build_add_node_address(t); /* NA -- the IP:port of this node */ + g2_build_add_tls(t); /* TLS -- whether TLS is supported */ + + mb = g2_build_pmsg(t); + g2_tree_free_null(&t); + + return mb; +} + +/** + * Build a PUSH request. + * + * @param guid the GUID of the remote servent we're trying to reach + * + * @return a /PUSH message, or NULL if the listening address or port + * are invalid. + */ +pmsg_t * +g2_build_push(const guid_t *guid) +{ + g2_tree_t *t, *c; + pmsg_t *mb; + char payload18; + size_t plen; + host_addr_t addr = listen_addr_primary(); + uint16 port = socket_listen_port(); + + if (0 == port || !is_host_addr(addr)) + return NULL; + + host_ip_port_poke(payload, addr, port, &plen); + + t = g2_tree_alloc(G2_NAME(PUSH), payload, plen); + g2_build_add_tls(t); + + /* + * The /?/TO child is a generic GUID-based addressing scheme. + * + * To ensure it is the first child of the packet, we add it last since + * our children are pre-pended to the list of existing ones. + */ + + c = g2_tree_alloc("TO", guid, GUID_RAW_SIZE); + g2_tree_add_child(t, c); + + mb = g2_build_ctrl_pmsg(t); + g2_tree_free_null(&t); + + return mb; +} + +/** + * Build a Query Key Request + * + * @return a /QKR message. + */ +pmsg_t * +g2_build_qkr(void) +{ + g2_tree_t *t; + pmsg_t *mb; + + t = g2_tree_alloc_empty(G2_NAME(QKR)); + g2_build_add_listening_address(t, "RNA"); + + mb = g2_build_ctrl_pmsg(t); + g2_tree_free_null(&t); + + return mb; +} + +/* + * Build a Query. + * + * @param muid the MUID to use for the search message + * @param query the query string + * @param mtype media type filtering (0 if none wanted) + * @param query_key the GUESS query key to use + * @param length length of query key + * + * @return a /Q2 message. + */ +pmsg_t * +g2_build_q2(const guid_t *muid, const char *query, + unsigned mtype, const void *query_key, uint8 length) +{ + g2_tree_t *t, *c; + pmsg_t *mb; + static const char interest = "URL\0PFS\0DN\0A"; + + t = g2_tree_alloc_copy(G2_NAME(Q2), muid, sizeof *muid); + c = g2_build_add_listening_address(t, "UDP"); + g2_tree_append_payload(c, query_key, length); + + c = g2_tree_alloc_copy("DN", query, strlen(query)); + g2_tree_add_child(t, c); + + /* + * Due to an important Shareaza parsing bug in versions <= 2.7.1.0, + * we're including the trailing NUL in the interest string. + * Otherwise, that simply blocks Shareaza in a looong parsing loop. + * Hence the use of "sizeof" below instead of CONST_STRLEN(). + * --RAM, 2014-02-28 + */ + + c = g2_tree_alloc("I", interest, sizeof interest); + g2_tree_add_child(t, c); + + if (mtype != 0) { + /* + * Don't know how we can combine these flags on G2, hence only + * emit for simple flags. + */ + + c = NULL; + + if (SEARCH_AUDIO_TYPE == (mtype & SEARCH_AUDIO_TYPE)) { + static const char audio = "<audio/>"; + c = g2_tree_alloc("MD", audio, CONST_STRLEN(audio)); + } + else if (SEARCH_VIDEO_TYPE == (mtype & SEARCH_VIDEO_TYPE)) { + static const char video = "<video/>"; + c = g2_tree_alloc("MD", video, CONST_STRLEN(video)); + } + else if (SEARCH_IMG_TYPE == (mtype & SEARCH_IMG_TYPE)) { + static const char image = "<image/>"; + c = g2_tree_alloc("MD", image, CONST_STRLEN(image)); + } + else if (SEARCH_DOC_TYPE == (mtype & SEARCH_DOC_TYPE)) { + static const char doc = "<document/>"; + c = g2_tree_alloc("MD", doc, CONST_STRLEN(doc)); + } + else if (mtype & (SEARCH_WIN_TYPE | SEARCH_UNIX_TYPE)) { + static const char archive = "<archive/>"; + c = g2_tree_alloc("MD", archive, CONST_STRLEN(archive)); + } + + if (c != NULL) + g2_tree_add_child(t, c); + } + + if (GNET_PROPERTY(is_firewalled) || GNET_PROPERTY(is_udp_firewalled)) { + /* + * Shareaza uses /Q2/NAT to indicate that the querying node is + * firewalled. Why didn't they choose /Q2/FW for consistency? + */ + + c = g2_tree_alloc_empty("NAT"); + g2_tree_add_child(t, c); + } + + g2_tree_reverse_children(t); + + mb = g2_build_pmsg(t); + g2_tree_free_null(&t); + + return mb; +} + +/** + * Free routine for the extended message blocks we send to the UDP layer. + */ +static void +g2_qh2_pmsg_free(pmsg_t *mb, void *arg) +{ + struct g2_qh2_pmsg_info *pmi = arg; + gnutella_node_t *n; + + g2_qh2_pmsg_info_check(pmi); + g_assert(pmsg_is_extended(mb)); + + if (pmsg_was_sent(mb)) + goto done; + + /* + * Message was unsent, probably because the UDP address in the /Q2 was + * wrong for some reason. + * + * If we're still connected to the hub which passed us this /Q2, then + * we can relay back the /QH2 to the hub and it will hopefully be able + * to deliver it back to the querying node. + */ + + n = node_by_id(pmi->hub_id); + + if (NULL == n) { + if (GNET_PROPERTY(g2_debug) > 1) { + g_debug("%s(): could not send %s, relaying hub is gone, dropping.", + G_STRFUNC, g2_msg_infostr_mb(mb)); + } + gnet_stats_inc_general(GNR_UDP_G2_HITS_UNDELIVERED); + goto done; + } else { + pmsg_t *nmb; + + if (GNET_PROPERTY(g2_debug) > 1) { + g_debug("%s(): could not send %s, giving back to %s for relaying", + G_STRFUNC, g2_msg_infostr_mb(mb), node_infostr(n)); + } + + nmb = pmsg_clone_plain(mb); + pmsg_clear_reliable(nmb); + + g2_node_send(n, nmb); + gnet_stats_inc_general(GNR_UDP_G2_HITS_REROUTED_TO_HUB); + } + +done: + nid_unref(pmi->hub_id); + pmi->magic = 0; + WFREE(pmi); +} + +/** + * Structure used to control the generation of query hits (/QH2 messages) + */ +struct g2_qh2_builder { + char payload1 + GUID_RAW_SIZE; /**< hops + MUID */ + const guid_t *muid; /**< MUID of query, for logging if needed */ + const gnutella_node_t *hub; /**< The hub that gave us the query */ + const gnutella_node_t *n; /**< The node to which results are sent */ + hset_t *hs; /**< Records SHA1 atoms we sent */ + g2_tree_t *t; /**< Current message */ + g2_build_qh2_cb_t cb; /**< (optional) Processing callback */ + void *arg; /**< Processing callback argument */ + size_t max_size; /**< Max query hit size we want */ + size_t common_size; /**< Serialized size with common fields only */ + size_t current_size; /**< Estimated current size */ + int messages; /**< Counts flushed messages, for logging */ + uint flags; /**< Flags for optional entries in hit */ + uint from_gtkg:1; /**< Whether query comes from GTKG */ + uint to_udp:1; /**< Whether results are sent via UDP */ +}; + +/** + * Flush current /QH2. + * + * Depending how the QH2 builder is configured, this either sends the message + * to the target node or invokes a processing callback. + */ +static void +g2_build_qh2_flush(struct g2_qh2_builder *ctx) +{ + pmsg_t *mb; + + g_assert(ctx != NULL); + g_assert(ctx->t != NULL); + g_assert((ctx->n != NULL) ^ (ctx->cb != NULL)); + + /* + * Restore the order of children in the root packet to be the order we + * used when we added the nodes, since we prepend new children. + */ + + g2_tree_reverse_children(ctx->t); + + /* + * If sending over UDP, ask for reliable delivery of the query hit. + * To be able to monitor the fate of the message, we asssociate a free + * routine to it. + */ + + if (ctx->to_udp) { + struct g2_qh2_pmsg_info *pmi; + + WALLOC0(pmi); + pmi->magic = G2_QH2_PMI_MAGIC; + pmi->hub_id = nid_ref(NODE_ID(ctx->hub)); + mb = g2_build_pmsg_extended(ctx->t, g2_qh2_pmsg_free, pmi); + pmsg_mark_reliable(mb); + } else { + mb = g2_build_pmsg(ctx->t); + } + + if (GNET_PROPERTY(g2_debug) > 3) { + g_debug("%s(): flushing the following hit for " + "Q2 #%s to %s%s (%d bytes):", + G_STRFUNC, guid_hex_str(ctx->muid), + NULL == ctx->n ? + stacktrace_function_name(ctx->cb) : node_infostr(ctx->n), + NULL == ctx->n ? "()" : "", pmsg_size(mb)); + g2_tfmt_tree_dump(ctx->t, stderr, G2FMT_O_PAYLOAD | G2FMT_O_PAYLEN); + } + + if (ctx->n != NULL) + g2_node_send(ctx->n, mb); + else + (*ctx->cb)(mb, ctx->arg); + + ctx->messages++; + ctx->current_size = 0; + g2_tree_free_null(&ctx->t); +} + +/** + * Create new /QH2 and fill it with fields that do not depend on the hits + * themselves, i.e. all the common fields we have to send in every /QH2 anyway. + */ +static void +g2_build_qh2_start(struct g2_qh2_builder *ctx) +{ + g_assert(NULL == ctx->t); + + /* + * The payload of the /QH2 message is one byte hop count + the MUID. + */ + + ctx->t = g2_tree_alloc(G2_NAME(QH2), &ctx->payload0, sizeof ctx->payload); + + g2_build_add_node_address(ctx->t); /* NA -- the IP:port of this node */ + g2_build_add_guid(ctx->t); /* GU -- the GUID of this node */ + g2_build_add_vendor(ctx->t); /* V -- vendor code */ + g2_build_add_firewalled(ctx->t); /* FW -- when servent is firewalled */ + g2_build_add_browsable(ctx->t); /* BH -- when browsing is allowed */ + g2_build_add_tls(ctx->t); /* TLS -- whether TLS is supported */ + g2_build_add_uptime(ctx->t); /* UP -- servent uptime */ + g2_build_add_neighbours(ctx->t); /* NH -- neighbouring hubs, if FW */ + g2_build_add_hostname(ctx->t); /* HN -- DNS hostname, if defined */ + + /* + * If the query comes from a GTKG node (not 100% safe, there can be some + * false positive, but we cannot miss any true GTKG query), propagate back + * detailed version information. + */ + + if (ctx->from_gtkg) + g2_build_add_gtkgv(ctx->t); /* gtkgV -- GTKG version info */ + + /* + * Compute size we have so far, once per query hit series. + */ + + if G_UNLIKELY(0 == ctx->common_size) + ctx->common_size = g2_frame_serialize(ctx->t, NULL, 0); + + ctx->current_size = ctx->common_size; +} + +/** + * Add file to the current query hit. + * + * @return TRUE if we kept the file, FALSE if we did not include it in the hit. + */ +static bool +g2_build_qh2_add(struct g2_qh2_builder *ctx, const shared_file_t *sf) +{ + const sha1_t *sha1; + g2_tree_t *h, *c; + + shared_file_check(sf); + + /* + * Make sure the file is still in the library. + */ + + if (0 == shared_file_index(sf)) + return FALSE; + + /* + * On G2, the H/URN child is required, meaning we need the SHA1 at least. + */ + + if (!sha1_hash_available(sf)) + return FALSE; + + /* + * Do not send duplicates, as determined by the SHA1 of the resource. + * + * A user may share several files with different names but the same SHA1, + * and if all of them are hits, we only want to send one instance. + * + * When generating hits for host-browsing, we do not care about duplicates + * and ctx->hs is NULL then. + */ + + sha1 = shared_file_sha1(sf); /* This is an atom */ + + if (ctx->hs != NULL) { + if (hset_contains(ctx->hs, sha1)) + return FALSE; + + hset_insert(ctx->hs, sha1); + } + + /* + * Create the "H" child and attach it to the current tree. + */ + + if (NULL == ctx->t) + g2_build_qh2_start(ctx); + + h = g2_tree_alloc_empty("H"); + g2_tree_add_child(ctx->t, h); + + /* + * URN -- Universal Resource Name + * + * If there is a known TTH, then we can generate a bitprint, otherwise + * we just convey the SHA1. + */ + + { + const tth_t * const tth = shared_file_tth(sf); + char payloadSHA1_RAW_SIZE + TTH_RAW_SIZE + sizeof G2_URN_BITPRINT; + char *p = payload; + + if (NULL == tth) { + p = mempcpy(p, G2_URN_SHA1, sizeof G2_URN_SHA1); + p += clamp_memcpy(p, sizeof payload - ptr_diff(p, payload), + sha1, SHA1_RAW_SIZE); + } else { + p = mempcpy(p, G2_URN_BITPRINT, sizeof G2_URN_BITPRINT); + p += clamp_memcpy(p, sizeof payload - ptr_diff(p, payload), + sha1, SHA1_RAW_SIZE); + p += clamp_memcpy(p, sizeof payload - ptr_diff(p, payload), + tth, TTH_RAW_SIZE); + } + + g_assert(ptr_diff(p, payload) <= sizeof payload); + + c = g2_tree_alloc_copy("URN", payload, ptr_diff(p, payload)); + g2_tree_add_child(h, c); + } + + /* + * URL -- empty to indicate that we share the file via uri-res. + */ + + if (ctx->flags & QHIT_F_G2_URL) { + uint known; + uint16 csc; + + c = g2_tree_alloc_empty("URL"); + g2_tree_add_child(h, c); + + /* + * CSC -- if we know alternate sources, indicate how many in "CSC". + * + * This child is only emitted when they requested "URL". + */ + + known = dmesh_count(sha1); + csc = MIN(known, MAX_INT_VAL(uint16)); + + if (csc != 0) { + char payload2; + + poke_le16(payload, csc); + c = g2_tree_alloc_copy("CSC", payload, sizeof payload); + g2_tree_add_child(h, c); + } + + /* + * PART -- if we only have a partial file, indicate how much we have. + * + * This child is only emitted when they requested "URL". + */ + + if (shared_file_is_partial(sf) && !shared_file_is_finished(sf)) { + filesize_t available = shared_file_available(sf); + char payload8; /* If we have to encode file size as 64-bit */ + uint32 av32; + time_t mtime = shared_file_modification_time(sf); + + c = g2_tree_alloc_empty("PART"); + g2_tree_add_child(h, c); + + av32 = available; + if (av32 == available) { + /* Fits within a 32-bit quantity */ + poke_le32(payload, av32); + g2_tree_set_payload(c, payload, sizeof av32, TRUE); + } else { + /* Encode as a 64-bit quantity then */ + poke_le64(payload, available); + g2_tree_set_payload(c, payload, sizeof payload, TRUE); + } + + /* + * GTKG extension: encode the last modification time of the + * partial file in an "MT" child. This lets the other party + * determine whether the host is still able to actively complete + * the file. + */ + + poke_le32(payload, (uint32) mtime); + g2_tree_add_child(c, + g2_tree_alloc_copy("MT", payload, sizeof(uint32))); + } + + /* + * CT -- creation time of the resource (GTKG extension). + */ + + { + time_t create_time = shared_file_creation_time(sf); + + if ((time_t) -1 != create_time) { + char payload8; + int n; + + create_time = MAX(0, create_time); + n = vlint_encode(create_time, payload); + g2_tree_add_child(h, + g2_tree_alloc_copy("CT", payload, n)); /* No trailing 0s */ + } + } + } + + /* + * DN -- distinguished name. + * + * Note that the presence of DN also governs the presence of SZ if the + * file length does not fit a 32-bit unsigned quantity. + */ + + if (ctx->flags & QHIT_F_G2_DN) { + char payload8; /* If we have to encode file size as 64-bit */ + uint32 fs32; + filesize_t fs = shared_file_size(sf); + const char *name; + const char *rp; + + c = g2_tree_alloc_empty("DN"); + + fs32 = fs; + if (fs32 == fs) { + /* Fits within a 32-bit quantity */ + poke_le32(payload, fs32); + g2_tree_set_payload(c, payload, sizeof fs32, TRUE); + } else { + /* Does not fit a 32-bit quantity, emit a SZ child */ + poke_le64(payload, fs); + g2_tree_add_child(h, + g2_tree_alloc_copy("SZ", payload, sizeof payload)); + } + + name = shared_file_name_nfc(sf); + g2_tree_append_payload(c, name, shared_file_name_nfc_len(sf)); + g2_tree_add_child(h, c); + + /* + * GTKG extension: if there is a file path, expose it as a "P" child + * under the DN node. + */ + + rp = shared_file_relative_path(sf); + if (rp != NULL) { + g2_tree_add_child(c, g2_tree_alloc_copy("P", rp, strlen(rp))); + } + } + + /* + * GTKG extension: if they requested alt-locs in the /Q2/I with "A", then + * send them some known alt-locs in an "ALT" child. + * + * Note that these alt-locs can be for Gnutella hosts: since both Gnutella + * and G2 share a common HTTP-based file transfer mechanism with compatible + * extra headers, there is no need to handle them separately. + */ + + if (ctx->flags & QHIT_F_G2_ALT) { + gnet_host_t hvecG2_BUILD_QH2_MAX_ALT; + int hcnt = 0; + + hcnt = dmesh_fill_alternate(sha1, hvec, N_ITEMS(hvec)); + + if (hcnt > 0) { + int i; + + c = g2_tree_alloc_empty("ALT"); + + for (i = 0; i < hcnt; i++) { + host_addr_t addr; + uint16 port; + + addr = gnet_host_get_addr(&hveci); + port = gnet_host_get_port(&hveci); + + if (host_addr_is_ipv4(addr)) { + char payload6; + + host_ip_port_poke(payload, addr, port, NULL); + g2_tree_append_payload(c, payload, sizeof payload); + } + } + + /* + * If the payload is still empty, then drop the "ALT" child. + * Otherwise, attach it to the "H" node. + */ + + if (NULL == g2_tree_node_payload(c, NULL)) { + g2_tree_free_null(&c); + } else { + g2_tree_add_child(h, c); + } + } + } + + /* + * Update the size of the query hit we're generating. + */ + + ctx->current_size += g2_frame_serialize(h, NULL, 0); + + return TRUE; +} + +/** + * Process the files according to the initialized /QH2 context. + * + * @return the amount of files processed. + */ +static int +g2_build_qh2_process(const pslist_t *files, struct g2_qh2_builder *ctx) +{ + const pslist_t *sl; + int sent = 0; + + PSLIST_FOREACH(files, sl) { + shared_file_t *sf = sl->data; + + if (g2_build_qh2_add(ctx, sf)) + sent++; + + if (ctx->current_size >= ctx->max_size) + g2_build_qh2_flush(ctx); + + shared_file_unref(&sf); + } + + if (ctx->t != NULL) /* Still some unflushed results */ + g2_build_qh2_flush(ctx); /* Send last packet */ + + hset_free_null(&ctx->hs); + + return sent; +} + +/** + * Build and send query hits (/QH2) to specified node. + * + * @param h the hub node which sent us the query + * @param n the node where we should send results to + * @param files the list of shared_file_t entries that make up results + * @param count the amount of results held in the list + * @param muid the query's MUID + * @param flags a set of QHIT_F_G2_* flags + */ +void +g2_build_send_qh2(const gnutella_node_t *h, gnutella_node_t *n, + pslist_t *files, int count, const guid_t *muid, uint flags) +{ + struct g2_qh2_builder ctx; + int sent = 0; + + ZERO(&ctx); + + if (NULL == n) { + shared_file_slist_free_null(&files); + goto done; /* G2 support was disabled whilst processing */ + } + + clamp_memcpy(&ctx.payload1, sizeof ctx.payload - 1, muid, GUID_RAW_SIZE); + ctx.muid = muid; + ctx.hs = hset_create(HASH_KEY_SELF, 0); + ctx.max_size = G2_BUILD_QH2_THRESH; + ctx.flags = flags; + ctx.hub = h; + ctx.n = n; + ctx.to_udp = NODE_IS_UDP(n); + + /* + * Determine whether query comes from GTKG. + * + * Because G2 support was added in 2014-01, we're past 2012-10-07, date + * where all MUID markup in queries has been made compatible with OOB, + * so that our markup does not coincide with OOB markup. In G2, the MUID + * is not supposed to carry OOB delivery information, but since we're using + * the same MUID to query Gnuella and G2, we have to expect OOB-tagged + * MUIDs from GTKG. + */ + + { + uint8 maj, min; + bool rel; + + ctx.from_gtkg = guid_query_muid_is_gtkg(muid, TRUE, &maj, &min, &rel); + } + + sent = g2_build_qh2_process(files, &ctx); + pslist_free(files); + + /* FALL THROUGH */ + +done: + if (GNET_PROPERTY(g2_debug) > 3) { + g_debug("%s(): sent %d/%d hit%s in %d message%s to %s", + G_STRFUNC, sent, count, plural(sent), + ctx.messages, plural(ctx.messages), node_infostr(n)); + } +} + +/** + * Build and post-process /QH2 messages for specified files. + * + * Results are held in the `files' list. They are packed in hits until + * the message reaches the `max_msgsize' limit at which time the packet + * is flushed and given the the `cb' callback for processing (sending, + * queueing, whatever). + * + * The callback is invoked as + * + * cb(mb, udata) + * + * where the serialized /QH2 message is held in `mb'. + * The `udata' parameter is simply user-supplied data, opaque for us. + * + * @param files the list of shared_file_t entries that make up results + * @param count the amount of results to deliver (first `count' files) + * @param max_msgsize the targeted maximum hit size before flushing + * @param cb the processor callback to invoke on each built hit + * @param udata argument to pass to callback + * @param muid the MUID to use on each generated hit + * @param flags a set of QHIT_F_G2_* flags + */ +void +g2_build_qh2_results(const pslist_t *files, int count, size_t max_msgsize, + g2_build_qh2_cb_t cb, void *udata, const struct guid *muid, uint flags) +{ + struct g2_qh2_builder ctx; + int sent; + + ZERO(&ctx); + clamp_memcpy(&ctx.payload1, sizeof ctx.payload - 1, muid, GUID_RAW_SIZE); + ctx.muid = muid; + ctx.max_size = max_msgsize; + ctx.flags = flags; + ctx.cb = cb; + ctx.arg = udata; + ctx.from_gtkg = TRUE; /* Always include the gtkgV child */ + + sent = g2_build_qh2_process(files, &ctx); + + if (GNET_PROPERTY(g2_debug) > 3) { + g_debug("%s(): procesed %d/%d hit%s in %d message%s to %s()", + G_STRFUNC, sent, count, plural(sent), + ctx.messages, plural(ctx.messages), stacktrace_function_name(cb)); + } +} + +/** + * Free up global messages, at shutdown time. + */ +void +g2_build_close(void) +{ + /* Don't take locks, we're shutdowning from a single thread */ + pmsg_free_null(&build_alive_pi); + pmsg_free_null(&build_po); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/g2/build.h
Added
@@ -0,0 +1,74 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * G2 message factory. + * + * @author Raphael Manfredi + * @date 2014 + */ + +#ifndef _core_g2_build_h_ +#define _core_g2_build_h_ + +#include "lib/pmsg.h" + +typedef void (*g2_build_qh2_cb_t)(pmsg_t *mb, void *udata); + +/* + * Public interface. + */ + +struct guid; + +pmsg_t *g2_build_pong(void); +pmsg_t *g2_build_alive_ping(void); +pmsg_t *g2_build_qht_reset(int slots, int inf_val); +pmsg_t *g2_build_qht_patch(int seqno, int seqsize, bool compressed, int bits, + char *buf, int len); +pmsg_t *g2_build_lni(void); +pmsg_t *g2_build_push(const struct guid *guid); +pmsg_t *g2_build_qkr(void); + +struct gnutella_node; +struct pslist; + +pmsg_t *g2_build_q2(const struct guid *muid, const char *query, + unsigned mtype, const void *query_key, uint8 length); + +void g2_build_send_qh2(const struct gnutella_node *h, + struct gnutella_node *n, struct pslist *files, + int count, const struct guid *muid, uint flags); + +void g2_build_qh2_results(const struct pslist *files, int count, + size_t max_msgsize, g2_build_qh2_cb_t cb, void *udata, + const struct guid *muid, uint flags); + +void g2_build_close(void); + +#endif /* _core_g2_build_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/g2/frame.c
Added
@@ -0,0 +1,785 @@ +/* + * Copyright (c) 2012, 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * G2 packet framing. + * + * A G2 packet is represented as a tree, much alike an XML tree, hence the + * "tree" name of its interface. + * + * Relevant documentation extracted from the g2.doxu.org website: + * + * FRAMING + * + * Packets are encoded with a single leading control byte, followed by one + * or more bytes of packet length, followed by one or more bytes of packet + * name/ID, followed by zero or more child packets (framed the same way), + * followed by zero or more bytes of payload: + * + * +---------+--------+---------+-------------------------+ + * | Control | Length | Name | children and/or payload | + * +---------+--------+---------+-------------------------+ + * + * All packets can contain a payload only, children and a payload, children + * only, or nothing at all. The total length of the packet header (control, + * length and type name) cannot exceed 12 bytes and cannot be less than + * 2 bytes. + * + * The Control Byte + * + * The control byte is always non-zero. A zero control byte identifies the + * end of a stream of packets, and thus has special meaning. It should not + * be used in root packet streams (which do not end). Control bytes have + * the following format: + * + * +----+----+----+----+----+----+----+----+ + * | 7 6 | 5 4 3 | 2 | 1 | 0 | Bit + * +----+----+----+----+----+----+----+----+ + * | Len_Len | Name_Len - 1 | CF | BE | // | + * +----+----+----+----+----+----+----+----+ + * + * - Len_Len is the number of bytes in the length field of the packet, + * which immediately follows the control byte. There are two bits here + * which means the length field can be up to 3 bytes long. Len_Len? can + * be zero if the packet has zero length (no children and no payload), + * in which case there is no need to encode the length. + * + * - Name_Len is the number of bytes in the packet name field MINUS ONE, + * which follows the packet length field. There are three bits here which + * means that packet names can be 1 to 8 bytes long inclusive. Because a + * 0 here equates to one byte of name, unnamed packets are not possible. + * + * The three least significant bits of the control byte are reserved for + * flags. They have the following meanings: + * + * - CF is the compound packet flag. If this bit is set, the packet + * contains one or more child packets. If not set, the packet does + * not contain any child packets. If the packet is of zero length, + * this flag is ignored. + * + * - BE is the big-endian packet flag. If set, all multi-byte values + * encoded in the packet and its children are encoded in big-endian + * byte order - including the length in the packet header. + * + * Other bits are reserved. + * + * The Length Field + * + * The length field immediately follows the control byte, and can be 0 to + * 3 bytes long. Length bytes are stored in the byte order of the packet. + * + * The length value includes the payload of this packet AND any child + * packets in their entirety. This is obviously needed so that the entire + * packet can be detected and acquired from a stream. The length does not + * include the header (control byte, length, and name). The length field + * precedes the name field to allow it to be read faster from a stream when + * acquiring packets. + * + * The length field is in the byte order of the root packet. + * + * The Type Name Field + * + * The type name field immediately follows the length bytes, and can be + * from 1 to 8 bytes long. Its format is detailed in the previous section + * entitled "Namespace Considerations". + * + * Child Packets + * + * Child packets are only present if the "compound packet bit" is set in + * the control byte. If set, there is one or more child packet immediately + * following the end of the header. These child packets are included in the + * total length of their parent (along with the payload, which follows the + * child packets after a packet stream terminator). + * + * Child packets are framed exactly the same way, with a control byte, + * length, name, children and/or payload. When the compound bit is set + * and the packet is not of zero length, the first child packet must + * exist. Subsequent child packets may also exist, and are read in + * sequentially in the same way that they are read from a root packet + * stream. The end of the child packet stream is signalled by the presence + * of a zero control byte, OR the end of the parent packet's length (in + * which case there is no payload). Including a terminating zero control + * byte when there is no payload is still valid, but unnecessary. + * + * Payload + * + * Payload may exist whenever the length field is non-zero. However, if + * the compound bit is set, one or more child packets must be read before + * the payload is reached. If there is no packet left after the end of the + * last child, there is no payload. + * + * Notes on the Control Byte + * + * Note that there are a number of "marker packet types", which have no + * children or payload. It is desirable to encode these in as small a + * space as possible, which means omitting the length field and setting + * the len_len bits to zero in the control byte. This creates a potential + * conflict, as the control byte itself may be zero if the type name is one + * byte long - and as noted above, a zero control byte has special meaning + * (end of packet stream). This must be avoided; luckily it is perfectly + * legal to set the compound packet flag (CF) on zero length packets, thus + * producing a non-zero control byte and the most compact packet possible. + * + * The compound packet bit MUST be checked when decoding every packet. It + * should be done in low-level decoding code to avoid accidental omission. + * Do not assume that a packet will not have children - it might not now, + * but no packets are sterile. Anything could be augmented or extended in + * some unknown way in the future. If you are not interested in children, + * skip them (which is easy, you don't even need to recurse through their + * children). + * + * IMPORTANT NOTE + * + * As discussed with the main implementors of the G2 protocol (Shareaza, Quazaa) + * the BE field MUST be cleared, i.e. we're only accepting little-endian field + * encoding in packets. Packets with big-endian encoding are simply rejected + * as being invalid. + * + * @author Raphael Manfredi + * @date 2012, 2014 + */ + +#include "common.h" + +#include "frame.h" +#include "tree.h" + +#include "lib/endian.h" +#include "lib/halloc.h" +#include "lib/unsigned.h" + +#include "lib/override.h" /* Must be the last header included */ + +#define G2_BYTELEN(ctrl) (((ctrl) & 0xc0) >> 6) +#define G2_NAMELEN(ctrl) ((((ctrl) & 0x38) >> 3) + 1) + +/** + * Deserialization context. + */ +struct frame_dctx { + const void *p; /* Reading pointer */ + const void *end; /* End of reading buffer */ + unsigned copy:1; /* Whether to copy payload data */ +}; + +/** + * Read a single byte from the deserialization buffer. + * + * @param dctx the deserialization context + * @param value where the read byte is stored + * + * @return TRUE if OK. + */ +static bool +g2_frame_read_byte(struct frame_dctx *dctx, uint8 *value) +{ + if G_UNLIKELY(dctx->end == dctx->p) + return FALSE; + + *value = *(uint8 *) dctx->p; + dctx->p = const_ptr_add_offset(dctx->p, 1); + return TRUE; +} + +/** + * Decode length from the deserialization buffer, using the specified + * amount of bytes. + * + * Length is expected to be in little-endian format. + * + * @param dctx the deserialization context + * @param bytes how many bytes should we read to get the length (3 max) + * @param length where the read length is stored + * + * @return TRUE if OK. + */ +static bool +g2_frame_read_length(struct frame_dctx *dctx, size_t bytes, size_t *length) +{ + const void *end; + size_t len, shift; + const uint8 *p; + + g_assert(size_is_positive(bytes)); + g_assert(bytes <= 3); + + end = const_ptr_add_offset(dctx->p, bytes); + + if G_UNLIKELY(ptr_cmp(dctx->end, end) < 0) + return FALSE; + + len = 0; + shift = 0; + p = dctx->p; + + while (bytes--) { + len += (uint) *p++ << shift; + shift += 8; + } + + dctx->p = end; + *length = len; + return TRUE; +} + +/** + * Read specified amount of bytes into destination buffer. + * + * @param dctx the deserialization context + * @param dst the detination buffer (must be large enough) + * @param len how many bytes to read + * + * @return TRUE if OK. + */ +static bool +g2_frame_read_data(struct frame_dctx *dctx, void *dst, size_t len) +{ + const void *end; + + end = const_ptr_add_offset(dctx->p, len); + + g_assert(dst != NULL); + g_assert(size_is_positive(len)); + + if G_UNLIKELY(ptr_cmp(dctx->end, end) < 0) + return FALSE; + + memcpy(dst, dctx->p, len); + dctx->p = end; + return TRUE; +} + +/** + * Recursively deserialize the G2 packet. + * + * @return NULL if an error occurred, the deserialized tree otherwise. + */ +static g2_tree_t * +g2_frame_recursive_deserialize(struct frame_dctx *dctx) +{ + uint8 control; + char nameG2_FRAME_NAME_LEN_MAX + 1; + size_t length, bytelen, namelen, remain, paylen; + g2_tree_t *node; + const void *start; + + /* + * Decode the header: control byte, length, name. + */ + + if (!g2_frame_read_byte(dctx, &control)) + return NULL; + + if (control & G2_FRAME_BE) + return NULL; /* Only handle little-endian packets */ + + if (0 == control) + return NULL; /* End of stream */ + + bytelen = G2_BYTELEN(control); + namelen = G2_NAMELEN(control); + + if (0 != bytelen) { + if (!g2_frame_read_length(dctx, bytelen, &length)) + return NULL; + } else { + length = 0; + } + + if (!g2_frame_read_data(dctx, name, namelen)) + return NULL; + + namenamelen = '\0'; + start = dctx->p; /* First byte after header */ + + /* + * Make sure the whole packet fits into what we were given to deserialize. + */ + + remain = ptr_diff(dctx->end, dctx->p); + if (remain < length) + return NULL; + + /* + * OK, create the node. We don't know whether there will be a payload yet. + */ + + node = g2_tree_alloc_empty(name); + + /* + * If it is a compound packet, deserialize its children. + */ + + if (length != 0 && (control & G2_FRAME_CF)) { + struct frame_dctx childctx; + size_t children = 0; + + childctx.p = dctx->p; + childctx.end = const_ptr_add_offset(dctx->p, length); + childctx.copy = dctx->copy; + + while (ptr_cmp(childctx.p, childctx.end) < 0) { + const uint8 *cptr = childctx.p; /* Control byte location */ + g2_tree_t *child; + + if (0 == *cptr) { /* End of child straem */ + childctx.p++; + break; + } + + children++; + + child = g2_frame_recursive_deserialize(&childctx); + if (NULL == child) + goto failure; + + g2_tree_add_child(node, child); + } + + if (0 == children) + goto failure; + + dctx->p = childctx.p; + + /* + * To restore the order of children in the tree, reverse the + * children list since g2_tree_add_child() prepends to the list. + */ + + g2_tree_reverse_children(node); + } + + /* + * Read the payload, if any. + */ + + paylen = length - ptr_diff(dctx->p, start); + + if (!size_is_non_negative(paylen)) + goto failure; /* Length was bad, we got garbage */ + + g_assert(ptr_cmp(const_ptr_add_offset(dctx->p, paylen), dctx->end) <= 0); + + if (0 != paylen) { + g2_tree_set_payload(node, dctx->p, paylen, dctx->copy); + dctx->p = const_ptr_add_offset(dctx->p, paylen); + } + + g_assert(ptr_cmp(dctx->p, dctx->end) <= 0); + + return node; + +failure: + g2_tree_free_null(&node); + return NULL; +} + +/** + * Probe the leading of the supplied buffer to know how long the G2 packet + * is in the serialized form. + * + * This can be used to determine whether we got the whole packet: if the + * returned value is not the amount given in "len", then the message is + * invalid / truncated. + * + * @param buf start of buffer where packet lies + * @param len amount of data held in the buffer + * + * @return the total expected length of the message (including header), 0 if + * the message header cannot be parsed correctly. + */ +size_t +g2_frame_whole_length(const void *buf, size_t len) +{ + struct frame_dctx dctx; + uint8 control; + size_t length, bytelen, namelen; + + g_assert(buf != NULL); + g_assert(size_is_positive(len)); + + dctx.p = buf; + dctx.end = const_ptr_add_offset(buf, len); + dctx.copy = FALSE; + + /* + * Decode the header: control byte, length, name. + */ + + if (!g2_frame_read_byte(&dctx, &control)) + return 0; + + if (control & G2_FRAME_BE) + return 0; /* Only handle little-endian packets */ + + if (0 == control) + return 1; /* End of stream */ + + bytelen = G2_BYTELEN(control); + namelen = G2_NAMELEN(control); + + if (0 != bytelen) { + if (!g2_frame_read_length(&dctx, bytelen, &length)) + return 0; + } else { + length = 0; + } + + return 1 + bytelen + namelen + length; /* Total expected size */ +} + +/** + * Get the name of the root packet. + * + * @param buf start of buffer where packet lies + * @param len amount of data held in the buffer + * @param nlen if non-NULL, where length of name is returned + * + * @return the start of the name in the packet (non-NUL terminated string, + * so use namelen), or NULL if the packet is too short to hold the whole + * name. + */ +const char * +g2_frame_name(const void *buf, size_t len, size_t *nlen) +{ + struct frame_dctx dctx; + uint8 control; + size_t bytelen, namelen; + const char *name; + const void *end; + + g_assert(buf != NULL); + g_assert(size_is_positive(len)); + + dctx.p = buf; + dctx.end = const_ptr_add_offset(buf, len); + dctx.copy = FALSE; + + /* + * Decode the header: control byte, length, name. + */ + + if (!g2_frame_read_byte(&dctx, &control)) + return NULL; + + if (0 == control) + return NULL; /* End of stream */ + + bytelen = G2_BYTELEN(control); + namelen = G2_NAMELEN(control); + + /* + * Name is right after the control byte plus the length. + */ + + name = const_ptr_add_offset(buf, bytelen + 1); + end = const_ptr_add_offset(name, namelen); + + if (ptr_diff(end, buf) > len) + return NULL; /* Packet is too short to hold name */ + + if (nlen != NULL) + *nlen = namelen; + + return name; +} + +/** + * Deserialize the first G2 packet held in the supplied buffer. + * + * Payload data is NOT copied but points directly into the input buffer. + * + * @param buf start of buffer where packet lies + * @param len amount of data held in the buffer + * @param packet_len if non-NULL, set with the amount of data consumed + * @param copy if TRUE, payload is copied, otherwise it refers input + * + * @return a newly created G2 tree if data was valid, NULL if packet + * was malformed or incompletely held in the buffer. + */ +g2_tree_t * +g2_frame_deserialize(const void *buf, size_t len, size_t *packet_len, bool copy) +{ + struct frame_dctx dctx; + g2_tree_t *t; + + g_assert(buf != NULL); + g_assert(size_is_positive(len)); + + dctx.p = buf; + dctx.end = const_ptr_add_offset(buf, len); + dctx.copy = booleanize(copy); + + t = g2_frame_recursive_deserialize(&dctx); + + if (packet_len != NULL) + *packet_len = ptr_diff(dctx.p, buf); + + return t; +} + +/** + * Serialization context. + */ +struct frame_sctx { + void *p; /* Pointer to next byte we can write to */ + const void *end; /* End of buffer (first invalid byte) */ + size_t len; /* Amount serialized so far */ + unsigned full:1; /* When set, buffer was too small */ +}; + +/** + * Write a single byte into the serialization buffer, if there is room for it. + * + * @param sctx the serialization context + * @param value the byte to write + */ +static void +g2_frame_write_byte(struct frame_sctx *sctx, uint8 value) +{ + sctx->len++; /* Regardless of whether byte is written */ + + if G_UNLIKELY(sctx->full) + return; + + if G_UNLIKELY(sctx->end == sctx->p) { + sctx->full = TRUE; + return; + } + + *(uint8 *) sctx->p = value; + sctx->p = ptr_add_offset(sctx->p, 1); +} + +/** + * Copy data into serialization buffer, if there is room for it. + * + * @param sctx the serialization context + * @param src the start of the buffer to copy from + * @param len the amount of bytes to copy from buffer + */ +static void +g2_frame_write_data(struct frame_sctx *sctx, const void *src, size_t len) +{ + void *end; + + g_assert(src != NULL); + g_assert(size_is_non_negative(len)); + + sctx->len += len; /* Regardless of whether there is room for it */ + + if G_UNLIKELY(sctx->full) + return; + + end = ptr_add_offset(sctx->p, len); + + if G_UNLIKELY(ptr_cmp(sctx->end, end) < 0) { + sctx->full = TRUE; + return; + } + + memcpy(sctx->p, src, len); + sctx->p = end; +} + +/** + * Recursively serialize the tree. + * + * @param sctx the serialization context + * @param root the G2 tree to serialize + */ +static void +g2_frame_recursive_serialize(struct frame_sctx *sctx, const g2_tree_t *root) +{ + size_t orig_len = sctx->len; + void *start = sctx->p; + const void *payload; + size_t paylen, namelen; + const g2_tree_t *child; + const char *name; + uint8 control; + bool is_empty, has_children; + + payload = g2_tree_node_payload(root, &paylen); + child = g2_tree_first_child(root); + name = g2_tree_name(root); + namelen = strlen(name); + + g_assert(size_is_non_negative(namelen)); + g_assert(namelen != 0); + g_assert_log(namelen <= G2_FRAME_NAME_LEN_MAX, + "%s(): node name too long (%zu bytes): \"%.*s\"%s", + G_STRFUNC, namelen, (int) MIN(namelen, 20), name, + namelen > 20 ? " (truncated)" : ""); + + control = (namelen - 1) << 3; + control |= (child != NULL) ? G2_FRAME_CF : 0; + + /* + * If packet has no payload and no children, we don't have to emit any + * length but we must set the CF flag in the leading control byte if that + * would end-up being zero. + * + * Otherwise, assume 1 byte will be enough to store the packet length. + * If not, we'll go back to the header, fix the control byte and move the + * following data around so we can store the actual length. + */ + + is_empty = NULL == child && 0 == paylen; + + if (0 == paylen && 0 == control) { + control |= G2_FRAME_CF; + } else if (!is_empty) { + control |= (1 << 6); /* Reserve 1 byte for length */ + } + + /* + * Emit header: the control byte, the length (if not empty), and the name. + */ + + g2_frame_write_byte(sctx, control); + if (!is_empty) + g2_frame_write_byte(sctx, 0); /* The length, fixed up later */ + g2_frame_write_data(sctx, name, namelen); + + /* + * Now recurse to emit all the chidren, if any. + */ + + has_children = child != NULL; + + while (child != NULL) { + g2_frame_recursive_serialize(sctx, child); + child = g2_tree_next_sibling(child); + } + + if (has_children && paylen != 0) + g2_frame_write_byte(sctx, 0); /* End of child stream */ + + /* + * Emit the payload, if any. + */ + + if (paylen != 0) + g2_frame_write_data(sctx, payload, paylen); + + /* + * Now fixup the packet length, if necessary. + * + * Most of the time the length will fit in one byte, and we reserved + * one byte above, so we just need to go back and write the length + * in the byte following the control byte. + * + * If it does not fit, we have to compute how many bytes are necessary, + * then fix the control byte accordingly and then move the data around + * so that we have room to write the correct length. + */ + + if (!is_empty) { + size_t length = sctx->len - orig_len; + uint8 *lptr = ptr_add_offset(start, 1); /* Follows control byte */ + + length -= 2; /* 2 = control + length byte we reserved */ + length -= namelen; /* Length does not include the header */ + + g_assert(sctx->full || ptr_cmp(lptr, sctx->end) < 0); + g_assert(size_is_positive(length)); /* Since it's not empty */ + g_assert(length < 256 * 256 * 256); /* 3 bytes max for length */ + + if G_LIKELY(length < 256) { + if (!sctx->full) + *lptr = length; /* Length fits in reserved byte */ + } else { + uint8 bytlen = (length < 65536) ? 2 : 3; + char lbuf4; + void *end; + + poke_le32(lbuf, length); /* Encode length */ + + /* + * Check that we can extend the serialized content by the required + * amount of bytes to store the length. Recall that we already + * reserved one byte for it, so we need only "bytlen - 1" extra + * bytes in the serialization buffer, and the name of the packet + * was written 2 bytes after the start (control byte, length byte). + */ + + end = ptr_add_offset(sctx->p, bytlen - 1); + sctx->len += bytlen - 1; + + if (ptr_cmp(end, sctx->end) > 0) { + sctx->full = TRUE; + sctx->p = end; + } else { + void *namestart = ptr_add_offset(start, 2); + size_t amount = ptr_diff(sctx->p, namestart); + void *newname = ptr_add_offset(namestart, bytlen - 1); + uint8 *cptr = start; + + memmove(newname, namestart, amount); /* Make room */ + memcpy(lptr, lbuf, bytlen); /* Actual length */ + *cptr = (*cptr & 0x3f) | (bytlen << 6); /* Fix control byte */ + sctx->p = end; + } + } + } +} + +/** + * Serialize a G2 packet into the supplied buffer. + * + * @param root the G2 tree to serialize + * @param dest destination buffer + * @param len length of destination buffer, in bytes + * + * @return the amount of bytes occupied by the serialized buffer. + * + * @attention + * The length returned is the total space required to serialize the message. + * If it is larger than the supplied buffer, then the data were incompletely + * serialized. Pre-computing the necessary length can be achieved by passing + * a NULL destination buffer with a length of zero. + */ +size_t +g2_frame_serialize(const g2_tree_t *root, void *dest, size_t len) +{ + struct frame_sctx sctx; + + g_assert(g2_tree_is_valid(root)); + g_assert(NULL != dest || 0 == len); + g_assert(size_is_non_negative(len)); + + sctx.p = dest; + sctx.end = ptr_add_offset(dest, len); + sctx.len = 0; + sctx.full = booleanize(0 == len); + + g2_frame_recursive_serialize(&sctx, root); + + return sctx.len; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/g2/frame.h
Added
@@ -0,0 +1,54 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * G2 packet framing. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _core_g2_frame_h_ +#define _core_g2_frame_h_ + +#define G2_FRAME_NAME_LEN_MAX 8 /**< Maximum length of a packet */ +#define G2_FRAME_CF (1U << 2) /**< The CF flag */ +#define G2_FRAME_BE (1U << 1) /**< The BE flag */ + +/* + * Public interface. + */ + +struct g2_tree; + +size_t g2_frame_serialize(const struct g2_tree *root, void *dest, size_t len); +struct g2_tree *g2_frame_deserialize(const void *buf, + size_t len, size_t *packet_len, bool copy); +size_t g2_frame_whole_length(const void *buf, size_t len); +const char *g2_frame_name(const void *buf, size_t len, size_t *namelen); + +#endif /* _core_g2_frame_h_ */ +
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/g2/gwc.c
Added
@@ -0,0 +1,928 @@ +/* + * Copyright (c) 2001-2003, 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * Gnutella Web Cache (version 2). + * + * This is used only for bootstrapping purposes on the G2 network. + * + * @author Raphael Manfredi + * @date 2001-2003, 2014 + */ + +#include "common.h" + +#include "gtk-gnutella.h" + +#include "gwc.h" + +#include "core/http.h" +#include "core/hosts.h" +#include "core/hcache.h" +#include "core/settings.h" +#include "core/sockets.h" /* For socket_listen_addr() */ + +#include "lib/ascii.h" +#include "lib/atoms.h" +#include "lib/file.h" +#include "lib/getline.h" +#include "lib/halloc.h" +#include "lib/header.h" /* For header_dump() */ +#include "lib/hset.h" +#include "lib/log.h" /* For log_printable() */ +#include "lib/misc.h" +#include "lib/random.h" +#include "lib/str.h" +#include "lib/stringify.h" +#include "lib/tm.h" +#include "lib/url.h" +#include "lib/walloc.h" + +#include "if/gnet_property_priv.h" +#include "if/core/nodes.h" +#include "if/bridge/c2ui.h" + +#include "lib/override.h" /* Must be the last header included */ + +/* + * The web cache URLs are stored in a fixed-sized array: we remember only + * a handful of URLs, and choose each time a random web cache among the + * set for interaction. + * + * The array `gwc_url' is filled in a round-robin fashion, the last filled + * position being `gwc_url_slot'. + * + * The `gwc_known_url' is actually a search table indexed by an URL to + * prevent insertion of duplicates in our cache. + */ + +#define MAX_GWC_URLS 200 /**< Max URLs we store */ +#define MAX_GWC_REUSE 1 /**< Max amount of uses for one URL */ + +struct gwc { + const char *url; /**< atom */ + time_t stamp; /**< time of last access */ +} gwc_urlMAX_GWC_URLS; /**< Holds string atoms */ + +static int gwc_url_slot = -1; +static hset_t *gwc_known_url; +static hset_t *gwc_failed_url; + +static const char *gwc_current_url = NULL; /**< Cache we're currently using */ +static int gwc_current_reused = 0; /**< Amount of times we reused it */ + +#define MAX_IP_LINES 150 /**< Max lines on a host req */ +#define MIN_IP_LINES 5 /**< Min lines expected */ +#define REUSE_PERIOD 3600 /**< Period between GET hostfile */ + +/** + * Client name sent in GWC requests -- vendor code and version are concatenated. + */ +#define CLIENT_INFO "client=" GTA_VENDOR_CODE GTA_VERSION_NUMBER + +static const char gwc_file = "gwcache"; +static const char gwc_what = "web cache URLs"; + +static bool gwc_file_dirty; + +/** + * The following URLs are there for bootstrapping purposes only. + */ + +static const char * const boot_url = { + "http://cache.trillinux.org/g2/bazooka.php", + "http://cache.ce3c.be/", +}; + +/** + * Add new URL to cache, possibly pushing off an older one if cache is full. + * + * @return TRUE if the URL was added, FALSE otherwise. + */ +static bool +gwc_add(const char *new_url) +{ + const char *url_atom; + const char *old_url; + char *url, *ret; + + url = h_strdup(new_url); /* url_normalize() can modify the URL */ + + ret = url_normalize(url, URL_POLICY_GWC_RULES); + if (!ret) { + g_warning("%s(): ignoring bad web cache URL \"%s\"", + G_STRFUNC, new_url); + HFREE_NULL(url); + return FALSE; + } + if (ret != url) { + HFREE_NULL(url); + url = ret; + } + + /* + * Don't add duplicates to the cache. + */ + + if ( + hset_contains(gwc_known_url, url) || + hset_contains(gwc_failed_url, url) + ) { + HFREE_NULL(url); + return FALSE; + } + + /* + * OK, record new entry at the `gwc_url_slot'. + */ + + if (++gwc_url_slot >= MAX_GWC_URLS) + gwc_url_slot = 0; + + g_assert(url != NULL); + url_atom = atom_str_get(url); + HFREE_NULL(url); + + /* + * Expire any entry present at the slot we're about to write into. + */ + + old_url = gwc_urlgwc_url_slot.url; + + if (old_url != NULL) { + g_assert(hset_contains(gwc_known_url, old_url)); + hset_remove(gwc_known_url, old_url); + atom_str_free_null(&old_url); + gwc_urlgwc_url_slot.url = NULL; + } + + hset_insert(gwc_known_url, url_atom); + + gwc_urlgwc_url_slot.url = url_atom; + gwc_urlgwc_url_slot.stamp = 0; + gwc_file_dirty = TRUE; + + if (GNET_PROPERTY(bootstrap_debug)) { + g_debug("%s(): loaded GWC URL %s", G_STRFUNC, url_atom); + } + + return TRUE; +} + +/** + * Pickup a cache randomly from the known set. If there's no URL used that + * has not been used recently, NULL will be returned. The timestamp for + * the picked URL is updated automatically. + * + * Try to avoid using default bootstrapping URLs if we have more than the + * minimum set of caches in stock... + * + * @return a GWebCache URL or NULL on failure. + */ +static const char * +gwc_pick(void) +{ + int count = hset_count(gwc_known_url); + int idx, i; + const char *url = NULL; + time_t now = tm_time(); + + if (0 == count) + return NULL; + + g_assert(count > 0); + g_assert(count <= MAX_GWC_URLS); + g_assert(count == MAX_GWC_URLS || gwc_url_slot < count); + + idx = random_value(count - 1); + for (i = 0; i < count; i++) { + time_t stamp = gwc_urlidx.stamp; + + if (0 == stamp || delta_time(now, stamp) > 3900) { + url = gwc_urlidx.url; + gwc_urlidx.stamp = now; + break; + } + } + + if (GNET_PROPERTY(bootstrap_debug) && url) + g_message("GWC picked webcache \"%s\"", url); + + return url; +} + +/** + * Store known GWC URLs. + * They are normally saved in ~/.gtk-gnutella/gwcache. + */ +static void +gwc_store(void) +{ + FILE *out; + int i; + int j; + file_path_t fp; + + file_path_set(&fp, settings_config_dir(), gwc_file); + out = file_config_open_write(gwc_what, &fp); + if (!out) + return; + + file_config_preamble(out, "Gnutella web cache URLs"); + + /* + * Start dumping with the next slot we'll supersede, so that the oldest + * entries are at the top: when the cache is full, we'll loop over at + * retrieve time and will start superseding the oldest entries. + */ + + i = gwc_url_slot + 1; + if (i >= MAX_GWC_URLS) + i = 0; + + for (j = 0; j < MAX_GWC_URLS; j++) { + const char *url = gwc_urli.url; + + i = (i + 1) % MAX_GWC_URLS; + if (url == NULL) + continue; + fprintf(out, "%s\n", url); + } + + if (file_config_close(out, &fp)) + gwc_file_dirty = FALSE; +} + +/** + * Store known GWC URLs if dirty. + */ +void +gwc_store_if_dirty(void) +{ + if (gwc_file_dirty) + gwc_store(); +} + +/** + * Retrieve known GWC URLs. + * They are normally saved in ~/.gtk-gnutella/gwcache. + */ +static void +gwc_retrieve(void) +{ + file_path_t fp4, *fpv; + uint len, added; + int line, idx; + FILE *in; + char tmp1024; + + len = settings_file_path_load(fp, gwc_file, SFP_ALL); + + g_assert(len <= N_ITEMS(fp)); + + fpv = &fp0; + +retry: + g_assert(ptr_cmp(fpv, &fpN_ITEMS(fp)) < 0); + + if (&fp0 == fpv) + in = file_config_open_read_chosen(gwc_what, fpv, len, &idx); + else + in = file_config_open_read_norename_chosen(gwc_what, fpv, len, &idx); + + if (NULL == in) + return; + + /* + * Retrieve each line, counting the amount of entries added. + */ + + line = 0; + added = 0; + + while (fgets(tmp, sizeof(tmp), in)) { + line++; + + if (tmp0 == '#') /* Skip comments */ + continue; + + if (tmp0 == '\n') /* Allow empty lines */ + continue; + + (void) strchomp(tmp, 0); + if (gwc_add(tmp)) + added++; + } + + fclose(in); + + /* + * Now check whether we added anything from that file, and if we have not + * and there are more backup files to open, retry with these fallbacks + * instead. + */ + + if (0 == added && UNSIGNED(idx) < len - 1) { + g_warning("%s(): nothing loaded from \"%s/%s\", trying fallbacks", + G_STRFUNC, fpvidx.dir, fpvidx.name); + fpv += idx + 1; + len -= idx + 1; + g_assert(size_is_positive(len)); + goto retry; + } else { + if (GNET_PROPERTY(bootstrap_debug)) { + g_debug("%s(): loaded %u URL%s from \"%s/%s\"", + G_STRFUNC, added, plural(added), fpvidx.dir, fpvidx.name); + } + } +} + +/** + * Initialize web cache. + */ +void +gwc_init(void) +{ + uint i; + + gwc_known_url = hset_create(HASH_KEY_STRING, 0); + gwc_failed_url = hset_create(HASH_KEY_STRING, 0); + + gwc_retrieve(); + if (0 == hset_count(gwc_known_url)) { + for (i = 0; i < N_ITEMS(boot_url) && boot_urli; i++) + gwc_add(boot_urli); + } +} + +/** + * Ensures that we have a valid `gwc_current_url' or pick a new one. + * Also force change a the current URL after too many uses. + * + * @return TRUE if we got a valid URL. + */ +static bool +gwc_check_current_url(void) +{ + if (gwc_current_url == NULL || gwc_current_reused >= MAX_GWC_REUSE) { + /* + * `gwc_current_url' must be an atom since we may replace the value + * in the cache at any time: we could be using a cache even after + * its entry has been superseded. + */ + const char *ptr = gwc_pick(); + + atom_str_free_null(&gwc_current_url); + gwc_current_url = ptr == NULL ? NULL : atom_str_get(ptr); + gwc_current_reused = 0; + } else + gwc_current_reused++; + + return gwc_current_url != NULL; +} + +/** + * Removes the URL from the set of known URL, but do not free its memory + * and keeps it in the set of failed URLs for the session. + */ +static void +gwc_forget_url(const char *url) +{ + struct gwc url_tmpMAX_GWC_URLS; /* Temporary copy */ + int count = hset_count(gwc_known_url); + int i; + int j = 0; + + g_assert(count > 0); + g_assert(count <= MAX_GWC_URLS); + g_assert(count == MAX_GWC_URLS || gwc_url_slot < count); + g_assert(gwc_url_slot >= 0); + STATIC_ASSERT(sizeof(url_tmp) == sizeof(gwc_url)); + + if (GNET_PROPERTY(bootstrap_debug)) + g_warning("forgetting GWC URL \"%s\"", url); + + /* + * It is possible that the URL we're trying to forget was + * already removed from the cache if it was at a slot overridden + * in the round-robin buffer, should we have got new GWC URL since + * it was selected. + */ + + if (hset_contains(gwc_known_url, url)) + hset_remove(gwc_known_url, url); + else { + if (GNET_PROPERTY(bootstrap_debug)) + g_warning("URL was already gone from GWC"); + return; + } + hset_insert(gwc_failed_url, url); + + /* + * Because we have a round-robin buffer, removing something in the + * middle of the buffer is not straightforward. The `gwc_url_slot' + * variable points to the last filled value in the buffer. + * + * We're going to build a copy in url_tmp, filled from 0 to "count - 1", + * and we'll move back that copy into the regular gwc_url cache. + * The reason is that since there will be less entries in the cache + * than the maximum amount, the round-robin buffer must be linearily + * filled from 0 and upwards. + */ + + memset(url_tmp, 0, sizeof(url_tmp)); + + if (count == MAX_GWC_URLS) { /* Buffer was full */ + for (i = gwc_url_slot;;) { + if (gwc_urli.url != url) /* Atoms: we can compare addresses */ + url_tmpj++ = gwc_urli; + i++; + if (i == MAX_GWC_URLS) + i = 0; + if (i == gwc_url_slot) /* Back to where we started */ + break; + } + } else { /* Buffer was partially filled */ + for (i = 0; i <= gwc_url_slot; i++) { + if (gwc_urli.url != url) /* Atoms: we can compare addresses */ + url_tmpj++ = gwc_urli; + } + } + + count--; /* New amount of data in cache */ + gwc_url_slot = j - 1; /* Last position we filled */ + gwc_url_slot = MAX(0, gwc_url_slot); /* If we removed ALL entries */ + g_assert(gwc_url_slot == MAX(0, count - 1)); + memcpy(gwc_url, url_tmp, sizeof(gwc_url)); + g_assert(gwc_url_slot >= 0 && gwc_url_slot < MAX_GWC_URLS); + + gwc_file_dirty = TRUE; +} + +/** + * Dispose of current URL atom, if defined. + * When `discard' is set, we remove the current URL physically from our cache. + */ +static void +gwc_clear_current_url(bool discard) +{ + if (gwc_current_url == NULL) + return; + + if (discard) + gwc_forget_url(gwc_current_url); + + atom_str_free_null(&gwc_current_url); +} + +/** + * Frees the atom used as hash table key + */ +static void +free_failed_url(const void *key, void *unused_udata) +{ + (void) unused_udata; + atom_str_free(key); +} + +/** + * Called when servent shuts down. + */ +void +gwc_close(void) +{ + int i; + + gwc_store(); + hset_free_null(&gwc_known_url); + hset_foreach(gwc_failed_url, free_failed_url, NULL); + hset_free_null(&gwc_failed_url); + + for (i = 0; i < MAX_GWC_URLS; i++) { + const char *url = gwc_urli.url; + if (url == NULL) + continue; + atom_str_free(url); + } + + gwc_clear_current_url(FALSE); +} + +/*** + *** Line-by-line parsing context. + ***/ + +struct gwc_parse_context { + getline_t *getline; /**< Used to hold partially read line */ + void *handle; /**< Request handle */ + int maxlines; /**< Maximum number of lines we want to process */ + int lines; /**< Amount of lines so far */ + int processed; /**< User callback can count retained lines */ +}; + +typedef bool (gwc_parse_dispatch_t) + (struct gwc_parse_context *c, const char *buf, size_t len); +typedef void (gwc_parse_eof_t)(struct gwc_parse_context *c); + +/** + * Free parsing context. + */ +static void +gwc_parse_context_free(void *obj) +{ + struct gwc_parse_context *ctx = obj; + + getline_free(ctx->getline); + wfree(ctx, sizeof(*ctx)); +} + +/** + * Allocate new parsing context for handle and record it. + * + * @param `handle' the asynchronous HTTP request handle. + * @param `maxlines' the max number of lines we want to parse. + */ +static void +gwc_parse_context_set(void *handle, int maxlines) +{ + struct gwc_parse_context *ctx; + + ctx = walloc(sizeof(*ctx)); + ctx->getline = getline_make(MAX_LINE_SIZE); + ctx->maxlines = maxlines; + ctx->handle = handle; + ctx->lines = 0; + ctx->processed = 0; + + http_async_set_opaque(handle, ctx, gwc_parse_context_free); +} + + +/** + * Analyze the data we have received, and give each line to the supplied + * dispatcher callback `cb', after having chomped it. On EOF, call `eof' + * to finalize parsing. + */ +static void +gwc_parse_dispatch_lines(void *handle, const char *buf, size_t len, + gwc_parse_dispatch_t cb, gwc_parse_eof_t eof_cb) +{ + struct gwc_parse_context *ctx; + const char *p = buf; + size_t remain = len; + + /* + * Retrieve parsing context, stored as an opaque attribute in the + * asynchronous HTTP request handle. + */ + + ctx = http_async_get_opaque(handle); + + g_assert(ctx->handle == handle); /* Make sure it's the right context */ + + if (len == 0) { /* Nothing to parse, got EOF */ + if (eof_cb != NULL) + (*eof_cb)(ctx); + return; + } + + /* + * Read a line at a time. + */ + + for (;;) { + char *line; + bool error; + size_t line_len; + size_t parsed; + + switch (getline_read(ctx->getline, p, remain, &parsed)) { + case READ_OVERFLOW: + http_async_cancel(handle); + return; + case READ_DONE: + p += parsed; + remain -= parsed; + break; + case READ_MORE: /* ok, but needs more data */ + g_assert(parsed == remain); + return; + } + + /* + * We come here everytime we get a full line. + */ + + line = h_strdup(getline_str(ctx->getline)); + line_len = getline_length(ctx->getline); + line_len = strchomp(line, line_len); + + error = !(*cb)(ctx, line, line_len); /* An ERROR was reported */ + HFREE_NULL(line); + + if (error) { + gwc_clear_current_url(FALSE); + return; + } + + /* + * Make sure we don't process lines ad infinitum. + */ + + ctx->lines++; + if (ctx->lines >= ctx->maxlines) { + const char *req; + const char *url = http_async_info(handle, &req, NULL, NULL, NULL); + g_warning("GWC got %d+ lines from \"%s %s\", stopping", + ctx->lines, req, url); + http_async_close(handle); + return; + } + + getline_reset(ctx->getline); + } +} + +/*** + *** GET ...?get=1 + ***/ + +static bool gwc_get_running = FALSE; + +/** + * Check whether we're waiting for a host request. + */ +bool +gwc_is_waiting(void) +{ + return gwc_get_running; +} + +/** + * Called from gwc_parse_dispatch_lines() for each complete line of output. + * + * @return FALSE to stop processing of any remaining data. + */ +static bool +gwc_host_line(struct gwc_parse_context *ctx, const char *buf, size_t len) +{ + int c; + + if (GNET_PROPERTY(bootstrap_debug) > 3) + g_message("BOOT GWC host line (%lu bytes): %s", (ulong) len, buf); + + if (is_strprefix(buf, "ERROR")) { + g_warning("GWC cache \"%s\" returned %s", + http_async_url(ctx->handle), buf); + http_async_cancel(ctx->handle); + return FALSE; + } + + if (len <= 2) + return TRUE; /* Skip this line silently */ + + /* + * A line starting with "H|" is a host, with "U|" a GWC URL. + * Letters are case-insensitive. + */ + + if (buf1 != '|') + goto malformed; + + c = ascii_toupper(buf0); + + if ('H' == c) { + host_addr_t addr; + uint16 port; + + if (string_to_host_addr_port(&buf2, NULL, &addr, &port)) { + ctx->processed++; + hcache_add_caught(HOST_G2HUB, addr, port, "GWC"); + if (GNET_PROPERTY(bootstrap_debug) > 1) { + g_message("BOOT (G2) collected %s from GWC %s", + host_addr_port_to_string(addr, port), + http_async_url(ctx->handle)); + } + } + return TRUE; + } else if ('U' == c) { + char *end = strchr(&buf2, '|'); + char *url; + + if (NULL == end) + goto malformed; + + ctx->processed++; + url = h_strndup(&buf2, ptr_diff(end, &buf2)); + gwc_add(url); + hfree(url); + return TRUE; + } else if ('I' == c) { + return TRUE; /* Ignore information line */ + } + + /* + * If we come here, we did not recognize the line properly. + */ + + if (GNET_PROPERTY(bootstrap_debug) > 2) { + g_warning("GWC ignoring unknown line \"%s\" from %s", + buf, http_async_url(ctx->handle)); + } + + return TRUE; + +malformed: + if (GNET_PROPERTY(bootstrap_debug)) { + g_warning("GWC ignoring malformed line \"%s\" from %s", + buf, http_async_url(ctx->handle)); + } + + return TRUE; +} + +/** + * Called from gwc_parse_dispatch_lines() on EOF. + */ +static void +gwc_host_eof(struct gwc_parse_context *ctx) +{ + const char *msg; + + if (GNET_PROPERTY(bootstrap_debug) > 2) + g_message("GWC host all done (%d/%d lines processed)", + ctx->processed, ctx->lines); + + /* + * Provide GUI feedback. + */ + + msg = str_smsg( + NG_("Got %d host from %s", "Got %d hosts from %s", ctx->processed), + ctx->processed, gwc_current_url); + + gcu_statusbar_message(msg); + + if (GNET_PROPERTY(bootstrap_debug)) + g_message("BOOT got %d host%s from GWC %s", + ctx->processed, plural(ctx->processed), gwc_current_url); + + /* + * If we did not get enough addresses, try to feed the cache with ours. + */ + + if (ctx->processed < MIN_IP_LINES) { + gwc_clear_current_url(FALSE); /* Move to another cache */ + } + + gwc_get_running = FALSE; +} + +/** + * Populate callback: more data available. + */ +static void +gwc_host_data_ind(http_async_t *ha, char *data, int len) +{ + gwc_parse_dispatch_lines(ha, data, len, gwc_host_line, gwc_host_eof); +} + +/** + * HTTP request is being stopped. + */ +static void +gwc_host_error_ind(http_async_t *ha, http_errtype_t type, void *v) +{ + http_async_log_error_dbg(ha, + type, v, "GWC", GNET_PROPERTY(bootstrap_debug)); + + gwc_get_running = FALSE; + gwc_clear_current_url(TRUE); /* This webcache is not good */ +} + +/** + * Redefine callback invoked when we got the whole HTTP reply. + * + * @param ha the HTTP async request descriptor + * @param s the socket on which we got the reply + * @param status the first HTTP status line + * @param header the parsed header structure + */ +static void +gwc_got_reply(const http_async_t *ha, + const gnutella_socket_t *s, const char *status, const header_t *header) +{ + if (GNET_PROPERTY(bootstrap_debug) > 3) + g_debug("GWC got reply from %s", http_async_url(ha)); + + if (GNET_PROPERTY(bootstrap_debug) > 5) { + g_debug("----Got GWC reply from %s:", + host_addr_to_string(s->addr)); + if (log_printable(LOG_STDERR)) { + fprintf(stderr, "%s\n", status); + header_dump(stderr, header, "----"); + } + } +} + +/** + * Retrieve more hosts from web cache, asynchronously. + */ +void +gwc_get_hosts(void) +{ + void *handle; + char *url; + const char *msg; + static time_t last_called = 0; + time_t now = tm_time(); + + /* + * Make sure we don't probe more than one webcache at a time. + * Ancient versions should rely on their hostcache to be connected. + */ + + if (gwc_get_running || GNET_PROPERTY(ancient_version)) + return; + + /* + * This routine is called each time we run out of hosts to try in our + * cache, so we have absolutely no guarantee about the frequency at which + * it will be called. + * + * Force picking up a new cache (well, randomly) if we were called less + * than an hour ago. Note that we don't remember whether it was THIS + * particular current cache that was accessed last time we were called. + * We only care about the calling frequency, and bet on the high number + * of available web caches and the random selection process to behave. + * properly. + * --RAM, 24/11/2003 + */ + + if (delta_time(now, last_called) < REUSE_PERIOD) + gwc_clear_current_url(FALSE); + + last_called = now; + + if (!gwc_check_current_url()) + return; + + /* + * Give some GUI feedback. + */ + + msg = str_smsg(_("Connecting to web cache %s"), gwc_current_url); + gcu_statusbar_message(msg); + + if (GNET_PROPERTY(bootstrap_debug)) + g_message("BOOT connecting to web cache %s", gwc_current_url); + + /* + * Launch the asynchronous request and attach parsing information. + */ + + msg = str_smsg("%s?get=1&net=gnutella2&%s", gwc_current_url, CLIENT_INFO); + url = h_strdup(msg); + + if (GNET_PROPERTY(bootstrap_debug) > 2) + g_message("GWC host request: %s", url); + + handle = http_async_get(url, NULL, gwc_host_data_ind, gwc_host_error_ind); + + if (NULL == handle) { + g_warning("could not launch a \"GET %s\" request: %s", + url, http_async_strerror(http_async_errno)); + gwc_clear_current_url(TRUE); + } else { + http_async_set_op_gotreply(handle, gwc_got_reply); + gwc_parse_context_set(handle, MAX_IP_LINES); + gwc_get_running = TRUE; + } + + hfree(url); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/g2/gwc.h
Added
@@ -0,0 +1,51 @@ +/* + * Copyright (c) 2001-2003, 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * Gnutella Web Cache. + * + * @author Raphael Manfredi + * @date 2001-2003, 2014 + */ + +#ifndef _core_g2_gwc_h_ +#define _core_g2_gwc_h_ + +#include "common.h" + +/* + * Public interface. + */ + +void gwc_init(void); +void gwc_close(void); + +void gwc_store_if_dirty(void); +void gwc_get_hosts(void); +gboolean gwc_is_waiting(void); + +#endif /* _core_g2_gwc_h_ */ +
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/g2/msg.c
Added
@@ -0,0 +1,489 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * G2 message utilities. + * + * @author Raphael Manfredi + * @date 2014 + */ + +#include "common.h" + +#include "msg.h" + +#include "frame.h" +#include "tree.h" + +#include "core/guid.h" + +#include "lib/buf.h" /* For buf_private() */ +#include "lib/constants.h" +#include "lib/misc.h" /* For clamp_strncpy() */ +#include "lib/once.h" +#include "lib/patricia.h" +#include "lib/str.h" +#include "lib/stringify.h" /* For plural */ +#include "lib/unsigned.h" /* For size_is_xxx() predicates */ + +#include "lib/override.h" /* Must be the last header included */ + +/** + * Message names, in English. + * This table is indexed by the G2_MSG_* constants defined by enum g2_msg. + */ +static const char * +g2_msg_english_names = { + "Crawler Answer", /**< G2_MSG_CRAWLA */ + "Crawler Request", /**< G2_MSG_CRAWLR */ + "Hub Advertisement Walker", /**< G2_MSG_HAW */ + "Known Hub List", /**< G2_MSG_KHL */ + "Known Hub List Request", /**< G2_MSG_KHLR */ + "Known Hub List Acknowledgment", /**< G2_MSG_KHLA */ + "Local Node Information", /**< G2_MSG_LNI */ + "Ping", /**< G2_MSG_PI */ + "Pong", /**< G2_MSG_PO */ + "Push", /**< G2_MSG_PUSH */ + "Query Key Acknowledgement", /**< G2_MSG_QKA */ + "Query Key Request", /**< G2_MSG_QKR */ + "Query", /**< G2_MSG_Q2 */ + "Query Acknowledgment", /**< G2_MSG_QA */ + "Query Hit", /**< G2_MSG_QH2 */ + "Query Hash Table", /**< G2_MSG_QHT */ + "User Profile Challenge", /**< G2_MSG_UPROC */ + "User Profile Delivery", /**< G2_MSG_UPROD */ +}; + +/** + * Message names, symbolic. + * This table is indexed by the G2_MSG_* constants defined by enum g2_msg. + */ +static const char * +g2_msg_symbolic_names = { + "CRAWLA", /**< G2_MSG_CRAWLA */ + "CRAWLR", /**< G2_MSG_CRAWLR */ + "HAW", /**< G2_MSG_HAW */ + "KHL", /**< G2_MSG_KHL */ + "KHLR", /**< G2_MSG_KHLR */ + "KHLA", /**< G2_MSG_KHLA */ + "LNI", /**< G2_MSG_LNI */ + "PI", /**< G2_MSG_PI */ + "PO", /**< G2_MSG_PO */ + "PUSH", /**< G2_MSG_PUSH */ + "QKA", /**< G2_MSG_QKA */ + "QKR", /**< G2_MSG_QKR */ + "Q2", /**< G2_MSG_Q2 */ + "QA", /**< G2_MSG_QA */ + "QH2", /**< G2_MSG_QH2 */ + "QHT", /**< G2_MSG_QHT */ + "UPROC", /**< G2_MSG_UPROC */ + "UPROD", /**< G2_MSG_UPROD */ +}; + +static patricia_t *g2_msg_pt; /* Maps a name into a G2_MSG_* constant */ +static once_flag_t g2_msg_pt_created; + +/** + * Build the PATRICIA that maps a message name string into our internal + * message ID. + */ +static void +g2_msg_build_map(void) +{ + uint i; + + STATIC_ASSERT(G2_MSG_MAX == N_ITEMS(g2_msg_english_names)); + STATIC_ASSERT(G2_MSG_MAX == N_ITEMS(g2_msg_symbolic_names)); + + g_assert(NULL == g2_msg_pt); + + /* + * We must be prepared to handle all the possible packet names, not just + * the ones we know. Therefore, the PATRICIA key size is computed to be + * able to handle the maximum architected size. + */ + + g2_msg_pt = patricia_create(G2_FRAME_NAME_LEN_MAX * 8); /* Size in bits */ + + for (i = 0; i < N_ITEMS(g2_msg_symbolic_names); i++) { + const char *key = g2_msg_symbolic_namesi; + size_t len = strlen(key); + + patricia_insert_k(g2_msg_pt, key, len * 8, int_to_pointer(i)); + } +} + +/** + * Initialize the PATRICIA map. + */ +static inline ALWAYS_INLINE void +g2_msg_init(void) +{ + ONCE_FLAG_RUN(g2_msg_pt_created, g2_msg_build_map); +} + +/** + * Get the type of message intuited from the start of a G2 packet. + * + * @param start start of message + * @param len amount of consecutive bytes we have so far + * + * @return the message type if we can intuit it, G2_MSG_MAX otherwise. + */ +enum g2_msg +g2_msg_type(const void *start, size_t len) +{ + const char *name; + size_t namelen; + bool known; + void *val; + int type; + + g2_msg_init(); + + name = g2_frame_name(start, len, &namelen); + if (NULL == name) + return G2_MSG_MAX; + + known = patricia_lookup_extended_k(g2_msg_pt, name, namelen*8, NULL, &val); + + if (!known) + return G2_MSG_MAX; + + type = pointer_to_int(val); + + g_assert((uint) type < UNSIGNED(G2_MSG_MAX)); + + return type; +} + +/** + * Get the raw message name present at the start of a G2 packet. + * + * @param start start of message + * @param len amount of consecutive bytes we have so far + * + * @return the message name if we can intuit it, an empty string otherwise. + */ +const char * +g2_msg_raw_name(const void *start, size_t len) +{ + const char *name; + size_t namelen; + char bufG2_FRAME_NAME_LEN_MAX + 1; + + name = g2_frame_name(start, len, &namelen); + if (NULL == name) + return ""; + + clamp_strncpy(buf, sizeof buf, name, namelen); + return constant_str(buf); +} + +/** + * Get the message symbolic name, intuited from the start of a G2 packet. + * + * @param start start of message + * @param len amount of consecutive bytes we have so far + * + * @return the message symbolic name if we can intuit it, "UNKNOWN" otherwise. + */ +const char * +g2_msg_name(const void *start, size_t len) +{ + enum g2_msg m; + + m = g2_msg_type(start, len); + + if (G2_MSG_MAX == m) + return "UNKNOWN"; + + return g2_msg_symbolic_namesm; +} + +/** + * Get the message English name, intuited from the start of a G2 packet. + * + * @param start start of message + * @param len amount of consecutive bytes we have so far + * + * @return the message symbolic name if we can intuit it, "UNKNOWN" otherwise. + */ +const char * +g2_msg_full_name(const void *start, size_t len) +{ + enum g2_msg m; + + m = g2_msg_type(start, len); + + if (G2_MSG_MAX == m) + return "UNKNOWN"; + + return g2_msg_english_namesm; +} + +/** + * Convert a message type to a symbolic name. + * + * @param type the G2 message type + * + * @return the message symbolic name if we can intuit it, "UNKNOWN" otherwise. + */ +const char * +g2_msg_type_name(const enum g2_msg type) +{ + if G_UNLIKELY((uint) type >= UNSIGNED(G2_MSG_MAX)) + return "UNKNOWN"; + + return g2_msg_symbolic_namestype; +} + +/** + * Convert a message name to a type. + * + * @param name the G2 message name (root packet name) + */ +enum g2_msg +g2_msg_name_type(const char *name) +{ + size_t namelen; + bool known; + void *val; + int type; + + g2_msg_init(); + + namelen = strlen(name); + known = patricia_lookup_extended_k(g2_msg_pt, name, namelen*8, NULL, &val); + + if (!known) + return G2_MSG_MAX; + + type = pointer_to_int(val); + + g_assert((uint) type < UNSIGNED(G2_MSG_MAX)); + + return type; +} + +/** + * Fetch the MUID in the message, if any is architected. + * + * @param t the message tree + * @param buf the buffer to fill with a copy of the MUID + * + * @return a pointer to `buf' if OK and we filled the MUID, NULL if there is + * no valid MUID in the message or the message is not carrying any MUID. + */ +guid_t * +g2_msg_get_muid(const g2_tree_t *t, guid_t *buf) +{ + enum g2_msg m; + const void *payload; + size_t paylen; + size_t offset; + + g_assert(t != NULL); + g_assert(buf != NULL); + + m = g2_msg_name_type(g2_tree_name(t)); + + switch (m) { + case G2_MSG_Q2: + case G2_MSG_QA: + offset = 0; + break; + case G2_MSG_QH2: + offset = 1; /* First payload byte is the hop count */ + break; + default: + return NULL; /* No MUID in message */ + } + + payload = g2_tree_node_payload(t, &paylen); + + if (NULL == payload || paylen < GUID_RAW_SIZE + offset) + return NULL; + + /* + * Copy the MUID in the supplied buffer for alignment purposes, since + * the MUID is offset by 1 byte in /QH2 messages, and return that aligned + * pointer. + */ + + memcpy(buf, const_ptr_add_offset(payload, offset), GUID_RAW_SIZE); + + return buf; +} + +/** + * Fetch the query text from a /Q2 message. + * + * @param mb a message block containing a serialized /Q2 + * + * @return a pointer to the search text string (as static data), NULL if + * is no text in the query or the message is not a /Q2. + */ +const char * +g2_msg_search_get_text(const pmsg_t *mb) +{ + str_t *s = str_private(G_STRFUNC, 64); + const g2_tree_t *t; + + t = g2_frame_deserialize( + pmsg_start(mb), pmsg_written_size(mb), NULL, FALSE); + + if (NULL == t) { + return NULL; + } else { + const char *payload; + size_t paylen; + + payload = g2_tree_payload(t, "/Q2/DN", &paylen); + + if (NULL == payload) { + g2_tree_free_null_const(&t); + return NULL; + } + + str_cpy_len(s, payload, paylen); + } + + g2_tree_free_null_const(&t); + return str_2c(s); +} + +/** + * Fill supplied buffer with the formatted string describing the message. + * + * @param data start of the G2 message + * @param len length of the message + * @param buf buffer where formatted string is written + * @param buflen length of the destination buffer + * + * @return the amount of bytes written. + */ +size_t +g2_msg_infostr_to_buf(const void *data, size_t len, char *buf, size_t buflen) +{ + enum g2_msg m; + const guid_t *muid = NULL; + + g_assert(size_is_non_negative(len)); + g_assert(size_is_non_negative(buflen)); + + /* + * Check whether we need to decompile the packet to access the GUID, which + * is the payload of the root element in the tree. Given the way things + * are serialized, that would be the last 16 bytes of the message, so + * we don't have to deserialize everything just to access it. + */ + + m = g2_msg_type(data, len); + + switch (m) { + case G2_MSG_Q2: + case G2_MSG_QA: + case G2_MSG_QH2: + if (len > GUID_RAW_SIZE) + muid = const_ptr_add_offset(data, len - GUID_RAW_SIZE); + /* FALL THROUGH */ + default: + break; + } + + return str_bprintf(buf, buflen, + "/%s (%zu byte%s)%s%s", + g2_msg_type_name(m), len, plural(len), + NULL == muid ? "" : " #", + NULL == muid ? "" : guid_hex_str(muid)); +} + +/** + * Pretty-print the message information. + * + * @param data start of the G2 message + * @param len length of the message + * + * @return formatted static string. + */ +const char * +g2_msg_infostr(const void *data, size_t len) +{ + buf_t *b = buf_private(G_STRFUNC, 64); + char *p = buf_data(b); + size_t n, sz = buf_size(b); + + n = g2_msg_infostr_to_buf(data, len, p, sz); + g_assert(n < sz); + return p; +} + +/** + * Log dropped message. + */ +static void +g2_msg_log_dropped(const void *data, size_t len, const char *fmt, va_list args) +{ + char rbuf256; + + if (fmt != NULL) { + rbuf0 = ':'; + rbuf1 = ' '; + str_vbprintf(&rbuf2, sizeof rbuf - 2, fmt, args); + va_end(args); + } else { + rbuf0 = '\0'; + } + + g_debug("DROP G2 %s%s", g2_msg_infostr(data, len), rbuf); +} + +/** + * Log a dropped message. + */ +void +g2_msg_log_dropped_pmsg(const pmsg_t *mb, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + g2_msg_log_dropped(pmsg_start(mb), pmsg_size(mb), fmt, args); + va_end(args); +} + +/** + * Log a dropped message. + */ +void +g2_msg_log_dropped_data(const void *data, size_t len, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + g2_msg_log_dropped(data, len, fmt, args); + va_end(args); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/g2/msg.h
Added
@@ -0,0 +1,120 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * G2 message utilities. + * + * @author Raphael Manfredi + * @date 2014 + */ + +#ifndef _core_g2_msg_h_ +#define _core_g2_msg_h_ + +#include "lib/pmsg.h" + +/** + * Known G2 messages -- the IDs are just for internal use (i.e. arbitrary). + */ +enum g2_msg { + G2_MSG_CRAWLA = 0, /**< Crawler Answer */ + G2_MSG_CRAWLR, /**< Crawler Request */ + G2_MSG_HAW, /**< Hub Advertisement Walker */ + G2_MSG_KHL, /**< Known Hub List */ + G2_MSG_KHLR, /**< Known Hub List Request */ + G2_MSG_KHLA, /**< Known Hub List Acknowledgment */ + G2_MSG_LNI, /**< Local Node Information */ + G2_MSG_PI, /**< Ping */ + G2_MSG_PO, /**< Pong */ + G2_MSG_PUSH, /**< Push */ + G2_MSG_QKA, /**< Query Key Acknowledgement */ + G2_MSG_QKR, /**< Query Key Request */ + G2_MSG_Q2, /**< Query */ + G2_MSG_QA, /**< Query Acknowledgment */ + G2_MSG_QH2, /**< Query Hit */ + G2_MSG_QHT, /**< Query Hash Table */ + G2_MSG_UPROC, /**< User Profile Challenge */ + G2_MSG_UPROD, /**< User Profile Delivery */ + + G2_MSG_MAX +}; + +/* + * Public interface. + */ + +struct guid; +struct g2_tree; + +enum g2_msg g2_msg_type(const void *start, size_t len); +const char *g2_msg_name(const void *start, size_t len); +const char *g2_msg_full_name(const void *start, size_t len); +const char *g2_msg_type_name(const enum g2_msg type); +const char *g2_msg_raw_name(const void *start, size_t len); +enum g2_msg g2_msg_name_type(const char *name); + +struct guid *g2_msg_get_muid(const struct g2_tree *t, struct guid *buf); +const char *g2_msg_search_get_text(const pmsg_t *mb); + +const char *g2_msg_infostr(const void *data, size_t len); +size_t g2_msg_infostr_to_buf(const void *data, size_t len, + char *buf, size_t buf_size); + +void g2_msg_log_dropped_pmsg(const pmsg_t *mb, const char *fmr, ...) + G_PRINTF(2, 3); +void g2_msg_log_dropped_data(const void *data, size_t len, const char *fmt, ...) + G_PRINTF(3, 4); + +/** + * @return the string name to use as packet name for x. + * + * This makes sure we don't introduce a typo, as could be the case if we + * simply hardwired the string for x: here G2_NAME(x) stands for "x" only + * when x is a valid name (otherwise it's a compilation error). + */ +#define G2_NAME(x) g2_msg_type_name(G2_MSG_ ## x) + +/** + * Convenience shortcut for getting the G2 message info from a pmsg_t. + */ +static inline const char * +g2_msg_infostr_mb(const pmsg_t *mb) +{ + return g2_msg_infostr(pmsg_start(mb), pmsg_written_size(mb)); +} + +/** + * Convenience shortcut for getting the G2 message type from a pmsg_t. + */ +static inline enum g2_msg +g2_msg_type_mb(const pmsg_t *mb) +{ + return g2_msg_type(pmsg_start(mb), pmsg_written_size(mb)); +} + +#endif /* _core_g2_msg_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/g2/node.c
Added
@@ -0,0 +1,1116 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * G2 message handling. + * + * @author Raphael Manfredi + * @date 2014 + */ + +#include "common.h" + +#include "node.h" + +#include "build.h" +#include "frame.h" +#include "msg.h" +#include "rpc.h" +#include "tfmt.h" +#include "tree.h" + +#define SEARCH_SOURCES +#include "core/search.h" + +#include "core/alive.h" +#include "core/gnet_stats.h" +#include "core/guess.h" +#include "core/hcache.h" +#include "core/hostiles.h" /* For hostiles_is_bad() */ +#include "core/hosts.h" +#include "core/mq_tcp.h" +#include "core/mq_udp.h" +#include "core/nodes.h" +#include "core/routing.h" +#include "core/search.h" +#include "core/settings.h" /* For is_my_address_and_port() */ +#include "core/uploads.h" /* For handle_push_request() */ + +#include "if/gnet_property_priv.h" + +#include "if/core/guid.h" + +#include "lib/aging.h" +#include "lib/ascii.h" +#include "lib/halloc.h" +#include "lib/host_addr.h" +#include "lib/misc.h" /* For dump_hex() */ +#include "lib/pmsg.h" +#include "lib/str.h" +#include "lib/stringify.h" /* For plural() */ +#include "lib/tokenizer.h" +#include "lib/utf8.h" +#include "lib/walloc.h" + +#include "lib/override.h" /* Must be the last header included */ + +#define G2_UDP_PING_FREQ 60 /**< answer to 1 ping per minute per IP */ + +enum g2_q2_child { + G2_Q2_DN = 1, + G2_Q2_I, + G2_Q2_MD, + G2_Q2_NAT, + G2_Q2_SZR, + G2_Q2_UDP, + G2_Q2_URN +}; + +enum g2_lni_child { + G2_LNI_GU = 1, + G2_LNI_LS, + G2_LNI_NA, + G2_LNI_UP, + G2_LNI_V +}; + +static const tokenizer_t g2_q2_children = { + /* Sorted array */ + { "DN", G2_Q2_DN }, + { "I", G2_Q2_I }, + { "MD", G2_Q2_MD }, + { "NAT", G2_Q2_NAT }, + { "SZR", G2_Q2_SZR }, + { "UDP", G2_Q2_UDP }, + { "URN", G2_Q2_URN }, +}; + +static const tokenizer_t g2_lni_children = { + /* Sorted array */ + { "GU", G2_LNI_GU }, + { "LS", G2_LNI_LS }, + { "NA", G2_LNI_NA }, + { "UP", G2_LNI_UP }, + { "V", G2_LNI_V }, +}; + +/** + * The /Q2/I flags we parse and handle. + */ +#define G2_Q2_F_PFS (1U << 0) /**< Wants partial files */ +#define G2_Q2_F_URL (1U << 1) /**< Wants URL */ +#define G2_Q2_F_A (1U << 2) /**< Wants alt-locs */ +#define G2_Q2_F_DN (1U << 3) /**< Wants distinguished name */ + +#define G2_Q2_F_DFLT (G2_Q2_F_PFS | G2_Q2_F_URL | G2_Q2_F_DN) + +static const tokenizer_t g2_q2_i = { + /* Sorted array */ + { "A", G2_Q2_F_A }, + { "DN", G2_Q2_F_DN }, + { "PFS", G2_Q2_F_PFS }, + { "URL", G2_Q2_F_URL }, +}; + +/** + * String prefix for /Q2/URN that can prefix a SHA1. + */ +static const char *g2_q2_urn = { + "sha1", + "bp", + "bitprint", +}; + +/** + * XML tags that we lexically recognize to intuit media types. + */ +static const tokenizer_t g2_q2_md = { + /* Sorted array */ + { "application", SEARCH_WIN_TYPE | SEARCH_UNIX_TYPE }, + { "archive", SEARCH_WIN_TYPE | SEARCH_UNIX_TYPE }, + { "audio", SEARCH_AUDIO_TYPE }, + { "book", SEARCH_DOC_TYPE }, + { "collection", SEARCH_WIN_TYPE | SEARCH_UNIX_TYPE }, + { "document", SEARCH_DOC_TYPE }, + { "image", SEARCH_IMG_TYPE }, + { "rom", SEARCH_G2_ROM_TYPE }, + { "subtitle", SEARCH_G2_TEXT_TYPE }, + { "torrent", SEARCH_TORRENT_TYPE }, + { "video", SEARCH_VIDEO_TYPE }, + { "wordprocessing", SEARCH_DOC_TYPE }, +}; + +static aging_table_t *g2_udp_pings; + +/** + * Send a message to target node. + * + * @param n the G2 node to which message should be sent + * @param mb the message to sent (ownership taken, will be freed later) + */ +void +g2_node_send(const gnutella_node_t *n, pmsg_t *mb) +{ + node_check(n); + g_assert(NODE_TALKS_G2(n)); + + if (NODE_IS_UDP(n)) + mq_udp_node_putq(n->outq, mb, n); + else if (NODE_IS_WRITABLE(n)) + mq_tcp_putq(n->outq, mb, NULL); + else + goto drop; + + if (GNET_PROPERTY(log_sending_g2)) { + g_debug("%s(): sending %s to %s", + G_STRFUNC, g2_msg_infostr_mb(mb), node_infostr(n)); + } + + return; + +drop: + if (GNET_PROPERTY(log_sending_g2)) { + g_debug("%s(): aborting sending %s to %s", + G_STRFUNC, g2_msg_infostr_mb(mb), node_infostr(n)); + } + + pmsg_free(mb); /* Cannot send it, free it now */ +} + +/** + * Send a pong to target node. + */ +static void +g2_node_send_pong(gnutella_node_t *n) +{ + pmsg_t *mb = g2_build_pong(); + + g2_node_send(n, mb); +} + +/** + * Send a /QHT RESET to node. + * + * @param n the TCP node to which we need to send the /QHT + * @param slots amount of slots in the table (power of 2) + * @param inf_val infinity value (1) + */ +void +g2_node_send_qht_reset(gnutella_node_t *n, int slots, int inf_val) +{ + pmsg_t *mb = g2_build_qht_reset(slots, inf_val); + + node_check(n); + g_assert(!NODE_IS_UDP(n)); + + g2_node_send(n, mb); +} + +/** + * Send a /QHT RESET to node. + * + * @param n the TCP node to which we need to send the /QHT + * @param seqno the patch sequence number + * @param seqsize the total length of the sequence + * @param compressed whether patch is compressed + * @param bits amount of bits for each entry (1) + * @param buf start of patch data + * @param len length in byte of patch data + */ +void +g2_node_send_qht_patch(gnutella_node_t *n, + int seqno, int seqsize, bool compressed, int bits, + char *buf, int len) +{ + pmsg_t *mb = g2_build_qht_patch(seqno, seqsize, compressed, bits, buf, len); + + node_check(n); + g_assert(!NODE_IS_UDP(n)); + + g2_node_send(n, mb); +} + +/** + * Send a /LNI to node. + */ +void +g2_node_send_lni(gnutella_node_t *n) +{ + pmsg_t *mb = g2_build_lni(); + + node_check(n); + g_assert(!NODE_IS_UDP(n)); + + g2_node_send(n, mb); +} + +/** + * Drop message received from given node. + * + * @param routine routine where we're coming from (the one dropping) + * @param n source node of message + * @param t the message tree + * @param reason optional reason + */ +static void G_PRINTF(4, 5) +g2_node_drop(const char *routine, gnutella_node_t *n, const g2_tree_t *t, + const char *fmt, ...) +{ + if (GNET_PROPERTY(g2_debug) || GNET_PROPERTY(log_dropped_g2)) { + va_list args; + char buf256; + + va_start(args, fmt); + + if (fmt != NULL) + str_vbprintf(buf, sizeof buf, fmt, args); + else + buf0 = '\0'; + + g_debug("%s(): dropping /%s from %s%s%s", + routine, g2_tree_name(t), node_infostr(n), + NULL == fmt ? "" : ": ", buf); + + va_end(args); + } + + gnet_stats_count_dropped(n, MSG_DROP_G2_UNEXPECTED); + + if (GNET_PROPERTY(log_dropped_g2)) { + g2_tfmt_tree_dump(t, stderr, G2FMT_O_PAYLEN); + } +} + +/** + * Handle reception of a /PI + */ +static void +g2_node_handle_ping(gnutella_node_t *n, const g2_tree_t *t) +{ + g2_tree_t *c; + + /* + * Throttle pings received from UDP. + */ + + if (NODE_IS_UDP(n)) { + if (aging_lookup(g2_udp_pings, &n->addr)) { + gnet_stats_count_dropped(n, MSG_DROP_THROTTLE); + return; + } + aging_insert(g2_udp_pings, WCOPY(&n->addr), uint_to_pointer(1)); + + /* FALL THROUGH */ + } + + c = g2_tree_first_child(t); + + /* + * If there is no payload, it's a keep-alive ping, send back a pong. + */ + + if (NULL == c) { + g2_node_send_pong(n); + return; + } + + /* + * There are children. + * + * If there is a /PI/UDP present, drop the message: we're not a hub, + * we don't have to relay this message to its UDP target (we're only + * connected to hubs, and the hub which got it should only forward that + * message it its neighbouring hubs, not to leaves). + * + * If there is a /PI/RELAY, the ping was relayed by a hub, but it made + * a mistake because we are a leaf node. + */ + + g2_node_drop(G_STRFUNC, n, t, "has children and we are a leaf"); +} + +/** + * Handle reception of a /PO + */ +static void +g2_node_handle_pong(gnutella_node_t *n, const g2_tree_t *t) +{ + /* + * Pongs received from UDP must be RPC replies to pings. + */ + + if (NODE_IS_UDP(n)) { + if (!g2_rpc_answer(n, t)) + g2_node_drop(G_STRFUNC, n, t, "coming from UDP"); + return; + } + + /* + * Must be a pong received because we sent an alive ping earlier. + */ + + alive_ack_ping(n->alive_pings, NULL); /* No MUID on G2 */ +} + +/** + * Handle reception of an RPC answer (/QKA, /QA) + * + * @param n the node from which the answer came + * @param t the message tree + * @param type the type of message + */ +static void +g2_node_handle_rpc_answer(gnutella_node_t *n, + const g2_tree_t *t, enum g2_msg type) +{ + /* + * /QKA received from UDP must be RPC replies to /QKR, otherwise + * it can be sent when a /Q2 bearing the wrong query key is received + * by a host. + * + * A /QA is sent back by a hub upon reception of the /Q2 message if + * the query key was correct. + */ + + if (NODE_IS_UDP(n)) { + if (!g2_rpc_answer(n, t)) { + /* + * Special-case /QA which can come VERY late in the process, + * well after the associated RPC has expired. Still a /QA + * contains information that can be perused, and the associated + * GUESS query may still be alive. Give them to the GUESS layer + * as late-comers, to see how much information we can extract. + */ + + if (G2_MSG_QA == type && guess_late_qa(n, t, NULL)) + return; + + g2_node_drop(G_STRFUNC, n, t, "coming from UDP"); + } + return; + } else { + /* + * We can get a /QA from TCP when we send a /Q2 to a neighbouring hub. + * Since they are not linked to a GUESS query, but we may want to + * collect new addresses from the packet and possibly update the + * re-query time limit, handle these as "late" QA messages. + */ + + if (G2_MSG_QA == type && guess_late_qa(n, t, NULL)) + return; + } + + /* + * We do not expect these from TCP, since they are UDP RPC replies. + */ + + g2_node_drop(G_STRFUNC, n, t, "coming from TCP"); +} + +/** + * Parse the payload of given node to extract a node address + port. + * + * @param t the tree node whose payload we wish to parse + * @param addr where to write the address part + * @param port where to write the port part + * + * @return TRUE if OK, FALSE if we could not extract anything. + */ +bool +g2_node_parse_address(const g2_tree_t *t, host_addr_t *addr, uint16 *port) +{ + const char *payload; + size_t paylen; + + payload = g2_tree_node_payload(t, &paylen); + + /* + * Only handle if we have an IP:port entry. + * We only handle IPv4 because G2 does not support IPv6. + */ + + if (6 == paylen) { /* IPv4 + port */ + *addr = host_addr_peek_ipv4(payload); + *port = peek_le16(&payload4); + return TRUE; + } + + return FALSE; /* Unrecognized payload length */ +} + +/** + * Handle reception of a /LNI + */ +static void +g2_node_handle_lni(gnutella_node_t *n, const g2_tree_t *t) +{ + g2_tree_t *c; + + /* + * Handle the children of /LNI. + */ + + G2_TREE_CHILD_FOREACH(t, c) { + enum g2_lni_child ct = TOKENIZE(g2_tree_name(c), g2_lni_children); + const char *payload; + size_t paylen; + + switch (ct) { + case G2_LNI_GU: /* the node's GUID */ + payload = g2_tree_node_payload(c, &paylen); + if (GUID_RAW_SIZE == paylen) + node_set_guid(n, (guid_t *) payload, TRUE); + break; + + case G2_LNI_NA: /* the node's address, with listening port */ + { + host_addr_t addr; + uint16 port; + + if (g2_node_parse_address(c, &addr, &port)) { + if (host_address_is_usable(addr)) + n->gnet_addr = addr; + n->gnet_port = port; + } + } + break; + + case G2_LNI_LS: /* library statistics */ + payload = g2_tree_node_payload(c, &paylen); + if (paylen >= 8) { + uint32 files = peek_le32(payload); + uint32 kbytes = peek_le32(&payload4); + + n->gnet_files_count = files; + n->gnet_kbytes_count = kbytes; + n->flags |= NODE_F_SHARED_INFO; + } + break; + + case G2_LNI_V: /* vendor code */ + payload = g2_tree_node_payload(c, &paylen); + if (paylen >= 4) + n->vcode.u32 = peek_be32(payload); + break; + + case G2_LNI_UP: /* uptime */ + payload = g2_tree_node_payload(c, &paylen); + if (paylen <= 4) + n->up_date = tm_time() - vlint_decode(payload, paylen); + break; + } + } +} + +/** + * Tree message iterator to handle "NH" nodes and extract their IP:port. + */ +static void +g2_node_extract_nh(void *data, void *udata) +{ + const g2_tree_t *t = data; + + (void) udata; + + if (0 == strcmp("NH", g2_tree_name(t))) { + host_addr_t addr; + uint16 port; + + if ( + g2_node_parse_address(t, &addr, &port) && + host_is_valid(addr, port) + ) { + hcache_add_caught(HOST_G2HUB, addr, port, "/KHL/NH"); + } + } +} + +/** + * Tree message iterator to handle "CH" nodes and extract their IP:port. + */ +static void +g2_node_extract_ch(void *data, void *udata) +{ + const g2_tree_t *t = data; + + (void) udata; + + if (0 == strcmp("CH", g2_tree_name(t))) { + const char *payload; + size_t paylen; + + payload = g2_tree_node_payload(t, &paylen); + + if (10 == paylen) { /* IPv4:port + 32-bit timestamp */ + host_addr_t addr = host_addr_peek_ipv4(payload); + uint16 port = peek_le16(&payload4); + + if (host_is_valid(addr, port) && !hostiles_is_bad(addr)) + guess_add_hub(addr, port); + } + } +} + +/** + * Handle reception of a /KHL + */ +static void +g2_node_handle_khl(const g2_tree_t *t) +{ + /* + * Extract the neighbouring node info and insert them into our cache. + */ + + g2_tree_child_foreach(t, g2_node_extract_nh, NULL); + + /* + * Extract cached hubs (necessarily not in the cluster of the hub sending + * us the /KHL) and add them to the GUESS host cache. + */ + + g2_tree_child_foreach(t, g2_node_extract_ch, NULL); +} + +/** + * Extract min/max sizes from the payload of a /Q2/SZR tree node. + * + * @return TRUE if we successfully extracted the information. + */ +static bool NON_NULL_PARAM((2, 3)) +g2_node_extract_size_request(const g2_tree_t *t, uint64 *min, uint64 *max) +{ + const char *p; + size_t paylen; + + /* + * The payload can be 2 32-bit or 2 64-bit values. + */ + + p = g2_tree_node_payload(t, &paylen); + + if (8 == paylen) { + *min = (uint64) peek_le32(p); + *max = (uint64) peek_le32(&p4); + return TRUE; + } else if (16 == paylen) { + *min = peek_le64(p); + *max = peek_le64(&p8); + return TRUE; + } + + return FALSE; +} + +/** + * Extract interest flags from the payload of a /Q2/I tree node. + * + * @return the consolidated flags G2_Q2_F_* requested by the payload. + */ +static uint32 +g2_node_extract_interest(const g2_tree_t *t) +{ + const char *p, *q, *end; + size_t paylen; + uint32 flags = 0; + + p = q = g2_tree_node_payload(t, &paylen); + + if (NULL == p) + return 0; + + end = p + paylen; + + while (q != end) { + if ('\0' == *q++) { + flags |= TOKENIZE(p, g2_q2_i); + p = q; + } + } + + if (p != q) { + char *r = h_strndup(p, q - p); /* String not NUL-terminated */ + flags |= TOKENIZE(r, g2_q2_i); + hfree(r); + } + + return flags; +} + +/** + * Extract the URN from a /Q2/URN and populate the search request info + * if it is a SHA1 (or bitprint, which contains a SHA1). + */ +static void +g2_node_extract_urn(const g2_tree_t *t, search_request_info_t *sri) +{ + const char *p; + size_t paylen; + uint i; + + /* + * If we have more SHA1s already than we can hold, stop. + */ + + if (sri->exv_sha1cnt == N_ITEMS(sri->exv_sha1)) + return; + + p = g2_tree_node_payload(t, &paylen); + + if (NULL == p) + return; + + /* + * We can only search by SHA1, hence we're only interested by URNs + * that contain a SHA1. + */ + + if (paylen < SHA1_RAW_SIZE) + return; /* Cannot contain a SHA1 */ + + /* + * Since we know there are at least SHA1_RAW_SIZE bytes in the payload, + * we can use clamp_memcmp() to see whether we have a known prefix. + */ + + for (i = 0; i < N_ITEMS(g2_q2_urn); i++) { + const char *prefix = g2_q2_urni; + size_t len = strlen(prefix) + 1; /* Wants trailing NUL as well */ + + if (0 == clamp_memcmp(prefix, len, p, paylen)) { + p += len; + paylen -= len; + + g_assert(size_is_positive(paylen)); + + if (paylen >= SHA1_RAW_SIZE) { + uint idx = sri->exv_sha1cnt++; + + g_assert(idx < N_ITEMS(sri->exv_sha1)); + + memcpy(&sri->exv_sha1idx.sha1, p, SHA1_RAW_SIZE); + } + break; + } + } +} + +/** + * Extract the UDP IP:port from a /Q2/UDP and populate the search request info + * if we have a valid address. + */ +static void +g2_node_extract_udp(const g2_tree_t *t, search_request_info_t *sri, + const gnutella_node_t *n) +{ + const char *p; + size_t paylen; + + p = g2_tree_node_payload(t, &paylen); + + /* + * Only handle if we have an IP:port entry. + * We only handle IPv4 because G2 does not support IPv6. + * + * We don't care about the presence of the query key because as G2 leaf, + * we only process /Q2 coming from our TCP-connected hubs, and they + * are in charge of validating it. Now hubs may forward us /Q2 coming + * from neighbouring hubs and those won't have a query key, hence we + * need to handle payloads with no trailing 32-bit QK. + */ + + if (6 == paylen || 10 == paylen) { /* IPv4 + port (+ QK usually) */ + host_addr_t addr = host_addr_peek_ipv4(p); + uint16 port = peek_le16(&p4); + + if (host_is_valid(addr, port)) { + sri->addr = addr; + sri->port = port; + + /* + * If the address is that of the node sending us the query, + * and it is not a UDP node, then we can deliver the hit + * back via the TCP connection we have, so no need to use OOB. + */ + + if (n->port == port && host_addr_equiv(addr, n->gnet_addr)) + sri->oob = NODE_IS_UDP(n); + else + sri->oob = TRUE; + } + } +} + +/** + * Intuit the media type they are searching based on the first XML tag + * we find in the meta data string, using simplistic lexical parsing which + * will encompass 99% of the cases. + */ +static uint32 +g2_node_intuit_media_type(const char *md) +{ + const char *p = md; + const char *start; + int c; + uint32 flags; + + while ('<' != (c = *p++) && c != 0) + /* empty */; + + if (0 == c) + return 0; /* Did not find any tag opening */ + + start = p = skip_ascii_spaces(p); + + while (0 != (c = *p)) { + if (is_ascii_space(c) || '/' == c || '>' == c) { + char *name; + + /* Found end of word, we got the tag name */ + + name = h_strndup(start, p - start); + flags = TOKENIZE(name, g2_q2_md); + if (0 == flags) { + g_warning("%s(): unknown tag \"%s\", XML string was \"%s\"", + G_STRFUNC, name, md); + } + hfree(name); + return flags; + } + p++; + } + + return 0; +} + +/** + * Handle reception of a /Q2 + */ +static void +g2_node_handle_q2(gnutella_node_t *n, const g2_tree_t *t) +{ + const guid_t *muid; + size_t paylen; + const g2_tree_t *c; + char *dn = NULL; + char *md = NULL; + uint32 iflags = 0; + search_request_info_t sri; + bool has_interest = FALSE; + + node_inc_rx_query(n); + + /* + * As a G2 leaf, we cannot handle queries coming from UDP because we + * are not supposed to get any! + */ + + if (NODE_IS_UDP(n)) { + g2_node_drop(G_STRFUNC, n, t, "coming from UDP"); + return; + } + + /* + * The MUID of the query is the payload of the root node. + */ + + muid = g2_tree_node_payload(t, &paylen); + + if (paylen != GUID_RAW_SIZE) { + g2_node_drop(G_STRFUNC, n, t, "missing MUID"); + return; + } + + /* + * Make sure we have never seen this query already. + * + * To be able to leverage on Gnutella's routing table to detect duplicates + * over a certain lifespan, we are going to fake a minimal Gnutella header + * with a message type of GTA_MSG_G2_SEARCH, which is never actually used + * on the network. + * + * The TTL and hops are set to 1 and 0 initially, so that the message seems + * to come from a neighbouring host and cannot be forwarded. + * + * When that is done, we will be able to call route_message() and have + * all the necessary bookkeeping done for us. + */ + + { + struct route_dest dest; + + gnutella_header_set_muid(&n->header, muid); + gnutella_header_set_function(&n->header, GTA_MSG_G2_SEARCH); + gnutella_header_set_ttl(&n->header, 1); + gnutella_header_set_hops(&n->header, 0); + + if (!route_message(&n, &dest)) + return; /* Already accounted as duplicated, and logged */ + } + + /* + * Setup request information so that we can call search_request() + * to process our G2 query. + */ + + ZERO(&sri); + + /* + * Handle the children of /Q2. + */ + + G2_TREE_CHILD_FOREACH(t, c) { + enum g2_q2_child ct = TOKENIZE(g2_tree_name(c), g2_q2_children); + const char *payload; + + switch (ct) { + case G2_Q2_DN: + payload = g2_tree_node_payload(c, &paylen); + if (payload != NULL && NULL == dn) { + uint off = 0; + /* Not NUL-terminated, need to h_strndup() it */ + dn = h_strndup(payload, paylen); + if (!query_utf8_decode(dn, &off)) { + gnet_stats_count_dropped(n, MSG_DROP_MALFORMED_UTF_8); + goto done; /* Drop the query */ + } + sri.extended_query = dn + off; + sri.search_len = paylen - off; /* In bytes */ + } + break; + + case G2_Q2_I: + if (!has_interest) + iflags = g2_node_extract_interest(c); + has_interest = TRUE; + break; + + case G2_Q2_MD: + payload = g2_tree_node_payload(c, &paylen); + if (payload != NULL && NULL == md) { + /* Not NUL-terminated, need to h_strndup() it */ + md = h_strndup(payload, paylen); + } + break; + + case G2_Q2_NAT: + sri.flags |= QUERY_F_FIREWALLED; + break; + + case G2_Q2_SZR: /* Size limits */ + if (g2_node_extract_size_request(c, &sri.minsize, &sri.maxsize)) + sri.size_restrictions = TRUE; + break; + + case G2_Q2_UDP: + if (!sri.oob) + g2_node_extract_udp(c, &sri, n); + break; + + case G2_Q2_URN: + g2_node_extract_urn(c, &sri); + break; + } + } + + /* + * When there is no /Q2/I, return a default set of information. + */ + + if (!has_interest) + iflags = G2_Q2_F_DFLT; + + /* + * If there are meta-data, try to intuit which media types there are + * looking for. + * + * The payload is XML looking like "<audio/>" or "<video/>" but there + * can be attributes and we don't want to do a full XML parsing there. + * Hence we'll base our analysis on simple lexical parsing, which is + * why we call a routine to "intuit", not to "extract". + * + * Also, this is poorer than Gnutella's GGEP "M" because apparently there + * can be only one single type, since the XML payload must obey some + * kind of schema and there is an audio schema, a video schema, etc... + * XML was just a wrong design choice there. + */ + + if (md != NULL) + sri.media_types = g2_node_intuit_media_type(md); + + /* + * Validate the return address if OOB hit delivery is configured. + */ + + if (sri.oob && !search_oob_is_allowed(n, &sri)) + goto done; + + /* + * Update statistics, as done in search_request_preprocess() for Gnutella. + */ + + if (sri.exv_sha1cnt) { + gnet_stats_inc_general(GNR_QUERY_G2_SHA1); + + if (NULL == dn) { + int i; + for (i = 0; i < sri.exv_sha1cnt; i++) { + search_request_listener_emit(QUERY_SHA1, + sha1_base32(&sri.exv_sha1i.sha1), n->addr, n->port); + } + } + } + + if (dn != NULL && !is_ascii_string(dn)) + gnet_stats_inc_general(GNR_QUERY_G2_UTF8); + + if (dn != NULL) + search_request_listener_emit(QUERY_STRING, dn, n->addr, n->port); + + if (!search_is_valid(n, 0, &sri)) + goto done; + + /* + * Perform the query. + */ + + sri.g2_query = TRUE; + sri.partials = booleanize(iflags & G2_Q2_F_PFS); + sri.g2_wants_url = booleanize(iflags & G2_Q2_F_URL); + sri.g2_wants_alt = booleanize(iflags & G2_Q2_F_A); + sri.g2_wants_dn = booleanize(iflags & G2_Q2_F_DN); + + search_request(n, &sri, NULL); + +done: + + HFREE_NULL(dn); + HFREE_NULL(md); +} + +/** + * Handle message coming from G2 node. + */ +void +g2_node_handle(gnutella_node_t *n) +{ + g2_tree_t *t; + size_t plen; + enum g2_msg type; + + node_check(n); + g_assert(NODE_TALKS_G2(n)); + + t = g2_frame_deserialize(n->data, n->size, &plen, FALSE); + if (NULL == t) { + if (GNET_PROPERTY(g2_debug) > 0 || GNET_PROPERTY(log_bad_g2)) { + g_warning("%s(): cannot deserialize /%s from %s", + G_STRFUNC, g2_msg_raw_name(n->data, n->size), node_infostr(n)); + } + if (GNET_PROPERTY(log_bad_g2)) + dump_hex(stderr, "G2 Packet", n->data, n->size); + return; + } else if (plen != n->size) { + if (GNET_PROPERTY(g2_debug) > 0 || GNET_PROPERTY(log_bad_g2)) { + g_warning("%s(): consumed %zu bytes but /%s from %s had %u", + G_STRFUNC, plen, g2_msg_raw_name(n->data, n->size), + node_infostr(n), n->size); + } + if (GNET_PROPERTY(log_bad_g2)) + dump_hex(stderr, "G2 Packet", n->data, n->size); + hostiles_dynamic_add(n->addr, + "cannot parse incoming messages", HSTL_GIBBERISH); + goto done; + } else if (GNET_PROPERTY(g2_debug) > 19) { + g_debug("%s(): received packet from %s", G_STRFUNC, node_infostr(n)); + g2_tfmt_tree_dump(t, stderr, G2FMT_O_PAYLEN); + } + + type = g2_msg_name_type(g2_tree_name(t)); + + switch (type) { + case G2_MSG_PI: + g2_node_handle_ping(n, t); + break; + case G2_MSG_PO: + g2_node_handle_pong(n, t); + break; + case G2_MSG_LNI: + g2_node_handle_lni(n, t); + break; + case G2_MSG_KHL: + g2_node_handle_khl(t); + break; + case G2_MSG_PUSH: + handle_push_request(n, t); + break; + case G2_MSG_Q2: + g2_node_handle_q2(n, t); + break; + case G2_MSG_QA: + case G2_MSG_QKA: + g2_node_handle_rpc_answer(n, t, type); + break; + case G2_MSG_QH2: + search_g2_results(n, t); + break; + default: + g2_node_drop(G_STRFUNC, n, t, "default"); + break; + } + +done: + g2_tree_free_null(&t); +} + +/** + * Initialization. + */ +void G_COLD +g2_node_init(void) +{ + /* + * Limit asnwering to UDP pings to 1 every G2_UDP_PING_FREQ seconds + */ + + g2_udp_pings = aging_make(G2_UDP_PING_FREQ, + host_addr_hash_func, host_addr_eq_func, wfree_host_addr); + + TOKENIZE_CHECK_SORTED(g2_q2_children); + TOKENIZE_CHECK_SORTED(g2_lni_children); + TOKENIZE_CHECK_SORTED(g2_q2_i); + TOKENIZE_CHECK_SORTED(g2_q2_md); +} + +/** + * Shutdown. + */ +void G_COLD +g2_node_close(void) +{ + aging_destroy(&g2_udp_pings); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/g2/node.h
Added
@@ -0,0 +1,63 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * G2 message handling. + * + * @author Raphael Manfredi + * @date 2014 + */ + +#ifndef _core_g2_node_h_ +#define _core_g2_node_h_ + +/* + * Public interface. + */ + +struct gnutella_node; +struct pmsg; +struct g2_tree; +struct host_addr; + +void g2_node_init(void); +void g2_node_close(void); + +void g2_node_handle(struct gnutella_node *n); + +void g2_node_send(const struct gnutella_node *n, struct pmsg *mb); +void g2_node_send_qht_reset(struct gnutella_node *n, int slots, int inf_val); +void g2_node_send_qht_patch(struct gnutella_node *n, + int seqno, int seqsize, bool compressed, int bits, + char *buf, int len); +void g2_node_send_lni(struct gnutella_node *n); + +bool g2_node_parse_address(const struct g2_tree *t, + struct host_addr *addr, uint16 *port) NON_NULL_PARAM((2, 3)); + +#endif /* _core_g2_node_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/g2/rpc.c
Added
@@ -0,0 +1,417 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * G2 RPCs. + * + * Within G2, transactional messages such as /PI or /QKR do not bear a MUID + * to be echoed in the reply, hence we cannot use the MUID as the key for the + * RPC transaction. + * + * This RPC layer is therefore solely based on the IP address of the targeted + * node (not even the port as we cannot be sure the reply will come bearing + * the listening port). It means we can only accept one transaction per host + * and per message type. + * + * @author Raphael Manfredi + * @date 2014 + */ + +#include "common.h" + +#include "rpc.h" + +#include "node.h" +#include "msg.h" +#include "tree.h" + +#include "core/nodes.h" + +#include "if/gnet_property_priv.h" + +#include "lib/cq.h" +#include "lib/gnet_host.h" +#include "lib/hashing.h" +#include "lib/hevset.h" +#include "lib/pmsg.h" +#include "lib/stacktrace.h" +#include "lib/stringify.h" +#include "lib/walloc.h" + +#include "lib/override.h" /* Must be the last header included */ + +enum g2_rpc_magic { G2_RPC_MAGIC = 0x56d9afc5 }; + +/** + * The key for RPC management. + */ +struct g2_rpc_key { + enum g2_msg type; /**< Type of message sent */ + host_addr_t addr; /**< The address of the remote host */ +}; + +/** + * A G2 RPC descriptor. + */ +struct g2_rpc { + enum g2_rpc_magic magic; + struct g2_rpc_key key; /**< RPC indexing key */ + g2_rpc_cb_t cb; /**< Callback to invoke */ + void *arg; /**< Additional callback argument */ + cevent_t *timeout_ev; /**< Callout queue timeout event */ +}; + +static inline void +g2_rpc_check(const struct g2_rpc * const gr) +{ + g_assert(gr != NULL); + g_assert(G2_RPC_MAGIC == gr->magic); +} + +static hevset_t *g2_rpc_pending; /** Records pending RPCs */ + +/** + * Primary key hashing routine. + */ +static uint +g2_rpc_key_hash(const void *key) +{ + const struct g2_rpc_key *rk = key; + + return integer_hash_fast(rk->type) ^ host_addr_hash(rk->addr); +} + +/** + * Secondary key hashing routine. + */ +static uint +g2_rpc_key_hash2(const void *key) +{ + const struct g2_rpc_key *rk = key; + + return integer_hash2(rk->type) ^ host_addr_hash2(rk->addr); +} + +/** + * Key equality routine. + */ +static bool +g2_rpc_key_eq(const void *a, const void *b) +{ + const struct g2_rpc_key *rka = a, *rkb = b; + + return rka->type == rkb->type && host_addr_equiv(rka->addr, rkb->addr); +} + +/** + * Free the RPC descriptor. + */ +static void +g2_rpc_free(struct g2_rpc *gr, bool in_shutdown) +{ + g2_rpc_check(gr); + + if (in_shutdown) { + (*gr->cb)(NULL, NULL, gr->arg); + } else { + hevset_remove(g2_rpc_pending, &gr->key); + } + + cq_cancel(&gr->timeout_ev); + gr->magic = 0; + WFREE(gr); +} + +/** + * RPC timeout callback. + */ +static void +g2_rpc_timeout(cqueue_t *cq, void *obj) +{ + struct g2_rpc *gr = obj; + + g2_rpc_check(gr); + + if (GNET_PROPERTY(g2_rpc_debug) > 1) { + g_debug("%s(): /%s RPC to %s timed out, calling %s()", + G_STRFUNC, g2_msg_type_name(gr->key.type), + host_addr_to_string(gr->key.addr), + stacktrace_function_name(gr->cb)); + } + + cq_zero(cq, &gr->timeout_ev); + (*gr->cb)(NULL, NULL, gr->arg); + g2_rpc_free(gr, FALSE); +} + +/** + * Compute maximum delay before we can issue an RPC to the specified host. + * + * @param host the host with whom we want to issue an RPC + * @param type the type of RPC message we wish to send + * + * @return 0 if we can launch the RPC, the amount of seconds to wait + * (conservative) if there is already a similar RPC pending. The amount + * is conservative in the sense that it is the time up to the final + * timeout, but if a reply comes back, we could launch it earlier. + */ +time_delta_t +g2_rpc_launch_delay(const gnet_host_t *host, enum g2_msg type) +{ + struct g2_rpc_key key; + struct g2_rpc *gr; + + key.type = type; + key.addr = gnet_host_get_addr(host); + + gr = hevset_lookup(g2_rpc_pending, &key); + + if (NULL == gr) + return 0; /* Can issue RPC immediately */ + + return cq_remaining(gr->timeout_ev) / 1000; /* Seconds */ +} + +/** + * Start a G2 RPC with the specified host. + * + * @param host the host to which message is sent + * @param mb the message to send + * @param cb if non-NULL, callback to invoke on reply or timeout + * @param arg additional callback argument + * @param timeout amount of seconds before timeout + * + * @return TRUE if we initiated the RPC, FALSE if another of the same + * kind was already in progress with the host. + */ +bool +g2_rpc_launch(const gnet_host_t *host, pmsg_t *mb, + g2_rpc_cb_t cb, void *arg, unsigned timeout) +{ + struct g2_rpc *gr; + struct g2_rpc_key key; + gnutella_node_t *n; + + key.type = g2_msg_type_mb(mb); + key.addr = gnet_host_get_addr(host); + + /* + * Because there is no MUID in /PI and /QKR messages, we cannot use that + * as a key to detect the RPC reply. Therefore, we use the message type + * and the IP address of the host. When a /PO or /QKA comes back, we'll + * be able to see whether we had a pending RPC from that host for that + * type of transaction. + * + * The downside is that we can only have one pending RPC at a time of + * a given kind towards a given IP address. We don't use the port in + * the key because we cannot assume the reply will come from the same port + * we sent the message to, if the remote host is behind NAT or does not + * use its listening UDP socket to reply. + */ + + if (hevset_contains(g2_rpc_pending, &key)) { + if (GNET_PROPERTY(g2_rpc_debug)) { + g_debug("%s(): cannot issue /%s RPC to %s: concurrent request", + G_STRFUNC, g2_msg_type_name(key.type), + gnet_host_to_string(host)); + } + + return FALSE; + } + + /* + * Make sure the node is valid. + */ + + n = node_udp_g2_get_addr_port(key.addr, gnet_host_get_port(host)); + + if (NULL == n) { + if (GNET_PROPERTY(g2_rpc_debug)) { + g_debug("%s(): cannot issue /%s RPC to %s: cannot get G2 node", + G_STRFUNC, g2_msg_type_name(key.type), + gnet_host_to_string(host)); + } + + return FALSE; /* Invalid node, or G2 disabled */ + } + + /* + * Good, we can issue the RPC. + */ + + WALLOC(gr); + gr->magic = G2_RPC_MAGIC; + gr->key = key; /* struct copy */ + gr->cb = cb; + gr->arg = arg; + gr->timeout_ev = cq_main_insert(timeout * 1000, g2_rpc_timeout, gr); + + hevset_insert(g2_rpc_pending, gr); + + if (GNET_PROPERTY(g2_rpc_debug) > 1) { + g_debug("%s(): issuing /%s RPC to %s, timeout %u sec%s", + G_STRFUNC, g2_msg_type_name(key.type), + gnet_host_to_string(host), timeout, plural(timeout)); + } + + /* + * Do not send RPCs reliably: this can cause problems if we don't receive + * the ACK backm yet the message was received and processed remotely: the + * remote host will send a reply back and the message will still appear to + * be "unsent" locally. + * + * Furthermore, this alleviates the need for the remote side to actually + * acknowledge the request: targeted hosts can be busy so it's best to + * make the RPC "unreliable" to limit processing and bandwidth requirements. + */ + + g2_node_send(n, mb); + + return TRUE; +} + +/** + * @return sending message type given RPC message reply type. + */ +enum g2_msg +g2_rpc_send_type(const enum g2_msg type) +{ + switch (type) { + /* reply type ---> request type */ + case G2_MSG_PO: return G2_MSG_PI; + case G2_MSG_QKA: return G2_MSG_QKR; + case G2_MSG_KHLA: return G2_MSG_KHLR; + case G2_MSG_QA: return G2_MSG_Q2; + default: return G2_MSG_MAX; /* Unknown, cannot be an RPC */ + } +} + +/** + * Notification that a message was received that could be the answer to + * a pending RPC. + * + * @param n the node from which we got the message + * @param t the received message tree + * + * @return TRUE if the message was indeed an RPC reply, FALSE otherwise. + */ +bool +g2_rpc_answer(const gnutella_node_t *n, const g2_tree_t *t) +{ + struct g2_rpc *gr; + struct g2_rpc_key key; + enum g2_msg type; + + type = g2_msg_name_type(g2_tree_name(t)); + + key.type = g2_rpc_send_type(type); + key.addr = n->addr; + + gr = hevset_lookup(g2_rpc_pending, &key); + + if (NULL == gr) { + /* + * No known RPC, but wait... we can receive a /QKA when we issue a /Q2 + * and the query key we knew for the remote host has expired, hence + * we must look whether there is not a /Q2 pending as well in that + * case. Once again, the lack of MUID in these messages is a handicap. + */ + + if (G2_MSG_QKA == type) { + key.type = G2_MSG_Q2; + gr = hevset_lookup(g2_rpc_pending, &key); + if (gr != NULL) + goto found; /* Sent a /Q2, got a /QKA back */ + } + + if (GNET_PROPERTY(g2_rpc_debug) > 1) { + g_debug("%s(): unexpected /%s RPC reply from %s", + G_STRFUNC, g2_msg_type_name(key.type), node_infostr(n)); + } + + return FALSE; + } + +found: + + /* + * Got a reply for an RPC we sent, based solely on message type and + * source address of the message. This is weak, but G2 works like that. + * + * Weakness comes from the fact that we cannot have multiple RPCs with + * a same IP address but towards different ports, nor have concurrent + * RPCs with the same host for several different by similar requests + * (although this can be viewed as anti-hammering, servers should protect + * against that in different ways, a crippled protocol not being an answer). + * + * The only transaction where we could use the MUID is /Q2 -> /QA but we + * leave that check to the GUESS layer and make sure here that we have only + * one single RPC transaction at a time with a given IP address. + */ + + if (GNET_PROPERTY(g2_rpc_debug) > 2) { + g_debug("%s(): /%s RPC to %s got a /%s reply, calling %s()", + G_STRFUNC, g2_msg_type_name(gr->key.type), + host_addr_to_string(gr->key.addr), g2_tree_name(t), + stacktrace_function_name(gr->cb)); + } + + (*gr->cb)(n, t, gr->arg); + g2_rpc_free(gr, FALSE); + + return TRUE; +} + +/** + * Initialize the G2 RPC layer. + */ +void G_COLD +g2_rpc_init(void) +{ + g2_rpc_pending = hevset_create_any( + offsetof(struct g2_rpc, key), + g2_rpc_key_hash, g2_rpc_key_hash2, g2_rpc_key_eq); +} + +static void +g2_rpc_free_kv(void *val, void *unused_x) +{ + (void) unused_x; + + g2_rpc_free(val, TRUE); +} + +/** + * Shutdown the G2 RPC layer. + */ +void G_COLD +g2_rpc_close(void) +{ + hevset_foreach(g2_rpc_pending, g2_rpc_free_kv, NULL); + hevset_free_null(&g2_rpc_pending); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/g2/rpc.h
Added
@@ -0,0 +1,69 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * G2 RPCs. + * + * @author Raphael Manfredi + * @date 2014 + */ + +#ifndef _core_g2_rpc_h_ +#define _core_g2_rpc_h_ + +#include "lib/pmsg.h" +#include "lib/gnet_host.h" +#include "lib/timestamp.h" /* For time_delta_t */ + +struct gnutella_node; +struct g2_tree; +enum g2_msg; + +/** + * RPC reception callback. + * + * @param n the G2 node replying (NULL on timeout) + * @param t the message tree response (NULL on timeout) + * @param arg user-defined callback parameter + */ +typedef void (*g2_rpc_cb_t)(const struct gnutella_node *n, + const struct g2_tree *t, void *arg); + +/* + * Public interface. + */ + +void g2_rpc_init(void); +void g2_rpc_close(void); + +time_delta_t g2_rpc_launch_delay(const gnet_host_t *host, enum g2_msg type); +bool g2_rpc_launch(const gnet_host_t *host, pmsg_t *mb, + g2_rpc_cb_t cb, void *arg, unsigned timeout); +bool g2_rpc_answer(const struct gnutella_node *n, const struct g2_tree *t); + +#endif /* _core_g2_rpc_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/g2/tfmt.c
Added
@@ -0,0 +1,267 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * G2 tree formatting (for logging purposes). + * + * @author Raphael Manfredi + * @date 2014 + */ + +#include "common.h" + +#include "tfmt.h" + +#include "tree.h" + +#include "lib/etree.h" +#include "lib/log.h" +#include "lib/ostream.h" +#include "lib/str.h" +#include "lib/stringify.h" +#include "lib/unsigned.h" + +#include "lib/override.h" /* Must be the last header included */ + +#define TFMT_LAST 'L' /**< Flags the last child at given depth */ +#define TFMT_MIDDLE 'M' /**< Flags a middle child at given depth */ + +/** + * Tree traversal context. + */ +struct g2_tfmt { + ostream_t *os; /**< Output stream */ + unsigned depth; /**< Current tree depth */ + uint32 options; /**< Formatting options */ + str_t *nstate; /**< Node state, 1 byte per level */ +}; + +/** + * Leaving scope. + */ +static inline void +g2_tfmt_leaving(struct g2_tfmt *ctx) +{ + g_assert(uint_is_positive(ctx->depth)); + + ctx->depth--; + str_chop(ctx->nstate); +} + +/** + * Indent formatting. + */ +static void +g2_tfmt_indent(struct g2_tfmt *ctx) +{ + uint i; + + /* + * The ctx->nstate string is used to remember whether the child of + * the given level (as indexed by the character position within the + * string) is the last one or not, so that we know how to output the + * indent for that particular depth: either a '\' to signal the last + * child at the right-most position, or a '.' if we are underneath + * the last child of a given depth. + */ + + + for (i = 1; i < ctx->depth; i++) { + bool is_last_indent = i + 1 == ctx->depth; + bool last = TFMT_LAST == str_at(ctx->nstate, i); + if (last) + ostream_putc(ctx->os, is_last_indent ? '\\' : '.'); + else + ostream_putc(ctx->os, '|'); + if (!is_last_indent) + ostream_putc(ctx->os, ' '); + else + ostream_putc(ctx->os, '-'); + } + + ostream_putc(ctx->os, '+'); + ostream_putc(ctx->os, ' '); +} + +/** + * @return whether payload is printable. + */ +static bool +g2_tfmt_is_printable(const void *payload, size_t paylen) +{ + const uchar *p = payload; + size_t n; + + for (n = paylen; n > 0; n--, p++) { + if (!isprint(*p)) + return FALSE; + } + + return TRUE; +} + +/** + * Format the given payload. + */ +static void +g2_tfmt_payload(struct g2_tfmt *ctx, const void *payload, size_t paylen) +{ + ostream_putc(ctx->os, ':'); + ostream_putc(ctx->os, ' '); + + if (g2_tfmt_is_printable(payload, paylen)) { + const uchar *p = payload; + size_t i; + + ostream_putc(ctx->os, '\''); + + for (i = paylen; i > 0; i--) { + int c = *p++; + + if ('\'' == c || '\\' == c) { + ostream_putc(ctx->os, '\\'); + ostream_putc(ctx->os, c); + } else { + ostream_putc(ctx->os, c); + } + } + + ostream_putc(ctx->os, '\''); + } else { + ostream_puts(ctx->os, " <BINARY>"); + } +} + +/** + * Tree handler on each node entry. + * + * @return FALSE if we need to abort the traversal of the branch. + */ +static bool +g2_tfmt_handle_enter(const void *node, void *data) +{ + const g2_tree_t *n = node; + struct g2_tfmt *ctx = data; + const void *payload; + size_t paylen; + const char *name; + bool last; + + last = NULL == g2_tree_next_sibling(node); + str_putc(ctx->nstate, last ? TFMT_LAST : TFMT_MIDDLE); + + ctx->depth++; + g2_tfmt_indent(ctx); + + name = g2_tree_name(n); + if (NULL == name) { + ostream_puts(ctx->os, "<NO NAME>"); + } else { + ostream_puts(ctx->os, name); + } + + payload = g2_tree_node_payload(n, &paylen); + + if (payload != NULL) { + if (ctx->options & G2FMT_O_PAYLEN) + ostream_printf(ctx->os, " (%zu byte%s)", paylen, plural(paylen)); + + if (ctx->options & G2FMT_O_PAYLOAD) + g2_tfmt_payload(ctx, payload, paylen); + } + + ostream_putc(ctx->os, '\n'); + + return TRUE; +} + +/** + * Tree handler on each node leaving. + */ +static void +g2_tfmt_handle_leave(void *node, void *data) +{ + const g2_tree_t *n = node; + struct g2_tfmt *ctx = data; + + (void) n; + + g2_tfmt_leaving(ctx); +} + +/** + * Format tree to given output stream. + * + * @param root the root of the tree + * @param os the output stream where tree is formatted + * @param options formatting options + * + * @return TRUE on success (from the output stream's point of view). + */ +bool +g2_tfmt_tree(const g2_tree_t *root, ostream_t *os, uint32 options) +{ + struct g2_tfmt ctx; + + ZERO(&ctx); + ctx.os = os; + ctx.options = options; + ctx.nstate = str_new(8); + + g2_tree_enter_leave(deconstify_pointer(root), + g2_tfmt_handle_enter, g2_tfmt_handle_leave, &ctx); + + g_assert(0 == ctx.depth); /* Sound traversal */ + + str_destroy_null(&ctx.nstate); + + return !ostream_has_ioerr(os); +} + +/** + * Convenience routine: dump formatted tree to file. + * + * @param root the root of the tree + * @param f the file to which we should dump the tree + * @param options formatting options (see g2_tfmt_tree() comments) + * + * @return TRUE on success (from the output stream's point of view). + */ +bool +g2_tfmt_tree_dump(const g2_tree_t *root, FILE *f, uint32 options) +{ + ostream_t *os; + + if (!log_file_printable(f)) + return FALSE; + + os = ostream_open_file(f); + g2_tfmt_tree(root, os, options); + + return ostream_close(os); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/g2/tfmt.h
Added
@@ -0,0 +1,55 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * G2 tree formatting. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _core_g2_tfmt_h_ +#define _core_g2_tfmt_h_ + +/** + * Formatter options. + */ +#define G2FMT_O_PAYLOAD (1 << 0) /**< Dump payloads as well */ +#define G2FMT_O_PAYLEN (1 << 1) /**< Show payload lengths */ + +/* + * Public interface. + */ + +struct ostream; +struct g2_tree; + +bool g2_tfmt_tree(const struct g2_tree *root, struct ostream *os, uint32 opt); +bool g2_tfmt_tree_dump(const struct g2_tree *root, FILE *f, uint32 opt); + +#endif /* _core_g2_tfmt_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/g2/tree.c
Added
@@ -0,0 +1,770 @@ +/* + * Copyright (c) 2012, 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * G2 packet management. + * + * A G2 packet is represented as a tree, much alike an XML tree, hence the + * "tree" name of its interface. + * + * Relevant documentation extracted from the g2.doxu.org website: + * + * INTRODUCTION + * + * All Gnutella2 communications are represented with Gnutella2 lightweight + * tree packets. This applies everywhere from TCP stream communications to + * reliable UDP transmissions to HTTP packet exchanges (where protocol data + * has been negotiated). Each tree packet may contain meaningful payload data + * and/or one or more child packets, allowing complex document structures + * to be created and extended in a backward compatible manner. + * + * The concept can be compared to an XML document tree. The "packets" + * are elements, which can in turn contain zero or more child elements + * (packets). The payload of a packet is like the attributes of an XML + * element. However, serializing XML has a lot of overhead due to all the + * naming, even in a compact binary form. The Gnutella2 packet structure + * makes a compromise: it names elements (packets), allowing them to be + * globally recognized and understood, without knowledge of their format - + * and stores attributes as binary payloads, requiring knowledge of their + * content to parse them. + * + * Thus the element (packet or child packet) is the finite unit of + * comprehension. This system provides an excellent trade-off between format + * transparency and compactness. + * + * CONTENTS + * + * Each Gnutella2 packet contains: + * + * - Control flags + * - A type name meaningful in the namespace of the packet's parent or context + * - A length (or implied length) + * - Payload data of a format specific to the packet type name and namespace + * - Child packets existing in the namespace of this packet + * + * NAMESPACE CONSIDERATIONS + * + * Each packet contains a relative type name of up to 8 bytes in length, + * which are case sensitive. The packet type name is meaningful only in + * the namespace of the packet's parent, or in the absence of a parent, + * the context of the packet (e.g. root level TCP stream). + + * This means that, for example a packet "A" inside packet "X" is different + * to a packet "A" inside packet "Y". Packets are of the same type only if + * their fully qualified absolute type names are equal. + + * As a convention, when discussing packet type names, they will be noted in + * their absolute form with a URL style slash (/) separating each level. In + * the above example, the first packet is "/X/A" while the second is + * "/Y/A". It is clear now that the packets are of different types. + + * Packet type names can contain from 1 to 8 bytes inclusive, and none + * of these bytes may be a null (0). Community approved packets are by + * convention named with uppercase characters and digits, for example + * "PUSH". Private packet types are by convention named with lowercase + * characters and digits, prefixed with the vendor code of the owner, + * for example "RAZAclr2". + * + * @author Raphael Manfredi + * @date 2012, 2014 + */ + +#include "common.h" + +#if 0 +#define TREE_TESTING +#endif + +#include "tree.h" + +#include "lib/atoms.h" +#include "lib/etree.h" +#include "lib/halloc.h" +#include "lib/strtok.h" +#include "lib/walloc.h" + +#ifdef TREE_TESTING +#include "tfmt.h" +#include "frame.h" +#endif + +#include "lib/override.h" /* Must be the last header included */ + +enum g2_tree_magic { G2_TREE_MAGIC = 0x67f8b9e7 }; + +/** + * A G2 packet (tree structure). + */ +struct g2_tree { + enum g2_tree_magic magic; /**< Magic number */ + const char *name; /**< Node name (atom) */ + void *payload; /**< Payload buffer, NULL if none */ + size_t paylen; /**< Payload length */ + node_t node; /**< Embedded tree node */ + unsigned copied:1; /**< Whether payload was copied */ +}; + +static inline void +g2_tree_check(const struct g2_tree * const t) +{ + g_assert(t != NULL); + g_assert(G2_TREE_MAGIC == t->magic); +} + +/** + * Assert that tree is a valid pointer. + */ +bool +g2_tree_is_valid(const struct g2_tree * const t) +{ + return t != NULL && G2_TREE_MAGIC == t->magic; +} + +/** + * Internal lookup of the tree root. + * + * @return the root of the tree. + */ +static g2_tree_t * +g2_tree_find_root(const g2_tree_t *root) +{ + etree_t t; + + etree_init_root(&t, root, FALSE, offsetof(g2_tree_t, node)); + return etree_find_root(&t, root); +} + +/** + * Node matching function against name. + * + * @param item the item to check + * @param data the name to match against + */ +static bool +g2_tree_has_name(const void *item, void *data) +{ + const g2_tree_t *root = item; + const char *name = data; + + return 0 == strcmp(root->name, name); +} + +/** + * Internal lookup of a node sibling, starting at specified root. + * + * @return the first sibling bearing the specified name, NULL if none. + */ +static g2_tree_t * +g2_tree_find_sibling(const g2_tree_t *root, const char *name) +{ + etree_t t; + + g_assert(name != NULL); + + if (NULL == root) + return NULL; + + g2_tree_check(root); + etree_init_root(&t, root, FALSE, offsetof(g2_tree_t, node)); + + return etree_find_sibling(&t, root, + g2_tree_has_name, deconstify_char(name)); +} + +/** + * Fetch the subtree identified by its path, "/" being the top root in any case. + * + * The lookup starts at the specified node, but if the specified root is part + * of a larger tree, the search can be directed to that bigger tree root by + * prefixing the search with "/". + * + * As usual in tree paths, "." is the current node and ".." its parent node, + * the parent of the root being the root itself. + * + * The semantics of the root-anchored search are different than the ones of + * a local search: if at the root of the /QH2 packet one looks for "/QH2/H" + * it will bring back the "H" child node of the packet. Therefore the leading + * "/QH2/" is only there to make sure we're dealing with a /QH2 packet. + * + * @param root the root of the G2 packet structure + * @param path the path to the tree to be retrieved (eg: "/QH2/H") + * + * @return the root of the tree if path was found, NULL otherwise. + */ +g2_tree_t * +g2_tree_lookup(const g2_tree_t *root, const char *path) +{ + const g2_tree_t *r; + strtok_t *st; + const char *tok; + etree_t t; + + g2_tree_check(root); + g_assert(path != NULL); + + st = strtok_make_nostrip(path); + etree_init_root(&t, root, FALSE, offsetof(g2_tree_t, node)); + + /* + * If path is anchored, make sure the root element bears the proper name. + */ + + if ('/' == path0) { + r = g2_tree_find_root(root); + (void) strtok_next(st, "/"); /* Swallow leading '/' */ + for (;;) { + tok = strtok_next(st, "/"); + if (NULL == tok) /* Looking for "/", root of the tree */ + goto done; /* We found it! */ + if G_UNLIKELY('.' == tok0) { + if (0 == strcmp(tok, ".")) /* "." is the current node */ + continue; + if (0 == strcmp(tok, "..")) /* ".." is the current node */ + continue; /* because we're at the root */ + } + if (0 != strcmp(tok, r->name)) { + r = NULL; + goto done; + } + break; /* Validated root is properly named */ + } + } else { + r = root; + } + + /* + * We can now look for children that bear the proper names. + */ + + while (NULL != (tok = strtok_next(st, "/"))) { + if G_UNLIKELY('.' == tok0) { + if (0 == strcmp(tok, ".")) /* "." is the current node */ + continue; + if (0 == strcmp(tok, "..")) { /* ".." is the parent node */ + const g2_tree_t *parent = etree_parent(&t, r); + if (parent != NULL) + r = parent; /* Not at the tree root */ + continue; + } + } + r = etree_first_child(&t, r); + if (NULL == r) /* No children */ + goto done; + r = g2_tree_find_sibling(r, tok); + if (NULL == r) + goto done; + } + + /* FALL THROUGH */ + +done: + strtok_free_null(&st); + return deconstify_pointer(r); +} + +/** + * @return the name of the node. + */ +const char * +g2_tree_name(const g2_tree_t *node) +{ + g2_tree_check(node); + + return node->name; +} + +/** + * @return the root of the tree. + */ +g2_tree_t * +g2_tree_root(const g2_tree_t *node) +{ + g2_tree_check(node); + + return g2_tree_find_root(node); +} + +/** + * Fetch the payload of this node. + * + * @param node the G2 node we're querying + * @param paylen if non-NULL, where the size of the payload is returned + * + * @return the start of the payload held in the node, NULL if none. + */ +const void * +g2_tree_node_payload(const g2_tree_t *node, size_t *paylen) +{ + g2_tree_check(node); + + if (NULL == node->payload) { + if (paylen != NULL) + *paylen = 0; + return NULL; + } + + if (paylen != NULL) + *paylen = node->paylen; + + return node->payload; +} + +/** + * Fetch the payload of a tree item identified by its sub-path. + * + * See g2_tree_lookup() for the semantics of the supplied path. + * + * It is possible to request a payload in a sub-tree underneath the supplied + * node, of course. + * + * @param root the G2 root of the (sub)tree + * @param path the path to the item to be retrieved (eg: "URN") + * @param paylen if non-NULL, where the size of the payload is returned + * + * @return the start of the payload held in the tree, NULL if none or if the + * item does not exist. + */ +const void * +g2_tree_payload(const g2_tree_t *root, const char *path, size_t *paylen) +{ + const g2_tree_t *n; + + n = g2_tree_lookup(root, path); + if (NULL == n) + return NULL; + + return g2_tree_node_payload(n, paylen); +} + +/** + * Iterator over the immediate children of a node. + * + * @param root the G2 root of the tree + * @param cb callback to invoke on each immediate child of the root + * @param data user-supplied data passed to the callback + */ +void +g2_tree_child_foreach(const g2_tree_t *root, data_fn_t cb, void *data) +{ + etree_t t; + + g2_tree_check(root); + g_assert(cb != NULL); + + etree_init_root(&t, root, FALSE, offsetof(g2_tree_t, node)); + etree_foreach(&t, cb, data); +} + +/** + * @return the first child of the node, NULL if no child. + */ +g2_tree_t * +g2_tree_first_child(const g2_tree_t *root) +{ + etree_t t; + + g2_tree_check(root); + + etree_init_root(&t, root, FALSE, offsetof(g2_tree_t, node)); + return etree_first_child(&t, root); +} + +/** + * @return the next sibling of a supplied node, NULL if no more siblings. + */ +g2_tree_t * +g2_tree_next_sibling(const g2_tree_t *child) +{ + etree_t t; + + g2_tree_check(child); + + etree_init_root(&t, child, FALSE, offsetof(g2_tree_t, node)); + return etree_next_sibling(&t, child); +} + +/** + * @return next sibling bearing the same name, NULL if none. + */ +g2_tree_t * +g2_tree_next_twin(const g2_tree_t *child) +{ + g2_tree_check(child); + + return g2_tree_find_sibling(child, child->name); +} + +/** + * Create a node without any payload. + * + * @param name name of the node + * + * @return a new node with no payload. + */ +g2_tree_t * +g2_tree_alloc_empty(const char *name) +{ + g2_tree_t *n; + + WALLOC0(n); + n->magic = G2_TREE_MAGIC; + n->name = atom_str_get(name); + + return n; +} + +/** + * Release memory used by node. + */ +static void +g2_tree_free_node(void *data) +{ + g2_tree_t *n = data; + + g2_tree_check(n); + + if (n->payload != NULL && n->copied) + hfree(n->payload); + + atom_str_free_null(&n->name); + n->payload = NULL; + n->magic = 0; + WFREE(n); +} + +/** + * Create a node with associated payload. + * + * The payload data are NOT copied. + * + * @param name name of the node + * @param payload the start of the payload + * @param paylen the length of the payload, in bytes + * + * @return a new node. + */ +g2_tree_t * +g2_tree_alloc(const char *name, const void *payload, size_t paylen) +{ + g2_tree_t *n; + + n = g2_tree_alloc_empty(name); + n->payload = deconstify_pointer(payload); + n->paylen = paylen; + n->copied = FALSE; + + return n; +} + +/** + * Create a node with associated payload. + * + * The payload data are copied. + * + * @param name name of the node + * @param payload the start of the payload + * @param paylen the length of the payload, in bytes + * @param copy whether payload data must be copied + * + * @return a new node. + */ +g2_tree_t * +g2_tree_alloc_copy(const char *name, const void *payload, size_t paylen) +{ + g2_tree_t *n; + + n = g2_tree_alloc_empty(name); + n->payload = hcopy(payload, paylen); + n->paylen = paylen; + n->copied = TRUE; + + return n; +} + +/** + * Set payload for node, replacing any older payload. + * + * @param root the node to which we're adding a payload + * @param payload the start of the payload + * @param paylen the length of the payload, in bytes + * @param copy whether payload data must be copied + */ +void +g2_tree_set_payload(g2_tree_t *root, const void *payload, + size_t paylen, bool copy) +{ + g2_tree_check(root); + + if (root->payload != NULL && root->copied) + hfree(root->payload); + + root->payload = copy ? hcopy(payload, paylen) : + deconstify_gpointer(payload); + root->paylen = paylen; + root->copied = booleanize(copy); +} + +/** + * Append data to node's payload, copying data. + * + * If there was no payload yet, this becomes the new payload, otherwise it + * is concatenated at the end. The payload buffer is resized as needed to + * make sure everything fits. + * + * @param root the node to which we're adding a payload + * @param payload the start of the payload to concatenate at the end + * @param paylen the length of the payload, in bytes + * + * @return the new length of the payload. + */ +size_t +g2_tree_append_payload(g2_tree_t *root, const void *payload, size_t paylen) +{ + size_t newlen; + + g2_tree_check(root); + + newlen = root->paylen + paylen; + + if (0 == paylen) + return newlen; /* Nothing to do and no payload copying needed */ + + g_assert(payload != NULL); + + /* + * If there was already a payload and it was not copied, we need to + * allocate new buffer and copy the old data to it. + * + * Otherwise, resize the old buffer so that it can hold the new data. + */ + + if (root->payload != NULL) { + if (!root->copied) { + void *p = halloc(newlen); + memcpy(p, root->payload, root->paylen); + root->payload = p; + root->copied = TRUE; + } else { + root->payload = hrealloc(root->payload, newlen); + } + } else { + root->payload = halloc(newlen); + root->copied = TRUE; + } + + memcpy(ptr_add_offset(root->payload, root->paylen), payload, paylen); + root->paylen = newlen; + + g_assert(root->copied); + + return newlen; +} + +/** + * Add node as an immediate child of the supplied node. + */ +void +g2_tree_add_child(g2_tree_t *parent, g2_tree_t *child) +{ + etree_t t; + + g2_tree_check(parent); + g2_tree_check(child); + + etree_init_root(&t, parent, FALSE, offsetof(g2_tree_t, node)); + etree_prepend_child(&t, parent, child); +} + +/** + * Reverse the order of children in node. + */ +void +g2_tree_reverse_children(g2_tree_t *root) +{ + etree_t t; + + g2_tree_check(root); + + etree_init_root(&t, root, FALSE, offsetof(g2_tree_t, node)); + etree_reverse_children(&t, root); +} + +/** + * Free sub-tree, destroying all its items and removing the reference in + * the parent node, if any. + */ +static void +g2_tree_free(g2_tree_t *root) +{ + etree_t t; + + g2_tree_check(root); + + etree_init_root(&t, root, FALSE, offsetof(g2_tree_t, node)); + etree_sub_free(&t, root, g2_tree_free_node); +} + +/** + * Free tree, nullify its pointer. + */ +void +g2_tree_free_null(g2_tree_t **root_ptr) +{ + g2_tree_t *root = *root_ptr; + + if (root != NULL) { + g2_tree_free(root); + *root_ptr = NULL; + } +} + +/** + * Recursively apply two functions on each node, in depth-first mode. + * + * The first function "enter" is called when we enter a node and the + * second "leave" is called when all the children have been processed, + * before returning. + * + * Traversal is done in such a way that the "leave" function can safely + * free up the local node. + * + * Traversal of a branch is aborted when "enter" returns FALSE, i.e. the + * children of the node are not traversed and the "leave" callback is not + * called since we did not enter... + */ +void +g2_tree_enter_leave(g2_tree_t *root, + match_fn_t enter, data_fn_t leave, void *data) +{ + etree_t t; + + g2_tree_check(root); + + etree_init_root(&t, root, FALSE, offsetof(g2_tree_t, node)); + etree_traverse(&t, ETREE_TRAVERSE_ALL | ETREE_CALL_AFTER, + 0, ETREE_MAX_DEPTH, enter, leave, data); +} + +#ifdef TREE_TESTING + +#define LARGE_PAYLOAD 258 /* Force 2-byte payload length */ + +void G_COLD +g2_tree_test(void) +{ + g2_tree_t *root, *first, *node, *c2, *retrieved; + const char root_payload = "root payload"; + const char second = "second payload"; + size_t needed, length, rlen; + void *buffer, *large; + bool ok; + + g_debug("%s() starting...", G_STRFUNC); + + /* + * Tree primitives testing. + */ + + large = halloc(LARGE_PAYLOAD); + + root = g2_tree_alloc_copy("root", root_payload, strlen(root_payload)); + g2_tree_add_child(root, + g2_tree_alloc_copy("schild", second, strlen(second))); + first = g2_tree_alloc_empty("rchild"); + g2_tree_add_child(root, first); + g2_tree_add_child(first, (c2 = g2_tree_alloc_empty("c2"))); + g2_tree_add_child(c2, g2_tree_alloc_empty("d2")); + g2_tree_add_child(c2, g2_tree_alloc_empty("d1")); + g2_tree_add_child(first, g2_tree_alloc_empty("c3")); + g2_tree_add_child(first, g2_tree_alloc("c1", large, LARGE_PAYLOAD)); + + ok = g2_tfmt_tree_dump(root, stderr, G2FMT_O_PAYLOAD | G2FMT_O_PAYLEN); + g_assert(ok); + + node = g2_tree_lookup(first, "/root/rchild/c2"); + g_assert(node == c2); + node = g2_tree_lookup(first, "/root/bar/c2"); + g_assert(node == NULL); + node = g2_tree_lookup(first, "/root/rchild/c4"); + g_assert(node == NULL); + node = g2_tree_lookup(root, "/root/rchild/c2"); + g_assert(node == c2); + node = g2_tree_lookup(root, "/root/rchild/c1/../c2"); + g_assert(node == c2); + node = g2_tree_lookup(root, "/root/rchild/c1/../c2/../c2"); + g_assert(node == c2); + node = g2_tree_lookup(root, "/root/rchild/c4/../c2"); + g_assert(node == NULL); /* Since there is no "c4" */ + node = g2_tree_lookup(root, "/root/rchild/././c2"); + g_assert(node == c2); + node = g2_tree_lookup(first, "c4"); + g_assert(node == NULL); + node = g2_tree_lookup(first, "c2"); + g_assert(node == c2); + node = g2_tree_lookup(first, "./c2"); + g_assert(node == c2); + + /* + * Serialization testing. + */ + + needed = g2_frame_serialize(root, NULL, 0); + g_debug("%s(): need %zu bytes to serialize tree", G_STRFUNC, needed); + + buffer = halloc(needed); + length = g2_frame_serialize(root, buffer, needed); + g_assert(length == needed); + + retrieved = g2_frame_deserialize(buffer, length, &rlen, TRUE); + g_assert(retrieved != NULL); + g_assert(length == rlen); + + g_debug("%s(): deserialized tree:", G_STRFUNC); + ok = g2_tfmt_tree_dump(retrieved, stderr, G2FMT_O_PAYLOAD | G2FMT_O_PAYLEN); + g_assert(ok); + + node = g2_tree_lookup(retrieved, "/root/rchild/c2"); + g_assert(node != NULL); + g_assert(node != c2); + g_assert(0 == strcmp("c2", g2_tree_name(node))); + + HFREE_NULL(buffer); + HFREE_NULL(large); + g2_tree_free_null(&root); + g2_tree_free_null(&retrieved); + + g_debug("%s() done.", G_STRFUNC); +} + +#else /* !TREE_TESTING */ +void G_COLD +g2_tree_test(void) +{ + /* Nothing */ +} +#endif /* TREE_TESTING */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/g2/tree.h
Added
@@ -0,0 +1,81 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * G2 packet management. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _core_g2_tree_h_ +#define _core_g2_tree_h_ + +struct g2_tree; +typedef struct g2_tree g2_tree_t; + +/* + * Public interface. + */ + +bool g2_tree_is_valid(const struct g2_tree * const t); +g2_tree_t *g2_tree_lookup(const g2_tree_t *root, const char *path); +const char *g2_tree_name(const g2_tree_t *node); +g2_tree_t *g2_tree_root(const g2_tree_t *node); +const void *g2_tree_payload(const g2_tree_t *root, const char *path, size_t *l); +const void *g2_tree_node_payload(const g2_tree_t *node, size_t *paylen); +void g2_tree_child_foreach(const g2_tree_t *root, data_fn_t cb, void *data); +g2_tree_t *g2_tree_first_child(const g2_tree_t *root); +g2_tree_t *g2_tree_next_sibling(const g2_tree_t *child); +g2_tree_t *g2_tree_next_twin(const g2_tree_t *child); +g2_tree_t *g2_tree_alloc_empty(const char *name); +g2_tree_t *g2_tree_alloc(const char *name, const void *payload, size_t paylen); +g2_tree_t *g2_tree_alloc_copy(const char *name, + const void *payload, size_t paylen); +void g2_tree_set_payload(g2_tree_t *root, + const void *payload, size_t paylen, bool copy); +size_t g2_tree_append_payload(g2_tree_t *root, + const void *payload, size_t paylen); +void g2_tree_add_child(g2_tree_t *parent, g2_tree_t *child); +void g2_tree_reverse_children(g2_tree_t *node); +void g2_tree_free_null(g2_tree_t **root_ptr); + +void g2_tree_enter_leave(g2_tree_t *root, + match_fn_t enter, data_fn_t leave, void *data); + +void g2_tree_test(void); + +static inline void +g2_tree_free_null_const(const g2_tree_t **root_ptr) +{ + g2_tree_free_null(deconstify_pointer(root_ptr)); +} + +#define G2_TREE_CHILD_FOREACH(t, c) \ + for (c = g2_tree_first_child(t); c != NULL; c = g2_tree_next_sibling(c)) + +#endif /* _core_g2_tree_h_ */ +
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/gdht.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/gdht.c
Changed
@@ -52,10 +52,12 @@ #include "lib/base32.h" #include "lib/bstr.h" #include "lib/endian.h" -#include "lib/glib-missing.h" +#include "lib/hikset.h" #include "lib/sha1.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ #define MAX_PROXIES 32 /**< Max push-proxies we collect from a PROX */ @@ -63,8 +65,8 @@ /** * Hash table holding all the pending lookups by KUID. */ -static GHashTable *sha1_lookups; /* KUID -> struct sha1_lookup * */ -static GHashTable *guid_lookups; /* KUID -> struct guid_lookup * */ +static hikset_t *sha1_lookups; /* KUID -> struct sha1_lookup * */ +static hikset_t *guid_lookups; /* KUID -> struct guid_lookup * */ typedef enum { SHA1_LOOKUP_MAGIC = 0x5fd660bfU @@ -101,7 +103,7 @@ const kuid_t *id; /**< ID being looked for (atom) */ const guid_t *guid; /**< Servent's GUID (atom) */ host_addr_t addr; /**< Servent's address */ - guint16 port; /**< Servent's port */ + uint16 port; /**< Servent's port */ unsigned nope:1; /**< Was looking for a NOPE instead of a PROX */ }; @@ -113,7 +115,7 @@ } static void gdht_guid_found(const kuid_t *kuid, - const lookup_val_rs_t *rs, gpointer arg); + const lookup_val_rs_t *rs, void *arg); /** * Convert a SHA1 to the proper Kademlia key for lookups. @@ -134,12 +136,9 @@ const kuid_t * gdht_kuid_from_guid(const guid_t *guid) { - SHA1Context ctx; struct sha1 digest; - SHA1Reset(&ctx); - SHA1Input(&ctx, guid->v, GUID_RAW_SIZE); - SHA1Result(&ctx, &digest); + SHA1_COMPUTE(guid->v, &digest); return kuid_get_atom((const kuid_t *) &digest); } @@ -147,8 +146,8 @@ /** * Is IP:port pointing back at us? */ -static gboolean -gdht_is_our_ip_port(const host_addr_t addr, guint16 port) +static bool +gdht_is_our_ip_port(const host_addr_t addr, uint16 port) { return is_my_address_and_port(addr, port) || local_addr_cache_lookup(addr, port); @@ -157,7 +156,7 @@ /** * Was result published by ourselves */ -static gboolean +static bool gdht_published_by_ourselves(const lookup_val_rc_t *rc) { return gdht_is_our_ip_port(rc->addr, rc->port); @@ -167,12 +166,12 @@ * Free SHA1 lookup context. */ static void -gdht_free_sha1_lookup(struct sha1_lookup *slk, gboolean do_remove) +gdht_free_sha1_lookup(struct sha1_lookup *slk, bool do_remove) { sha1_lookup_check(slk); if (do_remove) - g_hash_table_remove(sha1_lookups, slk->id); + hikset_remove(sha1_lookups, slk->id); kuid_atom_free(slk->id); atom_guid_free(slk->fi_guid); @@ -183,13 +182,13 @@ * Free GUID lookup context. */ static void -gdht_free_guid_lookup(struct guid_lookup *glk, gboolean do_remove) +gdht_free_guid_lookup(struct guid_lookup *glk, bool do_remove) { guid_lookup_check(glk); if (do_remove) { download_proxy_dht_lookup_done(glk->guid); - g_hash_table_remove(guid_lookups, glk->id); + hikset_remove(guid_lookups, glk->id); } kuid_atom_free(glk->id); @@ -206,10 +205,9 @@ { static char info64; - gm_snprintf(info, sizeof info, "DHT %s v%u.%u (%lu byte%s) %s", + str_bprintf(info, sizeof info, "DHT %s v%u.%u (%lu byte%s) %s", dht_value_type_to_string(rc->type), rc->major, rc->minor, - (gulong) rc->length, 1 == rc->length ? "" : "s", - vendor_to_string(rc->vcode)); + (ulong) rc->length, plural(rc->length), vendor_to_string(rc->vcode)); return info; } @@ -219,8 +217,8 @@ * * @return TRUE if OK, FALSE if lookup must be aborted. */ -static gboolean -gdht_sha1_looking(const kuid_t *kuid, gpointer arg) +static bool +gdht_sha1_looking(const kuid_t *kuid, void *arg) { struct sha1_lookup *slk = arg; fileinfo_t *fi; @@ -240,7 +238,7 @@ * Callback when SHA1 lookup is unsuccessful. */ static void -gdht_sha1_not_found(const kuid_t *kuid, lookup_error_t error, gpointer arg) +gdht_sha1_not_found(const kuid_t *kuid, lookup_error_t error, void *arg) { struct sha1_lookup *slk = arg; fileinfo_t *fi; @@ -250,7 +248,7 @@ fi = file_info_by_guid(slk->fi_guid); /* NULL if fileinfo was removed */ if (fi != NULL) { - gboolean launched; + bool launched; switch (error) { case LOOKUP_E_CANCELLED: @@ -282,17 +280,18 @@ extvec_t exvMAX_EXTVEC; int exvcnt; int i; - gboolean firewalled = FALSE; + bool firewalled = FALSE; struct tth tth; - gboolean has_tth = FALSE; + bool has_tth = FALSE; guid_t guid; - guint16 port = 0; - gboolean tls = FALSE; + uint16 port = 0; + bool tls = FALSE; filesize_t filesize = 0; - guint32 flags = 0; + filesize_t available = 0; + uint32 flags = 0; char hostMAX_HOSTLEN; const char *hostname = NULL; - gboolean has_valid_guid = FALSE; + bool has_valid_guid = FALSE; g_assert(DHT_VT_ALOC == rc->type); @@ -303,7 +302,7 @@ for (i = 0; i < exvcnt; i++) { extvec_t *e = &exvi; - guint16 paylen; + uint16 paylen; switch (e->ext_token) { case EXT_T_GGEP_client_id: @@ -314,13 +313,13 @@ break; case EXT_T_GGEP_firewalled: if (1 == ext_paylen(e)) { - guint8 fw = peek_u8(ext_payload(e)); + uint8 fw = peek_u8(ext_payload(e)); firewalled = fw != 0; } break; case EXT_T_GGEP_length: { - guint64 fs; + uint64 fs; ggept_status_t ret; ret = ggept_filesize_extract(e, &fs); @@ -351,14 +350,23 @@ } break; case EXT_T_GGEP_avail: /* Length available (for partial file) */ - /* FIXME - handle it */ + { + uint64 fs; + ggept_status_t ret; + + ret = ggept_filesize_extract(e, &fs); + if (GGEP_OK == ret) + available = 0 == fs ? 1 : fs; + else + available = 1; /* Force "partial" status */ + } break; default: if (GNET_PROPERTY(ggep_debug) > 1 && e->ext_type == EXT_GGEP) { paylen = ext_paylen(e); g_warning("%s: unhandled GGEP \"%s\" (%d byte%s)", value_infostr(rc), - ext_ggep_id_str(e), paylen, paylen == 1 ? "" : "s"); + ext_ggep_id_str(e), paylen, plural(paylen)); } break; } @@ -372,10 +380,10 @@ if (port) { if (port != rc->port && GNET_PROPERTY(download_debug)) g_warning("%s: port mismatch: creator's was %u, " - "%sALOC is %u for %s", + "%sALOC is %u for %s%s", value_infostr(rc), rc->port, firewalled ? "firewalled " : "", - port, fi->pathname); + port, available != 0 ? "partial " : "", fi->pathname); } else { port = rc->port; } @@ -386,9 +394,9 @@ if (!firewalled && !host_is_valid(rc->addr, port)) { if (GNET_PROPERTY(download_debug)) - g_warning("discarding %s from %s for %s: invalid IP:port", + g_warning("discarding %s from %s for %s%s: invalid IP:port", value_infostr(rc), host_addr_port_to_string(rc->addr, port), - fi->pathname); + available != 0 ? "partial " : "", fi->pathname); goto cleanup; } @@ -398,9 +406,10 @@ if (firewalled && !has_valid_guid) { if (GNET_PROPERTY(download_debug)) - g_warning("discarding %s from %s for %s: firewalled host, no GUID", + g_warning("discarding %s from %s for %s%s: " + "firewalled host, no GUID", value_infostr(rc), host_addr_port_to_string(rc->addr, port), - fi->pathname); + available != 0 ? "partial " : "", fi->pathname); goto cleanup; } @@ -408,11 +417,14 @@ * Discard hostile sources. */ - if (hostiles_check(rc->addr)) { - if (GNET_PROPERTY(download_debug)) - g_warning("discarding %s from %s for %s: hostile IP", + if (hostiles_is_bad(rc->addr)) { + if (GNET_PROPERTY(download_debug)) { + hostiles_flags_t hflags = hostiles_check(rc->addr); + g_warning("discarding %s from %s for %s%s: hostile IP (%s)", value_infostr(rc), host_addr_port_to_string(rc->addr, port), - fi->pathname); + available != 0 ? "partial " : "", fi->pathname, + hostiles_flags_to_string(hflags)); + } goto cleanup; } @@ -432,12 +444,12 @@ */ if (!gdht_is_our_ip_port(rc->addr, port)) - gnet_stats_count_general(GNR_OWN_GUID_COLLISIONS, 1); + gnet_stats_inc_general(GNR_OWN_GUID_COLLISIONS); if (GNET_PROPERTY(download_debug)) - g_warning("discarding %s from %s for %s: host bears our GUID", + g_warning("discarding %s from %s for %s%s: host bears our GUID", value_infostr(rc), host_addr_port_to_string(rc->addr, port), - fi->pathname); + available != 0 ? "partial " : "", fi->pathname); goto cleanup; } @@ -447,11 +459,11 @@ if (filesize != 0 && fi->size != 0 && fi->size != filesize) { if (GNET_PROPERTY(download_debug)) - g_warning("discarding %s from %s for %s: " + g_warning("discarding %s from %s for %s%s: " "we have size=%s, ALOC says %s", value_infostr(rc), host_addr_port_to_string(rc->addr, port), - fi->pathname, filesize_to_string(fi->size), - filesize_to_string2(filesize)); + available != 0 ? "partial " : "", fi->pathname, + filesize_to_string(fi->size), filesize_to_string2(filesize)); goto cleanup; } @@ -465,10 +477,11 @@ base32_encode(buf, sizeof buf, tth.data, sizeof tth.data); - g_warning("discarding %s from %s for %s: " + g_warning("discarding %s from %s for %s%s: " "we have TTH root %s, ALOC says %s", value_infostr(rc), host_addr_port_to_string(rc->addr, port), - fi->pathname, tth_base32(fi->tth), buf); + available != 0 ? "partial " : "", fi->pathname, + tth_base32(fi->tth), buf); } goto cleanup; } @@ -478,8 +491,9 @@ */ if (GNET_PROPERTY(download_debug) > 1) - g_debug("adding %s%ssource %s (GUID %s) from DHT ALOC for %s", + g_debug("adding %s%s%ssource %s (GUID %s) from DHT ALOC for %s", firewalled ? "firewalled " : "", tls ? "TLS " : "", + available != 0 ? "partial " : "", host_addr_port_to_string(rc->addr, port), guid_to_string(&guid), fi->pathname); @@ -495,7 +509,7 @@ fi->sha1, has_tth ? &tth : NULL, tm_time(), - deconstify_gpointer(fi), + deconstify_pointer(fi), flags); /* FALL THROUGH */ @@ -518,12 +532,12 @@ * Callback when SHA1 lookup is successful. */ static void -gdht_sha1_found(const kuid_t *kuid, const lookup_val_rs_t *rs, gpointer arg) +gdht_sha1_found(const kuid_t *kuid, const lookup_val_rs_t *rs, void *arg) { struct sha1_lookup *slk = arg; fileinfo_t *fi; size_t i; - gboolean seen_foreign = FALSE; + bool seen_foreign = FALSE; g_assert(rs); sha1_lookup_check(slk); @@ -531,7 +545,7 @@ if (GNET_PROPERTY(dht_lookup_debug) > 1) g_debug("DHT ALOC lookup for %s returned %zu value%s", - kuid_to_string(kuid), rs->count, 1 == rs->count ? "" : "s"); + kuid_to_string(kuid), rs->count, plural(rs->count)); fi = file_info_by_guid(slk->fi_guid); @@ -564,7 +578,7 @@ */ if (seen_foreign) { - gnet_stats_count_general(GNR_DHT_SUCCESSFUL_ALT_LOC_LOOKUPS, 1); + gnet_stats_inc_general(GNR_DHT_SUCCESSFUL_ALT_LOC_LOOKUPS); } file_info_dht_query_completed(fi, TRUE, seen_foreign); @@ -595,7 +609,7 @@ * request. */ - if (g_hash_table_lookup(sha1_lookups, slk->id)) { + if (hikset_contains(sha1_lookups, slk->id)) { if (GNET_PROPERTY(dht_lookup_debug)) g_warning("DHT already has pending search for %s (%s) for %s", kuid_to_hex_string(slk->id), @@ -609,10 +623,10 @@ g_debug("DHT will be searching ALOC for %s (%s) for %s", kuid_to_hex_string(slk->id), kuid_to_string(slk->id), fi->pathname); - gm_hash_table_insert_const(sha1_lookups, slk->id, slk); + hikset_insert_key(sha1_lookups, &slk->id); file_info_dht_query_queued(fi); - ulq_find_value(slk->id, DHT_VT_ALOC, + ulq_find_value(slk->id, DHT_VT_ALOC, gdht_sha1_found, gdht_sha1_looking, gdht_sha1_not_found, slk); } @@ -620,7 +634,7 @@ * Callback when GUID lookup is unsuccessful. */ static void -gdht_guid_not_found(const kuid_t *kuid, lookup_error_t error, gpointer arg) +gdht_guid_not_found(const kuid_t *kuid, lookup_error_t error, void *arg) { struct guid_lookup *glk = arg; @@ -644,7 +658,7 @@ int exvcnt; int i; guid_t guid; - guint16 port = 0; + uint16 port = 0; gnet_host_t proxiesMAX_PROXIES; int proxy_count = 0; @@ -658,7 +672,7 @@ for (i = 0; i < exvcnt; i++) { extvec_t *e = &exvi; - guint16 paylen; + uint16 paylen; switch (e->ext_token) { case EXT_T_GGEP_client_id: @@ -691,11 +705,11 @@ while ( bstr_unread_size(bs) > 0 && - UNSIGNED(proxy_count) < G_N_ELEMENTS(proxies) + UNSIGNED(proxy_count) < N_ITEMS(proxies) ) { host_addr_t a; - guint16 p; - guint8 len; + uint16 p; + uint8 len; if (!bstr_read_u8(bs, &len)) break; @@ -716,14 +730,17 @@ * Discard hostile sources. */ - if (hostiles_check(a)) { - if (GNET_PROPERTY(download_debug)) + if (hostiles_is_bad(a)) { + if (GNET_PROPERTY(download_debug)) { + hostiles_flags_t flags = hostiles_check(a); g_warning("discarding proxy %s in %s from %s " - "for GUID %s: hostile IP", + "for GUID %s: hostile IP (%s)", host_addr_port_to_string(a, p), value_infostr(rc), host_addr_port_to_string2(rc->addr, rc->port), - guid_to_string(glk->guid)); + guid_to_string(glk->guid), + hostiles_flags_to_string(flags)); + } continue; } else { if (GNET_PROPERTY(download_debug)) @@ -743,7 +760,7 @@ paylen = ext_paylen(e); g_warning("%s: unhandled GGEP \"%s\" (%d byte%s)", value_infostr(rc), - ext_ggep_id_str(e), paylen, paylen == 1 ? "" : "s"); + ext_ggep_id_str(e), paylen, plural(paylen)); } break; } @@ -795,7 +812,7 @@ * since we last heard about it. */ - if (!host_addr_equal(glk->addr, rc->addr) || port != glk->port) + if (!host_addr_equiv(glk->addr, rc->addr) || port != glk->port) download_found_server(glk->guid, rc->addr, port); /* @@ -804,7 +821,7 @@ if (GNET_PROPERTY(download_debug) > 0) g_debug("adding %d push-prox%s (GUID %s) from DHT PROX for %s (%s)", - proxy_count, 1 == proxy_count ? "y" : "ies", + proxy_count, plural_y(proxy_count), guid_to_string(glk->guid), host_addr_port_to_string(rc->addr, port), host_addr_port_to_string(glk->addr, glk->port)); @@ -829,7 +846,7 @@ int exvcnt; int i; guid_t guid; - guint16 port = 0; + uint16 port = 0; g_assert(DHT_VT_NOPE == rc->type); guid_lookup_check(glk); @@ -841,7 +858,7 @@ for (i = 0; i < exvcnt; i++) { extvec_t *e = &exvi; - guint16 paylen; + uint16 paylen; switch (e->ext_token) { case EXT_T_GGEP_guid: @@ -860,7 +877,7 @@ paylen = ext_paylen(e); g_warning("%s: unhandled GGEP \"%s\" (%d byte%s)", value_infostr(rc), - ext_ggep_id_str(e), paylen, paylen == 1 ? "" : "s"); + ext_ggep_id_str(e), paylen, plural(paylen)); } break; } @@ -917,12 +934,12 @@ * Callback when GUID lookup is successful (PROX or NOPE values). */ static void -gdht_guid_found(const kuid_t *kuid, const lookup_val_rs_t *rs, gpointer arg) +gdht_guid_found(const kuid_t *kuid, const lookup_val_rs_t *rs, void *arg) { struct guid_lookup *glk = arg; size_t i; - gboolean prox = FALSE; - gboolean nope = FALSE; + bool prox = FALSE; + bool nope = FALSE; size_t other = 0; g_assert(rs); @@ -931,7 +948,7 @@ if (GNET_PROPERTY(dht_lookup_debug) > 1) { g_debug("DHT PROX lookup for GUID %s returned %zu value%s", - guid_to_string(glk->guid), rs->count, 1 == rs->count ? "" : "s"); + guid_to_string(glk->guid), rs->count, plural(rs->count)); } /* @@ -964,12 +981,12 @@ if (GNET_PROPERTY(dht_lookup_debug)) { g_debug("DHT PROX %s lookup for GUID %s returned %zu other value%s", (prox || nope) ? "successful" : "failed", - guid_to_string(glk->guid), other, 1 == other ? "" : "s"); + guid_to_string(glk->guid), other, plural(other)); } if (other > 0) { /* Was looking for SHA1(GUID), found some other SHA1 */ - gnet_stats_count_general(GNR_DHT_SHA1_DATA_TYPE_COLLISIONS, 1); + gnet_stats_inc_general(GNR_DHT_SHA1_DATA_TYPE_COLLISIONS); } /* @@ -984,11 +1001,9 @@ /* If we got at least one NOPE back, count a successful NOPE lookup */ - gnet_stats_count_general( - nope ? - GNR_DHT_SUCCESSFUL_NODE_PUSH_ENTRY_LOOKUPS : - GNR_DHT_SUCCESSFUL_PUSH_PROXY_LOOKUPS, - 1); + gnet_stats_inc_general(nope ? + GNR_DHT_SUCCESSFUL_NODE_PUSH_ENTRY_LOOKUPS : + GNR_DHT_SUCCESSFUL_PUSH_PROXY_LOOKUPS); gdht_free_guid_lookup(glk, TRUE); } @@ -997,7 +1012,7 @@ * Launch a GUID lookup in the DHT to collect push proxies for a server. */ void -gdht_find_guid(const guid_t *guid, const host_addr_t addr, guint16 port) +gdht_find_guid(const guid_t *guid, const host_addr_t addr, uint16 port) { struct guid_lookup *glk; @@ -1018,7 +1033,7 @@ * request. */ - if (g_hash_table_lookup(guid_lookups, glk->id)) { + if (hikset_contains(guid_lookups, glk->id)) { if (GNET_PROPERTY(dht_lookup_debug)) g_warning("DHT already has pending search for %s (GUID %s) for %s", kuid_to_hex_string(glk->id), @@ -1033,7 +1048,7 @@ kuid_to_hex_string(glk->id), guid_to_string(guid), host_addr_port_to_string(addr, port)); - gm_hash_table_insert_const(guid_lookups, glk->id, glk); + hikset_insert_key(guid_lookups, &glk->id); /* * We're looking for ANY value here, but we really expect PROX or NOPE @@ -1060,19 +1075,20 @@ void gdht_init(void) { - sha1_lookups = g_hash_table_new(kuid_hash, kuid_eq); - guid_lookups = g_hash_table_new(kuid_hash, kuid_eq); + sha1_lookups = hikset_create( + offsetof(struct sha1_lookup, id), HASH_KEY_FIXED, KUID_RAW_SIZE); + guid_lookups = hikset_create( + offsetof(struct guid_lookup, id), HASH_KEY_FIXED, KUID_RAW_SIZE); } /** * Hash table iterator to free a struct sha1_lookup */ static void -free_sha1_lookups_kv(gpointer unused_key, gpointer val, gpointer unused_x) +free_sha1_lookups_kv(void *val, void *unused_x) { struct sha1_lookup *slk = val; - (void) unused_key; (void) unused_x; gdht_free_sha1_lookup(slk, FALSE); @@ -1082,11 +1098,10 @@ * Hash table iterator to free a struct guid_lookup */ static void -free_guid_lookups_kv(gpointer unused_key, gpointer val, gpointer unused_x) +free_guid_lookups_kv(void *val, void *unused_x) { struct guid_lookup *glk = val; - (void) unused_key; (void) unused_x; gdht_free_guid_lookup(glk, FALSE); @@ -1098,11 +1113,11 @@ void gdht_close(void) { - g_hash_table_foreach(sha1_lookups, free_sha1_lookups_kv, NULL); - gm_hash_table_destroy_null(&sha1_lookups); + hikset_foreach(sha1_lookups, free_sha1_lookups_kv, NULL); + hikset_free_null(&sha1_lookups); - g_hash_table_foreach(guid_lookups, free_guid_lookups_kv, NULL); - gm_hash_table_destroy_null(&guid_lookups); + hikset_foreach(guid_lookups, free_guid_lookups_kv, NULL); + hikset_free_null(&guid_lookups); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/gdht.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/gdht.h
Changed
@@ -46,7 +46,7 @@ void gdht_close(void); void gdht_find_sha1(fileinfo_t *fi); -void gdht_find_guid(const guid_t *guid, const host_addr_t addr, guint16 port); +void gdht_find_guid(const guid_t *guid, const host_addr_t addr, uint16 port); const kuid_t *gdht_kuid_from_guid(const guid_t *guid); const kuid_t *gdht_kuid_from_sha1(const sha1_t *sha1);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/geo_ip.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/geo_ip.c
Changed
@@ -38,13 +38,13 @@ #include "lib/ascii.h" #include "lib/file.h" -#include "lib/glib-missing.h" #include "lib/halloc.h" #include "lib/host_addr.h" #include "lib/iprange.h" #include "lib/iso3166.h" #include "lib/parse.h" #include "lib/path.h" +#include "lib/str.h" #include "lib/stringify.h" /* For ipv6_to_string() */ #include "lib/tm.h" #include "lib/walloc.h" @@ -77,9 +77,9 @@ struct range_context { const char *line; /**< The line from the input file */ int linenum; /**< Line number in input file, for errors */ - guint32 ip1; /**< Original lower IP in global range */ - guint32 ip2; /**< Original upper IP in global range */ - guint16 country; /**< Country code (numerical encoded) */ + uint32 ip1; /**< Original lower IP in global range */ + uint32 ip2; /**< Original upper IP in global range */ + uint16 country; /**< Country code (numerical encoded) */ }; /** @@ -88,11 +88,11 @@ * Insert IP range in database, linking it to the proper country code. */ static void -gip_add_cidr(guint32 ip, guint bits, gpointer udata) +gip_add_cidr(uint32 ip, uint bits, void *udata) { struct range_context *ctx = udata; iprange_err_t error; - guint16 cc; + uint16 cc; if (GNET_PROPERTY(reload_debug) > 4) printf("GEO adding %s/%d for \"%s\"\n", @@ -120,7 +120,7 @@ gip_parse_ipv4(const char *line, int linenum) { const char *end; - guint16 code; + uint16 code; int c; struct range_context ctx; @@ -220,9 +220,9 @@ gip_parse_ipv6(const char *line, int linenum) { const char *end; - guint16 code; + uint16 code; int error; - guint8 ip16; + uint8 ip16; unsigned bits; /* @@ -296,7 +296,7 @@ * * @return The amount of entries loaded. */ -static G_GNUC_COLD guint +static uint G_COLD gip_load(FILE *f, unsigned idx) { char line1024; @@ -305,7 +305,7 @@ g_assert(f != NULL); g_assert(uint_is_non_negative(idx)); - g_assert(idx < G_N_ELEMENTS(gip_source)); + g_assert(idx < N_ITEMS(gip_source)); switch (idx) { case GIP_IPV4: @@ -370,11 +370,11 @@ * geographic IP mappings changed. */ static void -gip_changed(const char *filename, gpointer idx_ptr) +gip_changed(const char *filename, void *idx_ptr) { FILE *f; char buf80; - guint count; + uint count; unsigned idx = pointer_to_uint(idx_ptr); f = file_fopen(filename, "r"); @@ -384,7 +384,7 @@ count = gip_load(f, idx); fclose(f); - gm_snprintf(buf, sizeof buf, "Reloaded %u geographic IPv%c ranges.", + str_bprintf(buf, sizeof buf, "Reloaded %u geographic IPv%c ranges.", count, GIP_IPV4 == idx ? '4' : '6'); gcu_statusbar_message(buf); @@ -410,27 +410,17 @@ int idx; char *filename; file_path_t fp4; - unsigned length = 0; - char *tmp; - - file_path_set(&fplength++, settings_config_dir(), gip_sourcen.file); - - tmp = get_folder_path(PRIVLIB_PATH, NULL); - if (tmp != NULL) - file_path_set(&fplength++, tmp, gip_sourcen.file); - - file_path_set(&fplength++, PRIVLIB_EXP, gip_sourcen.file); -#ifndef OFFICIAL_BUILD - file_path_set(&fplength++, PACKAGE_EXTRA_SOURCE_DIR, gip_sourcen.file); -#endif - - g_assert(length <= G_N_ELEMENTS(fp)); - - f = file_config_open_read_norename_chosen(gip_sourcen.what, - fp, length, &idx); + unsigned length; + + length = settings_file_path_load(fp, gip_sourcen.file, SFP_DFLT); + + g_assert(length <= N_ITEMS(fp)); + + f = file_config_open_read_norename_chosen( + gip_sourcen.what, fp, length, &idx); if (NULL == f) - goto done; + return; filename = make_pathname(fpidx.dir, fpidx.name); watcher_register(filename, gip_changed, uint_to_pointer(n)); @@ -438,9 +428,6 @@ gip_load(f, n); fclose(f); - -done: - HFREE_NULL(tmp); } /** @@ -471,14 +458,14 @@ * @return the country mapped to this IP address as a numerically-encoded * country code, or ISO3166_INVALID when unknown. */ -guint16 +uint16 gip_country(const host_addr_t ha) { - guint16 code; + uint16 code; if G_UNLIKELY(NULL == geo_db) return ISO3166_INVALID; - + code = iprange_get_addr(geo_db, ha); return 0 == code ? ISO3166_INVALID : (code >> 1) - 1; @@ -488,7 +475,7 @@ * Same as gip_country() only returns ISO3166_INVALID if the geo_ip file * is too ancient: the risk of having a wrong mapping is too high. */ -guint16 +uint16 gip_country_safe(const host_addr_t ha) { /* We allow them to be ~6 months behind */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/geo_ip.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/geo_ip.h
Changed
@@ -40,8 +40,8 @@ void gip_init(void); void gip_close(void); -guint16 gip_country(const host_addr_t addr); -guint16 gip_country_safe(const host_addr_t ha); +uint16 gip_country(const host_addr_t addr); +uint16 gip_country_safe(const host_addr_t ha); const char *gip_country_cc(const host_addr_t ha); const char *gip_country_name(const host_addr_t ha);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/ggep.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/ggep.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2004, Raphael Manfredi + * Copyright (c) 2002-2004, 2012 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,18 +28,21 @@ * Gnutella Generic Extension Protocol (GGEP). * * @author Raphael Manfredi - * @date 2002-2004 + * @date 2002-2004, 2012 */ #include "common.h" -#include <zlib.h> /* Z_DEFAULT_COMPRESSION */ +#include <zlib.h> /* Z_BEST_COMPRESSION */ #include "ggep.h" #include "extensions.h" + #include "lib/cobs.h" #include "lib/halloc.h" +#include "lib/mempcpy.h" #include "lib/misc.h" +#include "lib/str.h" #include "lib/walloc.h" #include "lib/zlib_util.h" @@ -47,10 +50,40 @@ #include "lib/override.h" /* Must be the last header included */ +static const char * const ggep_error_str = { + "OK", /* GGEP_E_OK */ + "No more space in output buffer", /* GGEP_E_SPACE */ + "Error during zlib deflation", /* GGEP_E_DEFLATE */ + "Error during COBS encoding", /* GGEP_E_COBS */ + "Error during zlib stream close", /* GGEP_E_ZCLOSE */ + "Error during zlib inflation", /* GGEP_E_INFLATE */ + "Error during COBS stream close", /* GGEP_E_CCLOSE */ + "Unable to un-COBS data", /* GGEP_E_UNCOBS */ + "GGEP payload too large", /* GGEP_E_LARGE */ + "Internal error", /* GGEP_E_INTERNAL */ +}; + +unsigned ggep_errno; /**< Used to return errors on GGEP operations */ + +/** + * @return human-readable error string for given error code. + */ +const char * +ggep_strerror(unsigned errnum) +{ + if (errnum >= N_ITEMS(ggep_error_str)) { + static char buf40; + str_bprintf(buf, sizeof buf, "Invalid GGEP error code: %u", errnum); + return buf; + } + + return ggep_error_strerrnum; +} + /** * Check whether a GGEP stream descriptor is valid. */ -gboolean +bool ggep_stream_is_valid(ggep_stream_t *gs) { if (NULL == gs) @@ -71,12 +104,6 @@ if (gs->begun) { if ((gs->flags & GGEP_F_COBS) && !cobs_stream_is_valid(&gs->cs)) return FALSE; - - if ((gs->flags & GGEP_F_DEFLATE) && NULL == gs->zd) - return FALSE; - - if (!(gs->flags & GGEP_F_DEFLATE) && NULL != gs->zd) - return FALSE; } return TRUE; @@ -91,7 +118,7 @@ * @param len length of supplied buffer */ void -ggep_stream_init(ggep_stream_t *gs, gpointer data, size_t len) +ggep_stream_init(ggep_stream_t *gs, void *data, size_t len) { g_assert(len <= INT_MAX); g_assert(len != 0); @@ -133,25 +160,22 @@ gs->begun = FALSE; gs->o = gs->fp; /* Back to the beginning of the failed extension */ - - if (gs->zd) { - zlib_deflater_free(gs->zd, TRUE); - gs->zd = NULL; - } } /** * Append char to the GGEP stream. * - * @return FALSE if there's not enough room in the output. + * @return FALSE if there's not enough room in the output, with ggep_errno set. */ -static inline gboolean +static inline bool ggep_stream_appendc(ggep_stream_t *gs, char c) { g_assert(ggep_stream_is_valid(gs)); - if (0 == ggep_stream_avail(gs)) + if (0 == ggep_stream_avail(gs)) { + ggep_errno = GGEP_E_SPACE; return FALSE; + } *(gs->o++) = c; @@ -161,18 +185,19 @@ /** * Append data to the GGEP stream. * - * @return FALSE if there's not enough room in the output. + * @return FALSE if there's not enough room in the output, with ggep_errno set. */ -static inline gboolean -ggep_stream_append(ggep_stream_t *gs, gconstpointer data, size_t len) +static inline bool +ggep_stream_append(ggep_stream_t *gs, const void *data, size_t len) { g_assert(ggep_stream_is_valid(gs)); - if (len > ggep_stream_avail(gs)) + if (len > ggep_stream_avail(gs)) { + ggep_errno = GGEP_E_SPACE; return FALSE; + } - memcpy(gs->o, data, len); - gs->o += len; + gs->o = mempcpy(gs->o, data, len); return TRUE; } @@ -187,11 +212,11 @@ * @return TRUE if OK, FALSE if there's not enough room in the output. * On error, the stream is left in a clean state. */ -gboolean -ggep_stream_begin(ggep_stream_t *gs, const char *id, guint32 wflags) +bool +ggep_stream_begin(ggep_stream_t *gs, const char *id, uint32 wflags) { int idlen; - guint8 flags = 0; + uint8 flags = 0; g_assert(ggep_stream_is_valid(gs)); g_assert(gs->outbuf != NULL); /* Stream not closed */ @@ -268,14 +293,20 @@ * data later. */ - g_assert(gs->zd == NULL); - if (wflags & GGEP_W_DEFLATE) { - if (wflags & GGEP_W_COBS) - gs->zd = zlib_deflater_make(NULL, 0, Z_DEFAULT_COMPRESSION); - else - gs->zd = zlib_deflater_make_into(NULL, 0, - gs->o, ggep_stream_avail(gs), Z_DEFAULT_COMPRESSION); + if (NULL == gs->zd) { + if (wflags & GGEP_W_COBS) + gs->zd = zlib_deflater_make(NULL, 0, Z_BEST_COMPRESSION); + else + gs->zd = zlib_deflater_make_into(NULL, 0, + gs->o, ggep_stream_avail(gs), Z_BEST_COMPRESSION); + } else { + if (wflags & GGEP_W_COBS) + zlib_deflater_reset(gs->zd, NULL, 0); + else + zlib_deflater_reset_into(gs->zd, NULL, 0, + gs->o, ggep_stream_avail(gs)); + } } /* @@ -296,8 +327,6 @@ gs->begun = TRUE; g_assert(!(gs->flags & GGEP_F_COBS) || cobs_stream_is_valid(&gs->cs)); - g_assert(!(gs->flags & GGEP_F_DEFLATE) || gs->zd != NULL); - g_assert((gs->flags & GGEP_F_DEFLATE) || gs->zd == NULL); return TRUE; @@ -311,7 +340,7 @@ * * @return TRUE if OK. On error, the stream is brought back to a clean state. */ -gboolean +bool ggep_stream_writev(ggep_stream_t *gs, const iovec_t *iov, int iovcnt) { const iovec_t *xiov; @@ -329,9 +358,12 @@ g_assert(gs->zd != NULL); for (i = iovcnt, xiov = iov; i--; xiov++) { - if (!zlib_deflate_data(gs->zd, - iovec_base(xiov), iovec_len(xiov))) + const void *data = iovec_base(xiov); + size_t len = iovec_len(xiov); + if (!zlib_deflate_data(gs->zd, data, len, FALSE)) { + ggep_errno = GGEP_E_DEFLATE; goto cleanup; + } } return TRUE; @@ -343,9 +375,12 @@ if (gs->flags & GGEP_F_COBS) { for (i = iovcnt, xiov = iov; i--; xiov++) { - if (!cobs_stream_write(&gs->cs, - iovec_base(xiov), iovec_len(xiov))) + if ( + !cobs_stream_write(&gs->cs, iovec_base(xiov), iovec_len(xiov)) + ) { + ggep_errno = GGEP_E_COBS; goto cleanup; + } } return TRUE; @@ -356,8 +391,7 @@ */ for (i = iovcnt, xiov = iov; i--; xiov++) { - if (!ggep_stream_append(gs, - iovec_base(xiov), iovec_len(xiov))) + if (!ggep_stream_append(gs, iovec_base(xiov), iovec_len(xiov))) goto cleanup; } @@ -373,16 +407,15 @@ * * @return TRUE if OK. On error, the stream is brought back to a clean state. */ -gboolean -ggep_stream_write(ggep_stream_t *gs, gconstpointer data, size_t len) +bool +ggep_stream_write(ggep_stream_t *gs, const void *data, size_t len) { iovec_t iov; const iovec_t *p_iov = &iov; g_assert(len <= INT_MAX); - iovec_set_base(&iov, deconstify_gpointer(data)); - iovec_set_len(&iov, len); + iovec_set(&iov, deconstify_pointer(data), len); return ggep_stream_writev(gs, p_iov, 1); } @@ -392,11 +425,11 @@ * * @return TRUE if OK. On error, the stream is brought back to a clean state. */ -gboolean +bool ggep_stream_end(ggep_stream_t *gs) { size_t plen = 0; - gint8 hlen3; + int8 hlen3; size_t slen; g_assert(ggep_stream_is_valid(gs)); @@ -411,8 +444,10 @@ g_assert(gs->zd); - if (!zlib_deflate_close(gs->zd)) + if (!zlib_deflate_close(gs->zd)) { + ggep_errno = GGEP_E_ZCLOSE; goto cleanup; + } plen = zlib_deflater_outlen(gs->zd); @@ -425,8 +460,8 @@ ilen = zlib_deflater_inlen(gs->zd); if (plen > ilen) { - gpointer data; - gboolean ok; + void *data; + bool ok; if (GNET_PROPERTY(ggep_debug) > 2) g_warning("GGEP \"%.*s\" not compressing %d bytes into %d", @@ -435,8 +470,10 @@ if (ilen != 0) { data = zlib_uncompress(zlib_deflater_out(gs->zd), plen, ilen); - if (data == NULL) + if (data == NULL) { + ggep_errno = GGEP_E_INFLATE; goto cleanup; + } } else { data = NULL; } @@ -448,9 +485,6 @@ gs->flags &= ~GGEP_F_DEFLATE; *gs->fp &= ~GGEP_F_DEFLATE; - zlib_deflater_free(gs->zd, TRUE); - gs->zd = NULL; - /* * Rewind stream right after the begin call, and write the * original data, possibly COBS-ing it on the fly if that @@ -480,17 +514,10 @@ if ((gs->flags & GGEP_F_DEFLATE) && (gs->flags & GGEP_F_COBS)) { char *deflated = zlib_deflater_out(gs->zd); - if (!cobs_stream_write(&gs->cs, deflated, plen)) + if (!cobs_stream_write(&gs->cs, deflated, plen)) { + ggep_errno = GGEP_E_COBS; goto cleanup; - } - - /* - * Get rid of the deflating stream. - */ - - if (gs->zd) { - zlib_deflater_free(gs->zd, TRUE); - gs->zd = NULL; + } } /* @@ -498,11 +525,13 @@ */ if (gs->flags & GGEP_F_COBS) { - gboolean saw_nul; + bool saw_nul; plen = cobs_stream_close(&gs->cs, &saw_nul); - if (0 == plen) + if (0 == plen) { + ggep_errno = GGEP_E_CCLOSE; goto cleanup; + } /* * If it was not necessary to COBS the data, un-COBS them in place. @@ -511,8 +540,10 @@ if (!saw_nul) { size_t ilen; - if (NULL == cobs_decode(gs->lp + 1, plen, &ilen, TRUE)) + if (NULL == cobs_decode(gs->lp + 1, plen, &ilen, TRUE)) { + ggep_errno = GGEP_E_UNCOBS; goto cleanup; + } if (GNET_PROPERTY(ggep_debug) > 2) g_warning("GGEP \"%.*s\" no need to COBS %d bytes into %d", @@ -594,6 +625,7 @@ } else { g_carp("too large GGEP payload length (%d bytes) for \"%.*s\"", (int) plen, (int) (*gs->fp & GGEP_F_IDLEN), gs->fp + 1); + ggep_errno = GGEP_E_LARGE; goto cleanup; } @@ -608,8 +640,10 @@ if (slen > 1) { char *start = gs->lp + 1; - if ((size_t) (gs->end - gs->o) < (slen - 1)) + if ((size_t) (gs->end - gs->o) < (slen - 1)) { + ggep_errno = GGEP_E_INTERNAL; goto cleanup; + } memmove(start + (slen - 1), start, plen); gs->o += (slen - 1); @@ -649,6 +683,15 @@ g_assert(gs->outbuf != NULL); /* Not closed already */ /* + * Get rid of the deflating stream. + */ + + if (gs->zd != NULL) { + zlib_deflater_free(gs->zd, TRUE); + gs->zd = NULL; + } + + /* * If we ever wrote anything, `gs->last_fp' will point to the last * extension in the block. */ @@ -672,9 +715,9 @@ * * @return TRUE if written successfully. */ -gboolean +bool ggep_stream_packv(ggep_stream_t *gs, - const char *id, const iovec_t *iov, int iovcnt, guint32 wflags) + const char *id, const iovec_t *iov, int iovcnt, uint32 wflags) { g_assert(iovcnt >= 0); @@ -710,9 +753,9 @@ * if the write attempt had not taken place, so one may continue writing * shorter extension, if the error is due to a lack of space in the stream. */ -gboolean +bool ggep_stream_pack(ggep_stream_t *gs, - const char *id, gconstpointer payload, size_t plen, guint32 wflags) + const char *id, const void *payload, size_t plen, uint32 wflags) { iovec_t iov; const iovec_t *p_iov = &iov; @@ -721,8 +764,7 @@ g_assert(0 == plen || NULL != payload); g_assert(plen <= INT_MAX); - iovec_set_base(&iov, deconstify_gpointer(payload)); - iovec_set_len(&iov, plen); + iovec_set(&iov, deconstify_pointer(payload), plen); return ggep_stream_packv(gs, id, p_iov, 1, wflags); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/ggep.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/ggep.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2012 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,7 +28,7 @@ * Gnutella Generic Extension Protocol (GGEP). * * @author Raphael Manfredi - * @date 2002-2003 + * @date 2002-2003, 2012 */ #ifndef _core_ggep_h_ @@ -56,9 +56,9 @@ * GGEP Length Encoding. */ -#define GGEP_L_CONT '\x80' /**< Continuation present */ -#define GGEP_L_LAST '\x40' /**< Last byte */ -#define GGEP_L_VALUE '\x3f' /**< Value */ +#define GGEP_L_CONT 0x80U /**< Continuation present */ +#define GGEP_L_LAST 0x40U /**< Last byte */ +#define GGEP_L_VALUE 0x3fU /**< Value */ #define GGEP_L_VSHIFT 6 #define GGEP_L_XFLAGS (GGEP_L_CONT | GGEP_L_LAST) @@ -81,10 +81,27 @@ #define GGEP_W_COBS (1U << 1) /**< Attempt COBS encoding, if needed */ #define GGEP_W_DEFLATE (1U << 2) /**< Attempt payload compression */ +/* + * Error codes. + */ + +#define GGEP_E_OK 0 /**< OK */ +#define GGEP_E_SPACE 1 /**< No more space in output buffer */ +#define GGEP_E_DEFLATE 2 /**< Error during zlib deflation */ +#define GGEP_E_COBS 3 /**< Error during COBS encoding */ +#define GGEP_E_ZCLOSE 4 /**< Error during zlib stream close */ +#define GGEP_E_INFLATE 5 /**< Error during zlib inflation */ +#define GGEP_E_CCLOSE 6 /**< Error during COBS stream close */ +#define GGEP_E_UNCOBS 7 /**< Unable to un-COBS data */ +#define GGEP_E_LARGE 8 /**< GGEP payload too large */ +#define GGEP_E_INTERNAL 9 /**< Internal error */ + enum ggep_magic { GGEP_MAGIC_ID = 0x62961da4U }; /** * Structure keeping track of incremental GGEP writes. + * + * It is made visible to allow allocation on the stack. */ typedef struct ggep_stream { enum ggep_magic magic; /**< Magic number */ @@ -95,7 +112,7 @@ char *lp; /**< Where length should be written when known */ char *last_fp; /**< Flags of last successfully written ext. */ size_t size; /**< Size of the outbuf buffer */ - guint8 flags; /**< Extension flags (COBS / DEFLATE) */ + uint8 flags; /**< Extension flags (COBS / DEFLATE) */ cobs_stream_t cs; /**< Used if COBS needed */ zlib_deflater_t *zd; /**< Allocated and used if deflation needed */ unsigned magic_sent:1; /**< Whether leading magic was emitted */ @@ -107,21 +124,33 @@ * Public interface. */ +const char *ggep_strerror(unsigned errnum); +extern unsigned ggep_errno; + int ggep_decode_into(extvec_t *exv, char *buf, size_t len); -void ggep_stream_init(ggep_stream_t *gs, gpointer data, size_t len); -gboolean ggep_stream_begin(ggep_stream_t *gs, const char *id, guint32 wflags); -gboolean ggep_stream_writev(ggep_stream_t *gs, +void ggep_stream_init(ggep_stream_t *gs, void *data, size_t len); +bool ggep_stream_begin(ggep_stream_t *gs, const char *id, uint32 wflags); +bool ggep_stream_writev(ggep_stream_t *gs, const iovec_t *iov, int iovcnt); -gboolean ggep_stream_write(ggep_stream_t *gs, gconstpointer data, size_t len); -gboolean ggep_stream_end(ggep_stream_t *gs); +bool ggep_stream_write(ggep_stream_t *gs, const void *data, size_t len); +bool ggep_stream_end(ggep_stream_t *gs); size_t ggep_stream_close(ggep_stream_t *gs); -gboolean ggep_stream_packv(ggep_stream_t *gs, - const char *id, const iovec_t *iov, int iovcnt, guint32 wflags); -gboolean ggep_stream_pack(ggep_stream_t *gs, - const char *id, gconstpointer payload, size_t plen, guint32 wflags); +bool ggep_stream_packv(ggep_stream_t *gs, + const char *id, const iovec_t *iov, int iovcnt, uint32 wflags); +bool ggep_stream_pack(ggep_stream_t *gs, + const char *id, const void *payload, size_t plen, uint32 wflags); + +bool ggep_stream_is_valid(ggep_stream_t *gs); -gboolean ggep_stream_is_valid(ggep_stream_t *gs); +/** + * @return human-readable error string for last error (current ggep_errno). + */ +static inline const char * +ggep_errstr(void) +{ + return ggep_strerror(ggep_errno); +} #endif /* _core_ggep_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/ggep_type.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/ggep_type.c
Changed
@@ -38,13 +38,18 @@ #include "hosts.h" /* For struct gnutella_host */ #include "ipp_cache.h" /* For tls_cache_lookup() */ #include "qhit.h" /* For QHIT_F_* flags */ +#include "version.h" /* For version_is_dirty(), etc.. */ #include "lib/bstr.h" #include "lib/endian.h" +#include "lib/getdate.h" #include "lib/gnet_host.h" #include "lib/log.h" #include "lib/misc.h" +#include "lib/product.h" #include "lib/sequence.h" +#include "lib/str.h" +#include "lib/tm.h" #include "lib/unsigned.h" #include "lib/utf8.h" #include "lib/vector.h" @@ -55,6 +60,17 @@ #include "lib/override.h" /* Must be the last header included */ +static time_t release_date; + +/** + * Initialization of the "release date" variable. + */ +static void +ggept_release_date_init(void) +{ + release_date = date2time(product_date(), tm_time()); +} + /** * Extract the SHA1 hash of the "H" extension into the supplied buffer. * @@ -118,7 +134,7 @@ payload = ext_payload(exv); if (payload0 != GGEP_H_BITPRINT) return GGEP_NOT_FOUND; - + if (tlen != (BITPRINT_RAW_SIZE + 1)) return GGEP_INVALID; /* Size is not right */ @@ -145,19 +161,19 @@ * @return the OS name encoded into a GTKGV extension. */ static const char * -ggept_gtkgv_osname(guint8 value) +ggept_gtkgv_osname(uint8 value) { - return value >= G_N_ELEMENTS(gtkgv_osname) ? + return value >= N_ITEMS(gtkgv_osname) ? gtkgv_osname0 : gtkgv_osnamevalue; } /** * Given a system name, look how it should be encoded in GTKGV. */ -static guint8 +static uint8 ggept_gtkgv_osname_encode(const char *sysname) { - guint8 result = 0; + uint8 result = 0; size_t i; /* @@ -176,7 +192,7 @@ * something more specific to use than the defaults. */ - for (i = 3; i < G_N_ELEMENTS(gtkgv_osname); i++) { + for (i = 3; i < N_ITEMS(gtkgv_osname); i++) { if (0 == strcasecmp(sysname, gtkgv_osnamei)) { result = i; break; @@ -192,18 +208,18 @@ } /** - * @return the value that should be advertised as the OS name. + * @return the value that should be advertised as the OS name in "GTKGV". */ -guint8 +static uint8 ggept_gtkgv_osname_value(void) { - static guint8 result = -1; + static uint8 result = -1; /* * Computation only happens once. */ - if (result >= G_N_ELEMENTS(gtkgv_osname)) { + if (result >= N_ITEMS(gtkgv_osname)) { #ifdef HAS_UNAME { struct utsname un; @@ -224,18 +240,22 @@ /** * Extract payload information from "GTKGV" into `info'. + * + * @param buf start of payload + * @param len length of payload + * @param info where information is decompiled + * + * @return GGEP_OK if OK */ ggept_status_t -ggept_gtkgv_extract(const extvec_t *exv, struct ggep_gtkgv *info) +ggept_gtkgv_extract_data(const void *buf, size_t len, struct ggep_gtkgv *info) { - const char *p; - int tlen; + const char *p = buf; ggept_status_t status = GGEP_OK; - g_assert(exv->ext_type == EXT_GGEP); - g_assert(exv->ext_token == EXT_T_GGEP_GTKGV); - - tlen = ext_paylen(exv); + g_assert(buf != NULL); + g_assert(size_is_non_negative(len)); + g_assert(info != NULL); /* * The original payload length was 13 bytes. @@ -249,11 +269,9 @@ * values for older versions of the payload. */ - if (tlen < 13) + if (len < 13) return GGEP_INVALID; - p = ext_payload(exv); - info->version = p0; info->major = p1; info->minor = p2; @@ -269,13 +287,13 @@ if (info->version >= 1) { bstr_t *bs; - guint8 flags; + uint8 flags; - bs = bstr_open(p, tlen, GNET_PROPERTY(ggep_debug) ? BSTR_F_ERROR : 0); + bs = bstr_open(p, len, GNET_PROPERTY(ggep_debug) ? BSTR_F_ERROR : 0); bstr_skip(bs, 13); if (bstr_read_u8(bs, &flags)) { - guint8 aflags = flags; + uint8 aflags = flags; /* * Swallow extra flags, if present (for now we expect only 1 byte). @@ -297,7 +315,7 @@ info->commit_len != 0 ) { if (info->commit_len <= 2 * SHA1_RAW_SIZE) { - guint8 bytes = (info->commit_len + 1) / 2; + uint8 bytes = (info->commit_len + 1) / 2; if (!bstr_read(bs, &info->commit, bytes)) { status = GGEP_INVALID; } @@ -312,7 +330,7 @@ */ if ((aflags & GTKGV_F_OS) && GGEP_OK == status) { - guint8 value; + uint8 value; if (bstr_read_u8(bs, &value)) { info->osname = ggept_gtkgv_osname(value); @@ -327,6 +345,80 @@ } /** + * Extract payload information from "GTKGV" into `info'. + */ +ggept_status_t +ggept_gtkgv_extract(const extvec_t *exv, struct ggep_gtkgv *info) +{ + g_assert(exv->ext_type == EXT_GGEP); + g_assert(exv->ext_token == EXT_T_GGEP_GTKGV); + + return ggept_gtkgv_extract_data(ext_payload(exv), ext_paylen(exv), info); +} + +/** + * Build the "GTKGV" payload into supplied buffer (which must be GTKGV_MAX_LEN + * bytes long). + * + * @return the length of the GTKGV extension built. + */ +size_t +ggept_gtkgv_build(void *buf, size_t len) +{ + uint8 major = product_major(); + uint8 minor = product_minor(); + uint8 revchar = product_revchar(); + uint8 patch = product_patchlevel(); + uint32 release; + uint32 date; + uint32 build; + uint8 version = 1; /* This is GTKGV version 1 */ + uint8 osname; + uint8 flags; + uint8 commit_len; + size_t commit_bytes; + const sha1_t *commit; + str_t s; + + /* + * We can conveniently use a "string" to write binary data, because + * GTKGV_MAX_LEN accounts for the trailing NUL byte that the string + * package invariably accounts for. + */ + + str_new_buffer(&s, buf, 0, len); + + flags = GTKGV_F_GIT | GTKGV_F_OS; + if (version_is_dirty()) + flags |= GTKGV_F_DIRTY; + + if G_UNLIKELY(0 == release_date) + ggept_release_date_init(); + + date = release_date; + poke_be32(&release, date); + poke_be32(&build, product_build()); + + commit = version_get_commit(&commit_len); + commit_bytes = (1 + commit_len) / 2; + osname = ggept_gtkgv_osname_value(); + + str_putc(&s, version); + str_putc(&s, major); + str_putc(&s, minor); + str_putc(&s, patch); + str_putc(&s, revchar); + str_cat_len(&s, (char *) &release, 4); + str_cat_len(&s, (char *) &build, 4); + str_putc(&s, flags); + str_putc(&s, commit_len); + str_cat_len(&s, (char *) commit, commit_bytes); + str_putc(&s, osname); + + return str_len(&s); +} + +/** * Extract payload information from "GTKGV1" into `info'. */ ggept_status_t @@ -374,16 +466,16 @@ * * @return TRUE on success, FALSE on write errors. */ -static gboolean +static bool ggept_ip_seq_append_net(ggep_stream_t *gs, const sequence_t *hseq, enum net_type net, const char *name, const char *name_tls, - const gnet_host_t *evec, size_t ecnt, size_t *count, gboolean cobs) + const gnet_host_t *evec, size_t ecnt, size_t *count, bool cobs) { - guchar *tls_bytes = NULL; + uchar *tls_bytes = NULL; unsigned tls_length; size_t tls_size = 0, tls_index = 0; - gboolean status = FALSE; + bool status = FALSE; unsigned flags = 0; size_t hcnt; const char *current_extension; @@ -427,7 +519,7 @@ while (sequence_iter_has_next(iter) && tls_index < max_items) { host_addr_t addr; - guint16 port; + uint16 port; char buf18; size_t len; const gnet_host_t *h = sequence_iter_next(iter); @@ -443,7 +535,7 @@ size_t i; for (i = 0; i < ecnt; i++) { - if (gnet_host_eq(h, &eveci)) + if (gnet_host_equiv(h, &eveci)) goto next; } } @@ -483,7 +575,8 @@ done: if (!status) { - g_carp("unable to add GGEP \"%s\"", current_extension); + g_carp("unable to add GGEP \"%s\": %s", + current_extension, ggep_errstr()); } *count = tls_index; @@ -517,7 +610,7 @@ const sequence_t *hseq, const char *name, const char *name_tls, const char *name6, const char *name6_tls, - const gnet_host_t *evec, size_t ecnt, size_t max_items, gboolean cobs) + const gnet_host_t *evec, size_t ecnt, size_t max_items, bool cobs) { size_t count = max_items; @@ -558,9 +651,9 @@ ggept_status_t ggept_ipp_pack(ggep_stream_t *gs, const gnet_host_t *hvec, size_t hcnt, const gnet_host_t *evec, size_t ecnt, - gboolean add_ipv6, gboolean no_ipv4) + bool add_ipv6, bool no_ipv4) { - vector_t v = vector_create(deconstify_gpointer(hvec), sizeof *hvec, hcnt); + vector_t v = vector_create(deconstify_pointer(hvec), sizeof *hvec, hcnt); sequence_t hseq; sequence_fill_from_vector(&hseq, &v); @@ -582,9 +675,9 @@ */ ggept_status_t ggept_dhtipp_pack(ggep_stream_t *gs, const gnet_host_t *hvec, size_t hcnt, - gboolean add_ipv6, gboolean no_ipv4) + bool add_ipv6, bool no_ipv4) { - vector_t v = vector_create(deconstify_gpointer(hvec), sizeof *hvec, hcnt); + vector_t v = vector_create(deconstify_pointer(hvec), sizeof *hvec, hcnt); sequence_t hseq; sequence_fill_from_vector(&hseq, &v); @@ -624,7 +717,7 @@ ggept_status_t ggept_a_pack(ggep_stream_t *gs, const gnet_host_t *hvec, size_t hcnt) { - vector_t v = vector_create(deconstify_gpointer(hvec), sizeof *hvec, hcnt); + vector_t v = vector_create(deconstify_pointer(hvec), sizeof *hvec, hcnt); sequence_t hseq; sequence_fill_from_vector(&hseq, &v); @@ -647,7 +740,7 @@ ggept_alt_pack(ggep_stream_t *gs, const gnet_host_t *hvec, size_t hcnt, unsigned flags) { - vector_t v = vector_create(deconstify_gpointer(hvec), sizeof *hvec, hcnt); + vector_t v = vector_create(deconstify_pointer(hvec), sizeof *hvec, hcnt); sequence_t hseq; sequence_fill_from_vector(&hseq, &v); @@ -684,11 +777,11 @@ if (hvec) { gnet_host_vec_t *vec = *hvec; const char *p; - guint n, i; + uint n, i; vec = NULL == vec ? gnet_host_vec_alloc() : vec; n = len / ilen; - n = MIN(n, 255); /* n_ipv4 and n_ipv6 are guint8 */ + n = MIN(n, 255); /* n_ipv4 and n_ipv6 are uint8 */ g_assert(n > 0); @@ -696,12 +789,12 @@ if (vec->n_ipv4 != 0) return GGEP_DUPLICATE; vec->n_ipv4 = n; - vec->hvec_v4 = walloc(n * sizeof vec->hvec_v40); + WALLOC_ARRAY(vec->hvec_v4, n); } else { if (vec->n_ipv6 != 0) return GGEP_DUPLICATE; vec->n_ipv6 = n; - vec->hvec_v6 = walloc(n * sizeof vec->hvec_v60); + WALLOC_ARRAY(vec->hvec_v6, n); } p = ext_payload(exv); @@ -738,7 +831,7 @@ */ ggept_status_t ggept_alt_extract(const extvec_t *exv, - gnet_host_vec_t **hvec, enum net_type net) + gnet_host_vec_t **hvec, enum net_type net) { g_assert(exv->ext_type == EXT_GGEP); g_assert(exv->ext_token == EXT_T_GGEP_ALT || @@ -841,61 +934,15 @@ } /** - * Encodes a variable-length integer. This encoding is equivalent to - * little-endian encoding whereas trailing zeros are discarded. - * - * @param v The value to encode. - * @param data Must point to a sufficiently large buffer. At maximum - * 8 bytes are required. - * - * @return the length in bytes of the encoded variable-length integer. - */ -static inline int -ggep_vlint_encode(guint64 v, char *data) -{ - char *p; - - for (p = data; v != 0; v >>= 8) { - *p++ = v & 0xff; - } - - return p - data; -} - -/** - * Decodes a variable-length integer. This encoding is equivalent to - * little-endian encoding whereas trailing zeros are discarded. - * - * @param data The payload to decode. - * @param len The length of data in bytes. - * - * @return The decoded value. - */ -static inline guint64 -ggep_vlint_decode(const char *data, size_t len) -{ - guint64 v; - guint i; - - v = 0; - if (len <= 8) { - for (i = 0; i < len; i++) { - v |= (((guint64) datai) & 0xff) << (i * 8); - } - } - return v; -} - -/** * Extract filesize length into `filesize' from extension encoded in variable- * length little endian with leading zeroes stripped. * * This is the format used by the payload of GGEP "LF" for instance. */ ggept_status_t -ggept_filesize_extract(const extvec_t *exv, guint64 *filesize) +ggept_filesize_extract(const extvec_t *exv, uint64 *filesize) { - guint64 fs; + uint64 fs; size_t len; g_assert(exv->ext_type == EXT_GGEP); @@ -904,7 +951,7 @@ if (len < 1 || len > 8) { return GGEP_INVALID; } - fs = ggep_vlint_decode(ext_payload(exv), len); + fs = vlint_decode(ext_payload(exv), len); if (0 == fs) { return GGEP_INVALID; } @@ -915,6 +962,34 @@ } /** + * Extract UNIX timestamp + filesize length into `stamp' and `filesize', + * reading from the supplied extension payload. + * + * This is the format used by the payload of GGEP "PRU" for instance. + */ +ggept_status_t +ggept_stamp_filesize_extract(const extvec_t *exv, + time_t *stamp, uint64 *filesize) +{ + size_t len; + const char *p; + + g_assert(exv->ext_type == EXT_GGEP); + + len = ext_paylen(exv); + if (len < 4 || len > 12) + return GGEP_INVALID; + + p = ext_payload(exv); + *stamp = peek_be32(p); + len -= 4; + p += 4; + *filesize = vlint_decode(p, len); /* Can be zero */ + + return GGEP_OK; +} + +/** * Extract IPv6 address into `addr' from GGEP "GTKG.IPV6" or "6" extensions. * When "addr" is NULL, simply validates the payload length. */ @@ -943,7 +1018,6 @@ return GGEP_OK; } - /** * Encode `filesize' in variable-length little endian, with leading zeroes * stripped, into `data'. @@ -952,22 +1026,50 @@ * * @param filesize The filesize to encode. * @param data A buffer of at least 8 bytes. + * @param len Length of buffer * * @return the amount of bytes written. */ -guint -ggept_filesize_encode(guint64 filesize, char *data) +uint +ggept_filesize_encode(uint64 filesize, char *data, size_t len) { - return ggep_vlint_encode(filesize, data); + g_assert(len >= 8); + + return vlint_encode(filesize, data); +} + +/** + * Encode `stamp' and `filesize' in buffer. + * + * @param stamp the time to encode + * @param filesize the filesize to encode + * @param data a buffer of at least 12 bytes. + * @param len length of buffer + * + * This is used in extensions such as GGEP "PRU" which carry the last + * modification time and the file length. + * + * @return the amount of bytes written + */ +uint +ggept_stamp_filesize_encode(time_t stamp, uint64 filesize, + char *data, size_t len) +{ + char *p = data; + + g_assert(len >= 12); + + p = poke_be32(p, stamp); + return 4 + vlint_encode(filesize, p); } /** * Extract unsigned (32-bit) quantity encoded as variable-length little-endian. */ ggept_status_t -ggept_uint32_extract(const extvec_t *exv, guint32 *val) +ggept_uint32_extract(const extvec_t *exv, uint32 *val) { - guint32 v; + uint32 v; size_t len; g_assert(exv->ext_type == EXT_GGEP); @@ -976,7 +1078,7 @@ if (len > 4) { return GGEP_INVALID; } - v = ggep_vlint_decode(ext_payload(exv), len); + v = vlint_decode(ext_payload(exv), len); if (val != NULL) { *val = v; } @@ -987,7 +1089,7 @@ * Extract daily uptime into `uptime', from the GGEP "DU" extensions. */ ggept_status_t -ggept_du_extract(const extvec_t *exv, guint32 *uptime) +ggept_du_extract(const extvec_t *exv, uint32 *uptime) { g_assert(exv->ext_type == EXT_GGEP); g_assert(exv->ext_token == EXT_T_GGEP_DU); @@ -998,35 +1100,41 @@ /** * Encode `uptime' for the GGEP "DU" extension into `data'. * - * @param uptime The uptime (in seconds) to encode. - * @param data A buffer of at least 4 bytes. + * @param uptime the uptime (in seconds) to encode. + * @param data a buffer of at least 4 bytes. + * @param len buffer length + * * @return the amount of chars written. */ -guint -ggept_du_encode(guint32 uptime, char *data) +uint +ggept_du_encode(uint32 uptime, char *data, size_t len) { - return ggep_vlint_encode(uptime, data); + g_assert(len >= 4); + + return vlint_encode(uptime, data); } /** * Encode `media_type' for the GGEP "M" extension into `data'. * - * @param mtype The media type mask - * @param data A buffer of at least 4 bytes. + * @param mtype the media type mask + * @param data a buffer of at least 4 bytes. + * @param len buffer length * * @return the amount of chars written. */ -guint -ggept_m_encode(guint32 mtype, char *data) +uint +ggept_m_encode(uint32 mtype, char *data, size_t len) { - return ggep_vlint_encode(mtype, data); -} + g_assert(len >= 4); + return vlint_encode(mtype, data); +} ggept_status_t ggept_ct_extract(const extvec_t *exv, time_t *stamp_ptr) { - guint64 v; + uint64 v; size_t len; g_assert(exv->ext_type == EXT_GGEP); @@ -1036,7 +1144,7 @@ if (len > 8) { return GGEP_INVALID; } - v = ggep_vlint_decode(ext_payload(exv), len); + v = vlint_decode(ext_payload(exv), len); if (stamp_ptr) { *stamp_ptr = MIN(v, TIME_T_MAX); } @@ -1046,14 +1154,18 @@ /** * Encode `timestamp' for the GGEP "CT" extension into `data'. * - * @param timestamp The timestamp (seconds since epoch) to encode. - * @param data A buffer of at least 8 bytes. + * @param timestamp the timestamp (seconds since Epoch) to encode. + * @param data a buffer of at least 8 bytes. + * @param len buffer length + * * @return the amount of chars written. */ -guint -ggept_ct_encode(time_t timestamp, char *data) +uint +ggept_ct_encode(time_t timestamp, char *data, size_t len) { - return ggep_vlint_encode(timestamp, data); + g_assert(len >= 4); + + return vlint_encode(timestamp, data); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/ggep_type.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/ggep_type.h
Changed
@@ -63,6 +63,8 @@ #define GTKGV_F_DIRTY (1U << 1) /**< Had local changes at build time */ #define GTKGV_F_OS (1U << 2) /**< Has OS code */ +#define GTKGV_MAX_LEN 37 /**< Maximum length of "GTKGV", + 1 NUL */ + /* * Public interface. */ @@ -74,40 +76,44 @@ /** Decompiled payload of "GTKGV1" (deprecated @0.97) */ struct ggep_gtkgv1 { - guint8 major; - guint8 minor; - guint8 patch; - guint8 revchar; - guint32 release; - guint32 build; + uint8 major; + uint8 minor; + uint8 patch; + uint8 revchar; + uint32 release; + uint32 build; }; /** Decompiled payload of "GTKGV" */ struct ggep_gtkgv { - guint8 version; /**< Initial version: 0 */ - guint8 major; - guint8 minor; - guint8 patch; - guint8 revchar; - guint32 release; - guint32 build; + uint8 version; /**< Initial version: 0 */ + uint8 major; + uint8 minor; + uint8 patch; + uint8 revchar; + uint32 release; + uint32 build; /* Introduced at version 1 */ const char *osname; /**< Operating system name (static string) */ sha1_t commit; /**< Commit version (may be partial) */ - guint8 commit_len; /**< Amount of valid nybbles */ + uint8 commit_len; /**< Amount of valid nybbles */ unsigned dirty:1; }; -guint8 ggept_gtkgv_osname_value(void); +size_t ggept_gtkgv_build(void *buf, size_t len); ggept_status_t ggept_gtkgv_extract(const extvec_t *, struct ggep_gtkgv *info); +ggept_status_t ggept_gtkgv_extract_data(const void *buf, size_t len, + struct ggep_gtkgv *info); ggept_status_t ggept_gtkgv1_extract(const extvec_t *, struct ggep_gtkgv1 *info); ggept_status_t ggept_hname_extract(const extvec_t *, char *buf, int len); -ggept_status_t ggept_filesize_extract(const extvec_t *, guint64 *fs); -ggept_status_t ggept_uint32_extract(const extvec_t *exv, guint32 *val); -ggept_status_t ggept_du_extract(const extvec_t *, guint32 *uptime); +ggept_status_t ggept_filesize_extract(const extvec_t *, uint64 *fs); +ggept_status_t ggept_uint32_extract(const extvec_t *exv, uint32 *val); +ggept_status_t ggept_du_extract(const extvec_t *, uint32 *uptime); ggept_status_t ggept_ct_extract(const extvec_t *, time_t *stamp_ptr); ggept_status_t ggept_gtkg_ipv6_extract(const extvec_t *, host_addr_t *addr); +ggept_status_t ggept_stamp_filesize_extract(const extvec_t *exv, + time_t *stamp, uint64 *filesize); ggept_status_t ggept_alt_extract(const extvec_t *, gnet_host_vec_t **hvec, enum net_type net); @@ -115,18 +121,19 @@ gnet_host_vec_t **hvec, enum net_type net); ggept_status_t ggept_utf8_string_extract(const extvec_t *, char *b, size_t l); -guint ggept_filesize_encode(guint64 filesize, char *data); -guint ggept_du_encode(guint32 uptime, char *data); -guint ggept_ct_encode(time_t stamp, char *data); -guint ggept_m_encode(guint32 mtype, char *data); +uint ggept_filesize_encode(uint64 filesize, char *data, size_t len); +uint ggept_stamp_filesize_encode(time_t s, uint64 fs, char *data, size_t len); +uint ggept_du_encode(uint32 uptime, char *data, size_t len); +uint ggept_ct_encode(time_t stamp, char *data, size_t len); +uint ggept_m_encode(uint32 mtype, char *data, size_t len); ggept_status_t ggept_ipp_pack(ggep_stream_t *gs, const gnet_host_t *hvec, size_t hcnt, const gnet_host_t *evec, size_t ecnt, - gboolean add_ipv6, gboolean no_ipv4); + bool add_ipv6, bool no_ipv4); ggept_status_t ggept_dhtipp_pack(ggep_stream_t *gs, const gnet_host_t *hvec, size_t hcnt, - gboolean add_ipv6, gboolean no_ipv4); + bool add_ipv6, bool no_ipv4); ggept_status_t ggept_push_pack(ggep_stream_t *gs, const sequence_t *hseq, size_t max, unsigned flags); ggept_status_t ggept_a_pack(ggep_stream_t *gs,
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/ghc.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/ghc.c
Changed
@@ -45,6 +45,8 @@ #include "lib/halloc.h" #include "lib/list.h" #include "lib/random.h" +#include "lib/str.h" +#include "lib/stringify.h" #include "lib/walloc.h" #include "if/gnet_property_priv.h" @@ -63,10 +65,10 @@ */ static const char * const boot_url = { /* Uses DNS round-robin and serves freshly crawled data */ - "http://dl.frostwire.com/frostwire/gnutella.net", + "http://ghc4.gtkgnutella.com/list4", }; -static gboolean ghc_connecting; +static bool ghc_connecting; static list_t *ghc_list; /**< List of ``struct ghc'' */ struct ghc { @@ -94,15 +96,15 @@ unsigned processed; /**< User callback can count retained lines */ }; -typedef gboolean (parse_dispatch_t) - (struct parse_context *c, const gchar *buf, size_t len); +typedef bool (parse_dispatch_t) + (struct parse_context *c, const char *buf, size_t len); typedef void (parse_eof_t)(struct parse_context *c); /** * Free parsing context. */ static void -parse_context_free(gpointer obj) +parse_context_free(void *obj) { struct parse_context *ctx = (struct parse_context *) obj; @@ -117,7 +119,7 @@ * @param `maxlines' the max number of lines we want to parse. */ static void -parse_context_set(gpointer handle, gint maxlines) +parse_context_set(void *handle, int maxlines) { struct parse_context *ctx; @@ -138,11 +140,11 @@ * to finalize parsing. */ static void -parse_dispatch_lines(gpointer handle, const gchar *buf, size_t len, +parse_dispatch_lines(void *handle, const char *buf, size_t len, parse_dispatch_t cb, parse_eof_t eofile) { struct parse_context *ctx; - const gchar *p = buf; + const char *p = buf; size_t remain = len; /* @@ -165,8 +167,8 @@ */ for (;;) { - gchar *line; - gboolean error; + char *line; + bool error; size_t line_len; size_t parsed; @@ -207,8 +209,8 @@ ctx->lines++; if (ctx->lines >= ctx->maxlines) { - const gchar *req; - const gchar *url = http_async_info(handle, &req, NULL, NULL, NULL); + const char *req; + const char *url = http_async_info(handle, &req, NULL, NULL, NULL); if (GNET_PROPERTY(bootstrap_debug)) g_warning("BOOT GHC got %u+ lines from \"%s %s\", stopping", ctx->lines, req, url); @@ -308,8 +310,8 @@ * * @return FALSE to stop processing of any remaining data. */ -static gboolean -ghc_host_line(struct parse_context *ctx, const gchar *buf, size_t len) +static bool +ghc_host_line(struct parse_context *ctx, const char *buf, size_t len) { if (GNET_PROPERTY(bootstrap_debug) > 2) g_debug("BOOT GHC host line #%u (%zu bytes): %s", @@ -317,7 +319,7 @@ if (len) { host_addr_t addr; - guint16 port; + uint16 port; if (string_to_host_addr_port(buf, NULL, &addr, &port)) { ctx->processed++; @@ -325,8 +327,7 @@ if (GNET_PROPERTY(bootstrap_debug) > 1) g_debug("BOOT collected %s from GHC %s", - host_addr_to_string(addr), - http_async_info(ctx->handle, NULL, NULL, NULL, NULL)); + host_addr_to_string(addr), http_async_url(ctx->handle)); } } @@ -349,16 +350,15 @@ * Provide GUI feedback. */ - gm_snprintf(msg, sizeof(msg), + str_bprintf(msg, sizeof(msg), NG_("Got %d host from %s", "Got %d hosts from %s", ctx->processed), - ctx->processed, http_async_info(ghc_ctx.ha, NULL, NULL, NULL, NULL)); + ctx->processed, http_async_url(ghc_ctx.ha)); gcu_statusbar_message(msg); if (GNET_PROPERTY(bootstrap_debug)) g_debug("BOOT GHC got %d host%s from %s", - ctx->processed, ctx->processed == 1 ? "" : "s", - http_async_info(ghc_ctx.ha, NULL, NULL, NULL, NULL)); + ctx->processed, plural(ctx->processed), http_async_url(ghc_ctx.ha)); ghc_ctx.ha = NULL; ghc_connecting = FALSE; @@ -377,7 +377,7 @@ * HTTP request is being stopped. */ static void -ghc_error_ind(struct http_async *handle, http_errtype_t type, gpointer v) +ghc_error_ind(struct http_async *handle, http_errtype_t type, void *v) { http_async_log_error_dbg(handle, type, v, "BOOT GHC", GNET_PROPERTY(bootstrap_debug) > 1); @@ -390,10 +390,10 @@ * * @return TRUE if OK. */ -static gboolean +static bool ghc_pick(void) { - gboolean success = FALSE; + bool success = FALSE; char *url; url = ghc_get_next(); @@ -412,7 +412,7 @@ { char msg256; - gm_snprintf(msg, sizeof msg, _("Bootstrapping from %s"), url); + str_bprintf(msg, sizeof msg, _("Bootstrapping from %s"), url); gcu_statusbar_message(msg); } @@ -485,7 +485,7 @@ /** * Check whether we're waiting for some GHC hosts. */ -gboolean +bool ghc_is_waiting(void) { return ghc_connecting; @@ -494,15 +494,15 @@ /** * Initializations. */ -G_GNUC_COLD void +void G_COLD ghc_init(void) { - guint i; + uint i; g_return_if_fail(NULL == ghc_list); ghc_list = list_new(); - for (i = 0; i < G_N_ELEMENTS(boot_url); i++) { + for (i = 0; i < N_ITEMS(boot_url); i++) { struct ghc *ghc; ghc = ghc_new(boot_urli); ghc_list_add(ghc); @@ -512,7 +512,7 @@ /** * Final cleanup. */ -G_GNUC_COLD void +void G_COLD ghc_close(void) { if (ghc_connecting) {
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/ghc.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/ghc.h
Changed
@@ -44,7 +44,7 @@ void ghc_close(void); void ghc_get_hosts(void); -gboolean ghc_is_waiting(void); +bool ghc_is_waiting(void); #endif /* _core_ghc_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/gmsg.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/gmsg.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2014 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,7 +28,7 @@ * Gnutella Messages. * * @author Raphael Manfredi - * @date 2002-2003 + * @date 2002-2003, 2014 */ #include "common.h" @@ -36,6 +36,7 @@ #include <zlib.h> /* Z_DEFAULT_COMPRESSION */ #include "gmsg.h" + #include "gnet_stats.h" #include "mq_tcp.h" #include "mq_udp.h" @@ -46,21 +47,30 @@ #include "sq.h" #include "vmsg.h" +#include "g2/msg.h" + #include "if/gnet_property_priv.h" #include "if/dht/kmsg.h" #include "if/dht/kademlia.h" #include "lib/endian.h" -#include "lib/glib-missing.h" +#include "lib/omalloc.h" +#include "lib/once.h" #include "lib/pmsg.h" +#include "lib/pslist.h" +#include "lib/str.h" +#include "lib/stringify.h" #include "lib/unsigned.h" #include "lib/walloc.h" #include "lib/zlib_util.h" + #include "lib/override.h" /* Must be the last header included */ static const char *msg_name256; -static guint8 msg_weight256; /**< For gmsg_cmp() */ -static guint8 kmsg_weight256; /**< For gmsg_cmp() */ +static uint8 msg_weight256; /**< For gmsg_cmp() */ +static uint8 kmsg_weight256; /**< For gmsg_cmp() */ + +static zlib_deflater_t *gmsg_deflater; /** * Ensure that the gnutella message header has the correct size, @@ -70,7 +80,7 @@ * @param size the payload plus header size of the gnutella message. */ static inline void -gmsg_header_check(gconstpointer msg, guint32 size) +gmsg_header_check(const void *msg, uint32 size) { g_assert(gnutella_header_get_ttl(msg) > 0); g_assert(size >= GTA_HEADER_SIZE); @@ -88,16 +98,16 @@ * if the message is valid but cannot be interpreted locally. */ gmsg_valid_t -gmsg_size_valid(gconstpointer msg, guint16 *size) +gmsg_size_valid(const void *msg, uint16 *size) { - guint32 raw_size = gnutella_header_get_size(msg); - guint16 payload_size = (guint16) (raw_size & GTA_SIZE_MASK); - + uint32 raw_size = gnutella_header_get_size(msg); + uint16 payload_size = (uint16) (raw_size & GTA_SIZE_MASK); + if (raw_size == payload_size) goto ok; if (raw_size & GTA_SIZE_MARKED) { - guint32 flags = raw_size & ~GTA_SIZE_MASK; + uint32 flags = raw_size & ~GTA_SIZE_MASK; flags &= ~GTA_SIZE_MARKED; *size = payload_size; @@ -131,7 +141,7 @@ * to the specified file descriptor. */ static void -gmsg_dump(FILE *out, gconstpointer data, guint32 size) +gmsg_dump(FILE *out, const void *data, uint32 size) { g_assert(size >= GTA_HEADER_SIZE); @@ -143,8 +153,8 @@ * Same as gmsg_dump(), but the header and the PDU data are separated. */ static void -gmsg_split_dump(FILE *out, gconstpointer head, gconstpointer data, - guint32 size) +gmsg_split_dump(FILE *out, const void *head, const void *data, + uint32 size) { g_assert(size >= GTA_HEADER_SIZE); @@ -155,7 +165,7 @@ /** * Initialization of the Gnutella message structures. */ -G_GNUC_COLD void +void G_COLD gmsg_init(void) { int i; @@ -164,7 +174,7 @@ for (i = 0; i < 256; i++) { const char *s = "unknown"; - guint w = 0; + uint w = 0; switch ((enum gta_msg) i) { case GTA_MSG_DHT: w = 0; s = "DHT"; break; @@ -179,6 +189,7 @@ case GTA_MSG_RUDP: w = 6; s = "RUDP"; break; case GTA_MSG_QRP: w = 8; s = "QRP"; break; case GTA_MSG_BYE: w = 9; s = "BYE"; break; + case GTA_MSG_G2_SEARCH: /* Not a real message */ break; } msg_namei = s; msg_weighti = w; @@ -198,7 +209,7 @@ */ for (i = 0; i < 256; i++) { - guint w = 0; + uint w = 0; switch ((enum kda_msg) i) { case KDA_MSG_PING_REQUEST: w = 1; break; @@ -214,13 +225,24 @@ } kmsg_weighti = w; } + + gmsg_deflater = zlib_deflater_make(NULL, 0, Z_BEST_COMPRESSION); +} + +/** + * Destroy locally-allocated data. + */ +void G_COLD +gmsg_close(void) +{ + zlib_deflater_free(gmsg_deflater, TRUE); } /** * Convert message function number into name. */ const char * -gmsg_name(guint function) +gmsg_name(uint function) { if (function > 255) return "invalid"; @@ -235,7 +257,7 @@ * its memory. */ pmsg_t * -gmsg_to_pmsg(gconstpointer msg, guint32 size) +gmsg_to_pmsg(const void *msg, uint32 size) { pmsg_t *mb; @@ -261,13 +283,11 @@ * TTL having the GTA_UDP_DEFLATED bit set. */ pmsg_t * -gmsg_split_to_deflated_pmsg(const void *head, const void *data, guint32 size) +gmsg_split_to_deflated_pmsg(const void *head, const void *data, uint32 size) { - guint32 plen = size - GTA_HEADER_SIZE; /* Raw payload length */ - guint32 blen = plen + (plen >> 4) + 12; /* 1.0625 times orginal */ - gpointer buf; /* Compression made there */ - guint32 deflated_length; /* Length of deflated data */ - zlib_deflater_t *z; + uint32 plen = size - GTA_HEADER_SIZE; /* Raw payload length */ + void *buf; /* Compression made there */ + uint32 deflated_length; /* Length of deflated data */ pmsg_t *mb; /* @@ -277,43 +297,36 @@ */ if (plen <= 5) - return gmsg_split_to_pmsg(head, data, size); + goto send_raw; /* - * Compress payload into newly allocated buffer. + * Compress payload into internally allocated buffer (in gmsg_deflater). */ - buf = walloc(blen); - z = zlib_deflater_make_into(data, plen, buf, blen, Z_DEFAULT_COMPRESSION); + zlib_deflater_reset(gmsg_deflater, data, plen); - switch (zlib_deflate(z, plen)) { - case -1: + if (-1 == zlib_deflate_all(gmsg_deflater)) { + g_carp("%s(): deflate error", G_STRFUNC); goto send_raw; - break; - case 0: - break; - case 1: - g_error("did not deflate the whole input"); - break; } - g_assert(zlib_deflater_closed(z)); - /* * Check whether compressed data is smaller than the original payload. */ - deflated_length = zlib_deflater_outlen(z); + deflated_length = zlib_deflater_outlen(gmsg_deflater); + buf = zlib_deflater_out(gmsg_deflater); - g_assert(deflated_length <= blen); g_assert(zlib_is_valid_header(buf, deflated_length)); + gnet_stats_inc_general(GNR_UDP_COMPRESSION_ATTEMPTS); + if (deflated_length >= plen) { if (GNET_PROPERTY(udp_debug)) g_debug("UDP not deflating %s into %d bytes", gmsg_infostr_full_split(head, data, size), deflated_length); - gnet_stats_count_general(GNR_UDP_LARGER_HENCE_NOT_COMPRESSED, 1); + gnet_stats_inc_general(GNR_UDP_LARGER_HENCE_NOT_COMPRESSED); goto send_raw; } @@ -323,16 +336,13 @@ mb = gmsg_split_to_pmsg(head, buf, deflated_length + GTA_HEADER_SIZE); - wfree(buf, blen); - zlib_deflater_free(z, FALSE); - if (GNET_PROPERTY(udp_debug)) g_debug("UDP deflated %s into %d bytes", gmsg_infostr_full_split(head, data, size), deflated_length); { - gpointer header; - + void *header; + header = pmsg_start(mb); gnutella_header_set_ttl(header, gnutella_header_get_ttl(header) | GTA_UDP_DEFLATED); @@ -343,12 +353,9 @@ send_raw: /* - * Cleanup and send payload as-is (uncompressed). + * Send payload as-is (uncompressed). */ - wfree(buf, blen); - zlib_deflater_free(z, FALSE); - return gmsg_split_to_pmsg(head, data, size); } @@ -368,7 +375,7 @@ * TTL having the GTA_UDP_DEFLATED bit set. */ pmsg_t * -gmsg_to_deflated_pmsg(gconstpointer msg, guint32 size) +gmsg_to_deflated_pmsg(const void *msg, uint32 size) { const char *data = const_ptr_add_offset(msg, GTA_HEADER_SIZE); @@ -379,7 +386,7 @@ * Construct control PDU descriptor from message. */ pmsg_t * -gmsg_to_ctrl_pmsg(gconstpointer msg, guint32 size) +gmsg_to_ctrl_pmsg(const void *msg, uint32 size) { pmsg_t *mb; @@ -392,8 +399,8 @@ * Construct extended control PDU (with free routine) from message. */ pmsg_t * -gmsg_to_ctrl_pmsg_extend(gconstpointer msg, guint32 size, - pmsg_free_t free_cb, gpointer arg) +gmsg_to_ctrl_pmsg_extend(const void *msg, uint32 size, + pmsg_free_t free_cb, void *arg) { pmsg_t *mb; @@ -407,7 +414,7 @@ * Write message data into new empty message buffer. */ static void -write_message(pmsg_t *mb, gconstpointer head, gconstpointer data, guint32 size) +write_message(pmsg_t *mb, const void *head, const void *data, uint32 size) { size_t written; @@ -425,7 +432,7 @@ * @param size the total size of the message, header + payload */ pmsg_t * -gmsg_split_to_pmsg(gconstpointer head, gconstpointer data, guint32 size) +gmsg_split_to_pmsg(const void *head, const void *data, uint32 size) { pmsg_t *mb; @@ -440,8 +447,8 @@ * Construct extended PDU (with free routine) from header and data. */ pmsg_t * -gmsg_split_to_pmsg_extend(gconstpointer head, gconstpointer data, - guint32 size, pmsg_free_t free_cb, gpointer arg) +gmsg_split_to_pmsg_extend(const void *head, const void *data, + uint32 size, pmsg_free_t free_cb, void *arg) { pmsg_t *mb; @@ -470,15 +477,15 @@ * to the caller to free that mb, if needed, upon return. */ void -gmsg_mb_sendto_all(const GSList *sl, pmsg_t *mb) +gmsg_mb_sendto_all(const pslist_t *sl, pmsg_t *mb) { - gmsg_header_check(cast_to_gconstpointer(pmsg_start(mb)), pmsg_size(mb)); + gmsg_header_check(cast_to_constpointer(pmsg_start(mb)), pmsg_size(mb)); if (GNET_PROPERTY(gmsg_debug) > 5 && gmsg_hops(pmsg_start(mb)) == 0) gmsg_dump(stdout, pmsg_start(mb), pmsg_size(mb)); - for (/* empty */; sl; sl = g_slist_next(sl)) { - struct gnutella_node *dn = sl->data; + for (/* empty */; sl; sl = pslist_next(sl)) { + gnutella_node_t *dn = sl->data; if (!NODE_IS_ESTABLISHED(dn)) continue; mq_tcp_putq(dn->outq, pmsg_clone(mb), NULL); @@ -492,11 +499,12 @@ * a private instance is supplied. */ void -gmsg_mb_routeto_one(const struct gnutella_node *from, - const struct gnutella_node *to, pmsg_t *mb) +gmsg_mb_routeto_one(const gnutella_node_t *from, + const gnutella_node_t *to, pmsg_t *mb) { + g_assert(!NODE_TALKS_G2(to)); g_assert(!pmsg_was_sent(mb)); - gmsg_header_check(cast_to_gconstpointer(pmsg_start(mb)), pmsg_size(mb)); + gmsg_header_check(cast_to_constpointer(pmsg_start(mb)), pmsg_size(mb)); if (!NODE_IS_WRITABLE(to)) return; @@ -520,7 +528,7 @@ * a private instance is supplied. */ void -gmsg_mb_sendto_one(const struct gnutella_node *n, pmsg_t *mb) +gmsg_mb_sendto_one(const gnutella_node_t *n, pmsg_t *mb) { gmsg_mb_routeto_one(NULL, n, mb); } @@ -529,8 +537,10 @@ * Send message to one node. */ void -gmsg_sendto_one(struct gnutella_node *n, gconstpointer msg, guint32 size) +gmsg_sendto_one(gnutella_node_t *n, const void *msg, uint32 size) { + g_assert(!NODE_TALKS_G2(n)); + if (!NODE_IS_WRITABLE(n)) return; @@ -551,14 +561,20 @@ gnet_host_set(&to, n->addr, n->port); if (GNET_PROPERTY(guess_server_debug) > 19) { - g_debug("GUESS sending local hit (%s) for %s to %s", + g_debug("GUESS sending local hit (%s) for #%s to %s", + NODE_CAN_SR_UDP(n) ? "reliably" : NODE_CAN_INFLATE(n) ? "possibly deflated" : "uncompressed", guid_hex_str(gnutella_header_get_muid(msg)), node_infostr(n)); } - mb = NODE_CAN_INFLATE(n) ? - gmsg_to_deflated_pmsg(msg, size) : - gmsg_to_pmsg(msg, size); + if (NODE_CAN_SR_UDP(n)) { + mb = gmsg_to_pmsg(msg, size); + pmsg_mark_reliable(mb); + } else { + mb = NODE_CAN_INFLATE(n) ? + gmsg_to_deflated_pmsg(msg, size) : + gmsg_to_pmsg(msg, size); + } mq_udp_putq(n->outq, mb, &to); } else { @@ -572,8 +588,9 @@ * A control message is inserted ahead any other queued regular data. */ void -gmsg_ctrl_sendto_one(struct gnutella_node *n, gconstpointer msg, guint32 size) +gmsg_ctrl_sendto_one(gnutella_node_t *n, const void *msg, uint32 size) { + g_assert(!NODE_TALKS_G2(n)); g_return_if_fail(!NODE_IS_UDP(n)); gmsg_header_check(msg, size); @@ -592,8 +609,9 @@ */ void gmsg_search_sendto_one( - struct gnutella_node *n, gnet_search_t sh, gconstpointer msg, guint32 size) + gnutella_node_t *n, gnet_search_t sh, const void *msg, uint32 size) { + g_assert(!NODE_TALKS_G2(n)); g_return_if_fail(!NODE_IS_UDP(n)); gmsg_header_check(msg, size); @@ -612,9 +630,10 @@ * Send message consisting of header and data to one node. */ static void -gmsg_split_send_from_to(struct gnutella_node *from, struct gnutella_node *to, - gconstpointer head, gconstpointer data, guint32 size) +gmsg_split_send_from_to(gnutella_node_t *from, gnutella_node_t *to, + const void *head, const void *data, uint32 size) { + g_assert(!NODE_TALKS_G2(to)); g_return_if_fail(!NODE_IS_UDP(to)); gmsg_header_check(head, size); @@ -632,8 +651,8 @@ * Send message consisting of header and data to one node. */ void -gmsg_split_sendto_one(struct gnutella_node *n, - gconstpointer head, gconstpointer data, guint32 size) +gmsg_split_sendto_one(gnutella_node_t *n, + const void *head, const void *data, uint32 size) { gmsg_split_send_from_to(NULL, n, head, data, size); } @@ -642,8 +661,8 @@ * Route message consisting of header and data to one node. */ static void -gmsg_split_routeto_one(struct gnutella_node *from, struct gnutella_node *to, - gconstpointer head, gconstpointer data, guint32 size) +gmsg_split_routeto_one(gnutella_node_t *from, gnutella_node_t *to, + const void *head, const void *data, uint32 size) { gmsg_split_send_from_to(from, to, head, data, size); } @@ -652,7 +671,7 @@ * Broadcast message to all nodes in the list. */ void -gmsg_sendto_all(const GSList *sl, gconstpointer msg, guint32 size) +gmsg_sendto_all(const pslist_t *sl, const void *msg, uint32 size) { pmsg_t *mb = gmsg_to_pmsg(msg, size); @@ -661,8 +680,8 @@ if (GNET_PROPERTY(gmsg_debug) > 5 && gmsg_hops(msg) == 0) gmsg_dump(stdout, msg, size); - for (/* empty */; sl; sl = g_slist_next(sl)) { - struct gnutella_node *dn = sl->data; + for (/* empty */; sl; sl = pslist_next(sl)) { + gnutella_node_t *dn = sl->data; if (!NODE_IS_ESTABLISHED(dn)) continue; mq_tcp_putq(dn->outq, pmsg_clone(mb), NULL); @@ -676,7 +695,7 @@ */ void gmsg_search_sendto_all( - const GSList *sl, gnet_search_t sh, gconstpointer msg, guint32 size) + const pslist_t *sl, gnet_search_t sh, const void *msg, uint32 size) { pmsg_t *mb = gmsg_to_pmsg(msg, size); @@ -686,8 +705,8 @@ if (GNET_PROPERTY(gmsg_debug) > 5 && gmsg_hops(msg) == 0) gmsg_dump(stdout, msg, size); - for (/* empty */; sl; sl = g_slist_next(sl)) { - struct gnutella_node *dn = sl->data; + for (/* empty */; sl; sl = pslist_next(sl)) { + gnutella_node_t *dn = sl->data; /* * When switching UP -> leaf, it may happen that we try to send @@ -710,12 +729,12 @@ * We never broadcast anything to a leaf node. Those are handled specially. */ static void -gmsg_split_routeto_all_but_one(const struct gnutella_node *from, - const GSList *sl, const struct gnutella_node *n, - gconstpointer head, gconstpointer data, guint32 size) +gmsg_split_routeto_all_but_one(const gnutella_node_t *from, + const pslist_t *sl, const gnutella_node_t *n, + const void *head, const void *data, uint32 size) { pmsg_t *mb = gmsg_split_to_pmsg(head, data, size); - gboolean skip_up_with_qrp = FALSE; + bool skip_up_with_qrp = FALSE; /* * Special treatment for TTL=1 queries in UP mode. @@ -732,8 +751,8 @@ /* relayed broadcasted message, cannot be sent with hops=0 */ - for (/* empty */; sl; sl = g_slist_next(sl)) { - struct gnutella_node *dn = sl->data; + for (/* empty */; sl; sl = pslist_next(sl)) { + gnutella_node_t *dn = sl->data; if (dn == n) continue; if (!NODE_IS_ESTABLISHED(dn) || NODE_IS_LEAF(dn)) @@ -753,9 +772,9 @@ */ void gmsg_split_routeto_all( - const GSList *sl, - const struct gnutella_node *from, - gconstpointer head, gconstpointer data, guint32 size) + const pslist_t *sl, + const gnutella_node_t *from, + const void *head, const void *data, uint32 size) { pmsg_t *mb = gmsg_split_to_pmsg(head, data, size); @@ -763,8 +782,8 @@ /* relayed broadcasted message, cannot be sent with hops=0 */ - for (/* empty */; sl; sl = g_slist_next(sl)) { - struct gnutella_node *dn = sl->data; + for (/* empty */; sl; sl = pslist_next(sl)) { + gnutella_node_t *dn = sl->data; if (!NODE_IS_ESTABLISHED(dn)) continue; @@ -780,13 +799,13 @@ } /** - * Send message held in current node according to route specification. + * Send Gnutella message held in current node according to route specification. */ void -gmsg_sendto_route(struct gnutella_node *n, struct route_dest *rt) +gmsg_sendto_route(gnutella_node_t *n, struct route_dest *rt) { - struct gnutella_node *rt_node = rt->ur.u_node; - const GSList *sl; + gnutella_node_t *rt_node = rt->ur.u_node; + const pslist_t *sl; /* * If during processing (e.g. in search_request_preprocess()) after @@ -801,9 +820,24 @@ switch (rt->type) { case ROUTE_NONE: return; + case ROUTE_LEAVES: + g_assert_not_reached(); + break; case ROUTE_ONE: + node_check(rt_node); + + /* + * Make sure the message does not accidentally cross a network boundary. + * This is a Gnutella message, it can only be sent to Gnutella nodes. + */ + + if (NODE_TALKS_G2(rt_node)) { + gnet_stats_count_dropped(n, MSG_DROP_NETWORK_CROSSING); + return; + } + /* - * If message has size flags and the recipoent cannot understand it, + * If message has size flags and the recipient cannot understand it, * then too bad but we have to drop that message. We account it * as dropped because this message was meant to be routed to one * recipient only. @@ -823,8 +857,11 @@ &n->header, n->data, n->size + GTA_HEADER_SIZE); return; case ROUTE_MULTI: - for (sl = rt->ur.u_nodes; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(rt->ur.u_nodes, sl) { rt_node = sl->data; + node_check(rt_node); + if (NODE_TALKS_G2(rt_node)) + continue; if (n->header_flags && !NODE_CAN_SFLAG(rt_node)) continue; gmsg_split_routeto_one(n, rt_node, @@ -852,11 +889,11 @@ * Therefore, unless the OOB flag is set, we always check for an existing * route. */ -static gboolean -gmsg_query_can_send(pmsg_t *mb, const mqueue_t *q) +static bool +gmsg_query_can_send(const pmsg_t *mb, const void *q) { gnutella_node_t *n = mq_node(q); - gconstpointer msg = pmsg_start(mb); + const void *msg = pmsg_start(mb); g_assert(GTA_MSG_SEARCH == gnutella_header_get_function(msg)); @@ -886,11 +923,10 @@ void gmsg_install_presend(pmsg_t *mb) { - gconstpointer msg = pmsg_start(mb); + const void *msg = pmsg_start(mb); if (GTA_MSG_SEARCH == gnutella_header_get_function(msg)) { - pmsg_check_t old = pmsg_set_check(mb, gmsg_query_can_send); - g_assert(NULL == old); + pmsg_set_check(mb, gmsg_query_can_send); } } @@ -901,8 +937,8 @@ * Dropping of messages only happens when the connection is flow-controlled, * and there's not enough room in the queue. */ -gboolean -gmsg_can_drop(gconstpointer pdu, int size) +bool +gmsg_can_drop(const void *pdu, int size) { if ((size_t) size < GTA_HEADER_SIZE) return TRUE; @@ -923,17 +959,15 @@ * Perform a priority comparison between two messages, given as whole PDUs. * * If h2_pdu is FALSE, then h2 is only a Gnutella header, not a whole PDU. - * Caller must ensure that h1 points to the whole PDU, i.e. that the data - * immediately follows the Gnutella header. * * @return algebraic -1/0/+1 depending on relative order. */ -int -gmsg_cmp(gconstpointer h1, gconstpointer h2, gboolean h2_pdu) +static int +gmsg_cmp_internal(const void *h1, const void *h2, bool h2_pdu) { int w1, w2; - guint8 f1, f2; - guint8 hop1, hop2; + uint8 f1, f2; + uint8 hop1, hop2; f1 = gnutella_header_get_function(h1); f2 = gnutella_header_get_function(h2); @@ -965,8 +999,8 @@ */ if (f1 == GTA_MSG_DHT) { - guint32 s1 = gnutella_header_get_size(h1); - guint32 s2 = gnutella_header_get_size(h2); + uint32 s1 = gnutella_header_get_size(h1); + uint32 s2 = gnutella_header_get_size(h2); return f2 == GTA_MSG_DHT ? CMP(s2, s1) : -1; } else if (f2 == GTA_MSG_DHT) { return +1; /* Gnutella message (f1) more prioritary */ @@ -993,23 +1027,23 @@ case GTA_MSG_PUSH_REQUEST: case GTA_MSG_SEARCH_RESULTS: { - guint8 t1 = gnutella_header_get_ttl(h1); - guint8 t2 = gnutella_header_get_ttl(h2); + uint8 t1 = gnutella_header_get_ttl(h1); + uint8 t2 = gnutella_header_get_ttl(h2); int ttlc = CMP(t2, t1); /* If same TTL, favor the shortest message */ if (ttlc) { return ttlc; } else { - guint32 s1 = gnutella_header_get_size(h1); - guint32 s2 = gnutella_header_get_size(h2); + uint32 s1 = gnutella_header_get_size(h1); + uint32 s2 = gnutella_header_get_size(h2); return CMP(s2, s1); } } default: /* Favor the shortest */ { - guint32 s1 = gnutella_header_get_size(h1); - guint32 s2 = gnutella_header_get_size(h2); + uint32 s1 = gnutella_header_get_size(h1); + uint32 s2 = gnutella_header_get_size(h2); return CMP(s2, s1); } } @@ -1026,9 +1060,174 @@ } /** + * Perform a priority comparison between two messages, given as whole PDUs. + * + * @return algebraic -1/0/+1 depending on relative order. + */ +int +gmsg_cmp(const void *h1, const void *h2) +{ + return gmsg_cmp_internal(h1, h2, TRUE); +} + +/** + * Perform a priority comparison between two messages, h1 being a whole PDU + * and h2 being only a Gnutella header, not a whole PDU. + * + * Caller must ensure that h1 points to the whole PDU, i.e. that the Gnutella + * message data immediately follows the Gnutella header in memory. + * + * @return algebraic -1/0/+1 depending on relative order. + */ +int +gmsg_headcmp(const void *h1, const void *h2) +{ + return gmsg_cmp_internal(h1, h2, FALSE); +} + +/** + * Vector templates for message queue pruning. + * + * These only contain Gnutella headers with minimum fields set to ensure + * we can use gmsg_headcmp() on them. + */ +static struct gmsg_template { + iovec_t *vec; + size_t cnt; + once_flag_t done; +} gmsg_templates2; + +#define GMSG_TEMPLATE_QUERY 0 +#define GMSG_TEMPLATE_QHIT 1 + +static void +gmsg_mq_queries(void) +{ + struct gmsg_template *t = &gmsg_templatesGMSG_TEMPLATE_QUERY; + gnutella_header_t *header; + + /* + * First time the queue is in "swift" mode. + * + * Purge pending queries, since they are getting quite old. + * Leave our queries in for now (they have hops=0). + */ + + OMALLOC(t->vec); + t->cnt = 1; + + OMALLOC0(header); + gnutella_header_set_function(header, GTA_MSG_SEARCH); + gnutella_header_set_hops(header, 1); + gnutella_header_set_ttl(header, GNET_PROPERTY(max_ttl)); + + iovec_set(t->vec, header, sizeof *header); + + /* + * Whether or not this header template will let the queue make enough + * room is not important, for the initial checkpoint. Indeed, since + * the queue is now in "swift" mode , more query messages will be dropped + * at the next iteration, since we'll start dropping query hits by then, + * and hits are more prioritary than queries. + */ + + if (GNET_PROPERTY(gmsg_debug)) { + g_debug("%s(): generated %zu entr%s", + G_STRFUNC, t->cnt, plural_y(t->cnt)); + } +} + +static void +gmsg_mq_qhits(void) +{ + struct gmsg_template *t = &gmsg_templatesGMSG_TEMPLATE_QHIT; + uint8 max_ttl = GNET_PROPERTY(hard_ttl_limit); + int ttl; + + /* + * We're going to drop query hits... + * + * We start with the lowest prioritary query hit: low hops count + * and high TTL, and we progressively increase until we can drop + * the amount we need to drop. + * + * Note that we will never be able to drop the partially written + * message at the tail of the queue, even if it is less prioritary + * than our comparison point. + */ + + OMALLOC_ARRAY(t->vec, max_ttl + 1); + t->cnt = max_ttl + 1; + + for (ttl = max_ttl; ttl >= 0; ttl--) { + gnutella_header_t header; + + ZERO(&header); + gnutella_header_set_function(&header, GTA_MSG_SEARCH_RESULTS); + gnutella_header_set_hops(&header, max_ttl - ttl); + gnutella_header_set_ttl(&header, ttl); + + iovec_set(&t->vecmax_ttl - ttl, OCOPY(&header), sizeof header); + } + + /* + * Make sure gmsg_headcmp() agrees with our assumption here that the + * deeper we go into the array, the more prioritary the message. + */ + + for (ttl = 0; ttl < max_ttl; ttl++) { + const void *prev = iovec_base(&t->vecttl); + const void *next = iovec_base(&t->vecttl + 1); + g_assert_log(gmsg_headcmp(prev, next) < 0, + "%s(): ttl=%d, prev is %s", + G_STRFUNC, ttl, gmsg_infostr(prev)); + } + + if (GNET_PROPERTY(gmsg_debug)) { + g_debug("%s(): generated %zu entr%s", + G_STRFUNC, t->cnt, plural_y(t->cnt)); + } +} + + +/** + * Generates vector of message templates that will be used by the message + * queue to prioritize traffic. + * + * The vector contains a sorted list of Gnutella headers. The deeper we go + * in the vector, the more important the message is deemed to be, according + * to gmsg_headcmp(). + * + * These vectors are only allocated once, and then they are never freed. + * + * @param initial whether queue is just entering swift mode + * @param vcnt where the amount of entries in the vector is written + * + * @return the base of the vector of messages + */ +iovec_t * +gmsg_mq_templates(bool initial, size_t *vcnt) +{ + struct gmsg_template *t; + + if (initial) { + t = &gmsg_templatesGMSG_TEMPLATE_QUERY; + ONCE_FLAG_RUN(t->done, gmsg_mq_queries); + } else { + t = &gmsg_templatesGMSG_TEMPLATE_QHIT; + ONCE_FLAG_RUN(t->done, gmsg_mq_qhits); + } + + if (vcnt != NULL) + *vcnt = t->cnt; + + return t->vec; +} + +/** * @param msg start of message (Gnutella header), followed by data * @param msg_len length of the buffer containing the header + body - * + * * @returns formatted static string: * * msg_type (payload length) hops=x, TTL=x @@ -1038,7 +1237,7 @@ * payload of that message. */ char * -gmsg_infostr_full(gconstpointer msg, size_t msg_len) +gmsg_infostr_full(const void *msg, size_t msg_len) { const char *data = const_ptr_add_offset(msg, GTA_HEADER_SIZE); size_t data_len = msg_len - GTA_HEADER_SIZE; @@ -1055,11 +1254,11 @@ */ static size_t gmsg_infostr_split_to_buf( - gconstpointer head, gconstpointer data, size_t data_len, + const void *head, const void *data, size_t data_len, char *buf, size_t buf_size) { - guint8 function = gnutella_header_get_function(head); - guint16 size = gmsg_size(head); + uint8 function = gnutella_header_get_function(head); + uint16 size = gmsg_size(head); if ( GTA_MSG_DHT == function && @@ -1070,9 +1269,10 @@ return kmsg_infostr_to_buf(head, buf, buf_size); } - return gm_snprintf(buf, buf_size, "%s (%u byte%s) %shops=%d, TTL=%d", + return str_bprintf(buf, buf_size, "%s (%u byte%s) #%s %shops=%d, TTL=%d", gmsg_name(function), - size, size == 1 ? "" : "s", + size, plural(size), + guid_hex_str(gnutella_header_get_muid(head)), gnutella_header_get_ttl(head) & GTA_UDP_DEFLATED ? "deflated " : "", gnutella_header_get_hops(head), gnutella_header_get_ttl(head) & ~GTA_UDP_DEFLATED); @@ -1083,19 +1283,20 @@ * string and returns the amount of bytes written. */ static size_t -gmsg_infostr_to_buf(gconstpointer msg, char *buf, size_t buf_size) +gmsg_infostr_to_buf(const void *msg, char *buf, size_t buf_size) { - guint8 function = gnutella_header_get_function(msg); - guint16 size = gmsg_size(msg); + uint8 function = gnutella_header_get_function(msg); + uint16 size = gmsg_size(msg); /* * We cannot assume we have more than the Gnutella header, so * we can't go and probe DHT messages. */ - return gm_snprintf(buf, buf_size, "%s (%u byte%s) %shops=%d, TTL=%d", + return str_bprintf(buf, buf_size, "%s (%u byte%s) #%s %shops=%d, TTL=%d", gmsg_name(function), - size, size == 1 ? "" : "s", + size, plural(size), + guid_hex_str(gnutella_header_get_muid(msg)), gnutella_header_get_ttl(msg) & GTA_UDP_DEFLATED ? "deflated " : "", gnutella_header_get_hops(msg), gnutella_header_get_ttl(msg) & ~GTA_UDP_DEFLATED); @@ -1106,7 +1307,7 @@ * the formatted string and returns the amount of bytes written. */ size_t -gmsg_infostr_full_split_to_buf(gconstpointer head, gconstpointer data, +gmsg_infostr_full_split_to_buf(const void *head, const void *data, size_t data_len, char *buf, size_t buf_size) { size_t rw; @@ -1118,15 +1319,16 @@ case GTA_MSG_VENDOR: case GTA_MSG_STANDARD: { - guint16 size = data_len & GTA_SIZE_MASK; - guint8 ttl = gnutella_header_get_ttl(head); + uint16 size = data_len & GTA_SIZE_MASK; + uint8 ttl = gnutella_header_get_ttl(head); - rw = gm_snprintf(buf, buf_size, - "%s %s (%u byte%s) %shops=%d, TTL=%d", + rw = str_bprintf(buf, buf_size, + "%s %s (%u byte%s) #%s %shops=%d, TTL=%d", gmsg_name(gnutella_header_get_function(head)), vmsg_infostr(data, size), - size, size == 1 ? "" : "s", - ttl & GTA_UDP_DEFLATED ? "deflated " : + size, plural(size), + guid_hex_str(gnutella_header_get_muid(head)), + ttl & GTA_UDP_DEFLATED ? "deflated " : ttl & GTA_UDP_CAN_INFLATE ? "can_inflate " : "", gnutella_header_get_hops(head), ttl & ~(GTA_UDP_DEFLATED | GTA_UDP_CAN_INFLATE)); @@ -1144,7 +1346,7 @@ * which is ``buf_len'' bytes long and returns the amount of bytes written. */ static size_t -gmsg_infostr_full_to_buf(gconstpointer msg, size_t msg_len, +gmsg_infostr_full_to_buf(const void *msg, size_t msg_len, char *buf, size_t buf_len) { const char *data = (const char *) msg + GTA_HEADER_SIZE; @@ -1159,15 +1361,15 @@ * * @returns formatted static string: * - * msg_type (payload length) hops=x, TTL=x + * msg_type (payload length) MUID hops=x, TTL=x * * that can also decompile vendor messages given a pointer on the header * and on the data of the message (which may not be consecutive in memory). */ char * -gmsg_infostr_full_split(gconstpointer head, gconstpointer data, size_t data_len) +gmsg_infostr_full_split(const void *head, const void *data, size_t data_len) { - static char buf160; + static char buf180; gmsg_infostr_full_split_to_buf(head, data, data_len, buf, sizeof buf); return buf; @@ -1178,12 +1380,12 @@ * * @returns formatted static string: * - * msg_type (payload length) hops=x, TTL=x + * msg_type (payload length) MUID hops=x, TTL=x */ const char * -gmsg_infostr(gconstpointer msg) +gmsg_infostr(const void *msg) { - static char buf80; + static char buf96; gmsg_infostr_to_buf(msg, buf, sizeof buf); return buf; } @@ -1195,30 +1397,36 @@ * * The advantage over calling gmsg_infostr(&n->header) is that the node * information is also printed if by chance the hop count of the message is 1 - * or 0 (for UDP messages). + * or 0 (for UDP messages). Also this routine works for G2 nodes. * * @returns formatted static string: * - * msg_type (payload length) hops=x, TTL=x + * msg_type (payload length) MUID hops=x, TTL=x * * if message is from a remote node, or * - * msg_type (payload length) hops=x, TTL=x //IP:port <vendor>// + * msg_type (payload length) MUID hops=x, TTL=x //IP:port <vendor>// * * if message comes from a neighbour. */ const char * gmsg_node_infostr(const gnutella_node_t *n) { - static char buf160; + static char buf180; + uint8 hops; size_t w; - w = gmsg_infostr_to_buf(&n->header, buf, sizeof buf); - - if (gnutella_header_get_hops(n->header) <= 1) { - gm_snprintf(&bufw, sizeof buf - w, " //%s//", node_infostr(n)); + if (NODE_TALKS_G2(n)) { + w = g2_msg_infostr_to_buf(n->data, n->size, buf, sizeof buf); + hops = 1; + } else { + w = gmsg_infostr_to_buf(&n->header, buf, sizeof buf); + hops = gnutella_header_get_hops(n->header); } + if (hops <= 1) + str_bprintf(&bufw, sizeof buf - w, " //%s//", node_infostr(n)); + return buf; } @@ -1227,7 +1435,7 @@ */ void gmsg_log_split_dropped( - gconstpointer head, gconstpointer data, size_t data_len, + const void *head, const void *data, size_t data_len, const char *reason, ...) { char rbuf256; @@ -1240,7 +1448,7 @@ va_start(args, reason); rbuf0 = ':'; rbuf1 = ' '; - gm_vsnprintf(&rbuf2, sizeof rbuf - 2, reason, args); + str_vbprintf(&rbuf2, sizeof rbuf - 2, reason, args); va_end(args); } else { rbuf0 = '\0'; @@ -1250,38 +1458,70 @@ } /** - * Log duplicate message (given with separated header and data) with reason. + * Log dropped message with reason. */ void -gmsg_log_split_duplicate( - gconstpointer head, gconstpointer data, size_t data_len, - const char *reason, ...) +gmsg_log_dropped(const gnutella_node_t *n, const char *reason, ...) { char rbuf256; char buf128; - gmsg_infostr_full_split_to_buf(head, data, data_len, buf, sizeof buf); + if (NODE_TALKS_G2(n)) { + g2_msg_infostr_to_buf(n->data, n->size, buf, sizeof buf); + } else { + gmsg_infostr_full_split_to_buf(&n->header, n->data, n->size, + buf, sizeof buf); + } if (reason) { va_list args; va_start(args, reason); rbuf0 = ':'; rbuf1 = ' '; - gm_vsnprintf(&rbuf2, sizeof rbuf - 2, reason, args); + str_vbprintf(&rbuf2, sizeof rbuf - 2, reason, args); va_end(args); } else { rbuf0 = '\0'; } - g_debug("DUP %s %s%s", - guid_hex_str(gnutella_header_get_muid(head)), buf, rbuf); + g_debug("DROP %s%s", buf, rbuf); +} + +/** + * Log duplicate message with reason. + */ +void +gmsg_log_duplicate(const gnutella_node_t *n, const char *reason, ...) +{ + char rbuf256; + char buf160; + + if (NODE_TALKS_G2(n)) { + g2_msg_infostr_to_buf(n->data, n->size, buf, sizeof buf); + } else { + gmsg_infostr_full_split_to_buf(&n->header, n->data, n->size, + buf, sizeof buf); + } + + if (reason) { + va_list args; + va_start(args, reason); + rbuf0 = ':'; + rbuf1 = ' '; + str_vbprintf(&rbuf2, sizeof rbuf - 2, reason, args); + va_end(args); + } else { + rbuf0 = '\0'; + } + + g_debug("DUP %s%s", buf, rbuf); } /** * Log dropped message (held in message block) with supplied reason. */ void -gmsg_log_dropped_pmsg(pmsg_t *mb, const char *reason, ...) +gmsg_log_dropped_pmsg(const pmsg_t *mb, const char *reason, ...) { char rbuf256; char buf128; @@ -1294,7 +1534,7 @@ va_start(args, reason); rbuf0 = ':'; rbuf1 = ' '; - gm_vsnprintf(&rbuf2, sizeof rbuf - 2, reason, args); + str_vbprintf(&rbuf2, sizeof rbuf - 2, reason, args); va_end(args); } else { rbuf0 = '\0'; @@ -1307,20 +1547,24 @@ * Log bad message, the node's vendor, and reason. */ void -gmsg_log_bad(const struct gnutella_node *n, const char *reason, ...) +gmsg_log_bad(const gnutella_node_t *n, const char *reason, ...) { char rbuf256; char buf128; - gmsg_infostr_full_split_to_buf( - &n->header, n->data, n->size, buf, sizeof buf); + if (NODE_TALKS_G2(n)) { + g2_msg_infostr_to_buf(n->data, n->size, buf, sizeof buf); + } else { + gmsg_infostr_full_split_to_buf( + &n->header, n->data, n->size, buf, sizeof buf); + } if (reason) { va_list args; va_start(args, reason); rbuf0 = ':'; rbuf1 = ' '; - gm_vsnprintf(&rbuf2, sizeof rbuf - 2, reason, args); + str_vbprintf(&rbuf2, sizeof rbuf - 2, reason, args); va_end(args); } else { rbuf0 = '\0'; @@ -1333,11 +1577,11 @@ * Check whether query message split between header and data is flagged * for OOB hit delivery. */ -gboolean -gmsg_split_is_oob_query(gconstpointer head, gconstpointer data) +bool +gmsg_split_is_oob_query(const void *head, const void *data) { - const guint16 mask = QUERY_F_MARK | QUERY_F_OOB_REPLY; - guint16 flags; + const uint16 mask = QUERY_F_MARK | QUERY_F_OOB_REPLY; + uint16 flags; g_assert(GTA_MSG_SEARCH == gnutella_header_get_function(head)); @@ -1349,8 +1593,8 @@ * Check whether query message starting at `msg' is flagged * for OOB hit delivery. */ -gboolean -gmsg_is_oob_query(gconstpointer msg) +bool +gmsg_is_oob_query(const void *msg) { const char *data = msg; return gmsg_split_is_oob_query(&data0, &dataGTA_HEADER_SIZE);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/gmsg.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/gmsg.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2014 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,7 +28,7 @@ * Gnutella Messages. * * @author Raphael Manfredi - * @date 2002-2003 + * @date 2002-2003, 2014 */ #ifndef _core_gmsg_h_ @@ -47,14 +47,14 @@ struct route_dest; struct mqueue; -static inline guint8 -gmsg_function(gconstpointer data) +static inline uint8 +gmsg_function(const void *data) { return gnutella_header_get_function(data); } -static inline guint8 -gmsg_hops(gconstpointer data) +static inline uint8 +gmsg_hops(const void *data) { return gnutella_header_get_hops(data); } @@ -66,8 +66,8 @@ /** * Returns the size (16-bit quantity) of a gnutella message. */ -static inline guint16 -gmsg_size(gconstpointer msg) +static inline uint16 +gmsg_size(const void *msg) { return gnutella_header_get_size(msg) & GTA_SIZE_MASK; } @@ -75,13 +75,13 @@ /** * Returns the flags (16-bit quantity) of a gnutella message. */ -static inline guint16 -gmsg_flags(gconstpointer msg) +static inline uint16 +gmsg_flags(const void *msg) { - guint32 size = gnutella_header_get_size(msg); + uint32 size = gnutella_header_get_size(msg); return (size & GTA_SIZE_MARKED) ? - (guint16) (size >> GTA_SIZE_FLAG_SHIFT) : 0; + (uint16) (size >> GTA_SIZE_FLAG_SHIFT) : 0; } typedef enum { @@ -96,66 +96,73 @@ */ void gmsg_init(void); -const char *gmsg_name(guint function); -gmsg_valid_t gmsg_size_valid(gconstpointer msg, guint16 *size); +void gmsg_close(void); +const char *gmsg_name(uint function); +gmsg_valid_t gmsg_size_valid(const void *msg, uint16 *size); -pmsg_t *gmsg_to_pmsg(gconstpointer msg, guint32 size); -pmsg_t *gmsg_to_deflated_pmsg(gconstpointer msg, guint32 size); +pmsg_t *gmsg_to_pmsg(const void *msg, uint32 size); +pmsg_t *gmsg_to_deflated_pmsg(const void *msg, uint32 size); pmsg_t *gmsg_split_to_deflated_pmsg(const void *head, - const void *data, guint32 size); -pmsg_t *gmsg_to_ctrl_pmsg(gconstpointer msg, guint32 size); -pmsg_t * gmsg_to_ctrl_pmsg_extend(gconstpointer msg, guint32 size, - pmsg_free_t free_cb, gpointer arg); -pmsg_t *gmsg_split_to_pmsg(gconstpointer head, gconstpointer data, - guint32 size); -pmsg_t * gmsg_split_to_pmsg_extend(gconstpointer head, gconstpointer data, - guint32 size, pmsg_free_t free_cb, gpointer arg); - -void gmsg_mb_sendto_all(const GSList *sl, pmsg_t *mb); + const void *data, uint32 size); +pmsg_t *gmsg_to_ctrl_pmsg(const void *msg, uint32 size); +pmsg_t * gmsg_to_ctrl_pmsg_extend(const void *msg, uint32 size, + pmsg_free_t free_cb, void *arg); +pmsg_t *gmsg_split_to_pmsg(const void *head, const void *data, + uint32 size); +pmsg_t * gmsg_split_to_pmsg_extend(const void *head, const void *data, + uint32 size, pmsg_free_t free_cb, void *arg); + +struct pslist; + +void gmsg_mb_sendto_all(const struct pslist *sl, pmsg_t *mb); void gmsg_mb_sendto_one(const struct gnutella_node *n, pmsg_t *mb); void gmsg_mb_routeto_one(const struct gnutella_node *from, const struct gnutella_node *to, pmsg_t *mb); -void gmsg_sendto_one(struct gnutella_node *n, gconstpointer msg, guint32 size); +void gmsg_sendto_one(struct gnutella_node *n, const void *msg, uint32 size); void gmsg_ctrl_sendto_one(struct gnutella_node *n, - gconstpointer msg, guint32 size); + const void *msg, uint32 size); void gmsg_split_sendto_one(struct gnutella_node *n, - gconstpointer head, gconstpointer data, guint32 size); -void gmsg_sendto_all(const GSList *l, gconstpointer msg, guint32 size); -void gmsg_split_routeto_all(const GSList *l, + const void *head, const void *data, uint32 size); +void gmsg_sendto_all(const struct pslist *l, const void *msg, uint32 size); +void gmsg_split_routeto_all(const struct pslist *l, const struct gnutella_node *from, - gconstpointer head, gconstpointer data, guint32 size); + const void *head, const void *data, uint32 size); void gmsg_sendto_route(struct gnutella_node *n, struct route_dest *rt); -gboolean gmsg_can_drop(gconstpointer pdu, int size); -gboolean gmsg_is_oob_query(gconstpointer msg); -gboolean gmsg_split_is_oob_query(gconstpointer head, gconstpointer data); -int gmsg_cmp(gconstpointer pdu1, gconstpointer pdu2, gboolean pdu2_complete); -const char *gmsg_infostr(gconstpointer msg); +bool gmsg_can_drop(const void *pdu, int size); +bool gmsg_is_oob_query(const void *msg); +bool gmsg_split_is_oob_query(const void *head, const void *data); +int gmsg_cmp(const void *pdu1, const void *pdu2); +int gmsg_headcmp(const void *pdu1, const void *pdu2); +const char *gmsg_infostr(const void *msg); const char *gmsg_node_infostr(const struct gnutella_node *n); -char *gmsg_infostr_full(gconstpointer msg, size_t msg_len); -char *gmsg_infostr_full_split(gconstpointer head, - gconstpointer data, size_t data_len); -size_t gmsg_infostr_full_split_to_buf(gconstpointer head, gconstpointer data, +char *gmsg_infostr_full(const void *msg, size_t msg_len); +char *gmsg_infostr_full_split(const void *head, + const void *data, size_t data_len); +size_t gmsg_infostr_full_split_to_buf(const void *head, const void *data, size_t data_len, char *buf, size_t buf_size); +iovec_t *gmsg_mq_templates(bool initial, size_t *vcnt); + void gmsg_install_presend(pmsg_t *mb); void gmsg_log_bad(const struct gnutella_node *n, - const char *reason, ...) G_GNUC_PRINTF(2, 3); -void gmsg_log_dropped_pmsg(pmsg_t *msg, - const char *reason, ...) G_GNUC_PRINTF(2, 3); + const char *reason, ...) G_PRINTF(2, 3); +void gmsg_log_dropped_pmsg(const pmsg_t *msg, + const char *reason, ...) G_PRINTF(2, 3); +void gmsg_log_dropped(const struct gnutella_node *n, + const char *reason, ...) G_PRINTF(2, 3); void gmsg_log_split_dropped( - gconstpointer head, gconstpointer data, size_t data_len, - const char *reason, ...) G_GNUC_PRINTF(4, 5); -void gmsg_log_split_duplicate( - gconstpointer head, gconstpointer data, size_t data_len, - const char *reason, ...) G_GNUC_PRINTF(4, 5); + const void *head, const void *data, size_t data_len, + const char *reason, ...) G_PRINTF(4, 5); +void gmsg_log_duplicate(const struct gnutella_node *n, + const char *reason, ...) G_PRINTF(2, 3); void gmsg_search_sendto_one(struct gnutella_node *n, gnet_search_t sh, - gconstpointer msg, guint32 size); -void gmsg_search_sendto_all(const GSList *l, gnet_search_t sh, - gconstpointer msg, guint32 size); + const void *msg, uint32 size); +void gmsg_search_sendto_all(const struct pslist *l, gnet_search_t sh, + const void *msg, uint32 size); #endif /* _core_gmsg_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/gnet_stats.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/gnet_stats.c
Changed
@@ -1,5 +1,6 @@ /* * Copyright (c) 2001-2003, Richard Eckart + * Copyright (c) 2008-2014, Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -25,10 +26,12 @@ * @ingroup core * @file * - * Needs brief description here. + * Collection of Gnutella / DHT statistics. * * @author Richard Eckart * @date 2001-2003 + * @author Raphael Manfredi + * @date 2008-2014 */ #include "common.h" @@ -36,315 +39,59 @@ #include "gnet_stats.h" #include "gmsg.h" +#include "g2/msg.h" + #include "if/dht/kademlia.h" #include "if/gnet_property_priv.h" -#include "lib/crc.h" +#include "lib/entropy.h" #include "lib/event.h" -#include "lib/gnet_host.h" #include "lib/random.h" +#include "lib/sha1.h" +#include "lib/spinlock.h" +#include "lib/thread.h" #include "lib/tm.h" + #include "lib/override.h" /* Must be the last header included */ -static guint8 stats_lut256; +static uint8 stats_lut256; static gnet_stats_t gnet_stats; static gnet_stats_t gnet_tcp_stats; static gnet_stats_t gnet_udp_stats; -static guint32 gnet_stats_crc32; +/* + * Thread-safe locks. + * + * The general stats accounting code is protected because there is no guarantee + * the routines updating these stats will always be called from the main thread. + * + * However, the routines updating the traffic statistics are NOT protected + * because they are always called from the main thread, the one where the + * I/O event loop is installed. An assertion verifies this assumption. + */ +static spinlock_t gnet_stats_slk = SPINLOCK_INIT; + +#define GNET_STATS_LOCK spinlock_hidden(&gnet_stats_slk) +#define GNET_STATS_UNLOCK spinunlock_hidden(&gnet_stats_slk) /*** *** Public functions ***/ -const char * -gnet_stats_drop_reason_to_string(msg_drop_reason_t reason) -{ - static const char * const msg_drop_reasons = { - N_("Bad size"), /**< MSG_DROP_BAD_SIZE */ - N_("Too small"), /**< MSG_DROP_TOO_SMALL */ - N_("Too large"), /**< MSG_DROP_TOO_LARGE */ - N_("Way too large"), /**< MSG_DROP_WAY_TOO_LARGE */ - N_("Unknown message type"), /**< MSG_DROP_UNKNOWN_TYPE */ - N_("Unexpected message"), /**< MSG_DROP_UNEXPECTED */ - N_("Message sent with TTL = 0"), /**< MSG_DROP_TTL0 */ - N_("Improper hops/ttl combination"), /**< MSG_DROP_IMPROPER_HOPS_TTL */ - N_("Max TTL exceeded"), /**< MSG_DROP_MAX_TTL_EXCEEDED */ - N_("Message throttle"), /**< MSG_DROP_THROTTLE */ - N_("Message matched limits"), /**< MSG_DROP_LIMIT */ - N_("Transient node"), /**< MSG_DROP_TRANSIENT */ - N_("Unusable Pong"), /**< MSG_DROP_PONG_UNUSABLE */ - N_("Hard TTL limit reached"), /**< MSG_DROP_HARD_TTL_LIMIT */ - N_("Max hop count reached"), /**< MSG_DROP_MAX_HOP_COUNT */ - N_("Route lost"), /**< MSG_DROP_ROUTE_LOST */ - N_("No route"), /**< MSG_DROP_NO_ROUTE */ - N_("Duplicate message"), /**< MSG_DROP_DUPLICATE */ - N_("Message to banned GUID"), /**< MSG_DROP_TO_BANNED */ - N_("Message from banned GUID"), /**< MSG_DROP_FROM_BANNED */ - N_("Node shutting down"), /**< MSG_DROP_SHUTDOWN */ - N_("TX flow control"), /**< MSG_DROP_FLOW_CONTROL */ - N_("Query text had no trailing NUL"),/**< MSG_DROP_QUERY_NO_NUL */ - N_("Query text too short"), /**< MSG_DROP_QUERY_TOO_SHORT */ - N_("Query had unnecessary overhead"),/**< MSG_DROP_QUERY_OVERHEAD */ - N_("Query had bad URN"), /**< MSG_DROP_BAD_URN */ - N_("Message with malformed SHA1"), /**< MSG_DROP_MALFORMED_SHA1 */ - N_("Message with malformed UTF-8"), /**< MSG_DROP_MALFORMED_UTF_8 */ - N_("Malformed Query Hit"), /**< MSG_DROP_BAD_RESULT */ - N_("Bad return address"), /**< MSG_DROP_BAD_RETURN_ADDRESS */ - N_("Hostile IP address"), /**< MSG_DROP_HOSTILE_IP */ - N_("Bogus result from Morpheus"), /**< MSG_DROP_MORPHEUS_BOGUS */ - N_("Spam"), /**< MSG_DROP_SPAM */ - N_("Evil filename"), /**< MSG_DROP_EVIL */ - N_("Improper media type"), /**< MSG_DROP_MEDIA */ - N_("Payload inflating error"), /**< MSG_DROP_INFLATE_ERROR */ - N_("Unknown header flags present"),/**< MSG_DROP_UNKNOWN_HEADER_FLAGS */ - N_("Own search results"), /**< MSG_DROP_OWN_RESULT */ - N_("Own queries"), /**< MSG_DROP_OWN_QUERY */ - N_("Ancient query format"), /**< MSG_DROP_ANCIENT_QUERY */ - N_("Blank Servent ID"), /**< MSG_DROP_BLANK_SERVENT_ID */ - N_("GUESS Query missing token"), /**< MSG_DROP_GUESS_MISSING_TOKEN */ - N_("GUESS Invalid query token"), /**< MSG_DROP_GUESS_INVALID_TOKEN */ - N_("DHT Invalid security token"), /**< MSG_DROP_DHT_INVALID_TOKEN */ - N_("DHT Too many STORE requests"), /**< MSG_DROP_DHT_TOO_MANY_STORE */ - N_("DHT Malformed message"), /**< MSG_DROP_DHT_UNPARSEABLE */ - }; - - STATIC_ASSERT(G_N_ELEMENTS(msg_drop_reasons) == MSG_DROP_REASON_COUNT); - g_return_val_if_fail(UNSIGNED(reason) < G_N_ELEMENTS(msg_drop_reasons), - NULL); - return msg_drop_reasonsreason; -} - -const char * -gnet_stats_general_to_string(gnr_stats_t type) -{ - /* Do NOT translate any of these strings */ - - static const char * const type_string = { - "routing_errors", - "routing_table_chunks", - "routing_table_capacity", - "routing_table_count", - "routing_transient_avoided", - "dups_with_higher_ttl", - "spam_sha1_hits", - "spam_name_hits", - "spam_fake_hits", - "spam_dup_hits", - "spam_caught_hostile_ip", - "spam_caught_hostile_held", - "spam_ip_held", - "local_searches", - "local_hits", - "local_partial_hits", - "local_whats_new_hits", - "local_query_hits", - "oob_proxied_query_hits", - "oob_queries", - "oob_queries_stripped", - "query_oob_proxied_dups", - "oob_hits_for_proxied_queries", - "oob_hits_with_alien_ip", - "oob_hits_ignored_on_spammer_hit", - "unclaimed_oob_hits", - "partially_claimed_oob_hits", - "spurious_oob_hit_claim", - "unrequested_oob_hits", - "query_hit_for_untracked_query", - "query_tracked_muids", - "query_compact_count", - "query_compact_size", - "query_utf8", - "query_sha1", - "query_whats_new", - "query_guess", - "query_guess_02", - "guess_cached_query_keys_held", - "guess_cached_02_hosts_held", - "guess_local_queries", - "guess_local_running", - "guess_local_query_hits", - "guess_hosts_queried", - "guess_hosts_acknowledged", - "broadcasted_pushes", - "push_proxy_udp_relayed", - "push_proxy_tcp_relayed", - "push_proxy_broadcasted", - "push_proxy_route_not_proxied", - "push_proxy_failed", - "push_relayed_via_local_route", - "push_relayed_via_table_route", - "local_dyn_queries", - "leaf_dyn_queries", - "oob_proxied_queries", - "dyn_queries_completed_full", - "dyn_queries_completed_partial", - "dyn_queries_completed_zero", - "dyn_queries_linger_extra", - "dyn_queries_linger_results", - "dyn_queries_linger_completed", - "gtkg_total_queries", - "gtkg_requeries", - "queries_with_ggep_h", - "giv_callbacks", - "giv_discarded", - "queue_callbacks", - "queue_discarded", - "udp_bogus_source_ip", - "udp_alien_message", - "udp_unprocessed_message", - "udp_tx_compressed", - "udp_rx_compressed", - "udp_larger_hence_not_compressed", - "consolidated_servers", - "dup_downloads_in_consolidation", - "discovered_server_guid", - "changed_server_guid", - "guid_collisions", - "own_guid_collisions", - "banned_guid_held", - "received_known_fw_node_info", - "revitalized_push_routes", - "collected_push_proxies", - "attempted_resource_switching", - "attempted_resource_switching_after_error", - "successful_resource_switching", - "successful_plain_resource_switching", - "successful_resource_switching_after_error", - "queued_after_switching", - "sunk_data", - "ignored_data", - "ignoring_after_mismatch", - "ignoring_to_preserve_connection", - "ignoring_during_aggressive_swarming", - "ignoring_refused", - "client_resource_switching", - "client_plain_resource_switching", - "client_followup_after_error", - "parq_slot_resource_switching", - "parq_retry_after_violation", - "parq_retry_after_kick_out", - "parq_slot_limit_overrides", - "parq_quick_slots_granted", - "parq_queue_sending_attempts", - "parq_queue_sent", - "parq_queue_follow_ups", - "sha1_verifications", - "tth_verifications", - "bitzi_tickets_held", - "qhit_seeding_of_orphan", - "upload_seeding_of_orphan", - "dht_estimated_size", - "dht_kball_theoretical", - "dht_kball_furthest", - "dht_kball_closest", - "dht_routing_buckets", - "dht_routing_leaves", - "dht_routing_max_depth", - "dht_routing_good_nodes", - "dht_routing_stale_nodes", - "dht_routing_pending_nodes", - "dht_routing_evicted_nodes", - "dht_routing_evicted_firewalled_nodes", - "dht_routing_evicted_quota_nodes", - "dht_routing_promoted_pending_nodes", - "dht_routing_pinged_promoted_nodes", - "dht_routing_rejected_node_bucket_quota", - "dht_routing_rejected_node_global_quota", - "dht_completed_bucket_refresh", - "dht_forced_bucket_refresh", - "dht_forced_bucket_merge", - "dht_denied_unsplitable_bucket_refresh", - "dht_bucket_alive_check", - "dht_alive_pings_to_good_nodes", - "dht_alive_pings_to_stale_nodes", - "dht_alive_pings_to_shutdowning_nodes", - "dht_alive_pings_avoided", - "dht_alive_pings_skipped", - "dht_revitalized_stale_nodes", - "dht_rejected_value_on_quota", - "dht_rejected_value_on_creator", - "dht_lookup_rejected_node_on_net_quota", - "dht_lookup_rejected_node_on_proximity", - "dht_lookup_rejected_node_on_divergence", - "dht_keys_held", - "dht_cached_keys_held", - "dht_values_held", - "dht_cached_kuid_targets_held", - "dht_cached_roots_held", - "dht_cached_roots_exact_hits", - "dht_cached_roots_approximate_hits", - "dht_cached_roots_misses", - "dht_cached_roots_kball_lookups", - "dht_cached_roots_contact_refreshed", - "dht_cached_tokens_held", - "dht_cached_tokens_hits", - "dht_stable_nodes_held", - "dht_fetch_local_hits", - "dht_fetch_local_cached_hits", - "dht_returned_expanded_values", - "dht_returned_secondary_keys", - "dht_claimed_secondary_keys", - "dht_returned_expanded_cached_values", - "dht_returned_cached_secondary_keys", - "dht_claimed_cached_secondary_keys", - "dht_published", - "dht_removed", - "dht_stale_replication", - "dht_replication", - "dht_republish", - "dht_secondary_key_fetch", - "dht_dup_values", - "dht_kuid_collisions", - "dht_own_kuid_collisions", - "dht_rpc_kuid_reply_mismatch", - "dht_caching_attempts", - "dht_caching_successful", - "dht_caching_partially_successful", - "dht_key_offloading_checks", - "dht_keys_selected_for_offloading", - "dht_key_offloading_attempts", - "dht_key_offloading_successful", - "dht_key_offloading_partially_successful", - "dht_values_offloaded", - "dht_publishing_attempts", - "dht_publishing_successful", - "dht_publishing_partially_successful", - "dht_publishing_satisfactory", - "dht_republished_late", - "dht_publishing_to_self", - "dht_publishing_bg_attempts", - "dht_publishing_bg_improvements", - "dht_publishing_bg_successful", - "dht_sha1_data_type_collisions", - "dht_passively_protected_lookup_path", - "dht_actively_protected_lookup_path", - "dht_alt_loc_lookups", - "dht_push_proxy_lookups", - "dht_successful_alt_loc_lookups", - "dht_successful_push_proxy_lookups", - "dht_successful_node_push_entry_lookups", - "dht_seeding_of_orphan", - }; - - STATIC_ASSERT(G_N_ELEMENTS(type_string) == GNR_TYPE_COUNT); - g_return_val_if_fail(UNSIGNED(type) < G_N_ELEMENTS(type_string), - NULL); - return type_stringtype; -} - -G_GNUC_COLD void +void G_COLD gnet_stats_init(void) { - guint i; + uint i; /* Guarantees that our little hack below can succeed */ STATIC_ASSERT( - UNSIGNED(KDA_MSG_MAX_ID + MSG_DHT_BASE) < G_N_ELEMENTS(stats_lut)); + UNSIGNED(KDA_MSG_MAX_ID + MSG_DHT_BASE) < N_ITEMS(stats_lut)); + STATIC_ASSERT( + UNSIGNED(MSG_G2_BASE + G2_MSG_MAX) < GTA_MSG_QRP); - for (i = 0; i < G_N_ELEMENTS(stats_lut); i++) { - guchar m = MSG_UNKNOWN; + for (i = 0; i < N_ITEMS(stats_lut); i++) { + uchar m = MSG_UNKNOWN; /* * To keep the look-up table small enough, we cheat a little @@ -354,6 +101,10 @@ * by Gnutella to stuff the DHT messages there. And 0xd0 starts * with a 'D', so it's not a total hack. * --RAM, 2010-11-01. + * + * We play the same trick for G2 messages, only we insert them + * in the 0x05 .. 0x2f space, which is unused by Gnutella. + * --RAM, 2014-01-07. */ if (i > MSG_DHT_BASE) { @@ -371,6 +122,31 @@ /* deprecated, not supported */ break; } + } else if (i > MSG_G2_BASE && i < GTA_MSG_QRP) { + switch ((enum g2_msg) (i - MSG_G2_BASE)) { + case G2_MSG_CRAWLR: m = MSG_G2_CRAWLR; break; + case G2_MSG_HAW: m = MSG_G2_HAW; break; + case G2_MSG_KHL: m = MSG_G2_KHL; break; + case G2_MSG_KHLR: m = MSG_G2_KHLR; break; + case G2_MSG_KHLA: m = MSG_G2_KHLA; break; + case G2_MSG_LNI: m = MSG_G2_LNI; break; + case G2_MSG_PI: m = MSG_G2_PI; break; + case G2_MSG_PO: m = MSG_G2_PO; break; + case G2_MSG_PUSH: m = MSG_G2_PUSH; break; + case G2_MSG_QKA: m = MSG_G2_QKA; break; + case G2_MSG_QKR: m = MSG_G2_QKR; break; + case G2_MSG_Q2: m = MSG_G2_Q2; break; + case G2_MSG_QA: m = MSG_G2_QA; break; + case G2_MSG_QH2: m = MSG_G2_QH2; break; + case G2_MSG_QHT: m = MSG_G2_QHT; break; + case G2_MSG_UPROC: m = MSG_G2_UPROC; break; + case G2_MSG_UPROD: m = MSG_G2_UPROD; break; + case G2_MSG_MAX: + break; + case G2_MSG_CRAWLA: + /* This message is skipped, since we don't expect it */ + g_assert_not_reached(); + } } else { switch ((enum gta_msg) i) { case GTA_MSG_INIT: m = MSG_INIT; break; @@ -385,96 +161,140 @@ case GTA_MSG_HSEP_DATA: m = MSG_HSEP; break; case GTA_MSG_BYE: m = MSG_BYE; break; case GTA_MSG_DHT: m = MSG_DHT; break; + case GTA_MSG_G2_SEARCH: /* Not a real message */ break; } } stats_luti = m; } + /* gnet_stats_count_received_payload() relies on this for G2 messages */ + g_assert(MSG_UNKNOWN == stats_lutN_ITEMS(stats_lut) - 1); + #undef CASE - + ZERO(&gnet_stats); ZERO(&gnet_udp_stats); - - gnet_stats_crc32 = random_u32(); } /** - * @return current CRC32 and re-initialize a new random one. + * Generate a SHA1 digest of the supplied statistics. */ -guint32 -gnet_stats_crc_reset(void) +static void +gnet_stats_digest(sha1_t *digest, gnet_stats_t *stats) { - guint32 crc = gnet_stats_crc32; - - gnet_stats_crc32 = random_u32(); - return crc; + stats->generalGNR_STATS_DIGEST++; /* Ensure ever-changing SHA1 */ + SHA1_COMPUTE(*stats, digest); } /** - * Use unpredictable events to collect random data. + * Generate a SHA1 digest of the current TCP statistics. + * + * This is meant for dynamic entropy collection. */ -static void -gnet_stats_randomness(const gnutella_node_t *n, guint8 type, guint32 val) +void +gnet_stats_tcp_digest(sha1_t *digest) { - tm_t now; - gnet_host_t host; + gnet_stats_inc_general(GNR_STATS_TCP_DIGEST); + gnet_stats_digest(digest, &gnet_tcp_stats); +} - tm_now(&now); - gnet_stats_crc32 = crc32_update(gnet_stats_crc32, &now, sizeof now); - gnet_host_set(&host, n->addr, n->port); - gnet_stats_crc32 = crc32_update( - gnet_stats_crc32, &host, gnet_host_length(&host)); - gnet_stats_crc32 = crc32_update(gnet_stats_crc32, &type, sizeof type); - gnet_stats_crc32 = crc32_update(gnet_stats_crc32, &val, sizeof val); +/** + * Generate a SHA1 digest of the current UDP statistics. + * + * This is meant for dynamic entropy collection. + */ +void +gnet_stats_udp_digest(sha1_t *digest) +{ + gnet_stats_inc_general(GNR_STATS_UDP_DIGEST); + gnet_stats_digest(digest, &gnet_udp_stats); } /** - * Called when Gnutella header has been read. + * Generate a SHA1 digest of the current general statistics. + * + * This is meant for dynamic entropy collection. */ void -gnet_stats_count_received_header(gnutella_node_t *n) +gnet_stats_general_digest(sha1_t *digest) { - guint t = stats_lutgnutella_header_get_function(&n->header); - guint i; - gnet_stats_t *stats; + gnet_stats_inc_general(GNR_STATS_DIGEST); + SHA1_COMPUTE(gnet_stats.general, digest); +} - stats = NODE_USES_UDP(n) ? &gnet_udp_stats : &gnet_tcp_stats; +/** + * Use unpredictable events to collect random data. + */ +static void +gnet_stats_randomness(const gnutella_node_t *n, uint8 type, uint32 val) +{ + entropy_harvest_small( + VARLEN(n->addr), VARLEN(n->port), VARLEN(type), VARLEN(val), NULL); +} + +static void +gnet_stats_count_received_header_internal(gnutella_node_t *n, + size_t header_size, uint t, uint8 ttl, uint8 hops) +{ + gnet_stats_t *stats = NODE_USES_UDP(n) ? &gnet_udp_stats : &gnet_tcp_stats; + uint i; n->received++; gnet_stats.pkg.receivedMSG_TOTAL++; gnet_stats.pkg.receivedt++; - gnet_stats.byte.receivedMSG_TOTAL += GTA_HEADER_SIZE; - gnet_stats.byte.receivedt += GTA_HEADER_SIZE; + gnet_stats.byte.receivedMSG_TOTAL += header_size; + gnet_stats.byte.receivedt += header_size; stats->pkg.receivedMSG_TOTAL++; stats->pkg.receivedt++; - stats->byte.receivedMSG_TOTAL += GTA_HEADER_SIZE; - stats->byte.receivedt += GTA_HEADER_SIZE; + stats->byte.receivedMSG_TOTAL += header_size; + stats->byte.receivedt += header_size; - i = MIN(gnutella_header_get_ttl(&n->header), STATS_RECV_COLUMNS - 1); + i = MIN(ttl, STATS_RECV_COLUMNS - 1); stats->pkg.received_ttliMSG_TOTAL++; stats->pkg.received_ttlit++; - i = MIN(gnutella_header_get_hops(&n->header), STATS_RECV_COLUMNS - 1); + i = MIN(hops, STATS_RECV_COLUMNS - 1); stats->pkg.received_hopsiMSG_TOTAL++; stats->pkg.received_hopsit++; } /** + * Called when Gnutella header has been read. + */ +void +gnet_stats_count_received_header(gnutella_node_t *n) +{ + uint t = stats_lutgnutella_header_get_function(&n->header); + uint8 ttl, hops; + + g_assert(thread_is_main()); + g_assert(!NODE_TALKS_G2(n)); + + ttl = gnutella_header_get_ttl(&n->header); + hops = gnutella_header_get_hops(&n->header); + + gnet_stats_count_received_header_internal(n, GTA_HEADER_SIZE, t, ttl, hops); +} + +/** * Called to transform Gnutella header counting into Kademlia header counting. * * @param n the node receiving the message * @param kt */ static void -gnet_stats_count_kademlia_header(const gnutella_node_t *n, guint kt) +gnet_stats_count_kademlia_header(const gnutella_node_t *n, uint kt) { - guint t = stats_lutgnutella_header_get_function(&n->header); - guint i; + uint t = stats_lutgnutella_header_get_function(&n->header); + uint i; gnet_stats_t *stats; + g_assert(thread_is_main()); + g_assert(!NODE_TALKS_G2(n)); + stats = NODE_USES_UDP(n) ? &gnet_udp_stats : &gnet_tcp_stats; gnet_stats.pkg.receivedt--; @@ -504,21 +324,28 @@ } /** - * Called when Gnutella payload has been read. + * Called when Gnutella payload has been read, or when a G2 messsage is read. * * The actual payload size (effectively read) is expected to be found - * in n->size. + * in n->size for Gnutella messages and G2 messages. + * + * @param n the node from which message was received + * @param payload start of Gnutella payload, or head of G2 frame */ void gnet_stats_count_received_payload(const gnutella_node_t *n, const void *payload) { - guint8 f = gnutella_header_get_function(&n->header); - guint t = stats_lutf; - guint i; + uint8 f; + uint t; + uint i; gnet_stats_t *stats; - guint32 size; + uint32 size; + uint8 hops, ttl; + + g_assert(thread_is_main()); stats = NODE_USES_UDP(n) ? &gnet_udp_stats : &gnet_tcp_stats; + size = n->size; /* * Size is NOT read in the Gnutella header but in n->size, which @@ -531,7 +358,30 @@ * --RAM, 2010-10-30 */ - size = n->size; + if (NODE_TALKS_G2(n)) { + f = g2_msg_type(payload, size); + if (f != G2_MSG_MAX) { + f += MSG_G2_BASE; + } else { + f = N_ITEMS(stats_lut) - 1; /* Last, holds MSG_UNKNOWN */ + } + ttl = 1; + hops = NODE_USES_UDP(n) ? 0 : 1; + t = stats_lutf; + /* + * No header for G2, so count header reception now with a size of zero. + * This is required to update the other packet reception statistics. + */ + gnet_stats_count_received_header_internal( + deconstify_pointer(n), + 0, t, ttl, hops); + } else { + f = gnutella_header_get_function(&n->header); + hops = gnutella_header_get_hops(&n->header); + ttl = gnutella_header_get_ttl(&n->header); + t = stats_lutf; + } + gnet_stats_randomness(n, f, size); /* @@ -547,40 +397,70 @@ */ if (GTA_MSG_DHT == f && size + GTA_HEADER_SIZE >= KDA_HEADER_SIZE) { - guint8 opcode = peek_u8(payload); /* Kademlia Opcode */ + uint8 opcode = peek_u8(payload); /* Kademlia Opcode */ - if (UNSIGNED(opcode + MSG_DHT_BASE) < G_N_ELEMENTS(stats_lut)) { + if (UNSIGNED(opcode + MSG_DHT_BASE) < N_ITEMS(stats_lut)) { t = stats_lutopcode + MSG_DHT_BASE; gnet_stats_count_kademlia_header(n, t); } } + g_assert(t < MSG_TOTAL); + gnet_stats.byte.receivedMSG_TOTAL += size; gnet_stats.byte.receivedt += size; stats->byte.receivedMSG_TOTAL += size; stats->byte.receivedt += size; - i = MIN(gnutella_header_get_ttl(&n->header), STATS_RECV_COLUMNS - 1); + i = MIN(ttl, STATS_RECV_COLUMNS - 1); stats->byte.received_ttliMSG_TOTAL += size; stats->byte.received_ttlit += size; - i = MIN(gnutella_header_get_hops(&n->header), STATS_RECV_COLUMNS - 1); + i = MIN(hops, STATS_RECV_COLUMNS - 1); stats->byte.received_hopsiMSG_TOTAL += size; stats->byte.received_hopsit += size; } +static void +gnet_stats_count_queued_internal(const gnutella_node_t *n, + uint t, uint8 hops, uint32 size, gnet_stats_t *stats) +{ + uint64 *stats_pkg; + uint64 *stats_byte; + + g_assert(t < MSG_TOTAL); + + gnet_stats_randomness(n, t & 0xff, size); + + stats_pkg = hops ? gnet_stats.pkg.queued : gnet_stats.pkg.gen_queued; + stats_byte = hops ? gnet_stats.byte.queued : gnet_stats.byte.gen_queued; + + stats_pkgMSG_TOTAL++; + stats_pkgt++; + stats_byteMSG_TOTAL += size; + stats_bytet += size; + + stats_pkg = hops ? stats->pkg.queued : stats->pkg.gen_queued; + stats_byte = hops ? stats->byte.queued : stats->byte.gen_queued; + + stats_pkgMSG_TOTAL++; + stats_pkgt++; + stats_byteMSG_TOTAL += size; + stats_bytet += size; +} + void gnet_stats_count_queued(const gnutella_node_t *n, - guint8 type, const void *base, guint32 size) + uint8 type, const void *base, uint32 size) { - guint64 *stats_pkg; - guint64 *stats_byte; - guint t = stats_luttype; + uint t = stats_luttype; gnet_stats_t *stats; - guint8 hops; + uint8 hops; g_assert(t != MSG_UNKNOWN); + g_assert(thread_is_main()); + g_assert(!NODE_TALKS_G2(n)); stats = NODE_USES_UDP(n) ? &gnet_udp_stats : &gnet_tcp_stats; @@ -589,9 +469,9 @@ */ if (GTA_MSG_DHT == type && size >= KDA_HEADER_SIZE) { - guint8 opcode = kademlia_header_get_function(base); + uint8 opcode = kademlia_header_get_function(base); - if (UNSIGNED(opcode + MSG_DHT_BASE) < G_N_ELEMENTS(stats_lut)) { + if (UNSIGNED(opcode + MSG_DHT_BASE) < N_ITEMS(stats_lut)) { t = stats_lutopcode + MSG_DHT_BASE; } hops = 0; @@ -599,18 +479,57 @@ hops = gnutella_header_get_hops(base); } + gnet_stats_count_queued_internal(n, t, hops, size, stats); +} + +void +gnet_stats_g2_count_queued(const gnutella_node_t *n, + const void *base, size_t len) +{ + gnet_stats_t *stats; + uint t; + uint8 f; + + g_assert(thread_is_main()); + g_assert(NODE_TALKS_G2(n)); + + stats = NODE_USES_UDP(n) ? &gnet_udp_stats : &gnet_tcp_stats; + + f = g2_msg_type(base, len); + + if (f != G2_MSG_MAX) { + f += MSG_G2_BASE; + } else { + f = N_ITEMS(stats_lut) - 1; /* Last, holds MSG_UNKNOWN */ + } + + t = stats_lutf; + + /* Leaf mode => hops = 0 */ + gnet_stats_count_queued_internal(n, t, 0, len, stats); +} + +static void +gnet_stats_count_sent_internal(const gnutella_node_t *n, + uint t, uint8 hops, uint32 size, gnet_stats_t *stats) +{ + uint64 *stats_pkg; + uint64 *stats_byte; + + g_assert(t < MSG_TOTAL); + gnet_stats_randomness(n, t & 0xff, size); - stats_pkg = hops ? gnet_stats.pkg.queued : gnet_stats.pkg.gen_queued; - stats_byte = hops ? gnet_stats.byte.queued : gnet_stats.byte.gen_queued; + stats_pkg = hops ? gnet_stats.pkg.relayed : gnet_stats.pkg.generated; + stats_byte = hops ? gnet_stats.byte.relayed : gnet_stats.byte.generated; stats_pkgMSG_TOTAL++; stats_pkgt++; stats_byteMSG_TOTAL += size; stats_bytet += size; - stats_pkg = hops ? stats->pkg.queued : stats->pkg.gen_queued; - stats_byte = hops ? stats->byte.queued : stats->byte.gen_queued; + stats_pkg = hops ? stats->pkg.relayed : stats->pkg.generated; + stats_byte = hops ? stats->byte.relayed : stats->byte.generated; stats_pkgMSG_TOTAL++; stats_pkgt++; @@ -620,15 +539,15 @@ void gnet_stats_count_sent(const gnutella_node_t *n, - guint8 type, const void *base, guint32 size) + uint8 type, const void *base, uint32 size) { - guint64 *stats_pkg; - guint64 *stats_byte; - guint t = stats_luttype; + uint t = stats_luttype; gnet_stats_t *stats; - guint8 hops; + uint8 hops; g_assert(t != MSG_UNKNOWN); + g_assert(thread_is_main()); + g_assert(!NODE_TALKS_G2(n)); stats = NODE_USES_UDP(n) ? &gnet_udp_stats : &gnet_tcp_stats; @@ -637,9 +556,9 @@ */ if (GTA_MSG_DHT == type && size >= KDA_HEADER_SIZE) { - guint8 opcode = kademlia_header_get_function(base); + uint8 opcode = kademlia_header_get_function(base); - if (UNSIGNED(opcode + MSG_DHT_BASE) < G_N_ELEMENTS(stats_lut)) { + if (UNSIGNED(opcode + MSG_DHT_BASE) < N_ITEMS(stats_lut)) { t = stats_lutopcode + MSG_DHT_BASE; } hops = 0; @@ -647,32 +566,40 @@ hops = gnutella_header_get_hops(base); } - gnet_stats_randomness(n, t & 0xff, size); + gnet_stats_count_sent_internal(n, t, hops, size, stats); +} - stats_pkg = hops ? gnet_stats.pkg.relayed : gnet_stats.pkg.generated; - stats_byte = hops ? gnet_stats.byte.relayed : gnet_stats.byte.generated; +void +gnet_stats_g2_count_sent(const gnutella_node_t *n, + enum g2_msg type, uint32 size) +{ + uint t; + gnet_stats_t *stats; - stats_pkgMSG_TOTAL++; - stats_pkgt++; - stats_byteMSG_TOTAL += size; - stats_bytet += size; + g_assert(thread_is_main()); + g_assert((uint) type < UNSIGNED(G2_MSG_MAX)); + g_assert(NODE_TALKS_G2(n)); - stats_pkg = hops ? stats->pkg.relayed : stats->pkg.generated; - stats_byte = hops ? stats->byte.relayed : stats->byte.generated; + stats = NODE_USES_UDP(n) ? &gnet_udp_stats : &gnet_tcp_stats; - stats_pkgMSG_TOTAL++; - stats_pkgt++; - stats_byteMSG_TOTAL += size; - stats_bytet += size; + t = stats_lutMSG_G2_BASE + type; + + g_assert(t != MSG_UNKNOWN); + + /* Leaf mode => hops = 0 */ + gnet_stats_count_sent_internal(n, t, 0, size, stats); } void gnet_stats_count_expired(const gnutella_node_t *n) { - guint32 size = n->size + sizeof(n->header); - guint t = stats_lutgnutella_header_get_function(&n->header); + uint32 size = n->size + sizeof(n->header); + uint t = stats_lutgnutella_header_get_function(&n->header); gnet_stats_t *stats; + g_assert(thread_is_main()); + g_assert(!NODE_TALKS_G2(n)); + stats = NODE_USES_UDP(n) ? &gnet_udp_stats : &gnet_tcp_stats; gnet_stats.pkg.expiredMSG_TOTAL++; @@ -699,6 +626,8 @@ gnet_stats.pkg.droppedt++; \ gnet_stats.byte.droppedMSG_TOTAL += (s); \ gnet_stats.byte.droppedt += (s); \ + gs->drop_reasonreasonMSG_TOTAL++; \ + gs->drop_reasonreasont++; \ gs->pkg.droppedMSG_TOTAL++; \ gs->pkg.droppedt++; \ gs->byte.droppedMSG_TOTAL += (s); \ @@ -708,17 +637,32 @@ void gnet_stats_count_dropped(gnutella_node_t *n, msg_drop_reason_t reason) { - guint32 size; - guint type; + uint32 size; + uint type; gnet_stats_t *stats; g_assert(UNSIGNED(reason) < MSG_DROP_REASON_COUNT); + g_assert(thread_is_main()); - size = n->size + sizeof(n->header); - type = stats_lutgnutella_header_get_function(&n->header); stats = NODE_USES_UDP(n) ? &gnet_udp_stats : &gnet_tcp_stats; - gnet_stats_randomness(n, type & 0xff, size); + if (NODE_TALKS_G2(n)) { + int f = g2_msg_type(n->data, n->size); + if (f != G2_MSG_MAX) { + f += MSG_G2_BASE; + } else { + f = N_ITEMS(stats_lut) - 1; /* Last, holds MSG_UNKNOWN */ + } + type = stats_lutf; + size = n->size; + } else { + type = stats_lutgnutella_header_get_function(&n->header); + size = n->size + sizeof(n->header); + } + + entropy_harvest_small( + VARLEN(n->addr), VARLEN(n->port), VARLEN(reason), VARLEN(type), + VARLEN(size), NULL); DROP_STATS(stats, type, size); node_inc_rxdrop(n); @@ -730,10 +674,19 @@ default: ; } - if (GNET_PROPERTY(log_dropped_gnutella)) - gmsg_log_split_dropped(&n->header, n->data, n->size, - "from %s: %s", node_infostr(n), - gnet_stats_drop_reason_to_string(reason)); + if (NODE_TALKS_G2(n)) { + if (GNET_PROPERTY(log_dropped_g2)) { + g2_msg_log_dropped_data(n->data, n->size, + "from %s: %s", node_infostr(n), + gnet_stats_drop_reason_to_string(reason)); + } + } else { + if (GNET_PROPERTY(log_dropped_gnutella)) { + gmsg_log_split_dropped(&n->header, n->data, n->size, + "from %s: %s", node_infostr(n), + gnet_stats_drop_reason_to_string(reason)); + } + } } /** @@ -743,19 +696,22 @@ gnet_dht_stats_count_dropped(gnutella_node_t *n, kda_msg_t opcode, msg_drop_reason_t reason) { - guint32 size; - guint type; + uint32 size; + uint type; gnet_stats_t *stats; g_assert(UNSIGNED(reason) < MSG_DROP_REASON_COUNT); g_assert(opcode <= KDA_MSG_MAX_ID); - g_assert(UNSIGNED(opcode + MSG_DHT_BASE) < G_N_ELEMENTS(stats_lut)); + g_assert(UNSIGNED(opcode + MSG_DHT_BASE) < N_ITEMS(stats_lut)); + g_assert(thread_is_main()); size = n->size + sizeof(n->header); type = stats_lutopcode + MSG_DHT_BASE; stats = NODE_USES_UDP(n) ? &gnet_udp_stats : &gnet_tcp_stats; - gnet_stats_randomness(n, type & 0xff, size); + entropy_harvest_small( + VARLEN(n->addr), VARLEN(n->port), VARLEN(reason), VARLEN(type), + VARLEN(size), NULL); DROP_STATS(stats, type, size); node_inc_rxdrop(n); @@ -770,33 +726,107 @@ size_t i = type; g_assert(i < GNR_TYPE_COUNT); + + GNET_STATS_LOCK; gnet_stats.generali += delta; + GNET_STATS_UNLOCK; +} + +/** + * Increment the general stats counter by 1. + */ +void +gnet_stats_inc_general(gnr_stats_t type) +{ + size_t i = type; + + g_assert(i < GNR_TYPE_COUNT); + + GNET_STATS_LOCK; + gnet_stats.generali++; + GNET_STATS_UNLOCK; +} + +/** + * Decrement the general stats counter by 1. + */ +void +gnet_stats_dec_general(gnr_stats_t type) +{ + size_t i = type; + + g_assert(i < GNR_TYPE_COUNT); + + GNET_STATS_LOCK; + gnet_stats.generali--; + GNET_STATS_UNLOCK; +} + +/** + * Update the general stats counter to keep the maximum value. + */ +void +gnet_stats_max_general(gnr_stats_t type, uint64 value) +{ + size_t i = type; + + g_assert(i < GNR_TYPE_COUNT); + + GNET_STATS_LOCK; + if (value > gnet_stats.generali) + gnet_stats.generali = value; + GNET_STATS_UNLOCK; } /** * Set the general stats counter to the given value. */ void -gnet_stats_set_general(gnr_stats_t type, guint64 value) +gnet_stats_set_general(gnr_stats_t type, uint64 value) { size_t i = type; g_assert(i < GNR_TYPE_COUNT); + + GNET_STATS_LOCK; gnet_stats.generali = value; + GNET_STATS_UNLOCK; +} + +/** + * Get the general stats counter. + */ +uint64 +gnet_stats_get_general(gnr_stats_t type) +{ + size_t i = type; + uint64 value; + + g_assert(i < GNR_TYPE_COUNT); + + GNET_STATS_LOCK; + value = gnet_stats.generali; + GNET_STATS_UNLOCK; + + return value; } void gnet_stats_count_dropped_nosize( const gnutella_node_t *n, msg_drop_reason_t reason) { - guint type; + uint type; gnet_stats_t *stats; g_assert(UNSIGNED(reason) < MSG_DROP_REASON_COUNT); + g_assert(thread_is_main()); + g_assert(!NODE_TALKS_G2(n)); type = stats_lutgnutella_header_get_function(&n->header); stats = NODE_USES_UDP(n) ? &gnet_udp_stats : &gnet_tcp_stats; + entropy_harvest_small(VARLEN(n->addr), VARLEN(n->port), NULL); + /* Data part of message not read */ DROP_STATS(stats, type, sizeof(n->header)); @@ -806,15 +836,43 @@ gnet_stats_drop_reason_to_string(reason)); } +static void +gnet_stats_flowc_internal(uint t, + uint8 function, uint8 ttl, uint8 hops, size_t size) +{ + uint i; + + g_assert(t < MSG_TOTAL); + + i = MIN(hops, STATS_FLOWC_COLUMNS - 1); + gnet_stats.pkg.flowc_hopsit++; + gnet_stats.pkg.flowc_hopsiMSG_TOTAL++; + gnet_stats.byte.flowc_hopsit += size; + gnet_stats.byte.flowc_hopsiMSG_TOTAL += size; + + i = MIN(ttl, STATS_FLOWC_COLUMNS - 1); + + /* Cannot send a message with TTL=0 (DHT messages are not Gnutella) */ + g_assert(function == GTA_MSG_DHT || i != 0); + + gnet_stats.pkg.flowc_ttlit++; + gnet_stats.pkg.flowc_ttliMSG_TOTAL++; + gnet_stats.byte.flowc_ttlit += size; + gnet_stats.byte.flowc_ttliMSG_TOTAL += size; + + entropy_harvest_small(VARLEN(t), VARLEN(function), VARLEN(size), NULL); +} + void -gnet_stats_count_flowc(const void *head, gboolean head_only) +gnet_stats_count_flowc(const void *head, bool head_only) { - guint t; - guint i; - guint16 size = gmsg_size(head) + GTA_HEADER_SIZE; - guint8 function = gnutella_header_get_function(head); - guint8 ttl = gnutella_header_get_ttl(head); - guint8 hops = gnutella_header_get_hops(head); + uint t; + uint16 size = gmsg_size(head) + GTA_HEADER_SIZE; + uint8 function = gnutella_header_get_function(head); + uint8 ttl = gnutella_header_get_ttl(head); + uint8 hops = gnutella_header_get_hops(head); + + g_assert(thread_is_main()); if (GNET_PROPERTY(node_debug) > 3) g_debug("FLOWC function=%d ttl=%d hops=%d", function, ttl, hops); @@ -824,9 +882,9 @@ */ if (GTA_MSG_DHT == function && size >= KDA_HEADER_SIZE && !head_only) { - guint8 opcode = kademlia_header_get_function(head); + uint8 opcode = kademlia_header_get_function(head); - if (UNSIGNED(opcode + MSG_DHT_BASE) < G_N_ELEMENTS(stats_lut)) { + if (UNSIGNED(opcode + MSG_DHT_BASE) < N_ITEMS(stats_lut)) { t = stats_lutopcode + MSG_DHT_BASE; } else { t = stats_lutfunction; /* Invalid opcode? */ @@ -837,21 +895,35 @@ t = stats_lutfunction; } - i = MIN(hops, STATS_FLOWC_COLUMNS - 1); - gnet_stats.pkg.flowc_hopsit++; - gnet_stats.pkg.flowc_hopsiMSG_TOTAL++; - gnet_stats.byte.flowc_hopsit += size; - gnet_stats.byte.flowc_hopsiMSG_TOTAL += size; + gnet_stats_flowc_internal(t, function, ttl, hops, size); +} - i = MIN(ttl, STATS_FLOWC_COLUMNS - 1); +void +gnet_stats_g2_count_flowc(const gnutella_node_t *n, + const void *base, size_t len) +{ + uint t; + uint8 f, ttl, hops; - /* Cannot send a message with TTL=0 (DHT messages are not Gnutella) */ - g_assert(function == GTA_MSG_DHT || i != 0); + g_assert(thread_is_main()); - gnet_stats.pkg.flowc_ttlit++; - gnet_stats.pkg.flowc_ttliMSG_TOTAL++; - gnet_stats.byte.flowc_ttlit += size; - gnet_stats.byte.flowc_ttliMSG_TOTAL += size; + f = g2_msg_type(base, len); + + if (GNET_PROPERTY(node_debug) > 3) + g_debug("FLOWC G2 %s", g2_msg_type_name(f)); + + if (f != G2_MSG_MAX) { + f += MSG_G2_BASE; + } else { + f = N_ITEMS(stats_lut) - 1; /* Last, holds MSG_UNKNOWN */ + } + + ttl = NODE_USES_UDP(n) ? 1 : 2; /* Purely made up, but cannot be 0 */ + hops = 0; /* Locally generated, this is TX flowc */ + + t = stats_lutf; + + gnet_stats_flowc_internal(t, f, ttl, hops, len); } /*** @@ -862,13 +934,18 @@ gnet_stats_get(gnet_stats_t *s) { g_assert(s != NULL); + + GNET_STATS_LOCK; *s = gnet_stats; + GNET_STATS_UNLOCK; } void gnet_stats_tcp_get(gnet_stats_t *s) { g_assert(s != NULL); + g_assert(thread_is_main()); + *s = gnet_tcp_stats; } @@ -876,6 +953,8 @@ gnet_stats_udp_get(gnet_stats_t *s) { g_assert(s != NULL); + g_assert(thread_is_main()); + *s = gnet_udp_stats; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/gnet_stats.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/gnet_stats.h
Changed
@@ -31,14 +31,13 @@ #include "if/dht/kademlia.h" void gnet_stats_init(void); -guint32 gnet_stats_crc_reset(void); void gnet_stats_count_received_header(gnutella_node_t *n); void gnet_stats_count_received_payload(const gnutella_node_t *n, const void *); void gnet_stats_count_queued( - const gnutella_node_t *n, guint8 type, const void *base, guint32 size); + const gnutella_node_t *n, uint8 type, const void *base, uint32 size); void gnet_stats_count_sent( - const gnutella_node_t *n, guint8 type, const void *base, guint32 size); + const gnutella_node_t *n, uint8 type, const void *base, uint32 size); void gnet_stats_count_expired(const gnutella_node_t *n); void gnet_stats_count_dropped(gnutella_node_t *n, msg_drop_reason_t reason); @@ -47,7 +46,27 @@ void gnet_stats_count_dropped_nosize( const gnutella_node_t *n, msg_drop_reason_t reason); void gnet_stats_count_general(gnr_stats_t, int); -void gnet_stats_set_general(gnr_stats_t type, guint64 value); -void gnet_stats_count_flowc(const void *, gboolean head_only); +void gnet_stats_inc_general(gnr_stats_t); +void gnet_stats_dec_general(gnr_stats_t); +void gnet_stats_max_general(gnr_stats_t type, uint64 value); +void gnet_stats_set_general(gnr_stats_t type, uint64 value); +uint64 gnet_stats_get_general(gnr_stats_t type); +void gnet_stats_count_flowc(const void *, bool head_only); + +void gnet_stats_g2_count_flowc(const gnutella_node_t *n, + const void *base, size_t len); +void gnet_stats_g2_count_queued(const gnutella_node_t *n, + const void *base, size_t len); + +enum g2_msg; + +void gnet_stats_g2_count_sent(const gnutella_node_t *n, + enum g2_msg type, uint32 size); + +struct sha1; + +void gnet_stats_tcp_digest(struct sha1 *digest); +void gnet_stats_udp_digest(struct sha1 *digest); +void gnet_stats_general_digest(struct sha1 *digest); #endif /* _core_gnet_stats_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/gnutella.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/gnutella.h
Changed
@@ -70,47 +70,47 @@ * */ -typedef guint8 gnutella_msg_init_tGTA_HEADER_SIZE; +typedef uint8 gnutella_msg_init_tGTA_HEADER_SIZE; /* The logic layout of the PONG message specific layout is as follows: * * struct gnutella_init_response_ { - * guint16 host_port; - * guint32 host_ip; - * guint32 files_count; - * guint32 kbytes_count; + * uint16 host_port; + * uint32 host_ip; + * uint32 files_count; + * uint32 kbytes_count; * }; * */ -typedef guint8 gnutella_init_response_t14; +typedef uint8 gnutella_init_response_t14; -static inline guint16 +static inline uint16 gnutella_init_response_get_host_port(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return peek_le16(&u80); } -static inline guint32 +static inline uint32 gnutella_init_response_get_host_ip(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return peek_be32(&u82); } -static inline guint32 +static inline uint32 gnutella_init_response_get_files_count(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return peek_le32(&u86); } -static inline guint32 +static inline uint32 gnutella_init_response_get_kbytes_count(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return peek_le32(&u810); } @@ -126,7 +126,8 @@ * */ -typedef guint8 gnutella_msg_init_response_tGTA_HEADER_SIZE + sizeof(gnutella_init_response_t); +typedef uint8 +gnutella_msg_init_response_tGTA_HEADER_SIZE + sizeof(gnutella_init_response_t); static inline gnutella_header_t * gnutella_msg_init_response_header(gnutella_msg_init_response_t *msg) @@ -136,43 +137,43 @@ static inline void gnutella_msg_init_response_set_host_port(gnutella_msg_init_response_t *msg, - guint16 port) + uint16 port) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; poke_le16(&u8GTA_HEADER_SIZE, port); } static inline void gnutella_msg_init_response_set_host_ip(gnutella_msg_init_response_t *msg, - guint32 ip) + uint32 ip) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; poke_be32(&u8GTA_HEADER_SIZE + 2, ip); } static inline void gnutella_msg_init_response_set_files_count(gnutella_msg_init_response_t *msg, - guint32 files_count) + uint32 files_count) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; poke_le32(&u8GTA_HEADER_SIZE + 6, files_count); } static inline void gnutella_msg_init_response_set_kbytes_count(gnutella_msg_init_response_t *msg, - guint32 kbytes_count) + uint32 kbytes_count) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; poke_le32(&u8GTA_HEADER_SIZE + 10, kbytes_count); } /* The logic layout of the QHIT message specific payload is as follows: * * struct gnutella_search_results_ { - * guint8 num_recs; - * guint16 host_port; - * guint32 host_ip; - * guint32 host_speed; + * uint8 num_recs; + * uint16 host_port; + * uint32 host_ip; + * uint32 host_speed; * * record data follows * ... @@ -182,33 +183,33 @@ * */ -typedef guint8 gnutella_search_results_t11; +typedef uint8 gnutella_search_results_t11; -static inline guint8 +static inline uint8 gnutella_search_results_get_num_recs(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return u80; } -static inline guint16 +static inline uint16 gnutella_search_results_get_host_port(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return peek_le16(&u81); } -static inline guint32 +static inline uint32 gnutella_search_results_get_host_ip(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return peek_be32(&u83); } -static inline guint32 +static inline uint32 gnutella_search_results_get_host_speed(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return peek_le32(&u87); } @@ -221,7 +222,8 @@ * */ -typedef guint8 gnutella_msg_search_results_tGTA_HEADER_SIZE + sizeof(gnutella_search_results_t); +typedef uint8 +gnutella_msg_search_results_tGTA_HEADER_SIZE + sizeof(gnutella_search_results_t); static inline gnutella_header_t * gnutella_msg_search_results_header(gnutella_msg_search_results_t *msg) @@ -231,48 +233,48 @@ static inline void gnutella_msg_search_results_set_num_recs(gnutella_msg_search_results_t *msg, - guint8 num_recs) + uint8 num_recs) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; u8GTA_HEADER_SIZE = num_recs; } static inline void gnutella_msg_search_results_set_host_port(gnutella_msg_search_results_t *msg, - guint16 port) + uint16 port) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; poke_le16(&u8GTA_HEADER_SIZE + 1, port); } static inline void gnutella_msg_search_results_set_host_ip(gnutella_msg_search_results_t *msg, - guint32 ip) + uint32 ip) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; poke_be32(&u8GTA_HEADER_SIZE + 3, ip); } static inline void gnutella_msg_search_results_set_host_speed(gnutella_msg_search_results_t *msg, - guint32 speed) + uint32 speed) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; poke_le32(&u8GTA_HEADER_SIZE + 7, speed); } /* The logic layout of the QUERY message specific payload is as follows: * * struct gnutella_search_ { - * guint16 speed; + * uint16 speed; * * query string follows * }; * */ -typedef guint8 gnutella_search_t2; - +typedef uint8 gnutella_search_t2; + /* The logic layout of the QUERY message is as follows: * * struct gnutella_msg_search_ { @@ -282,7 +284,7 @@ * */ -typedef guint8 gnutella_msg_search_tGTA_HEADER_SIZE + sizeof(gnutella_search_t); +typedef uint8 gnutella_msg_search_tGTA_HEADER_SIZE + sizeof(gnutella_search_t); static inline gnutella_header_t * gnutella_msg_search_header(gnutella_msg_search_t *msg) @@ -291,16 +293,16 @@ } static inline void -gnutella_msg_search_set_flags(gnutella_msg_search_t *msg, guint16 flags) +gnutella_msg_search_set_flags(gnutella_msg_search_t *msg, uint16 flags) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; poke_be16(&u8GTA_HEADER_SIZE, flags); } -static inline guint16 +static inline uint16 gnutella_msg_search_get_flags(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return peek_be16(&u8GTA_HEADER_SIZE + 0); } @@ -311,22 +313,22 @@ static inline const char * gnutella_msg_search_get_text(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return (const char *) &u8GTA_HEADER_SIZE + 2; } /* The logic layout of the PUSH message specific payload is as follows: * * struct gnutella_push_request_ { - * guint8 guid16; - * guint32 file_id; - * guint32 host_ip; - * guint16 host_port; + * uint8 guid16; + * uint32 file_id; + * uint32 host_ip; + * uint16 host_port; * }; * */ -typedef guint8 gnutella_push_request_t26; +typedef uint8 gnutella_push_request_t26; /* The logic layout of the PUSH message is as follows: * @@ -339,7 +341,8 @@ * */ -typedef guint8 gnutella_msg_push_request_tGTA_HEADER_SIZE + sizeof(gnutella_push_request_t); +typedef uint8 +gnutella_msg_push_request_tGTA_HEADER_SIZE + sizeof(gnutella_push_request_t); static inline gnutella_header_t * gnutella_msg_push_request_header(gnutella_msg_push_request_t *msg) @@ -351,83 +354,83 @@ gnutella_msg_push_request_set_guid(gnutella_msg_push_request_t *msg, const struct guid *guid) { - guint8 *u8 = (void *) msg; - memcpy(&u8GTA_HEADER_SIZE, guid, 16); + uint8 *u8 = (void *) msg; + memcpy(&u8GTA_HEADER_SIZE, guid, 16); } static inline void gnutella_msg_push_request_set_file_id(gnutella_msg_push_request_t *msg, - guint32 file_id) + uint32 file_id) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; poke_le32(&u8GTA_HEADER_SIZE + 16, file_id); } static inline void gnutella_msg_push_request_set_host_ip(gnutella_msg_push_request_t *msg, - guint32 ip) + uint32 ip) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; poke_be32(&u8GTA_HEADER_SIZE + 20, ip); } static inline void gnutella_msg_push_request_set_host_port(gnutella_msg_push_request_t *msg, - guint16 port) + uint16 port) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; poke_le16(&u8GTA_HEADER_SIZE + 24, port); } /* The logic layout of the BYE message specific payload is as follows: * * struct gnutella_bye_ { - * guint16 code; + * uint16 code; * * message string follows * }; * */ -typedef guint8 gnutella_bye_t2; +typedef uint8 gnutella_bye_t2; static inline void -gnutella_bye_set_code(void *data, guint16 code) +gnutella_bye_set_code(void *data, uint16 code) { - guint8 *u8 = data; + uint8 *u8 = data; poke_le16(&u80, code); } /* The logic layout of the QRP RESET message specific payload is as follows: * * struct gnutella_qrp_reset_ { - * guint8 variant; // 0x00 - * guint32 table_length; - * guint8 infinity; + * uint8 variant; // 0x00 + * uint32 table_length; + * uint8 infinity; * }; * */ -typedef guint8 gnutella_qrp_reset_t6; +typedef uint8 gnutella_qrp_reset_t6; -static inline guint8 +static inline uint8 gnutella_qrp_reset_get_variant(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return u80; } -static inline guint32 +static inline uint32 gnutella_qrp_reset_get_table_length(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return peek_le32(&u81); } -static inline guint8 +static inline uint8 gnutella_qrp_reset_get_infinity(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return u85; } @@ -440,7 +443,8 @@ * */ -typedef guint8 gnutella_msg_qrp_reset_tGTA_HEADER_SIZE + sizeof(gnutella_qrp_reset_t); +typedef uint8 +gnutella_msg_qrp_reset_tGTA_HEADER_SIZE + sizeof(gnutella_qrp_reset_t); static inline gnutella_header_t * gnutella_msg_qrp_reset_header(gnutella_msg_qrp_reset_t *msg) @@ -450,74 +454,74 @@ static inline void gnutella_msg_qrp_reset_set_variant(gnutella_msg_qrp_reset_t *msg, - guint8 variant) + uint8 variant) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; u8GTA_HEADER_SIZE = variant; } static inline void gnutella_msg_qrp_reset_set_table_length(gnutella_msg_qrp_reset_t *msg, - guint32 table_length) + uint32 table_length) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; poke_le32(&u8GTA_HEADER_SIZE + 1, table_length); } static inline void gnutella_msg_qrp_reset_set_infinity(gnutella_msg_qrp_reset_t *msg, - guint8 inf_value) + uint8 inf_value) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; u8GTA_HEADER_SIZE + 5 = inf_value; } /* The logic layout of the QRP PATCH message specific payload is as follows: * * struct gnutella_qrp_patch_ { - * guint8 variant; // 0x01 - * guint8 seq_no; - * guint8 seq_size; - * guint8 compressor; - * guint8 entry_bits; + * uint8 variant; // 0x01 + * uint8 seq_no; + * uint8 seq_size; + * uint8 compressor; + * uint8 entry_bits; * }; * */ -typedef guint8 gnutella_qrp_patch_t5; - -static inline guint8 +typedef uint8 gnutella_qrp_patch_t5; + +static inline uint8 gnutella_qrp_patch_get_variant(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return u80; } -static inline guint8 +static inline uint8 gnutella_qrp_patch_get_seq_no(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return u81; } -static inline guint8 +static inline uint8 gnutella_qrp_patch_get_seq_size(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return u82; } -static inline guint8 +static inline uint8 gnutella_qrp_patch_get_compressor(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return u83; } -static inline guint8 +static inline uint8 gnutella_qrp_patch_get_entry_bits(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return u84; } @@ -530,7 +534,8 @@ * */ -typedef guint8 gnutella_msg_qrp_patch_tGTA_HEADER_SIZE + sizeof(gnutella_qrp_patch_t); +typedef uint8 +gnutella_msg_qrp_patch_tGTA_HEADER_SIZE + sizeof(gnutella_qrp_patch_t); static inline gnutella_header_t * gnutella_msg_qrp_patch_header(gnutella_msg_qrp_patch_t *msg) @@ -540,97 +545,97 @@ static inline void gnutella_msg_qrp_patch_set_variant(gnutella_msg_qrp_patch_t *msg, - guint8 variant) + uint8 variant) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; u8GTA_HEADER_SIZE = variant; } static inline void gnutella_msg_qrp_patch_set_seq_no(gnutella_msg_qrp_patch_t *msg, - guint8 seq_no) + uint8 seq_no) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; u8GTA_HEADER_SIZE + 1 = seq_no; } static inline void gnutella_msg_qrp_patch_set_seq_size(gnutella_msg_qrp_patch_t *msg, - guint8 seq_size) + uint8 seq_size) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; u8GTA_HEADER_SIZE + 2 = seq_size; } static inline void gnutella_msg_qrp_patch_set_compressor(gnutella_msg_qrp_patch_t *msg, - guint8 compressor) + uint8 compressor) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; u8GTA_HEADER_SIZE + 3 = compressor; } static inline void gnutella_msg_qrp_patch_set_entry_bits(gnutella_msg_qrp_patch_t *msg, - guint8 entry_bits) + uint8 entry_bits) { - guint8 *u8 = (void *) msg; + uint8 *u8 = (void *) msg; u8GTA_HEADER_SIZE + 4 = entry_bits; } /* The logic layout of the VENDOR message specific payload is as follows: * * struct gnutella_vendor_ { - * guint84 vendor; // For example, "GTKG" - * guint16 selector_id; // Message selector ID, little endian - * guint16 version; // Message version number, little endian + * uint84 vendor; // For example, "GTKG" + * uint16 selector_id; // Message selector ID, little endian + * uint16 version; // Message version number, little endian * * payload follows * }; * */ -typedef guint8 gnutella_vendor_t8; - -static inline guint32 +typedef uint8 gnutella_vendor_t8; + +static inline uint32 gnutella_vendor_get_code(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return peek_be32(&u80); } static inline void -gnutella_vendor_set_code(gnutella_vendor_t *data, guint32 code) +gnutella_vendor_set_code(gnutella_vendor_t *data, uint32 code) { - guint8 *u8 = (guint8 *) data; + uint8 *u8 = (uint8 *) data; poke_be32(&u80, code); } -static inline guint16 +static inline uint16 gnutella_vendor_get_selector_id(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return peek_le16(&u84); } static inline void -gnutella_vendor_set_selector_id(gnutella_vendor_t *data, guint16 selector_id) +gnutella_vendor_set_selector_id(gnutella_vendor_t *data, uint16 selector_id) { - guint8 *u8 = (guint8 *) data; + uint8 *u8 = (uint8 *) data; poke_le16(&u84, selector_id); } -static inline guint16 +static inline uint16 gnutella_vendor_get_version(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return peek_le16(&u86); } static inline void -gnutella_vendor_set_version(gnutella_vendor_t *data, guint16 version) +gnutella_vendor_set_version(gnutella_vendor_t *data, uint16 version) { - guint8 *u8 = (guint8 *) data; + uint8 *u8 = (uint8 *) data; poke_le16(&u86, version); } @@ -643,18 +648,18 @@ * */ -typedef guint8 gnutella_msg_vendor_GTA_HEADER_SIZE + sizeof(gnutella_vendor_t); +typedef uint8 gnutella_msg_vendor_GTA_HEADER_SIZE + sizeof(gnutella_vendor_t); /* The logic layout of the HSEP message is as follows: * * struct gnutella_msg_hsep_ { * gnutella_header_t header; - * guint64 triple3; + * uint64 triple3; * }; * */ -typedef guint8 gnutella_msg_hsep_tGTA_HEADER_SIZE + 3 * 8; +typedef uint8 gnutella_msg_hsep_tGTA_HEADER_SIZE + 3 * 8; static inline gnutella_header_t * gnutella_msg_hsep_header(gnutella_msg_hsep_t *msg) @@ -669,13 +674,13 @@ STATIC_ASSERT(14 == sizeof(gnutella_init_response_t)); STATIC_ASSERT(23 + 14 == sizeof(gnutella_msg_init_response_t)); - + STATIC_ASSERT(11 == sizeof(gnutella_search_results_t)); STATIC_ASSERT(23 + 11 == sizeof(gnutella_msg_search_results_t)); - + STATIC_ASSERT(2 == sizeof(gnutella_search_t)); STATIC_ASSERT(23 + 2 == sizeof(gnutella_msg_search_t)); - + STATIC_ASSERT(26 == sizeof(gnutella_push_request_t)); STATIC_ASSERT(23 + 26 == sizeof(gnutella_msg_push_request_t)); @@ -683,10 +688,10 @@ STATIC_ASSERT(6 == sizeof(gnutella_qrp_reset_t)); STATIC_ASSERT(23 + 6 == sizeof(gnutella_msg_qrp_reset_t)); - + STATIC_ASSERT(5 == sizeof(gnutella_qrp_patch_t)); STATIC_ASSERT(23 + 5 == sizeof(gnutella_msg_qrp_patch_t)); - + STATIC_ASSERT(8 == sizeof(gnutella_vendor_t)); STATIC_ASSERT(23 + 24 == sizeof(gnutella_msg_hsep_t));
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/guess.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/guess.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Raphael Manfredi + * Copyright (c) 2011, 2014 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -68,8 +68,14 @@ * of GUESS, but as it spreads out in the network, it should give a significant * boost to the GUESS ultrapeer discovery in the long run. * + * The GUESS search mechanism can also be extended to handle querying over G2 + * with small adjustments: G2 hubs query a cluster, hence sending a query to + * a G2 hub is like sending a Gnutella query with TTL=2 to an ultrapeer. But + * we get back the list of G2 hubs that the query was propagated to, so that we + * don't attempt to contact these hubs again during our query. + * * @author Raphael Manfredi - * @date 2011 + * @date 2011, 2014 */ #include "common.h" @@ -77,11 +83,14 @@ #include <math.h> /* For pow() */ #include "guess.h" + +#include "bsched.h" #include "extensions.h" #include "ggep_type.h" #include "gmsg.h" #include "gnet_stats.h" #include "gnutella.h" +#include "guid.h" #include "hcache.h" #include "hostiles.h" #include "hosts.h" @@ -91,64 +100,86 @@ #include "settings.h" #include "udp.h" +#include "g2/build.h" +#include "g2/msg.h" +#include "g2/rpc.h" +#include "g2/tree.h" + #include "dht/stable.h" +#include "if/core/guess.h" +#include "if/gnet_property.h" #include "if/gnet_property_priv.h" #include "lib/aging.h" +#include "lib/array_util.h" #include "lib/atoms.h" #include "lib/cq.h" #include "lib/dbmw.h" #include "lib/dbstore.h" -#include "lib/halloc.h" +#include "lib/endian.h" +#include "lib/hashing.h" /* For pointer_hash() */ #include "lib/hashlist.h" +#include "lib/hevset.h" +#include "lib/hikset.h" #include "lib/host_addr.h" -#include "lib/map.h" +#include "lib/hset.h" +#include "lib/htable.h" +#include "lib/listener.h" +#include "lib/misc.h" /* For vlint_decode() and dump_hex() */ #include "lib/nid.h" +#include "lib/pmsg.h" +#include "lib/pslist.h" #include "lib/random.h" +#include "lib/ripening.h" #include "lib/stacktrace.h" +#include "lib/str.h" /* For str_private() */ #include "lib/stringify.h" +#include "lib/timestamp.h" /* For timestamp_to_string() */ #include "lib/tm.h" +#include "lib/tokenizer.h" #include "lib/walloc.h" #include "lib/wq.h" +#include "lib/xmalloc.h" + #include "lib/override.h" /* Must be the last header included */ #define GUESS_QK_DB_CACHE_SIZE 1024 /**< Cached amount of query keys */ #define GUESS_QK_MAP_CACHE_SIZE 64 /**< # of SDBM pages to cache */ -#define GUESS_QK_LIFE 3600 /**< Cached token lifetime (secs) */ +#define GUESS_QK_LIFE 86000 /**< Cached token lifetime (secs) */ #define GUESS_QK_PRUNE_PERIOD (GUESS_QK_LIFE / 3 * 1000) /**< in ms */ #define GUESS_QK_FREQ 60 /**< At most 1 key request / min */ +#define GUESS_QK_TIMEOUT 40 /**< Timeout for getting QK on G2 */ #define GUESS_ALIEN_FREQ 300 /**< Time we cache non-GUESS hosts */ -#define GUESS_STABLE_PROBA 0.3333 /**< 33.33% */ -#define GUESS_ALIVE_PROBA 0.5 /**< 50% */ +#define GUESS_MUID_LINGER 1200 /**< Lingering (20 min) for old MUIDs */ +#define GUESS_STABLE_PROBA 0.3333 /**< 33.33% */ +#define GUESS_ALIVE_PROBA 0.5 /**< 50% */ #define GUESS_LINK_CACHE_SIZE 75 /**< Amount of hosts to maintain */ #define GUESS_CHECK_PERIOD (60 * 1000) /**< 1 minute, in ms */ #define GUESS_ALIVE_PERIOD (5 * 60) /**< 5 minutes, in s */ #define GUESS_SYNC_PERIOD (60 * 1000) /**< 1 minute, in ms */ #define GUESS_MAX_ULTRAPEERS 50000 /**< Query stops after that many acks */ -#define GUESS_RPC_LIFETIME 15000 /**< 15 seconds, in ms */ +#define GUESS_RPC_LIFETIME 35000 /**< 35 seconds, in ms */ +#define GUESS_G2_RPC_TIMEOUT 900 /**< 900 seconds (15 minutes!) */ #define GUESS_FIND_DELAY 5000 /**< in ms, UDP queue flush grace */ #define GUESS_ALPHA 5 /**< Level of query concurrency */ +#define GUESS_ALPHA_MAX 50 /**< Max level of query concurrency */ #define GUESS_WAIT_DELAY 30000 /**< in ms, time waiting for hosts */ #define GUESS_WARMING_COUNT 100 /**< Loose concurrency after that */ #define GUESS_MAX_TIMEOUTS 5 /**< Max # of consecutive timeouts */ #define GUESS_TIMEOUT_DELAY 3600 /**< Time before resetting timeouts */ #define GUESS_ALIVE_DECIMATION 0.85 /**< Per-timeout proba decimation */ #define GUESS_DBLOAD_DELAY 60 /**< 1 minute, in s */ +#define GUESS_02_CACHE_SIZE 20 /**< Random cache of 0.2 hosts */ +#define GUESS_G2_CACHE_SIZE 45 /**< Random cache of G2 hosts */ +#define GUESS_ALIVE_CACHE_SIZE 1024 /**< Hosts with recent activity */ +#define GUESS_DBLOAD_PERIOD (GUESS_DBLOAD_DELAY * 1000) /**< in ms */ /** * Query stops after that many hits */ #define GUESS_MAX_RESULTS SEARCH_MAX_RESULTS -/** - * Parallelism modes. - */ -enum guess_mode { - GUESS_QUERY_BOUNDED, /**< Bounded parallelism */ - GUESS_QUERY_LOOSE /**< Loose parallelism */ -}; - enum guess_magic { GUESS_MAGIC = 0x65bfef66 }; /** @@ -159,7 +190,8 @@ const char *query; /**< The query string (atom) */ const guid_t *muid; /**< GUESS query MUID (atom) */ gnet_search_t sh; /**< Local search handle */ - map_t *queried; /**< Ultrapeers already queried */ + hset_t *queried; /**< Hosts already queried */ + hset_t *deferred; /**< Hosts in pool, with processing deferred */ hash_list_t *pool; /**< Pool of ultrapeers to query */ wq_event_t *hostwait; /**< Waiting on more hosts event */ wq_event_t *bwait; /**< Waiting on more bandwidth */ @@ -168,14 +200,16 @@ void *arg; /**< User-supplied callback argument */ struct nid gid; /**< Guess lookup ID (unique, internal) */ tm_t start; /**< Start time */ - size_t queried_nodes; /**< Amount of nodes queried */ + size_t queried_ultra; /**< Amount of ultra nodes queried */ size_t query_acks; /**< Amount of query acknowledgments */ + size_t query_reached; /**< Amount of reached hosts */ size_t max_ultrapeers; /**< Max amount of ultrapeers to query */ + size_t queried_g2; /**< Amount of G2 nodes queried */ enum guess_mode mode; /**< Concurrency mode */ unsigned mtype; /**< Media type filtering (0 if none) */ - guint32 flags; /**< Operating flags */ - guint32 kept_results; /**< Amount of results kept */ - guint32 recv_results; /**< Amount of results received */ + uint32 flags; /**< Operating flags */ + uint32 kept_results; /**< Amount of results kept */ + uint32 recv_results; /**< Amount of results received */ unsigned hops; /**< Amount of iteration hops */ int rpc_pending; /**< Amount of RPC pending */ unsigned bw_out_query; /**< Spent outgoing querying bandwidth */ @@ -198,26 +232,20 @@ #define GQ_F_SENDING (1U << 3) /**< Sending a message */ #define GQ_F_END_STARVING (1U << 4) /**< End when starving */ #define GQ_F_POOL_LOAD (1U << 5) /**< Pending pool loading */ - -/** - * RPC replies. - */ -enum guess_rpc_ret { - GUESS_RPC_TIMEOUT = 0, - GUESS_RPC_REPLY -}; +#define GQ_F_TERMINATED (1U << 6) /**< Asynchronous termination */ struct guess_rpc; /** * A GUESS RPC callback function. * - * @param type GUESS_RPC_TIMEOUT or GUESS_RPC_REPLY + * To indicate a timeout, the ``n'' parameter is NULL. + * * @param grp the RPC descriptor - * @param n the node sending back the acknowledgement pong + * @param n the node sending back the acknowledgement pong or /QA * @param gq the GUESS query object that issued the RPC */ -typedef void (*guess_rpc_cb_t)(enum guess_rpc_ret type, struct guess_rpc *grp, +typedef void (*guess_rpc_cb_t)(struct guess_rpc *grp, const gnutella_node_t *n, guess_t *gq); enum guess_rpc_magic { GUESS_RPC_MAGIC = 0x0d49f32f }; @@ -233,6 +261,7 @@ guess_rpc_cb_t cb; /**< Callback routine to invoke */ cevent_t *timeout; /**< Callout queue timeout event */ struct guess_pmsg_info *pmi; /**< Meta information about message sent */ + const g2_tree_t *t; /**< Parsed G2 tree (for G2 RPCs only) */ unsigned hops; /**< Hop count at RPC issue time */ }; @@ -259,6 +288,7 @@ const gnet_host_t *host; /**< Host queried (atom) */ struct guess_rpc *grp; /**< Attached RPC info */ unsigned rpc_done:1; /**< Set if RPC times out before message sent */ + unsigned g2:1; /**< Whether the G2 protocol is used */ }; static inline void @@ -301,13 +331,6 @@ static char db_qkdata_what = "GUESS hosts & query keys"; /** - * Keeps track of the amount of GUESS 0.2 hosts in the cache. - * Those are identified when they are returning hosts in GGEP "IPP" on pings - * sent by GUESS 0.2 clients (which we are). - */ -static guint64 guess_02_hosts; - -/** * Information about a host that is stored to disk. * The structure is serialized first, not written as-is. */ @@ -316,9 +339,10 @@ time_t last_seen; /**< When we last saw the host */ time_t last_update; /**< When we last updated the query key */ time_t last_timeout; /**< When last RPC timeout occurred */ - guint32 flags; /**< Host flags */ - guint8 timeouts; /**< Amount of consecutive RPC timeouts */ - guint8 length; /**< Query key length */ + time_t retry_after; /**< Time before which we cannot recontact host */ + uint32 flags; /**< Host flags */ + uint8 timeouts; /**< Amount of consecutive RPC timeouts */ + uint8 length; /**< Query key length */ void *query_key; /**< Binary data -- walloc()-ed */ }; @@ -328,25 +352,290 @@ #define GUESS_F_PINGED (1U << 0) /**< Host was pinged for more hosts */ #define GUESS_F_OTHER_HOST (1U << 1) /**< Returns pongs for other hosts */ #define GUESS_F_PONG_IPP (1U << 2) /**< Returns hosts in GGEP "IPP" */ +#define GUESS_F_G2 (1U << 3) /**< G2 hub */ -#define GUESS_QK_VERSION 1 /**< Serialization version number */ +#define GUESS_QK_VERSION 2 /**< Serialization version number */ -static GHashTable *gqueries; /**< Running GUESS queries */ -static GHashTable *gmuid; /**< MUIDs of active queries */ -static GHashTable *pending; /**< Pending pong acknowledges */ +/** + * Keeps track of the amount of GUESS 0.2 hosts in the cache. + * Those are identified when they are returning hosts in GGEP "IPP" on pings + * sent by GUESS 0.2 clients (which we are). + */ +static uint64 guess_02_hosts; + +/** + * Keeps track of the amount of G2 hosts in the cache. + * The protocol used to query these hosts and discover them is different + * at the transmission level but, from a high-level standpoint, is very + * similar to the one Gnutella uses, which is why we handle both here. + */ +static uint64 guess_g2_hosts; + +struct guess_cache { + hset_t *hs; /* Which hosts are present in the cache */ + gnet_host_t const **cache; /* The array of cached hosts */ + size_t max; /* Max amount of hosts to cache */ +}; + +/** + * Local cache of randomly selected (but alive) GUESS 0.2 and G2 hosts. + */ +static struct guess_cache guess_02_cache = { NULL, NULL, GUESS_02_CACHE_SIZE }; +static struct guess_cache guess_g2_cache = { NULL, NULL, GUESS_G2_CACHE_SIZE }; + +/** + * Uniform signature used for receiveing both Gnutella UDP Pong with query keys + * and G2 query keys. + */ +typedef void (*guess_qk_cb_t)(enum udp_ping_ret type, + const gnutella_node_t *n, const g2_tree_t *t, void *data); + +enum guess_qk_rpc_magic { GUESS_QK_RPC_MAGIC = 0x27f1c043 }; + +/** + * Query key RPC context. + */ +struct guess_qk_rpc { + enum guess_qk_rpc_magic magic; + guess_qk_cb_t cb; /* The original callback */ + void *arg; /* The original argument */ +}; + +static inline void +guess_qk_rpc_check(const struct guess_qk_rpc * const ctx) +{ + g_assert(ctx != NULL); + g_assert(GUESS_QK_RPC_MAGIC == ctx->magic); +} + +static hevset_t *gqueries; /**< Running GUESS queries */ +static hikset_t *gmuid; /**< MUIDs of active queries */ +static htable_t *pending; /**< Pending pong acknowledges */ static hash_list_t *link_cache; /**< GUESS "link cache" */ +static hash_list_t *load_pending; /**< Queries waiting for DBMW loading */ +static hash_list_t *alive_cache; /**< Cache of zero-timeout hosts */ static cperiodic_t *guess_qk_prune_ev; /**< Query keys pruning event */ static cperiodic_t *guess_check_ev; /**< Link cache monitoring */ static cperiodic_t *guess_sync_ev; /**< Periodic DBMW syncs */ static cperiodic_t *guess_bw_ev; /**< Periodic b/w checking */ +static cperiodic_t *guess_load_ev; /**< Periodic DBMW load checking */ static wq_event_t *guess_new_host_ev; /**< Waiting for a new host */ static aging_table_t *guess_qk_reqs; /**< Recent query key requests */ static aging_table_t *guess_alien; /**< Recently seen non-GUESS hosts */ -static guint32 guess_out_bw; /**< Outgoing b/w used per period */ +static aging_table_t *guess_old_muids; /**< Recently expired GUESS MUIDs */ +static ripening_table_t *guess_deferred;/**< Hosts with deferred processing */ +static uint32 guess_out_bw; /**< Outgoing b/w used per period */ +static uint32 guess_target_bw; /**< Outgoing b/w target for period */ +static int guess_alpha = GUESS_ALPHA; /**< Concurrency query parameter */ +static time_t guess_qk_threshtime; /**< Stamp threshold for query keys */ static void guess_discovery_enable(void); static void guess_iterate(guess_t *gq); -static gboolean guess_send(guess_t *gq, const gnet_host_t *host); +static bool guess_send(guess_t *gq, const gnet_host_t *host); +static bool guess_request_qk(const gnet_host_t *host, bool intro, bool g2); +static bool guess_has_valid_qk(const gnet_host_t *host); + +/** + * Listening interface, used by the GUI through the bridge to plug in + * notification callbacks for GUESS query creation/removal and periodic + * GUESS statistics collection. + */ + +static listeners_t guess_event_listeners; +static listeners_t guess_stats_listeners; + +void +guess_event_listener_add(guess_event_listener_t l) +{ + LISTENER_ADD(guess_event, l); +} + +void +guess_event_listener_remove(guess_event_listener_t l) +{ + LISTENER_REMOVE(guess_event, l); +} + +static void +guess_event_fire(const guess_t *gq, bool created) +{ + struct guess_query query; + + query.max_ultra = gq->max_ultrapeers; + query.mode = gq->mode; + + LISTENER_EMIT(guess_event, (gq->sh, created ? &query : NULL)); +} + +void +guess_stats_listener_add(guess_stats_listener_t l) +{ + LISTENER_ADD(guess_stats, l); +} + +void +guess_stats_listener_remove(guess_stats_listener_t l) +{ + LISTENER_REMOVE(guess_stats, l); +} + +static void +guess_stats_fire(const guess_t *gq) +{ + struct guess_stats stats; + + stats.pool = hash_list_length(gq->pool); /* Excluding deferred */ + stats.queried_ultra = gq->queried_ultra; + stats.queried_g2 = gq->queried_g2; + stats.acks = gq->query_acks; + stats.reached = gq->query_reached; + stats.results = gq->recv_results; + stats.kept = gq->kept_results; + stats.hops = gq->hops; + stats.rpc_pending = gq->rpc_pending; + stats.bw_out_query = gq->bw_out_query; + stats.bw_out_qk = gq->bw_out_qk; + stats.mode = gq->mode; + stats.pool_load = booleanize(gq->flags & GQ_F_POOL_LOAD); + stats.end_starving = booleanize(gq->flags & GQ_F_END_STARVING); + + LISTENER_EMIT(guess_stats, (gq->sh, &stats)); +} + +static void +guess_qk_rpc_free(struct guess_qk_rpc *ctx) +{ + guess_qk_rpc_check(ctx); + + ctx->magic = 0; + WFREE(ctx); +} + +/** + * Randomly add host to the GUESS cache. + */ +static void +guess_cache_add(struct guess_cache *gc, const gnet_host_t *host) +{ + unsigned count; + + if (hset_contains(gc->hs, host)) + return; + + /* + * We have a new host. + * + * If the cache is not full, we append the host. + * + * Otherwise randomly pick one host from the set made of the currently + * cached hosts plus this new host. If we pick the new host, we discard + * it. If another host was selected, then the new host replaces that + * selection. + */ + + count = hset_count(gc->hs); + + if (count < gc->max) { + const gnet_host_t *key = atom_host_get(host); + + /* Cache not full, append to it */ + gc->cachecount = key; + hset_insert(gc->hs, key); + } else { + unsigned rnd = random_value(count); /* Yes, up to ``count'' included */ + + if (rnd < gc->max) { + const gnet_host_t *key = atom_host_get(host); + + /* Replace item `rnd' with new host */ + hset_remove(gc->hs, gc->cachernd); + atom_host_free(gc->cachernd); + gc->cachernd = key; + hset_insert(gc->hs, key); + } + } +} + +/** + * Remove host if it was present in the cache. + */ +static void +guess_cache_remove(struct guess_cache *gc, const gnet_host_t *host) +{ + bool found; + const void *key; + + found = hset_contains_extended(gc->hs, host, &key); + + if (found) { + const gnet_host_t *khost = key; + size_t i; + size_t count = hset_count(gc->hs); + + /* Cache is small, linear lookup is OK */ + + for (i = 0; i < count; i++) { + if G_UNLIKELY(khost == gc->cachei) { + ARRAY_REMOVE_DEC(gc->cache, i, count); + gc->cachecount = NULL; + goto done; + } + } + + g_assert_not_reached(); /* Must have been found */ + + done: + hset_remove(gc->hs, khost); + atom_host_free(khost); + } +} + +/** + * Randomly select a GUESS 0.2 host from the cache. + * + * @return host pointer, or NULL if no 0.2 host is available. + */ +static const gnet_host_t * +guess_cache_select(void) +{ + struct guess_cache *gc = &guess_02_cache; + size_t count; + + count = hset_count(gc->hs); + + if (0 == count) + return NULL; + + return gc->cacherandom_value(count - 1); +} + +/** + * @return amount of hosts in the cache. + */ +static size_t +guess_cache_count(void) +{ + struct guess_cache *gc = &guess_02_cache; + + return hset_count(gc->hs); +} + +/** + * Free a GUESS host cache. + */ +static void +guess_cache_free(struct guess_cache *gc) +{ + size_t i; + + for (i = 0; i < gc->max; i++) { + atom_host_free_null(&gc->cachei); + } + + hset_free_null(&gc->hs); + XFREE_NULL(gc->cache); + gc->max = 0; +} /** * Allocate a GUESS query ID, the way for users to identify the querying object. @@ -376,7 +665,8 @@ if (NULL == qk) { if (dbmw_has_ioerr(db_qkdata)) { - g_warning("DBMW \"%s\" I/O error, bad things could happen...", + s_warning_once_per(LOG_PERIOD_MINUTE, + "DBMW \"%s\" I/O error, bad things could happen...", dbmw_name(db_qkdata)); } } @@ -390,8 +680,10 @@ static void delete_qkdata(const gnet_host_t *host) { + guess_cache_remove(&guess_02_cache, host); /* In case it is there */ + guess_cache_remove(&guess_g2_cache, host); /* In case it is there */ dbmw_delete(db_qkdata, host); - gnet_stats_count_general(GNR_GUESS_CACHED_QUERY_KEYS_HELD, -1); + gnet_stats_dec_general(GNR_GUESS_CACHED_QUERY_KEYS_HELD); if (GNET_PROPERTY(guess_client_debug) > 5) { g_debug("GUESS QKCACHE query key for %s reclaimed", @@ -417,6 +709,8 @@ /* Introduced at version 1 */ pmsg_write_time(mb, qk->last_timeout); pmsg_write_u8(mb, qk->timeouts); + /* Introduced at version 2, for G2 hubs */ + pmsg_write_time(mb, qk->retry_after); } /** @@ -426,7 +720,7 @@ deserialize_qkdata(bstr_t *bs, void *valptr, size_t len) { struct qkdata *qk = valptr; - guint8 version; + uint8 version; g_assert(sizeof *qk == len); @@ -448,6 +742,10 @@ /* Fields introduced at version 1 */ bstr_read_time(bs, &qk->last_timeout); bstr_read_u8(bs, &qk->timeouts); + if (version >= 2) { + /* Fields introduced at version 2 */ + bstr_read_time(bs, &qk->retry_after); + } } else { qk->last_timeout = 0; qk->timeouts = 0; @@ -487,7 +785,7 @@ { const struct guess_rpc_key *ka = a, *kb = b; - return guid_eq(ka->muid, kb->muid) && host_addr_equal(ka->addr, kb->addr); + return guid_eq(ka->muid, kb->muid) && host_addr_equiv(ka->addr, kb->addr); } /** @@ -533,6 +831,47 @@ } /** + * Should we terminate the query? + */ +static bool +guess_should_terminate(guess_t *gq, bool verbose) +{ + const char *reason = NULL; + + guess_check(gq); + + if (!guess_query_enabled()) { + reason = "GUESS disabled"; + goto terminate; + } + + if (gq->flags & GQ_F_TERMINATED) { + reason = "terminated"; + goto terminate; + } + + if (gq->query_reached >= gq->max_ultrapeers) { + reason = "max amount of successfully queried ultrapeers reached"; + goto terminate; + } + + if (gq->kept_results >= GUESS_MAX_RESULTS) { + reason = "max amount of kept results reached"; + goto terminate; + } + + return FALSE; + +terminate: + if (verbose && GNET_PROPERTY(guess_client_debug) > 1) { + g_debug("GUESS QUERY%s should terminate: %s", + nid_to_string(&gq->gid), reason); + } + + return TRUE; +} + +/** * Check whether the GUESS query bearing the specified ID is still alive. * * @return NULL if the ID is unknown, otherwise the GUESS query object. @@ -545,7 +884,7 @@ if G_UNLIKELY(NULL == gqueries) return NULL; - gq = g_hash_table_lookup(gqueries, &gid); + gq = hevset_lookup(gqueries, &gid); if (gq != NULL) guess_check(gq); @@ -557,11 +896,10 @@ * Destroy RPC descriptor and its key. */ static void -guess_rpc_destroy(struct guess_rpc *grp, struct guess_rpc_key *key) +guess_rpc_destroy(struct guess_rpc *grp) { guess_rpc_check(grp); - guess_rpc_key_free(key); atom_guid_free_null(&grp->muid); atom_host_free_null(&grp->host); cq_cancel(&grp->timeout); @@ -570,27 +908,38 @@ } /** - * Free RPC descriptor. + * Remove RPC descriptor from the table of pending RPCs. */ static void -guess_rpc_free(struct guess_rpc *grp) +guess_rpc_remove(const struct guess_rpc *grp) { - void *orig_key, *value; + const void *orig_key; + void *value; struct guess_rpc_key key; - gboolean found; + bool found; guess_rpc_check(grp); - + key.muid = grp->muid; key.addr = gnet_host_get_addr(grp->host); - found = g_hash_table_lookup_extended(pending, &key, &orig_key, &value); + found = htable_lookup_extended(pending, &key, &orig_key, &value); g_assert(found); g_assert(value == grp); - g_hash_table_remove(pending, &key); - guess_rpc_destroy(grp, orig_key); + htable_remove(pending, &key); + guess_rpc_key_free(deconstify_pointer(orig_key)); +} + +/** + * Free RPC descriptor. + */ +static void +guess_rpc_free(struct guess_rpc *grp) +{ + guess_rpc_remove(grp); + guess_rpc_destroy(grp); } /** @@ -608,7 +957,7 @@ key.muid = gq->muid; key.addr = gnet_host_get_addr(host); - grp = g_hash_table_lookup(pending, &key); + grp = htable_lookup(pending, &key); guess_rpc_free(grp); g_assert(gq->rpc_pending > 0); @@ -620,27 +969,34 @@ * in the sending process and the cancelling is synchronous). */ - if (0 == gq->rpc_pending && !(gq->flags & GQ_F_SENDING)) + if ( + 0 == gq->rpc_pending && + !(gq->flags & GQ_F_SENDING) && + !guess_should_terminate(gq, FALSE) + ) { guess_iterate(gq); + } else { + guess_stats_fire(gq); /* Update amount of pending RPCs */ + } } /** * RPC timeout function. */ static void -guess_rpc_timeout(cqueue_t *unused_cq, void *obj) +guess_rpc_timeout(cqueue_t *cq, void *obj) { struct guess_rpc *grp = obj; guess_t *gq; guess_rpc_check(grp); - (void) unused_cq; - grp->timeout = NULL; + cq_zero(cq, &grp->timeout); gq = guess_is_alive(grp->gid); + guess_rpc_remove(grp); /* Remove before invoking callback */ if (gq != NULL) - (*grp->cb)(GUESS_RPC_TIMEOUT, grp, NULL, gq); - guess_rpc_free(grp); + (*grp->cb)(grp, NULL, gq); /* Timeout */ + guess_rpc_destroy(grp); } /** @@ -648,28 +1004,50 @@ * * @param host host to which RPC is sent * @param muid the query MUID used + * @param g2 whether we're querying a G2 host * @param gid the guess query ID * @param cb callback to invoke on reply or timeout + * @param earliest filled with earliest time when we can retry * * @return RPC descriptor if OK, NULL if we cannot issue an RPC to this host - * because we already have a pending one to the same IP. + * because we already have a pending one to the same IP, filling `earliest' + * with the earliest retry time (conservative). */ static struct guess_rpc * -guess_rpc_register(const gnet_host_t *host, const guid_t *muid, - struct nid gid, guess_rpc_cb_t cb) +guess_rpc_register(const gnet_host_t *host, const guid_t *muid, bool g2, + struct nid gid, guess_rpc_cb_t cb, time_t *earliest) { struct guess_rpc *grp; struct guess_rpc_key key; struct guess_rpc_key *k; + time_delta_t delay; key.muid = muid; key.addr = gnet_host_get_addr(host); - if (gm_hash_table_contains(pending, &key)) { + grp = htable_lookup(pending, &key); + + if (grp != NULL) { + guess_rpc_check(grp); + g_assert(grp->timeout != NULL); + + delay = cq_remaining(grp->timeout) / 1000; /* Seconds */ + *earliest = time_advance(tm_time(), delay); + + if (GNET_PROPERTY(guess_client_debug) > 1) { + g_message("GUESS cannot issue RPC to %s%s with #%s yet (need %s)", + g2 ? "G2 " : "", gnet_host_to_string(host), + guid_hex_str(muid), short_time_ascii(delay)); + } + return NULL; /* Cannot issue RPC yet */ + } + + if (g2 && 0 != (delay = g2_rpc_launch_delay(host, G2_MSG_Q2))) { if (GNET_PROPERTY(guess_client_debug) > 1) { - g_message("GUESS cannot issue RPC to %s with MUID=%s yet", - gnet_host_to_string(host), guid_hex_str(muid)); + g_message("GUESS cannot issue /Q2 RPC to G2 %s yet (need %s)", + gnet_host_to_string(host), short_time_ascii(delay)); } + *earliest = time_advance(tm_time(), delay); return NULL; /* Cannot issue RPC yet */ } @@ -682,7 +1060,7 @@ * the query is still alive. */ - WALLOC(grp); + WALLOC0(grp); grp->magic = GUESS_RPC_MAGIC; grp->host = atom_host_get(host); grp->muid = atom_guid_get(muid); @@ -691,28 +1069,30 @@ grp->timeout = cq_main_insert(GUESS_RPC_LIFETIME, guess_rpc_timeout, grp); k = guess_rpc_key_alloc(muid, host); - g_hash_table_insert(pending, k, grp); + htable_insert(pending, k, grp); return grp; /* OK, RPC can be issued */ } /** - * Handle possible RPC reply. + * Handle possible GUESS RPC reply on Gnutella. * * @return TRUE if the message was a reply to a registered MUID and was * handled as such. */ -gboolean -guess_rpc_handle(struct gnutella_node *n) +bool +guess_rpc_handle(gnutella_node_t *n) { struct guess_rpc_key key; struct guess_rpc *grp; guess_t *gq; + g_assert(!NODE_TALKS_G2(n)); + key.muid = gnutella_header_get_muid(&n->header); key.addr = n->addr; - grp = g_hash_table_lookup(pending, &key); + grp = htable_lookup(pending, &key); if (NULL == grp) return FALSE; @@ -724,13 +1104,13 @@ * If we get a reply, the message must have been sent, otherwise this * is an improbable collision (or a local bookkeeping bug). * - * TODO: check that our bookkepping of grp->pmi is correct, after 0.97 + * TODO: check that our bookkeeping of grp->pmi is correct, after 0.97 * is out. --RAM, 2011-06-18 */ if (grp->pmi != NULL) { if (GNET_PROPERTY(guess_client_debug)) { - g_warning("GUESS QUERY%s got RPC reply for %s from %s " + g_warning("GUESS QUERY%s got RPC reply for #%s from %s " "but message to %s still unsent?", nid_to_string(&gq->gid), guid_hex_str(key.muid), node_infostr(n), gnet_host_to_string(grp->pmi->host)); @@ -738,7 +1118,7 @@ return FALSE; /* Don't handle message */ } - (*grp->cb)(GUESS_RPC_REPLY, grp, n, gq); + (*grp->cb)(grp, n, gq); /* Got a reply */ } guess_rpc_free(grp); @@ -749,7 +1129,7 @@ * Set host flags in the database. */ static void -guess_host_set_flags(const gnet_host_t *h, guint32 flags) +guess_host_set_flags(const gnet_host_t *h, uint32 flags) { struct qkdata *qk; @@ -767,7 +1147,7 @@ * Cleast host flags in the database. */ static void -guess_host_clear_flags(const gnet_host_t *h, guint32 flags) +guess_host_clear_flags(const gnet_host_t *h, uint32 flags) { struct qkdata *qk; @@ -795,8 +1175,9 @@ if (!(qk->flags & GUESS_F_PONG_IPP)) { qk->flags |= GUESS_F_PONG_IPP; guess_02_hosts++; - gnet_stats_count_general(GNR_GUESS_CACHED_02_HOSTS_HELD, +1); + gnet_stats_inc_general(GNR_GUESS_CACHED_02_HOSTS_HELD); dbmw_write(db_qkdata, h, qk, sizeof *qk); + guess_cache_add(&guess_02_cache, h); } } } @@ -815,25 +1196,58 @@ if (qk->flags & GUESS_F_PONG_IPP) { qk->flags &= ~GUESS_F_PONG_IPP; guess_02_hosts--; - gnet_stats_count_general(GNR_GUESS_CACHED_02_HOSTS_HELD, -1); + gnet_stats_dec_general(GNR_GUESS_CACHED_02_HOSTS_HELD); dbmw_write(db_qkdata, h, qk, sizeof *qk); + guess_cache_remove(&guess_02_cache, h); + } + } +} + +/** + * Add host to the alive cache if not already there, otherwise update its + * position in the cache. + */ +static void +guess_alive_update(const gnet_host_t *h) +{ + /* + * The alive cache is maintained as a pure LRU cache of limited size. + * Newest entries are moved to the head. + * + * Contrary to the link cache, this is not actively maintained: we do not + * regularily scan the cache to prune dead entries. The alive cache is + * there to remember a large set of not-timeouting hosts to fuel new + * GUESS queries, until it can load data from the larger disk cache. + */ + + if (hash_list_contains(alive_cache, h)) { + hash_list_moveto_head(alive_cache, h); + } else { + while (hash_list_length(alive_cache) > GUESS_ALIVE_CACHE_SIZE) { + gnet_host_t *host = hash_list_remove_tail(alive_cache); + atom_host_free(host); } + hash_list_prepend(alive_cache, atom_host_get(h)); } } /** * Update "last_seen" event for hosts from whom we get traffic and move * them to the head of the link cache if present. + * + * @param h the host (IP:port) from which we got traffic + * @param flags type of traffic: 0 for Gnutella, GUESS_F_G2 for G2 traffic */ static void -guess_traffic_from(const gnet_host_t *h) +guess_traffic_from(const gnet_host_t *h, uint32 flags) { struct qkdata *qk; struct qkdata new_qk; - if (hash_list_contains(link_cache, h)) { + if (hash_list_contains(link_cache, h)) hash_list_moveto_head(link_cache, h); - } + + guess_alive_update(h); qk = get_qkdata(h); @@ -841,8 +1255,14 @@ ZERO(&new_qk); /* Precaution */ new_qk.first_seen = new_qk.last_update = tm_time(); new_qk.query_key = NULL; /* Query key unknown */ + new_qk.flags = flags; qk = &new_qk; - gnet_stats_count_general(GNR_GUESS_CACHED_QUERY_KEYS_HELD, +1); + gnet_stats_inc_general(GNR_GUESS_CACHED_QUERY_KEYS_HELD); + + if (flags & GUESS_F_G2) { + guess_g2_hosts++; + gnet_stats_inc_general(GNR_GUESS_CACHED_G2_HOSTS_HELD); + } } qk->last_seen = tm_time(); @@ -857,6 +1277,18 @@ guess_timeout_from(const gnet_host_t *h) { struct qkdata *qk; + const gnet_host_t *atom; + + if G_UNLIKELY(NULL == alive_cache) + return; /* GUESS layer shutdown already */ + + /* + * Hosts that timeout are immediately removed from the "alive" cache, + * by definition. + */ + + atom = hash_list_remove(alive_cache, h); + atom_host_free_null(&atom); qk = get_qkdata(h); @@ -870,7 +1302,7 @@ /** * Reset old timeout indication. */ -static G_GNUC_HOT void +static void G_HOT guess_timeout_reset(const gnet_host_t *h, struct qkdata *qk) { g_assert(h != NULL); @@ -897,10 +1329,59 @@ } /** - * Can node which timed-out in the past be considered again as the target - * of an RPC? + * Record G2 host. + * + * @param h the host (IP:port) which we want to flag as G2 + */ +static void +guess_record_g2(const gnet_host_t *h) +{ + struct qkdata *qk; + struct qkdata new_qk; + + qk = get_qkdata(h); + + if (NULL == qk) { + ZERO(&new_qk); /* Precaution */ + new_qk.first_seen = new_qk.last_update = tm_time(); + new_qk.query_key = NULL; /* Query key unknown */ + new_qk.flags = GUESS_F_G2; + qk = &new_qk; + gnet_stats_inc_general(GNR_GUESS_CACHED_QUERY_KEYS_HELD); + + guess_g2_hosts++; + gnet_stats_inc_general(GNR_GUESS_CACHED_G2_HOSTS_HELD); + + dbmw_write(db_qkdata, h, qk, sizeof *qk); + } else if (!(qk->flags & GUESS_F_G2)) { + qk->flags |= GUESS_F_G2; + dbmw_write(db_qkdata, h, qk, sizeof *qk); + } +} + +/** + * Can cached host be recontected? */ -static gboolean +static bool +guess_can_recontact_qk(const struct qkdata *qk) +{ + time_t grace; + + if (0 != qk->retry_after && delta_time(tm_time(), qk->retry_after) < 0) + return FALSE; + + if (0 == qk->timeouts) + return TRUE; + + grace = 5 << qk->timeouts; + return delta_time(tm_time(), qk->last_timeout) > grace; +} + +/** + * Can node which timed-out in the past or has set a "retry after" limit + * be considered again as the target of an RPC? + */ +static bool guess_can_recontact(const gnet_host_t *h) { struct qkdata *qk; @@ -908,24 +1389,60 @@ qk = get_qkdata(h); if (qk != NULL) { - time_t grace; - guess_timeout_reset(h, qk); + return guess_can_recontact_qk(qk); + } - if (0 == qk->timeouts) - return TRUE; + return TRUE; +} + +/** + * Compute earliest recontact time for host. + * + * @return time when host can be recontacted, 0 if it can be contacted now. + */ +static time_t +guess_earliest_contact_time_qk(const struct qkdata *qk) +{ + time_t timeout, earliest, now = tm_time(); - grace = 5 << qk->timeouts; - return delta_time(tm_time(), qk->last_timeout) > grace; + if (qk->timeouts != 0) { + timeout = time_advance(qk->last_timeout, 5 << qk->timeouts); + } else { + timeout = 0; } - return TRUE; + earliest = MAX(timeout, qk->retry_after); + if (delta_time(now, earliest) < 0) + return earliest; + + return 0; +} + +/** + * Compute earliest recontact time for host. + * + * @return time when host can be recontacted, 0 if it can be contacted now. + */ +static time_t +guess_earliest_contact_time(const gnet_host_t *h) +{ + struct qkdata *qk; + + qk = get_qkdata(h); + + if (qk != NULL) { + guess_timeout_reset(h, qk); + return guess_earliest_contact_time_qk(qk); + } + + return 0; } /** * Should a node be skipped due to too many timeouts recently? */ -static gboolean +static bool guess_should_skip(const gnet_host_t *h) { struct qkdata *qk; @@ -947,6 +1464,7 @@ guess_add_link_cache(const gnet_host_t *h, int p) { host_addr_t addr; + uint16 port; g_assert(h != NULL); g_assert(p >= 0 && p <= 100); @@ -955,18 +1473,20 @@ return; addr = gnet_host_get_addr(h); + port = gnet_host_get_port(h); - if (hostiles_check(addr) || !host_address_is_usable(addr)) + if (hostiles_is_bad(addr) || !host_is_valid(addr, port)) return; - if (is_my_address_and_port(addr, gnet_host_get_port(h))) + if (is_my_address_and_port(addr, port)) return; - if (random_u32() % 100 < UNSIGNED(p)) { + if (random_value(99) < UNSIGNED(p)) { hash_list_prepend(link_cache, atom_host_get(h)); + gnet_stats_inc_general(GNR_GUESS_LINK_CACHE); if (GNET_PROPERTY(guess_client_debug) > 2) { - g_info("GUESS adding %s to link cache (p=%d%%, n=%zu)", + g_info("GUESS adding %s to link cache (p=%d%%, n=%u)", gnet_host_to_string(h), p, hash_list_length(link_cache)); } @@ -981,6 +1501,7 @@ } atom_host_free(removed); + gnet_stats_dec_general(GNR_GUESS_LINK_CACHE); } } @@ -988,9 +1509,9 @@ * We discovered a new host through a pong. */ static void -guess_discovered_host(host_addr_t addr, guint16 port) +guess_discovered_host(host_addr_t addr, uint16 port) { - if (hostiles_check(addr) || !host_address_is_usable(addr)) + if (hostiles_is_bad(addr) || !host_is_valid(addr, port)) return; if (is_my_address_and_port(addr, port)) @@ -1009,34 +1530,239 @@ } /** + * Hash table iterator to remove a host from the query pool and mark it + * as deferred so that no further attempt be made to contact it until the + * ripening phase is completed and the host is pulled back into the pool. + */ +static void +guess_defer_host(void *val, void *data) +{ + guess_t *gq = val; + const gnet_host_t *host = data; + const gnet_host_t *hkey; + + guess_check(gq); + + if (hset_contains(gq->deferred, host)) + return; /* Host already deferred */ + + hkey = hash_list_remove(gq->pool, host); + if (NULL == hkey) + return; /* Host not in pool (may have been queried already) */ + + if (GNET_PROPERTY(guess_client_debug) > 4) { + g_debug("GUESS QUERY%s also deferring %s", + nid_to_string(&gq->gid), gnet_host_to_string(hkey)); + } + + hset_insert(gq->deferred, hkey); /* Moves atom to the deferred set */ +} + +/** + * Defer processing of host until the earliest re-contact time so that we + * do not keep needlessly looping over it in the pool. + * + * The host atom is moved to the "deferred" set in the query without taking + * an extra reference, hence it must be removed from the pool without freeing. + * + * @param gq the GUESS query + * @param host the host to defer (atom) + * @param earliest the earliest re-contact time for the host + */ +static void +guess_defer(guess_t *gq, const gnet_host_t *host, time_t earliest) +{ + time_t expire; + + guess_check(gq); + g_assert(atom_is_host(host)); + + /* + * If the host was already listed in the ripening table and expiring + * before the earliest retry time, we need to remove the host, but + * without triggering the normal free routine which would process + * the item and re-insert the host into the queries... + */ + + expire = ripening_time(guess_deferred, host); + + if (expire != 0 && expire < earliest) + ripening_remove_using(guess_deferred, host, gnet_host_free_atom2); + + if (0 == expire || expire < earliest) { + time_delta_t delay = delta_time(earliest, tm_time()); + delay = MIN(delay, GUESS_TIMEOUT_DELAY); /* Set upper boundary */ + delay = MAX(delay, 0); + + ripening_insert(guess_deferred, delay, + atom_host_get(host), int_to_pointer(1)); + + if (GNET_PROPERTY(guess_client_debug) > 3) { + g_debug("GUESS deferring %s for next %s", + gnet_host_to_string(host), short_time_ascii(delay)); + } + } else { + if (GNET_PROPERTY(guess_client_debug) > 5) { + g_debug("GUESS already deferred %s for next %s", + gnet_host_to_string(host), + short_time_ascii(delta_time(expire, tm_time()))); + } + } + + if (GNET_PROPERTY(guess_client_debug) > 4) { + g_debug("GUESS QUERY%s deferring %s", + nid_to_string(&gq->gid), gnet_host_to_string(host)); + } + + g_assert(!hset_contains(gq->deferred, host)); + + hset_insert(gq->deferred, host); /* Transfering the atom */ + + /* + * Now defer the host into all the other queries as well. + * Because we've just inserted the host into the "deferred" set, + * we will skip that query in our processing, as well as any other + * query where the host happens to not be in the pool any more. + */ + + hevset_foreach(gqueries, guess_defer_host, deconstify_pointer(host)); +} + +/** + * Is GUESS querying allowed for the given search protocol? + * + * @param g2 if TRUE, querying using the G2 protocol + */ +static bool +guess_enabled(bool g2) +{ + if (g2) { + if (!GNET_PROPERTY(enable_g2)) + return FALSE; + } else { + if (!GNET_PROPERTY(enable_guess)) + return FALSE; + } + + return TRUE; +} + +/** + * Append host to the GUESS pool or to the deferred set, depending on whether + * the host is known to be already deferred / timeouting. + * + * @param gq the running GUESS query + * @param host the host to add + * @param qk if non-NULL, the known persisted query key information + * + * @return TRUE if host was added to the query (either in the pool or the + * deferred set), FALSE if it was already present. + */ +static bool +guess_add_pool_qk(guess_t *gq, const gnet_host_t *host, const struct qkdata *qk) +{ + if (qk != NULL) { + if (!guess_enabled(qk->flags & GUESS_F_G2)) + return FALSE; + } + + if ( + !hset_contains(gq->queried, host) && + !hash_list_contains(gq->pool, host) && + !hset_contains(gq->deferred, host) + ) { + time_t expire = ripening_time(guess_deferred, host); + + /* + * If host is already known to be deferred, place it directly + * into the deferred set. + * + * Otherwise, if it cannot be contacted immediately, defer it. + */ + + if (expire != 0) { + if (GNET_PROPERTY(guess_client_debug) > 3) { + g_debug("GUESS QUERY%s deferring ripening %s (mature in %s)", + nid_to_string(&gq->gid), gnet_host_to_string(host), + short_time_ascii(delta_time(expire, tm_time()))); + } + hset_insert(gq->deferred, atom_host_get(host)); + } else { + time_t earliest; + + if (qk != NULL) + earliest = guess_earliest_contact_time_qk(qk); + else + earliest = guess_earliest_contact_time(host); + + if (earliest != 0) { + if (GNET_PROPERTY(guess_client_debug) > 3) { + g_debug("GUESS QUERY%s deferring %s (contact-able in %s)", + nid_to_string(&gq->gid), gnet_host_to_string(host), + short_time_ascii(delta_time(earliest, tm_time()))); + } + guess_defer(gq, atom_host_get(host), earliest); + } else { + if (GNET_PROPERTY(guess_client_debug) > 3) { + g_debug("GUESS QUERY%s adding %s to pool", + nid_to_string(&gq->gid), gnet_host_to_string(host)); + } + hash_list_append(gq->pool, atom_host_get(host)); + } + } + + return TRUE; + } + + return FALSE; +} + +/** + * Append host to the GUESS pool or to the deferred set, depending on whether + * the host is known to be already deferred / timeouting. + * + * @param gq the running GUESS query + * @param host the host to add + * + * @return TRUE if host was added to the query (either in the pool or the + * deferred set), FALSE if it was already present. + */ +static bool +guess_add_pool(guess_t *gq, const gnet_host_t *host) +{ + return guess_add_pool_qk(gq, host, NULL); +} + +/** * Add host to the GUESS query pool if not alreay present or queried. + * + * @param gq the running GUESS query + * @param addr the address of the host to add + * @param port the port of the host to add + * @param g2 if TRUE, this is a G2 host */ static void -guess_add_pool(guess_t *gq, host_addr_t addr, guint16 port) +guess_add_host(guess_t *gq, host_addr_t addr, uint16 port, bool g2) { gnet_host_t host; guess_check(gq); - if (hostiles_check(addr) || !host_address_is_usable(addr)) + if (!guess_enabled(g2)) + return; + + if (hostiles_is_bad(addr) || !host_is_valid(addr, port)) return; if (is_my_address_and_port(addr, port)) return; gnet_host_set(&host, addr, port); - if ( - !map_contains(gq->queried, &host) && - !hash_list_contains(gq->pool, &host) && - !guess_should_skip(&host) - ) { - if (GNET_PROPERTY(guess_client_debug) > 3) { - g_debug("GUESS QUERY%s added new host %s to pool", - nid_to_string(&gq->gid), gnet_host_to_string(&host)); - } - hash_list_append(gq->pool, atom_host_get(&host)); - } + if (g2) + guess_record_g2(&host); + + guess_add_pool(gq, &host); } /** @@ -1047,13 +1773,13 @@ guess_entry_still_alive(const struct qkdata *qk) { double p; - static gboolean inited; + static bool inited; static double decimationGUESS_MAX_TIMEOUTS; if G_UNLIKELY(!inited) { size_t i; - for (i = 0; i < G_N_ELEMENTS(decimation); i++) { + for (i = 0; i < N_ITEMS(decimation); i++) { decimationi = pow(GUESS_ALIVE_DECIMATION, (double) (i + 1)); } @@ -1079,7 +1805,7 @@ ) { return p; } else { - size_t i = MIN(qk->timeouts, G_N_ELEMENTS(decimation)) - 1; + size_t i = MIN(qk->timeouts, N_ITEMS(decimation)) - 1; return p * decimationi; } } @@ -1092,7 +1818,7 @@ guess_remove_link_cache(const gnet_host_t *h) { gnet_host_t *atom; - struct qkdata *qk; + const struct qkdata *qk; if G_UNLIKELY(NULL == db_qkdata) return; /* GUESS layer shut down */ @@ -1121,6 +1847,7 @@ g_info("GUESS removed %s from link cache", gnet_host_to_string(h)); } atom_host_free(atom); + gnet_stats_dec_general(GNR_GUESS_LINK_CACHE); guess_discovery_enable(); } } @@ -1131,29 +1858,35 @@ * @param h the host to which this query key applies * @param buf buffer holding the query key * @param len buffer length + * @param g2 whether host speaks G2 */ static void -guess_record_qk(const gnet_host_t *h, const void *buf, size_t len) +guess_record_qk(const gnet_host_t *h, const void *buf, size_t len, bool g2) { - struct qkdata *qk; + const struct qkdata *qk; struct qkdata new_qk; qk = get_qkdata(h); + ZERO(&new_qk); if (qk != NULL) { - new_qk.first_seen = qk->first_seen; - new_qk.flags = qk->flags; + new_qk = *qk; /* Struct copy */ } else { new_qk.first_seen = tm_time(); - new_qk.flags = 0; + + if (g2) { + new_qk.flags = GUESS_F_G2; + guess_g2_hosts++; + gnet_stats_inc_general(GNR_GUESS_CACHED_G2_HOSTS_HELD); + } } new_qk.last_seen = new_qk.last_update = tm_time(); - new_qk.length = MIN(len, MAX_INT_VAL(guint8)); + new_qk.length = MIN(len, MAX_INT_VAL(uint8)); new_qk.query_key = new_qk.length ? wcopy(buf, new_qk.length) : NULL; if (!dbmw_exists(db_qkdata, h)) - gnet_stats_count_general(GNR_GUESS_CACHED_QUERY_KEYS_HELD, +1); + gnet_stats_inc_general(GNR_GUESS_CACHED_QUERY_KEYS_HELD); /* * Writing a new value for the key will free up any dynamically allocated @@ -1163,8 +1896,8 @@ dbmw_write(db_qkdata, h, &new_qk, sizeof new_qk); if (GNET_PROPERTY(guess_client_debug) > 4) { - g_debug("GUESS got %u-byte query key from %s", - new_qk.length, gnet_host_to_string(h)); + g_debug("GUESS got %u-byte query key from %s%s", + new_qk.length, g2 ? "G2 " : "", gnet_host_to_string(h)); } /* @@ -1178,13 +1911,13 @@ /** * Extract query key from received Pong and cache it. * - * @param n the node replying and holind the Pong + * @param n the node replying and holding the Pong * @param h the host to which the Ping was sent * * @return TRUE if we successfully extracted the query key */ -static gboolean -guess_extract_qk(const struct gnutella_node *n, const gnet_host_t *h) +static bool +guess_extract_qk(const gnutella_node_t *n, const gnet_host_t *h) { int i; @@ -1197,7 +1930,7 @@ switch (e->ext_token) { case EXT_T_GGEP_QK: - guess_record_qk(h, ext_payload(e), ext_paylen(e)); + guess_record_qk(h, ext_payload(e), ext_paylen(e), FALSE); return TRUE; default: break; @@ -1208,10 +1941,36 @@ } /** + * Extract query key from received /QKA and cache it. + * + * @param t the reponse we got + * @param h the host to which the /QKR was sent + * + * @return TRUE if we successfully extracted the query key. + */ +static bool +guess_extract_g2_qk(const g2_tree_t *t, const gnet_host_t *h) +{ + const void *payload; + size_t paylen; + + g_assert(h != NULL); + + payload = g2_tree_payload(t, "/QKA/QK", &paylen); + if (payload != NULL) { + guess_record_qk(h, payload, paylen, TRUE); + guess_cache_add(&guess_g2_cache, h); + return TRUE; + } + + return FALSE; +} + +/** * Extract address from received Pong. */ static host_addr_t -guess_extract_host_addr(const struct gnutella_node *n) +guess_extract_host_addr(const gnutella_node_t *n) { int i; host_addr_t ipv4_addr; @@ -1262,8 +2021,7 @@ * @param h the host to whom we sent the message that got us a pong back */ static void -guess_extract_ipp(guess_t *gq, - const struct gnutella_node *n, const gnet_host_t *h) +guess_extract_ipp(guess_t *gq, const gnutella_node_t *n, const gnet_host_t *h) { int j; @@ -1292,7 +2050,7 @@ for (i = 0; i < cnt; i++) { host_addr_t addr; - guint16 port; + uint16 port; addr = host_addr_peek_ipv4(&payloadi * 6); port = peek_le16(&payloadi * 6 + 4); @@ -1305,7 +2063,7 @@ guess_discovered_host(addr, port); if (gq != NULL) { - guess_add_pool(gq, addr, port); + guess_add_host(gq, addr, port, FALSE); } } } @@ -1317,18 +2075,600 @@ } /** - * Process query key reply from host. + * Add G2 host to the query key cache by requesting the query key if we have + * none for it already. + */ +static void +guess_g2_add_qkcache(const host_addr_t addr, uint16 port) +{ + gnet_host_t h; + + gnet_host_set(&h, addr, port); + if ( + !guess_has_valid_qk(&h) && + !hostiles_is_bad(addr) && + host_is_valid(addr, port) + ) + guess_request_qk(&h, TRUE, TRUE); +} + +enum g2_qa_child { + G2_QA_RA = 1, + G2_QA_D, + G2_QA_S, +}; + +static const tokenizer_t g2_qa_children = { + /* Sorted array */ + { "D", G2_QA_D }, + { "RA", G2_QA_RA }, + { "S", G2_QA_S }, +}; + +/** + * Extract the time held in the "TS" child from the message. + * + * @return the timestamp present in the message, 0 if none. + */ +static time_t +guess_extract_g2_ts(const g2_tree_t *t) +{ + const g2_tree_t *c; + + c = g2_tree_lookup(t, "TS"); + + if (c != NULL) { + const void *payload; + size_t paylen; + + payload = g2_tree_node_payload(c, &paylen); + return vlint_decode(payload, paylen); + } + + return 0; +} + +/** + * Mark reached host as queried. + */ +static void +guess_record_reached(guess_t *gq, const gnet_host_t *host) +{ + g_assert(atom_is_host(host)); + + if (!hset_contains(gq->queried, host)) { + hset_insert(gq->queried, host); + gq->query_reached++; /* Another host reached */ + } else { + /* Strange, was in pool/deferred AND in queried set! */ + if (GNET_PROPERTY(guess_client_debug)) { + g_warning("GUESS QUERY%s %s(): host %s was already queried", + nid_to_string(&gq->gid), G_STRFUNC, gnet_host_to_string(host)); + } + atom_host_free(host); + } +} + +/** + * Handle /QA response from a queried host (G2). + * + * @param gq the GUESS query being run (NULL if RPC expired) + * @param host the queried host, replying + * @param t the /QA response to analyze + */ +static void +guess_handle_qa(guess_t *gq, const gnet_host_t *host, const g2_tree_t *t) +{ + const g2_tree_t *c; + struct qkdata *qk = NULL; + + /* + * We can get called when we get a /QA long after the GUESS RPC has expired + * to parse the list of hosts and update the retry-after address, if any. + * Hence we do not use guess_check() here. + */ + + g_assert(NULL == gq || GUESS_MAGIC == gq->magic); + + /* + * Handle all the interesting children of /QA. + */ + + G2_TREE_CHILD_FOREACH(t, c) { + const char *payload; + size_t paylen; + enum g2_qa_child ct = TOKENIZE(g2_tree_name(c), g2_qa_children); + + switch (ct) { + case G2_QA_RA: + /* + * If there is a /QA/RA, parse it to set the "retry after" time for + * the host. It can be a 16-bit or 32-bit delay. + */ + + payload = g2_tree_node_payload(c, &paylen); + if (payload != NULL) { + uint32 ra = 0; + + if (2 == paylen) + ra = peek_le16(payload); + else if (4 == paylen) + ra = peek_le32(payload); + + /* + * Cap the retry-after timeout to GUESS_TIMEOUT_DELAY, in + * case we're parsing garbage data. + */ + + if (ra > GUESS_TIMEOUT_DELAY) { + if (GNET_PROPERTY(guess_client_debug)) { + g_warning("GUESS QUERY%s G2 %s requests " + "%u sec%s querying delay, capping to %d", + NULL == gq ? "?" : nid_to_string(&gq->gid), + gnet_host_to_string(host), ra, plural(ra), + GUESS_TIMEOUT_DELAY); + } + ra = GUESS_TIMEOUT_DELAY; + } + + if (ra != 0) { + qk = get_qkdata(host); + + if (qk != NULL) { + time_t now = tm_time(); + time_t ts = guess_extract_g2_ts(t); + + /* + * It is important to use the remote side timestamp, + * the one used at the generation of the /QA message, + * because it can have taken a while to receive the + * message and the retry time runs starting at the + * /QA generation time, not at the reception time. + * + * To protect against the remote clock being completely + * off, we set an upper bound to the remote time: our + * current time. + */ + + if (0 == ts) + ts = now; + qk->retry_after = MIN(ts, now) + ra; + } + + if (GNET_PROPERTY(guess_client_debug)) { + g_debug("GUESS QUERY%s G2 %s requests " + "%u sec%s querying delay (%s)", + NULL == gq ? "?" : nid_to_string(&gq->gid), + gnet_host_to_string(host), ra, plural(ra), + qk != NULL ? timestamp_to_string(qk->retry_after) : + "not held in cache"); + } + } + } + break; + + case G2_QA_D: + /* + * A done hub. + * The payload contains an IP:port followed by a 16-bit leaf count. + */ + + payload = g2_tree_node_payload(c, &paylen); + if (payload != NULL) { + + /* + * Only handle IPv4 since G2 does not support IPv6. + */ + + if (8 == paylen) { /* IPv4 + port + leaf count */ + host_addr_t addr = host_addr_peek_ipv4(payload); + uint16 port = peek_le16(&payload4); + uint16 lc = peek_le16(&payload6); + gnet_host_t h; + const gnet_host_t *hp; + + /* + * The host is reported as queried by the remote hub, hence + * it's most probably a valid address. Therefore, we add + * it to the hub cache. + * + * Then we make sure the host is marked as "queried" and + * is removed from the pool (in case it was already known) + * to make sure it will not be recontacted again for that + * query. + */ + + hcache_add_caught(HOST_G2HUB, addr, port, "/QA/D address"); + gnet_host_set(&h, addr, port); + + if (GNET_PROPERTY(guess_client_debug) > 9) { + g_debug("GUESS QUERY%s " + "G2 %s queried (%u lea%s) via %s", + NULL == gq ? "?" : nid_to_string(&gq->gid), + host_addr_port_to_string(addr, port), + lc, plural_f(lc), gnet_host_to_string(host)); + } + + if (NULL == gq) { + /* The RPC has expired, just collecting the G2 host */ + guess_g2_add_qkcache(addr, port); + break; + } + + /* + * Since G2 queries are forwarded by the receiving hub to + * its neighbouring hubs, we need to account for reached + * hosts separately from the amount of hosts acknowledging + * the query. + */ + + if (NULL != (hp = hash_list_remove(gq->pool, &h))) { + guess_record_reached(gq, hp); + } else if (NULL != (hp = hset_lookup(gq->deferred, &h))) { + hset_remove(gq->deferred, &h); + guess_record_reached(gq, hp); + } else if (!hset_contains(gq->queried, &h)) { + hset_insert(gq->queried, atom_host_get(&h)); + gq->query_reached++; /* Another host reached */ + } else { + if (GNET_PROPERTY(guess_client_debug)) { + g_message("GUESS QUERY%s " + "G2 %s had already been queried", + nid_to_string(&gq->gid), + host_addr_port_to_string(addr, port)); + } + } + } + } + break; + + case G2_QA_S: + /* + * A searchable hub given back by the queried hub. + * The payload contains an IP:port optionally followed by a 32-bit + * timestamp. + */ + + payload = g2_tree_node_payload(c, &paylen); + if (payload != NULL) { + /* + * Only handle IPv4 since G2 does not support IPv6. + */ + + if (6 == paylen || 10 == paylen) { /* IPv4 + port (+stamp) */ + host_addr_t addr = host_addr_peek_ipv4(payload); + uint16 port = peek_le16(&payload4); + + if (NULL == gq) { + /* The RPC has expired, just collecting the G2 host */ + guess_g2_add_qkcache(addr, port); + } else { + guess_add_host(gq, addr, port, TRUE); + } + } + } + break; + } + } + + /* + * Check whether we need to remove the host from the ripening table or + * whether we can adjust the ripening time. + */ + + if (NULL == qk || delta_time(tm_time(), qk->retry_after) >= 0) { + /* + * Since we got an acknowledgment from the host, we can immediately + * re-issue another RPC to it since it did not have a retry-after or + * the retry-after time is in the past. + */ + + ripening_remove(guess_deferred, host); + } else { + time_t expire; + + /* + * Check whether ripening is occurring before the retry time, and + * if it does, adjust ripening so that we do not put back the host + * too early in the query pools. + */ + + expire = ripening_time(guess_deferred, host); + + if (expire != 0 && expire < qk->retry_after) { + time_delta_t delay = delta_time(qk->retry_after, tm_time()); + + g_assert(delay > 0); + + ripening_remove_using(guess_deferred, host, gnet_host_free_atom2); + ripening_insert(guess_deferred, delay, + atom_host_get(host), int_to_pointer(1)); + + if (GNET_PROPERTY(guess_client_debug)) { + g_message("GUESS deferring %s again for next %s (adding %s)", + gnet_host_to_string(host), short_time_ascii(delay), + compact_time(delta_time(qk->retry_after, expire))); + } + } + } +} + +/** + * Invoked when we get a late /QA reply from the network. + * + * @param n the G2 node replying + * @param t the message tree + * @param muid the validated MUID of the messsage, NULL if not computed yet + * + * @return TRUE if we were able to handle the /QA somehow. + */ +bool +guess_late_qa(const gnutella_node_t *n, const g2_tree_t *t, const guid_t *muid) +{ + gnet_host_t host; + guess_t *gq; + bool very_late = NULL == muid && NODE_IS_UDP(n); + + g_assert(NODE_TALKS_G2(n)); + g_assert(G2_MSG_QA == g2_msg_name_type(g2_tree_name(t))); + + /* + * Fetch the MUID of the /QA message, if not already done by caller. + */ + + if (NULL == muid) { + size_t paylen; + const void *payload = g2_tree_node_payload(t, &paylen); + + if (NULL == payload || paylen != GUID_RAW_SIZE) { + if (GNET_PROPERTY(guess_client_debug)) { + g_warning("GUESS got garbled /%s reply from %s: %s MUID", + g2_tree_name(t), node_infostr(n), + NULL == payload ? "no" : "invalid"); + } + return FALSE; + } + + muid = payload; + } + + /* + * With G2, some hosts can reply almost 15 minutes AFTER the request + * was sent! Naturally, the GUESS RPC record has already expired, + * because we need to issue our RPCs quickly and an unresponsive host + * needs to be skipped or it would slow down GUESS too much. + * + * We're going to parse the /QA nonethless to collect G2 hub addresses + * for other queries. Since the RPC has expired, we use the MUID to + * find the GUESS query, but can pass NULL if it's not found. + * + * Note from 2014-02-28: the late /QA were actually caused by a parsing + * problem in Shareaza <= 2.7.1.0 whereby our /Q2/I extension was causing + * a dreadful parsing loop, delaying the reply. Now that we emit a nicer + * /Q2/I for RAZA nodes, the /QA flow back instantly, but I'm leaving the + * late /QA processing code in place, just in case. + */ + + gq = hikset_lookup(gmuid, muid); /* Can be NULL, it's OK */ + + if (GNET_PROPERTY(guess_client_debug)) { + g_warning("GUESS QUERY%s got %s%s/%s reply #%s from %s", + NULL == gq ? "?" : nid_to_string(&gq->gid), + very_late ? "very " : "", NODE_IS_UDP(n) ? "late " : "", + g2_tree_name(t), guid_hex_str(muid), + host_addr_port_to_string(n->addr, n->port)); + } + + gnet_host_set(&host, n->addr, n->port); + guess_traffic_from(&host, GUESS_F_G2); + if (gq != NULL) { + gq->query_acks++; + gq->query_reached++; + gnet_stats_inc_general(GNR_GUESS_G2_ACKNOWLEDGED); + } + + guess_handle_qa(gq, &host, t); + return TRUE; +} + +/** + * Handle possible GUESS RPC reply on G2 for our /Q2 messages. + */ +static void +guess_g2_rpc_handle(const gnutella_node_t *n, const g2_tree_t *t, void *unused) +{ + struct guess_rpc_key key; + struct guess_rpc *grp; + guess_t *gq; + enum g2_msg type; + const void *payload; + size_t paylen; + + (void) unused; + + if (NULL == n) + return; /* Timeout, ignore */ + + g_assert(NODE_TALKS_G2(n)); + + type = g2_msg_name_type(g2_tree_name(t)); + + /* + * If we got a /QKA, there is no MUID and we cannot fetch the pending RPC. + * It means our query key was invalid, so update it. + * + * Unfortunately, we cannot tie that response to a query because of the + * crippled RPC protocol on G2: we do not know the MUID of the query we + * sent, and even if we asked for an extra parameter here to get at the + * GUESS RPC structure for this message, we would face a race condition + * if the GUESS RPC has timed out and this G2 RPC has not yet, making + * usage of the GUESS RPC handle impossible. + * + * The G2 protocol should be fixed to have /QKA bear the MUID of the + * faulty query so that we can patch things up... + * --RAM, 2014-01-27 + */ + + if (G2_MSG_QKA == type) { + gnet_host_t host; + + if (GNET_PROPERTY(guess_client_debug)) { + /* Check payload, in case the G2 protocol is fixed one day --RAM */ + payload = g2_tree_node_payload(t, &paylen); + + g_message("GUESS got indication of invalid query key from %s%s", + node_infostr(n), + payload != NULL && GUID_RAW_SIZE == paylen ? + " (/QKA bears MUID, that's GOOD!)" : ""); + } + + payload = g2_tree_payload(t, "/QKA/QK", &paylen); + if (NULL == payload) { + if (GNET_PROPERTY(guess_client_debug)) { + g_warning("GUESS %s did not send proper /QKA (missing QK)", + node_infostr(n)); + } + } else { + gnet_host_set(&host, n->addr, n->port); + guess_record_qk(&host, payload, paylen, TRUE); + } + + return; /* Cannot retry, we do not know the GUESS query */ + } + + if (G2_MSG_QA != type) { + if (GNET_PROPERTY(guess_client_debug)) { + g_warning("GUESS got unexpected /%s reply from %s", + g2_tree_name(t), host_addr_port_to_string(n->addr, n->port)); + } + return; + } + + /* + * We got a /QA, so we have the MUID to be able to link that reply to + * the GUESS RPC we issued. + */ + + payload = g2_tree_node_payload(t, &paylen); + + if (NULL == payload || paylen != GUID_RAW_SIZE) { + if (GNET_PROPERTY(guess_client_debug)) { + g_warning("GUESS got garbled /%s reply from %s: %s MUID", + g2_tree_name(t), node_infostr(n), + NULL == payload ? "no" : "invalid"); + } + return; + } + + key.muid = payload; + key.addr = n->addr; + grp = htable_lookup(pending, &key); + + /* + * If the GUESS RPC has expired, deal with the /QA as a late arrival. + */ + + if (NULL == grp) { + guess_late_qa(n, t, key.muid); + return; + } + + guess_rpc_check(grp); + + gq = guess_is_alive(grp->gid); + if (gq != NULL) { + /* + * If we get a reply, the message must have been sent, otherwise this + * is an improbable collision (or a local bookkeeping bug). + */ + + if (grp->pmi != NULL) { + if (GNET_PROPERTY(guess_client_debug)) { + g_warning("GUESS QUERY%s got RPC reply for #%s from %s " + "but message to %s still unsent?", + nid_to_string(&gq->gid), guid_hex_str(key.muid), + node_infostr(n), gnet_host_to_string(grp->pmi->host)); + } + return; /* Don't handle message */ + } + + /* + * To avoid losing the already built tree message, yet not have a + * dedicated G2 callback, we insert the tree in the RPC descriptor. + * This is a small hack that lets us keep most of the Gnutella GUESS + * plumbing code... + */ + + grp->t = t; + (*grp->cb)(grp, n, gq); /* Got a reply */ + } + + guess_rpc_free(grp); + return; +} + +/** + * Process query key reply from host (G2). * * @param type type of reply, if any * @param n gnutella node replying (NULL if no reply) + * @param t parsed message tree (NULL if no reply) + * @param data user-supplied callback data + */ +static void +guess_qk_g2_reply(enum udp_ping_ret type, + const gnutella_node_t *n, const g2_tree_t *t, void *data) +{ + gnet_host_t *h = data; + + g_assert(NULL == n || NODE_TALKS_G2(n)); + g_assert(atom_is_host(h)); + + switch (type) { + case UDP_PING_TIMEDOUT: + if (GNET_PROPERTY(guess_client_debug) > 3) { + g_info("GUESS /QKR timeout for G2 %s", gnet_host_to_string(h)); + } + + guess_timeout_from(h); + break; + + case UDP_PING_REPLY: + if G_UNLIKELY(NULL == link_cache) + break; /* GUESS layer was shutdown */ + + guess_traffic_from(h, GUESS_F_G2); + guess_extract_g2_qk(t, h); + break; + + case UDP_PING_EXPIRED: + g_assert_not_reached(); + } + + if G_LIKELY(guess_qk_reqs != NULL) + aging_remove(guess_qk_reqs, h); + + atom_host_free(h); +} + +/** + * Process query key reply from host (Gnutella). + * + * @param type type of reply, if any + * @param n gnutella node replying (NULL if no reply) + * @param t always NULL * @param data user-supplied callback data */ static void guess_qk_reply(enum udp_ping_ret type, - const struct gnutella_node *n, void *data) + const gnutella_node_t *n, const g2_tree_t *t, void *data) { gnet_host_t *h = data; + g_assert(NULL == t); + g_assert(NULL == n || !NODE_TALKS_G2(n)); + g_assert(atom_is_host(h)); + /* * This routine must be prepared to get invoked well after the GUESS * layer was shutdown (due to previous UDP pings expiring). @@ -1343,11 +2683,8 @@ g_info("GUESS ping timeout for %s", gnet_host_to_string(h)); } - if G_LIKELY(guess_qk_reqs != NULL) { - guess_remove_link_cache(h); - guess_timeout_from(h); - aging_remove(guess_qk_reqs, h); - } + guess_remove_link_cache(h); + guess_timeout_from(h); /* FALL THROUGH */ @@ -1360,6 +2697,8 @@ g_debug("GUESS done waiting for replies from %s", gnet_host_to_string(h)); } + if G_LIKELY(guess_qk_reqs != NULL) + aging_remove(guess_qk_reqs, h); atom_host_free(h); break; @@ -1367,7 +2706,7 @@ if G_UNLIKELY(NULL == link_cache) break; - guess_traffic_from(h); + guess_traffic_from(h, 0); if (guess_extract_qk(n, h)) { /* * Only the Pong for the host we queried should contain the @@ -1377,7 +2716,7 @@ guess_add_link_cache(h, 100); /* Add with 100% chance */ } else { - guint16 port = peek_le16(&n->data0); + uint16 port = peek_le16(&n->data0); host_addr_t addr = guess_extract_host_addr(n); @@ -1400,23 +2739,67 @@ } /** + * Query key RPC dispatch trampoline for Gnutella requests. + */ +static void +guess_rpc_reply(enum udp_ping_ret type, const gnutella_node_t *n, void *arg) +{ + struct guess_qk_rpc *ctx = arg; + + g_assert(NULL == n || !NODE_TALKS_G2(n)); + guess_qk_rpc_check(ctx); + + (*ctx->cb)(type, n, NULL, ctx->arg); + + /* + * Last response we'll get: UDP_PING_EXPIRED to signify that no more + * responses are expected, UDP_PING_TIMEDOUT if we did not get anything + * back at all. + */ + + if (UDP_PING_EXPIRED == type || UDP_PING_TIMEDOUT == type) + guess_qk_rpc_free(ctx); +} + +/** + * Query key RPC dispatch trampoline for G2 requests. + */ +static void +guess_g2_rpc_reply(const gnutella_node_t *n, const g2_tree_t *t, void *arg) +{ + struct guess_qk_rpc *ctx = arg; + + g_assert(NULL == n || NODE_TALKS_G2(n)); + guess_qk_rpc_check(ctx); + + if (NULL == n) { + (*ctx->cb)(UDP_PING_TIMEDOUT, n, t, ctx->arg); + } else { + (*ctx->cb)(UDP_PING_REPLY, n, t, ctx->arg); + } + + guess_qk_rpc_free(ctx); +} + +/** * Request query key from host, with callback. * * @param gq the GUESS query (optional, for b/w accounting only) * @param host host to query * @param intro if TRUE, send "introduction" ping information as well + * @param g2 if TRUE, use the G2 protocol when talking to host * @param cb callback to invoke on Pong reception or timeout * @param arg additional callback argument * * @return TRUE on success. */ -static gboolean -guess_request_qk_full(guess_t *gq, const gnet_host_t *host, gboolean intro, - udp_ping_cb_t cb, void *arg) -{ - guint32 size; - gnutella_msg_init_t *m; - gboolean sent; +static bool +guess_request_qk_full(guess_t *gq, const gnet_host_t *host, bool intro, bool g2, + guess_qk_cb_t cb, void *arg) +{ + uint32 size; + bool sent; + struct guess_qk_rpc *ctx; /* * Refuse to send too frequent pings to a given host. @@ -1424,24 +2807,51 @@ if (aging_lookup(guess_qk_reqs, host)) { if (GNET_PROPERTY(guess_client_debug) > 4) { - g_debug("GUESS throttling query key request to %s", - gnet_host_to_string(host)); + g_debug("GUESS throttling query key request to %s%s", + g2 ? "G2 " : "", gnet_host_to_string(host)); } return FALSE; } /* + * Allocate the context to allow proper wrapping of the RPC, + */ + + WALLOC0(ctx); + ctx->magic = GUESS_QK_RPC_MAGIC; + ctx->cb = cb; + ctx->arg = arg; + + /* * Build and attempt to send message. */ - m = build_guess_ping_msg(NULL, TRUE, intro, FALSE, &size); + if (g2) { + pmsg_t *mb; + + mb = g2_build_qkr(); + size = pmsg_size(mb); + + sent = g2_rpc_launch(host, mb, + guess_g2_rpc_reply, ctx, GUESS_QK_TIMEOUT); - sent = udp_send_ping_callback(m, size, - gnet_host_get_addr(host), gnet_host_get_port(host), cb, arg, TRUE); + if (!sent) + pmsg_free(mb); + } else { + gnutella_msg_init_t *m; + + m = build_guess_ping_msg(NULL, TRUE, intro, FALSE, &size); + + sent = udp_send_ping_callback(m, size, + gnet_host_get_addr(host), gnet_host_get_port(host), + guess_rpc_reply, ctx, TRUE); + } if (GNET_PROPERTY(guess_client_debug) > 4) { - g_debug("GUESS requesting query key from %s%s", - gnet_host_to_string(host), sent ? "" : " (FAILED)"); + g_debug("GUESS requesting query key from %s%s%s, callback is %s()", + g2 ? "G2 " : "", + gnet_host_to_string(host), sent ? "" : " (FAILED)", + stacktrace_function_name(cb)); } if (sent) { @@ -1451,6 +2861,8 @@ gq->bw_out_qk += size; /* Estimated, UDP queue could drop it! */ guess_out_bw += size; } + } else { + guess_qk_rpc_free(ctx); } return sent; @@ -1461,19 +2873,20 @@ * * @param host host to query * @param intro if TRUE, send "introduction" ping information as well + * @param g2 whether the host is a G2 one * * @return TRUE on success. */ -static gboolean -guess_request_qk(const gnet_host_t *host, gboolean intro) +static bool +guess_request_qk(const gnet_host_t *host, bool intro, bool g2) { const gnet_host_t *h; - gboolean sent; + bool sent; h = atom_host_get(host); - sent = guess_request_qk_full(NULL, host, intro, - guess_qk_reply, deconstify_gpointer(h)); + sent = guess_request_qk_full(NULL, host, intro, g2, + g2 ? guess_qk_g2_reply : guess_qk_reply, deconstify_pointer(h)); if (!sent) atom_host_free(h); @@ -1482,18 +2895,69 @@ } /** + * Given a query key update time, is the query key still valid? + */ +static bool +guess_key_still_valid(time_t last_update) +{ + if (delta_time(last_update, guess_qk_threshtime) < 0) + return FALSE; /* Key invalidated by IP address change */ + + return delta_time(tm_time(), last_update) <= GUESS_QK_LIFE; +} + +/** + * Is query key valid (present, not expired)? + * + * @return TRUE if we have a valid query key for the host. + */ +static bool +guess_has_valid_qk(const gnet_host_t *host) +{ + const struct qkdata *qk = get_qkdata(host); + + if (NULL == qk) + return FALSE; + + if (0 == qk->length) + return FALSE; + + return guess_key_still_valid(qk->last_update); +} + +/** * Callback invoked when a new host is available in the cache. */ static wq_status_t guess_host_added(void *u_data, void *hostinfo) { struct hcache_new_host *nhost = hostinfo; + bool g2 = FALSE; (void) u_data; + /* + * G2 hosts are not part of the "link cache" but if we get informed + * about new G2 hosts whilst we're trying to fill the link cache, we + * ask them for a query key and cache them for later use. + */ + switch (nhost->type) { + case HCACHE_FRESH_G2HUB: + case HCACHE_VALID_G2HUB: + if (!settings_use_ipv4()) + return WQ_SLEEP; + g2 = TRUE; + break; case HCACHE_GUESS: case HCACHE_GUESS_INTRO: + if (!settings_use_ipv4()) + return WQ_SLEEP; + break; + case HCACHE_GUESS6: + case HCACHE_GUESS6_INTRO: + if (!settings_use_ipv6()) + return WQ_SLEEP; break; default: return WQ_SLEEP; /* Still waiting for a GUESS host */ @@ -1516,6 +2980,8 @@ { gnet_host_t host; gnet_host_set(&host, nhost->addr, nhost->port); + if (g2) + guess_record_g2(&host); if (hash_list_contains(link_cache, &host) || guess_should_skip(&host)) return WQ_SLEEP; } @@ -1527,16 +2993,28 @@ * Otherwise, probe it to make sure it is alive and get a query key. */ - if (hash_list_length(link_cache) < GUESS_LINK_CACHE_SIZE) { + if (hash_list_length(link_cache) < GUESS_LINK_CACHE_SIZE || g2) { gnet_host_t host; gnet_host_set(&host, nhost->addr, nhost->port); - if (!guess_request_qk(&host, TRUE)) + + /* + * Do not query a discovered G2 host if we have a non-expired query key, + * since there is no notion of "introduction ping" for G2. + */ + + if (g2 && guess_has_valid_qk(&host)) + goto skip_query_key; + + if (!guess_request_qk(&host, TRUE, g2)) return WQ_SLEEP; } +skip_query_key: + if (GNET_PROPERTY(guess_client_debug) > 1) { - g_debug("GUESS discovered host %s", + g_debug("GUESS discovered %shost %s", + g2 ? "G2 " : "", host_addr_port_to_string(nhost->addr, nhost->port)); } @@ -1572,7 +3050,7 @@ */ static void guess_hosts_reply(enum udp_ping_ret type, - const struct gnutella_node *n, void *data) + const gnutella_node_t *n, void *data) { gnet_host_t *h = data; @@ -1586,6 +3064,13 @@ /* * Host did not reply, delete cached entry, if any. */ + + if G_UNLIKELY(NULL == alive_cache) { + /* We're probably coming from udp_close(), expiring old pings */ + atom_host_free(h); + return; /* GUESS layer already shutdown */ + } + guess_remove_link_cache(h); guess_timeout_from(h); @@ -1621,9 +3106,9 @@ if G_UNLIKELY(NULL == link_cache) break; - guess_traffic_from(h); + guess_traffic_from(h, 0); { - guint16 port = peek_le16(&n->data0); + uint16 port = peek_le16(&n->data0); host_addr_t addr = guess_extract_host_addr(n); /* @@ -1638,7 +3123,7 @@ } guess_discovered_host(addr, port); - if (!host_addr_equal(addr, gnet_host_get_addr(h))) { + if (!host_addr_equiv(addr, gnet_host_get_addr(h))) { guess_host_set_flags(h, GUESS_F_OTHER_HOST); } } @@ -1652,21 +3137,21 @@ * * @return TRUE on success. */ -static gboolean -guess_request_hosts(host_addr_t addr, guint16 port) +static bool +guess_request_hosts(host_addr_t addr, uint16 port) { - guint32 size; + uint32 size; gnutella_msg_init_t *m; gnet_host_t host; const gnet_host_t *h; - gboolean sent; + bool sent; m = build_guess_ping_msg(NULL, FALSE, TRUE, TRUE, &size); gnet_host_set(&host, addr, port); h = atom_host_get(&host); sent = udp_send_ping_callback(m, size, addr, port, - guess_hosts_reply, deconstify_gpointer(h), TRUE); + guess_hosts_reply, deconstify_pointer(h), TRUE); if (GNET_PROPERTY(guess_client_debug) > 4) { g_debug("GUESS requesting more hosts from %s%s", @@ -1688,15 +3173,16 @@ * DBMW foreach iterator to remove old entries. * @return TRUE if entry must be deleted. */ -static gboolean +static bool qk_prune_old(void *key, void *value, size_t u_len, void *u_data) { const gnet_host_t *h = key; const struct qkdata *qk = value; time_delta_t d; - gboolean expired, hostile; + bool expired, hostile, g2; unsigned minor; double p; + host_addr_t addr; (void) u_len; (void) u_data; @@ -1711,8 +3197,9 @@ d = delta_time(tm_time(), qk->last_seen); expired = hostile = FALSE; + addr = gnet_host_get_addr(h); - if (hostiles_check(gnet_host_get_addr(h))) { + if (hostiles_is_bad(addr) || hostiles_should_shun(addr)) { hostile = TRUE; p = 0.0; } else if (d <= GUESS_QK_LIFE) { @@ -1725,17 +3212,29 @@ /* * Use this opportunity where we're looping to update the amount - * of GUESS 0.2 hosts present in the cache. + * of GUESS 0.2 and G2 hosts present in the cache. */ - minor = (qk->flags & GUESS_F_PONG_IPP) ? 2 : 1; + minor = (qk->flags & (GUESS_F_PONG_IPP | GUESS_F_G2)) ? 2 : 1; + g2 = booleanize(qk->flags & GUESS_F_G2); - if (!expired && minor > 1) - guess_02_hosts++; + if (minor > 1) { + if (expired) { + guess_cache_remove(g2 ? &guess_g2_cache : &guess_02_cache, h); + } else { + if (g2) { + guess_g2_hosts++; + guess_cache_add(&guess_g2_cache, h); + } else { + guess_02_hosts++; + guess_cache_add(&guess_02_cache, h); + } + } + } if (GNET_PROPERTY(guess_client_debug) > 5) { - g_debug("GUESS QKCACHE node %s v%u life=%s last_seen=%s, p=%.2f%%%s", - gnet_host_to_string(h), minor, + g_debug("GUESS QKCACHE node %s %c%u life=%s last_seen=%s, p=%.2f%%%s", + gnet_host_to_string(h), g2 ? 'g' : 'v', minor, compact_time(delta_time(qk->last_seen, qk->first_seen)), compact_time2(d), p * 100.0, hostile ? " HOSTILE" : expired ? " EXPIRED" : ""); @@ -1756,24 +3255,26 @@ } guess_02_hosts = 0; /* Will be updated by qk_prune_old() */ + guess_g2_hosts = 0; /* Idem */ dbmw_foreach_remove(db_qkdata, qk_prune_old, NULL); gnet_stats_set_general(GNR_GUESS_CACHED_QUERY_KEYS_HELD, dbmw_count(db_qkdata)); gnet_stats_set_general(GNR_GUESS_CACHED_02_HOSTS_HELD, guess_02_hosts); + gnet_stats_set_general(GNR_GUESS_CACHED_G2_HOSTS_HELD, guess_g2_hosts); if (GNET_PROPERTY(guess_client_debug)) { g_debug("GUESS QKCACHE pruned expired query keys (%zu remaining)", dbmw_count(db_qkdata)); } - dbstore_shrink(db_qkdata); + dbstore_compact(db_qkdata); } /** * Callout queue periodic event to expire old entries. */ -static gboolean +static bool guess_qk_periodic_prune(void *unused_obj) { (void) unused_obj; @@ -1791,6 +3292,7 @@ gnet_host_t *h = host; const struct qkdata *qk; time_delta_t d; + bool g2; (void) u_data; @@ -1799,24 +3301,29 @@ return; d = delta_time(tm_time(), qk->last_seen); + g2 = booleanize(qk->flags & GUESS_F_G2); + + if (!guess_can_recontact_qk(qk)) + return; if (d > GUESS_ALIVE_PERIOD) { if (GNET_PROPERTY(guess_client_debug) > 4) { - g_debug("GUESS not heard from %s since %ld seconds, pinging", - gnet_host_to_string(h), (long) d); + g_debug("GUESS not heard from %s%s since %ld seconds, pinging", + g2 ? "G2 " : "", gnet_host_to_string(h), (long) d); } /* * Send an introduction request only 25% of the time. */ - guess_request_qk(h, random_u32() % 100 < 25); - } else if (delta_time(tm_time(), qk->last_update) > GUESS_QK_LIFE) { + guess_request_qk(h, random_value(99) < 25, g2); + + } else if (!guess_key_still_valid(qk->last_update)) { if (GNET_PROPERTY(guess_client_debug) > 4) { - g_debug("GUESS query key for %s expired, pinging", - gnet_host_to_string(h)); + g_debug("GUESS query key for %s%s expired, pinging", + g2 ? "G2 " : "", gnet_host_to_string(h)); } - guess_request_qk(h, FALSE); + guess_request_qk(h, FALSE, g2); } } @@ -1840,7 +3347,7 @@ qk_link_cache(void *key, void *value, size_t len, void *u_data) { const gnet_host_t *h = key; - struct qkdata *qk = value; + const struct qkdata *qk = value; unsigned p; g_assert(len == sizeof *qk); @@ -1858,6 +3365,14 @@ return; /* + * Skip G2 hosts, they are not kept in a link cache because all known G2 + * nodes are usable GUESS hosts (with the G2 protocol). + */ + + if (qk->flags & GUESS_F_G2) + return; + + /* * Favor insertion on hosts in the link cache that are either "connected" * to other GUESS hosts (they return pongs for other hosts) or which * are returning packed hosts in IPP when asked for hosts. @@ -1923,7 +3438,7 @@ while (hash_list_iter_has_next(iter)) { gnet_host_t *host = hash_list_iter_next(iter); - struct qkdata *qk = get_qkdata(host); + const struct qkdata *qk = get_qkdata(host); if ( qk != NULL && @@ -1942,7 +3457,7 @@ /** * Callout queue periodic event to monitor the link cache. */ -static gboolean +static bool guess_periodic_check(void *unused_obj) { (void) unused_obj; @@ -1954,7 +3469,7 @@ /** * Callout queue periodic event to synchronize the persistent DB (full flush). */ -static gboolean +static bool guess_periodic_sync(void *unused_obj) { (void) unused_obj; @@ -1964,76 +3479,148 @@ } /** + * Recompute the GUESS bandwidth target for next period. + */ +static void +guess_periodic_target_update(void) +{ + uint unused; + + guess_target_bw = GNET_PROPERTY(bw_guess_out); + + if (!GNET_PROPERTY(guess_maximize_bw)) + return; + + /* + * If there is more unused bandwidth configured for Gnutella output + * than they configured as a GUESS hint, set the target to that amount + * of unused bandwidth for the next period. + */ + + unused = bsched_unused(BSCHED_BWS_GOUT_UDP) + + bsched_unused(BSCHED_BWS_GOUT); + + /* + * If they are running as leaves, we can maximize the Gnutella traffic. + * Otherwise, reserve 25% for exceptional conditions. + */ + + if (settings_is_ultra()) + unused -= unused / 4; + + guess_target_bw = MAX(unused, guess_target_bw); +} + +/** * Callout queue periodic event to reset bandwidth usage. */ -static gboolean +static bool guess_periodic_bw(void *unused_obj) { (void) unused_obj; - if (guess_out_bw != 0) { - if (GNET_PROPERTY(guess_client_debug) > 2) { - g_debug("GUESS outgoing b/w used: %u bytes", guess_out_bw); - } - if (guess_out_bw <= GNET_PROPERTY(bw_guess_out)) { - guess_out_bw = 0; - } else { - guess_out_bw -= GNET_PROPERTY(bw_guess_out); - } + if (GNET_PROPERTY(guess_client_debug) > 2) { + g_debug("GUESS outgoing b/w used: %u / %u bytes (alpha=%u, active=%zu)", + guess_out_bw, guess_target_bw, guess_alpha, hevset_count(gqueries)); + } - /* - * Wakeup queries waiting for b/w in the order they went to sleep, - * provided we have bandwidth to serve. - */ + /* + * If we did not use the whole bandwidth we have at our disposal, it means + * our concurrency parameter is too low. Increase it, as long as we + * are lower than GUESS_ALPHA_MAX. + * + * Conversely, if we have queries waiting for b/w, then we're querying + * too much so try to reduce the concurrency threshold. + */ - if (guess_out_bw < GNET_PROPERTY(bw_guess_out)) - wq_wakeup(&guess_out_bw, NULL); + if (guess_out_bw < guess_target_bw) { + if (0 != hevset_count(gqueries) && guess_alpha < GUESS_ALPHA_MAX) + guess_alpha += GUESS_ALPHA; + } else if (wq_waiting(&guess_out_bw)) { + guess_alpha -= 2 * GUESS_ALPHA; /* Decrease faster than increases */ + guess_alpha = MAX(guess_alpha, GUESS_ALPHA); } + /* + * See how much unused Gnutella outgoing bandwidth we have that we could + * spend for GUESS queries. + */ + + guess_periodic_target_update(); + + if (guess_out_bw <= guess_target_bw) { + guess_out_bw = 0; + } else { + guess_out_bw -= guess_target_bw; + } + + /* + * Wakeup queries waiting for b/w in the order they went to sleep, + * provided we have bandwidth to serve. + */ + + if (guess_out_bw < guess_target_bw) + wq_wakeup(&guess_out_bw, NULL); + return TRUE; /* Keep calling */ } /** * Is a search MUID that of a running GUESS query? */ -gboolean +bool guess_is_search_muid(const guid_t *muid) { if G_UNLIKELY(NULL == gmuid) return FALSE; - return gm_hash_table_contains(gmuid, muid); + /* + * Because there can be delay between the end of a GUESS query and the + * time by which results come back to our node, we make the MUIDs linger + * for a while in an aging table so that we can recognize recent but + * expired MUIDs. + */ + + return + hikset_contains(gmuid, muid) || /* Active MUID */ + NULL != aging_lookup(guess_old_muids, muid); /* Lingering MUID */ } /** * Count received hits for GUESS query. */ void -guess_got_results(const guid_t *muid, guint32 hits) +guess_got_results(const guid_t *muid, uint32 hits) { guess_t *gq; - gq = g_hash_table_lookup(gmuid, muid); + gnet_stats_inc_general(GNR_GUESS_LOCAL_QUERY_HITS); + + gq = hikset_lookup(gmuid, muid); + if (NULL == gq) + return; /* Can be NULL because of MUID lingering */ + guess_check(gq); gq->recv_results += hits; - gnet_stats_count_general(GNR_GUESS_LOCAL_QUERY_HITS, +1); + guess_stats_fire(gq); } /** * Amount of results "kept" for the query. */ void -guess_kept_results(const guid_t *muid, guint32 kept) +guess_kept_results(const guid_t *muid, uint32 kept) { guess_t *gq; - gq = g_hash_table_lookup(gmuid, muid); + gq = hikset_lookup(gmuid, muid); if (NULL == gq) - return; /* GUESS requsst terminated */ + return; /* GUESS request terminated */ guess_check(gq); gq->kept_results += kept; + guess_stats_fire(gq); } /** @@ -2050,57 +3637,24 @@ if (GNET_PROPERTY(guess_client_debug) > 1) { g_debug("GUESS QUERY%s \"%s\" took %g secs, " - "queried_set=%zu, pool_set=%zu, " - "queried=%zu, acks=%zu, max_ultras=%zu, kept_results=%u/%u, " + "queried_set=%zu, pool_set=%u, deferred_set=%zu, " + "queried-ultra=%zu, queried-g2=%zu, " + "acks=%zu, max_ultras=%zu, kept_results=%u/%u, " "out_qk=%u bytes, out_query=%u bytes", nid_to_string(&gq->gid), lazy_safe_search(gq->query), tm_elapsed_f(&end, &gq->start), - map_count(gq->queried), + hset_count(gq->queried), hash_list_length(gq->pool), - gq->queried_nodes, gq->query_acks, gq->max_ultrapeers, + hset_count(gq->deferred), + gq->queried_ultra, gq->queried_g2, + gq->query_acks, gq->max_ultrapeers, gq->kept_results, gq->recv_results, gq->bw_out_qk, gq->bw_out_query); } } /** - * Should we terminate the query? - */ -static gboolean -guess_should_terminate(guess_t *gq) -{ - const char *reason = NULL; - - guess_check(gq); - - if (!guess_query_enabled()) { - reason = "GUESS disabled"; - goto terminate; - } - - if (gq->query_acks >= gq->max_ultrapeers) { - reason = "max amount of successfully queried ultrapeers reached"; - goto terminate; - } - - if (gq->kept_results >= GUESS_MAX_RESULTS) { - reason = "max amount of kept results reached"; - goto terminate; - } - - return FALSE; - -terminate: - if (GNET_PROPERTY(guess_client_debug) > 1) { - g_debug("GUESS QUERY%s should terminate: %s", - nid_to_string(&gq->gid), reason); - } - - return TRUE; -} - -/** * Select host to query next. * * @return host to query, NULL if none available. @@ -2110,7 +3664,7 @@ { hash_list_iter_t *iter; const gnet_host_t *host; - gboolean found = FALSE; + bool found = FALSE; guess_check(gq); @@ -2118,10 +3672,15 @@ while (hash_list_iter_has_next(iter)) { const char *reason = NULL; + host_addr_t addr; + time_t earliest; + hostiles_flags_t hostile; host = hash_list_iter_next(iter); - g_assert(host != NULL); + g_assert(atom_is_host(host)); + + addr = gnet_host_get_addr(host); /* * Known recently discovered alien hosts are invisibly removed. @@ -2135,8 +3694,15 @@ goto drop; } - if (hostiles_check(gnet_host_get_addr(host))) { - reason = "hostile host"; + hostile = hostiles_check(addr); + + if (hostiles_flags_are_bad(hostile)) { + reason = "bad hostile host"; + goto drop; + } + + if (hostiles_flags_warrant_shunning(hostile)) { + reason = "host should be shunned"; goto drop; } @@ -2145,16 +3711,30 @@ goto drop; } + if (node_host_is_connected(addr, gnet_host_get_port(host))) { + reason = "connected host"; + goto drop; + } + /* - * Skip hosts which we cannot recontact yet. + * Skip hosts we cannot recontact yet. */ - if (!guess_can_recontact(host)) { + earliest = guess_earliest_contact_time(host); + + if (0 != earliest) { if (GNET_PROPERTY(guess_client_debug) > 5) { - g_debug("GUESS QUERY%s cannot recontact %s yet", - nid_to_string(&gq->gid), gnet_host_to_string(host)); + g_debug("GUESS QUERY%s cannot recontact %s yet (in %s)", + nid_to_string(&gq->gid), gnet_host_to_string(host), + short_time_ascii(delta_time(earliest, tm_time()))); } - continue; + if (gq->flags & GQ_F_END_STARVING) { + reason = "cannot recontact host + ending query"; + goto drop; + } + + guess_defer(gq, host, earliest); + goto defer; } /* @@ -2173,11 +3753,16 @@ hash_list_iter_remove(iter); break; + defer: + hash_list_iter_remove(iter); + continue; + drop: if (GNET_PROPERTY(guess_client_debug) > 5) { g_debug("GUESS QUERY%s dropping %s from pool: %s", nid_to_string(&gq->gid), gnet_host_to_string(host), reason); } + hash_list_iter_remove(iter); atom_host_free_null(&host); } @@ -2191,15 +3776,13 @@ * Delay expiration -- callout queue callabck. */ static void -guess_delay_expired(cqueue_t *unused_cq, void *obj) +guess_delay_expired(cqueue_t *cq, void *obj) { guess_t *gq = obj; - (void) unused_cq; - guess_check(gq); - gq->delay_ev = NULL; + cq_zero(cq, &gq->delay_ev); gq->flags &= ~GQ_F_DELAYED; guess_iterate(gq); } @@ -2219,7 +3802,14 @@ if (gq->delay_ev != NULL) { g_assert(gq->flags & GQ_F_DELAYED); - cq_resched(gq->delay_ev, GUESS_FIND_DELAY); + + /* + * Query can be delayed for termination, in which case there's no + * need to push ahead the callback. + */ + + if (0 == (gq->flags & GQ_F_TERMINATED)) + cq_resched(gq->delay_ev, GUESS_FIND_DELAY); } else { gq->flags |= GQ_F_DELAYED; gq->delay_ev = @@ -2242,6 +3832,35 @@ gq->delay_ev = cq_main_insert(1, guess_delay_expired, gq); } +/** + * Cancel delay expiration -- callout queue callabck. + */ +static void +guess_cancel_expired(cqueue_t *cq, void *obj) +{ + guess_t *gq = obj; + + guess_check(gq); + g_assert(gq->flags & GQ_F_TERMINATED); + + cq_zero(cq, &gq->delay_ev); + gq->flags &= ~GQ_F_DELAYED; + guess_cancel(&gq, TRUE); +} + +/** + * Asynchronously request GUESS query cancellation + */ +static void +guess_async_cancel(guess_t *gq) +{ + guess_check(gq); + + cq_cancel(&gq->delay_ev); + gq->flags |= GQ_F_DELAYED | GQ_F_TERMINATED; + gq->delay_ev = cq_main_insert(1, guess_cancel_expired, gq); +} + /* * Schedule an asynchronous iteration if not already done */ @@ -2263,108 +3882,99 @@ struct guess_load_context { guess_t *gq; size_t loaded; + const char *type; }; /** * Hash list iterator to load host into query's pool if not already queried. */ static void -guess_pool_from_link_cache(void *host, void *data) +guess_pool_from_cache(void *host, void *data) { struct guess_load_context *ctx = data; guess_t *gq = ctx->gq; - if ( - !map_contains(gq->queried, host) && - !hash_list_contains(gq->pool, host) && - !guess_should_skip(host) - ) { - hash_list_append(gq->pool, atom_host_get(host)); + if (guess_add_pool(gq, host)) { ctx->loaded++; if (GNET_PROPERTY(guess_client_debug) > 5) { - g_debug("GUESS QUERY%s loaded link %s to pool", - nid_to_string(&gq->gid), gnet_host_to_string(host)); + g_debug("GUESS QUERY%s loaded %s %s to pool", + nid_to_string(&gq->gid), ctx->type, gnet_host_to_string(host)); } } } /** - * DBMW foreach iterator to load host into query's pool if not already queried. + * DBMW foreach iterator to load host into query's pool if not already queried. */ static void guess_pool_from_qkdata(void *host, void *value, size_t len, void *data) { struct guess_load_context *ctx = data; - struct qkdata *qk = value; + const struct qkdata *qk = value; guess_t *gq = ctx->gq; g_assert(len == sizeof *qk); - if ( - ( - 0 == qk->timeouts || - delta_time(tm_time(), qk->last_timeout) >= GUESS_TIMEOUT_DELAY - ) && - !map_contains(gq->queried, host) && - !hash_list_contains(gq->pool, host) - ) { - double p = guess_entry_still_alive(qk); + /* + * Do not prevent loading hosts from the database on the basis that they + * timed-out recently: since we're going to shuffle the pool randomly, + * this information will be long stale when the host will be processed + * by the query, so discriminating on the hosts now is not a good strategy. + * + * Timeouts from hosts are transient events that may not be the remote + * host's fault but rather a problem in the UDP end-to-end transmission. + * Failing to load hosts in the pool would mean we won't retry these + * hosts and therefore we won't know before a long time whether they are + * indeed unreacheable. + */ - if (p >= GUESS_ALIVE_PROBA) { - hash_list_append(gq->pool, atom_host_get(host)); - ctx->loaded++; - } - } + if (guess_add_pool_qk(gq, host, qk)) + ctx->loaded++; } /** * Load more hosts into the query pool. * * @param gq the GUESS query - * @param initial TRUE if initial loading (only from link cache) * * @return amount of new hosts loaded into the pool. */ static size_t -guess_load_pool(guess_t *gq, gboolean initial) +guess_load_pool(guess_t *gq) { struct guess_load_context ctx; ctx.gq = gq; ctx.loaded = 0; - hash_list_foreach(link_cache, guess_pool_from_link_cache, &ctx); + ctx.type = "link"; + hash_list_foreach(link_cache, guess_pool_from_cache, &ctx); - if (!initial || 0 == ctx.loaded) { - static time_t last_load; + ctx.type = "alive"; + hash_list_foreach(alive_cache, guess_pool_from_cache, &ctx); - /* - * This can be slow, because we're iterating over a potentially large - * database, and doing that too often will stuck the process completely. - * - * If we did load hosts recently, delay the operation, flagging the - * query as needing a loading, which will happen at the next iteration. - * Until it can complete successfully. - */ + ctx.type = "G2"; + hset_foreach(guess_g2_cache.hs, (cdata_fn_t) guess_pool_from_cache, &ctx); - if ( - last_load != 0 && - delta_time(tm_time(), last_load) < GUESS_DBLOAD_DELAY - ) { - if (!(gq->flags & GQ_F_POOL_LOAD)) { - if (GNET_PROPERTY(guess_client_debug) > 1) { - g_debug("GUESS QUERY%s deferring pool host loading", - nid_to_string(&gq->gid)); - } - gq->flags |= GQ_F_POOL_LOAD; - } - } else { - dbmw_foreach(db_qkdata, guess_pool_from_qkdata, &ctx); - gq->flags &= ~GQ_F_POOL_LOAD; - last_load = tm_time(); + if (!(gq->flags & GQ_F_POOL_LOAD)) { + g_assert(!hash_list_contains(load_pending, gq)); + hash_list_append(load_pending, gq); + gq->flags |= GQ_F_POOL_LOAD; + + if (GNET_PROPERTY(guess_client_debug) > 1) { + g_debug("GUESS QUERY%s enqueued for pool host loading", + nid_to_string(&gq->gid)); } } + /* + * Shuffle pool randomly to avoid querying all the hosts in the same order, + * balancing the load among them. + */ + + if (ctx.loaded) + hash_list_shuffle(gq->pool); + return ctx.loaded; } @@ -2378,15 +3988,88 @@ guess_check(gq); - added = guess_load_pool(gq, FALSE); + /* + * If query is flagged to end as soon as it starves, don't feed it + * with new hosts. + */ + + if (gq->flags & GQ_F_END_STARVING) + return; + + added = guess_load_pool(gq); if (GNET_PROPERTY(guess_client_debug) > 4) { - g_debug("GUESS QUERY%s loaded %zu more host%s in the pool", - nid_to_string(&gq->gid), added, 1 == added ? "" : "s"); + g_debug("GUESS QUERY%s loaded %zu more host%s in the pool%s", + nid_to_string(&gq->gid), added, plural(added), + (gq->flags & GQ_F_POOL_LOAD) ? " (pool load pending)" : ""); } } /** + * Callout queue periodic event to process the DBMW load queue. + */ +static bool +guess_periodic_load(void *unused_obj) +{ + tm_t start, end; + unsigned count = 0; + guess_t *gq; + struct guess_load_context ctx; + + (void) unused_obj; + + ctx.type = "disk"; + + tm_now_exact(&start); + +next: + gq = hash_list_shift(load_pending); + if (NULL == gq) + goto done; + + guess_check(gq); + g_assert(gq->flags & GQ_F_POOL_LOAD); + + ctx.gq = gq; + ctx.loaded = 0; + + /* + * To avoid querying hosts in roughly the same order from query to + * query, shuffle the resulting pool after loading. + */ + + dbmw_foreach(db_qkdata, guess_pool_from_qkdata, &ctx); + gq->flags &= ~GQ_F_POOL_LOAD; + hash_list_shuffle(gq->pool); /* Randomize order */ + + if (GNET_PROPERTY(guess_client_debug) > 1) { + g_debug("GUESS QUERY%s loaded %zu more host%s from disk pool", + nid_to_string(&gq->gid), ctx.loaded, plural(ctx.loaded)); + } + + guess_stats_fire(gq); + + /* + * Allow up to 2 seconds of stalling every minute, at most. If we spent + * less than 1 second overall, we can process another pending query. + */ + + count++; + tm_now_exact(&end); + if (tm_elapsed_ms(&end, &start) < 1000) + goto next; + +done: + if (GNET_PROPERTY(guess_client_debug) && count != 0) { + g_debug("GUESS %s() took %u ms for %u load%s", + G_STRFUNC, (unsigned) tm_elapsed_ms(&end, &start), + count, plural(count)); + } + + return TRUE; /* Keep calling */ +} + +/** * Callback invoked when a new host is available in the cache and could * be added to the query pool. */ @@ -2396,6 +4079,7 @@ struct hcache_new_host *nhost = hostinfo; guess_t *gq = data; gnet_host_t host; + bool g2 = FALSE; guess_check(gq); @@ -2427,6 +4111,12 @@ if (!settings_use_ipv6()) return WQ_SLEEP; break; + case HCACHE_FRESH_G2HUB: + case HCACHE_VALID_G2HUB: + if (!settings_use_ipv4()) + return WQ_SLEEP; + g2 = TRUE; + break; default: return WQ_SLEEP; /* Still waiting for a GUESS host */ } @@ -2436,11 +4126,10 @@ */ gnet_host_set(&host, nhost->addr, nhost->port); + if (g2) + guess_record_g2(&host); - if ( - map_contains(gq->queried, &host) || - hash_list_contains(gq->pool, &host) - ) + if (!guess_add_pool(gq, &host)) return WQ_SLEEP; /* @@ -2453,8 +4142,6 @@ nid_to_string(&gq->gid), gnet_host_to_string(&host)); } - hash_list_append(gq->pool, atom_host_get(&host)); - /* FALL THROUGH */ done: @@ -2504,19 +4191,33 @@ if (pmsg_was_sent(mb)) { /* Mesage was sent out */ - if (GNET_PROPERTY(guess_client_debug) > 4) { - g_debug("GUESS QUERY%s sent %s to %s", - nid_to_string(&gq->gid), gmsg_infostr(pmsg_start(mb)), - gnet_host_to_string(pmi->host)); + + if (pmi->g2) { + gq->queried_g2++; + gnet_stats_inc_general(GNR_GUESS_G2_QUERIED); + if (GNET_PROPERTY(guess_client_debug) > 4) { + g_debug("GUESS QUERY%s sent %s to G2 %s", + nid_to_string(&gq->gid), g2_msg_infostr_mb(mb), + gnet_host_to_string(pmi->host)); + } + } else { + gq->queried_ultra++; + gnet_stats_inc_general(GNR_GUESS_ULTRA_QUERIED); + if (GNET_PROPERTY(guess_client_debug) > 4) { + g_debug("GUESS QUERY%s sent %s to %s", + nid_to_string(&gq->gid), gmsg_infostr(pmsg_start(mb)), + gnet_host_to_string(pmi->host)); + } } - gq->queried_nodes++; gq->bw_out_query += pmsg_written_size(mb); - gnet_stats_count_general(GNR_GUESS_HOSTS_QUERIED, +1); } else { + const gnet_host_t *h; + /* Message was dropped */ if (GNET_PROPERTY(guess_client_debug) > 4) { - g_debug("GUESS QUERY%s dropped message to %s %synchronously", - nid_to_string(&gq->gid), gnet_host_to_string(pmi->host), + g_debug("GUESS QUERY%s dropped message to %s%s %synchronously", + nid_to_string(&gq->gid), pmi->g2 ? "G2 " : "", + gnet_host_to_string(pmi->host), (gq->flags & GQ_F_SENDING) ? "s" : "as"); } @@ -2529,8 +4230,11 @@ */ guess_rpc_cancel(gq, pmi->host); - map_remove(gq->queried, pmi->host); /* Atom moved to the pool */ - hash_list_append(gq->pool, pmi->host); + h = hset_lookup(gq->queried, pmi->host); /* Atom to be freed */ + g_assert(atom_is_host(h)); + hset_remove(gq->queried, pmi->host); + guess_add_pool(gq, pmi->host); + atom_host_free_null(&h); /* * Because the queue dropped the message, we're going to delay the @@ -2553,7 +4257,7 @@ * * @return FALSE if query cannot be sent. */ -static gboolean +static bool guess_send_query(guess_t *gq, const gnet_host_t *host) { if (!guess_send(gq, host)) { @@ -2573,30 +4277,33 @@ * mark it as queried so that no further attempt be made to contact it. */ static void -guess_ignore_alien_host(void *unused_key, void *val, void *data) +guess_ignore_alien_host(void *val, void *data) { guess_t *gq = val; const gnet_host_t *host = data; + const gnet_host_t *hkey; guess_check(gq); - (void) unused_key; /* * Prevent querying of the host. */ - if (!map_contains(gq->queried, host)) { - map_insert(gq->queried, atom_host_get(host), int_to_pointer(1)); - } - - if (hash_list_contains(gq->pool, host)) { - const gnet_host_t *hkey; + if (!hset_contains(gq->queried, host)) + hset_insert(gq->queried, atom_host_get(host)); + if (NULL != (hkey = hash_list_remove(gq->pool, host))) { if (GNET_PROPERTY(guess_client_debug) > 3) { g_debug("GUESS QUERY%s dropping non-GUESS host %s from pool", nid_to_string(&gq->gid), gnet_host_to_string(host)); } - hkey = hash_list_remove(gq->pool, host); + atom_host_free_null(&hkey); + } else if (NULL != (hkey = hset_lookup(gq->deferred, host))) { + if (GNET_PROPERTY(guess_client_debug) > 3) { + g_debug("GUESS QUERY%s dropping deferred non-GUESS host %s", + nid_to_string(&gq->gid), gnet_host_to_string(host)); + } + hset_remove(gq->deferred, host); atom_host_free_null(&hkey); } } @@ -2606,7 +4313,7 @@ * whose IP:port is wrong and must not be queried again. */ static void -guess_alien_host(const guess_t *gq, const gnet_host_t *host, gboolean reached) +guess_alien_host(const guess_t *gq, const gnet_host_t *host, bool reached) { if (GNET_PROPERTY(guess_client_debug) > 1) { g_info("GUESS QUERY%s host %s doesn't %s", @@ -2623,49 +4330,64 @@ aging_insert(guess_alien, atom_host_get(host), int_to_pointer(1)); hcache_purge(HCACHE_CLASS_GUESS, gnet_host_get_addr(host), gnet_host_get_port(host)); - g_hash_table_foreach(gqueries, guess_ignore_alien_host, - deconstify_gpointer(host)); + hevset_foreach(gqueries, guess_ignore_alien_host, deconstify_pointer(host)); } +enum guess_qk_magic { GUESS_QK_MAGIC = 0x2868c199 }; + /** * Context for requesting query keys in the middle of the iteration. */ struct guess_qk_context { + enum guess_qk_magic magic; struct nid gid; /**< Running query ID */ const gnet_host_t *host; /**< Host we're requesting the key from */ }; +static inline void +guess_qk_context_check(const struct guess_qk_context * const ctx) +{ + g_assert(ctx != NULL); + g_assert(GUESS_QK_MAGIC == ctx->magic); +} + /** * Free query key request context. */ static void guess_qk_context_free(struct guess_qk_context *ctx) { - g_assert(ctx != NULL); + guess_qk_context_check(ctx); g_assert(atom_is_host(ctx->host)); atom_host_free_null(&ctx->host); + ctx->magic = 0; WFREE(ctx); } /** - * Process query key reply from host. + * Process query key reply from host in the middle of a GUESS query. * * @param type type of reply, if any * @param n gnutella node replying (NULL if no reply) + * @param t parsed G2 message tree (NULL if no reply or for Gnutella) * @param data user-supplied callback data */ static void guess_got_query_key(enum udp_ping_ret type, - const struct gnutella_node *n, void *data) + const gnutella_node_t *n, const g2_tree_t *t, void *data) { struct guess_qk_context *ctx = data; guess_t *gq; const gnet_host_t *host = ctx->host; + bool g2 = FALSE, extracted; + + guess_qk_context_check(ctx); + g_assert(atom_is_host(ctx->host)); gq = guess_is_alive(ctx->gid); if (NULL == gq) { - if (UDP_PING_EXPIRED == type || UDP_PING_TIMEDOUT == type) + if (UDP_PING_EXPIRED == type || UDP_PING_TIMEDOUT == type || t != NULL) guess_qk_context_free(ctx); return; } @@ -2680,15 +4402,19 @@ */ { - struct qkdata *qk = get_qkdata(host); + const struct qkdata *qk = get_qkdata(host); + + g2 = qk != NULL && (qk->flags & GUESS_F_G2); if ( qk != NULL && qk->length != 0 && - delta_time(tm_time(), qk->last_update) <= GUESS_QK_LIFE + guess_key_still_valid(qk->last_update) ) { if (GNET_PROPERTY(guess_client_debug) > 2) { - g_info("GUESS QUERY%s concurrently got query key for %s", - nid_to_string(&gq->gid), gnet_host_to_string(host)); + g_info("GUESS QUERY%s " + "concurrently got query key for %s%s", + nid_to_string(&gq->gid), + g2 ? "G2 " : "", gnet_host_to_string(host)); } guess_send_query(gq, host); guess_qk_context_free(ctx); @@ -2717,8 +4443,9 @@ } if (GNET_PROPERTY(guess_client_debug) > 2) { - g_debug("GUESS QUERY%s timed out waiting query key from %s", - nid_to_string(&gq->gid), gnet_host_to_string(host)); + g_debug("GUESS QUERY%s timed out waiting query key from %s%s", + nid_to_string(&gq->gid), + g2 ? "G2 " : "", gnet_host_to_string(host)); } /* @@ -2727,24 +4454,30 @@ */ guess_timeout_from(host); - aging_remove(guess_qk_reqs, host); /* FALL THROUGH */ + case UDP_PING_EXPIRED: guess_qk_context_free(ctx); + aging_remove(guess_qk_reqs, host); goto no_query_key; + case UDP_PING_REPLY: if G_UNLIKELY(NULL == link_cache) break; - guess_traffic_from(host); - if (guess_extract_qk(n, host)) { + g2 = t != NULL; + guess_traffic_from(host, g2 ? GUESS_F_G2 : 0); + extracted = g2 ? + guess_extract_g2_qk(t, host) : guess_extract_qk(n, host); + if (extracted) { if (GNET_PROPERTY(guess_client_debug) > 2) { - g_debug("GUESS QUERY%s got query key from %s, sending query", - nid_to_string(&gq->gid), gnet_host_to_string(host)); + g_debug("GUESS QUERY%s got query key from %s%s, querying", + nid_to_string(&gq->gid), + g2 ? "G2 " : "", gnet_host_to_string(host)); } guess_send_query(gq, host); - } else { - guint16 port = peek_le16(&n->data0); + } else if (!g2) { + uint16 port = peek_le16(&n->data0); host_addr_t addr = guess_extract_host_addr(n); @@ -2770,9 +4503,9 @@ if ( gnet_host_get_port(host) == port && - host_addr_equal(gnet_host_get_addr(host), addr) + host_addr_equiv(gnet_host_get_addr(host), addr) ) { - struct qkdata *qk = get_qkdata(host); + const struct qkdata *qk = get_qkdata(host); if (NULL == qk || 0 == qk->length) { guess_alien_host(gq, host, TRUE); @@ -2783,7 +4516,11 @@ goto no_query_key; } } - guess_extract_ipp(gq, n, host); + if (g2) { + guess_qk_context_free(ctx); /* No further reply expected */ + aging_remove(guess_qk_reqs, host); + } else + guess_extract_ipp(gq, n, host); break; } @@ -2794,31 +4531,34 @@ } /** - * Process acknowledgement pong received from host. + * Process acknowledgement pong or /QA received from host. * * @param gq the GUESS query * @param n the node sending back the acknowledgement pong * @param host the host we queried (atom) * @param hops hop count at the time we sent the RPC + * @param t the G2 message tree (NULL for Gnutella) * * @return TRUE if we should iterate */ -static gboolean +static bool guess_handle_ack(guess_t *gq, - const gnutella_node_t *n, const gnet_host_t *host, unsigned hops) + const gnutella_node_t *n, const gnet_host_t *host, unsigned hops, + const g2_tree_t *t) { guess_check(gq); g_assert(atom_is_host(host)); g_assert(n != NULL); - g_assert(GTA_MSG_INIT_RESPONSE == gnutella_header_get_function(&n->header)); - g_assert(map_contains(gq->queried, host)); + g_assert(hset_contains(gq->queried, host)); /* - * Once we have queried enough ultrapeers, we know that the query is for - * a rare item or we would have stopped earlier due to the whelm of hits. + * Once we have queried enough hosts, we know that the query is for a + * rare item or we would have stopped earlier due to the whelm of hits. * Accelerate things by switching to loose parallelism. */ + gq->query_reached++; + if (GUESS_WARMING_COUNT == gq->query_acks++) { if (GNET_PROPERTY(guess_client_debug) > 1) { g_debug("GUESS QUERY%s switching to loose parallelism", @@ -2828,11 +4568,52 @@ guess_load_more_hosts(gq); /* Fuel for acceleration */ } - gnet_stats_count_general(GNR_GUESS_HOSTS_ACKNOWLEDGED, +1); - guess_traffic_from(host); - { - guint16 port = peek_le16(&n->data0); - host_addr_t addr = guess_extract_host_addr(n); + if (NODE_TALKS_G2(n)) { + /* + * A G2 hub can reply to our /Q2 with a /QA or a /QKA but if we get + * here, we only process /Q2 since guess_g2_rpc_handle() has already + * filtered out /QKA requests (which do not bear a MUID, hence cannot + * be processed here anyway). + */ + + g_assert(t != NULL); + g_assert(G2_MSG_QA == g2_msg_name_type(g2_tree_name(t))); + + gnet_stats_inc_general(GNR_GUESS_G2_ACKNOWLEDGED); + guess_traffic_from(host, GUESS_F_G2); + + /* + * This is an acknowledgement we're getting after our query. + */ + + if (GNET_PROPERTY(guess_client_debug) > 4) { + tm_t now; + tm_now_exact(&now); + g_debug("GUESS QUERY%s %g secs, hop %u, " + "got acknowledgement from G2 %s at hop %u", + nid_to_string(&gq->gid), tm_elapsed_f(&now, &gq->start), + gq->hops, gnet_host_to_string(host), hops); + } + + guess_handle_qa(gq, host, t); + } else { + uint16 port; + host_addr_t addr; + + /* + * Getting an acknowledgment Pong. + */ + + g_assert(NULL == t); + g_assert(GTA_MSG_INIT_RESPONSE == + gnutella_header_get_function(&n->header)); + + gnet_stats_inc_general(GNR_GUESS_ULTRA_ACKNOWLEDGED); + guess_traffic_from(host, 0); + ripening_remove(guess_deferred, host); /* Can issue another RPC now */ + + port = peek_le16(&n->data0); + addr = guess_extract_host_addr(n); /* * This is an acknowledgement Pong we're getting after our query. @@ -2849,29 +4630,35 @@ } guess_discovered_host(addr, port); - if (!host_addr_equal(addr, gnet_host_get_addr(host))) { + if (!host_addr_equiv(addr, gnet_host_get_addr(host))) { guess_host_set_flags(host, GUESS_F_OTHER_HOST); - guess_add_pool(gq, addr, port); + guess_add_host(gq, addr, port, FALSE); } - } - guess_extract_ipp(gq, n, host); - /* - * If the pong contains a new query key, it means our old query key - * expired. We need to resend the query to this host. - * - * Because we're in the middle of an RPC processing, we cannot issue - * a new RPC to this host yet: put it back as the first item in the pool - * so that we pick it up again at the next iteration. - */ + guess_extract_ipp(gq, n, host); - if (guess_extract_qk(n, host)) { - if (GNET_PROPERTY(guess_client_debug) > 2) { - g_debug("GUESS QUERY%s got new query key for %s, back to pool", - nid_to_string(&gq->gid), gnet_host_to_string(host)); + /* + * If the pong contains a new query key, it means our old query key + * expired. We need to resend the query to this host. + * + * Because we're in the middle of an RPC processing, we cannot issue + * a new RPC to this host yet: put it back as the first item in the pool + * so that we pick it up again at the next iteration. + */ + + if (guess_extract_qk(n, host)) { + const gnet_host_t *h; + + if (GNET_PROPERTY(guess_client_debug) > 2) { + g_debug("GUESS QUERY%s got new query key for %s, " + "moving host back to pool", + nid_to_string(&gq->gid), gnet_host_to_string(host)); + } + h = hset_lookup(gq->queried, host); + g_assert(atom_is_host(h)); + hset_remove(gq->queried, host); + hash_list_prepend(gq->pool, h); } - map_remove(gq->queried, host); - hash_list_prepend(gq->pool, host); } return hops >= gq->hops; /* Iterate only if reply from current hop */ @@ -2880,36 +4667,53 @@ /** * GUESS RPC callback function. * - * @param type GUESS_RPC_TIMEOUT or GUESS_RPC_REPLY * @param grp RPC descriptor - * @param n the node sending back the acknowledgement pong + * @param n the node sending back the answer (NULL on timeout) * @param gq the GUESS query object that issued the RPC */ static void -guess_rpc_callback(enum guess_rpc_ret type, struct guess_rpc *grp, - const gnutella_node_t *n, guess_t *gq) +guess_rpc_callback(struct guess_rpc *grp, const gnutella_node_t *n, guess_t *gq) { + bool iterate; + guess_rpc_check(grp); guess_check(gq); g_assert(gq->rpc_pending > 0); gq->rpc_pending--; - if (GUESS_RPC_TIMEOUT == type) { + if (NULL == n) { /* Timeout! */ if (grp->pmi != NULL) { /* Message not processed by UDP queue */ grp->pmi->rpc_done = TRUE; } else { guess_timeout_from(grp->host); } - if (0 == gq->rpc_pending) - guess_iterate(gq); + iterate = FALSE; } else { g_assert(NULL == grp->pmi); /* Message sent if we get a reply */ - if (guess_handle_ack(gq, n, grp->host, grp->hops)) - guess_iterate(gq); + iterate = guess_handle_ack(gq, n, grp->host, grp->hops, grp->t); } + + if (iterate || gq->rpc_pending < guess_alpha) + guess_iterate(gq); +} + +/** + * Dump query message to stderr. + * + * @param gq the GUESS query for which we're sending this message + * @param n the destination node + * @param mb the message that is to be sent + */ +static void +guess_query_dump(const guess_t *gq, const gnutella_node_t *n, const pmsg_t *mb) +{ + str_t *s = str_private(G_STRFUNC, 80); + + str_printf(s, "GUESS query \"%s\" to %s", gq->query, node_infostr(n)); + dump_hex(stderr, str_2c(s), pmsg_start(mb), pmsg_written_size(mb)); } /** @@ -2917,17 +4721,16 @@ * * @return TRUE if message was sent, FALSE if we cannot query the host. */ -static gboolean +static bool guess_send(guess_t *gq, const gnet_host_t *host) { struct guess_pmsg_info *pmi; struct guess_rpc *grp; pmsg_t *mb; - guint32 size; - gnutella_msg_search_t *msg; - struct qkdata *qk; + const struct qkdata *qk; const gnutella_node_t *n; - gboolean marked_as_queried = TRUE; + bool marked_as_queried = TRUE, g2 = FALSE; + time_t earliest = 0; guess_check(gq); g_assert(atom_is_host(host)); @@ -2942,14 +4745,12 @@ * with the same MUID. * * Therefore, record the host in the "queried" table if not already present. - * Since it is an atom (removal from the pool), there's no need to refcount - * it again. */ - if (map_contains(gq->queried, host)) { + if (hset_contains(gq->queried, host)) { marked_as_queried = FALSE; } else { - map_insert(gq->queried, host, int_to_pointer(1)); + hset_insert(gq->queried, atom_host_get(host)); } /* @@ -2958,14 +4759,37 @@ qk = get_qkdata(host); + /* + * Because we use the database to discriminate between Gnutella and G2 + * hosts, warn if the host was not present in the database. + */ + + if (GNET_PROPERTY(guess_client_debug) && NULL == qk) { + g_debug("GUESS QUERY%s host %s not in database, assuming Gnutella", + nid_to_string(&gq->gid), gnet_host_to_string(host)); + } + + if (qk != NULL && (qk->flags & GUESS_F_G2)) + g2 = TRUE; + + /* + * Because they can disable GUESS and G2 separately, we need to check + * whether we can issue the query using the selected protocol. If we + * are not allowed, act as if the host had been queried. + */ + + if (!guess_enabled(g2)) + return TRUE; /* Act as if we had queried the host */ + if ( NULL == qk || 0 == qk->length || - delta_time(tm_time(), qk->last_update) > GUESS_QK_LIFE + !guess_key_still_valid(qk->last_update) ) { struct guess_qk_context *ctx; - gboolean intro = settings_is_ultra(); + bool intro = settings_is_ultra(); WALLOC(ctx); + ctx->magic = GUESS_QK_MAGIC; ctx->gid = gq->gid; ctx->host = atom_host_get(host); @@ -2974,28 +4798,34 @@ * to introduce ourselves as a GUESS server when running as ultra node. */ - if (!guess_request_qk_full(gq, host, intro, guess_got_query_key, ctx)) { + if ( + !guess_request_qk_full(gq, host, + intro, g2, guess_got_query_key, ctx) + ) { guess_qk_context_free(ctx); goto unqueried; } if (GNET_PROPERTY(guess_client_debug) > 2) { - g_debug("GUESS QUERY%s waiting for query key from %s", - nid_to_string(&gq->gid), gnet_host_to_string(host)); + g_debug("GUESS QUERY%s waiting for query key from %s%s", + nid_to_string(&gq->gid), g2 ? "G2 " : "", + gnet_host_to_string(host)); } return TRUE; } if (GNET_PROPERTY(guess_client_debug) > 2) { - g_debug("GUESS QUERY%s querying %s", - nid_to_string(&gq->gid), gnet_host_to_string(host)); + g_debug("GUESS QUERY%s querying %s%s", + nid_to_string(&gq->gid), g2 ? "G2 " : "", + gnet_host_to_string(host)); } /* * Allocate the RPC descriptor, checking that we can indeed query the host. */ - grp = guess_rpc_register(host, gq->muid, gq->gid, guess_rpc_callback); + grp = guess_rpc_register(host, gq->muid, g2, gq->gid, + guess_rpc_callback, &earliest); if (NULL == grp) goto unqueried; @@ -3006,11 +4836,12 @@ * Allocate additional message information for an extended message block. */ - WALLOC(pmi); + WALLOC0(pmi); pmi->magic = GUESS_PMI_MAGIC; pmi->host = atom_host_get(host); pmi->gid = gq->gid; pmi->rpc_done = FALSE; + pmi->g2 = booleanize(g2); grp->hops = gq->hops; @@ -3035,38 +4866,112 @@ * 3. We need a "QK" GGEP extension holding the recipient-specific key. */ - msg = build_guess_search_msg(gq->muid, gq->query, gq->mtype, &size, - qk->query_key, qk->length); - mb = pmsg_new_extend(PMSG_P_DATA, NULL, size, guess_pmsg_free, pmi); - pmsg_write(mb, msg, size); - wfree(msg, size); + if (g2) { + pmsg_t *qmb; - /* - * Send the message. - */ + qmb = g2_build_q2(gq->muid, gq->query, gq->mtype, + qk->query_key, qk->length); + mb = pmsg_clone_extend(qmb, guess_pmsg_free, pmi); + pmsg_free(qmb); - n = node_udp_get_addr_port( - gnet_host_get_addr(host), gnet_host_get_port(host)); + n = node_udp_g2_get_addr_port( + gnet_host_get_addr(host), gnet_host_get_port(host)); - if (n != NULL) { /* - * Limiting bandwidth is accounted for at enqueue time, not at - * sending time. Indeed, we're trying the limit the flow generated - * over time. If we counted at emission time, we could have bursts - * due to queueing and clogging, but we would resume at the next - * period anyway, thereby not having any smoothing effect. + * Issue a G2 RPC, which requires more setup than for Gnutella hosts + * because the handling of RPC answers is different: we get a parsed + * message tree from the lower RPC layer. + * + * We're sending a /Q2 over UDP and expect either a /QA or a /QKA back. + * The /QA bears the MUID of the matching query, but not the /QKA + * hence we do not use the MUID in the G2 RPC layer. */ - guess_out_bw += pmsg_written_size(mb); - gmsg_mb_sendto_one(n, mb); + if (n != NULL) { + bool ok; + size_t len = pmsg_written_size(mb); + + if (GNET_PROPERTY(guess_client_debug) > 18) + guess_query_dump(gq, n, mb); + + /* + * The value of GUESS_G2_RPC_TIMEOUT is MUCH larger than the local + * GUESS RPC lifetime. This allows us to process late /QA replies + * to collect more G2 hosts, because G2 hubs are very slow to + * acknowledge the query. This means we can re-query hubs that + * have been already queried, but that's the problem of the slow + * hub, which should acknowledge the query in a more timely manner. + * --RAM, 2014-01-31 + */ + + ok = g2_rpc_launch(host, mb, guess_g2_rpc_handle, NULL, + GUESS_G2_RPC_TIMEOUT); + + /* + * Limiting bandwidth is accounted for at enqueue time, not at + * sending time. Indeed, we're trying the limit the flow generated + * over time. If we counted at emission time, we could have bursts + * due to queueing and clogging, but we would resume at the next + * period anyway, thereby not having any smoothing effect. + */ + + if (ok) { + guess_out_bw += len; + } else { + pmsg_free(mb); /* RPC cancel done by guess_pmsg_free() */ + marked_as_queried = FALSE; /* Free routine unflagged it */ + goto unqueried; + } + } + } else { + gnutella_msg_search_t *msg; + uint32 size; + + /* + * In Gnutella, we're sending a GUESS Query over UDP and we shall + * be getting an acknowledgment Pong via UDP, which will come back + * without a matching Ping (hence it appears "unsolicited" to the + * pcache_udp_pong_received() routine). This will then call the + * guess_rpc_handle() routine to handle the acknowledgment. + */ + + msg = build_guess_search_msg(gq->muid, gq->query, gq->mtype, &size, + qk->query_key, qk->length); + mb = pmsg_new_extend(PMSG_P_DATA, NULL, size, guess_pmsg_free, pmi); + pmsg_write(mb, msg, size); + wfree(msg, size); + + /* + * Same rationale as above if() case for outgoing bandwidth accounting. + */ + + n = node_udp_get_addr_port( + gnet_host_get_addr(host), gnet_host_get_port(host)); + + if (n != NULL) { + if (GNET_PROPERTY(guess_client_debug) > 18) + guess_query_dump(gq, n, mb); + + guess_out_bw += size; + gmsg_mb_sendto_one(n, mb); + } + } + + /* + * Common post-processing. + */ + + if (n != NULL) { if (GNET_PROPERTY(guess_client_debug) > 5) { - g_debug("GUESS QUERY%s enqueued query to %s", - nid_to_string(&gq->gid), gnet_host_to_string(host)); + g_debug("GUESS QUERY%s enqueued query to %s%s", + nid_to_string(&gq->gid), g2 ? "G2 " : "", + gnet_host_to_string(host)); } } else { if (GNET_PROPERTY(guess_client_debug)) { - g_warning("GUESS QUERY%s cannot send message to %s", - nid_to_string(&gq->gid), gnet_host_to_string(host)); + g_warning("GUESS QUERY%s cannot send message to %s%s", + nid_to_string(&gq->gid), g2 ? "G2 " : "", + gnet_host_to_string(host)); } pmsg_free(mb); guess_rpc_cancel(gq, host); @@ -3076,13 +4981,56 @@ unqueried: if (marked_as_queried) { - if (GNET_PROPERTY(guess_client_debug) > 2) { - g_debug("GUESS QUERY%s putting unqueried %s back to pool", - nid_to_string(&gq->gid), gnet_host_to_string(host)); - } + /* + * When the query is supposed to end when starving, do not put + * unqueried hosts back to the pool, so that we can accelerate the + * ending of the query. Otherwise, there is a risk that we could + * almost stall, not being able to complete the iteration for a long + * time. + */ - map_remove(gq->queried, host); - hash_list_append(gq->pool, host); + if (gq->flags & GQ_F_END_STARVING) { + if (GNET_PROPERTY(guess_client_debug) > 2) { + g_debug("GUESS QUERY%s skipping unqueried %s%s (end mode)", + nid_to_string(&gq->gid), g2 ? "G2 " : "", + gnet_host_to_string(host)); + } + } else { + const gnet_host_t *h = hset_lookup(gq->queried, host); /* Atom */ + + g_assert(atom_is_host(h)); + hset_remove(gq->queried, host); + + if (0 == earliest) { + if (GNET_PROPERTY(guess_client_debug) > 2) { + g_debug("GUESS QUERY%s " + "putting unqueried %s%s back to pool", + nid_to_string(&gq->gid), g2 ? "G2 " : "", + gnet_host_to_string(host)); + } + + hash_list_append(gq->pool, h); + } else { + if (GNET_PROPERTY(guess_client_debug) > 2) { + g_debug("GUESS QUERY%s " + "deferring unqueried %s%s until %s", + nid_to_string(&gq->gid), g2 ? "G2 " : "", + gnet_host_to_string(host), + timestamp_to_string(earliest)); + } + + /* + * Defer processing of host in all queries. + * + * This is a conservative move (we could perhaps requery the + * host earlier) but it will save processing time in all + * queries since the host will no longer be processed during + * iterations when we try to find a suitable host to query. + */ + + guess_defer(gq, h, earliest); + } + } } else { /* * If a buggy host responds to a query key request with two pongs, @@ -3111,7 +5059,7 @@ guess_t *gq = data; guess_check(gq); - g_return_val_if_fail(guess_out_bw < GNET_PROPERTY(bw_guess_out), WQ_SLEEP); + g_return_val_if_fail(guess_out_bw < guess_target_bw, WQ_SLEEP); (void) unused; @@ -3125,8 +5073,7 @@ * removing the current entry from the waiting queue. */ - return guess_out_bw >= GNET_PROPERTY(bw_guess_out) ? - WQ_EXCLUSIVE : WQ_REMOVE; + return guess_out_bw >= guess_target_bw ? WQ_EXCLUSIVE : WQ_REMOVE; } /** @@ -3135,9 +5082,11 @@ static void guess_iterate(guess_t *gq) { - int alpha = GUESS_ALPHA; - int i = 0, unsent = 0; - size_t attempts = 0; + int alpha = guess_alpha; + int i = 0; + unsigned unsent = 0; + size_t attempts = 0, poolsize; + bool starving_defacto = FALSE; guess_check(gq); @@ -3145,19 +5094,12 @@ * Check for termination criteria. */ - if (guess_should_terminate(gq)) { + if (guess_should_terminate(gq, TRUE)) { guess_cancel(&gq, TRUE); return; } /* - * If we have a pending pool loading, attempt to do it now. - */ - - if (gq->flags & GQ_F_POOL_LOAD) - guess_load_more_hosts(gq); - - /* * If we were delayed in another "thread" of replies, this call is about * to be rescheduled once the delay is expired. */ @@ -3193,7 +5135,7 @@ if (GNET_PROPERTY(guess_client_debug) > 2) { g_debug("GUESS QUERY%s not iterating yet (%d RPC%s pending)", nid_to_string(&gq->gid), gq->rpc_pending, - 1 == gq->rpc_pending ? "" : "s"); + plural(gq->rpc_pending)); } return; } @@ -3205,17 +5147,26 @@ tm_t now; tm_now_exact(&now); g_debug("GUESS QUERY%s iterating, %g secs, hop %u, " - "acks/pool: %zu/%u " + "acks/pool/defer: %zu/%u/%zu " "(%s parallelism: sending %d RPC%s at most, %d outstanding)", nid_to_string(&gq->gid), tm_elapsed_f(&now, &gq->start), gq->hops, gq->query_acks, hash_list_length(gq->pool), - guess_mode_to_string(gq->mode), - alpha, 1 == alpha ? "" : "s", gq->rpc_pending); + hset_count(gq->deferred), guess_mode_to_string(gq->mode), + alpha, plural(alpha), gq->rpc_pending); } gq->flags |= GQ_F_SENDING; /* Proctect against syncrhonous UDP drops */ gq->flags &= ~GQ_F_UDP_DROP; /* Clear condition */ + /* + * Don't send more than GUESS_ALPHA_MAX messages at a time, regardless + * of the adjusted value of the alpha concurrency parameter to avoid + * a query eating all the available bandwidth if alpha starts to + * get large. + */ + + alpha = MIN(alpha, GUESS_ALPHA_MAX); + while (i < alpha) { const gnet_host_t *host; @@ -3232,34 +5183,42 @@ * If we run out of bandwidth, abort. */ - if (guess_out_bw >= GNET_PROPERTY(bw_guess_out)) + if (guess_out_bw >= guess_target_bw) break; /* * Send query to next host in the pool. + * + * If we cannot pick any host from the pool, we're de-facto starving, + * regardless of whether the pool is empty. */ host = guess_pick_next(gq); - if (NULL == host) + if (NULL == host) { + starving_defacto = TRUE; break; + } - if (!map_contains(gq->queried, host)) { + if (!hset_contains(gq->queried, host)) { if (!guess_send_query(gq, host)) { - if (unsent++ > alpha) + atom_host_free_null(&host); + if (unsent++ > UNSIGNED(alpha)) break; continue; } - if (gq->flags & GQ_F_UDP_DROP) + if (gq->flags & GQ_F_UDP_DROP) { + atom_host_free_null(&host); break; /* Synchronous UDP drop detected */ + } i++; - } else { - atom_host_free_null(&host); } + atom_host_free_null(&host); } gq->flags &= ~GQ_F_SENDING; + poolsize = hash_list_length(gq->pool); - if (unsent > alpha) { + if (unsent > UNSIGNED(alpha) || (unsent >= poolsize && 0 != poolsize)) { /* * For some reason we cannot issue queries. Probably because we need * query keys for the hosts and there are already too many registered @@ -3267,12 +5226,12 @@ */ if (GNET_PROPERTY(guess_client_debug) > 1) { - g_debug("GUESS QUERY%s too many unsent messages, delaying", - nid_to_string(&gq->gid)); + g_debug("GUESS QUERY%s too many unsent messages (%u), delaying", + nid_to_string(&gq->gid), unsent); } guess_delay(gq); } else if (0 == i) { - if (guess_out_bw >= GNET_PROPERTY(bw_guess_out)) { + if (guess_out_bw >= guess_target_bw) { /* * If we did not have enough bandwidth, wait until next slot. * Waiting happens in FIFO order. @@ -3299,16 +5258,17 @@ guess_delay(gq); } else { - gboolean starving; + bool starving; /* - * Query is starving when its pool is empty. + * Query is starving when its pool is empty or when we cannot + * actually pick any host to contact right now. * * When GQ_F_END_STARVING is set, they want us to end the query * as soon as we are starving. */ - starving = 0 == hash_list_length(gq->pool); + starving = 0 == poolsize || starving_defacto; if (starving && (gq->flags & GQ_F_END_STARVING)) { if (gq->flags & GQ_F_POOL_LOAD) { @@ -3323,7 +5283,25 @@ g_debug("GUESS QUERY%s starving, ending as requested", nid_to_string(&gq->gid)); } - guess_cancel(&gq, TRUE); + + /* + * Request asynchronous cancellation because we may have + * been called from within an RPC callaback, and they + * do not expect the object to be reclaimed in the middle + * of the processing. + * + * The calling chain we're trying to protect here is: + * guess_pmsg_free() calls guess_rpc_cancel() + * which may iterate and end up here. + * + * Although guess_pmsg_free() could be ammended to make it + * immune to this problem, it seems cleaner to introduce + * asynchronous cancellation: less code contorsions, + * cleaner post-mortem traces of what happened, if needed. + * --RAM, 2012-02-28 + */ + + guess_async_cancel(gq); } } else { if (GNET_PROPERTY(guess_client_debug) > 1) { @@ -3341,6 +5319,8 @@ } } } + + guess_stats_fire(gq); } /** @@ -3356,8 +5336,22 @@ nid_to_string(&gq->gid)); } - gq->flags |= GQ_F_END_STARVING; guess_load_more_hosts(gq); /* Fuel for not starving too early */ + gq->flags |= GQ_F_END_STARVING; /* Will prevent further disk pool loading */ +} + +/** + * Check whether a given IP:port has been queried already. + */ +bool +guess_already_queried(const guess_t *gq, const host_addr_t addr, uint16 port) +{ + gnet_host_t host; + + guess_check(gq); + + gnet_host_set(&host, addr, port); + return hset_contains(gq->queried, &host); } /** @@ -3389,8 +5383,11 @@ gq->muid = atom_guid_get(muid); gq->mtype = mtype; gq->mode = GUESS_QUERY_BOUNDED; - gq->queried = map_create_hash(gnet_host_hash, gnet_host_eq); - gq->pool = hash_list_new(gnet_host_hash, gnet_host_eq); + gq->queried = + hset_create_any(gnet_host_hash, gnet_host_hash2, gnet_host_equal); + gq->deferred = + hset_create_any(gnet_host_hash, gnet_host_hash2, gnet_host_equal); + gq->pool = hash_list_new(gnet_host_hash, gnet_host_equal); gq->cb = cb; gq->arg = arg; tm_now_exact(&gq->start); @@ -3404,16 +5401,16 @@ gq->max_ultrapeers = 0.85 * dbmw_count(db_qkdata); gq->max_ultrapeers = MAX(gq->max_ultrapeers, GUESS_MAX_ULTRAPEERS); - g_hash_table_insert(gqueries, &gq->gid, gq); - gm_hash_table_insert_const(gmuid, gq->muid, gq); + hevset_insert_key(gqueries, &gq->gid); + hikset_insert_key(gmuid, &gq->muid); if (GNET_PROPERTY(guess_client_debug) > 1) { - g_debug("GUESS QUERY%s starting query for \"%s\" MUID=%s ultras=%lu", + g_debug("GUESS QUERY%s starting query for \"%s\" #%s ultras=%lu", nid_to_string(&gq->gid), lazy_safe_search(query), guid_hex_str(muid), (unsigned long) gq->max_ultrapeers); } - if (0 == guess_load_pool(gq, TRUE)) { + if (0 == guess_load_pool(gq)) { gq->hostwait = wq_sleep_timeout( func_to_pointer(hcache_add), GUESS_WAIT_DELAY, guess_load_host_added, gq); @@ -3427,21 +5424,22 @@ * Therefore, it is useless to send them the query again. */ - gnet_stats_count_general(GNR_GUESS_LOCAL_QUERIES, +1); - gnet_stats_count_general(GNR_GUESS_LOCAL_RUNNING, +1); + gnet_stats_inc_general(GNR_GUESS_LOCAL_QUERIES); + gnet_stats_inc_general(GNR_GUESS_LOCAL_RUNNING); + + guess_event_fire(gq, TRUE); return gq; } /** - * Map iterator to free hosts. + * Hash set iterator to free hosts. */ static void -guess_host_map_free(void *key, void *unused_value, void *unused_u) +guess_host_set_free(const void *key, void *unused_u) { - gnet_host_t *h = key; + const gnet_host_t *h = key; - (void) unused_value; (void) unused_u; atom_host_free(h); @@ -3451,7 +5449,7 @@ * Hash list iterator to free hosts. */ static void -guess_host_map_free1(void *key, void *unused_u) +guess_host_map_free(void *key, void *unused_u) { gnet_host_t *h = key; @@ -3468,12 +5466,20 @@ { guess_check(gq); - map_foreach(gq->queried, guess_host_map_free, NULL); - hash_list_foreach(gq->pool, guess_host_map_free1, NULL); + hset_foreach(gq->queried, guess_host_set_free, NULL); + hset_foreach(gq->deferred, guess_host_set_free, NULL); + hash_list_foreach(gq->pool, guess_host_map_free, NULL); - g_hash_table_remove(gmuid, gq->muid); + /* + * Let the old MUID of the query linger for a while so that we can + * process hits coming late and not consider them as spam (unrequested). + */ + + hikset_remove(gmuid, gq->muid); + aging_insert(guess_old_muids, atom_guid_get(gq->muid), int_to_pointer(1)); - map_destroy_null(&gq->queried); + hset_free_null(&gq->queried); + hset_free_null(&gq->deferred); hash_list_free(&gq->pool); atom_str_free_null(&gq->query); atom_guid_free_null(&gq->muid); @@ -3482,12 +5488,12 @@ cq_cancel(&gq->delay_ev); if (!(gq->flags & GQ_F_DONT_REMOVE)) - g_hash_table_remove(gqueries, &gq->gid); + hevset_remove(gqueries, &gq->gid); gq->magic = 0; WFREE(gq); - gnet_stats_count_general(GNR_GUESS_LOCAL_RUNNING, -1); + gnet_stats_dec_general(GNR_GUESS_LOCAL_RUNNING); } /** @@ -3497,7 +5503,7 @@ * @param callback whether to invoke the completion callback */ void -guess_cancel(guess_t **gq_ptr, gboolean callback) +guess_cancel(guess_t **gq_ptr, bool callback) { guess_t *gq; @@ -3516,7 +5522,11 @@ if (callback) (*gq->cb)(gq->arg); /* Let them know query has ended */ + hash_list_remove(load_pending, gq); + guess_final_stats(gq); + guess_stats_fire(gq); + guess_event_fire(gq, FALSE); guess_free(gq); *gq_ptr = NULL; } @@ -3527,17 +5537,20 @@ * `hcount' hosts from out caught list. * * @param net network preference + * @param add_02 whether to add a randomly selected cached 0.2 server * @param hosts base of vector to fill * @param hcount size of host vector * * @return amount of hosts filled */ int -guess_fill_caught_array(host_net_t net, gnet_host_t *hosts, int hcount) +guess_fill_caught_array(host_net_t net, + bool add_02, gnet_host_t *hosts, int hcount) { int i, filled, added = 0; hash_list_iter_t *iter; - GHashTable *seen_host = g_hash_table_new(gnet_host_hash, gnet_host_eq); + hset_t *seen_host = + hset_create_any(gnet_host_hash, gnet_host_hash2, gnet_host_equal); filled = hcache_fill_caught_array(net, HOST_GUESS, hosts, hcount); iter = hash_list_iterator(link_cache); @@ -3550,7 +5563,7 @@ if (NULL == h) break; - if (gm_hash_table_contains(seen_host, h)) + if (hset_contains(seen_host, h)) goto next; if (net != HOST_NET_BOTH) { @@ -3569,32 +5582,60 @@ /* Had not enough hosts in the global cache */ gnet_host_copy(&hostsi, h); added++; - } else if (random_u32() % 100 < 65) { + } else if (random_value(99) < 65) { gnet_host_copy(&hostsi, h); } - g_hash_table_insert(seen_host, &hostsi, int_to_pointer(1)); + hset_insert(seen_host, &hostsi); } hash_list_iter_release(&iter); - gm_hash_table_destroy_null(&seen_host); /* Keys point into vector */ + + /* + * When requested to add 0.2 servers, propagate at least one random + * 0.2 host in the vector, if we have any. The rationale is that these + * hosts are propagating more than one host in replies and therefore + * help out the GUESS host collection algorithm, hence it's good to + * spread them to other 0.2 hosts. + */ g_assert(filled + added <= hcount); + if (add_02) { + size_t count = filled + added; + const gnet_host_t *h; + + h = guess_cache_select(); + + if (h != NULL && !hset_contains(seen_host, h)) { + i = G_LIKELY(count != 0) ? random_value(count - 1) : 0; + gnet_host_copy(&hostsi, h); + if G_UNLIKELY(0 == count) + added++; + + if (GNET_PROPERTY(guess_server_debug) > 9) { + g_debug("GUESS added 0.2 server %s (%zu cached) " + "at slot #%d/%zu", + gnet_host_to_string(h), guess_cache_count(), i, count); + } + } + } + + hset_free_null(&seen_host); /* Keys point into vector */ + return filled + added; /* Amount of hosts we filled in */ } /** - * Got a GUESS intrduction ping from node. + * Got a GUESS introduction ping from node. * * @param n the node which sent the ping * @parma buf start of the "GUE" payload * @param len length of the "GUE" payload */ void -guess_introduction_ping(const struct gnutella_node *n, - const char *buf, guint16 len) +guess_introduction_ping(const gnutella_node_t *n, const char *buf, uint16 len) { - guint16 port; + uint16 port; gnet_host_t host; /* @@ -3617,23 +5658,181 @@ */ gnet_host_set(&host, n->addr, port); - guess_traffic_from(&host); + guess_traffic_from(&host, 0); guess_host_set_v2(&host); } /** + * Got a cached hub address from a /KHL message. + */ +void +guess_add_hub(host_addr_t addr, uint16 port) +{ + gnet_host_t host; + bool ok; + + gnet_host_set(&host, addr, port); + + if (guess_should_skip(&host)) + return; + + /* + * Do not query a discovered G2 host if we have a non-expired query key, + * since there is no notion of "introduction ping" for G2. + */ + + if (guess_has_valid_qk(&host)) + return; + + ok = guess_request_qk(&host, FALSE, TRUE); + + if (GNET_PROPERTY(guess_client_debug) > 1) { + g_debug("GUESS requesting key from new hub %s%s", + host_addr_port_to_string(addr, port), ok ? "" : " (FAILED)"); + } +} + +/** + * Context for guess_host_available(). + */ +struct guess_host_avail_context { + pslist_t *queries; /* Queries to which host was put back into */ + const gnet_host_t *host; /* The host that is now available to queries */ +}; + +static void +guess_host_available_helper(void *val, void *udata) +{ + guess_t *gq = val; + struct guess_host_avail_context *ctx = udata; + const gnet_host_t *hp; + + guess_check(gq); + + hp = hset_lookup(gq->deferred, ctx->host); + + if (hp != NULL) { + g_assert(!hash_list_contains(gq->pool, ctx->host)); + g_assert(!hset_contains(gq->queried, ctx->host)); + + if (GNET_PROPERTY(guess_client_debug) > 5) { + g_debug("GUESS QUERY%s %smoving deferred %s back to pool", + nid_to_string(&gq->gid), + (gq->flags & GQ_F_DELAYED) ? "(delayed) " : "", + gnet_host_to_string(ctx->host)); + } + + hash_list_prepend(gq->pool, hp); + hset_remove(gq->deferred, hp); + + /* + * We only record non-delayed queries since we're going to iterate + * on one of the list members later on. + */ + + if (!(gq->flags & GQ_F_DELAYED)) + ctx->queries = pslist_prepend(ctx->queries, gq); + } +} + +/** + * A deferred host is now available for querying. + */ +static void +guess_host_available(void *key, void *unused_value) +{ + const gnet_host_t *host = key; + guess_t *gq; + struct guess_host_avail_context ctx; + + (void) unused_value; + + if G_UNLIKELY(NULL == db_qkdata) + goto done; /* GUESS layer shut down */ + + /* + * Put back the host into the pool of all the running queries, if it + * has not already been queried there. + */ + + ZERO(&ctx); + ctx.host = host; + + hevset_foreach(gqueries, guess_host_available_helper, &ctx); + + /* + * Pick a random query among the ones where we put the host back and + * iterate on it since we have added a host to the pool. + */ + + gq = pslist_random_data(ctx.queries); + if (gq != NULL) + guess_iterate(gq); + + pslist_free_null(&ctx.queries); + + /* + * This is also a free routine for the host. + */ + +done: + atom_host_free(host); +} + +/** + * Invalidate all the currently cached query keys. + */ +void +guess_invalidate_keys(void) +{ + if (GNET_PROPERTY(guess_client_debug)) + g_debug("GUESS cached query keys now invalidated (IP/port changed)"); + + /* + * This is imperfect because it will not invalidate the query keys we + * cached in the current second, but that's OK because whenever the query + * key is invalid, the remote host will inform us and we'll request a new + * one on the fly. But this simple logic catches most of the cached keys, + * hence it's good enough for our purpose here. + * + * Note that since the threshold is initially set with the latest IP change + * time, and we don't remember the time at which the listening port changes, + * we won't invalidate the cached query keys at the next startup. Again, + * this is OK because we will know our query key was invalid, somehow. + * + * The aim is to catch the most common case of query key invalidation: + * hosts with a dynamic IP address. Port changes within the session will + * be caught however and also invalidate all the keys (for the remaining + * of the session). + * --RAM, 2014-03-05 + */ + + guess_qk_threshtime = tm_time(); +} + +/** + * Initialize a GUESS cache. + */ +static void G_COLD +guess_cache_init(struct guess_cache *gc) +{ + gc->hs = hset_create_any(gnet_host_hash, gnet_host_hash2, gnet_host_equal); + XMALLOC0_ARRAY(gc->cache, gc->max); +} + +/** * Initialize the GUESS client layer. */ -G_GNUC_COLD void +void G_COLD guess_init(void) { dbstore_kv_t kv = { sizeof(gnet_host_t), gnet_host_length, sizeof(struct qkdata), - sizeof(struct qkdata) + sizeof(guint8) + MAX_INT_VAL(guint8) }; + sizeof(struct qkdata) + sizeof(uint8) + MAX_INT_VAL(uint8) }; dbstore_packing_t packing = { serialize_qkdata, deserialize_qkdata, free_qkdata }; - if (!GNET_PROPERTY(enable_guess)) + if (!GNET_PROPERTY(enable_guess) && !GNET_PROPERTY(enable_g2)) return; if (db_qkdata != NULL) @@ -3641,15 +5840,37 @@ g_assert(NULL == guess_qk_prune_ev); - /* Legacy: remove after 0.97 -- RAM, 2011-05-03 */ - dbstore_move(settings_config_dir(), settings_gnet_db_dir(), db_qkdata_base); + TOKENIZE_CHECK_SORTED(g2_qa_children); + + /* + * Compute the latest time when our IP address has been determined, which + * will set the initial threshold for assessing whether a query key is + * still valid. + */ + + { + time_t t4, t6; + + gnet_prop_get_timestamp_val(PROP_CURRENT_IP_STAMP, &t4); + gnet_prop_get_timestamp_val(PROP_CURRENT_IP6_STAMP, &t6); + + guess_qk_threshtime = MAX(t4, t6); + + if (GNET_PROPERTY(guess_client_debug)) { + g_debug("GUESS query key threshold time is %s", + timestamp_to_string(guess_qk_threshtime)); + } + } db_qkdata = dbstore_open(db_qkdata_what, settings_gnet_db_dir(), db_qkdata_base, kv, packing, GUESS_QK_DB_CACHE_SIZE, - gnet_host_hash, gnet_host_eq, FALSE); + gnet_host_hash, gnet_host_equal, FALSE); dbmw_set_map_cache(db_qkdata, GUESS_QK_MAP_CACHE_SIZE); + guess_cache_init(&guess_02_cache); + guess_cache_init(&guess_g2_cache); + guess_qk_prune_old(); guess_qk_prune_ev = cq_periodic_main_add( @@ -3658,16 +5879,26 @@ GUESS_CHECK_PERIOD, guess_periodic_check, NULL); guess_sync_ev = cq_periodic_main_add( GUESS_SYNC_PERIOD, guess_periodic_sync, NULL); + guess_load_ev = cq_periodic_main_add( + GUESS_DBLOAD_PERIOD, guess_periodic_load, NULL); guess_bw_ev = cq_periodic_main_add(1000, guess_periodic_bw, NULL); - gqueries = g_hash_table_new(nid_hash, nid_equal); - gmuid = g_hash_table_new(guid_hash, guid_eq); - link_cache = hash_list_new(gnet_host_hash, gnet_host_eq); - pending = g_hash_table_new(guess_rpc_key_hash, guess_rpc_key_eq); + gqueries = hevset_create_any( + offsetof(guess_t, gid), nid_hash, nid_hash2, nid_equal); + gmuid = hikset_create( + offsetof(guess_t, muid), HASH_KEY_FIXED, GUID_RAW_SIZE); + link_cache = hash_list_new(gnet_host_hash, gnet_host_equal); + alive_cache = hash_list_new(gnet_host_hash, gnet_host_equal); + load_pending = hash_list_new(pointer_hash, NULL); + pending = htable_create_any(guess_rpc_key_hash, NULL, guess_rpc_key_eq); guess_qk_reqs = aging_make(GUESS_QK_FREQ, - gnet_host_hash, gnet_host_eq, gnet_host_free_atom2); + gnet_host_hash, gnet_host_equal, gnet_host_free_atom2); guess_alien = aging_make(GUESS_ALIEN_FREQ, - gnet_host_hash, gnet_host_eq, gnet_host_free_atom2); + gnet_host_hash, gnet_host_equal, gnet_host_free_atom2); + guess_old_muids = + aging_make(GUESS_MUID_LINGER, guid_hash, guid_eq, guid_free_atom2); + guess_deferred = + ripening_make(gnet_host_hash, gnet_host_equal, guess_host_available); guess_load_link_cache(); guess_check_link_cache(); @@ -3677,12 +5908,11 @@ * Hashtable iteration callback to free the guess_t object held as the value. */ static void -guess_free_query(void *key, void *value, void *unused_data) +guess_free_query(void *value, void *unused_data) { guess_t *gq = value; guess_check(gq); - g_assert(key == &gq->gid); (void) unused_data; @@ -3694,17 +5924,18 @@ * Free RPC callback descriptor. */ static void -guess_rpc_free_kv(void *key, void *val, void *unused_x) +guess_rpc_free_kv(const void *key, void *val, void *unused_x) { (void) unused_x; - guess_rpc_destroy(val, key); + guess_rpc_key_free(deconstify_pointer(key)); + guess_rpc_destroy(val); } /* * Shutdown the GUESS client layer. */ -G_GNUC_COLD void +void G_COLD guess_close(void) { if (NULL == db_qkdata) @@ -3715,17 +5946,24 @@ cq_periodic_remove(&guess_qk_prune_ev); cq_periodic_remove(&guess_check_ev); cq_periodic_remove(&guess_sync_ev); + cq_periodic_remove(&guess_load_ev); cq_periodic_remove(&guess_bw_ev); wq_cancel(&guess_new_host_ev); + guess_cache_free(&guess_02_cache); + guess_cache_free(&guess_g2_cache); - g_hash_table_foreach(gqueries, guess_free_query, NULL); - g_hash_table_foreach(pending, guess_rpc_free_kv, NULL); - gm_hash_table_destroy_null(&gqueries); - gm_hash_table_destroy_null(&gmuid); - gm_hash_table_destroy_null(&pending); + hevset_foreach(gqueries, guess_free_query, NULL); + htable_foreach(pending, guess_rpc_free_kv, NULL); + hevset_free_null(&gqueries); + hikset_free_null(&gmuid); + htable_free_null(&pending); aging_destroy(&guess_qk_reqs); aging_destroy(&guess_alien); + aging_destroy(&guess_old_muids); + ripening_destroy(&guess_deferred); hash_list_free_all(&link_cache, gnet_host_free_atom); + hash_list_free_all(&alive_cache, gnet_host_free_atom); + hash_list_free(&load_pending); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/guess.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/guess.h
Changed
@@ -62,21 +62,32 @@ guess_t *guess_create(gnet_search_t sh, const struct guid *muid, const char *query, unsigned mtype, guess_query_cb_t cb, void *arg); -void guess_cancel(guess_t **gq_ptr, gboolean callback); +void guess_cancel(guess_t **gq_ptr, bool callback); void guess_end_when_starving(guess_t *gq); -gboolean guess_is_search_muid(const guid_t *muid); -void guess_got_results(const guid_t *muid, guint32 hits); -void guess_kept_results(const guid_t *muid, guint32 kept); -gboolean guess_rpc_handle(struct gnutella_node *n); +bool guess_is_search_muid(const guid_t *muid); +void guess_got_results(const guid_t *muid, uint32 hits); +void guess_kept_results(const guid_t *muid, uint32 kept); +bool guess_rpc_handle(struct gnutella_node *n); void guess_introduction_ping(const struct gnutella_node *n, - const char *buf, guint16 len); + const char *buf, uint16 len); +void guess_add_hub(host_addr_t addr, uint16 port); +bool guess_already_queried(const guess_t *gq, + const host_addr_t addr, uint16 port); +void guess_invalidate_keys(void); -int guess_fill_caught_array(host_net_t net, gnet_host_t *hosts, int hcount); +struct g2_tree; +struct guid; + +bool guess_late_qa(const struct gnutella_node *n, + const struct g2_tree *t, const struct guid *muid); + +int guess_fill_caught_array(host_net_t net, + bool add_02, gnet_host_t *hosts, int hcount); /** * Is GUESS querying enabled? */ -static inline gboolean +static inline bool guess_query_enabled(void) { return GNET_PROPERTY(enable_udp) && GNET_PROPERTY(enable_guess) &&
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/guid.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/guid.c
Changed
@@ -49,6 +49,8 @@ #include "lib/dbmw.h" #include "lib/dbstore.h" #include "lib/endian.h" +#include "lib/entropy.h" +#include "lib/hikset.h" #include "lib/misc.h" #include "lib/pmsg.h" #include "lib/product.h" @@ -104,10 +106,10 @@ static cperiodic_t *guid_prune_ev; /**< Bad GUID pruning */ static cperiodic_t *guid_sync_ev; /**< Bad GUID DB sync */ -const struct guid blank_guid; +const guid_t blank_guid; -static guint8 syndrome_table256; -static guint16 gtkg_version_mark; +static uint8 syndrome_table256; +static uint16 gtkg_version_mark; /** * Serialization routine for guiddata. @@ -129,7 +131,7 @@ deserialize_guiddata(bstr_t *bs, void *valptr, size_t len) { struct guiddata *gd = valptr; - guint8 version; + uint8 version; g_assert(sizeof *gd == len); @@ -139,7 +141,7 @@ } /** - * Generate a table of CRC-8 syndromes for all possible input bytes. + * Generate a table of HEC syndromes for all possible input bytes. */ static void guid_gen_syndrome_table(void) @@ -147,14 +149,56 @@ unsigned i; unsigned j; + /* + * The code below is wrong but cannot be fixed lightly without making all + * deployed GTKGs obsolete (it would break their ability to recognize + * a valid GTKG GUID as such). + * + * In the loop below, the code fragment: + * + * syn <<= 1; + * if (syn & 0x80) + * syn ^= HEC_GENERATOR; + * + * is WRONG. It should have been: + * + * if (syn & 0x80) + * syn = (syn << 1) ^ HEC_GENERATOR; + * else + * syn = (syn << 1); + * + * or rather: + * + * syn <<= 1; + * if (syn & 0x100) + * syn ^= HEC_GENERATOR; + * + * which is what I originally intended to write by taking out the left + * shift and trying to factorize it, but my stupid mistake went uncaught + * until I re-read that code now, 10 years later, accidentally. + * + * So we're not really computing the CRC-8 with the intended polynomial. + * I'm not sure what we're actually computing, the polynomial division + * being incorrect since the remainders (aka syndromes) are incorrect. + * + * It does not matter much, because we're not following a standard here. + * We just need to keep compatible with the computation done by other + * GTKGs out there, which can be viewed as some kind of special hashcode. + * + * Anyway, we're calling that a HEC (Header Error Control), not a CRC... + * + * --RAM, 2013-12-30 + */ + for (i = 0; i < 256; i++) { unsigned syn = i; for (j = 0; j < 8; j++) { + /* This is wrong (see long comment above) but DO NOT FIX yet! */ syn <<= 1; if (syn & 0x80) syn ^= HEC_GENERATOR; } - syndrome_tablei = (guint8) syn; + syndrome_tablei = (uint8) syn; } } @@ -162,18 +206,20 @@ * Encode major/minor version into 16 bits. * If `rel' is true, we're a release, otherwise we're unstable or a beta. */ -static guint16 -guid_gtkg_encode_version(unsigned major, unsigned minor, gboolean rel) +static uint16 +guid_gtkg_encode_version(unsigned major, unsigned minor, bool rel) { - guint8 low; - guint8 high; + uint8 low; + uint8 high; g_assert(major < 0x10); g_assert(minor < 0x80); /* * Low byte of result is the minor number. - * MSB is set for unstable releases. + * + * The MSB is set for unstable releases, which means minor versions + * can grow up to 127 only. */ low = minor; @@ -193,14 +239,20 @@ return (high << 8) | low; } -static inline guint8 -calculate_hec(const struct guid *guid, size_t offset) +/* + * Compute HEC for GUID bytes ``start'' to ``end'', inclusive. + */ +static inline uint8 +calculate_hec(const guid_t *guid, int start, int end) { int i; - guint8 hec = 0; + uint8 hec = 0; + + g_assert(start >= 0); + g_assert(end <= 15); - for (i = 0; i < 15; i++) - hec = syndrome_tablehec ^ peek_u8(&guid->vi + offset); + for (i = start; i <= end; i++) + hec = syndrome_tablehec ^ peek_u8(&guid->vi); return hec ^ HEC_GTKG_MASK; } @@ -208,19 +260,40 @@ /** * Compute GUID's HEC over bytes 1..15. */ -static guint8 -guid_hec(const struct guid *guid) +static uint8 +guid_hec(const guid_t *guid) { - return calculate_hec(guid, 1); + return calculate_hec(guid, 1, 15); } /** * Compute GUID's HEC over bytes 0..14. + * + * This is the old way of computing the GUID HEC, and is no longer deemed + * appropriate because it does not work when the query is OOB proxied by + * an ultrapeer (the IP:port field being superseded later). */ -static guint8 -guid_hec_oob(const struct guid *guid) +static uint8 +guid_hec_oob_legacy(const guid_t *guid) { - return calculate_hec(guid, 0); + return calculate_hec(guid, 0, 14); +} + +/** + * Compute GUID's HEC for a query, leaving out bytes 0-3 (used in OOB queries + * to add the IP address) and bytes 13-14 (used to carry the port number in + * OOB queries), the HEC being stored in byte 15. + * + * That way, even if the query is later OOB-proxied by someone, we will not + * alter the HEC's value and preserve our ability to recognize a marked GUID. + * + * Note that starting 2012-10-07, this is the new way to encode MUIDs in + * queries, even for those not initially sent out with OOB. + */ +static uint8 +guid_hec_oob(const guid_t *guid) +{ + return calculate_hec(guid, 4, 12); } /** @@ -232,7 +305,7 @@ * specially to indicate we're modern nodes. */ static void -guid_flag_modern(struct guid *muid) +guid_flag_modern(guid_t *muid) { /* * We're a "modern" client, meaning we're not Gnutella 0.56. @@ -253,13 +326,26 @@ * Byte 0 becomes the HEC of the remaining 15 bytes. */ static void -guid_flag_gtkg(struct guid *guid) +guid_flag_gtkg(guid_t *guid) { poke_be16(&guid->v2, gtkg_version_mark); guid->v0 = guid_hec(guid); } /** + * Flag a MUID for OOB queries as being from GTKG, by patching `guid' in place. + * + * Bytes 4/5 become the GTKG version mark. + * Byte 15 becomes the HEC of the leading 15 bytes. + */ +static void +guid_flag_oob_gtkg(guid_t *muid) +{ + poke_be16(&muid->v4, gtkg_version_mark); + muid->v15 = guid_hec_oob(muid); /* guid_hec() skips leading byte */ +} + +/** * Decode major/minor and release information from the specified two * contiguous GUID bytes. * @@ -271,21 +357,21 @@ * * @return whether we recognized a GTKG markup. */ -static gboolean -guid_extract_gtkg_info(const struct guid *guid, size_t start, - guint8 *majp, guint8 *minp, gboolean *relp) +static bool +guid_extract_gtkg_info(const guid_t *guid, size_t start, + uint8 *majp, uint8 *minp, bool *relp) { - guint8 major; - guint8 minor; - gboolean release; - guint16 mark; - guint16 xmark; - guint8 product_major; + uint8 major; + uint8 minor; + bool release; + uint16 mark; + uint16 xmark; + uint8 prod_major; g_assert(start < GUID_RAW_SIZE - 1); major = peek_u8(&guid->vstart) & 0x0f; minor = peek_u8(&guid->vstart + 1) & 0x7f; - release = (peek_u8(&guid->vstart + 1) & 0x80) ? FALSE : TRUE; + release = booleanize(0 == (peek_u8(&guid->vstart + 1) & 0x80)); mark = guid_gtkg_encode_version(major, minor, release); xmark = peek_be16(&guid->vstart); @@ -300,10 +386,11 @@ * release per year, this strengthens the positive check. */ - product_major = product_get_major(); + prod_major = product_major(); - if (major != product_major) { - if (major + 1 != product_major || major - 1 != product_major) + if (major != prod_major) { + int8 delta = prod_major - major; + if (delta < -1 || delta > 1) return FALSE; } @@ -323,9 +410,8 @@ * Test whether GUID is that of GTKG, and extract version major/minor, along * with release status provided the `majp', `minp' and `relp' are non-NULL. */ -gboolean -guid_is_gtkg(const struct guid *guid, - guint8 *majp, guint8 *minp, gboolean *relp) +bool +guid_is_gtkg(const guid_t *guid, uint8 *majp, uint8 *minp, bool *relp) { if (peek_u8(&guid->v0) != guid_hec(guid)) return FALSE; @@ -336,8 +422,8 @@ /** * Test whether a GTKG MUID in a Query is marked as being a retry. */ -gboolean -guid_is_requery(const struct guid *guid) +bool +guid_is_requery(const guid_t *guid) { return (peek_u8(&guid->v15) & GUID_REQUERY) ? TRUE : FALSE; } @@ -345,8 +431,8 @@ /** * Test whether a GUID is blank. */ -gboolean -guid_is_blank(const struct guid *guid) +bool +guid_is_blank(const guid_t *guid) { size_t i; @@ -363,7 +449,7 @@ * Generate a new random GUID, flagged as GTKG. */ void -guid_random_muid(struct guid *muid) +guid_random_muid(guid_t *muid) { guid_random_fill(muid); guid_flag_gtkg(muid); /* Mark as being from GTKG */ @@ -373,7 +459,7 @@ * Generate a new random (modern) message ID for pings. */ void -guid_ping_muid(struct guid *muid) +guid_ping_muid(guid_t *muid) { guid_random_fill(muid); guid_flag_modern(muid); @@ -385,66 +471,110 @@ * If `initial' is false, this is a requery. */ void -guid_query_muid(struct guid *muid, gboolean initial) +guid_query_muid(guid_t *muid, bool initial) { - guint8 v; - guid_random_fill(muid); - v = peek_u8(&muid->v15); + /* + * Since 2012-10-07, we call guid_flag_oob_gtkg() instead of + * guid_flag_gtkg() to mark the MUID of the query, regardless of + * whether it is sent out as an OOB query. + * + * That way, even if it is OOB-proxied by an ultrapeer, we will + * be able to recognize the markup. + */ + + guid_flag_oob_gtkg(muid); /* Mark as being from GTKG */ + if (initial) - v &= ~GUID_REQUERY; + muid->v15 &= ~GUID_REQUERY; else - v |= GUID_REQUERY; - muid->v15 = v; - guid_flag_gtkg(muid); /* Mark as being from GTKG */ + muid->v15 |= GUID_REQUERY; } /** - * Flag a MUID for OOB queries as being from GTKG, by patching `guid' in place. + * Generate a new GUID atom that is not already conflicting with any other + * GUID recorded in the supplied hikset (hash set with values pointing to + * the GUID key). * - * Bytes 4/5 become the GTKG version mark. - * Byte 15 becomes the HEC of the leading 15 bytes. + * @attention + * It is up to the caller to later insert the value referencing this GUID in + * the hikset to prevent further duplicates. To avoid race conditions between + * the checking of the hiset and the insertion, the hikset should be locked + * if it is shared by multiple threads. + * + * @param hik the hikset against which we need to check for duplicates + * @param gtkg whether to flag the GUID as being generated by GTKG. + * + * @return a new unique GUID atom. */ -static void -guid_flag_oob_gtkg(struct guid *guid) +const guid_t * +guid_unique_atom(const hikset_t *hik, bool gtkg) { - poke_be16(&guid->v4, gtkg_version_mark); - guid->v15 = guid_hec_oob(guid); /* guid_hec() skips leading byte */ + int i; + guid_t guid; + + entropy_harvest_time(); + + for (i = 0; i < 100; i++) { + guid_random_fill(&guid); + if (gtkg) + guid_flag_gtkg(&guid); /* Mark as being from GTKG */ + + if (NULL == hikset_lookup(hik, &guid)) + return atom_guid_get(&guid); + } + + g_error("%s(): no luck with random number generator", G_STRFUNC); } /** * Test whether GUID is that of GTKG, and extract version major/minor, along * with release status provided the `majp', `minp' and `relp' are non-NULL. */ -static gboolean -guid_oob_is_gtkg(const struct guid *guid, - guint8 *majp, guint8 *minp, gboolean *relp) +static bool +guid_oob_is_gtkg(const guid_t *guid, uint8 *majp, uint8 *minp, bool *relp) { + uint8 hec; + + if (!guid_extract_gtkg_info(guid, 4, majp, minp, relp)) + return FALSE; /* Marking incorrect, no need to compute HEC */ + /* - * The HEC for OOB queries is made of the first 15 bytes. We can offset - * the argument to guid_hec() by 1 because that routine starts at the byte - * after its argument. + * The HEC for OOB queries was made of the first 15 bytes for versions + * up to 0.98.4u (legacy encoding). Starting with 0.98.4, we have a + * different way of encoding the HEC to preserve its integrity even in + * the advent of OOB-proxying. * * Also bit 0 of the HEC is not significant (used to mark requeries) * therefore it is masked out for comparison purposes. */ - if ( - (peek_u8(&guid->v15) & ~GUID_REQUERY) != - (guid_hec_oob(guid) & ~GUID_REQUERY) - ) - return FALSE; + hec = peek_u8(&guid->v15) & ~GUID_REQUERY; - return guid_extract_gtkg_info(guid, 4, majp, minp, relp); + if (*majp >0 || *minp >= 99) + return booleanize((guid_hec_oob(guid) & ~GUID_REQUERY) == hec); + + /* + * Transition period for servents earlier than 0.99: try the legacy marking + * for 0.97 and earlier. For 0.98, try the legacy marking first, then the + * new marking. + */ + + if (*minp <= 97) + return booleanize((guid_hec_oob_legacy(guid) & ~GUID_REQUERY) == hec); + + return booleanize((guid_hec_oob_legacy(guid) & ~GUID_REQUERY) == hec) || + booleanize((guid_hec_oob(guid) & ~GUID_REQUERY) == hec); } /** * Check whether the MUID of a query is that of GTKG. * - * GTKG uses GUID tagging, but unfortunately, the bytes uses to store the + * GTKG uses MUID tagging, but unfortunately, the bytes used to store the * IP and port for OOB query hit delivery conflict with the bytes used for - * the tagging. Hence the need for a special routine. + * the tagging of other MUIDs. Hence the need for a special routine, dedicated + * to query MUID markup. * * @param guid the MUID of the message * @param oob whether the query requests OOB query hit delivery @@ -452,30 +582,30 @@ * @param minp where the minor release version is written, if GTKG * @param relp where the release indicator gets written, if GTKG */ -gboolean -guid_query_muid_is_gtkg(const struct guid *guid, gboolean oob, - guint8 *majp, guint8 *minp, gboolean *relp) +bool +guid_query_muid_is_gtkg(const guid_t *guid, bool oob, + uint8 *majp, uint8 *minp, bool *relp) { - gboolean is_gtkg; + /* + * We used to encode the query MUID differently depending on whether OOB + * queries were used or just plain ones, but we are now always using + * an encoding and a tagging that ignores the bytes which can be superseded + * by OOB proxying. + * --RAM, 2012-10-07 + */ - if (oob) - return guid_oob_is_gtkg(guid, majp, minp, relp); + if (guid_oob_is_gtkg(guid, majp, minp, relp)) + return TRUE; /* - * There is an ambiguity if the query is not marked as being OOB, - * because GTKG can initially select an OOB-encoding of the GUID yet - * not emit the query with the OOB flag because it realizes the servent - * is UDP-firewalled, or the user changed his mind and turned off OOB - * queries. - * - * Therefore, try to decode as OOB first, and if it fails being recognized - * as a GTKG marking, use the plain old markup instead. + * For legacy GTKG servents which may have encoded non-OOB queries + * differently. This will only work if the query was not flagged for + * OOB, since then our legacy markup is superseded! + * --RAM, 2012-10-07 */ - is_gtkg = guid_oob_is_gtkg(guid, majp, minp, relp); - - if (is_gtkg) - return TRUE; + if (oob) + return FALSE; return guid_is_gtkg(guid, majp, minp, relp); /* Plain old markup */ } @@ -489,10 +619,10 @@ * Byte 15 holds an HEC with bit 0 indicating a requery. */ void -guid_query_oob_muid(struct guid *muid, const host_addr_t addr, guint16 port, - gboolean initial) +guid_query_oob_muid(guid_t *muid, const host_addr_t addr, uint16 port, + bool initial) { - guint32 ip; + uint32 ip; g_assert(host_addr_is_ipv4(addr)); @@ -518,8 +648,7 @@ * Bytes 13 and 14 are the little endian representation of the port. */ void -guid_oob_get_addr_port(const struct guid *guid, - host_addr_t *addr, guint16 *port) +guid_oob_get_addr_port(const guid_t *guid, host_addr_t *addr, uint16 *port) { if (addr) { /* @@ -537,17 +666,27 @@ /** * Is GUID banned? */ -gboolean -guid_is_banned(const struct guid *guid) +bool +guid_is_banned(const guid_t *guid) { return dbmw_exists(db_guid, guid); } /** + * Free GUID atom -- aging table callback version. + */ +void +guid_free_atom2(void *guid, void *unused) +{ + (void) unused; + atom_guid_free(guid); +} + +/** * Get banned GUID data from database, returning NULL if not found. */ static struct guiddata * -get_guiddata(const struct guid *guid) +get_guiddata(const guid_t *guid) { struct guiddata *gd; @@ -555,7 +694,8 @@ if (NULL == gd) { if (dbmw_has_ioerr(db_guid)) { - g_warning("DBMW \"%s\" I/O error", dbmw_name(db_guid)); + s_warning_once_per(LOG_PERIOD_MINUTE, + "DBMW \"%s\" I/O error", dbmw_name(db_guid)); } } @@ -567,7 +707,7 @@ * it as being worth banning. */ void -guid_add_banned(const struct guid *guid) +guid_add_banned(const guid_t *guid) { struct guiddata *gd; struct guiddata new_gd; @@ -577,7 +717,7 @@ if (NULL == gd) { gd = &new_gd; gd->create_time = gd->last_time = tm_time(); - gnet_stats_count_general(GNR_BANNED_GUID_HELD, +1); + gnet_stats_inc_general(GNR_BANNED_GUID_HELD); if (GNET_PROPERTY(guid_debug)) { g_debug("GUID banning %s", guid_hex_str(guid)); @@ -593,14 +733,14 @@ * DBMW foreach iterator to remove old entries. * @return TRUE if entry must be deleted. */ -static gboolean +static bool guid_prune_old_entries(void *key, void *value, size_t u_len, void *u_data) { const guid_t *guid = key; const struct guiddata *gd = value; time_delta_t d; double p = 0.0; - gboolean expired; + bool expired; (void) u_len; (void) u_data; @@ -650,7 +790,7 @@ /** * Callout queue periodic event to expire old entries. */ -static gboolean +static bool guid_periodic_prune(void *unused_obj) { (void) unused_obj; @@ -662,7 +802,7 @@ /** * Callout queue periodic event to synchronize the disk image. */ -static gboolean +static bool guid_periodic_sync(void *unused_obj) { (void) unused_obj; @@ -674,7 +814,7 @@ /** * Initialize GUID management. */ -G_GNUC_COLD void +void G_COLD guid_init(void) { dbstore_kv_t kv = { @@ -690,10 +830,9 @@ guid_gen_syndrome_table(); - rev = product_get_revchar(); + rev = product_revchar(); gtkg_version_mark = - guid_gtkg_encode_version(product_get_major(), - product_get_minor(), '\0' == rev); + guid_gtkg_encode_version(product_major(), product_minor(), '\0' == rev); if (GNET_PROPERTY(node_debug)) g_debug("GTKG version mark is 0x%x", gtkg_version_mark); @@ -724,7 +863,7 @@ /** * Close GUID management. */ -G_GNUC_COLD void +void G_COLD guid_close(void) { dbstore_close(db_guid, settings_gnet_db_dir(), db_guid_base);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/guid.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/guid.h
Changed
@@ -46,20 +46,25 @@ void guid_init(void); void guid_close(void); -gboolean guid_is_banned(const struct guid *guid); -void guid_add_banned(const struct guid *guid); +bool guid_is_banned(const guid_t *guid); +void guid_add_banned(const guid_t *guid); -gboolean guid_is_gtkg(const struct guid *xuid, - guint8 *majp, guint8 *minp, gboolean *relp); -gboolean guid_is_requery(const struct guid *xuid); -void guid_random_muid(struct guid *muid); -void guid_ping_muid(struct guid *muid); -void guid_query_muid(struct guid *muid, gboolean initial); -gboolean guid_query_muid_is_gtkg(const struct guid *guid, - gboolean oob, guint8 *majp, guint8 *minp, gboolean *relp); -void guid_query_oob_muid(struct guid *muid, - const host_addr_t addr, guint16 port, gboolean initial); -void guid_oob_get_addr_port(const struct guid *guid, - host_addr_t *addr, guint16 *port); +bool guid_is_gtkg(const guid_t *xuid, + uint8 *majp, uint8 *minp, bool *relp); +bool guid_is_requery(const guid_t *xuid); +void guid_random_muid(guid_t *muid); +void guid_ping_muid(guid_t *muid); +void guid_query_muid(guid_t *muid, bool initial); +bool guid_query_muid_is_gtkg(const guid_t *guid, + bool oob, uint8 *majp, uint8 *minp, bool *relp); +void guid_query_oob_muid(guid_t *muid, + const host_addr_t addr, uint16 port, bool initial); +void guid_oob_get_addr_port(const guid_t *guid, + host_addr_t *addr, uint16 *port); + +struct hikset; +const guid_t *guid_unique_atom(const struct hikset *hik, bool gtkg); + +void guid_free_atom2(void *guid, void *unused); #endif /* _core_guid_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/hcache.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/hcache.c
Changed
@@ -60,14 +60,17 @@ #include "settings.h" #include "ctl.h" -#include "lib/atoms.h" #include "lib/ascii.h" +#include "lib/atoms.h" #include "lib/cq.h" #include "lib/file.h" #include "lib/getdate.h" #include "lib/hashlist.h" +#include "lib/hset.h" +#include "lib/htable.h" #include "lib/path.h" #include "lib/random.h" +#include "lib/stringify.h" #include "lib/timestamp.h" #include "lib/tm.h" #include "lib/vmm.h" @@ -81,7 +84,7 @@ #define HOSTCACHE_EXPIRY (60 * 30) /* 30 minutes */ -#define HCACHE_SAVE_PERIOD 63 /**< in seconds, every minute or so */ +#define HCACHE_SAVE_PERIOD 63 /**< in seconds, every minute or so */ #define MIN_RESERVE_SIZE 1024 /**< we'd like that many pongs in reserve */ /** @@ -108,27 +111,28 @@ hcache_type_t type; /**< Cache type */ hcache_class_t class; /**< Cache class */ - gboolean addr_only; /**< Use IP only, port always 0 */ - gboolean dirty; /**< If updated since last disk flush */ + bool addr_only; /**< Use IP only, port always 0 */ + bool dirty; /**< If updated since last disk flush */ hash_list_t * hostlist; /**< Host list: IP/Port */ - guint hits; /**< Hits to the cache */ - guint misses; /**< Misses to the cache */ + uint hits; /**< Hits to the cache */ + uint misses; /**< Misses to the cache */ gnet_property_t hosts_in_catcher; /**< Property to update host count */ - int mass_update; /**< If a mass update is in progess */ + int mass_update; /**< If a mass update is in progess */ } hostcache_t; static hostcache_t *cachesHCACHE_MAX; static cperiodic_t *hcache_save_ev; static cperiodic_t *hcache_timer_ev; -static gboolean hcache_close_running = FALSE; +static bool hcache_close_running = FALSE; static const char HOSTS_FILE = "hosts"; static const char ULTRAS_FILE = "ultras"; static const char ULTRAS6_FILE = "ultras6"; static const char GUESS_FILE = "guess"; static const char GUESS6_FILE = "guess6"; +static const char G2HUBS_FILE = "g2hubs"; /** * Names of the host caches. @@ -137,26 +141,33 @@ * Has to be in the same order as in the hcache_type_t definition * in gnet_nodes.h. */ -static const char * const namesHCACHE_MAX = { - "fresh regular", - "valid regular", - "fresh IPv4 ultra", - "valid IPv4 ultra", - "fresh IPv6 ultra", - "valid IPv6 ultra", - "timeout", - "busy", - "unstable", - "alien", - "GUESS (running)", - "GUESS (introductions)", - "none", +static const char * const names = { + "fresh regular", /* HCACHE_FRESH_ANY */ + "valid regular", /* HCACHE_VALID_ANY */ + "fresh IPv4 ultra", /* HCACHE_FRESH_ULTRA */ + "valid IPv4 ultra", /* HCACHE_VALID_ULTRA */ + "fresh IPv6 ultra", /* HCACHE_FRESH_ULTRA6 */ + "valid IPv6 ultra", /* HCACHE_VALID_ULTRA6 */ + "timeout", /* HCACHE_TIMEOUT */ + "busy", /* HCACHE_BUSY */ + "unstable", /* HCACHE_UNSTABLE */ + "alien", /* HCACHE_ALIEN */ + "GUESS (IPv4 running)", /* HCACHE_GUESS */ + "GUESS (IPv4 introductions)", /* HCACHE_GUESS_INTRO */ + "GUESS (IPv6 running)", /* HCACHE_GUESS6 */ + "GUESS (IPv6 introductions)", /* HCACHE_GUESS6_INTRO */ + "fresh G2 hubs", /* HCACHE_FRESH_G2HUB */ + "valid G2 hubs", /* HCACHE_FRESH_G2HUB */ + "none", /* HCACHE_NONE */ }; -static const char * const host_type_namesHOST_MAX = { - "any", - "ultra", - "guess" +static const char * const host_type_names = { + "any", /* HOST_ANY */ + "ultra IPv4", /* HOST_ULTRA */ + "ultra IPv6", /* HOST_ULTRA6 */ + "GUESS IPv4", /* HOST_GUESS */ + "GUESS IPv6", /* HOST_GUESS6 */ + "G2 hub", /* HOST_G2HUB */ }; enum { @@ -166,7 +177,7 @@ HCACHE_STATS_MAX }; -static guint statsHCACHE_STATS_MAX; +static uint statsHCACHE_STATS_MAX; /** * Maps a host cache type to its corresponding class. @@ -191,6 +202,9 @@ case HCACHE_GUESS6: case HCACHE_GUESS6_INTRO: return HCACHE_CLASS_GUESS; + case HCACHE_VALID_G2HUB: + case HCACHE_FRESH_G2HUB: + return HCACHE_CLASS_G2; case HCACHE_NONE: case HCACHE_MAX: break; @@ -237,6 +251,11 @@ gnet_prop_set_guint32_val(hc->hosts_in_catcher, hcache_size(HOST_ULTRA6)); break; + case HCACHE_FRESH_G2HUB: + case HCACHE_VALID_G2HUB: + gnet_prop_set_guint32_val(hc->hosts_in_catcher, + hcache_size(HOST_G2HUB)); + break; case HCACHE_TIMEOUT: case HCACHE_UNSTABLE: case HCACHE_BUSY: @@ -259,7 +278,7 @@ break; case HCACHE_NONE: case HCACHE_MAX: - g_error("stop_mass_update: unknown cache type: %d", hc->type); + g_error("%s: unknown cache type: %d", G_STRFUNC, hc->type); } } } @@ -267,18 +286,24 @@ /** * Hashtable: IP/Port -> Metadata for HCACHE_CLASS_HOST. */ -static GHashTable *ht_known_hosts; +static htable_t *ht_known_hosts; + +/** + * Hashtable: IP/Port -> Metadata for HCACHE_CLASS_G2. + */ +static htable_t *ht_g2_hosts; /** * Hashtable: IP/Port -> Metadata for HCACHE_CLASS_GUESS. */ -static GHashTable *ht_guess_hosts; +static htable_t *ht_guess_hosts; -static GHashTable * +static htable_t * hcache_ht_by_class(hcache_class_t class) { switch (class) { case HCACHE_CLASS_HOST: return ht_known_hosts; + case HCACHE_CLASS_G2: return ht_g2_hosts; case HCACHE_CLASS_GUESS: return ht_guess_hosts; } g_assert_not_reached(); @@ -295,7 +320,7 @@ /** * @return TRUE if address falls within the host cache network specification. */ -gboolean +bool hcache_addr_within_net(const host_addr_t addr, host_net_t net) { switch (net) { @@ -361,21 +386,22 @@ * * @return FALSE if entry was not found in the cache. */ -static gboolean -hcache_ht_get(hcache_class_t class, const host_addr_t addr, guint16 port, +static bool +hcache_ht_get(hcache_class_t class, const host_addr_t addr, uint16 port, gnet_host_t **h, hostcache_entry_t **e) { gnet_host_t host; - gpointer k, v; - gboolean found; - GHashTable *ht; + const void *k; + void *v; + bool found; + htable_t *ht; gnet_host_set(&host, addr, port); ht = hcache_ht_by_class(class); - found = g_hash_table_lookup_extended(ht, &host, &k, &v); + found = htable_lookup_extended(ht, &host, &k, &v); if (found) { - *h = k; + *h = deconstify_pointer(k); *e = v; } @@ -399,14 +425,14 @@ hcache_ht_add(hcache_type_t type, const gnet_host_t *host) { hostcache_entry_t *hce; - GHashTable *ht; + htable_t *ht; hce = hce_alloc(); hce->type = type; hce->time_added = tm_time(); ht = hcache_ht_by_class(hcache_class(type)); - gm_hash_table_insert_const(ht, host, hce); + htable_insert(ht, host, hce); return hce; } @@ -418,18 +444,18 @@ hcache_ht_remove(hcache_class_t class, gnet_host_t *host) { hostcache_entry_t *hce; - gpointer key, value; - GHashTable *ht; + void *value; + htable_t *ht; ht = hcache_ht_by_class(class); - if (!g_hash_table_lookup_extended(ht, host, &key, &value)) { - g_carp("hcache_ht_remove: attempt to remove unknown host: %s", - gnet_host_to_string(host)); + if (!htable_lookup_extended(ht, host, NULL, &value)) { + g_carp("%s: attempt to remove unknown host: %s", + G_STRFUNC, gnet_host_to_string(host)); return; } hce = value; - g_hash_table_remove(ht, host); + htable_remove(ht, host); if (hce != NO_METADATA) hce_free(hce); @@ -444,15 +470,15 @@ static hostcache_entry_t * hcache_get_metadata(hcache_class_t class, const gnet_host_t *host) { - GHashTable *ht = hcache_ht_by_class(class); + htable_t *ht = hcache_ht_by_class(class); - return g_hash_table_lookup(ht, host); + return htable_lookup(ht, host); } /** * @return TRUE if the host is in one of the "bad hosts" caches. */ -gboolean +bool hcache_node_is_bad(const host_addr_t addr) { hostcache_entry_t *hce; @@ -495,13 +521,16 @@ hcache_move_entries(hostcache_t *to, hostcache_t *from) { hash_list_iter_t *iter; - gpointer item; + void *item; g_assert(to != NULL); g_assert(from != NULL); g_assert(hash_list_length(to->hostlist) == 0); g_assert(to->class == from->class); + start_mass_update(to); + start_mass_update(from); + hash_list_free(&to->hostlist); to->hostlist = from->hostlist; from->hostlist = hash_list_new(NULL, NULL); @@ -522,6 +551,9 @@ hce->type = to->type; } + stop_mass_update(to); + stop_mass_update(from); + hash_list_iter_release(&iter); } @@ -535,7 +567,7 @@ * * @return TRUE if host are available in hc after the call. */ -static gboolean +static bool hcache_require_caught(hostcache_t *hc) { g_assert(NULL != hc); @@ -570,19 +602,16 @@ static void hcache_unlink_host(hostcache_t *hc, gnet_host_t *host) { - gconstpointer orig_key; - + const void *orig_key; + g_assert(hc->hostlist != NULL); g_assert(hash_list_length(hc->hostlist) > 0); orig_key = hash_list_remove(hc->hostlist, host); g_assert(orig_key); - if (hc->mass_update == 0) { - guint32 cur; - gnet_prop_get_guint32_val(hc->hosts_in_catcher, &cur); - gnet_prop_set_guint32_val(hc->hosts_in_catcher, cur - 1); - } + if (hc->mass_update == 0) + gnet_prop_decr_guint32(hc->hosts_in_catcher); hc->dirty = TRUE; hcache_ht_remove(hc->class, host); @@ -601,7 +630,8 @@ const char * hcache_type_to_string(hcache_type_t type) { - g_assert((guint) type < HCACHE_MAX); + g_assert((uint) type < HCACHE_MAX); + STATIC_ASSERT(HCACHE_MAX == N_ITEMS(names)); return namestype; } @@ -612,7 +642,8 @@ const char * host_type_to_string(host_type_t type) { - g_assert((guint) type < HOST_MAX); + g_assert((uint) type < HOST_MAX); + STATIC_ASSERT(HOST_MAX == N_ITEMS(host_type_names)); return host_type_namestype; } @@ -632,6 +663,9 @@ case HCACHE_FRESH_ULTRA6: case HCACHE_VALID_ULTRA6: return GNET_PROPERTY(max_ultra6_hosts_cached); + case HCACHE_VALID_G2HUB: + case HCACHE_FRESH_G2HUB: + return GNET_PROPERTY(max_g2hub_hosts_cached); case HCACHE_BUSY: case HCACHE_TIMEOUT: case HCACHE_UNSTABLE: @@ -681,6 +715,10 @@ case HCACHE_VALID_ULTRA6: current = hcache_size(HOST_ULTRA6); break; + case HCACHE_FRESH_G2HUB: + case HCACHE_VALID_G2HUB: + current = hcache_size(HOST_G2HUB); + break; case HCACHE_BUSY: case HCACHE_TIMEOUT: case HCACHE_UNSTABLE: @@ -705,17 +743,17 @@ * * @return TRUE whether there is an available slot which should be used. */ -static gboolean +static bool hcache_request_slot(hcache_type_t type) { - guint limit, left; + uint limit, left; limit = hcache_slots_max(type); left = hcache_slots_left(type); return limit > 0 && left > 0 - && ((left > limit / 2) || (random_u32() % limit < left)); + && (left > limit / 2 || random_value(limit - 1) < left); } /** @@ -731,13 +769,13 @@ * When the host passes validation checks and should be added to the cache, * anyone waiting via wq_sleep() on the "hcache_add" key is notified about * the new host, the wakeup information supplying a hcache_new_host structure. - * + * * @return TRUE when IP/port passed sanity checks, regardless of whether it * was added to the cache. (See above) */ -static G_GNUC_HOT gboolean +static bool G_HOT hcache_add_internal(hcache_type_t type, time_t added, - const host_addr_t addr, guint16 port, const char *what) + const host_addr_t addr, uint16 port, const char *what) { gnet_host_t *host; const gnet_host_t *host_atom; @@ -795,7 +833,7 @@ return FALSE; /* Is host valid? */ } - if (bogons_check(addr) || hostiles_check(addr)) { + if (bogons_check(addr) || hostiles_is_bad(addr)) { statsHCACHE_INVALID_HOST++; return FALSE; /* Is host valid? */ } @@ -809,7 +847,7 @@ port >= 6346 && port <= 6350 && !host_low_on_pongs && - (random_u32() & 0xff) > 31 + random_value(255) > 31 ) { return FALSE; /* Did not pass port sanity checks */ } @@ -820,7 +858,7 @@ */ if (hcache_ht_get(hcache_class(type), addr, port, &host, &hce)) { - gconstpointer orig_key; + const void *orig_key; g_assert(hce != NULL); @@ -851,8 +889,10 @@ case HCACHE_FRESH_ULTRA: case HCACHE_VALID_ULTRA6: case HCACHE_FRESH_ULTRA6: + case HCACHE_VALID_G2HUB: + case HCACHE_FRESH_G2HUB: /* - * Move the host to the "ultra" cache if it's in the "any" ones. + * Move the host to the targeted cache if it's in the "any" ones. */ switch (hce->type) { @@ -885,8 +925,13 @@ hcache_unlink_host(cacheshce->type, host); return TRUE; - default: + case HCACHE_FRESH_ANY: + case HCACHE_VALID_ANY: return TRUE; + + case HCACHE_NONE: + case HCACHE_MAX: + g_assert_not_reached(); } /* @@ -896,12 +941,20 @@ orig_key = hash_list_remove(cacheshce->type->hostlist, host); g_assert(orig_key); + if (cacheshce->type->mass_update == 0) { + gnet_prop_decr_guint32(cacheshce->type->hosts_in_catcher); + } + hash_list_prepend(hc->hostlist, host); cacheshce->type->dirty = hc->dirty = TRUE; hce->type = type; hce->time_added = added; + if (hc->mass_update == 0) { + gnet_prop_incr_guint32(hc->hosts_in_catcher); + } + return TRUE; } @@ -933,51 +986,22 @@ hcache_ht_add(type, host_atom); - switch (type) { - case HCACHE_FRESH_ANY: - case HCACHE_FRESH_ULTRA: - case HCACHE_FRESH_ULTRA6: - /* - * Prepend, so that we use the freshest entries. - */ - hash_list_prepend(hc->hostlist, host_atom); - break; - - case HCACHE_VALID_ANY: - case HCACHE_VALID_ULTRA: - case HCACHE_VALID_ULTRA6: - /* - * We prepend to the list instead of appending because the day - * we switch it as HCACHE_FRESH_XXX, we'll start reading from there, - * in effect using the most recent hosts we know about. - */ - hash_list_prepend(hc->hostlist, host_atom); - break; - - case HCACHE_GUESS: - case HCACHE_GUESS_INTRO: - case HCACHE_GUESS6: - case HCACHE_GUESS6_INTRO: - hash_list_prepend(hc->hostlist, host_atom); - break; + /* + * We prepend to the list instead of appending because the day + * we switch it as HCACHE_FRESH_XXX, we'll start reading from there, + * in effect using the most recent hosts we know about. + * + * Furthermore, hcache_expire() depends on the fact that new entries are + * added to the beginning of the list + */ - default: - /* - * hcache_expire() depends on the fact that new entries are - * added to the beginning of the list - */ - hash_list_prepend(hc->hostlist, host_atom); - break; - } + hash_list_prepend(hc->hostlist, host_atom); hc->misses++; hc->dirty = TRUE; - if (hc->mass_update == 0) { - guint32 cur; - gnet_prop_get_guint32_val(hc->hosts_in_catcher, &cur); - gnet_prop_set_guint32_val(hc->hosts_in_catcher, cur + 1); - } + if (hc->mass_update == 0) + gnet_prop_incr_guint32(hc->hosts_in_catcher); hcache_prune(hc->type); hcache_update_low_on_pongs(); @@ -995,9 +1019,9 @@ /** * Add host to the proper cache. */ -gboolean +bool hcache_add(hcache_type_t type, - const host_addr_t addr, guint16 port, const char *what) + const host_addr_t addr, uint16 port, const char *what) { return hcache_add_internal(type, tm_time(), addr, port, what); } @@ -1005,8 +1029,8 @@ /** * Add a caught (fresh) host to the right list depending on the host type. */ -gboolean -hcache_add_caught(host_type_t type, const host_addr_t addr, guint16 port, +bool +hcache_add_caught(host_type_t type, const host_addr_t addr, uint16 port, const char *what) { if (ctl_limit(addr, CTL_D_CACHE)) @@ -1021,6 +1045,11 @@ return hcache_add(HCACHE_FRESH_ULTRA, addr, port, what); else return hcache_add(HCACHE_FRESH_ULTRA6, addr, port, what); + case HOST_G2HUB: + if (host_addr_is_ipv4(addr)) + return hcache_add(HCACHE_FRESH_G2HUB, addr, port, what); + else + return FALSE; /* G2 does not support IPv6 */ case HOST_GUESS: case HOST_GUESS6: if (host_addr_is_ipv4(addr)) @@ -1031,15 +1060,15 @@ g_assert_not_reached(); } - g_error("hcache_add_caught: unknown host type: %d", type); + g_error("%s(): unknown host type: %d", G_STRFUNC, type); return FALSE; } /** * Add a valid host to the right list depending on the host type. */ -gboolean -hcache_add_valid(host_type_t type, const host_addr_t addr, guint16 port, +bool +hcache_add_valid(host_type_t type, const host_addr_t addr, uint16 port, const char *what) { if (ctl_limit(addr, CTL_D_CACHE)) @@ -1054,6 +1083,11 @@ return hcache_add(HCACHE_VALID_ULTRA, addr, port, what); else return hcache_add(HCACHE_VALID_ULTRA6, addr, port, what); + case HOST_G2HUB: + if (host_addr_is_ipv4(addr)) + return hcache_add(HCACHE_VALID_G2HUB, addr, port, what); + else + return FALSE; /* G2 does not support IPv6 yet */ case HOST_GUESS: case HOST_GUESS6: if (host_addr_is_ipv4(addr)) @@ -1064,7 +1098,7 @@ g_assert_not_reached(); } - g_error("hcache_add_valid: unknown host type: %d", type); + g_error("%s: unknown host type: %d", G_STRFUNC, type); return FALSE; } @@ -1081,8 +1115,8 @@ hce = hcache_get_metadata(class, h); if (hce == NULL) { - g_warning("hcache_remove: attempt to remove unknown host: %s", - gnet_host_to_string(h)); + g_warning("%s: attempt to remove unknown host: %s", + G_STRFUNC, gnet_host_to_string(h)); return; /* Host is not in hashtable */ } @@ -1095,7 +1129,7 @@ * Purge host from fresh/valid caches. */ void -hcache_purge(hcache_class_t class, const host_addr_t addr, guint16 port) +hcache_purge(hcache_class_t class, const host_addr_t addr, uint16 port) { hostcache_entry_t *hce; gnet_host_t *host; @@ -1126,7 +1160,7 @@ /** * Do we have less that our mimumum amount of hosts in the cache? */ -gboolean +bool hcache_is_low(host_type_t type) { return hcache_size(type) < MIN_RESERVE_SIZE; @@ -1163,7 +1197,7 @@ void hcache_clear_host_type(host_type_t type) { - gboolean valid = FALSE; + bool valid = FALSE; switch (type) { case HOST_ANY: @@ -1181,6 +1215,11 @@ hcache_remove_all(cachesHCACHE_VALID_ULTRA6); valid = TRUE; break; + case HOST_G2HUB: + hcache_remove_all(cachesHCACHE_FRESH_G2HUB); + hcache_remove_all(cachesHCACHE_VALID_G2HUB); + valid = TRUE; + break; case HOST_GUESS: hcache_remove_all(cachesHCACHE_GUESS); hcache_remove_all(cachesHCACHE_GUESS_INTRO); @@ -1196,7 +1235,7 @@ } if (!valid) - g_error("hcache_clear_host_type: unknown host type: %d", type); + g_error("%s: unknown host type: %d", G_STRFUNC, type); pcache_clear_recent(type); } @@ -1208,7 +1247,7 @@ void hcache_clear(hcache_type_t type) { - g_assert((guint) type < HCACHE_MAX); + g_assert((uint) type < HCACHE_MAX); hcache_remove_all(cachestype); } @@ -1216,7 +1255,7 @@ /** * @return the amount of hosts in the cache. */ -guint +uint hcache_size(host_type_t type) { switch (type) { @@ -1235,10 +1274,13 @@ case HOST_GUESS6: return hash_list_length(cachesHCACHE_GUESS6->hostlist) + hash_list_length(cachesHCACHE_GUESS6_INTRO->hostlist); + case HOST_G2HUB: + return hash_list_length(cachesHCACHE_FRESH_G2HUB->hostlist) + + hash_list_length(cachesHCACHE_VALID_G2HUB->hostlist); case HOST_MAX: g_assert_not_reached(); } - g_error("hcache_is_low: unknown host type: %d", type); + g_error("%s(): unknown host type: %d", G_STRFUNC, type); return -1; /* Only here to make -Wall happy */ } @@ -1248,10 +1290,10 @@ * * @return total number of expired entries */ -static guint32 +static uint32 hcache_expire_cache(hostcache_t *hc, time_t now) { - guint32 expire_count = 0; + uint32 expire_count = 0; gnet_host_t *h; /* @@ -1285,10 +1327,10 @@ * * @return total number of expired entries */ -static guint32 +static uint32 hcache_expire_all(time_t now) { - guint32 expire_count = 0; + uint32 expire_count = 0; expire_count += hcache_expire_cache(cachesHCACHE_TIMEOUT, now); expire_count += hcache_expire_cache(cachesHCACHE_BUSY, now); @@ -1312,7 +1354,7 @@ hostcache_t *hc; int extra; - g_assert((guint) type < HCACHE_MAX); + g_assert((uint) type < HCACHE_MAX); hc = cachestype; @@ -1371,7 +1413,7 @@ if ( (HCACHE_GUESS == hc->type || HCACHE_GUESS6 == hc->type) && - random_u32() % 100 < 70 + random_value(99) < 70 ) { /* * The newest entry is the one we just added to the cache. @@ -1417,7 +1459,8 @@ int i; hostcache_t *hc = NULL; hostcache_t *hc2 = NULL; - GHashTable *seen_host = g_hash_table_new(gnet_host_hash, gnet_host_eq); + hset_t *seen_host = + hset_create_any(gnet_host_hash, gnet_host_hash2, gnet_host_equal); hash_list_iter_t *iter; switch (type) { @@ -1451,6 +1494,19 @@ g_assert_not_reached(); } break; + case HOST_G2HUB: + switch (net) { + case HOST_NET_BOTH: + case HOST_NET_IPV4: + hc = cachesHCACHE_FRESH_G2HUB; + break; + case HOST_NET_IPV6: + /* G2 does not support IPv6 yet -- RAM, 2014-01-02 */ + g_assert_not_reached(); + case HOST_NET_MAX: + g_assert_not_reached(); + } + break; case HOST_GUESS: case HOST_GUESS6: switch (net) { @@ -1481,7 +1537,7 @@ } if (NULL == hc) - g_error("hcache_get_caught: unknown host type: %d", type); + g_error("%s: unknown host type: %d", G_STRFUNC, type); /* * We first try to fill IPv6 addresses, or IPv4 if they only want that. @@ -1495,7 +1551,7 @@ if (NULL == h) break; - if (g_hash_table_lookup(seen_host, h)) + if (hset_contains(seen_host, h)) continue; /* @@ -1505,7 +1561,7 @@ gnet_host_copy(&hostsi, h); - g_hash_table_insert(seen_host, &hostsi, GUINT_TO_POINTER(1)); + hset_insert(seen_host, &hostsi); } hash_list_iter_release(&iter); @@ -1525,7 +1581,7 @@ if (NULL == h) break; - if (g_hash_table_lookup(seen_host, h)) + if (hset_contains(seen_host, h)) continue; /* @@ -1535,12 +1591,12 @@ gnet_host_copy(&hostsi, h); - g_hash_table_insert(seen_host, &hostsi, GUINT_TO_POINTER(1)); + hset_insert(seen_host, &hostsi); } hash_list_iter_release(&iter); done: - gm_hash_table_destroy_null(&seen_host); /* Keys point into vector */ + hset_free_null(&seen_host); /* Keys point into vector */ return i; /* Amount of hosts we filled */ } @@ -1551,8 +1607,8 @@ * * @return TRUE if host is found */ -gboolean -hcache_find_nearby(host_type_t type, host_addr_t *addr, guint16 *port) +bool +hcache_find_nearby(host_type_t type, host_addr_t *addr, uint16 *port) { gnet_host_t *h; hostcache_t *hc = NULL; @@ -1568,8 +1624,12 @@ case HOST_ULTRA6: hc = cachesHCACHE_FRESH_ULTRA6; break; + case HOST_G2HUB: + hc = cachesHCACHE_FRESH_G2HUB; + break; case HOST_GUESS: hc = cachesHCACHE_GUESS; + break; case HOST_GUESS6: hc = cachesHCACHE_GUESS6; break; @@ -1578,7 +1638,7 @@ } if (!hc) - g_error("hcache_get_caught: unknown host type: %d", type); + g_error("%s: unknown host type: %d", G_STRFUNC, type); /* iterate through whole list */ @@ -1641,7 +1701,7 @@ if (GNET_PROPERTY(hcache_debug)) { unsigned count = hash_list_length(hc->hostlist); g_debug("HCACHE sorted %s cache (%u item%s)", - hcache_type_to_string(type), count, 1 == count ? "" : "s"); + hcache_type_to_string(type), count, plural(count)); } } @@ -1650,20 +1710,20 @@ * * @return TRUE on sucess, FALSE on failure. */ -gboolean -hcache_get_caught(host_type_t type, host_addr_t *addr, guint16 *port) +bool +hcache_get_caught(host_type_t type, host_addr_t *addr, uint16 *port) { hostcache_t *hc = NULL; - extern guint32 number_local_networks; + extern uint32 number_local_networks; gnet_host_t *h; - gboolean available; + bool available; g_assert(addr); g_assert(port); *addr = zero_host_addr; *port = 0; - + switch (type) { case HOST_ANY: hc = cachesHCACHE_FRESH_ANY; @@ -1674,6 +1734,9 @@ case HOST_ULTRA6: hc = cachesHCACHE_FRESH_ULTRA6; break; + case HOST_G2HUB: + hc = cachesHCACHE_FRESH_G2HUB; + break; case HOST_GUESS: hc = cachesHCACHE_GUESS; if (0 == hash_list_length(hc->hostlist)) @@ -1689,7 +1752,7 @@ } if (!hc) - g_error("hcache_get_caught: unknown host type: %d", type); + g_error("%s(): unknown host type: %d", G_STRFUNC, type); available = hcache_require_caught(hc); @@ -1739,10 +1802,9 @@ { struct hostcache *hc; - g_assert((guint) type < HCACHE_MAX); - - hc = g_malloc0(sizeof *hc); + g_assert((uint) type < HCACHE_MAX); + WALLOC0(hc); hc->hostlist = hash_list_new(NULL, NULL); hc->name = name; hc->type = type; @@ -1757,19 +1819,22 @@ * Dispose of the hostcache. */ static void -hcache_free(hostcache_t *hc) +hcache_free_null(hostcache_t **hc_ptr) { + hostcache_t *hc = *hc_ptr; + g_assert(hc != NULL); g_assert(hash_list_length(hc->hostlist) == 0); hash_list_free(&hc->hostlist); - G_FREE_NULL(hc); + WFREE(hc); + *hc_ptr = NULL; } /** * Parse and load the hostcache file. */ -static G_GNUC_COLD void +static void G_COLD hcache_load_file(hostcache_t *hc, FILE *f) { char buffer1024; @@ -1782,7 +1847,7 @@ while (fgets(buffer, sizeof buffer, f)) { const char *endptr; host_addr_t addr; - guint16 port; + uint16 port; time_t added; if (!string_to_host_addr_port(buffer, &endptr, &addr, &port)) @@ -1820,7 +1885,7 @@ FILE *f; file_path_set(fp, settings_config_dir(), filename); - f = file_config_open_read(hc->name, fp, G_N_ELEMENTS(fp)); + f = file_config_open_read(hc->name, fp, N_ITEMS(fp)); if (f) { hcache_load_file(hc, f); fclose(f); @@ -1843,7 +1908,7 @@ hce = hcache_get_metadata(hc->class, h); if (hce == NULL || hce == NO_METADATA) continue; - + fprintf(f, "%s %s\n", gnet_host_to_string(h), timestamp_utc_to_string(hce->time_added)); } @@ -1860,8 +1925,8 @@ FILE *f; file_path_t fp; - g_assert((guint) type < HCACHE_MAX && type != HCACHE_NONE); - g_assert((guint) extra < HCACHE_MAX); + g_assert((uint) type < HCACHE_MAX && type != HCACHE_NONE); + g_assert((uint) extra < HCACHE_MAX); g_assert(cachestype != NULL); g_assert(extra == HCACHE_NONE || cachesextra != NULL); @@ -1887,7 +1952,7 @@ void hcache_get_stats(hcache_stats_t *s) { - guint n; + uint n; for (n = 0; n < HCACHE_MAX; n++) { if (n == HCACHE_NONE) @@ -1902,8 +1967,8 @@ /** * Host cache timer. */ -static gboolean -hcache_timer(gpointer unused_obj) +static bool +hcache_timer(void *unused_obj) { time_t now = tm_time(); @@ -1921,6 +1986,9 @@ hcache_dump_info(cachesHCACHE_FRESH_ULTRA6, "timer"); hcache_dump_info(cachesHCACHE_VALID_ULTRA6, "timer"); + hcache_dump_info(cachesHCACHE_FRESH_G2HUB, "timer"); + hcache_dump_info(cachesHCACHE_VALID_G2HUB, "timer"); + hcache_dump_info(cachesHCACHE_GUESS, "timer"); hcache_dump_info(cachesHCACHE_GUESS_INTRO, "timer"); @@ -1964,6 +2032,11 @@ second = HCACHE_FRESH_ULTRA6; file = ULTRAS6_FILE; break; + case HOST_G2HUB: + first = HCACHE_VALID_G2HUB; + second = HCACHE_FRESH_G2HUB; + file = G2HUBS_FILE; + break; case HOST_GUESS: first = HCACHE_GUESS_INTRO; second = HCACHE_GUESS; @@ -1975,7 +2048,7 @@ file = GUESS6_FILE; break; default: - g_error("can't store cache for host type %d", type); + g_error("%s(): can't store cache for host type %d", G_STRFUNC, type); return; } @@ -1990,8 +2063,8 @@ /** * Host cache periodic saving. */ -static gboolean -hcache_periodic_save(gpointer unused_obj) +static bool +hcache_periodic_save(void *unused_obj) { static unsigned i; @@ -2003,10 +2076,11 @@ case 2: hcache_store_if_dirty(HOST_GUESS); break; case 3: hcache_store_if_dirty(HOST_ULTRA6); break; case 4: hcache_store_if_dirty(HOST_GUESS6); break; + case 5: hcache_store_if_dirty(HOST_G2HUB); break; default: g_assert_not_reached(); } - i = (i + 1) % 5; + i = (i + 1) % 6; return TRUE; /* Keep calling */ } @@ -2014,11 +2088,15 @@ /** * Initialize host caches. */ -G_GNUC_COLD void +void G_COLD hcache_init(void) { - ht_known_hosts = g_hash_table_new(gnet_host_hash, gnet_host_eq); - ht_guess_hosts = g_hash_table_new(gnet_host_hash, gnet_host_eq); + ht_known_hosts = + htable_create_any(gnet_host_hash, gnet_host_hash2, gnet_host_equal); + ht_g2_hosts = + htable_create_any(gnet_host_hash, gnet_host_hash2, gnet_host_equal); + ht_guess_hosts = + htable_create_any(gnet_host_hash, gnet_host_hash2, gnet_host_equal); no_metadata = vmm_trap_page(); cachesHCACHE_FRESH_ANY = hcache_alloc( @@ -2051,6 +2129,16 @@ PROP_HOSTS_IN_ULTRA6_CATCHER, "hosts.valid.ultra6"); + cachesHCACHE_VALID_G2HUB = hcache_alloc( + HCACHE_VALID_G2HUB, + PROP_HOSTS_IN_G2HUB_CATCHER, + "hosts.valid.g2hub"); + + cachesHCACHE_FRESH_G2HUB = hcache_alloc( + HCACHE_FRESH_G2HUB, + PROP_HOSTS_IN_G2HUB_CATCHER, + "hosts.fresh.g2hub"); + cachesHCACHE_TIMEOUT = hcache_alloc( HCACHE_TIMEOUT, PROP_HOSTS_IN_BAD_CATCHER, @@ -2102,12 +2190,13 @@ /** * Load hostcache data from disk. */ -G_GNUC_COLD void +void G_COLD hcache_retrieve_all(void) { hcache_retrieve(cachesHCACHE_FRESH_ANY, HOSTS_FILE); hcache_retrieve(cachesHCACHE_FRESH_ULTRA, ULTRAS_FILE); hcache_retrieve(cachesHCACHE_FRESH_ULTRA6, ULTRAS6_FILE); + hcache_retrieve(cachesHCACHE_FRESH_G2HUB, G2HUBS_FILE); hcache_retrieve(cachesHCACHE_GUESS, GUESS_FILE); hcache_retrieve(cachesHCACHE_GUESS6, GUESS6_FILE); } @@ -2115,13 +2204,14 @@ /** * Shutdown host caches. */ -G_GNUC_COLD void +void G_COLD hcache_shutdown(void) { cq_periodic_remove(&hcache_save_ev); hcache_store(HCACHE_VALID_ANY, HOSTS_FILE, HCACHE_FRESH_ANY); hcache_store(HCACHE_VALID_ULTRA, ULTRAS_FILE, HCACHE_FRESH_ULTRA); hcache_store(HCACHE_VALID_ULTRA6, ULTRAS6_FILE, HCACHE_FRESH_ULTRA6); + hcache_store(HCACHE_VALID_G2HUB, G2HUBS_FILE, HCACHE_FRESH_G2HUB); hcache_store(HCACHE_GUESS, GUESS_FILE, HCACHE_GUESS_INTRO); hcache_store(HCACHE_GUESS6, GUESS6_FILE, HCACHE_GUESS6_INTRO); } @@ -2129,7 +2219,7 @@ /** * Destroy all host caches. */ -G_GNUC_COLD void +void G_COLD hcache_close(void) { static const hcache_type_t types = { @@ -2147,8 +2237,10 @@ HCACHE_GUESS_INTRO, HCACHE_GUESS6, HCACHE_GUESS6_INTRO, + HCACHE_FRESH_G2HUB, + HCACHE_VALID_G2HUB, }; - guint i; + uint i; g_assert(!hcache_close_running); hcache_close_running = TRUE; @@ -2159,8 +2251,8 @@ * hcache_require_caught will crash if we free certain hostcaches. */ - for (i = 0; i < G_N_ELEMENTS(types); i++) { - guint j; + for (i = 0; i < N_ITEMS(types); i++) { + uint j; hcache_type_t type = typesi; /* Make sure all previous caches have been cleared */ @@ -2174,18 +2266,19 @@ g_assert(hash_list_length(cachesj->hostlist) == 0); } - for (i = 0; i < G_N_ELEMENTS(types); i++) { + for (i = 0; i < N_ITEMS(types); i++) { hcache_type_t type = typesi; - hcache_free(cachestype); - cachestype = NULL; + hcache_free_null(&cachestype); } - g_assert(g_hash_table_size(ht_known_hosts) == 0); - g_assert(g_hash_table_size(ht_guess_hosts) == 0); + g_assert(0 == htable_count(ht_known_hosts)); + g_assert(0 == htable_count(ht_g2_hosts)); + g_assert(0 == htable_count(ht_guess_hosts)); - gm_hash_table_destroy_null(&ht_known_hosts); - gm_hash_table_destroy_null(&ht_guess_hosts); + htable_free_null(&ht_known_hosts); + htable_free_null(&ht_g2_hosts); + htable_free_null(&ht_guess_hosts); cq_periodic_remove(&hcache_timer_ev); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/hcache.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/hcache.h
Changed
@@ -50,7 +50,7 @@ struct hcache_new_host { hcache_type_t type; /**< Type of cache to which host is added */ host_addr_t addr; /**< Host address */ - guint16 port; /**< Host port */ + uint16 port; /**< Host port */ }; /* @@ -65,33 +65,30 @@ const char *host_type_to_string(host_type_t type); const char *hcache_type_to_string(hcache_type_t type); -gboolean hcache_add( - hcache_type_t type, const host_addr_t addr, guint16 port, - const char *what); +bool hcache_add( + hcache_type_t type, const host_addr_t addr, uint16 port, const char *what); -gboolean hcache_add_caught( - host_type_t type, const host_addr_t addr, guint16 port, - const char *what); +bool hcache_add_caught( + host_type_t type, const host_addr_t addr, uint16 port, const char *what); -gboolean hcache_add_valid( - host_type_t type, const host_addr_t addr, guint16 port, - const char *what); +bool hcache_add_valid( + host_type_t type, const host_addr_t addr, uint16 port, const char *what); -gboolean hcache_node_is_bad(const host_addr_t addr); -gboolean hcache_addr_within_net(const host_addr_t addr, host_net_t net); +bool hcache_node_is_bad(const host_addr_t addr); +bool hcache_addr_within_net(const host_addr_t addr, host_net_t net); void hcache_prune(hcache_type_t type); -void hcache_purge(hcache_class_t class, const host_addr_t addr, guint16 port); +void hcache_purge(hcache_class_t class, const host_addr_t addr, uint16 port); -guint hcache_size(host_type_t type); -gboolean hcache_is_low(host_type_t type); +uint hcache_size(host_type_t type); +bool hcache_is_low(host_type_t type); int hcache_fill_caught_array( host_net_t net, host_type_t type, gnet_host_t *hosts, int hcount); -gboolean hcache_get_caught(host_type_t type, host_addr_t *addr, guint16 *port); -gboolean hcache_find_nearby(host_type_t type, - host_addr_t *addr, guint16 *port); +bool hcache_get_caught(host_type_t type, host_addr_t *addr, uint16 *port); +bool hcache_find_nearby(host_type_t type, + host_addr_t *addr, uint16 *port); #endif /* _core_hcache_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/hostiles.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/hostiles.c
Changed
@@ -1,6 +1,6 @@ /* - * Copyright (c) 2004-2011, Raphael Manfredi - * Copyright (c) 2003, Markus Goetz + * Copyright (c) 2004-2011, 2013 Raphael Manfredi + * Copyright (c) 2003 Markus Goetz * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -33,7 +33,7 @@ * @author Markus Goetz * @date 2003 * @author Raphael Manfredi - * @date 2004-2011 + * @date 2004-2011, 2013 */ #include "common.h" @@ -45,18 +45,21 @@ #include "dht/stable.h" +#include "lib/array_util.h" #include "lib/ascii.h" -#include "lib/atoms.h" +#include "lib/atoms.h" /* For uint32_hash() */ #include "lib/cq.h" #include "lib/dbmw.h" #include "lib/dbstore.h" +#include "lib/entropy.h" #include "lib/file.h" -#include "lib/glib-missing.h" -#include "lib/iprange.h" #include "lib/halloc.h" +#include "lib/hashing.h" +#include "lib/iprange.h" #include "lib/parse.h" #include "lib/path.h" #include "lib/random.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/tm.h" #include "lib/walloc.h" @@ -75,7 +78,6 @@ NUM_HOSTILES } hostiles_t; -static const char hostile = "hostile"; static const char hostiles_file = "hostiles.txt"; static const char * const hostiles_whatNUM_HOSTILES = { "hostile IP addresses (global)", @@ -96,16 +98,18 @@ #define HOSTILES_DYNAMIC_PENALTY 43201 /**< s; about 12 hours (prime) */ struct hostiles_dynamic_entry4 { - guint32 ipv4; /* MUST be at offset 0 due to uint32_hash/eq */ - unsigned long relative_time; + uint32 ipv4; /* MUST be at offset 0 due to uint32_hash/eq */ + uint32 relative_time; + hostiles_flags_t he4_flags; }; #define HOSTILES_IPV6_ZEROED 8 /**< Trailing 8 bytes are zeroed */ #define HOSTILES_IPV6_LEN (16 - HOSTILES_IPV6_ZEROED) struct hostiles_dynamic_entry6 { - guint8 ipHOSTILES_IPV6_LEN; /* MUST be at offset 0 for hash/eq */ - unsigned long relative_time; + uint8 ipHOSTILES_IPV6_LEN; /* MUST be at offset 0 for hash/eq */ + uint32 relative_time; + hostiles_flags_t he6_flags; }; /** @@ -130,7 +134,7 @@ struct spamhost { time_t first_seen; /**< Time first seen returning spam */ time_t last_seen; /**< Time last seen returning spam */ - guint16 port; /**< Port number */ + uint16 port; /**< Port number */ }; /** @@ -145,7 +149,7 @@ struct spamhost hostsSPAM_MAX_PORTS; time_t create_time; /**< When we first encountered that IP address */ time_t last_time; /**< Last time we saw spam from this host */ - guint8 ports; /**< # of ports known to run spamming servents */ + uint8 ports; /**< # of ports known to run spamming servents */ }; /** @@ -188,7 +192,7 @@ deserialize_spamdata(bstr_t *bs, void *valptr, size_t len) { struct spamdata *sd = valptr; - guint8 version; + uint8 version; int i; g_assert(sizeof *sd == len); @@ -208,13 +212,65 @@ } /** + * @return string listing all the hostile flags set. + */ +const char * +hostiles_flags_to_string(const hostiles_flags_t flags) +{ + str_t *s = str_private(G_STRFUNC, 60); + + str_reset(s); + +#define LOGAS(fl,str) G_STMT_START { \ + if G_UNLIKELY(flags & (fl)) { \ + if G_LIKELY(0 != str_len(s)) \ + STR_CAT(s, ", "); \ + STR_CAT(s, str); \ + } \ +} G_STMT_END + + LOGAS(HSTL_STATIC, "static"); + LOGAS(HSTL_DUMB, "dumb"); + LOGAS(HSTL_WEIRD_MSG, "weird"); + LOGAS(HSTL_DUP_INDEX, "dup-index"); + LOGAS(HSTL_DUP_SHA1, "dup-SHA1"); + LOGAS(HSTL_FAKE_SPAM, "fake"); + LOGAS(HSTL_NAME_SPAM, "name"); + LOGAS(HSTL_URL_SPAM, "URL"); + LOGAS(HSTL_URN_SPAM, "URN"); + LOGAS(HSTL_EVIL_FILENAME, "evil-filename"); + LOGAS(HSTL_BAD_UTF8, "utf8"); + LOGAS(HSTL_OOB, "OOB"); + LOGAS(HSTL_UDP_GUESS, "UDP-GUESS"); + LOGAS(HSTL_BAD_FILE_INDEX, "bad-index"); + LOGAS(HSTL_GTKG, "GTKG"); + LOGAS(HSTL_NO_GTKG_VERSION, "!GTKG-version"); + LOGAS(HSTL_BAD_GTKG_GUID, "GTKG-GUID"); + LOGAS(HSTL_MANY_ALT_LOCS, "alt-locs"); + LOGAS(HSTL_EVIL_TIMESTAMP, "evil-timestamp"); + LOGAS(HSTL_NO_WHATS_NEW, "!what's-new"); + LOGAS(HSTL_CLOSE_FILENAME, "close-names"); + LOGAS(HSTL_MISSING_XML, "!XML"); + LOGAS(HSTL_NO_CREATE_TIME, "CT"); + LOGAS(HSTL_ODD_GUID, "odd-GUID"); + LOGAS(HSTL_BANNED_GUID, "banned-GUID"); + LOGAS(HSTL_BAD_VENDOR_CODE, "vendor-code"); + LOGAS(HSTL_GIBBERISH, "gibberish"); + LOGAS(HSTL_NON_UTF8, "non-utf8"); + +#undef LOGAS + + return str_2c(s); +} + +/** * Frees all entries in the given hostiles. */ static void hostiles_close_one(hostiles_t which) { - guint i = which; - + uint i = which; + g_assert(i < NUM_HOSTILES); iprange_free(&hostile_dbi); } @@ -228,7 +284,7 @@ hostiles_load(FILE *f, hostiles_t which) { char line1024; - guint32 ip, netmask; + uint32 ip, netmask; int linenum = 0; int bits; iprange_err_t error; @@ -292,7 +348,7 @@ * addresses changed. */ static void -hostiles_changed(const char *filename, gpointer udata) +hostiles_changed(const char *filename, void *udata) { FILE *f; char buf80; @@ -310,7 +366,7 @@ count = hostiles_load(f, which); fclose(f); - gm_snprintf(buf, sizeof(buf), "Reloaded %d hostile IP addresses.", count); + str_bprintf(buf, sizeof(buf), "Reloaded %d hostile IP addresses.", count); gcu_statusbar_message(buf); node_kill_hostiles(); @@ -346,7 +402,7 @@ * The selected file will then be monitored and a reloading will occur * shortly after a modification. */ -static G_GNUC_COLD void +static void G_COLD hostiles_retrieve(hostiles_t which) { g_assert(UNSIGNED(which) < NUM_HOSTILES); @@ -361,7 +417,7 @@ file_path_set(&fp_private0, settings_config_dir(), hostiles_file); f = file_config_open_read_norename_chosen( hostiles_whatHOSTILE_PRIVATE, - fp_private, G_N_ELEMENTS(fp_private), &idx); + fp_private, N_ITEMS(fp_private), &idx); if (f) { hostiles_retrieve_from_file(f, HOSTILE_PRIVATE, @@ -376,30 +432,20 @@ file_path_t fp3; FILE *f; int idx; - char *tmp; - unsigned int length = 0; - -#ifndef OFFICIAL_BUILD - file_path_set(&fplength++, - PACKAGE_EXTRA_SOURCE_DIR, hostiles_file); -#endif - file_path_set(&fplength++, PRIVLIB_EXP, hostiles_file); + uint length; - tmp = get_folder_path(PRIVLIB_PATH, NULL); - if (tmp != NULL) - file_path_set(&fplength++, tmp, hostiles_file); + length = settings_file_path_load(fp, hostiles_file, SFP_NO_CONFIG); - g_assert(length <= G_N_ELEMENTS(fp)); + g_assert(length <= N_ITEMS(fp)); f = file_config_open_read_norename_chosen( hostiles_whatHOSTILE_GLOBAL, fp, length, &idx); - + if (f) { hostiles_retrieve_from_file(f, HOSTILE_GLOBAL, fpidx.dir, fpidx.name); fclose(f); } - HFREE_NULL(tmp); } break; @@ -415,7 +461,7 @@ * hostile_dbHOSTILE_GLOBAL. The file watcher keeps running though during * this session and we keep the database in memory. */ -static gboolean +static bool use_global_hostiles_txt_changed(property_t unused_prop) { (void) unused_prop; @@ -428,13 +474,14 @@ } static struct hostiles_dynamic_entry4 * -hostiles_dynamic_new4(guint32 ipv4) +hostiles_dynamic_new4(uint32 ipv4, hostiles_flags_t flags) { struct hostiles_dynamic_entry4 entry; entry.ipv4 = ipv4; entry.relative_time = tm_relative_time(); - return wcopy(&entry, sizeof entry); + entry.he4_flags = flags; + return WCOPY(&entry); } static void @@ -449,13 +496,14 @@ } static struct hostiles_dynamic_entry6 * -hostiles_dynamic_new6(const guint8 *ipv6) +hostiles_dynamic_new6(const uint8 *ipv6, hostiles_flags_t flags) { struct hostiles_dynamic_entry6 entry; memcpy(&entry.ip0, ipv6, sizeof entry.ip); entry.relative_time = tm_relative_time(); - return wcopy(&entry, sizeof entry); + entry.he6_flags = flags; + return WCOPY(&entry); } static void @@ -470,9 +518,9 @@ } static void -hostiles_dynamic_expire4(gboolean forced) +hostiles_dynamic_expire4(bool forced) { - unsigned long now = tm_relative_time(); + uint32 now = tm_relative_time(); for (;;) { struct hostiles_dynamic_entry4 *entry; @@ -487,21 +535,22 @@ ) break; - if (!forced && GNET_PROPERTY(ban_debug > 0)) { + if (!forced && GNET_PROPERTY(ban_debug) > 0) { char bufHOST_ADDR_BUFLEN; host_addr_to_string_buf(host_addr_get_ipv4(entry->ipv4), buf, sizeof buf); - g_info("removing dynamically caught hostile: %s", buf); + g_info("removing dynamically caught hostile: %s (%s)", + buf, hostiles_flags_to_string(entry->he4_flags)); } hash_list_remove_head(hl_dynamic_ipv4); hostiles_dynamic_free4(&entry); - gnet_stats_count_general(GNR_SPAM_CAUGHT_HOSTILE_HELD, -1); + gnet_stats_dec_general(GNR_SPAM_CAUGHT_HOSTILE_HELD); } } static void -hostiles_dynamic_expire6(gboolean forced) +hostiles_dynamic_expire6(bool forced) { unsigned long now = tm_relative_time(); @@ -518,13 +567,14 @@ ) break; - if (!forced && GNET_PROPERTY(ban_debug > 0)) { - g_info("removing dynamically caught hostile: %s", - ipv6_to_string(entry->ip)); + if (!forced && GNET_PROPERTY(ban_debug) > 0) { + g_info("removing dynamically caught hostile: %s (%s)", + ipv6_to_string(entry->ip), + hostiles_flags_to_string(entry->he6_flags)); } hash_list_remove_head(hl_dynamic_ipv6); hostiles_dynamic_free6(&entry); - gnet_stats_count_general(GNR_SPAM_CAUGHT_HOSTILE_HELD, -1); + gnet_stats_dec_general(GNR_SPAM_CAUGHT_HOSTILE_HELD); } } @@ -532,7 +582,7 @@ * Callout queue periodic event to perform periodic monitoring of the * registered files. */ -static gboolean +static bool hostiles_dynamic_timer(void *unused_udata) { (void) unused_udata; @@ -543,53 +593,86 @@ return TRUE; /* Keep calling */ } -static void -hostiles_dynamic_add_ipv4(guint32 ipv4) +static hostiles_flags_t +hostiles_dynamic_add_ipv4(uint32 ipv4, hostiles_flags_t flags) { struct hostiles_dynamic_entry4 *entry; if (hash_list_find(hl_dynamic_ipv4, &ipv4, cast_to_void_ptr(&entry))) { + if (GNET_PROPERTY(ban_debug)) { + hostiles_flags_t added = flags & ~entry->he4_flags; + + if (added != 0) { + char bufHOST_ADDR_BUFLEN; + host_addr_to_string_buf(host_addr_get_ipv4(ipv4), + buf, sizeof buf); + g_info("dynamically added hostile flags: %s (%s)", buf, + hostiles_flags_to_string(added)); + } + } entry->relative_time = tm_relative_time(); + entry->he4_flags |= flags; hash_list_moveto_tail(hl_dynamic_ipv4, entry); + entropy_harvest_single(VARLEN(entry->he4_flags)); } else { - entry = hostiles_dynamic_new4(ipv4); + entry = hostiles_dynamic_new4(ipv4, flags); hash_list_append(hl_dynamic_ipv4, entry); - gnet_stats_count_general(GNR_SPAM_CAUGHT_HOSTILE_IP, 1); - gnet_stats_count_general(GNR_SPAM_CAUGHT_HOSTILE_HELD, +1); + gnet_stats_inc_general(GNR_SPAM_CAUGHT_HOSTILE_IP); + gnet_stats_inc_general(GNR_SPAM_CAUGHT_HOSTILE_HELD); - if (GNET_PROPERTY(ban_debug > 0)) { + entropy_harvest_small(VARLEN(ipv4), VARLEN(flags), NULL); + + if (GNET_PROPERTY(ban_debug)) { char bufHOST_ADDR_BUFLEN; host_addr_to_string_buf(host_addr_get_ipv4(ipv4), buf, sizeof buf); - g_info("dynamically caught hostile: %s", buf); + g_info("dynamically caught hostile: %s (%s)", buf, + hostiles_flags_to_string(flags)); } } + + return entry->he4_flags; } -static void -hostiles_dynamic_add_ipv6(const guint8 *ipv6) +static hostiles_flags_t +hostiles_dynamic_add_ipv6(const uint8 *ipv6, hostiles_flags_t flags) { struct hostiles_dynamic_entry6 *entry; if (hash_list_find(hl_dynamic_ipv6, ipv6, cast_to_void_ptr(&entry))) { + if (GNET_PROPERTY(ban_debug)) { + hostiles_flags_t added = flags & ~entry->he6_flags; + + if (added != 0) { + g_info("dynamically added hostile flags: %s (%s)", + ipv6_to_string(ipv6), hostiles_flags_to_string(added)); + } + } entry->relative_time = tm_relative_time(); + entry->he6_flags |= flags; hash_list_moveto_tail(hl_dynamic_ipv6, entry); + entropy_harvest_single(VARLEN(entry->he6_flags)); } else { - entry = hostiles_dynamic_new6(ipv6); + entry = hostiles_dynamic_new6(ipv6, flags); hash_list_append(hl_dynamic_ipv6, entry); - gnet_stats_count_general(GNR_SPAM_CAUGHT_HOSTILE_IP, 1); - gnet_stats_count_general(GNR_SPAM_CAUGHT_HOSTILE_HELD, +1); + gnet_stats_inc_general(GNR_SPAM_CAUGHT_HOSTILE_IP); + gnet_stats_inc_general(GNR_SPAM_CAUGHT_HOSTILE_HELD); - if (GNET_PROPERTY(ban_debug > 0)) { - g_info("dynamically caught hostile: %s", ipv6_to_string(ipv6)); + entropy_harvest_small(ipv6, 16, VARLEN(flags), NULL); + + if (GNET_PROPERTY(ban_debug)) { + g_info("dynamically caught hostile: %s (%s)", + ipv6_to_string(ipv6), hostiles_flags_to_string(flags)); } } + + return entry->he6_flags; } -static gboolean -hostiles_static_check_ipv4(guint32 ipv4) +static hostiles_flags_t +hostiles_static_check_ipv4(uint32 ipv4) { int i; @@ -598,17 +681,33 @@ continue; if (NULL != hostile_dbi && 0 != iprange_get(hostile_dbi, ipv4)) - return TRUE; + return HSTL_STATIC; } - return FALSE; + return HSTL_CLEAN; } -static gboolean -hostiles_static_check_ipv6(const guint8 *ipv6) +static hostiles_flags_t +hostiles_static_check_ipv6(const uint8 *ipv6) { (void) ipv6; - return FALSE; /* static IPv6 hostiles not supported yet */ + return HSTL_CLEAN; /* static IPv6 hostiles not supported yet */ +} + +static void +hostiles_log_caught(const host_addr_t addr, const char *reason, + hostiles_flags_t flags, hostiles_flags_t merged_flags) +{ + if (flags == merged_flags) { + g_debug("SPAM dynamically caught hostile %s: %s (%s)", + host_addr_to_string(addr), reason, + hostiles_flags_to_string(flags)); + } else { + g_debug("SPAM dynamically updated hostile %s: %s (%s) -> (%s)", + host_addr_to_string(addr), reason, + hostiles_flags_to_string(flags), + hostiles_flags_to_string(merged_flags)); + } } /** @@ -617,9 +716,11 @@ * * @param addr the address to blacklist. * @param reason how we detected that the address was hostile + * @param flags consolidated flags indicating that host is hostile */ void -hostiles_dynamic_add(const host_addr_t addr, const char *reason) +hostiles_dynamic_add(const host_addr_t addr, const char *reason, + hostiles_flags_t flags) { host_addr_t ipv4_addr; @@ -627,81 +728,97 @@ host_addr_convert(addr, &ipv4_addr, NET_TYPE_IPV4) || host_addr_tunnel_client(addr, &ipv4_addr) ) { - guint32 ip = host_addr_ipv4(ipv4_addr); + uint32 ip = host_addr_ipv4(ipv4_addr); if (!hostiles_static_check_ipv4(ip)) { - hostiles_dynamic_add_ipv4(ip); + hostiles_flags_t nflags = hostiles_dynamic_add_ipv4(ip, flags); if (GNET_PROPERTY(spam_debug) > 1) { - g_debug("SPAM dynamically caught hostile %s: %s", - host_addr_to_string(ipv4_addr), reason); + hostiles_log_caught(ipv4_addr, reason, flags, nflags); } } } else if (host_addr_is_ipv6(addr)) { - const guint8 *ip; + const uint8 *ip; ip = host_addr_ipv6(&addr); if (!hostiles_static_check_ipv6(ip)) { - hostiles_dynamic_add_ipv6(ip); + hostiles_flags_t nflags = hostiles_dynamic_add_ipv6(ip, flags); if (GNET_PROPERTY(spam_debug) > 1) { - g_debug("SPAM dynamically caught hostile %s: %s", - ipv6_to_string(ip), reason); + hostiles_log_caught(addr, reason, flags, nflags); } } } } -static inline gboolean -hostiles_dynamic_check_ipv4(guint32 ipv4) +static inline hostiles_flags_t +hostiles_dynamic_check_ipv4(uint32 ipv4) { + const struct hostiles_dynamic_entry4 *entry; + /** * We could check relative_time here but entries are sufficiently * frequently expired and the timeout is arbitrary anyway. */ - return hash_list_contains(hl_dynamic_ipv4, &ipv4); + + entry = hash_list_lookup(hl_dynamic_ipv4, &ipv4); + if G_LIKELY(NULL == entry) + return HSTL_CLEAN; + + return entry->he4_flags; } -static inline gboolean -hostiles_dynamic_check_ipv6(const guint8 *ipv6) +static inline hostiles_flags_t +hostiles_dynamic_check_ipv6(const uint8 *ipv6) { + const struct hostiles_dynamic_entry6 *entry; + /** * We could check relative_time here but entries are sufficiently * frequently expired and the timeout is arbitrary anyway. */ - return hash_list_contains(hl_dynamic_ipv6, ipv6); + + entry = hash_list_lookup(hl_dynamic_ipv6, ipv6); + if G_LIKELY(NULL == entry) + return HSTL_CLEAN; + + return entry->he6_flags; } /** * Check the given address against the entries in the hostiles. * - * @param ha the host address to check. - * @returns TRUE if found, and FALSE if not. + * @param ha the host address to check. + * + * @return HSTL_CLEAN if host is not hostile, the known hostile flags otherwise. */ -gboolean +hostiles_flags_t hostiles_check(const host_addr_t ha) { host_addr_t to; + hostiles_flags_t flags = HSTL_CLEAN; if ( host_addr_convert(ha, &to, NET_TYPE_IPV4) || host_addr_tunnel_client(ha, &to) ) { - guint32 ip = host_addr_ipv4(to); + uint32 ip = host_addr_ipv4(to); - return hostiles_dynamic_check_ipv4(ip) || - hostiles_static_check_ipv4(ip); + flags = hostiles_dynamic_check_ipv4(ip); + if (!hostiles_flags_are_bad(flags)) + flags |= hostiles_static_check_ipv4(ip); } else if (host_addr_is_ipv6(ha)) { - const guint8 *ip; + const uint8 *ip; ip = host_addr_ipv6(&ha); - return hostiles_dynamic_check_ipv6(ip) || - hostiles_static_check_ipv6(ip); + flags = hostiles_dynamic_check_ipv6(ip); + if (!hostiles_flags_are_bad(flags)) + flags |= hostiles_static_check_ipv6(ip); } - return FALSE; + return flags; } /** @@ -716,7 +833,8 @@ if (NULL == sd) { if (dbmw_has_ioerr(db_spam)) { - g_warning("DBMW \"%s\" I/O error", dbmw_name(db_spam)); + s_warning_once_per(LOG_PERIOD_MINUTE, + "DBMW \"%s\" I/O error", dbmw_name(db_spam)); } } @@ -727,7 +845,7 @@ * Record indication that we got spam from given address and port. */ void -hostiles_spam_add(const host_addr_t addr, guint16 port) +hostiles_spam_add(const host_addr_t addr, uint16 port) { struct spamdata *sd; struct spamdata new_sd; @@ -747,10 +865,11 @@ sd->hosts0.first_seen = sd->hosts0.last_seen = sd->create_time = sd->last_time = tm_time(); sd->hosts0.port = port; - gnet_stats_count_general(GNR_SPAM_IP_HELD, +1); + gnet_stats_inc_general(GNR_SPAM_IP_HELD); + entropy_harvest_small(VARLEN(addr), VARLEN(port), NULL); } else { int i; - gboolean found = FALSE; + bool found = FALSE; for (i = 0; i < sd->ports; i++) { struct spamhost *sh = &sd->hostsi; @@ -813,7 +932,7 @@ * change to database. */ static void -spam_remove_port(struct spamdata *sd, const host_addr_t addr, guint16 port) +spam_remove_port(struct spamdata *sd, const host_addr_t addr, uint16 port) { int i; @@ -822,19 +941,17 @@ for (i = 0; i < sd->ports; i++) { struct spamhost *sh = &sd->hostsi; - if (port == sh->port) { + if G_UNLIKELY(port == sh->port) { gnet_host_t host; - sd->ports--; - if (i < sd->ports) { - memmove(&sd->hostsi, &sd->hostsi+1, - sizeof(sd->hosts0) * (sd->ports - i)); - } + ARRAY_REMOVE_DEC(sd->hosts, i, sd->ports); + if (GNET_PROPERTY(spam_debug) > 5) { g_debug("SPAM removing port %u for host %s (%u port%s remain)", port, host_addr_to_string(addr), sd->ports, - 1 == sd->ports ? "" : "s"); + plural(sd->ports)); } + gnet_host_set(&host, addr, 0); dbmw_write(db_spam, &host, sd, sizeof *sd); break; @@ -845,8 +962,8 @@ /** * Is IP:port that of a known host returning spam? */ -gboolean -hostiles_spam_check(const host_addr_t addr, guint16 port) +bool +hostiles_spam_check(const host_addr_t addr, uint16 port) { struct spamdata *sd; gnet_host_t host; @@ -872,7 +989,7 @@ for (i = 0; i < sd->ports; i++) { struct spamhost *sh = &sd->hostsi; - gboolean expired; + bool expired; if (sh->port != port) continue; @@ -921,7 +1038,7 @@ if (100 == c) { return FALSE; /* Not a spamming host */ } else { - return random_u32() % 100 >= c; + return random_value(99) >= c; } } @@ -929,14 +1046,14 @@ * DBMW foreach iterator to remove old entries. * @return TRUE if entry must be deleted. */ -static gboolean +static bool spam_prune_old(void *key, void *value, size_t u_len, void *u_data) { const gnet_host_t *h = key; const struct spamdata *sd = value; time_delta_t d; double p = 0.0; - gboolean expired; + bool expired; (void) u_len; (void) u_data; @@ -995,7 +1112,7 @@ /** * Callout queue periodic event to expire old entries. */ -static gboolean +static bool hostiles_spam_periodic_prune(void *unused_obj) { (void) unused_obj; @@ -1007,7 +1124,7 @@ /** * Callout queue periodic event to synchronize the disk image. */ -static gboolean +static bool hostiles_spam_periodic_sync(void *unused_obj) { (void) unused_obj; @@ -1016,7 +1133,7 @@ return TRUE; /* Keep calling */ } -static guint +static uint hostiles_ipv6_hash(const void *key) { return binary_hash(key, HOSTILES_IPV6_LEN); @@ -1031,7 +1148,7 @@ /** * Called on startup. Loads the hostiles.txt into memory. */ -G_GNUC_COLD void +void G_COLD hostiles_init(void) { dbstore_kv_t kv = @@ -1043,7 +1160,7 @@ db_spam = dbstore_open(db_spam_what, settings_gnet_db_dir(), db_spam_base, kv, packing, SPAM_DB_CACHE_SIZE, - gnet_host_hash, gnet_host_eq, FALSE); + gnet_host_hash, gnet_host_equal, FALSE); hostiles_spam_prune_old();
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/hostiles.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/hostiles.h
Changed
@@ -38,14 +38,118 @@ #include "common.h" #include "lib/host_addr.h" +/** + * Reasons why a host could be banned. + */ +typedef enum hostiles_flags { + HSTL_STATIC = (1 << 0), /**< In static list */ + HSTL_DUMB = (1 << 1), /**< Dumb spammer */ + HSTL_WEIRD_MSG = (1 << 2), /**< Sends weird messages */ + HSTL_DUP_INDEX = (1 << 3), /**< Duplicate index in results */ + HSTL_DUP_SHA1 = (1 << 4), /**< Duplicate SHA1 in results */ + HSTL_FAKE_SPAM = (1 << 5), /**< Sends fake query hits */ + HSTL_NAME_SPAM = (1 << 6), /**< Sends names flagged as spam */ + HSTL_URL_SPAM = (1 << 7), /**< Sends URL-based spam */ + HSTL_URN_SPAM = (1 << 8), /**< Sends URN flagged as spam */ + HSTL_EVIL_FILENAME = (1 << 9), /**< Sends evil filenames */ + HSTL_BAD_UTF8 = (1 << 10), /**< Sends invalid UTF-8 */ + HSTL_OOB = (1 << 11), /**< Sends unrequested OOB hits */ + HSTL_UDP_GUESS = (1 << 12), /**< UDP-relayed hit, not GUESS */ + HSTL_BAD_FILE_INDEX = (1 << 13), /**< Bad file index in hits */ + HSTL_GTKG = (1 << 14), /**< Hit advertised from GTKG */ + HSTL_NO_GTKG_VERSION = (1 << 15), /**< Hit advertised from GTKG */ + HSTL_BAD_GTKG_GUID = (1 << 16), /**< GTKG hit with improper GUID */ + HSTL_MANY_ALT_LOCS = (1 << 17), /**< Too many alt-locs in hits */ + HSTL_EVIL_TIMESTAMP = (1 << 18), /**< Evil timestamp in hits */ + HSTL_NO_WHATS_NEW = (1 << 19), /**< Missing what's new support */ + HSTL_CLOSE_FILENAME = (1 << 20), /**< Filename similar to query */ + HSTL_MISSING_XML = (1 << 21), /**< Missing XML in hit */ + HSTL_NO_CREATE_TIME = (1 << 22), /**< Missing "CT" in hits */ + HSTL_ODD_GUID = (1 << 23), /**< Odd GUID in hits */ + HSTL_BANNED_GUID = (1 << 24), /**< Banned GUID in hits */ + HSTL_BAD_VENDOR_CODE = (1 << 25), /**< Bad vendor code in hits */ + HSTL_GIBBERISH = (1 << 26), /**< Cannot parse messages */ + HSTL_NON_UTF8 = (1 << 27), /**< Non UTF-8 encoding of hits */ + HSTL_CLEAN = 0 /**< Not hostile */ +} hostiles_flags_t; + +const char *hostiles_flags_to_string(const hostiles_flags_t flags); + void hostiles_init(void); void hostiles_close(void); -gboolean hostiles_check(const host_addr_t addr); -gboolean hostiles_spam_check(const host_addr_t addr, guint16 port); +hostiles_flags_t hostiles_check(const host_addr_t addr); +bool hostiles_spam_check(const host_addr_t addr, uint16 port); + +void hostiles_dynamic_add(const host_addr_t addr, const char *reason, + hostiles_flags_t flags); +void hostiles_spam_add(const host_addr_t addr, uint16 port); -void hostiles_dynamic_add(const host_addr_t addr, const char *reason); -void hostiles_spam_add(const host_addr_t addr, guint16 port); +/** + * Is address that of a host with some hostile flags set? + */ +static inline bool +hostiles_is_known(const host_addr_t addr) +{ + return HSTL_CLEAN != hostiles_check(addr); +} + +/** + * Are hostiles flags considered bad? + */ +static inline bool +hostiles_flags_are_bad(const hostiles_flags_t flags) +{ + return 0 != (flags & ( + HSTL_STATIC | + HSTL_DUMB | + HSTL_DUP_SHA1 | + HSTL_EVIL_FILENAME | + HSTL_EVIL_TIMESTAMP | + HSTL_BAD_UTF8 | + HSTL_URL_SPAM | + HSTL_URN_SPAM | + HSTL_OOB | + HSTL_CLOSE_FILENAME | + HSTL_BANNED_GUID + ) + ); +} + +/** + * Are hostiles flags suggesting that we avoid transactions with host? + */ +static inline bool +hostiles_flags_warrant_shunning(const hostiles_flags_t flags) +{ + return 0 != (flags & ( + HSTL_STATIC | + HSTL_WEIRD_MSG | + HSTL_BAD_VENDOR_CODE | + HSTL_BANNED_GUID | + HSTL_GIBBERISH | + HSTL_NON_UTF8 + ) + ); +} + +/** + * Is address that of a host with hostiles flags that suggest a bad node? + */ +static inline bool +hostiles_is_bad(const host_addr_t addr) +{ + return hostiles_flags_are_bad(hostiles_check(addr)); +} + +/** + * Is address that of a host with hostiles flags suggesting we shun that node? + */ +static inline bool +hostiles_should_shun(const host_addr_t addr) +{ + return hostiles_flags_warrant_shunning(hostiles_check(addr)); +} #endif /* _core_hostiles_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/hosts.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/hosts.c
Changed
@@ -47,6 +47,8 @@ #include "uhc.h" #include "whitelist.h" +#include "g2/gwc.h" + #include "if/gnet_property_priv.h" #include "if/dht/dht.h" /* For dht_fill_random() */ @@ -57,6 +59,7 @@ #include "lib/stringify.h" #include "lib/tm.h" #include "lib/walloc.h" +#include "lib/xmalloc.h" #include "lib/override.h" /* Must be the last header included */ @@ -64,21 +67,27 @@ #define HOST_DHT_MAX 50 /**< Get that many random hosts */ #define HOST_CONNECT_FREQ 120 /**< At most 1 connection per 2 mins */ -gboolean host_low_on_pongs = FALSE; /**< True when less than 12% full */ +bool host_low_on_pongs = FALSE; /**< True when less than 12% full */ -static gboolean in_shutdown = FALSE; +static bool in_shutdown = FALSE; static aging_table_t *node_connects; +#define HOST_GNET 0 /* Gnutella */ +#define HOST_G2 1 /* G2 */ + /* * Avoid nodes being stuck helplessly due to completely stale caches. - * @return TRUE if an UHC may be contact, FALSE if it's not permissable. + * @return TRUE if an UHC may be contacted, FALSE if it's not permissable. */ -static gboolean -host_cache_allow_bypass(void) +static bool +host_cache_allow_bypass(int which) { - static time_t last_try; + static time_t last_try2; + uint count = which == HOST_GNET ? node_count() : node_g2_count(); + + g_assert(UNSIGNED(which) < N_ITEMS(last_try)); - if (node_count() > 0) + if (count != 0) return FALSE; /* Wait at least 2 minutes after starting up */ @@ -90,10 +99,10 @@ * or downtime. */ - if (last_try && delta_time(tm_time(), last_try) < 12 * 3600) + if (last_trywhich && delta_time(tm_time(), last_trywhich) < 12 * 3600) return FALSE; - last_try = tm_time(); + last_trywhich = tm_time(); return TRUE; } @@ -101,14 +110,30 @@ * Attempt Gnutella host connection. * @return TRUE if OK, FALSE if attempt was throttled */ -static gboolean -host_gnutella_connect(host_addr_t addr, guint16 port) +static bool +host_gnutella_connect(host_addr_t addr, uint16 port) +{ + if (aging_lookup(node_connects, &addr)) + return FALSE; + + node_add(addr, port, 0); + aging_insert(node_connects, wcopy(&addr, sizeof addr), uint_to_pointer(1)); + + return TRUE; +} + +/** + * Attempt G2 host connection. + * @return TRUE if OK, FALSE if attempt was throttled + */ +static bool +host_g2_connect(host_addr_t addr, uint16 port) { if (aging_lookup(node_connects, &addr)) return FALSE; - node_add_socket(NULL, addr, port, 0); - aging_insert(node_connects, wcopy(&addr, sizeof addr), GUINT_TO_POINTER(1)); + node_g2_add(addr, port, 0); + aging_insert(node_connects, wcopy(&addr, sizeof addr), uint_to_pointer(1)); return TRUE; } @@ -123,24 +148,31 @@ void host_timer(void) { - guint count; - int missing; + uint count, g2_count, max_nodes, max_g2_nodes; + int missing, g2_missing; host_addr_t addr; - guint16 port; + uint16 port; host_type_t htype; - guint max_nodes; - gboolean empty_cache = FALSE; + bool empty_cache = FALSE, empty_g2_cache = FALSE; - if (in_shutdown || !GNET_PROPERTY(online_mode)) + if ( + in_shutdown || + !GNET_PROPERTY(online_mode) || + GNET_PROPERTY(net_buffer_shortage) + ) return; - max_nodes = settings_is_leaf() ? - GNET_PROPERTY(max_ultrapeers) : GNET_PROPERTY(max_connections); + max_nodes = node_outdegree(); /* Gnutella, depending on leaf/ultra mode */ + max_g2_nodes = GNET_PROPERTY(max_g2_hubs); count = node_count(); /* Established + connecting */ + g2_count = node_g2_count(); /* Established + connecting */ missing = node_keep_missing(); + g2_missing = node_g2_hubs_missing(); - if (GNET_PROPERTY(host_debug) > 1) - g_debug("host_timer - count %u, missing %u", count, missing); + if (GNET_PROPERTY(host_debug) > 1) { + g_debug("%s(): count=%u, missing=%u, missing G2=%u", + G_STRFUNC, count, missing, g2_missing); + } /* * If we are not connected to the Internet, apparently, make sure to @@ -156,7 +188,7 @@ last_try = tm_time(); if (GNET_PROPERTY(host_debug)) - g_debug("host_timer - not connected, trying to connect"); + g_debug("%s(): not connected, trying to connect", G_STRFUNC); } /* @@ -165,10 +197,15 @@ * than quick_connect_pool_size This is the "greedy mode". */ - if (count >= GNET_PROPERTY(quick_connect_pool_size)) { - if (GNET_PROPERTY(host_debug) > 1) - g_debug("host_timer - count %u >= pool size %u", - count, GNET_PROPERTY(quick_connect_pool_size)); + if ( + (int) (count + g2_count - max_nodes - max_g2_nodes) >= + (int) GNET_PROPERTY(quick_connect_pool_size) + ) { + if (GNET_PROPERTY(host_debug) > 1) { + g_debug("%s(): count %u + %u - %u - %u >= pool size %u", + G_STRFUNC, count, g2_count, max_nodes, max_g2_nodes, + GNET_PROPERTY(quick_connect_pool_size)); + } return; } @@ -194,13 +231,23 @@ if (hcache_size(htype) == 0) htype = HOST_ANY; - if (hcache_size(htype) == 0) - empty_cache = TRUE; + empty_cache = 0 == hcache_size(htype); + empty_g2_cache = 0 == hcache_size(HOST_G2HUB); + + if (GNET_PROPERTY(host_debug)) { + if (missing > 0) { + g_debug("%s(): missing %d host%s%s", G_STRFUNC, + missing, plural(missing), + empty_cache ? " empty caches" : ""); + } + + if (g2_missing > 0) { + g_debug("%s(): missing %d G2 host%s%s", G_STRFUNC, + g2_missing, plural(g2_missing), + empty_g2_cache ? " empty caches" : ""); + } + } - if (GNET_PROPERTY(host_debug) && missing > 0) - g_debug("host_timer - missing %d host%s%s", - missing, missing == 1 ? "" : "s", - empty_cache ? " empty caches" : ""); if (!GNET_PROPERTY(stop_host_get)) { if (missing > 0) { @@ -210,7 +257,7 @@ max_pool = MAX(GNET_PROPERTY(quick_connect_pool_size), max_nodes); fan = (missing * GNET_PROPERTY(quick_connect_pool_size))/ max_pool; fan = MAX(1, fan); - to_add = GNET_PROPERTY(is_inet_connected) ? fan : (guint) missing; + to_add = GNET_PROPERTY(is_inet_connected) ? fan : (uint) missing; /* * Every so many calls, attempt to ping all our neighbours to @@ -234,9 +281,9 @@ to_add = max_pool - count; if (GNET_PROPERTY(host_debug) > 2) { - g_debug("host_timer - connecting - " + g_debug("%s(): connecting - " "add: %d fan:%d miss:%d max_hosts:%d count:%d extra:%d", - to_add, fan, missing, max_nodes, count, + G_STRFUNC, to_add, fan, missing, max_nodes, count, GNET_PROPERTY(quick_connect_pool_size)); } @@ -248,7 +295,7 @@ int i; hcount = dht_fill_random(host, - MIN(UNSIGNED(missing), G_N_ELEMENTS(host))); + MIN(UNSIGNED(missing), N_ITEMS(host))); missing -= hcount; @@ -257,8 +304,8 @@ port = gnet_host_get_port(&hosti); if (!hcache_node_is_bad(addr)) { if (GNET_PROPERTY(host_debug) > 3) { - g_debug("host_timer - UHC pinging and connecting " - "to DHT node at %s", + g_debug("%s(): UHC pinging and connecting " + "to DHT node at %s", G_STRFUNC, host_addr_port_to_string(addr, port)); } /* Try to use the host as an UHC before connecting */ @@ -274,7 +321,7 @@ while (hcache_size(htype) && missing-- > 0) { if (hcache_get_caught(htype, &addr, &port)) { - if (!(hostiles_check(addr) || hcache_node_is_bad(addr))) { + if (!(hostiles_is_bad(addr) || hcache_node_is_bad(addr))) { if (!host_gnutella_connect(addr, port)) { missing++; /* Did not use entry */ } @@ -284,15 +331,43 @@ } } - if (missing > 0 && (empty_cache || host_cache_allow_bypass())) { + if ( + missing > 0 && + (empty_cache || host_cache_allow_bypass(HOST_GNET)) + ) { if (!uhc_is_waiting()) { if (GNET_PROPERTY(host_debug)) - g_debug("host_timer - querying UDP host cache"); + g_debug("%s(): querying UDP host cache", G_STRFUNC); uhc_get_hosts(); /* Get new hosts from UHCs */ } } } + if (g2_missing > 0) { + while (hcache_size(HOST_G2HUB) && g2_missing-- > 0) { + if (hcache_get_caught(HOST_G2HUB, &addr, &port)) { + if (!(hostiles_is_bad(addr) || hcache_node_is_bad(addr))) { + if (!host_g2_connect(addr, port)) { + g2_missing++; /* Did not use entry */ + } + } else { + g2_missing++; /* Did not use entry */ + } + } + } + + if ( + g2_missing != 0 && + (empty_g2_cache || host_cache_allow_bypass(HOST_G2)) + ) { + if (!gwc_is_waiting()) { + if (GNET_PROPERTY(host_debug)) + g_debug("%s(): querying GWC for G2", G_STRFUNC); + gwc_get_hosts(); /* Get new hosts from a random GWC */ + } + } + } + } else if (GNET_PROPERTY(use_netmasks)) { /* Try to find better hosts */ if (hcache_find_nearby(htype, &addr, &port)) { @@ -319,7 +394,7 @@ /** * Check whether host's address is usable: routable and not bogus. */ -gboolean +bool host_address_is_usable(const host_addr_t addr) { if (!host_addr_is_routable(addr)) @@ -337,8 +412,8 @@ * i.e. that it has a valid port and that its IP address is not private * nor bogus. */ -gboolean -host_is_valid(const host_addr_t addr, guint16 port) +bool +host_is_valid(const host_addr_t addr, uint16 port) { if (!port_is_valid(port)) return FALSE; @@ -352,7 +427,7 @@ * When `connect' is true, attempt to connect if we are low in Gnet links. */ void -host_add(const host_addr_t addr, guint16 port, gboolean do_connect) +host_add(const host_addr_t addr, uint16 port, bool do_connect) { if (!do_connect || !hcache_add_caught(HOST_ANY, addr, port, "pong")) return; @@ -384,7 +459,7 @@ * may be unsuitable for Gnet connections. */ void -host_add_semi_pong(const host_addr_t addr, guint16 port) +host_add_semi_pong(const host_addr_t addr, uint16 port) { g_assert(host_low_on_pongs); /* Only used when low on pongs */ @@ -394,12 +469,12 @@ /* ---------- Netmask heuristic by Mike Perry -------- */ struct network_pair { - guint32 mask; - guint32 net; + uint32 mask; + uint32 net; }; struct network_pair *local_networks = NULL; -guint32 number_local_networks; +uint32 number_local_networks; /** * frees the local networks array @@ -407,7 +482,7 @@ static void free_networks(void) { - G_FREE_NULL(local_networks); + XFREE_NULL(local_networks); } /** @@ -419,7 +494,7 @@ { char **masks = g_strsplit(str, ";", 0); char *p; - guint32 mask_div; + uint32 mask_div; int i; free_networks(); @@ -437,7 +512,7 @@ return; } - local_networks = g_malloc(i * sizeof *local_networks); + XMALLOC_ARRAY(local_networks, i); for (i = 0; masksi; i++) { /* Network is of the form ip/mask or ip/bits */ @@ -447,7 +522,7 @@ if (strchr(p, '.')) { /* get the network address from the user */ if (!string_to_ip_strict(p, &local_networksi.mask, NULL)) - g_warning("parse_netmasks(): Invalid netmask: \"%s\"", p); + g_warning("%s(): invalid netmask: \"%s\"", G_STRFUNC, p); } else { int error; @@ -455,10 +530,10 @@ mask_div = parse_uint32(p, NULL, 10, &error); mask_div = MIN(32, mask_div); if (error) - g_warning("parse_netmasks(): " - "Invalid CIDR prefixlen: \"%s\"", p); + g_warning("%s(): invalid CIDR prefixlen: \"%s\"", + G_STRFUNC, p); else - local_networksi.mask = (guint32) -1 << (32 - mask_div); + local_networksi.mask = (uint32) -1 << (32 - mask_div); } } else { @@ -467,7 +542,7 @@ } /* get the network address from the user */ if (!string_to_ip_strict(masksi, &local_networksi.net, NULL)) - g_warning("parse_netmasks(): Invalid netmask: \"%s\"", masksi); + g_warning("%s(): invalid netmask: \"%s\"", G_STRFUNC, masksi); } g_strfreev(masks); @@ -476,15 +551,15 @@ /** * @returns true if the address is inside one of the local networks */ -gboolean +bool host_is_nearby(const host_addr_t addr) { - guint i; + uint i; if (host_addr_is_ipv4(addr)) { for (i = 0; i < number_local_networks; i++) { - guint32 m_mask = local_networksi.mask; - guint32 m_ip = local_networksi.net; + uint32 m_mask = local_networksi.mask; + uint32 m_ip = local_networksi.net; if ((host_addr_ipv4(addr) & m_mask) == (m_ip & m_mask)) return TRUE;
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/hosts.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/hosts.h
Changed
@@ -32,8 +32,7 @@ * Global Data */ -extern GList *sl_caught_hosts; -extern gboolean host_low_on_pongs; +extern bool host_low_on_pongs; /* * Global Functions @@ -41,15 +40,15 @@ void host_init(void); void host_timer(void); -void host_add(const host_addr_t addr, guint16, gboolean); -void host_add_semi_pong(const host_addr_t addr, guint16 port); +void host_add(const host_addr_t addr, uint16, bool); +void host_add_semi_pong(const host_addr_t addr, uint16 port); void host_shutdown(void); void host_close(void); void parse_netmasks(const char *value); -gboolean host_is_nearby(const host_addr_t addr); -gboolean host_is_valid(const host_addr_t addr, guint16 port); -gboolean host_address_is_usable(const host_addr_t addr); +bool host_is_nearby(const host_addr_t addr); +bool host_is_valid(const host_addr_t addr, uint16 port); +bool host_address_is_usable(const host_addr_t addr); #endif /* _core_hosts_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/hsep.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/hsep.c
Changed
@@ -94,6 +94,7 @@ #include "common.h" #include "hsep.h" + #include "features.h" #include "gmsg.h" #include "nodes.h" @@ -107,11 +108,12 @@ #include "lib/endian.h" #include "lib/glib-missing.h" +#include "lib/override.h" +#include "lib/pslist.h" #include "lib/random.h" #include "lib/stringify.h" #include "lib/tm.h" #include "lib/walloc.h" -#include "lib/override.h" /** global HSEP table */ static hsep_triple hsep_global_tableHSEP_N_MAX + 1; @@ -140,7 +142,7 @@ /* do nothing if we don't have any listeners */ if (event_subscriber_active(hsep_global_table_changed_event)) { - hsep_triple tableG_N_ELEMENTS(hsep_global_table); + hsep_triple tableN_ITEMS(hsep_global_table); /* * Make a copy of the global HSEP table and give that @@ -148,10 +150,10 @@ * listeners. */ - hsep_get_global_table(table, G_N_ELEMENTS(table)); + hsep_get_global_table(table, N_ITEMS(table)); event_trigger(hsep_global_table_changed_event, - T_NORMAL(hsep_global_listener_t, (table, G_N_ELEMENTS(table)))); + T_NORMAL(hsep_global_listener_t, (table, N_ITEMS(table)))); } } @@ -160,18 +162,18 @@ * triple is given. Returns TRUE if monotony is ok, FALSE otherwise. */ -static gboolean +static bool hsep_check_monotony(hsep_triple *table, unsigned int triples) { - gboolean error = FALSE; - guint i, j; + bool error = FALSE; + uint i, j; g_assert(table); for (i = 1; i < triples; i++) { /* if any triple is not >= the previous one, error will be TRUE */ - for (j = 0; j < G_N_ELEMENTS(table0); j++) + for (j = 0; j < N_ITEMS(table0); j++) error |= tablei - 1j > tableij; if (error) @@ -200,8 +202,8 @@ static void hsep_sanity_check(void) { - const GSList *sl; - hsep_triple sumG_N_ELEMENTS(hsep_global_table); + const pslist_t *sl; + hsep_triple sumN_ITEMS(hsep_global_table); unsigned int i, j; ZERO(&sum); @@ -213,8 +215,8 @@ * sum up all the connections' triple values. */ - for (sl = node_all_nodes() ; sl; sl = g_slist_next(sl)) { - struct gnutella_node *n = sl->data; + PSLIST_FOREACH(node_all_gnet_nodes(), sl) { + gnutella_node_t *n = sl->data; /* also consider unestablished connections here */ @@ -228,22 +230,22 @@ /* check if values are monotonously increasing (skip first) */ g_assert( - hsep_check_monotony(cast_to_gpointer(n->hsep->table1), - G_N_ELEMENTS(n->hsep->table1) - 1) + hsep_check_monotony(cast_to_pointer(n->hsep->table1), + N_ITEMS(n->hsep->table1) - 1) ); /* sum up the values */ - for (i = 0; i < G_N_ELEMENTS(sum); i++) { - for (j = 0; j < G_N_ELEMENTS(sum0); j++) + for (i = 0; i < N_ITEMS(sum); i++) { + for (j = 0; j < N_ITEMS(sum0); j++) sumij += n->hsep->tableij; } } /* check sums */ - for (i = 0; i < G_N_ELEMENTS(sum); i++) { - for (j = 0; j < G_N_ELEMENTS(sum0); j++) + for (i = 0; i < N_ITEMS(sum); i++) { + for (j = 0; j < N_ITEMS(sum0); j++) g_assert(hsep_global_tableij == sumij); } } @@ -259,17 +261,17 @@ printf("HSEP: Reachable nodes (1-%d hops): ", HSEP_N_MAX); - for (i = 1; i < G_N_ELEMENTS(hsep_global_table); i++) + for (i = 1; i < N_ITEMS(hsep_global_table); i++) printf("%s ", uint64_to_string(hsep_global_tableiHSEP_IDX_NODES)); printf("\nHSEP: Reachable files (1-%d hops): ", HSEP_N_MAX); - for (i = 1; i < G_N_ELEMENTS(hsep_global_table); i++) + for (i = 1; i < N_ITEMS(hsep_global_table); i++) printf("%s ", uint64_to_string(hsep_global_tableiHSEP_IDX_FILES)); printf("\nHSEP: Reachable KiB (1-%d hops): ", HSEP_N_MAX); - for (i = 1; i < G_N_ELEMENTS(hsep_global_table); i++) + for (i = 1; i < N_ITEMS(hsep_global_table); i++) printf("%s ", uint64_to_string(hsep_global_tableiHSEP_IDX_KIB)); printf("\n"); @@ -295,8 +297,8 @@ static unsigned int hsep_triples_to_send(const hsep_triple *table, unsigned int triples) { - guint i, j, last; - gboolean changed = FALSE; + uint i, j, last; + bool changed = FALSE; g_assert(table); @@ -309,7 +311,7 @@ for (i = last; i-- > 0; triples--) { - for (j = 0; j < G_N_ELEMENTS(table0); j++) + for (j = 0; j < N_ITEMS(table0); j++) changed |= tableij != tablelastj; if (changed) @@ -324,7 +326,7 @@ * Initializes HSEP. */ -G_GNUC_COLD void +void G_COLD hsep_init(void) { header_features_add(FEATURES_CONNECTIONS, @@ -342,9 +344,9 @@ */ void -hsep_add_global_table_listener(GCallback cb, frequency_t t, guint32 interval) +hsep_add_global_table_listener(callback_fn_t cb, frequency_t t, uint32 interval) { - hsep_triple tableG_N_ELEMENTS(hsep_global_table); + hsep_triple tableN_ITEMS(hsep_global_table); hsep_global_listener_t func = (hsep_global_listener_t) cb; @@ -358,12 +360,12 @@ * given callback call constraints. */ - hsep_get_global_table(table, G_N_ELEMENTS(table)); - func(table, G_N_ELEMENTS(table)); + hsep_get_global_table(table, N_ITEMS(table)); + func(table, N_ITEMS(table)); } void -hsep_remove_global_table_listener(GCallback cb) +hsep_remove_global_table_listener(callback_fn_t cb) { event_remove_subscriber(hsep_global_table_changed_event, cb); } @@ -381,13 +383,13 @@ void hsep_reset(void) { - const GSList *sl; - guint i; + const pslist_t *sl; + uint i; ZERO(&hsep_global_table); - for (sl = node_all_nodes(); sl; sl = g_slist_next(sl)) { - struct gnutella_node *n = sl->data; + PSLIST_FOREACH(node_all_gnet_nodes(), sl) { + gnutella_node_t *n = sl->data; /* also consider unestablished connections here */ @@ -401,7 +403,7 @@ /* this is what we know before receiving the first message */ - for (i = 1; i < G_N_ELEMENTS(hsep_global_table); i++) { + for (i = 1; i < N_ITEMS(hsep_global_table); i++) { n->hsep->tableiHSEP_IDX_NODES = 1; hsep_global_tableiHSEP_IDX_NODES++; } @@ -420,11 +422,11 @@ */ void -hsep_connection_init(struct gnutella_node *n, guint8 major, guint8 minor) +hsep_connection_init(gnutella_node_t *n, uint8 major, uint8 minor) { static const hsep_ctx_t zero_hsep; time_t now = tm_time(); - guint i; + uint i; g_assert(n); @@ -440,7 +442,7 @@ /* this is what we know before receiving the first message */ - for (i = 1; i < G_N_ELEMENTS(hsep_global_table); i++) { + for (i = 1; i < N_ITEMS(hsep_global_table); i++) { n->hsep->tableiHSEP_IDX_NODES = 1; hsep_global_tableiHSEP_IDX_NODES++; } @@ -460,8 +462,8 @@ void hsep_timer(time_t now) { - const GSList *sl; - gboolean scanning_shared; + const pslist_t *sl; + bool scanning_shared; static time_t last_sent = 0; /* update number of shared files and KiB */ @@ -475,8 +477,8 @@ hsep_notify_shared(0UL, 0UL); } - for (sl = node_all_nodes(); sl; sl = g_slist_next(sl)) { - struct gnutella_node *n = sl->data; + PSLIST_FOREACH(node_all_gnet_nodes(), sl) { + gnutella_node_t *n = sl->data; int diff; /* only consider established connections here */ @@ -514,7 +516,7 @@ * zero and the CAN_HSEP attribute is cleared. */ void -hsep_connection_close(struct gnutella_node *n, gboolean in_shutdown) +hsep_connection_close(gnutella_node_t *n, bool in_shutdown) { unsigned int i, j; @@ -528,9 +530,9 @@ if (in_shutdown) goto cleanup; - for (i = 1; i < G_N_ELEMENTS(hsep_global_table); i++) { + for (i = 1; i < N_ITEMS(hsep_global_table); i++) { - for (j = 0; j < G_N_ELEMENTS(hsep_global_table0); j++) { + for (j = 0; j < N_ITEMS(hsep_global_table0); j++) { hsep_global_tableij -= n->hsep->tableij; n->hsep->tableij = 0; } @@ -555,7 +557,7 @@ static inline void hsep_fix_endian(hsep_triple *messaget, size_t n) { -#if G_BYTE_ORDER == G_LITTLE_ENDIAN +#if IS_LITTLE_ENDIAN (void) messaget; (void) n; #else @@ -568,11 +570,11 @@ */ for (i = 0; i < n; i++) { - for (j = 0; j < G_N_ELEMENTS(messaget0); j++) { + for (j = 0; j < N_ITEMS(messaget0); j++) { poke_le64(&messagetij, messagetij); } } -#endif /* LITTLE ENDIAN */ +#endif /* IS_LITTLE_ENDIAN */ } /** @@ -581,7 +583,7 @@ */ void -hsep_process_msg(struct gnutella_node *n, time_t now) +hsep_process_msg(gnutella_node_t *n, time_t now) { unsigned int i, j, k, max, msgmax, length; hsep_triple *messaget; @@ -595,7 +597,7 @@ /* note the offset between message and local data by 1 triple */ - messaget = cast_to_gpointer(n->data); + messaget = cast_to_pointer(n->data); if (length == 0) { /* error, at least 1 triple must be present */ if (GNET_PROPERTY(hsep_debug) > 1) @@ -649,8 +651,8 @@ } if (GNET_PROPERTY(hsep_debug) > 1) { - printf("HSEP: Received %d %s from node %s (msg #%u): ", max, - max == 1 ? "triple" : "triples", + printf("HSEP: Received %d triple%s from node %s (msg #%u): ", + max, plural(max), host_addr_port_to_string(n->addr, n->port), hsep->msgs_received + 1); } @@ -662,16 +664,16 @@ for (k = 0, i = 1; k < max; k++, i++) { if (GNET_PROPERTY(hsep_debug) > 1) { - char bufG_N_ELEMENTS(messaget0)32; + char bufN_ITEMS(messaget0)32; - for (j = 0; j < G_N_ELEMENTS(buf); j++) + for (j = 0; j < N_ITEMS(buf); j++) uint64_to_string_buf(messagetkj, bufj, sizeof buf0); - STATIC_ASSERT(3 == G_N_ELEMENTS(buf)); + STATIC_ASSERT(3 == N_ITEMS(buf)); printf("(%s, %s, %s) ", buf0, buf1, buf2); } - for (j = 0; j < G_N_ELEMENTS(hsep_global_table0); j++) { + for (j = 0; j < N_ITEMS(hsep_global_table0); j++) { hsep_global_tableij += messagetkj - hsep->tableij; hsep->tableij = messagetkj; } @@ -689,9 +691,9 @@ if (k > 0) k--; - for (/* NOTHING */; i < G_N_ELEMENTS(hsep_global_table); i++) { + for (/* NOTHING */; i < N_ITEMS(hsep_global_table); i++) { - for (j = 0; j < G_N_ELEMENTS(hsep_global_table0); j++) { + for (j = 0; j < N_ITEMS(hsep_global_table0); j++) { hsep_global_tableij += messagetkj - hsep->tableij; hsep->tableij = messagetkj; } @@ -720,9 +722,9 @@ */ void -hsep_send_msg(struct gnutella_node *n, time_t now) +hsep_send_msg(gnutella_node_t *n, time_t now) { - hsep_triple tmpG_N_ELEMENTS(n->hsep->sent_table), other; + hsep_triple tmpN_ITEMS(n->hsep->sent_table), other; unsigned int i, j, msglen, msgsize, triples, opttriples; gnutella_msg_hsep_t *msg; hsep_ctx_t *hsep; @@ -741,7 +743,7 @@ * it contains only our own triple, which is correct. */ - triples = settings_is_leaf() ? 1 : G_N_ELEMENTS(tmp); + triples = settings_is_leaf() ? 1 : N_ITEMS(tmp); /* * Allocate and initialize message to send. @@ -752,7 +754,7 @@ { gnutella_header_t *header; - + header = gnutella_msg_hsep_header(msg); message_set_muid(header, GTA_MSG_HSEP_DATA); gnutella_header_set_function(header, GTA_MSG_HSEP_DATA); @@ -771,8 +773,8 @@ } for (i = 0; i < triples; i++) { - for (j = 0; j < G_N_ELEMENTS(other); j++) { - guint64 val; + for (j = 0; j < N_ITEMS(other); j++) { + uint64 val; val = hsep_ownj + (0 == i ? 0 : otherj) + hsep_global_tableij - hsep->tableij; @@ -789,7 +791,7 @@ goto charge_timer; } - memcpy(cast_to_gchar_ptr(msg) + GTA_HEADER_SIZE, + memcpy(cast_to_char_ptr(msg) + GTA_HEADER_SIZE, tmp, triples * sizeof tmp0); /* store the table for later comparison */ @@ -802,27 +804,27 @@ */ /* optimize number of triples to send */ - opttriples = hsep_triples_to_send(cast_to_gpointer(tmp), triples); + opttriples = hsep_triples_to_send(cast_to_pointer(tmp), triples); if (GNET_PROPERTY(hsep_debug) > 1) { - printf("HSEP: Sending %d %s to node %s (msg #%u): ", opttriples, - opttriples == 1 ? "triple" : "triples", + printf("HSEP: Sending %d triple%s to node %s (msg #%u): ", + opttriples, plural(opttriples), host_addr_port_to_string(n->addr, n->port), hsep->msgs_sent + 1); } for (i = 0; i < opttriples; i++) { if (GNET_PROPERTY(hsep_debug) > 1) { - char bufG_N_ELEMENTS(hsep_own)32; + char bufN_ITEMS(hsep_own)32; - for (j = 0; j < G_N_ELEMENTS(buf); j++) { - guint64 v; + for (j = 0; j < N_ITEMS(buf); j++) { + uint64 v; v = hsep_ownj + hsep_global_tableij - hsep->tableij; uint64_to_string_buf(v, bufj, sizeof buf0); } - STATIC_ASSERT(3 == G_N_ELEMENTS(buf)); + STATIC_ASSERT(3 == N_ITEMS(buf)); printf("(%s, %s, %s) ", buf0, buf1, buf2); } } @@ -863,7 +865,7 @@ */ void -hsep_notify_shared(guint64 own_files, guint64 own_kibibytes) +hsep_notify_shared(uint64 own_files, uint64 own_kibibytes) { /* check for change */ if ( @@ -901,7 +903,7 @@ { g_assert(buffer); - maxtriples = MIN(maxtriples, G_N_ELEMENTS(hsep_global_table)); + maxtriples = MIN(maxtriples, N_ITEMS(hsep_global_table)); memcpy(buffer, hsep_global_table, maxtriples * sizeof buffer0); return maxtriples; @@ -917,14 +919,14 @@ */ unsigned int -hsep_get_connection_table(const struct gnutella_node *n, +hsep_get_connection_table(const gnutella_node_t *n, hsep_triple *buffer, unsigned int maxtriples) { g_assert(n); g_assert(n->hsep); g_assert(buffer); - maxtriples = MIN(maxtriples, G_N_ELEMENTS(n->hsep->table)); + maxtriples = MIN(maxtriples, N_ITEMS(n->hsep->table)); memcpy(buffer, n->hsep->table, maxtriples * sizeof buffer0); return maxtriples; @@ -947,7 +949,7 @@ * FALSE otherwise. */ -gboolean +bool hsep_has_global_table_changed(time_t since) { return delta_time(hsep_last_global_table_change, since) > 0; @@ -969,10 +971,10 @@ void hsep_get_non_hsep_triple(hsep_triple *tripledest) { - const GSList *sl; - guint64 other_nodes = 0; /* # of non-HSEP nodes */ - guint64 other_files = 0; /* what non-HSEP nodes share (files) */ - guint64 other_kib = 0; /* what non-HSEP nodes share (KiB) */ + const pslist_t *sl; + uint64 other_nodes = 0; /* # of non-HSEP nodes */ + uint64 other_files = 0; /* what non-HSEP nodes share (files) */ + uint64 other_kib = 0; /* what non-HSEP nodes share (KiB) */ g_assert(tripledest); @@ -981,8 +983,8 @@ * sum up what they share (PONG-based library size). */ - for (sl = node_all_nodes() ; sl; sl = g_slist_next(sl)) { - struct gnutella_node *n = sl->data; + PSLIST_FOREACH(node_all_gnet_nodes(), sl) { + gnutella_node_t *n = sl->data; gnet_node_status_t status; if ((!NODE_IS_ESTABLISHED(n)) || n->attrs & NODE_A_CAN_HSEP) @@ -1015,11 +1017,11 @@ hsep_get_static_str(int row, int column) { const char *ret = NULL; - hsep_triple hsep_tableG_N_ELEMENTS(hsep_global_table); + hsep_triple hsep_tableN_ITEMS(hsep_global_table); hsep_triple other1; - guint64 v; + uint64 v; - hsep_get_global_table(hsep_table, G_N_ELEMENTS(hsep_table)); + hsep_get_global_table(hsep_table, N_ITEMS(hsep_table)); hsep_get_non_hsep_triple(other); switch (column) { @@ -1068,10 +1070,10 @@ int hsep_get_table_size(void) { - hsep_triple hsep_tableG_N_ELEMENTS(hsep_global_table); + hsep_triple hsep_tableN_ITEMS(hsep_global_table); - hsep_get_global_table(hsep_table, G_N_ELEMENTS(hsep_table)); - return G_N_ELEMENTS(hsep_table); + hsep_get_global_table(hsep_table, N_ITEMS(hsep_table)); + return N_ITEMS(hsep_table); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/hsep.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/hsep.h
Changed
@@ -59,19 +59,19 @@ * Public interface. */ -typedef void (*hsep_global_listener_t) (hsep_triple *table, guint32 triples); +typedef void (*hsep_global_listener_t) (hsep_triple *table, uint32 triples); struct gnutella_node; void hsep_init(void); void hsep_reset(void); void hsep_close(void); -void hsep_connection_init(struct gnutella_node *n, guint8 major, guint8 minor); -void hsep_connection_close(struct gnutella_node *n, gboolean in_shutdown); +void hsep_connection_init(struct gnutella_node *n, uint8 major, uint8 minor); +void hsep_connection_close(struct gnutella_node *n, bool in_shutdown); void hsep_send_msg(struct gnutella_node *, time_t now); void hsep_process_msg(struct gnutella_node *, time_t now); void hsep_timer(time_t now); -void hsep_notify_shared(guint64 ownfiles, guint64 ownkibibytes); +void hsep_notify_shared(uint64 ownfiles, uint64 ownkibibytes); unsigned int hsep_get_global_table(hsep_triple *buffer, unsigned int maxtriples); unsigned int hsep_get_connection_table(const struct gnutella_node *n,
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/http.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/http.c
Changed
@@ -49,17 +49,20 @@ #include "rx_inflate.h" #include "rx_chunk.h" -#include "lib/atoms.h" #include "lib/ascii.h" +#include "lib/atoms.h" #include "lib/concat.h" #include "lib/getline.h" -#include "lib/glib-missing.h" #include "lib/gnet_host.h" #include "lib/halloc.h" #include "lib/header.h" +#include "lib/http_range.h" /* For http_range_test() */ #include "lib/log.h" /* For log_printable() */ +#include "lib/mempcpy.h" #include "lib/parse.h" #include "lib/pmsg.h" +#include "lib/pslist.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/timestamp.h" #include "lib/tm.h" @@ -79,7 +82,7 @@ http_url_error_t http_url_errno; /**< Error from http_url_parse() */ -static GSList *sl_outgoing = NULL; /**< To spot reply timeouts */ +static pslist_t *sl_outgoing = NULL; /**< To spot reply timeouts */ /** * Send HTTP status on socket, with code and reason. @@ -100,14 +103,14 @@ * * @returns TRUE if we were able to send everything, FALSE otherwise. */ -gboolean +bool http_send_status( http_layer_t layer, - struct gnutella_socket *s, int code, gboolean keep_alive, + struct gnutella_socket *s, int code, bool keep_alive, http_extra_desc_t *hev, int hevcnt, const char *reason, ...) { - char header2560; /* 2.5 K max */ + char header3072; /* 3 KiB max */ char status_msg512; size_t rw, minimal_rw; size_t header_size = sizeof(header); @@ -120,14 +123,23 @@ const char *date; const char *token; const char *body = NULL; - gboolean saturated = bsched_saturated(BSCHED_BWS_OUT); + size_t body_length = 0; + bool saturated = bsched_saturated(BSCHED_BWS_OUT); int cb_flags = 0; + bool retried = FALSE; va_start(args, reason); - gm_vsnprintf(status_msg, sizeof(status_msg)-1, reason, args); + str_vbprintf(status_msg, sizeof status_msg - 1, reason, args); va_end(args); /* + * When the connection is kept alive and we are unable to send + * back the whole body, we come back here with ``body_length'' + * adjusted to the amount we can safely emit. + */ +retry: + + /* * Prepare flags for callbacks. */ @@ -194,7 +206,7 @@ g_assert(header_size <= sizeof header); date = timestamp_rfc1123_to_string(clock_loc2gmt(tm_time())); - rw = gm_snprintf(header, header_size, + rw = str_bprintf(header, header_size, "HTTP/1.1 %d %s\r\n" "Server: %s\r\n" "Date: %s\r\n" @@ -232,7 +244,7 @@ case HTTP_EXTRA_LINE: if (size > strlen(he->he_msg)) { /* Don't emit truncated lines */ - rw += gm_snprintf(&headerrw, size, "%s", he->he_msg); + rw += str_bprintf(&headerrw, size, "%s", he->he_msg); } break; case HTTP_EXTRA_CALLBACK: @@ -248,22 +260,64 @@ } if (body) { - rw += gm_snprintf(&headerrw, header_size - rw, - "Content-Length: %zu\r\n", strlen(body)); + if (0 == body_length) + body_length = strlen(body); + rw += str_bprintf(&headerrw, header_size - rw, + "Content-Length: %zu\r\n", body_length); } if (rw < header_size) { - rw += gm_snprintf(&headerrw, header_size - rw, "\r\n"); + rw += str_bprintf(&headerrw, header_size - rw, "\r\n"); } if (body) { - rw += gm_snprintf(&headerrw, header_size - rw, "%s", body); + if (!retried) { + rw += str_bprintf(&headerrw, header_size - rw, "%s", body); + } else { + /* + * Since we're retrying, it means the whole body did not fit + * earlier and we decided to only limit it to ``body_length'' + * bytes, which we know can fit. + */ + + rw += clamp_strncpy(&headerrw, header_size - rw, + body, body_length); + } } - if (rw >= header_size && (hev || body)) { - g_warning("HTTP status %d (%s) too big, ignoring extra information", - code, status_msg); + if (rw >= header_size - 1 && (hev || body)) { + g_warning("HTTP status %d (%s) too big, " + "ignoring extra information (%s)", + code, status_msg, host_addr_port_to_string(s->addr, s->port)); rw = minimal_rw; - rw += gm_snprintf(&headerrw, header_size - rw, "\r\n"); + rw += str_bprintf(&headerrw, header_size - rw, "\r\n"); g_assert(rw < header_size); + if (body) { + size_t w; + + rw += (w = str_bprintf(&headerrw, header_size - rw, "%s", body)); + + /* + * If we cannot send back everything and the connection is + * going to be kept alive, we need to limit the body to the amount + * we can really send back. + */ + + if (rw >= header_size - 1) { + g_carp("HTTP status %d (%s) too big, " + "can only send %zu/%zu body bytes to %s", + code, status_msg, w, body_length, + host_addr_port_to_string(s->addr, s->port)); + + if (keep_alive) { + g_assert(!retried); /* No deadly endless loops */ + body_length = w; + retried = TRUE; + g_warning("HTTP status sent on kept-alive, " + "retrying with stripped %zu-byte body for %s", + w, host_addr_port_to_string(s->addr, s->port)); + goto retry; + } + } + } } sent = bws_write(BSCHED_BWS_OUT, &s->wio, header, rw); @@ -276,11 +330,11 @@ } else if ((size_t) sent < rw) { if (GNET_PROPERTY(http_debug)) g_warning( "only sent %lu out of %lu bytes of status %d (%s) to %s", - (gulong) sent, (gulong) rw, code, status_msg, + (ulong) sent, (ulong) rw, code, status_msg, host_addr_to_string(s->addr)); return FALSE; } else { - guint32 trace = 0; + uint32 trace = 0; switch (layer) { case HTTP_PUSH_PROXY: @@ -296,7 +350,7 @@ if (trace) { g_debug("----Sent HTTP status to %s (%lu bytes):", - host_addr_to_string(s->addr), (gulong) rw); + host_addr_to_string(s->addr), (ulong) rw); dump_string(stderr, header, rw, "----"); } } @@ -313,7 +367,7 @@ * emission of the header even if bandwidth is tight (HTTP_CBF_SMALL_REPLY). */ size_t -http_hostname_add(char *buf, size_t size, gpointer arg, guint32 flags) +http_hostname_add(char *buf, size_t size, void *arg, uint32 flags) { size_t len; @@ -324,7 +378,7 @@ len = concat_strings(buf, size, "X-Hostname: ", GNET_PROPERTY(server_hostname), "\r\n", - (void *) 0); + NULL_PTR); return len < size ? len : 0; } @@ -335,14 +389,14 @@ */ size_t http_retry_after_add(char *buf, size_t size, - gpointer arg, guint32 unused_flags) + void *arg, uint32 unused_flags) { size_t len; (void) unused_flags; len = concat_strings(buf, size, "Retry-After: ", uint32_to_string(GPOINTER_TO_UINT(arg)), "\r\n", - (void *) 0); + NULL_PTR); return len < size ? len : 0; } @@ -361,7 +415,7 @@ code_message_parse(const char *line, const char **msg) { const char *endptr; - guint32 v; + uint32 v; int error; /* @@ -410,9 +464,9 @@ */ int http_status_parse(const char *line, - const char *proto, const char **msg, guint *major, guint *minor) + const char *proto, const char **msg, uint *major, uint *minor) { - guchar c; + uchar c; const char *p; /* @@ -516,9 +570,9 @@ * @returns TRUE when we identified the "HTTP/x.x" trailing string, filling * major and minor accordingly. */ -gboolean +bool http_extract_version( - const char *request, size_t len, guint *major, guint *minor) + const char *request, size_t len, uint *major, uint *minor) { const char *p; size_t limit, i; @@ -530,7 +584,7 @@ limit = sizeof("X / HTTP/1.0") - 1; if (GNET_PROPERTY(http_debug) > 4) - g_debug("HTTP req (%lu bytes): %s", (gulong) len, request); + g_debug("HTTP req (%lu bytes): %s", (ulong) len, request); if (len < limit) return FALSE; @@ -546,7 +600,7 @@ } if (GNET_PROPERTY(http_debug) > 4) - g_debug("HTTP i = %lu, limit = %lu", (gulong) i, (gulong) limit); + g_debug("HTTP i = %lu, limit = %lu", (ulong) i, (ulong) limit); if (i == limit) return FALSE; /* Reached our limit without finding a space */ @@ -564,7 +618,7 @@ ) { if (GNET_PROPERTY(http_debug) > 1) g_debug("HTTP req (%lu bytes): no protocol tag: %s", - (gulong) len, request); + (ulong) len, request); return FALSE; } @@ -611,7 +665,7 @@ * and any whitespace otherwise (either pointing to NUL or ';'). */ char * -http_field_starts_with(const char *buf, const char *token, gboolean sensitive) +http_field_starts_with(const char *buf, const char *token, bool sensitive) { const char *p; @@ -645,7 +699,7 @@ skip_to_unquoted(const char *p, int mc) { int c; - gboolean in_quote = FALSE; + bool in_quote = FALSE; while ('\0' != (c = *p)) { if (in_quote) { @@ -678,12 +732,12 @@ * @return TRUE if we managed to fill the value, FALSE on error (value too * large to fit in the buffer, or badly delimited end). */ -static gboolean +static bool http_value_collect(const char *start, char *value, size_t len) { size_t pos = 0; const char *p = start; - gboolean has_quote = FALSE; + bool has_quote = FALSE; int c; g_assert(value != NULL); @@ -812,33 +866,6 @@ *** HTTP URL parsing. ***/ -static const char * const parse_errstr = { - "OK", /**< HTTP_URL_OK */ - "Not an http URI", /**< HTTP_URL_NOT_HTTP */ - "More than one <user>:<password>", /**< HTTP_URL_MULTIPLE_CREDENTIALS */ - "Truncated <user>:<password>", /**< HTTP_URL_BAD_CREDENTIALS */ - "Could not parse port", /**< HTTP_URL_BAD_PORT_PARSING */ - "Port value is out of range", /**< HTTP_URL_BAD_PORT_RANGE */ - "Could not parse host", /**< HTTP_URL_BAD_HOST_PART */ - "Could not resolve host into IP", /**< HTTP_URL_HOSTNAME_UNKNOWN */ - "URL has no URI part", /**< HTTP_URL_MISSING_URI */ -}; - -/** - * @return human-readable error string corresponding to error code `errnum'. - */ -const char * -http_url_strerror(http_url_error_t errnum) -{ - if (UNSIGNED(errnum) >= G_N_ELEMENTS(parse_errstr)) { - static char buf40; - gm_snprintf(buf, sizeof buf, "Invalid URL error code: %u", errnum); - return buf; - } - - return parse_errstrerrnum; -} - /** * Parse HTTP url and extract the IP/port we need to connect to. * Also identifies the start of the path to request on the server. @@ -848,14 +875,14 @@ * The variable `http_url_errno' is set accordingly. * */ -gboolean -http_url_parse(const char *url, guint16 *port, const char **host, +bool +http_url_parse(const char *url, uint16 *port, const char **host, const char **path) { static char hostnameMAX_HOSTLEN + 1; struct { const char *host, *path; - guint16 port; + uint16 port; } tmp; const char *endptr, *p; host_addr_t addr; @@ -893,14 +920,15 @@ host_addr_to_string_buf(addr, hostname, sizeof hostname); } else { size_t len; + char *end; len = endptr - p; if (len >= sizeof hostname) { http_url_errno = HTTP_URL_BAD_HOST_PART; return FALSE; } - memcpy(hostname, p, len); - hostnamelen = '\0'; + end = mempcpy(hostname, p, len); + *end = '\0'; } p = endptr; *host = hostname; /* Static data! */ @@ -909,7 +937,7 @@ *port = HTTP_PORT; } else { int error; - guint32 u; + uint32 u; g_assert(':'== *p); p++; @@ -1046,713 +1074,10 @@ } /*** - *** HTTP range parsing. - ***/ - -/** - * Add a new http_range_t object within the sorted list. - * - * Refuse to add the range if it is overlapping existing ranges. - * - * @param `list' must be sorted if not NULL. - * @param `start' the start of the range to add - * @param `end' the end of the range to add - * @param `field' arguments are only there to log errors, if any. - * @param `vendor' is same as `field'. - * @param `ignored' is set to TRUE if range was ignored. - * - * @return the new head of the list. - */ -static GSList * -http_range_add(GSList *list, filesize_t start, filesize_t end, - const char *field, const char *vendor, gboolean *ignored) -{ - GSList *l; - GSList *prev; - http_range_t *item; - - g_assert(start <= end); /* 0-0 is a 1-byte range containing byte 0 */ - - WALLOC(item); - item->start = start; - item->end = end; - - *ignored = FALSE; - - for (l = list, prev = NULL; l; prev = l, l = g_slist_next(l)) { - http_range_t *r = (http_range_t *) l->data; - - /* - * The list is sorted and there should be no overlapping between - * the items, so as soon as we find a range that starts after "end", - * we know we have to insert before. - */ - - if (r->start > end) { - GSList *next; - - /* Ensure range is not overlapping with previous */ - if (prev != NULL) { - http_range_t *pr = (http_range_t *) prev->data; - - if (pr->end >= start) { - char start_bufUINT64_DEC_BUFLEN; - char end_bufUINT64_DEC_BUFLEN; - - uint64_to_string_buf(start, start_buf, sizeof start_buf); - uint64_to_string_buf(end, end_buf, sizeof end_buf); - - g_warning("vendor <%s> sent us overlapping range %s-%s " - "(with previous %s-%s) in the %s header -- ignoring", - vendor, start_buf, end_buf, - uint64_to_string(pr->start), - uint64_to_string2(pr->end), - field); - goto ignored; - } - } - - /* Ensure range is not overlapping with next, if any */ - next = g_slist_next(l); - if (next != NULL) { - http_range_t *nr = (http_range_t *) next->data; - if (nr->start <= end) { - char start_bufUINT64_DEC_BUFLEN; - char end_bufUINT64_DEC_BUFLEN; - - uint64_to_string_buf(start, start_buf, sizeof start_buf); - uint64_to_string_buf(end, end_buf, sizeof end_buf); - - g_warning("vendor <%s> sent us overlapping range %s-%s " - "(with next %s-%s) in the %s header -- ignoring", - vendor, start_buf, end_buf, - uint64_to_string(nr->start), - uint64_to_string2(nr->end), - field); - goto ignored; - } - } - - /* Insert after `prev' (which may be NULL) */ - return gm_slist_insert_after(list, prev, item); - } - - if (r->end >= start) { - char start_bufUINT64_DEC_BUFLEN; - char end_bufUINT64_DEC_BUFLEN; - - uint64_to_string_buf(start, start_buf, sizeof start_buf); - uint64_to_string_buf(end, end_buf, sizeof end_buf); - - g_warning("vendor <%s> sent us overlapping range %s-%s " - "(with %s-%s) in the %s header -- ignoring", - vendor, start_buf, end_buf, uint64_to_string(r->start), - uint64_to_string2(r->end), field); - goto ignored; - } - } - - /* - * Insert at the tail of the list. - * - * NB: the following call works as expected is list == NULL, because - * then prev == NULL and we insert `item' as the first and only entry. - */ - - return gm_slist_insert_after(list, prev, item); - -ignored: - *ignored = TRUE; - WFREE(item); /* Item was not inserted */ - return list; /* No change in list */ -} - -/** - * Parse a Range: header in the request, returning the list of ranges - * that are enumerated. Invalid ranges are ignored. - * - * Only "bytes" ranges are supported. - * - * When parsing a "bytes=" style, it means it's a request, so we allow - * negative ranges. Otherwise, for "bytes " specifications, it's a reply - * and we ignore negative ranges. - * - * `size' gives the length of the resource, to resolve negative ranges and - * make sure we don't have ranges that extend past that size. - * - * The `field' and `vendor' arguments are only there to log errors, if any. - * - * @returns a sorted list of http_range_t objects. - */ -GSList * -http_range_parse( - const char *field, const char *value, filesize_t size, - const char *vendor) -{ - static const char unit = "bytes"; - GSList *ranges = NULL; - const char *str = value; - guchar c; - filesize_t start; - filesize_t end; - gboolean request = FALSE; /* True if 'bytes=' is seen */ - gboolean has_start; - gboolean has_end; - gboolean skipping; - gboolean minus_seen; - gboolean ignored; - int count = 0; - - g_assert(size > 0); - vendor = vendor ? vendor : "unknown"; - - if (NULL != (str = is_strprefix(str, unit))) { - c = *str; - if (!is_ascii_space(c) && c != '=') { - if (GNET_PROPERTY(http_debug)) g_warning( - "improper %s header from <%s>: %s", field, vendor, value); - return NULL; - } - } else { - if (GNET_PROPERTY(http_debug)) g_warning( - "improper %s header from <%s> (not bytes?): %s", - field, vendor, value); - return NULL; - } - - /* - * Move to the first non-space char. - * Meanwhile, if we see a '=', we know it's a request-type range header. - */ - - while ((c = *str)) { - if (c == '=') { - if (request) { - if (GNET_PROPERTY(http_debug)) g_warning( - "improper %s header from <%s> (multiple '='): %s", - field, vendor, value); - return NULL; - } - request = TRUE; - str++; - continue; - } - if (is_ascii_space(c)) { - str++; - continue; - } - break; - } - - start = 0; - has_start = FALSE; - has_end = FALSE; - end = size - 1; - skipping = FALSE; - minus_seen = FALSE; - - while ((c = *str++)) { - if (is_ascii_space(c)) - continue; - - if (c == ',') { - if (skipping) { - skipping = FALSE; /* ',' is a resynch point */ - continue; - } - - if (!minus_seen) { - if (GNET_PROPERTY(http_debug)) g_warning( - "weird %s header from <%s>, offset %zu (no range?): " - "%s", field, vendor, (str - value) - 1, value); - goto reset; - } - - if (start == HTTP_OFFSET_MAX && !has_end) { /* Bad negative range */ - if (GNET_PROPERTY(http_debug)) g_warning( - "weird %s header from <%s>, offset %zu " - "(incomplete negative range): %s", - field, vendor, (str - value) - 1, value); - goto reset; - } - - if (start > end) { - if (GNET_PROPERTY(http_debug)) g_warning( - "weird %s header from <%s>, offset %zu " - "(swapped range?): %s", field, vendor, - (str - value) - 1, value); - goto reset; - } - - ranges = http_range_add(ranges, - start, end, field, vendor, &ignored); - count++; - - if (ignored) { - if (GNET_PROPERTY(http_debug)) g_warning( - "weird %s header from <%s>, offset %zu " - "(ignored range #%d): %s", - field, vendor, (str - value) - 1, count, value); - } - - goto reset; - } - - if (skipping) /* Waiting for a ',' */ - continue; - - if (c == '-') { - if (minus_seen) { - if (GNET_PROPERTY(http_debug)) g_warning( - "weird %s header from <%s>, offset %zu (spurious '-'): %s", - field, vendor, (str - value) - 1, value); - goto resync; - } - minus_seen = TRUE; - if (!has_start) { /* Negative range */ - if (!request) { - if (GNET_PROPERTY(http_debug)) - g_warning("weird %s header from <%s>, offset %zu " - "(negative range in reply): %s", - field, vendor, (str - value) - 1, value); - goto resync; - } - start = HTTP_OFFSET_MAX; /* Indicates negative range */ - has_start = TRUE; - } - continue; - } - - if (is_ascii_digit(c)) { - int error; - const char *dend; - guint64 val = parse_uint64(str - 1, &dend, 10, &error); - - /* Started with digit! */ - g_assert(dend != (str - 1)); - - str = dend; /* Skip number */ - - if (has_end) { - if (GNET_PROPERTY(http_debug)) - g_warning("weird %s header from <%s>, offset %zu " - "(spurious boundary %s): %s", - field, vendor, (str - value) - 1, - uint64_to_string(val), value); - goto resync; - } - - if (val >= size) { - /* ``last-byte-pos'' may extend beyond the actual - * filesize. It's more a response limit than an exact - * range end specifier. - */ - val = size - 1; - } - - if (has_start) { - if (!minus_seen) { - if (GNET_PROPERTY(http_debug)) - g_warning("weird %s header from <%s>, offset %zu " - "(no '-' before boundary %s): %s", - field, vendor, (str - value) - 1, - uint64_to_string(val), value); - goto resync; - } - if (start == HTTP_OFFSET_MAX) { /* Negative range */ - start = (val > size) ? 0 : size - val; /* Last bytes */ - end = size - 1; - } else { - end = val; - } - has_end = TRUE; - } else { - start = val; - has_start = TRUE; - } - continue; - } - - if (GNET_PROPERTY(http_debug)) - g_warning("weird %s header from <%s>, offset %d " - "(unexpected char '%c'): %s", - field, vendor, (int) (str - value) - 1, c, value); - - /* FALL THROUGH */ - - resync: - skipping = TRUE; - reset: - start = 0; - has_start = FALSE; - has_end = FALSE; - minus_seen = FALSE; - end = size - 1; - } - - /* - * Handle trailing range, if needed. - */ - - if (minus_seen) { - if (start == HTTP_OFFSET_MAX && !has_end) { /* Bad negative range */ - if (GNET_PROPERTY(http_debug)) - g_warning("weird %s header from <%s>, offset %d " - "(incomplete trailing negative range): %s", - field, vendor, (int) (str - value) - 1, value); - goto final; - } - - if (start > end) { - if (GNET_PROPERTY(http_debug)) - g_warning("weird %s header from <%s>, offset %d " - "(swapped trailing range?): %s", field, vendor, - (int) (str - value) - 1, value); - goto final; - } - - ranges = http_range_add(ranges, start, end, field, vendor, &ignored); - count++; - - if (ignored) - if (GNET_PROPERTY(http_debug)) - g_warning("weird %s header from <%s>, offset %d " - "(ignored final range #%d): %s", - field, vendor, (int) (str - value) - 1, count, - value); - } - -final: - - if (GNET_PROPERTY(http_debug) > 4) { - GSList *l; - - g_debug("Saw %d ranges in %s %s: %s", - count, request ? "request" : "reply", field, value); - if (ranges) - g_debug("...retained:"); - for (l = ranges; l; l = g_slist_next(l)) { - http_range_t *r = (http_range_t *) l->data; - g_debug("... %s-%s", - uint64_to_string(r->start), uint64_to_string2(r->end)); - } - } - - if (ranges == NULL && GNET_PROPERTY(http_debug)) - g_warning("retained no ranges in %s header from <%s>: %s", - field, vendor, value); - - return ranges; -} - -/** - * Free list of http_range_t objects. - */ -void -http_range_free(GSList *list) -{ - GSList *l; - - for (l = list; l; l = g_slist_next(l)) - wfree(l->data, sizeof(http_range_t)); - - g_slist_free(list); -} - -/** - * @returns total size of all the ranges. - */ -filesize_t -http_range_size(const GSList *list) -{ - const GSList *l; - filesize_t size = 0; - - for (l = list; l; l = g_slist_next(l)) { - http_range_t *r = l->data; - size += r->end - r->start + 1; - } - - return size; -} - -/** - * @returns a pointer to static data, containing the available ranges. - */ -const char * -http_range_to_string(const GSList *list) -{ - static char str4096; - const GSList *sl = list; - size_t rw; - - for (rw = 0; sl && (size_t) rw < sizeof(str); sl = g_slist_next(sl)) { - const http_range_t *r = (const http_range_t *) sl->data; - char start_bufUINT64_DEC_BUFLEN, end_bufUINT64_DEC_BUFLEN; - - uint64_to_string_buf(r->start, start_buf, sizeof start_buf); - uint64_to_string_buf(r->end, end_buf, sizeof end_buf); - rw += gm_snprintf(&strrw, sizeof(str)-rw, "%s-%s", - start_buf, end_buf); - - if (g_slist_next(sl) != NULL) - rw += gm_snprintf(&strrw, sizeof(str)-rw, ", "); - } - - return str; -} - -/** - * Checks whether range contains the contiguous from, to interval. - */ -gboolean -http_range_contains(GSList *ranges, filesize_t from, filesize_t to) -{ - GSList *l; - - /* - * The following relies on the fact that the `ranges' list is sorted - * and that it contains disjoint intervals. - */ - - for (l = ranges; l; l = g_slist_next(l)) { - http_range_t *r = (http_range_t *) l->data; - - if (from > r->end) - continue; - - if (from < r->start) - break; /* `from' outside of any following interval */ - - /* `from' is within `r' */ - - if (to <= r->end) - return TRUE; - - break; /* No other interval can contain `from' */ - } - - return FALSE; -} - -/** - * @returns a new copy of the given HTTP range. - */ -static http_range_t * -http_range_clone(http_range_t *range) -{ - http_range_t *r; - - WALLOC(r); - r->start = range->start; - r->end = range->end; - - return r; -} - -/** - * @returns a new list based on the merged ranges in the other lists given. - */ -GSList * -http_range_merge(GSList *old_list, GSList *new_list) -{ - http_range_t *old_range, *new_range, *r; - GSList *new = new_list, *old = old_list; - GSList *result_list = NULL; - filesize_t highest = 0; - - /* - * Build a result list based on the data in the old and new - * lists. - */ - - while (old || new) { - if (old && new) { - old_range = old->data; - new_range = new->data; - - /* - * If ranges are identical just copy one. - */ - - if (new_range->start == old_range->start - && new_range->end == old_range->end) { - highest = old_range->end; - result_list = g_slist_prepend(result_list, - http_range_clone(old_range)); - old = g_slist_next(old); - new = g_slist_next(new); - continue; - } - - /* - * Skip over any ranges now below the highest mark, they - * are no longer relevant. - */ - - if (old_range->end < highest) { - old = g_slist_next(old); - continue; - } - if (new_range->end < highest) { - new = g_slist_next(new); - continue; - } - - /* - * If we encounter a range ending at the same spot as the - * latest entry but which starts earlier, correct the starting - * point of the latest range. - */ - - if (result_list != NULL) { - if (old_range->end == highest) { - http_range_t *latest = result_list->data; - g_assert(latest->end == highest); - if (latest->start > old_range->start) - latest->start = old_range->start; - old = g_slist_next(old); - continue; - } - if (new_range->end == highest) { - http_range_t *latest = result_list->data; - g_assert(latest->end == highest); - if (latest->start > new_range->start) - latest->start = new_range->start; - new = g_slist_next(new); - continue; - } - } - - /* - * First handle the non-overlapping case. Copy the first - * non-overlapping range, and move to the next range in - * that list. - */ - - if (new_range->end < old_range->start) { - highest = new_range->end; - result_list = g_slist_prepend(result_list, - http_range_clone(new_range)); - new = g_slist_next(new); - continue; - } - if (old_range->end < new_range->start) { - highest = old_range->end; - result_list = g_slist_prepend(result_list, - http_range_clone(old_range)); - - old = g_slist_next(old); - continue; - } - - /* - * Handle overlapping case. Define a new range based on - * boundaries of both ranges, add it, and then move to - * next on both lists. We don't need to worry about - * non-overlapping case here because we handled that just - * before. - */ - - if (new_range->start > old_range->start) { - WALLOC(r); - r->start = old_range->start; - if (new_range->end > old_range->end) - r->end = new_range->end; - else - r->end = old_range->end; - highest = r->end; - result_list = g_slist_prepend(result_list, r); - old = g_slist_next(old); - new = g_slist_next(new); - continue; - } - if (new_range->start <= old_range->start) { - WALLOC(r); - r->start = new_range->start; - if (new_range->end > old_range->end) - r->end = new_range->end; - else - r->end = old_range->end; - highest = r->end; - result_list = g_slist_prepend(result_list, r); - old = g_slist_next(old); - new = g_slist_next(new); - continue; - } - - } else { - - /* - * If there are no chunks left in one of the lists we just - * copy the other ones unless they are below the highest mark. - */ - - if (old) { - old_range = old->data; - if (old_range->end > highest) - result_list = g_slist_prepend(result_list, - http_range_clone(old_range)); - old = g_slist_next(old); - } - if (new) { - new_range = new->data; - if (new_range->end > highest) - result_list = g_slist_prepend(result_list, - http_range_clone(new_range)); - new = g_slist_next(new); - } - } - } - - return g_slist_reverse(result_list); -} - - - -/*** *** Asynchronous HTTP error code management. ***/ -static const char * const error_str = { - "OK", /**< HTTP_ASYNC_OK */ - "Invalid HTTP URL", /**< HTTP_ASYNC_BAD_URL */ - "Connection failed", /**< HTTP_ASYNC_CONN_FAILED */ - "I/O error", /**< HTTP_ASYNC_IO_ERROR */ - "Request too large", /**< HTTP_ASYNC_REQ2BIG */ - "Header too large", /**< HTTP_ASYNC_HEAD2BIG */ - "User cancel", /**< HTTP_ASYNC_CANCELLED */ - "Got EOF", /**< HTTP_ASYNC_EOF */ - "Unparseable HTTP status", /**< HTTP_ASYNC_BAD_STATUS */ - "Got moved status, but no location", /**< HTTP_ASYNC_NO_LOCATION */ - "Connection timeout", /**< HTTP_ASYNC_CONN_TIMEOUT */ - "Data timeout", /**< HTTP_ASYNC_TIMEOUT */ - "Nested redirection", /**< HTTP_ASYNC_NESTED */ - "Invalid URI in Location header", /**< HTTP_ASYNC_BAD_LOCATION_URI */ - "Connection was closed, all OK", /**< HTTP_ASYNC_CLOSED */ - "Redirected, following disabled", /**< HTTP_ASYNC_REDIRECTED */ - "Unparseable header value", /**< HTTP_ASYNC_BAD_HEADER */ - "Data too large", /**< HTTP_ASYNC_DATA2BIG */ - "Mandatory request not understood", /**< HTTP_ASYNC_MAN_FAILURE */ -}; - -guint http_async_errno; /**< Used to return error codes during setup */ - -/** - * @return human-readable error string corresponding to error code `errnum'. - */ -const char * -http_async_strerror(guint errnum) -{ - if (errnum >= G_N_ELEMENTS(error_str)) { - static char buf50; - gm_snprintf(buf, sizeof buf, - "Invalid HTTP async error code: %u", errnum); - return buf; - } - - return error_strerrnum; -} +http_async_error_t http_async_errno; /**< Error codes during setup */ /*** *** Asynchronous HTTP transactions. @@ -1781,8 +1106,8 @@ enum http_async_magic magic; /**< Magic number */ enum http_reqtype type; /**< Type of request */ http_state_t state; /**< Current request state */ - guint32 flags; /**< Operational flags */ - guint32 options; /**< User options */ + uint32 flags; /**< Operational flags */ + uint32 options; /**< User options */ const char *url; /**< Initial URL request (atom) */ const char *path; /**< Path to request (atom) */ const char *host; /**< Hostname, if not a numeric IP (atom) */ @@ -1792,13 +1117,13 @@ http_error_cb_t error_ind; /**< Callback for errors */ http_state_change_t state_chg; /**< Optional: callback for state changes */ time_t last_update; /**< Time of last activity */ - gpointer io_opaque; /**< Opaque I/O callback information */ + void *io_opaque; /**< Opaque I/O callback information */ rxdrv_t *rx; /**< RX stack for downloading data */ - gpointer user_opaque; /**< User opaque data */ + void *user_opaque; /**< User opaque data */ http_user_free_t user_free; /**< Free routine for opaque data */ struct http_async *parent; /**< Parent request, for redirections */ - GSList *delayed; /**< Delayed data (list of http_buffer_t) */ - GSList *children; /**< Child requests */ + pslist_t *delayed; /**< Delayed data (list of http_buffer_t) */ + pslist_t *children; /**< Child requests */ unsigned header_sent:1; /**< Whether HTTP request header was sent */ /* @@ -1840,7 +1165,9 @@ * All freed structures are enqueued in the sl_ha_freed list. */ -static GSList *sl_ha_freed = NULL; /* Pending physical removal */ +static pslist_t *sl_ha_freed = NULL; /* Pending physical removal */ + +static void http_async_connected(http_async_t *handle); static inline void http_async_check(const http_async_t *ha) @@ -1850,6 +1177,44 @@ } /** + * Callback invoked when socket is destroyed. + */ +static void +http_async_socket_destroy(gnutella_socket_t *s, void *owner, const char *reason) +{ + http_async_t *ha = owner; + + http_async_check(ha); + g_assert(s == ha->socket); + + (void) reason; + http_async_error(ha, HTTP_ASYNC_IO_ERROR); +} + +/** + * Callback invoked when socket is connected. + */ +static void +http_async_socket_connected(gnutella_socket_t *s, void *owner) +{ + http_async_t *ha = owner; + + http_async_check(ha); + g_assert(s == ha->socket); + + http_async_connected(ha); +} + +/** + * Socket-layer callbacks for asynchronous HTTP requests. + */ +static struct socket_ops http_async_socket_ops = { + NULL, /* connect_failed */ + http_async_socket_connected, /* connected */ + http_async_socket_destroy, /* destroy */ +}; + +/** * Get URL and request information, given opaque handle. * This can be used by client code to log request parameters. * @@ -1859,11 +1224,9 @@ */ const char * http_async_info( - http_async_t *handle, const char **req, const char **path, - host_addr_t *addr, guint16 *port) + const http_async_t *ha, const char **req, const char **path, + host_addr_t *addr, uint16 *port) { - http_async_t *ha = handle; - http_async_check(ha); if (req) *req = http_verbha->type; @@ -1875,12 +1238,70 @@ } /** + * @return the URL of the HTTP asynchronous request. + */ +const char * +http_async_url(const http_async_t *ha) +{ + http_async_check(ha); + + return ha->url; +} + +/** + * @return the verb used for the HTTP asynchronous request. + */ +const char * +http_async_verb(const http_async_t *ha) +{ + http_async_check(ha); + + return http_verbha->type; +} + +/** + * @return path (along with the query part) of the HTTP asynchronous request. + */ +const char * +http_async_path(const http_async_t *ha) +{ + http_async_check(ha); + + return ha->path; +} + +/** + * @return the address of the host for the HTTP asynchronous request. + * + * @attention + * May not be known until the connection is established if the name + * resolution is not completed. + */ +host_addr_t +http_async_addr(const http_async_t *ha) +{ + http_async_check(ha); + + return ha->socket->addr; +} + +/** + * @return the port of the HTTP asynchronous request. + */ +uint16 +http_async_port(const http_async_t *ha) +{ + http_async_check(ha); + + return ha->socket->port; +} + +/** * Set user-defined opaque data, which can optionally be freed via `fn' if a * non-NULL function pointer is given. */ void -http_async_set_opaque(http_async_t *ha, gpointer data, - http_user_free_t fn) +http_async_set_opaque(http_async_t *ha, void *data, http_user_free_t fn) { http_async_check(ha); g_assert(data != NULL); @@ -1892,7 +1313,7 @@ /** * Retrieve user-defined opaque data. */ -gpointer +void * http_async_get_opaque(const http_async_t *ha) { http_async_check(ha); @@ -1906,7 +1327,7 @@ * @return TRUE if the IP address is available with the address being filled * in ``addrp'', FALSE otherwise. */ -gboolean +bool http_async_get_local_addr(const http_async_t *ha, host_addr_t *addrp) { http_async_check(ha); @@ -1922,7 +1343,7 @@ * */ void -http_async_option_ctl(http_async_t *ha, guint32 mask, http_ctl_op_t what) +http_async_option_ctl(http_async_t *ha, uint32 mask, http_ctl_op_t what) { http_async_check(ha); @@ -1948,7 +1369,7 @@ static void http_async_free_recursive(http_async_t *ha) { - GSList *l; + pslist_t *l; http_async_check(ha); g_assert(sl_outgoing); @@ -1975,14 +1396,14 @@ ha->data = NULL; } if (ha->delayed != NULL) { - GSList *sl; + pslist_t *sl; - GM_SLIST_FOREACH(ha->delayed, sl) { + PSLIST_FOREACH(ha->delayed, sl) { http_buffer_free(sl->data); } - gm_slist_free_null(&ha->delayed); + pslist_free_null(&ha->delayed); } - sl_outgoing = g_slist_remove(sl_outgoing, ha); + sl_outgoing = pslist_remove(sl_outgoing, ha); /* * Recursively free the children requests. @@ -1997,7 +1418,7 @@ ha->flags |= HA_F_FREED; /* Will be freed later */ ha->state = HTTP_AS_REMOVED; /* Don't notify about state change! */ - sl_ha_freed = g_slist_prepend(sl_ha_freed, ha); + sl_ha_freed = pslist_prepend(sl_ha_freed, ha); } /** @@ -2036,7 +1457,7 @@ static void http_async_free_pending(void) { - GSList *l; + pslist_t *l; for (l = sl_ha_freed; l; l = l->next) { http_async_t *ha = l->data; @@ -2049,7 +1470,7 @@ WFREE(ha); } - gm_slist_free_null(&sl_ha_freed); + pslist_free_null(&sl_ha_freed); } /** @@ -2066,7 +1487,7 @@ * Cancel request (internal call). */ static void -http_async_remove(http_async_t *ha, http_errtype_t type, gpointer code) +http_async_remove(http_async_t *ha, http_errtype_t type, void *code) { http_async_check(ha); @@ -2175,7 +1596,7 @@ if (ha->host) { if (s->port != HTTP_PORT) - gm_snprintf(buf, sizeof buf, "%s:%u", ha->host, (guint) s->port); + str_bprintf(buf, sizeof buf, "%s:%u", ha->host, (uint) s->port); else g_strlcpy(buf, ha->host, sizeof buf); } else { @@ -2209,7 +1630,7 @@ http_async_check(ha); g_assert(len <= INT_MAX); - rw = gm_snprintf(buf, len, + rw = str_bprintf(buf, len, "%s %s HTTP/1.1\r\n" "Host: %s\r\n" "User-Agent: %s\r\n" @@ -2245,7 +1666,7 @@ http_async_check(ha); g_assert(len <= INT_MAX); - rw = gm_snprintf(buf, len, + rw = str_bprintf(buf, len, "%s %s HTTP/1.1\r\n" "Host: %s\r\n" "User-Agent: %s\r\n" @@ -2273,7 +1694,7 @@ static void http_async_sent_head(const http_async_t *unused_ha, const struct gnutella_socket *s, const char *req, size_t len, - gboolean deferred) + bool deferred) { (void) unused_ha; @@ -2297,7 +1718,7 @@ static void http_async_sent_data(const http_async_t *unused_ha, const struct gnutella_socket *s, const char *data, size_t len, - gboolean deferred) + bool deferred) { (void) unused_ha; @@ -2367,7 +1788,7 @@ http_async_create( const char *url, /* Either full URL or path */ const host_addr_t addr, /* Optional: 0 means grab from url */ - guint16 port, /* Optional, must be given when IP given */ + uint16 port, /* Optional, must be given when IP given */ enum http_reqtype type, /* HTTP_GET or HTTP_POST */ http_post_data_t *post_data, /* For HTTP_POST only */ http_header_cb_t header_ind, @@ -2394,7 +1815,7 @@ if (!is_host_addr(addr)) { host_addr_t ip; - guint16 uport; + uint16 uport; if (!http_url_parse(url, &uport, &host, &path)) { http_async_errno = HTTP_ASYNC_BAD_URL; @@ -2433,8 +1854,6 @@ WALLOC0(ha); - s->resource.handle = ha; - ha->magic = HTTP_ASYNC_MAGIC; ha->type = type; ha->state = HTTP_AS_CONNECTING; @@ -2456,6 +1875,8 @@ ha->children = NULL; ha->delayed = NULL; + socket_attach_ops(s, SOCK_TYPE_HTTP, &http_async_socket_ops, ha); + if (post_data != NULL) { ha->data = post_data->data; ha->datalen = post_data->datalen; @@ -2477,14 +1898,14 @@ ha->op_headsent = http_async_sent_head; ha->op_gotreply = http_async_got_reply; - sl_outgoing = g_slist_prepend(sl_outgoing, ha); + sl_outgoing = pslist_prepend(sl_outgoing, ha); /* * If request has a parent, insert in parent's children list. */ if (parent) - parent->children = g_slist_prepend(parent->children, ha); + parent->children = pslist_prepend(parent->children, ha); return ha; } @@ -2552,7 +1973,7 @@ http_async_get_addr( const char *path, const host_addr_t addr, - guint16 port, + uint16 port, http_header_cb_t header_ind, http_data_cb_t data_ind, http_error_cb_t error_ind) @@ -2596,7 +2017,7 @@ http_async_post_addr( const char *path, const host_addr_t addr, - guint16 port, + uint16 port, http_post_data_t *post_data, http_header_cb_t header_ind, http_data_cb_t data_ind, @@ -2682,7 +2103,7 @@ * Interceptor callback for `header_ind' in child requests. * Reroute to parent request. */ -static gboolean +static bool http_subreq_header_ind(http_async_t *ha, struct header *header, int code, const char *message) { @@ -2712,7 +2133,7 @@ * Reroute to parent request. */ static void -http_subreq_error_ind(http_async_t *ha, http_errtype_t error, gpointer val) +http_subreq_error_ind(http_async_t *ha, http_errtype_t error, void *val) { http_async_check(ha); g_assert(ha->parent != NULL); @@ -2729,7 +2150,7 @@ * * @returns whether we succeeded in creating the subrequest. */ -static gboolean +static bool http_async_subrequest( http_async_t *parent, char *url, enum http_reqtype type) { @@ -2766,20 +2187,21 @@ * Propagate any redefined operation. */ - child->op_get_request = parent->op_get_request; - child->op_post_request = parent->op_post_request; - child->op_headsent = parent->op_headsent; - child->op_datasent = parent->op_datasent; - child->op_gotreply = parent->op_gotreply; + if (child != NULL) { + child->op_get_request = parent->op_get_request; + child->op_post_request = parent->op_post_request; + child->op_headsent = parent->op_headsent; + child->op_datasent = parent->op_datasent; + child->op_gotreply = parent->op_gotreply; - /* - * Indicate that the child request now has control, the parent request - * being only there to record the user's callbacks (and because it's the - * only one known from the outside). - */ + /* + * Indicate that the child request now has control, the parent request + * being only there to record the user's callbacks (and because it's + * the only one known from the outside). + */ - if (child) parent->flags |= HA_F_SUBREQ; + } return child != NULL; } @@ -2842,10 +2264,10 @@ *** RX link callbacks. ***/ -static gboolean http_data_ind(rxdrv_t *rx, pmsg_t *mb); +static bool http_data_ind(rxdrv_t *rx, pmsg_t *mb); -static G_GNUC_PRINTF(2, 3) void -http_async_rx_error(gpointer o, const char *reason, ...) +static void G_PRINTF(2, 3) +http_async_rx_error(void *o, const char *reason, ...) { http_async_t *ha = o; va_list args; @@ -2859,7 +2281,7 @@ char buf128; va_start(args, reason); - gm_vsnprintf(buf, sizeof buf, reason, args); + str_vbprintf(buf, sizeof buf, reason, args); va_end(args); g_warning("HTTP RX error from %s for \"%s\": %s", http_async_host(ha), ha->url, buf); @@ -2869,7 +2291,7 @@ } static void -http_async_rx_done(gpointer o) +http_async_rx_done(void *o) { http_async_t *ha = o; @@ -2903,7 +2325,7 @@ * * @return TRUE if we can continue reading data. */ -static gboolean +static bool http_got_data(http_async_t *ha, char *data, size_t len) { http_async_check(ha); @@ -2929,11 +2351,11 @@ * * @return FALSE if an error occurred. */ -static gboolean +static bool http_data_ind(rxdrv_t *rx, pmsg_t *mb) { http_async_t *ha = rx_owner(rx); - gboolean ok; + bool ok; http_async_check(ha); @@ -2957,7 +2379,7 @@ int ack_code; const char *ack_message = ""; char *buf; - guint http_major = 0, http_minor = 0; + uint http_major = 0, http_minor = 0; http_async_check(ha); @@ -3094,11 +2516,11 @@ /* * Transport encoding: the dechunking layer is right above the - * link level and removed chunk marks, providing a stream of bytes + * link level and removes chunk marks, providing a stream of bytes * to upper level. */ - buf = header_get(header, "Transport-Encoding"); + buf = header_get(header, "Transfer-Encoding"); if (buf != NULL && 0 == strcmp(buf, "chunked")) { struct rx_chunk_args args; @@ -3171,11 +2593,11 @@ */ if (ha->state == HTTP_AS_REDIRECTED) { - GSList *l; + pslist_t *l; g_assert(ha->children); - for (l = ha->children; l; l = g_slist_next(l)) { + PSLIST_FOREACH(ha->children, l) { http_async_t *cha = l->data; switch (cha->state) { @@ -3201,7 +2623,7 @@ * Called when full header was collected. */ static void -call_http_got_header(gpointer obj, header_t *header) +call_http_got_header(void *obj, header_t *header) { http_async_t *ha = obj; @@ -3215,7 +2637,7 @@ * Called when we start receiving the HTTP headers. */ static void -http_header_start(gpointer obj) +http_header_start(void *obj) { http_async_t *ha = obj; @@ -3248,7 +2670,7 @@ * sending the HTTP request. */ static void -http_async_write_request(gpointer data, int unused_source, +http_async_write_request(void *data, int unused_source, inputevt_cond_t cond) { http_async_t *ha = data; @@ -3312,7 +2734,7 @@ * holds the data. */ - ha->delayed = g_slist_next(ha->delayed); + ha->delayed = pslist_next(ha->delayed); if (ha->delayed != NULL) { http_buffer_free(r); goto next_buffer; @@ -3340,7 +2762,7 @@ * Callback from the socket layer when the connection to the remote * server is made. */ -void +static void http_async_connected(http_async_t *ha) { struct gnutella_socket *s; @@ -3352,7 +2774,6 @@ s = ha->socket; socket_check(s); - g_assert(s->resource.handle == ha); /* * Build the HTTP request. @@ -3394,7 +2815,7 @@ g_assert(ha->delayed == NULL); r = http_buffer_alloc(req, rw, sent); - ha->delayed = g_slist_append(ha->delayed, r); + ha->delayed = pslist_append(ha->delayed, r); /* * For a POST we also have to send the data following the header. @@ -3402,7 +2823,7 @@ if (HTTP_POST == ha->type && ha->datalen != 0) { r = http_buffer_alloc(ha->data, ha->datalen, 0); - ha->delayed = g_slist_append(ha->delayed, r); + ha->delayed = pslist_append(ha->delayed, r); } /* @@ -3441,7 +2862,7 @@ g_assert(ha->delayed == NULL); r = http_buffer_alloc(ha->data, ha->datalen, sent); - ha->delayed = g_slist_append(ha->delayed, r); + ha->delayed = pslist_append(ha->delayed, r); /* * Install the writing callback. @@ -3477,16 +2898,16 @@ * * @return TRUE if anything was logged. */ -gboolean +bool http_async_log_error_dbg(http_async_t *handle, - http_errtype_t type, gpointer v, const gchar *prefix, gboolean all) + http_errtype_t type, void *v, const char *prefix, bool all) { const char *url; const char *req; int error = GPOINTER_TO_INT(v); http_error_t *herror = v; host_addr_t addr; - guint16 port; + uint16 port; const char *what = prefix != NULL ? prefix : "HTTP"; http_async_check(handle); @@ -3546,9 +2967,9 @@ * * @return whether anything was logged. */ -gboolean +bool http_async_log_error(http_async_t *handle, - http_errtype_t type, gpointer v, const char *prefix) + http_errtype_t type, void *v, const char *prefix) { if (GNET_PROPERTY(http_debug)) { return http_async_log_error_dbg(handle, type, v, prefix, @@ -3607,7 +3028,7 @@ * Callback for http_async_wget(), invoked when all headers have been read. * @return TRUE if we can continue with the request. */ -static gboolean +static bool wget_header_ind(http_async_t *ha, struct header *header, int code, const char *unused_message) { @@ -3636,7 +3057,7 @@ buf = header_get(header, "Content-Length"); if (buf != NULL) { - guint64 len; + uint64 len; int error; len = parse_uint64(buf, NULL, 10, &error); @@ -3888,10 +3309,8 @@ */ failed: - if (h != NULL) - header_free(h); - if (gl != NULL) - getline_free(gl); + header_free_null(&h); + getline_free(gl); if (msg != NULL && ack_msg != NULL) { hfree(*msg); *msg = NULL; @@ -3905,7 +3324,7 @@ ***/ static void -err_line_too_long(gpointer obj, header_t *unused_head) +err_line_too_long(void *obj, header_t *unused_head) { http_async_t *ha = obj; (void) unused_head; @@ -3914,7 +3333,7 @@ } static void -err_header_error(gpointer obj, int error) +err_header_error(void *obj, int error) { http_async_t *ha = obj; http_async_check(ha); @@ -3922,7 +3341,7 @@ } static void -err_input_exception(gpointer obj, header_t *unused_head) +err_input_exception(void *obj, header_t *unused_head) { http_async_t *ha = obj; (void) unused_head; @@ -3931,7 +3350,7 @@ } static void -err_input_buffer_full(gpointer obj) +err_input_buffer_full(void *obj) { http_async_t *ha = obj; http_async_check(ha); @@ -3939,7 +3358,7 @@ } static void -err_header_read_error(gpointer obj, int error) +err_header_read_error(void *obj, int error) { http_async_t *ha = obj; http_async_check(ha); @@ -3947,7 +3366,7 @@ } static void -err_header_read_eof(gpointer obj, header_t *unused_head) +err_header_read_eof(void *obj, header_t *unused_head) { http_async_t *ha = obj; (void) unused_head; @@ -3972,7 +3391,7 @@ void http_timer(time_t now) { - GSList *l; + pslist_t *l; retry: for (l = sl_outgoing; l; l = l->next) { @@ -4024,7 +3443,7 @@ ***/ #ifdef HTTP_TESTING -static G_GNUC_COLD void +static void G_COLD http_transaction_failed(char *data, size_t len, int code, header_t *h, void *a) { const char *url = a; @@ -4040,7 +3459,7 @@ } } -static G_GNUC_COLD void +static void G_COLD http_transaction_done(char *data, size_t len, int code, header_t *h, void *arg) { char *url = arg; @@ -4051,7 +3470,7 @@ void *ha; g_message("HTTP async wget of \"%s\" SUCCEEDED (%zu byte%s)", - url, len, 1 == len ? "" : "s"); + url, len, plural(len)); g_debug("---- Begin HTTP Header ----"); header_dump(stderr, h, NULL); g_debug("---- End HTTP Header ----"); @@ -4070,8 +3489,8 @@ } } -G_GNUC_COLD void -http_test(void) +static void G_COLD +http_async_test(void) { void *ha; char *url = "http://www.perl.com/index.html"; @@ -4087,11 +3506,18 @@ } } #else /* !HTTP_TESTING */ -void -http_test(void) +static void G_COLD +http_async_test(void) { /* Nothing */ } #endif /* HTTP_TESTING */ +void G_COLD +http_test(void) +{ + http_async_test(); + http_range_test(); +} + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/http.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/http.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, 2010, Raphael Manfredi + * Copyright (c) 2002-2003, 2010, 2014 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,7 +28,7 @@ * HTTP routines. * * @author Raphael Manfredi - * @date 2002-2003, 2010 + * @date 2002-2003, 2010, 2014 */ #ifndef _core_http_h_ @@ -37,6 +37,9 @@ #include "common.h" #include "if/core/http.h" +#include "if/gen/http_async.h" +#include "if/gen/http_url.h" + #include "lib/host_addr.h" #include "lib/header.h" @@ -89,7 +92,7 @@ * @param p the data to be freed * @param arg additional argument for the free routine */ -typedef void (*http_data_free_t)(gpointer p, gpointer arg); +typedef void (*http_data_free_t)(void *p, void *arg); /** * Post data. @@ -114,7 +117,7 @@ * written to buf. */ typedef size_t (*http_status_cb_t)( - char *buf, size_t size, gpointer arg, guint32 flags); + char *buf, size_t size, void *arg, uint32 flags); typedef struct { http_extra_type_t he_type; /**< Union discriminent */ @@ -122,7 +125,7 @@ const char *u_msg; /**< Single header line */ struct { http_status_cb_t u_cb; /**< Callback to compute header field */ - gpointer u_arg; /**< Callback context argument */ + void *u_arg; /**< Callback context argument */ } u_cbk; } u; } http_extra_desc_t; @@ -133,7 +136,7 @@ static inline void http_extra_callback_set(http_extra_desc_t *he, - http_status_cb_t callback, gpointer user_arg) + http_status_cb_t callback, void *user_arg) { he->he_type = HTTP_EXTRA_CALLBACK; he->he_cb = callback; @@ -154,7 +157,7 @@ he->he_msg = body; } -static inline gboolean +static inline bool http_extra_callback_matches(http_extra_desc_t *he, http_status_cb_t callback) { return he->he_type == HTTP_EXTRA_CALLBACK && @@ -180,7 +183,7 @@ * Callback used from asynchronous request to indicate that we got headers. * Indicates whether we should continue or not, given the HTTP response code. */ -typedef gboolean (*http_header_cb_t)( +typedef bool (*http_header_cb_t)( http_async_t *, struct header *, int code, const char *message); /** @@ -207,13 +210,13 @@ */ typedef void (*http_error_cb_t)( - http_async_t *, http_errtype_t error, gpointer val); + http_async_t *, http_errtype_t error, void *val); /** * Callback to free user opaque data. */ -typedef void (*http_user_free_t)(gpointer data); +typedef void (*http_user_free_t)(void *data); /** * Asynchronous operations that the user may redefine. @@ -228,54 +231,13 @@ typedef void (*http_op_reqsent_t)(const http_async_t *, const struct gnutella_socket *s, const char *req, size_t len, - gboolean deferred); + bool deferred); typedef void (*http_op_gotreply_t)(const http_async_t *, const struct gnutella_socket *s, const char *status, const struct header *header); -/* - * Asynchronous request error codes. - */ - -#define HTTP_ASYNC_OK 0 /**< OK */ -#define HTTP_ASYNC_BAD_URL 1 /**< Invalid HTTP URL */ -#define HTTP_ASYNC_CONN_FAILED 2 /**< Connection failed */ -#define HTTP_ASYNC_IO_ERROR 3 /**< I/O error */ -#define HTTP_ASYNC_REQ2BIG 4 /**< Request too big */ -#define HTTP_ASYNC_HEAD2BIG 5 /**< Header too big */ -#define HTTP_ASYNC_CANCELLED 6 /**< User cancel */ -#define HTTP_ASYNC_EOF 7 /**< Got EOF */ -#define HTTP_ASYNC_BAD_STATUS 8 /**< Unparseable HTTP status */ -#define HTTP_ASYNC_NO_LOCATION 9 /**< Got moved reply, but no location */ -#define HTTP_ASYNC_CONN_TIMEOUT 10 /**< Connection timeout */ -#define HTTP_ASYNC_TIMEOUT 11 /**< Data timeout */ -#define HTTP_ASYNC_NESTED 12 /**< Nested redirections */ -#define HTTP_ASYNC_BAD_LOCATION_URI 13 /**< Invalid URI in Location header */ -#define HTTP_ASYNC_CLOSED 14 /**< Connection was closed, all OK */ -#define HTTP_ASYNC_REDIRECTED 15 /**< Redirected, following disabled */ -#define HTTP_ASYNC_BAD_HEADER 16 /**< Unparseable header value */ -#define HTTP_ASYNC_DATA2BIG 17 /**< Data too big */ -#define HTTP_ASYNC_MAN_FAILURE 18 /**< Mandatory request not understood */ - -extern guint http_async_errno; - -/** - * Error codes from http_url_parse(). - */ - -typedef enum { - HTTP_URL_OK = 0, /**< All OK */ - HTTP_URL_NOT_HTTP, /**< Not an http URI */ - HTTP_URL_MULTIPLE_CREDENTIALS, /**< More than one "<user>:<password>" */ - HTTP_URL_BAD_CREDENTIALS, /**< Truncated "<user>:<password>" */ - HTTP_URL_BAD_PORT_PARSING, /**< Could not parse port */ - HTTP_URL_BAD_PORT_RANGE, /**< Port value is out of range */ - HTTP_URL_BAD_HOST_PART, /**< Could not parse host */ - HTTP_URL_HOSTNAME_UNKNOWN, /**< Could not resolve host into IP */ - HTTP_URL_MISSING_URI /**< URL has no URI part */ -} http_url_error_t; - +extern http_async_error_t http_async_errno; extern http_url_error_t http_url_errno; /** @@ -330,20 +292,20 @@ void http_timer(time_t now); -gboolean http_send_status(http_layer_t layer, struct gnutella_socket *s, - int code, gboolean keep_alive, http_extra_desc_t *hev, int hevcnt, - const char *reason, ...) G_GNUC_PRINTF(7, 8); +bool http_send_status(http_layer_t layer, struct gnutella_socket *s, + int code, bool keep_alive, http_extra_desc_t *hev, int hevcnt, + const char *reason, ...) G_PRINTF(7, 8); size_t http_hostname_add( - char *buf, size_t size, gpointer arg, guint32 flags); + char *buf, size_t size, void *arg, uint32 flags); size_t http_retry_after_add( - char *buf, size_t size, gpointer arg, guint32 flags); + char *buf, size_t size, void *arg, uint32 flags); int http_status_parse(const char *line, - const char *proto, const char **msg, guint *major, guint *minor); + const char *proto, const char **msg, uint *major, uint *minor); -gboolean http_extract_version( - const char *request, size_t len, guint *major, guint *minor); +bool http_extract_version( + const char *request, size_t len, uint *major, uint *minor); http_buffer_t *http_buffer_alloc(char *buf, size_t len, size_t written); void http_buffer_free(http_buffer_t *b); @@ -352,15 +314,8 @@ http_content_range_parse(const char *buf, filesize_t *start, filesize_t *end, filesize_t *total); -filesize_t http_range_size(const GSList *list); -void http_range_free(GSList *list); -GSList *http_range_parse(const char *field, const char *value, - filesize_t size, const char *vendor); -gboolean http_range_contains(GSList *ranges, filesize_t from, filesize_t to); - -const char *http_url_strerror(http_url_error_t errnum); -gboolean http_url_parse( - const char *url, guint16 *port, const char **host, const char **path); +bool http_url_parse( + const char *url, uint16 *port, const char **host, const char **path); http_async_t *http_async_get( const char *url, @@ -371,7 +326,7 @@ http_async_t *http_async_get_addr( const char *path, const host_addr_t, - guint16 port, + uint16 port, http_header_cb_t header_ind, http_data_cb_t data_ind, http_error_cb_t error_ind); @@ -386,32 +341,36 @@ http_async_t *http_async_post_addr( const char *path, const host_addr_t addr, - guint16 port, + uint16 port, http_post_data_t *post_data, http_header_cb_t header_ind, http_data_cb_t data_ind, http_error_cb_t error_ind); -const char *http_async_strerror(guint errnum); const char *http_async_info( - http_async_t *handle, const char **req, const char **path, - host_addr_t *addr, guint16 *port); -void http_async_connected(http_async_t *handle); + const http_async_t *ha, const char **req, const char **path, + host_addr_t *addr, uint16 *port); +const char *http_async_url(const http_async_t *ha); +const char *http_async_req(const http_async_t *ha); +const char *http_async_path(const http_async_t *ha); +host_addr_t http_async_addr(const http_async_t *ha); +uint16 http_async_port(const http_async_t *ha); + void http_async_close(http_async_t *handle); void http_async_cancel(http_async_t *handle); void http_async_cancel_null(http_async_t **handle_ptr); void http_async_error(http_async_t *handle, int code); http_state_t http_async_state(http_async_t *handle); -gboolean http_async_get_local_addr(const http_async_t *ha, host_addr_t *addrp); +bool http_async_get_local_addr(const http_async_t *ha, host_addr_t *addrp); void http_async_set_opaque(http_async_t *handle, - gpointer data, http_user_free_t fn); -gpointer http_async_get_opaque(const http_async_t *handle); -gboolean http_async_log_error(http_async_t *handle, - http_errtype_t type, gpointer v, const char *prefix); -gboolean http_async_log_error_dbg(http_async_t *handle, - http_errtype_t type, gpointer v, const char *prefix, gboolean all); + void *data, http_user_free_t fn); +void *http_async_get_opaque(const http_async_t *handle); +bool http_async_log_error(http_async_t *handle, + http_errtype_t type, void *v, const char *prefix); +bool http_async_log_error_dbg(http_async_t *handle, + http_errtype_t type, void *v, const char *prefix, bool all); void http_async_on_state_change(http_async_t *ha, http_state_change_t fn); void http_async_set_op_get_request(http_async_t *, http_op_get_request_t); @@ -419,14 +378,14 @@ void http_async_set_op_headsent(http_async_t *ha, http_op_reqsent_t op); void http_async_set_op_datasent(http_async_t *ha, http_op_reqsent_t op); void http_async_set_op_gotreply(http_async_t *ha, http_op_gotreply_t op); -void http_async_option_ctl(http_async_t *ha, guint32 mask, http_ctl_op_t what); +void http_async_option_ctl(http_async_t *ha, uint32 mask, http_ctl_op_t what); const char *http_async_remote_host_port(const http_async_t *ha); header_t *http_header_parse(const char *data, size_t len, int *code, char **msg, unsigned *major, unsigned *minor, const char **endptr); char *http_field_starts_with(const char *buf, - const char *token, gboolean sensitive); + const char *token, bool sensitive); const char *http_parameter_get(const char *field, const char *name); http_async_t *http_async_wget(const char *url,
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/huge.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/huge.c
Changed
@@ -38,21 +38,25 @@ #include "common.h" #include "huge.h" -#include "share.h" -#include "gmsg.h" + #include "dmesh.h" +#include "gmsg.h" +#include "nodes.h" +#include "settings.h" +#include "share.h" +#include "spam.h" #include "verify_sha1.h" #include "verify_tth.h" #include "version.h" -#include "settings.h" -#include "spam.h" #include "lib/atoms.h" #include "lib/base32.h" #include "lib/file.h" -#include "lib/glib-missing.h" +#include "lib/gnet_host.h" #include "lib/halloc.h" +#include "lib/hashing.h" #include "lib/header.h" +#include "lib/hikset.h" #include "lib/parse.h" #include "lib/pattern.h" #include "lib/sha1.h" @@ -72,7 +76,7 @@ ***/ /** - * There's an in-core cache (the GHashTable sha1_cache), and a + * There's an in-core cache (the hash table ``sha1_cache''), and a * persistent copy (normally in ~/.gtk-gnutella/sha1_cache). The * in-core cache is filled with the persistent one at launch. When the * "shared_file" (the records describing the shared files, see @@ -96,16 +100,16 @@ const struct tth *tth; /**< TTH (binary; atom) */ filesize_t size; /**< File size */ time_t mtime; /**< Last modification time */ - gboolean shared; /**< There's a known entry for this + bool shared; /**< There's a known entry for this file in the share library */ }; -static GHashTable *sha1_cache; +static hikset_t *sha1_cache; /** * cache_dirty = TRUE means that in-core cache is different from the disk one. */ -static gboolean cache_dirty; +static bool cache_dirty; static time_t cache_dumped; static cpattern_t *has_http_urls; @@ -140,10 +144,10 @@ */ static void add_volatile_cache_entry(const char *filename, filesize_t size, time_t mtime, - const struct sha1 *sha1, const struct tth *tth, gboolean known_to_be_shared) + const struct sha1 *sha1, const struct tth *tth, bool known_to_be_shared) { struct sha1_cache_entry *item; - + WALLOC(item); item->file_name = atom_str_get(filename); item->size = size; @@ -151,7 +155,7 @@ item->sha1 = atom_sha1_get(sha1); item->tth = tth ? atom_tth_get(tth) : NULL; item->shared = known_to_be_shared; - g_hash_table_insert(sha1_cache, deconstify_gchar(item->file_name), item); + hikset_insert_key(sha1_cache, &item->file_name); } /* Disk cache */ @@ -204,8 +208,7 @@ */ if (fstat(fileno(f), &sb)) { - g_warning("add_persistent_cache_entry: could not stat \"%s\"", - pathname); + g_warning("%s(): could not stat \"%s\": %m", G_STRFUNC, pathname); } else { if (0 == sb.st_size) { fputs(sha1_persistent_cache_file_header, f); @@ -214,15 +217,14 @@ } fclose(f); } else { - g_warning("add_persistent_cache_entry: could not open \"%s\"", - pathname); + g_warning("%s(): could not open \"%s\": %m", G_STRFUNC, pathname); } HFREE_NULL(pathname); } struct dump_cache_context { FILE *f; - gboolean forced; + bool forced; }; /** @@ -230,13 +232,11 @@ * called by dump_cache to dump the whole in-memory cache onto disk. */ static void -dump_cache_one_entry(gpointer unused_key, gpointer value, gpointer udata) +dump_cache_one_entry(void *value, void *udata) { struct sha1_cache_entry *e = value; struct dump_cache_context *ctx = udata; - (void) unused_key; - if (ctx->forced || e->shared) { cache_entry_print(ctx->f, e->file_name, e->sha1, e->tth, e->size, e->mtime); @@ -247,23 +247,23 @@ * Dump the whole in-memory cache onto disk. */ static void -dump_cache(gboolean force) +dump_cache(bool force) { FILE *f; file_path_t fp; if (!force && !cache_dirty) return; - + file_path_set(&fp, settings_config_dir(), "sha1_cache"); f = file_config_open_write("SHA-1 cache", &fp); if (f) { struct dump_cache_context ctx; - + fputs(sha1_persistent_cache_file_header, f); ctx.f = f; ctx.forced = force; - g_hash_table_foreach(sha1_cache, dump_cache_one_entry, &ctx); + hikset_foreach(sha1_cache, dump_cache_one_entry, &ctx); if (file_config_close(f, &fp)) { cache_dirty = FALSE; } @@ -284,7 +284,7 @@ * the line and calls add_volatile_cache_entry() to append the record * to the in-memory cache. */ -static G_GNUC_COLD void +static void G_COLD parse_and_append_cache_entry(char *line) { const char *p, *end; /* pointers to scan the line */ @@ -293,7 +293,7 @@ time_t mtime; struct sha1 sha1; struct tth tth; - gboolean has_tth; + bool has_tth; /* Skip comments and blank lines */ if (file_line_is_skipable(line)) @@ -319,7 +319,7 @@ if ( *p != '\t' || (p - sha1_digest_ascii) != SHA1_BASE32_SIZE || - SHA1_RAW_SIZE != base32_decode(sha1.data, sizeof sha1.data, + SHA1_RAW_SIZE != base32_decode(&sha1, sizeof sha1, sha1_digest_ascii, SHA1_BASE32_SIZE) ) { goto failure; @@ -364,17 +364,17 @@ /** * Read the whole persistent cache into memory. */ -static G_GNUC_COLD void +static void G_COLD sha1_read_cache(void) { FILE *f; file_path_t fp1; - gboolean truncated = FALSE; + bool truncated = FALSE; g_return_if_fail(settings_config_dir()); file_path_set(fp, settings_config_dir(), "sha1_cache"); - f = file_config_open_read("SHA-1 cache", fp, G_N_ELEMENTS(fp)); + f = file_config_open_read("SHA-1 cache", fp, N_ITEMS(fp)); if (f) { for (;;) { char buffer4096; @@ -395,7 +395,7 @@ } } -static gboolean +static bool huge_spam_check(shared_file_t *sf, const struct sha1 *sha1) { if (NULL != sha1 && spam_sha1_check(sha1)) { @@ -417,7 +417,7 @@ ** Asynchronous computation of hash value **/ -gboolean +bool huge_update_hashes(shared_file_t *sf, const struct sha1 *sha1, const struct tth *tth) { @@ -456,8 +456,7 @@ /* Update cache */ - cached = g_hash_table_lookup(sha1_cache, - cast_to_gconstpointer(shared_file_path(sf))); + cached = hikset_lookup(sha1_cache, shared_file_path(sf)); if (cached) { update_volatile_cache(cached, shared_file_size(sf), @@ -476,19 +475,19 @@ shared_file_size(sf), shared_file_modification_time(sf), sha1, tth); } - if (NULL == tth) { - request_tigertree(sf, FALSE); - } return TRUE; } /** - * Get the next file waiting for its hash to be computed from the queue - * (actually a stack). + * Look whether we still need to compute the SHA1 of the given shared file + * by looking into our in-core cache to see whether the entry we have is + * up-to-date. * - * @return this file. + * @param sf the shared file for which we want to compute the SHA1 + * + * @return TRUE if the file need SHA1 recomputation. */ -static gboolean +static bool huge_need_sha1(shared_file_t *sf) { struct sha1_cache_entry *cached; @@ -499,27 +498,16 @@ * After a rescan, there might be files in the queue which are * no longer shared. */ - if (!(SHARE_F_INDEXED & shared_file_flags(sf))) + + if (!shared_file_indexed(sf)) return FALSE; - /* - * XXX HACK ALERT - * - * We need to be careful here, because each time the library is rescanned, - * we add file to the list of SHA1 to recompute if we don't have them - * yet. This means that when we rescan the library during a computation, - * we'll add duplicates to our working queue. - * - * Fortunately, we can probe our in-core cache to see if what we have - * is already up-to-date. - * - * XXX It would be best to maintain a hash table of all the filenames - * XXX in our workqueue and not enqueue the work in the first place. - * XXX --RAM, 21/05/2002 - */ + if G_UNLIKELY(NULL == sha1_cache) + return FALSE; /* Shutdown occurred (processing TEQ event?) */ - cached = g_hash_table_lookup(sha1_cache, shared_file_path(sf)); - if (cached) { + cached = hikset_lookup(sha1_cache, shared_file_path(sf)); + + if (cached != NULL) { filestat_t sb; if (-1 == stat(shared_file_path(sf), &sb)) { @@ -531,7 +519,7 @@ cached->size + (fileoffset_t) 0 == sb.st_size + (filesize_t) 0 && cached->mtime == sb.st_mtime ) { - if (GNET_PROPERTY(dbg) > 1) { + if (GNET_PROPERTY(share_debug) > 1) { g_warning("ignoring duplicate SHA1 work for \"%s\"", shared_file_path(sf)); } @@ -552,7 +540,7 @@ * is put in a queue for it's SHA1 digest to be computed. */ -static gboolean +static bool huge_verify_callback(const struct verify *ctx, enum verify_status status, void *user_data) { @@ -561,12 +549,15 @@ shared_file_check(sf); switch (status) { case VERIFY_START: + if (!huge_need_sha1(sf)) + return FALSE; gnet_prop_set_boolean_val(PROP_SHA1_REBUILDING, TRUE); - return huge_need_sha1(sf); + return TRUE; case VERIFY_PROGRESS: return 0 != (SHARE_F_INDEXED & shared_file_flags(sf)); case VERIFY_DONE: huge_update_hashes(sf, verify_sha1_digest(ctx), NULL); + request_tigertree(sf, TRUE); /* FALL THROUGH */ case VERIFY_ERROR: case VERIFY_SHUTDOWN: @@ -581,22 +572,24 @@ } /** - * Put the shared file on the stack of the things to do. Activate the timer if - * this wasn't done already. + * Put the shared file on the stack of the things to do. + * + * We first begin with the computation of the SHA1, and when completed we + * will continue with the TTH computation. */ static void queue_shared_file_for_sha1_computation(shared_file_t *sf) { int inserted; - + shared_file_check(sf); inserted = verify_sha1_enqueue(FALSE, shared_file_path(sf), shared_file_size(sf), huge_verify_callback, shared_file_ref(sf)); - if (!inserted) { + + if (!inserted) shared_file_unref(&sf); - } } /** @@ -604,7 +597,7 @@ * * @return true (in the C sense) if it is, or false otherwise. */ -static gboolean +static bool cached_entry_up_to_date(const struct sha1_cache_entry *cache_entry, const shared_file_t *sf) { @@ -615,12 +608,12 @@ /** * External interface to check whether the sha1 for shared_file is known. */ -gboolean +bool sha1_is_cached(const shared_file_t *sf) { const struct sha1_cache_entry *cached; - cached = g_hash_table_lookup(sha1_cache, shared_file_path(sf)); + cached = hikset_lookup(sha1_cache, shared_file_path(sf)); return cached && cached_entry_up_to_date(cached, sf); } @@ -635,22 +628,26 @@ shared_file_check(sf); - cached = g_hash_table_lookup(sha1_cache, shared_file_path(sf)); + if (!shared_file_indexed(sf)) + return; /* "stale" shared file, has been superseded or removed */ + + cached = hikset_lookup(sha1_cache, shared_file_path(sf)); + if (cached && cached_entry_up_to_date(cached, sf)) { cache_dirty = TRUE; cached->shared = TRUE; shared_file_set_sha1(sf, cached->sha1); shared_file_set_tth(sf, cached->tth); - request_tigertree(sf, FALSE); + request_tigertree(sf, NULL == cached->tth); } else { - if (GNET_PROPERTY(dbg) > 4) { + if (GNET_PROPERTY(share_debug) > 1) { if (cached) g_debug("cached SHA1 entry for \"%s\" outdated: " "had mtime %lu, now %lu", shared_file_path(sf), - (gulong) cached->mtime, - (gulong) shared_file_modification_time(sf)); + (ulong) cached->mtime, + (ulong) shared_file_modification_time(sf)); else g_debug("queuing \"%s\" for SHA1 computation", shared_file_path(sf)); @@ -667,15 +664,15 @@ * things using the same pattern with other letters, as being rather * improbable hashes. */ -gboolean +bool huge_improbable_sha1(const char *buf, size_t len) { size_t ilen = 0; /* Length of the improbable sequence */ size_t i, longest = 0; for (i = 1; i < len; i++) { - guchar previous, c; - + uchar previous, c; + previous = bufi - 1; c = bufi; @@ -703,14 +700,14 @@ * * @return TRUE if the SHA1 was valid and properly decoded, FALSE on error. */ -gboolean +bool huge_sha1_extract32(const char *buf, size_t len, struct sha1 *sha1, - const struct gnutella_node *n) + const gnutella_node_t *n) { if (len != SHA1_BASE32_SIZE || huge_improbable_sha1(buf, len)) goto bad; - if (SHA1_RAW_SIZE != base32_decode(sha1->data, sizeof sha1->data, buf, len)) + if (SHA1_RAW_SIZE != base32_decode(sha1, sizeof *sha1, buf, len)) goto bad; /* @@ -718,7 +715,7 @@ */ if (huge_improbable_sha1(sha1->data, sizeof sha1->data)) { - if (GNET_PROPERTY(dbg)) { + if (GNET_PROPERTY(share_debug)) { if (is_printable(buf, len)) { g_warning("%s has improbable SHA1 (len=%lu): %.*s, hex: %s", gmsg_node_infostr(n), @@ -734,7 +731,7 @@ return TRUE; bad: - if (GNET_PROPERTY(dbg)) { + if (GNET_PROPERTY(share_debug)) { if (is_printable(buf, len)) { g_warning("%s has bad SHA1 (len=%u): %.*s", gmsg_node_infostr(n), @@ -752,20 +749,20 @@ return FALSE; } -gboolean +bool huge_tth_extract32(const char *buf, size_t len, struct tth *tth, - const struct gnutella_node *n) + const gnutella_node_t *n) { if (len != TTH_BASE32_SIZE) goto bad; - if (TTH_RAW_SIZE != base32_decode(tth->data, sizeof tth->data, buf, len)) + if (TTH_RAW_SIZE != base32_decode(tth, sizeof *tth, buf, len)) goto bad; return TRUE; bad: - if (GNET_PROPERTY(dbg)) { + if (GNET_PROPERTY(share_debug)) { if (is_printable(buf, len)) { g_warning("%s has bad TTH (len=%u): %.*s", gmsg_node_infostr(n), @@ -788,7 +785,7 @@ * X-Alt but is really an old X-Gnutella-Alternate-Location containing a * list of HTTP URLs. */ -static gboolean +static bool huge_is_pure_xalt(const char *value, size_t len) { host_addr_t addr; @@ -820,16 +817,36 @@ * about other sources for this file. * * Also knows about "Alternate-Location", "Alt-Location", "X-Alt" and "X-Falt". + * + * @param sha1 the SHA1 for which we're parsing alt-locs + * @param header the headers supplied by the remote host + * @param origin if non-NULL, this is the host supplying the alt-locs */ void -huge_collect_locations(const struct sha1 *sha1, const header_t *header) +huge_collect_locations(const sha1_t *sha1, const header_t *header, + const gnet_host_t * origin) { char *alt; size_t len; + const char *user_agent; g_return_if_fail(sha1); g_return_if_fail(header); + /* + * This code can be invoked on the download path (when we analyse + * locations sent by the server) or on the upload path (when we + * analyze those sent by the user to whom we are uploading). + * + * Therefore the user agent name can be held in the Server or + * User-Agent header, depending. + */ + + user_agent = header_get(header, "User-Agent"); /* Uploading */ + + if (NULL == user_agent) + user_agent = header_get(header, "Server"); /* Downloading */ + alt = header_get(header, "X-Gnutella-Alternate-Location"); /* @@ -844,7 +861,7 @@ alt = header_get(header, "Alt-Location"); if (alt != NULL) { - dmesh_collect_locations(sha1, alt); + dmesh_collect_locations(sha1, alt, origin, user_agent); return; } @@ -859,9 +876,9 @@ */ if (huge_is_pure_xalt(alt, len)) - dmesh_collect_compact_locations(sha1, alt); + dmesh_collect_compact_locations(sha1, alt, origin, user_agent); else - dmesh_collect_locations(sha1, alt); + dmesh_collect_locations(sha1, alt, origin, user_agent); } /* @@ -871,7 +888,7 @@ alt = header_get(header, "X-Falt"); if (alt != NULL) { - dmesh_collect_fw_hosts(sha1, alt); + dmesh_collect_fw_hosts(sha1, alt, origin, user_agent); } } @@ -881,7 +898,8 @@ void huge_init(void) { - sha1_cache = g_hash_table_new(pointer_hash_func, NULL); + sha1_cache = hikset_create( /* Keys are atoms */ + offsetof(struct sha1_cache_entry, file_name), HASH_KEY_SELF, 0); sha1_read_cache(); has_http_urls = pattern_compile("http://"); } @@ -889,20 +907,17 @@ /** * Free SHA1 cache entry. */ -static gboolean -cache_free_entry(gpointer unused_key, gpointer v, gpointer unused_udata) +static void +cache_free_entry(void *v, void *unused_udata) { struct sha1_cache_entry *e = v; - (void) unused_key; (void) unused_udata; atom_str_free_null(&e->file_name); atom_sha1_free_null(&e->sha1); atom_tth_free_null(&e->tth); WFREE(e); - - return TRUE; } /** @@ -913,8 +928,8 @@ { dump_cache(FALSE); - g_hash_table_foreach_remove(sha1_cache, cache_free_entry, NULL); - gm_hash_table_destroy_null(&sha1_cache); + hikset_foreach(sha1_cache, cache_free_entry, NULL); + hikset_free_null(&sha1_cache); pattern_free(has_http_urls); has_http_urls = NULL;
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/huge.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/huge.h
Changed
@@ -41,6 +41,7 @@ #include "common.h" struct gnutella_node; +struct gnutella_host; struct shared_file; struct header; struct sha1; @@ -57,17 +58,18 @@ struct tth; void request_sha1(struct shared_file *); -gboolean sha1_is_cached(const struct shared_file *sf); -gboolean huge_update_hashes(struct shared_file *sf, +bool sha1_is_cached(const struct shared_file *sf); +bool huge_update_hashes(struct shared_file *sf, const struct sha1 *sha1, const struct tth *tth); -gboolean huge_improbable_sha1(const char *buf, size_t len); -gboolean huge_sha1_extract32(const char *buf, size_t len, struct sha1 *sha1, +bool huge_improbable_sha1(const char *buf, size_t len); +bool huge_sha1_extract32(const char *buf, size_t len, struct sha1 *sha1, const struct gnutella_node *n); -gboolean huge_tth_extract32(const char *buf, size_t len, struct tth *tth, +bool huge_tth_extract32(const char *buf, size_t len, struct tth *tth, const struct gnutella_node *n); void huge_collect_locations( - const struct sha1 *sha1, const struct header *header); + const struct sha1 *sha1, const struct header *header, + const struct gnutella_host *origin); #endif /* _core_huge_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/ignore.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/ignore.c
Changed
@@ -40,11 +40,13 @@ #include "namesize.h" #include "spam.h" -#include "lib/atoms.h" #include "lib/ascii.h" +#include "lib/atoms.h" #include "lib/base32.h" #include "lib/file.h" #include "lib/halloc.h" +#include "lib/hset.h" +#include "lib/htable.h" #include "lib/parse.h" #include "lib/stringify.h" #include "lib/tm.h" @@ -57,8 +59,8 @@ * Hash tables where we collect SHA1 we already own or wish to ignore and * filename/filesizes we likewise wish to ignore. */ -static GHashTable *by_sha1; /**< SHA1s to ignore */ -static GHashTable *by_namesize; /**< By filename + filesize */ +static htable_t *by_sha1; /**< SHA1s to ignore */ +static hset_t *by_namesize; /**< By filename + filesize */ /* * We expect the initial ignore_sha1 file to be in the startup directory. @@ -135,11 +137,11 @@ /** * Initialize the ignore tables. */ -G_GNUC_COLD void +void G_COLD ignore_init(void) { - by_sha1 = g_hash_table_new(sha1_hash, sha1_eq); - by_namesize = g_hash_table_new(namesize_hash, namesize_eq); + by_sha1 = htable_create(HASH_KEY_FIXED, SHA1_RAW_SIZE); + by_namesize = hset_create_any(namesize_hash, NULL, namesize_eq); ignore_sha1_load(ignore_sha1, &ignore_sha1_mtime); ignore_sha1_load(done_sha1, NULL); @@ -180,7 +182,7 @@ if ( len < SHA1_BASE32_SIZE || - SHA1_RAW_SIZE != base32_decode(sha1.data, sizeof sha1.data, + SHA1_RAW_SIZE != base32_decode(&sha1, sizeof sha1, ign_tmp, SHA1_BASE32_SIZE) ) { g_warning("invalid SHA1 at \"%s\" line %d: %s", @@ -188,7 +190,7 @@ continue; } - if (g_hash_table_lookup(by_sha1, &sha1)) + if (htable_contains(by_sha1, &sha1)) continue; /* @@ -202,8 +204,7 @@ } p = &ign_tmpSHA1_BASE32_SIZE + 2; - gm_hash_table_insert_const(by_sha1, - atom_sha1_get(&sha1), atom_str_get(p)); + htable_insert_const(by_sha1, atom_sha1_get(&sha1), atom_str_get(p)); } } @@ -230,7 +231,7 @@ /** * Parse opened `f' containing size/filenames to ignore. */ -static G_GNUC_COLD void +static void G_COLD namesize_parse(FILE *f, const char *file) { int line = 0, error; @@ -271,14 +272,14 @@ else q++; - nsk.name = deconstify_gchar(q); + nsk.name = deconstify_char(q); nsk.size = size; - if (g_hash_table_lookup(by_namesize, &nsk)) + if (hset_contains(by_namesize, &nsk)) continue; ns = namesize_make(q, size); - g_hash_table_insert(by_namesize, ns, GINT_TO_POINTER(1)); + hset_insert(by_namesize, ns); } } @@ -308,26 +309,10 @@ const char * ignore_sha1_filename(const struct sha1 *sha1) { - return g_hash_table_lookup(by_sha1, sha1); + return htable_lookup(by_sha1, sha1); } -const char * -ignore_reason_to_string(enum ignore_val reason) -{ - switch (reason) { - case IGNORE_OURSELVES: return "Points to ourselves"; - case IGNORE_HOSTILE: return "Hostile IP"; - case IGNORE_LIMIT: return "Country limit"; - case IGNORE_SHA1: return "SHA1"; - case IGNORE_SPAM: return "Known Spam"; - case IGNORE_LIBRARY: return "Already Owned"; - case IGNORE_NAMESIZE: return "Name & Size"; - case IGNORE_FALSE: return "NOT ignored"; - } - return NULL; -} - /** * Is ignoring requested for `filename' of size `size' and SHA1 `sha1'? * `filename' and `size' are only used if `sha1' is NULL. @@ -336,28 +321,31 @@ * @param size the filesize * @param sha1 must point to a SHA1 (binary) or NULL */ -enum ignore_val +ignore_val_t ignore_is_requested(const char *filename, filesize_t size, const struct sha1 *sha1) { g_assert(filename != NULL); if (sha1) { - const shared_file_t *sf; - if (g_hash_table_lookup(by_sha1, sha1)) + shared_file_t *sf; + bool ignore; + if (htable_contains(by_sha1, sha1)) return IGNORE_SHA1; if (spam_sha1_check(sha1)) return IGNORE_SPAM; sf = shared_file_by_sha1(sha1); - if (sf && sf != SHARE_REBUILDING && !shared_file_is_partial(sf)) + ignore = sf && sf != SHARE_REBUILDING && !shared_file_is_partial(sf); + shared_file_unref(&sf); + if (ignore) return IGNORE_LIBRARY; } else { namesize_t ns; - ns.name = deconstify_gchar(filename); + ns.name = deconstify_char(filename); ns.size = size; - if (g_hash_table_lookup(by_namesize, &ns)) + if (hset_contains(by_namesize, &ns)) return IGNORE_NAMESIZE; } @@ -372,10 +360,8 @@ { g_assert(sha1); - if (!g_hash_table_lookup(by_sha1, sha1)) { - gm_hash_table_insert_const(by_sha1, - atom_sha1_get(sha1), atom_str_get(file)); - } + if (!htable_contains(by_sha1, sha1)) + htable_insert_const(by_sha1, atom_sha1_get(sha1), atom_str_get(file)); /* * Write to file even if duplicate SHA1, in order to help us @@ -400,14 +386,14 @@ { namesize_t nsk; - nsk.name = deconstify_gchar(file); + nsk.name = deconstify_char(file); nsk.size = size; - if (!g_hash_table_lookup(by_namesize, &nsk)) { + if (!hset_contains(by_namesize, &nsk)) { namesize_t *ns; ns = namesize_make(file, size); - g_hash_table_insert(by_namesize, ns, GINT_TO_POINTER(1)); + hset_insert(by_namesize, ns); } /* @@ -452,46 +438,42 @@ } /** - * Remove iterator callback. + * Table iterator callback. * - * Free a key/value pair from the by_sha1 hash. + * Free a key/value pair from the by_sha1 table. */ -static gboolean -free_sha1_kv(gpointer key, gpointer value, gpointer unused_udata) +static void +free_sha1_kv(const void *key, void *value, void *unused_udata) { (void) unused_udata; atom_sha1_free(key); atom_str_free(value); - - return TRUE; } /** - * Remove iterator callback. + * Set iterator callback. * - * Free a key/value pair from the by_namesize hash. + * Free an entry from the by_namesize set. */ -static gboolean -free_namesize_kv(gpointer key, gpointer unused_value, gpointer unused_udata) +static void +free_namesize_kv(const void *key, void *unused_udata) { - (void) unused_value; (void) unused_udata; - namesize_free(key); - return TRUE; + namesize_free(deconstify_pointer(key)); } /** * Called during servent shutdown to free up resources. */ -G_GNUC_COLD void +void G_COLD ignore_close(void) { - g_hash_table_foreach_remove(by_sha1, free_sha1_kv, NULL); - gm_hash_table_destroy_null(&by_sha1); + htable_foreach(by_sha1, free_sha1_kv, NULL); + htable_free_null(&by_sha1); - g_hash_table_foreach_remove(by_namesize, free_namesize_kv, NULL); - gm_hash_table_destroy_null(&by_namesize); + hset_foreach(by_namesize, free_namesize_kv, NULL); + hset_free_null(&by_namesize); if (sha1_out != NULL) { fclose(sha1_out);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/ignore.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/ignore.h
Changed
@@ -36,26 +36,16 @@ #include "common.h" +#include "if/gen/ignore.h" + void ignore_init(void); void ignore_close(void); -enum ignore_val { - IGNORE_FALSE = 0, /**< Do not ignore */ - IGNORE_SHA1, /**< Ignore because of SHA1 */ - IGNORE_NAMESIZE, /**< Ignore because of Name & Size */ - IGNORE_LIBRARY, /**< Ignore because SHA1 present in library */ - IGNORE_HOSTILE, /**< Ignore because IP address is hostile */ - IGNORE_OURSELVES, /**< Ignore because IP:port points to ourselves */ - IGNORE_LIMIT, /**< Ignore because of country limits */ - IGNORE_SPAM /**< Ignore because SHA1 is known spam */ -}; - struct sha1; void ignore_timer(time_t now); -enum ignore_val ignore_is_requested( +ignore_val_t ignore_is_requested( const char *file, filesize_t size, const struct sha1 *sha1); -const char *ignore_reason_to_string(enum ignore_val); void ignore_add_filesize(const char *file, filesize_t size); void ignore_add_sha1(const char *file, const struct sha1 *sha1);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/inet.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/inet.c
Changed
@@ -52,6 +52,14 @@ #include "lib/override.h" /* Must be the last header included */ /*** + *** IP network buffer shortage. + ***/ + +#define BUF_SHORTAGE_WINDOW 90 /**< IP buffer shortage monitoring */ + +static watchdog_t *buf_shortage_wd; + +/*** *** Firewall status management structures. ***/ @@ -153,7 +161,7 @@ static watchdog_t *outgoing_wd; /**< Watchdog for outgoing activity */ -static void inet_set_is_connected(gboolean val); +static void inet_set_is_connected(bool val); /** * Checks whether a host address is considered being "local". @@ -162,7 +170,7 @@ * @returns TRUE if the IP address is that of the local machine or * a private address. Otherwise FALSE is returned. */ -static gboolean +static bool is_local_addr(const host_addr_t addr) { static host_addr_t our_addr, our_addr_v6; @@ -175,7 +183,7 @@ */ if (settings_use_ipv4()) { if (!is_host_addr(our_addr)) { - static gboolean tried; + static bool tried; if (!tried) { tried = TRUE; @@ -187,7 +195,7 @@ if (!is_host_addr(our_addr)) our_addr = listen_addr(); if (!is_host_addr(our_addr)) { - static gboolean tried; + static bool tried; if (!tried) { tried = TRUE; @@ -199,10 +207,10 @@ } } } - + if (settings_use_ipv6()) { if (!is_host_addr(our_addr_v6)) { - static gboolean tried; + static bool tried; if (!tried) { /* This should not change */ @@ -214,7 +222,7 @@ if (!is_host_addr(our_addr_v6)) our_addr = listen_addr6(); if (!is_host_addr(our_addr_v6)) { - static gboolean tried; + static bool tried; if (!tried) { tried = TRUE; @@ -230,9 +238,9 @@ if (is_my_address(addr)) return TRUE; - if (host_addr_equal(addr, ipv4_loopback)) + if (host_addr_equiv(addr, ipv4_loopback)) return TRUE; - if (host_addr_equal(addr, ipv6_loopback)) + if (host_addr_equiv(addr, ipv6_loopback)) return TRUE; switch (host_addr_net(addr)) { @@ -280,7 +288,7 @@ * @param new_env when TRUE, we become firewalled due to a new environment */ void -inet_udp_firewalled(gboolean new_env) +inet_udp_firewalled(bool new_env) { gnet_prop_set_boolean_val(PROP_IS_UDP_FIREWALLED, TRUE); node_became_udp_firewalled(); @@ -296,12 +304,11 @@ * Enter the UNSOLICITED_CHECK state. */ static void -move_to_unsolicited_check(cqueue_t *unused_cq, gpointer unused_data) +move_to_unsolicited_check(cqueue_t *cq, void *unused_data) { - (void) unused_cq; (void) unused_data; - unsolicited_udp_ev = NULL; /* Event fired */ + cq_zero(cq, &unsolicited_udp_ev); /* Event fired */ if (GNET_PROPERTY(fw_debug)) g_debug("FW: will be now monitoring UDP for unsolicited messages"); @@ -354,8 +361,8 @@ * for some amount of time. We conclude we're no longer able to get * solicited UDP traffic. */ -static gboolean -got_no_udp_solicited(watchdog_t *unused_wd, gpointer unused_obj) +static bool +got_no_udp_solicited(watchdog_t *unused_wd, void *unused_obj) { (void) unused_wd; (void) unused_obj; @@ -389,8 +396,8 @@ * This is a callback invoked when no incoming connection has been received * for some amount of time. We conclude we became firewalled. */ -static gboolean -got_no_connection(watchdog_t *unused_wd, gpointer unused_obj) +static bool +got_no_connection(watchdog_t *unused_wd, void *unused_obj) { (void) unused_wd; (void) unused_obj; @@ -408,8 +415,8 @@ * This is a callback invoked when no unsolicited UDP datagrams have been * received for some amount of time. We conclude we became firewalled. */ -static gboolean -got_no_udp_unsolicited(watchdog_t *unused_wd, gpointer unused_obj) +static bool +got_no_udp_unsolicited(watchdog_t *unused_wd, void *unused_obj) { (void) unused_wd; (void) unused_obj; @@ -465,9 +472,23 @@ gnet_prop_set_boolean_val(PROP_IS_FIREWALLED, FALSE); node_proxy_cancel_all(); - if (GNET_PROPERTY(fw_debug)) + if (GNET_PROPERTY(fw_debug)) { g_debug("FW: we're not TCP-firewalled for port %u", socket_listen_port()); + } +} + +/** + * Switch to non TCP-firewalled if we were indeed firewalled. + */ +static void +inet_switch_to_not_firewalled(void) +{ + if (GNET_PROPERTY(is_firewalled)) { + wd_wakeup(incoming_wd); + inet_not_firewalled(); + inet_where(); + } } /** @@ -478,14 +499,49 @@ { gnet_prop_set_boolean_val(PROP_IS_UDP_FIREWALLED, FALSE); - if (GNET_PROPERTY(fw_debug)) + if (GNET_PROPERTY(fw_debug)) { g_debug("FW: we're not UDP-firewalled for port %u", socket_listen_port()); + } unsolicited_wait_periods = 0; } /** + * Switch to non UDP-firewalled if we were indeed firewalled. + */ +static void +inet_switch_to_udp_not_firewalled(void) +{ + if (GNET_PROPERTY(is_udp_firewalled)) { + inet_udp_not_firewalled(); + inet_where(); + } +} + +/** + * Called when we established UPnP or NAT-PMP router configuration. + */ +void +inet_router_configured(void) +{ + if (GNET_PROPERTY(fw_debug)) { + g_debug("FW: configured router to forward port %u", + socket_listen_port()); + } + + /* + * Assume mapping will be all-right, which will be the case usually. + * + * In case something gets wrong afterwards or the router lied, we can + * still go back to a firewalled status later on anyway. + */ + + inet_switch_to_not_firewalled(); + inet_switch_to_udp_not_firewalled(); +} + +/** * Called when we got an incoming connection from another computer at `addr'. */ void @@ -522,12 +578,7 @@ * We're not firewalled. */ - if (GNET_PROPERTY(is_firewalled)) { - wd_wakeup(incoming_wd); - inet_not_firewalled(); - inet_where(); - } - + inet_switch_to_not_firewalled(); wd_kick(incoming_wd); } @@ -542,25 +593,19 @@ * a reply of some sort (i.e. sent back to us through a masquerated port). * When we do get these messages, then this routine can be called explicitly. */ -void +void inet_udp_got_unsolicited_incoming(void) { if (outgoing_udp_state != UNSOLICITED_OFF) { - if (GNET_PROPERTY(fw_debug)) { + if (GNET_PROPERTY(fw_debug)) g_debug("FW: got unsolicited UDP message => not firewalled"); - inet_where(); - } move_to_unsolicited_off(); } else if (GNET_PROPERTY(is_udp_firewalled)) { - if (GNET_PROPERTY(fw_debug)) { + if (GNET_PROPERTY(fw_debug)) g_debug("FW: got unsolicited UDP message"); - inet_where(); - } } - if (GNET_PROPERTY(is_udp_firewalled)) - inet_udp_not_firewalled(); - + inet_switch_to_udp_not_firewalled(); wd_kick(incoming_udp_wd); } @@ -641,7 +686,7 @@ * a non-private IP and are within a "grace period", act as if we were not: * we can only know we're not firewalled when we get an incoming connection. */ -gboolean +bool inet_can_answer_ping(void) { int elapsed; @@ -685,7 +730,7 @@ * Sets our internet connection status. */ static void -inet_set_is_connected(gboolean val) +inet_set_is_connected(bool val) { gnet_prop_set_boolean_val(PROP_IS_INET_CONNECTED, val); @@ -698,8 +743,8 @@ * This callback fires when there was no outgoing activity for the period * after the watchdog was started. */ -static gboolean -no_outgoing_connection(watchdog_t *unused_wd, gpointer unused_obj) +static bool +no_outgoing_connection(watchdog_t *unused_wd, void *unused_obj) { (void) unused_wd; (void) unused_obj; @@ -763,10 +808,55 @@ wd_kick(outgoing_wd); } +/*** + *** IP network buffer shortage monitoring. + ***/ + +/** + * This callback fires when the IP network buffer shortage is hopefully gone. + */ +static bool +inet_buf_shortage_gone(watchdog_t *unused_wd, void *unused_obj) +{ + (void) unused_wd; + (void) unused_obj; + + g_message("%s(): assuming network buffer shortage is gone", G_STRFUNC); + + gnet_prop_set_boolean_val(PROP_NET_BUFFER_SHORTAGE, FALSE); + return FALSE; /* Put watchdog back to sleep */ +} + +/** + * We just got an ENOBUFS error on a socket operation. + */ +void +inet_buf_shortage(void) +{ + /* + * Settting PROP_NET_BUFFER_SHORTAGE to TRUE means that we will try to + * avoid TCP connections and socket I/Os, if possible, for a while until + * hopefully more network buffers become available. + */ + + gnet_prop_set_boolean_val(PROP_NET_BUFFER_SHORTAGE, TRUE); + + /* + * Wake-up (if not already done) and kick the watchdog. If no other + * buffer shortage occurs within the monitoring period, we'll consider + * that the buffer shortage condition is gone. + */ + + if (wd_wakeup_kick(buf_shortage_wd)) { + g_carp("%s(): avoiding networking for a while to let buffers flush", + G_STRFUNC); + } +} + /** * Initialization code. */ -G_GNUC_COLD void +void G_COLD inet_init(void) { /* @@ -793,6 +883,13 @@ wd_wakeup(solicited_udp_wd); /* + * This watchdog is used to monitor IP network buffer shortages. + */ + + buf_shortage_wd = wd_make("IP network buffer shortage", + BUF_SHORTAGE_WINDOW, inet_buf_shortage_gone, NULL, FALSE); + + /* * Monitoring watchdog for outgoing connections. */ @@ -812,11 +909,12 @@ /** * Shutdown cleanup. */ -G_GNUC_COLD void +void G_COLD inet_close(void) { aging_destroy(&outgoing_udp); cq_cancel(&unsolicited_udp_ev); + wd_free_null(&buf_shortage_wd); wd_free_null(&outgoing_wd); wd_free_null(&incoming_wd); wd_free_null(&incoming_udp_wd);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/inet.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/inet.h
Changed
@@ -53,9 +53,9 @@ void inet_close(void); void inet_firewalled(void); -void inet_udp_firewalled(gboolean new_env); +void inet_udp_firewalled(bool new_env); -gboolean inet_can_answer_ping(void); +bool inet_can_answer_ping(void); void inet_got_incoming(const host_addr_t addr); void inet_read_activity(void); @@ -63,6 +63,8 @@ void inet_udp_record_sent(const host_addr_t addr); void inet_udp_got_unsolicited_incoming(void); void inet_udp_check_unsolicited(void); +void inet_router_configured(void); +void inet_buf_shortage(void); void inet_connection_attempted(const host_addr_t addr); void inet_connection_succeeded(const host_addr_t addr);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/ioheader.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/ioheader.c
Changed
@@ -59,8 +59,8 @@ */ struct io_header { enum io_opaque_magic magic; - gpointer resource; /**< Resource for which we're parsing */ - gpointer *io_opaque; /**< Where we're referenced in resource */ + void *resource; /**< Resource for which we're parsing */ + void **io_opaque; /**< Where we're referenced in resource */ struct gnutella_socket *socket; /**< Socket on which we're reading */ bsched_bws_t bws; /**< Bandwidth scheduler to use */ header_t *header; @@ -69,7 +69,7 @@ io_done_cb_t process_header; /**< Called when all headers are read */ io_start_cb_t header_read_start;/**< Called when reading first byte */ str_t *text; /**< Full header text */ - guint read_bytes; /**< Amount of bytes read */ + uint read_bytes; /**< Amount of bytes read */ int flags; }; @@ -77,9 +77,9 @@ * Internal consistency checks. */ static void -io_check(const gpointer opaque) +io_check(const void *opaque) { - struct io_header *ih = opaque; + const struct io_header *ih = opaque; g_assert(ih); g_assert(IO_OPAQUE_MAGIC == ih->magic); @@ -93,17 +93,15 @@ * Free the opaque I/O data. */ void -io_free(gpointer opaque) +io_free(void *opaque) { struct io_header *ih = opaque; io_check(opaque); *ih->io_opaque = NULL; - if (ih->header) - header_free(ih->header); - if (ih->getline) - getline_free(ih->getline); + header_free_null(&ih->header); + getline_free_null(&ih->getline); str_destroy_null(&ih->text); ih->magic = 0; @@ -114,9 +112,9 @@ * Fetch header structure from opaque I/O data. */ struct header * -io_header(const gpointer opaque) +io_header(const void *opaque) { - struct io_header *ih = opaque; + const struct io_header *ih = opaque; io_check(opaque); @@ -127,9 +125,9 @@ * Fetch getline structure from opaque I/O data. */ struct getline * -io_getline(const gpointer opaque) +io_getline(const void *opaque) { - struct io_header *ih = opaque; + const struct io_header *ih = opaque; io_check(opaque); @@ -143,9 +141,9 @@ * The returned data will be freed when io_free() is called. */ char * -io_gettext(const gpointer opaque) +io_gettext(const void *opaque) { - struct io_header *ih = opaque; + const struct io_header *ih = opaque; io_check(opaque); g_assert(ih->flags & IO_SAVE_HEADER); /* They must have requested this */ @@ -157,10 +155,10 @@ /** * How many bytes we received so far during header parsing. */ -guint -io_get_read_bytes(const gpointer opaque) +uint +io_get_read_bytes(const void *opaque) { - struct io_header *ih = opaque; + const struct io_header *ih = opaque; io_check(opaque); @@ -187,8 +185,8 @@ nextline: switch (getline_read(ih->getline, s->buf, s->pos, &parsed)) { case READ_OVERFLOW: - g_warning("io_header_parse: line too long, disconnecting from %s", - host_addr_to_string(s->addr)); + g_warning("%s(): line too long, disconnecting from %s", + G_STRFUNC, host_addr_to_string(s->addr)); if (log_printable(LOG_STDERR)) { dump_hex(stderr, "Leading Data", s->buf, MIN(s->pos, 256)); fprintf(stderr, "------ Header Dump:\n"); @@ -258,7 +256,7 @@ error = header_append(header, getline_str(ih->getline), getline_length(ih->getline)); - + switch (error) { case HEAD_OK: getline_reset(ih->getline); @@ -272,8 +270,8 @@ (*ih->error->header_error_tell)(ih->resource, error); /* FALL THROUGH */ case HEAD_EOH_REACHED: - g_warning("io_header_parse: %s, disconnecting from %s", - header_strerror(error), host_addr_to_string(s->addr)); + g_warning("%s(): %s, disconnecting from %s", + G_STRFUNC, header_strerror(error), host_addr_to_string(s->addr)); if (log_printable(LOG_STDERR)) { fprintf(stderr, "------ Header Dump:\n"); header_dump(stderr, header, "-----"); @@ -285,8 +283,9 @@ /* NOTREACHED */ default: /* Error, but try to continue */ if (GNET_PROPERTY(dbg)) { - g_warning("io_header_parse: %s, from %s", - header_strerror(error), host_addr_to_string(s->addr)); + g_warning("%s(): %s, from %s", + G_STRFUNC, header_strerror(error), + host_addr_to_string(s->addr)); if (log_printable(LOG_STDERR)) { dump_hex(stderr, "Header Line", getline_str(ih->getline), getline_length(ih->getline)); @@ -354,7 +353,7 @@ * Read data is then handed out to io_header_parse() for analysis. */ static void -io_read_data(gpointer data, int unused_source, inputevt_cond_t cond) +io_read_data(void *data, int unused_source, inputevt_cond_t cond) { struct io_header *ih = data; struct gnutella_socket *s = ih->socket; @@ -389,8 +388,8 @@ g_assert(s->buf_size >= s->pos); count = s->buf_size - s->pos; if (count < 1) { - g_warning("ih_header_read: incoming buffer full, " - "disconnecting from %s", host_addr_to_string(s->addr)); + g_warning("%s(): incoming buffer full, disconnecting from %s", + G_STRFUNC, host_addr_to_string(s->addr)); dump_hex(stderr, "Leading Data", s->buf, MIN(s->pos, 256)); (*ih->error->input_buffer_full)(ih->resource); return; @@ -435,7 +434,7 @@ * Read data is then handed out to io_header_parse() for analysis. */ void -io_add_header(gpointer opaque) +io_add_header(void *opaque) { struct io_header *ih = opaque; struct gnutella_socket *s; @@ -469,8 +468,8 @@ */ void io_get_header( - gpointer resource, /**< Resource for which we're reading headers */ - gpointer *io_opaque, /**< Field address in resource's structure */ + void *resource, /**< Resource for which we're reading headers */ + void **io_opaque, /**< Field address in resource's structure */ bsched_bws_t bws, /**< B/w scheduler from which we read */ struct gnutella_socket *s, /**< Socket from which we're reading */ int flags, /**< I/O parsing flags */ @@ -544,7 +543,7 @@ */ void io_continue_header( - gpointer opaque, /**< Existing header parsing context */ + void *opaque, /**< Existing header parsing context */ int flags, /**< New I/O parsing flags */ io_done_cb_t done, /**< Mandatory: final callback when all done */ io_start_cb_t start) /**< Optional: called when reading 1st byte */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/ioheader.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/ioheader.h
Changed
@@ -34,8 +34,8 @@ #ifndef _core_ioheader_h_ #define _core_ioheader_h_ -#include "common.h" -#include "bsched.h" +#include "common.h" +#include "bsched.h" struct io_header; struct header; @@ -47,18 +47,18 @@ * during header processing in case something goes wrong. */ struct io_error { - void (*line_too_long)(gpointer resource, struct header *header); - void (*header_error_tell)(gpointer resource, int error); /**< Optional */ - void (*header_error)(gpointer resource, int error); - void (*input_exception)(gpointer resource, struct header *header); - void (*input_buffer_full)(gpointer resource); - void (*header_read_error)(gpointer resource, int error); - void (*header_read_eof)(gpointer resource, struct header *header); - void (*header_extra_data)(gpointer resource, struct header *header); + void (*line_too_long)(void *resource, struct header *header); + void (*header_error_tell)(void *resource, int error); /**< Optional */ + void (*header_error)(void *resource, int error); + void (*input_exception)(void *resource, struct header *header); + void (*input_buffer_full)(void *resource); + void (*header_read_error)(void *resource, int error); + void (*header_read_eof)(void *resource, struct header *header); + void (*header_extra_data)(void *resource, struct header *header); }; -typedef void (*io_done_cb_t)(gpointer resource, struct header *header); -typedef void (*io_start_cb_t)(gpointer resource); +typedef void (*io_done_cb_t)(void *resource, struct header *header); +typedef void (*io_start_cb_t)(void *resource); /* * Parsing flags. @@ -74,16 +74,16 @@ * Public interface */ -void io_free(const gpointer opaque); -struct header *io_header(const gpointer opaque); -struct getline *io_getline(const gpointer opaque); -char *io_gettext(const gpointer opaque); -guint io_get_read_bytes(const gpointer opaque); -void io_add_header(gpointer opaque); +void io_free(void *opaque); +struct header *io_header(const void *opaque); +struct getline *io_getline(const void *opaque); +char *io_gettext(const void *opaque); +uint io_get_read_bytes(const void *opaque); +void io_add_header(void *opaque); void io_get_header( - gpointer resource, /**< Resource for which we're reading headers */ - gpointer *io_opaque, /**< Field address in resource's structure */ + void *resource, /**< Resource for which we're reading headers */ + void **io_opaque, /**< Field address in resource's structure */ bsched_bws_t bws, /**< B/w scheduler from which we read */ struct gnutella_socket *s, /**< Socket from which we're reading */ int flags, /**< I/O parsing flags */ @@ -92,7 +92,7 @@ const struct io_error *error); /**< Mandatory: error callbacks */ void io_continue_header( - gpointer opaque, /**< Existing header parsing context */ + void *opaque, /**< Existing header parsing context */ int flags, /**< New I/O parsing flags */ io_done_cb_t done, /**< Mandatory: final callback when all done */ io_start_cb_t start); /**< Optional: called when reading 1st byte */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/ipp_cache.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/ipp_cache.c
Changed
@@ -30,7 +30,7 @@ * determine whether a particular IP:port belongs to the cache and when * it was added. * - * This is generic code hanlding entries formatted as: + * This is generic code handling entries formatted as: * * HOST 10.19.182.13:1033 * SEEN 2010-10-27 14:25:06 @@ -54,19 +54,20 @@ #include "common.h" +#include "ipp_cache.h" + +#include "hosts.h" +#include "settings.h" + #include "lib/bit_array.h" +#include "lib/endian.h" #include "lib/file.h" #include "lib/getdate.h" #include "lib/hashlist.h" -#include "lib/walloc.h" - -#include "lib/endian.h" #include "lib/host_addr.h" #include "lib/timestamp.h" - -#include "hosts.h" -#include "settings.h" -#include "ipp_cache.h" +#include "lib/tokenizer.h" +#include "lib/walloc.h" #include "if/gnet_property_priv.h" @@ -83,11 +84,11 @@ const char *name; /**< Cache name */ const char *item_name; /**< Cache item name */ const char *description; /**< Cache description for comments */ - const guint32 *max_cache_time; /**< Amount of time data can stay cached */ - const guint32 *max_cache_size; /**< Max amount od items to cache */ + const uint32 *max_cache_time; /**< Amount of time data can stay cached */ + const uint32 *max_cache_size; /**< Max amount od items to cache */ hash_list_t *hosts; /**< The caching structure */ time_t last_stored; /**< Last time cache was persisted */ - const guint32 *debug; /**< Debug level for this cache */ + const uint32 *debug; /**< Debug level for this cache */ }; /** @@ -103,18 +104,18 @@ */ static ipp_cache_t *cachesIPP_CACHE_COUNT; -static guint -ipp_cache_item_hash(gconstpointer key) +static uint +ipp_cache_item_hash(const void *key) { const struct ipp_cache_item *item = key; return gnet_host_hash(&item->host); } static int -ipp_cache_item_eq(gconstpointer v1, gconstpointer v2) +ipp_cache_item_eq(const void *v1, const void *v2) { const struct ipp_cache_item *a = v1, *b = v2; - return gnet_host_eq(&a->host,& b->host); + return gnet_host_equal(&a->host,& b->host); } /** @@ -124,8 +125,8 @@ ipp_cache_alloc( const char *name, const char *item_name, const char *file_name, const char *description, - const guint32 *max_cache_time, const guint32 *max_cache_size, - const guint32 *debug) + const uint32 *max_cache_time, const uint32 *max_cache_size, + const uint32 *debug) { ipp_cache_t *ic; @@ -147,7 +148,7 @@ /** * Has a cached entry expired? */ -static gboolean +static bool ipp_cache_item_expired(const ipp_cache_t *ic, time_t seen, time_t now) { time_delta_t d = delta_time(now, seen); @@ -167,13 +168,10 @@ NUM_IPP_CACHE_TAGS } ipp_cache_tag_t; -static const struct ipp_cache_tag { - ipp_cache_tag_t tag; - const char *str; -} ipp_cache_tag_map = { +static const tokenizer_t ipp_cache_tags = { /* Must be sorted alphabetically for dichotomic search */ -#define IPP_CACHE_TAG(x) { CAT2(IPP_CACHE_TAG_,x), #x } +#define IPP_CACHE_TAG(x) { #x, CAT2(IPP_CACHE_TAG_,x) } IPP_CACHE_TAG(END), IPP_CACHE_TAG(HOST), IPP_CACHE_TAG(SEEN), @@ -185,24 +183,10 @@ /** * Convert a string representation of a serializing tag to its token number. */ -static ipp_cache_tag_t +static inline ipp_cache_tag_t ipp_cache_string_to_tag(const char *s) { - STATIC_ASSERT(G_N_ELEMENTS(ipp_cache_tag_map) == (NUM_IPP_CACHE_TAGS - 1)); - -#define GET_ITEM(i) (ipp_cache_tag_map(i).str) -#define FOUND(i) G_STMT_START { \ - return ipp_cache_tag_map(i).tag; \ - /* NOTREACHED */ \ -} G_STMT_END - - /* Perform a binary search to find ``s'' */ - BINARY_SEARCH(const char *, s, G_N_ELEMENTS(ipp_cache_tag_map), strcmp, - GET_ITEM, FOUND); - -#undef FOUND -#undef GET_ITEM - return IPP_CACHE_TAG_UNKNOWN; + return TOKENIZE(s, ipp_cache_tags); } /** @@ -221,7 +205,7 @@ iter = hash_list_iterator(ic->hosts); while (hash_list_iter_has_next(iter)) { const struct ipp_cache_item *item; - + item = hash_list_iter_next(iter); fprintf(f, "HOST %s\nSEEN %s\nEND\n\n", gnet_host_to_string(&item->host), timestamp_to_string(item->seen)); @@ -267,7 +251,7 @@ ipp_cache_remove_oldest(ipp_cache_t *ic) { struct ipp_cache_item *item; - + item = hash_list_head(ic->hosts); if (item) { hash_list_remove(ic->hosts, item); @@ -281,7 +265,7 @@ static void ipp_cache_insert_intern(ipp_cache_t *ic, const struct ipp_cache_item *item) { - gconstpointer key; + const void *key; int removed; size_t max_size; @@ -289,7 +273,7 @@ key = hash_list_remove(ic->hosts, item); if (key) { - struct ipp_cache_item *item_ptr = deconstify_gpointer(key); + struct ipp_cache_item *item_ptr = deconstify_pointer(key); /* We'll move the host to the end of the list */ if (*ic->debug > 3) { @@ -316,7 +300,7 @@ if (++removed >= IPP_CACHE_REMOVE) break; } - + item = hash_list_head(ic->hosts); if (item && ipp_cache_item_expired(ic, item->seen, tm_time())) { ipp_cache_remove_oldest(ic); @@ -339,7 +323,7 @@ * Insert host in specified cache. */ void -ipp_cache_insert(enum ipp_cache_id cid, const host_addr_t addr, guint16 port) +ipp_cache_insert(enum ipp_cache_id cid, const host_addr_t addr, uint16 port) { ipp_cache_t *ic = get_cache(cid); struct ipp_cache_item item; @@ -361,18 +345,18 @@ */ static struct ipp_cache_item * ipp_cache_lookup_intern(const ipp_cache_t *ic, - const host_addr_t addr, guint16 port) + const host_addr_t addr, uint16 port) { g_assert(ic); if (host_addr_initialized(addr) && is_host_addr(addr) && 0 != port) { struct ipp_cache_item item; - gconstpointer key; + const void *key; gnet_host_set(&item.host, addr, port); if (hash_list_find(ic->hosts, &item, &key)) { - struct ipp_cache_item *item_ptr = deconstify_gpointer(key); - + struct ipp_cache_item *item_ptr = deconstify_pointer(key); + if (!ipp_cache_item_expired(ic, item_ptr->seen, tm_time())) return item_ptr; @@ -386,8 +370,8 @@ /** * @return TRUE if addr:port is currently in the cache. */ -gboolean -ipp_cache_lookup(enum ipp_cache_id cid, const host_addr_t addr, guint16 port) +bool +ipp_cache_lookup(enum ipp_cache_id cid, const host_addr_t addr, uint16 port) { ipp_cache_t *ic = get_cache(cid); return NULL != ipp_cache_lookup_intern(ic, addr, port); @@ -399,7 +383,7 @@ */ time_t ipp_cache_get_timestamp(enum ipp_cache_id cid, - const host_addr_t addr, guint16 port) + const host_addr_t addr, uint16 port) { const struct ipp_cache_item *item; ipp_cache_t *ic = get_cache(cid); @@ -413,20 +397,20 @@ * * @return whether entry was found and deleted. */ -static gboolean +static bool ipp_cache_remove_intern(const ipp_cache_t *ic, - const host_addr_t addr, guint16 port) + const host_addr_t addr, uint16 port) { g_assert(ic); if (host_addr_initialized(addr) && is_host_addr(addr) && 0 != port) { struct ipp_cache_item item; - gconstpointer key; + const void *key; gnet_host_set(&item.host, addr, port); if (hash_list_find(ic->hosts, &item, &key)) { - struct ipp_cache_item *item_ptr = deconstify_gpointer(key); - + struct ipp_cache_item *item_ptr = deconstify_pointer(key); + hash_list_remove(ic->hosts, item_ptr); WFREE(item_ptr); return TRUE; @@ -440,8 +424,8 @@ * * @return TRUE if found and removed. */ -gboolean -ipp_cache_remove(enum ipp_cache_id cid, const host_addr_t addr, guint16 port) +bool +ipp_cache_remove(enum ipp_cache_id cid, const host_addr_t addr, uint16 port) { ipp_cache_t *ic = get_cache(cid); return ipp_cache_remove_intern(ic, addr, port); @@ -450,15 +434,15 @@ /** * Parse persisted cache. */ -static G_GNUC_COLD void +static void G_COLD ipp_cache_parse(ipp_cache_t *ic, FILE *f) { bit_array_t tag_usedBIT_ARRAY_SIZE(NUM_IPP_CACHE_TAGS); static const struct ipp_cache_item zero_item; struct ipp_cache_item item; char line1024; - guint line_no = 0; - gboolean done = FALSE; + uint line_no = 0; + bool done = FALSE; g_return_if_fail(f); @@ -471,7 +455,7 @@ while (fgets(line, sizeof line, f)) { const char *tag_name, *value; char *sp; - gboolean damaged; + bool damaged; ipp_cache_tag_t tag; line_no++; @@ -506,17 +490,16 @@ g_assert(UNSIGNED(tag) < NUM_IPP_CACHE_TAGS); if (IPP_CACHE_TAG_UNKNOWN != tag && !bit_array_flip(tag_used, tag)) { g_warning( - "ipp_cache_load(\"%s\"): " - "duplicate tag \"%s\" in entry in line %u", - ic->name, tag_name, line_no); + "%s(\"%s\"): duplicate tag \"%s\" in entry in line %u", + G_STRFUNC, ic->name, tag_name, line_no); break; } - + switch (tag) { case IPP_CACHE_TAG_HOST: { host_addr_t addr; - guint16 port; + uint16 port; if (string_to_host_addr_port(value, NULL, &addr, &port)) { gnet_host_set(&item.host, addr, port); @@ -532,14 +515,14 @@ damaged = TRUE; } break; - + case IPP_CACHE_TAG_END: if (!bit_array_get(tag_used, IPP_CACHE_TAG_HOST)) { - g_warning("ipp_cache_load(): missing HOST tag"); + g_warning("%s(): missing HOST tag", G_STRFUNC); damaged = TRUE; } if (!bit_array_get(tag_used, IPP_CACHE_TAG_SEEN)) { - g_warning("ipp_cache_load(): missing SEEN tag"); + g_warning("%s(): missing SEEN tag", G_STRFUNC); damaged = TRUE; } done = TRUE; @@ -548,16 +531,16 @@ case IPP_CACHE_TAG_UNKNOWN: /* Ignore */ break; - + case NUM_IPP_CACHE_TAGS: g_assert_not_reached(); break; } if (damaged) { - g_warning("damaged %s cache entry in line %u: " + g_warning("%s(): damaged %s cache entry in line %u: " "tag_name=\"%s\", value=\"%s\"", - ic->item_name, line_no, tag_name, value); + G_STRFUNC, ic->item_name, line_no, tag_name, value); break; } @@ -566,13 +549,14 @@ ipp_cache_lookup_intern(ic, gnet_host_get_addr(&item.host), gnet_host_get_port(&item.host)) ) { - g_warning( - "ignoring duplicate %s cache item around line %u (%s)", - ic->item_name, line_no, gnet_host_to_string(&item.host)); + g_warning("%s(): ignoring duplicate %s cache item around " + "line %u (%s)", + G_STRFUNC, ic->item_name, line_no, + gnet_host_to_string(&item.host)); } else if (!ipp_cache_item_expired(ic, item.seen, tm_time())) { ipp_cache_insert_intern(ic, &item); } - + /* Reset state */ done = FALSE; item = zero_item; @@ -597,15 +581,15 @@ /** * Retrieve cache from disk file. */ -static G_GNUC_COLD void +static void G_COLD ipp_cache_load(ipp_cache_t *ic) { FILE *f; f = file_config_open_read(ic->name, &ic->fp, 1); if (f) { - guint n; - + uint n; + ipp_cache_clear(ic); ipp_cache_parse(ic, f); n = hash_list_length(ic->hosts); @@ -626,7 +610,7 @@ ipp_cache_clear(ic); hash_list_free(&ic->hosts); - g_free(deconstify_gpointer(ic->fp.dir)); + g_free(deconstify_pointer(ic->fp.dir)); ic->fp.dir = NULL; /* Don't use G_FREE_NULL b/c of lvalue cast */ WFREE(ic); } @@ -654,9 +638,11 @@ * structures, as some callbacks may insert data in the caches. Later on, * the caches can be loaded when we know the properties are all initialized. */ -G_GNUC_COLD void +void G_COLD ipp_cache_init(void) { + TOKENIZE_CHECK_SORTED(ipp_cache_tags); + cachesIPP_CACHE_TLS = ipp_cache_alloc( "TLS cache", "TLS", "tls_cache", "TLS-capable hosts", GNET_PROPERTY_PTR(tls_cache_max_time),
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/ipp_cache.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/ipp_cache.h
Changed
@@ -1,6 +1,6 @@ /* * Copyright (c) 2009, Raphael Manfredi - * Copyright (c) 2006, Christian Biere + * Copyright (c) 2006, Christian Biere * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -39,7 +39,7 @@ #include "common.h" -struct ipp_cache; +#include "lib/host_addr.h" typedef struct ipp_cache ipp_cache_t; @@ -52,13 +52,13 @@ }; void ipp_cache_insert(enum ipp_cache_id cid, - const host_addr_t addr, guint16 port); -gboolean ipp_cache_lookup(enum ipp_cache_id cid, - const host_addr_t addr, guint16 port); + const host_addr_t addr, uint16 port); +bool ipp_cache_lookup(enum ipp_cache_id cid, + const host_addr_t addr, uint16 port); time_t ipp_cache_get_timestamp(enum ipp_cache_id cid, - const host_addr_t addr, guint16 port); -gboolean ipp_cache_remove(enum ipp_cache_id cid, - const host_addr_t addr, guint16 port); + const host_addr_t addr, uint16 port); +bool ipp_cache_remove(enum ipp_cache_id cid, + const host_addr_t addr, uint16 port); void ipp_cache_init(void); void ipp_cache_load_all(void); @@ -70,25 +70,25 @@ */ static inline void -tls_cache_insert(const host_addr_t addr, guint16 port) +tls_cache_insert(const host_addr_t addr, uint16 port) { ipp_cache_insert(IPP_CACHE_TLS, addr, port); } static inline void -tls_cache_remove(const host_addr_t addr, guint16 port) +tls_cache_remove(const host_addr_t addr, uint16 port) { ipp_cache_remove(IPP_CACHE_TLS, addr, port); } -static inline gboolean -tls_cache_lookup(const host_addr_t addr, guint16 port) +static inline bool +tls_cache_lookup(const host_addr_t addr, uint16 port) { return ipp_cache_lookup(IPP_CACHE_TLS, addr, port); } static inline time_t -tls_cache_get_timestamp(const host_addr_t addr, guint16 port) +tls_cache_get_timestamp(const host_addr_t addr, uint16 port) { return ipp_cache_get_timestamp(IPP_CACHE_TLS, addr, port); } @@ -98,13 +98,13 @@ */ static inline void -g2_cache_insert(const host_addr_t addr, guint16 port) +g2_cache_insert(const host_addr_t addr, uint16 port) { ipp_cache_insert(IPP_CACHE_G2, addr, port); } -static inline gboolean -g2_cache_lookup(const host_addr_t addr, guint16 port) +static inline bool +g2_cache_lookup(const host_addr_t addr, uint16 port) { return ipp_cache_lookup(IPP_CACHE_G2, addr, port); } @@ -114,13 +114,13 @@ */ static inline void -local_addr_cache_insert(const host_addr_t addr, guint16 port) +local_addr_cache_insert(const host_addr_t addr, uint16 port) { ipp_cache_insert(IPP_CACHE_LOCAL_ADDR, addr, port); } -static inline gboolean -local_addr_cache_lookup(const host_addr_t addr, guint16 port) +static inline bool +local_addr_cache_lookup(const host_addr_t addr, uint16 port) { return ipp_cache_lookup(IPP_CACHE_LOCAL_ADDR, addr, port); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/ipv6-ready.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/ipv6-ready.c
Changed
@@ -52,11 +52,11 @@ * * @return the IPv4 address to advertise. */ -guint32 +uint32 ipv6_ready_advertised_ipv4(const host_addr_t ha) { if (NET_TYPE_IPV4 == host_addr_net(ha)) { - guint32 ipv4 = host_addr_ipv4(ha); + uint32 ipv4 = host_addr_ipv4(ha); return IPV4_NONE == ipv4 ? 0 : ipv4; } else { return IPV4_NONE; @@ -66,7 +66,7 @@ /** * @return whether advertised IPv4 address indicates no IPv4 support. */ -gboolean +bool ipv6_ready_no_ipv4_addr(const host_addr_t ha) { return host_addr_is_ipv4(ha) && host_addr_ipv4(ha) == IPV4_NONE;
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/ipv6-ready.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/ipv6-ready.h
Changed
@@ -42,14 +42,14 @@ */ #define IPV4_NONE 0x7f000000U /* 127.0.0.0/32 */ -guint32 ipv6_ready_advertised_ipv4(const host_addr_t addr) G_GNUC_PURE; -gboolean ipv6_ready_no_ipv4_addr(const host_addr_t ha) G_GNUC_CONST; +uint32 ipv6_ready_advertised_ipv4(const host_addr_t addr) G_PURE; +bool ipv6_ready_no_ipv4_addr(const host_addr_t ha) G_CONST; /** * @return whether advertised IPv4 address indicates no IPv4 support. */ -static inline G_GNUC_CONST gboolean -ipv6_ready_has_no_ipv4(const guint32 advertised) +static inline G_CONST bool +ipv6_ready_has_no_ipv4(const uint32 advertised) { return advertised == IPV4_NONE; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/local_shell.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/local_shell.c
Changed
@@ -28,7 +28,7 @@ * Local shell * * This implements an alterego of gtk-gnutella to access the local socket - * of gtk-gnutella. + * of gtk-gnutella. * * @author Christian Biere * @date 2006 @@ -87,7 +87,7 @@ return EAGAIN == e || EINTR == e; } -void +void fd_set_nonblocking(int fd) { int ret, flags; @@ -95,7 +95,7 @@ ret = fcntl(fd, F_GETFL); flags = ret | O_NONBLOCK; if (flags != ret) - fcntl(fd, F_SETFL, flags); + (void) fcntl(fd, F_SETFL, flags); } #else /* !LOCAL_SHELL_STANDALONE */ @@ -163,7 +163,7 @@ #endif struct shell_buf { - char *buf; /**< Arbitrary buffer maybe static/local/dynamic */ + char *buf; /**< Arbitrary buffer maybe static/local/dynamic */ size_t size; /**< Amount of bytes that buf can hold */ size_t fill; /**< Amount readable bytes in buf from pos */ size_t pos; /**< Read position in buf */ @@ -173,6 +173,7 @@ unsigned writable:1; /**< If set, write() should succeed */ unsigned shutdown:1; /**< If set, a shutdown has been signalled */ unsigned wrote:1; /**< If set, last call to write() succeeded */ + unsigned server:1; /**< If set, buffer going to server */ }; struct line_buf { @@ -202,7 +203,11 @@ break; case -1: if (!is_temporary_error(errno)) { - perror("read() failed"); + if (sb->server) { + perror("read() from server failed"); + } else { + perror("read() failed"); + } return -1; } break; @@ -229,7 +234,7 @@ if (!line->buf) { errno = 0; line->buf = readline(""); - if (!line->buf && !is_temporary_error(errno)) { + if (!line->buf && !is_temporary_error(errno)) { sb->eof = 1; } line->length = line->buf ? strlen(line->buf) : 0; @@ -290,7 +295,11 @@ sb->hup = 1; } if (!is_temporary_error(errno)) { - perror("write() failed"); + if (sb->server) { + perror("write() to server failed"); + } else if (!sb->hup) { + perror("write() failed"); + } return -1; } break; @@ -376,6 +385,7 @@ server.size = sizeof server_buf; client.buf = client_buf; client.size = sizeof client_buf; + client.server = 1; /* Client is writing to server */ /* * Only send the empty INTR command when interactive. @@ -608,7 +618,7 @@ memcpy(path, dir, dir_len); pathdir_len = '/'; memcpy(&pathdir_len + 1, name, name_len + 1); - + return path; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/local_shell.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/local_shell.h
Changed
@@ -28,7 +28,7 @@ * Local shell * * This implements an alterego of gtk-gnutella to access the local socket - * of gtk-gnutella. + * of gtk-gnutella. * * @author Christian Biere * @date 2006
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/matching.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/matching.c
Changed
@@ -30,15 +30,17 @@ #include "share.h" #include "search.h" /* For lazy_safe_search() */ -#include "lib/atoms.h" #include "lib/ascii.h" +#include "lib/atomic.h" +#include "lib/atoms.h" #include "lib/halloc.h" +#include "lib/hset.h" #include "lib/pattern.h" -#include "lib/random.h" +#include "lib/pslist.h" #include "lib/stringify.h" /* For hex_escape() */ #include "lib/utf8.h" -#include "lib/wordvec.h" #include "lib/walloc.h" +#include "lib/wordvec.h" #include "if/gnet_property_priv.h" @@ -83,7 +85,7 @@ struct st_entry { const char *string; /* atom */ shared_file_t *sf; - guint32 mask; + uint32 mask; }; struct st_bin { @@ -98,8 +100,9 @@ int nentries, nchars, nbins; struct st_bin **bins; struct st_bin all_entries; - guchar index_mapMAX_INT_VAL(guchar); - guchar fold_mapMAX_INT_VAL(guchar); + uchar index_mapMAX_INT_VAL(uchar); + uchar fold_mapMAX_INT_VAL(uchar); + int refcnt; }; static inline void @@ -130,7 +133,7 @@ bin->nvals = 0; bin->nslots = size; - bin->vals = halloc(bin->nslots * sizeof bin->vals0); + HALLOC_ARRAY(bin->vals, bin->nslots); for (i = 0; i < bin->nslots; i++) bin->valsi = NULL; } @@ -169,7 +172,7 @@ { if (bin->nvals == bin->nslots) { bin->nslots *= 2; - bin->vals = hrealloc(bin->vals, bin->nslots * sizeof bin->vals0); + HREALLOC_ARRAY(bin->vals, bin->nslots); } bin->valsbin->nvals++ = entry; } @@ -182,23 +185,23 @@ { g_assert(bin->vals != NULL); /* Or it would not have been allocated */ - bin->vals = hrealloc(bin->vals, bin->nvals * sizeof bin->vals0); + HREALLOC_ARRAY(bin->vals, bin->nvals); bin->nslots = bin->nvals; } -static guchar mapMAX_INT_VAL(guchar); +static uchar mapMAX_INT_VAL(uchar); static void setup_map(void) { - static gboolean done; - guint i; + static bool done; + uint i; if (done) return; - for (i = 0; i < G_N_ELEMENTS(map); i++) { - guchar c; + for (i = 0; i < N_ITEMS(map); i++) { + uchar c; if (i > 0 && utf8_byte_is_allowed(i)) { if (is_ascii_upper(i)) { @@ -207,7 +210,7 @@ is_ascii_punct(i) || is_ascii_cntrl(i) || is_ascii_space(i) ) { c = ' '; - } else { + } else { c = i; } } else { @@ -225,11 +228,12 @@ static void st_initialize(search_table_t *table) { - guchar cur_char = '\0'; - guint i; + uchar cur_char = '\0'; + uint i; search_table_check(table); + table->refcnt = 1; table->nentries = table->nchars = 0; setup_map(); @@ -237,8 +241,8 @@ * The indexing map is used to avoid having 256*256 bins. */ - for (i = 0; i < G_N_ELEMENTS(table->index_map); i++) { - guchar map_char = mapi; + for (i = 0; i < N_ITEMS(table->index_map); i++) { + uchar map_char = mapi; if (table->fold_mapmap_char) { table->index_mapi = table->fold_mapmap_char; @@ -255,7 +259,7 @@ table->all_entries.vals = 0; if (GNET_PROPERTY(matching_debug)) { - static gboolean done; + static bool done; if (!done) { done = TRUE; @@ -276,7 +280,7 @@ search_table_check(table); g_assert(NULL == table->bins); - table->bins = halloc(table->nbins * sizeof table->bins0); + HALLOC_ARRAY(table->bins, table->nbins); for (i = 0; i < table->nbins; i++) table->binsi = NULL; @@ -284,15 +288,22 @@ } /** - * Destroy a search table. + * Destroy a search table, if its reference count dropped to 0. + * + * @return TRUE if table was destroyed, FALSE if some reference still remains. */ -static void +static bool st_destroy(search_table_t *table) { int i; search_table_check(table); + if (!atomic_int_dec_is_zero(&table->refcnt)) + return FALSE; + + g_assert(0 == table->refcnt); + if (table->bins) { for (i = 0; i < table->nbins; i++) { struct st_bin *bin = table->binsi; @@ -312,6 +323,8 @@ } bin_destroy(&table->all_entries); } + + return TRUE; } /** @@ -331,22 +344,40 @@ } /** - * Free search table, nullifying its pointer. + * Free search table (if no longer referenced), nullifying its pointer. */ void st_free(search_table_t **ptr) { - g_assert(ptr); + g_assert(ptr != NULL); + if (*ptr) { search_table_t *table = *ptr; - st_destroy(table); - table->magic = 0; - WFREE(table); + if (st_destroy(table)) { + table->magic = 0; + WFREE(table); + } *ptr = NULL; } } /** + * Add reference to the search table. + * + * To remove a reference on the table, call st_free(). + * + * @return its argument. + */ +search_table_t * +st_refcnt_inc(search_table_t *st) +{ + search_table_check(st); + + atomic_int_inc(&st->refcnt); + return st; +} + +/** * @return amount of entries in the table. */ int @@ -361,12 +392,12 @@ * Compute character mask "hash", using one bit per letter of the alphabet, * plus one for any digit. */ -static guint32 +static uint32 mask_hash(const char *s) { - guchar c; - guint32 mask = 0; + uchar c; + uint32 mask = 0; - while ((c = (guchar) *s++)) { + while ((c = (uchar) *s++)) { if (is_ascii_space(c)) continue; else if (is_ascii_digit(c)) @@ -387,8 +418,8 @@ static inline int st_key(search_table_t *table, const char k2) { - return table->index_map(guchar) k0 * table->nchars + - table->index_map(guchar) k1; + return table->index_map(uchar) k0 * table->nchars + + table->index_map(uchar) k1; } /** @@ -397,18 +428,20 @@ * * @return TRUE if the item was inserted; FALSE otherwise. */ -gboolean +bool st_insert_item(search_table_t *table, const char *s, const shared_file_t *sf) { size_t i, len; struct st_entry *entry; - GHashTable *seen_keys; + hset_t *seen_keys; - len = utf8_char_count(s); - if ((size_t) -1 == len || len < 2) + search_table_check(table); + + len = utf8_strlen(s); + if (len < 2) return FALSE; - seen_keys = g_hash_table_new(NULL, NULL); + seen_keys = hset_create(HASH_KEY_SELF, 0); WALLOC(entry); entry->string = atom_str_get(s); @@ -420,11 +453,10 @@ int key = st_key(table, &entry->stringi); /* don't insert item into same bin twice */ - if (g_hash_table_lookup(seen_keys, GINT_TO_POINTER(key))) + if (hset_contains(seen_keys, int_to_pointer(key))) continue; - g_hash_table_insert(seen_keys, GINT_TO_POINTER(key), - GINT_TO_POINTER(1)); + hset_insert(seen_keys, int_to_pointer(key)); g_assert(key < table->nbins); if (table->binskey == NULL) @@ -435,7 +467,7 @@ bin_insert_item(&table->all_entries, entry); table->nentries++; - g_hash_table_destroy(seen_keys); + hset_free_null(&seen_keys); return TRUE; } @@ -447,6 +479,8 @@ { int i; + search_table_check(table); + if (!table->all_entries.nvals) return; /* Nothing in table */ @@ -460,7 +494,7 @@ * Apply pattern matching on text, matching at the *beginning* of words. * Patterns are lazily compiled as needed, using pattern_compile_fast(). */ -static gboolean +static bool entry_match(const char *text, size_t tlen, cpattern_t **pw, word_vec_t *wovec, size_t wn) { @@ -477,7 +511,7 @@ pos = pattern_qsearch(pwi, text, tlen, offset, qs_begin); if (pos) - offset = (pos - text) + pwi->len; + offset = (pos - text) + pattern_len(pwi); else break; } @@ -501,8 +535,8 @@ { char *search; word_vec_t *wovec; - guint wocnt; - guint i; + uint wocnt; + uint i; if (NULL == qhv) return; @@ -534,29 +568,31 @@ * * @return number of hits we produced */ -G_GNUC_HOT int +int G_HOT st_search( search_table_t *table, const char *search_term, st_search_callback callback, - gpointer ctx, + void *ctx, int max_res, query_hashvec_t *qhv) { char *search; int key, nres = 0; - guint i, len; + uint i, len; struct st_bin *best_bin = NULL; int best_bin_size = INT_MAX; word_vec_t *wovec; - guint wocnt; + uint wocnt; cpattern_t **pattern; struct st_entry **vals; - guint vcnt; + uint vcnt; int scanned = 0; /* measure search mask efficiency */ - guint32 search_mask; + uint32 search_mask; size_t minlen; - guint random_offset; /* Randomizer for search returns */ + pslist_t *result = NULL; + + search_table_check(table); search = UNICODE_CANONIZE(search_term); @@ -641,8 +677,7 @@ g_assert(best_bin_size > 0); /* Allocated bin, it must hold something */ - - pattern = walloc0(wocnt * sizeof *pattern); + WALLOC0_ARRAY(pattern, wocnt); /* * Prepare matching optimization, an idea from Mike Green. @@ -680,21 +715,22 @@ vcnt = best_bin->nvals; vals = best_bin->vals; - random_offset = random_u32() % vcnt; nres = 0; for (i = 0; i < vcnt; i++) { - const struct st_entry *e; - shared_file_t *sf; + const struct st_entry *e = valsi; + const shared_file_t *sf; size_t canonic_len; /* - * As we only return a limited count of results, pick a random - * offset, so that repeated searches will match different items - * instead of always the first - with some probability. + * As we only return a limited amount of results, we insert all the + * matching entries in a list, which will then be randomly shuffled. + * Only its leading items will be extracted. + * + * That strategy allows us to possibly return all the matching entries + * when they repeat the search over time. */ - e = vals(i + random_offset) % vcnt; - + if ((e->mask & search_mask) != search_mask) continue; /* Can't match */ @@ -715,25 +751,44 @@ search, shared_file_name_nfc(sf)); } - if ((*callback)(ctx, sf)) { - nres++; - if (nres >= max_res) - break; - } + result = pslist_prepend_const(result, sf); + nres++; } } - if (GNET_PROPERTY(matching_debug) > 3) - g_debug("MATCH st_search(): scanned %d entr%s from the %d in bin, " - "got %d match%s", - scanned, 1 == scanned ? "y" : "ies", - best_bin_size, nres, 1 == nres ? "" : "es"); + if (GNET_PROPERTY(matching_debug) > 3) { + g_debug("MATCH %s(): " + "scanned %d entr%s from the %d in bin, got %d match%s", + G_STRFUNC, scanned, plural_y(scanned), + best_bin_size, nres, plural_es(nres)); + } + + /* + * Randomly shuffle the results and pick the first max_res items. + */ + + if (result != NULL) { + if (nres > max_res) + result = pslist_shuffle(result); + + for (i = 0; i < UNSIGNED(max_res); /* empty */) { + const shared_file_t *sf = pslist_shift(&result); + + if (NULL == sf) + break; + + if ((*callback)(ctx, sf)) + i++; /* Entry retained */ + } + + pslist_free_null(&result); + } for (i = 0; i < wocnt; i++) if (patterni) /* Lazily compiled by entry_match() */ pattern_free(patterni); - wfree(pattern, wocnt * sizeof *pattern); + WFREE_ARRAY(pattern, wocnt); word_vec_free(wovec, wocnt); finish:
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/matching.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/matching.h
Changed
@@ -71,10 +71,11 @@ search_table_t *st_create(void); void st_free(search_table_t **); -gboolean st_insert_item(search_table_t *, const char *key, +bool st_insert_item(search_table_t *, const char *key, const struct shared_file *sf); void st_compact(search_table_t *); int st_count(const search_table_t *st); +search_table_t *st_refcnt_inc(search_table_t *st); /** * Callback for st_search(). @@ -84,13 +85,13 @@ * * @return TRUE if the match must be accounted as a valid result. */ -typedef gboolean (*st_search_callback)(gpointer ctx, gpointer data); +typedef bool (*st_search_callback)(void *ctx, const void *data); int st_search( search_table_t *table, const char *search, st_search_callback callback, - gpointer ctx, + void *ctx, int max_res, struct query_hashvec *qhv);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/move.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/move.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2013 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -27,8 +27,11 @@ * * Asychronous file moving operations. * + * As of 2013-11-10, this background task runs in a dedicated thread since + * it is purely I/O driven. + * * @author Raphael Manfredi - * @date 2002-2003 + * @date 2002-2003, 2013 */ #include "common.h" @@ -36,15 +39,20 @@ #include "move.h" #include "downloads.h" #include "fileinfo.h" -#include "file_object.h" #include "lib/atoms.h" +#include "lib/barrier.h" #include "lib/bg.h" #include "lib/compat_misc.h" +#include "lib/compat_sendfile.h" #include "lib/fd.h" #include "lib/file.h" +#include "lib/file_object.h" #include "lib/halloc.h" +#include "lib/log.h" #include "lib/stringify.h" +#include "lib/teq.h" +#include "lib/thread.h" #include "lib/tm.h" #include "lib/unsigned.h" #include "lib/walloc.h" @@ -58,6 +66,8 @@ #define COPY_BUF_SIZE 65536 /**< Size of the reading buffer */ static struct bgtask *move_daemon; +static uint move_thread_id = THREAD_INVALID_ID; +static bool move_work_available; enum moved_magic_t { MOVED_MAGIC = 0x0ac0b103 }; @@ -66,13 +76,15 @@ */ struct moved { enum moved_magic_t magic; /**< Magic number */ - struct download *d; /**< Download for which we're moving file */ + download_t *d; /**< Download for which we're moving file */ char *buffer; /**< Large buffer, where data is read */ char *target; /**< Target file name, in case an error occurs */ time_t start; /**< Start time, to determine copying rate */ + time_t last_notify; /**< Last notification time to main thread */ filesize_t size; /**< Size of file */ filesize_t copied; /**< Amount of data copied so far */ - struct file_object *rd; /**< The file object to read the file. */ + file_object_t *rd; /**< The file object to read the file. */ + time_delta_t elapsed; /**< Elapsed time, set when move is completed */ int wd; /**< File descriptor for write, -1 if none */ int error; /**< Error code */ }; @@ -81,7 +93,7 @@ * Work queue entry. */ struct work { - struct download *d; /**< Download to move */ + download_t *d; /**< Download to move */ const char *dest; /**< Target directory (atom) */ const char *ext; /**< Trailing extension (atom) */ }; @@ -90,7 +102,7 @@ * Allocate work queue entry. */ static struct work * -we_alloc(struct download *d, const char *dest, const char *ext) +move_we_alloc(download_t *d, const char *dest, const char *ext) { struct work *we; @@ -106,7 +118,7 @@ * Freeing of work queue entry. */ static void -we_free(gpointer data) +move_we_free(void *data) { struct work *we = data; @@ -119,7 +131,7 @@ * Signal handler for termination. */ static void -d_sighandler(struct bgtask *unused_h, gpointer u, bgsig_t sig) +move_d_sighandler(struct bgtask *unused_h, void *u, bgsig_t sig) { struct moved *md = u; @@ -145,7 +157,7 @@ * Freeing of computation context. */ static void -d_free(gpointer ctx) +move_d_free(void *ctx) { struct moved *md = ctx; @@ -158,25 +170,66 @@ WFREE(md); } +static void * +move_notify(void *v) +{ + bool on = pointer_to_bool(v); + + g_assert(thread_is_main()); + + gnet_prop_set_boolean_val(PROP_FILE_MOVING, on); + return NULL; +} + +/** + * Called in the context of the moving thread when the daemon task status + * changes. + */ +static void +move_notification_change(void *v) +{ + atomic_bool_set(&move_work_available, pointer_to_bool(v)); +} + /** * Daemon's notification of start/stop. */ static void -d_notify(struct bgtask *unused_h, gboolean on) +move_d_notify(struct bgtask *unused_h, bool on) { (void) unused_h; - gnet_prop_set_boolean_val(PROP_FILE_MOVING, on); + + teq_safe_rpc(THREAD_MAIN, move_notify, bool_to_pointer(on)); + teq_post(move_thread_id, move_notification_change, bool_to_pointer(on)); +} + +/** + * Invoked in the main thread when the move is starting. + */ +static void * +move_starting(void *ctx) +{ + struct moved *md = ctx; + download_t *d; + + g_assert(md->magic == MOVED_MAGIC); + g_assert(thread_is_main()); + + d = md->d; + download_move_start(d); + + return NULL; } /** * Daemon's notification: starting to work on item. */ static void -d_start(struct bgtask *h, gpointer ctx, gpointer item) +move_d_start(struct bgtask *h, void *ctx, void *item) { struct moved *md = ctx; struct work *we = item; - struct download *d = we->d; + download_t *d = we->d; filestat_t buf; const char *name; @@ -185,23 +238,14 @@ g_assert(md->wd == -1); g_assert(md->target == NULL); - download_move_start(d); - bg_task_signal(h, BG_SIG_TERM, d_sighandler); + bg_task_signal(h, BG_SIG_TERM, move_d_sighandler); md->d = we->d; + teq_safe_rpc(THREAD_MAIN, move_starting, md); md->rd = file_object_open(download_pathname(d), O_RDONLY); if (NULL == md->rd) { - int fd = file_absolute_open(download_pathname(d), O_RDONLY, 0); - if (fd < 0) { - md->error = errno; - goto abort_read; - } - md->rd = file_object_new(fd, download_pathname(d), O_RDONLY); - } - - if (NULL == md->rd) { - md->error = EINVAL; + md->error = errno; goto abort_read; } @@ -234,13 +278,14 @@ md->start = tm_time(); md->size = download_filesize(d); md->copied = 0; + md->last_notify = md->start; md->error = 0; - compat_fadvise_sequential(file_object_get_fd(md->rd), 0, 0); + file_object_fadvise_sequential(md->rd); if (GNET_PROPERTY(move_debug) > 1) g_debug("MOVE starting moving \"%s\" to \"%s\"", - file_object_get_pathname(md->rd), md->target); + file_object_pathname(md->rd), md->target); return; @@ -252,19 +297,42 @@ } /** + * Invoked in the main thread when the move is completed. + */ +static void * +move_done(void *ctx) +{ + struct moved *md = ctx; + download_t *d; + + g_assert(md->magic == MOVED_MAGIC); + g_assert(thread_is_main()); + + d = md->d; + + if (md->error == 0) { + file_info_mark_stripped(d->file_info); + download_move_done(d, md->target, md->elapsed); + } else { + download_move_error(d); + } + + return NULL; +} + +/** * Daemon's notification: finished working on item. */ static void -d_end(struct bgtask *h, gpointer ctx, gpointer item) +move_d_end(struct bgtask *h, void *ctx, void *item) { struct moved *md = ctx; - struct download *d = md->d; - int elapsed = 0; g_assert(md->magic == MOVED_MAGIC); g_assert(md->d == ((struct work *) item)->d); bg_task_signal(h, BG_SIG_TERM, NULL); + md->elapsed = 0; if (NULL == md->rd) { /* Did not start properly */ g_assert(md->error); @@ -313,9 +381,12 @@ goto error; } - if (!file_object_moved(download_pathname(md->d), md->target)) { - g_warning("cannot unlink \"%s\": %m", download_basename(md->d)); + if (GNET_PROPERTY(move_debug) > 1) { + g_debug("MOVE unlinking \"%s\", moved to \"%s\"", + download_pathname(md->d), md->target); } + + file_object_moved(download_pathname(md->d), md->target); } else { if (md->target != NULL && -1 == unlink(md->target)) g_warning("cannot unlink \"%s\": %m", md->target); @@ -324,31 +395,48 @@ /* FALL THROUGH */ error: - elapsed = delta_time(tm_time(), md->start); - elapsed = MAX(1, elapsed); /* time warp? clock not monotic? */ + md->elapsed = delta_time(tm_time(), md->start); + md->elapsed = MAX(1, md->elapsed); /* time warp? clock not monotonic? */ - if (GNET_PROPERTY(move_debug) > 1) - g_debug("MOVE moved file \"%s\" at %s bytes/sec error=%d\n", + if (GNET_PROPERTY(move_debug) > 0) { + g_debug("MOVE moved file \"%s\" at %s bytes/sec error=%d", download_basename(md->d), - filesize_to_string(md->size / elapsed), md->error); - + filesize_to_gstring(md->size / md->elapsed), md->error); + } + /* FALL THROUGH */ finish: - if (md->error == 0) { - file_info_mark_stripped(d->file_info); - download_move_done(d, md->target, elapsed); - } else - download_move_error(d); + /* + * The core is not fully thread-safe, therefore funnel back the final + * updates on the core structures when the move is completed. + */ + teq_safe_rpc(THREAD_MAIN, move_done, md); HFREE_NULL(md->target); } /** + * Invoked in the main thread to report file moving progress. + */ +static void * +move_progress(void *ctx) +{ + struct moved *md = ctx; + + g_assert(md->magic == MOVED_MAGIC); + g_assert(thread_is_main()); + + download_move_progress(md->d, md->copied); + + return NULL; +} + +/** * Copy file around, incrementally. */ static bgret_t -d_step_copy(struct bgtask *h, gpointer u, int ticks) +move_d_step_copy(struct bgtask *h, void *u, int ticks) { struct moved *md = u; ssize_t r; @@ -369,7 +457,15 @@ g_assert(md->size > md->copied); remain = md->size - md->copied; + + /* + * When we use sendfile(), we have no use for the internal buffer, + * hence there is no need to limit the amount of data to transfer. + */ + +#ifndef HAS_SENDFILE remain = MIN(remain, COPY_BUF_SIZE); +#endif /* * Each tick we have can buy us COPY_BLOCK_FRAGMENT bytes. @@ -384,30 +480,41 @@ g_assert(amount > 0); +#ifdef HAS_SENDFILE + { + off_t off = md->copied; + + /* + * Calling file_object_fd() is safe here since we are in the process + * of moving the downloaded file, and therefore the file object's + * file descriptor is still valid: we know no other concurrent moving + * operation is occurring. + */ + + r = compat_sendfile(md->wd, file_object_fd(md->rd), &off, amount); + if (r <= 0) { + md->error = 0 == r ? EPIPE : errno; + g_warning("error while reading \"%s\" for moving \"%s\": %m", + file_object_pathname(md->rd), download_basename(md->d)); + return BGR_DONE; + } + } +#else /* !HAS_SENDFILE */ r = file_object_pread(md->rd, md->buffer, amount, md->copied); if ((ssize_t) -1 == r) { md->error = errno; g_warning("error while reading \"%s\" for moving: %m", - file_object_get_pathname(md->rd)); + file_object_pathname(md->rd)); return BGR_DONE; } else if (r == 0) { g_warning("EOF while reading \"%s\" for moving!", - file_object_get_pathname(md->rd)); + file_object_pathname(md->rd)); md->error = -1; return BGR_DONE; } g_assert((size_t) r == amount); - /* - * Any partially read block counts as one block, hence the second term. - */ - - t = (r / COPY_BLOCK_FRAGMENT) + (r % COPY_BLOCK_FRAGMENT ? 1 : 0); - used += t; - - bg_task_ticks_used(h, used); - r = write(md->wd, md->buffer, amount); if ((ssize_t) -1 == r) { md->error = errno; @@ -419,14 +526,37 @@ g_warning("short write whilst moving \"%s\"", download_basename(md->d)); return BGR_DONE; } +#endif /* HAS_SENDFILE */ g_assert((size_t) r == amount); md->copied += r; - download_move_progress(md->d, md->copied); - if (md->copied == md->size) + /* + * Any partially read block counts as one block, hence the second term. + */ + + t = (r / COPY_BLOCK_FRAGMENT) + (r % COPY_BLOCK_FRAGMENT ? 1 : 0); + used += t; + bg_task_ticks_used(h, used); + + + /* + * Notify main thread only once per second at most, or when the file + * is completely copied. + * + * This is only for the benefit of the GUI. + */ + + if G_UNLIKELY(md->copied == md->size) { + teq_safe_rpc(THREAD_MAIN, move_progress, md); return BGR_DONE; + } + + if (delta_time(tm_time(), md->last_notify) >= 1) { + teq_safe_rpc(THREAD_MAIN, move_progress, md); + md->last_notify = tm_time(); + } /* * If we still have unused ticks, repeat. @@ -443,35 +573,144 @@ * Enqueue completed download file for verification. */ void -move_queue(struct download *d, const char *dest, const char *ext) +move_queue(download_t *d, const char *dest, const char *ext) { struct work *we; - we = we_alloc(d, dest, ext); + we = move_we_alloc(d, dest, ext); bg_daemon_enqueue(move_daemon, we); } /** + * Signal handler to terminate the moving thread. + */ +static void +move_thread_terminate(int sig) +{ + g_assert(TSIG_TERM == sig); + + if (GNET_PROPERTY(move_debug)) + g_debug("terminating moving thread"); + + move_thread_id = THREAD_INVALID_ID; +} + +/** + * Is there pending work for the library thread, or is thread terminated? + */ +static bool +move_thread_has_work(void *unused_arg) +{ + (void) unused_arg; + + return atomic_bool_get(&move_work_available) || + THREAD_INVALID_ID == move_thread_id; +} + +struct move_thread_args { + barrier_t *b; + bgsched_t *bs; +}; + +/** + * Moving thread main loop. + */ +static void * +move_thread_main(void *arg) +{ + struct move_thread_args *v = arg; + bgsched_t *bs; + barrier_t *b; + + thread_set_name("moving"); + teq_create(); /* Queue to receive TEQ events */ + thread_signal(TSIG_TERM, move_thread_terminate); + bs = v->bs; /* Copy since ``arg'' is on creator's stack */ + b = v->b; + + barrier_wait(b); /* Thread has initialized */ + barrier_free_null(&b); + + if (GNET_PROPERTY(move_debug)) + g_debug("moving thread started"); + + /* + * Process work until we're told to exit. + */ + + while (move_thread_id != THREAD_INVALID_ID) { + if (GNET_PROPERTY(move_debug)) + g_debug("moving thread sleeping"); + + teq_wait(move_thread_has_work, NULL); + + if (THREAD_INVALID_ID == move_thread_id) + break; /* Terminated by signal */ + + if (GNET_PROPERTY(move_debug)) + g_debug("moving thread awoken"); + + while (0 != bg_sched_run(bs)) + thread_check_suspended(); + } + + bg_sched_destroy_null(&bs); + + g_debug("moving thread exiting"); + return NULL; +} + +/** * Initializes the background moving/copying task. */ -G_GNUC_COLD void +void G_COLD move_init(void) { struct moved *md; - bgstep_cb_t step = d_step_copy; + bgstep_cb_t step = move_d_step_copy; + struct move_thread_args args; + barrier_t *b; + int r; - WALLOC(md); + WALLOC0(md); md->magic = MOVED_MAGIC; md->rd = NULL; md->wd = -1; - md->buffer = halloc(COPY_BUF_SIZE); md->target = NULL; - move_daemon = bg_daemon_create("file moving", + /* + * The internal copy buffer is only required when we lack sendfile(). + */ + +#ifndef HAS_SENDFILE + md->buffer = halloc(COPY_BUF_SIZE); +#endif + + /* + * Because the file moving operation is I/O intensive and not CPU + * intensive, we always create a dedicated thread to perform the + * move, regardless of the amount of available CPUs. + */ + + b = barrier_new(2); + args.b = barrier_refcnt_inc(b); + args.bs = bg_sched_create("moving", 1000000 /* 1 s */); + + r = thread_create(move_thread_main, &args, + THREAD_F_DETACH | THREAD_F_NO_CANCEL | + THREAD_F_NO_POOL | THREAD_F_PANIC, + THREAD_STACK_MIN); + + move_thread_id = r; + + move_daemon = bg_daemon_create(args.bs, "file moving", &step, 1, - md, d_free, - d_start, d_end, we_free, - d_notify); + md, move_d_free, + move_d_start, move_d_end, move_we_free, + move_d_notify); + + barrier_wait(b); /* Wait for thread to initialize */ + barrier_free_null(&b); } /** @@ -481,6 +720,7 @@ move_close(void) { bg_task_cancel(move_daemon); + thread_kill(move_thread_id, TSIG_TERM); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/mq.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/mq.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2014 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,7 +28,7 @@ * Message queues, common code between TCP and UDP sending stacks. * * @author Raphael Manfredi - * @date 2002-2003 + * @date 2002-2003, 2014 */ #include "common.h" @@ -40,12 +40,17 @@ #include "gmsg.h" #include "gnet_stats.h" +#include "lib/array_util.h" #include "lib/cq.h" -#include "lib/glib-missing.h" /* For gm_snprintf() */ #include "lib/halloc.h" +#include "lib/htable.h" +#include "lib/plist.h" #include "lib/pmsg.h" +#include "lib/str.h" +#include "lib/stringify.h" /* For plural() */ #include "lib/unsigned.h" /* For size_saturate_add() */ #include "lib/walloc.h" +#include "lib/xsort_data.h" #include "if/gnet_property_priv.h" @@ -55,9 +60,9 @@ static void qlink_free(mqueue_t *q); static void mq_update_flowc(mqueue_t *q); -static gboolean make_room_header( - mqueue_t *q, char *header, guint prio, int needed, int *offset); -static void mq_swift_timer(cqueue_t *cq, gpointer obj); +static bool make_room_header( + mqueue_t *q, const char *header, uint prio, int needed, int *offset); +static void mq_swift_timer(cqueue_t *cq, void *obj); /** * @return queue's fullness status. @@ -65,8 +70,7 @@ mq_status_t mq_status(const mqueue_t *q) { - g_assert(q != NULL); - g_assert(MQ_MAGIC == q->magic); + mq_check_consistency(q); if (0 == q->count) return MQ_S_EMPTY; @@ -80,92 +84,106 @@ return (q->size > q->lowat) ? MQ_S_WARNZONE : MQ_S_DELAY; } -guint32 mq_debug(const mqueue_t *q) +uint32 mq_debug(const mqueue_t *q) { + mq_check_consistency(q); return *q->debug; } -gboolean +bool mq_is_flow_controlled(const mqueue_t *q) { + mq_check_consistency(q); return 0 != (q->flags & MQ_FLOWC); } -gboolean +bool mq_is_swift_controlled(const mqueue_t *q) { + mq_check_consistency(q); return 0 != (q->flags & MQ_SWIFT); } int mq_maxsize(const mqueue_t *q) { + mq_check_consistency(q); return q->maxsize; } int mq_size(const mqueue_t *q) { + mq_check_consistency(q); return q->size; } int mq_lowat(const mqueue_t *q) { + mq_check_consistency(q); return q->lowat; } int mq_hiwat(const mqueue_t *q) { + mq_check_consistency(q); return q->hiwat; } int mq_count(const mqueue_t *q) { + mq_check_consistency(q); return q->count; } int mq_pending(const mqueue_t *q) { + mq_check_consistency(q); return q->size + tx_pending(q->tx_drv); } int mq_tx_pending(const mqueue_t *q) { + mq_check_consistency(q); return tx_pending(q->tx_drv); } struct bio_source * mq_bio(const mqueue_t *q) { + mq_check_consistency(q); return tx_bio_source(q->tx_drv); } -struct gnutella_node * +gnutella_node_t * mq_node(const mqueue_t *q) { + mq_check_consistency(q); return q->node; } /** * Would `additional' bytes of traffic cause the queue to enter flow-control? */ -gboolean +bool mq_would_flow_control(const mqueue_t *q, size_t additional) { + mq_check_consistency(q); return size_saturate_add(q->size, additional) >= UNSIGNED(q->hiwat); } /** * Are we already at or above the low watermark? */ -gboolean +bool mq_above_low_watermark(const mqueue_t *q) { + mq_check_consistency(q); return q->size >= q->lowat; } @@ -178,12 +196,12 @@ static char buf160; if (q->magic != MQ_MAGIC) { - gm_snprintf(buf, sizeof(buf), + str_bprintf(buf, sizeof(buf), "queue %p INVALID (bad magic)", (void *) q); } else { - gboolean udp = NODE_IS_UDP(q->node); + bool udp = NODE_USES_UDP(q->node); - gm_snprintf(buf, sizeof(buf), + str_bprintf(buf, sizeof(buf), "queue %p %s %s node %s%s%s%s%s (%d item%s, %d byte%s)", (void *) q, udp ? "UDP" : "TCP", NODE_IS_ULTRA(q->node) ? "ultra" : @@ -192,8 +210,8 @@ (q->flags & MQ_DISCARD) ? " DISCARD" : "", (q->flags & MQ_SWIFT) ? " SWIFT" : "", (q->flags & MQ_WARNZONE) ? " WARNZONE" : "", - q->count, q->count == 1 ? "" : "s", - q->size, q->size == 1 ? "" : "s" + q->count, plural(q->count), + q->size, plural(q->size) ); } @@ -204,26 +222,26 @@ /* * This hashtable tracks the queue owning a given glist linkable. */ -static GHashTable *qown = NULL; +static htable_t *qown = NULL; /** * Add linkable into queue */ static void -mq_add_linkable(mqueue_t *q, GList *l) +mq_add_linkable(mqueue_t *q, plist_t *l) { mqueue_t *owner; g_assert(q->magic == MQ_MAGIC); g_assert(l != NULL); g_assert(l->data != NULL); - + if (qown == NULL) - qown = NOT_LEAKING(g_hash_table_new(pointer_hash_func, NULL)); + qown = NOT_LEAKING(htable_create(HASH_KEY_SELF, 0)); - owner = g_hash_table_lookup(qown, l); + owner = htable_lookup(qown, l); if (owner) { - g_carp("BUG: added linkable %p already owned by %s%s", + g_critical("BUG: added linkable %p already owned by %s%s", (void *) l, owner == q ? "ourselves" : "other", mq_info(owner)); if (owner != q) g_warning("BUG: will make linkable %p belong to %s", @@ -231,14 +249,14 @@ g_assert_not_reached(); } - g_hash_table_insert(qown, l, q); + htable_insert(qown, l, q); } /** * Remove linkable from queue */ static void -mq_remove_linkable(mqueue_t *q, GList *l) +mq_remove_linkable(mqueue_t *q, plist_t *l) { mqueue_t *owner; @@ -246,7 +264,7 @@ g_assert(l != NULL); g_assert(qown != NULL); /* Must have added something before */ - owner = g_hash_table_lookup(qown, l); + owner = htable_lookup(qown, l); if (owner == NULL) g_error("BUG: removed linkable %p from %s belongs to no queue!", @@ -255,7 +273,7 @@ g_error("BUG: removed linkable %p from %s is from another queue!", (void *) l, mq_info(q)); else - g_hash_table_remove(qown, l); + htable_remove(qown, l); } /** @@ -271,12 +289,12 @@ g_assert(q); if (qown == NULL) - qown = NOT_LEAKING(g_hash_table_new(pointer_hash_func, NULL)); + qown = NOT_LEAKING(htable_create(HASH_KEY_SELF, 0)); if (q->magic != MQ_MAGIC) g_error("BUG: %s at %s:%d", mq_info(q), where, line); - qcount = g_list_length(q->qhead); + qcount = plist_length(q->qhead); if (qcount != q->count) g_error("BUG: " "%s has wrong q->count of %d (counted %d in list) at %s:%d", @@ -286,7 +304,7 @@ return; for (n = 0; n < q->qlink_count; n++) { - GList *item = q->qlinkn; + plist_t *item = q->qlinkn; mqueue_t *owner; if (item == NULL) @@ -299,7 +317,7 @@ g_assert(qown); /* If we have a qlink, we have added items */ - owner = g_hash_table_lookup(qown, item); + owner = htable_lookup(qown, item); if (owner != q) g_error("BUG: linkable #%d/%d from %s " "%s at %s:%d", @@ -338,12 +356,14 @@ void mq_free(mqueue_t *q) { - GList *l; + plist_t *l; int n; + mq_check_consistency(q); + tx_free(q->tx_drv); /* Get rid of lower layers */ - for (n = 0, l = q->qhead; l; l = g_list_next(l)) { + for (n = 0, l = q->qhead; l; l = plist_next(l)) { n++; pmsg_free(l->data); l->data = NULL; @@ -356,11 +376,11 @@ qlink_free(q); cq_cancel(&q->swift_ev); - gm_list_free_null(&q->qhead); + plist_free_null(&q->qhead); pmsg_slist_free(&q->qwait); q->magic = 0; - wfree(q, sizeof(*q)); + WFREE(q); } /** @@ -370,13 +390,13 @@ * The underlying message is freed and the size information on the * queue is updated, but not the flow-control information. */ -static GList * -mq_rmlink_prev(mqueue_t *q, GList *l, int size) +static plist_t * +mq_rmlink_prev(mqueue_t *q, plist_t *l, int size) { - GList *prev = g_list_previous(l); + plist_t *prev = plist_prev(l); mq_remove_linkable(q, l); - q->qhead = g_list_remove_link(q->qhead, l); + q->qhead = plist_remove_link(q->qhead, l); if (q->qtail == l) q->qtail = prev; @@ -387,7 +407,7 @@ pmsg_free(l->data); l->data = NULL; - g_list_free_1(l); + plist_free_1(l); return prev; } @@ -396,7 +416,7 @@ * A "swift" checkpoint was reached. */ static void -mq_swift_checkpoint(mqueue_t *q, gboolean initial) +mq_swift_checkpoint(mqueue_t *q, bool initial) { int elapsed = q->swift_elapsed; /* Elapsed since we were scheduled */ int target_to_lowmark; @@ -471,69 +491,31 @@ needed = extra + flushed_till_next_timer / 4; } - if (initial) { - /* - * First time we're in "swift" mode. - * - * Purge pending queries, since they are getting quite old. - * Leave our queries in for now (they have hops=0). - */ - - gnutella_header_set_function(&q->header, GTA_MSG_SEARCH); - gnutella_header_set_hops(&q->header, 1); - gnutella_header_set_ttl(&q->header, GNET_PROPERTY(max_ttl)); - - if (needed > 0) - make_room_header(q, (char*) &q->header, PMSG_P_DATA, needed, NULL); - - /* - * Whether or not we were able to make enough room at this point - * is not important, for the initial checkpoint. Indeed, since - * we are now in "swift" mode, more query messages will be dropped - * at the next iteration, since we'll start dropping query hits, - * and hits are more prioritary than queries. - */ - - } else { - int ttl; - - /* - * We're going to drop query hits... - * - * We start with the lowest prioritary query hit: low hops count - * and high TTL, and we progressively increase until we can drop - * the amount we need to drop. - * - * Note that we will never be able to drop the partially written - * message at the tail of the queue, even if it is less prioritary - * than our comparison point. - */ - - gnutella_header_set_function(&q->header, GTA_MSG_SEARCH_RESULTS); - - /* - * Loop until we reach hops=hard_ttl_limit or we have finished - * removing enough data from the queue. - */ - - for (ttl = GNET_PROPERTY(hard_ttl_limit); ttl >= 0; ttl--) { - int old_size; + /* + * To cut the dependency between MQ and the messages being held within, + * things are decoupled thusly: + * + * The MQ requests, via a user-supplied callback, a vector of message + * templates. For instance for Gnutella messages. these are just Gnutella + * headers. + * + * These headers are used in turn to request message pruning from the + * queue by comparing messages held in the queue with these headers, + * using the user-supplied ``msg_headcmp'' comparison callback. + */ - if (needed <= 0) - break; + if (q->uops->msg_templates != NULL) { + size_t i, tcnt = 0; + iovec_t *templates = q->uops->msg_templates(initial, &tcnt); - old_size = q->size; - gnutella_header_set_hops(&q->header, - GNET_PROPERTY(hard_ttl_limit) - ttl); - gnutella_header_set_ttl(&q->header, ttl); + for (i = 0; i < tcnt && needed > 0; i++) { + int old_size = q->size; + const void *base = iovec_base(&templatesi); - if ( - make_room_header(q, (char*) &q->header, PMSG_P_DATA, - needed, NULL) - ) + if (make_room_header(q, base, PMSG_P_DATA, needed, NULL)) break; - needed -= (old_size - q->size); /* Amount we removed */ + needed -= old_size - q->size; /* Amount we removed */ } } @@ -558,13 +540,13 @@ * Callout queue callback: periodic "swift" mode timer. */ static void -mq_swift_timer(cqueue_t *unused_cq, gpointer obj) +mq_swift_timer(cqueue_t *cq, void *obj) { mqueue_t *q = obj; - (void) unused_cq; g_assert((q->flags & (MQ_FLOWC|MQ_SWIFT)) == (MQ_FLOWC|MQ_SWIFT)); + cq_zero(cq, &q->swift_ev); mq_swift_checkpoint(q, FALSE); } @@ -572,15 +554,15 @@ * Callout queue callback invoked when the queue must enter "swift" mode. */ static void -mq_enter_swift(cqueue_t *unused_cq, gpointer obj) +mq_enter_swift(cqueue_t *cq, void *obj) { mqueue_t *q = obj; - (void) unused_cq; g_assert((q->flags & (MQ_FLOWC|MQ_SWIFT)) == MQ_FLOWC); q->flags |= MQ_SWIFT; + cq_zero(cq, &q->swift_ev); node_tx_swift_changed(q->node); mq_swift_checkpoint(q, TRUE); } @@ -672,7 +654,7 @@ void mq_clear(mqueue_t *q) { - g_assert(q); + mq_check_consistency(q); if (q->count == 0) return; /* Queue is empty */ @@ -687,7 +669,7 @@ q->flags |= MQ_CLEAR; while (q->qhead) { - GList *l = q->qhead; + plist_t *l = q->qhead; pmsg_t *mb = l->data; /* @@ -727,7 +709,7 @@ void mq_discard(mqueue_t *q) { - g_assert(q); + mq_check_consistency(q); q->flags |= MQ_DISCARD; } @@ -738,7 +720,7 @@ void mq_shutdown(mqueue_t *q) { - g_assert(q); + mq_check_consistency(q); tx_shutdown(q->tx_drv); /* No further output will be made */ } @@ -749,7 +731,7 @@ void mq_flush(mqueue_t *q) { - g_assert(q); + mq_check_consistency(q); tx_flush(q->tx_drv); } @@ -757,17 +739,18 @@ /** * Compare two pointers to links based on their relative priorities, then * based on their held Gnutella messages. - * -- qsort() callback + * -- qsort() callback but with an extra data parameter */ static int -qlink_cmp(const void *a, const void *b) +qlink_cmp(const void *a, const void *b, void *data) { - const GList * const *l1 = a, * const *l2 = b; + const plist_t * const *l1 = a, * const *l2 = b; const pmsg_t *m1 = (*l1)->data, *m2 = (*l2)->data; - if (pmsg_prio(m1) == pmsg_prio(m2)) - return gmsg_cmp(pmsg_start(m1), pmsg_start(m2), TRUE); - else + if (pmsg_prio(m1) == pmsg_prio(m2)) { + const mqueue_t *q = data; + return q->uops->msg_cmp(pmsg_start(m1), pmsg_start(m2)); + } else return pmsg_prio(m1) < pmsg_prio(m2) ? -1 : +1; } @@ -777,28 +760,29 @@ static void qlink_create(mqueue_t *q) { - GList *l; + plist_t *l; int n; g_assert(q->qlink == NULL); - q->qlink = halloc(q->count * sizeof q->qlink0); + HALLOC_ARRAY(q->qlink, q->count); /* * Prepare sorting of queued messages. * - * What's sorted is queue links, but the comparison factor is the - * gmsg_cmp() routine to compare the Gnutella messages. + * What's sorted is queue links, but the sorting criteria is the + * user-supplied msg_cmp routine to compare the messages, when they + * have the same priority. */ - for (l = q->qhead, n = 0; l && n < q->count; l = g_list_next(l), n++) { + for (l = q->qhead, n = 0; l && n < q->count; l = plist_next(l), n++) { g_assert(l->data != NULL); q->qlinkn = l; } if (l || n != q->count) - g_error("BUG: queue count of %d for %p is wrong (has %d)", - q->count, (void *) q, g_list_length(q->qhead)); + g_error("BUG: queue count of %d for %p is wrong (has %zd)", + q->count, (void *) q, plist_length(q->qhead)); /* * We use `n' and not `q->count' in case the warning above is emitted, @@ -806,7 +790,7 @@ */ q->qlink_count = n; - qsort(q->qlink, n, sizeof q->qlink0, qlink_cmp); + xsort_with_data(q->qlink, n, sizeof q->qlink0, qlink_cmp, q); mq_check(q, 0); } @@ -828,10 +812,10 @@ * before the position indicated by `hint'. */ static void -qlink_insert_before(mqueue_t *q, int hint, GList *l) +qlink_insert_before(mqueue_t *q, int hint, plist_t *l) { g_assert(hint >= 0 && hint < q->qlink_count); - g_assert(qlink_cmp(&q->qlinkhint, &l) >= 0); /* `hint' >= `l' */ + g_assert(qlink_cmp(&q->qlinkhint, &l, q) >= 0); /* `hint' >= `l' */ g_assert(l->data != NULL); mq_check(q, -1); @@ -850,28 +834,20 @@ */ q->qlink_count++; - q->qlink = hrealloc(q->qlink, q->qlink_count * sizeof q->qlink0); + HREALLOC_ARRAY(q->qlink, q->qlink_count); - { - int i; - - /* Shift right */ - for (i = q->qlink_count - 1; i > hint; i--) { - q->qlinki = q->qlinki - 1; - } - } - q->qlinkhint = l; + ARRAY_INSERT(q->qlink, hint, q->qlink_count, l); } /** * Insert linkable `l' within the sorted qlink array of linkables. */ static void -qlink_insert(mqueue_t *q, GList *l) +qlink_insert(mqueue_t *q, plist_t *l) { int low = 0; int high = q->qlink_count - 1; - GList **qlink = q->qlink; + plist_t **qlink = q->qlink; g_assert(l->data != NULL); @@ -884,7 +860,7 @@ if (high < 0) { g_assert(q->count == 1); /* `l' is already part of the queue */ q->qlink_count++; - q->qlink = hrealloc(q->qlink, q->qlink_count * sizeof q->qlink0); + HREALLOC_ARRAY(q->qlink, q->qlink_count); q->qlink0 = l; return; } @@ -893,7 +869,7 @@ * If lower than the beginning, insert at the head. */ - if (qlinklow != NULL && qlink_cmp(&l, &qlinklow) <= 0) { + if (qlinklow != NULL && qlink_cmp(&l, &qlinklow, q) <= 0) { qlink_insert_before(q, low, l); return; } @@ -902,9 +878,9 @@ * If higher than the tail, insert at the tail. */ - if (qlinkhigh != NULL && qlink_cmp(&l, &qlinkhigh) >= 0) { + if (qlinkhigh != NULL && qlink_cmp(&l, &qlinkhigh, q) >= 0) { q->qlink_count++; - q->qlink = hrealloc(q->qlink, q->qlink_count * sizeof q->qlink0); + HREALLOC_ARRAY(q->qlink, q->qlink_count); q->qlinkq->qlink_count - 1 = l; return; } @@ -978,12 +954,12 @@ return; } - if (qlink_cmp(&l, &qlinklowest_non_null) < 0) { + if (qlink_cmp(&l, &qlinklowest_non_null, q) < 0) { high = lowest_non_null - 1; continue; } - if (qlink_cmp(&l, &qlinkhighest_non_null) > 0) { + if (qlink_cmp(&l, &qlinkhighest_non_null, q) > 0) { low = highest_non_null + 1; continue; } @@ -1002,7 +978,7 @@ * Regular dichotomic case. */ - c = qlink_cmp(&qlinkmid, &l); + c = qlink_cmp(&qlinkmid, &l, q); if (c == 0) { qlink_insert_before(q, mid, l); @@ -1029,9 +1005,9 @@ * @param l the linkable to remove from the qlink indexer */ static void -qlink_remove(mqueue_t *q, GList *l) +qlink_remove(mqueue_t *q, plist_t *l) { - GList **qlink = q->qlink; + plist_t **qlink = q->qlink; int n = q->qlink_count; g_assert(qlink); @@ -1046,12 +1022,12 @@ */ if (n > q->count * 3) { - GList **dest = qlink; + plist_t **dest = qlink; int copied = 0; - gboolean found = FALSE; + bool found = FALSE; while (n-- > 0) { - GList *entry = *qlink++; + plist_t *entry = *qlink++; if (entry == NULL) continue; else if (l == entry) { @@ -1079,9 +1055,9 @@ } g_error("BUG: linkable %p for %s not found " - "(qlink has %d slots, queue has %d counted items, really %d) at %s:%d", + "(qlink has %d slots, queue has %d counted items, really %zd) at %s:%d", (void *) l, mq_info(q), - q->qlink_count, q->count, g_list_length(q->qhead), + q->qlink_count, q->count, plist_length(q->qhead), _WHERE_, __LINE__); } @@ -1103,13 +1079,12 @@ * * @returns TRUE if we were able to make enough room. */ -static gboolean +static bool make_room_internal(mqueue_t *q, - char *header, size_t msglen, guint prio, int needed, int *offset) + const char *header, size_t msglen, uint prio, int needed, int *offset) { int n; int dropped = 0; /* Amount of messages dropped */ - gboolean qlink_corrupted = FALSE; /* BUG catcher */ g_assert(needed > 0); mq_check(q, 0); @@ -1137,7 +1112,7 @@ * in the loop below). When we break out because we found a more * prioritary message, we remember the index in the array and return it * to the caller. If the message is finally inserted in the queue, - * we can insert its GList link right before that index. + * we can insert its plist_t link right before that index. * * This adds some complexity but it will avoid millions of calls to * qlink_cmp(), which is costly. @@ -1147,9 +1122,8 @@ * network, so we can NULLify the corresponding slot in the qlink array. */ -restart: for (n = 0; needed >= 0 && n < q->qlink_count; n++) { - GList *item = q->qlinkn; + plist_t *item = q->qlinkn; pmsg_t *cmb; char *cmb_start; int cmb_size; @@ -1161,32 +1135,6 @@ if (item == NULL) continue; - /* - * BUG catcher -- I've seen situations where item->data is NULL - * at this point, which means something is deeply corrupted... - * --RAM, 2006-07-14 - */ - - if (item->data == NULL) { - g_error("BUG: NULL data for qlink item #%d/%d in %s at %s:%d", - n, q->qlink_count, mq_info(q), _WHERE_, __LINE__); - - if (qlink_corrupted) { - g_error( - "BUG: trying to ignore still invalid qlink entry at %s:%d", - _WHERE_, __LINE__); - continue; - } - - qlink_corrupted = TRUE; /* Try to mend it */ - qlink_free(q); - qlink_create(q); - - g_error("BUG: recreated qlink and restarting at %s:%d", - _WHERE_, __LINE__); - goto restart; - } - cmb = item->data; cmb_start = pmsg_start(cmb); @@ -1207,10 +1155,18 @@ * (it's necessarily >= 0 if we're in the loop) */ - if (gmsg_cmp(cmb_start, header, msglen != 0) >= 0) { - if (offset != NULL) - *offset = n; - break; + if (0 == msglen) { + if (q->uops->msg_headcmp(cmb_start, header) >= 0) { + if (offset != NULL) + *offset = n; + break; + } + } else { + if (q->uops->msg_cmp(cmb_start, header) >= 0) { + if (offset != NULL) + *offset = n; + break; + } } /* @@ -1229,15 +1185,17 @@ * Drop message. */ - if (MQ_DEBUG_LVL(q) > 4) { - gmsg_log_dropped_pmsg(cmb, "to %s %s node %s, in favor of %s", + if (MQ_DEBUG_LVL(q) > 4 && q->uops->msg_log != NULL) { + q->uops->msg_log(cmb, "to %s %s node %s, in favor of %s", (q->flags & MQ_SWIFT) ? "SWIFT" : "FLOWC", - NODE_IS_UDP(q->node) ? "UDP" : "TCP", + NODE_USES_UDP(q->node) ? "UDP" : "TCP", node_addr(q->node), msglen ? gmsg_infostr_full(header, msglen) : gmsg_infostr(header)); } - gnet_stats_count_flowc(pmsg_start(cmb), FALSE); + if (q->uops->msg_flowc != NULL) + q->uops->msg_flowc(q->node, cmb); + cmb_size = pmsg_size(cmb); g_assert(q->qlinkn == item); @@ -1297,11 +1255,11 @@ * * @returns TRUE if we were able to make enough room. */ -static gboolean -make_room(mqueue_t *q, pmsg_t *mb, int needed, int *offset) +static bool +make_room(mqueue_t *q, const pmsg_t *mb, int needed, int *offset) { - char *header = pmsg_start(mb); - guint prio = pmsg_prio(mb); + const char *header = pmsg_start(mb); + uint prio = pmsg_prio(mb); size_t msglen = pmsg_written_size(mb); return make_room_internal(q, header, msglen, prio, needed, offset); @@ -1311,9 +1269,9 @@ * Same as make_room(), but we are not given a "pmsg_t" as a comparison * point but a Gnutella header and a message priority explicitly. */ -static gboolean +static bool make_room_header( - mqueue_t *q, char *header, guint prio, int needed, int *offset) + mqueue_t *q, const char *header, uint prio, int needed, int *offset) { return make_room_internal(q, header, 0, prio, needed, offset); } @@ -1326,9 +1284,9 @@ { int needed; int qlink_offset = -1; - GList *new = NULL; - gboolean make_room_called = FALSE; - gboolean has_normal_prio = (pmsg_prio(mb) == PMSG_P_DATA); + plist_t *new = NULL; + bool make_room_called = FALSE; + bool has_normal_prio = (pmsg_prio(mb) == PMSG_P_DATA); mq_check(q, 0); @@ -1346,13 +1304,15 @@ !make_room(q, mb, msize, &qlink_offset) ) { g_assert(pmsg_is_unread(mb)); /* Not partially written */ - if (MQ_DEBUG_LVL(q) > 4) - gmsg_log_dropped_pmsg(mb, "to %s %s node %s, %d bytes queued", + if (MQ_DEBUG_LVL(q) > 4 && q->uops->msg_log != NULL) + q->uops->msg_log(mb, "to %s %s node %s, %d bytes queued", (q->flags & MQ_SWIFT) ? "SWIFT" : "FLOWC", - NODE_IS_UDP(q->node) ? "UDP" : "TCP", + NODE_USES_UDP(q->node) ? "UDP" : "TCP", node_addr(q->node), q->size); - gnet_stats_count_flowc(pmsg_start(mb), FALSE); + if (q->uops->msg_flowc != NULL) + q->uops->msg_flowc(q->node, mb); + pmsg_free(mb); node_inc_txdrop(q->node); /* Dropped during TX */ return; @@ -1382,24 +1342,26 @@ g_assert(pmsg_is_unread(mb)); /* Not partially written */ - gnet_stats_count_flowc(pmsg_start(mb), FALSE); + if (q->uops->msg_flowc != NULL) + q->uops->msg_flowc(q->node, mb); if (has_normal_prio) { - if (MQ_DEBUG_LVL(q) > 4) - gmsg_log_dropped_pmsg(mb, + if (MQ_DEBUG_LVL(q) > 4 && q->uops->msg_log != NULL) { + q->uops->msg_log(mb, "to %s %s node %s, %d bytes queued FULL", (q->flags & MQ_SWIFT) ? "SWIFT" : "FLOWC", - NODE_IS_UDP(q->node) ? "UDP" : "TCP", + NODE_USES_UDP(q->node) ? "UDP" : "TCP", node_addr(q->node), q->size); - + } node_inc_txdrop(q->node); /* Dropped during TX */ } else { - if (MQ_DEBUG_LVL(q) > 0) - gmsg_log_dropped_pmsg(mb, + if (MQ_DEBUG_LVL(q) > 0 && q->uops->msg_log != NULL) { + q->uops->msg_log(mb, "to %s %s node %s, %d bytes queued KILLING", (q->flags & MQ_SWIFT) ? "SWIFT" : "FLOWC", - NODE_IS_UDP(q->node) ? "UDP" : "TCP", + NODE_USES_UDP(q->node) ? "UDP" : "TCP", node_addr(q->node), q->size); + } /* * Is the check for UDP the correct fix or just a @@ -1413,7 +1375,7 @@ * the parameter values). --RAM, 2006-12-29 */ - if (!NODE_IS_UDP(q->node)) { + if (!NODE_USES_UDP(q->node)) { node_bye(q->node, 502, "Send queue reached %d bytes", q->maxsize); } else { @@ -1440,15 +1402,15 @@ */ if (has_normal_prio) { - new = q->qhead = g_list_prepend(q->qhead, mb); + new = q->qhead = plist_prepend(q->qhead, mb); if (q->qtail == NULL) q->qtail = q->qhead; } else { - GList *l; - guint prio = pmsg_prio(mb); - gboolean inserted = FALSE; + plist_t *l; + uint prio = pmsg_prio(mb); + bool inserted = FALSE; - for (l = q->qtail; l; l = g_list_previous(l)) { + for (l = q->qtail; l; l = plist_prev(l)) { pmsg_t *m = l->data; if ( @@ -1460,8 +1422,8 @@ * we are, then leave the loop. */ - q->qhead = gm_list_insert_after(q->qhead, l, mb); - new = g_list_next(l); + q->qhead = plist_insert_after(q->qhead, l, mb); + new = plist_next(l); if (l == q->qtail) /* Inserted at tail */ q->qtail = new; /* New tail */ @@ -1479,7 +1441,7 @@ if (!inserted) { g_assert(l == NULL); - new = q->qhead = g_list_prepend(q->qhead, mb); + new = q->qhead = plist_prepend(q->qhead, mb); if (q->qtail == NULL) q->qtail = q->qhead; } @@ -1527,6 +1489,7 @@ void mq_putq(mqueue_t *q, pmsg_t *mb) { + mq_check_consistency(q); MQ_PUTQ(q, mb); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/mq.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/mq.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2014 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,7 +28,7 @@ * Message queues. * * @author Raphael Manfredi - * @date 2002-2003 + * @date 2002-2003, 2014 */ #ifndef _core_mq_h_ @@ -42,25 +42,63 @@ #include "if/core/mq.h" #include "lib/cq.h" +#include "lib/plist.h" #include "lib/pmsg.h" #include "lib/slist.h" typedef struct mqueue mqueue_t; +struct mq_ops; + /** - * Operations defined on all mq types. + * When invoked from the message queue, this callback must return a vector + * of "message headers" that are going to be compared against when the queue + * is in "swift mode" to determine which messages to prune. + * + * The messages need not be full message, but must be long enough to allow + * the ``msg_headcmp'' callback to compare two messages against each other. + * + * These messages being templates, they are expected to be generated once only + * and then the same vector can be returned. This is why there is no provision + * for a free routine. + * + * @param initial whether queue is just entering swift mode + * @param vcnt where the amount of entries in the vector is written + * + * @return the base of the vector of messages, NULL if none. */ +typedef iovec_t *(*mq_msgtmp_t)(bool initial, size_t *vcnt); -struct mq_ops { - void (*putq)(mqueue_t *q, pmsg_t *mb); - gboolean (*flushed)(const mqueue_t *q); -}; +/** + * Traffic accounting callback, invoked each time a message has been sent + * by the message queue or flow-controlled. + * + * @param node the node to which message is sent + * @param mb the full message being accounted for + */ +typedef void (*mq_msgcount_t)(void *node, const pmsg_t *mb); -struct mq_cops { - void (*puthere)(mqueue_t *q, pmsg_t *mb, int msize); - void (*qlink_remove)(mqueue_t *q, GList *l); - GList *(*rmlink_prev)(mqueue_t *q, GList *l, int size); - void (*update_flowc)(mqueue_t *q); +/** + * Logging regarding a particular message. + * + * @param mb the message being logged + * @param fmt formatting string, followed by arguments to format + */ +typedef void (*mq_msglog_t)(const pmsg_t *mb, const char *fmt, ...) + G_PRINTF(2, 3); + +/** + * User-supplied parameters, which are callbacks necessary for the message + * queue operations but which are dependent on the messages being enqueued. + */ +struct mq_uops { + cmp_fn_t msg_cmp; /**< Message (priority) comparison routine */ + cmp_fn_t msg_headcmp; /**< Only compare message "headers" */ + mq_msgtmp_t msg_templates; /**< Get message templates for "swift" mode */ + mq_msgcount_t msg_sent; /**< Message sent */ + mq_msgcount_t msg_flowc; /**< Message dropped by flow-control */ + mq_msgcount_t msg_queued; /**< Message queued */ + mq_msglog_t msg_log; /**< Message logging for dropped messages */ }; #ifdef MQ_INTERNAL @@ -70,6 +108,22 @@ * implementing the message queue. */ +/** + * Operations defined on all mq types. + */ + +struct mq_ops { + void (*putq)(mqueue_t *q, pmsg_t *mb); + bool (*flushed)(const mqueue_t *q); +}; + +struct mq_cops { + void (*puthere)(mqueue_t *q, pmsg_t *mb, int msize); + void (*qlink_remove)(mqueue_t *q, plist_t *l); + plist_t *(*rmlink_prev)(mqueue_t *q, plist_t *l, int size); + void (*update_flowc)(mqueue_t *q); +}; + enum mq_magic { MQ_MAGIC = 0x33990ee }; @@ -78,7 +132,7 @@ * A message queue. * * The queue itself is a two-way list, whose head is kept in `qhead' and the - * tail in `qtail', since a GList does not keep that information and we + * tail in `qtail', since a plist_t does not keep that information and we * don't want to traverse the list each time. Manual bookkeeping required. * * Flow control is triggered when the size reaches the high watermark, @@ -94,15 +148,15 @@ */ struct mqueue { enum mq_magic magic; /**< Magic number */ - gnutella_header_t header; /**< Comparison point during flow control */ struct gnutella_node *node; /**< Node to which this queue belongs */ const struct mq_ops *ops; /**< Polymorphic operations */ const struct mq_cops *cops; /**< Common operations */ + const struct mq_uops *uops; /**< User-defined operations */ txdrv_t *tx_drv; /**< Network TX stack driver */ - GList *qhead, *qtail, **qlink; + plist_t *qhead, *qtail, **qlink; slist_t *qwait; /**< Waiting queue during putq recursions */ cevent_t *swift_ev; /**< Callout queue event in "swift" mode */ - const guint32 *debug; /**< Debug config variable for this queue */ + const uint32 *debug; /**< Debug config variable for this queue */ int swift_elapsed; /**< Scheduled elapsed time, in ms */ int qlink_count; /**< Amount of entries in `qlink' */ int maxsize; /**< Maximum size of this queue (total queued) */ @@ -117,6 +171,13 @@ int putq_entered; /**< For recursion checks in mq_putq() */ }; +static inline void +mq_check_consistency(const struct mqueue * const q) +{ + g_assert(q != NULL); + g_assert(MQ_MAGIC == q->magic); +} + /* * Queue flags. */ @@ -147,21 +208,21 @@ #endif /* MQ_INTERNAL */ -mq_status_t mq_status(const mqueue_t *q) G_GNUC_PURE; -gboolean mq_is_flow_controlled(const mqueue_t *q) G_GNUC_PURE; -gboolean mq_is_swift_controlled(const mqueue_t *q) G_GNUC_PURE; -gboolean mq_would_flow_control(const mqueue_t *q, size_t) G_GNUC_PURE; -gboolean mq_above_low_watermark(const mqueue_t *q) G_GNUC_PURE; -guint32 mq_debug(const mqueue_t *q) G_GNUC_PURE; -int mq_maxsize(const mqueue_t *q) G_GNUC_PURE; -int mq_size(const mqueue_t *q) G_GNUC_PURE; -int mq_lowat(const mqueue_t *q) G_GNUC_PURE; -int mq_hiwat(const mqueue_t *q) G_GNUC_PURE; -int mq_count(const mqueue_t *q) G_GNUC_PURE; +mq_status_t mq_status(const mqueue_t *q) G_PURE; +bool mq_is_flow_controlled(const mqueue_t *q) G_PURE; +bool mq_is_swift_controlled(const mqueue_t *q) G_PURE; +bool mq_would_flow_control(const mqueue_t *q, size_t) G_PURE; +bool mq_above_low_watermark(const mqueue_t *q) G_PURE; +uint32 mq_debug(const mqueue_t *q) G_PURE; +int mq_maxsize(const mqueue_t *q) G_PURE; +int mq_size(const mqueue_t *q) G_PURE; +int mq_lowat(const mqueue_t *q) G_PURE; +int mq_hiwat(const mqueue_t *q) G_PURE; +int mq_count(const mqueue_t *q) G_PURE; int mq_pending(const mqueue_t *q); int mq_tx_pending(const mqueue_t *q); struct bio_source *mq_bio(const mqueue_t *q); -struct gnutella_node *mq_node(const mqueue_t *q) G_GNUC_PURE; +struct gnutella_node *mq_node(const mqueue_t *q) G_PURE; /* * Public interface @@ -175,7 +236,7 @@ void mq_shutdown(mqueue_t *q); void mq_fill_ops(struct mq_ops *ops); -const struct mq_cops *mq_get_cops(void) G_GNUC_CONST; +const struct mq_cops *mq_get_cops(void) G_CONST; const char *mq_info(const mqueue_t *q); #endif /* _core_mq_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/mq_tcp.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/mq_tcp.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2014 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,7 +28,7 @@ * Message queues, writing to a TCP stack. * * @author Raphael Manfredi - * @date 2002-2003 + * @date 2002-2003, 2014 */ #include "common.h" @@ -43,6 +43,7 @@ #include "gnet_stats.h" #include "dump.h" +#include "lib/plist.h" #include "lib/pmsg.h" #include "lib/walloc.h" @@ -55,18 +56,29 @@ #define MQ_MINIOV 2 /**< Minimum amount of I/O vectors in service */ #define MQ_MINSEND 256 /**< Minimum size we try to send */ -static void mq_tcp_service(gpointer data); +static void mq_tcp_service(void *data); static const struct mq_ops mq_tcp_ops; /** * Create new message queue capable of holding `maxsize' bytes, and * owned by the supplied node. + * + * @param maxsize the overall sum of message size that can be held + * @param n the network node to which the message queue is attached + * @oaram nd the top of the TX stack to use to send out messages + * @param uops user-defined operations */ mqueue_t * -mq_tcp_make(int maxsize, struct gnutella_node *n, struct txdriver *nd) +mq_tcp_make(int maxsize, + gnutella_node_t *n, struct txdriver *nd, const struct mq_uops *uops) { mqueue_t *q; + node_check(n); + tx_check(nd); + g_assert(uops != NULL); + g_assert(maxsize > 0); + WALLOC0(q); q->magic = MQ_MAGIC; q->node = n; @@ -77,6 +89,7 @@ q->qwait = slist_new(); q->ops = &mq_tcp_ops; q->cops = mq_get_cops(); + q->uops = uops; q->debug = GNET_PROPERTY_PTR(mq_tcp_debug); tx_srv_register(nd, mq_tcp_service, q); @@ -88,7 +101,7 @@ * Service routine for TCP message queue. */ static void -mq_tcp_service(gpointer data) +mq_tcp_service(void *data) { mqueue_t *q = (mqueue_t *) data; static iovec_t iovMQ_MAXIOV; @@ -96,11 +109,11 @@ int iovcnt; int sent; ssize_t r; - GList *l; + plist_t *l; int dropped; int maxsize; - gboolean saturated; - gboolean has_prioritary = FALSE; + bool saturated; + bool has_prioritary = FALSE; again: mq_check(q, 0); @@ -125,7 +138,6 @@ for (l = q->qtail; l && iovsize > 0; /* empty */) { iovec_t *ie; pmsg_t *mb = (pmsg_t *) l->data; - char *mbs = pmsg_start(mb); /* * Don't build too much. @@ -140,16 +152,16 @@ if (pmsg_check(mb, q)) { /* send the message */ - l = g_list_previous(l); + l = plist_prev(l); iovsize--; ie = &ioviovcnt++; - iovec_set_base(ie, deconstify_gpointer(mb->m_rptr)); - iovec_set_len(ie, pmsg_size(mb)); + iovec_set(ie, deconstify_pointer(mb->m_rptr), pmsg_size(mb)); maxsize -= iovec_len(ie); if (pmsg_prio(mb)) has_prioritary = TRUE; } else { - gnet_stats_count_flowc(mbs, FALSE); /* Done before message freed */ + if (q->uops->msg_flowc != NULL) + q->uops->msg_flowc(q->node, mb); /* Done before msg freed */ if (q->qlink) q->cops->qlink_remove(q, l); @@ -178,7 +190,9 @@ r = tx_writev(q->tx_drv, iov, iovcnt); - g_assert((ssize_t) -1 == r || !tx_has_error(q->tx_drv)); + g_assert_log((ssize_t) -1 == r || !tx_has_error(q->tx_drv), + "%s(): written=%zd, yet error is reported by TX layer \"%s\"", + G_STRFUNC, r, tx_error_layer_name(q->tx_drv)); if ((ssize_t) -1 == r || r == 0) { q->last_written = 0; @@ -212,22 +226,11 @@ iovec_t *ie = &ioviovcnt++; pmsg_t *mb = (pmsg_t *) l->data; - if ((guint) r >= iovec_len(ie)) { /* Completely written */ - char *mb_start = pmsg_start(mb); - guint8 function = gmsg_function(mb_start); + if ((uint) r >= iovec_len(ie)) { /* Completely written */ sent++; pmsg_mark_sent(mb); - gnet_stats_count_sent(q->node, function, mb_start, pmsg_size(mb)); - switch (function) { - case GTA_MSG_SEARCH: - node_inc_tx_query(q->node); - break; - case GTA_MSG_SEARCH_RESULTS: - node_inc_tx_qhit(q->node); - break; - default: - break; - } + if (q->uops->msg_sent != NULL) + q->uops->msg_sent(q->node, mb); r -= iovec_len(ie); if (q->qlink) q->cops->qlink_remove(q, l); @@ -296,18 +299,19 @@ * @param from for TX traffic dump: the origin of message, NULL if local */ void -mq_tcp_putq(mqueue_t *q, pmsg_t *mb, const struct gnutella_node *from) +mq_tcp_putq(mqueue_t *q, pmsg_t *mb, const gnutella_node_t *from) { int size; /* Message size */ char *mbs; /* Start of message */ - guint8 function; /* Gnutella message function */ - gboolean prioritary; /* Is message prioritary? */ - gboolean error = FALSE; + bool prioritary; /* Is message prioritary? */ + bool error = FALSE; + + mq_check_consistency(q); dump_tx_tcp_packet(from, q->node, mb); again: - g_assert(q); + mq_check_consistency(q); g_assert(!pmsg_was_sent(mb)); g_assert(pmsg_is_unread(mb)); g_assert(q->ops == &mq_tcp_ops); /* Is a TCP queue */ @@ -350,12 +354,12 @@ } q->putq_entered++; - + mbs = pmsg_start(mb); - function = gmsg_function(mbs); prioritary = pmsg_prio(mb) != PMSG_P_DATA; - gnet_stats_count_queued(q->node, function, mbs, size); + if (q->uops->msg_queued != NULL) + q->uops->msg_queued(q->node, mb); /* * If queue is empty, attempt a write immediatly. @@ -376,7 +380,9 @@ * reports data written and not -1. * --RAM, 2006-12-29 */ - g_assert((ssize_t) -1 == written || !tx_has_error(q->tx_drv)); + g_assert_log((ssize_t) -1 == written || !tx_has_error(q->tx_drv), + "%s(): written=%zd, yet error reported by TX layer \"%s\"", + G_STRFUNC, written, tx_error_layer_name(q->tx_drv)); if ((ssize_t) -1 == written) { error = TRUE; @@ -391,7 +397,8 @@ } } } else { - gnet_stats_count_flowc(mbs, FALSE); + if (q->uops->msg_flowc != NULL) + q->uops->msg_flowc(q->node, mb); node_inc_txdrop(q->node); /* Dropped during TX */ written = -1; } @@ -403,18 +410,8 @@ if (written == size) { pmsg_mark_sent(mb); - node_inc_sent(q->node); - gnet_stats_count_sent(q->node, function, mbs, size); - switch (function) { - case GTA_MSG_SEARCH: - node_inc_tx_query(q->node); - break; - case GTA_MSG_SEARCH_RESULTS: - node_inc_tx_qhit(q->node); - break; - default: - break; - } + if (q->uops->msg_sent != NULL) + q->uops->msg_sent(q->node, mb); goto cleanup; } @@ -485,7 +482,7 @@ * Is the last enqueued message still unwritten, as opposed to having been * partially sent already? */ -static gboolean +static bool mq_tcp_flushed(const mqueue_t *q) { pmsg_t *mb;
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/mq_tcp.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/mq_tcp.h
Changed
@@ -40,10 +40,11 @@ #include "lib/pmsg.h" struct txdriver; +struct gnutella_node; void mq_tcp_putq(mqueue_t *q, pmsg_t *mb, const struct gnutella_node *from); mqueue_t *mq_tcp_make(int maxsize, - struct gnutella_node *n, struct txdriver *nd); + struct gnutella_node *n, struct txdriver *nd, const struct mq_uops *uops); #endif /* _core_mq_tcp_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/mq_udp.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/mq_udp.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2014 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,7 +28,7 @@ * Message queues, writing to a UDP stack. * * @author Raphael Manfredi - * @date 2002-2003 + * @date 2002-2003, 2014 */ #include "common.h" @@ -53,7 +53,7 @@ #include "lib/override.h" /* Must be the last header included */ -static void mq_udp_service(gpointer data); +static void mq_udp_service(void *data); static const struct mq_ops mq_udp_ops; /** @@ -72,14 +72,14 @@ gnet_host_t to; /**< Destination */ /* Original free routine info */ pmsg_free_t orig_free; - gpointer orig_arg; + void *orig_arg; }; /** * Free routine for plain metadata. */ static void -mq_udp_pmsg_free(pmsg_t *mb, gpointer arg) +mq_udp_pmsg_free(pmsg_t *mb, void *arg) { struct mq_udp_info *mi = arg; @@ -93,7 +93,7 @@ * on the original metadata. */ static void -mq_udp_pmsg_free_extended(pmsg_t *mb, gpointer arg) +mq_udp_pmsg_free_extended(pmsg_t *mb, void *arg) { struct mq_udp_info_extended *mi = arg; @@ -147,12 +147,23 @@ /** * Create new message queue capable of holding `maxsize' bytes, and * owned by the supplied node. + * + * @param maxsize the overall sum of message size that can be held + * @param n the network node to which the message queue is attached + * @oaram nd the top of the TX stack to use to send out messages + * @param uops user-defined operations */ mqueue_t * -mq_udp_make(int maxsize, struct gnutella_node *n, struct txdriver *nd) +mq_udp_make(int maxsize, + gnutella_node_t *n, struct txdriver *nd, const struct mq_uops *uops) { mqueue_t *q; + node_check(n); + tx_check(nd); + g_assert(uops != NULL); + g_assert(maxsize > 0); + WALLOC0(q); q->magic = MQ_MAGIC; @@ -164,6 +175,7 @@ q->qwait = slist_new(); q->ops = &mq_udp_ops; q->cops = mq_get_cops(); + q->uops = uops; q->debug = GNET_PROPERTY_PTR(mq_udp_debug); tx_srv_register(nd, mq_udp_service, q); @@ -175,37 +187,31 @@ * Service routine for UDP message queue. */ static void -mq_udp_service(gpointer data) +mq_udp_service(void *data) { mqueue_t *q = data; int r; - GList *l; - int sent; - int dropped; + plist_t *l; + unsigned dropped = 0; mq_check(q, 0); g_assert(q->count); /* Queue is serviced, we must have something */ - sent = 0; - dropped = 0; - /* * Write as much as possible. */ for (l = q->qtail; l; /* empty */) { pmsg_t *mb = l->data; - char *mb_start = pmsg_start(mb); int mb_size = pmsg_size(mb); struct mq_udp_info *mi = pmsg_get_metadata(mb); - guint8 function; if (!pmsg_check(mb, q)) { dropped++; goto skip; } - r = tx_sendto(q->tx_drv, &mi->to, mb_start, mb_size); + r = tx_sendto(q->tx_drv, mb, &mi->to); if (r < 0) /* Error, drop packet and continue */ goto skip; @@ -213,45 +219,33 @@ if (r == 0) /* No more bandwidth */ break; - if (r != mb_size) { - g_warning("partial UDP write (%d bytes) to %s for %d-byte datagram", - r, gnet_host_to_string(&mi->to), mb_size); - dropped++; - goto skip; - } + g_assert(r == mb_size); node_add_tx_given(q->node, r); if (q->flags & MQ_FLOWC) q->flowc_written += r; - function = gmsg_function(mb_start); - sent++; - pmsg_mark_sent(mb); - gnet_stats_count_sent(q->node, function, mb_start, mb_size); - switch (function) { - case GTA_MSG_SEARCH: - node_inc_tx_query(q->node); - break; - case GTA_MSG_SEARCH_RESULTS: - node_inc_tx_qhit(q->node); - break; - default: - break; - } + /* + * The UDP layer is non-reliable so the message could be dropped + * later on by lower layers. + * + * Therefore, message statistics will be updated by a specific + * accounting callback that is known to the datagram layer, such + * as node_msg_accounting(). + */ skip: if (q->qlink) q->cops->qlink_remove(q, l); + + /* drop the message from queue, will be freed by mq_rmlink_prev() */ l = q->cops->rmlink_prev(q, l, mb_size); } mq_check(q, 0); g_assert(q->size >= 0 && q->count >= 0); - if (sent) - node_add_sent(q->node, sent); - if (dropped) node_add_txdrop(q->node, dropped); /* Dropped during TX */ @@ -284,15 +278,15 @@ mq_udp_putq(mqueue_t *q, pmsg_t *mb, const gnet_host_t *to) { size_t size; - char *mbs; - guint8 function; pmsg_t *mbe = NULL; /* Extended message with destination info */ - gboolean error = FALSE; + bool error = FALSE; + + mq_check_consistency(q); dump_tx_udp_packet(to, mb); again: - g_assert(q); + mq_check_consistency(q); g_assert(mb); g_assert(!pmsg_was_sent(mb)); g_assert(pmsg_is_unread(mb)); @@ -345,10 +339,8 @@ } q->putq_entered++; - mbs = pmsg_start(mb); - function = gmsg_function(mbs); - - gnet_stats_count_queued(q->node, function, mbs, size); + if (q->uops->msg_queued != NULL) + q->uops->msg_queued(q->node, mb); /* * If queue is empty, attempt a write immediatly. @@ -358,9 +350,10 @@ ssize_t written; if (pmsg_check(mb, q)) { - written = tx_sendto(q->tx_drv, to, mbs, size); + written = tx_sendto(q->tx_drv, mb, to); } else { - gnet_stats_count_flowc(mbs, FALSE); + if (q->uops->msg_flowc != NULL) + q->uops->msg_flowc(q->node, mb); node_inc_txdrop(q->node); /* Dropped during TX */ written = (ssize_t) -1; } @@ -371,20 +364,6 @@ node_add_tx_given(q->node, written); if ((size_t) written == size) { - pmsg_mark_sent(mb); - node_inc_sent(q->node); - gnet_stats_count_sent(q->node, function, mbs, size); - switch (function) { - case GTA_MSG_SEARCH: - node_inc_tx_query(q->node); - break; - case GTA_MSG_SEARCH_RESULTS: - node_inc_tx_qhit(q->node); - break; - default: - break; - } - if (GNET_PROPERTY(mq_udp_debug) > 5) g_debug("MQ UDP sent %s", gmsg_infostr_full(pmsg_start(mb), pmsg_written_size(mb))); @@ -429,6 +408,8 @@ q->cops->puthere(q, mbe, size); mb = NULL; + /* FALL THROUGH */ + cleanup: if (mb) { @@ -484,6 +465,8 @@ { gnet_host_t to; + mq_check_consistency(q); + gnet_host_set(&to, n->addr, n->port); mq_udp_putq(q, mb, &to); } @@ -502,7 +485,7 @@ /** * Is the last enqueued message still unwritten? */ -static gboolean +static bool mq_udp_flushed(const mqueue_t *unused_q) { (void) unused_q;
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/mq_udp.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/mq_udp.h
Changed
@@ -44,9 +44,10 @@ */ struct txdriver; +struct gnutella_node; -mqueue_t *mq_udp_make( - int maxsize, struct gnutella_node *n, struct txdriver *nd); +mqueue_t *mq_udp_make(int maxsize, + struct gnutella_node *n, struct txdriver *nd, const struct mq_uops *uops); void mq_udp_putq(mqueue_t *q, pmsg_t *mb, const gnet_host_t *to); void mq_udp_node_putq(mqueue_t *q, pmsg_t *mb, const struct gnutella_node *n);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/namesize.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/namesize.c
Changed
@@ -36,20 +36,22 @@ #include "namesize.h" #include "lib/atoms.h" +#include "lib/hashing.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ /** * Hash a `namesize_t' key. */ -guint -namesize_hash(gconstpointer key) +uint +namesize_hash(const void *key) { const namesize_t *k = key; - guint32 hash; + uint32 hash; - hash = g_str_hash(k->name); - hash ^= k->size; + hash = string_mix_hash(k->name); + hash ^= integer_hash_fast(k->size); return hash; } @@ -58,7 +60,7 @@ * Compare two `namesize_t' keys. */ int -namesize_eq(gconstpointer a, gconstpointer b) +namesize_eq(const void *a, const void *b) { const namesize_t *ka = a, *kb = b;
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/namesize.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/namesize.h
Changed
@@ -41,7 +41,7 @@ */ typedef struct namesize { - const char *name; /**< Filename (atom) */ + const char *name; /**< Filename (atom) */ filesize_t size; /**< File size */ } namesize_t; @@ -49,8 +49,8 @@ * Public interface. */ -guint namesize_hash(gconstpointer key); -int namesize_eq(gconstpointer a, gconstpointer b); +uint namesize_hash(const void *key); +int namesize_eq(const void *a, const void *b); namesize_t *namesize_make(const char *name, filesize_t size); void namesize_free(namesize_t *ns);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/nodes.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/nodes.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2001-2010, Raphael Manfredi + * Copyright (c) 2001-2010, 2014 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,7 +28,7 @@ * Gnutella node management. * * @author Raphael Manfredi - * @date 2001-2010 + * @date 2001-2010, 2014 */ #include "common.h" @@ -38,6 +38,7 @@ #include "gtk-gnutella.h" #include "nodes.h" + #include "alive.h" #include "ban.h" #include "bh_upload.h" @@ -64,6 +65,7 @@ #include "mq.h" #include "mq_tcp.h" #include "mq_udp.h" +#include "oob_proxy.h" #include "pcache.h" #include "pdht.h" #include "pproxy.h" @@ -72,6 +74,7 @@ #include "rx.h" #include "rx_inflate.h" #include "rx_link.h" +#include "rx_ut.h" #include "rxbuf.h" #include "search.h" #include "settings.h" @@ -84,12 +87,19 @@ #include "tx_deflate.h" #include "tx_dgram.h" #include "tx_link.h" +#include "tx_ut.h" #include "udp.h" +#include "udp_reliable.h" +#include "udp_sched.h" #include "uploads.h" /* For handle_push_request() */ #include "version.h" #include "vmsg.h" #include "whitelist.h" +#include "g2/frame.h" +#include "g2/msg.h" +#include "g2/node.h" + #include "lib/adns.h" #include "lib/aging.h" #include "lib/ascii.h" @@ -98,22 +108,28 @@ #include "lib/cq.h" #include "lib/dbus_util.h" #include "lib/endian.h" +#include "lib/entropy.h" #include "lib/file.h" #include "lib/getdate.h" #include "lib/getline.h" -#include "lib/glib-missing.h" #include "lib/halloc.h" +#include "lib/hash.h" #include "lib/hashlist.h" #include "lib/header.h" +#include "lib/hikset.h" +#include "lib/hset.h" +#include "lib/htable.h" #include "lib/iovec.h" -#include "lib/log.h" /* For log_printable() */ #include "lib/listener.h" +#include "lib/log.h" /* For log_printable() */ #include "lib/nid.h" #include "lib/parse.h" #include "lib/pattern.h" #include "lib/pmsg.h" +#include "lib/pslist.h" #include "lib/random.h" #include "lib/sequence.h" +#include "lib/shuffle.h" #include "lib/str.h" #include "lib/stringify.h" #include "lib/strtok.h" @@ -122,6 +138,7 @@ #include "lib/unsigned.h" #include "lib/utf8.h" #include "lib/vmm.h" +#include "lib/vsort.h" #include "lib/walloc.h" #include "lib/wq.h" #include "lib/zlib_util.h" @@ -179,19 +196,28 @@ #define UDP_CRAWLER_FREQ 120 /**< once every 2 minutes */ #define NODE_FW_CHECK 1200 /**< 20 minutes */ +#define NODE_IPP_NEIGHBOURS 8U /**< # of neighbouring UPs to select */ + +#define NODE_G2_MIN_DATASIZE 1000 /**< Minimum n->data size for G2 */ const char *start_rfc822_date; /**< RFC822 format of start_time */ -static GSList *sl_nodes; -static GSList *sl_up_nodes; -static GHashTable *nodes_by_id; -static GHashTable *nodes_by_guid; +static pslist_t *sl_nodes; +static pslist_t *sl_up_nodes; +static pslist_t *sl_gnet_nodes; +static pslist_t *sl_g2_nodes; +static hikset_t *nodes_by_id; +static hikset_t *nodes_by_guid; static gnutella_node_t *udp_node; static gnutella_node_t *udp6_node; +static gnutella_node_t *udp_sr_node; +static gnutella_node_t *udp6_sr_node; +static gnutella_node_t *udp_g2_node; static gnutella_node_t *dht_node; static gnutella_node_t *dht6_node; static gnutella_node_t *udp_route; static gnutella_node_t *browse_node; +static gnutella_node_t *browse_g2_node; static char *payload_inflate_buffer; static int payload_inflate_buffer_len; static cpattern_t *pat_gtkg_23v1; @@ -200,17 +226,38 @@ static cpattern_t *pat_lmup; static cpattern_t *pat_f2ft_1; -static const char gtkg_vendor = "gtk-gnutella/"; +static const char gtkg_vendor = "gtk-gnutella/"; +static const char APP_G2 = "application/x-gnutella2"; +static const char APP_GNUTELLA = "application/x-gnutella-packets"; + +static const char CONTENT_TYPE_GNUTELLA = + "Content-Type: application/x-gnutella-packets\r\n"; + +static const char ACCEPT_GNUTELLA = + "Accept: application/x-gnutella-packets\r\n"; + +static const char UPGRADE_TLS = + "Upgrade: TLS/1.0\r\n"; + +static const char CONNECTION_UPGRADE = + "Connection: Upgrade\r\n"; + +static const char CONTENT_ENCODING_DEFLATE = + "Content-Encoding: deflate\r\n"; + +static const char ACCEPT_ENCODING_DEFLATE = + "Accept-Encoding: deflate\r\n"; /* These two contain connected and connectING(!) nodes. */ -static GHashTable *ht_connected_nodes = NULL; -static guint32 total_nodes_connected; +static htable_t *ht_connected_nodes = NULL; +static uint32 total_nodes_connected; +static uint32 total_g2_nodes_connected; static void *no_metadata; #define NO_METADATA (no_metadata) /**< No metadata for host */ -static GHashTable *unstable_servent = NULL; -static GSList *unstable_servents = NULL; +static htable_t *unstable_servent = NULL; +static pslist_t *unstable_servents = NULL; static aging_table_t *tcp_crawls; static aging_table_t *udp_crawls; @@ -225,14 +272,16 @@ static time_t node_error_cleanup_timer = 6 * 3600; /**< 6 hours */ static pproxy_set_t *proxies; /* Our push proxies */ -static guint32 shutdown_nodes; -static gboolean allow_gnet_connections = FALSE; +static uint32 shutdown_nodes; +static uint32 shutdown_g2_nodes; +static bool allow_gnet_connections = FALSE; +static htable_t *node_udp_sched_ht; /* UDP schedulers by bsched_bws_t */ /** * Structure used for asynchronous reaction to peer mode changes. */ static struct { - gboolean changed; + bool changed; node_peer_t new; } peermode = { FALSE, NODE_P_UNKNOWN }; @@ -246,36 +295,45 @@ NODE_BAD_NO_VENDOR /**< Node has no vendor string */ }; -static guint connected_node_cnt = 0; -static guint compressed_node_cnt = 0; -static guint compressed_leaf_cnt = 0; +static uint connected_node_cnt = 0; +static uint compressed_node_cnt = 0; +static uint compressed_leaf_cnt = 0; static int pending_byes = 0; /* Used when shutdowning servent */ -static gboolean in_shutdown = FALSE; -static guint32 leaf_to_up_switch = NODE_AUTO_SWITCH_MIN; +static bool in_shutdown = FALSE; +static uint32 leaf_to_up_switch = NODE_AUTO_SWITCH_MIN; static time_t no_leaves_connected = 0; static const char no_reason = "<no reason>"; /* Don't translate this */ static query_hashvec_t *query_hashvec; +static struct socket_ops node_socket_ops; -static void node_disable_read(struct gnutella_node *n); -static gboolean node_data_ind(rxdrv_t *rx, pmsg_t *mb); -static void node_bye_sent(struct gnutella_node *n); -static void call_node_process_handshake_ack(gpointer obj, header_t *header); -static void node_send_qrt(struct gnutella_node *n, +static void node_disable_read(gnutella_node_t *n); +static bool node_data_ind(rxdrv_t *rx, pmsg_t *mb); +static bool node_g2_data_ind(rxdrv_t *rx, pmsg_t *mb); +static bool node_udp_sr_data_ind(rxdrv_t *rx, pmsg_t *mb, + const gnet_host_t *from); +static bool node_udp_g2_data_ind(rxdrv_t *rx, pmsg_t *mb, + const gnet_host_t *from); +static void node_bye_sent(gnutella_node_t *n); +static void call_node_process_handshake_ack(void *obj, header_t *header); +static void node_send_qrt(gnutella_node_t *n, struct routing_table *query_table); -static void node_send_patch_step(struct gnutella_node *n); -static void node_bye_flags(guint32 mask, int code, const char *message); -static void node_bye_all_but_one(struct gnutella_node *nskip, +static void node_send_patch_step(gnutella_node_t *n); +static void node_bye_flags(uint32 mask, int code, const char *message); +static void node_bye_all_but_one(gnutella_node_t *nskip, int code, const char *message); static void node_set_current_peermode(node_peer_t mode); -static enum node_bad node_is_bad(struct gnutella_node *n); +static enum node_bad node_is_bad(gnutella_node_t *n); static gnutella_node_t *node_udp_create(enum net_type net); +static gnutella_node_t *node_udp_sr_create(enum net_type net); +static gnutella_node_t *node_udp_g2_create(enum net_type net); static gnutella_node_t *node_dht_create(enum net_type net); -static gnutella_node_t *node_browse_create(void); -static gboolean node_remove_useless_leaf(gboolean *is_gtkg); -static gboolean node_remove_useless_ultra(gboolean *is_gtkg); -static gboolean node_remove_uncompressed_ultra(gboolean *is_gtkg); +static gnutella_node_t *node_browse_create(bool g2); +static bool node_remove_useless_leaf(bool *is_gtkg); +static bool node_remove_useless_ultra(bool *is_gtkg); +static bool node_remove_uncompressed_ultra(bool *is_gtkg); +static void node_init_outgoing(gnutella_node_t *n); /*** *** Callbacks @@ -368,49 +426,36 @@ * Free atom string key from hash table. */ static void -free_key(gpointer key, gpointer unused_val, gpointer unused_x) +free_key(void *key, void *unused_x) { - (void) unused_val; (void) unused_x; atom_str_free(key); } /** - * Free atom string key from hash table and return TRUE. - */ -static gboolean -free_key_true(gpointer key, gpointer unused_val, gpointer unused_x) -{ - (void) unused_val; - (void) unused_x; - atom_str_free(key); - return TRUE; -} - -/** * Clear hash table whose keys are atoms and values ignored. */ static void -string_table_clear(GHashTable *ht) +string_table_clear(struct hash *h) { - g_assert(ht != NULL); + g_assert(h != NULL); - g_hash_table_foreach_remove(ht, free_key_true, NULL); + hash_foreach(h, free_key, NULL); + hash_clear(h); } /** * Dispose of hash table whose keys are atoms and values ignored. */ static void -string_table_free(GHashTable **ht_ptr) +string_table_free(struct hash **h_ptr) { - g_assert(ht_ptr); - if (*ht_ptr) { - GHashTable *ht = *ht_ptr; - - g_hash_table_foreach(ht, free_key, NULL); - g_hash_table_destroy(ht); - *ht_ptr = NULL; + struct hash *h = *h_ptr; + + if (h != NULL) { + hash_foreach(h, free_key, NULL); + hash_free(h); + *h_ptr = NULL; } } @@ -418,9 +463,19 @@ * Sends a PING to the node over UDP (if enabled). */ static void -node_send_udp_ping(struct gnutella_node *n) +node_send_udp_ping(gnutella_node_t *n) +{ + udp_send_ping(NULL, n->addr, n->port, TRUE); +} + +/** + * Is G2 support active? + */ +bool +node_g2_active(void) { - udp_send_ping(NULL, n->addr, n->port, TRUE); + return udp_active() && GNET_PROPERTY(enable_g2) && + GNET_PROPERTY(max_g2_hubs) != 0; } /*** @@ -431,16 +486,15 @@ * Send "Time Sync" via UDP if we know the remote IP:port, via TCP otherwise. */ static void -node_tsync_udp(cqueue_t *unused_cq, gpointer obj) +node_tsync_udp(cqueue_t *cq, void *obj) { gnutella_node_t *n = obj; gnutella_node_t *udp = NULL, *tn; - (void) unused_cq; g_assert(!NODE_USES_UDP(n)); g_assert(n->attrs & NODE_A_TIME_SYNC); - n->tsync_ev = NULL; /* has been freed before calling this function */ + cq_zero(cq, &n->tsync_ev); /* freed before calling this function */ /* * If we did not get replies within the reasonable time period, we @@ -505,86 +559,100 @@ /** * Check whether we already have the host. */ -static gboolean -node_ht_connected_nodes_has(const host_addr_t addr, guint16 port) +static bool +node_ht_connected_nodes_has(const host_addr_t addr, uint16 port) { gnet_host_t host; gnet_host_set(&host, addr, port); - return NULL != g_hash_table_lookup(ht_connected_nodes, &host); + return NULL != htable_lookup(ht_connected_nodes, &host); } /** * Check whether we already have the host. + * + * @return the original host structure at this IP:port, or NULL if unknown. */ static gnet_host_t * -node_ht_connected_nodes_find(const host_addr_t addr, guint16 port) +node_ht_connected_nodes_find(const host_addr_t addr, uint16 port) { - gnet_host_t host; - gboolean found; - gpointer orig_host, metadata; + gnet_host_t host; + bool found; + const void *orig_host; gnet_host_set(&host, addr, port); - found = g_hash_table_lookup_extended(ht_connected_nodes, &host, - &orig_host, &metadata); + found = htable_lookup_extended(ht_connected_nodes, &host, &orig_host, NULL); - return found ? orig_host : NULL; + return found ? deconstify_pointer(orig_host) : NULL; } /** * Add host to the hash table host cache. */ static void -node_ht_connected_nodes_add(const host_addr_t addr, guint16 port) +node_ht_connected_nodes_add(const gnutella_node_t *n) { + const host_addr_t addr = n->gnet_addr; + const uint16 port = n->gnet_port; + /* This is done unconditionally, whether we add host to table or not */ - total_nodes_connected++; + if (NODE_TALKS_G2(n)) { + total_g2_nodes_connected++; + } else { + total_nodes_connected++; + } if (node_ht_connected_nodes_has(addr, port)) return; - g_hash_table_insert(ht_connected_nodes, - gnet_host_new(addr, port), NO_METADATA); + htable_insert(ht_connected_nodes, gnet_host_new(addr, port), NO_METADATA); } /** * Remove host from the hash table host cache. */ static void -node_ht_connected_nodes_remove(const host_addr_t addr, guint16 port) +node_ht_connected_nodes_remove(const gnutella_node_t *n) { gnet_host_t *orig_host; - orig_host = node_ht_connected_nodes_find(addr, port); + orig_host = node_ht_connected_nodes_find(n->gnet_addr, n->gnet_port); if (orig_host) { - g_hash_table_remove(ht_connected_nodes, orig_host); + htable_remove(ht_connected_nodes, orig_host); gnet_host_free(orig_host); } /* This is done unconditionally, whether host was in table or not */ - g_assert(guint32_is_positive(total_nodes_connected)); - total_nodes_connected--; + if (NODE_TALKS_G2(n)) { + g_assert(uint32_is_non_negative(total_g2_nodes_connected)); + if (total_g2_nodes_connected != 0) + total_g2_nodes_connected--; + } else { + g_assert(uint32_is_non_negative(total_nodes_connected)); + if (total_nodes_connected != 0) + total_nodes_connected--; + } } /** * Dumps a gnutella message (debug). */ static void -message_dump(const struct gnutella_node *n) +message_dump(const gnutella_node_t *n) { printf("Node %s: ", node_addr(n)); printf("Func 0x%.2x ", gnutella_header_get_function(&n->header)); printf("TTL = %u ", gnutella_header_get_ttl(&n->header)); printf("hops = %u ", gnutella_header_get_hops(&n->header)); - printf(" data = %u", (guint) gmsg_size(&n->header)); + printf(" data = %u", (uint) gmsg_size(&n->header)); switch (gnutella_header_get_function(&n->header)) { case GTA_MSG_INIT_RESPONSE: { - guint32 ip, count, total; - guint16 port; + uint32 ip, count, total; + uint16 port; port = peek_le16(n->data); ip = peek_be32(n->data + 2); @@ -597,8 +665,8 @@ break; case GTA_MSG_PUSH_REQUEST: { - guint32 ip, idx; - guint16 port; + uint32 ip, idx; + uint16 port; idx = peek_le32(n->data + 16); ip = peek_be32(n->data + 20); @@ -616,8 +684,8 @@ /** * Check whether node is a gtk-gnutella node. */ -static inline gboolean -node_is_gtkg(const struct gnutella_node *n) +static inline bool +node_is_gtkg(const gnutella_node_t *n) { return 0 != (NODE_F_GTKG & n->flags); } @@ -626,8 +694,8 @@ * Extract IP/port information out of the Query Hit into `ip' and `port'. */ static void -node_extract_host(const struct gnutella_node *n, - host_addr_t *ha, guint16 *port) +node_extract_host(const gnutella_node_t *n, + host_addr_t *ha, uint16 *port) { /* Read Query Hit info */ @@ -638,20 +706,21 @@ /** * Check the Ultrapeer requirements, returning TRUE if we can become an UP. */ -static gboolean +static bool can_become_ultra(time_t now) { - gboolean avg_servent_uptime; - gboolean avg_ip_uptime; - gboolean node_uptime; - gboolean not_firewalled; - gboolean good_udp_support; - gboolean enough_conn; - gboolean enough_fd; - gboolean enough_mem; - gboolean enough_bw; + bool avg_servent_uptime; + bool avg_ip_uptime; + bool node_uptime; + bool not_firewalled; + bool good_udp_support; + bool enough_conn; + bool enough_fd; + bool enough_mem; + bool enough_bw; const char *ok = "** OK **"; const char *no = "-- NO --"; + size_t provision_fd; /* Uptime requirements */ avg_servent_uptime = get_average_servent_uptime(now) >= NODE_MIN_AVG_UPTIME; @@ -671,7 +740,7 @@ * --RAM, 2006-08-18 */ - good_udp_support = + good_udp_support = GNET_PROPERTY(proxy_oob_queries) && udp_active() && ( host_is_valid(listen_addr(), socket_listen_port()) || @@ -686,18 +755,27 @@ * provision for possible PARQ active queuing, which is why we scale the * `max_uploads' parameter. * - * Likewise, we assume that at most 1/4th of the downloads will actually + * Likewise, we assume that at most 1/8th of the downloads will actually * be active at one time (meaning one fd for the connection and one fd * for the file being written to). We count "max_uploads" twice because * those have one also two fd (for the connection and the file). */ - enough_fd = (GNET_PROPERTY(max_leaves) + GNET_PROPERTY(max_connections) - + GNET_PROPERTY(max_downloads) + (GNET_PROPERTY(max_downloads) / 4) - + (GNET_PROPERTY(max_uploads) * (1 + NODE_UPLOAD_QUEUE_FD)) - + GNET_PROPERTY(max_uploads) - + (GNET_PROPERTY(max_banned_fd) / 10) + NODE_CASUAL_FD) - < GNET_PROPERTY(sys_nofile); + provision_fd = GNET_PROPERTY(max_leaves) + + GNET_PROPERTY(max_connections) + + (GNET_PROPERTY(max_downloads) / 4) + + (GNET_PROPERTY(max_banned_fd) / 10) + NODE_CASUAL_FD; + + /* + * The file descriptors we need to provision for upload are only taken + * into account when upload is possible: it is physically enabled, and + * there are some files actually shared. + */ + + if (upload_is_enabled() && 0 != shared_files_scanned()) + provision_fd += GNET_PROPERTY(max_uploads) * (2 + NODE_UPLOAD_QUEUE_FD); + + enough_fd = provision_fd < GNET_PROPERTY(sys_nofile); enough_mem = (GNET_PROPERTY(max_leaves) * NODE_AVG_LEAF_MEM + (GNET_PROPERTY(max_leaves) + GNET_PROPERTY(max_connections)) @@ -791,13 +869,36 @@ } /** + * Switch current peermode to specified value. + */ +static void +node_switch_peermode(node_peer_t mode) +{ + gnet_prop_set_guint32_val(PROP_CURRENT_PEERMODE, mode); + gnet_prop_set_timestamp_val(PROP_NODE_LAST_ULTRA_LEAF_SWITCH, tm_time()); +} + +/** + * Demote current Ultra node to a leaf. + */ +static void +node_demote_to_leaf(const char *reason) +{ + leaf_to_up_switch *= 2; + leaf_to_up_switch = MIN(leaf_to_up_switch, NODE_AUTO_SWITCH_MAX); + g_warning("demoted from Ultrapeer status (for %u secs): %s", + leaf_to_up_switch, reason); + node_switch_peermode(NODE_P_LEAF); +} + +/** * Low frequency node timer. */ void node_slow_timer(time_t now) { static time_t last_fw_check; - gboolean need_fw_check = FALSE; + bool need_fw_check = FALSE; /* * If we are firewalled, periodically request connect-back from random @@ -811,34 +912,36 @@ } if (need_fw_check) { - GSList *sl; - GSList *candidates = NULL; + pslist_t *sl; + pslist_t *candidates = NULL; unsigned count = 0; - GM_SLIST_FOREACH(sl_nodes, sl) { + PSLIST_FOREACH(sl_nodes, sl) { gnutella_node_t *n = sl->data; if (NODE_IS_ULTRA(n) && (n->attrs & NODE_A_CAN_VENDOR)) { - candidates = g_slist_prepend(candidates, n); + candidates = pslist_prepend(candidates, n); count++; } } if (GNET_PROPERTY(fw_debug) > 2) { g_debug("FW: found %u ultra node%s to send connect-back messages", - count, 1 == count ? "" : "s"); + count, plural(count)); } if (count > 0) { gnutella_node_t *picked2; - picked0 = g_slist_nth_data(candidates, random_value(count - 1)); - picked1 = g_slist_nth_data(candidates, random_value(count - 1)); + picked0 = pslist_nth_data(candidates, random_value(count - 1)); + picked1 = pslist_nth_data(candidates, random_value(count - 1)); node_check_local_firewalled_status(picked0); if (picked0 != picked1) node_check_local_firewalled_status(picked1); } + + pslist_free_null(&candidates); } if (udp_active()) { @@ -851,11 +954,11 @@ if (!last_ping || delta_time(now, last_ping) > 120) { host_addr_t addr; - guint16 port; - + uint16 port; + last_ping = now; if (hcache_get_caught(HOST_ANY, &addr, &port)) { - udp_send_ping(NULL, addr, port, TRUE); + udp_send_ping(NULL, addr, port, TRUE); } } } @@ -902,35 +1005,7 @@ can_become_ultra(now) ) { g_warning("being promoted to Ultrapeer status"); - gnet_prop_set_guint32_val(PROP_CURRENT_PEERMODE, NODE_P_ULTRA); - gnet_prop_set_timestamp_val(PROP_NODE_LAST_ULTRA_LEAF_SWITCH, now); - return; - } - - /* - * If we're in "auto" mode and we've been promoted to an ultra node, - * evaluate how good we are and whether we would not be better off - * running as a leaf node. - * - * We double the time we'll spend as a leaf node before switching - * again to UP mode to avoid endless switches between UP and leaf. - * We limit that doubling to NODE_AUTO_SWITCH_MAX, to ensure that if - * we can become one, then we should do so on a regular basis. - */ - - if ( - GNET_PROPERTY(configured_peermode) == NODE_P_AUTO && - settings_is_ultra() && - delta_time(now, GNET_PROPERTY(node_last_ultra_leaf_switch)) - > NODE_AUTO_SWITCH_MIN && - !can_become_ultra(now) - ) { - leaf_to_up_switch *= 2; - leaf_to_up_switch = MIN(leaf_to_up_switch, NODE_AUTO_SWITCH_MAX); - g_warning("being demoted from Ultrapeer status (for %u secs)", - leaf_to_up_switch); - gnet_prop_set_guint32_val(PROP_CURRENT_PEERMODE, NODE_P_LEAF); - gnet_prop_set_timestamp_val(PROP_NODE_LAST_ULTRA_LEAF_SWITCH, now); + node_switch_peermode(NODE_P_ULTRA); return; } @@ -964,59 +1039,89 @@ GNET_PROPERTY(is_firewalled) ) { g_warning("firewalled node being demoted from Ultrapeer status"); - gnet_prop_set_guint32_val(PROP_CURRENT_PEERMODE, NODE_P_LEAF); - gnet_prop_set_timestamp_val(PROP_NODE_LAST_ULTRA_LEAF_SWITCH, now); + node_switch_peermode(NODE_P_LEAF); return; } /* - * If we're running as an ultra node in auto mode and we have seen no leaf - * node connection for some time, then we're a bad node: we're taking - * an ultranode slot in a high outdegree network with a low TTL and - * are therefore harming the propagation of queries to leaf nodes, - * since we have none. - * - * Therefore, we'll be better off running as a leaf node. + * Additional sanity checks when we've been automatically promoted to + * the Ultrapeer mode. */ if ( GNET_PROPERTY(configured_peermode) == NODE_P_AUTO && - settings_is_ultra() && - no_leaves_connected != 0 && - delta_time(now, no_leaves_connected) > NODE_UP_NO_LEAF_MAX + settings_is_ultra() ) { - leaf_to_up_switch *= 2; - leaf_to_up_switch = MIN(leaf_to_up_switch, NODE_AUTO_SWITCH_MAX); - g_warning( - "demoted from Ultrapeer status for %d secs due to missing leaves", - leaf_to_up_switch); - gnet_prop_set_guint32_val(PROP_CURRENT_PEERMODE, NODE_P_LEAF); - gnet_prop_set_timestamp_val(PROP_NODE_LAST_ULTRA_LEAF_SWITCH, now); - return; + /* + * Evaluate how good we are and whether we would not be better off + * running as a leaf node. + * + * We double the time we'll spend as a leaf node before switching + * again to UP mode to avoid endless switches between UP and leaf. + * We limit that doubling to NODE_AUTO_SWITCH_MAX, to ensure that if + * we can become one, then we should do so on a regular basis. + */ + + if ( + delta_time(now, GNET_PROPERTY(node_last_ultra_leaf_switch)) + > NODE_AUTO_SWITCH_MIN && + !can_become_ultra(now) + ) { + node_demote_to_leaf("no longer meeting requirements"); + return; + } + + /* + * If we have not seen any leaf node connection for some time, then + * we're a bad node: we're taking an ultranode slot in a high outdegree + * network with a low TTL and are therefore harming the propagation of + * queries to leaf nodes, since we have none. + * + * Therefore, we'll be better off running as a leaf node. + */ + + if ( + no_leaves_connected != 0 && + delta_time(now, no_leaves_connected) > NODE_UP_NO_LEAF_MAX + ) { + node_demote_to_leaf("missing leaves"); + return; + } + + /* + * If they happen to lack memory space for the kernel to allocate + * enough memory buffers to support the high connection rate of + * an Ultrapeer, switch back to leaf node. + */ + + if (GNET_PROPERTY(net_buffer_shortage)) { + node_demote_to_leaf("kernel network buffer shortage"); + return; + } } } /** * Periodic event to cleanup error data structures. */ -static gboolean -node_error_cleanup(gpointer unused_x) +static bool +node_error_cleanup(void *unused_x) { - GSList *sl; - GSList *to_remove = NULL; + pslist_t *sl; + pslist_t *to_remove = NULL; (void) unused_x; - for (sl = unstable_servents; sl != NULL; sl = g_slist_next(sl)) { + PSLIST_FOREACH(unstable_servents, sl) { node_bad_client_t *bad_node = sl->data; g_assert(bad_node != NULL); if (--bad_node->errors == 0) - to_remove = g_slist_prepend(to_remove, bad_node); + to_remove = pslist_prepend(to_remove, bad_node); } - for (sl = to_remove; sl != NULL; sl = g_slist_next(sl)) { + PSLIST_FOREACH(to_remove, sl) { node_bad_client_t *bad_node = sl->data; g_assert(bad_node != NULL); @@ -1025,30 +1130,30 @@ if (GNET_PROPERTY(node_debug) > 1) g_warning("nodes up Unbanning client: %s", bad_node->vendor); - g_hash_table_remove(unstable_servent, bad_node->vendor); - unstable_servents = g_slist_remove(unstable_servents, bad_node); + htable_remove(unstable_servent, bad_node->vendor); + unstable_servents = pslist_remove(unstable_servents, bad_node); atom_str_free_null(&bad_node->vendor); WFREE(bad_node); } - g_slist_free(to_remove); + pslist_free(to_remove); return TRUE; /* Keep calling */ } static void -node_tls_refresh(struct gnutella_node *n) +node_tls_refresh(gnutella_node_t *n) { node_check(n); if ( - (n->flags & NODE_F_CAN_TLS) && + (n->attrs2 & NODE_A2_CAN_TLS) && n->gnet_port && is_host_addr(n->gnet_addr) ) { time_t seen; - + seen = tls_cache_get_timestamp(n->gnet_addr, n->gnet_port); if (!seen || delta_time(tm_time(), seen) > 60) { tls_cache_insert(n->gnet_addr, n->gnet_port); @@ -1057,24 +1162,32 @@ } void -node_supports_tls(struct gnutella_node *n) +node_supports_tls(gnutella_node_t *n) { node_check(n); - - n->flags |= NODE_F_CAN_TLS; + + n->attrs2 |= NODE_A2_CAN_TLS; node_tls_refresh(n); } void -node_supports_whats_new(struct gnutella_node *n) +node_supports_whats_new(gnutella_node_t *n) { node_check(n); - + n->attrs |= NODE_A_CAN_WHAT; } void -node_supports_dht(struct gnutella_node *n, dht_mode_t mode) +node_supports_qrp_1bit_patches(gnutella_node_t *n) +{ + node_check(n); + + n->attrs2 |= NODE_A2_CAN_QRP1; +} + +void +node_supports_dht(gnutella_node_t *n, dht_mode_t mode) { node_check(n); @@ -1094,7 +1207,7 @@ pcache_collect_dht_hosts(n); } -static gboolean +static bool node_str_match(const char *str, size_t len, const cpattern_t *pat) { return NULL != pattern_qsearch(pat, str, len, 0, qs_any); @@ -1107,9 +1220,9 @@ * with a space. */ void -node_supported_vmsg(struct gnutella_node *n, const char *str, size_t len) +node_supported_vmsg(gnutella_node_t *n, const char *str, size_t len) { - gboolean expect_features = FALSE; + bool expect_features = FALSE; node_check(n); @@ -1146,7 +1259,7 @@ * a space. */ void -node_supported_feats(struct gnutella_node *n, const char *str, size_t len) +node_supported_feats(gnutella_node_t *n, const char *str, size_t len) { const char *p; @@ -1213,7 +1326,7 @@ n->received, node_infostr(n)); } - n->flags |= NODE_F_NOT_GENUINE; + n->attrs2 |= NODE_A2_NOT_GENUINE; n->flags &= ~NODE_F_EXPECT_VMSG; } @@ -1223,7 +1336,7 @@ void node_timer(time_t now) { - const GSList *sl; + const pslist_t *sl; /* * Asynchronously react to current peermode change. @@ -1236,14 +1349,14 @@ } for (sl = sl_nodes; NULL != sl; /* empty */ ) { - struct gnutella_node *n = sl->data; + gnutella_node_t *n = sl->data; /* * NB: As the list `sl_nodes' might be modified, the next * link has to be before any changes might apply! */ - sl = g_slist_next(sl); + sl = pslist_next(sl); node_tls_refresh(n); /* @@ -1328,7 +1441,7 @@ "activity timeout"); node_bye_if_writable(n, 405, "Activity timeout (%d sec%s)", GNET_PROPERTY(node_connected_timeout), - 1 == GNET_PROPERTY(node_connected_timeout) ? "" : "s"); + plural(GNET_PROPERTY(node_connected_timeout))); continue; } else if ( NODE_IN_TX_FLOW_CONTROL(n) && @@ -1342,7 +1455,7 @@ "flow-controlled too long"); node_bye(n, 405, "Flow-controlled for too long (%d sec%s)", GNET_PROPERTY(node_tx_flowc_timeout), - GNET_PROPERTY(node_tx_flowc_timeout) == 1 ? "" : "s"); + plural(GNET_PROPERTY(node_tx_flowc_timeout))); continue; } } @@ -1364,14 +1477,16 @@ node_infostr(n)); ban_record(n->addr, "IP with Gnutella security violations"); - hostiles_dynamic_add(n->addr, "Gnutella security violations"); + hostiles_dynamic_add(n->addr, "Gnutella security violations", + HSTL_WEIRD_MSG); node_bye_if_writable(n, 412, "Security violation"); continue; } - if (hostiles_check(n->addr)) { - g_message("removing %s as dynamically detected hostile peer", - node_infostr(n)); + if (hostiles_is_bad(n->addr)) { + hostiles_flags_t flags = hostiles_check(n->addr); + g_message("removing %s, as dynamically found hostile peer (%s)", + node_infostr(n), hostiles_flags_to_string(flags)); node_bye_if_writable(n, 415, "Hostile Peer"); continue; } @@ -1404,8 +1519,8 @@ NODE_IS_ESTABLISHED(n) && delta_time(now, n->last_rx) > n->alive_period ) { - guint32 last; - guint32 avg; + uint32 last; + uint32 avg; time_delta_t period; /* @@ -1426,7 +1541,7 @@ period *= ALIVE_TRANSIENT; if ( - delta_time(now, n->last_alive_ping) > period && + alive_elapsed(n->alive_pings) > period && !alive_send_ping(n->alive_pings) ) { node_bye(n, 406, "No reply to alive pings"); @@ -1458,7 +1573,7 @@ ) { time_delta_t total; double fc_ratio; - guint32 max_ratio; + uint32 max_ratio; /* * If we're a leaf node, we allow the ultrapeer to flow @@ -1489,7 +1604,7 @@ fc_ratio = (double) total / (2.0 * NODE_RX_FC_HALF_PERIOD); fc_ratio *= 100.0; - if ((guint32) fc_ratio > max_ratio) { + if ((uint32) fc_ratio > max_ratio) { node_bye(n, 405, "Remotely flow-controlled too often " "(%.2f%% > %d%% of time)", fc_ratio, max_ratio); @@ -1515,13 +1630,13 @@ delta_time(now, n->qrelayed_created) >= (time_delta_t) GNET_PROPERTY(node_queries_half_life) ) { - GHashTable *new; + hset_t *new; if (n->qrelayed_old != NULL) { new = n->qrelayed_old; - string_table_clear(new); + string_table_clear(hset_cast_to_hash(new)); } else - new = g_hash_table_new(g_str_hash, g_str_equal); + new = hset_create(HASH_KEY_STRING, 0); n->qrelayed_old = n->qrelayed; n->qrelayed = new; @@ -1532,7 +1647,7 @@ sq_process(sq_global_queue(), now); } -gboolean +bool node_id_self(const struct nid *node_id) { return 0 == nid_value(node_id); @@ -1546,28 +1661,24 @@ } static struct nid * -node_id_new(const struct gnutella_node *n) +node_id_new(void) { static struct nid counter; - struct nid *node_id; - node_check(n); - node_id = nid_new_counter(&counter); - gm_hash_table_insert_const(nodes_by_id, node_id, n); - return node_id; + return nid_new_counter(&counter); } /** * Network init. */ -G_GNUC_COLD void +void G_COLD node_init(void) { time_t now = clock_loc2gmt(tm_time()); STATIC_ASSERT(23 == sizeof(gnutella_header_t)); - no_metadata = deconstify_gpointer(vmm_trap_page()); + no_metadata = deconstify_pointer(vmm_trap_page()); rxbuf_init(); proxies = pproxy_set_allocate(0); @@ -1575,22 +1686,35 @@ BH_VERSION_MAJOR, BH_VERSION_MINOR, GNET_PROPERTY_PTR(browse_host_enabled)); + header_features_add_guarded(FEATURES_G2_CONNECTIONS, "browse", + BH_VERSION_MAJOR, BH_VERSION_MINOR, + GNET_PROPERTY_PTR(browse_host_enabled)); + /* Max: 128 unique words / URNs! */ query_hashvec = qhvec_alloc(QRP_HVEC_MAX); - unstable_servent = g_hash_table_new(NULL, NULL); - ht_connected_nodes = g_hash_table_new(gnet_host_hash, gnet_host_eq); - nodes_by_id = g_hash_table_new(nid_hash, nid_equal); - nodes_by_guid = g_hash_table_new(guid_hash, guid_eq); + unstable_servent = htable_create(HASH_KEY_SELF, 0); + ht_connected_nodes = htable_create_any( + gnet_host_hash, gnet_host_hash2, gnet_host_equal); + nodes_by_id = hikset_create_any( + offsetof(gnutella_node_t, id), + nid_hash, nid_equal); + nodes_by_guid = hikset_create( + offsetof(gnutella_node_t, guid), + HASH_KEY_FIXED, GUID_RAW_SIZE); start_rfc822_date = atom_str_get(timestamp_rfc822_to_string(now)); gnet_prop_set_timestamp_val(PROP_START_STAMP, now); udp_node = node_udp_create(NET_TYPE_IPV4); udp6_node = node_udp_create(NET_TYPE_IPV6); + udp_sr_node = node_udp_sr_create(NET_TYPE_IPV4); + udp6_sr_node = node_udp_sr_create(NET_TYPE_IPV6); + udp_g2_node = node_udp_g2_create(NET_TYPE_IPV4); dht_node = node_dht_create(NET_TYPE_IPV4); dht6_node = node_dht_create(NET_TYPE_IPV6); - browse_node = node_browse_create(); + browse_node = node_browse_create(FALSE); + browse_g2_node = node_browse_create(TRUE); udp_route = node_udp_create(NET_TYPE_IPV4); /* Net type does not matter */ payload_inflate_buffer_len = settings_max_msg_size(); @@ -1642,6 +1766,11 @@ header_features_add_guarded_function(FEATURES_CONNECTIONS, "IP", INET_IP_V6READY, INET_IP_V4V6, settings_running_ipv4_and_ipv6); + header_features_add_guarded_function(FEATURES_G2_CONNECTIONS, "IP", + INET_IP_V6READY, INET_IP_NOV4, settings_running_ipv6_only); + header_features_add_guarded_function(FEATURES_G2_CONNECTIONS, "IP", + INET_IP_V6READY, INET_IP_V4V6, settings_running_ipv4_and_ipv6); + cq_periodic_main_add( node_error_cleanup_timer * 1000, node_error_cleanup, NULL); } @@ -1652,12 +1781,12 @@ void node_set_socket_rx_size(int rx_size) { - GSList *sl; + pslist_t *sl; g_assert(rx_size > 0); - for (sl = sl_nodes; sl != NULL; sl = g_slist_next(sl)) { - struct gnutella_node *n = sl->data; + PSLIST_FOREACH(sl_nodes, sl) { + gnutella_node_t *n = sl->data; if (n->socket) { socket_check(n->socket); @@ -1673,7 +1802,7 @@ /** * @return amount of nodes to whom we are connected. */ -guint +uint connected_nodes(void) { return connected_node_cnt; @@ -1683,16 +1812,16 @@ * @return amount of established + initiated connections to ultra nodes, * not counting the established connections that are being shutdown. */ -guint +uint node_count(void) { unsigned count = total_nodes_connected - shutdown_nodes - GNET_PROPERTY(node_leaf_count); if (!uint_is_non_negative(count)) { - g_warning("BUG node_count() is negative? " + g_warning("BUG %s() is negative? " "connections = %u, shutdown = %u, leaves = %u", - total_nodes_connected, shutdown_nodes, + G_STRFUNC, total_nodes_connected, shutdown_nodes, GNET_PROPERTY(node_leaf_count)); return 0; } @@ -1700,6 +1829,27 @@ return count; } +/* + * @return amount of established + initiated G2 hub connections, + * not counting the established connections that are being shutdown. + */ +uint +node_g2_count(void) +{ + unsigned count = total_g2_nodes_connected - shutdown_g2_nodes - + GNET_PROPERTY(node_g2_count); + + if (!uint_is_non_negative(count)) { + g_warning("BUG %s() is negative? " + "connections = %u, shutdown = %u, hubs = %u", + G_STRFUNC, total_g2_nodes_connected, shutdown_g2_nodes, + GNET_PROPERTY(node_g2_count)); + return 0; + } + + return count; +} + /** * Amount of node connections we would like to keep. * @@ -1725,6 +1875,7 @@ case NODE_P_CRAWLER: case NODE_P_UDP: case NODE_P_DHT: + case NODE_P_G2HUB: case NODE_P_UNKNOWN: break; } @@ -1738,7 +1889,7 @@ * * @return 0 if none. */ -guint +uint node_missing(void) { int missing; @@ -1758,6 +1909,7 @@ case NODE_P_CRAWLER: case NODE_P_UDP: case NODE_P_DHT: + case NODE_P_G2HUB: case NODE_P_UNKNOWN: break; } @@ -1769,7 +1921,7 @@ /** * Amount of leaves we're missing (0 if not in ultra mode). */ -guint +uint node_leaves_missing(void) { int missing; @@ -1783,10 +1935,26 @@ } /** + * Amount of G2 hub connections we're missing. + */ +uint +node_g2_hubs_missing(void) +{ + int missing; + + if (!node_g2_active()) + return 0; + + missing = GNET_PROPERTY(max_g2_hubs) - GNET_PROPERTY(node_g2_count); + + return MAX(0, missing); +} + +/** * @return this node's outdegree, i.e. the maximum amount of peer connections * that we can support. */ -guint +uint node_outdegree(void) { switch ((node_peer_t) GNET_PROPERTY(current_peermode)) { @@ -1799,6 +1967,7 @@ case NODE_P_CRAWLER: case NODE_P_UDP: case NODE_P_DHT: + case NODE_P_G2HUB: case NODE_P_UNKNOWN: break; } @@ -1812,16 +1981,17 @@ * The major and minor are returned in `major' and `minor' respectively. */ static void -get_protocol_version(const char *handshake, guint *major, guint *minor) +get_protocol_version(const char *handshake, uint *major, uint *minor) { const char *s; - s = &handshakeGNUTELLA_HELLO_LENGTH; + s = &handshakeGNUTELLA_HELLO_LENGTH; if (0 == parse_major_minor(s, NULL, major, minor)) return; if (GNET_PROPERTY(node_debug)) - g_warning("Unable to parse version number in HELLO, assuming 0.4"); + g_warning("%s(): unable to parse version number in HELLO, assuming 0.4", + G_STRFUNC); if (GNET_PROPERTY(node_debug) > 2) { size_t len = strlen(handshake); dump_hex(stderr, "First HELLO Line", handshake, MIN(len, 80)); @@ -1835,21 +2005,25 @@ * Decrement the proper node count property, depending on the peermode. */ static void -node_type_count_dec(const struct gnutella_node *n) +node_type_count_dec(const gnutella_node_t *n) { switch (n->peermode) { case NODE_P_LEAF: - g_assert(guint32_is_positive(GNET_PROPERTY(node_leaf_count))); + g_assert(uint32_is_positive(GNET_PROPERTY(node_leaf_count))); gnet_prop_decr_guint32(PROP_NODE_LEAF_COUNT); return; case NODE_P_NORMAL: - g_assert(guint32_is_positive(GNET_PROPERTY(node_normal_count))); + g_assert(uint32_is_positive(GNET_PROPERTY(node_normal_count))); gnet_prop_decr_guint32(PROP_NODE_NORMAL_COUNT); return; case NODE_P_ULTRA: - g_assert(guint32_is_positive(GNET_PROPERTY(node_ultra_count))); + g_assert(uint32_is_positive(GNET_PROPERTY(node_ultra_count))); gnet_prop_decr_guint32(PROP_NODE_ULTRA_COUNT); return; + case NODE_P_G2HUB: + g_assert(uint32_is_positive(GNET_PROPERTY(node_g2_count))); + gnet_prop_decr_guint32(PROP_NODE_G2_COUNT); + return; case NODE_P_AUTO: case NODE_P_CRAWLER: case NODE_P_UDP: @@ -1860,11 +2034,11 @@ g_assert_not_reached(); } -static struct gnutella_node * +static gnutella_node_t * node_alloc(void) { - static const struct gnutella_node zero_node; - struct gnutella_node *n; + static const gnutella_node_t zero_node; + gnutella_node_t *n; WALLOC(n); *n = zero_node; @@ -1886,8 +2060,8 @@ */ node_fire_node_removed(n); - sl_nodes = g_slist_remove(sl_nodes, n); - g_hash_table_remove(nodes_by_id, NODE_ID(n)); + sl_nodes = pslist_remove(sl_nodes, n); + hikset_remove(nodes_by_id, NODE_ID(n)); /* * Now that the node was removed from the list of known nodes, we @@ -1952,7 +2126,7 @@ * A node is removed, decrement counters. */ static void -node_decrement_counters(const struct gnutella_node *n) +node_decrement_counters(const gnutella_node_t *n) { if (n->status == GTA_NODE_CONNECTED) { /* Already did if shutdown */ g_assert(uint_is_positive(connected_node_cnt)); @@ -1972,8 +2146,8 @@ /** * The vectorized (message-wise) version of node_remove(). */ -static G_GNUC_PRINTF(2, 0) void -node_remove_v(struct gnutella_node *n, const char *reason, va_list ap) +static void G_PRINTF(2, 0) +node_remove_v(gnutella_node_t *n, const char *reason, va_list ap) { node_check(n); g_assert(n->status != GTA_NODE_REMOVING); @@ -2004,8 +2178,13 @@ n->n_ping_sent, n->n_pong_received, n->n_pong_sent); } - if (NODE_IS_ULTRA(n)) { - sl_up_nodes = g_slist_remove(sl_up_nodes, n); + if (NODE_TALKS_G2(n)) { + sl_g2_nodes = pslist_remove(sl_g2_nodes, n); + } else { + if (NODE_IS_ULTRA(n)) { + sl_up_nodes = pslist_remove(sl_up_nodes, n); + } + sl_gnet_nodes = pslist_remove(sl_gnet_nodes, n); } if (n->routing_data) { routing_node_remove(n); @@ -2053,8 +2232,13 @@ } if (n->status == GTA_NODE_SHUTDOWN) { - g_assert(uint_is_positive(shutdown_nodes)); - shutdown_nodes--; + if (NODE_TALKS_G2(n)) { + g_assert(uint_is_positive(shutdown_g2_nodes)); + shutdown_g2_nodes--; + } else { + g_assert(uint_is_positive(shutdown_nodes)); + shutdown_nodes--; + } } else { node_decrement_counters(n); } @@ -2078,11 +2262,7 @@ if (n->outq) /* TX stack freed by node_real_remove() */ mq_shutdown(n->outq); /* Prevents any further output */ - if (n->socket) { - socket_check(n->socket); - g_assert(n->socket->resource.node == n); - socket_free_null(&n->socket); - } + socket_free_null(&n->socket); if (n->flags & (NODE_F_EOF_WAIT|NODE_F_BYE_WAIT)) { g_assert(pending_byes > 0); @@ -2095,7 +2275,7 @@ /* Routine pre-condition asserted that n->status != GTA_NODE_REMOVING */ - node_ht_connected_nodes_remove(n->gnet_addr, n->gnet_port); + node_ht_connected_nodes_remove(n); n->status = GTA_NODE_REMOVING; n->flags &= ~(NODE_F_WRITABLE|NODE_F_READABLE|NODE_F_BYE_SENT); @@ -2107,11 +2287,11 @@ pproxy_set_remove(proxies, n->proxy_addr, n->proxy_port); pdht_prox_publish_if_changed(); } - string_table_free(&n->qseen); - string_table_free(&n->qrelayed); - string_table_free(&n->qrelayed_old); + string_table_free(htable_ptr_cast_to_hash(&n->qseen)); + string_table_free(hset_ptr_cast_to_hash(&n->qrelayed)); + string_table_free(hset_ptr_cast_to_hash(&n->qrelayed_old)); if (n->guid) { - g_hash_table_remove(nodes_by_guid, n->guid); + hikset_remove(nodes_by_guid, n->guid); atom_guid_free_null(&n->guid); } if (n->attrs & NODE_A_CAN_HSEP) @@ -2132,12 +2312,13 @@ * in shutdown mode, processing the messages we might still read from the * socket. */ -static void +static void G_PRINTF(3, 0) node_recursive_shutdown_v( - struct gnutella_node *n, + gnutella_node_t *n, const char *where, const char *reason, va_list ap) { - char *fmt, *p; + char *p; + str_t *s = str_new(120); g_assert(n->status == GTA_NODE_SHUTDOWN); g_assert(n->error_str); @@ -2149,9 +2330,12 @@ if (*p == '%') *p = 'X'; - fmt = str_cmsg("%s (%s) within %s", where, reason, n->error_str); - node_remove_v(n, fmt, ap); - HFREE_NULL(fmt); + str_printf(s, "%s (", where); + str_vcatf(s, reason, ap); + str_catf(s, ") within %s", n->error_str); + + node_remove(n, "%s", str_2c(s)); + str_destroy_null(&s); } /** @@ -2184,7 +2368,7 @@ * routine always returns NODE_BAD_OK. */ static enum node_bad -node_is_bad(struct gnutella_node *n) +node_is_bad(gnutella_node_t *n) { node_bad_client_t *bad_client = NULL; @@ -2198,10 +2382,8 @@ if (n->vendor == NULL) { if (GNET_PROPERTY(node_debug)) - g_warning("no vendor name in %s node headers from %s", - NODE_IS_LEAF(n) ? "leaf" : - NODE_IS_ULTRA(n) ? "ultra" : "legacy", - node_addr(n)); + g_warning("%s(): no vendor name in %s node headers from %s", + G_STRFUNC, node_type(n), node_addr(n)); return NODE_BAD_NO_VENDOR; } @@ -2210,23 +2392,22 @@ if (hcache_node_is_bad(n->addr)) { if (GNET_PROPERTY(node_debug)) - g_warning("nodes up Unstable peer %s (%s)", - host_addr_to_string(n->addr), - n->vendor); + g_warning("%s(): unstable peer %s (%s)", + G_STRFUNC, host_addr_to_string(n->addr), n->vendor); return NODE_BAD_IP; } if (!GNET_PROPERTY(node_monitor_unstable_servents)) return NODE_BAD_OK; /* No monitoring of unstable servents */ - bad_client = g_hash_table_lookup(unstable_servent, n->vendor); + bad_client = htable_lookup(unstable_servent, n->vendor); if (bad_client == NULL) return NODE_BAD_OK; if (bad_client->errors > node_error_threshold) { if (GNET_PROPERTY(node_debug)) - g_warning("nodes up Banned client: %s", n->vendor); + g_warning("%s(): banned client: %s", G_STRFUNC, n->vendor); return NODE_BAD_VENDOR; } @@ -2238,7 +2419,7 @@ * marks, we won't try to connect to it anymore. */ void -node_mark_bad_vendor(struct gnutella_node *n) +node_mark_bad_vendor(gnutella_node_t *n) { struct node_bad_client *bad_client = NULL; time_t now; @@ -2301,14 +2482,13 @@ g_assert(n->vendor != NULL); - bad_client = g_hash_table_lookup(unstable_servent, n->vendor); + bad_client = htable_lookup(unstable_servent, n->vendor); if (bad_client == NULL) { WALLOC0(bad_client); bad_client->errors = 0; bad_client->vendor = atom_str_get(n->vendor); - gm_hash_table_insert_const(unstable_servent, - bad_client->vendor, bad_client); - unstable_servents = g_slist_prepend(unstable_servents, bad_client); + htable_insert(unstable_servent, bad_client->vendor, bad_client); + unstable_servents = pslist_prepend(unstable_servents, bad_client); } g_assert(bad_client != NULL); @@ -2332,13 +2512,13 @@ * host contacting the web caches just because it cannot fulfill its * anti-monopoly requirements. */ -static gboolean -node_avoid_monopoly(struct gnutella_node *n) +static bool +node_avoid_monopoly(gnutella_node_t *n) { - guint up_cnt = 0; - guint leaf_cnt = 0; - guint normal_cnt = 0; - GSList *sl; + uint up_cnt = 0; + uint leaf_cnt = 0; + uint normal_cnt = 0; + pslist_t *sl; g_assert(UNSIGNED(GNET_PROPERTY(unique_nodes) <= 100)); @@ -2352,8 +2532,8 @@ ) return FALSE; - for (sl = sl_nodes; sl; sl = g_slist_next(sl)) { - struct gnutella_node *node = sl->data; + PSLIST_FOREACH(sl_nodes, sl) { + gnutella_node_t *node = sl->data; if (node->status != GTA_NODE_CONNECTED || node->vendor == NULL) continue; @@ -2431,6 +2611,7 @@ case NODE_P_CRAWLER: case NODE_P_UDP: case NODE_P_DHT: + case NODE_P_G2HUB: case NODE_P_UNKNOWN: g_assert_not_reached(); break; @@ -2446,13 +2627,13 @@ * * @return TRUE if we should reserve the slot for GTKG, i.e. refuse `n'. */ -static gboolean -node_reserve_slot(struct gnutella_node *n) +static bool +node_reserve_slot(gnutella_node_t *n) { - guint up_cnt = 0; /* GTKG UPs */ - guint leaf_cnt = 0; /* GTKG leafs */ - guint normal_cnt = 0; /* GTKG normal nodes */ - GSList *sl; + uint up_cnt = 0; /* GTKG UPs */ + uint leaf_cnt = 0; /* GTKG leafs */ + uint normal_cnt = 0; /* GTKG normal nodes */ + pslist_t *sl; g_assert(UNSIGNED(GNET_PROPERTY(reserve_gtkg_nodes)) <= 100); @@ -2467,7 +2648,7 @@ return FALSE; for (sl = sl_nodes; sl; sl = sl->next) { - struct gnutella_node *node = sl->data; + gnutella_node_t *node = sl->data; if (node->status != GTA_NODE_CONNECTED || node->vendor == NULL) continue; @@ -2517,7 +2698,7 @@ gtkg_min = GNET_PROPERTY(reserve_gtkg_nodes) * max / 100; if (GNET_PROPERTY(node_ultra_count) >= max + up_cnt - gtkg_min) { - gboolean is_gtkg; + bool is_gtkg; if (node_remove_useless_ultra(&is_gtkg) && is_gtkg) up_cnt--; @@ -2541,7 +2722,7 @@ GNET_PROPERTY(node_leaf_count) >= GNET_PROPERTY(max_leaves) + leaf_cnt - gtkg_min ) { - gboolean is_gtkg; + bool is_gtkg; if (node_remove_useless_leaf(&is_gtkg) && is_gtkg) leaf_cnt--; } @@ -2592,6 +2773,7 @@ case NODE_P_CRAWLER: case NODE_P_UDP: case NODE_P_DHT: + case NODE_P_G2HUB: case NODE_P_UNKNOWN: g_assert_not_reached(); break; @@ -2609,7 +2791,7 @@ * It will be reclaimed on the "idle" stack frame, via node_real_remove(). */ void -node_remove(struct gnutella_node *n, const char *reason, ...) +node_remove(gnutella_node_t *n, const char *reason, ...) { va_list args; @@ -2634,18 +2816,18 @@ * connected to us. * @return The number of nodes that have been removed. */ -guint -node_remove_by_addr(const host_addr_t addr, guint16 port) +uint +node_remove_by_addr(const host_addr_t addr, uint16 port) { - const GSList *sl; - guint n_removed = 0; + const pslist_t *sl; + uint n_removed = 0; for (sl = sl_nodes; sl; /* empty */) { - const struct gnutella_node *n = sl->data; + const gnutella_node_t *n = sl->data; - sl = g_slist_next(sl); /* node_remove_by_id() will alter sl_nodes */ + sl = pslist_next(sl); /* node_remove_by_id() will alter sl_nodes */ - if ((!port || n->port == port) && host_addr_equal(n->addr, addr)) { + if ((!port || n->port == port) && host_addr_equiv(n->addr, addr)) { node_remove_by_id(NODE_ID(n)); n_removed++; if (port) @@ -2658,11 +2840,9 @@ /** * The vectorized version of node_eof(). */ -static void -node_eof_v(struct gnutella_node *n, const char *reason, va_list args) +static void G_PRINTF(2, 0) +node_eof_v(gnutella_node_t *n, const char *reason, va_list args) { - const char *format; - node_check(n); /* @@ -2696,11 +2876,10 @@ socket_eof(n->socket); if (n->flags & NODE_F_CLOSING) /* Bye sent or explicit shutdown */ - format = NULL; /* Reuse existing reason */ + node_remove_v(n, no_reason, args); /* Reuse existing reason */ else - format = reason; + node_remove_v(n, reason, args); - node_remove_v(n, format, args); } /** @@ -2710,7 +2889,7 @@ * while, for displaying purposes. */ void -node_eof(struct gnutella_node *n, const char *reason, ...) +node_eof(gnutella_node_t *n, const char *reason, ...) { va_list args; @@ -2726,7 +2905,7 @@ * and make sure we flush the buffers at the fastest possible speed. */ static void -node_shutdown_mode(struct gnutella_node *n, guint32 delay) +node_shutdown_mode(gnutella_node_t *n, uint32 delay) { /* @@ -2746,7 +2925,11 @@ mq_discard(n->outq); /* Discard any further data */ node_flushq(n); /* Fast queue flushing */ - shutdown_nodes++; + if (NODE_TALKS_G2(n)) { + shutdown_g2_nodes++; + } else { + shutdown_nodes++; + } node_fire_node_info_changed(n); node_fire_node_flags_changed(n); @@ -2755,8 +2938,8 @@ /** * The vectorized version of node_shutdown(). */ -static void -node_shutdown_v(struct gnutella_node *n, const char *reason, va_list args) +static void G_PRINTF(2, 0) +node_shutdown_v(gnutella_node_t *n, const char *reason, va_list args) { node_check(n); @@ -2787,7 +2970,7 @@ * see whether the node did not send us a Bye we haven't read yet. */ void -node_shutdown(struct gnutella_node *n, const char *reason, ...) +node_shutdown(gnutella_node_t *n, const char *reason, ...) { va_list args; @@ -2799,8 +2982,8 @@ /** * The vectorized version of node_bye(). */ -static void -node_bye_v(struct gnutella_node *n, int code, const char *reason, va_list ap) +static void G_PRINTF(3, 0) +node_bye_v(gnutella_node_t *n, int code, const char *reason, va_list ap) { gnutella_header_t head; char reason_fmt1024; @@ -2843,16 +3026,28 @@ mq_clear(n->outq); /* + * FIXME + * Until we specify the BYE message for G2, simply remove a G2 node + * without sending anything. + * --RAM, 2014-01-10 + */ + + if (NODE_TALKS_G2(n)) { + node_remove_v(n, reason, ap); + return; + } + + /* * Build the bye message. */ - len = gm_snprintf(reason_base, sizeof reason_fmt - 3, + len = str_bprintf(reason_base, sizeof reason_fmt - 3, "%s", n->error_str); /* XXX Add X-Try and X-Try-Ultrapeers */ if (code != 200) { - len += gm_snprintf(reason_base + len, sizeof reason_fmt - len - 3, + len += str_bprintf(reason_base + len, sizeof reason_fmt - len - 3, "\r\n" "Server: %s\r\n" "\r\n", @@ -2959,7 +3154,7 @@ */ void node_bye_if_writable( - struct gnutella_node *n, int code, const char *reason, ...) + gnutella_node_t *n, int code, const char *reason, ...) { va_list args; @@ -2969,6 +3164,8 @@ node_bye_v(n, code, reason, args); else node_remove_v(n, reason, args); + + va_end(args); } /** @@ -2978,8 +3175,8 @@ * only one incoming connection per IP, even when there are several * instances, all on different ports. */ -gboolean -node_is_connected(const host_addr_t addr, guint16 port, gboolean incoming) +bool +node_is_connected(const host_addr_t addr, uint16 port, bool incoming) { if (is_my_address_and_port(addr, port)) { return TRUE; @@ -2992,15 +3189,15 @@ * -- Richard, 29/04/2004 */ if (incoming) { - const GSList *sl; + const pslist_t *sl; - for (sl = sl_nodes; sl; sl = g_slist_next(sl)) { - const struct gnutella_node *n = sl->data; + PSLIST_FOREACH(sl_nodes, sl) { + const gnutella_node_t *n = sl->data; if ( n->status != GTA_NODE_REMOVING && n->status != GTA_NODE_SHUTDOWN && - host_addr_equal(n->addr, addr) + host_addr_equiv(n->addr, addr) ) { return TRUE; } @@ -3014,8 +3211,8 @@ /** * Are we directly connected to that host? */ -gboolean -node_host_is_connected(const host_addr_t addr, guint16 port) +bool +node_host_is_connected(const host_addr_t addr, uint16 port) { /* Check our local address */ @@ -3101,7 +3298,7 @@ * @return success status, FALSE meaning the message was accounted as dropped * already. */ -static gboolean +static bool node_inflate_payload(gnutella_node_t *n) { int outlen = payload_inflate_buffer_len; @@ -3109,7 +3306,7 @@ g_assert(NODE_IS_UDP(n)); - gnet_stats_count_general(GNR_UDP_RX_COMPRESSED, 1); + gnet_stats_inc_general(GNR_UDP_RX_COMPRESSED); if (!zlib_is_valid_header(n->data, n->size)) { if (GNET_PROPERTY(udp_debug)) @@ -3160,7 +3357,7 @@ * @return ready-to-insert header chunk, with all lines ending with "\r\n". */ static char * -node_crawler_headers(struct gnutella_node *n) +node_crawler_headers(gnutella_node_t *n) { static char buf8192; /* 8 KB */ gnutella_node_t **ultras = NULL; /* Array of ultra nodes */ @@ -3171,7 +3368,7 @@ int lx = 0; /* Index in `leaves' */ int uw = 0; /* Amount of ultras written */ int lw = 0; /* Amount of leaves written */ - GSList *sl; + pslist_t *sl; int maxsize; int rw; int count; @@ -3186,7 +3383,7 @@ leaves = walloc(leaves_len); } - for (sl = sl_nodes; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(sl_nodes, sl) { gnutella_node_t *cn = sl->data; if (!NODE_IS_ESTABLISHED(cn)) @@ -3196,13 +3393,13 @@ continue; if (NODE_IS_ULTRA(cn)) { - g_assert((guint) ux < GNET_PROPERTY(node_ultra_count)); + g_assert((uint) ux < GNET_PROPERTY(node_ultra_count)); ultrasux++ = cn; continue; } if (NODE_IS_LEAF(cn)) { - g_assert((guint) lx < GNET_PROPERTY(node_leaf_count)); + g_assert((uint) lx < GNET_PROPERTY(node_leaf_count)); leaveslx++ = cn; continue; } @@ -3214,9 +3411,9 @@ */ if (ux) - qsort(ultras, ux, sizeof(gnutella_node_t *), node_gtkg_cmp); + vsort(ultras, ux, sizeof(gnutella_node_t *), node_gtkg_cmp); if (lx) - qsort(leaves, lx, sizeof(gnutella_node_t *), node_gtkg_cmp); + vsort(leaves, lx, sizeof(gnutella_node_t *), node_gtkg_cmp); /* * Avoid sending an incomplete trailing IP address by roughly avoiding @@ -3229,24 +3426,24 @@ * First, the peers. */ - rw = gm_snprintf(buf, sizeof(buf), "Peers: "); + rw = str_bprintf(buf, sizeof(buf), "Peers: "); for (count = 0; count < ux && rw < maxsize; count++) { - struct gnutella_node *cn = ultrascount; + gnutella_node_t *cn = ultrascount; if (cn == n) /* Don't show the crawler itself */ continue; if (uw > 0) - rw += gm_snprintf(&bufrw, sizeof(buf)-rw, ", "); + rw += str_bprintf(&bufrw, sizeof(buf)-rw, ", "); - rw += gm_snprintf(&bufrw, sizeof(buf)-rw, "%s", + rw += str_bprintf(&bufrw, sizeof(buf)-rw, "%s", host_addr_port_to_string(cn->gnet_addr, cn->gnet_port)); uw++; /* One more ultra written */ } - rw += gm_snprintf(&bufrw, sizeof(buf)-rw, "\r\n"); + rw += str_bprintf(&bufrw, sizeof(buf)-rw, "\r\n"); if (!settings_is_ultra() || rw >= maxsize) goto cleanup; @@ -3255,30 +3452,28 @@ * We're an ultranode, list our leaves. */ - rw += gm_snprintf(&bufrw, sizeof(buf)-rw, "Leaves: "); + rw += str_bprintf(&bufrw, sizeof(buf)-rw, "Leaves: "); for (count = 0; count < lx && rw < maxsize; count++) { - struct gnutella_node *cn = leavescount; + gnutella_node_t *cn = leavescount; if (cn == n) /* Don't show the crawler itself */ continue; if (lw > 0) - rw += gm_snprintf(&bufrw, sizeof(buf)-rw, ", "); + rw += str_bprintf(&bufrw, sizeof(buf)-rw, ", "); - rw += gm_snprintf(&bufrw, sizeof(buf)-rw, "%s", + rw += str_bprintf(&bufrw, sizeof(buf)-rw, "%s", host_addr_port_to_string(cn->gnet_addr, cn->gnet_port)); lw++; /* One more leaf written */ } - rw += gm_snprintf(&bufrw, sizeof(buf)-rw, "\r\n"); + rw += str_bprintf(&bufrw, sizeof(buf)-rw, "\r\n"); if (GNET_PROPERTY(node_debug)) g_debug( "TCP crawler sending %d/%d ultra%s and %d/%d lea%s to %s", - uw, ux, uw == 1 ? "" : "s", - lw, lx, lw == 1 ? "f" : "ves", - node_addr(n)); + uw, ux, plural(uw), lw, lx, plural_f(lw), node_addr(n)); /* FALL THROUGH */ @@ -3297,19 +3492,19 @@ * @param s the connected socket (mandatory) * @param n the node (optional, NULL if not available) * @param code the error code to report - * @param msg the error message (printf format) + * @param msg the error message (printf format), in English * @param ap variable argument pointer, arguments for the error message */ static void send_error( - struct gnutella_socket *s, struct gnutella_node *n, + struct gnutella_socket *s, gnutella_node_t *n, int code, const char *msg, va_list ap) { char gnet_response2048; char msg_tmp256; size_t rw; ssize_t sent; - gboolean saturated = bsched_saturated(BSCHED_BWS_GOUT); + bool saturated = bsched_saturated(BSCHED_BWS_GOUT); const char *version; char *token; char xlive128; @@ -3332,14 +3527,14 @@ version = version_short_string; token = socket_omit_token(s) ? NULL : tok_short_version(); } else { - gm_snprintf(xlive, sizeof(xlive), + str_bprintf(xlive, sizeof(xlive), "X-Live-Since: %s\r\n", start_rfc822_date); version = version_string; token = socket_omit_token(s) ? NULL : tok_version(); } if (token) - gm_snprintf(xtoken, sizeof(xtoken), "X-Token: %s\r\n", token); + str_bprintf(xtoken, sizeof(xtoken), "X-Token: %s\r\n", token); else xtoken0 = '\0'; @@ -3370,13 +3565,20 @@ pongs = 0; /* + * Do no send pongs if node vendor is faked. + */ + + if (n != NULL && NODE_HAS_FAKE_NAME(n)) + pongs = 0; + + /* * Do not send X-Ultrapeer on 4xx errors or 550. */ if (code == 550 || (code >= 400 && code < 500)) { xultrapeer0 = '\0'; } else { - gm_snprintf(xultrapeer, sizeof(xultrapeer), "X-Ultrapeer: %s\r\n", + str_bprintf(xultrapeer, sizeof(xultrapeer), "X-Ultrapeer: %s\r\n", settings_is_leaf() ? "False" : "True"); } @@ -3386,13 +3588,13 @@ net = HOST_NET_IPV4; if (n != NULL) { - if (n->attrs & NODE_A_IPV6_ONLY) + if (n->attrs & NODE_A_IPV6_ONLY) net = HOST_NET_IPV6; else if (n->attrs & NODE_A_CAN_IPV6) net = HOST_NET_BOTH; } - rw = gm_snprintf(gnet_response, sizeof(gnet_response), + rw = str_bprintf(gnet_response, sizeof(gnet_response), "GNUTELLA/0.6 %d %s\r\n" "User-Agent: %s\r\n" "Remote-IP: %s\r\n" @@ -3430,6 +3632,13 @@ /** * Send error message to remote end, a node presumably. * + * The error message MUST be in plain English, as it is sent remotely to the + * peer and not necessarily displayed locally. + * + * @param s the socket on which we're sending the error + * @param code the protocol error code (similar to HTTP ones) + * @param msg the English text message sent remotely + * * @attention * NB: We don't need a node to call this routine, only a socket. */ @@ -3445,9 +3654,16 @@ /** * Send error message to remote node. + * + * The error message MUST be in plain English, as it is sent remotely to the + * other node and not necessarily displayed locally. + * + * @param n the node to which we're sending the error + * @param code the protocol error code (similar to HTTP ones) + * @param msg the English text message sent remotely */ static void -node_send_error(struct gnutella_node *n, int code, const char *msg, ...) +node_send_error(gnutella_node_t *n, int code, const char *msg, ...) { va_list args; @@ -3463,13 +3679,13 @@ void node_became_firewalled(void) { - GSList *sl; - guint sent = 0; + pslist_t *sl; + uint sent = 0; g_assert(GNET_PROPERTY(is_firewalled)); - for (sl = sl_nodes; sl; sl = g_slist_next(sl)) { - struct gnutella_node *n = sl->data; + PSLIST_FOREACH(sl_nodes, sl) { + gnutella_node_t *n = sl->data; if (socket_listen_port() && sent < 10 && n->attrs & NODE_A_CAN_VENDOR) { vmsg_send_tcp_connect_back(n, socket_listen_port()); @@ -3483,6 +3699,9 @@ if (NODE_IS_LEAF(n)) continue; + if (NODE_TALKS_G2(n)) + g2_node_send_lni(n); /* Updates /LNI/FW status */ + if (!is_host_addr(n->proxy_addr) && (n->attrs & NODE_A_CAN_VENDOR)) send_proxy_request(n); } @@ -3495,16 +3714,16 @@ void node_became_udp_firewalled(void) { - GSList *sl; - guint sent = 0; + pslist_t *sl; + uint sent = 0; g_assert(GNET_PROPERTY(is_udp_firewalled)); if (0 == socket_listen_port()) return; - for (sl = sl_nodes; sl; sl = g_slist_next(sl)) { - struct gnutella_node *n = sl->data; + PSLIST_FOREACH(sl_nodes, sl) { + gnutella_node_t *n = sl->data; if (0 == (n->attrs & NODE_A_CAN_VENDOR)) continue; @@ -3519,21 +3738,73 @@ } } +/** + * Account for Gnutella message sending to node. + * + * @param n the node to which message was sent + * @param function the message code + * @param mb_start start of message (Gnutella header + payload) + * @param mb_size total length of message sent + */ +static void +node_sent_accounting(gnutella_node_t *n, uint8 function, + const void *mb_start, int mb_size) +{ + node_inc_sent(n); + gnet_stats_count_sent(n, function, mb_start, mb_size); + switch (function) { + case GTA_MSG_SEARCH: + node_inc_tx_query(n); + break; + case GTA_MSG_SEARCH_RESULTS: + node_inc_tx_qhit(n); + break; + default: + break; + } +} + +/** + * Account for G2 message sending to node. + * + * @param n the node to which message was sent + * @param type the type of G2 message + * @param mb_start start of message (G2 frame head) + * @param mb_size total length of message sent + */ +static void +node_g2_sent_accounting(gnutella_node_t *n, enum g2_msg type, int mb_size) +{ + node_inc_sent(n); + gnet_stats_g2_count_sent(n, type, mb_size); + switch (type) { + case G2_MSG_Q2: + node_inc_tx_query(n); + break; + case G2_MSG_QH2: + node_inc_tx_qhit(n); + break; + default: + break; + } +} + /*** *** TX deflate callbacks ***/ static void -node_add_tx_deflated(gpointer o, int amount) +node_add_tx_deflated(void *o, int amount) { gnutella_node_t *n = o; node_check(n); + n->tx_deflated += amount; } -static void -node_tx_shutdown(gpointer o, const char *reason, ...) +static void G_PRINTF(2, 3) +node_tx_shutdown(void *o, const char *reason, ...) { gnutella_node_t *n = o; va_list args; @@ -3546,7 +3817,7 @@ } static void -node_tx_deflate_flowc(gpointer o, size_t amount) +node_tx_deflate_flowc(void *o, size_t amount) { gnutella_node_t *n = o; @@ -3567,32 +3838,38 @@ ***/ static void -node_add_tx_written(gpointer o, int amount) +node_add_tx_written(void *o, int amount) { gnutella_node_t *n = o; + node_check(n); + n->tx_written += amount; n->last_tx = tm_time(); } -static void -node_tx_eof_remove(gpointer o, const char *reason, ...) +static void G_PRINTF(2, 3) +node_tx_eof_remove(void *o, const char *reason, ...) { gnutella_node_t *n = o; va_list args; + node_check(n); + va_start(args, reason); socket_eof(n->socket); node_remove_v(n, reason, args); va_end(args); } -static void -node_tx_eof_shutdown(gpointer o, const char *reason, ...) +static void G_PRINTF(2, 3) +node_tx_eof_shutdown(void *o, const char *reason, ...) { gnutella_node_t *n = o; va_list args; + node_check(n); + va_start(args, reason); socket_eof(n->socket); node_shutdown_v(n, reason, args); @@ -3600,13 +3877,26 @@ } static void -node_tx_unflushq(gpointer o) +node_tx_unflushq(void *o) { gnutella_node_t *n = o; + node_check(n); + node_unflushq(n); } +void +node_add_txdrop(void *o, int x) +{ + gnutella_node_t *n = o; + + node_check(n); + + n->last_update = tm_time(); + n->tx_dropped += x; +} + static struct tx_link_cb node_tx_link_cb = { node_add_tx_written, /* add_tx_written */ node_tx_eof_remove, /* eof_remove */ @@ -3618,28 +3908,168 @@ *** TX datagram callbacks ***/ +/** + * Invoked on each successfully sent messages to update message accounting + * and node information. + */ +static void +node_msg_accounting(void *o, const pmsg_t *mb) +{ + gnutella_node_t *n = o; + char *mb_start = pmsg_start(mb); + uint8 function = gmsg_function(mb_start); + int mb_size = pmsg_size(mb); + + node_check(n); + g_assert(!NODE_TALKS_G2(n)); + + node_add_tx_written(n, mb_size); + node_sent_accounting(n, function, mb_start, mb_size); +} + static struct tx_dgram_cb node_tx_dgram_cb = { - node_add_tx_written, /* add_tx_written */ + node_msg_accounting, /* msg_account */ + node_add_txdrop, /* add_tx_dropped */ +}; + +/** + * Invoked on each successfully sent datagram to update message accounting + * for the semi-reliable UDP TX layer (UDP transceiver). + * + * Gnutella messages are only visible when we enter the semi-reliable UDP + * layer, hence message accounting must be done there, whilst byte accounting + * is done at the lower layer (physical transmission). + */ +static void +node_msg_ut_accounting(void *o, const pmsg_t *mb, const gnet_host_t *to) +{ + gnutella_node_t *n = o; + char *mb_start = pmsg_start(mb); + uint8 function = gmsg_function(mb_start); + int mb_size = pmsg_written_size(mb); + + node_check(n); + g_assert(!NODE_TALKS_G2(n)); + + node_sent_accounting(n, function, mb_start, mb_size); + + if (GNET_PROPERTY(log_sr_udp_tx)) { + g_info("UDP-SR sent %s to %s", + gmsg_infostr_full(mb_start, mb_size), gnet_host_to_string(to)); + } +} + +/** + * Invoked on each successfully sent datagram to update message accounting + * for the semi-reliable UDP TX layer (UDP transceiver) for G2. + * + * G2 messages are only visible when we enter the semi-reliable UDP layer, + * hence message accounting must be done there, whilst byte accounting + * is done at the lower layer (physical transmission). + */ +static void +node_g2_ut_accounting(void *o, const pmsg_t *mb, const gnet_host_t *to) +{ + gnutella_node_t *n = o; + int mb_size = pmsg_written_size(mb); + enum g2_msg type = g2_msg_type(pmsg_start(mb), mb_size); + + node_check(n); + g_assert(NODE_TALKS_G2(n)); + + node_g2_sent_accounting(n, type, mb_size); + + if (GNET_PROPERTY(log_sr_udp_tx)) { + g_info("UDP-G2 sent %s (%d bytes) to %s", + g2_msg_type_name(type), mb_size, gnet_host_to_string(to)); + } +} + +/** + * Invoked on each successfully sent messages to update message accounting + * and node information. + */ +static void +node_g2_msg_accounting(void *o, const pmsg_t *mb) +{ + gnutella_node_t *n = o; + int mb_size = pmsg_written_size(mb); + enum g2_msg type = g2_msg_type(pmsg_start(mb), mb_size); + + node_check(n); + g_assert(NODE_TALKS_G2(n)); + + node_add_tx_written(n, mb_size); + node_g2_sent_accounting(n, type, mb_size); +} + +/** + * Invoked by the UDP scheduler for each physically sent message so + * that we can account for the bytes transmitted by the semi-reliable + * UDP layer, including the header overhead and acknowledgements. + * + * At this low level, we are not sending Gnutella messages (we could send + * deflated payloads split over multiple fragments) hence we only monitor + * the bytes sent. + */ +static void +node_bytes_ut_accounting(void *o, const pmsg_t *mb) +{ + gnutella_node_t *n = o; + int size; + + node_check(n); + + size = pmsg_written_size(mb); + node_add_tx_written(n, size); + + /* + * Since we're natively deflating, we want to measure the overall + * compression ratio (including acknoweledgment overhead), hence we also + * count what we write as "deflated" output, even if it is pure overhead + * like acknowledgments. + */ + + node_add_tx_deflated(n, size); +} + +static struct tx_dgram_cb node_tx_sr_dgram_cb = { + node_bytes_ut_accounting, /* msg_account */ + NULL, /* add_tx_dropped */ +}; + +static struct tx_ut_cb node_tx_ut_cb = { + node_msg_ut_accounting, /* msg_account */ + node_add_txdrop, /* add_tx_dropped */ +}; + +static struct tx_ut_cb node_tx_g2_cb = { + node_g2_ut_accounting, /* msg_account */ + node_add_txdrop, /* add_tx_dropped */ }; /*** *** RX inflate callbacks ***/ -static void -node_add_rx_inflated(gpointer o, int amount) +static void +node_add_rx_inflated(void *o, int amount) { gnutella_node_t *n = o; + node_check(n); + n->rx_inflated += amount; } -static void -node_rx_inflate_error(gpointer o, const char *reason, ...) +static void G_PRINTF(2, 3) +node_rx_inflate_error(void *o, const char *reason, ...) { gnutella_node_t *n = o; va_list args; + node_check(n); + va_start(args, reason); node_mark_bad_vendor(n); node_bye_v(n, 501, reason, args); @@ -3656,29 +4086,35 @@ ***/ static void -node_add_rx_given(gpointer o, ssize_t amount) +node_add_rx_given(void *o, ssize_t amount) { gnutella_node_t *n = o; + node_check(n); + n->rx_given += amount; } -static void -node_rx_read_error(gpointer o, const char *reason, ...) +static void G_PRINTF(2, 3) +node_rx_read_error(void *o, const char *reason, ...) { gnutella_node_t *n = o; va_list args; + node_check(n); + va_start(args, reason); node_eof_v(n, reason, args); va_end(args); } static void -node_rx_got_eof(gpointer o) +node_rx_got_eof(void *o) { gnutella_node_t *n = o; + node_check(n); + if (n->n_ping_sent <= 2 && n->n_pong_received) node_eof(n, NG_("Got %d connection pong", "Got %d connection pongs", n->n_pong_received), n->n_pong_received); @@ -3692,137 +4128,662 @@ node_rx_got_eof, /* got_eof */ }; -/** - * Called when we know that we're connected to the node, at the end of - * the handshaking (both for incoming and outgoing connections). - */ +static struct rx_ut_cb node_rx_ut_cb = { + node_add_rx_given, /* add_rx_given */ +}; + +/*** + *** Message queue polymorphic operations. + ***/ + static void -node_is_now_connected(struct gnutella_node *n) +node_msg_flowc(void *unused_node, const pmsg_t *mb) { - gboolean peermode_changed = FALSE; - gnet_host_t host; - txdrv_t *tx; + (void) unused_node; - socket_check(n->socket); + gnet_stats_count_flowc(pmsg_start(mb), FALSE); +} + +static void +node_msg_queued(void *node, const pmsg_t *mb) +{ + const gnutella_node_t *n = node; + const char *mbs = pmsg_start(mb); + uint8 function = gmsg_function(mbs); + + node_check(n); + + gnet_stats_count_queued(n, function, mbs, pmsg_size(mb)); +} + +static void +node_g2_msg_flowc(void *node, const pmsg_t *mb) +{ + const gnutella_node_t *n = node; + + node_check(n); + + gnet_stats_g2_count_flowc(n, pmsg_start(mb), pmsg_size(mb)); +} + +static void +node_g2_msg_queued(void *node, const pmsg_t *mb) +{ + const gnutella_node_t *n = node; + + node_check(n); + + gnet_stats_g2_count_queued(n, pmsg_start(mb), pmsg_size(mb)); +} + +static int +node_g2_msg_zero(const void *a, const void *b) +{ + (void) a; + (void) b; + + /* FIXME -- we could devise a priority scheme between messages */ + + return 0; /* Treat all G2 messages as equally important */ +} + +/** + * Can node accept connection? + * + * If `handshaking' is true, we're still in the handshaking phase, otherwise + * we're already connected and can send a BYE. + * + * @return TRUE if we can accept the connection, FALSE otherwise, with + * the node being removed. + */ +static bool +node_can_accept_connection(gnutella_node_t *n, bool handshaking) +{ + g_assert(handshaking || n->status == GTA_NODE_CONNECTED); + g_assert((n->attrs & (NODE_A_NO_ULTRA|NODE_A_CAN_ULTRA)) + || NODE_TALKS_G2(n)); /* - * Cleanup hanshaking objects. + * Deny cleanly if they deactivated "online mode". + * + * Note that we still allow connections from nearby nodes, as defined + * by the "local_netmasks_string" property, to make local testing easier. */ - if (n->io_opaque) /* None for outgoing 0.4 connections */ - io_free(n->io_opaque); - if (n->socket->getline) { - getline_free(n->socket->getline); - n->socket->getline = NULL; + if (handshaking && !allow_gnet_connections && !host_is_nearby(n->addr)) { + node_send_error(n, 403, + "Gnet connections currently disabled"); + node_remove(n, _("Gnet connections disabled")); + return FALSE; } /* - * Terminate crawler connection that goes through the whole 3-way - * handshaking protocol. + * Always accept crawler connections. */ - if (n->flags & NODE_F_CRAWLER) { - node_remove(n, _("Sent crawling info")); - return; - } + if (n->flags & NODE_F_CRAWLER) + return TRUE; /* - * Make sure we did not change peermode whilst performing the 3-way - * handshaking with this node. + * If we are handshaking, we have not incremented the node counts yet. + * Hence we can do >= tests against the limits. */ - peermode_changed = - n->start_peermode != GNET_PROPERTY(current_peermode) || - n->start_peermode != peermode.new; - /* - * Determine correct peer mode. - * - * If we're a leaf node and we connected to an ultranode, send it - * our query routing table. + * Check for G2 hosts, where we always act as a leaf node. */ - n->peermode = NODE_P_NORMAL; + if (NODE_TALKS_G2(n)) { + if (n->flags & NODE_F_FORCE) + return TRUE; - if (n->flags & NODE_F_ULTRA) { - n->peermode = NODE_P_ULTRA; - } else if (n->flags & NODE_F_LEAF) { - if (settings_is_ultra()) - n->peermode = NODE_P_LEAF; - } else if (n->attrs & NODE_A_ULTRA) - n->peermode = NODE_P_ULTRA; + if ( + GNET_PROPERTY(prefer_compressed_gnet) && + GNET_PROPERTY(node_g2_count) != 0 && + !(n->attrs & NODE_A_CAN_INFLATE) + ) { + node_send_error(n, 403, + "Compressed connection preferred"); + node_remove(n, _("Connection not compressed")); + return FALSE; + } - /* If peermode did not change, current_peermode = leaf => node is Ultra */ - g_assert(peermode_changed || !settings_is_leaf() || NODE_IS_ULTRA(n)); + if ( + handshaking && + GNET_PROPERTY(node_g2_count) >= GNET_PROPERTY(max_g2_hubs) + ) { + node_send_error(n, 503, "Too many G2 hub connections (%u max)", + GNET_PROPERTY(max_g2_hubs)); + node_remove(n, _("Too many G2 hubs (%u max)"), + GNET_PROPERTY(max_g2_hubs)); + return FALSE; + } + + if ( + !handshaking && + GNET_PROPERTY(node_g2_count) > GNET_PROPERTY(max_g2_hubs) + ) { + node_bye(n, 503, "Too many G2 hub connections (%u max)", + GNET_PROPERTY(max_g2_hubs)); + return FALSE; + } + + goto check_for_bad_nodes; + } /* - * Update state, and mark node as valid. + * Check for Gnutella hosts. */ - g_assert(n->status != GTA_NODE_REMOVING); + switch ((node_peer_t) GNET_PROPERTY(current_peermode)) { + case NODE_P_ULTRA: - n->status = GTA_NODE_CONNECTED; - n->flags |= NODE_F_VALID; - n->last_update = n->connect_date = tm_time(); - if (NODE_IS_ULTRA(n)) { - sl_up_nodes = g_slist_prepend(sl_up_nodes, n); - } + if (n->flags & NODE_F_FORCE) + return TRUE; - connected_node_cnt++; + /* + * If we're an ultra node, we need to enforce leaf counts. + * + * We also enforce ultra node counts if we're issuing an outgoing + * connection, but for incoming ones, we'll try to let the other + * node become a leaf node, so don't enforce if we're still in the + * handshaking phase. + */ - /* - * Count nodes by type. - */ + if (n->flags & NODE_F_LEAF) { + /* + * Try to preference compressed leaf nodes too + * -- JA, 08/06/2003 + */ + if ( + GNET_PROPERTY(prefer_compressed_gnet) && + GNET_PROPERTY(up_connections) <= + GNET_PROPERTY(node_leaf_count) - compressed_leaf_cnt && + !(n->attrs & NODE_A_CAN_INFLATE) + ) { + node_send_error(n, 403, + "Compressed connection preferred"); + node_remove(n, _("Connection not compressed")); + return FALSE; + } + + /* + * Remove leaves that do not allow queries when we are + * running out of slots. + */ + + if (GNET_PROPERTY(node_leaf_count) >= GNET_PROPERTY(max_leaves)) { + (void) node_remove_useless_leaf(NULL); + + /* + * It may happen than when we try to make up some room to + * remove a useless node, we do remove this node! + */ + + if (GTA_NODE_REMOVING == n->status) + return FALSE; + } + + if ( + handshaking && + GNET_PROPERTY(node_leaf_count) >= GNET_PROPERTY(max_leaves) + ) { + node_send_error(n, 503, "Too many leaf connections (%d max)", + GNET_PROPERTY(max_leaves)); + node_remove(n, _("Too many leaves (%d max)"), + GNET_PROPERTY(max_leaves)); + return FALSE; + } + if ( + !handshaking && + GNET_PROPERTY(node_leaf_count) > GNET_PROPERTY(max_leaves) + ) { + node_bye(n, 503, "Too many leaf connections (%d max)", + GNET_PROPERTY(max_leaves)); + return FALSE; + } + } else if (n->attrs & NODE_A_ULTRA) { + uint ultra_max; + + /* + * Try to give preference to compressed ultrapeer connections too. + * -- JA, 08/06/2003 + */ + + if ( + GNET_PROPERTY(prefer_compressed_gnet) && + GNET_PROPERTY(up_connections) <= + GNET_PROPERTY(node_ultra_count) - + (compressed_node_cnt - compressed_leaf_cnt) && + !(n->attrs & NODE_A_CAN_INFLATE) + ) { + node_send_error(n, 403, + "Compressed connection preferred"); + node_remove(n, _("Connection not compressed")); + return FALSE; + } + + ultra_max = GNET_PROPERTY(max_connections) > + GNET_PROPERTY(normal_connections) ? + GNET_PROPERTY(max_connections) - + GNET_PROPERTY(normal_connections) : + 0; + + if (GNET_PROPERTY(node_ultra_count) >= ultra_max) + (void) node_remove_useless_ultra(NULL); + + if ( + GNET_PROPERTY(node_ultra_count) >= ultra_max && + (n->attrs & NODE_A_CAN_INFLATE) + ) { + (void) node_remove_uncompressed_ultra(NULL); + } + + /* + * It may happen than when we try to make up some room to + * remove a useless node, we do remove this node! + */ + + if (GTA_NODE_REMOVING == n->status) + return FALSE; + + if ( + handshaking && + GNET_PROPERTY(node_ultra_count) >= ultra_max + ) { + node_send_error(n, 503, + "Too many ultra connections (%d max)", ultra_max); + node_remove(n, _("Too many ultra nodes (%d max)"), ultra_max); + return FALSE; + } + if (!handshaking && GNET_PROPERTY(node_ultra_count) > ultra_max) { + node_bye(n, 503, + "Too many ultra connections (%d max)", ultra_max); + return FALSE; + } + } + + /* + * Enforce preference for compression only with non-leaf nodes. + */ + + if (handshaking) { + uint connected; + + connected = GNET_PROPERTY(node_normal_count) + + GNET_PROPERTY(node_ultra_count); + + if ( + GNET_PROPERTY(prefer_compressed_gnet) && + !(n->attrs & NODE_A_CAN_INFLATE) && + ( + ((n->flags & NODE_F_INCOMING) && + connected >= GNET_PROPERTY(up_connections) && + connected > compressed_node_cnt) + || + (n->flags & NODE_F_LEAF) + ) + ) { + node_send_error(n, 403, + "Gnet connection not compressed"); + node_remove(n, _("Connection not compressed")); + return FALSE; + } + } + + /* + * If we have already enough normal nodes, reject a normal node. + */ + + if ( + handshaking && + (n->attrs & NODE_A_NO_ULTRA) && + GNET_PROPERTY(node_normal_count) + >= GNET_PROPERTY(normal_connections) + ) { + if (GNET_PROPERTY(normal_connections)) + node_send_error(n, 503, "Too many normal nodes (%d max)", + GNET_PROPERTY(normal_connections)); + else + node_send_error(n, 403, "Normal nodes refused"); + node_remove(n, _("Rejected normal node (%d max)"), + GNET_PROPERTY(normal_connections)); + return FALSE; + } - switch (n->peermode) { - case NODE_P_LEAF: - gnet_prop_incr_guint32(PROP_NODE_LEAF_COUNT); break; case NODE_P_NORMAL: - gnet_prop_incr_guint32(PROP_NODE_NORMAL_COUNT); + if (n->flags & NODE_F_FORCE) + return TRUE; + + if (handshaking) { + uint connected; + + connected = GNET_PROPERTY(node_normal_count) + + GNET_PROPERTY(node_ultra_count); + if ( + (n->attrs & (NODE_A_CAN_ULTRA|NODE_A_ULTRA)) == NODE_A_CAN_ULTRA + ) { + node_send_error(n, 503, "Cannot accept leaf node"); + node_remove(n, _("Rejected leaf node")); + return FALSE; + } + if (connected >= GNET_PROPERTY(max_connections)) { + node_send_error(n, 503, "Too many Gnet connections (%d max)", + GNET_PROPERTY(max_connections)); + node_remove(n, _("Too many nodes (%d max)"), + GNET_PROPERTY(max_connections)); + return FALSE; + } + if ( + GNET_PROPERTY(prefer_compressed_gnet) && + (n->flags & NODE_F_INCOMING) && + !(n->attrs & NODE_A_CAN_INFLATE) && + connected >= GNET_PROPERTY(up_connections) && + connected > compressed_node_cnt + ) { + node_send_error(n, 403, + "Gnet connection not compressed"); + node_remove(n, _("Connection not compressed")); + return FALSE; + } + } else if ( + GNET_PROPERTY(node_normal_count) + GNET_PROPERTY(node_ultra_count) + > GNET_PROPERTY(max_connections) + ) { + node_bye(n, 503, "Too many Gnet connections (%d max)", + GNET_PROPERTY(max_connections)); + return FALSE; + } break; - case NODE_P_ULTRA: - gnet_prop_incr_guint32(PROP_NODE_ULTRA_COUNT); + case NODE_P_LEAF: + + /* Even forced connections are not acceptable unless + * the remote node is an ultrapeer. Note: There is also + * an assertion in node_process_handshake_header(). + */ + if ((n->flags & NODE_F_FORCE) && (n->attrs & NODE_A_ULTRA)) + return TRUE; + + if (handshaking) { + /* + * If we're a leaf node, we can only accept incoming connections + * from an ultra node. + * + * The Ultrapeer specs say that two leaf nodes not finding + * Ultrapeers could connect to each other like two normal nodes, + * but I don't want to support that. It's insane. + * --RAM, 11/01/2003 + */ + + if (!(n->attrs & NODE_A_ULTRA)) { + node_send_error(n, 204, "Shielded leaf node (%d peers max)", + GNET_PROPERTY(max_ultrapeers)); + node_remove(n, _("Sent shielded indication")); + return FALSE; + } + + if (!(n->attrs & NODE_A_ULTRA)) { + node_send_error(n, 503, "Looking for an ultra node"); + node_remove(n, _("Not an ultra node")); + return FALSE; + } + + if ( + GNET_PROPERTY(node_ultra_count) >= GNET_PROPERTY(max_ultrapeers) + ) { + node_send_error(n, 503, "Too many ultra connections (%d max)", + GNET_PROPERTY(max_ultrapeers)); + node_remove(n, _("Too many ultra nodes (%d max)"), + GNET_PROPERTY(max_ultrapeers)); + return FALSE; + } + + /* + * Honour the prefer compressed connection setting. Even when making + * outgoing connections in leaf mode + * -- JA 24/5/2003 + */ + if ( + GNET_PROPERTY(prefer_compressed_gnet) && + GNET_PROPERTY(up_connections) + <= GNET_PROPERTY(node_ultra_count) - compressed_node_cnt && + !(n->attrs & NODE_A_CAN_INFLATE) + ) { + node_send_error(n, 403, + "Compressed connection preferred"); + node_remove(n, _("Connection not compressed")); + return FALSE; + } + } else if ( + GNET_PROPERTY(node_ultra_count) > GNET_PROPERTY(max_ultrapeers) + ) { + node_bye(n, 503, "Too many ultra connections (%d max)", + GNET_PROPERTY(max_ultrapeers)); + return FALSE; + } break; case NODE_P_AUTO: case NODE_P_CRAWLER: case NODE_P_UDP: case NODE_P_DHT: + case NODE_P_G2HUB: case NODE_P_UNKNOWN: + g_assert_not_reached(); break; } +check_for_bad_nodes: + /* - * Determine the frequency at which we will send "alive pings", and at - * which we shall accept regular pings on that connection. + * If a specific client version has proven to be very unstable during this + * version, don't connect to it. + * -- JA 17/7/200 */ - n->ping_throttle = PING_REG_THROTTLE; + if ((n->attrs & NODE_A_ULTRA) || NODE_TALKS_G2(n)) { + const char *msg = N_("Unknown error"); + enum node_bad bad = node_is_bad(n); - switch ((node_peer_t) GNET_PROPERTY(current_peermode)) { - case NODE_P_NORMAL: - n->alive_period = ALIVE_PERIOD; - break; - case NODE_P_ULTRA: - if (n->peermode == NODE_P_LEAF) { - n->alive_period = ALIVE_PERIOD_LEAF; - n->ping_throttle = PING_LEAF_THROTTLE; - } else - n->alive_period = ALIVE_PERIOD; - break; - case NODE_P_LEAF: - n->alive_period = ALIVE_PERIOD_LEAF; - break; - case NODE_P_AUTO: - case NODE_P_CRAWLER: - case NODE_P_UDP: - case NODE_P_DHT: - case NODE_P_UNKNOWN: - g_error("Invalid peer mode %d", GNET_PROPERTY(current_peermode)); - break; + switch (bad) { + case NODE_BAD_OK: + break; + case NODE_BAD_IP: + msg = N_("Unstable IP address"); + break; + case NODE_BAD_VENDOR: + msg = N_("Servent version appears unstable"); + break; + case NODE_BAD_NO_VENDOR: + msg = N_("No vendor string supplied"); + break; + } + + if (NODE_BAD_OK != bad) { + node_send_error(n, 403, "%s", msg); + node_remove(n, _("Not connecting: %s"), _(msg)); + return FALSE; + } + } + + g_assert(n->status != GTA_NODE_REMOVING); + + return TRUE; +} + +/** + * Inject any pending data in the socket buffer into the RX stack. + * + * This is only required when we are the node processing the final handshake + * acknoledgment, because Gnutella traffic will start right away and could + * even have been received. + */ +static void +node_inject_rx(gnutella_node_t *n) +{ + gnutella_socket_t *s = n->socket; + + /* + * If we already have data following the final acknowledgment, feed it + * to to stack, from the bottom: we already read it into the socket's + * buffer, but we need to inject it at the bottom of the RX stack. + */ + + socket_buffer_check(s); + + if (s->pos > 0) { + pdata_t *db; + pmsg_t *mb; + + if (GNET_PROPERTY(node_debug) > 4) { + g_debug("%s(): read %d bytes from %s after handshake", + G_STRFUNC, (int) s->pos, node_infostr(n)); + } + + /* + * Prepare data buffer out of the socket's buffer. + */ + + db = pdata_allocb_ext(s->buf, s->pos, pdata_free_nop, NULL); + mb = pmsg_alloc(PMSG_P_DATA, db, 0, s->pos); + + /* + * The message is given to the RX stack, and it will be freed by + * the last function consuming it. + */ + + rx_recv(rx_bottom(n->rx), mb); + + /* + * During rx_recv the node could be marked for removal again. In which + * case the socket is freed, so let's exit now. + * -- JA 14/04/04 + */ + + if (NODE_IS_REMOVING(n)) + return; + + g_assert(n->socket == s); + g_assert(s != NULL); + + /* + * We know that the message is synchronously delivered. At this + * point, all the data have been consumed, and the socket buffer + * can be "emptied" my marking it holds zero data. + */ + + s->pos = 0; + } +} + +/** + * Finalize the 3-way handshake for an incoming connection. + * + * When this routine is called, we have processed the final handshake reply + * from the remote host (which is connecting to us), the TX and RX stack + * have been setup. + * + * We now need to verify that we can indeed converse with that node. + * + * @return TRUE if we maintain the connection, FALSE if we BYE-ed the node. + */ +static bool +node_finalize_3way(gnutella_node_t *n) +{ + struct gnutella_socket *s = n->socket; + + g_assert(n->rx != NULL); /* Network stacks installed, for BYE */ + socket_check(s); + + /* + * Now that the Gnutella stack is up, BYE the node if we don't really + * support the right version for the necessary protocols. + */ + + if (NODE_TALKS_G2(n)) { + if (0 == (n->attrs2 & NODE_A2_G2_HUB)) { + node_bye(n, 505, "Wanted a G2 hub"); + return FALSE; + } + } else { + if (GNET_PROPERTY(current_peermode) != NODE_P_NORMAL) { + /* + * BYE them if they finally declared to use a protocol we don't + * support yet, despite their knowing that we only support the + * 0.2 version, as advertised in our reply to their incoming + * request: lack of final indication they want to level with us + * means they can't level, therefore we cannot accept the + * connection. + * + * This is new logic because prior to today, we were only BYE-ing + * them when they mentionned a protocol in the last handshake + * reply. Now we assume that, since Gnutella is no longer actively + * maintained (the specs, that is), there is no way we can grasp + * what a higher protocol would mean, whether it is compatible + * with an earlier version, etc... + * --RAM, 2015-11-22 + */ + + if (n->qrp_major > 0 || n->qrp_minor > 2) { + node_bye(n, 505, "Query Routing protocol %u.%u not supported", + (uint) n->qrp_major, (uint) n->qrp_minor); + return FALSE; + } + } } /* + * This is legacy code -- at some point we want to remove that logic + * since there is no reason why we would want to disable receiving + * compressed data. + * --RAM, 2015-11-22 + */ + + if ( + !GNET_PROPERTY(gnet_deflate_enabled) && + (n->attrs & NODE_A_RX_INFLATE) + ) { + g_warning("Content-Encoding \"deflate\" although disabled - from %s", + node_infostr(n)); + node_bye(n, 400, "Refusing remote node compression"); + return FALSE; + } + + /* + * Make sure we do not exceed our maximum amout of connections. + * In particular, if the remote node did not obey our leaf guidance + * and we still have enough ultra nodes, BYE them. + */ + + if (!node_can_accept_connection(n, FALSE)) + return FALSE; + + /* + * Since this is the third and final acknowledgement, the remote node + * is ready to send Gnutella or G2 data (and so are we, now that we got + * the final ack). Mark the connection as fully established, which means + * we'll be able to relay traffic to this node. + */ + + n->flags |= NODE_F_ESTABLISHED; + + return TRUE; /* We can continue with this node */ +} + +/** + * Create the TX and RX network stacks. + * + * @return the TX stack, the RX stack being registered in n->rx. + */ +static txdrv_t * +node_net_stack_create(gnutella_node_t *n) +{ + gnet_host_t host; + txdrv_t *tx; + + g_assert(NULL == n->rx); + + /* * Create the RX stack, and enable reception of data. */ @@ -3843,7 +4804,7 @@ struct rx_inflate_args args; if (GNET_PROPERTY(node_debug) > 4) - g_debug("receiving compressed data from node %s", node_addr(n)); + g_debug("receiving compressed data from %s", node_infostr(n)); args.cb = &node_rx_inflate_cb; @@ -3854,12 +4815,12 @@ compressed_node_cnt++; } - rx_set_data_ind(n->rx, node_data_ind); + rx_set_data_ind(n->rx, NODE_TALKS_G2(n) ? node_g2_data_ind : node_data_ind); rx_enable(n->rx); n->flags |= NODE_F_READABLE; /* - * Create the TX stack, as we're going to transmit Gnet messages. + * Create the TX stack, as we're going to transmit messages. */ { @@ -3882,9 +4843,9 @@ txdrv_t *ctx; if (GNET_PROPERTY(node_debug) > 4) - g_debug("sending compressed data to node %s", node_addr(n)); + g_debug("sending compressed data to %s", node_infostr(n)); - args.cq = callout_queue; + args.cq = cq_main(); args.cb = &node_tx_deflate_cb; args.nagle = TRUE; args.gzip = FALSE; @@ -3896,16 +4857,222 @@ if (ctx == NULL) { tx_free(tx); node_remove(n, _("Cannot setup compressing TX stack")); - return; + return NULL; } tx = ctx; /* Use compressing stack */ } - g_assert(tx); + g_assert(tx != NULL); + + return tx; +} + +static struct mq_uops node_mq_cb = { + gmsg_cmp, /* msg_cmp */ + gmsg_headcmp, /* msg_headcmp */ + gmsg_mq_templates, /* msg_templates */ + node_msg_accounting, /* msg_sent */ + node_msg_flowc, /* msg_flowc */ + node_msg_queued, /* msg_queued */ + gmsg_log_dropped_pmsg, /* msg_log */ +}; + +static struct mq_uops node_g2_mq_cb = { + node_g2_msg_zero, /* msg_cmp */ + node_g2_msg_zero, /* msg_headcmp */ + NULL, /* msg_templates -- can be NULL */ + node_g2_msg_accounting, /* msg_sent */ + node_g2_msg_flowc, /* msg_flowc */ + node_g2_msg_queued, /* msg_queued */ + g2_msg_log_dropped_pmsg, /* msg_log */ +}; + +/** + * Called when we know that we're connected to the node, at the end of + * the handshaking (both for incoming and outgoing connections). + */ +static void +node_is_now_connected(gnutella_node_t *n) +{ + bool peermode_changed = FALSE; + txdrv_t *tx; + const struct mq_uops *uops; + + node_check(n); + socket_check(n->socket); + + /* + * Cleanup hanshaking objects. + */ + + if (n->io_opaque) /* None for outgoing 0.4 connections */ + io_free(n->io_opaque); + getline_free_null(&n->socket->getline); + + /* + * Terminate crawler connection that goes through the whole 3-way + * handshaking protocol. + */ + + if (n->flags & NODE_F_CRAWLER) { + node_remove(n, _("Sent crawling info")); + return; + } + + /* + * If they want a TLS upgrade, and the socket is not yet TLS-capable, + * then perform it. Once done, we'll come back here, but if it fails + * the socket will be closed!. + * + * Endless recursion is prevented by the check for TLS on the socket. + */ + + if (!socket_uses_tls(n->socket) && (n->attrs2 & NODE_A2_SWITCH_TLS)) { + if (GNET_PROPERTY(node_debug)) { + g_debug("%s(): requesting TLS upgrade for %s", + G_STRFUNC, node_infostr(n)); + } + socket_tls_upgrade(n->socket, (notify_fn_t) node_is_now_connected, n); + return; + } + + /* + * Make sure we did not change peermode whilst performing the 3-way + * handshaking with this node. + */ + + peermode_changed = + n->start_peermode != GNET_PROPERTY(current_peermode) || + n->start_peermode != peermode.new; + + /* + * Determine correct peer mode. + * + * If we're a leaf node and we connected to an ultranode, send it + * our query routing table. + */ + + n->peermode = NODE_TALKS_G2(n) ? NODE_P_G2HUB : NODE_P_NORMAL; + + if (n->flags & NODE_F_ULTRA) { + n->peermode = NODE_P_ULTRA; + } else if (n->flags & NODE_F_LEAF) { + if (settings_is_ultra()) + n->peermode = NODE_P_LEAF; + } else if (n->attrs & NODE_A_ULTRA) + n->peermode = NODE_P_ULTRA; + + /* + * If peermode did not change, current_peermode = leaf => node is Ultra + * or node is a G2 Hub + */ + + g_assert(peermode_changed || !settings_is_leaf() + || NODE_IS_ULTRA(n) || NODE_TALKS_G2(n)); + + /* + * Update state, and mark node as valid. + */ + + g_assert(n->status != GTA_NODE_REMOVING); + + n->status = GTA_NODE_CONNECTED; + n->flags |= NODE_F_VALID; + n->last_update = n->connect_date = tm_time(); + + if (NODE_IS_ULTRA(n)) { + sl_up_nodes = pslist_prepend(sl_up_nodes, n); + } + + connected_node_cnt++; + + /* + * Count nodes by type. + */ + + switch (n->peermode) { + case NODE_P_LEAF: + gnet_prop_incr_guint32(PROP_NODE_LEAF_COUNT); + break; + case NODE_P_NORMAL: + gnet_prop_incr_guint32(PROP_NODE_NORMAL_COUNT); + break; + case NODE_P_ULTRA: + gnet_prop_incr_guint32(PROP_NODE_ULTRA_COUNT); + break; + case NODE_P_G2HUB: + gnet_prop_incr_guint32(PROP_NODE_G2_COUNT); + break; + case NODE_P_AUTO: + case NODE_P_CRAWLER: + case NODE_P_UDP: + case NODE_P_DHT: + case NODE_P_UNKNOWN: + break; + } + + /* + * Determine the frequency at which we will send "alive pings", and at + * which we shall accept regular pings on that connection. + * + * For G2 connections, we are a leaf node therefore we can only receive + * alive pings from the G2 hubs, hence there is no throttling to do. + */ + + if (NODE_TALKS_G2(n)) { + n->ping_throttle = 0; /* Unused for G2 anyway */ + n->alive_period = ALIVE_PERIOD_LEAF; + } else { + n->ping_throttle = PING_REG_THROTTLE; + + switch ((node_peer_t) GNET_PROPERTY(current_peermode)) { + case NODE_P_NORMAL: + n->alive_period = ALIVE_PERIOD; + break; + case NODE_P_ULTRA: + if (n->peermode == NODE_P_LEAF) { + n->alive_period = ALIVE_PERIOD_LEAF; + n->ping_throttle = PING_LEAF_THROTTLE; + } else + n->alive_period = ALIVE_PERIOD; + break; + case NODE_P_LEAF: + n->alive_period = ALIVE_PERIOD_LEAF; + break; + case NODE_P_AUTO: + case NODE_P_CRAWLER: + case NODE_P_UDP: + case NODE_P_DHT: + case NODE_P_G2HUB: + case NODE_P_UNKNOWN: + g_error("Invalid peer mode %d", GNET_PROPERTY(current_peermode)); + break; + } + } + + /* + * Create the TX / RX network stack and install the message queue + * on top of the TX stack. + */ + + tx = node_net_stack_create(n); + + if (NULL == tx) + return; /* Node already removed by node_net_stack_create() */ + + uops = NODE_TALKS_G2(n) ? &node_g2_mq_cb : &node_mq_cb; - n->outq = mq_tcp_make(GNET_PROPERTY(node_sendqueue_size), n, tx); + n->outq = mq_tcp_make(GNET_PROPERTY(node_sendqueue_size), n, tx, uops); n->flags |= NODE_F_WRITABLE; + + /* + * If we have an incoming connection, check that we can talk to it. + */ + + if ((n->flags & NODE_F_INCOMING) && !node_finalize_3way(n)) + return; + n->alive_pings = alive_make(n, n->alive_period == ALIVE_PERIOD ? ALIVE_MAX_PENDING : ALIVE_MAX_PENDING_LEAF); @@ -3914,7 +5081,7 @@ * dynamic querying, so there is no need for a per-node search queue. */ - if (!settings_is_ultra()) + if (!settings_is_ultra() || NODE_TALKS_G2(n)) n->searchq = sq_make(n); /* @@ -3934,7 +5101,7 @@ * Terminate connection if the peermode changed during handshaking. */ - if (peermode_changed) { + if (peermode_changed && !NODE_TALKS_G2(n)) { node_bye(n, 504, "Switched between Leaf/Ultra during handshake"); return; } @@ -3942,14 +5109,19 @@ /* * Initiate QRP sending if we're a leaf node or if we're an ultra node * and the remote note is an UP supporting last-hop QRP. + * + * If the remote node is a G2 hub, we're acting as a leaf node so we + * also need to send our QRP. */ if ( - NODE_IS_ULTRA(n) && ( - settings_is_leaf() || - (settings_is_ultra() && (n->attrs & NODE_A_UP_QRP)) - ) + NODE_IS_ULTRA(n) && + ( + settings_is_leaf() || + (settings_is_ultra() && (n->attrs & NODE_A_UP_QRP)) + ) + ) || NODE_TALKS_G2(n) ) { struct routing_table *qrt = qrt_get_table(); @@ -3979,12 +5151,18 @@ /* * If we have an incoming connection, send an "alive" ping. * Otherwise, send a "handshaking" ping. + * + * On a G2 connection, send our local node info. */ - if (n->flags & NODE_F_INCOMING) - alive_send_ping(n->alive_pings); - else - pcache_outgoing_connection(n); /* Will send proper handshaking ping */ + if (NODE_TALKS_G2(n)) { + g2_node_send_lni(n); + } else { + if (n->flags & NODE_F_INCOMING) + alive_send_ping(n->alive_pings); + else + pcache_outgoing_connection(n); /* Send proper handshaking ping */ + } /* * If node supports vendor-specific messages, advertise the set we support. @@ -4004,12 +5182,12 @@ * our leaves and by our neighbours. */ - if (settings_is_ultra()) { + if (settings_is_ultra() && !NODE_TALKS_G2(n)) { if (NODE_IS_LEAF(n)) - n->qseen = g_hash_table_new(g_str_hash, g_str_equal); + n->qseen = htable_create(HASH_KEY_STRING, 0); else { if (GNET_PROPERTY(node_watch_similar_queries)) { - n->qrelayed = g_hash_table_new(g_str_hash, g_str_equal); + n->qrelayed = hset_create(HASH_KEY_STRING, 0); n->qrelayed_created = tm_time(); } } @@ -4028,29 +5206,55 @@ */ wq_wakeup(func_to_pointer(node_add), n); + + + /* + * If this is an incoming connection, we need to process data that + * are possibly still pending in the socket buffer. + * + */ + + if (n->flags & NODE_F_INCOMING) + node_inject_rx(n); + + /* + * We don't need the socket buffer any more: all the data is now read + * via the RX stack into allocated RX buffers. + * --RAM, 2015-11-22 + * + * However, the node can have been removed during the processing of + * the injected data above, so be careful: its socket will have been + * nullified in that case. + * --RAM, 2015-11-25 + */ + + node_check(n); + + if (n->socket != NULL) + socket_free_buffer(n->socket); } /** * Received a Bye message from remote node. */ static void -node_got_bye(struct gnutella_node *n) +node_got_bye(gnutella_node_t *n) { - guint16 code; + uint16 code; const char *message = n->data + 2; const char *p; - guchar c; - guint cnt; - gboolean warned = FALSE; - gboolean is_plain_message = TRUE; - guint message_len = n->size - 2; + uchar c; + uint cnt; + bool warned = FALSE; + bool is_plain_message = TRUE; + uint message_len = n->size - 2; code = peek_le16(n->data); /* * Codes are supposed to be 2xx, 4xx or 5xx. * - * But older GnucDNA wer bugged enough to forget about the code and + * But older GnucDNA were bugged enough to forget about the code and * started to emit the message right away. Fortunately, we can * detect this because the two ASCII bytes will make the code * appear out of range... We force code 901 when we detect and @@ -4060,8 +5264,8 @@ */ if (code > 999) { - guchar c1 = n->data0; - guchar c2 = n->data1; + uchar c1 = n->data0; + uchar c2 = n->data1; if (is_ascii_alnum(c1) && is_ascii_alnum(c2)) { message = n->data; @@ -4129,9 +5333,9 @@ * Whether they want to be "online" within Gnutella or not. */ void -node_set_online_mode(gboolean on) +node_set_online_mode(bool on) { - GSList *sl; + pslist_t *sl; if (allow_gnet_connections == on) /* No change? */ return; @@ -4145,8 +5349,8 @@ * They're disallowing Gnutella connections. */ - for (sl = sl_nodes; sl; sl = g_slist_next(sl)) { - struct gnutella_node *n = sl->data; + PSLIST_FOREACH(sl_nodes, sl) { + gnutella_node_t *n = sl->data; if (n->status == GTA_NODE_REMOVING) continue; @@ -4191,25 +5395,27 @@ switch (mode) { case NODE_P_NORMAL: - msg = "normal"; - node_bye_flags(NODE_F_LEAF, 203, "Becoming a regular node"); - if (old_mode == NODE_P_LEAF) - node_bye_flags(NODE_F_ULTRA, 203, "Becoming a regular node"); + g_error("normal mode no longer supported"); break; case NODE_P_ULTRA: msg = "ultra"; - if (old_mode == NODE_P_LEAF) + if (old_mode == NODE_P_LEAF) { node_bye_flags(NODE_F_ULTRA, 203, "Becoming an ultra node"); + routing_clear_all(); + } break; case NODE_P_LEAF: msg = "leaf"; - if (old_mode != NODE_P_LEAF) + if (old_mode != NODE_P_LEAF) { node_bye_flags(0xffffffff, 203, "Becoming a leaf node"); + routing_clear_all(); + } break; case NODE_P_AUTO: case NODE_P_CRAWLER: case NODE_P_UDP: case NODE_P_DHT: + case NODE_P_G2HUB: case NODE_P_UNKNOWN: g_error("unhandled mode %d", mode); break; @@ -4217,7 +5423,7 @@ g_assert(msg != NULL); if (GNET_PROPERTY(node_debug) > 2) - g_debug("Switching to \"%s\" peer mode", msg); + g_debug("%s(): switching to \"%s\" peer mode", G_STRFUNC, msg); if (old_mode != NODE_P_UNKNOWN) { /* Not at init time */ bsched_set_peermode(mode); /* Adapt Gnet bandwidth */ @@ -4245,14 +5451,14 @@ * * @return TRUE if parsed correctly, FALSE on errors. */ -static gboolean +static bool parse_ip_port(const char *str, const char **endptr, - host_addr_t *addr_ptr, guint16 *port_ptr) + host_addr_t *addr_ptr, uint16 *port_ptr) { const char *s = str; host_addr_t addr; - guint16 port; - gboolean ret = FALSE; + uint16 port; + bool ret = FALSE; s = skip_ascii_spaces(s); if (!string_to_host_addr(s, &s, &addr) || !is_host_addr(addr)) { @@ -4261,7 +5467,7 @@ } if (':' == s0) { - guint32 u; + uint32 u; int error; s++; @@ -4278,7 +5484,7 @@ *addr_ptr = addr; ret = TRUE; - + done: if (endptr) *endptr = s; @@ -4289,17 +5495,17 @@ return ret; } -static guint +static uint feed_host_cache_from_string(const char *s, host_type_t type, const char *name) { - guint n; + uint n; - g_assert((guint) type < HOST_MAX); + g_assert((uint) type < HOST_MAX); g_assert(s); for (n = 0; NULL != s; s = strchr(s, ',')) { host_addr_t addr; - guint16 port; + uint16 port; if (',' == s0) s++; @@ -4318,25 +5524,25 @@ purge_host_cache_from_hub_list(const char *s) { g_assert(s); - + for (; NULL != s; s = strchr(s, ',')) { host_addr_t addr; - guint16 port = 0; - + uint16 port = 0; + if (',' == s0) s++; - + if (!parse_ip_port(s, &s, &addr, &port)) - continue; + continue; if (GNET_PROPERTY(node_debug)) { g_debug("Purging %s:%u from hostcache...", host_addr_to_string(addr), port); } - + hcache_purge(HCACHE_CLASS_HOST, addr, port); } - + return; } @@ -4350,8 +5556,8 @@ * * @return TRUE if we were able to intuit an address. */ -static gboolean -node_intuit_address(struct gnutella_node *n, header_t *header) +static bool +node_intuit_address(gnutella_node_t *n, header_t *header) { static const char *fields = { "Node", @@ -4359,17 +5565,25 @@ "Listen-Ip", "X-My-Address", }; - guint i; + uint i; - for (i = 0; i < G_N_ELEMENTS(fields); i++) { + for (i = 0; i < N_ITEMS(fields); i++) { const char *val = header_get(header, fieldsi); host_addr_t addr; - guint16 port; + uint16 port; if (val != NULL && parse_ip_port(val, NULL, &addr, &port)) { - n->gnet_port = port; - if (host_address_is_usable(addr)) + if (host_address_is_usable(addr)) { + node_ht_connected_nodes_remove(n); n->gnet_addr = addr; + if (port_is_valid(port)) + n->gnet_port = port; + node_ht_connected_nodes_add(n); + } else if (n->gnet_port != port && port_is_valid(port)) { + node_ht_connected_nodes_remove(n); + n->gnet_port = port; + node_ht_connected_nodes_add(n); + } return TRUE; } } @@ -4400,17 +5614,18 @@ * "My-Address" | "Node" | "Try" | "Try-Ultrapeers" * */ -guint +uint feed_host_cache_from_headers(header_t *header, - host_type_t sender, gboolean gnet, const host_addr_t peer, + host_type_t sender, bool gnet, const host_addr_t peer, const char *vendor) { static const struct { const char *name; /* Name of the header */ - gboolean sender; /* Host type is derived from sender */ - gboolean gnet; /* Definitely a Gnutella network header */ + bool sender; /* Host type is derived from sender */ + bool gnet; /* Definitely a Gnutella network header */ host_type_t type; /* Default type, sender will override */ } headers = { + /* name, sender, gnet, type */ { "X-Alt", FALSE, FALSE, HOST_ANY }, { "X-Listen-Ip", TRUE, TRUE, HOST_ANY }, { "X-My-Address", TRUE, TRUE, HOST_ANY }, @@ -4418,17 +5633,18 @@ { "X-Node-IPv6", TRUE, TRUE, HOST_ANY }, { "X-Try", FALSE, TRUE, HOST_ANY }, { "X-Try-Ultrapeers", FALSE, TRUE, HOST_ULTRA }, + { "X-Try-Hubs", FALSE, TRUE, HOST_G2HUB }, }; - guint i, n = 0; + uint i, n = 0; g_assert(header); g_assert(UNSIGNED(sender) < HOST_MAX); for (;;) { - for (i = 0; i < G_N_ELEMENTS(headers); i++) { + for (i = 0; i < N_ITEMS(headers); i++) { const char *val, *name, *p; host_type_t type; - guint r; + uint r; /* * One cannot assume that the same port will always be used for @@ -4453,8 +5669,9 @@ if (GNET_PROPERTY(node_debug) > 0) { if (r > 0) - g_debug("peer %s sent %u pong%s in %s header", - host_addr_to_string(peer), r, 1 == r ? "" : "s", name); + g_debug("peer %s sent %u pong%s in %s header (%s)", + host_addr_to_string(peer), r, plural(r), name, + host_type_to_string(type)); else g_debug("peer %s <%s> sent unparseable %s header: \"%s\"", host_addr_to_string(peer), vendor, name, val); @@ -4473,15 +5690,16 @@ * The node is only given for tracing purposes. */ static void -extract_header_pongs(header_t *header, struct gnutella_node *n) +extract_header_pongs(header_t *header, gnutella_node_t *n) { feed_host_cache_from_headers(header, + NODE_P_G2HUB == n->peermode ? HOST_G2HUB : NODE_P_ULTRA == n->peermode ? HOST_ULTRA : HOST_ANY, TRUE, n->addr, node_vendor(n)); } -static inline gboolean -extract_addr_debugging(guint32 level) +static inline bool +extract_addr_debugging(uint32 level) { return GNET_PROPERTY(node_debug) > level || @@ -4565,8 +5783,8 @@ char bufHOST_ADDR_BUFLEN; host_addr_to_string_buf(addr, buf, sizeof buf); - g_message("peer %s reported different IP address: %s (%s)\n", - host_addr_to_string(peer), buf, ua); + g_message("%s(): peer %s (%s) reported new IP address: %s", + G_STRFUNC, host_addr_to_string(peer), ua, buf); } } @@ -4584,16 +5802,16 @@ * If `code' is not NULL, it is filled with the returned code, or -1 if * we were unable to parse the status. */ -static gboolean -analyse_status(struct gnutella_node *n, int *code) +static bool +analyse_status(gnutella_node_t *n, int *code) { struct gnutella_socket *s = n->socket; const char *status; int ack_code; - guint major = 0, minor = 0; + uint major = 0, minor = 0; const char *ack_message = ""; - gboolean ack_ok = FALSE; - gboolean incoming = (n->flags & NODE_F_INCOMING) ? TRUE : FALSE; + bool ack_ok = FALSE; + bool incoming = (n->flags & NODE_F_INCOMING) ? TRUE : FALSE; const char *what = incoming ? "acknowledgment" : "reply"; socket_check(s); @@ -4673,373 +5891,55 @@ } /** - * Can node accept connection? - * - * If `handshaking' is true, we're still in the handshaking phase, otherwise - * we're already connected and can send a BYE. - * - * @return TRUE if we can accept the connection, FALSE otherwise, with - * the node being removed. + * Send a "Protocol not acceptable" error to node, denying handshaking. */ -static gboolean -node_can_accept_connection(struct gnutella_node *n, gboolean handshaking) +static void +node_send_protocol_not_acceptable(gnutella_node_t *n, const char *protocol) { - g_assert(handshaking || n->status == GTA_NODE_CONNECTED); - g_assert(n->attrs & (NODE_A_NO_ULTRA|NODE_A_CAN_ULTRA)); - - /* - * Deny cleanly if they deactivated "online mode". - */ + static const char msg = N_("Protocol not acceptable"); - if (handshaking && !allow_gnet_connections) { - node_send_error(n, 403, - "Gnet connections currently disabled"); - node_remove(n, _("Gnet connections disabled")); - return FALSE; + if (GNET_PROPERTY(node_debug)) { + g_warning("rejecting non-acceptable protocol \"%s\" from %s", + NULL == protocol ? "" : protocol, node_infostr(n)); } - /* - * Always accept crawler connections. - */ - - if (n->flags & NODE_F_CRAWLER) - return TRUE; - - /* - * If we are handshaking, we have not incremented the node counts yet. - * Hence we can do >= tests against the limits. - */ - - switch ((node_peer_t) GNET_PROPERTY(current_peermode)) { - case NODE_P_ULTRA: - - if (n->flags & NODE_F_FORCE) - return TRUE; - - /* - * If we're an ultra node, we need to enforce leaf counts. - * - * We also enforce ultra node counts if we're issuing an outgoing - * connection, but for incoming ones, we'll try to let the other - * node become a leaf node, so don't enforce if we're still in the - * handshaking phase. - */ - - if (n->flags & NODE_F_LEAF) { - /* - * Try to preference compressed leaf nodes too - * -- JA, 08/06/2003 - */ - if ( - GNET_PROPERTY(prefer_compressed_gnet) && - GNET_PROPERTY(up_connections) <= - GNET_PROPERTY(node_leaf_count) - compressed_leaf_cnt && - !(n->attrs & NODE_A_CAN_INFLATE) - ) { - node_send_error(n, 403, - "Compressed connection prefered"); - node_remove(n, _("Connection not compressed")); - return FALSE; - } - - /* - * Remove leaves that do not allow queries when we are - * running out of slots. - */ - - if (GNET_PROPERTY(node_leaf_count) >= GNET_PROPERTY(max_leaves)) { - (void) node_remove_useless_leaf(NULL); - - /* - * It may happen than when we try to make up some room to - * remove a useless node, we do remove this node! - */ - - if (GTA_NODE_REMOVING == n->status) - return FALSE; - } - - if ( - handshaking && - GNET_PROPERTY(node_leaf_count) >= GNET_PROPERTY(max_leaves) - ) { - node_send_error(n, 503, "Too many leaf connections (%d max)", - GNET_PROPERTY(max_leaves)); - node_remove(n, _("Too many leaves (%d max)"), - GNET_PROPERTY(max_leaves)); - return FALSE; - } - if ( - !handshaking && - GNET_PROPERTY(node_leaf_count) > GNET_PROPERTY(max_leaves) - ) { - node_bye(n, 503, "Too many leaf connections (%d max)", - GNET_PROPERTY(max_leaves)); - return FALSE; - } - } else if (n->attrs & NODE_A_ULTRA) { - guint ultra_max; - - /* - * Try to preference compressed ultrapeer connections too - * -- JA, 08/06/2003 - */ - if ( - GNET_PROPERTY(prefer_compressed_gnet) && - GNET_PROPERTY(up_connections) <= - GNET_PROPERTY(node_ultra_count) - - (compressed_node_cnt - compressed_leaf_cnt) && - !(n->attrs & NODE_A_CAN_INFLATE) - ) { - node_send_error(n, 403, - "Compressed connection prefered"); - node_remove(n, _("Connection not compressed")); - return FALSE; - } - - ultra_max = GNET_PROPERTY(max_connections) > - GNET_PROPERTY(normal_connections) ? - GNET_PROPERTY(max_connections) - - GNET_PROPERTY(normal_connections) : - 0; - - if (GNET_PROPERTY(node_ultra_count) >= ultra_max) - (void) node_remove_useless_ultra(NULL); - - if ( - GNET_PROPERTY(node_ultra_count) >= ultra_max && - (n->attrs & NODE_A_CAN_INFLATE) - ) { - (void) node_remove_uncompressed_ultra(NULL); - } - - /* - * It may happen than when we try to make up some room to - * remove a useless node, we do remove this node! - */ - - if (GTA_NODE_REMOVING == n->status) - return FALSE; - - if ( - handshaking && - GNET_PROPERTY(node_ultra_count) >= ultra_max - ) { - node_send_error(n, 503, - "Too many ultra connections (%d max)", ultra_max); - node_remove(n, _("Too many ultra nodes (%d max)"), ultra_max); - return FALSE; - } - if (!handshaking && GNET_PROPERTY(node_ultra_count) > ultra_max) { - node_bye(n, 503, - "Too many ultra connections (%d max)", ultra_max); - return FALSE; - } - } - - /* - * Enforce preference for compression only with non-leaf nodes. - */ - - if (handshaking) { - guint connected; - - connected = GNET_PROPERTY(node_normal_count) - + GNET_PROPERTY(node_ultra_count); - - if ( - GNET_PROPERTY(prefer_compressed_gnet) && - !(n->attrs & NODE_A_CAN_INFLATE) && - ( - ((n->flags & NODE_F_INCOMING) && - connected >= GNET_PROPERTY(up_connections) && - connected > compressed_node_cnt) - || - (n->flags & NODE_F_LEAF) - ) - ) { - node_send_error(n, 403, - "Gnet connection not compressed"); - node_remove(n, _("Connection not compressed")); - return FALSE; - } - } - - /* - * If we have already enough normal nodes, reject a normal node. - */ - - if ( - handshaking && - (n->attrs & NODE_A_NO_ULTRA) && - GNET_PROPERTY(node_normal_count) - >= GNET_PROPERTY(normal_connections) - ) { - if (GNET_PROPERTY(normal_connections)) - node_send_error(n, 503, "Too many normal nodes (%d max)", - GNET_PROPERTY(normal_connections)); - else - node_send_error(n, 403, "Normal nodes refused"); - node_remove(n, _("Rejected normal node (%d max)"), - GNET_PROPERTY(normal_connections)); - return FALSE; - } - - break; - case NODE_P_NORMAL: - if (n->flags & NODE_F_FORCE) - return TRUE; - - if (handshaking) { - guint connected; - - connected = GNET_PROPERTY(node_normal_count) - + GNET_PROPERTY(node_ultra_count); - if ( - (n->attrs & (NODE_A_CAN_ULTRA|NODE_A_ULTRA)) == NODE_A_CAN_ULTRA - ) { - node_send_error(n, 503, "Cannot accept leaf node"); - node_remove(n, _("Rejected leaf node")); - return FALSE; - } - if (connected >= GNET_PROPERTY(max_connections)) { - node_send_error(n, 503, "Too many Gnet connections (%d max)", - GNET_PROPERTY(max_connections)); - node_remove(n, _("Too many nodes (%d max)"), - GNET_PROPERTY(max_connections)); - return FALSE; - } - if ( - GNET_PROPERTY(prefer_compressed_gnet) && - (n->flags & NODE_F_INCOMING) && - !(n->attrs & NODE_A_CAN_INFLATE) && - connected >= GNET_PROPERTY(up_connections) && - connected > compressed_node_cnt - ) { - node_send_error(n, 403, - "Gnet connection not compressed"); - node_remove(n, _("Connection not compressed")); - return FALSE; - } - } else if ( - GNET_PROPERTY(node_normal_count) + GNET_PROPERTY(node_ultra_count) - > GNET_PROPERTY(max_connections) - ) { - node_bye(n, 503, "Too many Gnet connections (%d max)", - GNET_PROPERTY(max_connections)); - return FALSE; - } - break; - case NODE_P_LEAF: - - /* Even forced connections are not acceptable unless - * the remote node is an ultrapeer. Note: There is also - * an assertion in node_process_handshake_header(). - */ - if ((n->flags & NODE_F_FORCE) && (n->attrs & NODE_A_ULTRA)) - return TRUE; - - if (handshaking) { - /* - * If we're a leaf node, we can only accept incoming connections - * from an ultra node. - * - * The Ultrapeer specs say that two leaf nodes not finding - * Ultrapeers could connect to each other like two normal nodes, - * but I don't want to support that. It's insane. - * --RAM, 11/01/2003 - */ - - if (!(n->attrs & NODE_A_ULTRA)) { - node_send_error(n, 204, "Shielded leaf node (%d peers max)", - GNET_PROPERTY(max_ultrapeers)); - node_remove(n, _("Sent shielded indication")); - return FALSE; - } - - if (!(n->attrs & NODE_A_ULTRA)) { - node_send_error(n, 503, "Looking for an ultra node"); - node_remove(n, _("Not an ultra node")); - return FALSE; - } + node_send_error(n, 406, msg); + node_remove(n, _(msg)); +} - if ( - GNET_PROPERTY(node_ultra_count) >= GNET_PROPERTY(max_ultrapeers) - ) { - node_send_error(n, 503, "Too many ultra connections (%d max)", - GNET_PROPERTY(max_ultrapeers)); - node_remove(n, _("Too many ultra nodes (%d max)"), - GNET_PROPERTY(max_ultrapeers)); - return FALSE; - } +/** + * Send a "Conflict" error to node, denying handshaking. + */ +static void +node_send_conflict(gnutella_node_t *n, const char *reason) +{ + static const char msg = N_("Conflict"); - /* - * Honour the prefer compressed connection setting. Even when making - * outgoing connections in leaf mode - * -- JA 24/5/2003 - */ - if ( - GNET_PROPERTY(prefer_compressed_gnet) && - GNET_PROPERTY(up_connections) - <= GNET_PROPERTY(node_ultra_count) - compressed_node_cnt && - !(n->attrs & NODE_A_CAN_INFLATE) - ) { - node_send_error(n, 403, - "Compressed connection prefered"); - node_remove(n, _("Connection not compressed")); - return FALSE; - } - } else if ( - GNET_PROPERTY(node_ultra_count) > GNET_PROPERTY(max_ultrapeers) - ) { - node_bye(n, 503, "Too many ultra connections (%d max)", - GNET_PROPERTY(max_ultrapeers)); - return FALSE; - } - break; - case NODE_P_AUTO: - case NODE_P_CRAWLER: - case NODE_P_UDP: - case NODE_P_DHT: - case NODE_P_UNKNOWN: - g_assert_not_reached(); - break; + if (GNET_PROPERTY(node_debug)) { + g_warning("rejecting conflicting request \"%s\" from %s", + NULL == reason ? "" : reason, node_infostr(n)); } - /* - * If a specific client version has proven to be very unstable during this - * version, don't connect to it. - * -- JA 17/7/200 - */ - - if (n->attrs & NODE_A_ULTRA) { - const char *msg = N_("Unknown error"); - enum node_bad bad = node_is_bad(n); + node_send_error(n, 409, msg); + node_remove(n, _(msg)); +} - switch (bad) { - case NODE_BAD_OK: - break; - case NODE_BAD_IP: - msg = N_("Unstable IP address"); - break; - case NODE_BAD_VENDOR: - msg = N_("Servent version appears unstable"); - break; - case NODE_BAD_NO_VENDOR: - msg = N_("No vendor string supplied"); - break; - } +/** + * Send a "Upgrade Missing" error to node, denying handshaking. + */ +static void +node_send_upgrade_missing(gnutella_node_t *n) +{ + static const char msg = N_("Upgrade Header Missing"); - if (NODE_BAD_OK != bad) { - node_send_error(n, 403, "%s", msg); - node_remove(n, _("Not connecting: %s"), _(msg)); - return FALSE; - } + if (GNET_PROPERTY(node_debug)) { + g_warning("rejecting handshake from %s: " + "requesting connection upgrade, without an Upgrade header", + node_infostr(n)); } - g_assert(n->status != GTA_NODE_REMOVING); - - return TRUE; + node_send_error(n, 400, msg); + node_remove(n, _(msg)); } /** @@ -5048,34 +5948,21 @@ * * @return TRUE if OK, FALSE if connection was denied. */ -static gboolean -node_can_accept_protocol(struct gnutella_node *n, header_t *head) +static bool +node_can_accept_protocol(gnutella_node_t *n, header_t *head) { const char *field; /* - * Accept -- protocols supported - * - * We ban ultrapeers claiming support for "application/x-gnutella2" if - * we are an ultranode ourselves. - * - * Study has shown that this closed protocol is not inter-operating - * well with Gnutella: it is more comparable to massive leaching. - * See the various GDF articles written on the subject that prove this. - * --RAM, 25/01/2003 + * Content-Type -- protocol used */ - field = header_get(head, "Accept"); + field = header_get(head, "Content-Type"); if ( - field && - settings_is_ultra() && - !(n->flags & NODE_F_LEAF) && - strtok_case_has(field, ",", "application/x-gnutella2") + field && !node_g2_active() && !NODE_TALKS_G2(n) && + strtok_case_has(field, ",", APP_G2) ) { - static const char msg = N_("Protocol not acceptable"); - - node_send_error(n, 406, msg); - node_remove(n, _(msg)); + node_send_protocol_not_acceptable(n, field); return FALSE; } @@ -5087,14 +5974,14 @@ * acknowledgement we get back after welcoming an incoming node. */ static void -node_process_handshake_ack(struct gnutella_node *n, header_t *head) +node_process_handshake_ack(gnutella_node_t *n, header_t *head) { struct gnutella_socket *s = n->socket; - gboolean ack_ok; + bool ack_ok; const char *field; - gboolean qrp_final_set = FALSE; socket_check(s); + g_assert(n->flags & NODE_F_INCOMING); if (GNET_PROPERTY(gnet_trace) & SOCK_TRACE_IN) { const char *status = getline_str(s->getline); @@ -5122,8 +6009,7 @@ * Get rid of the acknowledgment status line. */ - getline_free(s->getline); - s->getline = NULL; + getline_free_null(&s->getline); /* * Content-Encoding -- compression accepted by the remote side @@ -5134,154 +6020,76 @@ n->attrs |= NODE_A_RX_INFLATE; /* We shall decompress input */ } - if ( - !GNET_PROPERTY(gnet_deflate_enabled) && - (n->attrs & NODE_A_RX_INFLATE) - ) { - g_warning("Content-Encoding \"deflate\" although disabled - from %s", - node_infostr(n)); - node_bye(n, 400, "Compression was not accepted"); - return; - } - - - /* X-Ultrapeer -- support for ultra peer mode */ - - field = header_get(head, "X-Ultrapeer"); - if (field && 0 == ascii_strcasecmp(field, "false")) { - n->attrs &= ~NODE_A_ULTRA; - if (settings_is_ultra()) { - n->flags |= NODE_F_LEAF; /* Remote accepted to become leaf */ - if (GNET_PROPERTY(node_debug)) - g_debug("%s accepted to become our leaf", node_infostr(n)); - } - } - /* - * X-Query-Routing -- QRP protocol in use by remote servent (negotiated) - * - * This header is present in the 3rd handshake only when the two servents - * advertised different support. This last indication is the highest - * version supported by the remote end, that is less or equals to ours. - * (If not present, it means the remote end implicitly expects us to - * comply with his older version.) + * Connection -- are we going to upgrade to TLS? * - * If we don't support that version, we'll BYE the servent later. + * This only makes sense when the node has proposed to upgrade to TLS. */ - field = header_get(head, "X-Query-Routing"); - if (field) { - guint major, minor; - - parse_major_minor(field, NULL, &major, &minor); - if (major >= n->qrp_major || minor >= n->qrp_minor) - if (GNET_PROPERTY(node_debug)) g_warning( - "%s now claims QRP version %u.%u, " - "but advertised %u.%u earlier", - node_infostr(n), major, minor, - (guint) n->qrp_major, (guint) n->qrp_minor); - n->qrp_major = (guint8) major; - n->qrp_minor = (guint8) minor; - qrp_final_set = TRUE; + if (!socket_uses_tls(n->socket)) { + field = header_get(head, "Connection"); + if (field != NULL && 0 == ascii_strcasecmp(field, "upgrade")) { + if (n->attrs2 & NODE_A2_UPGRADE_TLS) + n->attrs2 |= NODE_A2_SWITCH_TLS; /* We can switch to TLS! */ + } } - /* - * Install new node. - */ - - g_assert(s->gdk_tag == 0); /* Removed before callback called */ + if (NODE_TALKS_G2(n)) { + /* X-Hub -- support for G2 hub mode */ - node_is_now_connected(n); - - if (n->status != GTA_NODE_CONNECTED) /* Something went wrong */ - return; + field = header_get(head, "X-Hub"); + if (NULL == field || 0 != ascii_strcasecmp(field, "false")) + n->attrs2 |= NODE_A2_G2_HUB; + } else { + /* X-Ultrapeer -- support for ultra peer mode */ - /* - * Now that the Gnutella stack is up, BYE the node if we don't really - * support the right version for the necessary protocols. - */ + field = header_get(head, "X-Ultrapeer"); + if (field && 0 == ascii_strcasecmp(field, "false")) { + n->attrs &= ~NODE_A_ULTRA; + if (settings_is_ultra()) { + n->flags |= NODE_F_LEAF; /* Remote accepted to become leaf */ + if (GNET_PROPERTY(node_debug)) + g_debug("%s accepted to become our leaf", node_infostr(n)); + } + } - if (GNET_PROPERTY(current_peermode) != NODE_P_NORMAL) { /* - * Only BYE them if they finally declared to use a protocol we - * don't support yet, despite their knowing that we only support - * the 0.2 version. + * X-Query-Routing -- QRP protocol in use by remote servent (negotiated) + * + * This header is present in the 3rd handshake only when the two + * servents advertised different support. This last indication is the + * highest version supported by the remote end, that is less or equal + * to ours. + * (If not present, it means the remote end implicitly expects us to + * comply with his older version.) + * + * If we don't support that version, we'll BYE the servent later. */ - if (qrp_final_set && (n->qrp_major > 0 || n->qrp_minor > 2)) { - node_bye(n, 505, "Query Routing protocol %u.%u not supported", - (guint) n->qrp_major, (guint) n->qrp_minor); - return; + field = header_get(head, "X-Query-Routing"); + if (field) { + uint major, minor; + + parse_major_minor(field, NULL, &major, &minor); + if (major >= n->qrp_major || minor >= n->qrp_minor) { + if (GNET_PROPERTY(node_debug)) g_warning( + "%s now claims QRP version %u.%u, " + "but advertised %u.%u earlier", + node_infostr(n), major, minor, + (uint) n->qrp_major, (uint) n->qrp_minor); + } + n->qrp_major = (uint8) major; + n->qrp_minor = (uint8) minor; } } /* - * Make sure we do not exceed our maximum amout of connections. - * In particular, if the remote node did not obey our leaf guidance - * and we still have enough ultra nodes, BYE them. - */ - - if (!node_can_accept_connection(n, FALSE)) - return; - - /* - * Since this is the third and final acknowledgement, the remote node - * is ready to send Gnutella data (and so are we, now that we got - * the final ack). Mark the Gnutella connection as fully established, - * which means we'll be able to relay traffic to this node. - */ - - n->flags |= NODE_F_ESTABLISHED; - - /* - * If we already have data following the final acknowledgment, feed it - * to to stack, from the bottom: we already read it into the socket's - * buffer, but we need to inject it at the bottom of the RX stack. + * Install new node. */ - socket_buffer_check(s); - - if (s->pos > 0) { - pdata_t *db; - pmsg_t *mb; - - if (GNET_PROPERTY(node_debug) > 4) - g_debug("read %d Gnet bytes from node %s after handshake", - (int) s->pos, node_addr(n)); - - /* - * Prepare data buffer out of the socket's buffer. - */ - - db = pdata_allocb_ext(s->buf, s->pos, pdata_free_nop, NULL); - mb = pmsg_alloc(PMSG_P_DATA, db, 0, s->pos); - - /* - * The message is given to the RX stack, and it will be freed by - * the last function consuming it. - */ - - rx_recv(rx_bottom(n->rx), mb); - - /* During rx_recv the node could be marked for removal again. In which - * case the socket is freed, so lets exit now. - * -- JA 14/04/04 - */ - if (NODE_IS_REMOVING(n)) - return; - - g_assert(n->socket == s); - g_assert(s != NULL); - - /* - * We know that the message is synchronously delivered. At this - * point, all the data have been consumed, and the socket buffer - * can be "emptied" my marking it holds zero data. - */ - - s->pos = 0; + g_assert(s->gdk_tag == 0); /* Removed before callback called */ - } + node_is_now_connected(n); } /** @@ -5289,7 +6097,7 @@ * in the reply to their handshake, as a pointer to static data. */ static const char * -node_query_routing_header(struct gnutella_node *n) +node_query_routing_header(gnutella_node_t *n) { /* * We're backward compatible with 0.1, i.e. we fully support that version. @@ -5308,15 +6116,27 @@ /** * Is node authentic? */ -static gboolean +static bool node_is_authentic(const char *vendor, const header_t *head) { - if (vendor) { + if (vendor != NULL) { if (is_strcaseprefix(vendor, "limewire/")) { return !header_get(head, "Bye-Packet") && header_get(head, "Remote-IP") && header_get(head, "Vendor-Message") && header_get(head, "Accept-Encoding"); + } else if (is_strcaseprefix(vendor, "shareaza ")) { + const char *field = header_get(head, "X-Ultrapeer"); + if (NULL == field) + return TRUE; + if (0 == ascii_strcasecmp(field, "false")) { + return TRUE; + } else { + const char *acc = header_get(head, "Accept"); + if (acc != NULL && !strtok_case_has(acc, ",", APP_GNUTELLA)) + return TRUE; /* G2 hub, using X-Ultrapeer */ + } + return FALSE; } } @@ -5327,7 +6147,7 @@ * Extract User-Agent information out of the header. */ static void -node_extract_user_agent(struct gnutella_node *n, const header_t *head) +node_extract_user_agent(gnutella_node_t *n, const header_t *head) { const char *field; @@ -5393,16 +6213,16 @@ * connections). */ static void -node_process_handshake_header(struct gnutella_node *n, header_t *head) +node_process_handshake_header(gnutella_node_t *n, header_t *head) { static const size_t gnet_response_max = 16 * 1024; char *gnet_response; size_t rw; int sent; const char *field; - gboolean incoming = (n->flags & NODE_F_INCOMING); + bool incoming = (n->flags & NODE_F_INCOMING); const char *what = incoming ? "HELLO reply" : "HELLO acknowledgment"; - const char *compressing = "Content-Encoding: deflate\r\n"; + bool need_content_type = FALSE; if (GNET_PROPERTY(gnet_trace) & SOCK_TRACE_IN) { g_debug("----Got %s handshaking headers from node %s:", @@ -5434,7 +6254,154 @@ */ node_extract_user_agent(n, head); /* Servent vendor identification */ - + + /* + * Accept -- if advertising an alien network, make sure we're supporting it. + * + * Shareaza advertises an Accept with APP_GNUTELLA when it connects + * to Gnutella, and even though there may be several protocols listed, + * we always favour Gnutella when present. + */ + + field = header_get(head, "Accept"); + need_content_type = field != NULL; + if (incoming) { + if (field && !strtok_case_has(field, ",", APP_GNUTELLA)) { + if (strtok_case_has(field, ",", APP_G2) && node_g2_active()) { + /* + * Now that we know the incoming connection is for a G2 node, + * we need to fix the accounting that was done when we did + * not know we would be talking to a G2 node. + */ + + total_nodes_connected--; + total_g2_nodes_connected++; + + n->attrs2 |= NODE_A2_TALKS_G2; + } else { + node_send_protocol_not_acceptable(n, field); + return; + } + } + } else if (NODE_TALKS_G2(n)) { + /* Issuing an outgoing connection as G2, we need an Accept with G2 */ + if (NULL == field || !strtok_case_has(field, ",", APP_G2)) { + node_send_protocol_not_acceptable(n, field); + return; + } + } else { + /* + * Issuing an outgoing connection to a Gnutella node which does not + * use the Accept header normally. If it does however, it must list + * the Gnutella protocol. + */ + if (field) { + if (!strtok_case_has(field, ",", APP_GNUTELLA)) { + node_send_protocol_not_acceptable(n, field); + return; + } + } + } + + /* + * Upgrade -- does remote host want to upgrade to TLS? + * + * This header only makes senses when the connection is not already + * using TLS, of course. + */ + + if (!socket_uses_tls(n->socket)) { + field = header_get(head, "Upgrade"); + if ( + field != NULL && + tls_enabled() && + strtok_case_has(field, ",", "TLS/1.0") + ) { + n->attrs2 |= NODE_A2_UPGRADE_TLS; + } + } + + /* + * Connection -- are we going to upgrade to TLS? + * + * This header can only be present for outgoing connction, and only + * makes sense when the node has proposed to upgrade to TLS. + */ + + if (!incoming && !socket_uses_tls(n->socket)) { + field = header_get(head, "Connection"); + if (field != NULL && 0 == ascii_strcasecmp(field, "upgrade")) { + /* + * We're parsing a reply to our handshake. If there is just + * a "Connection: Upgrade" and no "Upgrade" header, the + * client is buggy: it does not tell us what part of our + * upgrade request is accepted. + * + * If we don't support TLS, there's nothing to upgrade to. + */ + + if (!tls_enabled()) { + node_send_conflict(n, "upgrade to TLS"); + return; + } + + if (0 == (n->attrs2 & NODE_A2_UPGRADE_TLS)) { + node_send_upgrade_missing(n); + return; + } + + /* + * We saw the following in the handshake reply: + * + * Upgrade: TLS/1.0 + * Connection: Upgrade + * + * It means the remote server accepts to upgrade to TLS + * after completing the 3-way handshake (i.e. after getting + * our final reply). + */ + + n->attrs2 |= NODE_A2_SWITCH_TLS; /* We can switch to TLS! */ + } + } + + /* X-Ultrapeer -- support for ultra peer mode */ + + /* + * Shareaza 2.7.1.0 is broken (and maybe earlier versions as well) + * in that they send X-Ultrapeer instead of X-Hub when connecting + * as G2. Apparently, they cannot even live by the rules they have + * defined for G2. It's so sad, and the reason why we need to + * exclude G2 hosts from this block. + * --RAM, 2014-01-10 + */ + + if (!NODE_TALKS_G2(n)) { + field = header_get(head, "X-Ultrapeer"); + if (field) { + n->attrs |= NODE_A_CAN_ULTRA; + if (0 == ascii_strcasecmp(field, "true")) + n->attrs |= NODE_A_ULTRA; + else if (0 == ascii_strcasecmp(field, "false")) { + if (settings_is_ultra()) + n->flags |= NODE_F_LEAF; + } + } else { + /* + * BearShare 4.3.x decided to no longer send X-Ultrapeer on + * connection, but rather include the X-Ultrapeer-Needed header. + * Hopefully, only their UPs will send back such a header. + * --RAM, 01/11/2003 + */ + + field = header_get(head, "X-Ultrapeer-Needed"); + if (field) + n->attrs |= NODE_A_CAN_ULTRA | NODE_A_ULTRA; + else + n->attrs |= NODE_A_NO_ULTRA; + } + } + /* Node -- remote node Gnet IP/port information */ if (incoming) { @@ -5458,14 +6425,11 @@ * --RAM, 18/03/2002. */ - if (host_addr_equal(n->gnet_addr, n->addr)) { - node_ht_connected_nodes_remove(n->gnet_addr, n->gnet_port); - + if (host_addr_equiv(n->gnet_addr, n->addr)) { n->gnet_pong_addr = n->addr; /* Cannot lie about its IP */ n->flags |= NODE_F_VALID; - - node_ht_connected_nodes_add(n->gnet_addr, n->gnet_port); } + /* FIXME: What about LAN connections? Should we blindly accept * the reported external address? */ @@ -5475,7 +6439,7 @@ /* * Decline handshakes from closed P2P networks politely. */ - + field = header_get(head, "X-Auth-Challenge"); if (NULL == field) field = header_get(head, "FP-Auth-Challenge"); /* BearShare */ @@ -5494,46 +6458,64 @@ return; } - /* Pong-Caching -- ping/pong reduction scheme */ + /* + * Check that everything is OK so far for an outgoing connection: if + * they did not reply with 200, then there's no need for us to reply back. + */ - field = header_get(head, "Pong-Caching"); - if (field) { - guint major, minor; + if (!incoming) { + if (!analyse_status(n, NULL)) { + /* + * Make sure that we do not put private network 'hub' nodes in the + * Gnutella host cache. If the node replied with X-Try-Hubs, which + * is a G2 network, make sure we record the node's IP:port + * in the G2 cache as well, to prevent further connection attempts + * to that host. + */ - parse_major_minor(field, NULL, &major, &minor); - if (major != 0 && minor != 1) - if (GNET_PROPERTY(node_debug)) g_warning( - "node %s claims Pong-Caching version %u.%u", - node_addr(n), major, minor); - n->attrs |= NODE_A_PONG_CACHING; - } + field = header_get(head, "X-Try-Hubs"); + if (field) { + /* Remove node and suggestions from Gnutella caches */ + hcache_purge(HCACHE_CLASS_HOST, n->gnet_addr, n->gnet_port); + purge_host_cache_from_hub_list(field); + n->peermode = NODE_P_G2HUB; + extract_header_pongs(head, n); + } else { + n->peermode = (n->attrs & NODE_A_ULTRA) ? + NODE_P_ULTRA : NODE_P_LEAF; + extract_header_pongs(head, n); + } + return; /* node_remove() has freed s->getline */ + } + } - /* X-Ultrapeer -- support for ultra peer mode */ + /* X-Hub -- support for G2 hub mode */ - field = header_get(head, "X-Ultrapeer"); + field = header_get(head, "X-Hub"); + if (NODE_TALKS_G2(n) && NULL == field) + field = header_get(head, "X-Ultrapeer"); /* For broken Shareaza */ if (field) { - n->attrs |= NODE_A_CAN_ULTRA; if (0 == ascii_strcasecmp(field, "true")) - n->attrs |= NODE_A_ULTRA; - else if (0 == ascii_strcasecmp(field, "false")) { - if (settings_is_ultra()) - n->flags |= NODE_F_LEAF; - } - } else { - /* - * BearShare 4.3.x decided to no longer send X-Ultrapeer on connection, - * but rather include the X-Ultrapeer-Needed header. Hopefully, only - * their UPs will send back such a header. - * --RAM, 01/11/2003 - */ + n->peermode = NODE_P_G2HUB; + else if (0 == ascii_strcasecmp(field, "false")) + field = NULL; + } - field = header_get(head, "X-Ultrapeer-Needed"); - if (field) - n->attrs |= NODE_A_CAN_ULTRA | NODE_A_ULTRA; - else - n->attrs |= NODE_A_NO_ULTRA; + /* + * If we're a connecting to a G2 node, it has to be a hub since we're + * only working as a G2 leaf. + */ + + if (NODE_TALKS_G2(n) && NULL == field) { + static const char msg = N_("Need a G2 Hub"); + + node_send_error(n, 403, "%s", msg); + node_remove(n, "%s", _(msg)); + return; } + /* TLS feature support */ + if (header_get_feature("tls", head, NULL, NULL)) { node_supports_tls(n); } @@ -5542,7 +6524,7 @@ field = header_get(head, "Bye-Packet"); if (field) { - guint major, minor; + uint major, minor; parse_major_minor(field, NULL, &major, &minor); if (major != 0 || minor != 1) { @@ -5554,22 +6536,6 @@ n->attrs |= NODE_A_BYE_PACKET; } - /* Vendor-Message -- support for vendor-specific messages */ - - field = header_get(head, "Vendor-Message"); - if (field) { - guint major, minor; - - parse_major_minor(field, NULL, &major, &minor); - if (major > 0 || (major == 0 && minor > 2)) - if (GNET_PROPERTY(node_debug)) - g_warning("%s claims Vendor-Message version %u.%u", - node_infostr(n), major, minor); - - n->attrs |= NODE_A_CAN_VENDOR; - n->flags |= NODE_F_EXPECT_VMSG; - } - /* Check for (X-)Remote-IP header and handle it */ node_check_remote_ip_header(n->addr, head); @@ -5671,43 +6637,9 @@ } aging_insert(tcp_crawls, - wcopy(&n->addr, sizeof n->addr), GUINT_TO_POINTER(1)); + wcopy(&n->addr, sizeof n->addr), uint_to_pointer(1)); } - - /* - * Check that everything is OK so far for an outgoing connection: if - * they did not reply with 200, then there's no need for us to reply back. - */ - - if (!incoming) { - if (!analyse_status(n, NULL)) { - /* - * Make sure that we do not put private network 'hub' nodes in the - * host cache. If the node replied with X-Try-Hubs, which is a - * non-Gnutella network, make sure we record the node's IP:port - * in the alien cache as well, to prevent further connection - * attempts to that host. - */ - - field = header_get(head, "X-Try-Hubs"); - if (field) { - if (GNET_PROPERTY(node_debug)) { - g_warning("rejecting private network host suggestions " - "from %s", node_infostr(n)); - } - - /* Remove node and suggestions from fresh/valid caches */ - hcache_purge(HCACHE_CLASS_HOST, n->gnet_addr, n->gnet_port); - purge_host_cache_from_hub_list(field); - hcache_add(HCACHE_ALIEN, - n->gnet_addr, n->gnet_port, "alien hub"); - } - return; /* node_remove() has freed s->getline */ - } - } - - /* * Vendor-specific banning. * @@ -5747,6 +6679,17 @@ if (!node_can_accept_connection(n, TRUE)) return; + if (NODE_TALKS_G2(n)) { + sl_g2_nodes = pslist_prepend(sl_g2_nodes, n); + goto check_protocol; + } + + /* + * Following are Gnutella-only header processing. + */ + + sl_gnet_nodes = pslist_prepend(sl_gnet_nodes, n); + /* * If we're a leaf node, we're talking to an Ultra node. * (otherwise, node_can_accept_connection() would have triggered) @@ -5758,13 +6701,43 @@ n->flags |= NODE_F_ULTRA; /* This is our ultranode */ } + /* Pong-Caching -- ping/pong reduction scheme */ + + field = header_get(head, "Pong-Caching"); + if (field) { + uint major, minor; + + parse_major_minor(field, NULL, &major, &minor); + if (major != 0 && minor != 1) + if (GNET_PROPERTY(node_debug)) g_warning( + "node %s claims Pong-Caching version %u.%u", + node_addr(n), major, minor); + n->attrs |= NODE_A_PONG_CACHING; + } + + /* Vendor-Message -- support for vendor-specific messages */ + + field = header_get(head, "Vendor-Message"); + if (field) { + uint major, minor; + + parse_major_minor(field, NULL, &major, &minor); + if (major > 0 || (major == 0 && minor > 2)) + if (GNET_PROPERTY(node_debug)) + g_warning("%s claims Vendor-Message version %u.%u", + node_infostr(n), major, minor); + + n->attrs |= NODE_A_CAN_VENDOR; + n->flags |= NODE_F_EXPECT_VMSG; + } + /* * X-Query-Routing -- QRP protocol in use */ field = header_get(head, "X-Query-Routing"); if (field) { - guint major, minor; + uint major, minor; parse_major_minor(field, NULL, &major, &minor); if (major > 0 || minor > 2) { @@ -5773,8 +6746,8 @@ node_infostr(n), major, minor); } } - n->qrp_major = (guint8) major; - n->qrp_minor = (guint8) minor; + n->qrp_major = (uint8) major; + n->qrp_minor = (uint8) minor; } /* @@ -5783,7 +6756,7 @@ field = header_get(head, "X-Ultrapeer-Query-Routing"); if (field) { - guint major, minor; + uint major, minor; parse_major_minor(field, NULL, &major, &minor); if (major > 0 || minor > 1) { @@ -5791,8 +6764,8 @@ g_warning("%s claims Ultra QRP version %u.%u", node_infostr(n), major, minor); } - n->uqrp_major = (guint8) major; - n->uqrp_minor = (guint8) minor; + n->uqrp_major = (uint8) major; + n->uqrp_minor = (uint8) minor; if (n->attrs & NODE_A_ULTRA) n->attrs |= NODE_A_UP_QRP; /* Only makes sense for ultra nodes */ } @@ -5803,7 +6776,7 @@ field = header_get(head, "X-Dynamic-Querying"); if (field) { - guint major, minor; + uint major, minor; parse_major_minor(field, NULL, &major, &minor); if (major > 0 || minor > 1) { @@ -5822,7 +6795,7 @@ field = header_get(head, "X-Max-Ttl"); /* Needs normalized case */ if (field) { - guint32 value; + uint32 value; int error; value = parse_uint32(field, NULL, 10, &error); @@ -5843,7 +6816,7 @@ field = header_get(head, "X-Degree"); if (field) { - guint32 value; + uint32 value; int error; value = parse_uint32(field, NULL, 10, &error); @@ -5865,7 +6838,7 @@ field = header_get(head, "X-Ext-Probes"); if (field) { - guint major, minor; + uint major, minor; parse_major_minor(field, NULL, &major, &minor); if (major > 0 || minor > 1) { @@ -5902,7 +6875,7 @@ field = header_get(head, "X-Guess"); if (field) { - guint major, minor; + uint major, minor; parse_major_minor(field, NULL, &major, &minor); if (major > SEARCH_GUESS_MAJOR || minor > SEARCH_GUESS_MINOR) { @@ -5913,6 +6886,8 @@ n->attrs |= NODE_A_GUESS; /* Server-side support for GUESS */ } +check_protocol: + /* * Check that remote host speaks a protocol we can accept. */ @@ -5931,7 +6906,7 @@ guid_t guid; if (hex_to_guid(field, &guid)) { - if (gm_hash_table_contains(nodes_by_guid, &guid)) { + if (hikset_contains(nodes_by_guid, &guid)) { node_send_error(n, 409, "Already connected to this GUID"); node_remove(n, _("Already connected to this GUID")); return; @@ -5945,27 +6920,29 @@ } } - /* - * Avoid one vendor occupying all our slots - * -- JA, 21/11/2003 - */ + if (!NODE_TALKS_G2(n)) { + /* + * Avoid one vendor occupying all our slots + * -- JA, 21/11/2003 + */ - if (node_avoid_monopoly(n)) { - node_send_error(n, 409, "Vendor would exceed %d%% of our slots", - GNET_PROPERTY(unique_nodes)); - node_remove(n, _("Vendor would exceed %d%% of our slots"), - GNET_PROPERTY(unique_nodes)); - return; - } + if (node_avoid_monopoly(n)) { + node_send_error(n, 409, "Vendor would exceed %d%% of our slots", + GNET_PROPERTY(unique_nodes)); + node_remove(n, _("Vendor would exceed %d%% of our slots"), + GNET_PROPERTY(unique_nodes)); + return; + } - /* - * Whether we should reserve a slot for gtk-gnutella - */ + /* + * Whether we should reserve a slot for gtk-gnutella + */ - if (node_reserve_slot(n)) { - node_send_error(n, 409, "Reserved slot"); - node_remove(n, _("Reserved slot")); - return; + if (node_reserve_slot(n)) { + node_send_error(n, 409, "Reserved slot"); + node_remove(n, _("Reserved slot")); + return; + } } /* @@ -5975,7 +6952,7 @@ * here, but allow minor versions earlier than ours. */ { - guint major, minor; + uint major, minor; /* Ensure hsep feature is present for major version zero. */ if (header_get_feature("hsep", head, &major, &minor)) { @@ -5992,7 +6969,7 @@ * re-architected size field: 16-bit size and 16-bit flags. */ { - guint major, minor; + uint major, minor; if (header_get_feature("sflag", head, &major, &minor)) n->attrs |= NODE_A_CAN_SFLAG; @@ -6004,6 +6981,7 @@ */ if ( + !NODE_TALKS_G2(n) && settings_is_leaf() && !(n->flags & NODE_F_CRAWLER) && (n->degree < 2 * NODE_LEGACY_DEGREE || !(n->attrs & NODE_A_DYN_QUERY)) @@ -6025,7 +7003,7 @@ gnet_response = vmm_alloc(gnet_response_max); if (!incoming) { - gboolean mode_changed = FALSE; + bool mode_changed = FALSE; /* Make sure we only receive incoming connections from crawlers */ @@ -6087,9 +7065,25 @@ /* XXX */ } - if (field && !(n->attrs & NODE_A_ULTRA)) - g_warning("%s is not an ultrapeer but sent the " - "X-Ultrapeer-Needed header", node_infostr(n)); + /* + * A leaf sending us X-Ultrapeer-Needed could indicate that the + * leaf node is lacking ultrapeers to connect to. We used to warn + * about this, but it's not necessarily an error, even though it + * was not strictly specified that way: since a leaf connects to + * an Ultrapeer, the remote node is already ultrapeer and it's + * not really going to demote itself back to leaf + * --RAM, 2015-03-12 + */ + + if (field && !(n->attrs & NODE_A_ULTRA)) { + if (GNET_PROPERTY(node_debug) > 1) { + g_message("%s is not an ultrapeer but sent an " + "X-Ultrapeer-Needed header set to \"%s\"", + node_infostr(n), field); + } + + /* XXX -- count these and act later? */ + } /* * Prepare our final acknowledgment. @@ -6097,22 +7091,66 @@ g_assert(!mode_changed || settings_is_leaf()); - rw = gm_snprintf(gnet_response, gnet_response_max, + if (NODE_TALKS_G2(n)) { + rw = str_bprintf(gnet_response, gnet_response_max, + "GNUTELLA/0.6 200 OK\r\n" + "X-Hub: False\r\n" + "%s" /* Content-Encoding */ + "Content-Type: %s\r\n", /* Content-Type */ + GNET_PROPERTY(gnet_deflate_enabled) && + (n->attrs & NODE_A_TX_DEFLATE) ? + CONTENT_ENCODING_DEFLATE : "", + APP_G2); + } else { + rw = str_bprintf(gnet_response, gnet_response_max, + "GNUTELLA/0.6 200 OK\r\n" + "%s" /* Connection (if needed for upgrade) */ + "%s" /* Content-Type (if needed) */ + "%s" /* Content-Encoding */ + "%s" /* X-Ultrapeer */ + "%s", /* X-Query-Routing (tells version we'll use) */ + (n->attrs2 & NODE_A2_SWITCH_TLS) ? CONNECTION_UPGRADE : "", + need_content_type ? CONTENT_TYPE_GNUTELLA : "", + GNET_PROPERTY(gnet_deflate_enabled) && + (n->attrs & NODE_A_TX_DEFLATE) ? + CONTENT_ENCODING_DEFLATE : "", + mode_changed ? "X-Ultrapeer: False\r\n" : "", + (n->qrp_major > 0 || n->qrp_minor > 2) ? + "X-Query-Routing: 0.2\r\n" : ""); + } + } else if NODE_TALKS_G2(n) { + /* + * Welcome the incoming G2 node. + */ + + rw = str_bprintf(gnet_response, gnet_response_max, "GNUTELLA/0.6 200 OK\r\n" - "%s" /* Content-Encoding */ - "%s" /* X-Ultrapeer */ - "%s" /* X-Query-Routing (tells version we'll use) */ - "\r\n", - GNET_PROPERTY(gnet_deflate_enabled) && - (n->attrs & NODE_A_TX_DEFLATE) ? compressing : "", - mode_changed ? "X-Ultrapeer: False\r\n" : "", - (n->qrp_major > 0 || n->qrp_minor > 2) ? - "X-Query-Routing: 0.2\r\n" : ""); + "User-Agent: %s\r\n" + "X-Live-Since: %s\r\n" + "Bye-Packet: 0.1\r\n" + "Remote-IP: %s\r\n" + "X-Hub: False\r\n" + "%s" /* Accept-Encoding */ + "%s" /* Content-Encoding */ + "Accept: %s\r\n" + "Content-Type: %s\r\n", + version_string, + start_rfc822_date, + host_addr_to_string(n->socket->addr), + GNET_PROPERTY(gnet_deflate_enabled) + ? ACCEPT_ENCODING_DEFLATE : "", + (GNET_PROPERTY(gnet_deflate_enabled) + && (n->attrs & NODE_A_TX_DEFLATE)) ? + CONTENT_ENCODING_DEFLATE : "", + APP_G2, APP_G2); + + header_features_generate(FEATURES_G2_CONNECTIONS, + gnet_response, gnet_response_max, &rw); } else { - guint ultra_max; + uint ultra_max; /* - * Welcome the incoming node. + * Welcome the incoming Gnutella node. */ ultra_max = GNET_PROPERTY(max_connections) @@ -6120,15 +7158,14 @@ ? GNET_PROPERTY(max_connections) - GNET_PROPERTY(normal_connections) : 0; - if (n->flags & NODE_F_CRAWLER) - rw = gm_snprintf(gnet_response, gnet_response_max, + if (n->flags & NODE_F_CRAWLER) { + rw = str_bprintf(gnet_response, gnet_response_max, "GNUTELLA/0.6 200 OK\r\n" "User-Agent: %s\r\n" "%s" /* Peers & Leaves */ - "X-Live-Since: %s\r\n" - "\r\n", + "X-Live-Since: %s\r\n", version_string, node_crawler_headers(n), start_rfc822_date); - else { + } else { const char *token; char degree100; char guess60; @@ -6155,7 +7192,7 @@ */ if (settings_is_ultra()) { - gm_snprintf(degree, sizeof(degree), + str_bprintf(degree, sizeof(degree), "X-Degree: %d\r\n" "X-Max-TTL: %d\r\n", (GNET_PROPERTY(up_connections) @@ -6163,7 +7200,7 @@ - GNET_PROPERTY(normal_connections)) / 2, GNET_PROPERTY(max_ttl)); } else if (!is_strprefix(node_vendor(n), gtkg_vendor)) { - gm_snprintf(degree, sizeof(degree), + str_bprintf(degree, sizeof(degree), "X-Dynamic-Querying: 0.1\r\n" "X-Ultrapeer-Query-Routing: 0.1\r\n" "X-Degree: 32\r\n" @@ -6177,14 +7214,14 @@ GNET_PROPERTY(enable_guess) && (settings_is_ultra() || GNET_PROPERTY(enable_guess_client)) ) { - gm_snprintf(guess, sizeof(guess), + str_bprintf(guess, sizeof(guess), "X-Guess: %d.%d\r\n", SEARCH_GUESS_MAJOR, SEARCH_GUESS_MINOR); } else { guess0 = '\0'; } - rw = gm_snprintf(gnet_response, gnet_response_max, + rw = str_bprintf(gnet_response, gnet_response_max, "GNUTELLA/0.6 200 OK\r\n" "User-Agent: %s\r\n" "Pong-Caching: 0.1\r\n" @@ -6195,6 +7232,10 @@ "Remote-IP: %s\r\n" "X-Ultrapeer: %s\r\n" "X-Requeries: False\r\n" + "%s" /* Upgrade (if needed) */ + "%s" /* Connection (if needed) */ + "%s" /* Accept (if needed) */ + "%s" /* Content-Type (if needed) */ "%s" /* Accept-Encoding */ "%s" /* Content-Encoding */ "%s" /* X-Ultrapeer-Needed */ @@ -6210,10 +7251,15 @@ guid_hex_str(&guid), host_addr_to_string(n->socket->addr), settings_is_leaf() ? "False" : "True", + (n->attrs2 & NODE_A2_UPGRADE_TLS) ? UPGRADE_TLS : "", + (n->attrs2 & NODE_A2_UPGRADE_TLS) ? CONNECTION_UPGRADE : "", + need_content_type ? ACCEPT_GNUTELLA : "", + need_content_type ? CONTENT_TYPE_GNUTELLA : "", GNET_PROPERTY(gnet_deflate_enabled) - ? "Accept-Encoding: deflate\r\n" : "", + ? ACCEPT_ENCODING_DEFLATE : "", (GNET_PROPERTY(gnet_deflate_enabled) - && (n->attrs & NODE_A_TX_DEFLATE)) ? compressing : "", + && (n->attrs & NODE_A_TX_DEFLATE)) ? + CONTENT_ENCODING_DEFLATE : "", settings_is_leaf() ? "" : GNET_PROPERTY(node_ultra_count) < ultra_max ? "X-Ultrapeer-Needed: True\r\n" @@ -6234,12 +7280,11 @@ header_features_generate(FEATURES_CONNECTIONS, gnet_response, gnet_response_max, &rw); - - rw += gm_snprintf(&gnet_responserw, - gnet_response_max - rw, "\r\n"); } } + rw += str_bprintf(&gnet_responserw, gnet_response_max - rw, "\r\n"); + /* * We might not be able to transmit the reply atomically. * This should be rare, so we're not handling the case for now. @@ -6305,17 +7350,17 @@ *** I/O header parsing callbacks. ***/ -static inline struct gnutella_node * -cast_to_node(gpointer p) +static inline gnutella_node_t * +cast_to_node(void *p) { node_check(p); return p; } static void -err_line_too_long(gpointer obj, header_t *head) +err_line_too_long(void *obj, header_t *head) { - struct gnutella_node *n = cast_to_node(obj); + gnutella_node_t *n = cast_to_node(obj); node_extract_user_agent(n, head); node_send_error(n, 413, "Header line too long"); @@ -6323,21 +7368,21 @@ } static void -err_header_error_tell(gpointer obj, int error) +err_header_error_tell(void *obj, int error) { node_send_error(cast_to_node(obj), 413, "%s", header_strerror(error)); } static void -err_header_error(gpointer obj, int error) +err_header_error(void *obj, int error) { node_remove(cast_to_node(obj), _("Failed (%s)"), header_strerror(error)); } static void -err_input_exception(gpointer obj, header_t *head) +err_input_exception(void *obj, header_t *head) { - struct gnutella_node *n = cast_to_node(obj); + gnutella_node_t *n = cast_to_node(obj); node_extract_user_agent(n, head); node_remove(n, (n->flags & NODE_F_CRAWLER) ? @@ -6345,20 +7390,20 @@ } static void -err_input_buffer_full(gpointer obj) +err_input_buffer_full(void *obj) { node_remove(cast_to_node(obj), _("Failed (Input buffer full)")); } static void -err_header_read_error(gpointer obj, int error) +err_header_read_error(void *obj, int error) { - struct gnutella_node *n = cast_to_node(obj); + gnutella_node_t *n = cast_to_node(obj); host_addr_t addr = n->addr; - guint16 port = n->port; - guint32 flags = n->socket->flags & (SOCK_F_FORCE | SOCK_F_TLS); - gboolean retry; - + uint16 port = n->port; + uint32 flags = n->socket->flags & (SOCK_F_FORCE | SOCK_F_TLS); + bool retry; + retry = ECONNRESET == error && GTA_NODE_HELLO_SENT == n->status && !socket_with_tls(n->socket) && @@ -6375,9 +7420,9 @@ } static void -err_header_read_eof(gpointer obj, struct header *head) +err_header_read_eof(void *obj, struct header *head) { - struct gnutella_node *n = cast_to_node(obj); + gnutella_node_t *n = cast_to_node(obj); node_extract_user_agent(n, head); @@ -6389,9 +7434,9 @@ } static void -err_header_extra_data(gpointer obj, header_t *head) +err_header_extra_data(void *obj, header_t *head) { - struct gnutella_node *n = cast_to_node(obj); + gnutella_node_t *n = cast_to_node(obj); node_extract_user_agent(n, head); node_remove(n, _("Failed (Extra HELLO data)")); @@ -6409,13 +7454,13 @@ }; static void -call_node_process_handshake_header(gpointer obj, header_t *header) +call_node_process_handshake_header(void *obj, header_t *header) { node_process_handshake_header(cast_to_node(obj), header); } static void -call_node_process_handshake_ack(gpointer obj, header_t *header) +call_node_process_handshake_ack(void *obj, header_t *header) { node_process_handshake_ack(cast_to_node(obj), header); } @@ -6428,24 +7473,27 @@ * message before parsing of the Gnutella query hit can occur. */ static gnutella_node_t * -node_browse_create(void) +node_browse_create(bool g2) { gnutella_node_t *n; n = node_alloc(); - n->id = node_id_new(n); + n->id = node_id_new(); n->proto_major = 0; n->proto_minor = 6; - n->peermode = NODE_P_LEAF; + n->peermode = g2 ? NODE_P_G2HUB : NODE_P_LEAF; n->hops_flow = MAX_HOP_COUNT; n->last_update = n->last_tx = n->last_rx = tm_time(); n->routing_data = NULL; n->status = GTA_NODE_CONNECTED; n->flags = NODE_F_ESTABLISHED | NODE_F_READABLE | NODE_F_VALID; + n->attrs2 = g2 ? NODE_A2_TALKS_G2 : 0; n->up_date = GNET_PROPERTY(start_stamp); n->connect_date = GNET_PROPERTY(start_stamp); n->alive_pings = alive_make(n, ALIVE_MAX_PENDING); + hikset_insert_key(nodes_by_id, &n->id); + return n; } @@ -6454,25 +7502,33 @@ * coming from the host and from a servent with the supplied vendor * string. * + * If the `header' variable is NULL, it means we're dealing with G2 traffic. + * * @return the shared instance, suitable for parsing the received message. */ gnutella_node_t * node_browse_prepare( gnet_host_t *host, const char *vendor, gnutella_header_t *header, - char *data, guint32 size) + char *data, uint32 size) { - gnutella_node_t *n = browse_node; + gnutella_node_t *n; - node_check(n); + if (NULL == header) { + n = browse_g2_node; + node_check(n); + } else { + n = browse_node; + node_check(n); + memcpy(n->header, header, sizeof n->header); + } n->addr = gnet_host_get_addr(host); n->port = gnet_host_get_port(host); - n->vendor = deconstify_gchar(vendor); + n->vendor = deconstify_char(vendor); n->country = gip_country(n->addr); n->size = size; n->msg_flags = 0; - memcpy(n->header, header, sizeof n->header); n->data = data; return n; @@ -6484,7 +7540,7 @@ void node_browse_cleanup(gnutella_node_t *n) { - g_assert(n == browse_node); + g_assert(n == browse_node || n == browse_g2_node); n->vendor = NULL; n->data = NULL; @@ -6500,7 +7556,7 @@ n = node_alloc(); n->addr = listen_addr_by_net(net); - n->id = node_id_new(n); + n->id = node_id_new(); n->port = GNET_PROPERTY(listen_port); n->proto_major = 0; n->proto_minor = 6; @@ -6514,7 +7570,7 @@ concat_strings(buf, sizeof buf, name, " (", net_type_to_string(host_addr_net(n->addr)), ")", - (void *) 0); + NULL_PTR); n->vendor = atom_str_get(buf); } n->status = GTA_NODE_CONNECTED; @@ -6526,6 +7582,8 @@ n->alive_pings = alive_make(n, ALIVE_MAX_PENDING); n->country = gip_country(n->addr); + hikset_insert_key(nodes_by_id, &n->id); + return n; } @@ -6541,6 +7599,43 @@ /** * Create a "fake" node that is used as a placeholder when processing + * Gnutella messages received from semi-reliable UDP. + */ +static gnutella_node_t * +node_udp_sr_create(enum net_type net) +{ + gnutella_node_t *n; + + n = node_pseudo_create(net, NODE_P_UDP, _("Pseudo semi-reliable UDP node")); + n->attrs2 |= NODE_A2_UDP_TRANCVR | NODE_A2_HAS_SR_UDP; + n->attrs |= NODE_A_TX_DEFLATE | NODE_A_RX_INFLATE; /* Layer can compress */ + + return n; +} + +/** + * Create a "fake" node that is used as a placeholder when processing + * G2 messages from UDP. + */ +static gnutella_node_t * +node_udp_g2_create(enum net_type net) +{ + gnutella_node_t *n; + + /* + * A G2 node alayws uses a semi-reliable UDP layer, although not all + * messages are necessarily requesting a transport acknowledgment. + */ + + n = node_pseudo_create(net, NODE_P_UDP, _("Pseudo G2 UDP node")); + n->attrs2 |= NODE_A2_UDP_TRANCVR | NODE_A2_HAS_SR_UDP | NODE_A2_TALKS_G2; + n->attrs |= NODE_A_TX_DEFLATE | NODE_A_RX_INFLATE; /* Layer can compress */ + + return n; +} + +/** + * Create a "fake" node that is used as a placeholder when processing * DHT messages received from UDP. */ static gnutella_node_t * @@ -6550,24 +7645,127 @@ } /** + * Get the UDP socket to use depending on the network type. + * + * @return the socket to use, or NULL if no traffic is allowed for that net. + */ +static gnutella_socket_t * +node_udp_get_socket(enum net_type net) +{ + switch (net) { + case NET_TYPE_IPV4: + return s_udp_listen; + case NET_TYPE_IPV6: + return s_udp_listen6; + case NET_TYPE_LOCAL: + case NET_TYPE_NONE: + break; + } + + g_assert_not_reached(); +} + +/** + * Create an UDP scheduler, once per bandwidth type. + */ +static udp_sched_t * +node_udp_scheduler(bsched_bws_t bws) +{ + udp_sched_t *us; + + if G_UNLIKELY(NULL == node_udp_sched_ht) + node_udp_sched_ht = htable_create(HASH_KEY_SELF, 0); + + us = htable_lookup(node_udp_sched_ht, int_to_pointer(bws)); + + if G_UNLIKELY(NULL == us) { + us = udp_sched_make(bws, node_udp_get_socket); + htable_insert(node_udp_sched_ht, int_to_pointer(bws), us); + } + + return us; +} + +/** + * Hash table iterator to free scheduler. + */ +static void +node_udp_scheduler_free(const void *unused_key, void *value, void *unused_data) +{ + udp_sched_t *us = value; + + (void) unused_key; + (void) unused_data; + + udp_sched_free(us); +} + +/** + * Hash table iterator to update the scheduler sockets. + */ +static void +node_udp_scheduler_update_sockets( + const void *unused_key, void *value, void *unused_data) +{ + udp_sched_t *us = value; + + (void) unused_key; + (void) unused_data; + + udp_sched_update_sockets(us); +} + +/** + * Free all the created UDP schedulers and the recording hash. + */ +static void +node_udp_scheduler_destroy_all(void) +{ + if (NULL == node_udp_sched_ht) + return; + + htable_foreach(node_udp_sched_ht, node_udp_scheduler_free, NULL); + htable_free_null(&node_udp_sched_ht); +} + +/** + * Update all the create UDP schedulers to refresh their sockets. + */ +static void +node_udp_scheduler_update_all(void) +{ + if (NULL == node_udp_sched_ht) + return; + + htable_foreach(node_udp_sched_ht, node_udp_scheduler_update_sockets, NULL); +} + +/** * Enable transmissions on a pseudo node by setting up a full TX stack. */ static void node_pseudo_enable(gnutella_node_t *n, struct gnutella_socket *s, - bsched_bws_t bws, guint32 qsize) + enum net_type net, bsched_bws_t bws, uint32 qsize) { txdrv_t *tx; struct tx_dgram_args args; gnet_host_t host; + const struct mq_uops *uops; node_check(n); socket_check(s); + g_assert(!NODE_TALKS_G2(n) || NODE_CAN_SR_UDP(n)); n->socket = s; - args.cb = &node_tx_dgram_cb; - args.bws = bws; - args.wio = &n->socket->wio; + /* + * The TX dgram layer will not account for messages sent at its level + * when it is underneath a semi-reliable UDP layer. + */ + + args.cb = NODE_CAN_SR_UDP(n) ? &node_tx_sr_dgram_cb : &node_tx_dgram_cb; + args.us = node_udp_scheduler(bws); + args.net = net; gnet_host_set(&host, n->addr, n->port); @@ -6575,10 +7773,57 @@ mq_free(n->outq); n->outq = NULL; } + tx = tx_make(n, &host, tx_dgram_get_ops(), &args); /* Cannot fail */ - n->outq = mq_udp_make(qsize, n, tx); + + if (NODE_CAN_SR_UDP(n)) { + struct tx_ut_args targs; + struct rx_ut_args rargs; + udp_tag_t tag; + + /* + * All the UDP traffic for G2 goes through the semi-reliable UDP layer. + */ + + if (NODE_TALKS_G2(n)) { + udp_tag_set(&tag, "GND"); /* G2 tag */ + targs.cb = &node_tx_g2_cb; + targs.advertise_improved_acks = TRUE; /* Negotiated in G2 */ + targs.ear_support = FALSE; /* No EAR in G2 */ + rargs.advertised_improved_acks = TRUE; /* Negotiated in G2 */ + } else { + udp_tag_set(&tag, "GTA"); /* Gnutella tag */ + targs.cb = &node_tx_ut_cb; + targs.advertise_improved_acks = FALSE; /* Native in Gnutella */ + targs.ear_support = TRUE; + rargs.advertised_improved_acks = FALSE; /* Native in Gnutella */ + } + + targs.tag = tag; + tx = tx_make_above(tx, tx_ut_get_ops(), &targs); + + rargs.tag = tag; + rargs.tx = tx; + rargs.cb = &node_rx_ut_cb; + n->rx = rx_make(n, NULL, rx_ut_get_ops(), &rargs); + + if (NODE_TALKS_G2(n)) { + rx_set_datafrom_ind(n->rx, node_udp_g2_data_ind); + udp_set_rx_semi_reliable(UDP_SR_GND, n->rx, s->net); + } else { + rx_set_datafrom_ind(n->rx, node_udp_sr_data_ind); + udp_set_rx_semi_reliable(UDP_SR_GTA, n->rx, s->net); + } + + rx_enable(n->rx); + n->flags |= NODE_F_READABLE; + } + + uops = NODE_TALKS_G2(n) ? &node_g2_mq_cb : &node_mq_cb; + + n->outq = mq_udp_make(qsize, n, tx, uops); n->flags |= NODE_F_WRITABLE; - + node_fire_node_added(n); node_fire_node_flags_changed(n); } @@ -6600,6 +7845,18 @@ mq_free(n->outq); n->outq = NULL; } + if (n->rx != NULL) { + g_assert(n->socket != NULL); + + rx_free(n->rx); + n->rx = NULL; + if (NODE_TALKS_G2(n)) { + udp_set_rx_semi_reliable(UDP_SR_GND, NULL, n->socket->net); + } else { + udp_set_rx_semi_reliable(UDP_SR_GTA, NULL, n->socket->net); + } + n->flags &= ~NODE_F_READABLE; + } n->socket = NULL; } @@ -6626,7 +7883,48 @@ g_assert_not_reached(); } - node_pseudo_enable(n, s, BSCHED_BWS_GOUT_UDP, + node_pseudo_enable(n, s, net, BSCHED_BWS_GOUT_UDP, + GNET_PROPERTY(node_udp_sendqueue_size)); + + switch (net) { + case NET_TYPE_IPV4: + n = udp_sr_node; + s = s_udp_listen; + break; + case NET_TYPE_IPV6: + n = udp6_sr_node; + s = s_udp_listen6; + break; + case NET_TYPE_LOCAL: + case NET_TYPE_NONE: + g_assert_not_reached(); + } + + node_pseudo_enable(n, s, net, BSCHED_BWS_GOUT_UDP, + GNET_PROPERTY(node_udp_sendqueue_size)); +} + +/** + * Enable G2 UDP transmissions via pseudo node. + */ +static void +node_g2_enable_by_net(enum net_type net) +{ + struct gnutella_socket *s = NULL; + gnutella_node_t *n = NULL; + + switch (net) { + case NET_TYPE_IPV4: + n = udp_g2_node; + s = s_udp_listen; + break; + case NET_TYPE_IPV6: + case NET_TYPE_LOCAL: + case NET_TYPE_NONE: + g_assert_not_reached(); + } + + node_pseudo_enable(n, s, net, BSCHED_BWS_GOUT_UDP, GNET_PROPERTY(node_udp_sendqueue_size)); } @@ -6653,12 +7951,12 @@ g_assert_not_reached(); } - node_pseudo_enable(n, s, BSCHED_BWS_DHT_OUT, + node_pseudo_enable(n, s, net, BSCHED_BWS_DHT_OUT, GNET_PROPERTY(node_dht_sendqueue_size)); } /** - * Disable UDP transmission via pseudo node. + * Disable UDP transmission via pseudo nodes. */ static void node_udp_disable_by_net(enum net_type net) @@ -6678,6 +7976,20 @@ } node_pseudo_disable(n); + + switch (net) { + case NET_TYPE_IPV4: + n = udp_sr_node; + break; + case NET_TYPE_IPV6: + n = udp6_sr_node; + break; + case NET_TYPE_LOCAL: + case NET_TYPE_NONE: + g_assert_not_reached(); + } + + node_pseudo_disable(n); } /** @@ -6703,6 +8015,27 @@ node_pseudo_disable(n); } +/** + * Disable G2 UDP transmission via pseudo nodes. + */ +static void +node_g2_disable_by_net(enum net_type net) +{ + gnutella_node_t *n = NULL; + + switch (net) { + case NET_TYPE_IPV4: + n = udp_g2_node; + break; + case NET_TYPE_IPV6: + case NET_TYPE_LOCAL: + case NET_TYPE_NONE: + g_assert_not_reached(); + } + + node_pseudo_disable(n); +} + static void node_udp_enable(void) { @@ -6723,6 +8056,13 @@ node_dht_enable_by_net(NET_TYPE_IPV6); } +static void +node_g2_enable(void) +{ + if (s_udp_listen) + node_g2_enable_by_net(NET_TYPE_IPV4); +} + void node_udp_disable(void) { @@ -6739,6 +8079,7 @@ if (udp_node && udp_node->socket) { node_udp_disable_by_net(NET_TYPE_IPV4); + node_g2_disable_by_net(NET_TYPE_IPV4); socket_free_null(&s_udp_listen); } if (udp6_node && udp6_node->socket) { @@ -6748,30 +8089,73 @@ /* Can no longer operate the DHT */ dht_close(FALSE); + + /* + * UDP sockets destroyed, must now destroy the UDP TX schedulers + * so that the old I/O sources (attached to the -- now gone -- sockets + * through their wrap_io_t object) can be removed from the bandwidth + * scheduler and all pending traffic be discarded. + * --RAM, 2012-11-01. + */ + + node_udp_scheduler_destroy_all(); } /** * Setup pseudo node after receiving data on its socket. */ static void -node_pseudo_setup(gnutella_node_t *n, struct gnutella_socket *s) +node_pseudo_setup(gnutella_node_t *n, void *data, size_t len) { gnutella_header_t *head; node_check(n); - g_assert(n->socket == s); /* Only one UDP socket */ - head = cast_to_gpointer(s->buf); + head = cast_to_pointer(data); n->size = gmsg_size(head); + n->size = MIN(len, n->size); /* Clamp size to physical size */ n->msg_flags = 0; memcpy(n->header, head, sizeof n->header); - n->data = &s->bufGTA_HEADER_SIZE; + n->data = ptr_add_offset(data, GTA_HEADER_SIZE); + + n->attrs = NODE_A_UDP; /* Clears NODE_A_CAN_INFLATE */ +} + +/** + * Setup pseudo node after receiving data from an RX layer, for semi-reliable + * UDP traffic, which is necessarily Gnutella traffic, not DHT. + * + * @return setup node, NULL if we cannot get a valid node + */ +static gnutella_node_t * +node_pseudo_get_from_mb(pmsg_t *mb, const gnet_host_t *from) +{ + gnutella_node_t *n; - n->addr = s->addr; - n->port = s->port; + n = node_udp_sr_get_addr_port( + gnet_host_get_addr(from), gnet_host_get_port(from)); - n->attrs = NODE_A_UDP; + if G_UNLIKELY(NULL == n) + return NULL; + + node_check(n); + + if (pmsg_size(mb) >= GTA_HEADER_SIZE) { + const gnutella_header_t *head = deconstify_pointer(pmsg_read_base(mb)); + n->size = gmsg_size(head); + pmsg_read(mb, n->header, sizeof n->header); + n->data = deconstify_pointer(pmsg_read_base(mb)); + } else { + ZERO(&n->header); + n->data = NULL; + n->size = 0; + } + + n->msg_flags = 0; + n->attrs = NODE_A_UDP | NODE_A_TX_DEFLATE | NODE_A_RX_INFLATE; + + return n; } /** @@ -6793,9 +8177,27 @@ } /** + * Get the message queue attached to the semi-reliable UDP node. + * + * @return the UDP message queue, or NULL if UDP has been disabled. + */ +mqueue_t * +node_udp_sr_get_outq(enum net_type net) +{ + switch (net) { + case NET_TYPE_IPV4: return udp_sr_node ? udp_sr_node->outq : NULL; + case NET_TYPE_IPV6: return udp6_sr_node ? udp6_sr_node->outq : NULL; + case NET_TYPE_LOCAL: + case NET_TYPE_NONE: + break; + } + return NULL; +} + +/** * Check whether the DHT node is flow-controlled. */ -gboolean +bool node_dht_is_flow_controlled(void) { if (dht_node && dht_node->outq && mq_is_flow_controlled(dht_node->outq)) @@ -6810,7 +8212,7 @@ /** * Check whether additional traffic would cause the DHT node to flow-control. */ -gboolean +bool node_dht_would_flow_control(size_t additional) { if ( @@ -6832,7 +8234,7 @@ * Check whether we already have sufficient delay in the queue (above the * low water-mark), regardless of whether we are flow-controlled. */ -gboolean +bool node_dht_above_low_watermark(void) { if (dht_node && dht_node->outq && mq_above_low_watermark(dht_node->outq)) @@ -6845,11 +8247,23 @@ } /** + * Check whether node is above its low watermark, to limit traffic when + * connection starts clogging. + */ +bool +node_above_low_watermark(const gnutella_node_t *n) +{ + node_check(n); + + return NULL == n->outq || mq_above_low_watermark(n->outq); +} + +/** * Setup addr:port in pseudo node. */ static inline gnutella_node_t * node_pseudo_set_addr_port(gnutella_node_t *n, - const host_addr_t addr, guint16 port) + const host_addr_t addr, uint16 port) { if (n != NULL && n->outq) { n->addr = addr; @@ -6864,7 +8278,7 @@ * Get "fake" node for UDP transmission. */ gnutella_node_t * -node_udp_get_addr_port(const host_addr_t addr, guint16 port) +node_udp_get_addr_port(const host_addr_t addr, uint16 port) { gnutella_node_t *n; @@ -6882,6 +8296,75 @@ g_assert_not_reached(); break; } + + /* + * Since processing can freely turn on the NODE_A_CAN_INFLATE flag + * when it sees indication from the message received that the UDP + * node supports deflated UDP traffic, we must clear that flag + * each time we get a "new" node (i.e. setup the fake node for a + * new incoming address). + * --RAM, 2012-10-09 + * + * The NODE_A2_HAS_SR_UDP attribute is only set when the node from + * which we got a GUESS query (a UDP node, therefore) advertised + * that it understands semi-reliable UDP incoming traffic. + */ + + n->attrs &= ~NODE_A_CAN_INFLATE; /* Until negotiated */ + n->attrs2 &= ~NODE_A2_HAS_SR_UDP; /* Idem */ + + return node_pseudo_set_addr_port(n, addr, port); + } + return NULL; +} + +/** + * Get "fake" node for semi-reliable UDP transmission. + */ +gnutella_node_t * +node_udp_sr_get_addr_port(const host_addr_t addr, uint16 port) +{ + gnutella_node_t *n; + + if (port != 0 && udp_active()) { + n = NULL; + switch (host_addr_net(addr)) { + case NET_TYPE_IPV4: + n = udp_sr_node; + break; + case NET_TYPE_IPV6: + n = udp6_sr_node; + break; + case NET_TYPE_LOCAL: + case NET_TYPE_NONE: + g_assert_not_reached(); + break; + } + return node_pseudo_set_addr_port(n, addr, port); + } + return NULL; +} + +/** + * Get "fake" node for semi-reliable G2 UDP transmission. + */ +gnutella_node_t * +node_udp_g2_get_addr_port(const host_addr_t addr, uint16 port) +{ + gnutella_node_t *n; + + if (port != 0 && node_g2_active()) { + n = NULL; + switch (host_addr_net(addr)) { + case NET_TYPE_IPV4: + n = udp_g2_node; + break; + case NET_TYPE_IPV6: + case NET_TYPE_LOCAL: + case NET_TYPE_NONE: + g_assert_not_reached(); + break; + } return node_pseudo_set_addr_port(n, addr, port); } return NULL; @@ -6891,7 +8374,7 @@ * Get "fake" node for DHT transmission. */ gnutella_node_t * -node_dht_get_addr_port(const host_addr_t addr, guint16 port) +node_dht_get_addr_port(const host_addr_t addr, uint16 port) { gnutella_node_t *n; @@ -6918,8 +8401,8 @@ * Get "fake" node for UDP routing. */ gnutella_node_t * -node_udp_route_get_addr_port(const host_addr_t addr, guint16 port, - gboolean can_deflate) +node_udp_route_get_addr_port(const host_addr_t addr, uint16 port, + bool can_deflate, bool sr_udp) { gnutella_node_t *n; @@ -6927,10 +8410,10 @@ n = NULL; switch (host_addr_net(addr)) { case NET_TYPE_IPV4: - n = dht_node; + n = sr_udp ? udp_sr_node : udp_node; break; case NET_TYPE_IPV6: - n = dht6_node; + n = sr_udp ? udp6_sr_node : udp6_node; break; case NET_TYPE_LOCAL: case NET_TYPE_NONE: @@ -6946,101 +8429,48 @@ */ udp_route->outq = n->outq; - udp_route->attrs = NODE_A_UDP; - if (can_deflate) - udp_route->attrs |= NODE_A_CAN_INFLATE; - return node_pseudo_set_addr_port(udp_route, addr, port); - } - return NULL; -} - -/** - * Add new node. - */ -void -node_add(const host_addr_t addr, guint16 port, guint32 flags) -{ - if (!is_host_addr(addr) || !port) - return; - - if ( - !(SOCK_F_FORCE & flags) && - (hostiles_check(addr) || hcache_node_is_bad(addr)) - ) - return; - - node_add_socket(NULL, addr, port, flags); -} - -struct node_add_by_name_data { - guint32 flags; - guint16 port; -}; - -/** - * Called when we got a reply from the ADNS process. - * - * @todo TODO: All resolved addresses should be attempted. - */ -static void -node_add_by_name_helper(const host_addr_t *addrs, size_t n, gpointer user_data) -{ - struct node_add_by_name_data *data = user_data; - - g_assert(addrs); - g_assert(data); - g_assert(data->port); + udp_route->attrs = n->attrs; + udp_route->attrs2 = n->attrs2; - if (n > 0) { - size_t i = random_u32() % n; - node_add(addrsi, data->port, data->flags); - } - WFREE(data); -} + /* + * Set appropriate flags. + */ -/** - * Add new node by hostname. - */ -void -node_add_by_name(const char *host, guint16 port, guint32 flags) -{ - struct node_add_by_name_data *data; - - g_assert(host); + if (can_deflate) + udp_route->attrs |= NODE_A_CAN_INFLATE; + else + udp_route->attrs &= ~NODE_A_CAN_INFLATE; - if (!port) - return; + /* + * If ``sr_udp'' is TRUE, we set NODE_A2_UDP_TRANCVR because the + * message queue is connected to the UDP transceiver and we set + * NODE_A2_HAS_SR_UDP because the UDP node to which we are routing + * the message has indicated that it understood it. These two bits + * mean two different things... + */ - WALLOC(data); - data->port = port; - data->flags = flags; + if (sr_udp) + udp_route->attrs2 |= NODE_A2_UDP_TRANCVR | NODE_A2_HAS_SR_UDP; + else + udp_route->attrs2 &= ~(NODE_A2_UDP_TRANCVR | NODE_A2_HAS_SR_UDP); - if ( - !adns_resolve(host, settings_dns_net(), &node_add_by_name_helper, data) - ) { - /* node_add_by_name_helper() was already invoked! */ - if (GNET_PROPERTY(node_debug) > 0) - g_warning("node_add_by_name: " - "adns_resolve() failed in synchronous mode"); - return; + return node_pseudo_set_addr_port(udp_route, addr, port); } + return NULL; } - /** * Add new node, to which we possibly have an existing connection if * the socket is not NULL (incoming connection). */ -void -node_add_socket(struct gnutella_socket *s, const host_addr_t addr, - guint16 port, guint32 flags) +static void +node_add_internal(struct gnutella_socket *s, const host_addr_t addr, + uint16 port, uint32 flags, bool g2) { - struct gnutella_node *n; - gboolean incoming = FALSE, already_connected = FALSE; - guint major = 0, minor = 0; - gboolean forced = 0 != (SOCK_F_FORCE & flags); - - g_assert(s == NULL || s->resource.node == NULL); + gnutella_node_t *n; + bool incoming = FALSE, already_connected = FALSE; + uint major = 0, minor = 0; + bool forced = 0 != (SOCK_F_FORCE & flags); flags |= GNET_PROPERTY(tls_enforce) ? SOCK_F_TLS : 0; @@ -7057,10 +8487,13 @@ /* * If they wish to be temporarily off Gnet, don't initiate connections. + * Likewise if we are short of network buffers. */ - if (!incoming && !allow_gnet_connections) - return; + if (!incoming) { + if (!allow_gnet_connections || GNET_PROPERTY(net_buffer_shortage)) + return; + } /* * Compute the protocol version from the first handshake line, if @@ -7071,8 +8504,7 @@ if (incoming) { get_protocol_version(getline_str(s->getline), &major, &minor); - getline_free(s->getline); - s->getline = NULL; + getline_free_null(&s->getline); } /* Refuse to connect to legacy servents (not at least 0.6) */ @@ -7127,7 +8559,7 @@ */ n = node_alloc(); - n->id = node_id_new(n); + n->id = node_id_new(); n->addr = addr; n->port = port; n->proto_major = major; @@ -7146,13 +8578,13 @@ n->routing_data = NULL; n->flags = NODE_F_HDSK_PING | (forced ? NODE_F_FORCE : 0); + hikset_insert_key(nodes_by_id, &n->id); + if (incoming) { /* This is an incoming control connection */ n->socket = s; - s->resource.node = n; - s->type = SOCK_TYPE_CONTROL; - n->status = (major > 0 || minor > 4) ? - GTA_NODE_RECEIVING_HELLO : GTA_NODE_WELCOME_SENT; + socket_attach_ops(s, SOCK_TYPE_CONTROL, &node_socket_ops, n); + n->status = GTA_NODE_RECEIVING_HELLO; socket_tos_default(s); /* Set proper Type of Service */ @@ -7172,7 +8604,7 @@ */ if (socket_uses_tls(s)) - n->flags |= NODE_F_TLS; + n->attrs2 |= NODE_A2_TLS; n->flags |= NODE_F_INCOMING; } else { @@ -7182,12 +8614,21 @@ if (s) { n->status = GTA_NODE_CONNECTING; - s->resource.node = n; + socket_attach_ops(s, SOCK_TYPE_CONTROL, &node_socket_ops, n); n->socket = s; n->gnet_addr = addr; n->gnet_port = port; n->proto_major = 0; n->proto_minor = 6; /* Handshake at 0.6 intially */ + n->peermode = g2 ? NODE_P_G2HUB : NODE_P_ULTRA; + + /* + * We want to establish a G2 handshaking, we do not know yet + * whether the remote node will support G2. + */ + + if (g2) + n->attrs2 |= NODE_A2_TALKS_G2; } else { n->status = GTA_NODE_REMOVING; n->remove_msg = "Connection failed"; @@ -7211,10 +8652,10 @@ * leave a trail in the GUI. */ - sl_nodes = g_slist_prepend(sl_nodes, n); + sl_nodes = pslist_prepend(sl_nodes, n); if (n->status != GTA_NODE_REMOVING) { - node_ht_connected_nodes_add(n->gnet_addr, n->gnet_port); + node_ht_connected_nodes_add(n); } if (already_connected) { @@ -7254,6 +8695,113 @@ } /** + * Add new incoming node. + */ +void +node_add_socket(struct gnutella_socket *s) +{ + socket_check(s); + + /* + * For incoming connections, we don't know yet whether the node will + * end-up connecting as a Gnutella node or as G2: this will be negotiated + * during handshaking. + */ + + node_add_internal(s, s->addr, s->port, 0, FALSE); +} + +/** + * Add new Gnutella node. + */ +void +node_add(const host_addr_t addr, uint16 port, uint32 flags) +{ + if (!is_host_addr(addr) || !port) + return; + + if ( + !(SOCK_F_FORCE & flags) && + (hostiles_is_bad(addr) || hcache_node_is_bad(addr)) + ) + return; + + node_add_internal(NULL, addr, port, flags, FALSE); +} + +/** + * Add new G2 node. + */ +void +node_g2_add(const host_addr_t addr, uint16 port, uint32 flags) +{ + if (!is_host_addr(addr) || !port) + return; + + if ( + !(SOCK_F_FORCE & flags) && + (hostiles_is_bad(addr) || hcache_node_is_bad(addr)) + ) + return; + + node_add_internal(NULL, addr, port, flags, TRUE); +} + +struct node_add_by_name_data { + uint32 flags; + uint16 port; +}; + +/** + * Called when we got a reply from the ADNS process. + * + * @todo TODO: All resolved addresses should be attempted. + */ +static void +node_add_by_name_helper(const host_addr_t *addrs, size_t n, void *user_data) +{ + struct node_add_by_name_data *data = user_data; + + g_assert(addrs); + g_assert(data); + g_assert(data->port); + + if (n > 0) { + size_t i = random_value(n - 1); + node_add(addrsi, data->port, data->flags); + } + WFREE(data); +} + +/** + * Add new node by hostname. + */ +void +node_add_by_name(const char *host, uint16 port, uint32 flags) +{ + struct node_add_by_name_data *data; + + g_assert(host); + + if (!port) + return; + + WALLOC(data); + data->port = port; + data->flags = flags; + + if ( + !adns_resolve(host, settings_dns_net(), &node_add_by_name_helper, data) + ) { + /* node_add_by_name_helper() was already invoked! */ + if (GNET_PROPERTY(node_debug) > 0) + g_warning("node_add_by_name: " + "adns_resolve() failed in synchronous mode"); + return; + } +} + +/** * Check that current message has an extra payload made of GGEP only, * and whose total size is not exceeding `maxsize'. * @@ -7267,14 +8815,14 @@ * * @note parsed extensions are left in the node's `extensions' structure. */ -static gboolean -node_check_ggep(struct gnutella_node *n, int maxsize, int regsize) +static bool +node_check_ggep(gnutella_node_t *n, int maxsize, int regsize) { char *start; int len; int i; - g_assert(n->size > (guint32) regsize); /* "fat" message */ + g_assert(n->size > (uint32) regsize); /* "fat" message */ len = n->size - regsize; /* Extension length */ @@ -7322,6 +8870,82 @@ } /** + * Patch the port of the PUSH message to be identical to the source port + * of the UDP datagram if it is for FW-FW transfer initiation. + */ +static void +node_patch_push_fw2fw(gnutella_node_t *n) +{ + host_addr_t addr; + uint16 port; + uint32 file_index; + char *info; + bool patched; + + g_assert(NODE_IS_UDP(n)); + g_assert(GTA_MSG_PUSH_REQUEST == gnutella_header_get_function(&n->header)); + + info = &n->dataGUID_RAW_SIZE; /* Start of file information */ + file_index = peek_le32(&info0); + + if (QUERY_FW2FW_FILE_INDEX != file_index) + return; + + /* + * Dealing with a PUSH sent over UDP (to a push-proxy) to initiate + * a FW-FW transfer by the recipient, which may or may not be us (i.e. + * we may have to route this message first, to a leaf). + * + * To be able to properly initiate the RUDP connection, the recipient will + * have to contact the sending host on the source port of the UDP message, + * not on the port that is contained in the PUSH message (to properly + * handle the case of NAT firewalls). + * + * We also patch the address within the PUSH message with the source + * address if they do not match. + * + * See doc/gnutella/RUDP for explanations on RUDP and FW-FW transfers. + * --RAM, 2012-10-27 + */ + + gnet_stats_inc_general(GNR_UDP_FW2FW_PUSHES); + + if (guid_eq(n->data, GNET_PROPERTY(servent_guid))) + gnet_stats_inc_general(GNR_UDP_FW2FW_PUSHES_TO_SELF); + + addr = host_addr_peek_ipv4(&info4); + port = peek_le16(&info8); + + if (GNET_PROPERTY(node_debug) > 1) { + g_debug("NODE %s from %s asks for FW-FW transfers to %s", + gmsg_infostr_full_split(n->header, n->data, n->size), + node_infostr(n), host_addr_port_to_string(addr, port)); + } + + patched = FALSE; + + if (!host_addr_equiv(addr, n->addr) && host_addr_is_ipv4(n->addr)) { + poke_be32(&info4, host_addr_ipv4(n->addr)); + patched = TRUE; + } + + if (port != n->port) { + poke_le16(&info8, n->port); + patched = TRUE; + } + + if (patched) { + if (GNET_PROPERTY(node_debug)) { + g_debug("NODE patched PUSH target from %s to %s for FW-FW", + host_addr_port_to_string(addr, port), + host_addr_port_to_string2(host_addr_peek_ipv4(&info4), + peek_le16(&info8))); + } + gnet_stats_inc_general(GNR_UDP_FW2FW_PUSHES_PATCHED); + } +} + +/** * Processing of messages. * * @attention @@ -7329,10 +8953,10 @@ * since we may invalidate that node during the processing. */ static void -node_parse(struct gnutella_node *n) +node_parse(gnutella_node_t *n) { - gboolean drop = FALSE; - gboolean has_ggep = FALSE; + bool drop = FALSE; + bool has_ggep = FALSE; size_t regular_size = (size_t) -1; /* -1 signals: regular size */ struct route_dest dest; query_hashvec_t *qhv = NULL; @@ -7373,7 +8997,7 @@ gnutella_header_get_hops(&n->header) == 0 ) { const struct guid *muid = gnutella_header_get_muid(&n->header); - + if (peek_u8(&muid->v8) == 0xff && peek_u8(&muid->v15) >= 1) n->attrs |= NODE_A_PONG_CACHING; n->flags &= ~NODE_F_HDSK_PING; /* Clear indication */ @@ -7622,7 +9246,7 @@ node_fire_node_flags_changed(n); } if (n->qrt_receive != NULL) { - gboolean done; + bool done; if (!qrt_receive_next(n->qrt_receive, &done)) return; /* Node BYE-ed */ if (done) { @@ -7635,21 +9259,21 @@ case GTA_MSG_SEARCH_RESULTS: /* "semi-pongs" */ if (host_low_on_pongs) { host_addr_t addr; - guint16 port; + uint16 port; node_extract_host(n, &addr, &port); host_add_semi_pong(addr, port); } break; + case GTA_MSG_PUSH_REQUEST: /* Push */ + if (NODE_IS_UDP(n)) + node_patch_push_fw2fw(n); + break; case GTA_MSG_HSEP_DATA: hsep_process_msg(n, tm_time()); goto reset_header; case GTA_MSG_RUDP: - /* Not ready for prime time */ -#if 0 - rudp_handle_packet(n->addr, n->port, - n->socket->buf, n->size + GTA_HEADER_SIZE); -#endif + /* UDP traffic caught at a lower level, TCP traffic is just ignored */ goto reset_header; default: break; @@ -7665,7 +9289,7 @@ case GTA_MSG_PUSH_REQUEST: /* Only handle if no unknown header flags */ if (0 == n->header_flags) - handle_push_request(n); + handle_push_request(n, NULL); break; case GTA_MSG_SEARCH: /* Only handle if no unknown header flags */ @@ -7803,9 +9427,14 @@ /* * A leaf-originated query needs to be handled via the dynamic * query mechanism. + * + * Skip duplicates coming from leaves with a higher TTL (leaves doing + * dynamic querying of their own?... that's funny but happens!). + * --RAM, 2014-03-10 */ - dq_launch_net(n, qhv, search_request_media(sri)); + if (!dest.duplicate) + dq_launch_net(n, qhv, sri); } else if (settings_is_ultra()) { /* @@ -7831,8 +9460,20 @@ * fixed-sized message enriched with trailing GGEP extensions. */ - if (qhv != NULL) - qrt_route_query(n, qhv); + if (qhv != NULL) { + g_soft_assert_log(dest.type != ROUTE_NONE, + "%s%s", dest.duplicate ? "DUP " : "", + gmsg_infostr_full_split(n->header, n->data, n->size)); + + /* + * If the message is a duplicate (with higher TTL, or we would + * not route it), make sure we exclude leaves: they already + * got the message the first time we saw the query (with a + * lower TTL then). --RAM, 2012-11-02 + */ + + qrt_route_query(n, qhv, !dest.duplicate); + } /* Leaves do not relay queries */ @@ -7882,13 +9523,13 @@ clean_dest: search_request_info_free_null(&sri); if (dest.type == ROUTE_MULTI) - g_slist_free(dest.ur.u_nodes); + pslist_free(dest.ur.u_nodes); } static void -node_drain_hello(gpointer data, int source, inputevt_cond_t cond) +node_drain_hello(void *data, int source, inputevt_cond_t cond) { - struct gnutella_node *n = data; + gnutella_node_t *n = data; node_check(n); socket_check(n->socket); @@ -7916,14 +9557,61 @@ } /** - * Process incoming Gnutella datagram. + * Check whether datagram being process from a UDP host was received a "long" + * time ago (delayed processing from application-level RX UDP queue). + * + * This allows selective dropping of "old" datagrams to accelerate the flushing + * of the RX queue by not handling messages. The advantage over letting the + * kernel blindly drop them is that we can pick which ones we want to discard! + * + * We can only get "old" messages from the unreliable UDP layer. Indeed, + * messages received through the semi-reliable UDP layer take longer (there + * can be retransmissions at the lower level) and messages are delivered + * as soon as they have been fully re-assembled. + * + * @return TRUE if UDP datagram was received a while back. */ -void -node_udp_process(gnutella_node_t *n, struct gnutella_socket *s) +bool +node_udp_is_old(const gnutella_node_t *n) +{ + return socket_udp_is_old(n->socket); +} + +/** + * Check whether message comes from a hostile UDP host. + * + * @return TRUE if message came from a hostile host and must be ignored. + */ +bool +node_hostile_udp(gnutella_node_t *n) +{ + hostiles_flags_t hostile = hostiles_check(n->addr); + + if G_UNLIKELY(hostiles_flags_are_bad(hostile)) { + if (GNET_PROPERTY(udp_debug)) { + g_warning("UDP got %s%s from bad hostile %s (%s) -- dropped", + node_udp_is_old(n) ? "OLD " : "", + NODE_TALKS_G2(n) ? + g2_msg_infostr(n->data, n->size) : + gmsg_infostr_full_split(&n->header, n->data, n->size), + node_infostr(n), hostiles_flags_to_string(hostile)); + } + gnet_stats_count_dropped(n, MSG_DROP_HOSTILE_IP); + return TRUE; + } + + return FALSE; +} + +/** + * Process Gnutella message that has been setup in the pseudo UDP node. + */ +static void +node_handle(gnutella_node_t *n) { - gboolean drop_hostile = TRUE; + bool drop_hostile = TRUE; - node_pseudo_setup(n, s); + g_assert(NODE_IS_UDP(n)); /* UDP node, no DHT traffic here */ /* * The node_parse() routine was written to process incoming Gnutella @@ -7943,10 +9631,20 @@ g_assert(n->status == GTA_NODE_CONNECTED && NODE_IS_READABLE(n)); - node_add_rx_given(n, n->size + GTA_HEADER_SIZE); + /* + * When receiving through the semi-reliable UDP layer, which can natively + * deflate payloads, we want to monitor the overall performance of the + * layer, including acknowledgment overhead. + * + * Therefore, all the data that is physically seen by the application layer + * is "inflated" data (regardless of whether the message was transmitted + * in deflated form). + */ - if (NODE_IS_DHT(n)) - goto hostile_check; + if (NODE_RX_COMPRESSED(n)) + node_add_rx_inflated(n, n->size + GTA_HEADER_SIZE); + else + node_add_rx_given(n, n->size + GTA_HEADER_SIZE); /* * We can't know for sure what the Gnutella node address is, so we use @@ -7975,7 +9673,7 @@ case GTA_MSG_STANDARD: /* * Check for UDP compression support, marking host if we can send - * UDP compressed replies. --RAM, 2006-08-13 + * UDP compressed replies. */ if (gnutella_header_get_ttl(&n->header) & GTA_UDP_CAN_INFLATE) @@ -7989,37 +9687,22 @@ * Discard incoming datagrams from registered hostile IP addresses. */ -hostile_check: - - if (drop_hostile && hostiles_check(n->addr)) { - if (GNET_PROPERTY(udp_debug)) - g_warning("UDP got %s from hostile %s -- dropped", - gmsg_infostr_full(s->buf, s->pos), node_addr(n)); - gnet_stats_count_dropped(n, MSG_DROP_HOSTILE_IP); - return; - } - - /* - * DHT messages now leave the Gnutella processing path. - */ - - if (NODE_IS_DHT(n)) { - kmsg_received(s->buf, s->pos, s->addr, s->port, n); + if (drop_hostile && node_hostile_udp(n)) return; - } /* - * Continuing here only with Gnutella traffic. + * Check limits. */ - if (ctl_limit(s->addr, CTL_D_UDP)) { + if (ctl_limit(n->addr, CTL_D_UDP)) { if (gnutella_header_get_function(&n->header) == GTA_MSG_PUSH_REQUEST) goto proceed; /* For now, until we know we are the target */ if (GNET_PROPERTY(udp_debug) || GNET_PROPERTY(ctl_debug) > 2) { - g_warning("CTL UDP got %s from %s %s -- dropped", - gmsg_infostr_full(s->buf, s->pos), node_addr(n), - gip_country_cc(s->addr)); + g_warning("CTL UDP got %s%s from %s %s -- dropped", + node_udp_is_old(n) ? "OLD " : "", + gmsg_infostr_full_split(n->header, n->data, n->size), + node_infostr(n), gip_country_cc(n->addr)); } gnet_stats_count_dropped(n, MSG_DROP_LIMIT); @@ -8041,10 +9724,14 @@ g_assert(!(gnutella_header_get_ttl(&n->header) & GTA_UDP_DEFLATED)); if (GNET_PROPERTY(oob_proxy_debug) > 1) { - if (GTA_MSG_SEARCH_RESULTS == gnutella_header_get_function(&n->header)) - g_debug("QUERY OOB results for %s from %s", - guid_hex_str(gnutella_header_get_muid(&n->header)), - node_addr(n)); + uint8 function = gnutella_header_get_function(&n->header); + if (GTA_MSG_SEARCH_RESULTS == function) { + const guid_t *muid = gnutella_header_get_muid(&n->header); + g_debug("QUERY OOB%s %sresults for %s from %s", + oob_proxy_muid_proxied(muid) ? "-proxied" : "", + NODE_CAN_SR_UDP(n) ? "(semi-reliable) " : "", + guid_hex_str(muid), node_addr(n)); + } } node_parse(n); @@ -8053,10 +9740,186 @@ } /** - * Called when asynchronous connection to an outgoing node is established. + * Process incoming UDP Gnutella datagram. */ void -node_init_outgoing(struct gnutella_node *n) +node_udp_process(gnutella_node_t *n, const struct gnutella_socket *s, + const void *data, size_t len) +{ + node_pseudo_setup(n, deconstify_pointer(data), len); + + /* + * DHT messages now leave the Gnutella processing path. + */ + + if (NODE_IS_DHT(n)) { + node_add_rx_given(n, n->size + GTA_HEADER_SIZE); + kmsg_received(data, len, s->addr, s->port, n); + return; + } + + node_handle(n); +} + +/** + * Data indication callback for the semi-reliable UDP layer. + * + * @return TRUE, since it is always OK. + */ +static bool +node_udp_sr_data_ind(rxdrv_t *unused_rx, pmsg_t *mb, const gnet_host_t *from) +{ + gnutella_node_t *n; + size_t length; + + (void) unused_rx; + + length = pmsg_size(mb); + n = node_pseudo_get_from_mb(mb, from); + + /* + * We get back a NULL node if UDP was disbabled or if the port is invalid. + */ + + if G_UNLIKELY(NULL == n) { + g_warning("UDP-SR %s() cannot process %d-byte message from %s", + G_STRFUNC, pmsg_size(mb), gnet_host_to_string(from)); + goto done; + } + + /* + * The message was received through the semi-reliable UDP layer, hence + * we never went through udp_is_valid_gnet(), which is only called on + * plain Gnutella messages received from UDP. Therefore, no accounting + * of the message was done yet, and we don't know whether what we got + * is even a valid Gnutella message! + */ + + if (!udp_is_valid_gnet_split(n, NULL, FALSE, n->header, n->data, length)) + goto done; + + if (GNET_PROPERTY(log_sr_udp_rx)) { + g_info("UDP-SR got %s from %s", + gmsg_infostr_full_split(n->header, n->data, n->size), + gnet_host_to_string(from)); + } + + node_handle(n); + + /* FALL THROUGH */ + +done: + pmsg_free(mb); + return TRUE; +} + +/** + * Data indication callback for the semi-reliable UDP layer for G2. + * + * @return TRUE, since it is always OK. + */ +static bool +node_udp_g2_data_ind(rxdrv_t *unused_rx, pmsg_t *mb, const gnet_host_t *from) +{ + gnutella_node_t *n; + bool drop_hostile = TRUE; + + (void) unused_rx; + + n = node_udp_g2_get_addr_port( + gnet_host_get_addr(from), gnet_host_get_port(from)); + + if (NULL == n) + goto done; /* G2 support is disabled */ + + node_check(n); + g_assert(NODE_TALKS_G2(n)); + + /* + * When receiving through the semi-reliable UDP layer, which can natively + * deflate payloads, we want to monitor the overall performance of the + * layer, including acknowledgment overhead. + * + * Therefore, all the data that is physically seen by the application layer + * is "inflated" data (regardless of whether the message was transmitted + * in deflated form). + */ + + if (NODE_RX_COMPRESSED(n)) + node_add_rx_inflated(n, n->size); + else + node_add_rx_given(n, n->size); + + /* + * We can't know for sure what the Gnutella node address is, so we use + * that of the incoming packet. Hopefully, the port used to send the + * message will not be a transient one (unbound socket, or NAT-ed). + */ + + n->gnet_addr = n->addr; + n->gnet_port = n->port; + + /* + * Populate the pseudo-node with the G2 traffic, as if we had successfully + * issued a node_g2_read(). + */ + + n->size = pmsg_size(mb); + n->data = deconstify_pointer(pmsg_read_base(mb)); + + n->received++; + gnet_stats_count_received_payload(n, n->data); + + /* + * Increment reception stats, and see whether we need to drop incoming + * packets coming from hostile nodes. + */ + + switch (g2_msg_type(n->data, n->size)) { + case G2_MSG_Q2: + node_inc_rx_query(n); + break; + case G2_MSG_QH2: + node_inc_rx_qhit(n); + drop_hostile = FALSE; /* Filter later so that we can peek at them */ + break; + default: + break; + } + + if (drop_hostile && node_hostile_udp(n)) + goto done; + + /* + * Check limits. + */ + + if (ctl_limit(n->addr, CTL_D_UDP)) { + if (GNET_PROPERTY(udp_debug) || GNET_PROPERTY(ctl_debug) > 2) { + g_warning("CTL UDP got %s%s from %s %s -- dropped", + node_udp_is_old(n) ? "OLD " : "", + g2_msg_infostr(n->data, n->size), + node_infostr(n), gip_country_cc(n->addr)); + } + + gnet_stats_count_dropped(n, MSG_DROP_LIMIT); + goto done; + } + + /* Handle the G2 message we got from the UDP layer */ + + g2_node_handle(n); + +done: + pmsg_free(mb); + return TRUE; +} + +/** + * Called when asynchronous connection to an outgoing node is established. + */ +static void +node_init_outgoing(gnutella_node_t *n) { struct gnutella_socket *s = n->socket; ssize_t sent; @@ -8077,36 +9940,10 @@ n->hello.size = MAX_LINE_SIZE; n->hello.ptr = walloc(n->hello.size); - /* - * Special hack for LimeWire, which insists on the presence of dynamic - * querying headers and high outdegree to consider a leaf "good". - * They should fix their clueless code instead of forcing everyone to - * emit garbage. - * - * Oh well, contend them with totally bogus (fixed) headers. - * - * --RAM, 2004-08-05 - */ - - if (settings_is_ultra()) { - gm_snprintf(degree, sizeof(degree), - "X-Degree: %d\r\n" - "X-Max-TTL: %d\r\n", - (GNET_PROPERTY(up_connections) + GNET_PROPERTY(max_connections) - - GNET_PROPERTY(normal_connections)) / 2, - GNET_PROPERTY(max_ttl)); - } else { - gm_snprintf(degree, sizeof(degree), - "X-Dynamic-Querying: 0.1\r\n" - "X-Ultrapeer-Query-Routing: 0.1\r\n" - "X-Degree: 32\r\n" - "X-Max-TTL: 4\r\n"); - } - { host_addr_t addr; - guint16 port; - + uint16 port; + port = socket_listen_port(); addr = listen_addr(); if (is_host_addr(addr)) { @@ -8124,70 +9961,122 @@ } } - if ( - GNET_PROPERTY(enable_guess) && - (settings_is_ultra() || GNET_PROPERTY(enable_guess_client)) - ) { - gm_snprintf(guess, sizeof(guess), - "X-Guess: %d.%d\r\n", - SEARCH_GUESS_MAJOR, SEARCH_GUESS_MINOR); + if (NODE_TALKS_G2(n)) { + n->hello.len = str_bprintf(n->hello.ptr, n->hello.size, + "%s%d.%d\r\n" + "Listen-IP: %s%s%s\r\n" + "Remote-IP: %s\r\n" + "User-Agent: %s\r\n" + "Bye-Packet: 0.1\r\n" + "Accept: %s\r\n" + "%s" /* "Accept-Encoding: deflate */ + "X-Live-Since: %s\r\n" + "X-Hub: False\r\n" + "X-Hub-Needed: True\r\n" + "\r\n", + GNUTELLA_HELLO, n->proto_major, n->proto_minor, + my_addr, my_addr0 && my_addr_v60 ? ", " : "", my_addr_v6, + host_addr_to_string(n->addr), + version_string, + APP_G2, + GNET_PROPERTY(gnet_deflate_enabled) + ? ACCEPT_ENCODING_DEFLATE : "", + start_rfc822_date); } else { - guess0 = '\0'; - } + /* + * Special hack for LimeWire, which insists on the presence of + * dynamic querying headers and high outdegree to consider a + * leaf "good". They should fix their clueless code instead of + * forcing everyone to emit garbage. + * + * Oh well, contend them with totally bogus (fixed) headers. + * --RAM, 2004-08-05 + */ - /* - * IPv6-Ready: emit our GUID during handshake so that we can - * detect connections to the same host via different IP protocols. - */ + if (settings_is_ultra()) { + str_bprintf(degree, sizeof(degree), + "X-Degree: %d\r\n" + "X-Max-TTL: %d\r\n", + (GNET_PROPERTY(up_connections) + + GNET_PROPERTY(max_connections) - + GNET_PROPERTY(normal_connections)) / 2, + GNET_PROPERTY(max_ttl)); + } else { + str_bprintf(degree, sizeof(degree), + "X-Dynamic-Querying: 0.1\r\n" + "X-Ultrapeer-Query-Routing: 0.1\r\n" + "X-Degree: 32\r\n" + "X-Max-TTL: 4\r\n"); + } - gnet_prop_get_storage(PROP_SERVENT_GUID, &guid, sizeof guid); - n->hello.len = gm_snprintf(n->hello.ptr, n->hello.size, - "%s%d.%d\r\n" - "Node: %s%s%s\r\n" - "Remote-IP: %s\r\n" - "User-Agent: %s\r\n" - "Pong-Caching: 0.1\r\n" - "Bye-Packet: 0.1\r\n" - "GGEP: 0.5\r\n" - "GUID: %s\r\n" - "Vendor-Message: 0.2\r\n" - "X-Query-Routing: 0.2\r\n" - "X-Requeries: False\r\n" - "%s" /* "Accept-Encoding: deflate */ - "X-Token: %s\r\n" - "X-Live-Since: %s\r\n" - "X-Ultrapeer: %s\r\n" - "%s" /* X-Ultrapeer-Query-Routing */ - "%s" /* X-Degree + X-Max-TTL */ - "%s" /* X-Dynamic-Querying */ - "%s" /* X-Ext-Probes */ - "%s", /* X-Guess */ - GNUTELLA_HELLO, - n->proto_major, n->proto_minor, - my_addr, my_addr0 && my_addr_v60 ? ", " : "", my_addr_v6, - host_addr_to_string(n->addr), - version_string, - guid_hex_str(&guid), - GNET_PROPERTY(gnet_deflate_enabled) - ? "Accept-Encoding: deflate\r\n" : "", - tok_version(), - start_rfc822_date, - settings_is_leaf() ? "False" : "True", - settings_is_ultra() ? "X-Ultrapeer-Query-Routing: 0.1\r\n" : "", - degree, - settings_is_ultra() ? "X-Dynamic-Querying: 0.1\r\n" : "", - settings_is_ultra() ? "X-Ext-Probes: 0.1\r\n" : "", - guess - ); + if ( + GNET_PROPERTY(enable_guess) && + (settings_is_ultra() || GNET_PROPERTY(enable_guess_client)) + ) { + str_bprintf(guess, sizeof(guess), + "X-Guess: %d.%d\r\n", + SEARCH_GUESS_MAJOR, SEARCH_GUESS_MINOR); + } else { + guess0 = '\0'; + } + + /* + * IPv6-Ready: emit our GUID during handshake so that we can + * detect connections to the same host via different IP protocols. + */ + + gnet_prop_get_storage(PROP_SERVENT_GUID, &guid, sizeof guid); + + n->hello.len = str_bprintf(n->hello.ptr, n->hello.size, + "%s%d.%d\r\n" + "Node: %s%s%s\r\n" + "Remote-IP: %s\r\n" + "User-Agent: %s\r\n" + "Pong-Caching: 0.1\r\n" + "Bye-Packet: 0.1\r\n" + "GGEP: 0.5\r\n" + "GUID: %s\r\n" + "Vendor-Message: 0.2\r\n" + "X-Query-Routing: 0.2\r\n" + "X-Requeries: False\r\n" + "%s" /* Upgrade: TLS/1.0 */ + "%s" /* Accept-Encoding: deflate */ + "X-Token: %s\r\n" + "X-Live-Since: %s\r\n" + "X-Ultrapeer: %s\r\n" + "%s" /* X-Ultrapeer-Query-Routing */ + "%s" /* X-Degree + X-Max-TTL */ + "%s" /* X-Dynamic-Querying */ + "%s" /* X-Ext-Probes */ + "%s", /* X-Guess */ + GNUTELLA_HELLO, n->proto_major, n->proto_minor, + my_addr, my_addr0 && my_addr_v60 ? ", " : "", my_addr_v6, + host_addr_to_string(n->addr), + version_string, + guid_hex_str(&guid), + tls_enabled() && !socket_uses_tls(n->socket) ? + UPGRADE_TLS : "", + GNET_PROPERTY(gnet_deflate_enabled) ? + ACCEPT_ENCODING_DEFLATE : "", + tok_version(), + start_rfc822_date, + settings_is_leaf() ? "False" : "True", + settings_is_ultra() ? "X-Ultrapeer-Query-Routing: 0.1\r\n" : "", + degree, + settings_is_ultra() ? "X-Dynamic-Querying: 0.1\r\n" : "", + settings_is_ultra() ? "X-Ext-Probes: 0.1\r\n" : "", + guess + ); - header_features_generate(FEATURES_CONNECTIONS, - n->hello.ptr, n->hello.size, &n->hello.len); + header_features_generate(FEATURES_CONNECTIONS, + n->hello.ptr, n->hello.size, &n->hello.len); - n->hello.len += gm_snprintf(&n->hello.ptrn->hello.len, - n->hello.size - n->hello.len, "\r\n"); + n->hello.len += str_bprintf(&n->hello.ptrn->hello.len, + n->hello.size - n->hello.len, "\r\n"); - g_assert(n->hello.len < n->hello.size); + g_assert(n->hello.len < n->hello.size); + } /* * We don't retry a connection from 0.6 to 0.4 if we fail to write the @@ -8195,7 +10084,7 @@ */ if (socket_uses_tls(n->socket)) - n->flags |= NODE_F_TLS; + n->attrs2 |= NODE_A2_TLS; } else { socket_evt_clear(s); @@ -8267,7 +10156,7 @@ * and yet has more data enqueued. */ void -node_flushq(struct gnutella_node *n) +node_flushq(gnutella_node_t *n) { if (NULL == n->socket) return; /* Socket has been nullified on a write error */ @@ -8283,7 +10172,7 @@ * Called by queue to disable the flush mode. */ void -node_unflushq(struct gnutella_node *n) +node_unflushq(gnutella_node_t *n) { if (NULL == n->socket) return; /* Socket has been nullified on a write error */ @@ -8295,7 +10184,7 @@ * Called when the queue service routine is switched ON/OFF. */ void -node_tx_service(struct gnutella_node *n, gboolean unused_on) +node_tx_service(gnutella_node_t *n, bool unused_on) { (void) unused_on; node_fire_node_flags_changed(n); @@ -8305,9 +10194,10 @@ * Called by message queue when the node enters the warn zone. */ void -node_tx_enter_warnzone(struct gnutella_node *n) +node_tx_enter_warnzone(gnutella_node_t *n) { node_fire_node_flags_changed(n); + entropy_harvest_time(); /* * If uploads are stalling, output bandwdith is probably so saturated @@ -8334,7 +10224,7 @@ * Called by message queue when the node leaves the warn zone. */ void -node_tx_leave_warnzone(struct gnutella_node *n) +node_tx_leave_warnzone(gnutella_node_t *n) { node_fire_node_flags_changed(n); } @@ -8343,7 +10233,7 @@ * Called by message queue when the node enters TX flow control. */ void -node_tx_enter_flowc(struct gnutella_node *n) +node_tx_enter_flowc(gnutella_node_t *n) { n->tx_flowc_date = tm_time(); @@ -8351,6 +10241,7 @@ vmsg_send_hops_flow(n, 0, NULL, NULL); /* Disable all query traffic */ node_fire_node_flags_changed(n); + entropy_harvest_time(); /* * If uploads are stalling, output bandwdith is probably so saturated @@ -8389,7 +10280,7 @@ * Callback invoked when the Hops-Flow message has been processed by the queue. */ static void -node_tx_flowc_left(gnutella_node_t *n, gboolean sent, void *unused_arg) +node_tx_flowc_left(gnutella_node_t *n, bool sent, void *unused_arg) { (void) unused_arg; @@ -8431,13 +10322,13 @@ * Called by message queue when the node leaves TX flow control. */ void -node_tx_leave_flowc(struct gnutella_node *n) +node_tx_leave_flowc(gnutella_node_t *n) { if (GNET_PROPERTY(node_debug) > 4) { int spent = delta_time(tm_time(), n->tx_flowc_date); g_debug("node %s spent %d second%s in TX FLOWC", - node_addr(n), spent, spent == 1 ? "" : "s"); + node_addr(n), spent, plural(spent)); } if (NODE_USES_UDP(n)) { @@ -8461,16 +10352,17 @@ * Called by message queue when swift mode changes. */ void -node_tx_swift_changed(struct gnutella_node *n) +node_tx_swift_changed(gnutella_node_t *n) { node_fire_node_flags_changed(n); + entropy_harvest_time(); } /** * Disable reading callback. */ static void -node_disable_read(struct gnutella_node *n) +node_disable_read(gnutella_node_t *n) { g_assert(n->rx); @@ -8487,7 +10379,7 @@ * Called when the Bye message has been successfully sent. */ static void -node_bye_sent(struct gnutella_node *n) +node_bye_sent(gnutella_node_t *n) { if (GNET_PROPERTY(node_debug) > 2) g_debug("finally sent BYE \"%s\" to %s", n->error_str, node_infostr(n)); @@ -8517,18 +10409,65 @@ } /** + * Grow node data space to be able to fit the amount of requested bytes, + * copying any data that was already present. + * + * @attention + * Caller must be careful: the n->data pointer may have changed upon return. + */ +void +node_grow_data(gnutella_node_t *n, size_t len) +{ + node_check(n); + g_assert(size_is_positive(len)); + + /* + * Be careful, we don't always dynamically allocate the space for data: + * only TCP nodes do, the UDP nodes tend to use the socket buffer or + * a pre-allocated buffer. + * + * Since this routine is only called during search_compact() to handle + * queries, buffers used by UDP nodes should be already large enough, + * but assertions guarantee that we're not making the wrong bet. + */ + + if G_UNLIKELY(payload_inflate_buffer == n->data) { + /* There should be enough room */ + g_assert(len <= UNSIGNED(payload_inflate_buffer_len)); + } else if (n->data == &n->socket->bufGTA_HEADER_SIZE) { + /* There should be enough room */ + g_assert(len <= sizeof n->socket->buf_size - GTA_HEADER_SIZE); + } else if (NODE_USES_UDP(n)) { + /* UDP traffic not pointing to socket's buffer: delayed datagram */ + g_assert(n->socket->buf_size >= n->size); + memmove(&n->socket->buf0, n->data, n->size); + n->data = &n->socket->buf0; + /* There should be enough room in the buffer! */ + g_assert(len <= n->socket->buf_size); + } else { + /* This is a node where we go through node_read() -- TCP connection */ + g_assert(0 != n->allocated); + + if (n->allocated < len) { + n->data = hrealloc(n->data, len); + n->allocated = len; + } + } +} + +/** * Read data from the message buffer we just received. * * @return TRUE whilst we think there is more data to read in the buffer. */ -static gboolean -node_read(struct gnutella_node *n, pmsg_t *mb) +static bool +node_read(gnutella_node_t *n, pmsg_t *mb) { int r; if (!n->have_header) { /* We haven't got the header yet */ char *w = (char *) &n->header; - gboolean kick = FALSE; + bool kick = FALSE; r = pmsg_read(mb, &wn->pos, GTA_HEADER_SIZE - n->pos); n->pos += r; @@ -8643,13 +10582,13 @@ n->pos = 0; - if (n->size != n->allocated) { + if (n->size > n->allocated) { /* * We need to grow the allocated data buffer * Since maximum could change dynamically one day, compute it. */ - guint32 maxsize = settings_max_msg_size(); + uint32 maxsize = settings_max_msg_size(); if (maxsize < n->size) { g_warning("BUG got %u byte %s message, should have kicked node", @@ -8699,18 +10638,165 @@ } /** + * Read G2 data from the message buffer we just received. + * + * @return TRUE whilst we think there is more data to read in the buffer. + */ +static bool +node_g2_read(gnutella_node_t *n, pmsg_t *mb) +{ + int r; + + /* + * Grabbing of the G2 frame works thusly: + * + * As long as n->have_header is FALSE, we read bytes until we have enough + * to figure out the length of the whole frame, checking after each byte. + * At that point n->have_header is set to TRUE and n->size is set with + * the frame length. + */ + + if (!n->have_header) { + char *w; + size_t len; + + if G_UNLIKELY(NULL == n->data) { + g_assert(0 == n->allocated); + n->allocated = NODE_G2_MIN_DATASIZE; + n->data = halloc(n->allocated); + } + + w = n->data; + + /* + * We need 4 bytes at most to completely determine the size of the + * whole G2 frame (G2 framing allows 3 bytes at most to specify the + * length of the data). + * + * However, most packets will be less than 65536 bytes in practice, + * since this is way too large already anyway, hence we can read only + * 3 bytes for our first probe. + */ + +#define NODE_G2_MINLEN 4 +#define NODE_G2_PROBELEN (NODE_G2_MINLEN - 1) + + if (0 == n->pos) { + r = pmsg_read(mb, w, NODE_G2_PROBELEN); + if G_UNLIKELY(0 == r) + return FALSE; /* Reached end of buffer */ + n->pos += r; + node_add_rx_read(n, r); + len = g2_frame_whole_length(w, n->pos); + if (0 == len) + return FALSE; /* Not read enough to compute length */ + } else { + for (;;) { + g_assert(n->pos < NODE_G2_MINLEN); + g_assert(n->allocated >= NODE_G2_MINLEN); + + r = pmsg_read(mb, &wn->pos, 1); + n->pos += r; + node_add_rx_read(n, r); + len = g2_frame_whole_length(w, n->pos); + if (len != 0) + break; + if (0 == r) + return FALSE; /* Reached end of buffer */ + if (n->pos >= NODE_G2_MINLEN) { + node_bye(n, 400, "Garbled input stream"); + return FALSE; + } + } + } + +#undef NODE_G2_MINLEN + + /* + * Since we have correctly determined the frame length above, + * we cannot have read more bytes than the frame holds! + */ + + g_assert(len >= n->pos); + + /* + * If the length is 1, we reached an "end of stream" byte. + */ + + if G_UNLIKELY(1 == len) { + node_bye(n, 202, "Got End-of-Stream byte"); + return FALSE; + } + + /* + * If the length above our limit, abort: the stream is likely + * to be corrupted. + */ + + if G_UNLIKELY(len > GNET_PROPERTY(other_messages_kick_size)) { + node_disable_read(n); + node_bye(n, 400, "Too large a frame (%zu bytes)", len); + return FALSE; + } + + /* + * OK, we are going to read the whole frame, allocate data space. + */ + + if G_UNLIKELY(n->allocated < len) { + n->data = hrealloc(n->data, len); + n->allocated = len; + } + + n->have_header = TRUE; + n->size = len; + ZERO(&n->header); /* No header for G2 messages */ + + g_assert((size_t) n->size == len); /* n->size large enough to hold */ + } + + /* Reading of the whole frame data */ + + r = pmsg_read(mb, n->data + n->pos, n->size - n->pos); + + n->pos += r; + node_add_rx_read(n, r); + + g_assert(n->pos <= n->size); + + if (n->pos < n->size) + return FALSE; + + /* Handle the G2 message */ + + n->received++; + gnet_stats_count_received_payload(n, n->data); + g2_node_handle(n); + + /* + * Reset parsing state for next frame. + */ + + n->have_header = FALSE; + n->pos = 0; + + return TRUE; /* There may be more data */ +} + +/** * RX data indication callback used to give us some new Gnet traffic in a * low-level message structure (which can contain several Gnet messages). * * @return FALSE if an error occurred. */ -static gboolean +static bool node_data_ind(rxdrv_t *rx, pmsg_t *mb) { - struct gnutella_node *n = rx_owner(rx); + gnutella_node_t *n = rx_owner(rx); - g_assert(mb); + g_assert(mb != NULL); g_assert(NODE_IS_CONNECTED(n)); + g_assert(!NODE_TALKS_G2(n)); /* * Since node_read() can shutdown the node, we must explicitly check @@ -8735,13 +10821,50 @@ } /** + * RX data indication callback used to give us some new G2 traffic in a + * low-level message structure (which can contain several G2 messages). + * + * @return FALSE if an error occurred. + */ +static bool +node_g2_data_ind(rxdrv_t *rx, pmsg_t *mb) +{ + gnutella_node_t *n = rx_owner(rx); + + g_assert(mb != NULL); + g_assert(NODE_IS_CONNECTED(n)); + g_assert(NODE_TALKS_G2(n)); + + /* + * Since node_read() can shutdown the node, we must explicitly check + * the the GTA_NODE_CONNECTED status and can't use NODE_IS_CONNECTED(). + * Likewise, processing of messages can cause the node to become + * unreadable, so we need to check that as well. + * + * The node_g2_read() routine will return FALSE when it detects that the + * message buffer is empty. + */ + + n->last_update = n->last_rx = tm_time(); + n->flags |= NODE_F_ESTABLISHED; /* Since we've got Gnutella data */ + + while (n->status == GTA_NODE_CONNECTED && NODE_IS_READABLE(n)) { + if (!node_g2_read(n, mb)) + break; + } + + pmsg_free(mb); + return n->status == GTA_NODE_CONNECTED; +} + +/** * Called when a node sends a message with TTL=0. * * @return TRUE if node was removed (due to a duplicate bye, probably), * FALSE otherwise. */ void -node_sent_ttl0(struct gnutella_node *n) +node_sent_ttl0(gnutella_node_t *n) { g_assert(gnutella_header_get_ttl(&n->header) == 0); @@ -8764,12 +10887,12 @@ * Send a BYE message to all the nodes matching the specified flags. */ static void -node_bye_flags(guint32 mask, int code, const char *message) +node_bye_flags(uint32 mask, int code, const char *message) { - const GSList *sl; + const pslist_t *sl; - for (sl = sl_nodes; sl; sl = g_slist_next(sl)) { - struct gnutella_node *n = sl->data; + PSLIST_FOREACH(sl_nodes, sl) { + gnutella_node_t *n = sl->data; if (n->status == GTA_NODE_REMOVING || n->status == GTA_NODE_SHUTDOWN) continue; @@ -8783,13 +10906,13 @@ * Send a BYE message to all the nodes but the one supplied as argument. */ static void -node_bye_all_but_one(struct gnutella_node *nskip, +node_bye_all_but_one(gnutella_node_t *nskip, int code, const char *message) { - GSList *sl; + pslist_t *sl; - for (sl = sl_nodes; sl; sl = g_slist_next(sl)) { - struct gnutella_node *n = sl->data; + PSLIST_FOREACH(sl_nodes, sl) { + gnutella_node_t *n = sl->data; if (n->status == GTA_NODE_REMOVING || n->status == GTA_NODE_SHUTDOWN) continue; @@ -8805,10 +10928,13 @@ * @param all when FALSE, will only wait for nodes advertizing BYE support */ void -node_bye_all(gboolean all) +node_bye_all(bool all) { - GSList *sl; - gnutella_node_t *udp_nodes = { udp_node, udp6_node, dht_node, dht6_node }; + pslist_t *sl; + gnutella_node_t *udp_nodes = { + udp_node, udp6_node, udp_sr_node, udp6_sr_node, udp_g2_node, + dht_node, dht6_node + }; unsigned i; g_assert(!in_shutdown); /* Meant to be called once */ @@ -8821,7 +10947,7 @@ * the UDP socket very shortly... */ - for (i = 0; i < G_N_ELEMENTS(udp_nodes); i++) { + for (i = 0; i < N_ITEMS(udp_nodes); i++) { gnutella_node_t *n = udp_nodesi; if (n && n->outq) { mq_clear(n->outq); @@ -8831,8 +10957,8 @@ host_shutdown(); - for (sl = sl_nodes; sl; sl = g_slist_next(sl)) { - struct gnutella_node *n = sl->data; + PSLIST_FOREACH(sl_nodes, sl) { + gnutella_node_t *n = sl->data; /* * Servent is shutdowning, cancel all pending events. @@ -8860,7 +10986,7 @@ /** * @return true whilst there are some connections with a pending BYE. */ -gboolean +bool node_bye_pending(void) { g_assert(in_shutdown); /* Cannot be called before node_bye_all() */ @@ -8869,7 +10995,7 @@ static time_t last; if (last != tm_time()) { g_debug("SHUTDOWN %d pending BYE message%s", - pending_byes, 1 == pending_byes ? "" : "s"); + pending_byes, plural(pending_byes)); last = tm_time(); } } @@ -8889,11 +11015,11 @@ * * @return TRUE if we were able to remove one connection. */ -static gboolean -node_remove_useless_leaf(gboolean *is_gtkg) +static bool +node_remove_useless_leaf(bool *is_gtkg) { - GSList *sl; - struct gnutella_node *worst = NULL; + pslist_t *sl; + gnutella_node_t *worst = NULL; int greatest = 0; time_t now = tm_time(); const char *last_reason; @@ -8901,8 +11027,8 @@ #define t(x) (last_reason = #x " (" G_STRLOC ")", (x)) - for (sl = sl_nodes; sl; sl = g_slist_next(sl)) { - struct gnutella_node *n = sl->data; + PSLIST_FOREACH(sl_nodes, sl) { + gnutella_node_t *n = sl->data; time_t target = (time_t) -1; time_delta_t diff; @@ -8937,6 +11063,8 @@ target = n->connect_date; else if t(0 == n->gnet_files_count && (n->flags & NODE_F_SHARED_INFO)) target = n->connect_date; + else if t(NODE_HAS_EMPTY_QRT(n)) + target = n->connect_date; else if t(n->recv_query_table == NULL && n->qrt_receive == NULL) target = n->connect_date; else if t(n->leaf_flowc_start != 0) @@ -8988,11 +11116,11 @@ * * @return TRUE if we were able to remove one connection. */ -static gboolean -node_remove_useless_ultra(gboolean *is_gtkg) +static bool +node_remove_useless_ultra(bool *is_gtkg) { - GSList *sl; - struct gnutella_node *worst = NULL; + pslist_t *sl; + gnutella_node_t *worst = NULL; int greatest = 0; time_t now = tm_time(); const char *last_reason; @@ -9007,8 +11135,8 @@ #define t(x) (last_reason = #x " (" G_STRLOC ")", (x)) - for (sl = sl_up_nodes; sl; sl = g_slist_next(sl)) { - struct gnutella_node *n = sl->data; + PSLIST_FOREACH(sl_up_nodes, sl) { + gnutella_node_t *n = sl->data; time_t target = (time_t) -1; qrt_info_t *qi; int diff; @@ -9102,22 +11230,22 @@ * * @return TRUE if we were able to remove one connection. */ -static gboolean -node_remove_uncompressed_ultra(gboolean *is_gtkg) +static bool +node_remove_uncompressed_ultra(bool *is_gtkg) { - GSList *sl; - struct gnutella_node *drop = NULL; + pslist_t *sl; + gnutella_node_t *drop = NULL; /* * Only operate when we're an ultra node ourselves. */ - + if (!settings_is_ultra()) return FALSE; - for (sl = sl_up_nodes; sl; sl = g_slist_next(sl)) { - struct gnutella_node *n = sl->data; - + PSLIST_FOREACH(sl_up_nodes, sl) { + gnutella_node_t *n = sl->data; + if (n->status != GTA_NODE_CONNECTED) continue; @@ -9130,10 +11258,10 @@ break; } } - - if (drop == NULL) + + if (drop == NULL) return FALSE; - + if (is_gtkg != NULL) *is_gtkg = node_is_gtkg(drop); @@ -9156,16 +11284,16 @@ * a local node, and we're having a connection from the local LAN. * Otherwise, we're just removing a bad node (the BYE code is different). */ -gboolean -node_remove_worst(gboolean non_local) +bool +node_remove_worst(bool non_local) { - GSList *sl; - GSList *m = NULL; - struct gnutella_node *n; + pslist_t *sl; + pslist_t *m = NULL; + gnutella_node_t *n; int worst = 0, score, num = 0; /* Make list of "worst" based on number of "weird" packets. */ - for (sl = sl_nodes; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(sl_nodes, sl) { n = sl->data; if (n->status != GTA_NODE_CONNECTED) continue; @@ -9183,17 +11311,17 @@ if (score > worst) { worst = score; num = 0; - gm_slist_free_null(&m); + pslist_free_null(&m); } if (score == worst) { - m = g_slist_prepend(m, n); + m = pslist_prepend(m, n); num++; } } if (m) { - m = g_slist_reverse(m); - n = g_slist_nth_data(m, random_value(num - 1)); - g_slist_free(m); + m = pslist_reverse(m); + n = pslist_nth_data(m, random_value(num - 1)); + pslist_free(m); if (non_local) node_bye_if_writable(n, 202, "Local Node Preferred"); else { @@ -9209,13 +11337,13 @@ * Initiate sending of the query routing table. * * NOTE: Callers should check NODE_IS_CONNECTED(n) again after this - * function because the node might be disconnected on return. + * function because the node might be disconnected upon return. */ static void -node_send_qrt(struct gnutella_node *n, struct routing_table *query_table) +node_send_qrt(gnutella_node_t *n, struct routing_table *query_table) { g_assert(GNET_PROPERTY(current_peermode) != NODE_P_NORMAL); - g_assert(NODE_IS_ULTRA(n)); + g_assert(NODE_IS_ULTRA(n) || NODE_TALKS_G2(n)); g_assert(NODE_IS_CONNECTED(n)); g_assert(query_table != NULL); g_assert(n->qrt_update == NULL); @@ -9240,11 +11368,11 @@ * Incrementally send the routing table patch to our Ultrapeer. */ static void -node_send_patch_step(struct gnutella_node *n) +node_send_patch_step(gnutella_node_t *n) { - gboolean ok; + bool ok; - g_assert(NODE_IS_ULTRA(n)); + g_assert(NODE_IS_ULTRA(n) || NODE_TALKS_G2(n)); g_assert(NODE_IS_CONNECTED(n)); g_assert(n->qrt_update); @@ -9292,7 +11420,7 @@ * routing table obsolete. */ void -node_qrt_discard(struct gnutella_node *n) +node_qrt_discard(gnutella_node_t *n) { g_assert(n->peermode == NODE_P_LEAF || n->peermode == NODE_P_ULTRA); @@ -9306,13 +11434,40 @@ } node_fire_node_flags_changed(n); + entropy_harvest_time(); +} + +/** + * Got new Query Routing Table. + * + * @return whether flags changed. + */ +static bool +node_qrt_new(gnutella_node_t *n, struct routing_table *query_table) +{ + bool changed = FALSE; + + qrt_get_info(query_table, n->qrt_info); + entropy_harvest_time(); + + if (n->qrt_info->is_empty) { + if (!NODE_HAS_EMPTY_QRT(n)) { + n->flags |= NODE_F_EMPTY_QRT; + changed = TRUE; + } + } else if (NODE_HAS_EMPTY_QRT(n)) { + n->flags &= ~NODE_F_EMPTY_QRT; + changed = TRUE; + } + + return changed; } /** * Invoked for ultra nodes to install new Query Routing Table. */ void -node_qrt_install(struct gnutella_node *n, struct routing_table *query_table) +node_qrt_install(gnutella_node_t *n, struct routing_table *query_table) { g_assert(NODE_IS_LEAF(n) || NODE_IS_ULTRA(n)); g_assert(n->recv_query_table == NULL); @@ -9320,8 +11475,8 @@ n->recv_query_table = qrt_ref(query_table); WALLOC(n->qrt_info); - qrt_get_info(query_table, n->qrt_info); + node_qrt_new(n, query_table); node_fire_node_flags_changed(n); } @@ -9330,35 +11485,61 @@ * was fully patched (i.e. we got a new generation). */ void -node_qrt_patched(struct gnutella_node *n, struct routing_table *query_table) +node_qrt_patched(gnutella_node_t *n, struct routing_table *query_table) { g_assert(NODE_IS_LEAF(n) || NODE_IS_ULTRA(n)); g_assert(n->recv_query_table == query_table); g_assert(n->qrt_info != NULL); - qrt_get_info(query_table, n->qrt_info); + if (node_qrt_new(n, query_table)) + node_fire_node_flags_changed(n); } + /** - * Invoked for nodes when our Query Routing Table changed. + * Attempt to send Query Routing Table to node. + * + * This is called for all ultra nodes and G2 nodes (for which we are a leaf). */ -void -node_qrt_changed(struct routing_table *query_table) +static void +node_qrt_send(gnutella_node_t *n, struct routing_table *query_table) { - struct gnutella_node *n; - GSList *sl; + g_assert(NODE_IS_ULTRA(n) || NODE_TALKS_G2(n)); + + if (!NODE_IS_WRITABLE(n)) + return; + + if ( + settings_is_ultra() && + !NODE_TALKS_G2(n) && + !(n->attrs & NODE_A_UP_QRP) + ) + return; /* Node is an ultrapeer not support inter-UP QRP */ /* - * If we're in normal mode, do nothing. - * - * We have work to do when we're both a leaf and an ultra node, since - * both can sent QRT to their peers (leaf nodes send QRT to their - * ultranodes, and ultranodes send QRT to peer ultranodes supporting - * the inter-UP QRP for last-hop queries). + * If we see a node that is still busy sending the old patch, mark + * is as holding an obsolete QRP. It will get the latest patch as + * soon as this one completes. */ - if (GNET_PROPERTY(current_peermode) == NODE_P_NORMAL) + if (n->qrt_update != NULL) { + n->flags |= NODE_F_STALE_QRP; return; + } + + node_send_qrt(n, query_table); +} + +/** + * Invoked for nodes when our Query Routing Table changed. + */ +void +node_qrt_changed(struct routing_table *query_table) +{ + pslist_t *sl; + + g_assert_log(GNET_PROPERTY(current_peermode) != NODE_P_NORMAL, + "%s(): normal node mode no longer supported!", G_STRFUNC); /* * Abort sending of any patch to ultranodes, but only if we're a leaf @@ -9369,8 +11550,8 @@ */ if (settings_is_leaf()) { - for (sl = sl_nodes; sl; sl = g_slist_next(sl)) { - n = sl->data; + PSLIST_FOREACH(sl_nodes, sl) { + gnutella_node_t *n = sl->data; if (n->qrt_update != NULL) { qrt_update_free(n->qrt_update); n->qrt_update = NULL; @@ -9385,57 +11566,48 @@ * (n->sent_query_table holds the last query table we successfully sent) */ - for (sl = sl_up_nodes; sl; sl = g_slist_next(sl)) { - n = sl->data; - - if (!NODE_IS_WRITABLE(n) || !NODE_IS_ULTRA(n)) - continue; - - if (settings_is_ultra() && !(n->attrs & NODE_A_UP_QRP)) - continue; - - /* - * If we see a node that is still busy sending the old patch, mark - * is as holding an obsolete QRP. It will get the latest patch as - * soon as this one completes. - */ + PSLIST_FOREACH(sl_up_nodes, sl) { + node_qrt_send(sl->data, query_table); + } - if (n->qrt_update != NULL) { - n->flags |= NODE_F_STALE_QRP; - continue; - } + /* + * For G2 nodes, send a new QRT plus a /LNI message since our routing + * table has changed, and therefore our amount of files may have been + * updated as well. + */ - node_send_qrt(n, query_table); + PSLIST_FOREACH(sl_g2_nodes, sl) { + g2_node_send_lni(sl->data); + node_qrt_send(sl->data, query_table); } } /** * Final cleanup when application terminates. */ -G_GNUC_COLD void +void G_COLD node_close(void) { - GSList *sl; + pslist_t *sl; g_assert(in_shutdown); /* * Clean up memory used for determining unstable ips / servents */ - for (sl = unstable_servents; sl != NULL; sl = g_slist_next(sl)) { + PSLIST_FOREACH(unstable_servents, sl) { node_bad_client_t *bad_node = sl->data; - g_hash_table_remove(unstable_servent, bad_node->vendor); + htable_remove(unstable_servent, bad_node->vendor); atom_str_free_null(&bad_node->vendor); WFREE(bad_node); } - gm_slist_free_null(&unstable_servents); - - gm_hash_table_destroy_null(&unstable_servent); + pslist_free_null(&unstable_servents); + htable_free_null(&unstable_servent); /* Clean up node info */ while (sl_nodes) { - struct gnutella_node *n = sl_nodes->data; + gnutella_node_t *n = sl_nodes->data; node_check(n); node_remove(n, no_reason); @@ -9445,12 +11617,14 @@ { gnutella_node_t *special_nodes = { - udp_node, udp6_node, dht_node, dht6_node, browse_node, udp_route }; - guint i; + udp_node, udp6_node, dht_node, dht6_node, browse_node, udp_route, + udp_sr_node, udp6_sr_node, udp_g2_node, browse_g2_node + }; + uint i; udp_route->outq = NULL; /* Using that of udp_node or udp6_node */ - for (i = 0; i < G_N_ELEMENTS(special_nodes); i++) { + for (i = 0; i < N_ITEMS(special_nodes); i++) { gnutella_node_t *n; n = special_nodesi; @@ -9472,9 +11646,13 @@ } udp_node = NULL; udp6_node = NULL; + udp_sr_node = NULL; + udp6_sr_node = NULL; + udp_g2_node = NULL; dht_node = NULL; dht6_node = NULL; browse_node = NULL; + browse_g2_node = NULL; udp_route = NULL; } @@ -9486,9 +11664,9 @@ HFREE_NULL(payload_inflate_buffer); - gm_hash_table_destroy_null(&ht_connected_nodes); - gm_hash_table_destroy_null(&nodes_by_id); - gm_hash_table_destroy_null(&nodes_by_guid); + htable_free_null(&ht_connected_nodes); + hikset_free_null(&nodes_by_id); + hikset_free_null(&nodes_by_guid); qhvec_free(query_hashvec); query_hashvec = NULL; @@ -9497,39 +11675,39 @@ aging_destroy(&udp_crawls); pproxy_set_free_null(&proxies); rxbuf_close(); + node_udp_scheduler_destroy_all(); } void node_add_sent(gnutella_node_t *n, int x) { + node_check(n); + n->last_update = tm_time(); n->sent += x; } void -node_add_txdrop(gnutella_node_t *n, int x) -{ - n->last_update = tm_time(); - n->tx_dropped += x; -} - -void node_add_rxdrop(gnutella_node_t *n, int x) { n->last_update = tm_time(); n->rx_dropped += x; } -struct gnutella_node * +/** + * @return the connected Gnutella (not G2) node bearing the given GUID. + */ +gnutella_node_t * node_by_guid(const struct guid *guid) { - struct gnutella_node *n; + gnutella_node_t *n; g_return_val_if_fail(guid, NULL); - n = g_hash_table_lookup(nodes_by_guid, guid); - if (n) { + n = hikset_lookup(nodes_by_guid, guid); + if (n != NULL) { node_check(n); g_assert(!NODE_USES_UDP(n)); + g_assert(!NODE_TALKS_G2(n)); /* G2 nodes not inserted in table */ } return n; } @@ -9556,10 +11734,10 @@ * * @return TRUE if any error occured and the GUID was not set. */ -gboolean -node_set_guid(struct gnutella_node *n, const struct guid *guid, gboolean gnet) +bool +node_set_guid(gnutella_node_t *n, const struct guid *guid, bool gnet) { - struct gnutella_node *owner; + gnutella_node_t *owner; node_check(n); @@ -9584,7 +11762,7 @@ char guid_bufGUID_HEX_SIZE + 1; if (gnet) - gm_snprintf(buf, sizeof buf, "weird #%d ", n->n_weird); + str_bprintf(buf, sizeof buf, "weird #%d ", n->n_weird); else buf0 = '\0'; @@ -9602,7 +11780,7 @@ if (guid_eq(guid, GNET_PROPERTY(servent_guid))) { g_warning("%s uses our GUID", node_infostr(n)); - gnet_stats_count_general(GNR_OWN_GUID_COLLISIONS, 1); + gnet_stats_inc_general(GNR_OWN_GUID_COLLISIONS); n->attrs |= NODE_A_BAD_GUID; goto error; } @@ -9626,7 +11804,7 @@ g_soft_assert(owner != n); /* Or n->guid would have been set */ if ( - host_addr_equal(node_gnet(owner), node_gnet(n)) && + host_addr_equiv(node_gnet(owner), node_gnet(n)) && n->vendor != NULL && owner->vendor != NULL && 0 == strcmp(owner->vendor, n->vendor) ) @@ -9644,7 +11822,7 @@ node_addr2(owner), node_vendor(owner)); } - gnet_stats_count_general(GNR_GUID_COLLISIONS, 1); + gnet_stats_inc_general(GNR_GUID_COLLISIONS); node_flag_duplicate_guid(n); node_flag_duplicate_guid(owner); } @@ -9653,10 +11831,43 @@ goto error; } + /* + * Here we know no other node to which we are connected bears the same + * GUID, but nonetheless that GUID could already have been identified + * as being banned. Just flag the node as potentially having a bad + * GUID but still record the node in our table. + */ + + if (guid_is_banned(guid)) { + if (GNET_PROPERTY(node_debug)) { + g_message("%s uses banned GUID %s", + node_infostr(n), guid_hex_str(guid)); + } + /* + * Don't refresh the "last-seen" time as the GUID could have made it + * to our banned list after an IP address change or some other glitch. + */ + n->attrs |= NODE_A_BAD_GUID; + } + + entropy_harvest_many(VARLEN(n->addr), VARLEN(n->port), PTRLEN(guid), NULL); n->guid = atom_guid_get(guid); - gm_hash_table_insert_const(nodes_by_guid, n->guid, n); + + /* + * We do not record G2 nodes in here. The node_by_guid() call is used + * by the Gnutella routing table when routing PUSH messages, or by the + * HTTP push-proxy code to find a matching Gnutella node. We cannot have + * it return a G2 node as the code expects a Gnutella node and that would + * violate an assertion down the chain when we try to send the message + * if the destination is a G2 node! + * --RAM, 2015-11-24 + */ + + if (!NODE_TALKS_G2(n)) + hikset_insert_key(nodes_by_guid, &n->guid); + return FALSE; - + error: return TRUE; } @@ -9675,10 +11886,10 @@ size_t size = 0; if (n->flags & NODE_F_FAKE_NAME) { - size = w_concat_strings(&wbuf, "!", vendor, (void *) 0); + size = w_concat_strings(&wbuf, "!", vendor, NULL_PTR); } else { static const char full = "Morpheus"; - gboolean fix; + bool fix; /* * Morpheus names its servents as "morph350" or "morph461" and @@ -9686,11 +11897,11 @@ * as all different whereas they are really incarnations of the * same servent. Normalize their name. */ - + fix = is_strcaseprefix(vendor, "morph") && 0 != ascii_strcmp_delimit(vendor, full, " /"); if (fix) - size = w_concat_strings(&wbuf, full, " (", vendor, ")", (void *) 0); + size = w_concat_strings(&wbuf, full, " (", vendor, ")", NULL_PTR); } atom_str_change(&n->vendor, lazy_iso8859_1_to_utf8(wbuf ? wbuf : vendor)); @@ -9710,7 +11921,7 @@ * to that node. */ void -node_set_hops_flow(gnutella_node_t *n, guint8 hops) +node_set_hops_flow(gnutella_node_t *n, uint8 hops) { struct node_rxfc_mon *rxfc; int old_hops_flow = n->hops_flow; @@ -9821,7 +12032,7 @@ /** * Fill in supplied info structure. */ -gboolean +bool node_fill_info(const struct nid *node_id, gnet_node_info_t *info) { gnutella_node_t *node = node_by_id(node_id); @@ -9840,12 +12051,18 @@ info->addr = node->addr; info->port = node->port; - info->is_pseudo = NODE_USES_UDP(node); + info->is_pseudo = booleanize(NODE_USES_UDP(node)); + info->is_g2 = booleanize(NODE_TALKS_G2(node)); if (info->is_pseudo) { - if (NODE_IS_UDP(node)) - info->addr = node == udp_node ? listen_addr() : listen_addr6(); - else + if (NODE_IS_UDP(node)) { + if (NODE_CAN_SR_UDP(node)) { + info->addr = (node == udp_sr_node || node == udp_g2_node) ? + listen_addr() : listen_addr6(); + } else { + info->addr = node == udp_node ? listen_addr() : listen_addr6(); + } + } else info->addr = node == dht_node ? listen_addr() : listen_addr6(); info->port = GNET_PROPERTY(listen_port); info->gnet_addr = info->addr; @@ -9866,7 +12083,7 @@ /** * Fill in supplied flags structure. */ -gboolean +bool node_fill_flags(const struct nid *node_id, gnet_node_flags_t *flags) { gnutella_node_t *node = node_by_id(node_id); @@ -9884,6 +12101,8 @@ flags->peermode = NODE_P_LEAF; else if (node->attrs & NODE_A_NO_ULTRA) flags->peermode = NODE_P_NORMAL; + else if (NODE_TALKS_G2(node)) + flags->peermode = NODE_P_G2HUB; } flags->incoming = booleanize(node->flags & NODE_F_INCOMING); @@ -9893,10 +12112,12 @@ flags->mq_status = NODE_MQUEUE_STATUS(node); flags->rx_compressed = booleanize(NODE_RX_COMPRESSED(node)); flags->hops_flow = node->hops_flow; + flags->empty_qrt = booleanize(NODE_HAS_EMPTY_QRT(node)); flags->is_push_proxied = booleanize(node->flags & NODE_F_PROXIED); flags->is_proxying = is_host_addr(node->proxy_addr); - flags->tls = booleanize(node->flags & NODE_F_TLS); + flags->tls = booleanize(node->attrs2 & NODE_A2_TLS); + flags->tls_upgraded = booleanize(node->attrs2 & NODE_A2_SWITCH_TLS); flags->qrt_state = QRT_S_NONE; flags->uqrt_state = QRT_S_NONE; @@ -9929,6 +12150,13 @@ else if (node->sent_query_table != NULL) flags->qrt_state = QRT_S_SENT; } + } else if (node->peermode == NODE_P_G2HUB) { + /* We're a leaf node on G2 */ + if (node->qrt_update != NULL) + flags->qrt_state = (node->flags & NODE_F_QRP_SENT) ? + QRT_S_PATCHING : QRT_S_SENDING; + else if (node->sent_query_table != NULL) + flags->qrt_state = QRT_S_SENT; } return TRUE; } @@ -9936,7 +12164,7 @@ /** * Fetch node status for the GUI display. */ -gboolean +bool node_get_status(const struct nid *node_id, gnet_node_status_t *status) { const gnutella_node_t *node = node_by_id(node_id); @@ -10013,7 +12241,12 @@ status->qrp_efficiency = (float) node->qrp_matches / (float) MAX(1, node->qrp_queries); - status->has_qrp = settings_is_leaf() && node_ultra_received_qrp(node); + + if (NODE_TALKS_G2(node)) { + status->has_qrp = node_hub_received_qrp(node); + } else { + status->has_qrp = settings_is_leaf() && node_ultra_received_qrp(node); + } if (node->qrt_info != NULL) { qrt_info_t *qi = node->qrt_info; @@ -10038,7 +12271,7 @@ status->shutdown_remain = 0; } - if (node->error_str != NULL) + if (node->error_str0 != '\0') g_strlcpy(status->message, node->error_str, sizeof(status->message)); else if (node->remove_msg != NULL) g_strlcpy(status->message, node->remove_msg, sizeof(status->message)); @@ -10057,11 +12290,11 @@ * NULL elements or duplicate elements. */ void -node_remove_nodes_by_id(const GSList *node_list) +node_remove_nodes_by_id(const pslist_t *node_list) { - const GSList *sl; + const pslist_t *sl; - for (sl = node_list; sl != NULL; sl = g_slist_next(sl)) { + PSLIST_FOREACH(node_list, sl) { const struct nid *node_id = sl->data; node_remove_by_id(node_id); } @@ -10118,6 +12351,29 @@ } /** + * Generate node information string into supplied buffer. + * + * @param n the node for which we want to generate the info string + * @param dst the destination buffer; may be NULL iff ``size'' is zero + * @param size the size of ``dst'', in bytes + * + * @return the amount of formatted characters. + */ +size_t +node_infostr_to_buf(const gnutella_node_t *n, char *dst, size_t size) +{ + if (NODE_USES_UDP(n)) { + return str_bprintf(dst, size, "UDP %snode %s", + NODE_CAN_SR_UDP(n) ? + (NODE_TALKS_G2(n) ? "(G2) " : "(semi-reliable) ") : "", + node_addr(n)); + } else { + return str_bprintf(dst, size, "%s node %s <%s>", + node_type(n), node_gnet_addr(n), node_vendor(n)); + } +} + +/** * Node information string: * * "leaf node 1.2.3.4:5 <vendor>" @@ -10128,15 +12384,69 @@ const char * node_infostr(const gnutella_node_t *n) { - static char buf128; + static char buf160; - if (NODE_IS_UDP(n)) { - gm_snprintf(buf, sizeof buf, "UDP node %s", node_addr(n)); + node_infostr_to_buf(n, buf, sizeof buf); + return buf; +} + +/** + * Is addr:port that of the specified node? + */ +bool +node_addr_port_equal(const gnutella_node_t *n, + const host_addr_t addr, uint16 port) +{ + uint16 nport; + host_addr_t naddr; + + node_check(n); + + nport = 0 == n->gnet_port ? n->port : n->gnet_port; + if (port != nport) + return FALSE; + + naddr = is_host_addr(n->gnet_addr) ? n->gnet_addr : n->addr; + + return host_addr_equiv(addr, naddr); +} + +/** + * Generate node information string into supplied buffer. + * + * @param id the ID of node for which we want to generate the info string + * @param dst the destination buffer; may be NULL iff ``size'' is zero + * @param size the size of ``dst'', in bytes + * + * @return the amount of formatted characters. + */ +size_t +node_id_infostr_to_buf(const struct nid *id, char *dst, size_t size) +{ + gnutella_node_t *n; + + if (node_id_self(id)) + return str_bprintf(dst, size, "ourselves"); + + n = node_by_id(id); + if (n != NULL) { + return node_infostr_to_buf(n, dst, size); } else { - gm_snprintf(buf, sizeof buf, "%s node %s <%s>", - node_type(n), node_gnet_addr(n), node_vendor(n)); + return str_bprintf(dst, size, "unknown node ID %s", nid_to_string(id)); } +} +/* + * Node information string fror a node given by ID. + * + * @return pointer to static buffer. + */ +const char * +node_id_infostr(const struct nid *node_id) +{ + static char buf160; + + node_id_infostr_to_buf(node_id, buf, sizeof buf); return buf; } @@ -10146,25 +12456,43 @@ * @return pointer to static buffer. */ const char * -node_id_infostr(const struct nid *node_id) +node_id_infostr2(const struct nid *node_id) { - gnutella_node_t *n; + static char buf160; - if (node_id_self(node_id)) - return "ourselves"; + node_id_infostr_to_buf(node_id, buf, sizeof buf); + return buf; +} - n = node_by_id(node_id); - if (n != NULL) { - return node_infostr(n); - } else { - static char buf128; - gm_snprintf(buf, sizeof buf, - "unknown node ID %s", nid_to_string(node_id)); - return buf; - } +/** + * Callback invoked from the socket layer when we are finally connected. + */ +static void +node_connected_back(struct gnutella_socket *s, void *owner) +{ + static char msg = "\n\n"; + + g_assert(NULL == owner); + + if (GNET_PROPERTY(node_debug) > 4) + g_debug("connected back to %s", + host_addr_port_to_string(s->addr, s->port)); + + (void) bws_write(BSCHED_BWS_OUT, &s->wio, msg, sizeof msg - 1); + + socket_free_null(&s); } /** + * Socket callbacks for node connect backs. + */ +static struct socket_ops node_connect_back_socket_ops = { + NULL, /* connect_failed */ + node_connected_back, /* connected */ + NULL, /* destroy */ +}; + +/** * Connect back to node on specified port and emit a "\n\n" sequence. * * This is called when a "Connect Back" vendor-specific message (BEAR/7v1) @@ -10172,8 +12500,17 @@ * are firewalled. */ void -node_connect_back(const gnutella_node_t *n, guint16 port) +node_connect_back(const gnutella_node_t *n, uint16 port) { + gnutella_socket_t *s; + + /* + * Refuse connection if there is a network buffer shortage. + */ + + if G_UNLIKELY(GNET_PROPERTY(net_buffer_shortage)) + return; + /* * Attempt asynchronous connection. * @@ -10181,28 +12518,16 @@ * from the socket layer. */ - (void)socket_connect(n->addr, port, SOCK_TYPE_CONNBACK, SOCK_F_TLS); + s = socket_connect(n->addr, port, SOCK_TYPE_CONNBACK, SOCK_F_TLS); /* * There is no specific resource attached to the socket. */ -} - -/** - * Callback invoked from the socket layer when we are finally connected. - */ -void -node_connected_back(struct gnutella_socket *s) -{ - static char msg = "\n\n"; - - if (GNET_PROPERTY(node_debug) > 4) - g_debug("connected back to %s", - host_addr_port_to_string(s->addr, s->port)); - - (void) bws_write(BSCHED_BWS_OUT, &s->wio, msg, sizeof msg - 1); - socket_free_null(&s); + if (s != NULL) { + socket_attach_ops(s, SOCK_TYPE_CONNBACK, + &node_connect_back_socket_ops, NULL); + } } /** @@ -10228,13 +12553,11 @@ * Periodically republish NOPE values (Node Push Entry) in the DHT. */ static void -node_publish_dht_nope(cqueue_t *unused_cq, gpointer obj) +node_publish_dht_nope(cqueue_t *cq, void *obj) { gnutella_node_t *n = obj; - (void) unused_cq; - - n->dht_nope_ev = NULL; /* has been freed before calling this function */ + cq_zero(cq, &n->dht_nope_ev); /* freed before calling this function */ /* * If the node told us it was a member of the DHT, then it will publish @@ -10286,7 +12609,7 @@ * * @return TRUE if we can act as this node's proxy. */ -gboolean +bool node_proxying_add(gnutella_node_t *n, const struct guid *guid) { g_return_val_if_fail(n, FALSE); @@ -10388,7 +12711,7 @@ * Add node to our list of push-proxies. */ void -node_proxy_add(gnutella_node_t *n, const host_addr_t addr, guint16 port) +node_proxy_add(gnutella_node_t *n, const host_addr_t addr, uint16 port) { if (!(n->flags & NODE_F_PROXY)) { g_warning("got spurious push-proxy ack from %s", node_infostr(n)); @@ -10410,17 +12733,17 @@ if ( GNET_PROPERTY(node_debug) && is_host_addr(n->gnet_addr) && - (!host_addr_equal(addr, n->gnet_addr) || port != n->gnet_port) + (!host_addr_equiv(addr, n->gnet_addr) || port != n->gnet_port) ) g_warning("push-proxy address %s from %s does not match " "its advertised node address %s:%u", host_addr_port_to_string(addr, port), node_infostr(n), host_addr_to_string(n->gnet_addr), n->gnet_port); - if (!host_addr_equal(addr, n->addr)) { + if (!host_addr_equiv(addr, n->addr)) { g_warning("push-proxy address %s from %s not on same host", host_addr_port_to_string(addr, port), node_infostr(n)); - if (is_host_addr(n->gnet_addr) && host_addr_equal(addr, n->gnet_addr)) + if (is_host_addr(n->gnet_addr) && host_addr_equiv(addr, n->gnet_addr)) g_warning("however address %s matches the advertised node address", host_addr_port_to_string(addr, port)); } @@ -10435,13 +12758,16 @@ /** * Cancel all our known push-proxies. + * + * This routine is called when a node previously known to be TCP-firewalled + * determines that it can accept incoming connections. */ void node_proxy_cancel_all(void) { - GSList *sl; + pslist_t *sl; - for (sl = sl_nodes; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(sl_nodes, sl) { gnutella_node_t *n = sl->data; if (is_host_addr(n->proxy_addr)) { @@ -10450,6 +12776,10 @@ n->proxy_addr = zero_host_addr; n->proxy_port = 0; } + + if (NODE_TALKS_G2(n)) { + g2_node_send_lni(n); /* Updated /LNI/FW (no longer present!) */ + } } pproxy_set_free_null(&proxies); @@ -10503,13 +12833,13 @@ * @param net IP address allowed networks, for push-proxies */ size_t -node_http_fw_node_info_add(char *buf, size_t size, gboolean with_proxies, +node_http_fw_node_info_add(char *buf, size_t size, bool with_proxies, host_net_t net) { header_fmt_t *fmt; size_t len; struct guid guid; - guint16 port = socket_listen_port(); + uint16 port = socket_listen_port(); size_t rw = 0; fmt = header_fmt_make("X-FW-Node-Info", "; ", 0, size); @@ -10571,7 +12901,7 @@ * via the X-Push-Proxy header. */ size_t -node_http_proxies_add(char *buf, size_t size, void *arg, guint32 unused_flags) +node_http_proxies_add(char *buf, size_t size, void *arg, uint32 unused_flags) { size_t rw = 0; host_net_t *netp = arg; @@ -10658,21 +12988,174 @@ /** * @return list of all nodes. */ -const GSList * +const pslist_t * node_all_nodes(void) { return sl_nodes; } /** + * @return list of all Gnutella nodes. + */ +const pslist_t * +node_all_gnet_nodes(void) +{ + return sl_gnet_nodes; +} + +/** * @return list of all ultra nodes. */ -const GSList * +const pslist_t * node_all_ultranodes(void) { return sl_up_nodes; } +/** + * @return list of all G2 nodes. + */ +const pslist_t * +node_all_g2_nodes(void) +{ + return sl_g2_nodes; +} + +/** + * Is the external IP:port of a node known, so that we can connect to it? + */ +bool +node_address_known(const gnutella_node_t *n) +{ + /* We must know the address and the listening port */ + return host_addr_initialized(n->gnet_addr) && n->gnet_port != 0; +} + +/** + * Fill the supplied vector ``hvec'' whose size is ``hcnt'' items with ultra + * peers, mixing randomly selected ultra peers among our neighbours and + * hosts from the host cache. + * + * This is deemed suitable for replying to UHC pings: by including known live + * hosts, we maximize the chance that a host wanting to connect can reach + * a good alive address, from which it will be able to either gather more + * hosts via X-Try-Ultrapeers, or establish a connection in the best case. + * + * @param net network preference + * @param hvec base of vector + * @param hcnt amount of entries in vector + * + * @return amount of hosts filled + */ +unsigned +node_fill_ultra(host_net_t net, gnet_host_t *hvec, unsigned hcnt) +{ + const gnutella_node_t **ultras; + unsigned reserve, ucnt, i, j, k; + const pslist_t *sl; + hset_t *seen_host; + + ucnt = GNET_PROPERTY(node_ultra_count); + ultras = ucnt != 0 ? walloc(ucnt * sizeof ultras0) : NULL; + i = 0; + seen_host = + hset_create_any(gnet_host_hash, gnet_host_hash2, gnet_host_equal); + + PSLIST_FOREACH(node_all_ultranodes(), sl) { + const gnutella_node_t *n; + + if (i >= ucnt) + break; + + n = sl->data; + + /* Skip transient nodes, or nodes that have not sent us anything yet */ + if (NODE_IS_TRANSIENT(n) || 0 == n->received) + continue; + + /* Skip hosts for which we do not know the listening IP:port */ + if (!node_address_known(n)) + continue; + + /* + * Make sure the host is correct for the selected networks. + */ + + switch (net) { + case HOST_NET_IPV4: + if (NET_TYPE_IPV4 != host_addr_net(n->gnet_addr)) + continue; + break; + case HOST_NET_IPV6: + if (NET_TYPE_IPV6 != host_addr_net(n->gnet_addr)) + continue; + case HOST_NET_BOTH: + break; + case HOST_NET_MAX: + g_assert_not_reached(); + } + + ultrasi++ = n; + } + + /* ``i'' is the amount of ultranodes we put in the array */ + + if (ultras != NULL) + SHUFFLE_ARRAY_N(ultras, i); + + /* + * Start by filling hosts from the cache, so that we can remove duplicates. + * + * We ask for everything and then we'll replace the entries with ultras + * provided they are not already present in the list. + */ + + reserve = MIN(NODE_IPP_NEIGHBOURS, i); + + k = hcache_fill_caught_array(net, HOST_ULTRA, hvec, hcnt); + for (i = 0; i < k; i++) { + hset_insert(seen_host, &hveci); + } + + /* + * ``k'' is the amount of hosts we filled from the cache. + * ``i'' will be the index where we'll start superseding hosts. + * + * If hcache_fill_caught_array() filled the whole vector, we'll start + * to supersede from the end. However, if the vector is only partially + * filled, we'll append our ultranodes until we fill the whole vector. + */ + + i = reserve >= hcnt ? 0 + : reserve + k >= hcnt ? hcnt - reserve + : k; + + /* + * Supersed hosts from the cache with our ultra nodes, if not already + * listed in the vector. + */ + + for (j = reserve; j > 0 && i < hcnt; /* empty */) { + const gnutella_node_t *n = ultras--j; + gnet_host_t h; + + gnet_host_set(&h, n->gnet_addr, n->gnet_port); + + if (!hset_contains(seen_host, &h)) { + if (i < k) /* Superseding an entry */ + hset_remove(seen_host, &hveci); + gnet_host_copy(&hveci, &h); /* No struct copy! */ + hset_insert(seen_host, &hveci++); /* New host we wrote */ + } + } + + hset_free_null(&seen_host); + WFREE_NULL(ultras, ucnt * sizeof ultras0); + + g_assert(MAX(k, i) <= hcnt); + + return MAX(k, i); /* Amount of hosts we put in the array */ +} /** * @return writable node given its ID, or NULL if we can't reach that node. @@ -10681,13 +13164,17 @@ node_by_id(const struct nid *node_id) { gnutella_node_t *n; - + g_return_val_if_fail(!node_id_self(node_id), NULL); - n = g_hash_table_lookup(nodes_by_id, node_id); - if (n) { + + if G_UNLIKELY(NULL == nodes_by_id) + return NULL; /* Shutdown time... */ + + n = hikset_lookup(nodes_by_id, node_id); + if (n != NULL) { node_check(n); } - return n; + return n; } /** @@ -10706,7 +13193,7 @@ * Set leaf-guidance support indication from give node ID. */ void -node_set_leaf_guidance(const struct nid *id, gboolean supported) +node_set_leaf_guidance(const struct nid *id, bool supported) { gnutella_node_t *n; @@ -10805,7 +13292,7 @@ static int node_crawl_fill(pmsg_t *mb, gnutella_node_t **ary, int start, int len, int want, - guint8 features, time_t now, str_t *ua, gboolean gtkg) + uint8 features, time_t now, str_t *ua, bool gtkg) { int i, j; int written = 0; @@ -10842,8 +13329,8 @@ */ if (features & NODE_CR_CONNECTION) { - glong connected = delta_time(now, n->connect_date); - guint32 minutes = connected > 0 ? connected / 60 : 0; + long connected = delta_time(now, n->connect_date); + uint32 minutes = connected > 0 ? connected / 60 : 0; char value2; poke_le16(value, MIN(minutes, 0xffffU)); @@ -10876,24 +13363,24 @@ * `features', a set of flags. */ void -node_crawl(gnutella_node_t *n, int ucnt, int lcnt, guint8 features) +node_crawl(gnutella_node_t *n, int ucnt, int lcnt, uint8 features) { gnutella_node_t **ultras = NULL; /* Array of ultra nodes */ gnutella_node_t **leaves = NULL; /* Array of `leaves' */ size_t ultras_len = 0; /* Size of `ultras' */ size_t leaves_len = 0; /* Size of `leaves' */ - int ux = 0; /* Index in `ultras' */ - int lx = 0; /* Index in `leaves' */ - int ui; /* Iterating index in `ultras' */ - int li; /* Iterating index in `leaves' */ - int un; /* Amount of `ultras' to send */ - int ln; /* Amount of `leaves' to send */ - GSList *sl; - gboolean crawlable_only = (features & NODE_CR_CRAWLABLE) ? TRUE : FALSE; - gboolean wants_ua = (features & NODE_CR_USER_AGENT) ? TRUE : FALSE; + int ux = 0; /* Index in `ultras' */ + int lx = 0; /* Index in `leaves' */ + int ui; /* Iterating index in `ultras' */ + int li; /* Iterating index in `leaves' */ + int un; /* Amount of `ultras' to send */ + int ln; /* Amount of `leaves' to send */ + pslist_t *sl; + bool crawlable_only = (features & NODE_CR_CRAWLABLE) ? TRUE : FALSE; + bool wants_ua = (features & NODE_CR_USER_AGENT) ? TRUE : FALSE; pmsg_t *mb = NULL; pdata_t *db; - guchar *payload; /* Start of constructed payload */ + uchar *payload; /* Start of constructed payload */ str_t *agents = NULL; /* The string holding user-agents */ time_t now; @@ -10929,7 +13416,7 @@ leaves = walloc(leaves_len); } - for (sl = sl_nodes; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(sl_nodes, sl) { gnutella_node_t *cn = sl->data; host_addr_t ha; @@ -10947,13 +13434,13 @@ continue; if (ucnt && NODE_IS_ULTRA(cn)) { - g_assert((guint) ux < GNET_PROPERTY(node_ultra_count)); + g_assert((uint) ux < GNET_PROPERTY(node_ultra_count)); ultrasux++ = cn; continue; } if (lcnt && NODE_IS_LEAF(cn)) { - g_assert((guint) lx < GNET_PROPERTY(node_leaf_count)); + g_assert((uint) lx < GNET_PROPERTY(node_leaf_count)); leaveslx++ = cn; continue; } @@ -10969,9 +13456,9 @@ if (wants_ua) { if (ux) - qsort(ultras, ux, sizeof(gnutella_node_t *), node_ua_cmp); + vsort(ultras, ux, sizeof(gnutella_node_t *), node_ua_cmp); if (lx) - qsort(leaves, lx, sizeof(gnutella_node_t *), node_ua_cmp); + vsort(leaves, lx, sizeof(gnutella_node_t *), node_ua_cmp); } /* @@ -10990,7 +13477,7 @@ db = rxbuf_new(); mb = pmsg_alloc(PMSG_P_DATA, db, 0, 3); /* 3 bytes of header */ - payload = (guchar *) pmsg_start(mb); + payload = (uchar *) pmsg_start(mb); /* * The first 3 bytes of the payload are: @@ -11150,14 +13637,45 @@ { node_udp_disable(); - if ((udp_node || udp6_node) && udp_active()) + /* + * The UDP TX schedulers need to be notified each time the UDP listening + * sockets for IPv4 and/or IPv6 could have been removed / recreated. + */ + + node_udp_scheduler_update_all(); + + if ((udp_node || udp6_node) && udp_active()) { node_udp_enable(); + node_g2_enable(); + } if ((dht_node || dht6_node) && udp_active()) node_dht_enable(); } /** + * This needs to be called when the G2 protocol is enabled or disabled. + */ +void +node_update_g2(bool enabled) +{ + if (GNET_PROPERTY(node_debug)) { + g_debug("%s(): %sabling G2 connections", + G_STRFUNC, enabled ? "en" : "dis"); + } + + if (!enabled) { + pslist_t *sl; + + PSLIST_FOREACH(sl_g2_nodes, sl) { + gnutella_node_t *n = sl->data; + + node_bye_if_writable(n, 202, "G2 protocol disabled"); + } + } +} + +/** * Display a summary of the node flags. * * The stuff in the Flags column means: @@ -11165,7 +13683,7 @@ * - 012345678AB (offset) * - NIrwqxZPFhE * - ^^^^^^^^^^^ - * - ||||||||||+ E indicates a TLS encrypted connection + * - ||||||||||+ (E) or (e) indicate a TLS encrypted connection * - |||||||||+ hops flow triggerd (h), or total query flow control (f) * - ||||||||+ flow control (F), or pending data in queue (d) * - |||||||+ indicates whether we're a push proxy (P) / node is proxy (p) @@ -11190,7 +13708,8 @@ case NODE_P_CRAWLER: status0 = 'C'; break; case NODE_P_UDP: status0 = 'P'; break; case NODE_P_DHT: status0 = 'P'; break; - default: g_assert_not_reached(); break; + case NODE_P_G2HUB: status0 = 'H'; break; + case NODE_P_AUTO: status0 = '?'; break; } status1 = flags->incoming ? 'I' : 'O'; @@ -11231,39 +13750,45 @@ if (flags->hops_flow == 0) status9 = 'f'; else if (flags->hops_flow < GTA_NORMAL_TTL) - status9 = 'h'; + status9 = 'h'; /* Hops-flow */ + else if (flags->empty_qrt) + status9 = 'n'; /* Not sharing */ else status9 = '-'; - status10 = flags->tls ? 'E' : '-'; + /* 'E' is for initiated TLS, 'e' is for upgraded to TLS */ + + status10 = + flags->tls_upgraded ? 'e' : + flags->tls ? 'E' : '-'; statussizeof(status) - 1 = '\0'; return status; } /** - * Disconnects all connected nodes which are considered hostile. This + * Disconnects all connected nodes which are considered badly hostile. This * is mainly for disconnecting nodes after hostiles.txt has been reloaded. */ void node_kill_hostiles(void) { - GSList *sl, *to_remove = NULL; + pslist_t *sl, *to_remove = NULL; - for (sl = sl_nodes; sl != NULL; sl = g_slist_next(sl)) { - struct gnutella_node *n = sl->data; + PSLIST_FOREACH(sl_nodes, sl) { + gnutella_node_t *n = sl->data; - if (0 == (NODE_F_FORCE & n->flags) && hostiles_check(n->addr)) { - to_remove = g_slist_prepend(to_remove, n); + if (0 == (NODE_F_FORCE & n->flags) && hostiles_is_bad(n->addr)) { + to_remove = pslist_prepend(to_remove, n); } } - for (sl = to_remove; sl != NULL; sl = g_slist_next(sl)) { - struct gnutella_node *n = sl->data; - + PSLIST_FOREACH(to_remove, sl) { + gnutella_node_t *n = sl->data; node_remove(n, no_reason); } - g_slist_free(to_remove); + + pslist_free(to_remove); } const char * @@ -11276,6 +13801,7 @@ case NODE_P_CRAWLER: return _("Crawler"); case NODE_P_UDP: return _("UDP"); case NODE_P_DHT: return _("DHT"); + case NODE_P_G2HUB: return _("G2 hub"); case NODE_P_AUTO: case NODE_P_UNKNOWN: break; @@ -11292,8 +13818,47 @@ { if (udp_active()) { node_udp_enable(); + node_g2_enable(); node_dht_enable(); } } +/*** + *** Socket callbacks for nodes. + ***/ + +/** + * Callback invoked when node connection is established. + */ +static void +node_socket_connected(gnutella_socket_t *s, void *owner) +{ + gnutella_node_t *n = owner; + + node_check(n); + g_assert(s == n->socket); + + node_init_outgoing(n); +} + +/** + * Callback invoked when the node's socket is destroyed. + */ +static void +node_socket_destroy(gnutella_socket_t *s, void *owner, const char *reason) +{ + gnutella_node_t *n = owner; + + node_check(n); + g_assert(s == n->socket); + + node_remove(n, "%s", reason); +} + +static struct socket_ops node_socket_ops = { + NULL, /* connect_failed */ + node_socket_connected, /* connected */ + node_socket_destroy, /* destroy */ +}; + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/nodes.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/nodes.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2001-2003, Raphael Manfredi + * Copyright (c) 2001-2003, 2014 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -21,6 +21,16 @@ *---------------------------------------------------------------------- */ +/** + * @ingroup core + * @file + * + * Gnutella node management. + * + * @author Raphael Manfredi + * @date 2001-2003, 2014 + */ + #ifndef _core_nodes_h_ #define _core_nodes_h_ @@ -43,6 +53,8 @@ #include "lib/cq.h" #include "lib/header.h" +#include "lib/hset.h" +#include "lib/htable.h" #include "lib/sequence.h" struct guid; @@ -112,56 +124,57 @@ char error_str256; /**< To sprintf() error strings with vars */ struct gnutella_socket *socket; /**< Socket of the node */ - guint16 country; /**< Country of origin -- encoded ISO3166 */ - guint8 proto_major; /**< Handshaking protocol major number */ - guint8 proto_minor; /**< Handshaking protocol minor number */ - - guint8 qrp_major; /**< Query routing protocol major number */ - guint8 qrp_minor; /**< Query routing protocol minor number */ - guint8 uqrp_major; /**< UP Query routing protocol major number */ - guint8 uqrp_minor; /**< UP Query routing protocol minor number */ + uint16 country; /**< Country of origin -- encoded ISO3166 */ + uint8 proto_major; /**< Handshaking protocol major number */ + uint8 proto_minor; /**< Handshaking protocol minor number */ + + uint8 qrp_major; /**< Query routing protocol major number */ + uint8 qrp_minor; /**< Query routing protocol minor number */ + uint8 uqrp_major; /**< UP Query routing protocol major number */ + uint8 uqrp_minor; /**< UP Query routing protocol minor number */ const char *vendor; /**< Vendor information (always UTF-8) */ vendor_code_t vcode; /**< Vendor code (vcode.u32 == 0 if unknown) */ - gpointer io_opaque; /**< Opaque I/O callback information */ + void *io_opaque; /**< Opaque I/O callback information */ gnutella_header_t header; /**< Header of the current message */ extvec_t extvecMAX_EXTVEC; /**< GGEP extensions in "fat" messages */ int extcount; /**< Amount of extensions held */ - guint16 size; /**< How many bytes we need to read for the current message */ - guint16 header_flags; /**< Header flags (new message architecture) */ - guint32 msg_flags; /**< Message flags we set during analysis */ + uint16 size; /**< How many bytes we need to read for the current message */ + uint16 header_flags; /**< Header flags (new message architecture) */ + uint32 msg_flags; /**< Message flags we set during analysis */ char *data; /**< data of the current message */ - guint32 pos; /**< write position in data */ + uint32 pos; /**< write position in data */ gnet_node_state_t status; /**< See possible values below */ - guint32 flags; /**< See possible values below */ - guint32 attrs; /**< See possible values below */ + uint32 flags; /**< See possible values below */ + uint32 attrs; /**< See possible values below */ + uint32 attrs2; /**< See possible values below */ - guint8 hops_flow; /**< Don't send queries with a >= hop count */ - guint8 max_ttl; /**< Value of their advertised X-Max-TTL */ - guint16 degree; /**< Value of their advertised X-Degree */ + uint8 hops_flow; /**< Don't send queries with a >= hop count */ + uint8 max_ttl; /**< Value of their advertised X-Max-TTL */ + uint16 degree; /**< Value of their advertised X-Degree */ - GHashTable *qseen; /**< Queries seen from this leaf node */ - GHashTable *qrelayed; /**< Queries relayed from this node */ - GHashTable *qrelayed_old; /**< Older version of the `qrelayed' table */ + htable_t *qseen; /**< Queries seen from this leaf node */ + hset_t *qrelayed; /**< Queries relayed from this node */ + hset_t *qrelayed_old; /**< Older version of the `qrelayed' table */ time_t qrelayed_created; /**< When `qrelayed' was created */ - guint32 sent; /**< Number of sent packets */ - guint32 received; /**< Number of received packets */ - guint32 tx_dropped; /**< Number of packets dropped at TX time */ - guint32 rx_dropped; /**< Number of packets dropped at RX time */ - guint32 n_bad; /**< Number of bad packets received */ - guint16 n_dups; /**< Number of dup messages received (bad) */ - guint16 n_hard_ttl; /**< Number of hard_ttl exceeded (bad) */ - guint32 n_weird; /**< Number of weird messages from that node */ - guint32 n_hostile; /**< Number of messages from hostile IP */ - guint32 n_spam; /**< Number of messages rated as spam */ - guint32 n_evil; /**< Number of messages with evil filenames */ - - guint32 allocated; /**< Size of allocated buffer data, 0 for none */ - gboolean have_header; /**< TRUE if we have got a full message header */ + uint32 sent; /**< Number of sent packets */ + uint32 received; /**< Number of received packets */ + uint32 tx_dropped; /**< Number of packets dropped at TX time */ + uint32 rx_dropped; /**< Number of packets dropped at RX time */ + uint32 n_bad; /**< Number of bad packets received */ + uint16 n_dups; /**< Number of dup messages received (bad) */ + uint16 n_hard_ttl; /**< Number of hard_ttl exceeded (bad) */ + uint32 n_weird; /**< Number of weird messages from that node */ + uint32 n_hostile; /**< Number of messages from hostile IP */ + uint32 n_spam; /**< Number of messages rated as spam */ + uint32 n_evil; /**< Number of messages with evil filenames */ + + uint32 allocated; /**< Size of allocated buffer data, 0 for none */ + bool have_header; /**< TRUE if we have got a full message header */ time_t last_update; /**< Last update of the node */ time_t last_tx; /**< Last time we transmitted to the node */ @@ -174,13 +187,13 @@ time_t leaf_flowc_start; /**< Time when leaf flow-controlled queries */ time_delta_t shutdown_delay; /**< How long we can stay in shutdown mode */ - const char *remove_msg; /**< Reason of removing */ + const char *remove_msg; /**< Reason of removing */ host_addr_t addr; /**< ip of the node */ - guint16 port; /**< port of the node */ + uint16 port; /**< port of the node */ host_addr_t proxy_addr; /**< ip of the node for push proxyfication */ - guint16 proxy_port; /**< port of the node for push proxyfication */ + uint16 proxy_port; /**< port of the node for push proxyfication */ mqueue_t *outq; /**< TX Output queue */ squeue_t *searchq; /**< TX Search queue */ @@ -193,8 +206,7 @@ struct qrt_receive *qrt_receive; /**< query routing reception */ qrt_info_t *qrt_info; /**< Info about received query table */ - gpointer alive_pings; /**< Opaque info, for alive ping checks */ - time_t last_alive_ping; /**< Last time we sent an alive ping */ + struct alive *alive_pings; /**< For alive ping checks */ time_delta_t alive_period; /**< Period for sending alive pings (secs) */ wrap_buf_t hello; /**< Spill buffer for GNUTELLA HELLO */ @@ -206,8 +218,8 @@ * Figures are in ms. */ - guint32 tcp_rtt; /**< RTT when exchange takes place over TCP */ - guint32 udp_rtt; /**< RTT when exchange takes place over UDP */ + uint32 tcp_rtt; /**< RTT when exchange takes place over TCP */ + uint32 udp_rtt; /**< RTT when exchange takes place over UDP */ cevent_t *tsync_ev; /**< Time sync event */ /* @@ -216,41 +228,41 @@ */ struct nid *id; /**< Unique internal ID */ - guint ping_throttle; /**< Period for accepting new pings (secs) */ + uint ping_throttle; /**< Period for accepting new pings (secs) */ time_t ping_accept; /**< Time after which we accept new pings */ time_t next_ping; /**< When to send a ping, for "OLD" clients */ struct guid ping_guid; /**< The GUID of the last accepted ping */ - guchar pong_neededMAX_CACHE_HOPS+1; /**< Pongs needed, by hop value */ - guchar pong_missing; /**< Sum(pong_neededi), i = 0..MAX_CACHE_HOPS */ + uchar pong_neededMAX_CACHE_HOPS+1; /**< Pongs needed, by hop value */ + uchar pong_missing; /**< Sum(pong_neededi), i = 0..MAX_CACHE_HOPS */ host_addr_t gnet_addr; /**< When != 0, we know the remote IP/port */ - guint16 gnet_port; /**< (listening port, that is ) */ - guint32 gnet_files_count; /**< Used to answer "Crawling" pings */ - guint32 gnet_kbytes_count; /**< Used to answer "Crawling" pings */ + uint16 gnet_port; /**< (listening port, that is ) */ + uint32 gnet_files_count; /**< Used to answer "Crawling" pings */ + uint32 gnet_kbytes_count; /**< Used to answer "Crawling" pings */ host_addr_t gnet_pong_addr; /**< When != 0, last IP we got in pong */ host_addr_t gnet_qhit_addr; /**< When != 0, last IP we got in query hit */ const struct guid *guid; /**< GUID of node (atom) seen on the network */ - guint32 svn_release_revision; /**< Latest SVN release known by the node */ + uint32 svn_release_revision; /**< Latest SVN release known by the node */ - guint32 n_ping_throttle; /**< Number of pings we throttled */ - guint32 n_ping_accepted; /**< Number of pings we accepted */ - guint32 n_ping_special; /**< Number of special pings we received */ - guint32 n_ping_sent; /**< Number of pings we sent to this node */ - guint32 n_pong_received; /**< Number of pongs we received from this node */ - guint32 n_pong_sent; /**< Number of pongs we sent to this node */ + uint32 n_ping_throttle; /**< Number of pings we throttled */ + uint32 n_ping_accepted; /**< Number of pings we accepted */ + uint32 n_ping_special; /**< Number of special pings we received */ + uint32 n_ping_sent; /**< Number of pings we sent to this node */ + uint32 n_pong_received; /**< Number of pongs we received from this node */ + uint32 n_pong_sent; /**< Number of pongs we sent to this node */ /* * Traffic statistics -- RAM, 13/05/2002. */ - guint64 tx_given; /**< Bytes fed to the TX stack (from top) */ - guint64 tx_deflated; /**< Bytes deflated by the TX stack */ - guint64 tx_written; /**< Bytes written by the TX stack */ + uint64 tx_given; /**< Bytes fed to the TX stack (from top) */ + uint64 tx_deflated; /**< Bytes deflated by the TX stack */ + uint64 tx_written; /**< Bytes written by the TX stack */ - guint64 rx_given; /**< Bytes fed to the RX stack (from bottom) */ - guint64 rx_inflated; /**< Bytes inflated by the RX stack */ - guint64 rx_read; /**< Bytes read from the RX stack */ + uint64 rx_given; /**< Bytes fed to the RX stack (from bottom) */ + uint64 rx_inflated; /**< Bytes inflated by the RX stack */ + uint64 rx_read; /**< Bytes read from the RX stack */ /* * Various Gnutella statistics -- RAM, 10/12/2003. @@ -263,12 +275,12 @@ * that really caused a match to one of our files. */ - guint32 qrp_queries; /**< Queries received under QRP control */ - guint32 qrp_matches; /**< Queries received that incurred a match */ - guint32 rx_queries; /**< Total amount of queries received */ - guint32 tx_queries; /**< Total amount of queries sent */ - guint32 rx_qhits; /**< Total amount of hits received */ - guint32 tx_qhits; /**< Total amount of hits sent */ + uint32 qrp_queries; /**< Queries received under QRP control */ + uint32 qrp_matches; /**< Queries received that incurred a match */ + uint32 rx_queries; /**< Total amount of queries received */ + uint32 tx_queries; /**< Total amount of queries sent */ + uint32 rx_qhits; /**< Total amount of hits received */ + uint32 tx_qhits; /**< Total amount of hits sent */ hsep_ctx_t *hsep; /**< Horizon size estimation (HSEP) -- TSC, 11/02/2004 */ @@ -282,11 +294,11 @@ NODE_F_EXPECT_VMSG = 1 << 30, /**< Expecting vendor message info */ NODE_F_DUP_GUID = 1 << 29, /**< Node bears duplicate GUID */ NODE_F_BYE_WAIT = 1 << 28, /**< Waiting for BYE being sent */ - NODE_F_NOT_GENUINE = 1 << 27, /**< Vendor cannot be genuine */ + NODE_F_EMPTY_QRT = 1 << 27, /**< Has an empty Query Routing Table */ NODE_F_VMSG_SUPPORT = 1 << 26, /**< Indicated which VMSGs are supported */ - NODE_F_CAN_TLS = 1 << 25, /**< Indicated support for TLS */ - NODE_F_TLS = 1 << 24, /**< TLS-tunneled */ - NODE_F_NO_OOB_PROXY = 1 << 23, /**< Do not OOB proxy the leaf */ + NODE_F_UNUSED_3 = 1 << 25, /**< UNUSED */ + NODE_F_UNUSED_2 = 1 << 24, /**< UNUSED */ + NODE_F_UNUSED_1 = 1 << 23, /**< UNUSED */ NODE_F_FORCE = 1 << 22, /**< Connection is forced */ NODE_F_GTKG = 1 << 21, /**< Node is another gtk-gnutella */ NODE_F_TSYNC_TCP = 1 << 20, /**< No replies via UDP, use TCP */ @@ -351,17 +363,36 @@ }; /** + * Second attributes. + */ +enum { + NODE_A2_G2_HUB = 1 << 10, /**< Node is a G2 hub */ + NODE_A2_SWITCH_TLS = 1 << 9, /**< Node will switch to TLS */ + NODE_A2_UPGRADE_TLS = 1 << 8, /**< Node wants to upgrade to TLS */ + NODE_A2_TALKS_G2 = 1 << 7, /**< Node talking with the G2 protocol */ + NODE_A2_CAN_QRP1 = 1 << 6, /**< Node supports QRP 1-bit patches */ + NODE_A2_NOT_GENUINE = 1 << 5, /**< Vendor cannot be genuine */ + NODE_A2_CAN_TLS = 1 << 4, /**< Indicated support for TLS */ + NODE_A2_TLS = 1 << 3, /**< TLS-tunneled */ + NODE_A2_NO_OOB_PROXY= 1 << 2, /**< Do not OOB proxy the leaf */ + NODE_A2_HAS_SR_UDP = 1 << 1, /**< Source advertised semi-reliable UDP */ + NODE_A2_UDP_TRANCVR = 1 << 0 /**< Message queue uses UDP transceiver */ +}; + +/** * Message flags, set during parsing / processing. */ enum { + NODE_M_ADD_GE_SO = 1 << 7, /**< Must add GGEP "SO" */ + NODE_M_STRIP_GE_SO = 1 << 6, /**< Must strip GGEP "SO" */ NODE_M_FINISH_IPV6 = 1 << 5, /**< Add GGEP "6" extension for our IPv6 */ NODE_M_WHATS_NEW = 1 << 4, /**< Facing a "What's New?" query */ - NODE_M_STRIP_GGEP_u = 1 << 3, /**< Must strip GGEP "u" */ + NODE_M_STRIP_GE_u = 1 << 3, /**< Must strip GGEP "u" */ NODE_M_STRIP_GUESS = 1 << 2, /**< Must strip all GUESS extensions */ NODE_M_EXT_CLEANUP = 1 << 1, /**< Must cleanup / rewrite extensions */ NODE_M_COMPACTED = 1 << 0 /**< Compaction occurred */ }; - + /* * UDP crawling "feature" flags. */ @@ -441,17 +472,19 @@ ((n)->attrs & NODE_A_TX_DEFLATE) #define NODE_TX_COMPRESSION_RATIO(n) \ - ((n)->tx_given ? \ - (double) ((n)->tx_given - (n)->tx_deflated) / (n)->tx_given : 0.0) + ((n)->tx_given ? (double) \ + (int64) ((n)->tx_given - (n)->tx_deflated) / (n)->tx_given : 0.0) #define NODE_RX_COMPRESSION_RATIO(n) \ - ((n)->rx_inflated ? \ - (double) ((n)->rx_inflated - (n)->rx_given) / (n)->rx_inflated : 0.0) + ((n)->rx_inflated ? (double) \ + (int64) ((n)->rx_inflated - (n)->rx_given) / (n)->rx_inflated : 0.0) #define NODE_ID(n) ((n)->id) +#define NODE_HAS_EMPTY_QRT(n) ((n)->flags & NODE_F_EMPTY_QRT) #define NODE_USES_DUP_GUID(n) ((n)->flags & NODE_F_DUP_GUID) -#define NODE_IS_GENUINE(n) (!((n)->flags & NODE_F_NOT_GENUINE)) +#define NODE_IS_GENUINE(n) (!((n)->attrs2 & NODE_A2_NOT_GENUINE)) +#define NODE_CAN_QRP1(n) ((n)->attrs2 & NODE_A2_CAN_QRP1) #define NODE_CAN_BYE(n) ((n)->attrs & NODE_A_BYE_PACKET) #define NODE_CAN_SFLAG(n) ((n)->attrs & NODE_A_CAN_SFLAG) @@ -464,6 +497,19 @@ #define NODE_IS_FIREWALLED(n) ((n)->attrs & NODE_A_FIREWALLED) #define NODE_CAN_OOB(n) ((n)->attrs & NODE_A_CAN_OOB) #define NODE_CAN_HOPS_FLOW(n) ((n)->attrs & NODE_A_HOPS_FLOW) +#define NODE_TALKS_G2(n) ((n)->attrs2 & NODE_A2_TALKS_G2) +#define NODE_NO_OOB_PROXY(n) ((n)->attrs2 & NODE_A2_NO_OOB_PROXY) + +/* + * NODE_CAN_SR_UDP() checks whether the UDP node has its message queue set up + * to use the UDP transceiver layer. + * + * NODE_HAS_SR_UDP() checks whether we saw indication that the node could be + * forwarded GUESS results using the UDP transceiver layer... + */ + +#define NODE_CAN_SR_UDP(n) ((n)->attrs2 & NODE_A2_UDP_TRANCVR) +#define NODE_HAS_SR_UDP(n) ((n)->attrs2 & NODE_A2_HAS_SR_UDP) #define NODE_HAS_FAKE_NAME(n) \ (((n)->flags & (NODE_F_FAKE_NAME | NODE_F_GTKG)) == NODE_F_FAKE_NAME) @@ -485,10 +531,18 @@ */ #define node_vendor(n) ((n)->vendor != NULL ? (n)->vendor : "????") -#define node_type(n) \ - (NODE_IS_UDP(n) ? "UDP" : \ - NODE_IS_LEAF(n) ? "leaf" : \ - NODE_IS_ULTRA(n) ? "ultra" : "legacy") + +static inline const char * +node_type(const gnutella_node_t *n) +{ + if (NODE_IS_UDP(n)) { + return NODE_TALKS_G2(n) ? "UDP (G2)" : "UDP"; + } else if (!NODE_TALKS_G2(n)) { + return NODE_IS_LEAF(n) ? "leaf" : NODE_IS_ULTRA(n) ? "ultra" : "legacy"; + } else { + return "G2"; /* FIXME if we have various G2 node types (leaf/hub) */ + } +} #define node_inc_sent(n) node_add_sent(n, 1) #define node_inc_txdrop(n) node_add_txdrop(n, 1) @@ -515,6 +569,9 @@ #define node_leaf_sent_qrp(n) \ (NODE_IS_LEAF(n) && \ (n)->qrt_receive == NULL && (n)->recv_query_table != NULL) +#define node_hub_received_qrp(n) \ + (NODE_TALKS_G2(n) && \ + (n)->qrt_update == NULL && (n)->sent_query_table != NULL) /** * Can we send query with hop count `h' according to node's hops-flow value? @@ -557,45 +614,43 @@ void node_post_init(void); void node_slow_timer(time_t now); void node_timer(time_t now); -guint connected_nodes(void); -guint node_count(void); +uint connected_nodes(void); +uint node_count(void); +uint node_g2_count(void); int node_keep_missing(void); -guint node_missing(void); -guint node_leaves_missing(void); -guint node_outdegree(void); -gboolean node_is_connected(const host_addr_t addr, guint16 port, - gboolean incoming); -gboolean node_host_is_connected(const host_addr_t addr, guint16 port); -void node_add_socket(struct gnutella_socket *s, const host_addr_t addr, - guint16 port, guint32 flags); +uint node_missing(void); +uint node_leaves_missing(void); +uint node_g2_hubs_missing(void); +uint node_outdegree(void); +bool node_is_connected(const host_addr_t addr, uint16 port, bool incoming); +bool node_host_is_connected(const host_addr_t addr, uint16 port); +void node_add_socket(struct gnutella_socket *s); void node_remove(struct gnutella_node *, - const char * reason, ...) G_GNUC_PRINTF(2, 3); -guint node_remove_by_addr(const host_addr_t addr, guint16 port); + const char * reason, ...) G_PRINTF(2, 3); +uint node_remove_by_addr(const host_addr_t addr, uint16 port); void node_bye(gnutella_node_t *, int code, - const char * reason, ...) G_GNUC_PRINTF(3, 4); + const char * reason, ...) G_PRINTF(3, 4); void node_real_remove(gnutella_node_t *); -void node_eof(struct gnutella_node *n, - const char * reason, ...) G_GNUC_PRINTF(2, 3); +void node_eof(struct gnutella_node *n, const char * reason, ...) G_PRINTF(2, 3); void node_shutdown(struct gnutella_node *n, - const char * reason, ...) G_GNUC_PRINTF(2, 3); + const char * reason, ...) G_PRINTF(2, 3); void node_bye_if_writable(struct gnutella_node *n, int code, - const char * reason, ...) G_GNUC_PRINTF(3, 4); -void node_init_outgoing(struct gnutella_node *); + const char * reason, ...) G_PRINTF(3, 4); void node_sent_ttl0(struct gnutella_node *n); void node_disableq(struct gnutella_node *n); void node_enableq(struct gnutella_node *n); void node_flushq(struct gnutella_node *n); void node_unflushq(struct gnutella_node *n); -void node_tx_service(struct gnutella_node *n, gboolean on); +void node_tx_service(struct gnutella_node *n, bool on); void node_tx_enter_flowc(struct gnutella_node *n); void node_tx_leave_flowc(struct gnutella_node *n); void node_tx_enter_warnzone(struct gnutella_node *n); void node_tx_leave_warnzone(struct gnutella_node *n); void node_tx_swift_changed(struct gnutella_node *n); -void node_bye_all(gboolean all); -gboolean node_bye_pending(void); +void node_bye_all(bool all); +bool node_bye_pending(void); void node_close(void); -gboolean node_remove_worst(gboolean non_local); +bool node_remove_worst(bool non_local); void node_qrt_changed(struct routing_table *query_table); void node_qrt_discard(struct gnutella_node *n); @@ -603,82 +658,98 @@ void node_qrt_patched(struct gnutella_node *n, struct routing_table *); void send_node_error(struct gnutella_socket *s, int code, - const char *msg, ...) G_GNUC_PRINTF(3, 4); + const char *msg, ...) G_PRINTF(3, 4); void node_add_sent(gnutella_node_t *n, int x); -void node_add_txdrop(gnutella_node_t *n, int x); +void node_add_txdrop(void *o, int x); void node_add_rxdrop(gnutella_node_t *n, int x); void node_set_vendor(gnutella_node_t *n, const char *vendor); +void node_mark_bad_vendor(struct gnutella_node *n); -void node_set_hops_flow(gnutella_node_t *n, guint8 hops); -void node_set_online_mode(gboolean on); +void node_set_hops_flow(gnutella_node_t *n, uint8 hops); +void node_set_online_mode(bool on); void node_current_peermode_changed(node_peer_t mode); const char *node_addr(const gnutella_node_t *n); const char *node_addr2(const gnutella_node_t *n); const char *node_gnet_addr(const gnutella_node_t *n); +size_t node_infostr_to_buf(const gnutella_node_t *n, char *dst, size_t size); const char *node_infostr(const gnutella_node_t *n); +size_t node_id_infostr_to_buf(const struct nid *id, char *dst, size_t size); const char *node_id_infostr(const struct nid *node_id); +const char *node_id_infostr2(const struct nid *node_id); -void node_connect_back(const gnutella_node_t *n, guint16 port); -void node_connected_back(struct gnutella_socket *s); - -void node_mark_bad_vendor(struct gnutella_node *n); +void node_connect_back(const gnutella_node_t *n, uint16 port); void node_proxying_remove(gnutella_node_t *n); -gboolean node_proxying_add(gnutella_node_t *n, const struct guid *guid); -void node_proxy_add(gnutella_node_t *n, const host_addr_t addr, guint16 port); +bool node_proxying_add(gnutella_node_t *n, const struct guid *guid); +void node_proxy_add(gnutella_node_t *n, const host_addr_t addr, uint16 port); void node_proxy_cancel_all(void); -size_t node_http_fw_node_info_add(char *buf, size_t size, gboolean, host_net_t); -size_t node_http_proxies_add(char *buf, size_t size, void *arg, guint32 flags); +size_t node_http_fw_node_info_add(char *buf, size_t size, bool, host_net_t); +size_t node_http_proxies_add(char *buf, size_t size, void *arg, uint32 flags); sequence_t *node_push_proxies(void); const gnet_host_t *node_oldest_push_proxy(void); -const GSList *node_all_nodes(void); -const GSList *node_all_ultranodes(void); +const struct pslist *node_all_nodes(void); +const struct pslist *node_all_ultranodes(void); +const struct pslist *node_all_gnet_nodes(void); +const struct pslist *node_all_g2_nodes(void); +unsigned node_fill_ultra(host_net_t net, gnet_host_t *hvec, unsigned hcnt); gnutella_node_t *node_by_id(const struct nid *node_id); gnutella_node_t *node_active_by_id(const struct nid *node_id); -void node_set_leaf_guidance(const struct nid *node_id, gboolean supported); +void node_set_leaf_guidance(const struct nid *node_id, bool supported); void node_became_firewalled(void); void node_became_udp_firewalled(void); void node_set_socket_rx_size(int rx_size); +void node_grow_data(struct gnutella_node *n, size_t len); mqueue_t *node_udp_get_outq(enum net_type net); -gboolean node_dht_is_flow_controlled(void); -gboolean node_dht_would_flow_control(size_t additional); -gboolean node_dht_above_low_watermark(void); +mqueue_t *node_udp_sr_get_outq(enum net_type net); +bool node_udp_is_old(const struct gnutella_node *n); +bool node_hostile_udp(struct gnutella_node *n); +bool node_dht_is_flow_controlled(void); +bool node_dht_would_flow_control(size_t additional); +bool node_dht_above_low_watermark(void); void node_udp_disable(void); -void node_udp_process(gnutella_node_t *n, struct gnutella_socket *s); -gnutella_node_t *node_udp_get_addr_port(const host_addr_t addr, guint16 port); -gnutella_node_t *node_dht_get_addr_port(const host_addr_t addr, guint16 port); +void node_udp_process(gnutella_node_t *n, const struct gnutella_socket *s, + const void *data, size_t len); +gnutella_node_t *node_udp_get_addr_port(const host_addr_t addr, uint16 port); +gnutella_node_t *node_udp_sr_get_addr_port(const host_addr_t addr, uint16 port); +gnutella_node_t *node_dht_get_addr_port(const host_addr_t addr, uint16 port); gnutella_node_t * node_udp_route_get_addr_port( - const host_addr_t addr, guint16 port, gboolean can_deflate); + const host_addr_t addr, uint16 port, bool can_deflate, bool sr_udp); void node_can_tsync(gnutella_node_t *n); -void node_crawl(gnutella_node_t *n, int ucnt, int lcnt, guint8 features); +void node_crawl(gnutella_node_t *n, int ucnt, int lcnt, uint8 features); void node_update_udp_socket(void); +void node_update_g2(bool enabled); void node_check_remote_ip_header(const host_addr_t peer, header_t *head); -guint feed_host_cache_from_headers(header_t *headers, - host_type_t sender, gboolean gnet, const host_addr_t peer, +uint feed_host_cache_from_headers(header_t *headers, + host_type_t sender, bool gnet, const host_addr_t peer, const char *vendor); gnutella_node_t *node_browse_prepare( gnet_host_t *host, const char *vendor, gnutella_header_t *header, - char *data, guint32 size); + char *data, uint32 size); void node_browse_cleanup(gnutella_node_t *n); void node_kill_hostiles(void); void node_supports_tls(struct gnutella_node *); void node_supports_whats_new(struct gnutella_node *); +void node_supports_qrp_1bit_patches(struct gnutella_node *n); void node_supports_dht(struct gnutella_node *, dht_mode_t); void node_is_firewalled(gnutella_node_t *n); void node_supported_vmsg(struct gnutella_node *, const char *str, size_t len); void node_supported_feats(struct gnutella_node *, const char *str, size_t len); +bool node_above_low_watermark(const gnutella_node_t *n); +bool node_address_known(const gnutella_node_t *n); +bool node_addr_port_equal(const gnutella_node_t *n, + const host_addr_t addr, uint16 port); const struct nid *node_id_get_self(void); -gboolean node_id_self(const struct nid *node_id); +bool node_id_self(const struct nid *node_id); static inline void node_check(const struct gnutella_node * const n) @@ -701,10 +772,14 @@ return n->id; } -gboolean node_set_guid(struct gnutella_node *n, - const struct guid *guid, gboolean gnet); +bool node_set_guid(struct gnutella_node *n, const struct guid *guid, bool gnet); struct gnutella_node *node_by_guid(const struct guid *guid); +enum g2_msg; + +bool node_g2_active(void); +gnutella_node_t *node_udp_g2_get_addr_port(const host_addr_t addr, uint16 port); + #endif /* _core_nodes_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/ntp.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/ntp.c
Changed
@@ -60,26 +60,26 @@ * An NTP message, as described in RFC2030 (trailing auth-data ignored). */ struct ntp_msg { - guint8 flags; - guint8 stratum; - guint8 poll; - guint8 precision; - guchar root_delay4; - guchar root_dispersion4; - guchar reference_id4; - guchar reference_timestamp8; - guchar originate_timestamp8; - guchar receive_timestamp8; - guchar transmit_timestamp8; + uint8 flags; + uint8 stratum; + uint8 poll; + uint8 precision; + uchar root_delay4; + uchar root_dispersion4; + uchar reference_id4; + uchar reference_timestamp8; + uchar originate_timestamp8; + uchar receive_timestamp8; + uchar transmit_timestamp8; }; -static gboolean ntp_localhost_replied; +static bool ntp_localhost_replied; /** * Fill 8-byte buffer with NTP's representation of a tm_t time. */ static void -ntp_tm_serialize(guchar dest8, tm_t *t) +ntp_tm_serialize(uchar dest8, tm_t *t) { poke_be32(&dest0, t->tv_sec + OFFSET_1900); poke_be32(&dest4, t->tv_usec * 1.0e-6 * NTP_FP_SCALE); @@ -89,10 +89,10 @@ * Construct a tm_t time from an NTP timestamp. */ static void -ntp_tm_deserialize(const guchar src8, tm_t *dest) +ntp_tm_deserialize(const uchar src8, tm_t *dest) { dest->tv_sec = peek_be32(&src0) - OFFSET_1900; - dest->tv_usec = (guint32) (peek_be32(&src4) * 1.0e6 / NTP_FP_SCALE); + dest->tv_usec = (uint32) (peek_be32(&src4) * 1.0e6 / NTP_FP_SCALE); } /** @@ -126,8 +126,8 @@ ntp_got_reply(host_addr_t addr, const void *payload, size_t len) { const struct ntp_msg *m; - guint8 version; - guint8 mode; + uint8 version; + uint8 mode; tm_t received; tm_t sent; tm_t replied; @@ -184,7 +184,7 @@ g_debug("NTP local clock offset is %g secs", (double) clock_offset); - gnet_prop_set_guint32_val(PROP_CLOCK_SKEW, (guint32) clock_offset); + gnet_prop_set_guint32_val(PROP_CLOCK_SKEW, (uint32) clock_offset); g_info("detected NTP-%u, stratum %u, offset %g secs", version, m->stratum, (double) clock_offset); @@ -194,12 +194,15 @@ * Reception / timeout callback for NTP probes. */ static void -ntp_received(enum urpc_ret type, host_addr_t addr, guint16 unused_port, +ntp_received(enum urpc_ret type, host_addr_t addr, uint16 unused_port, const void *payload, size_t len, void *unused_arg) { (void) unused_port; (void) unused_arg; + if (URPC_ABORT == type) + return; + if (URPC_TIMEOUT == type) { ntp_no_reply(); return; @@ -209,7 +212,7 @@ ntp_got_reply(addr, payload, len); } -static gboolean +static bool ntp_send_probe(const host_addr_t addr) { static const struct ntp_msg zero_m; @@ -225,7 +228,7 @@ ntp_received, NULL); } -static G_GNUC_COLD gboolean +static bool G_COLD ntp_send_probes(void) { static const struct { @@ -239,20 +242,20 @@ { "::1" }, { "127.0.0.1" }, }; - gboolean sent = FALSE; - guint i; + bool sent = FALSE; + uint i; /* TODO: The name_to_host_addr() could take a while which would * delay startup. Thus, use ADNS for this. */ - for (i = 0; i < G_N_ELEMENTS(hosts); i++) { + for (i = 0; i < N_ITEMS(hosts); i++) { host_addr_t addr; addr = name_to_single_host_addr(hostsi.addr, settings_dns_net()); if (!is_host_addr(addr)) continue; - + if (ntp_send_probe(addr)) { /* Send probes to all addresses because a successful sendto() * does not guarantee anything. */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/oob.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/oob.c
Changed
@@ -34,26 +34,31 @@ #include "common.h" #include "oob.h" -#include "hosts.h" -#include "nodes.h" -#include "share.h" + +#include "ban.h" +#include "gmsg.h" +#include "gnet_stats.h" #include "guid.h" +#include "hosts.h" #include "mq.h" #include "mq_udp.h" -#include "vmsg.h" +#include "nodes.h" #include "qhit.h" -#include "gmsg.h" -#include "gnet_stats.h" +#include "share.h" +#include "vmsg.h" #include "if/gnet_property_priv.h" #include "lib/atoms.h" #include "lib/cq.h" #include "lib/fifo.h" -#include "lib/glib-missing.h" +#include "lib/hikset.h" #include "lib/pmsg.h" +#include "lib/pslist.h" #include "lib/random.h" +#include "lib/stringify.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ #define OOB_EXPIRE_MS (2*60*1000) /**< 2 minutes at most */ @@ -66,6 +71,7 @@ #define OOB_MAX_QHIT_SIZE 645 /**< Flush hits larger than this */ #define OOB_MAX_DQHIT_SIZE 1075 /**< Flush limit for deflated hits */ +#define OOB_MAX_SRQHIT_SIZE 4096 /**< Flush limit for UDP SR hits */ typedef enum { OOB_RESULTS_MAGIC = 0x7ae5e685 @@ -80,19 +86,20 @@ cevent_t *ev_expire; /**< Global expiration event */ cevent_t *ev_timeout; /**< Reply waiting timeout */ const struct guid *muid;/**< (atom) MUID of the query that generated hits */ - GSList *files; /**< List of shared_file_t */ + pslist_t *files; /**< List of shared_file_t */ gnet_host_t dest; /**< The host to which we must deliver */ int count; /**< Amount of hits to deliver */ int notify_requeued; /**< Amount of LIME/12v2 requeued after dropping */ - gboolean secure; /**< TRUE -> secure OOB, FALSE -> normal OOB */ unsigned flags; /**< A combination of QHIT_F_* flags */ + unsigned secure:1; /**< TRUE -> secure OOB, FALSE -> normal OOB */ + unsigned reliable:1; /**< TRUE -> deliver through semi-reliable UDP */ }; /** * Indexes all OOB queries by MUID. * This hash table records MUID => "struct oob_results" */ -static GHashTable *results_by_muid; +static hikset_t *results_by_muid; /** * Each servent, as identified by its IP:port, is given a FIFO for queuing @@ -101,7 +108,7 @@ * * This hash table records gnet_host_t => "struct gservent" */ -static GHashTable *servent_by_host = NULL; +static hikset_t *servent_by_host = NULL; /** * A servent entry, used as values in the `servent_by_host' table. @@ -110,7 +117,8 @@ cevent_t *ev_service; /**< Callout event for servicing FIFO */ gnet_host_t *host; /**< The servent host (also used as key for table) */ fifo_t *fifo; /**< The servent's FIFO, holding pmsg_t items */ - gboolean can_deflate; /**< Whether servent supports UDP compression */ + uint can_deflate:1; /**< Whether servent supports UDP compression */ + uint reliable:1; /**< Whether servent supports semi-reliable UDP */ }; /* @@ -128,12 +136,14 @@ * Every OOB_DELIVER_MS, enqueue a hit to the UDP MQ for sending. */ -static void results_destroy(cqueue_t *cq, gpointer obj); +static void results_destroy(cqueue_t *cq, void *obj); static void servent_free(struct gservent *s); -static void oob_send_reply_ind(struct oob_results *r); +static bool oob_send_reply_ind(struct oob_results *r); +static void servent_service(struct gservent *s, cqueue_t *cq); static int num_oob_records; /**< Leak and duplicate free detector */ -static gboolean oob_shutdown_running; +static bool oob_shutdowning; +static bool oob_shutdown_running; static void oob_results_check(const struct oob_results *r) @@ -149,13 +159,25 @@ * results delivery via the sent LIME/12v2 and the expected LIME/11v2 reply. */ static struct oob_results * -results_make(const struct guid *muid, GSList *files, int count, - gnet_host_t *to, gboolean secure, unsigned flags) +results_make(const struct guid *muid, pslist_t *files, int count, + gnet_host_t *to, bool secure, bool reliable, unsigned flags) { static const struct oob_results zero_results; struct oob_results *r; - g_return_val_if_fail(!g_hash_table_lookup(results_by_muid, muid), NULL); + /* + * Check for duplicate queries bearing the same MUID. + * + * We used to soft-assert here, but since this condition actually triggers + * we explicitly check for it. + */ + + if (hikset_contains(results_by_muid, muid)) + return NULL; + + /* + * First time we're seeing this query (normal case). + */ WALLOC(r); *r = zero_results; @@ -164,18 +186,19 @@ r->files = files; r->count = count; gnet_host_copy(&r->dest, to); - r->secure = secure; + r->secure = booleanize(secure); + r->reliable = booleanize(reliable); r->flags = flags; r->ev_expire = cq_main_insert(OOB_EXPIRE_MS, results_destroy, r); r->refcount++; - gm_hash_table_insert_const(results_by_muid, r->muid, r); + hikset_insert_key(results_by_muid, &r->muid); g_assert(num_oob_records >= 0); num_oob_records++; if (GNET_PROPERTY(query_debug) > 1) - g_debug("results_make: num_oob_records=%d", num_oob_records); + g_debug("%s(): num_oob_records=%d", G_STRFUNC, num_oob_records); return r; } @@ -186,10 +209,8 @@ static void results_free_remove(struct oob_results *r) { - GSList *sl; - oob_results_check(r); - + if (r->ev_expire) { cq_cancel(&r->ev_expire); g_assert(r->refcount > 0); @@ -204,21 +225,16 @@ if (0 == r->refcount) { /* We must not modify the hash table whilst iterating over it */ if (!oob_shutdown_running) { - g_assert(r == g_hash_table_lookup(results_by_muid, r->muid)); - g_hash_table_remove(results_by_muid, r->muid); + g_assert(r == hikset_lookup(results_by_muid, r->muid)); + hikset_remove(results_by_muid, r->muid); } atom_guid_free_null(&r->muid); - - for (sl = r->files; sl; sl = g_slist_next(sl)) { - shared_file_t *sf = sl->data; - shared_file_unref(&sf); - } - gm_slist_free_null(&r->files); + shared_file_slist_free_null(&r->files); g_assert(num_oob_records > 0); num_oob_records--; if (GNET_PROPERTY(query_debug) > 2) - g_debug("results_free: num_oob_records=%d", num_oob_records); + g_debug("%s(): num_oob_records=%d", G_STRFUNC, num_oob_records); r->magic = 0; WFREE(r); @@ -226,46 +242,66 @@ } /** - * Callout queue callback to free the results. + * Callout queue callback to free the results when the time allocated for the + * querying party to claim all the results has expired. */ static void -results_destroy(cqueue_t *unused_cq, gpointer obj) +results_destroy(cqueue_t *cq, void *obj) { struct oob_results *r = obj; - (void) unused_cq; oob_results_check(r); if (GNET_PROPERTY(query_debug)) - g_debug("OOB query %s from %s expired with unclaimed %d hit%s", + g_debug("OOB query #%s from %s expired with unclaimed %d hit%s", guid_hex_str(r->muid), gnet_host_to_string(&r->dest), - r->count, r->count == 1 ? "" : "s"); + r->count, plural(r->count)); - gnet_stats_count_general(GNR_UNCLAIMED_OOB_HITS, 1); + gnet_stats_inc_general(GNR_UNCLAIMED_OOB_HITS); - r->ev_expire = NULL; /* The timer which just triggered */ + cq_zero(cq, &r->ev_expire); /* The timer which just triggered */ r->refcount--; results_free_remove(r); } /** - * Callout queue callback to free the results. + * Callout queue callback to free the results when our initial notification + * was not acknowledged with claims. */ static void -results_timeout(cqueue_t *unused_cq, gpointer obj) +results_timeout(cqueue_t *cq, void *obj) { struct oob_results *r = obj; + host_addr_t addr; - (void) unused_cq; oob_results_check(r); - if (GNET_PROPERTY(query_debug)) - g_debug("OOB query %s, no ACK from %s to claim %d hit%s", + cq_zero(cq, &r->ev_timeout); + addr = gnet_host_get_addr(&r->dest); + + if (GNET_PROPERTY(query_debug)) { + g_debug("OOB query #%s, no ACK from %s to claim %d hit%s", guid_hex_str(r->muid), gnet_host_to_string(&r->dest), - r->count, r->count == 1 ? "" : "s"); + r->count, plural(r->count)); + } + + gnet_stats_inc_general(GNR_UNCLAIMED_OOB_HITS); - gnet_stats_count_general(GNR_UNCLAIMED_OOB_HITS, 1); + /* + * Record an "event" that the OOB results went unclaimed. + * + * After too many unclaimed results, the IP address will be banned + * for OOB query processing. + */ + + if (BAN_OK != ban_allow(BAN_CAT_OOB_CLAIM, addr)) { + if (GNET_PROPERTY(query_debug)) { + int delay = ban_delay(BAN_CAT_OOB_CLAIM, addr); + g_debug("OOB host %s will be banned for the next %d second%s", + host_addr_to_string(addr), delay, plural(delay)); + } + } r->ev_timeout = NULL; /* The timer which just triggered */ r->refcount--; @@ -279,7 +315,7 @@ static void servent_free_remove(struct gservent *s) { - g_hash_table_remove(servent_by_host, s->host); + hikset_remove(servent_by_host, s->host); servent_free(s); } @@ -296,28 +332,39 @@ } /** + * Callout queue event to service the servent's FIFO. + */ +static void +servent_call_service(cqueue_t *cq, void *obj) +{ + struct gservent *s = obj; + + cq_zero(cq, &s->ev_service); /* The callback that just triggered */ + servent_service(s, cq); +} + +/** * Service servent's FIFO: send next packet, and re-arm servicing callback * if there are more data to send. */ static void -servent_service(cqueue_t *cq, gpointer obj) +servent_service(struct gservent *s, cqueue_t *cq) { - struct gservent *s = obj; pmsg_t *mb; mqueue_t *q; - - s->ev_service = NULL; /* The callback that just triggered */ + enum net_type nt; mb = fifo_remove(s->fifo); if (mb == NULL) goto remove; - q = node_udp_get_outq(host_addr_net(gnet_host_get_addr(s->host))); + nt = host_addr_net(gnet_host_get_addr(s->host)); + q = s->reliable ? node_udp_sr_get_outq(nt) : node_udp_get_outq(nt); if (q == NULL) goto udp_disabled; if (GNET_PROPERTY(udp_debug) > 19) - g_debug("UDP queuing OOB %s to %s for %s", + g_debug("UDP queuing OOB %s to %s for #%s", gmsg_infostr_full(pmsg_start(mb), pmsg_written_size(mb)), gnet_host_to_string(s->host), guid_hex_str(cast_to_guid_ptr_const(pmsg_start(mb)))); @@ -329,7 +376,7 @@ if (s->can_deflate) { if (gnutella_header_get_ttl(pmsg_start(mb)) & GTA_UDP_DEFLATED) - gnet_stats_count_general(GNR_UDP_TX_COMPRESSED, 1); + gnet_stats_inc_general(GNR_UDP_TX_COMPRESSED); } mq_udp_putq(q, mb, s->host); @@ -337,7 +384,7 @@ if (0 == fifo_count(s->fifo)) goto remove; - s->ev_service = cq_insert(cq, deliver_delay(), servent_service, s); + s->ev_service = cq_insert(cq, deliver_delay(), servent_call_service, s); return; @@ -355,7 +402,7 @@ * @param host the servent's IP:port. Caller may free it upon return. */ static struct gservent * -servent_make(gnet_host_t *host, gboolean can_deflate) +servent_make(gnet_host_t *host, bool can_deflate, bool reliable) { struct gservent *s; @@ -363,7 +410,8 @@ s->host = gnet_host_dup(host); s->fifo = fifo_make(); s->ev_service = NULL; - s->can_deflate = can_deflate; + s->can_deflate = booleanize(can_deflate); + s->reliable = booleanize(reliable); return s; } @@ -373,7 +421,7 @@ * -- fifo_free_all() callback. */ static void -free_pmsg(gpointer item, gpointer unused_udata) +free_pmsg(void *item, void *unused_udata) { pmsg_t *mb = item; @@ -398,14 +446,25 @@ * Hit is enqueued in the FIFO, for slow delivery. */ static void -oob_record_hit(gpointer data, size_t len, gpointer udata) +oob_record_hit(void *data, size_t len, void *udata) { struct gservent *s = udata; + pmsg_t *mb; g_assert(len <= INT_MAX); - fifo_put(s->fifo, s->can_deflate ? - gmsg_to_deflated_pmsg(data, len) : - gmsg_to_pmsg(data, len)); + + /* + * We don't deflate if sending the hits through the semi-reliable UDP + * layer since it will transparently compress for us. + */ + + mb = (s->can_deflate && !s->reliable) ? + gmsg_to_deflated_pmsg(data, len) : gmsg_to_pmsg(data, len); + + if (s->reliable) + pmsg_mark_reliable(mb); + + fifo_put(s->fifo, mb); } /** @@ -418,28 +477,32 @@ * @param token the token for secure OOB */ void -oob_deliver_hits(struct gnutella_node *n, const struct guid *muid, - guint8 wanted, const struct array *token) +oob_deliver_hits(gnutella_node_t *n, const struct guid *muid, + uint8 wanted, const struct array *token) { struct oob_results *r; struct gservent *s; int deliver_count; - gboolean servent_created = FALSE; + bool servent_created = FALSE; g_assert(NODE_IS_UDP(n)); g_assert(token); - r = g_hash_table_lookup(results_by_muid, muid); + if G_UNLIKELY(oob_shutdowning) + return; + + r = hikset_lookup(results_by_muid, muid); if (r == NULL) { - gnet_stats_count_general(GNR_SPURIOUS_OOB_HIT_CLAIM, 1); + gnet_stats_inc_general(GNR_SPURIOUS_OOB_HIT_CLAIM); if (GNET_PROPERTY(query_debug)) - g_warning("OOB got spurious LIME/11 from %s for %s, " + g_warning("OOB got spurious LIME/11 from %s for #%s, " "asking for %d hit%s", node_addr(n), guid_hex_str(muid), - wanted, wanted == 1 ? "" : "s"); + wanted, plural(wanted)); return; } + oob_results_check(r); /* @@ -466,14 +529,14 @@ * --RAM, 2004-09-10 */ - if (!host_addr_equal(n->addr, gnet_host_get_addr(&r->dest))) { + if (!host_addr_equiv(n->addr, gnet_host_get_addr(&r->dest))) { /** * The sender's IP address can of course change any time as * dynamic IP addresses are very common. The sender might also * have multiple network interfaces. */ - - g_warning("OOB query %s might have been proxied: it had IP %s, " + + g_warning("OOB query #%s might have been proxied: it had IP %s, " "but the LIME/11v2 ACK comes from %s", guid_hex_str(muid), gnet_host_to_string(&r->dest), node_addr(n)); @@ -493,13 +556,19 @@ * Likewise, if it did not request it the first time, no matter what we * get next, we will never deflate hits for this OOB delivery. * --RAM, 2006-08-13 + * + * Likewise, we assume that semi-reliable UDP support will not vary + * over time for a given servent address, from query to query, during + * the lifetime of the server record here (kept around until we no longer + * have any pending hit to deliver, from any query). + * --RAM, 2012-10-08 */ - s = g_hash_table_lookup(servent_by_host, &r->dest); + s = hikset_lookup(servent_by_host, &r->dest); if (s == NULL) { - gboolean can_deflate = NODE_CAN_INFLATE(n); /* Can we deflate? */ - s = servent_make(&r->dest, can_deflate); - g_hash_table_insert(servent_by_host, s->host, s); + bool can_deflate = NODE_CAN_INFLATE(n); /* Can we deflate? */ + s = servent_make(&r->dest, can_deflate, r->reliable); + hikset_insert_key(servent_by_host, &s->host); servent_created = TRUE; } @@ -511,19 +580,22 @@ deliver_count = (wanted == 255) ? r->count : MIN(wanted, r->count); - if (GNET_PROPERTY(query_debug) || GNET_PROPERTY(udp_debug)) - g_debug("OOB query %s: host %s wants %d hit%s, delivering %d", - guid_hex_str(r->muid), node_addr(n), wanted, wanted == 1 ? "" : "s", + if (GNET_PROPERTY(query_debug) || GNET_PROPERTY(udp_debug)) { + g_debug("OOB query #%s: host %s wants %d hit%s, delivering %d", + guid_hex_str(r->muid), node_addr(n), wanted, plural(wanted), deliver_count); + } - if (deliver_count) + if (deliver_count) { qhit_build_results( r->files, deliver_count, + r->reliable ? OOB_MAX_SRQHIT_SIZE : s->can_deflate ? OOB_MAX_DQHIT_SIZE : OOB_MAX_QHIT_SIZE, oob_record_hit, s, r->muid, r->flags, token); + } if (wanted < r->count) - gnet_stats_count_general(GNR_PARTIALLY_CLAIMED_OOB_HITS, 1); + gnet_stats_inc_general(GNR_PARTIALLY_CLAIMED_OOB_HITS); /* * We're now done with the "oob_results" structure, since all the @@ -540,14 +612,14 @@ */ if (servent_created) - servent_service(callout_queue, s); + servent_service(s, cq_main()); } /** * Callback invoked when the LIME/12v2 message we queued is freed. */ static void -oob_pmsg_free(pmsg_t *mb, gpointer arg) +oob_pmsg_free(pmsg_t *mb, void *arg) { struct oob_results *r = arg; @@ -571,9 +643,9 @@ } else { if (GNET_PROPERTY(query_debug) || GNET_PROPERTY(udp_debug)) - g_debug("OOB query %s, notified %s about %d hit%s", + g_debug("OOB query #%s, notified %s about %d hit%s", guid_hex_str(r->muid), gnet_host_to_string(&r->dest), - r->count, r->count == 1 ? "" : "s"); + r->count, plural(r->count)); /* * If we don't get any ACK back, we'll discard the results. @@ -584,47 +656,63 @@ } } else { /* - * If we were not able to send the message, + * If we were not able to send the message: when we use plain UDP, + * we retry, but with semi-reliable UDP we trust the network layer to + * do the appropriate amount of retrying and a failure is definitive. */ - if (GNET_PROPERTY(query_debug)) - g_debug("OOB query %s, previous LIME12/v2 #%d was dropped", - guid_hex_str(r->muid), r->notify_requeued); + if (GNET_PROPERTY(query_debug)) { + g_debug("OOB query #%s, previous LIME12/v2 #%d was %s", + guid_hex_str(r->muid), r->notify_requeued, + r->reliable ? "unsent" : "dropped"); + } - if (++r->notify_requeued < OOB_MAX_RETRY) - oob_send_reply_ind(r); - else + if ( + r->reliable || + ++r->notify_requeued >= OOB_MAX_RETRY || + !oob_send_reply_ind(r) + ) results_free_remove(r); } } /** * Send them a LIME/12v2, monitoring progress in queue via a callback. + * + * @return TRUE if OK */ -static void +static bool oob_send_reply_ind(struct oob_results *r) { mqueue_t *q; pmsg_t *mb; pmsg_t *emb; + enum net_type nt; oob_results_check(r); - q = node_udp_get_outq(host_addr_net(gnet_host_get_addr(&r->dest))); - if (q == NULL) - return; + nt = host_addr_net(gnet_host_get_addr(&r->dest)); + q = r->reliable ? node_udp_sr_get_outq(nt) : node_udp_get_outq(nt); + if (NULL == q) + return FALSE; mb = vmsg_build_oob_reply_ind(r->muid, MIN(r->count, 255), r->secure); emb = pmsg_clone_extend(mb, oob_pmsg_free, r); + if (r->reliable) + pmsg_mark_reliable(emb); r->refcount++; pmsg_free(mb); - if (GNET_PROPERTY(query_debug) || GNET_PROPERTY(udp_debug)) - g_debug("OOB query %s, notifying %s about %d hit%s, try #%d", - guid_hex_str(r->muid), gnet_host_to_string(&r->dest), - r->count, r->count == 1 ? "" : "s", r->notify_requeued); + if (GNET_PROPERTY(query_debug) || GNET_PROPERTY(udp_debug)) { + g_debug("OOB query #%s, %snotifying %s about %d hit%s, try #%d", + guid_hex_str(r->muid), r->reliable ? "reliably " : "", + gnet_host_to_string(&r->dest), + r->count, plural(r->count), r->notify_requeued); + } mq_udp_putq(q, emb, &r->dest); + + return TRUE; } /** @@ -637,48 +725,59 @@ * @param addr address where we must send the OOB result indication * @param port port where we must send the OOB result indication * @param secure whether secure OOB was requested + * @param reliable whether reliable UDP should be used * @param flags a combination of QHIT_F_* flags */ void -oob_got_results(struct gnutella_node *n, GSList *files, - int count, host_addr_t addr, guint16 port, - gboolean secure, unsigned flags) +oob_got_results(gnutella_node_t *n, pslist_t *files, + int count, host_addr_t addr, uint16 port, + bool secure, bool reliable, unsigned flags) { struct oob_results *r; gnet_host_t to; + const guid_t *muid; g_assert(count > 0); g_assert(files != NULL); gnet_host_set(&to, addr, port); - r = results_make(gnutella_header_get_muid(&n->header), files, count, &to, - secure, flags); - if (r) { - oob_send_reply_ind(r); + muid = gnutella_header_get_muid(&n->header); + r = results_make(muid, files, count, &to, secure, reliable, flags); + if (r != NULL) { + if (!oob_send_reply_ind(r)) + results_free_remove(r); + } else { + g_warning("%s(): ignoring duplicate %s%sOOB query %s from %s via %s", + G_STRFUNC, secure ? "secure " : "", reliable ? "reliable " : "", + guid_to_string(muid), + gnet_host_to_string(&to), node_infostr(n)); + + shared_file_slist_free_null(&files); } } /** * Initialize out-of-band query hit delivery. */ -void +void G_COLD oob_init(void) { - results_by_muid = g_hash_table_new(guid_hash, guid_eq); - servent_by_host = g_hash_table_new(gnet_host_hash, gnet_host_eq); + results_by_muid = hikset_create( + offsetof(struct oob_results, muid), HASH_KEY_FIXED, GUID_RAW_SIZE); + servent_by_host = hikset_create_any( + offsetof(struct gservent, host), gnet_host_hash, gnet_host_equal); } /** * Cleanup oob_results -- hash table iterator callback */ -static void -free_oob_kv(gpointer key, gpointer value, gpointer unused_udata) +static void G_COLD +free_oob_kv(void *value, void *unused_udata) { struct oob_results *r = value; (void) unused_udata; oob_results_check(r); - g_assert(key == r->muid); /* Key is same as results's MUID */ r->refcount = 0; /* Enforce release */ if (r->ev_timeout) { @@ -694,13 +793,11 @@ * Cleanup servent -- hash table iterator callback */ static void -free_servent_kv(gpointer key, gpointer value, gpointer unused_udata) +free_servent_kv(void *value, void *unused_udata) { - gnet_host_t *host = key; struct gservent *s = value; (void) unused_udata; - g_assert(host == s->host); /* Key is same as servent's host */ servent_free(s); } @@ -708,28 +805,37 @@ /** * Cleanup at shutdown time. */ -void +void G_COLD oob_shutdown(void) { - oob_shutdown_running = TRUE; - - g_hash_table_foreach(results_by_muid, free_oob_kv, NULL); - gm_hash_table_destroy_null(&results_by_muid); - - g_hash_table_foreach(servent_by_host, free_servent_kv, NULL); - gm_hash_table_destroy_null(&servent_by_host); - - g_assert(num_oob_records >= 0); - if (num_oob_records > 0) - g_warning("%d OOB reply records possibly leaked", num_oob_records); + oob_shutdowning = TRUE; + + if (GNET_PROPERTY(search_debug)) { + g_info("OOB %s: still has %zu entr%s by MUID, %zu host%s recorded", + G_STRFUNC, hikset_count(results_by_muid), + plural_y(hikset_count(results_by_muid)), + hikset_count(servent_by_host), + plural(hikset_count(servent_by_host))); + } } /** * Final cleanup. */ -void +void G_COLD oob_close(void) { + oob_shutdown_running = TRUE; + + hikset_foreach(results_by_muid, free_oob_kv, NULL); + hikset_free_null(&results_by_muid); + + hikset_foreach(servent_by_host, free_servent_kv, NULL); + hikset_free_null(&servent_by_host); + + g_assert(num_oob_records >= 0); + if (num_oob_records > 0) + g_warning("%d OOB reply records possibly leaked", num_oob_records); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/oob.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/oob.h
Changed
@@ -45,16 +45,17 @@ struct array; struct gnutella_node; struct guid; +struct pslist; void oob_init(void); void oob_shutdown(void); void oob_close(void); -void oob_got_results(struct gnutella_node *n, GSList *files, - int count, host_addr_t addr, guint16 port, - gboolean secure_oob, unsigned flags); +void oob_got_results(struct gnutella_node *n, struct pslist *files, + int count, host_addr_t addr, uint16 port, + bool secure_oob, bool reliable_udp, unsigned flags); void oob_deliver_hits(struct gnutella_node *n, const struct guid *muid, - guint8 wanted, const struct array *token); + uint8 wanted, const struct array *token); #endif /* _core_oob_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/oob_proxy.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/oob_proxy.c
Changed
@@ -51,9 +51,12 @@ #include "lib/atoms.h" #include "lib/cq.h" #include "lib/endian.h" +#include "lib/hikset.h" #include "lib/nid.h" +#include "lib/stringify.h" /* For plural() */ #include "lib/walloc.h" -#include "lib/override.h" /* Must be the last header included */ + +#include "lib/override.h" /* Must be the last header included */ /* * The following should be larger than the dynamic query maximum lifetime @@ -88,7 +91,7 @@ /** * Table recording the proxied OOB query MUID. */ -static GHashTable *proxied_queries; /* New MUID => oob_proxy_rec */ +static hikset_t *proxied_queries; /* New MUID => oob_proxy_rec */ /* * High-level description of what's happening here. @@ -151,7 +154,7 @@ oob_proxy_rec_free_remove(struct oob_proxy_rec *opr) { oob_proxy_rec_check(opr); - g_hash_table_remove(proxied_queries, opr->proxied_muid); + hikset_remove(proxied_queries, opr->proxied_muid); oob_proxy_rec_free(opr); } @@ -159,19 +162,18 @@ * Callout queue callback to free OOB proxy record. */ static void -oob_proxy_rec_destroy(cqueue_t *unused_cq, gpointer obj) +oob_proxy_rec_destroy(cqueue_t *cq, void *obj) { struct oob_proxy_rec *opr = obj; - (void) unused_cq; oob_proxy_rec_check(opr); - if (GNET_PROPERTY(query_debug) || GNET_PROPERTY(oob_proxy_debug)) + if (GNET_PROPERTY(query_debug) > 1 || GNET_PROPERTY(oob_proxy_debug) > 1) g_debug("OOB proxied query leaf-MUID=%s proxied-MUID=%s expired", guid_hex_str(opr->leaf_muid), data_hex_str(opr->proxied_muid->v, GUID_RAW_SIZE)); - opr->expire_ev = NULL; /* The timer which just triggered */ + cq_zero(cq, &opr->expire_ev); /* The timer which just triggered */ oob_proxy_rec_free_remove(opr); } @@ -180,13 +182,14 @@ * * @return TRUE on success, FALSE on MUID collision. */ -gboolean +bool oob_proxy_create(gnutella_node_t *n) { - struct guid proxied_muid; + guid_t proxied_muid; struct oob_proxy_rec *opr; host_addr_t primary; - guint32 ipv4; + uint32 ipv4; + const guid_t *muid; g_assert(gnutella_header_get_function(&n->header) == GTA_MSG_SEARCH); g_assert(NODE_IS_LEAF(n)); @@ -203,8 +206,9 @@ primary = listen_addr_primary(); ipv4 = ipv6_ready_advertised_ipv4(primary); + muid = gnutella_header_get_muid(&n->header); /* Leaf MUID */ - memcpy(&proxied_muid, gnutella_header_get_muid(&n->header), GUID_RAW_SIZE); + memcpy(&proxied_muid, muid, GUID_RAW_SIZE); poke_be32(&proxied_muid.v0, ipv4); poke_le16(&proxied_muid.v13, socket_listen_port()); @@ -215,33 +219,55 @@ /* * Look whether we already have something for this proxied MUID. - * - * If it is coming from the same leaf, just increase the timeout. - * Otherwise we have an MUID collision. */ - opr = g_hash_table_lookup(proxied_queries, &proxied_muid); + opr = hikset_lookup(proxied_queries, &proxied_muid); if (opr != NULL) { if (opr->node_id != NODE_ID(n)) { + /* Critical enough to warrant a mandatory warning */ + g_warning("QUERY OOB-proxying of query #%s from %s as #%s " + "failed: proxied MUID collision with %s", + guid_to_string(muid), + node_infostr(n), + guid_hex_str(&proxied_muid), node_id_infostr(opr->node_id)); + return FALSE; + } + + /* + * Coming from the same node as the one for which we created the + * proxied MUID already. + * + * Make sure we have the same leaf MUID since we have the same proxied + * MUID. If there is a difference, we cannot allow proxying to continue + * since an identical proxied MUID would map to two different MUIDs at + * the leaf level. + */ + + if (!guid_eq(muid, opr->leaf_muid)) { if (GNET_PROPERTY(query_debug) || GNET_PROPERTY(oob_proxy_debug)) { - g_warning("QUERY OOB-proxying of query %s from %s as %s " - "failed: proxied MUID collision", - data_hex_str(opr->leaf_muid->v, GUID_RAW_SIZE), + g_warning("QUERY OOB-proxying of query #%s from %s as #%s " + "failed: leaf MUID collision with #%s from same node", + guid_to_string(muid), node_infostr(n), - guid_hex_str(&proxied_muid)); + guid_hex_str(&proxied_muid), + data_hex_str(opr->leaf_muid->v, GUID_RAW_SIZE)); } return FALSE; } + + /* + * Since it is coming from the same leaf, just increase the timeout. + */ + cq_resched(opr->expire_ev, PROXY_EXPIRE_MS); } else { /* * Record the mapping, and make sure it expires in PROXY_EXPIRE_MS. */ - opr = oob_proxy_rec_make(gnutella_header_get_muid(&n->header), - &proxied_muid, NODE_ID(n)); - gm_hash_table_insert_const(proxied_queries, opr->proxied_muid, opr); + opr = oob_proxy_rec_make(muid, &proxied_muid, NODE_ID(n)); + hikset_insert_key(proxied_queries, &opr->proxied_muid); opr->expire_ev = cq_main_insert(PROXY_EXPIRE_MS, oob_proxy_rec_destroy, opr); @@ -256,9 +282,9 @@ message_add(gnutella_header_get_muid(&n->header), GTA_MSG_SEARCH, NULL); - if (GNET_PROPERTY(query_debug) > 5 || GNET_PROPERTY(oob_proxy_debug)) { - g_debug("QUERY OOB-proxying query %s from %s as %s", - data_hex_str(opr->leaf_muid->v, GUID_RAW_SIZE), + if (GNET_PROPERTY(query_debug) > 5 || GNET_PROPERTY(oob_proxy_debug) > 1) { + g_debug("QUERY OOB-proxying query #%s from %s as #%s", + guid_to_string(opr->leaf_muid), node_infostr(n), guid_hex_str(opr->proxied_muid)); } @@ -279,14 +305,14 @@ * * @return whether we know about OOB-proxied query `muid'. */ -gboolean +bool oob_proxy_pending_results( gnutella_node_t *n, const struct guid *muid, - int hits, gboolean uu_udp_firewalled, const struct array *token) + int hits, bool uu_udp_firewalled, const struct array *token) { struct oob_proxy_rec *opr; - struct gnutella_node *leaf; - guint32 wanted; + gnutella_node_t *leaf; + uint32 wanted; const char *msg = NULL; (void) uu_udp_firewalled; @@ -295,7 +321,7 @@ g_assert(hits > 0); g_assert(token); - opr = g_hash_table_lookup(proxied_queries, muid); + opr = hikset_lookup(proxied_queries, muid); if (opr == NULL) return FALSE; @@ -335,7 +361,7 @@ if (hostiles_spam_check(n->addr, n->port)) { msg = "caught spammer"; - gnet_stats_count_general(GNR_OOB_HITS_IGNORED_ON_SPAMMER_HIT, +1); + gnet_stats_inc_general(GNR_OOB_HITS_IGNORED_ON_SPAMMER_HIT); goto ignore; } @@ -392,8 +418,8 @@ * Claim the results (all of it). */ - if (GNET_PROPERTY(query_debug) > 5 || GNET_PROPERTY(oob_proxy_debug) > 1) - g_debug("QUERY OOB-proxied %s notified of %d hits at %s %s" + if (GNET_PROPERTY(query_debug) > 5 || GNET_PROPERTY(oob_proxy_debug) > 2) + g_debug("QUERY OOB-proxied #%s notified of %d hits at %s %s" " for leaf #%s %s, wants %u", guid_hex_str(muid), hits, NODE_IS_UDP(n) ? "UDP" : "TCP", node_addr(n), @@ -405,8 +431,8 @@ return TRUE; ignore: - if (GNET_PROPERTY(query_debug) > 5 || GNET_PROPERTY(oob_proxy_debug) > 1) - g_debug("QUERY OOB-proxied %s " + if (GNET_PROPERTY(query_debug) > 5 || GNET_PROPERTY(oob_proxy_debug) > 2) + g_debug("QUERY OOB-proxied #%s " "notified of %d hits at %s %s for leaf #%s %s, ignored (%s)", guid_hex_str(muid), hits, NODE_IS_UDP(n) ? "UDP" : "TCP", node_addr(n), @@ -428,17 +454,16 @@ * @return TRUE if we routed the packet, FALSE if we did not recognize * the MUID as one of the OOB-proxied queries. */ -gboolean -oob_proxy_got_results(gnutella_node_t *n, guint results) +bool +oob_proxy_got_results(gnutella_node_t *n, uint results) { struct oob_proxy_rec *opr; - struct gnutella_node *leaf; + gnutella_node_t *leaf; g_assert(gnutella_header_get_function(&n->header) == GTA_MSG_SEARCH_RESULTS); g_assert(results > 0 && results <= INT_MAX); - opr = g_hash_table_lookup(proxied_queries, - gnutella_header_get_muid(&n->header)); + opr = hikset_lookup(proxied_queries, gnutella_header_get_muid(&n->header)); if (opr == NULL) return FALSE; @@ -458,12 +483,16 @@ if (leaf == NULL) { gnet_stats_count_dropped(n, MSG_DROP_ROUTE_LOST); - if (GNET_PROPERTY(query_debug) > 5 || GNET_PROPERTY(oob_proxy_debug) > 1) + if ( + GNET_PROPERTY(query_debug) > 5 || + GNET_PROPERTY(oob_proxy_debug) > 2 + ) { g_debug( - "QUERY OOB-proxied %s dropping %d hit%s from %s: no leaf #%s", + "QUERY OOB-proxied #%s dropping %d hit%s from %s: no leaf #%s", guid_hex_str(opr->proxied_muid), - results, results == 1 ? "" : "s", + results, plural(results), node_addr(n), nid_to_string(opr->node_id)); + } return TRUE; /* Leaf gone, drop the message */ } @@ -486,7 +515,7 @@ dh_got_results(opr->leaf_muid, results); if (NODE_IS_UDP(n)) - gnet_stats_count_general(GNR_OOB_HITS_FOR_PROXIED_QUERIES, 1); + gnet_stats_inc_general(GNR_OOB_HITS_FOR_PROXIED_QUERIES); /* * Replace the MUID of the message with the original one that @@ -506,9 +535,9 @@ dh_route(n, leaf, results); - if (GNET_PROPERTY(query_debug) > 5 || GNET_PROPERTY(oob_proxy_debug) > 1) - g_debug("QUERY OOB-proxied %s routed %d hit%s to %s from %s %s", - guid_hex_str(opr->proxied_muid), results, results == 1 ? "" : "s", + if (GNET_PROPERTY(query_debug) > 5 || GNET_PROPERTY(oob_proxy_debug) > 2) + g_debug("QUERY OOB-proxied #%s routed %d hit%s to %s from %s %s", + guid_hex_str(opr->proxied_muid), results, plural(results), node_infostr(leaf), NODE_IS_UDP(n) ? "UDP" : "TCP", node_addr2(n)); return TRUE; /* We routed the message */ @@ -522,8 +551,8 @@ oob_proxy_muid_proxied(const struct guid *muid) { const struct oob_proxy_rec *opr; - - opr = g_hash_table_lookup(proxied_queries, muid); + + opr = hikset_lookup(proxied_queries, muid); if (opr) { oob_proxy_rec_check(opr); return opr->leaf_muid; @@ -538,18 +567,19 @@ void oob_proxy_init(void) { - proxied_queries = g_hash_table_new(guid_hash, guid_eq); + proxied_queries = hikset_create( + offsetof(struct oob_proxy_rec, proxied_muid), + HASH_KEY_FIXED, GUID_RAW_SIZE); } /** * Cleanup servent -- hash table iterator callback */ static void -free_oob_proxy_kv(gpointer uu_key, gpointer value, gpointer uu_udata) +free_oob_proxy_kv(void *value, void *uu_udata) { struct oob_proxy_rec *opr = value; - (void) uu_key; (void) uu_udata; oob_proxy_rec_check(opr); oob_proxy_rec_free(opr); @@ -561,8 +591,8 @@ void oob_proxy_close(void) { - g_hash_table_foreach(proxied_queries, free_oob_proxy_kv, NULL); - gm_hash_table_destroy_null(&proxied_queries); + hikset_foreach(proxied_queries, free_oob_proxy_kv, NULL); + hikset_free_null(&proxied_queries); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/oob_proxy.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/oob_proxy.h
Changed
@@ -47,11 +47,11 @@ void oob_proxy_init(void); void oob_proxy_close(void); -gboolean oob_proxy_create(struct gnutella_node *n); -gboolean oob_proxy_pending_results( +bool oob_proxy_create(struct gnutella_node *n); +bool oob_proxy_pending_results( struct gnutella_node *n, const struct guid *muid, - int hits, gboolean udp_firewalled, const struct array *token); -gboolean oob_proxy_got_results(struct gnutella_node *n, guint results); + int hits, bool udp_firewalled, const struct array *token); +bool oob_proxy_got_results(struct gnutella_node *n, uint results); const struct guid *oob_proxy_muid_proxied(const struct guid *muid); #endif /* _core_oob_proxy_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/parq.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/parq.c
Changed
@@ -37,45 +37,52 @@ #include "common.h" #include "parq.h" + #include "ban.h" -#include "downloads.h" +#include "ctl.h" #include "dmesh.h" +#include "downloads.h" #include "features.h" +#include "geo_ip.h" +#include "gnet_stats.h" #include "guid.h" +#include "hostiles.h" +#include "hosts.h" #include "http.h" #include "ioheader.h" #include "settings.h" #include "share.h" #include "sockets.h" -#include "gnet_stats.h" -#include "hosts.h" -#include "hostiles.h" -#include "geo_ip.h" -#include "ctl.h" #include "if/gnet_property.h" #include "if/gnet_property_priv.h" #include "if/core/main.h" /* For debugging() */ -#include "lib/atoms.h" #include "lib/aging.h" #include "lib/ascii.h" +#include "lib/atoms.h" #include "lib/bit_array.h" #include "lib/concat.h" #include "lib/cq.h" #include "lib/file.h" #include "lib/getdate.h" #include "lib/getline.h" -#include "lib/glib-missing.h" #include "lib/halloc.h" #include "lib/hashlist.h" +#include "lib/hevset.h" +#include "lib/hikset.h" +#include "lib/htable.h" #include "lib/parse.h" +#include "lib/plist.h" +#include "lib/pslist.h" #include "lib/stats.h" #include "lib/str.h" #include "lib/stringify.h" #include "lib/timestamp.h" #include "lib/tm.h" +#include "lib/tokenizer.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ #define PARQ_VERSION_MAJOR 1 @@ -112,9 +119,9 @@ */ #define PARQ_UL_LARGE_SIZE (600 * MEBI) -static GHashTable *dl_all_parq_by_id; +static htable_t *dl_all_parq_by_id; -static guint parq_max_upload_size = MAX_UPLOAD_QSIZE; +static uint parq_max_upload_size = MAX_UPLOAD_QSIZE; /** * parq_upload_active_size is the maximum number of active upload slots @@ -123,42 +130,41 @@ * This limit will only be reached when all requests are QUEUE, push or * the number of upload slots is also large. */ -static guint parq_upload_active_size = 20; +static uint parq_upload_active_size = 20; -static guint parq_upload_ban_window = 600; +static uint parq_upload_ban_window = 600; static const char file_parq_file = "parq"; -static GList *ul_parqs; /**< List of all queued uploads */ +static plist_t *ul_parqs; /**< List of all queued uploads */ static int ul_parqs_cnt; /**< Amount of queues */ static hash_list_t *ul_parq_queue; /**< To whom we need to send a QUEUE */ static aging_table_t *ul_queue_sent; /** Used as search table by IP addr */ -static GHashTable *ul_all_parq_by_addr_and_name; -static GHashTable *ul_all_parq_by_addr; -static GHashTable *ul_all_parq_by_id; +static hikset_t *ul_all_parq_by_addr_and_name; +static hevset_t *ul_all_parq_by_addr; +static htable_t *ul_all_parq_by_id; static cperiodic_t *parq_dead_timer_ev; static cperiodic_t *parq_save_timer_ev; +static bool parq_closed; /** * If enable_real_passive is TRUE, a dead upload is only marked dead, * if FALSE, a dead upload is really removed and cannot reclaim its * position */ -static gboolean enable_real_passive = TRUE; - +static bool enable_real_passive = TRUE; -static GHashTable *ht_banned_source; -static GList *parq_banned_sources; +static hevset_t *ht_banned_source; +static plist_t *parq_banned_sources; struct parq_banned { - host_addr_t addr; + host_addr_t addr; /* Embedded key */ time_t added; time_t expire; }; - -static gboolean parq_shutdown; +static bool parq_shutdown; static time_t parq_start; /**< Init time */ -static guint64 parq_slots_removed = 0; /**< Amount of slots removed */ +static uint64 parq_slots_removed = 0; /**< Amount of slots removed */ enum parq_ul_queue_magic { PARQ_UL_QUEUE_MAGIC = 0x7dbab331 @@ -169,7 +175,7 @@ */ struct parq_ul_queue { enum parq_ul_queue_magic magic; - GList *by_position; /**< Queued items sorted on position. Newest is + plist_t *by_position; /**< Queued items sorted on position. Newest is added to the end. */ hash_list_t *by_rel_pos; /**< Queued items sorted by relative position */ hash_list_t *by_date_dead; /**< Dead items sorted on last update */ @@ -205,7 +211,7 @@ time_t last_queue_sent; time_t last_queue_failure; - GList *list; /**< List or queued items for this ip */ + plist_t *list; /**< List or queued items for this ip */ }; enum parq_ul_magic { @@ -217,11 +223,11 @@ */ struct parq_ul_queued { enum parq_ul_magic magic; /**< Magic number */ - guint32 flags; /**< Operating flags */ - guint position; /**< Current position in the queue */ - guint relative_position; /**< Relative position in the queue, if 'not alive' + uint32 flags; /**< Operating flags */ + uint position; /**< Current position in the queue */ + uint relative_position; /**< Relative position in the queue, if 'not alive' uploads are taken into account */ - guint eta; /**< Expected time in seconds till an upload slot is + uint eta; /**< Expected time in seconds till an upload slot is reached, this is a relative timestamp */ time_t expire; /**< Time when the queue position will be lost */ @@ -232,15 +238,15 @@ out of the queue when retry isn't obeyed */ time_t disc_timeout; /**< Time after which we allow the upload to be disconnected again. */ - guint ban_countwait; /**< Counter is increased everytime a client did + uint ban_countwait; /**< Counter is increased everytime a client did not obey the retry-after header, used to ban a client. */ time_t last_queue_sent; /**< When we last sent the QUEUE */ time_t send_next_queue; /**< When to send the next QUEUE */ time_t slot_granted; /**< Time at which the upload slot was granted */ - guint32 queue_sent; /**< Amount of QUEUE messages we tried to send */ - guint32 queue_refused; /**< Amount of QUEUE messages refused remotely */ + uint32 queue_sent; /**< Amount of QUEUE messages we tried to send */ + uint32 queue_refused; /**< Amount of QUEUE messages refused remotely */ struct guid id; /**< PARQ identifier; GUID atom */ @@ -254,10 +260,10 @@ filesize_t uploaded_size; /**< Bytes previously uploaded */ filesize_t downloaded; /**< Their advertized downloaded amount */ host_addr_t addr; /**< Contact IP:port, as read from X-Node: */ - guint16 port; + uint16 port; - guint major; - guint minor; + uint major; + uint minor; struct parq_ul_queue *queue; /**< In which queue this entry is listed */ struct parq_ul_queued_by_addr *by_addr; @@ -297,11 +303,11 @@ * Contains the queued download status. */ struct parq_dl_queued { - guint position; /**< Current position in the queue */ - guint length; /**< Current queue length */ + uint position; /**< Current position in the queue */ + uint length; /**< Current queue length */ time_t eta; /**< Estimated time till upload slot retrieved */ - guint lifetime; /**< Max interval before loosing queue position */ - guint retry_delay; /**< Interval between new attempt */ + uint lifetime; /**< Max interval before loosing queue position */ + uint retry_delay; /**< Interval between new attempt */ char *id; /**< PARQ Queue ID, +1 for trailing NUL */ }; @@ -357,8 +363,8 @@ * @return a boolean which is true when parsing of the header version was * successful. */ -static gboolean -get_header_version(char const * const header, guint *major, guint *minor) +static bool +get_header_version(char const * const header, uint *major, uint *minor) { return 0 == parse_major_minor(header, NULL, major, minor); } @@ -380,7 +386,7 @@ /** * Get header value. * - * Retrieves a value from a header line. If possible the length (in gchars) + * Retrieves a value from a header line. If possible the length (in chars) * is returned for that value. * * @param s is a pointer to the header string that will be parsed. @@ -396,8 +402,8 @@ { const char *header = s; char *end; - gboolean found_right_attribute = FALSE; - gboolean found_equal_sign = FALSE; + bool found_right_attribute = FALSE; + bool found_equal_sign = FALSE; size_t attrlen; @@ -487,8 +493,9 @@ if (!found_right_attribute) { g_assert(!found_equal_sign); - g_warning("%s: attribute '%s' has no value in string: %s", - __FILE__, attribute, s); + g_warning("%s() in %s: " + "attribute '%s' has no value in string: %s", + G_STRFUNC, _WHERE_, attribute, s); } } } while (!found_right_attribute); @@ -527,7 +534,7 @@ ***/ /** - * Retrieves the PARQ ID associated with an download. + * Retrieves the PARQ ID associated with a download. * * @return a char pointer to the ID, or NULL if no ID is available. */ @@ -539,7 +546,7 @@ } /** - * Retrieves the remote queued position associated with an download. + * Retrieves the remote queued position associated with a download. * * @returns the remote queued position or 0 if download is not queued or * queuing status is unknown @@ -552,7 +559,7 @@ } /** - * Retrieves the remote queue size associated with an download. + * Retrieves the remote queue size associated with a download. * * @return the remote queue size or 0 if download is not queued or queueing * status is unknown. @@ -593,7 +600,7 @@ /** * Whether the download is queued remotely or not. */ -gboolean +bool parq_download_is_active_queued(const struct download *d) { download_check(d); @@ -603,7 +610,7 @@ /** * Whether the download is queued remotely without keeping the connection or not */ -gboolean +bool parq_download_is_passive_queued(const struct download *d) { download_check(d); @@ -611,6 +618,51 @@ } /** + * Switch PARQ downloading IDs if the position in the older download is more + * interesting than the one in the newer one. + */ +static void +parq_download_switch(struct download *od, struct download *nd) +{ + struct parq_dl_queued *opd, *npd; + + download_check(od); + download_check(nd); + g_assert(od->server == nd->server); + + opd = od->parq_dl; + + if (NULL == opd->id) + return; /* Not a PARQ download */ + + npd = nd->parq_dl; + if (NULL == npd) { + g_carp("%s(): switching between a PARQ download and a non-PARQ one: " + "old was \"%s\", new is \"%s\" at %s", + G_STRFUNC, download_basename(od), download_basename(nd), + download_host_info(nd)); + return; + } + + if (opd->position >= npd->position) + return; + + /* + * Position in the old download is more interesting, switch the IDs. + */ + + if (GNET_PROPERTY(parq_debug)) { + g_debug("PARQ switching IDs between \"%s\" and \"%s\" at %s: " + "old position %u lower than new %u", + download_basename(od), download_basename(nd), + download_host_info(nd), opd->position, npd->position); + } + + od->parq_dl = npd; + nd->parq_dl = opd; +} + +/** * Active queued means we didn't close the http connection on a HTTP 503 busy * when the server supports queueing. So prepare the download structure * for a 'valid' segment. And re-request the segment. @@ -618,21 +670,63 @@ void parq_download_retry_active_queued(struct download *d) { + fileinfo_t *fi; + struct download *other = NULL; /* Becomes non-NULL if we switch */ + bool prepared; + download_check(d); g_assert(d->socket != NULL); g_assert(d->status == GTA_DL_ACTIVE_QUEUED); g_assert(d->parq_dl != NULL); g_assert(parq_download_is_active_queued(d)); - if (download_start_prepare_running(d)) { + /* + * If the file was completed during our waiting, try to switch to another + * pending download on the same server, if any. + */ + + fi = d->file_info; + file_info_check(fi); + + if (FILE_INFO_COMPLETE(fi)) { + other = download_pick_another_waiting(d); + if (other != NULL) { + download_switch(d, other, FALSE); + /* + * Don't stop download, we may be still computing the SHA1 of + * the file and we need to keep the source around, just in case. + */ + download_queue(d, + _("Switching to \"%s\""), download_basename(other)); + + if (GNET_PROPERTY(download_debug) || GNET_PROPERTY(parq_debug)) { + g_debug("PARQ switched resource to %s -- completed %s on %s", + download_basename(other), + download_basename(d), download_host_info(d)); + } + + parq_download_switch(d, other); + d = other; /* Now processing the new download */ + } + } + + prepared = NULL == other ? + download_start_prepare_running(d) : /* Was already running */ + download_start_prepare(d); /* Was waiting */ + + if (prepared) { struct gnutella_socket *s = d->socket; d->keep_alive = TRUE; /* was reset in start_prepare_running */ - /* Will be re initialised in download_send_request */ - io_free(d->io_opaque); - d->io_opaque = NULL; - getline_free(s->getline); /* No longer need this */ - s->getline = NULL; + /* d->io_opaque could be NULL if we switched downloads above */ + if (d->io_opaque != NULL) { + /* Will be re initialised in download_send_request */ + io_free(d->io_opaque); + d->io_opaque = NULL; + } + + /* s->getline could be NULL if we switched downloads above */ + getline_free_null(&s->getline); /* Resend request for download */ download_send_request(d); @@ -644,11 +738,11 @@ * * @return parsed integer (base 10), or 0 if none could be found. */ -static guint +static uint get_integer(const char *buf) { const char *endptr; - guint32 val; + uint32 val; int error; /* XXX This needs to get more parameters, so that we can log the @@ -693,7 +787,7 @@ g_assert(parq_dl != NULL); g_assert(parq_dl->id != NULL); - g_hash_table_remove(dl_all_parq_by_id, parq_dl->id); + htable_remove(dl_all_parq_by_id, parq_dl->id); HFREE_NULL(parq_dl->id); g_assert(parq_dl->id == NULL); /* We don't expect an id here */ @@ -758,7 +852,7 @@ g_assert(parq_dl->id == NULL); /* We don't expect an id here */ parq_dl->id = h_strdup(new_id); - g_hash_table_insert(dl_all_parq_by_id, parq_dl->id, d); + htable_insert(dl_all_parq_by_id, parq_dl->id, d); g_assert(parq_dl->id != NULL); } @@ -785,8 +879,8 @@ */ if (parq_dl->id != NULL) { - g_hash_table_remove(dl_all_parq_by_id, parq_dl->id); - g_hash_table_insert(dl_all_parq_by_id, parq_dl->id, cd); + /* Replace value */ + htable_insert(dl_all_parq_by_id, parq_dl->id, cd); } d->parq_dl = NULL; /* No longer associated to `d' */ @@ -820,20 +914,20 @@ * * @return TRUE if we parsed it OK, FALSE on error. */ -gboolean +bool parq_download_parse_queue_status(struct download *d, - header_t *header, guint code) + header_t *header, uint code) { struct parq_dl_queued *parq_dl = NULL; const char *buf; char *temp = NULL; const char *value = NULL; - guint major, minor; + uint major, minor; size_t header_value_length; int retry; download_check(d); - dl_server_valid(d->server); + g_assert(dl_server_valid(d->server)); g_assert(header != NULL); /* @@ -1017,9 +1111,9 @@ parq_download_add_header( char *buf, size_t len, size_t *rw, struct download *d) { - gboolean has_ipv4 = FALSE; + bool has_ipv4 = FALSE; host_addr_t addr; - guint16 port; + uint16 port; g_assert(d != NULL); g_assert(rw != NULL); @@ -1027,7 +1121,7 @@ g_assert(UNSIGNED(*rw) <= INT_MAX); g_assert(len >= *rw); - *rw += gm_snprintf(&buf*rw, len - *rw, "%s\r\n", + *rw += str_bprintf(&buf*rw, len - *rw, "%s\r\n", (d->server->attrs & DLS_A_FAKE_G2) ? parq_get_x_queue_legacy_header() : parq_get_x_queue_header()); @@ -1039,7 +1133,7 @@ if (d->server->parq_version.major == 1) { if (get_parq_dl_id(d) != NULL) - *rw += gm_snprintf(&buf*rw, len - *rw, + *rw += str_bprintf(&buf*rw, len - *rw, "X-Queued: position=%d; ID=%s\r\n", get_parq_dl_position(d), get_parq_dl_id(d)); @@ -1052,7 +1146,7 @@ if (GNET_PROPERTY(is_firewalled) || (d->server->attrs & DLS_A_FAKE_G2)) return; - + port = socket_listen_port(); if (0 == port) return; @@ -1060,14 +1154,14 @@ addr = listen_addr(); if (is_host_addr(addr)) { has_ipv4 = TRUE; - *rw += gm_snprintf(&buf*rw, len - *rw, + *rw += str_bprintf(&buf*rw, len - *rw, "X-Node: %s\r\n", host_addr_port_to_string(addr, port)); } addr = listen_addr6(); if (is_host_addr(addr)) { - *rw += gm_snprintf(&buf*rw, len - *rw, + *rw += str_bprintf(&buf*rw, len - *rw, "%s%s\r\n", has_ipv4 ? "X-Node-IPv6: " : "X-Node: ", host_addr_port_to_string(addr, port)); @@ -1089,8 +1183,8 @@ char *ip_str; struct download *dl; host_addr_t addr; - guint16 port = 0; - gboolean has_ip_port = TRUE; + uint16 port = 0; + bool has_ip_port = TRUE; socket_tos_default(s); /* Set proper Type of Service */ @@ -1099,7 +1193,7 @@ queue = getline_str(s->getline); - gnet_stats_count_general(GNR_QUEUE_CALLBACKS, 1); + gnet_stats_inc_general(GNR_QUEUE_CALLBACKS); if (GNET_PROPERTY(download_trace) & SOCK_TRACE_IN) { g_debug("----Got QUEUE from %s:\n", host_addr_to_string(s->addr)); @@ -1111,10 +1205,12 @@ * HTTP request, eventually. */ - if (hostiles_check(s->addr)) { + if (hostiles_is_bad(s->addr)) { if (GNET_PROPERTY(download_debug) || GNET_PROPERTY(socket_debug)) { - g_warning("discarding GIV string \"%s\" from hostile %s", - queue, host_addr_to_string(s->addr)); + hostiles_flags_t flags = hostiles_check(s->addr); + g_warning("discarding GIV string \"%s\" from hostile %s (%s)", + queue, host_addr_to_string(s->addr), + hostiles_flags_to_string(flags)); } goto ignore; } @@ -1154,7 +1250,7 @@ if (ip_str != NULL) *ip_str = '\0'; - dl = g_hash_table_lookup(dl_all_parq_by_id, id); + dl = htable_lookup(dl_all_parq_by_id, id); /* * If we were unable to locate a download by this ID, try to elect @@ -1228,29 +1324,17 @@ */ if (download_start_prepare(dl)) { - struct gnutella_socket *ds = dl->socket; - dl->socket = s; - ds = s; - - getline_free(ds->getline); /* No longer need this */ - ds->getline = NULL; + download_attach_socket(dl, s); - - g_assert(dl->socket != NULL); dl->last_update = tm_time(); - s->resource.download = dl; - - /* Resend request for download */ - download_send_request(dl); + download_send_request(dl); /* Resend request for download */ } return; ignore: - gnet_stats_count_general(GNR_QUEUE_DISCARDED, 1); - g_assert(s->resource.download == NULL); /* Hence socket_free() allowed */ + gnet_stats_inc_general(GNR_QUEUE_DISCARDED); socket_free_null(&s); - return; } /*** @@ -1274,10 +1358,10 @@ * @return probable slot time, or 0 if we cannot compute anything due to * too little data points. */ -static guint +static uint parq_probable_slot_time(const struct parq_ul_queue *q) { - guint e; + uint e; double factor; if (statx_n(q->slot_stats) < STAT_MIN_POINTS) @@ -1294,8 +1378,8 @@ */ factor = GNET_PROPERTY(parq_optimistic) ? 0.5 : 2.0; - e = (guint) (statx_avg(q->slot_stats) + factor * statx_sdev(q->slot_stats)); - + e = (uint) (statx_avg(q->slot_stats) + factor * statx_sdev(q->slot_stats)); + return e; } @@ -1303,13 +1387,13 @@ * Compute estimate for the time it will take to upload the whole file (or * a fraction of it if we are optimistic) at a given queue position. */ -static guint +static uint parq_estimated_slot_time(const struct parq_ul_queued *puq) { filesize_t remaining; - guint avg_bps; - guint d; - guint pd; + uint avg_bps; + uint d; + uint pd; avg_bps = bsched_avg_bps(BSCHED_BWS_OUT); avg_bps = MAX(1, avg_bps); @@ -1321,7 +1405,7 @@ remaining = puq->file_size - puq->downloaded; d = remaining / avg_bps * GNET_PROPERTY(max_uploads); if (GNET_PROPERTY(parq_optimistic)) { - guint n; + uint n; n = puq->sha1 ? dmesh_count(puq->sha1) : 0; if (n > 1) { @@ -1339,9 +1423,9 @@ static void parq_upload_update_eta(struct parq_ul_queue *which_ul_queue) { - GList *l; - guint eta = 0; - guint avg_bps; + plist_t *l; + uint eta = 0; + uint avg_bps; time_delta_t running_time = delta_time(tm_time(), parq_start); hash_list_iter_t *iter; @@ -1356,7 +1440,7 @@ * Locate the first active upload in this queue. */ - for (l = which_ul_queue->by_position; l; l = g_list_next(l)) { + PLIST_FOREACH(which_ul_queue->by_position, l) { struct parq_ul_queued *puq = l->data; if (puq->has_slot) { /* Recompute ETA */ @@ -1376,7 +1460,7 @@ eta = parq_probable_slot_time(which_ul_queue); - for (l = ul_parqs; l && 0 == eta; l = g_list_next(l)) { + for (l = ul_parqs; l && 0 == eta; l = plist_next(l)) { struct parq_ul_queue *q = l->data; eta = parq_probable_slot_time(q); @@ -1408,8 +1492,8 @@ */ if (puq->relative_position > GNET_PROPERTY(max_uploads)) { - time_delta_t per_slot = running_time / MIN(1, parq_slots_removed); - guint cheap_eta = puq->relative_position * per_slot; + time_delta_t per_slot = running_time / MAX(1, parq_slots_removed); + uint cheap_eta = puq->relative_position * per_slot; if (cheap_eta < eta) puq->eta = cheap_eta; @@ -1427,7 +1511,7 @@ static void parq_upload_decrease_all_after(struct parq_ul_queued *puq) { - GList *l; + plist_t *l; int pos_cnt = 0; /* Used for assertion */ g_assert(puq != NULL); @@ -1435,16 +1519,16 @@ g_assert(puq->queue->by_position != NULL); g_assert(puq->queue->by_position_length > 0); - l = g_list_find(puq->queue->by_position, puq); + l = plist_find(puq->queue->by_position, puq); pos_cnt = ((struct parq_ul_queued *) l->data)->position; - l = g_list_next(l); /* Decrease _after_ current parq */ + l = plist_next(l); /* Decrease _after_ current parq */ /* * Cycle through list and decrease all positions by one. Position should * never reach 0 which would mean the queued item is currently uploading */ - for (; l; l = g_list_next(l)) { + for (; l; l = plist_next(l)) { struct parq_ul_queued *p = l->data; g_assert(p != NULL); @@ -1461,7 +1545,7 @@ * queue positions, which refer to the order of arrival in the queue. */ static int -parq_ul_rel_pos_cmp(gconstpointer a, gconstpointer b) +parq_ul_rel_pos_cmp(const void *a, const void *b) { const struct parq_ul_queued *as = a, *bs = b; @@ -1476,6 +1560,8 @@ { parq_ul_queued_check(puq); + g_assert(!(puq->flags & PARQ_UL_FROZEN)); + puq->relative_position = 0; hash_list_insert_sorted(puq->queue->by_rel_pos, puq, parq_ul_rel_pos_cmp); } @@ -1500,13 +1586,13 @@ static void parq_upload_recompute_positions(struct parq_ul_queue *q) { - guint pos = 0; - guint prev_pos = 0; - GList *l; + uint pos = 0; + uint prev_pos = 0; + plist_t *l; parq_ul_queue_check(q); - GM_LIST_FOREACH(q->by_position, l) { + PLIST_FOREACH(q->by_position, l) { struct parq_ul_queued *puq = l->data; parq_ul_queued_check(puq); @@ -1529,9 +1615,9 @@ static void parq_upload_recompute_relative_positions(struct parq_ul_queue *q) { - guint rel = 0; - guint prev_rel = 0; - guint prev_pos = 0; + uint rel = 0; + uint prev_rel = 0; + uint prev_pos = 0; hash_list_iter_t *iter; parq_ul_queue_check(q); @@ -1617,22 +1703,21 @@ if (puq->flags & PARQ_UL_QUEUE) hash_list_remove(ul_parq_queue, puq); - puq->by_addr->list = g_list_remove(puq->by_addr->list, puq); + puq->by_addr->list = plist_remove(puq->by_addr->list, puq); puq->by_addr->total--; if (puq->flags & PARQ_UL_FROZEN) parq_upload_frozen_clear(puq); if (puq->by_addr->total == 0) { - g_assert(host_addr_equal(puq->remote_addr, puq->by_addr->addr)); + g_assert(host_addr_equiv(puq->remote_addr, puq->by_addr->addr)); g_assert(NULL == puq->by_addr->list); /* No more uploads from this ip, cleaning up */ - g_hash_table_remove(ul_all_parq_by_addr, &puq->by_addr->addr); + hevset_remove(ul_all_parq_by_addr, &puq->by_addr->addr); WFREE(puq->by_addr); - g_assert(NULL == g_hash_table_lookup(ul_all_parq_by_addr, - &puq->remote_addr)); + g_assert(!hevset_contains(ul_all_parq_by_addr, &puq->remote_addr)); } puq->by_addr = NULL; @@ -1646,12 +1731,12 @@ } /* Remove the current queued item from all lists */ - puq->queue->by_position = g_list_remove(puq->queue->by_position, puq); + puq->queue->by_position = plist_remove(puq->queue->by_position, puq); parq_upload_remove_relative(puq); - g_hash_table_remove(ul_all_parq_by_addr_and_name, puq->addr_and_name); - g_hash_table_remove(ul_all_parq_by_id, &puq->id); + hikset_remove(ul_all_parq_by_addr_and_name, puq->addr_and_name); + htable_remove(ul_all_parq_by_id, &puq->id); g_assert(!hash_list_contains(puq->queue->by_date_dead, puq)); g_assert(!hash_list_contains(puq->queue->by_rel_pos, puq)); @@ -1692,7 +1777,7 @@ * * @return the recommended retry delay. */ -static guint32 +static uint32 parq_ul_calc_retry(struct parq_ul_queued *puq) { int result = PARQ_TIMER_BY_POS + @@ -1700,7 +1785,7 @@ if (GNET_PROPERTY(parq_optimistic)) { struct parq_ul_queued *puq_prev = NULL; - guint avg_bps; + uint avg_bps; avg_bps = bsched_avg_bps(BSCHED_BWS_OUT); avg_bps = MAX(1, avg_bps); @@ -1739,9 +1824,9 @@ queue->by_rel_pos = hash_list_new(NULL, NULL); queue->by_date_dead = hash_list_new(NULL, NULL); - ul_parqs = g_list_append(ul_parqs, queue); + ul_parqs = plist_append(ul_parqs, queue); ul_parqs_cnt++; - queue->num = g_list_length(ul_parqs); + queue->num = plist_length(ul_parqs); if (GNET_PROPERTY(parq_debug)) g_debug("PARQ UL: Created new queue %d", queue->num); @@ -1763,8 +1848,8 @@ parq_upload_which_queue(struct upload *u) { struct parq_ul_queue *queue; - guint size = PARQ_UL_LARGE_SIZE; - guint slot; + uint size = PARQ_UL_LARGE_SIZE; + uint slot; /* * Determine in which queue the upload should be placed. Upload queues: @@ -1786,10 +1871,10 @@ } /* if necessary, create missing queues */ - while (g_list_length(ul_parqs) < GNET_PROPERTY(max_uploads)) + while (plist_length(ul_parqs) < GNET_PROPERTY(max_uploads)) parq_upload_new_queue(); - queue = g_list_nth_data(ul_parqs, slot - 1); + queue = plist_nth_data(ul_parqs, slot - 1); parq_ul_queue_check(queue); /* We might need to reactivate the queue */ @@ -1813,8 +1898,7 @@ g_assert(u->name != NULL); if (puq->addr_and_name != NULL) { - g_hash_table_remove(ul_all_parq_by_addr_and_name, - puq->addr_and_name); + hikset_remove(ul_all_parq_by_addr_and_name, puq->addr_and_name); HFREE_NULL(puq->addr_and_name); puq->name = NULL; } @@ -1823,8 +1907,7 @@ host_addr_to_string(u->addr), u->name); puq->name = strchr(puq->addr_and_name, ' ') + 1; - g_hash_table_insert(ul_all_parq_by_addr_and_name, puq->addr_and_name, - puq); + hikset_insert_key(ul_all_parq_by_addr_and_name, &puq->addr_and_name); } /** @@ -1838,8 +1921,8 @@ struct parq_ul_queued *puq = NULL; struct parq_ul_queued *prev_puq = NULL; struct parq_ul_queue *q = NULL; - guint eta = 0; - guint rel_pos = 1; + uint eta = 0; + uint rel_pos = 1; upload_check(u); g_assert(ul_all_parq_by_addr_and_name != NULL); @@ -1860,7 +1943,7 @@ eta = prev_puq->eta; if (GNET_PROPERTY(max_uploads) <= 0) { - eta = (guint) -1; + eta = (uint) -1; } else { eta += parq_estimated_slot_time(prev_puq); } @@ -1916,17 +1999,17 @@ puq->slot_granted = 0; /* Save into hash table so we can find the current parq ul later */ - g_hash_table_insert(ul_all_parq_by_id, &puq->id, puq); + htable_insert(ul_all_parq_by_id, &puq->id, puq); q->by_position_length++; - q->by_position = g_list_append(q->by_position, puq); + q->by_position = plist_append(q->by_position, puq); hash_list_append(puq->queue->by_rel_pos, puq); if (GNET_PROPERTY(parq_debug) > 3) { - g_debug("PARQ UL Q %d/%d (%3d%3d/%3d): New: %s \"%s\"; ID=\"%s\"", + g_debug("PARQ UL Q %d/%zd (%3d%3d/%3d): New: %s \"%s\"; ID=\"%s\"", puq->queue->num, - g_list_length(ul_parqs), + plist_length(ul_parqs), puq->position, puq->relative_position, puq->queue->by_position_length, @@ -1936,25 +2019,23 @@ } /* Check if the requesting client has already other PARQ entries */ - puq->by_addr = g_hash_table_lookup(ul_all_parq_by_addr, - &puq->remote_addr); + puq->by_addr = hevset_lookup(ul_all_parq_by_addr, &puq->remote_addr); if (puq->by_addr == NULL) { /* The requesting client has no other PARQ entries yet, create an ip * reference structure */ WALLOC0(puq->by_addr); puq->by_addr->addr = puq->remote_addr; - g_hash_table_insert(ul_all_parq_by_addr, - &puq->by_addr->addr, puq->by_addr); + hevset_insert_key(ul_all_parq_by_addr, &puq->by_addr->addr); puq->by_addr->uploading = 0; puq->by_addr->total = 0; puq->by_addr->list = NULL; } - g_assert(host_addr_equal(puq->by_addr->addr, puq->remote_addr)); + g_assert(host_addr_equiv(puq->by_addr->addr, puq->remote_addr)); puq->by_addr->total++; - puq->by_addr->list = g_list_prepend(puq->by_addr->list, puq); + puq->by_addr->list = plist_prepend(puq->by_addr->list, puq); g_assert(puq != NULL); g_assert(puq->position > 0); @@ -1979,10 +2060,10 @@ static void parq_upload_recompute_queue_num(void) { - GList *l; + plist_t *l; int pos = 0; - for (l = ul_parqs; l; l = g_list_next(l)) { + PLIST_FOREACH(ul_parqs, l) { struct parq_ul_queue *q = l->data; q->num = ++pos; @@ -2007,7 +2088,7 @@ g_debug("PARQ UL: removing inactive queue %d", queue->num); /* Remove queue from the list containing all the queues */ - ul_parqs = g_list_remove(ul_parqs, queue); + ul_parqs = plist_remove(ul_parqs, queue); parq_upload_recompute_queue_num(); g_assert(ul_parqs_cnt > 0); @@ -2035,10 +2116,10 @@ if (id_str) { struct guid id; - + if (hex_to_guid(id_str, &id)) { struct parq_ul_queued *puq; - puq = g_hash_table_lookup(ul_all_parq_by_id, &id); + puq = htable_lookup(ul_all_parq_by_id, &id); /* In case we missed it earlier, record PARQ support */ if (puq != NULL) puq->supports_parq = TRUE; @@ -2066,7 +2147,7 @@ * is shared or if we don't know, e.g. if the library is being * rebuilt. */ -static gboolean +static bool parq_still_sharing(struct parq_ul_queued *puq) { shared_file_t *sf; @@ -2083,6 +2164,7 @@ sha1_base32(puq->sha1), puq->name); return FALSE; } + shared_file_unref(&sf); /* Either we have the file or we are rebuilding */ } else { /* @@ -2099,11 +2181,13 @@ puq->sha1 = atom_sha1_get(shared_file_sha1(sf)); g_message("PARQ UL found SHA1=%s for \"%s\"", sha1_base32(puq->sha1), puq->name); + shared_file_unref(&sf); return TRUE; } else { if (GNET_PROPERTY(parq_debug)) g_debug("PARQ UL We no longer share this file \"%s\"", puq->name); + shared_file_unref(&sf); return FALSE; } } @@ -2180,8 +2264,8 @@ } else if (u->name) { concat_strings(buf, sizeof buf, host_addr_to_string(u->addr), " ", u->name, - (void *) 0); - return g_hash_table_lookup(ul_all_parq_by_addr_and_name, buf); + NULL_PTR); + return hikset_lookup(ul_all_parq_by_addr_and_name, buf); } else { return NULL; } @@ -2205,7 +2289,7 @@ struct gnutella_socket *s; struct upload *u; time_t now = tm_time(); - guint32 flags = GNET_PROPERTY(tls_enforce) ? SOCK_F_TLS : 0; + uint32 flags = GNET_PROPERTY(tls_enforce) ? SOCK_F_TLS : 0; g_assert(puq->flags & PARQ_UL_QUEUE); @@ -2214,26 +2298,30 @@ puq->send_next_queue = parq_upload_next_queue(now, puq); puq->by_addr->last_queue_sent = now; - if (GNET_PROPERTY(parq_debug)) + if (GNET_PROPERTY(parq_debug)) { g_debug("PARQ UL Q %d/%d (%3d%3d/%3d): " - "Sending QUEUE #%d to %s: '%s'", - puq->queue->num, - ul_parqs_cnt, - puq->position, - puq->relative_position, - puq->queue->by_position_length, - puq->queue_sent, - host_addr_port_to_string(puq->addr, puq->port), - puq->name); + "Sending QUEUE #%d to %s for ID=%s: '%s'", + puq->queue->num, + ul_parqs_cnt, + puq->position, + puq->relative_position, + puq->queue->by_position_length, + puq->queue_sent, + host_addr_port_to_string(puq->addr, puq->port), + guid_hex_str(&puq->id), + puq->name); + } - gnet_stats_count_general(GNR_PARQ_QUEUE_SENDING_ATTEMPTS, 1); + gnet_stats_inc_general(GNR_PARQ_QUEUE_SENDING_ATTEMPTS); s = socket_connect(puq->addr, puq->port, SOCK_TYPE_UPLOAD, flags); if (!s) { - g_warning("PARQ UL could not send QUEUE #%d to %s (can't connect)", + g_warning("PARQ UL could not send QUEUE #%d to %s ID=%s " + "(can't connect)", puq->queue_sent, - host_addr_port_to_string(puq->addr, puq->port)); + host_addr_port_to_string(puq->addr, puq->port), + guid_hex_str(&puq->id)); puq->flags &= ~PARQ_UL_QUEUE; return; } @@ -2270,7 +2358,9 @@ puq->by_addr->last_queue_failure = tm_time(); if (GNET_PROPERTY(parq_debug) > 3) { - g_debug("PARQ UL: QUEUE callback not sent: could not connect to %s", + g_debug("PARQ UL: QUEUE callback not sent, ID=%s: " + "could not connect to %s", + guid_hex_str(&puq->id), host_addr_to_string(puq->by_addr->addr)); } } @@ -2290,18 +2380,18 @@ g_assert(ht_banned_source != NULL); - banned = g_hash_table_lookup(ht_banned_source, &addr); + banned = hevset_lookup(ht_banned_source, &addr); if (banned == NULL) { /* Host not yet banned yet, good */ WALLOC0(banned); banned->addr = addr; - g_hash_table_insert(ht_banned_source, &banned->addr, banned); - parq_banned_sources = g_list_append(parq_banned_sources, banned); + hevset_insert_key(ht_banned_source, &banned->addr); + parq_banned_sources = plist_append(parq_banned_sources, banned); } g_assert(banned != NULL); - g_assert(host_addr_equal(banned->addr, addr)); + g_assert(host_addr_equiv(banned->addr, addr)); /* Update timestamp */ banned->added = now; @@ -2321,13 +2411,13 @@ g_assert(ht_banned_source != NULL); g_assert(parq_banned_sources != NULL); - banned = g_hash_table_lookup(ht_banned_source, &addr); + banned = hevset_lookup(ht_banned_source, &addr); g_assert(banned != NULL); - g_assert(host_addr_equal(banned->addr, addr)); + g_assert(host_addr_equiv(banned->addr, addr)); - g_hash_table_remove(ht_banned_source, &addr); - parq_banned_sources = g_list_remove(parq_banned_sources, banned); + hevset_remove(ht_banned_source, &addr); + parq_banned_sources = plist_remove(parq_banned_sources, banned); WFREE(banned); } @@ -2338,27 +2428,27 @@ static void parq_cleanup_banned(time_t now) { - GList *dl; - GSList *sl, *to_remove = NULL; + plist_t *dl; + pslist_t *sl, *to_remove = NULL; - for (dl = parq_banned_sources ; dl != NULL; dl = g_list_next(dl)) { + PLIST_FOREACH(parq_banned_sources, dl) { struct parq_banned *banned = dl->data; if ( delta_time(now, banned->added) > PARQ_MAX_UL_RETRY_DELAY || delta_time(now, banned->expire) > 0 ) { - to_remove = g_slist_prepend(to_remove, banned); + to_remove = pslist_prepend(to_remove, banned); } } - for (sl = to_remove; sl != NULL; sl = g_slist_next(sl)) { + PSLIST_FOREACH(to_remove, sl) { struct parq_banned *banned = sl->data; parq_del_banned_source(banned->addr); } - g_slist_free(to_remove); + pslist_free(to_remove); } /** @@ -2384,7 +2474,7 @@ delta_time(puq->send_next_queue, now) < 0 && puq->queue_sent < MAX_QUEUE && puq->queue_refused < MAX_QUEUE_REFUSED && - !ban_is_banned(puq->remote_addr) + !ban_is_banned(BAN_CAT_SOCKET, puq->remote_addr) ) parq_upload_register_send_queue(puq); } @@ -2395,18 +2485,18 @@ /** * Callout queue periodic event to scan dead entries in queues. */ -static gboolean -parq_dead_timer(gpointer unused_udata) +static bool +parq_dead_timer(void *unused_udata) { time_t now = tm_time(); - GList *l; + plist_t *l; (void) unused_udata; if (0 == GNET_PROPERTY(max_uploads)) /* Sharing disabled */ return TRUE; - for (l = ul_parqs ; l != NULL; l = g_list_next(l)) { + PLIST_FOREACH(ul_parqs, l) { struct parq_ul_queue *q = l->data; parq_ul_queue_dead_timer(now, q); /* Send QUEUE if possible */ } @@ -2422,15 +2512,16 @@ * @param rlp holds pointer to the single list of items to remove */ static void -parq_upload_queue_timer(time_t now, struct parq_ul_queue *q, GSList **rlp) +parq_upload_queue_timer(time_t now, struct parq_ul_queue *q, pslist_t **rlp) { hash_list_iter_t *iter; - GSList *to_remove = *rlp; + pslist_t *to_remove = *rlp; iter = hash_list_iterator(q->by_rel_pos); while (hash_list_iter_has_next(iter)) { struct parq_ul_queued *puq = hash_list_iter_next(iter); + time_delta_t grace; g_assert(puq != NULL); @@ -2442,19 +2533,38 @@ puq->queue_sent < MAX_QUEUE && puq->queue_refused < MAX_QUEUE_REFUSED && GNET_PROPERTY(max_uploads) > 0 && - !ban_is_banned(puq->remote_addr) + !ban_is_banned(BAN_CAT_SOCKET, puq->remote_addr) ) parq_upload_register_send_queue(puq); + /* + * Even if the upload is flagged with PARQ_UL_QUEUE to indicate that + * we are planning to send it a QUEUE callback at some point, it is + * possible that we may be waiting a very long time before being able + * to send the QUEUE message back, due to outgoing bandwidth shortage, + * or because there are many uploads from the same host and we throttle + * QUEUE sending to avoid hammering the remote host. + * + * To free up the slot they are using, we let them expire nonetheless, + * after PARQ_QUEUE_GRACE_TIME extra time. They will be moved to the + * "dead" queue, where we will continue to schedule QUEUE callbacks. + * However, they can be dropped from the "dead" queue as soon as we + * run out of PARQ slots. + * + * --RAM, 2013-08-30 + */ + + grace = PARQ_GRACE_TIME + + ((puq->flags & PARQ_UL_QUEUE) ? PARQ_QUEUE_GRACE_TIME : 0); + if ( puq->is_alive && - delta_time(now, puq->expire) > PARQ_GRACE_TIME && - !puq->has_slot && - !(puq->flags & PARQ_UL_QUEUE) /* No timeout if pending */ + delta_time(now, puq->expire) > grace && + !puq->has_slot ) { if (GNET_PROPERTY(parq_debug) > 3) g_debug("PARQ UL Q %d/%d (%3d%3d/%3d): " - "Timeout: %s %s '%s'", + "Timeout: ID=%s %s '%s'", puq->queue->num, ul_parqs_cnt, puq->position, @@ -2470,7 +2580,7 @@ * ul_parq_by_position linked list. (prepend is probably the * fastest function) */ - to_remove = g_slist_prepend(to_remove, puq); + to_remove = pslist_prepend(to_remove, puq); } } @@ -2485,12 +2595,13 @@ static void parq_upload_send_queue_callbacks(time_t now) { - gpointer next; + void *next; if ( GNET_PROPERTY(library_rebuilding) || 0 == hash_list_length(ul_parq_queue) || - 0 == GNET_PROPERTY(max_uploads) + 0 == GNET_PROPERTY(max_uploads) || + GNET_PROPERTY(net_buffer_shortage) ) return; @@ -2502,7 +2613,7 @@ next = hash_list_head(ul_parq_queue); while (next) { struct parq_ul_queued *puq = next; - gboolean has_timedout; + bool has_timedout; time_t last_queue_sent; time_t last_queue_failure; @@ -2576,10 +2687,10 @@ void parq_upload_timer(time_t now) { - static guint startup_delay; - GList *queues; - GSList *sl, *to_remove = NULL; - guint queue_selected = 0; + static uint startup_delay; + plist_t *queues; + pslist_t *sl, *to_remove = NULL; + uint queue_selected = 0; if (!parq_is_enabled()) return; @@ -2600,7 +2711,7 @@ * Scan the queues. */ - for (queues = ul_parqs ; queues != NULL; queues = queues->next) { + PLIST_FOREACH(ul_parqs, queues) { struct parq_ul_queue *queue = queues->data; queue_selected++; @@ -2618,7 +2729,7 @@ * Sort out dead entries. */ - for (sl = to_remove; sl != NULL; sl = g_slist_next(sl)) { + PSLIST_FOREACH(to_remove, sl) { struct parq_ul_queued *puq = sl->data; parq_ul_queued_check(puq); @@ -2636,14 +2747,14 @@ if (enable_real_passive && parq_still_sharing(puq)) { hash_list_append(puq->queue->by_date_dead, puq); } else - parq_upload_free(sl->data); + parq_upload_free(puq); } /* * Recompute data only for the queues in which we removed items --RAM. */ - for (queues = ul_parqs; queues; queues = g_list_next(queues)) { + PLIST_FOREACH(ul_parqs, queues) { struct parq_ul_queue *q = queues->data; if (q->recompute) { @@ -2653,14 +2764,14 @@ } } - gm_slist_free_null(&to_remove); + pslist_free_null(&to_remove); /* * If the last queue is not active anymore (ie it should be removed * as soon as the queue is empty) and there are no more queued items * in the queue, remove the queue. */ - queues = g_list_last(ul_parqs); + queues = plist_last(ul_parqs); if (queues != NULL) { struct parq_ul_queue *queue = queues->data; @@ -2675,7 +2786,7 @@ /** * @return TRUE if parq cannot hold any more uploads. */ -gboolean +bool parq_upload_queue_full(struct upload *u) { struct parq_ul_queue *q; @@ -2694,6 +2805,8 @@ puq = hash_list_head(q->by_date_dead); + parq_ul_queued_check(puq); + if (GNET_PROPERTY(parq_debug) > 1) g_debug("PARQ UL: removing dead upload %s \"%s\" from %s", guid_hex_str(&puq->id), puq->name, @@ -2706,21 +2819,21 @@ /** * Whether the current upload is already queued. */ -gboolean +bool parq_upload_queued(struct upload *u) { - return parq_upload_lookup_position(u) != (guint) -1; + return parq_upload_lookup_position(u) != (uint) -1; } /** - * @return TRUE if the current upload will finish quickly enough and + * @return TRUE if the current upload will finish quickly enough and * actually scheduling would only cost more resources then it would * save. */ -static gboolean +static bool parq_upload_quick_continue(struct parq_ul_queued *puq) { - guint avg_bps; + uint avg_bps; filesize_t total; g_assert(puq); @@ -2767,7 +2880,7 @@ int surplus; int available; int result; - GList *l; + plist_t *l; /* * Since by definition "quick" uploads do not last for long, they do @@ -2804,7 +2917,7 @@ surplus = 0; - for (l = ul_parqs; l; l = g_list_next(l)) { + PLIST_FOREACH(ul_parqs, l) { struct parq_ul_queue *queue = l->data; int wanted = queue->alive - queue->active_uploads; @@ -2873,7 +2986,7 @@ static void parq_upload_freeze_all(struct parq_ul_queued *puq) { - GList *l; + plist_t *l; int frozen = 0; int extra = 0; @@ -2884,7 +2997,7 @@ g_debug("PARQ UL freezing entries for IP %s (has %d already)", host_addr_to_string(puq->by_addr->addr), puq->by_addr->frozen); - for (l = puq->by_addr->list; l; l = g_list_next(l)) { + PLIST_FOREACH(puq->by_addr->list, l) { struct parq_ul_queued *uqx = l->data; if (uqx->has_slot) { @@ -2911,7 +3024,7 @@ if (GNET_PROPERTY(parq_debug)) g_debug("PARQ UL froze %d entr%s for IP %s (%d total)", - extra, extra == 1 ? "y" : "ies", + extra, plural_y(extra), host_addr_to_string(puq->by_addr->addr), frozen); g_assert(puq->by_addr->frozen == frozen); @@ -2920,7 +3033,7 @@ * Recompute data only for the queues in which we removed items. */ - GM_LIST_FOREACH(ul_parqs, l) { + PLIST_FOREACH(ul_parqs, l) { struct parq_ul_queue *q = l->data; if (q->recompute) { @@ -2964,7 +3077,7 @@ static void parq_upload_unfreeze_all(struct parq_ul_queued *puq) { - GList *l; + plist_t *l; unsigned thawed = 0; unsigned inserted = 0; @@ -2975,7 +3088,7 @@ g_debug("PARQ UL thawing entries for IP %s (has %d)", host_addr_to_string(puq->by_addr->addr), puq->by_addr->frozen); - for (l = puq->by_addr->list; l; l = g_list_next(l)) { + PLIST_FOREACH(puq->by_addr->list, l) { struct parq_ul_queued *uqx = l->data; parq_ul_queued_check(uqx); @@ -3002,7 +3115,7 @@ if (GNET_PROPERTY(parq_debug)) g_debug("PARQ UL thawed %u entr%s for IP %s (%u of which alive)", - thawed, thawed == 1 ? "y" : "ies", + thawed, plural_y(thawed), host_addr_to_string(puq->by_addr->addr), inserted); g_assert(0 == puq->by_addr->frozen); @@ -3011,7 +3124,7 @@ * Recompute data only for the queues in which we inserted items. */ - GM_LIST_FOREACH(ul_parqs, l) { + PLIST_FOREACH(ul_parqs, l) { struct parq_ul_queue *q = l->data; if (q->recompute) { @@ -3041,7 +3154,7 @@ while (hash_list_iter_has_next(iter)) { struct parq_ul_queued *puq = hash_list_iter_next(iter); - + parq_ul_queued_check(puq); g_assert_log(puq->relative_position > old_relative, "relative=%u, old=%u", puq->relative_position, old_relative); @@ -3054,26 +3167,27 @@ break; g_debug("PARQ UL Q#%d pos=%u, rel=%u, slot<has=%s had=%s> updated=%s" - " active=%s, quick=%s, alive=%s", + " active=%s, quick=%s, alive=%s, flags=0x%x, ID=%s, expire=%s ", q->num, puq->position, puq->relative_position, puq->has_slot ? "y" : "n", puq->had_slot ? "y" : "n", compact_time(delta_time(tm_time(), puq->updated)), puq->active_queued ? "y" : "n", puq->quick ? "y" : "n", - puq->is_alive ? "y" : "n"); + puq->is_alive ? "y" : "n", puq->flags, guid_hex_str(&puq->id), + timestamp_utc_to_string(puq->expire)); } - + hash_list_iter_release(&iter); } /** * @return TRUE if the current upload is allowed to get an upload slot. */ -static gboolean +static bool parq_upload_continue(struct parq_ul_queued *puq) { - GList *l = NULL; + plist_t *l = NULL; int slots_free; - gboolean quick_allowed = FALSE; + bool quick_allowed = FALSE; g_assert(puq != NULL); /* @@ -3092,8 +3206,7 @@ g_debug("PARQ UL %s: " "frozen entry, IP %s has %d entr%s uploading (max %u)", G_STRFUNC, host_addr_to_string(puq->by_addr->addr), - puq->by_addr->uploading, - 1 == puq->by_addr->uploading ? "y" : "ies", + puq->by_addr->uploading, plural_y(puq->by_addr->uploading), GNET_PROPERTY(max_uploads_ip)); /* @@ -3138,7 +3251,7 @@ * less time to upload anyway, as they _must_ be smaller. */ - l = g_list_last(ul_parqs); + l = plist_last(ul_parqs); { struct parq_ul_queue *queue = l->data; if (!queue->active && queue->alive - queue->frozen > 0) { @@ -3205,18 +3318,18 @@ if (GNET_PROPERTY(uploads_stalling) && quick_allowed) { if (GNET_PROPERTY(parq_debug)) g_debug("PARQ UL #%d no quick upload of %ld bytes (stalling)", - puq->queue->num, (gulong) puq->chunk_size); + puq->queue->num, (ulong) puq->chunk_size); quick_allowed = FALSE; } if (quick_allowed) { if (GNET_PROPERTY(parq_debug)) g_debug("PARQ UL #%d allowed quick upload (%ld bytes)", - puq->queue->num, (gulong) puq->chunk_size); + puq->queue->num, (ulong) puq->chunk_size); parq_upload_unfreeze_one(puq); gnet_prop_incr_guint32(PROP_UL_QUICK_RUNNING); - gnet_stats_count_general(GNR_PARQ_QUICK_SLOTS_GRANTED, 1); + gnet_stats_inc_general(GNR_PARQ_QUICK_SLOTS_GRANTED); puq->quick = TRUE; return TRUE; } @@ -3336,7 +3449,7 @@ puq->position, puq->relative_position, puq->queue->by_position_length, - short_time(parq_upload_lookup_eta(u)), + short_time_ascii(parq_upload_lookup_eta(u)), host_addr_to_string(puq->remote_addr), puq->name, guid_hex_str(&puq->id)); } @@ -3347,6 +3460,7 @@ * Regardless of the amount of simultaneous upload slots a host can get, * a given PARQ ID can only be used once. */ + if (puq->u != NULL && puq->u != u) { if (GNET_PROPERTY(parq_debug)) { g_warning("PARQ UL Request from ip %s (%s), requested a new " @@ -3373,7 +3487,7 @@ */ if (puq->sha1 != u->sha1) - gnet_stats_count_general(GNR_PARQ_SLOT_RESOURCE_SWITCHING, 1); + gnet_stats_inc_general(GNR_PARQ_SLOT_RESOURCE_SWITCHING); /* * Update SHA-1 when they switch resources being asked. @@ -3431,7 +3545,7 @@ if (buf != NULL) { host_addr_t addr; - guint16 port; + uint16 port; /* * Update port / IP entries for other queued entries too. @@ -3445,9 +3559,9 @@ string_to_host_addr_port(buf, NULL, &addr, &port); if (host_is_valid(addr, port)) { - GList *l = NULL; + plist_t *l = NULL; - for (l = puq->by_addr->list; l != NULL; l = g_list_next(l)) { + PLIST_FOREACH(puq->by_addr->list, l) { struct parq_ul_queued *uq = l->data; uq->addr = addr; uq->port = port; @@ -3474,24 +3588,24 @@ * * @return TRUE if we can allow the request, FALSE if we detected abuse. */ -static gboolean +static bool parq_upload_abusing( struct upload *u, struct parq_ul_queued *puq, time_t now, time_t org_retry) { - gnet_stats_count_general(GNR_PARQ_RETRY_AFTER_VIOLATION, 1); + gnet_stats_inc_general(GNR_PARQ_RETRY_AFTER_VIOLATION); if ( delta_time(puq->ban_timeout, now) > 0 && GNET_PROPERTY(parq_ban_bad_maxcountwait) != 0 ) puq->ban_countwait++; - + if (GNET_PROPERTY(parq_debug)) g_warning("PARQ UL " "host %s (%s) re-requested \"%s\" too soon (%s early, warn #%u)", host_addr_port_to_string(u->socket->addr, u->socket->port), upload_vendor_str(u), - u->name, short_time(delta_time(org_retry, now)), + u->name, short_time_ascii(delta_time(org_retry, now)), puq->ban_countwait); if ( @@ -3503,14 +3617,14 @@ * queue now. */ - gnet_stats_count_general(GNR_PARQ_RETRY_AFTER_KICK_OUT, 1); + gnet_stats_inc_general(GNR_PARQ_RETRY_AFTER_KICK_OUT); if (GNET_PROPERTY(parq_debug)) g_warning( "PARQ UL " "punishing %s (%s) for re-requesting \"%s\" %s early %s", host_addr_port_to_string(u->socket->addr, u->socket->port), upload_vendor_str(u), - u->name, short_time(delta_time(org_retry, now)), + u->name, short_time_ascii(delta_time(org_retry, now)), guid_hex_str(&puq->id)); parq_add_banned_source(u->addr, delta_time(puq->retry, now)); @@ -3531,7 +3645,7 @@ * This function expects that the upload was checked with parq_upload_request * first. */ -gboolean +bool parq_upload_request_force(struct upload *u, struct parq_ul_queued *handle) { struct parq_ul_queued *puq = handle_to_queued(handle); @@ -3550,7 +3664,7 @@ if (u->status == GTA_UL_QUEUED) { u->status = GTA_UL_SENDING; } - gnet_stats_count_general(GNR_PARQ_SLOT_LIMIT_OVERRIDES, 1); + gnet_stats_inc_general(GNR_PARQ_SLOT_LIMIT_OVERRIDES); return TRUE; } else { return FALSE; @@ -3575,7 +3689,7 @@ * @return If the download may continue, TRUE is returned. FALSE otherwise * (which probably means the upload is queued). */ -gboolean +bool parq_upload_request(struct upload *u) { struct parq_ul_queued *puq; @@ -3645,7 +3759,7 @@ if (puq->flags & PARQ_UL_QUEUE_SENT) { puq->queue_sent = 0; puq->flags &= ~PARQ_UL_QUEUE_SENT; - gnet_stats_count_general(GNR_PARQ_QUEUE_FOLLOW_UPS, 1); + gnet_stats_inc_general(GNR_PARQ_QUEUE_FOLLOW_UPS); } /* @@ -3763,13 +3877,13 @@ } } else { enum fd_avail_status fds = fd_avail_status(); - gboolean queueable; - gboolean activeable = TRUE; - guint max_slot = parq_upload_active_size + + bool queueable; + bool activeable = TRUE; + uint max_slot = parq_upload_active_size + GNET_PROPERTY(max_uploads) / 2; - guint max_fd_used = + uint max_fd_used = GNET_PROPERTY(max_downloads) + - GNET_PROPERTY(max_uploads) + + GNET_PROPERTY(max_uploads) + (settings_is_leaf() ? GNET_PROPERTY(max_ultrapeers) : (GNET_PROPERTY(max_connections) + GNET_PROPERTY(max_leaves)) @@ -3922,7 +4036,7 @@ */ g_assert(puq->by_addr != NULL); - g_assert(host_addr_equal(puq->by_addr->addr, puq->remote_addr)); + g_assert(host_addr_equiv(puq->by_addr->addr, puq->remote_addr)); puq->has_slot = TRUE; puq->by_addr->uploading++; @@ -3987,8 +4101,8 @@ * @return TRUE if the download was totally removed. And the associated memory * was cleared. FALSE if the parq structure still exists. */ -gboolean -parq_upload_remove(struct upload *u, gboolean was_sending, gboolean was_running) +bool +parq_upload_remove(struct upload *u, bool was_sending, bool was_running) { time_t now = tm_time(); struct parq_ul_queued *puq = NULL; @@ -4007,14 +4121,6 @@ puq = parq_upload_find(u); /* - * If the status is still GTA_UL_QUEUE, then we got removed whilst - * attempting to connect to the remote server. - */ - - if (puq && u->status == GTA_UL_QUEUE) - parq_upload_send_queue_failed(puq); - - /* * If we can't find the PARQ entry, this is probably a cloned upload. * * If the upload mismatches, then it's probably an error like "Already @@ -4025,6 +4131,14 @@ if (puq == NULL || puq->u != u) return FALSE; + /* + * If the status is still GTA_UL_QUEUE, then we got removed whilst + * attempting to connect to the remote server. + */ + + if (GTA_UL_QUEUE == u->status) + parq_upload_send_queue_failed(puq); + if (puq->active_queued) parq_upload_clear_actively_queued(puq); @@ -4054,6 +4168,13 @@ else if (puq->flags & PARQ_UL_QUEUE_SENT) puq->queue_refused = 0; + /* + * Clear QUEUE-related flags, regardless of the outcome on remote servent. + */ + + if ((puq->flags & PARQ_UL_QUEUE) && !hash_list_contains(ul_parq_queue, puq)) + puq->flags &= ~PARQ_UL_QUEUE; + puq->flags &= ~PARQ_UL_QUEUE_SENT; /* @@ -4063,6 +4184,7 @@ * * XXX What's this encapsulation breaking? Needed? --RAM, 2007-08-17 */ + if ( u->status == GTA_UL_QUEUED && delta_time(u->last_update, now) > 0 @@ -4102,7 +4224,7 @@ g_assert(!(puq->flags & PARQ_UL_FROZEN)); g_assert(puq->by_addr != NULL); g_assert(puq->by_addr->uploading > 0); - g_assert(host_addr_equal(puq->by_addr->addr,puq->remote_addr)); + g_assert(host_addr_equiv(puq->by_addr->addr,puq->remote_addr)); puq->by_addr->uploading--; @@ -4117,12 +4239,25 @@ parq_ul_queued_check(puq_next); - if (!puq_next->has_slot) { - g_assert(puq_next->queue->active <= 1); - if (!(puq_next->flags & (PARQ_UL_QUEUE|PARQ_UL_NOQUEUE))) - parq_upload_register_send_queue(puq_next); - break; - } + if (puq_next->has_slot) + continue; + + /* + * Reach following entry in the waiting queue that has no uploading + * slot. If it is actively queued already, then we just have to + * wait for the planned retry. Otherwise, if we can send a QUEUE + * and there is none pending, let the host know that it's next + * in the line. + */ + + g_assert(puq_next->queue->active); /* Since puq->has_slot */ + + if ( + !(puq_next->flags & (PARQ_UL_QUEUE|PARQ_UL_NOQUEUE)) && + !puq_next->active_queued + ) + parq_upload_register_send_queue(puq_next); + break; } hash_list_iter_release(&iter); @@ -4232,29 +4367,29 @@ } static size_t -parq_upload_add_retry_after_header(char *buf, size_t size, guint d) +parq_upload_add_retry_after_header(char *buf, size_t size, uint d) { size_t len; len = concat_strings(buf, size, "Retry-After: ", uint32_to_string(d), "\r\n", - (void *) 0); + NULL_PTR); return len < size ? len : 0; } static size_t parq_upload_add_old_queue_header(char *buf, size_t size, - struct parq_ul_queued *puq, guint min_poll, guint max_poll, - gboolean small_reply) + struct parq_ul_queued *puq, uint min_poll, uint max_poll, + bool small_reply) { size_t len; if (small_reply) { - len = gm_snprintf(buf, size, + len = str_bprintf(buf, size, "X-Queue: position=%d, pollMin=%u, pollMax=%u\r\n", puq->relative_position, min_poll, max_poll); } else { - len = gm_snprintf(buf, size, + len = str_bprintf(buf, size, "X-Queue: position=%d, length=%d, " "limit=%d, pollMin=%u, pollMax=%u\r\n", puq->relative_position, puq->queue->by_position_length, @@ -4269,14 +4404,14 @@ static size_t parq_upload_add_x_queued_header(char *buf, size_t size, - struct parq_ul_queued *puq, guint max_poll, - gboolean small_reply, struct upload *u) + struct parq_ul_queued *puq, uint max_poll, + bool small_reply, struct upload *u) { size_t rw = 0, len; upload_check(u); - /* Reserve space for the trailing \r\n */ + /* Reserve space for the trailing \r\n */ if (sizeof "\r\n" >= size) return 0; size -= sizeof "\r\n"; @@ -4284,7 +4419,7 @@ len = concat_strings(&bufrw, size, "X-Queued: ID=", guid_hex_str(parq_upload_lookup_id(u)), /* No CRLF yet, we're still appending to this header */ - (void *) 0); + NULL_PTR); if (len < size) { rw += len; @@ -4294,7 +4429,7 @@ len = concat_strings(&bufrw, size, "; position=", uint32_to_string(puq->relative_position), - (void *) 0); + NULL_PTR); if (len < size) { rw += len; @@ -4303,20 +4438,20 @@ if (!small_reply) { len = concat_strings(&bufrw, size, "; lifetime=", uint32_to_string(max_poll), - (void *) 0); + NULL_PTR); if (len < size) { rw += len; size -= len; len = concat_strings(&bufrw, size, "; length=", uint32_to_string(puq->queue->by_position_length), - (void *) 0); + NULL_PTR); if (len < size) { rw += len; size -= len; len = concat_strings(&bufrw, size, "; ETA=", uint32_to_string(puq->eta), - (void *) 0); + NULL_PTR); if (len < size) { rw += len; size -= len; @@ -4328,7 +4463,7 @@ len = concat_strings(&bufrw, sizeof "\r\n", "\r\n", - (void *) 0); + NULL_PTR); rw += len; } return rw; @@ -4349,14 +4484,14 @@ * to make sure they do not re-request too soon. */ size_t -parq_upload_add_headers(char *buf, size_t size, gpointer arg, guint32 flags) +parq_upload_add_headers(char *buf, size_t size, void *arg, uint32 flags) { struct parq_ul_queued *puq; struct upload_http_cb *a = arg; struct upload *u = a->u; - gboolean small_reply; + bool small_reply; time_delta_t d; - guint min_poll, max_poll; + uint min_poll, max_poll; time_t now; size_t rw = 0; @@ -4364,7 +4499,7 @@ if (!parq_upload_queued(u)) return 0; - + puq = parq_upload_find(u); g_return_val_if_fail(puq, 0); @@ -4389,9 +4524,9 @@ max_poll = MAX(max_poll, min_poll); small_reply = 0 != (flags & HTTP_CBF_SMALL_REPLY); - + rw += parq_upload_add_retry_after_header(&bufrw, size - rw, min_poll); - + if ( puq->major == 0 && puq->minor == 1 && @@ -4399,7 +4534,7 @@ ) { rw += parq_upload_add_old_queue_header(&bufrw, size - rw, puq, min_poll, max_poll, small_reply); - } else { + } else { rw += parq_upload_add_x_queued_header(&bufrw, size - rw, puq, max_poll, small_reply, u); } @@ -4415,8 +4550,8 @@ * @return the amount of bytes written to `buf'. */ size_t -parq_upload_add_header_id(char *buf, size_t size, gpointer arg, - guint32 unused_flags) +parq_upload_add_header_id(char *buf, size_t size, void *arg, + uint32 unused_flags) { struct upload_http_cb *a = arg; struct upload *u = a->u; @@ -4445,7 +4580,7 @@ len = concat_strings(&bufrw, size, "X-Queued: ID=", guid_hex_str(parq_upload_lookup_id(u)), "\r\n", - (void *) 0); + NULL_PTR); if (len >= size) goto finish; @@ -4463,7 +4598,7 @@ /** * Determines whether the PARQ ID was already sent for an upload. */ -gboolean +bool parq_ul_id_sent(const struct upload *u) { struct parq_ul_queued *puq; @@ -4475,9 +4610,9 @@ /** * @return the current queueing position of an upload. Returns a value of - * (guint) -1 if not found. + * (uint) -1 if not found. */ -guint +uint parq_upload_lookup_position(const struct upload *u) { struct parq_ul_queued *puq; @@ -4488,7 +4623,7 @@ if (puq != NULL) { return puq->relative_position; } else { - return (guint) -1; + return (uint) -1; } } @@ -4508,7 +4643,7 @@ /** * @return the Estimated Time of Arrival for an upload slot for a given upload. */ -guint +uint parq_upload_lookup_eta(const struct upload *u) { struct parq_ul_queued *puq; @@ -4520,13 +4655,13 @@ if (puq != NULL) return puq->eta; else - return (guint) -1; + return (uint) -1; } /** * @return the current upload queue size of alive uploads. */ -guint +uint parq_upload_lookup_size(const struct upload *u) { struct parq_ul_queued *puq; @@ -4599,7 +4734,7 @@ /** * @return the queue number the current upload is queued in. */ -guint +uint parq_upload_lookup_queue_no(const struct upload *u) { struct parq_ul_queued *puq; @@ -4618,7 +4753,7 @@ /** * @return TRUE if the upload was allowed quickly by PARQ. */ -gboolean +bool parq_upload_lookup_quick(const struct upload *u) { struct parq_ul_queued *puq; @@ -4631,7 +4766,7 @@ /** * @return TRUE if the upload is frozen. */ -gboolean +bool parq_upload_lookup_frozen(const struct upload *u) { struct parq_ul_queued *puq; @@ -4659,12 +4794,7 @@ puq = parq_upload_find(u); - if (puq == NULL) { - g_warning("PARQ UL Did the upload got removed?"); - return; - } - - g_assert(puq != NULL); + g_return_unless(puq != NULL); /* * Send the QUEUE header. @@ -4672,7 +4802,7 @@ puq->flags &= ~PARQ_UL_QUEUE; - rw = gm_snprintf(queue, sizeof queue, "QUEUE %s %s\r\n", + rw = str_bprintf(queue, sizeof queue, "QUEUE %s %s\r\n", guid_hex_str(&puq->id), host_addr_port_to_string(listen_addr(), socket_listen_port())); @@ -4686,7 +4816,7 @@ } else if ((size_t) sent < rw) { g_warning("PARQ UL " "Only sent %lu out of %lu bytes of QUEUE for \"%s\" to %s", - (gulong) sent, (gulong) rw, u->name, + (ulong) sent, (ulong) rw, u->name, host_addr_port_to_string(s->addr, s->port)); } else if (GNET_PROPERTY(parq_debug) > 2) { g_debug("PARQ UL: Sent #%d to %s: %s", @@ -4705,23 +4835,23 @@ */ puq->flags |= PARQ_UL_QUEUE_SENT; - gnet_stats_count_general(GNR_PARQ_QUEUE_SENT, 1); + gnet_stats_inc_general(GNR_PARQ_QUEUE_SENT); expect_http_header(u, GTA_UL_QUEUE_WAITING); } /** * Saves an individual queued upload to disc. * - * This is the callback function used by g_list_foreach() in function + * This is the callback function used by plist_foreach() in function * parq_upload_save_queue(). */ static inline void -parq_store(gpointer data, gpointer file_ptr) +parq_store(void *data, void *file_ptr) { FILE *f = file_ptr; struct parq_ul_queued *puq = data; - char last_bufTIMESTAMP_BUF_LEN; - char enter_bufTIMESTAMP_BUF_LEN; + char last_bufTIMESTAMP_BUFLEN; + char enter_bufTIMESTAMP_BUFLEN; int expire; /* We are not saving uploads which already finished an upload */ @@ -4738,20 +4868,22 @@ } g_assert(NULL != f); - if (GNET_PROPERTY(parq_debug) > 5) - g_debug("PARQ UL Q %d/%d (%3d%3d/%3d): Saving ID: '%s' - %s '%s'", + if (GNET_PROPERTY(parq_debug) > 5) { + g_debug("PARQ UL Q %d/%d (%3d%3d/%3d): Saving %s: '%s' - %s '%s'", puq->queue->num, ul_parqs_cnt, puq->position, puq->relative_position, puq->queue->by_position_length, + puq->supports_parq ? "PARQ" : "slot", guid_hex_str(&puq->id), host_addr_to_string(puq->remote_addr), puq->name); + } timestamp_to_string_buf(puq->enter, enter_buf, sizeof enter_buf); timestamp_to_string_buf(puq->last_queue_sent, last_buf, sizeof last_buf); - + /* * Save all needed parq information. The ip and port information gathered * from X-Node is saved as XIP and XPORT @@ -4791,8 +4923,8 @@ fprintf(f, "SHA1: %s\n", sha1_base32(puq->sha1)); if (puq->supports_parq) - fprintf(f, "PARQ: \n"); /* No value needed, tag presence is enough */ - + fprintf(f, "PARQ:\n"); /* No value needed, tag presence is enough */ + if ( !(puq->flags & PARQ_UL_NOQUEUE) && puq->port != 0 && is_host_addr(puq->addr) @@ -4815,7 +4947,7 @@ FILE *f; file_path_t fp; time_t now = tm_time(); - GList *queues; + plist_t *queues; if (GNET_PROPERTY(parq_debug) > 3) g_debug("PARQ UL: trying to save all queue info"); @@ -4829,11 +4961,11 @@ fprintf(f, "# Saved on %s\n", timestamp_to_string(now)); for ( - queues = g_list_last(ul_parqs) ; queues != NULL; queues = queues->prev + queues = plist_last(ul_parqs) ; queues != NULL; queues = queues->prev ) { struct parq_ul_queue *queue = queues->data; - G_LIST_FOREACH_WITH_DATA(queue->by_position, parq_store, f); + PLIST_FOREACH_CALL_DATA(queue->by_position, parq_store, f); } file_config_close(f, &fp); @@ -4846,8 +4978,8 @@ /** * Callout queue periodic event to save PARQ queues. */ -static gboolean -parq_save_timer(gpointer unused_udata) +static bool +parq_save_timer(void *unused_udata) { (void) unused_udata; @@ -4855,9 +4987,9 @@ return TRUE; if (GNET_PROPERTY(parq_debug)) { - GList *l; + plist_t *l; - for (l = ul_parqs ; l != NULL; l = g_list_next(l)) { + PLIST_FOREACH(ul_parqs, l) { struct parq_ul_queue *q = l->data; g_debug("PARQ UL: Queue %d/%d contains %d items, " @@ -4894,13 +5026,10 @@ NUM_PARQ_TAGS } parq_tag_t; -static const struct parq_tag { - parq_tag_t tag; - const char *str; -} parq_tag_map = { +static const tokenizer_t parq_tags = { /* Must be sorted alphabetically for dichotomic search */ -#define PARQ_TAG(x) { CAT2(PARQ_TAG_,x), #x } +#define PARQ_TAG(x) { #x, CAT2(PARQ_TAG_,x) } PARQ_TAG(ENTERED), PARQ_TAG(EXPIRE), PARQ_TAG(GOT), @@ -4915,36 +5044,18 @@ PARQ_TAG(SHA1), PARQ_TAG(SIZE), PARQ_TAG(XIP), - PARQ_TAG(XPORT), + PARQ_TAG(XPORT), /* Above line intentionally left blank (for "!}sort" on vi) */ #undef PARQ_TAG }; - -/** - */ -static parq_tag_t +static inline parq_tag_t parq_string_to_tag(const char *s) { - STATIC_ASSERT(G_N_ELEMENTS(parq_tag_map) == (NUM_PARQ_TAGS - 1)); - -#define GET_ITEM(i) (parq_tag_map(i).str) -#define FOUND(i) G_STMT_START { \ - return parq_tag_map(i).tag; \ - /* NOTREACHED */ \ -} G_STMT_END - - /* Perform a binary search to find ``s'' */ - BINARY_SEARCH(const char *, s, G_N_ELEMENTS(parq_tag_map), strcmp, - GET_ITEM, FOUND); - -#undef FOUND -#undef GET_ITEM - return PARQ_TAG_UNKNOWN; + return TOKENIZE(s, parq_tags); } - typedef struct { const struct sha1 *sha1; filesize_t filesize; @@ -4974,23 +5085,23 @@ FILE *f; file_path_t fp1; char line4096; - gboolean next = FALSE; + bool next = FALSE; struct parq_ul_queued *puq; time_t now = tm_time(); - guint line_no = 0; - guint64 v; + uint line_no = 0; + uint64 v; int error; const char *endptr; bit_array_t tag_usedBIT_ARRAY_SIZE(NUM_PARQ_TAGS); - gboolean resync = FALSE; + bool resync = FALSE; file_path_set(fp, settings_config_dir(), file_parq_file); - f = file_config_open_read("PARQ upload queue data", fp, G_N_ELEMENTS(fp)); + f = file_config_open_read("PARQ upload queue data", fp, N_ITEMS(fp)); if (!f) return; if (GNET_PROPERTY(parq_debug)) - g_warning("PARQ UL loading queue information"); + g_debug("PARQ UL loading queue information"); /* Reset state */ entry = zero_entry; @@ -4999,7 +5110,7 @@ while (fgets(line, sizeof line, f)) { const char *tag_name, *value; char *colon; - gboolean damaged; + bool damaged; parq_tag_t tag; line_no++; @@ -5035,15 +5146,26 @@ *colon = '\0'; tag_name = line; value = &colon1; - if (*value != ' ') { - g_warning("%s(): missing space after colon in line %u", - G_STRFUNC, line_no); - break; + + /* + * Because of the file_line_chomp_tail() call above, a tag without + * value will not have any space after its name, regardless of whether + * it was emitted. Hence we must explicly check for empty values. + * --RAM, 2012-10-12 + */ + + if (*value) { + if (*value != ' ') { + g_warning("%s(): no space after colon, line %u for tag \"%s\"", + G_STRFUNC, line_no, tag_name); + break; + } + value++; /* skip blank after colon */ } - value++; /* skip blank after colon */ tag = parq_string_to_tag(tag_name); g_assert(UNSIGNED(tag) < NUM_PARQ_TAGS); + if (PARQ_TAG_UNKNOWN != tag && bit_array_get(tag_used, tag)) { g_warning("%s(): ignoring duplicate tag \"%s\" in entry in line %u", G_STRFUNC, tag_name, line_no); @@ -5059,8 +5181,9 @@ if (!string_to_host_addr(value, NULL, &addr)) { damaged = TRUE; - g_warning("tag \"%s\", line %u: not a valid IP address", - tag_name, line_no); + g_warning("%s(): tag \"%s\", line %u: " + "not a valid IP address", + G_STRFUNC, tag_name, line_no); } else { switch (tag) { case PARQ_TAG_IP: @@ -5094,10 +5217,10 @@ case PARQ_TAG_ENTERED: { time_t t; - + t = date2time(value, now); if (t != (time_t) -1) { - entry.entered = t; + entry.entered = t; } else { /* For backwards-compatibility accept a raw integer value */ v = parse_uint64(value, &endptr, 10, &error); @@ -5150,7 +5273,8 @@ { if (strlen(value) != SHA1_BASE32_SIZE) { damaged = TRUE; - g_warning("Value has wrong length."); + g_warning("%s(): SHA1 value has wrong length %zu", + G_STRFUNC, strlen(value)); } else { const struct sha1 *raw; @@ -5171,10 +5295,10 @@ case PARQ_TAG_LASTQUEUE: { time_t t; - + t = date2time(value, now); damaged |= t == (time_t) -1; - entry.last_queue_sent = t; + entry.last_queue_sent = t; } break; case PARQ_TAG_NAME: @@ -5198,9 +5322,9 @@ } if (damaged) { - g_warning("damaged PARQ entry in line %u: " + g_warning("%s(): damaged PARQ entry in line %u: " "tag_name=\"%s\", value=\"%s\"", - line_no, tag_name, value); + G_STRFUNC, line_no, tag_name, value); /* Reset state, discard current record */ next = FALSE; @@ -5249,11 +5373,11 @@ parq_upload_next_queue(entry.last_queue_sent, puq); /* During parq_upload_create already created an ID for us */ - g_hash_table_remove(ul_all_parq_by_id, &puq->id); + htable_remove(ul_all_parq_by_id, &puq->id); STATIC_ASSERT(sizeof entry.id == sizeof puq->id); memcpy(&puq->id, &entry.id, sizeof puq->id); - g_hash_table_insert(ul_all_parq_by_id, &puq->id, puq); + htable_insert(ul_all_parq_by_id, &puq->id, puq); if (GNET_PROPERTY(parq_debug) > 2) { g_debug("PARQ UL Q %d/%d (%3d%3d/%3d) ETA: %s " @@ -5263,7 +5387,7 @@ puq->position, puq->relative_position, puq->queue->by_position_length, - short_time(parq_upload_lookup_eta(fake_upload)), + short_time_ascii(parq_upload_lookup_eta(fake_upload)), host_addr_to_string(puq->remote_addr), puq->supports_parq ? " (PARQ)" : "", puq->name); @@ -5279,7 +5403,7 @@ /* Reset state */ entry = zero_entry; bit_array_clear_range(tag_used, 0, NUM_PARQ_TAGS - 1); - upload_free(&fake_upload); + upload_free(&fake_upload); } } @@ -5296,41 +5420,41 @@ g_assert(ht_banned_source != NULL); - banned = g_hash_table_lookup(ht_banned_source, &addr); + banned = hevset_lookup(ht_banned_source, &addr); return banned ? banned->expire : 0; } -gboolean +bool parq_is_enabled(void) { - return GNET_PROPERTY(parq_enabled); + return GNET_PROPERTY(parq_enabled) && !parq_closed; } /** * Initialises the upload queue for PARQ. */ -G_GNUC_COLD void +void G_COLD parq_init(void) { -#define bs_nop(x) (x) - - BINARY_ARRAY_SORTED(parq_tag_map, struct parq_tag, str, strcmp, bs_nop); - -#undef bs_nop + TOKENIZE_CHECK_SORTED(parq_tags); header_features_add(FEATURES_UPLOADS, "queue", PARQ_VERSION_MAJOR, PARQ_VERSION_MINOR); header_features_add(FEATURES_DOWNLOADS, "queue", PARQ_VERSION_MAJOR, PARQ_VERSION_MINOR); - ul_all_parq_by_addr_and_name = g_hash_table_new(g_str_hash, g_str_equal); - ul_all_parq_by_addr = g_hash_table_new(host_addr_hash_func, - host_addr_eq_func); - ul_all_parq_by_id = g_hash_table_new(guid_hash, guid_eq); - dl_all_parq_by_id = g_hash_table_new(g_str_hash, g_str_equal); - - ht_banned_source = g_hash_table_new(host_addr_hash_func, host_addr_eq_func); + ul_all_parq_by_addr_and_name = hikset_create( + offsetof(struct parq_ul_queued, addr_and_name), HASH_KEY_STRING, 0); + ul_all_parq_by_addr = hevset_create_any( + offsetof(struct parq_ul_queued_by_addr, addr), + host_addr_hash_func, host_addr_hash_func2, host_addr_eq_func); + ul_all_parq_by_id = htable_create(HASH_KEY_FIXED, GUID_RAW_SIZE); + dl_all_parq_by_id = htable_create(HASH_KEY_STRING, 0); + + ht_banned_source = hevset_create_any( + offsetof(struct parq_banned, addr), + host_addr_hash_func, host_addr_hash_func2, host_addr_eq_func); ul_parq_queue = hash_list_new(NULL, NULL); ul_queue_sent = aging_make(QUEUE_HOST_DELAY, host_addr_hash_func, host_addr_eq_func, wfree_host_addr); @@ -5355,11 +5479,11 @@ /** * Saves any queueing information and frees all memory used by PARQ. */ -G_GNUC_COLD void +void G_COLD parq_close_pre(void) { - GList *dl, *queues; - GSList *sl, *to_remove = NULL, *to_removeq = NULL; + plist_t *dl, *queues; + pslist_t *sl, *to_remove = NULL, *to_removeq = NULL; parq_shutdown = TRUE; @@ -5367,19 +5491,19 @@ cq_periodic_remove(&parq_dead_timer_ev); cq_periodic_remove(&parq_save_timer_ev); - for (dl = parq_banned_sources ; dl != NULL; dl = g_list_next(dl)) { + PLIST_FOREACH(parq_banned_sources, dl) { struct parq_banned *banned = dl->data; - to_remove = g_slist_prepend(to_remove, banned); + to_remove = pslist_prepend(to_remove, banned); } - for (sl = to_remove; sl != NULL; sl = g_slist_next(sl)) { + PSLIST_FOREACH(to_remove, sl) { struct parq_banned *banned = sl->data; parq_del_banned_source(banned->addr); } - gm_slist_free_null(&to_remove); + pslist_free_null(&to_remove); /* * First locate all queued items (dead or alive). And place them in the @@ -5388,7 +5512,7 @@ for (queues = ul_parqs; queues != NULL; queues = queues->next) { struct parq_ul_queue *queue = queues->data; - for (dl = queue->by_position; dl != NULL; dl = g_list_next(dl)) { + PLIST_FOREACH(queue->by_position, dl) { struct parq_ul_queued *puq = dl->data; if (puq == NULL) @@ -5396,19 +5520,19 @@ puq->by_addr->uploading = 0; - to_remove = g_slist_prepend(to_remove, puq); + to_remove = pslist_prepend(to_remove, puq); } - to_removeq = g_slist_prepend(to_removeq, queue); + to_removeq = pslist_prepend(to_removeq, queue); } /* Free all memory used by queued items */ - for (sl = to_remove; sl != NULL; sl = g_slist_next(sl)) + PSLIST_FOREACH(to_remove, sl) { parq_upload_free(sl->data); + } + pslist_free_null(&to_remove); - gm_slist_free_null(&to_remove); - - for (sl = to_removeq; sl != NULL; sl = g_slist_next(sl)) { + PSLIST_FOREACH(to_removeq, sl) { struct parq_ul_queue *queue = sl->data; /* @@ -5421,13 +5545,13 @@ parq_upload_free_queue(queue); } - gm_slist_free_null(&to_removeq); + pslist_free_null(&to_removeq); - gm_hash_table_destroy_null(&ul_all_parq_by_addr_and_name); - gm_hash_table_destroy_null(&ul_all_parq_by_addr); - gm_hash_table_destroy_null(&ul_all_parq_by_id); - gm_hash_table_destroy_null(&ht_banned_source); - gm_list_free_null(&parq_banned_sources); + hikset_free_null(&ul_all_parq_by_addr_and_name); + hevset_free_null(&ul_all_parq_by_addr); + htable_free_null(&ul_all_parq_by_id); + hevset_free_null(&ht_banned_source); + plist_free_null(&parq_banned_sources); hash_list_free(&ul_parq_queue); aging_destroy(&ul_queue_sent); @@ -5439,8 +5563,8 @@ void parq_close(void) { - g_hash_table_destroy(dl_all_parq_by_id); - dl_all_parq_by_id = NULL; + htable_free_null(&dl_all_parq_by_id); + parq_closed = TRUE; } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/parq.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/parq.h
Changed
@@ -44,6 +44,7 @@ #define PARQ_MAX_UL_RETRY_DELAY 1200 /**< 20 minutes retry rate max. */ #define PARQ_GRACE_TIME 90 /**< Grace period after life expired */ +#define PARQ_QUEUE_GRACE_TIME 60 /**< Extra grace if QUEUE pending */ /* * Public interface. @@ -66,39 +67,38 @@ void parq_dl_free(struct download *); void parq_download_retry_active_queued(struct download *); -gboolean parq_download_supports_parq(header_t *); -gboolean parq_download_parse_queue_status(struct download *, header_t *, guint); -gboolean parq_download_is_active_queued(const struct download *); +bool parq_download_supports_parq(header_t *); +bool parq_download_parse_queue_status(struct download *, header_t *, uint); +bool parq_download_is_active_queued(const struct download *); void parq_download_add_header(char *buf, size_t len, size_t *rw, struct download *); -gboolean parq_download_is_passive_queued(const struct download *); +bool parq_download_is_passive_queued(const struct download *); void parq_download_queue_ack(struct gnutella_socket *); void parq_upload_timer(time_t now); -size_t parq_upload_add_headers(char *buf, size_t size, - gpointer arg, guint32 flags); +size_t parq_upload_add_headers(char *buf, size_t size, void *arg, uint32 flags); size_t parq_upload_add_header_id(char *buf, size_t size, - gpointer arg, guint32 flags); + void *arg, uint32 flags); struct parq_ul_queued *parq_upload_get(struct upload *, const header_t *); -gboolean parq_upload_request(struct upload *); -gboolean parq_upload_request_force(struct upload *, struct parq_ul_queued *); -guint parq_upload_lookup_position(const struct upload *); +bool parq_upload_request(struct upload *); +bool parq_upload_request_force(struct upload *, struct parq_ul_queued *); +uint parq_upload_lookup_position(const struct upload *); const struct guid *parq_upload_lookup_id(const struct upload *); -gboolean parq_upload_queue_full(struct upload *); -guint parq_upload_lookup_size(const struct upload *); +bool parq_upload_queue_full(struct upload *); +uint parq_upload_lookup_size(const struct upload *); void parq_upload_update_downloaded(const struct upload *u); time_t parq_upload_lifetime(const struct upload *); time_t parq_upload_retry(const struct upload *); -guint parq_upload_lookup_eta(const struct upload *); -guint parq_upload_lookup_queue_no(const struct upload *); -gboolean parq_upload_lookup_quick(const struct upload *); -gboolean parq_upload_lookup_frozen(const struct upload *); +uint parq_upload_lookup_eta(const struct upload *); +uint parq_upload_lookup_queue_no(const struct upload *); +bool parq_upload_lookup_quick(const struct upload *); +bool parq_upload_lookup_frozen(const struct upload *); -gboolean parq_upload_queued(struct upload *); -gboolean parq_upload_remove(struct upload *, gboolean, gboolean); +bool parq_upload_queued(struct upload *); +bool parq_upload_remove(struct upload *, bool, bool); void parq_upload_collect_stats(const struct upload *); void parq_upload_upload_got_freed(struct upload *); void parq_upload_upload_got_cloned(struct upload *u, struct upload *cu); @@ -107,9 +107,9 @@ void parq_upload_busy(struct upload *, struct parq_ul_queued *); void parq_upload_send_queue_conf(struct upload *); -gboolean parq_ul_id_sent(const struct upload *); +bool parq_ul_id_sent(const struct upload *); time_t parq_banned_source_expire(const host_addr_t); -gboolean parq_is_enabled(void); +bool parq_is_enabled(void); #endif /* _core_parq_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/pcache.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/pcache.c
Changed
@@ -33,6 +33,10 @@ #include "common.h" +#include "pcache.h" + +#include "gtk-gnutella.h" /* For GTA_VENDOR_CODE */ + #include "alive.h" #include "extensions.h" #include "ggep.h" @@ -44,18 +48,17 @@ #include "hostiles.h" #include "hosts.h" #include "inet.h" +#include "ipp_cache.h" #include "ipv6-ready.h" #include "nodes.h" -#include "pcache.h" #include "routing.h" +#include "search.h" /* For search_query_key_generate() */ #include "settings.h" #include "share.h" /* For shared_files_scanned() and shared_kbytes_scanned(). */ #include "sockets.h" -#include "ipp_cache.h" #include "udp.h" #include "uhc.h" #include "version.h" -#include "search.h" /* For search_query_key_generate() */ #include "if/gnet_property_priv.h" #include "if/dht/kademlia.h" @@ -66,26 +69,33 @@ #include "lib/endian.h" #include "lib/glib-missing.h" #include "lib/gnet_host.h" +#include "lib/hashing.h" +#include "lib/hset.h" #include "lib/nid.h" +#include "lib/plist.h" #include "lib/pow2.h" +#include "lib/pslist.h" #include "lib/random.h" #include "lib/sectoken.h" +#include "lib/stringify.h" /* For plural() */ #include "lib/tm.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ #define PCACHE_MAX_FILES 10000000 /**< Arbitrarily large file count */ #define PCACHE_UHC_MAX_IP 30 /**< Max amount of IP:port returned */ #define PCACHE_DHT_MAX_IP 10 /**< Max amount of IP:port returned */ +#define PCACHE_TRANSIENT 60 /**< Once every minute */ /** * Basic pong information. */ struct pong_info { host_addr_t addr; /**< Values from the pong message */ - guint32 port; - guint32 files_count; - guint32 kbytes_count; + uint32 port; + uint32 files_count; + uint32 kbytes_count; }; enum ping_flag { @@ -132,15 +142,15 @@ * Sends a ping to given node. */ static void -send_ping(struct gnutella_node *n, guint8 ttl) +send_ping(gnutella_node_t *n, uint8 ttl) { gnutella_msg_init_t *m; - guint32 size; + uint32 size; node_check(n); g_assert(!NODE_IS_UDP(n)); - STATIC_ASSERT(23 == sizeof *m); + STATIC_ASSERT(GTA_HEADER_SIZE == sizeof *m); m = build_ping_msg(NULL, ttl, FALSE, &size); if (NODE_IS_WRITABLE(n)) { @@ -162,19 +172,19 @@ * @return pointer to static data, and the size of the message in `size'. */ gnutella_msg_init_t * -build_ping_msg(const struct guid *muid, guint8 ttl, gboolean uhc, guint32 *size) +build_ping_msg(const struct guid *muid, uint8 ttl, bool uhc, uint32 *size) { static union { gnutella_msg_init_t s; char buf256; - guint64 align8; + uint64 align8; } msg_init; gnutella_msg_init_t *m = &msg_init.s; - guint32 sz; + uint32 sz; g_assert(ttl); STATIC_ASSERT(sizeof *m <= sizeof msg_init.buf); - STATIC_ASSERT(23 == sizeof *m); + STATIC_ASSERT(GTA_HEADER_SIZE == sizeof *m); if (muid) gnutella_header_set_muid(m, muid); @@ -194,14 +204,14 @@ */ if (uhc || ttl > 1) { - guchar *ggep; + uchar *ggep; ggep_stream_t gs; - gboolean ok; + bool ok; char spp; - ggep = cast_to_gpointer(&m1); + ggep = cast_to_pointer(&m1); ggep_stream_init(&gs, ggep, sizeof msg_init.buf - sizeof *m); - + spp = settings_is_leaf() ? 0 : SCP_F_ULTRA; spp |= tls_enabled() ? SCP_F_TLS : 0; @@ -261,25 +271,24 @@ * @return pointer to static data, and the size of the message in `size'. */ gnutella_msg_init_t * -build_guess_ping_msg(const struct guid *muid, - gboolean qk, gboolean intro, gboolean scp, - guint32 *size) +build_guess_ping_msg(const struct guid *muid, bool qk, bool intro, bool scp, + uint32 *size) { static union { gnutella_msg_init_t s; char buf256; - guint64 align8; + uint64 align8; } msg_init; gnutella_msg_init_t *m = &msg_init.s; - guint32 sz; - guchar *ggep; + uint32 sz; + uchar *ggep; ggep_stream_t gs; - gboolean ok; + bool ok; g_assert(qk || intro); STATIC_ASSERT(sizeof *m <= sizeof msg_init.buf); - STATIC_ASSERT(23 == sizeof *m); + STATIC_ASSERT(GTA_HEADER_SIZE == sizeof *m); if (muid) gnutella_header_set_muid(m, muid); @@ -291,7 +300,7 @@ gnutella_header_set_hops(m, 0); sz = 0; /* Payload size if no extensions */ - ggep = cast_to_gpointer(&m1); + ggep = cast_to_pointer(&m1); ggep_stream_init(&gs, ggep, sizeof msg_init.buf - sizeof *m); if (scp) { @@ -358,30 +367,60 @@ } /** + * Are we missing node connections? + */ +static bool +pcache_node_missing(void) +{ + if (node_missing() != 0) + return TRUE; + + return settings_is_ultra() && node_leaves_missing() != 0; +} + +/** + * Should we answer a ping? + */ +static bool +pcache_can_answer_ping(void) +{ + /* + * When we (think we) are firewalled, there is a period when we can answer + * pings to make sure we can receive incoming connections. This logic + * is held in inet_can_answer_ping(), and we must ensure we're calling it + * when we are flagged as firewalled, regardless of whether we miss + * Gnutella connections. + */ + + return (GNET_PROPERTY(is_firewalled) || pcache_node_missing()) && + inet_can_answer_ping(); +} + +/** * Build pong message. * * @return pointer to static data, and the size of the message in `size'. */ static gnutella_msg_init_response_t * -build_pong_msg(host_addr_t sender_addr, guint16 sender_port, - guint8 hops, guint8 ttl, const struct guid *muid, +build_pong_msg(host_addr_t sender_addr, uint16 sender_port, + uint8 hops, uint8 ttl, const struct guid *muid, struct pong_info *info, pong_meta_t *meta, enum ping_flag flags, - guint32 *size) + uint32 *size) { static union { gnutella_msg_init_response_t s; char buf1024; - guint64 align8; + uint64 align8; } msg_pong; gnutella_msg_init_response_t *pong = &msg_pong.s; ggep_stream_t gs; - guchar *ggep; - guint32 sz; - guint32 ipv4; - gboolean ipv6_included = FALSE; + uchar *ggep; + uint32 sz; + uint32 ipv4; + bool ipv6_included = FALSE; STATIC_ASSERT(37 == sizeof *pong); - ggep = cast_to_gpointer(&pong1); + ggep = cast_to_pointer(&pong1); { gnutella_header_t *header = gnutella_msg_init_response_header(pong); @@ -438,7 +477,7 @@ if (meta->flags & PONG_META_HAS_GUE) { /* GUESS support */ ggep_stream_pack(&gs, GGEP_NAME(GUE), - cast_to_gpointer(&meta->guess), 1, 0); + cast_to_pointer(&meta->guess), 1, 0); } if (meta->flags & PONG_META_HAS_UP) { /* Ultrapeer info */ @@ -450,7 +489,7 @@ } if (meta->flags & PONG_META_HAS_LOC) { /* Locale preferencing */ - gboolean ok; + bool ok; ok = ggep_stream_begin(&gs, GGEP_NAME(LOC), 0) && ggep_stream_write(&gs, meta->language, 2); @@ -463,11 +502,11 @@ } if (meta->flags & PONG_META_HAS_DU) { /* Daily average uptime */ - char uptimesizeof(guint64); - guint32 value = MIN(meta->daily_uptime, 86400); - guint len; + char uptimesizeof(uint64); + uint32 value = MIN(meta->daily_uptime, 86400); + uint len; - len = ggept_du_encode(value, uptime); + len = ggept_du_encode(value, uptime, sizeof uptime); ggep_stream_pack(&gs, GGEP_NAME(DU), uptime, len, 0); } @@ -523,10 +562,22 @@ */ if (GNET_PROPERTY(enable_guess) && (flags & (PING_F_QK | PING_F_GUE))) { - hcount = guess_fill_caught_array(net, host, PCACHE_UHC_MAX_IP); - } else { - hcount = hcache_fill_caught_array(net, HOST_ULTRA, + hcount = guess_fill_caught_array(net, TRUE, host, PCACHE_UHC_MAX_IP); + } else { + hcount = node_fill_ultra(net, host, PCACHE_UHC_MAX_IP); + + /* + * If we are missing node connections, be sure to include + * ourselves in the list, replacing a random node from the + * returned set. + */ + + if (pcache_can_answer_ping()) { + uint idx = hcount != 0 ? random_value(hcount - 1) : 0; + gnet_host_set(&hostidx, + listen_addr_primary(), socket_listen_port()); + } } if (hcount > 0) { @@ -540,7 +591,7 @@ gnet_host_set(&evec0, info->addr, info->port); gnet_host_set(&evec1, sender_addr, sender_port); - ggept_ipp_pack(&gs, host, hcount, evec, G_N_ELEMENTS(evec), + ggept_ipp_pack(&gs, host, hcount, evec, N_ITEMS(evec), flags & PING_F_IPV6, flags & PING_F_NO_IPV4); } } @@ -557,7 +608,7 @@ gnet_host_t hostPCACHE_DHT_MAX_IP; int hcount; - hcount = dht_fill_random(host, G_N_ELEMENTS(host)); + hcount = dht_fill_random(host, N_ITEMS(host)); if (hcount > 0) { ggept_dhtipp_pack(&gs, host, hcount, @@ -576,7 +627,7 @@ */ if (flags & PING_F_IP) { - char ip_port18; + char ip_port18; /* Big enough for IPv6 + port */ size_t len; /* IP + Port (not UHC IPP!)*/ @@ -618,12 +669,12 @@ */ static void send_pong( - struct gnutella_node *n, gboolean control, enum ping_flag flags, - guint8 hops, guint8 ttl, const struct guid *muid, + gnutella_node_t *n, bool control, enum ping_flag flags, + uint8 hops, uint8 ttl, const struct guid *muid, struct pong_info *info, pong_meta_t *meta) { gnutella_msg_init_response_t *r; - guint32 size; + uint32 size; g_assert(ttl >= 1); @@ -636,12 +687,15 @@ */ r = build_pong_msg(n->addr, n->port, hops, ttl, muid, info, - control ? NULL : meta, flags, &size); + meta, flags, &size); n->n_pong_sent++; - if (NODE_IS_UDP(n)) - udp_send_msg(n, r, size); - else if (control) + if (NODE_IS_UDP(n)) { + if (control) + udp_ctrl_send_msg(n, r, size); + else + udp_send_msg(n, r, size); + } else if (control) gmsg_ctrl_sendto_one(n, r, size); else gmsg_sendto_one(n, r, size); @@ -661,14 +715,16 @@ { int i; enum ping_flag flags = PING_F_NONE; - gboolean has_gue = FALSE; - gboolean has_scp = FALSE; + bool has_gue = FALSE; + bool has_scp = FALSE; for (i = 0; i < n->extcount; i++) { const extvec_t *e = &n->extveci; switch (e->ext_token) { case EXT_T_GGEP_SCP: + has_scp = TRUE; + /* * Look whether they want leaf slots, ultra slots, or don't care. * Also determine which IP addresses they want. @@ -676,8 +732,8 @@ /* Accept only the first SCP, just in case there are multiple */ if (!(flags & PING_F_UHC) && ext_paylen(e) >= 1) { - const guchar *payload = ext_payload(e); - guint8 mask = payload0; + const uchar *payload = ext_payload(e); + uint8 mask = payload0; flags |= (mask & SCP_F_ULTRA) ? PING_F_UHC_ULTRA : PING_F_UHC_LEAF; flags |= (mask & SCP_F_IPV6) ? PING_F_IPV6 : 0; @@ -697,6 +753,13 @@ 1 == gnutella_header_get_ttl(&n->header) && 0 == ext_paylen(e) ) { + /* + * Remote host wants to know its IP and port, as seen within + * the UDP datagram. This is useful to firewalled node who + * want to initiate a firewalled-to-firewalled connection + * via RUDP and need to communicate their external (possibly + * NAT-ed) UDP port. + */ flags |= PING_F_IP; } break; @@ -704,8 +767,8 @@ case EXT_T_GGEP_DHTIPP: /* Accept only the first DHTIPP, just in case there are multiple */ if (ext_paylen(e) >= 1 && !(flags & PING_F_DHTIPP)) { - const guchar *payload = ext_payload(e); - guint8 mask = payload0; + const uchar *payload = ext_payload(e); + uint8 mask = payload0; flags |= (mask & SCP_F_IPV6) ? PING_F_IPV6 : 0; flags |= (mask & SCP_F_NO_IPV4) ? PING_F_NO_IPV4 : 0; } @@ -757,34 +820,34 @@ * the header of the node structure to construct the TTL of the pong we * send. * - * If `control' is true, send it as a higher priority message. - * If `uhc' is not UHC_NONE, we'll send IPs in a packed IPP reply. + * @param n destination node, where to send the pong + * @param control if TRUE, send it as a higher priority message. + * @param flags description of the ping we got */ static void -send_personal_info(struct gnutella_node *n, gboolean control, - enum ping_flag flags) +send_personal_info(gnutella_node_t *n, bool control, enum ping_flag flags) { - guint32 kbytes; - guint32 files; + uint32 kbytes; + uint32 files; struct pong_info info; - guint32 ip_uptime; - guint32 avg_uptime; + uint32 ip_uptime; + uint32 avg_uptime; /* Replying to a ping */ g_assert(gnutella_header_get_function(&n->header) == GTA_MSG_INIT); - files = MIN(shared_files_scanned(), ~((guint32) 0U)); + files = MIN(shared_files_scanned(), ~((uint32) 0U)); /* * Mark pong if we are an ultra node: the amount of kbytes scanned must * be an exact power of two, and at minimum 8. */ - kbytes = MIN(shared_kbytes_scanned(), ~((guint32) 0U)); + kbytes = MIN(shared_kbytes_scanned(), ~((uint32) 0U)); if (settings_is_ultra()) { - guint32 next, prev; - + uint32 next, prev; + next = next_pow2(kbytes); prev = next / 2; /* Pick power of 2 which is closest to the actual value. */ @@ -841,11 +904,6 @@ } } - if ((flags & PING_F_IP)) { - local_meta.sender_addr = n->addr; - local_meta.sender_port = n->port; - } - /* * IPv6-Ready: * We're supplying the IPv6 address when running both IPv4 and IPv6. @@ -885,9 +943,9 @@ * Send a pong for each of our connected neighbours to specified node. */ static void -send_neighbouring_info(struct gnutella_node *n) +send_neighbouring_info(gnutella_node_t *n) { - const GSList *sl; + const pslist_t *sl; /* Replying to a ping */ g_assert(gnutella_header_get_function(&n->header) == GTA_MSG_INIT); @@ -895,8 +953,8 @@ g_assert(gnutella_header_get_hops(&n->header) == 0); g_assert(gnutella_header_get_ttl(&n->header) == 2); /* "Crawler" ping */ - for (sl = node_all_ultranodes(); sl; sl = g_slist_next(sl)) { - struct gnutella_node *cn = sl->data; + PSLIST_FOREACH(node_all_ultranodes(), sl) { + gnutella_node_t *cn = sl->data; struct pong_info info; if (!NODE_IS_WRITABLE(cn)) @@ -940,6 +998,18 @@ if (!NODE_IS_CONNECTED(n)) return; + + /* + * Careful with transient nodes, their lifetime is reduced so don't + * waste too much banwdwidth with them. + * --RAM, 2012-01-15 + */ + + if (NODE_IS_TRANSIENT(n)) { + unsigned pcnt = NODE_TX_COMPRESSED(n) ? 10 : 2; + if (random_value(99) < pcnt || node_above_low_watermark(n)) + break; + } } } @@ -951,20 +1021,24 @@ * When the query key was not good, send back a new query key in the pong. */ void -pcache_guess_acknowledge(struct gnutella_node *n, - gboolean good_query_key, gboolean wants_ipp, host_net_t net) +pcache_guess_acknowledge(gnutella_node_t *n, + bool good_query_key, bool wants_ipp, host_net_t net) { struct pong_info info; pong_meta_t meta; - gnet_host_t host2 + PCACHE_UHC_MAX_IP; + gnet_host_t host2; int hcount; int flags = PING_F_NONE; node_check(n); g_assert(NODE_IS_UDP(n)); - hcount = guess_fill_caught_array(net, host, - wants_ipp ? G_N_ELEMENTS(host) : 2); + /* + * We request more than one host to make sure we include an address + * for a host different from the one sending us the message. + */ + + hcount = guess_fill_caught_array(net, FALSE, host, N_ITEMS(host)); meta.guess = (SEARCH_GUESS_MAJOR << 4) | SEARCH_GUESS_MINOR; meta.flags = PONG_META_HAS_GUE; @@ -986,9 +1060,9 @@ info.addr = gnet_host_get_addr(h); info.port = gnet_host_get_port(h); - if (info.port == n->port && host_addr_equal(info.addr, n->addr)) + if (info.port == n->port && host_addr_equiv(info.addr, n->addr)) continue; /* Don't send pong for the host contacting us */ - + goto send_pong; } } @@ -1004,12 +1078,17 @@ /* FALL THROUGH */ send_pong: - send_pong(n, FALSE, flags, + /* + * GUESS acknowledgments are sent as "control" messages to make sure + * querying hosts get them quickly. + */ + + send_pong(n, TRUE, flags, 1, 1, gnutella_header_get_muid(&n->header), &info, &meta); /* hops = 1, TTL = 1 */ if (GNET_PROPERTY(guess_server_debug) > 10) { - g_debug("GUESS %s query %s from %s with %spong listing %s:%u%s", + g_debug("GUESS %s query #%s from %s with %spong listing %s:%u%s", good_query_key ? "acknowledged" : "refused", guid_hex_str(gnutella_header_get_muid(&n->header)), node_infostr(n), good_query_key ? "" : "new query key and ", @@ -1046,15 +1125,15 @@ struct cache_line { /**< A cache line for a given hop value */ int hops; /**< Hop count of this cache line */ - GSList *pongs; /**< List of cached_pong */ - GSList *cursor; /**< Cursor within list: last item traversed */ + pslist_t *pongs; /**< List of cached_pong */ + pslist_t *cursor; /**< Cursor within list: last item traversed */ }; struct recent { - GHashTable *ht_recent_pongs; /**< Recent pongs we know about */ - GList *recent_pongs; /**< Recent pongs we got */ - GList *last_returned_pong; /**< Last returned from list */ - int recent_pong_count; /**< # of pongs in recent list */ + hset_t *hs_recent_pongs; /**< Recent pongs we know about */ + plist_t *recent_pongs; /**< Recent pongs we got */ + plist_t *last_returned_pong;/**< Last returned from list */ + int recent_pong_count; /**< # of pongs in recent list */ }; #define PONG_CACHE_SIZE (MAX_CACHE_HOPS+1) @@ -1080,30 +1159,30 @@ * cached_pong_hash * cached_pong_eq * - * Callbacks for the `ht_recent_pongs' hash table. + * Callbacks for the `hs_recent_pongs' hash set. */ -static guint -cached_pong_hash(gconstpointer key) +static uint +cached_pong_hash(const void *key) { const struct cached_pong *cp = key; - return host_addr_hash(cp->info.addr) ^ - ((cp->info.port << 16) | cp->info.port); + return host_addr_port_hash(cp->info.addr, cp->info.port); } + static int -cached_pong_eq(gconstpointer v1, gconstpointer v2) +cached_pong_eq(const void *v1, const void *v2) { const struct cached_pong *h1 = v1, *h2 = v2; - return host_addr_equal(h1->info.addr, h2->info.addr) && + return host_addr_equiv(h1->info.addr, h2->info.addr) && h1->info.port == h2->info.port; } /** * Initialization. */ -G_GNUC_COLD void +void G_COLD pcache_init(void) { int h; @@ -1125,7 +1204,7 @@ */ local_meta.flags = PONG_META_HAS_VC | PONG_META_HAS_DU; - memcpy(local_meta.vendor, "GTKG", 4); + memcpy(local_meta.vendor, GTA_VENDOR_CODE, 4); local_meta.version_ua = version_get_code(); local_meta.version_up = 0x2; /* X-Query-Routing: 0.2 */ @@ -1193,11 +1272,11 @@ for (h = 0; h < PONG_CACHE_SIZE; h++) pong_cacheh.hops = h; - recent_pongsHOST_ANY.ht_recent_pongs = - g_hash_table_new(cached_pong_hash, cached_pong_eq); + recent_pongsHOST_ANY.hs_recent_pongs = + hset_create_any(cached_pong_hash, NULL, cached_pong_eq); - recent_pongsHOST_ULTRA.ht_recent_pongs = - g_hash_table_new(cached_pong_hash, cached_pong_eq); + recent_pongsHOST_ULTRA.hs_recent_pongs = + hset_create_any(cached_pong_hash, NULL, cached_pong_eq); } /** @@ -1233,16 +1312,16 @@ * XXX demultiplexing logic? * XXX --RAM, 2008-03-11 */ -gboolean -pcache_get_recent(host_type_t type, host_addr_t *addr, guint16 *port) +bool +pcache_get_recent(host_type_t type, host_addr_t *addr, uint16 *port) { static host_addr_t last_addr; - static guint16 last_port = 0; - GList *l; + static uint16 last_port = 0; + plist_t *l; struct cached_pong *cp; struct recent *rec; - g_assert((guint) type < HOST_MAX); + g_assert((uint) type < HOST_MAX); rec = &recent_pongstype; @@ -1259,24 +1338,24 @@ */ if (rec->last_returned_pong == NULL) { - l = g_list_first(rec->recent_pongs); + l = plist_first(rec->recent_pongs); cp = l->data; if ( - !host_addr_equal(cp->info.addr, last_addr) || + !host_addr_equiv(cp->info.addr, last_addr) || cp->info.port != last_port ) goto found; - if (g_list_next(l) == NULL) /* Head is the only item in list */ + if (plist_next(l) == NULL) /* Head is the only item in list */ return FALSE; } else { /* Regular case */ - l = g_list_previous(rec->last_returned_pong); - for (/* empty */ ; l; l = g_list_previous(l)) { + l = plist_prev(rec->last_returned_pong); + for (/* empty */ ; l; l = plist_prev(l)) { cp = l->data; if ( - !host_addr_equal(cp->info.addr, last_addr) || + !host_addr_equiv(cp->info.addr, last_addr) || cp->info.port != last_port ) goto found; @@ -1287,10 +1366,10 @@ * Still none found, go back to the end of the list. */ - for (l = g_list_last(rec->recent_pongs); l; l = g_list_previous(l)) { + for (l = plist_last(rec->recent_pongs); l; l = plist_prev(l)) { cp = l->data; if ( - !host_addr_equal(cp->info.addr, last_addr) || + !host_addr_equiv(cp->info.addr, last_addr) || cp->info.port != last_port ) goto found; @@ -1326,30 +1405,29 @@ if ( !host_is_valid(cp->info.addr, cp->info.port) || - (NULL != g_hash_table_lookup( - rec->ht_recent_pongs, (gconstpointer) cp)) || + hset_contains(rec->hs_recent_pongs, cp) || hcache_node_is_bad(cp->info.addr) ) { return; } if (rec->recent_pong_count == RECENT_PING_SIZE) { /* Full */ - GList *lnk = g_list_last(rec->recent_pongs); + plist_t *lnk = plist_last(rec->recent_pongs); struct cached_pong *p = lnk->data; - rec->recent_pongs = g_list_remove_link(rec->recent_pongs, lnk); - g_hash_table_remove(rec->ht_recent_pongs, p); + rec->recent_pongs = plist_remove_link(rec->recent_pongs, lnk); + hset_remove(rec->hs_recent_pongs, p); if (lnk == rec->last_returned_pong) - rec->last_returned_pong = g_list_previous(rec->last_returned_pong); + rec->last_returned_pong = plist_prev(rec->last_returned_pong); free_cached_pong(p); - g_list_free_1(lnk); + plist_free_1(lnk); } else rec->recent_pong_count++; - rec->recent_pongs = g_list_prepend(rec->recent_pongs, cp); - g_hash_table_insert(rec->ht_recent_pongs, cp, GUINT_TO_POINTER(1)); + rec->recent_pongs = plist_prepend(rec->recent_pongs, cp); + hset_insert(rec->hs_recent_pongs, cp); cp->refcount++; /* We don't refcount insertion in the hash table */ } @@ -1359,7 +1437,7 @@ static host_type_t pong_type(gnutella_init_response_t *pong) { - guint32 kbytes; + uint32 kbytes; kbytes = gnutella_init_response_get_kbytes_count(pong); @@ -1377,21 +1455,21 @@ void pcache_clear_recent(host_type_t type) { - GList *l; + plist_t *l; struct recent *rec; g_assert(UNSIGNED(type) < HOST_MAX); rec = &recent_pongstype; - for (l = rec->recent_pongs; l; l = g_list_next(l)) { + PLIST_FOREACH(rec->recent_pongs, l) { struct cached_pong *cp = l->data; - g_hash_table_remove(rec->ht_recent_pongs, cp); + hset_remove(rec->hs_recent_pongs, cp); free_cached_pong(cp); } - gm_list_free_null(&rec->recent_pongs); + plist_free_null(&rec->recent_pongs); rec->last_returned_pong = NULL; rec->recent_pong_count = 0; } @@ -1406,7 +1484,7 @@ * - Otherwise, send a handshaking ping with TTL=1 */ void -pcache_outgoing_connection(struct gnutella_node *n) +pcache_outgoing_connection(gnutella_node_t *n) { g_assert(NODE_IS_CONNECTED(n)); @@ -1425,7 +1503,7 @@ * not sending an UHC ping). */ void -pcache_collect_dht_hosts(struct gnutella_node *n) +pcache_collect_dht_hosts(gnutella_node_t *n) { g_assert(NODE_IS_CONNECTED(n)); @@ -1443,37 +1521,37 @@ for (i = 0; i < PONG_CACHE_SIZE; i++) { struct cache_line *cl = &pong_cachei; - GSList *sl; + pslist_t *sl; - for (sl = cl->pongs; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(cl->pongs, sl) { entries++; free_cached_pong(sl->data); } - gm_slist_free_null(&cl->pongs); + pslist_free_null(&cl->pongs); cl->cursor = NULL; } if (GNET_PROPERTY(pcache_debug) > 4) g_debug("Pong CACHE expired (%d entr%s, %d in reserve)", - entries, entries == 1 ? "y" : "ies", hcache_size(HOST_ANY)); + entries, plural_y(entries), hcache_size(HOST_ANY)); } /** * Final shutdown. */ -G_GNUC_COLD void +void G_COLD pcache_close(void) { static host_type_t types = { HOST_ANY, HOST_ULTRA }; - guint i; + uint i; pcache_expire(); - for (i = 0; i < G_N_ELEMENTS(types); i++) { + for (i = 0; i < N_ITEMS(types); i++) { host_type_t type = typesi; pcache_clear_recent(type); - gm_hash_table_destroy_null(&recent_pongstype.ht_recent_pongs); + hset_free_null(&recent_pongstype.hs_recent_pongs); } aging_destroy(&udp_pings); @@ -1487,9 +1565,9 @@ void ping_all_neighbours(void) { - const GSList *sl; - GSList *may_ping = NULL; - GSList *to_ping = NULL; + const pslist_t *sl; + pslist_t *may_ping = NULL; + pslist_t *to_ping = NULL; int ping_cnt = 0; int selected = 0; int left; @@ -1509,8 +1587,8 @@ * --RAM, 12/01/2004 */ - for (sl = node_all_ultranodes(); sl; sl = g_slist_next(sl)) { - struct gnutella_node *n = sl->data; + PSLIST_FOREACH(node_all_ultranodes(), sl) { + gnutella_node_t *n = sl->data; if (!NODE_IS_WRITABLE(n) || NODE_IS_LEAF(n)) continue; @@ -1525,26 +1603,26 @@ continue; if ((n->attrs & NODE_A_PONG_CACHING) || now > n->next_ping) { - may_ping = g_slist_prepend(may_ping, n); + may_ping = pslist_prepend(may_ping, n); ping_cnt++; } } - for (sl = may_ping, left = ping_cnt; sl; sl = g_slist_next(sl), left--) { - struct gnutella_node *n = sl->data; + for (sl = may_ping, left = ping_cnt; sl; sl = pslist_next(sl), left--) { + gnutella_node_t *n = sl->data; if ( ping_cnt <= MIN_UP_PING || (selected < MIN_UP_PING && left <= (MIN_UP_PING - selected)) || random_value(99) < UP_PING_RATIO ) { - to_ping = g_slist_prepend(to_ping, n); + to_ping = pslist_prepend(to_ping, n); selected++; } } - for (sl = to_ping; sl; sl = g_slist_next(sl)) { - struct gnutella_node *n = sl->data; + PSLIST_FOREACH(to_ping, sl) { + gnutella_node_t *n = sl->data; if (!(n->attrs & NODE_A_PONG_CACHING)) n->next_ping = time_advance(now, OLD_PING_PERIOD); @@ -1557,8 +1635,8 @@ send_ping(n, GNET_PROPERTY(my_ttl)); } - g_slist_free(may_ping); - g_slist_free(to_ping); + pslist_free(may_ping); + pslist_free(to_ping); } /** @@ -1600,7 +1678,7 @@ * those as being "his" pongs. */ static void -setup_pong_demultiplexing(struct gnutella_node *n, guint8 ttl) +setup_pong_demultiplexing(gnutella_node_t *n, uint8 ttl) { int remains; int h; @@ -1634,7 +1712,7 @@ n->pong_missing = remains = MAX_PONGS; for (h = 0; h <= MAX_CACHE_HOPS; h++) { - guchar amount = (guchar) (remains / (MAX_CACHE_HOPS + 1 - h)); + uchar amount = (uchar) (remains / (MAX_CACHE_HOPS + 1 - h)); n->pong_neededh = amount; remains -= amount; if (GNET_PROPERTY(pcache_debug) > 7) @@ -1653,16 +1731,16 @@ * * @return FALSE if we're definitely done, TRUE if we can still iterate. */ -static gboolean +static bool iterate_on_cached_line( - struct gnutella_node *n, struct cache_line *cl, guint8 ttl, - GSList *start, GSList *end, gboolean strict) + gnutella_node_t *n, struct cache_line *cl, uint8 ttl, + pslist_t *start, pslist_t *end, bool strict) { int hops = cl->hops; - GSList *sl; + pslist_t *sl; sl = start; - for (; sl && sl != end && n->pong_missing; sl = g_slist_next(sl)) { + for (; sl && sl != end && n->pong_missing; sl = pslist_next(sl)) { struct cached_pong *cp = sl->data; cl->cursor = sl; @@ -1737,11 +1815,11 @@ */ static void send_cached_pongs( - struct gnutella_node *n, - struct cache_line *cl, guint8 ttl, gboolean strict) + gnutella_node_t *n, + struct cache_line *cl, uint8 ttl, bool strict) { int hops = cl->hops; - GSList *old = cl->cursor; + pslist_t *old = cl->cursor; if (strict && !n->pong_neededhops) return; @@ -1767,7 +1845,7 @@ send_demultiplexed_pongs(gnutella_node_t *n) { enum ping_flag flags; - guint h, ttl; + uint h, ttl; /* * Look whether the "ping" they sent bore the "SCP" extension, meaning @@ -1823,7 +1901,7 @@ for (h = 0; n->pong_missing; h++) { struct cache_line *cl; - + if (h >= gnutella_header_get_ttl(&n->header)) break; @@ -1842,13 +1920,13 @@ */ static void pong_all_neighbours_but_one( - struct gnutella_node *n, struct cached_pong *cp, host_type_t ptype, - guint8 hops, guint8 ttl) + gnutella_node_t *n, struct cached_pong *cp, host_type_t ptype, + uint8 hops, uint8 ttl) { - const GSList *sl; + const pslist_t *sl; - for (sl = node_all_nodes(); sl; sl = g_slist_next(sl)) { - struct gnutella_node *cn = sl->data; + PSLIST_FOREACH(node_all_gnet_nodes(), sl) { + gnutella_node_t *cn = sl->data; if (cn == n) continue; @@ -1903,17 +1981,16 @@ * Send it to one randomly selected leaf, which is not already missing pongs. */ static void -pong_random_leaf(struct cached_pong *cp, guint8 hops, guint8 ttl) +pong_random_leaf(struct cached_pong *cp, uint8 hops, uint8 ttl) { - const GSList *sl; + const pslist_t *sl; unsigned leaves; - struct gnutella_node *leaf = NULL; + gnutella_node_t *leaf = NULL; g_assert(settings_is_ultra()); - for (sl = node_all_nodes(), leaves = 0; sl; sl = g_slist_next(sl)) { - struct gnutella_node *cn = sl->data; - unsigned threshold; + for (sl = node_all_gnet_nodes(), leaves = 0; sl; sl = pslist_next(sl)) { + gnutella_node_t *cn = sl->data; if (cn->pong_missing) /* A job for pong_all_neighbours_but_one() */ continue; @@ -1933,9 +2010,8 @@ */ leaves++; - threshold = 1000.0 / leaves; - if (random_value(999) < threshold) + if (0 == random_value(leaves - 1)) leaf = cn; } @@ -1964,7 +2040,7 @@ * @return a walloc-ed pong_meta_t structure if meta data were found. */ static pong_meta_t * -pong_extract_metadata(struct gnutella_node *n) +pong_extract_metadata(gnutella_node_t *n) { int i; pong_meta_t *meta = NULL; @@ -1979,8 +2055,8 @@ for (i = 0; i < n->extcount; i++) { extvec_t *e = &n->extveci; - const guchar *payload; - guint16 paylen; + const uchar *payload; + uint16 paylen; switch (e->ext_token) { case EXT_T_GGEP_DU: @@ -1990,7 +2066,7 @@ */ { - guint32 uptime; + uint32 uptime; if (GGEP_OK == ggept_du_extract(e, &uptime)) { ALLOCATE(DU); meta->daily_uptime = uptime; @@ -2102,12 +2178,16 @@ meta->dht_mode = payload2; } break; + case EXT_T_GGEP_IPP_TLS: + case EXT_T_GGEP_IPP6_TLS: + /* Silently ignored */ + break; default: if (GNET_PROPERTY(ggep_debug) > 3 && e->ext_type == EXT_GGEP) { paylen = ext_paylen(e); g_warning("%s: unhandled GGEP \"%s\" (%d byte%s)", gmsg_node_infostr(n), ext_ggep_id_str(e), - paylen, paylen == 1 ? "" : "s"); + paylen, plural(paylen)); } break; } @@ -2125,14 +2205,14 @@ static struct cached_pong * record_fresh_pong( host_type_t type, - struct gnutella_node *n, - guint8 hops, host_addr_t addr, guint16 port, - guint32 files_count, guint32 kbytes_count, + gnutella_node_t *n, + uint8 hops, host_addr_t addr, uint16 port, + uint32 files_count, uint32 kbytes_count, pong_meta_t *meta) { struct cache_line *cl; struct cached_pong *cp; - guint8 hop; + uint8 hop; g_assert(UNSIGNED(type) < HOST_MAX); @@ -2148,7 +2228,7 @@ hop = CACHE_HOP_IDX(hops); /* Trim high values to MAX_CACHE_HOPS */ cl = &pong_cachehop; - cl->pongs = g_slist_append(cl->pongs, cp); + cl->pongs = pslist_append(cl->pongs, cp); add_recent_pong(type, cp); return cp; @@ -2158,8 +2238,11 @@ * Called when an UDP ping is received. */ static void -pcache_udp_ping_received(struct gnutella_node *n) +pcache_udp_ping_received(gnutella_node_t *n) { + enum ping_flag flags; + bool is_uhc, throttled; + g_assert(NODE_IS_UDP(n)); /* @@ -2178,6 +2261,16 @@ } /* + * Don't answer to "old" pings (we're catching up with incoming UDP + * traffic). + */ + + if (node_udp_is_old(n)) { + gnet_stats_count_dropped(n, MSG_DROP_TOO_OLD); + return; + } + + /* * Don't answer to pings from bad nodes (includes "alien" hosts). */ @@ -2187,18 +2280,82 @@ } /* + * Count pure UHC pings (i.e. ones without GUESS). + */ + + flags = ping_type(n); + is_uhc = booleanize(PING_F_UHC == ((PING_F_GUE | PING_F_UHC) & flags)); + throttled = FALSE; + + if (is_uhc) + gnet_stats_inc_general(GNR_UDP_UHC_PINGS); + + /* * Don't answer to too frequent pings from the same IP. */ if (aging_lookup(udp_pings, &n->addr)) { gnet_stats_count_dropped(n, MSG_DROP_THROTTLE); - return; + throttled = TRUE; + } else { + aging_insert(udp_pings, + wcopy(&n->addr, sizeof n->addr), GUINT_TO_POINTER(1)); + + /* + * Answers to UHC pings are sent back with a "control" priority. + */ + + send_personal_info(n, is_uhc, flags); + throttled = FALSE; + + if (is_uhc) + gnet_stats_inc_general(GNR_UDP_UHC_PONGS); } - aging_insert(udp_pings, - wcopy(&n->addr, sizeof n->addr), GUINT_TO_POINTER(1)); + if (is_uhc && GNET_PROPERTY(log_uhc_pings_rx)) { + g_debug("UDP UHC got %s from %s%s", + gmsg_infostr_full_split(n->header, n->data, n->size), + node_infostr(n), throttled ? " (throttled)" : ""); + } +} - send_personal_info(n, FALSE, ping_type(n)); +/* + * Shall we accept the ping?. + */ +static bool +pcache_ping_accept(gnutella_node_t *n) +{ + time_t now = tm_time(); + + if (now < n->ping_accept) { + n->n_ping_throttle++; /* Drop the ping */ + gnet_stats_count_dropped(n, MSG_DROP_THROTTLE); + return FALSE; + } else { + n->n_ping_accepted++; + n->ping_accept = now + n->ping_throttle; /* Drop all until then */ + + /* + * Add penalty for non TX-compressed nodes (uncompressed pong traffic + * can really waste bandwidth). + */ + + if (!NODE_TX_COMPRESSED(n)) + n->ping_accept += n->ping_throttle; + + /* + * Throttle pings from transient nodes a little more since their + * connection is unlikely to stay up very long. The more they + * insist the longer we'll throttle them, as a safety net. + */ + + if (NODE_IS_TRANSIENT(n)) { + unsigned extra = n->n_ping_throttle + PCACHE_TRANSIENT / 10; + n->ping_accept += MIN(extra, PCACHE_TRANSIENT); + } + + return TRUE; + } } /** @@ -2219,7 +2376,7 @@ * - Return cached pongs, avoiding to resend a pong coming from that node ID. */ void -pcache_ping_received(struct gnutella_node *n) +pcache_ping_received(gnutella_node_t *n) { time_t now = tm_time(); @@ -2235,11 +2392,10 @@ * Besides, we always accept them. * * If we get a TTL=0 ping, assume it's used to ack an "alive ping" we - * sent earlier. Don't event log we got a message with TTL=0, we're + * sent earlier. Don't even log we got a message with TTL=0, we're * getting way too many of them and nobody on the GDF seems to care. * BearShare is known to do this, and they admitted it publicly like * it was a good idea! - * * --RAM, 2004-08-09 */ @@ -2247,12 +2403,24 @@ gnutella_header_get_hops(&n->header) == 0 && gnutella_header_get_ttl(&n->header) <= 2 ) { + uint8 ttl = gnutella_header_get_ttl(&n->header); + n->n_ping_special++; + + /* + * Transient nodes are severely limited, because we don't want + * to waste traffic to them. + * --RAM, 2012-01-15 + */ + + if (NODE_IS_TRANSIENT(n) && ttl > 1 && !pcache_ping_accept(n)) + return; + n->n_ping_accepted++; - if (gnutella_header_get_ttl(&n->header) == 1) + if (1 == ttl) send_personal_info(n, TRUE, PING_F_NONE); /* Prioritary */ - else if (gnutella_header_get_ttl(&n->header) == 2) { + else if (2 == ttl) { if (settings_is_ultra()) send_neighbouring_info(n); } else @@ -2285,14 +2453,8 @@ * Accept the ping?. */ - if (now < n->ping_accept) { - n->n_ping_throttle++; /* Drop the ping */ - gnet_stats_count_dropped(n, MSG_DROP_THROTTLE); + if (!pcache_ping_accept(n)) return; - } else { - n->n_ping_accepted++; - n->ping_accept = now + n->ping_throttle; /* Drop all until then */ - } /* * Purge cache if needed. @@ -2316,13 +2478,7 @@ * personal information (reply to initial ping sent after handshake). */ - if ( - n->n_ping_accepted == 1 || - ( - (GNET_PROPERTY(is_firewalled) || node_missing() > 0) && - inet_can_answer_ping() - ) - ) { + if (1 == n->n_ping_accepted || pcache_can_answer_ping()) { send_personal_info(n, FALSE, PING_F_NONE); if (!NODE_IS_CONNECTED(n)) /* Can be removed if send queue is full */ return; @@ -2342,23 +2498,25 @@ * Called when an UDP pong is received. */ static void -pcache_udp_pong_received(struct gnutella_node *n) +pcache_udp_pong_received(gnutella_node_t *n) { host_addr_t ipv4_addr; - host_addr_t ipv6_addr; - gboolean supports_tls; - gboolean supports_dht; - guint16 port; + host_addr_t ipv6_addr; /* Extracted, but value unused currently */ + bool supports_tls; + bool supports_dht; + gnet_host_t host; + uint16 port; int i; g_assert(NODE_IS_UDP(n)); - switch (udp_ping_is_registered(n)) { + switch (udp_ping_is_registered(n, &host)) { case UDP_PONG_UNSOLICITED: if (guess_rpc_handle(n)) return; if (GNET_PROPERTY(bootstrap_debug) || GNET_PROPERTY(udp_debug)) { - g_message("UDP ignoring unsolicited %s", gmsg_infostr(n->header)); + g_message("UDP ignoring unsolicited %s from %s", + gmsg_infostr(n->header), node_addr(n)); } /* FALL THROUGH */ case UDP_PONG_HANDLED: @@ -2372,7 +2530,13 @@ ipv6_addr = zero_host_addr; supports_tls = FALSE; supports_dht = FALSE; - + + if (GNET_PROPERTY(udp_debug) && port != gnet_host_get_port(&host)) { + g_warning("UDP ping set to %s but host advertises %s in its pong", + gnet_host_to_string(&host), + host_addr_port_to_string(ipv4_addr, port)); + } + /* * We pretty much ignore pongs we get from UDP, unless they bear * the GGEP "IPP" or "DHTIPP" extensions, containing a packed set @@ -2381,7 +2545,7 @@ for (i = 0; i < n->extcount; i++) { extvec_t *e = &n->extveci; - guint16 paylen; + uint16 paylen; const char *payload; switch (e->ext_token) { @@ -2397,10 +2561,10 @@ payload = ext_payload(e); switch (e->ext_token) { - case EXT_T_GGEP_IPP: len = 6; nt = NET_TYPE_IPV4; break; - case EXT_T_GGEP_DHTIPP: len = 6; nt = NET_TYPE_IPV4; break; - case EXT_T_GGEP_IPP6: len = 18; nt = NET_TYPE_IPV6; break; - case EXT_T_GGEP_DHTIPP6: len = 18; nt = NET_TYPE_IPV6; break; + case EXT_T_GGEP_IPP: len = 6; nt = NET_TYPE_IPV4; break; + case EXT_T_GGEP_DHTIPP: len = 6; nt = NET_TYPE_IPV4; break; + case EXT_T_GGEP_IPP6: len = 18; nt = NET_TYPE_IPV6; break; + case EXT_T_GGEP_DHTIPP6: len = 18; nt = NET_TYPE_IPV6; break; default: g_assert_not_reached(); } @@ -2411,17 +2575,17 @@ "bad length for GGEP \"%s\" " "(%d byte%s, not multiple of %d)", gmsg_node_infostr(n), ext_ggep_id_str(e), - paylen, paylen == 1 ? "" : "s", len); + paylen, plural(paylen), len); } } else { switch (e->ext_token) { case EXT_T_GGEP_IPP: case EXT_T_GGEP_IPP6: - uhc_ipp_extract(n, payload, paylen, nt); + uhc_ipp_extract(n, payload, paylen, nt); break; case EXT_T_GGEP_DHTIPP: case EXT_T_GGEP_DHTIPP6: - dht_ipp_extract(n, payload, paylen, nt); + dht_ipp_extract(n, payload, paylen, nt); break; default: g_assert_not_reached(); @@ -2441,7 +2605,7 @@ break; case EXT_T_GGEP_DHT: if (ext_paylen(e) >= 3) { - guint8 mode; + uint8 mode; payload = ext_payload(e); mode = payload2; @@ -2451,42 +2615,43 @@ supports_dht = TRUE; } break; + case EXT_T_GGEP_UP: + case EXT_T_GGEP_LOC: + case EXT_T_GGEP_IPP_TLS: + case EXT_T_GGEP_IPP6_TLS: + /* Silently ignored */ + break; default: if (GNET_PROPERTY(ggep_debug) > 1 && e->ext_type == EXT_GGEP) { paylen = ext_paylen(e); g_warning("%s (UDP): unhandled GGEP \"%s\" (%d byte%s)", gmsg_node_infostr(n), ext_ggep_id_str(e), - paylen, paylen == 1 ? "" : "s"); + paylen, plural(paylen)); } break; } } - if (port == n->port) { + /* + * Since host replied to the ping, it is alive at the IP:port to which + * the ping was sent. + */ + + { host_addr_t addr; + uint16 hport; - switch (host_addr_net(n->addr)) { - case NET_TYPE_IPV4: - addr = ipv4_addr; - break; - case NET_TYPE_IPV6: - addr = ipv6_addr; - break; - default: - addr = zero_host_addr; - } + addr = gnet_host_get_addr(&host); + hport = gnet_host_get_port(&host); - if ( - host_addr_equal(addr, n->addr) && - host_is_valid(addr, port) && - !hcache_node_is_bad(addr) - ) { - host_add(addr, port, TRUE); + if (!hcache_node_is_bad(addr)) { + /* Asuume the (valid) UDP port is also a proper TCP port */ + host_add(addr, hport, TRUE); if (supports_tls) { - tls_cache_insert(addr, port); + tls_cache_insert(addr, hport); } if (supports_dht) { - dht_bootstrap_if_needed(addr, port); + dht_bootstrap_if_needed(addr, hport); } } } @@ -2506,12 +2671,12 @@ * - For all nodes but `n', propagate pong if neeed, with demultiplexing. */ void -pcache_pong_received(struct gnutella_node *n) +pcache_pong_received(gnutella_node_t *n) { - guint16 port; - guint32 files_count; - guint32 kbytes_count; - guint32 swapped_count; + uint16 port; + uint32 files_count; + uint32 kbytes_count; + uint32 swapped_count; struct cached_pong *cp; host_type_t ptype; host_addr_t addr; @@ -2532,7 +2697,7 @@ addr = host_addr_peek_ipv4(&n->data2); files_count = peek_le32(&n->data6); kbytes_count = peek_le32(&n->data10); - + meta = pong_extract_metadata(n); /* @@ -2560,19 +2725,19 @@ */ if (files_count > PCACHE_MAX_FILES) { /* Arbitrarily large constant */ - gboolean fixed = FALSE; + bool fixed = FALSE; - swapped_count = swap_guint32(files_count); + swapped_count = swap_uint32(files_count); if (swapped_count > PCACHE_MAX_FILES) { - if (GNET_PROPERTY(pcache_debug) && host_addr_equal(addr, n->addr)) + if (GNET_PROPERTY(pcache_debug) && host_addr_equiv(addr, n->addr)) g_warning("%s sent us a pong with " "large file count %u (0x%x), dropped", node_infostr(n), files_count, files_count); n->rx_dropped++; goto done; } else { - if (GNET_PROPERTY(pcache_debug) && host_addr_equal(addr, n->addr)) + if (GNET_PROPERTY(pcache_debug) && host_addr_equiv(addr, n->addr)) g_warning("%s sent us a pong with suspect file count %u " "(fixed to %u)", node_infostr(n), files_count, swapped_count); @@ -2583,7 +2748,7 @@ * Maybe the kbytes_count is correct if the files_count was? */ - swapped_count = swap_guint32(kbytes_count); + swapped_count = swap_uint32(kbytes_count); if (fixed && swapped_count < kbytes_count) kbytes_count = swapped_count; /* Probably wrong as well */ @@ -2602,7 +2767,7 @@ */ if (!is_host_addr(n->gnet_addr) && (n->flags & NODE_F_INCOMING)) { - if (host_addr_equal(addr, n->addr)) { + if (host_addr_equiv(addr, n->addr)) { n->gnet_addr = addr; /* Signals: we have figured it out */ n->gnet_port = port; } else if (!(n->flags & NODE_F_ALIEN_IP)) { @@ -2622,7 +2787,7 @@ * --RAM, 11/01/2004. */ - if (n->n_pong_received == 1 || host_addr_equal(addr, n->gnet_addr)) { + if (n->n_pong_received == 1 || host_addr_equiv(addr, n->gnet_addr)) { n->gnet_files_count = files_count; n->gnet_kbytes_count = kbytes_count; n->flags |= NODE_F_SHARED_INFO; @@ -2636,7 +2801,7 @@ if ( is_host_addr(n->gnet_pong_addr) && - !host_addr_equal(addr, n->gnet_pong_addr) + !host_addr_equiv(addr, n->gnet_pong_addr) ) { if (GNET_PROPERTY(pcache_debug) && n->n_ping_sent > 2) { g_warning("%s sent us a pong for new IP %s (used %s before)", @@ -2669,7 +2834,7 @@ * If pong points to an hostile IP address, discard it. */ - if (hostiles_check(addr)) { + if (hostiles_is_bad(addr)) { gnet_stats_count_dropped(n, MSG_DROP_HOSTILE_IP); goto done; } @@ -2715,7 +2880,7 @@ addr, port, files_count, kbytes_count, meta); meta = NULL; /* Metadata now owned by cached pong */ - ptype = pong_type((gpointer) n->data); + ptype = pong_type(cast_to_pointer(n->data)); if (cp->meta != NULL && (cp->meta->flags & PONG_META_HAS_UP)) ptype = HOST_ULTRA; @@ -2789,7 +2954,7 @@ * connections as well. */ void -pcache_pong_fake(struct gnutella_node *n, const host_addr_t addr, guint16 port) +pcache_pong_fake(gnutella_node_t *n, const host_addr_t addr, uint16 port) { g_assert(n->attrs & NODE_A_ULTRA);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/pcache.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/pcache.h
Changed
@@ -45,26 +45,24 @@ * Pong metadata that we try to preserve when present. */ typedef struct pong_meta { - guchar vendor4; /**< Vendor code, from GGEP "VC" */ - guchar language2; /**< Node's preferred language, from GGEP "LOC" */ - guchar country2; /**< Node's country, from GGEP "LOC" */ - guint8 guess; /**< Node supports GUESS, from GGEP "GUE" */ + uchar vendor4; /**< Vendor code, from GGEP "VC" */ + uchar language2; /**< Node's preferred language, from GGEP "LOC" */ + uchar country2; /**< Node's country, from GGEP "LOC" */ + uint8 guess; /**< Node supports GUESS, from GGEP "GUE" */ host_addr_t ipv6_addr; /**< For GGEP "6" */ - host_addr_t sender_addr; /**< For GGEP "IP" */ - guint16 sender_port; /**< For GGEP "IP" */ - guint32 daily_uptime; /**< Node's daily uptime, from GGEP "DU" */ - guint8 up_slots; /**< Free UP slots, from GGEP "UP" */ - guint8 leaf_slots; /**< Free leaf slots, from GGEP "UP" */ - guint8 version_up; /**< Ultrapeer version protocol, from GGEP "UP" */ - guint8 version_ua; /**< Servent version, from GGEP "VC" */ + uint32 daily_uptime; /**< Node's daily uptime, from GGEP "DU" */ + uint8 up_slots; /**< Free UP slots, from GGEP "UP" */ + uint8 leaf_slots; /**< Free leaf slots, from GGEP "UP" */ + uint8 version_up; /**< Ultrapeer version protocol, from GGEP "UP" */ + uint8 version_ua; /**< Servent version, from GGEP "VC" */ - guint8 dht_major; /**< DHT major version, from GGEP "DHT" */ - guint8 dht_minor; /**< DHT minor version, from GGEP "DHT" */ - guint8 dht_mode; /**< DHT mode, from GGEP "DHT" */ + uint8 dht_major; /**< DHT major version, from GGEP "DHT" */ + uint8 dht_minor; /**< DHT minor version, from GGEP "DHT" */ + uint8 dht_mode; /**< DHT mode, from GGEP "DHT" */ - guint8 flags; /**< Validation flags */ + uint8 flags; /**< Validation flags */ } pong_meta_t; enum { @@ -95,10 +93,10 @@ struct guid; gnutella_msg_init_t *build_ping_msg( - const struct guid *, guint8 ttl, gboolean uhc, guint32 *size); + const struct guid *, uint8 ttl, bool uhc, uint32 *size); gnutella_msg_init_t *build_guess_ping_msg( - const struct guid *, gboolean qk, gboolean intro, gboolean scp, guint32 *s); + const struct guid *, bool qk, bool intro, bool scp, uint32 *s); /* * Public interface. @@ -113,11 +111,11 @@ void pcache_ping_received(struct gnutella_node *n); void pcache_pong_received(struct gnutella_node *n); void pcache_pong_fake(struct gnutella_node *n, - const host_addr_t addr, guint16 port); -gboolean pcache_get_recent(host_type_t type, host_addr_t *addr, guint16 *port); + const host_addr_t addr, uint16 port); +bool pcache_get_recent(host_type_t type, host_addr_t *addr, uint16 *port); void pcache_clear_recent(host_type_t type); void pcache_guess_acknowledge(struct gnutella_node *n, - gboolean good_qk, gboolean wants_ipp, host_net_t net); + bool good_qk, bool wants_ipp, host_net_t net); void ping_all_neighbours(void);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/pdht.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/pdht.c
Changed
@@ -59,10 +59,14 @@ #include "lib/atoms.h" #include "lib/cq.h" +#include "lib/hikset.h" #include "lib/misc.h" #include "lib/nid.h" +#include "lib/plist.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ #define PDHT_ALOC_MAJOR 0 /**< We generate v0.1 "ALOC" values */ @@ -83,12 +87,12 @@ /** * Hash table holding all the pending file publishes by SHA1. */ -static GHashTable *aloc_publishes; /* SHA1 -> pdht_publish_t */ +static hikset_t *aloc_publishes; /* SHA1 -> pdht_publish_t */ /** * Hash table holding all the pending push-entry publishing by GUID. */ -static GHashTable *nope_publishes; /* GUID -> pdht_publish_t */ +static hikset_t *nope_publishes; /* GUID -> pdht_publish_t */ typedef enum { PDHT_PUBLISH_MAGIC = 0x680182c5U } pdht_magic_t; @@ -108,7 +112,7 @@ * not enable us to know why the STORE attempt failed. */ struct pdht_bg { - guint16 *status; /**< Consolidated STORE statuses */ + uint16 *status; /**< Consolidated STORE statuses */ const lookup_rs_t *rs; /**< STORE lookup path */ cevent_t *ev; /**< Scheduling for background store */ unsigned published; /**< Consolidated amount of publishes */ @@ -124,7 +128,7 @@ pdht_magic_t magic; pdht_type_t type; pdht_cb_t cb; /**< Callback to invoke when finished */ - gpointer arg; /**< Callback argument */ + void *arg; /**< Callback argument */ const kuid_t *id; /**< Publishing key (atom) */ publish_t *pb; /**< The publishing request */ dht_value_t *value; /**< The value being published */ @@ -139,7 +143,7 @@ struct nid *nid; /**< ID of node for which we're a proxy */ } nope; } u; - guint32 flags; /**< Operating flags */ + uint32 flags; /**< Operating flags */ } pdht_publish_t; static inline void @@ -174,10 +178,10 @@ time_t last_enqueued; /**< When republish event was fired */ time_t last_publish; /**< Time at which last publish completed */ time_t last_delayed; /**< When republish event was set */ - gboolean backgrounded; /**< Whether background republish runs */ + bool backgrounded; /**< Whether background republish runs */ } pdht_proxy; -static void pdht_bg_publish(cqueue_t *unused_cq, gpointer obj); +static void pdht_bg_publish(cqueue_t *cq, void *obj); /** * English version of the publish type. @@ -199,7 +203,7 @@ * Allocate a publishing context. */ static pdht_publish_t * -pdht_publish_allocate(pdht_type_t type, pdht_cb_t cb, gpointer arg) +pdht_publish_allocate(pdht_type_t type, pdht_cb_t cb, void *arg) { pdht_publish_t *pp; @@ -216,7 +220,7 @@ * Allocate a background publishing context. */ static struct pdht_bg * -pdht_bg_alloc(const lookup_rs_t *rs, const guint16 *status, +pdht_bg_alloc(const lookup_rs_t *rs, const uint16 *status, unsigned published, unsigned candidates) { struct pdht_bg *pbg; @@ -253,7 +257,7 @@ * Free publishing context. */ static void -pdht_free_publish(pdht_publish_t *pp, gboolean do_remove) +pdht_free_publish(pdht_publish_t *pp, bool do_remove) { pdht_publish_check(pp); @@ -272,13 +276,13 @@ switch (pp->type) { case PDHT_T_ALOC: if (do_remove) - g_hash_table_remove(aloc_publishes, pp->u.aloc.sha1); + hikset_remove(aloc_publishes, pp->u.aloc.sha1); atom_sha1_free_null(&pp->u.aloc.sha1); shared_file_unref(&pp->u.aloc.sf); break; case PDHT_T_NOPE: if (do_remove) - g_hash_table_remove(nope_publishes, pp->u.nope.guid); + hikset_remove(nope_publishes, pp->u.nope.guid); if (pp->u.nope.nid != NULL) { nid_unref(pp->u.nope.nid); pp->u.nope.nid = NULL; @@ -338,9 +342,9 @@ const char * pdht_strerror(pdht_error_t code) { - STATIC_ASSERT(G_N_ELEMENTS(pdht_errstr) == PDHT_E_MAX); + STATIC_ASSERT(N_ITEMS(pdht_errstr) == PDHT_E_MAX); - if (UNSIGNED(code) >= G_N_ELEMENTS(pdht_errstr)) + if (UNSIGNED(code) >= N_ITEMS(pdht_errstr)) return "invalid PDHT error code"; return pdht_errstrcode; @@ -377,14 +381,14 @@ * Callback when publish_value() is done. */ static void -pdht_publish_done(gpointer arg, +pdht_publish_done(void *arg, publish_error_t code, const publish_info_t *info) { pdht_publish_t *pp = arg; pdht_error_t status = PDHT_E_OK; /* Shut compiler warning up */ unsigned published = info->published; unsigned candidates = info->candidates; - gboolean can_bg = TRUE; + bool can_bg = TRUE; pdht_info_t pinfo; pdht_publish_check(pp); @@ -434,7 +438,7 @@ g_debug("PDHT ending %s%s publish for %s (%u publish%s): %s", (pp->flags & PDHT_F_BACKGROUND) ? "background " : "", pdht_type_to_string(pp->type), kuid_to_string(pp->id), - info->published, 1 == info->published ? "" : "es", + info->published, plural_es(info->published), publish_strerror(code)); } @@ -525,19 +529,26 @@ * Callout queue callback to launch a background publish. */ static void -pdht_bg_publish(cqueue_t *unused_cq, gpointer obj) +pdht_bg_publish(cqueue_t *cq, void *obj) { pdht_publish_t *pp = obj; - (void) unused_cq; - pdht_publish_check(pp); g_assert(pp->bg != NULL); g_assert(NULL == pp->pb); - pp->bg->ev = NULL; + cq_zero(cq, &pp->bg->ev); pp->bg->runs++; + /* + * If the DHT was disabled dynamically, abort the publishing. + */ + + if G_UNLIKELY(!dht_enabled()) { + pdht_free_publish(pp, TRUE); + return; + } + if (GNET_PROPERTY(publisher_debug) > 1) { g_debug("PDHT starting background %s publish for %s (run #%d)", pdht_type_to_string(pp->type), kuid_to_string(pp->id), @@ -567,7 +578,7 @@ void *value; ggep_stream_t gs; int ggep_len; - gboolean ok; + bool ok; const struct tth *tth; dht_value_t *aloc; knode_t *our_knode; @@ -591,20 +602,20 @@ value = walloc(DHT_VALUE_MAX_LEN); ggep_stream_init(&gs, value, DHT_VALUE_MAX_LEN); - + ok = ggep_stream_pack(&gs, GGEP_NAME(client_id), GNET_PROPERTY(servent_guid), GUID_RAW_SIZE, 0); { - guint8 fw = booleanize(GNET_PROPERTY(is_firewalled)); + uint8 fw = booleanize(GNET_PROPERTY(is_firewalled)); ok = ok && ggep_stream_pack(&gs, GGEP_NAME(firewalled), &fw, 1, 0); } { - char bufsizeof(guint64); + char bufsizeof(uint64); int len; - len = ggept_filesize_encode(shared_file_size(sf), buf); + len = ggept_filesize_encode(shared_file_size(sf), buf, sizeof buf); g_assert(len > 0 && UNSIGNED(len) <= sizeof buf); ok = ok && ggep_stream_pack(&gs, GGEP_NAME(length), buf, len, 0); } @@ -613,18 +624,18 @@ fileinfo_t *fi = shared_file_fileinfo(sf); if (shared_file_size(sf) != fi->done) { - char bufsizeof(guint64); + char bufsizeof(uint64); int len; - len = ggept_filesize_encode(fi->done, buf); + len = ggept_filesize_encode(fi->done, buf, sizeof buf); g_assert(len > 0 && UNSIGNED(len) <= sizeof buf); ok = ok && ggep_stream_pack(&gs, GGEP_NAME(avail), buf, len, 0); } } { - char bufsizeof(guint16); - guint16 port = socket_listen_port(); + char bufsizeof(uint16); + uint16 port = socket_listen_port(); poke_be16(buf, port); ok = ok && ggep_stream_pack(&gs, GGEP_NAME(port), buf, sizeof buf, 0); @@ -691,10 +702,10 @@ void *value; ggep_stream_t gs; int ggep_len; - gboolean ok; + bool ok; dht_value_t *prox; knode_t *our_knode; - guint8 zero = 0; + uint8 zero = 0; /* * A PROX value bears the following GGEP keys: @@ -722,8 +733,8 @@ ggep_stream_pack(&gs, GGEP_NAME(fwt_version), &zero, sizeof zero, 0); { - char bufsizeof(guint16); - guint16 port = socket_listen_port(); + char bufsizeof(uint16); + uint16 port = socket_listen_port(); poke_be16(buf, port); ok = ok && ggep_stream_pack(&gs, GGEP_NAME(port), buf, sizeof buf, 0); @@ -732,8 +743,8 @@ ok = ok && pdht_proxy.proxies_count > 0; if (ok) { - guchar tls_bytes(PDHT_MAX_PROXIES + 7) / 8; - guint tls_length; + uchar tls_bytes(PDHT_MAX_PROXIES + 7) / 8; + uint tls_length; size_t i = 0; ok = ok && ggep_stream_begin(&gs, GGEP_NAME(proxies), 0); @@ -743,10 +754,10 @@ while (ok && i < pdht_proxy.proxies_count) { const gnet_host_t *host = &pdht_proxy.proxiesi; host_addr_t addr = gnet_host_get_addr(host); - guint16 port = gnet_host_get_port(host); + uint16 port = gnet_host_get_port(host); char proxy18; - guint8 len; - gboolean tls = FALSE; + uint8 len; + bool tls = FALSE; switch (host_addr_net(addr)) { case NET_TYPE_IPV4: @@ -828,7 +839,7 @@ void *value; ggep_stream_t gs; int ggep_len; - gboolean ok; + bool ok; dht_value_t *nope; knode_t *our_knode; @@ -846,8 +857,8 @@ ok = ggep_stream_pack(&gs, GGEP_NAME(guid), guid, GUID_RAW_SIZE, 0); { - char bufsizeof(guint16); - guint16 port = socket_listen_port(); + char bufsizeof(uint16); + uint16 port = socket_listen_port(); poke_be16(buf, port); ok = ok && ggep_stream_pack(&gs, GGEP_NAME(port), buf, sizeof buf, 0); @@ -888,7 +899,7 @@ * Callback when lookup for STORE roots succeeded. */ static void -pdht_roots_found(const kuid_t *kuid, const lookup_rs_t *rs, gpointer arg) +pdht_roots_found(const kuid_t *kuid, const lookup_rs_t *rs, void *arg) { pdht_publish_t *pp = arg; dht_value_t *value = NULL; @@ -913,17 +924,17 @@ /* * Step #2: generate the DHT value */ - + switch (pp->type) { case PDHT_T_ALOC: { struct pdht_aloc *paloc = &pp->u.aloc; - shared_file_t *sf = paloc->sf; + shared_file_t *sf = paloc->sf, *sf1; if (GNET_PROPERTY(publisher_debug) > 1) { size_t roots = lookup_result_path_length(rs); g_debug("PDHT ALOC found %zu publish root%s for %s \"%s\"", - roots, 1 == roots ? "" : "s", + roots, plural(roots), shared_file_is_partial(sf) ? "partial" : "shared", shared_file_name_nfc(sf)); } @@ -935,7 +946,7 @@ * not be requeued for publishing at the next period. */ - if (NULL == shared_file_by_sha1(paloc->sha1)) { + if (NULL == (sf1 = shared_file_by_sha1(paloc->sha1))) { if (GNET_PROPERTY(publisher_debug)) { g_warning("PDHT ALOC cannot publish %s \"%s\": " "no longer shared", @@ -946,6 +957,7 @@ pdht_publish_error(pp, PDHT_E_NOT_SHARED); return; } + shared_file_unref(&sf1); value = pdht_get_aloc(sf, pp->id); } @@ -954,8 +966,7 @@ if (GNET_PROPERTY(publisher_debug) > 1) { size_t roots = lookup_result_path_length(rs); g_debug("PDHT NOPE found %zu publish root%s for %s", - roots, 1 == roots ? "" : "s", - guid_hex_str(pp->u.nope.guid)); + roots, plural(roots), guid_hex_str(pp->u.nope.guid)); } value = pdht_get_nope(pp->u.nope.guid, pp->id); @@ -963,8 +974,7 @@ case PDHT_T_PROX: if (GNET_PROPERTY(publisher_debug) > 1) { size_t roots = lookup_result_path_length(rs); - g_debug("PDHT PROX found %zu publish root%s", - roots, 1 == roots ? "" : "s"); + g_debug("PDHT PROX found %zu publish root%s", roots, plural(roots)); } value = pdht_get_prox(pp->id); @@ -992,7 +1002,7 @@ * Callback for errors during root node lookups. */ static void -pdht_roots_error(const kuid_t *kuid, lookup_error_t error, gpointer arg) +pdht_roots_error(const kuid_t *kuid, lookup_error_t error, void *arg) { pdht_publish_t *pp = arg; pdht_error_t status; @@ -1065,7 +1075,7 @@ * Callout queue callback to report error asynchronously. */ static void -pdht_report_async_error(struct cqueue *cq, gpointer udata) +pdht_report_async_error(struct cqueue *cq, void *udata) { struct pdht_async *pa = udata; @@ -1097,7 +1107,7 @@ * @param arg argument to supply to callback */ void -pdht_publish_file(shared_file_t *sf, pdht_cb_t cb, gpointer arg) +pdht_publish_file(shared_file_t *sf, pdht_cb_t cb, void *arg) { const char *error = NULL; const sha1_t *sha1; @@ -1124,13 +1134,13 @@ pp->id = gdht_kuid_from_sha1(sha1); paloc->sha1 = atom_sha1_get(sha1); - if (g_hash_table_lookup(aloc_publishes, sha1)) { + if (hikset_contains(aloc_publishes, sha1)) { error = "previous publish still pending"; code = PDHT_E_PENDING; goto error; } - gm_hash_table_insert_const(aloc_publishes, paloc->sha1, pp); + hikset_insert_key(aloc_publishes, &paloc->sha1); /* * Publishing will occur in three steps: @@ -1168,7 +1178,7 @@ * @param callabck whether callbacks need to be invoked */ static void -pdht_cancel(pdht_publish_t *pp, gboolean callback) +pdht_cancel(pdht_publish_t *pp, bool callback) { pdht_publish_check(pp); @@ -1195,14 +1205,14 @@ * @param callabck whether callbacks need to be invoked */ void -pdht_cancel_file(const sha1_t *sha1, gboolean callback) +pdht_cancel_file(const sha1_t *sha1, bool callback) { pdht_publish_t *pp; if (NULL == aloc_publishes) return; - pp = g_hash_table_lookup(aloc_publishes, sha1); + pp = hikset_lookup(aloc_publishes, sha1); if (NULL == pp) return; @@ -1232,7 +1242,7 @@ * @param callabck whether callbacks need to be invoked */ static void -pdht_cancel_prox(gboolean callback) +pdht_cancel_prox(bool callback) { pdht_publish_t *pp; @@ -1260,10 +1270,10 @@ * publishing layer to continue attempts to failed STORE roots and report * on progress using the same callback. */ -static gboolean -pdht_prox_done(gpointer u_arg, pdht_error_t code, const pdht_info_t *info) +static bool +pdht_prox_done(void *u_arg, pdht_error_t code, const pdht_info_t *info) { - gboolean accepted = TRUE; + bool accepted = TRUE; int delay = PDHT_PROX_RETRY; (void) u_arg; @@ -1279,7 +1289,7 @@ time_delta_t elapsed = delta_time(tm_time(), pdht_proxy.last_publish); if (elapsed > DHT_VALUE_PROX_EXPIRE) - gnet_stats_count_general(GNR_DHT_REPUBLISHED_LATE, +1); + gnet_stats_inc_general(GNR_DHT_REPUBLISHED_LATE); } delay = publisher_delay(info, DHT_VALUE_PROX_EXPIRE); @@ -1320,7 +1330,7 @@ late = "late, "; } - gm_snprintf(retry, sizeof retry, "%s", compact_time(delay)); + str_bprintf(retry, sizeof retry, "%s", compact_time(delay)); g_debug("PDHT PROX %s%spublished to %u node%s%s: %s" " (%stook %s, total %u node%s, proba %.3f%%, retry in %s," @@ -1330,7 +1340,7 @@ info->roots, 1 == info->roots ? "" : "s", after, pdht_strerror(code), late, compact_time(delta_time(tm_time(), pdht_proxy.last_enqueued)), - info->all_roots, 1 == info->all_roots ? "" : "s", + info->all_roots, plural(info->all_roots), info->presence * 100.0, retry, info->can_bg ? "can" : "no", info->path_len, accepted ? "OK" : "INCOMPLETE"); @@ -1358,7 +1368,7 @@ pdht_prox_fill_vector(gnet_host_t *vec, size_t vecsize) { sequence_t *seq = NULL; - GList *list = NULL; + plist_t *list = NULL; gnet_host_t localhost; size_t i = 0; @@ -1367,7 +1377,7 @@ if (NULL == seq || sequence_is_empty(seq)) { host_addr_t addr; - guint16 port = socket_listen_port(); + uint16 port = socket_listen_port(); sequence_release(&seq); @@ -1381,8 +1391,8 @@ if (is_host_addr(addr) && port != 0) { gnet_host_set(&localhost, addr, socket_listen_port()); - list = g_list_prepend(list, &localhost); - seq = sequence_create_from_glist(list); + list = plist_prepend(list, &localhost); + seq = sequence_create_from_plist(list); } else { return 0; /* Nothing to fill */ } @@ -1410,12 +1420,11 @@ } sequence_release(&seq); - g_list_free(list); + plist_free(list); if (GNET_PROPERTY(publisher_debug) > 1) { - g_debug("PDHT PROX using %zu push-prox%s for local node (%s)", - i, 1 == i ? "y" : "ies", - GNET_PROPERTY(is_firewalled) ? "firewalled" : "not firewalled"); + g_debug("PDHT PROX using %zu push-prox%s for local node (%sfirewalled)", + i, plural_y(i), GNET_PROPERTY(is_firewalled) ? "" : "not "); } return i; @@ -1427,22 +1436,22 @@ * @return TRUE if the list changed, FALSE if it is the same as the * one we had before. */ -static gboolean +static bool pdht_prox_update_list(void) { gnet_host_t proxiesPDHT_MAX_PROXIES; size_t n; size_t i; - n = pdht_prox_fill_vector(proxies, G_N_ELEMENTS(proxies)); + n = pdht_prox_fill_vector(proxies, N_ITEMS(proxies)); - g_assert(n <= G_N_ELEMENTS(proxies)); + g_assert(n <= N_ITEMS(proxies)); if (n != pdht_proxy.proxies_count) goto new_proxies; for (i = 0; i < n; i++) { - if (!gnet_host_eq(&proxiesi, &pdht_proxy.proxiesi)) + if (!gnet_host_equiv(&proxiesi, &pdht_proxy.proxiesi)) goto new_proxies; } @@ -1450,7 +1459,7 @@ new_proxies: - g_assert(G_N_ELEMENTS(proxies) == G_N_ELEMENTS(pdht_proxy.proxies)); + g_assert(N_ITEMS(proxies) == N_ITEMS(pdht_proxy.proxies)); memcpy(pdht_proxy.proxies, proxies, n * sizeof proxies0); pdht_proxy.proxies_count = n; @@ -1466,19 +1475,22 @@ * the last time we published it. */ static void -pdht_prox_publish(gboolean force) +pdht_prox_publish(bool force) { - gboolean changed; - gboolean publishing; + bool changed; + bool publishing; time_t now; changed = pdht_prox_update_list(); publishing = pdht_proxy.proxies_count > 0 && (changed || force); + if G_UNLIKELY(!dht_enabled()) + publishing = FALSE; /* DHT was disabled */ + if (GNET_PROPERTY(publisher_debug) > 1) { g_debug("PDHT PROX list of %u push-prox%s %schanged, %s (%s)", (unsigned) pdht_proxy.proxies_count, - 1 == pdht_proxy.proxies_count ? "y" : "ies", + plural_y(pdht_proxy.proxies_count), changed ? "" : "un", publishing ? "publishing" : "ignoring", force ? "forced" : "on change only"); @@ -1605,12 +1617,11 @@ * Callout queue callback to initiate a new PROX publish. */ static void -pdht_prox_timer(cqueue_t *unused_cq, gpointer unused_obj) +pdht_prox_timer(cqueue_t *cq, void *unused_obj) { - (void) unused_cq; (void) unused_obj; - pdht_proxy.publish_ev = NULL; + cq_zero(cq, &pdht_proxy.publish_ev); pdht_prox_publish(TRUE); } @@ -1636,14 +1647,14 @@ * @param callabck whether callbacks need to be invoked */ void -pdht_cancel_nope(const struct guid *guid, gboolean callback) +pdht_cancel_nope(const struct guid *guid, bool callback) { pdht_publish_t *pp; if (NULL == nope_publishes) return; - pp = g_hash_table_lookup(nope_publishes, guid); + pp = hikset_lookup(nope_publishes, guid); if (NULL == pp) return; @@ -1666,10 +1677,10 @@ * publishing layer to continue attempts to failed STORE roots and report * on progress using the same callback. */ -static gboolean -pdht_nope_done(gpointer arg, pdht_error_t code, const pdht_info_t *info) +static bool +pdht_nope_done(void *arg, pdht_error_t code, const pdht_info_t *info) { - gboolean accepted = TRUE; + bool accepted = TRUE; struct nid *node_id = arg; gnutella_node_t *n; @@ -1696,9 +1707,9 @@ " %s bg, path %u) %s", info->was_bg ? "bg " : "", guid_hex_str(node_guid(n)), node_addr(n), node_vendor(n), - info->roots, 1 == info->roots ? "" : "s", + info->roots, plural(info->roots), pdht_strerror(code), - info->all_roots, 1 == info->all_roots ? "" : "s", + info->all_roots, plural(info->all_roots), info->presence * 100.0, info->can_bg ? "can" : "no", info->path_len, accepted ? "OK" : "INCOMPLETE"); @@ -1724,20 +1735,20 @@ g_return_if_fail(node_guid(n) != NULL); pp = pdht_publish_allocate(PDHT_T_NOPE, - pdht_nope_done, deconstify_gpointer(nid)); + pdht_nope_done, deconstify_pointer(nid)); pnope = &pp->u.nope; pnope->guid = atom_guid_get(node_guid(n)); pnope->nid = nid_ref(nid); pp->id = gdht_kuid_from_guid(pnope->guid); - if (g_hash_table_lookup(nope_publishes, pnope->guid)) { + if (hikset_contains(nope_publishes, pnope->guid)) { error = "previous publish still pending"; code = PDHT_E_PENDING; goto error; } - gm_hash_table_insert_const(nope_publishes, pnope->guid, pp); + hikset_insert_key(nope_publishes, &pnope->guid); if (GNET_PROPERTY(publisher_debug) > 1) { g_debug("PDHT NOPE initiating publishing for GUID %s at %s <%s> " @@ -1782,11 +1793,15 @@ /** * Initialize the Gnutella DHT layer. */ -G_GNUC_COLD void +void G_COLD pdht_init(void) { - aloc_publishes = g_hash_table_new(sha1_hash, sha1_eq); - nope_publishes = g_hash_table_new(guid_hash, guid_eq); + aloc_publishes = hikset_create( + offsetof(struct pdht_publish, u.aloc.sha1), + HASH_KEY_FIXED, SHA1_RAW_SIZE); + nope_publishes = hikset_create( + offsetof(struct pdht_publish, u.nope.guid), + HASH_KEY_FIXED, GUID_RAW_SIZE); ZERO(&pdht_proxy); pdht_prox_install_republish(PDHT_PROX_DELAY); } @@ -1795,11 +1810,10 @@ * Hash table iterator to free a pdht_publish_t */ static void -free_publish_kv(gpointer unused_key, gpointer val, gpointer unused_x) +free_publish_kv(void *val, void *unused_x) { pdht_publish_t *pp = val; - (void) unused_key; (void) unused_x; pdht_free_publish(pp, FALSE); @@ -1808,7 +1822,7 @@ /** * Shutdown the Gnutella DHT layer. */ -G_GNUC_COLD void +void G_COLD pdht_close(void) { if (pdht_proxy.pp != NULL) { @@ -1816,11 +1830,11 @@ } cq_cancel(&pdht_proxy.publish_ev); - g_hash_table_foreach(aloc_publishes, free_publish_kv, NULL); - gm_hash_table_destroy_null(&aloc_publishes); + hikset_foreach(aloc_publishes, free_publish_kv, NULL); + hikset_free_null(&aloc_publishes); - g_hash_table_foreach(nope_publishes, free_publish_kv, NULL); - gm_hash_table_destroy_null(&nope_publishes); + hikset_foreach(nope_publishes, free_publish_kv, NULL); + hikset_free_null(&nope_publishes); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/pdht.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/pdht.h
Changed
@@ -81,7 +81,7 @@ * @return TRUE if receiver is OK with the publishing, FALSE to request further * background attempts to publish to more nodes. */ -typedef gboolean (*pdht_cb_t)(gpointer arg, +typedef bool (*pdht_cb_t)(void *arg, pdht_error_t code, const pdht_info_t *info); /* @@ -93,12 +93,12 @@ void pdht_init(void); void pdht_close(void); -void pdht_publish_file(shared_file_t *sf, pdht_cb_t cb, gpointer arg); +void pdht_publish_file(shared_file_t *sf, pdht_cb_t cb, void *arg); const char *pdht_strerror(pdht_error_t code); -void pdht_cancel_file(const struct sha1 *sha1, gboolean callback); +void pdht_cancel_file(const struct sha1 *sha1, bool callback); void pdht_prox_publish_if_changed(void); void pdht_publish_proxy(const gnutella_node_t *n); -void pdht_cancel_nope(const struct guid *guid, gboolean callback); +void pdht_cancel_nope(const struct guid *guid, bool callback); #endif /* _core_pdht_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/pproxy.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/pproxy.c
Changed
@@ -34,6 +34,7 @@ #include "common.h" #include "pproxy.h" + #include "http.h" #include "hosts.h" #include "version.h" @@ -48,6 +49,7 @@ #include "ioheader.h" #include "ipv6-ready.h" #include "routing.h" +#include "search.h" /* For QUERY_FW2FW_FILE_INDEX */ #include "sockets.h" #include "uploads.h" @@ -57,21 +59,25 @@ #include "downloads.h" #include "features.h" +#include "hosts.h" #include "settings.h" /* For listen_addr() */ #include "token.h" #include "lib/ascii.h" #include "lib/atoms.h" #include "lib/concat.h" +#include "lib/endian.h" #include "lib/getline.h" -#include "lib/hashlist.h" #include "lib/halloc.h" +#include "lib/hashlist.h" #include "lib/header.h" -#include "lib/glib-missing.h" -#include "lib/endian.h" +#include "lib/host_addr.h" #include "lib/log.h" #include "lib/parse.h" +#include "lib/pslist.h" #include "lib/sequence.h" +#include "lib/str.h" +#include "lib/stringify.h" #include "lib/tm.h" #include "lib/unsigned.h" #include "lib/walloc.h" @@ -84,12 +90,14 @@ *** Server-side of push-proxy ***/ -static GSList *pproxies = NULL; /**< Currently active push-proxy requests */ +static pslist_t *pproxies = NULL; /**< Currently active push-proxy requests */ static void send_pproxy_error(struct pproxy *pp, int code, - const char *msg, ...) G_GNUC_PRINTF(3, 4); + const char *msg, ...) G_PRINTF(3, 4); static void pproxy_error_remove(struct pproxy *pp, int code, - const char *msg, ...) G_GNUC_PRINTF(3, 4); + const char *msg, ...) G_PRINTF(3, 4); + +static struct socket_ops pproxy_socket_ops; /** * Get rid of all the resources attached to the push-proxy struct. @@ -98,16 +106,15 @@ static void pproxy_free_resources(struct pproxy *pp) { + pproxy_check(pp); + atom_guid_free_null(&pp->guid); if (pp->io_opaque != NULL) { io_free(pp->io_opaque); g_assert(pp->io_opaque == NULL); } atom_str_free_null(&pp->user_agent); - if (pp->socket != NULL) { - g_assert(pp->socket->resource.pproxy == pp); - socket_free_null(&pp->socket); - } + socket_free_null(&pp->socket); } /** @@ -126,7 +133,7 @@ int hevcnt = 0; if (msg) { - gm_vsnprintf(reason, sizeof reason, msg, ap); + str_vbprintf(reason, sizeof reason, msg, ap); } else reason0 = '\0'; @@ -185,14 +192,14 @@ const char *logreason; char errbuf1024; - g_assert(pp != NULL); + pproxy_check(pp); if (reason) { - gm_vsnprintf(errbuf, sizeof errbuf , reason, ap); + str_vbprintf(errbuf, sizeof errbuf , reason, ap); logreason = errbuf; } else { if (pp->error_sent) { - gm_snprintf(errbuf, sizeof errbuf, "HTTP %d", pp->error_sent); + str_bprintf(errbuf, sizeof errbuf, "HTTP %d", pp->error_sent); logreason = errbuf; } else { errbuf0 = '\0'; @@ -214,9 +221,10 @@ } pproxy_free_resources(pp); - WFREE(pp); + pproxies = pslist_remove(pproxies, pp); - pproxies = g_slist_remove(pproxies, pp); + pp->magic = 0; + WFREE(pp); } /** @@ -225,7 +233,7 @@ * If no status has been sent back on the HTTP stream yet, give * them a 400 error with the reason. */ -void +void G_PRINTF(2, 3) pproxy_remove(struct pproxy *pp, const char *reason, ...) { va_list args; @@ -245,7 +253,7 @@ { va_list args, errargs; - g_assert(pp != NULL); + pproxy_check(pp); va_start(args, msg); @@ -263,12 +271,14 @@ void pproxy_timer(time_t now) { - GSList *sl; - GSList *to_remove = NULL; + pslist_t *sl; + pslist_t *to_remove = NULL; - for (sl = pproxies; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(pproxies, sl) { struct pproxy *pp = sl->data; + pproxy_check(pp); + /* * We can't call pproxy_remove() since it will remove the structure * from the list we are traversing. @@ -278,16 +288,16 @@ delta_time(now, pp->last_update) > (time_delta_t) GNET_PROPERTY(upload_connecting_timeout) ) { - to_remove = g_slist_prepend(to_remove, pp); + to_remove = pslist_prepend(to_remove, pp); } } - for (sl = to_remove; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(to_remove, sl) { struct pproxy *pp = sl->data; pproxy_error_remove(pp, 408, "Request timeout"); } - g_slist_free(to_remove); + pslist_free(to_remove); } /** @@ -299,10 +309,12 @@ struct pproxy *pp; WALLOC0(pp); + pp->magic = PPROXY_MAGIC; pp->socket = s; pp->flags = 0; /* XXX: TLS? */ pp->last_update = tm_time(); - s->resource.pproxy = pp; + + socket_attach_ops(s, SOCK_TYPE_PPROXY, &pproxy_socket_ops, pp); return pp; } @@ -316,9 +328,9 @@ * @returns TRUE if OK, FALSE if we could not figure it out, in which case * we also return an error to the calling party. */ -static gboolean +static bool get_params(struct pproxy *pp, const char *request, - const struct guid **guid_atom, guint32 *file_idx, gboolean *supports_tls) + const struct guid **guid_atom, uint32 *file_idx, bool *supports_tls) { static const struct { const char *req; @@ -334,14 +346,14 @@ const char *value; int datalen; url_params_t *up; - guint i; + uint i; g_assert(pp); g_assert(request); g_assert(guid_atom); g_assert(file_idx); g_assert(supports_tls); - + /* * Move to the start of the requested path. Note that sizeof("GET") * accounts for the trailing NUL in the string. @@ -378,7 +390,7 @@ */ attr = NULL; - for (i = 0; i < G_N_ELEMENTS(req_types); i++) { + for (i = 0; i < N_ITEMS(req_types); i++) { char *q; if (NULL != (q = is_strprefix(uri, req_typesi.req))) { @@ -401,7 +413,7 @@ if (!up) { pproxy_error_remove(pp, 400, "Malformed push-proxy request: Bad URL encoding"); - goto error; + return FALSE; } value = url_params_get(up, attr); @@ -418,6 +430,7 @@ datalen = strlen(value); if (0 == strcmp(attr, "ServerId")) { + struct guid buf; const struct guid *guid; /* @@ -426,15 +439,15 @@ if (datalen != 26 && datalen != 32) { pproxy_error_remove(pp, 400, "Malformed push-proxy request: " - "wrong length for parameter \"%s\": %d byte%s", attr, datalen, - datalen == 1 ? "" : "s"); + "wrong length for parameter \"%s\": %d byte%s", + attr, datalen, plural(datalen)); goto error; } if (GNET_PROPERTY(push_proxy_debug) > 0) g_debug("PUSH-PROXY: decoding %s=%s as base32", attr, value); - guid = base32_to_guid(value); + guid = base32_to_guid(value, &buf); if (guid == NULL) { pproxy_error_remove(pp, 400, "Malformed push-proxy request: " "parameter \"%s\" is not valid base32", attr); @@ -451,8 +464,8 @@ if (datalen != 32) { pproxy_error_remove(pp, 400, "Malformed push-proxy request: " - "wrong length for parameter \"%s\": %d byte%s", attr, datalen, - datalen == 1 ? "" : "s"); + "wrong length for parameter \"%s\": %d byte%s", + attr, datalen, plural(datalen)); goto error; } @@ -516,9 +529,9 @@ * packet on success, an empty array on failure. */ struct array -build_push(guint8 ttl, guint8 hops, const struct guid *guid, - host_addr_t addr_v4, host_addr_t addr_v6, guint16 port, - guint32 file_idx, gboolean supports_tls) +build_push(uint8 ttl, uint8 hops, const struct guid *guid, + host_addr_t addr_v4, host_addr_t addr_v6, uint16 port, + uint32 file_idx, bool supports_tls) { static union { gnutella_msg_push_request_t m; @@ -528,7 +541,7 @@ size_t len = 0, size = sizeof packet; ggep_stream_t gs; host_addr_t primary; - guint32 ipv4; + uint32 ipv4; g_assert(guid); g_assert(0 != port); @@ -541,7 +554,7 @@ gnutella_header_set_ttl(header, ttl); gnutella_header_set_hops(header, hops); } - + gnutella_msg_push_request_set_guid(&packet.m, guid); STATIC_ASSERT(49 == sizeof packet.m); @@ -554,6 +567,8 @@ */ primary = is_host_addr(addr_v4) ? addr_v4 : addr_v6; + if (!is_host_addr(primary)) + return zero_array; ggep_stream_init(&gs, p, size); @@ -561,7 +576,7 @@ supports_tls = is_my_address_and_port(addr_v4, port) || is_my_address_and_port(addr_v6, port); } - + if (supports_tls) { if (!ggep_stream_pack(&gs, GGEP_NAME(TLS), NULL, 0, 0)) { g_warning("could not write GGEP \"TLS\" extension into PUSH"); @@ -582,7 +597,7 @@ ipv6_ready_has_no_ipv4(ipv4) || (is_host_addr(addr_v6) && host_addr_is_ipv6(addr_v6)) ) { - const guint8 *ipv6 = host_addr_ipv6(&addr_v6); + const uint8 *ipv6 = host_addr_ipv6(&addr_v6); g_assert(ipv6 != NULL); @@ -630,7 +645,7 @@ const char *result; if (vendor) { - gboolean faked = !version_check(vendor, token, addr); + bool faked = !version_check(vendor, token, addr); if (faked) { char name1024; @@ -652,7 +667,7 @@ { const char *endptr; host_addr_t addr; - guint16 port; + uint16 port; if (NULL == buf) return; @@ -708,12 +723,12 @@ { struct gnutella_socket *s = pp->socket; const char *request = getline_str(s->getline); - struct gnutella_node *n; + gnutella_node_t *n; const char *buf; char *token; char *user_agent; - GSList *nodes; - gboolean supports_tls = FALSE; + pslist_t *nodes; + bool supports_tls = FALSE; if (GNET_PROPERTY(push_proxy_trace) & SOCK_TRACE_IN) { g_debug("----Push-proxy request from %s:\n%s", @@ -739,10 +754,19 @@ supports_tls |= header_get_feature("tls", header, NULL, NULL); - if (GNET_PROPERTY(push_proxy_debug) > 0) - g_debug("PUSH-PROXY: %s requesting a push to %s for file #%d", - host_addr_to_string(s->addr), guid_hex_str(pp->guid), - pp->file_idx); + if (QUERY_FW2FW_FILE_INDEX == pp->file_idx) + gnet_stats_inc_general(GNR_PUSH_PROXY_TCP_FW2FW); + + if (GNET_PROPERTY(push_proxy_debug) > 0) { + if (QUERY_FW2FW_FILE_INDEX == pp->file_idx) { + g_debug("PUSH-PROXY: %s requesting FW-FW connection with %s", + host_addr_to_string(s->addr), guid_hex_str(pp->guid)); + } else { + g_debug("PUSH-PROXY: %s requesting a push to %s for file #%d", + host_addr_to_string(s->addr), guid_hex_str(pp->guid), + pp->file_idx); + } + } /* * Make sure they provide an X-Node header so we know whom to set up @@ -764,7 +788,7 @@ if (!host_is_valid(pp->addr_v6, pp->port)) { pp->addr_v6 = zero_host_addr; } - + if (!is_host_addr(pp->addr_v4) && !is_host_addr(pp->addr_v6)) { pproxy_error_remove(pp, 400, "Malformed push-proxy request: supplied no valid address"); @@ -772,8 +796,8 @@ } if ( - !host_addr_equal(pp->addr_v4, s->addr) && - !host_addr_equal(pp->addr_v6, s->addr) + !host_addr_equiv(pp->addr_v4, s->addr) && + !host_addr_equiv(pp->addr_v6, s->addr) ) { g_warning("push-proxy request from %s (%s) said node was at %s/%s", host_addr_to_string(s->addr), pproxy_vendor_str(pp), @@ -800,7 +824,7 @@ if (NULL == n) { n = node_by_guid(pp->guid); if (n != NULL) - gnet_stats_count_general(GNR_PUSH_PROXY_ROUTE_NOT_PROXIED, 1); + gnet_stats_inc_general(GNR_PUSH_PROXY_ROUTE_NOT_PROXIED); } if (n != NULL) { @@ -816,13 +840,13 @@ pp->file_idx, supports_tls); if (NULL == packet.data) { - g_warning("Failed to send push for %s/%s (index=%lu)", + g_warning("failed to send push for %s/%s (index=%lu)", host_addr_port_to_string(pp->addr_v4, pp->port), host_addr_port_to_string2(pp->addr_v6, pp->port), - (gulong) pp->file_idx); + (ulong) pp->file_idx); } else { gmsg_sendto_one(n, packet.data, packet.size); - gnet_stats_count_general(GNR_PUSH_PROXY_TCP_RELAYED, 1); + gnet_stats_inc_general(GNR_PUSH_PROXY_TCP_RELAYED); http_send_status(HTTP_PUSH_PROXY, pp->socket, 202, FALSE, NULL, 0, "Push-proxy: message sent to node"); @@ -855,25 +879,25 @@ g_warning("Failed to send push to %s/%s (index=%lu)", host_addr_port_to_string(pp->addr_v4, pp->port), host_addr_port_to_string2(pp->addr_v6, pp->port), - (gulong) pp->file_idx); + (ulong) pp->file_idx); } else { - int cnt; + size_t cnt; gmsg_sendto_all(nodes, packet.data, packet.size); - gnet_stats_count_general(GNR_PUSH_PROXY_BROADCASTED, 1); + gnet_stats_inc_general(GNR_PUSH_PROXY_BROADCASTED); - cnt = g_slist_length(nodes); + cnt = pslist_length(nodes); http_send_status(HTTP_PUSH_PROXY, pp->socket, 203, FALSE, NULL, 0, - "Push-proxy: message sent through Gnutella (via %d node%s)", - cnt, cnt == 1 ? "" : "s"); + "Push-proxy: message sent through Gnutella " + "(via %zd node%s)", cnt, plural(cnt)); pp->error_sent = 203; - pproxy_remove(pp, "Push sent via Gnutella (%d node%s) for GUID %s", - cnt, cnt == 1 ? "" : "s", guid_hex_str(pp->guid)); + pproxy_remove(pp, "Push sent via Gnutella (%zd node%s) for GUID %s", + cnt, plural(cnt), guid_hex_str(pp->guid)); } - gm_slist_free_null(&nodes); + pslist_free_null(&nodes); return; } @@ -901,7 +925,7 @@ */ sorry: - gnet_stats_count_general(GNR_PUSH_PROXY_FAILED, 1); + gnet_stats_inc_general(GNR_PUSH_PROXY_FAILED); pproxy_error_remove(pp, 410, "Push proxy: no route to servent GUID %s", guid_hex_str(pp->guid)); @@ -912,58 +936,58 @@ ***/ static inline struct pproxy * -PPROXY(gpointer obj) +PPROXY(void *obj) { return obj; } static void -err_line_too_long(gpointer obj, header_t *unused_head) +err_line_too_long(void *obj, header_t *unused_head) { (void) unused_head; pproxy_error_remove(PPROXY(obj), 413, "Header too large"); } static void -err_header_error_tell(gpointer obj, int error) +err_header_error_tell(void *obj, int error) { send_pproxy_error(PPROXY(obj), 413, "%s", header_strerror(error)); } static void -err_header_error(gpointer obj, int error) +err_header_error(void *obj, int error) { pproxy_remove(PPROXY(obj), "Failed (%s)", header_strerror(error)); } static void -err_input_exception(gpointer obj, header_t *unused_head) +err_input_exception(void *obj, header_t *unused_head) { (void) unused_head; pproxy_remove(PPROXY(obj), "Failed (Input Exception)"); } static void -err_input_buffer_full(gpointer obj) +err_input_buffer_full(void *obj) { pproxy_error_remove(PPROXY(obj), 500, "Input buffer full"); } static void -err_header_read_error(gpointer obj, int error) +err_header_read_error(void *obj, int error) { pproxy_remove(PPROXY(obj), "Failed (Input error: %s)", g_strerror(error)); } static void -err_header_read_eof(gpointer obj, header_t *unused_head) +err_header_read_eof(void *obj, header_t *unused_head) { (void) unused_head; pproxy_remove(PPROXY(obj), "Failed (EOF)"); } static void -err_header_extra_data(gpointer obj, header_t *unused_head) +err_header_extra_data(void *obj, header_t *unused_head) { (void) unused_head; pproxy_error_remove(PPROXY(obj), 400, "Extra data after HTTP header"); @@ -981,12 +1005,35 @@ }; static void -call_pproxy_request(gpointer obj, header_t *header) +call_pproxy_request(void *obj, header_t *header) { pproxy_request(PPROXY(obj), header); } /** + * Callback invoked when the push-proxy socket is destroyed. + */ +static void +pproxy_socket_destroy(gnutella_socket_t *s, void *owner, const char *reason) +{ + struct pproxy *pp = owner; + + pproxy_check(pp); + g_assert(s == pp->socket); + + pproxy_remove(pp, "%s", reason); +} + +/** + * Server-side push-proxy socket callbacks. + */ +static struct socket_ops pproxy_socket_ops = { + NULL, /* connect_failed */ + NULL, /* connected */ + pproxy_socket_destroy, /* destroy */ +}; + +/** * Create new push-proxy request and begin reading HTTP headers. */ void @@ -1013,16 +1060,17 @@ void pproxy_close(void) { - GSList *l; + pslist_t *l; - for (l = pproxies; l; l = g_slist_next(l)) { + PSLIST_FOREACH(pproxies, l) { struct pproxy *pp = l->data; pproxy_free_resources(pp); + pp->magic = 0; WFREE(pp); } - gm_slist_free_null(&pproxies); + pslist_free_null(&pproxies); } /*** @@ -1066,8 +1114,7 @@ * HTTP async callback for error notifications. */ static void -cproxy_http_error_ind(struct http_async *handle, - http_errtype_t type, gpointer v) +cproxy_http_error_ind(struct http_async *handle, http_errtype_t type, void *v) { struct cproxy *cp = http_async_get_opaque(handle); @@ -1094,7 +1141,7 @@ * HTTP async callback for header reception notification. * @returns whether processing can continue. */ -static gboolean +static bool cproxy_http_header_ind(struct http_async *handle, header_t *header, int code, const char *message) { @@ -1148,23 +1195,31 @@ cp->directly = FALSE; break; case 400: - g_warning("push-proxy at %s (%s) for %s file #%u reported HTTP %d: %s", - host_addr_port_to_string(cp->addr, cp->port), cproxy_vendor_str(cp), - guid_hex_str(cp->guid), cp->file_idx, code, message); + if (GNET_PROPERTY(push_proxy_debug)) { + g_warning("push-proxy at %s (%s) for %s file #%u " + "reported HTTP %d: %s", + host_addr_port_to_string(cp->addr, cp->port), + cproxy_vendor_str(cp), guid_hex_str(cp->guid), + cp->file_idx, code, message); + } /* FALL THROUGH */ case 410: download_proxy_failed(cp->d); break; default: - g_warning("push-proxy at %s (%s) for %s file #%u " - "sent unexpected HTTP %d: %s", - host_addr_port_to_string(cp->addr, cp->port), cproxy_vendor_str(cp), - guid_hex_str(cp->guid), cp->file_idx, code, message); + /* Not following specifications, or not understanding push-proxy! */ + if (GNET_PROPERTY(push_proxy_debug)) { + g_warning("push-proxy at %s (%s) for %s file #%u " + "sent unexpected HTTP %d: %s", + host_addr_port_to_string(cp->addr, cp->port), + cproxy_vendor_str(cp), guid_hex_str(cp->guid), + cp->file_idx, code, message); + } download_proxy_failed(cp->d); break; } - if (GNET_PROPERTY(push_proxy_debug) > 0 && cp->sent) + if (GNET_PROPERTY(push_proxy_debug) > 1 && cp->sent) g_debug("PUSH-PROXY at %s (%s) sent PUSH for %s file #%u %s", host_addr_port_to_string(cp->addr, cp->port), cproxy_vendor_str(cp), guid_hex_str(cp->guid), cp->file_idx, @@ -1190,7 +1245,7 @@ char addr_v4_buf128; char addr_v6_buf128; host_addr_t addr; - gboolean has_ipv4 = FALSE; + bool has_ipv4 = FALSE; g_assert(len <= INT_MAX); @@ -1202,7 +1257,7 @@ "X-Node: ", host_addr_port_to_string(addr, GNET_PROPERTY(listen_port)), "\r\n", - (void *) 0); + NULL_PTR); } addr = listen_addr6(); @@ -1216,10 +1271,10 @@ has_ipv4 ? "X-Node-IPv6: " : "X-Node: ", host_addr_port_to_string(addr, GNET_PROPERTY(listen_port)), "\r\n", - (void *) 0); + NULL_PTR); } - - return gm_snprintf(buf, len, + + return str_bprintf(buf, len, "%s %s HTTP/1.1\r\n" "User-Agent: %s\r\n" "Connection: close\r\n" @@ -1247,7 +1302,7 @@ static void cproxy_sent_request(const struct http_async *unused_ha, const struct gnutella_socket *s, const char *req, size_t len, - gboolean deferred) + bool deferred) { (void) unused_ha; @@ -1298,14 +1353,13 @@ } static void -cproxy_http_start(cqueue_t *unused_cq, gpointer obj) +cproxy_http_start(cqueue_t *cq, void *obj) { struct cproxy *cp = obj; - (void) unused_cq; cproxy_check(cp); - cp->udp_ev = NULL; + cq_zero(cq, &cp->udp_ev); cproxy_http_request(cp); } @@ -1328,8 +1382,8 @@ * @returns created client proxy. */ struct cproxy * -cproxy_create(struct download *d, const host_addr_t addr, guint16 port, - const struct guid *guid, guint32 file_idx) +cproxy_create(struct download *d, const host_addr_t addr, uint16 port, + const struct guid *guid, uint32 file_idx) { struct cproxy *cp; struct array packet; @@ -1360,7 +1414,7 @@ * --RAM, 2010-10-17 */ - packet = build_push(GNET_PROPERTY(my_ttl), 0 /* Hops */, + packet = build_push(GNET_PROPERTY(max_ttl), 0 /* Hops */, cp->guid, listen_addr(), listen_addr6(), cp->port, cp->file_idx, tls_enabled()); @@ -1392,7 +1446,7 @@ concat_strings(path, sizeof path, "/gnutella/push-proxy?ServerId=", guid_base32_str(cp->guid), tls_enabled() ? "&tls=true" : "", - (void *) 0); + NULL_PTR); /* * Try to connect immediately: if we can't connect, no need to continue. @@ -1496,7 +1550,7 @@ * @return whether timestamp is more recent than last addition made to * the push-proxy set. */ -gboolean +bool pproxy_set_older_than(const pproxy_set_t *ps, time_t t) { if (NULL == ps) @@ -1522,7 +1576,7 @@ WALLOC0(ps); ps->magic = PPROXY_SET_MAGIC; - ps->proxies = hash_list_new(gnet_host_hash, gnet_host_eq); + ps->proxies = hash_list_new(gnet_host_hash, gnet_host_equal); ps->max_proxies = max_proxies; return ps; @@ -1566,17 +1620,22 @@ /** * Add a push-proxy to the set. * - * @return TRUE if host was added, FALSE if we already knew it. + * @return TRUE if host was added, FALSE if we already knew it or the + * host was invalid. */ -gboolean -pproxy_set_add(pproxy_set_t *ps, const host_addr_t addr, guint16 port) +bool +pproxy_set_add(pproxy_set_t *ps, const host_addr_t addr, uint16 port) { gnet_host_t host; - gboolean added = FALSE; + bool added = FALSE; pproxy_set_check(ps); + if (!host_is_valid(addr, port)) + return FALSE; + gnet_host_set(&host, addr, port); + if (hash_list_contains(ps->proxies, &host)) { hash_list_moveto_head(ps->proxies, &host); } else { @@ -1602,6 +1661,12 @@ for (i = gnet_host_vec_count(vec) - 1; i >= 0; i--) { gnet_host_t host = gnet_host_vec_get(vec, i); + host_addr_t addr = gnet_host_get_addr(&host); + uint16 port = gnet_host_get_port(&host); + + if (!host_is_valid(addr, port)) + continue; + if (hash_list_contains(ps->proxies, &host)) { hash_list_moveto_head(ps->proxies, &host); } else { @@ -1624,10 +1689,17 @@ pproxy_set_check(ps); for (i = 0; i < proxy_count; i++) { - if (hash_list_contains(ps->proxies, &proxiesi)) { - hash_list_moveto_head(ps->proxies, &proxiesi); + gnet_host_t *host = &proxiesi; + host_addr_t addr = gnet_host_get_addr(host); + uint16 port = gnet_host_get_port(host); + + if (!host_is_valid(addr, port)) + continue; + + if (hash_list_contains(ps->proxies, host)) { + hash_list_moveto_head(ps->proxies, host); } else { - hash_list_prepend(ps->proxies, gnet_host_dup(&proxiesi)); + hash_list_prepend(ps->proxies, gnet_host_dup(host)); } } @@ -1640,8 +1712,8 @@ * * @return TRUE if push-proxy was found and removed, FALSE if it was missing. */ -gboolean -pproxy_set_remove(pproxy_set_t *ps, const host_addr_t addr, guint16 port) +bool +pproxy_set_remove(pproxy_set_t *ps, const host_addr_t addr, uint16 port) { gnet_host_t key; gnet_host_t *item;
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/pproxy.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/pproxy.h
Changed
@@ -47,29 +47,37 @@ *** Server side ***/ +enum pproxy_magic { PPROXY_MAGIC = 0x037fa833 }; + /** * A push proxy request we received. */ struct pproxy { + enum pproxy_magic magic; struct gnutella_socket *socket; int error_sent; /**< HTTP error code sent back */ time_t last_update; host_addr_t addr_v4; /**< IPv4 of the requesting servent */ host_addr_t addr_v6; /**< IPv6 of the requesting servent */ - guint16 port; /**< Port where GIV should be sent back */ - const char *user_agent;/**< User-Agent string */ + uint16 port; /**< Port where GIV should be sent back */ + const char *user_agent; /**< User-Agent string */ const struct guid *guid;/**< GUID (atom) to which push should be sent */ - guint32 file_idx; /**< File index to request (0 if none supplied) */ - guint32 flags; - gpointer io_opaque; /**< Opaque I/O callback information */ + uint32 file_idx; /**< File index to request (0 if none supplied) */ + uint32 flags; + void *io_opaque; /**< Opaque I/O callback information */ }; +static inline void +pproxy_check(const struct pproxy * const p) +{ + g_assert(p != NULL); + g_assert(PPROXY_MAGIC == p->magic); +} + #define pproxy_vendor_str(p) ((p)->user_agent ? (p)->user_agent : "") void pproxy_add(struct gnutella_socket *s); -void pproxy_remove(struct pproxy *pp, - const char *reason, ...) G_GNUC_PRINTF(2, 3); void pproxy_timer(time_t now); void pproxy_close(void); @@ -78,14 +86,14 @@ ***/ struct cproxy *cproxy_create(struct download *d, - const host_addr_t addr, guint16 port, const struct guid *guid, - guint32 file_idx); + const host_addr_t addr, uint16 port, const struct guid *guid, + uint32 file_idx); void cproxy_free(struct cproxy *cp); void cproxy_reparent(struct download *d, struct download *cd); -struct array build_push(guint8 ttl, guint8 hops, +struct array build_push(uint8 ttl, uint8 hops, const struct guid *guid, host_addr_t addr_v4, host_addr_t addr_v6, - guint16 port, guint32 file_idx, gboolean supports_tls); + uint16 port, uint32 file_idx, bool supports_tls); /*** *** Push proxy set @@ -95,14 +103,14 @@ pproxy_set_t *pproxy_set_allocate(size_t max_proxies); void pproxy_set_free_null(pproxy_set_t **ps_ptr); -gboolean pproxy_set_add(pproxy_set_t *ps, const host_addr_t addr, guint16 port); +bool pproxy_set_add(pproxy_set_t *ps, const host_addr_t addr, uint16 port); void pproxy_set_add_vec(pproxy_set_t *ps, const gnet_host_vec_t *vec); void pproxy_set_add_array(pproxy_set_t *ps, gnet_host_t *proxies, int proxy_count); -gboolean pproxy_set_remove(pproxy_set_t *ps, - const host_addr_t addr, guint16 port); +bool pproxy_set_remove(pproxy_set_t *ps, + const host_addr_t addr, uint16 port); size_t pproxy_set_count(const pproxy_set_t *ps); -gboolean pproxy_set_older_than(const pproxy_set_t *ps, time_t t); +bool pproxy_set_older_than(const pproxy_set_t *ps, time_t t); void pproxy_set_foreach(const pproxy_set_t *ps, GFunc func, void *user_data); gnet_host_t *pproxy_set_head(const pproxy_set_t *ps); sequence_t *pproxy_set_sequence(const pproxy_set_t *ps);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/publisher.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/publisher.c
Changed
@@ -64,12 +64,14 @@ #include "lib/dbmw.h" #include "lib/dbstore.h" #include "lib/file.h" -#include "lib/glib-missing.h" +#include "lib/hikset.h" #include "lib/misc.h" -#include "lib/tm.h" +#include "lib/str.h" #include "lib/stringify.h" +#include "lib/tm.h" #include "lib/unsigned.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ #define PUBLISHER_CALLOUT 10000 /**< Heartbeat every 10 seconds */ @@ -119,7 +121,7 @@ time_t last_enqueued; /**< When file was last enqueued */ time_t last_publish; /**< When file was last published */ time_t last_delayed; /**< When republish event was set */ - guint8 backgrounded; /**< Whether PDHT is continuing publishing */ + uint8 backgrounded; /**< Whether PDHT is continuing publishing */ }; static inline void @@ -129,7 +131,7 @@ g_assert(PUBLISHER_MAGIC == pe->magic); } -static GHashTable *publisher_sha1; /** Known entries by SHA1 */ +static hikset_t *publisher_sha1; /** Known entries by SHA1 */ /** * Private callout queue used to trigger republish events. @@ -154,7 +156,7 @@ struct pubdata { time_t next_enqueue; /**< When file should be enqueued again */ time_t expiration; /**< Expiration date of published information */ - guint8 version; /**< Structure version */ + uint8 version; /**< Structure version */ }; static void publisher_handle(struct publisher_entry *pe); @@ -170,7 +172,8 @@ pd = dbmw_read(db_pubdata, sha1, NULL); if (NULL == pd && dbmw_has_ioerr(db_pubdata)) { - g_warning("DBMW \"%s\" I/O error, bad things could happen...", + s_warning_once_per(LOG_PERIOD_MINUTE, + "DBMW \"%s\" I/O error, bad things could happen...", dbmw_name(db_pubdata)); } @@ -192,6 +195,7 @@ (sf && sf != SHARE_REBUILDING && shared_file_is_partial(sf)) ? "partial " : "", (sf && sf != SHARE_REBUILDING) ? shared_file_name_nfc(sf) : ""); + shared_file_unref(&sf); } } @@ -214,12 +218,12 @@ * Free publisher entry. */ static void -publisher_entry_free(struct publisher_entry *pe, gboolean do_remove) +publisher_entry_free(struct publisher_entry *pe, bool do_remove) { publisher_check(pe); if (do_remove) { - g_hash_table_remove(publisher_sha1, pe->sha1); + hikset_remove(publisher_sha1, pe->sha1); delete_pubdata(pe->sha1); } @@ -235,14 +239,13 @@ * Callout queue callback to handle an entry. */ static void -handle_entry(cqueue_t *unused_cq, gpointer obj) +handle_entry(cqueue_t *cq, void *obj) { struct publisher_entry *pe = obj; - (void) unused_cq; publisher_check(pe); - pe->publish_ev = NULL; + cq_zero(cq, &pe->publish_ev); publisher_handle(pe); } @@ -279,6 +282,7 @@ "partial " : "", (sf && sf != SHARE_REBUILDING) ? shared_file_name_nfc(sf) : "", compact_time(delay), msg != NULL ? msg : "<no reason>"); + shared_file_unref(&sf); } } @@ -328,7 +332,7 @@ info->presence >= PUBLISH_MIN_PROBABILITY ) { delay = expiration - PUBLISH_SAFETY; - gnet_stats_count_general(GNR_DHT_PUBLISHING_SATISFACTORY, +1); + gnet_stats_inc_general(GNR_DHT_PUBLISHING_SATISFACTORY); } else { g_assert(uint_is_positive(info->all_roots)); delay = @@ -343,13 +347,13 @@ /** * Is publishing acceptable or should we attempt background republish? */ -gboolean +bool publisher_is_acceptable(const pdht_info_t *info) { return info->presence >= PUBLISH_MIN_PROBABILITY || info->all_roots >= publisher_minimum || !info->can_bg; } - + /** * Publishing callback invoked when asynchronous publication is completed, * or ended with an error. @@ -358,14 +362,14 @@ * publishing layer to continue attempts to failed STORE roots and report * on progress using the same callback. */ -static gboolean -publisher_done(gpointer arg, pdht_error_t code, const pdht_info_t *info) +static bool +publisher_done(void *arg, pdht_error_t code, const pdht_info_t *info) { struct publisher_entry *pe = arg; struct pubdata *pd; int delay = PUBLISH_BUSY; - gboolean expired = FALSE; - gboolean accepted = TRUE; + bool expired = FALSE; + bool accepted = TRUE; publisher_check(pe); @@ -386,7 +390,7 @@ expired = TRUE; } if (expired) - gnet_stats_count_general(GNR_DHT_REPUBLISHED_LATE, +1); + gnet_stats_inc_general(GNR_DHT_REPUBLISHED_LATE); } } @@ -476,7 +480,7 @@ if (pe->last_publish) { time_delta_t elapsed = delta_time(tm_time(), pe->last_publish); - gm_snprintf(after, sizeof after, + str_bprintf(after, sizeof after, " after %s", compact_time(elapsed)); if (pd != NULL) { @@ -487,7 +491,7 @@ } } - gm_snprintf(retry, sizeof retry, "%s", compact_time(delay)); + str_bprintf(retry, sizeof retry, "%s", compact_time(delay)); g_debug("PUBLISHER SHA-1 %s %s%s\"%s\" %spublished to %u node%s%s: %s" " (%stook %s, total %u node%s, proba %.3f%%, retry in %s," @@ -498,13 +502,15 @@ "partial " : "", (sf && sf != SHARE_REBUILDING) ? shared_file_name_nfc(sf) : "", pe->last_publish ? "re" : "", - info->roots, 1 == info->roots ? "" : "s", + info->roots, plural(info->roots), after, pdht_strerror(code), late, compact_time(delta_time(tm_time(), pe->last_enqueued)), - info->all_roots, 1 == info->all_roots ? "" : "s", + info->all_roots, plural(info->all_roots), info->presence * 100.0, retry, info->can_bg ? "can" : "no", info->path_len, accepted ? "OK" : "INCOMPLETE"); + + shared_file_unref(&sf); } /* @@ -545,10 +551,10 @@ publisher_handle(struct publisher_entry *pe) { shared_file_t *sf; - gboolean is_partial = FALSE; + bool is_partial = FALSE; int alt_locs; time_delta_t min_uptime; - guint32 avg_uptime; + uint32 avg_uptime; publisher_check(pe); g_assert(NULL == pe->publish_ev); @@ -587,7 +593,7 @@ * Wait when rebuilding the library. */ - if (sf == SHARE_REBUILDING) { + if (SHARE_REBUILDING == sf) { publisher_retry(pe, PUBLISH_BUSY, "library being rebuilt"); return; } @@ -603,7 +609,7 @@ (!sha1_hash_available(sf) || !sha1_hash_is_uptodate(sf)) ) { publisher_retry(pe, PUBLISH_BUSY, "SHA-1 of file unknown yet"); - return; + goto done; } /* @@ -629,7 +635,7 @@ delay = MAX(delay, PUBLISH_BUSY); publisher_retry(pe, delay, "minimum average uptime not reached yet"); - return; + goto done; } /* @@ -649,12 +655,11 @@ if (GNET_PROPERTY(publisher_debug)) { g_debug("PUBLISHER SHA-1 %s %s\"%s\" has %d download mesh " "entr%s, skipped", sha1_to_string(pe->sha1), - is_partial ? "partial " : "", - shared_file_name_nfc(sf), - alt_locs, 1 == alt_locs ? "y" : "ies"); + is_partial ? "partial " : "", shared_file_name_nfc(sf), + alt_locs, plural_y(alt_locs)); } publisher_hold(pe, PUBLISH_POPULAR, "popular file"); - return; + goto done; } /* @@ -663,7 +668,7 @@ if (!dht_enabled()) { publisher_hold(pe, PUBLISH_BUSY, "DHT disabled"); - return; + goto done; } /* @@ -679,7 +684,7 @@ fi->done < GNET_PROPERTY(pfsp_minimum_filesize) ) { publisher_hold(pe, PUBLISH_BUSY, "PFSP minima not reached"); - return; + goto done; } } @@ -707,7 +712,7 @@ } publisher_retry(pe, delay, "first-time delay"); - return; + goto done; } } } @@ -735,6 +740,11 @@ pe->last_enqueued = tm_time(); pdht_publish_file(sf, publisher_done, pe); + + /* FALL THROUGH */ + +done: + shared_file_unref(&sf); } /** @@ -755,7 +765,7 @@ * If already known, ignore silently. */ - if (g_hash_table_lookup(publisher_sha1, sha1)) + if (hikset_lookup(publisher_sha1, sha1)) return; /* @@ -795,16 +805,35 @@ */ pe = publisher_entry_alloc(sha1); - gm_hash_table_insert_const(publisher_sha1, pe->sha1, pe); + hikset_insert_key(publisher_sha1, &pe->sha1); publisher_handle(pe); } /** + * Wrapper over publisher_add() to let other threads call it via a TEQ event. + */ +void +publisher_add_event(void *sha1) +{ + /* + * The DBMW layer is not yet thread-safe as of 2013-11-05 so we need to + * funnel back publishing requests to the main thread. Even when the + * DBMW layer is made thread-safe, it might actually be more efficient to + * still send back requests via TEQ to the main thread. This will avoid + * setting the SDBM layer as thread-safe as well, since we don't need + * the locks in the main use cases. + * --RAM, 2013-11-05 + */ + + publisher_add(sha1); +} + +/** * Serialization routine for pubdata. */ static void -serialize_pubdata(pmsg_t *mb, gconstpointer data) +serialize_pubdata(pmsg_t *mb, const void *data) { const struct pubdata *pd = data; @@ -827,7 +856,7 @@ * Deserialization routine for pubdata. */ static void -deserialize_pubdata(bstr_t *bs, gpointer valptr, size_t len) +deserialize_pubdata(bstr_t *bs, void *valptr, size_t len) { struct pubdata *pd = valptr; @@ -855,8 +884,8 @@ /** * Periodic DB synchronization. */ -static gboolean -publisher_sync(gpointer unused_obj) +static bool +publisher_sync(void *unused_obj) { (void) unused_obj; @@ -868,9 +897,8 @@ * DBMW foreach iterator to remove expired DB keys. * @return TRUE if entry must be deleted. */ -static gboolean -publisher_remove_expired(gpointer u_key, - gpointer value, size_t u_len, gpointer u_data) +static bool +publisher_remove_expired(void *u_key, void *value, size_t u_len, void *u_data) { const struct pubdata *pd = value; @@ -897,7 +925,7 @@ if (GNET_PROPERTY(publisher_debug)) { count = dbmw_count(db_pubdata); g_debug("PUBLISHER scanning %u retrieved SHA1%s", - (unsigned) count, 1 == count ? "" : "s"); + (unsigned) count, plural(count)); } dbmw_foreach_remove(db_pubdata, publisher_remove_expired, NULL); @@ -906,16 +934,16 @@ if (GNET_PROPERTY(publisher_debug)) { g_debug("PUBLISHER kept information about %u SHA1%s", - (unsigned) count, 1 == count ? "" : "s"); + (unsigned) count, plural(count)); } - dbstore_shrink(db_pubdata); + dbstore_compact(db_pubdata); } /** * Initialize the DHT publisher. */ -G_GNUC_COLD void +void G_COLD publisher_init(void) { size_t i; @@ -923,11 +951,9 @@ dbstore_packing_t packing = { serialize_pubdata, deserialize_pubdata, NULL }; - publish_cq = cq_submake("publisher", callout_queue, PUBLISHER_CALLOUT); - publisher_sha1 = g_hash_table_new(sha1_hash, sha1_eq); - - /* Legacy: remove after 0.97 -- RAM, 2011-05-03 */ - dbstore_move(settings_config_dir(), settings_dht_db_dir(), db_pubdata_base); + publish_cq = cq_main_submake("publisher", PUBLISHER_CALLOUT); + publisher_sha1 = hikset_create( + offsetof(struct publisher_entry, sha1), HASH_KEY_FIXED, SHA1_RAW_SIZE); db_pubdata = dbstore_open(db_pubdata_what, settings_dht_db_dir(), db_pubdata_base, kv, packing, PUBLISH_DB_CACHE_SIZE, @@ -935,7 +961,7 @@ cq_periodic_add(publish_cq, PUBLISH_SYNC_PERIOD, publisher_sync, NULL); - for (i = 0; i < G_N_ELEMENTS(inverse_decimation); i++) { + for (i = 0; i < N_ITEMS(inverse_decimation); i++) { double n = i + 1.0; double v = log(n / KDA_K); @@ -947,7 +973,7 @@ } } - for (i = 0; i < G_N_ELEMENTS(inverse_decimation); i++) { + for (i = 0; i < N_ITEMS(inverse_decimation); i++) { if (inverse_decimationi >= PUBLISH_MIN_DECIMATION) { publisher_minimum = i + 1; break; @@ -968,11 +994,10 @@ * Hash table iterator callback to free entry. */ static void -free_entry(gpointer key, gpointer val, gpointer data) +free_entry(void *val, void *data) { struct publisher_entry *pe = val; - (void) key; (void) data; publisher_entry_free(pe, FALSE); @@ -982,9 +1007,8 @@ * DBMW foreach iterator to remove keys otherwise unknown by the publisher. * @return TRUE if entry is to be deleted. */ -static gboolean -publisher_remove_orphan(gpointer key, - gpointer u_value, size_t u_len, gpointer u_data) +static bool +publisher_remove_orphan(void *key, void *u_value, size_t u_len, void *u_data) { const sha1_t *sha1 = key; @@ -992,13 +1016,13 @@ (void) u_len; (void) u_data; - return NULL == g_hash_table_lookup(publisher_sha1, sha1); + return !hikset_contains(publisher_sha1, sha1); } /** * Shutdown the DHT publisher. */ -G_GNUC_COLD void +void G_COLD publisher_close(void) { /* @@ -1011,8 +1035,8 @@ * Final cleanup. */ - g_hash_table_foreach(publisher_sha1, free_entry, NULL); - gm_hash_table_destroy_null(&publisher_sha1); + hikset_foreach(publisher_sha1, free_entry, NULL); + hikset_free_null(&publisher_sha1); dbstore_close(db_pubdata, settings_dht_db_dir(), db_pubdata_base); db_pubdata = NULL;
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/publisher.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/publisher.h
Changed
@@ -45,9 +45,10 @@ void publisher_close(void); void publisher_add(const sha1_t *sha1); +void publisher_add_event(void *sha1); int publisher_delay(const pdht_info_t *info, time_delta_t expiration); -gboolean publisher_is_acceptable(const pdht_info_t *info); +bool publisher_is_acceptable(const pdht_info_t *info); #endif /* _core_publisher_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/qhit.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/qhit.c
Changed
@@ -33,6 +33,8 @@ #include "common.h" +#include "gtk-gnutella.h" /* For GTA_VENDOR_CODE */ + #include "qhit.h" #include "bsched.h" #include "dmesh.h" /* For dmesh_fill_alternate() */ @@ -43,6 +45,7 @@ #include "ipp_cache.h" #include "ipv6-ready.h" #include "nodes.h" +#include "search.h" /* For QUERY_FW2FW_FILE_INDEX */ #include "settings.h" /* For listen_ip() */ #include "share.h" #include "sockets.h" /* For socket_listen_port() */ @@ -53,13 +56,17 @@ #include "if/core/main.h" /* For main_get_build() */ #include "lib/array.h" -#include "lib/getdate.h" #include "lib/endian.h" -#include "lib/misc.h" -#include "lib/random.h" +#include "lib/getdate.h" +#include "lib/hashing.h" +#include "lib/hset.h" #include "lib/product.h" +#include "lib/pslist.h" +#include "lib/random.h" #include "lib/sequence.h" +#include "lib/stringify.h" #include "lib/tm.h" + #include "lib/override.h" /* Must be the last header included */ /* @@ -93,11 +100,11 @@ size_t max_size; /**< max query hit size */ const struct guid *muid; /**< the MUID to put in all query hits */ const struct array *token; /**< Optional secure OOB token */ - GHashTable *ht; /**< Records file indices and SHA1 atoms */ + hset_t *hs; /**< Records file indices and SHA1 atoms */ qhit_process_t process; /**< processor once query hit is built */ - gpointer udata; /**< processor argument */ - gboolean open; /**< Set if found_open() was used */ + void *udata; /**< processor argument */ unsigned flags; /**< Set of QHIT_F_* flags */ + unsigned open:1; /**< Set if found_open() was used */ }; static struct found_struct * @@ -125,7 +132,7 @@ found_get()->files += n; } -static gboolean +static bool found_ggep_h(void) { return booleanize(found_get()->flags & QHIT_F_GGEP_H); @@ -195,8 +202,8 @@ return sizeof f->data - f->pos; } -static gboolean -found_write(gconstpointer data, size_t length) +static bool +found_write(const void *data, size_t length) { struct found_struct *f = found_get(); @@ -220,8 +227,8 @@ { struct found_struct *f = found_get(); gnutella_msg_search_results_t *msg; - guint32 connect_speed; /* Connection speed, in kbits/s */ - guint32 ipv4; + uint32 connect_speed; /* Connection speed, in kbits/s */ + uint32 ipv4; size_t len; g_assert(!f->open); @@ -236,7 +243,7 @@ gnutella_header_set_muid(header, f->muid); gnutella_header_set_function(header, GTA_MSG_SEARCH_RESULTS); - /* The TTL is overriden later if sending inbound */ + /* The TTL is overridden later if sending inbound */ gnutella_header_set_ttl(header, 1); gnutella_header_set_hops(header, 0); gnutella_header_set_size(header, len); @@ -308,7 +315,7 @@ static void found_init(size_t max_size, const struct guid *xuid, unsigned flags, - qhit_process_t proc, gpointer udata, const struct array *token) + qhit_process_t proc, void *udata, const struct array *token) { struct found_struct *f = found_get(); @@ -316,7 +323,7 @@ g_assert(xuid != NULL); g_assert(proc != NULL); g_assert(token != NULL); - g_assert(NULL == f->ht); + g_assert(NULL == f->hs); f->max_size = max_size; f->muid = xuid; @@ -325,7 +332,7 @@ f->udata = udata; f->open = FALSE; f->token = token; - f->ht = g_hash_table_new(pointer_hash_func, NULL); + f->hs = hset_create(HASH_KEY_SELF, 0); } static void @@ -333,23 +340,15 @@ { struct found_struct *f = found_get(); - gm_hash_table_destroy_null(&f->ht); + hset_free_null(&f->hs); } -static gboolean +static bool found_contains(const void *key) { struct found_struct *f = found_get(); - return gm_hash_table_contains(f->ht, key); -} - -static size_t -found_contains_count(void) -{ - struct found_struct *f = found_get(); - - return g_hash_table_size(f->ht); + return hset_contains(f->hs, key); } static void @@ -357,26 +356,23 @@ { struct found_struct *f = found_get(); - gm_hash_table_insert_const(f->ht, key, NULL); + hset_insert(f->hs, key); } -static time_t release_date; - /** * Processor for query hits sent inbound. */ static void -qhit_send_node(gpointer data, size_t len, gpointer udata) +qhit_send_node(void *data, size_t len, void *udata) { gnutella_node_t *n = udata; gnutella_header_t *packet_head = data; - guint ttl; + uint ttl; if (GNET_PROPERTY(dbg) > 3) { g_debug("flushing query hit (%u entr%s, %u bytes sofar) to %s", - (guint) found_file_count(), - found_file_count() == 1 ? "y" : "ies", - (guint) found_size(), + (uint) found_file_count(), plural_y(found_file_count()), + (uint) found_size(), node_addr(n)); } @@ -392,7 +388,7 @@ */ if (gnutella_header_get_hops(&n->header) == 0) { - g_warning("qhit_send_node(): hops=0, bug in route_message()?"); + g_warning("%s(): hops=0, bug in route_message()?", G_STRFUNC); /* Can't send message with TTL=0 */ gnutella_header_set_hops(&n->header, 1); } @@ -407,8 +403,10 @@ static void qhit_log_ggep_write_failure(const char *id) { - if (GNET_PROPERTY(qhit_debug)) - g_warning("QHIT could not write GGEP \"%s\" extension", id); + if (GNET_PROPERTY(qhit_debug)) { + g_warning("QHIT could not write GGEP \"%s\" extension: %s", + id, ggep_errstr()); + } } /** @@ -427,8 +425,8 @@ * It is compatible with BearShare's one in the "open data" section. */ - memcpy(trailer, "GTKG", 4); /* Vendor code */ - trailer4 = 2; /* Open data size */ + memcpy(trailer, GTA_VENDOR_CODE, 4);/* Vendor code */ + trailer4 = 2; /* Open data size */ trailer5 = 0x04 | 0x08 | 0x20; /* Valid flags we set */ trailer6 = 0x01; /* Our flags (valid firewall bit) */ @@ -465,45 +463,15 @@ */ { - guint8 major = product_get_major(); - guint8 minor = product_get_minor(); - guint8 revchar = product_get_revchar(); - guint8 patch = product_get_patchlevel(); - guint32 release; - guint32 date = release_date; - guint32 build; - guint8 version = 1; /* This is GTKGV version 1 */ - guint8 osname; - guint8 flags; - guint8 commit_len; - size_t commit_bytes; - const sha1_t *commit; - gboolean ok; - - flags = GTKGV_F_GIT | GTKGV_F_OS; - if (version_is_dirty()) - flags |= GTKGV_F_DIRTY; - - poke_be32(&release, date); - poke_be32(&build, product_get_build()); - - commit = version_get_commit(&commit_len); - commit_bytes = (1 + commit_len) / 2; - osname = ggept_gtkgv_osname_value(); + char bufGTKGV_MAX_LEN; + size_t len; + bool ok; + + len = ggept_gtkgv_build(buf, sizeof buf); ok = ggep_stream_begin(&gs, GGEP_NAME(GTKGV), 0) && - ggep_stream_write(&gs, &version, 1) && - ggep_stream_write(&gs, &major, 1) && - ggep_stream_write(&gs, &minor, 1) && - ggep_stream_write(&gs, &patch, 1) && - ggep_stream_write(&gs, &revchar, 1) && - ggep_stream_write(&gs, &release, 4) && - ggep_stream_write(&gs, &build, 4) && - ggep_stream_write(&gs, &flags, 1) && - ggep_stream_write(&gs, &commit_len, 1) && - ggep_stream_write(&gs, commit, commit_bytes) && - ggep_stream_write(&gs, &osname, 1) && + ggep_stream_write(&gs, buf, len) && ggep_stream_end(&gs); if (!ok) @@ -512,7 +480,7 @@ { const struct array *token = found_token(); - + if ( token->data && !ggep_stream_pack(&gs, GGEP_NAME(SO), token->data, token->size, 0) @@ -545,7 +513,7 @@ GNET_PROPERTY(give_server_hostname) && !is_null_or_empty(GNET_PROPERTY(server_hostname)) ) { - gboolean ok; + bool ok; ok = ggep_stream_pack(&gs, GGEP_NAME(HNAME), GNET_PROPERTY(server_hostname), @@ -570,7 +538,7 @@ ipv6 = host_addr_is_ipv6(addr) ? addr : listen_addr6(); if (is_host_addr(ipv6) && host_addr_is_ipv6(ipv6)) { - const guint8 *data = host_addr_ipv6(&ipv6); + const uint8 *data = host_addr_ipv6(&ipv6); if (!ggep_stream_pack(&gs, GGEP_NAME(6), data, 16, 0)) qhit_log_ggep_write_failure("6"); } @@ -617,25 +585,54 @@ } /** + * Generate a random index that is not conflicting with any of the entries + * already present in the query hit being constructed. + */ +static uint32 +qhit_random_index(void) +{ + unsigned i; + + /* + * Generate a random file index, unique to this query hit. + * + * This is for the sake of our own spam detector which will + * frown upon duplicate file indices. + */ + + for (i = 0; i < 100; i++) { + uint32 file_index = 1 + random_value(INT_MAX - 1); + + if (QUERY_FW2FW_FILE_INDEX == file_index) + continue; + + if (!found_contains(uint_to_pointer(file_index))) + return file_index; + } + + g_error("%s(): no luck with random number generator", G_STRFUNC); +} + +/** * Add file to current query hit. * * @returns TRUE if we inserted the record, FALSE if we refused it due to - * lack of space. + * lack of space, or because the file is no longer shared. */ -static gboolean +static bool add_file(const shared_file_t *sf) { - gboolean sha1_available; + bool sha1_available; gnet_host_t hvecQHIT_MAX_ALT; int hcnt = 0; - guint32 fs32, fs32_le, idx_le; + uint32 fs32, fs32_le, idx_le; int ggep_len; - gboolean ok; + bool ok; ggep_stream_t gs; size_t left, needed; - gpointer start; - gboolean is_partial; - guint32 file_index; + void *start; + bool is_partial; + uint32 file_index; is_partial = shared_file_is_partial(sf); needed = 8 + 2 + shared_file_name_nfc_len(sf); /* size of hit entry */ @@ -653,32 +650,45 @@ file_index = shared_file_index(sf); - if (!is_partial) { - g_assert_log( - !found_contains(uint_to_pointer(file_index)), - "file_index=%u (%s SHA1), qhit_contains=%zu, qhit_files=%zu", - (unsigned) file_index, sha1_available ? "has" : "no", - found_contains_count(), found_file_count()); - } else { - unsigned i; + /* + * A zero file index means the file is no longer known in the library. + * + * This can happen when there was a concurrent rescan happening after + * the query hit list was done but before the query hit is actually + * generated, especially if this is an OOB-delivered hit, computed a + * while back. + */ + + if G_UNLIKELY(0 == file_index) { + if (GNET_PROPERTY(qhit_debug)) { + g_warning("QHIT skipping file %s (de-indexed by library rescan)", + shared_file_path(sf)); + } + return FALSE; /* Cannot add file */ + } + if (!is_partial) { /* - * Generate a random file index, unique to this query hit. + * Due to concurrent rescan, the new file index could be conflicting + * with the file index of other entries already present in the query + * hit. This must not happend, as duplicate file indices are wrong + * and typically indicate spam. + * + * It is also possible that the legitimate valid file index is in + * conflict with a previously generated random file index for a + * partial file. * - * This is for the sake of our own spam detector which will - * frown upon duplicate file indices. + * FIXME: + * We could reserve a region in the uint32 space for these fake partial + * indices to avoid that problem. */ - for (i = 0; i < 100; i++) { - file_index = 1 + random_value(INT_MAX - 1); - - if (!found_contains(uint_to_pointer(file_index))) - goto unique_file_index; - } - g_error("no luck with random number generator"); + if (found_contains(uint_to_pointer(file_index))) + file_index = qhit_random_index(); + } else { + file_index = qhit_random_index(); } -unique_file_index: found_insert(uint_to_pointer(file_index)); /* @@ -710,7 +720,7 @@ found_insert(sha1); /* SHA1 are atoms, address is unique */ needed += 9 + SHA1_BASE32_SIZE; - hcnt = dmesh_fill_alternate(sha1, hvec, G_N_ELEMENTS(hvec)); + hcnt = dmesh_fill_alternate(sha1, hvec, N_ITEMS(hvec)); needed += hcnt * 18 + 6; /* Conservative, assumes IPv6 only */ } @@ -794,7 +804,19 @@ */ if (is_partial && !shared_file_is_finished(sf)) { - ok = ggep_stream_pack(&gs, GGEP_NAME(PRU), NULL, 0, GGEP_W_COBS); + time_t mtime = shared_file_modification_time(sf); + filesize_t available = shared_file_available(sf); + char bufsizeof mtime + sizeof available; + uint len; + + /* + * Starting with 0.98.4, we emit a payload in the "PRU" key to indicate + * the last modification time of the file and the amount of bytes + * available on the server. --RAM, 2012-11-03 + */ + + len = ggept_stamp_filesize_encode(mtime, available, buf, sizeof buf); + ok = ggep_stream_pack(&gs, GGEP_NAME(PRU), buf, len, GGEP_W_COBS); if (!ok) qhit_log_ggep_write_failure("PRU"); } @@ -807,7 +829,7 @@ if (sha1_available && found_ggep_h()) { const struct sha1 * const sha1 = shared_file_sha1(sf); const struct tth * const tth = shared_file_tth(sf); - const guint8 type = tth ? GGEP_H_BITPRINT : GGEP_H_SHA1; + const uint8 type = tth ? GGEP_H_BITPRINT : GGEP_H_SHA1; ok = ggep_stream_begin(&gs, GGEP_NAME(H), GGEP_W_COBS) && @@ -843,10 +865,10 @@ */ if (fs32 == ~0U) { - char bufsizeof(guint64); + char bufsizeof(uint64); int len; - len = ggept_filesize_encode(shared_file_size(sf), buf); + len = ggept_filesize_encode(shared_file_size(sf), buf, sizeof buf); g_assert(len > 0 && UNSIGNED(len) <= sizeof buf); @@ -871,7 +893,7 @@ { const char *rp = shared_file_relative_path(sf); - + if (rp) { ok = ggep_stream_pack(&gs, GGEP_NAME(PATH), rp, strlen(rp), 0); if (!ok) @@ -880,11 +902,11 @@ } { - time_t create_time; + time_t create_time; create_time = shared_file_creation_time(sf); if ((time_t) -1 != create_time) { - char bufsizeof(guint64); + char bufsizeof(uint64); int len; /* @@ -893,7 +915,7 @@ */ create_time = MAX(0, create_time); - len = ggept_ct_encode(create_time, buf); + len = ggept_ct_encode(create_time, buf, sizeof buf); g_assert(UNSIGNED(len) <= sizeof buf); ok = ggep_stream_pack(&gs, GGEP_NAME(CT), buf, len, GGEP_W_COBS); @@ -951,7 +973,7 @@ */ static void found_reset(size_t max_size, const struct guid *muid, unsigned flags, - qhit_process_t process, gpointer udata, const struct array *token) + qhit_process_t process, void *udata, const struct array *token) { g_assert(process != NULL); g_assert(max_size <= INT_MAX); @@ -970,12 +992,14 @@ * @param flags a combination of QHIT_F_* flags */ void -qhit_send_results(struct gnutella_node *n, GSList *files, int count, +qhit_send_results(gnutella_node_t *n, pslist_t *files, int count, const struct guid *muid, unsigned flags) { - GSList *sl; + pslist_t *sl; int sent = 0; + g_assert(!NODE_TALKS_G2(n)); + /* * We can't use n->header.muid as the query's MUID but must rely on the * parameter we're given. Indeed, we're delivering a local hit here, @@ -987,7 +1011,7 @@ found_reset(QHIT_SIZE_THRESHOLD, muid, flags, qhit_send_node, n, &zero_array); - for (sl = files; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(files, sl) { shared_file_t *sf = sl->data; if (add_file(sf)) sent++; @@ -997,7 +1021,7 @@ if (0 != found_file_count()) /* Still some unflushed results */ flush_match(); /* Send last packet */ - g_slist_free(files); + pslist_free(files); if (GNET_PROPERTY(dbg) > 3) g_debug("sent %d/%d hits to %s", sent, count, node_addr(n)); @@ -1030,11 +1054,11 @@ * @param token secure OOBv3 token to include in reply */ void -qhit_build_results(const GSList *files, int count, size_t max_msgsize, - qhit_process_t cb, gpointer udata, const struct guid *muid, unsigned flags, +qhit_build_results(const pslist_t *files, int count, size_t max_msgsize, + qhit_process_t cb, void *udata, const struct guid *muid, unsigned flags, const struct array *token) { - const GSList *sl; + const pslist_t *sl; int sent; g_assert(cb != NULL); @@ -1042,7 +1066,7 @@ found_reset(max_msgsize, muid, flags, cb, udata, token); - for (sl = files, sent = 0; sl && sent < count; sl = g_slist_next(sl)) { + for (sl = files, sent = 0; sl && sent < count; sl = pslist_next(sl)) { const shared_file_t *sf = sl->data; if (add_file(sf)) @@ -1065,7 +1089,7 @@ void qhit_init(void) { - release_date = date2time(product_get_date(), tm_time()); + /* Nada */ } /**
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/qhit.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/qhit.h
Changed
@@ -36,7 +36,7 @@ #include "common.h" -typedef void (*qhit_process_t)(gpointer data, size_t len, gpointer udata); +typedef void (*qhit_process_t)(void *data, size_t len, void *udata); /** * Query hit generation flags. @@ -45,21 +45,30 @@ #define QHIT_F_IPV6 (1U << 1) /**< Host accepts IPv6 addresses */ #define QHIT_F_IPV6_ONLY (1U << 2) /**< Host only wants IPv6 addresses */ +/** + * Query hit generation flags for G2 queries. + */ +#define QHIT_F_G2_URL (1U << 31) /**< Wants URL (stating we share it) */ +#define QHIT_F_G2_DN (1U << 30) /**< Wants DN (distinguished name) */ +#define QHIT_F_G2_ALT (1U << 29) /**< Wants ALT (alt-locs) */ + /* * Public interface. */ struct gnutella_node; -struct array; +struct array; struct guid; +struct pslist; void qhit_init(void); void qhit_close(void); -void qhit_send_results(struct gnutella_node *n, GSList *files, int count, +void qhit_send_results(struct gnutella_node *n, struct pslist *files, int count, const struct guid *muid, unsigned flags); -void qhit_build_results(const GSList *files, int count, size_t max_msgsize, - qhit_process_t cb, gpointer udata, const struct guid *muid, unsigned flags, +void qhit_build_results(const struct pslist *files, + int count, size_t max_msgsize, + qhit_process_t cb, void *udata, const struct guid *muid, unsigned flags, const struct array *token); #endif /* _core_qhit_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/qrp.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/qrp.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2014 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -27,8 +27,15 @@ * * Query Routing Protocol (LimeWire's scheme). * + * As of 2014-01-03, GTKG's handling of the Bloom filter changed. We used + * to require that ALL words in a query match an entry in the QRP to let the + * query be forwarded to a leaf node or another ultrapeer (for inter-UP QRP). + * But LimeWire has always used a different logic: if there are more than 2 + * words, then only 2/3rd of the words are required to match to let the query + * pass. Hence we changed our behaviour to match that of legacy LimeWires. + * * @author Raphael Manfredi - * @date 2002-2003 + * @date 2002-2003, 2014 */ #include "common.h" @@ -48,21 +55,29 @@ #include "settings.h" #include "share.h" +#include "g2/node.h" + #include "lib/atoms.h" #include "lib/bg.h" #include "lib/cq.h" -#include "lib/glib-missing.h" #include "lib/endian.h" #include "lib/halloc.h" +#include "lib/hashing.h" +#include "lib/hset.h" +#include "lib/htable.h" +#include "lib/mutex.h" #include "lib/pow2.h" +#include "lib/pslist.h" #include "lib/random.h" #include "lib/sha1.h" +#include "lib/spinlock.h" #include "lib/str.h" #include "lib/stringify.h" #include "lib/tm.h" +#include "lib/unsigned.h" #include "lib/utf8.h" -#include "lib/wordvec.h" #include "lib/walloc.h" +#include "lib/wordvec.h" #include "lib/zlib_util.h" #include "if/gnet_property.h" @@ -82,38 +97,51 @@ #define qrp_debugging(lvl) G_UNLIKELY(GNET_PROPERTY(qrp_debug) > (lvl)) +/** + * Lock to protect the global variables containing the routine tables. + * + * It has to be a mutex because there can be some recursive grabbing in + * the qrp_comp_done() callback. + */ +static mutex_t qrp_task_lock = MUTEX_INIT; + +#define QRP_TASK_LOCK mutex_lock(&qrp_task_lock) +#define QRP_TASK_UNLOCK mutex_unlock(&qrp_task_lock) + struct query_hash { - guint32 hashcode; + uint32 hashcode; enum query_hsrc source; }; struct query_hashvec { struct query_hash *vec; /**< Vector of at most `size' entries */ - guint8 count; /**< Amount of slots actually taken */ - guint8 size; /**< Amount of slots in vector */ - guint8 has_urn; /**< Whether an URN is present in the query */ - guint8 whats_new; /**< Query is "What's New?", must be forwarded */ + uint8 count; /**< Amount of slots actually taken */ + uint8 size; /**< Amount of slots in vector */ + uint8 has_urn; /**< Whether an URN is present in the query */ + uint8 whats_new; /**< Query is "What's New?", must be forwarded */ }; -gboolean +static cperiodic_t *qrp_monitor_ev; + +bool qhvec_has_urn(const struct query_hashvec *qhv) { return 0 != qhv->has_urn; } -gboolean +bool qhvec_whats_new(const struct query_hashvec *qhv) { return 0 != qhv->whats_new; } void -qhvec_set_whats_new(struct query_hashvec *qhv, gboolean val) +qhvec_set_whats_new(struct query_hashvec *qhv, bool val) { qhv->whats_new = booleanize(val); } -guint +uint qhvec_count(const struct query_hashvec *qhv) { return qhv->count; @@ -147,10 +175,10 @@ enum qrp_route_magic magic; int refcnt; /**< Amount of references */ int generation; /**< Generation number */ - guint8 *arena; /**< Where table starts */ + uint8 *arena; /**< Where table starts */ int slots; /**< Amount of slots in table */ int infinity; /**< Value for "infinity" */ - guint32 client_slots; /**< Only for received tables, for shrinking ctrl */ + uint32 client_slots; /**< Only for received tables, for shrinking ctrl */ int bits; /**< Amount of bits used in table size (received) */ int set_count; /**< Amount of slots set in table */ int fill_ratio; /**< 100 * fill ratio for table (received) */ @@ -160,18 +188,26 @@ unsigned reset:1; /**< This is a new table, after a RESET */ unsigned compacted:1; /**< Table was compacted */ unsigned cancelled:1; /**< Must supersede with next version */ + unsigned is_empty:1; /**< Whether table is empty (all slots cleared) */ /** * Whether this routing table can route the given URN query. */ - gboolean (*can_route_urn)(const query_hashvec_t *, + bool (*can_route_urn)(const query_hashvec_t *, const struct routing_table *rt); /** * Whether this routing table can route the keyword query. */ - gboolean (*can_route)(const query_hashvec_t *, + bool (*can_route)(const query_hashvec_t *, const struct routing_table *rt); }; +static inline void +qrt_check(const struct routing_table * const rt) +{ + g_assert(rt != NULL); + g_assert(QRP_ROUTE_MAGIC == rt->magic); +} + enum routing_patch_magic { ROUTING_PATCH_MAGIC = 0x011906cf }; @@ -182,29 +218,65 @@ struct routing_patch { enum routing_patch_magic magic; int refcnt; /**< Amount of references */ - guint8 *arena; + uint8 *arena; /**< The patch physical arena */ int size; /**< Number of entries in table */ int infinity; /**< Value of infinity for the table patched */ int len; /**< Length of arena in bytes */ - int entry_bits; - gboolean compressed; + int entry_bits; /**< Amount of bits for each slot in the patch */ + uint compressed:1; /**< Whether patch was compressed */ + uint reversed:1; /**< Whether each byte was reversed (for G2) */ }; static struct routing_table *routing_table; /**< Our table */ -static struct routing_patch *routing_patch; /**< Against empty table */ static struct routing_table *local_table; /**< Table for local files */ static struct routing_table *merged_table; /**< From all our leaves */ static int generation; +/** + * Pre-computed routing table patches against an empty table. + * + * We have the 4-bit patch, the 1-bit patch and the byte-reversed 1-bit patch + * for G2 hubs. + */ +static struct routing_patch *routing_patch4; +static struct routing_patch *routing_patch1; +static struct routing_patch *routing_revpatch1; + static void qrt_compress_cancel_all(void); static void qrt_patch_compute( - struct routing_table *rt, struct routing_patch **rpp); -static guint32 qrt_dump(struct routing_table *rt, gboolean full); + struct routing_patch *rp, struct routing_patch **rpp); +static uint32 qrt_dump(struct routing_table *rt, bool full); void test_hash(void); -static gboolean -qrp_can_route_default(const query_hashvec_t *qhv, - const struct routing_table *rt); +static bool qrp_can_route_default( + const query_hashvec_t *qhv, const struct routing_table *rt); +static void qrt_patch_fire_ready(struct routing_patch *rp); + +/** + * Generate a description of the patch into a static string. + * + * @return pointer to static data. + */ +static const char * +qrp_patch_to_string(const struct routing_patch * const rp) +{ + str_t *s = str_private(G_STRFUNC, 80); + char buf16; + + if (rp->compressed) { + int theoretical = rp->size * rp->entry_bits / 8; + str_bprintf(buf, sizeof buf, ", %.2f%%", rp->len * 100.0 / theoretical); + } else { + buf0 = '\0'; + } + + str_printf(s, "%s%s%d-bit routing patch (%d slots, %d bytes%s)", + rp->reversed ? "reversed " : "", + rp->compressed ? "compressed " : "", + rp->entry_bits, rp->size, rp->len, buf); + + return str_2c(s); +} /** * Install supplied routing_table as the global `routing_table'. @@ -214,10 +286,14 @@ { g_assert(rt != NULL); + QRP_TASK_LOCK; + if (routing_table != NULL) qrt_unref(routing_table); routing_table = qrt_ref(rt); + QRP_TASK_UNLOCK; + /* * Update some properties with might have changed compared to the local * table when running in UP mode, since we're merging our table with @@ -225,10 +301,10 @@ * ratio nor the amount of keywords present. */ - gnet_prop_set_guint32_val(PROP_QRP_SLOTS, (guint32) rt->slots); - gnet_prop_set_guint32_val(PROP_QRP_SLOTS_FILLED, (guint32) rt->set_count); + gnet_prop_set_guint32_val(PROP_QRP_SLOTS, (uint32) rt->slots); + gnet_prop_set_guint32_val(PROP_QRP_SLOTS_FILLED, (uint32) rt->set_count); gnet_prop_set_guint32_val(PROP_QRP_FILL_RATIO, - (guint32) (100.0 * rt->set_count / rt->slots)); + (uint32) (100.0 * rt->set_count / rt->slots)); } /** @@ -248,12 +324,12 @@ * * @param s A keyword in canonic form (UTF-8, NFC, lowercased, etc.). */ -static inline guint32 +static inline uint32 qrp_hashcode(const char *s) { - guint32 x = 0; /* The running total */ - guint32 uc; - guint j; /* The bit position in xor */ + uint32 x = 0; /* The running total */ + uint32 uc; + uint j; /* The bit position in xor */ /* * First turn x0...end-1 into a number by treating all 4-byte @@ -265,8 +341,8 @@ * x XOR 0==x. */ - for (j = 0; '\0' != (uc = (guchar) *s); j = (j + 8) & 24) { - guint retlen; + for (j = 0; '\0' != (uc = (uchar) *s); j = (j + 8) & 24) { + uint retlen; uc = utf8_decode_char_fast(s, &retlen); if (!uc) @@ -291,7 +367,7 @@ * (Cormen, Leiserson, and Rivest) CLR */ - return x * 0x4F1BBCDCUL; + return x * GOLDEN_RATIO_31; /* Must keep only lowest 31 bits */ } /** @@ -300,7 +376,7 @@ * The hashing function, defined by the QRP specifications. * Naturally, everyone must use the SAME hashing function! */ -static inline guint32 +static inline uint32 qrp_hash(const char *s, int bits) { return qrp_hashcode(s) >> (32 - bits); @@ -316,19 +392,20 @@ * Code should use RT_SLOT_READ() only. */ +#if 0 static inline unsigned -RT_SLOT_READ_div(const guint8 *arena, guint i) +RT_SLOT_READ_div(const uint8 *arena, uint i) { - static const guint8 mask = { + static const uint8 mask = { 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1 }; div_t r = div(i, 8); return 0 != (arenar.quot & maskr.rem); } static inline unsigned -RT_SLOT_READ_div2(const guint8 *arena, guint i) +RT_SLOT_READ_div2(const uint8 *arena, uint i) { - static const guint8 mask = { + static const uint8 mask = { 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1 }; unsigned q, r; q = i / 8; @@ -337,33 +414,34 @@ } static inline unsigned -RT_SLOT_READ_lut(const guint8 *arena, guint i) +RT_SLOT_READ_lut(const uint8 *arena, uint i) { - static const guint8 mask = { + static const uint8 mask = { 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1 }; return 0 != (arenai >> 3 & maski & 0x7); } static inline unsigned -RT_SLOT_READ_shift_right(const guint8 *arena, guint i) +RT_SLOT_READ_shift_right(const uint8 *arena, uint i) { return 0 != (arenai >> 3 & (0x80U >> (i & 0x7))); } static inline unsigned -RT_SLOT_READ_shift_left(const guint8 *arena, guint i) +RT_SLOT_READ_shift_left(const uint8 *arena, uint i) { return 0 != (arenai >> 3 & (1U << (~i & 0x7))); } static inline unsigned -RT_SLOT_READ_and1(const guint8 *arena, guint i) +RT_SLOT_READ_and1(const uint8 *arena, uint i) { return 1U & (arenai >> 3 >> (~i & 0x7)); } +#endif /* Unused routines */ static inline unsigned -RT_SLOT_READ_and128(const guint8 *arena, guint i) +RT_SLOT_READ_and128(const uint8 *arena, uint i) { return 0 != (0x80U & (arenai >> 3 << (i & 0x7))); } @@ -380,8 +458,8 @@ * * @returns the TRUE if there is something present, FALSE otherwise. */ -static inline gboolean -RT_SLOT_READ(const guint8 *arena, guint i) +static inline bool +RT_SLOT_READ(const uint8 *arena, uint i) { /* Hopefully the fastest version: 1 memory access, 5 shift/mask/cmp ops */ @@ -395,13 +473,13 @@ * As a side effect, increment rt->set_count if the position ``i'' ends-up * being set after patching. */ -static inline G_GNUC_HOT ALWAYS_INLINE void -qrt_patch_slot(struct routing_table *rt, guint i, guint8 v) +static inline ALWAYS_INLINE void G_HOT +qrt_patch_slot(struct routing_table *rt, uint i, uint8 v) { - guint b = 0x80U >> (i & 0x7); + uint b = 0x80U >> (i & 0x7); - if (v) { - if (v & 0x80) { /* Negative value -> set bit */ + if G_UNLIKELY(v) { + if G_LIKELY(v & 0x80) { /* Negative value -> set bit */ rt->arenai >> 3 |= b; rt->set_count++; } else { /* Positive value -> clear bit */ @@ -425,12 +503,12 @@ int nsize; /* New table size */ char *narena; /* New arena */ int i; - guint mask; - guchar *p; - guchar *q; - guint32 token = 0; + uint mask; + uchar *p; + uchar *q; + uint32 token = 0; - g_assert(rt); + qrt_check(rt); g_assert(rt->slots >= 8); g_assert(0 == (rt->slots & 0x7)); /* Multiple of 8 */ g_assert(!rt->compacted); @@ -475,11 +553,11 @@ */ HFREE_NULL(rt->arena); - rt->arena = (guchar *) narena; + rt->arena = (uchar *) narena; rt->compacted = TRUE; if (qrp_debugging(4)) { - guint32 token2; + uint32 token2; g_debug("QRP dumping QRT after compaction..."); token2 = qrt_dump(rt, GNET_PROPERTY(qrp_debug) > 19); @@ -496,29 +574,29 @@ qrt_sha1(struct routing_table *rt) { static struct sha1 sha1; - SHA1Context ctx; + SHA1_context ctx; int i; int bytes; - guint8 vector8; - guint8 *p; + uint8 vector8; + uint8 *p; g_assert(rt->compacted); bytes = rt->slots / 8; - SHA1Reset(&ctx); + SHA1_reset(&ctx); for (i = 0, p = rt->arena; i < bytes; i++) { int j; - guint8 mask; - guint8 value = *p++; + uint8 mask; + uint8 value = *p++; for (j = 0, mask = 0x80; j < 8; j++, mask >>= 1) vectorj = (value & mask) ? 1 : 0; /* 1 for presence */ - SHA1Input(&ctx, vector, sizeof vector); + SHA1_INPUT(&ctx, vector); } - SHA1Result(&ctx, &sha1); + SHA1_result(&ctx, &sha1); return &sha1; } @@ -529,7 +607,8 @@ qrt_patch_ref(struct routing_patch *rp) { g_assert(ROUTING_PATCH_MAGIC == rp->magic); - rp->refcnt++; + + atomic_int_inc(&rp->refcnt); return rp; } @@ -554,29 +633,51 @@ g_assert(ROUTING_PATCH_MAGIC == rp->magic); g_assert(rp->refcnt > 0); - if (--rp->refcnt == 0) + if (atomic_int_dec_is_zero(&rp->refcnt)) qrt_patch_free(rp); } /** - * Compute patch between two (compacted) routing tables. + * Clear the default routing patches against an empty routing table. + */ +static void +qrt_patches_clear(void) +{ + if (routing_patch4 != NULL) { + qrt_patch_unref(routing_patch4); + routing_patch4 = NULL; + } + + if (routing_patch1 != NULL) { + qrt_patch_unref(routing_patch1); + routing_patch1 = NULL; + } + + if (routing_revpatch1 != NULL) { + qrt_patch_unref(routing_revpatch1); + routing_revpatch1 = NULL; + } +} + +/** + * Compute 4-bit patch between two (compacted) routing tables. * When `old' is NULL, then we compare against a table filled with "infinity". * If `old' isn't NULL, then it must have the same size as `new'. * * @returns a patch buffer (uncompressed), made of signed quartets, or NULL * if there were no differences between the two tables. If the `old' table - * was NULL, we guarantee we'll provide a non-null result. + * was NULL, we guarantee we'll provide a non-NULL result. */ static struct routing_patch * qrt_diff_4(struct routing_table *old, struct routing_table *new) { int bytes; struct routing_patch *rp; - guchar *op; - guchar *np; - guchar *pp; + uchar *op; + uchar *np; + uchar *pp; int i; - gboolean changed = FALSE; + bool changed = FALSE; g_assert(old == NULL || old->magic == QRP_ROUTE_MAGIC); g_assert(old == NULL || old->compacted); @@ -598,10 +699,23 @@ np = new->arena; for (i = 0, bytes = new->slots / 8; i < bytes; i++) { - guint8 obyte = op ? *op++ : 0x0; /* Nothing */ - guint8 nbyte = *np++; + uint8 obyte = op ? *op++ : 0x0; /* Nothing */ + uint8 nbyte = *np++; int j; - guint8 v; + uint8 v; + + /* + * Optimize computation: if bytes are equal, we can immediately + * generate 8 quartets of 0, i.e. 4 bytes. + */ + + if G_LIKELY(obyte == nbyte) { + *pp++ = 0; + *pp++ = 0; + *pp++ = 0; + *pp++ = 0; + continue; + } /* * In our compacted table, set bits indicate presence. @@ -615,7 +729,7 @@ */ for (v = 0, j = 7; j >= 0; j--) { - guint8 mask = 1 << j; + uint8 mask = 1 << j; if ((obyte & mask) ^ (nbyte & mask)) { /* Bit `j' changed */ v |= (obyte & mask) ? 0x1 : 0xf; @@ -643,6 +757,93 @@ return rp; } +/** + * Compute 1-bit patch between two (compacted) routing tables. + * When `old' is NULL, then we compare against an empty table (all zeroes). + * If `old' isn't NULL, then it must have the same size as `new'. + * + * For G2, we have to reverse all the bits in the bytes because they number + * entries in a little-endian way whereas Gnutella uses big-endian bit numbering + * within a byte. + * + * @returns a patch buffer (uncompressed), made of 1-bit flips, or NULL + * if there were no differences between the two tables. If the `old' table + * was NULL, we guarantee we'll provide a non-NULL result. + */ +static struct routing_patch * +qrt_diff_1(struct routing_table *old, struct routing_table *new, bool reverse) +{ + int bytes; + struct routing_patch *rp; + uchar *op; + uchar *np; + uchar *pp; + int i; + bool changed = FALSE; + + g_assert(old == NULL || old->magic == QRP_ROUTE_MAGIC); + g_assert(old == NULL || old->compacted); + g_assert(new->magic == QRP_ROUTE_MAGIC); + g_assert(new->compacted); + g_assert(old == NULL || new->slots == old->slots); + + WALLOC0(rp); + rp->magic = ROUTING_PATCH_MAGIC; + rp->refcnt = 1; + rp->size = new->slots; + rp->infinity = 1; /* 1-bit patch, 1 is infinity */ + rp->len = rp->size / 8; /* Each entry stored in 1 bit */ + rp->entry_bits = 1; + rp->compressed = FALSE; + rp->reversed = booleanize(reverse); + pp = rp->arena = halloc(rp->len); + + op = old ? old->arena : NULL; + np = new->arena; + + /* + * A 1-bit patch is really a flip of all the bytes. + * + * old bit new bit patch + * 0 0 0 (no change) + * 0 1 1 (flip to 1) + * 1 0 1 (fli to 0) + * 1 1 0 (no change) + * + * This is the truth table of XOR. + */ + + if (reverse) { + for (i = 0, bytes = new->slots / 8; i < bytes; i++) { + uint8 obyte = op ? *op++ : 0x0; /* Nothing */ + uint8 v = obyte ^ *np++; + + if G_LIKELY(0 == v) { + *pp++ = v; + } else { + *pp++ = reverse_byte(v); + } + } + } else { + for (i = 0, bytes = new->slots / 8; i < bytes; i++) { + uint8 obyte = op ? *op++ : 0x0; /* Nothing */ + + *pp++ = obyte ^ *np++; + } + } + + g_assert(np == (new->arena + new->slots / 8)); + g_assert(op == NULL || op == (old->arena + old->slots / 8)); + g_assert(pp == (rp->arena + rp->len)); + + if (!changed && old != NULL) { + qrt_patch_free(rp); + return NULL; + } + + return rp; +} + /* * Compression task context. */ @@ -657,34 +858,44 @@ struct routing_patch *rp; /**< Routing table being compressed */ zlib_deflater_t *zd; /**< Incremental deflater */ bgdone_cb_t usr_done; /**< User-defined callback */ - gpointer usr_arg; /**< Arg for user-defined callback */ + void *usr_arg; /**< Arg for user-defined callback */ + uint allocated:1; /**< Whether context was allocated */ + uint done:1; /**< Set when context free routine called */ + uint finished:1; /**< Task is finished */ }; -static GSList *sl_compress_tasks; - /** * Free compression context. + * + * If the compression context was not allocated, then flag it as "done" but do + * not free it. */ static void -qrt_compress_free(gpointer u) +qrt_compress_free(void *u) { struct qrt_compress_context *ctx = u; g_assert(ctx->magic == QRT_COMPRESS_MAGIC); + g_assert(!ctx->done); if (ctx->zd) { zlib_deflater_free(ctx->zd, TRUE); ctx->zd = NULL; } - ctx->magic = 0; - WFREE(ctx); + + if (ctx->allocated) { + ctx->magic = 0; + WFREE(ctx); + } else { + ctx->done = TRUE; + } } /** * Perform incremental compression. */ static bgret_t -qrt_step_compress(struct bgtask *h, gpointer u, int ticks) +qrt_step_compress(struct bgtask *h, void *u, int ticks) { struct qrt_compress_context *ctx = u; int ret; @@ -713,8 +924,9 @@ */ if (qrp_debugging(1)) { - g_debug("QRP patch: len=%d, compressed=%d (ratio %.2f%%)", - ctx->rp->len, zlib_deflater_outlen(ctx->zd), + g_debug("QRP %d-bit patch %p: len=%d, compressed=%d (ratio %.2f%%)", + ctx->rp->entry_bits, ctx->rp, ctx->rp->len, + zlib_deflater_outlen(ctx->zd), 100.0 * (ctx->rp->len - zlib_deflater_outlen(ctx->zd)) / ctx->rp->len); } @@ -750,55 +962,65 @@ * Called when the compress task is finished. * * This is really a wrapper on top of the user-supplied "done" callback - * which lets us remove the task from the list. + * which lets us wake-up the background task that launched us. */ static void -qrt_patch_compress_done(struct bgtask *h, gpointer u, bgstatus_t status, - gpointer unused_arg) +qrt_patch_compress_done(struct bgtask *h, void *u, bgstatus_t status, void *arg) { struct qrt_compress_context *ctx = u; + bgtask_t *bt = arg; - (void) unused_arg; g_assert(ctx->magic == QRT_COMPRESS_MAGIC); + ctx->finished = TRUE; /* Signal we've completed our task */ + /* - * When status is BGS_KILLED, the task is being cancelled. - * This means we're iterating on the `sl_compress_tasks' list - * so don't alter it. - * --RAM, 29/01/2003 + * If there is a non-NULL task, wake it up now that patch compression + * has been completed, unless we're being cancelled (meaning our "parent" + * task is also being cancelled -- it is cancelling us). */ - if (status != BGS_KILLED) { - g_assert(g_slist_find(sl_compress_tasks, h)); - sl_compress_tasks = g_slist_remove(sl_compress_tasks, h); - } + if (bt != NULL && status != BGS_CANCELLED && status != BGS_KILLED) + bg_task_wakeup(bt); + + if (bt != NULL) + bg_task_unref(bt); - (*ctx->usr_done)(h, u, status, ctx->usr_arg); + if (ctx->usr_done != NULL) + (*ctx->usr_done)(h, u, status, ctx->usr_arg); } /** * Compress routing patch inplace (asynchronously). * When it's done, invoke callback with specified argument. * - * @returns handle of the compressing task. - */ -static gpointer -qrt_patch_compress( - struct routing_patch *rp, - bgdone_cb_t done_callback, gpointer arg) + * The background task is created stopped, caller must invoke bg_task_run() + * to schedule it. + * + * @param rp the routing patch to compress + * @param bt if non-NULL, the background task to wakeup on completion + * @param done_cb the callback to invoke when compression is complete + * @param arg the argument to pass to the done_cb callback + * @param cp if non-NULL, use this context as the compress context + * + * @returns handle of the compressing task (stopped), NULL on error. + */ +static void * +qrt_patch_compress(struct routing_patch *rp, bgtask_t *bt, + bgdone_cb_t done_cb, void *arg, struct qrt_compress_context *cp) { struct qrt_compress_context *ctx; zlib_deflater_t *zd; struct bgtask *task; bgstep_cb_t step = qrt_step_compress; + g_assert(rp != NULL); g_assert(ROUTING_PATCH_MAGIC == rp->magic); - zd = zlib_deflater_make(rp->arena, rp->len, Z_DEFAULT_COMPRESSION); - if (zd == NULL) { - (*done_callback)(NULL, NULL, BGS_ERROR, arg); - return NULL; - } + zd = zlib_deflater_make(rp->arena, rp->len, Z_BEST_COMPRESSION); + + if (NULL == zd) + g_error("%s(): unable to initialize patch compression", G_STRFUNC); /* * Because compression is possibly a CPU-intensive operation, it @@ -806,22 +1028,24 @@ * intervals. */ - WALLOC0(ctx); + if (NULL == cp) { + WALLOC0(ctx); + ctx->allocated = TRUE; + } else { + ctx = cp; + ZERO(ctx); + } + ctx->magic = QRT_COMPRESS_MAGIC; ctx->rp = rp; ctx->zd = zd; - ctx->usr_done = done_callback; + ctx->usr_done = done_cb; ctx->usr_arg = arg; - gnet_prop_set_guint32_val(PROP_QRP_PATCH_RAW_LENGTH, (guint32) rp->len); - - task = bg_task_create("QRP patch compression", - &step, 1, ctx, qrt_compress_free, qrt_patch_compress_done, NULL); + task = bg_task_create_stopped(NULL, "QRP patch compression", + &step, 1, ctx, qrt_compress_free, qrt_patch_compress_done, bt); - if (task != NULL) - sl_compress_tasks = g_slist_prepend(sl_compress_tasks, task); - - return task; + return task; /* Can be NULL if bg task layer was shutdown already */ } /** @@ -841,7 +1065,7 @@ rt->magic = QRP_ROUTE_MAGIC; rt->name = h_strdup(name); - rt->arena = (guchar *) arena; + rt->arena = (uchar *) arena; rt->slots = slots; rt->generation = generation++; rt->refcnt = 0; @@ -854,7 +1078,7 @@ qrt_compact(rt); - gnet_prop_set_guint32_val(PROP_QRP_GENERATION, (guint32) rt->generation); + gnet_prop_set_guint32_val(PROP_QRP_GENERATION, (uint32) rt->generation); gnet_prop_set_guint32_val(PROP_QRP_MEMORY, GNET_PROPERTY(qrp_memory) + slots / 8); @@ -908,7 +1132,7 @@ * The memory area is also shrunk and the new location of the arena is * returned. */ -static gpointer +static void * qrt_shrink_arena(char *arena, int old_slots, int new_slots, int inf_val) { int factor; /* Shrink factor */ @@ -935,7 +1159,7 @@ int set = FALSE; for (k = 0; k < factor && !set; k++) { - if ((guchar) arenaj + k != inf_val) + if ((uchar) arenaj + k != inf_val) set = TRUE; } @@ -961,10 +1185,9 @@ struct routing_table * qrt_ref(struct routing_table *rt) { - g_assert(rt); - g_assert(rt->magic == QRP_ROUTE_MAGIC); + qrt_check(rt); - rt->refcnt++; + atomic_int_inc(&rt->refcnt); return rt; } @@ -975,11 +1198,10 @@ void qrt_unref(struct routing_table *rt) { - g_assert(rt); - g_assert(rt->magic == QRP_ROUTE_MAGIC); + qrt_check(rt); g_assert(rt->refcnt > 0); - if (--rt->refcnt == 0) + if (atomic_int_dec_is_zero(&rt->refcnt)) qrt_free(rt); } @@ -989,14 +1211,34 @@ void qrt_get_info(const struct routing_table *rt, qrt_info_t *qi) { - g_assert(rt); - g_assert(rt->magic == QRP_ROUTE_MAGIC); + qrt_check(rt); g_assert(rt->refcnt > 0); qi->slots = rt->slots; qi->generation = rt->generation; qi->fill_ratio = rt->fill_ratio; - qi->pass_throw = rt->pass_throw; + qi->pass_throw = rt->pass_throw & 0xff; /* In the 0..100 range */ + qi->is_empty = rt->is_empty; +} + +/** + * @return TRUE if table is empty. + */ +static bool +qrt_is_empty(const struct routing_table *rt) +{ + int i, max; + uint8 *p; + + qrt_check(rt); + g_assert(rt->compacted); + + for (max = rt->slots / 8, p = rt->arena, i = 0; i < max; i++) { + if (*p++ != 0) + return FALSE; + } + + return TRUE; } /*** @@ -1011,8 +1253,8 @@ struct merge_context { enum merge_magic magic; - GSList *tables; /* Leaf routing tables */ - guchar *arena; /* Working arena (not compacted) */ + pslist_t *tables; /* Leaf routing tables */ + uchar *arena; /* Working arena (not compacted) */ int slots; /* Amount of slots used for merged table */ }; @@ -1022,22 +1264,26 @@ * Free merge context. */ static void -merge_context_free(gpointer p) +merge_context_free(void *p) { struct merge_context *ctx = p; - GSList *sl; + pslist_t *sl; g_assert(ctx->magic == MERGE_MAGIC); + QRP_TASK_LOCK; + merge_comp = NULL; /* Task is being terminated */ merge_ctx = NULL; - for (sl = ctx->tables; sl; sl = g_slist_next(sl)) { + QRP_TASK_UNLOCK; + + PSLIST_FOREACH(ctx->tables, sl) { struct routing_table *rt = sl->data; qrt_unref(rt); } - gm_slist_free_null(&ctx->tables); + pslist_free_null(&ctx->tables); HFREE_NULL(ctx->arena); ctx->magic = 0; @@ -1048,18 +1294,18 @@ * Fetch the list of all the QRT from our leaves. */ static bgret_t -mrg_step_get_list(struct bgtask *unused_h, gpointer u, int unused_ticks) +mrg_step_get_list(struct bgtask *unused_h, void *u, int unused_ticks) { struct merge_context *ctx = u; - const GSList *sl; + const pslist_t *sl; int max_size = 0; /* Max # of slots seen in all QRT */ (void) unused_h; (void) unused_ticks; g_assert(MERGE_MAGIC == ctx->magic); - for (sl = node_all_nodes(); sl; sl = g_slist_next(sl)) { - struct gnutella_node *dn = sl->data; + PSLIST_FOREACH(node_all_gnet_nodes(), sl) { + gnutella_node_t *dn = sl->data; struct routing_table *rt = dn->recv_query_table; if (rt == NULL || !NODE_IS_LEAF(dn)) @@ -1089,7 +1335,7 @@ * referencing the table! */ - ctx->tables = g_slist_prepend(ctx->tables, qrt_ref(rt)); + ctx->tables = pslist_prepend(ctx->tables, qrt_ref(rt)); if (max_size < rt->slots) max_size = rt->slots; @@ -1115,7 +1361,7 @@ * @param slots is the number of slots in the arena */ static void -merge_table_into_arena(struct routing_table *rt, guchar *arena, int slots) +merge_table_into_arena(struct routing_table *rt, uchar *arena, int slots) { int ratio; int expand; @@ -1157,7 +1403,7 @@ #define RT_FOR_EACH_BIT_SET(ON_CHANGE) \ for (b = 0, i = 0; b < bytes; b++) { \ - guint8 entry = rt->arenab; \ + uint8 entry = rt->arenab; \ unsigned mask = 0x80; \ \ do { \ @@ -1232,7 +1478,7 @@ * Merge next leaf QRT table if node is still there. */ static bgret_t -mrg_step_merge_one(struct bgtask *unused_h, gpointer u, int ticks) +mrg_step_merge_one(struct bgtask *unused_h, void *u, int ticks) { struct merge_context *ctx = u; int ticks_used = 0; @@ -1251,7 +1497,7 @@ while (ctx->tables != NULL && ticks_used < ticks) { struct routing_table *rt = ctx->tables->data; - ctx->tables = g_slist_remove(ctx->tables, rt); + ctx->tables = pslist_remove(ctx->tables, rt); /* * If we're the only referer to this table, it means the node is @@ -1273,7 +1519,7 @@ * Create and install the table. */ static bgret_t -mrg_step_install_table(struct bgtask *unused_h, gpointer u, int unused_ticks) +mrg_step_install_table(struct bgtask *unused_h, void *u, int unused_ticks) { struct merge_context *ctx = u; @@ -1290,7 +1536,7 @@ struct routing_table *mt; if (ctx->slots != 0) mt = qrt_create("Merged table", - cast_to_gpointer(ctx->arena), ctx->slots, LOCAL_INFINITY); + cast_to_pointer(ctx->arena), ctx->slots, LOCAL_INFINITY); else { g_assert(ctx->arena == NULL); mt = qrt_empty_table("Empty merged table"); @@ -1309,26 +1555,45 @@ }; /** - * Launch asynchronous merging of the leaf node QRT tables. + * Launch asynchronous merging of the leaf node QRT tables, if none + * is alredy running. * * @param done_cb is the routine to invoke when merging is done. If NULL, then * no routine is called. + * + * @return whether task was launched */ -static void +static bool mrg_compute(bgdone_cb_t done_cb) { - struct merge_context *ctx; + bool launched; - g_assert(merge_ctx == NULL); /* No computation active */ + QRP_TASK_LOCK; - WALLOC0(ctx); - ctx->magic = MERGE_MAGIC; - merge_ctx = ctx; + g_soft_assert(merge_ctx == NULL); /* No computation active */ - merge_comp = bg_task_create("Leaf QRT merging", - merge_steps, G_N_ELEMENTS(merge_steps), - ctx, merge_context_free, - done_cb, NULL); + if (NULL == merge_ctx) { + WALLOC0(merge_ctx); + merge_ctx->magic = MERGE_MAGIC; + + merge_comp = bg_task_create_stopped(NULL, "Leaf QRT merging", + merge_steps, N_ITEMS(merge_steps), + merge_ctx, merge_context_free, + done_cb, NULL); + + if (merge_comp != NULL) { + bg_task_run(merge_comp); + launched = TRUE; + } else { + launched = FALSE; + } + } else { + launched = FALSE; + } + + QRP_TASK_UNLOCK; + + return launched; } /*** @@ -1396,11 +1661,11 @@ * Add shared file to our QRP. */ void -qrp_add_file(const shared_file_t *sf, GHashTable *words) +qrp_add_file(const shared_file_t *sf, htable_t *words) { word_vec_t *wovec; - guint wocnt; - guint i; + uint wocnt; + uint i; g_assert(sf != NULL); g_assert(words != NULL); @@ -1443,14 +1708,14 @@ * Record word if we haven't seen it yet. */ - if (g_hash_table_lookup(words, word)) { + if (htable_contains(words, word)) { continue; } else { - gpointer p; + void *p; size_t n = 1 + word_len; p = wcopy(word, n); - g_hash_table_insert(words, p, (gpointer) n); + htable_insert(words, p, size_to_pointer(n)); } if (qrp_debugging(8)) { @@ -1467,29 +1732,28 @@ */ static void -free_word(gpointer key, gpointer value, gpointer unused_udata) +free_word(const void *key, void *value, void *unused_udata) { + g_assert(size_is_positive(pointer_to_size(value))); + (void) unused_udata; - g_assert(value); - wfree(key, (size_t) value); + wfree(deconstify_pointer(key), pointer_to_size(value)); } struct unique_substrings { /* User data for unique_subtr() callback */ - GHashTable *unique; - GSList *head; + hset_t *unique; + pslist_t *head; }; static inline void -insert_substr(struct unique_substrings *u, const char *word) +insert_substr(struct unique_substrings *u, const char *word, size_t size) { - if (!g_hash_table_lookup(u->unique, word)) { - char *s; - size_t n; + if (!hset_contains(u->unique, word)) { + void *s; - n = 1 + strlen(word); - s = wcopy(word, n); - g_hash_table_insert(u->unique, s, (gpointer) n); - u->head = g_slist_prepend(u->head, s); + s = wcopy(word, size); + hset_insert(u->unique, s); + u->head = pslist_prepend(u->head, s); } } @@ -1497,29 +1761,30 @@ * Iteration callback on the hashtable containing keywords. */ static void -unique_substr(gpointer key, gpointer unused_value, gpointer udata) +unique_substr(const void *key, void *value, void *udata) { struct unique_substrings *u = udata; const char *word = key; char *s; size_t len, size, i; - (void) unused_value; + g_assert(size_is_positive(pointer_to_size(value))); /* * Add all unique (i.e. not already seen) substrings from word, all * anchored at the start, whose length range from 3 to the word length. */ - len = strlen(word); - size = len + 1; + size = pointer_to_size(value); s = wcopy(word, size); + len = size - 1; /* Trailing NUL included in size */ for (i = 0; i <= QRP_MAX_CUT_CHARS; i++) { - insert_substr(u, s); + + insert_substr(u, s, len + 1); while (len > QRP_MIN_WORD_LENGTH) { - guint retlen; + uint retlen; len--; if (utf8_decode_char_fast(&slen, &retlen)) { @@ -1535,19 +1800,20 @@ /** * Create a list of all unique substrings at least QRP_MIN_WORD_LENGTH long, - * from words held in `ht'. + * from words held in `ht' (keys are words, values are the word's length plus + * the trailing NUL). * * @returns created list, and count in `retcount'. */ -static GSList * -unique_substrings(GHashTable *ht, int *retcount) +static pslist_t * +unique_substrings(htable_t *ht, int *retcount) { struct unique_substrings u = { NULL, NULL }; /* Callback args */ - u.unique = g_hash_table_new(g_str_hash, g_str_equal); - g_hash_table_foreach(ht, unique_substr, &u); - *retcount = g_hash_table_size(u.unique); - gm_hash_table_destroy_null(&u.unique); /* Created words ref'ed by u.head */ + u.unique = hset_create(HASH_KEY_STRING, 0); + htable_foreach(ht, unique_substr, &u); + *retcount = hset_count(u.unique); + hset_free_null(&u.unique); /* Created words ref'ed by u.head */ return u.head; } @@ -1569,16 +1835,20 @@ enum qrp_magic magic; struct routing_table **rtp; /**< Points to routing table variable to fill */ struct routing_patch **rpp; /**< Points to routing patch variable to fill */ - GSList *sl_substrings; /**< List of all substrings */ - GHashTable *words; /**< Words making up the files */ + pslist_t *sl_substrings; /**< List of all substrings */ + htable_t *words; /**< Words making up the files */ + bgtask_t *compress_bt; /**< Task launched to compress patch */ int substrings; /**< Amount of substrings */ char *table; /**< Computed routing table */ int slots; /**< Amount of slots in table */ + struct routing_table *rt; /**< The routing table object we computed */ struct routing_table *st; /**< Smaller table */ struct routing_table *lt; /**< Larger table for merging (destination) */ int sidx; /**< Source index in `st' */ int lidx; /**< Merging index in `lt' */ int expand; /**< Expansion ratio from `st' to `lt' */ + int npatch; /**< Index of next patch to compute */ + struct qrt_compress_context compress_ctx; }; static struct bgtask *qrp_comp; /**< Background computation handle */ @@ -1589,14 +1859,13 @@ * and perusing in qrp_finalize_computation(), then nullify pointer. */ void -qrp_dispose_words(GHashTable **h_ptr) +qrp_dispose_words(htable_t **h_ptr) { - GHashTable *h = *h_ptr; + htable_t *h = *h_ptr; if (h != NULL) { - g_hash_table_foreach(h, free_word, NULL); - g_hash_table_destroy(h); - *h_ptr = NULL; + htable_foreach(h, free_word, NULL); + htable_free_null(h_ptr); } } @@ -1604,27 +1873,29 @@ * Free query routing table computation context. */ static void -qrp_context_free(gpointer p) +qrp_context_free(void *p) { struct qrp_context *ctx = p; - GSList *sl; + pslist_t *sl; g_assert(ctx->magic == QRP_MAGIC); qrp_dispose_words(&ctx->words); - for (sl = ctx->sl_substrings; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(ctx->sl_substrings, sl) { char *word = sl->data; size_t size; size = 1 + strlen(word); - g_assert(size > 0); + g_assert(size_is_positive(size)); wfree(word, size); } - gm_slist_free_null(&ctx->sl_substrings); + pslist_free_null(&ctx->sl_substrings); HFREE_NULL(ctx->table); + if (ctx->rt) + qrt_unref(ctx->rt); if (ctx->st) qrt_unref(ctx->st); if (ctx->lt) @@ -1638,9 +1909,8 @@ * Called when the QRP recomputation is done to free the context. */ static void -qrp_comp_context_free(gpointer p) +qrp_comp_context_free(void *p) { - qrp_comp = NULL; /* If we're called, the task is being terminated */ qrp_context_free(p); } @@ -1648,9 +1918,8 @@ * Called when the QRP merging is done to free the context. */ static void -qrp_merge_context_free(gpointer p) +qrp_merge_context_free(void *p) { - qrp_merge = NULL; /* If we're called, the task is being terminated */ qrp_context_free(p); } @@ -1660,24 +1929,30 @@ static void qrp_cancel_computation(void) { + bgtask_t *bt; + qrt_compress_cancel_all(); - if (qrp_comp) { - bg_task_cancel(qrp_comp); + QRP_TASK_LOCK; + + if (NULL != (bt = qrp_comp)) { qrp_comp = NULL; + bg_task_cancel(bt); } - if (qrp_merge) { - bg_task_cancel(qrp_merge); + if (NULL != (bt = qrp_merge)) { qrp_merge = NULL; + bg_task_cancel(bt); } + + QRP_TASK_UNLOCK; } /** * Compute all the substrings we need to insert. */ static bgret_t -qrp_step_substring(struct bgtask *unused_h, gpointer u, int unused_ticks) +qrp_step_substring(struct bgtask *unused_h, void *u, int unused_ticks) { struct qrp_context *ctx = u; @@ -1701,12 +1976,12 @@ * * @returns whether tables are identical. */ -static gboolean +static bool qrt_eq(const struct routing_table *rt, const char *arena, int slots) { int i; - g_assert(rt != NULL); + qrt_check(rt); g_assert(arena != NULL); g_assert(slots > 0); @@ -1717,8 +1992,8 @@ return 0 == memcmp(rt->arena, arena, slots); for (i = 0; i < slots; i++) { - gboolean s1 = RT_SLOT_READ(rt->arena, i); - gboolean s2 = arenai != LOCAL_INFINITY; + bool s1 = RT_SLOT_READ(rt->arena, i); + bool s2 = arenai != LOCAL_INFINITY; if (!s1 != !s2) return FALSE; } @@ -1730,18 +2005,18 @@ * Compute QRP table, iteration step. */ static bgret_t -qrp_step_compute(struct bgtask *h, gpointer u, int unused_ticks) +qrp_step_compute(struct bgtask *h, void *u, int unused_ticks) { struct qrp_context *ctx = u; char *table = NULL; int slots; int bits; - const GSList *sl; + const pslist_t *sl; int upper_thresh; int hashed = 0; int filled = 0; int conflict_ratio; - gboolean full = FALSE; + bool full = FALSE; (void) unused_ticks; g_assert(ctx->magic == QRP_MAGIC); @@ -1760,9 +2035,9 @@ table = halloc(slots); memset(table, LOCAL_INFINITY, slots); - for (sl = ctx->sl_substrings; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(ctx->sl_substrings, sl) { const char *word = sl->data; - guint idx = qrp_hash(word, bits); + uint idx = qrp_hash(word, bits); hashed++; @@ -1807,13 +2082,13 @@ if (qrp_debugging(1)) g_debug("QRP final table size: %d slots", slots); - gnet_prop_set_guint32_val(PROP_QRP_SLOTS, (guint32) slots); - gnet_prop_set_guint32_val(PROP_QRP_SLOTS_FILLED, (guint32) filled); - gnet_prop_set_guint32_val(PROP_QRP_HASHED_KEYWORDS, (guint32) hashed); + gnet_prop_set_guint32_val(PROP_QRP_SLOTS, (uint32) slots); + gnet_prop_set_guint32_val(PROP_QRP_SLOTS_FILLED, (uint32) filled); + gnet_prop_set_guint32_val(PROP_QRP_HASHED_KEYWORDS, (uint32) hashed); gnet_prop_set_guint32_val(PROP_QRP_FILL_RATIO, - (guint32) (100.0 * filled / slots)); + (uint32) (100.0 * filled / slots)); gnet_prop_set_guint32_val(PROP_QRP_CONFLICT_RATIO, - (guint32) conflict_ratio); + (uint32) conflict_ratio); /* * If we had already a table, compare it to the one we just built. @@ -1867,37 +2142,39 @@ * Create the compacted routing table object. */ static bgret_t -qrp_step_create_table(struct bgtask *unused_h, gpointer u, int unused_ticks) +qrp_step_create_table(struct bgtask *unused_h, void *u, int unused_ticks) { struct qrp_context *ctx = u; - glong elapsed; + long elapsed; (void) unused_h; (void) unused_ticks; g_assert(ctx->magic == QRP_MAGIC); g_assert(ctx->rtp != NULL); - g_assert(ctx->rpp != NULL); /* * Install new routing table and notify the nodes that it has changed. */ + ctx->rt = qrt_create("Local table", ctx->table, ctx->slots, LOCAL_INFINITY); + qrt_ref(ctx->rt); /* Created with refcnt=0 */ + ctx->table = NULL; /* Don't free table when freeing context */ + + QRP_TASK_LOCK; + if (*ctx->rtp != NULL) qrt_unref(*ctx->rtp); - *ctx->rtp = qrt_ref(qrt_create("Local table", - ctx->table, ctx->slots, LOCAL_INFINITY)); - ctx->table = NULL; /* Don't free table when freeing context */ + *ctx->rtp = qrt_ref(ctx->rt); + + QRP_TASK_UNLOCK; /* - * Now that a new routing table is available, we'll need a new routing - * patch against an empty table, to send to new connections. + * Now that a new routing table is available, we'll need new routing + * patches against an empty table, to send to new connections. */ - if (*ctx->rpp != NULL) { - qrt_patch_unref(*ctx->rpp); - *ctx->rpp = NULL; - } + qrt_patches_clear(); elapsed = delta_time(tm_time(), (time_t) GNET_PROPERTY(qrp_timestamp)); elapsed = MAX(0, elapsed); @@ -1907,10 +2184,146 @@ } /** + * Compute the routing patches against an empty routing table (those that + * need to be sent after a QRP RESET message). + */ +static bgret_t +qrp_step_create_patches(bgtask_t *bt, void *u, int unused_ticks) +{ + struct qrp_context *ctx = u; + struct routing_patch *rp = NULL; + struct routing_patch **rpp; + + (void) unused_ticks; + + /* + * See if we have been woken up after successful compression (see below + * in this step when we request sleeping). + */ + + switch (ctx->npatch) { + case 0: + rpp = NULL; + break; /* First time in the step */ + case 1: + rpp = &routing_revpatch1; + break; + case 2: + rpp = &routing_patch1; + break; + case 3: + rpp = &routing_patch4; + break; + default: + g_assert_not_reached(); /* Bug in code below */ + } + + /* + * Install the (possibly compressed) routing patch. + */ + + if (rpp != NULL) { + struct qrt_compress_context *comp_ctx = &ctx->compress_ctx; + struct routing_patch *crp; + + g_assert(comp_ctx->done); + g_assert(comp_ctx->finished); + + /* + * This is the routing patch we supplied initially and which may have + * been optionally compressed (if its final size is less than the + * original uncompressed patch). + */ + + crp = comp_ctx->rp; + g_assert(ROUTING_PATCH_MAGIC == crp->magic); + + if (qrp_debugging(1)) { + g_debug("%s(): npatch=%d, got %s", + G_STRFUNC, ctx->npatch, qrp_patch_to_string(crp)); + } + + qrt_patch_ref(crp); /* Keep it referenced for callback below */ + + QRP_TASK_LOCK; + + if (*rpp != NULL) + qrt_patch_unref(*rpp); + *rpp = crp; + + QRP_TASK_UNLOCK; + + qrt_patch_fire_ready(crp); + qrt_patch_unref(crp); /* Remove extra reference taken above */ + } + + /* + * If we moved to the Ultrapeer status, we just need the G2 1-bit reversed + * patch to send to G2 hubs (since we're always a leaf on G2 for now). + */ + + if (settings_is_ultra() && ctx->npatch > 0) + return BGR_NEXT; + + /* + * Launch the computation of the next routing table patch against an + * empty routing table. + */ + + switch (++ctx->npatch) { /* Pre-increment => same cases as above */ + case 1: + /* Compute routing_revpatch1 */ + rp = qrt_diff_1(NULL, ctx->rt, TRUE); + break; + case 2: + /* Compute routing_patch1 */ + rp = qrt_diff_1(NULL, ctx->rt, FALSE); + break; + case 3: + /* Compute routing_patch4 */ + rp = qrt_diff_4(NULL, ctx->rt); + break; + default: + return BGR_NEXT; + } + + g_assert(rp != NULL); + + /* + * We supply our own context for the patch compression, in order to know + * whether the task is completed when we are cancelled and to easily + * retrieve the compressed patch directly from the context. + * + * Therefore, there is no need to supply any user completion callback for + * this compression. + */ + + ctx->compress_bt = + qrt_patch_compress(rp, bg_task_ref(bt), NULL, NULL, &ctx->compress_ctx); + + /* + * Wait for the compression task to be completed by sleeping: its + * internal completion callback will wake us up when it's done. + */ + + if (ctx->compress_bt != NULL) { + if (qrp_debugging(1)) { + g_debug("%s(): npatch=%d, compressing %s", + G_STRFUNC, ctx->npatch, qrp_patch_to_string(rp)); + } + + bg_task_sleep(bt); + bg_task_run(ctx->compress_bt); + } + + return BGR_MORE; /* When woken up, redo this step */ +} + +/** * Install the routing table we've built, if running as leaf. */ static bgret_t -qrp_step_install_leaf(struct bgtask *unused_h, gpointer u, int unused_ticks) +qrp_step_install_leaf(struct bgtask *unused_h, void *u, int unused_ticks) { struct qrp_context *ctx = u; @@ -1918,7 +2331,6 @@ (void) unused_ticks; g_assert(ctx->magic == QRP_MAGIC); g_assert(ctx->rtp != NULL); - g_assert(ctx->rpp != NULL); /* * Default patch (stored in *ctx->rpp), is computed asynchronously. @@ -1933,7 +2345,6 @@ if (!settings_is_ultra()) { install_routing_table(*ctx->rtp); install_merged_table(NULL); /* We're not an ultra node */ - qrt_patch_compute(routing_table, ctx->rpp); node_qrt_changed(routing_table); return BGR_DONE; /* Done! */ } @@ -1945,7 +2356,7 @@ * Wait for the `merged_table' to be ready. */ static bgret_t -qrp_step_wait_for_merged_table(struct bgtask *h, gpointer u, int unused_ticks) +qrp_step_wait_for_merged_table(struct bgtask *h, void *u, int unused_ticks) { struct qrp_context *ctx = u; int ratio; @@ -2017,7 +2428,7 @@ * Merge `local_table' with `merged_table'. */ static bgret_t -qrp_step_merge_with_leaves(struct bgtask *unused_h, gpointer u, int ticks) +qrp_step_merge_with_leaves(struct bgtask *unused_h, void *u, int ticks) { struct qrp_context *ctx = u; int used; @@ -2046,7 +2457,7 @@ max = st->slots; for (used = 0; used < ticks && i < max; i++, used++, ctx->sidx++) { - gboolean vs = RT_SLOT_READ(st->arena, i); + bool vs = RT_SLOT_READ(st->arena, i); /* * Since `lt', the larger table, has the same size as the merged @@ -2057,7 +2468,7 @@ g_assert(ctx->lidx + expand <= lt->slots); /* Won't overflow */ for (j = 0; j < expand; j++) { - gboolean vl = RT_SLOT_READ(lt->arena, ctx->lidx); + bool vl = RT_SLOT_READ(lt->arena, ctx->lidx); if (vl || vs) ctx->tablectx->lidx++ = 0; /* Present, less than oo */ else @@ -2073,7 +2484,7 @@ * QRT patch for new connections. */ static bgret_t -qrp_step_install_ultra(struct bgtask *h, gpointer u, int ticks) +qrp_step_install_ultra(struct bgtask *h, void *u, int ticks) { struct qrp_context *ctx = u; struct routing_table *rt; @@ -2118,7 +2529,7 @@ * Activate default patch computation and tell them we got a new table... */ - qrt_patch_compute(routing_table, ctx->rpp); + qrt_patch_compute(qrt_diff_4(NULL, routing_table), &routing_patch4); node_qrt_changed(routing_table); return BGR_DONE; @@ -2128,6 +2539,7 @@ qrp_step_substring, qrp_step_compute, qrp_step_create_table, + qrp_step_create_patches, qrp_step_install_leaf, qrp_step_wait_for_merged_table, qrp_step_merge_with_leaves, @@ -2140,6 +2552,34 @@ qrp_step_install_ultra, }; +static void +qrp_comp_done(bgtask_t *bt, void *p, bgstatus_t u_status, void *u_arg) +{ + struct qrp_context *ctx = p; + + (void) u_status; + (void) u_arg; + + /* + * If there was a compression task running, then make sure it is + * being cancelled. + */ + + if (NULL != ctx->compress_bt) { + struct qrt_compress_context *comp_ctx = &ctx->compress_ctx; + + if (!comp_ctx->finished) + bg_task_cancel(ctx->compress_bt); + + g_assert(comp_ctx->finished); /* Cancellation was synchronous */ + } + + QRP_TASK_LOCK; + if (qrp_comp == bt) + qrp_comp = NULL; + QRP_TASK_UNLOCK; +} + /** * This routine must be called once all the files have been added to finalize * the computation of the new QRP. @@ -2150,7 +2590,7 @@ * @param words the words making up the filenames (takes ownership of it) */ void -qrp_finalize_computation(GHashTable *words) +qrp_finalize_computation(htable_t *words) { struct qrp_context *ctx; @@ -2165,15 +2605,36 @@ WALLOC0(ctx); ctx->magic = QRP_MAGIC; ctx->rtp = &local_table; /* NOT routing_table, this is for local files */ - ctx->rpp = &routing_patch; ctx->words = words; /* Will free it, caller must forget about it */ gnet_prop_set_timestamp_val(PROP_QRP_TIMESTAMP, tm_time()); - qrp_comp = bg_task_create("QRP computation", - qrp_compute_steps, G_N_ELEMENTS(qrp_compute_steps), + QRP_TASK_LOCK; + + g_soft_assert(NULL == qrp_comp); + + qrp_comp = bg_task_create_stopped(NULL, "QRP computation", + qrp_compute_steps, N_ITEMS(qrp_compute_steps), ctx, qrp_comp_context_free, - NULL, NULL); + qrp_comp_done, NULL); + + if (qrp_comp != NULL) + bg_task_run(qrp_comp); + + QRP_TASK_UNLOCK; +} + +static void +qrp_merge_done(bgtask_t *bt, void *u_ctx, bgstatus_t u_status, void *u_arg) +{ + (void) u_ctx; + (void) u_status; + (void) u_arg; + + QRP_TASK_LOCK; + if (qrp_merge == bt) + qrp_merge = NULL; + QRP_TASK_UNLOCK; } /** @@ -2195,12 +2656,21 @@ WALLOC0(ctx); ctx->magic = QRP_MAGIC; ctx->rtp = &local_table; /* In case we call qrp_step_install_leaf */ - ctx->rpp = &routing_patch; + ctx->rpp = &routing_patch4; + + QRP_TASK_LOCK; - qrp_merge = bg_task_create("QRP merging", - qrp_merge_steps, G_N_ELEMENTS(qrp_merge_steps), + g_soft_assert(NULL == qrp_merge); + + qrp_merge = bg_task_create_stopped(NULL, "QRP merging", + qrp_merge_steps, N_ITEMS(qrp_merge_steps), ctx, qrp_merge_context_free, - NULL, NULL); + qrp_merge_done, NULL); + + if (qrp_merge != NULL) + bg_task_run(qrp_merge); + + QRP_TASK_UNLOCK; } /** @@ -2209,14 +2679,19 @@ * routing table. */ static void -qrp_merge_routing_table(struct bgtask *unused_h, gpointer unused_c, - bgstatus_t status, gpointer unused_arg) +qrp_merge_routing_table(struct bgtask *unused_h, void *unused_c, + bgstatus_t status, void *unused_arg) { (void) unused_h; (void) unused_c; (void) unused_arg; - if (status == BGS_KILLED) + if (BGS_ERROR == status) { + g_warning("%s(): merging task reported an error, " + "not updating routing table", G_STRFUNC); + } + + if (BGS_OK != status) return; qrp_update_routing_table(); @@ -2232,10 +2707,10 @@ * Make sure we won't send an invalid patch to new connections. */ - if (routing_patch != NULL) { - g_assert(ROUTING_PATCH_MAGIC == routing_patch->magic); - qrt_patch_unref(routing_patch); - routing_patch = NULL; + if (routing_patch4 != NULL) { + g_assert(ROUTING_PATCH_MAGIC == routing_patch4->magic); + qrt_patch_unref(routing_patch4); + routing_patch4 = NULL; } qrp_update_routing_table(); @@ -2251,47 +2726,84 @@ struct qrt_patch_context { enum qrt_patch_magic magic; + struct routing_patch *rp; /**< The routing patch we're compressing */ struct routing_patch **rpp; /**< Pointer where final patch is stored */ - struct routing_patch *rp; /**< Routing patch being compressed */ - struct routing_table *rt; /**< Table against which patch is computed */ struct bgtask *compress; /**< The compression task */ }; -typedef void (*qrt_patch_computed_cb_t)(gpointer arg, struct routing_patch *rp); +typedef bool (*qrt_patch_computed_cb_t)(void *arg, struct routing_patch *rp); struct patch_listener_info { qrt_patch_computed_cb_t callback; - gpointer arg; + void *arg; }; static struct qrt_patch_context *qrt_patch_ctx; -static GSList *qrt_patch_computed_listeners; +static pslist_t *qrt_patch_computed_listeners; +static spinlock_t qrt_patch_listeners_lock = SPINLOCK_INIT; + +#define QRP_PATCH_LISTEN_LOCK spinlock(&qrt_patch_listeners_lock) +#define QRP_PATCH_LISTEN_UNLOCK spinunlock(&qrt_patch_listeners_lock) +static bool +qrt_patch_fire_helper(void *data, void *udata) +{ + struct patch_listener_info *pi = data; + struct routing_patch *rp = udata; + + /* + * If the callback returns TRUE, it means it got the patch it wanted + * and therefore it can be removed from the listeners. + * If the routing patch is NULL, we assume it returned TRUE anyway. + */ + + if ((*pi->callback)(pi->arg, rp) || NULL == rp) { + WFREE(pi); + return TRUE; /* Done, remove from listening list */ + } + + return FALSE; /* Keep in the listening list */ +} + +/** + * Fire listenters to tell them a routine patch is ready. + * + * @param rp the routine patch that is ready (NULL indicates failure) + */ +static void +qrt_patch_fire_ready(struct routing_patch *rp) +{ + QRP_PATCH_LISTEN_LOCK; + + qrt_patch_computed_listeners = pslist_foreach_remove( + qrt_patch_computed_listeners, qrt_patch_fire_helper, rp); + + QRP_PATCH_LISTEN_UNLOCK; +} /** * Callback invoked when the routing patch is computed. */ static void -qrt_patch_computed(struct bgtask *unused_h, gpointer unused_u, - bgstatus_t status, gpointer arg) +qrt_patch_computed(struct bgtask *unused_h, void *unused_u, + bgstatus_t status, void *arg) { struct qrt_patch_context *ctx = arg; - GSList *sl; (void) unused_h; (void) unused_u; g_assert(ctx->magic == QRT_PATCH_MAGIC); - g_assert(ctx == qrt_patch_ctx); + g_assert(qrt_patch_ctx == NULL || ctx == qrt_patch_ctx); g_assert(ctx->rpp != NULL); - if (qrp_debugging(1)) - g_debug("QRP global default patch computed (status = %d)", status); - - qrt_patch_ctx = NULL; /* Indicates that we're done */ + if (qrp_debugging(1)) { + g_debug("QRP global default %s computed as %p (status = %s)", + qrp_patch_to_string(ctx->rp), ctx->rp, bgstatus_to_string(status)); + } if (status == BGS_OK) { time_t now = tm_time(); - glong elapsed; + long elapsed; if (*ctx->rpp != NULL) qrt_patch_unref(*ctx->rpp); @@ -2302,9 +2814,9 @@ elapsed = MAX(0, elapsed); gnet_prop_set_guint32_val(PROP_QRP_PATCH_COMPUTATION_TIME, elapsed); gnet_prop_set_guint32_val(PROP_QRP_PATCH_LENGTH, - (guint32) ctx->rp->len); + (uint32) ctx->rp->len); gnet_prop_set_guint32_val(PROP_QRP_PATCH_COMP_RATIO, - (guint32) (100.0 * + (uint32) (100.0 * (GNET_PROPERTY(qrp_patch_raw_length) - GNET_PROPERTY(qrp_patch_length))) / MAX(GNET_PROPERTY(qrp_patch_raw_length), 1)); @@ -2317,24 +2829,25 @@ * that an error occurred. */ - for (sl = qrt_patch_computed_listeners; sl; sl = g_slist_next(sl)) { - struct patch_listener_info *pi = sl->data; - (*pi->callback)(pi->arg, *ctx->rpp); /* NULL indicates failure */ - WFREE(pi); - } + QRP_TASK_LOCK; + + if (ctx == qrt_patch_ctx) + qrt_patch_ctx = NULL; /* Indicates that we're done */ + + qrt_patch_fire_ready(*ctx->rpp); /* NULL indicates failure */ + + QRP_TASK_UNLOCK; ctx->magic = 0; WFREE(ctx); - - gm_slist_free_null(&qrt_patch_computed_listeners); } /** * Record listener to callback with given argument when the default routing * patch will be ready. */ -static gpointer -qrt_patch_computed_add_listener(qrt_patch_computed_cb_t cb, gpointer arg) +static void * +qrt_patch_computed_add_listener(qrt_patch_computed_cb_t cb, void *arg) { struct patch_listener_info *pi; @@ -2350,8 +2863,12 @@ pi->callback = cb; pi->arg = arg; + QRP_PATCH_LISTEN_LOCK; + qrt_patch_computed_listeners = - g_slist_prepend(qrt_patch_computed_listeners, pi); + pslist_prepend(qrt_patch_computed_listeners, pi); + + QRP_PATCH_LISTEN_UNLOCK; return pi; } @@ -2360,14 +2877,17 @@ * Remove recorded listener. */ static void -qrt_patch_computed_remove_listener(gpointer handle) +qrt_patch_computed_remove_listener(void *handle) { struct patch_listener_info *pi = handle; + QRP_PATCH_LISTEN_LOCK; g_assert(qrt_patch_computed_listeners != NULL); qrt_patch_computed_listeners = - g_slist_remove(qrt_patch_computed_listeners, handle); + pslist_remove(qrt_patch_computed_listeners, handle); + QRP_PATCH_LISTEN_UNLOCK; + WFREE(pi); } @@ -2377,30 +2897,39 @@ static void qrt_patch_cancel_compute(void) { - struct bgtask *comptask; + struct bgtask *comptask = NULL; + + QRP_TASK_LOCK; - g_assert(qrt_patch_ctx != NULL); + if (qrt_patch_ctx != NULL) { + comptask = qrt_patch_ctx->compress; + qrt_patch_ctx = NULL; + } + + QRP_TASK_UNLOCK; + + if (NULL == comptask) + return; - comptask = qrt_patch_ctx->compress; bg_task_cancel(comptask); - sl_compress_tasks = g_slist_remove(sl_compress_tasks, comptask); - g_assert(qrt_patch_ctx == NULL); /* qrt_patch_computed() called! */ + /* qrt_patch_computed() called! */ g_assert(qrt_patch_computed_listeners == NULL); } /** * Launch asynchronous computation of the default routing patch. * - * @param rt is the table for which the default patch is computed. - * @param rpp is a pointer to a variable where the final routing patch - * is to be stored. + * @param rp the computed routing patch to compress + * @param rpp pointer to a variable where to store the final routing patch */ static void -qrt_patch_compute(struct routing_table *rt, struct routing_patch **rpp) +qrt_patch_compute(struct routing_patch *rp, struct routing_patch **rpp) { struct qrt_patch_context *ctx; + g_assert(rpp != NULL); + /* * Cancel computation if already active. */ @@ -2412,13 +2941,27 @@ gnet_prop_set_timestamp_val(PROP_QRP_PATCH_TIMESTAMP, tm_time()); - WALLOC(ctx); - qrt_patch_ctx = ctx; + WALLOC0(ctx); ctx->magic = QRT_PATCH_MAGIC; + ctx->rp = rp; ctx->rpp = rpp; - ctx->rt = rt; - ctx->rp = qrt_diff_4(NULL, rt); - ctx->compress = qrt_patch_compress(ctx->rp, qrt_patch_computed, ctx); + + gnet_prop_set_guint32_val(PROP_QRP_PATCH_RAW_LENGTH, (uint32) rp->len); + + if (qrp_debugging(1)) { + g_debug("QRP launching compression of %s at %p", + qrp_patch_to_string(rp), rp); + } + + ctx->compress = + qrt_patch_compress(rp, NULL, qrt_patch_computed, ctx, NULL); + + if (ctx->compress != NULL) + bg_task_run(ctx->compress); + + QRP_TASK_LOCK; + qrt_patch_ctx = ctx; + QRP_TASK_UNLOCK; } /** @@ -2427,15 +2970,8 @@ static void qrt_compress_cancel_all(void) { - GSList *sl; - if (qrt_patch_ctx != NULL) qrt_patch_cancel_compute(); - - for (sl = sl_compress_tasks; sl; sl = g_slist_next(sl)) - bg_task_cancel(sl->data); - - gm_slist_free_null(&sl_compress_tasks); } /*** @@ -2447,26 +2983,31 @@ * to size the table. */ static void -qrp_send_reset(struct gnutella_node *n, int slots, int inf_val) +qrp_send_reset(gnutella_node_t *n, int slots, int inf_val) { - gnutella_msg_qrp_reset_t msg; - gnutella_header_t *header = gnutella_msg_qrp_reset_header(&msg); - g_assert(is_pow2(slots)); g_assert(inf_val > 0 && inf_val < 256); - message_set_muid(header, GTA_MSG_QRP); + if (NODE_TALKS_G2(n)) { + g2_node_send_qht_reset(n, slots, inf_val); + } else { + gnutella_msg_qrp_reset_t msg; + gnutella_header_t *header; + + header = gnutella_msg_qrp_reset_header(&msg); + message_set_muid(header, GTA_MSG_QRP); + + gnutella_header_set_function(header, GTA_MSG_QRP); + gnutella_header_set_ttl(header, 1); + gnutella_header_set_hops(header, 0); + gnutella_header_set_size(header, sizeof msg - GTA_HEADER_SIZE); - gnutella_header_set_function(header, GTA_MSG_QRP); - gnutella_header_set_ttl(header, 1); - gnutella_header_set_hops(header, 0); - gnutella_header_set_size(header, sizeof msg - GTA_HEADER_SIZE); - - gnutella_msg_qrp_reset_set_variant(&msg, GTA_MSGV_QRP_RESET); - gnutella_msg_qrp_reset_set_table_length(&msg, slots); - gnutella_msg_qrp_reset_set_infinity(&msg, inf_val); + gnutella_msg_qrp_reset_set_variant(&msg, GTA_MSGV_QRP_RESET); + gnutella_msg_qrp_reset_set_table_length(&msg, slots); + gnutella_msg_qrp_reset_set_infinity(&msg, inf_val); - gmsg_sendto_one(n, &msg, sizeof msg); + gmsg_sendto_one(n, &msg, sizeof msg); + } if (qrp_debugging(2)) { g_debug("QRP sent RESET slots=%d, infinity=%d to %s", @@ -2480,46 +3021,50 @@ * The patch payload data is made of the `len' bytes starting at `buf'. */ static void -qrp_send_patch(struct gnutella_node *n, - int seqno, int seqsize, gboolean compressed, int bits, +qrp_send_patch(gnutella_node_t *n, + int seqno, int seqsize, bool compressed, int bits, char *buf, int len) { - gnutella_msg_qrp_patch_t *msg; - guint msglen; - g_assert(seqsize >= 1 && seqsize <= 255); g_assert(seqno >= 1 && seqno <= seqsize); g_assert(len >= 0 && len < INT_MAX); - /* - * Compute the overall message length. - */ + if (NODE_TALKS_G2(n)) { + g2_node_send_qht_patch(n, seqno, seqsize, compressed, bits, buf, len); + } else { + gnutella_msg_qrp_patch_t *msg; + uint msglen; - g_assert((size_t) len <= INT_MAX - sizeof *msg); - msglen = len + sizeof *msg; - msg = halloc(msglen); + /* + * Compute the overall message length. + */ - { - gnutella_header_t *header = gnutella_msg_qrp_patch_header(msg); - - message_set_muid(header, GTA_MSG_QRP); - gnutella_header_set_function(header, GTA_MSG_QRP); - gnutella_header_set_ttl(header, 1); - gnutella_header_set_hops(header, 0); - gnutella_header_set_size(header, msglen - GTA_HEADER_SIZE); - } + g_assert((size_t) len <= INT_MAX - sizeof *msg); + msglen = len + sizeof *msg; + msg = halloc(msglen); + + { + gnutella_header_t *header = gnutella_msg_qrp_patch_header(msg); + + message_set_muid(header, GTA_MSG_QRP); + gnutella_header_set_function(header, GTA_MSG_QRP); + gnutella_header_set_ttl(header, 1); + gnutella_header_set_hops(header, 0); + gnutella_header_set_size(header, msglen - GTA_HEADER_SIZE); + } - gnutella_msg_qrp_patch_set_variant(msg, GTA_MSGV_QRP_PATCH); - gnutella_msg_qrp_patch_set_seq_no(msg, seqno); - gnutella_msg_qrp_patch_set_seq_size(msg, seqsize); - gnutella_msg_qrp_patch_set_compressor(msg, compressed ? 0x1 : 0x0); - gnutella_msg_qrp_patch_set_entry_bits(msg, bits); + gnutella_msg_qrp_patch_set_variant(msg, GTA_MSGV_QRP_PATCH); + gnutella_msg_qrp_patch_set_seq_no(msg, seqno); + gnutella_msg_qrp_patch_set_seq_size(msg, seqsize); + gnutella_msg_qrp_patch_set_compressor(msg, compressed ? 0x1 : 0x0); + gnutella_msg_qrp_patch_set_entry_bits(msg, bits); - memcpy(cast_to_gchar_ptr(msg) + sizeof *msg, buf, len); + memcpy(cast_to_char_ptr(msg) + sizeof *msg, buf, len); - gmsg_sendto_one(n, msg, msglen); + gmsg_sendto_one(n, msg, msglen); - HFREE_NULL(msg); + HFREE_NULL(msg); + } if (qrp_debugging(2)) { g_debug("QRP sent PATCH #%d/%d (%d bytes) to %s", @@ -2532,16 +3077,16 @@ ***/ struct qrp_reset { - guint32 table_length; - guint8 infinity; + uint32 table_length; + uint8 infinity; }; struct qrp_patch { - guint8 seq_no; - guint8 seq_size; - guint8 compressor; - guint8 entry_bits; - guchar *data; /**< Points into node's message buffer */ + uint8 seq_no; + uint8 seq_size; + uint8 compressor; + uint8 entry_bits; + uchar *data; /**< Points into node's message buffer */ int len; /**< Length of data pointed at by `data' */ }; @@ -2550,10 +3095,10 @@ * * @returns TRUE if we read the message OK. */ -static gboolean -qrp_recv_reset(struct gnutella_node *n, struct qrp_reset *reset) +static bool +qrp_recv_reset(gnutella_node_t *n, struct qrp_reset *reset) { - gconstpointer msg = n->data; + const void *msg = n->data; g_assert(gnutella_qrp_reset_get_variant(msg) == GTA_MSGV_QRP_RESET); @@ -2572,10 +3117,10 @@ * Receive a PATCH message and fill the `patch' structure with its payload. * @returns TRUE if we read the message OK. */ -static gboolean -qrp_recv_patch(struct gnutella_node *n, struct qrp_patch *patch) +static bool +qrp_recv_patch(gnutella_node_t *n, struct qrp_patch *patch) { - gconstpointer msg = n->data; + const void *msg = n->data; g_assert(gnutella_qrp_patch_get_variant(msg) == GTA_MSGV_QRP_PATCH); @@ -2590,7 +3135,7 @@ patch->entry_bits = gnutella_qrp_patch_get_entry_bits(msg); /* Data start after header info */ - patch->data = (guchar *) msg + sizeof(gnutella_qrp_patch_t); + patch->data = (uchar *) msg + sizeof(gnutella_qrp_patch_t); patch->len = n->size - sizeof(gnutella_qrp_patch_t); g_assert(patch->len > 0); @@ -2613,15 +3158,15 @@ struct qrt_update { enum qrt_update_magic magic; - struct gnutella_node *node; /**< Node for which we're sending */ + gnutella_node_t *node; /**< Node for which we're sending */ struct routing_patch *patch; /**< The patch to send */ int seqno; /**< Sequence number of next message (1..n) */ int seqsize; /**< Total amount of messages to send */ int offset; /**< Offset within patch */ int chunksize; /**< Amount to send within each PATCH */ int last_sent; /**< Amount sent during last batch */ - gpointer compress; /**< Compressing task (NULL = done) */ - gpointer listener; /**< Listener for default patch being ready */ + void *compress; /**< Compressing task (NULL = done) */ + void *listener; /**< Listener for default patch being ready */ time_t last; /**< Time at which we sent the last batch */ unsigned ready:1; /**< Ready for sending? */ unsigned reset_needed:1; /**< Is the initial RESET needed? */ @@ -2629,12 +3174,31 @@ }; /** + * @return the default routing patch to use for the node. + */ +static struct routing_patch * +qrt_default_patch(const gnutella_node_t *n) +{ + struct routing_patch *rp; + + if (NODE_TALKS_G2(n)) { + rp = routing_revpatch1; + } else if (NODE_CAN_QRP1(n)) { + rp = routing_patch1; + } else { + rp = routing_patch4; + } + + return rp; +} + +/** * Callback invoked when the computed patch for a connection * has been compressed. */ static void -qrt_compressed(struct bgtask *unused_h, gpointer unused_u, - bgstatus_t status, gpointer arg) +qrt_compressed(struct bgtask *unused_h, void *unused_u, + bgstatus_t status, void *arg) { struct qrt_update *qup = arg; struct routing_patch *rp; @@ -2647,7 +3211,7 @@ qup->compress = NULL; qup->ready = TRUE; - if G_UNLIKELY(status == BGS_KILLED) + if G_UNLIKELY(BGS_KILLED == status || BGS_CANCELLED == status) goto error; else if G_UNLIKELY(status == BGS_ERROR) { /* Error during processing */ g_warning("could not compress query routing patch to send to %s", @@ -2659,7 +3223,7 @@ goto error; /* - * In this routine, we reference the `routing_patch' global variable + * In this routine, we reference the `routing_patch4' global variable * directly, because there can be only one default routing patch, * whether we are an UP or a leaf, and it is the default patch that * can be sent against a NULL table to bring them up-to-date wrt @@ -2675,20 +3239,22 @@ * one instead. We'll need an extra RESET though. */ - if G_UNLIKELY( - routing_patch != NULL && - qup->patch->len > routing_patch->len - ) { - if (qrp_debugging(0)) + rp = qrt_default_patch(qup->node); + + g_assert(rp != NULL || qup->patch != NULL); + + if G_UNLIKELY(rp != NULL && qup->patch->len > rp->len) { + if (qrp_debugging(0)) { g_warning("QRP incremental query routing patch for node %s is %d " - "bytes for %s slots, bigger than the default " + "bytes for %s slots, bigger than the default %d-bit " "patch (%d bytes for %s slots) -- using latter", node_gnet_addr(qup->node), qup->patch->len, compact_size(qup->patch->size, FALSE), - routing_patch->len, compact_size2(routing_patch->size, FALSE)); + rp->entry_bits, rp->len, compact_size2(rp->size, FALSE)); + } qrt_patch_unref(qup->patch); - qup->patch = qrt_patch_ref(routing_patch); + qup->patch = qrt_patch_ref(rp); qup->reset_needed = TRUE; } @@ -2721,7 +3287,7 @@ qup->seqsize = msgcount; /* - * Although we referenced `routing_patch' freely above, we cannot + * Although we referenced `routing_patch4' freely above, we cannot * reference `routing_table' here to get its size and infinity values. * We MUST use the values from the computed routing patch, since the * global routing table might have already been changed whilst we were @@ -2758,9 +3324,11 @@ * * If we get a NULL pointer, it means the computation was interrupted or * that an error occurred. + * + * @return TRUE if we got the default routing patch suitable for the node. */ -static void -qrt_patch_available(gpointer arg, struct routing_patch *rp) +static bool +qrt_patch_available(void *arg, struct routing_patch *rp) { struct qrt_update *qup = arg; @@ -2781,12 +3349,30 @@ if (NULL == rp) { g_assert(routing_table != NULL); routing_table->cancelled = TRUE; + } else { + /* + * Did we get the patch we need for that connection? + */ + + if (rp != qrt_default_patch(qup->node)) { + if (qrp_debugging(1)) { + g_debug("QRP got %s at %p for %s, waiting again", + qrp_patch_to_string(rp), rp, node_infostr(qup->node)); + } + return FALSE; + } + + if (qrp_debugging(1)) { + g_debug("QRP got suitable %s at %p for %s", + qrp_patch_to_string(rp), rp, node_infostr(qup->node)); + } } qup->listener = NULL; qup->patch = (rp == NULL) ? NULL : qrt_patch_ref(rp); qrt_compressed(NULL, NULL, rp == NULL ? BGS_ERROR : BGS_OK, qup); + return TRUE; } /** @@ -2802,7 +3388,7 @@ * @return opaque handle. */ struct qrt_update * -qrt_update_create(struct gnutella_node *n, struct routing_table *query_table) +qrt_update_create(gnutella_node_t *n, struct routing_table *query_table) { struct qrt_update *qup; struct routing_table *old_table = query_table; @@ -2836,31 +3422,55 @@ qup->reset_needed = booleanize(old_table == NULL); if (old_table == NULL) { + struct routing_patch *rp = qrt_default_patch(n); + /* - * If routing_patch is not NULL and has the right size, it is ready, + * If routing patch is not NULL and has the right size, it is ready, * no need to compute it. * Otherwise, it means it is being computed, so enqueue a * notification callback to know when it is ready. */ - if ( - routing_patch != NULL && - routing_patch->size == routing_table->slots - ) { + if (rp != NULL && rp->size == routing_table->slots) { if (qrp_debugging(2)) { - g_debug( - "QRP default routing patch is already there (%s)", - node_infostr(n)); + g_debug("QRP default %s already there (%s)", + qrp_patch_to_string(rp), node_infostr(n)); + } + + /* + * Make sure the 1-bit default patch is smaller than the 4-bit + * one, otherwise use the 4-bit patch. + */ + + if (NODE_CAN_QRP1(n)) { + struct routing_patch *rp4 = routing_patch4; + + if ( + rp4 != NULL && rp4->size == routing_table->slots && + rp4->len < rp->len + ) { + if (qrp_debugging(2)) { + g_debug("QRP default %s is smaller (%d vs. %d)", + qrp_patch_to_string(rp4), rp4->len, rp->len); + } + rp = rp4; /* Use smaller 4-bit patch then */ + } } - qup->patch = qrt_patch_ref(routing_patch); + qup->patch = qrt_patch_ref(rp); qrt_compressed(NULL, NULL, BGS_OK, qup); } else { if (qrp_debugging(1)) { - g_debug("QRP must wait for default routing patch " - "(%s): %s", - node_infostr(n), - NULL == routing_patch ? "none present" : "has wrong size"); + if (NULL == rp) { + g_debug("QRP waiting for first default routing patch (%s)", + node_infostr(n)); + } else { + g_debug("QRP default %s (%s) has " + "%d entr%s but routing table has %d slot%s", + qrp_patch_to_string(rp), node_infostr(n), + rp->size, plural_y(rp->size), + routing_table->slots, plural(routing_table->slots)); + } } qup->listener = @@ -2873,10 +3483,20 @@ * If there are no differences, the patch will be NULL. */ - qup->patch = qrt_diff_4(old_table, routing_table); - if (qup->patch != NULL) - qup->compress = qrt_patch_compress(qup->patch, qrt_compressed, qup); - else { + if (NODE_TALKS_G2(n)) { + qup->patch = qrt_diff_1(old_table, routing_table, TRUE); + } else if (NODE_CAN_QRP1(n)) { + qup->patch = qrt_diff_1(old_table, routing_table, FALSE); + } else { + qup->patch = qrt_diff_4(old_table, routing_table); + } + + if (qup->patch != NULL) { + qup->compress = + qrt_patch_compress(qup->patch, NULL, qrt_compressed, qup, NULL); + if (qup->compress != NULL) + bg_task_run(qup->compress); + } else { qup->empty_patch = TRUE; qup->ready = TRUE; } @@ -2896,7 +3516,6 @@ if (qup->compress != NULL) { struct bgtask *task = qup->compress; bg_task_cancel(task); - sl_compress_tasks = g_slist_remove(sl_compress_tasks, task); } g_assert(qup->compress == NULL); /* Reset by qrt_compressed() */ @@ -2915,14 +3534,14 @@ * Send the next batch of data. * @returns whether the routing should still be called. */ -gboolean +bool qrt_update_send_next(struct qrt_update *qup) { time_t now; time_t elapsed; int len; int i; - struct gnutella_node *n; + gnutella_node_t *n; g_assert(QRT_UPDATE_MAGIC == qup->magic); @@ -3023,7 +3642,7 @@ * Check whether sending was successful. * Should be called when qrt_update_send_next() returned FALSE. */ -gboolean +bool qrt_update_was_ok(struct qrt_update *qup) { g_assert(qup->magic == QRT_UPDATE_MAGIC); @@ -3050,7 +3669,7 @@ struct qrt_receive { enum qrt_receive_magic magic; - struct gnutella_node *node; /**< Node for which we're receiving */ + gnutella_node_t *node; /**< Node for which we're receiving */ struct routing_table *table; /**< Table being built / updated */ int shrink_factor; /**< 1 means none, `n' means coalesce `n' entries */ int seqsize; /**< Amount of patch messages to expect */ @@ -3062,8 +3681,8 @@ int current_slot; /**< Current slot processed in patch */ int current_index; /**< Current index (after shrinking) in QR table */ char *expansion; /**< Temporary expansion arena before shrinking */ - gboolean deflated; /**< Is data deflated? */ - gboolean (*patch)(struct qrt_receive *qrcv, const guchar *data, int len, + bool deflated; /**< Is data deflated? */ + bool (*patch)(struct qrt_receive *qrcv, const uchar *data, int len, const struct qrp_patch *patch); }; @@ -3072,9 +3691,9 @@ * * @returns FALSE always. */ -static gboolean +static bool qrt_unknown_patch(struct qrt_receive *unused_qrcv, - const guchar *unused_data, int unused_len, + const uchar *unused_data, int unused_len, const struct qrp_patch *unused_patch) { (void) unused_qrcv; @@ -3100,7 +3719,7 @@ * @returns pointer to handler. */ struct qrt_receive * -qrt_receive_create(struct gnutella_node *n, struct routing_table *query_table) +qrt_receive_create(gnutella_node_t *n, struct routing_table *query_table) { struct routing_table *table = query_table; struct qrt_receive *qrcv; @@ -3200,13 +3819,13 @@ * * @returns TRUE on sucess, FALSE on error with the node being BYE-ed. */ -static gboolean -qrt_apply_patch(struct qrt_receive *qrcv, const guchar *data, int len, +static bool +qrt_apply_patch(struct qrt_receive *qrcv, const uchar *data, int len, const struct qrp_patch *patch) { int bpe = qrcv->entry_bits; /* bits per entry */ int epb; /* entries per byte */ - guint8 rmask; /* reading mask */ + uint8 rmask; /* reading mask */ int expansion_slot; struct routing_table *rt = qrcv->table; int i; @@ -3224,7 +3843,7 @@ return TRUE; if G_UNLIKELY(qrcv->current_index >= rt->slots) { - struct gnutella_node *n = qrcv->node; + gnutella_node_t *n = qrcv->node; g_warning("%s overflowed its QRP %d-bit patch of %s slots" " (%s message #%d/%d)", node_infostr(n), qrcv->entry_bits, @@ -3294,16 +3913,16 @@ for (i = 0; i < len; i++) { int j; - guint8 value = datai; /* Patch byte contains `epb' slots */ - guint8 smask; /* Sign bit mask */ - guint8 mask; + uint8 value = datai; /* Patch byte contains `epb' slots */ + uint8 smask; /* Sign bit mask */ + uint8 mask; for ( j = 0, mask = rmask, smask = 0x80; j < epb; j++, mask >>= bpe, smask >>= bpe ) { - guint8 v = value & mask; + uint8 v = value & mask; int o; /* @@ -3316,7 +3935,7 @@ if (qrcv->current_slot == expansion_slot) { int k; - gboolean val; + bool val; g_assert(qrcv->current_index < rt->slots); @@ -3372,7 +3991,7 @@ if (++qrcv->current_slot == expansion_slot) { int k; - guint8 val = 0x01; + uint8 val = 0x01; for (k = 0; k < qrcv->shrink_factor; k++) { if (qrcv->expansionk) { @@ -3393,9 +4012,9 @@ * the table can hold. */ - if ((guint) qrcv->current_slot >= rt->client_slots) { + if ((uint) qrcv->current_slot >= rt->client_slots) { if (j != (epb - 1) || i != (len - 1)) { - struct gnutella_node *n = qrcv->node; + gnutella_node_t *n = qrcv->node; g_warning("%s overflowed its QRP " "%d-bit patch of %s slots", node_infostr(n), @@ -3419,7 +4038,7 @@ * @return FALSE if there was an error reported and the patch message * must be ignored. */ -static gboolean +static bool qrt_patch_is_valid(struct qrt_receive *qrcv, int len, int slots_per_byte, const struct qrp_patch *patch) { @@ -3433,7 +4052,7 @@ */ if G_UNLIKELY(qrcv->current_index >= rt->slots) { - struct gnutella_node *n = qrcv->node; + gnutella_node_t *n = qrcv->node; g_warning("%s overflowed its QRP %d-bit patch of %s slots" " (current_index=%d, slots=%d at %s message #%u/%u)", node_infostr(n), qrcv->entry_bits, @@ -3451,10 +4070,10 @@ * the table can hold. */ - last_patch_slot = (guint) qrcv->current_slot + len * slots_per_byte; + last_patch_slot = (uint) qrcv->current_slot + len * slots_per_byte; if G_UNLIKELY(last_patch_slot > rt->client_slots) { - struct gnutella_node *n = qrcv->node; + gnutella_node_t *n = qrcv->node; g_warning("%s overflowed its QRP %d-bit patch of " "%s slots by extra %s at %s message #%u/%u", node_infostr(n), qrcv->entry_bits, @@ -3466,7 +4085,7 @@ compact_size(rt->client_slots, FALSE)); return FALSE; } - + return TRUE; } @@ -3480,8 +4099,8 @@ * * @returns TRUE on sucess, FALSE on error with the node being BYE-ed. */ -static gboolean -qrt_apply_patch8(struct qrt_receive *qrcv, const guchar *data, int len, +static bool +qrt_apply_patch8(struct qrt_receive *qrcv, const uchar *data, int len, const struct qrp_patch *patch) { struct routing_table *rt = qrcv->table; @@ -3501,25 +4120,8 @@ return FALSE; g_assert(qrcv->current_index + len <= rt->slots); - - /* - * Compute the amount of entries per byte, and the initial reading mask. - */ for (i = 0; i < len; i++) { - /* - * The only possibilities for the patch are: - * - * . A negative value, to bring the slot value from infinity to 1. - * . A null value for no change. - * . A positive value to bring the slot back to infinity. - * - * In reality, for leaf<->ultrapeer QRT, what matters is presence. - * We consider everything that is less to infinity as being - * present, and therefore forget about the "hops-away" semantics - * of the QRT slot value. - */ - qrt_patch_slot(rt, qrcv->current_index++, datai); } qrcv->current_slot = qrcv->current_index - 1; @@ -3538,8 +4140,8 @@ * * @returns TRUE on sucess, FALSE on error with the node being BYE-ed. */ -static G_GNUC_HOT gboolean -qrt_apply_patch4(struct qrt_receive *qrcv, const guchar *data, int len, +static bool +qrt_apply_patch4(struct qrt_receive *qrcv, const uchar *data, int len, const struct qrp_patch *patch) { struct routing_table *rt = qrcv->table; @@ -3547,7 +4149,7 @@ g_assert(qrcv->table != NULL); - /* True for this variant of patch function. 8-bit, no expansion. */ + /* True for this variant of patch function. 4-bit, no expansion. */ g_assert((int)rt->client_slots == rt->slots); g_assert(qrcv->entry_bits == 4); g_assert(qrcv->shrink_factor == 1); @@ -3559,27 +4161,15 @@ return FALSE; g_assert(qrcv->current_index + len * 2 <= rt->slots); - - /* - * Compute the amount of entries per byte, and the initial reading mask. - */ for (i = 0; i < len; i++) { - guint8 v = datai; /* Patch byte contains `epb' slots */ + uint8 v = datai; /* Patch byte contains 2 slots */ /* - * The only possibilities for the patch are: - * - * . A negative value, to bring the slot value from infinity to 1. - * . A null value for no change. - * . A positive value to bring the slot back to infinity. - * - * In reality, for leaf<->ultrapeer QRT, what matters is presence. - * We consider everything that is less to infinity as being - * present, and therefore forget about the "hops-away" semantics - * of the QRT slot value. + * Quartets are processed in big-endian way (highest nybble is + * for the lowest table index). */ - + qrt_patch_slot(rt, qrcv->current_index++, v & 0xf0); qrt_patch_slot(rt, qrcv->current_index++, (v << 4) & 0xf0); @@ -3590,27 +4180,136 @@ } /** + * Apply raw 1-bit patch data (uncompressed) to the current routing table. + * + * @param qrcv query routing table being received + * @param data patch data to apply + * @param len length of patch data (amount of data bytes) + * @param patch the PATCH message, for logging purposes + * + * @returns TRUE on sucess, FALSE on error with the node being BYE-ed. + */ +static bool +qrt_apply_patch1(struct qrt_receive *qrcv, const uchar *data, int len, + const struct qrp_patch *patch) +{ + struct routing_table *rt = qrcv->table; + int i; + + g_assert(qrcv->table != NULL); + + /* True for this variant of patch function. 1-bit, no expansion. */ + g_assert((int)rt->client_slots == rt->slots); + g_assert(qrcv->entry_bits == 1); + g_assert(qrcv->shrink_factor == 1); + + if G_UNLIKELY(len == 0) /* No data, only zlib trailer */ + return TRUE; + + if (!qrt_patch_is_valid(qrcv, len, 8, patch)) + return FALSE; + + g_assert(qrcv->current_index + len * 8 <= rt->slots); + + for (i = 0; i < len; i++) { + /* + * Bits are processed in big-endian way. + * + * A non-zero bit means the current entry in the QRT needs to be + * flipped, a zero bit means we need to keep it as-is. + */ + + rt->arenai >> 3 ^= datai; + rt->set_count += bits_set(rt->arenai >> 3); + } + + qrcv->current_index += len * 8; + qrcv->current_slot = qrcv->current_index; + + return TRUE; +} + +/** + * Apply raw 1-bit patch data (uncompressed) to the current routing table, + * reversing each byte as we go. + * + * @param qrcv query routing table being received + * @param data patch data to apply + * @param len length of patch data (amount of data bytes) + * @param patch the PATCH message, for logging purposes + * + * @returns TRUE on sucess, FALSE on error with the node being BYE-ed. + */ +static bool +qrt_apply_reversed_patch1(struct qrt_receive *qrcv, const uchar *data, int len, + const struct qrp_patch *patch) +{ + struct routing_table *rt = qrcv->table; + int i; + + g_assert(qrcv->table != NULL); + + /* True for this variant of patch function. 1-bit, no expansion. */ + g_assert((int)rt->client_slots == rt->slots); + g_assert(qrcv->entry_bits == 1); + g_assert(qrcv->shrink_factor == 1); + + if G_UNLIKELY(len == 0) /* No data, only zlib trailer */ + return TRUE; + + if (!qrt_patch_is_valid(qrcv, len, 8, patch)) + return FALSE; + + g_assert(qrcv->current_index + len * 8 <= rt->slots); + + for (i = 0; i < len; i++) { + /* + * Bits are processed in little-endian way (since patch is "reversed"). + * + * A non-zero bit means the current entry in the QRT needs to be + * flipped, a zero bit means we need to keep it as-is. + */ + + rt->arenai >> 3 ^= reverse_byte(datai); + rt->set_count += bits_set(rt->arenai >> 3); + } + + qrcv->current_index += len * 8; + qrcv->current_slot = qrcv->current_index; + + return TRUE; +} + +/** * A macro that creates functions with fixed slot sizes to determine * if the table contains all key words. With a parameter of 21, the * name will be qrp_can_route_21. + * + * This routine is called when there are no URNs in the query, only words. */ -#define CAN_ROUTE(bits) \ -static G_GNUC_HOT gboolean \ -qrp_can_route_##bits(const query_hashvec_t *qhv, \ - const struct routing_table *rt) \ - \ -{ \ - const struct query_hash * const vec = qhv->vec; \ - const guint8 * const arena = rt->arena; \ - guint8 i = qhv->count; \ - \ - while (i-- > 0) { \ - guint32 idx = veci.hashcode >> (32 - bits); \ - /* ALL the keywords must be present -- hardwire RT_SLOT_READ. */ \ - if (0 == (0x80U & (arenaidx >> 3 << (idx & 0x7)))) \ - return FALSE; \ - } \ - return TRUE; \ +#define CAN_ROUTE(bits) \ +static bool G_HOT \ +qrp_can_route_##bits(const query_hashvec_t *qhv, \ + const struct routing_table *rt) \ +{ \ + const struct query_hash * const vec = qhv->vec; \ + const uint8 * const arena = rt->arena; \ + uint8 i = qhv->count; \ + uint8 hit = 0, word = qhv->count; \ + \ + while (i-- > 0) { \ + uint32 idx = veci.hashcode >> (32 - bits); \ + /* \ + * We hardwire RT_SLOT_READ here. \ + * To follow LimeWire's behaviour, require only 2/3 of matching \ + * when there are at least 3 words. \ + * --RAM, 2014-01-03 \ + */ \ + if (0 != (0x80U & (arenaidx >> 3 << (idx & 0x7)))) { \ + hit++; \ + } \ + } \ + return word < 3 ? hit == word : 3 * hit / word >= 2; \ } /* Create eight QRT lookup routines with fixed shift factors. */ @@ -3631,47 +4330,64 @@ * will be qrp_can_route_urn_14. * * @todo: Is URN searched deprecated, with DHT queries? + ** + * Answer as of 2014-01-03: Yes, they are, but legacy servents like Shareaza + * continue to include URNs in their QRP as they do not support the DHT. + * And there are still old LimeWire present out there that did include URNs + * in their QRP. + * Nonetheless, we amend the logic to still forward the query, even if the URNs + * did not match, as long as 2/3 of the words matched (like for a regular query + * with no URN) because we cannot know for sure whether URNs are present in + * the QRP table. + * --RAM, 2014-01-03 */ #define CAN_ROUTE_URN(bits) \ -static gboolean \ +static bool \ qrp_can_route_urn_##bits(const query_hashvec_t *qhv, \ const struct routing_table *rt) \ { \ const struct query_hash *qh = qhv->vec; \ - const guint8 *arena = rt->arena; \ - guint i; \ + const uint8 *arena = rt->arena; \ + uint i; \ + uint8 hit = 0, word = 0; \ \ for (i = 0; i < qhv->count; i++) { \ - guint32 idx = qhi.hashcode >> (32 - bits); \ + uint32 idx = qhi.hashcode >> (32 - bits); \ \ /* \ * If there is an entry in the table and the source is an URN,\ * we have to forward the query, as those are OR-ed. \ - * Otherwise, ALL the keywords must be present. \ + * \ + * To follow LimeWire's behaviour, require only 2/3 of words \ + * matching, when there are at least 3 words. \ + * --RAM, 2014-01-03. \ * \ * When facing a SHA1 query, we require that at least one of \ - * the URN matches or we don't forward the query. \ + * the URN matches or that 2/3 of the words match. \ */ \ if (RT_SLOT_READ(arena, idx)) { \ if (qhi.source == QUERY_H_URN) /* URN present */ \ return TRUE; /* Will forward */ \ - return FALSE; /* And none matched */ \ + word++; \ + hit++; \ } else { \ if (qhi.source == QUERY_H_WORD) { \ /* We know no URN matched already \ because qhv is sorted */ \ - return FALSE; /* All words did not match */ \ + word++; \ } \ } \ } \ /* \ - * We had some URNs and none matched so don't forward. \ + * We had some URNs and none matched but forward if more than \ + * 2/3 of the words did, and we had at least 3 words, otherwise \ + * all the words must have matched. \ */ \ - return FALSE; \ + return 0 == word ? FALSE : \ + word < 3 ? hit == word : 3 * hit / word >= 2; \ } -/* Create eight QRT lookup routines (with a URN) with fixed shift - * factors. */ +/* Create eight QRT lookup routines (with a URN) with fixed shift factors. */ CAN_ROUTE_URN(14) CAN_ROUTE_URN(15) CAN_ROUTE_URN(16) @@ -3683,14 +4399,87 @@ #undef CAN_ROUTE_URN /** + * Populate 'can_route' routines based on constant slot sizes. + * This allows pre-computed shift to be optimized for each table size. + */ +static void +qrt_dynamic_bind(struct routing_table *rt) +{ + switch(rt->bits) + { + case 14: + rt->can_route_urn = qrp_can_route_urn_14; + rt->can_route = qrp_can_route_14; + break; + case 15: + rt->can_route_urn = qrp_can_route_urn_15; + rt->can_route = qrp_can_route_15; + break; + case 16: + rt->can_route_urn = qrp_can_route_urn_16; + rt->can_route = qrp_can_route_16; + break; + case 17: + rt->can_route_urn = qrp_can_route_urn_17; + rt->can_route = qrp_can_route_17; + break; + case 18: + rt->can_route_urn = qrp_can_route_urn_18; + rt->can_route = qrp_can_route_18; + break; + case 19: + rt->can_route_urn = qrp_can_route_urn_19; + rt->can_route = qrp_can_route_19; + break; + case 20: + rt->can_route_urn = qrp_can_route_urn_20; + rt->can_route = qrp_can_route_20; + break; + case 21: + rt->can_route_urn = qrp_can_route_urn_21; + rt->can_route = qrp_can_route_21; + break; + default: + rt->can_route_urn = qrp_can_route_default; + rt->can_route = qrp_can_route_default; + + } +} + +/** + * Routine invoked on empty tables, always returning FALSE because nothing + * can be routed to the node having this table. + */ +static bool +qrp_cannot_route(const query_hashvec_t *qhv, const struct routing_table *rt) +{ + (void) qhv; + (void) rt; + + return FALSE; +} + +/** + * Populate 'can_route' routines for an empty table (cannot route anything). + */ +static void +qrt_dynamic_bind_empty(struct routing_table *rt) +{ + qrt_check(rt); + + rt->can_route_urn = qrp_cannot_route; + rt->can_route = qrp_cannot_route; +} + +/** * Handle reception of QRP RESET. * * @returns TRUE if we handled the message correctly, FALSE if an error * was found and the node BYE-ed. */ -static gboolean +static bool qrt_handle_reset( - struct gnutella_node *n, struct qrt_receive *qrcv, struct qrp_reset *reset) + gnutella_node_t *n, struct qrt_receive *qrcv, struct qrp_reset *reset) { struct routing_table *rt; int ret; @@ -3729,9 +4518,9 @@ if G_UNLIKELY(reset->infinity < 1) { g_warning("%s sent us invalid QRP infinity: %u", - node_infostr(n), (guint) reset->infinity); + node_infostr(n), (uint) reset->infinity); node_bye_if_writable(n, 413, "Invalid QRP infinity %u", - (guint) reset->infinity); + (uint) reset->infinity); return FALSE; } @@ -3786,48 +4575,7 @@ rt->slots = rt->client_slots / qrcv->shrink_factor; rt->bits = highest_bit_set(rt->slots); - /* Populate 'can_route' routines based on constant slot sizes. - * This allows pre-computed shift to be optimized for each table size. - */ - switch(rt->bits) - { - case 14: - rt->can_route_urn = qrp_can_route_urn_14; - rt->can_route = qrp_can_route_14; - break; - case 15: - rt->can_route_urn = qrp_can_route_urn_15; - rt->can_route = qrp_can_route_15; - break; - case 16: - rt->can_route_urn = qrp_can_route_urn_16; - rt->can_route = qrp_can_route_16; - break; - case 17: - rt->can_route_urn = qrp_can_route_urn_17; - rt->can_route = qrp_can_route_17; - break; - case 18: - rt->can_route_urn = qrp_can_route_urn_18; - rt->can_route = qrp_can_route_18; - break; - case 19: - rt->can_route_urn = qrp_can_route_urn_19; - rt->can_route = qrp_can_route_19; - break; - case 20: - rt->can_route_urn = qrp_can_route_urn_20; - rt->can_route = qrp_can_route_20; - break; - case 21: - rt->can_route_urn = qrp_can_route_urn_21; - rt->can_route = qrp_can_route_21; - break; - default: - rt->can_route_urn = qrp_can_route_default; - rt->can_route = qrp_can_route_default; - - } + qrt_dynamic_bind(rt); g_assert(is_pow2(rt->slots)); g_assert(rt->slots <= MAX_TABLE_SIZE); @@ -3863,10 +4611,10 @@ * was found and the node BYE-ed. Sets `done' to TRUE on the last message * from the sequence. */ -static gboolean +static bool qrt_handle_patch( - struct gnutella_node *n, struct qrt_receive *qrcv, struct qrp_patch *patch, - gboolean *done) + gnutella_node_t *n, struct qrt_receive *qrcv, struct qrp_patch *patch, + bool *done) { /* * If we don't have a routing table allocated, it means they never sent @@ -3886,9 +4634,9 @@ if G_UNLIKELY(patch->seq_no != qrcv->seqno) { g_warning("%s sent us invalid QRP seqno %u (expected %u)", - node_infostr(n), (guint) patch->seq_no, qrcv->seqno); + node_infostr(n), (uint) patch->seq_no, qrcv->seqno); node_bye_if_writable(n, 413, "Invalid QRP seq number %u (expected %u)", - (guint) patch->seq_no, qrcv->seqno); + (uint) patch->seq_no, qrcv->seqno); return FALSE; } @@ -3905,20 +4653,50 @@ qrcv->table->set_count = 0; qrcv->patch = qrt_apply_patch; /* Default handler. */ + qrt_dynamic_bind(qrcv->table); /* Reset initial `can_route' */ + switch (qrcv->entry_bits) { case 8: - if (qrcv->shrink_factor == 1) + if (1 == qrcv->shrink_factor) qrcv->patch = qrt_apply_patch8; break; case 4: - if (qrcv->shrink_factor == 1) + if (1 == qrcv->shrink_factor) qrcv->patch = qrt_apply_patch4; break; case 2: /* Use default handler. */ break; - case 1: - /* Use default handler. */ + case 1: + /* + * G2 defined the ordering of bits in the 1-bit QRP as being + * "little-endian" (i.e. the bit #0 in the logical QRP is actually + * the low-order bit of the first byte), whereas in Gnutella, the + * QRP is ordered in a "big-endian" way (i.e. the bit #0 in the + * logical QRP is actually the high-order bit of the first byte). + * This is consistent with the 4-bit patch, where the first nybble + * is given in the high nybble of the first byte, i.e. in bits 7-4. + * + * This means we need to reverse each byte of the patch when + * receiving a 1-bit patch from a G2 node. Note that this only + * happens when GTKG runs as a Hub, which is not going to be + * implemented at first. + * --RAM, 2014-01-03 + */ + if (NODE_TALKS_G2(n)) { + if (1 == qrcv->shrink_factor) { + qrcv->patch = qrt_apply_reversed_patch1; + } else { + g_warning("%s sent QRP 1-bit PATCH with shrink factor %u", + node_infostr(n), qrcv->shrink_factor); + node_bye_if_writable(n, 413, + "Invalid shrink factor %u for PATCH (QRT too large)", + qrcv->shrink_factor); + return FALSE; + } + } else if (1 == qrcv->shrink_factor) { + qrcv->patch = qrt_apply_patch1; + } break; default: g_warning("%s sent invalid QRP entry bits %u for PATCH", @@ -3931,10 +4709,10 @@ g_warning("%s changed QRP seqsize to %u at message #%d " "(started with %u)", node_infostr(n), - (guint) patch->seq_size, qrcv->seqno, qrcv->seqsize); + (uint) patch->seq_size, qrcv->seqno, qrcv->seqsize); node_bye_if_writable(n, 413, "Changed QRP seq size to %u at message #%d (began with %u)", - (guint) patch->seq_size, qrcv->seqno, qrcv->seqsize); + (uint) patch->seq_size, qrcv->seqno, qrcv->seqsize); return FALSE; } @@ -3947,10 +4725,10 @@ g_warning("%s changed QRP patch entry bits to %u " "at message #%d (started with %u)", node_infostr(n), - (guint) patch->entry_bits, qrcv->seqno, qrcv->entry_bits); + (uint) patch->entry_bits, qrcv->seqno, qrcv->entry_bits); node_bye_if_writable(n, 413, "Changed QRP patch entry bits to %u at message #%d (began with %u)", - (guint) patch->entry_bits, qrcv->seqno, qrcv->entry_bits); + (uint) patch->entry_bits, qrcv->seqno, qrcv->entry_bits); return FALSE; } @@ -3963,7 +4741,7 @@ { struct routing_table *rt = qrcv->table; - g_assert(rt != NULL); + qrt_check(rt); g_assert(rt->compacted); /* 8 bits per byte, table is compacted */ rt->arena = hrealloc(rt->arena, rt->slots / 8); @@ -3976,13 +4754,13 @@ if (qrcv->deflated) { z_streamp inz = qrcv->inz; int ret; - gboolean seen_end = FALSE; + bool seen_end = FALSE; inz->next_in = patch->data; inz->avail_in = patch->len; while (!seen_end && inz->avail_in > 0) { - inz->next_out = (gpointer) qrcv->data; + inz->next_out = cast_to_pointer(qrcv->data); inz->avail_out = qrcv->len; ret = inflate(inz, Z_SYNC_FLUSH); @@ -3994,17 +4772,17 @@ if G_UNLIKELY(ret != Z_OK) { g_warning("decompression of QRP patch #%u/%u failed for %s: %s", - (guint) patch->seq_no, (guint) patch->seq_size, + (uint) patch->seq_no, (uint) patch->seq_size, node_infostr(n), zlib_strerror(ret)); node_bye_if_writable(n, 413, "QRP patch #%u/%u decompression failed: %s", - (guint) patch->seq_no, (guint) patch->seq_size, + (uint) patch->seq_no, (uint) patch->seq_size, zlib_strerror(ret)); return FALSE; } if ( - !qrcv->patch(qrcv, (guchar *) qrcv->data, + !qrcv->patch(qrcv, (uchar *) qrcv->data, qrcv->len - inz->avail_out, patch) ) return FALSE; @@ -4017,11 +4795,11 @@ if G_UNLIKELY(seen_end && qrcv->seqno <= qrcv->seqsize) { g_warning("saw end of compressed QRP patch at #%u/%u for %s", - (guint) patch->seq_no, (guint) patch->seq_size, + (uint) patch->seq_no, (uint) patch->seq_size, node_infostr(n)); node_bye_if_writable(n, 413, "Early end of compressed QRP patch at #%u/%u", - (guint) patch->seq_no, (guint) patch->seq_size); + (uint) patch->seq_no, (uint) patch->seq_size); return FALSE; } } else if (!qrcv->patch(qrcv, patch->data, patch->len, patch)) @@ -4101,6 +4879,17 @@ } /* + * If table is empty, supersede the routing entries. + */ + + if (qrt_is_empty(rt)) { + rt->is_empty = TRUE; + qrt_dynamic_bind_empty(rt); + } else { + rt->is_empty = FALSE; + } + + /* * Install the table in the node, if it was a new table. * Otherwise, we only finished patching it. */ @@ -4129,11 +4918,11 @@ * When the last message from the sequence has been processed, set `done' * to TRUE. */ -gboolean -qrt_receive_next(struct qrt_receive *qrcv, gboolean *done) +bool +qrt_receive_next(struct qrt_receive *qrcv, bool *done) { - struct gnutella_node *n = qrcv->node; - guint8 type; + gnutella_node_t *n = qrcv->node; + uint8 type; g_assert(qrcv->magic == QRT_RECEIVE_MAGIC); g_assert(gnutella_header_get_function(&n->header) == GTA_MSG_QRP); @@ -4172,7 +4961,7 @@ return TRUE; /* Everything is fine, even if we dropped message */ } -static gboolean qrt_leaf_change_notified = FALSE; +static bool qrt_leaf_change_notified = FALSE; /** * Called when we get a new QRT from a leaf node, or when we loose a leaf @@ -4188,8 +4977,8 @@ * Periodic monitor, to trigger recomputation of the merged table if we got * a new leaf with a QRT or lost a leaf which sent us its QRT. */ -static gboolean -qrp_monitor(gpointer unused_obj) +static bool +qrp_monitor(void *unused_obj) { (void) unused_obj; @@ -4207,8 +4996,8 @@ */ if (qrt_leaf_change_notified) { - qrt_leaf_change_notified = FALSE; - mrg_compute(qrp_merge_routing_table); + if (mrg_compute(qrp_merge_routing_table)) + qrt_leaf_change_notified = FALSE; } return TRUE; /* Keep calling */ @@ -4217,7 +5006,7 @@ /** * Initialize QRP. */ -G_GNUC_COLD void +void G_COLD qrp_init(void) { /* @@ -4235,7 +5024,8 @@ * Install the periodic monitoring callback. */ - cq_periodic_main_add(LEAF_MONITOR_PERIOD, qrp_monitor, NULL); + qrp_monitor_ev = cq_periodic_main_add( + LEAF_MONITOR_PERIOD, qrp_monitor, NULL); /* * Install an empty local table untill we compute our shared library. @@ -4247,16 +5037,16 @@ /** * Called at servent shutdown to reclaim all the memory. */ -G_GNUC_COLD void +void G_COLD qrp_close(void) { qrp_cancel_computation(); + cq_periodic_remove(&qrp_monitor_ev); if (routing_table) qrt_unref(routing_table); - if (routing_patch) - qrt_patch_unref(routing_patch); + qrt_patches_clear(); if (local_table) qrt_unref(local_table); @@ -4272,7 +5062,7 @@ * * @returns whether a slot in the table is present or not. */ -static gboolean +static bool qrt_dump_is_slot_present(struct routing_table *rt, int slot) { g_assert(slot < rt->slots); @@ -4289,25 +5079,25 @@ * * @returns a unique 32-bit checksum. */ -static guint32 -qrt_dump(struct routing_table *rt, gboolean full) +static uint32 +qrt_dump(struct routing_table *rt, bool full) { struct sha1 digest; - SHA1Context ctx; - gboolean last_status = FALSE; + SHA1_context ctx; + bool last_status = FALSE; int last_slot = 0; - guint32 result; + uint32 result; int i; g_debug("------ Query Routing Table \"%s\" " "(gen=%d, slots=%d, %scompacted)", rt->name, rt->generation, rt->slots, rt->compacted ? "" : "not "); - SHA1Reset(&ctx); + SHA1_reset(&ctx); for (i = 0; i <= rt->slots; i++) { - gboolean status = FALSE; - guint8 value; + bool status = FALSE; + uint8 value; if (i == rt->slots) goto final; @@ -4315,7 +5105,7 @@ status = qrt_dump_is_slot_present(rt, i); value = status ? 1 : 0; /* 1 for presence */ - SHA1Input(&ctx, &value, sizeof value); + SHA1_INPUT(&ctx, value); if (i == 0) { last_slot = i; @@ -4340,10 +5130,10 @@ } } - SHA1Result(&ctx, cast_to_gpointer(&digest)); + SHA1_result(&ctx, &digest); /* - * Reduce SHA1 to a single guint32. + * Reduce SHA1 to a single uint32. */ result = sha1_hash(&digest); @@ -4363,7 +5153,7 @@ * Allocate a query hash container for at most `size' entries. */ query_hashvec_t * -qhvec_alloc(guint size) +qhvec_alloc(uint size) { query_hashvec_t *qhvec; @@ -4373,7 +5163,7 @@ qhvec->count = 0; qhvec->size = size; qhvec->has_urn = FALSE; - qhvec->vec = walloc(size * sizeof qhvec->vec0); + WALLOC_ARRAY(qhvec->vec, size); return qhvec; } @@ -4384,7 +5174,7 @@ void qhvec_free(query_hashvec_t *qhvec) { - wfree(qhvec->vec, qhvec->size * sizeof qhvec->vec0); + WFREE_ARRAY(qhvec->vec, qhvec->size); WFREE(qhvec); } @@ -4470,18 +5260,18 @@ * @param qhv the query hit vector containing QRP hashes and types * @param rt the routing table of the target node * - * @note thie routine expects the query hash vector to be sorted with + * @note this routine expects the query hash vector to be sorted with * URNs coming first and words later. This is a default * implementation. The macros CAN_ROUTE and CAN_ROUTE_URN expand into * routines that perform the same tests with pre-computed shifts. */ -static gboolean +static bool qrp_can_route_default(const query_hashvec_t *qhv, const struct routing_table *rt) { const struct query_hash *qh; - const guint8 *arena; - guint i, shift; - gboolean has_urn; + const uint8 *arena; + uint i, shift; + uint hit = 0, word = 0; /* * This routine is a hot spot when running as an ultra node. @@ -4489,19 +5279,19 @@ */ arena = rt->arena; - has_urn = qhv->has_urn; shift = 32 - rt->bits; qh = qhv->vec; for (i = 0; i < qhv->count; i++) { - guint32 idx = qhi.hashcode >> shift; + uint32 idx = qhi.hashcode >> shift; - /* Tight loop -- g_assert(idx < (guint32) rt->slots); */ + /* Tight loop -- g_assert(idx < (uint32) rt->slots); */ /* * If there is an entry in the table and the source is an URN, * we have to forward the query, as those are OR-ed. - * Otherwise, ALL the keywords must be present. + * Otherwise, 2/3rd of the keywords must be present, if there + * are at least 3 words. * * When facing a SHA1 query, we require that at least one of the * URN matches or we don't forward the query. @@ -4510,29 +5300,33 @@ if (RT_SLOT_READ(arena, idx)) { if (qhi.source == QUERY_H_URN) /* URN present */ return TRUE; /* Will forward */ - if (has_urn) /* We passed all the URNs */ - return FALSE; /* And none matched */ + word++; + hit++; } else { if (qhi.source == QUERY_H_WORD) { /* Word NOT present */ /* We know no URN matched already because qhv is sorted */ - return FALSE; /* All words did not match */ + word++; } } } /* - * If we had no URN, all the words matched, so route query! - * If we had some URNs, none matched so don't forward. + * If we had no URN, verify that 2/3rd of the words matched, or that + * all matched if less than 3. + * If we had some URNs, none matched so don't forward if there was no word. */ - return !has_urn; + if (qhv->has_urn && 0 == word) + return FALSE; + + return word < 3 ? hit == word : 3 * hit / word >= 2; } /** * Check whether we can route a query identified by its hash vector * to a node. */ -gboolean +bool qrp_node_can_route(const gnutella_node_t *n, const query_hashvec_t *qhv) { const struct routing_table *rt = n->recv_query_table; @@ -4559,6 +5353,11 @@ * and by its source node (so we don't send back the query where it * came from). * + * When ``leaves'' is FALSE, we do not include leaves in the resulting list. + * This is used when dealing with a duplicate (but with higher TTL) query + * that needs to be forwarded to neighbouring ultra-nodes, but which leaves + * already received. + * * @attention * NB: it is allowed to call this with TTL=0, in which case we won't * consider UPs for forwarding. If TTL=1, we forward to all normal nodes @@ -4566,16 +5365,17 @@ * they could bring a match. * * @returns list of nodes, a subset of the currently connected nodes. - * Once used, the list of nodes can be freed with g_slist_free(). + * Once used, the list of nodes can be freed with pslist_free(). */ -G_GNUC_HOT GSList * +pslist_t * G_HOT qrt_build_query_target( - query_hashvec_t *qhvec, int hops, int ttl, struct gnutella_node *source) + query_hashvec_t *qhvec, int hops, int ttl, bool leaves, + gnutella_node_t *source) { - GSList *nodes = NULL; /* Targets for the query */ - const GSList *sl; - gboolean sha1_query; - gboolean whats_new; + pslist_t *nodes = NULL; /* Targets for the query */ + const pslist_t *sl; + bool sha1_query; + bool whats_new; g_assert(qhvec != NULL); g_assert(hops >= 0); @@ -4607,14 +5407,14 @@ * always get the query. */ - for (sl = node_all_nodes(); sl; sl = g_slist_next(sl)) { - struct gnutella_node *dn = sl->data; + PSLIST_FOREACH(node_all_gnet_nodes(), sl) { + gnutella_node_t *dn = sl->data; struct routing_table *rt = dn->recv_query_table; - gboolean is_leaf; + bool is_leaf; /* * Avoid G_UNLIKELY() hints in the loop. Either they are wrong hints - * or they increase the code size and resuly in I-cache misses, but + * or they increase the code size and result in I-cache misses, but * profiling showed that these hints actually slow down this routine. * --RAM, 2011-10-18 */ @@ -4637,11 +5437,15 @@ if (is_leaf) { /* Leaf node */ - if (whats_new) { + if (!leaves) { + continue; /* Routing duplicate query, skip! */ + } else if (whats_new) { if (NODE_CAN_WHAT(dn)) { + if (NODE_HAS_EMPTY_QRT(dn)) + continue; /* Leaf does not share, skip! */ goto can_send; /* What's New? queries broadcasted */ } else { - continue; + continue; /* Leaf won't understand it, skip! */ } } if (rt == NULL) /* No QRT yet */ @@ -4689,7 +5493,7 @@ */ if (rt->pass_throw < 100 && NODE_MQUEUE_COUNT(dn) != 0) { - if ((int) (random_u32() % 100) >= rt->pass_throw) + if ((int) random_value(99) >= rt->pass_throw) continue; } @@ -4714,7 +5518,7 @@ if (NODE_IN_TX_FLOW_CONTROL(dn)) { if (sha1_query) continue; - if (random_u32() % 256 >= 128) + if (random_value(255) >= 128) continue; } @@ -4736,11 +5540,11 @@ if (NODE_IS_TRANSIENT(dn)) { unsigned ratio; ratio = uint_saturate_mult(dn->n_spam, 100) / (dn->received + 1); - if (random_u32() % 100 < ratio) + if (random_value(99) < ratio) continue; } - nodes = g_slist_prepend(nodes, dn); + nodes = pslist_prepend(nodes, dn); if (rt != NULL && !whats_new) node_inc_qrp_match(dn); } @@ -4751,11 +5555,15 @@ /** * Route query message to leaf nodes, based on their QRT, or to ultrapeers * that support last-hop QRP if TTL=1. + * + * When ``with_leaves'' is FALSE, we don't route to leaf nodes because we're + * routing a duplicate query (with higher TTL) which leaves already got. */ void -qrt_route_query(struct gnutella_node *n, query_hashvec_t *qhvec) +qrt_route_query(gnutella_node_t *n, query_hashvec_t *qhvec, + bool with_leaves) { - GSList *nodes; /* Targets for the query */ + pslist_t *nodes; /* Targets for the query */ g_assert(qhvec != NULL); g_assert(gnutella_header_get_function(&n->header) == GTA_MSG_SEARCH); @@ -4763,7 +5571,7 @@ nodes = qrt_build_query_target(qhvec, gnutella_header_get_hops(&n->header), gnutella_header_get_ttl(&n->header), - n); + with_leaves, n); if G_UNLIKELY( GNET_PROPERTY(qrp_debug) > 4 || @@ -4771,15 +5579,15 @@ GNET_PROPERTY(log_gnutella_routing) || (GNET_PROPERTY(guess_server_debug) > 4 && NODE_IS_UDP(n)) ) { - GSList *sl; + pslist_t *sl; int leaves = 0; int ultras = 0; int words = 0; int urns = 0; size_t i; - for (sl = nodes; sl; sl = g_slist_next(sl)) { - struct gnutella_node *dn = sl->data; + PSLIST_FOREACH(nodes, sl) { + gnutella_node_t *dn = sl->data; if (NODE_IS_LEAF(dn)) leaves++; @@ -4795,15 +5603,14 @@ } g_debug( - "QRP %s%s %s %s(%d word%s + %d URN%s) " + "QRP %s%s %s(%d word%s + %d URN%s) " "forwarded to %d/%d leaves, %d ultra%s", NODE_IS_UDP(n) ? "(GUESS) " : "", gmsg_node_infostr(n), - guid_hex_str(gnutella_header_get_muid(&n->header)), qhvec_whats_new(qhvec) ? "\"What's New?\" " : "", - words, 1 == words ? "" : "s", urns, 1 == urns ? "" : "s", + words, plural(words), urns, plural(urns), leaves, GNET_PROPERTY(node_leaf_count), - ultras, ultras == 1 ? "" : "s"); + ultras, plural(ultras)); } if (nodes == NULL) @@ -4832,7 +5639,7 @@ gmsg_split_routeto_all(nodes, n, &n->header, n->data, n->size + GTA_HEADER_SIZE); - g_slist_free(nodes); + pslist_free(nodes); } /*** @@ -4851,12 +5658,12 @@ #define CHECK(x) g_assert((x)) #endif /* TEST */ -G_GNUC_COLD void +void G_COLD test_hash(void) { static const struct { - const guint32 s16; - const guint32 hash; + const uint32 s16; + const uint32 hash; } tests = { { { 0x30a2, 0x30cb, 0x30e1, 0 }, 46 }, /* a-ni-me */ { { 0x30e9, 0 }, 0 }, /* ra */ @@ -4867,7 +5674,7 @@ { { 0xff01, 0x9428, 0 }, 658 }, /* Same as above because "& 0xff" */ { { 0x1001, 0x2000, 0 }, 316 }, }; - guint i; + uint i; CHECK(qrp_hash("", 13)==0); CHECK(qrp_hash("eb", 13)==6791); @@ -4904,13 +5711,13 @@ CHECK(qrp_hash("3nja9", 10)==581); /* Non-ASCII test cases */ - for (i = 0; i < G_N_ELEMENTS(tests); i++) { + for (i = 0; i < N_ITEMS(tests); i++) { char buf1024; size_t n; - guint32 h; + uint32 h; - n = utf32_to_utf8(testsi.s, buf, G_N_ELEMENTS(buf)); - g_assert(n < G_N_ELEMENTS(buf)); + n = utf32_to_utf8(testsi.s, buf, N_ITEMS(buf)); + g_assert(n < N_ITEMS(buf)); h = qrp_hash(buf, 10); if (h != testsi.hash) {
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/qrp.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/qrp.h
Changed
@@ -51,10 +51,11 @@ }; typedef struct qrt_info { - int slots; /**< Amount of slots */ + int slots; /**< Amount of slots */ int generation; /**< Generation number */ int fill_ratio; /**< Percentage of slots used */ - int pass_throw; /**< Passing throw, on a d100 */ + uint8 pass_throw; /**< Passing throw, on a d100 */ + uint8 is_empty; /**< Set if table is empty */ } qrt_info_t; @@ -66,6 +67,7 @@ struct routing_table; struct shared_file; struct query_hashvec; +struct htable; typedef struct query_hashvec query_hashvec_t; @@ -76,41 +78,45 @@ void qrp_peermode_changed(void); void qrp_prepare_computation(void); -void qrp_add_file(const struct shared_file *sf, GHashTable *words); -void qrp_finalize_computation(GHashTable *words); -void qrp_dispose_words(GHashTable **h_ptr); +void qrp_add_file(const struct shared_file *sf, struct htable *words); +void qrp_finalize_computation(struct htable *words); +void qrp_dispose_words(struct htable **h_ptr); struct qrt_update *qrt_update_create(struct gnutella_node *n, struct routing_table *); void qrt_update_free(struct qrt_update *); -gboolean qrt_update_send_next(struct qrt_update *); -gboolean qrt_update_was_ok(struct qrt_update *); +bool qrt_update_send_next(struct qrt_update *); +bool qrt_update_was_ok(struct qrt_update *); struct qrt_receive *qrt_receive_create(struct gnutella_node *n, struct routing_table *); void qrt_receive_free(struct qrt_receive *); -gboolean qrt_receive_next(struct qrt_receive *, gboolean *done); +bool qrt_receive_next(struct qrt_receive *, bool *done); struct routing_table *qrt_get_table(void); struct routing_table *qrt_ref(struct routing_table *); void qrt_unref(struct routing_table *); void qrt_get_info(const struct routing_table *, qrt_info_t *qi); -struct query_hashvec *qhvec_alloc(guint size); +struct query_hashvec *qhvec_alloc(uint size); void qhvec_free(struct query_hashvec *qhvec); void qhvec_reset(struct query_hashvec *qhvec); query_hashvec_t * qhvec_clone(const query_hashvec_t *qsrc); void qhvec_add(struct query_hashvec *qhvec, const char *word, enum query_hsrc src); -gboolean qhvec_has_urn(const struct query_hashvec *qhv); -gboolean qhvec_whats_new(const struct query_hashvec *qhv); -void qhvec_set_whats_new(struct query_hashvec *qhv, gboolean val); -guint qhvec_count(const struct query_hashvec *qhv); - -GSList *qrt_build_query_target( - query_hashvec_t *qhvec, int hops, int ttl, struct gnutella_node *source); -void qrt_route_query(struct gnutella_node *n, query_hashvec_t *qhvec); -gboolean qrp_node_can_route(const struct gnutella_node *n, +bool qhvec_has_urn(const struct query_hashvec *qhv); +bool qhvec_whats_new(const struct query_hashvec *qhv); +void qhvec_set_whats_new(struct query_hashvec *qhv, bool val); +uint qhvec_count(const struct query_hashvec *qhv); + +struct pslist; + +struct pslist *qrt_build_query_target( + query_hashvec_t *qhvec, int hops, int ttl, bool leaves, + struct gnutella_node *source); +void qrt_route_query(struct gnutella_node *n, + query_hashvec_t *qhvec, bool leaves); +bool qrp_node_can_route(const struct gnutella_node *n, const query_hashvec_t *qhv); #endif /* _core_qrp_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/routing.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/routing.c
Changed
@@ -34,6 +34,7 @@ #include "common.h" #include "routing.h" + #include "gmsg.h" #include "gnet_stats.h" #include "guid.h" @@ -50,14 +51,20 @@ #include "lib/aging.h" #include "lib/atoms.h" #include "lib/endian.h" -#include "lib/glib-missing.h" #include "lib/halloc.h" +#include "lib/hashing.h" #include "lib/host_addr.h" +#include "lib/hset.h" +#include "lib/htable.h" +#include "lib/pslist.h" +#include "lib/str.h" +#include "lib/stringify.h" #include "lib/tm.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ -static struct gnutella_node *fake_node; /**< Our fake node */ +static gnutella_node_t *fake_node; /**< Our fake node */ /** * An UDP node that sent us a message and for which we want to retain the @@ -75,8 +82,9 @@ struct routing_udp_node { node_magic_t magic; /**< Magic number, MUST be the first field */ host_addr_t addr; /**< Remote node UDP address */ - guint16 port; /**< Remote node UDP port */ - guint8 can_deflate; /**< Whether servent supports UDP compression */ + uint16 port; /**< Remote node UDP port */ + uint8 can_deflate; /**< Whether servent supports UDP compression */ + uint8 sr_udp; /**< Whether servent has semi-reliable UDP */ struct route_data *routing_data; }; @@ -103,11 +111,11 @@ struct message { struct guid muid; /**< Message UID */ struct message **slot; /**< Place where we're referenced from */ - GSList *routes; /**< route_data from where the message came */ - GSList *ttls; /**< For broadcasted messages: TTL by route */ - guint8 function; /**< Type of the message */ - guint8 ttl; /**< Max TTL we saw for this message */ - guint8 chunk_idx; /**< Index of chunk holding the slot */ + pslist_t *routes; /**< route_data from where the message came */ + pslist_t *ttls; /**< For broadcasted messages: TTL by route */ + uint8 function; /**< Type of the message */ + uint8 ttl; /**< Max TTL we saw for this message */ + uint8 chunk_idx; /**< Index of chunk holding the slot */ }; /** @@ -127,7 +135,7 @@ */ struct route_data { void *node; /**< gnutella_node or routing_udp_node */ - gint32 saved_messages; /**< # msg from this host in routing table */ + int32 saved_messages; /**< # msg from this host in routing table */ }; static struct route_data fake_route; /**< Our fake route_data */ @@ -172,7 +180,7 @@ int capacity; /**< Capacity in terms of messages */ int count; /**< Amount really stored */ unsigned nchunks; /**< Amount of allocated chunks */ - GHashTable *messages_hashed; /**< All messages (key = struct message) */ + hset_t *messages_hashed; /**< All messages (key = struct message) */ time_t last_rotation; /**< Last time we restarted from idx=0 */ } routing; @@ -188,7 +196,7 @@ "27630b632f070ca9ffc48eb06a72c700", /**< Morpheus?, 2005-08-30 */ "58585858585858585858585858585858", /**< Probably an init bug! */ }; -static GHashTable *ht_banned_push; +static hset_t *ht_banned_push; /** * Starving GUIDs for push routing. @@ -200,7 +208,7 @@ * But still, in case we happen to see a query hit that comes from one of * the starving GUID, it's good to notify the download layer. */ -static GHashTable *ht_starving_guid; +static htable_t *ht_starving_guid; /** * Push-proxy table. @@ -208,18 +216,18 @@ * It maps a GUID to a node, so that we can easily send a push message * on behalf of a requesting node to the proper connection. */ -static GHashTable *ht_proxyfied; +static htable_t *ht_proxyfied; /** * Routing logging. */ struct route_log { host_addr_t addr; /**< Sender's IP */ - guint16 port; /**< Sender's port */ + uint16 port; /**< Sender's port */ struct guid muid; /**< Message ID */ - guint8 function; /**< Message function */ - guint8 hops; /**< Message hops */ - guint8 ttl; /**< Message ttl */ + uint8 function; /**< Message function */ + uint8 hops; /**< Message hops */ + uint8 ttl; /**< Message ttl */ char extra120; /**< Extra text for logging */ struct route_dest dest; /**< Message destination */ unsigned handle:1; /**< Whether message will be handled */ @@ -236,15 +244,14 @@ */ static aging_table_t *at_udp_routes; -static gboolean find_message( - const struct guid *muid, guint8 function, struct message **m); +static bool find_message( + const struct guid *muid, uint8 function, struct message **m); static void free_route_list(struct message *m); -static inline gboolean +static inline bool is_banned_push(const struct guid *guid) { - return NULL != g_hash_table_lookup(ht_banned_push, guid) || - guid_is_banned(guid); + return hset_contains(ht_banned_push, guid) || guid_is_banned(guid); } struct node_magic { @@ -255,7 +262,7 @@ * Checks whether the generic pointer in "struct route_data" points to a * gnutella_node. */ -static inline gboolean +static inline bool route_node_is_gnutella(const void *node) { g_assert(node != NULL); @@ -266,7 +273,7 @@ * Checks whether the generic pointer in "struct route_data" points to a * routing_udp_node. */ -static inline gboolean +static inline bool G_UNUSED route_node_is_udp(const void *node) { g_assert(node != NULL); @@ -276,7 +283,7 @@ /** * Force a gnutella_node as the route destination. */ -static struct gnutella_node * +static gnutella_node_t * route_node_get_gnutella(void *node) { switch (((struct node_magic *) node)->magic) { @@ -286,7 +293,7 @@ { struct routing_udp_node *un = node; return node_udp_route_get_addr_port(un->addr, un->port, - un->can_deflate); + un->can_deflate, un->sr_udp); } } g_assert_not_reached(); @@ -296,7 +303,7 @@ * Allocate a new UDP node recording the UDP route from node ``n''. */ static struct routing_udp_node * -route_allocate_udp(const struct gnutella_node *n) +route_allocate_udp(const gnutella_node_t *n) { struct routing_udp_node *un; @@ -307,9 +314,31 @@ un->magic = NODE_UDP_MAGIC; un->addr = n->addr; un->port = n->port; + + /* + * In some cases, the UDP route is allocated before the node can be flagged + * as supporting deflated traffic or semi-reliable UDP. In particular + * for GUESS queries which go through route_message() before having their + * actual message content analyzed. + * + * This is why we have the following routines to force the behaviour later + * on when the message is parsed: + * route_udp_mark_deflatable() + * route_udp_mark_semi_reliable() + * + * We know that a given host will not have varying support for deflation + * or semi-reliable UDP, hence this works. Because the UDP route will be + * collected when it is unused for too long, we should be immune against a + * new node with different characteristics reusing this IP:port. + * --RAM, 2014-06-29 + */ + /* If it can inflate, we can deflate traffic to it */ un->can_deflate = booleanize(NODE_CAN_INFLATE(n)); + /* If query had the semi-reliable UDP flag set, then we can use it */ + un->sr_udp = booleanize(NODE_HAS_SR_UDP(n)); + return un; } @@ -337,7 +366,7 @@ { const struct routing_udp_node *un = key; - return host_addr_hash(un->addr) ^ ((un->port << 16) | un->port); + return host_addr_port_hash(un->addr, un->port); } /** @@ -348,7 +377,7 @@ { const struct routing_udp_node *un1 = n1, *un2 = n2; - return un1->port == un2->port && host_addr_equal(un1->addr, un2->addr); + return un1->port == un2->port && host_addr_equiv(un1->addr, un2->addr); } /** @@ -373,12 +402,18 @@ /** * Fetch a minimal UDP node data structure that can be used to record * the route associated with a message we got from that UDP node. + * + * @param n the node for which we want the UDP route data + * @param verbose whether debugging message should be emitted on access + * + * @return the UDP node route. */ static struct routing_udp_node * -route_get_udp(const struct gnutella_node *n) +route_fetch_udp(const gnutella_node_t *n, bool verbose) { struct routing_udp_node key; struct routing_udp_node *un; + node_check(n); g_assert(NODE_IS_UDP(n)); @@ -393,15 +428,17 @@ un = aging_lookup_revitalise(at_udp_routes, &key); if (un != NULL) { - if (GNET_PROPERTY(guess_server_debug) > 4) { - g_debug("GUESS reusing known UDP node route %s:%u (%s)", - host_addr_to_string(n->addr), n->port, + if (verbose) { + g_debug("GUESS reusing known UDP node route %s (%s)", + host_addr_port_to_string(n->addr, n->port), + un->sr_udp ? "reliable" : un->can_deflate ? "deflatable" : "regular"); } } else { - if (GNET_PROPERTY(guess_server_debug) > 4) { - g_debug("GUESS creating new UDP node route %s:%u (%s)", - host_addr_to_string(n->addr), n->port, + if (verbose) { + g_debug("GUESS creating new UDP node route %s (%s)", + host_addr_port_to_string(n->addr, n->port), + NODE_HAS_SR_UDP(n) ? "reliable" : NODE_CAN_INFLATE(n) ? "deflatable" : "regular"); } un = route_allocate_udp(n); @@ -412,6 +449,62 @@ } /** + * Fetch a minimal UDP node data structure that can be used to record + * the route associated with a message we got from that UDP node. + */ +static struct routing_udp_node * +route_get_udp(const gnutella_node_t *n) +{ + return route_fetch_udp(n, GNET_PROPERTY(guess_server_debug) > 4); +} + +/** + * Flag UDP route as deflatable. + * + * If the route does not exist yet for that host, it is created. + */ +void +route_udp_mark_deflatable(const gnutella_node_t *n) +{ + struct routing_udp_node *un; + + node_check(n); + g_assert(NODE_IS_UDP(n)); + + un = route_fetch_udp(n, FALSE); + + if (GNET_PROPERTY(guess_server_debug) > 4 && !un->can_deflate) { + g_debug("GUESS flagging UDP node route %s as deflatable", + host_addr_port_to_string(n->addr, n->port)); + } + + un->can_deflate = TRUE; +} + +/** + * Flag UDP route as semi-reliable. + * + * If the route does not exist yet for that host, it is created. + */ +void +route_udp_mark_semi_reliable(const gnutella_node_t *n) +{ + struct routing_udp_node *un; + + node_check(n); + g_assert(NODE_IS_UDP(n)); + + un = route_fetch_udp(n, FALSE); + + if (GNET_PROPERTY(guess_server_debug) > 4 && !un->sr_udp) { + g_debug("GUESS flagging UDP node route %s as semi-reliable", + host_addr_port_to_string(n->addr, n->port)); + } + + un->sr_udp = TRUE; +} + +/** * Remove starving condition for a GUID. */ void @@ -422,7 +515,7 @@ * so don't clear anything. */ - g_hash_table_remove(ht_starving_guid, guid); + htable_remove(ht_starving_guid, guid); } /** @@ -437,8 +530,7 @@ void route_starving_add(const guid_t *guid, route_starving_cb_t cb) { - gm_hash_table_replace_const(ht_starving_guid, guid, - cast_func_to_pointer(cb)); + htable_insert(ht_starving_guid, guid, cast_func_to_pointer(cb)); } /** @@ -452,7 +544,7 @@ { route_starving_cb_t cb; - cb = cast_pointer_to_func(g_hash_table_lookup(ht_starving_guid, guid)); + cb = cast_pointer_to_func(htable_lookup(ht_starving_guid, guid)); if (cb != NULL) (*cb)(guid); @@ -463,8 +555,8 @@ */ static void routing_log_init(struct route_log *route_log, - struct gnutella_node *n, - const struct guid *muid, guint8 function, guint8 hops, guint8 ttl) + gnutella_node_t *n, + const struct guid *muid, uint8 function, uint8 hops, uint8 ttl) { if (!GNET_PROPERTY(log_gnutella_routing)) return; @@ -496,7 +588,7 @@ */ static void routing_log_set_route(struct route_log *route_log, - struct route_dest *dest, gboolean handle) + struct route_dest *dest, bool handle) { if (!GNET_PROPERTY(log_gnutella_routing)) return; @@ -518,13 +610,10 @@ route_log->new = TRUE; } -static void routing_log_extra(struct route_log *route_log, - const char *fmt, ...) G_GNUC_PRINTF(2, 3); - /** * Record extra logging information, appending to existing information. */ -static void +static void G_PRINTF(2, 3) routing_log_extra(struct route_log *route_log, const char *fmt, ...) { va_list args; @@ -549,7 +638,7 @@ buf += len; if (buflen > 2) { - int seplen = gm_snprintf(buf, buflen, "; "); + int seplen = str_bprintf(buf, buflen, "; "); buflen -= seplen; buf += seplen; @@ -560,7 +649,7 @@ return; va_start(args, fmt); - gm_vsnprintf(buf, buflen, fmt, args); + str_vbprintf(buf, buflen, fmt, args); va_end(args); } @@ -569,31 +658,35 @@ */ static char * route_string(struct route_dest *dest, - const host_addr_t origin_addr, gboolean routed) + const host_addr_t origin_addr, bool routed) { static char msg80; switch (dest->type) { case ROUTE_NONE: - gm_snprintf(msg, sizeof msg, routed ? "stops here" : "registered"); + str_bprintf(msg, sizeof msg, routed ? "stops here" : "registered"); + break; + case ROUTE_LEAVES: + str_bprintf(msg, sizeof msg, "all leaves"); break; case ROUTE_ONE: - gm_snprintf(msg, sizeof msg, "%s %s", + str_bprintf(msg, sizeof msg, "%s %s", node_type(dest->ur.u_node), node_addr(dest->ur.u_node)); break; case ROUTE_ALL_BUT_ONE: - gm_snprintf(msg, sizeof msg, "all but %s", + str_bprintf(msg, sizeof msg, "all %sbut %s", + dest->duplicate ? "ultras " : "", /* Won't be sent to leaves */ host_addr_to_string(origin_addr)); break; case ROUTE_MULTI: { - int count = g_slist_length(dest->ur.u_nodes); - gm_snprintf(msg, sizeof msg, "selected %u node%s", - count, count == 1 ? "" : "s"); + int count = pslist_length(dest->ur.u_nodes); + str_bprintf(msg, sizeof msg, "selected %u node%s", + count, plural(count)); } break; default: - gm_snprintf(msg, sizeof msg, "** BUG ** UNKNOWN ROUTE"); + str_bprintf(msg, sizeof msg, "** BUG ** UNKNOWN ROUTE"); break; } @@ -613,7 +706,8 @@ route_log->local ? "OURSELVES" : host_addr_port_to_string(route_log->addr, route_log->port), debug_msgroute_log->function, guid_hex_str(&route_log->muid), - route_log->hops, route_log->ttl, route_log->handle ? 'H' : ' ', + route_log->hops, route_log->ttl, + route_log->handle ? (route_log->dest.duplicate ? 'h' : 'H') : ' ', route_log->new ? 'N' : ' ', route_log->extra, route_log->extra0 == '\0' ? "" : " ", route_string(&route_log->dest, route_log->addr, route_log->routing)); @@ -647,7 +741,7 @@ switch (((struct node_magic *) n)->magic) { case NODE_MAGIC: { - struct gnutella_node *gn = n; + gnutella_node_t *gn = n; struct routing_udp_node *un; if (!NODE_IS_UDP(gn)) @@ -676,7 +770,7 @@ switch (((struct node_magic *) node)->magic) { case NODE_MAGIC: { - struct gnutella_node *gn = node; + gnutella_node_t *gn = node; struct routing_udp_node *un; if (!NODE_IS_UDP(gn)) { @@ -710,7 +804,7 @@ * @return created routing data structure. */ static struct route_data * -init_routing_data(struct gnutella_node *node) +init_routing_data(gnutella_node_t *node) { struct route_data *route; struct route_data **route_ptr; @@ -764,6 +858,37 @@ } /** + * Asserts that a message entry is consistent and belongs to the correct chunk. + * + * The "chunk" parameter points to the old chunk address and is used to + * properly validate the m->slot value (before our caller can update it + * to reflect the new chunk location). + */ +static void +message_check_chunk(const struct message * const m, unsigned chunk_idx, + struct message * const *chunk) +{ + const void *chunk_end; + + g_assert(m != NULL); + g_assert(chunk_idx == m->chunk_idx); + + /* + * Expand a variant of slot_check() since routing.chunkschunk_idx + * has been re-allocated and the old chunk address is given. + */ + + g_assert(uint_is_non_negative(chunk_idx)); + g_assert(chunk_idx < MAX_CHUNKS); + g_assert(chunk_idx < routing.nchunks); + + chunk_end = const_ptr_add_offset(chunk, CHUNK_MESSAGES * sizeof m); + + g_assert(ptr_cmp(m->slot, chunk) >= 0); + g_assert(ptr_cmp(m->slot, chunk_end) < 0); +} + +/** * Clean already allocated entry. */ static void @@ -771,7 +896,7 @@ { g_assert(entry != NULL); - g_hash_table_remove(routing.messages_hashed, entry); + hset_remove(routing.messages_hashed, entry); if (entry->routes != NULL) free_route_list(entry); @@ -793,7 +918,7 @@ { struct message *entry = *entryp; - STATIC_ASSERT(MAX_CHUNKS <= MAX_INT_VAL(guint8)); + STATIC_ASSERT(MAX_CHUNKS <= MAX_INT_VAL(uint8)); g_assert(uint_is_non_negative(chunk_idx)); g_assert(chunk_idx < MAX_CHUNKS); @@ -805,7 +930,7 @@ entry->slot = entryp; entry->chunk_idx = chunk_idx; /* 8-bit value, must fit */ routing.count++; - gnet_stats_count_general(GNR_ROUTING_TABLE_COUNT, +1); + gnet_stats_inc_general(GNR_ROUTING_TABLE_COUNT); goto done; } @@ -868,7 +993,7 @@ struct message *m = *p; if (m != NULL) { - message_check(m, chunk_idx); + message_check_chunk(m, chunk_idx, chunk); m->slot = p; } } @@ -911,6 +1036,73 @@ } /** + * Clear routing table, starting with specified chunk index. + * + * @param idx the index of the first chunk to clear + */ +static void +routing_clear(unsigned idx) +{ + size_t i; + + for (i = idx; i < routing.nchunks; i++) { + struct message **rchunk = routing.chunksi; + size_t j; + + if (GNET_PROPERTY(routing_debug)) { + g_debug("RT freeing chunk #%zu at %p, now holds %d / %d", + i, (void *) rchunk, routing.count, routing.capacity); + } + + for (j = 0; j < CHUNK_MESSAGES; j++) { + struct message *m = rchunkj; + + if (m != NULL) { + message_check(m, i); + g_assert(m->slot == &rchunkj); + clean_entry(m); + WFREE(m); + routing.count--; + } + } + + routing.capacity -= CHUNK_MESSAGES; + HFREE_NULL(routing.chunksi); + } + + routing.nchunks = idx; + gnet_stats_set_general(GNR_ROUTING_TABLE_CHUNKS, routing.nchunks); + gnet_stats_set_general(GNR_ROUTING_TABLE_CAPACITY, routing.capacity); + gnet_stats_set_general(GNR_ROUTING_TABLE_COUNT, routing.count); + + g_assert(uint_is_non_negative(routing.nchunks)); + + /* + * After freeing chunks, we may be able to move around some of the + * remaining ones. + */ + + routing_chunk_move_attempt(); +} + +/** + * Clear the whole routing table. + */ +void +routing_clear_all(void) +{ + if (GNET_PROPERTY(routing_debug)) { + g_debug("RT clearing whole table (holds %d / %d)", + routing.capacity, routing.count); + } + + routing_clear(0); + routing.next_idx = 0; + routing.last_rotation = tm_time(); + hset_clear(routing.messages_hashed); /* Paranoid */ +} + +/** * Fetch next routing table slot, a pointer to a routing entry. * * When `advance' is FALSE, the slot is allocated as usual but there is @@ -927,7 +1119,7 @@ * @return the address of the allocated slot. */ static struct message ** -get_next_slot(gboolean advance, unsigned *cidx) +get_next_slot(bool advance, unsigned *cidx) { unsigned idx; unsigned chunk_idx; @@ -966,61 +1158,17 @@ */ if G_UNLIKELY(elapsed > TABLE_MIN_CYCLE) { - size_t i; - /* * 0 != ENTRY_INDEX(idx): means we're not at the start of a chunk. * chunk == NULL: means we've reached an empty chunk, nothing to free. */ - if G_LIKELY(0 != ENTRY_INDEX(idx) || NULL == chunk) - goto get_slot; - - for (i = chunk_idx; i < routing.nchunks; i++) { - struct message **rchunk = routing.chunksi; - size_t j; - - if (GNET_PROPERTY(routing_debug)) { - g_debug("RT freeing chunk #%zu at %p, now holds %d / %d", - i, (void *) rchunk, routing.count, routing.capacity); - } - - for (j = 0; j < CHUNK_MESSAGES; j++) { - struct message *m = rchunkj; - - if (m != NULL) { - message_check(m, i); - g_assert(m->slot == &rchunkj); - clean_entry(m); - WFREE(m); - routing.count--; - } - } - - routing.capacity -= CHUNK_MESSAGES; - HFREE_NULL(routing.chunksi); + if G_UNLIKELY(chunk != NULL && 0 == ENTRY_INDEX(idx)) { + routing_clear(chunk_idx); + chunk = NULL; } - - chunk = NULL; - routing.nchunks = chunk_idx; - gnet_stats_set_general(GNR_ROUTING_TABLE_CHUNKS, routing.nchunks); - gnet_stats_set_general(GNR_ROUTING_TABLE_CAPACITY, routing.capacity); - gnet_stats_set_general(GNR_ROUTING_TABLE_COUNT, routing.count); - - g_assert(uint_is_non_negative(routing.nchunks)); - - /* - * After freeing chunks, we may be able to move around some of the - * remaining ones. - */ - - routing_chunk_move_attempt(); - - /* FALL THROUGH */ } -get_slot: - if (chunk == NULL) { g_assert(idx >= UNSIGNED(routing.capacity)); @@ -1055,7 +1203,7 @@ routing.chunkschunk_idx = halloc0(CHUNK_MESSAGES * sizeof(struct message *)); - gnet_stats_count_general(GNR_ROUTING_TABLE_CHUNKS, +1); + gnet_stats_inc_general(GNR_ROUTING_TABLE_CHUNKS); gnet_stats_count_general(GNR_ROUTING_TABLE_CAPACITY, CHUNK_MESSAGES); @@ -1134,7 +1282,7 @@ * @return the new location of the revitalized entry */ static void -revitalize_entry(struct message *entry, gboolean force) +revitalize_entry(struct message *entry, bool force) { struct message **relocated; struct message *prev; @@ -1176,7 +1324,7 @@ clean_entry(prev); WFREE(prev); routing.count--; - gnet_stats_count_general(GNR_ROUTING_TABLE_COUNT, -1); + gnet_stats_dec_general(GNR_ROUTING_TABLE_COUNT); } /* @@ -1194,11 +1342,11 @@ /** * Did node send the message? */ -static gboolean -route_node_sent_message(struct gnutella_node *n, struct message *m) +static bool +route_node_sent_message(gnutella_node_t *n, struct message *m) { struct route_data *route; - GSList *sl; + pslist_t *sl; if (n == fake_node) route = &fake_route; @@ -1213,7 +1361,7 @@ if (route == NULL) return FALSE; - for (sl = m->routes; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(m->routes, sl) { if (route == sl->data) return TRUE; } @@ -1229,33 +1377,45 @@ * @return FALSE if the message is really a duplicate (current TTL not greater) * and the node should not have broadcasted this message again. */ -static gboolean -route_node_ttl_higher(struct gnutella_node *n, struct message *m, guint8 ttl) +static bool +route_node_ttl_higher(gnutella_node_t *n, struct message *m, uint8 ttl) { - GSList *l; + pslist_t *l; int i; struct route_data *route; g_assert(n != fake_node); + + /* + * GTA_MSG_G2_SEARCH is a fake function used to process G2 queries. + * + * Since we run as a leaf node, and we fake the TTL, it does not make + * sense to check whether this "duplicate" query comes with a higher TTL. + * It's really a duplicate message. + */ + + if (GTA_MSG_G2_SEARCH == m->function) + return FALSE; /* As a G2 leaf, we do not care, it's a dup */ + + g_assert(m->ttls != NULL); g_assert( m->function == GTA_MSG_PUSH_REQUEST || m->function == GTA_MSG_SEARCH); - g_assert(m->ttls != NULL); route = get_routing_data(n); g_assert(route != NULL); - for (l = m->routes, i = 0; l; l = g_slist_next(l), i++) { + for (l = m->routes, i = 0; l; l = pslist_next(l), i++) { if (route == l->data) { - GSList *t = g_slist_nth(m->ttls, i); - guint8 old_ttl; + pslist_t *t = pslist_nth(m->ttls, i); + uint8 old_ttl; g_assert(t != NULL); old_ttl = GPOINTER_TO_INT(t->data); if (old_ttl >= ttl) return FALSE; - t->data = GUINT_TO_POINTER((guint) ttl); + t->data = GUINT_TO_POINTER((uint) ttl); return TRUE; } } @@ -1268,7 +1428,7 @@ * compares two message structures */ static int -message_compare_func(gconstpointer p, gconstpointer q) +message_compare_func(const void *p, const void *q) { const struct message *a = p, *b = q; @@ -1278,17 +1438,24 @@ /** * Hashes message structures for storage in a hash table. */ -static guint -message_hash_func(gconstpointer key) +static uint +message_hash_func(const void *key) { const struct message *msg = key; - guint hash, i; - hash = msg->function; - for (i = 0; i < 4; i++) { - hash ^= peek_le32(&msg->muid.vi * 4); - } - return hash; + return integer_hash_fast(msg->function) ^ + universal_hash(&msg->muid, GUID_RAW_SIZE); +} + +/** + * Alternate hashing of message structures for storage in a hash table. + */ +static uint +message_hash_func2(const void *key) +{ + const struct message *msg = key; + + return integer_hash2(msg->function) ^ guid_hash(&msg->muid); } /** @@ -1303,17 +1470,17 @@ /** * Init function. */ -G_GNUC_COLD void +void G_COLD routing_init(void) { struct guid guid_buf; - guint32 i; + uint32 i; /* * Make sure it segfaults if we try to access it, but it must be * distinct from NULL. */ - fake_node = deconstify_gpointer(vmm_trap_page()); + fake_node = deconstify_pointer(vmm_trap_page()); fake_route.saved_messages = 0; fake_route.node = fake_node; @@ -1321,27 +1488,33 @@ * Initialize the banned GUID hash. */ - ht_banned_push = g_hash_table_new(guid_hash, guid_eq); + ht_banned_push = hset_create(HASH_KEY_FIXED, GUID_RAW_SIZE); - for (i = 0; i < G_N_ELEMENTS(banned_push); i++) { + for (i = 0; i < N_ITEMS(banned_push); i++) { struct guid guid; const char *hex = banned_pushi; g_assert(strlen(hex) == 2 * sizeof guid); (void) hex_to_guid(hex, &guid); - gm_hash_table_insert_const(ht_banned_push, - atom_guid_get(&guid), GUINT_TO_POINTER(1)); + hset_insert(ht_banned_push, atom_guid_get(&guid)); } /* * If they did not configure a sticky GUID, or if the GUID ia blank, * configure a new one. + * + * In the advent of an unclean restart (i.e. after a crash), we ignore + * the "sticky_guid" property though since this is merely the resuming + * of the previously interrupted run. */ gnet_prop_get_storage(PROP_SERVENT_GUID, &guid_buf, sizeof guid_buf); - if (guid_is_blank(&guid_buf) || !GNET_PROPERTY(sticky_guid)) { + if ( + guid_is_blank(&guid_buf) || + (!GNET_PROPERTY(sticky_guid) && GNET_PROPERTY(clean_restart)) + ) { do { guid_random_muid(&guid_buf); /* @@ -1374,6 +1547,7 @@ case GTA_MSG_HSEP_DATA: s = "HSEP "; break; case GTA_MSG_BYE: s = "Bye "; break; case GTA_MSG_DHT: s = "DHT "; break; + case GTA_MSG_G2_SEARCH: s = "Q2 "; break; } debug_msgi = s; } @@ -1383,16 +1557,16 @@ * need to be deallocated */ - routing.messages_hashed = - g_hash_table_new(message_hash_func, message_compare_func); + routing.messages_hashed = hset_create_any(message_hash_func, + message_hash_func2, message_compare_func); routing.last_rotation = tm_time(); /* * Push proxification and starving GUIDs. */ - ht_proxyfied = g_hash_table_new(guid_hash, guid_eq); - ht_starving_guid = g_hash_table_new(guid_hash, guid_eq); + ht_proxyfied = htable_create(HASH_KEY_FIXED, GUID_RAW_SIZE); + ht_starving_guid = htable_create(HASH_KEY_FIXED, GUID_RAW_SIZE); /* * GUESS query hit routing. @@ -1406,7 +1580,7 @@ * Generate a new muid and put it in a message header. */ void -message_set_muid(gnutella_header_t *header, guint8 function) +message_set_muid(gnutella_header_t *header, uint8 function) { switch (function) { case GTA_MSG_PUSH_REQUEST: @@ -1460,21 +1634,22 @@ static void free_route_list(struct message *m) { - GSList *sl; + pslist_t *sl; g_assert(m); - for (sl = m->routes; sl; sl = g_slist_next(sl)) + PSLIST_FOREACH(m->routes, sl) { remove_one_message_reference(sl->data); + } - gm_slist_free_null(&m->routes); + pslist_free_null(&m->routes); /* * If the message was a broadcasted one, we kept track of the TTL of * each message along the route. This needs to be freed as well. */ - gm_slist_free_null(&m->ttls); /* Data are ints, nothing to free */ + pslist_free_null(&m->ttls); /* Data are ints, nothing to free */ } /** @@ -1519,19 +1694,19 @@ * node emitting it. */ void -message_add(const struct guid *muid, guint8 function, - struct gnutella_node *node) +message_add(const struct guid *muid, uint8 function, + gnutella_node_t *node) { struct route_data *route; struct message *entry; struct message *m; - gboolean found; + bool found; found = find_message(muid, function, &m); if (!node) { struct route_log route_log; - gboolean already_recorded = FALSE; + bool already_recorded = FALSE; routing_log_init(&route_log, NULL, muid, function, 0, GNET_PROPERTY(my_ttl)); @@ -1588,10 +1763,10 @@ */ if (!found || !route_node_sent_message(node, m)) { - guint ttl; + uint ttl; route->saved_messages++; - entry->routes = g_slist_append(entry->routes, route); + entry->routes = pslist_append(entry->routes, route); /* * If message is typically broadcasted, also record the TTL of @@ -1607,7 +1782,7 @@ switch (function) { case GTA_MSG_PUSH_REQUEST: case GTA_MSG_SEARCH: - entry->ttls = g_slist_append(entry->ttls, GUINT_TO_POINTER(ttl)); + entry->ttls = pslist_append(entry->ttls, GUINT_TO_POINTER(ttl)); break; } } @@ -1621,9 +1796,11 @@ if (node != fake_node) entry->ttl = gnutella_header_get_ttl(&node->header); + else + entry->ttl = GNET_PROPERTY(my_ttl); /* insert the new message into the hash table */ - g_hash_table_insert(routing.messages_hashed, entry, entry); + hset_insert(routing.messages_hashed, entry); } /** @@ -1633,29 +1810,29 @@ static void purge_dangling_references(struct message *m) { - GSList *sl; - GSList *t; + pslist_t *sl; + pslist_t *t; for (sl = m->routes, t = m->ttls; sl; /* empty */) { struct route_data *rd = sl->data; if (rd->node == NULL) { - GSList *next = g_slist_next(sl); - m->routes = g_slist_remove_link(m->routes, sl); + pslist_t *next = pslist_next(sl); + m->routes = pslist_remove_link(m->routes, sl); remove_one_message_reference(rd); - g_slist_free_1(sl); + pslist_free_1(sl); sl = next; if (t) { - next = g_slist_next(t); - m->ttls = g_slist_remove_link(m->ttls, t); - g_slist_free_1(t); + next = pslist_next(t); + m->ttls = pslist_remove_link(m->ttls, t); + pslist_free_1(t); t = next; } } else { - sl = g_slist_next(sl); + sl = pslist_next(sl); if (t) - t = g_slist_next(t); + t = pslist_next(t); } } } @@ -1668,12 +1845,12 @@ * @param node is the node from which we got the message */ void -message_forget(const struct guid *muid, guint8 function, gnutella_node_t *node) +message_forget(const struct guid *muid, uint8 function, gnutella_node_t *node) { - gboolean found; + bool found; struct message *m; - GSList *sl; - GSList *t; + pslist_t *sl; + pslist_t *t; struct route_data *route; g_assert(muid != NULL); @@ -1689,14 +1866,14 @@ for ( sl = m->routes, t = m->ttls; sl != NULL; - sl = g_slist_next(sl), t = g_slist_next(t) + sl = pslist_next(sl), t = pslist_next(t) ) { struct route_data *rd = sl->data; if (route == rd) { - m->routes = g_slist_remove_link(m->routes, sl); + m->routes = pslist_remove_link(m->routes, sl); if (t != NULL) - m->ttls = g_slist_remove_link(m->ttls, t); + m->ttls = pslist_remove_link(m->ttls, t); remove_one_message_reference(rd); break; } @@ -1711,26 +1888,26 @@ * * @return TRUE if the message is found. */ -static gboolean -find_message(const struct guid *muid, guint8 function, struct message **m) +static bool +find_message(const struct guid *muid, uint8 function, struct message **m) { - struct message dummyMessage; - struct message *found_message; + struct message dummy; + const void *orig_key; - dummyMessage.muid = *muid; - dummyMessage.function = function; + dummy.muid = *muid; + dummy.function = function; - found_message = g_hash_table_lookup(routing.messages_hashed, &dummyMessage); + if (hset_contains_extended(routing.messages_hashed, &dummy, &orig_key)) { + struct message *msg = deconstify_pointer(orig_key); - if (!found_message) { - *m = NULL; - return FALSE; /* We don't remember anything about this message */ - } else { /* wipe out dead references to old nodes */ - purge_dangling_references(found_message); + purge_dangling_references(msg); - *m = found_message; + *m = msg; return TRUE; /* Message was seen */ + } else { + *m = NULL; + return FALSE; /* We don't remember anything about this message */ } } @@ -1741,8 +1918,8 @@ * * @return TRUE if OK, FALSE if message should not be forwarded. */ -static gboolean -check_hops(struct route_log *route_log, struct gnutella_node *sender) +static bool +check_hops(struct route_log *route_log, gnutella_node_t *sender) { /* * Can't forward a message with 255 hops: we can't increase the @@ -1770,13 +1947,15 @@ * * @return TRUE if OK, FALSE if message should not be forwarded. */ -static gboolean -check_ttl(struct route_log *route_log, struct gnutella_node *sender) +static bool +check_ttl(struct route_log *route_log, gnutella_node_t *sender) { if (gnutella_header_get_ttl(&sender->header) == 0) { routing_log_extra(route_log, "TTL was 0"); - node_sent_ttl0(sender); - return FALSE; /* Don't route */ + if (!NODE_IS_UDP(sender)) { /* Be lenient if coming from UDP */ + node_sent_ttl0(sender); + return FALSE; /* Don't route */ + } } return TRUE; @@ -1788,13 +1967,41 @@ * @return TRUE if we can continue, FALSE if we should not forward the * message. */ -static gboolean -check_hops_ttl(struct route_log *route_log, struct gnutella_node *sender) +static bool +check_hops_ttl(struct route_log *route_log, gnutella_node_t *sender) { return check_hops(route_log, sender) && check_ttl(route_log, sender); } /** + * Calculates the TTL that should be used when the message is forwarded. + * + * @returns the TTL used when forwarding the message. + */ +static int +route_max_forward_ttl(const gnutella_node_t *sender) +{ + int ttl_forward = gnutella_header_get_ttl(&sender->header); + + if ( + (uint) gnutella_header_get_hops(&sender->header) + + gnutella_header_get_ttl(&sender->header) + > GNET_PROPERTY(max_ttl) + ) { + int ttl_max; + + /* Trim down */ + ttl_max = GNET_PROPERTY(max_ttl); + ttl_max -= gnutella_header_get_hops(&sender->header); + ttl_max = MAX(ttl_max, 1); + + ttl_forward = ttl_max; + } + + return ttl_forward; +} + +/** * Forwards message to one node if `target' is non-NULL, or to all nodes but * the sender otherwise. If we kick the node, then *node is set to NULL. * The message is not physically sent yet, but the `dest' structure is filled @@ -1810,20 +2017,20 @@ * * @returns whether we should handle the message after routing. */ -static gboolean +static bool forward_message( struct route_log *route_log, - struct gnutella_node **node, - struct gnutella_node *target, struct route_dest *dest, GSList *routes) + gnutella_node_t **node, + gnutella_node_t *target, struct route_dest *dest, pslist_t *routes) { - struct gnutella_node *sender = *node; + gnutella_node_t *sender = *node; g_assert(routes == NULL || target == NULL); g_assert(settings_is_ultra()); /* Drop messages that would travel way too many nodes --RAM */ if ( - (guint32) gnutella_header_get_ttl(&sender->header) + + (uint32) gnutella_header_get_ttl(&sender->header) + gnutella_header_get_hops(&sender->header) > GNET_PROPERTY(hard_ttl_limit) ) { @@ -1874,19 +2081,19 @@ */ if (routes != NULL) { - GSList *l; - GSList *nodes = NULL; + pslist_t *l; + pslist_t *nodes = NULL; int count = 0; g_assert(gnutella_header_get_function(&sender->header) == GTA_MSG_PUSH_REQUEST); - for (l = routes; l; l = g_slist_next(l)) { + PSLIST_FOREACH(routes, l) { struct route_data *rd = l->data; if (rd->node == sender) continue; - nodes = g_slist_prepend(nodes, rd->node); + nodes = pslist_prepend(nodes, rd->node); count++; } @@ -1897,10 +2104,34 @@ if (count > 0) { dest->type = ROUTE_MULTI; dest->ur.u_nodes = nodes; + + /* + * If PUSH was coming from UDP and we're going to route it, + * make sure its TTL is reasonable, and reset its hop count + * to 0 as we're going to start real routing from here. + * --RAM, 2012-11-02 + */ + + if (NODE_IS_UDP(sender)) { + uint8 ttl = gnutella_header_get_ttl(&sender->header); + uint8 hops = gnutella_header_get_hops(&sender->header); + uint8 ttl_max; + + if (hops != 0) { + gnutella_header_set_hops(&sender->header, 0); + routing_log_extra(route_log, "hops %u => 0", hops); + } + ttl_max = MAX(ttl, GNET_PROPERTY(max_ttl)); + if (ttl < ttl_max) { + gnutella_header_set_ttl(&sender->header, ttl_max); + routing_log_extra(route_log, "TTL %u => %u", + ttl, ttl_max); + } + } } if (count > 1) - gnet_stats_count_general(GNR_BROADCASTED_PUSHES, 1); + gnet_stats_inc_general(GNR_BROADCASTED_PUSHES); } else if (target != NULL) { dest->type = ROUTE_ONE; @@ -1913,16 +2144,13 @@ */ if ( - (guint) gnutella_header_get_hops(&sender->header) + + (uint) gnutella_header_get_hops(&sender->header) + gnutella_header_get_ttl(&sender->header) > GNET_PROPERTY(max_ttl) ) { - int ttl_max; - + int ttl_max = route_max_forward_ttl(sender); + /* Trim down */ - ttl_max = GNET_PROPERTY(max_ttl); - ttl_max -= gnutella_header_get_hops(&sender->header); - ttl_max = MAX(ttl_max, 1); gnutella_header_set_ttl(&sender->header, ttl_max); @@ -1954,12 +2182,13 @@ * * @return whether we should route the message (a duplicate with a higher TTL). */ -static gboolean +static bool handle_duplicate(struct route_log *route_log, gnutella_node_t **node, - struct message *m, gboolean oob) + struct message *m, bool oob) { gnutella_node_t *sender = *node; - gboolean forward = FALSE; + bool forward = FALSE; + int ttl_forward = route_max_forward_ttl(sender); node_check(sender); g_assert(m != NULL); @@ -1975,26 +2204,24 @@ */ if (oob) - gnet_stats_count_general(GNR_QUERY_OOB_PROXIED_DUPS, 1); + gnet_stats_inc_general(GNR_QUERY_OOB_PROXIED_DUPS); routing_log_extra(route_log, oob ? "dup OOB GUID" : "dup message"); - if (gnutella_header_get_ttl(&sender->header) > m->ttl) { - routing_log_extra(route_log, "higher TTL"); + if (ttl_forward > m->ttl) { + routing_log_extra(route_log, "higher TTL (%d>%u)", ttl_forward, m->ttl); - gnet_stats_count_general(GNR_DUPS_WITH_HIGHER_TTL, 1); + gnet_stats_inc_general(GNR_DUPS_WITH_HIGHER_TTL); if (GNET_PROPERTY(log_dup_gnutella_higher_ttl)) { - gmsg_log_split_duplicate(&sender->header, sender->data, - sender->size, + gmsg_log_duplicate(sender, "from %s: %shigher TTL (previous TTL was %u)", node_infostr(sender), oob ? "OOB, " : "", m->ttl); } - /* Remember highest TTL */ - m->ttl = gnutella_header_get_ttl(&sender->header); + m->ttl = ttl_forward; /* Remember highest TTL */ - forward = TRUE; /* Forward but don't handle */ + forward = TRUE; /* Forward but don't handle */ } if (!forward) @@ -2007,7 +2234,7 @@ */ if (m->routes && route_node_sent_message(sender, m)) { - gboolean higher_ttl; + bool higher_ttl; /* * The same node has sent us a message twice! @@ -2023,8 +2250,7 @@ routing_log_extra(route_log, "same node"); if (GNET_PROPERTY(log_dup_gnutella_higher_ttl)) { - gmsg_log_split_duplicate(&sender->header, sender->data, - sender->size, + gmsg_log_duplicate(sender, "from %s: %ssame node, higher TTL (dups=%u)", node_infostr(sender), oob ? "OOB, " : "", sender->n_dups); } @@ -2032,8 +2258,8 @@ routing_log_extra(route_log, "same node and no higher TTL"); if (GNET_PROPERTY(log_dup_gnutella_same_node)) { - gmsg_log_split_duplicate(&sender->header, sender->data, - sender->size, "from %s: %ssame node (dups=%u)", + gmsg_log_duplicate(sender, + "from %s: %ssame node (dups=%u)", node_infostr(sender), oob ? "OOB, " : "", sender->n_dups); } } @@ -2059,7 +2285,7 @@ sender->n_dups++ >= GNET_PROPERTY(min_dup_msg) && connected_nodes() > MAX(2, GNET_PROPERTY(up_connections)) && sender->n_dups > - (guint16)(1.0 * GNET_PROPERTY(min_dup_ratio) / 10000.0 + (uint16)(1.0 * GNET_PROPERTY(min_dup_ratio) / 10000.0 * sender->received) ) { node_mark_bad_vendor(sender); @@ -2070,33 +2296,30 @@ *node = NULL; } else { if (GNET_PROPERTY(log_bad_gnutella)) - gmsg_log_bad(sender, "dup message ID %s from same node", - guid_hex_str(gnutella_header_get_muid(&sender->header))); + gmsg_log_bad(sender, "dup message from same node"); } } else { if (m->routes == NULL) { routing_log_extra(route_log, "all routes lost"); if (GNET_PROPERTY(log_dup_gnutella_other_node)) { - gmsg_log_split_duplicate(&sender->header, sender->data, - sender->size, + gmsg_log_duplicate(sender, "from %s: %sother node, no route (dups=%u)", node_infostr(sender), oob ? "OOB, " : "", sender->n_dups); } } else { if (GNET_PROPERTY(log_gnutella_routing)) { - unsigned count = g_slist_length(m->routes); + unsigned count = pslist_length(m->routes); routing_log_extra(route_log, "%u remaining route%s", - count, 1 == count ? "" : "s"); + count, plural(count)); } if (GNET_PROPERTY(log_dup_gnutella_other_node)) { - unsigned count = g_slist_length(m->routes); - gmsg_log_split_duplicate(&sender->header, sender->data, - sender->size, + unsigned count = pslist_length(m->routes); + gmsg_log_duplicate(sender, "from %s: %sother node, %u route%s (dups=%u)", node_infostr(sender), oob ? "OOB, " : "", - count, 1 == count ? "" : "s", sender->n_dups); + count, plural(count), sender->n_dups); } } } @@ -2117,12 +2340,12 @@ * @return whether we should route the message. If `*mp' is not NULL, then * the message was a duplicate and it should not be handled locally. */ -static gboolean -check_duplicate(struct route_log *route_log, struct gnutella_node **node, +static bool +check_duplicate(struct route_log *route_log, gnutella_node_t **node, const guid_t *mangled, struct message **mp) { - struct gnutella_node *sender = *node; - guint8 function = gnutella_header_get_function(&sender->header); + gnutella_node_t *sender = *node; + uint8 function = gnutella_header_get_function(&sender->header); const guid_t *muid = gnutella_header_get_muid(&sender->header); if (find_message(muid, function, mp)) @@ -2150,7 +2373,7 @@ routing_log_set_new(route_log); if (GNET_PROPERTY(log_new_gnutella)) { - g_debug("NEW %s %s from %s", guid_hex_str(muid), + g_debug("NEW #%s %s from %s", guid_hex_str(muid), gmsg_infostr_full_split( &sender->header, sender->data, sender->size), node_infostr(sender)); @@ -2164,14 +2387,15 @@ * * @return whether message should be handled */ -static gboolean +static bool route_push(struct route_log *route_log, - struct gnutella_node **node, struct route_dest *dest) + gnutella_node_t **node, struct route_dest *dest) { - struct gnutella_node *sender = *node; + gnutella_node_t *sender = *node; struct message *m; const struct guid *guid; - struct gnutella_node *neighbour; + gnutella_node_t *neighbour; + host_addr_t ip; /* * A Push request is not broadcasted as other requests, it is routed @@ -2205,7 +2429,7 @@ if (is_banned_push(guid)) { if (GNET_PROPERTY(routing_debug) > 3) { - gmsg_log_split_dropped(&sender->header, sender->data, sender->size, + gmsg_log_dropped(sender, "from %s, banned GUID %s", node_addr(sender), guid_hex_str(guid)); } @@ -2221,9 +2445,12 @@ * an IPv4 target. */ - if (hostiles_check(host_addr_peek_ipv4(&sender->data20))) { - routing_log_extra(route_log, "callback IP %s is hostile", - host_addr_to_string(host_addr_peek_ipv4(&sender->data20))); + ip = host_addr_peek_ipv4(&sender->data20); + + if (hostiles_is_bad(ip)) { + hostiles_flags_t flags = hostiles_check(ip); + routing_log_extra(route_log, "callback IP %s is hostile (%s)", + host_addr_to_string(ip), hostiles_flags_to_string(flags)); gnet_stats_count_dropped(sender, MSG_DROP_HOSTILE_IP); return FALSE; } @@ -2234,7 +2461,7 @@ */ if (NULL != (neighbour = node_by_guid(guid))) { - gnet_stats_count_general(GNR_PUSH_RELAYED_VIA_LOCAL_ROUTE, 1); + gnet_stats_inc_general(GNR_PUSH_RELAYED_VIA_LOCAL_ROUTE); /* * If we got a PUSH directly through UDP, and we can relay it to @@ -2242,7 +2469,7 @@ */ if (NODE_IS_UDP(sender)) - gnet_stats_count_general(GNR_PUSH_PROXY_UDP_RELAYED, 1); + gnet_stats_inc_general(GNR_PUSH_PROXY_UDP_RELAYED); routing_log_extra(route_log, "connected to target GUID %s", guid_hex_str(guid)); @@ -2255,7 +2482,7 @@ forward_message(route_log, node, neighbour, dest, NULL); } else if (find_message(guid, QUERY_HIT_ROUTE_SAVE, &m) && m->routes) { - gnet_stats_count_general(GNR_PUSH_RELAYED_VIA_TABLE_ROUTE, 1); + gnet_stats_inc_general(GNR_PUSH_RELAYED_VIA_TABLE_ROUTE); /* * By revitalizing the entry, we'll remember the route for @@ -2287,12 +2514,13 @@ * * @return whether message should be handled */ -static gboolean +static bool route_query(struct route_log *route_log, - struct gnutella_node **node, struct route_dest *dest) + gnutella_node_t **node, struct route_dest *dest) { - struct gnutella_node *sender = *node; - gboolean is_oob_query; + gnutella_node_t *sender = *node; + bool is_oob_query; + bool handle_it; /* * Leaves process all the queries and don't route them. @@ -2307,7 +2535,8 @@ if (NODE_IS_UDP(sender)) { routing_log_extra(route_log, "UDP"); - return TRUE; /* Process it, but don't route */ + handle_it = TRUE; /* Process it, but don't route */ + goto done; } is_oob_query = gmsg_split_is_oob_query(&sender->header, sender->data); @@ -2360,11 +2589,11 @@ if ( !(sender->attrs & NODE_A_DYN_QUERY) && - (guint) gnutella_header_get_ttl(&sender->header) + + (uint) gnutella_header_get_ttl(&sender->header) + gnutella_header_get_hops(&sender->header) > GNET_PROPERTY(my_ttl) ) { int ttl_max; - + /* Trim down */ ttl_max = GNET_PROPERTY(my_ttl); ttl_max -= gnutella_header_get_hops(&sender->header); @@ -2376,7 +2605,18 @@ } /* Broadcast */ - return forward_message(route_log, node, NULL, dest, NULL); + handle_it = forward_message(route_log, node, NULL, dest, NULL); + + /* + * Query needs to be forwarded to all leaves if we have to handle it + * and message was not a duplicate. + */ + +done: + if (handle_it && ROUTE_NONE == dest->type && !dest->duplicate) + dest->type = ROUTE_LEAVES; + + return handle_it; } /** @@ -2384,15 +2624,15 @@ * * @return whether message should be handled */ -static gboolean +static bool route_query_hit(struct route_log *route_log, - struct gnutella_node **node, struct route_dest *dest) + gnutella_node_t **node, struct route_dest *dest) { - struct gnutella_node *sender = *node; + gnutella_node_t *sender = *node; struct message *m; - gboolean node_is_target = FALSE; - struct gnutella_node *found; - gboolean is_oob_proxied; + bool node_is_target = FALSE; + gnutella_node_t *found; + bool is_oob_proxied; const struct guid *origin_guid; const guid_t *muid = gnutella_header_get_muid(&sender->header); @@ -2448,7 +2688,7 @@ g_assert(m->ttls == NULL); - m->routes = g_slist_append(m->routes, route); + m->routes = pslist_append(m->routes, route); route->saved_messages++; /* @@ -2481,8 +2721,7 @@ sender->n_bad++; /* Node shouldn't have forwarded this message */ if (GNET_PROPERTY(log_bad_gnutella)) - gmsg_log_bad(sender, "got reply without matching request %s%s", - guid_hex_str(gnutella_header_get_muid(&sender->header)), + gmsg_log_bad(sender, "got reply without matching request%s", is_oob_proxied ? " (OOB-proxied)" : ""); goto handle; @@ -2508,9 +2747,9 @@ if (route_node_sent_message(fake_node, m)) { node_is_target = TRUE; /* We are the target of the reply */ if (is_oob_proxied) - gnet_stats_count_general(GNR_OOB_PROXIED_QUERY_HITS, 1); + gnet_stats_inc_general(GNR_OOB_PROXIED_QUERY_HITS); else - gnet_stats_count_general(GNR_LOCAL_QUERY_HITS, 1); + gnet_stats_inc_general(GNR_LOCAL_QUERY_HITS); goto handle; } @@ -2525,7 +2764,7 @@ */ if (is_oob_proxied) { - g_carp("BUG: forgot we sent OOB-proxied query %s in routing table!", + g_carp("BUG: forgot we sent OOB-proxied query #%s in routing table!", guid_hex_str(gnutella_header_get_muid(&sender->header))); node_is_target = TRUE; /* We are the target of the reply */ routing_log_extra(route_log, "forgot OOB-proxied MUID"); @@ -2539,11 +2778,11 @@ * XXX route for relaying. --RAM, 2004-08-29 */ { - GSList *sl; - gboolean skipped_transient = FALSE; + pslist_t *sl; + bool skipped_transient = FALSE; found = NULL; - for (sl = m->routes; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(m->routes, sl) { struct route_data *route = sl->data; g_assert(route); @@ -2567,7 +2806,7 @@ * will be logged as a message targeted to a transient node. */ - if (NULL != g_slist_next(sl)) { + if (NULL != pslist_next(sl)) { gnutella_node_t *rn; rn = route_node_get_gnutella(route->node); @@ -2579,8 +2818,7 @@ /* Count non-transient route found after skipping */ if (skipped_transient) { - gnet_stats_count_general( - GNR_ROUTING_TRANSIENT_AVOIDED, 1); + gnet_stats_inc_general(GNR_ROUTING_TRANSIENT_AVOIDED); } } } @@ -2629,7 +2867,7 @@ dest->ur.u_node = found; if (GNET_PROPERTY(guess_server_debug) > 10 && NODE_IS_UDP(found)) { - g_debug("GUESS routing query hit %s to %s", + g_debug("GUESS routing query hit #%s to %s", guid_hex_str(gnutella_header_get_muid(&sender->header)), node_infostr(found)); } @@ -2686,18 +2924,22 @@ * * @returns whether the message is to be handled locally. */ -gboolean -route_message(struct gnutella_node **node, struct route_dest *dest) +bool +route_message(gnutella_node_t **node, struct route_dest *dest) { - gboolean handle_it = FALSE; - struct gnutella_node *sender = *node; + bool handle_it = FALSE; + gnutella_node_t *sender = *node; struct message *m; - gboolean duplicate = FALSE; + bool duplicate = FALSE; struct route_log route_log; - const struct guid *mangled = NULL; - guint8 function; + const guid_t *mangled = NULL; + const guid_t *muid = NULL; + uint8 function; + + node_check(sender); function = gnutella_header_get_function(&sender->header); + muid = gnutella_header_get_muid(&sender->header); /* Ensure we never get something bearing our special GUID route marker */ g_assert(function != QUERY_HIT_ROUTE_SAVE); @@ -2706,8 +2948,7 @@ dest->duplicate = FALSE; routing_log_init(&route_log, sender, - gnutella_header_get_muid(&sender->header), - function, + muid, function, gnutella_header_get_hops(&sender->header), gnutella_header_get_ttl(&sender->header)); @@ -2718,11 +2959,11 @@ if ( GTA_MSG_SEARCH == function && + !NODE_TALKS_G2(sender) && gmsg_split_is_oob_query(&sender->header, sender->data) ) { - mangled = route_mangled_oob_muid( - gnutella_header_get_muid(&sender->header)); - gnet_stats_count_general(GNR_OOB_QUERIES, 1); + mangled = route_mangled_oob_muid(muid); + gnet_stats_inc_general(GNR_OOB_QUERIES); routing_log_extra(&route_log, "OOB"); } @@ -2734,12 +2975,20 @@ switch (function) { case GTA_MSG_PUSH_REQUEST: case GTA_MSG_SEARCH: + case GTA_MSG_G2_SEARCH: { - gboolean route_it = check_duplicate(&route_log, node, mangled, &m); + bool route_it = check_duplicate(&route_log, node, mangled, &m); dest->duplicate = duplicate = booleanize(m != NULL); /* + * If the node has been removed, we won't handle the message. + */ + + if G_UNLIKELY(NULL == *node) + goto done; + + /* * Record the message in the routing table. * * If it's a duplicate, we'll record the additional route, which @@ -2751,8 +3000,7 @@ */ if (function != GTA_MSG_PUSH_REQUEST || !NODE_IS_UDP(sender)) { - message_add(gnutella_header_get_muid(&sender->header), - gnutella_header_get_function(&sender->header), sender); + message_add(muid, function, sender); } /* @@ -2764,8 +3012,7 @@ */ if (mangled) { - message_add(mangled, - gnutella_header_get_function(&sender->header), sender); + message_add(mangled, function, sender); } if (!route_it) @@ -2780,7 +3027,7 @@ * Compute the route, determine if we should handle the message. */ - switch (gnutella_header_get_function(&sender->header)) { + switch (function) { case GTA_MSG_PUSH_REQUEST: handle_it = route_push(&route_log, node, dest); break; @@ -2790,6 +3037,9 @@ case GTA_MSG_SEARCH_RESULTS: handle_it = route_query_hit(&route_log, node, dest); break; + case GTA_MSG_G2_SEARCH: + handle_it = TRUE; /* We're a G2 leaf node */ + break; default: /* * Any other message that gets passed to route_message() must @@ -2822,8 +3072,8 @@ * * @returns boolean indicating whether we have such a route. */ -gboolean -route_exists_for_reply(const struct guid *muid, guint8 function) +bool +route_exists_for_reply(const struct guid *muid, uint8 function) { struct message *m; @@ -2839,7 +3089,7 @@ * @return TRUE if GUID is routable, FALSE if no PUSH could ever properly * reach the target node. */ -gboolean +bool route_guid_pushable(const struct guid *guid) { return !is_banned_push(guid); @@ -2852,26 +3102,26 @@ * @returns NULL if we have no such route, or a list of node to which we should * send the packet otherwise. It is up to the caller to free that list. */ -GSList * +pslist_t * route_towards_guid(const struct guid *guid) { - struct gnutella_node *node; + gnutella_node_t *node; struct message *m; if (is_banned_push(guid)) return NULL; - + node = node_by_guid(guid); if (node) - return g_slist_prepend(NULL, node); - + return pslist_prepend(NULL, node); + if (find_message(guid, QUERY_HIT_ROUTE_SAVE, &m) && m->routes) { - GSList *iter, *nodes = NULL; - + pslist_t *iter, *nodes = NULL; + revitalize_entry(m, TRUE); - for (iter = m->routes; NULL != iter; iter = g_slist_next(iter)) { + PSLIST_FOREACH(m->routes, iter) { struct route_data *rd = iter->data; - nodes = g_slist_prepend(nodes, rd->node); + nodes = pslist_prepend(nodes, rd->node); } return nodes; } @@ -2890,7 +3140,7 @@ * so don't clear anything. */ - g_hash_table_remove(ht_proxyfied, guid); + htable_remove(ht_proxyfied, guid); } /** @@ -2901,13 +3151,13 @@ * @attention * NB: assumes `guid' is already an atom linked somehow to `n'. */ -gboolean -route_proxy_add(const struct guid *guid, struct gnutella_node *n) +bool +route_proxy_add(const struct guid *guid, gnutella_node_t *n) { - if (NULL != g_hash_table_lookup(ht_proxyfied, guid)) + if (htable_contains(ht_proxyfied, guid)) return FALSE; - gm_hash_table_insert_const(ht_proxyfied, guid, n); + htable_insert(ht_proxyfied, guid, n); return TRUE; } @@ -2918,19 +3168,18 @@ * @returns node address if we found it, or NULL if we aren't connected to * that node directly. */ -struct gnutella_node * +gnutella_node_t * route_proxy_find(const struct guid *guid) { - return g_hash_table_lookup(ht_proxyfied, guid); + return htable_lookup(ht_proxyfied, guid); } /** * Frees the banned GUID atom keys. */ static void -free_banned_push(gpointer key, gpointer unused_value, gpointer unused_udata) +free_banned_push(const void *key, void *unused_udata) { - (void) unused_value; (void) unused_udata; atom_guid_free(key); } @@ -2938,14 +3187,14 @@ /** * Destroy routing data structures. */ -G_GNUC_COLD void +void G_COLD routing_close(void) { - guint cnt; + uint cnt; - g_assert(routing.messages_hashed); + g_assert(routing.messages_hashed != NULL); - gm_hash_table_destroy_null(&routing.messages_hashed); + hset_free_null(&routing.messages_hashed); for (cnt = 0; cnt < MAX_CHUNKS; cnt++) { struct message **chunk = routing.chunkscnt; @@ -2963,22 +3212,24 @@ } } - g_hash_table_foreach(ht_banned_push, free_banned_push, NULL); - gm_hash_table_destroy_null(&ht_banned_push); + hset_foreach(ht_banned_push, free_banned_push, NULL); + hset_free_null(&ht_banned_push); - cnt = g_hash_table_size(ht_proxyfied); - if (cnt != 0) + cnt = htable_count(ht_proxyfied); + if (cnt != 0) { g_warning("push-proxification table still holds %u node%s", - cnt, cnt == 1 ? "" : "s"); + cnt, plural(cnt)); + } - gm_hash_table_destroy_null(&ht_proxyfied); + htable_free_null(&ht_proxyfied); - cnt = g_hash_table_size(ht_starving_guid); - if (cnt != 0) + cnt = htable_count(ht_starving_guid); + if (cnt != 0) { g_warning("starving GUID table still holds %u entr%s", - cnt, cnt == 1 ? "y" : "ies"); + cnt, plural_y(cnt)); + } - gm_hash_table_destroy_null(&ht_starving_guid); + htable_free_null(&ht_starving_guid); aging_destroy(&at_udp_routes); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/routing.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/routing.h
Changed
@@ -36,6 +36,7 @@ typedef enum { ROUTE_NONE = 0, /**< No route, message stops here */ + ROUTE_LEAVES, /**< Route to leaves only */ ROUTE_ONE, /**< Route to single node */ ROUTE_ALL_BUT_ONE, /**< Route to all nodes but one */ ROUTE_MULTI /**< Route to list of nodes */ @@ -49,7 +50,7 @@ route_type_t type; union { struct gnutella_node *u_node; - GSList *u_nodes; /**< For ROUTE_MULTI */ + struct pslist *u_nodes; /**< For ROUTE_MULTI */ } ur; unsigned duplicate:1; /**< Set if message was a duplicate */ }; @@ -67,16 +68,19 @@ void routing_init(void); void routing_close(void); -void message_set_muid(gnutella_header_t *header, guint8 function); -gboolean route_message(struct gnutella_node **, struct route_dest *); +void routing_clear_all(void); +void message_set_muid(gnutella_header_t *header, uint8 function); +bool route_message(struct gnutella_node **, struct route_dest *); void routing_node_remove(void *node); -void message_add(const struct guid *muid, guint8, struct gnutella_node *); -void message_forget(const struct guid *muid, guint8, struct gnutella_node *); -GSList *route_towards_guid(const struct guid *guid); -gboolean route_exists_for_reply(const struct guid *muid, guint8 function); -gboolean route_guid_pushable(const struct guid *guid); +void message_add(const struct guid *muid, uint8, struct gnutella_node *); +void message_forget(const struct guid *muid, uint8, struct gnutella_node *); +struct pslist *route_towards_guid(const struct guid *guid); +bool route_exists_for_reply(const struct guid *muid, uint8 function); +bool route_guid_pushable(const struct guid *guid); +void route_udp_mark_deflatable(const struct gnutella_node *n); +void route_udp_mark_semi_reliable(const struct gnutella_node *n); -gboolean route_proxy_add(const struct guid *guid, struct gnutella_node *n); +bool route_proxy_add(const struct guid *guid, struct gnutella_node *n); void route_proxy_remove(const struct guid *guid); struct gnutella_node *route_proxy_find(const struct guid *guid); @@ -84,4 +88,5 @@ void route_starving_remove(const struct guid *guid); #endif /* _core_routing_h_ */ + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/rudp.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/rudp.c
Changed
@@ -42,71 +42,77 @@ #include "if/gnet_property_priv.h" #include "lib/endian.h" +#include "lib/hashing.h" #include "lib/hashlist.h" #include "lib/host_addr.h" -#include "lib/pmsg.h" +#include "lib/hset.h" #include "lib/inputevt.h" +#include "lib/pmsg.h" #include "lib/walloc.h" #include "lib/override.h" /* Must be the last header included */ /* The currently support protocol version. */ -static const guint16 RUDP_PROTO_VERSION = 0; +static const uint16 RUDP_PROTO_VERSION = 0; + +static const uint16 RUDP_WINDOW = 20; /* Standardized RUDP packet opcodes */ enum rudp_op { - RUDP_OP_SYN = 0x00, - RUDP_OP_ACK = 0x01, - RUDP_OP_KEEP_ALIVE = 0x02, - RUDP_OP_DATA = 0x03, - RUDP_OP_FIN = 0x04 + RUDP_OP_SYN = 0x00, + RUDP_OP_ACK = 0x01, + RUDP_OP_KEEP_ALIVE = 0x02, + RUDP_OP_DATA = 0x03, + RUDP_OP_FIN = 0x04 }; /* Standardized RUDP FIN codes */ enum rudp_fin_reason { - RUDP_FIN_CLOSE = 0x00, - RUDP_FIN_ACK = 0x01, - RUDP_FIN_TIMEOUT = 0x02, - RUDP_FIN_TOO_BIG = 0x03, - RUDP_FIN_TOO_BAD = 0x04 + RUDP_FIN_CLOSE = 0x00, + RUDP_FIN_ACK = 0x01, + RUDP_FIN_TIMEOUT = 0x02, + RUDP_FIN_TOO_BIG = 0x03, + RUDP_FIN_TOO_BAD = 0x04 }; -/* Raw layout of a RUDP packet header. This overlays/replaces the GUID area of - * a Gnutella packet. Thus the "GUID" of these is meaningless. */ +/* + * Raw layout of a RUDP packet header. This overlays/replaces the GUID area of + * a Gnutella packet. Thus the "GUID" of these is meaningless. + */ struct rudp_header { - guint8 peer_conn_id; - guint8 op_and_len; - guint8 seq_no2; + uint8 peer_conn_id; + uint8 op_and_len; + uint8 seq_no2; }; /* Raw layout of a RUDP SYN packet */ struct rudp_syn { - struct rudp_header common; + struct rudp_header common; - guint8 conn_id; - guint8 proto_ver2; + uint8 conn_id; + uint8 proto_ver2; }; /* Raw layout of a RUDP ACK packet */ struct rudp_ack { - struct rudp_header common; + struct rudp_header common; - guint8 window_start2; - guint8 window_space2; + uint8 window_start2; + uint8 window_space2; }; /* Raw layout of a RUDP DATA packet */ struct rudp_data { - struct rudp_header common; + struct rudp_header common; - guint8 data112; + uint8 data112; }; /* Raw layout of a RUDP FIN packet */ struct rudp_fin { - struct rudp_header common; + struct rudp_header common; - guint8 reason; + uint8 reason; }; /* @@ -114,10 +120,10 @@ */ enum rudp_status { - RUDP_ST_ALLOCED = 0, /* Freshly allocated, nothing has been sent */ - RUDP_ST_SYN_SENT, /* Sent one or SYNs but not ACKed yet */ - RUDP_ST_ESTABLISHED, /* Our SYN was ACKed */ - RUDP_ST_CLOSED /* The connection was closed; FIN sent */ + RUDP_ST_ALLOCED = 0, /* Freshly allocated, nothing has been sent */ + RUDP_ST_SYN_SENT, /* Sent one or SYNs but not ACKed yet */ + RUDP_ST_ESTABLISHED, /* Our SYN was ACKed */ + RUDP_ST_CLOSED /* The connection was closed; FIN sent */ }; enum rudp_list { @@ -134,28 +140,28 @@ struct rudp_window { pmsg_t *buffers32; - guint64 seq_no; /* The current sequence number */ - guint rd; /* Read position; wrapping index into `buffers' */ - guint wr; /* Write position; wrapping index into `buffers' */ - guint64 start; /* The first sequence number in this window */ - guint16 space; /* The size of the window */ + uint64 seq_no; /* The current sequence number */ + uint rd; /* Read position; wrapping index into `buffers' */ + uint wr; /* Write position; wrapping index into `buffers' */ + uint64 start; /* The first sequence number in this window */ + uint16 space; /* The size of the window */ tm_t last_event; /* Timestamp of the last I/O event */ }; struct rudp_con { - inputevt_handler_t event_handler; - inputevt_cond_t event_cond; - gpointer event_data; - - host_addr_t addr; - guint16 port; - guint8 conn_id; - struct rudp_window in; - struct rudp_window out; - enum rudp_status status; + inputevt_handler_t event_handler; + inputevt_cond_t event_cond; + void *event_data; + + host_addr_t addr; + uint16 port; + uint8 conn_id; + struct rudp_window in; + struct rudp_window out; + enum rudp_status status; }; -static GHashTable *connections; +static hset_t *connections; #define RUDP_DEBUG(x) \ G_STMT_START { \ @@ -165,72 +171,71 @@ } G_STMT_END static const char * -rudp_op_to_string(guint8 op) +rudp_op_to_string(uint8 op) { - if (op <= 0x04) { - enum rudp_op v = op; + if (op <= 0x04) { + enum rudp_op v = op; - switch (v) { + switch (v) { #define CASE(x) case ( RUDP_OP_ ##x ) : return #x; - CASE(SYN) - CASE(ACK) - CASE(KEEP_ALIVE) - CASE(DATA) - CASE(FIN) + CASE(SYN) + CASE(ACK) + CASE(KEEP_ALIVE) + CASE(DATA) + CASE(FIN) #undef CASE - } - } - return NULL; + } + } + return NULL; } static const char * -rudp_fin_reason_to_string(guint8 reason) +rudp_fin_reason_to_string(uint8 reason) { - if (reason <= 0x04) { - enum rudp_fin_reason v = reason; + if (reason <= 0x04) { + enum rudp_fin_reason v = reason; - switch (v) { + switch (v) { #define CASE(x) case ( RUDP_FIN_ ##x ) : return #x; - CASE(CLOSE) - CASE(ACK) - CASE(TIMEOUT) - CASE(TOO_BIG) - CASE(TOO_BAD) + CASE(CLOSE) + CASE(ACK) + CASE(TIMEOUT) + CASE(TOO_BIG) + CASE(TOO_BAD) #undef CASE - } - } - return "<Unknown>"; + } + } + return "<Unknown>"; } /** - * Hash function for use in g_hash_table_new. + * Hash function for use in hash tables. */ -static guint -rudp_con_hash(gconstpointer key) +static uint +rudp_con_hash(const void *key) { const struct rudp_con *c = key; - return host_addr_hash(c->addr) ^ - ((c->port << 16) | c->port) ^ - c->conn_id; + return host_addr_port_hash(c->addr, c->port) ^ + integer_hash_fast(c->conn_id); } /** * Compare function which returns TRUE if the connections are equal. * - * @note For use in g_hash_table_new. + * @note For use in hash tables. */ int -rudp_con_eq(gconstpointer v1, gconstpointer v2) +rudp_con_eq(const void *v1, const void *v2) { const struct rudp_con *c1 = v1, *c2 = v2; return c1->conn_id == c2->conn_id && - c1->port == c2->port && host_addr_equal(c1->addr, c2->addr); + c1->port == c2->port && host_addr_equiv(c1->addr, c2->addr); } static void -rudp_list_add(enum rudp_list i, struct rudp_con *con, gboolean ready) +rudp_list_add(enum rudp_list i, struct rudp_con *con, bool ready) { g_return_if_fail(con); @@ -241,13 +246,13 @@ } static void -rudp_set_readable(struct rudp_con *con, gboolean ready) +rudp_set_readable(struct rudp_con *con, bool ready) { rudp_list_add(RUDP_LIST_READABLE, con, ready); } static void -rudp_set_writable(struct rudp_con *con, gboolean ready) +rudp_set_writable(struct rudp_con *con, bool ready) { rudp_list_add(RUDP_LIST_WRITABLE, con, ready); } @@ -259,35 +264,35 @@ } static void -rudp_set_incoming(struct rudp_con *con, gboolean ready) +rudp_set_incoming(struct rudp_con *con, bool ready) { rudp_list_add(RUDP_LIST_INCOMING, con, ready); } static void -rudp_set_pending(struct rudp_con *con, gboolean ready) +rudp_set_pending(struct rudp_con *con, bool ready) { rudp_list_add(RUDP_LIST_PENDING, con, ready); } -static inline gboolean -rudp_seq_number_in_recv_window(const struct rudp_con *con, guint16 seq_no) +static inline bool +rudp_seq_number_in_recv_window(const struct rudp_con *con, uint16 seq_no) { /* TODO: Overflow handling */ return seq_no >= con->in.start && - seq_no <= (guint32) con->in.start + con->in.space; + seq_no <= (uint32) con->in.start + con->in.space; } -static inline gboolean -rudp_seq_number_in_send_window(const struct rudp_con *con, guint16 seq_no) +static inline bool +rudp_seq_number_in_send_window(const struct rudp_con *con, uint16 seq_no) { /* TODO: Overflow handling */ return seq_no >= con->out.start && - seq_no <= (guint32) con->out.start + con->out.space; + seq_no <= (uint32) con->out.start + con->out.space; } struct rudp_con * -rudp_find(const host_addr_t addr, guint16 port, guint8 conn_id) +rudp_find(const host_addr_t addr, uint16 port, uint8 conn_id) { static const struct rudp_con zero_con; struct rudp_con key; @@ -296,11 +301,11 @@ key.addr = addr; key.port = port; key.conn_id = conn_id; - return g_hash_table_lookup(connections, &key); + return hset_lookup(connections, &key); } struct rudp_con * -rudp_alloc(const host_addr_t addr, guint16 port, guint8 conn_id) +rudp_alloc(const host_addr_t addr, uint16 port, uint8 conn_id) { g_return_val_if_fail(is_host_addr(addr), NULL); g_return_val_if_fail(0 != port, NULL); @@ -314,79 +319,80 @@ con->addr = addr; con->port = port; con->conn_id = conn_id; - con->in.space = 20; - con->out.space = 20; - g_hash_table_insert(connections, con, con); + con->in.space = RUDP_WINDOW; + con->out.space = RUDP_WINDOW; + hset_insert(connections, con); return con; } return NULL; } static void -rudp_set_gnet_header(gnutella_header_t *header, guint32 size) +rudp_set_gnet_header(gnutella_header_t *header, uint32 size) { - g_assert(size < 0xffff); + g_assert(size < 0xffff); - ZERO(&header->muid); - header->function = GTA_MSG_RUDP; - header->ttl = 1; - header->hops = 0; - poke_le32(header->size, size); + ZERO(&header->muid); + header->function = GTA_MSG_RUDP; + header->ttl = 1; + header->hops = 0; + poke_le32(header->size, size); } static void -rudp_set_header(struct rudp_header *header, enum rudp_op op, guint8 conn_id, - guint8 data1_len, guint16 seq_no) -{ - g_assert(op < 16); - g_assert(data1_len <= 12); +rudp_set_header(struct rudp_header *header, enum rudp_op op, uint8 conn_id, + uint8 data1_len, uint16 seq_no) +{ + g_assert(op < 16); + g_assert(data1_len <= 12); - header->op_and_len = (op << 4) | (data1_len & 0x0f); - header->peer_conn_id = conn_id; - poke_be16(header->seq_no, seq_no); -} + header->op_and_len = (op << 4) | (data1_len & 0x0f); + header->peer_conn_id = conn_id; + poke_be16(header->seq_no, seq_no); +} static void -rudp_send_packet(struct rudp_con *con, gconstpointer data, size_t size) +rudp_send_packet(struct rudp_con *con, const void *data, size_t size) { - const struct gnutella_node *n; + const gnutella_node_t *n; - RUDP_DEBUG(("SENDING TO %s", host_addr_port_to_string(con->addr, con->port))); + RUDP_DEBUG( + ("SENDING TO %s", host_addr_port_to_string(con->addr, con->port))); - { - gnutella_header_t *header = data; + { + gnutella_header_t *header = data; - g_return_if_fail(GTA_MSG_RUDP == header->function); - g_return_if_fail(1 == header->ttl); - g_return_if_fail(0 == header->hops); - g_return_if_fail(size - 23 == peek_le32(header->size)); + g_return_if_fail(GTA_MSG_RUDP == header->function); + g_return_if_fail(1 == header->ttl); + g_return_if_fail(0 == header->hops); + g_return_if_fail(size - 23 == peek_le32(header->size)); - RUDP_DEBUG(("TYPE=0x%02x TTL=%u HOPS=%u SIZE=%lu", - header->function, header->ttl, header->hops, - (gulong) peek_le32(header->size))); - } + RUDP_DEBUG(("TYPE=0x%02x TTL=%u HOPS=%u SIZE=%lu", + header->function, header->ttl, header->hops, + (ulong) peek_le32(header->size))); + } - { - const struct rudp_header *header = data; - - g_return_if_fail((header->op_and_len & 0x0f) <= 12); - g_return_if_fail(((header->op_and_len >> 4) & 0x0f) <= 0x04); - g_return_if_fail(header->peer_conn_id == con->conn_id); - - RUDP_DEBUG(("OP=%s DATA1_LEN=%u CONN_ID=%u SEQ_NO=%u\n", - rudp_op_to_string((header->op_and_len >> 4) & 0x0f), - header->op_and_len & 0x0f, header->peer_conn_id, - peek_be16(header->seq_no))); - } + { + const struct rudp_header *header = data; - n = node_udp_get_addr_port(con->addr, con->port); - if (n) { - udp_send_msg(n, data, size); - tm_now(&con->out.last_event); - } + g_return_if_fail((header->op_and_len & 0x0f) <= 12); + g_return_if_fail(((header->op_and_len >> 4) & 0x0f) <= 0x04); + g_return_if_fail(header->peer_conn_id == con->conn_id); + + RUDP_DEBUG(("OP=%s DATA1_LEN=%u CONN_ID=%u SEQ_NO=%u\n", + rudp_op_to_string((header->op_and_len >> 4) & 0x0f), + header->op_and_len & 0x0f, header->peer_conn_id, + peek_be16(header->seq_no))); + } + + n = node_udp_get_addr_port(con->addr, con->port); + if (n) { + udp_send_msg(n, data, size); + tm_now(&con->out.last_event); + } } -static inline gboolean +static inline bool rudp_may_send_syn(const struct rudp_con *con) { switch (con->status) { @@ -402,119 +408,119 @@ static void rudp_send_syn(struct rudp_con *con) -{ - g_return_if_fail(con); - g_return_if_fail(0 == con->out.start); - g_return_if_fail(rudp_may_send_syn(con)); +{ + g_return_if_fail(con); + g_return_if_fail(0 == con->out.start); + g_return_if_fail(rudp_may_send_syn(con)); - switch (con->status) { - case RUDP_ST_ALLOCED: - { - gnutella_header_t *gnet; - struct rudp_syn *syn; - char packetMAX(sizeof *gnet, sizeof *syn); - pmsg_t *mb; + switch (con->status) { + case RUDP_ST_ALLOCED: + { + gnutella_header_t *gnet; + struct rudp_syn *syn; + char packetMAX(sizeof *gnet, sizeof *syn); + pmsg_t *mb; - STATIC_ASSERT(23 == sizeof packet); + STATIC_ASSERT(23 == sizeof packet); - gnet = cast_to_gpointer(&packet); - syn = cast_to_gpointer(&packet); + gnet = cast_to_pointer(&packet); + syn = cast_to_pointer(&packet); - rudp_set_gnet_header(gnet, 0); - rudp_set_header(&syn->common, RUDP_OP_SYN, con->conn_id, 0, - con->out.seq_no++); + rudp_set_gnet_header(gnet, 0); + rudp_set_header(&syn->common, RUDP_OP_SYN, con->conn_id, 0, + con->out.seq_no++); - syn->conn_id = con->conn_id; - poke_be16(syn->proto_ver, RUDP_PROTO_VERSION); + syn->conn_id = con->conn_id; + poke_be16(syn->proto_ver, RUDP_PROTO_VERSION); - RUDP_DEBUG(("RUDP: Sending SYN to %s (proto_ver=%u, conn_id=%u)", - host_addr_port_to_string(con->addr, con->port), - peek_be16(syn->proto_ver), syn->conn_id)); + RUDP_DEBUG(("RUDP: Sending SYN to %s (proto_ver=%u, conn_id=%u)", + host_addr_port_to_string(con->addr, con->port), + peek_be16(syn->proto_ver), syn->conn_id)); - mb = pmsg_new(PMSG_P_DATA, &packet, sizeof packet); + mb = pmsg_new(PMSG_P_DATA, &packet, sizeof packet); - g_return_if_fail(0 == con->out.wr); - con->out.bufferscon->out.wr++ = mb; - con->status = RUDP_ST_SYN_SENT; - } + g_return_if_fail(0 == con->out.wr); + con->out.bufferscon->out.wr++ = mb; + con->status = RUDP_ST_SYN_SENT; + } /* FALL THROUGH */ - case RUDP_ST_SYN_SENT: - { - pmsg_t *mb; - - g_return_if_fail(0 == con->out.rd); - mb = con->out.bufferscon->out.rd; - g_return_if_fail(mb); - - rudp_send_packet(con, pmsg_read_base(mb), pmsg_size(mb)); - } - break; - case RUDP_ST_ESTABLISHED: - case RUDP_ST_CLOSED: - break; + case RUDP_ST_SYN_SENT: + { + pmsg_t *mb; + + g_return_if_fail(0 == con->out.rd); + mb = con->out.bufferscon->out.rd; + g_return_if_fail(mb); + + rudp_send_packet(con, pmsg_read_base(mb), pmsg_size(mb)); + } + break; + case RUDP_ST_ESTABLISHED: + case RUDP_ST_CLOSED: + break; } } static void -rudp_send_ack(struct rudp_con *con, guint16 seq_no) -{ - gnutella_header_t *gnet; - struct rudp_ack *ack; - char packetMAX(sizeof *ack, sizeof *gnet); +rudp_send_ack(struct rudp_con *con, uint16 seq_no) +{ + gnutella_header_t *gnet; + struct rudp_ack *ack; + char packetMAX(sizeof *ack, sizeof *gnet); - STATIC_ASSERT(sizeof packet == 23); + STATIC_ASSERT(sizeof packet == 23); - g_return_if_fail(con); + g_return_if_fail(con); - if (seq_no >= con->in.start) { - con->in.start = seq_no + 1; - } + if (seq_no >= con->in.start) { + con->in.start = seq_no + 1; + } + + gnet = cast_to_pointer(&packet); + ack = cast_to_pointer(&packet); - gnet = cast_to_gpointer(&packet); - ack = cast_to_gpointer(&packet); - - rudp_set_gnet_header(gnet, 0); - rudp_set_header(&ack->common, RUDP_OP_ACK, con->conn_id, 0, seq_no); + rudp_set_gnet_header(gnet, 0); + rudp_set_header(&ack->common, RUDP_OP_ACK, con->conn_id, 0, seq_no); - poke_be16(ack->window_start, con->in.start); - poke_be16(ack->window_space, con->in.space); + poke_be16(ack->window_start, con->in.start); + poke_be16(ack->window_space, con->in.space); - RUDP_DEBUG(("RUDP: Sending ACK to %s (seq_no=%u, start=%s, space=%u)", + RUDP_DEBUG(("RUDP: Sending ACK to %s (seq_no=%u, start=%s, space=%u)", host_addr_port_to_string(con->addr, con->port), seq_no, uint64_to_string(con->in.start), con->in.space)); - rudp_send_packet(con, &packet, sizeof packet); + rudp_send_packet(con, &packet, sizeof packet); } static void -rudp_send_fin(struct rudp_con *con, guint16 seq_no, enum rudp_fin_reason reason) -{ - gnutella_header_t *gnet; - struct rudp_fin *fin; - char packetMAX(sizeof *fin, sizeof *gnet); - - STATIC_ASSERT(sizeof packet == 23); - - g_return_if_fail(con); - - gnet = cast_to_gpointer(&packet); - fin = cast_to_gpointer(&packet); - - rudp_set_gnet_header(gnet, 0); - rudp_set_header(&fin->common, RUDP_OP_FIN, con->conn_id, 0, seq_no); - fin->reason = reason; - - con->status = RUDP_ST_CLOSED; - con->in.space = 1; - - rudp_set_writable(con, FALSE); - rudp_set_closed(con); - - RUDP_DEBUG(("RUDP: Sending FIN to %s (seq_no=%u, reason=%s)", - host_addr_port_to_string(con->addr, con->port), - seq_no, rudp_fin_reason_to_string(fin->reason))); - - rudp_send_packet(con, &packet, sizeof packet); +rudp_send_fin(struct rudp_con *con, uint16 seq_no, enum rudp_fin_reason reason) +{ + gnutella_header_t *gnet; + struct rudp_fin *fin; + char packetMAX(sizeof *fin, sizeof *gnet); + + STATIC_ASSERT(sizeof packet == 23); + + g_return_if_fail(con); + + gnet = cast_to_pointer(&packet); + fin = cast_to_pointer(&packet); + + rudp_set_gnet_header(gnet, 0); + rudp_set_header(&fin->common, RUDP_OP_FIN, con->conn_id, 0, seq_no); + fin->reason = reason; + + con->status = RUDP_ST_CLOSED; + con->in.space = 1; + + rudp_set_writable(con, FALSE); + rudp_set_closed(con); + + RUDP_DEBUG(("RUDP: Sending FIN to %s (seq_no=%u, reason=%s)", + host_addr_port_to_string(con->addr, con->port), + seq_no, rudp_fin_reason_to_string(fin->reason))); + + rudp_send_packet(con, &packet, sizeof packet); } /** @@ -527,10 +533,10 @@ * is returned. */ int -rudp_connect(const host_addr_t addr, guint16 port) +rudp_connect(const host_addr_t addr, uint16 port) { struct rudp_con *con; - guint i; + uint i; g_return_val_if_fail(is_host_addr(addr), -1); g_return_val_if_fail(0 != port, -1); @@ -538,7 +544,7 @@ /* * The connection ID is an 8-bit field. Thus there can be at most * 256 connections between (a.address, a.port) and (b.address, b.port). - */ + */ for (i = 0; i < 256; i++) { /* TODO: The connection ID should be randomized. Also consider * to not recycle IDs to frequently because we might receive @@ -566,12 +572,12 @@ * @param data A pointer to the first byte of the received packet. */ static void -rudp_handle_syn(struct rudp_con *con, const host_addr_t addr, guint16 port, - gconstpointer data) +rudp_handle_syn(struct rudp_con *con, const host_addr_t addr, uint16 port, + const void *data) { const struct rudp_syn *syn = data; - guint16 proto_ver; - guint16 seq_no; + uint16 proto_ver; + uint16 seq_no; g_return_if_fail(syn); @@ -579,8 +585,8 @@ proto_ver = peek_be16(syn->proto_ver); RUDP_DEBUG(("RUDP SYN: conn_id=%u proto_ver=%u", - (guint) syn->conn_id, (guint) proto_ver)); - + (uint) syn->conn_id, (uint) proto_ver)); + if (RUDP_PROTO_VERSION != proto_ver) { RUDP_DEBUG(("RUDP SYN: Unsupported protocol version")); return; @@ -623,22 +629,22 @@ * @param data A pointer to the first byte of the received packet. */ static void -rudp_handle_ack(struct rudp_con *con, gconstpointer data) +rudp_handle_ack(struct rudp_con *con, const void *data) { const struct rudp_ack *ack = data; - guint16 space, start, seq_no; + uint16 space, start, seq_no; g_return_if_fail(con); g_return_if_fail(data); seq_no = peek_be16(ack->common.seq_no); start = peek_be16(ack->window_start); - space = peek_be16(ack->window_space); + space = peek_be16(ack->window_space); RUDP_DEBUG(("RUDP ACK: seq_no=%u, window_start=%u, window_space=%u", seq_no, start, space)); -#if 0 +#if 0 if (!rudp_seq_number_in_send_window(con, seq_no)) { RUDP_DEBUG(("RUDP: Out of window (%u..%u)", con->out.start, @@ -661,34 +667,34 @@ rudp_set_writable(con, TRUE); break; } - + { - gboolean pending; - guint i; + bool pending; + uint i; /* - * Remove all ACKed messages from the outbuf buffers. The + * Remove all ACKed messages from the outbuf buffers. The * ACK qualifies for `seq_no' and all up to `start - 1'. */ - for (i = 0; i < G_N_ELEMENTS(con->out.buffers); i++) { + for (i = 0; i < N_ITEMS(con->out.buffers); i++) { pmsg_t *mb; mb = con->out.buffersi; if (mb) { const struct rudp_header *header; - guint16 s; + uint16 s; - header = cast_to_gconstpointer(pmsg_read_base(mb)); + header = cast_to_constpointer(pmsg_read_base(mb)); s = peek_be16(header->seq_no); if (s == seq_no || s < start) { pmsg_free(mb); con->out.buffersi = NULL; } - } + } } pending = FALSE; - for (i = 0; i < G_N_ELEMENTS(con->out.buffers); i++) { + for (i = 0; i < N_ITEMS(con->out.buffers); i++) { if (con->out.bufferscon->out.rd) { pending = TRUE; break; @@ -697,7 +703,7 @@ break; } con->out.rd++; - con->out.rd %= G_N_ELEMENTS(con->out.buffers); + con->out.rd %= N_ITEMS(con->out.buffers); } rudp_set_pending(con, pending); } @@ -708,14 +714,14 @@ } else { con->out.start = MAX(start, con->out.start); } - con->out.space = MIN(space, G_N_ELEMENTS(con->out.buffers)); + con->out.space = MIN(space, N_ITEMS(con->out.buffers)); } static void -rudp_handle_keep_alive(struct rudp_con *con, gconstpointer data) +rudp_handle_keep_alive(struct rudp_con *con, const void *data) { const struct rudp_ack *keep_alive = data; - guint16 seq_no; + uint16 seq_no; g_return_if_fail(con); g_return_if_fail(data); @@ -725,10 +731,10 @@ } static void -rudp_handle_fin(struct rudp_con *con, gconstpointer data) +rudp_handle_fin(struct rudp_con *con, const void *data) { const struct rudp_fin *fin = data; - guint16 seq_no; + uint16 seq_no; g_return_if_fail(con); g_return_if_fail(data); @@ -749,11 +755,11 @@ } static void -rudp_handle_data(struct rudp_con *con, gconstpointer data) +rudp_handle_data(struct rudp_con *con, const void *data) { const struct rudp_data *dat = data; - guint16 seq_no, i; - + uint16 seq_no, i; + g_return_if_fail(con); g_return_if_fail(data); @@ -762,16 +768,16 @@ RUDP_DEBUG(("RUDP DATA: seq_no=%u", seq_no)); i = seq_no - con->in.seq_no; - g_return_if_fail(i < G_N_ELEMENTS(con->in.buffers)); + g_return_if_fail(i < N_ITEMS(con->in.buffers)); + + i = ((uint32) i + con->in.rd) % N_ITEMS(con->in.buffers); - i = ((guint32) i + con->in.rd) % G_N_ELEMENTS(con->in.buffers); - if (con->in.buffersi) { RUDP_DEBUG(("RUDP DATA: Received duplicate")); } else { gnutella_header_t *gnet_header = data; size_t data1_len, data_len, size; - + data1_len = dat->common.op_and_len & 0x0f; data_len = peek_le32(gnet_header->size) & 0xffff; size = data1_len + data_len; @@ -787,21 +793,21 @@ rudp_set_readable(con, TRUE); } } - + rudp_send_ack(con, seq_no); } -static gboolean -rudp_send_data(struct rudp_con *con, gconstpointer data, size_t size) +static bool +rudp_send_data(struct rudp_con *con, const void *data, size_t size) { const char *p = data; - guint data_len; + uint data_len; pmsg_t *mb; if (con->out.bufferscon->out.wr) { return FALSE; } - + data_len = size < 12 ? 0 : (size - 12); mb = pmsg_new(PMSG_P_DATA, NULL, 23 + data_len); { @@ -809,7 +815,7 @@ gnutella_header_t gnet; struct rudp_data data; } header; - guint data1_len, j; + uint data1_len, j; data1_len = size < 12 ? size : 12; rudp_set_gnet_header(&header.gnet, data_len); @@ -825,22 +831,22 @@ con->out.bufferscon->out.wr = mb; con->out.wr++; - con->out.wr %= G_N_ELEMENTS(con->out.buffers); + con->out.wr %= N_ITEMS(con->out.buffers); return TRUE; } void -rudp_handle_packet(const host_addr_t addr, guint16 port, - gconstpointer data, size_t size) +rudp_handle_packet(const host_addr_t addr, uint16 port, + const void *data, size_t size) { const struct rudp_header *rudp_header; gnutella_header_t *gnet_header; const char *op_str; - guint16 seq_no; - guint8 data1_len; - guint8 op; - guint8 conn_id; + uint16 seq_no; + uint8 data1_len; + uint8 op; + uint8 conn_id; struct rudp_con *con; g_return_if_fail(is_host_addr(addr)); @@ -862,7 +868,7 @@ RUDP_DEBUG(("RUDP: sender=%s op=%s peer_conn_id=%u data_len=%u seq_no=%u", host_addr_port_to_string(addr, port), op_str ? op_str : "", - (guint) conn_id, (guint) data1_len, (guint) seq_no)); + (uint) conn_id, (uint) data1_len, (uint) seq_no)); if (!op_str) { RUDP_DEBUG(("RUDP: Unknown op (0x%02x)", op)); @@ -877,11 +883,11 @@ con = rudp_find(addr, port, rudp_header->peer_conn_id); if (con) { g_assert(port == con->port); - g_assert(host_addr_equal(addr, con->addr)); + g_assert(host_addr_equiv(addr, con->addr)); g_assert(rudp_header->peer_conn_id == con->conn_id); if (RUDP_OP_ACK != op) { - + if (!rudp_seq_number_in_recv_window(con, seq_no)) { char start_bufUINT64_DEC_BUFLEN; char space_bufUINT64_DEC_BUFLEN; @@ -922,10 +928,10 @@ } ssize_t -rudp_write(struct rudp_con *con, gconstpointer data, size_t size) +rudp_write(struct rudp_con *con, const void *data, size_t size) { const char *p; - + g_return_val_if_fail(con, -1); g_return_val_if_fail(data, -1); g_return_val_if_fail(size > 0, -1); @@ -952,8 +958,8 @@ p = data; while (size > 0) { - guint n; - + uint n; + n = MIN(512, size); if (!rudp_send_data(con, p, n)) { rudp_set_writable(con, FALSE); @@ -973,13 +979,13 @@ } ssize_t -rudp_read(struct rudp_con *con, gpointer data, size_t size) +rudp_read(struct rudp_con *con, void *data, size_t size) { ssize_t received; pmsg_t *mb; char *p; - guint i; - + uint i; + g_return_val_if_fail(con, -1); g_return_val_if_fail(data, -1); g_return_val_if_fail(size > 0, -1); @@ -990,7 +996,7 @@ i = con->in.rd; while (NULL != (mb = con->in.buffersi)) { size_t n; - + n = pmsg_read(mb, &preceived, size); size -= n; received += n; @@ -1000,7 +1006,7 @@ } pmsg_free(mb); con->in.buffersi = NULL; - i = (i + 1) % G_N_ELEMENTS(con->in.buffers); + i = (i + 1) % N_ITEMS(con->in.buffers); con->in.seq_no++; } con->in.rd = i; @@ -1050,7 +1056,7 @@ return con->addr; } -guint16 +uint16 rudp_get_port(struct rudp_con *con) { g_return_val_if_fail(con, 0); @@ -1059,7 +1065,7 @@ void rudp_set_event_handler(struct rudp_con *con, - inputevt_cond_t cond, inputevt_handler_t handler, gpointer data) + inputevt_cond_t cond, inputevt_handler_t handler, void *data) { g_return_if_fail(con); g_return_if_fail(handler); @@ -1082,10 +1088,10 @@ } static void -rudp_foreach_incoming(gpointer data, gpointer unused_udata) +rudp_foreach_incoming(void *data, void *unused_udata) { struct rudp_con *con = data; - + (void) unused_udata; rudp_set_incoming(con, FALSE); @@ -1093,10 +1099,10 @@ } static void -rudp_foreach_writable(gpointer data, gpointer unused_udata) +rudp_foreach_writable(void *data, void *unused_udata) { struct rudp_con *con = data; - + (void) unused_udata; if (con->event_handler && (con->event_cond & INPUT_EVENT_W)) { @@ -1105,29 +1111,29 @@ } static void -rudp_foreach_readable(gpointer data, gpointer unused_udata) +rudp_foreach_readable(void *data, void *unused_udata) { struct rudp_con *con = data; (void) unused_udata; - + if (con->event_handler && (con->event_cond & INPUT_EVENT_R)) { con->event_handler(con->event_data, (-1), INPUT_EVENT_R); } } static void -rudp_foreach_pending(gpointer data, gpointer unused_udata) +rudp_foreach_pending(void *data, void *unused_udata) { struct rudp_con *con = data; pmsg_t *mb; (void) unused_udata; - + mb = con->out.bufferscon->out.rd; if (mb) { tm_t now; - + tm_now(&now); if (tm_elapsed_ms(&now, &con->out.last_event) > 1000) { @@ -1137,7 +1143,7 @@ } static void -rudp_foreach_closed(gpointer data, gpointer unused_udata) +rudp_foreach_closed(void *data, void *unused_udata) { struct rudp_con *con = data; @@ -1158,7 +1164,7 @@ rudp_timer(time_t unused_now) { int i; - + (void) unused_now; for (i = 0; i < RUDP_NUM_LISTS; i++) { @@ -1179,10 +1185,10 @@ void rudp_init(void) { - guint i; + uint i; + + connections = hset_create_any(rudp_con_hash, NULL, rudp_con_eq); - connections = g_hash_table_new(rudp_con_hash, rudp_con_eq); - for (i = 0; i < RUDP_NUM_LISTS; i++) { rudp_listi = hash_list_new(NULL, NULL); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/rudp.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/rudp.h
Changed
@@ -37,18 +37,18 @@ struct rudp_con; -int rudp_connect(const host_addr_t addr, guint16 port); -void rudp_handle_packet(const host_addr_t addr, guint16 port, - gconstpointer data, size_t size); -ssize_t rudp_write(struct rudp_con *con, gconstpointer data, size_t size); -ssize_t rudp_read(struct rudp_con *con, gpointer data, size_t size); +int rudp_connect(const host_addr_t addr, uint16 port); +void rudp_handle_packet(const host_addr_t addr, uint16 port, + const void *data, size_t size); +ssize_t rudp_write(struct rudp_con *con, const void *data, size_t size); +ssize_t rudp_read(struct rudp_con *con, void *data, size_t size); int rudp_close(struct rudp_con *con); host_addr_t rudp_get_addr(const struct rudp_con *con); -guint16 rudp_get_port(const struct rudp_con *con); +uint16 rudp_get_port(const struct rudp_con *con); void rudp_set_event_handler(struct rudp_con *con, - inputevt_cond_t cond, inputevt_handler_t handler, gpointer data); + inputevt_cond_t cond, inputevt_handler_t handler, void *data); void rudp_clear_event_handler(struct rudp_con *con); void rudp_timer(time_t now);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/rx.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/rx.c
Changed
@@ -41,8 +41,10 @@ #include "rx.h" #include "nodes.h" -#include "lib/glib-missing.h" +#include "lib/ipset.h" +#include "lib/pslist.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ /* @@ -52,6 +54,7 @@ #define RX_INIT(o,a) ((o)->ops->init((o), (a))) #define RX_DESTROY(o) ((o)->ops->destroy((o))) #define RX_RECV(o,m) ((o)->ops->recv((o), (m))) +#define RX_RECVFROM(o,m,f) ((o)->ops->recvfrom((o), (m), (f))) #define RX_ENABLE(o) ((o)->ops->enable((o))) #define RX_DISABLE(o) ((o)->ops->disable((o))) #define RX_BIO_SOURCE(o) ((o)->ops->bio_source((o))) @@ -61,13 +64,13 @@ * with respect to the caller (i.e. it is not happening in the same * calling stack), freed stacks are remembered and periodically collected. */ -static GSList *rx_freed = NULL; +static pslist_t *rx_freed = NULL; /** * Tell upper layer that it got new data from us. * @return FALSE if there was on error or the receiver wants no more data. */ -static gboolean +static bool rx_data_ind(rxdrv_t *rx, pmsg_t *mb) { rx_check(rx); @@ -75,6 +78,8 @@ if (rx->upper == NULL) g_error("Forgot to call rx_set_data_ind() on the RX stack."); + g_assert(0 == (rx->flags & RX_F_FROM)); + return rx_recv(rx->upper, mb); } @@ -83,12 +88,49 @@ * so that further indication to the user-level code is blocked. * @return FALSE */ -static gboolean +static bool rx_data_ind_freed(rxdrv_t *rx, pmsg_t *mb) { rx_check(rx); g_assert(rx->upper == NULL); g_assert(rx->flags & RX_F_FREED); + g_assert(0 == (rx->flags & RX_F_FROM)); + + pmsg_free(mb); + return FALSE; /* Stop sending more data */ +} + +/** + * Tell upper layer that it got new data from us. + * @return FALSE if there was on error or the receiver wants no more data. + */ +static bool +rx_datafrom_ind(rxdrv_t *rx, pmsg_t *mb, const gnet_host_t *from) +{ + rx_check(rx); + + if (rx->upper == NULL) + g_error("Forgot to call rx_set_datafrom_ind() on the RX stack."); + + g_assert(0 != (rx->flags & RX_F_FROM)); + + return rx_recvfrom(rx->upper, mb, from); +} + +/** + * This data indication callback is installed when the RX stack is freed + * so that further indication to the user-level code is blocked. + * @return FALSE + */ +static bool +rx_datafrom_ind_freed(rxdrv_t *rx, pmsg_t *mb, const gnet_host_t *unused_from) +{ + rx_check(rx); + g_assert(rx->upper == NULL); + g_assert(rx->flags & RX_F_FREED); + g_assert(0 != (rx->flags & RX_F_FROM)); + + (void) unused_from; pmsg_free(mb); return FALSE; /* Stop sending more data */ @@ -104,15 +146,18 @@ * Once the stack if fully built, rx_set_data_ind() must be called on the * top driver to set the data indication callback. * + * When the ``host'' parameter is NULL, we're building an UDP RX stack and + * therefore rx_set_datafrom_ind() must be called instead. + * * It is expected that the stack will be dismantled when an error is reported. * * @return NULL if there is an initialization problem. */ rxdrv_t * rx_make( - gpointer owner, gnet_host_t *host, + void *owner, gnet_host_t *host, const struct rxdrv_ops *ops, - gpointer args) + void *args) { rxdrv_t *rx; @@ -123,17 +168,23 @@ rx->magic = RXDRV_MAGIC; rx->owner = owner; rx->ops = ops; - gnet_host_copy(&rx->host, host); rx->upper = NULL; rx->lower = NULL; /* * The internal data_ind callback is always set to call the upper layer. * If this driver ends-up being at the top of the RX stack, then the - * default will be superseded by the mandatory call to rx_set_data_ind(). + * default will be superseded by the mandatory call to rx_set_data_ind() + * or rx_set_datafrom_ind(). */ - rx->data_ind = rx_data_ind; + if (NULL == host) { + rx->flags |= RX_F_FROM; + rx->data.from_ind = rx_datafrom_ind; + } else { + gnet_host_copy(&rx->host, host); + rx->data.ind = rx_data_ind; + } if (NULL == RX_INIT(rx, args)) /* Let the heir class initialize */ return NULL; @@ -153,8 +204,9 @@ rx_check(rx); g_assert(rx->upper == NULL); /* Called on topmost driver */ g_assert(!(rx->flags & RX_F_FREED)); + g_assert(0 == (rx->flags & RX_F_FROM)); - rx->data_ind = data_ind; + rx->data.ind = data_ind; } /** @@ -165,8 +217,9 @@ { rx_check(rx); g_assert(rx->upper == NULL); /* Called on topmost driver */ + g_assert(0 == (rx->flags & RX_F_FROM)); - return rx->data_ind; + return rx->data.ind; } /** @@ -180,14 +233,64 @@ rx_check(rx); g_assert(rx->upper == NULL); /* Called on topmost driver */ g_assert(!(rx->flags & RX_F_FREED)); + g_assert(0 == (rx->flags & RX_F_FROM)); - old_data_ind = rx->data_ind; - rx->data_ind = data_ind; + old_data_ind = rx->data.ind; + rx->data.ind = data_ind; return old_data_ind; } /** + * Set the `datafrom_ind' callback, invoked when a new message has been fully + * received by the RX stack. The first argument of the routine is the layer + * from which data come, which will be the topmost driver when calling the + * external routine. + */ +void +rx_set_datafrom_ind(rxdrv_t *rx, rx_datafrom_t datafrom_ind) +{ + rx_check(rx); + g_assert(rx->upper == NULL); /* Called on topmost driver */ + g_assert(!(rx->flags & RX_F_FREED)); + g_assert(0 != (rx->flags & RX_F_FROM)); + + rx->data.from_ind = datafrom_ind; +} + +/** + * Fetch current `data_ind' callback. + */ +rx_datafrom_t +rx_get_datafrom_ind(rxdrv_t *rx) +{ + rx_check(rx); + g_assert(rx->upper == NULL); /* Called on topmost driver */ + g_assert(0 != (rx->flags & RX_F_FROM)); + + return rx->data.from_ind; +} + +/** + * Replace the `data_ind' callback, returning the old one. + */ +rx_datafrom_t +rx_replace_datafrom_ind(rxdrv_t *rx, rx_datafrom_t datafrom_ind) +{ + rx_datafrom_t old_datafrom_ind; + + rx_check(rx); + g_assert(rx->upper == NULL); /* Called on topmost driver */ + g_assert(!(rx->flags & RX_F_FREED)); + g_assert(0 != (rx->flags & RX_F_FROM)); + + old_datafrom_ind = rx->data.from_ind; + rx->data.from_ind = datafrom_ind; + + return old_datafrom_ind; +} + +/** * Called when an upper driver (urx) is attached on top of us. */ static void @@ -206,7 +309,7 @@ * @return NULL if there is an initialization problem. */ rxdrv_t * -rx_make_above(rxdrv_t *lrx, const struct rxdrv_ops *ops, gconstpointer args) +rx_make_above(rxdrv_t *lrx, const struct rxdrv_ops *ops, const void *args) { rxdrv_t *rx; @@ -228,7 +331,7 @@ * default will be superseded by the mandatory call to rx_set_data_ind(). */ - rx->data_ind = rx_data_ind; /* Will call rx_recv() on upper layer */ + rx->data.ind = rx_data_ind; /* Will call rx_recv() on upper layer */ if (NULL == RX_INIT(rx, args)) /* Let the heir class initialize */ return NULL; @@ -258,7 +361,7 @@ * Change RX stack owner. */ void -rx_change_owner(rxdrv_t *rx, gpointer owner) +rx_change_owner(rxdrv_t *rx, void *owner) { rx_check(rx); @@ -278,10 +381,13 @@ g_assert(rx->upper == NULL); g_assert(!(rx->flags & RX_F_FREED)); - rx_set_data_ind(rx, rx_data_ind_freed); + if (0 == (rx->flags & RX_F_FROM)) + rx_set_data_ind(rx, rx_data_ind_freed); + else + rx_set_datafrom_ind(rx, rx_datafrom_ind_freed); rx_disable(rx); rx->flags |= RX_F_FREED; - rx_freed = g_slist_prepend(rx_freed, rx); + rx_freed = pslist_prepend(rx_freed, rx); } /** @@ -290,21 +396,21 @@ void rx_collect(void) { - GSList *sl; + pslist_t *sl; - for (sl = rx_freed; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(rx_freed, sl) { rxdrv_t *rx = sl->data; g_assert(rx->flags & RX_F_FREED); rx_deep_free(rx); } - gm_slist_free_null(&rx_freed); + pslist_free_null(&rx_freed); } /** * Inject data into driver, from lower layer. */ -gboolean +bool rx_recv(rxdrv_t *rx, pmsg_t *mb) { rx_check(rx); @@ -314,6 +420,18 @@ } /** + * Inject data into driver, from lower layer. + */ +bool +rx_recvfrom(rxdrv_t *rx, pmsg_t *mb, const gnet_host_t *from) +{ + rx_check(rx); + g_assert(mb); + + return RX_RECVFROM(rx, mb, from); +} + +/** * Enable reception, recursively. */ static void @@ -415,4 +533,28 @@ return NULL; } +/*** + *** Selective debugging RX support, to limit tracing to specific addresses. + ***/ + +static ipset_t rx_addrs = IPSET_INIT; + +/** + * Record IP addresses in the set of "debuggable" destinations. + */ +void +rx_debug_set_addrs(const char *s) +{ + ipset_set_addrs(&rx_addrs, s); +} + +/** + * Are we debugging traffic sent from the IP of the host? + */ +bool +rx_debug_host(const gnet_host_t *h) +{ + return ipset_contains_host(&rx_addrs, h, TRUE); +} + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/rx.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/rx.h
Changed
@@ -34,15 +34,18 @@ #ifndef _core_rx_h_ #define _core_rx_h_ -#include "common.h" +#include "common.h" #include "lib/gnet_host.h" #include "lib/pmsg.h" struct rxdriver; struct gnutella_node; +struct gnutella_host; -typedef gboolean (*rx_data_t)(struct rxdriver *, pmsg_t *mb); +typedef bool (*rx_data_t)(struct rxdriver *, pmsg_t *mb); +typedef bool (*rx_datafrom_t)(struct rxdriver *, pmsg_t *mb, + const struct gnutella_host *from); enum rxdrv_magic { RXDRV_MAGIC = 0x4a9c3049U }; @@ -52,14 +55,17 @@ typedef struct rxdriver { enum rxdrv_magic magic; /**< Magic number */ - gpointer owner; /**< Owner of the RX stack */ + void *owner; /**< Owner of the RX stack */ gnet_host_t host; /**< Host information (ip, port) */ const struct rxdrv_ops *ops; /**< Dynamically dispatched operations */ struct rxdriver *upper; /**< Layer above, NULL if none */ struct rxdriver *lower; /**< Layer underneath, NULL if none */ - rx_data_t data_ind; /**< Data indication routine */ - gpointer opaque; /**< Used by heirs to store specific info */ - guint32 flags; /**< Current layer flags */ + union { + rx_data_t ind; /**< Data indication routine */ + rx_datafrom_t from_ind; /**< Data indication routine with origin */ + } data; + void *opaque; /**< Used by heirs to store specific info */ + uint32 flags; /**< Current layer flags */ } rxdrv_t; #define rx_owner(r) ((r)->owner) @@ -76,7 +82,8 @@ */ enum { - RX_F_FREED = 1 << 0 /**< Will be freed asynchronously */ + RX_F_FREED = 1 << 0, /**< Will be freed asynchronously */ + RX_F_FROM = 1 << 1 /**< Uses rx_datafrom_t data ind */ }; @@ -85,9 +92,10 @@ */ struct rxdrv_ops { - gpointer (*init)(rxdrv_t *tx, gconstpointer args); + void *(*init)(rxdrv_t *tx, const void *args); void (*destroy)(rxdrv_t *tx); - gboolean (*recv)(rxdrv_t *tx, pmsg_t *mb); + bool (*recv)(rxdrv_t *tx, pmsg_t *mb); + bool (*recvfrom)(rxdrv_t *tx, pmsg_t *mb, const struct gnutella_host *from); void (*enable)(rxdrv_t *tx); void (*disable)(rxdrv_t *tx); struct bio_source *(*bio_source)(rxdrv_t *tx); @@ -97,25 +105,34 @@ * Public interface */ -rxdrv_t *rx_make(gpointer owner, gnet_host_t *host, - const struct rxdrv_ops *ops, gpointer args); +rxdrv_t *rx_make(void *owner, gnet_host_t *host, + const struct rxdrv_ops *ops, void *args); rxdrv_t *rx_make_above(rxdrv_t *lrx, const struct rxdrv_ops *ops, - gconstpointer args); + const void *args); rx_data_t rx_get_data_ind(rxdrv_t *rx); void rx_set_data_ind(rxdrv_t *rx, rx_data_t data_ind); rx_data_t rx_replace_data_ind(rxdrv_t *rx, rx_data_t data_ind); + +rx_datafrom_t rx_get_datafrom_ind(rxdrv_t *rx); +void rx_set_datafrom_ind(rxdrv_t *rx, rx_datafrom_t datafrom_ind); +rx_datafrom_t rx_replace_datafrom_ind(rxdrv_t *rx, rx_datafrom_t datafrom_ind); + void rx_free(rxdrv_t *d); void rx_collect(void); -gboolean rx_recv(rxdrv_t *rx, pmsg_t *mb); +bool rx_recv(rxdrv_t *rx, pmsg_t *mb); +bool rx_recvfrom(rxdrv_t *rx, pmsg_t *mb, const struct gnutella_host *from); void rx_enable(rxdrv_t *rx); void rx_disable(rxdrv_t *rx); -void rx_change_owner(rxdrv_t *rx, gpointer owner); +void rx_change_owner(rxdrv_t *rx, void *owner); rxdrv_t *rx_bottom(rxdrv_t *rx); struct bio_source *rx_bio_source(rxdrv_t *rx); struct bio_source *rx_no_source(rxdrv_t *rx); +void rx_debug_set_addrs(const char *s); +bool rx_debug_host(const gnet_host_t *h); + #endif /* _core_rx_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/rx_chunk.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/rx_chunk.c
Changed
@@ -64,7 +64,7 @@ */ struct attr { const struct rx_chunk_cb *cb; /**< Layer-specific callbacks */ - guint64 data_remain; /**< Amount of remaining chunk payload data */ + uint64 data_remain; /**< Amount of remaining chunk payload data */ char hex_buf16; /**< Holds the hex digits of chunk-size */ size_t hex_pos; /**< Current position in hex_buf */ enum chunk_state state; /**< Current decoding state */ @@ -112,7 +112,7 @@ case CHUNK_STATE_DATA_CRLF: /* The chunk-data must be followed by a CRLF */ while (len > 0) { - guchar c; + uchar c; len--; c = *src++; @@ -138,7 +138,7 @@ if (!(attr->flags & IF_NO_CRLF)) { attr->flags |= IF_NO_CRLF; - g_warning("Host %s forgot CRLF after data", + g_warning("host %s forgot CRLF after data", gnet_host_to_string(&rx->host)); } @@ -153,7 +153,7 @@ case CHUNK_STATE_SIZE: g_assert(attr->hex_pos < sizeof attr->hex_buf); while (len > 0) { - guchar c; + uchar c; len--; c = *src++; @@ -199,8 +199,8 @@ g_assert(attr->hex_pos <= sizeof attr->hex_buf); { - guint64 v = 0; - guint i; + uint64 v = 0; + uint i; for (i = 0; i < attr->hex_pos; i++) v = (v << 4) | hex2int_inline(attr->hex_bufi); @@ -343,7 +343,7 @@ /* Only the first ``data_remain'' bytes are forwarded */ mb->m_rptr += attr->data_remain; nmb->m_wptr = - deconstify_gpointer(&nmb->m_rptrattr->data_remain); + deconstify_pointer(&nmb->m_rptrattr->data_remain); attr->data_remain = 0; attr->state = CHUNK_STATE_DATA_CRLF; } @@ -388,8 +388,8 @@ /** * Initialize the driver. */ -static gpointer -rx_chunk_init(rxdrv_t *rx, gconstpointer args) +static void * +rx_chunk_init(rxdrv_t *rx, const void *args) { const struct rx_chunk_args *rargs = args; struct attr *attr; @@ -418,16 +418,17 @@ struct attr *attr = rx->opaque; WFREE(attr); + rx->opaque = NULL; } /** * Got data from lower layer. */ -static gboolean +static bool rx_chunk_recv(rxdrv_t *rx, pmsg_t *mb) { struct attr *attr = rx->opaque; - gboolean error = FALSE; + bool error = FALSE; pmsg_t *imb; /* Dechunked message */ rx_check(rx); @@ -440,7 +441,7 @@ */ while ((attr->flags & IF_ENABLED) && (imb = dechunk_data(rx, mb))) { - error = !(*rx->data_ind)(rx, imb); + error = !(*rx->data.ind)(rx, imb); if (error) break; } @@ -483,6 +484,7 @@ rx_chunk_init, /**< init */ rx_chunk_destroy, /**< destroy */ rx_chunk_recv, /**< recv */ + NULL, /**< recvfrom */ rx_chunk_enable, /**< enable */ rx_chunk_disable, /**< disable */ rx_no_source, /**< bio_source */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/rx_chunk.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/rx_chunk.h
Changed
@@ -44,13 +44,13 @@ * Callbacks used by the inflating layer. */ struct rx_chunk_cb { - void (*chunk_error)(gpointer owner, - const char *reason, ...) PRINTF_FUNC_PTR(2, 3); - void (*chunk_end)(gpointer owner); + void (*chunk_error)(void *owner, + const char *reason, ...) G_PRINTF_PTR(2, 3); + void (*chunk_end)(void *owner); }; /** - * Arguments to be passed when the layer is intantiated. + * Arguments to be passed when the layer is instantiated. */ struct rx_chunk_args { const struct rx_chunk_cb *cb; /**< Callbacks */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/rx_inflate.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/rx_inflate.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2014 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,7 +28,7 @@ * Network RX -- decompressing stage. * * @author Raphael Manfredi - * @date 2002-2003 + * @date 2002-2003, 2014 */ #include "common.h" @@ -40,9 +40,13 @@ #include "rx_inflate.h" #include "rxbuf.h" -#include "lib/walloc.h" +#include "lib/base16.h" /* For error messages */ #include "lib/pmsg.h" +#include "lib/str.h" /* For error messages */ +#include "lib/stringify.h" /* For plural() */ +#include "lib/walloc.h" #include "lib/zlib_util.h" + #include "lib/override.h" /* Must be the last header included */ /** @@ -51,6 +55,7 @@ struct attr { const struct rx_inflate_cb *cb; /**< Layer-specific callbacks */ z_streamp inz; /**< Decompressing stream */ + size_t processed; /**< Input bytes decompressed so far */ int flags; }; @@ -64,18 +69,15 @@ inflate_data(rxdrv_t *rx, pmsg_t *mb) { struct attr *attr = rx->opaque; - int ret; pdata_t *db; /* Inflated buffer */ z_streamp inz = attr->inz; - int old_size; - int old_avail; - int inflated; + int ret, old_size, old_avail, inflated, consumed; /* * Prepare call to inflate(). */ - inz->next_in = (gpointer) pmsg_read_base(mb); + inz->next_in = deconstify_pointer(pmsg_read_base(mb)); inz->avail_in = old_size = pmsg_size(mb); if (old_size == 0) @@ -83,7 +85,7 @@ db = rxbuf_new(); - inz->next_out = (gpointer) pdata_start(db); + inz->next_out = cast_to_pointer(pdata_start(db)); inz->avail_out = old_avail = pdata_len(db); g_assert(inz->avail_out > 0); @@ -96,19 +98,54 @@ ret = inflate(inz, Z_SYNC_FLUSH); if (ret != Z_OK && ret != Z_STREAM_END) { + str_t *s; + + s = str_new(128); + str_printf(s, "decompression failed between offsets %zu and %zu: %s", + attr->processed, attr->processed + old_size, zlib_strerror(ret)); + + /* + * If error happens at the beginning of the stream, include the + * first few bytes in hexadecimal so that we can detect whether + * we missed a gzip encapsulation, or to make sure data are really + * deflated, not plain. + * --RAM, 2014-01-06 + */ + + if (0 == attr->processed) { + char data33; + size_t n = MIN(UNSIGNED(old_size), (sizeof data - 1) / 2); + size_t m; + + m = base16_encode(data, sizeof data - 1, pmsg_read_base(mb), n); + g_assert(m < sizeof data); + datam = '\0'; + + str_catf(s, " first %zu hex byte%s: %s", m/2, plural(m/2), data); + } + errno = EIO; - attr->cb->inflate_error(rx->owner, "Decompression failed: %s", - zlib_strerror(ret)); + attr->cb->inflate_error(rx->owner, "%s", str_2c(s)); + str_destroy_null(&s); goto cleanup; } - mb->m_rptr += old_size - inz->avail_in; /* Read that far */ + /* + * Keep track of amount of data processed in case we get a + * decompression failure: we'll thus be able to report at + * which position it occurred in the input stream. + * --RAM, 2014-01-06 + */ + + consumed = old_size - inz->avail_in; + mb->m_rptr += consumed; /* Read that far */ + attr->processed += consumed; /* * Check whether some data was produced. */ - if (inz->avail_out == (guint) old_avail) + if (inz->avail_out == (uint) old_avail) goto cleanup; /* @@ -134,8 +171,8 @@ /** * Initialize the driver. */ -static gpointer -rx_inflate_init(rxdrv_t *rx, gconstpointer args) +static void * +rx_inflate_init(rxdrv_t *rx, const void *args) { const struct rx_inflate_args *rargs = args; struct attr *attr; @@ -159,10 +196,9 @@ return NULL; } - WALLOC(attr); + WALLOC0(attr); attr->cb = rargs->cb; attr->inz = inz; - attr->flags = 0; rx->opaque = attr; @@ -185,18 +221,19 @@ g_warning("while freeing decompressor for peer %s: %s", gnet_host_to_string(&rx->host), zlib_strerror(ret)); - WFREE(attr->inz); + WFREE_TYPE_NULL(attr->inz); WFREE(attr); + rx->opaque = NULL; } /** * Got data from lower layer. */ -static gboolean +static bool rx_inflate_recv(rxdrv_t *rx, pmsg_t *mb) { struct attr *attr = rx->opaque; - gboolean error = FALSE; + bool error = FALSE; pmsg_t *imb; /**< Inflated message */ rx_check(rx); @@ -209,7 +246,7 @@ */ while ((attr->flags & IF_ENABLED) && (imb = inflate_data(rx, mb))) { - error = !(*rx->data_ind)(rx, imb); + error = !(*rx->data.ind)(rx, imb); if (error) break; } @@ -244,6 +281,7 @@ rx_inflate_init, /**< init */ rx_inflate_destroy, /**< destroy */ rx_inflate_recv, /**< recv */ + NULL, /**< recvfrom */ rx_inflate_enable, /**< enable */ rx_inflate_disable, /**< disable */ rx_no_source, /**< bio_source */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/rx_inflate.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/rx_inflate.h
Changed
@@ -44,13 +44,13 @@ * Callbacks used by the inflating layer. */ struct rx_inflate_cb { - void (*add_rx_inflated)(gpointer owner, int amount); - void (*inflate_error)(gpointer owner, - const char *reason, ...) PRINTF_FUNC_PTR(2, 3); + void (*add_rx_inflated)(void *owner, int amount); + void (*inflate_error)(void *owner, + const char *reason, ...) G_PRINTF_PTR(2, 3); }; /** - * Arguments to be passed when the layer is intantiated. + * Arguments to be passed when the layer is instantiated. */ struct rx_inflate_args { const struct rx_inflate_cb *cb; /**< Callbacks */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/rx_link.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/rx_link.c
Changed
@@ -61,15 +61,15 @@ * Invoked when the input file descriptor has more data available. */ static void -is_readable(gpointer data, int unused_source, inputevt_cond_t cond) +is_readable(void *data, int unused_source, inputevt_cond_t cond) { rxdrv_t *rx = data; struct attr *attr = rx->opaque; pdata_t *db32; - iovec_t iovG_N_ELEMENTS(db); + iovec_t iovN_ITEMS(db); pmsg_t *mb; ssize_t r; - guint i, iov_cnt; + uint i, iov_cnt; size_t avail; (void) unused_source; @@ -102,13 +102,12 @@ */ i = 0; - for (i = 0; i < G_N_ELEMENTS(db); /* NOTHING */) { + for (i = 0; i < N_ITEMS(db); /* NOTHING */) { size_t len; - + dbi = rxbuf_new(); len = pdata_len(dbi); - iovec_set_base(&iovi, pdata_start(dbi)); - iovec_set_len(&iovi, len); + iovec_set(&iovi, pdata_start(dbi), len); i++; if (len >= avail) @@ -149,7 +148,7 @@ } mb = pmsg_alloc(PMSG_P_DATA, dbi, 0, n); i++; - if (!(*rx->data_ind)(rx, mb)) + if (!(*rx->data.ind)(rx, mb)) break; } @@ -174,8 +173,8 @@ * * Always succeeds, so never returns NULL. */ -static gpointer -rx_link_init(rxdrv_t *rx, gconstpointer args) +static void * +rx_link_init(rxdrv_t *rx, const void *args) { const struct rx_link_args *rargs = args; struct attr *attr; @@ -209,6 +208,7 @@ } WFREE(attr); + rx->opaque = NULL; } /** @@ -219,7 +219,7 @@ * * @return FALSE if there was an error or the receiver wants no more data. */ -static gboolean +static bool rx_link_recv(rxdrv_t *rx, pmsg_t *mb) { struct attr *attr = rx->opaque; @@ -235,7 +235,7 @@ * NB: `mb' is expected to be freed by the last layer using it. */ - return (*rx->data_ind)(rx, mb); + return (*rx->data.ind)(rx, mb); } /** @@ -298,6 +298,7 @@ rx_link_init, /**< init */ rx_link_destroy, /**< destroy */ rx_link_recv, /**< recv */ + NULL, /**< recvfrom */ rx_link_enable, /**< enable */ rx_link_disable, /**< disable */ rx_link_bio_source, /**< bio_source */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/rx_link.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/rx_link.h
Changed
@@ -45,14 +45,14 @@ * Callbacks used by the link layer. */ struct rx_link_cb { - void (*add_rx_given)(gpointer owner, ssize_t amount); - void (*read_error)(gpointer owner, - const char *reason, ...) PRINTF_FUNC_PTR(2, 3); - void (*got_eof)(gpointer owner); + void (*add_rx_given)(void *owner, ssize_t amount); + void (*read_error)(void *owner, + const char *reason, ...) G_PRINTF_PTR(2, 3); + void (*got_eof)(void *owner); }; /** - * Arguments to be passed when the layer is intantiated. + * Arguments to be passed when the layer is instantiated. */ struct rx_link_args { const struct rx_link_cb *cb; /**< Callbacks */
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/rx_ut.c
Added
@@ -0,0 +1,1483 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * Network RX -- UDP transceiver layer (semi-reliable UDP) + * + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#include <zlib.h> + +#include "rx_ut.h" +#include "gnet_stats.h" +#include "rx.h" +#include "rxbuf.h" +#include "settings.h" /* For settings_max_msg_size() */ +#include "tx.h" +#include "tx_ut.h" +#include "udp_reliable.h" + +#include "if/gnet_property_priv.h" + +#include "lib/atoms.h" +#include "lib/bit_array.h" +#include "lib/cq.h" +#include "lib/gnet_host.h" +#include "lib/hashing.h" +#include "lib/hevset.h" +#include "lib/iovec.h" +#include "lib/pmsg.h" +#include "lib/stringify.h" +#include "lib/unsigned.h" +#include "lib/walloc.h" +#include "lib/zlib_util.h" + +#include "lib/override.h" /* Must be the last header included */ + +/* + * It is important to have the RX expiration time be a little bit larger than + * the TX expiration time to account for transmission delays. + * + * The ACK delay time must be significantly smaller than the retransmission + * timeout, to avoid undue TX activity because we're holding the ACK, yet it + * must be large enough to make waiting worth it, i.e. get enough fragments + * during the holding period. + */ + +#define RX_UT_EXPIRE_MS (70*1000) /* Expiration time for RX messages, in ms */ +#define RX_UT_ALMOST_MS (40*1000) /* Early expiration for RX messages (ms) */ +#define RX_UT_DELAY_MS 500 /* ACK delay: 500 ms -- must be << 5 s */ + +#define RX_UT_DBG_MSG (1U << 0) /* Messages */ +#define RX_UT_DBG_FRAG (1U << 1) /* Fragments */ +#define RX_UT_DBG_ACK (1U << 2) /* Acknowledgments */ +#define RX_UT_DBG_RECV (1U << 3) /* Reception to upper layer */ +#define RX_UT_DBG_TIMEOUT (1U << 4) /* Timeouts */ + +#define rx_ut_debugging(mask, from) \ + G_UNLIKELY((GNET_PROPERTY(rx_ut_debug_flags) & (mask)) && \ + (NULL == (from) || rx_debug_host(from))) + +enum rx_ut_attr_magic { RX_UT_ATTR_MAGIC = 0x118e9a01 }; + +/** + * Private attributes for the decompressing layer. + */ +struct attr { + enum rx_ut_attr_magic magic; + txdrv_t *tx; /* Sibling TX layer */ + rxdrv_t *rx; /* Back pointer to this RX layer */ + const struct rx_ut_cb *cb; /* Layer-specific callbacks */ + zlib_inflater_t *zi; /* Inflating object */ + void *buffer; /* Inflating buffer (fix-sized) */ + hevset_t *mseq; /* Host + sequence ID -> received messsage */ + udp_tag_t tag; /* Protocol tag (e.g. "GTA" or "GND") */ + unsigned if_enabled:1; /* Reception enabled */ + unsigned improved_acks:1; /* Whether we can blindly send improved ACKs */ +}; + +static inline void +ut_attr_check(const struct attr * const attr) +{ + g_assert(attr != NULL); + g_assert(RX_UT_ATTR_MAGIC == attr->magic); +} + +/** + * The ID of messages being received is composed of the origin of the message + * plus the unique sequence ID allocated by the sender. + */ +struct ut_mid { + const gnet_host_t *from; /* Sending host (atom) */ + uint16 seqno; /* Sequence number */ +}; + +enum ut_rmsg_msgic { UT_RMSG_MAGIC = 0x75e48c06 }; + +/** + * A message being received. + */ +struct ut_rmsg { + enum ut_rmsg_msgic magic; + struct ut_mid id; /* Message ID (embedded key) */ + iovec_t *fragments; /* Array of received fragments */ + bit_array_t *fbits; /* Bitmap of received fragments */ + bit_array_t *facks; /* Bitmap of fragments pending ACK */ + cevent_t *expire_ev; /* Expire timer for the whole message */ + cevent_t *acks_ev; /* Expire timer for delayed ACKs */ + struct attr *attr; /* Layer attributes */ + uint8 fragcnt; /* Amount of fragments in message */ + uint8 fragrecv; /* Amount of fragments received */ + uint8 acks_pending; /* Amount of delayed ACKs */ + unsigned reliable:1; /* Whether fragments need ACKs */ + unsigned deflated:1; /* Whether PDU is deflated */ + unsigned improved_acks:1; /* Whether we can send improved ACKs */ + unsigned lingering:1; /* Set when lingering after reception */ +}; + +static inline void +ut_rmsg_check(const struct ut_rmsg * const um) +{ + g_assert(um != NULL); + g_assert(UT_RMSG_MAGIC == um->magic); +} + +static void ut_rmsg_reack(struct ut_rmsg *um); + +/** + * Primary hashing routine for ut_mid structs. + */ +static uint +ut_mid_hash(const void *key) +{ + const struct ut_mid *m = key; + + return gnet_host_hash(m->from) ^ u16_hash(m->seqno); +} + +/** + * Secondary hashing routine for ut_mid structs. + */ +static uint +ut_mid_hash2(const void *key) +{ + const struct ut_mid *m = key; + + return gnet_host_hash2(m->from) ^ u16_hash2(m->seqno); +} + +/** + * Equality routine for ut_mid structs; + */ +static bool +ut_mid_eq(const void *k1, const void *k2) +{ + const struct ut_mid *m1 = k1, *m2 = k2; + + return m1->seqno == m2->seqno && gnet_host_equal(m1->from, m2->from); +} + +/** + * Free message fragments. + */ +static void +ut_rmsg_fragments_free(const struct ut_rmsg *um) +{ + unsigned i; + + ut_rmsg_check(um); + + /* + * Free fragments collected in the I/O vector. + */ + + for (i = 0; i < um->fragcnt; i++) { + iovec_t *iov = &um->fragmentsi; + if (iovec_base(iov) != NULL) + wfree(iovec_base(iov), iovec_len(iov)); + iovec_set(iov, NULL, 0); + } +} + +/** + * Free message. + */ +static void +ut_rmsg_free(struct ut_rmsg *um, bool free_sequence) +{ + ut_rmsg_check(um); + + ut_rmsg_fragments_free(um); + + if (free_sequence) { + struct attr *attr = um->attr; + ut_attr_check(um->attr); + hevset_remove(attr->mseq, &um->id); + } + + iov_free(um->fragments); + cq_cancel(&um->expire_ev); + cq_cancel(&um->acks_ev); + atom_host_free_null(&um->id.from); + WFREE_NULL(um->fbits, BIT_ARRAY_BYTE_SIZE(um->fragcnt)); + WFREE_NULL(um->facks, BIT_ARRAY_BYTE_SIZE(um->fragcnt)); + + um->magic = 0; + WFREE(um); +} + +/** + * Callout queue callback invoked when the whole packet has expired. + */ +static void +ut_rmsg_expired(cqueue_t *cq, void *obj) +{ + struct ut_rmsg *um = obj; + + ut_rmsg_check(um); + g_assert(um->expire_ev != NULL); + + cq_zero(cq, &um->expire_ev); /* Callback has fired */ + + if (rx_ut_debugging(RX_UT_DBG_TIMEOUT, um->id.from)) { + g_debug("RX UT%s: %s: message from %s timed out " + "(seq=0x%04x, got %u/%u fragment%s)", + udp_tag_to_string(um->attr->tag), G_STRFUNC, + gnet_host_to_string(um->id.from), + um->id.seqno, um->fragrecv, um->fragcnt, plural(um->fragcnt)); + } + + gnet_stats_inc_general(GNR_UDP_SR_RX_MESSAGES_EXPIRED); + ut_rmsg_free(um, TRUE); +} + +/** + * Callout queue callback invoked when the whole packet is about to expire. + */ +static void +ut_rmsg_almost_expired(cqueue_t *cq, void *obj) +{ + struct ut_rmsg *um = obj; + + (void) cq; + + ut_rmsg_check(um); + g_assert(um->expire_ev != NULL); + + cq_zero(cq, &um->expire_ev); /* Callback has fired */ + + /* + * This is an advance notice that the message could expire. Probably our + * last acknowledgement was lost, so we resend it, hoping that the remote + * side will resume sending the missing parts. + * + * The rationale is that it is better to send an extra ACK (which the TX + * side will discard) than to let the remote side timeout because it is + * not getting any of our ACKs. This early expiration notice is another + * chance to prevent reception timeout. It is not necessary in the + * protocol and is just added for increased robustness. + * + * Then, if nothing happens within the remaining time window, the message + * will truly expire. + */ + + um->expire_ev = cq_main_insert(RX_UT_EXPIRE_MS - RX_UT_ALMOST_MS, + ut_rmsg_expired, um); + + if (rx_ut_debugging(RX_UT_DBG_TIMEOUT | RX_UT_DBG_ACK, um->id.from)) { + g_debug("RX UT%s: %s: message from %s could timeout " + "(seq=0x%04x, got %u/%u fragment%s so far)", + udp_tag_to_string(um->attr->tag), G_STRFUNC, + gnet_host_to_string(um->id.from), + um->id.seqno, um->fragrecv, um->fragcnt, plural(um->fragcnt)); + } + + ut_rmsg_reack(um); +} + +/** + * Callout queue callback invoked when the packet has finished lingering. + */ +static void +ut_rmsg_lingered(cqueue_t *cq, void *obj) +{ + struct ut_rmsg *um = obj; + + ut_rmsg_check(um); + g_assert(um->expire_ev != NULL); + + cq_zero(cq, &um->expire_ev); /* Callback has fired */ + + /* + * We delayed freeing to be able to re-ACK messages and avoid duplicate + * message reception. + */ + + ut_rmsg_free(um, TRUE); +} + +/** + * Initiate lingering of the message, deferring its release from memory. + * + * The aim is to be able to avoid handling the retransmission of a fragment + * as a new message if we already received it. The other end can retransmit + * in case the acknowledgment is lost or when the message reception was + * delayed by some transmission queue and caused the other end to resend it. + */ +static void +ut_rmsg_linger(struct ut_rmsg *um) +{ + ut_rmsg_check(um); + + ut_rmsg_fragments_free(um); /* No longer need collected message data */ + um->lingering = TRUE; + cq_replace(um->expire_ev, ut_rmsg_lingered, um); +} + +/** + * Create a new message for reception. + * + * This records the tuple (sender's address, sequence ID) in a set, and it + * will uniquely identify the message, letting us dispatch fragments to the + * proper messages. + * + * @param attr the layer's attributes + * @param header header information + * @param from sender's address + */ +static struct ut_rmsg * +ut_rmsg_create(struct attr *attr, const struct ut_header *header, + const gnet_host_t *from) +{ + struct ut_rmsg *um; + + ut_attr_check(attr); + g_assert(header->count != 0); + + WALLOC0(um); + um->magic = UT_RMSG_MAGIC; + um->id.from = atom_host_get(from); + um->id.seqno = header->seqno; + um->fragcnt = header->count; + um->fragments = iov_alloc_n(um->fragcnt); + um->reliable = booleanize(header->flags & UDP_RF_ACKME); + um->deflated = booleanize(header->flags & UDP_RF_DEFLATED); + um->improved_acks = attr->improved_acks || + booleanize(header->flags & UDP_RF_IMPROVED_ACKS); + um->attr = attr; + um->fbits = walloc0(BIT_ARRAY_BYTE_SIZE(um->fragcnt)); + um->facks = walloc0(BIT_ARRAY_BYTE_SIZE(um->fragcnt)); + + g_assert(!hevset_contains(attr->mseq, &um->id)); /* New message! */ + + hevset_insert_key(attr->mseq, &um->id); + + /* + * We must receive all the fragments for this message within the + * expiration period. + */ + + um->expire_ev = cq_main_insert(RX_UT_ALMOST_MS, ut_rmsg_almost_expired, um); + + return um; +} + +/** + * Fill supplied header structure by reading the fields from the message. + */ +static void +ut_header_read(pmsg_t *mb, struct ut_header *header) +{ + const void *p; + + g_assert(pmsg_size(mb) >= UDP_RELIABLE_HEADER_SIZE); + + p = pmsg_read_base(mb); + header->seqno = udp_reliable_header_get_seqno(p); + header->flags = udp_reliable_header_get_flags(p); + header->part = udp_reliable_header_get_part(p) - 1; /* Zero-based */ + header->count = udp_reliable_header_get_count(p); + + pmsg_discard(mb, UDP_RELIABLE_HEADER_SIZE); /* Data has been read */ +} + +/** + * Fill supplied acknowledgment structure by reading fields from the header. + */ +static void +ut_ack_read(const void *data, size_t len, struct ut_ack *ack) +{ + uint8 flags; + uint8 fragno; + + g_assert(len >= UDP_RELIABLE_HEADER_SIZE); + + ZERO(ack); + ack->seqno = udp_reliable_header_get_seqno(data); + flags = udp_reliable_header_get_flags(data); + ack->cumulative = booleanize(0 != (flags & UDP_RF_CUMULATIVE_ACK)); + + /* + * Check for EARs (Extra Acknowledgment Requests). + */ + + fragno = udp_reliable_header_get_part(data); + + if (0 == fragno) { + ack->ear = TRUE; + ack->ear_nack = booleanize(0 == (flags & UDP_RF_ACKME)); + } else { + ack->fragno = fragno - 1; /* Zero-based */ + } + + if (flags & UDP_RF_EXTENDED_ACK) { + g_assert(len >= UDP_RELIABLE_EXT_HEADER_SIZE); + + ack->received = udp_reliable_get_received(data); + ack->missing = udp_reliable_get_missing(data); + } +} + +/** + * Iterator callback to release all pending messages. + */ +static void +ut_destroy_rmsg(void *data, void *unused_arg) +{ + struct ut_rmsg *um = data; + + (void) unused_arg; + + ut_rmsg_free(um, FALSE); /* Iterating from set */ +} + +/** + * Reset the pending acknowledments. + */ +static void +ut_rmsg_clear_acks(struct ut_rmsg *um) +{ + if (rx_ut_debugging(RX_UT_DBG_ACK, um->id.from)) { + g_debug("RX UT%s: %s: clearing %u delayed ACK%s to %s " + "(seq=0x%04x, received %u/%u fragment%s)", + udp_tag_to_string(um->attr->tag), G_STRFUNC, + um->acks_pending, plural(um->acks_pending), + gnet_host_to_string(um->id.from), um->id.seqno, + um->fragrecv, um->fragcnt, plural(um->fragcnt)); + } + + gnet_stats_count_general(GNR_UDP_SR_RX_AVOIDED_ACKS, um->acks_pending); + um->acks_pending = 0; + bit_array_clear_range(um->facks, 0, um->fragcnt - 1); +} + +/** + * Signal reception of complete message. + * + * The message is expected to be freed at the end of processing by the + * data-indication routine, because we cannot know whether the upper + * layer will not buffer the message and delay its processing. + */ +static inline void +ut_received(const struct attr *attr, pmsg_t *mb, const gnet_host_t *from) +{ + if G_UNLIKELY(!attr->if_enabled) { + pmsg_free(mb); + return; + } + + if (rx_ut_debugging(RX_UT_DBG_RECV, from)) { + g_debug("RX UT%s: %s: giving %d-byte message from %s", + udp_tag_to_string(attr->tag), G_STRFUNC, + pmsg_size(mb), gnet_host_to_string(from)); + } + + rx_check(attr->rx); + + (void) (*attr->rx->data.from_ind)(attr->rx, mb, from); +} + +/** + * Update statistics on messages received. + */ +static void +ut_update_rx_messages_stats(bool reliable) +{ + gnet_stats_inc_general(GNR_UDP_SR_RX_MESSAGES_RECEIVED); + if (!reliable) + gnet_stats_inc_general(GNR_UDP_SR_RX_MESSAGES_UNRELIABLE); +} + +/** + * Assemble all the collected fragments into a single message and send it + * to upper layers. + */ +static void +ut_assemble_message(struct ut_rmsg *um) +{ + pmsg_t *mb; + + ut_rmsg_check(um); + ut_attr_check(um->attr); + + if (rx_ut_debugging(RX_UT_DBG_MSG, um->id.from)) { + size_t len = iov_calculate_size(um->fragments, um->fragcnt); + g_debug("RX UT%s: %s: re-assembling %s%smessage from %s " + "(seq=0x%04x, %u fragment%s, %zu bytes)", + udp_tag_to_string(um->attr->tag), G_STRFUNC, + um->reliable ? "reliable " : "", + um->deflated ? "deflated " : "", + gnet_host_to_string(um->id.from), + um->id.seqno, um->fragcnt, plural(um->fragcnt), len); + } + + ut_update_rx_messages_stats(um->reliable); + + if (um->deflated) { + zlib_inflater_t *zi = um->attr->zi; + unsigned i; + int ret = 0; + + zlib_inflater_reset(zi, NULL, 0); + + for (i = 0; i < um->fragcnt; i++) { + iovec_t *iov = &um->fragmentsi; + if (NULL == iovec_base(iov)) + continue; /* Fragment #i was empty (0-byte payload) */ + ret = zlib_inflate_data(zi, iovec_base(iov), iovec_len(iov)); + if (-1 == ret) + goto drop; + else if (0 == ret && i != um->fragcnt - 1U) + goto drop; + } + + if (0 != ret) + goto drop; + + gnet_stats_inc_general(GNR_UDP_SR_RX_MESSAGES_INFLATED); + mb = pmsg_new(PMSG_P_DATA, + zlib_inflater_out(zi), zlib_inflater_outlen(zi)); + } else { + size_t len; + unsigned i; + + len = iov_calculate_size(um->fragments, um->fragcnt); + if (0 == len) + goto empty; + mb = pmsg_new(PMSG_P_DATA, NULL, len); + + for (i = 0; i < um->fragcnt; i++) { + iovec_t *iov = &um->fragmentsi; + if (NULL == iovec_base(iov)) + continue; /* Fragment #i was empty (0-byte payload) */ + pmsg_write(mb, iovec_base(iov), iovec_len(iov)); + } + } + + ut_received(um->attr, mb, um->id.from); + return; + +drop: + if ( + GNET_PROPERTY(udp_debug) || + rx_ut_debugging(RX_UT_DBG_MSG, um->id.from) + ) { + size_t len = iov_calculate_size(um->fragments, um->fragcnt); + g_warning("RX UT%s: %s: inflation error for message from %s " + "(seq=0x%04x, %u fragment%s, %zu byte%s)", + udp_tag_to_string(um->attr->tag), G_STRFUNC, + gnet_host_to_string(um->id.from), + um->id.seqno, um->fragcnt, plural(um->fragcnt), + len, plural(len)); + } + + gnet_stats_inc_general(GNR_UDP_SR_RX_MESSAGES_INFLATION_ERROR); + return; + +empty: + if (rx_ut_debugging(RX_UT_DBG_MSG, um->id.from)) { + g_warning("RX UT%s: %s: dropping empty message from %s " + "(seq=0x%04x, %u fragment%s)", + udp_tag_to_string(um->attr->tag), G_STRFUNC, + gnet_host_to_string(um->id.from), + um->id.seqno, um->fragcnt, plural(um->fragcnt)); + } + + gnet_stats_inc_general(GNR_UDP_SR_RX_MESSAGES_EMPTY); +} + +/** + * Handle reception of a new fragment for the message. + */ +static void +ut_handle_fragment(struct ut_rmsg *um, const struct ut_header *head, pmsg_t *mb) +{ + iovec_t *iov; + size_t len; + void *data; + + ut_rmsg_check(um); + g_assert(head->part < um->fragcnt); + + if (rx_ut_debugging(RX_UT_DBG_FRAG, um->id.from)) { + g_debug("RX UT%s: %s: handling %s%s%sfragment #%u/%u from %s " + "(seq=0x%04x, %u pending ACK%s)", + udp_tag_to_string(um->attr->tag), G_STRFUNC, + um->lingering ? "lingering " : + bit_array_get(um->fbits, head->part) ? "duplicate " : "", + um->reliable ? "reliable " : "", + um->deflated ? "deflated " : "", + head->part + 1, um->fragcnt, + gnet_host_to_string(um->id.from), head->seqno, + um->acks_pending, plural(um->acks_pending)); + } + + if (um->lingering) { + gnet_stats_inc_general(GNR_UDP_SR_RX_FRAGMENTS_LINGERING); + return; /* Message already fully received */ + } + + if (bit_array_get(um->fbits, head->part)) { + gnet_stats_inc_general(GNR_UDP_SR_RX_FRAGMENTS_DUPLICATE); + return; /* Already got that fragment */ + } + + bit_array_set(um->fbits, head->part); /* Got fragment */ + um->fragrecv++; + + /* + * We have no a priori knowledge about the total size of the message once + * re-assembled. Therefore, we have no other option but to copy the data + * from the message into a newly allocated buffer. + */ + + len = pmsg_size(mb); + + if (0 != len) { + /* Payload not empty */ + data = walloc(len); + pmsg_read(mb, data, len); + + iov = &um->fragmentshead->part; + g_assert(NULL == iovec_base(iov)); /* Not already received */ + + iovec_set(iov, data, len); + } + + /* + * If we got the last fragment, we can re-assemble the whole message. + */ + + if (um->fragrecv == um->fragcnt) { + ut_assemble_message(um); + ut_rmsg_linger(um); + } +} + +/** + * Upgrade improved acknowledgment, as appropriate. + * + * The acknowledgment has already been filled as either a regular or + * cumulative acknowledgment, and we're looking at whether we should + * transform it as an extended acknowledgment. + * + * @return TRUE if the generated ACK covers everything that was received. + */ +static bool +ut_upgrade_ack(const struct ut_rmsg *um, struct ut_ack *ack) +{ + unsigned i, mask, max, base; + + g_assert(ack->fragno < um->fragcnt); + g_assert(um->improved_acks); + + /* + * See whether we should use an extended acknowledgment. + * + * If the total amount of fragments is 1 or 2, then a cumulative + * acknowledgment is enough anyway. + * + * If the total amount of fragments is 3 or more and we're sending + * a cumulative acknowledgment with no other fragments received past + * the one being acknowledged, then there is no need for an extended + * acknowledgment: the cumulative acknowledgment implicitly denies + * reception of other fragments. + * + * If there has been only one fragment received overall, then an extended + * acknowledgment does not add any value: the (only) fragment received so + * far can be simply acknoweldged. + */ + + if (um->fragcnt <= 2) + return ack->cumulative; + + if ( + ack->cumulative && + ( + ack->fragno + 1 == um->fragcnt || + (size_t) -1 == bit_array_last_set(um->fbits, + ack->fragno + 1, um->fragcnt - 1) + ) + ) + return TRUE; /* Implicitly denies reception of upper fragments */ + + if (1 == um->fragrecv) + return TRUE; /* One fragment received so far */ + + /* + * Extended acknowledgment is worth sending. + * + * The bit 0 of the missing field is going to be corresponding to the + * first fragment after the acknoweldged one if we are sending a + * cumulative acknowledgment. Otherwise, it corresponds to fragment 0, + * in our zero-based counting. + */ + + g_assert(um->fragrecv != 0); + + ack->received = um->fragrecv; + base = ack->cumulative ? ack->fragno + 1 : 0; + max = base + 24; /* Only 24 bits available in missing */ + max = MIN(max, um->fragcnt); + mask = 1; + + g_assert(base < um->fragcnt); + + for (i = base; i < max; i++, mask <<= 1) { + if (!bit_array_get(um->fbits, i)) + ack->missing |= mask; /* Fragment still missing */ + } + + return max <= um->fragcnt; /* Are we exhaustive in our ACK? */ +} + +/** + * Build possibly cumulative ack for message. + */ +static void +ut_cumulative_ack(const struct ut_rmsg *um, struct ut_ack *ack, + size_t first_missing, size_t last_unacked) +{ + g_assert(um->improved_acks); + + if ((size_t) -1 == first_missing) { + /* Everything was already received (for multi-fragment message) */ + g_assert(um->fragcnt == um->fragrecv); + ack->cumulative = TRUE; + ack->fragno = um->fragcnt - 1; + } else if (first_missing > last_unacked) { + ack->cumulative = booleanize(first_missing > 1U); + ack->fragno = first_missing - 1; + } else { + g_assert((size_t) -1 != last_unacked); /* One frag received at least */ + ack->fragno = last_unacked; + } +} + +/** + * Build delayed improved acknowledgment, as appropriate. + * + * @return TRUE if the generated ACK covers everything that was received. + */ +static bool +ut_build_delayed_ack(struct ut_rmsg *um, struct ut_ack *ack) +{ + size_t first_missing, last_unacked; + + g_assert(um->acks_pending != 0); + g_assert(um->fragcnt > 1U); /* Delayed only if multiple fragments */ + g_assert(um->improved_acks); /* Remote will understand improved ACKs */ + + /* + * Start from the highest numbered un-acknoweledged fragment remaining. + */ + + last_unacked = bit_array_last_set(um->facks, 0, um->fragcnt - 1); + g_assert((size_t) -1 != last_unacked); /* At least 1 un-ACKed fragment */ + + bit_array_clear(um->facks, last_unacked); + um->acks_pending--; + + /* + * See whether we can use a cumulative acknowledgment, then possibly + * upgrading it to an extended acknowledgment.. + */ + + first_missing = bit_array_first_clear(um->fbits, 0, um->fragcnt - 1); + + ZERO(ack); + ack->seqno = um->id.seqno; + ut_cumulative_ack(um, ack, first_missing, last_unacked); + + return ut_upgrade_ack(um, ack); +} + +/** + * Build an extra acknowledgment, as appropriate. + */ +static void +ut_build_extra_ack(const struct ut_rmsg *um, struct ut_ack *ack) +{ + size_t first_missing, last_unacked; + + /* + * Start from the highest numbered un-acknoweledged fragment remaining. + */ + + last_unacked = bit_array_last_set(um->facks, 0, um->fragcnt - 1); + first_missing = bit_array_first_clear(um->fbits, 0, um->fragcnt - 1); + + /* + * If we have no un-acked fragments, set the last un-acked fragment count + * to the last received fragment of the message. This is the fragment we + * will then re-acknowledge. + */ + + if ((size_t) -1 == last_unacked) { + last_unacked = (size_t) -1 == first_missing + ? um->fragcnt - 1U + : bit_array_last_set(um->fbits, 0, um->fragcnt - 1); + + g_assert((size_t) -1 != last_unacked); /* One frag received at least */ + } + + ZERO(ack); + ack->seqno = um->id.seqno; + + if (um->improved_acks) { + ut_cumulative_ack(um, ack, first_missing, last_unacked); + ut_upgrade_ack(um, ack); + } else { + size_t last_frag = bit_array_last_set(um->fbits, 0, um->fragcnt - 1); + g_assert((size_t) -1 != last_frag); /* One frag received at least */ + ack->fragno = last_frag; + } +} + +/** + * Send back the acknowledgment. + * + * We have been building an acknowledgment structure, which is now going + * to be handed over to the sibling TX layer. That layer will do the + * proper packet framing and send it with high priority. + */ +static void +ut_ack_sendback(const struct ut_rmsg *um, const struct ut_ack *ack) +{ + const struct attr *attr; + + ut_rmsg_check(um); + ut_attr_check(um->attr); + + attr = um->attr; + + if (rx_ut_debugging(RX_UT_DBG_ACK, um->id.from)) { + g_debug("RX UT%s: %s: sending %s%s%sACK to %s " + "(seq=0x%04x, fragment #%u, missing=0x%x)", + udp_tag_to_string(attr->tag), G_STRFUNC, + um->improved_acks ? "" : "legacy ", + ack->cumulative ? "cumulative " : "", + ack->received != 0 ? "extended " : "", + gnet_host_to_string(um->id.from), + ack->seqno, ack->fragno + 1, ack->missing); + } + + gnet_stats_inc_general(GNR_UDP_SR_RX_TOTAL_ACKS_SENT); + if (ack->cumulative) + gnet_stats_inc_general(GNR_UDP_SR_RX_CUMULATIVE_ACKS_SENT); + if (ack->received != 0) + gnet_stats_inc_general(GNR_UDP_SR_RX_EXTENDED_ACKS_SENT); + + ut_send_ack(attr->tx, um->id.from, ack); /* Sent by the TX layer */ +} + +/** + * Callout queue callback invoked when pending ACKs must be sent back. + */ +static void +ut_delayed_ack(cqueue_t *cq, void *obj) +{ + struct ut_rmsg *um = obj; + struct ut_ack ack; + + ut_rmsg_check(um); + g_assert(um->acks_ev != NULL); + + cq_zero(cq, &um->acks_ev); /* Callback has fired */ + + while (um->acks_pending) { + bool exhausted = ut_build_delayed_ack(um, &ack); + + if (rx_ut_debugging(RX_UT_DBG_ACK, um->id.from)) { + g_debug("RX UT%s: %s: %s delayed %s%sACK to %s " + "(seq=0x%04x, fragment #%u, missing=0x%x)", + udp_tag_to_string(um->attr->tag), G_STRFUNC, + exhausted ? "flushing" : "sending", + ack.cumulative ? "cumulative " : "", + ack.received != 0 ? "extended " : "", + gnet_host_to_string(um->id.from), + ack.seqno, ack.fragno + 1, ack.missing); + } + + ut_ack_sendback(um, &ack); + if (exhausted) + break; + } + + ut_rmsg_clear_acks(um); +} + +/** + * Acknowledge reception of fragment. + * + * When this routine is called, the fragment has not been handled yet so its + * proper reception may not be accounted for already. + * + * We're nonetheless sending the acknowledgment before processing the fragment + * to let the message go back as quickly as possible. + */ +static void +ut_acknowledge_fragment(struct ut_rmsg *um, const struct ut_header *head) +{ + struct attr *attr; + struct ut_ack ack; + + ut_rmsg_check(um); + g_assert(head->count == um->fragcnt); + g_assert(head->part < um->fragcnt); + + attr = um->attr; + ut_attr_check(attr); + + ZERO(&ack); + ack.seqno = head->seqno; + ack.fragno = head->part; + + /* + * Improved acknowledgments are only interesting when there are multiple + * fragments in the message + */ + + if (um->improved_acks && um->fragcnt > 1) { + size_t fragrecv = um->fragrecv; + + /* + * Delaying acknowledgments allows the RX side to hopefully acknowledge + * more than one fragment at a time, thanks to cumulative or extended + * acknowledgment messages. + * + * We're dealing with an un-processed fragment here, so account for + * its reception if it's not a duplicate. + */ + + if (!bit_array_get(um->fbits, head->part)) + fragrecv++; + + /* + * As soon as we have received all the fragments, immediately + * acknowledge everything through a single cumulative acknowledgment. + */ + + if (fragrecv == um->fragcnt) { + cq_cancel(&um->acks_ev); + ack.cumulative = TRUE; + ack.fragno = um->fragcnt - 1; + ut_rmsg_clear_acks(um); + goto send_ack; + } + + /* + * We use a Nagle-like algorithm to defer the acknowledgment, but + * we don't wait more than RX_UT_DELAY_MS after the reception of the + * first fragment to acknowledge what we got in-between. + * + * The aim is to make the delaying almost invisible to the sender, + * yet give enough time to buffer fragments (and therefore pending + * acknowledgments) without running the risk of facing a retransmission + * due to lack of acknowledgment. + */ + + if (NULL == um->acks_ev) + um->acks_ev = cq_main_insert(RX_UT_DELAY_MS, ut_delayed_ack, um); + + /* + * If fragment was already pending ACK, then it's going to be + * acknowledged when we flush the pending ACKs, hence we can ignore it. + */ + + if (bit_array_get(um->facks, head->part)) { + if (rx_ut_debugging(RX_UT_DBG_ACK, um->id.from)) { + g_debug("RX UT%s: %s: already delayed ACK to %s " + "(seq=0x%04x, fragment #%u/%u, pending=%u)", + udp_tag_to_string(um->attr->tag), G_STRFUNC, + gnet_host_to_string(um->id.from), + ack.seqno, ack.fragno + 1, um->fragcnt, um->acks_pending); + } + gnet_stats_inc_general(GNR_UDP_SR_RX_AVOIDED_ACKS); + return; + } + + bit_array_set(um->facks, head->part); /* Fragment is pending ACK */ + um->acks_pending++; + + if (rx_ut_debugging(RX_UT_DBG_ACK, um->id.from)) { + g_debug("RX UT%s: %s: delaying ACK to %s " + "(seq=0x%04x, fragment #%u/%u, pending=%u)", + udp_tag_to_string(um->attr->tag), G_STRFUNC, + gnet_host_to_string(um->id.from), + ack.seqno, ack.fragno + 1, um->fragcnt, um->acks_pending); + } + + return; + } + +send_ack: + ut_ack_sendback(um, &ack); +} + +/** + * Re-acknowledge the message completely, stating everything we got so far. + * + * @param um the message being received + */ +static void +ut_rmsg_reack(struct ut_rmsg *um) +{ + struct ut_ack rack; + + ut_rmsg_check(um); + + /* + * If we had pending ACKs to send, cancel them as we're about to re-ack + * everything we got. + */ + + cq_cancel(&um->acks_ev); + ut_build_extra_ack(um, &rack); + ut_rmsg_clear_acks(um); + + if (rx_ut_debugging(RX_UT_DBG_ACK, um->id.from)) { + g_debug("RX UT%s: %s: sending extra %s%sACK back to %s " + "(seq=0x%04x, fragment #%u, got %u/%u fragment%s, " + "missing=0x%x)", + udp_tag_to_string(um->attr->tag), G_STRFUNC, + rack.cumulative ? "cumulative " : "", + rack.missing != 0 ? "extended " : "", + gnet_host_to_string(um->id.from), rack.seqno, + rack.fragno + 1, um->fragrecv, um->fragcnt, + plural(um->fragcnt), rack.missing); + } + + ut_send_ack(um->attr->tx, um->id.from, &rack); /* Sent by the TX layer */ +} + +/** + * Handle reception of an EAR (Extra Acknowledgment Request). + */ +static void +ut_handle_ear(const struct attr *attr, + const gnet_host_t *from, const struct ut_ack *ack) +{ + struct ut_mid key; + struct ut_rmsg *um; + struct ut_ack rack; + + if (rx_ut_debugging(RX_UT_DBG_ACK, from)) { + g_debug("RX UT%s: %s: got EAR from %s (seq=0x%04x)", + udp_tag_to_string(attr->tag), G_STRFUNC, + gnet_host_to_string(from), ack->seqno); + } + + gnet_stats_inc_general(GNR_UDP_SR_RX_EARS_RECEIVED); + + /* + * See whether this an EAR for a known message (being received with + * still missing fragments). + */ + + key.from = from; + key.seqno = ack->seqno; + um = hevset_lookup(attr->mseq, &key); + + if (NULL == um) { + /* + * We don't know anything about this sequence ID, so negatively ACK the + * EAR by sending back another EAR with the "negative ACK" indication. + */ + + ZERO(&rack); + rack.ear = TRUE; + rack.ear_nack = TRUE; + rack.seqno = ack->seqno; + + gnet_stats_inc_general(GNR_UDP_SR_RX_EARS_FOR_UNKNOWN_MESSAGE); + + if (rx_ut_debugging(RX_UT_DBG_ACK, from)) { + g_debug("RX UT%s: %s: sending negative EAR back to %s " + "(unknown seq=0x%04x)", + udp_tag_to_string(attr->tag), G_STRFUNC, + gnet_host_to_string(from), ack->seqno); + } + + ut_send_ack(attr->tx, from, &rack); /* Sent by the TX layer */ + } else { + /* + * We know this sequence ID, hence the remote TX side probably did not + * get our last ACK, hence we're getting an EAR. Cancel any pending + * delayed ACK and immediately resend an ACK for what we got so far. + */ + + if (um->lingering) + gnet_stats_inc_general(GNR_UDP_SR_RX_EARS_FOR_LINGERING_MESSAGE); + + ut_rmsg_reack(um); + } +} + +/*** + *** Routines exported to the core for direct access to the RX layer. + ***/ + +/** + * Check whether header / origin are for a valid message. + * + * This is only used on ambiguous messages to determine whether they can + * be interpreted as a semi-reliable UDP message. + * + * @param rx the RX driver + * @param uth the UDP semi-reliable header + * @param from host that sent us the message + * + * @return TRUE if this corresponds to a fragment for a message being received. + */ +bool +ut_valid_message(const rxdrv_t *rx, const struct ut_header *uth, + const gnet_host_t *from) +{ + struct attr *attr; + struct ut_mid key; + const struct ut_rmsg *um; + + rx_check(rx); + g_assert(uth != NULL); + g_assert(from != NULL); + + attr = rx->opaque; + + ut_attr_check(attr); + + /* + * See whether this a fragment for a known message (being received with + * still missing fragments). + */ + + key.from = from; + key.seqno = uth->seqno; + um = hevset_lookup(attr->mseq, &key); + + if (NULL == um) + return FALSE; /* Unknown message */ + + /* + * Check against the fragment count. + */ + + if (um->fragcnt != uth->count) + return FALSE; + + /* + * If message was deflated, make sure the flags are for a deflated message. + * And conversely, if the message was not deflated. + * + * Then perform the same logical equivalence check for acknowledgments. + */ + + if (!equiv(um->deflated, (uth->flags & UDP_RF_DEFLATED))) + return FALSE; + + if (!equiv(um->reliable, (uth->flags & UDP_RF_ACKME))) + return FALSE; + + return TRUE; /* OK, consistent semi-reliable UDP fragment */ +} + +/** + * Got incoming message (UDP datagram), i.e. a fragment / acknowledgment for us. + * + * @param rx the RX driver + * @param data start of the data + * @param len amount of data available + * @param from host that sent us the message + */ +void +ut_got_message(const rxdrv_t *rx, const void *data, size_t len, + const gnet_host_t *from) +{ + struct attr *attr; + struct ut_mid key; + struct ut_rmsg *um; + pdata_t *db; + pmsg_t *mb; + struct ut_header head; + + rx_check(rx); + g_assert(data != NULL); + g_assert(size_is_non_negative(len)); + g_assert(len >= UDP_RELIABLE_HEADER_SIZE); + g_assert(from != NULL); + + attr = rx->opaque; + + ut_attr_check(attr); + + /* + * Account for all the bytes we receive, including protocol overhead. + */ + + if (attr->cb->add_rx_given != NULL) + (*attr->cb->add_rx_given)(rx->owner, len); + + /* + * Handle acknowledgments (for packets sent by the TX side) and EARs. + * + * We can get special EAR packets (Extra Acknowledgment Request) which + * are either true requests (handled by the RX layer) or actually + * negative ACKs (handled by the TX layer, as it is a response to a + * previous EAR it sent). + * + * The lower layer which feeds us the received datagrams is carefully + * validating that the traffic we get is well-formed. In particular, + * this means there is a valid header and that acknowledgments are + * properly sized: an extended acknowledgment has a longer header. + * + * Hence the code can assume that the sizes are correct. + */ + + if (0 == udp_reliable_header_get_count(data)) { + struct ut_ack ack; + ut_ack_read(data, len, &ack); + if (ack.ear && !ack.ear_nack) + ut_handle_ear(attr, from, &ack); /* EAR for the RX layer */ + else + ut_got_ack(attr->tx, from, &ack); /* Handle it in the TX layer */ + return; + } + + /* + * Create the message buffer, referencing the data being received. + */ + + db = pdata_allocb_ext(deconstify_pointer(data), len, pdata_free_nop, NULL); + mb = pmsg_alloc(PMSG_P_DATA, db, 0, len); + + /* + * Read message header. + */ + + ut_header_read(mb, &head); + + gnet_stats_inc_general(GNR_UDP_SR_RX_FRAGMENTS_RECEIVED); + if (0 == (head.flags & UDP_RF_ACKME)) + gnet_stats_inc_general(GNR_UDP_SR_RX_FRAGMENTS_UNRELIABLE); + + /* + * See whether this a fragment for a known message (being received with + * some fragments still missing). + */ + + key.from = from; + key.seqno = head.seqno; + um = hevset_lookup(attr->mseq, &key); + + if (NULL == um) { + if (rx_ut_debugging(RX_UT_DBG_MSG, from)) { + g_debug("RX UT%s: %s: start of new %s%smessage from %s " + "(seq=0x%04x, %u fragment%s) -- already has %zu pending", + udp_tag_to_string(attr->tag), G_STRFUNC, + (head.flags & UDP_RF_ACKME) ? "reliable " : "", + (head.flags & UDP_RF_DEFLATED) ? "deflated " : "", + gnet_host_to_string(from), + head.seqno, head.count, plural(head.count), + hevset_count(attr->mseq)); + } + + /* Special-case non-ACKed single fragment messages */ + if (1 == head.count && !(head.flags & UDP_RF_ACKME)) { + ut_update_rx_messages_stats(FALSE); + ut_received(attr, mb, from); + return; /* Message freed by data indication routine */ + } + + um = ut_rmsg_create(attr, &head, from); + } + + /* + * Make sure fragment count is consistent, as well as acknowledgment + * and deflation flags. + * + * If an inconsistency is detected, the fragment is simply ignored, + * and not even acknowledged, even if this causes re-transmission on + * the other end. + */ + + if ( + head.count != um->fragcnt || + head.part >= um->fragcnt || + um->deflated != booleanize(head.flags & UDP_RF_DEFLATED) || + um->reliable != booleanize(head.flags & UDP_RF_ACKME) + ) { + if (rx_ut_debugging(RX_UT_DBG_FRAG, from)) { + g_warning("RX UT%s: %s: dropping invalid %s%sfragment from %s " + "(seq=0x%04x, fragment #%u/%u, " + "message is %sreliable %swith %u fragment%s)", + udp_tag_to_string(um->attr->tag), G_STRFUNC, + (head.flags & UDP_RF_ACKME) ? "reliable " : "", + (head.flags & UDP_RF_DEFLATED) ? "deflated " : "", + gnet_host_to_string(from), + head.seqno, head.part + 1, head.count, + um->reliable ? "" : "un", + um->deflated ? "and deflated " : "", + um->fragcnt, plural(um->fragcnt)); + } + + gnet_stats_inc_general(GNR_UDP_SR_RX_FRAGMENTS_DROPPED); + goto done; + } + + /* + * Log fragment reception. + */ + + if (rx_ut_debugging(RX_UT_DBG_FRAG, um->id.from)) { + g_debug("RX UT%s: %s: got %s%s%sfragment #%u/%u from %s " + "(seq=0x%04x, %d-byte payload)", + udp_tag_to_string(um->attr->tag), G_STRFUNC, + um->lingering ? "lingering " : + bit_array_get(um->fbits, head.part) ? "duplicate " : "", + um->reliable ? "reliable " : "", + um->deflated ? "deflated " : "", + head.part + 1, um->fragcnt, + gnet_host_to_string(um->id.from), + head.seqno, pmsg_size(mb)); + } + + /* + * If requested, acknowledge reception of fragment immediately, before + * processing it, to make sure we send it back as early as possible. + * Of course, the ACK message could be queued by the lower UDP TX scheduler + * but then we already have a clogged output stream. + */ + + if (head.flags & UDP_RF_ACKME) + ut_acknowledge_fragment(um, &head); + + ut_handle_fragment(um, &head, mb); + +done: + pmsg_free(mb); +} + +/*** + *** Polymorphic routines. + ***/ + +/** + * Initialize the driver. + */ +static void * +rx_ut_init(rxdrv_t *rx, const void *args) +{ + const struct rx_ut_args *rargs = args; + struct attr *attr; + + rx_check(rx); + tx_check(rargs->tx); + g_assert(rargs->cb != NULL); + + WALLOC0(attr); + attr->magic = RX_UT_ATTR_MAGIC; + attr->tag = rargs->tag; + attr->mseq = hevset_create_any( + offsetof(struct ut_rmsg, id), + ut_mid_hash, ut_mid_hash2, ut_mid_eq); + attr->rx = rx; + attr->tx = rargs->tx; + attr->cb = rargs->cb; + attr->improved_acks = booleanize(!rargs->advertised_improved_acks); + attr->zi = zlib_inflater_make(NULL, 0); + zlib_inflater_set_maxoutlen(attr->zi, settings_max_msg_size()); + + rx->opaque = attr; + + return rx; /* OK */ +} + +/** + * Get rid of the driver's private data. + */ +static void +rx_ut_destroy(rxdrv_t *rx) +{ + struct attr *attr = rx->opaque; + + ut_attr_check(attr); + + hevset_foreach(attr->mseq, ut_destroy_rmsg, NULL); + hevset_free_null(&attr->mseq); + zlib_inflater_free(attr->zi, TRUE); + + attr->magic = 0; + WFREE(attr); + rx->opaque = NULL; +} + +/** + * Enable reception of data. + */ +static void +rx_ut_enable(rxdrv_t *rx) +{ + struct attr *attr = rx->opaque; + + ut_attr_check(attr); + + attr->if_enabled = TRUE; +} + +/** + * Disable reception of data. + */ +static void +rx_ut_disable(rxdrv_t *rx) +{ + struct attr *attr = rx->opaque; + + ut_attr_check(attr); + + attr->if_enabled = FALSE; +} + +static const struct rxdrv_ops rx_ut_ops = { + rx_ut_init, /**< init */ + rx_ut_destroy, /**< destroy */ + NULL, /**< recv */ + NULL, /**< recvfrom */ + rx_ut_enable, /**< enable */ + rx_ut_disable, /**< disable */ + rx_no_source, /**< bio_source */ +}; + +const struct rxdrv_ops * +rx_ut_get_ops(void) +{ + return &rx_ut_ops; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/rx_ut.h
Added
@@ -0,0 +1,92 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * Network RX -- UDP transceiver layer (semi-reliable UDP) + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _core_rx_ut_h_ +#define _core_rx_ut_h_ + +#include "common.h" + +#include "rx.h" +#include "udp_reliable.h" /* For udp_tag_t */ + +const struct rxdrv_ops* rx_ut_get_ops(void); + +struct txdriver; + +/** + * Callbacks used by the semi-reliable RX layer. + */ +struct rx_ut_cb { + void (*add_rx_given)(void *owner, ssize_t amount); +}; + +/** + * Arguments to be passed when the layer is instantiated. + */ +struct rx_ut_args { + udp_tag_t tag; /**< Protocol tag (for logging mostly) */ + struct txdriver *tx; /**< Sibling TX side for ACKs processing */ + struct rx_ut_cb *cb; /**< Callbacks */ + bool advertised_improved_acks; /**< Remote must advertise support first */ +}; + +/** + * Fields of the semi-reliable UDP header. + * + * We don't include the leading tag because messages are routed to the + * the proper RX layer based on the tag so there's no need to analyze it + * further. + * + * Also note that the order in the structure is not identical to the + * physical framing order. + */ +struct ut_header { + uint16 seqno; + uint8 flags; + uint8 part; /* Zero-based */ + uint8 count; +}; + +/* + * Public interface. + */ + +bool ut_valid_message(const rxdrv_t *rx, const struct ut_header *uth, + const gnet_host_t *from); +void ut_got_message(const rxdrv_t *rx, const void *data, size_t len, + const gnet_host_t *from); + +#endif /* _core_rx_ut_h_ */ + +/* vi: set ts=4 sw=4 cindent: */ +
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/rxbuf.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/rxbuf.c
Changed
@@ -54,7 +54,7 @@ * Put RX buffer back to its pool. */ void -rxbuf_free(gpointer p) +rxbuf_free(void *p) { pdata_t *db = p; @@ -68,7 +68,7 @@ * Free routine for the page-aligned buffer, called by pdata_unref(). */ static void -rxbuf_data_free(gpointer p, gpointer unused_data) +rxbuf_data_free(void *p, void *unused_data) { (void) unused_data; @@ -97,10 +97,10 @@ /** * Wrapper over vmm_alloc(). */ -static gpointer +static void * rxbuf_page_alloc(size_t size) { - gpointer p; + void *p; g_assert(size == rxbuf_pagesize); @@ -116,23 +116,24 @@ * Wrapper over vmm_free(). */ static void -rxbuf_page_free(gpointer p, gboolean fragment) +rxbuf_page_free(void *p, size_t size, bool fragment) { + g_assert(size == rxbuf_pagesize); + if (GNET_PROPERTY(rxbuf_debug) > 2) - g_debug("RXBUF freeing %uK buffer at %p%s", - (unsigned) rxbuf_pagesize / 1024, p, fragment ? " (fragment)" : ""); + g_debug("RXBUF freeing %zuK buffer at %p%s", + size / 1024, p, fragment ? " (fragment)" : ""); - vmm_free(p, rxbuf_pagesize); + vmm_free(p, size); } /** * Check whether buffer is relocatable or is a memory fragment. */ -static gboolean -rxbuf_page_is_fragment(gpointer p) +static bool +rxbuf_page_is_fragment(void *p, size_t size) { - return vmm_is_relocatable(p, rxbuf_pagesize) || - vmm_is_fragment(p, rxbuf_pagesize); + return vmm_is_relocatable(p, size) || vmm_is_fragment(p, size); } /**
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/rxbuf.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/rxbuf.h
Changed
@@ -42,7 +42,7 @@ */ pdata_t *rxbuf_new(void); -void rxbuf_free(gpointer p); +void rxbuf_free(void *p); void rxbuf_init(void); void rxbuf_close(void);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/search.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/search.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2001-2011, Raphael Manfredi + * Copyright (c) 2001-2011, 2014 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,12 +28,15 @@ * Search handling (core side). * * @author Raphael Manfredi - * @date 2001-2011 + * @date 2001-2011, 2014 */ #include "common.h" +#define SEARCH_SOURCES #include "search.h" + +#include "ban.h" #include "bogons.h" #include "ctl.h" #include "dh.h" @@ -69,6 +72,11 @@ #include "version.h" #include "vmsg.h" +#include "g2/build.h" +#include "g2/msg.h" +#include "g2/node.h" +#include "g2/tree.h" + #include "if/gnet_property.h" #include "if/gnet_property_priv.h" #include "if/bridge/c2ui.h" @@ -77,6 +85,7 @@ #include "xml/xnode.h" #include "xml/xfmt.h" +#include "lib/aging.h" #include "lib/array.h" #include "lib/ascii.h" #include "lib/atoms.h" @@ -84,28 +93,37 @@ #include "lib/concat.h" #include "lib/cq.h" #include "lib/endian.h" +#include "lib/entropy.h" #include "lib/glib-missing.h" #include "lib/gnet_host.h" #include "lib/halloc.h" +#include "lib/hashing.h" #include "lib/hashlist.h" +#include "lib/hset.h" +#include "lib/htable.h" #include "lib/idtable.h" #include "lib/iso3166.h" #include "lib/listener.h" #include "lib/magnet.h" +#include "lib/mempcpy.h" #include "lib/nid.h" +#include "lib/pow2.h" /* For IS_POWER_OF_2() */ +#include "lib/pslist.h" +#include "lib/pslist.h" #include "lib/random.h" #include "lib/sbool.h" #include "lib/sectoken.h" #include "lib/str.h" #include "lib/stringify.h" /* For hex_escape() */ #include "lib/tm.h" +#include "lib/tokenizer.h" #include "lib/urn.h" #include "lib/utf8.h" #include "lib/vector.h" #include "lib/vendors.h" #include "lib/walloc.h" -#include "lib/wordvec.h" #include "lib/wd.h" +#include "lib/wordvec.h" #include "lib/wq.h" #include "lib/override.h" /* Must be the last header included */ @@ -135,34 +153,12 @@ #define GUESS_REFRESH_PERIOD 86400 /**< 1 day */ #define SEARCH_ACTIVITY_TIMEOUT 120 /**< Delay before declaring idle */ +#define ORA_KEYS 2 /**< Two keys in the set */ +#define OOB_REPLY_ACK_TIMEOUT 900 /**< Timeout for OOB hit delivery */ static sectoken_gen_t *guess_stg; /**< GUESS token generator */ - -/** - * Gathered query information. - */ -struct search_request_info { - struct { - struct sha1 sha1; - gboolean matched; - } exv_sha1MAX_EXTVEC; - host_addr_t addr; /**< Reply address for OOB */ - const char *extended_query; /**< String in GGEP "XQ" */ - int exv_sha1cnt; /**< Amount of SHA1 to search for */ - size_t search_len; /**< Length of query string */ - guint32 media_types; /**< Media types from GGEP "M" */ - guint16 flags; /**< Query flags */ - guint16 port; /**< Reply port for OOB */ - unsigned oob:1; /**< Wants out-of-band hit delivery */ - unsigned secure_oob:1; /**< OOB v3 used? */ - unsigned whats_new:1; /**< This ia a "What's New?" query */ - unsigned skip_file_search:1; /**< Should we skip library searching? */ - unsigned may_oob_proxy:1; /**< Can we OOB-proxy the query? */ - unsigned partials:1; /**< Do they want partial results? */ - unsigned duplicate:1; /**< Known duplicate, with higher TTL */ - unsigned ipv6:1; /**< Do they support IPv6? */ - unsigned ipv6_only:1; /**< Do they support IPv6 only? */ -}; +static sectoken_gen_t *ora_stg; /**< OOB request ack token generator */ +static aging_table_t *ora_secure; /**< Hosts supporting secure OOB */ enum search_ctrl_magic { SEARCH_CTRL_MAGIC = 0x0add8c06 }; @@ -172,14 +168,14 @@ typedef struct search_ctrl { enum search_ctrl_magic magic; /**< Magic number */ gnet_search_t search_handle; /**< Search handle */ - guint32 id; /**< Unique ID */ + uint32 id; /**< Unique ID */ /* no more "speed" field -- use marked field now --RAM, 06/07/2003 */ const char *query; /**< The normalized search query (atom) */ const char *name; /**< The original search term (atom) */ time_t time; /**< Time when this search was started */ - GSList *muids; /**< Message UIDs of this search */ + pslist_t *muids; /**< Message UIDs of this search */ guess_t *guess; /**< GUESS query running, NULL if none */ unsigned media_type; /**< Media type filtering (0 means none) */ @@ -196,18 +192,18 @@ * Keep a record of nodes we've sent this search w/ this muid to. */ - GHashTable *sent_nodes; /**< Sent node by ip:port */ - GHashTable *sent_node_ids; /**< IDs of nodes to which we sent query */ + hset_t *sent_nodes; /**< Sent node by ip:port */ + hset_t *sent_node_ids; /**< IDs of nodes to which we sent query */ wq_event_t *new_node_wait; /**< Waiting for new node connections */ watchdog_t *activity; /**< Monitoring queries/hits activity */ cperiodic_t *reissue_ev; /**< re-issue timeout periodic event */ - guint reissue_timeout; /**< timeout per search, 0 = search stopped */ + uint reissue_timeout; /**< timeout per search, 0 = search stopped */ time_t create_time; /**< Time at which this search was created */ - guint lifetime; /**< Initial lifetime (in hours) */ - guint query_emitted; /**< # of queries emitted since last retry */ - guint32 items; /**< Items displayed in the GUI */ - guint32 kept_results; /**< Results we kept for last query */ + uint lifetime; /**< Initial lifetime (in hours) */ + uint query_emitted; /**< # of queries emitted since last retry */ + uint32 items; /**< Items displayed in the GUI */ + uint32 kept_results; /**< Results we kept for last query */ unsigned sha1_downloaded; /**< Amount of SHA1s being tracked */ /* @@ -227,8 +223,8 @@ /* * List of all searches, and of passive searches only. */ -static GSList *sl_search_ctrl; /**< All searches */ -static GSList *sl_passive_ctrl; /**< Only passive searches */ +static pslist_t *sl_search_ctrl; /**< All searches */ +static pslist_t *sl_passive_ctrl; /**< Only passive searches */ /* * Table holding all the active MUIDs for all the searches, pointing back @@ -236,31 +232,27 @@ * The keys are not atoms but directly the MUID objects allocated and held * in the search's set of MUIDs. */ -static GHashTable *search_by_muid; +static htable_t *search_by_muid; static idtable_t *search_handle_map; static query_hashvec_t *query_hashvec; -/* - * These tables are used to map the query MUIDs we relay as an ultrapeer with +/** + * This structure is used to map the query MUIDs we relay as an ultrapeer with * the corresponding search string and media type filtering requested. * * We only remember a few of them (as configured by search_muid_track_amount) * and focus on the "most active" ones, i.e. attempt to keep alive the ones * we see hits for (LRU-type caching). */ -static GHashTable *muid_to_query_map; /* MUID -> query_desc */ -static hash_list_t *query_muids; /* list of MUID, to manage LRU cache */ - -/** - * Description of a query we remember. - */ struct query_desc { + const guid_t *muid; /* The query MUID (atom) */ const char *query; /* Query string, UTF-8 canonized (atom) */ unsigned media_mask; /* The requested media mask (0 if none) */ }; -static GHashTable *sha1_to_search; /**< Downloaded SHA1 -> search handle */ +static hash_list_t *query_muids; /* hashed by MUID, to manage LRU cache */ +static htable_t *sha1_to_search; /* Downloaded SHA1 -> search handle */ /** * The legacy "What's New?" query string. @@ -273,44 +265,48 @@ static time_t search_last_whats_new; /**< When we last sent "What's New?" */ -static gboolean search_reissue_timeout_callback(gpointer data); +static bool search_reissue_timeout_callback(void *data); + +static uint +query_desc_hash(const void *key) +{ + const struct query_desc *qd = key; + + return guid_hash(qd->muid); +} + +static bool +query_desc_eq(const void *a, const void *b) +{ + const struct query_desc * const qa = a, * const qb = b; + + return guid_eq(qa->muid, qb->muid); +} static void query_muid_map_init(void) { - /* - * Because we use atoms as keys, we can use pointer_hash_func() instead - * of guid_hash(), which is more efficient. And we can use direct - * pointer comparison for keys as well. - */ - muid_to_query_map = g_hash_table_new(pointer_hash_func, NULL); - query_muids = hash_list_new(guid_hash, guid_eq); + query_muids = hash_list_new(query_desc_hash, query_desc_eq); } -static inline gboolean +static inline bool query_muid_map_head_expired(void) { - const guid_t *muid = hash_list_head(query_muids); - return muid != NULL && !route_exists_for_reply(muid, GTA_MSG_SEARCH); + struct query_desc *qd = hash_list_head(query_muids); + return qd != NULL && !route_exists_for_reply(qd->muid, GTA_MSG_SEARCH); } -static gboolean +static bool query_muid_map_remove_oldest(void) { - const guid_t *old_muid; - - old_muid = hash_list_head(query_muids); - if (old_muid) { - struct query_desc *old_qd; - - hash_list_remove(query_muids, old_muid); + struct query_desc *qd; - old_qd = g_hash_table_lookup(muid_to_query_map, old_muid); - g_hash_table_remove(muid_to_query_map, old_muid); - - atom_guid_free_null(&old_muid); - atom_str_free_null(&old_qd->query); - WFREE(old_qd); + qd = hash_list_head(query_muids); + if (qd != NULL) { + hash_list_remove(query_muids, qd); + atom_guid_free_null(&qd->muid); + atom_str_free_null(&qd->query); + WFREE(qd); return TRUE; } else { return FALSE; /* Nothing else to remove */ @@ -323,15 +319,14 @@ while (query_muid_map_remove_oldest()) continue; - gm_hash_table_destroy_null(&muid_to_query_map); hash_list_free(&query_muids); } static void query_muid_map_garbage_collect(void) { - guint removed = 0; - guint32 max; + uint removed = 0; + uint32 max; /* * When not running as an Ultrapeer, there is no need for us to track @@ -379,8 +374,11 @@ if (GNET_PROPERTY(search_muid_track_amount) > 0) { const void *orig_key; + struct query_desc qk; + + qk.muid = muid; - if (hash_list_find(query_muids, muid, &orig_key)) { + if (hash_list_find(query_muids, &qk, &orig_key)) { /* * Already know, keep the query we have, assuming the query * string and media types will be identical: MUIDs for queries @@ -394,7 +392,6 @@ } else { struct query_desc *qd; char *canonized; - const guid_t *key; /* * New query must be remembered and put at the tail of the list. @@ -402,14 +399,13 @@ WALLOC(qd); canonized = UNICODE_CANONIZE(query); + qd->muid = atom_guid_get(muid); qd->query = atom_str_get(canonized); qd->media_mask = media_types; if (canonized != query) HFREE_NULL(canonized); - key = atom_guid_get(muid); - hash_list_append(query_muids, key); - gm_hash_table_insert_const(muid_to_query_map, key, qd); + hash_list_append(query_muids, qd); } } query_muid_map_garbage_collect(); @@ -424,24 +420,27 @@ * types requested. The query string is in UTF-8 canonic form. */ static const char * -map_muid_to_query_string(const struct guid *muid, unsigned *media_mask) +map_muid_to_query_string(const guid_t *muid, unsigned *media_mask) { const void *key; + struct query_desc qk; g_assert(muid != NULL); g_assert(media_mask != NULL); /* * Relayed MUID of queries (as an ultrapeer) are stored in the "query_muids" - * hash list, whereas those of our searches are kept in search mapping + * hash list, whereas those of our searches are kept in the search mapping * table. * * This ensures that we are always able to reconstruct the query strings * for the hits we receive out of our own queries. */ - if (hash_list_find(query_muids, muid, &key)) { - struct query_desc *qd = g_hash_table_lookup(muid_to_query_map, key); + qk.muid = muid; + + if (hash_list_find(query_muids, &qk, &key)) { + const struct query_desc *qd = key; g_assert(qd != NULL); /* @@ -449,11 +448,11 @@ * longer period of time, given that we're seeing query hits. */ - hash_list_moveto_tail(query_muids, muid); /* LRU cache management */ + hash_list_moveto_tail(query_muids, qd); /* LRU cache management */ *media_mask = qd->media_mask; return qd->query; } else { - search_ctrl_t *sch = g_hash_table_lookup(search_by_muid, muid); + search_ctrl_t *sch = htable_lookup(search_by_muid, muid); if (sch != NULL && sch->query != NULL) { *media_mask = sch->media_type; return sch->query; @@ -475,36 +474,36 @@ str_t *str = str_new(sizeof buf); if (mask & SEARCH_AUDIO_TYPE) - str_cat(str, "audio"); + STR_CAT(str, "audio"); if (mask & SEARCH_VIDEO_TYPE) { if (str_len(str) != 0) str_putc(str, '/'); - str_cat(str, "video"); + STR_CAT(str, "video"); } if (mask & SEARCH_DOC_TYPE) { if (str_len(str) != 0) str_putc(str, '/'); - str_cat(str, "document"); + STR_CAT(str, "document"); } if (mask & SEARCH_IMG_TYPE) { if (str_len(str) != 0) str_putc(str, '/'); - str_cat(str, "image"); + STR_CAT(str, "image"); } if (mask & SEARCH_WIN_TYPE) { if (str_len(str) != 0) str_putc(str, '/'); - str_cat(str, "archive (win)"); + STR_CAT(str, "archive (win)"); } if (mask & SEARCH_UNIX_TYPE) { if (str_len(str) != 0) str_putc(str, '/'); - str_cat(str, "archive (unix)"); + STR_CAT(str, "archive (unix)"); } if (mask & SEARCH_TORRENT_TYPE) { if (str_len(str) != 0) str_putc(str, '/'); - str_cat(str, "torrent"); + STR_CAT(str, "torrent"); } g_strlcpy(buf, str_2c(str), sizeof buf); @@ -521,8 +520,8 @@ * * @return TRUE if query key is valid. */ -static gboolean -search_query_key_validate(const struct gnutella_node *n, const extvec_t *exv) +static bool +search_query_key_validate(const gnutella_node_t *n, const extvec_t *exv) { size_t len = ext_paylen(exv); const char *payload; @@ -544,7 +543,7 @@ * Fills valid query key into supplied security token for the given addr:port. */ void -search_query_key_generate(sectoken_t *tok, host_addr_t addr, guint16 port) +search_query_key_generate(sectoken_t *tok, host_addr_t addr, uint16 port) { if (GNET_PROPERTY(guess_server_debug) > 10) { g_debug("GUESS generating token for %s", @@ -597,8 +596,8 @@ } static void -search_fire_got_results(GSList *sch_matched, - const struct guid *muid, const gnet_results_set_t *rs) +search_fire_got_results(pslist_t *sch_matched, + const guid_t *muid, const gnet_results_set_t *rs) { g_assert(rs != NULL); @@ -629,32 +628,11 @@ *** Management of the "sent_nodes" hash table. ***/ -static guint -sent_node_hash_func(gconstpointer key) -{ - const gnet_host_t *sd = key; - - /* ensure that we've got sizeof(int) bytes of deterministic data */ - return host_addr_hash(gnet_host_get_addr(sd)) ^ - (guint32) gnet_host_get_port(sd); -} - -static int -sent_node_compare(gconstpointer a, gconstpointer b) -{ - const gnet_host_t *sa = a, *sb = b; - - return gnet_host_get_port(sa) == gnet_host_get_port(sb) && - host_addr_equal(gnet_host_get_addr(sa), gnet_host_get_addr(sb)); -} - static void -search_free_sent_node(gpointer key, - gpointer unused_value, gpointer unused_udata) +search_free_sent_node(const void *key, void *unused_udata) { - gnet_host_t *host = key; + const gnet_host_t *host = key; - (void) unused_value; (void) unused_udata; atom_host_free(host); @@ -663,35 +641,34 @@ static void search_free_sent_nodes(search_ctrl_t *sch) { - g_hash_table_foreach(sch->sent_nodes, search_free_sent_node, NULL); - gm_hash_table_destroy_null(&sch->sent_nodes); + hset_foreach(sch->sent_nodes, search_free_sent_node, NULL); + hset_free_null(&sch->sent_nodes); } static void search_reset_sent_nodes(search_ctrl_t *sch) { - search_free_sent_nodes(sch); - sch->sent_nodes = g_hash_table_new(sent_node_hash_func, sent_node_compare); + hset_foreach(sch->sent_nodes, search_free_sent_node, NULL); + hset_clear(sch->sent_nodes); } static void -search_mark_sent_to_node(search_ctrl_t *sch, gnutella_node_t *n) +search_mark_sent_to_node(search_ctrl_t *sch, const gnutella_node_t *n) { gnet_host_t sd; gnet_host_set(&sd, n->addr, n->port); - gm_hash_table_insert_const(sch->sent_nodes, - atom_host_get(&sd), uint_to_pointer(1)); + hset_insert(sch->sent_nodes, atom_host_get(&sd)); } static void search_mark_sent_to_connected_nodes(search_ctrl_t *sch) { - const GSList *sl; - struct gnutella_node *n; + const pslist_t *sl; + + PSLIST_FOREACH(node_all_gnet_nodes(), sl) { + gnutella_node_t *n = sl->data; - for (sl = node_all_nodes(); sl; sl = g_slist_next(sl)) { - n = sl->data; if (NODE_IS_WRITABLE(n)) search_mark_sent_to_node(sch, n); } @@ -707,50 +684,48 @@ *** Management of the "sent_node_ids" hash table. ***/ -static gboolean -free_node_id(gpointer key, gpointer value, gpointer unused_udata) +static void +free_node_id(const void *key, void *unused_udata) { const struct nid *node_id = key; - g_assert(key == value); (void) unused_udata; nid_unref(node_id); - return TRUE; } static void search_free_sent_node_ids(search_ctrl_t *sch) { - g_hash_table_foreach_remove(sch->sent_node_ids, free_node_id, NULL); - gm_hash_table_destroy_null(&sch->sent_node_ids); + hset_foreach(sch->sent_node_ids, free_node_id, NULL); + hset_free_null(&sch->sent_node_ids); } static void search_reset_sent_node_ids(search_ctrl_t *sch) { - search_free_sent_node_ids(sch); - sch->sent_node_ids = g_hash_table_new(nid_hash, nid_equal); + hset_foreach(sch->sent_node_ids, free_node_id, NULL); + hset_clear(sch->sent_node_ids); } static void search_mark_sent_to_node_id(search_ctrl_t *sch, const struct nid *node_id) { - if (NULL == g_hash_table_lookup(sch->sent_node_ids, node_id)) { + if (!hset_contains(sch->sent_node_ids, node_id)) { const struct nid *key = nid_ref(node_id); - gm_hash_table_insert_const(sch->sent_node_ids, key, key); + hset_insert(sch->sent_node_ids, key); } } /** * @return TRUE if we already queried the given node for the given search. */ -static gboolean +static bool search_already_sent_to_node(const search_ctrl_t *sch, const gnutella_node_t *n) { gnet_host_t sd; gnet_host_set(&sd, n->addr, n->port); - return NULL != g_hash_table_lookup(sch->sent_nodes, &sd); + return hset_contains(sch->sent_nodes, &sd); } /** @@ -781,6 +756,11 @@ g_assert(rc); if (!(SR_ATOMIZED & rc->flags)) { + if (SR_ALLOC_NAME & rc->flags) { + char *p = deconstify_char(rc->filename); + if (p != NULL) + hfree(p); + } rc->filename = NULL; } atom_str_free_null(&rc->filename); @@ -798,7 +778,7 @@ { static const gnet_results_set_t zero_rs; gnet_results_set_t *rs; - + WALLOC(rs); *rs = zero_rs; return rs; @@ -810,9 +790,9 @@ static void search_free_r_set(gnet_results_set_t *rs) { - GSList *m; + pslist_t *m; - for (m = rs->records; m; m = g_slist_next(m)) { + PSLIST_FOREACH(rs->records, m) { search_free_record(m->data); } atom_guid_free_null(&rs->guid); @@ -821,7 +801,7 @@ atom_str_free_null(&rs->query); search_free_proxies(rs); - gm_slist_free_null(&rs->records); + pslist_free_null(&rs->records); WFREE(rs); } @@ -852,7 +832,7 @@ * @param size The size of the buffer. * @return TRUE if spam was detected, FALSE if it looks alright. */ -static gboolean +static bool is_lime_xml_spam(const char * const data, size_t size) { if (size > 0) { @@ -925,18 +905,18 @@ * tolerate this but we consider "/../" and variants as evil because * it can be abused in combination with poorly written clients. */ -static gboolean +static bool is_evil_filename(const char *filename) { const char *endptr, *p = filename; char win4; - guint i; + uint i; g_assert(filename); win0 = '/'; /* Implicit by "/get/<index>/<filename>" */ - for (i = 1; i < G_N_ELEMENTS(win); i++) { + for (i = 1; i < N_ITEMS(win); i++) { wini = url_normalize_char(p, &endptr); if ('\0' == *p) break; @@ -954,7 +934,7 @@ ) { return TRUE; } - + if ('\0' == *p) break; p = endptr; @@ -967,22 +947,246 @@ return FALSE; } +#define RS_STATUS(x) { ST_ ## x, #x } + +static struct { + uint32 flag; + const char *name; +} rs_status_flags = { + RS_STATUS(SR_UDP), + RS_STATUS(BANNED_GUID), + RS_STATUS(MEDIA), + RS_STATUS(ALIEN), + RS_STATUS(GUESS), + RS_STATUS(MORPHEUS_BOGUS), + RS_STATUS(GOOD_TOKEN), + RS_STATUS(BROWSE), + RS_STATUS(LOCAL), + RS_STATUS(FW2FW), + RS_STATUS(HOSTILE), + RS_STATUS(UNREQUESTED), + RS_STATUS(EVIL), + RS_STATUS(G2), + RS_STATUS(UNUSED_4), + RS_STATUS(UNUSED_3), + RS_STATUS(UNUSED_2), + RS_STATUS(UNUSED_1), + RS_STATUS(SPAM), + RS_STATUS(TLS), + RS_STATUS(BH), + RS_STATUS(KNOWN_VENDOR), + RS_STATUS(PARSED_TRAILER), + RS_STATUS(UDP), + RS_STATUS(BOGUS), + RS_STATUS(PUSH_PROXY), + RS_STATUS(GGEP), + RS_STATUS(UPLOADED), + RS_STATUS(BUSY), + RS_STATUS(FIREWALL), +}; + +#undef RS_STATUS + /** - * Log spam reason. + * Convert result set status flags into English description. + */ +static const char * +search_rs_status_to_string(const gnet_results_set_t *rs) +{ + str_t *s = str_private(G_STRFUNC, 80); + uint i; + + str_reset(s); + + for (i = 0; i < N_ITEMS(rs_status_flags); i++) { + if (rs->status & rs_status_flagsi.flag) { + if (0 != str_len(s)) + STR_CAT(s, ", "); + str_cat(s, rs_status_flagsi.name); + } + } + + return str_2c(s); +} + +#define RC_STATUS(x) { SR_ ## x, #x } + +static struct { + uint32 flag; + const char *name; +} rc_flags = { + RC_STATUS(ALLOC_NAME), + RC_STATUS(MEDIA), + RC_STATUS(PARTIAL_HIT), + RC_STATUS(PUSH), + RC_STATUS(ATOMIZED), + RC_STATUS(PARTIAL), + RC_STATUS(OWNED), + RC_STATUS(SHARED), + RC_STATUS(SPAM), + RC_STATUS(DONT_SHOW), + RC_STATUS(IGNORED), + RC_STATUS(DOWNLOADED), +}; + +#undef RC_STATUS + +/** + * Convert result record flags into English description. + */ +static const char * +search_rc_flags_to_string(const gnet_record_t *rc) +{ + str_t *s = str_private(G_STRFUNC, 80); + uint i; + + str_reset(s); + + for (i = 0; i < N_ITEMS(rc_flags); i++) { + if (rc->flags & rc_flagsi.flag) { + if (0 != str_len(s)) + STR_CAT(s, ", "); + str_cat(s, rc_flagsi.name); + } + } + + return str_2c(s); +} + +/** + * Log query hit. + */ +static void +search_results_log(const gnutella_node_t *n, const gnet_results_set_t *rs) +{ + char buf128; + str_t *s = str_new(80); + + if (n != NULL) { + if (NODE_TALKS_G2(n)) { + g2_msg_infostr_to_buf(n->data, n->size, buf, sizeof buf); + } else { + gmsg_infostr_full_split_to_buf( + &n->header, n->data, n->size, buf, sizeof buf); + } + } else { + buf0 = '\0'; + } + + if ( + n != NULL && NODE_IS_UDP(n) && + !(host_addr_equiv(n->addr, rs->addr) && n->port == rs->port) + ) { + str_printf(s, "%s UDP=%s", + host_addr_port_to_string(rs->addr, rs->port), + host_addr_port_to_string2(n->addr, n->port)); + } else { + str_printf(s, "%s", host_addr_port_to_string(rs->addr, rs->port)); + } + + g_debug("SEARCH %s QHIT %s (%s %s, %s) %s: %u rec%s {%s}", + NULL == n ? "NULL" : NODE_IS_UDP(n) ? "UDP" : "TCP", + vendor_code_to_string(rs->vcode.u32), + str_2c(s), iso3166_country_cc(rs->country), guid_to_string(rs->guid), + buf, rs->num_recs, plural(rs->num_recs), + search_rs_status_to_string(rs)); + + str_destroy_null(&s); +} + +/** + * Log query hit records. */ static void +search_results_records_log(const gnutella_node_t *n, + const gnet_results_set_t *rs) +{ + pslist_t *sl; + uint nr = 0; + str_t *s = str_new(80); + char buf128; + + if (n != NULL) { + if (NODE_TALKS_G2(n)) { + g2_msg_infostr_to_buf(n->data, n->size, buf, sizeof buf); + } else { + gmsg_infostr_full_split_to_buf( + &n->header, n->data, n->size, buf, sizeof buf); + } + } else { + buf0 = '\0'; + } + + g_debug("SEARCH %s QHIT %s (%s) %u rec%s {%s}:", + NULL == n ? "NULL" : NODE_IS_UDP(n) ? "UDP" : "TCP", + vendor_code_to_string(rs->vcode.u32), + host_addr_port_to_string(rs->addr, rs->port), + rs->num_recs, plural(rs->num_recs), + search_rs_status_to_string(rs)); + + PSLIST_FOREACH(rs->records, sl) { + const gnet_record_t *rc = sl->data; + char *f; + size_t len; + + nr++; + + len = 1 + strlen(rc->filename); + f = halloc(len); + ascii_enforce(f, len, rc->filename); /* Safe logging */ + + if (rc->path != NULL) { + char *p; + + len = 1 + strlen(rc->path); + p = halloc(len); + ascii_enforce(p, len, rc->path); + str_printf(s, "name=\"%s\", path=\"%s\"", f, p); + hfree(p); + } else { + str_printf(s, "name=\"%s\"", f); + } + + HFREE_NULL(f); + + str_catf(s, ", size=%s", filesize_to_string(rc->size)); + + if (rc->flags & SR_PARTIAL_HIT) + str_catf(s, ", avail=%s", filesize_to_string(rc->available)); + + if (rc->sha1 != NULL) + str_catf(s, ", sha1=%s", sha1_base32(rc->sha1)); + + if (rc->tth != NULL) + str_catf(s, ", tth=%s", tth_base32(rc->tth)); + + g_debug("SEARCH REC #%u/%u: %s {%s}", + nr, rs->num_recs, str_2c(s), search_rc_flags_to_string(rc)); + } + + str_destroy_null(&s); +} + +/** + * Log spam reason. + */ +static void G_PRINTF(3, 4) search_log_spam(const gnutella_node_t *n, const gnet_results_set_t *rs, const char *reason, ...) { - char rbuf256; + char rbuf384; char buf128; if (!GNET_PROPERTY(log_spam_query_hit)) return; if (n != NULL) { - gmsg_infostr_full_split_to_buf( - &n->header, n->data, n->size, buf, sizeof buf); + if (NODE_TALKS_G2(n)) { + g2_msg_infostr_to_buf(n->data, n->size, buf, sizeof buf); + } else { + gmsg_infostr_full_split_to_buf( + &n->header, n->data, n->size, buf, sizeof buf); + } } else { buf0 = '\0'; } @@ -996,42 +1200,62 @@ rbuf1 = ' '; off = 2; } - gm_vsnprintf(&rbufoff, sizeof rbuf - off, reason, args); + str_vbprintf(&rbufoff, sizeof rbuf - off, reason, args); va_end(args); } else { rbuf0 = '\0'; } - g_debug("SPAM QHIT %s %s %s%s", vendor_code_to_string(rs->vcode.u32), + g_debug("SPAM QHIT %s (%s) %s %s%s", + vendor_code_to_string(rs->vcode.u32), + host_addr_port_to_string(rs->addr, rs->port), NULL == n ? "==>" : node_infostr(n), buf, rbuf); } +static inline void +search_results_set_spam(gnet_results_set_t *rs, unsigned flag) +{ + rs->status |= ST_SPAM; /* Indicates that set carries SPAM */ + rs->spam |= flag; +} + static void -search_results_identify_dupes(const gnutella_node_t *n, gnet_results_set_t *rs) +search_results_identify_dupes(const gnutella_node_t *n, gnet_results_set_t *rs, + hostiles_flags_t *hostile) { - GHashTable *ht = g_hash_table_new(pointer_hash_func, NULL); - GSList *sl; + htable_t *ht = htable_create(HASH_KEY_SELF, 0); + pslist_t *sl; unsigned dups = 0; + /* + * Since we fake the file indices for G2 hits, skip the file index tests! + */ + + if (ST_G2 & rs->status) + goto sha1_check; + /* Look for identical file index */ - GM_SLIST_FOREACH(rs->records, sl) { + PSLIST_FOREACH(rs->records, sl) { gnet_record_t *rc; const void *key; rc = sl->data; key = ulong_to_pointer(rc->file_index); - if (g_hash_table_lookup(ht, key)) { - rs->status |= ST_DUP_SPAM; + if (htable_contains(ht, key)) { + search_results_set_spam(rs, SPAM_F_DUP); + *hostile |= HSTL_DUP_INDEX; rc->flags |= SR_SPAM; dups++; search_log_spam(n, rs, "duplicate file index %u", rc->file_index); } else { - gm_hash_table_insert_const(ht, key, rc); + htable_insert(ht, key, rc); } } +sha1_check: + /* Look for identical SHA-1 */ - GM_SLIST_FOREACH(rs->records, sl) { + PSLIST_FOREACH(rs->records, sl) { gnet_record_t *rc; const void *key; @@ -1040,32 +1264,33 @@ if (NULL == key) continue; - if (g_hash_table_lookup(ht, key)) { - rs->status |= ST_DUP_SPAM; + if (htable_contains(ht, key)) { + search_results_set_spam(rs, SPAM_F_DUP); + *hostile |= HSTL_DUP_SHA1; rc->flags |= SR_SPAM; dups++; search_log_spam(n, rs, "duplicate SHA1 %s", sha1_base32(rc->sha1)); } else { - gm_hash_table_insert_const(ht, key, rc); + htable_insert(ht, key, rc); } } - if (rs->status & ST_DUP_SPAM) - gnet_stats_count_general(GNR_SPAM_DUP_HITS, 1); + if (rs->spam & SPAM_F_DUP) + gnet_stats_inc_general(GNR_SPAM_DUP_HITS); - g_hash_table_destroy(ht); + htable_free_null(&ht); if (dups != 0) { - search_log_spam(n, rs, "--> %u duplicate%s", - dups, 1 == dups ? "" : "s"); + search_log_spam(n, rs, "--> %u duplicate%s over %u item%s", + dups, plural(dups), rs->num_recs, plural(rs->num_recs)); } } -static gboolean -is_odd_guid(const struct guid *guid) +static bool +is_odd_guid(const guid_t *guid) { - size_t i = G_N_ELEMENTS(guid->v); - + size_t i = N_ITEMS(guid->v); + do { unsigned char c = guid->v--i; @@ -1075,7 +1300,7 @@ return TRUE; } -static gboolean +static bool is_lime_return_path(const extvec_t *e) { const char *id = ext_ggep_id_str(e); @@ -1108,16 +1333,45 @@ * Mark fake spam. */ static void -search_results_mark_fake_spam(gnet_results_set_t *rs) +search_results_mark_fake_spam(gnet_results_set_t *rs, hostiles_flags_t *hostile) { - if (!(rs->status & ST_FAKE_SPAM)) { + if (!(rs->spam & SPAM_F_FAKE)) { /* Count only once per result set */ - gnet_stats_count_general(GNR_SPAM_FAKE_HITS, 1); - rs->status |= ST_FAKE_SPAM; + gnet_stats_inc_general(GNR_SPAM_FAKE_HITS); + search_results_set_spam(rs, SPAM_F_FAKE); + *hostile |= HSTL_FAKE_SPAM; } } -static gboolean +/** + * Mark close filename spam. + */ +static void +search_results_mark_close_filename_spam( + const gnutella_node_t *n, + gnet_results_set_t *rs, gnet_record_t *rc, hostiles_flags_t *hostile) +{ + search_results_mark_fake_spam(rs, hostile); + + if (GNET_PROPERTY(log_spam_query_hit)) { + char *f; + size_t len; + + len = 1 + strlen(rc->filename); + f = halloc(len); + ascii_enforce(f, len, rc->filename); + + search_log_spam(n, rs, "filename \"%s\" similar to query \"%s\"", + f, rs->query); + + hfree(f); + } + + rc->flags |= SR_SPAM; + *hostile |= HSTL_CLOSE_FILENAME; +} + +static bool is_evil_timestamp(time_t t) { switch (t) { @@ -1129,7 +1383,7 @@ return FALSE; } -static inline gboolean +static inline bool search_results_from_spammer(const gnet_results_set_t *rs) { /* @@ -1137,11 +1391,10 @@ * sent by innocent peers, */ - return 0 != - ((ST_SPAM & ~(ST_URN_SPAM | ST_NAME_SPAM | ST_DUP_SPAM)) & rs->status); + return 0 != (rs->spam & ~(SPAM_F_URN | SPAM_F_NAME | SPAM_F_DUP)); } -static inline gboolean +static inline bool search_results_from_country(const gnet_results_set_t *rs, const char *cc) { return 0 == strcmp(cc, iso3166_country_cc(rs->country)); @@ -1156,16 +1409,57 @@ * @attention * The filename must be valid UTF-8, a precondition for canonization. */ -static gboolean +static bool search_filename_similar(const char *filename, const char *query) { char *filename_canonic; - gboolean result; + bool result; + size_t qlen = strlen(query); + size_t flen; + const char *ext; filename_canonic = UNICODE_CANONIZE(filename); + flen = strlen(filename_canonic); + ext = strrchr(filename_canonic, ' '); /* Last word */ result = NULL != is_strprefix(filename_canonic, query); + if (!result && ext != NULL) { + size_t len = ptr_diff(ext, filename_canonic); + + /* Look before the extension */ + + if (len > qlen) { + const char *base = ext - qlen; + result = NULL != is_strprefix(base, query); + } + } + + /* + * Avoid false positives: + * + * - if the query string is small (less than 6 chars) or has only 1 word, + * then it must represent at least 50% of the results to be a "hit". + * + * - otherwise, the query string must be at least 85% of the results. + */ + + if (result) { + double ratio = 0.85; + + if (ext != NULL) + flen -= strlen(ext); /* Remove extension chars */ + + if (0 == flen) + flen = 1; + + if (qlen <= 6 || NULL == strchr(query, ' ')) + ratio = 0.50; + + if (qlen / (double) flen < ratio) + result = FALSE; /* Not enough chars overall */ + } + if (filename_canonic != filename) hfree(filename_canonic); @@ -1173,12 +1467,14 @@ } static void -search_results_identify_spam(const gnutella_node_t *n, gnet_results_set_t *rs) +search_results_identify_spam(const gnutella_node_t *n, gnet_results_set_t *rs, + hostiles_flags_t *hostile) { - const GSList *sl; - guint8 has_ct = 0, has_tth = 0, has_xml = 0, expected_xml = 0; + const pslist_t *sl; + uint8 has_ct = 0, has_tth = 0, has_xml = 0, expected_xml = 0; + bool logged = FALSE; - GM_SLIST_FOREACH(rs->records, sl) { + PSLIST_FOREACH(rs->records, sl) { gnet_record_t *rc = sl->data; unsigned n_alt; @@ -1188,16 +1484,21 @@ /* * Avoid costly check if already marked as spam. */ - } else if ((guint32)-1 == rc->file_index) { + } else if ((uint32)-1 == rc->file_index) { /* * Some spammers get this wrong but some version of LimeWire * start counting at zero despite this being a special wildcard */ rc->flags |= SR_SPAM; + *hostile |= HSTL_BAD_FILE_INDEX; + search_log_spam(n, rs, "file index set to -1"); + logged = TRUE; } else if (!rc->file_index && T_GTKG == rs->vcode.u32) { - search_results_mark_fake_spam(rs); + search_results_mark_fake_spam(rs, hostile); search_log_spam(n, rs, "hit with invalid file index"); + logged = TRUE; rc->flags |= SR_SPAM; + *hostile |= HSTL_BAD_FILE_INDEX | HSTL_GTKG; } else if ( T_GTKG == rs->vcode.u32 && ( @@ -1205,61 +1506,81 @@ !guid_is_gtkg(rs->guid, NULL, NULL, NULL) ) ) { - search_results_mark_fake_spam(rs); + search_results_mark_fake_spam(rs, hostile); search_log_spam(n, rs, "hit with %s", NULL == rs->version ? "no version indication" : "bad GUID"); + logged = TRUE; rc->flags |= SR_SPAM; + *hostile |= HSTL_GTKG | + (NULL == rs->version ? + HSTL_NO_GTKG_VERSION : HSTL_BAD_GTKG_GUID); } else if (n_alt > 16 || (T_LIME == rs->vcode.u32 && n_alt > 10)) { - search_results_mark_fake_spam(rs); + search_results_mark_fake_spam(rs, hostile); search_log_spam(n, rs, "hit with %u alt-locs", n_alt); + logged = TRUE; rc->flags |= SR_SPAM; + *hostile |= HSTL_MANY_ALT_LOCS; } else if (rc->sha1 && spam_sha1_check(rc->sha1)) { search_log_spam(n, rs, "URN %s", sha1_base32(rc->sha1)); - rs->status |= ST_URN_SPAM; + logged = TRUE; + search_results_set_spam(rs, SPAM_F_URN); + *hostile |= HSTL_URN_SPAM; rc->flags |= SR_SPAM; - gnet_stats_count_general(GNR_SPAM_SHA1_HITS, 1); + gnet_stats_inc_general(GNR_SPAM_SHA1_HITS); } else if ( T_LIME == rs->vcode.u32 && is_evil_timestamp(rc->create_time) ) { - search_results_mark_fake_spam(rs); + search_results_mark_fake_spam(rs, hostile); search_log_spam(n, rs, "evil timestamp 0x%lx", (unsigned long) rc->create_time); + logged = TRUE; rc->flags |= SR_SPAM; + *hostile |= HSTL_EVIL_TIMESTAMP; } else if (spam_check_filename_size(rc->filename, rc->size)) { search_log_spam(n, rs, "SPAM filename/size hit"); - rs->status |= ST_NAME_SPAM; + logged = TRUE; + search_results_set_spam(rs, SPAM_F_NAME); + *hostile |= HSTL_NAME_SPAM; rc->flags |= SR_SPAM; - gnet_stats_count_general(GNR_SPAM_NAME_HITS, 1); + gnet_stats_inc_general(GNR_SPAM_NAME_HITS); } else if ( rc->xml && is_lime_xml_spam(rc->xml, strlen(rc->xml)) ) { search_log_spam(n, rs, "LIME XML SPAM"); - rs->status |= ST_URL_SPAM; + logged = TRUE; + search_results_set_spam(rs, SPAM_F_URL); + *hostile |= HSTL_URL_SPAM; rc->flags |= SR_SPAM; } else if (is_evil_filename(rc->filename)) { search_log_spam(n, rs, "evil filename"); + logged = TRUE; rs->status |= ST_EVIL; + *hostile |= HSTL_EVIL_FILENAME; rc->flags |= SR_IGNORED; } else if ( T_LIME == rs->vcode.u32 && !utf8_is_valid_string(rc->filename) ) { /* LimeWire is a program known to generate valid UTF-8 strings */ - search_results_mark_fake_spam(rs); + search_results_mark_fake_spam(rs, hostile); search_log_spam(n, rs, "invalid UTF-8 filename"); + logged = TRUE; rc->flags |= SR_SPAM; + *hostile |= HSTL_BAD_UTF8; } else if ( T_LIME == rs->vcode.u32 && rs->query != NULL && 0 == strcmp(rs->query, WHATS_NEW_QUERY) && is_strcaseprefix(rc->filename, WHATS_NEW_QUERY) ) { /* All genuine LimeWire nodes understand "What's New?" queries */ - search_results_mark_fake_spam(rs); + search_results_mark_fake_spam(rs, hostile); search_log_spam(n, rs, "filename mimics query \"%s\"", WHATS_NEW_QUERY); + logged = TRUE; rc->flags |= SR_SPAM; + *hostile |= HSTL_NO_WHATS_NEW; } has_tth |= NULL != rc->tth; @@ -1327,28 +1648,39 @@ search_filename_similar(rc->filename, rs->query) ) ) { - search_results_mark_fake_spam(rs); - search_log_spam(n, rs, "filename similar to query \"%s\"", - rs->query); - rc->flags |= SR_SPAM; + search_results_mark_close_filename_spam(n, rs, rc, hostile); + logged = TRUE; } } /* + * Popular G2 spam. + */ + + if ( + (ST_G2 & rs->status) && rs->query != NULL && + search_filename_similar(rc->filename, rs->query) + ) { + search_results_mark_close_filename_spam(n, rs, rc, hostile); + logged = TRUE; + } + + /* * If we already determined that these results come from a spammer, * there's no need to inspect the other records. */ if (search_results_from_spammer(rs)) { - search_log_spam(NULL, rs, "hit from spammer"); + search_log_spam(logged ? NULL : n, rs, "hit from spammer"); goto flag_all; } } if (!is_vendor_acceptable(rs->vcode)) { /* A proper vendor code is mandatory */ - search_results_mark_fake_spam(rs); + search_results_mark_fake_spam(rs, hostile); search_log_spam(n, rs, "improper vendor code"); + *hostile |= HSTL_BAD_VENDOR_CODE; } else if (expected_xml && !has_xml) { /** * LimeWire adds XML metadata for AVI and MPG files @@ -1356,8 +1688,9 @@ * Make an exception for Cabos popular in Japan. */ if (!search_results_from_country(rs, "jp")) { - search_results_mark_fake_spam(rs); + search_results_mark_fake_spam(rs, hostile); search_log_spam(n, rs, "was expecting XML"); + *hostile |= HSTL_MISSING_XML; } } else if ( T_LIME == rs->vcode.u32 && @@ -1369,19 +1702,24 @@ * Cabos frequently fails to add timestamps for unknown reasons. * Make an exception for Cabos popular in Japan. */ - search_results_mark_fake_spam(rs); + search_results_mark_fake_spam(rs, hostile); search_log_spam(n, rs, "no CT"); + *hostile |= HSTL_NO_CREATE_TIME; } else if (is_odd_guid(rs->guid)) { - search_results_mark_fake_spam(rs); + search_results_mark_fake_spam(rs, hostile); search_log_spam(n, rs, "odd GUID %s", guid_hex_str(rs->guid)); + *hostile |= HSTL_ODD_GUID; } else if (guid_is_banned(rs->guid)) { rs->status |= ST_BANNED_GUID; + *hostile |= HSTL_BANNED_GUID; search_log_spam(n, rs, "banned GUID %s", guid_hex_str(rs->guid)); - } else if (!(ST_SPAM & rs->status)) { + } else if (0 == ((ST_SPAM | ST_BROWSE) & rs->status)) { /* * Avoid costly checks if already marked as spam. + * Skip duplicate checks for host browsing since they may share files + * with hard links and different names, or even true duplicates. */ - search_results_identify_dupes(n, rs); + search_results_identify_dupes(n, rs, hostile); } if (search_results_from_spammer(rs)) { @@ -1396,162 +1734,12 @@ * Mark all records of the set as spam. */ - GM_SLIST_FOREACH(rs->records, sl) { + PSLIST_FOREACH(rs->records, sl) { gnet_record_t *rc = sl->data; rc->flags |= SR_SPAM; } } -/* - * OOB reply acks (aka "ora") are kept around to implement OOBv3: we need to - * remember the random token we sent when claiming the results, to make sure - * that we only get the hits when we actually claimed them, and that we only - * get the ones we claimed. - */ - -static hash_list_t *oob_reply_acks; - -#define OOB_REPLY_ACK_TIMEOUT 120 /* 2 minutes */ - -struct ora { - const struct guid *muid; /* GUID atom */ - time_t sent; - host_addr_t addr; - guint32 token; - guint16 port; -}; - -static struct ora * -ora_alloc(const struct guid *muid, const host_addr_t addr, guint16 port, - guint32 token) -{ - struct ora *ora; - - WALLOC(ora); - ora->muid = atom_guid_get(muid); - ora->addr = addr; - ora->port = port; - ora->token = token; - return ora; -} - -static void -ora_free(struct ora **ora_ptr) -{ - struct ora *ora; - - ora = *ora_ptr; - if (ora) { - atom_guid_free_null(&ora->muid); - WFREE(ora); - *ora_ptr = NULL; - } -} - -static guint -ora_hash(gconstpointer key) -{ - const struct ora *ora = key; - - return ora->token ^ - guid_hash(ora->muid) ^ - host_addr_hash(ora->addr) ^ - (((guint32) ora->port << 16) | ora->port); -} - -static int -ora_eq(gconstpointer v1, gconstpointer v2) -{ - const struct ora *a = v1, *b = v2; - - return a->token == b->token && - a->port == b->port && - host_addr_equal(a->addr, b->addr) && - guid_eq(a->muid, b->muid); -} - -static struct ora * -ora_lookup(const struct guid *muid, - const host_addr_t addr, guint16 port, guint32 token) -{ - struct ora ora; - gconstpointer key; - - ora.muid = muid; - ora.sent = 0; - ora.addr = addr; - ora.port = port; - ora.token = token; - - if (hash_list_find(oob_reply_acks, &ora, &key)) { - return deconstify_gpointer(key); - } - return NULL; -} - -static gboolean -oob_reply_acks_remove_oldest(void) -{ - struct ora *ora; - - ora = hash_list_head(oob_reply_acks); - if (ora) { - hash_list_remove(oob_reply_acks, ora); - ora_free(&ora); - return TRUE; - } - return FALSE; -} - -static void -oob_reply_acks_garbage_collect(void) -{ - time_t now = tm_time(); - - do { - struct ora *ora; - - ora = hash_list_head(oob_reply_acks); - if (!ora || delta_time(now, ora->sent) <= OOB_REPLY_ACK_TIMEOUT) - break; - } while (oob_reply_acks_remove_oldest()); -} - -static void -oob_reply_acks_init(void) -{ - oob_reply_acks = hash_list_new(ora_hash, ora_eq); -} - -static void -oob_reply_acks_close(void) -{ - while (oob_reply_acks_remove_oldest()) { - continue; - } - hash_list_free(&oob_reply_acks); -} - -static void -oob_reply_ack_record(const struct guid *muid, - const host_addr_t addr, guint16 port, guint32 token) -{ - struct ora *ora; - - g_assert(muid); - - ora = ora_lookup(muid, addr, port, token); - if (ora) { - /* Move to tail of list */ - hash_list_moveto_tail(oob_reply_acks, ora); - } else { - ora = ora_alloc(muid, addr, port, token); - hash_list_append(oob_reply_acks, ora); - } - ora->sent = tm_time(); - oob_reply_acks_garbage_collect(); -} - /** * Check whether we have explicitly claimed some OOB hits. * @@ -1559,26 +1747,22 @@ * @param addr the address from which the results come via UDP * @param port the port from which results come */ -static gboolean -search_results_are_requested(const struct guid *muid, - const host_addr_t addr, guint16 port, guint32 token) -{ - struct ora *ora; - - ora = ora_lookup(muid, addr, port, token); - if (ora) { - if (delta_time(tm_time(), ora->sent) <= OOB_REPLY_ACK_TIMEOUT) - return TRUE; +static bool +search_results_are_requested(const guid_t *muid, + const host_addr_t addr, uint16 port, uint32 token) +{ + sectoken_t tok; + gnet_host_t host; - /* - * Entry expired, we're no longer interested. - */ + STATIC_ASSERT(sizeof(uint32) == sizeof tok.v); - hash_list_remove(oob_reply_acks, ora); - ora_free(&ora); - /* FALL THROUGH */ - } - return FALSE; + gnet_host_set(&host, addr, port); + if (!aging_lookup(ora_secure, &host)) + return TRUE; /* Host not supporting secure OOB */ + + poke_be32(tok.v, token); + return sectoken_is_valid_with_context(ora_stg, + &tok, addr, port, muid, GUID_RAW_SIZE); } /** @@ -1683,7 +1867,7 @@ * Add synthetized push-proxy to the results. */ static void -search_add_push_proxy(gnet_results_set_t *rs, host_addr_t addr, guint16 port) +search_add_push_proxy(gnet_results_set_t *rs, host_addr_t addr, uint16 port) { if (NULL == rs->proxies) { rs->proxies = gnet_host_vec_alloc(); @@ -1694,20 +1878,45 @@ } /** + * Build a string atom representing the GGEP version information. + */ +static const char * +search_results_version(const struct ggep_gtkgv *vi) +{ + version_ext_t ver; + + ZERO(&ver); + ver.version.major = vi->major; + ver.version.minor = vi->minor; + ver.version.patchlevel = vi->patch; + ver.version.tag = vi->revchar; + ver.version.build = vi->build; + if (ver.version.tag) + ver.version.timestamp = vi->release; + ver.commit_len = vi->commit_len; + ver.commit = vi->commit; /* Struct copy */ + ver.osname = vi->osname; /* Static string */ + ver.dirty = vi->dirty; + + return atom_str_get(version_ext_str(&ver, TRUE)); +} + +/** * Compute status bits, decompile trailer info, if present. * * @return TRUE if there were errors and the packet should be dropped. */ -static gboolean +static bool search_results_handle_trailer(const gnutella_node_t *n, - gnet_results_set_t *rs, const char *trailer, size_t trailer_size) + gnet_results_set_t *rs, const char *trailer, size_t trailer_size, + hostiles_flags_t *hostile) { - guint8 open_size, open_parsing_size, enabler_mask, flags_mask; + uint8 open_size, open_parsing_size, enabler_mask, flags_mask; const char *vendor; - guint32 token; - gboolean has_token; + uint32 token; + bool has_token; host_addr_t ipv6_addr; - gboolean has_ipv6_addr; + bool has_ipv6_addr; if (!trailer || trailer_size < 7) return FALSE; @@ -1726,14 +1935,14 @@ if (GNET_PROPERTY(search_debug)) { g_warning("trailer from %s is too small (%u byte%s) " "for open size field", vendor, - (unsigned) trailer_size, 1 == trailer_size ? "" : "s"); + (unsigned) trailer_size, plural(trailer_size)); } return TRUE; } else if (open_size == 4) { open_parsing_size = 2; /* We ignore XML data size */ } - if (T_NAPS == rs->vcode.u32) { + if (T_NAPS == rs->vcode.u32) { /* * NapShare has a one-byte only flag: no enabler, just setters. * --RAM, 17/12/2001 @@ -1745,11 +1954,10 @@ } } else { if (open_parsing_size == 2) { - guint8 status = enabler_mask & flags_mask; + uint8 status = enabler_mask & flags_mask; if (status & 0x04) rs->status |= ST_BUSY; if (status & 0x01) rs->status |= ST_FIREWALL; if (status & 0x08) rs->status |= ST_UPLOADED; - if (status & 0x08) rs->status |= ST_UPLOADED; if (status & 0x20) rs->status |= ST_GGEP; rs->status |= ST_PARSED_TRAILER; } else if (rs->status & ST_KNOWN_VENDOR) { @@ -1759,7 +1967,7 @@ } else { if (GNET_PROPERTY(search_debug) > 1) g_warning("ignoring %d open data byte%s from %s", - open_size, open_size == 1 ? "" : "s", vendor); + open_size, plural(open_size), vendor); } } @@ -1772,7 +1980,7 @@ size_t privlen; int exvcnt = 0; extvec_t exvMAX_EXTVEC; - gboolean seen_ggep = FALSE; + bool seen_ggep = FALSE; gnet_host_vec_t *hvec = NULL; /* For GGEP "PUSH" */ int i; @@ -1872,22 +2080,7 @@ ret = ggept_gtkgv_extract(e, &vi); if (ret == GGEP_OK) { - version_ext_t ver; - - ZERO(&ver); - ver.version.major = vi.major; - ver.version.minor = vi.minor; - ver.version.patchlevel = vi.patch; - ver.version.tag = vi.revchar; - ver.version.build = vi.build; - if (ver.version.tag) - ver.version.timestamp = vi.release; - ver.commit_len = vi.commit_len; - ver.commit = vi.commit; /* Struct copy */ - ver.osname = vi.osname; /* Static string */ - ver.dirty = vi.dirty; - - rs->version = atom_str_get(version_ext_str(&ver, TRUE)); + rs->version = search_results_version(&vi); } else if (ret == GGEP_INVALID) { search_log_bad_ggep(n, e, vendor); } @@ -1943,7 +2136,7 @@ /* FIXME: Add the XML data to the next best record. * Maybe better to all? It's just an atom. */ - rc = rs->records ? rs->records->data : NULL; + rc = rs->records ? rs->records->data : NULL; if (rc && !rc->xml && paylen > 0) { char buf4096; @@ -1966,7 +2159,7 @@ T_LIME != rs->vcode.u32 && 0 == rs->hops && is_lime_return_path(e) ) { - search_results_mark_fake_spam(rs); + search_results_mark_fake_spam(rs, hostile); } break; default: @@ -1997,7 +2190,8 @@ ext_reset(exv, MAX_EXTVEC); } else { if (is_lime_xml_spam(trailer, trailer_size)) { - rs->status |= ST_URL_SPAM; + search_results_set_spam(rs, SPAM_F_URL); + *hostile |= HSTL_URL_SPAM; } } @@ -2009,7 +2203,10 @@ */ if (0 == rs->hops && (ST_UDP & rs->status)) { - const struct guid *muid = gnutella_header_get_muid(&n->header); + const guid_t *muid = gnutella_header_get_muid(&n->header); + + if (!has_token) + token = 0; if (search_results_are_requested(muid, n->addr, n->port, token)) { if (has_token) { @@ -2018,15 +2215,43 @@ /* We can send PUSH requests directly, so add it as push proxy. */ search_add_push_proxy(rs, n->addr, n->port); } else { - rs->status |= ST_UNREQUESTED | ST_FAKE_SPAM; + rs->status |= ST_UNREQUESTED; + /* Most probably fake since it came unrequested */ + search_results_set_spam(rs, SPAM_F_FAKE); /* Count only as unrequested, not as fake spam */ - gnet_stats_count_general(GNR_UNREQUESTED_OOB_HITS, 1); + gnet_stats_inc_general(GNR_UNREQUESTED_OOB_HITS); + *hostile |= HSTL_OOB; - if (GNET_PROPERTY(search_debug) > 1) { - g_debug("received unrequested %squery hit from %s", + if ( + GNET_PROPERTY(search_debug) > 1 || + GNET_PROPERTY(secure_oob_debug) + ) { + char buf9; + bin_to_hex_buf(&token, sizeof token, buf, sizeof buf); + g_debug("OOB received unrequested %squery hit #%s " + "from %s%s%s %s", guess_is_search_muid(muid) ? "GUESS " : "", - node_infostr(n)); + guid_hex_str(muid), node_infostr(n), + has_token ? ", wrong token=0x" : ", no token", + has_token ? buf : "", + vendor_code_to_string(rs->vcode.u32)); + } + } + + /* If we have a token and did not mark hit as hostile, check source */ + + if ( + ((ST_GOOD_TOKEN | ST_HOSTILE) & rs->status) == ST_GOOD_TOKEN && + hostiles_is_bad(n->addr) + ) { + if (GNET_PROPERTY(search_debug) > 1) { + hostiles_flags_t flags = hostiles_check(n->addr); + g_debug("dropping UDP query hit from secure OOB: " + "hostile IP %s (%s)", + host_addr_to_string(n->addr), + hostiles_flags_to_string(flags)); } + rs->status |= ST_HOSTILE; } } @@ -2039,7 +2264,7 @@ rs->port > 0 && is_host_addr(ipv6_addr) && settings_running_ipv6() && - !hostiles_check(ipv6_addr) + !hostiles_is_bad(ipv6_addr) ) { search_add_push_proxy(rs, ipv6_addr, rs->port); } @@ -2052,22 +2277,22 @@ * successfully. */ static void -search_results_postprocess(const gnutella_node_t *n, gnet_results_set_t *rs) +search_results_postprocess(const gnutella_node_t *n, gnet_results_set_t *rs, + const guid_t *muid, hostiles_flags_t *hostile) { /* * Hits relayed through UDP are necessarily a response to a GUESS query. */ if (1 == rs->hops && (ST_UDP & rs->status)) { - const struct guid *muid = gnutella_header_get_muid(&n->header); - if (guess_is_search_muid(muid)) { /* * The relaying ultrapeer is necessarily a push-proxy for the node. */ search_add_push_proxy(rs, n->addr, n->port); } else { - search_results_mark_fake_spam(rs); + search_results_mark_fake_spam(rs, hostile); + *hostile |= HSTL_UDP_GUESS; if (GNET_PROPERTY(search_debug) > 1) { g_debug("received non-GUESS UDP query hit with hops=1 from %s", @@ -2105,79 +2330,164 @@ } } } - + /** - * Parse Query Hit and extract the embedded records, plus the optional - * trailing Query Hit Descritor (QHD). + * Decode LimeWire's encoding of the available intervals in the file, held + * in the "PRi" extension they are using to encode the ranges as numbers. * - * @returns a structure describing the whole result set, or NULL if we - * were unable to parse it properly. + * Numbers are taken from a binary tree starting at 1 and spanning as deep as + * necessary to have at least enough leaves to cover all the 1 KiB blocks of + * the file. + * + * @param n the node sending us the results with partial file (for logging) + * @param e the GGEP "PRi" extension, for i = 1..4 + * @param size the total file size + * + * @return the size encoded by the intervals of the extension `e'. */ -static G_GNUC_HOT gnet_results_set_t * -get_results_set(gnutella_node_t *n, gboolean browse) +static filesize_t +lime_range_decode(const gnutella_node_t *n, const extvec_t *e, filesize_t size) { - gnet_results_set_t *rs; - char *endptr, *s, *tag; - guint32 nr = 0; - guint32 size, idx, taglen; - str_t *info; - unsigned sha1_errors = 0; - unsigned alt_errors = 0; - unsigned alt_without_hash = 0; - char *trailer = NULL; - gboolean seen_ggep_h = FALSE; - gboolean seen_ggep_alt = FALSE; - gboolean seen_ggep_alt6 = FALSE; - gboolean seen_bitprint = FALSE; - gboolean multiple_sha1 = FALSE; - gboolean multiple_alt = FALSE; - gboolean tag_has_nul = FALSE; - const char *vendor = NULL; - const char *badmsg = NULL; - unsigned media_mask = 0; - const struct guid *muid = gnutella_header_get_muid(&n->header); + int i; + size_t len; - /* We shall try to detect malformed packets as best as we can */ - if (n->size < 27) { - /* packet too small 11 header, 16 GUID min */ - g_warning("get_results_set(): given too small a packet (%d bytes)", - n->size); - gnet_stats_count_dropped(n, MSG_DROP_TOO_SMALL); - return NULL; - } + switch (e->ext_token) { + case EXT_T_GGEP_PR1: i = 1; break; /* 1-byte values */ + case EXT_T_GGEP_PR2: i = 2; break; /* 2-byte values */ + case EXT_T_GGEP_PR3: i = 3; break; /* 3-byte values */ + case EXT_T_GGEP_PR4: i = 4; break; /* 4-byte values */ + default: + g_soft_assert(FALSE); + return 0; + } + + if (size < 1024) + return size; + + len = ext_paylen(e); + if (0 != len % i) { + search_log_bad_ggep(n, e, NULL); + return 0; + } else { + const uint8 *p = ext_payload(e); + unsigned j; + filesize_t leaves, power, result = 0, nodemax; - info = str_new(80); + leaves = size >> 10; /* # of leaves (1 KiB blocks) in the tree */ + if (0 != size % 1024) + leaves++; - rs = search_new_r_set(); - rs->stamp = tm_time(); - rs->country = ISO3166_INVALID; + /* + * "power" indicates the starting index of the last row of the + * binary tree spanned by 1: + * + * 1 + * / \ + * 2 3 + * / \ / \ + * power -> 4 5 6 7 (4 leaves) + * : : : : + * file block numbers -> 0 1 2 3 (1 KiB each) + * + * "power" is the first power of 2 spanning the leaves of the tree. + * Here, with 4 leaves, we can represent files of at most 4 blocks + * of 1 KiB, i.e ranging from 0 bytes to 4 KiB. + * + * Hence, "power" is the smallest power of 2 such that leaves <= power. + * + * The maximum node ID, "nodemax" is 7, the last number before + * going to the next power of 2 (next row, if we had one). However, + * if we have only 3 leaves, then "nodemax" is 6: we have to + * substract "power - leaves" to "2 * power -1" to get the proper + * maximum ID. + */ - rs->ttl = gnutella_header_get_ttl(&n->header); - rs->hops = gnutella_header_get_hops(&n->header); + if (IS_POWER_OF_2(leaves)) { + power = leaves; + } else { + power = (uint64) 1 << (1 + highest_bit_set64(leaves)); + } + g_assert(leaves <= power); - if (!browse) { - g_assert(rs->hops > 0); - rs->hops--; /* route_message() increased hop count by 1 */ - } + nodemax = 2 * power - 1 - (power - leaves); - /* Transfer the Query Hit info to our internal results_set struct */ + /* + * Decompile big-endian node numbers (total of len / i) + */ - { - const gnutella_search_results_t *r = cast_to_gpointer(n->data); + for (j = 0; j < len; j += i) { + int depth, k; + filesize_t node; /* The node ID in the tree */ + filesize_t start, end; /* Block numbers in the file */ - rs->num_recs = gnutella_search_results_get_num_recs(r); - rs->addr = host_addr_get_ipv4(gnutella_search_results_get_host_ip(r)); - rs->port = gnutella_search_results_get_host_port(r); - rs->speed = gnutella_search_results_get_host_speed(r); - rs->last_hop = n->addr; + /* Read node #j as a big-endian number over i bytes */ - /* Now come the result set, and the servent ID will close the packet */ + for (node = 0, k = 0; k < i; k++) { + node <<= 8; + node |= pj + k & 0xff; + } - STATIC_ASSERT(11 == sizeof *r); - s = cast_to_gpointer(&r1); /* Start of the records */ - endptr = &sn->size - 11 - 16; /* End of records, less header, GUID */ + /* + * Determine the start and end indices of the blocks from the file. + */ + + if (node < 1 || node > nodemax) + continue; /* Invalid node number */ + + if (1 == node) + return size; /* 1 is the root of the tree, we're done! */ + + depth = 0; + while (node < power) { + depth++; + node <<= 1; + } + + if (node > nodemax) + continue; + + start = node - power; + end = start + ((uint64) 1 << depth) - 1; + + /* Leaves may not cover whole depth, therefore adjust */ + end = MIN(end, nodemax - power); + + result += 1024 * (end - start + 1); + } + + return result; } + g_assert_not_reached(); +} + +/** + * Cleanup the result record. + */ +static void +search_record_cleanup(gnet_record_t *rc) +{ + /* + * If the hit is flagged as partial, yet the remote server has 100% of + * the file, clear the partial indication. + */ + + if (rc->available >= rc->size) { + rc->available = 0; + rc->flags &= ~SR_PARTIAL_HIT; + } +} +/** + * Perform address sanity check on result set and set flags accordingly. + * + * @param rs the result set being constructed + * @param n the node from which the hit comes + * @param browse whether hit comes from a host browsing + */ +static void +search_validate_result_address(gnet_results_set_t *rs, + const gnutella_node_t *n, bool browse) +{ /* * Hits coming from UDP should bear the node's address, unless the * hit has a private IP because the servent did not determine its @@ -2188,24 +2498,32 @@ if (NODE_IS_UDP(n)) { rs->status |= ST_UDP; + if (NODE_CAN_SR_UDP(n)) + rs->status |= ST_SR_UDP; + if ( 0 == rs->hops && /* GUESS ultrapeers can relay hits over UDP */ - !host_addr_equal(n->addr, rs->addr) && + !host_addr_equiv(n->addr, rs->addr) && host_addr_is_routable(rs->addr) ) { rs->status |= ST_ALIEN; - gnet_stats_count_general(GNR_OOB_HITS_WITH_ALIEN_IP, 1); + gnet_stats_inc_general(GNR_OOB_HITS_WITH_ALIEN_IP); } } /* Check for hostile IP addresses */ - if (hostiles_check(n->addr) || hostiles_check(rs->addr)) { - if (GNET_PROPERTY(search_debug) > 1) { - g_debug("dropping %s query hit from hostile IP %s", - NODE_IS_UDP(n) ? "UDP" : "TCP", - host_addr_to_string(NODE_IS_UDP(n) ? n->addr : rs->addr)); - } + if (hostiles_is_bad(rs->addr)) { + if (GNET_PROPERTY(search_debug) > 1) { + hostiles_flags_t flags = hostiles_check(rs->addr); + g_debug("dropping %s %s %s by %s: hostile source at %s (%s)", + NODE_IS_UDP(n) ? "UDP" : "TCP", + NODE_TALKS_G2(n) ? "/QH2" : "query hit", + NODE_IS_UDP(n) ? + (0 == rs->hops ? "issued" : "relayed") : "relayed", + host_addr_to_string(n->addr), host_addr_to_string2(rs->addr), + hostiles_flags_to_string(flags)); + } rs->status |= ST_HOSTILE; } @@ -2225,12 +2543,936 @@ rs->status |= ST_FIREWALL; } else if (rs->port == 0 || bogons_check(rs->addr)) { if (GNET_PROPERTY(search_debug)) { - g_warning("%s query hit advertising bogus IP %s", - NODE_IS_UDP(n) ? "UDP" : "TCP", + g_warning("%s advertising bogus IP %s", + gmsg_node_infostr(n), host_addr_port_to_string(rs->addr, rs->port)); } rs->status |= ST_BOGUS | ST_FIREWALL; } +} + +/** + * Validate that the GUID held in the hit is correct. + * + * @param rs the result set being constructed + * @param n the node from which the hit comes + * @param muid the MUID of the search + * + * @return NULL if OK, a pointer to an error string otherwise. + */ +static const char * +search_validate_guid(gnet_results_set_t *rs, + gnutella_node_t *n, const guid_t *muid) +{ + if (guid_eq(rs->guid, GNET_PROPERTY(servent_guid))) { + gnet_stats_count_dropped(n, MSG_DROP_OWN_RESULT); + if (0 == rs->hops) { + n->n_weird++; + if (GNET_PROPERTY(search_debug) > 1) { + g_warning("weird #%d %s sending our own results with hops=0", + n->n_weird, node_infostr(n)); + } + } + return "own result"; + } + + /* Very funny */ + if (guid_eq(rs->guid, muid)) { + gnet_stats_count_dropped(n, MSG_DROP_BAD_RESULT); + return "bad MUID"; + } + + if (guid_eq(rs->guid, &blank_guid)) { + gnet_stats_count_dropped(n, MSG_DROP_BLANK_SERVENT_ID); + return "blank GUID"; + } + + return NULL; /* OK */ +} + +/** + * Finalize information in the results set. + * + * @param rs the result set being constructed + * @param muid the MUID of the search + * @param browse whether we're processing a hit from a "browse host" + */ +static void +search_finalize_results(gnet_results_set_t *rs, const guid_t *muid, bool browse) +{ + { + host_addr_t c_addr; + + /* + * Prefer an UDP source IP for the country computation. + * + * Have to check for hops=0 since GUESS ultrapeeers can route back + * query hits returned via TCP from their leaves. + */ + + c_addr = (0 == rs->hops && (rs->status & ST_UDP)) ? + rs->last_hop : rs->addr; + rs->country = gip_country(c_addr); + + /* + * If we're not only validating (i.e. we're going to peruse this hit), + * and if the server is marking its hits with the Push flag, check + * whether it is already known to wrongly set that bit. + * --RAM, 18/08/2002. + */ + + if ( + (rs->status & ST_FIREWALL) && + download_server_nopush(rs->guid, rs->addr, rs->port) + ) { + rs->status &= ~ST_FIREWALL; /* Clear "Push" indication */ + } + } + + { + const char *query; + unsigned media_mask = 0; + + query = map_muid_to_query_string(muid, &media_mask); + rs->query = query != NULL ? atom_str_get(query) : NULL; + + /* + * The field rs->media is only 8 bits, but we rely on the fact that + * the currently architected media types all fit in one single byte. + * This allows us to store the media type in the results without + * really increasing the memory requirements (uses padding space). + */ + + rs->media = media_mask; + + if (NULL == query && !browse && settings_is_ultra()) { + gnet_stats_inc_general(GNR_QUERY_HIT_FOR_UNTRACKED_QUERY); + } + + /* + * Morpheus ignores all non-ASCII characters in query strings + * which results in completely bogus results. For example, if you + * search for "<chinese>.txt" every filename ending with .txt will + * match! + */ + + if ( + T_MRPH == rs->vcode.u32 && + rs->query != NULL && !is_ascii_string(rs->query) + ) { + pslist_t *sl; + + rs->status |= ST_MORPHEUS_BOGUS; + PSLIST_FOREACH(rs->records, sl) { + gnet_record_t *record = sl->data; + record->flags |= SR_DONT_SHOW | SR_IGNORED; + } + } + + /* + * If we have a non-zero media type filter for the query, then + * look whether at least one of the records matches. Otherwise, + * it's bye-bye. + */ + + if (query != NULL && media_mask != 0) { + pslist_t *sl; + size_t matching = 0; + bool own_query = htable_contains(search_by_muid, muid); + + PSLIST_FOREACH(rs->records, sl) { + gnet_record_t *rc = sl->data; + unsigned mask = share_filename_media_mask(rc->filename); + + if (mask != 0 && !(mask & media_mask)) { + /* + * Not matching the requested media type. + * + * Hide in the GUI, if it's for one of our queries + * otherwise display them as "ignored" (in passive + * searches). + */ + + if (own_query) + rc->flags |= SR_DONT_SHOW; + rc->flags |= SR_IGNORED | SR_MEDIA; + } else { + matching++; + } + } + + if (0 == matching) { + /* We will not forward this packet */ + rs->status |= ST_MEDIA; /* Lacking proper media type */ + } + } + } +} + +static void G_PRINTF(4, 5) +search_record_warn(const gnutella_node_t *n, + const gnet_results_set_t *rs, size_t hit, const char *fmt, ...) +{ + va_list args; + char buf256; + + va_start(args, fmt); + str_vbprintf(buf, sizeof buf, fmt, args); + va_end(args); + + if (GNET_PROPERTY(qhit_bad_debug)) { + if (node_addr_port_equal(n, rs->addr, rs->port)) { + g_warning("hit record #%zu/%u in %s generated by %s: %s", + hit, rs->num_recs, gmsg_node_infostr(n), + vendor_code_to_string(rs->vcode.u32), + buf); + } else { + g_warning("hit record #%zu/%u in %s generated by %s at %s: %s", + hit, rs->num_recs, gmsg_node_infostr(n), + vendor_code_to_string(rs->vcode.u32), + host_addr_port_to_string(rs->addr, rs->port), buf); + } + } +} + +enum g2_qh2_child { + G2_QH2_BH = 1, + G2_QH2_FW, + G2_QH2_GTKGV, /* Child is "gtkgV", this is GTKG-specific */ + G2_QH2_GU, + G2_QH2_H, + G2_QH2_HN, + G2_QH2_NA, + G2_QH2_NH, + G2_QH2_TLS, + G2_QH2_V +}; + +enum g2_qh2_h_child { + G2_QH2_H_ALT = 1, + G2_QH2_H_CSC, /* unparsed (rather useless) */ + G2_QH2_H_CT, + G2_QH2_H_DN, + G2_QH2_H_ID, /* unparsed */ + G2_QH2_H_PART, + G2_QH2_H_SZ, + G2_QH2_H_URL, + G2_QH2_H_URN +}; + +static const tokenizer_t g2_qh2_children = { + /* Sorted array */ + { "BH", G2_QH2_BH }, + { "FW", G2_QH2_FW }, + { "GU", G2_QH2_GU }, + { "H", G2_QH2_H }, + { "HN", G2_QH2_HN }, + { "NA", G2_QH2_NA }, + { "NH", G2_QH2_NH }, + { "TLS", G2_QH2_TLS }, + { "V", G2_QH2_V }, + { "gtkgV", G2_QH2_GTKGV }, +}; + +static const tokenizer_t g2_qh2_h_children = { + /* Sorted array */ + { "ALT", G2_QH2_H_ALT }, + { "CSC", G2_QH2_H_CSC }, + { "CT", G2_QH2_H_CT }, + { "DN", G2_QH2_H_DN }, + { "ID", G2_QH2_H_ID }, + { "PART", G2_QH2_H_PART }, + { "SZ", G2_QH2_H_SZ }, + { "URL", G2_QH2_H_URL }, + { "URN", G2_QH2_H_URN }, +}; + +enum g2_qh2_urn_type { + URN_SHA1 = 1, + URN_TTH, + URN_BITPRINT +}; + +static const tokenizer_t g2_qh2_urn = { + /* Sorted array */ + { "bitprint", URN_BITPRINT }, + { "bp", URN_BITPRINT }, + { "sha1", URN_SHA1 }, + { "tree:tiger/", URN_TTH }, + { "ttr", URN_TTH }, +}; + +/** + * Parse /QH2/H to build a file record. + * + * @param t the /QH2/H tree node + * @param n the node from which we got the hit (for logging) + * @param rs the result set to which record belongs (for logging) + * @param hit hit number within the /QH2 message + * + * @return a synthetized file record if OK, NULL on errors. + */ +gnet_record_t * +get_g2_results_record(const g2_tree_t *t, const gnutella_node_t *n, + const gnet_results_set_t *rs, size_t hit, hostiles_flags_t *hostile) +{ + gnet_record_t *rc; + const g2_tree_t *c; + gnet_host_vec_t *hvec = NULL; + bool has_sz = FALSE, has_url = FALSE; + const char *badmsg = NULL; + + rc = search_record_new(); + rc->file_index = 1; /* Not 0, not -1, otherwise does not matter */ + + G2_TREE_CHILD_FOREACH(t, c) { + enum g2_qh2_h_child ct = TOKENIZE(g2_tree_name(c), g2_qh2_h_children); + const void *payload; + size_t paylen; + + switch (ct) { + case G2_QH2_H_ALT: + payload = g2_tree_node_payload(c, &paylen); + if (payload != NULL && 0 == paylen % 6 && NULL == hvec) { + const char *end = const_ptr_add_offset(payload, paylen); + const char *p = payload; + + hvec = gnet_host_vec_alloc(); + + while (p < end) { + host_addr_t addr = host_addr_peek_ipv4(p); + uint16 port = peek_le16(&p4); + gnet_host_vec_add(hvec, addr, port); + p += 6; + } + } else { + if (NULL == payload) { + badmsg = "no ALT payload"; + goto bad; + } + if (hvec != NULL) + search_record_warn(n, rs, hit, "ignoring duplicate ALT"); + if (paylen % 6 != 0) { + search_record_warn(n, rs, hit, + "ignoring ALT (%zu bytes)", paylen); + } + } + break; + + case G2_QH2_H_CT: + payload = g2_tree_node_payload(c, &paylen); + if (paylen <= 8) { + uint64 v = vlint_decode(payload, paylen); + rc->create_time = MIN(v, TIME_T_MAX); + } + break; + + case G2_QH2_H_DN: + payload = g2_tree_node_payload(c, &paylen); + if (NULL == payload) { + badmsg = "no DN payload"; + goto bad; + } + if (rc->filename != NULL) { + badmsg = "duplicate DN payload"; + goto bad; + } + + /* + * We need to probe for "SZ" because when it is present, there + * is no file size before the name. + */ + + if (!has_sz) + has_sz = NULL != g2_tree_lookup(t, "SZ"); + + { + const char *p = payload; + + if (!has_sz) { + if (paylen < 4) { + badmsg = "too small DN payload"; + goto bad; + } + rc->size = peek_le32(p); + p += 4; + paylen -= 4; + } + + if (!utf8_is_valid_data(p, paylen)) { + /* + * If there is a SZ record, maybe they included a 32-bit + * size before the name as well (broken servent, but + * still manageable in that case)? + */ + + if (has_sz && paylen > 4) { + if (utf8_is_valid_data(p + 4, paylen - 4)) { + search_record_warn(n, rs, hit, + "DN probably had 32-bit size despite SZ"); + p += 4; + paylen -= 4; + goto utf8_filename; + } + } + + badmsg = has_sz ? + "DN payload not valid UTF-8" : + "filename in DN not valid UTF-8"; + *hostile |= HSTL_NON_UTF8; + goto bad; + } + + utf8_filename: + + /* Must copy string since it is usually not NUL-terminated */ + rc->filename = h_strndup(p, paylen); + rc->flags |= SR_ALLOC_NAME; + + /* + * Make sure the filename is not empty. + */ + + if (0 == utf8_strlen(rc->filename)) { + badmsg = "empty filename"; + goto bad; + } + } + + /* + * See whether we have a "P" child to indicate the shared path. + */ + + { + const g2_tree_t *p = g2_tree_lookup(c, "P"); + + if (p != NULL) { + char buf1024; + payload = g2_tree_node_payload(p, &paylen); + clamp_strncpy(buf, sizeof buf, payload, paylen); + rc->path = atom_str_get(buf); + } + } + + break; + + case G2_QH2_H_PART: + rc->flags |= SR_PARTIAL_HIT; + payload = g2_tree_node_payload(c, &paylen); + if (paylen <= 8) + rc->available = vlint_decode(payload, paylen); + else { + search_record_warn(n, rs, hit, + "ignoring PART payload (%zu bytes)", paylen); + } + + /* + * See whether we have a "MT" child to hold the last mtime of file. + */ + + { + const g2_tree_t *m = g2_tree_lookup(c, "MT"); + + if (m != NULL) { + payload = g2_tree_node_payload(m, &paylen); + if (paylen >= 4) + rc->mod_time = peek_le32(payload); + } + } + + break; + + case G2_QH2_H_SZ: + has_sz = TRUE; + payload = g2_tree_node_payload(c, &paylen); + if (paylen <= 8) + rc->size = vlint_decode(payload, paylen); + else { + search_record_warn(n, rs, hit, + "ignoring SZ payload (%zu bytes)", paylen); + } + break; + + case G2_QH2_H_URL: + payload = g2_tree_node_payload(c, &paylen); + if (payload != NULL) { + /* TODO: parse URL to see whether it points back to host */ + search_record_warn(n, rs, hit, "ignoring URL payload \"%*s\"", + (int) paylen, (char *) payload); + } else { + has_url = TRUE; + } + break; + + case G2_QH2_H_URN: + payload = g2_tree_node_payload(c, &paylen); + if (NULL == payload) { + search_record_warn(n, rs, hit, "ignoring empty URN payload"); + } else { + char name16; + const void *p; + size_t l, e = 0; + enum g2_qh2_urn_type type; + + l = clamp_strlen(payload, paylen); + if (l == paylen) { + search_record_warn(n, rs, hit, + "ignoring URN payload with no NUL (%zu bytes)", paylen); + break; + } + clamp_strncpy(name, sizeof name, payload, l); + paylen -= l + 1; /* Skip urn string + NUL */ + p = const_ptr_add_offset(payload, l + 1); + type = TOKENIZE(name, g2_qh2_urn); + if (0 == type) + break; /* Not the type of URN we want */ + + switch (type) { + case URN_SHA1: e = SHA1_RAW_SIZE; break; + case URN_BITPRINT: e = SHA1_RAW_SIZE + TTH_RAW_SIZE; break; + case URN_TTH: e = TTH_RAW_SIZE; break; + } + + if (paylen != e) { + search_record_warn(n, rs, hit, + "ignoring bad URN \"%s\" (%zu-byte long, expected %zu)", + name, paylen, e); + break; + } + + switch (type) { + case URN_SHA1: + case URN_BITPRINT: + if (NULL == rc->sha1) { + sha1_t sha1; + memcpy(&sha1, p, SHA1_RAW_SIZE); + rc->sha1 = atom_sha1_get(&sha1); + } else { + search_record_warn(n, rs, hit, "ignoring dup SHA1"); + } + if (URN_SHA1 == type) + break; + p = const_ptr_add_offset(p, SHA1_RAW_SIZE); + /* FALL THROUGH */ + case URN_TTH: + if (NULL == rc->tth) { + tth_t tth; + memcpy(&tth, p, TTH_RAW_SIZE); + rc->tth = atom_tth_get(&tth); + } else { + search_record_warn(n, rs, hit, "ignoring dup TTH"); + } + break; + } + } + break; + + case G2_QH2_H_CSC: + case G2_QH2_H_ID: + /* Unparsed */ + break; + } + } + + /* + * The "ALT" locs are only useful if there was a SHA1 present. + */ + + if (hvec != NULL) { + if (NULL == rc->sha1) { + search_record_warn(n, rs, hit, "ignoring ALT since lacking SHA1"); + gnet_host_vec_free(&hvec); + } else { + rc->alt_locs = hvec; + } + } + + /* + * There must be a "DN" since we're always requesting one in our queries. + */ + + if (NULL == rc->filename) { + badmsg = "no DN"; + goto bad; + } + + /* + * There must be a "URL", indicating that the servent is sharing the + * file using the regular uri-res resolver, otherwise we won't know + * how to download the resource so drop it. + */ + + if (!has_url) { + badmsg = "no empty URL key, resource unusable"; + goto bad; + } + + /* + * There must be a SHA1 since this is G2 and there is no file index to + * request the resource. + */ + + if (NULL == rc->sha1) { + badmsg = "no SHA1 found, resource unusable"; + goto bad; + } + + search_record_cleanup(rc); + + return rc; + +bad: + gnet_host_vec_free(&hvec); + search_record_warn(n, rs, hit, "skipping bad record: %s", badmsg); + search_free_record(rc); + return NULL; +} + +/** + * Parse /QH2 and extract the embedded records. + * + * @param n the node from which we got the hit + * @param t the G2 message tree + * @param browse whether this hit comes from a browse-host request + * @param hostile where hostile indications are consolidated + * + * @return a structure describing the whole result set, or NULL if we + * were unable to parse it properly. + */ +static gnet_results_set_t * +get_g2_results_set(gnutella_node_t *n, const g2_tree_t *t, + bool browse, hostiles_flags_t *hostile) +{ + gnet_results_set_t *rs; + const guid_t *muid; + guid_t muid_buf; + const void *payload; + size_t paylen; + const g2_tree_t *c; + size_t nr = 0; + const char *vendor = NULL; + const char *badmsg = NULL; + bool has_na = FALSE; + + *hostile = HSTL_CLEAN; + muid = g2_msg_get_muid(t, &muid_buf); + + if (browse) { + if (NULL == muid) + muid = &blank_guid; + } else { + /* If we dispatch the results, we extracted the MUID before */ + g_assert(muid != NULL); + } + + rs = search_new_r_set(); + rs->stamp = tm_time(); + rs->country = ISO3166_INVALID; + + if (browse) { + rs->hops = 0; + } else { + /* Since we extracted the MUID before, there must be a "hops" byte */ + payload = g2_tree_node_payload(t, &paylen); + g_assert(payload != NULL); + rs->hops = *(uint8 *) payload; + } + gnutella_header_set_hops(&n->header, rs->hops + 1); + rs->last_hop = n->addr; + rs->status |= ST_G2 | ST_PARSED_TRAILER; /* No trailer in G2 */ + + /* + * Count the number of hits present, so that we know how many valid + * hits we parsed in case we have to bail out due to a malformed packet. + */ + + G2_TREE_CHILD_FOREACH(t, c) { + if (0 == strcmp(g2_tree_name(c), "H")) + rs->num_recs++; + } + + /* + * Parse the children. + */ + + G2_TREE_CHILD_FOREACH(t, c) { + enum g2_qh2_child ct = TOKENIZE(g2_tree_name(c), g2_qh2_children); + + switch (ct) { + case G2_QH2_BH: + rs->status |= ST_BH; + break; + + case G2_QH2_FW: + rs->status |= ST_FIREWALL; + break; + + case G2_QH2_GU: + payload = g2_tree_node_payload(c, &paylen); + if (NULL == payload || paylen != GUID_RAW_SIZE) { + badmsg = NULL == payload ? "no GUID" : "invalid GUID length"; + goto bad_packet; + } + rs->guid = atom_guid_get(cast_to_guid_ptr_const(payload)); + badmsg = search_validate_guid(rs, n, muid); + if (badmsg != NULL) + goto bad_packet; + break; + + case G2_QH2_GTKGV: + payload = g2_tree_node_payload(c, &paylen); + if (payload != NULL && NULL == rs->version) { + struct ggep_gtkgv vi; + + if (GGEP_OK == ggept_gtkgv_extract_data(payload, paylen, &vi)) + rs->version = search_results_version(&vi); + } + break; + + case G2_QH2_H: + { + gnet_record_t *rc; + + nr++; + rc = get_g2_results_record(c, n, rs, nr, hostile); + if (rc != NULL) + rs->records = pslist_prepend(rs->records, rc); + } + break; + + case G2_QH2_HN: + payload = g2_tree_node_payload(c, &paylen); + if (payload != NULL && NULL == rs->hostname) { + char bufMAX_HOSTLEN; + + clamp_strncpy(buf, sizeof buf, payload, paylen); + if (utf8_is_valid_string(buf)) { + const char *endptr; + host_addr_t addr; + + /* + * Ensure the full string qualifies as hostname and is + * not an IP address. + */ + + if ( + string_to_host_or_addr(buf, &endptr, &addr) && + '\0' == *endptr && !is_host_addr(addr) + ) { + rs->hostname = atom_str_get(buf); + } + } + } + break; + + case G2_QH2_NA: + if (!g2_node_parse_address(c, &rs->addr, &rs->port)) { + badmsg = "no valid address in \"NA\""; + goto bad_packet; + } + has_na = TRUE; + break; + + case G2_QH2_NH: + { + host_addr_t addr; + uint16 port; + + if (NULL == rs->proxies) { + rs->proxies = gnet_host_vec_alloc(); + rs->status |= ST_PUSH_PROXY; + } + + if (g2_node_parse_address(c, &addr, &port)) + gnet_host_vec_add(rs->proxies, addr, port); + } + break; + + case G2_QH2_TLS: + rs->status |= ST_TLS; + break; + + case G2_QH2_V: + payload = g2_tree_node_payload(c, &paylen); + if (payload != NULL && 4 == paylen) { + rs->vcode.u32 = peek_be32(payload); + vendor = vendor_get_name(rs->vcode); + if (vendor != NULL && is_vendor_known(rs->vcode)) { + rs->status |= ST_KNOWN_VENDOR; + } + } + break; + } + } + + /* Drop if no results in /QH2 */ + + if (0 == nr) { + badmsg = "no results"; + goto bad_packet; + } + + /* + * Adjust the number of records, in case we did not include all the + * items in the hit. + */ + + rs->num_recs = pslist_length(rs->records); + + if (0 == rs->num_recs) { + badmsg = "kept none of the items"; + goto bad_packet; + } + + /* + * If we did not find a "NA" child in the hit, try to intuit the address. + */ + + if (!has_na) { + /* + * If it comes from UDP, we can derive the address, and pray for the + * port to be the listening port. Via TCP, with hops=0, we have the + * node address and listening port normally. + * Otherwise, reject the hit. + */ + + if (NODE_IS_UDP(n)) { + rs->addr = n->addr; + rs->port = n->port; + } else { + if (0 != rs->hops || 0 == n->gnet_port) { + badmsg = "no \"NA\" in TCP hit, cannot derive source"; + goto bad_packet; + } + rs->addr = n->gnet_addr; + rs->port = n->gnet_port; /* Known listening port */ + } + } + + if (*hostile & HSTL_NON_UTF8) { + hostiles_dynamic_add(rs->addr, + "non UTF-8 filenames in hits", HSTL_NON_UTF8); + } + + search_results_postprocess(n, rs, muid, hostile); + + /* + * Refresh push-proxies if we're downloading anything from this server. + * + * Special handling for GTKG hosts: they can return hits via G2 but they + * are more Gnutella than G2 really, hence we can avoid recording their + * connected G2 hubs as G2, and handle them as Gnutella ones: it's possible + * that these G2 nodes are also supporting Gnutella (and could therefore + * understand incoming PUSH requests via UDP), and we don't want to flag a + * GTKG server as being G2! + */ + + if (rs->proxies != NULL) { + download_got_push_proxies(rs->guid, rs->proxies, + rs->vcode.u32 != T_GTKG); + } + + search_validate_result_address(rs, n, browse); + search_finalize_results(rs, muid, browse); + search_results_identify_spam(n, rs, hostile); + + if (GNET_PROPERTY(log_query_hits)) + search_results_log(n, rs); + + return rs; + +bad_packet: + if (GNET_PROPERTY(qhit_bad_debug)) { + g_warning( + "BAD %s from %s (via %s) -- %zu/%u record%s parsed: %s", + gmsg_node_infostr(n), vendor ? vendor : "????", node_infostr(n), + nr, rs->num_recs, plural(rs->num_recs), badmsg); + if (GNET_PROPERTY(qhit_bad_debug) > 1) + dump_hex(stderr, "/QH2 Data (BAD)", n->data, n->size); + } + + search_free_r_set(rs); + gnet_stats_count_dropped(n, MSG_DROP_BAD_RESULT); + + return NULL; /* Forget set, comes from a bad node */ +} + +/** + * Parse Query Hit and extract the embedded records, plus the optional + * trailing Query Hit Descritor (QHD). + * + * @param n the node from which we got the QHD + * @param browse whether this QHD comes from a browse-host request + * @param hostile where hostile indications are consolidated + * + * @return a structure describing the whole result set, or NULL if we + * were unable to parse it properly. + */ +static gnet_results_set_t * G_HOT +get_results_set(gnutella_node_t *n, bool browse, hostiles_flags_t *hostile) +{ + gnet_results_set_t *rs; + const char *endptr, *s, *tag; + uint32 nr = 0; + uint32 size, idx, taglen; + str_t *info; + unsigned sha1_errors = 0; + unsigned alt_errors = 0; + unsigned alt_without_hash = 0; + const char *trailer = NULL; + bool seen_ggep_h = FALSE; + bool seen_ggep_alt = FALSE; + bool seen_ggep_alt6 = FALSE; + bool seen_bitprint = FALSE; + bool multiple_sha1 = FALSE; + bool multiple_alt = FALSE; + bool tag_has_nul = FALSE; + const char *vendor = NULL; + const char *badmsg = NULL; + const guid_t *muid = gnutella_header_get_muid(&n->header); + + *hostile = HSTL_CLEAN; + + /* We shall try to detect malformed packets as best as we can */ + if (n->size < 27) { + /* packet too small 11 header, 16 GUID min */ + g_warning("%s(): given too small a packet (%d bytes)", + G_STRFUNC, n->size); + gnet_stats_count_dropped(n, MSG_DROP_TOO_SMALL); + return NULL; + } + + info = str_new(80); + + rs = search_new_r_set(); + rs->stamp = tm_time(); + rs->country = ISO3166_INVALID; + + rs->ttl = gnutella_header_get_ttl(&n->header); + rs->hops = gnutella_header_get_hops(&n->header); + + if (!browse) { + g_assert(rs->hops > 0); + rs->hops--; /* route_message() increased hop count by 1 */ + } + + /* Transfer the Query Hit info to our internal results_set struct */ + + { + const gnutella_search_results_t *r = cast_to_pointer(n->data); + + rs->num_recs = gnutella_search_results_get_num_recs(r); + rs->addr = host_addr_get_ipv4(gnutella_search_results_get_host_ip(r)); + rs->port = gnutella_search_results_get_host_port(r); + rs->speed = gnutella_search_results_get_host_speed(r); + rs->last_hop = n->addr; + + /* Now come the result set, and the servent ID will close the packet */ + + STATIC_ASSERT(11 == sizeof *r); + s = cast_to_constpointer(&r1); /* Start of the records */ + endptr = &sn->size - 11 - 16; /* End of records, less header, GUID */ + } /* Drop if no results in Query Hit */ @@ -2240,12 +3482,14 @@ goto bad_packet; } + search_validate_result_address(rs, n, browse); + if (GNET_PROPERTY(search_debug) > 7) dump_hex(stdout, "Query Hit Data", n->data, n->size); while (endptr - s > 10 && nr < rs->num_recs) { gnet_record_t *rc; - char *filename; + const char *filename; idx = peek_le32(s); s += 4; /* File Index */ @@ -2308,7 +3552,7 @@ rc->size = size; rc->filename = filename; - rs->records = g_slist_prepend(rs->records, rc); + rs->records = pslist_prepend(rs->records, rc); /* * If we have a tag, parse it for extensions. @@ -2321,8 +3565,9 @@ char *endtag; size_t parselen; gnet_host_vec_t *hvec = NULL; /* For GGEP "ALT" */ - gboolean has_hash = FALSE; - gboolean has_unknown = FALSE; + bool has_hash = FALSE; + bool has_unknown = FALSE; + filesize_t available = 0; /* For GGEP "PRU" */ g_assert(taglen > 0); @@ -2432,8 +3677,11 @@ } } break; + case EXT_T_URN_BTIH: + case EXT_T_URN_MD5: + case EXT_T_URN_ED2KHASH: case EXT_T_URN_UNKNOWN: - /* Silently ignore unknown URNs like urn:ed2khash */ + /* Silently ignore unknown / unhandled URNs */ break; case EXT_T_GGEP_TT: /* TTH (binary) */ paylen = ext_paylen(e); @@ -2538,11 +3786,11 @@ break; case EXT_T_GGEP_ALT_TLS: /* TLS-capability bitmap for ALT */ case EXT_T_GGEP_ALT6_TLS: /* TLS-capability bitmap for ALT6 */ - /* FIXME: Handle this */ + /* FIXME: Handle this */ break; case EXT_T_GGEP_LF: /* Large File */ { - guint64 fs; + uint64 fs; ret = ggept_filesize_extract(e, &fs); if (ret == GGEP_OK) { @@ -2585,13 +3833,34 @@ } break; case EXT_T_GGEP_PR0: /* Partial results */ + rc->flags |= SR_PARTIAL_HIT; + /* No parts of the file available yet */ + break; case EXT_T_GGEP_PR1: case EXT_T_GGEP_PR2: case EXT_T_GGEP_PR3: case EXT_T_GGEP_PR4: - /* TODO: handle intervals to compute available ranges */ + rc->flags |= SR_PARTIAL_HIT; + rc->available += lime_range_decode(n, e, rc->size); + break; case EXT_T_GGEP_PRU: rc->flags |= SR_PARTIAL_HIT; + if (0 != ext_paylen(e)) { + if ( + GGEP_OK == ggept_stamp_filesize_extract(e, + &rc->mod_time, &available) + ) { + /* + * Do not update rc->available yet, in case there + * are "PRi" extensions. Since the file size is + * more precise in "PRU" than the one computed + * with "PRi" decoding, wait until we have handled + * all the extensions to set the one found in "PRU". + */ + } else { + search_log_bad_ggep(n, e, NULL); + } + } break; case EXT_T_UNKNOWN_GGEP: /* Unknown GGEP extension */ if ( @@ -2605,7 +3874,7 @@ has_unknown = TRUE; if (ext_paylen(e) && ext_has_ascii_word(e)) { if (str_len(info)) - str_cat(info, "; "); + STR_CAT(info, "; "); str_cat_len(info, ext_payload(e), ext_paylen(e)); } break; @@ -2618,6 +3887,15 @@ } } + /* + * The available size on the server (for partial results) is more + * precise in the "PRU" extension. So if one was present, use it + * to derive the remotely available bytes. + */ + + if (available != 0) + rc->available = available; + if (has_unknown) { if (GNET_PROPERTY(search_debug) > 2) { g_warning("%s hit record #%d/%d has unknown extensions!", @@ -2659,6 +3937,8 @@ } } } + + search_record_cleanup(rc); } /* @@ -2698,7 +3978,7 @@ "(%u/%u records parsed)", trailer_len, s - n->data, gmsg_node_infostr(n), - node_addr(n), (guint) nr, (guint) rs->num_recs); + node_addr(n), (uint) nr, (uint) rs->num_recs); } if (GNET_PROPERTY(search_debug) > 1) { dump_hex(stderr, "Query Hit Data (non-empty UNKNOWN trailer?)", @@ -2721,15 +4001,12 @@ switch (rs->vcode.u32) { case T_GTKG: case T_LIME: - if ( - GNET_PROPERTY(node_debug) && - !(n->flags & NODE_F_NOT_GENUINE) - ) { + if (GNET_PROPERTY(node_debug) && NODE_IS_GENUINE(n)) { g_message("NODE %s is not a genuine %s: " "sends bad query hits", node_infostr(n), vendor ? vendor : "node"); } - n->flags |= NODE_F_NOT_GENUINE; + n->attrs2 |= NODE_A2_NOT_GENUINE; break; } } @@ -2747,60 +4024,39 @@ /* We now have the GUID of the node */ rs->guid = atom_guid_get(cast_to_guid_ptr_const(endptr)); - if (guid_eq(rs->guid, GNET_PROPERTY(servent_guid))) { - gnet_stats_count_dropped(n, MSG_DROP_OWN_RESULT); - badmsg = "own result"; - if (0 == rs->hops) { - n->n_weird++; - if (GNET_PROPERTY(search_debug) > 1) { - g_warning("weird #%d %s sending our own results with hops=0", - n->n_weird, node_infostr(n)); - } - } - goto bad_packet; - } - /* Very funny */ - if (guid_eq(rs->guid, muid)) { - gnet_stats_count_dropped(n, MSG_DROP_BAD_RESULT); - badmsg = "bad MUID"; - goto bad_packet; - } - - if (guid_eq(rs->guid, &blank_guid)) { - gnet_stats_count_dropped(n, MSG_DROP_BLANK_SERVENT_ID); - badmsg = "blank GUID"; - goto bad_packet; - } + badmsg = search_validate_guid(rs, n, muid); + if (badmsg != NULL) + goto bad_packet; if ( trailer && - search_results_handle_trailer(n, rs, trailer, endptr - trailer) + search_results_handle_trailer(n, rs, trailer, endptr - trailer, hostile) ) { gnet_stats_count_dropped(n, MSG_DROP_BAD_RESULT); badmsg = "bad trailer"; - goto bad_packet; + goto bad_packet; } if ((rs->status & ST_FIREWALL) && !route_guid_pushable(rs->guid)) { gnet_stats_count_dropped(n, MSG_DROP_FROM_BANNED); badmsg = "firewalled origin & banned GUID"; - goto bad_packet; + goto bad_packet; } /* * At this point we finished processing of the query hit, successfully. */ - search_results_postprocess(n, rs); + search_results_postprocess(n, rs, muid, hostile); /* * Refresh push-proxies if we're downloading anything from this server. */ if (rs->proxies != NULL) - download_got_push_proxies(rs->guid, rs->proxies); - + download_got_push_proxies(rs->guid, rs->proxies, FALSE); + /* * Now that we have the vendor, warn if the message has SHA1 errors. * Then drop the packet! @@ -2812,8 +4068,7 @@ "over %u record%s", gmsg_node_infostr(n), vendor ? vendor : "????", node_infostr(n), - sha1_errors, sha1_errors == 1 ? "" : "s", - nr, nr == 1 ? "" : "s"); + sha1_errors, plural(sha1_errors), nr, plural(nr)); gnet_stats_count_dropped(n, MSG_DROP_MALFORMED_SHA1); badmsg = "malformed SHA1"; goto bad_packet; /* Will drop this bad query hit */ @@ -2828,8 +4083,7 @@ g_warning("%s from %s (via %s) had %u ALT error%s over %u record%s", gmsg_node_infostr(n), vendor ? vendor : "????", node_infostr(n), - alt_errors, alt_errors == 1 ? "" : "s", - nr, nr == 1 ? "" : "s"); + alt_errors, plural(alt_errors), nr, plural(nr)); } if (alt_without_hash && GNET_PROPERTY(search_debug)) { @@ -2837,8 +4091,7 @@ "with no hash over %u record%s", gmsg_node_infostr(n), vendor ? vendor : "????", node_infostr(n), - alt_without_hash, alt_without_hash == 1 ? "" : "s", - nr, nr == 1 ? "" : "s"); + alt_without_hash, plural(alt_without_hash), nr, plural(nr)); } if (GNET_PROPERTY(search_debug) > 1) { @@ -2862,116 +4115,13 @@ gmsg_node_infostr(n), vendor ? vendor : "????"); } - { - host_addr_t c_addr; - - /* - * Prefer an UDP source IP for the country computation. - * - * Have to check for hops=0 since GUESS ultrapeeers can route back - * query hits returned via TCP from their leaves. - */ - - c_addr = (0 == rs->hops && (rs->status & ST_UDP)) ? - rs->last_hop : rs->addr; - rs->country = gip_country(c_addr); - - /* - * If we're not only validating (i.e. we're going to peruse this hit), - * and if the server is marking its hits with the Push flag, check - * whether it is already known to wrongly set that bit. - * --RAM, 18/08/2002. - */ - - if ( - (rs->status & ST_FIREWALL) && - download_server_nopush(rs->guid, rs->addr, rs->port) - ) { - rs->status &= ~ST_FIREWALL; /* Clear "Push" indication */ - } - } - - { - const char *query; - - query = map_muid_to_query_string(muid, &media_mask); - rs->query = query != NULL ? atom_str_get(query) : NULL; - - /* - * The field rs->media is only 8 bits, but we rely on the fact that - * the currently architected media types all fit in one single byte. - * This allows us to store the media type in the results without - * really increasing the memory requirements (uses padding space). - */ - - rs->media = media_mask; - - if (NULL == query && !browse && settings_is_ultra()) { - gnet_stats_count_general(GNR_QUERY_HIT_FOR_UNTRACKED_QUERY, +1); - } - - /* - * Morpheus ignores all non-ASCII characters in query strings - * which results in completely bogus results. For example, if you - * search for "<chinese>.txt" every filename ending with .txt will - * match! - */ - - if ( - T_MRPH == rs->vcode.u32 && - rs->query != NULL && !is_ascii_string(rs->query) - ) { - GSList *sl; - - rs->status |= ST_MORPHEUS_BOGUS; - GM_SLIST_FOREACH(rs->records, sl) { - gnet_record_t *record = sl->data; - record->flags |= SR_DONT_SHOW | SR_IGNORED; - } - } - - /* - * If we have a non-zero media type filter for the query, then - * look whether at least one of the records matches. Otherwise, - * it's bye-bye. - */ - - if (query != NULL && media_mask != 0) { - GSList *sl; - size_t matching = 0; - gboolean own_query = gm_hash_table_contains(search_by_muid, muid); - - GM_SLIST_FOREACH(rs->records, sl) { - gnet_record_t *rc = sl->data; - unsigned mask = share_filename_media_mask(rc->filename); - - if (mask != 0 && !(mask & media_mask)) { - /* - * Not matching the requested media type. - * - * Hide in the GUI, if it's for one of our queries - * otherwise display them as "ignored" (in passive - * searches). - */ - - if (own_query) - rc->flags |= SR_DONT_SHOW; - rc->flags |= SR_IGNORED | SR_MEDIA; - } else { - matching++; - } - } - - if (0 == matching) { - /* We will not forward this packet */ - rs->status |= ST_MEDIA; /* Lacking proper media type */ - } - } - } - - search_results_identify_spam(n, rs); + search_finalize_results(rs, muid, browse); + search_results_identify_spam(n, rs, hostile); str_destroy_null(&info); + if (GNET_PROPERTY(log_query_hits)) + search_results_log(n, rs); + return rs; /* @@ -2985,7 +4135,7 @@ g_warning( "BAD %s from %s (via %s) -- %u/%u record%s parsed: %s", gmsg_node_infostr(n), vendor ? vendor : "????", node_infostr(n), - nr, rs->num_recs, 1 == rs->num_recs ? "" : "s", badmsg); + nr, rs->num_recs, plural(rs->num_recs), badmsg); if (GNET_PROPERTY(qhit_bad_debug) > 1) dump_hex(stderr, "Query Hit Data (BAD)", n->data, n->size); } @@ -3003,7 +4153,7 @@ update_neighbour_info(gnutella_node_t *n, gnet_results_set_t *rs) { const char *vendor; - guint32 old_weird = n->n_weird; + uint32 old_weird = n->n_weird; g_assert(gnutella_header_get_hops(&n->header) == 1); @@ -3098,23 +4248,23 @@ if ( !(rs->status & ST_FIREWALL) && /* Hit not marked "firewalled" */ - !host_addr_equal(n->addr, rs->addr) && /* Not socket's address */ + !host_addr_equiv(n->addr, rs->addr) && /* Not socket's address */ host_addr_is_routable(n->addr) && /* Not LAN or loopback */ host_addr_is_routable(rs->addr) ) { if ( (is_host_addr(n->gnet_qhit_addr) && - !host_addr_equal(n->gnet_qhit_addr, rs->addr) + !host_addr_equiv(n->gnet_qhit_addr, rs->addr) ) || (!is_host_addr(n->gnet_qhit_addr) && is_host_addr(n->gnet_pong_addr) && - !host_addr_equal(n->gnet_pong_addr, rs->addr) + !host_addr_equiv(n->gnet_pong_addr, rs->addr) ) ) { n->n_weird++; if (GNET_PROPERTY(search_debug) > 1) { g_warning("weird #%d %s advertised %s but now says " - "Query Hits from %s", + "hit from %s", n->n_weird, node_infostr(n), host_addr_to_string(is_host_addr(n->gnet_qhit_addr) ? n->gnet_qhit_addr : n->gnet_pong_addr), @@ -3125,8 +4275,10 @@ rs->status |= ST_ALIEN; /* Alien IP address detected */ } - if (GNET_PROPERTY(search_debug) > 3 && old_weird != n->n_weird) - dump_hex(stderr, "Query Hit Data (weird)", n->data, n->size); + if (GNET_PROPERTY(search_debug) > 3 && old_weird != n->n_weird) { + dump_hex(stderr, NODE_TALKS_G2(n) ? + "/QH2 data (weird)" : "Query Hit data (weird)", n->data, n->size); + } } /** @@ -3139,7 +4291,7 @@ * @param query the query string * @param mtype media type filtering (0 if none wanted) * @param whats_new whether search message is of the "What's New?" type. - * @param size if not-NULL, written with the size of the generated message + * @param size if not-NULL, written with the size of the generated message * @param query_key the GUESS query key to use (if non-NULL) * @param length length of query key * @param udp whether message will be sent via UDP @@ -3149,32 +4301,32 @@ */ static gnutella_msg_search_t * build_search_message(const guid_t *muid, const char *query, - unsigned mtype, gboolean whats_new, guint32 *size, - const void *query_key, guint8 length, gboolean udp) + unsigned mtype, bool whats_new, uint32 *size, + const void *query_key, uint8 length, bool udp) { static union { gnutella_msg_search_t data; char bytes1024; - guint64 align8; + uint64 align8; } msg; size_t msize; - guint16 flags; - gboolean is_sha1_search; + uint16 flags; + bool is_sha1_search; struct sha1 sha1; ggep_stream_t gs; size_t glen; - gboolean need_6 = FALSE; + bool need_6 = FALSE; g_assert(NULL == query_key || 0 != length); g_assert(NULL != query_key || 0 == length); STATIC_ASSERT(25 == sizeof msg.data); msize = sizeof msg.data; - + { gnutella_header_t *header = gnutella_msg_search_header(&msg.data); - guint8 hops; - gboolean is_leaf = settings_is_leaf(); + uint8 hops; + bool is_leaf = settings_is_leaf(); hops = !udp && !whats_new && GNET_PROPERTY(hops_random_factor) && !is_leaf ? random_value(GNET_PROPERTY(hops_random_factor)) : 0; @@ -3187,7 +4339,7 @@ query_key != NULL ? 1 : GNET_PROPERTY(my_ttl)); if ( - (guint32) gnutella_header_get_ttl(header) + + (uint32) gnutella_header_get_ttl(header) + gnutella_header_get_hops(header) > GNET_PROPERTY(hard_ttl_limit) ) { gnutella_header_set_ttl(header, @@ -3219,6 +4371,7 @@ flags |= QUERY_F_LEAF_GUIDED; /* GTKG supports leaf-guided queries */ flags |= QUERY_F_GGEP_H; /* GTKG understands GGEP "H" in hits */ flags |= QUERY_F_XML; /* GTKG can read XML in hits */ + flags |= QUERY_F_SR_UDP; /* GTKG supports semi-reliable UDP */ /* * We need special processing for OOB queries since the GUID has to be @@ -3233,9 +4386,9 @@ !GNET_PROPERTY(is_udp_firewalled) ) { host_addr_t primary = listen_addr_primary(); - guint32 ipv4 = ipv6_ready_advertised_ipv4(primary); + uint32 ipv4 = ipv6_ready_advertised_ipv4(primary); host_addr_t addr; - guint16 port; + uint16 port; guid_oob_get_addr_port(muid, &addr, &port); @@ -3256,14 +4409,14 @@ } gnutella_msg_search_set_flags(&msg.data, flags); - + /* * Are we dealing with a URN search? */ is_sha1_search = urn_get_sha1(query, &sha1); - { + { size_t len; len = strlen(query); @@ -3271,7 +4424,7 @@ g_warning("dropping too large query \"%s\"", query); goto error; } - + if (is_sha1_search) { msg.bytesmsize++ = '\\'; msg.bytesmsize++ = '\0'; @@ -3322,9 +4475,9 @@ */ if (QUERY_F_OOB_REPLY & flags) { - /** + /* * Indicate support for OOB v3. - * @see http://the-gdf.org/index.php?title=OutOfBandV3 + * See doc/gnutella/out-of-band-v3 */ if ( @@ -3335,8 +4488,15 @@ /* * Since our ultrapeers might not support OOB v3 and not understand * GGEP "SO" either, only add this if we're not OOB proxied. - * Otherwise, we won't receive OOB results. + * + * Otherwise, we won't receive OOB results: the query bearing "SO" + * will be understood by the servent with hits as OOBv3, and + * therefore it will send back a v3 indication of hits, which our + * ultrapeer may not understand and therefore drop! + * + * Hence avoid advertising "SO" if we are firewalled. */ + if (!ggep_stream_pack(&gs, GGEP_NAME(SO), NULL, 0, 0)) { g_carp("could not add GGEP \"SO\" extension to query"); goto error; @@ -3359,8 +4519,8 @@ */ #if 0 if (is_sha1_search) { - const guint8 type = GGEP_H_SHA1; - gboolean ok; + const uint8 type = GGEP_H_SHA1; + bool ok; ok = ggep_stream_begin(&gs, GGEP_NAME(H), 0) && ggep_stream_write(&gs, &type, 1) && @@ -3386,8 +4546,8 @@ */ if (query_key != NULL) { - gboolean ok; - guint8 scp = 0; + bool ok; + uint8 scp = 0; size_t scp_len; /* @@ -3408,7 +4568,7 @@ if (!ok) { g_carp("could not add GGEP \"QK\", " - "\"SCP\" and \"Z\" to GUESS query"); + "\"SCP\" and \"Z\" to GUESS query: %s", ggep_errstr()); goto error; } } @@ -3421,10 +4581,10 @@ */ if (GNET_PROPERTY(query_request_partials) && !whats_new) { - gboolean ok = ggep_stream_pack(&gs, GGEP_NAME(PR), NULL, 0, 0); + bool ok = ggep_stream_pack(&gs, GGEP_NAME(PR), NULL, 0, 0); if (!ok) { - g_carp("could not add GGEP \"PR\" to query"); + g_carp("could not add GGEP \"PR\" to query: %s", ggep_errstr()); /* It's OK, "PR" is not critical and can be missing */ } } @@ -3434,15 +4594,15 @@ */ if (mtype != 0) { - char media_typesizeof(guint64); + char media_typesizeof(uint64); unsigned len; - gboolean ok; + bool ok; - len = ggept_m_encode(mtype, media_type); + len = ggept_m_encode(mtype, media_type, sizeof media_type); ok = ggep_stream_pack(&gs, GGEP_NAME(M), media_type, len, 0); if (!ok) { - g_carp("could not add GGEP \"M\" to query"); + g_carp("could not add GGEP \"M\" to query: %s", ggep_errstr()); /* It's OK, "M" is not critical and can be missing */ } } @@ -3453,13 +4613,13 @@ */ if (whats_new) { - guchar b = 1; /* Feature #1 is "What's New?" */ - gboolean ok; + uchar b = 1; /* Feature #1 is "What's New?" */ + bool ok; ok = ggep_stream_pack(&gs, GGEP_NAME(WH), &b, sizeof(b), 0); if (!ok) { - g_carp("could not add GGEP \"WH\" to query"); + g_carp("could not add GGEP \"WH\" to query: %s", ggep_errstr()); goto error; } } @@ -3470,16 +4630,16 @@ */ if (need_6) { - gboolean ok; + bool ok; host_addr_t primary = listen_addr_primary(); - const guint8 *data = host_addr_ipv6(&primary); + const uint8 *data = host_addr_ipv6(&primary); g_assert(host_addr_is_ipv6(primary)); ok = ggep_stream_pack(&gs, GGEP_NAME(6), data, 16, 0); if (!ok) { - g_carp("could not add GGEP \"6\" to query"); + g_carp("could not add GGEP \"6\" to query: %s", ggep_errstr()); goto error; } } @@ -3514,7 +4674,7 @@ } } } else if (settings_running_ipv6()) { - guint8 b = 1; + uint8 b = 1; /* * Only running IPv6, let them know we're not interested in IPv4. @@ -3550,7 +4710,7 @@ msize - GTA_HEADER_SIZE); if (GNET_PROPERTY(search_debug) > 3) - g_debug("%squery \"%s\" message built with MUID %s", + g_debug("%squery \"%s\" message built with #%s", is_sha1_search ? "URN " : "", query, guid_hex_str(gnutella_header_get_muid( gnutella_msg_search_header(&msg.data)))); @@ -3561,10 +4721,6 @@ if (size != NULL) *size = msize; -if (GNET_PROPERTY(guess_client_debug) > 18 && query_key != NULL) { - dump_hex(stderr, "GUESS query", &msg.bytes, msize); -} - return wcopy(&msg.bytes, msize); error: @@ -3580,7 +4736,7 @@ * @param muid the MUID to use for the search message * @param query the query string * @param mtype media type filtering (0 if none wanted) - * @param size if not-NULL, written with the size of the generated message + * @param size if not-NULL, written with the size of the generated message * @param query_key the GUESS query key to use * @param length length of query key * @@ -3589,7 +4745,7 @@ */ gnutella_msg_search_t * build_guess_search_msg(const guid_t *muid, const char *query, - unsigned mtype, guint32 *size, const void *query_key, guint8 length) + unsigned mtype, uint32 *size, const void *query_key, uint8 length) { return build_search_message(muid, query, mtype, FALSE, size, query_key, length, TRUE); @@ -3605,14 +4761,14 @@ * @param query the query string * @param mtype media type filtering (0 if none wanted) * @param whats_new whether search message is of the "What's New?" type. - * @param size if not-NULL, written with the size of the generated message + * @param size if not-NULL, written with the size of the generated message * * @return NULL if we cannot build a suitable message (bad query string * containing only whitespaces, for instance). */ static gnutella_msg_search_t * build_search_msg(const guid_t *muid, const char *query, - unsigned mtype, gboolean whats_new, guint32 *size) + unsigned mtype, bool whats_new, uint32 *size) { return build_search_message(muid, query, mtype, whats_new, size, NULL, 0, FALSE); @@ -3624,16 +4780,16 @@ * On success a walloc()ated message is returned. Use wfree() to release * the memory. The size can be derived from the header, add GTA_HEADER_SIZE. * - * @returns NULL if we cannot build a suitable message (bad query string + * @return NULL if we cannot build a suitable message (bad query string * containing only whitespaces, for instance). */ static gnutella_msg_search_t * -search_build_msg(search_ctrl_t *sch) +search_build_msg(const search_ctrl_t *sch) { search_ctrl_check(sch); g_assert(sbool_get(sch->active)); g_assert(!sbool_get(sch->frozen)); - g_assert(sch->muids); + g_assert(sch->muids != NULL); /* Use the first MUID on the list (the last one allocated) */ @@ -3642,6 +4798,32 @@ } /** + * Create a G2 search request message (/Q2) for specified search. + * + * @return NULL if we cannot build a suitable message (unsupported query type). + */ +static pmsg_t * +search_g2_build_q2(const search_ctrl_t *sch) +{ + search_ctrl_check(sch); + g_assert(sbool_get(sch->active)); + g_assert(!sbool_get(sch->frozen)); + g_assert(sch->muids != NULL); + + if (sbool_get(sch->whats_new)) + return NULL; /* G2 does not support "What's New?" queries */ + + /* + * Use the first MUID on the list (the last one allocated). + * + * Because the /Q2 will be sent via TCP, there is no need to include a + * query key in the message. + */ + + return g2_build_q2(sch->muids->data, sch->query, sch->media_type, NULL, 0); +} + +/** * Fill supplied query hash vector `qhv' with relevant word/SHA1 entries for * the given search. */ @@ -3649,8 +4831,8 @@ search_qhv_fill(search_ctrl_t *sch, query_hashvec_t *qhv) { word_vec_t *wovec; - guint i; - guint wocnt; + uint i; + uint wocnt; search_ctrl_check(sch); @@ -3682,7 +4864,7 @@ /** * Can we re-issue a "What's New?" search? */ -static gboolean +static bool search_whats_new_can_reissue(void) { time_delta_t elapsed = delta_time(tm_time(), search_last_whats_new); @@ -3701,7 +4883,7 @@ char buf80; time_delta_t grace = WHATS_NEW_DELAY - elapsed + 1; - gm_snprintf(buf, sizeof buf, + str_bprintf(buf, sizeof buf, _("Must wait %u more seconds before resending \"What's New\""), (unsigned) grace); gcu_statusbar_warning(buf); @@ -3721,7 +4903,8 @@ static void search_send_packet(search_ctrl_t *sch, gnutella_node_t *n) { - gnutella_msg_search_t *msg; + gnutella_msg_search_t *msg = NULL; + pmsg_t *mb; size_t size; g_assert(sch != NULL); @@ -3749,10 +4932,11 @@ * --RAM, 04/04/2003 */ - if (n) { + if (n != NULL) { search_mark_sent_to_node(sch, n); - gmsg_search_sendto_one(n, sch->search_handle, msg, size); - goto cleanup; + if (!NODE_TALKS_G2(n)) + gmsg_search_sendto_one(n, sch->search_handle, msg, size); + goto gnet_done; } /* @@ -3763,32 +4947,35 @@ if (settings_is_leaf()) { if (sbool_get(sch->whats_new)) { if (!search_whats_new_can_reissue()) - goto cleanup; + goto gnet_done; search_last_whats_new = tm_time(); } else { search_starting(sch->search_handle); } search_mark_sent_to_connected_nodes(sch); - gmsg_search_sendto_all(node_all_nodes(), sch->search_handle, msg, size); - goto cleanup; + gmsg_search_sendto_all(node_all_gnet_nodes(), + sch->search_handle, msg, size); + goto gnet_done; } search_qhv_fill(sch, query_hashvec); if (sbool_get(sch->whats_new)) { - GSList *nodes; + pslist_t *nodes; if (!search_whats_new_can_reissue()) - goto cleanup; + goto gnet_done; + + nodes = qrt_build_query_target( + query_hashvec, 0, WHATS_NEW_TTL, TRUE, NULL); - nodes = qrt_build_query_target(query_hashvec, 0, WHATS_NEW_TTL, NULL); if (nodes != NULL) { - pmsg_t *mb = gmsg_to_pmsg(msg, size); + mb = gmsg_to_pmsg(msg, size); gmsg_mb_sendto_all(nodes, mb); - pmsg_free(mb); + pmsg_free_null(&mb); search_last_whats_new = tm_time(); } - g_slist_free(nodes); + pslist_free(nodes); } else { /* * Enqueue search in global SQ for later dynamic querying dispatching. @@ -3800,8 +4987,37 @@ /* FALL THROUGH */ -cleanup: - wfree(msg, size); +gnet_done: + WFREE_NULL(msg, size); + + /* + * Now handle the G2 network side. + */ + + if (n != NULL && NODE_TALKS_G2(n)) { + mb = search_g2_build_q2(sch); + if (mb != NULL) + sq_putq(n->searchq, sch->search_handle, mb); + /* Node already marked as "having been sent to" in code above */ + } + + if (NULL == n) { + mb = search_g2_build_q2(sch); + if (mb != NULL) { + const pslist_t *sl; + + PSLIST_FOREACH(node_all_g2_nodes(), sl) { + const gnutella_node_t *n2 = sl->data; + + if (NULL == n2->searchq) + continue; /* Skip non-writable node */ + + search_mark_sent_to_node(sch, n2); + sq_putq(n2->searchq, sch->search_handle, pmsg_clone(mb)); + } + pmsg_free_null(&mb); + } + } } /** @@ -3815,24 +5031,33 @@ search_ctrl_check(sch); g_assert(sbool_get(sch->active)); - g_assert(n != NULL); + node_check(n); /* * If we're in UP mode, we're using dynamic querying for our own queries. + * If it's a G2 node, we're always sending out the query. */ - if (settings_is_leaf()) { + if (settings_is_leaf() || NODE_TALKS_G2(n)) { /* * Send search to new node if not already done and if the search - * is still active and if we're not in GUESS querying mode. + * is still active. */ - if ( - !search_already_sent_to_node(sch, n) && - !sbool_get(sch->frozen) && - NULL == sch->guess - ) { - search_send_packet(sch, n); + if (!search_already_sent_to_node(sch, n) && !sbool_get(sch->frozen)) { + /* + * If a GUESS query is active, check whether we have already + * queried the node. A GUESS search will skip nodes to which we + * are already connected via TCP, but we may have not queried that + * host yet. + */ + + if ( + NULL == sch->guess || + !guess_already_queried(sch->guess, n->gnet_addr, n->gnet_port) + ) { + search_send_packet(sch, n); + } } } @@ -3846,28 +5071,28 @@ * the `search_by_muid' table. */ static void -search_add_new_muid(search_ctrl_t *sch, struct guid *muid) +search_add_new_muid(search_ctrl_t *sch, guid_t *muid) { - guint count; + uint count; - g_assert(NULL == g_hash_table_lookup(search_by_muid, muid)); + g_assert(!htable_contains(search_by_muid, muid)); if (sch->muids) { /* If this isn't the first muid -- requerying */ search_reset_sent_nodes(sch); search_reset_sent_node_ids(sch); } - sch->muids = g_slist_prepend(sch->muids, muid); - g_hash_table_insert(search_by_muid, muid, sch); + sch->muids = pslist_prepend(sch->muids, muid); + htable_insert(search_by_muid, muid, sch); /* * If we got more than MUID_MAX entries in the list, chop last items. */ - count = g_slist_length(sch->muids); + count = pslist_length(sch->muids); while (count-- > MUID_MAX) { - GSList *last = g_slist_last(sch->muids); + pslist_t *last = pslist_last(sch->muids); if (sch->guess != NULL && guess_is_search_muid(last->data)) { /* * Do not remove an active GUESS MUID or we would not be @@ -3879,13 +5104,13 @@ * instead. */ g_assert(count >= 1); - last = g_slist_nth(sch->muids, count - 1); + last = pslist_nth(sch->muids, count - 1); g_assert(!guess_is_search_muid(last->data)); } - g_hash_table_remove(search_by_muid, last->data); + htable_remove(search_by_muid, last->data); wfree(last->data, GUID_RAW_SIZE); - sch->muids = g_slist_remove_link(sch->muids, last); - g_slist_free_1(last); + sch->muids = pslist_remove_link(sch->muids, last); + pslist_free_1(last); } } @@ -3902,11 +5127,11 @@ /** * @return whether search has expired. */ -static gboolean +static bool search_expired(const search_ctrl_t *sch) { time_t ct; - guint lt; + uint lt; search_ctrl_check(sch); @@ -3934,12 +5159,12 @@ * * @return a new MUID that can be wfree()'d when done. */ -static struct guid * -search_new_muid(gboolean initial) +static guid_t * +search_new_muid(bool initial) { - struct guid *muid; + guid_t *muid; host_addr_t addr; - guint32 ipv4; + uint32 ipv4; int i; WALLOC(muid); @@ -3970,7 +5195,17 @@ guid_query_muid(muid, initial); } - if (NULL == g_hash_table_lookup(search_by_muid, muid)) + /* + * Make sure the search MUID is not that of an older search that we + * keep around or that of a recently expired GUESS query (since active + * GUESS queries are already held in `search_by_muid'). + * --RAM, 2014-02-04 + */ + + if ( + !htable_contains(search_by_muid, muid) && + !guess_is_search_muid(muid) + ) return muid; } @@ -3979,7 +5214,7 @@ return NULL; } -static guint32 +static uint32 search_max_results_for_ui(const search_ctrl_t *sch) { if (sbool_get(sch->browse)) @@ -3998,10 +5233,10 @@ static void update_one_reissue_timeout(search_ctrl_t *sch) { - guint32 max_items; + uint32 max_items; unsigned percent; float factor; - guint32 tm; + uint32 tm; search_ctrl_check(sch); g_assert(sbool_get(sch->active)); @@ -4027,8 +5262,8 @@ factor = (percent < 10) ? 1.0 : 1.0 + (percent - 10) * (percent - 10) / 550.0; - tm = (guint32) sch->reissue_timeout; - tm = (guint32) (MAX(tm, SEARCH_MIN_RETRY) * factor); + tm = (uint32) sch->reissue_timeout; + tm = (uint32) (MAX(tm, SEARCH_MIN_RETRY) * factor); /* * Otherwise we also add a new timer. If the search was stopped, this @@ -4053,7 +5288,7 @@ static void search_reissue(search_ctrl_t *sch) { - struct guid *muid; + guid_t *muid; search_ctrl_check(sch); g_return_if_fail(!sbool_get(sch->frozen)); @@ -4108,8 +5343,8 @@ * * The data given is the search to be reissued. */ -static gboolean -search_reissue_timeout_callback(gpointer data) +static bool +search_reissue_timeout_callback(void *data) { search_ctrl_t *sch = data; @@ -4129,9 +5364,9 @@ */ static void search_send_query_status(search_ctrl_t *sch, - const struct nid *node_id, guint16 kept) + const struct nid *node_id, uint16 kept) { - struct gnutella_node *n; + gnutella_node_t *n; n = node_active_by_id(node_id); if (n == NULL) @@ -4152,16 +5387,14 @@ /** * Send an unsolicited "Query Status Response" to the specified node ID * about the results we kept so far for the relevant search. - * -- hash table iterator callback + * -- hash set iterator callback */ static void -search_send_status(gpointer key, gpointer unused_value, gpointer udata) +search_send_status(const void *key, void *udata) { const struct nid *node_id = key; search_ctrl_t *sch = udata; - guint16 kept; - - (void) unused_value; + uint16 kept; /* * The 0xffff value is a magic number telling them to stop the search, @@ -4179,21 +5412,20 @@ static void search_update_results(search_ctrl_t *sch) { - g_hash_table_foreach(sch->sent_node_ids, search_send_status, sch); + hset_foreach(sch->sent_node_ids, search_send_status, sch); } /** * Send an unsolicited "Query Status Response" to the specified node ID * informing it that the search was closed. - * -- hash table iterator callback + * -- hash set iterator callback */ static void -search_send_closed(gpointer key, gpointer unused_value, gpointer udata) +search_send_closed(const void *key, void *udata) { const struct nid *node_id = key; search_ctrl_t *sch = udata; - (void) unused_value; search_send_query_status(sch, node_id, CLOSED_SEARCH); } @@ -4205,7 +5437,7 @@ { search_ctrl_t *sch = search_find_by_handle(sh); - g_hash_table_foreach(sch->sent_node_ids, search_send_closed, sch); + hset_foreach(sch->sent_node_ids, search_send_closed, sch); } /** @@ -4214,13 +5446,16 @@ static void search_dequeue_all_nodes(gnet_search_t sh) { - const GSList *sl; + const pslist_t *sl; + + PSLIST_FOREACH(node_all_nodes(), sl) { + gnutella_node_t *n = sl->data; + squeue_t *sq; - for (sl = node_all_nodes(); sl; sl = g_slist_next(sl)) { - struct gnutella_node *n = (struct gnutella_node *) sl->data; - squeue_t *sq = NODE_SQUEUE(n); + node_check(n); - if (sq) + sq = NODE_SQUEUE(n); + if (sq != NULL) sq_search_closed(sq, sh); } @@ -4243,13 +5478,12 @@ /** * Garbage collector -- callout queue periodic callback. */ -static gboolean +static bool search_gc(void *unused_cq) { (void) unused_cq; query_muid_map_garbage_collect(); - oob_reply_acks_garbage_collect(); return TRUE; /* Keep calling */ } @@ -4258,22 +5492,28 @@ *** Public functions ***/ -G_GNUC_COLD void +void G_COLD search_init(void) { - search_by_muid = g_hash_table_new(guid_hash, guid_eq); - search_handle_map = idtable_new(); - sha1_to_search = g_hash_table_new(sha1_hash, sha1_eq); + TOKENIZE_CHECK_SORTED(g2_qh2_children); + TOKENIZE_CHECK_SORTED(g2_qh2_h_children); + TOKENIZE_CHECK_SORTED(g2_qh2_urn); + + search_by_muid = htable_create(HASH_KEY_FIXED, GUID_RAW_SIZE); + search_handle_map = idtable_new(32); + sha1_to_search = htable_create(HASH_KEY_FIXED, SHA1_RAW_SIZE); /* Max: 128 unique words / URNs! */ query_hashvec = qhvec_alloc(QRP_HVEC_MAX); - oob_reply_acks_init(); - query_muid_map_init(); + query_muid_map_init(); guess_stg = sectoken_gen_new(GUESS_KEYS, GUESS_REFRESH_PERIOD); + ora_stg = sectoken_gen_new(ORA_KEYS, OOB_REPLY_ACK_TIMEOUT); + ora_secure = aging_make(OOB_REPLY_ACK_TIMEOUT, + gnet_host_hash, gnet_host_equal, gnet_host_free_atom2); cq_periodic_main_add(SEARCH_GC_PERIOD * 1000, search_gc, NULL); } -G_GNUC_COLD void +void G_COLD search_shutdown(void) { while (sl_search_ctrl != NULL) { @@ -4284,17 +5524,18 @@ search_close(sch->search_handle); } - g_assert(idtable_ids(search_handle_map) == 0); + g_assert(0 == idtable_count(search_handle_map)); - gm_hash_table_destroy_null(&search_by_muid); - gm_hash_table_destroy_null(&sha1_to_search); + htable_free_null(&search_by_muid); + htable_free_null(&sha1_to_search); idtable_destroy(search_handle_map); search_handle_map = NULL; qhvec_free(query_hashvec); - oob_reply_acks_close(); query_muid_map_close(); sectoken_gen_free_null(&guess_stg); + sectoken_gen_free_null(&ora_stg); + aging_destroy(&ora_secure); } /** @@ -4313,7 +5554,7 @@ while (i-- > 0) { struct gnutella_host host; host_addr_t addr; - guint16 port; + uint16 port; host = gnet_host_vec_get(alt, i); addr = gnet_host_get_addr(&host); @@ -4341,7 +5582,7 @@ if (ignored) { const char *vendor = vendor_get_name(rs->vcode); g_warning("ignored %u invalid alt-loc%s in hits from %s (%s)", - ignored, ignored == 1 ? "" : "s", + ignored, plural(ignored), host_addr_port_to_string(rs->addr, rs->port), vendor ? vendor : "????"); } @@ -4350,8 +5591,8 @@ static void search_results_set_flag_records(gnet_results_set_t *rs) { - const GSList *sl; - gboolean need_push = FALSE; + const pslist_t *sl; + bool need_push = FALSE; if (rs->guid != NULL && !guid_is_blank(rs->guid)) { if ((rs->status & ST_FIREWALL) || !host_is_valid(rs->addr, rs->port)) { @@ -4359,8 +5600,8 @@ } } - for (sl = rs->records; NULL != sl; sl = g_slist_next(sl)) { - const shared_file_t *sf; + PSLIST_FOREACH(rs->records, sl) { + shared_file_t *sf; gnet_record_t *rc = sl->data; if (need_push) { @@ -4378,7 +5619,7 @@ rc->flags |= SR_PARTIAL; } } else { - enum ignore_val reason; + ignore_val_t reason; reason = ignore_is_requested(rc->filename, rc->size, rc->sha1); switch (reason) { @@ -4411,6 +5652,7 @@ } } } + shared_file_unref(&sf); } } @@ -4421,12 +5663,12 @@ static void search_results_set_auto_download(gnet_results_set_t *rs) { - const GSList *sl; + const pslist_t *sl; if (!GNET_PROPERTY(auto_download_identical)) return; - for (sl = rs->records; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(rs->records, sl) { gnet_record_t *rc = sl->data; fileinfo_t *fi; @@ -4435,12 +5677,12 @@ fi = file_info_has_identical(rc->sha1, rc->size); if (fi) { - guint32 flags = 0; - + uint32 flags = 0; + flags |= (rs->status & ST_FIREWALL) ? SOCK_F_PUSH : 0; flags |= !host_is_valid(rs->addr, rs->port) ? SOCK_F_PUSH : 0; flags |= (rs->status & ST_TLS) ? SOCK_F_TLS : 0; - + download_auto_new(rc->filename, rc->size, rs->addr, @@ -4474,18 +5716,27 @@ /** - * This routine is called for each Query Hit packet we receive out of + * This routine is called for each Query Hit or /QH2 packet we receive out of * a browse-host request, since we know the target search result, and * we don't need to bother with forwarding that message. + * + * @param n the node receiving the hit + * @param sh the "browse-host" search handle + * @param t the message tree (for G2, NULL for Gnutella) */ void -search_browse_results(gnutella_node_t *n, gnet_search_t sh) +search_browse_results(gnutella_node_t *n, gnet_search_t sh, const g2_tree_t *t) { gnet_results_set_t *rs; - GSList *search = NULL; - GSList *sl; + pslist_t *search = NULL; + pslist_t *sl; + hostiles_flags_t flags; + + if (NULL == t) + rs = get_results_set(n, TRUE, &flags); + else + rs = get_g2_results_set(n, t, TRUE, &flags); - rs = get_results_set(n, TRUE); if (rs == NULL) return; @@ -4495,11 +5746,11 @@ */ { search_ctrl_t *sch = search_find_by_handle(sh); - + search_ctrl_check(sch); - + if (!sbool_get(sch->frozen)) - search = g_slist_prepend(search, + search = pslist_prepend(search, uint_to_pointer(sch->search_handle)); } @@ -4509,15 +5760,15 @@ */ if (GNET_PROPERTY(browse_copied_to_passive)) { - guint32 max_items = GNET_PROPERTY(passive_search_max_results); + uint32 max_items = GNET_PROPERTY(passive_search_max_results); - for (sl = sl_passive_ctrl; sl != NULL; sl = g_slist_next(sl)) { + PSLIST_FOREACH(sl_passive_ctrl, sl) { search_ctrl_t *sch = sl->data; search_ctrl_check(sch); if (!sbool_get(sch->frozen) && sch->items < max_items) - search = g_slist_prepend(search, + search = pslist_prepend(search, uint_to_pointer(sch->search_handle)); } } @@ -4526,31 +5777,52 @@ search_results_set_flag_records(rs); search_results_set_auto_download(rs); search_fire_got_results(search, NULL, rs); - gm_slist_free_null(&search); + pslist_free_null(&search); } search_free_r_set(rs); } /** - * This routine is called for each Query Hit packet we receive. + * This routine is called for each hit packet (Gnutella and G2) we receive. + * + * @param n the node receiving the hit + * @param t the message tree (for G2, NULL for Gnutella) + * @param results if not NULL, where amount of results in hit is written back * * @returns whether the message should be dropped, i.e. FALSE if OK. * If the message should not be dropped, `results' is filled with the * amount of results contained in the query hit. */ -gboolean -search_results(gnutella_node_t *n, int *results) +static bool +search_results_process(gnutella_node_t *n, const g2_tree_t *t, int *results) { gnet_results_set_t *rs; - GSList *sl; - gboolean drop_it = FALSE; - gboolean forward_it = TRUE; - gboolean dispatch_it = TRUE; - GSList *selected_searches = NULL; - guint32 max_items; + pslist_t *sl; + bool drop_it = FALSE; + bool forward_it = TRUE; + bool dispatch_it = TRUE; + pslist_t *selected_searches = NULL; + uint32 max_items; + hostiles_flags_t flags; + const guid_t *muid; + guid_t muid_buf; - g_assert(results != NULL); + g_assert(!(NULL != t) == !NODE_TALKS_G2(n)); + + /* + * Get the MUID of the query that produced this hit. + */ + + if (NULL == t) { + muid = gnutella_header_get_muid(&n->header); + } else { + muid = g2_msg_get_muid(t, &muid_buf); + if (NULL == muid) { + gnet_stats_count_dropped(n, MSG_DROP_BAD_RESULT); + return TRUE; + } + } /* * We'll dispatch to non-frozen passive searches, and to the active search @@ -4559,25 +5831,24 @@ max_items = GNET_PROPERTY(passive_search_max_results); - for (sl = sl_passive_ctrl; sl != NULL; sl = g_slist_next(sl)) { + PSLIST_FOREACH(sl_passive_ctrl, sl) { search_ctrl_t *sch = sl->data; search_ctrl_check(sch); if (!sbool_get(sch->frozen) && sch->items < max_items) - selected_searches = g_slist_prepend(selected_searches, + selected_searches = pslist_prepend(selected_searches, uint_to_pointer(sch->search_handle)); } { search_ctrl_t *sch; - sch = g_hash_table_lookup(search_by_muid, - gnutella_header_get_muid(&n->header)); + sch = htable_lookup(search_by_muid, muid); max_items = sch ? search_max_results_for_ui(sch) : 0; if (sch && !sbool_get(sch->frozen) && sch->items < max_items) - selected_searches = g_slist_prepend(selected_searches, + selected_searches = pslist_prepend(selected_searches, uint_to_pointer(sch->search_handle)); } @@ -4588,7 +5859,11 @@ * based on the SHA1, the packet is only parsed for validation. */ - rs = get_results_set(n, FALSE); + if (NULL == t) + rs = get_results_set(n, FALSE, &flags); + else + rs = get_g2_results_set(n, t, FALSE, &flags); + if (rs == NULL) { /* * get_results_set takes care of telling the stats that @@ -4599,7 +5874,9 @@ } g_assert(rs->num_recs > 0); - *results = rs->num_recs; + + if (results != NULL) + *results = rs->num_recs; /* * If we're handling a message from our immediate neighbour, grab the @@ -4626,10 +5903,13 @@ (rs->status & (ST_SPAM | ST_EVIL)) && ( (ST_UDP|ST_GOOD_TOKEN) == ((ST_UDP|ST_GOOD_TOKEN) & rs->status) || - (0 == rs->hops && !NODE_IS_UDP(n)) + (0 == rs->hops && !NODE_IS_UDP(n)) || + (ST_UDP|ST_G2) == ((ST_UDP|ST_G2) & rs->status) ) ) { - hostiles_dynamic_add(rs->last_hop, "spam/evil query hits"); + host_addr_t n_addr = (0 == rs->hops) ? rs->last_hop : rs->addr; + + hostiles_dynamic_add(n_addr, "spam/evil query hits", flags); rs->status |= ST_HOSTILE; /* @@ -4637,7 +5917,7 @@ * in the future. */ - if (0 == rs->hops && (ST_UDP & rs->status)) { + if (0 == rs->hops && ST_UDP == ((ST_UDP|ST_G2) & rs->status)) { hostiles_spam_add(rs->last_hop, rs->port); } } @@ -4673,6 +5953,7 @@ } } else { if ( + t != NULL || /* Don't forward G2 hits, don't pass them to DQ */ !dq_got_results(gnutella_header_get_muid(&n->header), rs->num_recs, rs->status) ) @@ -4725,45 +6006,116 @@ */ if (dispatch_it && selected_searches != NULL) { - const guid_t *muid = gnutella_header_get_muid(&n->header); const guid_t *guess_muid = NULL; + /* + * When dealing with a GUESS search we have to pass in the GUESS + * query MUID so that this parameter may be passed back by the GUI + * once it has filtered results and we know we're being notified + * about kept results for a GUESS search (and which one), which in + * turn allows us to track the amount of meaningful results that a + * GUESS query generates. + * + * So this GUESS MUID we're giving to the GUID is to be construed + * as an opaque ID that allows us to tie our ends in the core side. + * + * This complication is only necessary because results filtering + * happens in the GUI and not in the core as it should (FIXME, but + * this is far from trivial as the whole filtering configuration + * must be exchanged between the core and the GUI, along with the + * associated statistics, for proper GUI display and editing). + */ + if (guess_is_search_muid(muid)) { rs->status |= ST_GUESS; guess_got_results(muid, rs->num_recs); guess_muid = muid; + + if (GNET_PROPERTY(guess_client_debug) > 5) { + search_ctrl_t *sch; + sch = htable_lookup(search_by_muid, muid); + if (NULL == sch) { + g_carp("%s(): GUESS search %s not found by MUID", + G_STRFUNC, guid_to_string(muid)); + } else { + void *data = pslist_find(selected_searches, + uint_to_pointer(sch->search_handle)); + if (NULL == data) { + g_carp("%s(): GUESS search %s not selected!", + G_STRFUNC, guid_to_string(muid)); + } else { + g_debug("GUESS delivering hit with %u record%s " + "for \"%s\" %s", + rs->num_recs, plural(rs->num_recs), + sch->name, guid_to_string(muid)); + } + } + } } search_results_set_flag_records(rs); + + if (GNET_PROPERTY(log_query_hit_records)) + search_results_records_log(n, rs); + search_fire_got_results(selected_searches, guess_muid, rs); /* * Record activity on each search to which we're dispatching results. */ - GM_SLIST_FOREACH(selected_searches, sl) { + PSLIST_FOREACH(selected_searches, sl) { gnet_search_t sh = pointer_to_uint(sl->data); search_ctrl_t *sch = search_find_by_handle(sh); wd_kick(sch->activity); + + if (GNET_PROPERTY(search_debug) > 1) { + g_debug("SEARCH \"%s\" got %u record%s for %s#%s from %s", + sch->name, rs->num_recs, plural(rs->num_recs), + (ST_GUESS & rs->status) ? "GUESS " : "", + guid_to_string(muid), node_infostr(n)); + } } } search_free_r_set(rs); final_cleanup: - g_slist_free(selected_searches); + pslist_free(selected_searches); return drop_it || !forward_it; } /** + * This routine is called for each Query Hit packet we receive. + * + * @returns whether the message should be dropped, i.e. FALSE if OK. + * If the message should not be dropped, `results' is filled with the + * amount of results contained in the query hit. + */ +bool +search_results(gnutella_node_t *n, int *results) +{ + return search_results_process(n, NULL, results); +} + +/** + * This routine is called for each /QH2 packet we receive. + */ +void +search_g2_results(gnutella_node_t *n, const g2_tree_t *t) +{ + search_results_process(n, t, NULL); +} + +/** * Check whether we can send another query for this search. * * @returns TRUE if we can send, with the emitted counter incremented, or FALSE * if the query should just be ignored. */ -gboolean +bool search_query_allowed(gnet_search_t sh) { search_ctrl_t *sch = search_find_by_handle(sh); @@ -4801,10 +6153,10 @@ search_mark_query_sent(sch); } -static gboolean -search_remove_sha1_key(void *key, void *value, void *data) +static bool +search_remove_sha1_key(const void *key, void *value, void *data) { - struct sha1 *sha1 = key; + const struct sha1 *sha1 = key; gnet_search_t sh = pointer_to_uint(value); search_ctrl_t *sch = data; @@ -4827,14 +6179,14 @@ if (0 == sch->sha1_downloaded) return; - g_hash_table_foreach_remove(sha1_to_search, search_remove_sha1_key, sch); + htable_foreach_remove(sha1_to_search, search_remove_sha1_key, sch); g_assert(0 == sch->sha1_downloaded); } struct search_sha1_context { gnet_search_t sh; - GSList *sl; + pslist_t *sl; }; /** @@ -4842,14 +6194,14 @@ * for the search. */ static void -search_add_associated_sha1(void *key, void *value, void *data) +search_add_associated_sha1(const void *key, void *value, void *data) { - struct sha1 *sha1 = key; + const struct sha1 *sha1 = key; gnet_search_t sh = pointer_to_uint(value); struct search_sha1_context *ctx = data; if (sh == ctx->sh) { - ctx->sl = g_slist_prepend(ctx->sl, sha1); + ctx->sl = pslist_prepend_const(ctx->sl, sha1); } } @@ -4867,10 +6219,10 @@ g_return_if_fail(sch); search_ctrl_check(sch); - + if (sbool_get(sch->track_sha1)) { - if (!gm_hash_table_contains(sha1_to_search, sha1)) { - gm_hash_table_insert_const(sha1_to_search, atom_sha1_get(sha1), + if (!htable_contains(sha1_to_search, sha1)) { + htable_insert(sha1_to_search, atom_sha1_get(sha1), uint_to_pointer(sh)); sch->sha1_downloaded++; @@ -4893,11 +6245,11 @@ void search_dissociate_sha1(const struct sha1 *sha1) { - if (gm_hash_table_contains(sha1_to_search, sha1)) { + if (htable_contains(sha1_to_search, sha1)) { gnet_search_t sh; search_ctrl_t *sch; - sh = pointer_to_uint(g_hash_table_lookup(sha1_to_search, sha1)); + sh = pointer_to_uint(htable_lookup(sha1_to_search, sha1)); sch = search_probe_by_handle(sh); search_ctrl_check(sch); @@ -4913,7 +6265,7 @@ } sch->sha1_downloaded--; - g_hash_table_remove(sha1_to_search, sha1); + htable_remove(sha1_to_search, sha1); atom_sha1_free(sha1); /* @@ -4936,7 +6288,7 @@ /** * @return list of SHA1 associated with a given search, NULL if none. */ -GSList * +pslist_t * search_associated_sha1(gnet_search_t sh) { search_ctrl_t *sch = search_probe_by_handle(sh); @@ -4951,7 +6303,7 @@ ctx.sh = sh; ctx.sl = NULL; - g_hash_table_foreach(sha1_to_search, search_add_associated_sha1, &ctx); + htable_foreach(sha1_to_search, search_add_associated_sha1, &ctx); return ctx.sl; } @@ -4982,6 +6334,8 @@ g_return_if_fail(sch); search_ctrl_check(sch); + entropy_harvest_single(VARLEN(sh)); + /* * This needs to be done before the handle of the search is reclaimed. */ @@ -4998,10 +6352,10 @@ * --BLUE 26/05/2002 */ - sl_search_ctrl = g_slist_remove(sl_search_ctrl, sch); + sl_search_ctrl = pslist_remove(sl_search_ctrl, sch); if (sbool_get(sch->passive)) - sl_passive_ctrl = g_slist_remove(sl_passive_ctrl, sch); + sl_passive_ctrl = pslist_remove(sl_passive_ctrl, sch); if (sbool_get(sch->browse) && sch->download != NULL) download_abort_browse_host(sch->download, sh); @@ -5013,13 +6367,13 @@ cq_periodic_remove(&sch->reissue_ev); if (sch->muids) { - GSList *sl; + pslist_t *sl; - for (sl = sch->muids; sl; sl = g_slist_next(sl)) { - g_hash_table_remove(search_by_muid, sl->data); + PSLIST_FOREACH(sch->muids, sl) { + htable_remove(search_by_muid, sl->data); wfree(sl->data, GUID_RAW_SIZE); } - gm_slist_free_null(&sch->muids); + pslist_free_null(&sch->muids); } search_free_sent_nodes(sch); @@ -5055,7 +6409,7 @@ * Set the reissue timeout of a search. */ void -search_set_reissue_timeout(gnet_search_t sh, guint32 timeout) +search_set_reissue_timeout(gnet_search_t sh, uint32 timeout) { search_ctrl_t *sch = search_find_by_handle(sh); @@ -5072,7 +6426,7 @@ /** * Get the reissue timeout of a search. */ -guint32 +uint32 search_get_reissue_timeout(gnet_search_t sh) { search_ctrl_t *sch = search_find_by_handle(sh); @@ -5098,7 +6452,7 @@ /** * Get the initial lifetime (in hours) of a search. */ -guint +uint search_get_lifetime(gnet_search_t sh) { search_ctrl_t *sch = search_find_by_handle(sh); @@ -5153,7 +6507,7 @@ * * @return TRUE if watchdog should remain active, FALSE to put it to sleep. */ -static gboolean +static bool search_is_idle(watchdog_t *unused_wd, void *data) { search_ctrl_t *sch = data; @@ -5216,7 +6570,7 @@ */ enum search_new_result search_new(gnet_search_t *ptr, const char *query, unsigned mtype, - time_t create_time, guint lifetime, guint32 reissue_timeout, guint32 flags) + time_t create_time, uint lifetime, uint32 reissue_timeout, uint32 flags) { const char *endptr; search_ctrl_t *sch; @@ -5225,7 +6579,14 @@ g_assert(ptr); g_assert(utf8_is_valid_string(query)); - + + /* + * Harvest entropy. + */ + + entropy_harvest_many(query, strsize(query), VARLEN(mtype), + VARLEN(lifetime), VARLEN(reissue_timeout), VARLEN(flags), NULL); + /* * Canonicalize the query we're sending. */ @@ -5260,7 +6621,7 @@ goto failure; } else if ( byte_count > MAX_SEARCH_TERM_BYTES || - utf8_char_count(qdup) > MAX_SEARCH_TERM_CHARS + utf8_strlen(qdup) > MAX_SEARCH_TERM_CHARS ) { if (GNET_PROPERTY(search_debug) > 1) { g_warning("rejected too long query string: \"%s\"", qdup); @@ -5342,14 +6703,14 @@ } sch->sent_nodes = - g_hash_table_new(sent_node_hash_func, sent_node_compare); - sch->sent_node_ids = g_hash_table_new(nid_hash, nid_equal); + hset_create_any(gnet_host_hash, NULL, gnet_host_equiv); + sch->sent_node_ids = hset_create_any(nid_hash, nid_hash2, nid_equal); } - sl_search_ctrl = g_slist_prepend(sl_search_ctrl, sch); + sl_search_ctrl = pslist_prepend(sl_search_ctrl, sch); if (sbool_get(sch->passive)) - sl_passive_ctrl = g_slist_prepend(sl_passive_ctrl, sch); + sl_passive_ctrl = pslist_prepend(sl_passive_ctrl, sch); *ptr = sch->search_handle; return SEARCH_NEW_SUCCESS; @@ -5364,7 +6725,7 @@ * The GUI updates us on the amount of items displayed in the search. */ void -search_update_items(gnet_search_t sh, guint32 items) +search_update_items(gnet_search_t sh, uint32 items) { search_ctrl_t *sch = search_find_by_handle(sh); @@ -5379,7 +6740,7 @@ * auto-download. */ void -search_add_kept(gnet_search_t sh, const guid_t *muid, guint32 kept) +search_add_kept(gnet_search_t sh, const guid_t *muid, uint32 kept) { search_ctrl_t *sch = search_find_by_handle(sh); @@ -5426,6 +6787,8 @@ search_ctrl_check(sch); g_assert(sbool_get(sch->frozen));/* Coming from search_new(), or resuming */ + entropy_harvest_single(VARLEN(sh)); + sch->frozen = sbool_set(FALSE); if (sbool_get(sch->active)) { @@ -5444,16 +6807,18 @@ search_ctrl_check(sch); - if (sbool_get(sch->frozen)) - return; + entropy_harvest_single(VARLEN(sh)); - sch->frozen = sbool_set(TRUE); - wd_sleep(sch->activity); - guess_cancel(&sch->guess, FALSE); + if (!sbool_get(sch->frozen)) { + sch->frozen = sbool_set(TRUE); + wd_sleep(sch->activity); + guess_cancel(&sch->guess, FALSE); - if (sbool_get(sch->active)) { - update_one_reissue_timeout(sch); + if (sbool_get(sch->active)) { + update_one_reissue_timeout(sch); + } } + search_status_changed(sh); } @@ -5462,8 +6827,8 @@ * we kept sofar for the last requery, via "kept", or FALSE if the search * is NULL or it has been frozen (meaning new results must be ignored). */ -static gboolean -search_get_kept_results(const search_ctrl_t *sch, guint32 *kept) +static bool +search_get_kept_results(const search_ctrl_t *sch, uint32 *kept) { if (sch == NULL) return FALSE; @@ -5491,12 +6856,12 @@ * the amount of results we kept sofar for the last requery, via "kept", * or FALSE if we did not find any search. */ -gboolean -search_get_kept_results_by_muid(const struct guid *muid, guint32 *kept) +bool +search_get_kept_results_by_muid(const guid_t *muid, uint32 *kept) { search_ctrl_t *sch; - sch = g_hash_table_lookup(search_by_muid, muid); + sch = htable_lookup(search_by_muid, muid); g_assert(sch == NULL || sbool_get(sch->active)); /* No MUID if not active */ @@ -5506,12 +6871,12 @@ /** * Is search running a GUESS query? */ -gboolean -search_running_guess(const struct guid *muid) +bool +search_running_guess(const guid_t *muid) { search_ctrl_t *sch; - sch = g_hash_table_lookup(search_by_muid, muid); + sch = htable_lookup(search_by_muid, muid); g_assert(sch == NULL || sbool_get(sch->active)); /* No MUID if not active */ @@ -5521,7 +6886,7 @@ /** * @returns amount of hits kept by the search, identified by its handle */ -guint32 +uint32 search_get_kept_results_by_handle(gnet_search_t sh) { search_ctrl_t *sch; @@ -5562,21 +6927,89 @@ */ void search_oob_pending_results( - gnutella_node_t *n, const struct guid *muid, int hits, - gboolean udp_firewalled, gboolean secure) + gnutella_node_t *n, const guid_t *muid, int hits, + bool udp_firewalled, bool secure) { search_ctrl_t *sch; struct array token_opaque; - guint32 token; - guint32 kept; + uint32 token; + uint32 kept; unsigned ask; g_assert(NODE_IS_UDP(n)); g_assert(hits > 0); + /* + * If remote host promising hits is a known spammer or evil host, ignore. + */ + + if (hostiles_spam_check(n->addr, n->port)) { + if (GNET_PROPERTY(search_debug)) { + g_debug("ignoring %d %sOOB hit%s for query #%s " + "(%s is a caught spammer)", + hits, + guess_is_search_muid(muid) ? "GUESS " : "", + plural(hits), guid_hex_str(muid), node_addr(n)); + } + gnet_stats_inc_general(GNR_OOB_HITS_IGNORED_ON_SPAMMER_HIT); + return; + } + + /* + * If host is known to support secure OOB yet we get a non-secure OOB + * promise for hits, then something is wrong: because we always send + * the GGEP "SO" in queries, and force it when OOB-proxying, the remote + * host had to see the extension, unless the query was maliciously altered + * on the network or the IP:port is fake. + * --RAM, 2012-10-14 + */ + + if (!secure) { + gnet_host_t host; + gnet_host_set(&host, n->addr, n->port); + + if (aging_lookup_revitalise(ora_secure, &host)) { + if (GNET_PROPERTY(search_debug)) { + g_debug("ignoring %d %sOOB unsecure hit%s for query #%s " + "(%s supports secure OOB)", + hits, + guess_is_search_muid(muid) ? "GUESS " : "", + plural(hits), guid_hex_str(muid), node_addr(n)); + } + gnet_stats_inc_general(GNR_OOB_HITS_IGNORED_ON_UNSECURE_HIT); + return; + } + } + if (secure) { - token = random_u32(); + sectoken_t tok; + + /* + * The generated security token depends not only on the IP:port + * of the remote host, but also on the MUID of the query. + * + * Even though the token has a small lifetime due to the short + * period of the rotating keys in the generator, this makes sure + * the recipient of the token can only use it for this query, in + * case it received several queries from us. + */ + + sectoken_generate_with_context(ora_stg, &tok, + n->addr, n->port, muid, GUID_RAW_SIZE); + token = peek_be32(tok.v); token_opaque = array_init(&token, sizeof token); + + if ( + GNET_PROPERTY(search_debug) > 1 || + GNET_PROPERTY(secure_oob_debug) + ) { + char buf17; + bin_to_hex_buf( + token_opaque.data, token_opaque.size, buf, sizeof buf); + g_debug("OOB secure token for %s and #%s is 0x%s", + host_addr_port_to_string(n->addr, n->port), + guid_hex_str(muid), buf); + } } else { token = 0; token_opaque = zero_array; @@ -5588,25 +7021,29 @@ * indication. */ - sch = g_hash_table_lookup(search_by_muid, muid); + sch = htable_lookup(search_by_muid, muid); if (!search_get_kept_results(sch, &kept)) { /* * Maybe it's an OOB-proxied search? + * + * Note that this is done after checking for known spammers or evil + * hosts to sanitize the replies for our leaves and save traffic. */ if ( GNET_PROPERTY(proxy_oob_queries) && oob_proxy_pending_results(n, muid, hits, udp_firewalled, &token_opaque) - ) { - goto record_token; - } + ) + goto record_secure; /* OK, sent OOB reply ack to claim hits */ - if (GNET_PROPERTY(search_debug)) - g_warning("got OOB indication of %d hit%s for unknown search %s", - hits, hits == 1 ? "" : "s", guid_hex_str(muid)); + if (GNET_PROPERTY(search_debug)) { + g_warning("got OOB indication of %d hit%s for unknown query #%s " + "at %s", + hits, plural(hits), guid_hex_str(muid), node_infostr(n)); + } if (GNET_PROPERTY(log_bad_gnutella)) gmsg_log_bad(n, "unexpected OOB hit indication"); @@ -5615,27 +7052,11 @@ return; } - /* - * If remote host promising hits is a known spammer or evil host, ignore. - */ - - if (hostiles_spam_check(n->addr, n->port)) { - if (GNET_PROPERTY(search_debug)) { - g_debug("ignoring %d %sOOB hit%s for search %s " - "(%s is a caught spammer)", - hits, - guess_is_search_muid(muid) ? "GUESS " : "", - hits == 1 ? "" : "s", guid_hex_str(muid), node_addr(n)); - } - gnet_stats_count_general(GNR_OOB_HITS_IGNORED_ON_SPAMMER_HIT, +1); - return; - } - if (GNET_PROPERTY(search_debug) > 1 || GNET_PROPERTY(udp_debug) > 1) { - g_debug("has %d pending %sOOB hit%s for search %s at %s", - hits, + g_debug("has %d pending %s%sOOB hit%s for query #%s at %s", + hits, secure ? "secure " : "", guess_is_search_muid(muid) ? "GUESS " : "", - hits == 1 ? "" : "s", guid_hex_str(muid), node_addr(n)); + plural(hits), guid_hex_str(muid), node_infostr(n)); } /* @@ -5652,10 +7073,11 @@ kept > search_max_results_for_ui(sch) * 0.15 ) { if (GNET_PROPERTY(search_debug)) { - g_debug("ignoring %d %sOOB hit%s for search %s (already got %u)", - hits, + g_debug("ignoring %d %s%sOOB hit%s for query #%s (already got %u) " + "at %s", + hits, secure ? "secure " : "", guess_is_search_muid(muid) ? "GUESS " : "", - hits == 1 ? "" : "s", guid_hex_str(muid), kept); + plural(hits), guid_hex_str(muid), kept, node_infostr(n)); } return; } @@ -5688,8 +7110,14 @@ vmsg_send_oob_reply_ack(n, muid, ask, &token_opaque); -record_token: - oob_reply_ack_record(muid, n->addr, n->port, token); +record_secure: + if (secure) { + gnet_host_t host; + + gnet_host_set(&host, n->addr, n->port); + if (!aging_lookup_revitalise(ora_secure, &host)) + aging_insert(ora_secure, atom_host_get(&host), int_to_pointer(1)); + } } const char * @@ -5703,7 +7131,7 @@ return sch->name; } -gboolean +bool search_is_frozen(gnet_search_t sh) { search_ctrl_t *sch = search_find_by_handle(sh); @@ -5713,7 +7141,7 @@ return sbool_get(sch->frozen); } -gboolean +bool search_is_passive(gnet_search_t sh) { search_ctrl_t *sch = search_find_by_handle(sh); @@ -5723,7 +7151,7 @@ return sbool_get(sch->passive); } -gboolean +bool search_is_active(gnet_search_t sh) { search_ctrl_t *sch = search_find_by_handle(sh); @@ -5733,7 +7161,7 @@ return sbool_get(sch->active); } -gboolean +bool search_is_browse(gnet_search_t sh) { search_ctrl_t *sch = search_find_by_handle(sh); @@ -5743,7 +7171,7 @@ return sbool_get(sch->browse); } -gboolean +bool search_is_expired(gnet_search_t sh) { search_ctrl_t *sch = search_find_by_handle(sh); @@ -5753,7 +7181,7 @@ return search_expired(sch); } -gboolean +bool search_is_local(gnet_search_t sh) { search_ctrl_t *sch = search_find_by_handle(sh); @@ -5763,7 +7191,7 @@ return sbool_get(sch->local); } -gboolean +bool search_is_whats_new(gnet_search_t sh) { search_ctrl_t *sch = search_find_by_handle(sh); @@ -5787,13 +7215,14 @@ * @param guid the GUID of the remote host. * @param push whether a PUSH request is neeed to reach remote host. * @param proxies vector holding known push-proxies. + * @param flags connection flags like SOCK_F_PUSH, SOCK_F_TLS, SOCK_F_G2 * * @return TRUE if we successfully initialized the download layer. */ -gboolean +bool search_browse(gnet_search_t sh, - const char *hostname, host_addr_t addr, guint16 port, - const struct guid *guid, const gnet_host_vec_t *proxies, guint32 flags) + const char *hostname, host_addr_t addr, uint16 port, + const guid_t *guid, const gnet_host_vec_t *proxies, uint32 flags) { search_ctrl_t *sch = search_find_by_handle(sh); @@ -5802,6 +7231,8 @@ g_assert(!sbool_get(sch->frozen)); g_assert(sch->download == NULL); + entropy_harvest_many(VARLEN(sh), VARLEN(addr), VARLEN(port), NULL); + /* * Host browsing is done thusly: a non-persistent search was created and * it is now associated with a special download that will know it will @@ -5830,10 +7261,7 @@ g_assert(sch->download == d); sch->download = NULL; - if (!sbool_get(sch->frozen)) { - search_stop(sch->search_handle); - search_status_changed(sch->search_handle); - } + search_stop(sch->search_handle); } #define LOCAL_MAX_ALT 30 /* Max alt-locs we report for local searches */ @@ -5864,7 +7292,7 @@ atom_sha1_change(&rc->sha1, shared_file_sha1(sf)); atom_tth_change(&rc->tth, shared_file_tth(sf)); - hcnt = dmesh_fill_alternate(rc->sha1, hvec, G_N_ELEMENTS(hvec)); + hcnt = dmesh_fill_alternate(rc->sha1, hvec, N_ITEMS(hvec)); /* * Propagate them to the results so that they can see how many entries @@ -5895,11 +7323,11 @@ rc->tag = atom_str_get(shared_file_path(sf)); rc->create_time = shared_file_creation_time(sf); - rs->records = g_slist_prepend(rs->records, rc); + rs->records = pslist_prepend(rs->records, rc); rs->num_recs++; } -gboolean +bool search_locally(gnet_search_t sh, const char *query) { gnet_results_set_t *rs; @@ -5917,6 +7345,8 @@ g_assert(sbool_get(sch->local)); g_assert(sch->download == NULL); + entropy_harvest_many(VARLEN(sh), query, strsize(query), NULL); + if ('\0' == query0) { error = FALSE; re = NULL; @@ -5931,6 +7361,7 @@ } sf = shared_file_by_sha1(&sha1); error = !sf || SHARE_REBUILDING == sf; + shared_file_unref(&sf); if (error) { goto done; } @@ -5959,7 +7390,7 @@ if (GNET_PROPERTY(is_firewalled)) rs->status |= ST_FIREWALL; - + if (GNET_PROPERTY(is_firewalled) || !host_is_valid(rs->addr, rs->port)) { const gnet_host_t *host = node_oldest_push_proxy(); @@ -5973,9 +7404,9 @@ if (sf) { search_add_local_file(rs, sf); } else { - guint num_files, idx; + uint num_files, idx; - num_files = MIN((guint) -1, shared_files_scanned()); + num_files = MIN((uint) -1, shared_files_scanned()); for (idx = 1; idx > 0 && idx <= num_files; idx++) { sf = shared_file(idx); if (!sf) { @@ -5987,17 +7418,18 @@ char *buf = NULL; size_t buf_size = 0; int ret; - + name = shared_file_name_nfc(sf); path = shared_file_relative_path(sf); if (path) { - buf_size = w_concat_strings(&buf, - path, "/", name, (void *) 0); + buf_size = + w_concat_strings(&buf, path, "/", name, NULL_PTR); name = buf; } ret = regexec(re, name, 0, NULL, 0); WFREE_NULL(buf, buf_size); if (ret) { + shared_file_unref(&sf); continue; } } @@ -6006,21 +7438,23 @@ 0 != sch->media_type && !shared_file_has_media_type(sf, sch->media_type) ) { + shared_file_unref(&sf); continue; } search_add_local_file(rs, sf); + shared_file_unref(&sf); } } - if (rs->records) { - GSList *search; - + if (rs->records) { + pslist_t *search; + rs->status |= ST_PARSED_TRAILER; /* Avoid <unparsed> in the GUI */ - search = g_slist_prepend(NULL, uint_to_pointer(sch->search_handle)); + search = pslist_prepend(NULL, uint_to_pointer(sch->search_handle)); /* Dispatch browse results using a NULL MUID since it's not GUESS */ search_fire_got_results(search, NULL, rs); - gm_slist_free_null(&search); + pslist_free_null(&search); } search_free_r_set(rs); @@ -6035,17 +7469,21 @@ /** * Handle magnet searches, launching Gnutella searches as appropriate. */ -guint +uint search_handle_magnet(const char *url) { struct magnet_resource *res; - guint n_searches = 0; + uint n_searches = 0; + + g_assert(url != NULL); + + entropy_harvest_single(url, strlen(url)); res = magnet_parse(url, NULL); if (res) { - GSList *sl; + pslist_t *sl; - for (sl = res->searches; sl != NULL; sl = g_slist_next(sl)) { + PSLIST_FOREACH(res->searches, sl) { const char *query; /* Note that SEARCH_F_LITERAL is used to prevent that these @@ -6094,9 +7532,9 @@ LISTENER_REMOVE(search_request, l); } -static void +void search_request_listener_emit( - query_type_t type, const char *query, const host_addr_t addr, guint16 port) + query_type_t type, const char *query, const host_addr_t addr, uint16 port) { LISTENER_EMIT(search_request, (type, query, addr, port)); } @@ -6109,25 +7547,23 @@ * matches). So we keep track of what has been added in `shared_files'. */ struct query_context { - GHashTable *shared_files; - GSList *files; /**< List of shared_file_t that match */ + hset_t *shared_files; + pslist_t *files; /**< List of shared_file_t that match */ + const search_request_info_t *sri; int found; - unsigned media_mask; /**< If non-zero, which media types they want */ - unsigned partials:1; /**< Do they want partial results? */ }; /** * Create new query context. */ static struct query_context * -share_query_context_make(unsigned media_mask, gboolean partials) +share_query_context_make(const search_request_info_t *sri) { struct query_context *ctx; WALLOC0(ctx); - ctx->shared_files = g_hash_table_new(pointer_hash_func, NULL); - ctx->media_mask = media_mask; - ctx->partials = booleanize(partials); + ctx->shared_files = hset_create(HASH_KEY_SELF, 0); + ctx->sri = sri; return ctx; } @@ -6142,7 +7578,7 @@ * Don't free the `files' list, as we passed it to the query hit builder. */ - gm_hash_table_destroy_null(&ctx->shared_files); + hset_free_null(&ctx->shared_files); WFREE(ctx); } @@ -6151,10 +7587,10 @@ * * @return TRUE if the shared_file is in the QueryHit already, FALSE otherwise */ -static inline gboolean +static inline bool shared_file_already_found(struct query_context *ctx, const shared_file_t *sf) { - return NULL != g_hash_table_lookup(ctx->shared_files, sf); + return hset_contains(ctx->shared_files, sf); } /** @@ -6163,7 +7599,7 @@ static inline void shared_file_mark_found(struct query_context *ctx, const shared_file_t *sf) { - gm_hash_table_insert_const(ctx->shared_files, sf, sf); + hset_insert(ctx->shared_files, sf); } /** @@ -6171,11 +7607,12 @@ * * @return TRUE if the match is kept. */ -static gboolean -got_match(gpointer context, gpointer data) +static bool +got_match(void *context, const void *data) { struct query_context *qctx = context; const shared_file_t *sf = data; + const search_request_info_t *sri = qctx->sri; shared_file_check(sf); @@ -6190,8 +7627,8 @@ */ if ( - 0 != qctx->media_mask && - !shared_file_has_media_type(sf, qctx->media_mask) + 0 != sri->media_types && + !shared_file_has_media_type(sf, sri->media_types) ) { if (GNET_PROPERTY(query_debug) > 1 || GNET_PROPERTY(matching_debug) > 1 @@ -6199,14 +7636,38 @@ g_debug("MATCH ignoring matched %s \"%s\", not of type %s", shared_file_is_partial(sf) ? "partial" : "shared", shared_file_name_canonic(sf), - search_media_mask_to_string(qctx->media_mask)); + search_media_mask_to_string(sri->media_types)); } return FALSE; } + /* + * If there is a size limit, apply it. + */ + + if (sri->size_restrictions) { + filesize_t size = shared_file_size(sf); + + if (size < sri->minsize || size > sri->maxsize) { + if (GNET_PROPERTY(query_debug) > 1 || + GNET_PROPERTY(matching_debug) > 1 + ) { + g_debug("MATCH ignoring matched %s \"%s\": size=%s " + "not within boundaries %s, %s", + shared_file_is_partial(sf) ? "partial" : "shared", + shared_file_name_canonic(sf), + filesize_to_string(size), + filesize_to_string2(sri->minsize), + filesize_to_string3(sri->maxsize)); + } + + return FALSE; + } + } + shared_file_mark_found(qctx, sf); - qctx->files = g_slist_prepend(qctx->files, shared_file_ref(sf)); + qctx->files = pslist_prepend(qctx->files, shared_file_ref(sf)); qctx->found++; return TRUE; } else { @@ -6240,7 +7701,7 @@ *p = ' '; \ p++; \ } \ - if (p != word) \ + if (p != word && word != NULL) \ memmove(p, word, word_length); \ p += word_length; \ } while (0) @@ -6254,7 +7715,7 @@ word = is_ascii_blank(*search) ? NULL : search; p = s = search; while ('\0' != *s) { - guint clen; + uint clen; clen = utf8_char_len(s); clen = MAX(1, clen); /* In case of invalid UTF-8 */ @@ -6306,8 +7767,8 @@ * * @returns TRUE if the string is valid UTF-8, FALSE otherwise. */ -static gboolean -query_utf8_decode(const char *text, guint *retoff) +bool +query_utf8_decode(const char *text, uint *retoff) { const char *p; @@ -6320,11 +7781,11 @@ if (!(p = is_strprefix(text, "\xef\xbb\xbf"))) p = text; - + if (retoff) *retoff = p - text; - /* Disallow BOM followed by an empty string */ + /* Disallow BOM followed by an empty string */ return (p == text || '\0' != p0) && utf8_is_valid_string(p); } @@ -6337,7 +7798,7 @@ compact_query(char *search) { size_t mangled_search_len, orig_len = strlen(search); - guint offset; /* Query string start offset */ + uint offset; /* Query string start offset */ /* * Look whether we're facing an UTF-8 query. @@ -6368,22 +7829,48 @@ } /** + * Convert query flags into a string describing the positionned flags. + * + * @return pointer to static string. + */ +static const char * +search_flags_to_string(uint16 flags) +{ + static char buf64; + + str_bprintf(buf, sizeof buf, "%s%s%s%s%s%s%s%s", + (flags & QUERY_F_MARK) ? "MARKED" : "", + (flags & QUERY_F_FIREWALLED) ? " FW" : "", + (flags & QUERY_F_XML) ? " XML" : "", + (flags & QUERY_F_LEAF_GUIDED) ? " GUIDED" : "", + (flags & QUERY_F_GGEP_H) ? " GGEP_H" : "", + (flags & QUERY_F_OOB_REPLY) ? " OOB" : "", + (flags & QUERY_F_FW_TO_FW) ? " FW2FW" : "", + (flags & QUERY_F_SR_UDP) ? " SR_UDP" : ""); + + return buf; +} + +/** * Remove the OOB delivery flag by patching the query message inplace. */ void -query_strip_oob_flag(const gnutella_node_t *n, char *data) +query_strip_oob_flag(gnutella_node_t *n, char *data) { - guint16 flags; + uint16 flags; flags = peek_be16(data) & ~QUERY_F_OOB_REPLY; poke_be16(data, flags); - gnet_stats_count_general(GNR_OOB_QUERIES_STRIPPED, 1); + /* Strip "SO" since no OOB now */ + n->msg_flags |= NODE_M_STRIP_GE_SO | NODE_M_EXT_CLEANUP; + + gnet_stats_inc_general(GNR_OOB_QUERIES_STRIPPED); if (GNET_PROPERTY(query_debug) > 2 || GNET_PROPERTY(oob_proxy_debug) > 2) - g_debug("QUERY %s from %s: removed OOB delivery (flags = 0x%x)", + g_debug("QUERY #%s from %s: removed OOB delivery (flags = 0x%x : %s)", guid_hex_str(gnutella_header_get_muid(&n->header)), - node_infostr(n), flags); + node_infostr(n), flags, search_flags_to_string(flags)); } /** @@ -6392,26 +7879,32 @@ void query_set_oob_flag(const gnutella_node_t *n, char *data) { - guint16 flags; + uint16 flags; - flags = peek_be16(data) | QUERY_F_OOB_REPLY | QUERY_F_MARK; + /* + * This is for OOB-proxied queries, so we're turning the flag for + * semi-reliable UDP support because hits are going to come back + * to us, so we do not care about the original querying servent settings. + */ + + flags = peek_be16(data) | QUERY_F_OOB_REPLY | QUERY_F_MARK | QUERY_F_SR_UDP; poke_be16(data, flags); if (GNET_PROPERTY(query_debug)) - g_debug("QUERY %s from %s: set OOB delivery (flags = 0x%x)", + g_debug("QUERY #%s from %s: set OOB delivery (flags = 0x%x : %s)", guid_hex_str(gnutella_header_get_muid(&n->header)), - node_infostr(n), flags); + node_infostr(n), flags, search_flags_to_string(flags)); } /** * Extract query flags for a search and apply some workarounds for * buggy clients. */ -static guint16 -search_request_get_flags(const struct gnutella_node *n) +static uint16 +search_request_get_flags(const gnutella_node_t *n) { - const guint16 mask = QUERY_F_MARK | QUERY_F_GGEP_H | QUERY_F_LEAF_GUIDED; - guint16 flags; + const uint16 mask = QUERY_F_MARK | QUERY_F_GGEP_H | QUERY_F_LEAF_GUIDED; + uint16 flags; flags = peek_be16(n->data); if (flags & QUERY_F_MARK) @@ -6441,17 +7934,6 @@ } /** - * @return search media type filter (0 if none). - */ -unsigned -search_request_media(const search_request_info_t *sri) -{ - g_assert(sri != NULL); - - return sri->media_types; -} - -/** * Free data structure and nullify its pointer. */ void @@ -6467,6 +7949,93 @@ } /** + * Is the search string valid? + * + * If invalid, the message drop is accounted for. + * + * @attention + * Sets sri->skip_file_search as a side effect. + * + * @param n the node where query comes from + * @param hops the hops travelled by the query + * @param sri the analyzed search string so far + * + * @return TRUE if search can be processed. + */ +bool +search_is_valid(gnutella_node_t *n, uint8 hops, search_request_info_t *sri) +{ + /* + * When an URN search is present, there can be an empty search string. + * + * If requester is farther than half our TTL hops. save bandwidth when + * returning lots of hits from short queries, which are not specific enough. + * The idea here is to give some response, but not too many. + */ + + sri->skip_file_search = sri->search_len <= 1 || ( + sri->search_len <= MIN_SEARCH_TERM_BYTES && + hops > (GNET_PROPERTY(max_ttl) / 2)); + + if (0 == sri->exv_sha1cnt && sri->skip_file_search) { + gnet_stats_count_dropped(n, MSG_DROP_QUERY_TOO_SHORT); + return FALSE; /* Drop this search message */ + } + + return TRUE; +} + +/** + * Can we issue an OOB query with results sent to the given address? + * + * If not, the message drop is accounted for. + * + * @param n the node where query comes from + * @param sri the analyzed search string so far + * + * @return TRUE if search can be processed. + */ +bool +search_oob_is_allowed(gnutella_node_t *n, const search_request_info_t *sri) +{ + hostiles_flags_t hostile; + msg_drop_reason_t reason = MSG_DROP_REASON_COUNT; + + node_check(n); + g_assert(sri->oob); + + /* + * Verify against the hostile IP addresses... + */ + + hostile = hostiles_check(sri->addr); + + if (hostiles_flags_are_bad(hostile)) + reason = MSG_DROP_HOSTILE_IP; + else if (hostiles_flags_warrant_shunning(hostile)) + reason = MSG_DROP_SHUNNED_IP; + + if (reason != MSG_DROP_REASON_COUNT) { + if (GNET_PROPERTY(search_debug)) { + g_debug("SEARCH dropping OOB query from hostile %s (%s)", + host_addr_to_string(sri->addr), + hostiles_flags_to_string(hostile)); + } + gnet_stats_count_dropped(n, reason); + return FALSE; /* Drop the message! */ + } + + if (is_my_address_and_port(sri->addr, sri->port)) { + if (GNET_PROPERTY(search_debug)) + g_debug("SEARCH dropping OOB query from myself"); + gnet_stats_count_dropped(n, MSG_DROP_OWN_QUERY); + return FALSE; + } + + return TRUE; +} + +/** * Preprocesses searches requests (from others nodes). * * This is called after route_message(), so TTL and hops do not hold the values @@ -6479,28 +8048,25 @@ * * @return TRUE if the query should be discarded, FALSE if everything was OK. */ -gboolean -search_request_preprocess(struct gnutella_node *n, - search_request_info_t *sri, gboolean isdup) +bool +search_request_preprocess(gnutella_node_t *n, + search_request_info_t *sri, bool isdup) { static char stmp_14096; char *search; struct sha1 *last_sha1_digest = NULL; host_addr_t ipv6_addr; const guid_t *muid; + bool will_oob; g_assert(GTA_MSG_SEARCH == gnutella_header_get_function(&n->header)); g_assert(sri != NULL); - muid = gnutella_header_get_muid(&n->header); - - if (GNET_PROPERTY(guess_server_debug) > 18) { - if (NODE_IS_UDP(n)) { - g_debug("GUESS got %s, GUID=%s", - gmsg_node_infostr(n), guid_hex_str(muid)); - } + if (GNET_PROPERTY(guess_server_debug) > 18 && NODE_IS_UDP(n)) { + g_debug("GUESS got %s", gmsg_node_infostr(n)); } + muid = gnutella_header_get_muid(&n->header); sri->duplicate = booleanize(isdup); ZERO(&ipv6_addr); @@ -6519,12 +8085,9 @@ if (sri->search_len >= n->size - 2U) { g_assert(n->datan->size - 1 != '\0'); if (GNET_PROPERTY(query_debug) > 10) - g_warning("query (hops=%u, ttl=%u) from %s had no NUL (%d byte%s)", - gnutella_header_get_hops(&n->header), - gnutella_header_get_ttl(&n->header), - node_infostr(n), - n->size - 2, - n->size == 3 ? "" : "s"); + g_warning("%s had no NUL (%d byte%s)", + gmsg_node_infostr(n), + n->size - 2, n->size == 3 ? "" : "s"); if (GNET_PROPERTY(query_debug) > 14) dump_hex(stderr, "Query Text", search, MIN(n->size - 2, 256)); @@ -6598,7 +8161,7 @@ } if (!is_ascii_string(search)) { - gnet_stats_count_general(GNR_QUERY_UTF8, 1); + gnet_stats_inc_general(GNR_QUERY_UTF8); } /* @@ -6609,11 +8172,11 @@ extvec_t exvMAX_EXTVEC; int i, exvcnt; size_t extra; - gboolean drop_it = FALSE; - gboolean valid_query_key = FALSE; - gboolean seen_query_key = FALSE; - gboolean wants_ipp = FALSE; - gboolean has_unknown = FALSE; + bool drop_it = FALSE; + bool valid_query_key = FALSE; + bool seen_query_key = FALSE; + bool wants_ipp = FALSE; + bool has_unknown = FALSE; host_net_t ipp_net = HOST_NET_IPV4; extra = n->size - 3 - sri->search_len; /* Amount of extra data */ @@ -6621,7 +8184,7 @@ exvcnt = ext_parse(search + sri->search_len + 1, extra, exv, MAX_EXTVEC); - if (G_N_ELEMENTS(exv) == UNSIGNED(exvcnt)) { + if (N_ITEMS(exv) == UNSIGNED(exvcnt)) { g_warning("%s has at least %d extensions!", gmsg_node_infostr(n), exvcnt); if (GNET_PROPERTY(query_debug) > 10) @@ -6631,14 +8194,14 @@ } if (exvcnt && GNET_PROPERTY(query_debug) > 13) { - g_debug("QUERY %s%s hops=%u, TTL=%u with extensions: " + g_debug("QUERY %s#%s hops=%u, TTL=%u with extensions: " "\"%s\" (%zu byte%s)", NODE_IS_UDP(n) ? "(GUESS) " : "", guid_hex_str(gnutella_header_get_muid(&n->header)), gnutella_header_get_hops(&n->header), gnutella_header_get_ttl(&n->header), sri->whats_new ? WHATS_NEW : lazy_safe_search(search), - extra, 1 == extra ? "" : "s"); + extra, plural(extra)); ext_dump(stderr, exv, exvcnt, "> ", "\n", GNET_PROPERTY(query_debug) > 14); } @@ -6681,8 +8244,8 @@ wants_ipp = TRUE; /* GUESS >= v0.2 */ /* IPV6-Ready: check which addresses they want */ if (ext_paylen(e) > 0) { - const guint8 *payload = ext_payload(e); - guint8 flags = payload0; + const uint8 *payload = ext_payload(e); + uint8 flags = payload0; if (flags & SCP_F_NO_IPV4) ipp_net = HOST_NET_IPV6; @@ -6704,8 +8267,13 @@ break; case EXT_T_GGEP_NP: /* No OOB-proxying */ - /* This may override LIME/13v1 */ - sri->may_oob_proxy = FALSE; + /* + * We support OOB v3 (secure OOB) so there is no need to refuse + * OOB proxying. If they sent us an "OOB Proxy Veto", we'll + * honour it, but "NP" comes from legacy servents. + * --RAM, 2012-10-07 + */ + n->msg_flags |= NODE_M_EXT_CLEANUP; /* Strip "NP" if relayed */ break; case EXT_T_GGEP_PR: /* Partial: match on downloads */ @@ -6755,10 +8323,12 @@ if (EXT_T_GGEP_H == e->ext_token) { int ret; - + ret = ggept_h_sha1_extract(e, sha1); if (GGEP_OK == ret) { - /* Okay */ + /* Okay, but clean it up if it's a bitprint */ + if (ext_paylen(e) > 1 + SHA1_RAW_SIZE) + n->msg_flags |= NODE_M_EXT_CLEANUP; } else if (GGEP_NOT_FOUND == ret) { search_log_ggep(n, e, NULL, "SHA1-less"); continue; /* Unsupported hash type */ @@ -6771,7 +8341,7 @@ size_t plen = ext_paylen(e); const char *pload = ext_payload(e); const char *p; - gboolean keep = FALSE; + bool keep = FALSE; if ( (p = is_bufcaseprefix(pload, plen, "sha1:")) || @@ -6786,7 +8356,7 @@ if (!keep) { /* Don't propagate if it's not containing valid info */ n->msg_flags |= - NODE_M_EXT_CLEANUP | NODE_M_STRIP_GGEP_u; + NODE_M_EXT_CLEANUP | NODE_M_STRIP_GE_u; continue; } } else if ( @@ -6841,8 +8411,22 @@ break; case EXT_T_GGEP_Z: /* Compressed UDP supported */ - if (NODE_IS_UDP(n)) + if (NODE_IS_UDP(n)) { + /* + * Because UDP routes are created before the actual + * message payload is analysed, they cannot know that + * the host is deflatable initially (queries are not + * "requests" for the "Gnutella UDP Traffic Compression" + * specifications, hence are not bearing a flagged TTL). + * + * This is the reason why we need the GGEP "Z" extension + * in queries sent over GUESS, and this is also why we + * need to explicitly flag the UDP route as deflatable now. + */ + n->attrs |= NODE_A_CAN_INFLATE; + route_udp_mark_deflatable(n); + } break; case EXT_T_GGEP_6: /* IPv6-Ready -- has IPv6 OOB return */ @@ -6876,7 +8460,7 @@ */ sri->ipv6 = TRUE; if (ext_paylen(e) > 0) { - const guint8 *b = ext_payload(e); + const uint8 *b = ext_payload(e); if (*b) { sri->ipv6_only = TRUE; } @@ -6888,6 +8472,9 @@ break; case EXT_T_URN_TTH: + case EXT_T_URN_BTIH: + case EXT_T_URN_ED2KHASH: + case EXT_T_URN_MD5: case EXT_T_URN_UNKNOWN: /* * Silently ignore unknown URNs like urn:ed2khash or urn:md5, @@ -6910,7 +8497,7 @@ gmsg_node_infostr(n), ext_to_string(e)); } } - + if (drop_it) break; } @@ -6932,14 +8519,14 @@ if (sri->whats_new && sri->exv_sha1cnt) { if (GNET_PROPERTY(query_debug) > 1) { - g_debug("QUERY %s%s hops=%u, TTL=%u \"%s\" " + g_debug("QUERY %s#%s hops=%u, TTL=%u \"%s\" " "has %d SHA1%s, dropping", NODE_IS_UDP(n) ? "(GUESS) " : "", guid_hex_str(gnutella_header_get_muid(&n->header)), gnutella_header_get_hops(&n->header), gnutella_header_get_ttl(&n->header), WHATS_NEW, - sri->exv_sha1cnt, 1 == sri->exv_sha1cnt ? "" : "s"); + sri->exv_sha1cnt, plural(sri->exv_sha1cnt)); } gnet_stats_count_dropped(n, MSG_DROP_QUERY_OVERHEAD); goto drop; @@ -6959,7 +8546,7 @@ gnutella_header_get_ttl(&n->header) > 0 ) { if (GNET_PROPERTY(query_debug) > 1) { - g_debug("QUERY %s%s hops=%u, TTL=%u \"%s\" " + g_debug("QUERY %s#%s hops=%u, TTL=%u \"%s\" " "travelling too far, forcing TTL to 0", NODE_IS_UDP(n) ? "(GUESS) " : "", guid_hex_str(gnutella_header_get_muid(&n->header)), @@ -6971,10 +8558,10 @@ } if (sri->exv_sha1cnt) - gnet_stats_count_general(GNR_QUERY_SHA1, 1); + gnet_stats_inc_general(GNR_QUERY_SHA1); if (sri->whats_new) { - gnet_stats_count_general(GNR_QUERY_WHATS_NEW, 1); + gnet_stats_inc_general(GNR_QUERY_WHATS_NEW); /* * Since "What's New?" queries are broadcasted, we make sure @@ -7008,10 +8595,10 @@ } else { if (wants_ipp) { /* This is a GUESS 0.2 query, at least */ - gnet_stats_count_general(GNR_QUERY_GUESS_02, 1); + gnet_stats_inc_general(GNR_QUERY_GUESS_02); } else { /* This is a GUESS query from a legacy servent */ - gnet_stats_count_general(GNR_QUERY_GUESS, 1); + gnet_stats_inc_general(GNR_QUERY_GUESS); } /* Send back a pong */ pcache_guess_acknowledge(n, TRUE, wants_ipp, ipp_net); @@ -7024,7 +8611,7 @@ if (0 != gnutella_header_get_ttl(&n->header)) { if (GNET_PROPERTY(guess_server_debug)) { - g_warning("GUESS node %s sent query MUID=%s with TTL=%u, " + g_warning("GUESS node %s sent query #%s with TTL=%u, " "dropping", node_infostr(n), guid_hex_str(gnutella_header_get_muid(&n->header)), @@ -7040,7 +8627,7 @@ if (1 != gnutella_header_get_hops(&n->header)) { if (GNET_PROPERTY(guess_server_debug)) { - g_warning("GUESS node %s sent query MUID=%s with hops=%u, " + g_warning("GUESS node %s sent query #%s with hops=%u, " "adjusting to 1 before forwarding", node_infostr(n), guid_hex_str(gnutella_header_get_muid(&n->header)), @@ -7074,20 +8661,10 @@ /* * When an URN search is present, there can be an empty search string. - * - * If requester if farther than half our TTL hops. save bandwidth when - * returning lots of hits from short queries, which are not specific enough. - * The idea here is to give some response, but not too many. */ - sri->skip_file_search = sri->search_len <= 1 || ( - sri->search_len <= MIN_SEARCH_TERM_BYTES && - gnutella_header_get_hops(&n->header) > (GNET_PROPERTY(max_ttl) / 2)); - - if (0 == sri->exv_sha1cnt && sri->skip_file_search) { - gnet_stats_count_dropped(n, MSG_DROP_QUERY_TOO_SHORT); - goto drop; /* Drop this search message */ - } + if (!search_is_valid(n, gnutella_header_get_hops(&n->header), sri)) + goto drop; /* Drop this search message */ /* * When we are not a leaf node, we do two sanity checks here: @@ -7119,9 +8696,10 @@ if (gnutella_header_get_hops(&n->header) == 1 && n->qseen != NULL) { time_t now = tm_time(); time_t seen = 0; - gboolean found; - gpointer orig_key, orig_val; - gconstpointer atom; + bool found; + const void *orig_key; + void *orig_val; + const void *atom; char *query = search; time_delta_t threshold = GNET_PROPERTY(node_requery_threshold); @@ -7132,10 +8710,9 @@ query = stmp_1; } - found = g_hash_table_lookup_extended(n->qseen, query, - &orig_key, &orig_val); + found = htable_lookup_extended(n->qseen, query, &orig_key, &orig_val); if (found) { - seen = (time_t) GPOINTER_TO_INT(orig_val); + seen = (time_t) pointer_to_int(orig_val); atom = orig_key; } else { atom = NULL; @@ -7153,18 +8730,18 @@ if (!found) atom = atom_str_get(query); - gm_hash_table_insert_const(n->qseen, atom, + htable_insert(n->qseen, atom, uint_to_pointer((unsigned) delta_time(now, (time_t) 0))); } /* - * For point #2, there are two tables to consider: `qrelayed_old' and - * `qrelayed'. Presence in any of the tables is sufficient, but we - * only insert in the "new" table `qrelayed'. + * For point #2, there are two sets to consider: `qrelayed_old' and + * `qrelayed'. Presence in any of the sets is sufficient, but we + * only insert in the "new" set `qrelayed'. */ if (n->qrelayed != NULL) { /* Check #2 */ - gpointer found = NULL; + bool found = FALSE; g_assert(!NODE_IS_LEAF(n)); @@ -7174,22 +8751,22 @@ */ if (last_sha1_digest == NULL) - gm_snprintf(stmp_1, sizeof(stmp_1), "%u/%u%s", + str_bprintf(stmp_1, sizeof(stmp_1), "%u/%u%s", gnutella_header_get_hops(&n->header), gnutella_header_get_ttl(&n->header), search); else - gm_snprintf(stmp_1, sizeof(stmp_1), "%u/%uurn:sha1:%s", + str_bprintf(stmp_1, sizeof(stmp_1), "%u/%uurn:sha1:%s", gnutella_header_get_hops(&n->header), gnutella_header_get_ttl(&n->header), sha1_base32(last_sha1_digest)); if (n->qrelayed_old != NULL) - found = g_hash_table_lookup(n->qrelayed_old, stmp_1); + found = hset_contains(n->qrelayed_old, stmp_1); - if (found == NULL) - found = g_hash_table_lookup(n->qrelayed, stmp_1); + if (!found) + found = hset_contains(n->qrelayed, stmp_1); - if (found != NULL) { + if (found) { if (GNET_PROPERTY(query_debug) > 10) { g_warning("QUERY dropping \"%s%s\" (hops=%u, TTL=%u) " "already seen recently from %s", @@ -7204,13 +8781,27 @@ goto drop; /* Drop the message! */ } - gm_hash_table_insert_const(n->qrelayed, - atom_str_get(stmp_1), int_to_pointer(1)); + hset_insert(n->qrelayed, atom_str_get(stmp_1)); } skip_throttling: sri->oob = booleanize(sri->flags & QUERY_F_OOB_REPLY); + sri->sr_udp = booleanize(sri->flags & QUERY_F_SR_UDP); + sri->may_oob_proxy = booleanize(0 == (n->attrs2 & NODE_A2_NO_OOB_PROXY)); + + if (sri->sr_udp && NODE_IS_UDP(n)) { + /* + * Because UDP routes are created before the actual message payload + * is analysed, they cannot know that the host is supporting + * Semi-Reliable UDB initially (queries are not "requests" for + * the "Gnutella UDP Traffic Compression" specifications, hence are + * not bearing a flagged TTL). + */ + + n->attrs2 |= NODE_A2_HAS_SR_UDP; + route_udp_mark_semi_reliable(n); + } /* * IPv6-Ready: Compute the proper IPv6 reply address if we saw GGEP "6". @@ -7218,7 +8809,7 @@ if (sri->oob) { host_addr_t addr; - guint16 port; + uint16 port; guid_oob_get_addr_port(gnutella_header_get_muid(&n->header), &addr, &port); @@ -7239,27 +8830,27 @@ */ { - guint8 major, minor; - gboolean release; + uint8 major, minor; + bool release; if ( guid_query_muid_is_gtkg(gnutella_header_get_muid(&n->header), sri->oob, &major, &minor, &release) ) { - gboolean requery; - - gnet_stats_count_general(GNR_GTKG_TOTAL_QUERIES, 1); + bool requery; + + gnet_stats_inc_general(GNR_GTKG_TOTAL_QUERIES); requery = guid_is_requery(gnutella_header_get_muid(&n->header)); if (requery) - gnet_stats_count_general(GNR_GTKG_REQUERIES, 1); + gnet_stats_inc_general(GNR_GTKG_REQUERIES); if (GNET_PROPERTY(query_debug) > 3) { char origin60; if (sri->oob) { - gm_snprintf(origin, sizeof origin, " from %s", + str_bprintf(origin, sizeof origin, " from %s", host_addr_port_to_string(sri->addr, sri->port)); } - g_debug("GTKG %s%squery from %d.%d%s MUID=%s%s", + g_debug("GTKG %s%squery from %d.%d%s #%s%s", sri->oob ? "OOB " : "", requery ? "re-" : "", major, minor, release ? "" : "u", guid_hex_str(gnutella_header_get_muid(&n->header)), @@ -7268,9 +8859,11 @@ } } - if (0 != (sri->flags & QUERY_F_GGEP_H)) { - gnet_stats_count_general(GNR_QUERIES_WITH_GGEP_H, 1); - } + if (0 != (sri->flags & QUERY_F_GGEP_H)) + gnet_stats_inc_general(GNR_QUERIES_WITH_GGEP_H); + + if (0 != (sri->flags & QUERY_F_SR_UDP)) + gnet_stats_inc_general(GNR_QUERIES_WITH_SR_UDP); /* * If OOB reply is wanted, validate a few things. @@ -7285,15 +8878,8 @@ * Verify against the hostile IP addresses... */ - if (hostiles_check(sri->addr)) { - gnet_stats_count_dropped(n, MSG_DROP_HOSTILE_IP); - goto drop; /* Drop the message! */ - } - - if (is_my_address_and_port(sri->addr, sri->port)) { - gnet_stats_count_dropped(n, MSG_DROP_OWN_QUERY); + if (!search_oob_is_allowed(n, sri)) goto drop; - } /* * If it's a neighbouring leaf query, make sure the IP for results @@ -7310,14 +8896,14 @@ if ( (NODE_IS_LEAF(n) || NODE_IS_UDP(n)) && is_host_addr(n->gnet_addr) && - host_addr_net(n->gnet_addr) == host_addr_net(sri->addr) && - !host_addr_equal(sri->addr, n->gnet_addr) + host_addr_net(n->gnet_addr) == host_addr_net(sri->addr) && + !host_addr_equiv(sri->addr, n->gnet_addr) ) { if (NODE_IS_UDP(n)) { query_strip_oob_flag(n, n->data); sri->oob = FALSE; if (GNET_PROPERTY(guess_server_debug)) { - g_debug("QUERY (GUESS) %s from %s: removed OOB flag " + g_debug("QUERY (GUESS) #%s from %s: removed OOB flag " "(mismatching return address %s versus UDP %s)", guid_hex_str(gnutella_header_get_muid(&n->header)), node_infostr(n), host_addr_to_string(sri->addr), @@ -7328,7 +8914,7 @@ if ( GNET_PROPERTY(query_debug) || - GNET_PROPERTY(oob_proxy_debug) + GNET_PROPERTY(oob_proxy_debug) > 1 ) { g_debug("QUERY dropped from %s: invalid OOB flag " "(return address mismatch: %s, node: %s)", @@ -7351,10 +8937,10 @@ if ( GNET_PROPERTY(query_debug) || - GNET_PROPERTY(oob_proxy_debug) || + GNET_PROPERTY(oob_proxy_debug) > 1 || (NODE_IS_UDP(n) && GNET_PROPERTY(guess_server_debug)) ) { - g_debug("QUERY %s%s from %s: removed OOB flag " + g_debug("QUERY %s#%s from %s: removed OOB flag " "(invalid return address: %s)", NODE_IS_UDP(n) ? "(GUESS) " : "", guid_hex_str(gnutella_header_get_muid(&n->header)), @@ -7370,7 +8956,7 @@ * hostiles file but were already connected to that node, for instance. */ - if (hostiles_check(n->addr)) { + if (hostiles_is_bad(n->addr)) { gnet_stats_count_dropped(n, MSG_DROP_HOSTILE_IP); goto drop; /* Drop the message! */ } @@ -7390,17 +8976,17 @@ * Naturally, we don't do this check for OOB queries, since the reply * won't be relayed but delivered directly via UDP. * - * --RAM, 2004-11-27 + * --RAM, 2004-11-27 */ - sri->oob = sri->oob && - GNET_PROPERTY(process_oob_queries) && - GNET_PROPERTY(recv_solicited_udp) && + will_oob = sri->oob && + GNET_PROPERTY(process_oob_queries) && + GNET_PROPERTY(recv_solicited_udp) && udp_active() && gnutella_header_get_hops(&n->header) > 1; if ( - !sri->oob && + !will_oob && gnutella_header_get_hops(&n->header) > GNET_PROPERTY(max_ttl) && !settings_is_leaf() ) { @@ -7427,38 +9013,56 @@ /** * Searches requests (from others nodes) * Basic matching. The search request is made lowercase and - * is matched to the filenames in the LL. + * is matched to the filenames in the library. * * If `qhv' is not NULL, it is filled with hashes of URN or query words, * so that we may later properly route the query among the leaf nodes. + * + * This routine must be called after search_request_preprocess() to actually + * perform the querying based on the information gathered into ``sri''. + * + * It can therefore be used to process traditional Gnutella queries and G2 + * queries which have been decompiled and for which ``sri'' was populated. + * A fake Gnutella header is filled, with the query MUID, fake hops and TTL + * and a special GTA_MSG_G2_SEARCH function which indicates the G2 query, + * plus the fact that NODE_TALKS_G2(n) will be TRUE. + * + * @param n the node from which the query comes from (relay) + * @param sri the information gathered during the pre-processing stage + * @param qhv query hash vector (can be NULL) to fill for later routing */ void -search_request(struct gnutella_node *n, +search_request(gnutella_node_t *n, const search_request_info_t *sri, query_hashvec_t *qhv) { const char *search; - struct guid muid; - gboolean qhv_filled = FALSE; - gboolean oob; + const guid_t *muid; + bool qhv_filled = FALSE; + bool oob; char *safe_search = NULL; + uint8 function = gnutella_header_get_function(&n->header); - g_assert(GTA_MSG_SEARCH == gnutella_header_get_function(&n->header)); + g_assert(!NODE_TALKS_G2(n) || GTA_MSG_G2_SEARCH == function); + g_assert(NODE_TALKS_G2(n) || GTA_MSG_SEARCH == function); g_assert(sri != NULL); + muid = gnutella_header_get_muid(&n->header); + oob = sri->oob; + /* * NOTE: search_request_preprocess() has already handled this query, * filling ``sri'' with the gathered information. */ - search = n->data + 2; /* skip flags */ - oob = sri->oob; + search = sri->g2_query ? "" : n->data + 2; /* skip flags */ if (sri->extended_query != NULL) { char *safe_ext = hex_escape(sri->extended_query, FALSE); if (GNET_PROPERTY(query_debug) > 14) { - g_debug("QUERY %s%s extended: original=\"%s\", extended=\"%s\"", - NODE_IS_UDP(n) ? "(GUESS) " : "", + g_debug("QUERY %s#%s extended: original=\"%s\", extended=\"%s\"", + NODE_TALKS_G2(n) ? "(G2) " : + NODE_IS_UDP(n) ? "(GUESS) " : "", guid_hex_str(gnutella_header_get_muid(&n->header)), lazy_safe_search(search), safe_ext); } @@ -7467,46 +9071,15 @@ } else { safe_search = hex_escape(search, FALSE); if (GNET_PROPERTY(query_debug) > 14) { - g_debug("QUERY %s%s \"%s\"", - NODE_IS_UDP(n) ? "(GUESS) " : "", + g_debug("QUERY %s#%s \"%s\"", + NODE_TALKS_G2(n) ? "(G2) " : + NODE_IS_UDP(n) ? "(GUESS) " : "", guid_hex_str(gnutella_header_get_muid(&n->header)), sri->whats_new ? WHATS_NEW : safe_search); } } /* - * If the query does not have an OOB mark, comes from a leaf node and - * they allow us to be an OOB-proxy, then replace the IP:port of the - * query with ours, so that we are the ones to get the UDP replies. - * - * Since calling oob_proxy_create() is going to mangle the query's - * MUID in place (alterting n->header.muid), we must save the MUID - * in case we have local hits to deliver: since we send those directly - * --RAM, 2005-08-28 - */ - - muid = *gnutella_header_get_muid(&n->header); /* Struct copy */ - - if ( - !oob && - sri->may_oob_proxy && - udp_active() && - GNET_PROPERTY(proxy_oob_queries) && - !GNET_PROPERTY(is_udp_firewalled) && - NODE_IS_LEAF(n) && - host_is_valid(listen_addr(), socket_listen_port()) - ) { - /* - * OOB-proxying can fail if we have an MUID collision. - */ - - if (oob_proxy_create(n)) { - oob = TRUE; - gnet_stats_count_general(GNR_OOB_PROXIED_QUERIES, 1); - } - } - - /* * If this is a duplicate query (with higher TTL), we just need to relay * it, and for that we need to compute the query hash vector. */ @@ -7543,12 +9116,38 @@ } /* + * Before handling an OOB query, make sure the remote host is actually + * claiming its hits on a regular basis. + * + * FIXME: + * Note that banning is at the IP address level, not at the IP:port level + * so if several servents run under the same IP, all will be penalized if + * one behaves badly. For now this is acceptable -- RAM, 2012-06-10 + * + * When we ignore a query, we still relay it to neighbours so that we do + * not penalize the network unduly should our ignoring logic be too + * aggresive. + */ + + if (oob && ban_is_banned(BAN_CAT_OOB_CLAIM, sri->addr)) { + if (GNET_PROPERTY(query_debug) > 2) { + g_debug("QUERY OOB %s#%s \"%s\" ignored: host %s not claiming hits", + NODE_IS_UDP(n) ? "(GUESS) " : "", + guid_hex_str(gnutella_header_get_muid(&n->header)), + sri->whats_new ? WHATS_NEW : safe_search, + host_addr_to_string(sri->addr)); + } + gnet_stats_inc_general(GNR_OOB_QUERIES_IGNORED); + goto finish; + } + + /* * Check IP address requirements. */ if (sri->ipv6_only && !settings_running_ipv6()) { if (GNET_PROPERTY(query_debug) > 9) { - g_debug("QUERY %s%s \"%s\" ignored: wants only IPv6", + g_debug("QUERY %s#%s \"%s\" ignored: wants only IPv6", NODE_IS_UDP(n) ? "(GUESS) " : "", guid_hex_str(gnutella_header_get_muid(&n->header)), sri->whats_new ? WHATS_NEW : safe_search); @@ -7584,7 +9183,7 @@ if (sri->whats_new || !sri->skip_file_search || sri->exv_sha1cnt > 0) { struct query_context *qctx; - guint32 max_replies; + uint32 max_replies; /* * Perform search... @@ -7596,14 +9195,21 @@ * be counted in QRP filterting statistics. */ - if (settings_is_leaf() && node_ultra_received_qrp(n)) { - node_inc_qrp_query(n); + if (NODE_TALKS_G2(n)) { + if (node_hub_received_qrp(n)) { + node_inc_qrp_query(n); + } + gnet_stats_inc_general(GNR_LOCAL_G2_SEARCHES); + } else { + if (settings_is_leaf() && node_ultra_received_qrp(n)) { + node_inc_qrp_query(n); + } + gnet_stats_inc_general(GNR_LOCAL_SEARCHES); } - gnet_stats_count_general(GNR_LOCAL_SEARCHES, 1); } - qctx = share_query_context_make(sri->media_types, sri->partials); - max_replies = GNET_PROPERTY(search_max_items) == (guint32) -1 + qctx = share_query_context_make(sri); + max_replies = GNET_PROPERTY(search_max_items) == (uint32) -1 ? 255 : GNET_PROPERTY(search_max_items); @@ -7615,7 +9221,7 @@ int i; for (i = 0; i < sri->exv_sha1cnt && max_replies > 0; i++) { - struct shared_file *sf; + shared_file_t *sf; sf = shared_file_by_sha1(&sri->exv_sha1i.sha1); if ( @@ -7624,9 +9230,10 @@ !shared_file_is_partial(sf) ) { shared_file_check(sf); - got_match(qctx, sf); - max_replies--; + if (got_match(qctx, sf)) + max_replies--; } + shared_file_unref(&sf); } } @@ -7635,55 +9242,66 @@ size_t cnt, i; cnt = GNET_PROPERTY(query_answer_whats_new) - ? share_fill_newest(sfv, G_N_ELEMENTS(sfv), sri->media_types) + ? share_fill_newest(sfv, N_ITEMS(sfv), + sri->media_types, + sri->size_restrictions, sri->minsize, sri->maxsize) : 0; for (i = 0; i < cnt; i++) { got_match(qctx, sfvi); + shared_file_unref(&sfvi); } gnet_stats_count_general(GNR_LOCAL_WHATS_NEW_HITS, cnt); } else if (!sri->skip_file_search) { + uint32 flags = 0; + + flags |= sri->partials ? SHARE_FM_PARTIALS : 0; + flags |= NODE_TALKS_G2(n) ? SHARE_FM_G2 : 0; + shared_files_match(search, - got_match, qctx, max_replies, sri->partials, qhv); + got_match, qctx, max_replies, flags, qhv); + qhv_filled = TRUE; /* A side effect of st_search() */ } if (qctx->found > 0) { - if (settings_is_leaf() && node_ultra_received_qrp(n)) + if ( + (settings_is_leaf() && node_ultra_received_qrp(n)) || + (NODE_TALKS_G2(n) && node_hub_received_qrp(n)) + ) node_inc_qrp_match(n); if (GNET_PROPERTY(share_debug) > 3) { - g_debug("share HIT %u files '%s'%s ", qctx->found, - sri->whats_new ? WHATS_NEW : safe_search, - sri->skip_file_search ? " (skipped)" : ""); + g_debug("share HIT %u file%s '%s'%s for #%s%s", + qctx->found, plural(qctx->found), + sri->whats_new ? WHATS_NEW : safe_search, + sri->skip_file_search ? " (skipped)" : "", + guid_hex_str(gnutella_header_get_muid(&n->header)), + NODE_TALKS_G2(n) ? " (G2)" : ""); if (sri->exv_sha1cnt) { int i; for (i = 0; i < sri->exv_sha1cnt; i++) g_debug("\t%c(%32s)", - sri->exv_sha1i.matched ? '+' : '-', - sha1_base32(&sri->exv_sha1i.sha1)); + sri->exv_sha1i.matched ? '+' : '-', + sha1_base32(&sri->exv_sha1i.sha1)); } - g_debug("\tflags=0x%04x (%s%s%s%s%s%s%s) ttl=%u hops=%u", - (guint) sri->flags, - (sri->flags & QUERY_F_MARK) ? "MARKED" : "", - (sri->flags & QUERY_F_FIREWALLED) ? " FW" : "", - (sri->flags & QUERY_F_XML) ? " XML" : "", - (sri->flags & QUERY_F_LEAF_GUIDED) ? " GUIDED" : "", - (sri->flags & QUERY_F_GGEP_H) ? " GGEP_H" : "", - (sri->flags & QUERY_F_OOB_REPLY) ? " OOB" : "", - (sri->flags & QUERY_F_FW_TO_FW) ? " FW2FW" : "", - gnutella_header_get_ttl(&n->header), - gnutella_header_get_hops(&n->header)); + g_debug("\tflags=0x%04x max-hits=%u (%s) " + "ttl=%u hops=%u", + (uint) sri->flags, + (uint) (sri->flags & QUERY_F_MAX_HITS), + search_flags_to_string(sri->flags), + gnutella_header_get_ttl(&n->header), + gnutella_header_get_hops(&n->header)); } } if (GNET_PROPERTY(query_debug) > 14) { - g_debug("QUERY %s \"%s\" hops=%u, TTL=%u has %u hit%s%s%s (%s)", + g_debug("QUERY #%s \"%s\" hops=%u, TTL=%u has %u hit%s%s%s (%s)", guid_hex_str(gnutella_header_get_muid(&n->header)), sri->whats_new ? WHATS_NEW : lazy_safe_search(search), gnutella_header_get_hops(&n->header), gnutella_header_get_ttl(&n->header), - qctx->found, qctx->found == 1 ? "" : "s", + qctx->found, plural(qctx->found), sri->skip_file_search ? " (skipped local)" : "", sri->exv_sha1cnt > 0 ? " (SHA1)" : "", search_media_mask_to_string(sri->media_types)); @@ -7696,25 +9314,33 @@ */ if (qctx->found) { - gboolean should_oob; + bool should_oob; unsigned flags = 0; flags |= (sri->flags & QUERY_F_GGEP_H) ? QHIT_F_GGEP_H : 0; flags |= sri->ipv6 ? QHIT_F_IPV6 : 0; flags |= sri->ipv6_only ? QHIT_F_IPV6_ONLY : 0; - should_oob = oob && - GNET_PROPERTY(process_oob_queries) && - GNET_PROPERTY(recv_solicited_udp) && + should_oob = oob && !sri->g2_query && + GNET_PROPERTY(process_oob_queries) && + GNET_PROPERTY(recv_solicited_udp) && udp_active() && gnutella_header_get_hops(&n->header) > 1 && settings_running_same_net(sri->addr); if (should_oob) { oob_got_results(n, qctx->files, qctx->found, - sri->addr, sri->port, sri->secure_oob, flags); + sri->addr, sri->port, sri->secure_oob, sri->sr_udp, flags); + } else if (sri->g2_query) { + gnutella_node_t *g = n; + if (sri->oob) + g = node_udp_g2_get_addr_port(sri->addr, sri->port); + flags |= sri->g2_wants_url ? QHIT_F_G2_URL : 0; + flags |= sri->g2_wants_dn ? QHIT_F_G2_DN : 0; + flags |= sri->g2_wants_alt ? QHIT_F_G2_ALT : 0; + g2_build_send_qh2(n, g, qctx->files, qctx->found, muid, flags); } else { - qhit_send_results(n, qctx->files, qctx->found, &muid, flags); + qhit_send_results(n, qctx->files, qctx->found, muid, flags); } } @@ -7747,9 +9373,10 @@ * XML tree traversal callback. */ static void -search_xml_node_is_empty(xnode_t *xn, void *data) +search_xml_node_is_empty(void *node, void *data) { - gboolean *empty = data; + xnode_t *xn = node; + bool *empty = data; if (!*empty) return; @@ -7767,24 +9394,72 @@ /** * Is the XML tree "empty": no content in tags, no attributes. */ -static gboolean +static bool search_xml_tree_empty(xnode_t *root) { - gboolean empty = TRUE; + bool empty = TRUE; xnode_tree_foreach(root, search_xml_node_is_empty, &empty); return empty; } /** + * Log GGEP write failure. + */ +static void +search_log_ggep_write_failure(const char *id, uint32 flags, + const gnutella_node_t *n, const char *caller) +{ + if (GNET_PROPERTY(query_debug)) { + g_warning("%s(): QUERY #%s could not write %s" + "GGEP \"%s\": %s", + caller, guid_hex_str(gnutella_header_get_muid(&n->header)), + (flags & GGEP_W_DEFLATE) ? "deflated " : "", id, ggep_errstr()); + } +} + +/** + * Write GGEP extension in GGEP stream for message held in the node. + */ +static void +search_ggep_write(ggep_stream_t *gs, const extvec_t *e, const char *id, + const void *payload, size_t plen, + const gnutella_node_t *n, const char *caller) +{ + uint32 flags; + bool ok; + const char *extid; + + g_assert((NULL == e) ^ (NULL == id)); + + if (e != NULL) { + flags = (plen > DEFLATE_THRESHOLD || ext_ggep_is_deflated(e)) ? + GGEP_W_DEFLATE : 0; + extid = ext_ggep_id_str(e); + } else { + flags = plen > DEFLATE_THRESHOLD ? GGEP_W_DEFLATE : 0; + extid = id; + } + + ok = ggep_stream_pack(gs, extid, payload, plen, flags); + + if (!ok) + search_log_ggep_write_failure(extid, flags, n, caller); +} + +/** * Compact search request by removing unneeded extensions, cutting on * needless bloat, and by removing unnecessary bloat from the query string. * - * Compaction happens in-place: upon return we have a new valid message - * in the node buffer, ready to be sent. + * When NODE_M_ADD_GE_SO is set, we add the GGEP "SO" key to the message, + * creating a GGEP extension if needed in order to secure OOB hit delivery + * for OOB-proxied queries. + * + * Edition happens in-place: upon return we have a new valid message in the + * node buffer, ready to be sent. */ void -search_compact(struct gnutella_node *n) +search_compact(gnutella_node_t *n) { const char *search; size_t search_len; @@ -7796,7 +9471,8 @@ char *p; const char *end = dest + sizeof buffer; size_t target; - gboolean has_ggep = FALSE; + bool has_ggep = FALSE; + char *start; g_assert(GTA_MSG_SEARCH == gnutella_header_get_function(&n->header)); g_assert(n->data != NULL); @@ -7829,7 +9505,7 @@ g_assert(mangled_search_len <= search_len - offset); if (mangled_search_len != search_len - offset) { - gnet_stats_count_general(GNR_QUERY_COMPACT_COUNT, 1); + gnet_stats_inc_general(GNR_QUERY_COMPACT_COUNT); gnet_stats_count_general(GNR_QUERY_COMPACT_SIZE, search_len - offset - mangled_search_len); n->msg_flags |= NODE_M_COMPACTED; @@ -7861,11 +9537,28 @@ return; extra = n->size - 3 - search_len; /* Amount of extra data */ + + g_assert(size_is_non_negative(extra)); + + if G_UNLIKELY(0 == extra && !(n->msg_flags & NODE_M_ADD_GE_SO)) + return; /* Nothing to strip nor to add */ + ext_prepare(exv, MAX_EXTVEC); - exvcnt = ext_parse(search + search_len + 1, extra, exv, MAX_EXTVEC); + + if G_UNLIKELY(0 == extra) { + exvcnt = 0; + } else { + exvcnt = ext_parse(search + search_len + 1, extra, exv, MAX_EXTVEC); + } target = extra + (extra >> 2); /* Add 25% margin for bad compression */ + if (n->msg_flags & NODE_M_ADD_GE_SO) { + /* Will force an "SO" extension if missing */ + target += 6; /* Worst case (no GGEP block already) */ + has_ggep = TRUE; /* Because we'll add "SO" */ + } + if (target > sizeof buffer) { dest = halloc(target); end = dest + target; @@ -7897,7 +9590,7 @@ err = vxml_parse_tree(vp, &root); if (VXML_E_OK != err) { if (GNET_PROPERTY(query_debug)) { - g_warning("QUERY %s dropping invalid XML payload: %s", + g_warning("QUERY #%s dropping invalid XML payload: %s", guid_hex_str(gnutella_header_get_muid(&n->header)), vxml_strerror(err)); } @@ -7925,7 +9618,9 @@ if ((size_t) -1 == w) { if (GNET_PROPERTY(query_debug)) { - g_warning("QUERY %s could not rewrite XML tree", + g_warning("%s(): QUERY #%s " + "could not rewrite XML tree", + G_STRFUNC, guid_hex_str( gnutella_header_get_muid(&n->header))); } @@ -7983,7 +9678,7 @@ EXT_T_URN_SHA1 != e->ext_token ) { const char *prefix = ext_huge_urn_name(e); - g_debug("QUERY %s rewriting %s as urn:sha1", + g_debug("QUERY #%s rewriting %s as urn:sha1", guid_hex_str( gnutella_header_get_muid(&n->header)), prefix); @@ -7993,8 +9688,7 @@ p += w; *p++ = ':'; paylen = MIN(paylen, SHA1_BASE32_SIZE); - memcpy(p, ext_payload(e), paylen); - p += paylen; + p = mempcpy(p, ext_payload(e), paylen); *p++ = HUGE_FS; } default: @@ -8018,18 +9712,24 @@ } /* + * If we're not going to add a GGEP extension block, the last HUGE + * separator we emitted is useless and must be stripped out. + */ + + if (p != dest && !has_ggep) { + g_assert(p > dest && p <= end); + g_assert(HUGE_FS == *(p - 1)); + p--; /* Remove trailing useless HUGE separator */ + } + + /* * Second pass: emit GGEP extension block. */ - if (!has_ggep) { - if (p != dest) { - g_assert(p > dest && p <= end); - g_assert(HUGE_FS == *(p - 1)); - p--; /* Remove trailing useless HUGE separator */ - } - } else { + if (has_ggep) { ggep_stream_t gs; size_t glen; + bool has_ggep_so = FALSE; g_assert(p < end); @@ -8037,7 +9737,7 @@ for (i = 0; i < exvcnt; i++) { extvec_t *e = &exvi; - gboolean ok; + bool ok; if (EXT_GGEP != e->ext_type) continue; @@ -8053,7 +9753,7 @@ /* "6" only required for OOB replies to an IPv6 address */ continue; case EXT_T_GGEP_u: - if (n->msg_flags & (NODE_M_STRIP_GGEP_u | NODE_M_WHATS_NEW)) + if (n->msg_flags & (NODE_M_STRIP_GE_u | NODE_M_WHATS_NEW)) continue; break; case EXT_T_GGEP_QK: @@ -8062,11 +9762,46 @@ if (n->msg_flags & (NODE_M_STRIP_GUESS | NODE_M_WHATS_NEW)) continue; break; - case EXT_T_GGEP_WH: case EXT_T_GGEP_SO: + has_ggep_so = TRUE; + if (n->msg_flags & NODE_M_STRIP_GE_SO) + continue; + break; + case EXT_T_GGEP_WH: case EXT_T_GGEP_M: - /* "WH", "SO" and "M" are kept with NODE_M_WHATS_NEW */ + /* "WH", and "M" are kept with NODE_M_WHATS_NEW */ break; + case EXT_T_GGEP_NP: + /* "NP" only used from leaf -> ultra to prevent OOB proxying */ + continue; /* Strip "NP" in relayed queries */ + case EXT_T_GGEP_H: + if (n->msg_flags & NODE_M_WHATS_NEW) + continue; /* Strip "H" in "what's new?" queries */ + { + const char *payload = ext_payload(e); + sha1_t sha1; + ggept_status_t ret = ggept_h_sha1_extract(e, &sha1); + const uint8 type = GGEP_H_SHA1; + + if (ret != GGEP_OK) + continue; /* Not a SHA1 or bitprint -- strip! */ + + if (GGEP_H_SHA1 == payload0) + break; /* Propagate as-is */ + + /* + * Rewrite with only the SHA1, then continue. + */ + + ok = ggep_stream_begin(&gs, GGEP_NAME(H), 0) && + ggep_stream_write(&gs, &type, 1) && + ggep_stream_write(&gs, sha1.data, SHA1_RAW_SIZE) && + ggep_stream_end(&gs); + + if (!ok) + search_log_ggep_write_failure("H", 0, n, G_STRFUNC); + } + continue; /* We rewrote it */ default: if (n->msg_flags & NODE_M_WHATS_NEW) continue; @@ -8074,20 +9809,8 @@ break; } - ok = ggep_stream_begin(&gs, ext_ggep_id_str(e), - ( - ext_paylen(e) > DEFLATE_THRESHOLD || - ext_ggep_is_deflated(e) - ) ? GGEP_W_DEFLATE : 0) - && ggep_stream_write(&gs, ext_payload(e), ext_paylen(e)) - && ggep_stream_end(&gs); - if (!ok) { - if (GNET_PROPERTY(query_debug)) { - g_warning("QUERY %s could not write GGEP \"%s\"", - guid_hex_str(gnutella_header_get_muid(&n->header)), - ext_ggep_id_str(e)); - } - } + search_ggep_write(&gs, e, NULL, ext_payload(e), ext_paylen(e), + n, G_STRFUNC); } /* @@ -8096,21 +9819,19 @@ */ if (n->msg_flags & NODE_M_FINISH_IPV6) { - gboolean ok; const host_addr_t addr6 = listen_addr6(); - const guint8 *ipv6 = host_addr_ipv6(&addr6); - - ok = ggep_stream_pack(&gs, GGEP_NAME(6), ipv6, 16, 0); + const uint8 *ipv6 = host_addr_ipv6(&addr6); - if (!ok) { - if (GNET_PROPERTY(query_debug)) { - g_warning("QUERY %s could not write GGEP \"6\" " - "for our address", - guid_hex_str(gnutella_header_get_muid(&n->header))); - } - } + search_ggep_write(&gs, NULL, GGEP_NAME(6), ipv6, 16, n, G_STRFUNC); } + /* + * If we have to add a GGEP "SO", do it now unless already present. + */ + + if ((n->msg_flags & NODE_M_ADD_GE_SO) && !has_ggep_so) + search_ggep_write(&gs, NULL, GGEP_NAME(SO), NULL, 0, n, G_STRFUNC); + glen = ggep_stream_close(&gs); p += glen; g_assert(p <= end); @@ -8121,73 +9842,72 @@ ext_reset(exv, MAX_EXTVEC); - if (newlen < extra) { + if (newlen != extra) { size_t diff = extra - newlen; - char *start = deconstify_char(search) + search_len + 1; if ( GNET_PROPERTY(query_debug) > 14 || ( (n->msg_flags & NODE_M_STRIP_GUESS) && GNET_PROPERTY(guess_server_debug) > 5 + ) || + ( + (n->msg_flags & NODE_M_ADD_GE_SO) && + GNET_PROPERTY(secure_oob_debug) ) ) { - g_debug("QUERY %s%s search extension part %zu -> %zu bytes", + g_debug("QUERY %s#%s search extension part %zu -> %zu bytes%s", NODE_IS_UDP(n) ? "(GUESS) " : "", guid_hex_str(gnutella_header_get_muid(&n->header)), - extra, newlen); + extra, newlen, + (n->msg_flags & NODE_M_ADD_GE_SO) ? + " (added GGEP \"SO\")" : "" + ); } /* - * Adjust message length since we managed to strip keys. + * Adjust message length. + * + * We can add extensions on the fly, not just strip them, hence + * we may have to grow n->data, which can move data around! */ - g_assert(diff < n->size); - n->size -= diff; gnutella_header_set_size(&n->header, n->size); + node_grow_data(n, n->size); + search = n->data + 2; /* skip flags, n->data could have changed */ - /* - * Copy new bytes over and update statistics. - */ - - memcpy(start, dest, newlen); - - if (!(n->msg_flags & NODE_M_COMPACTED)) { - gnet_stats_count_general(GNR_QUERY_COMPACT_COUNT, 1); + if (!(n->msg_flags & NODE_M_COMPACTED) && size_is_positive(diff)) { + gnet_stats_inc_general(GNR_QUERY_COMPACT_COUNT); n->msg_flags |= NODE_M_COMPACTED; } - gnet_stats_count_general(GNR_QUERY_COMPACT_SIZE, diff); - if (GNET_PROPERTY(query_debug) > 13) { - if (newlen > 0) { - exvcnt = ext_parse(start, newlen, exv, MAX_EXTVEC); - g_debug("QUERY %s%s rewritten extensions (%zu byte%s)", - NODE_IS_UDP(n) ? "(GUESS) " : "", - guid_hex_str(gnutella_header_get_muid(&n->header)), - newlen, 1 == newlen ? "" : "s"); - ext_dump(stderr, exv, exvcnt, "> ", "\n", - GNET_PROPERTY(query_debug) > 14); - ext_reset(exv, MAX_EXTVEC); - } else { - g_debug("QUERY %s%s rewritten with no extensions", - NODE_IS_UDP(n) ? "(GUESS) " : "", - guid_hex_str(gnutella_header_get_muid(&n->header))); - } - } - } else if (newlen > extra) { - if (GNET_PROPERTY(query_debug)) { - g_warning("QUERY %s%s not rewritten: new size %zu byte%s > old %zu", + if (size_is_positive(diff)) + gnet_stats_count_general(GNR_QUERY_COMPACT_SIZE, diff); + } + + /* + * Copy new bytes over and update statistics. + */ + + start = deconstify_char(search) + search_len + 1; + memcpy(start, dest, newlen); + + if (GNET_PROPERTY(query_debug) > 13) { + if (newlen != 0) { + exvcnt = ext_parse(start, newlen, exv, MAX_EXTVEC); + g_debug("QUERY %s#%s rewritten extensions " + "(now %zu byte%s, was %zu), payload now %u bytes", NODE_IS_UDP(n) ? "(GUESS) " : "", guid_hex_str(gnutella_header_get_muid(&n->header)), - newlen, 1 == newlen ? "" : "s", extra); - } - } else { - if (GNET_PROPERTY(query_debug) > 13) { - g_info("QUERY %s%s not rewritten: no change in size (%zu byte%s)", + newlen, plural(newlen), extra, n->size); + ext_dump(stderr, exv, exvcnt, "> ", "\n", + GNET_PROPERTY(query_debug) > 14); + ext_reset(exv, MAX_EXTVEC); + } else if (newlen != extra) { + g_debug("QUERY %s#%s rewritten with no extensions", NODE_IS_UDP(n) ? "(GUESS) " : "", - guid_hex_str(gnutella_header_get_muid(&n->header)), - newlen, 1 == newlen ? "" : "s"); + guid_hex_str(gnutella_header_get_muid(&n->header))); } }
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/search.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/search.h
Changed
@@ -40,6 +40,8 @@ #include "gnutella.h" #include "lib/sectoken.h" +#include "if/core/search.h" /* For query_type_t */ + /* * Query flags used in queries (big-endian); formerly used as "speed" indicator. */ @@ -52,10 +54,22 @@ #define QUERY_F_OOB_REPLY 0x0400 /**< Out-of-band reply possible */ #define QUERY_F_FW_TO_FW 0x0200 /**< Can do fw to fw transfers */ /** - * NOTE: At this point all of the bits are exhausted. 0x0001 is not available - * because the next 9 bits are not available for flags. + * NOTE: At this point all of the bits are exhausted. 0x0100 is not available + * because the next 9 bits are not available for flags but were reserved + * to specify the maximum amout of hits wanted (0 = unlimited). + * + * On 2012-10-07, we are stealing one bit from the reserved set to indicate + * support for semi-reliable UDP, with the "GTA" tag. If interpreted by a + * legacy servent, this will seem to request 256 hits, at least, which should + * not create a problem in practice. */ +#define QUERY_F_SR_UDP 0x0100 /**< Accepts semi-reliable UDP, "GTA" tag */ +#define QUERY_F_MAX_HITS 0x00ff /**< Lowest 8 bits indicate max # of hits */ +/** + * This special file index (2^32 - 3) signals that the sender wishes to + * establish a firewalled-to-firewalled transfer using RUDP. + */ #define QUERY_FW2FW_FILE_INDEX 0x7FFFFFFD /**< Magic index for fw-fw reqs */ /* @@ -84,6 +98,44 @@ struct guid; struct nid; +#ifdef SEARCH_SOURCES + +#include "extensions.h" /* For MAX_EXTVEC */ + +/** + * Gathered query information. + */ +struct search_request_info { + struct { + struct sha1 sha1; + bool matched; + } exv_sha1MAX_EXTVEC; + host_addr_t addr; /**< Reply address for OOB */ + const char *extended_query; /**< String in GGEP "XQ" */ + int exv_sha1cnt; /**< Amount of SHA1 to search for */ + size_t search_len; /**< Length of query string */ + uint32 media_types; /**< Media types from GGEP "M" */ + uint16 flags; /**< Query flags */ + uint16 port; /**< Reply port for OOB */ + filesize_t minsize, maxsize; /**< Min & max file sizes limits */ + unsigned oob:1; /**< Wants out-of-band hit delivery */ + unsigned secure_oob:1; /**< OOB v3 used? */ + unsigned whats_new:1; /**< This ia a "What's New?" query */ + unsigned skip_file_search:1; /**< Should we skip library searching? */ + unsigned may_oob_proxy:1; /**< Can we OOB-proxy the query? */ + unsigned partials:1; /**< Do they want partial results? */ + unsigned duplicate:1; /**< Known duplicate, with higher TTL */ + unsigned ipv6:1; /**< Do they support IPv6? */ + unsigned ipv6_only:1; /**< Do they support IPv6 only? */ + unsigned sr_udp:1; /**< Do they support semi-reliable UDP? */ + unsigned size_restrictions:1; /**< Whether to check min/max file size */ + unsigned g2_query:1; /**< Whether we're processing a G2 query */ + unsigned g2_wants_url:1; /**< Do they want URL in hits? */ + unsigned g2_wants_dn:1; /**< Do they want DN in hits? */ + unsigned g2_wants_alt:1; /**< Do they want ALT in hits? */ +}; +#endif /* SEARCH_SOURCES */ + /* * Global Functions */ @@ -93,39 +145,50 @@ search_request_info_t *search_request_info_alloc(void); void search_request_info_free_null(search_request_info_t **sri_ptr); -unsigned search_request_media(const search_request_info_t *sri); -gboolean search_results(gnutella_node_t *n, int *results); -gboolean search_query_allowed(gnet_search_t sh); +void +search_request_listener_emit( + query_type_t type, const char *query, const host_addr_t addr, uint16 port); + +struct g2_tree; + +bool search_is_valid(gnutella_node_t *n, uint8 h, search_request_info_t *sri); +bool search_oob_is_allowed( + gnutella_node_t *n, const search_request_info_t *sri); +bool search_results(gnutella_node_t *n, int *results); +void search_g2_results(gnutella_node_t *n, const struct g2_tree *t); +bool search_query_allowed(gnet_search_t sh); void search_starting(gnet_search_t sh); void search_notify_sent(gnet_search_t sh, const struct nid *node_id); void search_query_sent(gnet_search_t sh); -gboolean search_get_kept_results_by_muid(const struct guid *m, guint32 *kept); -gboolean search_running_guess(const struct guid *muid); -guint32 search_get_kept_results_by_handle(gnet_search_t sh); +bool search_get_kept_results_by_muid(const struct guid *m, uint32 *kept); +bool search_running_guess(const struct guid *muid); +uint32 search_get_kept_results_by_handle(gnet_search_t sh); void search_oob_pending_results(gnutella_node_t *n, const struct guid *muid, - int hits, gboolean udp_firewalled, gboolean secure); + int hits, bool udp_firewalled, bool secure); void search_dissociate_browse(gnet_search_t sh, struct download *d); -void search_browse_results(gnutella_node_t *n, gnet_search_t sh); +void search_browse_results(gnutella_node_t *n, gnet_search_t sh, + const struct g2_tree *t); -gboolean search_request_preprocess(struct gnutella_node *n, - search_request_info_t *sri, gboolean isdup); +bool search_request_preprocess(struct gnutella_node *n, + search_request_info_t *sri, bool isdup); void search_request(struct gnutella_node *n, const search_request_info_t *sri, struct query_hashvec *qhv); size_t compact_query(char *search); void search_compact(struct gnutella_node *n); -void query_strip_oob_flag(const struct gnutella_node *n, char *data); +void query_strip_oob_flag(struct gnutella_node *n, char *data); void query_set_oob_flag(const struct gnutella_node *n, char *data); +bool query_utf8_decode(const char *text, uint *retoff); void record_query_string(const struct guid *muid, const char *query, unsigned media_mask); -void search_query_key_generate(sectoken_t *tok, host_addr_t addr, guint16 port); +void search_query_key_generate(sectoken_t *tok, host_addr_t addr, uint16 port); gnutella_msg_search_t *build_guess_search_msg(const struct guid *muid, const char *query, unsigned mtype, - guint32 *size, const void *query_key, guint8 length); + uint32 *size, const void *query_key, uint8 length); const char *lazy_safe_search(const char *search);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/settings.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/settings.c
Changed
@@ -38,9 +38,13 @@ #include <netdb.h> #endif +#include "settings.h" + +#include "ban.h" #include "bsched.h" #include "ctl.h" #include "downloads.h" +#include "dump.h" #include "guess.h" #include "hcache.h" #include "hosts.h" @@ -48,8 +52,8 @@ #include "ipp_cache.h" #include "pdht.h" #include "routing.h" /* For gnet_reset_guid() */ +#include "rx.h" /* For rx_debug_set_addrs() */ #include "search.h" -#include "settings.h" #include "share.h" #include "sockets.h" #include "tx.h" /* For tx_debug_set_addrs() */ @@ -68,8 +72,9 @@ #include "xml/vxml.h" -#include "lib/bit_array.h" +#include "lib/aje.h" #include "lib/bg.h" +#include "lib/bit_array.h" #include "lib/compat_misc.h" #include "lib/cpufreq.h" #include "lib/cq.h" @@ -77,33 +82,47 @@ #include "lib/dbstore.h" #include "lib/debug.h" #include "lib/eval.h" +#include "lib/evq.h" #include "lib/fd.h" #include "lib/file.h" +#include "lib/filelock.h" +#include "lib/frand.h" +#include "lib/getcpucount.h" #include "lib/getgateway.h" +#include "lib/gethomedir.h" #include "lib/getphysmemsize.h" #include "lib/glib-missing.h" #include "lib/halloc.h" +#include "lib/http_range.h" #include "lib/log.h" #include "lib/omalloc.h" #include "lib/palloc.h" #include "lib/parse.h" +#include "lib/path.h" +#include "lib/pslist.h" #include "lib/random.h" #include "lib/sha1.h" +#include "lib/str.h" +#include "lib/stringify.h" +#include "lib/teq.h" +#include "lib/thread.h" #include "lib/tm.h" +#include "lib/tmalloc.h" #include "lib/vmm.h" #include "lib/xmalloc.h" #include "lib/zalloc.h" #include "lib/override.h" /* Must be the last header included */ +#define SETTINGS_RANDOM_SEED 4096 /* Amount of random bytes saved */ + static const char config_file = "config_gnet"; -static const mode_t IPC_DIR_MODE = S_IRUSR | S_IWUSR | S_IXUSR; /* 0700 */ -static const mode_t PID_FILE_MODE = S_IRUSR | S_IWUSR; /* 0600 */ -static const mode_t CONFIG_DIR_MODE = +static const mode_t IPC_DIR_MODE = S_IRUSR | S_IWUSR | S_IXUSR; /* 0700 */ +static const mode_t CONFIG_DIR_MODE = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP; /* 0750 */ -static char *home_dir; +static const char *home_dir; static char *config_dir; static char *crash_dir; static char *dht_db_dir; @@ -125,17 +144,19 @@ * progressbar_bps_out_avg 0.90u 15/05/2002 progressbar_bws_out_avg */ -static const char pidfile = "gtk-gnutella.pid"; -static const char dirlockfile = ".gtk-gnutella.lock"; +static const char super_pidfile = "gtk-gnutella-super.pid"; +static const char pidfile = "gtk-gnutella.pid"; +static const char dirlockfile = ".gtk-gnutella.lock"; +static const char randseed = "randseed"; -static gboolean settings_init_running; +static bool settings_init_running; static void settings_callbacks_init(void); static void settings_callbacks_shutdown(void); static void update_uptimes(void); -static int pidfile_fd = -1; -static int save_file_path_lock = -1; +static filelock_t *pidfile_lock; +static filelock_t *save_file_path_lock; /* ----------------------------------------- */ @@ -146,7 +167,7 @@ remember_local_addr_port(void) { host_addr_t addr; - guint16 port; + uint16 port; addr = listen_addr(); port = GNET_PROPERTY(listen_port); @@ -243,211 +264,36 @@ } return zero_host_addr; } - -gboolean + +bool is_my_address(const host_addr_t addr) { - return host_addr_equal(addr, listen_addr_by_net(host_addr_net(addr))); + return host_addr_equiv(addr, listen_addr_by_net(host_addr_net(addr))); } -gboolean -is_my_address_and_port(const host_addr_t addr, guint16 port) +bool +is_my_address_and_port(const host_addr_t addr, uint16 port) { return port == GNET_PROPERTY(listen_port) && is_my_address(addr); } /** - * Look for any existing PID file. If found, look at the pid recorded - * there and make sure it has died. Abort operations if it hasn't... + * Look for any existing PID file. * - * @returns Returns zero on success and -1 on failure. - * If fd_ptr is NULL the lock is only tested but not created. - * On failure errno is set to EEXIST, if the PID file was already - * locked. Other errno values imply that the PID file could not - * be created. - */ -static G_GNUC_COLD int -ensure_unicity(const char *file, int *fd_ptr) -{ - gboolean locked = FALSE; - int fd; - - g_assert(file); - - fd = file_create(file, O_RDWR, PID_FILE_MODE); - if (fd < 0) { - if (fd_ptr || GNET_PROPERTY(lockfile_debug)) { - s_warning("could not create \"%s\": %m", file); - } - return -1; - } - - if (GNET_PROPERTY(lockfile_debug)) { - g_debug("file \"%s\" opened", file); - } -/* FIXME: These might be enums, a compile-time check would be better */ -#if defined(F_SETLK) && defined(F_WRLCK) - { - static const struct flock zero_flock; - struct flock fl; - gboolean locking_failed; - - fl = zero_flock; - fl.l_type = F_WRLCK; - fl.l_whence = SEEK_SET; - /* l_start and l_len are zero, which means the whole file is locked */ - - locking_failed = -1 == fcntl(fd, F_SETLK, &fl); - - if (GNET_PROPERTY(lockfile_debug)) { - g_debug("file \"%s\" fcntl-locking %s", file, - locking_failed ? "failed" : "succeeded"); - } - - if (locking_failed) { - int saved_errno = errno; - - if (fd_ptr || GNET_PROPERTY(lockfile_debug)) { - s_warning("fcntl(%d, F_SETLK, ...) failed for \"%s\": %m", - fd, file); - /* - * Use F_GETLK to determine the PID of the process, the - * reinitialization of "fl" might be unnecessary but who - * knows. - */ - fl = zero_flock; - fl.l_type = F_WRLCK; - fl.l_whence = SEEK_SET; - - if (-1 != fcntl(fd, F_GETLK, &fl)) { - g_warning("another gtk-gnutella process seems to " - "be using \"%s\" (pid=%lu)", - file, (gulong) fl.l_pid); - } else { - s_warning("fcntl(%d, F_GETLK, ...) failed for \"%s\": %m", - fd, file); - } - } - - if (is_temporary_error(saved_errno) || EACCES == saved_errno) { - goto failed; /* The file seems to be locked */ - } - } else { - locked = TRUE; - } - } -#endif /* F_SETLK && F_WRLCK */ - - /* - * Maybe F_SETLK is not supported by the OS or filesystem? - * Fall back to weaker PID locking - */ - - if (!locked) { - ssize_t r; - char buf33; - - if (GNET_PROPERTY(lockfile_debug)) { - g_debug("file \"%s\" being read for PID", file); - } - r = read(fd, buf, sizeof buf - 1); - if ((ssize_t) -1 == r) { - /* This would be odd */ - if (fd_ptr || GNET_PROPERTY(lockfile_debug)) { - s_warning("could not read file \"%s\": %m", file); - } - goto failed; - } - - /* Check the PID in the file */ - { - guint64 u; - int error; - - g_assert(r >= 0 && (size_t) r < sizeof buf); - bufr = '\0'; - - u = parse_uint64(buf, NULL, 10, &error); - - /* If the pidfile seems to be corrupt, ignore it */ - if (!error && u > 1) { - pid_t pid = u; - - if (GNET_PROPERTY(lockfile_debug)) { - g_debug("file \"%s\" checking whether PID %lu is alive", - file, (unsigned long) pid); - } - if (compat_process_is_alive(pid)) { - if (fd_ptr) { - g_warning("another gtk-gnutella process seems to " - "be using \"%s\" (pid=%lu)", file, (gulong) pid); - } - goto failed; - } - } - } - } - - if (GNET_PROPERTY(lockfile_debug)) { - g_debug("file \"%s\" LOCKED (mode %s)", - file, fd_ptr ? "check" : "permanent"); - } - - if (NULL == fd_ptr) { - /* - * We keep the empty PID file around. Otherwise, - * there's a race-condition without fcntl() locking. - */ - fd_forget_and_close(&fd); - } else { - /* Keep the fd open, otherwise the lock is lost */ - *fd_ptr = fd; - } - - return 0; - -failed: - - if (GNET_PROPERTY(lockfile_debug)) { - g_debug("file \"%s\" NOT LOCKED", file); - } - fd_forget_and_close(&fd); - errno = EEXIST; - if (fd_ptr) { - *fd_ptr = -1; - } - return -1; -} - -/** - * Write our pid to the lockfile, opened as "fd". + * @return a filelock object on success, NULL if we could not lock with + * errno set. */ -static void -save_pid(int fd, const char *path) +static filelock_t * G_COLD +ensure_unicity(const char *file, bool check_only) { - size_t len; - char buf32; - - g_assert(fd >= 0); + filelock_params_t params; - len = gm_snprintf(buf, sizeof buf, "%lu\n", (gulong) getpid()); + ZERO(¶ms); + params.debug = GNET_PROPERTY(lockfile_debug) != 0; + params.check_only = check_only; - if (GNET_PROPERTY(lockfile_debug)) { - g_debug("file \"%s\" about to be written with PID %lu on fd #%d", - path, (gulong) getpid(), fd); - } - if (-1 == ftruncate(fd, 0)) { - s_warning("ftruncate() failed for \"%s\": %m", path); - return; - } - if (0 != lseek(fd, 0, SEEK_SET)) { - s_warning("lseek() failed for \"%s\": %m", path); - return; - } - if (len != (size_t) write(fd, buf, len)) { - s_warning("could not flush \"%s\": %m", path); - } + return filelock_create(file, ¶ms); } /* ----------------------------------------- */ @@ -457,8 +303,8 @@ * * @return TRUE on success. */ -static gboolean -settings_mkdir(const char *path, gboolean fatal) +static bool +settings_mkdir(const char *path, bool fatal) { if (-1 == mkdir(path, CONFIG_DIR_MODE)) { if (fatal) { @@ -475,11 +321,11 @@ /** * Initializes "config_dir", "home_dir", "crash_dir", etc... */ -G_GNUC_COLD void +void G_COLD settings_early_init(void) { config_dir = h_strdup(getenv("GTK_GNUTELLA_DIR")); - home_dir = h_strdup(eval_subst("~")); + home_dir = gethomedir(); if (home_dir != NULL) { if (!is_absolute_path(home_dir)) { @@ -494,7 +340,7 @@ s_fatal_exit(EXIT_FAILURE, _("$GTK_GNUTELLA_DIR must point to an absolute path!")); } - } else { + } else { config_dir = make_pathname(home_dir, is_running_on_mingw() ? "gtk-gnutella" : ".gtk-gnutella"); } @@ -527,54 +373,71 @@ * * @param path the path where the lockfile is to be held * @param lockfile the basename of the locking file - * @param fd_ptr if non-NULL, return the opened file descriptor here + * @parma check_only whether we just need to check for lock presence + * @param pid if non-NULL, where PID of locking process is written * - * @return 0 if OK, -1 on error with errno set. + * @return filelock_t object if OK, NULL on error with errno set. */ -static int -settings_unique_usage(const char *path, const char *lockfile, int *fd_ptr) +static filelock_t * +settings_unique_usage(const char *path, const char *lockfile, + bool check_only, pid_t *pid) { char *file; - int saved_errno, ret; + filelock_t *fl; + int saved_errno; g_assert(path != NULL); g_assert(lockfile != NULL); file = make_pathname(path, lockfile); - ret = ensure_unicity(file, fd_ptr); + fl = ensure_unicity(file, check_only); + saved_errno = errno; - if (0 == ret && fd_ptr) { - save_pid(*fd_ptr, file); + if (pid != NULL) { + *pid = NULL == fl ? filelock_pid(file) : getpid(); + if G_UNLIKELY(0 == *pid) { + g_warning("%s(): could not read PID from \"%s\": %m", + G_STRFUNC, file); + *pid = 1; + } } + HFREE_NULL(file); errno = saved_errno; - /* The file descriptor must be kept open */ - return ret; + + return fl; } /** * Tries to ensure that the current process is the only running instance * gtk-gnutella for the current value of GTK_GNUTELLA_DIR. * - * @returns On success zero is returned, otherwise -1 is returned - * and errno is set. + * @param lockfile the file to use as the PID file + * + * @returns On success zero is returned, otherwise the PID of the running + * process is returned and errno is set. */ -static int -settings_ensure_unicity(void) +static pid_t +settings_ensure_unicity(const char *lockfile) { + pid_t pid; + g_assert(config_dir); - return settings_unique_usage(config_dir, pidfile, &pidfile_fd); + pidfile_lock = settings_unique_usage(config_dir, lockfile, FALSE, &pid); + + return NULL == pidfile_lock ? pid : 0; } -int +bool settings_is_unique_instance(void) { g_assert(config_dir); - return settings_unique_usage(config_dir, pidfile, NULL) && EEXIST == errno; + return NULL == settings_unique_usage(config_dir, pidfile, TRUE, NULL) + && EEXIST == errno; } /** @@ -596,8 +459,8 @@ * sufficiently random to be used as-is. */ - random_bytes(id.v, sizeof id.v); - gnet_prop_set_storage(PROP_SESSION_ID, id.v, sizeof id.v); + random_bytes(&id, sizeof id); + gnet_prop_set_storage(PROP_SESSION_ID, &id, sizeof id); } /** @@ -609,18 +472,10 @@ static int settings_ensure_unique_save_file_path(void) { - int fd; - int ret; - - ret = settings_unique_usage(GNET_PROPERTY(save_file_path), - dirlockfile, &fd); + save_file_path_lock = settings_unique_usage( + GNET_PROPERTY(save_file_path), dirlockfile, FALSE, NULL); - if (0 == ret) { - fd_forget_and_close(&save_file_path_lock); - save_file_path_lock = fd; - } - - return ret; + return NULL == save_file_path_lock ? -1 : 0; } static void @@ -628,7 +483,7 @@ { /* * The determination of the UDP firewalled status is not 100% safe, - * since any datagram received from a host whith whom we recently + * since any datagram received from a host with whom we recently * communicated could lead us into believing we are receiving usolicited * traffic. * @@ -645,7 +500,7 @@ settings_update_downtime(void) { time_t downtime; - guint32 average; + uint32 average; if (GNET_PROPERTY(shutdown_time) != 0) { downtime = delta_time(tm_time(), GNET_PROPERTY(shutdown_time)); @@ -664,36 +519,131 @@ gnet_prop_set_guint32_val(PROP_AVERAGE_SERVENT_DOWNTIME, average); } -G_GNUC_COLD void +/** + * Reload random bytes saved in ~/.gtk-gnutella/randseed + */ +static void +settings_random_reload(void) +{ + char *file; + ssize_t got; + + file = make_pathname(config_dir, randseed); + got = frand_restore(file, aje_addrandom, SETTINGS_RANDOM_SEED); + + if (-1 == got) { + if (errno != ENOENT) + g_warning("cannot reload random data from %s: %m", file); + } else { + ssize_t cleared; + + if (debugging(0)) + g_info("loaded %zd random byte%s from %s", got, plural(got), file); + + /* + * We clear the random bytes we load since they entered the entropy + * pool now and should not be used as such again. We don't unlink + * the file to make sure we have the disk space needed at shutdown + * time to persist our entropy. + */ + + cleared = frand_clear(file, got); + if (cleared != got) { + g_warning("could not clear leading %zd byte%s from %s: %m", + got, plural(got), file); + } + } + + HFREE_NULL(file); +} + +/** + * Save random bytes into ~/.gtk-gnutella/randseed. + */ +void +settings_random_save(bool verbose) +{ + char *file; + ssize_t saved; + + file = make_pathname(config_dir, randseed); + saved = frand_merge(file, aje_random_bytes, SETTINGS_RANDOM_SEED); + + if (-1 == saved) { + g_warning("could not save random data into %s: %m", file); + } else if (saved != SETTINGS_RANDOM_SEED) { + g_warning("saved only %zd random byte%s into %s, expected %d: %m", + saved, plural(saved), file, SETTINGS_RANDOM_SEED); + } else if (verbose) { + g_info("saved %zd random byte%s into %s", saved, plural(saved), file); + } + + HFREE_NULL(file); +} + +/** + * Handle cleanup operation when upgrading from an older version. + */ +static void G_COLD +settings_handle_upgrades(void) +{ + /* 2014-05-02 -- Bitzi is now gone for version 1.1 */ + dbstore_unlink(settings_gnet_db_dir(), "bitzi_tickets"); +} + +/** + * Make sure that we are the sole running process. + * + * @param is_supervisor TRUE if dealing with the supervisor process + */ +void G_COLD +settings_unique_instance(bool is_supervisor) +{ + pid_t lpid; + const char *lock = is_supervisor ? super_pidfile : pidfile; + + if (0 != (lpid = settings_ensure_unicity(lock))) { + g_warning(is_supervisor ? + _("Another gtk-gnutella supervisor is running as PID %lu") : + _("Another gtk-gnutella is running as PID %lu"), + (ulong) lpid); + exit(EXIT_FAILURE); + } +} + +void G_COLD settings_init(void) { - guint64 memory = getphysmemsize(); - guint64 amount = memory / 1024; - guint max_fd; + uint64 memory = getphysmemsize(); + uint64 amount = memory / 1024; + uint64 maxvm = amount; + long cpus = getcpucount(); + uint max_fd; + time_t session_start = 0; settings_init_running = TRUE; -#ifdef RLIMIT_DATA +#if defined(HAS_GETRLIMIT) && defined(RLIMIT_AS) { struct rlimit lim; - - if (-1 != getrlimit(RLIMIT_DATA, &lim)) { - guint32 maxdata = lim.rlim_cur / 1024; - amount = MIN(amount, maxdata); /* For our purposes */ + + if (-1 != getrlimit(RLIMIT_AS, &lim)) { + maxvm = lim.rlim_max / 1024; + amount = MIN(amount, maxvm); /* For our purposes */ } } -#endif /* RLIMIT_DATA */ +#endif /* HAS_GETRLIIT && RLIMIT_DATA */ properties = gnet_prop_init(); max_fd = getdtablesize(); - + gnet_prop_set_guint32_val(PROP_SYS_NOFILE, max_fd); gnet_prop_set_guint64_val(PROP_SYS_PHYSMEM, amount); gnet_prop_set_guint64_val(PROP_CPU_FREQ_MIN, cpufreq_min()); gnet_prop_set_guint64_val(PROP_CPU_FREQ_MAX, cpufreq_max()); - memset(deconstify_gpointer(GNET_PROPERTY(servent_guid)), 0, GUID_RAW_SIZE); + memset(deconstify_pointer(GNET_PROPERTY(servent_guid)), 0, GUID_RAW_SIZE); if (NULL == config_dir || '\0' == *config_dir || !is_directory(config_dir)) goto no_config_dir; @@ -720,18 +670,65 @@ * the "lockfile_debug" property. */ - if (0 != settings_ensure_unicity()) { - g_warning(_("You seem to have left another gtk-gnutella running")); - exit(EXIT_FAILURE); + settings_unique_instance(FALSE); /* Child process */ + + /* + * Detect whether we're restarting after a clean shutdown or whether + * we're being auto-restarted / manually relaunched after a crash. + */ + + if (GNET_PROPERTY(clean_shutdown)) { + bool auto_restart = GNET_PROPERTY(user_auto_restart); + /* + * An (explicit) auto-restart is an implicit continuation of the + * previous session, therefore we unset "clean_restart" to signal that. + * In effect, this keeps the same GUID and KUID regardless of whether + * they are sticky, and it lets "session-only" searches restart. + * --RAM, 2012-12-28 + */ + gnet_prop_set_boolean_val(PROP_CLEAN_RESTART, !auto_restart); + if (auto_restart) { + g_info("restarting session as requested"); + session_start = GNET_PROPERTY(session_start_stamp); + } + } else { + uint32 pid = GNET_PROPERTY(pid); + g_warning("restarting after abnormal termination (pid was %u)", pid); + crash_exited(pid); + gnet_prop_set_boolean_val(PROP_CLEAN_RESTART, FALSE); + session_start = GNET_PROPERTY(session_start_stamp); } + gnet_prop_set_boolean_val(PROP_CLEAN_SHUTDOWN, FALSE); + gnet_prop_set_boolean_val(PROP_USER_AUTO_RESTART, FALSE); + gnet_prop_set_guint32_val(PROP_PID, (uint32) getpid()); + + /* + * On explicit auto-restart, or restart after a crash, we have propagated + * the persisted session start timestamp into ``session_start''. + * Otherwise, the value will still be zero and we're starting a new session. + * + * The session start timestamp is used to track the first time gtk-gnutella + * was started in a conscious way, so to speak. + * --RAM, 2015-04-23 + */ + + if (0 == session_start) + session_start = tm_time(); + gnet_prop_set_timestamp_val(PROP_SESSION_START_STAMP, session_start); + + /* + * Emit configuration / system information, but only if debugging. + */ + if (debugging(0)) { g_info("stdio %s handle file descriptors larger than 256", - need_get_non_stdio_fd() ? "cannot" : "can"); + fd_need_non_stdio() ? "cannot" : "can"); + g_info("detected %ld CPU%s", cpus, plural(cpus)); g_info("detected amount of physical RAM: %s", short_size(memory, GNET_PROPERTY(display_metric_units))); g_info("process can use at maximum: %s", - short_kb_size(amount, GNET_PROPERTY(display_metric_units))); + short_kb_size(maxvm, GNET_PROPERTY(display_metric_units))); g_info("process can use %u file descriptors", max_fd); g_info("max I/O vector size is %d items", MAX_IOV_COUNT); g_info("virtual memory page size is %zu bytes", compat_pagesize()); @@ -747,29 +744,50 @@ } else { g_info("no CPU frequency scaling detected"); } + + { + tm_nano_t tn; + bool system_precision; + const char *prefix = { "n", "u", "m", "" }; + ulong nano, val; + size_t p; + + system_precision = tm_precise_granularity(&tn); + nano = tmn2ns(&tn); + + for (p = 0, val = nano; p < N_ITEMS(prefix); p++) { + if (1000UL * (val / 1000UL) != val) + break; + val /= 1000UL; + } + + g_info("%ssystem clock granularity is %lu %ss", + system_precision ? "" : "computed ", val, prefixp); + } } upload_stats_load_history(); /* Loads the upload statistics */ - /* watch for filter_file defaults */ if (GNET_PROPERTY(hard_ttl_limit) < GNET_PROPERTY(max_ttl)) { - *(guint32 *) &GNET_PROPERTY(hard_ttl_limit) = GNET_PROPERTY(max_ttl); + *(uint32 *) &GNET_PROPERTY(hard_ttl_limit) = GNET_PROPERTY(max_ttl); g_warning("hard_ttl_limit was too small, adjusted to %u", GNET_PROPERTY(hard_ttl_limit)); } /* Flow control depends on this being not too small */ if (GNET_PROPERTY(node_sendqueue_size) < 1.5 * settings_max_msg_size()) { - *(guint32 *) &GNET_PROPERTY(node_sendqueue_size) = - (guint32) (1.5 * settings_max_msg_size()); + *(uint32 *) &GNET_PROPERTY(node_sendqueue_size) = + (uint32) (1.5 * settings_max_msg_size()); g_warning("node_sendqueue_size was too small, adjusted to %u", GNET_PROPERTY(node_sendqueue_size)); } /* propagate randomness from previous run */ + settings_random_reload(); /* Before calling random_add() */ + { sha1_t buf; /* 160 bits */ @@ -781,7 +799,10 @@ settings_update_downtime(); settings_update_firewalled(); settings_callbacks_init(); + settings_handle_upgrades(); settings_init_running = FALSE; + + settings_save_if_dirty(); /* Ensure "clean_shutdown" is now FALSE */ return; no_config_dir: @@ -793,16 +814,38 @@ /** * Generate new randomness. */ -void -settings_add_randomness(void) +static void +settings_gen_randomness(void *unused) { sha1_t buf; /* 160 bits */ - random_bytes(&buf, SHA1_RAW_SIZE); + (void) unused; + g_assert(thread_is_main()); + + aje_random_bytes(&buf, SHA1_RAW_SIZE); gnet_prop_set_storage(PROP_RANDOMNESS, &buf, sizeof buf); } /** + * Generate new randomness. + * + * This is an event callback invoked when new randomness has been flushed + * to random number generators. + */ +void +settings_add_randomness(void) +{ + /* + * Since this can be called from any thread collecting and feeding entropy + * to the global random pool, we need to funnel back the generation to + * the main thread, using a "safe" event in case some callbacks are attached + * to the change of the "randomness" property. + */ + + teq_safe_post(THREAD_MAIN, settings_gen_randomness, NULL); +} + +/** * Get the config directory */ const char * @@ -870,7 +913,7 @@ /** * Are we running as a leaf node? */ -gboolean +bool settings_is_leaf(void) { return NODE_P_LEAF == GNET_PROPERTY(current_peermode); @@ -879,7 +922,7 @@ /** * Are we running as a ultra node? */ -gboolean +bool settings_is_ultra(void) { return NODE_P_ULTRA == GNET_PROPERTY(current_peermode); @@ -888,7 +931,7 @@ /** * Can we use IPv4? */ -gboolean +bool settings_use_ipv4(void) { return @@ -899,7 +942,7 @@ /** * Can we use IPv6? */ -gboolean +bool settings_use_ipv6(void) { return @@ -910,7 +953,7 @@ /** * Are we running with a valid IPv4 address? */ -gboolean +bool settings_running_ipv4(void) { host_addr_t ha = listen_addr(); @@ -921,7 +964,7 @@ /** * Are we running with a valid IPv6 address? */ -gboolean +bool settings_running_ipv6(void) { host_addr_t ha = listen_addr6(); @@ -932,7 +975,7 @@ /** * Are we running with both IPv4 and IPv6 addresses? */ -gboolean +bool settings_running_ipv4_and_ipv6(void) { return settings_running_ipv6() && settings_running_ipv4(); @@ -941,7 +984,7 @@ /** * Are we running with only an IPv6 address? */ -gboolean +bool settings_running_ipv6_only(void) { return settings_running_ipv6() && !settings_running_ipv4(); @@ -951,7 +994,7 @@ * Are we running with only an IP address on the same network as the one * given as argument? */ -gboolean +bool settings_running_same_net(const host_addr_t addr) { switch (host_addr_net(addr)) { @@ -973,10 +1016,10 @@ * When only IPv4 or IPv6 is allowed, the connection to an address not * belonging to that allowed protocol is not permitted. */ -gboolean +bool settings_can_connect(const host_addr_t addr) { - static gboolean warned = FALSE; + static bool warned = FALSE; switch (GNET_PROPERTY(network_protocol)) { case NET_USE_BOTH: @@ -1031,29 +1074,78 @@ } /** - * Remove "path/lockfile". + * Fill-in given file_path_t array to be able to load a given file. + * + * Several paths need to be looked-up, in order: + * - if OFFICIAL_BUILD is not set, the "extra_files" directory in the sources + * - the configuration directory (e.g. ~/.gtk-gnutella) + * - the dynamic private library path, as returned by get_folder_path() + * - the hardwired private library install path PRIVLIB_EXP + * + * Some flags can alter the default behaviour: + * + * SFP_NO_CONFIG if set, do not include the configuration directory + * SFP_ALL include all fallbacks, even if file present in config dir + * + * @param fp a 4-item array (at least) that will be filled + * @param file the file name to load + * @param flags operating flags + * + * @return the amount of entries filled within fp. */ -static void -settings_remove_lockfile(const char *path, const char *lockfile) +uint +settings_file_path_load(file_path_t fp4, const char *file, uint flags) { - char *file; + unsigned i = 0; + const char *config = settings_config_dir(); + bool exists; - g_return_if_fail(!is_null_or_empty(path)); - g_return_if_fail(lockfile); + exists = filepath_exists(config, file); /* Present in config dir? */ - file = make_pathname(path, lockfile); - if (-1 == unlink(file)) { - s_warning("could not remove lockfile \"%s\": %m", file); +#ifndef OFFICIAL_BUILD + /* + * Only include the version from "extra_files" if the file is currently + * not present in the configuration directory (to give priority to + * the configuration directory but avoid error messages about the file + * not being present there, if we were blindly putting the configuration + * directory first!). + */ + + if (!exists) + file_path_set(&fpi++, PACKAGE_EXTRA_SOURCE_DIR, file); +#endif /* !OFFICIAL_BUILD */ + + /* + * Same logic as above: we want to include the configuration directory + * only if the file is present. If it is not, it will have to be + * loaded from installed defaults, but we do not wish to see a warning + * saying that we cannot load the file from there. + * + * If the file is present, we want to load it from there anyway, so it + * is not needed to fill-in the other path components which only hold + * defaults. + */ + + if (exists && !(flags & SFP_NO_CONFIG)) + file_path_set(&fpi++, config, file); + + if (!exists || (flags & SFP_ALL) || 0 == i) { + const char *tmp = get_folder_path(PRIVLIB_PATH); + if (tmp != NULL) + file_path_set(&fpi++, tmp, file); + + file_path_set(&fpi++, PRIVLIB_EXP, file); } - HFREE_NULL(file); + + return i; } static void addr_ipv4_changed(const host_addr_t new_addr, const host_addr_t peer) { - static guint same_addr_count = 0; + static uint same_addr_count = 0; static host_addr_t peers3, last_addr_seen; - guint i; + uint i; g_return_if_fail(host_addr_is_ipv4(new_addr)); g_return_if_fail(host_addr_is_ipv4(peer)); @@ -1073,31 +1165,36 @@ return; } - for (i = 0; i < G_N_ELEMENTS(peers); i++) { - if (host_addr_matches(peer, new_addr, 16)) /* CIDR /16 */ + /* + * Ignore peers reporting new address if in the same /16 space as other + * recent peers who have reported a new address before. + */ + + for (i = 0; i < N_ITEMS(peers); i++) { + if (host_addr_matches(peer, peersi, 16)) /* CIDR /16 */ return; } - if (!host_addr_equal(new_addr, last_addr_seen)) { + if (!host_addr_equiv(new_addr, last_addr_seen)) { last_addr_seen = new_addr; same_addr_count = 1; - peers0 = peer; + peers0 = peer; /* First peer to report new address */ return; } - g_assert(same_addr_count > 0 && same_addr_count < G_N_ELEMENTS(peers)); + g_assert(same_addr_count > 0 && same_addr_count < N_ITEMS(peers)); peerssame_addr_count = peer; - if (++same_addr_count < G_N_ELEMENTS(peers)) + if (++same_addr_count < N_ITEMS(peers)) return; last_addr_seen = zero_host_addr; same_addr_count = 0; - for (i = 0; i < G_N_ELEMENTS(peers); i++) { + for (i = 0; i < N_ITEMS(peers); i++) { peersi = zero_host_addr; } - if (host_addr_equal(new_addr, GNET_PROPERTY(local_ip))) + if (host_addr_equiv(new_addr, GNET_PROPERTY(local_ip))) return; gnet_prop_set_ip_val(PROP_LOCAL_IP, new_addr); @@ -1106,9 +1203,9 @@ static void addr_ipv6_changed(const host_addr_t new_addr, const host_addr_t peer) { - static guint same_addr_count = 0; + static uint same_addr_count = 0; static host_addr_t peers3, last_addr_seen; - guint i; + uint i; g_return_if_fail(host_addr_is_ipv6(new_addr)); g_return_if_fail(host_addr_is_ipv6(peer)); @@ -1128,37 +1225,41 @@ return; } - for (i = 0; i < G_N_ELEMENTS(peers); i++) { - if (host_addr_matches(peer, new_addr, 64)) /* CIDR /64 */ + /* + * Ignore peers reporting new address if in the same /64 space as other + * recent peers who have reported a new address before. + */ + + for (i = 0; i < N_ITEMS(peers); i++) { + if (host_addr_matches(peer, peersi, 64)) /* CIDR /64 */ return; } - if (!host_addr_equal(new_addr, last_addr_seen)) { + if (!host_addr_equiv(new_addr, last_addr_seen)) { last_addr_seen = new_addr; same_addr_count = 1; - peers0 = peer; + peers0 = peer; /* First peer to report new address */ return; } - g_assert(same_addr_count > 0 && same_addr_count < G_N_ELEMENTS(peers)); + g_assert(same_addr_count > 0 && same_addr_count < N_ITEMS(peers)); peerssame_addr_count = peer; - if (++same_addr_count < G_N_ELEMENTS(peers)) + if (++same_addr_count < N_ITEMS(peers)) return; last_addr_seen = zero_host_addr; same_addr_count = 0; - for (i = 0; i < G_N_ELEMENTS(peers); i++) { + for (i = 0; i < N_ITEMS(peers); i++) { peersi = zero_host_addr; } - if (host_addr_equal(new_addr, GNET_PROPERTY(local_ip6))) + if (host_addr_equiv(new_addr, GNET_PROPERTY(local_ip6))) return; gnet_prop_set_ip_val(PROP_LOCAL_IP6, new_addr); } - /** * This routine is called when we determined that our IP was no longer the * one we computed. @@ -1215,7 +1316,7 @@ /** * Maximum message payload size we are configured to handle. */ -guint32 +uint32 settings_max_msg_size(void) { /* @@ -1227,7 +1328,7 @@ * -- RAM, 24/12/2003 */ - guint32 maxsize; + uint32 maxsize; maxsize = GNET_PROPERTY(search_queries_kick_size); maxsize = MAX(maxsize, GNET_PROPERTY(search_answers_kick_size)); @@ -1239,11 +1340,22 @@ /** * Called at exit time to flush the property files. */ -G_GNUC_COLD void +void G_COLD settings_shutdown(void) { + /* + * We're indicating that a graceful shutdown was requested. + * + * We have no assurance that no crash will happen before everything + * is actually completely shutdown, but at least this will signal that + * the program was explicitly scheduled to terminate. + */ + + gnet_prop_set_boolean_val(PROP_CLEAN_SHUTDOWN, TRUE); + update_uptimes(); remember_local_addr_port(); + settings_random_save(debugging(0)); settings_callbacks_shutdown(); prop_save_to_file(properties, config_dir, config_file); @@ -1264,14 +1376,11 @@ void settings_close(void) { - fd_forget_and_close(&pidfile_fd); - fd_forget_and_close(&save_file_path_lock); + filelock_free_null(&pidfile_lock); + filelock_free_null(&save_file_path_lock); - settings_remove_lockfile(config_dir, pidfile); - settings_remove_lockfile(GNET_PROPERTY(save_file_path), dirlockfile); gnet_prop_shutdown(); - HFREE_NULL(home_dir); HFREE_NULL(config_dir); HFREE_NULL(crash_dir); HFREE_NULL(dht_db_dir); @@ -1285,10 +1394,11 @@ settings_terminate(void) { tx_debug_set_addrs(""); /* Free up any registered addresses */ + rx_debug_set_addrs(""); /* Idem */ } static void -bw_stats(gnet_bw_stats_t *s, gboolean enabled, bsched_bws_t bws) +bw_stats(gnet_bw_stats_t *s, bool enabled, bsched_bws_t bws) { s->enabled = enabled; s->current = bsched_bps(bws); @@ -1345,18 +1455,18 @@ * Compute the EMA of the IP address lifetime up to now, but do not * update the property. */ -guint32 +uint32 get_average_ip_lifetime(time_t now, enum net_type net) { - guint32 lifetime, average; + uint32 lifetime, average; time_t stamp; switch (net) { - case NET_TYPE_IPV4: + case NET_TYPE_IPV4: stamp = GNET_PROPERTY(current_ip_stamp); average = GNET_PROPERTY(average_ip_uptime); break; - case NET_TYPE_IPV6: + case NET_TYPE_IPV6: stamp = GNET_PROPERTY(current_ip6_stamp); average = GNET_PROPERTY(average_ip6_uptime); break; @@ -1401,7 +1511,7 @@ } } - if (!host_addr_equal(old_addr, addr)) { + if (!host_addr_equiv(old_addr, addr)) { /* * IPv4 address changed, update lifetime information. */ @@ -1422,7 +1532,7 @@ } } - if (!host_addr_equal(old_addr_v6, addr)) { + if (!host_addr_equiv(old_addr_v6, addr)) { /* * IPv6 address changed, update lifetime information. */ @@ -1446,21 +1556,25 @@ /* * If our address or port changed, we may have to republish our push * proxies to the DHT. + * + * We also need to invalidate all our GUESS query keys when the IP:port + * changes, since a query key is a function of our IP address. */ pdht_prox_publish_if_changed(); + guess_invalidate_keys(); } /** * Compute the EMA of the averate servent uptime, up to now, but do not * update the property. */ -guint32 +uint32 get_average_servent_uptime(time_t now) { - guint32 avg; + uint32 avg; time_delta_t d; - glong uptime; + long uptime; d = delta_time(now, GNET_PROPERTY(start_stamp)); uptime = MAX(0, d); @@ -1499,7 +1613,8 @@ /*** *** Callbacks ***/ -static gboolean + +static bool up_connections_changed(property_t prop) { g_assert(PROP_UP_CONNECTIONS == prop); @@ -1511,7 +1626,7 @@ return FALSE; } -static gboolean +static bool max_connections_changed(property_t prop) { g_assert(PROP_MAX_CONNECTIONS == prop); @@ -1523,7 +1638,7 @@ return FALSE; } -static gboolean +static bool max_hosts_cached_changed(property_t prop) { g_assert(PROP_MAX_HOSTS_CACHED == prop); @@ -1532,7 +1647,7 @@ return FALSE; } -static gboolean +static bool max_ultra_hosts_cached_changed(property_t prop) { g_assert(PROP_MAX_ULTRA_HOSTS_CACHED == prop); @@ -1541,7 +1656,16 @@ return FALSE; } -static gboolean +static bool +max_g2hub_hosts_cached_changed(property_t prop) +{ + g_assert(PROP_MAX_G2HUB_HOSTS_CACHED == prop); + hcache_prune(HCACHE_FRESH_G2HUB); + + return FALSE; +} + +static bool max_bad_hosts_cached_changed(property_t prop) { g_assert(PROP_MAX_BAD_HOSTS_CACHED == prop); @@ -1557,7 +1681,7 @@ get_bind_addr(enum net_type net) { host_addr_t addr = zero_host_addr; - + switch (net) { case NET_TYPE_IPV4: addr = GNET_PROPERTY(force_local_ip) @@ -1591,11 +1715,11 @@ return addr; } -static gboolean +static bool enable_udp_changed(property_t prop) { - gboolean enabled; - + bool enabled; + gnet_prop_get_boolean_val(prop, &enabled); if (enabled) { if (s_tcp_listen) { @@ -1627,11 +1751,11 @@ return FALSE; } -static gboolean +static bool enable_dht_changed(property_t prop) { - gboolean enabled; - + bool enabled; + gnet_prop_get_boolean_val(prop, &enabled); if (enabled) { /* Will start the DHT if UDP enabled otherwise */ @@ -1643,13 +1767,44 @@ return FALSE; } -static gboolean +static bool +enable_g2_changed(property_t prop) +{ + bool enabled, guess_enabled; + + gnet_prop_get_boolean_val(prop, &enabled); + node_update_g2(enabled); + + /* + * As soon as either GUESS of G2 querying is enabled, we have to start + * the GUESS layer. + */ + + gnet_prop_get_boolean_val(PROP_ENABLE_GUESS, &guess_enabled); + + if (enabled || guess_enabled) { + guess_init(); + } else { + guess_close(); + } + + return FALSE; +} + +static bool enable_guess_changed(property_t prop) { - gboolean enabled; - + bool enabled, g2_enabled; + + /* + * As soon as either GUESS of G2 querying is enabled, we have to start + * the GUESS layer. + */ + + gnet_prop_get_boolean_val(PROP_ENABLE_G2, &g2_enabled); gnet_prop_get_boolean_val(prop, &enabled); - if (enabled) { + + if (enabled || g2_enabled) { guess_init(); } else { guess_close(); @@ -1658,11 +1813,11 @@ return FALSE; } -static gboolean +static bool enable_upnp_changed(property_t prop) { - gboolean enabled; - + bool enabled; + gnet_prop_get_boolean_val(prop, &enabled); if (enabled) { upnp_post_init(); @@ -1673,11 +1828,11 @@ return FALSE; } -static gboolean +static bool enable_natpmp_changed(property_t prop) { - gboolean enabled; - + bool enabled; + gnet_prop_get_boolean_val(prop, &enabled); if (enabled) { upnp_post_init(); @@ -1688,7 +1843,7 @@ return FALSE; } -static gboolean +static bool is_udp_firewalled_changed(property_t prop) { (void) prop; @@ -1697,7 +1852,7 @@ return FALSE; } -static gboolean +static bool pfsp_server_changed(property_t prop) { (void) prop; @@ -1706,7 +1861,7 @@ return FALSE; } -static gboolean +static bool query_answer_partials_changed(property_t prop) { (void) prop; @@ -1725,7 +1880,7 @@ return FALSE; } -static gboolean +static bool tx_debug_addrs_changed(property_t prop) { char *s = gnet_prop_get_string(prop, NULL, 0); @@ -1735,11 +1890,59 @@ return FALSE; } -static gboolean +static bool +rx_debug_addrs_changed(property_t prop) +{ + char *s = gnet_prop_get_string(prop, NULL, 0); + + rx_debug_set_addrs(s); + G_FREE_NULL(s); + return FALSE; +} + +static bool +dump_rx_addrs_changed(property_t prop) +{ + char *s = gnet_prop_get_string(prop, NULL, 0); + + dump_rx_set_addrs(s); + G_FREE_NULL(s); + return FALSE; +} + +static bool +dump_tx_from_addrs_changed(property_t prop) +{ + char *s = gnet_prop_get_string(prop, NULL, 0); + + dump_tx_set_from_addrs(s); + G_FREE_NULL(s); + return FALSE; +} + +static bool +dump_tx_to_addrs_changed(property_t prop) +{ + char *s = gnet_prop_get_string(prop, NULL, 0); + + dump_tx_set_to_addrs(s); + G_FREE_NULL(s); + return FALSE; +} + +static bool +dht_tcache_debug_changed(property_t prop) +{ + (void) prop; + tcache_debugging_changed(); + return FALSE; +} + +static bool enable_local_socket_changed(property_t prop) { - gboolean enabled; - + bool enabled; + gnet_prop_get_boolean_val(prop, &enabled); if (enabled) { if (!s_local_listen) { @@ -1767,7 +1970,7 @@ } static void -request_new_sockets(guint16 port, gboolean check_firewalled) +request_new_sockets(uint16 port, bool check_firewalled) { /* Also takes care of freeing s_udp_listen and s_udp_listen6 */ node_udp_disable(); @@ -1788,7 +1991,7 @@ */ if (0 == port) - return; + goto done; /* * If UDP is enabled, also listen on the same UDP port. @@ -1799,7 +2002,7 @@ s_tcp_listen = socket_tcp_listen(bind_addr, port); - if (GNET_PROPERTY(enable_udp)) { + if (GNET_PROPERTY(enable_udp) && s_tcp_listen != NULL) { g_assert(NULL == s_udp_listen); s_udp_listen = socket_udp_listen(bind_addr, port, udp_received); @@ -1813,7 +2016,7 @@ host_addr_t bind_addr = get_bind_addr(NET_TYPE_IPV6); s_tcp_listen6 = socket_tcp_listen(bind_addr, port); - if (GNET_PROPERTY(enable_udp)) { + if (GNET_PROPERTY(enable_udp) && s_tcp_listen6 != NULL) { g_assert(NULL == s_udp_listen6); s_udp_listen6 = socket_udp_listen(bind_addr, port, udp_received); @@ -1823,7 +2026,7 @@ } } } - + if (GNET_PROPERTY(enable_udp)) { node_update_udp_socket(); } @@ -1832,12 +2035,20 @@ inet_firewalled(); inet_udp_firewalled(TRUE); } + +done: + /* + * Let them know when they have no listening socket established. + */ + + gnet_prop_set_boolean_val(PROP_TCP_NO_LISTENING, + NULL == s_tcp_listen && NULL == s_tcp_listen6); } -static gboolean +static bool listen_port_changed(property_t prop) { - static guint32 old_port = (guint32) -1; + static uint32 old_port = (uint32) -1; /* * If port did not change values, do nothing. @@ -1849,7 +2060,7 @@ ) return FALSE; - if (old_port != (guint32) -1) { + if (old_port != (uint32) -1) { upnp_unmap_tcp(old_port); upnp_unmap_udp(old_port); } @@ -1865,8 +2076,8 @@ request_new_sockets(GNET_PROPERTY(listen_port), FALSE); } else { bit_array_t triedBIT_ARRAY_SIZE(65536); - guint num_tried = 0; - guint32 port = GNET_PROPERTY(listen_port); + uint num_tried = 0; + uint32 port = GNET_PROPERTY(listen_port); /* Mark ports below 1024 as already tried, these ports can * be configured manually but we don't want to pick one of @@ -1878,10 +2089,12 @@ bit_array_set_range(tried, 0, 1023); bit_array_clear_range(tried, 1024, 65535); +#define PORT_RANGE (65535 - 1024) + do { - guint32 i; + uint32 i; - i = random_value(65535 - 1024) + 1024; + i = random_value(PORT_RANGE) + 1024; port = i; /* Check whether this port was tried before */ @@ -1899,7 +2112,9 @@ if (s_tcp_listen || s_tcp_listen6) break; - } while (++num_tried < 65535 - 1024); + } while (++num_tried < PORT_RANGE); + +#undef PORT_RANGE old_port = port; gnet_prop_set_guint32_val(prop, port); @@ -1914,7 +2129,7 @@ upnp_map_tcp(old_port); if (s_udp_listen != NULL) - upnp_map_udp(old_port); + upnp_map_udp(old_port); if (!settings_init_running) { inet_firewalled(); @@ -1927,18 +2142,36 @@ */ if (s_tcp_listen == NULL && GNET_PROPERTY(listen_port) != 0) { - gcu_statusbar_warning(_("Failed to create listening sockets")); - old_port = (guint32) -1; + old_port = (uint32) -1; return TRUE; } else { old_port = GNET_PROPERTY(listen_port); remember_local_addr_port(); + guess_invalidate_keys(); /* Port changed, query keys are invalid */ } return FALSE; } -static gboolean +/** + * Re-attempt creation of listening sockets. + * + * At startup, it is possible that we may not be allowed to bind to the proper + * listining port, despite SO_REUSEADDR being set before bind(): on Linux + * this is not always working --RAM, 2015-05-17 + */ +void +settings_create_listening_sockets(void) +{ + (void) listen_port_changed(PROP_LISTEN_PORT); + + if (!GNET_PROPERTY(tcp_no_listening)) { + g_message("%s(): established TCP listening socket on port %u", + G_STRFUNC, GNET_PROPERTY(listen_port)); + } +} + +static bool network_protocol_changed(property_t prop) { @@ -1948,10 +2181,10 @@ } -static gboolean +static bool bw_switch(property_t prop, bsched_bws_t bs) { - gboolean val; + bool val; gnet_prop_get_boolean_val(prop, &val); if (val) @@ -1961,52 +2194,52 @@ return FALSE; } -static gboolean +static bool bw_http_in_enabled_changed(property_t prop) { return bw_switch(prop, BSCHED_BWS_IN); } -static gboolean +static bool bw_http_out_enabled_changed(property_t prop) { return bw_switch(prop, BSCHED_BWS_OUT); } -static gboolean +static bool bw_gnet_in_enabled_changed(property_t prop) { return bw_switch(prop, BSCHED_BWS_GIN); } -static gboolean +static bool bw_gnet_out_enabled_changed(property_t prop) { return bw_switch(prop, BSCHED_BWS_GOUT); } -static gboolean +static bool bw_gnet_lin_enabled_changed(property_t prop) { return bw_switch(prop, BSCHED_BWS_GLIN); } -static gboolean +static bool bw_gnet_lout_enabled_changed(property_t prop) { return bw_switch(prop, BSCHED_BWS_GLOUT); } -static gboolean +static bool bw_dht_out_enabled_changed(property_t prop) { return bw_switch(prop, BSCHED_BWS_DHT_OUT); } -static gboolean +static bool node_sendqueue_size_changed(property_t unused_prop) { - guint32 min = 1.5 * settings_max_msg_size(); + uint32 min = 1.5 * settings_max_msg_size(); (void) unused_prop; if (GNET_PROPERTY(node_sendqueue_size) < min) { @@ -2017,7 +2250,16 @@ return FALSE; } -static gboolean +static bool +ban_parameter_changed(property_t unused_prop) +{ + (void) unused_prop; + + ban_max_recompute(); + return FALSE; +} + +static bool scan_extensions_changed(property_t prop) { char *s = gnet_prop_get_string(prop, NULL, 0); @@ -2065,17 +2307,17 @@ return; if (0 == strcmp(pathname, "~")) { - gnet_prop_set_string(prop, eval_subst("~")); + gnet_prop_set_string(prop, gethomedir()); } else if ( is_strprefix(pathname, "~/") || is_strprefix(pathname, "~" G_DIR_SEPARATOR_S) ) { - const char *home = eval_subst("~"); + const char *home = gethomedir(); char *expanded; expanded = h_strconcat(home, '/' == pathname1 ? "/" : G_DIR_SEPARATOR_S, - &pathname2, (void *) 0); + &pathname2, NULL_PTR); gnet_prop_set_string(prop, expanded); HFREE_NULL(expanded); @@ -2108,7 +2350,7 @@ } } -static gboolean +static bool file_path_changed(property_t prop) { char *pathname; @@ -2120,7 +2362,7 @@ return FALSE; } -static gboolean +static bool save_file_path_changed(property_t prop) { static char *old_path; @@ -2138,7 +2380,7 @@ !is_null_or_empty(path) && (NULL == old_path || 0 != strcmp(path, old_path)) ) { - gboolean failure = FALSE; + bool failure = FALSE; if (request_directory(path)) { failure = TRUE; @@ -2156,17 +2398,17 @@ return TRUE; /* Force changed value */ } } - + G_FREE_NULL(old_path); old_path = NOT_LEAKING(path); return FALSE; } -static gboolean +static bool shared_dirs_paths_changed(property_t prop) { char *s = gnet_prop_get_string(prop, NULL, 0); - gboolean ok; + bool ok; ok = shared_dirs_parse(s); G_FREE_NULL(s); @@ -2179,7 +2421,7 @@ return FALSE; } -static gboolean +static bool country_limits_changed(property_t prop) { char *limits; @@ -2190,7 +2432,7 @@ return FALSE; } -static gboolean +static bool local_netmasks_string_changed(property_t prop) { char *s = gnet_prop_get_string(prop, NULL, 0); @@ -2201,7 +2443,7 @@ return FALSE; } -static gboolean +static bool hard_ttl_limit_changed(property_t prop) { g_assert(PROP_HARD_TTL_LIMIT == prop); @@ -2212,7 +2454,7 @@ return FALSE; } -static gboolean +static bool max_ttl_changed(property_t prop) { g_assert(PROP_MAX_TTL == prop); @@ -2223,10 +2465,10 @@ return FALSE; } -static gboolean +static bool bw_http_in_changed(property_t prop) { - guint32 val; + uint32 val; g_assert(PROP_BW_HTTP_IN == prop); gnet_prop_get_guint32_val(prop, &val); @@ -2236,10 +2478,10 @@ return FALSE; } -static gboolean +static bool bw_http_out_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); bsched_set_bandwidth(BSCHED_BWS_OUT, val); @@ -2248,10 +2490,10 @@ return FALSE; } -static gboolean +static bool bw_gnet_in_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); bsched_set_bandwidth(BSCHED_BWS_GIN, val / 2); @@ -2261,10 +2503,10 @@ return FALSE; } -static gboolean +static bool bw_gnet_out_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); bsched_set_bandwidth(BSCHED_BWS_GOUT, val / 2); @@ -2274,10 +2516,10 @@ return FALSE; } -static gboolean +static bool bw_gnet_lin_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); bsched_set_bandwidth(BSCHED_BWS_GLIN, val); @@ -2286,10 +2528,10 @@ return FALSE; } -static gboolean +static bool bw_gnet_lout_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); bsched_set_bandwidth(BSCHED_BWS_GLOUT, val); @@ -2298,10 +2540,10 @@ return FALSE; } -static gboolean +static bool bw_dht_out_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); bsched_set_bandwidth(BSCHED_BWS_DHT_OUT, val); @@ -2309,10 +2551,10 @@ return FALSE; } -static gboolean +static bool bw_allow_stealing_changed(property_t prop) { - gboolean val; + bool val; gnet_prop_get_boolean_val(prop, &val); @@ -2324,10 +2566,10 @@ return FALSE; } -static gboolean +static bool node_online_mode_changed(property_t prop) { - gboolean val; + bool val; gnet_prop_get_boolean_val(prop, &val); node_set_online_mode(val); @@ -2335,10 +2577,10 @@ return FALSE; } -static gboolean +static bool zalloc_always_gc_changed(property_t prop) { - gboolean val; + bool val; gnet_prop_get_boolean_val(prop, &val); set_zalloc_always_gc(val); @@ -2346,10 +2588,10 @@ return FALSE; } -static gboolean +static bool zalloc_debug_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); set_zalloc_debug(val); @@ -2357,10 +2599,10 @@ return FALSE; } -static gboolean +static bool bg_debug_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); bg_set_debug(val); @@ -2368,10 +2610,10 @@ return FALSE; } -static gboolean +static bool dbstore_debug_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); dbstore_set_debug(val); @@ -2379,10 +2621,21 @@ return FALSE; } -static gboolean +static bool +evq_debug_changed(property_t prop) +{ + uint32 val; + + gnet_prop_get_guint32_val(prop, &val); + evq_set_debug(val); + + return FALSE; +} + +static bool inputevt_debug_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); inputevt_set_debug(val); @@ -2390,10 +2643,21 @@ return FALSE; } -static gboolean +static bool +http_range_debug_changed(property_t prop) +{ + uint32 val; + + gnet_prop_get_guint32_val(prop, &val); + set_http_range_debug(val); + + return FALSE; +} + +static bool omalloc_debug_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); set_omalloc_debug(val); @@ -2401,10 +2665,10 @@ return FALSE; } -static gboolean +static bool palloc_debug_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); set_palloc_debug(val); @@ -2412,10 +2676,21 @@ return FALSE; } -static gboolean +static bool +tm_debug_changed(property_t prop) +{ + uint32 val; + + gnet_prop_get_guint32_val(prop, &val); + set_tm_debug(val); + + return FALSE; +} + +static bool vmm_debug_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); set_vmm_debug(val); @@ -2423,10 +2698,10 @@ return FALSE; } -static gboolean +static bool vxml_debug_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); set_vxml_debug(val); @@ -2434,10 +2709,10 @@ return FALSE; } -static gboolean +static bool xmalloc_debug_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); set_xmalloc_debug(val); @@ -2445,10 +2720,21 @@ return FALSE; } -static gboolean +static bool +tmalloc_debug_changed(property_t prop) +{ + uint32 val; + + gnet_prop_get_guint32_val(prop, &val); + set_tmalloc_debug(val); + + return FALSE; +} + +static bool lib_debug_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); set_library_debug(val); @@ -2456,10 +2742,10 @@ return FALSE; } -static gboolean +static bool lib_stats_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); set_library_stats(val); @@ -2467,7 +2753,7 @@ return FALSE; } -static gboolean +static bool forced_local_ip_changed(property_t prop) { (void) prop; @@ -2478,7 +2764,7 @@ return FALSE; } -static gboolean +static bool local_addr_changed(property_t prop) { enum net_type net; @@ -2501,29 +2787,27 @@ /* If the address is invalid or does not match the network type; * reset it and try to guess the correct one by looking at all * network interfaces. - */ + */ if ( !is_host_addr(addr) || net != host_addr_net(addr) || host_addr_is_ipv4_mapped(addr) || NET_TYPE_IPV6 == net ) { - GSList *sl_addrs, *sl; + pslist_t *sl_addrs, *sl; host_addr_t old_addr = addr; addr = zero_host_addr; sl_addrs = host_addr_get_interface_addrs(net); - for (sl = sl_addrs; NULL != sl; sl = g_slist_next(sl)) { - host_addr_t *addr_ptr; - - addr_ptr = sl->data; + PSLIST_FOREACH(sl_addrs, sl) { + host_addr_t *addr_ptr = sl->data; if (host_addr_is_routable(*addr_ptr)) { addr = *addr_ptr; break; } } host_addr_free_interface_addrs(&sl_addrs); - if (!host_addr_equal(old_addr, addr)) { + if (!host_addr_equiv(old_addr, addr)) { gnet_prop_set_ip_val(prop, addr); } } @@ -2532,11 +2816,11 @@ return FALSE; } -static gboolean +static bool configured_peermode_changed(property_t prop) { - guint32 val; - gboolean forced = FALSE; + uint32 val; + bool forced = FALSE; gnet_prop_get_guint32_val(prop, &val); @@ -2545,7 +2829,7 @@ * mode, it can be assumed that he knows what he's doing. Also, * while it's sub-optimal it's not absolutely required for an * ultrapeer to accept incoming connections (from external hosts). - * + * * --cbiere, 2005-05-14 */ #if 0 @@ -2584,7 +2868,7 @@ return forced; } -static gboolean +static bool current_peermode_changed(property_t prop) { (void) prop; @@ -2595,10 +2879,10 @@ return FALSE; } -static gboolean +static bool configured_dht_mode_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); dht_configured_mode_changed(val); @@ -2606,10 +2890,10 @@ return FALSE; } -static gboolean +static bool download_rx_size_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); download_set_socket_rx_size(val * 1024); @@ -2617,10 +2901,10 @@ return FALSE; } -static gboolean +static bool node_rx_size_changed(property_t prop) { - guint32 val; + uint32 val; gnet_prop_get_guint32_val(prop, &val); node_set_socket_rx_size(val * 1024); @@ -2646,17 +2930,16 @@ * Reset the property. */ static void -reset_property_cb(cqueue_t *unused_cq, gpointer obj) +reset_property_cb(cqueue_t *cq, void *obj) { property_t prop = (property_t) GPOINTER_TO_UINT(obj); - (void) unused_cq; switch (prop) { case PROP_FILE_DESCRIPTOR_SHORTAGE: - ev_file_descriptor_shortage = NULL; + cq_zero(cq, &ev_file_descriptor_shortage); break; case PROP_FILE_DESCRIPTOR_RUNOUT: - ev_file_descriptor_runout = NULL; + cq_zero(cq, &ev_file_descriptor_runout); break; default: g_error("unhandled property #%d", prop); @@ -2666,10 +2949,10 @@ gnet_prop_set_boolean_val(prop, FALSE); } -static gboolean +static bool file_descriptor_x_changed(property_t prop) { - gboolean state; + bool state; cevent_t **ev = NULL; gnet_prop_get_boolean_val(prop, &state); @@ -2711,11 +2994,21 @@ typedef struct prop_map { property_t prop; /**< property handle */ prop_changed_listener_t cb; /**< callback function */ - gboolean init; /**< init widget with current value */ + bool init; /**< init widget with current value */ } prop_map_t; static prop_map_t property_map = { { + PROP_BAN_RATIO_FDS, + ban_parameter_changed, + FALSE + }, + { + PROP_BAN_MAX_FDS, + ban_parameter_changed, + FALSE + }, + { PROP_NODE_SENDQUEUE_SIZE, node_sendqueue_size_changed, TRUE @@ -2751,6 +3044,11 @@ TRUE }, { + PROP_MAX_G2HUB_HOSTS_CACHED, + max_g2hub_hosts_cached_changed, + TRUE + }, + { PROP_MAX_BAD_HOSTS_CACHED, max_bad_hosts_cached_changed, TRUE @@ -2891,6 +3189,21 @@ TRUE /* Need to call callback at init time */ }, { + PROP_EVQ_DEBUG, + evq_debug_changed, + TRUE + }, + { + PROP_TM_DEBUG, + tm_debug_changed, + TRUE + }, + { + PROP_TMALLOC_DEBUG, + tmalloc_debug_changed, + TRUE + }, + { PROP_VXML_DEBUG, vxml_debug_changed, TRUE @@ -2926,6 +3239,11 @@ TRUE }, { + PROP_HTTP_RANGE_DEBUG, + http_range_debug_changed, + TRUE + }, + { PROP_OMALLOC_DEBUG, omalloc_debug_changed, TRUE @@ -3036,6 +3354,11 @@ FALSE, }, { + PROP_ENABLE_G2, + enable_g2_changed, + FALSE, + }, + { PROP_ENABLE_GUESS, enable_guess_changed, FALSE, @@ -3071,21 +3394,51 @@ FALSE, }, { + PROP_RX_DEBUG_ADDRS, + rx_debug_addrs_changed, + TRUE, + }, + { PROP_TX_DEBUG_ADDRS, tx_debug_addrs_changed, TRUE, }, + { + PROP_DUMP_RX_ADDRS, + dump_rx_addrs_changed, + TRUE, + }, + { + PROP_DUMP_TX_FROM_ADDRS, + dump_tx_from_addrs_changed, + TRUE, + }, + { + PROP_DUMP_TX_TO_ADDRS, + dump_tx_to_addrs_changed, + TRUE, + }, + { + PROP_DHT_TCACHE_DEBUG, + dht_tcache_debug_changed, + FALSE, + }, + { + PROP_DHT_TCACHE_DEBUG_FLAGS, + dht_tcache_debug_changed, + TRUE, + }, }; /*** *** Control functions ***/ -#define PROPERTY_MAP_SIZE G_N_ELEMENTS(property_map) +#define PROPERTY_MAP_SIZE N_ITEMS(property_map) -static gboolean init_listGNET_PROPERTY_NUM; +static bool init_listGNET_PROPERTY_NUM; -static G_GNUC_COLD void +static void G_COLD settings_callbacks_init(void) { unsigned n; @@ -3094,16 +3447,16 @@ init_listn = FALSE; if (GNET_PROPERTY(dbg) >= 2) { - g_debug("settings_callbacks_init: property_map size: %u", - (guint) PROPERTY_MAP_SIZE); + g_debug("%s: property_map size: %u", + G_STRFUNC, (uint) PROPERTY_MAP_SIZE); } for (n = 0; n < PROPERTY_MAP_SIZE; n ++) { property_t prop = property_mapn.prop; - guint32 idx = prop - GNET_PROPERTY_MIN; + uint32 idx = prop - GNET_PROPERTY_MIN; if (init_listidx) { - g_error("settings_callbacks_init: property %u already mapped", n); + g_error("%s: property %u already mapped", G_STRFUNC, n); } init_listidx = TRUE; @@ -3113,16 +3466,16 @@ property_mapn.cb, property_mapn.init); } else if (GNET_PROPERTY(dbg) >= 10) { - g_warning("settings_callbacks_init: property ignored: %s", - gnet_prop_name(prop)); + g_warning("%s: property ignored: %s", + G_STRFUNC, gnet_prop_name(prop)); } } if (GNET_PROPERTY(dbg) >= 1) { for (n = 0; n < GNET_PROPERTY_NUM; n++) { if (!init_listn) - g_message("settings_callbacks_init: unmapped property: %s", - gnet_prop_name(n+GNET_PROPERTY_MIN)); + g_message("%s: unmapped property: %s", + G_STRFUNC, gnet_prop_name(n+GNET_PROPERTY_MIN)); } } } @@ -3130,7 +3483,7 @@ static void settings_callbacks_shutdown(void) { - guint n; + uint n; cq_cancel(&ev_file_descriptor_shortage); cq_cancel(&ev_file_descriptor_runout);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/settings.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/settings.h
Changed
@@ -40,6 +40,7 @@ #include "if/core/settings.h" #include "lib/host_addr.h" +#include "lib/file.h" /* For file_path_t */ /** * Global Data. @@ -51,37 +52,49 @@ * Global Functions */ -gboolean is_my_address(const host_addr_t addr); -gboolean is_my_address_and_port(const host_addr_t addr, guint16 port); +bool is_my_address(const host_addr_t addr); +bool is_my_address_and_port(const host_addr_t addr, uint16 port); void settings_early_init(void); -gboolean settings_is_unique_instance(void); +void settings_unique_instance(bool is_supervisor); +bool settings_is_unique_instance(void); void settings_init(void); void settings_save_if_dirty(void); +void settings_random_save(bool verbose); void settings_shutdown(void); void settings_addr_changed(const host_addr_t new_addr, const host_addr_t peer); -guint32 settings_max_msg_size(void); +uint32 settings_max_msg_size(void); void settings_add_randomness(); void settings_close(void); void settings_terminate(void); +void settings_create_listening_sockets(void); -guint32 get_average_servent_uptime(time_t now); -guint32 get_average_ip_lifetime(time_t now, enum net_type net); +uint32 get_average_servent_uptime(time_t now); +uint32 get_average_ip_lifetime(time_t now, enum net_type net); -gboolean settings_is_leaf(void); -gboolean settings_is_ultra(void); -gboolean settings_use_ipv4(void); -gboolean settings_use_ipv6(void); -gboolean settings_running_ipv4(void); -gboolean settings_running_ipv6(void); -gboolean settings_running_ipv4_and_ipv6(void); -gboolean settings_running_ipv6_only(void); -gboolean settings_running_same_net(const host_addr_t addr); -gboolean settings_can_connect(const host_addr_t addr); +bool settings_is_leaf(void); +bool settings_is_ultra(void); +bool settings_use_ipv4(void); +bool settings_use_ipv6(void); +bool settings_running_ipv4(void); +bool settings_running_ipv6(void); +bool settings_running_ipv4_and_ipv6(void); +bool settings_running_ipv6_only(void); +bool settings_running_same_net(const host_addr_t addr); +bool settings_can_connect(const host_addr_t addr); host_addr_t listen_addr_primary(void); host_addr_t listen_addr_primary_net(host_net_t net); +/** + * Flags for settings_file_path_load(). + */ +#define SFP_DFLT 0 /**< Defaults */ +#define SFP_NO_CONFIG (1U << 0) /**< Don't include the config directory */ +#define SFP_ALL (1U << 1) /**< Include all fallbacks */ + +uint settings_file_path_load(file_path_t fp, const char *file, uint flags); + #endif /* _core_settings_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/share.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/share.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2001-2005, Raphael Manfredi + * Copyright (c) 2001-2005, 2013 Raphael Manfredi * Copyright (c) 2000 Daniel Walker (dwalker@cats.ucsc.edu) * *---------------------------------------------------------------------- @@ -31,14 +31,15 @@ * @author Daniel Walker (dwalker@cats.ucsc.edu) * @date 2000 * @author Raphael Manfredi - * @date 2001-2005 + * @date 2001-2005, 2013 */ #include "common.h" #include "share.h" -#include "extensions.h" + #include "downloads.h" +#include "extensions.h" #include "fileinfo.h" #include "ggep_type.h" #include "gmsg.h" @@ -55,6 +56,7 @@ #include "search.h" #include "settings.h" #include "spam.h" +#include "tth_cache.h" #include "upload_stats.h" #include "uploads.h" @@ -63,20 +65,32 @@ #include "if/bridge/c2ui.h" #include "lib/ascii.h" +#include "lib/atomic.h" #include "lib/atoms.h" +#include "lib/barrier.h" #include "lib/bg.h" #include "lib/cq.h" #include "lib/endian.h" #include "lib/file.h" -#include "lib/glib-missing.h" +#include "lib/getcpucount.h" #include "lib/halloc.h" -#include "lib/hashlist.h" +#include "lib/hashing.h" +#include "lib/hikset.h" +#include "lib/hset.h" +#include "lib/htable.h" #include "lib/listener.h" #include "lib/mime_type.h" +#include "lib/pslist.h" #include "lib/str.h" +#include "lib/stringify.h" +#include "lib/teq.h" +#include "lib/thread.h" #include "lib/tm.h" +#include "lib/tsig.h" #include "lib/utf8.h" +#include "lib/vsort.h" #include "lib/walloc.h" +#include "lib/xmalloc.h" #include "lib/override.h" /* Must be the last header included */ @@ -86,6 +100,24 @@ SHARED_FILE_MAGIC = 0x3702b437U }; +/** + * A shared file description. + * + * These objects are ref-counted. + * + * Although they can be accessed from multiple threads, most accesses are + * read-only and the application normally changes fields only from the main + * thread. + * + * Therefore, it is not necessary to lock the objects before accessing them, + * although the reference count field needs to be accessed through atomic + * operations because it can be concurrently updated. + * + * During library rebuilding operations, which are done in a separate thread, + * a new set of objects is created by the rebuild thread before being made + * visible to the main thread, hence the rebuild thread doe not require locking + * of the objects either. + */ struct shared_file { enum shared_file_magic magic; @@ -105,13 +137,13 @@ time_t ctime; /**< File creation time */ filesize_t file_size; /**< File size in Bytes */ - guint32 file_index; /**< the files index within our local DB */ - guint32 sort_index; /**< the index for sorted listings */ + uint32 file_index; /**< the files index within our local DB */ + uint32 sort_index; /**< the index for sorted listings */ enum mime_type mime_type; /* MIME type of the file */ int refcnt; /**< Reference count */ - guint32 flags; /**< See below for definition */ + uint32 flags; /**< See below for definition */ }; /** @@ -134,13 +166,14 @@ /** * Maps special names (e.g. "/favicon.ico") to the shared_file_t structure. */ -static GHashTable *special_names; +static htable_t *special_names; -static GHashTable *extensions; /* Shared filename extensions */ -static GSList *shared_dirs; -static hash_list_t *partial_files; +static hset_t *extensions; /* Shared filename extensions */ +static pslist_t *shared_dirs; static cevent_t *share_qrp_rebuild_ev; +static hset_t *partial_files; /* Contains partial files, thread-safe */ + /* * These variables are recreated by each library scanning. * @@ -148,30 +181,117 @@ * we can continue to serve files without interruption. Only at the end of * the rebuilding process do we atomically update all of them with the new * values, freeing old content. + * + * To make sure we never access them without locking, they are groupped in + * a structure and accessors are defined. */ -static guint64 files_scanned; /* Amount of files shared in the library */ -static guint64 bytes_scanned; -static GSList *shared_files; -static search_table_t *search_table; -static GHashTable *file_basenames; -static search_table_t *partial_table; -static shared_file_t **file_table; /* Sorted by mtime */ -static shared_file_t **sorted_file_table; /* Sorted by name */ +static struct shared_library { + uint64 files_scanned; /* Amount of files shared in the library */ + uint64 bytes_scanned; + pslist_t *shared_files; + search_table_t *search_table; + htable_t *file_basenames; + search_table_t *partial_table; + shared_file_t **file_table; /* Sorted by mtime */ + shared_file_t **sorted_file_table; /* Sorted by name */ +} shared_libfile; +static spinlock_t shared_libfile_slk = SPINLOCK_INIT; + +#define SHARED_LIBFILE_LOCK spinlock(&shared_libfile_slk) +#define SHARED_LIBFILE_UNLOCK spinunlock(&shared_libfile_slk) + +#define assert_shared_libfile_locked() \ + g_assert(spinlock_is_held(&shared_libfile_slk)) + +#define GENERATE_ACCESSOR(type, field) \ +static inline type field() { \ + type result; \ + SHARED_LIBFILE_LOCK; \ + result = shared_libfile.field; \ + SHARED_LIBFILE_UNLOCK; \ + return result; \ +} + +GENERATE_ACCESSOR(uint64, files_scanned) +GENERATE_ACCESSOR(uint64, bytes_scanned) -static struct recursive_scan *recursive_scan_context; -static gboolean share_rebuilding; +#undef GENERATE_ACCESSOR /** - * This tree maps a SHA1 hash (base-32 encoded) onto the corresponding + * The recursive_scan_context is the context used by two distinct background + * tasks, which cannot run at the same time: + * + * - the library rescan + * - the rebuilding of the QRP tables + * + * The library rescan looks through all the shared directories to identify the + * files that match the configured extensions and should therefore be included + * in the shared list. It terminates with the rebuilding of the QRP tables, + * in the same task context. + * + * When running on a system with more than 1 CPU, the background task actually + * runs in a dedicated thread, but the task does not need to know that. + * + * From a user standpoint, we want to be able to ask for library rescans or + * rebuilding of the QRP tables, be able to cancel the task and restart a new + * one, or wait for the previous task to complete and launch a new one. + * + * To properly cleanup memory when the task is cancelled, the background task + * reclaims its allocated context in its "free context" callback at the end + * of its processing (be it a regular end or the result of a cancellation). + * Note that we're talking about the task cancellation here, not that of the + * thread that runs it! + * + * Once the background task starts to be scheduled by the thread (which may not + * be the main thread on multi-core systems), the context needs to be only + * accessed by that thread, to avoid having to lock the context each time. + * + * The implementation works as follows: we create a "library" thread on systems + * with more than 1 CPU and equip it with a thread event queue (TEQ), recording + * the thread ID of that library thread. If there is only 1 CPU, the thread ID + * will be that of the main thread. + * + * We then "talk" to the library thread via inter-thread RPCs, using the TEQ. + * These RPCs translate into direct function calls when the target thread ID is + * that of the caller, so the caller does not know whether it talks to itself + * or to another thread. + * + * Our convention is that from the "main" thread our interface to the "library" + * thread are routines starting with the "share_lib_" prefix. The corresponding + * RPC targets, executed in the context of the "library" thread start with + * "share_thread_lib_". + */ +static struct share_thread_vars { + spinlock_t lock; /* Lock to allow concurrent access */ + bgsched_t *sched; /* Background task scheduler */ + struct bgtask *task; /* Current task, NULL if none */ + bool qrp_rebuild; /* Whether QRP rebuild is pending */ + bool exiting; /* Whether thread should exit */ +} share_thread_vars = { + SPINLOCK_INIT, /* lock */ + NULL, /* sched */ + NULL, /* task */ + FALSE, /* qrp_rebuild */ + FALSE, /* exiting */ +}; +static unsigned share_thread_id = THREAD_INVALID_ID; +static bool share_rebuilding; /* Whether library is being rebuilt */ + +/** + * This hash table maps a SHA1 hash (base-32 encoded) onto the corresponding * shared_file if we have one. */ -static GTree *sha1_to_share; +static hikset_t *sha1_to_share; /* Marked thread-safe */ #define A SEARCH_AUDIO_TYPE #define V SEARCH_VIDEO_TYPE #define D SEARCH_DOC_TYPE #define I SEARCH_IMG_TYPE #define U (SEARCH_WIN_TYPE | SEARCH_UNIX_TYPE) +#define T SEARCH_TORRENT_TYPE + +#define TXT SEARCH_G2_TEXT_TYPE +#define ROM SEARCH_G2_ROM_TYPE /** * This table encodes for each known MIME type the searchable media type bits @@ -181,7 +301,7 @@ * of the searchable bits. This typically indicates a file containing * either application-specific data (e.g. an MP3 playlist), a programming * language (e.g. a C header file), or binary-specific data (e.g. a ROM - * image). + * image, although these are now flagged as ROM, for the benefit of G2 queries). */ static struct { enum mime_type type; @@ -191,7 +311,7 @@ { MIME_TYPE_APPLICATION_7Z, U }, { MIME_TYPE_APPLICATION_ACE, U }, { MIME_TYPE_APPLICATION_ANDROID_PACKAGE, U }, - { MIME_TYPE_APPLICATION_BITTORRENT, D }, + { MIME_TYPE_APPLICATION_BITTORRENT, T }, { MIME_TYPE_APPLICATION_BROADBAND_EBOOK, D }, { MIME_TYPE_APPLICATION_BZIP2, U }, { MIME_TYPE_APPLICATION_COMPILED_HTML_HELP, D }, @@ -201,8 +321,8 @@ { MIME_TYPE_APPLICATION_DOSEXEC, U }, { MIME_TYPE_APPLICATION_EPUB, D }, { MIME_TYPE_APPLICATION_EXCEL, 0 }, - { MIME_TYPE_APPLICATION_GAMEBOY_ROM, 0 }, - { MIME_TYPE_APPLICATION_GENESIS_ROM, 0 }, + { MIME_TYPE_APPLICATION_GAMEBOY_ROM, ROM }, + { MIME_TYPE_APPLICATION_GENESIS_ROM, ROM }, { MIME_TYPE_APPLICATION_GZIP, U }, { MIME_TYPE_APPLICATION_IPHONE_APP, 0 }, { MIME_TYPE_APPLICATION_ISO9660, U }, @@ -216,8 +336,8 @@ { MIME_TYPE_APPLICATION_MSWORD, D }, { MIME_TYPE_APPLICATION_MS_READER, D }, { MIME_TYPE_APPLICATION_MS_SHORTCUT, 0 }, - { MIME_TYPE_APPLICATION_N64_ROM, 0 }, - { MIME_TYPE_APPLICATION_NES_ROM, 0 }, + { MIME_TYPE_APPLICATION_N64_ROM, ROM }, + { MIME_TYPE_APPLICATION_NES_ROM, ROM }, { MIME_TYPE_APPLICATION_OBJECT, 0 }, { MIME_TYPE_APPLICATION_OGG, A }, { MIME_TYPE_APPLICATION_OPEN_PACKAGING_FORMAT, U }, @@ -231,7 +351,7 @@ { MIME_TYPE_APPLICATION_SHAR, U }, { MIME_TYPE_APPLICATION_SHOCKWAVE_FLASH, V }, { MIME_TYPE_APPLICATION_SIT, U }, - { MIME_TYPE_APPLICATION_SNES_ROM, 0 }, + { MIME_TYPE_APPLICATION_SNES_ROM, ROM }, { MIME_TYPE_APPLICATION_TAR, U }, { MIME_TYPE_APPLICATION_TEX, D }, { MIME_TYPE_APPLICATION_TEXINFO, D }, @@ -275,7 +395,7 @@ { MIME_TYPE_TEXT_LATEX, D }, { MIME_TYPE_TEXT_LILYPOND, D }, { MIME_TYPE_TEXT_PERL, 0 }, - { MIME_TYPE_TEXT_PLAIN, D }, + { MIME_TYPE_TEXT_PLAIN, D|TXT }, { MIME_TYPE_TEXT_PYTHON, 0 }, { MIME_TYPE_TEXT_RTF, D }, { MIME_TYPE_TEXT_XHTML, D }, @@ -296,24 +416,15 @@ #undef D #undef I #undef U +#undef T +#undef TXT +#undef ROM /** * Hash table yielding the media type flags from a MIME type. * Built dynamically from media_type_map. */ -static GHashTable *share_media_types; - -/** - * Compare binary SHA1 hashes. - * @return 0 if they're the same, a negative or positive number if s1 if greater - * than s2 or s1 greater than s2, respectively. - * Used to search the sha1_to_share tree. - */ -static int -compare_share_sha1(gconstpointer s1, gconstpointer s2) -{ - return memcmp(s1, s2, SHA1_RAW_SIZE); -} +static htable_t *share_media_types; /** * Reset sha1_to_share @@ -321,19 +432,27 @@ static void reinit_sha1_table(void) { - if (sha1_to_share) - g_tree_destroy(sha1_to_share); - - sha1_to_share = g_tree_new(compare_share_sha1); + if G_UNLIKELY(NULL == sha1_to_share) { + sha1_to_share = hikset_create( + offsetof(shared_file_t, sha1), HASH_KEY_FIXED, SHA1_RAW_SIZE); + hikset_thread_safe(sha1_to_share); + } else { + hikset_clear(sha1_to_share); + } } void -shared_file_check(const shared_file_t *sf) +shared_file_check(const shared_file_t * const sf) { g_assert(sf); g_assert(SHARE_REBUILDING != sf); g_assert(SHARED_FILE_MAGIC == sf->magic); g_assert(sf->refcnt >= 0); +} + +void +shared_file_name_check(const shared_file_t * const sf) +{ g_assert((NULL != sf->name_nfc) ^ (0 == sf->name_nfc_len)); g_assert((NULL != sf->name_canonic) ^ (0 == sf->name_canonic_len)); } @@ -344,11 +463,9 @@ static shared_file_t * shared_file_alloc(void) { - static const shared_file_t zero_sf; shared_file_t *sf; - WALLOC(sf); - *sf = zero_sf; + WALLOC0(sf); sf->magic = SHARED_FILE_MAGIC; return sf; } @@ -357,10 +474,11 @@ shared_file_deindex(shared_file_t *sf) { shared_file_check(sf); + shared_file_name_check(sf); if (SHARE_F_BASENAME & sf->flags) { - if (file_basenames != NULL) { - g_hash_table_remove(file_basenames, sf->name_nfc); + if (shared_libfile.file_basenames != NULL) { + htable_remove(shared_libfile.file_basenames, sf->name_nfc); } } sf->flags &= ~SHARE_F_BASENAME; @@ -370,41 +488,44 @@ * either because it hasn't been build yet or because of a rescan. */ + SHARED_LIBFILE_LOCK; + if ( - file_table && + shared_libfile.file_table != NULL && sf->file_index > 0 && - sf->file_index <= files_scanned && - sf == file_tablesf->file_index - 1 - ) { + sf->file_index <= shared_libfile.files_scanned && + sf == shared_libfile.file_tablesf->file_index - 1 + ) { g_assert(SHARE_F_INDEXED & sf->flags); - file_tablesf->file_index - 1 = NULL; + shared_libfile.file_tablesf->file_index - 1 = NULL; } if ( - sorted_file_table && + shared_libfile.sorted_file_table && sf->sort_index > 0 && - sf->sort_index <= files_scanned && - sf == sorted_file_tablesf->sort_index - 1 - ) { + sf->sort_index <= shared_libfile.files_scanned && + sf == shared_libfile.sorted_file_tablesf->sort_index - 1 + ) { g_assert(SHARE_F_INDEXED & sf->flags); - sorted_file_tablesf->sort_index - 1 = NULL; + shared_libfile.sorted_file_tablesf->sort_index - 1 = NULL; } + sf->file_index = 0; sf->sort_index = 0; sf->flags &= ~SHARE_F_INDEXED; + SHARED_LIBFILE_UNLOCK; + /* * Shared file is no longer indexed so it no longer belongs to the * shared set and needs to be removed if it was referenced there. */ - if (sf->sha1 != NULL) { + if (sf->sha1 != NULL && sha1_to_share != NULL) { shared_file_t *current; - gpointer key; - key = deconstify_gpointer(sf->sha1); - current = g_tree_lookup(sha1_to_share, key); + current = hikset_lookup(sha1_to_share, sf->sha1); if (current == sf) { - g_tree_remove(sha1_to_share, key); + hikset_remove(sha1_to_share, sf->sha1); } } } @@ -419,10 +540,13 @@ if (*sf_ptr) { shared_file_t *sf = *sf_ptr; - g_assert(sf->refcnt == 0); + g_assert(0 == sf->refcnt); - if (sf->flags & SHARE_F_INDEXED) - shared_file_deindex(sf); + g_assert_log(0 == (sf->flags & SHARE_F_FILEINFO), + "%s(): invoked on file used by a fileinfo", G_STRFUNC); + + g_assert_log(0 == (sf->flags & SHARE_F_INDEXED), + "%s(): invoked on file still indexed", G_STRFUNC); atom_sha1_free_null(&sf->sha1); atom_tth_free_null(&sf->tth); @@ -438,19 +562,38 @@ } /** + * Free list of (referenced) shared files and nullify list pointer. + */ +void +shared_file_slist_free_null(pslist_t **l_ptr) +{ + pslist_t *list = *l_ptr; + + if (list != NULL) { + pslist_t *sl; + + PSLIST_FOREACH(list, sl) { + shared_file_t *sf = sl->data; + shared_file_unref(&sf); + } + pslist_free_null(l_ptr); + } +} + +/** * Set canonic, NFC and NFKC normalized names. * * @return whether an error occurred */ -static gboolean +static bool shared_file_set_names(shared_file_t *sf, const char *filename) { - shared_file_check(sf); - g_assert(!sf->name_nfc); - g_assert(!sf->name_canonic); + shared_file_check(sf); + g_assert(NULL == sf->name_nfc); + g_assert(NULL == sf->name_canonic); /* Set the NFC normalized name. */ - { + { char *name = filename_to_utf8_normalized(filename, UNI_NORM_NETWORK); sf->name_nfc = atom_str_get(name); G_FREE_NULL(name); @@ -467,10 +610,9 @@ GNET_PROPERTY(search_results_expose_relative_paths) && sf->relative_path ) { - name = g_strconcat(sf->relative_path, " ", sf->name_nfc, - (void *) 0); + name = g_strconcat(sf->relative_path, " ", sf->name_nfc, NULL); } else { - name = deconstify_gchar(sf->name_nfc); + name = deconstify_char(sf->name_nfc); } name_canonic = UNICODE_CANONIZE(name); sf->name_canonic = atom_str_get(name_canonic); @@ -485,45 +627,38 @@ sf->name_nfc_len = strlen(sf->name_nfc); sf->name_canonic_len = strlen(sf->name_canonic); + shared_file_name_check(sf); + if (0 == sf->name_nfc_len || 0 == sf->name_canonic_len) { - g_warning("Normalized filename is an empty string \"%s\" " + g_warning("%s(): normalized filename is an empty string \"%s\" " "(NFC=\"%s\", canonic=\"%s\")", - filename, sf->name_nfc, sf->name_canonic); + G_STRFUNC, filename, sf->name_nfc, sf->name_canonic); return TRUE; } - return FALSE; + return FALSE; /* OK, no error */ } -static const guint FILENAME_CLASH = -1; /**< Indicates basename clashes */ -static const guint PARTIAL_FILE = -2; /**< Indicates partial file */ -static const guint SPECIAL_FILE = -3; /**< Special served files */ +static const uint FILENAME_CLASH = -1; /**< Indicates basename clashes */ +static const uint PARTIAL_FILE = -2; /**< Indicates partial file */ +static const uint SPECIAL_FILE = -3; /**< Special served files */ /** * Initialize special file entry, returning shared_file_t structure if * the file exists, NULL otherwise. */ -static G_GNUC_COLD shared_file_t * +static shared_file_t * G_COLD share_special_load(const struct special_file *sp) { FILE *f; int idx = 0; - char *tmp; shared_file_t *sf = NULL; file_path_t fp4; - unsigned length = 0; + unsigned length; - tmp = get_folder_path(PRIVLIB_PATH, NULL); - if (tmp != NULL) - file_path_set(&fplength++, tmp, sp->file); + length = settings_file_path_load(fp, sp->file, SFP_DFLT); - file_path_set(&fplength++, settings_config_dir(), sp->file); - file_path_set(&fplength++, PRIVLIB_EXP, sp->file); -#ifndef OFFICIAL_BUILD - file_path_set(&fplength++, PACKAGE_EXTRA_SOURCE_DIR, sp->file); -#endif + g_assert(length <= N_ITEMS(fp)); - g_assert(length <= G_N_ELEMENTS(fp)); - f = file_config_open_read_norename_chosen(sp->what, fp, length, &idx); if (NULL == f) @@ -552,26 +687,48 @@ fclose(f); done: - HFREE_NULL(tmp); - return sf; } +/** + * Apply query string to the library. + * + * @param query the query string to apply + * @param callback routine to call on each hit + * @param user_data opaque context passed to callback + * @param max_res maximum number of results + * @param flags operating flags (SHARE_FM_* flags) + * @param qhv query hash vector, filled with query words if not NULL + */ void shared_files_match(const char *query, - st_search_callback callback, gpointer user_data, - int max_res, gboolean partials, query_hashvec_t *qhv) + st_search_callback callback, void *user_data, + int max_res, uint32 flags, query_hashvec_t *qhv) { int n; int remain; + search_table_t *gt, *pt; + bool partials = booleanize(flags & SHARE_FM_PARTIALS); + bool g2_query = booleanize(flags & SHARE_FM_G2); + + /* + * Take snapshots of the global search and partial tables, in case + * they are reset by a background rescan. + */ + + SHARED_LIBFILE_LOCK; + gt = st_refcnt_inc(shared_libfile.search_table); + pt = partials ? st_refcnt_inc(shared_libfile.partial_table) : NULL; + SHARED_LIBFILE_UNLOCK; /* * First search from the library. */ - n = st_search(search_table, query, callback, user_data, max_res, qhv); - gnet_stats_count_general(GNR_LOCAL_HITS, n); + n = st_search(gt, query, callback, user_data, max_res, qhv); + + gnet_stats_count_general(g2_query ? GNR_LOCAL_G2_HITS : GNR_LOCAL_HITS, n); remain = max_res - n; /* @@ -583,28 +740,30 @@ * files (PFSP server) and they configured answering to partial requests. */ - if (partials && remain > 0 && share_can_answer_partials() - ) { - n = st_search(partial_table, query, callback, user_data, remain, NULL); - gnet_stats_count_general(GNR_LOCAL_PARTIAL_HITS, n); + if (partials && remain > 0 && share_can_answer_partials()) { + n = st_search(pt, query, callback, user_data, remain, NULL); + gnet_stats_count_general( + g2_query ? GNR_LOCAL_G2_PARTIAL_HITS : GNR_LOCAL_PARTIAL_HITS, n); } + + st_free(>); + st_free(&pt); } /** * Initialize the special files we're sharing. */ -static G_GNUC_COLD void +static void G_COLD share_special_init(void) { - guint i; + uint i; - special_names = g_hash_table_new(g_str_hash, g_str_equal); + special_names = htable_create(HASH_KEY_STRING, 0); - for (i = 0; i < G_N_ELEMENTS(specials); i++) { + for (i = 0; i < N_ITEMS(specials); i++) { shared_file_t *sf = share_special_load(&specialsi); if (sf != NULL) - g_hash_table_insert(special_names, - deconstify_gchar(specialsi.path), shared_file_ref(sf)); + htable_insert(special_names, specialsi.path, shared_file_ref(sf)); } } @@ -623,7 +782,7 @@ shared_file_t *sf; filestat_t file_stat; - sf = g_hash_table_lookup(special_names, path); + sf = htable_lookup(special_names, path); if (sf == NULL) return NULL; @@ -654,55 +813,91 @@ * Given a valid index, returns the `struct shared_file' entry describing * the shared file bearing that index if found, NULL if not found (invalid * index) and SHARE_REBUILDING when we're rebuilding the library. + * + * The returned file is reference-counted and the caller needs to call + * shared_file_unref() when it is done with the file. + * + * @return shared file info for index `idx', or NULL if none. */ shared_file_t * -shared_file(guint idx) +shared_file(uint idx) { - /* @return shared file info for index `idx', or NULL if none */ + shared_file_t * sf; - if (file_table == NULL) /* Rebuilding the library! */ - return SHARE_REBUILDING; + SHARED_LIBFILE_LOCK; - if (idx < 1 || idx > files_scanned) - return NULL; + if (NULL == shared_libfile.file_table) /* Rebuilding the library! */ + sf = SHARE_REBUILDING; + else if (idx < 1 || idx > shared_libfile.files_scanned) + sf = NULL; + else { + sf = shared_libfile.file_tableidx - 1; + if (sf != NULL) + shared_file_ref(sf); + } - return file_tableidx - 1; + SHARED_LIBFILE_UNLOCK; + + return sf; } /** * Given a valid index, returns the `struct shared_file' entry describing * the shared file bearing that index if found, NULL if not found (invalid * index) and SHARE_REBUILDING when we're rebuilding the library. + * + * The returned file is reference-counted and the caller needs to call + * shared_file_unref() when it is done with the file. + * + * @return shared file info for index `idx', or NULL if none. */ shared_file_t * -shared_file_sorted(guint idx) +shared_file_sorted(uint idx) { - /* @return shared file info for index `idx', or NULL if none */ + shared_file_t *sf; - if (sorted_file_table == NULL) /* Rebuilding the library! */ - return SHARE_REBUILDING; + SHARED_LIBFILE_LOCK; - if (idx < 1 || idx > files_scanned) - return NULL; + if (NULL == shared_libfile.sorted_file_table) /* Rebuilding library! */ + sf = SHARE_REBUILDING; + else if (idx < 1 || idx > shared_libfile.files_scanned) + sf = NULL; + else { + sf = shared_libfile.sorted_file_tableidx - 1; + if (sf != NULL) + shared_file_ref(sf); + } + + SHARED_LIBFILE_UNLOCK; - return sorted_file_tableidx - 1; + return sf; } /** * Get index of shared file identified by its name. + * * @return index > 0 if found, 0 if file is not known. */ -static guint +static uint shared_file_get_index(const char *filename) { - guint idx; + uint idx; - idx = GPOINTER_TO_UINT(g_hash_table_lookup(file_basenames, filename)); - if (idx == 0 || idx == FILENAME_CLASH) - return 0; + assert_shared_libfile_locked(); + + idx = pointer_to_uint( + htable_lookup(shared_libfile.file_basenames, filename)); - g_assert(idx >= 1 && idx <= files_scanned); - return idx; + if G_UNLIKELY(FILENAME_CLASH == idx) { + idx = 0; + } else { + /* NB: index can be 0 if no file bearing that name is shared */ + g_assert_log(idx <= shared_libfile.files_scanned, + "idx=%u, files_scanned=%lu", + idx, (ulong) shared_libfile.files_scanned); + } + + return idx; } /** @@ -710,35 +905,43 @@ * the shared file bearing that basename, provided it is unique, NULL if * we either don't have a unique filename or SHARE_REBUILDING if the library * is being rebuilt. + * + * @return ref-counted file if not NULL or not SHARE_REBUILDING. */ shared_file_t * shared_file_by_name(const char *filename) { shared_file_t *sf; - guint idx; + uint idx; - if (file_table == NULL) - return SHARE_REBUILDING; + SHARED_LIBFILE_LOCK; - g_assert(file_basenames); - idx = shared_file_get_index(filename); - if (idx > 0) { - sf = file_tableidx - 1; - shared_file_check(sf); - return sf; + if G_UNLIKELY(NULL == shared_libfile.file_table) { + sf = SHARE_REBUILDING; } else { - return NULL; + g_assert(shared_libfile.file_basenames != NULL); + idx = shared_file_get_index(filename); + if (idx > 0) { + sf = shared_libfile.file_tableidx - 1; + shared_file_check(sf); + shared_file_ref(sf); + } else { + sf = NULL; + } } + + SHARED_LIBFILE_UNLOCK; + + return sf; } static void -free_extensions_helper(gpointer key, - gpointer unused_value, gpointer unused_data) +free_extensions_helper(const void *key, void *unused_data) { - (void) unused_value; (void) unused_data; atom_str_free(key); } + /** * Free existing extensions */ @@ -746,8 +949,8 @@ free_extensions(void) { if (extensions) { - g_hash_table_foreach(extensions, free_extensions_helper, NULL); - gm_hash_table_destroy_null(&extensions); + hset_foreach(extensions, free_extensions_helper, NULL); + hset_free_null(&extensions); } } @@ -759,10 +962,10 @@ { char **exts = g_strsplit(str, ";", 0); char *x, *s; - guint i; + uint i; free_extensions(); - extensions = g_hash_table_new(ascii_strcase_hash, ascii_strcase_eq); + extensions = hset_create_any(ascii_strcase_hash, NULL, ascii_strcase_eq); for (i = 0; extsi; i++) { char c; @@ -780,9 +983,9 @@ break; } - if (*s && NULL == g_hash_table_lookup(extensions, s)) { - gconstpointer key = atom_str_get(s); - gm_hash_table_insert_const(extensions, key, key); + if (*s && !hset_contains(extensions, s)) { + const void *key = atom_str_get(s); + hset_insert(extensions, key); } } } @@ -796,15 +999,15 @@ static void shared_dirs_free(void) { - GSList *sl; + pslist_t *sl; if (!shared_dirs) return; - for (sl = shared_dirs; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(shared_dirs, sl) { atom_str_free(sl->data); } - gm_slist_free_null(&shared_dirs); + pslist_free_null(&shared_dirs); } /** @@ -813,20 +1016,11 @@ void shared_dirs_update_prop(void) { - GSList *sl; - str_t *s; - - s = str_new(0); - - for (sl = shared_dirs; sl != NULL; sl = g_slist_next(sl)) { - str_cat(s, sl->data); - if (g_slist_next(sl) != NULL) - str_putc(s, G_SEARCHPATH_SEPARATOR); - } + char *dirs; - gnet_prop_set_string(PROP_SHARED_DIRS_PATHS, str_2c(s)); - - str_destroy(s); + dirs = dirlist_to_string(shared_dirs); + gnet_prop_set_string(PROP_SHARED_DIRS_PATHS, dirs); + HFREE_NULL(dirs); } /** @@ -834,29 +1028,25 @@ * The given string was completely parsed, it returns TRUE, otherwise * it returns FALSE. */ -gboolean -shared_dirs_parse(const char *str) +bool +shared_dirs_parse(const char *dirs) { - char **dirs = g_strsplit(str, G_SEARCHPATH_SEPARATOR_S, 0); - gboolean ret = TRUE; - guint i; - - /* FIXME: ESCAPING! */ + pslist_t *sl; shared_dirs_free(); - for (i = 0; dirsi; i++) { - if (is_directory(dirsi)) - shared_dirs = g_slist_prepend(shared_dirs, - deconstify_gchar(atom_str_get(dirsi))); - else - ret = FALSE; + shared_dirs = dirlist_parse(dirs); + PSLIST_FOREACH(shared_dirs, sl) { + char *pathname = sl->data; + /** + * Allow non-existing directories, so that we do not + * accidently unshare an directory when a drive is not + * mounted currently. + */ + sl->data = deconstify_char(atom_str_get(pathname)); + HFREE_NULL(pathname); } - - shared_dirs = g_slist_reverse(shared_dirs); - g_strfreev(dirs); - - return ret; + return TRUE; } /** @@ -867,16 +1057,14 @@ { if (is_directory(pathname)) { if (GNET_PROPERTY(share_debug) > 0) { - g_debug("%s: adding pathname=\"%s\"", G_STRFUNC, pathname); + g_debug("%s: sharing pathname=\"%s\"", G_STRFUNC, pathname); } - shared_dirs = g_slist_append(shared_dirs, - deconstify_gchar(atom_str_get(pathname))); } else { - if (GNET_PROPERTY(share_debug) > 0) { - g_debug("%s: NOT adding pathname=\"%s\"", G_STRFUNC, pathname); - } + g_warning("%s: NOT sharing pathname=\"%s\"", G_STRFUNC, pathname); } - shared_dirs_update_prop(); + shared_dirs = pslist_append(shared_dirs, + deconstify_char(atom_str_get(pathname))); + shared_dirs_update_prop(); } /** @@ -886,47 +1074,69 @@ shared_file_t * shared_file_ref(const shared_file_t *sf) { - shared_file_t *wsf = deconstify_gpointer(sf); + shared_file_t *wsf = deconstify_pointer(sf); - wsf->refcnt++; + shared_file_check(sf); + + atomic_int_inc(&wsf->refcnt); return wsf; } /** * Remove one reference to a shared_file_t, freeing entry if there are * no reference left. The pointer itself is nullified. + * + * To simplify user code, we gracefully ignore the SHARE_REBUILDING argument. */ void shared_file_unref(shared_file_t **sf_ptr) { - g_assert(sf_ptr); - - if (*sf_ptr) { - shared_file_t *sf = *sf_ptr; + g_assert(sf_ptr != NULL); + shared_file_t *sf = *sf_ptr; + if G_UNLIKELY(SHARE_REBUILDING == sf) { + *sf_ptr = NULL; + } else if (sf != NULL) { shared_file_check(sf); g_assert(sf->refcnt > 0); - sf->refcnt--; - if (0 == sf->refcnt) { + if (atomic_int_dec_is_zero(&sf->refcnt)) shared_file_free(&sf); - } + *sf_ptr = NULL; } } /** + * Remove one reference to a shared_file_t, used in a fileinfo. + * The pointer is nullified. + */ +void +shared_file_fileinfo_unref(shared_file_t **sf_ptr) +{ + shared_file_t *sf; + + g_assert(sf_ptr != NULL); + + if (NULL != (sf = *sf_ptr)) { + g_assert(sf->flags & SHARE_F_FILEINFO); + sf->flags &= ~SHARE_F_FILEINFO; /* Clear bit before freeing */ + shared_file_unref(sf_ptr); + } +} + +/** * Is file too big to be shared on Gnutella? * * Note: The original purpose was to avoid files larger than 2^32-1 bytes. * Keep it just in case that a platform has an fileoffset_t with more than * 64 bits. */ -static inline gboolean +static inline bool too_big_for_gnutella(fileoffset_t size) { g_return_val_if_fail(size >= 0, TRUE); - return size + (filesize_t)0 > (filesize_t)-1 + (fileoffset_t)0; + return size + (filesize_t) 0 > (filesize_t) -1 + (fileoffset_t) 0; } /** @@ -938,7 +1148,7 @@ * returned. Otherwise, the pathname is considered OK and FALSE * is returned. */ -static gboolean +static bool contains_control_chars(const char *pathname) { const char *s; @@ -985,18 +1195,18 @@ * @param filename The name of the file to check. * @return TRUE if the file should be shared, FALSE if not. */ -static gboolean +static bool shared_file_valid_extension(const char *filename) { const char *filename_ext; - if (!extensions) + if G_UNLIKELY(NULL == extensions) return FALSE; if ( - 1 == g_hash_table_size(extensions) && - g_hash_table_lookup(extensions, "--all--") - ) { + 1 == hset_count(extensions) && + hset_contains(extensions, "--all--") + ) { /* * An extension "--all--" matches all files, even those that don't * have any extension. Original patch by Zygo Blaxell. @@ -1009,18 +1219,17 @@ /* * Filenames without any extension are not shared, unless * "--all--" is used. - */ + */ filename_ext++; /* skip the dot */ - /* + /* * Match the file extension (if any) against the extensions list. * All valid extensions start with '.'. Matching is case-insensitive */ - if (g_hash_table_lookup(extensions, filename_ext)) { + if (hset_contains(extensions, filename_ext)) return TRUE; - } } return FALSE; @@ -1034,7 +1243,7 @@ * return On success a shared_file_t for the file is returned. Otherwise, * NULL is returned. */ -static shared_file_t * +static shared_file_t * share_scan_add_file(const char *relative_path, const char *pathname, const filestat_t *sb) { @@ -1116,7 +1325,7 @@ return NULL; } } - + /* * NOTE: An `else'-clause here would be if the file WAS found in the * sha1_cache. Good place to set the SHA1 in "sf". @@ -1130,11 +1339,16 @@ * This is not meant to be exhaustive but test for common configuration * mistakes. */ -static gboolean +static bool directory_is_unshareable(const char *dir) { g_assert(dir); + if (!is_absolute_path(dir)) { + g_warning("refusing to share relative path: %s", dir); + return TRUE; + } + /* Explicitly checking is_same_file() for TRUE to ignore errors (-1) * probably caused by non-existing files or missing permission. */ @@ -1169,6 +1383,60 @@ return FALSE; /* No objection */ } +/** + * Generate a set of TTH hashes belonging to shared files. + * This set can be disposed of by share_tthset_free(). + * + * @return newly allocate set of shared TTH (atoms). + */ +hset_t * +share_tthset_get(void) +{ + uint64 n; + shared_file_t **sfp; + hset_t *set; + + set = hset_create(HASH_KEY_FIXED, TTH_RAW_SIZE); + + SHARED_LIBFILE_LOCK; + + n = shared_libfile.files_scanned; + sfp = shared_libfile.file_table; + + while (n-- != 0) { + shared_file_t *sf = *sfp++; + + shared_file_check(sf); + + if (sf->tth != NULL && !hset_contains(set, sf->tth)) { + const struct tth *tth = atom_tth_get(sf->tth); + hset_insert(set, tth); + } + } + + SHARED_LIBFILE_UNLOCK; + + return set; +} + +static void +share_tthset_keyfree(const void *data, void *udata) +{ + const struct tth *tth = data; + + (void) udata; + atom_tth_free(tth); +} + +/** + * Free set created by share_tthset_get(). + */ +void +share_tthset_free(hset_t *set) +{ + hset_foreach(set, share_tthset_keyfree, NULL); + hset_free_null(&set); +} enum recursive_scan_magic { RECURSIVE_SCAN_MAGIC = 0x16926d87U }; @@ -1179,22 +1447,25 @@ const char *base_dir; /* string atom */ const char *current_dir; /* string atom */ const char *relative_path; /* string atom */ + time_t start_time; /* when scanning started */ slist_t *base_dirs; /* list of string atoms */ slist_t *sub_dirs; /* list of g_malloc()ed strings */ slist_t *shared_files; /* list of struct shared_file */ slist_t *partial_files; /* list of struct shared_file */ slist_iter_t *iter; /* list iterator */ - GHashTable *words; /* records words making up filenames, for QRP */ - GHashTable *basenames; /* known file basenames */ - GSList *shared; /* the new shared_files variable */ + htable_t *words; /* records words making up filenames, for QRP */ + htable_t *basenames; /* known file basenames */ + pslist_t *shared; /* the new shared_files variable */ shared_file_t **files; /* the new file_table, sorted by mtime */ shared_file_t **sorted; /* the new sorted_file_table, sorted by name */ + shared_file_t **ftable; /* cloned file_table, contains ref-counted sf */ search_table_t *search_tb; /* the new search table */ search_table_t *partial_tb; /* the new partial table */ - guint64 files_scanned; /* amount of files shared in the library */ - guint64 bytes_scanned; /* size of the library */ + uint64 files_scanned; /* amount of files shared in the library */ + uint64 bytes_scanned; /* size of the library */ int idx; /* iterating index */ int ticks; /* ticks used */ + size_t ftable_capacity; /* Amount of entries in ftable */ }; static inline void @@ -1209,22 +1480,23 @@ } static struct recursive_scan * -recursive_scan_new(const GSList *base_dirs) +recursive_scan_new(const pslist_t *base_dirs, time_t now) { struct recursive_scan *ctx; - const GSList *iter; + const pslist_t *iter; WALLOC0(ctx); ctx->magic = RECURSIVE_SCAN_MAGIC; + ctx->start_time = now; ctx->base_dirs = slist_new(); ctx->sub_dirs = slist_new(); ctx->shared_files = slist_new(); ctx->partial_files = slist_new(); - ctx->words = g_hash_table_new(g_str_hash, g_str_equal); - ctx->basenames = g_hash_table_new(g_str_hash, g_str_equal); - for (iter = base_dirs; NULL != iter; iter = g_slist_next(iter)) { + ctx->words = htable_create(HASH_KEY_STRING, 0); + ctx->basenames = htable_create(HASH_KEY_STRING, 0); + PSLIST_FOREACH(base_dirs, iter) { const char *dir = atom_str_get(iter->data); - slist_append(ctx->base_dirs, deconstify_gchar(dir)); + slist_append(ctx->base_dirs, deconstify_char(dir)); } return ctx; } @@ -1245,7 +1517,7 @@ } } -static void recursive_sf_unref(gpointer o) +static void recursive_sf_unref(void *o) { shared_file_t *sf = o; @@ -1264,68 +1536,61 @@ } static void -recursive_scan_free(struct recursive_scan **ctx_ptr) +scan_base_dir_free(void *data) { - g_assert(ctx_ptr); + /* + * We need this wrapper when compiling with -DTRACK_ATOMS since + * atom_str_free() becomes a macro. + */ + atom_str_free(data); +} - if (*ctx_ptr) { - struct recursive_scan *ctx = *ctx_ptr; - GSList *sl; - recursive_scan_check(ctx); +/** + * Free the background task context for library / QRP rebuilds. + * + * This routine is invoked by the background task layer when the task is + * being terminated. + */ +static void +recursive_scan_context_free(void *data) +{ + struct recursive_scan *ctx = data; - if (ctx->task) { - bg_task_cancel(ctx->task); - g_assert(NULL == ctx->task); - } + recursive_scan_check(ctx); - recursive_scan_closedir(ctx); + recursive_scan_closedir(ctx); - slist_free_all(&ctx->base_dirs, (slist_destroy_cb) atom_str_free); - slist_free_all(&ctx->sub_dirs, do_hfree); - slist_free_all(&ctx->shared_files, recursive_sf_unref); - slist_free_all(&ctx->partial_files, recursive_sf_unref); - slist_iter_free(&ctx->iter); + slist_iter_free(&ctx->iter); + slist_free_all(&ctx->base_dirs, scan_base_dir_free); + slist_free_all(&ctx->sub_dirs, do_hfree); + slist_free_all(&ctx->shared_files, recursive_sf_unref); + slist_free_all(&ctx->partial_files, recursive_sf_unref); - gm_hash_table_destroy_null(&ctx->basenames); - st_free(&ctx->search_tb); - st_free(&ctx->partial_tb); - atom_str_free_null(&ctx->base_dir); - qrp_dispose_words(&ctx->words); + htable_free_null(&ctx->basenames); + st_free(&ctx->search_tb); + st_free(&ctx->partial_tb); + atom_str_free_null(&ctx->base_dir); + qrp_dispose_words(&ctx->words); - HFREE_NULL(ctx->files); - HFREE_NULL(ctx->sorted); + HFREE_NULL(ctx->files); + HFREE_NULL(ctx->sorted); - for (sl = ctx->shared; sl; sl = g_slist_next(sl)) { - shared_file_t *sf = sl->data; + if (ctx->ftable != NULL) { + size_t i; - shared_file_check(sf); - shared_file_unref(&sf); + for (i = 0; i < ctx->ftable_capacity; i++) { + shared_file_unref(&ctx->ftablei); } - gm_slist_free_null(&ctx->shared); - ctx->magic = 0; - WFREE(ctx); - *ctx_ptr = NULL; + XFREE_NULL(ctx->ftable); } -} - -static void -recursive_scan_context_free(void *data) -{ - struct recursive_scan *ctx = data; - - recursive_scan_check(ctx); - /* If we're called, the task is being terminated */ - /* - * There's nothing to free here. We're managing the overall context - * ourselves and this overall context is given as the task's context. - * We just need to record the fact that the task has been terminated - * here so recursive_scan_free() does not try to cancel it. - */ + shared_file_slist_free_null(&ctx->shared); ctx->task = NULL; + ctx->magic = 0; + WFREE(ctx); } /** @@ -1334,25 +1599,15 @@ static void share_free(void) { - GSList *sl; - - st_free(&search_table); - gm_hash_table_destroy_null(&file_basenames); - - for (sl = shared_files; sl; sl = g_slist_next(sl)) { - shared_file_t *sf = sl->data; - - shared_file_check(sf); - shared_file_unref(&sf); - } - gm_slist_free_null(&shared_files); - - HFREE_NULL(file_table); - HFREE_NULL(sorted_file_table); + st_free(&shared_libfile.search_table); + htable_free_null(&shared_libfile.file_basenames); + shared_file_slist_free_null(&shared_libfile.shared_files); + HFREE_NULL(shared_libfile.file_table); + HFREE_NULL(shared_libfile.sorted_file_table); } /** - * Sort function - shared files by ascending mtime (oldest first). + * Sort function - shared files by ascending mtime (oldest first). */ static int shared_file_sort_by_mtime(const void *f1, const void *f2) @@ -1421,7 +1676,7 @@ /** * FIXME: On Windows FindFirstFile/FindNextFile/FindClose - * must be used to get the Unicode filenames. + * must be used to get the Unicode filenames. */ if (!(ctx->directory = opendir(dir))) { g_warning("can't open directory %s: %m", dir); @@ -1537,7 +1792,7 @@ g_warning("broken symlink %s: %m", fullpath); goto finish; } - + /* * For symlinks, we check whether we are supposed to process * symlinks for that type of entry, then either proceed or skip the @@ -1561,7 +1816,7 @@ goto finish; } } - + if (S_ISDIR(sb.st_mode)) { /* If a directory, add to list for later processing */ slist_prepend(ctx->sub_dirs, fullpath); @@ -1583,46 +1838,164 @@ finish: HFREE_NULL(fullpath); - dir_entry_filename(NULL); /* release memory */ } /** - * @return TRUE if finished. + * Callback invoked by the background task layer when a task is terminated. */ -static gboolean -recursive_scan_next_dir(struct recursive_scan *ctx) +static void +recursive_scan_done(struct bgtask *bt, void *data, bgstatus_t status, void *arg) { + struct recursive_scan *ctx = data; + recursive_scan_check(ctx); + (void) arg; - if (ctx->directory) { - recursive_scan_readdir(ctx); - return FALSE; - } else if (slist_length(ctx->sub_dirs) > 0) { - char *dir; - - dir = slist_shift(ctx->sub_dirs); - recursive_scan_opendir(ctx, dir); - HFREE_NULL(dir); - return FALSE; - } else if (slist_length(ctx->base_dirs) > 0) { - atom_str_free_null(&ctx->base_dir); - ctx->base_dir = slist_shift(ctx->base_dirs); - recursive_scan_opendir(ctx, ctx->base_dir); - return FALSE; - } else { - atom_str_free_null(&ctx->base_dir); - return TRUE; + /* + * Tracing for debugging purposes. + */ + + if (GNET_PROPERTY(share_debug)) { + g_debug("terminating background task \"%s\" in %s, status=%s, " + "ran %'lu ms (%s)", + bg_task_name(bt), thread_name(), bgstatus_to_string(status), + bg_task_wtime(bt), short_time_ascii(bg_task_wtime(bt) / 1000)); + } + + /* + * If background tasks are run in the main thread, then we need to + * explicitly reset the current task. Otherwise, this is done in + * the library thread, which explicitly invokes the scheduler. + */ + + if (THREAD_MAIN == share_thread_id) { + struct share_thread_vars *v = &share_thread_vars; + + /* + * Taking the lock is not really necessary here because if we run + * in the main thread, everything is serialized, so there cannot be + * any concurrent access on these variables. For uniformity though... + * --RAM, 2015-03-06 + */ + + spinlock(&v->lock); + + if (bt == v->task) + v->task = NULL; + + spinunlock(&v->lock); } } -static bgret_t -recursive_scan_step_compute(struct bgtask *bt, void *data, int ticks) +/** + * Signal handler for task termination. + * + * This handler is invoked from the background task scheduler and is therefore + * run in the thread that is handling the background task... Not necessarily + * the main thread. + */ +static void +recursive_scan_sighandler(struct bgtask *bt, void *data, bgsig_t sig) { struct recursive_scan *ctx = data; recursive_scan_check(ctx); + g_assert(BG_SIG_TERM == sig); - ctx->ticks = 0; + /* + * Tracing for debugging purposes. + */ + + if (GNET_PROPERTY(share_debug)) { + g_debug("cancelling background task \"%s\" in %s, currently in %s()", + bg_task_name(bt), thread_name(), bg_task_step_name(bt)); + } +} + +static void * +recursive_rescan_starting(void *unused) +{ + (void) unused; + + gnet_prop_set_boolean_val(PROP_LIBRARY_REBUILDING, TRUE); + gnet_prop_set_timestamp_val(PROP_LIBRARY_RESCAN_STARTED, tm_time()); + + return NULL; +} + +/** + * First step, intalling signal handler to trap task cancel. + */ +static bgret_t +recursive_scan_step_setup(struct bgtask *bt, void *data, int uticks) +{ + struct recursive_scan *ctx = data; + + recursive_scan_check(ctx); + + (void) uticks; + + /* + * The BG_SIG_TERM signal will be sent by the background task scheduler + * when the task is cancelled. + */ + + bg_task_signal(bt, BG_SIG_TERM, recursive_scan_sighandler); + + atomic_bool_set(&share_rebuilding, TRUE); + + /* + * If we're not running in the main thread, we need to funnel this + * back as property changes can trigger GUI updates which we can't + * process from another thread until the GUI code is 100% thread-safe. + * --RAM, 2013-10-29 + */ + + teq_safe_rpc(THREAD_MAIN, recursive_rescan_starting, NULL); + + bg_task_ticks_used(bt, 0); + return BGR_NEXT; +} + +/** + * @return TRUE if finished. + */ +static bool +recursive_scan_next_dir(struct recursive_scan *ctx) +{ + recursive_scan_check(ctx); + + bg_task_cancel_test(ctx->task); + + if (ctx->directory) { + recursive_scan_readdir(ctx); + return FALSE; + } else if (slist_length(ctx->sub_dirs) > 0) { + char *dir; + + dir = slist_shift(ctx->sub_dirs); + recursive_scan_opendir(ctx, dir); + HFREE_NULL(dir); + return FALSE; + } else if (slist_length(ctx->base_dirs) > 0) { + atom_str_free_null(&ctx->base_dir); + ctx->base_dir = slist_shift(ctx->base_dirs); + recursive_scan_opendir(ctx, ctx->base_dir); + return FALSE; + } else { + atom_str_free_null(&ctx->base_dir); + return TRUE; + } +} + +static bgret_t +recursive_scan_step_compute(struct bgtask *bt, void *data, int ticks) +{ + struct recursive_scan *ctx = data; + + recursive_scan_check(ctx); + + ctx->ticks = 0; do { if (recursive_scan_next_dir(ctx)) { bg_task_ticks_used(bt, ctx->ticks); @@ -1668,12 +2041,16 @@ if (ctx->ticks++ >= ticks) return BGR_MORE; + if (0 == (ctx->ticks & 0xf)) + bg_task_cancel_test(ctx->task); + sf = slist_shift(ctx->shared_files); shared_file_check(sf); g_assert(!shared_file_is_partial(sf)); + g_assert(1 == sf->refcnt); ctx->bytes_scanned += sf->file_size; st_insert_item(ctx->search_tb, sf->name_canonic, sf); - ctx->shared = gm_slist_prepend_const(ctx->shared, sf); + ctx->shared = pslist_prepend_const(ctx->shared, sf); upload_stats_enforce_local_filename(sf); } @@ -1689,7 +2066,7 @@ recursive_scan_step_build_file_table(struct bgtask *bt, void *data, int ticks) { struct recursive_scan *ctx = data; - GSList *sl; + pslist_t *sl; int i = 0; recursive_scan_check(ctx); @@ -1707,19 +2084,20 @@ * --RAM, 08/10/2001 */ - ctx->files = halloc0(ctx->files_scanned * sizeof ctx->files0); + HALLOC0_ARRAY(ctx->files, ctx->files_scanned); - for (i = 0, sl = ctx->shared; sl; sl = g_slist_next(sl)) { + for (i = 0, sl = ctx->shared; sl; sl = pslist_next(sl)) { shared_file_t *sf = sl->data; shared_file_check(sf); g_assert(!(SHARE_F_INDEXED & sf->flags)); g_assert(UNSIGNED(i) < ctx->files_scanned); + g_assert(2 == sf->refcnt); /* Added to search table */ ctx->filesi++ = sf; } /* Sort file list by modification time to get a relatively stable index */ - qsort(ctx->files, ctx->files_scanned, sizeof ctx->files0, + vsort(ctx->files, ctx->files_scanned, sizeof ctx->files0, shared_file_sort_by_mtime); next: @@ -1740,10 +2118,10 @@ while (UNSIGNED(ctx->idx) < ctx->files_scanned) { shared_file_t *sf; - guint val; + uint val; int i = ctx->idx++; - sf = ctx->filesi; + sf = ctx->filesi; shared_file_check(sf); /* @@ -1765,40 +2143,60 @@ * --RAM, 06/06/2002 */ - val = pointer_to_uint( - g_hash_table_lookup(ctx->basenames, sf->name_nfc)); + val = pointer_to_uint(htable_lookup(ctx->basenames, sf->name_nfc)); /* * The following works because 0 cannot be a valid file index. */ val = (val != 0) ? FILENAME_CLASH : sf->file_index; - g_hash_table_insert(ctx->basenames, deconstify_gchar(sf->name_nfc), - GUINT_TO_POINTER(val)); + htable_insert(ctx->basenames, sf->name_nfc, uint_to_pointer(val)); if (ctx->ticks++ >= ticks) return BGR_MORE; + + if (0 == (ctx->ticks & 0xf)) + bg_task_cancel_test(ctx->task); } bg_task_ticks_used(bt, ctx->ticks); return BGR_NEXT; } -static bgret_t -recursive_scan_step_update_scan_timing(struct bgtask *bt, void *data, int ticks) +static void * +recursive_update_scan_timing(void *data) { struct recursive_scan *ctx = data; time_delta_t elapsed; recursive_scan_check(ctx); - (void) ticks; - elapsed = delta_time(tm_time_exact(), - GNET_PROPERTY(library_rescan_started)); + elapsed = delta_time(tm_time_exact(), ctx->start_time); elapsed = MAX(0, elapsed); + gnet_prop_set_timestamp_val(PROP_LIBRARY_RESCAN_FINISHED, tm_time()); gnet_prop_set_guint32_val(PROP_LIBRARY_RESCAN_DURATION, elapsed); + return NULL; +} + +static bgret_t +recursive_scan_step_update_scan_timing(struct bgtask *bt, void *data, int ticks) +{ + struct recursive_scan *ctx = data; + + recursive_scan_check(ctx); + (void) ticks; + + /* + * If we're not running in the main thread, we need to funnel this + * back as property changes can trigger GUI updates which we can't + * process from another thread until the GUI code is 100% thread-safe. + * --RAM, 2013-10-29 + */ + + teq_safe_rpc(THREAD_MAIN, recursive_update_scan_timing, ctx); + bg_task_ticks_used(bt, 0); return BGR_NEXT; } @@ -1817,9 +2215,9 @@ if (0 == ctx->files_scanned) goto next; - ctx->sorted = hcopy(ctx->files, ctx->files_scanned * sizeof ctx->files0); + ctx->sorted = HCOPY_ARRAY(ctx->files, ctx->files_scanned); - qsort(ctx->sorted, ctx->files_scanned, sizeof ctx->sorted0, + vsort(ctx->sorted, ctx->files_scanned, sizeof ctx->sorted0, shared_file_sort_by_name); /* @@ -1832,7 +2230,7 @@ for (i = 0; UNSIGNED(i) < ctx->files_scanned; i++) { shared_file_t *sf; - sf = ctx->sortedi; + sf = ctx->sortedi; shared_file_check(sf); sf->sort_index = i + 1; } @@ -1842,11 +2240,40 @@ return BGR_NEXT; } +static void * +recursive_install_shared(void *unused) +{ + (void) unused; + + gcu_gui_update_files_scanned(); /* Final view */ + gnet_prop_set_boolean_val(PROP_LIBRARY_REBUILDING, FALSE); + + return NULL; +} + +/** + * pslist_t iterator to mark shared file as no longer indexed. + */ +static void +shared_file_detach(void *data, void *unused) +{ + shared_file_t *sf = data; + + (void) unused; + + shared_file_check(sf); + + sf->flags &= ~SHARE_F_INDEXED; + sf->file_index = 0; + sf->sort_index = 0; +} + static bgret_t recursive_scan_step_install_shared(struct bgtask *bt, void *data, int ticks) { struct recursive_scan *ctx = data; size_t i; + pslist_t *files; recursive_scan_check(ctx); g_assert(ctx->search_tb != NULL); @@ -1864,31 +2291,56 @@ if (GNET_PROPERTY(share_debug) > 1) { int count = st_count(ctx->search_tb); g_debug("SHARE installing new search table (%d item%s)", - count, 1 == count ? "" : "s"); + count, plural(count)); } - share_free(); - - search_table = ctx->search_tb; - file_basenames = ctx->basenames; - shared_files = ctx->shared; - file_table = ctx->files; - sorted_file_table = ctx->sorted; - files_scanned = ctx->files_scanned; - bytes_scanned = ctx->bytes_scanned; - /* - * Now that we installed the shared files, we can mark the entries as - * being indexed and basenamed. + * Now that we are about to install the shared files, we can mark the + * entries as being indexed and basenamed. + * + * Note that no one else can reference the entries at this stage, only + * the file table and the search table (hence a refcount of 2). */ - for (i = 0; i < files_scanned; i++) { - shared_file_t *sf = file_tablei; + for (i = 0; i < ctx->files_scanned; i++) { + shared_file_t *sf = ctx->filesi; shared_file_check(sf); + g_assert(2 == sf->refcnt); + sf->flags |= SHARE_F_INDEXED | SHARE_F_BASENAME; } + SHARED_LIBFILE_LOCK; + + /* + * Don't let share_free() free the list of files whilst we hold the lock. + */ + + files = shared_libfile.shared_files; + shared_libfile.shared_files = NULL; + share_free(); + + /* + * All the files in the list are no longer indexed, as we create new + * shared file objects during our scan. Other parts of the code may + * still have references on them, but they can realize that these + * references are stale by calling shared_file_indexed(). + * + * Note that we do not need to call shared_file_deindex() here as we're + * about to replace all the data structures with fresh ones. + */ + + pslist_foreach(files, shared_file_detach, NULL); + + shared_libfile.search_table = ctx->search_tb; + shared_libfile.file_basenames = ctx->basenames; + shared_libfile.shared_files = ctx->shared; + shared_libfile.file_table = ctx->files; + shared_libfile.sorted_file_table = ctx->sorted; + shared_libfile.files_scanned = ctx->files_scanned; + shared_libfile.bytes_scanned = ctx->bytes_scanned; + /* * Reset these contextual variables, they are now held by the global ones. */ @@ -1899,21 +2351,65 @@ ctx->files = NULL; ctx->sorted = NULL; - gcu_gui_update_files_scanned(); /* Final view */ - gnet_prop_set_boolean_val(PROP_LIBRARY_REBUILDING, FALSE); + reinit_sha1_table(); /* Must happen whilst we hold the lock */ + + SHARED_LIBFILE_UNLOCK; + + shared_file_slist_free_null(&files); + + /* + * If we're not running in the main thread, we need to funnel this + * back as property changes can trigger GUI updates which we can't + * process from another thread until the GUI code is 100% thread-safe. + * --RAM, 2013-10-29 + */ + + teq_safe_rpc(THREAD_MAIN, recursive_install_shared, NULL); /* * The next step is going to request the SHA1 of all the library files, * which will fill again the known SHA1 cache. */ - reinit_sha1_table(); - bg_task_ticks_used(bt, ctx->files_scanned / 10); ctx->idx = 0; /* Prepare next step */ return BGR_NEXT; } +/** + * Get a snapshot copy (atomically) of all the shared files currently + * visible from the application. + * + * The ctx->ftable array is dynamically allocated to hold a reference-counted + * shared file, or NULL if the file was de-indexed for some reason since it + * was initially scanned. + * + * The ctx->ftable_capacity variable is set to hold the ftable capacity. + */ +static void +recursive_scan_load_ftable(struct recursive_scan *ctx) +{ + size_t i; + + g_assert(NULL == ctx->ftable); + + SHARED_LIBFILE_LOCK; + + ctx->ftable_capacity = shared_libfile.files_scanned; + XMALLOC0_ARRAY(ctx->ftable, ctx->ftable_capacity); + + for (i = 0; i < ctx->ftable_capacity; i++) { + shared_file_t *sf = shared_libfile.file_tablei; + + if (sf != NULL) + ctx->ftablei = shared_file_ref(sf); + } + + SHARED_LIBFILE_UNLOCK; + + ctx->ticks += ctx->ftable_capacity; +} + static bgret_t recursive_scan_step_request_sha1(struct bgtask *bt, void *data, int ticks) { @@ -1930,11 +2426,30 @@ ctx->ticks = 0; - while (UNSIGNED(ctx->idx) < files_scanned) { + /* + * All the files are now shared and visible in the global data structures, + * yet we need to iterate to request SHA1 computation. + * + * To avoid taking the global lock for too long, we duplicate the + * file_table array, increment the reference on all the items, and + * then release the global lock. + * + * Iterating on the copy is OK because request_sha1() will do nothing if + * the file is no longer indexed. + */ + + if (0 == ctx->idx) + recursive_scan_load_ftable(ctx); + + while (UNSIGNED(ctx->idx) < ctx->ftable_capacity) { shared_file_t *sf; int i = ctx->idx++; - sf = file_tablei; + sf = ctx->ftablei; + + if (NULL == sf) + continue; + shared_file_check(sf); /* @@ -1947,14 +2462,61 @@ if (ctx->ticks++ >= ticks) return BGR_MORE; + + if (0 == (ctx->ticks & 0xf)) + bg_task_cancel_test(ctx->task); } - share_rebuilding = FALSE; /* Done rebuilding the SHA1 table */ + /* Done rebuilding the SHA1 table */ + atomic_bool_set(&share_rebuilding, FALSE); + bg_task_ticks_used(bt, ctx->ticks); return BGR_NEXT; } static bgret_t +recursive_scan_step_tth_cache_cleanup(struct bgtask *bt, void *data, int ticks) +{ + struct recursive_scan *ctx = data; + + recursive_scan_check(ctx); + (void) bt; + (void) ticks; + + /* + * Now that we have the library of shared files all setup, see whether + * there are entries in the TTH cache that are no longer required + * because their TTH is no longer associated with a shared file. + */ + + tth_cache_cleanup(); + return BGR_NEXT; +} + +/** + * First step, intalling signal handler to trap task cancel. + */ +static bgret_t +recursive_scan_step_qrp_setup(struct bgtask *bt, void *data, int uticks) +{ + struct recursive_scan *ctx = data; + + recursive_scan_check(ctx); + + (void) uticks; + + /* + * The BG_SIG_TERM signal will be sent by the background task scheduler + * when the task is cancelled. + */ + + bg_task_signal(bt, BG_SIG_TERM, recursive_scan_sighandler); + + bg_task_ticks_used(bt, 0); + return BGR_NEXT; +} + +static bgret_t recursive_scan_step_load_partials(struct bgtask *bt, void *data, int ticks) { struct recursive_scan *ctx = data; @@ -1962,15 +2524,22 @@ recursive_scan_check(ctx); (void) ticks; + bg_task_cancel_test(ctx->task); + if (share_can_answer_partials()) { - hash_list_iter_t *iter = hash_list_iterator(partial_files); + hset_iter_t *iter; + const void *item; - while (hash_list_iter_has_next(iter)) { - const shared_file_t *sf = hash_list_iter_next(iter); + hset_lock(partial_files); + iter = hset_iter_new(partial_files); + + while (hset_iter_next(iter, &item)) { + const shared_file_t *sf = item; slist_append(ctx->partial_files, shared_file_ref(sf)); } - hash_list_iter_release(&iter); + hset_iter_release(&iter); + hset_unlock(partial_files); } bg_task_ticks_used(bt, 0); @@ -2001,10 +2570,14 @@ shared_file_check(sf); g_assert(shared_file_is_partial(sf)); + st_insert_item(ctx->partial_tb, sf->name_canonic, sf); if (ctx->ticks++ >= ticks) return BGR_MORE; + + if (0 == (ctx->ticks & 0xf)) + bg_task_cancel_test(ctx->task); } /* Compact the search table */ @@ -2036,17 +2609,34 @@ if (GNET_PROPERTY(share_debug) > 1) { int count = st_count(ctx->partial_tb); g_debug("SHARE installing new partial table (%d item%s)", - count, 1 == count ? "" : "s"); + count, plural(count)); } - st_free(&partial_table); - partial_table = ctx->partial_tb; + SHARED_LIBFILE_LOCK; + + st_free(&shared_libfile.partial_table); + shared_libfile.partial_table = ctx->partial_tb; ctx->partial_tb = NULL; + SHARED_LIBFILE_UNLOCK; + bg_task_ticks_used(bt, 0); return BGR_NEXT; } +static void * +recursive_prepare_qrp(void *data) +{ + struct recursive_scan *ctx = data; + + recursive_scan_check(ctx); + + ctx->start_time = tm_time_exact(); + gnet_prop_set_timestamp_val(PROP_QRP_INDEXING_STARTED, ctx->start_time); + + return NULL; +} + static bgret_t recursive_scan_step_prepare_qrp(struct bgtask *bt, void *data, int ticks) { @@ -2055,7 +2645,12 @@ recursive_scan_check(ctx); (void) ticks; - gnet_prop_set_timestamp_val(PROP_QRP_INDEXING_STARTED, tm_time_exact()); + /* + * Funnel back all property changes to the main thread. + */ + + teq_safe_rpc(THREAD_MAIN, recursive_prepare_qrp, ctx); + qrp_prepare_computation(); ctx->idx = 0; @@ -2064,7 +2659,7 @@ } static bgret_t -recursive_scan_step_update_qrp(struct bgtask *bt, void *data, int ticks) +recursive_scan_step_update_qrp_lib(struct bgtask *bt, void *data, int ticks) { struct recursive_scan *ctx = data; shared_file_t *sf; @@ -2073,19 +2668,58 @@ ctx->ticks = 0; - for (/* empty */; UNSIGNED(ctx->idx) < files_scanned; ctx->idx++) { - sf = sorted_file_tablectx->idx; + /* + * If we're coming from a rescan, then we have already loaded the ftable + * copy in the context. + * + * Otherwise, the ctx->ftable array will be null and we need to load + * a copy of the shared files, atomically. + */ + + if (0 == ctx->idx && NULL == ctx->ftable) + recursive_scan_load_ftable(ctx); + + for (;;) { + SHARED_LIBFILE_LOCK; - if (!sf) + if (UNSIGNED(ctx->idx) >= shared_libfile.files_scanned) { + SHARED_LIBFILE_UNLOCK; + break; + } + sf = shared_libfile.sorted_file_tablectx->idx; + if (sf != NULL) + sf = shared_file_ref(sf); + + SHARED_LIBFILE_UNLOCK; + + if (NULL == sf) continue; + qrp_add_file(sf, ctx->words); + shared_file_unref(&sf); + if (ctx->ticks++ >= ticks) return BGR_MORE; - shared_file_check(sf); - qrp_add_file(sf, ctx->words); + if (0 == (ctx->ticks & 0xf)) + bg_task_cancel_test(ctx->task); + + ctx->idx++; } + bg_task_ticks_used(bt, ctx->ticks); + return BGR_NEXT; +} + +static bgret_t +recursive_scan_step_update_qrp_partial(struct bgtask *bt, void *data, int ticks) +{ + struct recursive_scan *ctx = data; + shared_file_t *sf; + uint64 scanned = files_scanned(); + + ctx->ticks = 0; + while (NULL != (sf = slist_shift(ctx->partial_files))) { shared_file_check(sf); @@ -2098,7 +2732,7 @@ * when inserting partial files. */ - sf->file_index = files_scanned + (hash_list_length(partial_files) - + sf->file_index = scanned + (hset_count(partial_files) - slist_length(ctx->partial_files)); qrp_add_file(sf, ctx->words); @@ -2106,128 +2740,378 @@ if (ctx->ticks++ >= ticks) return BGR_MORE; + + if (0 == (ctx->ticks & 0xf)) + bg_task_cancel_test(ctx->task); } bg_task_ticks_used(bt, ctx->ticks); return BGR_NEXT; } +static void * +recursive_scan_finalize(void *arg) +{ + struct recursive_scan *ctx = arg; + time_delta_t elapsed; + + recursive_scan_check(ctx); + + elapsed = delta_time(tm_time(), ctx->start_time); + elapsed = MAX(0, elapsed); + + gnet_prop_set_guint32_val(PROP_QRP_INDEXING_DURATION, elapsed); + + qrp_finalize_computation(ctx->words); + ctx->words = NULL; /* Gave pointer, QRP computation will free it */ + + return NULL; +} + static bgret_t recursive_scan_step_finalize(struct bgtask *bt, void *data, int ticks) { struct recursive_scan *ctx = data; - time_delta_t elapsed; recursive_scan_check(ctx); (void) bt; (void) ticks; - qrp_finalize_computation(ctx->words); - ctx->words = NULL; /* Gave pointer, QRP computation will free it */ + /* + * Cannot change a property that can trigger a GTK update from another + * thread, we need to funnel this back to the main thread. + * + * Also, we want to run the QRP computation background task from the + * main thread, not from the library thread. + */ - elapsed = delta_time(tm_time(), GNET_PROPERTY(qrp_indexing_started)); - elapsed = MAX(0, elapsed); - gnet_prop_set_guint32_val(PROP_QRP_INDEXING_DURATION, elapsed); + teq_safe_rpc(THREAD_MAIN, recursive_scan_finalize, ctx); return BGR_DONE; } +/** + * Create a new background task for library rescan (+ QRP rebuilding). + * + * @param bs the scheduler to which task should be inserted into + * + * @return a new background task. + */ +static struct bgtask * +share_rescan_create_task(bgsched_t *bs) +{ + static const bgstep_cb_t steps = { + recursive_scan_step_setup, + recursive_scan_step_compute, + recursive_scan_step_compute_done, + recursive_scan_step_build_search_table, + recursive_scan_step_build_file_table, + recursive_scan_step_build_basenames, + recursive_scan_step_update_scan_timing, + recursive_scan_step_build_sorted_table, + recursive_scan_step_install_shared, + recursive_scan_step_request_sha1, + recursive_scan_step_tth_cache_cleanup, + + /* + * The following group of steps is identical to the ones listed in + * share_update_qrp_create_task(). + */ + + recursive_scan_step_load_partials, + recursive_scan_step_build_partial_table, + recursive_scan_step_install_partials, + recursive_scan_step_prepare_qrp, + recursive_scan_step_update_qrp_lib, + recursive_scan_step_update_qrp_partial, + recursive_scan_step_finalize, + }; + struct recursive_scan *ctx; + + ctx = recursive_scan_new(shared_dirs, tm_time()); + + return ctx->task = bg_task_create(bs, "recursive scan", + steps, N_ITEMS(steps), + ctx, recursive_scan_context_free, + recursive_scan_done, NULL); +} + +/** + * Create a new background task for QRP rebuilding. + * + * @param bs the scheduler to which task should be inserted into + * + * @return a new background task. + */ +static struct bgtask * +share_update_qrp_create_task(bgsched_t *bs) +{ + static const bgstep_cb_t steps = { + recursive_scan_step_qrp_setup, + recursive_scan_step_load_partials, + recursive_scan_step_build_partial_table, + recursive_scan_step_install_partials, + recursive_scan_step_prepare_qrp, + recursive_scan_step_update_qrp_lib, + recursive_scan_step_update_qrp_partial, + recursive_scan_step_finalize, + }; + struct recursive_scan *ctx; + + ctx = recursive_scan_new(NULL, tm_time()); + + return ctx->task = bg_task_create(bs, "QRP update", + steps, N_ITEMS(steps), + ctx, recursive_scan_context_free, + recursive_scan_done, NULL); +} + +/* + * The "share_thread_lib_xxx" routine is the implementation, within the + * "library" thread, of the corresponding API invoked from the "main" thread. + * + * These are handled as TEQ events, and are therefore delivered to the + * thread in the same order as they were issued. + */ + +/** + * Start a library scan. + */ static void -recursive_scan_create_task(struct recursive_scan *ctx) +share_thread_lib_rescan(void *unused_arg) { - recursive_scan_check(ctx); + struct share_thread_vars *v = &share_thread_vars; + + (void) unused_arg; - if (NULL == ctx->task) { - static const bgstep_cb_t steps = { - recursive_scan_step_compute, - recursive_scan_step_compute_done, - recursive_scan_step_build_search_table, - recursive_scan_step_build_file_table, - recursive_scan_step_build_basenames, - recursive_scan_step_update_scan_timing, - recursive_scan_step_build_sorted_table, - recursive_scan_step_install_shared, - recursive_scan_step_request_sha1, - recursive_scan_step_load_partials, - recursive_scan_step_build_partial_table, - recursive_scan_step_install_partials, - recursive_scan_step_prepare_qrp, - recursive_scan_step_update_qrp, - recursive_scan_step_finalize, - }; - - ctx->task = bg_task_create("recursive scan", - steps, G_N_ELEMENTS(steps), - ctx, recursive_scan_context_free, - NULL, NULL); + spinlock(&v->lock); + + if (v->task != NULL) { + bg_task_cancel(v->task); + v->task = NULL; } + + v->qrp_rebuild = FALSE; /* since rescan takes care of it */ + v->task = share_rescan_create_task(v->sched); + + spinunlock(&v->lock); } +/** + * Request a QRP rebuild. + */ static void -share_update_qrp_create_task(struct recursive_scan *ctx) +share_thread_lib_qrp_rebuild(void *unused_arg) { - recursive_scan_check(ctx); + struct share_thread_vars *v = &share_thread_vars; + bool pending; - if (NULL == ctx->task) { - static const bgstep_cb_t steps = { - recursive_scan_step_load_partials, - recursive_scan_step_build_partial_table, - recursive_scan_step_install_partials, - recursive_scan_step_prepare_qrp, - recursive_scan_step_update_qrp, - recursive_scan_step_finalize, - }; + (void) unused_arg; - ctx->task = bg_task_create("QRP update", - steps, G_N_ELEMENTS(steps), - ctx, recursive_scan_context_free, - NULL, NULL); + spinlock(&v->lock); + + if (v->task != NULL) { + v->qrp_rebuild = TRUE; /* record for later */ + } else { + v->task = share_update_qrp_create_task(v->sched); + v->qrp_rebuild = FALSE; + } + + pending = v->qrp_rebuild; + spinunlock(&v->lock); + + if (GNET_PROPERTY(share_debug) > 1) { + g_debug("SHARE background QRP recomputation %s", + pending ? "recorded" : "started"); } } +/* + * The "share_lib_xxx" routine constitute the API from the "main" thread to the + * "library" thread. + */ + /** - * Perform scanning of the shared directories to build up the list of - * shared files. + * Start a library scan. */ -void -share_scan(void) +static void +share_lib_rescan(void) { - recursive_scan_free(&recursive_scan_context); - recursive_scan_context = recursive_scan_new(shared_dirs); - share_rebuilding = TRUE; - gnet_prop_set_boolean_val(PROP_LIBRARY_REBUILDING, TRUE); - gnet_prop_set_timestamp_val(PROP_LIBRARY_RESCAN_STARTED, tm_time_exact()); - recursive_scan_create_task(recursive_scan_context); + teq_post(share_thread_id, share_thread_lib_rescan, NULL); } /** - * Update the QRP table, including both our shared library and our partials. + * Request a QRP rebuild. * - * @return whether QRP update task was launched. + * This will update the QRP table, including both our shared library and our + * partials. + */ +static void +share_lib_qrp_rebuild(void) +{ + teq_post(share_thread_id, share_thread_lib_qrp_rebuild, NULL); + + if (GNET_PROPERTY(share_debug) > 1) { + g_debug("SHARE requested background QRP recomputation (%s)", + share_can_answer_partials() ? + "with partial files" : "library only"); + } +} + +/** + * Is there work pending for the library thread, or is thread terminated? + */ +static bool +share_thread_has_work(void *unused_arg) +{ + struct share_thread_vars *v = &share_thread_vars; + (void) unused_arg; + + return atomic_bool_get(&v->exiting) || v->task != NULL || v->qrp_rebuild; +} + +/** + * Signal handler to terminate the library thread. */ -static gboolean -share_update_qrp(void) +static void +share_thread_terminate(int sig) { + struct share_thread_vars *v = &share_thread_vars; + + g_assert(TSIG_TERM == sig); + + if (GNET_PROPERTY(share_debug)) + g_debug("terminating library thread"); + + atomic_bool_set(&v->exiting, TRUE); + spinlock(&v->lock); + if (v->task != NULL) { + bg_task_cancel(v->task); + v->task = NULL; + } + spinunlock(&v->lock); +} + +/** + * Library thread main loop. + */ +static void * +share_thread_main(void *arg) +{ + struct share_thread_vars *v = &share_thread_vars; + barrier_t *b = arg; + + thread_set_name("library"); + teq_create(); /* Queue to receive TEQ events */ + thread_signal(TSIG_TERM, share_thread_terminate); + v->sched = bg_sched_create("library", 1000000 /* 1 s */); + + barrier_wait(b); /* Thread has initialized */ + barrier_free_null(&b); + + if (GNET_PROPERTY(share_debug)) + g_debug("library thread started"); + /* - * If we're already rebuilding something, do nothing for now - * We'll be called regularily until we can proceed. + * Process work until we're told to exit. */ - if (recursive_scan_context != NULL && recursive_scan_context->task != NULL) - return FALSE; + while (!atomic_bool_get(&v->exiting)) { + struct bgtask *bt; + bool qrp_rebuild; - recursive_scan_free(&recursive_scan_context); - recursive_scan_context = recursive_scan_new(NULL); - share_update_qrp_create_task(recursive_scan_context); + if (GNET_PROPERTY(share_debug)) + g_debug("library thread sleeping"); - return TRUE; + teq_wait(share_thread_has_work, NULL); + + if (atomic_bool_get(&v->exiting)) + break; /* Terminated by signal */ + + if (GNET_PROPERTY(share_debug)) + g_debug("library thread awoken"); + + spinlock(&v->lock); + bt = v->task; /* The task run */ + spinunlock(&v->lock); + + g_assert(bt != NULL); + + while (0 != bg_sched_run(v->sched)) + thread_check_suspended(); + + /* + * QRP table rebuilds can have been recorded whilst we were processing + * the previous task. If one is present, create the task, which will + * make share_thread_has_work() to return TRUE. + */ + + spinlock(&v->lock); + if (v->task == bt) + v->task = NULL; /* Finished running previous task */ + qrp_rebuild = v->qrp_rebuild; + spinunlock(&v->lock); + + if (qrp_rebuild) + share_thread_lib_qrp_rebuild(NULL); + } + + bg_sched_destroy_null(&v->sched); + + g_debug("library thread exiting"); + return NULL; +} + +/** + * Create a new library thread. + * + * This routine does not return until the library thread has been + * correctly initialized, so that the caller can immediately start to + * send TEQ events to the thread. + * + * @return thread ID, -1 on error. + */ +static int +share_thread_create(void) +{ + barrier_t *b; + int r; + + b = barrier_new(2); + + /* + * The library thread is created as a detached thread because we + * do not expect any result from it. + * + * It is created as non-cancelable: to end it, we send it a TSIG_TERM. + */ + + r = thread_create(share_thread_main, barrier_refcnt_inc(b), + THREAD_F_DETACH | THREAD_F_NO_CANCEL | + THREAD_F_NO_POOL | THREAD_F_PANIC, + THREAD_STACK_MIN); + + barrier_wait(b); /* Wait for thread to initialize */ + barrier_free_null(&b); + + return r; +} + +/** + * Perform scanning of the shared directories to build up the list of + * shared files. + */ +void +share_scan(void) +{ + share_lib_rescan(); } /** * Hash table iterator callback to free the value. */ static void -special_free_kv(gpointer unused_key, gpointer val, gpointer unused_udata) +special_free_kv(const void *unused_key, void *val, void *unused_udata) { shared_file_t *sf = val; @@ -2244,30 +3128,39 @@ static void share_special_close(void) { - g_hash_table_foreach(special_names, special_free_kv, NULL); - gm_hash_table_destroy_null(&special_names); + htable_foreach(special_names, special_free_kv, NULL); + htable_free_null(&special_names); } /** * Shutdown cleanup. */ -G_GNUC_COLD void +void G_COLD share_close(void) { - recursive_scan_free(&recursive_scan_context); + if (THREAD_MAIN != share_thread_id) + thread_kill(share_thread_id, TSIG_TERM); + + /* + * This call must happen after node_close() to ensure the UDP TX scheduler + * has been released and that no messages there could invoked callbacks + * referring to OOB data that oob_close() is going to free up. + */ + share_special_close(); free_extensions(); + pslist_foreach(shared_libfile.shared_files, shared_file_detach, NULL); share_free(); shared_dirs_free(); huge_close(); qrp_close(); oob_proxy_close(); - oob_close(); + oob_close(); /* References hits, so needs ``sha1_to_share'' */ qhit_close(); - st_free(&partial_table); - gm_hash_table_destroy_null(&share_media_types); - hash_list_free(&partial_files); - st_free(&partial_table); + st_free(&shared_libfile.partial_table); + htable_free_null(&share_media_types); + hset_free_null(&partial_files); + hikset_free_null(&sha1_to_share); cq_cancel(&share_qrp_rebuild_ev); } @@ -2289,18 +3182,16 @@ sf->flags &= ~(SHARE_F_RECOMPUTING | SHARE_F_HAS_DIGEST); sf->flags |= sha1 ? SHARE_F_HAS_DIGEST : 0; - if (sf->sha1) { + if (sf->sha1 != NULL) { shared_file_t *current; - gpointer key; - key = deconstify_gpointer(sf->sha1); - current = g_tree_lookup(sha1_to_share, key); + current = hikset_lookup(sha1_to_share, sf->sha1); if (current) { shared_file_check(current); g_assert(SHARE_F_INDEXED & current->flags); if (sf == current) { - g_tree_remove(sha1_to_share, key); + hikset_remove(sha1_to_share, sf->sha1); } } } @@ -2313,16 +3204,14 @@ * from a previous rescan finishes after newly initiated rescan. */ - if ((SHARE_F_INDEXED & sf->flags) && sf->sha1) { + if ((SHARE_F_INDEXED & sf->flags) && sf->sha1 != NULL) { shared_file_t *current; - gpointer key; - key = deconstify_gpointer(sf->sha1); - current = g_tree_lookup(sha1_to_share, key); + current = hikset_lookup(sha1_to_share, sf->sha1); if (current) { shared_file_check(current); g_assert(SHARE_F_INDEXED & current->flags); - + /* * There can be multiple shared files with the same SHA-1. * Only the first found is inserted into the tree. @@ -2337,9 +3226,26 @@ * New SHA-1 known for this file entry. * Record in the set of shared SHA-1s and publish to the DHT. */ - - g_tree_insert(sha1_to_share, deconstify_gpointer(sf->sha1), sf); - publisher_add(sf->sha1); + + hikset_insert_key(sha1_to_share, &sf->sha1); + + /* + * Could be called from the "library" thread during scanning of + * the shared file. Since publisher_add() will access an SDBM + * database via the DBMW layer, and that is not thread-safe yet, + * funnel back the call to the main thread. + * --RAM, 2013-11-05 + * + * We need a "safe" post because the publishing event can do + * heavy work and we could re-enter SDBM or the DBMW layer + * accidentally during the interruption, creating nasty effects + * if we, for instance, access a hash table being resized by an + * earlier call on the stack. + * --RAM, 2014-01-02 + */ + + teq_safe_post(THREAD_MAIN, publisher_add_event, + deconstify_pointer(sf->sha1)); } } } @@ -2367,7 +3273,7 @@ * * Use sha1_hash_is_uptodate() to check for availability and accurateness. */ -gboolean +bool sha1_hash_available(const shared_file_t *sf) { shared_file_check(sf); @@ -2382,7 +3288,7 @@ * NB: if the file is found to have changed, the background computation of * the SHA1 is requested. */ -gboolean +bool sha1_hash_is_uptodate(shared_file_t *sf) { filestat_t buf; @@ -2448,21 +3354,21 @@ /** * Whether file is finished (i.e. either shared from the library or seeded). */ -gboolean +bool shared_file_is_finished(const shared_file_t *sf) { shared_file_check(sf); return NULL == sf->fi || 0 != (sf->fi->flags & FI_F_SEEDING); } -gboolean +bool shared_file_is_partial(const shared_file_t *sf) { shared_file_check(sf); return NULL != sf->fi; } -gboolean +bool shared_file_is_shareable(const shared_file_t *sf) { shared_file_check(sf); @@ -2489,15 +3395,49 @@ return sf->file_size; } -guint32 +/** + * Get the file index in the library for the given shared file. + * + * @return the file index, or 0 if the shared file is no longer part of the + * library (a concurrent library rescan invalidated that file for now). + */ +uint32 shared_file_index(const shared_file_t *sf) { + uint32 idx; + shared_file_check(sf); - g_assert(sf->file_index != 0); /* Either PARTIAL_FILE or > 0 */ - g_assert(PARTIAL_FILE != sf->file_index || NULL != sf->fi); + idx = sf->file_index; + + /* + * Watch out for concurrent library rescan de-indexing a file that would + * be, for instance, part of a query hit that we're constructing. + */ + + if G_UNLIKELY(0 == idx) { + /* + * File was de-indexed, meaning the reference we have on it is no + * longer attached to the library. If the file has a SHA1, we may + * still be able to locate a suitable file index for that SHA1. + */ + + if (sf->sha1 != NULL) { + shared_file_t *sfx; + + SHARED_LIBFILE_LOCK; + sfx = hikset_lookup(sha1_to_share, sf->sha1); + if (sfx != NULL) { + idx = sfx->file_index; + g_assert(sfx->file_index != 0); + } + SHARED_LIBFILE_UNLOCK; + } + } + + g_assert(PARTIAL_FILE != idx || NULL != sf->fi); - return sf->file_index; + return idx; } const struct sha1 * @@ -2598,7 +3538,33 @@ return sf->ctime; } -guint32 +/** + * @return available bytes (same as filesize, unless file is partial). + */ +filesize_t +shared_file_available(const shared_file_t *sf) +{ + shared_file_check(sf); + + /* + * For partial files, we need to query the fileinfo as the value in + * the shared_file is the one copied at the time we create the + * structure from the partial file. It is not updated regularily. + */ + + return NULL == sf->fi + ? sf->file_size + : (sf->fi->buffered + sf->fi->done); +} + +bool +shared_file_indexed(const shared_file_t *sf) +{ + shared_file_check(sf); + return 0 != (SHARE_F_INDEXED & sf->flags); +} + +uint32 shared_file_flags(const shared_file_t *sf) { shared_file_check(sf); @@ -2625,7 +3591,10 @@ shared_file_check(sf); shared_file_deindex(sf); - if (0 == sf->refcnt) { + + if G_UNLIKELY(0 == sf->refcnt) { + g_carp("%s(): called on unreferenced file \"%s\"", + G_STRFUNC, sf->file_path); shared_file_free(&sf); } } @@ -2671,46 +3640,57 @@ sf->mime_type = mime_type_from_filename(sf->name_nfc); sf->file_path = atom_str_get(fi->pathname); + sf->flags |= SHARE_F_FILEINFO; sf->fi = fi; /* Signals it's a partially downloaded file */ fi->sf = shared_file_ref(sf); } /** - * @returns the shared_file if we share a complete file bearing the given SHA1. - * @returns NULL if we don't share a complete file, or SHARE_REBUILDING if the + * Get shared file identified by its SHA1. + * + * The returned file is reference-counted if not a special value. + * + * @return the shared_file if we share a complete file bearing the given SHA1, + * or NULL if we don't share a complete file, or SHARE_REBUILDING if the * set of shared file is being rebuilt. */ static shared_file_t * shared_file_complete_by_sha1(const struct sha1 *sha1) { - shared_file_t *f; + shared_file_t *sf; if (sha1_to_share == NULL) /* Not even begun share_scan() yet */ return SHARE_REBUILDING; - f = g_tree_lookup(sha1_to_share, deconstify_gpointer(sha1)); - if (f) { - shared_file_check(f); - } + SHARED_LIBFILE_LOCK; - if (!f || !sha1_hash_available(f)) { + sf = hikset_lookup(sha1_to_share, sha1); + if (sf != NULL) + shared_file_ref(sf); + + SHARED_LIBFILE_UNLOCK; + + if (!sf || !sha1_hash_available(sf)) { /* * If we're rebuilding the library, we might not have parsed the * file yet, so it's possible we have this URN but we don't know * it yet. --RAM, 12/10/2002. */ - return share_rebuilding ? SHARE_REBUILDING : NULL; + return atomic_bool_get(&share_rebuilding) ? SHARE_REBUILDING : NULL; } - return f; + return sf; } /** * Take a given binary SHA1 digest, and return the corresponding * shared_file if we have it. * + * The returned file is reference-counted hence caller needs to call + * shared_file_unref(). + * * @attention * NB: if the returned "shared_file" structure holds a non-NULL `fi', * then it means it is a partially shared file. @@ -2723,7 +3703,7 @@ { shared_file_t *f; - f = shared_file_complete_by_sha1(sha1); + f = shared_file_complete_by_sha1(sha1); /* Ref-counted now */ /* * If we don't share this file, or if we're rebuilding, and provided @@ -2737,10 +3717,10 @@ if (sf != NULL) { if (GNET_PROPERTY(pfsp_rare_server)) { if (download_sha1_is_rare(sha1)) { - f = sf; + f = shared_file_ref(sf); } } else { - f = sf; + f = shared_file_ref(sf); } } } @@ -2758,13 +3738,22 @@ * seconds old. * * @attention - * No reference counting is done on the returned pointers, which must therefore - * be used right away. + * Entries filled in the sfvec array are ref-counted and the caller is + * responsible for calling shared_file_unref() on each entry after using it. + * + * @param sfvec the vector to fill in + * @param sfcount the size of the vector + * @param media_mask media-type filtering to apply + * @param size_restrict whether to apply filesize restrictions + * @param minsize if applicable, the minimal size + * @param maxsize if applicable, the maximum size * * @return the amount of entries filled in the vector. */ size_t -share_fill_newest(shared_file_t **sfvec, size_t sfcount, unsigned media_mask) +share_fill_newest(shared_file_t **sfvec, size_t sfcount, + unsigned media_mask, + bool size_restrict, filesize_t minsize, filesize_t maxsize) { int i; size_t j; @@ -2772,13 +3761,21 @@ g_assert(sfvec != NULL); g_assert(size_is_positive(sfcount)); - if (NULL == file_table) + SHARED_LIBFILE_LOCK; + + if (NULL == shared_libfile.file_table) { + SHARED_LIBFILE_UNLOCK; return 0; + } - g_assert(files_scanned != 0); + g_assert(shared_libfile.files_scanned != 0); - for (i = files_scanned - 1, j = 0; i >= 0 && j < sfcount; i--) { - shared_file_t *sf = file_tablei; + for ( + i = shared_libfile.files_scanned - 1, j = 0; + i >= 0 && j < sfcount; + i-- + ) { + shared_file_t *sf = shared_libfile.file_tablei; if (sf != NULL) { shared_file_check(sf); @@ -2791,17 +3788,25 @@ if (media_mask != 0 && !shared_file_has_media_type(sf, media_mask)) continue; - sfvecj++ = sf; + if (size_restrict) { + filesize_t size = shared_file_size(sf); + if (size < minsize || size > maxsize) + continue; + } + + sfvecj++ = shared_file_ref(sf); } } + SHARED_LIBFILE_UNLOCK; + return j; } /** * Is shared file belonging to the media types indicated by mask? */ -gboolean +bool shared_file_has_media_type(const shared_file_t *sf, unsigned mask) { unsigned type; @@ -2809,7 +3814,7 @@ shared_file_check(sf); type = pointer_to_uint( - g_hash_table_lookup(share_media_types, int_to_pointer(sf->mime_type))); + htable_lookup(share_media_types, int_to_pointer(sf->mime_type))); return 0 != (type & mask); } @@ -2829,7 +3834,7 @@ const void *v; mime = mime_type_from_filename(filename); - v = g_hash_table_lookup(share_media_types, int_to_pointer(mime)); + v = htable_lookup(share_media_types, int_to_pointer(mime)); return pointer_to_uint(v); } @@ -2837,47 +3842,19 @@ /** * Get accessor for ``kbytes_scanned'' */ -guint64 +uint64 shared_kbytes_scanned(void) { - return bytes_scanned / 1024; + return bytes_scanned() / 1024; } /** * Get accessor for ``files_scanned'' */ -guint64 +uint64 shared_files_scanned(void) { - return files_scanned; -} - -/** - * Callout queue callback to initiate a QRP rebuild after a partial file - * insertion or removal. - */ -static void -share_qrp_rebuild(cqueue_t *unused_cq, void *unused_data) -{ - (void) unused_cq; - (void) unused_data; - - share_qrp_rebuild_ev = NULL; - - if (share_update_qrp()) { - if (GNET_PROPERTY(share_debug) > 1) { - g_debug("SHARE launched background QRP recomputation (%s)", - share_can_answer_partials() ? - "with partial files" : "library only"); - } - } else { - if (GNET_PROPERTY(share_debug) > 1) { - g_debug("SHARE deferring background QRP recomputation (%s)", - share_can_answer_partials() ? - "with partial files" : "library only"); - } - share_qrp_rebuild_ev = cq_main_insert(1000, share_qrp_rebuild, NULL); - } + return files_scanned(); } /** @@ -2887,8 +3864,8 @@ static void share_qrp_rebuild_if_needed(void) { - if (NULL == share_qrp_rebuild_ev && share_can_answer_partials()) - share_qrp_rebuild_ev = cq_main_insert(1000, share_qrp_rebuild, NULL); + if (share_can_answer_partials()) + share_lib_qrp_rebuild(); } /** @@ -2899,10 +3876,10 @@ { g_assert(shared_file_is_partial(sf)); - if (hash_list_contains(partial_files, sf)) + if (hset_contains(partial_files, sf)) return; - hash_list_append(partial_files, sf); + hset_insert(partial_files, sf); /* * We added a new partial file, we need to rebuild the QRP table. @@ -2924,7 +3901,7 @@ { g_assert(shared_file_is_partial(sf)); - if (NULL == hash_list_remove(partial_files, sf)) + if (!hset_remove(partial_files, sf)) return; /* @@ -2944,14 +3921,13 @@ void share_update_matching_information(void) { - if (NULL == share_qrp_rebuild_ev) - share_qrp_rebuild_ev = cq_main_insert(1, share_qrp_rebuild, NULL); + share_lib_qrp_rebuild(); } /** * Initialization of the sharing library. */ -G_GNUC_COLD void +void G_COLD share_init(void) { size_t i; @@ -2976,27 +3952,41 @@ * --RAM, 15/08/2002. */ - search_table = st_create(); + shared_libfile.search_table = st_create(); /* * Intialize partial file querying structures (so that queries can * be applied to partial files). */ - partial_files = hash_list_new(pointer_hash_func, NULL); - partial_table = st_create(); + partial_files = hset_create(HASH_KEY_SELF, 0); + hset_thread_safe(partial_files); + + shared_libfile.partial_table = st_create(); /* * Create the hash table yielding the media type flags from a MIME type. */ - share_media_types = g_hash_table_new(NULL, NULL); + share_media_types = htable_create(HASH_KEY_SELF, 0); - for (i = 0; i < G_N_ELEMENTS(media_type_map); i++) { - g_hash_table_insert(share_media_types, + for (i = 0; i < N_ITEMS(media_type_map); i++) { + htable_insert(share_media_types, int_to_pointer(media_type_mapi.type), int_to_pointer(media_type_mapi.flags)); } + + /* + * If we have at least 2 CPUs available, create a library thread. + * Otherwise, library scanning will be handled by the main thread. + */ + + if (getcpucount() >= 2) { + share_thread_id = share_thread_create(); + } else { + share_thread_id = THREAD_MAIN; + g_assert(THREAD_MAIN == thread_by_name("main")); + } } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/share.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/share.h
Changed
@@ -54,6 +54,7 @@ */ enum { + SHARE_F_FILEINFO = (1 << 5), /**< File referenced by fileinfo */ SHARE_F_INDEXED = (1 << 4), /**< File is in file_table index */ SHARE_F_BASENAME = (1 << 3), /**< File is in basename index */ SHARE_F_SPECIAL = (1 << 2), /**< Special (robots.txt, favicon)*/ @@ -61,25 +62,30 @@ SHARE_F_HAS_DIGEST = (1 << 0) /**< Digest is set */ }; -#define SHARE_REBUILDING shared_file_dummy() - static inline shared_file_t * shared_file_dummy(void) { static shared_file_t *dummy; if (!dummy) { - dummy = deconstify_gpointer(vmm_trap_page()); + dummy = deconstify_pointer(vmm_trap_page()); } return dummy; } -struct gnutella_node; -struct query_hashvec; - -/* +/** * Special return value from shared_file() during library rebuild time. * This is needed because we no longer block the GUI whilst scanning. */ +#define SHARE_REBUILDING shared_file_dummy() + +/** + * Flags for shared_files_match(). + */ +#define SHARE_FM_PARTIALS (1 << 0) /**< Can match partials */ +#define SHARE_FM_G2 (1 << 1) /**< G2 query */ + +struct gnutella_node; +struct query_hashvec; /* * Global Functions @@ -88,63 +94,76 @@ void share_init(void); void share_close(void); -shared_file_t *shared_file(guint idx); -shared_file_t *shared_file_sorted(guint idx); +shared_file_t *shared_file(uint idx); +shared_file_t *shared_file_sorted(uint idx); shared_file_t *shared_file_by_name(const char *filename); shared_file_t *shared_file_ref(const shared_file_t *sf); shared_file_t *shared_file_by_sha1(const struct sha1 *sha1); shared_file_t *shared_special(const char *path); void shared_file_unref(shared_file_t **sf_ptr); +void shared_file_fileinfo_unref(shared_file_t **sf_ptr); void shared_file_remove(shared_file_t *sf); +struct hset; +struct hset *share_tthset_get(void); +void share_tthset_free(struct hset *set); + void parse_extensions(const char *); char *get_file_path(int); void shared_dirs_update_prop(void); -gboolean shared_dirs_parse(const char *); +bool shared_dirs_parse(const char *); void shared_file_set_sha1(shared_file_t *, const struct sha1 *sha1); void shared_file_set_tth(shared_file_t *, const struct tth *tth); void shared_file_set_modification_time(shared_file_t *sf, time_t mtime); void shared_file_set_path(shared_file_t *sf, const char *pathname); -void shared_file_check(const shared_file_t *sf); -gboolean sha1_hash_available(const shared_file_t *sf) G_GNUC_PURE; -gboolean sha1_hash_is_uptodate(shared_file_t *sf); -gboolean shared_file_is_partial(const shared_file_t *sf) G_GNUC_PURE; -gboolean shared_file_is_finished(const shared_file_t *sf) G_GNUC_PURE; -gboolean shared_file_is_shareable(const shared_file_t *sf) G_GNUC_PURE; -filesize_t shared_file_size(const shared_file_t *sf) G_GNUC_PURE; -guint32 shared_file_index(const shared_file_t *sf) G_GNUC_PURE; -time_t shared_file_modification_time(const shared_file_t *sf) G_GNUC_PURE; -time_t shared_file_creation_time(const shared_file_t *sf) G_GNUC_PURE; -const char *shared_file_path(const shared_file_t *sf) G_GNUC_PURE; -const struct sha1 *shared_file_sha1(const shared_file_t *sf) G_GNUC_PURE; -const struct tth *shared_file_tth(const shared_file_t *sf) G_GNUC_PURE; -const char *shared_file_name_nfc(const shared_file_t *sf) G_GNUC_PURE; -const char *shared_file_name_canonic(const shared_file_t *sf) G_GNUC_PURE; -const char *shared_file_relative_path(const shared_file_t *sf) G_GNUC_PURE; -size_t shared_file_name_nfc_len(const shared_file_t *sf) G_GNUC_PURE; -size_t shared_file_name_canonic_len(const shared_file_t *sf) G_GNUC_PURE; -guint32 shared_file_flags(const shared_file_t *sf) G_GNUC_PURE; -fileinfo_t *shared_file_fileinfo(const shared_file_t *sf) G_GNUC_PURE; -const char *shared_file_mime_type(const shared_file_t *sf) G_GNUC_PURE; +void shared_file_check(const shared_file_t * const sf); +void shared_file_name_check(const shared_file_t * const sf); +bool sha1_hash_available(const shared_file_t *sf) G_PURE; +bool sha1_hash_is_uptodate(shared_file_t *sf); +bool shared_file_is_partial(const shared_file_t *sf) G_PURE; +bool shared_file_is_finished(const shared_file_t *sf) G_PURE; +bool shared_file_is_shareable(const shared_file_t *sf) G_PURE; +filesize_t shared_file_size(const shared_file_t *sf) G_PURE; +uint32 shared_file_index(const shared_file_t *sf) G_PURE; +time_t shared_file_modification_time(const shared_file_t *sf) G_PURE; +time_t shared_file_creation_time(const shared_file_t *sf) G_PURE; +filesize_t shared_file_available(const shared_file_t *sf) G_PURE; +const char *shared_file_path(const shared_file_t *sf) G_PURE; +const struct sha1 *shared_file_sha1(const shared_file_t *sf) G_PURE; +const struct tth *shared_file_tth(const shared_file_t *sf) G_PURE; +const char *shared_file_name_nfc(const shared_file_t *sf) G_PURE; +const char *shared_file_name_canonic(const shared_file_t *sf) G_PURE; +const char *shared_file_relative_path(const shared_file_t *sf) G_PURE; +size_t shared_file_name_nfc_len(const shared_file_t *sf) G_PURE; +size_t shared_file_name_canonic_len(const shared_file_t *sf) G_PURE; +uint32 shared_file_flags(const shared_file_t *sf) G_PURE; +fileinfo_t *shared_file_fileinfo(const shared_file_t *sf) G_PURE; +const char *shared_file_mime_type(const shared_file_t *sf) G_PURE; +bool shared_file_indexed(const shared_file_t *sf) G_PURE; void shared_file_from_fileinfo(fileinfo_t *fi); -gboolean shared_file_has_media_type(const shared_file_t *sf, unsigned m) - G_GNUC_PURE; +bool shared_file_has_media_type(const shared_file_t *sf, unsigned m) + G_PURE; + +struct pslist; + +void shared_file_slist_free_null(struct pslist **l_ptr); void share_add_partial(const shared_file_t *sf); void share_remove_partial(const shared_file_t *sf); void share_update_matching_information(void); void shared_files_match(const char *query, - st_search_callback callback, gpointer user_data, - int max_res, gboolean partials, struct query_hashvec *qhv); + st_search_callback callback, void *user_data, + int max_res, uint32 partials, struct query_hashvec *qhv); -size_t share_fill_newest(shared_file_t **sfvec, size_t sfcount, unsigned mask); +size_t share_fill_newest(shared_file_t **sfvec, size_t sfcount, unsigned mask, + bool size_restrict, filesize_t minsize, filesize_t maxsize); unsigned share_filename_media_mask(const char *filename); -static inline gboolean +static inline bool share_can_answer_partials(void) { return GNET_PROPERTY(pfsp_server) && GNET_PROPERTY(query_answer_partials);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/soap.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/soap.c
Changed
@@ -47,7 +47,6 @@ #include "lib/ascii.h" #include "lib/atoms.h" #include "lib/cq.h" -#include "lib/glib-missing.h" #include "lib/halloc.h" #include "lib/header.h" #include "lib/host_addr.h" @@ -56,6 +55,7 @@ #include "lib/ostream.h" #include "lib/parse.h" #include "lib/pmsg.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/unsigned.h" #include "lib/walloc.h" @@ -83,7 +83,7 @@ pmsg_t *mb; /**< Payload data */ soap_reply_cb_t reply_cb; /**< Reply callback */ soap_error_cb_t error_cb; /**< Error callback */ - guint32 options; /**< User-supplied options */ + uint32 options; /**< User-supplied options */ int http_code; /**< HTTP status code */ void *arg; /**< User-supplied callback argument */ unsigned regular:1; /**< Whether we sent a regular POST */ @@ -105,7 +105,6 @@ static const char SOAP_X_ENVELOPE = "Envelope"; static const char SOAP_X_BODY = "Body"; static const char SOAP_X_FAULT = "Fault"; -static const char SOAP_X_PREFIX = "SOAP"; static const char SOAP_X_ENC_STYLE = "encodingStyle"; static const char SOAP_NAMESPACE = @@ -119,7 +118,7 @@ static const char SOAP_TEXT_REPLY = "text/xml"; static const char SOAP_APPLICATION_REPLY = "application/soap+xml"; -static void soap_rpc_launch(cqueue_t *unused_cq, gpointer obj); +static void soap_rpc_launch(cqueue_t *cq, void *obj); /** * Provides human-readable error string out of an error code. @@ -266,7 +265,7 @@ if (GNET_PROPERTY(soap_debug) > 2) { g_debug("SOAP \"%s\" at \"%s\": processing reply (%zu byte%s) HTTP %d", sr->action, sr->url, sr->reply_len, - 1 == sr->reply_len ? "" : "s", sr->http_code); + plural(sr->reply_len), sr->http_code); } /* @@ -414,7 +413,7 @@ * * @return TRUE if we can continue with the request. */ -static gboolean +static bool soap_header_ind(http_async_t *ha, header_t *header, int code, const char *message) { @@ -493,7 +492,7 @@ buf = header_get(header, "Content-Length"); if (buf != NULL) { - guint32 len; + uint32 len; int error; len = parse_uint32(buf, NULL, 10, &error); @@ -677,7 +676,7 @@ if (sr->mandatory) { if (sr->options & SOAP_RPC_O_ALL_CAPS) { - rw = gm_snprintf(buf, len, + rw = str_bprintf(buf, len, "M-%s %s HTTP/1.1\r\n" "HOST: %s\r\n" "USER-AGENT: %s\r\n" @@ -692,7 +691,7 @@ version_string, content_type, size_t_to_string(content_len), fixed_header, SOAP_NAMESPACE, sr->action); } else { - rw = gm_snprintf(buf, len, + rw = str_bprintf(buf, len, "M-%s %s HTTP/1.1\r\n" "Host: %s\r\n" "User-Agent: %s\r\n" @@ -709,7 +708,7 @@ } } else { if (sr->options & SOAP_RPC_O_ALL_CAPS) { - rw = gm_snprintf(buf, len, + rw = str_bprintf(buf, len, "%s %s HTTP/1.1\r\n" "HOST: %s\r\n" "USER-AGENT: %s\r\n" @@ -723,7 +722,7 @@ version_string, content_type, size_t_to_string(content_len), fixed_header, sr->action); } else { - rw = gm_snprintf(buf, len, + rw = str_bprintf(buf, len, "%s %s HTTP/1.1\r\n" "Host: %s\r\n" "User-Agent: %s\r\n" @@ -748,7 +747,7 @@ static void soap_sent_head(const struct http_async *ha, const struct gnutella_socket *s, const char *req, size_t len, - gboolean deferred) + bool deferred) { soap_rpc_t *sr = http_async_get_opaque(ha); @@ -768,7 +767,7 @@ static void soap_sent_data(const struct http_async *ha, const struct gnutella_socket *s, const char *data, size_t len, - gboolean deferred) + bool deferred) { soap_rpc_t *sr = http_async_get_opaque(ha); @@ -792,7 +791,7 @@ soap_rpc_t *sr = http_async_get_opaque(ha); soap_rpc_check(sr); - + if (GNET_PROPERTY(soap_trace) & SOCK_TRACE_IN) { g_debug("----Got SOAP HTTP reply from %s:", host_addr_to_string(s->addr)); @@ -807,15 +806,14 @@ * Delayed RPC start. */ static void -soap_rpc_launch(cqueue_t *unused_cq, gpointer obj) +soap_rpc_launch(cqueue_t *cq, void *obj) { soap_rpc_t *sr = obj; http_post_data_t post; - (void) unused_cq; soap_rpc_check(sr); - sr->delay_ev = NULL; + cq_zero(cq, &sr->delay_ev); if (GNET_PROPERTY(soap_debug) > 4) { g_debug("SOAP \"%s\" at \"%s\": launching (%s)", @@ -892,7 +890,7 @@ * payload too large). In any case, the XML tree is freed. */ soap_rpc_t * -soap_rpc(const char *url, const char *action, size_t maxlen, guint32 options, +soap_rpc(const char *url, const char *action, size_t maxlen, uint32 options, xnode_t *xn, const char *soap_ns, soap_reply_cb_t reply_cb, soap_error_cb_t error_cb, void *arg) { @@ -900,7 +898,7 @@ xnode_t *root, *body; pmsg_t *mb; ostream_t *os; - gboolean failed = FALSE; + bool failed = FALSE; g_assert(url != NULL); g_assert(action != NULL); @@ -976,7 +974,7 @@ * * @return TRUE if we successfully grabbed a local address. */ -gboolean +bool soap_rpc_local_addr(const soap_rpc_t *sr, host_addr_t *addrp) { if (sr->got_local_addr) {
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/soap.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/soap.h
Changed
@@ -96,10 +96,10 @@ void soap_rpc_cancel(soap_rpc_t *sr); soap_rpc_t *soap_rpc(const char *url, const char *action, size_t maxlen, - guint32 options, xnode_t *xn, const char *soap_ns, + uint32 options, xnode_t *xn, const char *soap_ns, soap_reply_cb_t reply_cb, soap_error_cb_t error_cb, void *arg); -gboolean soap_rpc_local_addr(const soap_rpc_t *sr, host_addr_t *addrp); +bool soap_rpc_local_addr(const soap_rpc_t *sr, host_addr_t *addrp); #endif /* _core_soap_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/sockets.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/sockets.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2001-2003, Raphael Manfredi + * Copyright (c) 2001-2003, 2012-2013 Raphael Manfredi * Copyright (c) 2000 Daniel Walker (dwalker@cats.ucsc.edu) * *---------------------------------------------------------------------- @@ -31,7 +31,7 @@ * @author Daniel Walker (dwalker@cats.ucsc.edu) * @date 2000 * @author Raphael Manfredi - * @date 2001-2003 + * @date 2001-2003, 2012-2013 */ #include "common.h" @@ -44,6 +44,7 @@ #endif #include "sockets.h" + #include "ban.h" #include "bsched.h" #include "ctl.h" @@ -70,18 +71,26 @@ #include "if/gnet_property_priv.h" #include "lib/adns.h" +#include "lib/aging.h" #include "lib/ascii.h" +#include "lib/atoms.h" #include "lib/compat_un.h" +#include "lib/cq.h" #include "lib/endian.h" +#include "lib/entropy.h" #include "lib/fd.h" #include "lib/getline.h" -#include "lib/glib-missing.h" +#include "lib/gnet_host.h" #include "lib/halloc.h" #include "lib/header.h" +#include "lib/once.h" +#include "lib/pslist.h" #include "lib/random.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/timestamp.h" #include "lib/tm.h" +#include "lib/unsigned.h" #include "lib/walloc.h" #ifdef HAS_SOCKER_GET @@ -97,9 +106,13 @@ #define SHUT_WR 1 /**< Shutdown TX side */ #endif -#define RQST_LINE_LENGTH 256 /**< Reasonable estimate for request line */ +#define RQST_LINE_LENGTH 256 /**< Reasonable estimate for request line */ #define SOCK_UDP_RECV_BUF 131072 /**< 128K - Large to avoid loosing dgrams */ -#define MAX_UDP_RECV_LOOP 128 /**< Max messages read from UDP queue */ +#define MAX_UDP_AGE 5 /**< Max UDP age before RX dropping */ +#define MAX_UDP_LOOP_MS 37 /**< Amount of CPU time we can spend */ +#define UDP_QUEUED_GUESS 65536 /**< Guess amount of pending RX input */ +#define UDP_QUEUE_DELAY_MS 250 /**< RX queue processing delay */ +#define TLS_BAN_FREQ 300 /**< Avoid TLS for 5 minutes */ enum { SOCK_ADNS_PENDING = 1 << 0, /**< Don't free() the socket too early */ @@ -114,7 +127,33 @@ struct gnutella_socket *s_udp_listen6 = NULL; struct gnutella_socket *s_local_listen = NULL; -static void socket_accept(gpointer data, int, inputevt_cond_t cond); +static aging_table_t *tls_ban; +static once_flag_t tls_ban_inited; + +static bool socket_is_shutdowning; /**< Layer shutdown has started */ +static bool socket_shutdowned; /**< Set when layer has been shutdowned */ + +static void socket_accept(void *data, int, inputevt_cond_t cond); +static bool socket_reconnect(struct gnutella_socket *s); + +static void +tls_ban_init(void) +{ + tls_ban = aging_make(TLS_BAN_FREQ, + gnet_host_hash, gnet_host_equal, gnet_host_free_atom2); +} + +static bool +socket_tls_banned(const host_addr_t addr, const uint16 port) +{ + gnet_host_t to; + + if (NULL == tls_ban) + return FALSE; + + gnet_host_set(&to, addr, port); + return NULL != aging_lookup(tls_ban, &to); +} static struct gnutella_socket * socket_alloc(void) @@ -140,12 +179,19 @@ } } -static void +/** + * Free socket buffer if not already done. + */ +void socket_free_buffer(struct gnutella_socket *s) { socket_buffer_check(s); if (NULL != s->buf) { + if G_UNLIKELY(s->pos != 0) { + s_carp("%s(): buffer still holding %'zu unread byte%s", + G_STRFUNC, s->pos, plural(s->pos)); + } s->buf_size = 0; HFREE_NULL(s->buf); s->pos = 0; @@ -162,6 +208,7 @@ if (s) { socket_check(s); s->magic = 0; + s->wio.magic = 0; WFREE(s); *s_ptr = NULL; } @@ -249,14 +296,14 @@ */ void socket_evt_set(struct gnutella_socket *s, - inputevt_cond_t cond, inputevt_handler_t handler, gpointer data) + inputevt_cond_t cond, inputevt_handler_t handler, void *data) { int fd; socket_check(s); g_assert(handler); g_assert(INPUT_EVENT_EXCEPTION != cond); - g_assert((0 != (INPUT_EVENT_R & cond)) ^ (0 != (INPUT_EVENT_W & cond))); + g_assert(0 != (INPUT_EVENT_RW & cond)); g_assert(0 == s->gdk_tag); fd = socket_evt_fd(s); @@ -266,15 +313,19 @@ s->tls.cb_data = data; if (GNET_PROPERTY(tls_debug) > 4) { - g_debug("socket_evt_set: fd=%d, cond=%s", - fd, inputevt_cond_to_string(cond)); + g_debug("%s(): fd=%d, cond=%s, handler=%s()", + G_STRFUNC, fd, inputevt_cond_to_string(cond), + stacktrace_function_name(handler)); } s->gdk_tag = inputevt_add(fd, cond, handler, data); g_assert(0 != s->gdk_tag); + if ((INPUT_EVENT_R & cond) && s->pos != 0) + inputevt_set_readable(fd); + if (!(INPUT_EVENT_W & cond) && s->wio.flush(&s->wio) < 0) { if (!is_temporary_error(errno)) { - g_warning("socket_evt_set: flush error: %m"); + g_warning("%s(): flush error: %m", G_STRFUNC); } } } @@ -290,8 +341,9 @@ if (s->gdk_tag) { if (GNET_PROPERTY(tls_debug) > 4) { int fd = socket_evt_fd(s); - g_debug("socket_evt_clear: fd=%d, cond=%s", - fd, inputevt_cond_to_string(s->tls.cb_cond)); + g_debug("%s(): fd=%d, cond=%s, handler was %s()", + G_STRFUNC, fd, inputevt_cond_to_string(s->tls.cb_cond), + stacktrace_function_name(s->tls.cb_handler)); } s->tls.cb_cond = 0; @@ -320,11 +372,11 @@ reclaim_fd = callback; } -static GSList *sl_incoming = NULL; /**< To spot inactive sockets */ +static pslist_t *sl_incoming = NULL; /**< To spot inactive sockets */ static void guess_local_addr(const struct gnutella_socket *s); static void socket_destroy(struct gnutella_socket *s, const char *reason); -static void socket_connected(gpointer data, int source, inputevt_cond_t cond); +static void socket_connected(void *data, int source, inputevt_cond_t cond); static void socket_wio_link(struct gnutella_socket *s); /* @@ -335,7 +387,7 @@ * If the user changes /etc/protocols while running gtkg, things may * go badly. */ -static gboolean sol_got = FALSE; +static bool sol_got = FALSE; static int sol_tcp_cached = -1; static int sol_ip_cached = -1; static int sol_ipv6_cached = -1; @@ -474,7 +526,7 @@ void socket_tos_lowdelay(const struct gnutella_socket *s) { - static gboolean failed; + static bool failed; failed = failed || socket_tos(s, iptos_lowdelay); } @@ -488,7 +540,7 @@ void socket_tos_throughput(const struct gnutella_socket *s) { - static gboolean failed; + static bool failed; failed = failed || socket_tos(s, iptos_throughput); } @@ -517,6 +569,68 @@ } /** + * Set lifetime of orphaned FIN_WAIT2 state socket to specified time. + * + * This is probably Linux-specific and is used to quickly discard connections + * when we are shutdowning. + * + * Silently does nothing if TCP_LINGER2 is not available or if the socket + * is not a TCP one. + */ +static void +socket_tcp_linger2(struct gnutella_socket *s, int secs, const char *caller) +{ + socket_check(s); + + if G_UNLIKELY(0 == (s->flags & SOCK_F_TCP)) + return; + +#ifdef TCP_LINGER2 + if (setsockopt(s->file_desc, sol_tcp(), TCP_LINGER2, &secs, sizeof secs)) { + if (ECONNRESET != errno) { + g_warning("%s(): cannot set TCP_LINGER2 to %d sec%s on fd#%d: %m", + caller, secs, plural(secs), s->file_desc); + } + } +#else /* !TCP_LINGER2 */ + (void) secs; + (void) caller; +#endif /* TCP_LINGER2 */ +} + +/** + * Set socket linger time on close() or shutdown() to 0 seconds, so that + * we do not have to wait for the messages to be sent before returning from + * the system call. + */ +static void +socket_no_linger(socket_fd_t fd, const char *caller) +{ + struct linger lb; + + g_assert(is_valid_fd(fd)); + + if (!socket_is_shutdowning && !GNET_PROPERTY(use_so_linger)) + return; + + ZERO(&lb); + lb.l_onoff = 1; + lb.l_linger = 0; /* closes connections with RST */ + + if (setsockopt(fd, SOL_SOCKET, SO_LINGER, &lb, sizeof lb)) { + switch (errno) { + case ENOPROTOOPT: /* On Windows, for SO_LINGER */ + case EOPNOTSUPP: /* POSIX way for op not supported on socket */ + break; + default: + g_warning("%s(): setsockopt(%d, SOL_SOCKET, SO_LINGER) failed: %m", + caller, (int) fd); + break; + } + } +} + +/** * Got an EOF condition on the socket. */ void @@ -539,9 +653,9 @@ } static void -proxy_connect_helper(const host_addr_t *addr, size_t n, gpointer udata) +proxy_connect_helper(const host_addr_t *addr, size_t n, void *udata) { - gboolean *in_progress = udata; + bool *in_progress = udata; g_assert(addr); g_assert(in_progress); @@ -563,7 +677,7 @@ * * @return TRUE if a proxy is configured. */ -static gboolean +static bool proxy_is_enabled(void) { switch ((enum proxy_protocol) GNET_PROPERTY(proxy_protocol)) { @@ -586,14 +700,14 @@ static socket_fd_t proxy_connect(socket_fd_t fd) { - static gboolean in_progress = FALSE; + static bool in_progress = FALSE; socket_addr_t server; socklen_t len; if (!is_host_addr(GNET_PROPERTY(proxy_addr)) && proxy_is_enabled()) { if (!in_progress) { in_progress = TRUE; - g_warning("Resolving proxy name \"%s\"", + g_warning("resolving proxy name \"%s\"", GNET_PROPERTY(proxy_hostname)); adns_resolve(GNET_PROPERTY(proxy_hostname), settings_dns_net(), proxy_connect_helper, &in_progress); @@ -634,16 +748,16 @@ /* Create the request */ { struct { - guint8 version; - guint8 command; - guint8 dstport2; - guint8 dstip4; + uint8 version; + uint8 command; + uint8 dstport2; + uint8 dstip4; /* A null terminated username goes here */ } *req; STATIC_ASSERT(8 == sizeof *req); - req = cast_to_gpointer(s->buf); + req = cast_to_pointer(s->buf); req->version = 4; /* SOCKS 4 */ req->command = 1; /* Connect */ poke_be16(req->dstport, s->port); @@ -664,7 +778,7 @@ length + name_size > s->buf_size ) { /* Such a long username would be insane, no need to malloc(). */ - g_warning("send_socks4(): Username is too long"); + g_warning("%s(): username is too long", G_STRFUNC); return -1; } @@ -677,7 +791,7 @@ ret = s_write(s->file_desc, s->buf, length); if ((size_t) ret != length) { - g_warning("Error attempting to send SOCKS request (%s)", + g_warning("error attempting to send SOCKS request (%s)", ret == (ssize_t) -1 ? strerror(errno) : "Partial write"); return -1; } @@ -689,10 +803,10 @@ recv_socks4(struct gnutella_socket *s) { struct { - guint8 version; - guint8 result; - guint8 ignore12; - guint8 ignore24; + uint8 version; + uint8 result; + uint8 ignore12; + uint8 ignore24; } reply; static const size_t size = sizeof reply; ssize_t ret; @@ -700,13 +814,13 @@ STATIC_ASSERT(8 == sizeof reply); socket_check(s); - ret = s_read(s->file_desc, cast_to_gpointer(&reply), size); + ret = s_read(s->file_desc, cast_to_pointer(&reply), size); if ((ssize_t) -1 == ret) { g_warning("error attempting to receive SOCKS reply: %m"); return ECONNREFUSED; } if ((size_t) ret != size) { - g_warning("Short reply from SOCKS server"); + g_warning("short reply from SOCKS server"); /* Let the application try and see how they go */ return ECONNREFUSED; } @@ -760,22 +874,22 @@ { "CONNECT " }, { NULL }, { " HTTP/1.0\r\nHost: " }, { NULL }, { "\r\n\r\n" }, }; - iovec_t iovG_N_ELEMENTS(parts); + iovec_t iovN_ITEMS(parts); const char *host_port = host_addr_port_to_string(s->addr, s->port); size_t size = 0; - guint i; + uint i; - for (i = 0; i < G_N_ELEMENTS(iov); i++) { + for (i = 0; i < N_ITEMS(iov); i++) { size_t n; - iovec_set_base(&iovi, deconstify_gchar( + iovec_set_base(&iovi, deconstify_char( partsi.s ? partsi.s : host_port)); n = strlen(iovec_base(&iovi)); iovec_set_len(&iovi, n); size += n; } - ret = s_writev(s->file_desc, iov, G_N_ELEMENTS(iov)); + ret = s_writev(s->file_desc, iov, N_ITEMS(iov)); if ((size_t) ret != size) { g_warning("sending info to HTTP proxy failed: %s", ret == (ssize_t) -1 ? g_strerror(errno) : "Partial write"); @@ -809,11 +923,11 @@ } str = getline_str(s->getline); if ((status = http_status_parse(str, NULL, NULL, NULL, NULL)) < 0) { - g_warning("Bad status line"); + g_warning("bad HTTP proxy status line"); return -1; } if ((status / 100) != 2) { - g_warning("Cannot use HTTP proxy: \"%s\"", str); + g_warning("cannot use HTTP proxy: \"%s\"", str); return -1; } s->pos++; @@ -822,7 +936,7 @@ getline_reset(s->getline); switch (getline_read(s->getline, s->buf, ret, &parsed)) { case READ_OVERFLOW: - g_warning("HTTP proxy returned a too long line"); + g_warning("HTTP proxy returned too long a line"); return -1; case READ_DONE: if ((size_t) ret != parsed) @@ -830,8 +944,7 @@ ret -= parsed; if (getline_length(s->getline) == 0) { s->pos++; - getline_free(s->getline); - s->getline = NULL; + getline_free_null(&s->getline); return 0; } break; @@ -851,7 +964,7 @@ getline_reset(s->getline); switch (getline_read(s->getline, s->buf, ret, &parsed)) { case READ_OVERFLOW: - g_warning("HTTP proxy returned a too long line"); + g_warning("HTTP proxy returned too long a line"); return -1; case READ_DONE: if ((size_t) ret != parsed) @@ -859,8 +972,7 @@ ret -= parsed; if (getline_length(s->getline) == 0) { s->pos++; - getline_free(s->getline); - s->getline = NULL; + getline_free_null(&s->getline); return 0; } break; @@ -903,7 +1015,7 @@ addr = s->addr; { - gboolean ok = FALSE; + bool ok = FALSE; switch (host_addr_net(addr)) { case NET_TYPE_IPV4: @@ -945,7 +1057,7 @@ } if ((size_t) ret != size) { - g_warning("Short reply from SOCKS server"); + g_warning("short reply from SOCKS server"); return ECONNREFUSED; } @@ -972,30 +1084,30 @@ name = GNET_PROPERTY(socks_user); if (name == NULL) { - g_warning("No Username to authenticate with."); + g_warning("SOCKS no username to authenticate with"); return ECONNREFUSED; } if (GNET_PROPERTY(socks_pass) == NULL) { - g_warning("No Password to authenticate with."); + g_warning("SOCKS no password to authenticate with"); return ECONNREFUSED; } if (strlen(name) > 255 || strlen(GNET_PROPERTY(socks_pass)) > 255) { - g_warning("Username or password exceeds 255 characters."); + g_warning("SOCKS username or password exceeds 255 characters"); return ECONNREFUSED; } - size = gm_snprintf(s->buf, s->buf_size, "\x01%c%s%c%s", - (guchar) strlen(name), + size = str_bprintf(s->buf, s->buf_size, "\x01%c%s%c%s", + (uchar) strlen(name), name, - (guchar) strlen(GNET_PROPERTY(socks_pass)), + (uchar) strlen(GNET_PROPERTY(socks_pass)), GNET_PROPERTY(socks_pass)); /* Send out the authentication */ ret = s_write(sockid, s->buf, size); if ((size_t) ret != size) { - g_warning("Sending SOCKS authentication failed: %s", + g_warning("sending SOCKS authentication failed: %s", ret == (ssize_t) -1 ? g_strerror(errno) : "Partial write"); return -1; } @@ -1013,7 +1125,7 @@ } if ((size_t) ret != size) { - g_warning("Short reply from SOCKS server"); + g_warning("short reply from SOCKS server"); return ECONNREFUSED; } @@ -1058,7 +1170,7 @@ ret = s_write(sockid, s->buf, size); if ((size_t) ret != size) { - g_warning("Send SOCKS connect command failed: %s", + g_warning("send SOCKS connect command failed: %s", ret == (ssize_t) -1 ? g_strerror(errno) : "Partial write"); return (-1); } @@ -1075,45 +1187,58 @@ return ECONNREFUSED; } if (GNET_PROPERTY(socket_debug)) { - g_debug("connect_socksv5: Step 5, bytes recv'd %zu\n", ret); + g_debug("%s(): step 5, bytes recv'd %zu", G_STRFUNC, ret); } if ((size_t) ret != size) { - g_warning("Short reply from SOCKS server"); + g_warning("short reply from SOCKS server"); return ECONNREFUSED; } /* See the connection succeeded */ if (s->buf1 != '\0') { - g_warning("SOCKS connect failed: "); + const char *msg; + int error; + switch (s->buf1) { case 1: - g_warning("General SOCKS server failure"); - return ECONNABORTED; + msg = "General SOCKS server failure"; + error = ECONNABORTED; + break; case 2: - g_warning("Connection denied by rule"); - return ECONNABORTED; + msg = "Connection denied by rule"; + error = ECONNABORTED; + break; case 3: - g_warning("Network unreachable"); - return ENETUNREACH; + msg = "Network unreachable"; + error = ENETUNREACH; + break; case 4: - g_warning("Host unreachable"); - return EHOSTUNREACH; + msg = "Host unreachable"; + error = EHOSTUNREACH; + break; case 5: - g_warning("Connection refused"); - return ECONNREFUSED; + msg = "Connection refused"; + error = ECONNREFUSED; + break; case 6: - g_warning("TTL Expired"); - return ETIMEDOUT; + msg = "TTL Expired"; + error = ETIMEDOUT; + break; case 7: - g_warning("Command not supported"); - return ECONNABORTED; + msg = "Command not supported"; + error = ECONNABORTED; + break; case 8: - g_warning("Address type not supported"); - return ECONNABORTED; + msg = "Address type not supported"; + error = ECONNABORTED; + break; default: - g_warning("Unknown error"); - return ECONNABORTED; + msg = "Unknown error"; + error = ECONNABORTED; + break; } + g_warning("SOCKS connect failed: %s", msg); + return error; } s->pos++; @@ -1138,7 +1263,7 @@ break; } if (!GNET_PROPERTY(force_local_ip6)) { - GSList *sl_addrs, *sl; + pslist_t *sl_addrs, *sl; host_addr_t addr, old_addr, first_addr; addr = zero_host_addr; @@ -1146,7 +1271,7 @@ old_addr = listen_addr6(); sl_addrs = host_addr_get_interface_addrs(NET_TYPE_IPV6); - for (sl = sl_addrs; NULL != sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(sl_addrs, sl) { host_addr_t *addr_ptr; addr_ptr = sl->data; @@ -1154,7 +1279,7 @@ if (!host_addr_is_routable(addr)) { continue; } - if (host_addr_equal(old_addr, addr)) { + if (host_addr_equiv(old_addr, addr)) { break; } if (!is_host_addr(first_addr)) { @@ -1165,7 +1290,7 @@ if (!is_host_addr(addr)) { addr = first_addr; } - if (!host_addr_equal(old_addr, addr)) { + if (!host_addr_equiv(old_addr, addr)) { gnet_prop_set_ip_val(PROP_LOCAL_IP6, addr); } } @@ -1190,10 +1315,10 @@ void socket_timer(time_t now) { - GSList *l; - GSList *to_remove = NULL; + pslist_t *l; + pslist_t *to_remove = NULL; - for (l = sl_incoming; l; l = g_slist_next(l)) { + PSLIST_FOREACH(sl_incoming, l) { struct gnutella_socket *s = l->data; time_delta_t delta; @@ -1215,15 +1340,15 @@ s->buf, MIN(s->pos, 80)); } - to_remove = g_slist_prepend(to_remove, s); + to_remove = pslist_prepend(to_remove, s); } } - for (l = to_remove; l; l = g_slist_next(l)) { + PSLIST_FOREACH(to_remove, l) { struct gnutella_socket *s = l->data; socket_destroy(s, "Connection timeout"); } - g_slist_free(to_remove); + pslist_free(to_remove); { static time_t last_check; @@ -1239,6 +1364,25 @@ socket_enable_accept(s_local_listen); } +static inline void +socket_disable(struct gnutella_socket *s) +{ + if (s != NULL) + socket_evt_clear(s); +} + +/** + * Tell the socket layer that we are about to shutdown. + * + * This accelerates closing of sockets and tries to avoid too many lingering + * in the TCP FIN_WAIT2 state. + */ +void +socket_shutdowning(void) +{ + socket_is_shutdowning = TRUE; +} + /** * Cleanup data structures on shutdown. */ @@ -1256,18 +1400,83 @@ upnp_unmap_tcp(s_tcp_listen->local_port); if (s_udp_listen != NULL) upnp_unmap_udp(s_udp_listen->local_port); - + /* No longer accept connections or UDP packets */ + socket_disable(s_local_listen); + socket_disable(s_tcp_listen); + socket_disable(s_tcp_listen6); + socket_disable(s_udp_listen); + socket_disable(s_udp_listen6); + + socket_shutdowned = TRUE; +} + +/** + * Cleanup remaining data structures on final close down. + */ +void +socket_closedown(void) +{ socket_free_null(&s_local_listen); socket_free_null(&s_tcp_listen); socket_free_null(&s_tcp_listen6); socket_free_null(&s_udp_listen); socket_free_null(&s_udp_listen6); + + aging_destroy(&tls_ban); } /* ----------------------------------------- */ /** + * Attach operation callbacks to non-UDP socket, superseding its type. + * + * @param s the socket (TCP or LOCAL, not UDP) + * @param type new socket type (for logging mostly) + * @param ops operation callbacks to install + * @param owner socket owner, passed to callback in addition to socket + */ +void +socket_attach_ops(gnutella_socket_t *s, + enum socket_type type, struct socket_ops *ops, void *owner) +{ + socket_check(s); + g_assert(!(s->flags & SOCK_F_UDP)); + g_assert(ops != NULL); + + if (NULL == s->resource.tcp) + WALLOC(s->resource.tcp); + + s->resource.tcp->owner = owner; + s->resource.tcp->ops = ops; + s->type = type; +} + +/** + * Detach operation callbacks from non-UDP socket. + */ +void +socket_detach_ops(gnutella_socket_t *s) +{ + socket_check(s); + g_assert(!(s->flags & SOCK_F_UDP)); + + WFREE_TYPE_NULL(s->resource.tcp); +} + +/** + * Change owner of non-UDP socket. + */ +void +socket_change_owner(gnutella_socket_t *s, void *owner) +{ + socket_check(s); + g_assert(s->resource.tcp != NULL); + + s->resource.tcp->owner = owner; +} + +/** * Destroy a socket. * * If there is an attached resource, call the resource's termination routine @@ -1284,38 +1493,19 @@ */ switch (s->type) { - case SOCK_TYPE_CONTROL: - if (s->resource.node) { - node_remove(s->resource.node, "%s", reason); - return; - } - break; - case SOCK_TYPE_DOWNLOAD: - if (s->resource.download) { - download_queue(s->resource.download, "%s", reason); - return; - } - break; - case SOCK_TYPE_UPLOAD: - if (s->resource.upload) { - upload_remove(s->resource.upload, "%s", reason); - return; - } + case SOCK_TYPE_UDP: break; - case SOCK_TYPE_PPROXY: - if (s->resource.pproxy) { - pproxy_remove(s->resource.pproxy, "%s", reason); - return; - } - break; - case SOCK_TYPE_HTTP: - if (s->resource.handle) { - http_async_error(s->resource.handle, HTTP_ASYNC_IO_ERROR); + default: + /* + * Invoke optional destruction callback installed by the owner of + * the socket, which must then invoke socket_free_null() itself. + */ + + if (s->resource.tcp != NULL && s->resource.tcp->ops->destroy != NULL) { + (*s->resource.tcp->ops->destroy)(s, s->resource.tcp->owner, reason); return; } break; - default: - break; } /* @@ -1326,6 +1516,29 @@ } /** + * Free UDP queued datagram. + */ +static void +socket_udpq_free(struct udpq *uq) +{ + g_assert(uq != NULL); + + WFREE_NULL(uq->buf, uq->len); + WFREE(uq); +} + +/** + * Embedded list callback to free a 'struct udpq' item. + */ +static void +socket_udp_qfree(void *item, void *unused_data) +{ + (void) unused_data; + + socket_udpq_free(item); +} + +/** * Dispose of socket, closing connection, removing input callback, and * reclaiming attached getline buffer. */ @@ -1342,24 +1555,27 @@ bws_sock_connect_timeout(s->type); if (s->flags & SOCK_F_UDP) { - if (s->resource.udp != NULL) { - WFREE_NULL(s->resource.udp->socket_addr, sizeof(socket_addr_t)); + struct udpctx *uctx = s->resource.udp; + if (uctx != NULL) { + WFREE_NULL(uctx->socket_addr, sizeof(socket_addr_t)); + eslist_foreach(&uctx->queue, socket_udp_qfree, NULL); + cq_cancel(&uctx->queue_ev); WFREE(s->resource.udp); } + } else { + WFREE_TYPE_NULL(s->resource.tcp); } + if (s->last_update) { g_assert(sl_incoming); - sl_incoming = g_slist_remove(sl_incoming, s); + sl_incoming = pslist_remove(sl_incoming, s); s->last_update = 0; } if (s->adns & SOCK_ADNS_PENDING) { s->type = SOCK_TYPE_DESTROYING; return; } - if (s->getline) { - getline_free(s->getline); - s->getline = NULL; - } + getline_free_null(&s->getline); if (socket_with_tls(s)) { if (is_valid_fd(s->file_desc) && socket_uses_tls(s)) { @@ -1375,13 +1591,33 @@ socket_evt_clear(s); if (is_valid_fd(s->file_desc)) { + /* + * If we're shutdowning, clear all lingering: at the socket and + * at the TCP level (if supported). + */ + + if G_UNLIKELY(socket_is_shutdowning) { + socket_no_linger(s->file_desc, G_STRFUNC); + socket_tcp_linger2(s, 5, G_STRFUNC); /* 5 secs in FIN_WAIT2 */ + } + socket_cork(s, FALSE); socket_tx_shutdown(s); + + /* + * Socket closing is a source of randomness since the actual file + * descriptor being closed and the closing order between different + * sockets is hard to predict. + */ + + entropy_harvest_single(VARLEN(s->file_desc)); + if (compat_socket_close(s->file_desc)) { - g_warning("socket_free: close(%d) failed: %m", s->file_desc); + g_warning("%s: close(%d) failed: %m", G_STRFUNC, s->file_desc); } s->file_desc = INVALID_SOCKET; } + s->pos = 0; /* Ensure no complain from socket_free_buffer() */ socket_free_buffer(s); socket_dealloc(&s); } @@ -1403,7 +1639,7 @@ * and the same I/O handler will be called again which must call * socket_tls_setup() once more. */ -static gboolean +static bool socket_tls_setup(struct gnutella_socket *s) { if (!s->tls.enabled) @@ -1419,6 +1655,9 @@ if (s->tls.stage < SOCK_TLS_ESTABLISHED) { switch (tls_handshake(s)) { case TLS_HANDSHAKE_ERROR: + if (SOCK_CONN_INCOMING != s->direction) { + tls_cache_remove(s->addr, s->port); + } goto destroy; case TLS_HANDSHAKE_RETRY: errno = VAL_EAGAIN; @@ -1441,6 +1680,156 @@ return -1; } +struct socket_tls_upgrade_ctx { + gnutella_socket_t *s; /* Socket being upgraded */ + notify_fn_t cb; /* Notification routine to call when done */ + void *arg; /* Notification routine argument */ +}; + +/** + * Callout queue callback to asynchronously destroy a socket when the TLS + * upgrade attempt failed. + */ +static void +socket_tls_upgrade_failed_event(cqueue_t *unused_cq, void *udata) +{ + gnutella_socket_t *s = udata; + + (void) unused_cq; + socket_destroy(s, "TLS upgrade failed"); +} + +/** + * Destroy socket upon TLS upgrade failure, possibly asynchronously. + * + * @param s the socket to destroy + * @param caller calling routine, for logging purposes + * @param async whether destruction must happen asynchronously + */ +static void +socket_tls_upgrade_failed(gnutella_socket_t *s, const char *caller, bool async) +{ + if (GNET_PROPERTY(tls_debug)) { + g_debug("%s(): upgrading fd=%d to TLS with %s %s failed: %m", + caller, s->file_desc, + SOCK_CONN_INCOMING == s->direction ? "client" : "server", + host_addr_port_to_string(s->addr, s->port)); + } + + if (async) + cq_main_insert(1, socket_tls_upgrade_failed_event, s); + else + socket_tls_upgrade_failed_event(NULL, s); +} + +/** + * I/O event callback used for TLS upgrades. + */ +static void +socket_tls_upgrade_cond(void *data, int source, inputevt_cond_t cond) +{ + struct socket_tls_upgrade_ctx *stu = data; + struct gnutella_socket *s = stu->s; + + socket_check(s); + (void) source; + + if G_UNLIKELY(socket_shutdowned) { + socket_destroy(s, "Servent shutdown"); + return; + } + + if G_UNLIKELY(cond & INPUT_EVENT_EXCEPTION) { + socket_destroy(s, "Input exception during TLS upgrade"); + return; + } + + if (0 == socket_tls_setup(s)) { + socket_evt_clear(s); + (*stu->cb)(stu->arg); /* Socket must be referred to by "arg" */ + goto cleanup; + } + + if (is_temporary_error(errno)) + return; + + socket_tls_upgrade_failed(s, G_STRFUNC, FALSE); + /* FALL THROUGH */ + +cleanup: + WFREE(stu); +} + +/** + * Request that a connected socket be upgraded to TLS. + * + * Upon success, the nofification callback is invoked, asynchronously. + * Upon failure, the connection is closed and the callback is NOT invoked. + * + * The callaback argument must either refer to the socket, or be the socket. + * + * If the socket is referred-to, then the structure must be properly identified + * as the onwer of the socket via a call to socket_attach_ops(), in order to + * properly be notified should the socket be destroyed because the TLS upgrade + * failed. + * + * It is guaranteed that the callback routine will be triggered asynchronously, + * i.e. will not have happened when we return from this call. Likewise, the + * socket will not be closed synchronously, meaning the resource attached + * to the socket will not be reclaimed when we return. + * + * @param s the socket to upgrade + * @param cb callback to invoke when TLS has handshaked + * @param arg callback argument + */ +void +socket_tls_upgrade(gnutella_socket_t *s, notify_fn_t cb, void *arg) +{ + struct socket_tls_upgrade_ctx *stu; + + socket_check(s); + g_assert(!socket_with_tls(s)); + g_assert(!(s->flags & SOCK_F_UDP)); + + if (GNET_PROPERTY(tls_debug) > 1) { + g_debug("%s(): upgrading fd=%d to TLS with %s %s, then calling %s(%p)", + G_STRFUNC, s->file_desc, + SOCK_CONN_INCOMING == s->direction ? "client" : "server", + host_addr_port_to_string(s->addr, s->port), + stacktrace_function_name(cb), arg); + } + + if (!tls_enabled()) { + errno = EPROTONOSUPPORT; + goto failure; + } + + s->tls.enabled = TRUE; + socket_evt_clear(s); + + /* + * Due to the nature of the TLS handshake, it is not possible + * to terminate the handshaking synchronously! + */ + + if (0 == socket_tls_setup(s)) + g_error("%s(): synchronous TLS upgrade deemed impossible", G_STRFUNC); + + if (!is_temporary_error(errno)) + goto failure; + + WALLOC0(stu); + stu->s = s; + stu->cb = cb; + stu->arg = arg; + + socket_evt_set(s, INPUT_EVENT_RX, socket_tls_upgrade_cond, stu); + return; + +failure: + socket_tls_upgrade_failed(s, G_STRFUNC, TRUE); +} + /** * Used for incoming connections. * @@ -1455,17 +1844,23 @@ * determined. */ static void -socket_read(gpointer data, int source, inputevt_cond_t cond) +socket_read(void *data, int source, inputevt_cond_t cond) { struct gnutella_socket *s = data; size_t count; ssize_t r; size_t parsed; const char *first, *endptr; + hostiles_flags_t hostile; (void) source; - if (cond & INPUT_EVENT_EXCEPTION) { + if G_UNLIKELY(socket_shutdowned) { + socket_destroy(s, "Servent shutdown"); + return; + } + + if G_UNLIKELY(cond & INPUT_EVENT_EXCEPTION) { socket_destroy(s, "Input exception"); return; } @@ -1477,7 +1872,7 @@ */ if (s->direction == SOCK_CONN_INCOMING && (s->flags & SOCK_F_LOCAL)) { - gboolean error; + bool error; if (compat_accept_check(s->file_desc, &error)) { if (error) @@ -1512,15 +1907,15 @@ } if (GNET_PROPERTY(tls_debug) > 2) { - g_debug("socket_read(): c=0x%02x%s", - (unsigned char) c, s->tls.enabled ? " TLS" : ""); + g_debug("%s(): c=0x%02x%s", + G_STRFUNC, (uint8) c, s->tls.enabled ? " TLS" : ""); } } } if (0 != socket_tls_setup(s)) { if (!is_temporary_error(errno)) { - socket_destroy(s, "TLS handshake failed"); + socket_destroy(s, _("TLS handshake failed")); } return; } @@ -1533,8 +1928,8 @@ /* 1 to allow trailing NUL */ if (count < 1) { - g_warning("socket_read(): incoming buffer full, disconnecting from %s", - host_addr_to_string(s->addr)); + g_warning("%s(): incoming buffer full, disconnecting from %s", + G_STRFUNC, host_addr_to_string(s->addr)); dump_hex(stderr, "Leading Data", s->buf, MIN(s->pos, 256)); socket_destroy(s, "Incoming buffer full"); return; @@ -1574,13 +1969,14 @@ switch (getline_read(s->getline, s->buf, s->pos, &parsed)) { case READ_OVERFLOW: - g_warning("socket_read(): first line too long, disconnecting from %s", - host_addr_to_string(s->addr)); + g_warning("%s(): first line too long, disconnecting from %s", + G_STRFUNC, host_addr_to_string(s->addr)); dump_hex(stderr, "Leading Data", getline_str(s->getline), MIN(getline_length(s->getline), 256)); if ( is_strprefix(s->buf, "GET ") || - is_strprefix(s->buf, "HEAD ") + is_strprefix(s->buf, "HEAD ") || + is_strprefix(s->buf, "OPTIONS ") ) { http_send_status(HTTP_UPLOAD, s, 414, FALSE, NULL, 0, "Requested URL Too Large"); @@ -1609,7 +2005,7 @@ */ socket_evt_clear(s); - sl_incoming = g_slist_remove(sl_incoming, s); + sl_incoming = pslist_remove(sl_incoming, s); s->last_update = 0; first = getline_str(s->getline); @@ -1619,7 +2015,8 @@ * Likewise for PARQ download resuming. */ - if (is_strprefix(first, "GIV ")) { + if (is_strprefix(first, "GIV ") || is_strprefix(first, "PUSH ")) { + /* GIV is Gnutella's answer, "PUSH" is G2's answer */ download_push_ack(s); return; } @@ -1633,7 +2030,7 @@ * Check for banning. */ - switch (ban_allow(s->addr)) { + switch (ban_allow(BAN_CAT_SOCKET, s->addr)) { case BAN_OK: /* Connection authorized */ break; case BAN_FORCE: /* Connection refused, no ack */ @@ -1644,9 +2041,10 @@ const char *msg = ban_message(s->addr); if (GNET_PROPERTY(socket_debug)) { - g_debug("rejecting connection from banned %s (%s still): %s", - host_addr_to_string(s->addr), - short_time(ban_delay(s->addr)), msg); + g_debug("%s(): rejecting connection from " + "banned %s (%s still): %s", + G_STRFUNC, host_addr_to_string(s->addr), + short_time_ascii(ban_delay(BAN_CAT_SOCKET, s->addr)), msg); } if (is_strprefix(first, GNUTELLA_HELLO)) { @@ -1655,18 +2053,19 @@ http_extra_desc_t hev; http_extra_callback_set(&hev, http_retry_after_add, - GUINT_TO_POINTER(ban_delay(s->addr))); + GUINT_TO_POINTER(ban_delay(BAN_CAT_SOCKET, s->addr))); http_send_status(HTTP_UPLOAD, s, 503, FALSE, &hev, 1, "%s", msg); } } goto cleanup; case BAN_FIRST: /* Connection refused, negative ack */ + entropy_harvest_single(VARLEN(s->addr)); if (is_strprefix(first, GNUTELLA_HELLO)) send_node_error(s, 550, "Banned for %s", - short_time_ascii(ban_delay(s->addr))); + short_time_ascii(ban_delay(BAN_CAT_SOCKET, s->addr))); else { - int delay = ban_delay(s->addr); + int delay = ban_delay(BAN_CAT_SOCKET, s->addr); http_extra_desc_t hev; http_extra_callback_set(&hev, http_retry_after_add, @@ -1705,23 +2104,34 @@ * get banned silently. */ - if (hostiles_check(s->addr)) { - static const char msg = "Hostile IP address banned"; + hostile = hostiles_check(s->addr); + + if ( + hostiles_flags_are_bad(hostile) || + hostiles_flags_warrant_shunning(hostile) + ) { + static const char banned = "Hostile IP address banned"; + static const char shunned = "Shunned IP address"; + bool bad = hostiles_flags_are_bad(hostile); socket_disable_token(s); if (GNET_PROPERTY(socket_debug)) { const char *string = first; + if (!is_printable_iso8859_string(first)) string = "<non-printable request>"; - g_warning("denying connection from hostile %s: \"%s\"", - host_addr_to_string(s->addr), string); + g_warning("denying connection from hostile %s (%s): \"%s\"", + host_addr_to_string(s->addr), + hostiles_flags_to_string(hostile), string); } - if (is_strprefix(first, GNUTELLA_HELLO)) - send_node_error(s, 550, msg); - else - http_send_status(HTTP_UPLOAD, s, 550, FALSE, NULL, 0, msg); + if (is_strprefix(first, GNUTELLA_HELLO)) { + send_node_error(s, 550, bad ? banned : shunned); + } else { + http_send_status(HTTP_UPLOAD, s, 550, FALSE, NULL, 0, + bad ? banned : shunned); + } goto cleanup; } @@ -1731,7 +2141,7 @@ if (is_strprefix(first, GNUTELLA_HELLO)) { /* Incoming control connection */ - node_add_socket(s, s->addr, s->port, 0); + node_add_socket(s); } else if ( NULL != (endptr = is_strprefix(first, "GET ")) || NULL != (endptr = is_strprefix(first, "HEAD ")) @@ -1750,6 +2160,10 @@ else upload_add(s); } else if ( + NULL != (endptr = is_strprefix(first, "OPTIONS ")) + ) { + upload_add(s); + } else if ( NULL != (endptr = is_strprefix(first, "HELO")) && (is_ascii_space(endptr0) || '\0' == endptr0) ) { @@ -1765,8 +2179,8 @@ unknown: if (GNET_PROPERTY(socket_debug)) { size_t len = getline_length(s->getline); - g_warning("socket_read(): got unknown incoming connection from %s, " - "dropping!", host_addr_to_string(s->addr)); + g_warning("%s(): got unknown incoming connection from %s, dropping!", + G_STRFUNC, host_addr_to_string(s->addr)); if (len > 0) dump_hex(stderr, "First Line", first, MIN(len, 160)); } @@ -1789,20 +2203,16 @@ static void socket_connection_failed(struct gnutella_socket *s, const char *errmsg) { - if (s->type == SOCK_TYPE_DOWNLOAD && s->resource.download != NULL) { - /* - * Socket will be closed by download_fallback_to_push(). - * - * We need to call that routine regardless of whether we are - * firewalled or whether the user denied pushes: that will be - * checked in download_push(), and there is important processing - * that needs to be done by the download layer. - */ - g_assert(s->resource.download->socket == s); - download_fallback_to_push(s->resource.download, FALSE, FALSE); - } else { - socket_destroy(s, errmsg); + if ( + s->resource.tcp != NULL && + s->resource.tcp->ops->connect_failed != NULL + ) { + (*s->resource.tcp->ops->connect_failed)(s, + s->resource.tcp->owner, errmsg); + return; /* Socket destroyed by callback */ } + + socket_destroy(s, errmsg); } /** @@ -1815,7 +2225,7 @@ * So far there are CONTROL, UPLOAD, DOWNLOAD and HTTP handlers. */ static void -socket_connected(gpointer data, int source, inputevt_cond_t cond) +socket_connected(void *data, int source, inputevt_cond_t cond) { /* We are connected to somebody */ @@ -1824,7 +2234,12 @@ socket_check(s); g_assert((socket_fd_t) source == s->file_desc); - if (cond & INPUT_EVENT_EXCEPTION) { /* Error while connecting */ + if G_UNLIKELY(socket_shutdowned) { + socket_destroy(s, "Servent shutdown"); + return; + } + + if G_UNLIKELY(cond & INPUT_EVENT_EXCEPTION) { /* Error while connecting */ bws_sock_connect_failed(s->type); socket_connection_failed(s, _("Connection failed")); return; @@ -1835,7 +2250,22 @@ if (0 != socket_tls_setup(s)) { if (!is_temporary_error(errno)) { - socket_connection_failed(s, "TLS handshake failed"); + if (GNET_PROPERTY(tls_debug)) { + g_debug("%s(): TLS handshake failed when connecting to %s, %s", + G_STRFUNC, host_addr_port_to_string(s->addr, s->port), + GNET_PROPERTY(tls_enforce) ? "aborting" : "retrying"); + } + + /* + * When TLS is not enforced, attempt to reconnect to the same + * server without any TLS support, in case we had incorrectly + * flagged the host as supporting TLS. + * --RAM, 2012-02-20 + */ + + if (GNET_PROPERTY(tls_enforce) || !socket_reconnect(s)) { + socket_connection_failed(s, _("TLS handshake failed")); + } } return; } @@ -1958,53 +2388,17 @@ guess_local_addr(s); - switch (s->type) { - case SOCK_TYPE_CONTROL: - { - struct gnutella_node *n = s->resource.node; - - g_assert(n->socket == s); - node_init_outgoing(n); - } - break; - - case SOCK_TYPE_DOWNLOAD: - { - struct download *d = s->resource.download; - - g_assert(d->socket == s); - download_connected(d); - } - break; - - case SOCK_TYPE_UPLOAD: - { - struct upload *u = s->resource.upload; - - g_assert(u->socket == s); - upload_connect_conf(u); - } - break; - - case SOCK_TYPE_HTTP: - http_async_connected(s->resource.handle); - break; - - case SOCK_TYPE_CONNBACK: - node_connected_back(s); - break; - - case SOCK_TYPE_SHELL: - g_assert_not_reached(); /* FIXME: add code here? */ - break; + /* + * Notify owner about connection success. + */ - default: - g_warning("socket_connected(): Unknown socket type %d !", s->type); - socket_destroy(s, NULL); /* ? */ - break; + if ( + s->resource.tcp != NULL && + s->resource.tcp->ops->connected != NULL + ) { + (*s->resource.tcp->ops->connected)(s, s->resource.tcp->owner); } } - } /** @@ -2013,7 +2407,7 @@ * * @return TRUE on success, FALSE on error with errno set. */ -gboolean +bool socket_local_addr(const struct gnutella_socket *s, host_addr_t *addrptr) { socket_addr_t saddr; @@ -2074,7 +2468,7 @@ * Someone is connecting to us. */ static void -socket_accept(gpointer data, int unused_source, inputevt_cond_t cond) +socket_accept(void *data, int unused_source, inputevt_cond_t cond) { socket_addr_t addr; socklen_t addr_len; @@ -2086,8 +2480,9 @@ socket_check(s); g_assert(s->flags & (SOCK_F_TCP | SOCK_F_LOCAL)); - if (cond & INPUT_EVENT_EXCEPTION) { - g_warning("Input exception on TCP listening socket #%d!", s->file_desc); + if G_UNLIKELY(cond & INPUT_EVENT_EXCEPTION) { + g_warning("%s(): input exception on TCP listening socket #%d!", + G_STRFUNC, s->file_desc); return; /* Ignore it, what else can we do? */ } @@ -2095,8 +2490,8 @@ case SOCK_TYPE_CONTROL: break; default: - g_warning("socket_accept(): Unknown listening socket type %d !", - s->type); + g_warning("%s(): unknown listening socket type %d !", + G_STRFUNC, s->type); socket_destroy(s, NULL); return; } @@ -2136,7 +2531,7 @@ g_warning("had to close a banned fd to accept new connection"); } - fd = get_non_stdio_fd(fd); + fd = fd_get_non_stdio(fd); if (s->flags & SOCK_F_TCP) bws_sock_accepted(SOCK_TYPE_HTTP); /* Do not charge Gnet for that */ @@ -2145,7 +2540,7 @@ * Create a new struct socket for this incoming connection */ - set_close_on_exec(fd); + fd_set_close_on_exec(fd); fd_set_nonblocking(fd); t = socket_alloc(); @@ -2188,8 +2583,8 @@ ctl_limit(t->addr, CTL_S_ANY_TCP | CTL_D_STEALTH) ) { if (GNET_PROPERTY(ctl_debug) > 2) { - g_debug("CTL closing incoming TCP connection from %s %s", - host_addr_port_to_string(t->addr, t->port), + g_debug("%s(): CTL closing incoming TCP connection from %s %s", + G_STRFUNC, host_addr_port_to_string(t->addr, t->port), gip_country_cc(t->addr)); } socket_free_null(&t); @@ -2202,8 +2597,8 @@ t->tls.snarf = 0; if (GNET_PROPERTY(tls_debug) > 2) { - g_debug("Incoming connection from %s", - host_addr_port_to_string(t->addr, t->port)); + g_debug("%s(): incoming connection from %s", + G_STRFUNC, host_addr_port_to_string(t->addr, t->port)); } socket_wio_link(t); @@ -2230,7 +2625,7 @@ * --RAM, 07/09/2001 */ - sl_incoming = g_slist_prepend(sl_incoming, t); + sl_incoming = pslist_prepend(sl_incoming, t); t->last_update = tm_time(); break; @@ -2239,6 +2634,11 @@ break; } + /* Harvest entropy */ + entropy_harvest_many( + VARLEN(t), VARLEN(t->file_desc), VARLEN(t->addr), + VARLEN(t->port), VARLEN(t->local_port), NULL); + inet_got_incoming(t->addr); /* Signal we got an incoming connection */ if (!GNET_PROPERTY(force_local_ip)) guess_local_addr(t); @@ -2255,7 +2655,7 @@ } #endif /* CMSG_FIRSTHDR && CMSG_NXTHDR */ -static inline gboolean +static inline bool socket_udp_extract_dst_addr(const struct msghdr *msg, host_addr_t *dst_addr) #if defined(CMSG_FIRSTHDR) && defined(CMSG_NXTHDR) { @@ -2299,8 +2699,8 @@ #endif /* HAS_IPV6 && IPV6_RECVPKTINFO */ } else { if (GNET_PROPERTY(socket_debug)) - g_debug("socket_udp_extract_dst_addr(): " - "CMSG type=%u, level=%u, len=%u", + g_debug("%s(): CMSG type=%u, level=%u, len=%u", + G_STRFUNC, (unsigned) p->cmsg_type, (unsigned) p->cmsg_level, (unsigned) p->cmsg_len); @@ -2318,16 +2718,94 @@ #endif /* CMSG_FIRSTHDR && CMSG_NXTHDR */ /** - * Someone is sending us a datagram. + * Signal reception of a datagram to the UDP layer. + * Note: for the Gnutella datagram socket this is udp_received(). + */ +static inline void +socket_udp_process(gnutella_socket_t *s, bool truncated) +{ + (*s->resource.udp->data_ind)(s, s->buf, s->pos, truncated); +} + +/** + * Let the application process the queued datagram, then free it. + */ +static inline void +socket_udp_process_queued(gnutella_socket_t *s, struct udpq *uq) +{ + time_delta_t age; + + /* + * The application can query these fields directly to know the origin + * of the UDP datagram. + */ + + s->addr = uq->addr; + s->port = uq->port; + + /* + * The application layer can determine that it is processing an "old" + * UDP datagram by checking for socket_udp_is_old(). + * + * Note: it is critical that upper layers never access s->buf or s->pos + * when receiving a message from a UDP socket but use instead the + * provided data and length values. Indeed, when delivering queued + * data, the s->buf and s->pos fields are meaningless! + */ + + age = delta_time(tm_time(), uq->queued); + gnet_stats_max_general(GNR_UDP_READ_AHEAD_DELAY_MAX, age); + + if (age >= MAX_UDP_AGE) { + gnet_stats_inc_general(GNR_UDP_READ_AHEAD_OLD_SUM); + s->flags |= SOCK_F_OLD; + (*s->resource.udp->data_ind)(s, uq->buf, uq->len, uq->truncated); + s->flags &= ~SOCK_F_OLD; + } else { + (*s->resource.udp->data_ind)(s, uq->buf, uq->len, uq->truncated); + } + + s->resource.udp->queued = + size_saturate_sub(s->resource.udp->queued, uq->len); + + socket_udpq_free(uq); +} + +/** + * Is processed datagram "old" (enqueued more than MAX_UDP_AGE secs ago)? + * + * This call can safely be called on any socket, but of course it will + * always return FALSE when the socket is not UDP. + * + * @return whether the datagram was received more than MAX_UDP_AGE secs ago. + */ +bool +socket_udp_is_old(const gnutella_socket_t *s) +{ + socket_check(s); + + if (!(s->flags & SOCK_F_UDP)) + return FALSE; /* Not an UDP socket */ + + return booleanize(s->flags & SOCK_F_OLD); +} + +/** + * Someone is sending us a datagram. Read it into the socket's buffer. + * + * @param s the socket which receives a datagram + * @param truncation written with whether datagram was truncated + * + * @return -1 on error, the size of the datagram otherwise. */ static ssize_t -socket_udp_accept(struct gnutella_socket *s) +socket_udp_accept(struct gnutella_socket *s, bool *truncation) { socket_addr_t *from_addr; struct sockaddr *from; socklen_t from_len; ssize_t r; - gboolean truncated = FALSE, has_dst_addr = FALSE; + bool truncated = FALSE, has_dst_addr = FALSE; host_addr_t dst_addr; socket_check(s); @@ -2361,11 +2839,10 @@ struct msghdr msg; iovec_t iov; - iovec_set_base(&iov, s->buf); - iovec_set_len(&iov, s->buf_size); + iovec_set(&iov, s->buf, s->buf_size); msg = zero_msg; - msg.msg_name = cast_to_gpointer(from); + msg.msg_name = cast_to_pointer(from); msg.msg_namelen = from_len; msg.msg_iov = &iov; msg.msg_iovlen = 1; @@ -2400,7 +2877,7 @@ } #else /* !HAS_RECVMSG */ r = recvfrom(s->file_desc, s->buf, s->buf_size, 0, - cast_to_gpointer(from), &from_len); + cast_to_pointer(from), &from_len); #endif /* HAS_RECVMSG */ if ((ssize_t) -1 == r) @@ -2425,7 +2902,7 @@ s->port = socket_addr_get_port(from_addr); if (!is_host_addr(s->addr)) { - gnet_stats_count_general(GNR_UDP_BOGUS_SOURCE_IP, 1); + gnet_stats_inc_general(GNR_UDP_BOGUS_SOURCE_IP); bws_udp_count_read(r, FALSE); /* Assume not from DHT */ errno = EINVAL; return (ssize_t) -1; @@ -2443,44 +2920,159 @@ if ( GNET_PROPERTY(socket_debug) > 1 || - !host_addr_equal(last_addr, dst_addr) + !host_addr_equiv(last_addr, dst_addr) ) { last_addr = dst_addr; - if (GNET_PROPERTY(socket_debug)) - g_debug("socket_udp_accept(): dst_addr=%s", - host_addr_to_string(dst_addr)); + if (GNET_PROPERTY(socket_debug)) { + g_debug("%s(): dst_addr=%s", + G_STRFUNC, host_addr_to_string(dst_addr)); + } } } + if (truncated) + gnet_stats_inc_general(GNR_UDP_RX_TRUNCATED); + + *truncation = truncated; + return r; +} + +/** + * Enqueue UDP datagram for deferred processing. + */ +static void +socket_udp_queue(gnutella_socket_t *s, bool truncated) +{ + struct udpctx *uctx; + struct udpq *uq; + + g_assert(s->flags & SOCK_F_UDP); + + uctx = s->resource.udp; + + WALLOC(uq); + uq->buf = wcopy(s->buf, s->pos); + uq->len = s->pos; + uq->queued = tm_time(); + uq->truncated = booleanize(truncated); + uq->addr = s->addr; + uq->port = s->port; + + eslist_append(&uctx->queue, uq); + s->resource.udp->queued = + size_saturate_add(s->resource.udp->queued, uq->len); +} + +static void socket_udp_flush_queue(gnutella_socket_t *s, time_delta_t maxtime); + +/** + * Timer installed to flush the enqueued read-ahead UDP datagrams. + */ +static void +socket_udp_flush_timer(cqueue_t *cq, void *obj) +{ + gnutella_socket_t *s = obj; + struct udpctx *uctx; + + socket_check(s); + g_assert(s->flags & SOCK_F_UDP); + + uctx = s->resource.udp; + cq_zero(cq, &uctx->queue_ev); /* Timer expired */ + /* - * Signal reception of a datagram to the UDP layer. - * - * Note: for the Gnutella datagram socket this is udp_received(). + * If the socket layer has already began shutdown, do not process + * read-ahead datagrams. */ - (*s->resource.udp->data_ind)(s, truncated); - return r; + if (GNET_PROPERTY(socket_debug)) { + g_debug("%s(): %s %'zu queued datagrams on UDP socket port %u", + G_STRFUNC, socket_shutdowned ? "dropping" : "flushing", + eslist_count(&uctx->queue), s->local_port); + } + + if G_UNLIKELY(socket_shutdowned) { + eslist_foreach(&uctx->queue, socket_udp_qfree, NULL); + eslist_clear(&uctx->queue); + } else { + socket_udp_flush_queue(s, 2 * MAX_UDP_LOOP_MS); + } +} + +/** + * Flush the read-ahead UDP datagrams. + * + * @param s the gnutella socket + * @param maxtime maximum processing time allowed (in ms) + */ +static void +socket_udp_flush_queue(gnutella_socket_t *s, time_delta_t maxtime) +{ + struct udpctx *uctx = s->resource.udp; + struct udpq *uq; + unsigned i; + tm_t start, end; + + tm_now_exact(&start); + i = 0; + + while (NULL != (uq = eslist_shift(&uctx->queue))) { + i++; + socket_udp_process_queued(s, uq); /* Process it */ + + tm_now_exact(&end); + if (tm_elapsed_ms(&end, &start) > maxtime) + break; + } + + if (GNET_PROPERTY(socket_debug)) { + tm_now_exact(&end); + g_debug("%s(): processed %'u queued datagrams " + "(%'zu remain) in %'u usecs", + G_STRFUNC, i, eslist_count(&uctx->queue), + (unsigned) tm_elapsed_us(&end, &start)); + } + + /* + * Install processing timer if items remain to be processed since + * we cannot wait for more incoming datagrams to trigger further + * flushing. + */ + + if (0 == eslist_count(&uctx->queue)) { + cq_cancel(&uctx->queue_ev); + } else if (NULL == uctx->queue_ev) { + uctx->queue_ev = cq_main_insert(UDP_QUEUE_DELAY_MS, + socket_udp_flush_timer, s); + } else { + cq_resched(uctx->queue_ev, UDP_QUEUE_DELAY_MS); + } } /** * Someone is sending us a datagram. */ static void -socket_udp_event(gpointer data, int unused_source, inputevt_cond_t cond) +socket_udp_event(void *data, int unused_source, inputevt_cond_t cond) { struct gnutella_socket *s = data; - size_t avail, rd; + size_t avail, rd, qd, qn; + bool guessed, truncated, enqueue; unsigned i; + time_delta_t processing = 0; tm_t start, end; + struct udpctx *uctx; (void) unused_source; + g_assert(s->flags & SOCK_F_UDP); - if (cond & INPUT_EVENT_EXCEPTION) { + if G_UNLIKELY(cond & INPUT_EVENT_EXCEPTION) { int error; socklen_t error_len = sizeof error; getsockopt(s->file_desc, SOL_SOCKET, SO_ERROR, &error, &error_len); + errno = error; g_warning("input exception for UDP listening socket #%d: %m", s->file_desc); return; @@ -2489,84 +3081,147 @@ /* * It might be useful to call socket_udp_accept() several times * as there are often several packets queued. + * + * When the RX queue is full, the kernel will start dropping new + * incoming UDP datagrams, and we want to avoid that because this may + * cause us to lose an important UDP reply, for instance. + * + * Therefore, we allow read-ahead of messages from the UDP queue without + * processing them in an attempt to leave enough room in the RX queue. + * These queued messages are then processed at a later time. + * --RAM, 2012-11-13 */ tm_now_exact(&start); avail = inputevt_data_available(); - avail = (avail != 0) ? avail : 64 * 1024; + guessed = 0 == avail; + avail = guessed ? UDP_QUEUED_GUESS : avail; + uctx = s->resource.udp; + enqueue = 0 != eslist_count(&uctx->queue); i = 0; - rd = 0; - do { + rd = qd = qn = 0; + + for(;;) { ssize_t r; - r = socket_udp_accept(s); + i++; + r = socket_udp_accept(s, &truncated); /* Read datagram */ if ((ssize_t) -1 == r) { /* ECONNRESET is meaningless with UDP but happens on Windows */ if (!is_temporary_error(errno) && errno != ECONNRESET) { - g_warning("ignoring datagram reception error: %m"); + g_warning("%s(): ignoring datagram reception error: %m", + G_STRFUNC); } break; } - i++; + + if G_UNLIKELY(0 == r) { + g_warning("%s(): ignoring empty datagram from %s", + G_STRFUNC, host_addr_port_to_string(s->addr, s->port)); + gnet_stats_inc_general(GNR_UDP_UNPROCESSED_MESSAGE); + goto next; + } + rd += r; - if ((size_t) r >= avail) - break; - avail -= r; + + /* + * If there are pending datagrams in the queue, do not process the + * new datagram but rather enqueue it: we need to process the messages + * in the order they were received. + */ + + if (enqueue) { + socket_udp_queue(s, truncated); /* Enqueue it */ + qd += r; + qn++; + } else { + socket_udp_process(s, truncated); /* Process it */ + } + + avail = size_saturate_sub(avail, r); /* kevent() reports 32 more bytes than there are, maybe * it refers to header or control msg data. */ if (avail <= 32) break; + next: + /* Process one event at a time if configured as such */ if (s->flags & SOCK_F_SINGLE) break; - /* Do not monopolize CPU for too long -- break out after 37 ms */ - tm_now_exact(&end); - if (tm_elapsed_ms(&end, &start) > 37) - break; + if (!enqueue) { + time_delta_t spent; + + /* + * Do not monopolize CPU for too long whilst processing. + * + * However, once our processing quota is expired, start to enqueue + * messages in order to flush the kernel RX queue. + */ - } while (i < MAX_UDP_RECV_LOOP); + tm_now_exact(&end); + spent = tm_elapsed_ms(&end, &start); - if (i > 16 && GNET_PROPERTY(socket_debug)) { + if (spent > MAX_UDP_LOOP_MS) { + processing = spent; /* Time already spent processing */ + enqueue = TRUE; /* Continue reading only */ + } + } + } + + if ((i > 16 || enqueue) && GNET_PROPERTY(socket_debug)) { tm_now_exact(&end); - g_debug("%s() iterated %u times, read %'lu bytes in %'u usecs", - G_STRFUNC, i, (unsigned long) rd, - (unsigned) tm_elapsed_us(&end, &start)); + g_debug("%s(): iterated %'u times, read %'zu bytes " + "(%s%'zu more pending), enqueued %'zu bytes (%'zu datagram%s) " + "in %'u usecs", + G_STRFUNC, i, rd, guessed ? "~" : "", avail, qd, + qn, plural(qn), (unsigned) tm_elapsed_us(&end, &start)); } -} -static inline void -socket_set_linger(int fd) -{ - g_assert(fd >= 0); + /* + * Update statistics. + */ - if (!GNET_PROPERTY(use_so_linger)) - return; + gnet_stats_count_general(GNR_UDP_READ_AHEAD_COUNT_SUM, qn); + gnet_stats_count_general(GNR_UDP_READ_AHEAD_BYTES_SUM, qd); + gnet_stats_max_general(GNR_UDP_READ_AHEAD_BYTES_MAX, uctx->queued); + gnet_stats_max_general(GNR_UDP_READ_AHEAD_COUNT_MAX, + eslist_count(&uctx->queue)); -#ifdef TCP_LINGER2 - { - int timeout = 20; /* timeout in seconds for FIN_WAIT_2 */ + /* + * Harvest entropy. + */ - if (setsockopt(fd, sol_tcp(), TCP_LINGER2, &timeout, sizeof timeout)) - g_warning("setsockopt() for TCP_LINGER2 failed: %m"); - } -#else - { - static const struct linger zero_linger; - struct linger lb; + if (enqueue) + entropy_harvest_many(VARLEN(rd), VARLEN(qd), VARLEN(processing), NULL); + else if (i > 4) + entropy_harvest_small(VARLEN(rd), VARLEN(qd), VARLEN(i), NULL); + else + entropy_harvest_time(); + + /* + * Dequeue some of the queued datagrams, processing them. + */ + + if (0 != eslist_count(&uctx->queue)) { + time_delta_t processtime; + + /* + * Do not monopolize CPU for too long, but we still need to flush + * our backlog, so devote more CPU time to handling the queued + * items than we do when reading with no backlog. + */ + + processtime = (processing >= 2 * MAX_UDP_LOOP_MS) ? 0 : + 2 * MAX_UDP_LOOP_MS - processing; - lb = zero_linger; - lb.l_onoff = 1; - lb.l_linger = 0; /* closes connections with RST */ - if (setsockopt(fd, SOL_SOCKET, SO_LINGER, &lb, sizeof lb)) - g_warning("setsockopt() for SO_LINGER failed: %m"); + socket_udp_flush_queue(s, processtime); } -#endif /* TCP_LINGER */ } static void @@ -2582,7 +3237,7 @@ { int timeout; - timeout = MIN(GNET_PROPERTY(tcp_defer_accept_timeout), (guint) INT_MAX); + timeout = MIN(GNET_PROPERTY(tcp_defer_accept_timeout), (uint) INT_MAX); if ( setsockopt(s->file_desc, sol_tcp(), TCP_DEFER_ACCEPT, &timeout, sizeof timeout) @@ -2618,7 +3273,7 @@ static void socket_set_fastack(struct gnutella_socket *s) { - static const int on = 1; + const int on = 1; socket_check(s); g_return_if_fail(is_valid_fd(s->file_desc)); @@ -2656,23 +3311,90 @@ #endif /* TCP_QUICKACK*/ } -/* - * Sockets creation +/*** + *** Sockets creation + ***/ + +/** + * Set SO_KEEPALIVE on the socket file descriptor. + */ +static void +socket_set_keepalive(socket_fd_t fd, const char *caller) +{ + const int on = 1; + + g_assert(is_valid_fd(fd)); + + if (-1 == setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof on)) { + g_warning("%s(): setsockopt(%d, SOL_SOCKET, SO_KEEPALIVE) failed: %m", + caller, (int) fd); + } +} + +/** + * Make socket file descriptor able to reuse address (and port) when bound. + * + * Set SO_REUSEADDR on the socket file descriptor. + * If SO_REUSEPORT is defined on that system (linux), set it as well. + */ +static void +socket_set_reuseaddr(socket_fd_t fd, const char *caller) +{ + const int on = 1; + + g_assert(is_valid_fd(fd)); + + /* Linux absolutely wants this before bind() unlike BSD */ + if (-1 == setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof on)) { + g_warning("%s(): setsockopt(%d, SOL_SOCKET, SO_REUSEADDR) failed: %m", + caller, (int) fd); + } + + /* On Linux 3.9 and above, SO_REUSEPORT is also required. */ +#ifdef SO_REUSEPORT + if (-1 == setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof on)) { + g_warning("%s(): setsockopt(%d, SOL_SOCKET, SO_REUSEPORT) failed: %m", + caller, (int) fd); + } +#endif /* SO_REUSEPORT */ +} + +/** + * Set IPV6_V6ONLY on the socket file descriptor. */ +static void +socket_set_ipv6only(socket_fd_t fd, const char *caller) +{ + g_assert(is_valid_fd(fd)); + +#if defined(HAS_IPV6) && defined(IPV6_V6ONLY) + const int on = 1; + + if (-1 == setsockopt(fd, sol_ipv6(), IPV6_V6ONLY, &on, sizeof on)) { + g_warning("%s(): setsockopt(%d, SOL_IPV6, IPV6_V6ONLY) failed: %m", + caller, (int) fd); + } +#else /* !HAS_IPV6 || !IPV6_V6ONLY */ + (void) caller; +#endif /* HAS_IPV6 && IPV6_V6ONLY */ +} /** * Verify that connection can be made to an addr. * @return 0 if OK. */ static int -socket_connection_allowed(const host_addr_t addr, enum socket_type type) +socket_connection_allowed( + const host_addr_t addr, enum socket_type type, const char *caller) { unsigned flag = 0; - if (hostiles_check(addr)) { + if (hostiles_is_bad(addr)) { if (GNET_PROPERTY(socket_debug)) { - g_warning("not connecting %s to hostile host %s", - socket_type_to_string(type), host_addr_to_string(addr)); + hostiles_flags_t flags = hostiles_check(addr); + g_warning("%s(): not connecting %s to hostile host %s (%s)", + caller, socket_type_to_string(type), host_addr_to_string(addr), + hostiles_flags_to_string(flags)); } errno = EPERM; return -1; @@ -2687,8 +3409,8 @@ flag = ctl_limit(addr, CTL_D_STEALTH) ? CTL_D_GNUTELLA : 0; break; default: - g_warning("socket_connect_prepare(): unexpected type \"%s\"", - socket_type_to_string(type)); + g_warning("%s(): unexpected type \"%s\"", + caller, socket_type_to_string(type)); flag = CTL_D_OUTGOING; break; } @@ -2713,23 +3435,41 @@ */ static int socket_connect_prepare(struct gnutella_socket *s, - host_addr_t addr, guint16 port, enum socket_type type, guint32 flags) + host_addr_t addr, uint16 port, enum socket_type type, uint32 flags) { - static const int enable = 1; int fd, family; socket_check(s); + /* Harvest entropy */ + entropy_harvest_many( + VARLEN(s), VARLEN(addr), VARLEN(port), VARLEN(type), VARLEN(flags), + NULL); + /* Filter out flags which we cannot accept */ flags &= (SOCK_F_TLS | SOCK_F_FORCE); + /* + * If they want a TLS connection but we're banning this address for TLS, + * abort the connection immediately. + */ + + if ((flags & SOCK_F_TLS) && socket_tls_banned(addr, port)) { + errno = ECONNABORTED; + return -1; + } + if (!(s->flags & SOCK_F_FORCE) && is_host_addr(addr)) { - if (0 != socket_connection_allowed(addr, type)) + if (0 != socket_connection_allowed(addr, type, G_STRFUNC)) return -1; flags |= SOCK_F_PREPARED; } - if (0 == (SOCK_F_TLS & flags) && tls_cache_lookup(addr, port)) { + if ( + 0 == (SOCK_F_TLS & flags) && + tls_cache_lookup(addr, port) && + !socket_tls_banned(addr, port) + ) { flags |= SOCK_F_TLS; } @@ -2786,7 +3526,7 @@ g_warning("had to close a banned fd to prepare new connection"); } - fd = get_non_stdio_fd(fd); + fd = fd_get_non_stdio(fd); s->type = type; s->direction = SOCK_CONN_OUTGOING; @@ -2802,12 +3542,10 @@ socket_wio_link(s); - setsockopt(s->file_desc, SOL_SOCKET, SO_KEEPALIVE, &enable, sizeof enable); - setsockopt(s->file_desc, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof enable); - + socket_set_keepalive(s->file_desc, G_STRFUNC); fd_set_nonblocking(s->file_desc); - set_close_on_exec(s->file_desc); - socket_set_linger(s->file_desc); + fd_set_close_on_exec(s->file_desc); + socket_no_linger(s->file_desc, G_STRFUNC); socket_tos_normal(s); /* @@ -2819,6 +3557,7 @@ case SOCK_TYPE_HTTP: socket_set_fastack(s); socket_set_quickack(s, TRUE); + break; default: socket_set_quickack(s, FALSE); break; @@ -2834,13 +3573,15 @@ * @returns non-zero in case of failure, zero on success. */ static int -socket_connect_finalize(struct gnutella_socket *s, const host_addr_t ha) +socket_connect_finalize(struct gnutella_socket *s, + const host_addr_t ha, bool destroy_on_error) { socket_addr_t addr; socklen_t addr_len; int res; socket_check(s); + g_assert(is_valid_fd(s->file_desc)); /* * Allow forced connections to an hostile host. @@ -2851,7 +3592,7 @@ */ if (!(s->flags & (SOCK_F_FORCE | SOCK_F_PREPARED))) { - if (0 != socket_connection_allowed(ha, s->type)) + if (0 != socket_connection_allowed(ha, s->type, G_STRFUNC)) goto failure; /* Not connecting to hostile host */ } @@ -2907,20 +3648,60 @@ socket_addr_get_const_sockaddr(&addr), addr_len); } - if (-1 == res && EINPROGRESS != errno && !is_temporary_error(errno)) { + /* + * Be careful here, connect() error codes cannot use is_temporary_error() + * since EAGAIN is meaningful: it indicates that the kernel is out of + * local ports to bind our socket endpoint. + * --RAM, 2015-04-04 + */ + + if (-1 == res && EINPROGRESS != errno) { if (proxy_is_enabled() && !is_host_addr(GNET_PROPERTY(proxy_addr))) { - if (!is_temporary_error(errno)) { - g_warning("Proxy isn't properly configured (%s:%u)", + if (errno != EINTR) { + g_warning("SOCKS proxy isn't properly configured (%s:%u)", GNET_PROPERTY(proxy_hostname), GNET_PROPERTY(proxy_port)); } goto failure; /* Check the proxy configuration */ } - g_warning("unable to connect to %s: %m", + g_warning("unable to connect (for %s) to %s: %m", + socket_type_to_string(s->type), host_addr_port_to_string(s->addr, s->port)); + + /* + * On Windows, there is no EAGAIN to indicate local port shortage. + * It seems ENOBUFS is returned instead. + * + * Because I was trying to restore a sane processing on Windows, + * which was returning ENOBUFS on connect(), I called the condition + * "network buffer shortage". But it is actually showing that there + * is no local port available. This explains why the condition is + * called that way, but it should have been "TCP local port shortage". + * + * On UNIX, the error code to trap is EAGAIN. Triggering a "network + * buffer shortage" condition will refrain the application from + * issuing more connection attempts, in the hope that local ports will + * eventually free up. + * + * --RAM, 2015-04-04. + */ + + if G_UNLIKELY(ENOBUFS == errno || EAGAIN == errno) + inet_buf_shortage(); + goto failure; } + /* + * Most of the time, we're going to come here with errno set to EINPROGRESS + * because the connection is asynchronous. If we're lucky enough to have + * received the SYN+ACK back and finished the TCP handshake when we come + * back from connect(), we may very well be connected already. + * + * This trailing code does not depend on the socket being fully connected + * and works either way. + */ + s->local_port = socket_local_port(s); bws_sock_connect(s->type); @@ -2934,8 +3715,8 @@ failure: - if (!(s->adns & SOCK_ADNS_PENDING)) { - socket_destroy(s, _("Connection failed")); + if (destroy_on_error) { + socket_destroy(s, _("Connection locally failed")); } return -1; } @@ -2947,8 +3728,8 @@ * determined by the resource type. */ struct gnutella_socket * -socket_connect(const host_addr_t ha, guint16 port, - enum socket_type type, guint32 flags) +socket_connect(const host_addr_t ha, uint16 port, + enum socket_type type, uint32 flags) { struct gnutella_socket *s; @@ -2959,13 +3740,63 @@ return NULL; } - return 0 != socket_connect_finalize(s, ha) ? NULL : s; + return 0 != socket_connect_finalize(s, ha, TRUE) ? NULL : s; +} + +/** + * Attempt to reconnect to socket, without TLS. + * + * @return TRUE if OK, FALSE on error (with socket not destroyed). + */ +static bool +socket_reconnect(struct gnutella_socket *s) +{ + gnet_host_t to; + + socket_check(s); + g_assert(s->flags & SOCK_F_TCP); + + socket_evt_clear(s); + s_close(s->file_desc); + s->file_desc = INVALID_SOCKET; + s->flags = 0; + if (socket_with_tls(s)) { + tls_free(s); + } + + /* + * Remove host from the TLS cache because if it is present there, then + * socket_connect_prepare() will re-enable SOCK_F_TLS automatically and + * we want to avoid TLS on a reconnection. + * --RAM, 2013-12-04 + */ + + tls_cache_remove(s->addr, s->port); + + /* + * Also ban TLS connections within the next TLS_BAN_FREQ seconds to avoid + * the same host re-advertising TLS support, with the connection failing + * over and over. + * --RAM, 2013-12-08 + */ + + once_flag_run(&tls_ban_inited, tls_ban_init); + + gnet_host_set(&to, s->addr, s->port); + aging_insert(tls_ban, atom_host_get(&to), int_to_pointer(1)); + + if (0 != socket_connect_prepare(s, s->addr, s->port, s->type, SOCK_F_FORCE)) + return FALSE; + + g_soft_assert(!s->tls.enabled); + + return 0 == socket_connect_finalize(s, s->addr, FALSE); } /** * @returns whether bad hostname was reported after a DNS lookup. */ -gboolean +bool socket_bad_hostname(struct gnutella_socket *s) { socket_check(s); @@ -2980,11 +3811,11 @@ */ static void socket_connect_by_name_helper(const host_addr_t *addrs, size_t n, - gpointer user_data) + void *user_data) { struct gnutella_socket *s = user_data; host_addr_t addr; - gboolean can_tls; + bool can_tls; socket_check(s); g_assert(addrs); @@ -2995,9 +3826,12 @@ goto finish; } - addr = addrsrandom_u32() % n; + addr = addrsrandom_value(n - 1); can_tls = 0 != (SOCK_F_TLS & s->flags) || tls_cache_lookup(addr, s->port); + if (can_tls && socket_tls_banned(addr, s->port)) + can_tls = FALSE; + if ( s->net != host_addr_net(addr) || (can_tls && 0 == (SOCK_F_TLS & s->flags)) @@ -3018,8 +3852,9 @@ } } - /* SOCK_ADNS_PENDING is still set to prevent socket_destroy() on error */ - if (socket_connect_finalize(s, addr)) { + /* SOCK_ADNS_PENDING is still set here, will be cleared below */ + + if (socket_connect_finalize(s, addr, FALSE)) { s->adns |= SOCK_ADNS_FAILED; s->adns_msg = "Connection failed"; goto finish; @@ -3037,8 +3872,8 @@ * resolved through async DNS calls. */ struct gnutella_socket * -socket_connect_by_name(const char *host, guint16 port, - enum socket_type type, guint32 flags) +socket_connect_by_name(const char *host, uint16 port, + enum socket_type type, uint32 flags) { struct gnutella_socket *s; host_addr_t ha; @@ -3064,8 +3899,8 @@ } else if (s->adns & SOCK_ADNS_FAILED) { /* socket_connect_by_name_helper() was already invoked! */ if (GNET_PROPERTY(socket_debug) > 0) - g_warning("socket_connect_by_name: " - "adns_resolve() failed in synchronous mode"); + g_warning("%s: adns_resolve() failed in synchronous mode", + G_STRFUNC); socket_destroy(s, s->adns_msg); return NULL; } @@ -3073,6 +3908,20 @@ return s; } +/* + * Under Linux, it is imperative to at least specify SO_REUSEADDR before + * doing a bind() or, should the process die and be restarted, it may not + * be possible to re-bind the new socket, even with SO_REUSEPORT, as long + * as there are remaining connections on the port (including TIME_WAIT and + * FIN_WAIT{1,2} ones). + * --RAM, 2015-10-15 + */ +#ifdef LINUX_SYSTEM +#define SOCKETS_FORCE_REUSE TRUE +#else +#define SOCKETS_FORCE_REUSE FALSE +#endif /* LINUX_SYSTEM */ + /** * Creates a listening socket and binds it to `bind_addr' unless it is * an unspecified address in which case the kernel will pick an address. @@ -3091,12 +3940,13 @@ */ static socket_fd_t socket_create_and_bind(const host_addr_t bind_addr, - const guint16 port, const int type) + const uint16 port, const int type) { - gboolean socket_failed; + bool socket_failed; socket_fd_t fd; int saved_errno, family; int protocol; + bool reuse_addr = FALSE, force_reuse = SOCKETS_FORCE_REUSE; g_assert(SOCK_DGRAM == type || SOCK_STREAM == type); @@ -3115,40 +3965,68 @@ } protocol = (SOCK_DGRAM == type) ? IPPROTO_UDP : IPPROTO_TCP; + +retry: fd = socket(family, type, protocol); if (!is_valid_fd(fd)) { socket_failed = TRUE; saved_errno = errno; } else { - static const int enable = 1; socket_addr_t addr; socklen_t len; - /* Linux absolutely wants this before bind() unlike BSD */ - setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof enable); - -#if defined(HAS_IPV6) && defined(IPV6_V6ONLY) - if ( - host_addr_is_ipv6(bind_addr) && - setsockopt(fd, sol_ipv6(), IPV6_V6ONLY, &enable, sizeof enable) - ) { - g_warning("setsockopt() failed for IPV6_V6ONLY: %m"); - } -#endif /* HAS_IPV6 && IPV6_V6ONLY */ + if (host_addr_is_ipv6(bind_addr)) + socket_set_ipv6only(fd, G_STRFUNC); /* bind() the socket */ + socket_failed = FALSE; len = socket_addr_set(&addr, bind_addr, port); + + if (reuse_addr || force_reuse) + socket_set_reuseaddr(fd, G_STRFUNC); + if (-1 == bind(fd, socket_addr_get_const_sockaddr(&addr), len)) { saved_errno = errno; + if (EADDRINUSE == errno && !reuse_addr) { + g_warning("%s(): port %u already used by %s, attempting reuse", + G_STRFUNC, port, host_addr_to_string(bind_addr)); + socket_set_reuseaddr(fd, G_STRFUNC); + len = socket_addr_set(&addr, bind_addr, port); + if (0 == bind(fd, socket_addr_get_const_sockaddr(&addr), len)) { + saved_errno = 0; + g_message("%s(): reusing port %u on %s", + G_STRFUNC, port, host_addr_to_string(bind_addr)); + goto socket_bound; + } + /* FALL THROUGH on bind error */ + } s_close(fd); fd = INVALID_SOCKET; + + /* + * On Linux, the SO_REUSEADDR flag must be set before the first + * bind(). Settting it afterwards has no effect. Therefore we + * need to close the socket and retry if we were unable to bind() + * with ``reuse_addr'' still being FALSE. + */ + + if (EADDRINUSE == errno && !reuse_addr) { + g_warning("%s(): cannot reuse %s port %u on %s " + "after failed bind(), retrying...", + G_STRFUNC, SOCK_DGRAM == type ? "UDP" : "TCP", + port, host_addr_to_string(bind_addr)); + reuse_addr = TRUE; + goto retry; + } } else { saved_errno = 0; } } +socket_bound: + #if defined(HAS_SOCKER_GET) if (!is_valid_fd(fd) && (EACCES == saved_errno || EPERM == saved_errno)) { char addr_str128; @@ -3168,19 +4046,19 @@ const char *net_str = net_type_to_string(host_addr_net(bind_addr)); if (socket_failed) { - g_warning("unable to create the %s (%s) socket: %m", - type_str, net_str); + g_warning("%s(): unable to create the %s (%s) socket: %m", + G_STRFUNC, type_str, net_str); } else { char bind_addr_strHOST_ADDR_PORT_BUFLEN; host_addr_port_to_string_buf(bind_addr, port, bind_addr_str, sizeof bind_addr_str); - g_warning("unable to bind() the %s (%s) socket to %s: %m", - type_str, net_str, bind_addr_str); + g_warning("%s(): unable to bind() the %s (%s) socket to %s: %m", + G_STRFUNC, type_str, net_str, bind_addr_str); } } else { - fd = get_non_stdio_fd(fd); - set_close_on_exec(fd); + fd = fd_get_non_stdio(fd); + fd_set_close_on_exec(fd); fd_set_nonblocking(fd); } @@ -3190,10 +4068,10 @@ /** * @return TRUE if the socket is a local unix domain socket. */ -gboolean +bool socket_is_local(const struct gnutella_socket *s) { - gboolean is_local, is_tcp, is_udp; + bool is_local, is_tcp, is_udp; socket_check(s); @@ -3209,14 +4087,13 @@ sockaddr_unix_t addr = zero_addr; socklen_t len = sizeof addr; - if (compat_getsockname(s->file_desc, cast_to_gpointer(&addr), &len)) { + if (compat_getsockname(s->file_desc, cast_to_pointer(&addr), &len)) { is_local = FALSE; - g_warning("socket_is_local(): getsockname() failed: %m"); + g_warning("%s(): getsockname() failed: %m", G_STRFUNC); } else if (AF_LOCAL != addr.sun_family) { is_local = FALSE; - g_warning("socket_is_local(): " - "address family mismatch! (expected %u, got %u)", - (guint) AF_LOCAL, (guint) addr.sun_family); + g_warning("%s(): address family mismatch! (expected %u, got %u)", + G_STRFUNC, (uint) AF_LOCAL, (uint) addr.sun_family); } } @@ -3244,7 +4121,7 @@ addr = zero_un; addr.sun_family = AF_LOCAL; if (g_strlcpy(addr.sun_path, pathname, size) >= size) { - g_warning("socket_local_listen(): pathname is too long"); + g_warning("%s(): pathname is too long", G_STRFUNC); return NULL; } } @@ -3254,7 +4131,7 @@ g_warning("socket(PF_LOCAL, SOCK_STREAM, 0) failed: %m"); return NULL; } - fd = get_non_stdio_fd(fd); + fd = fd_get_non_stdio(fd); (void) unlink(pathname); @@ -3264,13 +4141,13 @@ /* umask 177 -> mode 200; write-only for user */ mask = umask(S_IRUSR | S_IXUSR | S_IRWXG | S_IRWXO); - ret = compat_bind(fd, cast_to_gconstpointer(&addr), sizeof addr); + ret = compat_bind(fd, cast_to_constpointer(&addr), sizeof addr); saved_errno = errno; (void) umask(mask); if (0 != ret) { errno = saved_errno; - g_warning("socket_local_listen(): bind() failed: %m"); + g_warning("%s(): bind() failed: %m", G_STRFUNC); compat_socket_close(fd); return NULL; } @@ -3286,7 +4163,7 @@ socket_wio_link(s); /* Link to the I/O functions */ - set_close_on_exec(fd); + fd_set_close_on_exec(fd); fd_set_nonblocking(fd); s->net = NET_TYPE_NONE; @@ -3311,9 +4188,8 @@ * resource of `type'. */ struct gnutella_socket * -socket_tcp_listen(host_addr_t bind_addr, guint16 port) +socket_tcp_listen(host_addr_t bind_addr, uint16 port) { - static const int enable = 1; struct gnutella_socket *s; int fd; @@ -3333,14 +4209,13 @@ socket_wio_link(s); /* Link to the I/O functions */ - setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &enable, sizeof enable); - - socket_set_linger(s->file_desc); + socket_set_keepalive(fd, G_STRFUNC); + socket_no_linger(fd, G_STRFUNC); /* listen() the socket */ if (listen(fd, 5) == -1) { - g_warning("unable to listen() on the socket: %m"); + g_warning("%s(): unable to listen() on the socket: %m", G_STRFUNC); socket_destroy(s, "Unable to listen on socket"); return NULL; } @@ -3355,8 +4230,8 @@ socket_addr_t addr; if (0 != socket_addr_getsockname(&addr, fd)) { - g_warning("unable to get the port of the socket: " - "getsockname() failed: %m"); + g_warning("%s(): unable to get the port of the socket: " + "getsockname() failed: %m", G_STRFUNC); socket_destroy(s, "Can't probe socket for port"); return NULL; } @@ -3373,7 +4248,7 @@ static void socket_enable_recvdstaddr(const struct gnutella_socket *s) { - static const int on = 1; + const int on = 1; int fd; socket_check(s); @@ -3385,8 +4260,8 @@ case NET_TYPE_IPV4: #if defined(IP_RECVDSTADDR) && IP_RECVDSTADDR if (setsockopt(fd, sol_ip(), IP_RECVDSTADDR, &on, sizeof on)) { - g_warning("socket_enable_recvdstaddr(): " - "setsockopt() for IP_RECVDSTADDR failed: %m"); + g_warning("%s(): setsockopt() for IP_RECVDSTADDR failed: %m", + G_STRFUNC); } #endif /* IP_RECVDSTADDR && IP_RECVDSTADDR */ break; @@ -3394,8 +4269,8 @@ case NET_TYPE_IPV6: #if defined(HAS_IPV6) && defined(IPV6_RECVPKTINFO) if (setsockopt(fd, sol_ipv6(), IPV6_RECVPKTINFO, &on, sizeof on)) { - g_warning("socket_enable_recvdstaddr(): " - "setsockopt() for IPV6_RECVPKTINFO failed: %m"); + g_warning("%s(): setsockopt() for IPV6_RECVPKTINFO failed: %m", + G_STRFUNC); } #endif /* HAS_IPV6 && IPV6_RECVPKTINFO */ break; @@ -3411,7 +4286,7 @@ * a time. */ void -socket_set_single(struct gnutella_socket *s, gboolean on) +socket_set_single(struct gnutella_socket *s, bool on) { if (on) { s->flags |= SOCK_F_SINGLE; @@ -3419,7 +4294,7 @@ s->flags &= ~SOCK_F_SINGLE; } } - + /** * Creates a non-blocking listening UDP socket. * @@ -3427,7 +4302,7 @@ * data will be held in s->buf, being s->pos byte-long. */ struct gnutella_socket * -socket_udp_listen(host_addr_t bind_addr, guint16 port, +socket_udp_listen(host_addr_t bind_addr, uint16 port, socket_udp_data_ind_t data_ind) { struct gnutella_socket *s; @@ -3456,11 +4331,19 @@ /* * Allocate the UDP context and register the datagram reception callback. */ - - WALLOC(s->resource.udp); + + WALLOC0(s->resource.udp); s->resource.udp->data_ind = data_ind; /* + * The queue is there to read-ahead datagrams in socket_udp_event() when + * we have to stop processing them: emptying the kernel RX queue is needed + * if we want to avoid losing incoming datagrams. + */ + + eslist_init(&s->resource.udp->queue, offsetof(struct udpq, lnk)); + + /* * Attach the socket information so that we may record the origin * of the datagrams we receive. */ @@ -3504,7 +4387,7 @@ s->flags |= SOCK_F_OMIT_TOKEN; } -gboolean +bool socket_omit_token(struct gnutella_socket *s) { socket_check(s); @@ -3519,7 +4402,7 @@ * it's about 1500 bytes. */ void -socket_cork(struct gnutella_socket *s, gboolean on) +socket_cork(struct gnutella_socket *s, bool on) #if defined(TCP_CORK) || defined(TCP_NOPUSH) { static const int option = @@ -3550,7 +4433,7 @@ } #else { - static gboolean warned = FALSE; + static bool warned = FALSE; socket_check(s); (void) on; @@ -3573,7 +4456,7 @@ */ static unsigned socket_set_intern(int fd, int option, unsigned size, - const char *type, gboolean shrink) + const char *type, bool shrink) { unsigned old_len = 0; unsigned new_len = 0; @@ -3595,15 +4478,15 @@ if (!shrink && old_len >= size) { if (GNET_PROPERTY(socket_debug) > 5) - g_debug( - "socket %s buffer on fd #%d NOT shrank to %u bytes (is %u)", - type, fd, size, old_len); + g_debug("%s(): socket %s buffer on fd #%d NOT shrunk " + "to %u bytes (is %u)", + G_STRFUNC, type, fd, size, old_len); return old_len; } if (-1 == setsockopt(fd, SOL_SOCKET, option, &size, sizeof(size))) - g_warning("cannot set new %s buffer length to %u on fd #%d: %m", - type, size, fd); + g_warning("%s(): cannot set new %s buffer length to %u on fd #%d: %m", + G_STRFUNC, type, size, fd); len = sizeof(new_len); if (-1 == getsockopt(fd, SOL_SOCKET, option, &new_len, &len)) @@ -3614,8 +4497,8 @@ #endif if (GNET_PROPERTY(socket_debug) > 5) - g_debug("socket %s buffer on fd #%d: %u -> %u bytes (now %u) %s", - type, fd, old_len, size, new_len, + g_debug("%s(): socket %s buffer on fd #%d: %u -> %u bytes (now %u) %s", + G_STRFUNC, type, fd, old_len, size, new_len, (new_len == size) ? "OK" : "FAILED"); return (new_len == size) ? new_len : old_len; @@ -3626,7 +4509,7 @@ * If `shrink' is false, refuse to shrink the buffer if its size is larger. */ void -socket_send_buf(struct gnutella_socket *s, int size, gboolean shrink) +socket_send_buf(struct gnutella_socket *s, int size, bool shrink) { socket_check(s); g_return_if_fail(!(s->flags & SOCK_F_SHUTDOWN)); @@ -3639,7 +4522,7 @@ * If `shrink' is false, refuse to shrink the buffer if its size is larger. */ void -socket_recv_buf(struct gnutella_socket *s, int size, gboolean shrink) +socket_recv_buf(struct gnutella_socket *s, int size, bool shrink) { socket_check(s); g_return_if_fail(!(s->flags & SOCK_F_SHUTDOWN)); @@ -3651,7 +4534,7 @@ * Turn TCP_NODELAY on or off on the socket. */ void -socket_nodelay(struct gnutella_socket *s, gboolean on) +socket_nodelay(struct gnutella_socket *s, bool on) { int arg = on ? 1 : 0; @@ -3668,9 +4551,13 @@ return; if (setsockopt(s->file_desc, sol_tcp(), TCP_NODELAY, &arg, sizeof arg)) { - if (errno != ECONNRESET) + if ( + errno != ECONNRESET && + errno != EINVAL /* Socket has been shutdown on DARWIN */ + ) { g_warning("unable to %s TCP_NODELAY on fd#%d: %m", on ? "set" : "clear", s->file_desc); + } } else { s->flags &= ~SOCK_F_NODELAY; s->flags |= on ? SOCK_F_NODELAY : 0; @@ -3709,7 +4596,7 @@ socket_get_fd(struct wrap_io *wio) { struct gnutella_socket *s = wio->ctx; - socket_check(s); + socket_check(s); /* Ensures socket not freed */ return s->file_desc; } @@ -3717,6 +4604,7 @@ socket_get_bufsize(struct wrap_io *wio, enum socket_buftype type) { struct gnutella_socket *s = wio->ctx; + socket_check(s); switch (type) { @@ -3728,7 +4616,7 @@ } static ssize_t -socket_plain_write(struct wrap_io *wio, gconstpointer buf, size_t size) +socket_plain_write(struct wrap_io *wio, const void *buf, size_t size) { struct gnutella_socket *s = wio->ctx; @@ -3739,7 +4627,7 @@ } static ssize_t -socket_plain_read(struct wrap_io *wio, gpointer buf, size_t size) +socket_plain_read(struct wrap_io *wio, void *buf, size_t size) { struct gnutella_socket *s = wio->ctx; @@ -3773,7 +4661,7 @@ static ssize_t socket_plain_sendto( - struct wrap_io *wio, const gnet_host_t *to, gconstpointer buf, size_t size) + struct wrap_io *wio, const gnet_host_t *to, const void *buf, size_t size) { struct gnutella_socket *s = wio->ctx; socklen_t len; @@ -3785,6 +4673,11 @@ g_assert(!socket_uses_tls(s)); if (!host_addr_convert(gnet_host_get_addr(to), &ha, s->net)) { + if (GNET_PROPERTY(udp_debug)) { + g_carp("%s(): cannot convert %s to %s", + G_STRFUNC, host_addr_to_string(gnet_host_get_addr(to)), + net_type_to_string(s->net)); + } errno = EINVAL; return -1; } @@ -3803,7 +4696,7 @@ static ssize_t socket_no_sendto(struct wrap_io *unused_wio, const gnet_host_t *unused_to, - gconstpointer unused_buf, size_t unused_size) + const void *unused_buf, size_t unused_size) { (void) unused_wio; (void) unused_to; @@ -3815,7 +4708,7 @@ static ssize_t socket_no_write(struct wrap_io *unused_wio, - gconstpointer unused_buf, size_t unused_size) + const void *unused_buf, size_t unused_size) { (void) unused_wio; (void) unused_buf; @@ -3836,8 +4729,7 @@ } static ssize_t -socket_no_read(struct wrap_io *unused_wio, - gpointer unused_buf, size_t unused_size) +socket_no_read(struct wrap_io *unused_wio, void *unused_buf, size_t unused_size) { (void) unused_wio; (void) unused_buf; @@ -3870,6 +4762,7 @@ socket_check(s); g_assert(s->flags & (SOCK_F_LOCAL | SOCK_F_TCP | SOCK_F_UDP)); + s->wio.magic = WRAP_IO_MAGIC; s->wio.ctx = s; s->wio.fd = socket_get_fd; s->wio.flush = socket_no_flush; @@ -3916,6 +4809,8 @@ int siovcnt = MAX_IOV_COUNT; int iovgot = 0; + wrap_io_check(wio); + for (siov = iov; siov < end; siov += siovcnt) { ssize_t r; size_t size; @@ -4015,6 +4910,8 @@ int iovsent = 0; size_t sent = 0; + wrap_io_check(wio); + for (siov = iov; siov < end; siov += siovcnt) { const iovec_t *xiv, *xend; size_t size;
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/sockets.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/sockets.h
Changed
@@ -45,6 +45,7 @@ #include "if/core/sockets.h" #include "lib/inputevt.h" +#include "lib/eslist.h" enum socket_tls_stage { SOCK_TLS_NONE = 0, @@ -54,17 +55,18 @@ struct socket_tls_ctx { tls_context_t ctx; - gboolean enabled; + bool enabled; enum socket_tls_stage stage; size_t snarf; /**< Pending bytes if write failed temporarily. */ - + inputevt_cond_t cb_cond; inputevt_handler_t cb_handler; - gpointer cb_data; + void * cb_data; }; struct sockaddr; struct udpctx; +struct tcpctx; /* * Connection directions. @@ -82,11 +84,11 @@ } socket_magic_t; -struct gnutella_socket { +typedef struct gnutella_socket { socket_magic_t magic; /**< magic for consistency checks */ socket_fd_t file_desc; /**< file descriptor */ - guint32 flags; /**< operating flags */ - guint gdk_tag; /**< gdk tag */ + uint32 flags; /**< operating flags */ + uint gdk_tag; /**< gdk tag */ enum socket_direction direction; enum socket_type type; @@ -96,9 +98,9 @@ const char *adns_msg; /**< ADNS error message */ host_addr_t addr; /**< IP of our partner */ - guint16 port; /**< Port of our partner */ + uint16 port; /**< Port of our partner */ - guint16 local_port; /**< Port on our side */ + uint16 local_port; /**< Port on our side */ time_t last_update; /**< Timestamp of last activity on socket */ @@ -107,13 +109,8 @@ struct socket_tls_ctx tls; union { - struct gnutella_node *node; - struct download *download; - struct upload *upload; - struct pproxy *pproxy; - struct cproxy *cproxy; - struct udpctx *udp; - gpointer handle; + struct tcpctx *tcp; /**< TCP-specific additional context */ + struct udpctx *udp; /**< UDP-specific additional context */ } resource; struct getline *getline; /**< Line reader object */ @@ -124,18 +121,50 @@ unsigned so_rcvbuf; /**< Configured RX buffer size, 0 if unknown */ unsigned so_sndbuf; /**< Configured TX buffer size, 0 if unknown */ -}; +} gnutella_socket_t; /** * The UDP data indication callback. * * @param s the receiving socket - * @param truncated whether received data was truncated + * @param data start of received data (not necessarily s->buf) + * @param len length of received data (not necessarily s->pos) + * @param truncated whether received datagram was truncated * * Data is held in s->buf and is s->pos byte-long. */ -typedef void (*socket_udp_data_ind_t)( - struct gnutella_socket *s, gboolean truncated); +typedef void (*socket_udp_data_ind_t)(const gnutella_socket_t *s, + const void *data, size_t len, bool truncated); + +/** + * TCP socket callback operations. + */ +struct socket_ops { + void (*connect_failed)(gnutella_socket_t *s, void *owner, const char *err); + void (*connected)(gnutella_socket_t *s, void *owner); + void (*destroy)(gnutella_socket_t *s, void *owner, const char *reason); +}; + +/** + * TCP socket context. + */ +struct tcpctx { + void *owner; /**< Owner of the socket */ + struct socket_ops *ops; /**< Operational callbacks */ +}; + +/** + * UDP socket queued datagrams. + */ +struct udpq { + host_addr_t addr; /**< Host sending us the datagram */ + slink_t lnk; /**< Embedded list link */ + void *buf; /**< Buffer holding data */ + size_t len; /**< Length of data */ + time_t queued; /**< Time at which we read the datagram */ + uint16 port; /**< Remote UDP sender port */ + uint8 truncated; /**< Whether data was truncated */ +}; /** * UDP socket context. @@ -143,6 +172,9 @@ struct udpctx { void *socket_addr; /**< To get reception address */ socket_udp_data_ind_t data_ind; /**< Callback on datagram reception */ + struct cevent *queue_ev; /**< Queue processing event */ + eslist_t queue; /**< Queued items (read-ahead) */ + size_t queued; /**< Amount of bytes queued */ }; static inline void @@ -172,24 +204,23 @@ extern struct gnutella_socket *s_udp_listen6; extern struct gnutella_socket *s_local_listen; - /** * Accessors. */ -static inline gboolean +static inline bool socket_with_tls(const struct gnutella_socket *s) { return s->tls.enabled && s->tls.stage >= SOCK_TLS_INITIALIZED; } -static inline gboolean +static inline bool socket_uses_tls(const struct gnutella_socket *s) { return s->tls.enabled && s->tls.stage == SOCK_TLS_ESTABLISHED; } -static inline gboolean +static inline bool socket_is_corked(const struct gnutella_socket *s) { return 0 != (SOCK_F_CORKED & s->flags); @@ -199,13 +230,13 @@ * This verifies whether UDP support is enabled and if the UDP socket * has been initialized. */ -static inline gboolean +static inline bool udp_active(void) { return NULL != s_udp_listen || NULL != s_udp_listen6; } -static inline guint16 +static inline uint16 socket_listen_port(void) { if (s_tcp_listen) @@ -223,41 +254,52 @@ void socket_register_fd_reclaimer(reclaim_fd_t callback); void socket_eof(struct gnutella_socket *s); void socket_connection_reset(struct gnutella_socket *s); +void socket_free_buffer(struct gnutella_socket *s); void socket_free_null(struct gnutella_socket **s_ptr); -struct gnutella_socket *socket_connect(const host_addr_t, guint16, - enum socket_type, guint32 flags); +struct gnutella_socket *socket_connect(const host_addr_t, uint16, + enum socket_type, uint32 flags); struct gnutella_socket *socket_connect_by_name( - const char *host, guint16, enum socket_type, guint32 flags); -struct gnutella_socket *socket_tcp_listen(const host_addr_t, guint16); -struct gnutella_socket *socket_udp_listen(const host_addr_t, guint16, + const char *host, uint16, enum socket_type, uint32 flags); +struct gnutella_socket *socket_tcp_listen(const host_addr_t, uint16); +struct gnutella_socket *socket_udp_listen(const host_addr_t, uint16, socket_udp_data_ind_t data_ind); struct gnutella_socket *socket_local_listen(const char *pathname); -void socket_set_single(struct gnutella_socket *s, gboolean on); +void socket_set_single(struct gnutella_socket *s, bool on); + +void socket_attach_ops(gnutella_socket_t *s, + enum socket_type, struct socket_ops *ops, void *owner); +void socket_detach_ops(gnutella_socket_t *s); +void socket_change_owner(gnutella_socket_t *s, void *owner); void socket_evt_set(struct gnutella_socket *s, - inputevt_cond_t cond, inputevt_handler_t handler, gpointer data); + inputevt_cond_t cond, inputevt_handler_t handler, void *data); void socket_evt_clear(struct gnutella_socket *s); -void socket_cork(struct gnutella_socket *s, gboolean on); -void socket_send_buf(struct gnutella_socket *s, int size, gboolean shrink); -void socket_recv_buf(struct gnutella_socket *s, int size, gboolean shrink); -void socket_nodelay(struct gnutella_socket *s, gboolean on); +void socket_cork(struct gnutella_socket *s, bool on); +void socket_send_buf(struct gnutella_socket *s, int size, bool shrink); +void socket_recv_buf(struct gnutella_socket *s, int size, bool shrink); +void socket_nodelay(struct gnutella_socket *s, bool on); void socket_tx_shutdown(struct gnutella_socket *s); void socket_tos_default(const struct gnutella_socket *s); void socket_tos_throughput(const struct gnutella_socket *s); void socket_tos_lowdelay(const struct gnutella_socket *s); void socket_tos_normal(const struct gnutella_socket *s); void socket_set_quickack(struct gnutella_socket *s, int val); -gboolean socket_bad_hostname(struct gnutella_socket *s); +bool socket_bad_hostname(struct gnutella_socket *s); void socket_disable_token(struct gnutella_socket *s); -gboolean socket_omit_token(struct gnutella_socket *s); +bool socket_omit_token(struct gnutella_socket *s); void socket_set_bind_address(const host_addr_t addr); int socket_evt_fd(struct gnutella_socket *s); -gboolean socket_is_local(const struct gnutella_socket *s); -gboolean socket_local_addr(const struct gnutella_socket *s, host_addr_t *ap); +bool socket_is_local(const struct gnutella_socket *s); +bool socket_local_addr(const struct gnutella_socket *s, host_addr_t *ap); +bool socket_udp_is_old(const struct gnutella_socket *s); + +void socket_tls_upgrade(struct gnutella_socket *s, notify_fn_t cb, void *arg); void socket_timer(time_t now); +void socket_shutdowning(void); void socket_shutdown(void); +void socket_closedown(void); ssize_t safe_readv(wrap_io_t *wio, iovec_t *iov, int iovcnt); ssize_t safe_readv_fd(int fd, iovec_t *iov, int iovcnt);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/spam.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/spam.c
Changed
@@ -43,18 +43,20 @@ #include "settings.h" #include "nodes.h" -#include "lib/halloc.h" #include "lib/atoms.h" #include "lib/bit_array.h" #include "lib/file.h" #include "lib/getdate.h" #include "lib/halloc.h" -#include "lib/glib-missing.h" +#include "lib/halloc.h" #include "lib/parse.h" #include "lib/path.h" +#include "lib/pslist.h" +#include "lib/str.h" +#include "lib/tokenizer.h" +#include "lib/utf8.h" #include "lib/walloc.h" #include "lib/watcher.h" -#include "lib/utf8.h" #include "if/gnet_property.h" #include "if/gnet_property_priv.h" @@ -112,7 +114,7 @@ /****** END IDEAS ONLY ******/ struct spam_lut { - GSList *sl_names; /* List of g_malloc()ed regex_t items */ + pslist_t *sl_names; /* List of struct namesize_item */ }; static struct spam_lut spam_lut; @@ -128,13 +130,10 @@ NUM_SPAM_TAGS } spam_tag_t; -static const struct spam_tag { - spam_tag_t tag; - const char *str; -} spam_tag_map = { +static const tokenizer_t spam_tags = { /* Must be sorted alphabetically for dichotomic search */ -#define SPAM_TAG(x) { CAT2(SPAM_TAG_,x), #x } +#define SPAM_TAG(x) { #x, CAT2(SPAM_TAG_,x) } SPAM_TAG(ADDED), SPAM_TAG(END), SPAM_TAG(NAME), @@ -145,25 +144,10 @@ #undef SPAM_TAG }; - -static spam_tag_t +static inline spam_tag_t spam_string_to_tag(const char *s) { - STATIC_ASSERT(G_N_ELEMENTS(spam_tag_map) == NUM_SPAM_TAGS - 1U); - -#define GET_ITEM(i) (spam_tag_map(i).str) -#define FOUND(i) G_STMT_START { \ - return spam_tag_map(i).tag; \ - /* NOTREACHED */ \ -} G_STMT_END - - /* Perform a binary search to find ``s'' */ - BINARY_SEARCH(const char *, s, G_N_ELEMENTS(spam_tag_map), strcmp, - GET_ITEM, FOUND); - -#undef FOUND -#undef GET_ITEM - return SPAM_TAG_UNKNOWN; + return TOKENIZE(s, spam_tags); } struct namesize_item { @@ -172,7 +156,7 @@ filesize_t max_size; }; -static gboolean +static bool spam_add_name_and_size(const char *name, filesize_t min_size, filesize_t max_size) { @@ -188,14 +172,14 @@ char buf1024; regerror(error, &item->pattern, buf, sizeof buf); - g_warning("spam_add_name_and_size(): regcomp() failed: %s", buf); + g_warning("%s(): regcomp() failed: %s", G_STRFUNC, buf); regfree(&item->pattern); WFREE(item); return TRUE; } else { item->min_size = min_size; item->max_size = max_size; - spam_lut.sl_names = g_slist_prepend(spam_lut.sl_names, item); + spam_lut.sl_names = pslist_prepend(spam_lut.sl_names, item); return FALSE; } } @@ -205,8 +189,8 @@ char *name; filesize_t min_size; filesize_t max_size; - gboolean done; - gboolean damaged; + bool done; + bool damaged; }; /** @@ -221,15 +205,15 @@ * * @returns the amount of entries loaded or -1 on failure. */ -static G_GNUC_COLD gulong +static ulong G_COLD spam_load(FILE *f) { static const struct spam_item zero_item; struct spam_item item; char line1024; - guint line_no = 0; + uint line_no = 0; bit_array_t tag_usedBIT_ARRAY_SIZE(NUM_SPAM_TAGS); - gulong item_count = 0; + ulong item_count = 0; g_assert(f); @@ -277,19 +261,19 @@ G_STRFUNC, tag_name, line_no); continue; } - + switch (tag) { case SPAM_TAG_ADDED: { time_t t; - + t = date2time(value, tm_time()); if ((time_t) -1 == t) { item.damaged = TRUE; } } break; - + case SPAM_TAG_SHA1: { if (strlen(value) != SHA1_BASE32_SIZE) { @@ -325,9 +309,9 @@ case SPAM_TAG_SIZE: { const char *endptr; - guint64 u; + uint64 u; int error; - + u = parse_uint64(value, &endptr, 10, &error); if (error) { item.damaged = TRUE; @@ -373,7 +357,7 @@ case SPAM_TAG_UNKNOWN: /* Ignore */ break; - + case NUM_SPAM_TAGS: g_assert_not_reached(); break; @@ -393,7 +377,7 @@ spam_add_name_and_size(item.name, item.min_size, item.max_size) ) { - item.damaged = TRUE; + item.damaged = TRUE; } else { item_count++; } @@ -420,11 +404,11 @@ } /** - * Watcher callback, invoked when the file from which we read the spam + * Watcher callback, invoked when the file from which we read the spam * changed. */ static void -spam_changed(const char *filename, gpointer unused_udata) +spam_changed(const char *filename, void *unused_udata) { FILE *f; @@ -433,13 +417,13 @@ f = file_fopen(filename, "r"); if (f) { char buf80; - gulong count; + ulong count; spam_close(); count = spam_load(f); fclose(f); - gm_snprintf(buf, sizeof(buf), "Reloaded %lu spam items.", count); + str_bprintf(buf, sizeof(buf), "Reloaded %lu spam items.", count); gcu_statusbar_message(buf); } } @@ -471,29 +455,17 @@ file_path_t fp4; FILE *f; int idx; - char *tmp; - unsigned length = 0; + unsigned length; - file_path_set(&fplength++, settings_config_dir(), spam_text_file); - file_path_set(&fplength++, PRIVLIB_EXP, spam_text_file); + length = settings_file_path_load(fp, spam_text_file, SFP_DFLT); -#ifndef OFFICIAL_BUILD - file_path_set(&fplength++, PACKAGE_EXTRA_SOURCE_DIR, spam_text_file); -#endif /* !OFFICIAL_BUILD */ - - tmp = get_folder_path(PRIVLIB_PATH, NULL); - if (tmp != NULL) - file_path_set(&fplength++, tmp, spam_text_file); - - g_assert(length <= G_N_ELEMENTS(fp)); + g_assert(length <= N_ITEMS(fp)); f = file_config_open_read_norename_chosen(spam_what, fp, length, &idx); if (f != NULL) { spam_retrieve_from_file(f, fpidx.dir, fpidx.name); fclose(f); } - - HFREE_NULL(tmp); } /** @@ -502,6 +474,8 @@ void spam_init(void) { + TOKENIZE_CHECK_SORTED(spam_tags); + spam_sha1_init(); spam_retrieve(); } @@ -512,16 +486,16 @@ void spam_close(void) { - GSList *sl; + pslist_t *sl; - for (sl = spam_lut.sl_names; NULL != sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(spam_lut.sl_names, sl) { struct namesize_item *item = sl->data; g_assert(item); regfree(&item->pattern); WFREE(item); } - gm_slist_free_null(&spam_lut.sl_names); + pslist_free_null(&spam_lut.sl_names); spam_sha1_close(); } @@ -531,14 +505,14 @@ * @param filename the filename to check. * @returns TRUE if found, and FALSE if not. */ -gboolean +bool spam_check_filename_size(const char *filename, filesize_t size) { - const GSList *sl; + const pslist_t *sl; g_return_val_if_fail(filename, FALSE); - for (sl = spam_lut.sl_names; NULL != sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(spam_lut.sl_names, sl) { const struct namesize_item *item = sl->data; g_assert(item);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/spam.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/spam.h
Changed
@@ -40,7 +40,7 @@ #include "common.h" #include "spam_sha1.h" -gboolean spam_check_filename_size(const char *filename, filesize_t size); +bool spam_check_filename_size(const char *filename, filesize_t size); void spam_init(void); void spam_close(void);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/spam_sha1.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/spam_sha1.c
Changed
@@ -41,14 +41,16 @@ #include "spam.h" -#include "lib/atoms.h" +#include "settings.h" + #include "lib/ascii.h" +#include "lib/atoms.h" #include "lib/dbmw.h" #include "lib/file.h" -#include "lib/glib-missing.h" #include "lib/halloc.h" #include "lib/path.h" #include "lib/sorted_array.h" +#include "lib/str.h" #include "lib/watcher.h" #include "if/gnet_property.h" @@ -83,7 +85,7 @@ static struct sha1_lut sha1_lut; -static inline G_GNUC_PURE int +static inline G_PURE int sha1_cmp_func(const void *a, const void *b) { return sha1_cmp(a, b); @@ -185,12 +187,12 @@ * * @returns the amount of entries loaded or -1 on failure. */ -static G_GNUC_COLD gulong +static ulong G_COLD spam_sha1_load(FILE *f) { char line1024; - guint line_no = 0; - gulong item_count = 0; + uint line_no = 0; + ulong item_count = 0; g_assert(f); @@ -233,7 +235,7 @@ g_warning("%s(): bad SHA-1 in line %u.", G_STRFUNC, line_no); continue; } - + sha1 = base32_sha1(line); if (NULL == sha1) { g_warning("%s(): could not parse SHA-1 in line %u.", @@ -254,11 +256,11 @@ } /** - * Watcher callback, invoked when the file from which we read the spam + * Watcher callback, invoked when the file from which we read the spam * changed. */ static void -spam_sha1_changed(const char *filename, gpointer unused_udata) +spam_sha1_changed(const char *filename, void *unused_udata) { FILE *f; @@ -267,13 +269,13 @@ f = file_fopen(filename, "r"); if (f) { char buf80; - gulong count; + ulong count; spam_sha1_close(); count = spam_sha1_load(f); fclose(f); - gm_snprintf(buf, sizeof(buf), "Reloaded %lu spam SHA-1 items.", count); + str_bprintf(buf, sizeof(buf), "Reloaded %lu spam SHA-1 items.", count); gcu_statusbar_message(buf); } } @@ -305,29 +307,17 @@ file_path_t fp4; FILE *f; int idx; - char *tmp; - unsigned length = 0; + unsigned length; - file_path_set(&fplength++, settings_config_dir(), spam_sha1_file); - file_path_set(&fplength++, PRIVLIB_EXP, spam_sha1_file); + length = settings_file_path_load(fp, spam_sha1_file, SFP_DFLT); -#ifndef OFFICIAL_BUILD - file_path_set(&fplength++, PACKAGE_EXTRA_SOURCE_DIR, spam_sha1_file); -#endif /* !OFFICIAL_BUILD */ - - tmp = get_folder_path(PRIVLIB_PATH, NULL); - if (tmp != NULL) - file_path_set(&fplength++, tmp, spam_sha1_file); - - g_assert(length <= G_N_ELEMENTS(fp)); + g_assert(length <= N_ITEMS(fp)); f = file_config_open_read_norename_chosen(spam_sha1_what, fp, length, &idx); if (f != NULL) { spam_sha1_retrieve_from_file(f, fpidx.dir, fpidx.name); fclose(f); } - - HFREE_NULL(tmp); } /** @@ -360,7 +350,7 @@ * @param sha1 the SHA-1 to check. * @returns TRUE if found, and FALSE if not. */ -gboolean +bool spam_sha1_check(const struct sha1 *sha1) { g_return_val_if_fail(sha1, FALSE);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/spam_sha1.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/spam_sha1.h
Changed
@@ -38,7 +38,7 @@ struct sha1; -gboolean spam_sha1_check(const struct sha1 *sha1); +bool spam_sha1_check(const struct sha1 *sha1); void spam_sha1_add(const struct sha1 *sha1); void spam_sha1_sync(void); void spam_sha1_init(void);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/special_upload.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/special_upload.h
Changed
@@ -38,18 +38,49 @@ #include "common.h" -typedef void (*special_upload_closed_t)(gpointer arg); -typedef void (*special_upload_writable_t)(gpointer arg); +typedef void (*special_upload_closed_t)(void *arg); +typedef void (*special_upload_writable_t)(void *arg); + +#define SPECIAL_UPLOAD_MAGIC_VAL 0x137b14e0 +#define SPECIAL_UPLOAD_MAGIC_MASK 0xfffffff0 /* Leading 28 bits set */ + +enum special_upload_magic { + SPECIAL_UPLOAD_THEX_MAGIC = SPECIAL_UPLOAD_MAGIC_VAL + 0x1, + SPECIAL_UPLOAD_BROWSE_MAGIC = SPECIAL_UPLOAD_MAGIC_VAL + 0xc, +}; struct special_upload { + enum special_upload_magic magic; struct txdriver *tx; - ssize_t (*read)(struct special_upload *, gpointer dest, size_t size); - ssize_t (*write)(struct special_upload *, gconstpointer data, size_t size); + ssize_t (*read)(struct special_upload *, void *dest, size_t size); + ssize_t (*write)(struct special_upload *, const void *data, size_t size); void (*flush)(struct special_upload *, - special_upload_closed_t cb, gpointer arg); - void (*close)(struct special_upload *, gboolean fully_served); + special_upload_closed_t cb, void *arg); + void (*close)(struct special_upload *, bool fully_served); }; +static inline void +special_upload_check(const struct special_upload * const su) +{ + g_assert(su != NULL); + g_assert(SPECIAL_UPLOAD_MAGIC_VAL == + (su->magic & SPECIAL_UPLOAD_MAGIC_MASK)); +} + +static inline void +special_upload_thex_check(const struct special_upload * const su) +{ + g_assert(su != NULL); + g_assert(SPECIAL_UPLOAD_THEX_MAGIC == su->magic); +} + +static inline void +special_upload_browse_check(const struct special_upload * const su) +{ + g_assert(su != NULL); + g_assert(SPECIAL_UPLOAD_BROWSE_MAGIC == su->magic); +} + #endif /* _core_special_upload_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/sq.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/sq.c
Changed
@@ -51,10 +51,13 @@ #include "search.h" #include "settings.h" +#include "g2/msg.h" + #include "if/gnet_property_priv.h" #include "lib/atoms.h" #include "lib/glib-missing.h" +#include "lib/hset.h" #include "lib/nid.h" #include "lib/pmsg.h" #include "lib/tm.h" @@ -87,13 +90,13 @@ static squeue_t *global_sq = NULL; -static void cap_queue(squeue_t *sq); +static void sq_cap(squeue_t *sq); /** * Free routine for a query message. */ static void -sq_pmsg_free(pmsg_t *mb, gpointer arg) +sq_pmsg_free(pmsg_t *mb, void *arg) { struct smsg_info *smi = arg; @@ -161,7 +164,7 @@ * the mq to which it will be sent to. */ static void -smsg_mutate(smsg_t *sb, struct gnutella_node *n) +smsg_mutate(smsg_t *sb, const gnutella_node_t *n) { struct smsg_info *smi; pmsg_t *omb; @@ -175,6 +178,20 @@ pmsg_free(omb); } +/** + * Extract query text from enqueued message block (for logging purposes). + * + * @param sb the enqueued search message object + * @param n node to which message should be sent (to get the protocol) + */ +static const char * +smsg_query_text(const smsg_t *sb, const gnutella_node_t *n) +{ + return (n != NULL && NODE_TALKS_G2(n)) ? + g2_msg_search_get_text(sb->mb) : + gnutella_msg_search_get_text(pmsg_start(sb->mb)); +} + /*** *** "handle" hash table management. ***/ @@ -182,12 +199,12 @@ /** * Checks whether an entry exists in the search queue for given search handle. */ -static gboolean +static bool sqh_exists(squeue_t *sq, gnet_search_t sh) { g_assert(sq != NULL); - return NULL != g_hash_table_lookup(sq->handles, GUINT_TO_POINTER(sh)); + return hset_contains(sq->handles, uint_to_pointer(sh)); } /** @@ -199,7 +216,7 @@ g_assert(sq != NULL); g_assert(!sqh_exists(sq, sh)); - g_hash_table_insert(sq->handles, GUINT_TO_POINTER(sh), GINT_TO_POINTER(1)); + hset_insert(sq->handles, uint_to_pointer(sh)); } /** @@ -208,19 +225,17 @@ static void sqh_remove(squeue_t *sq, gnet_search_t sh) { - gpointer key; - gpointer value; - gboolean found; + const void *key; + bool found; g_assert(sq != NULL); - found = g_hash_table_lookup_extended(sq->handles, - GUINT_TO_POINTER(sh), &key, &value); + found = hset_contains_extended(sq->handles, uint_to_pointer(sh), &key); g_assert(found); - g_assert((gnet_search_t) GPOINTER_TO_UINT(key) == sh); + g_assert((gnet_search_t) pointer_to_uint(key) == sh); - g_hash_table_remove(sq->handles, GUINT_TO_POINTER(sh)); + hset_remove(sq->handles, key); } /*** @@ -231,7 +246,7 @@ * Create a new search queue. */ squeue_t * -sq_make(struct gnutella_node *node) +sq_make(gnutella_node_t *node) { squeue_t *sq; @@ -252,7 +267,7 @@ sq->n_sent = 0; sq->n_dropped = 0; sq->node = node; - sq->handles = g_hash_table_new(NULL, NULL); + sq->handles = hset_create(HASH_KEY_SELF, 0); return sq; } @@ -263,22 +278,16 @@ void sq_clear(squeue_t *sq) { - GList *l; - g_assert(sq); if (GNET_PROPERTY(sq_debug) > 3) - g_debug("clearing sq node %s (sent=%d, dropped=%d)", - sq->node ? node_addr(sq->node) : "GLOBAL", + g_debug("%s(): clearing sq for %s (sent=%d, dropped=%d)", + G_STRFUNC, sq->node ? node_infostr(sq->node) : "GLOBAL", sq->n_sent, sq->n_dropped); - for (l = sq->searches; l; l = g_list_next(l)) { - smsg_t *sb = l->data; - - smsg_discard(sb); - } + PLIST_FOREACH_CALL(sq->searches, smsg_discard); - gm_list_free_null(&sq->searches); + plist_free_null(&sq->searches); sq->count = 0; } @@ -291,7 +300,7 @@ g_assert(sq); sq_clear(sq); - gm_hash_table_destroy_null(&sq->handles); + hset_free_null(&sq->handles); WFREE(sq); } @@ -316,11 +325,11 @@ sb = smsg_alloc(sh, mb, qhv); sqh_put(sq, sh); - sq->searches = g_list_prepend(sq->searches, sb); + sq->searches = plist_prepend(sq->searches, sb); sq->count++; if (sq->count > GNET_PROPERTY(search_queue_size)) - cap_queue(sq); + sq_cap(sq); } @@ -363,10 +372,10 @@ sq_process(squeue_t *sq, time_t now) { time_delta_t spacing = GNET_PROPERTY(search_queue_spacing); - GList *item; + plist_t *item; smsg_t *sb; - struct gnutella_node *n; - gboolean sent; + gnutella_node_t *n; + bool sent; g_assert(sq->node == NULL || sq->node->outq != NULL); @@ -422,7 +431,7 @@ g_assert(sq->searches); - item = g_list_first(sq->searches); + item = plist_first(sq->searches); sb = item->data; g_assert(sq->count > 0); @@ -432,10 +441,13 @@ if (n == NULL) { g_assert(sb->qhv != NULL); /* Enqueued via sq_global_putq() */ - if (GNET_PROPERTY(sq_debug) > 2) - g_debug("sq GLOBAL, queuing \"%s\" (%u left, %d sent)", - gnutella_msg_search_get_text(pmsg_start(sb->mb)), + /* This is not used by G2 */ + + if (GNET_PROPERTY(sq_debug) > 2) { + g_debug("%s(): GLOBAL sq, queuing \"%s\" (%u left, %d sent)", + G_STRFUNC, gnutella_msg_search_get_text(pmsg_start(sb->mb)), sq->count, sq->n_sent); + } dq_launch_local(sb->shandle, sb->mb, sb->qhv); @@ -447,10 +459,11 @@ g_assert(sb->qhv == NULL); /* Enqueued via sq_putq() */ - if (GNET_PROPERTY(sq_debug) > 2) - g_debug("sq for node %s, queuing \"%s\" (%u left, %d sent)", - node_addr(n), gnutella_msg_search_get_text(pmsg_start(sb->mb)), + if (GNET_PROPERTY(sq_debug) > 2) { + g_debug("%s(): sq for %s, queuing \"%s\" (%u left, %d sent)", + G_STRFUNC, node_infostr(n), smsg_query_text(sb, n), sq->count, sq->n_sent); + } /* * If we're a leaf node, we're doing a leaf-guided dynamic query. @@ -459,31 +472,33 @@ * queries that go out. */ - if (settings_is_leaf()) + if (settings_is_leaf() && !NODE_TALKS_G2(n)) smsg_mutate(sb, n); mq_tcp_putq(n->outq, sb->mb, NULL); } else { - if (GNET_PROPERTY(sq_debug) > 4) - g_debug("sq for node %s, ignored \"%s\" (%u left, %d sent)", - node_addr(n), gnutella_msg_search_get_text(pmsg_start(sb->mb)), + if (GNET_PROPERTY(sq_debug) > 4) { + g_debug("%s(): sq for %s, ignored \"%s\" (%u left, %d sent)", + G_STRFUNC, node_infostr(n), smsg_query_text(sb, n), sq->count, sq->n_sent); - pmsg_free(sb->mb); - if (sb->qhv) - qhvec_free(sb->qhv); + } + sent = FALSE; } + sqh_remove(sq, sb->shandle); + if (sent) { sq->n_sent++; sq->last_sent = now; + smsg_free(sb); + } else { + smsg_discard(sb); } - sqh_remove(sq, sb->shandle); - smsg_free(sb); - sq->searches = g_list_remove_link(sq->searches, item); - g_list_free_1(item); + sq->searches = plist_remove_link(sq->searches, item); + plist_free_1(item); /* * If we ignored the query, retry with the next in the queue. @@ -499,28 +514,33 @@ * search queue based on the search count */ static void -cap_queue(squeue_t *sq) +sq_cap(squeue_t *sq) { - while (sq->count > GNET_PROPERTY(search_queue_size)) { - GList *item = g_list_last(sq->searches); - smsg_t *sb = item->data; + plist_t *last = NULL; - sq->searches = g_list_remove_link(sq->searches, item); + while (sq->count > GNET_PROPERTY(search_queue_size)) { + plist_t *item; + smsg_t *sb; + + item = NULL == last ? plist_last(sq->searches) : last; + sb = item->data; + last = plist_prev(item); + sq->searches = plist_remove_link(sq->searches, item); + plist_free_1(item); g_assert(sq->count > 0); sq->count--; sq->n_dropped++; - if (GNET_PROPERTY(sq_debug) > 4) - g_debug("sq for node %s, dropped \"%s\" (%u left, %d dropped)", - node_addr(sq->node), - gnutella_msg_search_get_text(pmsg_start(sb->mb)), - sq->count, sq->n_dropped); + if (GNET_PROPERTY(sq_debug) > 4) { + g_debug("%s(): sq for %s, dropped \"%s\" (%u left, %d dropped)", + G_STRFUNC, node_infostr(sq->node), + smsg_query_text(sb, sq->node), sq->count, sq->n_dropped); + } sqh_remove(sq, sb->shandle); smsg_discard(sb); - g_list_free_1(item); - } + } } /** @@ -530,29 +550,29 @@ void sq_search_closed(squeue_t *sq, gnet_search_t sh) { - GList *l; - GList *next; + plist_t *l, *next; for (l = sq->searches; l; l = next) { smsg_t *sb = l->data; - next = g_list_next(l); + next = plist_next(l); if (sb->shandle != sh) continue; g_assert(sq->count > 0); sq->count--; - sq->searches = g_list_remove_link(sq->searches, l); + sq->searches = plist_remove_link(sq->searches, l); - if (GNET_PROPERTY(sq_debug) > 4) - g_debug("sq for node %s, dropped \"%s\" on search close (%u left)", - sq->node ? node_addr(sq->node) : "GLOBAL", - gnutella_msg_search_get_text(pmsg_start(sb->mb)), sq->count); + if (GNET_PROPERTY(sq_debug) > 4) { + g_debug("%s(): sq for %s, dropped \"%s\" on search close (%u left)", + G_STRFUNC, sq->node ? node_infostr(sq->node) : "GLOBAL", + smsg_query_text(sb, sq->node), sq->count); + } sqh_remove(sq, sb->shandle); smsg_discard(sb); - g_list_free_1(l); + plist_free_1(l); } g_assert(sq->searches || sq->count == 0);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/sq.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/sq.h
Changed
@@ -39,9 +39,13 @@ #include "common.h" #include "qrp.h" +#include "lib/plist.h" #include "lib/pmsg.h" + #include "if/core/search.h" +struct hset; + /** * A search queue. * @@ -50,13 +54,13 @@ * delay queries to avoid flooding a single connection. */ typedef struct search_queue { - GList *searches; /**< A pointer to the GList */ - GHashTable *handles; /**< Keeps track of search handles in queue */ + plist_t *searches; /**< List of smsg_t objects */ + struct hset *handles; /**< Keeps track of search handles in queue */ struct gnutella_node *node; /**< Node owning this search queue, or NULL */ time_t last_sent; /**< Time last msg was sent */ - guint count; /**< Count of number in queue */ + uint count; /**< Count of number in queue */ /* stats */ - int n_sent; /**< Number of searches sent */ + int n_sent; /**< Number of searches sent */ int n_dropped; /**< Number dropped due to flow control */ } squeue_t;
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/thex_download.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/thex_download.c
Changed
@@ -51,14 +51,15 @@ #include "if/gnet_property_priv.h" -#include "lib/atoms.h" #include "lib/ascii.h" +#include "lib/atoms.h" #include "lib/endian.h" +#include "lib/halloc.h" #include "lib/parse.h" #include "lib/pmsg.h" +#include "lib/pslist.h" #include "lib/stringify.h" #include "lib/tigertree.h" -#include "lib/halloc.h" #include "lib/walloc.h" #include "lib/override.h" /* Must be the last header included */ @@ -67,7 +68,7 @@ #define THEX_DOWNLOAD_MAX_SIZE (260 * 1024) /* 256 KiB + overhead */ struct thex_download { - gpointer owner; /**< Download owning us */ + void *owner; /**< Download owning us */ rxdrv_t *rx; /**< RX stack top */ gnet_host_t host; /**< Host we're browsing, for logging */ char *data; /**< Where payload data is stored */ @@ -80,14 +81,14 @@ size_t num_leaves; /**< number of leaves */ filesize_t filesize; /**< filesize of the described file */ unsigned depth; /**< depth of the hashtree (capped) */ - gboolean finished; + unsigned finished:1; }; /** * Initialize the THEX download context. */ struct thex_download * -thex_download_create(gpointer owner, gnet_host_t *host, +thex_download_create(void *owner, gnet_host_t *host, const struct sha1 *sha1, const struct tth *tth, filesize_t filesize) { static const struct thex_download zero_ctx; @@ -113,11 +114,11 @@ * * @return TRUE if there was an error. */ -static gboolean +static bool thex_download_data_read(struct thex_download *ctx, pmsg_t *mb) { size_t size; - + g_assert(ctx); g_assert((NULL != ctx->data) ^ (0 == ctx->data_size)); g_assert(ctx->pos <= ctx->data_size); @@ -141,12 +142,12 @@ * * @return FALSE if an error occurred. */ -static gboolean +static bool thex_download_data_ind(rxdrv_t *rx, pmsg_t *mb) { struct thex_download *ctx = rx_owner(rx); struct download *d; - gboolean error; + bool error; d = ctx->owner; download_check(d); @@ -173,7 +174,7 @@ } /* XML helper functions */ -static xnode_t * +static xnode_t * find_element_by_name(xnode_t *p, const char *name) { xnode_t *xn; @@ -185,11 +186,11 @@ return NULL; } -static gboolean +static bool verify_element(xnode_t *node, const char *prop, const char *expect) { const char *value; - + value = xnode_prop_get(node, prop); if (NULL == value) { if (GNET_PROPERTY(tigertree_debug)) { @@ -216,7 +217,7 @@ { xnode_t *hashtree = NULL, *node; char *hashtree_id = NULL; - gboolean success = FALSE; + bool success = FALSE; vxml_parser_t *vp; vxml_error_t e; @@ -250,7 +251,7 @@ } goto finish; } - + node = find_element_by_name(hashtree, "file"); if (node) { if (!verify_element(node, "size", filesize_to_string(ctx->filesize))) @@ -276,12 +277,12 @@ } goto finish; } - + node = find_element_by_name(hashtree, "serializedtree"); if (node) { const char *value; int error; - + if (!verify_element(node, "type", THEX_TREE_TYPE)) goto finish; @@ -303,7 +304,7 @@ } goto finish; } - + ctx->depth = parse_uint16(value, NULL, 10, &error); error |= ctx->depth > tt_full_depth(ctx->filesize); if (error) { @@ -329,11 +330,11 @@ return hashtree_id; } -static gboolean +static bool thex_download_handle_hashtree(struct thex_download *ctx, const char *data, size_t size) { - gboolean success = FALSE; + bool success = FALSE; size_t n_nodes, n_leaves, n, start; unsigned good_depth; const struct tth *leaves; @@ -410,7 +411,7 @@ } goto finish; } - + STATIC_ASSERT(TTH_RAW_SIZE == sizeof(struct tth)); leaves = (const struct tth *) &datastart * TTH_RAW_SIZE; @@ -432,14 +433,13 @@ } static void -thex_dump_dime_records(const GSList *records) +thex_dump_dime_records(const pslist_t *records) { - const GSList *iter; + const pslist_t *iter; - for (iter = records; NULL != iter; iter = g_slist_next(iter)) { - const struct dime_record *record; + PSLIST_FOREACH(records, iter) { + const struct dime_record *record = iter->data; - record = iter->data; g_assert(record); dump_hex(stderr, "THEX DIME record type", dime_record_type(record), dime_record_type_length(record)); @@ -449,10 +449,10 @@ } static const struct dime_record * -dime_find_record(const GSList *records, const char *type, const char *id) +dime_find_record(const pslist_t *records, const char *type, const char *id) { size_t type_length, id_length; - const GSList *iter; + const pslist_t *iter; g_return_val_if_fail(type, NULL); @@ -460,13 +460,12 @@ g_return_val_if_fail(type_length > 0, NULL); id_length = id ? strlen(id) : 0; - - for (iter = records; NULL != iter; iter = g_slist_next(iter)) { - const struct dime_record *record; - - record = iter->data; + + PSLIST_FOREACH(records, iter) { + const struct dime_record *record = iter->data; + g_assert(record); - + if (dime_record_type_length(record) != type_length) continue; if (0 != ascii_strncasecmp(dime_record_type(record), type, type_length)) @@ -492,11 +491,11 @@ return NULL; } -gboolean +bool thex_download_finished(struct thex_download *ctx) { - GSList *records; - gboolean success = FALSE; + pslist_t *records; + bool success = FALSE; g_return_val_if_fail(ctx, FALSE); g_return_val_if_fail(!ctx->finished, FALSE); @@ -517,7 +516,7 @@ const char *data; char *hashtree_id; size_t size; - + record = dime_find_record(records, "text/xml", NULL); if (NULL == record) { if (GNET_PROPERTY(tigertree_debug)) { @@ -583,15 +582,15 @@ ***/ static void -thex_rx_given(gpointer o, ssize_t r) +thex_rx_given(void *o, ssize_t r) { struct thex_download *ctx = o; download_data_received(ctx->owner, r); } -static G_GNUC_PRINTF(2, 3) void -thex_rx_error(gpointer o, const char *reason, ...) +static void G_PRINTF(2, 3) +thex_rx_error(void *o, const char *reason, ...) { struct thex_download *ctx = o; va_list args; @@ -602,7 +601,7 @@ } static void -thex_rx_got_eof(gpointer o) +thex_rx_got_eof(void *o) { struct thex_download *ctx = o; @@ -610,7 +609,7 @@ } static void -thex_rx_done(gpointer o) +thex_rx_done(void *o) { struct thex_download *ctx = o; @@ -638,10 +637,10 @@ * * @return TRUE if we may continue with the download. */ -gboolean +bool thex_download_receive(struct thex_download *ctx, filesize_t content_length, - gnet_host_t *host, struct wrap_io *wio, guint32 flags) + gnet_host_t *host, struct wrap_io *wio, uint32 flags) { g_assert(ctx != NULL);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/thex_download.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/thex_download.h
Changed
@@ -54,7 +54,7 @@ struct thex_download; struct wrap_io; -struct thex_download *thex_download_create(gpointer owner, +struct thex_download *thex_download_create(void *owner, struct gnutella_host *host, const struct sha1 *, const struct tth *, @@ -62,13 +62,12 @@ void thex_download_free(struct thex_download **ptr); void thex_download_write(struct thex_download *, char *data, size_t len); -gboolean thex_download_receive(struct thex_download *, +bool thex_download_receive(struct thex_download *, filesize_t content_length, - struct gnutella_host *host, struct wrap_io *wio, - guint32 flags); + struct gnutella_host *host, struct wrap_io *wio, uint32 flags); struct bio_source *thex_download_io_source(struct thex_download *); void thex_download_close(struct thex_download *); -gboolean thex_download_finished(struct thex_download *ctx); +bool thex_download_finished(struct thex_download *ctx); const struct sha1 *thex_download_get_sha1(const struct thex_download *); const struct tth *thex_download_get_tth(const struct thex_download *ctx);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/thex_upload.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/thex_upload.c
Changed
@@ -49,10 +49,11 @@ #include "if/gnet_property.h" #include "if/gnet_property_priv.h" -#include "lib/atoms.h" #include "lib/array.h" +#include "lib/atoms.h" #include "lib/concat.h" #include "lib/gnet_host.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/tigertree.h" #include "lib/walloc.h" @@ -67,16 +68,16 @@ THEX_STATE_XML_SENT, THEX_STATE_TREE, THEX_STATE_TREE_SENT, - + NUM_THEX_STATES }; struct thex_upload { - struct special_upload special_upload; /**< vtable, MUST be first field */ + struct special_upload special; /**< vtable, MUST be first field */ txdrv_t *tx; /**< The transmission stack */ special_upload_closed_t cb; /**< Callback to invoke when TX fully flushed */ - gpointer cb_arg; /**< Callback argument */ + void *cb_arg; /**< Callback argument */ const struct tth *tth; filesize_t filesize; @@ -84,13 +85,14 @@ char *data; size_t size; size_t offset; - + enum thex_state state; }; static struct thex_upload * cast_to_thex_upload(struct special_upload *p) { + special_upload_thex_check(p); return (void *) p; } @@ -101,7 +103,7 @@ const char *data; data = tth->data; - gm_snprintf(buf, sizeof buf, + str_bprintf(buf, sizeof buf, "uuid:%08x-%04x-%04x-%04x-%08x%04x", peek_le32(&data0), peek_le16(&data4), peek_le16(&data6), peek_le16(&data8), peek_le32(&data10), peek_le16(&data14)); @@ -134,7 +136,7 @@ " type=\"" THEX_TREE_TYPE "\"" " uri=\"", thex_upload_uuid(tth), "\"/>\r\n" "</hashtree>\r\n", - (void *) 0); + NULL_PTR); dime = dime_record_alloc(); dime_record_set_data(dime, buf, len); @@ -144,14 +146,14 @@ return size; } -static gboolean +static bool thex_upload_get_xml(struct thex_upload *ctx) { ctx->size = thex_upload_prepare_xml(&ctx->data, ctx->tth, ctx->filesize); return ctx->size > 0 && NULL != ctx->data; } -static size_t +static size_t thex_upload_prepare_tree(char **data_ptr, const struct tth *tth, const struct tth *nodes, size_t n_nodes) { @@ -168,13 +170,13 @@ return size; } -static gboolean +static bool thex_upload_get_tree(struct thex_upload *ctx) { const struct tth *nodes; size_t n_nodes; - nodes = NULL; + nodes = NULL; n_nodes = tth_cache_get_tree(ctx->tth, ctx->filesize, &nodes); g_return_val_if_fail(n_nodes > 0, FALSE); g_return_val_if_fail(nodes, FALSE); @@ -183,7 +185,7 @@ return ctx->size > 0 && NULL != ctx->data; } -static void +static void thex_upload_free_data(struct thex_upload *ctx) { G_FREE_NULL(ctx->data); @@ -233,10 +235,10 @@ * is returned. */ static ssize_t -thex_upload_read(struct special_upload *special_upload, - gpointer const dest, size_t size) +thex_upload_read(struct special_upload *special, + void * const dest, size_t size) { - struct thex_upload *ctx = cast_to_thex_upload(special_upload); + struct thex_upload *ctx = cast_to_thex_upload(special); char *p = dest; g_assert(ctx); @@ -285,16 +287,16 @@ } } break; - + case THEX_STATE_TREE_SENT: size = 0; - break; + break; case NUM_THEX_STATES: g_assert_not_reached(); } } - return p - cast_to_gchar_ptr(dest); + return p - cast_to_char_ptr(dest); error: errno = EIO; @@ -305,10 +307,9 @@ * Write data to the TX stack. */ static ssize_t -thex_upload_write(struct special_upload *special_upload, - gconstpointer data, size_t size) +thex_upload_write(struct special_upload *special, const void *data, size_t size) { - struct thex_upload *ctx = cast_to_thex_upload(special_upload); + struct thex_upload *ctx = cast_to_thex_upload(special); g_assert(ctx->tx); @@ -319,11 +320,12 @@ * Callback invoked when the TX stack is fully flushed. */ static void -thex_upload_tx_flushed(txdrv_t *unused_tx, gpointer arg) +thex_upload_tx_flushed(txdrv_t *unused_tx, void *arg) { struct thex_upload *ctx = cast_to_thex_upload(arg); (void) unused_tx; + special_upload_thex_check(arg); /* * Bounce them to the callback they registered. @@ -336,10 +338,10 @@ * Flush the TX stack, invoking callback when it's done. */ static void -thex_upload_flush(struct special_upload *special_upload, - special_upload_closed_t cb, gpointer arg) +thex_upload_flush(struct special_upload *special, + special_upload_closed_t cb, void *arg) { - struct thex_upload *ctx = cast_to_thex_upload(special_upload); + struct thex_upload *ctx = cast_to_thex_upload(special); g_assert(ctx->tx); @@ -360,9 +362,9 @@ * @return An initialized THEX upload context. */ static void -thex_upload_close(struct special_upload *special_upload, gboolean fully_served) +thex_upload_close(struct special_upload *special, bool fully_served) { - struct thex_upload *ctx = cast_to_thex_upload(special_upload); + struct thex_upload *ctx = cast_to_thex_upload(special); g_assert(ctx); @@ -373,10 +375,11 @@ if (fully_served) { gnet_prop_incr_guint32(PROP_THEX_FILES_SERVED); } - + tx_free(ctx->tx); thex_upload_free_data(ctx); atom_tth_free_null(&ctx->tth); + ctx->special.magic = 0; WFREE(ctx); } @@ -395,7 +398,7 @@ */ struct special_upload * thex_upload_open( - gpointer owner, + void *owner, const struct gnutella_host *host, const shared_file_t *sf, special_upload_writable_t writable, @@ -406,10 +409,11 @@ struct thex_upload *ctx; WALLOC(ctx); - ctx->special_upload.read = thex_upload_read; - ctx->special_upload.write = thex_upload_write; - ctx->special_upload.flush = thex_upload_flush; - ctx->special_upload.close = thex_upload_close; + ctx->special.magic = SPECIAL_UPLOAD_THEX_MAGIC; + ctx->special.read = thex_upload_read; + ctx->special.write = thex_upload_write; + ctx->special.flush = thex_upload_flush; + ctx->special.close = thex_upload_close; ctx->tth = atom_tth_get(shared_file_tth(sf)); ctx->filesize = shared_file_size(sf); @@ -449,7 +453,7 @@ */ gnet_prop_incr_guint32(PROP_THEX_FILES_REQUESTED); - return &ctx->special_upload; + return &ctx->special; } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/thex_upload.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/thex_upload.h
Changed
@@ -55,7 +55,7 @@ size_t thex_upload_get_content_length(const struct shared_file *sf); struct special_upload *thex_upload_open( - gpointer owner, + void *owner, const struct gnutella_host *host, const struct shared_file *sf, special_upload_writable_t writable,
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/tls_common.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/tls_common.c
Changed
@@ -1,5 +1,6 @@ /* - * Copyright (c) 2006, Christian Biere + * Copyright (c) 2015 Raphael Manfredi + * Copyright (c) 2006 Christian Biere * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -32,6 +33,7 @@ #ifdef HAS_GNUTLS #include <gnutls/gnutls.h> +#include <gnutls/crypto.h> #include <gnutls/x509.h> #ifdef GNUTLS_VERSION_MAJOR @@ -50,20 +52,38 @@ #include <gnutls/abstract.h> #endif +#if HAS_TLS(2, 12) && !defined(MINGW32) +/* Unfortunately, there is no support on Windows at the gnutls level */ +#define USE_TLS_PUSHV +#elif HAS_TLS(3, 3) +/* Works fine in Windows starting with 3.3 (and maybe earlier?) */ +#define USE_TLS_PUSHV +#endif + #include "tls_common.h" + #include "features.h" #include "sockets.h" #include "if/gnet_property_priv.h" #include "if/core/settings.h" +#include "lib/aje.h" #include "lib/array.h" #include "lib/concat.h" +#include "lib/endian.h" #include "lib/fd.h" #include "lib/file.h" +#include "lib/glog.h" #include "lib/halloc.h" #include "lib/header.h" +#include "lib/htable.h" +#include "lib/iovec.h" +#include "lib/misc.h" /* For strchomp() */ #include "lib/path.h" +#include "lib/product.h" +#include "lib/random.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/walloc.h" @@ -71,19 +91,387 @@ #ifdef HAS_GNUTLS -#define USE_TLS_CUSTOM_IO -#define TLS_DH_BITS 768 +static const char tls_keyfile = "key.pem"; +static const char tls_certfile = "cert.pem"; + +#define TLS_DH_BITS 768 +#define TLS_FILE_MAXSIZE (64 * 1024) struct tls_context { - gnutls_session session; - gnutls_anon_server_credentials server_cred; - gnutls_anon_client_credentials client_cred; + gnutls_session_t session; + union { + gnutls_anon_server_credentials_t server; + gnutls_anon_client_credentials_t client; + } cred; const struct gnutella_socket *s; }; -static gnutls_certificate_credentials cert_cred; +static gnutls_certificate_credentials_t cert_cred; +static bool cert_cred_loaded; + +/** + * Table mapping a gnutls_session_t (a pointer to a data structure) into + * the corresponding gnutella_socket_t structure. This is required for + * gnutls callbacks that provide only a session. + */ +static htable_t *tls_sessions; + +/** + * Fill ``len'' random byte starting at ``data''. + * + * @attention + * This supersedes the version from the gnutls library! + * + * @param level the random level GNUTLS_RND_NONCE, etc... + * @param data where to write the random data + * @param len amount of random data to generate + * + * @return 0 if OK + */ +int +gnutls_rnd(gnutls_rnd_level_t level, void *data, size_t len) +{ + /* + * The GNUTLS_RND_KEY is the strongest level for TLS: if the random + * generator is broken, many TLS sessions become insecure. + * + * The GNUTLS_RND_RANDOM is a medium level, which compromises + * the current session if broken. + * + * The GNUTLS_RND_NONCE is for non-predictable random numbers, which + * must resist statistical analysis. If broken, parts of the TLS + * session are compromised. + */ + + if (GNUTLS_RND_KEY == level) + random_key_bytes(data, len); + else if (GNUTLS_RND_NONCE == level) + random_bytes_with(aje_rand, data, len); + else + random_strong_bytes(data, len); + + if (GNET_PROPERTY(tls_debug) > 9) { + g_debug("%s(): generated %zu %s byte%s", + G_STRFUNC, len, + GNUTLS_RND_KEY == level ? "key" : + GNUTLS_RND_NONCE == level ? "nonce" : + GNUTLS_RND_RANDOM == level ? "random" : "unknown", + plural(len)); + } + + return 0; +} + +/** + * Generate an X.509 private key in PEM format. + * + * @param file the path to the file where key needs to be stored. + */ +static void +tls_generate_private_key(const char *file) +{ + gnutls_x509_privkey_t key = NULL; + size_t len; + uint bits; + void *data = NULL; + int e, fd = -1; + const char *fn; + const int key_type = GNUTLS_PK_RSA; + const int mode = S_IRUSR; /* 0400 */ + +#define TRY(function) (fn = (#function)), e = function + + if (TRY(gnutls_x509_privkey_init)(&key)) + goto failed; + +#if HAS_TLS(2, 12) + bits = gnutls_sec_param_to_pk_bits(key_type, GNUTLS_SEC_PARAM_HIGH); +#else + bits = 3248; /* output with 2.12 for the above call */ +#endif + + g_info("TLS generating %d-bit %s private key...", + bits, gnutls_pk_algorithm_get_name(key_type)); + + if (TRY(gnutls_x509_privkey_generate)(key, key_type, bits, 0)) + goto failed; + + g_info("TLS saving %d-bit key into %s", bits, file); + + fd = file_create(file, O_WRONLY, mode); + if (-1 == fd) + goto done; + + len = bits; /* Result should be shorter than that */ + data = halloc(len); + if (TRY(gnutls_x509_privkey_export)(key, GNUTLS_X509_FMT_PEM, data, &len)) + goto failed; + + if (-1 == write(fd, data, len)) { + g_warning("%s(): write() failed: %m", G_STRFUNC); + goto error; + } + + fd_close(&fd); + goto done; + +failed: + g_warning("%s(): %s() failed: %s", G_STRFUNC, fn, gnutls_strerror(e)); + /* FALL THROUGH */ +error: + fd_close(&fd); /* On Windows, needs to close before unlink() */ + (void) unlink(file); + /* FALL THROUGH */ +done: + gnutls_x509_privkey_deinit(key); + HFREE_NULL(data); + +#undef TRY +} + +/** + * Log message. + */ +static void +tls_logfmt(GLogLevelFlags level, const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + gl_logv(G_LOG_DOMAIN, level, fmt, args); + va_end(args); +} + +/** + * Log TLS certificate. + */ +static void +tls_cert_log(const char *fmt, + gnutls_x509_crt_t cert, gnutls_certificate_print_formats_t format) +{ + gnutls_datum_t out; + int e; + + e = gnutls_x509_crt_print(cert, format, &out); + if (e) { + str_t *s = str_new(80); + + str_printf(s, "error printing X.509 certificate: %s", + gnutls_strerror(e)); + tls_logfmt(G_LOG_LEVEL_WARNING, fmt, str_2c(s)); + str_destroy_null(&s); + } else { + tls_logfmt(G_LOG_LEVEL_INFO, fmt, out.data); + gnutls_free(out.data); + } +} + +/** + * Get file data into a halloc()'ed buffer. + */ +static gnutls_datum_t +tls_read_filedata(const char *file) +{ + int fd = -1; + filestat_t buf; + ssize_t r; + gnutls_datum_t d = { NULL, 0 }; + + if (-1 == stat(file, &buf)) { + g_warning("%s(): can't stat() %s: %m", G_STRFUNC, file); + return d; + } + + if (buf.st_size > TLS_FILE_MAXSIZE) { + g_warning("%s(): file %s is too large (%'zu bytes, max set to %'d)", + G_STRFUNC, file, (size_t) buf.st_size, TLS_FILE_MAXSIZE); + return d; + } + + d.data = halloc(buf.st_size); + fd = file_open(file, O_RDONLY, 0); + if (-1 == fd) + goto error; + + r = read(fd, d.data, buf.st_size); + if (r < 0) { + g_warning("%s(): read() failed: %m", G_STRFUNC); + goto error; + } + if (r != buf.st_size) { + g_warning("%s(): partial read() of %'zd out of %'zu bytes from %s", + G_STRFUNC, r, (size_t) buf.st_size, file); + goto error; + } + + fd_close(&fd); + d.size = r; + + return d; + +error: + HFREE_NULL(d.data); + fd_close(&fd); + + return d; +} + +/** + * Generate an X.509 self-signed certificate in PEM format. + * + * @param file the path to the file where certificate needs to be stored. + * @param keyfile the path to the private key file + */ +static void +tls_generate_self_signed_cert(const char *file, const char *keyfile) +{ + gnutls_x509_crt_t crt = NULL; + gnutls_x509_privkey_t key = NULL; + gnutls_privkey_t privkey = NULL; + gnutls_pubkey_t pubkey = NULL; + void *data = NULL; + size_t len; + int e, fd = -1; + const char *fn; + const int key_type = GNUTLS_PK_RSA; + const int mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; /* 0644 */ + const gnutls_digest_algorithm_t digest = GNUTLS_DIG_SHA256; + gnutls_datum_t dkey; + time_t expire = 2145913200; /* Fri Jan 1 00:00:00 2038 */ + str_t *cn = NULL; + + cn = str_new(80); + str_printf(cn, "%s/%s", product_name(), product_version()); + +#define TRY(function) (fn = (#function)), e = function + + if (TRY(gnutls_x509_privkey_init)(&key)) + goto failed; + + if (TRY(gnutls_x509_crt_init)(&crt)) + goto failed; + + if (TRY(gnutls_pubkey_init)(&pubkey)) + goto failed; + + if (TRY(gnutls_privkey_init)(&privkey)) + goto failed; + + dkey = tls_read_filedata(keyfile); + + if (NULL == dkey.data) + goto error; + + g_info("TLS generating self-signed certificate..."); + + if (TRY(gnutls_x509_privkey_import)(key, &dkey, key_type)) + goto failed; + + HFREE_NULL(data); + + if (TRY(gnutls_privkey_import_x509)(privkey, key, 0)) + goto failed; + + if (TRY(gnutls_pubkey_import_privkey)(pubkey, privkey, 0, 0)) + goto failed; + + if (TRY(gnutls_x509_crt_set_pubkey)(crt, pubkey)) + goto failed; + + /* OID "2.5.4.3" is the "CN" -- Common Name */ + + if ( + TRY(gnutls_x509_crt_set_dn_by_oid) + (crt, "2.5.4.3", 0, str_2c(cn), str_len(cn)) + ) + goto failed; + + /* + * No two certificates generated by the same CA can bear the same serial, + * and we are our own CA (Certification Authority) here since we will + * be self-signing. Use the current time to make the serial unique. + */ + + { + char serial2 * sizeof(uint32); + tm_t now; + char *p; + + ZERO(&serial); + tm_now_exact(&now); + + p = poke_le32(serial, now.tv_sec); + p = poke_be32(p, now.tv_usec); + + if (TRY(gnutls_x509_crt_set_serial)(crt, serial, N_ITEMS(serial))) + goto failed; + } + + /* + * The subject and authority IDs are this servent's GUID. + */ + + { + guid_t *guid = (guid_t *) GNET_PROPERTY_PTR(servent_guid); + + if (TRY(gnutls_x509_crt_set_subject_key_id)(crt, guid, sizeof *guid)) + goto failed; + + if (TRY(gnutls_x509_crt_set_authority_key_id)(crt, guid, sizeof *guid)) + goto failed; + } + + if (TRY(gnutls_x509_crt_set_activation_time)(crt, time(NULL))) + goto failed; + + if (TRY(gnutls_x509_crt_set_expiration_time)(crt, expire)) + goto failed; + + if (TRY(gnutls_x509_crt_set_version (crt, 3))) + goto failed; + + if (TRY(gnutls_x509_crt_privkey_sign)(crt, crt, privkey, digest, 0)) + goto failed; + + tls_cert_log("TLS generated certificate:\n%s", crt, GNUTLS_CRT_PRINT_FULL); + g_info("TLS saving certificate into %s", file); -static inline gnutls_session + fd = file_create(file, O_WRONLY, mode); + if (-1 == fd) + goto done; + + len = 64 * 1024; + data = halloc(len); + + if (TRY(gnutls_x509_crt_export)(crt, GNUTLS_X509_FMT_PEM, data, &len)) + goto failed; + + if (-1 == write(fd, data, len)) { + g_warning("%s(): write() failed: %m", G_STRFUNC); + goto error; + } + + fd_close(&fd); + goto done; + +failed: + g_warning("%s(): %s() failed: %s", G_STRFUNC, fn, gnutls_strerror(e)); + /* FALL THROUGH */ +error: + fd_close(&fd); /* On Windows, needs to close before unlink() */ + (void) unlink(file); + /* FALL THROUGH */ +done: + gnutls_x509_privkey_deinit(key); + gnutls_x509_crt_deinit(crt); + gnutls_pubkey_deinit(pubkey); + gnutls_privkey_deinit(privkey); + HFREE_NULL(data); + str_destroy_null(&cn); +#undef TRY +} + +static inline gnutls_session_t tls_socket_get_session(struct gnutella_socket *s) { g_return_val_if_fail(s, NULL); @@ -138,8 +526,8 @@ if (GNET_PROPERTY(tls_debug) > 1) { int fd = socket_evt_fd(s); - g_debug("tls_socket_evt_change: fd=%d, cond=%s -> %s", - fd, inputevt_cond_to_string(s->tls.cb_cond), + g_debug("%s(): fd=%d, cond=%s -> %s", + G_STRFUNC, fd, inputevt_cond_to_string(s->tls.cb_cond), inputevt_cond_to_string(cond)); } inputevt_remove(&s->gdk_tag); @@ -153,11 +541,16 @@ { size_t n = gnutls_record_check_pending(tls_socket_get_session(s)); - if (n > 0) { + /* + * There can be data in the GnuTLS layer, or in the socket input buffer. + */ + + if (n > 0 || 0 != (n = s->pos)) { int saved_errno = errno; if (GNET_PROPERTY(tls_debug) > 1) { - g_debug("%s: pending=%zu", G_STRFUNC, n); + g_debug("%s(): pending=%zu%s", + G_STRFUNC, n, s->pos != 0 ? " (socket)" : ""); } inputevt_set_readable(s->file_desc); errno = saved_errno; @@ -170,8 +563,53 @@ gnutls_transport_set_errno(tls_socket_get_session(s), errnum); } +#ifdef USE_TLS_PUSHV +static inline ssize_t +tls_pushv(gnutls_transport_ptr_t ptr, const giovec_t *iov, int iovcnt) +{ + struct gnutella_socket *s = ptr; + ssize_t ret; + int saved_errno; + iovec_t *niov; + + socket_check(s); + g_assert(is_valid_fd(s->file_desc)); + + /* + * On Windows, we need to convert the giovec_t structure into our + * emulated iovec_t, which are actually WSABUF structures, so that + * we can pass them to s_writev(). + */ + + if (is_running_on_mingw()) { + int i; + + HALLOC_ARRAY(niov, iovcnt); + for (i = 0; i < iovcnt; i++) { + iovec_set(&niovi, iovi.iov_base, iovi.iov_len); + } + } else { + niov = (iovec_t *) iov; /* Isomorphic structures */ + } + + ret = s_writev(s->file_desc, niov, iovcnt); + saved_errno = errno; + tls_signal_pending(s); + if ((ssize_t) -1 == ret) { + tls_set_errno(s, saved_errno); + if (ECONNRESET == saved_errno || EPIPE == saved_errno) { + socket_connection_reset(s); + } + } + tls_transport_debug(G_STRFUNC, s, iov_calculate_size(niov, iovcnt), ret); + if (is_running_on_mingw()) + hfree(niov); + errno = saved_errno; + return ret; +} +#else /* !USE_TLS_PUSHV */ static inline ssize_t -tls_push(gnutls_transport_ptr ptr, const void *buf, size_t size) +tls_push(gnutls_transport_ptr_t ptr, const void *buf, size_t size) { struct gnutella_socket *s = ptr; ssize_t ret; @@ -189,13 +627,14 @@ socket_connection_reset(s); } } - tls_transport_debug("tls_push", s, size, ret); + tls_transport_debug(G_STRFUNC, s, size, ret); errno = saved_errno; return ret; } +#endif /* USE_TLS_PUSHV */ static inline ssize_t -tls_pull(gnutls_transport_ptr ptr, void *buf, size_t size) +tls_pull(gnutls_transport_ptr_t ptr, void *buf, size_t size) { struct gnutella_socket *s = ptr; ssize_t ret; @@ -204,6 +643,43 @@ socket_check(s); g_assert(is_valid_fd(s->file_desc)); + /* + * If there are still pending data in the socket buffer, consume them. + * + * This can happen after we upgrade a normal connection into a TLS one, + * and the TLS handshake data was already read as part of the normal + * connection into the socket buffer. + * --RAM, 2015-11-22 + */ + + if G_UNLIKELY(s->pos != 0) { + size_t avail = s->pos; + + if (GNET_PROPERTY(tls_debug) > 1) { + g_debug("%s(): host=%s still has %zu buffered byte%s", + G_STRFUNC, host_addr_port_to_string(s->addr, s->port), + s->pos, plural(s->pos)); + } + + avail = MIN(avail, size); /* Can't read more than they request */ + memcpy(buf, s->buf, avail); + if (avail != s->pos) + memmove(s->buf, &s->bufavail, s->pos - avail); + s->pos -= avail; + tls_transport_debug(G_STRFUNC, s, size, avail); + + /* + * If there is more buffered data to read, mark the source as + * readable because poll() or select() do not know about these + * extra bytes that are available. + */ + + if (s->pos != 0) + inputevt_set_readable(s->file_desc); + + return avail; + } + ret = s_read(s->file_desc, buf, size); saved_errno = errno; tls_signal_pending(s); @@ -215,34 +691,60 @@ } else if (0 == ret) { socket_eof(s); } - tls_transport_debug("tls_pull", s, size, ret); + tls_transport_debug(G_STRFUNC, s, size, ret); errno = saved_errno; return ret; } -static gnutls_dh_params -get_dh_params(void) +static gnutls_dh_params_t +tls_dh_params(void) { - static gnutls_dh_params dh_params; - static gboolean initialized = FALSE; + static gnutls_dh_params_t dh_params; + static bool initialized = FALSE; + int e; + const char *fn; + +#define TRY(function) (fn = (#function)), e = function if (!initialized) { - if (gnutls_dh_params_init(&dh_params)) { - g_warning("get_dh_params(): gnutls_dh_params_init() failed"); - return NULL; - } - if (gnutls_dh_params_generate2(dh_params, TLS_DH_BITS)) { - g_warning("get_dh_params(): gnutls_dh_params_generate2() failed"); - return NULL; - } + uint bits = TLS_DH_BITS; + + if (GNET_PROPERTY(tls_debug) > 0) + g_info("TLS initializing Diffie-Hellman parameters..."); + +#if HAS_TLS(2, 12) + /* + * GNUTLS_SEC_PARAM_NORMAL became GNUTLS_SEC_PARAM_MEDIUM later but + * there is a compatibility remapping. For the sake of portability, + * we stick to GNUTLS_SEC_PARAM_NORMAL. + */ + bits = gnutls_sec_param_to_pk_bits(GNUTLS_PK_DH, + GNUTLS_SEC_PARAM_NORMAL); +#endif + + if (TRY(gnutls_dh_params_init)(&dh_params)) + goto failed; + + if (TRY(gnutls_dh_params_generate2)(dh_params, bits)) + goto failed; + initialized = TRUE; + + if (GNET_PROPERTY(tls_debug) > 0) + g_info("TLS computed %u-bit Diffie-Hellman parameters", bits); } return dh_params; + +failed: + g_warning("%s(): %s() failed: %s", G_STRFUNC, fn, gnutls_strerror(e)); + return NULL; + +#undef TRY } static void -tls_print_session_info(const host_addr_t addr, guint16 port, - gnutls_session session, gboolean incoming) +tls_print_session_info(const host_addr_t addr, uint16 port, + gnutls_session_t session, bool incoming) { const char *proto, *cert, *kx, *ciph, *mac, *comp; @@ -258,6 +760,7 @@ g_debug( "TLS session info (%s):\n" + " Session: %p\n" " Host: %s\n" " Protocol: %s\n" " Certificate: %s\n" @@ -266,7 +769,7 @@ " MAC: %s\n" " Compression: %s", incoming ? "incoming" : "outgoing", - host_addr_port_to_string(addr, port), + session, host_addr_port_to_string(addr, port), NULL_STRING(proto), NULL_STRING(cert), NULL_STRING(kx), @@ -276,6 +779,33 @@ ); } +#if HAS_TLS(3, 0) +static void +tls_log_audit(gnutls_session_t session, const char *message) +{ + char *dupmsg; + + if (GNET_PROPERTY(tls_debug) < 2) + return; + + /* Remove trailing "\n" before logging */ + dupmsg = h_strdup(message); + strchomp(dupmsg, 0); + g_warning("TLS ALERT for session=%p: %s", session, dupmsg); + HFREE_NULL(dupmsg); + + if (session != NULL) { + gnutella_socket_t *s = htable_lookup(tls_sessions, session); + if (s != NULL) { + tls_print_session_info(s->addr, s->port, session, + SOCK_CONN_INCOMING == s->direction); + } else { + g_warning("TLS no socket attached to session=%p", session); + } + } +} +#endif /* TLS >= 3.0 */ + /** * @return TLS_HANDSHAKE_ERROR if the TLS handshake failed. * TLS_HANDSHAKE_RETRY if the handshake is incomplete; thus @@ -287,8 +817,8 @@ enum tls_handshake_result tls_handshake(struct gnutella_socket *s) { - gnutls_session session; - gboolean do_warn; + gnutls_session_t session; + bool do_warn; int ret; socket_check(s); @@ -310,7 +840,10 @@ switch (ret) { case 0: if (GNET_PROPERTY(tls_debug) > 3) { - g_debug("TLS handshake succeeded"); + g_debug("%s(): TLS handshake succeeded with %s %s on fd=%d", + G_STRFUNC, + SOCK_CONN_INCOMING == s->direction ? "client" : "server", + host_addr_port_to_string(s->addr, s->port), s->file_desc); } tls_socket_evt_change(s, SOCK_CONN_INCOMING == s->direction ? INPUT_EVENT_R : INPUT_EVENT_W); @@ -325,7 +858,10 @@ tls_socket_evt_change(s, gnutls_record_get_direction(session) ? INPUT_EVENT_WX : INPUT_EVENT_RX); if (GNET_PROPERTY(tls_debug) > 3) { - g_debug("TLS handshake proceeding..."); + g_debug("%s(): TLS handshake still ongoing with %s %s on fd=%d", + G_STRFUNC, + SOCK_CONN_INCOMING == s->direction ? "client" : "server", + host_addr_port_to_string(s->addr, s->port), s->file_desc); } tls_signal_pending(s); return TLS_HANDSHAKE_RETRY; @@ -341,8 +877,8 @@ /* FALLTHROUGH */ default: if (do_warn && GNET_PROPERTY(tls_debug)) { - g_carp("gnutls_handshake() failed: host=%s (%s) error=\"%s\"", - host_addr_port_to_string(s->addr, s->port), + g_carp("%s(): handshake failed: host=%s (%s) error=\"%s\"", + G_STRFUNC, host_addr_port_to_string(s->addr, s->port), SOCK_CONN_INCOMING == s->direction ? "incoming" : "outgoing", gnutls_strerror(ret)); } @@ -363,10 +899,27 @@ * DEFLATE is disabled because it seems to cause crashes. * ARCFOUR-40 is disabled because it is deprecated. */ - static const char prio_want = "NORMAL:+ANON-DH:-ARCFOUR-40:-COMP-DEFLATE"; + + static const char prio_want = "NORMAL" +#if HAS_TLS(3, 2) + ":+ANON-ECDH" +#endif + ":+ANON-DH" +#if !HAS_TLS(3, 0) + ":-ARCFOUR-40:-COMP-DEFLATE" +#endif + ; + /* "-COMP-DEFLATE" is causing an error on MinGW with GnuTLS 2.10.2 */ - static const char prio_must = "NORMAL:+ANON-DH:-ARCFOUR-40"; - const gboolean server = SOCK_CONN_INCOMING == s->direction; + /* "-ARCFOUR-40" is causing an error on MinGW with GnuTLS 3.4.5 */ + static const char prio_must = "NORMAL" +#if HAS_TLS(3, 2) + ":+ANON-ECDH" +#endif + ":+ANON-DH" + ; + + const bool server = SOCK_CONN_INCOMING == s->direction; struct tls_context *ctx; const char *fn; int e; @@ -374,6 +927,7 @@ #define TRY(function) (fn = (#function)), e = function socket_check(s); + g_assert(NULL == s->tls.ctx); WALLOC0(ctx); ctx->s = s; @@ -394,16 +948,36 @@ } } - if (TRY(gnutls_credentials_set)(ctx->session, - GNUTLS_CRD_CERTIFICATE, cert_cred)) - goto failure; + if (cert_cred_loaded) { + if (TRY(gnutls_credentials_set)(ctx->session, + GNUTLS_CRD_CERTIFICATE, cert_cred)) + goto failure; + } + + /* + * This is for the client to inform the handshaking logic about the + * minimum amount of bits we expect for the prime number: if the server + * sends a prime smaller than this, the TLS handshake will fail. + * + * This function was deprecated since 3.1.7, so we don't use it starting + * with 3.2: the minimum number of bits is automatically derived by the + * library using the priority string. + */ - gnutls_dh_set_prime_bits(ctx->session, TLS_DH_BITS); +#if !HAS_TLS(3, 2) + if (!server) + gnutls_dh_set_prime_bits(ctx->session, TLS_DH_BITS); +#endif -#ifdef USE_TLS_CUSTOM_IO gnutls_transport_set_ptr(ctx->session, s); - gnutls_transport_set_push_function(ctx->session, tls_push); gnutls_transport_set_pull_function(ctx->session, tls_pull); + +#ifdef USE_TLS_PUSHV + gnutls_transport_set_vec_push_function(ctx->session, tls_pushv); +#else + gnutls_transport_set_push_function(ctx->session, tls_push); +#endif /* USE_TLS_PUSHV */ + #if !HAS_TLS(2, 12) /* * This routine has been removed starting TLS 3.0. It was used to disable @@ -414,31 +988,39 @@ * --RAM, 2011-12-15 */ gnutls_transport_set_lowat(ctx->session, 0); -#endif -#else /* !USE_TLS_CUSTOM_IO */ - g_assert(is_valid_fd(s->file_desc)); - gnutls_transport_set_ptr(ctx->session, int_to_pointer(s->file_desc)); -#endif /* USE_TLS_CUSTOM_IO */ +#endif /* TLS < 2.12 */ if (server) { - if (TRY(gnutls_anon_allocate_server_credentials)(&ctx->server_cred)) + /* + * There's no need to allocate an anonymous server credential + * if we already laoded the certificate. + */ + + if (cert_cred_loaded) + goto done; + + if (TRY(gnutls_anon_allocate_server_credentials)(&ctx->cred.server)) goto failure; - gnutls_anon_set_server_dh_params(ctx->server_cred, get_dh_params()); + gnutls_anon_set_server_dh_params(ctx->cred.server, tls_dh_params()); if (TRY(gnutls_credentials_set)(ctx->session, - GNUTLS_CRD_ANON, ctx->server_cred)) + GNUTLS_CRD_ANON, ctx->cred.server)) goto failure; } else { - if (TRY(gnutls_anon_allocate_client_credentials)(&ctx->client_cred)) + if (TRY(gnutls_anon_allocate_client_credentials)(&ctx->cred.client)) goto failure; if (TRY(gnutls_credentials_set)(ctx->session, - GNUTLS_CRD_ANON, ctx->client_cred)) + GNUTLS_CRD_ANON, ctx->cred.client)) goto failure; } + /* FALL THROUGH */ + +done: + htable_insert(tls_sessions, ctx->session, s); return 0; failure: @@ -452,20 +1034,22 @@ tls_free(struct gnutella_socket *s) { tls_context_t ctx; + const bool server = SOCK_CONN_INCOMING == s->direction; socket_check(s); ctx = s->tls.ctx; if (ctx) { if (ctx->session) { + htable_remove(tls_sessions, ctx->session); gnutls_deinit(ctx->session); } - if (ctx->server_cred) { - gnutls_anon_free_server_credentials(ctx->server_cred); - ctx->server_cred = NULL; + if (server && ctx->cred.server != NULL) { + gnutls_anon_free_server_credentials(ctx->cred.server); + ctx->cred.server = NULL; } - if (ctx->client_cred) { - gnutls_anon_free_client_credentials(ctx->client_cred); - ctx->client_cred = NULL; + if (!server && ctx->cred.client != NULL) { + gnutls_anon_free_client_credentials(ctx->cred.client); + ctx->cred.client = NULL; } WFREE(ctx); s->tls.ctx = NULL; @@ -483,7 +1067,7 @@ } } -G_GNUC_COLD void +void G_COLD tls_global_init(void) { static const struct { @@ -494,44 +1078,66 @@ "tls", 1, 0 }; char *cert_file, *key_file; + int e; -#if !defined(REMAP_ZALLOC) && !defined(TRACK_MALLOC) && !defined(TRACK_ZALLOC) - gnutls_global_set_mem_functions(halloc, halloc, NULL, hrealloc, hfree); -#endif - - if (gnutls_global_init()) { - g_error("gnutls_global_init() failed"); + if ((e = gnutls_global_init())) { + g_error("%s(): gnutls_global_init() failed: %s", + G_STRFUNC, gnutls_strerror(e)); } -#ifdef USE_TLS_CUSTOM_IO gnutls_global_set_log_level(9); gnutls_global_set_log_function(tls_log_function); -#endif /* USE_TLS_CUSTOM_IO */ - get_dh_params(); +#if HAS_TLS(3, 0) + gnutls_global_set_audit_log_function(tls_log_audit); +#endif /* TLS >= 3.0 */ + + (void) tls_dh_params(); gnutls_certificate_allocate_credentials(&cert_cred); - key_file = make_pathname(settings_config_dir(), "key.pem"); - cert_file = make_pathname(settings_config_dir(), "cert.pem"); + key_file = make_pathname(settings_config_dir(), tls_keyfile); + cert_file = make_pathname(settings_config_dir(), tls_certfile); - if (file_exists(key_file) && file_exists(cert_file)) { - int ret; + if (!file_exists(key_file)) + tls_generate_private_key(key_file); + + if (!file_exists(cert_file) && file_exists(key_file)) + tls_generate_self_signed_cert(cert_file, key_file); - ret = gnutls_certificate_set_x509_key_file(cert_cred, + if (file_exists(key_file) && file_exists(cert_file)) { + e = gnutls_certificate_set_x509_key_file(cert_cred, cert_file, key_file, GNUTLS_X509_FMT_PEM); - if (ret < 0) { - g_warning("gnutls_certificate_set_x509_key_file() failed: %s", - gnutls_strerror(ret)); + if (e) { + g_warning("%s(): gnutls_certificate_set_x509_key_file() failed: %s", + G_STRFUNC, gnutls_strerror(e)); + gnutls_certificate_set_dh_params(cert_cred, tls_dh_params()); } else { - gnutls_certificate_set_dh_params(cert_cred, get_dh_params()); + gnutls_datum_t data = tls_read_filedata(cert_file); + gnutls_x509_crt_t crt; + + if ( + 0 == gnutls_x509_crt_init(&crt) && + 0 == gnutls_x509_crt_import(crt, &data, GNUTLS_X509_FMT_PEM) + ) { + tls_cert_log("TLS loaded X.509 certificate: %s", + crt, GNUTLS_CRT_PRINT_ONELINE); + } + gnutls_x509_crt_deinit(crt); + cert_cred_loaded = TRUE; } + } else { + gnutls_certificate_set_dh_params(cert_cred, tls_dh_params()); } + HFREE_NULL(key_file); HFREE_NULL(cert_file); header_features_add(FEATURES_CONNECTIONS, f.name, f.major, f.minor); + header_features_add(FEATURES_G2_CONNECTIONS, f.name, f.major, f.minor); header_features_add(FEATURES_DOWNLOADS, f.name, f.major, f.minor); header_features_add(FEATURES_UPLOADS, f.name, f.major, f.minor); + + tls_sessions = htable_create(HASH_KEY_SELF, 0); } void @@ -541,6 +1147,7 @@ gnutls_certificate_free_credentials(cert_cred); cert_cred = NULL; } + htable_free_null(&tls_sessions); gnutls_global_deinit(); } @@ -576,8 +1183,9 @@ default: if (GNET_PROPERTY(tls_debug)) { - g_carp("tls_write(): gnutls_record_send(fd=%d) failed: " + g_carp("%s(): gnutls_record_send(fd=%d) failed: " "host=%s snarf=%zu error=\"%s\"", + G_STRFUNC, s->file_desc, host_addr_port_to_string(s->addr, s->port), s->tls.snarf, gnutls_strerror(ret)); } @@ -614,8 +1222,8 @@ if (s->tls.snarf) { if (GNET_PROPERTY(tls_debug > 1)) { - g_debug("tls_flush: snarf=%zu host=%s fd=%d", - s->tls.snarf, + g_debug("%s(): snarf=%zu host=%s fd=%d", + G_STRFUNC, s->tls.snarf, host_addr_port_to_string(s->addr, s->port), s->file_desc); } (void ) tls_write_intern(wio, NULL, 0); @@ -662,7 +1270,8 @@ if (tls_flush(wio) && !is_temporary_error(errno)) { if (GNET_PROPERTY(tls_debug)) { - g_warning("tls_read: tls_flush(fd=%d) error: %m", s->file_desc); + g_warning("%s(): tls_flush(fd=%d) error: %m", + G_STRFUNC, s->file_desc); } return -1; } @@ -698,8 +1307,9 @@ /* FALLTHROUGH */ default: if (GNET_PROPERTY(tls_debug)) { - g_carp("tls_read(): gnutls_record_recv(fd=%d) failed: " + g_carp("%s(): gnutls_record_recv(fd=%d) failed: " "host=%s error=\"%s\"", + G_STRFUNC, s->file_desc, host_addr_port_to_string(s->addr, s->port), gnutls_strerror(ret)); } @@ -797,7 +1407,7 @@ tls_bye(struct gnutella_socket *s) { int ret; - + socket_check(s); g_return_if_fail(s->tls.ctx); g_return_if_fail(s->tls.ctx->session); @@ -806,7 +1416,7 @@ return; if (tls_flush(&s->wio) && GNET_PROPERTY(tls_debug)) { - g_warning("tls_bye: tls_flush(fd=%d) failed", s->file_desc); + g_warning("%s(): tls_flush(fd=%d) failed", G_STRFUNC, s->file_desc); } ret = gnutls_bye(s->tls.ctx->session, @@ -824,7 +1434,8 @@ break; default: if (GNET_PROPERTY(tls_debug)) { - g_carp("gnutls_bye() failed: host=%s error=%m", + g_carp("%s(): gnutls_bye() failed: host=%s error=%m", + G_STRFUNC, host_addr_port_to_string(s->addr, s->port)); } } @@ -844,17 +1455,19 @@ differ ? " (compiled against " : "", differ ? LIBGNUTLS_VERSION : "", differ ? ")" : "", - (void *) 0); + NULL_PTR); } return buf; } -gboolean +bool tls_enabled(void) { return TRUE; } +#if 0 /* DISABLED -- no longer using SVN -- RAM, 2013-12-30 */ + static gnutls_x509_crt svn_release_notify_certificate(void) { @@ -868,11 +1481,11 @@ "1NFx0QRBCHE+BUaCX3tuRC0a7HRq8UEqhcKgW7Xk3nkGUNXTcSSo7wu+jpePUsw8\n" "njFhJCXeDIcR7jzNCA==\n" "-----END CERTIFICATE-----\n"; - static gboolean initialized; + static bool initialized; static gnutls_x509_crt cert; if (!initialized) { - gnutls_datum cert_data; + gnutls_datum_t cert_data; int error; initialized = TRUE; @@ -895,20 +1508,20 @@ return NULL; } } - return cert; + return cert; } -gboolean +bool svn_release_notification_can_verify(void) { return NULL != svn_release_notify_certificate(); } -static gboolean +static bool verify_signature(gnutls_x509_crt cert, const struct array *input, const struct array *signature) { - gnutls_datum data, sig; + gnutls_datum_t data, sig; g_return_val_if_fail(cert, FALSE); g_return_val_if_fail(input, FALSE); @@ -928,8 +1541,8 @@ * * @return TRUE if the signature matches. */ -gboolean -svn_release_notification_verify(guint32 revision, time_t date, +bool +svn_release_notification_verify(uint32 revision, time_t date, const struct array *signature) { char rev12, data64; @@ -940,11 +1553,12 @@ input.size = concat_strings(data, sizeof data, "r", rev, "@", uint32_to_string(date), - (void *) 0); + NULL_PTR); return verify_signature(svn_release_notify_certificate(), &input, signature); } +#endif /* Disabled SVN signature verification */ #else /* !HAS_GNUTLS*/ @@ -1002,20 +1616,22 @@ return NULL; } -gboolean +bool tls_enabled(void) { return FALSE; } -gboolean +#endif /* HAS_GNUTLS */ + +bool svn_release_notification_can_verify(void) { return FALSE; } -gboolean -svn_release_notification_verify(guint32 revision, time_t date, +bool +svn_release_notification_verify(uint32 revision, time_t date, const struct array *signature) { g_return_val_if_fail(signature, FALSE); @@ -1024,6 +1640,4 @@ return FALSE; } -#endif /* HAS_GNUTLS */ - /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/tls_common.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/tls_common.h
Changed
@@ -52,15 +52,15 @@ void tls_free(struct gnutella_socket *); void tls_wio_link(struct gnutella_socket *); -gboolean tls_enabled(void); +bool tls_enabled(void); void tls_global_init(void); void tls_global_close(void); const char *tls_version_string(void); struct array; -gboolean svn_release_notification_can_verify(void); -gboolean svn_release_notification_verify(guint32 revision, time_t date, +bool svn_release_notification_can_verify(void); +bool svn_release_notification_verify(uint32 revision, time_t date, const struct array *signature); #endif /* _core_tls_common_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/token.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/token.c
Changed
@@ -39,20 +39,22 @@ #include "if/gnet_property_priv.h" -#include "lib/misc.h" -#include "lib/sha1.h" #include "lib/base64.h" -#include "lib/glib-missing.h" #include "lib/crc.h" +#include "lib/glib-missing.h" +#include "lib/halloc.h" +#include "lib/misc.h" #include "lib/random.h" +#include "lib/sha1.h" #include "lib/stacktrace.h" #include "lib/tm.h" + #include "lib/override.h" /* Must be the last header included */ #define TOKEN_CLOCK_SKEW 3600 /**< +/- 1 hour */ #define TOKEN_LIFE 60 /**< lifetime of our tokens */ #define TOKEN_BASE64_SIZE (TOKEN_VERSION_SIZE * 4 / 3) /**< base64 size */ -#define LEVEL_SIZE (2 * G_N_ELEMENTS(token_keys)) /**< at most */ +#define LEVEL_SIZE (2 * N_ITEMS(token_keys)) /**< at most */ #define LEVEL_BASE64_SIZE (LEVEL_SIZE * 4 / 3 + 3) /**< +2 for == tail */ #define GIT_SWITCH 1315692000 /* 2011-09-11 */ @@ -62,250 +64,6 @@ * There can be up to 2^5 = 32 keys per version. */ -static const char *keys_096 = { - "261c 78d6 fcc5 d96e 2649 061a 4534 29b5", - "2629 7de4 8edd 43eb 6c47 2b01 caf1 5e86", - "50c2 076a 5a15 5c0c 27fb eda0 381b 2eb7", - "851c 2fff 0a31 c6ad 2181 4d31 8fea 492c", - "c8f8 01a8 2975 cc75 417c 63aa 5403 5b41", - "045b aca8 5227 7d0f 232a 7c6a d713 d5dd", - "f281 f0c5 23fb cf66 5ca4 6a3d 9df1 dc6a", - "0fc8 ac1f 76da 5f7e 3459 bd7d 3175 76cf", - "f981 7fe7 06d1 d3d9 9d69 1e47 b8d0 9adf", - "7422 4730 d7d0 9293 002c b700 8979 dccf", - "c328 4be8 9008 8d52 cbd6 2f45 30ba 9467", - "cdc2 2db6 6bba 312c 10fb 246b b371 be09", - "017a 3e68 90e0 e0f0 8124 3cc8 fcf8 3bf7", - "2e56 a817 02b3 0819 d971 a245 c33e 42fc", - "0ee7 8801 db48 f2d6 64ad 6c42 bac3 f7ee", - "c758 af82 e6a3 aa5f 1da0 c127 4541 1ce8", - "2edc 2b16 9e66 a191 9e45 2e66 ea98 0c7b", - "438a a8ed d27e 711e 631e 2372 a013 d095", - "45cf 2974 2086 d00e efec 9277 05a3 bff2", - "bb86 594c 74e2 432d 5444 8a85 82c8 d098", - "64f4 9829 a541 8625 578c fd90 639c f42b", - "3084 a2bc f4ed 8b3c 2a2b 1834 cd8e 3f8b", -}; - -static const char *keys_096_1 = { - "ac3e f7b1 af37 e22c ce69 f25f 8dd2 8e51", - "7c66 fddd f8d9 8bde 8c6c 072a 1935 2237", - "6aab e420 921d b32c 09e9 34b8 e403 525d", - "3014 53b9 64fd 95a5 e52b e9c9 99f6 323e", - "dacd 5a3d 34e5 d280 fd58 1af0 6fef ac72", - "020a 4163 41f6 f089 b285 0321 48df 44fb", - "8059 f2a1 e91a f319 2ad2 e13d 6634 6eb6", - "4853 1dba a1bf 9386 8b24 af94 f112 9e5b", - "e053 3cd9 87ba 9dd7 c4c4 c32e 9bd2 a61a", - "8625 b5d3 b531 18b9 8716 403d fa26 4a5b", - "433c 60fb eb1b c33b 139b 1594 9c69 91e4", - "4a47 e00b 2933 f634 d194 6376 b777 fbb8", - "70ec 73f6 7ee3 ac83 a899 5e84 1d82 371c", - "2b53 cad1 b7d6 ad9e f4a1 96bd 8c37 264e", - "20ed fcbc feb8 f96d e037 af6f 2486 ff84", - "109c 5d02 d4df 33ac ead3 fe7c 8bc2 e87f", - "1392 547e 3abe b83c 3e15 8416 0b7b 5d89", - "a546 f15e 797e 8081 9d88 0c82 5afc 4c2e", - "fe97 9602 dcd7 efb6 74ee 35ba ea4a 9158", - "396c 5dcc 43a3 9577 a610 9e89 7079 5862", - "9e54 e398 f5b0 1e02 272d 87a7 e36e 10a2", - "9536 535d 0e1b e017 2f73 a0bc c01a dcf9", -}; - -static const char *keys_096_2 = { - "fa04 15ab 5f1d 52cc 5a5d 865b 27b5 c5a5", - "7f0b 5987 86ec a100 85c5 d0fc f504 b58c", - "2b06 f3a7 05a8 2769 2679 1ab9 9ba0 2360", - "4c3f 5636 3ba7 471b 43ea 3350 d71f b0fd", - "00bf c06b 3703 78e3 87c2 ea7a 3a8c b684", - "5103 6580 7be1 9cab fecb 3c46 12a9 4287", - "a5c5 a8f0 d10e 2202 526a f62e d615 afe2", - "32b8 5d94 5e4b c936 8703 2386 5f67 aa6b", - "10f8 e454 5d88 ec00 7e44 636f cda5 e45a", - "0409 a3aa b426 c79a 0d17 8895 f595 d744", - "9f9f c223 b290 0e7b 0950 d991 1ed9 bae0", - "a297 f754 a185 81f1 d57d 7b82 fde8 c7d1", - "d3de 3537 3271 0649 c2e8 de86 842e 1b79", - "86d1 3b44 b4eb 4842 1736 d42b 8b0b ce30", - "3b93 8172 1331 99fe 1423 c188 642b c45b", - "f013 188b 833d de3b 49d9 3709 6067 fd88", - "42ad 9a84 808e 7638 601a 6d33 9543 0827", - "ba4e d65e 1768 320d c88f 7b16 3194 0e08", - "ef2b e292 e29f c2ef 96a2 bc3c fbcb bb96", - "71a7 a828 ce50 d736 11a5 e687 ad42 ce5c", - "266b be05 0d52 f825 37e8 ffe3 b4f1 282c", - "e75d b41f 2332 309d c3ee 4dd7 060d fc08", -}; - -static const char *keys_096_3 = { - "ca43 91c3 d080 c596 5ec2 9e17 5011 ebb6", - "4b53 6e49 a6a8 c045 c0c4 bfc7 8c54 4d9a", - "411b fc41 6643 ba3a 527a 52c9 4a72 3db0", - "13aa 0ae0 54f8 c9b3 2af8 3faa c363 cc4b", - "ebd2 69db d313 b7da 2425 9412 1ce3 16be", - "faf3 1626 20db 8b5a d448 0887 a22e c156", - "e925 4acd 65d3 f64d daea 0766 b260 ae03", - "62ff b5f7 02bf 189c a17f 7fec 3845 2d8e", - "efe6 4c84 2149 aee7 0e61 9192 b293 8f5d", - "47ec defc f33c 698e a8d4 eb06 c5bd d062", - "4aab bc51 4caf f6c2 676d f60c 6e6e 6ad6", - "afad 3bbc 4981 0a4d a0b9 a247 697f 8052", - "c244 2aff d148 3a7b 3da0 f837 7207 6795", - "8b8b 3562 29c5 3d4c 3e9a 46ca 47ff 5e18", - "4973 9c6e bbb0 6a26 29e9 92d6 300b c4cb", - "c9fd b78f 37d5 029d 7e99 ce84 d052 7efb", - "1520 f5bd 1a53 8250 ca3e 8ced 4d1f 1b38", - "850a 2b7b f978 16fa 3465 a243 c66f 3796", - "fdf1 fbdf 54bb 32a0 44b1 3892 30b4 ea5c", - "8a44 58ba ddac b04f 9806 1bce 7a7d 486e", - "6cc1 768e 0d38 e314 c388 88be 7bf9 2dea", - "c994 a380 dde0 baff 8900 c9e5 d94c b9ff", -}; - -static const char *keys_096_4 = { - "4313 0c48 3747 a2b5 580c f7a5 7adc d83f", - "94c7 eeca e5c1 c4c4 a09d 243c b846 6917", - "3188 446a 39da fca8 11ae ef30 8073 f61a", - "146a 985b 20bc 639e 971e 5fd4 304f f02b", - "a99f a005 5c50 bf6a 721f 7c88 e4d4 3a1c", - "e28c 2482 40b0 a41d 4d30 1326 1227 20b1", - "070a 52ce af8f 2d26 5d01 c5bc 356e 9e3c", - "f018 d34c 91a6 4653 d397 7bcc 3d64 7b15", - "bc64 25b4 ac36 0fce 7097 9809 31da 71b6", - "4e40 d31e d36d 1ade 53ec 0a37 21a0 10fd", - "1dbb 4288 a191 8016 1bf8 956f 36aa c9c8", - "45be 9349 07c7 2455 ed07 ab54 f014 fd32", - "047c 4878 4809 00a2 bc3c 48bf 701c 2123", - "225d da36 c6ef 96db deb4 ad03 dba6 ce97", - "c4e9 6cbf 2f1c fd6f 1047 57fc 4c8b 8058", - "d131 9d1e 161a bbdb d39c 2e0a 1b5e 5546", - "a0e1 36b2 52d1 efec 6649 608a a3ba 687a", - "46b7 0f59 b70a 8ce4 147f 18c2 4307 6a30", - "b8e7 c642 de0c 9498 bdf0 5afe ae6c 8d21", - "6352 4957 2f40 56f2 0bfe 44c6 173a 9615", - "4ec5 9106 ab7c 019b 4b87 348a 13eb 82f2", - "a2d0 b172 becb 8516 8f17 b2f4 80e2 4488", -}; - -static const char *keys_096_5 = { - "29af ab9b fc6b 58b7 9031 cf87 f7cc 3c63", - "5dee 3d3f efb1 ac8d 27f4 2fa9 b1c3 705b", - "117f 9530 1881 6432 ecf4 780e dbfc 45c9", - "4b00 06d3 7e49 563b cc0a 3ace bb1d 3f35", - "6a73 45a2 b30a 2096 c2a4 971c 68a7 5d87", - "f88e 3f5c d07d e76c 0e1b a94c c93f b40f", - "40b3 d33c f3c8 06e7 c565 7736 0408 9265", - "9d43 7091 3bad 0f2d 1554 72d4 c7ec b505", - "a519 2d25 0f9d 11ca a1cd 3d87 cb5d cb9d", - "acab b860 7c78 6989 1c9e 2314 c917 dc48", - "027b 7e7e e566 fb10 d799 e2fd f807 5279", - "e069 951d 3c2a accf d119 bd4e 0755 e59c", - "8e4e cd64 d147 597a 32bd d977 6b38 40d3", - "ee12 9716 e9f7 74f2 bec3 c7fb 915d 11e4", - "2882 6581 cb85 c261 3c10 af8e 8eec 5761", - "92ca 01b0 e81c 6ee5 9b8f ae1e 7d57 422b", - "8eac 6012 99ac 2157 4bf5 df1c 074b 9110", - "133a 694a b768 3034 693b 57ad 06ab d4e7", - "477c faed 3a17 d265 7916 79cc 691d c50f", - "f271 3f09 2b26 095b b4f3 5893 f86d 7814", - "ecf3 0cb2 261b 3bd1 5f22 c2f5 4e90 d1d6", - "1f2f 4d01 aee4 8a3b 04c7 b1a7 7557 1d7e", -}; - -static const char *keys_096_6 = { - "ca51 4809 04ec 2415 bb26 dd7d e927 3ef1", - "6a44 08d8 30bb c0a8 ab9b fe97 b4a3 41b8", - "c1bc 3d39 7579 2755 c7a7 0825 93e3 b42b", - "ab20 feaf 4268 48b1 b946 61d6 b9e4 5aea", - "da38 81e8 13e8 0b3b df48 2230 491c e973", - "d016 ea65 9110 2a9e cd78 d916 7b98 f4bb", - "d71d d56e 47ab 820d 3e2f 384e 7e6c b864", - "e43b 59b1 687f bda2 0b65 78ea bfd7 43b6", - "216f 2bf3 5f78 f9a2 ed42 495a 8649 ff3d", - "def4 46c0 c9be b07a 4166 1882 4a0b 032b", - "97dc d2cb b336 31c9 f50a 54c3 9249 37de", - "f226 7955 3c3d 7322 b354 5b39 26fd 5f5b", - "55ff bd4f 0626 9d57 44a1 7989 b717 7fc1", - "3f84 3b70 88bb 9cb0 f1af 71d7 653d 8a27", - "ff7f eea2 f128 5cf8 1d55 6dc7 88e4 96ae", - "bb77 eb02 35be 2856 42ac 5198 87ed 9e65", - "78e4 55ac c116 9a09 f010 7177 63fb 2556", - "20af 1d32 f5dc a674 bf0b d0eb 0ce7 ba27", - "741e 144c e7d5 6017 033c 8035 ba4c 271e", - "839f 7a68 30c0 8119 80b5 00ce 1f47 2a4e", - "49a2 5e0b 2c25 8fc9 b837 a30d 5d60 7c67", - "88e8 a3b2 a8cd 3bdf 9695 bb4b 4cce 6137", - "394d 4e34 c77e 4c94 17f9 030d df2e 2a2e", - "6fe4 cc5b 87db 9631 e69b a1dc 48da a41a", - "9a51 24dd 2024 b470 3131 2c2f f14c c289", - "3c03 6fac 146d f9f8 0ae4 fd2c 3ac9 594f", - "e25d edc1 5229 2984 fa4b d45f e79c fe84", - "3782 c665 d5d9 4055 d1c7 8aa2 9723 0b04", - "587d 2f6f a442 d49f 8de3 af20 a7c8 ac20", -}; - -static const char *keys_096_7 = { - "c75f 6c38 449c fb4d 7636 58b0 5b48 a977", - "04f8 bb8b 3a87 015a e019 506f 02cf e458", - "fa6a e76c d3bb a724 4132 4b8e 917e 102c", - "de57 24d2 691d 5e14 bce3 bb1e 55ee b852", - "f5d2 625b 19c2 6c82 9ee0 859f c55b faed", - "6f56 d29c 9f50 365c 87d8 ce38 ba58 96a0", - "27a8 c873 187c ab36 d8a7 f26e 848d dabb", - "8240 ceba 9a61 9133 872e 7cbb 1ff7 3c44", - "c174 550d ebdf bbc4 fd6e a90e c37a 3ade", - "cedc 9c8c e3cc 320b 4d27 cb50 91c9 e711", - "de55 4003 91fb 4c85 ac25 70fa d129 f6c6", - "5329 12d3 d43e 7747 5ff3 8c16 41b3 2234", - "dea9 6231 7068 7079 dfd8 241d b0fc 69f7", - "bdc2 3f85 9ed8 9208 4508 9fdc 68ae 0772", - "5bd4 fcf2 e7b8 abee f0a2 26ef 59d1 f502", - "0664 ffe6 8605 8eb2 6978 bb32 4e35 eabf", - "3787 d073 e6bc 7ee4 bc83 721e 9987 302e", - "22d3 cc29 ba7e 7457 af72 9036 2de6 bc62", - "2b78 c4ca 4a82 3c1e 8fd8 7913 4e70 a56d", - "50af 1568 02fc 694f 7486 6c4d 8610 b536", - "a4f8 a838 686f 1bdc 2fd7 d4cc 59f7 9c0e", - "0424 595c 7e43 4d4a c293 2dea 836a a370", - "d659 2830 a507 9555 c2c3 9226 aae2 d8dd", - "eac6 4e0d 25b5 4547 b92d 042c 5ae6 b34e", - "8d3c ab1c a0aa 0f1e cd4a 301d 97c3 f4c4", - "57b6 f87c ec89 67f3 633e 82bf e7e7 3e54", - "e8ba 7daf cb5b 3782 b816 98fa 179c ee6b", - "7ec0 052b 954e cfd7 1605 e95c fa86 61de", -}; - -static const char *keys_096_9 = { - "31cc 4700 848d c284 9cfb 3b07 90ab fcdf", - "b007 033e 0d60 654d 363a df32 011a d9ad", - "5bfa 8fc4 a84b b0ca 6b90 1317 e83e 6c4c", - "d183 2611 5aaf 6e50 3aac a1c7 c442 2067", - "dac1 79f3 00de 0863 a850 eabf 68f5 c0cc", - "e580 c16f 4671 b302 787e 11fd 6158 760d", - "6287 ebac 1dac d3cd 423d 758a 8c50 597f", - "edd2 3a2b a8ed a723 4106 1a7e c1c2 2be4", - "1fa5 413d 5f60 0eee fdb0 f8e4 472b bdd8", - "ffb5 7f2b 6471 7383 0221 8f4e fcae 130b", - "d646 cd74 9113 cbf9 63fe e112 f381 a99c", - "3dea 1811 a527 8f91 9dd6 460b 9bd4 2275", - "2e09 d0ac 60d0 8845 a4af 1d42 61cd d9a8", - "155e 4184 f7c4 8f45 9595 acfe 2cdc 6825", - "9ba5 0bc5 fe6e 9a51 3590 e824 f364 8cbd", - "acd2 4eb7 a1b2 d3b8 b964 c884 9bc8 4146", - "b07e 2821 0957 b3bc 01fa fbc9 d986 89c0", - "6d99 7fd9 2d53 6851 245f ba7e a83d 5a1e", - "8b9e 93c4 5e84 2406 acdd 4694 1d8e 78c5", - "501a 7d93 f23d be6e cad9 a393 7828 708f", - "69a8 2f26 815e 85a6 4644 b8ef 4d73 29d9", - "9e89 752f f75b fefe 6505 49f2 6917 64cc", - "a7e8 de06 d209 0826 f4fe ea1e 8ad7 6e5e", - "8d34 33d2 c747 37db f2fd 910b 0006 cfeb", - "618c 89aa 8da2 0d95 beb3 f4db 26a6 fae8", - "9fbd 8d71 4550 187f 746e f286 10d4 5949", - "aff6 b206 55f7 10b9 cb97 d8cf ed23 409f", - "a348 1223 26ab e9ba a4e1 ee9d 54a2 46be", -}; - static const char *keys_097_0 = { "1cf5 88ac a6a8 f440 8278 842c 6952 931b", "04cc 6a81 9bbb fadd 396a d06c 148e 6b64", @@ -464,78 +222,476 @@ "4719 d106 18ba e037 3040 f1fa f19d fea9", }; +static const char *keys_098_3 = { + "04b5 8d0a b3b9 59b9 8113 5dab 53ab 6c7d", + "522a 3d32 f9ef be3d 20fc a797 6834 85ed", + "878d 2e7a f1bc ebfc b60e 99d8 df3f 983a", + "876c 71b5 07b6 55bb 0453 2f89 d59f 8803", + "fa44 34aa a0f3 6763 9845 afed c961 5034", + "c3c7 bbb9 fc77 858a b175 e257 b437 e6f6", + "58dd 513d 0aa1 3e04 7638 9803 acfb 869a", + "d93a 806a 9740 a162 7ac5 25d2 e20c 03bf", + "0c58 bbd7 e60f ca7b fc0a 814c 6628 0db2", + "4ec7 4839 75d8 4657 9b9c ee47 eab0 22d4", + "a253 8772 8555 7134 7df5 e353 1567 9f92", + "7a00 7d25 1936 95f3 f01a 47f3 1c3b 4c6c", + "66a9 9fcc 5fbb 100b d397 79a9 6b82 70a6", + "37bc 0e47 5838 a33c d91e 88e5 322e 7ab8", + "b930 87df 027e 8971 9a8e 1bee 4034 59cf", + "5b75 cf63 b8c4 7c40 e7f3 cd0b 8900 092b", + "82ba 6d10 61a9 fb9b b53a 0a8d eca2 c42a", + "9282 b83b c214 2648 1fd6 e4ed 3a99 f896", + "5590 b2a2 f8a2 2235 6cef 7073 1841 eb4b", + "5470 bd80 3d7a 33c2 b490 3caf e9d0 dbd2", + "1dc8 334e 10ad c0c3 3639 7b8b 4eb5 ad09", + "3280 5c30 acf4 239a cee3 cd5c 4fe8 6155", + "d78b 9d1d 6da2 9f2d bf9f 4fdc 317f 4ae2", + "d442 08fb e0e5 f419 498f 0055 5878 5c32", + "d92d 62d9 303e 3180 bf4f 2a82 f1c1 09ec", + "60d3 a2b2 f713 8859 8232 b163 e808 8de6", + "6cc1 f2d0 b9c6 25be e62c a64b 2c1e 8b5c", + "0cb7 2795 f88d 77d3 0dd5 d978 a818 1253", +}; + +static const char *keys_098_4 = { + "1a94 ebfa bce6 1878 3dfe d484 62ab 20ef", + "f1f6 8df3 fa99 8805 c248 c008 e793 11eb", + "c785 e618 7a5f e3d1 1a02 483a d334 e706", + "8213 787a 5ce4 a016 84aa 8147 c3c0 10a8", + "0916 b1d0 6e33 6746 dda7 4980 50f3 4786", + "0699 29ec 7855 0952 0301 4676 4db3 0efe", + "0c9f 34f2 bb70 73b7 6115 777e 3339 ede0", + "fa09 d4b4 19d5 f151 6057 8da5 a18f c38a", + "4e7e 84c1 4b72 cdbf 1b20 4267 a877 4262", + "ea85 070f d6c6 4c52 aaad f375 6b68 59f7", + "06c5 ac96 f7c9 2de3 3c16 9b6e 5e04 2c82", + "f8d6 981f 83b8 9fde fc4d 1d5b 2e52 2186", + "9b38 2bec 6740 009a 8a4b 143f d786 c6f9", + "3617 bff5 b5b6 86e6 bf0c 0560 3372 577b", + "088f fd18 1a6f b22f 9db3 3419 196d 4544", + "f3aa 2b69 0567 6193 0c14 a331 82dc be14", + "0d66 0ab5 bd7d 9174 ede8 2b53 31f5 74b8", + "a66f 698a 6514 760f 6e37 6de3 237a 40a1", + "24de 4a61 90f4 eba3 ba42 7a09 1fa4 69db", + "3996 3984 cca8 cfab 28df 5af0 5576 3bf7", + "8a8a a3fe 0950 3346 848d 388a aaf5 5b0a", + "82ca de6a 9485 2655 3b0a c67a f02e 0543", + "8ddf 1a8c 5b96 d7e0 e43e 63cb 04c3 dc8d", + "d4bf dd41 c177 6ae1 fc7f dbf4 4d16 d93d", + "34e8 5a53 e51e b7dd e3d8 8965 6888 6998", + "4566 2c9b c0ff 06ee 2d65 8037 8ad6 d0d2", + "eb20 c9dc 68fa 1176 a138 20d6 befa fec5", + "aeed 4f98 40ca 8dfa 3488 d8c4 6b70 92c7", +}; + +static const char *keys_100_0 = { + "b6e8 a799 db61 cbe8 ce60 1438 a3c0 31ab", + "6f8c 91be f9df b352 cce4 a837 ce3b 73a2", + "2c61 cb7b e7c7 613f b020 17ac cad1 899f", + "bda1 e42e 8d26 f98a bb37 8b3a fe33 9de2", + "612a 8eea af18 3792 aec1 42dd d242 53c7", + "7ebf 027a c5a3 8cf2 19d7 17ae 1ac3 4d48", + "de52 5dc9 1130 059e a7e3 5994 bd17 99a4", + "f27e 75d7 b23f 20b7 ba72 bde7 6b05 6513", + "377f 9f2a 049e 8410 57fb edf9 e67e 80e0", + "48cc 202c eaf1 a7eb 0ae9 d2b1 1f40 a333", + "05b4 e02f 8369 8712 e31a 3a2f 8f9b 8a65", + "0290 e4a5 bcb8 795e 31e7 5cd3 e73a 3a0b", + "7781 c375 0d49 d4d5 175a 7c69 fcf6 d345", + "c2be 1fb2 1056 6ea7 0299 d8f7 8cfa bdd8", + "91b1 e043 eb64 4ed4 b195 0967 623c 5532", + "cf11 65f8 2688 9e26 b0b4 c75a 2eec 4ca9", + "e9a3 ec87 e160 2783 0de9 df46 b1b5 952f", + "ce27 deba 3d8b a62f 1940 77b7 4a54 e281", + "30ac 305f 1ec6 cf78 8e76 d47b 4a1b d291", + "4b4e 899d c18c 4b71 c621 a6e3 6740 4993", + "0094 fcab 5cd6 5b5f 91e9 9829 5fdd 930b", + "3d6f 2ec5 f111 f18b fe59 1aa8 7cd6 b444", + "b88f 9d67 d687 3355 0ada 0631 3b6d 6a3d", + "41f2 d33f d88a f371 6c11 feaa 83c2 f964", + "a525 93a8 ade7 49fa 3e76 bcf2 ccc8 f043", + "df6d b945 a6ff 14f6 2963 1795 ea92 266d", + "7271 5313 f59d f0da 343d b348 2089 c717", + "0ce6 7dd0 5a41 7f37 a7fd 1a81 c77e 2f89", + "c14b 2928 a554 d0db d921 45ce 91b7 7dd8", +}; + +static const char *keys_100_1 = { + "d8d4 9d20 bfdb b0c4 16a0 5295 be08 1b85", + "0644 874b 1c69 38e6 4d9a aef7 6290 ca51", + "32ca 7a16 e87c ae50 43cd b55f e8df 55de", + "769e 0046 b99a 1377 b955 8969 f643 9169", + "6f17 f2fa cec5 8276 9ac0 04bc c834 d339", + "4e81 3e42 ff1f 9d55 b201 a3eb a521 3ea9", + "319f c22f 1a55 9e8c 646c 6275 0beb 166b", + "2907 4301 9ea6 bb77 ad8e 1772 e0e0 67b7", + "0a65 44ed 2016 5889 39d1 93f7 c998 fdf8", + "291f f564 1853 eb1d c242 6918 361d 56c1", + "69fe 41b6 cf04 0e28 2d7e 1d1b be21 a88e", + "0819 a7e0 f5c6 c596 0524 d826 3e39 8e12", + "bd56 2ece ca17 966f 4bcc 34c9 770d 0227", + "44b8 2e27 fba9 88c5 a693 1f6d 7219 7dd4", + "5ab2 1203 ac8e a0e8 d493 27c1 9da8 f6ff", + "1aab 5cdb a0ea 3a04 9c7a c72b 00c8 0ba9", + "9fc8 0038 a170 b822 3e9c a53f 1eb2 4f44", + "bd8c 2065 f363 ccdb 5976 36b5 0066 e02c", + "07df 6ea9 4b11 3fe2 138a 89d7 6439 457d", + "363c 5617 e66b 2a99 a33e f868 e694 9bd3", + "8cb4 7d83 8e67 55f8 8890 2762 f374 951d", + "99d6 00ef ec4d 8f80 5fb0 71c3 8967 c64e", + "26f0 b2cc bff1 8ea8 f39d 5cd8 4873 adce", + "953c 3fb1 4f9c 6390 9657 1596 2a31 e287", + "c596 de71 7e6e a5a6 7727 6db4 90f8 338f", + "8d33 5aa8 36ec 8117 e0fb c02e 296b a65a", + "c40a 619a b29d d17e 6100 e982 4dca 364e", + "75e4 4d2d 3533 d462 6846 52be d9d7 c12d", + "c831 6dc0 2434 f793 4ae2 ba68 37c6 ae9c", +}; + +static const char *keys_101_0 = { + "0e52 1f9e 9175 3956 c50c ea12 2c04 8571", + "6935 29db 10f5 2457 9f50 7db6 5835 6706", + "c584 2380 e246 5ab5 5869 5cad 717d 1b66", + "2f6f 8f86 35a5 3b45 a082 c980 bbd3 b11b", + "e19f 2759 ce8a 20db 5d63 6144 8b3d 9ca3", + "8768 9271 bd23 80be ff99 036a b29c fc0b", + "b907 d822 b334 6d60 6abf aba1 d27a d813", + "88d9 096a 5caf b555 08b6 d0aa 8bca ca3d", + "f385 2ffb 2e4c 3c67 5c4c 654f 5566 bb3a", + "c5cf 6783 e701 5c8f ea15 d6d4 6bd9 aba9", + "e761 a010 c248 1d55 baeb a273 a745 e8f8", + "c427 5bd7 a45d a5e6 79b9 d454 5ad4 51ad", + "665a 811f 57d6 fbf4 0d6c e5f8 278d 1e52", + "a31b 4b67 741f f021 cf3f 9c8c d001 7128", + "5758 7c97 7b7d f10d c985 af97 477f 44b6", + "a319 d8ad 5e65 6920 e548 05c8 715c 3fe5", + "7683 61c1 1b54 581d 185e 6675 d325 fa72", + "7136 394a b039 c5ee a361 28df 157d 6d39", + "321a 6d8a 7d4f deb0 e41c 67df 2d46 616e", + "f55e a8be ae4a 8f43 20de 89bf e39f 7b90", + "76e0 bd5e f08f 5ee1 9d45 aa9f 4c25 c9fb", + "fdf7 8827 d862 284a e929 194f 8e40 292e", + "a85b e9bd 8de0 c4ee 3397 cc7b cf9b a2e0", + "48b2 22d5 993a 53f5 1c41 2211 f8ab 8aeb", + "9b16 317b 42d1 a718 f330 a0d8 7a4e 2df1", + "8fd2 ac5e 7e4a 3451 d101 43d3 d2bf c943", + "a708 ad13 754d 6735 b9f3 137f a7e4 63d1", + "21d8 66c6 dbc3 49e7 3141 e11b f869 95bf", +}; + +static const char *keys_101_1 = { + "b5c5 bd25 df65 7faa 1216 956c 2558 c058", + "3530 cf03 72fa 7ccc 7eda aaa5 7e78 1da3", + "5a7d 2588 20d9 cfc4 c9ff b40c 237a a652", + "f8cb 44b2 cd14 725b 9a95 ac71 62a2 45e6", + "a5d5 2775 6bbb 0ccc 0d80 9ecd 0e7e 100a", + "916a d1d1 1b04 2696 8ce8 dd7e 6322 f423", + "01e9 13df 3323 dace 35ca a05b 84fd 1be6", + "1ce5 854f ef94 a460 de7d cc0b 0a80 37de", + "bee6 411d 02dc 2419 554c 2076 bd62 668f", + "fcdf f558 3924 a001 d92b 5619 6ec7 9995", + "fa96 d817 60e0 7a99 7161 085d 182b 1085", + "e3cd 6301 5750 f263 c260 6ce3 6c2a 6634", + "8298 0b87 8215 6f6f d270 d811 8d75 21eb", + "2675 df59 4f9b 8680 efdd a2dc 605f 3b60", + "d45e 32d4 d5a8 248d ae95 9df9 87c2 213c", + "5562 ebb4 2c0e 8ee1 990e 16c1 e856 be61", + "10f7 cc2a 1e9a 82b0 508b 8658 a687 2b5d", + "b562 070c 4abf d10e ed89 68f2 f924 e9c7", + "581b f25a 67f1 e35d 1bf3 aec7 de88 48c1", + "8b7a e5fa 4221 528b ebb3 d25f d5ae 17d8", + "514c ec66 e6b3 9b32 3a93 d336 6711 96a0", + "bf33 db03 5267 e9b8 2736 e1d2 95d7 14aa", + "d5f2 035a ed75 6698 43f0 330a 8d5d 5771", + "9c6c 232a 8b37 3b45 d192 aa19 2f0a 5855", + "dd5c e4ec 4b5e 63c2 48eb 5a50 d622 0e82", + "ad1e ecbe eb9b 3762 d1b7 ba31 27cf e585", + "b3ce b544 82a7 711b d8e9 36c4 2152 269d", + "2547 4731 9fbd 4c83 e58a aa5b f401 c0e8", +}; + +static const char *keys_101_2 = { + "5475 43e8 a2ca 1404 f2d9 df56 2feb 70eb", + "53ab ae62 458a e08a c3fc 49e0 f94e 7aff", + "6493 d9ac 61e7 9a3a e1ab abc7 95f6 2072", + "6f79 2aac e10c ebdb 1e9f e9c3 0df9 4b2b", + "78db 1395 8bea 63a3 933f 1760 7860 d480", + "e4d2 40a9 a4a3 fc73 5dfa 3f56 15f7 254a", + "70f6 3795 1a4e 7e32 74bc bfc6 366c b889", + "fc10 b6c8 1f52 3134 531b 62e0 150b 6101", + "02ab c0b8 1bd2 6cea 3fd0 c191 ecc4 0262", + "e41b 3732 d070 ae4b ac4b c36b 176f 0a03", + "0de1 e1bb 4dd0 81a1 5365 cf5c d358 d7ba", + "c0bc b0fd 762b 773a a85b 21c8 2af0 f797", + "405d 4997 01db e436 ba6e 2222 cc28 9b6d", + "2ab5 245e aaee d65d 92f0 c65a b08c d636", + "ff11 3970 246c ee6e a00d 4ebd 54c0 ca31", + "c5a9 63a7 28da b2d2 8d3b a63e 0957 cf7a", + "d4f0 a55a 0ea6 100c 7062 cd93 a886 e802", + "49c9 76e6 f907 5b02 46de 70f9 236e 828d", + "d1f6 91e2 7f5a e8d8 2ebe 754e 2041 31cc", + "4467 80bb 0874 6e60 d3a2 d12f 37cd eb8b", + "9a5a 6ddb 440b f584 8a7d fdd0 a026 8c05", + "635d 9f51 d228 70bf bdba 995f f360 4171", + "e7a7 b9d3 a02c b0e6 a66d 9aef aeb4 187d", + "989c 1c07 ebc0 a635 4a4f 2bf5 305c cb0f", + "790d 7a2c c570 3856 8d79 6909 3479 85de", + "373b 7f3e c464 de1e a6c9 a0b0 c810 20b0", + "de00 19a9 8674 2c20 789f f688 d721 2a23", + "e351 701b 3cac f6d3 37b3 7052 2b64 f64c", +}; + +static const char *keys_101_3 = { + "be45 6d2e b759 55b8 0616 85b4 6efe 829e", + "4003 5f01 b4a2 3026 23ef 6bbf d221 955c", + "8e58 304c 6aa7 7ffb 0a5a 89f7 3384 3735", + "1176 4ef2 e01d 5256 0d98 92e4 3bdd 6d59", + "d2e3 d4db 4752 263f bfc5 ecc5 2268 ee26", + "b349 5c28 6217 57da 0c18 6372 fa89 99f7", + "7f87 fce2 7d76 5b5b 863a 2bbd 1db9 b3bf", + "b161 dca9 e137 c304 fbae 867e b816 68b3", + "d8ac b802 e14d ad55 14fa 2c91 6b01 fd40", + "a10e c052 1e95 627c 70b9 0975 38d9 82c5", + "338e 9ad5 4949 c9ca a87b 7ee1 abe9 780b", + "9179 88e8 82ed e94e 2bc9 dd04 a6ca fae7", + "856b b3a8 2f28 9b4d 7e96 4675 4d42 2096", + "8b1f eac3 1c28 023c 757d 539c 493c 7935", + "b222 4f2b 6d93 a501 0f8c 3e95 614d 84cf", + "b7de 80b5 a08d d9e5 c9fa 530a 96ee c1cb", + "7c52 4279 bcfb c2fb 65eb 7a75 13c3 0b7a", + "c6b9 14cc 0738 b907 372b 5f16 e6c6 46d6", + "a392 0388 295a 0eba 3546 2c0d 3fdf 8fb8", + "9d2a 0362 60fb 3881 ef6e 3261 094f 2cdd", + "f1ea 482e 8b57 d3b6 8d71 15fb 9e2b 4d93", + "cf84 15c5 00c8 7232 e35b 707c e21e be62", + "a79f 219f adda bf80 e00b cef9 5991 6674", + "cdf9 0894 103e 9f32 fe12 3779 671b c4ee", + "3553 c1f0 2c52 ed5d 8933 28b2 2e82 5bdf", + "16ef 4da0 76b0 10eb cb8e 4c73 dead a6c6", + "c4c9 c157 2f92 8df7 bf67 70cb e8a8 1e41", + "ec54 de4b 6290 152e 3e4f 3a7e 225b d9bf", +}; + +static const char *keys_101_4 = { + "58fc e374 b0bb 6513 e300 bbc2 d6fe c15d", + "aa0c 2ec1 4704 284e 6342 12cc 05aa 678f", + "ec54 b643 d0d7 631e b76c 0d71 4c5b 7476", + "766e 1c8f a71c 03d6 c611 6e29 b0e5 97fe", + "e4b0 0719 1e4a b4d4 5f91 fa95 91c4 a9e2", + "ad25 ef5e d04a bb02 5c9d dfeb 3d0b a088", + "7058 eea1 6f08 e792 b904 87ed 6702 968d", + "b1a7 1ba5 0eee da59 c434 36a7 904c d43f", + "c44f 63dd e8eb d380 2859 f4d0 2a5e 5500", + "e2e2 4b89 1a6b c2d2 9e1b 22eb de4e 41a4", + "0fd1 6eb7 fd7c 6b4b c021 b5b5 c913 0553", + "a41a e6ef 8da3 d109 f253 1a10 139d 39ce", + "721e da21 b10c 43a6 ecce ab57 6b73 e231", + "14a3 0b58 ca81 053a 8fe0 cce4 c8c6 7f1b", + "2be9 a5e3 a3ad 1990 058f d116 d3eb 9f5c", + "622b c7d9 247d f8a8 fb4d 963a 8797 ee18", + "b12d 9e6a eb8e 5df8 0b3c 57f6 52c6 5b43", + "6233 2f0a 8e46 c3a9 526b 6b56 92e3 3c12", + "8db5 5af8 9527 ea2b 1f22 8a70 bcc8 621a", + "e55a 223d 23f7 ed62 c381 3f7c b151 9d28", + "92b5 626f d69f c011 ade4 ac57 d8ea 2e37", + "7881 c4b7 cf45 8484 e735 f6f0 71a8 1ffe", + "7788 755d aeb5 f875 be16 6587 1dd0 3e01", + "fe56 c9c3 b194 da09 bbf8 25be 5f2b e2da", + "c2f3 f1ff 580b efa4 1e0c 30dd 7478 fc20", + "73b1 97b0 dc00 f43d 8327 9c56 0369 51a8", + "60a0 3f09 e110 1812 3dde 75e8 6402 f5f0", + "c0c9 b75a df8f 784b 2ff3 7a25 f175 03f5", +}; + +static const char *keys_101_5 = { + "2b70 9d92 a693 86c1 a5b3 a55b c55e 48a9", + "e118 e30a f9ef 1a31 5e22 c8cb 9cc4 d3f8", + "75af 1193 e9b3 64d7 6150 2531 6f07 e23a", + "2920 8768 b211 a247 2f78 7456 dd24 9849", + "25fc a295 fcb2 3147 13d4 4210 ee2b 45f5", + "e76d 1a8a 929c 4382 8aee 4e56 fe65 d9dc", + "d4a8 405c 9f07 09f8 ae6b e8e4 783e 0328", + "6b3a fdbd 50ec f9f4 1ee1 7e49 df0b 49e0", + "d11a a613 be62 2a55 ed82 5a28 d4e9 0763", + "45f8 cb52 ddad 22e7 f9b7 0124 d0e8 bbe3", + "0ed3 8f13 62e1 b68c 83ea 9824 d919 8776", + "f331 1edb c576 dd92 b12d 7b6f 2064 6b36", + "5db1 a911 77b0 9c20 3350 5001 8856 0b9c", + "08d6 b62b 8c35 a7d4 dfba a18e faee efee", + "d7f4 4df4 dfdb 7ef3 2dff bc45 614c 527e", + "66dd 661d eef6 3c4d cc36 464e 9c13 a847", + "c2b6 2207 773a 6d01 8d84 ad4c 5ae0 07c4", + "4b58 8da5 3fa5 128f 5d73 b019 cb0b 46ca", + "6aab 3555 605b 5b93 e093 3db9 bc1e 631a", + "9b10 ec1d ac5b 5e39 6e97 33e3 3a02 1c04", + "95b5 b829 3533 4897 c2b3 24a3 0c31 3354", + "7310 5672 717c 10f1 6dd1 90e5 c533 4b80", + "b0a7 5c33 01dc 042e fd9e 4f00 ca27 4426", + "b450 430b 9e63 a101 e05f dfb6 7e45 10cf", + "ab14 6c74 2781 1e6f b558 0970 c7ed 50dc", + "fe89 9f1d 8a2e 10d6 1cc1 1094 8177 c3fc", + "b1c3 3046 2613 c585 a1fa 8701 6573 a37a", + "ca0e 8b49 2c8b 961a 9244 bcff 122d be09", +}; + +static const char *keys_101_6 = { + "cf46 9775 89cb 1e4c 0759 782a 9e10 e247", + "284d 5536 1f38 6c13 2126 edea 88b5 bda2", + "557e 0a96 fcc8 9a9a 13d8 318c 9e70 1146", + "8ff9 f0b7 54c2 8778 518d b63a 5439 1871", + "7403 cf6d c8a2 3450 9907 a6da bcca e8b5", + "678e 0731 3b49 ae9d 391b b08b 44c7 2017", + "a6bd 0a6a 6810 ab1d dc8b 8c16 a569 7382", + "c6d9 e370 2c69 3d37 4c23 fe8c 75b2 7be8", + "4037 846c 1285 9b6c 3bdd e181 03ba eee6", + "2314 bc87 25fb 9c7e d157 97c2 2162 3142", + "1942 d882 5b81 912d 62a3 4911 85db 4f3f", + "5790 62e5 8d93 6356 0834 6702 f2fe 6526", + "d0fe fc39 a6bd 568f 654c a1a5 780e 974b", + "dd10 e11c 5e63 ec6b 06b3 9fe1 173f c04f", + "b7b7 a969 e4e2 e900 3276 7478 a145 ebd6", + "9f91 382e cd2f 367c 28f6 dd41 d95a c089", + "5a96 a120 c008 702a 5657 8e13 af17 ba3b", + "c585 944d 96e5 e85c ff21 7fb7 855d 7902", + "5b8b 4752 7b9a 4280 cbf8 5561 5900 58a9", + "8a89 db36 0c73 ff68 38d0 3d9b a3da 37d4", + "3278 6ce0 e520 badb adc8 4f7e 39af 382e", + "8dfe aea3 1438 88c6 1033 1a7b c8b1 4733", + "21c1 a537 3b0c ed60 f4a0 71b4 760d 26ac", + "be79 dca9 0dfc 6ba7 3eb6 9fdc 0072 eb87", + "fc72 ae20 cb31 8ba1 5c91 5666 3623 16d4", + "a7b2 db48 42ae b6ea 2ad9 45a8 2da8 99ed", + "4274 7dc8 3b36 67c0 4b98 07e7 161f dc2e", + "e113 e05c f75d b6f8 61f8 62d6 be68 c138", +}; + +static const char *keys_101_7 = { + "0d3c 02a2 5e56 5f39 609b 7c85 e272 1946", + "f854 c268 4afb 5c4b dacc 15ba 28af f140", + "db35 3ea8 0ee9 e3de 54ab 7cd5 3aee 1678", + "a5ee c97c a65c 80ed eab0 5016 259d 7d0b", + "1924 abc5 eeba 420b 8519 e792 1f0d b066", + "104c 2d53 18cb 479b 32ff a21d 8b8e 932c", + "bb49 419c efac 3a45 e9b5 ca2a ccd1 11a6", + "4d54 3aa7 c2f8 2c05 655a 8dff 82c2 a413", + "a845 4771 9c15 b101 b4fb c8a9 cff1 9f5a", + "7fb8 1f13 f6dc b1bd a78f f97e 0280 21d8", + "7ac2 b366 c007 0f08 c767 f33e e820 a60e", + "2aba 8da6 35da 0e57 d63e f082 adb4 bcf6", + "50bb 9dd2 b9d3 9643 836f b825 d91c c8b1", + "1d74 f303 a08c 2c0e bbdb 787b 82d1 1ec8", + "0518 0d55 4bd9 c226 6126 bde8 ddd5 49c6", + "17fa 7242 7d8b a5e2 ef7f fc53 471e c6a8", + "f661 ddd6 9cad ea22 0ce2 7365 6a8e f0b3", + "6947 1c7b eaf4 c15b 1ca4 2d7f 3432 6a00", + "da13 d844 2f5f 1da8 36e1 7a30 6e5f 2153", + "cc7f bf19 58ca 9a9f d83c b7c5 83de a1d2", + "c53d cfcd 5c3c 9aac d956 fd41 f355 a401", + "bf8c db79 352c 7d2b 4070 c82f 5fe3 aeed", + "a9db 8e75 c3c7 ba9d 8d57 56cc f933 80d0", + "f7a2 0627 6d71 5e34 b4c0 3430 73c6 061f", + "607a 89c4 9f7d 306c a42a 268a 0cab d32d", + "8254 5734 1ba1 da50 07d6 0a99 2219 8a2a", + "ebbc 6e73 663c 18ef f93e c9a0 e420 6231", + "ed20 5683 365b 1481 f1be ad4c 5e5f 3a76", +}; + +static const char *keys_101_8 = { + "b841 e964 b9bb d36a cfed 48fa 82d8 8b39", + "c4ec 3dfc 8d64 14d0 e2b2 631d b00e 2822", + "cc4b f15f ad23 d370 ad7f b35c 655b d997", + "8ac3 199e e48d 18bc 1031 3a82 5cff 2e95", + "9772 121f 5d38 673f e217 401e f5dd 778d", + "3e79 2f5f e996 c44d 7c70 1531 f2be 42ce", + "3700 dc67 4644 7fb1 c673 2e06 e1ad 4715", + "a933 22f5 3f8f db8c d51c ff14 bd5e 211b", + "326f 5d87 185e 9e57 5808 1465 cd22 785a", + "290d 2617 d178 710d 4a32 3893 6720 d1c7", + "93a4 f75b d71c 633e bd54 85eb b5f5 dc5c", + "7683 9fce 1b67 9b00 53b0 6967 2e81 de72", + "01ab db4f 7835 fb94 f266 2a67 6565 086f", + "b139 e53b 2f1f c8a4 0f39 3a22 1961 674d", + "97e3 2231 1063 f2fc 299f e743 4b6f 5c50", + "e44a 5024 28c6 55e1 8110 51be 7e76 9cb4", + "a116 536a 739c d813 f87c 9986 33da 37b1", + "7add de37 e523 e423 3e71 25b6 e69f 62e7", + "f7c0 fa9e b05b a953 4a65 9e41 d576 1929", + "5f31 dec1 254a 57d0 74ab 96d1 6ff5 28f3", + "dd3a 6f81 7e55 536e dbc8 7561 a4e4 11f2", + "e3fc e69b 96bc 706a b35f fa5a 2ee9 6681", + "5f69 115a e6cf 05ba ef32 17ad 03e2 9545", + "317a 300c ccad 524e b740 9103 77a6 98ae", + "d475 28e5 9fc0 4cd4 7865 b72a 12c9 d0d0", + "96e6 b914 cf60 2826 8d0b f074 29af 7d41", + "d733 1588 0df3 7421 e961 28d1 024a 166c", + "645a f525 9f98 7838 5beb eb45 06b4 dd52", +}; + +static const char *keys_101_9 = { + "0e6f 2f6d 8da7 cb51 2a7d eb89 0922 9cd6", + "403c 3714 199e 8813 e207 d01b 940d e437", + "625a e6c5 5d1f e26b d419 f5e9 05bf f9b9", + "041a 27b8 3d17 b670 a9af 4777 6bbc be00", + "f7f3 bb5f efb5 c3ae ec4f 5c69 1cdf df27", + "2e94 be67 f27f d02d 7eb2 6652 84c3 a341", + "d912 c05c 4d11 d5da 5c2a 25d0 80c3 74f3", + "0033 a4e7 b00b 1c54 87c0 3e6f a319 709c", + "e12d 8b7c 5b39 81e9 6159 8d7a 114a 91fe", + "1575 36a3 4232 66b4 4a06 bd7c 4cc5 e479", + "83dc 334c 3231 2cf9 9d0c 8f8e 84c7 2f48", + "8c27 8287 aeb0 1ce7 39bb 9494 8c1f b58e", + "4f21 faf4 fb61 8b6c 7596 df7f 07e2 30d3", + "fd8e 3a57 9526 1665 6f8b 0355 f0b7 0a9d", + "06b3 ecdd a6f9 9041 b237 de69 096c b912", + "b0aa 033d b7a4 3f5b 5eda d3b8 f07b 0520", + "8ee5 423e 6c67 465c 3cb7 a165 ec64 e4aa", + "a838 a2f8 3129 2ddb 3045 72c0 b859 dd8f", + "902c 4a02 d79b fbfa b98f d88e e52b 8772", + "2c3a dc95 58b3 51e9 5d83 6644 0cc5 f669", + "8f08 629d 0145 183f 9435 267b fbe7 773e", + "aa91 2e8b 10a4 9f1c 051d 801b 8f61 19f5", + "009d 7610 f444 fec6 6dcf db47 74bf 0e52", + "2214 b567 0734 8577 003b 7cea d5b2 9371", + "7758 074e b632 d84a e463 2cda bda2 2cd6", + "4609 1c68 dfd8 8eb7 a551 103f 5bb9 93ff", + "cf8b 4db0 af43 c5ae 5053 a833 7926 9f21", + "86e1 e20b 5edd 3261 10d1 7912 6686 ba90", +}; + +#define KEYS(x) keys_ ## x, N_ITEMS(keys_ ## x) + /** * Describes the keys to use depending on the version. */ struct tokkey { version_t ver; /**< Version number */ const char **keys; /**< Keys to use */ - guint count; /**< Amount of keys defined */ + uint count; /**< Amount of keys defined */ } token_keys = { - /* Keep this array sorted by increasing timestamp */ - { - { 0, 96, 0, '\0', 0, 0, 1138057200 }, /* 2006-01-24 */ - keys_096, G_N_ELEMENTS(keys_096), - }, - { - { 0, 96, 1, '\0', 0, 0, 1140562800 }, /* 2006-02-22 */ - keys_096_1, G_N_ELEMENTS(keys_096_1), - }, - { - { 0, 96, 2, '\0', 0, 0, 1161025877 }, /* 2006-10-16 */ - keys_096_2, G_N_ELEMENTS(keys_096_2), - }, - { - { 0, 96, 3, '\0', 0, 0, 1163108781 }, /* 2006-11-09 */ - keys_096_3, G_N_ELEMENTS(keys_096_3), - }, - { - { 0, 96, 4, '\0', 0, 0, 1183775000 }, /* 2007-07-07 */ - keys_096_4, G_N_ELEMENTS(keys_096_4), - }, - { - { 0, 96, 5, '\0', 0, 0, 1207083000 }, /* 2008-04-01 */ - keys_096_5, G_N_ELEMENTS(keys_096_5), - }, - { - { 0, 96, 6, '\0', 0, 0, 1238338209 }, /* 2009-03-29 */ - keys_096_6, G_N_ELEMENTS(keys_096_6), - }, - { - { 0, 96, 7, '\0', 0, 0, 1269813600 }, /* 2010-03-29 */ - keys_096_7, G_N_ELEMENTS(keys_096_7), - }, - /* No new keys for 0.96.8: bugfix release of 0.96.7 */ - { - { 0, 96, 8, '\0', 0, 0, 1269813601 }, /* 2010-03-29 */ - keys_096_7, G_N_ELEMENTS(keys_096_7), - }, - { - { 0, 96, 9, '\0', 0, 0, 1300057200 }, /* 2011-03-14 */ - keys_096_9, G_N_ELEMENTS(keys_096_9), - }, - { - { 0, 97, 0, '\0', 0, 0, 1310940000 }, /* 2011-07-18 */ - keys_097_0, G_N_ELEMENTS(keys_097_0), - }, - { - { 0, 97, 1, '\0', 0, 0, GIT_SWITCH }, /* 2011-09-11 */ - keys_097_1, G_N_ELEMENTS(keys_097_1), - }, - { - { 0, 98, 0, '\0', 0, 0, 1323558000 }, /* 2011-12-11 */ - keys_098_0, G_N_ELEMENTS(keys_098_0), - }, - { - { 0, 98, 1, '\0', 0, 0, 1323990000 }, /* 2011-12-16 */ - keys_098_1, G_N_ELEMENTS(keys_098_1), - }, - { - { 0, 98, 2, '\0', 0, 0, 1325199600 }, /* 2011-12-30 */ - keys_098_2, G_N_ELEMENTS(keys_098_2), - }, + /* maj min PL tag lvl # timestamp key array ISO date */ + { { 0, 97, 0, '\0', 0, 0, 1310940000 }, KEYS(097_0) }, /* 2011-07-18 */ + { { 0, 97, 1, '\0', 0, 0, GIT_SWITCH }, KEYS(097_1) }, /* 2011-09-11 */ + { { 0, 98, 0, '\0', 0, 0, 1323558000 }, KEYS(098_0) }, /* 2011-12-11 */ + { { 0, 98, 1, '\0', 0, 0, 1323990000 }, KEYS(098_1) }, /* 2011-12-16 */ + { { 0, 98, 2, '\0', 0, 0, 1325199600 }, KEYS(098_2) }, /* 2011-12-30 */ + { { 0, 98, 3, '\0', 0, 0, 1338760800 }, KEYS(098_3) }, /* 2012-06-04 */ + { { 0, 98, 4, '\0', 0, 0, 1352588400 }, KEYS(098_4) }, /* 2012-11-11 */ + { { 1, 0, 0, '\0', 0, 0, 1377986400 }, KEYS(100_0) }, /* 2013-09-01 */ + { { 1, 0, 1, '\0', 0, 0, 1388444400 }, KEYS(100_1) }, /* 2013-12-31 */ + { { 1, 1, 0, '\0', 0, 0, 1404252000 }, KEYS(101_0) }, /* 2014-07-02 */ + { { 1, 1, 1, '\0', 0, 0, 1409608800 }, KEYS(101_1) }, /* 2014-09-02 */ + { { 1, 1, 2, '\0', 0, 0, 1426892400 }, KEYS(101_2) }, /* 2015-03-21 */ + { { 1, 1, 3, '\0', 0, 0, 1428444000 }, KEYS(101_3) }, /* 2015-04-08 */ + { { 1, 1, 4, '\0', 0, 0, 1441749600 }, KEYS(101_4) }, /* 2015-09-09 */ + { { 1, 1, 5, '\0', 0, 0, 1444255200 }, KEYS(101_5) }, /* 2015-10-08 */ + { { 1, 1, 6, '\0', 0, 0, 1446937200 }, KEYS(101_6) }, /* 2015-11-08 */ + { { 1, 1, 7, '\0', 0, 0, 1449961200 }, KEYS(101_7) }, /* 2015-12-13 */ + { { 1, 1, 8, '\0', 0, 0, 1450393200 }, KEYS(101_8) }, /* 2015-12-18 */ + { { 1, 1, 9, '\0', 0, 0, 1457218800 }, KEYS(101_9) }, /* 2016-03-06 */ }; +#undef KEYS + /** * Token validation errors. */ @@ -565,9 +721,9 @@ const char * tok_strerror(tok_error_t errnum) { - STATIC_ASSERT(G_N_ELEMENTS(tok_errstr) == TOK_MAX_ERROR); + STATIC_ASSERT(N_ITEMS(tok_errstr) == TOK_MAX_ERROR); - if (UNSIGNED(errnum) >= G_N_ELEMENTS(tok_errstr)) + if (UNSIGNED(errnum) >= N_ITEMS(tok_errstr)) return "Invalid error code"; return tok_errstrerrnum; @@ -583,14 +739,14 @@ find_tokkey_upto(time_t now, size_t count) { time_t adjusted = now - VERSION_ANCIENT_BAN; - guint i; + uint i; if (GNET_PROPERTY(version_debug) > 4) { g_debug("%s: count=%zu, from %s()", G_STRFUNC, count, stacktrace_caller_name(1)); } - g_assert(count <= G_N_ELEMENTS(token_keys)); + g_assert(count <= N_ITEMS(token_keys)); for (i = 0; i < count; i++) { const struct tokkey *tk = &token_keysi; @@ -625,7 +781,7 @@ if (NULL == tk) { - g_assert(count <= G_N_ELEMENTS(token_keys)); + g_assert(count <= N_ITEMS(token_keys)); tk = &token_keyscount - 1; if (GNET_PROPERTY(version_debug) > 4) { @@ -635,7 +791,7 @@ if (GNET_PROPERTY(version_debug) > 4) { g_debug("%s: returning %p (%u.%u.%u)", - G_STRFUNC, cast_to_gconstpointer(tk), + G_STRFUNC, cast_to_constpointer(tk), tk->ver.major, tk->ver.minor, tk->ver.patchlevel); } @@ -652,7 +808,7 @@ static inline const struct tokkey * find_tokkey(time_t now) { - return find_tokkey_upto(now, G_N_ELEMENTS(token_keys)); + return find_tokkey_upto(now, N_ITEMS(token_keys)); } /** @@ -664,16 +820,15 @@ static const struct tokkey * find_tokkey_version(const version_t *ver, time_t now) { - guint i; + uint i; /* * All versions before r16370 used the first key set when they expired. * If we're more recent, we probably have a stripped list of past key * sets, and therefore cannot validate their token. * - * All versions after we switched to git are can be checked provided - * we still have a copy of the keys that they had at the time they - * were released. + * All versions after we switched to git can be checked provided we still + * have a copy of the keys that they had at the time they were released. */ if ( @@ -696,7 +851,7 @@ * and we look for the token up to that index only. */ - for (i = 0; i < G_N_ELEMENTS(token_keys); i++) { + for (i = 0; i < N_ITEMS(token_keys); i++) { const struct tokkey *tk = &token_keysi; if (version_cmp(ver, &tk->ver) <= 0) { if (GNET_PROPERTY(version_debug) > 4) { @@ -709,11 +864,11 @@ if (GNET_PROPERTY(version_debug) > 4) { g_debug("%s: fallback max=%u (/%zu)", - G_STRFUNC, i, G_N_ELEMENTS(token_keys)); + G_STRFUNC, i, N_ITEMS(token_keys)); } i++; /* We need a count, not an index */ - i = MIN(i, G_N_ELEMENTS(token_keys)); /* In case loop did not match */ + i = MIN(i, N_ITEMS(token_keys)); /* In case loop did not match */ return find_tokkey_upto_fallback(now, i); } @@ -724,11 +879,11 @@ static const struct tokkey * find_latest(const version_t *rver) { - guint i; + uint i; const struct tokkey *tk; const struct tokkey *result = NULL; - for (i = 0; i < G_N_ELEMENTS(token_keys); i++) { + for (i = 0; i < N_ITEMS(token_keys); i++) { tk = &token_keysi; if (version_build_cmp(&tk->ver, rver) > 0) break; @@ -745,10 +900,10 @@ * and the token key structure used in `tkused'. */ static const char * -random_key(time_t now, guint *idx, const struct tokkey **tkused) +token_random_key(time_t now, uint *idx, const struct tokkey **tkused) { - static gboolean warned = FALSE; - guint random_idx; + static bool warned = FALSE; + uint random_idx; const struct tokkey *tk; tk = find_tokkey(now); @@ -759,21 +914,21 @@ warned = TRUE; } - STATIC_ASSERT(G_N_ELEMENTS(token_keys) >= 1); + STATIC_ASSERT(N_ITEMS(token_keys) >= 1); /* Pick the latest (most recent) key set from the array */ - tk = &token_keysG_N_ELEMENTS(token_keys) - 1; + tk = &token_keysN_ITEMS(token_keys) - 1; } - random_idx = random_u32() % tk->count; + random_idx = random_value(tk->count - 1); *idx = random_idx; *tkused = tk; return tk->keysrandom_idx; } -static guint16 -tok_crc(guint32 crc, const struct tokkey *tk) +static uint16 +tok_crc(uint32 crc, const struct tokkey *tk) { const char **keys = tk->keys; size_t i; @@ -800,10 +955,10 @@ char lvldigestLEVEL_SIZE; char lvlbase64LEVEL_BASE64_SIZE + 1; const struct tokkey *tk; - guint32 crc32; - guint idx; + uint32 crc32; + uint idx; const char *key; - SHA1Context ctx; + SHA1_context ctx; struct sha1 sha1; int lvlsize; int i; @@ -812,7 +967,7 @@ * Compute token. */ - key = random_key(now, &idx, &tk); + key = token_random_key(now, &idx, &tk); now = clock_loc2gmt(now); /* As close to GMT as possible */ poke_be32(&digest0, now); @@ -820,19 +975,19 @@ digest6 &= 0xe0U; /* Upper 3 bits only */ digest6 |= idx & 0xffU; /* Has 5 bits for the index */ - SHA1Reset(&ctx); - SHA1Input(&ctx, key, strlen(key)); - SHA1Input(&ctx, digest, 7); - SHA1Input(&ctx, version, strlen(version)); - SHA1Result(&ctx, &sha1); + SHA1_reset(&ctx); + SHA1_input(&ctx, key, strlen(key)); + SHA1_input(&ctx, digest, 7); + SHA1_input(&ctx, version, strlen(version)); + SHA1_result(&ctx, &sha1); memcpy(&digest7, sha1.data, SHA1_RAW_SIZE); /* * Compute level. */ - lvlsize = G_N_ELEMENTS(token_keys) - (tk - token_keys); - crc32 = crc32_update(0, digest, TOKEN_VERSION_SIZE); + lvlsize = N_ITEMS(token_keys) - (tk - token_keys); + crc32 = crc32_update(0, VARLEN(digest)); for (i = 0; i < lvlsize; i++) { poke_be16(&lvldigesti*2, tok_crc(crc32, tk)); @@ -849,7 +1004,7 @@ ZERO(&lvlbase64); base64_encode_into(lvldigest, 2 * lvlsize, lvlbase64, LEVEL_BASE64_SIZE); - return g_strconcat(token, "; ", lvlbase64, (void *) 0); + return h_strconcat(token, "; ", lvlbase64, NULL_PTR); } /** @@ -883,7 +1038,7 @@ last_generated = now; - G_FREE_NULL(toklevel); + HFREE_NULL(toklevel); toklevel = tok_generate(now, version_string); return NOT_LEAKING(toklevel); @@ -914,7 +1069,7 @@ last_generated = now; - G_FREE_NULL(toklevel); + HFREE_NULL(toklevel); toklevel = tok_generate(now, version_short_string); return NOT_LEAKING(toklevel); @@ -932,13 +1087,13 @@ { time_t now = tm_time(); time_t stamp; - guint32 crc; + uint32 crc; const struct tokkey *tk; const struct tokkey *rtk; const struct tokkey *latest; - guint idx; + uint idx; const char *key; - SHA1Context ctx; + SHA1_context ctx; char lvldigest1024; char tokenTOKEN_VERSION_SIZE; struct sha1 digest; @@ -947,7 +1102,7 @@ int toklen; int lvllen; int lvlsize; - guint i; + uint i; end = strchr(tokenb64, ';'); /* After 25/02/2003 */ toklen = end ? (end - tokenb64) : len; @@ -981,17 +1136,17 @@ if (tk == NULL) return TOK_BAD_KEYS; - idx = (guchar) token6 & 0x1f; /* 5 bits for the index */ + idx = (uchar) token6 & 0x1f; /* 5 bits for the index */ if (idx >= tk->count) return TOK_BAD_INDEX; key = tk->keysidx; - SHA1Reset(&ctx); - SHA1Input(&ctx, key, strlen(key)); - SHA1Input(&ctx, token, 7); - SHA1Input(&ctx, version, strlen(version)); - SHA1Result(&ctx, &digest); + SHA1_reset(&ctx); + SHA1_input(&ctx, key, strlen(key)); + SHA1_input(&ctx, token, 7); + SHA1_input(&ctx, version, strlen(version)); + SHA1_result(&ctx, &digest); if (0 != memcmp(&token7, digest.data, SHA1_RAW_SIZE)) return TOK_INVALID; @@ -1050,14 +1205,14 @@ */ lvllen /= 2; /* # of keys held remotely */ - lvlsize = G_N_ELEMENTS(token_keys) - (tk - token_keys); + lvlsize = N_ITEMS(token_keys) - (tk - token_keys); lvlsize = MIN(lvllen, lvlsize); g_assert(lvlsize >= 1); rtk = tk + (lvlsize - 1); /* Keys at that level */ - crc = crc32_update(0, token, TOKEN_VERSION_SIZE); + crc = crc32_update(0, VARLEN(token)); crc = tok_crc(crc, rtk); lvlsize--; /* Move to 0-based offset */ @@ -1065,7 +1220,7 @@ if (peek_be16(&lvldigest2*lvlsize) != crc) return TOK_INVALID_LEVEL; - for (i = 0; i < G_N_ELEMENTS(token_keys); i++) { + for (i = 0; i < N_ITEMS(token_keys); i++) { rtk = &token_keysi; if (rtk->ver.timestamp > rver.timestamp) { rtk--; /* `rtk' could not exist remotely */ @@ -1083,7 +1238,7 @@ * Check whether the version is too ancient to be able to generate a proper * token string identifiable by remote parties. */ -gboolean +bool tok_is_ancient(time_t now) { return find_tokkey(now) == NULL;
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/token.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/token.h
Changed
@@ -73,7 +73,7 @@ char *tok_short_version(void); tok_error_t tok_version_valid( const char *version, const char *tokenb64, int len, host_addr_t addr); -gboolean tok_is_ancient(time_t now); +bool tok_is_ancient(time_t now); #endif /* _core_token_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/topless.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/topless.c
Changed
@@ -33,7 +33,7 @@ #include "topless.h" #ifndef USE_TOPLESS -gboolean running_topless; +bool running_topless; #endif /* USE_TOPLESS */ void
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/tsync.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/tsync.c
Changed
@@ -41,9 +41,11 @@ #include "if/gnet_property_priv.h" #include "lib/cq.h" +#include "lib/hevset.h" #include "lib/nid.h" #include "lib/tm.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ #define TSYNC_EXPIRE_MS (60*1000) /**< Expiration time: 60 secs */ @@ -61,13 +63,13 @@ tm_t sent; /**< Time at which we sent the synchronization */ struct nid *node_id; /**< Node to which we sent the request */ cevent_t *expire_ev; /**< Expiration callout queue callback */ - gboolean udp; /**< Whether request was sent using UDP */ + unsigned udp:1; /**< Whether request was sent using UDP */ }; /* * Table recording the "tsync" structures, indexed by sent time. */ -static GHashTable *tsync_by_time; /**< tm_t -> tsync */ +static hevset_t *tsync_by_time; /**< tm_t -> tsync */ /** * Free a tsync structure. @@ -88,12 +90,10 @@ * Expire the tsync record. */ static void -tsync_expire(cqueue_t *unused_cq, gpointer obj) +tsync_expire(cqueue_t *cq, void *obj) { struct tsync *ts = obj; - struct gnutella_node *n; - - (void) unused_cq; + gnutella_node_t *n; g_assert(ts); g_assert(ts->magic == TSYNC_MAGIC); @@ -102,8 +102,8 @@ g_debug("TSYNC expiring time %d.%d", (int) ts->sent.tv_sec, (int) ts->sent.tv_usec); - ts->expire_ev = NULL; - g_hash_table_remove(tsync_by_time, &ts->sent); + cq_zero(cq, &ts->expire_ev); + hevset_remove(tsync_by_time, &ts->sent); /* * If we sent the request via UDP, the node is probably UDP-firewalled: @@ -126,7 +126,7 @@ * we're sending the time synchronization request. */ void -tsync_send(struct gnutella_node *n, const struct nid *node_id) +tsync_send(gnutella_node_t *n, const struct nid *node_id) { struct tsync *ts; @@ -139,7 +139,7 @@ tm_now_exact(&ts->sent); ts->sent.tv_sec = clock_loc2gmt(ts->sent.tv_sec); ts->node_id = nid_ref(node_id); - ts->udp = NODE_IS_UDP(n); + ts->udp = booleanize(NODE_IS_UDP(n)); /* * As far as time synchronization goes, we must get the reply within @@ -148,7 +148,7 @@ ts->expire_ev = cq_main_insert(TSYNC_EXPIRE_MS, tsync_expire, ts); - g_hash_table_insert(tsync_by_time, &ts->sent, ts); + hevset_insert(tsync_by_time, ts); vmsg_send_time_sync_req(n, GNET_PROPERTY(ntp_detected), &ts->sent); } @@ -175,7 +175,7 @@ tm2f(&elapsed)); } - ts = g_hash_table_lookup(tsync_by_time, orig); + ts = hevset_lookup(tsync_by_time, orig); if (ts == NULL) { if (GNET_PROPERTY(tsync_debug) > 1) { g_debug("TSYNC request %d.%d not found, expired already?", @@ -187,9 +187,9 @@ g_assert(ts); g_assert(ts->magic == TSYNC_MAGIC); - g_hash_table_remove(tsync_by_time, orig); + hevset_remove(tsync_by_time, orig); ts->sent = *final; - g_hash_table_insert(tsync_by_time, &ts->sent, ts); + hevset_insert(tsync_by_time, ts); /* * Now that we sent the message, expect a reply in TSYNC_EXPIRE_MS @@ -208,7 +208,7 @@ * @param got is the timestamp at which we received the request */ void -tsync_got_request(struct gnutella_node *n, tm_t *got) +tsync_got_request(gnutella_node_t *n, tm_t *got) { vmsg_send_time_sync_reply(n, GNET_PROPERTY(ntp_detected), got); } @@ -217,8 +217,8 @@ * Got a reply to our initial "Time Sync" request. */ void -tsync_got_reply(struct gnutella_node *n, - tm_t *sent, tm_t *received, tm_t *replied, tm_t *got, gboolean ntp) +tsync_got_reply(gnutella_node_t *n, + tm_t *sent, tm_t *received, tm_t *replied, tm_t *got, bool ntp) { struct tsync *ts; tm_t delay; @@ -249,7 +249,7 @@ * round-trip delay between ourselves and the remote node. */ - ts = g_hash_table_lookup(tsync_by_time, sent); + ts = hevset_lookup(tsync_by_time, sent); if (ts == NULL) { if (GNET_PROPERTY(tsync_debug) > 1) { @@ -259,7 +259,7 @@ } else { tm_t offset; double clock_offset; - struct gnutella_node *cn; + gnutella_node_t *cn; g_assert(ts); g_assert(ts->magic == TSYNC_MAGIC); @@ -308,7 +308,7 @@ clock_update(got->tv_sec + (int) clock_offset, precision, n->addr); - g_hash_table_remove(tsync_by_time, &ts->sent); + hevset_remove(tsync_by_time, &ts->sent); tsync_free(ts); } } @@ -319,18 +319,18 @@ void tsync_init(void) { - tsync_by_time = g_hash_table_new(tm_hash, tm_equal); + tsync_by_time = hevset_create_any(offsetof(struct tsync, sent), + tm_hash, NULL, tm_equal); } /** * Get rid of the tsync structure held in the value. */ static void -free_tsync_kv(gpointer unused_key, gpointer value, gpointer unused_udata) +free_tsync_kv(void *value, void *unused_udata) { struct tsync *ts = value; - (void) unused_key; (void) unused_udata; g_assert(ts); @@ -345,8 +345,8 @@ void tsync_close(void) { - g_hash_table_foreach(tsync_by_time, free_tsync_kv, NULL); - gm_hash_table_destroy_null(&tsync_by_time); + hevset_foreach(tsync_by_time, free_tsync_kv, NULL); + hevset_free_null(&tsync_by_time); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/tsync.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/tsync.h
Changed
@@ -52,7 +52,7 @@ void tsync_send_timestamp(tm_t *orig, tm_t *final); void tsync_got_request(struct gnutella_node *n, tm_t *got); void tsync_got_reply(struct gnutella_node *n, - tm_t *sent, tm_t *received, tm_t *replied, tm_t *got, gboolean ntp); + tm_t *sent, tm_t *received, tm_t *replied, tm_t *got, bool ntp); #endif /* _core_tsync_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/tth_cache.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/tth_cache.c
Changed
@@ -1,5 +1,6 @@ /* - * Copyright (c) 2006, Christian Biere + * Copyright (c) 2007 Christian Biere + * Copyright (c) 2015 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -33,7 +34,7 @@ * stored in * $GTK_GNUTELLA_DIR/tth_cache/5E/DB4PUVFGY2UKVISQ2DMACSPNRODTTODBS52RQ. * This avoids storing too many files per directory. - * + * * Only the leaves at TTH_MAX_DEPTH or above are stored. The root hash and the * nodes at each level between above these leaves can be calculated from the * leaves. @@ -42,22 +43,37 @@ * * @author Christian Biere * @date 2007 + * @author Raphael Manfredi + * @date 2015 */ #include "common.h" -#include "settings.h" #include "tth_cache.h" +#include "settings.h" +#include "share.h" + #include "lib/atoms.h" +#include "lib/base32.h" #include "lib/fd.h" #include "lib/file.h" +#include "lib/ftw.h" #include "lib/halloc.h" +#include "lib/hset.h" #include "lib/path.h" +#include "lib/pslist.h" +#include "lib/spinlock.h" +#include "lib/str.h" #include "lib/stringify.h" +#include "lib/thread.h" #include "lib/tigertree.h" +#include "lib/timestamp.h" #include "lib/walloc.h" +#include "if/gnet_property_priv.h" +#include "if/core/main.h" /* For debugging() */ + #include "lib/override.h" /* Must be the last header included */ #if defined(S_IROTH) @@ -66,6 +82,15 @@ #define TTH_FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP) /* 0640 */ #endif +/** + * This lock is used to protect the creation / removal of directories + * under the TTH cache. + */ +static spinlock_t tth_path_lk = SPINLOCK_INIT; + +#define TTH_PATH_LOCK spinlock(&tth_path_lk) +#define TTH_PATH_UNLOCK spinunlock(&tth_path_lk) + static const char * tth_cache_directory(void) { @@ -81,9 +106,9 @@ tth_cache_pathname(const struct tth *tth) { const char *hash; - + g_assert(tth); - + hash = tth_base32(tth); return h_strdup_printf("%s%c%2.2s%c%s", tth_cache_directory(), G_DIR_SEPARATOR, @@ -101,6 +126,15 @@ accmode = O_WRONLY | O_TRUNC; pathname = tth_cache_pathname(tth); + + /* + * Critical section required since we could have a concurrent thread + * deciding to remove empty directories whilst we are attempting + * to create a new directory to store the new cached entry! + */ + + TTH_PATH_LOCK; + fd = file_create_missing(pathname, accmode, TTH_FILE_MODE); if (fd < 0 && ENOENT == errno) { char *dir = filepath_directory(pathname); @@ -109,6 +143,9 @@ } HFREE_NULL(dir); } + + TTH_PATH_UNLOCK; + HFREE_NULL(pathname); return fd; } @@ -127,10 +164,10 @@ return fd; } -static gboolean +static bool tth_cache_file_exists(const struct tth *tth) { - gboolean ret; + bool ret; char *pathname; g_return_val_if_fail(tth, FALSE); @@ -145,7 +182,7 @@ tth_cache_insert(const struct tth *tth, const struct tth *leaves, int n_leaves) { int fd; - + g_return_if_fail(tth); g_return_if_fail(leaves); g_return_if_fail(n_leaves >= 1); @@ -166,7 +203,7 @@ ssize_t ret; STATIC_ASSERT(TTH_RAW_SIZE == sizeof(leaves0)); - + size = TTH_RAW_SIZE * n_leaves; ret = write(fd, leaves, size); if ((ssize_t) -1 == ret) { @@ -185,8 +222,7 @@ g_return_val_if_fail(sb, 0); if (!S_ISREG(sb->st_mode)) { - g_warning("tth_cache_leave_count(%s): Not a regular file", - tth_base32(tth)); + g_warning("%s(%s): not a regular file", G_STRFUNC, tth_base32(tth)); return 0; } if ( @@ -194,7 +230,7 @@ sb->st_size < TTH_RAW_SIZE || sb->st_size > TTH_MAX_LEAVES * TTH_RAW_SIZE ) { - g_warning("tth_cache_leave_count(%s): Bad filesize %s", + g_warning("%s(%s): bad filesize %s", G_STRFUNC, tth_base32(tth), fileoffset_t_to_string(sb->st_size)); return 0; } @@ -209,7 +245,7 @@ tth_cache_lookup(const struct tth *tth, filesize_t filesize) { size_t expected, leave_count = 0; - + g_return_val_if_fail(tth, 0); expected = tt_good_node_count(filesize); @@ -221,8 +257,8 @@ if (stat(pathname, &sb)) { leave_count = 0; if (ENOENT != errno) { - g_warning("%s(%s): stat() failed: %m", - G_STRFUNC, tth_base32(tth)); + g_warning("%s(%s): stat(\"%s\") failed: %m", + G_STRFUNC, tth_base32(tth), pathname); } } else { leave_count = tth_cache_leave_count(tth, &sb); @@ -263,7 +299,7 @@ g_warning("%s(%s): fstat() failed: %m", G_STRFUNC, tth_base32(tth)); } else { size_t n_leaves; - + n_leaves = tth_cache_leave_count(tth, &sb); n_leaves = MIN(n, n_leaves); if (n_leaves > 0) { @@ -302,7 +338,7 @@ } *tree = NULL; - + n_leaves = tth_cache_get_leaves(tth, &nodesTTH_MAX_LEAVES, TTH_MAX_LEAVES); g_assert(n_leaves <= TTH_MAX_LEAVES); @@ -328,13 +364,258 @@ } if (tth_cache_file_exists(tth)) { - g_warning("tth_cache_get_tree(): Removing corrupted tigertree for %s", - tth_base32(tth)); + g_warning("%s(): removing corrupted tigertree for %s", + G_STRFUNC, tth_base32(tth)); tth_cache_remove(tth); } return 0; } +/** + * Remove directory, warning only when it cannot be done for a reason other + * than it not being empty. + */ +static void +tth_cache_dir_rmdir(const char *path) +{ + if (debugging(0)) + g_message("%s(): removing TTH cache directory %s", G_STRFUNC, path); + + /* + * To avoid any conflicts with another thread attempting to create a + * file under that directory, take a lock. + * + * Note that there is a race condition between the traversal that detects + * the directory is empty and the time we actually attempt to remove it. + * Hence, we silence any error having to deal with the directory being + * non-empty and therefore non-removable. + */ + + TTH_PATH_LOCK; + + if (-1 == rmdir(path) && ENOTEMPTY != errno) { + g_warning("%s(): cannot remove TTH cache directory %s: %m", + G_STRFUNC, path); + } + + TTH_PATH_UNLOCK; +} + + +/** + * ftw_foreach() callback to remove empty directories. + */ +static ftw_status_t +tth_cache_cleanup_rmdir( + const ftw_info_t *info, const filestat_t *unused_sb, void *data) +{ + pslist_t **dirsp = data; + + (void) unused_sb; + + if (FTW_F_DIR & info->flags) { + if (FTW_F_NOREAD & info->flags) { + tth_cache_dir_rmdir(info->fpath); /* Try, we can't read it */ + } else if (FTW_F_DONE & info->flags) { + void *cnt = (*dirsp)->data; + if (NULL == cnt && 0 != info->level) + tth_cache_dir_rmdir(info->fpath); + *dirsp = pslist_delete_link(*dirsp, *dirsp); /* Strip head */ + } else { + *dirsp = pslist_prepend(*dirsp, NULL); + } + return FTW_STATUS_OK; + } + + (*dirsp)->data = int_to_pointer(1); /* There is something in directory */ + return FTW_STATUS_OK; +} + +/** + * Unlink cached file entry, warning if it cannot be done but otherwise not + * logging anything on success. + * + * @return TRUE on success + */ +static bool +tth_cache_file_unlink(const char *path, const char *reason) +{ + if (-1 == unlink(path)) { + g_warning("%s(): cannot remove %s TTH cache entry %s: %m", + G_STRFUNC, reason, path); + return FALSE; + } + + return TRUE; +} + +/** + * Remove cached file entry, logging success. + */ +static void +tth_cache_file_remove(const char *path, const char *reason) +{ + if (tth_cache_file_unlink(path, reason)) + g_message("removed %s TTH cache entry: %s", reason, path); +} + +/** + * ftw_foreach() callback to remove obsolete / spurious files. + */ +static ftw_status_t +tth_cache_cleanup_unlink( + const ftw_info_t *info, const filestat_t *sb, void *data) +{ + const hset_t *shared = data; + + if (FTW_F_DIR & info->flags) + return FTW_STATUS_OK; + + if ((FTW_F_OTHER | FTW_F_SYMLINK) & info->flags) { + tth_cache_file_remove(info->fpath, "alien"); + return FTW_STATUS_OK; + } + + if (FTW_F_FILE & info->flags) { + char **path; + struct tth tth; + char b32TTH_BASE32_SIZE + 2; + size_t len; + + if (FTW_F_NOSTAT & info->flags) { + g_warning("%s(): ignoring unaccessible cached TTH %s", + G_STRFUNC, info->fpath); + return FTW_STATUS_OK; + } + + if (info->level != 2) { + tth_cache_file_remove(info->fpath, "spurious"); + return FTW_STATUS_OK; + } + + path = g_strsplit(info->rpath, "/", 2); + + if (NULL == path) + return FTW_STATUS_ABORT; /* Weird, empty relative path? */ + + len = str_bprintf(b32, sizeof b32, "%s", path0); + if (len != 2) /* Expected first path component is 2-char long */ + len = 0; + len += str_bprintf(&b32len, sizeof b32 - len, "%s", path1); + + if ( + TTH_BASE32_SIZE != len || + TTH_RAW_SIZE != + base32_decode(&tth, sizeof tth, b32, TTH_BASE32_SIZE) + ) { + tth_cache_file_remove(info->fpath, "invalid"); + goto done; + } + + /* + * At this point, we have a valid TTH cache filename. + * + * We want to only process files created before the session started. + * + * The rationale is that users could start unsharing directories, + * moving files around, add new files, etc.. Each time a new library + * rescan occurs, we're going to create new TTH cache files, or some + * cached files could become unused for a while and then files will + * reappear in the library. + * + * By only ever cleaning up files created before the current session, + * we have a higher likelyhood of processing an obsolete cache entry. + */ + + if (delta_time(sb->st_mtime, GNET_PROPERTY(session_start_stamp)) >= 0) + goto done; /* Created after session started, skip */ + + if (!hset_contains(shared, &tth)) { + if (debugging(0)) + g_debug("%s(): unshared TTH (%s)", G_STRFUNC, info->rpath); + (void) tth_cache_file_unlink(info->fpath, "unshared"); + } + + /* FALL THROUGH */ + + done: + g_strfreev(path); + return FTW_STATUS_OK; + } + + g_assert_not_reached(); + return FTW_STATUS_ERROR; +} + +static int tth_cache_cleanups; + +/** + * Main entry point for the thread that cleans up the TTH cache. + */ +static void * +tth_cache_cleanup_thread(void *unused_arg) +{ + hset_t *shared; + const char *rootdir = tth_cache_directory(); + pslist_t *dirstack; + uint32 flags; + ftw_status_t res; + + (void) unused_arg; + + if (!is_directory(rootdir)) + goto done; /* No TTH cache */ + + /* + * First pass: spot all file entries that are older than our start + * time (i.e. were created in another session) and which cannot be + * associated with a shared file. + */ + + shared = share_tthset_get(); + flags = FTW_O_PHYS | FTW_O_MOUNT | FTW_O_ALL; + res = ftw_foreach(rootdir, flags, 0, tth_cache_cleanup_unlink, shared); + share_tthset_free(shared); + + if (res != FTW_STATUS_OK) { + g_warning("%s(): initial traversal failed with %d, aborting", + G_STRFUNC, res); + goto done; + } + + /* + * Second pass: spot empty directories and remove them. + */ + + flags |= FTW_O_ENTRY | FTW_O_DEPTH; + dirstack = NULL; + (void) ftw_foreach(rootdir, flags, 0, tth_cache_cleanup_rmdir, &dirstack); + pslist_free(dirstack); + + /* FALL THROUGH */ + +done: + atomic_int_dec(&tth_cache_cleanups); + return NULL; +} + +/** + * Cleanup the TTH cache by removing needless entries. + */ +void +tth_cache_cleanup(void) +{ + if (0 == atomic_int_inc(&tth_cache_cleanups)) { + int id = thread_create(tth_cache_cleanup_thread, + NULL, THREAD_F_DETACH | THREAD_F_WARN, THREAD_STACK_MIN); + if (-1 == id) + atomic_int_dec(&tth_cache_cleanups); + } else if (debugging(0)) { + g_warning("%s(): concurrent cleanup in progress", G_STRFUNC); + atomic_int_dec(&tth_cache_cleanups); + } +} + void tth_cache_init(void) {
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/tth_cache.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/tth_cache.h
Changed
@@ -36,5 +36,8 @@ void tth_cache_remove(const struct tth *tth); void tth_cache_close(void); +void tth_cache_cleanup(void); + #endif /* _tth_cache_h_ */ + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/tx.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/tx.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2015 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -33,7 +33,7 @@ * as tx_write(). * * @author Raphael Manfredi - * @date 2002-2005 + * @date 2002-2005, 2015 */ #include "common.h" @@ -41,9 +41,9 @@ #include "tx.h" #include "nodes.h" -#include "lib/glib-missing.h" #include "lib/host_addr.h" -#include "lib/strtok.h" +#include "lib/ipset.h" +#include "lib/pslist.h" #include "lib/walloc.h" #include "lib/override.h" /* Must be the last header included */ @@ -56,7 +56,7 @@ #define TX_DESTROY(o) ((*(o)->ops->destroy)((o))) #define TX_WRITE(o,d,l) ((*(o)->ops->write)((o), (d), (l))) #define TX_WRITEV(o,i,c) ((*(o)->ops->writev)((o), (i), (c))) -#define TX_SENDTO(o,t,d,l) ((*(o)->ops->sendto)((o), (t), (d), (l))) +#define TX_SENDTO(o,m,t) ((*(o)->ops->sendto)((o), (m), (t))) #define TX_ENABLE(o) ((*(o)->ops->enable)((o))) #define TX_DISABLE(o) ((*(o)->ops->disable)((o))) #define TX_PENDING(o) ((*(o)->ops->pending)((o))) @@ -70,7 +70,7 @@ * with respect to the caller (i.e. it is not happening in the same * calling stack), freed stacks are remembered and periodically collected. */ -static GSList *tx_freed = NULL; +static pslist_t *tx_freed = NULL; /** * Create a new network driver, equipped with the `ops' operations and @@ -79,8 +79,8 @@ * @return NULL if there is an initialization problem. */ txdrv_t * -tx_make(gpointer owner, const gnet_host_t *host, - const struct txdrv_ops *ops, gpointer args) +tx_make(void *owner, const gnet_host_t *host, + const struct txdrv_ops *ops, void *args) { txdrv_t *tx; @@ -88,6 +88,7 @@ g_assert(ops); WALLOC0(tx); + tx->magic = TXDRV_MAGIC; tx->owner = owner; tx->host = *host; /* stuct copy */ @@ -107,8 +108,8 @@ static void tx_attached(txdrv_t *tx, txdrv_t *utx) { - g_assert(tx); - g_assert(utx); + tx_check(tx); + tx_check(utx); g_assert(tx->upper == NULL); /* Can only attach ONE layer */ tx->upper = utx; @@ -120,15 +121,16 @@ * @return NULL if there is an initialization problem. */ txdrv_t * -tx_make_above(txdrv_t *ltx, const struct txdrv_ops *ops, gpointer args) +tx_make_above(txdrv_t *ltx, const struct txdrv_ops *ops, void *args) { txdrv_t *tx; - g_assert(ltx); + tx_check(ltx); g_assert(ltx->upper == NULL); /* Nothing above yet */ g_assert(ops); WALLOC0(tx); + tx->magic = TXDRV_MAGIC; tx->owner = ltx->owner; gnet_host_copy(&tx->host, <x->host); tx->ops = ops; @@ -151,7 +153,7 @@ { txdrv_t *t; - g_assert(tx); + tx_check(tx); g_assert(tx->upper == NULL); for (t = tx; t; t = t->lower) { @@ -177,12 +179,13 @@ static void tx_deep_free(txdrv_t *tx) { - g_assert(tx); + tx_check(tx); if (tx->lower) tx_deep_free(tx->lower); TX_DESTROY(tx); + tx->magic = 0; WFREE(tx); } @@ -193,7 +196,7 @@ void tx_free(txdrv_t *tx) { - g_assert(tx); + tx_check(tx); g_assert(tx->upper == NULL); /* @@ -205,7 +208,7 @@ if (!(tx->flags & TX_DOWN)) tx_shutdown(tx); - tx_freed = g_slist_prepend(tx_freed, tx); + tx_freed = pslist_prepend(tx_freed, tx); } /** @@ -214,32 +217,98 @@ void tx_collect(void) { - GSList *sl; + pslist_t *sl; - for (sl = tx_freed; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(tx_freed, sl) { txdrv_t *tx = sl->data; tx_deep_free(tx); } - gm_slist_free_null(&tx_freed); + pslist_free_null(&tx_freed); } /** + * Check whether TX layer is writable. + * + * @return TRUE if OK, FALSE otherwise with errno set to EINVAL. + */ +static inline bool +tx_is_writable(const txdrv_t *tx) +{ + const int errflags = TX_ERROR | TX_DOWN | TX_CLOSING | TX_WR_FAULT; + + if G_UNLIKELY(tx->flags & errflags) { + /* + * If TX_WR_FAULT is set, warn them loudly to be able to spot + * the faulty user code: we're re-entering the TX stack after an + * error has been reported, probably during the execution of the + * user-supplied write error callback, but maybe even afterwards! + * --RAM, 2015-03-14 + */ + + if (TX_WR_FAULT == (tx->flags & (TX_WR_FAULT | TX_WR_WARNED))) { + txdrv_t *wtx = deconstify_pointer(tx); + wtx->flags |= TX_WR_WARNED; + g_carp("%s(): writing to TX layer \"%s\" after error in \"%s\"", + G_STRFUNC, tx->ops->name, tx_error_layer_name(tx)); + } + + errno = EIO; + return FALSE; + } + + return TRUE; +} + +/** + * Wrapper to check the returned value of a write operation to make sure + * we force -1 with errno set to EIO when a non-zero value is returned + * and the TX layer is flagging an error. + */ +static ssize_t +tx_wr_wrap(const txdrv_t *tx, ssize_t ret, const char *routine) +{ + if G_UNLIKELY(-1 == ret) + return -1; + + /* + * The purpose of this routine is to ensure that tx_write() and friends + * will always return -1 when there is an error flagged at a given TX + * layer. + * + * If that would not be the case, there is a bug to investigate, which + * is why we're carping to see when it happens exactly. Unfortunately, + * this will not help us determine which layer is at fault, and where the + * bug is located... + * --RAM, 2014-05-22 + */ + + if G_UNLIKELY(tx->flags & TX_ERROR) { + g_carp("%s(): forcing errno=EIO and returning -1 instead of %zd", + routine, ret); + errno = EIO; + return -1; + } + + return ret; +} + +#define TX_WR_WRAP(t,r) tx_wr_wrap((t), (r), G_STRFUNC) + +/** * Write `len' bytes starting at `data'. * * @return the amount of bytes written, or -1 with errno set on error. */ ssize_t -tx_write(txdrv_t *tx, gconstpointer data, size_t len) +tx_write(txdrv_t *tx, const void *data, size_t len) { - g_assert(tx); + tx_check(tx); - if (tx->flags & (TX_ERROR | TX_DOWN | TX_CLOSING)) { - errno = EINVAL; + if G_UNLIKELY(!tx_is_writable(tx)) return -1; - } - return TX_WRITE(tx, data, len); + return TX_WR_WRAP(tx, TX_WRITE(tx, data, len)); } /** @@ -250,14 +319,12 @@ ssize_t tx_writev(txdrv_t *tx, iovec_t *iov, int iovcnt) { - g_assert(tx); + tx_check(tx); - if (tx->flags & (TX_ERROR | TX_DOWN | TX_CLOSING)) { - errno = EINVAL; + if G_UNLIKELY(!tx_is_writable(tx)) return -1; - } - return TX_WRITEV(tx, iov, iovcnt); + return TX_WR_WRAP(tx, TX_WRITEV(tx, iov, iovcnt)); } /** @@ -266,26 +333,24 @@ * @return amount of bytes written, or -1 on error with errno set. */ ssize_t -tx_sendto(txdrv_t *tx, const gnet_host_t *to, gconstpointer data, size_t len) +tx_sendto(txdrv_t *tx, pmsg_t *mb, const gnet_host_t *to) { - g_assert(tx); + tx_check(tx); - if (tx->flags & (TX_ERROR | TX_DOWN | TX_CLOSING)) { - errno = EINVAL; + if G_UNLIKELY(!tx_is_writable(tx)) return -1; - } - return TX_SENDTO(tx, to, data, len); + return TX_WR_WRAP(tx, TX_SENDTO(tx, mb, to)); } /** * Register service routine from upper TX layer. */ void -tx_srv_register(txdrv_t *tx, tx_service_t srv_fn, gpointer srv_arg) +tx_srv_register(txdrv_t *tx, tx_service_t srv_fn, void *srv_arg) { - g_assert(tx); - g_assert(srv_fn); + tx_check(tx); + g_assert(srv_fn != NULL); tx->srv_routine = srv_fn; tx->srv_arg = srv_arg; @@ -297,7 +362,7 @@ void tx_srv_enable(txdrv_t *tx) { - g_assert(tx); + tx_check(tx); g_assert(tx->srv_routine != NULL); if (tx->flags & TX_SERVICE) /* Already enabled */ @@ -313,7 +378,7 @@ void tx_srv_disable(txdrv_t *tx) { - g_assert(tx); + tx_check(tx); g_assert(tx->srv_routine != NULL); g_return_if_fail(tx->flags & TX_SERVICE); @@ -338,7 +403,7 @@ txdrv_t *t; size_t pending = 0; - g_assert(tx); + tx_check(tx); g_assert(tx->upper == NULL); /* Called on top of the stack */ for (t = tx; t; t = t->lower) @@ -353,7 +418,7 @@ static txdrv_t * tx_deep_bottom(txdrv_t *tx) { - g_assert(tx); + tx_check(tx); if (tx->lower) return tx_deep_bottom(tx->lower); @@ -370,11 +435,11 @@ * easily computed on demand and the limiting factor is the output bandwidth. */ void -tx_eager_mode(txdrv_t *tx, gboolean on) +tx_eager_mode(txdrv_t *tx, bool on) { txdrv_t *t; - g_assert(tx); + tx_check(tx); g_assert(tx->upper == NULL); for (t = tx; t; t = t->lower) { @@ -400,7 +465,7 @@ { txdrv_t *bottom; - g_assert(tx); + tx_check(tx); g_assert(tx->upper == NULL); bottom = tx_deep_bottom(tx); @@ -414,7 +479,7 @@ void tx_flush(txdrv_t *tx) { - g_assert(tx); + tx_check(tx); g_assert(tx->upper == NULL); TX_FLUSH(tx); @@ -423,12 +488,12 @@ /** * @return TRUE if there is an error reported by any layer underneath. */ -gboolean -tx_has_error(txdrv_t *tx) +bool +tx_has_error(const txdrv_t *tx) { - txdrv_t *t; + const txdrv_t *t; - g_assert(tx); + tx_check(tx); for (t = tx; t; t = t->lower) { if (t->flags & TX_ERROR) @@ -439,12 +504,52 @@ } /** + * @return the name of the first TX layer reporting an error, NULL if no error. + */ +const char * +tx_error_layer_name(const txdrv_t *tx) +{ + const txdrv_t *t; + + tx_check(tx); + + for (t = tx; t; t = t->lower) { + if (t->flags & TX_ERROR) + return t->ops->name; + } + + return NULL; +} + +/** + * Flag write error in current layer, disabling further writes at upper level. + */ +void +tx_error(txdrv_t *tx) +{ + txdrv_t *t; + + tx->flags |= TX_ERROR; + + /* + * Flag all the layers up to the top with a "write-fault" flag to help + * us catch any user bug in the error processing callback, or possibly + * an internal error in some TX service routine. + * --RAM, 2015-03-14 + */ + + for (t = tx; t; t = t->upper) { + t->flags |= TX_WR_FAULT; + } +} + +/** * Argument for tx_close_next(). */ struct tx_close_arg { txdrv_t *top; /**< Top of the stack */ tx_closed_t cb; /**< User-supplied "close" callback */ - gpointer arg; /**< User-supplied argument */ + void *arg; /**< User-supplied argument */ }; /** @@ -453,12 +558,12 @@ * invoke the user callback. */ static void -tx_close_next(txdrv_t *tx, gpointer arg) +tx_close_next(txdrv_t *tx, void *arg) { struct tx_close_arg *carg = arg; txdrv_t *lower; - g_assert(tx); + tx_check(tx); /* * If there is no lower driver attached to the layer we just closed, @@ -471,7 +576,7 @@ if (NULL == tx->lower || tx_has_error(tx)) { txdrv_t *top; tx_closed_t cb; - gpointer arg2; + void *arg2; top = carg->top; cb = carg->cb; @@ -501,11 +606,11 @@ * its data. When the whole stack is done, invoke the specified callback. */ void -tx_close(txdrv_t *tx, tx_closed_t cb, gpointer arg) +tx_close(txdrv_t *tx, tx_closed_t cb, void *arg) { struct tx_close_arg *carg; - g_assert(tx); + tx_check(tx); g_assert(tx->upper == NULL); WALLOC(carg); @@ -536,8 +641,10 @@ * No-operation closing routine for layers that don't need anything special. */ void -tx_close_noop(txdrv_t *tx, tx_closed_t cb, gpointer arg) +tx_close_noop(txdrv_t *tx, tx_closed_t cb, void *arg) { + tx_check(tx); + (*cb)(tx, arg); } @@ -545,7 +652,7 @@ * The write() operation is forbidden. */ ssize_t -tx_no_write(txdrv_t *unused_tx, gconstpointer unused_data, size_t unused_len) +tx_no_write(txdrv_t *unused_tx, const void *unused_data, size_t unused_len) { (void) unused_tx; (void) unused_data; @@ -573,13 +680,12 @@ * The sendto() operation is forbidden. */ ssize_t -tx_no_sendto(txdrv_t *unused_tx, const gnet_host_t *unused_to, - gconstpointer unused_data, size_t unused_len) +tx_no_sendto(txdrv_t *unused_tx, + pmsg_t *unused_mb, const gnet_host_t *unused_to) { (void) unused_tx; + (void) unused_mb; (void) unused_to; - (void) unused_data; - (void) unused_len; g_error("no sendto() operation allowed"); errno = ENOENT; return -1; @@ -601,22 +707,7 @@ *** Selective debugging TX support, to limit tracing to specific addresses. ***/ -static GHashTable *tx_addrs; - -/** - * Hashtable iterator callback to free address. - */ -static gboolean -tx_debug_free_addrs(void *key, void *uvalue, void *udata) -{ - host_addr_t *ha = key; - - (void) uvalue; - (void) udata; - - WFREE(ha); - return TRUE; -} +static ipset_t tx_addrs = IPSET_INIT; /** * Record IP addresses in the set of "debuggable" destinations. @@ -624,44 +715,16 @@ void tx_debug_set_addrs(const char *s) { - strtok_t *st; - const char *tok; - - if (NULL == tx_addrs) { - tx_addrs = g_hash_table_new(host_addr_hash_func, host_addr_eq_func); - } else { - g_hash_table_foreach_remove(tx_addrs, tx_debug_free_addrs, NULL); - } - - st = strtok_make_strip(s); - - while ((tok = strtok_next(st, ","))) { - host_addr_t ha; - ZERO(&ha); - if (string_to_host_addr(tok, NULL, &ha)) { - host_addr_t *h = WCOPY(&ha); - g_hash_table_insert(tx_addrs, h, NULL); - } - } - - strtok_free(st); - - if (0 == g_hash_table_size(tx_addrs)) - gm_hash_table_destroy_null(&tx_addrs); + ipset_set_addrs(&tx_addrs, s); } /** * Are we debugging traffic sent to the IP of the host? */ -gboolean -tx_debug_host(gnet_host_t *h) +bool +tx_debug_host(const gnet_host_t *h) { - if G_UNLIKELY(NULL != tx_addrs) { - host_addr_t ha = gnet_host_get_addr(h); - return gm_hash_table_contains(tx_addrs, &ha); - } else { - return FALSE; - } + return ipset_contains_host(&tx_addrs, h, TRUE); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/tx.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/tx.h
Changed
@@ -37,58 +37,70 @@ #include "common.h" #include "lib/gnet_host.h" +#include "lib/pmsg.h" struct txdrv_ops; struct bio_source; struct gnutella_node; -typedef void (*tx_service_t)(gpointer obj); +typedef void (*tx_service_t)(void *obj); + +enum txdrv_magic { TXDRV_MAGIC = 0x5189ae4d }; /** * A network driver. */ - typedef struct txdriver { - gpointer owner; /**< Object owning the stack */ + enum txdrv_magic magic; /**< Magic number */ + void *owner; /**< Object owning the stack */ gnet_host_t host; /**< Host information (ip, port) */ const struct txdrv_ops *ops; /**< Dynamically dispatched operations */ struct txdriver *upper; /**< Layer above, NULL if none */ struct txdriver *lower; /**< Layer underneath, NULL if none */ int flags; /**< Driver flags */ tx_service_t srv_routine; /**< Service routine of upper TX layer */ - gpointer srv_arg; /**< Service routine argument */ - gpointer opaque; /**< Used by heirs to store specific info */ + void *srv_arg; /**< Service routine argument */ + void *opaque; /**< Used by heirs to store specific info */ } txdrv_t; +static inline void +tx_check(const txdrv_t *tx) +{ + g_assert(tx != NULL); + g_assert(TXDRV_MAGIC == tx->magic); +} + /* * Driver flags. */ -#define TX_SERVICE 0x00000001 /**< Servicing of upper layer needed */ -#define TX_ERROR 0x00000002 /**< Fatal error detected */ -#define TX_DOWN 0x00000004 /**< No further writes allowed */ -#define TX_CLOSING 0x00000008 /**< Closing, no further writes allowed */ -#define TX_EAGER 0x00000010 /**< Always service the queue */ +#define TX_SERVICE (1 << 0) /**< Servicing of upper layer needed */ +#define TX_ERROR (1 << 1) /**< Fatal error detected */ +#define TX_DOWN (1 << 2) /**< No further writes allowed */ +#define TX_CLOSING (1 << 3) /**< Closing, no further writes allowed */ +#define TX_EAGER (1 << 4) /**< Always service the queue */ +#define TX_WR_FAULT (1 << 5) /**< Ignore writes + loudly carp */ +#define TX_WR_WARNED (1 << 6) /**< Has warned after a write fault */ /** * Operations defined on all drivers. */ -typedef void (*tx_closed_t)(txdrv_t *tx, gpointer arg); +typedef void (*tx_closed_t)(txdrv_t *tx, void *arg); struct txdrv_ops { - gpointer (*init)(txdrv_t *tx, gpointer args); + const char *name; + void *(*init)(txdrv_t *tx, void *args); void (*destroy)(txdrv_t *tx); - ssize_t (*write)(txdrv_t *tx, gconstpointer data, size_t len); + ssize_t (*write)(txdrv_t *tx, const void *data, size_t len); ssize_t (*writev)(txdrv_t *tx, iovec_t *iov, int iovcnt); - ssize_t (*sendto)(txdrv_t *tx, const gnet_host_t *to, - gconstpointer data, size_t len); + ssize_t (*sendto)(txdrv_t *tx, pmsg_t *mb, const gnet_host_t *to); void (*enable)(txdrv_t *tx); void (*disable)(txdrv_t *tx); size_t (*pending)(txdrv_t *tx); void (*flush)(txdrv_t *tx); void (*shutdown)(txdrv_t *tx); - void (*close)(txdrv_t *tx, tx_closed_t cb, gpointer arg); + void (*close)(txdrv_t *tx, tx_closed_t cb, void *arg); struct bio_source *(*bio_source)(txdrv_t *tx); }; @@ -96,37 +108,36 @@ * Public interface */ -txdrv_t *tx_make(gpointer owner, const gnet_host_t *host, - const struct txdrv_ops *ops, gpointer args); -txdrv_t *tx_make_above(txdrv_t *ltx, const struct txdrv_ops *ops, - gpointer args); +txdrv_t *tx_make(void *owner, const gnet_host_t *host, + const struct txdrv_ops *ops, void *args); +txdrv_t *tx_make_above(txdrv_t *ltx, const struct txdrv_ops *ops, void *args); void tx_free(txdrv_t *tx); void tx_collect(void); -ssize_t tx_write(txdrv_t *tx, gconstpointer data, size_t len); +ssize_t tx_write(txdrv_t *tx, const void *data, size_t len); ssize_t tx_writev(txdrv_t *tx, iovec_t *iov, int iovcnt); -ssize_t tx_sendto(txdrv_t *tx, const gnet_host_t *to, - gconstpointer data, size_t len); -void tx_srv_register(txdrv_t *d, tx_service_t srv_fn, gpointer srv_arg); +ssize_t tx_sendto(txdrv_t *tx, pmsg_t *mb, const gnet_host_t *to); +void tx_srv_register(txdrv_t *d, tx_service_t srv_fn, void *srv_arg); void tx_srv_enable(txdrv_t *tx); void tx_srv_disable(txdrv_t *tx); size_t tx_pending(txdrv_t *tx); struct bio_source *tx_bio_source(txdrv_t *tx); -ssize_t tx_no_write(txdrv_t *tx, gconstpointer data, size_t len); +ssize_t tx_no_write(txdrv_t *tx, const void *data, size_t len); ssize_t tx_no_writev(txdrv_t *tx, iovec_t *iov, int iovcnt); -ssize_t tx_no_sendto(txdrv_t *tx, const gnet_host_t *to, - gconstpointer data, size_t len); +ssize_t tx_no_sendto(txdrv_t *tx, pmsg_t *mb, const gnet_host_t *to); void tx_flush(txdrv_t *tx); +void tx_error(txdrv_t *tx); void tx_shutdown(txdrv_t *tx); -void tx_close(txdrv_t *d, tx_closed_t cb, gpointer arg); -void tx_close_noop(txdrv_t *tx, tx_closed_t cb, gpointer arg); -gboolean tx_has_error(txdrv_t *tx); -void tx_eager_mode(txdrv_t *tx, gboolean on); +void tx_close(txdrv_t *d, tx_closed_t cb, void *arg); +void tx_close_noop(txdrv_t *tx, tx_closed_t cb, void *arg); +bool tx_has_error(const txdrv_t *tx); +const char *tx_error_layer_name(const txdrv_t *tx); +void tx_eager_mode(txdrv_t *tx, bool on); struct bio_source *tx_no_source(txdrv_t *tx); void tx_debug_set_addrs(const char *s); -gboolean tx_debug_host(gnet_host_t *h); +bool tx_debug_host(const gnet_host_t *h); #endif /* _core_tx_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/tx_chunk.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/tx_chunk.c
Changed
@@ -59,8 +59,10 @@ #include "if/gnet_property_priv.h" #include "lib/cq.h" -#include "lib/glib-missing.h" +#include "lib/str.h" +#include "lib/stringify.h" /* For plural() */ #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ /* @@ -79,9 +81,9 @@ ssize_t head_len; /**< Length of chunk header */ ssize_t head_remain; /**< Amount of unwritten header data */ ssize_t data_remain; /**< Data required to complete chunk */ - gboolean first; /**< True for first chunk */ tx_closed_t closed; /**< Callback to invoke when layer closed */ - gpointer closed_arg; /**< Argument for closing routine */ + void *closed_arg; /**< Argument for closing routine */ + unsigned first:1; /**< True for first chunk */ }; /** @@ -134,7 +136,7 @@ * if we encountered an error. */ static ssize_t -chunk_begin(txdrv_t *tx, size_t len, gboolean final) +chunk_begin(txdrv_t *tx, size_t len, bool final) { struct attr *attr = tx->opaque; size_t hlen = 0; @@ -147,7 +149,7 @@ g_debug("TX %s: %s chunk %zu byte%s", G_STRFUNC, final ? "final" : attr->first ? "first" : - "next", len, len == 1 ? "" : "s"); + "next", len, plural(len)); /* * Build the chunk header, committing on sending `len' bytes of data. @@ -158,14 +160,14 @@ */ if (!attr->first) - hlen = gm_snprintf(attr->head, sizeof attr->head, "\r\n"); + hlen = str_bprintf(attr->head, sizeof attr->head, "\r\n"); if (final) - hlen += gm_snprintf(&attr->headhlen, sizeof attr->head - hlen, + hlen += str_bprintf(&attr->headhlen, sizeof attr->head - hlen, "0\r\n\r\n"); else - hlen += gm_snprintf(&attr->headhlen, sizeof attr->head - hlen, - "%lx\r\n", (gulong) len); + hlen += str_bprintf(&attr->headhlen, sizeof attr->head - hlen, + "%lx\r\n", (ulong) len); attr->head_len = attr->head_remain = hlen; attr->data_remain = len; @@ -214,7 +216,7 @@ * Called by lower layer when it is ready to process more data. */ static void -chunk_service(gpointer data) +chunk_service(void *data) { txdrv_t *tx = data; struct attr *attr = tx->opaque; @@ -260,8 +262,8 @@ * * Always succeeds, so never returns NULL. */ -static gpointer -tx_chunk_init(txdrv_t *tx, gpointer unused_args) +static void * +tx_chunk_init(txdrv_t *tx, void *unused_args) { struct attr *attr; @@ -302,7 +304,7 @@ * @return amount of data bytes written, or -1 on error. */ static ssize_t -tx_chunk_write(txdrv_t *tx, gconstpointer data, size_t len) +tx_chunk_write(txdrv_t *tx, const void *data, size_t len) { struct attr *attr = tx->opaque; size_t remain = len; @@ -364,7 +366,7 @@ */ while (iovcnt--) { - ssize_t r = tx_chunk_write(tx, + ssize_t r = tx_chunk_write(tx, iovec_base(iov), iovec_len(iov)); if (-1 == r) return -1; @@ -446,7 +448,7 @@ * Once this is done, invoke the supplied callback. */ static void -tx_chunk_close(txdrv_t *tx, tx_closed_t cb, gpointer arg) +tx_chunk_close(txdrv_t *tx, tx_closed_t cb, void *arg) { struct attr *attr = tx->opaque; @@ -481,6 +483,7 @@ } static const struct txdrv_ops tx_chunk_ops = { + "chunk", /**< name */ tx_chunk_init, /**< init */ tx_chunk_destroy, /**< destroy */ tx_chunk_write, /**< write */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/tx_chunk.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/tx_chunk.h
Changed
@@ -31,7 +31,7 @@ * @date 2005 */ -#ifndef _core_tx_chunk_h +#ifndef _core_tx_chunk_h_ #define _core_tx_chunk_h_ #include "common.h"
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/tx_deflate.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/tx_deflate.c
Changed
@@ -46,6 +46,7 @@ #include "lib/cq.h" #include "lib/endian.h" +#include "lib/mempcpy.h" #include "lib/tm.h" #include "lib/walloc.h" #include "lib/zlib_util.h" @@ -97,14 +98,14 @@ cevent_t *tm_ev; /**< The timer event */ const struct tx_deflate_cb *cb; /**< Layer-specific callbacks */ tx_closed_t closed; /**< Callback to invoke when layer closed */ - gpointer closed_arg; /**< Argument for closing routine */ + void *closed_arg; /**< Argument for closing routine */ time_t nagle_start; /**< When we started the Nagle timer */ - gboolean nagle; /**< Whether to use Nagle or not */ struct { - gboolean enabled; /**< Whether to use gzip encapsulation */ - guint32 size; /**< Payload size counter for gzip */ + bool enabled; /**< Whether to use gzip encapsulation */ + uint32 size; /**< Payload size counter for gzip */ uLong crc; /**< CRC-32 accumlator for gzip */ } gzip; + unsigned nagle:1; /**< Whether to use Nagle or not */ }; /* @@ -116,7 +117,7 @@ #define DF_FLUSH 0x00000004 /**< Flushing started */ #define DF_SHUTDOWN 0x00000008 /**< Stack has shut down */ -static void deflate_nagle_timeout(cqueue_t *cq, gpointer arg); +static void deflate_nagle_timeout(cqueue_t *cq, void *arg); static size_t tx_deflate_pending(txdrv_t *tx); #define tx_deflate_debugging(lvl) \ @@ -159,7 +160,7 @@ (attr->flags & DF_FLUSH) ? 'f' : '-'); } if ((ssize_t) -1 == r) { - tx->flags |= TX_ERROR; + tx_error(tx); return; } @@ -312,7 +313,7 @@ * Enter or leave flow-control. */ static void -deflate_set_flowc(txdrv_t *tx, gboolean on) +deflate_set_flowc(txdrv_t *tx, bool on) { struct attr *attr = tx->opaque; @@ -379,7 +380,7 @@ * * @return success status, failure meaning we shutdown. */ -static gboolean +static bool deflate_flush(txdrv_t *tx) { struct attr *attr = tx->opaque; @@ -408,7 +409,7 @@ * be consumed. */ - outz->next_out = cast_to_gpointer(b->wptr); + outz->next_out = cast_to_pointer(b->wptr); outz->avail_out = old_avail = b->end - b->wptr; outz->avail_in = 0; @@ -425,7 +426,7 @@ break; default: attr->flags |= DF_SHUTDOWN; - tx->flags |= TX_ERROR; + tx_error(tx); /* XXX: The callback must not destroy the tx! */ (*attr->cb->shutdown)(tx->owner, "Compression flush failed: %s", @@ -503,12 +504,12 @@ * If we can send the buffer, flush it and send it. Otherwise, reschedule. */ static void -deflate_nagle_timeout(cqueue_t *unused_cq, gpointer arg) +deflate_nagle_timeout(cqueue_t *cq, void *arg) { txdrv_t *tx = arg; struct attr *attr = tx->opaque; - (void) unused_cq; + cq_zero(cq, &attr->tm_ev); if (-1 != attr->send_idx) { /* Send buffer still incompletely sent */ @@ -525,7 +526,6 @@ } attr->flags &= ~DF_NAGLE; - attr->tm_ev = NULL; if (tx_deflate_debugging(9)) { struct buffer *b = &attr->bufattr->fill_idx; /* Buffer to send */ @@ -546,7 +546,7 @@ * @return the amount of input bytes that were consumed ("added"), -1 on error. */ static int -deflate_add(txdrv_t *tx, gconstpointer data, int len) +deflate_add(txdrv_t *tx, const void *data, int len) { struct attr *attr = tx->opaque; z_streamp outz = attr->outz; @@ -554,18 +554,27 @@ if (tx_deflate_debugging(9)) { g_debug("TX %s: (%s) given %u bytes (buffer #%d, nagle %s, " - "unflushed %zu) %c%c", G_STRFUNC, + "unflushed %zu) %c%c%s", G_STRFUNC, gnet_host_to_string(&tx->host), len, attr->fill_idx, (attr->flags & DF_NAGLE) ? "on" : "off", attr->unflushed, (attr->flags & DF_FLOWC) ? 'C' : '-', - (attr->flags & DF_FLUSH) ? 'f' : '-'); + (attr->flags & DF_FLUSH) ? 'f' : '-', + (tx->flags & TX_ERROR) ? " ERROR" : ""); } + /* + * If an error was already reported, the whole deflate stream is dead + * and we cannot accept any more data. + */ + + if G_UNLIKELY(tx->flags & TX_ERROR) + return -1; + while (added < len) { struct buffer *b = &attr->bufattr->fill_idx; /* Buffer we fill */ int ret; int old_added = added; - gboolean flush_started = (attr->flags & DF_FLUSH) ? TRUE : FALSE; + bool flush_started = (attr->flags & DF_FLUSH) ? TRUE : FALSE; int old_avail; const char *in, *old_in; @@ -573,12 +582,12 @@ * Prepare call to deflate(). */ - outz->next_out = cast_to_gpointer(b->wptr); + outz->next_out = cast_to_pointer(b->wptr); outz->avail_out = old_avail = b->end - b->wptr; in = data; old_in = &inadded; - outz->next_in = deconstify_gpointer(old_in); + outz->next_in = deconstify_pointer(old_in); outz->avail_in = len - added; g_assert(outz->avail_out > 0); @@ -604,7 +613,7 @@ * Update the parameters. */ - b->wptr = cast_to_gpointer(outz->next_out); + b->wptr = cast_to_pointer(outz->next_out); added = ptr_diff(outz->next_in, in); g_assert(added >= old_added); @@ -621,7 +630,7 @@ r = ptr_diff(outz->next_in, old_in); attr->gzip.size += r; attr->gzip.crc = crc32(attr->gzip.crc, - cast_to_gconstpointer(old_in), r); + cast_to_constpointer(old_in), r); } if (tx_deflate_debugging(9)) { @@ -696,7 +705,7 @@ * Called by lower layer when it is ready to process more data. */ static void -deflate_service(gpointer data) +deflate_service(void *data) { txdrv_t *tx = data; struct attr *attr = tx->opaque; @@ -809,8 +818,8 @@ * * @return NULL if there is an initialization problem. */ -static gpointer -tx_deflate_init(txdrv_t *tx, gpointer args) +static void * +tx_deflate_init(txdrv_t *tx, void *args) { struct attr *attr; struct tx_deflate_args *targs = args; @@ -893,7 +902,7 @@ attr->cb = targs->cb; attr->buffer_size = targs->buffer_size; attr->buffer_flush = targs->buffer_flush; - attr->nagle = targs->nagle; + attr->nagle = booleanize(targs->nagle); attr->gzip.enabled = targs->gzip; attr->outz = outz; @@ -923,8 +932,7 @@ b = &attr->bufattr->fill_idx; /* Buffer we fill */ g_assert(sizeof header <= (size_t) (b->end - b->wptr)); - memcpy(b->wptr, header, sizeof header); - b->wptr += sizeof header; + b->wptr = mempcpy(b->wptr, header, sizeof header); attr->gzip.crc = crc32(0, NULL, 0); attr->gzip.size = 0; @@ -979,7 +987,7 @@ * @return amount of bytes written, or -1 on error. */ static ssize_t -tx_deflate_write(txdrv_t *tx, gconstpointer data, size_t len) +tx_deflate_write(txdrv_t *tx, const void *data, size_t len) { struct attr *attr = tx->opaque; @@ -1045,7 +1053,7 @@ if (tx_deflate_debugging(9)) { g_debug("TX %s: (%s) sent %lu bytes (buffer #%d, nagle %s, " "unflushed %zu) %c%c", G_STRFUNC, - gnet_host_to_string(&tx->host), (gulong) sent, attr->fill_idx, + gnet_host_to_string(&tx->host), (ulong) sent, attr->fill_idx, (attr->flags & DF_NAGLE) ? "on" : "off", attr->unflushed, (attr->flags & DF_FLOWC) ? 'C' : '-', (attr->flags & DF_FLUSH) ? 'f' : '-'); @@ -1133,7 +1141,7 @@ * Once this is done, invoke the supplied callback. */ static void -tx_deflate_close(txdrv_t *tx, tx_closed_t cb, gpointer arg) +tx_deflate_close(txdrv_t *tx, tx_closed_t cb, void *arg) { struct attr *attr = tx->opaque; @@ -1157,19 +1165,18 @@ if (attr->gzip.enabled && 0 == tx_deflate_pending(tx)) { /* See RFC 1952 - GZIP file format specification version 4.3 */ struct buffer *b; - guint32 trailer2; /* 0: CRC32, 1: SIZE % (1 << 32) */ + uint32 trailer2; /* 0: CRC32, 1: SIZE % (1 << 32) */ /* We don't want to send the trailer more than once */ attr->gzip.enabled = FALSE; attr->send_idx = 0; b = &attr->bufattr->send_idx; - poke_le32(&trailer0, (guint32) attr->gzip.crc); + poke_le32(&trailer0, (uint32) attr->gzip.crc); poke_le32(&trailer1, attr->gzip.size); g_assert(sizeof trailer <= (size_t) (b->end - b->wptr)); - memcpy(b->wptr, trailer, sizeof trailer); - b->wptr += sizeof trailer; + b->wptr = mempcpy(b->wptr, trailer, sizeof trailer); deflate_send(tx); } @@ -1202,6 +1209,7 @@ } static const struct txdrv_ops tx_deflate_ops = { + "deflate", /**< name */ tx_deflate_init, /**< init */ tx_deflate_destroy, /**< destroy */ tx_deflate_write, /**< write */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/tx_deflate.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/tx_deflate.h
Changed
@@ -45,22 +45,22 @@ * Callbacks used by the deflating layer. */ struct tx_deflate_cb { - void (*add_tx_deflated)(gpointer owner, int amount); - void (*shutdown)(gpointer owner, const char *reason, ...); - void (*flow_control)(gpointer owner, size_t amount); + void (*add_tx_deflated)(void *owner, int amount); + void (*shutdown)(void *owner, const char *reason, ...); + void (*flow_control)(void *owner, size_t amount); }; /** - * Arguments to be passed when the layer is intantiated. + * Arguments to be passed when the layer is instantiated. */ struct tx_deflate_args { const struct tx_deflate_cb *cb; /**< Callbacks */ cqueue_t *cq; /**< Callout queue to use */ size_t buffer_size; /**< Internal buffer size to use */ size_t buffer_flush; /**< Flush after that many bytes */ - gboolean nagle; /**< Whether to use Nagle or not */ - gboolean gzip; /**< Whether to use gzip encapsulation */ - gboolean reduced; /**< Whether to use reduced compression */ + bool nagle; /**< Whether to use Nagle or not */ + bool gzip; /**< Whether to use gzip encapsulation */ + bool reduced; /**< Whether to use reduced compression */ }; #endif /* _core_tx_deflate_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/tx_dgram.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/tx_dgram.c
Changed
@@ -27,7 +27,8 @@ * * Network driver -- datagram level. * - * This driver sends datagrams to specified hosts. + * This driver sends datagrams to specified hosts by enqueuing them to the + * UDP scheduling layer. * * @author Raphael Manfredi * @date 2002-2003 @@ -35,38 +36,37 @@ #include "common.h" -#include "bsched.h" -#include "sockets.h" #include "tx.h" #include "tx_dgram.h" -#include "hosts.h" -#include "inet.h" +#include "udp_sched.h" +#include "lib/host_addr.h" #include "lib/gnet_host.h" -#include "lib/misc.h" -#include "lib/tm.h" +#include "lib/pmsg.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ /* * Private attributes for the layer. */ struct attr { - wrap_io_t *wio; /**< Cached wrapped IO object */ - bio_source_t *bio; /**< Bandwidth-limited I/O source */ - struct tx_dgram_cb *cb; /**< Layer-specific callbacks */ + udp_sched_t *us; /**< UDP TX scheduler */ + enum net_type net; /**< IPv4 or IPv6? */ + const struct tx_dgram_cb *cb; /**< Layer-specific callbacks */ + unsigned service:1; /**< Is servicing requested? */ }; /** * Invoked when the output file descriptor can accept more data. */ static void -is_writable(gpointer data, int unused_source, inputevt_cond_t cond) +is_writable(void *data, int unused_source, inputevt_cond_t cond) { txdrv_t *tx = (txdrv_t *) data; + struct attr *attr = tx->opaque; (void) unused_source; - g_assert(tx->flags & TX_SERVICE); /* Servicing enabled */ if (cond & INPUT_EVENT_EXCEPTION) { g_warning("input exception on UDP socket"); @@ -74,11 +74,13 @@ } /* - * We can write again on the node's socket. Service the queue. + * We can write again to the UDP socket. Service the queue if needed. */ g_assert(tx->srv_routine); - tx->srv_routine(tx->srv_arg); + + if (attr->service) + tx->srv_routine(tx->srv_arg); } /*** @@ -90,34 +92,32 @@ * * Always succeeds, so never returns NULL. */ -static gpointer -tx_dgram_init(txdrv_t *tx, gpointer args) +static void * +tx_dgram_init(txdrv_t *tx, void *args) { struct attr *attr; struct tx_dgram_args *targs = args; g_assert(tx); g_assert(targs->cb != NULL); - g_assert(s_udp_listen != NULL || s_udp_listen6 != NULL); + g_assert(NET_TYPE_IPV4 == targs->net || NET_TYPE_IPV6 == targs->net); WALLOC(attr); /* - * Because we handle servicing of the upper layers explicitely within - * the TX stack (i.e. upper layers detect that we were unable to comply - * with the whole write and enable us), there is no I/O callback attached - * to the I/O source: we only create it to benefit from bandwidth limiting - * through calls to bio_sendto(). + * This TX layer redirects all the messages to the UDP TX scheduling + * layer which will take care of the actual sending and bandwidth + * regulation. */ attr->cb = targs->cb; - attr->wio = targs->wio; - attr->bio = bsched_source_add(targs->bws, attr->wio, BIO_F_WRITE, - NULL, NULL); + attr->us = targs->us; + attr->net = targs->net; + attr->service = FALSE; tx->opaque = attr; - g_assert(attr->wio->sendto != NULL); + udp_sched_attach(attr->us, tx, is_writable); return tx; /* OK */ } @@ -130,101 +130,22 @@ { struct attr *attr = tx->opaque; - bsched_source_remove(attr->bio); - + udp_sched_detach(attr->us, tx); WFREE(attr); } -static inline int -tx_dgram_write_error(txdrv_t *tx, const gnet_host_t *to, size_t len, - const char *func) -{ - if (is_temporary_error(errno) || ENOBUFS == errno) - return 0; - - switch (errno) { - /* - * The following are probably due to bugs in the libc, but this is in - * the same vein as write() failing with -1 whereas errno == 0! Be more - * robust against bugs in the components we rely on. --RAM, 09/10/2003 - */ - case EINPROGRESS: /* Weird, but seen it -- RAM, 07/10/2003 */ - { - const struct attr *attr = tx->opaque; - g_warning("%s(fd=%d, len=%zu) failed with weird errno = %m -- " - "assuming EAGAIN", func, attr->wio->fd(attr->wio), len); - } - return 0; - case EPIPE: - case ENOSPC: - case ENOMEM: - case EINVAL: /* Seen this with "reserved" IP addresses */ -#ifdef EDQUOT - case EDQUOT: -#endif /* EDQUOT */ - case EMSGSIZE: /* Message too large */ - case EFBIG: - case EIO: - case EADDRNOTAVAIL: - case ECONNABORTED: - case ECONNRESET: - case ECONNREFUSED: - case ENETRESET: - case ENETDOWN: - case ENETUNREACH: - case EHOSTDOWN: - case EHOSTUNREACH: - case ENOPROTOOPT: - case EPROTONOSUPPORT: - case ETIMEDOUT: - case EACCES: - case EPERM: - /* - * Don't set TX_ERROR here, we don't care about lost packets. - */ - g_carp("UDP write of %zu bytes to %s failed: %m", - len, gnet_host_to_string(to)); - return -1; - default: - { - int terr = errno; - tx->flags |= TX_ERROR; /* This should be fatal! */ - g_error("%s: UDP write of %lu bytes to %s failed " - "with unexpected errno %d: %m", - func, (unsigned long) len, gnet_host_to_string(to), terr); - } - } - - return 0; /* Just in case */ -} - /** * Send buffer datagram to specified destination `to'. * - * @returns amount of bytes written, or -1 on error with errno set. + * @return amount of bytes written, or 0 if message was unsent and we + * need to flow-control the upper layer (no more bandwidth). */ static ssize_t -tx_dgram_sendto(txdrv_t *tx, const gnet_host_t *to, - gconstpointer data, size_t len) +tx_dgram_sendto(txdrv_t *tx, pmsg_t *mb, const gnet_host_t *to) { - ssize_t r; struct attr *attr = tx->opaque; - if (gnet_host_get_port(to) > 0) { - r = bio_sendto(attr->bio, to, data, len); - } else { - errno = EINVAL; - r = -1; - } - if ((ssize_t) -1 == r) - return tx_dgram_write_error(tx, to, len, "tx_dgram_sendto"); - - if (attr->cb->add_tx_written != NULL) - attr->cb->add_tx_written(tx->owner, r); - - inet_udp_record_sent(gnet_host_get_addr(to)); - - return r; + return udp_sched_send(attr->us, mb, to, tx, attr->cb); } /** @@ -235,7 +156,7 @@ { struct attr *attr = tx->opaque; - bio_add_callback(attr->bio, is_writable, (gpointer) tx); + attr->service = TRUE; } /** @@ -246,17 +167,18 @@ { struct attr *attr = tx->opaque; - bio_remove_callback(attr->bio); + attr->service = FALSE; } /** - * No data buffered at this level: always returns 0. + * @return the amount of data buffered locally. */ static size_t -tx_dgram_pending(txdrv_t *unused_tx) +tx_dgram_pending(txdrv_t *tx) { - (void) unused_tx; - return 0; + struct attr *attr = tx->opaque; + + return udp_sched_pending(attr->us); } /** @@ -285,10 +207,11 @@ { struct attr *attr = tx->opaque; - return attr->bio; + return udp_sched_bio_source(attr->us, attr->net); } static const struct txdrv_ops tx_dgram_ops = { + "datagram", /**< name */ tx_dgram_init, /**< init */ tx_dgram_destroy, /**< destroy */ tx_no_write, /**< write */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/tx_dgram.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/tx_dgram.h
Changed
@@ -37,6 +37,9 @@ #include "common.h" #include "tx.h" +#include "lib/pmsg.h" +#include "lib/host_addr.h" + #include "if/core/bsched.h" const struct txdrv_ops *tx_dgram_get_ops(void); @@ -45,16 +48,17 @@ * Callbacks used by the datagram layer. */ struct tx_dgram_cb { - void (*add_tx_written)(gpointer owner, int amount); + void (*msg_account)(void *owner, const pmsg_t *mb); + void (*add_tx_dropped)(void *owner, int amount); }; /** - * Arguments to be passed when the layer is intantiated. + * Arguments to be passed when the layer is instantiated. */ struct tx_dgram_args { struct tx_dgram_cb *cb; /**< Callbacks */ - struct wrap_io *wio; /**< I/O wrapping routines */ - bsched_bws_t bws; /**< Bandwidth scheduler to use */ + struct udp_sched *us; /**< UDP TX scheduler */ + enum net_type net; /**< Network type (IPv4 or IPv6) */ }; #endif /* _core_tx_dgram_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/tx_link.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/tx_link.c
Changed
@@ -59,7 +59,7 @@ * Invoked when the output file descriptor can accept more data. */ static void -is_writable(gpointer data, int unused_source, inputevt_cond_t cond) +is_writable(void *data, int unused_source, inputevt_cond_t cond) { txdrv_t *tx = data; struct attr *attr = tx->opaque; @@ -68,7 +68,7 @@ g_assert(tx->flags & TX_SERVICE); /* Servicing enabled */ if (cond & INPUT_EVENT_EXCEPTION) { - tx->flags |= TX_ERROR; + tx_error(tx); attr->cb->eof_remove(tx->owner, _("Write failed (Input Exception)")); return; } @@ -90,8 +90,8 @@ * * Always succeeds, so never returns NULL. */ -static gpointer -tx_link_init(txdrv_t *tx, gpointer args) +static void * +tx_link_init(txdrv_t *tx, void *args) { struct tx_link_args *targs = args; struct attr *attr; @@ -157,7 +157,7 @@ case EPIPE: case ECONNRESET: case ECONNABORTED: - tx->flags |= TX_ERROR; + tx_error(tx); attr->cb->eof_remove(tx->owner, _("Write failed: %s"), g_strerror(errno)); return -1; @@ -175,6 +175,9 @@ #ifdef EDQUOT case EDQUOT: #endif /* EDQUOT */ +#ifdef ESHUTDOWN + case ESHUTDOWN: +#endif /* ESHUTDOWN */ case EACCES: case EFBIG: case EHOSTDOWN: @@ -183,7 +186,7 @@ case ENETDOWN: case ENETUNREACH: case ETIMEDOUT: - tx->flags |= TX_ERROR; + tx_error(tx); attr->cb->eof_shutdown(tx->owner, _("Write failed: %s"), g_strerror(errno)); return -1; @@ -198,7 +201,7 @@ * @return amount of bytes written, or -1 on error. */ static ssize_t -tx_link_write(txdrv_t *tx, gconstpointer data, size_t len) +tx_link_write(txdrv_t *tx, const void *data, size_t len) { struct attr *attr = tx->opaque; ssize_t r; @@ -242,7 +245,7 @@ { struct attr *attr = tx->opaque; - bio_add_callback(attr->bio, is_writable, (gpointer) tx); + bio_add_callback(attr->bio, is_writable, tx); } /** @@ -308,6 +311,7 @@ } static const struct txdrv_ops tx_link_ops = { + "link", /**< name */ tx_link_init, /**< init */ tx_link_destroy, /**< destroy */ tx_link_write, /**< write */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/tx_link.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/tx_link.h
Changed
@@ -45,14 +45,14 @@ * Callbacks used by the link layer. */ struct tx_link_cb { - void (*add_tx_written)(gpointer owner, int amount); - void (*eof_remove)(gpointer owner, const char *reason, ...); - void (*eof_shutdown)(gpointer owner, const char *reason, ...); - void (*unflushq)(gpointer owner); + void (*add_tx_written)(void *owner, int amount); + void (*eof_remove)(void *owner, const char *reason, ...); + void (*eof_shutdown)(void *owner, const char *reason, ...); + void (*unflushq)(void *owner); }; /** - * Arguments to be passed when the layer is intantiated. + * Arguments to be passed when the layer is instantiated. */ struct tx_link_args { const struct tx_link_cb *cb; /**< Callbacks */
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/tx_ut.c
Added
@@ -0,0 +1,2612 @@ +/* + * Copyright (c) 2012, 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * Network driver -- UDP transceiver layer (semi-reliable UDP) + * + * Initially designed for the G2 network, this semi-reliable UDP layer is + * actually general enough to be useful for Gnutella as well. It is for + * connection-less exchanges needing more reliability than what UDP/IP + * natively provides. + * + * UDP datagrams of large sizes can be sent to other hosts with native + * fragmentation into smaller packets and transparent compression of payloads. + * The layer also enables optional acknowledgment of packets, with feedback + * to the application layer when the packet has been sent, or failed its + * transmission. + * + * FRAMING OF FRAGMENTS + * + * Each payload is optionally deflated (if it saves data) and then split + * into many small fragments (typically of 476 bytes) that are then framed + * and sent over the network. + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7| Byte + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | idTag | nFlags | 0-3 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | nSequence | nPart | nCount | 4-7 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * idTag is a 3-byte unique protocol identifier allowing multiplexing of + * several protocols on the same socket. For instance, "GND" for the G2 + * UDP protocol, "GTA" for Gnutella UDP traffic. + * + * + * nFlags contains flags which modify the content of the packet. The + * low-order nibble is reserved for critical flags: if one of these bits + * is set but the decoding software does not understand the meaning, the + * packet must be discarded. The high-order nibble is reserved for + * non-critical flags: when set these bits may be interpreted, but an + * inability to interpret a bit does not cause the packet to be discarded. + * + * Currently defined flags are: + * + * - 0x1: Deflate. The whole payload was deflated with the additional zlib + * encapsulation (RFC 1950). + * - 0x2: Acknowledge Request: reception of the fragment must be acknowledged + * to the sender (ignored in acknowlegement messages). + * + * nSequence is a temporally unique sequence number for the payload. + * + * nPart is the fragment part number. 1 <= nPart <= nCount + * + * nCount is the fragment number, 0 meaning acknowledgment of the packet + * whose number is given in nPart. + * + * ACKNOWLEDGMENTS + * + * An acknowledgement is made of a single header with no application payload, + * and is sent out with nCount = 0 to let the other end know that the fragment + * number ``nPart'' of the sequence number ``nSequence'' has been received. + * + * Acknowledgments are sent out as highly prioritary messages, ahead of any + * other pending traffic. This is to avoid the other end from wasting bandwidth + * to resend a fragment that has in fact already been received. + * + * The "Acknowledge Request" flag bit is ignored in acknowledgment packets. + * + * Because acknowledgment messages can be lost in the way or arrive out of + * order, it is best to include as much of the reception state as possible + * so that the sending party can optimize retransmissions. + * + * In order to do that, the following extensions to the original specifications + * have been added by gtk-gnutella: + * + * - Cumulative Acknowledgements: when the flag 0x10 is set, it tells the other + * party that ALL the fragments up to ``nPart'' have been received. + * + * - Extended Acknowledgments: when the flag 0x20 is set, it tells the other + * party that an acknowledgment payload is present. It immediately follows + * the header and is architected thusly: + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7| Byte + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | nReceived | missingBits | 0-3 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * nReceived is the total amount of parts successfully received so far. + * + * missingBits is a bitfield that is read as a big-endian number and + * which contains set bits for the parts still missing. The base part number + * is normally 0, unless flag 0x10 was set, in which case the ``nPart'' + * value indicates the base. The rule is then that if bit ``b'' is set, + * then the fragment number "b + base + 1" is still missing. + * + * In the unlikely case where missingBits is too small to hold all the + * missing parts, only the ones that can be represented are included, the + * ``nReceived'' field being there to provide additional information. + * + * Proper generation and parsing of the missingBits field is crucial, so to + * remove any ambiguity, it is best to interpret missingBits as a number. + * Then bit 0 is the bit corresponding to 2^0, bit ``n'' is the bit + * corresponding to 2^n. + * + * Bit 0 corresponds to fragment #1, unless the 0x10 flag was set. In that + * case, if for instance ``nPart'' is 3, then it means fragments #1, #2 and + * #3 were already received. The base is therefore 3, and if bit 0 is set + * in missingBits, it means fragment #4 (0 + 3 + 1) is still missing. + * + * This extended acknowledgment lets the sending party optimize its + * retransmissions even when some acknowledgments are lost. + * + * Extended Acknowlegments are only useful when the total amount of fragments + * is 3 or above. Indeed, with only 2 fragments, the Cumulative Acknowledgment + * lets the receiving party know about the whole reception state. + * + * When the amount of fragments is 3 or more and only a Cumulative + * Acknowledgment is sent out, it implicitly denies reception of any other + * fragments. This optimizes bandwidth since the 4 extra bytes sent out will + * only be required for large messages (more than 2 fragments) in case fragments + * are received out-of-order. + * + * TRANSMISSION PARAMETERS + * + * Our maximum payload size is set to 476 bytes (to limit the total IP message + * to 512 bytes, including our 8-byte header + 28 bytes of UDP/IP header). + * The fragment transmission timeout (ACK not received) is set to 5 secs for + * the first transmission, 10 secs for the second and 20 secs for the third + * and last attempt (exponential retry delay). + * The packet transmission timeout is set to 60 secs (larger than 5+10+20+20=55 + * in case each fragment is not immediately sent out), to leave about 20 seconds + * to get the final acknowledgement back on the last re-transmission. + * + * LINK WITH THE RX SIDE + * + * Due to the reliability nature of the layer, the RX side must know the TX + * side of this layer to be able to feed the TX layer with acknowledgments + * to send back and acknowledgments received from remote peers. + * + * Because this is highly specific, the normal TX API is not suitable here. + * Instead, we use globally visible routines: ut_got_ack() and ut_send_ack(). + * + * When assembling the TX and RX stacks, the user code must therefore construct + * the TX stack first and pass the address of the TX layer to the corresponding + * RX layer. + * + * @author Raphael Manfredi + * @date 2012, 2014 + */ + +#include "common.h" + +#include <zlib.h> /* For Z_BEST_COMPRESSION */ + +#include "tx_ut.h" +#include "gnet_stats.h" +#include "udp_reliable.h" + +#include "if/gnet_property_priv.h" + +#include "lib/aging.h" +#include "lib/atoms.h" +#include "lib/cq.h" +#include "lib/elist.h" +#include "lib/eslist.h" +#include "lib/gnet_host.h" +#include "lib/hevset.h" +#include "lib/idtable.h" +#include "lib/nid.h" +#include "lib/stringify.h" +#include "lib/tm.h" +#include "lib/unsigned.h" +#include "lib/walloc.h" +#include "lib/zlib_util.h" + +#include "lib/override.h" /* Must be the last header included */ + +#define TX_UT_MTU 476 /* Our MTU (max byes per fragment) */ +#define TX_UT_FRAG_MAX 255 /* At most 255 fragments per message */ +#define TX_UT_MSG_MAXSIZE (TX_UT_MTU * TX_UT_FRAG_MAX) +#define TX_UT_SEND_MAX 4 /* Max amount of fragment transmissions */ +#define TX_UT_EAR_SEND_MAX 3 /* Max amount of EAR transmissions */ +#define TX_UT_ACK_SEND_MAX 6 /* Max amount of ACK re-queuing */ +#define TX_UT_ACK_DELAY 100 /* ms: delay before ACK re-queuing */ +#define TX_UT_BAN_FREQ 300 /* 5-minute ban if cannot reach host */ +#define TX_UT_GOOD_FREQ 900 /* Remember good hosts for 15 minutes */ +#define TX_UT_REQUEUE_DELAY 5000 /* Time to requeue message after drop */ + +#define TX_UT_EXPIRE_MS (60*1000) /* Expiration time for packets, in ms */ +#define TX_UT_SEQNO_COUNT (1U << 16) /* Amount of 16-bit sequence IDs */ +#define TX_UT_SEQNO_THRESH 1024 /* Sequence ID freeing threshold */ + +#define TX_UT_DBG_MSG (1U << 0) /* Messages */ +#define TX_UT_DBG_FRAG (1U << 1) /* Fragments */ +#define TX_UT_DBG_ACK (1U << 2) /* Acknowledgments */ +#define TX_UT_DBG_SEND (1U << 3) /* Sending to lower layer */ +#define TX_UT_DBG_TIMEOUT (1U << 4) /* Timeouts */ + +#define tx_ut_debugging(mask, to) \ + G_UNLIKELY((GNET_PROPERTY(tx_ut_debug_flags) & (mask)) && \ + (NULL == (to) || tx_debug_host(to))) + +enum tx_ut_attr_magic { TX_UT_ATTR_MAGIC = 0x7d93d0a9 }; + +/** + * Private attributes for the layer. + */ +struct attr { + enum tx_ut_attr_magic magic; + idtable_t *seq; /* Messages to send indexed by sequence ID */ + txdrv_t *tx; /* Back pointer to TX layer owning this struct */ + eslist_t pendingPMSG_P_COUNT; /* Pending messages to service, by prio */ + size_t buffered; /* Total size of enqueued messages */ + zlib_deflater_t *zd; /* Deflating object */ + struct tx_ut_cb *cb; /* Callbacks */ + aging_table_t *ban; /* Short ban of hosts to whom we cannot transmit */ + aging_table_t *good; /* Remeber good hosts for faster transmit */ + udp_tag_t tag; /* Protocol tag (e.g. "GTA" or "GND") */ + unsigned seqno_freed; /* Sequence IDs freed, for hysteresis */ + unsigned improved_acks:1; /* Advertise improved ACKs in TX fragments */ + unsigned ear_support:1; /* Remote RX will understand EARs */ + unsigned out_of_seqno:1; /* We ran out of sequence IDs */ + unsigned upper_flowc:1; /* Upper layer was flow-controlled */ + unsigned lower_flowc:1; /* Lower layer flow-controlled us */ +}; + +static inline void +ut_attr_check(const struct attr * const attr) +{ + g_assert(attr != NULL); + g_assert(TX_UT_ATTR_MAGIC == attr->magic); +} + +/** + * An enqueued message to process in the service routine. + */ +struct ut_queued { + pmsg_t *mb; + slink_t lk; +}; + +enum ut_frag_magic { UT_FRAG_MAGIC = 0x179a92a6 }; + +struct ut_msg; + +/** + * A fragment to send. + */ +struct ut_frag { + enum ut_frag_magic magic; + struct ut_msg *msg; /* Message where fragment belongs */ + cevent_t *resend_ev; /* Timer for fragment retransmission */ + pmsg_t *fb; /* Fragment message block */ + link_t lk; /* Link in "resend" queue */ + uint8 fragno; /* Fragment number, zero-based */ + uint8 txcnt; /* Amount of times fragment was sent */ + uint resend:1; /* Enqueued for resending */ + uint pending:1; /* Pending ACK on resending */ +}; + +static void +ut_frag_check(const struct ut_frag * const uf) +{ + g_assert(uf != NULL); + g_assert(UT_FRAG_MAGIC == uf->magic); +} + +enum ut_msg_magic { UT_MSG_MAGIC = 0x4ee960c0 }; + +/** + * A message to send. + * + * The original message is kept around to delay its freeing until we know + * whether it has been successfully sent or not. + * + * Its payload is deflated (if the message is not already flagged as being + * compressed) and transmitted as such provided the deflated payload is + * smaller. + * + * The actual message PDU is broken down into fragments which are immediately + * sent out if possible, or enqueued if the underlying layer flow-controls us, + * that queue being flushed by our service routine. + */ +struct ut_msg { + enum ut_msg_magic magic; + struct nid mid; /* Unique message ID */ + pmsg_t *mb; /* Original user message to send */ + const gnet_host_t *to; /* Destination address (atom) */ + cevent_t *expire_ev; /* Expire timer for the whole message */ + cevent_t *iterate_ev; /* Recorded iterate event */ + cevent_t *ear_ev; /* Expire timer for EARs */ + struct ut_frag **fragments; /* Fragments to send (NULL when ACK-ed) */ + struct attr *attr; /* TX layer private attributes */ + elist_t resend; /* Fragments to resend */ + uint16 seqno; /* Sequence ID number */ + uint16 fragtx; /* Fragments transmitted, total */ + uint16 fragtx2; /* Fragments that were re-transmitted */ + uint8 fragcnt; /* Amount of fragments */ + uint8 fragsent; /* Fragments sent (and ACK-ed if needed) */ + uint8 pending; /* Fragments pending ACK on resend */ + uint8 alpha; /* Parallel factor for resending */ + uint8 ears; /* Amount of EARs sent */ + unsigned reliable:1; /* Whether each fragment needs ACKs */ + unsigned deflated:1; /* Whether PDU was deflated */ + unsigned alive:1; /* Got at least an ACK from host */ + unsigned expecting_ack:1; /* Expecting ACK to continue */ + unsigned ear_pending:1; /* Sent EAR to lower layer, waiting CONF */ + unsigned cautious:1; /* Cautious TX: only sent last fragment */ +}; + +static void +ut_msg_check(const struct ut_msg * const um) +{ + g_assert(um != NULL); + g_assert(UT_MSG_MAGIC == um->magic); +} + +enum ut_pmi_magic { UT_PMI_MAGIC = 0x1d282650 }; + +/** + * Message block context for messages we are enqueuing to lower layers. + * + * This context is "metadata" for the message that can be used in pre-TX hooks + * and is also passed as argument to the free routine. + * + * Since there is a life-cycle disconnect between the fragment message we're + * enqueing to lower layers and the overall message we have to send (before + * fragmentation) which can expire on its own, it is important to be able to + * spot whether the association between the message and the fragment has been + * broken. This is the role of the MID field, which is a numerical message + * ID that is ever-growing and never reused. + */ +struct ut_pmsg_info { + enum ut_pmi_magic magic; + struct nid mid; /* Numerical message ID */ + struct ut_msg *um; /* Message */ + const gnet_host_t *to; /* Destination address, simple reference */ + struct attr *attr; /* TX layer attributes */ + uint8 fragno; /* Fragment number, 0-based, 1-based for ACKs */ + uint8 attempts; /* Amount of ACK queuing attempts */ +}; + +static inline void +ut_pmsg_info_check(const struct ut_pmsg_info * const pmi) +{ + g_assert(pmi != NULL); + g_assert(UT_PMI_MAGIC == pmi->magic); +} + +static hevset_t *ut_mset; /* Alive mesages */ +static unsigned ut_mset_refcnt; + +static bool ut_frag_free(struct ut_frag *uf, bool free_message); +static void ut_frag_send(const struct ut_frag *uf); +static void ut_ack_send(pmsg_t *mb); +static void ut_resend_async(struct ut_msg *um); + +/** + * Add a new reference to the message set. + */ +static void +tx_ut_mset_add_ref(void) +{ + if G_UNLIKELY(NULL == ut_mset) { + g_assert(0 == ut_mset_refcnt); + ut_mset = hevset_create_any( + offsetof(struct ut_msg, mid), nid_hash, nid_hash2, nid_equal); + } + + ut_mset_refcnt++; +} + +/** + * Remove a reference to the message set. + */ +static void +tx_ut_mset_unref(void) +{ + g_assert(ut_mset != NULL); + + if (0 == --ut_mset_refcnt) + hevset_free_null(&ut_mset); +} + +/** + * Invoke service routine of the upper layer if it wants servicing. + */ +static void +tx_ut_upper_service(const txdrv_t *tx) +{ + struct attr *attr = tx->opaque; + + attr->upper_flowc = FALSE; + + if (tx_ut_debugging(TX_UT_DBG_SEND, NULL)) { + g_debug("TX UT: %s: upper layer %s servicing (tag=\"%s\")", + G_STRFUNC, (tx->flags & TX_SERVICE) ? "wants" : "doesn't want", + udp_tag_to_string(attr->tag)); + } + + if (tx->flags & TX_SERVICE) { + g_assert(tx->srv_routine != NULL); + tx->srv_routine(tx->srv_arg); + } +} + +/** + * Allocate a unique message ID, used to identify the message object. + * + * This ID is a key to look the object up since any reference to that object + * directly could be broken asynchronously should the object be freed. + */ +static struct nid +ut_msg_id_create(void) +{ + static struct nid counter; + + return nid_new_counter_value(&counter); +} + +/** + * Check whether the message bearing the specified ID is still alive. + * + * @return NULL if the ID has expired, otherwise a pointer to the mesage. + */ +static struct ut_msg * +ut_msg_is_alive(struct nid mid) +{ + struct ut_msg *um; + + if G_UNLIKELY(NULL == ut_mset) + return NULL; + + um = hevset_lookup(ut_mset, &mid); + + if (um != NULL) + ut_msg_check(um); + + return um; +} + +/** + * Check whether destination address is flagged as good due to recent + * successful transmission. + * + * @return TRUE if the host is good and most probably present. + */ +static bool +ut_to_good(const struct attr *attr, const gnet_host_t *to) +{ + if (aging_lookup(attr->good, to)) { + if (tx_ut_debugging(TX_UT_DBG_MSG, NULL)) { + g_debug("TX UT: %s: host %s known to be responsive", + G_STRFUNC, gnet_host_to_string(to)); + } + gnet_stats_inc_general(GNR_UDP_SR_TX_MESSAGES_GOOD); + return TRUE; + } + + return FALSE; +} + +/** + * Flag host as being responsive, so that we can send the whole fragments + * at once next time. + */ +static void +ut_to_flag_good(const struct attr *attr, const gnet_host_t *to) +{ + if (tx_ut_debugging(TX_UT_DBG_MSG | TX_UT_DBG_TIMEOUT, NULL)) { + g_debug("TX UT: %s: flagging host %s as being good for next %d secs", + G_STRFUNC, gnet_host_to_string(to), TX_UT_GOOD_FREQ); + } + + if (!aging_lookup_revitalise(attr->good, to)) + aging_insert(attr->good, atom_host_get(to), int_to_pointer(1)); +} + +/** + * Free message. + */ +static void +ut_msg_free(struct ut_msg *um, bool free_sequence) +{ + unsigned i; + struct attr *attr; + + ut_msg_check(um); + ut_attr_check(um->attr); + + attr = um->attr; + + if (tx_ut_debugging(TX_UT_DBG_MSG, um->to)) { + g_debug("TX UT%s: %s: %s message " + "(%d bytes, seq=0x%04x, %u/%u fragment%s %s) to %s", + nid_to_string(&um->mid), G_STRFUNC, + um->fragsent == um->fragcnt ? "sent" : "dropped", + pmsg_size(um->mb), um->seqno, um->fragsent, + um->fragcnt, plural(um->fragcnt), + um->reliable ? "ack'ed" : "sent", gnet_host_to_string(um->to)); + } + + /* + * If all the fragments were sent, mark the message as sent: should someone + * monitor the original PDU with a free routine, they will know the fate + * of the message that way. + */ + + if (um->fragsent == um->fragcnt) { + pmsg_mark_sent(um->mb); + + /* + * Remember that host was responsive for a while, if the message was + * sent reliably (i.e. we got acknowledgments back). + */ + + if (um->reliable) + ut_to_flag_good(attr, um->to); + + /* Message was fully sent out */ + if (attr->cb->msg_account != NULL) + (*attr->cb->msg_account)(attr->tx->owner, um->mb, um->to); + + if (um->reliable) + gnet_stats_inc_general(GNR_UDP_SR_TX_RELIABLE_MESSAGES_SENT); + if (um->deflated) + gnet_stats_inc_general(GNR_UDP_TX_COMPRESSED); + } else { + /* Message was dropped during TX */ + if (attr->cb->add_tx_dropped != NULL) + (*attr->cb->add_tx_dropped)(attr->tx->owner, 1); + + gnet_stats_inc_general(GNR_UDP_SR_TX_MESSAGES_UNSENT); + if (um->reliable) + gnet_stats_inc_general(GNR_UDP_SR_TX_RELIABLE_MESSAGES_UNSENT); + } + + /* + * Free any remaining fragments. + */ + + for (i = 0; i < um->fragcnt; i++) { + struct ut_frag *uf = um->fragmentsi; + + if (uf != NULL) + ut_frag_free(uf, FALSE); /* Don't recurse to ut_msg_free() */ + } + + attr->buffered = size_saturate_sub(attr->buffered, pmsg_size(um->mb)); + + cq_cancel(&um->expire_ev); + cq_cancel(&um->iterate_ev); + cq_cancel(&um->ear_ev); + atom_host_free_null(&um->to); + WFREE_ARRAY(um->fragments, um->fragcnt); + hevset_remove(ut_mset, &um->mid); + pmsg_free_null(&um->mb); + + if (free_sequence) { + idtable_free_id(attr->seq, um->seqno); + + /* + * If we ran out of sequence IDs (and flow-controlled the upper layers), + * then we monitor the amount of sequence IDs freed and leave the + * flow-controlled state only after enough have been released. + * + * This creates hysteresis and avoids situations where we would quickly + * leave/re-enter flow-control, which is inefficient. + */ + + if (attr->out_of_seqno) { + if (++attr->seqno_freed >= TX_UT_SEQNO_THRESH) { + /* We have enough free sequence IDs to resume */ + attr->seqno_freed = 0; + attr->out_of_seqno = FALSE; + tx_ut_upper_service(attr->tx); + } + } + } + + um->magic = 0; + WFREE(um); +} + +/** + * Free fragment. + * + * @param uf fragment to free (acknoweldged or sent) + * @param free_message if TRUE, free up message if this is the last fragment + * + * @return TRUE if the fragment was the last one remaining. + */ +static bool +ut_frag_free(struct ut_frag *uf, bool free_message) +{ + struct ut_msg *um; + bool is_last; + + ut_frag_check(uf); + ut_msg_check(uf->msg); + + um = uf->msg; + cq_cancel(&uf->resend_ev); + pmsg_free_null(&uf->fb); + + g_assert(uf->fragno < um->fragcnt); + g_assert(uf == um->fragmentsuf->fragno); + + um->fragmentsuf->fragno = NULL; + um->fragsent++; + + if (uf->resend) + elist_remove(&um->resend, uf); + + if (uf->pending) { + um->pending--; + ut_resend_async(um); + } + + if (free_message && tx_ut_debugging(TX_UT_DBG_FRAG, um->to)) { + g_debug("TX UT%s: %s: %s fragment #%u/%u seq=0x%04x (%d %s) to %s", + nid_to_string(&um->mid), G_STRFUNC, + um->reliable ? "acknowledged" : "sent", + uf->fragno + 1, um->fragcnt, um->seqno, + um->fragcnt - um->fragsent, um->reliable ? "un-ack'ed" : "unsent", + gnet_host_to_string(um->to)); + } + + uf->magic = 0; + WFREE(uf); + + /* + * When the last fragment is freed, we're done with the message. + */ + + is_last = um->fragcnt == um->fragsent; + + if (is_last && free_message) + ut_msg_free(um, TRUE); + + return is_last; +} + +/** + * Computes the delay (in ms) we have to wait at most to get an ACK back. + * + */ +static int +ut_sending_delay(unsigned txcnt) +{ + switch (txcnt) { + case 1: return 5000; /* 5 seconds */ + case 2: return 7500; /* 7.5 seconds */ + case 3: return 11250; /* 11.25 seconds */ + default: return 22500; /* 22.5 seconds */ + } +} + +/** + * Computes the delay (in ms) before resending a fragment, depending on how + * many times it was sent already. + */ +static int +ut_frag_delay(const struct ut_frag *uf) +{ + ut_frag_check(uf); + g_assert(uf->txcnt != 0); + + return ut_sending_delay(uf->txcnt); +} + +/** + * Check whether destination address is temporarily banned due to the remote + * host being un-responsive. + * + * @return TRUE if the message should be dropped (logging done if needed). + */ +static bool +ut_to_banned(const struct attr *attr, const gnet_host_t *to) +{ + if (aging_lookup(attr->ban, to)) { + if (tx_ut_debugging(TX_UT_DBG_MSG, NULL)) { + time_delta_t age = aging_age(attr->ban, to); + g_debug("TX UT: %s: dropping message to %s, banned since %ld sec%s", + G_STRFUNC, gnet_host_to_string(to), (long) age, plural(age)); + } + gnet_stats_inc_general(GNR_UDP_SR_TX_MESSAGES_BANNED); + return TRUE; + } + + return FALSE; +} + +/** + * Request that message to specified host be dropped for a while. + */ +static void +ut_to_ban(const struct attr *attr, const gnet_host_t *to) +{ + aging_insert(attr->ban, atom_host_get(to), int_to_pointer(1)); + aging_remove(attr->good, to); + + if (tx_ut_debugging(TX_UT_DBG_MSG | TX_UT_DBG_TIMEOUT, NULL)) { + g_debug("TX UT: %s: will be dropping messages to %s for %d secs", + G_STRFUNC, gnet_host_to_string(to), TX_UT_BAN_FREQ); + } +} + +/** + * Send an EAR (Extra ACK Request) to the remote end. + */ +static void +ut_ear_send(struct ut_msg *um) +{ + struct ut_ack ear; + + ut_msg_check(um); + g_assert(NULL == um->ear_ev); + + if (tx_ut_debugging(TX_UT_DBG_ACK, um->to)) { + g_debug("TX UT%s: %s: sending EAR to %s (seq=0x%04x, attempt #%u)", + nid_to_string(&um->mid), G_STRFUNC, + gnet_host_to_string(um->to), um->seqno, um->ears + 1); + } + + ZERO(&ear); + ear.seqno = um->seqno; + ear.ear = TRUE; + + um->expecting_ack = TRUE; + um->ear_pending = TRUE; + ut_send_ack(um->attr->tx, um->to, &ear); +} + +/* + * Send all the fragments unsent so far. + */ +static void +ut_send_remaining(struct ut_msg *um) +{ + unsigned i; + + ut_msg_check(um); + + um->cautious = FALSE; /* No longer cautious, if we were ever! */ + + for (i = 0; i < um->fragcnt; i++) { + struct ut_frag *uf = um->fragmentsi; + + if (uf != NULL) + ut_frag_send(uf); + } +} + +/** + * Callout queue callback invoked to trigger fragment resending. + */ +static void +ut_resend_iterate(cqueue_t *cq, void *obj) +{ + struct ut_msg *um = obj; + + ut_msg_check(um); + ut_attr_check(um->attr); + g_assert(um->iterate_ev != NULL); + + cq_zero(cq, &um->iterate_ev); /* Callback triggered */ + + if (tx_ut_debugging(TX_UT_DBG_TIMEOUT, um->to)) { + g_debug("TX UT%s: %s: alpha=%u, pending=%u, enqueued=%zu, alive=%c", + nid_to_string(&um->mid), G_STRFUNC, + um->alpha, um->pending, elist_count(&um->resend), + um->alive ? 'y' : '?'); + } + + /* + * When we don't know whether the remote host is alive yet, don't resend + * fragments but rather send EARs (Extra ACK Requests) to check whether + * there is a remote stack listening to our traffic. + * + * This is only done when we know (by configuration made at creation time) + * that the remote RX side will properly understand EARs. + */ + + if (!um->alive && um->attr->ear_support) { + if (!um->ear_pending && NULL == um->ear_ev) + ut_ear_send(um); + return; + } + + /* + * If we can't send a new batch, wait for more ACKs to come or for a + * resend timeout. + */ + + if (um->pending != 0 && um->pending >= um->alpha) + return; + + /* + * We're getting ACKs for our fragments, send more. + */ + + um->alpha++; + + while (um->pending < um->alpha) { + struct ut_frag *uf = elist_shift(&um->resend); + + if (NULL == uf) + return; + + g_assert(uf->resend); + g_assert(!uf->pending); + + uf->resend = FALSE; + uf->pending = TRUE; + ut_frag_send(uf); + um->pending++; + } +} + +/** + * Request asynchronous iteration to resend pending fragments, if needed. + */ +static void +ut_resend_async(struct ut_msg *um) +{ + ut_msg_check(um); + + if (NULL == um->iterate_ev && 0 != elist_count(&um->resend)) + um->iterate_ev = cq_main_insert(1, ut_resend_iterate, um); +} + +/** + * Callout queue callback invoked when no acknowledgment was received. + */ +static void +ut_ear_resend(cqueue_t *cq, void *obj) +{ + struct ut_msg *um = obj; + + ut_msg_check(um); + g_assert(um->ear_ev != NULL); + + cq_zero(cq, &um->ear_ev); /* Callback triggered */ + + /* + * If the host was "banned" temporarily due to being unresponsive, abort. + */ + + if (ut_to_banned(um->attr, um->to)) { + ut_msg_free(um, TRUE); + return; + } + + /* + * If we already sent too many EARs, give up on the whole message. + */ + + if (um->ears >= TX_UT_EAR_SEND_MAX) { + if (tx_ut_debugging(TX_UT_DBG_FRAG | TX_UT_DBG_TIMEOUT, um->to)) { + g_debug("TX UT%s: %s: EAR for %s already sent %u times " + "(tag=\"%s\", seq=0x%04x, %u/%u fragment%s sent) -- giving up", + nid_to_string(&um->mid), G_STRFUNC, + gnet_host_to_string(um->to), um->ears, + udp_tag_to_string(um->attr->tag), um->seqno, um->fragsent, + um->fragcnt, plural(um->fragcnt)); + } + gnet_stats_inc_general(GNR_UDP_SR_TX_EARS_OVERSENT); + ut_to_ban(um->attr, um->to); /* Drop messages for a while */ + ut_msg_free(um, TRUE); + return; + } + + if (tx_ut_debugging(TX_UT_DBG_FRAG | TX_UT_DBG_TIMEOUT, um->to)) { + g_debug("TX UT%s: %s: will resend EAR seq=0x%04x to %s " + "retransmit #%u", + nid_to_string(&um->mid), G_STRFUNC, + um->seqno, gnet_host_to_string(um->to), um->ears); + } + + ut_resend_async(um); +} + +/** + * Callout queue callback invoked when no acknowledgment was received. + */ +static void +ut_frag_resend(cqueue_t *cq, void *obj) +{ + struct ut_frag *uf = obj; + struct ut_msg *um; + + ut_frag_check(uf); + ut_msg_check(uf->msg); + g_assert(uf->resend_ev != NULL); + + cq_zero(cq, &uf->resend_ev); /* Callback triggered */ + um = uf->msg; + + if (tx_ut_debugging(TX_UT_DBG_FRAG | TX_UT_DBG_TIMEOUT, uf->msg->to)) { + g_debug("TX UT%s: %s: will resend fragment #%u/%u seq=0x%04x to %s " + "retransmit #%u", + nid_to_string(&um->mid), G_STRFUNC, + uf->fragno + 1, um->fragcnt, um->seqno, + gnet_host_to_string(um->to), uf->txcnt); + } + + /* + * If fragment was marked as "pending ACK", then it was resent and the + * acknowledgment did not come in the allocated time. + * + * Decrease the amount of pending messages, but also decrease parallelism + * for the next batch. + */ + + if (uf->pending) { /* Was pending ACK */ + um->pending--; + um->alpha /= 2; /* Decrease sending parallelism */ + } + + /* + * If the host was "banned" temporarily due to being unresponsive, abort. + */ + + if (ut_to_banned(um->attr, um->to)) { + ut_msg_free(um, TRUE); + return; + } + + /* + * If we sent the fragment too many times already, give up on the whole + * message. + */ + + if (uf->txcnt >= TX_UT_SEND_MAX) { + if (tx_ut_debugging(TX_UT_DBG_FRAG | TX_UT_DBG_TIMEOUT, um->to)) { + g_debug("TX UT%s: %s: fragment #%u for %s already sent %u times " + "(tag=\"%s\", seq=0x%04x, %u/%u fragment%s sent) -- giving up", + nid_to_string(&um->mid), G_STRFUNC, uf->fragno + 1, + gnet_host_to_string(um->to), uf->txcnt, + udp_tag_to_string(um->attr->tag), um->seqno, um->fragsent, + um->fragcnt, plural(um->fragcnt)); + } + + gnet_stats_inc_general(GNR_UDP_SR_TX_FRAGMENTS_OVERSENT); + ut_msg_free(um, TRUE); + return; + } + + /* + * Enqueue for retransmission, done "alpha" fragments at a time to avoid + * wasting outgoing bandwidth. + */ + + g_assert(!uf->resend); + + uf->resend = TRUE; + uf->pending = FALSE; /* No longer pending, awaiting retransmit */ + elist_append(&um->resend, uf); + ut_resend_async(um); +} + +/** + * This TX hook is invoked by the UDP scheduler to make sure we still have + * to send the message. Indeed, an acknowledgment could have arrived while + * it was delayed due to bandwidth shortage, or the message could have expired. + * + * @param mb the fragment message + * + * @return TRUE if the message can still be sent. + */ +static bool +ut_frag_hook(const pmsg_t *mb) +{ + const struct ut_msg *um; + const struct ut_pmsg_info *pmi; + + /* + * Messages sent have a free routine, their metadata being information + * about the message. + */ + + pmi = pmsg_get_metadata(mb); + um = ut_msg_is_alive(pmi->mid); + + if (NULL == um) + goto do_not_send; /* Message expired */ + + g_assert(pmi->fragno < um->fragcnt); + + if (NULL == um->fragmentspmi->fragno) + goto do_not_send; /* Fragment already acknowledged */ + + return TRUE; /* OK, can send fragment */ + +do_not_send: + if (tx_ut_debugging(TX_UT_DBG_FRAG, NULL == um ? NULL : um->to)) { + const void *pdu = pmsg_start(mb); + udp_tag_t tag = udp_reliable_header_get_tag(pdu); + uint16 seqno = udp_reliable_header_get_seqno(pdu); + + g_debug("TX UT%s: %s: dropping fragment #%u to %s " + "(tag=\"%s\", seq=0x%04x): %s", + NULL == um ? "-" : nid_to_string(&um->mid), + G_STRFUNC, pmi->fragno + 1, + NULL == um ? "???" : gnet_host_to_string(um->to), + udp_tag_to_string(tag), seqno, + NULL == um ? "message expired" : + um->reliable ? "fragment already ACK'ed" : + "fragment already sent"); + } + + gnet_stats_inc_general(GNR_UDP_SR_TX_FRAGMENTS_SENDING_AVOIDED); + return FALSE; +} + +/** + * Fragment message free routine, invoked when the message was released by + * a lower layer. + */ +static void +ut_frag_pmsg_free(pmsg_t *mb, void *arg) +{ + struct ut_msg *um; + struct ut_pmsg_info *pmi = arg; + struct ut_frag *uf; + + g_assert(pmsg_is_extended(mb)); + g_assert(NULL == pmi->attr); /* Signals info for a fragment */ + + um = ut_msg_is_alive(pmi->mid); + + if (NULL == um) + goto cleanup; /* Message expired */ + + g_assert(pmi->fragno < um->fragcnt); + + uf = um->fragmentspmi->fragno; + + if (tx_ut_debugging(TX_UT_DBG_FRAG, um->to)) { + g_debug("TX UT%s: %s: %s%sfragment #%u/%u seq=0x%04x tx=%d to %s " + "was %s", + nid_to_string(&pmi->mid), G_STRFUNC, + um->reliable ? "reliable " : "", + NULL == uf ? "ACK'ed " : "", + pmi->fragno + 1, um->fragcnt, um->seqno, + NULL == uf ? -1 : uf->txcnt, gnet_host_to_string(um->to), + pmsg_was_sent(mb) ? "sent" : "dropped"); + } + + if (NULL == uf) + goto cleanup; /* Fragment already acknowledged */ + + ut_frag_check(uf); + + if (pmsg_was_sent(mb)) { + /* + * Fragment was sent. + * + * If it requires an acknowledgment, arm a resend timer in case + * we do not receive it in the time frame we have (which depends + * on the number of transmissions already made). + * + * If no acknowledgment is required, we can free the fragment. + */ + + uf->txcnt++; + um->fragtx++; + gnet_stats_inc_general(GNR_UDP_SR_TX_FRAGMENTS_SENT); + if (uf->txcnt > 1) { + um->fragtx2++; + gnet_stats_inc_general(GNR_UDP_SR_TX_FRAGMENTS_RESENT); + } + + if (um->reliable) { + if (tx_ut_debugging(TX_UT_DBG_TIMEOUT, um->to)) { + g_debug("TX UT%s: %s: fragment #%u/%u seq=0x%04x tx=%d to %s " + "will be resent in %d ms", + nid_to_string(&uf->msg->mid), G_STRFUNC, + uf->fragno + 1, um->fragcnt, um->seqno, uf->txcnt, + gnet_host_to_string(um->to), ut_frag_delay(uf)); + } + g_assert(NULL == uf->resend_ev); + uf->resend_ev = cq_main_insert(ut_frag_delay(uf), + ut_frag_resend, uf); + + /* + * If this is the first fragment being sent, reschedule the + * expiration with the original time: as far as the recipient goes, + * this is when we started emitting the message. + * + * This is important when the UDP TX scheduler is clogged with + * unsent traffic, because it will then keep dropping our fragments + * and the message could globally expire before we even could send + * the first fragment! + */ + + if (1 == um->fragtx) + cq_resched(um->expire_ev, TX_UT_EXPIRE_MS); + } else { + ut_frag_free(uf, TRUE); + } + } else { + /* + * Fragment was dropped by lower layer (expired, probably). + * + * Don't requeue it synchronously because the fragment could have + * been dropped whilst being enqueued, for instance if the remote + * network is deemed unreacheable by TCP/IP (e.g. the network link + * is currently down). + * + * To avoid deadly recursions into here, wait a little bit and then + * retry, whether the message is reliable or not. + * --RAM, 2015-10-02 + */ + + g_assert(NULL == uf->resend_ev); + uf->resend_ev = cq_main_insert(TX_UT_REQUEUE_DELAY, ut_frag_resend, uf); + } + + /* FALL THROUGH */ + +cleanup: + pmi->magic = 0; + WFREE(pmi); +} + +static void +ut_ack_async_send(cqueue_t *unused_cq, void *mb) +{ + (void) unused_cq; + ut_ack_send(mb); +} + +/** + * Acknowledge message free routine, invoked when the message was released by + * a lower layer. + */ +static void +ut_ack_pmsg_free(pmsg_t *mb, void *arg) +{ + struct ut_pmsg_info *pmi = arg; + + g_assert(pmsg_is_extended(mb)); + ut_attr_check(pmi->attr); /* Signals this is info for an ack */ + + if (!pmsg_was_sent(mb)) { + pmi->attempts++; + + if (tx_ut_debugging(TX_UT_DBG_ACK, pmi->to)) { + const void *pdu = pmsg_start(mb); + udp_tag_t tag = udp_reliable_header_get_tag(pdu); + uint16 seqno = udp_reliable_header_get_seqno(pdu); + uint8 flags = udp_reliable_header_get_flags(pdu); + + g_debug("TX UT: %s: did not send %s%s%s%s " + "(tag=\"%s\", seq=0x%04x, fragment #%u) to %s " + "at attempt #%u, %s", + G_STRFUNC, + (flags & UDP_RF_CUMULATIVE_ACK) ? "cumulative " : "", + (flags & UDP_RF_EXTENDED_ACK) ? "extended " : "", + 0 == pmi->fragno ? "EAR" : "ACK", + (0 == pmi->fragno && 0 == (flags & UDP_RF_ACKME)) ? + " NACK" : "", + udp_tag_to_string(tag), + seqno, pmi->fragno, gnet_host_to_string(pmi->to), + pmi->attempts, + pmi->attempts <= TX_UT_ACK_SEND_MAX ? "retrying" : "dropping"); + } + + if (pmi->attempts <= TX_UT_ACK_SEND_MAX) { + pmsg_t *amb; + + /* + * Acknowledgment was not sent, re-enqueue a clone. + * + * It is safe to call pmsg_clone_extend() on the message even though + * we're invoked here from pmsg_free() because it will be adding a + * reference to the PDU data, and this will prevent releasing the + * PDU at the end of pmsg_free(). + */ + + amb = pmsg_clone_extend(mb, ut_ack_pmsg_free, pmi); + + /* + * Don't immediately call ut_ack_send(), because if the message is + * being freed synchronously, we'll create a deadly recursion. + * + * We wait a little time in the hope that the condition which led + * to the message being unsent will clear up. + */ + + gnet_stats_inc_general(GNR_UDP_SR_TX_ACKS_REQUEUED); + cq_main_insert(TX_UT_ACK_DELAY, ut_ack_async_send, amb); + + /* + * Leave the 'pmi' structure intact, since it's now used by the + * cloned ACK message we're resending. + */ + + return; + } else { + const void *pdu = pmsg_start(mb); + uint8 flags = udp_reliable_header_get_flags(pdu); + + if (flags & (UDP_RF_CUMULATIVE_ACK | UDP_RF_EXTENDED_ACK)) + gnet_stats_inc_general(GNR_UDP_SR_TX_ENHANCED_ACKS_DROPPED); + else + gnet_stats_inc_general(GNR_UDP_SR_TX_PLAIN_ACKS_DROPPED); + } + } else { + const void *pdu = pmsg_start(mb); + uint8 flags = udp_reliable_header_get_flags(pdu); + + if (tx_ut_debugging(TX_UT_DBG_ACK, pmi->to)) { + udp_tag_t tag = udp_reliable_header_get_tag(pdu); + uint16 seqno = udp_reliable_header_get_seqno(pdu); + + g_debug("TX UT: %s: sent %s%s%s%s " + "(tag=\"%s\", seq=0x%04x, fragment #%u) to %s", + G_STRFUNC, + (flags & UDP_RF_CUMULATIVE_ACK) ? "cumulative " : "", + (flags & UDP_RF_EXTENDED_ACK) ? "extended " : "", + 0 == pmi->fragno ? "EAR" : "ACK", + (0 == pmi->fragno && 0 == (flags & UDP_RF_ACKME)) ? + " NACK" : "", + udp_tag_to_string(tag), + seqno, pmi->fragno, gnet_host_to_string(pmi->to)); + } + + /* + * Handle sending of an EAR. + */ + + if (0 == pmi->fragno) { + struct ut_msg *um; + uint16 seqno = udp_reliable_header_get_seqno(pdu); + + /* + * An EAR NACK is requested by the RX layer when it gets an EAR + * for an unknown sequence ID. This is not an EAR we're sending + * for a message from the TX layer and as such, don't count it + * as an EAR sent. + */ + + if (0 == (flags & UDP_RF_ACKME)) + goto done; /* Not an EAR for something we TX here */ + + gnet_stats_inc_general(GNR_UDP_SR_TX_EARS_SENT); + + um = idtable_probe_value(pmi->attr->seq, seqno); + if (um != NULL) { + um->ears++; + um->ear_pending = FALSE; /* Got CONF that it was sent */ + g_assert(NULL == um->ear_ev); + um->ear_ev = cq_main_insert( + ut_sending_delay(um->ears), ut_ear_resend, um); + + if (tx_ut_debugging(TX_UT_DBG_TIMEOUT, um->to)) { + g_debug("TX UT%s: %s: EAR seq=0x%04x tx=%d to %s " + "will be resent in %d ms", + nid_to_string(&um->mid), G_STRFUNC, + um->seqno, um->ears, gnet_host_to_string(um->to), + ut_sending_delay(um->ears)); + } + } + } else { + if (flags & UDP_RF_CUMULATIVE_ACK) + gnet_stats_inc_general(GNR_UDP_SR_TX_CUMULATIVE_ACKS_SENT); + else if (flags & UDP_RF_EXTENDED_ACK) + gnet_stats_inc_general(GNR_UDP_SR_TX_EXTENDED_ACKS_SENT); + else + gnet_stats_inc_general(GNR_UDP_SR_TX_PLAIN_ACKS_SENT); + } + } + +done: + atom_host_free_null(&pmi->to); /* Reference taken on acks */ + pmi->magic = 0; + WFREE(pmi); +} + +/** + * Send fragment. + * + * Send the message to the lower layer and if we are flow-controlled then + * enqueue the message for servicing. + */ +static void +ut_frag_send(const struct ut_frag *uf) +{ + const struct ut_msg *um; + struct attr *attr; + pmsg_t *mb; + struct ut_pmsg_info *pmi; + struct ut_queued *uq; + uint8 prio; + + ut_frag_check(uf); + ut_msg_check(uf->msg); + g_assert(NULL == uf->resend_ev); + + um = uf->msg; + attr = um->attr; + + ut_attr_check(attr); + + /* + * Construct the message block we're going to send, attaching the relevant + * metadata and free routine. + * + * It is safe to take a reference on the um->to atom because the message + * will not be freed before the fragment has been sent out. + */ + + WALLOC0(pmi); + pmi->magic = UT_PMI_MAGIC; + pmi->mid = um->mid; /* Struct copy */ + pmi->to = um->to; /* Simple copy, no ref count increase */ + pmi->fragno = uf->fragno; + + /* pmi->attr is not used for fragments */ + + mb = pmsg_clone_extend(uf->fb, ut_frag_pmsg_free, pmi); + prio = pmsg_prio(mb); + + if (tx_ut_debugging(TX_UT_DBG_SEND, um->to)) { + g_debug("TX UT%s: %s: %ssending fragment #%u (%d bytes, prio=%u) " + "to %s (%u fragment%s, seq=0x%04x, tag=\"%s\")", + nid_to_string(&um->mid), G_STRFUNC, + 0 == uf->txcnt ? "" : "re", + uf->fragno + 1, pmsg_size(mb), prio, + gnet_host_to_string(um->to), + um->fragcnt, plural(um->fragcnt), + um->seqno, udp_tag_to_string(attr->tag)); + } + + if ( + 0 == eslist_count(&attr->pendingprio) && + 0 != tx_sendto(attr->tx->lower, mb, um->to) + ) { + pmsg_free(mb); + return; + } + + /* + * Cannot send the message to the lower layer, enqueue it. + */ + + if (tx_ut_debugging(TX_UT_DBG_SEND, um->to)) { + g_debug("TX UT%s: %s: enqueuing fragment (%zu already pending)", + nid_to_string(&um->mid), G_STRFUNC, + eslist_count(&attr->pendingprio)); + } + + WALLOC0(uq); + uq->mb = mb; + eslist_prepend(&attr->pendingprio, uq); + attr->lower_flowc = TRUE; + tx_srv_enable(attr->tx->lower); +} + +/** + * Send acknowledgement message, already set with metadata and free routine. + */ +static void +ut_ack_send(pmsg_t *mb) +{ + struct ut_pmsg_info *pmi = pmsg_get_metadata(mb); + struct attr *attr; + struct ut_queued *uq; + uint8 prio; + + ut_pmsg_info_check(pmi); + + attr = pmi->attr; + prio = pmsg_prio(mb); + + ut_attr_check(attr); + + if (tx_ut_debugging(TX_UT_DBG_SEND, pmi->to)) { + const void *pdu = pmsg_start(mb); + udp_tag_t tag = udp_reliable_header_get_tag(pdu); + uint16 seqno = udp_reliable_header_get_seqno(pdu); + uint8 fragno = udp_reliable_header_get_part(pdu); + uint8 flags = udp_reliable_header_get_flags(pdu); + + g_debug("TX UT: %s: sending %s%s%s%s (%d bytes, prio=%u) " + "to %s (fragment #%u, seq=0x%04x, tag=\"%s\")", + G_STRFUNC, + (flags & UDP_RF_CUMULATIVE_ACK) ? "cumulative " : "", + (flags & UDP_RF_EXTENDED_ACK) ? "extended " : "", + 0 == fragno ? "EAR" : "ACK", + (0 == fragno && 0 == (flags & UDP_RF_ACKME)) ? " NACK" : "", + pmsg_size(mb), prio, gnet_host_to_string(pmi->to), fragno, seqno, + udp_tag_to_string(tag)); + } + + /* + * ACKs can be sent out of order, so don't check whether we have some + * in the queue, try to send this one regardless. + * + * Anyway, the UDP TX scheduler is now configured to always accept + * highest priority messages, which is what ACKs are, so we would not + * need enqueuing logic. We're keeping it in case the policy changes + * one day. + * --RAM, 2012-10-12 + */ + + if (0 != tx_sendto(attr->tx->lower, mb, pmi->to)) { + pmsg_free(mb); + return; + } + + /* + * Cannot send the message to the lower layer, enqueue it. + */ + + if (tx_ut_debugging(TX_UT_DBG_SEND, pmi->to)) { + g_debug("TX UT: %s: enqueuing %s (%zu prio=%u already pending)", + G_STRFUNC, 0 == pmi->fragno ? "EAR" : "ACK", + eslist_count(&attr->pendingprio), prio); + } + + WALLOC0(uq); + uq->mb = mb; + eslist_prepend(&attr->pendingprio, uq); + attr->lower_flowc = TRUE; + tx_srv_enable(attr->tx->lower); +} + +/** + * Process enqueued messages, highest priorities first. + * + * @return TRUE if we were able to flush everything. + */ +static bool +ut_pending_send(struct attr *attr) +{ + unsigned i; + + ut_attr_check(attr); + g_assert(attr->lower_flowc); /* Lower layer flow-controlled us */ + + for (i = N_ITEMS(attr->pending); i != 0; i--) { + eslist_t *list = &attr->pendingi - 1; + struct ut_queued *uq; + + while (NULL != (uq = eslist_shift(list))) { + pmsg_t *mb = uq->mb; + struct ut_pmsg_info *pmi = pmsg_get_metadata(mb); + + ut_pmsg_info_check(pmi); + + if (tx_ut_debugging(TX_UT_DBG_SEND, pmi->to)) { + const void *pdu = pmsg_start(mb); + udp_tag_t tag = udp_reliable_header_get_tag(pdu); + uint16 seqno = udp_reliable_header_get_seqno(pdu); + uint8 fragno = udp_reliable_header_get_part(pdu); + uint8 flags = udp_reliable_header_get_flags(pdu); + uint8 count = udp_reliable_header_get_count(pdu); + + if (0 == count) { + g_debug("TX UT: %s: dequeuing %s%s%s%s (%d bytes, prio=%u) " + "to %s (fragment #%u, seq=0x%04x, tag=\"%s\")", + G_STRFUNC, + (flags & UDP_RF_CUMULATIVE_ACK) ? "cumulative " : "", + (flags & UDP_RF_EXTENDED_ACK) ? "extended " : "", + 0 == fragno ? "EAR" : "ACK", + (0 == fragno && 0 == (flags & UDP_RF_ACKME)) ? + " NACK" : "", + pmsg_size(mb), pmsg_prio(mb), + gnet_host_to_string(pmi->to), fragno, seqno, + udp_tag_to_string(tag)); + } else { + g_debug("TX UT: %s: dequeuing fragment #%u/%u " + "(%d bytes, prio=%u) to %s (seq=0x%04x, tag=\"%s\")", + G_STRFUNC, fragno, count, + pmsg_size(mb), pmsg_prio(mb), + gnet_host_to_string(pmi->to), seqno, + udp_tag_to_string(attr->tag)); + } + } + + if (0 == tx_sendto(attr->tx->lower, mb, pmi->to)) { + eslist_prepend(list, uq); /* Put it back */ + + if (tx_ut_debugging(TX_UT_DBG_SEND, pmi->to)) + g_debug("TX UT: %s: flow-controlled", G_STRFUNC); + + return FALSE; /* We're flow-controlled */ + } + + pmsg_free_null(&uq->mb); + WFREE(uq); + } + } + + attr->lower_flowc = FALSE; /* Flushed everything! */ + tx_srv_disable(attr->tx->lower); + + return TRUE; +} + +/** + * Discard enqueued messages. + */ +static void +ut_pending_discard(struct attr *attr) +{ + unsigned i; + + ut_attr_check(attr); + + for (i = 0; i < N_ITEMS(attr->pending); i++) { + eslist_t *list = &attr->pendingi; + struct ut_queued *uq; + + while (NULL != (uq = eslist_shift(list))) { + pmsg_t *mb = uq->mb; + + /* + * Cancel free routine because message was not given to lower layer + * and we free the message here. + */ + + (void) pmsg_replace_ext(mb, NULL, NULL, NULL); + pmsg_free_null(&uq->mb); + WFREE(uq); + } + } +} + +/** + * Create a new fragment for given message. + * + * The relevant parts of the PDU are copied over and the header is added to + * ready the message for transmission. + * + * @param attr attributes of this layer + * @param fragno fragment number (zero-based) + * @param um message to which fragment belongs to + * @param pdu PDU starting pointer + * @param pdulen PDU length + * + * @return created fragment. + */ +static struct ut_frag * +ut_frag_create(const struct attr *attr, unsigned fragno, + struct ut_msg *um, const void *pdu, size_t pdulen) +{ + struct ut_frag *uf; + pmsg_t *mb; + uint8 flags; + + ut_attr_check(attr); + ut_msg_check(um); + g_assert(fragno < um->fragcnt); + + mb = pmsg_new(pmsg_prio(um->mb), NULL, pdulen + UDP_RELIABLE_HEADER_SIZE); + + WALLOC0(uf); + uf->magic = UT_FRAG_MAGIC; + uf->msg = um; + uf->fragno = fragno; /* Index base is 0 here, not 1 */ + uf->fb = mb; + + /* + * Generate the 8-byte fragment header. + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7| Byte + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | idTag | nFlags | 0-3 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | nSequence | nPart | nCount | 4-7 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + + flags = attr->improved_acks ? UDP_RF_IMPROVED_ACKS : 0; + flags |= um->deflated ? UDP_RF_DEFLATED : 0; + flags |= um->reliable ? UDP_RF_ACKME : 0; + + pmsg_write(mb, attr->tag.value, 3); + pmsg_write_u8(mb, flags); + pmsg_write_be16(mb, um->seqno); + pmsg_write_u8(mb, fragno + 1); + pmsg_write_u8(mb, um->fragcnt); + + /* + * If the PDU is compressed, it is held in an internal buffer of the + * deflating object, so we need to copy it anyhow. + * + * If the PDU is not compressed, we could avoid this copy but it would + * require the use of sendmsg() to be able to write an iovec, and this + * is not compatible with our giving a pmsg_t to the UDP TX scheduler. + * + * For now, live with this extra copy which buys us the simplicity of + * implementation. If it becomes a performance bottleneck, we can always + * revisit the strategy. + * --RAM, 2012-09-26 + */ + + pmsg_write(mb, pdu, pdulen); + + /* + * Install a pre-transmit hook on the message, which will be propagated + * when we pmsg_clone() it before sending. + */ + + pmsg_set_hook(mb, ut_frag_hook); + + if (tx_ut_debugging(TX_UT_DBG_FRAG, um->to)) { + g_debug("TX UT%s: %s: created %d-byte %s fragment (#%u/%u) to %s", + nid_to_string(&um->mid), G_STRFUNC, pmsg_size(mb), + um->reliable ? "reliable" : "unreliable", + fragno + 1, um->fragcnt, gnet_host_to_string(um->to)); + } + + return uf; +} + +/* + * Attempt deflation of message. + * + * @param attr attributes of this layer + * @param pdu points to the original PDU starting pointer + * @param pdulen points to the original PDU length + * + * @return FALSE if PDU could not be deflated, TRUE if it was deflated with + * the ``pdu'' and ``pdulen'' parameters updated to the deflated PDU, which + * is held insize the deflater and must be consumed before further usage. + */ +static bool +ut_deflate(const struct attr *attr, const void **pdu, size_t *pdulen) +{ + size_t len = *pdulen; + void *buf; /* Compression buffer */ + uint32 deflated_len; /* Length of deflated data */ + zlib_deflater_t *zd = attr->zd; + + zlib_deflater_reset(zd, *pdu, len); + + gnet_stats_inc_general(GNR_UDP_COMPRESSION_ATTEMPTS); + + if (-1 == zlib_deflate_all(zd)) { + g_warning("%s(): cannot deflate payload", G_STRFUNC); + return FALSE; + } + + /* + * Check whether compressed data is smaller than the original payload. + */ + + deflated_len = zlib_deflater_outlen(zd); + buf = zlib_deflater_out(zd); + + g_assert(zlib_is_valid_header(buf, deflated_len)); + + if (deflated_len >= len) { + gnet_stats_inc_general(GNR_UDP_LARGER_HENCE_NOT_COMPRESSED); + return FALSE; + } + + /* + * This payload will be sent deflated. + */ + + *pdu = buf; + *pdulen = deflated_len; + + return TRUE; +} + +/** + * Callout queue callback invoked when the whole packet has expired. + */ +static void +ut_um_expired(cqueue_t *cq, void *obj) +{ + struct ut_msg *um = obj; + + ut_msg_check(um); + g_assert(um->expire_ev != NULL); + + cq_zero(cq, &um->expire_ev); /* Indicates that callback has fired */ + + if (tx_ut_debugging(TX_UT_DBG_MSG | TX_UT_DBG_TIMEOUT, um->to)) { + g_debug("TX UT%s: %s: message for %s expired " + "(tag=\"%s\", seq=0x%04x, %u/%u fragment%s %s, " + "%u transmitted with %u re-transmissions, %u pending ACK%s, " + "%zu fragment%s pending TX)", + nid_to_string(&um->mid), G_STRFUNC, + gnet_host_to_string(um->to), + udp_tag_to_string(um->attr->tag), um->seqno, um->fragsent, + um->fragcnt, plural(um->fragcnt), + um->reliable ? "ack-ed" : "sent", + um->fragtx, um->fragtx2, + um->pending, plural(um->pending), + elist_count(&um->resend), plural(elist_count(&um->resend))); + } + + /* + * If we were unable to transmit all the fragments of the message at + * least once, count it as a clogged UDP output queue. + * + * Otherwise, further messages to that host will be dropped for a while, + * the remote party being probably unresponsive, dead, or clogged. + */ + + if (um->fragtx - um->fragtx2 < um->fragcnt) + gnet_stats_inc_general(GNR_UDP_SR_TX_MESSAGES_CLOGGING); + else + ut_to_ban(um->attr, um->to); /* Drop messages for a while */ + + /* + * Because all the fragments we enqueue have a pre-TX hook, we can simply + * free up the message. None of the pending fragments, if any, will be + * sent. + */ + + ut_msg_free(um, TRUE); +} + +/** + * Create a new message structure to send specified message. + * + * @return NULL in the advent we cannot create the message (because it's too + * large mostly) with errno set, otherwise return the message structure. + */ +static struct ut_msg * +ut_msg_create(struct attr *attr, pmsg_t *mb, const gnet_host_t *to) +{ + struct ut_msg *um; + bool deflated = FALSE; + const void *pdu; + size_t pdulen; + uint32 seqno; + + /* + * Allocate a new sequence ID, rejecting message if we're out of IDs. + */ + + if (!idtable_try_new_id(attr->seq, &seqno, NULL)) { + if (tx_ut_debugging(TX_UT_DBG_MSG, NULL)) + g_debug("TX UT: %s: out of sequence IDs", G_STRFUNC); + errno = ENOBUFS; /* Out of sequence IDs */ + return NULL; + } + + g_assert(seqno < TX_UT_SEQNO_COUNT); /* Is a 16-bit quantity */ + + /* + * See whether we can compress the PDU. + * + * The zlib encapsulation will add a 2-byte header plus a trailing 16-bit + * checksum, hence it's useless to attempt deflation if the payload has + * less than 5 bytes. + * + * If the message is flagged as already being compressed or holding + * likely un-compressible data, also skip the compression stage. + */ + + pdulen = pmsg_size(mb); + pdu = pmsg_read_base(mb); + + if (pdulen > 5 && !pmsg_is_compressed(mb)) + deflated = ut_deflate(attr, &pdu, &pdulen); + + /* + * Split the PDU (possibly compressed) into the appropriate amount of + * fragments if it can fit our protocol. + */ + + if G_UNLIKELY(pdulen > TX_UT_MSG_MAXSIZE) { + if (tx_ut_debugging(TX_UT_DBG_MSG, NULL)) { + g_debug("TX UT: %s: %s message for %s too large (%zu bytes)", + G_STRFUNC, deflated ? "deflated" : "plain", + gnet_host_to_string(to), pdulen); + } + errno = EMSGSIZE; + return NULL; + } + + WALLOC0(um); + um->magic = UT_MSG_MAGIC; + um->mb = pmsg_ref(mb); /* Enqueued, not freeable by upper layer yet */ + um->reliable = booleanize(pmsg_is_reliable(mb)); + um->to = atom_host_get(to); + um->seqno = seqno; + um->mid = ut_msg_id_create(); + um->attr = attr; + um->deflated = booleanize(deflated); + elist_init(&um->resend, offsetof(struct ut_frag, lk)); + + um->fragcnt = pdulen / TX_UT_MTU; + if (pdulen != UNSIGNED(um->fragcnt * TX_UT_MTU)) + um->fragcnt++; + WALLOC_ARRAY(um->fragments, um->fragcnt); + + /* + * The sequence ID (seqno) is going to be echoed back by the receiving + * party during acknowledgements. + * + * The message ID (mid) is our internal ID that is used to create a "weak + * reference" to the message structure though the set. + * See ut_msg_is_alive(), which is the way we "dereference" the message ID. + */ + + idtable_set_value(attr->seq, um->seqno, um); + hevset_insert_key(ut_mset, &um->mid); + + /* + * Create the fragments. + */ + + { + unsigned i; + const void *base = pdu; + size_t remain = pdulen; + + for (i = 0; i < um->fragcnt; i++) { + size_t len = MIN(remain, TX_UT_MTU); + + g_assert(ptr_diff(base, pdu) < pdulen); + g_assert(size_is_positive(len)); + + um->fragmentsi = ut_frag_create(attr, i, um, base, len); + base = const_ptr_add_offset(base, len); + remain = size_saturate_sub(remain, len); + } + + g_assert(0 == remain); + } + + /* + * Set global send-timer expiration: regardless of whether some fragments + * are still unsent, the whole packet will expire when this timer fires. + */ + + um->expire_ev = cq_main_insert(TX_UT_EXPIRE_MS, ut_um_expired, um); + + /* + * The data buffered by this layer is the running count of original message + * sizes we have to transmit, not the compressed PDUs or pending acks or + * fragments. + */ + + attr->buffered = size_saturate_add(attr->buffered, pmsg_size(mb)); + + if (tx_ut_debugging(TX_UT_DBG_MSG, to)) { + g_debug("TX UT%s: %s: created %zu-byte %s %s message (%d bytes) " + "for %s (%u fragment%s, seq=0x%04x, tag=\"%s\", prio=%u)", + nid_to_string(&um->mid), G_STRFUNC, pdulen, + um->reliable ? "reliable" : "unreliable", + deflated ? "deflated" : "plain", pmsg_size(mb), + gnet_host_to_string(to), um->fragcnt, plural(um->fragcnt), + um->seqno, udp_tag_to_string(attr->tag), pmsg_prio(mb)); + } + + return um; +} + +/** + * ID table iterator to release all pending messages. + */ +static void +ut_destroy_msg(void *data, void *unused_arg) +{ + struct ut_msg *um = data; + + (void) unused_arg; + ut_msg_check(um); + + ut_msg_free(um, FALSE); /* Iterating from sequence table */ +} + +/** + * Service routine, invoked by lower layer when it's ready to consume more data. + */ +static void +tx_ut_service(void *data) +{ + const txdrv_t *tx = data; + struct attr *attr = tx->opaque; + + ut_attr_check(attr); + + if (tx_ut_debugging(TX_UT_DBG_SEND, NULL)) { + g_debug("TX UT: %s: servicing layer (tag=\"%s\", " + "upper-flowc=%c, out-of-seqno=%c)", + G_STRFUNC, udp_tag_to_string(attr->tag), + attr->upper_flowc ? 'y' : 'n', + attr->out_of_seqno ? 'y' : 'n'); + } + + if (!ut_pending_send(attr)) + return; + + /* + * We flushed everything we had. + * If upper layer wants servicing, do it. + */ + + tx_ut_upper_service(tx); +} + +/*** + *** Routines exported to the RX side of the semi-reliable UDP layer. + ***/ + +/** + * An acknowledgement was received. + * + * @param tx the TX layer (sibling known to the RX layer) + * @param from host which sent the acknowledgment + * @param ack acknowledgment parameters + */ +void +ut_got_ack(txdrv_t *tx, const gnet_host_t *from, const struct ut_ack *ack) +{ + struct attr *attr = tx->opaque; + struct ut_msg *um; + struct ut_frag *uf; + const char *reason; + + ut_attr_check(attr); + + um = idtable_probe_value(attr->seq, ack->seqno); + + /* + * An ACK can be an EAR negative acknowledgment. + */ + + if (ack->ear) { + g_assert(ack->ear_nack); + + gnet_stats_inc_general(GNR_UDP_SR_TX_EAR_NACKS_RECEIVED); + + if (tx_ut_debugging(TX_UT_DBG_ACK, from)) { + g_debug("TX UT: %s: EAR NACK (seq=0x%04x, tag=\"%s\") from %s", + G_STRFUNC, ack->seqno, + udp_tag_to_string(attr->tag), gnet_host_to_string(from)); + } + } else { + gnet_stats_inc_general(GNR_UDP_SR_TX_TOTAL_ACKS_RECEIVED); + + if (tx_ut_debugging(TX_UT_DBG_ACK, from)) { + g_debug("TX UT: %s: %s%sACK " + "(seq=0x%04x, fragment #%u, tag=\"%s\") from %s", + G_STRFUNC, + ack->cumulative ? "cumulative " : "", + 0 != ack->received ? "extended " : "", + ack->seqno, ack->fragno + 1, + udp_tag_to_string(attr->tag), gnet_host_to_string(from)); + } + } + + /* + * This ACK message is coming from the outside world and needs to be + * carefully validated before being processed: we only want to handle + * valid acks coming from the expected host, based on the sequence ID. + */ + + if (NULL == um) { + reason = "unknown sequence ID"; + goto spurious; /* Probably an ACK for a message we just freed */ + } + + ut_msg_check(um); + + if (ack->fragno >= um->fragcnt) { + reason = "invalid fragment number"; + goto rejected; + } + + if (ack->received != 0 && ack->received > um->fragcnt) { + reason = "received fragment count out of range"; + goto rejected; + } + + if (!um->reliable) { + reason = "was not expecting any ACK for message"; + goto rejected; + } + + /* Compare IPs, not source ports, in case of NAT and different out port */ + + if (!gnet_host_addr_equiv(um->to, from)) { + reason = "coming from alien host"; + goto rejected; + } + + if (ack->ear && !um->expecting_ack) { + reason = "no EAR sent"; + goto rejected; + } + + if (ack->cumulative) + gnet_stats_inc_general(GNR_UDP_SR_TX_CUMULATIVE_ACKS_RECEIVED); + if (ack->received != 0) + gnet_stats_inc_general(GNR_UDP_SR_TX_EXTENDED_ACKS_RECEIVED); + + /* + * Got something back, so remote host is alive. + */ + + um->alive = TRUE; + cq_cancel(&um->ear_ev); + + if (ack->ear) + goto ear_nack; /* Got an EAR NACK, not a fragment ACK */ + + if (um->expecting_ack) + gnet_stats_inc_general(GNR_UDP_SR_TX_EAR_FOLLOWED_BY_ACKS); + + /* + * If all the fragments were received, we're done with the whole message. + */ + + if ( + ack->received == um->fragcnt || + (ack->cumulative && ack->fragno + 1 == um->fragcnt) + ) { + um->fragsent = um->fragcnt; /* Signals: all fragments received */ + ut_msg_free(um, TRUE); + return; + } + + /* + * OK, fragment was properly acknowledged. + * + * If this was the last fragment, we're done and the message was completly + * received by the other end. + */ + + uf = um->fragmentsack->fragno; + + if (uf != NULL) { + g_assert(ack->fragno == uf->fragno); + + /* + * In "cautious" mode we're only sending the last fragment of the + * message hence we need to check that the ACK we're getting is + * for a fragment we actually sent! + */ + + if (0 == uf->txcnt) { + reason = "got ACK for unsent fragment"; + goto rejected; + } + + if (ut_frag_free(uf, TRUE)) + return; /* Was the last fragment */ + } + + /* + * If this is a cumulative acknowledge, make sure we free up earlier + * fragments. + */ + + if (ack->cumulative) { + unsigned i; + bool bad = FALSE; + + /* + * As above, validate that they are acking sent fragments, otherwise + * the "cumulative" bit in the ACK needs to be ignored. + */ + + for (i = 0; i < ack->fragno; i++) { + uf = um->fragmentsi; + if (uf != NULL && 0 == uf->txcnt) { + bad = TRUE; + break; + } + } + + if (bad) { + reason = "got cumulative ACK encompassing unsent fragments"; + goto rejected; + } + + for (i = 0; i < ack->fragno; i++) { + uf = um->fragmentsi; + if (uf != NULL && ut_frag_free(uf, TRUE)) + return; /* Was the last fragment */ + } + } + + /* + * If the amount of fragments received is not zero, we have an extended + * acknowledge with a bitmap specifying which fragments are still missing, + * from which we can derive which have actually been received. + * + * The bit 0 is for fragment #0 (in our zero-based counting) unless + * we have a cumulative acknowledge, in which case the base is the + * fragment following the one being acknowledged. + */ + + if (ack->received != 0) { + unsigned base = ack->cumulative ? ack->fragno + 1 : 0; + unsigned max = base + 24; /* Only 24 significant bits */ + unsigned f; + uint32 mask; /* Always starting with 1, i.e. bit 0 */ + unsigned frags = base; /* Counts received fragments */ + bool bad = FALSE; + + max = MIN(max, um->fragcnt); + + /* + * Validate that the "extended ACK" is not claiming reception of + * fragments we did not send, nor is implying such reception. + */ + + for (f = base, mask = 1; f < max; f++, mask <<= 1) { + if (0 == (ack->missing & mask)) { + uf = um->fragmentsf; /* This fragment was received */ + frags++; + if (uf != NULL && 0 == uf->txcnt) { + bad = TRUE; + break; + } + } + } + + /* + * An extended ACK can also imply reception of other fragments, based + * on the received count: check that these have indeed been sent + * already otherwise the extended ACK is wrong. + */ + + if ( + !bad && + max < um->fragcnt && + ack->received == frags + um->fragcnt - max + ) { + for (f = max; f < um->fragcnt; f++) { + uf = um->fragmentsf; + if (uf != NULL && 0 == uf->txcnt) { + bad = TRUE; + break; + } + } + } + + if (bad) { + reason = "got extended ACK referring to unsent fragments"; + goto rejected; + } + + /* + * OK, the extended acknowledgment is only referring to fragments + * we actually sent. + */ + + frags = base; + + for (f = base, mask = 1; f < max; f++, mask <<= 1) { + if (0 == (ack->missing & mask)) { + uf = um->fragmentsf; /* This fragment was received */ + frags++; + if (uf != NULL && ut_frag_free(uf, TRUE)) + return; /* Was the last fragment */ + } + } + + /* + * In case there are more fragments in the message than can fit in the + * missing bits, and we know we have received all the other fragments + * based on the transmitted count, mark them received as well. + */ + + if (max < um->fragcnt && ack->received == frags + um->fragcnt - max) { + for (f = max; f < um->fragcnt; f++) { + uf = um->fragmentsf; + if (uf != NULL && ut_frag_free(uf, TRUE)) + return; /* Was the last fragment */ + } + } + } + + /* + * If we were being cautious, we can send the remaining fragments + * now that we got our first acknowledgment, and we can mark the host + * as being good so that further messages to that host can be sent more + * quickly for a while. + */ + + if (um->cautious) { + if (tx_ut_debugging(TX_UT_DBG_ACK, from)) { + g_debug("TX UT: %s: got first ACK (seq=0x%04x) from %s, " + "flushing remaining %u fragment%s", + G_STRFUNC, ack->seqno, gnet_host_to_string(from), + um->fragcnt - 1, plural(um->fragcnt - 1)); + } + + ut_send_remaining(um); + ut_to_flag_good(attr, um->to); + + return; + } + + /* FALL THROUGH */ + +ear_nack: + /* + * If we were expecting anything (ACK or EAR NACK) iterate to resend + * the pending fragments. + */ + + if (um->expecting_ack) + ut_resend_async(um); + + um->expecting_ack = FALSE; + + return; + +spurious: + gnet_stats_inc_general(GNR_UDP_SR_TX_SPURIOUS_ACKS_RECEIVED); + goto log; + +rejected: + gnet_stats_inc_general(GNR_UDP_SR_TX_INVALID_ACKS_RECEIVED); + /* FALL THROUGH */ +log: + if (tx_ut_debugging(TX_UT_DBG_ACK, NULL)) { + g_debug("TX UT: %s: rejecting %s%s%sACK " + "(seq=0x%04x, fragment #%u, tag=\"%s\") " + "from %s: %s (message to %s)", + G_STRFUNC, ack->cumulative ? "cumulative " : "", + 0 != ack->received ? "extended " : "", + ack->ear ? "EAR N" : "", + ack->seqno, ack->ear ? 0 : ack->fragno + 1, + udp_tag_to_string(attr->tag), gnet_host_to_string(from), + reason, NULL == um ? "N/A" : gnet_host_to_string2(um->to)); + } +} + +/** + * Send back fragment acknowledgment or EAR to specified host. + * + * @param tx the TX layer (sibling known to the RX layer) + * @param to destination address + * @param ack acknowledgment parameters + */ +void +ut_send_ack(txdrv_t *tx, const gnet_host_t *to, const struct ut_ack *ack) +{ + struct attr *attr = tx->opaque; + struct ut_pmsg_info *pmi; + pmsg_t *mb; + uint8 flags; + int length; + + ut_attr_check(attr); + + if (ack->received != 0) { + flags = UDP_RF_EXTENDED_ACK; + length = UDP_RELIABLE_EXT_HEADER_SIZE; + } else { + flags = 0; + length = UDP_RELIABLE_HEADER_SIZE; + } + + if (ack->cumulative) + flags |= UDP_RF_CUMULATIVE_ACK; + + if (ack->ear && !ack->ear_nack) + flags |= UDP_RF_ACKME; + + /* + * Allocate the message information, the argument to the free routine. + * We're using the same structure as for regular fragments but do not + * set all the fields in the same way: we add the TX attr structure, and + * the destination is an atom, not a mere pointer copy. + */ + + WALLOC0(pmi); + pmi->magic = UT_PMI_MAGIC; + pmi->to = atom_host_get(to); /* Reference count increased */ + pmi->attr = attr; + pmi->fragno = ack->ear ? 0 : ack->fragno + 1; + + /* + * Acknowledgement messages are sent with the highest priority. + */ + + mb = pmsg_new_extend(PMSG_P_HIGHEST, NULL, length, ut_ack_pmsg_free, pmi); + + pmsg_write(mb, attr->tag.value, 3); + pmsg_write_u8(mb, flags); + pmsg_write_be16(mb, ack->seqno); + pmsg_write_u8(mb, ack->ear ? 0 : ack->fragno + 1); + pmsg_write_u8(mb, 0); /* Count = 0 indicates an acknowledgment */ + + if (flags & UDP_RF_EXTENDED_ACK) { + pmsg_write_u8(mb, ack->received); + /* Write ``missing'' as a 24-bit big-endian number */ + pmsg_write_be16(mb, ack->missing >> 8); /* Upper 16 bits */ + pmsg_write_u8(mb, ack->missing & 0xff); /* Lower 8 bits */ + } + + ut_ack_send(mb); +} + +/*** + *** Polymorphic routines. + ***/ + +/** + * Initialize the driver. + * + * Always succeeds, so never returns NULL. + */ +static void * +tx_ut_init(txdrv_t *tx, void *args) +{ + struct attr *attr; + struct tx_ut_args *targs = args; + unsigned i; + + g_assert(tx); + g_assert(targs->cb != NULL); + + /* + * Create a global embedded-value set that will track the association + * between a message ID and a message structure, during the lifetime + * of these messages. + * + * This is a global variable and we track the amount of TX stacks that + * refer to it. Once the number is 0, the set is destroyed. + */ + + tx_ut_mset_add_ref(); + + WALLOC0(attr); + attr->magic = TX_UT_ATTR_MAGIC; + attr->seq = idtable_new(16); /* Sequence numbers are 16-bit wide */ + attr->tx = tx; + attr->zd = zlib_deflater_make(NULL, 0, Z_BEST_COMPRESSION); + attr->ban = aging_make(TX_UT_BAN_FREQ, + gnet_host_hash, gnet_host_equal, gnet_host_free_atom2); + attr->good = aging_make(TX_UT_GOOD_FREQ, + gnet_host_hash, gnet_host_equal, gnet_host_free_atom2); + attr->cb = targs->cb; + attr->tag = targs->tag; /* struct copy */ + attr->improved_acks = booleanize(targs->advertise_improved_acks); + attr->ear_support = booleanize(targs->ear_support); + + for (i = 0; i < N_ITEMS(attr->pending); i++) { + eslist_init(&attr->pendingi, offsetof(struct ut_queued, lk)); + } + + /* + * We will be maintaining two flow-control statuses in the layer attributes: + * + * - upper_flowc will be set when we can no longer accept messages from + * the upper layers because we ran out of sequence IDs or because we + * have locally-enqueued messages that we cannot send. + * + * - lower_flowc is set when we are flow-controlled from the lower layer: + * it is no longer accepting our messages. + * + * These flow-control situations are cleared thusly: + * + * - upper_flowc is cleared when we have new sequence IDs available or + * when we are done flushing our enqueued packets. This happens when + * we are trying to service our upper layers, if they asked us to do so. + * + * - lower_flowc is cleared when we are able to flush all our packets. + * This is done as the lower layer calls our service routine. + * + * The service routine is enabled when we have enqueued data to flush, + * and disabled when we are simply a pass-through (i.e. everything we get + * from above layers can be sent out to the lower layers). The lower + * layer invokes our service routine when it can process more incoming data. + */ + + tx->opaque = attr; + tx_srv_register(tx->lower, tx_ut_service, tx); /* Our service routine */ + + return tx; /* OK */ +} + +/** + * Get rid of the driver's private data. + */ +static void +tx_ut_destroy(txdrv_t *tx) +{ + struct attr *attr = tx->opaque; + + ut_attr_check(attr); + + /* + * Make sure we get rid of the per-message callbacks since we cannot + * be sure that the owner of the TX stack is still around to process + * the notifications correctly when we destroy pending messages. + * --RAM, 2012-12-14 + */ + + ZERO(attr->cb); + + zlib_deflater_free(attr->zd, TRUE); + idtable_foreach(attr->seq, ut_destroy_msg, NULL); + idtable_destroy(attr->seq); + aging_destroy(&attr->ban); + aging_destroy(&attr->good); + ut_pending_discard(attr); + + attr->magic = 0; + WFREE(attr); + + tx_ut_mset_unref(); +} + +/** + * Send buffer datagram to specified destination `to'. + * + * @returns amount of bytes written, 0 if flow-controlled, -1 on error + * with errno set. + */ +static ssize_t +tx_ut_sendto(txdrv_t *tx, pmsg_t *mb, const gnet_host_t *to) +{ + struct attr *attr = tx->opaque; + struct ut_msg *um; + + ut_attr_check(attr); + + gnet_stats_inc_general(GNR_UDP_SR_TX_MESSAGES_GIVEN); + + /* + * If the host is still listed in the temporary ban, because we could not + * successfully send messages to that host recently, then drop the message + * immediately: chances are we won't be able to send this message either. + */ + + if (ut_to_banned(attr, to)) + goto done; + + /* + * If lower layer flow-controlled us, refuse to enqueue another message + * to create some hysteresis: we'll wait for the enqueued messages to + * drain first before accepting new messages. + */ + + if (attr->lower_flowc) { + if (tx_ut_debugging(TX_UT_DBG_MSG, NULL)) + g_debug("TX UT: %s: lower layer flow-controlled us", G_STRFUNC); + goto flow_control; + } + + /* + * Record the message to be sent, asynchronously. + * + * If we accept the message, it will be transmitted fragment by fragment, + * possibly reliably, but for upper layers we accept the whole message + * and will do whatever it takes to send it completly. + */ + + um = ut_msg_create(attr, mb, to); + + if (NULL == um) { + if (ENOBUFS == errno) { + attr->out_of_seqno = TRUE; + goto flow_control; + } + return -1; + } + + /* + * Update statistics. + */ + + if (um->reliable) + gnet_stats_inc_general(GNR_UDP_SR_TX_RELIABLE_MESSAGES_GIVEN); + if (um->deflated) + gnet_stats_inc_general(GNR_UDP_SR_TX_MESSAGES_DEFLATED); + + /* + * Send all the fragments immediately if the message is unreliable or + * is reliable but has only 1 fragment or the host is know to be responsive. + * + * Otherwise, be cautious and send only the last fragment, which should + * be the shortest one in the message. Only when we get that fragment + * acknowledged will we transmit the other unsent fragments all at once. + */ + + if (!um->reliable || ut_to_good(attr, to) || 1 == um->fragcnt) { + ut_send_remaining(um); + } else { + g_assert(um->fragcnt > 1); + + if (tx_ut_debugging(TX_UT_DBG_MSG, NULL)) { + g_debug("TX UT: %s: " + "cautiously sending last fragment (out of %u) to %s", + G_STRFUNC, um->fragcnt, gnet_host_to_string(to)); + } + + um->cautious = TRUE; + ut_frag_send(um->fragmentsum->fragcnt - 1); + } + +done: + return pmsg_size(mb); /* "wrote" the whole message */ + +flow_control: + attr->upper_flowc = TRUE; + return 0; /* Flow-controlling upper layer */ +} + +/** + * Allow servicing of upper TX queue when output fd is ready. + */ +static void +tx_ut_enable(txdrv_t *unused_tx) +{ + /* Nothing specific for this layer */ + (void) unused_tx; +} + +/** + * Disable servicing of upper TX queue. + */ +static void +tx_ut_disable(txdrv_t *unused_tx) +{ + /* Nothing specific for this layer */ + (void) unused_tx; +} + +/** + * @return the amount of data buffered locally, awaiting full transmission. + */ +static size_t +tx_ut_pending(txdrv_t *tx) +{ + struct attr *attr = tx->opaque; + + ut_attr_check(attr); + + return attr->buffered; +} + +/** + * Nothing to do. + */ +static void +tx_ut_flush(txdrv_t *unused_tx) +{ + (void) unused_tx; +} + +/** + * Nothing to do. + */ +static void +tx_ut_shutdown(txdrv_t *unused_tx) +{ + (void) unused_tx; +} + +static const struct txdrv_ops tx_ut_ops = { + "UDP tranceiver", /**< name */ + tx_ut_init, /**< init */ + tx_ut_destroy, /**< destroy */ + tx_no_write, /**< write */ + tx_no_writev, /**< writev */ + tx_ut_sendto, /**< sendto */ + tx_ut_enable, /**< enable */ + tx_ut_disable, /**< disable */ + tx_ut_pending, /**< pending */ + tx_ut_flush, /**< flush */ + tx_ut_shutdown, /**< shutdown */ + tx_close_noop, /**< close */ + tx_no_source, /**< bio_source */ +}; + +const struct txdrv_ops * +tx_ut_get_ops(void) +{ + return &tx_ut_ops; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/tx_ut.h
Added
@@ -0,0 +1,94 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * Network driver -- UDP transceiver layer (semi-reliable UDP) + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _core_tx_ut_h_ +#define _core_tx_ut_h_ + +#include "common.h" +#include "tx.h" +#include "udp_reliable.h" /* For udp_tag_t */ + +#include "if/core/bsched.h" + +const struct txdrv_ops *tx_ut_get_ops(void); + +struct gnutella_host; + +/** + * Callbacks used by the semi-reliable UDP layer. + */ +struct tx_ut_cb { + void (*msg_account)(void *owner, const pmsg_t *mb, + const struct gnutella_host *to); + void (*add_tx_dropped)(void *owner, int amount); +}; + +/** + * Arguments to be passed when the layer is instantiated. + */ +struct tx_ut_args { + udp_tag_t tag; /**< Protocol tag */ + struct tx_ut_cb *cb; /**< Callbacks */ + bool advertise_improved_acks; /**< Improved acks needs flagging in TX */ + bool ear_support; /**< Will the RX side understand EARs? */ +}; + +/** + * Acknowledgment parameters. + */ +struct ut_ack { + uint cumulative:1; /* Cumulative: 0 .. fragno-1 received */ + uint ear:1; /* Whether this was an EAR */ + uint ear_nack:1; /* Whether this was a negative EAR ACK */ + uint16 seqno; /* Sequence ID */ + uint8 fragno; /* Fragment number being acknowledged, zero-based */ + uint8 received; /* If non-zero, amount of fragments received */ + uint32 missing; /* If received != 0, missing fragment bitmap */ +}; + +/* + * Public interface. + */ + +struct pmsg; +struct gnutella_host; + +void ut_got_ack(txdrv_t *tx, + const struct gnutella_host *from, const struct ut_ack *ack); +void ut_send_ack(txdrv_t *tx, + const struct gnutella_host *to, const struct ut_ack *ack); + +#endif /* _core_tx_ut_h_ */ + +/* vi: set ts=4 sw=4 cindent: */ +
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/udp.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/udp.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Raphael Manfredi + * Copyright (c) 2004, 2012, 2014 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,33 +28,43 @@ * Handling UDP datagrams. * * @author Raphael Manfredi - * @date 2004 + * @date 2004, 2012, 2014 */ #include "common.h" +#include <zlib.h> /* For Z_OK */ + #include "udp.h" #include "bogons.h" #include "bsched.h" #include "gmsg.h" #include "gnet_stats.h" #include "gnutella.h" +#include "hostiles.h" #include "inet.h" #include "mq_udp.h" #include "nodes.h" #include "pcache.h" #include "routing.h" +#include "rx_ut.h" #include "settings.h" #include "sockets.h" +#include "udp_reliable.h" #include "if/gnet_property_priv.h" +#include "if/dht/kmsg.h" /* For kmsg_name() */ #include "lib/aging.h" #include "lib/atoms.h" #include "lib/endian.h" +#include "lib/gnet_host.h" #include "lib/hashlist.h" #include "lib/random.h" +#include "lib/stringify.h" #include "lib/walloc.h" +#include "lib/xmalloc.h" +#include "lib/zlib_util.h" #include "lib/override.h" /* Must be the last header included */ @@ -62,22 +72,138 @@ static aging_table_t *udp_aging_pings; +static rxdrv_t *rx_sr_gta2; /**< Semi-reliable RX layer for "GTA" */ +static rxdrv_t *rx_sr_gnd2; /**< Semi-reliable RX layer for "GND" */ + +/** + * Types of UDP traffic we multiplex on the same socket. + */ +enum udp_traffic { + GNUTELLA, /* Gnutella header recognized */ + DHT, /* DHT header recognized */ + RUDP, /* RUDP traffic */ + SEMI_RELIABLE_GTA, /* Semi-reliable UDP, "GTA" tag (Gnutella) */ + SEMI_RELIABLE_GND, /* Semi-reliable UDP, "GND" tag (G2) */ + UNKNOWN /* Unknown traffic */ +}; + +/** + * @return string name of UDP traffic type. + */ +static const char * +udp_traffic_to_string(enum udp_traffic utp) +{ + switch (utp) { + case GNUTELLA: return "Gnutella"; + case DHT: return "DHT"; + case RUDP: return "RUDP"; + case UNKNOWN: return "UNKNOWN"; + case SEMI_RELIABLE_GTA: return "semi-reliable GTA"; + case SEMI_RELIABLE_GND: return "semi-reliable GND"; + } + + g_assert_not_reached(); + return NULL; +} + +/** + * Records the RX layer to use for semi-reliable UDP traffic. + */ +void +udp_set_rx_semi_reliable(enum udp_sr_tag tag, rxdrv_t *rx, enum net_type net) +{ + unsigned i = 0; + + switch (net) { + case NET_TYPE_IPV4: i = 0; break; + case NET_TYPE_IPV6: i = 1; break; + case NET_TYPE_LOCAL: + case NET_TYPE_NONE: + g_carp("mis-configured network type %s for socket", + net_type_to_string(net)); + return; /* Ignore, indicates mis-configuration of bind address */ + } + + switch (tag) { + case UDP_SR_GTA: + rx_sr_gtai = rx; + break; + case UDP_SR_GND: + rx_sr_gndi = rx; + break; + } +} + +/** + * Select proper RX layer for semi-reliable UDP traffic. + * + * Source address is checked for hostile hosts in order to enforce a + * total blackout. + * + * @param utp UDP traffic type + * @param from source address + * @param len length of message, for logging only + * + * @return the RX layer if found, NULL if none or the address is hostile. + */ +static rxdrv_t * +udp_get_rx_semi_reliable(enum udp_traffic utp, host_addr_t from, size_t len) +{ + unsigned i = 0; + hostiles_flags_t hostile = hostiles_check(from); + + if ( + hostiles_flags_are_bad(hostile) || + hostiles_flags_warrant_shunning(hostile) + ) { + if (GNET_PROPERTY(udp_debug)) { + g_warning("UDP got %s (%zu bytes) from hostile %s (%s) -- dropped", + udp_traffic_to_string(utp), len, host_addr_to_string(from), + hostiles_flags_to_string(hostile)); + } + gnet_stats_inc_general(GNR_UDP_SR_RX_FROM_HOSTILE_IP); + return NULL; /* Ignore message */ + } + + switch (host_addr_net(from)) { + case NET_TYPE_IPV4: i = 0; break; + case NET_TYPE_IPV6: i = 1; break; + case NET_TYPE_LOCAL: + case NET_TYPE_NONE: + g_assert_not_reached(); + } + + return + SEMI_RELIABLE_GTA == utp ? rx_sr_gtai : + SEMI_RELIABLE_GND == utp ? rx_sr_gndi : + NULL; +} + /** * Look whether the datagram we received is a valid Gnutella packet. * - * @return NULL if not valid, the UDP node that got the message otherwise + * The routine also handles traffic statistics (reception and dropping). + * + * If ``n'' is not NULL, then ``s'' may be NULL. If ``n'' is NULL, then + * ``s'' must not be NULL. + * + * @param n the pseudo UDP reception node (NULL if invalid IP:port) + * @param s the socket on which we got the UDP datagram + * @param truncated whether datagram was truncated during reception + * @param header header of message + * @param payload payload of message (maybe not contiguous with header) + * @param len total length of message (header + payload) + * + * @return TRUE if valid, FALSE otherwise. */ -static gnutella_node_t * -udp_is_valid_gnet(struct gnutella_socket *s, gboolean dht, gboolean truncated) +bool +udp_is_valid_gnet_split(gnutella_node_t *n, const gnutella_socket_t *s, + bool truncated, const void *header, const void *payload, size_t len) { - struct gnutella_node *n; - gnutella_header_t *head; const char *msg; - const void *payload; - guint16 size; /**< Payload size, from the Gnutella message */ + uint16 size; /**< Payload size, from the Gnutella message */ - n = dht ? node_dht_get_addr_port(s->addr, s->port) : - node_udp_get_addr_port(s->addr, s->port); + g_assert(s != NULL || n != NULL); /* * If we can't get a proper UDP node for this address/port combination, @@ -89,7 +215,7 @@ goto not; } - if (s->pos < GTA_HEADER_SIZE) { + if (len < GTA_HEADER_SIZE) { msg = "Too short"; goto not; } @@ -99,10 +225,8 @@ * Note that packet could be garbage at this point. */ - head = cast_to_gpointer(s->buf); - memcpy(n->header, head, sizeof n->header); - n->size = s->pos - GTA_HEADER_SIZE; /* Payload size if Gnutella msg */ - payload = ptr_add_offset(s->buf, GTA_HEADER_SIZE); + memcpy(n->header, header, sizeof n->header); + n->size = len - GTA_HEADER_SIZE; /* Payload size if Gnutella msg */ gnet_stats_count_received_header(n); gnet_stats_count_received_payload(n, payload); @@ -130,19 +254,23 @@ * 1 byte for the function type) to identify a valid Gnutella packet. */ - switch (gmsg_size_valid(head, &size)) { + switch (gmsg_size_valid(header, &size)) { case GMSG_VALID: case GMSG_VALID_MARKED: break; case GMSG_VALID_NO_PROCESS: + hostiles_dynamic_add(n->addr, + "improper Gnutella header", HSTL_GIBBERISH); msg = "Header flags undefined for now"; goto drop; case GMSG_INVALID: + hostiles_dynamic_add(n->addr, + "invalid Gnutella header size", HSTL_GIBBERISH); msg = "Invalid size (greater than 64 KiB without flags)"; goto not; /* Probably just garbage */ } - if ((size_t) size + GTA_HEADER_SIZE != s->pos) { + if ((size_t) size + GTA_HEADER_SIZE != len) { msg = "Size mismatch"; goto not; } @@ -152,7 +280,7 @@ * messages like HSEP data, BYE or QRP are not expected! */ - switch (gnutella_header_get_function(head)) { + switch (gnutella_header_get_function(header)) { case GTA_MSG_INIT: case GTA_MSG_INIT_RESPONSE: case GTA_MSG_VENDOR: @@ -161,10 +289,10 @@ case GTA_MSG_SEARCH_RESULTS: case GTA_MSG_RUDP: case GTA_MSG_DHT: - return n; + return TRUE; case GTA_MSG_SEARCH: if (settings_is_ultra() && GNET_PROPERTY(enable_guess)) { - return n; /* GUESS query accepted */ + return TRUE; /* GUESS query accepted */ } msg = "Query from UDP refused"; goto drop; @@ -173,45 +301,664 @@ drop: gnet_stats_count_dropped(n, MSG_DROP_UNEXPECTED); - gnet_stats_count_general(GNR_UDP_UNPROCESSED_MESSAGE, 1); + gnet_stats_inc_general(GNR_UDP_UNPROCESSED_MESSAGE); goto log; too_large: gnet_stats_count_dropped(n, MSG_DROP_TOO_LARGE); - gnet_stats_count_general(GNR_UDP_UNPROCESSED_MESSAGE, 1); + gnet_stats_inc_general(GNR_UDP_UNPROCESSED_MESSAGE); goto log; not: - gnet_stats_count_general(GNR_UDP_ALIEN_MESSAGE, 1); + gnet_stats_inc_general(GNR_UDP_ALIEN_MESSAGE); /* FALL THROUGH */ log: if (GNET_PROPERTY(udp_debug)) { - g_warning("got invalid Gnutella packet (%u byte%s) " - "\"%s\" %sfrom UDP (%s): %s", - (unsigned) s->pos, 1 == s->pos ? "" : "s", - gmsg_infostr_full(s->buf, s->pos), + hostiles_flags_t flags; + + /* + * Do not pollute logs with errors from messages coming from known + * hostile addresses: no dumping of datagram, and flag the host as + * hostile anyway so that we know. + */ + + flags = hostiles_check(s->addr); + + g_warning("UDP got invalid %sGnutella packet (%zu byte%s) " + "\"%s\" %sfrom %s%s: %s", + socket_udp_is_old(s) ? "OLD " : "", + len, plural(len), + len >= GTA_HEADER_SIZE ? + gmsg_infostr_full_split(header, payload, len - GTA_HEADER_SIZE) + : "<incomplete Gnutella header>", truncated ? "(truncated) " : "", - host_addr_port_to_string(s->addr, s->port), msg); - if (s->pos) - dump_hex(stderr, "UDP datagram", s->buf, s->pos); + (flags & HSTL_STATIC) ? "static hostile " : "", + NULL == n ? + host_addr_port_to_string(s->addr, s->port) : + node_infostr(n), + msg); + + if (len != 0 && !(flags & HSTL_STATIC)) { + if (len <= GTA_HEADER_SIZE) { + dump_hex(stderr, "UDP datagram", header, len); + } else { + iovec_t iov2; + iovec_set(&iov0, header, GTA_HEADER_SIZE); + iovec_set(&iov1, payload, len - GTA_HEADER_SIZE); + dump_hex_vec(stderr, "UDP datagram", iov, N_ITEMS(iov)); + } + } } - return NULL; + return FALSE; /* Dropped */ +} + +/** + * Look whether the datagram we received is a valid Gnutella packet. + * + * The routine also handles traffic statistics (reception and dropping). + * + * @param n the pseudo UDP reception node (NULL if invalid IP:port) + * @param s the socket on which we got the UDP datagram + * @param truncated whether datagram was truncated during reception + * @param start start of message (header + payload following) + * @param len total length of message + * + * @return TRUE if valid, FALSE otherwise. + */ +static bool +udp_is_valid_gnet(gnutella_node_t *n, const gnutella_socket_t *s, + bool truncated, const void *start, size_t len) +{ + return udp_is_valid_gnet_split(n, s, truncated, start, + const_ptr_add_offset(start, GTA_HEADER_SIZE), len); +} + +/** + * Look whether semi-reliable UDP header corresponds to valid traffic. + * + * This routine is only used for ambiguous traffic that looks like both + * Gnutella and semi-reliable UDP: we want to make sure we're not mistaking + * a legitimate semi-reliable fragment / ACK for a Gnutella message. + * + * @param utp already classified semi-reliable protocol + * @param s socket which received the message + * @param data received data + * @param len length of data + * + * @return TRUE if message corresponds to valid semi-reliable UDP traffic. + */ +static bool +udp_is_valid_semi_reliable(enum udp_traffic utp, const gnutella_socket_t *s, + const void *data, size_t len) +{ + struct ut_header uth; + void *message = NULL; + size_t msglen; + bool valid = TRUE; + + /* + * Since we're talking about an ambiguous message, it is highly unlikely + * we'll ever be called with an acknowledgement: they should have been + * ruled out earlier as improbable since ACKs are short message, much + * shorter than a Gnuella header typically. + * + * So we'll only handle fragments for now, assuming ACKs are legitimate. + */ + + gnet_stats_inc_general(GNR_UDP_AMBIGUOUS_DEEPER_INSPECTION); + + uth.count = udp_reliable_header_get_count(data); + if (0 == uth.count) + return TRUE; /* Acknoweldgments */ + + uth.part = udp_reliable_header_get_part(data) - 1; /* Zero-based */ + uth.flags = udp_reliable_header_get_flags(data); + uth.seqno = udp_reliable_header_get_seqno(data); + + /* + * We're going to ask the RX layer about the message: is it a known + * sequence ID for this host? + * + * This works only for messages with more than one fragment, of course, + * but chances are that, for these, we would have possibly already + * received another fragment, not mistaken as a Gnutella message... + * + * This is OK for acknowledged fragments: we're not going to acknowledge + * the unprocessed fragment, but we'll receive other fragments of the + * message, and later on we'll get a retransmission of the unprocessed + * fragment, which this time will be validated since we have already + * partially received the message. + */ + + if (uth.count > 1) { + rxdrv_t *rx; + gnet_host_t from; + + gnet_host_set(&from, s->addr, s->port); + rx = udp_get_rx_semi_reliable(utp, s->addr, len); + + return NULL == rx ? FALSE : ut_valid_message(rx, &uth, &from); + } + + /* + * We're facing a single-fragment message. + * + * We can trivially probe it and validate it to see whether it can still + * be interpreted as a valid Gnutella message on its own... If the answer + * is yes, then we can assert we're facing a valid semi-reliable UDP + * message. + * + * For deflated payloads, we already validated that the start of the + * payload is a well-formed zlib header, but we'll attempt deflation anyway + * so we will know for sure whether it's a valid message! + * + * Of course we're doing here work that will have to be redone later when + * processing the message, but this is for proper classification and not + * happening very often: only on a very very small fraction of messages for + * which there is a high level of ambiguity. + */ + + g_assert(0 == uth.part); /* First (and only) fragment */ + + if (uth.flags & UDP_RF_DEFLATED) { + int outlen = settings_max_msg_size(); + int ret; + + message = xmalloc(outlen); + + ret = zlib_inflate_into( + const_ptr_add_offset(data, UDP_RELIABLE_HEADER_SIZE), + len - UDP_RELIABLE_HEADER_SIZE, + message, &outlen); + + if (ret != Z_OK) { + valid = FALSE; /* Does not inflate properly */ + goto done; + } + + msglen = outlen; + } else { + message = ptr_add_offset( + deconstify_pointer(data), UDP_RELIABLE_HEADER_SIZE); + msglen = len - UDP_RELIABLE_HEADER_SIZE; + } + + switch (utp) { + case SEMI_RELIABLE_GTA: + /* + * Assume message is valid if the Gnutella size header is consistent + * with the length of the whole message. + */ + + { + uint16 size; + + switch (gmsg_size_valid(message, &size)) { + case GMSG_VALID: + case GMSG_VALID_MARKED: + break; + case GMSG_VALID_NO_PROCESS: /* Header flags undefined for now */ + case GMSG_INVALID: + valid = FALSE; + goto done; + } + + valid = (size_t) size + GTA_HEADER_SIZE == msglen; + } + break; + case SEMI_RELIABLE_GND: + valid = TRUE; /* For now */ + break; + case GNUTELLA: + case DHT: + case RUDP: + case UNKNOWN: + g_assert_not_reached(); + } + +done: + if (uth.flags & UDP_RF_DEFLATED) + xfree(message); + + return valid; +} + +/** + * Check message header for a valid semi-reliable UDP header. + * + * @param head message header + * @param len message length + * + * @return intuited type + */ +static enum udp_traffic +udp_check_semi_reliable(const void *head, size_t len) +{ + uint8 flags, part, count; + const unsigned char *tag; + enum udp_traffic utp; + + if (len < UDP_RELIABLE_HEADER_SIZE) + return UNKNOWN; + + /* + * We're only interested in "GTA" and "GND" traffic. + */ + + tag = head; + if (tag0 != 'G') + return UNKNOWN; + + if ('T' == tag1 && 'A' == tag2) { + utp = SEMI_RELIABLE_GTA; + goto tag_known; + } + + if ('N' == tag1 && 'D' == tag2) { + utp = SEMI_RELIABLE_GND; + goto tag_known; + } + + return UNKNOWN; /* Not a tag we know about */ + +tag_known: + + /* + * Extract key fields from the header. + */ + + flags = udp_reliable_header_get_flags(head); + part = udp_reliable_header_get_part(head); + count = udp_reliable_header_get_count(head); + + /* + * There are 2 bits that must be zero in the flags (critical bits that + * we don't know about if set and therefore would lead us to drop the + * fragment anyway). + * + * This will match 3 random bytes out of 4, or 75% of them. + */ + + if (0 != (flags & UDP_RF_CRITICAL_MASK)) + return UNKNOWN; /* Critical flags we don't know about */ + + /* + * Normally the part is non-zero, unless we're facing an Extra + * Acknowledgment Request (EAR) in which case both part and count will + * be set to zero. + * + * Hence, 0 is an invalid part number for plain fragments only, when + * count is non-zero. + */ + + if (0 == part && 0 != count) + return UNKNOWN; /* Invalid fragment number */ + + /* + * Check acknowledgments for consistency. + */ + + if (0 == count) { + size_t nominal_size = UDP_RELIABLE_HEADER_SIZE; + + if (flags & UDP_RF_EXTENDED_ACK) { + uint8 received; + + if (len < UDP_RELIABLE_EXT_HEADER_SIZE) + return UNKNOWN; + + received = udp_reliable_get_received(head); + nominal_size = UDP_RELIABLE_EXT_HEADER_SIZE; + + if (0 == received) + return UNKNOWN; /* At least one fragment received! */ + + if (0 == part) + return UNKNOWN; /* EARs are not extended */ + + if ((flags & UDP_RF_CUMULATIVE_ACK) && received < part) + return UNKNOWN; /* Receiver must have ``part'' fragments */ + } + + /* + * A valid acknowledgment should never claim to have a deflated payload. + * First, there is no payload expected, really, but second, in order + * to have deflation creating a saving over plain bytes, it would + * require to carry over a significant amount of data, something that + * is totally illogical in any foreseeable future. + */ + + if (flags & UDP_RF_DEFLATED) + return UNKNOWN; /* Cannot be a legitimate acknowledgment */ + + /* + * We don't check for the UDP_RF_ACKME flag. No acknowledgment should + * specify this, but implementations should ignore that flag anyway for + * acknowledgments, so a broken implementation could have it set and + * it would go totally unnoticed during testing. + * + * Actually, EARs can have the UDP_RF_ACKME flag set, but we don't care + * at this point. + */ + + /* + * There could be a (small) payload added one day to acknowledgments, + * but it should remain small otherwise the protocol will become + * inefficient. + * + * Therefore it is fair to assume that if the length of the fragment + * claiming to be an acknowledgement is more than twice as large as + * it should be, it most definitely isn't an acknowledgment. + */ + + if (len > 2 * nominal_size) + return UNKNOWN; /* Was certainly a false positive! */ + + return utp; /* OK, seems valid as far as we can tell */ + } + + /* + * This has roughly a 50% chance of correctly ruling out a non-header. + */ + + if (part > count) + return UNKNOWN; /* Invalid fragment number */ + + /* + * If we are receiving fragment #1 of a message, we can further check + * the consistency of the "deflate" flag provided we have at least 2 bytes + * in the payload. + */ + + if ( + 1 == part && (flags & UDP_RF_DEFLATED) && + len >= UDP_RELIABLE_HEADER_SIZE + 2 + ) { + const void *payload = + const_ptr_add_offset(head, UDP_RELIABLE_HEADER_SIZE); + + if (!zlib_is_valid_header(payload, len - UDP_RELIABLE_HEADER_SIZE)) + return UNKNOWN; /* Supposedly deflated payload is not valid */ + } + + return utp; +} + +/** + * Identify the traffic type received on the UDP socket. + * + * This routine uses simple heuristics that ensure we're properly discriminating + * incoming traffic on the UDP socket between regular Gnutella traffic and + * semi-reliable UDP traffic (which adds a small header before its actual + * payload). + * + * Most messages will be un-ambiguous, and the probabilty of misclassifying + * an ambiguous message (one that look like valid for both types, based on + * header inspections) is brought down to less than 1 in a billion, making + * it perfectly safe in practice. + * + * @return intuited type + */ +static enum udp_traffic +udp_intuit_traffic_type(const gnutella_socket_t *s, + const void *data, size_t len) +{ + enum udp_traffic utp; + + utp = udp_check_semi_reliable(data, len); + + if (len >= GTA_HEADER_SIZE) { + uint16 size; /* Payload size, from the Gnutella message */ + gmsg_valid_t valid; + + valid = gmsg_size_valid(data, &size); + + switch (valid) { + case GMSG_VALID: + case GMSG_VALID_MARKED: + if ((size_t) size + GTA_HEADER_SIZE == len) { + uint8 function, hops, ttl; + + function = gnutella_header_get_function(data); + + /* + * If the header cannot be that of a known semi-reliable + * UDP protocol, there is no ambiguity. + */ + + if (UNKNOWN == utp) { + return GTA_MSG_DHT == function ? + DHT : GTA_MSG_RUDP == function ? + RUDP : GNUTELLA; + } + + /* + * Message is ambiguous: its leading header appears to be + * both a legitimate Gnutella message and a semi-reliable UDP + * header. + * + * We have to apply some heuristics to decide whether to handle + * the message as a Gnutella one or as a semi-reliable UDP one, + * knowing that if we improperly classify it, the message will + * not be handled correctly. + * + * Note that this is highly unlikely. There is about 1 chance + * in 10 millions (1 / 2^23 exactly) to mis-interpret a random + * Gnutella MUID as the start of one of the semi-reliable + * protocols we support. Our discriminating logic probes a + * few more bytes (say 2 at least) which are going to let us + * decide with about 99% certainety. So mis-classification + * will occur only once per billion -- a ratio which is OK. + * + * We could also mistakenely handle a semi-reliable UDP message + * as a Gnutella one. For that to happen, the payload must + * contain a field that will be exactly the message size, + * a 1 / 2^32 event (since the size is 4 bytes in Gnutella). + * However, if message flags are put to use for Gnutella UDP, + * this ratio could lower to 1 / 2^16 and that is too large + * a chance (about 1.5 in 100,000). + * + * So when we think an ambiguous message could be a valid + * Gnutella message, we also check whether the message could + * not be interpreted as a valid semi-reliable UDP one, and + * we give priority to that classification if we have a match: + * correct sequence number, consistent count and emitting host. + * This checks roughly 3 more bytes in the message, yielding + * a misclassification for about 1 / 2^(16+24) random cases. + */ + + hops = gnutella_header_get_hops(data); + ttl = gnutella_header_get_ttl(data); + + gnet_stats_inc_general(GNR_UDP_AMBIGUOUS); + + if (GNET_PROPERTY(udp_debug)) { + g_debug("UDP ambiguous datagram from %s: " + "%zu bytes (%u-byte payload), " + "function=%u, hops=%u, TTL=%u, size=%u", + host_addr_port_to_string(s->addr, s->port), + len, size, function, hops, ttl, + gnutella_header_get_size(data)); + dump_hex(stderr, "UDP ambiguous datagram", data, len); + } + + switch (function) { + case GTA_MSG_DHT: + /* + * A DHT message must be larger than KDA_HEADER_SIZE bytes. + */ + + if (len < KDA_HEADER_SIZE) + break; /* Not a DHT message */ + + /* + * DHT messages have no bits defined in the size field + * to mark them. + */ + + if (valid != GMSG_VALID) + break; /* Higest bit set, not a DHT message */ + + /* + * If it is a DHT message, it must have a valid opcode. + */ + + function = kademlia_header_get_function(data); + + if (function > KDA_MSG_MAX_ID) + break; /* Not a valid DHT opcode */ + + /* + * Check the contact address length: it must be 4 in the + * header, because there is only room for an IPv4 address. + */ + + if (!kademlia_header_constants_ok(data)) + break; /* Not a valid Kademlia header */ + + /* + * Make sure we're not mistaking a valid semi-reliable UDP + * message as a DHT message. + */ + + if (udp_is_valid_semi_reliable(utp, s, data, len)) + break; /* Validated it as semi-reliable UDP */ + + g_warning("UDP ambiguous message from %s (%zu bytes total)," + " DHT function is %s", + host_addr_port_to_string(s->addr, s->port), + len, kmsg_name(function)); + + return DHT; + + case GTA_MSG_INIT: + case GTA_MSG_PUSH_REQUEST: + case GTA_MSG_SEARCH: + /* + * No incoming messages of this type can have a TTL + * indicating a deflated payload, since there is no + * guarantee the host would be able to read it (deflated + * UDP is negotiated and can therefore only come from a + * response). + */ + + if (ttl & GTA_UDP_DEFLATED) + break; /* Not Gnutella, we're positive */ + + /* FALL THROUGH */ + + case GTA_MSG_INIT_RESPONSE: + case GTA_MSG_VENDOR: + case GTA_MSG_SEARCH_RESULTS: + /* + * To further discriminate, look at the hop count. + * Over UDP, the hop count will be low (0 or 1 mostly) + * and definitely less than 3 since the only UDP-relayed + * messages are from GUESS, and they can travel at most + * through a leaf and an ultra node before reaching us. + */ + + if (hops >= 3U) + break; /* Gnutella is very unlikely */ + + /* + * Check the TTL, cleared from bits that indicate + * support for deflated UDP or a deflated payload. + * No servent should send a TTL greater than 7, which + * was the de-facto limit in the early Gnutella days. + */ + + if ((ttl & ~(GTA_UDP_CAN_INFLATE | GTA_UDP_DEFLATED)) > 7U) + break; /* Gnutella is very unlikely */ + + /* + * Make sure we're not mistaking a valid semi-reliable UDP + * message as a Gnutella message. + */ + + if (udp_is_valid_semi_reliable(utp, s, data, len)) + break; /* Validated it as semi-reliable UDP */ + + g_warning("UDP ambiguous message from %s (%zu bytes total)," + " Gnutella function is %s, hops=%u, TTL=%u", + host_addr_port_to_string(s->addr, s->port), + len, gmsg_name(function), hops, ttl); + + return GNUTELLA; + + case GTA_MSG_RUDP: + /* + * RUDP traffic is special: the only meaningful fields + * of the Gnutella header are the opcode field (which we + * have read here since we fall into this case) and the + * Gnutella header size. + * + * The TTL and hops fields cannot be interpreted to + * disambiguate, so our only option is deeper inspection. + */ + + if (udp_is_valid_semi_reliable(utp, s, data, len)) + break; /* Validated it as semi-reliable UDP */ + + g_warning("UDP ambiguous message from %s (%zu bytes total)," + " interpreted as RUDP packet", + host_addr_port_to_string(s->addr, s->port), len); + + return RUDP; + + case GTA_MSG_STANDARD: /* Nobody is using this function code */ + default: + break; /* Not a function we expect over UDP */ + } + + /* + * Will be handled as semi-reliable UDP. + */ + + gnet_stats_inc_general(GNR_UDP_AMBIGUOUS_AS_SEMI_RELIABLE); + + { + udp_tag_t tag; + + memcpy(tag.value, data, sizeof tag.value); + + g_warning("UDP ambiguous message (%zu bytes total), " + "not Gnutella (function is %d, hops=%u, TTL=%u) " + "handling as semi-reliable UDP (tag=\"%s\")", + len, function, hops, ttl, udp_tag_to_string(tag)); + } + return utp; + } + /* FALL THROUGH */ + case GMSG_VALID_NO_PROCESS: + case GMSG_INVALID: + break; + } + } + + return utp; } /** * Notification from the socket layer that we got a new datagram. * + * @param s the receiving socket (with s->addr and s->port set) + * @param data start of received data (not necessarily s->buf) + * @param len length of received data (not necessarily s->pos) + * @param truncated whether received datagram was truncated + * * If `truncated' is true, then the message was too large for the * socket buffer. */ void -udp_received(struct gnutella_socket *s, gboolean truncated) +udp_received(const gnutella_socket_t *s, + const void *data, size_t len, bool truncated) { gnutella_node_t *n; - gboolean bogus = FALSE; - gboolean dht = FALSE; + bool bogus = FALSE, dht = FALSE, rudp = FALSE, g2 = FALSE; + hostiles_flags_t hflags; /* * This must be regular Gnutella / DHT traffic. @@ -220,14 +967,103 @@ inet_udp_got_incoming(s->addr); /* + * We need to identify semi-reliable UDP traffic early, because that + * traffic needs to go through the RX stack to reassemble the final + * payload out of the many fragments, or to process the acknowledgments. + * + * We have to apply heuristics however because the leading 8 bytes could + * be just a part of gnutella message (the first 8 bytes of a GUID). + * One thing is certain though: if the size is less than that of a a + * Gnutella header, it has to be semi-reliable UDP traffic... + * + * Because semi-reliable UDP uses small payloads, much smaller than our + * socket buffer, the datagram cannot be truncated. + */ + + if (!truncated) { + enum udp_traffic utp; + rxdrv_t *rx; + + utp = udp_intuit_traffic_type(s, data, len); + + switch (utp) { + case GNUTELLA: + goto unreliable; + case RUDP: + rudp = TRUE; + gnet_stats_count_general(GNR_RUDP_RX_BYTES, len); + goto rudp; /* Don't account this message in UDP statistics */ + case DHT: + dht = TRUE; + goto unreliable; + case UNKNOWN: + goto unknown; + case SEMI_RELIABLE_GTA: + break; + case SEMI_RELIABLE_GND: + if (!node_g2_active()) + return; /* Blackout, ignore datagram if G2 was disabled */ + g2 = TRUE; + break; + } + + /* + * We are going to treat this message a a semi-reliable UDP fragment. + * + * Account the size of the payload for traffic purposes, then redirect + * the message to the RX layer that reassembles and dispatches these + * messages. + */ + + bws_udp_count_read(len, FALSE); /* We know it's not DHT traffic */ + + rx = udp_get_rx_semi_reliable(utp, s->addr, len); + + if (rx != NULL) { + gnet_host_t from; + + gnet_host_set(&from, s->addr, s->port); + ut_got_message(rx, data, len, &from); + } + + return; + } + +unknown: + /* * Discriminate between Gnutella UDP and DHT messages, so that we * can account received data with the proper bandwidth scheduler. */ - if (s->pos >= GTA_HEADER_SIZE) - dht = GTA_MSG_DHT == gnutella_header_get_function(s->buf); + if (len >= GTA_HEADER_SIZE) + dht = GTA_MSG_DHT == gnutella_header_get_function(data); + + /* FALL THROUGH */ + +unreliable: + /* + * Account for Gnutella / DHT incoming UDP traffic. + */ + + bws_udp_count_read(len, dht); - bws_udp_count_read(s->pos, dht); + /* FALL THROUGH */ + +rudp: + /* + * The RUDP layer is used to implement firewalled-to-firewalled transfers + * via a mini TCP-like layer built on top of UDP. Therefore, it is used + * as the basis for higher-level connections (HTTP) and will have to be + * accounted for once the type of traffic is known, by upper layers, as + * part of the upload/download traffic. + * + * Of course, the higher levels will never see all the bytes that pass + * through, such as acknowledgments or retransmissions, but that is also + * the case for TCP-based sockets. + * --RAM, 2012-11-02. + */ + + g_assert(!g2); /* All G2 UDP traffic comes via the semi-reliable layer */ /* * If we get traffic from a bogus IP (unroutable), warn, for now. @@ -237,27 +1073,74 @@ bogus = TRUE; if (GNET_PROPERTY(udp_debug)) { - g_warning("UDP %sdatagram (%d byte%s) received from bogus IP %s", + g_warning("UDP %sdatagram (%zu byte%s) received from bogus IP %s", truncated ? "truncated " : "", - (int) s->pos, s->pos == 1 ? "" : "s", + len, plural(len), host_addr_to_string(s->addr)); } - gnet_stats_count_general(GNR_UDP_BOGUS_SOURCE_IP, 1); + gnet_stats_inc_general(GNR_UDP_BOGUS_SOURCE_IP); } - if (!(n = udp_is_valid_gnet(s, dht, truncated))) + /* + * Traffic from hosts sending gibberish data or information we previously + * determined as being invalid / suspicious are simply discarded to avoid + * further processing (which would probably lead to them being further + * discarded as invalid, unparseable, etc...). + * + * We let statically-banned hosts through though so that we may parse + * their message and log dropping in upper layers, for statistics per + * message type. We only drop known gibberish at this level. + */ + + hflags = hostiles_check(s->addr); + + if (hflags & HSTL_GIBBERISH) { + if (GNET_PROPERTY(udp_debug)) { + g_warning("UDP %sdatagram (%zu byte%s) received from " + "shunned IP %s (%s) -- dropped", + truncated ? "truncated " : "", + len, plural(len), + host_addr_to_string(s->addr), hostiles_flags_to_string(hflags)); + } + gnet_stats_inc_general(GNR_UDP_SHUNNED_SOURCE_IP); + return; + } + + /* + * Get proper pseudo-node. + * + * These routines can return NULL if the address/port combination is + * not correct, but this will be handled by udp_is_valid_gnet(). + */ + + n = dht ? node_dht_get_addr_port(s->addr, s->port) : + node_udp_get_addr_port(s->addr, s->port); + + if (!udp_is_valid_gnet(n, s, truncated, data, len)) + return; + + /* + * RUDP traffic does not go to the upper Gnutella processing layers. + */ + + if (rudp) { + /* Not ready for prime time */ +#if 0 + rudp_handle_packet(s->addr, s->port. data, len); +#endif return; + } /* * Process message as if it had been received from regular Gnet by * another node, only we'll use a special "pseudo UDP node" as origin. */ - if (GNET_PROPERTY(udp_debug) > 19) - g_debug("UDP got %s from %s%s", gmsg_infostr_full(s->buf, s->pos), + if (GNET_PROPERTY(udp_debug) > 19 || (bogus && GNET_PROPERTY(udp_debug))) + g_debug("UDP got %s from %s%s", gmsg_infostr_full(data, len), bogus ? "BOGUS " : "", host_addr_port_to_string(s->addr, s->port)); - node_udp_process(n, s); + node_udp_process(n, s, data, len); } /** @@ -265,12 +1148,40 @@ * forming a valid Gnutella message. */ void -udp_send_msg(const gnutella_node_t *n, gconstpointer buf, int len) +udp_send_msg(const gnutella_node_t *n, const void *buf, int len) { + pmsg_t *mb; + g_assert(NODE_IS_UDP(n)); g_return_if_fail(n->outq); - mq_udp_node_putq(n->outq, gmsg_to_pmsg(buf, len), n); + /* + * If message is directed to a UDP node that can do semi-reliable UDP, + * then turn on reliability on the message. + */ + + mb = gmsg_to_pmsg(buf, len); + if (NODE_CAN_SR_UDP(n)) + pmsg_mark_reliable(mb); + mq_udp_node_putq(n->outq, mb, n); +} + +/** + * Send a datagram to the specified node, made of `len' bytes from `buf', + * forming a valid Gnutella message, with a "control" priority. + */ +void +udp_ctrl_send_msg(const gnutella_node_t *n, const void *buf, int len) +{ + pmsg_t *mb; + + g_assert(NODE_IS_UDP(n)); + g_return_if_fail(n->outq); + + mb = gmsg_to_ctrl_pmsg(buf, len); + if (NODE_CAN_SR_UDP(n)) + pmsg_mark_reliable(mb); /* Send reliably if node supports it */ + mq_udp_node_putq(n->outq, mb, n); } /** @@ -290,6 +1201,8 @@ g_assert_not_reached(); } g_assert(NODE_IS_UDP(n)); + if (NODE_CAN_SR_UDP(n)) + pmsg_mark_reliable(mb); /* Send reliably if node supports it */ mq_udp_node_putq(n->outq, mb, n); } @@ -318,11 +1231,11 @@ * specified MUID. */ void -udp_connect_back(const host_addr_t addr, guint16 port, const struct guid *muid) +udp_connect_back(const host_addr_t addr, uint16 port, const struct guid *muid) { if (udp_send_ping(muid, addr, port, FALSE)) { if (GNET_PROPERTY(udp_debug) > 19) - g_debug("UDP queued connect-back PING %s to %s\n", + g_debug("UDP queued connect-back PING #%s to %s\n", guid_hex_str(muid), host_addr_port_to_string(addr, port)); } } @@ -341,21 +1254,23 @@ struct udp_ping { struct guid muid; /* MUST be at offset zero (for hashing function) */ - time_t added; /**< Timestamp of insertion */ + time_t added; /**< Timestamp of insertion */ + const gnet_host_t *host; /**< Host to whom we've sent the ping (atom) */ struct udp_ping_cb *callback; /**< Optional: callback description */ }; static const time_delta_t UDP_PING_TIMEOUT = 30; /**< seconds */ -static const size_t UDP_PING_MAX = 1024; /**< amount to track */ -static const int UDP_PING_PERIODIC_MS = 10000; /**< milliseconds */ +static const size_t UDP_PING_MAX = 2048; /**< amount to track */ +static const int UDP_PING_PERIODIC_MS = 5000; /**< milliseconds */ -static hash_list_t *udp_pings; /**< Tracks send/forwarded UDP Pings */ -static cevent_t *udp_ping_ev; /**< Monitoring event */ +static hash_list_t *udp_pings; /**< Tracks sent/forwarded UDP Pings */ +static cperiodic_t *udp_ping_ev; /**< Monitoring event */ static inline void udp_ping_free(struct udp_ping *ping) { - WFREE_NULL(ping->callback, sizeof *ping->callback); + WFREE_TYPE_NULL(ping->callback); + atom_host_free_null(&ping->host); WFREE(ping); } @@ -365,7 +1280,7 @@ * @param forced TRUE if we're shutdowning and want to cleanup */ static void -udp_ping_expire(gboolean forced) +udp_ping_expire(bool forced) { time_t now; @@ -377,9 +1292,8 @@ time_delta_t d; ping = hash_list_head(udp_pings); - if (!ping) { + if (NULL == ping) break; - } if (!forced) { d = delta_time(now, ping->added); if (d > 0 && d <= UDP_PING_TIMEOUT) { @@ -398,28 +1312,24 @@ } /** - * Callout queue callback to perform periodic monitoring of the - * registered pings. + * Callout queue periodic callback to perform monitoring of registered pings. */ -static void -udp_ping_timer(cqueue_t *cq, gpointer unused_udata) +static bool +udp_ping_timer(void *unused_udata) { (void) unused_udata; - /* - * Re-install timer for next time. - */ - - udp_ping_ev = cq_insert(cq, UDP_PING_PERIODIC_MS, udp_ping_timer, NULL); udp_ping_expire(FALSE); + return TRUE; /* Keep calling */ } -static gboolean +static bool udp_ping_register(const struct guid *muid, - udp_ping_cb_t cb, void *data, gboolean multiple) + host_addr_t addr, uint16 port, + udp_ping_cb_t cb, void *data, bool multiple) { struct udp_ping *ping; - guint length; + uint length; g_assert(muid); g_return_val_if_fail(udp_pings, FALSE); @@ -434,13 +1344,19 @@ if (length >= UDP_PING_MAX) { return FALSE; } else if (length > (UDP_PING_MAX / 4) * 3) { - if ((random_u32() % UDP_PING_MAX) < length) + if (random_value(UDP_PING_MAX - 1) < length) return FALSE; } WALLOC(ping); ping->muid = *muid; ping->added = tm_time(); + { + gnet_host_t host; + gnet_host_set(&host, addr, port); + ping->host = atom_host_get(&host); + } + if (cb != NULL) { WALLOC0(ping->callback); ping->callback->cb = cb; @@ -458,12 +1374,19 @@ * ping bearing the given MUID. * * If there was a callback atttached to the reception of a reply, invoke it - * before returning. + * before returning UDP_PONG_HANDLED. + * + * The ``host'' paramaeter MUST be a stack or static pointer to a gnet_host_t, + * and NOT the address of a dynamically allocated host because gnet_host_copy() + * is going to be used on it. + * + * @param n the gnutella node replying + * @param host if non-NULL, filled with the host to whom we sent the ping * * @return TRUE if indeed this was a reply for a ping we sent. */ enum udp_pong_status -udp_ping_is_registered(const struct gnutella_node *n) +udp_ping_is_registered(const gnutella_node_t *n, gnet_host_t *host) { const struct guid *muid = gnutella_header_get_muid(&n->header); @@ -471,7 +1394,17 @@ struct udp_ping *ping; ping = hash_list_remove(udp_pings, muid); - if (ping) { + if (ping != NULL) { + if (host != NULL) { + /* + * Let caller know the exact IP:port of the host we contacted, + * since the replying party can use a different port (which + * we may not be able to contact, whereas we know the targeted + * port did cause a reply). + */ + gnet_host_copy(host, ping->host); + } + if (ping->callback) { (*ping->callback->cb)(UDP_PING_REPLY, n, ping->callback->data); if (ping->callback->multiple) { @@ -503,16 +1436,17 @@ * * @return TRUE if we sent the ping, FALSE it we throttled it. */ -static gboolean +static bool udp_send_ping_with_callback( - gnutella_msg_init_t *m, guint32 size, - const host_addr_t addr, guint16 port, - udp_ping_cb_t cb, void *arg, gboolean multiple) + gnutella_msg_init_t *m, uint32 size, + const host_addr_t addr, uint16 port, + udp_ping_cb_t cb, void *arg, bool multiple) { - struct gnutella_node *n = node_udp_get_addr_port(addr, port); + gnutella_node_t *n = node_udp_get_addr_port(addr, port); if (n != NULL) { - if (udp_ping_register(gnutella_header_get_muid(m), cb, arg, multiple)) { + const guid_t *muid = gnutella_header_get_muid(m); + if (udp_ping_register(muid, addr, port, cb, arg, multiple)) { aging_insert(udp_aging_pings, wcopy(&addr, sizeof addr), GUINT_TO_POINTER(1)); udp_send_msg(n, m, size); @@ -532,12 +1466,12 @@ * * @return TRUE if we sent the ping, FALSE it we throttled it. */ -gboolean -udp_send_ping(const struct guid *muid, const host_addr_t addr, guint16 port, - gboolean uhc_ping) +bool +udp_send_ping(const struct guid *muid, const host_addr_t addr, uint16 port, + bool uhc_ping) { gnutella_msg_init_t *m; - guint32 size; + uint32 size; /* * Don't send too frequent pings: they may throttle us anyway. @@ -551,6 +1485,10 @@ return FALSE; } + if (uhc_ping && GNET_PROPERTY(log_uhc_pings_tx)) { + g_debug("UDP UHC sending ping to %s", host_addr_to_string(addr)); + } + m = build_ping_msg(muid, 1, uhc_ping, &size); return udp_send_ping_with_callback(m, size, addr, port, NULL, NULL, FALSE); } @@ -569,11 +1507,11 @@ * * @return TRUE if we sent the ping, FALSE it we throttled it. */ -gboolean +bool udp_send_ping_callback( - gnutella_msg_init_t *m, guint32 size, - const host_addr_t addr, guint16 port, - udp_ping_cb_t cb, void *arg, gboolean multiple) + gnutella_msg_init_t *m, uint32 size, + const host_addr_t addr, uint16 port, + udp_ping_cb_t cb, void *arg, bool multiple) { g_assert(cb != NULL); g_assert(GTA_MSG_INIT == gnutella_header_get_function(m)); @@ -599,7 +1537,8 @@ host_addr_hash_func, host_addr_eq_func, wfree_host_addr); udp_pings = hash_list_new(guid_hash, guid_eq); - udp_ping_timer(callout_queue, NULL); + udp_ping_ev = cq_periodic_main_add(UDP_PING_PERIODIC_MS, + udp_ping_timer, NULL); } /** @@ -613,6 +1552,7 @@ hash_list_free(&udp_pings); } + cq_periodic_remove(&udp_ping_ev); aging_destroy(&udp_aging_pings); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/udp.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/udp.h
Changed
@@ -66,27 +66,47 @@ typedef void (*udp_ping_cb_t)(enum udp_ping_ret type, const struct gnutella_node *n, void *data); +/** + * Known semi-reliable UDP protocol types. + */ +enum udp_sr_tag { + UDP_SR_GTA, + UDP_SR_GND +}; + /* * Public interface. */ struct gnutella_socket; struct gnutella_node; +struct gnutella_host; struct guid; struct pmsg; +struct rxdriver; -void udp_received(struct gnutella_socket *s, gboolean truncated); -void udp_connect_back(const host_addr_t addr, guint16 port, +void udp_received(const struct gnutella_socket *s, + const void *data, size_t len, bool truncated); +void udp_connect_back(const host_addr_t addr, uint16 port, const struct guid *muid); -void udp_send_msg(const struct gnutella_node *n, gconstpointer buf, int len); -gboolean udp_send_ping(const struct guid *muid, - const host_addr_t addr, guint16 port, gboolean uhc_ping); -gboolean udp_send_ping_callback(gnutella_msg_init_t *m, guint32 size, - const host_addr_t addr, guint16 port, - udp_ping_cb_t cb, void *arg, gboolean multiple); +void udp_send_msg(const struct gnutella_node *n, const void *buf, int len); +void udp_ctrl_send_msg(const struct gnutella_node *n, const void *buf, int len); +bool udp_send_ping(const struct guid *muid, + const host_addr_t addr, uint16 port, bool uhc_ping); +bool udp_send_ping_callback(gnutella_msg_init_t *m, uint32 size, + const host_addr_t addr, uint16 port, + udp_ping_cb_t cb, void *arg, bool multiple); void udp_send_mb(const struct gnutella_node *n, struct pmsg *mb); void udp_dht_send_mb(const struct gnutella_node *n, struct pmsg *mb); -enum udp_pong_status udp_ping_is_registered(const struct gnutella_node *n); +enum udp_pong_status udp_ping_is_registered(const struct gnutella_node *n, + struct gnutella_host *host); + +bool udp_is_valid_gnet_split(struct gnutella_node *n, + const struct gnutella_socket *s, + bool truncated, const void *header, const void *payload, size_t len); + +void udp_set_rx_semi_reliable(enum udp_sr_tag tag, + struct rxdriver *rx, enum net_type net); void udp_init(void); void udp_close(void);
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/udp_reliable.h
Added
@@ -0,0 +1,156 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * Definitions for the (semi-)reliable UDP layer. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _core_udp_reliable_h_ +#define _core_udp_reliable_h_ + +/* + * Protocol tag. + */ + +typedef struct udp_tag { + char value3; /* 3-letter tag */ +} udp_tag_t; + +static inline const char * +udp_tag_to_string(const udp_tag_t tag) +{ + static char buf4; + + memcpy(buf, tag.value, 3); + buf3 = '\0'; + + return buf; +} + +static inline void +udp_tag_set(udp_tag_t *tag, const char *str) +{ + g_assert(str != NULL); + g_assert(3 == strlen(str)); + + memcpy(tag->value, str, 3); +} + +/* + * Header sizes. + */ + +#define UDP_RELIABLE_HEADER_SIZE 8 /* Fragments, normal ACKs */ +#define UDP_RELIABLE_EXT_HEADER_SIZE 12 /* Extended ACKs */ + +/* + * Critical flags. + */ + +#define UDP_RF_DEFLATED 0x01 /* Payload is deflated */ +#define UDP_RF_ACKME 0x02 /* Packet must be acknowledged */ +#define UDP_RF_CRITICAL_MASK 0x0c /* These are undefined as of now */ + +/* + * Optional flags. + */ + +#define UDP_RF_IMPROVED_ACKS 0x10 /* For G2 only (native in Gnutella) */ +#define UDP_RF_CUMULATIVE_ACK 0x10 /* Cumulative acknowledgment */ +#define UDP_RF_EXTENDED_ACK 0x20 /* Extended acknowledgment */ + +static inline udp_tag_t +udp_reliable_header_get_tag(const void *data) +{ + udp_tag_t tag; + + memcpy(tag.value, data, 3); + return tag; +} + +static inline uint8 +udp_reliable_header_get_flags(const void *data) +{ + const uint8 *u8 = data; + return u83; +} + +static inline uint16 +udp_reliable_header_get_seqno(const void *data) +{ + const uint8 *u8 = data; + return peek_be16(&u84); +} + +static inline uint8 +udp_reliable_header_get_part(const void *data) +{ + const uint8 *u8 = data; + return u86; +} + +static inline uint8 +udp_reliable_header_get_count(const void *data) +{ + const uint8 *u8 = data; + return u87; +} + +static inline bool +udp_reliable_is_ack(const void *data) +{ + const uint8 *u8 = data; + return 0 == u87; +} + +static inline bool +udp_reliable_is_extended_ack(const void *data) +{ + const uint8 *u8 = data; + return (u83 & UDP_RF_EXTENDED_ACK) && 0 == u87; +} + +static inline uint8 +udp_reliable_get_received(const void *data) +{ + const uint8 *u8 = data; + g_assert(udp_reliable_is_extended_ack(data)); + return u88; +} + +static inline uint32 +udp_reliable_get_missing(const void *data) +{ + const uint8 *u8 = data; + g_assert(udp_reliable_is_extended_ack(data)); + return peek_be32(&u88) & 0x00ffffff; /* Trailing 24 bits */ +} + +#endif /* _core_udp_reliable_h_ */ +
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/udp_sched.c
Added
@@ -0,0 +1,1035 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * UDP TX traffic scheduler. + * + * This layer schedules the sending of enqueued UDP datagrams in a LIFO + * manner according to available bandwidth. Packets are silently dropped + * when they become too old. + * + * Packets in the LIFO stack are also processed by destination address to avoid + * flooding the destination with too many packets: when an entry in the LIFO + * is processed, its destination is remembered and we skip other items to the + * same destination until we have processed all the queued items and bandwidth + * remains, at which time we go back to the top of the stack and resume. + * + * This layer stops accepting packets (i.e. it returns 0 on send() operations) + * when its amount buffered is 3 times the amount of data that can be sent per + * second. + * + * Scheduling of UDP packets is normally done once per second but in the advent + * all the bandwidth was not consumed, incoming packets are sent immediately + * until no more bandwidth is available, at which point we start queuing again. + * + * An scheduling queue is maintained by priority to send traffic ahead of any + * other less prioritary packets. This is typically used for acknowledgments, + * since delaying an ACK will likely cause retransmission on the other end. + * + * This layer is at the bottom of the TX stacks, but it can be used by several + * TX stacks which happen to have the same shared bandwidth pool. Therefore, + * each packet to send also remembers its TX stack origin (for callback + * processing, which need to get at the TX owner). + * + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#include "udp_sched.h" + +#include "bsched.h" +#include "inet.h" +#include "sockets.h" +#include "tx.h" +#include "tx_dgram.h" + +#include "lib/atoms.h" +#include "lib/eslist.h" +#include "lib/host_addr.h" +#include "lib/gnet_host.h" +#include "lib/hashing.h" +#include "lib/hashlist.h" +#include "lib/hset.h" +#include "lib/log.h" +#include "lib/palloc.h" +#include "lib/pmsg.h" +#include "lib/tm.h" +#include "lib/unsigned.h" +#include "lib/walloc.h" + +#include "if/gnet_property_priv.h" + +#include "lib/override.h" /* Must be the last header included */ + +#define UDP_SCHED_EXPIRE 5 /**< Seconds before expiring unsent messages */ +#define UDP_SCHED_FACTOR 3 /**< Stop when that many times the b/w queued */ + +#define udp_sched_log(lvl, fmt, ...) \ +G_STMT_START { \ + if G_UNLIKELY(GNET_PROPERTY(udp_sched_debug) >= (lvl)) \ + s_debug("%s: " fmt, G_STRFUNC, __VA_ARGS__); \ +} G_STMT_END + + +enum udp_sched_magic { UDP_SCHED_MAGIC = 0x23e00967 }; + +enum udp_sched_net { + UDP_SCHED_IPv4 = 0, + UDP_SCHED_IPv6 = 1, + + UDP_SCHED_NET_CNT +}; + +static const enum net_type udp_sched_net_typeUDP_SCHED_NET_CNT = { + NET_TYPE_IPV4, /* UDP_SCHED_IPv4 */ + NET_TYPE_IPV6, /* UDP_SCHED_IPv6 */ +}; + +/** + * The UDP TX scheduler object. + * + * Buffers to send are represented by a TX descriptor which are linked into + * the LIFO field. + * + * The TX stacks using us (i.e. the ones attaching us as the sending mechanism) + * are tracked so that we can trigger upper-level servicing when bandwidth + * becomes available again. + * + * Each time the UDP sockets (that the application makes available to actually + * send UDP datagrams) change, a call to udp_sched_update_sockets() is required + * to update the cached information. + */ +struct udp_sched { + enum udp_sched_magic magic; /**< Magic number */ + pool_t *txpool; /**< TX descriptor pool */ + bio_source_t *bioUDP_SCHED_NET_CNT; /**< Bandwidth-limited I/O source */ + udp_sched_socket_cb_t get_socket; /**< Get the UDP socket by net */ + eslist_t lifoPMSG_P_COUNT; /**< LIFO stacks of TX descriptors */ + eslist_t tx_released; /**< Deferred TX descriptor freeing */ + bsched_bws_t bws; /**< Bandwidth scheduler to use */ + hset_t *seen; /**< Remembers destinations processed */ + hash_list_t *stacks; /**< TX stacks using us */ + size_t buffered; /**< Amount buffered (regular + urgent) */ + unsigned used_all:1; /**< Set when all b/w was used */ + unsigned flow_controlled:1; /**< Whether we flow-controlled */ +}; + +static inline void +udp_sched_check(const struct udp_sched * const us) +{ + g_assert(us != NULL); + g_assert(UDP_SCHED_MAGIC == us->magic); +} + +enum udp_tx_desc_magic { UDP_TX_DESC_MAGIC = 0x66f40d1b }; + +/** + * A TX descriptor. + */ +struct udp_tx_desc { + enum udp_tx_desc_magic magic; /**< Magic number */ + pmsg_t *mb; /**< The message block to send */ + const gnet_host_t *to; /**< Destination address (atom) */ + const txdrv_t *tx; /**< TX stack origin */ + const struct tx_dgram_cb *cb; /**< Callback actions on datagram */ + slink_t lnk; /**< LIFO queue link */ + time_t expire; /**< Expiration time */ +}; + +static inline void +udp_tx_desc_check(const struct udp_tx_desc * const txd) +{ + g_assert(txd != NULL); + g_assert(UDP_TX_DESC_MAGIC == txd->magic); +} + +/** + * The TX stacks using us are remembered along with their "is_writable" + * callback routine so that we can trigger servicing. + */ +struct udp_tx_stack { + const txdrv_t *tx; + inputevt_handler_t writable; +}; + +static uint +udp_tx_stack_hash(const void *key) +{ + const struct udp_tx_stack *uts = key; + + return pointer_hash(uts->tx); +} + +static bool +udp_tx_stack_eq(const void *a, const void *b) +{ + const struct udp_tx_stack *ua = a, *ub = b; + + return ua->tx == ub->tx; +} + +/** + * Wrapper used by palloc() to allocate a new UDP TX descriptor. + */ +static void * +udp_tx_desc_alloc(size_t size) +{ + struct udp_tx_desc *txd; + + g_assert(sizeof *txd == size); + + WALLOC0(txd); + return txd; +} + +/** + * Wrapper used by pfree() to release a UDP TX descriptor. + */ +static void +udp_tx_desc_free(void *p, size_t size, bool fragment) +{ + struct udp_tx_desc *txd = p; + + g_assert(sizeof *txd == size); + (void) fragment; + + WFREE(txd); +} + +/** + * Release user data from TX descriptor, then return it to the pool. + */ +static void +udp_tx_desc_release(struct udp_tx_desc *txd, udp_sched_t *us) +{ + udp_tx_desc_check(txd); + udp_sched_check(us); + + pmsg_free_null(&txd->mb); + atom_host_free_null(&txd->to); + pfree(us->txpool, txd); +} + +/** + * Flag TX descriptor for release. + * + * During list iteration, one cannot free up the message block because the + * free routine attached to the mesasge block could decide to re-enqueue + * the unsent packet, which would modify the list we're iterating over. + * + * To avoid that problem, we link away the TX descriptor for later release. + * This works because the eslist iterators are immune to item freeing, meaning + * they don't re-inspect the link_t item after calling the callback. Hence + * we can safely update the link_t item. + */ +static void +udp_tx_desc_flag_release(struct udp_tx_desc *txd, udp_sched_t *us) +{ + udp_tx_desc_check(txd); + udp_sched_check(us); + + eslist_append(&us->tx_released, txd); +} + +/** + * Release message (eslist iterator). + * + * @return TRUE to force message to be removed from list. + */ +static bool +udp_tx_desc_reclaim(void *data, void *udata) +{ + struct udp_tx_desc *txd = data; + udp_sched_t *us = udata; + + udp_sched_check(us); + udp_tx_desc_check(txd); + g_assert(1 == pmsg_refcnt(txd->mb)); + + udp_tx_desc_release(txd, us); + return TRUE; +} + +/** + * Drop message (eslist iterator). + * + * @return TRUE to force message to be removed from list. + */ +static bool +udp_tx_desc_drop(void *data, void *udata) +{ + struct udp_tx_desc *txd = data; + udp_sched_t *us = udata; + + udp_sched_check(us); + udp_tx_desc_check(txd); + g_assert(1 == pmsg_refcnt(txd->mb)); + + us->buffered = size_saturate_sub(us->buffered, pmsg_size(txd->mb)); + udp_tx_desc_flag_release(txd, us); + return TRUE; +} + +/** + * Remove expired messages (eslist iterator). + * + * @return TRUE if message has expired and was freed up. + */ +static bool +udp_tx_desc_expired(void *data, void *udata) +{ + struct udp_tx_desc *txd = data; + udp_sched_t *us = udata; + + udp_sched_check(us); + udp_tx_desc_check(txd); + + if (delta_time(tm_time(), txd->expire) > 0) { + udp_sched_log(1, "%p: expiring mb=%p (%d bytes) prio=%u", + us, txd->mb, pmsg_size(txd->mb), pmsg_prio(txd->mb)); + + if (txd->cb->add_tx_dropped != NULL) + (*txd->cb->add_tx_dropped)(txd->tx->owner, 1); /* Dropped in TX */ + + return udp_tx_desc_drop(data, udata); /* Returns TRUE */ + } + + return FALSE; +} + +/** + * Forcefully drop all items in the specified list. + */ +static void +udp_sched_drop_all(udp_sched_t *us, eslist_t *list) +{ + eslist_foreach_remove(list, udp_tx_desc_drop, us); +} + +/** + * Log TX error if unusual. + * + * @return TRUE if the error was fatal, FALSE if it's a temporary error and + * the message needs to be enqueued. + */ +static bool +udp_sched_write_error(const udp_sched_t *us, const gnet_host_t *to, + const pmsg_t *mb, const char *func) +{ + (void) us; /* FIXME -- no longer used */ + + if (is_temporary_error(errno) || ENOBUFS == errno) + return FALSE; + + switch (errno) { + /* + * The following are probably due to bugs in the libc, but this is in + * the same vein as write() failing with -1 whereas errno == 0! Be more + * robust against bugs in the components we rely on. --RAM, 09/10/2003 + */ + case EINPROGRESS: /* Weird, but seen it -- RAM, 07/10/2003 */ + { + g_warning("%s(to=%s, len=%d) failed with weird errno = %m -- " + "assuming EAGAIN", func, gnet_host_to_string(to), pmsg_size(mb)); + } + break; + case EPIPE: + case ENOSPC: + case ENOMEM: + case EINVAL: /* Seen this with "reserved" IP addresses */ +#ifdef EDQUOT + case EDQUOT: +#endif /* EDQUOT */ + case EMSGSIZE: /* Message too large */ + case EFBIG: + case EIO: + case EADDRNOTAVAIL: + case ECONNABORTED: + case ECONNRESET: + case ECONNREFUSED: + case ENETRESET: + case ENETDOWN: + case ENETUNREACH: + case EHOSTDOWN: + case EHOSTUNREACH: + case ENOPROTOOPT: + case EPROTONOSUPPORT: + case ETIMEDOUT: + case EACCES: + case EPERM: + /* + * We don't care about lost packets. + */ + g_warning("%s(): UDP write of %d bytes to %s failed: %m", + func, pmsg_size(mb), gnet_host_to_string(to)); + break; + default: + g_critical("%s(): UDP write of %d bytes to %s failed " + "with unexpected errno %d: %m", + func, pmsg_size(mb), gnet_host_to_string(to), errno); + break; + } + + return TRUE; /* Fatal error */ +} + +/** + * Drop message that could not be sent. + * + * @param tx the TX stack sending the message + * @param cb callback actions on the datagram + * + * @return TRUE. + */ +static bool +udp_tx_drop(const txdrv_t *tx, const struct tx_dgram_cb *cb) +{ + if (cb->add_tx_dropped != NULL) + (*cb->add_tx_dropped)(tx->owner, 1); /* Dropped in TX */ + + return TRUE; +} + +/** + * Send message block to IP:port. + * + * @param us the UDP scheduler + * @param mb the message to send + * @param to the IP:port destination of the message + * @param tx the TX stack sending the message + * @param cb callback actions on the datagram + * + * @return TRUE if message was sent or dropped, FALSE if there is no more + * bandwidth to send anything. + */ +static bool +udp_sched_mb_sendto(udp_sched_t *us, pmsg_t *mb, const gnet_host_t *to, + const txdrv_t *tx, const struct tx_dgram_cb *cb) +{ + ssize_t r; + int len = pmsg_size(mb); + bio_source_t *bio = NULL; + + if (0 == gnet_host_get_port(to)) + return TRUE; + + /* + * Check whether message still needs to be sent. + */ + + if (!pmsg_hook_check(mb)) + return TRUE; /* Dropped */ + + /* + * Select the proper I/O source depending on the network address type. + */ + + switch (gnet_host_get_net(to)) { + case NET_TYPE_IPV4: + bio = us->bioUDP_SCHED_IPv4; + break; + case NET_TYPE_IPV6: + bio = us->bioUDP_SCHED_IPv6; + break; + case NET_TYPE_NONE: + case NET_TYPE_LOCAL: + g_assert_not_reached(); + } + + /* + * If there is no I/O source, then the socket to send that type of traffic + * was cleared, hence we simply need to discard the message. + */ + + if (NULL == bio) { + udp_sched_log(4, "%p: discarding mb=%p (%d bytes) to %s", + us, mb, pmsg_size(mb), gnet_host_to_string(to)); + return udp_tx_drop(tx, cb); /* TRUE, for "sent" */ + } + + /* + * OK, proceed if we have bandwidth. + */ + + r = bio_sendto(bio, to, pmsg_start(mb), len); + + if (r < 0) { /* Error, or no bandwidth */ + if (udp_sched_write_error(us, to, mb, G_STRFUNC)) { + udp_sched_log(4, "%p: dropped mb=%p (%d bytes): %m", + us, mb, pmsg_size(mb)); + return udp_tx_drop(tx, cb); /* TRUE, for "sent" */ + } + udp_sched_log(3, "%p: no bandwidth for mb=%p (%d bytes)", + us, mb, pmsg_size(mb)); + us->used_all = TRUE; + return FALSE; + } + + if (r != len) { + g_warning("%s: partial UDP write (%zd bytes) to %s " + "for %d-byte datagram", + G_STRFUNC, r, gnet_host_to_string(to), len); + } else { + udp_sched_log(5, "%p: sent mb=%p (%d bytes) prio=%u", + us, mb, pmsg_size(mb), pmsg_prio(mb)); + pmsg_mark_sent(mb); + if (cb->msg_account != NULL) + (*cb->msg_account)(tx->owner, mb); + + inet_udp_record_sent(gnet_host_get_addr(to)); + } + + return TRUE; /* Message sent */ +} + +/** + * Send message (eslist iterator callback). + * + * @return TRUE if message was sent and freed up. + */ +static bool +udp_tx_desc_send(void *data, void *udata) +{ + struct udp_tx_desc *txd = data; + udp_sched_t *us = udata; + unsigned prio; + + udp_sched_check(us); + udp_tx_desc_check(txd); + + if (us->used_all) + return FALSE; + + /* + * Avoid flushing consecutive queued messages to the same destination, + * for regular (non-prioritary) messages. + * + * This serves two purposes: + * + * 1- It makes sure one single host does not capture all the available + * outgoing bandwidth. + * + * 2- It somehow delays consecutive packets to a given host thereby reducing + * flooding and hopefully avoiding saturation of its RX flow. + */ + + prio = pmsg_prio(txd->mb); + + if (PMSG_P_DATA == prio && hset_contains(us->seen, txd->to)) { + udp_sched_log(2, "%p: skipping mb=%p (%d bytes) to %s", + us, txd->mb, pmsg_size(txd->mb), gnet_host_to_string(txd->to)); + return FALSE; + } + + if (udp_sched_mb_sendto(us, txd->mb, txd->to, txd->tx, txd->cb)) { + if (PMSG_P_DATA == prio && pmsg_was_sent(txd->mb)) + hset_insert(us->seen, atom_host_get(txd->to)); + } else { + return FALSE; /* Unsent, leave it in the queue */ + } + + us->buffered = size_saturate_sub(us->buffered, pmsg_size(txd->mb)); + udp_tx_desc_flag_release(txd, us); + return TRUE; +} + +/** + * @return b/w per second configured for the attached b/w scheduler. + */ +static ulong +udp_sched_bw_per_second(const udp_sched_t *us) +{ + uint i; + + for (i = 0; i < N_ITEMS(us->bio); i++) { + const bio_source_t *bio = us->bioi; + + if (bio != NULL) + return bio_bw_per_second(bio); + } + + return 0; /* No known I/O source, no bandwidth available */ +} + +/** + * Send datagram. + * + * @param us the UDP scheduler responsible for sending the datagram + * @param mb the message to send + * @param to the IP:port destination of the message + * @param tx the TX stack sending the message + * @param cb callback actions on the datagram + * + * @return 0 if message was unsent, length of message if sent, queued or + * dropped. + */ +size_t +udp_sched_send(udp_sched_t *us, pmsg_t *mb, const gnet_host_t *to, + const txdrv_t *tx, const struct tx_dgram_cb *cb) +{ + int len; + struct udp_tx_desc *txd; + uint prio; + + len = pmsg_size(mb); + + /* + * Try to send immediately if we have bandwidth. + */ + + if (!us->used_all && udp_sched_mb_sendto(us, mb, to, tx, cb)) + return len; /* Message "sent" */ + + /* + * If we already have enough data enqueued, flow-control the upper + * layer by acting as if we do not have enough bandwidth. + * + * However, we now always accept traffic sent with the highest priority + * since it is important to send those as soon as possible, i.e. ahead + * of any other pending data we would otherwise flush locally before + * servicing upper queues. + * --RAM, 2012-10-12 + */ + + prio = pmsg_prio(mb); + + if ( + PMSG_P_HIGHEST != prio && + us->buffered >= UDP_SCHED_FACTOR * udp_sched_bw_per_second(us) + ) { + udp_sched_log(1, "%p: flow-controlled", us); + us->flow_controlled = TRUE; + return 0; /* Flow control upper layers */ + } + + /* + * Message is going to be enqueued. + * + * However, from the upper layers (the message queue in particular), + * the message is considered as being sent, and therefore these layers + * are going to call pmsg_free() on the message. + * + * We do not want to pmsg_clone() the message because that would render + * uses of pmsg_was_sent() useless in free routines, and upper layers + * would think the message was dropped if they installed a free routine + * on the message. + * + * Hence we use pmsg_ref(). + */ + + txd = palloc(us->txpool); + txd->magic = UDP_TX_DESC_MAGIC; + txd->mb = pmsg_ref(mb); /* Take ownership of message */ + txd->to = atom_host_get(to); + txd->tx = tx; + txd->cb = cb; + txd->expire = time_advance(tm_time(), UDP_SCHED_EXPIRE); + + udp_sched_log(4, "%p: queuing mb=%p (%d bytes) prio=%u", + us, mb, pmsg_size(mb), pmsg_prio(mb)); + + /* + * The queue used is a LIFO to avoid buffering delaying all the messages. + * Since UDP traffic is unordered, it's better to send the most recent + * datagrams first, to reduce the perceived average latency. + */ + + g_assert(prio < N_ITEMS(us->lifo)); + eslist_prepend(&us->lifoprio, txd); + us->buffered = size_saturate_add(us->buffered, len); + + return len; /* Message queued, but tell upper layers it's sent */ +} + +/** + * Process LIFO queue, sending out messages until we have no more bandwidth. + */ +static void +udp_sched_process(udp_sched_t *us, eslist_t *list) +{ + udp_sched_check(us); + + eslist_foreach_remove(list, udp_tx_desc_send, us); +} + +/** + * Release host atom. + */ +static void +udp_seen_host_free(const void *data, void *udata) +{ + (void) udata; + + atom_host_free(data); +} + +/** + * Remove all entries in the "seen" hashed set. + */ +static void +udp_sched_seen_clear(udp_sched_t *us) +{ + udp_sched_check(us); + + hset_foreach(us->seen, udp_seen_host_free, NULL); + hset_clear(us->seen); +} + +/** + * Reclaim all pending TX descriptors. + */ +static void +udp_sched_tx_release(udp_sched_t *us) +{ + udp_sched_check(us); + + /* + * During reclaiming of TX descriptors, unsent messages may be re-queued + * if upper layers see that an important message which has not been + * sent is being freed up. + * + * This is why this reclaiming must be done outside of the regular + * iterators that process the different LIFOs to avoid updating them + * whilst they are traversed. + */ + + eslist_foreach_remove(&us->tx_released, udp_tx_desc_reclaim, us); +} + +struct udp_service_ctx { + int fd; + inputevt_cond_t cond; +}; + +/** + * Iterator callback to trigger TX stack servicing. + */ +static void +udp_sched_tx_service(void *data, void *udata) +{ + struct udp_tx_stack *uts = data; + struct udp_service_ctx *ctx = udata; + + udp_sched_log(4, "servicing TX=%p", uts->tx); + (*uts->writable)(deconstify_pointer(uts->tx), ctx->fd, ctx->cond); + udp_sched_log(4, "done for TX=%p", uts->tx); +} + +/** + * @return amount of pending (buffered) data. + */ +size_t +udp_sched_pending(const udp_sched_t *us) +{ + udp_sched_check(us); + + return us->buffered; +} + +/** + * @return the I/O source used by the scheduler. + */ +bio_source_t * +udp_sched_bio_source(const udp_sched_t *us, enum net_type net) +{ + udp_sched_check(us); + + switch (net) { + case NET_TYPE_IPV4: + return us->bioUDP_SCHED_IPv4; + case NET_TYPE_IPV6: + return us->bioUDP_SCHED_IPv6; + case NET_TYPE_NONE: + case NET_TYPE_LOCAL: + break; + } + + g_assert_not_reached(); +} + +/** + * Trigger TX stack servicing. + */ +static void +udp_sched_service(udp_sched_t *us, struct udp_service_ctx *ctx) +{ + udp_sched_check(us); + + udp_sched_log(4, "%p", us); + + /* + * We don't want to service the TX queues that attached to us in the same + * order to avoid nasty starving effects, hence rotate the list each time + * we service it. + */ + + hash_list_rotate_left(us->stacks); + hash_list_foreach(us->stacks, udp_sched_tx_service, ctx); +} + +/** + * Invoked each time a new bandwidth timeslice begins. + */ +static void +udp_sched_begin(void *data, int source, inputevt_cond_t cond) +{ + udp_sched_t *us = data; + unsigned i; + + udp_sched_check(us); + + udp_sched_log(4, "%p: starting, %zu bytes buffered", us, us->buffered); + udp_sched_log(5, "%p: messages queued: " + "data=%zu, control=%zu, urgent=%zu, highest=%zu", + us, eslist_count(&us->lifoPMSG_P_DATA), + eslist_count(&us->lifoPMSG_P_CONTROL), + eslist_count(&us->lifoPMSG_P_URGENT), + eslist_count(&us->lifoPMSG_P_HIGHEST)); + + /* + * Expire old traffic that we could not send. + */ + + for (i = 0; i < N_ITEMS(us->lifo); i++) { + eslist_foreach_remove(&us->lifoi, udp_tx_desc_expired, us); + } + + /* + * Schedule pending traffic in LIFO order (starting from head), + * processing the highest priority queue first. + */ + + us->used_all = FALSE; + + do { + udp_sched_seen_clear(us); + for (i = N_ITEMS(us->lifo); i != 0 && !us->used_all; i--) { + udp_sched_process(us, &us->lifoi-1); + } + udp_sched_tx_release(us); /* May re-queue traffic */ + udp_sched_log(5, "%p: loop tail: %zu bytes buffered, b/w %s", + us, us->buffered, us->used_all ? "gone" : "available"); + } while (!us->used_all && us->buffered != 0); + + /* + * If we did not use all the bandwidth yet and we flow-controlled + * upper layers, service them. + */ + + if (!us->used_all && us->flow_controlled) { + struct udp_service_ctx ctx; + + us->flow_controlled = FALSE; + ctx.fd = source; + ctx.cond = cond; + udp_sched_service(us, &ctx); + } + + udp_sched_log(4, "%p: done (b/w %s, %zu bytes buffered%s)", + us, us->used_all ? "gone" : "available", us->buffered, + us->flow_controlled ? ", flow-controlled" : ""); +} + +/** + * Clear the socket-related information in the UDP scheduler. + */ +static void +udp_sched_clear_sockets(udp_sched_t *us) +{ + uint i; + + for (i = 0; i < N_ITEMS(us->bio); i++) { + bio_source_t *bio = us->bioi; + + if (bio != NULL) { + bsched_source_remove(bio); + us->bioi = NULL; + } + } +} + +/** + * Update the socket-related information in the UDP scheduler. + */ +void +udp_sched_update_sockets(udp_sched_t *us) +{ + uint i; + bio_source_t *bio = NULL; + + udp_sched_clear_sockets(us); + + for (i = 0; i < N_ITEMS(us->bio); i++) { + gnutella_socket_t *s = (*us->get_socket)(udp_sched_net_typei); + + if (s != NULL) { + struct wrap_io *wio = &s->wio; + + wrap_io_check(wio); + g_assert(wio->sendto != NULL); + + us->bioi = bsched_source_add( + us->bws, wio, BIO_F_WRITE, NULL, NULL); + + if (NULL == bio) + bio = us->bioi; /* Remember first I/O source seen */ + } + } + + /* + * Make sure we are informed about the start of each bandwidth scheduling + * periods so that we may schedule data out and expire old data. + * + * We just need one of the IPv4 or IPv6 I/O source since they are linked + * to the same bandwidth scheduler. + */ + + if (bio != NULL) + bio_add_passive_callback(bio, udp_sched_begin, us); +} + +/** + * Creates a new UDP TX scheduling layer. + * + * The layer can be attached to multiple TX layers, which will then share + * the same bandwidth limitation. This is given by the "bws" parameter. + * + * The sockets are dynamically fetched, since the application can disable + * them and recreate them depending on dynamic user reconfiguration. + * + * @param bws the bandwidth scheduler used for output + * @param get_socket callback to get the UDP socket to write to + * + * @return a new scheduler. + */ +udp_sched_t * +udp_sched_make( + bsched_bws_t bws, udp_sched_socket_cb_t get_socket) +{ + udp_sched_t *us; + unsigned i; + + WALLOC0(us); + us->magic = UDP_SCHED_MAGIC; + us->txpool = pool_create("UDP TX descriptors", sizeof(struct udp_tx_desc), + udp_tx_desc_alloc, udp_tx_desc_free, NULL); + us->get_socket = get_socket; + us->bws = bws; + udp_sched_update_sockets(us); + for (i = 0; i < N_ITEMS(us->lifo); i++) { + eslist_init(&us->lifoi, offsetof(struct udp_tx_desc, lnk)); + } + eslist_init(&us->tx_released, offsetof(struct udp_tx_desc, lnk)); + us->seen = + hset_create_any(gnet_host_hash, gnet_host_hash2, gnet_host_equal); + us->stacks = hash_list_new(udp_tx_stack_hash, udp_tx_stack_eq); + + return us; +} + +/** + * Destroys the UDP TX scheduler, which must no longer be attached to anything. + */ +void +udp_sched_free(udp_sched_t *us) +{ + udp_sched_check(us); + unsigned i; + + /* + * TX stacks are asynchronously collected, so we need to force collection + * now to make sure nobody references us any longer. + */ + + tx_collect(); + + g_assert(0 == hash_list_length(us->stacks)); + + for (i = 0; i < N_ITEMS(us->lifo); i++) { + udp_sched_drop_all(us, &us->lifoi); + } + udp_sched_tx_release(us); + udp_sched_seen_clear(us); + pool_free(us->txpool); + hset_free_null(&us->seen); + hash_list_free(&us->stacks); + udp_sched_clear_sockets(us); + + us->magic = 0; + WFREE(us); +} + +/** + * Attach a UDP TX scheduling layer to a TX stack. + * + * @param us the UDP TX scheduler to use + * @param tx the TX driver attaching to the scheduler + * @param writable TX handler to invoke when we can write new data + */ +void +udp_sched_attach(udp_sched_t *us, const txdrv_t *tx, + inputevt_handler_t writable) +{ + struct udp_tx_stack key, *uts; + + udp_sched_check(us); + + key.tx = tx; + g_assert(!hash_list_contains(us->stacks, &key)); + + WALLOC(uts); + uts->tx = tx; + uts->writable = writable; + + hash_list_append(us->stacks, uts); +} + +/** + * Detach a UDP TX scheduling layer from a TX stack. + * + * @param us the UDP TX scheduler to detach from + * @param tx the TX driver detaching from the scheduler + */ +void +udp_sched_detach(udp_sched_t *us, const txdrv_t *tx) +{ + struct udp_tx_stack key, *uts; + const void *oldkey; + + udp_sched_check(us); + + key.tx = tx; + g_assert(hash_list_contains(us->stacks, &key)); + + hash_list_find(us->stacks, &key, &oldkey); + uts = deconstify_pointer(oldkey); + hash_list_remove(us->stacks, uts); + WFREE(uts); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/core/udp_sched.h
Added
@@ -0,0 +1,75 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * UDP TX scheduling. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _core_udp_sched_h_ +#define _core_udp_sched_h_ + +#include "common.h" +#include "tx.h" +#include "tx_dgram.h" + +#include "if/core/bsched.h" + +#include "lib/gnet_host.h" +#include "lib/host_addr.h" +#include "lib/inputevt.h" + +struct udp_sched; +typedef struct udp_sched udp_sched_t; + +struct bio_source; + +/** + * Callback invoked to get a socket for a given network type. + */ +typedef struct gnutella_socket *(*udp_sched_socket_cb_t)(enum net_type net); + +/* + * Public interface. + */ + +udp_sched_t *udp_sched_make(bsched_bws_t bws, udp_sched_socket_cb_t get_socket); +void udp_sched_update_sockets(udp_sched_t *us); +void udp_sched_free(udp_sched_t *us); +void udp_sched_attach(udp_sched_t *us, const txdrv_t *tx, + inputevt_handler_t writable); +void udp_sched_detach(udp_sched_t *us, const txdrv_t *tx); +size_t udp_sched_send(udp_sched_t *us, pmsg_t *mb, const gnet_host_t *to, + const txdrv_t *tx, const struct tx_dgram_cb *cb); +size_t udp_sched_pending(const udp_sched_t *us); +struct bio_source *udp_sched_bio_source(const udp_sched_t *us, enum net_type n); + +#endif /* _core_udp_sched_h_ */ + +/* vi: set ts=4 sw=4 cindent: */ +
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/uhc.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/uhc.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Raphael Manfredi + * Copyright (c) 2004, 2015 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,7 +28,7 @@ * UDP Host Cache. * * @author Raphael Manfredi - * @date 2004 + * @date 2004, 2015 */ #include "common.h" @@ -48,11 +48,15 @@ #include "lib/atoms.h" #include "lib/cq.h" #include "lib/endian.h" -#include "lib/glib-missing.h" -#include "lib/hashlist.h" #include "lib/halloc.h" +#include "lib/hashing.h" +#include "lib/hashlist.h" +#include "lib/mempcpy.h" #include "lib/parse.h" -#include "lib/random.h" +#include "lib/str.h" +#include "lib/shuffle.h" +#include "lib/stringify.h" +#include "lib/walloc.h" #include "if/gnet_property_priv.h" #include "if/bridge/c2ui.h" @@ -62,7 +66,7 @@ #define UHC_MAX_ATTEMPTS 3 /**< Maximum connection / resolution attempts */ #define UHC_TIMEOUT 20000 /**< Host cache timeout, milliseconds */ -#define UHC_RETRY_AFTER 3600 /**< Frequency of contacts for an UHC (secs) */ +#define UHC_RETRY_AFTER 180 /**< Frequency of contacts for an UHC (secs) */ /** * Request context, used when we decide to get hosts via the UDP host caches. @@ -75,7 +79,7 @@ cevent_t *timeout_ev; /**< Ping timeout */ int attempts; /**< Connection / resolution attempts */ host_addr_t addr; /**< Resolved IP address for host */ - guint16 port; /**< Port of selected host cache */ + uint16 port; /**< Port of selected host cache */ struct guid muid; /**< MUID of the ping */ } uhc_ctx; @@ -84,7 +88,7 @@ struct uhc { const char *host; /**< An UHC host as "<host>:<port>" (string atom) */ time_t stamp; /**< Timestamp of the last request */ - guint used; /**< How often have we tried to contact it */ + uint used; /**< How often have we tried to contact it */ }; /** @@ -96,15 +100,22 @@ #if defined(USE_LOCAL_UHC) { "localhost:6346" }, #else /* !USE_LOCAL_UHC */ - { "yin.cloud.bishopston.net:33558" }, + /* Crabs */ + { "useast.gnutella.dyslexicfish.net:3558" }, + { "uswest.gnutella.dyslexicfish.net:3558" }, + { "uk.gnutella.dyslexicfish.net:3558" }, + /* Peers */ + { "1.uhc.gtk-gnutella.nl:19104" }, { "uhc.gtk-gnutella.nl:15749" }, + { "useast.gnutella.dyslexicfish.net:19814" }, + { "uswest.gnutella.dyslexicfish.net:26562" }, + { "uk.gnutella.dyslexicfish.net:55577" }, #endif /* USE_LOCAL_UHC */ }; -static gboolean uhc_connecting = FALSE; +static bool uhc_connecting = FALSE; -static void uhc_host_resolved(const host_addr_t *addr, size_t n, - gpointer uu_udata); +static void uhc_host_resolved(const host_addr_t *addr, size_t n, void *udata); static void uhc_send_ping(void); /** @@ -116,15 +127,15 @@ * * @return TRUE if we successfully parsed the string. */ -static gboolean -uhc_get_host_port(const char *hp, const char **host, guint16 *port) +static bool +uhc_get_host_port(const char *hp, const char **host, uint16 *port) { static char hostnameMAX_HOSTLEN + 1; const char *ep; - guint32 u; + uint32 u; int error; size_t len; - + char *p; g_assert(hp); g_assert(host); @@ -140,8 +151,8 @@ len = ep - hp; if (len >= sizeof hostname) return FALSE; - memcpy(hostname, hp, len); - hostnamelen = '\0'; + p = mempcpy(hostname, hp, len); + *p = '\0'; g_assert(':' == *ep); ep++; @@ -159,39 +170,36 @@ static struct uhc * uhc_new(const char *host) { - static const struct uhc zero_uhc; struct uhc *uhc; - g_assert(host); - uhc = g_malloc(sizeof *uhc); - *uhc = zero_uhc; + g_assert(host != NULL); + + WALLOC0(uhc); uhc->host = atom_str_get(host); - uhc->stamp = 0; - uhc->used = 0; return uhc; } static void uhc_free(struct uhc **ptr) { - if (*ptr) { + if (*ptr) { struct uhc *uu = *ptr; atom_str_free_null(&uu->host); - G_FREE_NULL(uu); + WFREE(uu); *ptr = NULL; } } -static guint -uhc_hash(gconstpointer key) +static uint +uhc_hash(const void *key) { const struct uhc *uhc = key; - return g_str_hash(uhc->host); + return string_mix_hash(uhc->host); } static int -uhc_equal(gconstpointer p, gconstpointer q) +uhc_equal(const void *p, const void *q) { const struct uhc *a = p, *b = q; @@ -200,7 +208,7 @@ static void -uhc_list_add(const char *host) +uhc_list_append(const char *host) { struct uhc *uhc; @@ -214,13 +222,9 @@ } if (GNET_PROPERTY(bootstrap_debug) > 1) - g_debug("Adding UHC %s", host); - - if (random_value(100) < 50) { - hash_list_append(uhc_list, uhc); - } else { - hash_list_prepend(uhc_list, uhc); - } + g_debug("adding UHC %s", host); + + hash_list_append(uhc_list, uhc); } /** @@ -232,12 +236,14 @@ struct uhc *uhc; char *host; time_t now; + size_t n; g_return_val_if_fail(uhc_list, NULL); - + now = tm_time(); - uhc = hash_list_head(uhc_list); - if (NULL == uhc) + + n = hash_list_count(uhc_list); + if (0 == n) return NULL; /* @@ -247,9 +253,21 @@ * If we come here, it's because we're lacking hosts for establishing * a Gnutella connection, after we exhausted our caches. */ - if (uhc->stamp && delta_time(now, uhc->stamp) < UHC_RETRY_AFTER) - return NULL; + while (n-- != 0) { + uhc = hash_list_head(uhc_list); + + g_assert(uhc != NULL); /* We computed count on entry */ + + if (delta_time(now, uhc->stamp) >= UHC_RETRY_AFTER) + goto found; + + hash_list_moveto_tail(uhc_list, uhc); + } + + return NULL; + +found: uhc->stamp = now; host = h_strdup(uhc->host); @@ -269,10 +287,10 @@ * * @return TRUE if OK. */ -static gboolean +static bool uhc_pick(void) { - gboolean success = FALSE; + bool success = FALSE; char *uhc; uhc = uhc_get_next(); @@ -294,7 +312,7 @@ { char msg256; - gm_snprintf(msg, sizeof msg, _("Looking for UDP host cache %s"), uhc); + str_bprintf(msg, sizeof msg, _("Looking for UDP host cache %s"), uhc); gcu_statusbar_message(msg); } success = TRUE; @@ -305,10 +323,10 @@ } /** - * Try a random host cache. + * Try with next host in the (already shuffled) list. */ static void -uhc_try_random(void) +uhc_try_next(void) { host_addr_t addr; @@ -327,7 +345,7 @@ if (string_to_host_addr(uhc_ctx.host, NULL, &addr)) { uhc_ctx.addr = addr; - + if (GNET_PROPERTY(bootstrap_debug)) g_debug("BOOT UDP host cache \"%s\"", uhc_ctx.host); @@ -343,17 +361,16 @@ * get a reply within the specified timeout. */ static void -uhc_ping_timeout(cqueue_t *unused_cq, gpointer unused_obj) +uhc_ping_timeout(cqueue_t *cq, void *unused_obj) { - (void) unused_cq; (void) unused_obj; if (GNET_PROPERTY(bootstrap_debug)) g_warning("no reply from UDP host cache %s:%u", uhc_ctx.host, uhc_ctx.port); - uhc_ctx.timeout_ev = NULL; - uhc_try_random(); + cq_zero(cq, &uhc_ctx.timeout_ev); + uhc_try_next(); } /** @@ -364,20 +381,22 @@ { g_assert(uhc_connecting); - guid_random_muid(&uhc_ctx.muid); + guid_random_muid(&uhc_ctx.muid); if (udp_send_ping(&uhc_ctx.muid, uhc_ctx.addr, uhc_ctx.port, TRUE)) { - if (GNET_PROPERTY(bootstrap_debug)) - g_debug("BOOT sent UDP SCP ping %s to %s:%u", + if (GNET_PROPERTY(bootstrap_debug) || GNET_PROPERTY(log_uhc_pings_tx)) { + g_debug("BOOT sent UDP SCP ping #%s to %s:%u", guid_hex_str(&uhc_ctx.muid), uhc_ctx.host, uhc_ctx.port); + } + /* * Give GUI feedback. */ { char msg256; - gm_snprintf(msg, sizeof msg, + str_bprintf(msg, sizeof msg, _("Sent ping to UDP host cache %s:%u"), uhc_ctx.host, uhc_ctx.port); gcu_statusbar_message(msg); @@ -395,6 +414,7 @@ } else { g_warning("BOOT failed to send UDP SCP to %s", host_addr_port_to_string(uhc_ctx.addr, uhc_ctx.port)); + uhc_try_next(); } } @@ -402,7 +422,7 @@ * Callback for adns_resolve(), invoked when the resolution is complete. */ static void -uhc_host_resolved(const host_addr_t *addrs, size_t n, gpointer uu_udata) +uhc_host_resolved(const host_addr_t *addrs, size_t n, void *uu_udata) { (void) uu_udata; g_assert(addrs); @@ -416,42 +436,64 @@ g_warning("could not resolve UDP host cache \"%s\"", uhc_ctx.host); - uhc_try_random(); + uhc_try_next(); return; } - if (n > 1) - { + if (n > 1) { size_t i; - /* Current uhc was moved to tail by uhc_get_next */ + host_addr_t *hav; + /* Current UHC was moved to tail by uhc_get_next() */ struct uhc *uhc = hash_list_tail(uhc_list); - + /* * UHC resolved to multiple endpoints. Could be roundrobbin or - * IPv4 and IPv6 address. Adding them as seperate entries if the IPv6 is - * unreachable we might be retrying the IPv6 over and over again, there - * is no garantee that the random_u32() above will eventually pick - * the IPv4 address. - * -- JA 24/7/2011 + * IPv4 and IPv6 addresss. Adding them as seperate entries: if the + * IPv6 is unreachable we have an opportunity to skip it. + * -- JA 24/7/2011 + * + * Shuffle the address array before appending them to the UHC list. + * --RAM, 2015-10-01 */ - for(i = 0; i < n; i++) { - const char *host = host_addr_port_to_string(addrsi, uhc_ctx.port); - g_debug("BOOT UDP host cache \"%s\" resolved to %s", - uhc_ctx.host, host); - - uhc_list_add(host); + + hav = HCOPY_ARRAY(addrs, n); + SHUFFLE_ARRAY_N(hav, n); + + for (i = 0; i < n; i++) { + const char *host = host_addr_port_to_string(havi, uhc_ctx.port); + g_debug("BOOT UDP host cache \"%s\" resolved to %s (#%zu)", + uhc_ctx.host, host, i + 1); + + uhc_list_append(host); } - - hash_list_remove(uhc_list, uhc); - - uhc_try_random(); - - return; + + hash_list_remove(uhc_list, uhc); /* Replaced by IP address list */ + uhc_free(&uhc); + + /* + * We're going to continue and process the first address (in our + * shuffled array). Make sure it is put at the end of the list + * and marked as being used, mimicing what uhc_get_next() would do. + * --RAM, 2015-10-01 + */ + + { + struct uhc key; + + key.host = host_addr_port_to_string(hav0, uhc_ctx.port); + uhc = hash_list_lookup(uhc_list, &key); + g_assert(uhc != NULL); /* We added the entry above! */ + uhc->stamp = tm_time(); + uhc->used++; + hash_list_moveto_tail(uhc_list, uhc); + } + + uhc_ctx.addr = hav0; /* Struct copy */ + HFREE_NULL(hav); + } else { + uhc_ctx.addr = addrs0; } - - uhc_ctx.addr = addrs0; - if (GNET_PROPERTY(bootstrap_debug)) g_debug("BOOT UDP host cache \"%s\" resolved to %s", uhc_ctx.host, host_addr_to_string(uhc_ctx.addr)); @@ -467,7 +509,7 @@ /** * Check whether we're waiting for some UDP host cache pongs. */ -gboolean +bool uhc_is_waiting(void) { return uhc_connecting; @@ -505,10 +547,10 @@ g_assert(uhc_ctx.timeout_ev == NULL); /* - * Pick a random host. + * Pick next host. */ - uhc_try_random(); + uhc_try_next(); } /** @@ -527,13 +569,13 @@ cnt = paylen / len; if (GNET_PROPERTY(bootstrap_debug)) - g_debug("extracting %d host%s in UDP IPP pong %s from %s", - cnt, cnt == 1 ? "" : "s", + g_debug("extracting %d host%s in UDP IPP pong #%s from %s", + cnt, plural(cnt), guid_hex_str(gnutella_header_get_muid(&n->header)), node_addr(n)); for (i = 0, p = payload; i < cnt; i++, p = const_ptr_add_offset(p, len)) { host_addr_t ha; - guint16 port; + uint16 port; host_ip_port_peek(p, type, &ha, &port); hcache_add_caught(HOST_ULTRA, ha, port, "UDP-HC"); @@ -559,7 +601,7 @@ if (GNET_PROPERTY(bootstrap_debug)) { g_debug("BOOT UDP cache \"%s\" replied: got %d host%s from %s", - uhc_ctx.host, cnt, cnt == 1 ? "" : "s", node_addr(n)); + uhc_ctx.host, cnt, plural(cnt), node_addr(n)); } /* @@ -572,7 +614,7 @@ cq_cancel(&uhc_ctx.timeout_ev); uhc_connecting = FALSE; - gm_snprintf(msg, sizeof(msg), + str_bprintf(msg, sizeof(msg), NG_("Got %d host from UDP host cache %s", "Got %d hosts from UDP host cache %s", cnt), @@ -580,24 +622,24 @@ gcu_statusbar_message(msg); } else { - uhc_try_random(); + uhc_try_next(); } } /** * Initializations. */ -G_GNUC_COLD void +void G_COLD uhc_init(void) { - guint i; + uint i; g_return_if_fail(NULL == uhc_list); uhc_list = hash_list_new(uhc_hash, uhc_equal); - for (i = 0; i < G_N_ELEMENTS(boot_hosts); i++) { + for (i = 0; i < N_ITEMS(boot_hosts); i++) { const char *host, *ep, *uhc; - guint16 port; + uint16 port; uhc = boot_hostsi.uhc; @@ -610,14 +652,16 @@ g_assert(NULL != ep); g_assert(':' == ep0); - uhc_list_add(uhc); + uhc_list_append(uhc); } + + hash_list_shuffle(uhc_list); } /** * Cleanup during process termination. */ -G_GNUC_COLD void +void G_COLD uhc_close(void) { cq_cancel(&uhc_ctx.timeout_ev);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/uhc.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/uhc.h
Changed
@@ -48,7 +48,7 @@ void uhc_close(void); void uhc_get_hosts(void); -gboolean uhc_is_waiting(void); +bool uhc_is_waiting(void); void uhc_ipp_extract( struct gnutella_node *n, const char *payload, int paylen, enum net_type nt);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/upload_stats.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/upload_stats.c
Changed
@@ -58,11 +58,13 @@ #include "if/bridge/c2ui.h" -#include "lib/atoms.h" #include "lib/ascii.h" +#include "lib/atoms.h" #include "lib/file.h" #include "lib/halloc.h" +#include "lib/hashing.h" #include "lib/hashlist.h" +#include "lib/hikset.h" #include "lib/parse.h" #include "lib/stringify.h" #include "lib/timestamp.h" @@ -77,12 +79,12 @@ static const char ul_stats_file = "upload_stats"; static const char ul_stats_what = "upload statistics"; -static gboolean dirty = FALSE; +static bool dirty = FALSE; static hash_list_t *upload_stats_list; -static GHashTable *upload_stats_by_sha1; +static hikset_t *upload_stats_by_sha1; -static gboolean -ul_stats_eq(gconstpointer p, gconstpointer q) +static bool +ul_stats_eq(const void *p, const void *q) { const struct ul_stats *a = p, *b = q; @@ -90,12 +92,13 @@ return a->pathname == b->pathname && a->size == b->size; } -static guint -ul_stats_hash(gconstpointer p) +static uint +ul_stats_hash(const void *p) { const struct ul_stats *s = p; - - return g_str_hash(s->pathname) ^ s->size; + + return hashing_mix32( + string_mix_hash(s->pathname) ^ integer_hash_fast(s->size)); } /** @@ -107,19 +110,19 @@ * and recorded as such. */ static struct ul_stats * -upload_stats_find(const struct sha1 *sha1, const char *pathname, guint64 size) +upload_stats_find(const struct sha1 *sha1, const char *pathname, uint64 size) { struct ul_stats *s = NULL; if (upload_stats_list) { static const struct ul_stats zero_stats; struct ul_stats key; - gconstpointer orig_key; + const void *orig_key; g_assert(upload_stats_by_sha1); if (sha1) { - s = g_hash_table_lookup(upload_stats_by_sha1, sha1); + s = hikset_lookup(upload_stats_by_sha1, sha1); if (s) goto done; /* Found it by SHA1 */ } @@ -129,7 +132,7 @@ key.size = size; if (hash_list_find(upload_stats_list, &key, &orig_key)) - s = deconstify_gpointer(orig_key); + s = deconstify_pointer(orig_key); atom_str_free_null(&key.pathname); if (s && sha1) { @@ -141,15 +144,15 @@ } else { /* SHA1 changed, file was modified */ struct ul_stats *old = - g_hash_table_lookup(upload_stats_by_sha1, s->sha1); + hikset_lookup(upload_stats_by_sha1, s->sha1); g_assert(old == s); /* Must be the same filename entry */ - g_hash_table_remove(upload_stats_by_sha1, s->sha1); + hikset_remove(upload_stats_by_sha1, s->sha1); atom_sha1_free(s->sha1); s->sha1 = atom_sha1_get(sha1); } - gm_hash_table_insert_const(upload_stats_by_sha1, s->sha1, s); + hikset_insert_key(upload_stats_by_sha1, &s->sha1); } } @@ -170,7 +173,7 @@ static void upload_stats_add(const char *pathname, filesize_t size, const char *name, - guint32 attempts, guint32 complete, guint64 ul_bytes, + uint32 attempts, uint32 complete, uint64 ul_bytes, time_t rtime, time_t dtime, const struct sha1 *sha1) { static const struct ul_stats zero_stats; @@ -195,24 +198,25 @@ if (!upload_stats_list) { g_assert(!upload_stats_by_sha1); upload_stats_list = hash_list_new(ul_stats_hash, ul_stats_eq); - upload_stats_by_sha1 = g_hash_table_new(sha1_hash, sha1_eq); + upload_stats_by_sha1 = hikset_create( + offsetof(struct ul_stats, sha1), HASH_KEY_FIXED, SHA1_RAW_SIZE); } hash_list_append(upload_stats_list, s); if (s->sha1) - gm_hash_table_insert_const(upload_stats_by_sha1, s->sha1, s); + hikset_insert_key(upload_stats_by_sha1, &s->sha1); gcu_upload_stats_gui_add(s); } -G_GNUC_COLD void +void G_COLD upload_stats_load_history(void) { FILE *upload_stats_file; file_path_t fp; char lineFILENAME_MAX + 64; - guint lineno = 0; + uint lineno = 0; gcu_upload_stats_gui_freeze(); - + file_path_set(&fp, settings_config_dir(), ul_stats_file); /* open file for reading */ @@ -253,7 +257,7 @@ item.pathname = line; for (i = 0; i < 8; i++) { - guint64 v; + uint64 v; int error; const char *endptr; @@ -268,7 +272,7 @@ /* We have a SHA1 or '*' if none known */ if ('*' != *p) { size_t len = clamp_strlen(p, SHA1_BASE32_SIZE); - + error = !parse_base32_sha1(p, len, &sha1_buf); item.sha1 = error ? NULL : &sha1_buf; } else { @@ -279,20 +283,22 @@ break; default: v = parse_uint64(p, &endptr, 10, &error); - p = deconstify_gchar(endptr); + p = deconstify_char(endptr); } if (error || !is_ascii_space(*endptr)) goto corrupted; +#define TIME(x) MIN((x) + (time_t) 0, TIME_T_MAX + (uint64) 0) + switch (i) { case 0: item.size = v; break; case 1: item.attempts = v; break; case 2: item.complete = v; break; - case 3: item.bytes_sent |= ((guint64) (guint32) v) << 32; break; - case 4: item.bytes_sent |= (guint32) v; break; - case 5: item.rtime = MIN(v + (time_t) 0, TIME_T_MAX + (guint64) 0); - case 6: item.dtime = MIN(v + (time_t) 0, TIME_T_MAX + (guint64) 0); + case 3: item.bytes_sent |= ((uint64) (uint32) v) << 32; break; + case 4: item.bytes_sent |= (uint32) v; break; + case 5: item.rtime = TIME(v); break; + case 6: item.dtime = TIME(v); break; case 7: break; /* Already stored above */ default: g_assert_not_reached(); @@ -300,7 +306,9 @@ } } - /* +#undef TIME + + /* * We store the filenames UTF-8 encoded but the file might have been * edited or corrupted. */ @@ -313,11 +321,11 @@ } if (upload_stats_find(NULL, item.pathname, item.size)) { - g_warning("upload_stats_load_history():" - " Ignoring line %u due to duplicate file.", lineno); + g_warning("%s(): ignoring line %u due to duplicate file.", + G_STRFUNC, lineno); } else if (upload_stats_find(item.sha1, item.pathname, item.size)) { - g_warning("upload_stats_load_history():" - " Ignoring line %u due to duplicate file.", lineno); + g_warning("%s(): ignoring line %u due to duplicate file.", + G_STRFUNC, lineno); } else { upload_stats_add(item.pathname, item.size, item.filename, item.attempts, item.complete, item.bytes_sent, @@ -338,9 +346,9 @@ } static void -upload_stats_dump_item(gpointer p, gpointer user_data) +upload_stats_dump_item(void *p, void *user_data) { - const shared_file_t *sf; + shared_file_t *sf; FILE *out = user_data; struct ul_stats *s = p; char rtime_bufTIME_T_DEC_BUFLEN; @@ -376,6 +384,7 @@ if (escaped != pathname) { /* File had escaped chars */ HFREE_NULL(escaped); } + shared_file_unref(&sf); } /** @@ -455,7 +464,7 @@ if (!sha1) return; /* File's SHA1 not known yet, nothing to do here */ - s = g_hash_table_lookup(upload_stats_by_sha1, sha1); + s = hikset_lookup(upload_stats_by_sha1, sha1); if (NULL == s) return; /* SHA1 not in stats, nothing to do */ @@ -520,7 +529,7 @@ static void upload_stats_file_add( const shared_file_t *sf, - int comp, guint64 sent, gboolean update_dtime) + int comp, uint64 sent, bool update_dtime) { const char *pathname = shared_file_path(sf); filesize_t size = shared_file_size(sf); @@ -592,13 +601,13 @@ { /* XXX */ /* for each row, get the filename, check if filename is ? */ - g_warning("upload_stats_prune_nonexistent: not implemented!"); + g_carp("%s(): not implemented!", G_STRFUNC); } /** * Clear all the upload stats data structure. */ -static G_GNUC_COLD void +static void G_COLD upload_stats_free_all(void) { if (upload_stats_list) { @@ -609,12 +618,12 @@ atom_str_free_null(&s->pathname); atom_str_free_null(&s->filename); if (s->sha1) - g_hash_table_remove(upload_stats_by_sha1, s->sha1); + hikset_remove(upload_stats_by_sha1, s->sha1); atom_sha1_free_null(&s->sha1); WFREE(s); } hash_list_free(&upload_stats_list); - gm_hash_table_destroy_null(&upload_stats_by_sha1); + hikset_free_null(&upload_stats_by_sha1); } dirty = TRUE; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/upload_stats.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/upload_stats.h
Changed
@@ -34,7 +34,7 @@ #ifndef _core_upload_stats_h_ #define _core_upload_stats_h_ -#include "common.h" +#include "common.h" struct shared_file;
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/uploads.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/uploads.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2001-2003, Raphael Manfredi + * Copyright (c) 2001-2003, 2015 Raphael Manfredi * Copyright (c) 2000 Daniel Walker (dwalker@cats.ucsc.edu) * *---------------------------------------------------------------------- @@ -43,7 +43,6 @@ #include "bsched.h" #include "dmesh.h" #include "features.h" -#include "file_object.h" #include "geo_ip.h" #include "ggep.h" #include "ggep_type.h" @@ -73,28 +72,36 @@ #include "gnet_stats.h" #include "ctl.h" +#include "g2/tree.h" + #include "if/gnet_property.h" #include "if/gnet_property_priv.h" #include "if/bridge/c2ui.h" #include "if/dht/dht.h" /* For dht_enabled() */ #include "lib/aging.h" +#include "lib/array_util.h" #include "lib/ascii.h" #include "lib/atoms.h" #include "lib/concat.h" #include "lib/cq.h" #include "lib/endian.h" +#include "lib/entropy.h" #include "lib/file.h" +#include "lib/file_object.h" #include "lib/getdate.h" #include "lib/getline.h" -#include "lib/glib-missing.h" #include "lib/halloc.h" +#include "lib/hashing.h" #include "lib/header.h" +#include "lib/htable.h" +#include "lib/http_range.h" #include "lib/idtable.h" #include "lib/iso3166.h" #include "lib/listener.h" #include "lib/parse.h" #include "lib/product.h" +#include "lib/pslist.h" #include "lib/str.h" #include "lib/stringify.h" #include "lib/strtok.h" @@ -110,7 +117,7 @@ #include "lib/override.h" /* Must be the last header included */ #define READ_BUF_SIZE (64 * 1024) /**< Read buffer size, if no sendfile(2) */ -#define BW_OUT_MIN 256 /**< Minimum bandwidth to enable uploads */ +#define BW_OUT_MIN 1024 /**< Minimum bandwidth to enable uploads */ #define IO_PRE_STALL 10 /**< Pre-stalling warning */ #define IO_RTT_STALL 15 /**< Watch for RTT larger than that */ #define IO_STALLED 30 /**< Stalling condition */ @@ -120,21 +127,24 @@ #define MAX_ERRORS 10 /**< Max # of errors before we close */ #define PUSH_REPLY_MAX 5 /**< Answer to up to 5 pushes per IP... */ #define PUSH_REPLY_FREQ 30 /**< ...in an interval of 30 secs */ +#define PUSH_BAN_FREQ 500 /**< 5-minute ban if cannot reach host */ #define ALT_LOC_SIZE 160 /**< Size of X-Alt under b/w pressure */ +#define UPLOAD_MAX_SINK (16 * 1024) /**< Maximum length of data to sink */ -static GSList *list_uploads; +static pslist_t *list_uploads; static watchdog_t *early_stall_wd; /**< Monitor early stalling events */ static watchdog_t *stall_wd; /**< Monitor stalling events */ /** Used to fall back to write() if sendfile() failed */ -static gboolean sendfile_failed = FALSE; +static bool sendfile_failed = FALSE; static idtable_t *upload_handle_map; static const char no_reason = "<no reason>"; /* Don't translate this */ +static const char ALLOW = "Allow: GET, HEAD\r\n"; static inline struct upload * -cast_to_upload(gpointer p) +cast_to_upload(void *p) { struct upload *u = p; upload_check(u); @@ -171,15 +181,16 @@ }; struct mesh_info_val { - guint32 stamp; /**< When we last sent the mesh */ + uint32 stamp; /**< When we last sent the mesh */ cevent_t *cq_ev; /**< Scheduled cleanup callout event */ }; /* Keep mesh info about uploaders for that long (unit: ms) */ #define MESH_INFO_TIMEOUT ((PARQ_MAX_UL_RETRY_DELAY + PARQ_GRACE_TIME)*1000) -static GHashTable *mesh_info; +static htable_t *mesh_info; static aging_table_t *push_requests; /**< Throttle push requests */ +static aging_table_t *push_conn_failed; /**< Throttle unreacheable hosts */ /* Remember IP address of stalling uploads for a while */ static aging_table_t *stalling_uploads; @@ -187,19 +198,20 @@ static const char stall_first = "stall first"; static const char stall_again = "stall again"; -#define STALL_FIRST (deconstify_gpointer(stall_first)) -#define STALL_AGAIN (deconstify_gpointer(stall_again)) +#define STALL_FIRST (deconstify_pointer(stall_first)) +#define STALL_AGAIN (deconstify_pointer(stall_again)) static void upload_request(struct upload *u, header_t *header); static void upload_error_remove(struct upload *u, - int code, const char *msg, ...) G_GNUC_PRINTF(3, 4); + int code, const char *msg, ...) G_PRINTF(3, 4); static void upload_error_remove_ext(struct upload *u, const char *extended, int code, - const char *msg, ...) G_GNUC_PRINTF(4, 5); -static void upload_writable(gpointer up, int source, inputevt_cond_t cond); -static void upload_special_writable(gpointer up); + const char *msg, ...) G_PRINTF(4, 5); +static void upload_writable(void *up, int source, inputevt_cond_t cond); +static void upload_special_writable(void *up); static void send_upload_error(struct upload *u, int code, - const char *msg, ...) G_GNUC_PRINTF(3, 4); + const char *msg, ...) G_PRINTF(3, 4); +static void upload_connect_conf(struct upload *u); /*** *** Callbacks @@ -294,25 +306,33 @@ WFREE(mik); } -static guint -mi_key_hash(gconstpointer key) +static uint +mi_key_hash(const void *key) { const struct mesh_info_key *mik = key; return sha1_hash(mik->sha1) ^ host_addr_hash(mik->addr); } +static uint +mi_key_hash2(const void *key) +{ + const struct mesh_info_key *mik = key; + + return binary_hash2(mik->sha1, SHA1_RAW_SIZE) ^ host_addr_hash2(mik->addr); +} + static int -mi_key_eq(gconstpointer a, gconstpointer b) +mi_key_eq(const void *a, const void *b) { const struct mesh_info_key *mika = a, *mikb = b; - return host_addr_equal(mika->addr, mikb->addr) && + return host_addr_equiv(mika->addr, mikb->addr) && sha1_eq(mika->sha1, mikb->sha1); } static struct mesh_info_val * -mi_val_make(guint32 stamp) +mi_val_make(uint32 stamp) { struct mesh_info_val *miv; @@ -336,10 +356,10 @@ * Hash table iterator callback. */ static void -mi_free_kv(gpointer key, gpointer value, gpointer unused_udata) +mi_free_kv(const void *key, void *value, void *unused_udata) { (void) unused_udata; - mi_key_free(key); + mi_key_free(deconstify_pointer(key)); mi_val_free(value); } @@ -347,16 +367,15 @@ * Callout queue callback invoked to clear the entry. */ static void -mi_clean(cqueue_t *unused_cq, gpointer obj) +mi_clean(cqueue_t *cq, void *obj) { struct mesh_info_key *mik = obj; struct mesh_info_val *miv; - gpointer key; - gpointer value; - gboolean found; + const void *key; + void *value; + bool found; - (void) unused_cq; - found = g_hash_table_lookup_extended(mesh_info, mik, &key, &value); + found = htable_lookup_extended(mesh_info, mik, &key, &value); miv = value; g_assert(found); @@ -367,8 +386,8 @@ g_debug("upload MESH info (%s/%s) discarded", host_addr_to_string(mik->addr), sha1_base32(mik->sha1)); - g_hash_table_remove(mesh_info, mik); - miv->cq_ev = NULL; + htable_remove(mesh_info, mik); + cq_zero(cq, &miv->cq_ev); mi_free_kv(key, value, NULL); } @@ -377,7 +396,7 @@ * If we don't remember sending it, return 0. * Always records `now' as the time we sent mesh information. */ -static guint32 +static uint32 mi_get_stamp(const host_addr_t addr, const struct sha1 *sha1, time_t now) { struct mesh_info_key mikey; @@ -387,7 +406,7 @@ mikey.addr = addr; mikey.sha1 = sha1; - miv = g_hash_table_lookup(mesh_info, &mikey); + miv = htable_lookup(mesh_info, &mikey); /* * If we have an entry, reschedule the cleanup in MESH_INFO_TIMEOUT. @@ -395,13 +414,13 @@ */ if (miv) { - guint32 oldstamp; + uint32 oldstamp; g_assert(miv->cq_ev); cq_resched(miv->cq_ev, MESH_INFO_TIMEOUT); oldstamp = miv->stamp; - miv->stamp = (guint32) now; + miv->stamp = (uint32) now; if (GNET_PROPERTY(upload_debug) > 4) g_debug("upload MESH info (%s/%s) has stamp=%u", @@ -415,14 +434,14 @@ */ mik = mi_key_make(addr, sha1); - miv = mi_val_make((guint32) now); + miv = mi_val_make((uint32) now); miv->cq_ev = cq_main_insert(MESH_INFO_TIMEOUT, mi_clean, mik); - g_hash_table_insert(mesh_info, mik, miv); + htable_insert(mesh_info, mik, miv); if (GNET_PROPERTY(upload_debug) > 4) g_debug("new upload MESH info (%s/%s) stamp=%u", - host_addr_to_string(addr), sha1_base32(sha1), (guint32) now); + host_addr_to_string(addr), sha1_base32(sha1), (uint32) now); return 0; /* Don't remember sending info about this file */ } @@ -430,7 +449,7 @@ /** * Can we use bio_sendfile()? */ -static inline gboolean +static inline bool use_sendfile(struct upload *u) { upload_check(u); @@ -457,7 +476,7 @@ host_addr_to_string_buf(u->addr, host, sizeof host); concat_strings(info, sizeof info, "<", host, " \'", upload_vendor_str(u), "\'>", - (void *) 0); + NULL_PTR); return info; } @@ -465,8 +484,8 @@ * This is a watchdog callback invoked when no early stalling connection has * been seen for the configured amount of time. */ -static gboolean -upload_no_more_early_stalling(watchdog_t *unused_wd, gpointer unused_obj) +static bool +upload_no_more_early_stalling(watchdog_t *unused_wd, void *unused_obj) { (void) unused_wd; (void) unused_obj; @@ -475,6 +494,8 @@ g_debug("UL end of upload early stalling condition"); } + entropy_harvest_time(); + /* * Allow the HTTP outgoing scheduler to use the stolen bandwidth again, * thereby being able to send more data. @@ -495,7 +516,8 @@ if (bws_uniform_allocation(BSCHED_BWS_OUT, FALSE)) { gnet_prop_set_boolean_val(PROP_UPLOADS_BW_UNIFORM, FALSE); if (GNET_PROPERTY(upload_debug)) { - g_warning("UL switched back to non-uniform HTTP ougoing bandwidth"); + g_warning("UL switched back to non-uniform HTTP " + "outgoing bandwidth"); } } @@ -508,8 +530,8 @@ * This is a watchdog callback invoked when no stalling connection has been * seen for the configured amount of time. */ -static gboolean -upload_no_more_stalling(watchdog_t *unused_wd, gpointer unused_obj) +static bool +upload_no_more_stalling(watchdog_t *unused_wd, void *unused_obj) { (void) unused_wd; (void) unused_obj; @@ -518,6 +540,8 @@ g_debug("UL end of upload stalling condition"); } + entropy_harvest_time(); + /* * Allow unused bandwidth to be stolen from the HTTP outgoing scheduler * since we are back to a healthy state. @@ -575,7 +599,7 @@ if (!bws_uniform_allocation(BSCHED_BWS_OUT, TRUE)) { gnet_prop_set_boolean_val(PROP_UPLOADS_BW_UNIFORM, TRUE); if (GNET_PROPERTY(upload_debug)) { - g_warning("UL switching to uniform HTTP ougoing bandwidth"); + g_warning("UL switching to uniform HTTP outgoing bandwidth"); } } } @@ -596,6 +620,8 @@ uint64_to_string(u->sent)); } + entropy_harvest_small(VARLEN(u), VARLEN(u->addr), VARLEN(u->reqnum), NULL); + upload_early_stall(); } @@ -629,6 +655,7 @@ g_warning("frequent stalling detected, using workarounds"); } gnet_prop_set_boolean_val(PROP_UPLOADS_STALLING, TRUE); + entropy_harvest_time(); } wd_kick(stall_wd); @@ -646,6 +673,8 @@ uint64_to_string(u->sent)); } + entropy_harvest_small(VARLEN(u), VARLEN(u->addr), NULL); + upload_stall(); } @@ -656,7 +685,7 @@ static void upload_large_followup_rtt(const struct upload *u, time_delta_t d) { - gboolean ignore = FALSE; + bool ignore = FALSE; /* * If IP has been stalling recently, then ignore. @@ -671,6 +700,8 @@ compact_time(d), u->reqnum, ignore ? " (IGNORED)" : ""); } + entropy_harvest_small(VARLEN(u), VARLEN(u->addr), NULL); + if (ignore) return; @@ -690,12 +721,12 @@ void upload_timer(time_t now) { - GSList *sl, *to_remove = NULL; + pslist_t *sl, *to_remove = NULL; time_delta_t timeout; - for (sl = list_uploads; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(list_uploads, sl) { struct upload *u = cast_to_upload(sl->data); - gboolean is_connecting; + bool is_connecting; if (UPLOAD_IS_COMPLETE(u)) continue; /* Complete, no timeout possible */ @@ -722,7 +753,7 @@ goto not_sending; /* Avoid deep nesting level */ if (delta_time(now, u->last_update) > IO_STALLED) { - gboolean skip = FALSE; + bool skip = FALSE; /* * Check whether we know about this IP. If we do, then it @@ -750,8 +781,8 @@ wd_kick(stall_wd); } } else { - gboolean skip = FALSE; - gpointer stall; + bool skip = FALSE; + void *stall; stall = aging_lookup_revitalise(stalling_uploads, &u->addr); skip = (stall == STALL_AGAIN); @@ -795,7 +826,7 @@ */ if (delta_time(now, u->last_update) > timeout) { - to_remove = g_slist_prepend(to_remove, u); + to_remove = pslist_prepend(to_remove, u); } else if (UPLOAD_IS_SENDING(u)) { if (delta_time(now, u->last_update) > IO_PRE_STALL) { if (socket_is_corked(u->socket)) { @@ -817,23 +848,24 @@ } } - for (sl = to_remove; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(to_remove, sl) { struct upload *u = cast_to_upload(sl->data); if (UPLOAD_IS_CONNECTING(u)) { if (u->status == GTA_UL_PUSH_RECEIVED || u->status == GTA_UL_QUEUE) - upload_remove(u, _("Connect back timeout")); + upload_remove(u, N_("Connect back timeout")); else if (UPLOAD_READING_HEADERS(u)) - upload_error_remove(u, 408, "Request timeout"); + upload_error_remove(u, 408, N_("Request timeout")); else - upload_remove(u, _("Timeout waiting for follow-up")); + upload_remove(u, N_("Timeout waiting for follow-up")); } else if (UPLOAD_IS_SENDING(u)) + /* Cannot use NG_ here because we can't pass a translated string */ upload_remove(u, "Data timeout after %s byte%s", - uint64_to_string(u->sent), u->sent == 1 ? "" : "s"); + uint64_to_string(u->sent), plural(u->sent)); else - upload_remove(u, _("Lifetime expired")); + upload_remove(u, N_("Lifetime expired")); } - g_slist_free(to_remove); + pslist_free(to_remove); } struct upload * @@ -861,10 +893,82 @@ } /** + * Callback invoked when socket is destroyed. + */ +static void +upload_socket_destroy(gnutella_socket_t *s, void *owner, const char *reason) +{ + struct upload *u = owner; + + upload_check(u); + g_assert(s == u->socket); + + upload_remove(u, "%s", reason); +} + +/** + * Callback invoked when socket is connected. + */ +static void +upload_socket_connected(gnutella_socket_t *s, void *owner) +{ + struct upload *u = owner; + + upload_check(u); + g_assert(s == u->socket); + + upload_connect_conf(u); +} + +/** + * Callback invoked when the socket connection failed. + */ +static void +upload_socket_connect_failed(gnutella_socket_t *s, void *owner, const char *err) +{ + struct upload *u = owner; + + upload_check(u); + g_assert(s == u->socket); + + /* + * Record the failing address so that we do not re-attempt to connect to + * that host for a while when we receive a PUSH request. + */ + + { + gnet_host_t to; + + gnet_host_set(&to, s->addr, s->port); + aging_insert(push_conn_failed, atom_host_get(&to), int_to_pointer(1)); + + if (GNET_PROPERTY(upload_debug)) { + g_warning("PUSH can't connect to %s", gnet_host_to_string(&to)); + } + } + + /* + * The socket_connection_failed() routine invoked us, and expects that we + * destroy the socket ourselves. + */ + + upload_remove(u, "%s", err); +} + +/** + * Socket-layer callbacks for uploads. + */ +static struct socket_ops upload_socket_ops = { + upload_socket_connect_failed, /* connect_failed */ + upload_socket_connected, /* connected */ + upload_socket_destroy, /* destroy */ +}; + +/** * Create a new upload structure, linked to a socket. */ struct upload * -upload_create(struct gnutella_socket *s, gboolean push) +upload_create(struct gnutella_socket *s, bool push) { struct upload *u; @@ -874,20 +978,20 @@ u->socket = s; u->addr = s->addr; u->country = gip_country(u->addr); - s->resource.upload = u; - u->push = push; u->status = push ? GTA_UL_PUSH_RECEIVED : GTA_UL_HEADERS; u->start_date = tm_time(); u->last_update = u->start_date; u->parq_status = FALSE; + socket_attach_ops(s, SOCK_TYPE_UPLOAD, &upload_socket_ops, u); + /* * Add the upload structure to the upload slist, so it's monitored * from now on within the main loop for timeouts. */ - list_uploads = g_slist_prepend(list_uploads, u); + list_uploads = pslist_prepend(list_uploads, u); /* * Add upload to the GUI @@ -909,22 +1013,27 @@ * currently prohibited. */ void -upload_send_giv(const host_addr_t addr, guint16 port, guint8 hops, guint8 ttl, - guint32 file_index, const char *file_name, guint32 flags) +upload_send_giv(const host_addr_t addr, uint16 port, uint8 hops, uint8 ttl, + uint32 file_index, const char *file_name, uint32 flags) { struct upload *u; struct gnutella_socket *s; + if (GNET_PROPERTY(net_buffer_shortage)) + return; + flags |= GNET_PROPERTY(tls_enforce) ? SOCK_F_TLS : 0; s = socket_connect(addr, port, SOCK_TYPE_UPLOAD, flags); if (!s) { if (GNET_PROPERTY(upload_debug)) g_warning( - "PUSH request (hops=%d, ttl=%d) dropped: can't connect to %s", - hops, ttl, host_addr_port_to_string(addr, port)); + "PUSH request (hops=%d, ttl=%d) dropped: can't connect to %s%s", + hops, ttl, (flags & SOCK_F_G2) ? "G2 " : "", + host_addr_port_to_string(addr, port)); return; } u = upload_create(s, TRUE); + u->g2 = booleanize(flags & SOCK_F_G2); u->file_index = file_index; u->name = atom_str_get(file_name); @@ -934,49 +1043,120 @@ } /** - * Called when we receive a Push request on Gnet. + * Called when we receive a Push request on Gnet or a /PUSH on G2. + * + * @param n the receiving node + * @param t for G2, the parsed message tree * * If it is not for us, discard it. * If we are the target, then connect back to the remote servent. */ void -handle_push_request(struct gnutella_node *n) +handle_push_request(gnutella_node_t *n, const g2_tree_t *t) { host_addr_t ha; - guint32 file_index, flags = 0; - guint16 port; + uint32 file_index, flags = 0; + uint16 port; const char *info; const char *file_name = "<invalid file index>"; int push_count; - /* Servent ID matches our GUID? */ - if (!guid_eq(n->data, GNET_PROPERTY(servent_guid))) - return; /* No: not for us */ + if (NODE_TALKS_G2(n)) { + const char *payload; + size_t plen; - /* - * We are the target of the push. - */ + /* + * On G2, there is no Gnutella header, so zero it to make sure we + * can safely reuse the code below which is shared with Gnutella + * processing. + */ - if (NODE_IS_UDP(n) && ctl_limit(n->addr, CTL_D_UDP | CTL_D_INCOMING)) { - gnet_stats_count_dropped(n, MSG_DROP_LIMIT); - return; - } + ZERO(&n->header); - /* - * Decode the message. - */ + /* + * Extract remote host information. + */ + + payload = g2_tree_node_payload(t, &plen); + + if (NULL == payload || plen < 6) + return; /* Invalid /PUSH message */ + + file_index = 0; + + if (plen >= 18) { + ha = host_addr_peek_ipv6(&payload0); + port = peek_le16(&payload16); + } else { + ha = host_addr_peek_ipv4(&payload0); + port = peek_le16(&payload4); + } + + /* + * Verify the packet was indeed targeted to us: + * + * If it has a /?/TO child, it must bear our GUID. + * Otherwise if it comes from UDP, it must have a matching address + * to connect back to. + */ + + payload = g2_tree_payload(t, "TO", &plen); + + if (NULL == payload || plen < GUID_RAW_SIZE) { + if (!NODE_IS_UDP(n)) + return; /* No GUID, coming from TCP */ + if (!host_addr_equiv(n->addr, ha)) + return; /* Mismatching remote address */ + } else { + if (!guid_eq(payload, GNET_PROPERTY(servent_guid))) + return; /* Mismatching GUID */ + } + + /* + * Setup G2 flags and see whether they support TLS connections. + */ + + flags = SOCK_F_G2; - info = &n->dataGUID_RAW_SIZE; /* Start of file information */ + if (NULL != g2_tree_lookup(t, "TLS")) + flags |= SOCK_F_TLS; + } else { + /* Servent ID matches our GUID? */ + if (!guid_eq(n->data, GNET_PROPERTY(servent_guid))) + return; /* No: not for us */ + + /* + * We are the target of the push. + */ - file_index = peek_le32(&info0); - ha = host_addr_peek_ipv4(&info4); - port = peek_le16(&info8); + if (NODE_IS_UDP(n) && ctl_limit(n->addr, CTL_D_UDP | CTL_D_INCOMING)) { + gnet_stats_count_dropped(n, MSG_DROP_LIMIT); + return; + } + + /* + * Decode the message. + */ + + info = &n->dataGUID_RAW_SIZE; /* Start of file information */ + + file_index = peek_le32(&info0); + ha = host_addr_peek_ipv4(&info4); + port = peek_le16(&info8); + } if (ctl_limit(ha, CTL_D_INCOMING)) { gnet_stats_count_dropped(n, MSG_DROP_LIMIT); return; } + if (NODE_TALKS_G2(n)) + goto connect_to_host; + + /* + * Gnutella message, parse GGEP extensions if any. + */ + if (n->size > sizeof(gnutella_push_request_t)) { extvec_t exvMAX_EXTVEC; int exvcnt; @@ -1025,7 +1205,7 @@ size_t paylen = ext_paylen(e); g_warning("%s (PUSH): unhandled GGEP \"%s\" (%zu byte%s)", gmsg_node_infostr(n), ext_ggep_id_str(e), - paylen, paylen == 1 ? "" : "s"); + paylen, plural(paylen)); } break; } @@ -1051,7 +1231,7 @@ gnutella_header_get_hops(&n->header), gnutella_header_get_ttl(&n->header)); } else { - const shared_file_t *req_file; + shared_file_t *req_file; req_file = shared_file(file_index); if (req_file == SHARE_REBUILDING) { @@ -1072,8 +1252,11 @@ } else { file_name = shared_file_name_nfc(req_file); } + shared_file_unref(&req_file); } +connect_to_host: + /* * XXX might be run inside corporations (private IPs), must be smarter. * XXX maybe a configuration variable? --RAM, 31/12/2001 @@ -1094,6 +1277,30 @@ } /* + * Protect from incoming PUSH listng an IP:port that we cannot connect to. + */ + + { + gnet_host_t to; + + gnet_host_set(&to, ha, port); + + if (aging_lookup(push_conn_failed, &to)) { + if (GNET_PROPERTY(upload_debug)) { + time_delta_t age = aging_age(push_conn_failed, &to); + g_warning("PUSH (hops=%d, ttl=%d) " + "skipping %s%s (unreacheable, since %ld sec%s): %s", + gnutella_header_get_hops(&n->header), + gnutella_header_get_ttl(&n->header), + NODE_TALKS_G2(n) ? "G2 " : "", + host_addr_port_to_string(ha, port), + (long) age, plural(age), file_name); + } + return; + } + } + + /* * Protect from PUSH flood: since each push requires us to connect * back, it uses resources and could be used to conduct a subtle denial * of service attack. -- RAM, 03/11/2002 @@ -1103,11 +1310,13 @@ if (push_count >= PUSH_REPLY_MAX) { if (GNET_PROPERTY(upload_debug)) { - g_warning("PUSH (hops=%d, ttl=%d) throttling callback to %s: %s", + g_warning("PUSH (hops=%d, ttl=%d) throttling callback to %s%s: %s", gnutella_header_get_hops(&n->header), gnutella_header_get_ttl(&n->header), + NODE_TALKS_G2(n) ? "G2 " : "", host_addr_port_to_string(ha, port), file_name); } + gnet_stats_inc_general(GNR_REMOTE_PUSH_THROTTLED); return; } @@ -1119,9 +1328,10 @@ */ if (GNET_PROPERTY(upload_debug) > 3) - g_debug("PUSH (hops=%d, ttl=%d) to %s: %s", + g_debug("PUSH (hops=%d, ttl=%d) to %s%s: %s", gnutella_header_get_hops(&n->header), gnutella_header_get_ttl(&n->header), + NODE_TALKS_G2(n) ? "G2 " : "", host_addr_port_to_string(ha, port), file_name); @@ -1183,16 +1393,13 @@ * Close the socket at last because update_poll_event() needs a valid fd * and some of the above may cause a close(u->socket->fd). */ - if (u->socket != NULL) { - g_assert(u->socket->resource.upload == u); - socket_free_null(&u->socket); - } + socket_free_null(&u->socket); shared_file_unref(&u->sf); shared_file_unref(&u->thex); HFREE_NULL(u->request); upload_free_handle(u->upload_handle); - list_uploads = g_slist_remove(list_uploads, u); + list_uploads = pslist_remove(list_uploads, u); upload_free(&u); } @@ -1209,10 +1416,12 @@ upload_clone(struct upload *u) { struct upload *cu; - gboolean within_error = FALSE; + bool within_error = FALSE; upload_check(u); + entropy_harvest_time(); + if (u->io_opaque) { /* Was cloned after error sending, not during transfer */ within_error = TRUE; @@ -1233,7 +1442,6 @@ cu->sf = NULL; /* File re-opened each time */ cu->file = NULL; /* File re-opened each time */ cu->sendfile_ctx.map = NULL; /* File re-opened each time */ - cu->socket->resource.upload = cu; /* Takes ownership of socket */ cu->accounted = FALSE; cu->browse_host = FALSE; cu->skip = 0; @@ -1241,6 +1449,8 @@ cu->sent = 0; cu->hevcnt = 0; + socket_change_owner(cu->socket, cu); /* Takes ownership of socket */ + /* * This information is required to have proper GUI information displayed * on the error line (when we get cloned after an error, the parent will @@ -1277,7 +1487,7 @@ * from now on within the main loop for timeouts. */ - list_uploads = g_slist_prepend(list_uploads, cu); + list_uploads = pslist_prepend(list_uploads, cu); /* * Add upload to the GUI @@ -1290,7 +1500,7 @@ /** * Check whether the request was likely made from a browser. */ -static gboolean +static bool upload_likely_from_browser(const header_t *header) { char *buf; @@ -1332,9 +1542,9 @@ * * @return TRUE if we were able to send everything, FALSE otherwise */ -static gboolean +static bool upload_send_http_status(struct upload *u, - gboolean keep_alive, int code, const char *msg) + bool keep_alive, int code, const char *msg) { upload_check(u); g_assert(msg); @@ -1343,7 +1553,7 @@ socket_set_quickack(u->socket, FALSE); /* Re-disable quick TCP ACKs */ if (u->flags & UPLOAD_F_LIMITED) { - send_upload_error(u, 403, "Unauthorized"); + send_upload_error(u, 403, N_("Unauthorized")); return TRUE; } @@ -1357,10 +1567,10 @@ */ static size_t upload_http_xhost_add(char *buf, size_t size, - gpointer unused_arg, guint32 unused_flags) + void *unused_arg, uint32 unused_flags) { host_addr_t addr; - guint16 port; + uint16 port; size_t len; (void) unused_arg; @@ -1373,14 +1583,14 @@ if (host_is_valid(addr, port)) { len = concat_strings(buf, size, "X-Host: ", host_addr_port_to_string(addr, port), "\r\n", - (void *) 0); + NULL_PTR); } else { len = 0; } if (len >= size && GNET_PROPERTY(upload_debug)) { g_warning("U/L cannot send X-Host header back: only %u byte%s left", - (unsigned) size, 1 == size ? "" : "s"); + (unsigned) size, plural(size)); } return len < size ? len : 0; @@ -1396,7 +1606,7 @@ */ static size_t upload_xfeatures_add(char *buf, size_t size, - gpointer unused_arg, guint32 unused_flags) + void *unused_arg, uint32 unused_flags) { size_t rw = 0; @@ -1417,8 +1627,7 @@ * @return length of generated content */ static size_t -upload_xguid_add(char *buf, size_t size, - gpointer arg, guint32 flags) +upload_xguid_add(char *buf, size_t size, void *arg, uint32 flags) { size_t rw; guid_t guid; @@ -1454,11 +1663,11 @@ rw = concat_strings(buf, size, "X-GUID: ", guid_hex_str(&guid), "\r\n", - (void *) 0); + NULL_PTR); if (rw >= size && GNET_PROPERTY(upload_debug)) { g_warning("U/L cannot send X-GUID header back: only %u byte%s left", - (unsigned) size, 1 == size ? "" : "s"); + (unsigned) size, plural(size)); } return rw < size ? rw : 0; @@ -1475,8 +1684,7 @@ * @return length of generated content */ static size_t -upload_gnutella_content_urn_add(char *buf, size_t size, - gpointer arg, guint32 flags) +upload_gnutella_content_urn_add(char *buf, size_t size, void *arg, uint32 flags) { struct upload_http_cb *a = arg; struct upload *u = a->u; @@ -1496,11 +1704,6 @@ * made a request via the N2R resolver. This will leave more room * for the mesh information. * NB: we use HTTP_CBF_BW_SATURATED, not HTTP_CBF_SMALL_REPLY on purpose. - * - * Also, if we sent mesh information for THIS upload, it means we're - * facing a follow-up request and we don't need to send them the SHA1 - * again. - * --RAM, 18/10/2003 */ if ((flags & HTTP_CBF_BW_SATURATED) && u->n2r) @@ -1508,12 +1711,12 @@ len = concat_strings(buf, size, "X-Gnutella-Content-URN: ", sha1_to_urn_string(sha1), "\r\n", - (void *) 0); + NULL_PTR); if (len >= size && GNET_PROPERTY(upload_debug)) { g_warning("U/L cannot send X-Gnutella-Content-URN header back: " "only %u byte%s left", - (unsigned) size, 1 == size ? "" : "s"); + (unsigned) size, plural(size)); } return len < size ? len : 0; @@ -1530,7 +1733,7 @@ * @return length of generated content */ static size_t -upload_thex_uri_add(char *buf, size_t size, gpointer arg, guint32 flags) +upload_thex_uri_add(char *buf, size_t size, void *arg, uint32 flags) { struct upload_http_cb *a = arg; struct upload *u = a->u; @@ -1552,16 +1755,16 @@ tth = shared_file_tth(u->sf); if (!tth) return 0; - + len = concat_strings(buf, size, "X-Thex-URI: /uri-res/N2X?", sha1_to_urn_string(sha1), ";", tth_base32(tth), "\r\n", - (void *) 0); + NULL_PTR); if (len >= size && GNET_PROPERTY(upload_debug)) { g_warning("U/L cannot send X-Thex-URI header back: only %u byte%s left", - (unsigned) size, 1 == size ? "" : "s"); + (unsigned) size, plural(size)); } return len < size ? len : 0; @@ -1572,14 +1775,16 @@ * SHA1-specific headers (added to the HTTP status) into `buf'. */ static size_t -upload_http_content_urn_add(char *buf, size_t size, gpointer arg, - guint32 flags) +upload_http_content_urn_add(char *buf, size_t size, void *arg, + uint32 flags) { const struct sha1 *sha1; size_t rw = 0, mesh_len; struct upload_http_cb *a = arg; struct upload *u = a->u; time_t last_sent; + bool need_content_urn; + uint32 urn_flags = flags; upload_check(u); @@ -1599,10 +1804,47 @@ if (u->last_dmesh) { last_sent = u->last_dmesh; } else { - rw += upload_gnutella_content_urn_add(&bufrw, size - rw, arg, flags); - rw += upload_thex_uri_add(&bufrw, size - rw, arg, flags); last_sent = mi_get_stamp(u->socket->addr, sha1, tm_time()); - } + } + + /* + * If we sent mesh information for THIS upload, it means we're facing + * a follow-up request and we don't need to send them the SHA1 + * again. + * --RAM, 18/10/2003 + * + * However, legacy Phex servents (don't know exactly up to which version) + * do expect to see the X-Gnutella-Content-URN line regardless of whether + * it's a follow-up request. Failing that, they will close the connection. + * This create a loose-loose situation: they can wait up in the PARQ queue + * and then when it's their turn, they cannot benefit. And we reserved + * the slot for them, denying it to another servent for nothing. Given + * that Phex is no longer maintained, we have to work-around this here. + * --RAM, 2015-08-18 + */ + + need_content_urn = !u->is_followup; /* TRUE on first request */ + + if ( + !need_content_urn && + u->user_agent != NULL && + is_strprefix(u->user_agent, "Phex ") + ) { + need_content_urn = TRUE; /* Workaround for Phex */ + urn_flags &= ~HTTP_CBF_BW_SATURATED; /* Force generation of header */ + } + + if (need_content_urn) { + rw += upload_gnutella_content_urn_add(&bufrw, size - rw, + arg, urn_flags); /* urn_flags, not flags, for Phex */ + } + + /* + * The X-Thex-URI line is never sent on follow-up requests. + */ + + if (!u->is_followup) + rw += upload_thex_uri_add(&bufrw, size - rw, arg, flags); /* * Ranges are only emitted for partial files, so no pre-estimation of @@ -1672,7 +1914,7 @@ if (mesh_len > 0) { size_t len, avail; - + avail = size - rw; if (flags & HTTP_CBF_SMALL_REPLY) { @@ -1702,7 +1944,7 @@ * additionnal headers on a "416 Request range not satisfiable" error. */ static size_t -upload_416_extra(char *buf, size_t size, gpointer arg, guint32 unused_flags) +upload_416_extra(char *buf, size_t size, void *arg, uint32 unused_flags) { const struct upload_http_cb *a = arg; const struct upload *u = a->u; @@ -1714,12 +1956,12 @@ uint64_to_string_buf(u->file_size, fsize, sizeof fsize); len = concat_strings(buf, size, - "Content-Range: bytes */", fsize, (void *) 0); + "Content-Range: bytes */", fsize, NULL_PTR); if (len >= size && GNET_PROPERTY(upload_debug)) { g_warning("U/L cannot send Content-Range header back: " "only %u byte%s left", - (unsigned) size, 1 == size ? "" : "s"); + (unsigned) size, plural(size)); } /* Don't emit a truncated header */ @@ -1728,7 +1970,7 @@ static size_t upload_http_content_length_add(char *buf, size_t size, - gpointer arg, guint32 unused_flags) + void *arg, uint32 unused_flags) { struct upload_http_cb *a = arg; struct upload *u = a->u; @@ -1739,12 +1981,12 @@ len = concat_strings(buf, size, "Content-Length: ", uint64_to_string(u->end - u->skip + 1), "\r\n", - (void *) 0); + NULL_PTR); if (len >= size && GNET_PROPERTY(upload_debug)) { g_warning("U/L cannot send Content-Length header back: " "only %u byte%s left", - (unsigned) size, 1 == size ? "" : "s"); + (unsigned) size, plural(size)); } return len < size ? len : 0; @@ -1752,7 +1994,7 @@ static size_t upload_http_content_type_add(char *buf, size_t size, - gpointer arg, guint32 unused_flags) + void *arg, uint32 unused_flags) { struct upload_http_cb *a = arg; struct upload *u = a->u; @@ -1767,12 +2009,12 @@ shared_file_check(u->sf); len = concat_strings(buf, size, "Content-Type: ", shared_file_mime_type(u->sf), "\r\n", - (void *) 0); + NULL_PTR); if (len >= size && GNET_PROPERTY(upload_debug)) { g_warning("U/L cannot send Content-Type header back: " "only %u byte%s left", - (unsigned) size, 1 == size ? "" : "s"); + (unsigned) size, plural(size)); } return len < size ? len : 0; @@ -1780,7 +2022,7 @@ static size_t upload_http_last_modified_add(char *buf, size_t size, - gpointer arg, guint32 unused_flags) + void *arg, uint32 unused_flags) { struct upload_http_cb *a = arg; size_t len; @@ -1789,12 +2031,12 @@ len = concat_strings(buf, size, "Last-Modified: ", timestamp_rfc1123_to_string(a->mtime), "\r\n", - (void *) 0); + NULL_PTR); if (len >= size && GNET_PROPERTY(upload_debug)) { g_warning("U/L cannot send Last-Modified header back: " "only %u byte%s left", - (unsigned) size, 1 == size ? "" : "s"); + (unsigned) size, plural(size)); } return len < size ? len : 0; @@ -1802,7 +2044,7 @@ static size_t upload_http_content_range_add(char *buf, size_t size, - gpointer arg, guint32 unused_flags) + void *arg, uint32 unused_flags) { struct upload_http_cb *a = arg; struct upload *u = a->u; @@ -1813,11 +2055,11 @@ if (u->skip || u->end != (u->file_size - 1)) { len = concat_strings(buf, size, - "Content-Range: bytes ", + "Content-Range: bytes ", uint64_to_string(u->skip), "-", uint64_to_string2(u->end), "/", filesize_to_string(u->file_size), "\r\n", - (void *) 0); + NULL_PTR); } else { len = 0; } @@ -1825,7 +2067,7 @@ if (len >= size && GNET_PROPERTY(upload_debug)) { g_warning("U/L cannot send Content-Range header back: " "only %u byte%s left", - (unsigned) size, 1 == size ? "" : "s"); + (unsigned) size, plural(size)); } return len < size ? len : 0; @@ -1837,7 +2079,7 @@ * upload-specific headers into `buf'. */ static size_t -upload_http_status(char *buf, size_t size, gpointer arg, guint32 flags) +upload_http_status(char *buf, size_t size, void *arg, uint32 flags) { size_t rw = 0; @@ -1854,10 +2096,10 @@ */ static void upload_http_extra_callback_add(struct upload *u, - http_status_cb_t callback, gpointer user_arg) + http_status_cb_t callback, void *user_arg) { upload_check(u); - g_return_if_fail(u->hevcnt < G_N_ELEMENTS(u->hev)); + g_return_if_fail(u->hevcnt < N_ITEMS(u->hev)); http_extra_callback_set(&u->hevu->hevcnt, callback, user_arg); u->hevcnt++; @@ -1869,19 +2111,14 @@ static void upload_http_extra_callback_remove(struct upload *u, http_status_cb_t callback) { - guint i; + uint i; upload_check(u); - g_assert(u->hevcnt <= G_N_ELEMENTS(u->hev)); + g_assert(u->hevcnt <= N_ITEMS(u->hev)); for (i = 0; i < u->hevcnt; /* empty */) { - if (http_extra_callback_matches(&u->hevi, callback)) { - if (i < u->hevcnt - 1) { - memmove(&u->hevi, &u->hevi+1, - sizeof(u->hev0) * (u->hevcnt - i - 1)); - } - g_assert(u->hevcnt != 0); - u->hevcnt--; + if G_UNLIKELY(http_extra_callback_matches(&u->hevi, callback)) { + ARRAY_REMOVE_DEC(u->hev, i, u->hevcnt); } else { i++; } @@ -1894,12 +2131,12 @@ */ static void upload_http_extra_callback_add_once(struct upload *u, - http_status_cb_t callback, gpointer user_arg) + http_status_cb_t callback, void *user_arg) { - guint i; + uint i; upload_check(u); - g_return_if_fail(u->hevcnt < G_N_ELEMENTS(u->hev)); + g_return_if_fail(u->hevcnt < N_ITEMS(u->hev)); for (i = 0; i < u->hevcnt; i++) { if (http_extra_callback_matches(&u->hevi, callback)) @@ -1918,7 +2155,7 @@ upload_http_extra_line_add(struct upload *u, const char *msg) { upload_check(u); - g_return_if_fail(u->hevcnt < G_N_ELEMENTS(u->hev)); + g_return_if_fail(u->hevcnt < N_ITEMS(u->hev)); http_extra_line_set(&u->hevu->hevcnt, msg); u->hevcnt++; @@ -1931,7 +2168,7 @@ upload_http_extra_body_add(struct upload *u, const char *body) { upload_check(u); - g_return_if_fail(u->hevcnt < G_N_ELEMENTS(u->hev)); + g_return_if_fail(u->hevcnt < N_ITEMS(u->hev)); http_extra_body_set(&u->hevu->hevcnt, body); u->hevcnt++; @@ -1960,16 +2197,16 @@ u->flags &= ~UPLOAD_F_LIMITED; /* For recursion */ u->keep_alive = FALSE; /* Force disconnection */ if (u->flags & UPLOAD_F_NORMAL_LIMIT) { - send_upload_error(u, 403, "Unauthorized"); + send_upload_error(u, 403, N_("Unauthorized")); } else if (!(u->flags & UPLOAD_F_STEALTH_LIMIT)) { - send_upload_error(u, 403, "Limiting connections from %s", + send_upload_error(u, 403, N_("Limiting connections from %s"), gip_country_name(u->socket->addr)); } return; } if (msg && no_reason != msg) { - gm_vsnprintf(reason, sizeof reason, msg, ap); + str_vbprintf(reason, sizeof reason, msg, ap); } else reason0 = '\0'; @@ -1992,9 +2229,8 @@ if (slen < sizeof(extra)) { upload_http_extra_line_add(u, extra); } else { - g_warning("send_upload_error_v: " - "ignoring too large extra header (%lu bytes)", - (unsigned long) slen); + g_warning("%s: ignoring too large extra header (%zu bytes)", + G_STRFUNC, slen); } } @@ -2032,7 +2268,7 @@ static char buf2048; char href1024; char index_href32; - glong retry; + long retry; retry = delta_time(parq_upload_retry(u), tm_time()); retry = MAX(0, retry); @@ -2051,9 +2287,9 @@ HFREE_NULL(uri); } - gm_snprintf(index_href, sizeof index_href, - "/get/%lu/", (gulong) u->file_index); - gm_snprintf(buf, sizeof buf, + str_bprintf(index_href, sizeof index_href, + "/get/%lu/", (ulong) u->file_index); + str_bprintf(buf, sizeof buf, "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\">" "<html>" "<head>" @@ -2076,7 +2312,7 @@ "</html>" "\r\n", retry, '\0' != href0 ? index_href : "", href, - retry, product_get_name(), retry); + retry, product_name(), retry); upload_http_extra_line_add(u, "Content-Type: text/html; charset=utf-8\r\n"); upload_http_extra_body_add(u, buf); @@ -2153,7 +2389,7 @@ ? host_addr_to_string(u->socket->addr) : "<no socket>", upload_vendor_str(u), u->status, reason); - + } upload_send_http_status(u, u->keep_alive, code, reason); @@ -2203,22 +2439,24 @@ { const char *logreason; char errbuf1024; - gboolean was_sending; + bool was_sending; + va_list apcopy; upload_check(u); was_sending = UPLOAD_IS_SENDING(u); + VA_COPY(apcopy, ap); - if (reason && no_reason != reason) { - gm_vsnprintf(errbuf, sizeof errbuf, reason, ap); + if (reason != NULL && no_reason != reason) { + str_vbprintf(errbuf, sizeof errbuf, reason, ap); logreason = errbuf; } else { if (u->error_sent) { - gm_snprintf(errbuf, sizeof(errbuf), "HTTP %d", u->error_sent); + str_bprintf(errbuf, sizeof(errbuf), "HTTP %d", u->error_sent); logreason = errbuf; } else { errbuf0 = '\0'; - logreason = "No reason given"; + logreason = N_("No reason given"); } } @@ -2262,7 +2500,7 @@ u->status != GTA_UL_PUSH_RECEIVED && u->status != GTA_UL_QUEUE ) { if (reason == NULL) - logreason = "Bad Request"; + logreason = reason = N_("Bad Request"); send_upload_error(u, 400, "%s", logreason); } @@ -2285,9 +2523,19 @@ if (u->was_running) gnet_prop_decr_guint32(PROP_UL_RUNNING); - reason = reason != no_reason ? reason : NULL; - upload_fire_upload_removed(u, reason ? errbuf : NULL); + /* + * Translation for the GUI happens here. + */ + + if (reason != NULL && no_reason != reason) { + str_vbprintf(errbuf, sizeof errbuf, _(reason), apcopy); + logreason = errbuf; + } else { + logreason = NULL; + } + va_end(apcopy); + upload_fire_upload_removed(u, logreason); upload_free_resources(u); } @@ -2296,6 +2544,9 @@ * * If no status has been sent back on the HTTP stream yet, give them * a 400 error with the reason. + * + * @note The parameter "reason" is passed to gettext(). Do not pass an already + * translated string, use N_("string") as the argument. */ void upload_remove(struct upload *u, const char *reason, ...) @@ -2310,9 +2561,24 @@ } /** + * Same as upload_remove() but without any printf argument checking. + */ +static void +upload_remove_nowarn(struct upload *u, const char *reason, ...) +{ + va_list args; + + upload_check(u); + + va_start(args, reason); + upload_remove_v(u, reason, args); + va_end(args); +} + +/** * Utility routine. Cancel the upload, sending back the HTTP error message. * - * @note The parameter "msg" is passed to gettext(). Do not pass already + * @note The parameter "msg" is passed to gettext(). Do not pass an already * translated strings because it's sent as an HTTP response message. */ static void @@ -2328,7 +2594,7 @@ send_upload_error_v(u, NULL, code, msg, errargs); va_end(errargs); - upload_remove_v(u, _(msg), args); + upload_remove_v(u, msg, args); va_end(args); } @@ -2377,6 +2643,12 @@ * Report HTTP error to remote host, but keep the connection alive so * that they can send a new request, unless we have reached the maximum * amount of errors on that connection. + * + * @attention + * The ``msg'' string must not be translated as it is send back in HTTP + * headers. We'll call gettext() on it to translate it for logging in the + * GUI. Callers should use N_("string") to get the English version yet mark + * "string" for translation. */ static void upload_send_error(struct upload *u, int code, const char *msg) @@ -2396,7 +2668,7 @@ } else { upload_send_http_status(u, FALSE, code, msg); } - upload_remove(u, "%s", msg); + upload_remove_nowarn(u, _(msg)); } /** @@ -2405,17 +2677,17 @@ void upload_stop_all(struct dl_file_info *fi, const char *reason) { - GSList *sl, *to_stop = NULL; + pslist_t *sl, *to_stop = NULL; int count = 0; g_return_if_fail(fi); file_info_check(fi); - for (sl = list_uploads; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(list_uploads, sl) { struct upload *u = cast_to_upload(sl->data); if (u->file_info == fi) { - to_stop = g_slist_prepend(to_stop, u); + to_stop = pslist_prepend(to_stop, u); count++; } } @@ -2423,16 +2695,17 @@ if (to_stop == NULL) return; - if (GNET_PROPERTY(upload_debug)) + if (GNET_PROPERTY(upload_debug)) { g_warning("stopping %d uploads for \"%s\": %s", count, fi->pathname, reason); + } - for (sl = to_stop; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(to_stop, sl) { struct upload *u = cast_to_upload(sl->data); - upload_remove(u, "%s", reason); + upload_remove_nowarn(u, reason); } - g_slist_free(to_stop); + pslist_free(to_stop); } /** @@ -2445,7 +2718,15 @@ upload_check(u); g_assert(header); - + + /* + * We remember the first User-Agent we see for a given upload, so + * follow-up requests simply ignore the field. + */ + + if (u->user_agent != NULL) + return; + user_agent = header_get(header, "User-Agent"); if (user_agent == NULL) { /* Maybe they sent a Server: line, thinking they're a server? */ @@ -2455,9 +2736,9 @@ socket_disable_token(u->socket); } - if (u->user_agent == NULL && user_agent != NULL) { + if (user_agent != NULL) { const char *token; - gboolean faked; + bool faked; /* * Extract User-Agent. @@ -2472,7 +2753,7 @@ if (faked) { char name1024; - concat_strings(name, sizeof name, "!", user_agent, (void *) 0); + concat_strings(name, sizeof name, "!", user_agent, NULL_PTR); u->user_agent = atom_str_get(name); } else u->user_agent = atom_str_get(user_agent); @@ -2486,66 +2767,66 @@ ***/ static void -err_line_too_long(gpointer obj, header_t *head) +err_line_too_long(void *obj, header_t *head) { struct upload *u = cast_to_upload(obj); upload_request_handle_user_agent(u, head); - upload_error_remove(u, 413, "Header too large"); + upload_error_remove(u, 413, N_("Header too large")); } static void -err_header_error_tell(gpointer obj, int error) +err_header_error_tell(void *obj, int error) { send_upload_error(cast_to_upload(obj), 413, "%s", header_strerror(error)); } static void -err_header_error(gpointer obj, int error) +err_header_error(void *obj, int error) { upload_remove(cast_to_upload(obj), - _("Failed (%s)"), header_strerror(error)); + N_("Failed (%s)"), header_strerror(error)); } static void -err_input_exception(gpointer obj, header_t *head) +err_input_exception(void *obj, header_t *head) { struct upload *u = cast_to_upload(obj); upload_request_handle_user_agent(u, head); - upload_remove(u, _("Failed (Input Exception)")); + upload_remove(u, N_("Failed (Input Exception)")); } static void -err_input_buffer_full(gpointer obj) +err_input_buffer_full(void *obj) { - upload_error_remove(cast_to_upload(obj), 500, "Input buffer full"); + upload_error_remove(cast_to_upload(obj), 500, N_("Input buffer full")); } static void -err_header_read_error(gpointer obj, int error) +err_header_read_error(void *obj, int error) { upload_remove(cast_to_upload(obj), - _("Failed (Input error: %s)"), g_strerror(error)); + N_("Failed (Input error: %s)"), g_strerror(error)); } static void -err_header_read_eof(gpointer obj, header_t *head) +err_header_read_eof(void *obj, header_t *head) { struct upload *u = cast_to_upload(obj); u->error_sent = 999; /* No need to send anything on EOF condition */ upload_request_handle_user_agent(u, head); - upload_remove(u, _("Failed (EOF)")); + upload_remove(u, N_("Failed (EOF)")); } static void -err_header_extra_data(gpointer obj, header_t *head) +err_header_extra_data(void *obj, header_t *head) { struct upload *u = cast_to_upload(obj); upload_request_handle_user_agent(u, head); - upload_error_remove(u, 400, "Extra data after HTTP header"); + upload_error_remove(u, 400, N_("Extra data after HTTP header")); } static const struct io_error upload_io_error = { @@ -2560,7 +2841,7 @@ }; static void -call_upload_request(gpointer obj, header_t *header) +call_upload_request(void *obj, header_t *header) { struct upload *u = cast_to_upload(obj); @@ -2577,7 +2858,6 @@ upload_request(u, header); } - /** * Create a new upload request, and begin reading HTTP headers. */ @@ -2586,8 +2866,6 @@ { struct upload *u; - s->type = SOCK_TYPE_UPLOAD; - u = upload_create(s, FALSE); /* @@ -2602,7 +2880,7 @@ * Callback invoked when we start reading the follow-up HTTP request. */ static void -move_to_ul_waiting(gpointer obj) +move_to_ul_waiting(void *obj) { struct upload *u = cast_to_upload(obj); @@ -2621,7 +2899,6 @@ io_start_cb_t start_cb = NULL; upload_check(u); - g_assert(s->resource.upload == u); g_assert(NULL == u->file); /* File not opened */ /* @@ -2632,10 +2909,7 @@ io_free(u->io_opaque); u->io_opaque = NULL; } - if (s->getline) { - getline_free(s->getline); - s->getline = NULL; - } + getline_free_null(&s->getline); if (u->sf) { shared_file_check(u->sf); } @@ -2680,13 +2954,14 @@ * Got confirmation that the connection to the remote host was OK. * Send the GIV/QUEUE string, then prepare receiving back the HTTP request. */ -void +static void upload_connect_conf(struct upload *u) { char givMAX_LINE_SIZE; struct gnutella_socket *s; size_t rw; ssize_t sent; + const guid_t *guid; upload_check(u); @@ -2703,19 +2978,25 @@ g_assert(u->name); /* - * Send the GIV string, using our servent GUID. + * Send the GIV or PUSH string, using our servent GUID. */ - rw = gm_snprintf(giv, sizeof giv, "GIV %lu:%s/file\n\n", - (gulong) u->file_index, - guid_hex_str(cast_to_guid_ptr_const(GNET_PROPERTY(servent_guid)))); + guid = cast_to_guid_ptr_const(GNET_PROPERTY(servent_guid)); + + if (u->g2) { + rw = str_bprintf(giv, sizeof giv, "PUSH guid:%s\r\n\r\n", + guid_hex_str(guid)); + } else { + rw = str_bprintf(giv, sizeof giv, "GIV %lu:%s/file\n\n", + (ulong) u->file_index, guid_hex_str(guid)); + } s = u->socket; sent = bws_write(bsched_out_select_by_addr(s->addr), &s->wio, giv, rw); if ((ssize_t) -1 == sent) { if (GNET_PROPERTY(upload_debug) > 1) g_warning( - "unable to send back GIV for \"%s\" to %s: %s", - u->name, host_addr_to_string(s->addr), g_strerror(errno)); + "unable to send back GIV for \"%s\" to %s: %m", + u->name, host_addr_to_string(s->addr)); } else if ((size_t) sent < rw) { if (GNET_PROPERTY(upload_debug)) g_warning( "only sent %zu out of %zu bytes of GIV for \"%s\" to %s", @@ -2726,7 +3007,7 @@ } if ((size_t) sent != rw) { - upload_remove(u, _("Unable to send GIV")); + upload_remove(u, N_("Unable to send GIV")); return; } @@ -2759,7 +3040,7 @@ filename ? request : "verbatim"); } - upload_send_error(u, 404, "Not Found"); + upload_send_error(u, 404, N_("Not Found")); } /** @@ -2767,10 +3048,10 @@ * * @return TRUE if ok or FALSE otherwise (upload must then be aborted) */ -static gboolean +static bool upload_http_version(struct upload *u, const char *request, size_t len) { - guint http_major, http_minor; + uint http_major, http_minor; /* * Check HTTP protocol version. --RAM, 11/04/2002 @@ -2791,7 +3072,7 @@ * * @return TRUE if OK, FALSE otherwise with the upload removed. */ -static gboolean +static bool upload_file_present(struct upload *u, shared_file_t *sf) { fileinfo_t *fi; @@ -2799,13 +3080,21 @@ upload_check(u); + /* + * If uploading is disabled, don't access the disk. + * Act as if the file was present, the upload will be refused anyway. + */ + + if (!upload_is_enabled()) + return TRUE; + fi = shared_file_fileinfo(sf); if (stat(shared_file_path(sf), &sb)) goto failure; if (!S_ISREG(sb.st_mode)) goto failure; - + if (delta_time(shared_file_modification_time(sf), sb.st_mtime)) { shared_file_set_modification_time(sf, sb.st_mtime); if (NULL == fi) { @@ -2839,7 +3128,7 @@ */ u->file_info = NULL; - file_info_upload_stop(fi, "File was modified"); + file_info_upload_stop(fi, N_("File was modified")); u->file_info = current_fi; } return FALSE; @@ -2852,24 +3141,40 @@ upload_collect_locations(struct upload *u, const struct sha1 *sha1, const header_t *header) { + shared_file_t *sf; + g_return_if_fail(sha1); - if (shared_file_by_sha1(sha1) || file_info_by_sha1(sha1)) { + sf = shared_file_by_sha1(sha1); + sf = SHARE_REBUILDING == sf ? NULL : sf; + + if (NULL != sf || file_info_by_sha1(sha1)) { char *buf; + gnet_host_t host; + gnet_host_t *origin = NULL; - huge_collect_locations(sha1, header); if (host_is_valid(u->gnet_addr, u->gnet_port)) { /* - * The uploader is only an alt-loc if it lists itself in the - * X-Alt: header. If it didn't the following has no effect. + * The downloader is only an alt-loc if it lists itself in the + * X-Alt: header. To determine this, we propagate the origin + * of the X-Alt header and if we find that address listed, we'll + * be able to flag the alt-loc as good since we're talking + * to the server that can provide it. + * --RAM, 2012-12-03 */ - dmesh_good_mark(sha1, u->gnet_addr, u->gnet_port, TRUE); + + gnet_host_set(&host, u->gnet_addr, u->gnet_port); + origin = &host; } + huge_collect_locations(sha1, header, origin); + buf = header_get(header, "X-Nalt"); if (buf) - dmesh_collect_negative_locations(sha1, buf, u->addr); + dmesh_collect_negative_locations(sha1, buf, u->addr, u->user_agent); } + + shared_file_unref(&sf); } /** @@ -2881,10 +3186,10 @@ */ static int get_file_to_upload_from_index(struct upload *u, const header_t *header, - const char *uri, guint idx) + const char *uri, uint idx) { shared_file_t *sf; - gboolean sent_sha1 = FALSE; + bool sent_sha1 = FALSE; struct sha1 sha1; upload_check(u); @@ -2901,13 +3206,10 @@ * --RAM, 16/01/2002 */ - sf = shared_file(idx); + sf = shared_file(idx); /* Reference-counted */ - if (SHARE_REBUILDING == sf) { - /* Retry-able by user, hence 503 */ - upload_error_remove(u, 503, "Library being rebuilt"); - return -1; - } + if (SHARE_REBUILDING == sf) + goto library_rebuilt; atom_str_change(&u->name, uri); @@ -2932,8 +3234,9 @@ if (sent_sha1) { shared_file_t *sfn; - + if (spam_sha1_check(&sha1)) { + shared_file_unref(&sf); goto not_found; } @@ -2957,8 +3260,10 @@ */ if (sf && sha1_hash_available(sf)) { - if (!sha1_hash_is_uptodate(sf)) + if (!sha1_hash_is_uptodate(sf)) { + shared_file_unref(&sf); goto sha1_recomputed; + } if (sha1_eq(&sha1, shared_file_sha1(sf))) goto found; } @@ -2970,16 +3275,30 @@ * know the hash. */ - sfn = shared_file_by_sha1(&sha1); + sfn = shared_file_by_sha1(&sha1); /* Reference-counted */ - g_assert(sfn != SHARE_REBUILDING); /* Or we'd have trapped above */ + /* + * Since shared_file(idx) and shared_file_by_sha1(sha1) use different + * logics to determine whether the library is being rebuilt, we cannot + * blindly assert that shared_file_by_sha1() will not report a + * SHARE_REBUILDING condition when shared_file() did not above... + * --RAM, 2012-11-12 + */ + + if (SHARE_REBUILDING == sfn) { + shared_file_unref(&sf); + goto library_rebuilt; + } if (sfn && sf != sfn) { char location1024; char *escaped; - if (!sha1_hash_is_uptodate(sfn)) + if (!sha1_hash_is_uptodate(sfn)) { + shared_file_unref(&sfn); + shared_file_unref(&sf); goto sha1_recomputed; + } /* * Be nice to pushed downloads: returning a 301 currently means @@ -2997,14 +3316,15 @@ g_debug("INDEX FIXED (push, SHA1 = %s): " "requested %u, serving %u: %s", sha1_base32(&sha1), idx, - (guint) shared_file_index(sfn), + (uint) shared_file_index(sfn), shared_file_path(sfn)); + shared_file_unref(&sf); sf = sfn; goto found; } /* - * Be nice for PFSP as well. They must have learned about + * Be nice for PFSP as well. They must have learnt about * this from an alt-loc, and alt-locs we emit for those partially * shared files are URNs. Why did they request it by name? * --RAM, 12/10/2003 @@ -3016,25 +3336,36 @@ "requested \"%s\", serving \"%s\"", sha1_base32(&sha1), u->name, shared_file_path(sfn)); + shared_file_unref(&sf); sf = sfn; goto found; } escaped = url_escape(shared_file_name_nfc(sfn)); - gm_snprintf(location, sizeof(location), + str_bprintf(location, sizeof(location), "Location: /get/%lu/%s\r\n", - (gulong) shared_file_index(sfn), escaped); + (ulong) shared_file_index(sfn), escaped); if (escaped != shared_file_name_nfc(sfn)) { HFREE_NULL(escaped); } - u->sf = shared_file_ref(sfn); - upload_error_remove_ext(u, location, 301, "Moved Permanently"); + /* + * By setting u->sf to the new location, we allow the HTTP + * reply to include the SHA1 of the file as well as some + * alternate locations. See send_upload_error_v(). + */ + + shared_file_unref(&sf); + u->sf = sfn; + upload_error_remove_ext(u, location, 301, N_("Moved Permanently")); return -1; } - else if (sf == NULL) + + shared_file_unref(&sfn); + + if (NULL == sf) goto urn_not_found; /* FALL THROUGH */ @@ -3054,14 +3385,14 @@ */ if (sf == NULL) { - sf = shared_file_by_name(u->name); + sf = shared_file_by_name(u->name); /* Reference counts ``sf'' */ g_assert(sf != SHARE_REBUILDING); /* Or we'd have trapped above */ if (GNET_PROPERTY(upload_debug) > 1) { if (sf) g_debug("BAD INDEX FIXED: requested %u, serving %u: %s", - idx, (guint) shared_file_index(sf), shared_file_path(sf)); + idx, (uint) shared_file_index(sf), shared_file_path(sf)); else g_debug("BAD INDEX NOT FIXED: requested %u: %s", idx, u->name); @@ -3075,40 +3406,51 @@ if (GNET_PROPERTY(upload_debug) > 1) { if (sfn) g_debug("INDEX FIXED: requested %u, serving %u: %s", - idx, (guint) shared_file_index(sfn), + idx, (uint) shared_file_index(sfn), shared_file_path(sfn)); else g_debug("INDEX MISMATCH: requested %u: %s (has %s)", idx, u->name, shared_file_name_nfc(sf)); } + shared_file_unref(&sf); if (NULL == sfn) { - upload_send_error(u, 404, "File index/name mismatch"); + upload_send_error(u, 404, N_("File index/name mismatch")); return -1; } else - sf = sfn; + sf = sfn; /* Ref-counted by shared_file_by_name() */ } + /* + * At this point, either ``sf'' is NULL or it has been ref-counted. + */ + if (NULL == sf || !upload_file_present(u, sf)) { + shared_file_unref(&sf); goto not_found; } found: g_assert(sf != NULL); - u->sf = shared_file_ref(sf); + u->sf = sf; /* Already ref-counted */ return 0; urn_not_found: - upload_send_error(u, 404, "URN Not Found (urn:sha1)"); + upload_send_error(u, 404, N_("URN Not Found (urn:sha1)")); return -1; sha1_recomputed: - upload_send_error(u, 503, "SHA1 is being recomputed"); + upload_send_error(u, 503, N_("SHA1 is being recomputed")); return -1; not_found: upload_error_not_found(u, uri); return -1; + +library_rebuilt: + /* Retry-able by user, hence 503 */ + upload_error_remove(u, 503, N_("Library being rebuilt")); + return -1; } static void @@ -3119,7 +3461,7 @@ } } -static gboolean +static bool upload_request_tth_matches(shared_file_t *sf, const struct tth *tth) { if (NULL == tth || NULL == shared_file_tth(sf)) { @@ -3157,9 +3499,8 @@ goto malformed; } - if (spam_sha1_check(&sha1)) { + if (spam_sha1_check(&sha1)) goto not_found; - } upload_collect_locations(u, &sha1, header); @@ -3175,7 +3516,7 @@ * --RAM, 2005-08-01, 2007-08-25 */ - sf = shared_file_by_sha1(&sha1); + sf = shared_file_by_sha1(&sha1); /* Reference-counted */ if (sf == NULL || sf == SHARE_REBUILDING) { const char *filename; @@ -3188,7 +3529,7 @@ if (sf == SHARE_REBUILDING) { /* Retry-able by user, hence 503 */ - upload_error_remove(u, 503, "Library being rebuilt"); + upload_error_remove(u, 503, N_("Library being rebuilt")); return -1; } @@ -3196,18 +3537,21 @@ upload_error_not_found(u, uri); return -1; } else if (!sha1_hash_is_uptodate(sf)) { - upload_send_error(u, 503, "SHA1 is being recomputed"); + upload_send_error(u, 503, N_("SHA1 is being recomputed")); + shared_file_unref(&sf); return -1; } else if (!upload_file_present(u, sf)) { + shared_file_unref(&sf); goto not_found; } if (!upload_request_tth_matches(sf, tth)) { + shared_file_unref(&sf); goto not_found; } upload_request_tth(sf); - u->sf = shared_file_ref(sf); + u->sf = sf; return 0; malformed: @@ -3215,7 +3559,7 @@ g_warning("malformed URN \"%s\" in /uri-res/N2R request sent by %s", NULL_STRING(uri), upload_host_info(u)); } - upload_error_remove(u, 400, "Malformed URN in /uri-res/N2R request"); + upload_error_remove(u, 400, N_("Malformed URN in /uri-res/N2R request")); return -1; not_found: @@ -3258,7 +3602,7 @@ if (SHARE_REBUILDING == sf) { /* Retry-able by user, hence 503 */ atom_str_change(&u->name, bitprint_to_urn_string(&sha1, tth)); - upload_error_remove(u, 503, "Library being rebuilt"); + upload_error_remove(u, 503, N_("Library being rebuilt")); return -1; } if (sf == NULL) { @@ -3272,30 +3616,35 @@ * As long as we cannot verify the full TTH we should probably * not pass it on even if we already fetched THEX data. */ + shared_file_unref(&sf); goto not_found; } - + if (!sha1_hash_is_uptodate(sf)) { - upload_send_error(u, 503, "SHA1 is being recomputed"); + upload_send_error(u, 503, N_("SHA1 is being recomputed")); + shared_file_unref(&sf); return -1; } if (!upload_request_tth_matches(sf, tth)) { + shared_file_unref(&sf); goto not_found; } if (NULL == shared_file_tth(sf)) { upload_request_tth(sf); + shared_file_unref(&sf); goto tth_recomputed; } if (0 == tth_cache_lookup(shared_file_tth(sf), shared_file_size(sf))) { shared_file_set_tth(sf, NULL); upload_request_tth(sf); + shared_file_unref(&sf); goto tth_recomputed; } - u->thex = shared_file_ref(sf); + u->thex = sf; return 0; not_found: @@ -3307,11 +3656,11 @@ g_warning("malformed URN \"%s\" in /uri-res/N2X request sent by %s", NULL_STRING(uri), upload_host_info(u)); } - upload_error_remove(u, 400, "Malformed URN in /uri-res/N2X request"); + upload_error_remove(u, 400, N_("Malformed URN in /uri-res/N2X request")); return -1; tth_recomputed: - upload_send_error(u, 503, "TTH is being computed"); + upload_send_error(u, 503, N_("TTH is being computed")); return -1; } @@ -3342,7 +3691,7 @@ u->name = atom_str_get(uri); if (NULL != (endptr = is_strprefix(uri, "/get/"))) { - guint32 idx; + uint32 idx; int error; idx = parse_uint32(endptr, &endptr, 10, &error); @@ -3352,7 +3701,7 @@ '\0' != endptr1 && NULL == strchr(&endptr1, '/') ) { - endptr = deconstify_gchar(&endptr1); + endptr = deconstify_char(&endptr1); return get_file_to_upload_from_index(u, header, endptr, idx); } } else if (NULL != (endptr = is_strprefix(uri, "/uri-res/"))) { @@ -3379,7 +3728,7 @@ ***/ static void -upload_tx_error(gpointer obj, const char *reason, ...) +upload_tx_error(void *obj, const char *reason, ...) { struct upload *u = cast_to_upload(obj); va_list args; @@ -3397,7 +3746,7 @@ }; static void -upload_tx_add_written(gpointer obj, int amount) +upload_tx_add_written(void *obj, int amount) { struct upload *u = cast_to_upload(obj); @@ -3432,7 +3781,7 @@ if (buf) { if (strtok_has(buf, ",", "deflate")) { const char *ua; - + ua = header_get(header, "User-Agent"); if (NULL == ua || NULL == strstr(ua, "AppleWebKit")) return BH_F_DEFLATE; @@ -3447,6 +3796,9 @@ /** * Extract X-Downloaded from header, returning 0 if none. + * + * The X-Downloaded header lets us better estimate the time an upload request + * can take if we are the only source for the file. */ static filesize_t extract_downloaded(const struct upload *u, const header_t *header) @@ -3474,10 +3826,10 @@ * Checks whether the HTTP client can handle the transfer-encoding "chunked". * @return TRUE if the client seems to support it and otherwise FALSE. */ -static gboolean +static bool supports_chunked(const struct upload *u, const header_t *header) { - gboolean chunked; + bool chunked; upload_check(u); g_assert(header); @@ -3486,7 +3838,7 @@ const char *buf; /* - * It's assumed that LimeWire-based clients cannot handle + * It's assumed that LimeWire-based clients cannot handle * "chunked" properly. This is at least true for their Browse Host * support. * @@ -3515,14 +3867,14 @@ extract_fw_node_info(struct upload *u, const header_t *header) { struct guid guid; - gboolean seen_port_ip = FALSE; - gboolean seen_guid = FALSE; + bool seen_port_ip = FALSE; + bool seen_guid = FALSE; const char *tok; const char *msg = NULL; const char *buf; strtok_t *st; host_addr_t addr; - guint16 port; + uint16 port; buf = header_get(header, "X-FW-Node-Info"); if (NULL == buf) @@ -3550,7 +3902,7 @@ break; } if (guid_eq(&guid, GNET_PROPERTY(servent_guid))) { - gnet_stats_count_general(GNR_OWN_GUID_COLLISIONS, 1); + gnet_stats_inc_general(GNR_OWN_GUID_COLLISIONS); msg = "node bears our GUID"; break; } @@ -3577,7 +3929,7 @@ } } - strtok_free(st); + strtok_free_null(&st); if (!seen_guid && NULL == msg) msg = "missing GUID"; @@ -3645,21 +3997,21 @@ if (!GNET_PROPERTY(browse_host_enabled)) { if (ctl_limit(u->socket->addr, CTL_D_BROWSE | CTL_D_STEALTH)) { - upload_remove(u, _("Limited connection")); + upload_remove(u, N_("Limited connection")); } else { - upload_send_error(u, 403, "Browse Host Disabled"); + upload_send_error(u, 403, N_("Browse Host Disabled")); } return -1; } if (ctl_limit(u->socket->addr, CTL_D_BROWSE)) { if (ctl_limit(u->socket->addr, CTL_D_NORMAL)) { - send_upload_error(u, 403, "Browse Host Disabled"); + send_upload_error(u, 403, N_("Browse Host Disabled")); } else if (!ctl_limit(u->socket->addr, CTL_D_STEALTH)) { - send_upload_error(u, 404, "Limiting connections from %s", + send_upload_error(u, 404, N_("Limiting connections from %s"), gip_country_name(u->socket->addr)); } - upload_remove(u, _("Limited connection")); + upload_remove(u, N_("Limited connection")); return -1; } @@ -3678,11 +4030,11 @@ static const char fmt = "Location: http://%s:%u/\r\n"; static char locationsizeof fmt + UINT16_DEC_BUFLEN + MAX_HOSTLEN; - gm_snprintf(location, sizeof location, fmt, + str_bprintf(location, sizeof location, fmt, GNET_PROPERTY(server_hostname), GNET_PROPERTY(listen_port)); upload_http_extra_line_add(u, location); upload_send_http_status(u, FALSE, 301, "Redirecting"); - upload_remove(u, "Redirected to %s:%u", + upload_remove(u, N_("Redirected to %s:%u"), GNET_PROPERTY(server_hostname), GNET_PROPERTY(listen_port)); return -1; } @@ -3694,9 +4046,9 @@ t = date2time(buf, tm_time()); if ( (time_t) -1 != t && - delta_time((time_t) GNET_PROPERTY(library_rescan_finished), t) <= 0 + delta_time((time_t) GNET_PROPERTY(library_rescan_finished), t) <= 0 ) { - upload_send_error(u, 304, "Not Modified"); + upload_send_error(u, 304, N_("Not Modified")); return -1; } } @@ -3710,7 +4062,7 @@ { static char lm_buf64; - gm_snprintf(lm_buf, sizeof lm_buf, "Last-Modified: %s\r\n", + str_bprintf(lm_buf, sizeof lm_buf, "Last-Modified: %s\r\n", timestamp_rfc1123_to_string(GNET_PROPERTY(library_rescan_finished))); upload_http_extra_line_add(u, lm_buf); } @@ -3725,11 +4077,11 @@ * @return TRUE if upload is a duplicate, FALSE if it isn't or if the old * duplicate was stalling and thus kicked out. */ -static gboolean +static bool upload_is_already_downloading(struct upload *upload) { - GSList *sl, *to_remove = NULL; - gboolean result = FALSE; + pslist_t *sl, *to_remove = NULL; + bool result = FALSE; g_assert(upload); @@ -3745,7 +4097,7 @@ * -- JA 12/7/'03 */ - for (sl = list_uploads; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(list_uploads, sl) { struct upload *up = cast_to_upload(sl->data); if (up == upload) @@ -3753,7 +4105,7 @@ if (!UPLOAD_IS_SENDING(up) && up->status != GTA_UL_QUEUED) continue; if ( - host_addr_equal(up->socket->addr, upload->socket->addr) && ( + host_addr_equiv(up->socket->addr, upload->socket->addr) && ( (up->file_index != URN_INDEX && up->file_index == upload->file_index) || (upload->sha1 && up->sha1 == upload->sha1) @@ -3770,7 +4122,7 @@ result = TRUE; break; } - to_remove = g_slist_prepend(to_remove, up); + to_remove = pslist_prepend(to_remove, up); } } @@ -3781,7 +4133,7 @@ * at most. */ - for (sl = to_remove; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(to_remove, sl) { struct upload *up = cast_to_upload(sl->data); if (GNET_PROPERTY(upload_debug)) g_warning( @@ -3789,11 +4141,11 @@ host_addr_to_string(up->addr), upload_vendor_str(up), uint64_to_string(up->sent)); - upload_remove(up, _("Stalling upload replaced")); + upload_remove(up, N_("Stalling upload replaced")); } } - g_slist_free(to_remove); + pslist_free(to_remove); return result; } @@ -3802,17 +4154,17 @@ * * @return TRUE if we're going to actually serve the request. */ -static gboolean +static bool upload_request_for_shared_file(struct upload *u, const header_t *header) { filesize_t range_skip = 0, range_end = 0; - gboolean range_unavailable = FALSE; + bool range_unavailable = FALSE; const struct sha1 *sha1 = NULL; const char *buf; time_t now = tm_time(); - gboolean parq_allows = FALSE; - guint32 idx = 0; - gboolean switched = FALSE; + bool parq_allows = FALSE; + uint32 idx = 0; + bool switched = FALSE; upload_check(u); g_assert(u->sf); @@ -3842,8 +4194,7 @@ if (u->sha1) { if (u->sha1 != sha1) { switched = TRUE; - gnet_stats_count_general( - GNR_CLIENT_PLAIN_RESOURCE_SWITCHING, 1); + gnet_stats_inc_general(GNR_CLIENT_PLAIN_RESOURCE_SWITCHING); if (sha1) atom_sha1_change(&u->sha1, sha1); else @@ -3851,7 +4202,7 @@ } } else if (u->file_index != idx) { switched = TRUE; - gnet_stats_count_general(GNR_CLIENT_PLAIN_RESOURCE_SWITCHING, 1); + gnet_stats_inc_general(GNR_CLIENT_PLAIN_RESOURCE_SWITCHING); } } @@ -3883,7 +4234,7 @@ u->file_size = shared_file_size(u->sf); if (!u->head_only && upload_is_already_downloading(u)) { - upload_send_error(u, 409, "Already downloading this file"); + upload_send_error(u, 409, N_("Already downloading this file")); return FALSE; } @@ -3893,18 +4244,18 @@ buf = header_get(header, "Range"); if (buf && shared_file_size(u->sf) > 0) { - http_range_t *r; - GSList *ranges; + enum http_range_extract_status rs; - ranges = http_range_parse("Range", buf, - shared_file_size(u->sf), u->user_agent); + rs = http_range_extract_first("Range", buf, + shared_file_size(u->sf), u->user_agent, + &range_skip, &range_end); - if (ranges == NULL) { + if (HTTP_RANGE_NONE == rs) { if (GNET_PROPERTY(upload_debug)) { g_warning("cannot parse Range \"%s\" sent by %s", buf, upload_host_info(u)); } - upload_error_remove(u, 400, "Malformed Range request"); + upload_error_remove(u, 400, N_("Malformed Range request")); return FALSE; } @@ -3915,23 +4266,15 @@ * --RAM, 27/01/2003 */ - if (g_slist_next(ranges) != NULL) { + if (HTTP_RANGE_MULTI == rs) { if (GNET_PROPERTY(upload_debug)) { g_warning("%s requested several ranges for \"%s\": %s", - upload_host_info(u), shared_file_name_nfc(u->sf), - http_range_to_string(ranges)); + upload_host_info(u), shared_file_name_nfc(u->sf), buf); } } - r = ranges->data; - - g_assert(r->start <= r->end); - g_assert(r->end < shared_file_size(u->sf)); - - range_skip = r->start; - range_end = r->end; - - http_range_free(ranges); + g_assert(range_skip <= range_end); + g_assert(range_end < shared_file_size(u->sf)); } else { range_end = u->file_size - 1; } @@ -3968,11 +4311,9 @@ */ if (range_skip >= u->file_size || range_end >= u->file_size) { - static const char msg = "Requested range not satisfiable"; - u->cb_416_arg.u = u; upload_http_extra_callback_add(u, upload_416_extra, &u->cb_416_arg); - upload_send_error(u, 416, msg); + upload_send_error(u, 416, N_("Requested range not satisfiable")); return FALSE; } @@ -3984,8 +4325,6 @@ */ if (range_unavailable) { - static const char msg = "Requested range not available yet"; - g_assert(sha1_hash_available(u->sf)); g_assert(GNET_PROPERTY(pfsp_server) || GNET_PROPERTY(pfsp_rare_server)); @@ -3993,7 +4332,8 @@ upload_http_extra_callback_add(u, upload_http_content_urn_add, &u->cb_sha1_arg); - upload_send_error(u, 416, msg); /* Same for HEAD or GET */ + /* Same for HEAD or GET */ + upload_send_error(u, 416, N_("Requested range not available yet")); return FALSE; } @@ -4020,8 +4360,8 @@ u->parq_ul = parq_upload_get(u, header); if (u->parq_ul == NULL) { upload_error_remove(u, 503, - parq_upload_queue_full(u) ? "Queue full" : - "Another connection is still active"); + parq_upload_queue_full(u) ? N_("Queue full") : + N_("Another connection is still active")); return FALSE; } @@ -4067,7 +4407,7 @@ delay = 60; /* Let them retry in a minute, only */ - gm_snprintf(retry_after, sizeof(retry_after), + str_bprintf(retry_after, sizeof(retry_after), "Retry-After: %u\r\n", (unsigned) delay); /* @@ -4076,9 +4416,10 @@ * -- JA, 19/05/'03 */ upload_error_remove_ext(u, retry_after, 403, - "%s not honoured; removed from PARQ queue", + N_("%s not honoured; removed from PARQ queue"), u->was_actively_queued ? - "Minimum retry delay" : "Retry-After"); + N_("Minimum retry delay") : + "Retry-After" /* HTTP header name, don't translate */); return FALSE; } @@ -4108,16 +4449,16 @@ upload_is_enabled() && GNET_PROPERTY(bws_out_enabled) && !wd_is_awake(stall_wd) && - (gulong) bsched_pct(BSCHED_BWS_OUT) + (ulong) bsched_pct(BSCHED_BWS_OUT) < GNET_PROPERTY(ul_usage_min_percentage) && - (gulong) bsched_avg_pct(BSCHED_BWS_OUT) + (ulong) bsched_avg_pct(BSCHED_BWS_OUT) < GNET_PROPERTY(ul_usage_min_percentage) ) { if (parq_upload_request_force(u, u->parq_ul)) { parq_allows = TRUE; if (GNET_PROPERTY(upload_debug)) g_debug( - "overriden slot limit because u/l b/w used at " + "overridden slot limit because u/l b/w used at " "%lu%% (minimum set to %d%%)", bsched_avg_pct(BSCHED_BWS_OUT), GNET_PROPERTY(ul_usage_min_percentage)); @@ -4127,7 +4468,7 @@ if (!parq_allows) { if (u->status == GTA_UL_QUEUED) { send_upload_error(u, 503, - "Queued (slot %d, ETA: %s)", + N_("Queued (slot %d, ETA: %s)"), parq_upload_lookup_position(u), short_time_ascii(parq_upload_lookup_eta(u))); @@ -4139,7 +4480,7 @@ expect_http_header(u, GTA_UL_QUEUED); return FALSE; } else if (parq_upload_queue_full(u)) { - upload_error_remove(u, 503, "Queue full"); + upload_error_remove(u, 503, N_("Queue full")); } else { upload_error_remove(u, 503, N_("Queued (slot %d, ETA: %s)"), @@ -4159,25 +4500,13 @@ g_assert(NULL == u->file); /* File opened each time */ - /* Open the file for reading. */ + /* + * Open the file for reading. + */ + u->file = file_object_open(shared_file_path(u->sf), O_RDONLY); - if (!u->file) { - int fd, flags; - /* If this is a partial file, we open it with O_RDWR so that - * the file descriptor can be shared with download operations - * for the same file. */ - if (NULL == u->file_info || (u->file_info->flags & FI_F_SEEDING)) { - flags = O_RDONLY; - } else { - flags = O_RDWR; - } - fd = file_absolute_open(shared_file_path(u->sf), flags, 0); - if (fd >= 0) { - u->file = file_object_new(fd, shared_file_path(u->sf), flags); - } - } - if (!u->file) { + if (NULL == u->file) { upload_error_not_found(u, NULL); return FALSE; } @@ -4268,7 +4597,7 @@ */ { - + const char *http_msg; int http_code; @@ -4281,7 +4610,7 @@ } if (!upload_send_http_status(u, u->keep_alive, http_code, http_msg)) { - upload_remove(u, _("Cannot send whole HTTP status")); + upload_remove(u, N_("Cannot send whole HTTP status")); return FALSE; } } @@ -4342,7 +4671,7 @@ if (buf != NULL) { host_addr_t addr; - guint16 port; + uint16 port; if (string_to_host_addr_port(buf, NULL, &addr, &port)) { u->gnet_addr = addr; u->gnet_port = port; @@ -4354,7 +4683,7 @@ static void upload_set_tos(struct upload *u) { - gboolean known_for_stalling; + bool known_for_stalling; upload_check(u); @@ -4407,7 +4736,7 @@ g_strlcpy(host, h, 1 + len); if (':' == *ep) { - guint32 v; + uint32 v; int error; ep++; /* Skip ':' */ @@ -4421,12 +4750,12 @@ uri = ep; } else { const char *value; - + if (header && NULL != (value = header_get(header, "Host"))) { g_strlcpy(host, value, host_size); } } - return deconstify_gchar(uri); + return deconstify_char(uri); } static void @@ -4443,16 +4772,16 @@ } } -static guint64 -get_content_length(header_t *header) +static uint64 +get_content_length(const header_t *header) { const char *value; - guint64 length = 0; - + uint64 length = 0; + value = header_get(header, "Content-Length"); if (value) { int error; - + length = parse_uint64(value, NULL, 10, &error); if (error) { length = (filesize_t)-1; @@ -4465,7 +4794,7 @@ upload_handle_connection_header(struct upload *u, header_t *header) { const char *buf; - + /* * Do we have to keep the connection after this request? */ @@ -4490,11 +4819,11 @@ * * @return TRUE if we're going to actually serve the request. */ -static gboolean +static bool upload_request_special(struct upload *u, const header_t *header) { int flags = 0; - + u->file_size = 0; if (u->browse_host) { const char *buf; @@ -4526,6 +4855,8 @@ if (buf) { if (strtok_case_has(buf, ",", "application/x-gnutella-packets")) { flags |= BH_F_QHITS; + } else if (strtok_case_has(buf, ",", "application/x-gnutella2")) { + flags |= BH_F_QHITS | BH_F_G2; } else if ( strtok_has(buf, ",;", "*/*") || strtok_case_has(buf, ",;", "text/html") || @@ -4533,7 +4864,7 @@ ) { flags |= BH_F_HTML; /* A browser probably */ } else { - upload_send_error(u, 406, "Not Acceptable"); + upload_send_error(u, 406, N_("Not Acceptable")); return FALSE; } } @@ -4547,6 +4878,8 @@ "Content-Type: text/html; charset=utf-8\r\n"); } else { upload_http_extra_line_add(u, + (flags & BH_F_G2) ? + "Content-Type: application/x-gnutella2\r\n" : "Content-Type: application/x-gnutella-packets\r\n"); } @@ -4566,8 +4899,9 @@ upload_http_extra_line_add(u, content_encoding); } - gm_snprintf(name, sizeof name, - _("<Browse Host Request> %s%s%s"), + str_bprintf(name, sizeof name, + _("<Browse Host %sRequest> %s%s%s"), + (flags & BH_F_G2) ? "G2 " : "", (flags & BH_F_HTML) ? "HTML" : _("query hits"), (flags & BH_F_DEFLATE) ? _(", deflate") : (flags & BH_F_GZIP) ? _(", gzip") : "", @@ -4576,7 +4910,7 @@ atom_str_change(&u->name, name); } else if (u->thex) { char *name; - + name = str_cmsg(_("<THEX data for %s>"), u->name); atom_str_change(&u->name, name); HFREE_NULL(name); @@ -4584,10 +4918,10 @@ upload_http_extra_line_add(u, "Content-Type: application/dime\r\n"); if (!(flags & THEX_UPLOAD_F_CHUNKED)) { - + u->file_size = thex_upload_get_content_length(u->thex); if (0 == u->file_size) { - upload_send_error(u, 500, "THEX failure"); + upload_send_error(u, 500, N_("THEX failure")); return FALSE; } u->pos = 0; @@ -4600,7 +4934,7 @@ } if (!upload_send_http_status(u, u->keep_alive, 200, "OK")) { - upload_remove(u, _("Cannot send whole HTTP status")); + upload_remove(u, N_("Cannot send whole HTTP status")); return FALSE; } @@ -4649,6 +4983,254 @@ } /** + * Upgrade the upload socket to TLS, then invoke the specified callback with + * the upload to terminate the action that was being processed before the + * upgrade, in order to reply once the switch has been made. + * + * Note that the connection will be forcefully closed if the upgrade does + * not succeed, i.e. TLS cannot handshake with the remote client. + */ +static void +upload_tls_upgrade(struct upload *u, notify_fn_t upgraded) +{ + gnutella_socket_t *s; + char buf80; + + upload_check(u); + socket_check(u->socket); + + s = u->socket; + + g_assert(!socket_uses_tls(s)); + g_assert(0 == s->pos); /* No unread data after request */ + + if (GNET_PROPERTY(upload_debug)) { + g_debug("UL request #%u from %s (%s): upgrading to TLS", + u->reqnum, host_addr_to_string(u->addr), upload_vendor_str(u)); + } + + /* + * There is no Content-Length line to generate since this is a + * continuation header: the client must continue to read after + * upgrading the socket on its side. + */ + + str_bprintf(buf, sizeof buf, "Upgrade: TLS/1.0, HTTP/%d.%d\r\n", + u->http_major, u->http_minor); + + upload_http_extra_line_add(u, buf); + upload_http_extra_line_add(u, "Connection: Upgrade\r\n"); + upload_send_http_status(u, TRUE, 101, "Switching Protocols"); + + /* + * Because socket_tls_upgrade() guarantees that the socket will not be + * destroyed synchronously on error, we can access the upload structure + * upon return. + */ + + socket_tls_upgrade(s, upgraded, u); + u->tls_upgraded = TRUE; /* In progress, will succeed hopefully */ +} + +/* + * Perform necessary cleanup if we come from a TLS upgrade, since then we don't + * clone the upload. This is necessary before re-entering upload_request(). + */ +static void +upload_request_cleanup(struct upload *u) +{ + u->hevcnt = 0; +} + +/** + * Finish the OPTIONS request (possibly after switching the socket TLS). + */ +static void +upload_options_finish(struct upload *u) +{ + upload_check(u); + + upload_http_extra_line_add(u, "Content-Length: 0\r\n"); + upload_send_http_status(u, u->keep_alive, 200, "OK"); + + if (u->keep_alive) { + HFREE_NULL(u->request); + upload_request_cleanup(u); + upload_wait_new_request(u); + } else { + upload_remove(u, no_reason); + } +} + +/** + * Check whether upload wants to be upgraded to TLS. + * + * @return TRUE if remote host wants a TLS upgrade, and we can fullfil it. + */ +static bool +upload_wants_tls_upgrade(const struct upload *u, const header_t *header) +{ + const char *field; + + if (!tls_enabled() || socket_uses_tls(u->socket)) + return FALSE; + + field = header_get(header, "Upgrade"); + if (NULL == field || !strtok_case_has(field, ",", "TLS/1.0")) + return FALSE; + + field = header_get(header, "Connection"); + if (NULL == field || 0 != ascii_strcasecmp(field, "upgrade")) + return FALSE; + + return TRUE; +} + +/** + * Handle an OPTIONS request. + */ +static void +upload_options_handle(struct upload *u, const header_t *header, const char *uri) +{ + upload_check(u); + + if ((u->http_major == 1 && u->http_minor >= 1) || u->http_major > 1) { + /* + * An "OPTIONS * HTTP/1.1" request is for requesting a mandatory + * upgrade to TLS -- see RFC-2817. + */ + + if (0 == strcmp(uri, "*")) { + if (!upload_wants_tls_upgrade(u, header)) + goto done; + + /* + * We have all the necessary headers to update the socket to TLS! + * + * After the upgrade,we'll call upload_options_finish() to respond + * to the original OPTIONS request, on top of TLS this time. + */ + + g_assert(header == io_header(u->io_opaque)); + + upload_tls_upgrade(u, (notify_fn_t) upload_options_finish); + return; + } else { + goto ok; + } + } else { + goto ok; + } + +ok: + upload_http_extra_line_add(u, ALLOW); + /* FALL THROUGH */ + +done: + upload_options_finish(u); +} + +struct upload_sink_ctx { + struct upload *u; + const header_t *header; + const char *uri; + size_t amount; +}; + +/** + * Input callback to sink data. + */ +static void +upload_sink_data(void *data, int unused_source, inputevt_cond_t cond) +{ + struct upload_sink_ctx *ctx = data; + struct upload *u = ctx->u; + char buf512; + ssize_t r; + + (void) unused_source; + g_assert(size_is_positive(ctx->amount)); + upload_check(u); + + if (cond & INPUT_EVENT_EXCEPTION) { + socket_eof(u->socket); + upload_remove(u, _("EOF while sinking")); + return; + } + + while (ctx->amount != 0) { + size_t n = MIN(ctx->amount, N_ITEMS(buf)); + r = bws_read(BSCHED_BWS_IN, &u->socket->wio, buf, n); + if (-1 == r) { + upload_remove(u, _("Read error while sinking: %m")); + return; + } + ctx->amount -= r; + if (UNSIGNED(r) < n) + break; + } + + if (0 == ctx->amount) { + /* + * Done with input sink, now process the request. + */ + + socket_evt_clear(u->socket); + upload_options_handle(u, ctx->header, ctx->uri); + WFREE(ctx); + } +} + +/** + * Got an OPTIONS request. + */ +static void +upload_options_request(struct upload *u, + const header_t *header, const char *uri) +{ + uint64 len = get_content_length(header); + + if (len > UPLOAD_MAX_SINK) { + upload_send_error(u, 400, N_("Content Too Large")); + return; + } + + /* + * Sink (ignore) any content in the OPTIONS request. + */ + + if (len != 0) { + struct upload_sink_ctx *ctx; + + WALLOC0(ctx); + ctx->u = u; + ctx->header = header; + ctx->uri = uri; + ctx->amount = len; + socket_evt_set(u->socket, INPUT_EVENT_RX, upload_sink_data, ctx); + return; + } + + upload_options_handle(u, header, uri); +} + +/** + * Re-invoke upload_request() after a TLS connection upgrade. + */ +static void +upload_request_restart(void *arg) +{ + struct upload *u = arg; + + upload_check(u); + socket_check(u->socket); + g_assert(NULL == u->socket->getline); + + upload_request_cleanup(u); + upload_request(u, io_header(u->io_opaque)); +} + +/** * Called to initiate the upload once all the HTTP headers have been * read. Validate the request, and begin processing it if all OK. * Otherwise cancel the upload. @@ -4659,7 +5241,7 @@ char *search, *uri; time_t now = tm_time(); char host1 + MAX_HOSTLEN; - gboolean first_request; + bool first_request, options_req = FALSE; upload_check(u); @@ -4668,7 +5250,7 @@ * the following items are always released/cleared in advance. */ - g_assert(NULL == u->request); + g_assert(NULL == u->request || NULL == u->socket->getline); g_assert(0 == u->hevcnt); g_assert(NULL == u->sf); g_assert(NULL == u->name); @@ -4679,6 +5261,15 @@ u->was_actively_queued = FALSE; + /* + * Have to save this early -- we can come back here during TLS upgrades. + */ + + if (NULL == u->request) { + u->request = h_strdup(getline_str(u->socket->getline)); + getline_free_null(&u->socket->getline); + } + switch (u->status) { case GTA_UL_WAITING: u->is_followup = !u->last_was_error; @@ -4704,6 +5295,18 @@ if (d > IO_RTT_STALL) { upload_large_followup_rtt(u, d); } + entropy_harvest_single(VARLEN(d)); + } + + /* + * Entropy harvesting... + */ + + { + host_addr_t addr = u->socket->addr; + uint16 port = u->socket->port; + + entropy_harvest_small(VARLEN(addr), VARLEN(port), NULL); } /* @@ -4716,15 +5319,11 @@ u->last_update = now; /* Done reading headers */ u->from_browser = upload_likely_from_browser(header); - u->request = h_strdup(getline_str(u->socket->getline)); u->downloaded = extract_downloaded(u, header); u->status = GTA_UL_SENDING; - getline_free(u->socket->getline); - u->socket->getline = NULL; - if (GNET_PROPERTY(upload_trace) & SOCK_TRACE_IN) { - g_debug("----%s Request%s #%u from %s%s%s:\n%s", + g_debug("----%s HTTP Request%s #%u from %s%s%s:\n%s", u->is_followup ? "Follow-up" : "Incoming", u->last_was_error ? " (after error)" : "", u->reqnum, @@ -4736,14 +5335,14 @@ } if (u->last_was_error) - gnet_stats_count_general(GNR_CLIENT_FOLLOWUP_AFTER_ERROR, 1); + gnet_stats_inc_general(GNR_CLIENT_FOLLOWUP_AFTER_ERROR); u->last_was_error = FALSE; /* * Some headers are sent back only once on a given connection, the * remote host being supposed to cache the values we provide. - * + * * If the request is a follow-up or a new request after being actively * queued (the request is not a follow-up in that case, just a retry * attempt of an initial request), then we consider it is not the first @@ -4770,52 +5369,14 @@ */ upload_request_handle_user_agent(u, header); - extract_fw_node_info(u, header); - feed_host_cache_from_headers(header, HOST_ANY, FALSE, u->addr, - upload_vendor_str(u)); - - if (u->push && header_get_feature("tls", header, NULL, NULL)) { - tls_cache_insert(u->addr, u->socket->port); - } - - /* - * Cache whether remote host supports / wants firewalled locations. - */ - - u->fwalt |= header_get_feature("fwalt", header, NULL, NULL); - - /* - * IPv6-Ready: check remote support of IPv6. - */ - - u->net = HOST_NET_IPV4; - - { - unsigned major, minor; - - if (header_get_feature("IP", header, &major, &minor)) { - if (INET_IP_V6READY == major) { - u->net = (INET_IP_NOV4 == minor) ? - HOST_NET_IPV6 : HOST_NET_BOTH; - } - } - } /* * Make sure there is the HTTP/x.x tag at the end of the request, * thereby ruling out the HTTP/0.9 requests. - * - * This has to be done early, and before calling get_file_to_upload() - * or the getline_length() call will no longer represent the length of - * the string, since URL-unescaping happens inplace and can "shrink" - * the request. */ - if (upload_http_version(u, u->request, strlen(u->request))) { - /* Get rid of the trailing HTTP/<whatever> */ - remove_trailing_http_tag(u->request); - } else { - upload_error_remove(u, 500, "Unknown/Missing Protocol Tag"); + if (!upload_http_version(u, u->request, strlen(u->request))) { + upload_error_remove(u, 500, N_("Unknown/Missing Protocol Tag")); return; } @@ -4835,6 +5396,23 @@ } } + /* + * If HTTP/1.1 or above, check the Host header. + * + * We require it because HTTP does, but we don't really care for + * now. Moreover, we might not know our external IP correctly, + * so we have little ways to check that the Host refers to us. + * + * --RAM, 11/04/2002 + */ + + if ((u->http_major == 1 && u->http_minor >= 1) || u->http_major > 1) { + if (NULL == header_get(header, "Host")) { + upload_send_error(u, 400, N_("Missing Host Header")); + return; + } + } + /* Separate the HTTP method (like GET or HEAD) */ { const char *endptr; @@ -4843,47 +5421,70 @@ * If `head_only' is true, the request was a HEAD and we're only going * to send back the headers. */ - + if (NULL != (endptr = is_strprefix(u->request, "HEAD"))) { u->head_only = TRUE; } else if (NULL != (endptr = is_strprefix(u->request, "GET"))) { u->head_only = FALSE; + } else if (NULL != (endptr = is_strprefix(u->request, "OPTIONS"))) { + options_req = TRUE; } if (endptr && is_ascii_blank(endptr0)) { uri = skip_ascii_blanks(endptr); } else { - upload_send_error(u, 501, "Not Implemented"); + upload_send_error(u, 501, N_("Not Implemented")); return; } } - upload_determine_peer_address(u, header); + /* + * The OPTIONS request must be dealt with specially. + */ - if (0 != get_content_length(header)) { - /* - * Make sure there is no content sent along the request. - * We could sink it, but no Gnutella servent should ever need to - * send content along with GET/HEAD. - * --RAM, 2006-08-15 - */ - upload_error_remove(u, 403, "No Content Allowed"); + if (options_req) { + /* Get rid of the trailing HTTP/<whatever> at the end of the request */ + remove_trailing_http_tag(uri); + + upload_options_request(u, header, uri); return; } - search = strchr(uri, '?'); - if (search) { - *search++ = '\0'; + /* + * Check whether they want to upgrade the connection to TLS. + */ + + if (upload_wants_tls_upgrade(u, header)) { /* - * The search cannot be URL-decoded yet because that could - * destroy the '&' boundaries. + * We have all the necessary headers to update the socket to TLS! + * + * After the upgrade,we'll call upload_request() again to respond + * to the original request, on top of TLS this time: this is why + * we need to keep the header structure around (what the client + * sent us) to be able to resume processing after the upgrade. */ + + g_assert(header == io_header(u->io_opaque)); /* Needed to resume */ + + upload_tls_upgrade(u, upload_request_restart); + return; } + /* + * Get rid of the trailing HTTP/<whatever> at the end of the request + * + * This must come after the TLS upgrade checks, because when we re-enter + * the routine, we still need to find the protocol tags at the end of + * the request line. + */ + + remove_trailing_http_tag(uri); + /* Extract the host and path from an absolute URI */ + uri = upload_parse_uri(header, uri, host, sizeof host); if (NULL == uri) { - upload_send_error(u, 400, "Bad URI"); + upload_send_error(u, 400, N_("Bad URI")); return; } @@ -4892,27 +5493,70 @@ !url_unescape(uri, TRUE) || 0 != url_canonize_path(uri) ) { - upload_send_error(u, 400, "Bad Path"); + upload_send_error(u, 400, N_("Bad Path")); return; } /* - * If HTTP/1.1 or above, check the Host header. - * - * We require it because HTTP does, but we don't really care for - * now. Moreover, we might not know our external IP correctly, - * so we have little ways to check that the Host refers to us. - * - * --RAM, 11/04/2002 + * We don't expect any content with GET or HEAD! */ - if ((u->http_major == 1 && u->http_minor >= 1) || u->http_major > 1) { - if (NULL == header_get(header, "Host")) { - upload_send_error(u, 400, "Missing Host Header"); - return; + if (0 != get_content_length(header)) { + /* + * Make sure there is no content sent along the request. + * We could sink it, but no Gnutella servent should ever need to + * send content along with GET/HEAD. + * --RAM, 2006-08-15 + */ + upload_error_remove(u, 403, N_("No Content Allowed")); + return; + } + + /* + * Gnutella-specific HTTP header processing. + */ + + upload_determine_peer_address(u, header); + extract_fw_node_info(u, header); + feed_host_cache_from_headers(header, HOST_ANY, FALSE, u->addr, + upload_vendor_str(u)); + + if (u->push && header_get_feature("tls", header, NULL, NULL)) { + tls_cache_insert(u->addr, u->socket->port); + } + + /* + * Cache whether remote host supports / wants firewalled locations. + */ + + u->fwalt |= header_get_feature("fwalt", header, NULL, NULL); + + /* + * IPv6-Ready: check remote support of IPv6. + */ + + u->net = HOST_NET_IPV4; + + { + unsigned major, minor; + + if (header_get_feature("IP", header, &major, &minor)) { + if (INET_IP_V6READY == major) { + u->net = (INET_IP_NOV4 == minor) ? + HOST_NET_IPV6 : HOST_NET_BOTH; + } } } + search = strchr(uri, '?'); + if (search) { + *search++ = '\0'; + /* + * The search cannot be URL-decoded yet because that could + * destroy the '&' boundaries. + */ + } + /* * Idea: * @@ -4953,7 +5597,7 @@ */ if ((u->flags & UPLOAD_F_WAS_PLAIN) && upload_is_special(u)) - gnet_stats_count_general(GNR_CLIENT_RESOURCE_SWITCHING, 1); + gnet_stats_inc_general(GNR_CLIENT_RESOURCE_SWITCHING); /* Pick up the X-Remote-IP or Remote-IP header */ node_check_remote_ip_header(u->addr, header); @@ -4982,7 +5626,7 @@ /* Send X-Push-Proxy each time: might have changed! */ upload_http_extra_callback_add(u, node_http_proxies_add, &u->net); } - + /* * Include X-Hostname the first time we reply and if we have a * known hostname, for which the user gave permission to advertise. @@ -5009,7 +5653,7 @@ */ if (!upload_is_enabled()) { - upload_error_remove(u, 500, "Sharing currently disabled"); + upload_error_remove(u, 500, N_("Sharing currently disabled")); return; } @@ -5020,7 +5664,7 @@ upload_fire_upload_info_changed(u); if (u->flags & UPLOAD_F_LIMITED) { - upload_error_remove(u, 403, _("Limited connection")); + upload_error_remove(u, 403, N_("Limited connection")); return; } @@ -5083,6 +5727,7 @@ socket_check(u->socket); + entropy_harvest_time(); gnet_prop_incr_guint32(PROP_TOTAL_UPLOADS); upload_fire_upload_info_changed(u); /* gui must update last state */ @@ -5110,13 +5755,13 @@ * @return TRUE if an exception occured, the upload has been removed * in this case. FALSE if everything is OK. */ -static gboolean +static bool upload_handle_exception(struct upload *u, inputevt_cond_t cond) { if (cond & INPUT_EVENT_EXCEPTION) { /* If we can't write then we don't want it, kill the socket */ socket_eof(u->socket); - upload_remove(u, _("Write exception")); + upload_remove(u, N_("Write exception")); return TRUE; } @@ -5127,13 +5772,13 @@ * Called when output source can accept more data. */ static void -upload_writable(gpointer obj, int unused_source, inputevt_cond_t cond) +upload_writable(void *obj, int unused_source, inputevt_cond_t cond) { struct upload *u = cast_to_upload(obj); ssize_t written; filesize_t amount; size_t available; - gboolean using_sendfile; + bool using_sendfile; (void) unused_source; @@ -5165,7 +5810,7 @@ available = MIN(amount, READ_BUF_SIZE); before = pos = u->pos; written = bio_sendfile(&u->sendfile_ctx, u->bio, - file_object_get_fd(u->file), &pos, available); + file_object_fd(u->file), &pos, available); g_assert((ssize_t) -1 == written || (fileoffset_t) written == pos - before); @@ -5193,11 +5838,11 @@ g_assert(u->buf_size > 0); ret = file_object_pread(u->file, u->buffer, u->buf_size, u->pos); if ((ssize_t) -1 == ret) { - upload_remove(u, _("File read error: %s"), g_strerror(errno)); + upload_remove(u, N_("File read error: %s"), g_strerror(errno)); return; } if (0 == ret) { - upload_remove(u, _("File EOF?")); + upload_remove(u, N_("File EOF?")); return; } u->bsize = (size_t) ret; @@ -5230,11 +5875,11 @@ } if (!is_temporary_error(e)) { socket_eof(u->socket); - upload_remove(u, _("Data write error: %s"), g_strerror(e)); + upload_remove(u, N_("Data write error: %s"), g_strerror(e)); } return; } else if (written == 0) { - upload_remove(u, _("No bytes written, source may be gone")); + upload_remove(u, N_("No bytes written, source may be gone")); return; } @@ -5279,7 +5924,7 @@ } static inline ssize_t -upload_special_write(struct upload *u, gconstpointer data, size_t len) +upload_special_write(struct upload *u, const void *data, size_t len) { ssize_t r; @@ -5297,7 +5942,7 @@ * Callback invoked when the special stack has been fully flushed. */ static void -upload_special_flushed(gpointer arg) +upload_special_flushed(void *arg) { struct upload *u = cast_to_upload(arg); @@ -5337,7 +5982,7 @@ * Called when output source can accept more data. */ static void -upload_special_writable(gpointer obj) +upload_special_writable(void *obj) { struct upload *u = cast_to_upload(obj); ssize_t written; @@ -5357,7 +6002,7 @@ g_assert(u->buf_size > 0); ret = upload_special_read(u); if ((ssize_t) -1 == ret) { - upload_remove(u, _("Special read error: %s"), g_strerror(errno)); + upload_remove(u, N_("Special read error: %s"), g_strerror(errno)); return; } if (0 == ret) { @@ -5401,7 +6046,7 @@ g_return_if_fail(u); if (!UPLOAD_IS_COMPLETE(u)) { parq_upload_force_remove(u); - upload_remove(u, _("Explicitly killed")); + upload_remove(u, N_("Explicitly killed")); } } @@ -5411,47 +6056,51 @@ void upload_kill_addr(const host_addr_t addr) { - GSList *sl, *to_remove = NULL; + pslist_t *sl, *to_remove = NULL; - for (sl = list_uploads; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(list_uploads, sl) { struct upload *u = cast_to_upload(sl->data); - if (host_addr_equal(u->addr, addr) && !UPLOAD_IS_COMPLETE(u)) - to_remove = g_slist_prepend(to_remove, u); + if (host_addr_equiv(u->addr, addr) && !UPLOAD_IS_COMPLETE(u)) + to_remove = pslist_prepend(to_remove, u); } - for (sl = to_remove; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(to_remove, sl) { struct upload *u = cast_to_upload(sl->data); parq_upload_force_remove(u); - upload_remove(u, _("IP denying uploads")); + upload_remove(u, N_("IP denying uploads")); } - g_slist_free(to_remove); + pslist_free(to_remove); } /** * Check whether uploading is enabled: we have slots, and bandwidth. */ -gboolean +bool upload_is_enabled(void) { - return GNET_PROPERTY(max_uploads) > 0 && - bsched_bw_per_second(BSCHED_BWS_OUT) >= BW_OUT_MIN; + return GNET_PROPERTY(max_uploads) > 0 && ( + 0 == GNET_PROPERTY(ul_running) + GNET_PROPERTY(ul_quick_running) || + bsched_bw_per_second(BSCHED_BWS_OUT) >= BW_OUT_MIN + ); } /** * Initialize uploads. */ -G_GNUC_COLD void +void G_COLD upload_init(void) { - mesh_info = g_hash_table_new(mi_key_hash, mi_key_eq); + mesh_info = htable_create_any(mi_key_hash, mi_key_hash2, mi_key_eq); stalling_uploads = aging_make(STALL_CLEAR, host_addr_hash_func, host_addr_eq_func, wfree_host_addr); - upload_handle_map = idtable_new(); + upload_handle_map = idtable_new(32); push_requests = aging_make(PUSH_REPLY_FREQ, host_addr_hash_func, host_addr_eq_func, wfree_host_addr); + push_conn_failed = aging_make(PUSH_BAN_FREQ, + gnet_host_hash, gnet_host_equal, gnet_host_free_atom2); header_features_add_guarded(FEATURES_UPLOADS, "browse", BH_VERSION_MAJOR, BH_VERSION_MINOR, @@ -5482,7 +6131,7 @@ /** * Final cleanup at shutdown time. */ -G_GNUC_COLD void +void G_COLD upload_close(void) { while (list_uploads) { @@ -5495,11 +6144,12 @@ idtable_destroy(upload_handle_map); upload_handle_map = NULL; - g_hash_table_foreach(mesh_info, mi_free_kv, NULL); - gm_hash_table_destroy_null(&mesh_info); + htable_foreach(mesh_info, mi_free_kv, NULL); + htable_free_null(&mesh_info); aging_destroy(&stalling_uploads); aging_destroy(&push_requests); + aging_destroy(&push_conn_failed); wd_free_null(&early_stall_wd); wd_free_null(&stall_wd); } @@ -5536,6 +6186,7 @@ info->upload_handle = u->upload_handle; info->push = u->push; info->encrypted = u->socket && socket_uses_tls(u->socket); + info->tls_upgraded = u->tls_upgraded; info->partial = u->file_info != NULL; info->gnet_addr = u->gnet_addr; info->gnet_port = u->gnet_port; @@ -5590,29 +6241,29 @@ si->avg_bps++; } -GSList * +pslist_t * upload_get_info_list(void) { - GSList *sl, *sl_info = NULL; + pslist_t *sl, *sl_info = NULL; - for (sl = list_uploads; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(list_uploads, sl) { struct upload *u = cast_to_upload(sl->data); - sl_info = g_slist_prepend(sl_info, upload_get_info(u->upload_handle)); + sl_info = pslist_prepend(sl_info, upload_get_info(u->upload_handle)); } - return g_slist_reverse(sl_info); + return pslist_reverse(sl_info); } void -upload_free_info_list(GSList **sl_ptr) +upload_free_info_list(pslist_t **sl_ptr) { g_assert(sl_ptr); if (*sl_ptr) { - GSList *sl; + pslist_t *sl; - for (sl = *sl_ptr; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(*sl_ptr, sl) { upload_free_info(sl->data); } - g_slist_free(*sl_ptr); + pslist_free(*sl_ptr); *sl_ptr = NULL; } }
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/uploads.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/uploads.h
Changed
@@ -62,10 +62,10 @@ struct upload { enum upload_magic magic; gnet_upload_t upload_handle; - guint32 flags; /**< Operating flags */ + uint32 flags; /**< Operating flags */ upload_stage_t status; int error_sent; /**< HTTP error code sent back */ - gpointer io_opaque; /**< Opaque I/O callback information */ + void *io_opaque; /**< Opaque I/O callback information */ struct parq_ul_queued *parq_ul; /**< PARQ information */ struct gnutella_socket *socket; @@ -86,16 +86,16 @@ struct upload_http_cb cb_status_arg; struct upload_http_cb cb_length_arg; http_extra_desc_t hev16; - guint hevcnt; + uint hevcnt; char *buffer; int bpos; int bsize; int buf_size; - guint file_index; - guint reqnum; /**< Request number, incremented when serving */ - guint error_count; /**< Amount of errors on connection */ + uint file_index; + uint reqnum; /**< Request number, incremented when serving */ + uint error_count; /**< Amount of errors on connection */ time_t start_date; time_t last_update; @@ -103,8 +103,8 @@ host_addr_t addr; /**< Remote IP address */ host_addr_t gnet_addr; /**< Advertised remote IP address */ - guint16 gnet_port; /**< Advertised Gnet port, for browsing */ - guint16 country; /**< Country of origin, ISO3166 code */ + uint16 gnet_port; /**< Advertised Gnet port, for browsing */ + uint16 country; /**< Country of origin, ISO3166 code */ const char *user_agent; /**< Remote user agent */ const struct guid *guid; /**< Remote servent GUID (atom), if known */ @@ -136,6 +136,8 @@ unsigned last_was_error:1; /**< Whether last request was an error */ unsigned parq_status:1; unsigned fwalt:1; /**< Downloader accepts firewalled locations */ + unsigned g2:1; /**< Initiated via G2 /PUSH */ + unsigned tls_upgraded:1; /**< Was upgraded to TLS */ }; static inline void @@ -150,7 +152,7 @@ /** * Is upload special? */ -static inline gboolean +static inline bool upload_is_special(const struct upload *u) { return u->browse_host || u->thex != NULL; @@ -177,23 +179,24 @@ * Global Functions */ -gboolean upload_is_enabled(void); +struct g2_tree; + +bool upload_is_enabled(void); void upload_timer(time_t now); -void upload_remove(struct upload *, const char *, ...) G_GNUC_PRINTF(2, 3); -void handle_push_request(struct gnutella_node *); +void upload_remove(struct upload *, const char *, ...) G_PRINTF(2, 3); +void handle_push_request(struct gnutella_node *, const struct g2_tree *t); void upload_add(struct gnutella_socket *); -void upload_connect_conf(struct upload *); void upload_init(void); void upload_close(void); void upload_stop_all(struct dl_file_info *, const char *reason); -void upload_send_giv(const host_addr_t addr, guint16 port, guint8 hops, - guint8 ttl, guint32 file_index, const char *file_name, guint32 flags); -struct upload *upload_create(struct gnutella_socket *, gboolean push); +void upload_send_giv(const host_addr_t addr, uint16 port, uint8 hops, + uint8 ttl, uint32 file_index, const char *file_name, uint32 flags); +struct upload *upload_create(struct gnutella_socket *, bool push); void upload_fire_upload_info_changed(struct upload *); void expect_http_header(struct upload *, upload_stage_t new_status); -GSList *upload_get_info_list(void); -void upload_free_info_list(GSList **sl_ptr); +struct pslist *upload_get_info_list(void); +void upload_free_info_list(struct pslist **sl_ptr); struct upload *upload_alloc(void); void upload_free(struct upload **ptr);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/urpc.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/urpc.c
Changed
@@ -41,8 +41,12 @@ #include "lib/cq.h" #include "lib/gnet_host.h" +#include "lib/hashing.h" #include "lib/host_addr.h" +#include "lib/htable.h" +#include "lib/stringify.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ enum urpc_cb_magic { URPC_CB_MAGIC = 0x790f55e5U }; @@ -58,7 +62,7 @@ void *arg; /**< The user-defined callback parameter */ struct gnutella_socket *s; /**< The socket used to send/receive */ cevent_t *timeout_ev; /**< Callout queue timeout event */ - guint16 port; /**< The port to which we sent the request */ + uint16 port; /**< The port to which we sent the request */ }; static inline void @@ -70,20 +74,20 @@ g_assert(ucb->s != NULL); } -static GHashTable *pending; /**< Pending RPCs (socket -> urcp_cb) */ +static htable_t *pending; /**< Pending RPCs (socket -> urcp_cb) */ /** * Free the callback waiting indication. */ static void -urpc_cb_free(struct urpc_cb *ucb, gboolean in_shutdown) +urpc_cb_free(struct urpc_cb *ucb, bool in_shutdown) { urpc_cb_check(ucb); if (in_shutdown) { - (*ucb->cb)(URPC_TIMEOUT, ucb->addr, ucb->port, NULL, 0, ucb->arg); + (*ucb->cb)(URPC_ABORT, ucb->addr, ucb->port, NULL, 0, ucb->arg); } else { - g_hash_table_remove(pending, ucb->s); + htable_remove(pending, ucb->s); } cq_cancel(&ucb->timeout_ev); @@ -98,33 +102,40 @@ * socket buffer. */ static void -urpc_received(struct gnutella_socket *s, gboolean truncated) +urpc_received(const gnutella_socket_t *s, + const void *data, size_t len, bool truncated) { struct urpc_cb *ucb; inet_udp_got_incoming(s->addr); - ucb = g_hash_table_lookup(pending, s); + ucb = htable_lookup(pending, s); if (NULL == ucb) { g_warning("UDP got unexpected %s%zu-byte RPC reply from %s", - truncated ? "truncated " : "", s->pos, + truncated ? "truncated " : "", len, host_addr_port_to_string(s->addr, s->port)); return; } if (GNET_PROPERTY(udp_debug) > 1) { g_debug("UDP %s got %s%zu-byte RPC reply from %s", - ucb->what, truncated ? "truncated " : "", s->pos, + ucb->what, truncated ? "truncated " : "", len, host_addr_port_to_string(s->addr, s->port)); } /* - * Invoke user callback so that reply can be processed. + * If reply was truncated, fake a timeout. + * Otherwise invoke user callback so that reply can be processed. + */ + + (*ucb->cb)(truncated ? URPC_TIMEOUT : URPC_REPLY, + s->addr, s->port, data, len, ucb->arg); + + /* * Then discard the socket. */ - (*ucb->cb)(URPC_REPLY, s->addr, s->port, s->buf, s->pos, ucb->arg); urpc_cb_free(ucb, FALSE); } @@ -132,14 +143,13 @@ * RPC timed out. */ static void -urpc_timed_out(cqueue_t *unused_cq, gpointer obj) +urpc_timed_out(cqueue_t *cq, void *obj) { struct urpc_cb *ucb = obj; urpc_cb_check(ucb); - (void) unused_cq; - ucb->timeout_ev = NULL; + cq_zero(cq, &ucb->timeout_ev); if (GNET_PROPERTY(udp_debug)) { g_message("UDP %s RPC to %s timed out", @@ -170,7 +180,7 @@ */ int urpc_send(const char *what, - host_addr_t addr, guint16 port, const void *data, size_t len, + host_addr_t addr, uint16 port, const void *data, size_t len, unsigned long timeout, urpc_cb_t cb, void *arg) { struct urpc_cb *ucb; @@ -231,7 +241,7 @@ g_warning("unable to send whole %zu-byte UDP %s RPC to %s: " "only sent %zu byte%s", len, what, host_addr_port_to_string(addr, port), - r, 1 == r ? "" : "s"); + r, plural(r)); } } socket_free_null(&s); @@ -261,7 +271,7 @@ ucb->timeout_ev = cq_main_insert(timeout, urpc_timed_out, ucb); ucb->what = what; - g_hash_table_insert(pending, s, ucb); + htable_insert(pending, s, ucb); return 0; } @@ -269,10 +279,10 @@ /** * Do we have pending UDP RPCs? */ -gboolean +bool urpc_pending(void) { - return 0 != g_hash_table_size(pending); + return 0 != htable_count(pending); } /** @@ -281,11 +291,11 @@ void urpc_init(void) { - pending = g_hash_table_new(pointer_hash_func, NULL); + pending = htable_create(HASH_KEY_SELF, 0); } static void -urpc_free_kv(gpointer unused_key, gpointer val, gpointer unused_x) +urpc_free_kv(const void *unused_key, void *val, void *unused_x) { (void) unused_key; (void) unused_x; @@ -299,8 +309,8 @@ void urpc_close(void) { - g_hash_table_foreach(pending, urpc_free_kv, NULL); - gm_hash_table_destroy_null(&pending); + htable_foreach(pending, urpc_free_kv, NULL); + htable_free_null(&pending); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/urpc.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/urpc.h
Changed
@@ -43,6 +43,7 @@ */ enum urpc_ret { URPC_TIMEOUT, /**< timed out */ + URPC_ABORT, /**< abort notification */ URPC_REPLY /**< reply from host */ }; @@ -59,7 +60,7 @@ * @param len payload length * @param arg user-defined callback parameter */ -typedef void (*urpc_cb_t)(enum urpc_ret type, host_addr_t addr, guint16 port, +typedef void (*urpc_cb_t)(enum urpc_ret type, host_addr_t addr, uint16 port, const void *payload, size_t len, void *arg); /* @@ -67,10 +68,10 @@ */ int urpc_send(const char *what, - host_addr_t addr, guint16 port, const void *data, size_t len, + host_addr_t addr, uint16 port, const void *data, size_t len, unsigned long timeout, urpc_cb_t cb, void *arg); -gboolean urpc_pending(void); +bool urpc_pending(void); void urpc_init(void); void urpc_close(void);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/verify.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/verify.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2013 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -25,32 +25,69 @@ * @ingroup core * @file * - * Hash verification. + * Asynchronous hash computation. + * + * Computation is done in a separate thread, but this is invisible to the + * calling thread as callbacks happen in the calling thread context. + * + * Each verification thread is given a thread event queue (TEQ), and the + * calling thread needs to also create its own TEQ so that we can properly + * dispatch callbacks. + * + * As work is concurrently inserted into the verification lists, a notification + * event is sent to the computing thread to wake it up. + * + * On systems with 2 CPUs only, all the verifications are handled by one single + * thread, so we continue to use the legacy code, relying on the background + * task scheduler to properly arbitrate processing between the various hash + * verifications. + * + * As soon as there are 3 CPUs or more, all the verifications are handled in + * separate threads, but there are distinct background task schedulers created, + * so each thread can use almost all its processing ticks to actually compute + * the hash value. * * @author Raphael Manfredi - * @date 2002-2003 + * @date 2002-2003, 2013 */ #include "common.h" -#include "file_object.h" #include "verify.h" #include "if/gnet_property.h" #include "if/gnet_property_priv.h" +#include "lib/atomic.h" #include "lib/atoms.h" +#include "lib/barrier.h" #include "lib/bg.h" #include "lib/compat_misc.h" +#include "lib/constants.h" +#include "lib/cq.h" +#include "lib/entropy.h" #include "lib/file.h" +#include "lib/file_object.h" +#include "lib/getcpucount.h" #include "lib/halloc.h" +#include "lib/hashing.h" #include "lib/hashlist.h" +#include "lib/str.h" +#include "lib/stringify.h" /* For short_time_ascii() */ +#include "lib/teq.h" +#include "lib/thread.h" #include "lib/tm.h" #include "lib/walloc.h" #include "lib/override.h" /* Must be the last header included */ -#define HASH_BUF_SIZE (128 * 1024) /**< Size of the reading buffer */ +#define HASH_BUF_SIZE (128 * 1024) /**< Size of the reading buffer */ + +#define HASH_THREAD_MAX 2 /**< At most 2 hashing threads */ +#define VERIFY_DEFERRED 10 /**< ms: deferred free timeout */ +#define VERIFY_PROGRESS_NOTIFY 1 /**< s: progress notification */ + +#define VERIFY_INVALID_LOCAL_ID -1U enum verify_magic { VERIFY_MAGIC = 0x2dc84379U }; @@ -59,20 +96,27 @@ */ struct verify { enum verify_magic magic; /**< Magic number. */ - hash_list_t *files_to_hash; - struct bgtask *task; - struct verify_hash hash; - struct file_object *file; /**< The file object to access the file. */ + hash_list_t *files_to_hash; /**< Work queue */ + const struct verify_hash hash; /**< Hash-specific processing callbacks */ + struct bgtask *task; /**< Background task handling the processing */ + bgsched_t *sched; /**< Task scheduler for this thread */ + unsigned verify_stid; /**< Verification thread ID */ + + file_object_t *file; /**< The file object to access the file. */ filesize_t offset; /**< Current offset into the file. */ filesize_t start; /**< Start offset of range to verify. */ filesize_t end; /**< End offset of range to verify . */ time_t started; /**< Start time, to determine comp. rate */ + time_t last_progress; /**< Last time we informed about progress */ char *buffer; /**< Read buffer */ size_t buffer_size; /**< Size of buffer in bytes. */ + enum verify_status status; /**< Used for callback multiplexing. */ + uint8 shutdowned; /**< Flag indicating context was shutdown */ + + /* Fields copied from currently processed verify_file entry */ verify_callback callback; /**< User-specified callback function. */ void *user_data; /**< User-specified callback parameter. */ - enum verify_status status; /**< Used for callback multiplexing. */ }; static inline void @@ -113,8 +157,8 @@ const char *pathname; /**< Absolute path of the file */ filesize_t offset; /**< Offset to start at */ filesize_t amount; /**< Amount of bytes to hash */ - verify_callback callback; - void *user_data; + verify_callback callback; /**< User-specified callback function */ + void *user_data; /**< Callback argument */ }; static inline void @@ -128,14 +172,12 @@ verify_file_new(const char *pathname, filesize_t offset, filesize_t amount, verify_callback callback, void *user_data) { - static const struct verify_file zero_item; struct verify_file *item; - g_assert(pathname); - g_assert(callback); + g_assert(pathname != NULL); + g_assert(callback != NULL); - WALLOC(item); - *item = zero_item; + WALLOC0(item); item->magic = VERIFY_FILE_MAGIC; item->pathname = atom_str_get(pathname); item->offset = offset; @@ -158,30 +200,68 @@ } } +/* + * NOTA BENE: + * + * The user-specified callback is invoked through an inter-thread RPC because + * we do not know whether the requesting thread is prepared for concurrent + * accesses to the data structures accessed from the callback. + * + * We blindly use teq_safe_rpc() because we "know" the requesting thread is + * always going to be the main thread, which is also where the main callout + * queue runs. + * + * It is necessary to use teq_safe_rpc() because the processing callbacks can + * change properties that will in turn trigger some GTK processing when we + * are running with the GUI, to light some icon indicating that file hashing + * is running. Since we do not know about GTK locks, using teq_rpc() would + * cause problems when the TSIG_TEQ signal is handled and we are interrupting + * some other GTK call. + * --RAM, 2013-10-13 + * + * The teq_safe_rpc() routine is a cancellation point, but the verification + * thread is created as non-cancellable, so we do not have to worry about + * possible cancellation. + */ + +/** + * Verify callback dispatcher, invoked by the main thread. + */ +static void * +verify_cb(void *arg) +{ + struct verify *ctx = arg; + + verify_check(ctx); + g_assert(thread_is_main()); /* Funnelled to main thread */ + + return bool_to_pointer(ctx->callback(ctx, ctx->status, ctx->user_data)); +} + /** * If the callback returns FALSE, hashing of the current file will be * aborted and verify_failure() will be called afterwards. */ -static gboolean +static bool verify_start(struct verify *ctx) { verify_check(ctx); ctx->status = VERIFY_START; - return ctx->callback(ctx, ctx->status, ctx->user_data); + return pointer_to_bool(teq_safe_rpc(THREAD_MAIN, verify_cb, ctx)); } /** * If the callback returns FALSE, hashing of the current file will be * aborted and verify_failure() will be called afterwards. */ -static gboolean +static bool verify_progress(struct verify *ctx) { verify_check(ctx); ctx->status = VERIFY_PROGRESS; - return ctx->callback(ctx, ctx->status, ctx->user_data); + return pointer_to_bool(teq_safe_rpc(THREAD_MAIN, verify_cb, ctx)); } static void @@ -190,7 +270,7 @@ verify_check(ctx); ctx->status = VERIFY_ERROR; - (void) ctx->callback(ctx, ctx->status, ctx->user_data); + (void) teq_safe_rpc(THREAD_MAIN, verify_cb, ctx); ctx->status = VERIFY_INVALID; } @@ -200,7 +280,7 @@ verify_check(ctx); ctx->status = VERIFY_SHUTDOWN; - (void) ctx->callback(ctx, ctx->status, ctx->user_data); + (void) teq_safe_rpc(THREAD_MAIN, verify_cb, ctx); ctx->status = VERIFY_INVALID; } @@ -210,10 +290,13 @@ verify_check(ctx); ctx->status = VERIFY_DONE; - (void) ctx->callback(ctx, ctx->status, ctx->user_data); + (void) teq_safe_rpc(THREAD_MAIN, verify_cb, ctx); ctx->status = VERIFY_INVALID; } +/** + * @return current verification status. + */ enum verify_status verify_status(const struct verify *ctx) { @@ -238,11 +321,11 @@ * The callback function may call this to obtain the amount of seconds * since hashing of the current file started. */ -guint +uint verify_elapsed(const struct verify *ctx) { time_delta_t d; - + verify_check(ctx); g_assert(VERIFY_INVALID != ctx->status); @@ -252,22 +335,23 @@ return d; } -static guint -verify_item_hash(gconstpointer key) +static uint +verify_item_hash(const void *key) { const struct verify_file *ctx = key; verify_file_check(ctx); - - return g_str_hash(ctx->pathname) + + return hashing_mix32( + string_mix_hash(ctx->pathname) ^ uint64_hash(&ctx->offset) ^ uint64_hash(&ctx->amount) - ^ pointer_hash_func(func_to_pointer(ctx->callback)) - ^ pointer_hash_func(ctx->user_data); + ^ pointer_hash(func_to_pointer(ctx->callback)) + ^ pointer_hash(ctx->user_data)); } static int -verify_item_equal(gconstpointer p, gconstpointer q) +verify_item_equal(const void *p, const void *q) { const struct verify_file *a = p, *b = q; @@ -281,53 +365,331 @@ a->user_data == b->user_data; } +/** + * Variables controlling asynchronous "cancellation" of verification threads. + * + * The verify_exit array is index by a small number (the "local thread ID") + * and tells the thread whether it has received a TSIG_TERM signal. + * + * The verify_threads array contains the ID of threads, and a linear lookup + * is used to find the proper "local thread ID", the index at which we find + * a matching thread ID. + */ +static bool verify_exitHASH_THREAD_MAX; +static unsigned verify_threadsHASH_THREAD_MAX; +static int verify_thread_count; + +/** + * Structure passed to verify_thread_has_work(). + */ +struct verify_work { + bgsched_t *bs; /**< Background task scheduler */ + int id; /**< Local thread ID */ +}; + +/** + * Is there work pending in the scheduler, or is thread terminated? + */ +static bool +verify_thread_has_work(void *arg) +{ + struct verify_work *w = arg; + + /* + * When the thread should exit, as indicated by verify_exit being set, + * we return TRUE to make sure we exit from the teq_wait() call. + */ + + return verify_exitw->id || 0 != bg_sched_runcount(w->bs); +} + +/** + * Compute local thread ID of verification thread. + */ +static unsigned +verify_thread_local_id(unsigned stid, bool panic) +{ + unsigned i; + + for (i = 0; i < N_ITEMS(verify_threads); i++) { + if (verify_threadsi == stid) + return i; + } + + if (panic) + s_error("%s(): cannot find %s", G_STRFUNC, thread_id_name(stid)); + + return VERIFY_INVALID_LOCAL_ID; /* Invalid ID, meaning not found */ +} + +/** + * Signal handler to terminate the thread. + */ +static void +verify_thread_terminate(int sig) +{ + unsigned i; + + g_assert(TSIG_TERM == sig); + + i = verify_thread_local_id(thread_small_id(), TRUE); + verify_exiti = TRUE; +} + +/** + * Arguments passed to the verification thread. + */ +struct verify_thread_arg { + const char *name; /* Thread name */ + barrier_t *b; /* Setup barrier */ + bgsched_t *sched; /* Background task scheduler to run */ +}; + +/** + * Verfication thread main loop. + */ +static void * +verify_thread_main(void *p) +{ + struct verify_thread_arg *args = p; + struct verify_work winfo; + int i; + + thread_set_name(args->name); + teq_create(); /* Queue to receive incoming work */ + barrier_wait(args->b); /* Thread has initialized */ + barrier_free_null(&args->b); + winfo.bs = args->sched; + WFREE_TYPE_NULL(args); + + if (GNET_PROPERTY(verify_debug)) + g_debug("verification %s started", thread_name()); + + /* + * Prepare for termination when receiveing a TSIG_TERM. + */ + + winfo.id = i = atomic_int_inc(&verify_thread_count); + + g_assert(i < HASH_THREAD_MAX); /* Not creating too many threads */ + + verify_threadsi = thread_small_id(); + thread_signal(TSIG_TERM, verify_thread_terminate); + + g_assert(verify_threadsi != 0); /* Not the main thread */ + + /* + * Process incoming work, until thread is terminated. + */ + + while (!verify_exiti) { + if (GNET_PROPERTY(verify_debug)) + g_debug("verification %s sleeping", thread_name()); + + teq_wait(verify_thread_has_work, &winfo); + + if (GNET_PROPERTY(verify_debug)) + g_debug("verification %s awoken", thread_name()); + + while (0 != bg_sched_run(winfo.bs)) + thread_check_suspended(); + } + + g_debug("verification %s exiting", thread_name()); + + bg_sched_destroy_null(&winfo.bs); + verify_threadsi = 0; /* Signals: can destroy verify context */ + + return NULL; +} + +/** + * Create a new verification thread with given name. + * + * This routine does not return until the verification thread has been + * correctly initialized, so that the caller can immediately start to + * enqueue work to the thread. + * + * @param v the verification context for which we create a thread + * @param name the background task scheduler to use in that thread + * @param name the created thread name + * + * @return thread ID, -1 on error. + */ +static int +verify_thread_create(struct verify *v, bgsched_t *bs, const char *name) +{ + barrier_t *b; + struct verify_thread_arg *args; + int r; + + b = barrier_new(2); + + WALLOC(args); + args->name = name; + args->b = barrier_refcnt_inc(b); + args->sched = bs; + + /* + * The verification thread is created as a detached thread because we + * do not expect any result from it. + * + * It is created as non-cancelable: to end it, we send it a TSIG_TERM. + */ + + r = thread_create(verify_thread_main, args, + THREAD_F_DETACH | THREAD_F_NO_CANCEL | + THREAD_F_NO_POOL | THREAD_F_PANIC, + THREAD_STACK_MIN); + + v->verify_stid = r; + v->sched = bs; + + barrier_wait(b); /* Wait for thread to initialize */ + barrier_free_null(&b); + + return r; +} + +/** + * Create a new verification thread if necessary. + */ +static void +verify_thread_create_if_needed(struct verify *v) +{ + static unsigned verify_id; + static bgsched_t *verify_bs; + long cpus = getcpucount(); + + g_assert(thread_is_main()); /* Always called from main thread */ + + /* + * When there are more than 2 CPUs, we are on a multi-core system and we + * create one thread per verification. If they have only 2 CPUs, then we + * just create a single thread to handle all the verifications. + */ + + if (cpus <= 2) { + if G_UNLIKELY(NULL == verify_bs) { + static const char name = "verify"; + + verify_bs = bg_sched_create(name, 500000); /* 500 ms */ + verify_id = verify_thread_create(v, verify_bs, name); + } else { + v->sched = verify_bs; + v->verify_stid = verify_id; + } + } else { + const char *tname = str_smsg("verify %s", verify_hash_name(v)); + const char *name = constant_str(tname); + + bgsched_t *bs = bg_sched_create(name, 1000000); /* 1 sec */ + (void) verify_thread_create(v, bs, name); + } +} + +/** + * Create a new verification context. + * + * @param hash Hash-specific callbacks for this hash verification + * + * @return verification context to which work can be requested via + * verify_enqueue() + */ struct verify * verify_new(const struct verify_hash *hash) { - static const struct verify zero_ctx; struct verify *ctx; g_assert(hash); - WALLOC(ctx); - *ctx = zero_ctx; + WALLOC0(ctx); ctx->magic = VERIFY_MAGIC; ctx->buffer_size = HASH_BUF_SIZE; ctx->buffer = halloc(ctx->buffer_size); - ctx->hash = *hash; + STATIC_ASSERT(sizeof ctx->hash == sizeof(struct verify_hash)); + *(struct verify_hash *) &ctx->hash = *hash; /* Assignment to "const" */ ctx->files_to_hash = hash_list_new(verify_item_hash, verify_item_equal); + hash_list_thread_safe(ctx->files_to_hash); + + verify_thread_create_if_needed(ctx); + return ctx; } +/** + * Callout queue callback to check whether we can free the verify context. + */ +static void +verify_deferred_free(cqueue_t *cq, void *data) +{ + struct verify *ctx = data; + unsigned i; + + verify_check(ctx); + + /* + * We do not free the verification context until the thread that uses it + * has not marked it was about to exit by clearing its corresponding + * entry in verify_threads. + */ + + i = verify_thread_local_id(ctx->verify_stid, FALSE); + + if (i != VERIFY_INVALID_LOCAL_ID) { + /* + * Thread has not terminated yet, could have pending RPCs... + */ + + if (GNET_PROPERTY(verify_debug) > 1) { + g_debug("verification %s for %s not terminated yet", + thread_id_name(ctx->verify_stid), verify_hash_name(ctx)); + } + + cq_insert(cq, VERIFY_DEFERRED, verify_deferred_free, ctx); + } else { + if (GNET_PROPERTY(verify_debug) > 1) { + g_debug("freeing %s verification context", verify_hash_name(ctx)); + } + + hash_list_free(&ctx->files_to_hash); + ctx->magic = 0; + WFREE(ctx); + } +} + +/** + * Free verification context and nullify its pointer. + * + * The actual physical disposal of the verification context is deferred until + * the thread responsible for handling the work has terminated. + */ void verify_free(struct verify **ptr) { struct verify *ctx = *ptr; - if (ptr) { + if (ctx != NULL) { verify_check(ctx); + g_assert(!ctx->shutdowned); - if (ctx->task) { + if (ctx->task != NULL) { bg_task_cancel(ctx->task); ctx->task = NULL; } - if (VERIFY_INVALID != ctx->status) { - verify_shutdown(ctx); - } - if (ctx->files_to_hash) { - struct verify_file *item; - while (NULL != (item = hash_list_shift(ctx->files_to_hash))) { - item->callback(NULL, VERIFY_SHUTDOWN, item->user_data); - verify_file_free(&item); - } - hash_list_free(&ctx->files_to_hash); - } - file_object_release(&ctx->file); - HFREE_NULL(ctx->buffer); - ctx->magic = 0; - WFREE(ctx); + ctx->shutdowned = TRUE; + thread_kill(ctx->verify_stid, TSIG_TERM); *ptr = NULL; + + /* + * Defer freeing of the context until the thread is dead + * + * We leave the ctx->files_to_hash list around as well because + * it could still be accessed by other threads. + */ + + cq_main_insert(VERIFY_DEFERRED, verify_deferred_free, ctx); } } @@ -335,7 +697,7 @@ verify_context_free(void *data) { struct verify *ctx = data; - + verify_check(ctx); /* If we're called, the task is being terminated */ @@ -357,11 +719,13 @@ verify_next_file(struct verify *ctx) { struct verify_file *item; + bool skipped = FALSE; verify_check(ctx); + g_assert(NULL == ctx->file); - item = ctx->files_to_hash ? hash_list_shift(ctx->files_to_hash) : NULL; - if (item) { + item = hash_list_shift(ctx->files_to_hash); + if (item != NULL) { verify_file_check(item); ctx->user_data = item->user_data; @@ -373,14 +737,6 @@ if (verify_start(ctx)) { ctx->file = file_object_open(item->pathname, O_RDONLY); if (NULL == ctx->file) { - int fd; - - fd = file_absolute_open(item->pathname, O_RDONLY, 0); - if (fd >= 0) { - ctx->file = file_object_new(fd, item->pathname, O_RDONLY); - } - } - if (NULL == ctx->file) { g_warning("failed to open \"%s\" for %s hashing: %m", verify_hash_name(ctx), item->pathname); } @@ -389,27 +745,32 @@ g_debug("discarding request of %s digest for %s", verify_hash_name(ctx), item->pathname); } + skipped = TRUE; } + verify_file_free(&item); - if (NULL == ctx->file) { - goto error; - } + if (NULL == ctx->file) + goto done; } if (ctx->file) { if (GNET_PROPERTY(verify_debug)) { g_debug("verifying %s digest for %s", - verify_hash_name(ctx), file_object_get_pathname(ctx->file)); + verify_hash_name(ctx), file_object_pathname(ctx->file)); } verify_hash_init(ctx); - compat_fadvise_sequential(file_object_get_fd(ctx->file), 0, 0); - ctx->started = tm_time_exact(); + file_object_fadvise_sequential(ctx->file); + ctx->last_progress = ctx->started = tm_time_exact(); } return; -error: - verify_failure(ctx); +done: + if (skipped) + verify_shutdown(ctx); + else + verify_failure(ctx); + file_object_release(&ctx->file); } @@ -419,11 +780,11 @@ verify_check(ctx); if (ctx->offset != ctx->end) { - g_warning("file shrunk? \"%s\"", file_object_get_pathname(ctx->file)); + g_warning("file shrunk? \"%s\"", file_object_pathname(ctx->file)); verify_failure(ctx); } else if (verify_hash_final(ctx)) { g_warning("verify_hash_final() failed for \"%s\"", - file_object_get_pathname(ctx->file)); + file_object_pathname(ctx->file)); verify_failure(ctx); } else { verify_done(ctx); @@ -452,21 +813,36 @@ if ((ssize_t) -1 == r) { if (!is_temporary_error(errno)) { g_warning("error while reading \"%s\": %m", - file_object_get_pathname(ctx->file)); + file_object_pathname(ctx->file)); goto error; } } else if (0 == r) { verify_final(ctx); } else { + time_t now; + ctx->offset += (size_t) r; if (verify_hash_update(ctx, ctx->buffer, r)) { g_warning("%s computation error for \"%s\"", - verify_hash_name(ctx), file_object_get_pathname(ctx->file)); + verify_hash_name(ctx), file_object_pathname(ctx->file)); goto error; } - if (!verify_progress(ctx)) { - goto error; + + /* + * Don't inform about progress too frequently: if we're running in + * a dedicated thread, the notification will issue a cross-thread RPC + * which is slowing down the computation since we need to wait for + * the reply before resuming. + */ + + now = tm_time(); + + if (delta_time(now, ctx->last_progress) >= VERIFY_PROGRESS_NOTIFY) { + ctx->last_progress = now; + if (!verify_progress(ctx)) { + goto error; + } } } return; @@ -476,6 +852,88 @@ file_object_release(&ctx->file); } +/** + * Drop all the queued items for the verification thread. + * + * This is dispatched to the main thread. + */ +static void +verify_queue_flush(void *data) +{ + struct verify *ctx = data; + struct verify_file *item; + + verify_check(ctx); + g_assert(thread_is_main()); + + while (NULL != (item = hash_list_shift(ctx->files_to_hash))) { + /* Setup minimal context to call verify_shutdown() */ + ctx->user_data = item->user_data; + ctx->callback = item->callback; + + verify_shutdown(ctx); + verify_file_free(&item); + } +} + +/** + * Signal handler for task termination. + * + * This handler is invoked from the background task scheduler and is therefore + * run in the thread that is handling verification. + */ +static void +verify_bg_sighandler(struct bgtask *bt, void *data, bgsig_t sig) +{ + struct verify *ctx = data; + + verify_check(ctx); + g_assert(BG_SIG_TERM == sig); + + if (GNET_PROPERTY(verify_debug)) { + g_debug("cancelling background task \"%s\" in %s", + bg_task_name(bt), thread_name()); + } + + /* + * Abort current file hashing. + */ + + if (ctx->file != NULL) { + verify_shutdown(ctx); + file_object_release(&ctx->file); + } + HFREE_NULL(ctx->buffer); + + /* + * Flush the queue. + * + * To speed things up, we'll redirect this work to the main thread: since + * we're shutdowning, there's no real processing done in the main thread, + * and it will be more efficient if we're currently in the library thread + * since we will avoid all these TEQ RPCs between the two threads. + */ + + teq_post(THREAD_MAIN, verify_queue_flush, ctx); +} + +/** + * First verification step, intalling signal handler to trap termination. + */ +static bgret_t +verify_step_setup(struct bgtask *bt, void *unused_data, int unused_ticks) +{ + (void) unused_data; + (void) unused_ticks; + + bg_task_signal(bt, BG_SIG_TERM, verify_bg_sighandler); + bg_task_ticks_used(bt, 0); + return BGR_NEXT; +} + +/** + * Incremental verification step, invoked through the background task scheduler. + */ static bgret_t verify_step_compute(struct bgtask *bt, void *data, int ticks) { @@ -488,6 +946,7 @@ (void) bt; while (i-- > 0) { + bg_task_cancel_test(bt); if (NULL == ctx->file) { verify_next_file(ctx); } @@ -520,31 +979,95 @@ } } +/** + * Termination callback for verification task. + * + * This handler is invoked from the background task scheduler and is therefore + * run in the thread that is handling verification. + */ +static void +verify_bg_done(struct bgtask *bt, void *data, bgstatus_t status, void *uarg) +{ + struct verify *ctx = data; + + verify_check(ctx); + + (void) uarg; + + /* + * Sole purpose here is to trace task termination and print execution + * statistics, for debugging. + */ + + if (GNET_PROPERTY(verify_debug)) { + g_debug("terminating background task \"%s\" in %s, status=%s, " + "ran %'lu ms (%s)", + bg_task_name(bt), thread_name(), bgstatus_to_string(status), + bg_task_wtime(bt), short_time_ascii(bg_task_wtime(bt) / 1000)); + } +} + +/** + * Create background task to perform the verification if not already there. + */ static void verify_create_task(struct verify *ctx) { verify_check(ctx); if (NULL == ctx->task) { - static const bgstep_cb_t step = { verify_step_compute }; + static const bgstep_cb_t step = { + verify_step_setup, + verify_step_compute + }; if (GNET_PROPERTY(verify_debug) > 1) { g_debug("creating new task for %s verification", verify_hash_name(ctx)); } - ctx->task = bg_task_create(verify_hash_name(ctx), - step, G_N_ELEMENTS(step), + ctx->task = bg_task_create(ctx->sched, verify_hash_name(ctx), + step, N_ITEMS(step), ctx, verify_context_free, - NULL, NULL); + verify_bg_done, NULL); } } /** - * @return TRUE if the item was enqueued, FALSE if an equivalent item - * was already enqueued. + * Notified that work was enqueued and should be processed by the + * verification thread attached to the context. + * + * This is called in the thread that is running the verification task. */ -int +static void +verify_enqueued(void *arg) +{ + verify_create_task(arg); +} + +/** + * Enqueue file to be verified. + * + * The supplied callback will be invoked in the context of the calling thread, + * not from the verification thread, so that multi-threading be transparent + * for the calling thread. + * + * @param ctx the verification context + * @param high_priority whether item should be treated quickly + * @param pathname file to be verified + * @param offset starting offset where verification should start + * @param amount amount of data to verify in the file, starting at offset + * @param callback callback routine to invoke in the calling thread + * @param user_data context to pass to the calling routine + * + * The callback is invoked to notify the caller about some event, or verify + * whether the verification should still be conducted (with VERIFY_START and + * VERIFY_PROGRESS notifications). + * + * @return TRUE if the item was enqueued, FALSE if an equivalent item was + * already enqueued. + */ +bool verify_enqueue(struct verify *ctx, int high_priority, const char *pathname, filesize_t offset, filesize_t amount, verify_callback callback, void *user_data) @@ -553,20 +1076,23 @@ int inserted; verify_check(ctx); - g_return_val_if_fail(ctx->files_to_hash, FALSE); - g_return_val_if_fail(pathname, FALSE); g_return_val_if_fail(callback, FALSE); + g_return_val_if_fail(!ctx->shutdowned, FALSE); + + entropy_harvest_many( + PTRLEN(ctx), VARLEN(high_priority), + pathname, strsize(pathname), + VARLEN(amount), NULL); item = verify_file_new(pathname, offset, amount, callback, user_data); + + hash_list_lock(ctx->files_to_hash); + if (hash_list_contains(ctx->files_to_hash, item)) { - if (high_priority) { + if (high_priority) hash_list_moveto_head(ctx->files_to_hash, item); - inserted = FALSE; - } else { - inserted = TRUE; - } - verify_file_free(&item); + inserted = FALSE; } else { if (high_priority) { hash_list_prepend(ctx->files_to_hash, item); @@ -576,13 +1102,28 @@ inserted = TRUE; } + hash_list_unlock(ctx->files_to_hash); + if (GNET_PROPERTY(verify_debug)) { g_debug("%s %s digest verification for %s", inserted ? "enqueued" : "already had queued", verify_hash_name(ctx), pathname); } - verify_create_task(ctx); + /* + * When work was inserted into the queue (represented by the hash list + * here), we signal the thread handling the verification so that it can + * be awoken if it was sleeping: the TSIG_TEQ signal will let the thread + * out of the teq_wait() call in its main processing loop, and the + * verify_enqueued() event callback will make sure we have a background + * task to actually process the work. + */ + + if (inserted) + teq_post(ctx->verify_stid, verify_enqueued, ctx); + else + verify_file_free(&item); + return inserted; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/verify.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/verify.h
Changed
@@ -51,7 +51,7 @@ struct verify; -typedef gboolean (*verify_callback)(const struct verify *, +typedef bool (*verify_callback)(const struct verify *, enum verify_status, void *user_data); struct verify_hash { @@ -64,13 +64,13 @@ struct verify *verify_new(const struct verify_hash *); void verify_free(struct verify **ptr); -int verify_enqueue(struct verify *, int high_priority, +bool verify_enqueue(struct verify *, int high_priority, const char *pathname, filesize_t offset, filesize_t filesize, verify_callback callback, void *user_data); enum verify_status verify_status(const struct verify *); filesize_t verify_hashed(const struct verify *); -guint verify_elapsed(const struct verify *); +uint verify_elapsed(const struct verify *); #endif /* _core_verify_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/verify_sha1.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/verify_sha1.c
Changed
@@ -36,6 +36,7 @@ #include "verify.h" #include "lib/misc.h" +#include "lib/once.h" #include "lib/sha1.h" #include "core/verify_sha1.h" @@ -44,7 +45,7 @@ static struct { struct verify *verify; - SHA1Context context; + SHA1_context context; struct sha1 digest; } verify_sha1; @@ -60,8 +61,8 @@ int ret; (void) amount; - ret = SHA1Reset(&verify_sha1.context); - g_assert(shaSuccess == ret); + ret = SHA1_reset(&verify_sha1.context); + g_assert(SHA_SUCCESS == ret); } static int @@ -69,8 +70,8 @@ { int ret; - ret = SHA1Input(&verify_sha1.context, data, size); - return shaSuccess == ret ? 0 : -1; + ret = SHA1_input(&verify_sha1.context, data, size); + return SHA_SUCCESS == ret ? 0 : -1; } static int @@ -78,8 +79,8 @@ { int ret; - ret = SHA1Result(&verify_sha1.context, &verify_sha1.digest); - return shaSuccess == ret ? 0 : -1; + ret = SHA1_result(&verify_sha1.context, &verify_sha1.digest); + return SHA_SUCCESS == ret ? 0 : -1; } static const struct verify_hash verify_hash_sha1 = { @@ -105,19 +106,31 @@ return &verify_sha1.digest; } -void -verify_sha1_init(void) +static void G_COLD +verify_sha1_init_once(void) { - static int initialized; - - if (!initialized) { - initialized = TRUE; + verify_sha1.verify = verify_new(&verify_hash_sha1); +} - verify_sha1.verify = verify_new(&verify_hash_sha1); - } +void G_COLD +verify_sha1_init(void) +{ + static once_flag_t initialized; + + /* + * We cannot use once_flag_run() because verify_new() can create a thread + * and cause the current thread to sleep with a lock (the mutex that + * the once layer will acquire). + * + * Therefore we need to use once_flag_runwait(), which can block the + * calling thread on a condition but does not hold any lock when invoking + * the init routine. + */ + + once_flag_runwait(&initialized, verify_sha1_init_once); } -void +void G_COLD verify_sha1_close(void) { verify_free(&verify_sha1.verify);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/verify_tth.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/verify_tth.c
Changed
@@ -33,25 +33,19 @@ #include "common.h" -#include "downloads.h" -#include "file_object.h" -#include "guid.h" #include "huge.h" -#include "sockets.h" +#include "share.h" #include "tth_cache.h" #include "verify_tth.h" #include "if/gnet_property.h" #include "if/gnet_property_priv.h" -#include "lib/atoms.h" #include "lib/base32.h" -#include "lib/bg.h" #include "lib/halloc.h" -#include "lib/hashlist.h" -#include "lib/file.h" -#include "lib/tigertree.h" +#include "lib/once.h" #include "lib/tiger.h" +#include "lib/tigertree.h" #include "lib/tm.h" #include "lib/override.h" /* Must be the last inclusion */ @@ -71,12 +65,16 @@ static void verify_tth_reset(filesize_t size) { - tt_init(verify_tth.context, size); + if G_LIKELY(verify_tth.context != NULL) + tt_init(verify_tth.context, size); } static int verify_tth_update(const void *data, size_t size) { + if G_UNLIKELY(NULL == verify_tth.context) + return -1; + tt_update(verify_tth.context, data, size); return 0; } @@ -84,6 +82,9 @@ static int verify_tth_final(void) { + if G_UNLIKELY(NULL == verify_tth.context) + return -1; + tt_digest(verify_tth.context, &verify_tth.digest); return 0; } @@ -116,30 +117,50 @@ return tt_leave_count(verify_tth.context); } -void +static void G_COLD +verify_tth_init_once(void) +{ + verify_tth.context = halloc(tt_size()); + verify_tth.verify = verify_new(&verify_hash_tth); +} + +void G_COLD verify_tth_init(void) { - static int initialized; + static once_flag_t initialized; - if (!initialized) { - initialized = TRUE; + /* + * We cannot use once_flag_run() because verify_new() can create a thread + * and cause the current thread to sleep with a lock (the mutex that + * the once layer will acquire). + * + * Therefore we need to use once_flag_runwait(), which can block the + * calling thread on a condition but does not hold any lock when invoking + * the init routine. + */ - verify_tth.context = halloc(tt_size()); - verify_tth.verify = verify_new(&verify_hash_tth); - } + once_flag_runwait(&initialized, verify_tth_init_once); } /** * Stops the background task for tigertree verification. */ -void -verify_tth_close(void) +void G_COLD +verify_tth_shutdown(void) { verify_free(&verify_tth.verify); +} + +/** + * Release memory resources used by tigertree verification. + */ +void G_COLD +verify_tth_close(void) +{ HFREE_NULL(verify_tth.context); } -static gboolean +static bool request_tigertree_callback(const struct verify *ctx, enum verify_status status, void *user_data) { @@ -148,7 +169,7 @@ shared_file_check(sf); switch (status) { case VERIFY_START: - if (!(SHARE_F_INDEXED & shared_file_flags(sf))) { + if (!shared_file_indexed(sf)) { /* * After a rescan, there might be files in the queue which are * no longer shared. @@ -180,7 +201,7 @@ case VERIFY_DONE: { const struct tth *tth = verify_tth_digest(ctx); - + huge_update_hashes(sf, shared_file_sha1(sf), tth); tth_cache_insert(tth, verify_tth_leaves(ctx), verify_tth_leave_count(ctx)); @@ -198,7 +219,7 @@ return FALSE; } -gboolean +bool verify_tth_append(const char *pathname, filesize_t offset, filesize_t amount, verify_callback callback, void *user_data) @@ -207,7 +228,7 @@ pathname, offset, amount, callback, user_data); } -gboolean +bool verify_tth_prepend(const char *pathname, filesize_t offset, filesize_t amount, verify_callback callback, void *user_data) @@ -217,23 +238,35 @@ } void -request_tigertree(shared_file_t *sf, gboolean high_priority) +request_tigertree(shared_file_t *sf, bool high_priority) { int inserted; verify_tth_init(); - g_return_if_fail(sf); shared_file_check(sf); g_return_if_fail(!shared_file_is_partial(sf)); + if (!shared_file_indexed(sf)) + return; /* "stale" shared file, has been superseded or removed */ + + /* + * This routine can be called when the VERIFY_DONE event is received by + * huge_verify_callback(). We may have already shutdown the TTH + * verification thread. + */ + + if G_UNLIKELY(NULL == verify_tth.verify) + return; + sf = shared_file_ref(sf); + inserted = verify_enqueue(verify_tth.verify, high_priority, shared_file_path(sf), 0, shared_file_size(sf), request_tigertree_callback, sf); - if (!inserted) { + + if (!inserted) shared_file_unref(&sf); - } } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/verify_tth.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/verify_tth.h
Changed
@@ -39,11 +39,11 @@ struct tth; -gboolean verify_tth_append(const char *pathname, +bool verify_tth_append(const char *pathname, filesize_t offset, filesize_t amount, verify_callback callback, void *user_data); -gboolean verify_tth_prepend(const char *pathname, +bool verify_tth_prepend(const char *pathname, filesize_t offset, filesize_t amount, verify_callback callback, void *user_data); @@ -52,8 +52,9 @@ size_t verify_tth_leave_count(const struct verify *); void verify_tth_init(void); +void verify_tth_shutdown(void); void verify_tth_close(void); -void request_tigertree(struct shared_file *sf, gboolean high_priority); +void request_tigertree(struct shared_file *sf, bool high_priority); #endif /* _core_verify_tth_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/version.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/version.c
Changed
@@ -38,22 +38,26 @@ #include "version.h" #include "token.h" #include "settings.h" +#include "tls_common.h" + +#include "if/core/main.h" /* For gtk_version_string() */ #include "if/gnet_property.h" #include "if/gnet_property_priv.h" -#include "lib/atoms.h" #include "lib/ascii.h" #include "lib/base16.h" #include "lib/getdate.h" -#include "lib/glib-missing.h" #include "lib/log.h" #include "lib/misc.h" +#include "lib/omalloc.h" #include "lib/parse.h" #include "lib/product.h" -#include "lib/tm.h" +#include "lib/str.h" /* For str_bprintf() and str_bcatf() */ #include "lib/timestamp.h" +#include "lib/tm.h" #include "lib/utf8.h" + #include "lib/override.h" /* Must be the last header included */ #define SECS_PER_DAY 86400 @@ -65,7 +69,7 @@ static version_ext_t our_ext_version; static version_t last_rel_version; static version_t last_dev_version; -static guint8 version_code; +static uint8 version_code; /** * Get version string. @@ -79,7 +83,7 @@ /** * Get version code (year/month coded in one byte). */ -guint8 +uint8 version_get_code(void) { return version_code; @@ -88,7 +92,7 @@ /** * Is our version indicating dirtyness? */ -gboolean +bool version_is_dirty(void) { return our_ext_version.dirty; @@ -98,7 +102,7 @@ * Get commit string and commit length (amount of valid nybbles). */ const struct sha1 * -version_get_commit(guint8 *len) +version_get_commit(uint8 *len) { if (len != NULL) *len = our_ext_version.commit_len; @@ -123,27 +127,27 @@ * NB: returns pointer to static data. */ const char * -version_ext_str(const version_ext_t *vext, gboolean full) +version_ext_str(const version_ext_t *vext, bool full) { static char str120; const version_t *ver = &vext->version; int rw; - gboolean has_extra = FALSE; - gboolean need_closing = FALSE; + bool has_extra = FALSE; + bool need_closing = FALSE; - rw = gm_snprintf(str, sizeof(str), "%u.%u", ver->major, ver->minor); + rw = str_bprintf(str, sizeof(str), "%u.%u", ver->major, ver->minor); if (ver->patchlevel) - rw += gm_snprintf(&strrw, sizeof(str)-rw, ".%u", ver->patchlevel); + rw += str_bprintf(&strrw, sizeof(str)-rw, ".%u", ver->patchlevel); if (ver->tag) { - rw += gm_snprintf(&strrw, sizeof(str)-rw, "%c", ver->tag); + rw += str_bprintf(&strrw, sizeof(str)-rw, "%c", ver->tag); if (ver->taglevel) - rw += gm_snprintf(&strrw, sizeof(str)-rw, "%u", ver->taglevel); + rw += str_bprintf(&strrw, sizeof(str)-rw, "%u", ver->taglevel); } if (ver->build) - rw += gm_snprintf(&strrw, sizeof(str)-rw, "-%u", ver->build); + rw += str_bprintf(&strrw, sizeof(str)-rw, "-%u", ver->build); if (vext->commit_len != 0) { static char digestSHA1_BASE16_SIZE + 1; @@ -151,32 +155,32 @@ sha1_to_base16_buf(&vext->commit, digest, sizeof digest); digestoffset = '\0'; - rw += gm_snprintf(&strrw, sizeof(str)-rw, "-g%s", digest); + rw += str_bprintf(&strrw, sizeof(str)-rw, "-g%s", digest); } if (vext->dirty) - rw += gm_snprintf(&strrw, sizeof(str)-rw, "-dirty"); + rw += str_bprintf(&strrw, sizeof(str)-rw, "-dirty"); if (ver->timestamp || (full && vext->osname != NULL)) { - rw += gm_snprintf(&strrw, sizeof(str)-rw, " ("); + rw += str_bprintf(&strrw, sizeof(str)-rw, " ("); need_closing = TRUE; } if (ver->timestamp) { struct tm *tmp = localtime(&ver->timestamp); - rw += gm_snprintf(&strrw, sizeof(str)-rw, "%d-%02d-%02d", + rw += str_bprintf(&strrw, sizeof(str)-rw, "%d-%02d-%02d", tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday); has_extra = TRUE; } if (full && vext->osname != NULL) { if (has_extra) - rw += gm_snprintf(&strrw, sizeof(str)-rw, "; "); - rw += gm_snprintf(&strrw, sizeof(str)-rw, "%s", vext->osname); + rw += str_bprintf(&strrw, sizeof(str)-rw, "; "); + rw += str_bprintf(&strrw, sizeof(str)-rw, "%s", vext->osname); } if (need_closing) - rw += gm_snprintf(&strrw, sizeof(str)-rw, ")"); + rw += str_bprintf(&strrw, sizeof(str)-rw, ")"); return str; } @@ -191,23 +195,23 @@ static char str80; int rw; - rw = gm_snprintf(str, sizeof(str), "%u.%u", ver->major, ver->minor); + rw = str_bprintf(str, sizeof(str), "%u.%u", ver->major, ver->minor); if (ver->patchlevel) - rw += gm_snprintf(&strrw, sizeof(str)-rw, ".%u", ver->patchlevel); + rw += str_bprintf(&strrw, sizeof(str)-rw, ".%u", ver->patchlevel); if (ver->tag) { - rw += gm_snprintf(&strrw, sizeof(str)-rw, "%c", ver->tag); + rw += str_bprintf(&strrw, sizeof(str)-rw, "%c", ver->tag); if (ver->taglevel) - rw += gm_snprintf(&strrw, sizeof(str)-rw, "%u", ver->taglevel); + rw += str_bprintf(&strrw, sizeof(str)-rw, "%u", ver->taglevel); } if (ver->build) - rw += gm_snprintf(&strrw, sizeof(str)-rw, "-%u", ver->build); + rw += str_bprintf(&strrw, sizeof(str)-rw, "-%u", ver->build); if (ver->timestamp) { struct tm *tmp = localtime(&ver->timestamp); - rw += gm_snprintf(&strrw, sizeof(str)-rw, " (%d-%02d-%02d)", + rw += str_bprintf(&strrw, sizeof(str)-rw, " (%d-%02d-%02d)", tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday); } @@ -280,7 +284,7 @@ * @returns TRUE if we parsed the extended build information properly, FALSE * if we were not facing a proper extension. */ -static gboolean +static bool version_ext_parse(const char *str, version_ext_t *vext) { const char *v; @@ -337,7 +341,8 @@ commitSHA1_BASE16_SIZE = '\0'; memcpy(commit, v, commit_len); - base16_decode(vext->commit.data, sizeof vext->commit, + ZERO(&vext->commit); + (void) base16_decode(vext->commit.data, sizeof vext->commit, commit, SHA1_BASE16_SIZE); if (e != NULL && is_strprefix(e, "-dirty")) { @@ -360,7 +365,7 @@ * @returns TRUE if we parsed a gtk-gnutella version correctly, FALSE if we * were not facing a gtk-gnutella version, or if we did not recognize it. */ -static gboolean +static bool version_parse(const char *str, version_t *ver, const char **end) { const char *v; @@ -493,7 +498,7 @@ * @returns -1, 0 or +1 depending on the sign of "a - b". */ static int -version_tagcmp(guchar a, guchar b) +version_tagcmp(uchar a, uchar b) { if (a == b) return 0; @@ -556,7 +561,7 @@ * * @returns OK if we were able to parse correctly. */ -gboolean +bool version_fill(const char *version, version_t *vs) { if (!version_parse(version, vs, NULL)) @@ -571,7 +576,7 @@ * Invoked when a newer version is found. */ static void -version_new_found(const char *text, gboolean stable) +version_new_found(const char *text, bool stable) { static char last_stable256 = ""; static char last_dev256 = ""; @@ -583,15 +588,15 @@ utf8_strlcpy(last_dev, text, sizeof last_dev); if ('\0' != last_stable0 && '\0' != last_dev0) { - gm_snprintf(s, sizeof s, + str_bprintf(s, sizeof s, _(" - Newer versions available: release %s / from git %s"), last_stable, last_dev); } else if ('\0' != last_stable0) { - gm_snprintf(s, sizeof s, + str_bprintf(s, sizeof s, _(" - Newer version available: release %s"), last_stable); } else if ('\0' != last_dev0) { - gm_snprintf(s, sizeof s, + str_bprintf(s, sizeof s, _(" - Newer version available: from git %s"), last_dev); } @@ -608,7 +613,7 @@ * @returns TRUE if we properly checked the version, FALSE if we got something * looking as gtk-gnutella but which failed the token-based sanity checks. */ -gboolean +bool version_check(const char *str, const char *token, const host_addr_t addr) { version_t their_version; @@ -617,7 +622,7 @@ int cmp; const char *version; const char *end; - gboolean extended; + bool extended; if (!version_parse(str, &their_version, &end)) return TRUE; /* Not gtk-gnutella, or unparseable */ @@ -791,10 +796,10 @@ * * @return A pointer to a static buffer holding the version string. */ -G_GNUC_COLD const char * +const char * G_COLD version_build_string(void) { - static gboolean initialized; + static bool initialized; static char buf128; if (!initialized) { @@ -816,11 +821,11 @@ } #endif /* HAS_UNAME */ - gm_snprintf(buf, sizeof buf, + str_bprintf(buf, sizeof buf, "%s/%s%s (%s; %s; %s%s%s)", - product_get_name(), product_get_version(), - product_get_build_full(), product_get_date(), - product_get_interface(), + product_name(), product_version(), + product_build_full(), product_date(), + product_interface(), sysname, machine && machine0 ? " " : "", machine ? machine : ""); @@ -831,16 +836,16 @@ /** * Initialize version string. */ -G_GNUC_COLD void +void G_COLD version_init(void) { time_t now; - version_string = atom_str_get(version_build_string()); + version_string = ostrdup_readonly(version_build_string()); now = tm_time(); { - gboolean ok; + bool ok; const char *end; ok = version_parse(version_string, &our_version, &end); @@ -857,12 +862,12 @@ { char buf128; - gm_snprintf(buf, sizeof(buf), + str_bprintf(buf, sizeof(buf), "%s/%s%s (%s)", - product_get_name(), product_get_version(), - product_get_build_full(), product_get_date()); + product_name(), product_version(), + product_build_full(), product_date()); - version_short_string = atom_str_get(buf); + version_short_string = ostrdup_readonly(buf); } last_rel_version = our_version; /* struct copy */ @@ -891,7 +896,7 @@ tok_is_ancient(now) || delta_time(now, our_version.timestamp) > VERSION_ANCIENT_WARN ) { - *deconstify_gboolean(&GNET_PROPERTY(ancient_version)) = TRUE; + *deconstify_bool(&GNET_PROPERTY(ancient_version)) = TRUE; } } @@ -901,7 +906,7 @@ * * If the version being ran is not a stable one, warn after 60 days, otherwise * warn after a year. If we're not "expired" yet but are approaching the - * deadline, start to remind them. + * deadline, start to remind them. */ void version_ancient_warn(void) @@ -924,7 +929,7 @@ elapsed = delta_time(now, our_version.timestamp); if (elapsed > VERSION_ANCIENT_WARN || tok_is_ancient(now)) { - static gboolean warned = FALSE; + static bool warned = FALSE; if (GNET_PROPERTY(version_debug)) { g_debug("VERSION our_version = %s (elapsed = %ld, token %s)", timestamp_to_string(our_version.timestamp), @@ -977,16 +982,65 @@ } /** + * Dump version to specified logging agent. + */ +void G_COLD +version_string_dump_log(logagent_t *la, bool full) +{ + static char buf80; + + log_info(la, "%s", version_build_string()); + + if (!full) + return; + +#ifndef OFFICIAL_BUILD + log_info(la, "(unofficial build, accessing \"%s\")", PACKAGE_SOURCE_DIR); +#endif + + /* + * Flag only when compiled with --disable-malloc since this is not the + * default setup. It is important to know that fact easily from the + * command line. + */ +#ifndef USE_MY_MALLOC + log_info(la, "(libraries are using the system's malloc() implementation)"); +#endif + + str_bprintf(buf, sizeof buf, "GLib %u.%u.%u", + glib_major_version, glib_minor_version, glib_micro_version); + if ( + GLIB_MAJOR_VERSION != glib_major_version || + GLIB_MINOR_VERSION != glib_minor_version || + GLIB_MICRO_VERSION != glib_micro_version + ) { + str_bcatf(buf, sizeof buf, " (compiled against %u.%u.%u)", + GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION); + } + log_info(la, "%s", buf); + + if (gtk_version_string() != NULL) + log_info(la, "%s", gtk_version_string()); + + if (tls_version_string() != NULL) + log_info(la, "%s", tls_version_string()); +} + +/** + * Dump version to stdout. + */ +void G_COLD +version_string_dump(void) +{ + version_string_dump_log(log_agent_stdout_get(), TRUE); +} + +/** * Free version string. */ -G_GNUC_COLD void +void G_COLD version_close(void) { - atom_str_free(version_string); - version_string = NULL; - atom_str_free(version_short_string); - version_short_string = NULL; - if (version_cmp(&our_version, &last_rel_version) < 0) g_warning("upgrade recommended: most recent released version seen: %s", version_str(&last_rel_version));
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/version.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/version.h
Changed
@@ -43,12 +43,12 @@ * In our comments below, we are assuming a value of "0.90.3b2". */ typedef struct version { - guint32 major; /**< Major version number (0) */ - guint32 minor; /**< Minor version number (90) */ - guint32 patchlevel; /**< Patch level (3) */ - guchar tag; /**< Code letter after version number (b) */ - guint32 taglevel; /**< Value after code letter (2) */ - guint32 build; /**< Build revision number (11723) */ + uint32 major; /**< Major version number (0) */ + uint32 minor; /**< Minor version number (90) */ + uint32 patchlevel; /**< Patch level (3) */ + uchar tag; /**< Code letter after version number (b) */ + uint32 taglevel; /**< Value after code letter (2) */ + uint32 build; /**< Build revision number (11723) */ time_t timestamp; } version_t; @@ -57,7 +57,7 @@ */ typedef struct version_ext { version_t version; /**< Basic version information */ - guint8 commit_len; /**< Amount of valid nybbles in commit */ + uint8 commit_len; /**< Amount of valid nybbles in commit */ sha1_t commit; /**< Git's commit SHA1 (partial) */ const char *osname; /**< Static string */ unsigned dirty:1; @@ -80,21 +80,26 @@ void version_init(void); void version_close(void); void version_ancient_warn(void); -gboolean version_check(const char *str, const char *token, const host_addr_t); +bool version_check(const char *str, const char *token, const host_addr_t); int version_cmp(const version_t *a, const version_t *b); int version_build_cmp(const version_t *a, const version_t *b); -gboolean version_fill(const char *version, version_t *vs); +bool version_fill(const char *version, version_t *vs); const char *version_str(const version_t *ver); -const char *version_ext_str(const version_ext_t *vext, gboolean full); +const char *version_ext_str(const version_ext_t *vext, bool full); extern const char *version_string; extern const char *version_short_string; +struct logagent; + +void version_string_dump_log(struct logagent *la, bool full); +void version_string_dump(void); + const char *version_build_string(void); -guint8 version_get_code(void) G_GNUC_PURE; -gboolean version_is_dirty(void) G_GNUC_PURE; -const struct sha1 *version_get_commit(guint8 *len); +uint8 version_get_code(void) G_PURE; +bool version_is_dirty(void) G_PURE; +const struct sha1 *version_get_commit(uint8 *len); #endif /* _core_version_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/vmsg.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/vmsg.c
Changed
@@ -33,6 +33,8 @@ #include "common.h" +#include "gtk-gnutella.h" /* For GTA_VENDOR_CODE */ + #include "clock.h" #include "dmesh.h" #include "dq.h" @@ -68,14 +70,17 @@ #include "lib/atoms.h" #include "lib/base16.h" #include "lib/endian.h" -#include "lib/glib-missing.h" +#include "lib/hashing.h" #include "lib/hashlist.h" -#include "lib/misc.h" /* For pointer_hash_func() */ +#include "lib/hset.h" +#include "lib/mempcpy.h" +#include "lib/misc.h" /* hexadecimal conversions */ #include "lib/nid.h" #include "lib/patricia.h" #include "lib/pmsg.h" #include "lib/random.h" #include "lib/str.h" +#include "lib/stringify.h" #include "lib/timestamp.h" #include "lib/tm.h" #include "lib/urn.h" @@ -92,7 +97,7 @@ #define VMSG_PAYLOAD_MAX \ ((sizeof v_tmp) - GTA_HEADER_SIZE - sizeof(gnutella_vendor_t)) -static GHashTable *ht_vmsg; +static hset_t *hs_vmsg; /* * Vendor message handler. @@ -100,16 +105,16 @@ struct vmsg; -typedef void (*vmsg_handler_t)(struct gnutella_node *n, +typedef void (*vmsg_handler_t)(gnutella_node_t *n, const struct vmsg *vmsg, const char *payload, size_t size); /** * Definition of vendor messages. */ struct vmsg { - guint32 vendor; - guint16 id; - guint16 version; + uint32 vendor; + uint16 id; + uint16 version; vmsg_handler_t handler; const char *name; }; @@ -136,15 +141,22 @@ g_assert(VMSG_PMI_MAGIC == pmi->magic); } -static guint -vmsg_hash_func(gconstpointer key) +static uint +vmsg_hash_func(const void *key) { const struct vmsg *vmsg = key; - return vmsg->vendor ^ vmsg->id; + return u32_hash(vmsg->vendor) ^ u16_hash(vmsg->id); } -static gboolean -vmsg_eq_func(gconstpointer p, gconstpointer q) +static uint +vmsg_hash_func2(const void *key) +{ + const struct vmsg *vmsg = key; + return u32_hash2(vmsg->vendor) ^ u16_hash2(vmsg->id); +} + +static bool +vmsg_eq_func(const void *p, const void *q) { const struct vmsg *a = p, *b = q; return a->vendor == b->vendor && a->id == b->id; @@ -158,18 +170,18 @@ * @param vc The vendor code. * @param id The vendor message ID. * @param version The vendor message version. - * @returns whether the message is known and supported. + * @returns whether the message is known and supported. */ -static gboolean +static bool find_message(struct vmsg *vmsg_ptr, - vendor_code_t vc, guint16 id, guint16 version) + vendor_code_t vc, uint16 id, uint16 version) { struct vmsg key, *value; key.vendor = vc.u32; key.id = id; - value = g_hash_table_lookup(ht_vmsg, &key); + value = hset_lookup(hs_vmsg, &key); if (value) { *vmsg_ptr = *value; vmsg_ptr->version = version; @@ -188,12 +200,12 @@ * a static string. */ const char * -vmsg_infostr(gconstpointer data, size_t size) +vmsg_infostr(const void *data, size_t size) { static char msg80; vendor_code_t vc; - guint16 id; - guint16 version; + uint16 id; + uint16 version; struct vmsg vmsg; if (size < sizeof vc) @@ -204,10 +216,10 @@ version = gnutella_vendor_get_version(data); if (!find_message(&vmsg, vc, id, version)) - gm_snprintf(msg, sizeof msg , "%s/%uv%u", + str_bprintf(msg, sizeof msg , "%s/%uv%u", vendor_code_to_string(vc.u32), id, version); else - gm_snprintf(msg, sizeof msg, "%s/%uv%u '%s'", + str_bprintf(msg, sizeof msg, "%s/%uv%u '%s'", vendor_code_to_string(vc.u32), id, version, vmsg.name); return msg; @@ -217,8 +229,13 @@ * Send reply to node (message block), via the appropriate channel. */ static void -vmsg_send_reply(struct gnutella_node *n, pmsg_t *mb) +vmsg_send_reply(gnutella_node_t *n, pmsg_t *mb) { + if (GNET_PROPERTY(vmsg_debug) > 2 || GNET_PROPERTY(log_vmsg_tx)) { + g_debug("VMSG sending %s to %s", + gmsg_infostr_full(pmsg_start(mb), pmsg_size(mb)), node_infostr(n)); + } + if (NODE_IS_UDP(n)) udp_send_mb(n, mb); else @@ -229,12 +246,34 @@ * Send a message to node (data + size), via the appropriate channel. */ static void -vmsg_send_data(struct gnutella_node *n, gconstpointer data, guint32 size) +vmsg_send_data(gnutella_node_t *n, const void *data, uint32 size) { if (NODE_IS_UDP(n)) udp_send_msg(n, data, size); else gmsg_sendto_one(n, data, size); + + if (GNET_PROPERTY(vmsg_debug) > 2 || GNET_PROPERTY(log_vmsg_tx)) { + g_debug("VMSG sent %s to %s", + gmsg_infostr_full(data, size), node_infostr(n)); + } +} + +/** + * Send a control message to node (data + size), via the appropriate channel. + */ +static void +vmsg_ctrl_send_data(gnutella_node_t *n, const void *data, uint32 size) +{ + if (NODE_IS_UDP(n)) + udp_ctrl_send_msg(n, data, size); + else + gmsg_ctrl_sendto_one(n, data, size); + + if (GNET_PROPERTY(vmsg_debug) > 2 || GNET_PROPERTY(log_vmsg_tx)) { + g_debug("VMSG sent %s to %s", + gmsg_infostr_full(data, size), node_infostr(n)); + } } /** @@ -277,8 +316,8 @@ * triggered when the message has been finally sent. */ static void -vmsg_send_data_notify(struct gnutella_node *n, gboolean prioritary, - gconstpointer msg, guint32 size, vmsg_sent_t sent, void *arg) +vmsg_send_data_notify(gnutella_node_t *n, bool prioritary, + const void *msg, uint32 size, vmsg_sent_t sent, void *arg) { g_assert(NULL == sent || !NODE_IS_UDP(n)); @@ -303,19 +342,24 @@ } gmsg_mb_sendto_one(n, mb); } + + if (GNET_PROPERTY(vmsg_debug) > 2 || GNET_PROPERTY(log_vmsg_tx)) { + g_debug("VMSG sent %s to %s", + gmsg_infostr_full(msg, size), node_infostr(n)); + } } /** * Main entry point to handle reception of vendor-specific message. */ void -vmsg_handle(struct gnutella_node *n) +vmsg_handle(gnutella_node_t *n) { - gnutella_vendor_t *v = cast_to_gpointer(n->data); - gboolean found; + gnutella_vendor_t *v = cast_to_pointer(n->data); + bool found; struct vmsg vmsg; vendor_code_t vc; - guint16 id, version; + uint16 id, version; const unsigned expected_size = sizeof *v; if (n->size < expected_size) { @@ -332,11 +376,11 @@ found = find_message(&vmsg, vc, id, version); - if (GNET_PROPERTY(vmsg_debug) > 4) - g_debug("VMSG %s \"%s\": %s/%uv%u from %s", - gmsg_node_infostr(n), found ? vmsg.name : "UNKNOWN", - vendor_code_to_string(vc.u32), id, version, - host_addr_port_to_string(n->addr, n->port)); + if (GNET_PROPERTY(vmsg_debug) > 4 || GNET_PROPERTY(log_vmsg_rx)) { + g_debug("VMSG got %s from %s", + gmsg_infostr_full_split(n->header, n->data, n->size), + node_infostr(n)); + } /* * If we can't handle the message, we count it as "unknown type", which @@ -365,10 +409,10 @@ * * @returns the total size of the whole Gnutella message. */ -static guint32 -vmsg_fill_header(gnutella_header_t *header, guint32 size, guint32 maxsize) +static uint32 +vmsg_fill_header(gnutella_header_t *header, uint32 size, uint32 maxsize) { - guint32 msize; + uint32 msize; /* Default GUID: all blank */ gnutella_header_set_muid(header, &blank_guid); @@ -395,7 +439,7 @@ static void vmsg_advertise_udp_compression(gnutella_header_t *header) { - guint8 ttl = gnutella_header_get_ttl(header); + uint8 ttl = gnutella_header_get_ttl(header); g_assert(0 == (ttl & GTA_UDP_CAN_INFLATE)); @@ -410,7 +454,7 @@ */ static char * vmsg_fill_type(gnutella_vendor_t *base, - guint32 vendor, guint16 id, guint16 version) + uint32 vendor, uint16 id, uint16 version) { gnutella_vendor_set_code(base, vendor); gnutella_vendor_set_selector_id(base, id); @@ -422,8 +466,8 @@ /** * Report a vendor-message with bad payload to the stats. */ -static gboolean -vmsg_bad_payload(struct gnutella_node *n, +static bool +vmsg_bad_payload(gnutella_node_t *n, const struct vmsg *vmsg, size_t size, size_t expected) { n->n_bad++; @@ -449,30 +493,69 @@ : FALSE) /** + * Ignore message coming from wrong origin, complaining loudly when debugging. + */ +static void +vmsg_ignore(const gnutella_node_t *n, const struct vmsg *vmsg) +{ + if (GNET_PROPERTY(vmsg_debug)) { + g_warning("VMSG got %s/%uv%u \"%s\" via %s, ignoring", + vendor_code_to_string(vmsg->vendor), + vmsg->id, vmsg->version, vmsg->name, node_infostr(n)); + } +} + +/** + * Make sure message comes from TCP. + * + * @return TRUE if message is from TCP. + */ +static inline bool +vmsg_from_tcp(const gnutella_node_t *n, const struct vmsg *vmsg) +{ + if (NODE_IS_UDP(n)) { + vmsg_ignore(n, vmsg); + return FALSE; + } + + return TRUE; +} + +/** + * Make sure message comes from UDP. + * + * @return TRUE if message is from UDP. + */ +static inline bool +vmsg_from_udp(const gnutella_node_t *n, const struct vmsg *vmsg) +{ + if (!NODE_IS_UDP(n)) { + vmsg_ignore(n, vmsg); + return FALSE; + } + + return TRUE; +} + +/** * Handle the "Features Supported" message. */ static void -handle_features_supported(struct gnutella_node *n, +handle_features_supported(gnutella_node_t *n, const struct vmsg *vmsg, const char *payload, size_t size) { const char *description; - guint16 count; + uint16 count; str_t *feats; - if (NODE_IS_UDP(n)) { - if (GNET_PROPERTY(vmsg_debug)) { - g_warning("got %s/%uv%u via %s, ignoring", - vendor_code_to_string(vmsg->vendor), - vmsg->id, vmsg->version, node_infostr(n)); - } + if (!vmsg_from_tcp(n, vmsg)) return; - } count = peek_le16(payload); if (GNET_PROPERTY(vmsg_debug) > 1) g_debug("VMSG %s supports %u extra feature%s", - node_infostr(n), count, count == 1 ? "" : "s"); + node_infostr(n), count, plural(count)); if (VMSG_SHORT_SIZE(n, vmsg, size, count * VMS_FEATURE_SIZE + sizeof count)) return; @@ -487,7 +570,7 @@ while (count-- > 0) { char feature5; - guint16 version; + uint16 version; memcpy(feature, &description0, 4); feature4 = '\0'; @@ -508,10 +591,14 @@ node_supports_whats_new(n); } + if (0 != version && 0 == strcmp(feature, "QRP1")) { + node_supports_qrp_1bit_patches(n); + } + /* Any of ADHT, PDHT or LDHT means DHT is supported */ if (feature0 && 0 == strcmp(&feature1, "DHT")) { dht_mode_t mode; - gboolean known = TRUE; + bool known = TRUE; switch (feature0) { case 'A': mode = DHT_MODE_ACTIVE; break; case 'P': mode = DHT_MODE_PASSIVE; break; @@ -535,7 +622,7 @@ * Handle the "Hops Flow" message. */ static void -handle_hops_flow(struct gnutella_node *n, +handle_hops_flow(gnutella_node_t *n, const struct vmsg *vmsg, const char *payload, size_t size) { if (vmsg->version > 1) @@ -556,11 +643,11 @@ * @param arg additional callback argument */ void -vmsg_send_hops_flow(struct gnutella_node *n, guint8 hops, +vmsg_send_hops_flow(gnutella_node_t *n, uint8 hops, vmsg_sent_t sent, void *arg) { - guint32 paysize = sizeof hops; - guint32 msgsize; + uint32 paysize = sizeof hops; + uint32 msgsize; char *payload; msgsize = vmsg_fill_header(v_tmp_header, paysize, sizeof v_tmp); @@ -579,10 +666,10 @@ * Handle the "TCP Connect Back" message. */ static void -handle_tcp_connect_back(struct gnutella_node *n, +handle_tcp_connect_back(gnutella_node_t *n, const struct vmsg *vmsg, const char *payload, size_t size) { - guint16 port; + uint16 port; if (vmsg->version > 1) return; @@ -599,9 +686,6 @@ return; } - if (GNET_PROPERTY(vmsg_debug) > 2) - g_debug("VMSG got TCP connect-back REQ from %s", node_infostr(n)); - /* XXX forward to neighbours supporting the remote connect back message? */ node_connect_back(n, port); @@ -612,10 +696,10 @@ * back to us on the specified port. */ void -vmsg_send_tcp_connect_back(struct gnutella_node *n, guint16 port) +vmsg_send_tcp_connect_back(gnutella_node_t *n, uint16 port) { - guint32 paysize = sizeof port; - guint32 msgsize; + uint32 paysize = sizeof port; + uint32 msgsize; char *payload; g_return_if_fail(0 != port); @@ -627,21 +711,22 @@ gmsg_sendto_one(n, v_tmp, msgsize); - if (GNET_PROPERTY(vmsg_debug) > 2) - g_debug("VMSG sent TCP connect-back REQ for port %u to %s", - port, node_infostr(n)); + if (GNET_PROPERTY(vmsg_debug) > 2 || GNET_PROPERTY(log_vmsg_tx)) { + g_debug("VMSG sent %s for port %u to %s", + gmsg_infostr_full(v_tmp, msgsize), port, node_infostr(n)); + } } /** * Handle the "UDP Connect Back" message. */ static void -handle_udp_connect_back(struct gnutella_node *n, +handle_udp_connect_back(gnutella_node_t *n, const struct vmsg *vmsg, const char *payload, size_t size) { const struct guid *guid; size_t expected_size; - guint16 port; + uint16 port; if (vmsg->version < 1 || vmsg->version > 2) return; @@ -662,11 +747,6 @@ return; } - if (GNET_PROPERTY(vmsg_debug) > 2) { - g_debug("VMSG got UDP connect-back v%u REQ from %s", - vmsg->version, node_infostr(n)); - } - /* * Version 1 included the GUID at the end of the payload. * Version 2 uses the message's GUID itself to store the GUID @@ -691,10 +771,10 @@ * XXX for now, we only send GTKG/7v1, although GTKG/7v2 is more compact. */ void -vmsg_send_udp_connect_back(struct gnutella_node *n, guint16 port) +vmsg_send_udp_connect_back(gnutella_node_t *n, uint16 port) { - guint32 paysize = sizeof(port) + 16; - guint32 msgsize; + uint32 paysize = sizeof(port) + 16; + uint32 msgsize; char *payload; g_return_if_fail(0 != port); @@ -707,9 +787,10 @@ gmsg_sendto_one(n, v_tmp, msgsize); - if (GNET_PROPERTY(vmsg_debug) > 2) - g_debug("VMSG sent UDP connect-back v1 REQ for port %u to %s", - port, node_infostr(n)); + if (GNET_PROPERTY(vmsg_debug) > 2 || GNET_PROPERTY(log_vmsg_tx)) { + g_debug("VMSG sent %s for port %u to %s", + gmsg_infostr_full(v_tmp, msgsize), port, node_infostr(n)); + } } /** @@ -723,15 +804,15 @@ * The version 2 includes both our IP and port. */ static void -vmsg_send_proxy_ack(struct gnutella_node *n, +vmsg_send_proxy_ack(gnutella_node_t *n, const struct guid *muid, int version) { - guint32 paysize = sizeof(guint32) + sizeof(guint16); - guint32 msgsize; + uint32 paysize = sizeof(uint32) + sizeof(uint16); + uint32 msgsize; char *payload; if (version == 1) - paysize -= sizeof(guint32); /* No IP address for v1 */ + paysize -= sizeof(uint32); /* No IP address for v1 */ msgsize = vmsg_fill_header(v_tmp_header, paysize, sizeof v_tmp); gnutella_header_set_muid(v_tmp_header, muid); @@ -748,23 +829,27 @@ * proxify pushes to it ASAP. */ - gmsg_ctrl_sendto_one(n, v_tmp, msgsize); - - if (GNET_PROPERTY(vmsg_debug) > 2) - g_debug("VMSG sent proxy ACK v%d to %s", version, node_infostr(n)); + vmsg_ctrl_send_data(n, v_tmp, msgsize); } /** * Handle reception of the "Push Proxy Request" message. */ static void -handle_proxy_req(struct gnutella_node *n, +handle_proxy_req(gnutella_node_t *n, const struct vmsg *vmsg, const char *unused_payload, size_t unused_size) { (void) unused_payload; (void) unused_size; /* + * This message is only meaningful from TCP. + */ + + if (!vmsg_from_tcp(n, vmsg)) + return; + + /* * Normally, a firewalled host should be a leaf node, not an UP. * Warn if node is not a leaf, but accept to be the push proxy * nonetheless. @@ -794,9 +879,9 @@ * `muid' as the message ID (which is our GUID). */ void -vmsg_send_proxy_req(struct gnutella_node *n, const struct guid *muid) +vmsg_send_proxy_req(gnutella_node_t *n, const struct guid *muid) { - guint32 msgsize; + uint32 msgsize; g_assert(!NODE_IS_LEAF(n)); @@ -818,11 +903,7 @@ (void) vmsg_fill_type(v_tmp_data, T_LIME, 21, 1); - gmsg_sendto_one(n, v_tmp, msgsize); - - if (GNET_PROPERTY(vmsg_debug) > 2) { - g_debug("VMSG sent proxy REQ to %s", node_infostr(n)); - } + vmsg_send_data(n, v_tmp, msgsize); } /** @@ -832,11 +913,11 @@ * Version 2 holds both the IP and port of our push-proxy. */ static void -handle_proxy_ack(struct gnutella_node *n, +handle_proxy_ack(gnutella_node_t *n, const struct vmsg *vmsg, const char *payload, size_t size) { host_addr_t ha; - guint16 port; + uint16 port; if (VMSG_SHORT_SIZE(n, vmsg, size, vmsg->version < 2 ? 2 : 6)) return; @@ -861,9 +942,11 @@ host_addr_port_to_string(ha, port), vmsg->name, node_infostr(n)); return; } - if (hostiles_check(ha)) { - g_message("VMSG got proxy ACK from hostile %s: proxy at %s", - node_infostr(n), host_addr_port_to_string(ha, port)); + if (hostiles_is_bad(ha)) { + hostiles_flags_t flags = hostiles_check(ha); + g_message("VMSG ignoring proxy ACK from hostile %s (%s): proxy at %s", + node_infostr(n), hostiles_flags_to_string(flags), + host_addr_port_to_string(ha, port)); return; } @@ -875,16 +958,23 @@ * many results the search filters of the leave (ourselves) let pass through. */ static void -handle_qstat_req(struct gnutella_node *n, const struct vmsg *unused_vmsg, +handle_qstat_req(gnutella_node_t *n, const struct vmsg *vmsg, const char *unused_payload, size_t unused_size) { - guint32 kept; + uint32 kept; const struct guid *muid = gnutella_header_get_muid(&n->header); - (void) unused_vmsg; (void) unused_payload; (void) unused_size; + /* + * Ignore servents requesting the status of our queries via UDP. + * This is only supposed to happen via TCP (from our ultra peer). + */ + + if (!vmsg_from_tcp(n, vmsg)) + return; + if (!search_get_kept_results_by_muid(muid, &kept)) { /* * We did not find any search for this MUID. Either the remote @@ -892,7 +982,7 @@ */ if (GNET_PROPERTY(vmsg_debug)) { - g_warning("VMSG could not find matching search for MUID %s", + g_warning("VMSG could not find matching search for #%s", guid_hex_str(muid)); } kept = 0xffffU; /* Magic value telling them to stop the search */ @@ -917,15 +1007,17 @@ * `muid' as the message ID (which is the query ID). */ void -vmsg_send_qstat_req(struct gnutella_node *n, const struct guid *muid) +vmsg_send_qstat_req(gnutella_node_t *n, const struct guid *muid) { - guint32 msgsize; + uint32 msgsize; + + g_assert(!NODE_IS_UDP(n)); /* Can only be sent via TCP from UP -> leaf */ msgsize = vmsg_fill_header(v_tmp_header, 0, sizeof v_tmp); gnutella_header_set_muid(v_tmp_header, muid); (void) vmsg_fill_type(v_tmp_data, T_BEAR, 11, 1); - gmsg_ctrl_sendto_one(n, v_tmp, msgsize); /* Send ASAP */ + vmsg_ctrl_send_data(n, v_tmp, msgsize); /* Send ASAP */ } /** @@ -934,10 +1026,10 @@ * query. */ static void -handle_qstat_answer(struct gnutella_node *n, +handle_qstat_answer(gnutella_node_t *n, const struct vmsg *vmsg, const char *payload, size_t size) { - guint16 kept; + uint16 kept; if (VMSG_SHORT_SIZE(n, vmsg, size, 2)) return; @@ -958,11 +1050,11 @@ * @param hits is the number of hits our filters did not drop. */ void -vmsg_send_qstat_answer(struct gnutella_node *n, - const struct guid *muid, guint16 hits) +vmsg_send_qstat_answer(gnutella_node_t *n, + const struct guid *muid, uint16 hits) { - guint32 msgsize; - guint32 paysize = sizeof(guint16); + uint32 msgsize; + uint32 paysize = sizeof(uint16); char *payload; msgsize = vmsg_fill_header(v_tmp_header, paysize, sizeof v_tmp); @@ -971,11 +1063,12 @@ poke_le16(payload, hits); - if (GNET_PROPERTY(vmsg_debug) > 2) - g_debug("VMSG sending %s with hits=%u to %s", - gmsg_infostr_full(v_tmp, msgsize), hits, node_infostr(n)); - gmsg_ctrl_sendto_one(n, v_tmp, msgsize); /* Send it ASAP */ + + if (GNET_PROPERTY(vmsg_debug) > 2 || GNET_PROPERTY(log_vmsg_tx)) { + g_debug("VMSG sent %s with hits=%u to %s", + gmsg_infostr_full(v_tmp, msgsize), hits, node_infostr(n)); + } } /** @@ -984,7 +1077,7 @@ * determined it was not TCP-firewalled. */ static void -handle_proxy_cancel(struct gnutella_node *n, const struct vmsg *unused_vmsg, +handle_proxy_cancel(gnutella_node_t *n, const struct vmsg *unused_vmsg, const char *unused_payload, size_t unused_size) { (void) unused_vmsg; @@ -998,18 +1091,15 @@ * Send a "Push Proxy Cancel" message to specified node. */ void -vmsg_send_proxy_cancel(struct gnutella_node *n) +vmsg_send_proxy_cancel(gnutella_node_t *n) { - guint32 msgsize; + uint32 msgsize; msgsize = vmsg_fill_header(v_tmp_header, 0, sizeof v_tmp); gnutella_header_set_muid(v_tmp_header, &blank_guid); (void) vmsg_fill_type(v_tmp_data, T_GTKG, 21, 1); - gmsg_sendto_one(n, v_tmp, msgsize); - - if (GNET_PROPERTY(vmsg_debug) > 2) - g_debug("VMSG sent proxy CANCEL to %s", node_infostr(n)); + vmsg_send_data(n, v_tmp, msgsize); } /** @@ -1018,24 +1108,20 @@ * given query. The message bears the MUID of the query we sent out. */ static void -handle_oob_reply_ind(struct gnutella_node *n, +handle_oob_reply_ind(gnutella_node_t *n, const struct vmsg *vmsg, const char *payload, size_t size) { - gboolean can_recv_unsolicited = FALSE; + bool can_recv_unsolicited = FALSE; size_t expected_size; - gboolean secure; + bool secure; int hits; - if (!NODE_IS_UDP(n)) { - /* - * Uh-oh, someone forwarded us a LIME/12 message. Ignore it! - */ + /* + * We only expect LIME/12 messages from UDP. + */ - g_warning("got %s/%uv%u from TCP via %s, ignoring", - vendor_code_to_string(vmsg->vendor), - vmsg->id, vmsg->version, node_infostr(n)); + if (!vmsg_from_udp(n, vmsg)) return; - } switch (vmsg->version) { case 1: @@ -1085,10 +1171,10 @@ * @param secure TRUE -> secure OOB; FALSE -> normal OOB. */ pmsg_t * -vmsg_build_oob_reply_ind(const struct guid *muid, guint8 hits, gboolean secure) +vmsg_build_oob_reply_ind(const struct guid *muid, uint8 hits, bool secure) { - guint32 msgsize; - guint32 paysize = sizeof(guint8) + sizeof(guint8); + uint32 msgsize; + uint32 paysize = sizeof(uint8) + sizeof(uint8); char *payload; g_assert(muid); @@ -1100,7 +1186,14 @@ payload0 = hits; payload1 = GNET_PROPERTY(is_udp_firewalled) ? 0x0 : 0x1; - return gmsg_to_pmsg(v_tmp, msgsize); + /* + * The "OOB Reply Indication" (LIME/12) is now sent as a control message. + * We want to get this out to the querying host quickly and ahead of + * other less prioritary UDP traffic, especially if bandwidth is tight. + * --RAM, 2012-09-16 + */ + + return gmsg_to_ctrl_pmsg(v_tmp, msgsize); } #define MAX_OOB_TOKEN_SIZE 16 @@ -1138,7 +1231,7 @@ } if (exvcnt) { ext_reset(exv, MAX_EXTVEC); - } + } return token_size > 0 ? array_init(token, token_size) : zero_array; } @@ -1148,7 +1241,7 @@ * for the query identified by the MUID of the message. */ static void -handle_oob_reply_ack(struct gnutella_node *n, +handle_oob_reply_ack(gnutella_node_t *n, const struct vmsg *vmsg, const char *payload, size_t size) { char token_dataMAX_OOB_TOKEN_SIZE; @@ -1162,12 +1255,8 @@ * We expect those ACKs to come back via UDP. */ - if (!NODE_IS_UDP(n)) { - g_warning("got %s/%uv%u from TCP via %s, ignoring", - vendor_code_to_string(vmsg->vendor), - vmsg->id, vmsg->version, node_infostr(n)); + if (!vmsg_from_udp(n, vmsg)) return; - } wanted = peek_u8(&payload0); @@ -1184,36 +1273,25 @@ * Node does not want us to OOB-proxy its queries. */ static void -handle_oob_proxy_veto(struct gnutella_node *n, +handle_oob_proxy_veto(gnutella_node_t *n, const struct vmsg *vmsg, const char *payload, size_t size) { - const char *msg = NULL; - - if (NODE_IS_UDP(n)) { - msg = "UDP"; - goto ignore; - } + if (!vmsg_from_tcp(n, vmsg)) + return; if (!NODE_IS_LEAF(n)) { - msg = "non-leaf node"; - goto ignore; + vmsg_ignore(n, vmsg); + return; } if (size > 0 && peek_u8(payload) < 3) { /* we support OOB v3 */ - n->flags &= ~NODE_F_NO_OOB_PROXY; + n->attrs2 &= ~NODE_A2_NO_OOB_PROXY; } else { - n->flags |= NODE_F_NO_OOB_PROXY; + n->attrs2 |= NODE_A2_NO_OOB_PROXY; } return; - -ignore: - if (GNET_PROPERTY(vmsg_debug)) { - g_warning("got %s/%uv%u from %s via %s, ignoring", - vendor_code_to_string(vmsg->vendor), - vmsg->id, vmsg->version, msg, node_infostr(n)); - } } /** @@ -1225,11 +1303,11 @@ * compress the query hits if necessary and if supported. */ void -vmsg_send_oob_reply_ack(struct gnutella_node *n, - const struct guid *muid, guint8 want, const struct array *token) +vmsg_send_oob_reply_ack(gnutella_node_t *n, + const struct guid *muid, uint8 want, const struct array *token) { - guint32 msgsize; - guint32 paysize = sizeof(guint8); + uint32 msgsize; + uint32 paysize = sizeof(uint8); char *payload; g_assert(NODE_IS_UDP(n)); @@ -1250,11 +1328,29 @@ vmsg_advertise_udp_compression(v_tmp_header); /* Can deflate UDP */ gnutella_header_set_muid(v_tmp_header, muid); - udp_send_msg(n, v_tmp, msgsize); + /* + * The "OOB Reply ACK" message (LIME/11) is now sent as a control message. + * We want to get this out to the replying host quickly and ahead of + * other less prioritary UDP traffic, especially if bandwidth is tight, + * minimizing the chances of it being dropped. + * --RAM, 2012-09-23 + */ + + udp_ctrl_send_msg(n, v_tmp, msgsize); - if (GNET_PROPERTY(vmsg_debug) > 2) - g_debug("VMSG sent OOB reply ACK %s to %s for %u hit%s", - guid_hex_str(muid), node_infostr(n), want, want == 1 ? "" : "s"); + if ( + GNET_PROPERTY(vmsg_debug) > 2 || + GNET_PROPERTY(secure_oob_debug) || + GNET_PROPERTY(log_vmsg_tx) + ) { + char buf17; + if (token->data) + bin_to_hex_buf(token->data, token->size, buf, sizeof buf); + g_debug("VMSG sent %s to %s for %u hit%s%s%s", + gmsg_infostr_full(v_tmp, msgsize), + node_infostr(n), want, plural(want), + token->data ? ", token=0x" : "", token->data ? buf : ""); + } } /** @@ -1262,7 +1358,7 @@ * from another host about time synchronization. */ static void -handle_time_sync_req(struct gnutella_node *n, +handle_time_sync_req(gnutella_node_t *n, const struct vmsg *vmsg, const char *unused_payload, size_t size) { tm_t got; @@ -1272,6 +1368,11 @@ if (VMSG_SHORT_SIZE(n, vmsg, size, 1)) return; + if (node_udp_is_old(n)) { + gnet_stats_count_dropped(n, MSG_DROP_TOO_OLD); + return; + } + /* * We have received the message well before, but this is the first * time we can timestamp it really... We're not NTP, so the precision @@ -1290,12 +1391,12 @@ * a previous time synchronization request. */ static void -handle_time_sync_reply(struct gnutella_node *n, +handle_time_sync_reply(gnutella_node_t *n, const struct vmsg *vmsg, const char *payload, size_t size) { tm_t got, sent, replied, received; const struct guid *muid; - gboolean ntp; + bool ntp; if (VMSG_SHORT_SIZE(n, vmsg, size, 9)) return; @@ -1309,7 +1410,7 @@ * Decompile send time. */ - STATIC_ASSERT(sizeof(sent) >= 2 * sizeof(guint32)); + STATIC_ASSERT(sizeof(sent) >= 2 * sizeof(uint32)); muid = gnutella_header_get_muid(&n->header); sent.tv_sec = peek_be32(&muid->v0); @@ -1336,15 +1437,15 @@ * Callback invoked when "Time Sync Request" is about to be sent. * Writes current time in the first half of the MUID. */ -static gboolean -vmsg_time_sync_req_stamp(pmsg_t *mb, const struct mqueue *unused_q) +static bool +vmsg_time_sync_req_stamp(const pmsg_t *mb, const void *unused_q) { struct guid *muid = cast_to_guid_ptr(pmsg_start(mb)); tm_t old, now; (void) unused_q; g_assert(pmsg_is_writable(mb)); - STATIC_ASSERT(sizeof(now) >= 2 * sizeof(guint32)); + STATIC_ASSERT(sizeof(now) >= 2 * sizeof(uint32)); /* * Read the old timestamp. @@ -1373,6 +1474,15 @@ } /** + * Same as vmsg_time_sync_req_stamp() but for UDP messages. + */ +static bool +vmsg_time_sync_req_stamp_udp(const pmsg_t *mb) +{ + return vmsg_time_sync_req_stamp(mb, NULL); +} + +/** * Send a "Time Sync Request" message, asking them to echo back their own * time so that we can compute our clock differences and measure round trip * times. The time at which we send the message is included in the first @@ -1384,10 +1494,10 @@ * The `sent' parameter holds the initial "T1" timestamp markup. */ void -vmsg_send_time_sync_req(struct gnutella_node *n, gboolean ntp, tm_t *sent) +vmsg_send_time_sync_req(gnutella_node_t *n, bool ntp, tm_t *sent) { - guint32 msgsize; - guint32 paysize = sizeof(guint8); + uint32 msgsize; + uint32 paysize = sizeof(uint8); char *payload; struct guid *muid; pmsg_t *mb; @@ -1408,9 +1518,19 @@ * the current time now, because we have to return it to the caller, * but it will be superseded when the message is finally scheduled to * be sent by the queue. + * + * For UDP destinations, we install a hook check instead of a plain check + * because the UDP TX scheduler can enqueue underneath the UDP message + * queue and we want the timestamp to be written as late as possible. + * Plain checks are invoked by the message queue whilst hooks are invoked + * at the UDP TX scheduler level. + * --RAM, 2012-10-11 */ - pmsg_set_check(mb, vmsg_time_sync_req_stamp); + if (NODE_IS_UDP(n)) + pmsg_set_hook(mb, vmsg_time_sync_req_stamp_udp); + else + pmsg_set_check(mb, vmsg_time_sync_req_stamp); poke_be32(&muid->v0, sent->tv_sec); poke_be32(&muid->v4, sent->tv_usec); @@ -1422,15 +1542,15 @@ * Callback invoked when "Time Sync Reply" is about to be sent. * Writes current time in the second half of the MUID. */ -static gboolean -vmsg_time_sync_reply_stamp(pmsg_t *mb, const struct mqueue *unused_q) +static bool +vmsg_time_sync_reply_stamp(const pmsg_t *mb, const void *unused_q) { struct guid *muid = cast_to_guid_ptr(pmsg_start(mb)); tm_t now; (void) unused_q; g_assert(pmsg_is_writable(mb)); - STATIC_ASSERT(sizeof(now) >= 2 * sizeof(guint32)); + STATIC_ASSERT(sizeof(now) >= 2 * sizeof(uint32)); tm_now_exact(&now); now.tv_sec = clock_loc2gmt(now.tv_sec); @@ -1447,10 +1567,10 @@ * The time in `got' is the time at which we received their request. */ void -vmsg_send_time_sync_reply(struct gnutella_node *n, gboolean ntp, tm_t *got) +vmsg_send_time_sync_reply(gnutella_node_t *n, bool ntp, tm_t *got) { - guint32 msgsize; - guint32 paysize = sizeof(guint8) + 2 * sizeof(guint32); + uint32 msgsize; + uint32 paysize = sizeof(uint8) + 2 * sizeof(uint32); char *payload; char *muid; pmsg_t *mb; @@ -1495,23 +1615,19 @@ * Handle reception of an UDP crawler ping. */ static void -handle_udp_crawler_ping(struct gnutella_node *n, +handle_udp_crawler_ping(gnutella_node_t *n, const struct vmsg *vmsg, const char *payload, size_t size) { - guint8 number_up; - guint8 number_leaves; - guint8 features; + uint8 number_up; + uint8 number_leaves; + uint8 features; /* * We expect those messages to come via UDP. */ - if (!NODE_IS_UDP(n)) { - g_warning("got %s/%uv%u from TCP via %s, ignoring", - vendor_code_to_string(vmsg->vendor), - vmsg->id, vmsg->version, node_infostr(n)); + if (!vmsg_from_udp(n, vmsg)) return; - } /* * The format of the message was reverse-engineered from LimeWire's code. @@ -1547,10 +1663,10 @@ * The supplied message block contains the payload to send back. */ void -vmsg_send_udp_crawler_pong(struct gnutella_node *n, pmsg_t *mb) +vmsg_send_udp_crawler_pong(gnutella_node_t *n, pmsg_t *mb) { - guint32 msgsize; - guint32 paysize = pmsg_size(mb); + uint32 msgsize; + uint32 paysize = pmsg_size(mb); char *payload; g_assert(NODE_IS_UDP(n)); @@ -1563,15 +1679,15 @@ memcpy(payload, pmsg_start(mb), paysize); - if (GNET_PROPERTY(vmsg_debug) > 2) { - guint8 nup = peek_u8(&payload0); - guint8 nleaves = peek_u8(&payload1); + udp_send_msg(n, v_tmp, msgsize); + + if (GNET_PROPERTY(vmsg_debug) > 2 || GNET_PROPERTY(log_vmsg_tx)) { + uint8 nup = peek_u8(&payload0); + uint8 nleaves = peek_u8(&payload1); - g_debug("VMSG sending %s with up=%u and leaves=%u to %s", + g_debug("VMSG sent %s with up=%u and leaves=%u to %s", gmsg_infostr_full(v_tmp, msgsize), nup, nleaves, node_infostr(n)); } - - udp_send_msg(n, v_tmp, msgsize); } /** @@ -1581,12 +1697,17 @@ * It must be replied with an urgent GTKG/23v1 "Node Info Reply" message. */ static void -handle_node_info_req(struct gnutella_node *n, +handle_node_info_req(gnutella_node_t *n, const struct vmsg *vmsg, const char *payload, size_t size) { if (VMSG_SHORT_SIZE(n, vmsg, size, 4)) return; + if (node_udp_is_old(n)) { + gnet_stats_count_dropped(n, MSG_DROP_TOO_OLD); + return; + } + /* XXX */ (void) payload; } @@ -1602,15 +1723,15 @@ * @param ri the node information we have to format and send back */ void -vmsg_send_node_info_ans(struct gnutella_node *n, const rnode_info_t *ri) +vmsg_send_node_info_ans(gnutella_node_t *n, const rnode_info_t *ri) { - guint32 msgsize; - guint32 paysize; + uint32 msgsize; + uint32 paysize; ggep_stream_t gs; int ggep_len; char *payload, *p; char *payload_end = &v_tmpsizeof v_tmp; /* First byte beyond buffer */ - guint i; + uint i; payload = vmsg_fill_type(v_tmp_data, T_GTKG, 23, 1); p = payload; @@ -1622,17 +1743,17 @@ /* General information always returned */ - for (i = 0; i < G_N_ELEMENTS(ri->vendor); i++) + for (i = 0; i < N_ITEMS(ri->vendor); i++) p = poke_u8(p, ri->vendori); p = poke_u8(p, ri->mode); p = poke_be32(p, ri->answer_flags); p = poke_be32(p, ri->op_flags); - p = poke_u8(p, G_N_ELEMENTS(ri->features)); + p = poke_u8(p, N_ITEMS(ri->features)); - g_assert(ri->features_count == G_N_ELEMENTS(ri->features)); + g_assert(ri->features_count == N_ITEMS(ri->features)); - for (i = 0; i < G_N_ELEMENTS(ri->features); i++) + for (i = 0; i < N_ITEMS(ri->features); i++) p = poke_be32(p, ri->featuresi); p = poke_u8(p, ri->max_ultra_up); @@ -1692,10 +1813,10 @@ ggep_stream_init(&gs, p, payload_end - p); if (ri->answer_flags & RNODE_RQ_GGEP_DU) { - char uptimesizeof(guint64); - guint len; + char uptimesizeof(uint64); + uint len; - len = ggept_du_encode(ri->ggep_du, uptime); + len = ggept_du_encode(ri->ggep_du, uptime, sizeof uptime); ggep_stream_pack(&gs, GGEP_NAME(DU), uptime, len, 0); } @@ -1742,10 +1863,7 @@ * queue, much like "alive" pongs). */ - if (NODE_IS_UDP(n)) - udp_send_msg(n, v_tmp, msgsize); - else - gmsg_ctrl_sendto_one(n, v_tmp, msgsize); + vmsg_ctrl_send_data(n, v_tmp, msgsize); } /** @@ -1754,7 +1872,7 @@ * This messsage is sent in reply to a GTKG/22v1 "Node Info Request". */ static void -handle_node_info_ans(struct gnutella_node *n, +handle_node_info_ans(gnutella_node_t *n, const struct vmsg *vmsg, const char *payload, size_t size) { if (VMSG_SHORT_SIZE(n, vmsg, size, 20)) @@ -1769,7 +1887,7 @@ char data256; } svn_release_signature; -static gboolean +static bool latest_svn_release_changed(property_t prop) { char datasizeof svn_release_signature.data, hexsizeof data * 2 + 1; @@ -1785,7 +1903,7 @@ hex_length = strlen(hex); if (hex_length > 0 && hex_length / 2 < sizeof data) { struct array signature; - guint32 revision; + uint32 revision; time_t date; data_length = base16_decode(data, sizeof data, hex, hex_length); @@ -1804,14 +1922,14 @@ return FALSE; } -static gboolean +static bool svn_release_signature_is_valid(void) { - static gboolean initialized; + static bool initialized; if (!initialized) { initialized = TRUE; - + gnet_prop_add_prop_changed_listener(PROP_LATEST_SVN_RELEASE_REVISION, latest_svn_release_changed, FALSE); gnet_prop_add_prop_changed_listener(PROP_LATEST_SVN_RELEASE_DATE, @@ -1823,13 +1941,13 @@ } static void -vmsg_send_svn_release_notify(struct gnutella_node *n) +vmsg_send_svn_release_notify(gnutella_node_t *n) { - guint32 msgsize; - guint32 paysize; - char *payload; + uint32 msgsize; + uint32 paysize; + char *payload, *end; - g_return_if_fail(!NODE_IS_UDP(n)); + g_return_if_fail(!NODE_IS_UDP(n)); if (!(NODE_A_CAN_SVN_NOTIFY & n->attrs)) return; @@ -1841,12 +1959,12 @@ return; n->svn_release_revision = GNET_PROPERTY(latest_svn_release_revision); - + payload = vmsg_fill_type(v_tmp_data, T_GTKG, 24, 1); - poke_be32(&payload0, GNET_PROPERTY(latest_svn_release_revision)); - poke_be32(&payload4, GNET_PROPERTY(latest_svn_release_date)); - memcpy(&payload8, svn_release_signature.data, svn_release_signature.size); - paysize = 8 + svn_release_signature.size; + end = poke_be32(payload, GNET_PROPERTY(latest_svn_release_revision)); + end = poke_be32(end, GNET_PROPERTY(latest_svn_release_date)); + end = mempcpy(end, svn_release_signature.data, svn_release_signature.size); + paysize = ptr_diff(end, payload); msgsize = vmsg_fill_header(v_tmp_header, paysize, sizeof v_tmp); message_set_muid(v_tmp_header, GTA_MSG_VENDOR); @@ -1854,16 +1972,16 @@ } static void -handle_svn_release_notify(struct gnutella_node *n, +handle_svn_release_notify(gnutella_node_t *n, const struct vmsg *vmsg, const char *payload, size_t size) { struct array signature; - guint32 revision; + uint32 revision; time_t date; if (NODE_IS_UDP(n)) return; - + if (VMSG_SHORT_SIZE(n, vmsg, size, 16)) return; @@ -1888,7 +2006,7 @@ hex = g_malloc(hex_length + 1); base16_encode(hex, hex_length, signature.data, signature.size); hexhex_length = '\0'; - + gnet_prop_set_guint32_val(PROP_LATEST_SVN_RELEASE_REVISION, revision); gnet_prop_set_timestamp_val(PROP_LATEST_SVN_RELEASE_DATE, date); gnet_prop_set_string(PROP_LATEST_SVN_RELEASE_SIGNATURE, hex); @@ -1925,17 +2043,17 @@ VMSG_HEAD_STATUS_FIREWALLED = 1 << 2, VMSG_HEAD_STATUS_DOWNLOADING = 1 << 3, - + VMSG_HEAD_CODE_MASK = 0x03 }; /** * Calculates the byte value describing our queue status for a HEAD Pong. */ -static guint8 +static uint8 head_pong_queue_status(void) { - guint32 maximum, running; + uint32 maximum, running; maximum = GNET_PROPERTY(max_uploads); running = GNET_PROPERTY(ul_running); @@ -1944,19 +2062,19 @@ } else if (running >= maximum) { return 0; } else { - guint32 slots; - slots = maximum - running; + uint32 slots; + slots = maximum - running; slots = MIN(0x7eU, slots); - return -(guint8)slots; + return -(uint8)slots; } } static void -vmsg_send_head_pong_v1(struct gnutella_node *n, const struct sha1 *sha1, - guint8 code, guint8 flags) +vmsg_send_head_pong_v1(gnutella_node_t *n, const struct sha1 *sha1, + uint8 code, uint8 flags) { - guint32 msgsize; - guint32 paysize; + uint32 msgsize; + uint32 paysize; char *payload, *p; payload = vmsg_fill_type(v_tmp_data, T_LIME, 24, 1); @@ -1965,7 +2083,7 @@ flags &= VMSG_HEAD_F_MASK; p = poke_u8(&payload0, flags); - p = poke_u8(&payload1, code); + p = poke_u8(p, code); if (VMSG_HEAD_CODE_NOT_FOUND == code) { flags = 0; @@ -1982,16 +2100,16 @@ /* Optional firewalled alternate locations */ if (VMSG_HEAD_F_ALT_PUSH & flags) { - flags &= ~VMSG_HEAD_F_ALT_PUSH; /* Not implemented */ + flags &= ~VMSG_HEAD_F_ALT_PUSH; /* Not implemented */ } /* Optional alternate locations */ if (VMSG_HEAD_F_ALT & flags) { gnet_host_t hvec15; /* 15 * 6 = 90 bytes (max) */ int hcnt = 0; - + if (sha1) { - hcnt = dmesh_fill_alternate(sha1, hvec, G_N_ELEMENTS(hvec)); + hcnt = dmesh_fill_alternate(sha1, hvec, N_ITEMS(hvec)); } if (hcnt > 0) { int i; @@ -2028,13 +2146,13 @@ } static void -vmsg_send_head_pong_v2(struct gnutella_node *n, const struct sha1 *sha1, - guint8 code, guint8 flags) +vmsg_send_head_pong_v2(gnutella_node_t *n, const struct sha1 *sha1, + uint8 code, uint8 flags) { ggep_stream_t gs; size_t ggep_len; - guint32 msgsize; - guint32 paysize; + uint32 msgsize; + uint32 paysize; char *payload; payload = vmsg_fill_type(v_tmp_data, T_LIME, 24, 2); @@ -2047,19 +2165,19 @@ if (!ggep_stream_pack(&gs, GGEP_NAME(C), &code, sizeof code, 0)) goto failure; } else { - guint8 queue; - guint8 caps; + uint8 queue; + uint8 caps; code |= GNET_PROPERTY(is_firewalled) ? VMSG_HEAD_STATUS_FIREWALLED : 0; if (!ggep_stream_pack(&gs, GGEP_NAME(C), &code, sizeof code, 0)) goto failure; - - queue = head_pong_queue_status(); + + queue = head_pong_queue_status(); if (!ggep_stream_pack(&gs, GGEP_NAME(Q), &queue, sizeof queue, 0)) goto failure; - if (!ggep_stream_pack(&gs, GGEP_NAME(V), "GTKG", 4, 0)) + if (!ggep_stream_pack(&gs, GGEP_NAME(V), GTA_VENDOR_CODE, 4, 0)) goto failure; caps = tls_enabled() ? VMSG_HEAD_F_TLS : 0; @@ -2072,7 +2190,7 @@ gnet_host_t hvec15; /* 15 * 18 = 270 bytes (max) */ unsigned hcnt; - hcnt = dmesh_fill_alternate(sha1, hvec, G_N_ELEMENTS(hvec)); + hcnt = dmesh_fill_alternate(sha1, hvec, N_ITEMS(hvec)); if (hcnt > 0) { if (GGEP_OK != ggept_a_pack(&gs, hvec, hcnt)) goto failure; @@ -2084,11 +2202,6 @@ ggep_len = ggep_stream_close(&gs); paysize += ggep_len; - if (GNET_PROPERTY(vmsg_debug) > 1) { - g_debug("VMSG sending HEAD Pong v2 to %s (%u bytes)", - node_infostr(n), paysize); - } - msgsize = vmsg_fill_header(v_tmp_header, paysize, sizeof v_tmp); gnutella_header_set_muid(v_tmp_header, gnutella_header_get_muid(&n->header)); @@ -2104,7 +2217,7 @@ const struct sha1 *sha1;/**< The SHA-1 of the HEAD Ping request (atom) */ struct nid *node_id; /**< The sender of the HEAD Ping */ host_addr_t addr; /**< In case of UDP, the address of the sender */ - guint16 port; /**< In case of UDP, the port of the sender */ + uint16 port; /**< In case of UDP, the port of the sender */ }; struct head_ping_source { @@ -2129,7 +2242,7 @@ } static void -head_ping_expire(gboolean forced) +head_ping_expire(bool forced) { time_t now; @@ -2157,7 +2270,7 @@ * registered files. */ static void -head_ping_timer(cqueue_t *cq, gpointer unused_udata) +head_ping_timer(cqueue_t *cq, void *unused_udata) { (void) unused_udata; @@ -2165,22 +2278,24 @@ * Re-install timer for next time. */ + cq_zero(cq, &head_ping_ev); + head_ping_ev = cq_insert(cq, HEAD_PING_PERIODIC_MS, head_ping_timer, NULL); head_ping_expire(FALSE); } -static struct head_ping_source * +static struct head_ping_source * head_ping_register_intern(const struct guid *muid, const struct sha1 *sha1, const struct nid *node_id) { struct head_ping_source *source; - guint length; + uint length; g_assert(muid); g_return_val_if_fail(head_pings, NULL); if (!node_id_self(node_id)) { - struct gnutella_node *n = node_active_by_id(node_id); + gnutella_node_t *n = node_active_by_id(node_id); if (!n || (NODE_IS_UDP(n) && !host_is_valid(n->addr, n->port))) { return NULL; } @@ -2195,7 +2310,7 @@ if (length >= HEAD_PING_MAX) { return NULL; } else if (length > (HEAD_PING_MAX / 4) * 3) { - if ((random_u32() % HEAD_PING_MAX) < length) + if (random_value(HEAD_PING_MAX - 1) < length) return NULL; } @@ -2203,7 +2318,7 @@ source->muid = *muid; source->added = tm_time(); hash_list_append(head_pings, source); - + /* * We don't need the SHA-1 for routing, thus only record it * for debugging purposes or if we are the origin. @@ -2217,16 +2332,16 @@ return source; } -static gboolean +static bool head_ping_register_own(const struct guid *muid, - const struct sha1 *sha1, const struct gnutella_node *target) + const struct sha1 *sha1, const gnutella_node_t *target) { struct head_ping_source *source; g_return_val_if_fail(muid, FALSE); g_return_val_if_fail(sha1, FALSE); g_return_val_if_fail(target, FALSE); - + source = head_ping_register_intern(muid, sha1, NODE_ID_SELF); if (source) { if (NODE_IS_UDP(target)) { @@ -2242,16 +2357,16 @@ } } -static gboolean +static bool head_ping_register_forwarded(const struct guid *muid, - const struct sha1 *sha1, const struct gnutella_node *sender) + const struct sha1 *sha1, const gnutella_node_t *sender) { struct head_ping_source *source; - + g_return_val_if_fail(muid, FALSE); g_return_val_if_fail(sha1, FALSE); g_return_val_if_fail(sender, FALSE); - + source = head_ping_register_intern(muid, sha1, NODE_ID(sender)); if (source) { if (NODE_IS_UDP(sender)) { @@ -2291,18 +2406,19 @@ * push-proxy, so it can relay the message to the leaf bearing that GUID. */ void -vmsg_send_head_ping(const struct sha1 *sha1, host_addr_t addr, guint16 port, +vmsg_send_head_ping(const struct sha1 *sha1, host_addr_t addr, uint16 port, const struct guid *guid) { static const char urn_prefix = "urn:sha1:"; - struct gnutella_node *n; + gnutella_node_t *n; const struct guid *muid; - guint32 msgsize; - guint32 paysize; + uint32 msgsize; + uint32 paysize; char *payload; - guint8 flags = VMSG_HEAD_F_ALT; + uint8 flags = VMSG_HEAD_F_ALT; ggep_stream_t gs; size_t ggep_len; + void *p; /* * TODO: in order to handle VMSG_HEAD_F_RANGES, we need to be able to @@ -2318,10 +2434,9 @@ payload = vmsg_fill_type(v_tmp_data, T_LIME, 23, 2); - memcpy(&payload1, urn_prefix, CONST_STRLEN(urn_prefix)); - memcpy(&payload1 + CONST_STRLEN(urn_prefix), - sha1_base32(sha1), SHA1_BASE32_SIZE); - paysize = 1 + CONST_STRLEN(urn_prefix) + SHA1_BASE32_SIZE; + p = mempcpy(&payload1, urn_prefix, CONST_STRLEN(urn_prefix)); + p = mempcpy(p, sha1_base32(sha1), SHA1_BASE32_SIZE); + paysize = ptr_diff(p, payload); /* * Optional GGEP extensions. @@ -2354,7 +2469,7 @@ (void) ggep_stream_pack(&gs, GGEP_NAME(I6), NULL, 0, 0); } } else if (settings_running_ipv6()) { - guint8 b = 1; + uint8 b = 1; /* * Only running IPv6, let them know we're not interested in IPv4. @@ -2374,9 +2489,9 @@ msgsize = vmsg_fill_header(v_tmp_header, paysize, sizeof v_tmp); message_set_muid(v_tmp_header, GTA_MSG_VENDOR); muid = gnutella_header_get_muid(v_tmp_header); - + if (head_ping_register_own(muid, sha1, n)) { - if (GNET_PROPERTY(vmsg_debug) > 1) { + if (GNET_PROPERTY(vmsg_debug) > 1 || GNET_PROPERTY(log_vmsg_tx)) { g_debug( "VMSG sending HEAD Ping to %s (%u bytes) for urn:sha1:%s", node_infostr(n), paysize, sha1_base32(sha1)); @@ -2391,11 +2506,11 @@ * * @return the target node, or NULL if not found or not capable of handling it. */ -static struct gnutella_node * +static gnutella_node_t * head_ping_target_by_guid(const struct guid *guid) { - struct gnutella_node *n; - + gnutella_node_t *n; + n = node_by_guid(guid); if (n) { if (!(NODE_A_CAN_HEAD & n->attrs)) { @@ -2414,16 +2529,16 @@ * Handle reception of an UDP Head Ping */ static void -handle_head_ping(struct gnutella_node *n, +handle_head_ping(gnutella_node_t *n, const struct vmsg *vmsg, const char *payload, size_t size) { static const char urn_prefix = "urn:sha1:"; const size_t urn_length = CONST_STRLEN(urn_prefix) + SHA1_BASE32_SIZE; const size_t expect_size = 1 + urn_length; struct guid guid; - gboolean has_guid = FALSE; + bool has_guid = FALSE; struct sha1 sha1; - guint8 flags; + uint8 flags; /* * The format of the message was reverse-engineered from LimeWire's code. @@ -2437,16 +2552,6 @@ if (VMSG_SHORT_SIZE(n, vmsg, size, expect_size)) return; - if (GNET_PROPERTY(vmsg_debug) > 1) { - g_debug("VMSG got %s v%u from %s (TTL=%u, hops=%u, size=%zu)", - vmsg->name, - vmsg->version, - node_infostr(n), - gnutella_header_get_ttl(n->header), - gnutella_header_get_hops(n->header), - size); - } - if (NODE_IS_UDP(n)) inet_udp_got_unsolicited_incoming(); @@ -2513,7 +2618,7 @@ flags |= VMSG_HEAD_F_IPV6; if (ext_paylen(e) > 0) { - const guint8 *b = ext_payload(e); + const uint8 *b = ext_payload(e); if (*b) { flags |= VMSG_HEAD_F_IPV6_ONLY; } @@ -2533,8 +2638,7 @@ } if (has_guid) { if (GNET_PROPERTY(vmsg_debug) > 1) { - g_debug("VMSG HEAD Ping carries GUID %s", - guid_hex_str(&guid)); + g_debug("VMSG HEAD Ping #%s", guid_hex_str(&guid)); } } else { if (GNET_PROPERTY(vmsg_debug) > 1) { @@ -2544,7 +2648,7 @@ } if (has_guid && !guid_eq(&guid, GNET_PROPERTY(servent_guid))) { - struct gnutella_node *target; + gnutella_node_t *target; if (settings_is_leaf()) { if (GNET_PROPERTY(vmsg_debug) > 1) { @@ -2584,8 +2688,13 @@ } } } else { - const shared_file_t *sf; - guint8 code; + shared_file_t *sf; + uint8 code; + + if (node_udp_is_old(n)) { + gnet_stats_count_dropped(n, MSG_DROP_TOO_OLD); + return; + } sf = shared_file_by_sha1(&sha1); if (SHARE_REBUILDING == sf) { @@ -2601,7 +2710,7 @@ } else { if (sf) { const fileinfo_t *fi; - + shared_file_check(sf); fi = shared_file_fileinfo(sf); if (fi) { @@ -2622,6 +2731,7 @@ } code = VMSG_HEAD_CODE_COMPLETE; } + shared_file_unref(&sf); } else { if (GNET_PROPERTY(vmsg_debug) > 2) { g_debug("VMSG HEAD Ping: unknown file"); @@ -2657,7 +2767,7 @@ block_length(const struct array array) { if (array.size >= 2) { - guint len = peek_be16(array.data); + uint len = peek_be16(array.data); if (array.size >= len + 2) { return len; } @@ -2676,7 +2786,7 @@ while (array.size >= ilen) { host_addr_t addr; - guint16 port; + uint16 port; if (NET_TYPE_IPV4 == net) { addr = host_addr_peek_ipv4(&array.data0); @@ -2694,7 +2804,7 @@ } static void -forward_head_pong(struct gnutella_node *n, +forward_head_pong(gnutella_node_t *n, const struct head_ping_source *source) { /* @@ -2710,7 +2820,7 @@ gnutella_header_get_hops(&n->header) == 0 && settings_is_ultra() ) { - struct gnutella_node *target; + gnutella_node_t *target; if (0 != source->ping.port && is_host_addr(source->ping.addr)) { target = node_udp_get_addr_port(source->ping.addr, @@ -2732,20 +2842,20 @@ gnutella_header_get_ttl(&header) - 1); gnutella_header_set_hops(&header, gnutella_header_get_hops(&header) + 1); - + mb = gmsg_split_to_pmsg(header, n->data, n->size + GTA_HEADER_SIZE); vmsg_send_reply(target, mb); /* Forward to destination */ } } } -static void +static void handle_head_pong_v1(const struct head_ping_source *source, const char *payload, size_t size) { const char *vendor, *p, *endptr; - guint8 flags, code; - gint8 queue; + uint8 flags, code; + int8 queue; endptr = &payloadsize; @@ -2757,7 +2867,7 @@ * 1 Code response code with flags (not found, * firewalled, downloading, complete file) * 2 Vendor ID 4-letter vendor ID of sender - * 6 Queue Status + * 6 Queue Status * 7 variable data * * The pong may also carry alt-locs and available ranges. @@ -2818,7 +2928,7 @@ } break; } - + /* Optional ranges for partial files -- IGNORED FOR NOW */ if (VMSG_HEAD_F_RANGES & flags) { int len; @@ -2841,7 +2951,7 @@ /* Optional firewalled alternate locations -- IGNORED FOR NOW */ if (VMSG_HEAD_F_ALT_PUSH & flags) { int len; - + len = block_length(array_init(p, endptr - p)); if (len != 0 && (len < 23 || (len - 23) % 6)) { if (GNET_PROPERTY(vmsg_debug)) { @@ -2866,7 +2976,7 @@ if (VMSG_HEAD_F_ALT & flags) { int len; - + len = block_length(array_init(p, endptr - p)); if (len < 0 || len % 6) { if (GNET_PROPERTY(vmsg_debug)) { @@ -2942,7 +3052,7 @@ g_warning("GGEP \"Q\" payload too short"); } } else { - queue = (gint8) peek_u8(ext_payload(e)); + queue = (int8) peek_u8(ext_payload(e)); } break; case EXT_T_GGEP_A: @@ -2961,11 +3071,11 @@ break; case EXT_T_GGEP_T: /* TLS-capability bitmap for "A" */ case EXT_T_GGEP_ALT_TLS: /* TLS-capability bitmap for "ALT" */ - /* FIXME: Handle this */ + /* FIXME: Handle this */ break; case EXT_T_GGEP_T6: /* TLS-capability bitmap for "A6" */ case EXT_T_GGEP_ALT6_TLS: /* TLS-capability bitmap for "ALT6" */ - /* FIXME: Handle this */ + /* FIXME: Handle this */ break; default: if (GNET_PROPERTY(vmsg_debug)) { @@ -2984,7 +3094,7 @@ } if (exvcnt) { ext_reset(exv, MAX_EXTVEC); - } + } if (GNET_PROPERTY(vmsg_debug) > 1) { g_debug( @@ -3027,7 +3137,7 @@ (VMSG_HEAD_F_TLS & flags) && node_id_self(source->ping.node_id) && source->ping.port ) { - tls_cache_insert(source->ping.addr, source->ping.port); + tls_cache_insert(source->ping.addr, source->ping.port); } } @@ -3035,7 +3145,7 @@ * Handle reception of an Head Pong */ static void -handle_head_pong(struct gnutella_node *n, +handle_head_pong(gnutella_node_t *n, const struct vmsg *vmsg, const char *payload, size_t size) { const size_t expected_size = 2; /* v1: flags and code; v2: GGEP only */ @@ -3044,16 +3154,6 @@ if (VMSG_SHORT_SIZE(n, vmsg, size, expected_size)) return; - if (GNET_PROPERTY(vmsg_debug) > 1) { - g_debug("VMSG got %s v%u from %s (TTL=%u, hops=%u, size=%lu)", - vmsg->name, - vmsg->version, - node_infostr(n), - gnutella_header_get_ttl(n->header), - gnutella_header_get_hops(n->header), - (unsigned long) size); - } - source = head_ping_is_registered(gnutella_header_get_muid(&n->header)); if (source) { if (vmsg->version == 1) { @@ -3070,16 +3170,16 @@ } } -#if 0 +#if 0 /** * Send an "UDP Crawler Ping" message to specified node. -- For testing only */ void -vmsg_send_udp_crawler_ping(struct gnutella_node *n, - guint8 ultras, guint8 leaves, guint8 features) +vmsg_send_udp_crawler_ping(gnutella_node_t *n, + uint8 ultras, uint8 leaves, uint8 features) { - guint32 paysize = sizeof(ultras) + sizeof(leaves) + sizeof(features); - guint32 msgsize; + uint32 paysize = sizeof(ultras) + sizeof(leaves) + sizeof(features); + uint32 msgsize; char *payload; g_assert(NODE_IS_UDP(n)); @@ -3091,7 +3191,7 @@ poke_u8(&payload1, leaves); poke_u8(&payload2, features); - udp_send_msg(n, v_tmp, msgsize); + vmsg_send_data(n, v_tmp, msgsize); } #endif /* 0 */ @@ -3099,13 +3199,13 @@ * Handle the "Messages Supported" message. */ static void -handle_messages_supported(struct gnutella_node *n, +handle_messages_supported(gnutella_node_t *n, const struct vmsg *vmsg, const char *payload, size_t size) { const char *description; - guint16 count; + uint16 count; str_t *msgs; - GHashTable *handlers; + hset_t *handlers; if (NODE_IS_UDP(n)) /* Don't waste time if we get this via UDP */ return; @@ -3119,7 +3219,7 @@ if (GNET_PROPERTY(vmsg_debug) > 1) g_debug("VMSG %s supports %u vendor message%s", - node_infostr(n), count, count == 1 ? "" : "s"); + node_infostr(n), count, plural(count)); if (VMSG_SHORT_SIZE(n, vmsg, size, count * VMS_ITEM_SIZE + sizeof count)) return; @@ -3131,12 +3231,12 @@ */ msgs = str_new(count * 16); /* Pre-size generously */ - handlers = g_hash_table_new(pointer_hash_func, NULL); + handlers = hset_create(HASH_KEY_SELF, 0); while (count-- > 0) { struct vmsg vm; vendor_code_t vendor; - guint16 id, version; + uint16 id, version; vendor.u32 = peek_be32(&description0); id = peek_le16(&description4); @@ -3158,10 +3258,10 @@ g_debug("VMSG ...%s/%dv%d", vendor_code_to_string(vendor.u32), id, version); - g_hash_table_insert(handlers, func_to_pointer(vm.handler), NULL); + hset_insert(handlers, func_to_pointer(vm.handler)); } -#define CAN(x) (gm_hash_table_contains(handlers, func_to_pointer(x))) +#define CAN(x) (hset_contains(handlers, func_to_pointer(x))) if (CAN(handle_qstat_req) || CAN(handle_qstat_answer)) { node_set_leaf_guidance(NODE_ID(n), TRUE); @@ -3194,7 +3294,7 @@ #undef CAN str_destroy(msgs); - g_hash_table_destroy(handlers); + hset_free_null(&handlers); } /** @@ -3245,13 +3345,13 @@ * to be always understood */ void -vmsg_send_messages_supported(struct gnutella_node *n) +vmsg_send_messages_supported(gnutella_node_t *n) { - guint16 count = 0; - guint32 paysize; - guint32 msgsize; + uint16 count = 0; + uint32 paysize; + uint32 msgsize; char *payload, *count_ptr; - guint i; + uint i; payload = vmsg_fill_type(v_tmp_data, T_0000, 0, 0); @@ -3266,7 +3366,7 @@ * Fill one entry per message type supported, excepted ourselves. */ - for (i = 0; i < G_N_ELEMENTS(vmsg_map); i++) { + for (i = 0; i < N_ITEMS(vmsg_map); i++) { const struct vmsg *msg = &vmsg_mapi; if (msg->vendor == T_0000) /* Don't send info about ourselves */ @@ -3284,7 +3384,7 @@ paysize = count * VMS_ITEM_SIZE + sizeof count; msgsize = vmsg_fill_header(v_tmp_header, paysize, sizeof v_tmp); - gmsg_sendto_one(n, v_tmp, msgsize); + vmsg_send_data(n, v_tmp, msgsize); } struct vmsg_features { @@ -3316,9 +3416,10 @@ } static void -vmsg_features_add(struct vmsg_features *vmf, const char *name, guint16 version) +vmsg_features_add(struct vmsg_features *vmf, const char *name, uint16 version) { - guint16 num_features; + uint16 num_features; + void *p; g_assert(vmf); g_assert(vmf->pos >= 2); @@ -3333,8 +3434,8 @@ num_features = peek_le16(&vmf->data0) + 1; poke_le16(&vmf->data0, num_features); - memcpy(&vmf->datavmf->pos, name, 4); - poke_le16(&vmf->datavmf->pos + 4, version); + p = mempcpy(&vmf->datavmf->pos, name, 4); + poke_le16(p, version); vmf->pos += 6; } @@ -3342,11 +3443,11 @@ * Tell node about which features we're currently supporting. */ void -vmsg_send_features_supported(struct gnutella_node *n) +vmsg_send_features_supported(gnutella_node_t *n) { struct vmsg_features vmf; - guint32 paysize; - guint32 msgsize; + uint32 paysize; + uint32 msgsize; char *payload; payload = vmsg_fill_type(v_tmp_data, T_0000, 10, 0); @@ -3354,8 +3455,9 @@ vmsg_features_add(&vmf, "HSEP", 1); vmsg_features_add(&vmf, "WHAT", 1); + vmsg_features_add(&vmf, "QRP1", 1); /* 1-bit QRP patches */ /* No support for NAT-to-NAT -- signal version as -1, not 0 */ - vmsg_features_add(&vmf, "F2FT", (guint16) -1); + vmsg_features_add(&vmf, "F2FT", (uint16) -1); /* TCP-incoming connections: are possible if not firewalled */ vmsg_features_add(&vmf, "TCPI", GNET_PROPERTY(is_firewalled) ? 0 : 1); if (tls_enabled()) { @@ -3370,7 +3472,7 @@ paysize = vmsg_features_get_length(&vmf); msgsize = vmsg_fill_header(v_tmp_header, paysize, sizeof v_tmp); - gmsg_sendto_one(n, v_tmp, msgsize); + vmsg_send_data(n, v_tmp, msgsize); } /** @@ -3378,8 +3480,8 @@ * Note that we don't care about the message version here. */ struct vmsg_weight { - guint32 vendor; - guint16 id; + uint32 vendor; + uint16 id; int weight; }; @@ -3415,10 +3517,10 @@ /** * @return vendor message weight given beginning of vendor message payload. */ -guint8 -vmsg_weight(gconstpointer data) +uint8 +vmsg_weight(const void *data) { - gpointer value; + void *value; value = patricia_lookup(pt_weight, data); @@ -3437,7 +3539,7 @@ pt_weight = patricia_create(VMSG_TYPE_BITLEN); - for (i = 0; i < G_N_ELEMENTS(vmsg_weight_map); i++) { + for (i = 0; i < N_ITEMS(vmsg_weight_map); i++) { const struct vmsg_weight *vw = &vmsg_weight_mapi; gnutella_vendor_t *key = walloc(VMSG_TYPE_LEN); @@ -3448,8 +3550,8 @@ } } -static gboolean -pt_weight_free(gpointer key, size_t keybits, gpointer value, gpointer u) +static bool +pt_weight_free(void *key, size_t keybits, void *value, void *u) { (void) keybits; (void) value; @@ -3472,7 +3574,7 @@ /** * Initialize vendor messages. */ -G_GNUC_COLD void +void G_COLD vmsg_init(void) { size_t i; @@ -3481,11 +3583,11 @@ vmsg_init_weight(); - ht_vmsg = g_hash_table_new(vmsg_hash_func, vmsg_eq_func); + hs_vmsg = hset_create_any(vmsg_hash_func, vmsg_hash_func2, vmsg_eq_func); - for (i = 0; i < G_N_ELEMENTS(vmsg_map); i++) { - gconstpointer key = &vmsg_mapi; - gm_hash_table_insert_const(ht_vmsg, key, key); + for (i = 0; i < N_ITEMS(vmsg_map); i++) { + const void *key = &vmsg_mapi; + hset_insert(hs_vmsg, key); gnutella_vendor_set_code(weight_key, vmsg_mapi.vendor); gnutella_vendor_set_selector_id(weight_key, vmsg_mapi.id); @@ -3501,14 +3603,14 @@ head_ping_ev = cq_main_insert(HEAD_PING_PERIODIC_MS, head_ping_timer, NULL); } -G_GNUC_COLD void +void G_COLD vmsg_close(void) { vmsg_close_weight(); head_ping_expire(TRUE); hash_list_free(&head_pings); cq_cancel(&head_ping_ev); - gm_hash_table_destroy_null(&ht_vmsg); + hset_free_null(&hs_vmsg); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/vmsg.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/vmsg.h
Changed
@@ -51,40 +51,40 @@ * @param sent whether message was sent or dropped * @param arg user-supplied argument */ -typedef void (*vmsg_sent_t)(struct gnutella_node *n, gboolean sent, void *arg); +typedef void (*vmsg_sent_t)(struct gnutella_node *n, bool sent, void *arg); /* * Public interface */ void vmsg_handle(struct gnutella_node *n); -const char *vmsg_infostr(gconstpointer data, size_t size); +const char *vmsg_infostr(const void *data, size_t size); void vmsg_send_messages_supported(struct gnutella_node *n); void vmsg_send_features_supported(struct gnutella_node *n); -void vmsg_send_hops_flow(struct gnutella_node *n, guint8 hops, +void vmsg_send_hops_flow(struct gnutella_node *n, uint8 hops, vmsg_sent_t sent, void *arg); -void vmsg_send_tcp_connect_back(struct gnutella_node *n, guint16 port); -void vmsg_send_udp_connect_back(struct gnutella_node *n, guint16 port); +void vmsg_send_tcp_connect_back(struct gnutella_node *n, uint16 port); +void vmsg_send_udp_connect_back(struct gnutella_node *n, uint16 port); void vmsg_send_proxy_req(struct gnutella_node *n, const struct guid *muid); void vmsg_send_qstat_req(struct gnutella_node *n, const struct guid *muid); void vmsg_send_qstat_answer(struct gnutella_node *n, - const struct guid *muid, guint16 hits); + const struct guid *muid, uint16 hits); void vmsg_send_proxy_cancel(struct gnutella_node *n); void vmsg_send_oob_reply_ack(struct gnutella_node *n, - const struct guid *muid, guint8 want, const struct array *token); -void vmsg_send_time_sync_req(struct gnutella_node *n, gboolean ntp, tm_t *); -void vmsg_send_time_sync_reply(struct gnutella_node *n, gboolean ntp, tm_t *); + const struct guid *muid, uint8 want, const struct array *token); +void vmsg_send_time_sync_req(struct gnutella_node *n, bool ntp, tm_t *); +void vmsg_send_time_sync_reply(struct gnutella_node *n, bool ntp, tm_t *); void vmsg_send_udp_crawler_pong(struct gnutella_node *n, struct pmsg *mb); void vmsg_send_node_info_ans(struct gnutella_node *n, const struct rnode_info *ri); void vmsg_send_head_ping(const struct sha1 *sha1, - host_addr_t addr, guint16 port, const struct guid *guid); + host_addr_t addr, uint16 port, const struct guid *guid); struct pmsg *vmsg_build_oob_reply_ind(const struct guid *muid, - guint8 hits, gboolean secure); + uint8 hits, bool secure); -guint8 vmsg_weight(gconstpointer data); +uint8 vmsg_weight(const void *data); void vmsg_init(void); void vmsg_close(void);
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/whitelist.c -> gtk-gnutella-1.1.9.tar.bz2/src/core/whitelist.c
Changed
@@ -50,15 +50,16 @@ #include "lib/ascii.h" #include "lib/cq.h" #include "lib/file.h" -#include "lib/glib-missing.h" #include "lib/halloc.h" #include "lib/parse.h" #include "lib/path.h" +#include "lib/pslist.h" #include "lib/random.h" -#include "lib/tm.h" #include "lib/stringify.h" +#include "lib/tm.h" #include "lib/walloc.h" #include "lib/watcher.h" + #include "lib/override.h" /* Must be the last header included */ /** @@ -87,12 +88,12 @@ struct whitelist_hostname *host; /**< If hostname is known */ time_t last_try; host_addr_t addr; /**< If name != NULL, last resolved */ - guint16 port; - guint8 bits; /**< For ranges (implies port == 0) */ - guint8 use_tls; /**< Whether to use TLS */ + uint16 port; + uint8 bits; /**< For ranges (implies port == 0) */ + uint8 use_tls; /**< Whether to use TLS */ }; -static GSList *sl_whitelist; +static pslist_t *sl_whitelist; static const char whitelist_file = "whitelist"; @@ -109,10 +110,10 @@ struct whitelist_dns { struct whitelist *item; /**< Item being resolved */ unsigned generation; /**< For which generation? */ - gboolean revalidate; /**< Whether this is revalidation */ + bool revalidate; /**< Whether this is revalidation */ }; -static guint +static uint addr_default_mask(const host_addr_t addr) { switch (host_addr_net(addr)) { @@ -132,8 +133,7 @@ * Allocate a new whitelist entry containing an explicit address. */ static struct whitelist * -whitelist_addr_create( - gboolean use_tls, host_addr_t addr, guint16 port, guint8 bits) +whitelist_addr_create(bool use_tls, host_addr_t addr, uint16 port, uint8 bits) { struct whitelist *item; @@ -151,8 +151,7 @@ * The structure takes ownership of the supplied ``hname''. */ static struct whitelist * -whitelist_hostname_create( - gboolean use_tls, char *hname, guint16 port) +whitelist_hostname_create(bool use_tls, char *hname, uint16 port) { struct whitelist *item; struct whitelist_hostname *host; @@ -189,7 +188,7 @@ log_whitelist_item(const struct whitelist *item, const char *what) { const char *host; - guint8 bits; + uint8 bits; if (item->host != NULL) { host = 0 == item->port ? item->host->name : @@ -231,7 +230,7 @@ if (GNET_PROPERTY(whitelist_debug)) log_whitelist_item(item, "adding"); - sl_whitelist = g_slist_prepend(sl_whitelist, item); + sl_whitelist = pslist_prepend(sl_whitelist, item); } /** @@ -262,13 +261,13 @@ whitelist_free(item); } } else { - item->addr = addrsrandom_u32() % n; /* Pick one randomly */ + item->addr = addrsrandom_value(n - 1); /* Pick one randomly */ item->bits = addr_default_mask(item->addr); if (GNET_PROPERTY(whitelist_debug) > 1) { g_debug("WLIST DNS-resolved %s as %s (out of %zu result%s)", item->host->name, host_addr_to_string(item->addr), - n, 1 == n ? "" : "s"); + n, plural(n)); } if (!ctx->revalidate) { whitelist_add(item); @@ -284,7 +283,7 @@ * the whitelist or updating the existing host address (when revalidating). */ static void -whitelist_dns_resolve(struct whitelist *item, gboolean revalidate) +whitelist_dns_resolve(struct whitelist *item, bool revalidate) { struct whitelist_dns *ctx; char *host; @@ -317,7 +316,7 @@ /** * Loads the whitelist into memory. */ -static G_GNUC_COLD void +static void G_COLD whitelist_retrieve(void) { char line1024; @@ -329,30 +328,30 @@ whitelist_generation++; file_path_set(fp, settings_config_dir(), whitelist_file); - f = file_config_open_read_norename("Host Whitelist", fp, G_N_ELEMENTS(fp)); + f = file_config_open_read_norename("Host Whitelist", fp, N_ITEMS(fp)); if (!f) return; if (fstat(fileno(f), &st)) { - g_warning("whitelist_retrieve: fstat() failed: %m"); + g_warning("%s(): fstat() failed: %m", G_STRFUNC); fclose(f); return; } while (fgets(line, sizeof line, f)) { - GSList *sl_addr, *sl; + pslist_t *sl_addr, *sl; const char *endptr, *start; host_addr_t addr; - guint16 port; - guint8 bits; - gboolean item_ok; - gboolean use_tls; + uint16 port; + uint8 bits; + bool item_ok; + bool use_tls; char *hname; linenum++; if (!file_line_chomp_tail(line, sizeof line, NULL)) { - g_warning("%s: line %u too long, aborting", G_STRFUNC, linenum); + g_warning("%s(): line %u too long, aborting", G_STRFUNC, linenum); break; } @@ -378,7 +377,7 @@ sl_addr = name_to_host_addr(host_addr_to_string(addr), settings_dns_net()); } else if (string_to_host_or_addr(start, &endptr, &addr)) { - guchar c = *endptr; + uchar c = *endptr; switch (c) { case '\0': @@ -391,18 +390,17 @@ } if (!endptr) { - g_warning("whitelist_retrieve(): " - "Line %d: Expected a hostname or IP address \"%s\"", - linenum, line); + g_warning("%s(): line %d: " + "expected a hostname or IP address \"%s\"", + G_STRFUNC, linenum, line); continue; } /* Terminate the string for name_to_host_addr() */ - hname = h_strndup(start, endptr - start); + hname = h_strndup(start, endptr - start); } else { - g_warning("whitelist_retrieve(): " - "Line %d: Expected hostname or IP address \"%s\"", - linenum, line); + g_warning("%s(): line %d: expected hostname or IP address \"%s\"", + G_STRFUNC, linenum, line); continue; } @@ -420,15 +418,15 @@ if (0 == port) { /* Ignore trailing items separated by a space */ while ('\0' != *endptr && !is_ascii_space(*endptr)) { - guchar c = *endptr++; + uchar c = *endptr++; if (':' == c) { int error; - guint32 v; + uint32 v; if (0 != port) { - g_warning("whitelist_retrieve(): Line %d:" - "Multiple colons after host", linenum); + g_warning("%s(): line %d: multiple colons after host", + G_STRFUNC, linenum); item_ok = FALSE; break; } @@ -436,41 +434,44 @@ v = parse_uint32(endptr, &endptr, 10, &error); port = (error || v > 0xffff) ? 0 : v; if (0 == port) { - g_warning("whitelist_retrieve(): Line %d: " - "Invalid port value after host", linenum); + g_warning("%s(): line %d: " + "invalid port value after host", + G_STRFUNC, linenum); item_ok = FALSE; break; } } else if ('/' == c) { const char *ep; - guint32 mask; + uint32 mask; if (0 != bits) { - g_warning("whitelist_retrieve(): Line %d:" - "Multiple slashes after host", linenum); + g_warning("%s(): line %d: " + "multiple slashes after host", G_STRFUNC, linenum); item_ok = FALSE; break; } if (string_to_ip_strict(endptr, &mask, &ep)) { if (!host_addr_is_ipv4(addr)) { - g_warning("whitelist_retrieve(): Line %d: " - "IPv4 netmask after non-IPv4 address", linenum); + g_warning("%s(): line %d: " + "IPv4 netmask after non-IPv4 address", + G_STRFUNC, linenum); item_ok = FALSE; break; } endptr = ep; if (0 == (bits = netmask_to_cidr(mask))) { - g_warning("whitelist_retrieve(): Line %d: " - "IPv4 netmask after non-IPv4 address", linenum); + g_warning("%s(): line %d: " + "IPv4 netmask after non-IPv4 address", + G_STRFUNC, linenum); item_ok = FALSE; break; } } else { int error; - guint32 v; + uint32 v; v = parse_uint32(endptr, &endptr, 10, &error); if ( @@ -479,16 +480,17 @@ (v > 32 && host_addr_is_ipv4(addr)) || (v > 128 && host_addr_is_ipv6(addr)) ) { - g_warning("whitelist_retrieve(): Line %d: " - "Invalid numeric netmask after host", linenum); + g_warning("%s(): line %d: " + "invalid numeric netmask after host", + G_STRFUNC, linenum); item_ok = FALSE; break; } bits = v; } } else { - g_warning("whitelist_retrieve(): Line %d: " - "Unexpected character after host", linenum); + g_warning("%s(): line %d: " + "unexpected character after host", G_STRFUNC, linenum); item_ok = FALSE; break; } @@ -501,7 +503,7 @@ item = whitelist_hostname_create(use_tls, hname, port); whitelist_dns_resolve(item, FALSE); } else { - for (sl = sl_addr; NULL != sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(sl_addr, sl) { host_addr_t *aptr = sl->data; g_assert(aptr != NULL); item = whitelist_addr_create(use_tls, *aptr, port, bits); @@ -515,7 +517,7 @@ host_addr_free_list(&sl_addr); } - sl_whitelist = g_slist_reverse(sl_whitelist); + sl_whitelist = pslist_reverse(sl_whitelist); fclose(f); } @@ -525,14 +527,14 @@ * * @returns the number of new nodes that are connected to. */ -guint +uint whitelist_connect(void) { time_t now = tm_time(); - const GSList *sl; - guint num = 0; + const pslist_t *sl; + uint num = 0; - for (sl = sl_whitelist; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(sl_whitelist, sl) { struct whitelist *item; item = sl->data; @@ -561,12 +563,12 @@ * @param ha the host address to check. * @returns TRUE if found, and FALSE if not. */ -gboolean +bool whitelist_check(const host_addr_t ha) { - const GSList *sl; + const pslist_t *sl; - GM_SLIST_FOREACH(sl_whitelist, sl) { + PSLIST_FOREACH(sl_whitelist, sl) { const struct whitelist *item = sl->data; if (!is_host_addr(item->addr)) @@ -583,7 +585,7 @@ * Reloads the whitelist. */ static void -whitelist_changed(const char *filename, gpointer unused_data) +whitelist_changed(const char *filename, void *unused_data) { (void) unused_data; @@ -598,15 +600,15 @@ /** * Callout queue periodic event to keep DNS-resolved addresses fresh. */ -static gboolean -whitelist_periodic_dns(gpointer unused_obj) +static bool +whitelist_periodic_dns(void *unused_obj) { time_t now = tm_time(); - GSList *sl; + pslist_t *sl; (void) unused_obj; - GM_SLIST_FOREACH(sl_whitelist, sl) { + PSLIST_FOREACH(sl_whitelist, sl) { struct whitelist *item = sl->data; /* @@ -636,7 +638,7 @@ * Ensure we will monitor the file to reloead the whitelist soon after * the file is modified (or created if missing initially). */ -G_GNUC_COLD void +void G_COLD whitelist_init(void) { char *path; @@ -662,16 +664,16 @@ /** * Frees all entries in the whitelist. */ -G_GNUC_COLD void +void G_COLD whitelist_close(void) { - GSList *sl; + pslist_t *sl; - GM_SLIST_FOREACH(sl_whitelist, sl) { + PSLIST_FOREACH(sl_whitelist, sl) { whitelist_free(sl->data); } - gm_slist_free_null(&sl_whitelist); + pslist_free_null(&sl_whitelist); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/core/whitelist.h -> gtk-gnutella-1.1.9.tar.bz2/src/core/whitelist.h
Changed
@@ -40,10 +40,10 @@ #include "common.h" #include "lib/host_addr.h" -gboolean whitelist_check(const host_addr_t addr); +bool whitelist_check(const host_addr_t addr); void whitelist_init(void); void whitelist_close(void); -guint whitelist_connect(void); +uint whitelist_connect(void); #endif /* _core_whitelist_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/coverity.c
Added
@@ -0,0 +1,288 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * Coverity model for key functions. + * + * @author Raphael Manfredi + * @date 2014 + * + * This file is to help Coverity understand our code better, to limit + * the potential for false positives. + */ + +typedef int bool; + +bool +__builtin_expect(bool expr, bool hint) +{ + return expr; +} + +void +assertion_abort(void) +{ + __coverity_panic__(); +} + +void +log_abort(void) +{ + __coverity_panic__(); +} + +typedef unsigned char uint8; +typedef volatile uint8 atomic_lock_t; + +const bool TRUE = 1; +const bool FALSE = 0; + +bool +atomic_acquire(atomic_lock_t *lock) +{ + if (0 == *lock) { + *lock = 1; + __coverity_exclusive_lock_acquire__(lock); + return TRUE; + } + return FALSE; +} + +void +atomic_release(atomic_lock_t *lock) +{ + *lock = 0; + __coverity_exclusive_lock_release__(lock); +} + +typedef struct spinlock { int lock } spinlock_t; + +void +spinlock_init(spinlock_t *s) +{ + s->lock = 0; +} + +void +spinlock_grab_from(spinlock_t *s, bool hidden, const char *file, unsigned line) +{ + __coverity_exclusive_lock_acquire__(s); + s->lock = 1; +} + +bool +spinlock_grab_try_from(spinlock_t *s, bool hidden, + const char *file, unsigned line) +{ + if (s->lock) + return FALSE; + __coverity_exclusive_lock_acquire__(s); + s->lock = 1; + return TRUE; +} + +void +spinlock_grab_swap_from(spinlock_t *s, const void *plock, + const char *file, unsigned line) +{ + __coverity_exclusive_lock_acquire__(s); + s->lock = 1; +} + +bool +spinlock_grab_swap_try_from(spinlock_t *s, const void *plock, + const char *file, unsigned line) +{ + if (s->lock) + return FALSE; + __coverity_exclusive_lock_acquire__(s); + s->lock = 1; + return TRUE; +} + +void +spinlock_raw_from(spinlock_t *s, const char *file, unsigned line) +{ + __coverity_exclusive_lock_acquire__(s); + s->lock = 1; +} + +void +spinlock_release(spinlock_t *s, bool hidden) +{ + s->lock = 0; + __coverity_exclusive_lock_release__(s); +} + +void +spinlock_reset(spinlock_t *s) +{ + s->lock = 0; + __coverity_exclusive_lock_release__(s); +} + +void +spinlock_destroy(spinlock_t *s) +{ + if (0 == s->lock) { + s->lock = 1; + __coverity_exclusive_lock_acquire__(s); + } + __coverity_exclusive_lock_release__(s); +} + +typedef long thread_t; +typedef struct lmutex { int lock; } mutex_t; +enum mutex_mode { MODE = 1 }; + +void +mutex_init(mutex_t *m) +{ + m->lock = 0; +} + +void +mutex_reset(mutex_t *m) +{ + mutex_init(m); + __coverity_recursive_lock_release__(m); +} + +bool +mutex_is_owned_by_fast(const mutex_t *m, const thread_t t) +{ + return m->lock; +} + +void +mutex_grab_from(mutex_t *m, enum mutex_mode mode, + const char *file, unsigned line) +{ + m->lock++; + __coverity_recursive_lock_acquire__(m); +} + +bool +mutex_grab_try_from(mutex_t *m, enum mutex_mode mode, + const char *file, unsigned line) +{ + bool owned; + + if (owned || 0 == m->lock) { + m->lock++; + __coverity_recursive_lock_acquire__(m); + return TRUE; + } + + return FALSE; +} + +void +mutex_grab_swap_from(mutex_t *m, const void *plock, + const char *file, unsigned line) +{ + m->lock++; + __coverity_recursive_lock_acquire__(m); +} + +bool +mutex_grab_swap_try_from(mutex_t *m, const void *plock, + const char *file, unsigned line) +{ + bool owned; + + if (owned || 0 == m->lock) { + m->lock++; + __coverity_recursive_lock_acquire__(m); + return TRUE; + } + + return FALSE; +} + +void +mutex_ungrab_from(mutex_t *m, enum mutex_mode mode, + const char *file, unsigned line) +{ + m->lock--; + __coverity_recursive_lock_release__(m); +} + +void +mutex_destroy(mutex_t *m) +{ + if (0 == m->lock) { + m->lock = 1; + __coverity_recursive_lock_acquire__(m); + } + __coverity_recursive_lock_release__(m); +} + +void * +vmm_valloc(void *hint, size_t size) +{ + bool ok; + __coverity_negative_sink__(size); + if (ok) + return __coverity_alloc__(size); + return (void *) -1; +} + +int +munmap(void *addr, size_t size) +{ + bool ok; + __coverity_negative_sink__(size); + if (ok) { + __coverity_free__(addr); + return 0; + } + return -1; +} + +struct cevent { int x; }; +struct cqueue { int x; }; + +typedef void (*cq_service_t)(struct cqueue *cq, void *udata); + +struct cevent * +cq_main_insert(int delay, cq_service_t fn, void *arg) +{ + static struct cqueue cq; + static struct cevent e; + + fn(&cq, arg); + return &e; +} + +const char * +get_variable(const char *s, const char **end) +{ + __coverity_tainted_data_sanitize__(s); + return s; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/src/dht/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-95 -: $X-Id: Jmake.tmpl 69 2011-01-09 13:57:07Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -39,7 +39,7 @@ AR = ar rc CC = $cc CTAGS = ctags -JCFLAGS = \$(CFLAGS) $optimize $ccflags $large +JCFLAGS = \$(CFLAGS) $optimize $pthread $ccflags $large JCPPFLAGS = $cppflags MKDEP = $mkdep \$(DPFLAGS) \$(JCPPFLAGS) -- MV = $mv @@ -66,7 +66,7 @@ $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 94 2011-02-10 14:06:58Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Force 'make depend' to be performed first -- do not edit @@ -178,6 +178,11 @@ $(RM) Makefile config.sh install:: local_install + @exit 0 + +install-strip:: local_install-strip + @exit 0 + install.man:: maybe_install.man deinstall:: local_deinstall deinstall.man:: maybe_deinstall.man @@ -216,6 +221,9 @@ local_install:: @echo "install in $(CURRENT) done." +local_install-strip:: + @echo "install (strip) in $(CURRENT) done." + local_deinstall:: @echo "deinstall in $(CURRENT) done."
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/acct.c -> gtk-gnutella-1.1.9.tar.bz2/src/dht/acct.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Raphael Manfredi + * Copyright (c) 2008, 2012 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -25,10 +25,10 @@ * @ingroup dht * @file * - * Accounting. + * IP address / network accounting. * * @author Raphael Manfredi - * @date 2008 + * @date 2008, 2012 */ #include "common.h" @@ -36,62 +36,77 @@ #include "acct.h" #include "lib/atoms.h" +#include "lib/htable.h" +#include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ +enum acct_net_magic { ACCT_NET_MAGIC = 0x1aff6618 }; + +struct acct_net { + enum acct_net_magic magic; + htable_t *ht; +}; + +static inline void +acct_net_check(const struct acct_net * const an) +{ + g_assert(an != NULL); + g_assert(ACCT_NET_MAGIC == an->magic); +} + /** * Get number of items accounted for by an IP or class C network. */ int -acct_net_get(GHashTable *ht, host_addr_t addr, guint32 mask) +acct_net_get(const acct_net_t *an, host_addr_t addr, uint32 mask) { - guint32 net; - gpointer val; + uint32 net; + void *val; - g_assert(ht); + acct_net_check(an); g_assert(host_addr_is_ipv4(addr)); net = host_addr_ipv4(addr) & mask; - val = g_hash_table_lookup(ht, &net); + val = htable_lookup(an->ht, &net); - return GPOINTER_TO_INT(val); + return pointer_to_int(val); } /** * Update count of items accounted for by an IP or class C network. */ void -acct_net_update(GHashTable *ht, host_addr_t addr, guint32 mask, int pmone) +acct_net_update(acct_net_t *an, host_addr_t addr, uint32 mask, int pmone) { - guint32 net; - gpointer key; - gpointer val; - gboolean found; + uint32 net; + const void *key; + void *val; + bool found; - g_assert(ht); + acct_net_check(an); g_assert(host_addr_is_ipv4(addr)); g_assert(pmone == +1 || pmone == -1); net = host_addr_ipv4(addr) & mask; - found = g_hash_table_lookup_extended(ht, &net, &key, &val); + found = htable_lookup_extended(an->ht, &net, &key, &val); if (found) { - int count = GPOINTER_TO_INT(val); + int count = pointer_to_int(val); count += pmone; - g_assert(net == *(guint32 *) key); + g_assert(net == *(uint32 *) key); if (count) { g_assert(count > 0); - g_hash_table_insert(ht, key, GINT_TO_POINTER(count)); + htable_insert(an->ht, key, int_to_pointer(count)); } else { - g_hash_table_remove(ht, key); + htable_remove(an->ht, key); atom_uint32_free(key); } - } else { - g_assert(pmone == +1); - - key = (gpointer) atom_uint32_get(&net); - g_hash_table_insert(ht, key, GINT_TO_POINTER(1)); + } else if (+1 == pmone) { + key = (void *) atom_uint32_get(&net); + htable_insert(an->ht, key, int_to_pointer(1)); } } @@ -99,11 +114,10 @@ * Hash table iterator callback */ static void -acct_net_free_kv(gpointer key, gpointer unused_val, gpointer unused_x) +acct_net_free_kv(void *key, void *unused_x) { - const guint32 *net = key; + const uint32 *net = key; - (void) unused_val; (void) unused_x; atom_uint32_free(net); @@ -112,9 +126,30 @@ /** * Allocate a hash table to track network/IP information. */ -GHashTable *acct_net_create(void) +acct_net_t * +acct_net_create(void) +{ + acct_net_t *an; + + WALLOC0(an); + an->magic = ACCT_NET_MAGIC; + an->ht = htable_create_any(uint32_hash, NULL, uint32_eq); + + return an; +} + +/** + * Free traffic accounting. + */ +static void +acct_net_free(acct_net_t *an) { - return g_hash_table_new(uint32_hash, uint32_eq); + acct_net_check(an); + + htable_foreach_key(an->ht, acct_net_free_kv, NULL); + htable_free_null(&an->ht); + an->magic = 0; + WFREE(an); } /** @@ -122,14 +157,13 @@ * The parameter `hptr' is written back to nullify the value it points to. */ void -acct_net_free(GHashTable **hptr) +acct_net_free_null(acct_net_t **anptr) { - GHashTable *ht = *hptr; + acct_net_t *an = *anptr; - if (ht) { - g_hash_table_foreach(ht, acct_net_free_kv, NULL); - g_hash_table_destroy(ht); - *hptr = NULL; + if (an != NULL) { + acct_net_free(an); + *anptr = NULL; } }
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/acct.h -> gtk-gnutella-1.1.9.tar.bz2/src/dht/acct.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Raphael Manfredi + * Copyright (c) 2008, 2012 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -25,10 +25,10 @@ * @ingroup dht * @file * - * Accounting. + * IP address / network accounting. * * @author Raphael Manfredi - * @date 2008 + * @date 2008, 2012 */ #ifndef _dht_acct_h_ @@ -39,15 +39,17 @@ #define NET_CLASS_C_MASK 0xffffff00U /**< Class C network mask */ #define NET_IPv4_MASK 0xffffffffU /**< IPv4 address mask */ +struct acct_net; +typedef struct acct_net acct_net_t; /* * Public interface. */ -GHashTable *acct_net_create(void); -int acct_net_get(GHashTable *ht, host_addr_t addr, guint32 mask); -void acct_net_update(GHashTable *ht, host_addr_t addr, guint32 mask, int pmone); -void acct_net_free(GHashTable **hptr); +acct_net_t *acct_net_create(void); +int acct_net_get(const acct_net_t *an, host_addr_t addr, uint32 mask); +void acct_net_update(acct_net_t *an, host_addr_t addr, uint32 mask, int pmone); +void acct_net_free_null(acct_net_t **anptr); #endif /* _dht_acct_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/keys.c -> gtk-gnutella-1.1.9.tar.bz2/src/dht/keys.c
Changed
@@ -74,6 +74,7 @@ #include "knode.h" #include "publish.h" #include "routing.h" +#include "values.h" #include "if/dht/kademlia.h" #include "if/dht/routing.h" @@ -84,16 +85,22 @@ #include "core/gnet_stats.h" +#include "lib/array_util.h" #include "lib/atoms.h" #include "lib/bstr.h" #include "lib/cq.h" #include "lib/dbmw.h" #include "lib/dbstore.h" #include "lib/glib-missing.h" -#include "lib/pmsg.h" +#include "lib/hikset.h" +#include "lib/hset.h" #include "lib/patricia.h" +#include "lib/pmsg.h" +#include "lib/pslist.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ #define MAX_VALUES MAX_VALUES_PER_KEY /* Shortcut for this file */ @@ -106,6 +113,7 @@ #define KBALL_FIRST 60 /**< First k-ball update after 1 minute */ #define KEYS_DB_CACHE_SIZE 512 /**< Amount of keys to keep cached in RAM */ +#define KEYS_SYNC_PERIOD (60*1000) /**< Sync DB every minute */ /** * Information about our neighbourhood (k-ball), updated periodically. @@ -113,11 +121,11 @@ static struct kball { kuid_t *closest; /**< KUID of closest node (atom) */ kuid_t *furthest; /**< KUID of furthest node (atom) */ - guint8 furthest_bits; /**< Common bits with furthest node */ - guint8 closest_bits; /**< Common bits with closest node */ - guint8 theoretical_bits; /**< Theoretical furthest k-ball frontier */ - guint8 width; /**< k-ball width, in bits */ - guint8 seeded; /**< Is the DHT seeded? */ + uint8 furthest_bits; /**< Common bits with furthest node */ + uint8 closest_bits; /**< Common bits with closest node */ + uint8 theoretical_bits; /**< Theoretical furthest k-ball frontier */ + uint8 width; /**< k-ball width, in bits */ + uint8 seeded; /**< Is the DHT seeded? */ } kball; /** @@ -138,11 +146,11 @@ float get_req_load; /**< EMA of # of (read) requests per period */ float store_req_load; /**< EMA of # of (store) requests per period */ time_t next_expire; /**< Earliest expiration of a value */ - guint32 get_requests; /**< # of get requests received in period */ - guint32 store_requests; /**< # of store requests received in period */ - guint8 common_bits; /**< Leading bits shared with our KUID */ - guint8 values; /**< Amount of values stored under key */ - guint8 flags; /**< Operating flags */ + uint32 get_requests; /**< # of get requests received in period */ + uint32 store_requests; /**< # of store requests received in period */ + uint8 common_bits; /**< Leading bits shared with our KUID */ + uint8 values; /**< Amount of values stored under key */ + uint8 flags; /**< Operating flags */ }; static inline void @@ -156,21 +164,27 @@ * Information about a key that is stored to disk and not kept in memory. * The structure is serialized first, not written as-is. * - * Indices in the two arrays match, that is creatorsi and dbkeysi are + * Indices in the three arrays match, that is creatorsi and dbkeysi are * related: the first is the KUID of the node that publishes the value, * the second is the allocated key used within our DB backend to access * values (see values.c). + * + * The expire array tracks a copy of the value expiration time, which is + * also held in the value database. It's also a consistency check and + * a mandatory warning is emitted when a mismatch occurs, indicating a + * corruption. */ struct keydata { - guint8 values; /**< Amount of values stored */ + uint8 values; /**< Amount of values stored */ kuid_t creatorsMAX_VALUES; /**< Secondary keys (sorted numerically) */ - guint64 dbkeysMAX_VALUES; /**< Associated SDBM keys for values */ + uint64 dbkeysMAX_VALUES; /**< Associated SDBM keys for values */ + time_t expireMAX_VALUES; /**< Value expiration times */ }; /** * Hashtable holding information about all the keys we're storing. */ -static GHashTable *keys; /**< KUID => struct keyinfo */ +static hikset_t *keys; /**< KUID => struct keyinfo */ /** * DBM wrapper to store keydata. @@ -181,6 +195,7 @@ static cevent_t *kball_ev; /**< Event for periodic k-ball update */ static cperiodic_t *keys_periodic_ev; +static cperiodic_t *keys_sync_ev; /** * Decimation factor to adjust expiration time depending on the distance @@ -194,30 +209,31 @@ static double decimation_factorKUID_RAW_BITSIZE; #define KEYS_DECIMATION_BASE 1.2 /* Base for exponential decimation */ +#define KEYS_KEYDATA_VERSION 1 /* Serialization version number */ -static void keys_periodic_kball(cqueue_t *unused_cq, gpointer unused_obj); +static void keys_periodic_kball(cqueue_t *cq, void *obj); /** * @return TRUE if key is stored here. */ -gboolean +bool keys_exists(const kuid_t *key) { - return gm_hash_table_contains(keys, key); + return hikset_contains(keys, key); } /** * @return whether key is "store-loaded", i.e. if we are getting too many * STORE requests for it. */ -gboolean +bool keys_is_store_loaded(const kuid_t *id) { struct keyinfo *ki; g_assert(id); - ki = g_hash_table_lookup(keys, id); + ki = hikset_lookup(keys, id); if (ki == NULL) return FALSE; @@ -243,7 +259,7 @@ /** * Are the amount of common leading bits sufficient to fall into our k-ball? */ -static inline gboolean +static inline bool bits_within_kball(size_t common_bits) { /* @@ -261,7 +277,7 @@ /** * Is a key ID within the range of our k-ball? */ -gboolean +bool keys_within_kball(const kuid_t *id) { /* @@ -282,7 +298,7 @@ * A key is foreign if it does not fall into our space, i.e. it does not * have any common leading bits with our KUID. */ -gboolean +bool keys_is_foreign(const kuid_t *id) { return 0 == kuid_common_prefix(id, get_our_kuid()); @@ -294,11 +310,11 @@ * A key is "nearby" until it has less common leading bits with our KUID * than the external frontier of our k-ball minus the k-ball radius. */ -gboolean +bool keys_is_nearby(const kuid_t *id) { size_t common_bits; - guint8 radius; + uint8 radius; /* * Until we get notified that the DHT is seeded (i.e. that we looked up @@ -330,10 +346,12 @@ if (kd == NULL) { if (dbmw_has_ioerr(db_keydata)) { - g_warning("DBMW \"%s\" I/O error, bad things could happen...", + s_warning_once_per(LOG_PERIOD_MINUTE, + "DBMW \"%s\" I/O error, bad things could happen...", dbmw_name(db_keydata)); } else { - g_warning("key %s exists but was not found in DBMW \"%s\"", + s_warning_once_per(LOG_PERIOD_SECOND, + "key %s exists but was not found in DBMW \"%s\"", kuid_to_hex_string(id), dbmw_name(db_keydata)); } return NULL; @@ -357,10 +375,7 @@ g_assert(skey); #define GET_ITEM(i) &kd->creatorsi -#define FOUND(i) G_STMT_START { \ - return i; \ - /* NOTREACHED */ \ -} G_STMT_END +#define FOUND(i) return i /* Perform a binary search to find the index where "skey" lies */ BINARY_SEARCH(const kuid_t *, skey, kd->values, kuid_cmp, GET_ITEM, FOUND); @@ -379,17 +394,14 @@ * * @return 64-bit DB key for the value if found, 0 if key was not found. */ -static guint64 +static uint64 lookup_secondary(const struct keydata *kd, const kuid_t *skey) { g_assert(kd); g_assert(skey); #define GET_ITEM(i) &kd->creatorsi -#define FOUND(i) G_STMT_START { \ - return kd->dbkeysi; \ - /* NOTREACHED */ \ -} G_STMT_END +#define FOUND(i) return kd->dbkeysi /* Perform a binary search to find the 64-bit DB key */ BINARY_SEARCH(const kuid_t *, skey, kd->values, kuid_cmp, GET_ITEM, FOUND); @@ -401,43 +413,90 @@ } /** - * See whether we can expire values stored under the key. - * - * NB: because we update the next expiration time upon value insertion - * but do not recompute it upon value removals, it is possible that - * we have no values to expire currently. + * Reclaim key info and data. * - * This is justified because there are few value removals and this allows - * us to not store the expiration time of the associated values in the - * keydata. + * @param ki the keyinfo to reclaim + * @param can_remove whether to remove from the `keys' set */ static void +keys_reclaim(struct keyinfo *ki, bool can_remove) +{ + g_assert(ki); + g_assert(0 == ki->values); + + if (GNET_PROPERTY(dht_storage_debug) > 2) + g_debug("DHT STORE key %s reclaimed", kuid_to_hex_string(ki->kuid)); + + dbmw_delete(db_keydata, ki->kuid); + if (can_remove) + hikset_remove(keys, &ki->kuid); + + gnet_stats_dec_general(GNR_DHT_KEYS_HELD); + if (ki->flags & DHT_KEY_F_CACHED) + gnet_stats_dec_general(GNR_DHT_CACHED_KEYS_HELD); + + kuid_atom_free_null(&ki->kuid); + ki->magic = 0; + WFREE(ki); +} + +/** + * See whether we can expire values stored under the key. + * + * @return TRUE if OK, FALSE if keyinfo was reclaimed due to inconsistency. + */ +static bool keys_expire_values(struct keyinfo *ki, time_t now) { struct keydata *kd; int i; int expired = 0; time_t next_expire = TIME_T_MAX; + const char *reason = NULL; + char buf80; kd = get_keydata(ki->kuid); - if (kd == NULL) - return; + if (NULL == kd) { + reason = "cannot retrieve associated keydata"; + goto discard_key; + } - g_assert(kd->values == ki->values); + if (kd->values != ki->values) { + str_bprintf(buf, sizeof buf, "expected %u value%s, has %u in keydata", + ki->values, plural(ki->values), kd->values); + reason = buf; + goto discard_key; + } for (i = 0; i < kd->values; i++) { - guint64 dbkey = kd->dbkeysi; - time_t expire; + uint64 dbkey = kd->dbkeysi; + time_t expire = kd->expirei; - if (values_has_expired(dbkey, now, &expire)) + if ( + delta_time(now, expire) >= 0 && + values_has_expired(dbkey, now, &expire) /* Updates `expire' */ + ) { expired++; - else + + /* + * A mismatch indicates a severe database corruption, hence + * we use a mandatory warning. + */ + + if (kd->expirei != expire) { + g_warning("DHT KEYS mismatching expire time for value #%d in %s" + " (held %u, should have been %u)", + i, kuid_to_hex_string(ki->kuid), + (uint) kd->expirei, (uint) expire); + } + } else { next_expire = MIN(expire, next_expire); + } } if (GNET_PROPERTY(dht_storage_debug) > 3) g_debug("DHT STORE key %s has %d expired value%s out of %d", - kuid_to_hex_string(ki->kuid), expired, 1 == expired ? "" : "s", + kuid_to_hex_string(ki->kuid), expired, plural(expired), ki->values); if (next_expire != TIME_T_MAX) @@ -449,15 +508,27 @@ */ values_reclaim_expired(); + keyinfo_check(ki); /* Keyinfo reclaim is asynchronous */ + return TRUE; /* OK */ + +discard_key: + /* + * Get rid of the key since we have a missing / corrupted keydata. + */ + + g_warning("DHT KEYS discarding corrupted key %s (%u value%s): %s", + kuid_to_hex_string(ki->kuid), ki->values, plural(ki->values), + reason); - keyinfo_check(ki); /* Reclaim is asynchronous */ + keys_reclaim(ki, TRUE); + return FALSE; } /** * Get key status (full and loaded boolean attributes). */ void -keys_get_status(const kuid_t *id, gboolean *full, gboolean *loaded) +keys_get_status(const kuid_t *id, bool *full, bool *loaded) { struct keyinfo *ki; time_t now; @@ -469,22 +540,22 @@ *full = FALSE; *loaded = FALSE; - ki = g_hash_table_lookup(keys, id); + ki = hikset_lookup(keys, id); if (ki == NULL) return; keyinfo_check(ki); - if (GNET_PROPERTY(dht_storage_debug) > 1) + if (GNET_PROPERTY(dht_storage_debug) > 1) { g_debug("DHT STORE key %s holds %d/%d value%s, " "load avg: get = %g %s, store = %g %s, expire in %s", - kuid_to_hex_string(id), ki->values, MAX_VALUES, - 1 == ki->values ? "" : "s", + kuid_to_hex_string(id), ki->values, MAX_VALUES, plural(ki->values), (int) (ki->get_req_load * 100) / 100.0, ki->get_req_load >= LOAD_GET_THRESH ? "LOADED" : "OK", (int) (ki->store_req_load * 100) / 100.0, ki->store_req_load >= LOAD_STO_THRESH ? "LOADED" : "OK", compact_time(delta_time(ki->next_expire, tm_time()))); + } if (ki->get_req_load >= LOAD_GET_THRESH) { *loaded = TRUE; @@ -512,8 +583,10 @@ now = tm_time(); - if (now >= ki->next_expire) - keys_expire_values(ki, now); + if (now >= ki->next_expire) { + if (!keys_expire_values(ki, now)) + return; /* Key info reclaimed */ + } if (ki->values >= MAX_VALUES) *full = TRUE; @@ -529,14 +602,14 @@ * @return 64-bit DB key for the value if it does, 0 if key either does not * exist yet or does not hold data from the creator. */ -guint64 -keys_has(const kuid_t *id, const kuid_t *cid, gboolean store) +uint64 +keys_has(const kuid_t *id, const kuid_t *cid, bool store) { struct keyinfo *ki; struct keydata *kd; - guint64 dbkey; + uint64 dbkey; - ki = g_hash_table_lookup(keys, id); + ki = hikset_lookup(keys, id); if (ki == NULL) return 0; @@ -547,47 +620,21 @@ if (kd == NULL) return 0; - g_assert(ki->values == kd->values); + g_assert_log(ki->values == kd->values, + "ki->values=%u, kd->values=%u", ki->values, kd->values); dbkey = lookup_secondary(kd, cid); - if (GNET_PROPERTY(dht_storage_debug) > 15) + if (GNET_PROPERTY(dht_storage_debug) > 15) { g_debug("DHT lookup secondary for %s/%s => dbkey %s", kuid_to_hex_string(id), kuid_to_hex_string2(cid), uint64_to_string(dbkey)); + } return dbkey; } /** - * Reclaim key info and data. - * - * @attention - * This is called from a patricia_foreach_remove() iterator callback, hence - * we must not remove `ki' from the PATRICIA tree, this will happen as part - * of the iteration. It is perfectly safe to destroy the key and the value - * however since the iterator works at the PATRICIA node level. - */ -static void -keys_reclaim(struct keyinfo *ki) -{ - g_assert(ki); - g_assert(0 == ki->values); - - if (GNET_PROPERTY(dht_storage_debug) > 2) - g_debug("DHT STORE key %s reclaimed", kuid_to_hex_string(ki->kuid)); - - dbmw_delete(db_keydata, ki->kuid); - - gnet_stats_count_general(GNR_DHT_KEYS_HELD, -1); - if (ki->flags & DHT_KEY_F_CACHED) - gnet_stats_count_general(GNR_DHT_CACHED_KEYS_HELD, -1); - - kuid_atom_free_null(&ki->kuid); - WFREE(ki); -} - -/** * Remove value from a key, discarding the association between the creator ID * and the 64-bit DB key. * @@ -598,13 +645,13 @@ * @param dbkey the 64-bit DB key (informational, for assertions) */ void -keys_remove_value(const kuid_t *id, const kuid_t *cid, guint64 dbkey) +keys_remove_value(const kuid_t *id, const kuid_t *cid, uint64 dbkey) { struct keyinfo *ki; struct keydata *kd; int idx; - ki = g_hash_table_lookup(keys, id); + ki = hikset_lookup(keys, id); g_assert(ki); @@ -612,21 +659,19 @@ if (NULL == kd) return; - g_assert(kd->values); - g_assert(kd->values == ki->values); + g_assert(kd->values != 0); g_assert(kd->values <= MAX_VALUES); + g_assert_log(ki->values == kd->values, + "ki->values=%u, kd->values=%u", ki->values, kd->values); idx = lookup_secondary_idx(kd, cid); g_assert(idx >= 0 && idx < kd->values); g_assert(dbkey == kd->dbkeysidx); - if (idx < kd->values - 1) { - memmove(&kd->creatorsidx, &kd->creatorsidx+1, - sizeof(kd->creators0) * (kd->values - idx - 1)); - memmove(&kd->dbkeysidx, &kd->dbkeysidx+1, - sizeof(kd->dbkeys0) * (kd->values - idx - 1)); - } + ARRAY_REMOVE(kd->creators, idx, kd->values); + ARRAY_REMOVE(kd->dbkeys, idx, kd->values); + ARRAY_REMOVE(kd->expire, idx, kd->values); /* * We do not synchronously delete empty keys. @@ -636,36 +681,101 @@ * STORE will precisely insert back another value. * * Hence lazy expiration also gives us the opportunity to further exploit - * caching in memory, the keyinfo being hel there as a "cached" value. + * caching in memory, the keyinfo being held there as a "cached" value. * * Reclaiming of dead keys happens during periodic key load computation. */ kd->values--; ki->values--; + + /* + * Recompute next expiration time. + */ + + ki->next_expire = TIME_T_MAX; + + for (idx = 0; idx < ki->values; idx++) { + ki->next_expire = MIN(ki->next_expire, kd->expireidx); + } + dbmw_write(db_keydata, id, kd, sizeof *kd); - if (GNET_PROPERTY(dht_storage_debug) > 2) - g_debug("DHT STORE key %s now holds only %d/%d value%s", - kuid_to_hex_string(id), ki->values, MAX_VALUES, - 1 == ki->values ? "" : "s"); + if (GNET_PROPERTY(dht_storage_debug) > 2) { + g_debug("DHT STORE key %s now holds only %d/%d value%s, expire in %s", + kuid_to_hex_string(id), ki->values, MAX_VALUES, plural(ki->values), + compact_time(delta_time(ki->next_expire, tm_time()))); + } } /** * A value held under the key was updated and has a new expiration time. * * @param id the primary key (existing already) + * @param cid the secondary key (creator's ID) * @param expire expiration time for the value */ void -keys_update_value(const kuid_t *id, time_t expire) +keys_update_value(const kuid_t *id, const kuid_t *cid, time_t expire) { struct keyinfo *ki; + struct keydata *kd; - ki = g_hash_table_lookup(keys, id); + ki = hikset_lookup(keys, id); g_assert(ki != NULL); ki->next_expire = MIN(ki->next_expire, expire); + kd = get_keydata(id); + + if (kd != NULL) { + int low = 0, high = ki->values - 1; + bool found = FALSE; + + while (low <= high) { + int mid = (low + high) / 2; + int c; + + g_assert(mid >= 0 && mid < ki->values); + + c = kuid_cmp(&kd->creatorsmid, cid); + + if G_UNLIKELY(0 == c) { + kd->expiremid = expire; + found = TRUE; + break; + } else if (c < 0) { + low = mid + 1; + } else { + high = mid - 1; /* -1 OK since low and high are signed */ + } + } + + if (found) { + dbmw_write(db_keydata, id, kd, sizeof *kd); + } else if (GNET_PROPERTY(dht_keys_debug)) { + g_warning("DHT KEYS %s(): creator %s not found under %s", + G_STRFUNC, kuid_to_hex_string(cid), kuid_to_hex_string2(id)); + } + } +} + +/** + * Allocate keyinfo. + * + * @param kuid the key's KUID + * @param common common bits with our KUID + */ +static struct keyinfo * +allocate_keyinfo(const kuid_t *kuid, size_t common) +{ + struct keyinfo *ki; + + WALLOC0(ki); + ki->magic = KEYINFO_MAGIC; + ki->kuid = kuid_get_atom(kuid); + ki->common_bits = common & 0xff; + + return ki; } /** @@ -680,13 +790,13 @@ */ void keys_add_value(const kuid_t *id, const kuid_t *cid, - guint64 dbkey, time_t expire) + uint64 dbkey, time_t expire) { struct keyinfo *ki; struct keydata *kd; struct keydata new_kd; - ki = g_hash_table_lookup(keys, id); + ki = hikset_lookup(keys, id); /* * If we're storing the first value under a key, we do not have any @@ -695,7 +805,7 @@ if (NULL == ki) { size_t common; - gboolean in_kball; + bool in_kball; common = kuid_common_prefix(get_our_kuid(), id); in_kball = bits_within_kball(common); @@ -703,31 +813,24 @@ if (GNET_PROPERTY(dht_storage_debug) > 5) g_debug("DHT STORE new %s %s (%zu common bit%s) with creator %s", in_kball ? "key" : "cached key", - kuid_to_hex_string(id), common, 1 == common ? "" : "s", + kuid_to_hex_string(id), common, plural(common), kuid_to_hex_string2(cid)); - WALLOC(ki); - ki->magic = KEYINFO_MAGIC; - ki->kuid = kuid_get_atom(id); - ki->get_req_load = 0.0; - ki->get_requests = 0; - ki->store_req_load = 0.0; - ki->store_requests = 0; - ki->common_bits = common & 0xff; - ki->values = 0; /* will be incremented below */ + ki = allocate_keyinfo(id, common); ki->next_expire = expire; ki->flags = in_kball ? 0 : DHT_KEY_F_CACHED; - g_hash_table_insert(keys, ki->kuid, ki); + hikset_insert_key(keys, &ki->kuid); kd = &new_kd; kd->values = 0; /* will be incremented below */ kd->creators0 = *cid; /* struct copy */ kd->dbkeys0 = dbkey; + kd->expire0 = expire; - gnet_stats_count_general(GNR_DHT_KEYS_HELD, +1); + gnet_stats_inc_general(GNR_DHT_KEYS_HELD); if (!in_kball) - gnet_stats_count_general(GNR_DHT_CACHED_KEYS_HELD, +1); + gnet_stats_inc_general(GNR_DHT_CACHED_KEYS_HELD); } else { int low = 0; int high = ki->values - 1; @@ -737,15 +840,15 @@ if (NULL == kd) return; - g_assert(kd->values == ki->values); g_assert(kd->values < MAX_VALUES); + g_assert_log(ki->values == kd->values, + "ki->values=%u, kd->values=%u", ki->values, kd->values); if (GNET_PROPERTY(dht_storage_debug) > 5) - g_debug("DHT STORE existing key %s (%zu common bit%s) " + g_debug("DHT STORE existing key %s (%u common bit%s) " "has new creator %s", kuid_to_hex_string(id), ki->common_bits, - 1 == ki->common_bits ? "" : "s", - kuid_to_hex_string2(cid)); + plural(ki->common_bits), kuid_to_hex_string2(cid)); /* * Keys are collected asynchronously, so it is possible that @@ -763,34 +866,36 @@ */ while (low <= high) { - int mid = low + (high - low) / 2; + int mid = (low + high) / 2; int c; g_assert(mid >= 0 && mid < ki->values); c = kuid_cmp(&kd->creatorsmid, cid); - if (0 == c) + if G_UNLIKELY(0 == c) g_error("new creator KUID %s must not already be present", kuid_to_hex_string(cid)); else if (c < 0) low = mid + 1; else - high = mid - 1; + high = mid - 1; /* -1 OK since low and high are signed */ } - /* Insert new item at `low' */ + /* Make room for inserting new item at `low' */ - if (low < kd->values) { - memmove(&kd->creatorslow+1, &kd->creatorslow, - sizeof(kd->creators0) * (kd->values - low)); - memmove(&kd->dbkeyslow+1, &kd->dbkeyslow, - sizeof(kd->dbkeys0) * (kd->values - low)); - } + ARRAY_FIXED_MAKEROOM(kd->creators, low, kd->values); + ARRAY_FIXED_MAKEROOM(kd->dbkeys, low, kd->values); + ARRAY_FIXED_MAKEROOM(kd->expire, low, kd->values); + + /* FALL THROUGH */ empty: + /* Insert new item at `low' */ + kd->creatorslow = *cid; /* struct copy */ kd->dbkeyslow = dbkey; + kd->expirelow = expire; ki->next_expire = MIN(ki->next_expire, expire); } @@ -803,8 +908,7 @@ if (GNET_PROPERTY(dht_storage_debug) > 2) g_debug("DHT STORE %s key %s now holds %d/%d value%s", &new_kd == kd ? "new" : "existing", - kuid_to_hex_string(id), ki->values, MAX_VALUES, - 1 == ki->values ? "" : "s"); + kuid_to_hex_string(id), ki->values, MAX_VALUES, plural(ki->values)); } /** @@ -832,7 +936,7 @@ g_assert(valvec); g_assert(valcnt > 0); - ki = g_hash_table_lookup(keys, id); + ki = hikset_lookup(keys, id); if (ki == NULL) return 0; @@ -841,7 +945,7 @@ return 0; for (i = 0; i < kd->values && vcnt > 0; i++) { - guint64 dbkey = kd->dbkeysi; + uint64 dbkey = kd->dbkeysi; dht_value_t *v; g_assert(0 != dbkey); @@ -880,7 +984,7 @@ int keys_get(const kuid_t *id, dht_value_type_t type, kuid_t **secondary, int secondary_count, dht_value_t **valvec, int valcnt, - float *loadptr, gboolean *cached) + float *loadptr, bool *cached) { struct keyinfo *ki; struct keydata *kd; @@ -893,7 +997,7 @@ g_assert(valcnt > 0); g_assert(loadptr); - ki = g_hash_table_lookup(keys, id); + ki = hikset_lookup(keys, id); g_assert(ki); /* If called, we know the key exists */ @@ -902,7 +1006,7 @@ " with %d secondary key%s", kuid_to_hex_string(id), ki->get_req_load, ki->get_requests, dht_value_type_to_string(type), - secondary_count, 1 == secondary_count ? "" : "s"); + secondary_count, plural(secondary_count)); *loadptr = ki->get_req_load; ki->get_requests++; @@ -917,7 +1021,7 @@ */ for (i = 0; i < secondary_count && vcnt > 0; i++) { - guint64 dbkey = lookup_secondary(kd, secondaryi); + uint64 dbkey = lookup_secondary(kd, secondaryi); dht_value_t *v; if (0 == dbkey) @@ -960,7 +1064,7 @@ */ for (i = 0; i < kd->values && vcnt > 0; i++) { - guint64 dbkey = kd->dbkeysi; + uint64 dbkey = kd->dbkeysi; dht_value_t *v; g_assert(0 != dbkey); @@ -987,9 +1091,9 @@ */ if (vvec != valvec) { - gnet_stats_count_general(GNR_DHT_FETCH_LOCAL_HITS, 1); + gnet_stats_inc_general(GNR_DHT_FETCH_LOCAL_HITS); if (ki->flags & DHT_KEY_F_CACHED) - gnet_stats_count_general(GNR_DHT_FETCH_LOCAL_CACHED_HITS, 1); + gnet_stats_inc_general(GNR_DHT_FETCH_LOCAL_CACHED_HITS); } done: @@ -1004,17 +1108,20 @@ * Serialization routine for keydata. */ static void -serialize_keydata(pmsg_t *mb, gconstpointer data) +serialize_keydata(pmsg_t *mb, const void *data) { const struct keydata *kd = data; int i; g_assert(kd->values <= MAX_VALUES); + pmsg_write_u8(mb, KEYS_KEYDATA_VERSION); pmsg_write_u8(mb, kd->values); + for (i = 0; i < kd->values; i++) { pmsg_write(mb, &kd->creatorsi, sizeof(kd->creatorsi)); pmsg_write(mb, &kd->dbkeysi, sizeof(kd->dbkeysi)); + pmsg_write_time(mb, kd->expirei); } } @@ -1022,21 +1129,35 @@ * Deserialization routine for keydata. */ static void -deserialize_keydata(bstr_t *bs, gpointer valptr, size_t len) +deserialize_keydata(bstr_t *bs, void *valptr, size_t len) { struct keydata *kd = valptr; int i; + uint8 version; g_assert(sizeof *kd == len); - bstr_read_u8(bs, &kd->values); - g_assert(kd->values <= G_N_ELEMENTS(kd->creators)); + /* + * Early returns will cause DBMW to complain that the value could not + * be deserialized properly. We do not log anything here. + */ + + if (!bstr_read_u8(bs, &version)) + return; + + if (!bstr_read_u8(bs, &kd->values)) + return; - STATIC_ASSERT(G_N_ELEMENTS(kd->creators) == G_N_ELEMENTS(kd->dbkeys)); + if (kd->values > N_ITEMS(kd->creators)) + return; + + STATIC_ASSERT(N_ITEMS(kd->creators) == N_ITEMS(kd->dbkeys)); + STATIC_ASSERT(N_ITEMS(kd->creators) == N_ITEMS(kd->expire)); for (i = 0; i < kd->values; i++) { bstr_read(bs, &kd->creatorsi, sizeof(kd->creatorsi)); bstr_read(bs, &kd->dbkeysi, sizeof(kd->dbkeysi)); + bstr_read_time(bs, &kd->expirei); } } @@ -1059,22 +1180,22 @@ * * @return TRUE if the key item holds no value and must be removed. */ -static gboolean -keys_update_load(gpointer u_key, gpointer val, gpointer u) +static bool +keys_update_load(void *val, void *u) { struct keyinfo *ki = val; struct load_ctx *ctx = u; - (void) u_key; - keyinfo_check(ki); /* * Check for expired values. */ - if (ctx->now >= ki->next_expire) - keys_expire_values(ki, ctx->now); + if (ctx->now >= ki->next_expire) { + if (!keys_expire_values(ki, ctx->now)) + return TRUE; /* ki was freed, delete entry */ + } /* * Collection of empty keys happens in a separate check because we also @@ -1083,7 +1204,7 @@ */ if (0 == ki->values) { - keys_reclaim(ki); + keys_reclaim(ki, FALSE); return TRUE; /* Entry deleted */ } @@ -1108,8 +1229,8 @@ * Callout queue periodic event for request load updates. * Also reclaims dead keys holding no values. */ -static gboolean -keys_periodic_load(gpointer unused_obj) +static bool +keys_periodic_load(void *unused_obj) { struct load_ctx ctx; @@ -1117,15 +1238,15 @@ ctx.values = 0; ctx.now = tm_time(); - g_hash_table_foreach_remove(keys, keys_update_load, &ctx); + hikset_foreach_remove(keys, keys_update_load, &ctx); - g_assert(values_count() == ctx.values); + g_assert_log(values_count() == ctx.values, + "values_count()=%zu, ctx.values=%zu", values_count(), ctx.values); if (GNET_PROPERTY(dht_storage_debug)) { - size_t keys_count = g_hash_table_size(keys); + size_t keys_count = hikset_count(keys); g_debug("DHT holding %zu value%s spread over %zu key%s", - ctx.values, 1 == ctx.values ? "" : "s", - keys_count, 1 == keys_count ? "" : "s"); + ctx.values, plural(ctx.values), keys_count, plural(keys_count)); } return TRUE; /* Keep calling */ @@ -1143,7 +1264,7 @@ patricia_t *pt; int i; - kvec = walloc(KDA_K * sizeof(knode_t *)); + WALLOC_ARRAY(kvec, KDA_K); kcnt = dht_fill_closest(our_kuid, kvec, KDA_K, NULL, TRUE); kball.seeded = TRUE; @@ -1182,19 +1303,17 @@ g_assert(cbits <= KUID_RAW_BITSIZE); if (GNET_PROPERTY(dht_debug)) { - guint8 width = cbits - fbits; + uint8 width = cbits - fbits; g_debug("DHT %sk-ball %s %u bit%s (was %u-bit wide)", kball.seeded ? "" : "(not seeded yet) ", width == kball.width ? "remained at" : width > kball.width ? "expanded to" : "shrunk to", - width, 1 == width ? "" : "s", kball.width); + width, plural(width), kball.width); g_debug("DHT k-ball closest (%zu common bit%s) is %s", - cbits, 1 == cbits ? "" : "s", - knode_to_string(closest)); + cbits, plural(cbits), knode_to_string(closest)); g_debug("DHT k-ball furthest (%zu common bit%s) is %s", - fbits, 1 == fbits ? "" : "s", - knode_to_string(furthest)); + fbits, plural(fbits), knode_to_string(furthest)); } STATIC_ASSERT(KUID_RAW_BITSIZE < 256); @@ -1208,7 +1327,7 @@ gnet_stats_set_general(GNR_DHT_KBALL_CLOSEST, kball.closest_bits); } - wfree(kvec, KDA_K * sizeof(knode_t *)); + WFREE_ARRAY(kvec, KDA_K); patricia_destroy(pt); } @@ -1220,7 +1339,7 @@ { size_t common; int delta; - guint8 frontier; + uint8 frontier; common = kuid_common_prefix(get_our_kuid(), key); @@ -1246,7 +1365,7 @@ delta = kball.furthest_bits - common; - g_assert(delta > 0 && UNSIGNED(delta) < G_N_ELEMENTS(decimation_factor)); + g_assert(delta > 0 && UNSIGNED(delta) < N_ITEMS(decimation_factor)); return decimation_factordelta; } @@ -1255,19 +1374,237 @@ * Callout queue callback for k-ball updates. */ static void -keys_periodic_kball(cqueue_t *unused_cq, gpointer unused_obj) +keys_periodic_kball(cqueue_t *cq, void *unused_obj) { - (void) unused_cq; (void) unused_obj; + cq_zero(cq, &kball_ev); install_periodic_kball(KBALL_PERIOD); keys_update_kball(); } +struct keys_create_context { + const kuid_t *our_kuid; + hset_t *dbkeys; /* Value/raw data DB keys (atoms) */ +}; + +/** + * DBMW foreach iterator to reload keyinfo. + * + * @return TRUE if persisted entry can be deleted. + */ +static bool G_COLD +reload_ki(void *key, void *value, size_t u_len, void *data) +{ + struct keys_create_context *ctx = data; + const struct keydata *kd = value; + const kuid_t *id = key; + struct keyinfo *ki; + size_t common; + time_t next_expire = TIME_T_MAX, last_expire = 0, now = tm_time(); + unsigned i; + + (void) u_len; + + if (0 == kd->values) + return TRUE; + + /* + * Check whether key has expired: if all the values associated with it + * have expired, there will be no need to recreate the keyinfo and + * retrieve the associated value data. + */ + + for (i = 0; i < kd->values; i++) { + last_expire = MAX(last_expire, kd->expirei); + } + + if (delta_time(now, last_expire) >= 0) + return TRUE; + + /* + * We're going to keep at least one of the values, prepare keyinfo. + */ + + common = kuid_common_prefix(ctx->our_kuid, id); + ki = allocate_keyinfo(id, common); + hikset_insert_key(keys, &ki->kuid); + + /* + * Values will be inserted later, just prepare the DB keys we need to + * load to restore them. + */ + + for (i = 0; i < kd->values; i++) { + uint64 dbkey = kd->dbkeysi; + + if (delta_time(now, kd->expirei) >= 0) + continue; /* This value has already expired */ + + next_expire = MIN(next_expire, kd->expirei); + + if (!hset_contains(ctx->dbkeys, &dbkey)) { + const uint64 *dbatom = atom_uint64_get(&dbkey); + hset_insert(ctx->dbkeys, dbatom); + } + } + + ki->next_expire = next_expire; + + return FALSE; /* Keep keydata */ +} + +static void G_COLD +keys_free_dbkey(const void *key, void *u_data) +{ + const uint64 *dbkey = key; + + (void) u_data; + atom_uint64_free(dbkey); +} + +/** + * Set iterator to remove keys with no values. + */ +static bool G_COLD +keys_discard_if_empty(void *key, void *u_data) +{ + struct keyinfo *ki = key; + + keyinfo_check(ki); + (void) u_data; + + if (0 == ki->values) { + if (GNET_PROPERTY(dht_keys_debug) > 1) { + g_debug("DHT KEYS no values retrieved for key %s, discarding", + kuid_to_hex_string(ki->kuid)); + } + + keys_reclaim(ki, FALSE); + return TRUE; + } + + return FALSE; /* Keep key */ +} + +/** + * DBMW iterator to delete keys with no values. + */ +static bool G_COLD +keys_delete_if_empty(void *u_key, void *value, size_t u_len, void *u_data) +{ + struct keydata *kd = value; + + (void) u_data; + (void) u_len; + (void) u_key; + + return 0 == kd->values; +} + +/** + * DBMW iterator to reset key data. + */ +static void G_COLD +keys_reset_keydata(void *key, void *u_data) +{ + struct keyinfo *ki = key; + struct keydata kd; + + keyinfo_check(ki); + (void) u_data; + + ZERO(&kd); + dbmw_write(db_keydata, ki->kuid, &kd, sizeof kd); +} + +/** + * Recreate keyinfo data from persisted information. + */ +static void G_COLD +keys_init_keyinfo(void) +{ + struct keys_create_context ctx; + + if (GNET_PROPERTY(dht_keys_debug)) { + size_t count = dbmw_count(db_keydata); + g_debug("DHT KEYS scanning %u persisted key%s", + (unsigned) count, plural(count)); + } + + ctx.our_kuid = get_our_kuid(); + ctx.dbkeys = hset_create(HASH_KEY_FIXED, sizeof(uint64)); + + dbmw_foreach_remove(db_keydata, reload_ki, &ctx); + + if (GNET_PROPERTY(dht_keys_debug)) { + size_t count = dbmw_count(db_keydata); + g_debug("DHT KEYS kept %u key%s, now loading associated values", + (unsigned) count, plural(count)); + } + + /* + * FIXME: + * Unfortunately, we have to reset the keydata database for each of + * the keys we're going to recreate, because the logic adding values + * back to the key will fill each of the keydata appropriately, and it + * expects the amount of values in the keyinfo and the keydata to match. + * + * Therefore, we need to rename the old keydata database, open a new one, + * write empty keydata values in it, then discard the old keydata if + * everything goes well. In case of a crash in the middle of the + * restoration, we'll be able to recover by opening the old keydata first + * if it exists. + * + * It is far from critical though: if we reset the keydata database and + * we crash in the middle of the restore, then we'll lose all the persisted + * keys and values and will simply restart with an empty storage. + * + * Given the contorsions needed to fix that, and the little value for + * the user, just leaving a FIXME note. + * --RAM, 2012-11-17 + */ + + hikset_foreach(keys, keys_reset_keydata, NULL); + values_init_data(ctx.dbkeys); + + hset_foreach(ctx.dbkeys, keys_free_dbkey, NULL); + hset_free_null(&ctx.dbkeys); + + hikset_foreach_remove(keys, keys_discard_if_empty, NULL); + dbmw_foreach_remove(db_keydata, keys_delete_if_empty, NULL); + dbstore_compact(db_keydata); + + g_soft_assert_log(hikset_count(keys) == dbmw_count(db_keydata), + "keys reloaded: %zu, key data persisted: %zu", + hikset_count(keys), dbmw_count(db_keydata)); + + if (GNET_PROPERTY(dht_keys_debug)) { + g_debug("DHT KEYS reloaded %zu key%s", + hikset_count(keys), plural(hikset_count(keys))); + } + + gnet_stats_set_general(GNR_DHT_KEYS_HELD, hikset_count(keys)); +} + +/** + * Periodic DB synchronization. + */ +static bool +keys_sync(void *unused_obj) +{ + (void) unused_obj; + + dbstore_sync_flush(db_keydata); + values_sync(); + + return TRUE; /* Keep calling */ +} + /** * Initialize local key management. */ -G_GNUC_COLD void +void G_COLD keys_init(void) { size_t i; @@ -1282,18 +1619,20 @@ keys_periodic_ev = cq_periodic_main_add(LOAD_PERIOD * 1000, keys_periodic_load, NULL); - keys = g_hash_table_new(kuid_hash, kuid_eq); + keys = hikset_create( + offsetof(struct keyinfo, kuid), HASH_KEY_FIXED, KUID_RAW_SIZE); install_periodic_kball(KBALL_FIRST); - /* Legacy: remove after 0.97 -- RAM, 2011-05-03 */ - dbstore_move(settings_config_dir(), settings_dht_db_dir(), db_keybase); - - db_keydata = dbstore_create(db_keywhat, settings_dht_db_dir(), db_keybase, + db_keydata = dbstore_open(db_keywhat, settings_dht_db_dir(), db_keybase, kv, packing, KEYS_DB_CACHE_SIZE, kuid_hash, kuid_eq, GNET_PROPERTY(dht_storage_in_memory)); - for (i = 0; i < G_N_ELEMENTS(decimation_factor); i++) + for (i = 0; i < N_ITEMS(decimation_factor); i++) decimation_factori = pow(KEYS_DECIMATION_BASE, i); + + values_init(); + keys_init_keyinfo(); + keys_sync_ev = cq_periodic_main_add(KEYS_SYNC_PERIOD, keys_sync, NULL); } /** @@ -1303,7 +1642,7 @@ const kuid_t *our_kuid; /**< Our KUID */ const kuid_t *remote_kuid; /**< Remote node's KUID */ patricia_t *kclosest; /**< Our k-closest alive nodes */ - GSList *found; /**< Target keys found */ + pslist_t *found; /**< Target keys found */ unsigned count; /**< How many keys we found */ }; @@ -1313,12 +1652,14 @@ * nodes. */ static void -keys_offload_prepare(gpointer key, gpointer val, gpointer data) +keys_offload_prepare(void *val, void *data) { - kuid_t *id = key; + const kuid_t *id; struct keyinfo *ki = val; struct offload_context *ctx = data; + id = ki->kuid; + if (!bits_within_kball(ki->common_bits)) return; /* Key not in our k-ball, cached probably */ @@ -1330,7 +1671,7 @@ */ if (patricia_closest(ctx->kclosest, id) == ctx->our_kuid) { - ctx->found = g_slist_prepend(ctx->found, id); + ctx->found = pslist_prepend_const(ctx->found, id); ctx->count++; } } @@ -1355,17 +1696,20 @@ struct offload_context ctx; unsigned n; knode_t *kclosestKDA_K; /* Our known k-closest nodes */ - gboolean debug; + bool debug; knode_check(kn); if (kn->flags & (KNODE_F_FIREWALLED | KNODE_F_SHUTDOWNING)) return; + if G_UNLIKELY(NULL == keys) + return; /* Key layer already shutdown */ + if ( - !dht_bootstrapped() || /* Not bootstrapped */ - !keys_within_kball(kn->id) || /* Node KUID outside our k-ball */ - 0 == g_hash_table_size(keys) /* No keys held */ + !dht_bootstrapped() || /* Not bootstrapped */ + !keys_within_kball(kn->id) || /* Node KUID outside our k-ball */ + 0 == hikset_count(keys) /* No keys held */ ) return; @@ -1375,7 +1719,7 @@ if (debug) g_debug("DHT preparing key offloading to %s", knode_to_string(kn)); - gnet_stats_count_general(GNR_DHT_KEY_OFFLOADING_CHECKS, 1); + gnet_stats_inc_general(GNR_DHT_KEY_OFFLOADING_CHECKS); ctx.our_kuid = get_our_kuid(); ctx.remote_kuid = kn->id; @@ -1392,9 +1736,9 @@ */ n = dht_fill_closest(ctx.our_kuid, kclosest, - G_N_ELEMENTS(kclosest), ctx.remote_kuid, TRUE); + N_ITEMS(kclosest), ctx.remote_kuid, TRUE); - if (n < G_N_ELEMENTS(kclosest)) { + if (n < N_ITEMS(kclosest)) { if (debug) g_warning("DHT got only %u closest alive nodes, cannot offload", n); return; @@ -1406,7 +1750,7 @@ */ ctx.kclosest = patricia_create(KUID_RAW_BITSIZE); - for (n = 0; n < G_N_ELEMENTS(kclosest); n++) { + for (n = 0; n < N_ITEMS(kclosest); n++) { patricia_insert(ctx.kclosest, kclosestn->id, kclosestn->id); } patricia_insert(ctx.kclosest, ctx.our_kuid, ctx.our_kuid); @@ -1415,29 +1759,28 @@ * Select offloading candidate keys. */ - g_hash_table_foreach(keys, keys_offload_prepare, &ctx); + hikset_foreach(keys, keys_offload_prepare, &ctx); patricia_destroy(ctx.kclosest); - if (debug) - g_debug("DHT found %u/%u offloading candidate%s", - ctx.count, (unsigned) g_hash_table_size(keys), - 1 == ctx.count ? "" : "s"); + if (debug) { + g_debug("DHT found %u/%zu offloading candidate%s", + ctx.count, hikset_count(keys), plural(ctx.count)); + } if (ctx.count) publish_offload(kn, ctx.found); - gm_slist_free_null(&ctx.found); + pslist_free_null(&ctx.found); } /** * Hashtable iterator to free the items held in `keys'. */ static void -keys_free_kv(gpointer u_key, gpointer val, gpointer u_x) +keys_free_kv(void *val, void *u_x) { struct keyinfo *ki = val; - (void) u_key; (void) u_x; keyinfo_check(ki); @@ -1449,15 +1792,17 @@ /** * Close local key management. */ -G_GNUC_COLD void +void G_COLD keys_close(void) { - dbstore_delete(db_keydata); + values_close(); + + dbstore_close(db_keydata, settings_dht_db_dir(), db_keybase); db_keydata = NULL; if (keys) { - g_hash_table_foreach(keys, keys_free_kv, NULL); - gm_hash_table_destroy_null(&keys); + hikset_foreach(keys, keys_free_kv, NULL); + hikset_free_null(&keys); } kuid_atom_free_null(&kball.furthest); @@ -1468,6 +1813,7 @@ cq_cancel(&kball_ev); cq_periodic_remove(&keys_periodic_ev); + cq_periodic_remove(&keys_sync_ev); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/keys.h -> gtk-gnutella-1.1.9.tar.bz2/src/dht/keys.h
Changed
@@ -46,21 +46,21 @@ void keys_init(void); void keys_close(void); -gboolean keys_exists(const kuid_t *key); -gboolean keys_is_store_loaded(const kuid_t *id); -void keys_get_status(const kuid_t *id, gboolean *full, gboolean *loaded); -guint64 keys_has(const kuid_t *id, const kuid_t *cid, gboolean store); +bool keys_exists(const kuid_t *key); +bool keys_is_store_loaded(const kuid_t *id); +void keys_get_status(const kuid_t *id, bool *full, bool *loaded); +uint64 keys_has(const kuid_t *id, const kuid_t *cid, bool store); void keys_add_value(const kuid_t *id, const kuid_t *cid, - guint64 dbkey, time_t expire); -void keys_update_value(const kuid_t *id, time_t expire); -void keys_remove_value(const kuid_t *id, const kuid_t *cid, guint64 dbkey); + uint64 dbkey, time_t expire); +void keys_update_value(const kuid_t *id, const kuid_t *cid, time_t expire); +void keys_remove_value(const kuid_t *id, const kuid_t *cid, uint64 dbkey); int keys_get_all(const kuid_t *id, dht_value_t **valvec, int valcnt); int keys_get(const kuid_t *id, dht_value_type_t type, kuid_t **secondary, int secondary_count, dht_value_t **valvec, int valcnt, - float *loadptr, gboolean *cached); -gboolean keys_within_kball(const kuid_t *id); -gboolean keys_is_foreign(const kuid_t *id); -gboolean keys_is_nearby(const kuid_t *id); + float *loadptr, bool *cached); +bool keys_within_kball(const kuid_t *id); +bool keys_is_foreign(const kuid_t *id); +bool keys_is_nearby(const kuid_t *id); double keys_decimation_factor(const kuid_t *key); void keys_update_kball(); void keys_offload(const knode_t *kn);
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/kmsg.c -> gtk-gnutella-1.1.9.tar.bz2/src/dht/kmsg.c
Changed
@@ -59,15 +59,18 @@ #include "if/gnet_property_priv.h" #include "lib/aging.h" +#include "lib/bigint.h" #include "lib/bstr.h" #include "lib/host_addr.h" -#include "lib/glib-missing.h" #include "lib/pmsg.h" -#include "lib/sectoken.h" +#include "lib/pslist.h" #include "lib/random.h" +#include "lib/sectoken.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/unsigned.h" #include "lib/vendors.h" +#include "lib/vsort.h" #include "lib/walloc.h" #include "lib/override.h" /* Must be the last header included */ @@ -130,21 +133,21 @@ #define KMSG_STORE_AIMED_SIZE 512 #define KMSG_STORE_MAX_SIZE 640 -typedef void (*kmsg_handler_t)(knode_t *kn, struct gnutella_node *n, +typedef void (*kmsg_handler_t)(knode_t *kn, gnutella_node_t *n, const kademlia_header_t *header, - guint8 extlen, const void *payload, size_t len); + uint8 extlen, const void *payload, size_t len); /** * A Kademlia message descriptor. */ struct kmsg { - guint8 function; - guint8 rpc_call; + uint8 function; + uint8 rpc_call; kmsg_handler_t handler; const char *name; }; -static const struct kmsg *kmsg_find(guint8 function); +static const struct kmsg *kmsg_find(uint8 function); /** * Test whether the Kademlia message can be safely dropped. @@ -153,8 +156,8 @@ * Dropping of messages only happens when the connection is flow-controlled, * and there's not enough room in the queue. */ -gboolean -kmsg_can_drop(gconstpointer pdu, int size) +bool +kmsg_can_drop(const void *pdu, int size) { if (UNSIGNED(size) < KDA_HEADER_SIZE) return TRUE; @@ -201,11 +204,11 @@ */ static void kmsg_handle(knode_t *kn, - struct gnutella_node *n, - const kademlia_header_t *header, guint8 extlen, + gnutella_node_t *n, + const kademlia_header_t *header, uint8 extlen, const void *payload, size_t len) { - guint8 function; + uint8 function; const struct kmsg *km; if (GNET_PROPERTY(dht_debug > 1)) { @@ -213,36 +216,38 @@ kmsg_infostr(header), knode_to_string(kn)); if (len && (GNET_PROPERTY(dht_trace) & SOCK_TRACE_IN)) dump_hex(stderr, "UDP payload", payload, len); - + } function = kademlia_header_get_function(header); km = kmsg_find(function); - /* - * Users can force passive mode, even if not firewalled. - * Enforce that no RPC call can be made on a non-active node. - */ - - if (km->rpc_call && !dht_is_active()) { - if (GNET_PROPERTY(dht_debug)) { - g_debug("DHT in passive mode, ignoring %s from %s", - km->name, knode_to_string(kn)); - } - gnet_dht_stats_count_dropped(n, function, MSG_DROP_UNEXPECTED); - return; - } - - if (!km) { + if (NULL == km) { if (GNET_PROPERTY(dht_debug)) g_message("DHT invalid message function 0x%x from %s", function, knode_to_string(kn)); - } else if (NULL == km->handler) { - if (GNET_PROPERTY(dht_debug)) - g_warning("DHT unhandled %s from %s", - km->name, knode_to_string(kn)); } else { - km->handler(kn, n, header, extlen, payload, len); + /* + * Users can force passive mode, even if not firewalled. + * Enforce that no RPC call can be made on a non-active node. + */ + + if (km->rpc_call && !dht_is_active()) { + if (GNET_PROPERTY(dht_debug)) { + g_debug("DHT in passive mode, ignoring %s from %s", + km->name, knode_to_string(kn)); + } + gnet_dht_stats_count_dropped(n, function, MSG_DROP_UNEXPECTED); + return; + } + + if (NULL == km->handler) { + if (GNET_PROPERTY(dht_debug)) + g_warning("DHT unhandled %s from %s", + km->name, knode_to_string(kn)); + } else { + km->handler(kn, n, header, extlen, payload, len); + } } } @@ -254,12 +259,12 @@ */ static void warn_no_header_extension(const knode_t *kn, - const kademlia_header_t *header, guint8 extlen) + const kademlia_header_t *header, uint8 extlen) { if (extlen && GNET_PROPERTY(dht_debug)) { - guint8 function = kademlia_header_get_function(header); + uint8 function = kademlia_header_get_function(header); g_warning("DHT unhandled extended header (%u byte%s) in %s from %s", - extlen, extlen == 1 ? "" : "s", kmsg_name(function), + extlen, plural(extlen), kmsg_name(function), knode_to_string(kn)); if (GNET_PROPERTY(dht_debug) > 15) dump_hex(stderr, "Kademlia extra header", @@ -277,11 +282,11 @@ size_t unparsed = bstr_unread_size(bs); if (unparsed && GNET_PROPERTY(dht_debug)) { - guint8 function = kademlia_header_get_function(header); + uint8 function = kademlia_header_get_function(header); g_warning("DHT message %s from %s " "has %zu byte%s of unparsed trailing data (ignored)", kmsg_name(function), knode_to_string(kn), - unparsed, 1 == unparsed ? "" : "s"); + unparsed, plural(unparsed)); if (GNET_PROPERTY(dht_debug) > 15) dump_hex(stderr, "Unparsed trailing data", bstr_read_base(bs), unparsed); @@ -303,7 +308,7 @@ */ static void kmsg_build_header(kademlia_header_t *header, - guint8 op, guint8 major, guint8 minor, const guid_t *muid) + uint8 op, uint8 major, uint8 minor, const guid_t *muid) { kademlia_header_set_muid(header, muid); kademlia_header_set_dht(header, major, minor); @@ -336,7 +341,7 @@ */ static void kmsg_build_header_pmsg(pmsg_t *mb, - guint8 op, guint8 major, guint8 minor, const guid_t *muid) + uint8 op, uint8 major, uint8 minor, const guid_t *muid) { kmsg_build_header((void *) pmsg_start(mb), op, major, minor, muid); kademlia_header_set_size(pmsg_start(mb), @@ -355,13 +360,19 @@ g_assert(pmsg_available(mb) >= KUID_RAW_SIZE + 1); for (i = 0; i < KUID_RAW_SIZE; i++) { - guint8 v = estimate->vi; + uint8 v = estimate->vi; if (v) break; /* Found non-zero byte */ } - pmsg_write_u8(mb, KUID_RAW_SIZE - i); - pmsg_write(mb, &estimate->vi, KUID_RAW_SIZE - i); + if (i < KUID_RAW_SIZE) { + pmsg_write_u8(mb, KUID_RAW_SIZE - i); + pmsg_write(mb, &estimate->vi, KUID_RAW_SIZE - i); + } else { + /* The estimate is 0, force a 1, since we're a DHT node */ + pmsg_write_u8(mb, 1); /* 1-byte long */ + pmsg_write_u8(mb, 1); /* value */ + } } /** @@ -386,7 +397,7 @@ { size_t i; - g_assert(klen <= MAX_INT_VAL(guint8)); + g_assert(klen <= MAX_INT_VAL(uint8)); pmsg_write_u8(mb, klen); @@ -404,9 +415,9 @@ { kuid_t kuid; host_addr_t addr; - guint16 port; + uint16 port; vendor_code_t vcode; - guint8 major, minor; + uint8 major, minor; bstr_read_be32(bs, &vcode.u32); bstr_read_u8(bs, &major); @@ -425,7 +436,7 @@ * Send a pong message back to the host who sent the ping. */ static void -k_send_pong(struct gnutella_node *n, const guid_t *muid) +k_send_pong(gnutella_node_t *n, const guid_t *muid) { kademlia_header_t *header; pmsg_t *mb; @@ -483,7 +494,7 @@ */ static void k_send_find_node_response( - struct gnutella_node *n, + gnutella_node_t *n, const knode_t *kn, knode_t **kvec, size_t klen, const guid_t *muid) { @@ -542,8 +553,7 @@ if (GNET_PROPERTY(dht_debug > 3)) g_debug("DHT sending back %s (%zu bytes) with %zu contact%s to %s", kmsg_infostr(header), (size_t) pmsg_size(mb), - klen, klen == 1 ? "" : "s", - host_addr_port_to_string(n->addr, n->port)); + klen, plural(klen), host_addr_port_to_string(n->addr, n->port)); udp_dht_send_mb(n, mb); } @@ -561,9 +571,9 @@ */ static void k_send_find_value_response( - struct gnutella_node *n, + gnutella_node_t *n, const knode_t *unused_kn, - dht_value_t **vvec, size_t vlen, float load, gboolean cached, + dht_value_t **vvec, size_t vlen, float load, bool cached, const guid_t *muid) { pmsg_t *mb; @@ -601,7 +611,14 @@ STATIC_ASSERT(KDA_HEADER_SIZE + 61 + DHT_VALUE_MAX_LEN + 6 + (MAX_VALUES_PER_KEY - 1) * KUID_RAW_SIZE < MAX_VALUE_RESPONSE_SIZE); - mb = pmsg_new(PMSG_P_DATA, NULL, MAX_VALUE_RESPONSE_SIZE); + /* + * Values are sent with an "urgent" priority to make sure they get + * the reply quickly, even under tight outgoing bandwidth: the message + * will be put ahead of the message queue and sent as soon as possible + * by the UDP TX scheduler. + */ + + mb = pmsg_new(PMSG_P_URGENT, NULL, MAX_VALUE_RESPONSE_SIZE); header = (kademlia_header_t *) pmsg_start(mb); kmsg_build_header(header, KDA_MSG_FIND_VALUE_RESPONSE, 0, 0, muid); @@ -620,7 +637,7 @@ * know how large the values are). */ - qsort(vvec, vlen, sizeof vvec0, dht_value_cmp); + vsort(vvec, vlen, sizeof vvec0, dht_value_cmp); for (i = 0; i < vlen; i++) { size_t secondary_size = (vlen - i) * KUID_RAW_SIZE + 1; @@ -633,7 +650,7 @@ if (GNET_PROPERTY(dht_debug) > 3) g_warning( "DHT after sending %zu DHT values, will send %zu key%s", - i, vlen - i, (1 == vlen - i) ? "" : "s"); + i, vlen - i, plural(vlen - i)); break; } @@ -674,6 +691,17 @@ g_warning("DHT packed secondary key %d/%zu for %s", secondaries, remain, dht_value_to_string(v)); } + } else { + /* + * We emitted all the values in expanded form, so there are no + * secondary keys. Do not forget to emit the amount of secondary + * keys present (0). Starting with 0.98.4, GTKG will be lenient and + * will correctly handle responses missing that trailing byte but + * other versions were not, and other vendors may choke as well. + * --RAM, 2012-10-28 + */ + + pmsg_write_u8(mb, 0); } g_assert(UNSIGNED(values + secondaries) == vlen); /* Sanity check */ @@ -702,8 +730,7 @@ g_debug("DHT sending back %s (%zu bytes) with " "%d value%s and %d secondary key%s to %s", kmsg_infostr(header), (size_t) pmsg_size(mb), - values, values == 1 ? "" : "s", - secondaries, secondaries == 1 ? "" : "s", + values, plural(values), secondaries, plural(secondaries), host_addr_port_to_string(n->addr, n->port)); udp_dht_send_mb(n, mb); @@ -721,18 +748,18 @@ */ static void k_send_store_response( - struct gnutella_node *n, + gnutella_node_t *n, const knode_t *kn, - dht_value_t **vec, guint8 vlen, - gboolean valid_token, + dht_value_t **vec, uint8 vlen, + bool valid_token, const guid_t *muid) { pmsg_t *mb; kademlia_header_t *header; - guint16 *status; + uint16 *status; int i; - status = walloc(vlen * sizeof(guint16)); + WALLOC_ARRAY(status, vlen); for (i = 0; i < vlen; i++) statusi = values_store(kn, veci, valid_token); @@ -740,9 +767,12 @@ /* * The architected store response message v0.0 is Cretinus Maximus. * Limit the total size to MAX_STORE_RESPONSE_SIZE, whatever happens. + * + * We use a "control" priority to make sure the acknowledgement is + * received rapidly enough, even under tight outgoing bandwidth. */ - mb = pmsg_new(PMSG_P_DATA, NULL, MAX_STORE_RESPONSE_SIZE); + mb = pmsg_new(PMSG_P_CONTROL, NULL, MAX_STORE_RESPONSE_SIZE); header = (kademlia_header_t *) pmsg_start(mb); kmsg_build_header(header, KDA_MSG_STORE_RESPONSE, 0, 0, muid); @@ -800,8 +830,7 @@ if (GNET_PROPERTY(dht_debug > 3)) g_debug("DHT sending back %s (%zu bytes) with %d status%s to %s", kmsg_infostr(header), (size_t) pmsg_size(mb), - i, i == 1 ? "" : "es", - host_addr_port_to_string(n->addr, n->port)); + i, plural_es(i), host_addr_port_to_string(n->addr, n->port)); udp_dht_send_mb(n, mb); @@ -809,15 +838,15 @@ * Cleanup. */ - wfree(status, vlen * sizeof(guint16)); + WFREE_ARRAY(status, vlen); } /** * Handle ping messages. */ static void -k_handle_ping(knode_t *kn, struct gnutella_node *n, - const kademlia_header_t *header, guint8 extlen, +k_handle_ping(knode_t *kn, gnutella_node_t *n, + const kademlia_header_t *header, uint8 extlen, const void *payload, size_t len) { const char *msg = NULL; @@ -826,7 +855,7 @@ if (len && GNET_PROPERTY(dht_debug)) { g_warning("DHT unhandled PING payload (%zu byte%s) from %s", - len, len == 1 ? "" : "s", knode_to_string(kn)); + len, plural(len), knode_to_string(kn)); dump_hex(stderr, "Kademlia Ping payload", payload, len); } @@ -838,6 +867,13 @@ goto throttle; /* + * Ignore "old" PING requests: we're trying to catch up with a UDP burst. + */ + + if (node_udp_is_old(n)) + goto old; + + /* * Firewalled nodes send us PINGs when they are listing us in their * routing table. We usually try to reply to such messages unless * we're short on UDP bandwidth or we're (almost) flow-controlled. @@ -871,13 +907,19 @@ k_send_pong(n, kademlia_header_get_muid(header)); return; +old: + if (GNET_PROPERTY(dht_debug) > 2) { + g_debug("DHT ignoring OLD PING from %s", knode_to_string(kn)); + } + gnet_dht_stats_count_dropped(n, KDA_MSG_PING_REQUEST, MSG_DROP_TOO_OLD); + return; + drop: if (GNET_PROPERTY(dht_debug) > 2) { g_debug("DHT ignoring PING from %s: %s", knode_to_string(kn), msg); } gnet_dht_stats_count_dropped(n, KDA_MSG_PING_REQUEST, MSG_DROP_FLOW_CONTROL); - return; throttle: @@ -886,16 +928,15 @@ knode_to_string(kn), compact_time(aging_age(kmsg_aging_pings, &kn->addr))); } - gnet_dht_stats_count_dropped(n, - KDA_MSG_PING_REQUEST, MSG_DROP_THROTTLE); + gnet_dht_stats_count_dropped(n, KDA_MSG_PING_REQUEST, MSG_DROP_THROTTLE); } /** * Handle pong messages. */ static void -k_handle_pong(knode_t *kn, struct gnutella_node *n, - const kademlia_header_t *header, guint8 extlen, +k_handle_pong(knode_t *kn, gnutella_node_t *n, + const kademlia_header_t *header, uint8 extlen, const void *payload, size_t len) { char *reason; @@ -907,9 +948,11 @@ !dht_rpc_answer(kademlia_header_get_muid(header), kn, n, KDA_MSG_PING_RESPONSE, payload, len) ) { - if (GNET_PROPERTY(dht_debug)) - g_warning("DHT ignoring unexpected PONG from %s", + if (GNET_PROPERTY(dht_debug) || GNET_PROPERTY(dht_rpc_debug)) { + g_warning("DHT ignoring unexpected PONG #%s from %s", + guid_to_string(kademlia_header_get_muid(header)), knode_to_string(kn)); + } return; } @@ -921,7 +964,7 @@ { host_addr_t addr; - guint16 port; + uint16 port; bstr_read_packed_ipv4_or_ipv6_addr(bs, &addr); bstr_read_le16(bs, &port); @@ -954,10 +997,11 @@ */ { - kuid_t estimated; - guint8 bytes; + char bufKUID_RAW_SIZE; + bigint_t estimated; + uint8 bytes; - bstr_read_packed_array_u8(bs, KUID_RAW_SIZE, &estimated.v0, &bytes); + bstr_read_packed_array_u8(bs, KUID_RAW_SIZE, buf, &bytes); if (bstr_has_error(bs)) { reason = "could not decompile estimated DHT size"; @@ -966,13 +1010,16 @@ g_assert(bytes <= KUID_RAW_SIZE); - memmove(&estimated.vKUID_RAW_SIZE - bytes, estimated.v, bytes); - memset(&estimated.v0, 0, KUID_RAW_SIZE - bytes); + memmove(&bufKUID_RAW_SIZE - bytes, buf, bytes); + memset(buf, 0, KUID_RAW_SIZE - bytes); - if (GNET_PROPERTY(dht_debug)) + bigint_use(&estimated, buf, sizeof buf); + + if (GNET_PROPERTY(dht_debug)) { g_debug("DHT node %s estimates DHT size to %s hosts", knode_to_string(kn), - uint64_to_string(kuid_to_guint64(&estimated))); + uint64_to_string(bigint_to_uint64(&estimated))); + } dht_record_size_estimate(kn, &estimated); } @@ -988,7 +1035,7 @@ if (GNET_PROPERTY(dht_debug)) g_warning("DHT unhandled PONG payload (%zu byte%s) from %s: %s: %s", - len, len == 1 ? "" : "s", knode_to_string(kn), + len, plural(len), knode_to_string(kn), reason, bstr_error(bs)); bstr_free(&bs); @@ -1003,15 +1050,15 @@ * @param header the Kademlia header from which we can extract the MUID */ static void -answer_find_node(struct gnutella_node *n, +answer_find_node(gnutella_node_t *n, const knode_t *kn, const kuid_t *id, const kademlia_header_t *header) { knode_t *kvecKDA_K; int requested = KDA_K; int cnt; const char *msg = NULL; - gboolean delayed; - gboolean within_kball; + bool delayed; + bool within_kball; const guid_t *muid = kademlia_header_get_muid(header); /* @@ -1029,6 +1076,23 @@ } /* + * Ignore "old" requests: we are trying to catch up with a UDP burst. + * + * Note that FIND_VALUE requests that get here are for keys we do not + * know about: we do not ignore old requests for keys we hold! + */ + + if (node_udp_is_old(n)) { + uint8 function = kademlia_header_get_function(header); + if (GNET_PROPERTY(dht_debug > 2)) { + g_debug("DHT ignoring OLD %s from %s", + kmsg_name(function), knode_to_string(kn)); + } + gnet_dht_stats_count_dropped(n, function, MSG_DROP_TOO_OLD); + return; + } + + /* * If the UDP queue is flow controlled already, there's no need to * bother computing the answer and generating the message since it * is likely to be dropped by the queue later on. @@ -1130,7 +1194,7 @@ within_kball ? "in k-ball " : keys_is_foreign(id) ? "foreign " : "", (kn->flags & KNODE_F_FIREWALLED) ? "passive" : "active", - requested, 1 == requested ? "" : "s"); + requested, plural(requested)); } cnt = dht_fill_closest(id, kvec, requested, kn->id, TRUE); @@ -1191,7 +1255,7 @@ * Is lookup of ID by the given node something that can be accounted for * as peer replication among the k-closest nodes? */ -static inline gboolean +static inline bool peer_replication(const knode_t *kn, const kuid_t *id) { return keys_within_kball(kn->id) && keys_within_kball(id); @@ -1201,8 +1265,8 @@ * Handle find_node(id) messages. */ static void -k_handle_find_node(knode_t *kn, struct gnutella_node *n, - const kademlia_header_t *header, guint8 extlen, +k_handle_find_node(knode_t *kn, gnutella_node_t *n, + const kademlia_header_t *header, uint8 extlen, const void *payload, size_t len) { kuid_t *id = (kuid_t *) payload; @@ -1212,7 +1276,7 @@ if (len != KUID_RAW_SIZE) { if (GNET_PROPERTY(dht_debug)) { g_warning("DHT bad FIND_NODE payload (%zu byte%s) from %s", - len, len == 1 ? "" : "s", knode_to_string(kn)); + len, plural(len), knode_to_string(kn)); dump_hex(stderr, "Kademlia FIND_NODE payload", payload, len); } gnet_dht_stats_count_dropped(n, @@ -1263,14 +1327,14 @@ * Handle store requests. */ static void -k_handle_store(knode_t *kn, struct gnutella_node *n, - const kademlia_header_t *header, guint8 extlen, +k_handle_store(knode_t *kn, gnutella_node_t *n, + const kademlia_header_t *header, uint8 extlen, const void *payload, size_t len) { - gboolean valid_token = FALSE; + bool valid_token = FALSE; bstr_t *bs; char *reason; - guint8 values; + uint8 values; int i = 0; char msg80; dht_value_t **vec = NULL; @@ -1278,14 +1342,14 @@ warn_no_header_extension(kn, header, extlen); bs = bstr_open(payload, len, GNET_PROPERTY(dht_debug) ? BSTR_F_ERROR : 0); - + /* * Decompile first field: security token. */ { sectoken_t security; - guint8 token_len; + uint8 token_len; if (!bstr_read_u8(bs, &token_len)) { reason = "could not read security token length"; @@ -1331,14 +1395,13 @@ */ if (!valid_token) { - gboolean in_kball = keys_within_kball(kn->id); + bool in_kball = keys_within_kball(kn->id); int ignored = in_kball ? values - 1 : values; if (ignored && GNET_PROPERTY(dht_debug)) g_warning("DHT STORE ignoring the %u %svalue%s supplied by %s %s", - ignored, in_kball ? "additional" : "", 1 == ignored ? "" : "s", - in_kball ? "k-closest" : "foreigner", - knode_to_string(kn)); + ignored, in_kball ? "additional" : "", plural(ignored), + in_kball ? "k-closest" : "foreigner", knode_to_string(kn)); if (in_kball) { values = 1; @@ -1354,13 +1417,13 @@ * Decompile remaining fields: values to store. */ - vec = walloc(values * sizeof *vec); + WALLOC_ARRAY(vec, values); for (i = 0; i < values; i++) { dht_value_t *v = dht_value_deserialize(bs); if (NULL == v) { - gm_snprintf(msg, sizeof msg, + str_bprintf(msg, sizeof msg, "could not read value #%d/%u", i, values); reason = msg; goto error; @@ -1381,7 +1444,7 @@ (kn->flags & KNODE_F_PCONTACT) && kuid_eq(kn->id, dht_value_creator(v)->id) ) { - knode_t *cn = deconstify_gpointer(dht_value_creator(v)); + const knode_t *cn = dht_value_creator(v); if (GNET_PROPERTY(dht_storage_debug)) g_warning( @@ -1389,9 +1452,7 @@ host_addr_to_string(cn->addr), cn->port, host_addr_port_to_string(kn->addr, kn->port)); - cn->addr = kn->addr; - cn->port = kn->port; - cn->flags |= KNODE_F_PCONTACT; + dht_value_patch_creator(v, kn->addr, kn->port); } veci = v; @@ -1427,7 +1488,7 @@ invalid_token: if (GNET_PROPERTY(dht_debug)) g_warning("DHT unhandled STORE payload (%zu byte%s) from %s: %s: %s", - len, len == 1 ? "" : "s", knode_to_string(kn), + len, plural(len), knode_to_string(kn), reason, bstr_error(bs)); /* FALL THROUGH */ @@ -1439,7 +1500,7 @@ for (j = 0; j < i; j++) dht_value_free(vecj, TRUE); - wfree(vec, values * sizeof *vec); + WFREE_ARRAY(vec, values); } bstr_free(&bs); @@ -1449,13 +1510,13 @@ * Handle find_value(id) requests. */ static void -k_handle_find_value(knode_t *kn, struct gnutella_node *n, - const kademlia_header_t *header, guint8 extlen, +k_handle_find_value(knode_t *kn, gnutella_node_t *n, + const kademlia_header_t *header, uint8 extlen, const void *payload, size_t len) { kuid_t *id = (kuid_t *) payload; bstr_t *bs; - guint8 count; + uint8 count; kuid_t **secondary = NULL; const char *reason; char msg80; @@ -1463,7 +1524,7 @@ dht_value_t *vvecMAX_VALUES_PER_KEY; int vcnt = 0; float load; - gboolean cached; + bool cached; warn_no_header_extension(kn, header, extlen); @@ -1475,7 +1536,7 @@ if (len < KUID_RAW_SIZE + 4) { if (GNET_PROPERTY(dht_debug)) { g_warning("DHT bad FIND_VALUE payload (%zu byte%s) from %s", - len, len == 1 ? "" : "s", knode_to_string(kn)); + len, plural(len), knode_to_string(kn)); dump_hex(stderr, "Kademlia FIND_VALUE payload", payload, len); } gnet_dht_stats_count_dropped(n, @@ -1533,13 +1594,13 @@ if (count) { int i; - secondary = walloc0(count * sizeof(secondary0)); + WALLOC0_ARRAY(secondary, count); for (i = 0; i < count; i++) { kuid_t sec_id; if (!bstr_read(bs, sec_id.v, KUID_RAW_SIZE)) { - gm_snprintf(msg, sizeof msg, + str_bprintf(msg, sizeof msg, "could not read secondary key #%d/%u", i, count); reason = msg; goto error; @@ -1570,7 +1631,7 @@ */ vcnt = keys_get(id, type, secondary, count, - vvec, G_N_ELEMENTS(vvec), &load, &cached); + vvec, N_ITEMS(vvec), &load, &cached); /* * If we have no items of the requested value type, we need to act @@ -1606,7 +1667,7 @@ g_debug("DHT FETCH \"%s\" %s (%s) FOUND %d %svalue%s", dht_value_type_to_string(type), kuid_to_hex_string(id), kuid_to_string(id), - vcnt, cached ? "cached " : "", 1 == vcnt ? "" : "s"); + vcnt, cached ? "cached " : "", plural(vcnt)); k_send_find_value_response(n, kn, vvec, vcnt, load, cached, kademlia_header_get_muid(header)); @@ -1620,7 +1681,7 @@ if (GNET_PROPERTY(dht_debug)) g_warning( "DHT unhandled FIND_VALUE payload (%zu byte%s) from %s: %s: %s", - len, len == 1 ? "" : "s", knode_to_string(kn), + len, plural(len), knode_to_string(kn), reason, bstr_error(bs)); /* FALL THROUGH */ @@ -1634,7 +1695,7 @@ break; kuid_atom_free_null(&secondaryi); } - wfree(secondary, count * sizeof(secondary0)); + WFREE_ARRAY(secondary, count); } if (vcnt) { @@ -1654,11 +1715,11 @@ * it will be handled by the RPC callbacks. Otherwise, the message is ignored. */ static void -k_handle_rpc_reply(knode_t *kn, struct gnutella_node *n, - const kademlia_header_t *header, guint8 extlen, +k_handle_rpc_reply(knode_t *kn, gnutella_node_t *n, + const kademlia_header_t *header, uint8 extlen, const void *payload, size_t len) { - guint8 function = kademlia_header_get_function(header); + uint8 function = kademlia_header_get_function(header); warn_no_header_extension(kn, header, extlen); @@ -1666,9 +1727,12 @@ !dht_rpc_answer(kademlia_header_get_muid(header), kn, n, function, payload, len) ) { - if (GNET_PROPERTY(dht_debug)) - g_warning("DHT ignoring unexpected %s from %s", - kmsg_name(function), knode_to_string(kn)); + if (GNET_PROPERTY(dht_debug) || GNET_PROPERTY(dht_rpc_debug)) { + g_warning("DHT ignoring unexpected %s #%s from %s", + kmsg_name(function), + guid_to_string(kademlia_header_get_muid(header)), + knode_to_string(kn)); + } return; } @@ -1681,7 +1745,7 @@ void kmsg_send_mb(knode_t *kn, pmsg_t *mb) { - struct gnutella_node *n = node_dht_get_addr_port(kn->addr, kn->port); + gnutella_node_t *n = node_dht_get_addr_port(kn->addr, kn->port); knode_check(kn); @@ -1734,7 +1798,7 @@ */ void kmsg_send_find_node(knode_t *kn, const kuid_t *id, const guid_t *muid, - pmsg_free_t mfree, gpointer marg) + pmsg_free_t mfree, void *marg) { pmsg_t *mb; int msize = KDA_HEADER_SIZE + KUID_RAW_SIZE; @@ -1765,14 +1829,14 @@ void kmsg_send_find_value(knode_t *kn, const kuid_t *id, dht_value_type_t type, kuid_t **skeys, int scnt, - const guid_t *muid, pmsg_free_t mfree, gpointer marg) + const guid_t *muid, pmsg_free_t mfree, void *marg) { pmsg_t *mb; int msize; int i; g_assert(skeys == NULL || scnt > 0); - g_assert(scnt >= 0 && scnt <= MAX_INT_VAL(guint8)); + g_assert(scnt >= 0 && scnt <= MAX_INT_VAL(uint8)); /* Header + target KUID + count + array-of-sec-keys + type */ msize = KDA_HEADER_SIZE + KUID_RAW_SIZE + 1 + @@ -1804,7 +1868,7 @@ static void store_finalize_pmsg(pmsg_t *mb, int values_held, pmsg_offset_t value_count) { - guint8 function = kademlia_header_get_function(pmsg_start(mb)); + uint8 function = kademlia_header_get_function(pmsg_start(mb)); g_assert(KDA_MSG_STORE_REQUEST == function); @@ -1834,15 +1898,15 @@ * @param vvec vector of values to store * @param vcnt amount of values in ``vvec'' * - * @return a GSList of message blocks (pmsg_t *), with blank MUIDs, meant + * @return a pslist_t of message blocks (pmsg_t *), with blank MUIDs, meant * to be overwritten by the RPC layer. * It is up to the caller to free up the list and the blocks. */ -GSList * +pslist_t * kmsg_build_store(const void *token, size_t toklen, dht_value_t **vvec, int vcnt) { int i; - GSList *result = NULL; + pslist_t *result = NULL; pmsg_t *mb = NULL; int vheld = 0; pmsg_offset_t value_count = 0; @@ -1850,14 +1914,14 @@ g_assert(vvec); g_assert(size_is_non_negative(toklen)); g_assert(token == NULL || size_is_positive(toklen)); - g_assert(vcnt > 0 && vcnt <= MAX_INT_VAL(guint8)); + g_assert(vcnt > 0 && vcnt <= MAX_INT_VAL(uint8)); /* * Sort values by increasing size, so that we can stuff as many smaller * values as possible in the first messages. */ - qsort(vvec, vcnt, sizeof vvec0, dht_value_cmp); + vsort(vvec, vcnt, sizeof vvec0, dht_value_cmp); for (i = 0; i < vcnt; i++) { dht_value_t *v = vveci; @@ -1868,11 +1932,11 @@ */ if (mb && UNSIGNED(pmsg_available(mb)) < value_size) { - g_assert(vheld > 0 && vheld <= MAX_INT_VAL(guint8)); + g_assert(vheld > 0 && vheld <= MAX_INT_VAL(uint8)); store_finalize_pmsg(mb, vheld, value_count); - result = g_slist_prepend(result, mb); + result = pslist_prepend(result, mb); mb = NULL; vheld = 0; } @@ -1927,11 +1991,39 @@ */ g_assert(mb != NULL); - g_assert(vheld > 0 && vheld <= MAX_INT_VAL(guint8)); + g_assert(vheld > 0 && vheld <= MAX_INT_VAL(uint8)); store_finalize_pmsg(mb, vheld, value_count); - return g_slist_prepend(result, mb); + return pslist_prepend(result, mb); +} + +/** + * Check whether message origin is hostile. + * + * If it is an RPC reply (non-NULL MUID given), force a timeout when the + * origin if the message is now hostile (could have been dynamically set + * as hostile after the RPC was sent). + * + * @param n the source of the message + * @param kuid the advertised KUID of the node sending the message + * @param muid if non-NULL, the MUID of the RPC to cancel for hostile source + * + * @return TRUE if message is from an hostile source and must be ignored. + */ +static bool +kmsg_hostile_source(gnutella_node_t *n, const kuid_t *kuid, const guid_t *muid) +{ + if (node_hostile_udp(n)) { + knode_t *kn = dht_find_node(kuid); /* Is node in our routing table? */ + if (kn != NULL) + dht_remove_node(kn); + if (muid != NULL) + dht_rpc_timeout(muid); + return TRUE; + } + + return FALSE; } /** @@ -1939,9 +2031,11 @@ * * The Gnutella layer that comes before has validated that the message looked * like a valid Gnutella one (i.e. the Gnutella header size is consistent) - * and has already performed hostile address checks. Traffic accounting - * was also done, based on the message being a Gnutella one (in terms of - * header and payload). + * but has NOT performed hostile address checks (because we want to timeout + * RPCs early if we get any such messages on an RPC reply). + + * Traffic accounting was also done, based on the message being a Gnutella + * one (in terms of header and payload). * * Validation of the Kademlia message and its processing is now our problem. * @@ -1952,23 +2046,23 @@ * @param n the DHT Gnutella node, for some core function calls */ void kmsg_received( - gconstpointer data, size_t len, - host_addr_t addr, guint16 port, - struct gnutella_node *n) + const void *data, size_t len, + host_addr_t addr, uint16 port, + gnutella_node_t *n) { - const kademlia_header_t *header = deconstify_gpointer(data); + const kademlia_header_t *header = deconstify_pointer(data); char *reason; - guint8 major; - guint8 minor; + uint8 major, minor; knode_t *kn; host_addr_t kaddr; - guint16 kport; + uint16 kport; vendor_code_t vcode; - guint8 kmajor; - guint8 kminor; + uint8 kmajor, kminor; const kuid_t *id; - guint8 flags; - guint16 extended_length; + uint8 flags; + uint16 extended_length; + bool weird_header = FALSE; + bool rpc_reply = FALSE; g_assert(len >= GTA_HEADER_SIZE); /* Valid Gnutella packet at least */ g_assert(NODE_IS_DHT(n)); @@ -2009,7 +2103,7 @@ extended_length = kademlia_header_get_extended_length(header); - if (extended_length + (guint) KDA_HEADER_SIZE > len) { + if (extended_length + (uint) KDA_HEADER_SIZE > len) { reason = "invalid extended header length"; goto drop; } @@ -2045,46 +2139,96 @@ flags = kademlia_header_get_contact_flags(header); /* - * Check contact's address, if host not flagged as "firewalled". + * Update statistics. + */ + + gnet_stats_inc_general(GNR_DHT_MSG_RECEIVED); + + /* Do not check the port, it can be off for firewalled nodes */ + + if (host_addr_equiv(kaddr, addr)) + gnet_stats_inc_general(GNR_DHT_MSG_MATCHING_CONTACT_ADDRESS); + + /* + * Check contact's address on RPC replies. + * + * LimeWire nodes suffer from a bug whereby the contact is not + * firewalled but replies to RPC requests come back with an + * advertised address of 127.0.0.1. This is annoying but hopefully + * fixable, at the cost of extra processing. + * + * Given the remote host is echoing back our random RPC MUID, we can + * be confident that the contact information was valid if we get a + * matching reply, since the MUID cannot be otherwise guessed. */ - if (!(flags & KDA_MSG_F_FIREWALLED) && !host_is_valid(kaddr, kport)) { + { host_addr_t raddr; - guint16 rport; + uint16 rport; + const guid_t *muid = kademlia_header_get_muid(header); - /* - * LimeWire nodes suffer from a bug whereby the contact is not - * firewalled but replies to RPC requests come back with an - * advertised address of 127.0.0.1. This is annoying but hopefully - * fixable, at the cost of extra processing. - */ + if (dht_rpc_info(muid, &raddr, &rport)) { + gnet_stats_inc_general(GNR_DHT_RPC_REPLIES_RECEIVED); + + if (kmsg_hostile_source(n, id, muid)) { + gnet_stats_inc_general(GNR_DHT_MSG_FROM_HOSTILE_ADDRESS); + reason = "hostile UDP source on RPC reply"; + goto drop; + } + + rpc_reply = TRUE; + + if (kport == rport && host_addr_equiv(kaddr, raddr)) + goto hostile_checked; - if (dht_rpc_info(kademlia_header_get_muid(header), &raddr, &rport)) { if (GNET_PROPERTY(dht_debug)) { + bool matches = port == rport && host_addr_equiv(addr, raddr); g_warning("DHT fixing contact address for kuid=%s " - "to %s:%u on RPC reply (%s UDP info) in %s", + "to %s:%u on RPC reply (%s UDP info%s%s) in %s", kuid_to_hex_string(id), host_addr_to_string(raddr), rport, - host_addr_equal(addr, raddr) && port == rport ? - "matches" : "still different from", + matches ? "matches" : "still different from", + matches ? "" : " ", + matches ? "" : host_addr_port_to_string(addr, port), kmsg_infostr(data)); } + kaddr = raddr; kport = rport; + weird_header = TRUE; + gnet_stats_inc_general(GNR_DHT_RPC_REPLIES_FIXED_CONTACT); + + goto hostile_checked; /* Check done above */ } } /* + * Check UDP origin of message for known hostile sources. + */ + + if (kmsg_hostile_source(n, id, NULL)) { + gnet_stats_inc_general(GNR_DHT_MSG_FROM_HOSTILE_ADDRESS); + reason = "hostile UDP source"; + goto drop; + } + +hostile_checked: + + /* * Even if they are "firewalled", drop the message if contact address * is deemed hostile. There's no reason a good firewalled host would * pick this address to appear in the contact. */ - if (hostiles_check(kaddr)) { - if (GNET_PROPERTY(dht_debug)) - g_warning("DHT hostile contact address %s (%s v%u.%u)", + if (hostiles_is_bad(kaddr)) { + if (GNET_PROPERTY(dht_debug)) { + hostiles_flags_t hflags = hostiles_check(kaddr); + g_warning("DHT hostile contact address %s (%s v%u.%u): %s", host_addr_to_string(kaddr), - vendor_code_to_string(vcode.u32), kmajor, kminor); + vendor_code_to_string(vcode.u32), kmajor, kminor, + hostiles_flags_to_string(hflags)); + } + gnet_stats_inc_general(GNR_DHT_MSG_FROM_HOSTILE_CONTACT_ADDRESS); reason = "hostile contact address"; goto drop; } @@ -2104,16 +2248,18 @@ if ( !(flags & KDA_MSG_F_FIREWALLED) && - (!host_addr_equal(addr, kaddr) || port != kport) + (port != kport || !host_addr_equiv(addr, kaddr)) ) { if (GNET_PROPERTY(dht_debug)) { g_warning("DHT contact address is %s " - "but message came from %s (%s v%u.%u) kuid=%s", + "but %s came from %s (%s v%u.%u) kuid=%s", host_addr_port_to_string(kaddr, kport), + kmsg_name(kademlia_header_get_function(header)), host_addr_port_to_string2(addr, port), vendor_code_to_string(vcode.u32), kmajor, kminor, kuid_to_hex_string(id)); } + weird_header = TRUE; } /* @@ -2130,6 +2276,7 @@ kuid_to_hex_string(id)); } flags |= KDA_MSG_F_FIREWALLED; + weird_header = TRUE; } @@ -2142,7 +2289,19 @@ g_assert(kn == NULL || !(kn->flags & KNODE_F_FIREWALLED)); if (NULL == kn) { - gboolean patched = FALSE; + bool patched = FALSE; + + /* + * We do not have this KUID in our routing table. + * + * If we are not handling an RPC reply (where we already patched + * the address), see whether we know this node because we did a + * successful RPC exchange with it recently, and make sure we have + * the correct contact information. + */ + + if (!rpc_reply) + patched = dht_fix_kuid_contact(id, &kaddr, &kport, "incoming"); /* * If the node is not already in our routing table, but its advertised @@ -2155,8 +2314,9 @@ */ if ( + !patched && !(flags & KDA_MSG_F_FIREWALLED) && - (!host_is_valid(kaddr, kport) || !host_addr_equal(addr, kaddr)) + (!host_is_valid(kaddr, kport) || !host_addr_equiv(addr, kaddr)) ) { if (port == kport) { if (GNET_PROPERTY(dht_debug)) { @@ -2187,6 +2347,7 @@ } kaddr = addr; patched = TRUE; + weird_header = TRUE; } if (GNET_PROPERTY(dht_debug) > 2) @@ -2206,6 +2367,16 @@ dht_traffic_from(kn); } else { /* + * Node is already present in our routing table. + * + * If we got an RPC reply, mark it so that we know its contact + * information is valid. + */ + + if (rpc_reply) + kn->flags |= KNODE_F_RPC; + + /* * This here is again a workaround for LimeWire's bug: a good * non-firewalled host that is known in our routing table with a * proper address has to be identical to one bearing the same KUID @@ -2222,25 +2393,29 @@ host_is_valid(kn->addr, kn->port) && ( !host_is_valid(kaddr, kport) || - !host_addr_equal(addr, kaddr) + !host_addr_equiv(addr, kaddr) ) ) { if (GNET_PROPERTY(dht_debug)) { - g_warning("DHT fixing contact address for kuid=%s " - "to %s:%u based on routing table (%s UDP info) in %s", + bool matches = port == kport && + host_addr_equiv(addr, kn->addr); + g_warning("DHT fixing contact address for kuid=%s to %s:%u" + " based on routing table (%s UDP info%s%s) in %s", kuid_to_hex_string(id), host_addr_to_string(kn->addr), kn->port, - host_addr_equal(addr, kn->addr) && port == kport ? - "matches" : "still different from", + matches ? "matches" : "still different from", + matches ? "" : " ", + matches ? "" : host_addr_port_to_string(addr, port), kmsg_infostr(data)); } + weird_header = TRUE; kaddr = kn->addr; /* Port identical, as checked in test */ kn->flags |= KNODE_F_PCONTACT; /* To adapt creator later */ kn->flags &= ~KNODE_F_FOREIGN_IP; } else { kn->flags &= ~(KNODE_F_PCONTACT | KNODE_F_FOREIGN_IP); - if (!host_addr_equal(addr, kaddr)) { + if (!host_addr_equiv(addr, kaddr)) { if (GNET_PROPERTY(dht_debug)) { g_warning("DHT not fixing contact address %s " "(%s v%u.%u) kuid=%s but keeping " @@ -2253,6 +2428,7 @@ kmsg_infostr(data)); } kn->flags |= KNODE_F_FOREIGN_IP; + weird_header = TRUE; } } } @@ -2276,11 +2452,11 @@ if ( /* Node not firewalled, contact address changed */ (!(flags & KDA_MSG_F_FIREWALLED) && - (!host_addr_equal(kaddr, kn->addr) || kport != kn->port)) + (!host_addr_equiv(kaddr, kn->addr) || kport != kn->port)) || /* Node firewalled, source IP address changed */ ((flags & KDA_MSG_F_FIREWALLED) && - !host_addr_equal(kn->addr, addr)) + !host_addr_equiv(kn->addr, addr)) ) { if (GNET_PROPERTY(dht_debug)) g_debug("DHT new IP for %s (now at %s) -- %s verification", @@ -2295,7 +2471,7 @@ knode_t *new; new = knode_new(id, flags, kaddr, kport, vcode, kmajor, kminor); - dht_verify_node(kn, new); + dht_verify_node(kn, new, TRUE); kn = new; /* Speaking to new node for now */ } } else { @@ -2346,13 +2522,42 @@ host_addr_port_to_string(kaddr, kport), host_addr_to_string(addr), port); + /* kaddr and kport not changed since this does not count as a fixup */ + kn->addr = addr; kn->port = port; kn->flags |= KNODE_F_PCONTACT; + weird_header = TRUE; } + /* + * Update contact fixup stats. + */ + + if ( + kport != kademlia_header_get_contact_port(header) || + !host_addr_equiv(kaddr, + host_addr_get_ipv4(kademlia_header_get_contact_addr(header))) + ) + gnet_stats_inc_general(GNR_DHT_MSG_FIXED_CONTACT_ADDRESS); + + /* + * Log weird headers when debugging. + */ + + if ( + weird_header && + GNET_PROPERTY(dht_debug) && GNET_PROPERTY(log_weird_dht_headers) + ) { + dump_hex(stderr, "DHT Header", data, extended_length + KDA_HEADER_SIZE); + } + + /* + * Handle the message. + */ + kmsg_handle(kn, n, header, extended_length, - ptr_add_offset(header, extended_length + KDA_HEADER_SIZE), + const_ptr_add_offset(header, extended_length + KDA_HEADER_SIZE), len - KDA_HEADER_SIZE - extended_length); knode_free(kn); /* Will free only if not still referenced */ @@ -2361,11 +2566,12 @@ drop: if (GNET_PROPERTY(dht_debug)) { - g_warning("DHT got invalid Kademlia packet (%zu bytes) " + g_warning("DHT got invalid %sKademlia packet (%zu bytes) " "\"%s\" from UDP (%s): %s", + node_udp_is_old(n) ? "OLD " : "", len, gmsg_infostr_full(data, len), host_addr_port_to_string(addr, port), reason); - if (len) + if (len && GNET_PROPERTY(dht_debug) > 10) dump_hex(stderr, "UDP datagram", data, len); } } @@ -2388,11 +2594,11 @@ * Find message description based on function. */ static const struct kmsg * -kmsg_find(guint8 function) +kmsg_find(uint8 function) { const struct kmsg *km; - if (function == 0 || function >= G_N_ELEMENTS(kmsg_map)) + if (function == 0 || function >= N_ITEMS(kmsg_map)) return NULL; km = &kmsg_mapfunction; @@ -2406,9 +2612,9 @@ * Convert message function number into name. */ const char * -kmsg_name(guint function) +kmsg_name(uint function) { - if (function >= G_N_ELEMENTS(kmsg_map)) + if (function >= N_ITEMS(kmsg_map)) return "invalid"; return kmsg_mapfunction.name; @@ -2419,10 +2625,10 @@ * string and returns the amount of bytes written. */ size_t -kmsg_infostr_to_buf(gconstpointer msg, char *buf, size_t buf_size) +kmsg_infostr_to_buf(const void *msg, char *buf, size_t buf_size) { - guint size = kmsg_size(msg); - guint16 extlen = kademlia_header_get_extended_length(msg); + uint size = kmsg_size(msg); + uint16 extlen = kademlia_header_get_extended_length(msg); char hostHOST_ADDR_PORT_BUFLEN; char extUINT32_DEC_BUFLEN + 4; /* +1 for NUL, +3 for "(+)" */ @@ -2432,14 +2638,14 @@ host, sizeof host); if (extlen != 0) { - gm_snprintf(ext, sizeof ext, "(+%u)", extlen); + str_bprintf(ext, sizeof ext, "(+%u)", extlen); } else { ext0 = '\0'; } - return gm_snprintf(buf, buf_size, "%s%s (%u byte%s) %s v%u.%u @%s", + return str_bprintf(buf, buf_size, "%s%s (%u byte%s) %s v%u.%u @%s", kmsg_name(kademlia_header_get_function(msg)), - ext, size, size == 1 ? "" : "s", + ext, size, plural(size), vendor_code_to_string(kademlia_header_get_contact_vendor(msg)), kademlia_header_get_major_version(msg), kademlia_header_get_minor_version(msg), @@ -2458,7 +2664,7 @@ * size of that extension. */ const char * -kmsg_infostr(gconstpointer msg) +kmsg_infostr(const void *msg) { static char buf80; kmsg_infostr_to_buf(msg, buf, sizeof buf); @@ -2468,7 +2674,7 @@ /** * Initialize Kademlia messages. */ -G_GNUC_COLD void +void G_COLD kmsg_init(void) { size_t i; @@ -2476,7 +2682,7 @@ g_assert(NULL == kmsg_aging_pings); g_assert(NULL == kmsg_aging_finds); - for (i = 0; i < G_N_ELEMENTS(kmsg_map); i++) { + for (i = 0; i < N_ITEMS(kmsg_map); i++) { const struct kmsg *entry = &kmsg_mapi; g_assert(entry->function == i);
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/kmsg.h -> gtk-gnutella-1.1.9.tar.bz2/src/dht/kmsg.h
Changed
@@ -55,13 +55,13 @@ void kmsg_send_ping(knode_t *kn, const guid_t *muid); void kmsg_send_find_node(knode_t *kn, const kuid_t *id, const guid_t *muid, - pmsg_free_t mfree, gpointer marg); + pmsg_free_t mfree, void *marg); void kmsg_send_find_value(knode_t *kn, const kuid_t *id, dht_value_type_t type, kuid_t **skeys, int scnt, - const guid_t *muid, pmsg_free_t mfree, gpointer marg); -GSList *kmsg_build_store( + const guid_t *muid, pmsg_free_t mfree, void *marg); +struct pslist *kmsg_build_store( const void *token, size_t toklen, dht_value_t **vvec, int vcnt); - + void kmsg_send_mb(knode_t *kn, pmsg_t *mb); void kmsg_serialize_contact(pmsg_t *mb, const knode_t *kn);
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/knode.c -> gtk-gnutella-1.1.9.tar.bz2/src/dht/knode.c
Changed
@@ -46,17 +46,18 @@ #include "core/hostiles.h" #include "lib/atoms.h" -#include "lib/glib-missing.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/vendors.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ /** * Hashing of knodes, */ unsigned int -knode_hash(gconstpointer key) +knode_hash(const void *key) { const knode_t *kn = key; @@ -69,7 +70,7 @@ * Equality of knodes. */ int -knode_eq(gconstpointer a, gconstpointer b) +knode_eq(const void *a, const void *b) { const knode_t *k1 = a; const knode_t *k2 = b; @@ -84,7 +85,7 @@ * Comparison of two knodes based on the last_seen time. */ int -knode_seen_cmp(gconstpointer a, gconstpointer b) +knode_seen_cmp(const void *a, const void *b) { const knode_t *k1 = a; const knode_t *k2 = b; @@ -99,7 +100,7 @@ * Comparison of two knodes based on their probability of being dead. */ int -knode_dead_probability_cmp(gconstpointer a, gconstpointer b) +knode_dead_probability_cmp(const void *a, const void *b) { const knode_t *k1 = a; const knode_t *k2 = b; @@ -125,14 +126,11 @@ */ d = delta_time(k1->first_seen, k2->first_seen); - if (0 == d) { - d = delta_time(k1->last_seen, k2->last_seen); - return 0 == d ? 0 : d > 0 ? -1 : +1; - } else { - return d > 0 ? +1 : -1; - } + if G_UNLIKELY(0 == d) + d = delta_time(k2->last_seen, k1->last_seen); /* Inversed! */ + return CMP(d, 0); } else { - return p2 > p1 ? +1 : -1; + return CMP(p2, p1); } } @@ -152,9 +150,9 @@ */ knode_t * knode_new( - const kuid_t *id, guint8 flags, - host_addr_t addr, guint16 port, vendor_code_t vcode, - guint8 major, guint8 minor) + const kuid_t *id, uint8 flags, + host_addr_t addr, uint16 port, vendor_code_t vcode, + uint8 major, uint8 minor) { knode_t *kn; @@ -180,10 +178,30 @@ } /** + * Clone a Kademlia node. + * + * @return new node with a reference count of 1, in the "unknown" status. + */ +knode_t * +knode_clone(const knode_t *kn) +{ + knode_t *cn; + + WALLOC(cn); + *cn = *kn; /* Struct copy */ + cn->status = KNODE_UNKNOWN; /* This instance is not in routing table */ + cn->refcnt = 1; /* New instance */ + cn->id = kuid_get_atom(kn->id); /* Increase reference count */ + cn->rpc_pending = 0; + + return cn; +} + +/** * Can the node which timed-out in the past be considered again as the * target of an RPC, and therefore returned in k-closest lookups? */ -gboolean +bool knode_can_recontact(const knode_t *kn) { time_t grace; @@ -203,7 +221,7 @@ /** * Give a string representation of the node status. */ -const gchar * +const char * knode_status_to_string(knode_status_t status) { switch (status) { @@ -248,7 +266,7 @@ * Change node's version */ void -knode_change_version(knode_t *kn, guint8 major, guint8 minor) +knode_change_version(knode_t *kn, uint8 major, uint8 minor) { knode_check(kn); @@ -265,7 +283,7 @@ /** * @return whether host can be kept as a valid contact */ -gboolean +bool knode_is_usable(const knode_t *kn) { knode_check(kn); @@ -273,7 +291,7 @@ if (!host_is_valid(kn->addr, kn->port)) return FALSE; - if (hostiles_check(kn->addr)) + if (hostiles_is_bad(kn->addr)) return FALSE; return TRUE; @@ -282,7 +300,7 @@ /** * @return whether host's address is a valid DHT value creator. */ -gboolean +bool knode_addr_is_usable(const knode_t *kn) { knode_check(kn); @@ -290,7 +308,7 @@ if (!host_address_is_usable(kn->addr)) return FALSE; - if (hostiles_check(kn->addr)) + if (hostiles_is_bad(kn->addr)) return FALSE; return TRUE; @@ -312,20 +330,20 @@ * * @return the buffer where printing was done. */ -const gchar * +const char * knode_to_string_buf(const knode_t *kn, char buf, size_t len) { char host_bufHOST_ADDR_PORT_BUFLEN; char vc_bufVENDOR_CODE_BUFLEN; - gchar kuid_bufKUID_HEX_BUFLEN; + char kuid_bufKUID_HEX_BUFLEN; knode_check(kn); bin_to_hex_buf(kn->id, KUID_RAW_SIZE, kuid_buf, sizeof kuid_buf); host_addr_port_to_string_buf(kn->addr, kn->port, host_buf, sizeof host_buf); vendor_code_to_string_buf(kn->vcode.u32, vc_buf, sizeof vc_buf); - gm_snprintf(buf, len, - "%s%s%s (%s v%u.%u) %s \"%s\", ref=%d%s%s%s %s", + str_bprintf(buf, len, + "%s%s%s (%s v%u.%u) %s \"%s\", ref=%d%s%s%s%s %s", host_buf, (kn->flags & KNODE_F_PCONTACT) ? "*" : "", (kn->flags & KNODE_F_FOREIGN_IP) ? "?" : "", @@ -334,6 +352,7 @@ (kn->status != KNODE_UNKNOWN && !(kn->flags & KNODE_F_ALIVE)) ? " zombie" : "", (kn->flags & KNODE_F_CACHED) ? " cached" : "", + (kn->flags & KNODE_F_RPC) ? " RPC" : "", (kn->flags & KNODE_F_FIREWALLED) ? " fw" : "", compact_time(delta_time(tm_time(), kn->first_seen))); @@ -344,7 +363,7 @@ * Pretty-printing of node information for logs. * @return pointer to static data */ -const gchar * +const char * knode_to_string(const knode_t *kn) { static char buf120; @@ -356,7 +375,7 @@ * Second version of knode_to_string() when two different nodes need to be * pretty-printed in the same statement. */ -const gchar * +const char * knode_to_string2(const knode_t *kn) { static char buf120; @@ -412,7 +431,7 @@ * PATRICIA iterator callback to free Kademlia nodes */ void -knode_patricia_free(gpointer key, size_t u_kbits, gpointer value, gpointer u_d) +knode_patricia_free(void *key, size_t u_kbits, void *value, void *u_d) { knode_t *kn = value; @@ -429,7 +448,7 @@ * Map iterator callback to free Kademlia nodes */ void -knode_map_free(gpointer key, gpointer value, gpointer unused_u) +knode_map_free(void *key, void *value, void *unused_u) { knode_t *kn = value; @@ -449,7 +468,7 @@ knode_still_alive_probability(const knode_t *kn) { double p; - static gboolean inited; + static bool inited; static double decimationKNODE_MAX_TIMEOUTS; knode_check(kn); @@ -457,7 +476,7 @@ if (G_UNLIKELY(!inited)) { size_t i; - for (i = 0; i < G_N_ELEMENTS(decimation); i++) { + for (i = 0; i < N_ITEMS(decimation); i++) { decimationi = pow(KNODE_ALIVE_DECIMATION, (double) (i + 1)); } @@ -477,7 +496,7 @@ if (0 == kn->rpc_timeouts) return p; else { - size_t i = MIN(kn->rpc_timeouts, G_N_ELEMENTS(decimation)) - 1; + size_t i = MIN(kn->rpc_timeouts, N_ITEMS(decimation)) - 1; return p * decimationi; } }
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/knode.h -> gtk-gnutella-1.1.9.tar.bz2/src/dht/knode.h
Changed
@@ -45,14 +45,15 @@ */ knode_t *knode_new( - const kuid_t *id, guint8 flags, - host_addr_t addr, guint16 port, vendor_code_t vcode, - guint8 major, guint8 minor); + const kuid_t *id, uint8 flags, + host_addr_t addr, uint16 port, vendor_code_t vcode, + uint8 major, uint8 minor); +knode_t *knode_clone(const knode_t *kn); void knode_change_vendor(knode_t *kn, vendor_code_t vcode); -void knode_change_version(knode_t *kn, guint8 major, guint8 minor); -gboolean knode_can_recontact(const knode_t *kn); -gboolean knode_is_usable(const knode_t *kn); -gboolean knode_addr_is_usable(const knode_t *kn); +void knode_change_version(knode_t *kn, uint8 major, uint8 minor); +bool knode_can_recontact(const knode_t *kn); +bool knode_is_usable(const knode_t *kn); +bool knode_addr_is_usable(const knode_t *kn); double knode_still_alive_probability(const knode_t *kn); #endif /* _dht_knode_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/kuid.c -> gtk-gnutella-1.1.9.tar.bz2/src/dht/kuid.c
Changed
@@ -39,7 +39,7 @@ #include "lib/atoms.h" #include "lib/endian.h" -#include "lib/entropy.h" +#include "lib/hashing.h" #include "lib/misc.h" /* For bitcmp() */ #include "lib/random.h" #include "lib/override.h" /* Must be the last header included */ @@ -50,41 +50,20 @@ void kuid_random_fill(kuid_t *kuid) { - struct sha1 entropy; - /* - * Entropy collection is slow but we generate our KUID only at startup - * and when none was present (nodes reuse their KUID from session to - * session to reuse as much of their previous routing table as possible). - * * The aim is to obtain the most random KUID to ensure that among all * the peers in the Kademlia network, KUIDs are unique and uniformly * distributed in the KUID space. */ - entropy_collect(&entropy); /* slow */ - random_bytes(kuid->v, KUID_RAW_SIZE); - - /* - * Combine the two random numbers by adding them. - * - * It's slightly better than XOR-ing the two since the propagation - * of the carry bit diffuses the randomness (entropy remains the same). - * - * The cast below is safe due to C's structural equivalence between the - * sha1 and kuid structures, guaranteed by the static assertion. - */ - - STATIC_ASSERT(SHA1_RAW_SIZE == KUID_RAW_SIZE); - - (void) kuid_add(kuid, (kuid_t *) &entropy); + random_key_bytes(kuid, KUID_RAW_SIZE); } /** * Copy KUID from memory buffer into kuid_t object. */ void -kuid_from_buf(kuid_t *dest, const gchar *id) +kuid_from_buf(kuid_t *dest, const char *id) { memcpy(dest, id, KUID_RAW_SIZE); } @@ -92,7 +71,7 @@ /** * Test whether KUID is blank. */ -gboolean +bool kuid_is_blank(const kuid_t *kuid) { size_t i; @@ -124,8 +103,8 @@ int i; for (i = 0; i < KUID_RAW_SIZE; i++) { - guint d1 = kuid1->vi ^ target->vi; - guint d2 = kuid2->vi ^ target->vi; + uint d1 = kuid1->vi ^ target->vi; + uint d2 = kuid2->vi ^ target->vi; if (d1 < d2) return -1; @@ -148,8 +127,8 @@ int i; for (i = 0; i < KUID_RAW_SIZE; i++) { - guint b1 = k1->vi; - guint b2 = k2->vi; + uint b1 = k1->vi; + uint b2 = k2->vi; if (b1 < b2) return -1; @@ -185,7 +164,7 @@ /** * Are two KUID identical? */ -gboolean +bool kuid_eq(const void *k1, const void *k2) { return k1 == k2 || 0 == memcmp(k1, k2, KUID_RAW_SIZE); @@ -194,7 +173,7 @@ /** * See if the n first bits of two KUID prefixes match. */ -gboolean +bool kuid_match_nth(const kuid_t *k1, const kuid_t *k2, int bits) { return 0 == bitcmp(k1->v, k2->v, bits); @@ -227,7 +206,7 @@ if (bits >= 8) { dest->vi = prefix->vi; } else { - guchar mask = ~((1 << (8 - bits)) - 1) & 0xff; + uchar mask = ~((1 << (8 - bits)) - 1) & 0xff; dest->vi = (prefix->vi & mask) | (dest->vi & ~mask); } } @@ -240,7 +219,7 @@ kuid_flip_nth_leading_bit(kuid_t *res, int n) { int byt; - guchar mask; + uchar mask; g_assert(n >=0 && n < KUID_RAW_BITSIZE); @@ -260,12 +239,12 @@ * * @return pointer to static data. */ -const gchar * +const char * kuid_to_string(const kuid_t *kuid) { - static gchar bufSHA1_BASE32_SIZE + 1; + static char bufSHA1_BASE32_SIZE + 1; - return sha1_to_base32_buf(cast_to_gconstpointer(&kuid->v), buf, sizeof buf); + return sha1_to_base32_buf(cast_to_constpointer(&kuid->v), buf, sizeof buf); } /** @@ -273,10 +252,10 @@ * * @return pointer to static data. */ -const gchar * +const char * kuid_to_hex_string(const kuid_t *kuid) { - static gchar bufKUID_HEX_BUFLEN; + static char bufKUID_HEX_BUFLEN; bin_to_hex_buf(kuid, KUID_RAW_SIZE, buf, sizeof buf); @@ -288,36 +267,16 @@ * * @return pointer to static data. */ -const gchar * +const char * kuid_to_hex_string2(const kuid_t *kuid) { - static gchar bufKUID_HEX_BUFLEN; + static char bufKUID_HEX_BUFLEN; bin_to_hex_buf(kuid, KUID_RAW_SIZE, buf, sizeof buf); return buf; } -/*** - *** Wrappers for KUID atoms. - ***/ - -kuid_t * -kuid_get_atom(const kuid_t *id) -{ - return (kuid_t *) atom_sha1_get((const struct sha1 *) id); -} - -void -kuid_atom_free(const kuid_t *k) -{ - atom_sha1_free((const struct sha1 *) k); -} - -/*** - *** Basic integer arithmetic on KUIDs, viewed as 160-bit unsigned integers. - ***/ - /** * Zero the KUID. */ @@ -327,324 +286,20 @@ ZERO(&res->v); } -/** - * Set 32-bit quantity in the KUID. - */ -void -kuid_set32(kuid_t *res, guint32 val) -{ - STATIC_ASSERT(KUID_RAW_SIZE >= 4); - - kuid_zero(res); - poke_be32(&res->vKUID_RAW_SIZE - 4, val); -} - -/** - * Set 64-bit quantity in the KUID. - */ -void -kuid_set64(kuid_t *res, guint64 val) -{ - STATIC_ASSERT(KUID_RAW_SIZE >= 8); - - kuid_zero(res); - poke_be64(&res->vKUID_RAW_SIZE - 8, val); -} - -/** - * Set the nth bit in the KUID to 1 (n = 0 .. 159). - * The lowest bit is 0, at the rightmost part of the KUID. - */ -void -kuid_set_nth_bit(kuid_t *res, int n) -{ - int byt; - guchar mask; - - g_assert(n >=0 && n < KUID_RAW_BITSIZE); - - byt = KUID_RAW_SIZE - (n / 8) - 1; - mask = 1 << (n % 8); - - g_assert(byt >= 0 && byt < KUID_RAW_SIZE); - - res->vbyt |= mask; -} - -/** - * Is KUID positive, considering 2-complement arithmetic? - */ -static gboolean -kuid_is_positive(const kuid_t *k) -{ - return 0 == (k->v0 & 0x80) ? TRUE : FALSE; -} - -/** - * Negate KUID, using 2-complement arithmetic. - */ -static void -kuid_negate(kuid_t *k) -{ - int i; - gboolean carry; - - /* - * Add 1 to ~k. - */ - - for (carry = TRUE, i = KUID_RAW_SIZE - 1; i >= 0; i--) { - guint32 sum; - - sum = (~k->vi & 0xff) + (carry ? 1 : 0); - carry = sum >= 0x100; - k->vi = sum & 0xff; - } -} - -/** - * Flip all the bits of the KUID. - */ -void -kuid_not(kuid_t *k) -{ - int i; - - for (i = 0; i < KUID_RAW_SIZE; i++) { - k->vi = (~k->vi & 0xff); - } -} - -/** - * Add second KUID to the first, and return whether there was a leading - * carry bit. - */ -gboolean -kuid_add(kuid_t *res, const kuid_t *other) -{ - int i; - gboolean carry; - - for (carry = FALSE, i = KUID_RAW_SIZE - 1; i >= 0; i--) { - guint32 sum; - - sum = res->vi + other->vi + (carry ? 1 : 0); - carry = sum >= 0x100; - res->vi = sum & 0xff; - } - - return carry; -} - -/** - * Add small quantity to the KUID, in place, and return whether there was - * a leading carry bit. - */ -gboolean -kuid_add_u8(kuid_t *k, guint8 l) -{ - int i; - gboolean carry; - guint32 sum; - - STATIC_ASSERT(KUID_RAW_SIZE >= 2); - - sum = k->vKUID_RAW_SIZE - 1 + l; - carry = sum >= 0x100; - k->vKUID_RAW_SIZE - 1 = sum & 0xff; - - for (i = KUID_RAW_SIZE - 2; i >= 0; i--) { - sum = k->vi + (carry ? 1 : 0); - carry = sum >= 0x100; - k->vi = sum & 0xff; - } - - return carry; -} - -/** - * Left shift KUID in place by 1 bit. - * Return whether there was a leading carry. - */ -gboolean -kuid_lshift(kuid_t *res) -{ - int i; - gboolean carry; - - for (carry = FALSE, i = KUID_RAW_SIZE - 1; i >= 0; i--) { - guint32 accum; - - accum = res->vi; - accum <<= 1; - if (carry) - accum |= 0x1; - - carry = (accum & 0x100) == 0x100; - res->vi = accum & 0xff; - } - - return carry; -} - -/** - * Right shift KUID in place by 1 bit. - */ -void -kuid_rshift(kuid_t *res) -{ - int i; - gboolean carry; - - for (carry = FALSE, i = 0; i < KUID_RAW_SIZE; i++) { - guint32 accum; - - accum = res->vi; - if (carry) - accum |= 0x100; - - carry = (accum & 0x1) == 0x1; - res->vi = accum >> 1; - } -} +/*** + *** Wrappers for KUID atoms. + ***/ -/** - * Multiply KUID by 8-bit lambda constant, in-place. - * - * @return leading carry byte (if not zero, we overflowed). - */ -guint8 -kuid_mult_u8(kuid_t *res, guint8 l) +kuid_t * +kuid_get_atom(const kuid_t *id) { - int i; - guint8 carry; - - for (carry = 0, i = KUID_RAW_SIZE - 1; i >= 0; i--) { - guint16 accum; - - accum = res->vi * l + carry; - carry = (accum & 0xff00) >> 8; - res->vi = accum & 0xff; - } - - return carry; + return (kuid_t *) atom_sha1_get((const struct sha1 *) id); } -/** - * Divide k1 by k2, filling q with quotient and r with remainder. - */ void -kuid_divide(const kuid_t *k1, const kuid_t *k2, kuid_t *q, kuid_t *r) -{ - int cmp; - int i; - kuid_t nk2; - - g_assert(k1 != NULL); - g_assert(k2 != NULL); - g_assert(q != NULL); - g_assert(r != NULL); - - /* - * First the trivial checks. - */ - - cmp = kuid_cmp(k1, k2); - - if (cmp < 0) { - kuid_copy(r, k1); /* r = k1 */ - kuid_zero(q); /* q = 0 */ - return; - } else if (0 == cmp) { - kuid_zero(r); /* r = 0 */ - kuid_zero(q); - kuid_set_nth_bit(q, 0); /* q = 1 */ - return; - } - - g_assert(cmp > 0); - - /* - * The algorithm retained for doing the binary division is known as - * the "shift, test and restore" algorithm. In an n-bit integer space, - * it can be described as follows: - * - * Consider the double-width register RQ as being one single 2n-bit - * register made by concatenating R and Q together. (a reminder of - * the "BC" register in the good old Z80...): - * - * R = 0 - * Q = dividend. - * - * For i = 1 to n do - * { - * RQ <<= 1 - * R -= divisor - * If R >= 0 { - * Q |= 1 - * } else { - * R += divisor - * } - * } - * - * At the end, Q has the quotient and R has the remainder. - */ - - kuid_zero(r); /* R = 0 */ - kuid_copy(q, k1); /* Q = k1 */ - - kuid_copy(&nk2, k2); - kuid_negate(&nk2); /* nk2 = -k2 */ - - for (i = 0; i < KUID_RAW_BITSIZE; i++) { - gboolean carry; - kuid_t saved; - - /* RQ <<= 1 */ - carry = kuid_lshift(q); - kuid_lshift(r); - if (carry) - kuid_set_nth_bit(r, 0); - - /* R -= divisor */ - kuid_copy(&saved, r); - kuid_add(r, &nk2); - - if (kuid_is_positive(r)) /* If R >= 0 */ - kuid_set_nth_bit(q, 0); /* Q |= 1 */ - else /* Else */ - kuid_copy(r, &saved); /* R += divisor */ - } -} - -/** - * Convert KUID interpreted as a big-endian number into floating point. - */ -double -kuid_to_double(const kuid_t *value) -{ - int i; - double v = 0.0; - double p; - - for (i = KUID_RAW_SIZE - 4, p = 0.0; i >= 0; i -= 4, p += 32.0) { - guint32 m = peek_be32(&value->vi); - if (m != 0) - v += m * pow(2.0, p); - } - - return v; -} - -/** - * Convert KUID to 64-bit integer, truncating it if larger. - */ -guint64 -kuid_to_guint64(const kuid_t *value) +kuid_atom_free(const kuid_t *k) { - STATIC_ASSERT(KUID_RAW_SIZE >= 8); - - return peek_be64(&value->vKUID_RAW_SIZE - 8); + atom_sha1_free((const struct sha1 *) k); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/kuid.h -> gtk-gnutella-1.1.9.tar.bz2/src/dht/kuid.h
Changed
@@ -41,36 +41,23 @@ */ void kuid_random_fill(kuid_t *kuid); -void kuid_from_buf(kuid_t *dest, const gchar *id); -gboolean kuid_is_blank(const kuid_t *kuid) G_GNUC_PURE; +void kuid_from_buf(kuid_t *dest, const char *id); +bool kuid_is_blank(const kuid_t *kuid) G_PURE; int kuid_cmp3(const kuid_t *target, const kuid_t *kuid1, const kuid_t *kuid2) - G_GNUC_PURE; -int kuid_cmp(const kuid_t *kuid1, const kuid_t *kuid2) G_GNUC_PURE; + G_PURE; +int kuid_cmp(const kuid_t *kuid1, const kuid_t *kuid2) G_PURE; void kuid_xor_distance(kuid_t *res, const kuid_t *k1, const kuid_t *k2); -gboolean kuid_match_nth(const kuid_t *k1, const kuid_t *k2, int bits) - G_GNUC_PURE; -size_t kuid_common_prefix(const kuid_t *k1, const kuid_t *k2) G_GNUC_PURE; +bool kuid_match_nth(const kuid_t *k1, const kuid_t *k2, int bits) + G_PURE; +size_t kuid_common_prefix(const kuid_t *k1, const kuid_t *k2) G_PURE; void kuid_random_within(kuid_t *dest, const kuid_t *prefix, int bits); void kuid_flip_nth_leading_bit(kuid_t *res, int n); - void kuid_zero(kuid_t *res); -void kuid_not(kuid_t *k); -void kuid_set32(kuid_t *res, guint32 val); -void kuid_set64(kuid_t *res, guint64 val); -void kuid_set_nth_bit(kuid_t *res, int n); -gboolean kuid_add(kuid_t *res, const kuid_t *other); -gboolean kuid_add_u8(kuid_t *k, guint8 l); -gboolean kuid_lshift(kuid_t *res); -void kuid_rshift(kuid_t *res); -guint8 kuid_mult_u8(kuid_t *res, guint8 l); -void kuid_divide(const kuid_t *k1, const kuid_t *k2, kuid_t *q, kuid_t *r); -double kuid_to_double(const kuid_t *value); -guint64 kuid_to_guint64(const kuid_t *value); /** * Return leading KUID byte. */ -static inline guint8 +static inline uint8 kuid_leading_u8(const kuid_t *k) { return k->v0;
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/lookup.c -> gtk-gnutella-1.1.9.tar.bz2/src/dht/lookup.c
Changed
@@ -36,17 +36,18 @@ #include <math.h> /* For log() */ #include "lookup.h" + #include "acct.h" -#include "kuid.h" +#include "keys.h" #include "kmsg.h" +#include "kuid.h" +#include "publish.h" +#include "revent.h" #include "roots.h" #include "routing.h" #include "rpc.h" -#include "keys.h" -#include "token.h" -#include "revent.h" -#include "publish.h" #include "tcache.h" +#include "token.h" #include "if/dht/kademlia.h" #include "if/gnet_property_priv.h" @@ -57,17 +58,23 @@ #include "lib/cq.h" #include "lib/hashlist.h" #include "lib/host_addr.h" -#include "lib/glib-missing.h" +#include "lib/htable.h" #include "lib/map.h" #include "lib/nid.h" #include "lib/patricia.h" +#include "lib/plist.h" #include "lib/pmsg.h" +#include "lib/pslist.h" #include "lib/random.h" #include "lib/sectoken.h" +#include "lib/str.h" +#include "lib/stringify.h" #include "lib/tm.h" #include "lib/unsigned.h" #include "lib/vendors.h" +#include "lib/vsort.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ #define NL_MAX_LIFETIME 120000 /* 2 minutes, in ms */ @@ -93,7 +100,7 @@ */ #define NL_KBALL_PROBA 0.90 #define NL_KBALL_FACTOR 100000 - + static unsigned kball_dist_probaKUID_RAW_BITSIZE; /** @@ -114,12 +121,12 @@ * Table keeping track of all the node lookup objects that we have created * and which are still running. */ -static GHashTable *nlookups; +static htable_t *nlookups; static void lookup_iterate(nlookup_t *nl); -static void lookup_value_free(nlookup_t *nl, gboolean free_vvec); +static void lookup_value_free(nlookup_t *nl, bool free_vvec); static void lookup_value_iterate(nlookup_t *nl); -static void lookup_value_expired(cqueue_t *unused_cq, gpointer obj); +static void lookup_value_expired(cqueue_t *cq, void *obj); static void lookup_value_delay(nlookup_t *nl); static void lookup_requery(nlookup_t *nl, const knode_t *kn); @@ -161,7 +168,7 @@ struct fvalue { dht_value_t **vvec; /**< Read expanded DHT values */ cevent_t *delay_ev; /**< Delay event for retries */ - GSList *seckeys; /**< List of "struct seckeys *" */ + pslist_t *seckeys; /**< List of "struct seckeys *" */ map_t *seen; /**< Publisher KUID => closest KUID holding */ map_t *values; /**< All DHT values, to avoid duplicates */ float load; /**< Reported request load on key (summed) */ @@ -190,7 +197,7 @@ patricia_t *ball; /**< The k-closest nodes we've found so far */ cevent_t *expire_ev; /**< Global expiration event for lookup */ cevent_t *delay_ev; /**< Delay event for retries */ - GHashTable *c_class; /**< Counts class-C networks in path */ + acct_net_t *c_class; /**< Counts class-C networks in path */ union { struct { lookup_cb_ok_t ok; /**< OK callback for "find node" */ @@ -205,7 +212,7 @@ } u; lookup_cb_err_t err; /**< Error callback */ lookup_cb_stats_t stats; /**< Statistics callback */ - gpointer arg; /**< Common callback opaque argument */ + void *arg; /**< Common callback opaque argument */ struct nid lid; /**< Lookup ID (unique to this object) */ lookup_type_t type; /**< Type of lookup (NODE or VALUE) */ enum parallelism mode; /**< Parallelism mode */ @@ -224,8 +231,8 @@ int bw_incoming; /**< Amount of incoming bandwidth used */ int udp_drops; /**< Amount of UDP packet drops */ tm_t start; /**< Start time */ - guint32 hops; /**< Amount of hops in lookup so far */ - guint32 flags; /**< Operating flags */ + uint32 hops; /**< Amount of hops in lookup so far */ + uint32 flags; /**< Operating flags */ /* * XXX -- hack alert! * @@ -275,7 +282,7 @@ * This is the mode a value lookup enters when it gets results with secondary * keys, or not all the pending RPCs have replied yet. */ -static inline gboolean +static inline bool lookup_is_fetching(const nlookup_t *nl) { return LOOKUP_VALUE == nl->type && NULL != nl->u.fv.fv; @@ -352,7 +359,7 @@ case LOOKUP_REFRESH: what = "refresh"; break; case LOOKUP_TOKEN: what = "token"; break; case LOOKUP_VALUE: - gm_snprintf(buf, sizeof buf, "\"%s\" value", + str_bprintf(buf, sizeof buf, "\"%s\" value", dht_value_type_to_string(nl->u.fv.vtype)); return buf; } @@ -381,7 +388,7 @@ * Free a lookup token. */ static void -lookup_token_free(lookup_token_t *ltok, gboolean freedata) +lookup_token_free(lookup_token_t *ltok, bool freedata) { sectoken_remote_free(ltok->token, freedata); WFREE(ltok); @@ -391,7 +398,7 @@ * Map iterator callback to free lookup tokens. */ static void -free_token(gpointer unused_key, gpointer value, gpointer unused_u) +free_token(void *unused_key, void *value, void *unused_u) { lookup_token_t *ltok = value; @@ -408,7 +415,7 @@ lookup_free(nlookup_t *nl) { lookup_check(nl); - + if (lookup_is_fetching(nl)) lookup_value_free(nl, TRUE); @@ -435,10 +442,10 @@ map_destroy(nl->fixed); patricia_destroy(nl->path); patricia_destroy(nl->ball); - acct_net_free(&nl->c_class); + acct_net_free_null(&nl->c_class); if (!(nl->flags & NL_F_DONT_REMOVE)) - g_hash_table_remove(nlookups, &nl->lid); + htable_remove(nlookups, &nl->lid); nl->magic = 0; WFREE(nl); @@ -450,7 +457,7 @@ * may come back after the lookup was terminated... * @return NULL if the lookup ID is unknown, otherwise the lookup object. */ -static gpointer +static void * lookup_is_alive(struct nid lid) { nlookup_t *nl; @@ -458,7 +465,7 @@ if (NULL == nlookups) return NULL; - nl = g_hash_table_lookup(nlookups, &lid); + nl = htable_lookup(nlookups, &lid); if (nl) lookup_check(nl); @@ -483,7 +490,7 @@ rs->magic = LOOKUP_RESULT_MAGIC; rs->refcnt = 1; len = patricia_count(nl->path); - rs->path = walloc(len * sizeof(lookup_rc_t)); + WALLOC_ARRAY(rs->path, len); rs->path_len = len; iter = patricia_metric_iterator_lazy(nl->path, nl->kuid, TRUE); @@ -540,7 +547,7 @@ const lookup_rs_t * lookup_result_refcnt_inc(const lookup_rs_t *rs) { - lookup_rs_t *rsm = deconstify_gpointer(rs); + lookup_rs_t *rsm = deconstify_pointer(rs); lookup_result_check(rs); @@ -569,7 +576,7 @@ rc->token = NULL; } - wfree(rs->path, rs->path_len * sizeof(lookup_rc_t)); + WFREE_ARRAY(rs->path, rs->path_len); WFREE(rs); } @@ -580,7 +587,7 @@ void lookup_result_free(const lookup_rs_t *rs) { - lookup_rs_t *rsm = deconstify_gpointer(rs); + lookup_rs_t *rsm = deconstify_pointer(rs); lookup_result_check(rs); @@ -611,7 +618,7 @@ WALLOC(rs); rs->load = load; - rs->records = walloc(vcnt * sizeof(lookup_val_rc_t)); + WALLOC_ARRAY(rs->records, vcnt); rs->count = (size_t) vcnt; for (i = 0; i < vcnt; i++) { @@ -631,7 +638,7 @@ static void lookup_free_value_results(const lookup_val_rs_t *results) { - lookup_val_rs_t *rs = deconstify_gpointer(results); + lookup_val_rs_t *rs = deconstify_pointer(results); size_t i; g_assert(rs); @@ -641,10 +648,10 @@ for (i = 0; i < rs->count; i++) { lookup_val_rc_t *rc = &rs->recordsi; if (rc->length) - wfree(deconstify_gpointer(rc->data), rc->length); + wfree(deconstify_pointer(rc->data), rc->length); } - wfree(rs->records, rs->count * sizeof(lookup_val_rc_t)); + WFREE_ARRAY(rs->records, rs->count); WFREE(rs); } @@ -652,7 +659,7 @@ * Dump a PATRICIA tree, from furthest to closest. */ static void -log_patricia_dump(nlookup_t *nl, patricia_t *pt, const char *what, guint level) +log_patricia_dump(nlookup_t *nl, patricia_t *pt, const char *what, uint level) { size_t count; patricia_iter_t *iter; @@ -662,7 +669,7 @@ count = patricia_count(pt); g_debug("DHT LOOKUP%s %s contains %zu item%s:", - nid_to_string(&nl->lid), what, count, 1 == count ? "" : "s"); + nid_to_string(&nl->lid), what, count, plural(count)); iter = patricia_metric_iterator_lazy(pt, nl->kuid, FALSE); @@ -671,7 +678,7 @@ knode_check(kn); - if (GNET_PROPERTY(dht_lookup_debug) > level) + if (GNET_PROPERTY(dht_lookup_debug) >= level) g_debug("DHT LOOKUP%s %s%d: %s", nid_to_string(&nl->lid), what, i, knode_to_string(kn)); i++; @@ -700,7 +707,7 @@ tm_elapsed_f(&end, &nl->start), nl->hops, (unsigned) patricia_count(nl->path), nl->bw_incoming, nl->bw_outgoing, - nl->rpc_replies, 1 == nl->rpc_replies ? "y" : "ies"); + nl->rpc_replies, plural_y(nl->rpc_replies)); /* * Optional statistics callback, added via lookup_ctrl_stats() after @@ -806,8 +813,8 @@ * PATRICIA remove iterator to discard from the ball all the nodes which are * still present in the shortlist. */ -static gboolean -remove_if_in_shortlist(gpointer key, size_t ukeybits, gpointer val, gpointer u) +static bool +remove_if_in_shortlist(void *key, size_t ukeybits, void *val, void *u) { kuid_t *id = key; nlookup_t *nl = u; @@ -840,8 +847,7 @@ g_debug("DHT LOOKUP%s %s lookup " "cleaning up ball (%u item%s), path has %u", nid_to_string(&nl->lid), lookup_type_to_string(nl), - (unsigned) bcount, 1 == bcount ? "" : "s", - (unsigned) pcount); + (unsigned) bcount, plural(bcount), (unsigned) pcount); } patricia_foreach_remove(nl->ball, remove_if_in_shortlist, nl); @@ -849,8 +855,7 @@ if (GNET_PROPERTY(dht_lookup_debug) > 2) { size_t bcount = patricia_count(nl->ball); g_debug("DHT LOOKUP%s ball now down to %u item%s", - nid_to_string(&nl->lid), - (unsigned) bcount, 1 == bcount ? "" : "s"); + nid_to_string(&nl->lid), (unsigned) bcount, plural(bcount)); } } @@ -870,7 +875,7 @@ */ static void lookup_value_terminate(nlookup_t *nl, - float load, dht_value_t **vvec, int vcnt, int vsize, gboolean local) + float load, dht_value_t **vvec, int vcnt, int vsize, bool local) { lookup_val_rs_t *rs; size_t count; @@ -885,8 +890,7 @@ "for %s with %d value%s", nid_to_string(&nl->lid), lookup_type_to_string(nl), dht_value_type_to_string(nl->u.fv.vtype), - kuid_to_hex_string(nl->kuid), - vcnt, 1 == vcnt ? "" : "s"); + kuid_to_hex_string(nl->kuid), vcnt, plural(vcnt)); /* * If we were unable to collect any value, abort as if we had not @@ -930,8 +934,7 @@ g_debug("DHT LOOKUP%s " "going to cache %d \"%s\" value%s for %s at %s", nid_to_string(&nl->lid), - vcnt, dht_value_type_to_string(nl->u.fv.vtype), - 1 == vcnt ? "" : "s", + vcnt, dht_value_type_to_string(nl->u.fv.vtype), plural(vcnt), kuid_to_hex_string(nl->kuid), knode_to_string(closest)); } @@ -948,8 +951,7 @@ g_debug("DHT LOOKUP%s " "not caching %d \"%s\" value%s for %s: local=%s, path size=%zu", nid_to_string(&nl->lid), - vcnt, dht_value_type_to_string(nl->u.fv.vtype), - 1 == vcnt ? "" : "s", + vcnt, dht_value_type_to_string(nl->u.fv.vtype), plural(vcnt), kuid_to_hex_string(nl->kuid), local ? "y" : "n", count); } } @@ -980,7 +982,7 @@ roots_record(nl->ball, nl->kuid); if (GNET_PROPERTY(dht_lookup_debug) > 2) - log_patricia_dump(nl, nl->ball, "final value path", 2); + log_patricia_dump(nl, nl->ball, "final value path", 3); lookup_free(nl); @@ -991,7 +993,7 @@ */ if (!local) - wfree(vvec, vsize * sizeof *vvec); + WFREE_ARRAY(vvec, vsize); } /** @@ -1031,7 +1033,7 @@ } knode_free(sk->kn); - wfree(sk->skeys, sk->scnt * sizeof sk->skeys0); + WFREE_ARRAY(sk->skeys, sk->scnt); WFREE(sk); } @@ -1076,18 +1078,15 @@ g_assert(vsize == 0 || vvec); g_assert(expected > 0); - if (expected > vsize) { - vvec = vvec ? - wrealloc(vvec, vsize * sizeof *vvec, expected * sizeof *vvec) : - walloc(expected * sizeof *vvec); - } + if (expected > vsize) + WREALLOC_ARRAY(vvec, vsize, expected); WALLOC0(fv); nl->u.fv.fv = fv; if (skeys) { struct seckeys *sk = seckeys_create(skeys, scnt, kn); - fv->seckeys = g_slist_append(NULL, sk); + fv->seckeys = pslist_append(NULL, sk); } fv->vvec = vvec; @@ -1151,10 +1150,10 @@ static int lookup_value_remaining_seckeys(const struct fvalue *fv) { - GSList *sl; + pslist_t *sl; int remain = 0; - GM_SLIST_FOREACH(fv->seckeys, sl) { + PSLIST_FOREACH(fv->seckeys, sl) { struct seckeys *sk = sl->data; remain += sk->scnt - sk->next_skey; } @@ -1199,8 +1198,8 @@ if (GNET_PROPERTY(dht_lookup_debug) > 3) g_debug("DHT LOOKUP%s " "merging %d value%s and %d secondary key%s from %s", - nid_to_string(&nl->lid), vcnt, 1 == vcnt ? "" : "s", - scnt, 1 == scnt ? "" : "s", knode_to_string(kn)); + nid_to_string(&nl->lid), vcnt, plural(vcnt), + scnt, plural(scnt), knode_to_string(kn)); /* * Make room in the global DHT value vector to be able to hold all @@ -1213,8 +1212,7 @@ g_assert(remain <= fv->vsize - fv->vcnt); if (needed > fv->vsize) { - fv->vvec = wrealloc(fv->vvec, - fv->vsize * sizeof fv->vvec0, needed * sizeof fv->vvec0); + WREALLOC_ARRAY(fv->vvec, fv->vsize, needed); fv->vsize = needed; } @@ -1267,7 +1265,7 @@ nid_to_string(&nl->lid), dht_value_to_string(v), knode_to_string(kn)); } - gnet_stats_count_general(GNR_DHT_DUP_VALUES, 1); + gnet_stats_inc_general(GNR_DHT_DUP_VALUES); dht_value_free(v, TRUE); } else { if (GNET_PROPERTY(dht_lookup_debug) > 2) { @@ -1286,7 +1284,7 @@ } if (vvec) - wfree(vvec, vsize * sizeof vvec0); + WFREE_ARRAY(vvec, vsize); /* * If there are secondary keys to grab, record the vector and the @@ -1295,7 +1293,7 @@ if (skeys) { struct seckeys *sk = seckeys_create(skeys, scnt, kn); - fv->seckeys = g_slist_append(fv->seckeys, sk); + fv->seckeys = pslist_append(fv->seckeys, sk); } fv->load += load; @@ -1322,9 +1320,9 @@ * When free_vvec is TRUE, the data within the DHT value is also freed. */ static void -lookup_value_free(nlookup_t *nl, gboolean free_vvec) +lookup_value_free(nlookup_t *nl, bool free_vvec) { - GSList *sl; + pslist_t *sl; struct fvalue *fv; int i; @@ -1336,10 +1334,10 @@ for (i = 0; i < fv->vcnt; i++) dht_value_free(fv->vveci, TRUE); - wfree(fv->vvec, fv->vsize * sizeof fv->vvec0); + WFREE_ARRAY(fv->vvec, fv->vsize); } - GM_SLIST_FOREACH(fv->seckeys, sl) { + PSLIST_FOREACH(fv->seckeys, sl) { struct seckeys *sk = sl->data; g_assert(sk->skeys); @@ -1348,7 +1346,7 @@ seckeys_free(sk); } - gm_slist_free_null(&fv->seckeys); + pslist_free_null(&fv->seckeys); map_foreach(fv->seen, lookup_value_seen_free_kv, NULL); map_destroy(fv->seen); map_destroy(fv->values); @@ -1394,7 +1392,7 @@ */ if (sk) { - fv->seckeys = g_slist_remove(fv->seckeys, sk); + fv->seckeys = pslist_remove(fv->seckeys, sk); seckeys_free(sk); if (fv->seckeys) { @@ -1404,8 +1402,7 @@ g_debug("DHT LOOKUP%s " "now fetching %d secondary key%s from %s", nid_to_string(&nl->lid), - sk->scnt, 1 == sk->scnt ? "" : "s", - knode_to_string(sk->kn)); + sk->scnt, plural(sk->scnt), knode_to_string(sk->kn)); } fv->rpc_timeouts = 0; @@ -1426,7 +1423,7 @@ "%sgiving a chance to %d pending FIND_VALUE RPC%s", nid_to_string(&nl->lid), NULL == fv->delay_ev ? "" : "already ", - nl->rpc_pending, 1 == nl->rpc_pending ? "" : "s"); + nl->rpc_pending, plural(nl->rpc_pending)); lookup_value_delay(nl); return; @@ -1435,8 +1432,7 @@ if (GNET_PROPERTY(dht_lookup_debug) > 1) g_debug("DHT LOOKUP%s " "ending value fetch with %d pending FIND_VALUE RPC%s", - nid_to_string(&nl->lid), nl->rpc_pending, - 1 == nl->rpc_pending ? "" : "s"); + nid_to_string(&nl->lid), nl->rpc_pending, plural(nl->rpc_pending)); load = fv->load / fv->nodes; vvec = fv->vvec; @@ -1451,15 +1447,14 @@ * Extra value fetching expiration timeout. */ static void -lookup_value_expired(cqueue_t *unused_cq, gpointer obj) +lookup_value_expired(cqueue_t *cq, void *obj) { nlookup_t *nl = obj; struct fvalue *fv; - (void) unused_cq; lookup_value_check(nl); - nl->expire_ev = NULL; + cq_zero(cq, &nl->expire_ev); fv = lookup_fv(nl); if (GNET_PROPERTY(dht_lookup_debug) > 1) { @@ -1474,7 +1469,7 @@ nid_to_string(&nl->lid), lookup_type_to_string(nl), dht_value_type_to_string(nl->u.fv.vtype), kuid_to_hex_string(nl->kuid), - tm_elapsed_f(&now, &fv->start), remain, 1 == remain ? "" : "s"); + tm_elapsed_f(&now, &fv->start), remain, plural(remain)); } lookup_value_done(nl); @@ -1496,16 +1491,16 @@ * in which case the calling code will continue to lookup for a valid value * if needed. */ -static gboolean +static bool lookup_value_found(nlookup_t *nl, const knode_t *kn, - const char *payload, size_t len, guint32 hop) + const char *payload, size_t len, uint32 hop) { bstr_t *bs; float load; const char *reason; char msg120; - guint8 expanded; /* Amount of expanded DHT values we got */ - guint8 seckeys; /* Amount of secondary keys we got */ + uint8 expanded; /* Amount of expanded DHT values we got */ + uint8 seckeys; /* Amount of secondary keys we got */ dht_value_t **vvec = NULL; /* Read expanded DHT values */ int vcnt = 0; /* Amount of DHT values in vector */ kuid_t **skeys = NULL; /* Read secondary keys */ @@ -1519,10 +1514,11 @@ type = nl->u.fv.vtype; msg0 = '\0'; /* Precaution */ - if (GNET_PROPERTY(dht_lookup_debug) > 1) - g_debug("DHT LOOKUP%s got value for %s %s from hop %u %s", + if (GNET_PROPERTY(dht_lookup_debug)) { + g_debug("DHT LOOKUP%s got value for %s %s at hop %u from %s", nid_to_string(&nl->lid), dht_value_type_to_string(type), kuid_to_hex_string(nl->kuid), hop, knode_to_string(kn)); + } /* * Parse payload to extract value(s). @@ -1536,19 +1532,19 @@ } if (!bstr_read_u8(bs, &expanded)) { - reason = "could not read value count"; + reason = "could not read expanded value count"; goto bad; } if (expanded) - vvec = walloc(expanded * sizeof vvec0); + WALLOC_ARRAY(vvec, expanded); for (i = 0; i < expanded; i++) { dht_value_t *v = dht_value_deserialize(bs); if (NULL == v) { if (GNET_PROPERTY(dht_lookup_debug)) { - gm_snprintf(msg, sizeof msg, "cannot parse DHT value %d/%u", + str_bprintf(msg, sizeof msg, "cannot parse DHT value %d/%u", i + 1, expanded); } reason = msg; @@ -1568,7 +1564,7 @@ continue; } - if (GNET_PROPERTY(dht_lookup_debug) > 3) + if (GNET_PROPERTY(dht_lookup_debug)) g_debug("DHT LOOKUP%s value %d/%u is %s", nid_to_string(&nl->lid), i + 1, expanded, dht_value_to_string(v)); @@ -1579,22 +1575,38 @@ /* * Look at secondary keys. + * + * Normally, when there are no secondary keys in the message, there should + * be a trailing 0 (count) but earlier versions of GTKG (prior 0.98.4) did + * not emit it and we were considering that as an error. + * + * From now on, we will emit the trailing 0 byte so that legacy servents + * can parse our responses properly, but we also consider the missing + * trailing count as a normal situation: there are simply no secondary + * keys, and the message was parsed correctly so far. + * --RAM, 2012-10-28 */ if (!bstr_read_u8(bs, &seckeys)) { - reason = "could not read secondary key count"; - goto bad; + if (GNET_PROPERTY(dht_lookup_debug) || GNET_PROPERTY(dht_debug)) { + g_warning("DHT LOOKUP%s FIND_VALUE_RESPONSE from %s has no " + "secondary keys: reached end of message after %u expanded " + "value%s", + nid_to_string(&nl->lid), knode_to_string(kn), + expanded, plural(expanded)); + } + seckeys = 0; } if (seckeys) - skeys = walloc(seckeys * sizeof skeys0); + WALLOC_ARRAY(skeys, seckeys); for (i = 0; i < seckeys; i++) { kuid_t tmp; if (!bstr_read(bs, tmp.v, KUID_RAW_SIZE)) { if (GNET_PROPERTY(dht_lookup_debug)) { - gm_snprintf(msg, sizeof msg, "cannot read secondary key %d/%u", + str_bprintf(msg, sizeof msg, "cannot read secondary key %d/%u", i + 1, seckeys); } reason = msg; @@ -1618,8 +1630,8 @@ g_warning("DHT LOOKUP%s the FIND_VALUE_RESPONSE payload (%lu byte%s) " "from %s has %lu byte%s of unparsed trailing data (ignored)", nid_to_string(&nl->lid), - (gulong) len, len == 1 ? "" : "s", knode_to_string(kn), - (gulong) unparsed, 1 == unparsed ? "" : "s"); + (ulong) len, plural(len), knode_to_string(kn), + (ulong) unparsed, plural(unparsed)); } /* @@ -1650,9 +1662,9 @@ if (GNET_PROPERTY(dht_lookup_debug) > 2) g_debug("DHT LOOKUP%s (remote load = %g) " "got %d value%s of type %s and %d secondary key%s from %s", - nid_to_string(&nl->lid), load, vcnt, 1 == vcnt ? "" : "s", + nid_to_string(&nl->lid), load, vcnt, plural(vcnt), dht_value_type_to_string(type), - scnt, 1 == scnt ? "" : "s", knode_to_string(kn)); + scnt, plural(scnt), knode_to_string(kn)); bstr_free(&bs); @@ -1720,7 +1732,7 @@ if (GNET_PROPERTY(dht_debug)) g_warning("DHT improper FIND_VALUE_RESPONSE payload (%zu byte%s) " "from %s: %s: %s", - len, len == 1 ? "" : "s", knode_to_string(kn), + len, plural(len), knode_to_string(kn), reason, bstr_error(bs)); /* FALL THROUGH */ @@ -1733,13 +1745,13 @@ if (vvec) { for (i = 0; i < vcnt; i++) dht_value_free(vveci, TRUE); - wfree(vvec, expanded * sizeof *vvec); + WFREE_ARRAY(vvec, expanded); } if (skeys) { for (i = 0; i < scnt; i++) kuid_atom_free(skeysi); - wfree(skeys, seckeys * sizeof *skeys); + WFREE_ARRAY(skeys, seckeys); } bstr_free(&bs); @@ -1779,12 +1791,11 @@ nid_to_string(&nl->lid), (nl->flags & NL_F_ACTV_PROTECT) ? "actively protected " : (nl->flags & NL_F_PASV_PROTECT) ? "passively protected " : "", - (gulong) path_len, - 1 == path_len ? "" : "s", + (ulong) path_len, plural(path_len), closest ? knode_to_string(closest) : "unknown"); if (GNET_PROPERTY(dht_lookup_debug) > 2) - log_patricia_dump(nl, nl->path, "final path", 2); + log_patricia_dump(nl, nl->path, "final path", 3); } /* @@ -1833,14 +1844,13 @@ * Expiration timeout. */ static void -lookup_expired(cqueue_t *unused_cq, gpointer obj) +lookup_expired(cqueue_t *cq, void *obj) { nlookup_t *nl = obj; - (void) unused_cq; lookup_check(nl); - nl->expire_ev = NULL; + cq_zero(cq, &nl->expire_ev); if (GNET_PROPERTY(dht_lookup_debug) > 1) g_debug("DHT LOOKUP%s %s lookup for %s expired (%s)", @@ -1911,7 +1921,7 @@ lookup_check(nl); knode_check(kn); g_assert(pmone == +1 || pmone == -1); - + if (!host_addr_is_ipv4(kn->addr)) return; @@ -1974,7 +1984,7 @@ patricia_insert(nl->path, kn->id, knode_refcnt_inc(kn)); patricia_insert(nl->ball, kn->id, knode_refcnt_inc(kn)); - + lookup_c_class_update_count(nl, kn, +1); } @@ -2041,15 +2051,10 @@ { const struct kl_item *kl_a = a; const struct kl_item *kl_b = b; - double d; - - d = kl_a->contrib - kl_b->contrib; - if (d < 0.0) - d = -d; /* Reverse comparison: largest values come first */ - return d < 1e-15 ? 0 : kl_a->contrib < kl_b->contrib ? +1 : -1; + return CMP(kl_b->contrib, kl_a->contrib); } /** @@ -2128,7 +2133,7 @@ dkl = 0.0; - for (i = 0; i < G_N_ELEMENTS(M); i++) { + for (i = 0; i < N_ITEMS(M); i++) { double ct; itemsi.prefix = i + bmin; @@ -2163,8 +2168,7 @@ "freq = %g (%u/%u node%s, log2=%g), theoric = %g => " "K-L contribution: %g", nid_to_string(&nl->lid), (unsigned) (i + bmin), - Mi, (unsigned) prefixi, (unsigned) nodes, - 1 == prefixi ? "" : "s", + Mi, (unsigned) prefixi, (unsigned) nodes, plural(prefixi), log2_frequencynodes - 1prefixi - 1, 1.0 / pow(2.0, i + 1.0), ct); } @@ -2182,20 +2186,20 @@ * deemed unsafe and was stripped from suspicious entries, requiring further * iteration to complete the lookup. */ -static gboolean +static bool lookup_path_is_safe(nlookup_t *nl) { patricia_iter_t *iter; size_t prefixKDA_C + 1; struct kl_item itemsKDA_C + 1; - GList *nodelistKDA_C + 1; + plist_t *nodelistKDA_C + 1; size_t nodes; double dkl, previous_dkl; knode_t *removed_kn; int min_common_bits, max_common_bits; size_t i; - gboolean shifted = FALSE; - gboolean empty_min_prefix = FALSE; + bool shifted = FALSE; + bool empty_min_prefix = FALSE; size_t stripped; lookup_check(nl); @@ -2205,7 +2209,7 @@ * * "Efficient DHT attack mitigation through peers's ID distribution" by * Thibault Cholez et al., published in June 2010. - * + * * The idea is that Sybil attacks will necessarily change the statistical * distribution of the KUIDs surrounding the target. By comparing the * actual KUID prefix distribution with the theoretical one, we can detect @@ -2296,7 +2300,7 @@ g_debug("DHT LOOKUP%s with %u/%u node%s, K-L divergence to %s = %g", nid_to_string(&nl->lid), (unsigned) nodes, (unsigned) patricia_count(nl->path), - 1 == nodes ? "" : "s", kuid_to_hex_string(nl->kuid), dkl); + plural(nodes), kuid_to_hex_string(nl->kuid), dkl); } if (dkl <= KL_ABNORMAL_THRESH) @@ -2350,7 +2354,7 @@ if (!(nl->flags & NL_F_ACTV_PROTECT)) { nl->flags |= NL_F_ACTV_PROTECT; - gnet_stats_count_general(GNR_DHT_ACTIVELY_PROTECTED_LOOKUP_PATH, 1); + gnet_stats_inc_general(GNR_DHT_ACTIVELY_PROTECTED_LOOKUP_PATH); } /* @@ -2398,8 +2402,8 @@ common <= UNSIGNED(max_common_bits) ) { size_t j = common - min_common_bits; - g_assert(j < G_N_ELEMENTS(nodelist)); - nodelistj = g_list_prepend(nodelistj, kn); + g_assert(j < N_ITEMS(nodelist)); + nodelistj = plist_prepend(nodelistj, kn); } } @@ -2422,12 +2426,12 @@ g_assert(nodes >= 1U); - for (i = 0; i < G_N_ELEMENTS(items); i++) { + for (i = 0; i < N_ITEMS(items); i++) { if (prefixi != 0) itemsi.contrib /= prefixi; } - qsort(&items, G_N_ELEMENTS(items), sizeof(items0), kl_item_revcmp); + vsort(&items, N_ITEMS(items), sizeof(items0), kl_item_revcmp); if (GNET_PROPERTY(dht_lookup_debug) > 1) { g_debug("DHT LOOKUP%s largest K-L divergence %g from %zu-bit prefix", @@ -2444,24 +2448,24 @@ size_t j = n - min_common_bits; /* Index in prefix */ size_t count; size_t nth; - GList *lnk; + plist_t *lnk; - g_assert(size_is_non_negative(j) && j < G_N_ELEMENTS(prefix)); + g_assert(size_is_non_negative(j) && j < N_ITEMS(prefix)); count = prefixj; g_assert(size_is_positive(count)); nth = random_value(count - 1); - lnk = g_list_nth(nodelistj, nth); + lnk = plist_nth(nodelistj, nth); g_assert(lnk != NULL); /* There is an nth item in the list */ lookup_path_remove(nl, lnk->data); removed_kn = lnk->data; /* Still referenced, no refcnt incr. */ - nodelistj = g_list_delete_link(nodelistj, lnk); + nodelistj = plist_delete_link(nodelistj, lnk); prefixj--; nodes--; - gnet_stats_count_general(GNR_DHT_LOOKUP_REJECTED_NODE_ON_DIVERGENCE, 1); + gnet_stats_inc_general(GNR_DHT_LOOKUP_REJECTED_NODE_ON_DIVERGENCE); stripped++; } @@ -2478,7 +2482,7 @@ if (GNET_PROPERTY(dht_lookup_debug) > 1) { g_debug("DHT LOOKUP%s with %u/%u node%s, K-L divergence down to %g", nid_to_string(&nl->lid), (unsigned) nodes, - (unsigned) patricia_count(nl->path), 1 == nodes ? "" : "s", dkl); + (unsigned) patricia_count(nl->path), plural(nodes), dkl); } /* @@ -2497,8 +2501,7 @@ if (dkl >= previous_dkl) { lookup_path_add(nl, removed_kn); - gnet_stats_count_general( - GNR_DHT_LOOKUP_REJECTED_NODE_ON_DIVERGENCE, -1); + gnet_stats_dec_general(GNR_DHT_LOOKUP_REJECTED_NODE_ON_DIVERGENCE); if (GNET_PROPERTY(dht_lookup_debug)) { g_debug("DHT LOOKUP%s put %s back in path " @@ -2517,8 +2520,8 @@ done: - for (i = 0; i < G_N_ELEMENTS(nodelist); i++) { - gm_list_free_null(&nodelisti); + for (i = 0; i < N_ITEMS(nodelist); i++) { + plist_free_null(&nodelisti); } if (GNET_PROPERTY(dht_lookup_debug)) { @@ -2526,8 +2529,8 @@ "K-L divergence is %g (%u node%s in window, stripped %u)", nid_to_string(&nl->lid), (unsigned) patricia_count(nl->path), - 1 == patricia_count(nl->path) ? "" : "s", dkl, - (unsigned) nodes, 1 == nodes ? "" : "s", (unsigned) stripped); + plural(patricia_count(nl->path)), dkl, + (unsigned) nodes, plural(nodes), (unsigned) stripped); } /* @@ -2541,12 +2544,12 @@ /** * Do we have the requested amount of closest neighbours? */ -static gboolean +static bool lookup_closest_ok(nlookup_t *nl) { patricia_iter_t *iter; int i = 0; - gboolean enough = TRUE; + bool enough = TRUE; knode_t *kn = NULL; lookup_check(nl); @@ -2681,7 +2684,7 @@ lookup_fix_contact(nlookup_t *nl, const knode_t *kn, const knode_t *an) { knode_t *xn; - gboolean removed; + bool removed; lookup_check(nl); knode_check(kn); @@ -2706,7 +2709,7 @@ host_addr_port_to_string(an->addr, an->port)); } - xn = deconstify_gpointer(kn); + xn = deconstify_pointer(kn); xn->port = an->port; xn->addr = an->addr; @@ -2722,8 +2725,8 @@ /** * Iterator callback to remove nodes from the shortlist if their token is known. */ -static gboolean -remove_from_shortlist(gpointer key, size_t keybits, gpointer value, gpointer u) +static bool +remove_from_shortlist(void *key, size_t keybits, void *value, void *u) { map_t *tokens = u; kuid_t *id = key; @@ -2745,11 +2748,10 @@ * @return TRUE if node is safe to query / add to path, FALSE otherwise, * filling buf if len is non-zero with the rejection reason. */ -static gboolean +static bool lookup_node_is_safe(nlookup_t *nl, const knode_t *kn, char *buf, size_t len) { - const char *msg; gnr_stats_t gnr_stat; lookup_check(nl); @@ -2783,14 +2785,19 @@ */ if (lookup_c_class_get_count(nl, kn) >= NL_MAX_IN_NET) { - msg = "reached class-C net quota"; + const char *msg = "reached class-C net quota"; + if (len != 0) + g_strlcpy(buf, msg, len); gnr_stat = GNR_DHT_LOOKUP_REJECTED_NODE_ON_NET_QUOTA; goto unsafe; } else if ( nl->type != LOOKUP_TOKEN && /* These aim at a known KUID! */ UNSIGNED(nl->max_common_bits) < kuid_common_prefix(kn->id, nl->kuid) ) { - msg = "suspiciously close to target"; + if (len != 0) { + str_bprintf(buf, len, "suspiciously close to target %s", + kuid_to_hex_string(nl->kuid)); + } gnr_stat = GNR_DHT_LOOKUP_REJECTED_NODE_ON_PROXIMITY; goto unsafe; } @@ -2798,21 +2805,18 @@ return TRUE; unsafe: - if (len != 0) - g_strlcpy(buf, msg, len); - /* * Do not count unsafe nodes more than once per lookup. */ if (!map_contains(nl->unsafe, kn->id)) { - gnet_stats_count_general(gnr_stat, 1); + gnet_stats_inc_general(gnr_stat); map_insert(nl->unsafe, kn->id, knode_refcnt_inc(kn)); } if (!(nl->flags & NL_F_PASV_PROTECT)) { nl->flags |= NL_F_PASV_PROTECT; - gnet_stats_count_general(GNR_DHT_PASSIVELY_PROTECTED_LOOKUP_PATH, 1); + gnet_stats_inc_general(GNR_DHT_PASSIVELY_PROTECTED_LOOKUP_PATH); } return FALSE; @@ -2862,7 +2866,7 @@ lookup_load_path(nlookup_t *nl) { patricia_iter_t *iter; - char reason48; + char reason80; size_t reason_len; lookup_check(nl); @@ -2873,7 +2877,7 @@ while (patricia_iter_has_next(iter)) { knode_t *kn; - guint8 toklen; + uint8 toklen; const void *token; time_t last_update; @@ -2934,7 +2938,7 @@ patricia_foreach_remove(nl->shortlist, remove_from_shortlist, nl->tokens); if (GNET_PROPERTY(dht_lookup_debug) > 2) - log_patricia_dump(nl, nl->path, "pre-loaded path", 2); + log_patricia_dump(nl, nl->path, "pre-loaded path", 3); } /** @@ -2948,18 +2952,18 @@ * * @return TRUE if reply was parsed correctly */ -static gboolean +static bool lookup_handle_reply( nlookup_t *nl, const knode_t *kn, - const char *payload, size_t len, guint32 hop) + const char *payload, size_t len, uint32 hop) { bstr_t *bs; sectoken_remote_t *token = NULL; const char *reason; char msg256; - char unsafe48; + char unsafe80; int n = 0; - guint8 contacts; + uint8 contacts; size_t unsafe_len; lookup_check(nl); @@ -2983,7 +2987,7 @@ */ if (LOOKUP_REFRESH == nl->type) { - guint8 tlen; + uint8 tlen; /* * Token is not required when doing a refresh lookup since we are @@ -2995,7 +2999,7 @@ if (!bstr_skip(bs, tlen)) goto bad_token; } else { - guint8 tlen; + uint8 tlen; /* * The security token of all the items in the lookup path is @@ -3007,7 +3011,7 @@ goto bad_token; token = sectoken_remote_alloc(tlen); - + if (tlen > 0 && !bstr_read(bs, token->v, tlen)) goto bad_token; } @@ -3030,19 +3034,11 @@ if (NULL == cn) { if (GNET_PROPERTY(dht_lookup_debug)) - gm_snprintf(msg, sizeof msg, "cannot parse contact #%d", n); + str_bprintf(msg, sizeof msg, "cannot parse contact #%d", n); reason = msg; goto bad; } - if (!knode_is_usable(cn)) { - if (GNET_PROPERTY(dht_lookup_debug)) { - gm_snprintf(msg, sizeof msg, - "%s has unusable address", knode_to_string(cn)); - } - goto skip; - } - /* * Got a valid contact, but skip it if we already queried it or if * it is already part of our (unqueried as of yet) shortlist. @@ -3057,7 +3053,7 @@ if (kuid_eq(get_our_kuid(), cn->id)) { if (GNET_PROPERTY(dht_lookup_debug)) { - gm_snprintf(msg, sizeof msg, + str_bprintf(msg, sizeof msg, "%s bears our KUID", knode_to_string(cn)); } goto skip; @@ -3070,12 +3066,39 @@ if (!lookup_node_is_safe(nl, cn, unsafe, unsafe_len)) { if (GNET_PROPERTY(dht_lookup_debug)) { - gm_snprintf(msg, sizeof msg, "unsafe %s: %s", + str_bprintf(msg, sizeof msg, "unsafe %s: %s", knode_to_string(cn), unsafe); } goto skip; } + /* + * Some nodes are known to send out bad contact information that needs + * fixing -- see kmsg_received(). Due to that, they can enter the + * routing table of other nodes and have these wrong contact propagated + * in lookups. + * + * Try to fix the contact address in-place if we have the KUID in our + * routing table or recently got an RPC reply from that KUID. + * --RAM. 2012-11-08 + */ + + if (dht_fix_contact(cn, "lookup")) + gnet_stats_inc_general(GNR_DHT_LOOKUP_FIXED_NODE_CONTACT); + + /* + * Now that we have a proper address, check for hostiles or + * otherwise unusable addresses. + */ + + if (!knode_is_usable(cn)) { + if (GNET_PROPERTY(dht_lookup_debug)) { + str_bprintf(msg, sizeof msg, + "%s has unusable address", knode_to_string(cn)); + } + goto skip; + } + xn = map_lookup(nl->queried, cn->id); if (xn != NULL) { /* @@ -3099,7 +3122,7 @@ if ( KNODE_UNKNOWN == xn->status && /* Not in routing table */ (xn->port != cn->port || - !host_addr_equal(xn->addr, cn->addr)) && + !host_addr_equiv(xn->addr, cn->addr)) && !patricia_contains(nl->path, cn->id) && !map_contains(nl->fixed, cn->id) && !map_contains(nl->alternate, cn->id) && @@ -3130,7 +3153,7 @@ map_insert(nl->alternate, cn->id, knode_refcnt_inc(cn)); if (GNET_PROPERTY(dht_lookup_debug)) { - gm_snprintf(msg, sizeof msg, + str_bprintf(msg, sizeof msg, "%s already queried, RPC pending, alternate IP %s", knode_to_string(xn), host_addr_port_to_string(cn->addr, cn->port)); @@ -3139,14 +3162,14 @@ lookup_fix_contact(nl, xn, cn); if (GNET_PROPERTY(dht_lookup_debug)) { - gm_snprintf(msg, sizeof msg, + str_bprintf(msg, sizeof msg, "for now, fixed as %s and re-added to shortlist", host_addr_port_to_string(cn->addr, cn->port)); } } } else { if (GNET_PROPERTY(dht_lookup_debug)) { - gm_snprintf(msg, sizeof msg, + str_bprintf(msg, sizeof msg, "%s was already queried", knode_to_string(xn)); } } @@ -3161,12 +3184,22 @@ */ knode_check(xn); - g_assert(knode_is_shared(xn, TRUE)); + if (!patricia_contains(nl->ball, cn->id)) { + g_critical("%s(): node %s in shortlist but not in ball: %s", + G_STRFUNC, kuid_to_hex_string(cn->id), + knode_to_string(xn)); + log_patricia_dump(nl, nl->shortlist, "shortlist", 0); + log_patricia_dump(nl, nl->ball, "ball", 0); + g_error("%s(): inconsistency between shortlist and ball for %s", + G_STRFUNC, knode_to_string(xn)); + } + g_assert_log(knode_is_shared(xn, TRUE), /* In shortlist + ball */ + "%s(): node = {%s}", G_STRFUNC, knode_to_string(xn)); if ( KNODE_UNKNOWN == xn->status && /* Not in routing table */ (xn->port != cn->port || - !host_addr_equal(xn->addr, cn->addr)) && + !host_addr_equiv(xn->addr, cn->addr)) && !map_contains(nl->fixed, cn->id) && !map_contains(nl->alternate, cn->id) ) { @@ -3189,14 +3222,14 @@ map_insert(nl->alternate, cn->id, knode_refcnt_inc(cn)); if (GNET_PROPERTY(dht_lookup_debug)) { - gm_snprintf(msg, sizeof msg, + str_bprintf(msg, sizeof msg, "%s still in our shorlist, recorded alternate IP %s", knode_to_string(cn), host_addr_port_to_string(cn->addr, cn->port)); } } else { if (GNET_PROPERTY(dht_lookup_debug)) { - gm_snprintf(msg, sizeof msg, + str_bprintf(msg, sizeof msg, "%s is still in our shortlist", knode_to_string(cn)); } } @@ -3239,8 +3272,8 @@ g_warning("DHT LOOKUP%s the FIND_NODE_RESPONSE payload (%lu byte%s) " "from %s has %lu byte%s of unparsed trailing data (ignored)", nid_to_string(&nl->lid), - (gulong) len, len == 1 ? "" : "s", knode_to_string(kn), - (gulong) unparsed, 1 == unparsed ? "" : "s"); + (ulong) len, plural(len), knode_to_string(kn), + (ulong) unparsed, plural(unparsed)); } /* @@ -3334,7 +3367,7 @@ if (GNET_PROPERTY(dht_debug)) g_warning("DHT improper FIND_NODE_RESPONSE payload (%zu byte%s) " "from %s: %s: %s", - len, len == 1 ? "" : "s", knode_to_string(kn), + len, plural(len), knode_to_string(kn), reason, bstr_error(bs)); if (token != NULL) @@ -3346,7 +3379,7 @@ /** * Determines whether we can stop the value lookup at this node. */ -static gboolean +static bool lookup_value_acceptable(nlookup_t *nl, const knode_t *kn) { size_t common; @@ -3392,7 +3425,7 @@ nl->flags |= NL_F_KBALL_CHECK; /* Probability check done once */ proba = kball_dist_probakball - common; - if (random_u32() % NL_KBALL_FACTOR < proba) + if (random_value(NL_KBALL_FACTOR - 1) < proba) goto accepting; refusing: @@ -3426,7 +3459,7 @@ ***/ static void -lk_freeing_msg(gpointer obj) +lk_freeing_msg(void *obj) { nlookup_t *nl = obj; lookup_check(nl); @@ -3436,7 +3469,7 @@ } static void -lk_msg_sent(gpointer obj, pmsg_t *mb) +lk_msg_sent(void *obj, pmsg_t *mb) { nlookup_t *nl = obj; lookup_check(nl); @@ -3449,7 +3482,7 @@ } static void -lk_msg_dropped(gpointer obj, knode_t *kn, pmsg_t *unused_mb) +lk_msg_dropped(void *obj, knode_t *kn, pmsg_t *unused_mb) { nlookup_t *nl = obj; lookup_check(nl); @@ -3488,7 +3521,7 @@ } static void -lk_rpc_cancelled(gpointer obj, guint32 hop) +lk_rpc_cancelled(void *obj, uint32 hop) { nlookup_t *nl = obj; lookup_check(nl); @@ -3521,17 +3554,17 @@ } else { if (GNET_PROPERTY(dht_lookup_debug) > 1) g_debug("DHT LOOKUP%s not iterating (has %d RPC%s pending)", - nid_to_string(&nl->lid), nl->rpc_pending, - 1 == nl->rpc_pending ? "" : "s"); + nid_to_string(&nl->lid), + nl->rpc_pending, plural(nl->rpc_pending)); } } static void -lk_handling_rpc(gpointer obj, enum dht_rpc_ret type, - const knode_t *kn, guint32 hop) +lk_handling_rpc(void *obj, enum dht_rpc_ret type, + const knode_t *kn, uint32 hop) { nlookup_t *nl = obj; - gboolean removed; + bool removed; lookup_check(nl); knode_check(kn); @@ -3571,9 +3604,9 @@ } } -static gboolean -lk_handle_reply(gpointer obj, const knode_t *kn, - kda_msg_t function, const char *payload, size_t len, guint32 hop) +static bool +lk_handle_reply(void *obj, const knode_t *kn, + kda_msg_t function, const char *payload, size_t len, uint32 hop) { nlookup_t *nl = obj; @@ -3649,7 +3682,7 @@ "bounded parallelism (path has %u items, %d RPC%s pending)", nid_to_string(&nl->lid), (unsigned) patricia_count(nl->path), - nl->rpc_pending, 1 == nl->rpc_pending ? "" : "s"); + nl->rpc_pending, plural(nl->rpc_pending)); } nl->mode = LOOKUP_BOUNDED; } @@ -3676,7 +3709,7 @@ g_debug("DHT LOOKUP%s ending due to amount of nodes sharing " "%u common leading bit%s", nid_to_string(&nl->lid), - (unsigned) nl->u.fn.bits, 1 == nl->u.fn.bits ? "" : "s"); + (unsigned) nl->u.fn.bits, plural(nl->u.fn.bits)); } lookup_completed(nl); return FALSE; /* Do not iterate */ @@ -3693,7 +3726,8 @@ if (patricia_count(nl->shortlist)) { knode_t *closest = patricia_closest(nl->shortlist, nl->kuid); - g_assert(knode_is_shared(closest, TRUE)); + g_assert_log(knode_is_shared(closest, TRUE), + "%s(): node = {%s}", G_STRFUNC, knode_to_string(closest)); /* * Due to active node removal from the path, we could have a NULL @@ -3760,7 +3794,7 @@ } static void -lk_iterate(gpointer obj, enum dht_rpc_ret type, guint32 hop) +lk_iterate(void *obj, enum dht_rpc_ret type, uint32 hop) { nlookup_t *nl = obj; @@ -3816,7 +3850,7 @@ nid_to_string(&nl->lid), DHT_RPC_TIMEOUT == type ? "timeout" : "reply from previous hop", - nl->rpc_pending, 1 == nl->rpc_pending ? "" : "s"); + nl->rpc_pending, plural(nl->rpc_pending)); } } else { lookup_iterate_if_possible(nl); @@ -3901,7 +3935,7 @@ nl->rpc_latest_pending++; map_insert(nl->pending, kn->id, knode_refcnt_inc(kn)); - revent_find_node(deconstify_gpointer(kn), + revent_find_node(deconstify_pointer(kn), nl->kuid, nl->lid, &lookup_ops, nl->hops); } @@ -3909,18 +3943,16 @@ * Delay expiration. */ static void -lookup_delay_expired(cqueue_t *unused_cq, gpointer obj) +lookup_delay_expired(cqueue_t *cq, void *obj) { nlookup_t *nl = obj; - (void) unused_cq; - if (G_UNLIKELY(NULL == nlookups)) return; /* Shutdown occurred */ lookup_check(nl); - nl->delay_ev = NULL; + cq_zero(cq, &nl->delay_ev); nl->flags &= ~NL_F_DELAYED; lookup_iterate(nl); } @@ -3968,12 +4000,12 @@ lookup_iterate(nlookup_t *nl) { patricia_iter_t *iter; - GSList *to_remove = NULL; - GSList *ignored = NULL; - GSList *sl; + pslist_t *to_remove = NULL; + pslist_t *ignored = NULL; + pslist_t *sl; int i = 0; int alpha = KDA_ALPHA; - char reason48; + char reason80; int reason_len; lookup_check(nl); @@ -4006,8 +4038,8 @@ if (alpha <= 0) { if (GNET_PROPERTY(dht_lookup_debug) > 2) g_debug("DHT LOOKUP%s not iterating yet (%d RPC%s pending)", - nid_to_string(&nl->lid), nl->rpc_pending, - 1 == nl->rpc_pending ? "" : "s"); + nid_to_string(&nl->lid), + nl->rpc_pending, plural(nl->rpc_pending)); return; } } @@ -4021,15 +4053,15 @@ "(%s parallelism: sending %d RPC%s at most, %d outstanding)", nid_to_string(&nl->lid), nl->hops, lookup_parallelism_mode_to_string(nl->mode), - alpha, 1 == alpha ? "" : "s", nl->rpc_pending); + alpha, plural(alpha), nl->rpc_pending); if (GNET_PROPERTY(dht_lookup_debug) > 4) log_status(nl); if (GNET_PROPERTY(dht_lookup_debug) > 5) { - log_patricia_dump(nl, nl->shortlist, "shortlist", 18); - log_patricia_dump(nl, nl->path, "path", 18); - log_patricia_dump(nl, nl->ball, "ball", 18); + log_patricia_dump(nl, nl->shortlist, "shortlist", 19); + log_patricia_dump(nl, nl->path, "path", 19); + log_patricia_dump(nl, nl->ball, "ball", 19); } /* @@ -4058,7 +4090,7 @@ g_debug("DHT LOOKUP%s ignoring %s: %s", nid_to_string(&nl->lid), knode_to_string(kn), reason); } - ignored = g_slist_prepend(ignored, knode_refcnt_inc(kn)); + ignored = pslist_prepend(ignored, knode_refcnt_inc(kn)); } else if (!map_contains(nl->queried, kn->id)) { lookup_send(nl, kn); if (nl->flags & NL_F_UDP_DROP) @@ -4066,7 +4098,7 @@ i++; } - to_remove = g_slist_prepend(to_remove, kn); + to_remove = pslist_prepend(to_remove, kn); } nl->flags &= ~NL_F_SENDING; @@ -4078,11 +4110,11 @@ g_assert(0 == i || to_remove != NULL); - GM_SLIST_FOREACH(to_remove, sl) { + PSLIST_FOREACH(to_remove, sl) { knode_t *kn = sl->data; lookup_shortlist_remove(nl, kn); } - g_slist_free(to_remove); + pslist_free(to_remove); /* * Now explicitly free ignored hosts: because removal from the shortlist @@ -4092,12 +4124,12 @@ * increased. */ - GM_SLIST_FOREACH(ignored, sl) { + PSLIST_FOREACH(ignored, sl) { knode_t *kn = sl->data; lookup_reset_closest(nl, kn); /* In case kn was the closest node */ knode_free(kn); } - g_slist_free(ignored); + pslist_free(ignored); /* * If we detected an UDP message dropping and did not send any @@ -4139,7 +4171,7 @@ * * @return TRUE if OK so far, FALSE on error. */ -static gboolean +static bool lookup_load_shortlist(nlookup_t *nl) { knode_t **kvec; @@ -4153,7 +4185,7 @@ * Start with nodes from the routing table. */ - kvec = walloc(KDA_K * sizeof(knode_t *)); + WALLOC_ARRAY(kvec, KDA_K); kcnt = dht_fill_closest(nl->kuid, kvec, KDA_K, NULL, FALSE); for (i = 0; i < kcnt; i++) { @@ -4185,10 +4217,10 @@ nl->closest = patricia_closest(nl->shortlist, nl->kuid); nl->initial_contactable = contactable; - wfree(kvec, KDA_K * sizeof(knode_t *)); + WFREE_ARRAY(kvec, KDA_K); if (GNET_PROPERTY(dht_lookup_debug) > 3) - log_patricia_dump(nl, nl->shortlist, "initial shortlist", 3); + log_patricia_dump(nl, nl->shortlist, "initial shortlist", 4); if (0 == contactable && GNET_PROPERTY(dht_lookup_debug) > 1) g_debug("DHT LOOKUP%s cancelling %s lookup for %s: " @@ -4209,7 +4241,7 @@ */ static nlookup_t * lookup_create(const kuid_t *kuid, lookup_type_t type, - lookup_cb_err_t error, gpointer arg) + lookup_cb_err_t error, void *arg) { nlookup_t *nl; @@ -4235,7 +4267,7 @@ nl->max_common_bits = KDA_C + dht_get_kball_furthest(); tm_now_exact(&nl->start); - g_hash_table_insert(nlookups, &nl->lid, nl); + htable_insert(nlookups, &nl->lid, nl); dht_lookup_notify(kuid, type); if (GNET_PROPERTY(dht_lookup_debug) > 1) { @@ -4254,7 +4286,7 @@ * @param callback whether to invoke the error callback */ void -lookup_cancel(nlookup_t *nl, gboolean callback) +lookup_cancel(nlookup_t *nl, bool callback) { lookup_check(nl); @@ -4297,7 +4329,7 @@ */ nlookup_t * lookup_find_node( - const kuid_t *kuid, lookup_cb_ok_t ok, lookup_cb_err_t error, gpointer arg) + const kuid_t *kuid, lookup_cb_ok_t ok, lookup_cb_err_t error, void *arg) { nlookup_t *nl; @@ -4330,7 +4362,7 @@ */ nlookup_t * lookup_store_nodes( - const kuid_t *kuid, lookup_cb_ok_t ok, lookup_cb_err_t error, gpointer arg) + const kuid_t *kuid, lookup_cb_ok_t ok, lookup_cb_err_t error, void *arg) { nlookup_t *nl; @@ -4362,7 +4394,7 @@ */ nlookup_t * lookup_token(const knode_t *kn, - lookup_cb_ok_t ok, lookup_cb_err_t err, gpointer arg) + lookup_cb_ok_t ok, lookup_cb_err_t err, void *arg) { nlookup_t *nl; @@ -4393,7 +4425,7 @@ * callbacks, if needed. */ static void -lookup_value_check_here(cqueue_t *unused_cq, gpointer obj) +lookup_value_check_here(cqueue_t *unused_cq, void *obj) { nlookup_t *nl = obj; @@ -4411,13 +4443,12 @@ float load; vcnt = keys_get(nl->kuid, nl->u.fv.vtype, NULL, 0, - vvec, G_N_ELEMENTS(vvec), &load, NULL); + vvec, N_ITEMS(vvec), &load, NULL); - if (GNET_PROPERTY(dht_lookup_debug) > 1) { + if (GNET_PROPERTY(dht_lookup_debug)) { g_debug("DHT LOOKUP%s key %s found locally, with %d %s value%s", nid_to_string(&nl->lid), kuid_to_string(nl->kuid), - vcnt, dht_value_type_to_string(nl->u.fv.vtype), - 1 == vcnt ? "" : "s"); + vcnt, dht_value_type_to_string(nl->u.fv.vtype), plural(vcnt)); } /* @@ -4441,7 +4472,7 @@ if (vcnt) { lookup_value_terminate(nl, - load, vvec, vcnt, G_N_ELEMENTS(vvec), TRUE); + load, vvec, vcnt, N_ITEMS(vvec), TRUE); return; } @@ -4472,7 +4503,7 @@ nlookup_t * lookup_find_value( const kuid_t *kuid, dht_value_type_t type, - lookup_cbv_ok_t ok, lookup_cb_err_t error, gpointer arg) + lookup_cbv_ok_t ok, lookup_cb_err_t error, void *arg) { nlookup_t *nl; @@ -4514,7 +4545,7 @@ */ nlookup_t * lookup_bucket_refresh( - const kuid_t *kuid, size_t bits, lookup_cb_err_t done, gpointer arg) + const kuid_t *kuid, size_t bits, lookup_cb_err_t done, void *arg) { nlookup_t *nl; @@ -4540,16 +4571,15 @@ * Value delay expiration. */ static void -lookup_value_delay_expired(cqueue_t *unused_cq, gpointer obj) +lookup_value_delay_expired(cqueue_t *cq, void *obj) { nlookup_t *nl = obj; struct fvalue *fv; - (void) unused_cq; lookup_value_check(nl); fv = lookup_fv(nl); - fv->delay_ev = NULL; + cq_zero(cq, &fv->delay_ev); lookup_value_iterate(nl); } @@ -4585,7 +4615,7 @@ * @return TRUE if the message was parsed correctly, FALSE if we had problems * parsing it. */ -static gboolean +static bool lookup_value_handle_reply(nlookup_t *nl, const char *payload, size_t len) { @@ -4593,7 +4623,7 @@ float load; const char *reason; char msg120; - guint8 expanded; /* Amount of expanded DHT values we got */ + uint8 expanded; /* Amount of expanded DHT values we got */ dht_value_type_t type; struct fvalue *fv; struct seckeys *sk; @@ -4608,10 +4638,11 @@ kn = sk->kn; msg0 = '\0'; /* Precaution */ - if (GNET_PROPERTY(dht_lookup_debug)) + if (GNET_PROPERTY(dht_lookup_debug)) { g_debug("DHT LOOKUP%s got value for %s %s from %s", nid_to_string(&nl->lid), dht_value_type_to_string(type), kuid_to_hex_string(nl->kuid), knode_to_string(kn)); + } /* * Parse payload to extract value. @@ -4631,7 +4662,7 @@ if (expanded != 1) { if (GNET_PROPERTY(dht_lookup_debug)) - gm_snprintf(msg, sizeof msg, "expected 1 value, got %u", expanded); + str_bprintf(msg, sizeof msg, "expected 1 value, got %u", expanded); reason = msg; goto bad; } @@ -4676,7 +4707,7 @@ goto bad; } - if (GNET_PROPERTY(dht_lookup_debug) > 2) + if (GNET_PROPERTY(dht_lookup_debug)) g_debug("DHT LOOKUP%s (remote load = %g) " "value for secondary key #%u is %s", nid_to_string(&nl->lid), load, sk->next_skey + 1, @@ -4701,7 +4732,7 @@ if (GNET_PROPERTY(dht_debug)) g_warning("DHT improper FIND_VALUE_RESPONSE payload (%zu byte%s) " "from %s: %s%s%s", - len, len == 1 ? "" : "s", knode_to_string(kn), reason, + len, plural(len), knode_to_string(kn), reason, bstr_has_error(bs) ? ": " : "", bstr_has_error(bs) ? bstr_error(bs) : ""); @@ -4715,7 +4746,7 @@ ***/ static void -lk_value_freeing_msg(gpointer obj) +lk_value_freeing_msg(void *obj) { nlookup_t *nl = obj; struct fvalue *fv; @@ -4727,7 +4758,7 @@ } static void -lk_value_msg_sent(gpointer obj, pmsg_t *mb) +lk_value_msg_sent(void *obj, pmsg_t *mb) { nlookup_t *nl = obj; lookup_value_check(nl); @@ -4737,7 +4768,7 @@ } static void -lk_value_msg_dropped(gpointer obj, knode_t *unused_kn, pmsg_t *unused_mb) +lk_value_msg_dropped(void *obj, knode_t *unused_kn, pmsg_t *unused_mb) { nlookup_t *nl = obj; lookup_value_check(nl); @@ -4750,7 +4781,7 @@ } static void -lk_value_rpc_cancelled(gpointer obj, guint32 unused_udata) +lk_value_rpc_cancelled(void *obj, uint32 unused_udata) { nlookup_t *nl = obj; struct fvalue *fv; @@ -4771,8 +4802,8 @@ } static void -lk_value_handling_rpc(gpointer obj, enum dht_rpc_ret type, - const knode_t *unused_kn, guint32 unused_udata) +lk_value_handling_rpc(void *obj, enum dht_rpc_ret type, + const knode_t *unused_kn, uint32 unused_udata) { nlookup_t *nl = obj; struct fvalue *fv; @@ -4790,9 +4821,9 @@ nl->rpc_timeouts++; } -static gboolean -lk_value_handle_reply(gpointer obj, const knode_t *kn, - kda_msg_t function, const char *payload, size_t len, guint32 hop) +static bool +lk_value_handle_reply(void *obj, const knode_t *kn, + kda_msg_t function, const char *payload, size_t len, uint32 hop) { nlookup_t *nl = obj; struct fvalue *fv; @@ -4845,7 +4876,7 @@ } static void -lk_value_iterate(gpointer obj, enum dht_rpc_ret type, guint32 unused_data) +lk_value_iterate(void *obj, enum dht_rpc_ret type, uint32 unused_data) { nlookup_t *nl = obj; struct fvalue *fv; @@ -4900,7 +4931,7 @@ lookup_value_check(nl); - gnet_stats_count_general(GNR_DHT_SECONDARY_KEY_FETCH, 1); + gnet_stats_inc_general(GNR_DHT_SECONDARY_KEY_FETCH); fv = lookup_fv(nl); sk = lookup_sk(fv); @@ -4948,15 +4979,15 @@ if (fv->rpc_pending > 0) { if (GNET_PROPERTY(dht_lookup_debug) > 2) g_debug("DHT LOOKUP%s not iterating (%d pending value RPC%s)", - nid_to_string(&nl->lid), fv->rpc_pending, - 1 == fv->rpc_pending ? "" : "s"); + nid_to_string(&nl->lid), + fv->rpc_pending, plural(fv->rpc_pending)); return; } if (GNET_PROPERTY(dht_lookup_debug) > 2) g_debug("DHT LOOKUP%s " "iterating in value fetch mode with %d node%s, %s secondary keys", - nid_to_string(&nl->lid), fv->nodes, 1 == fv->nodes ? "" : "s", + nid_to_string(&nl->lid), fv->nodes, plural(fv->nodes), sk ? "with" : "without"); /* @@ -4987,7 +5018,7 @@ "skipping already retrieved secondary key %s", nid_to_string(&nl->lid), kuid_to_hex_string(sid)); - gnet_stats_count_general(GNR_DHT_DUP_VALUES, 1); + gnet_stats_inc_general(GNR_DHT_DUP_VALUES); sk->next_skey++; } @@ -5015,13 +5046,13 @@ /** * Initialize Kademlia node lookups. */ -G_GNUC_COLD void +void G_COLD lookup_init(void) { double log_2 = log(2.0); size_t i; - nlookups = g_hash_table_new(nid_hash, nid_equal); + nlookups = htable_create_any(nid_hash, nid_hash2, nid_equal); /* * Build lower triangular matrix of all possible log2(frequency). @@ -5051,7 +5082,7 @@ * from the k-ball frontier. */ - for (i = 1; i <= G_N_ELEMENTS(kball_dist_proba); i++) { + for (i = 1; i <= N_ITEMS(kball_dist_proba); i++) { kball_dist_probai - 1 = (unsigned) (pow(NL_KBALL_PROBA, (double) i) * NL_KBALL_FACTOR); } @@ -5061,10 +5092,10 @@ * Hashtable iteration callback to free the nlookup_t object held as the key. */ static void -free_lookup(gpointer key, gpointer value, gpointer data) +free_lookup(const void *key, void *value, void *data) { nlookup_t *nl = value; - gboolean *exiting = data; + bool *exiting = data; lookup_check(nl); g_assert(key == &nl->lid); @@ -5089,10 +5120,10 @@ * @param exiting whether the whole process is about to exit */ void -lookup_close(gboolean exiting) +lookup_close(bool exiting) { - g_hash_table_foreach(nlookups, free_lookup, &exiting); - gm_hash_table_destroy_null(&nlookups); + htable_foreach(nlookups, free_lookup, &exiting); + htable_free_null(&nlookups); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/lookup.h -> gtk-gnutella-1.1.9.tar.bz2/src/dht/lookup.h
Changed
@@ -84,7 +84,7 @@ * @param arg additional callback opaque argument */ typedef void (*lookup_cb_stats_t)( - const kuid_t *kuid, const struct lookup_stats *ls, gpointer arg); + const kuid_t *kuid, const struct lookup_stats *ls, void *arg); /** * Node lookup result record. @@ -92,7 +92,7 @@ typedef struct lookup_rc { knode_t *kn; /**< A Kademlia node */ void *token; /**< The security token (NULL if none) */ - guint8 token_len; /**< Length of security token */ + uint8 token_len; /**< Length of security token */ } lookup_rc_t; typedef enum { @@ -126,21 +126,21 @@ */ void lookup_init(void); -void lookup_close(gboolean exiting); +void lookup_close(bool exiting); nlookup_t *lookup_bucket_refresh(const kuid_t *kuid, size_t bits, - lookup_cb_err_t done, gpointer arg); + lookup_cb_err_t done, void *arg); nlookup_t *lookup_find_value(const kuid_t *kuid, dht_value_type_t type, - lookup_cbv_ok_t ok, lookup_cb_err_t error, gpointer arg); + lookup_cbv_ok_t ok, lookup_cb_err_t error, void *arg); nlookup_t *lookup_find_node(const kuid_t *kuid, - lookup_cb_ok_t ok, lookup_cb_err_t error, gpointer arg); + lookup_cb_ok_t ok, lookup_cb_err_t error, void *arg); nlookup_t *lookup_store_nodes(const kuid_t *kuid, - lookup_cb_ok_t ok, lookup_cb_err_t error, gpointer arg); + lookup_cb_ok_t ok, lookup_cb_err_t error, void *arg); nlookup_t *lookup_token(const knode_t *kn, - lookup_cb_ok_t ok, lookup_cb_err_t error, gpointer arg); + lookup_cb_ok_t ok, lookup_cb_err_t error, void *arg); void lookup_ctrl_stats(nlookup_t *nl, lookup_cb_stats_t stats); -void lookup_cancel(nlookup_t *nl, gboolean callback); +void lookup_cancel(nlookup_t *nl, bool callback); #endif /* _dht_lookup_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/publish.c -> gtk-gnutella-1.1.9.tar.bz2/src/dht/publish.c
Changed
@@ -103,7 +103,7 @@ * a newcomer, we check whether that node falls in our k-ball and whether it * gets inserted in our routing table. If it does, we're close enough to make * it worth computing which keys to offload. - * + * * 4- creation of new key/value pairs. * * This is the most important use: without values being published, the DHT @@ -151,12 +151,16 @@ #include "core/gnet_stats.h" #include "lib/cq.h" +#include "lib/htable.h" #include "lib/nid.h" #include "lib/patricia.h" +#include "lib/pslist.h" #include "lib/slist.h" +#include "lib/stringify.h" #include "lib/tm.h" #include "lib/unsigned.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ #define PB_MAX_LIFETIME 120000 /* 2 minutes, in ms */ @@ -173,7 +177,7 @@ * Table keeping track of all the publish objects that we have created * and which are still running. */ -static GHashTable *publishes; +static htable_t *publishes; /** * Publish types. @@ -195,11 +199,11 @@ * @param bw_outgoing amount of outgoing bandwidth used */ typedef void (*publish_subcache_done_t)( - gpointer obj, int count, int published, int errors, + void *obj, int count, int published, int errors, int bw_incoming, int bw_outgoing); struct publish_id { - guint64 value; + uint64 value; }; typedef enum { @@ -222,21 +226,21 @@ pmsg_t *pending; /**< Last sent message, awaiting ACK */ int timeouts; /**< Amount of RPC timeouts for last message */ publish_subcache_done_t cb; - gpointer arg; /**< Callback argument */ + void *arg; /**< Callback argument */ } c; struct { /**< For PUBLISH_OFFLOAD */ knode_t *kn; /**< Node where we're publishing */ void *token; /**< Security token for remote node */ - guint8 toklen; /**< Length of security token */ + uint8 toklen; /**< Length of security token */ slist_t *keys; /**< List of keys to offload (KUID atoms) */ publish_t *child; /**< Subordinate publish request */ } o; struct { /**< For PUBLISH_VALUE */ const lookup_rs_t *rs; /**< Lookup result set, immutable thanks */ dht_value_t *value; /**< Value to publish */ - guint16 *status; /**< STORE status codes */ + uint16 *status; /**< STORE status codes */ publish_cb_t cb; /**< Completion callback */ - gpointer arg; /**< Additional callback argument */ + void *arg; /**< Additional callback argument */ size_t idx; /**< Current node index we're publishing to */ unsigned full; /**< Nodes that reported key being full */ } v; @@ -257,8 +261,8 @@ int bw_outgoing; /**< Amount of outgoing bandwidth used */ int bw_incoming; /**< Amount of incoming bandwidth used */ int udp_drops; /**< Amount of UDP packet drops */ - guint32 flags; /**< Operating flags */ - guint32 hops; /**< Iteration count */ + uint32 flags; /**< Operating flags */ + uint32 hops; /**< Iteration count */ }; /** @@ -282,7 +286,7 @@ static void publish_iterate(publish_t *pb); static publish_t *publish_subcache(const kuid_t *key, lookup_rc_t *target, dht_value_t **vvec, int vcnt, - publish_subcache_done_t cb, gpointer arg); + publish_subcache_done_t cb, void *arg); /** * Allocate a lookup ID, the way for users to identify the lookup object. @@ -330,9 +334,9 @@ const char * publish_strerror(publish_error_t error) { - STATIC_ASSERT(G_N_ELEMENTS(publish_errstr) == PUBLISH_E_MAX); + STATIC_ASSERT(N_ITEMS(publish_errstr) == PUBLISH_E_MAX); - if (UNSIGNED(error) >= G_N_ELEMENTS(publish_errstr)) + if (UNSIGNED(error) >= N_ITEMS(publish_errstr)) return "Invalid publish error code"; return publish_errstrerror; @@ -345,7 +349,7 @@ * * @return NULL if the publish ID is unknown, otherwise the publish object */ -static gpointer +static void * publish_is_alive(struct nid pid) { publish_t *pb; @@ -353,7 +357,7 @@ if (NULL == publishes) return NULL; - pb = g_hash_table_lookup(publishes, &pid); + pb = htable_lookup(publishes, &pid); if (pb) publish_check(pb); @@ -365,7 +369,7 @@ * Slist freeing callback. */ static void -free_pmsg(gpointer obj) +free_pmsg(void *obj) { pmsg_free(obj); } @@ -374,7 +378,7 @@ * Slist freeing callback. */ static void -free_kuid_atom(gpointer obj) +free_kuid_atom(void *obj) { kuid_atom_free(obj); } @@ -399,8 +403,7 @@ break; case PUBLISH_VALUE: dht_value_free(pb->target.v.value, TRUE); - WFREE_NULL(pb->target.v.status, - pb->target.v.rs->path_len * sizeof *pb->target.v.status); + WFREE_ARRAY_NULL(pb->target.v.status, pb->target.v.rs->path_len); lookup_result_free(pb->target.v.rs); break; case PUBLISH_OFFLOAD: @@ -411,7 +414,7 @@ } if (!(pb->flags & PB_F_DONT_REMOVE)) - g_hash_table_remove(publishes, &pb->pid); + htable_remove(publishes, &pb->pid); pb->magic = 0; WFREE(pb); @@ -431,7 +434,7 @@ g_debug("DHT PUBLISH%s %g secs published %d/%d (%d error%s) " "in=%d bytes, out=%d bytes", nid_to_string(&pb->pid), tm_elapsed_f(&end, &pb->start), - pb->published, pb->cnt, pb->errors, 1 == pb->errors ? "" : "s", + pb->published, pb->cnt, pb->errors, plural(pb->errors), pb->bw_incoming, pb->bw_outgoing); } @@ -494,7 +497,7 @@ if (GNET_PROPERTY(dht_publish_debug) > 1) { size_t count = patricia_count(path); g_debug("DHT PUBLISH%s updating roots cache with %zu entr%s near %s", - nid_to_string(&pb->pid), count, 1 == count ? "y" : "ies", + nid_to_string(&pb->pid), count, plural_y(count), kuid_to_hex_string(pb->key)); } @@ -520,8 +523,7 @@ (pb->flags & PB_F_BACKGROUND) ? "background " : "", PUBLISH_VALUE == pb->type ? "to" : "of", pb->published, pb->cnt, - PUBLISH_VALUE == pb->type ? "root" : "item", - 1 == pb->cnt ? "" : "s", + PUBLISH_VALUE == pb->type ? "root" : "item", plural(pb->cnt), pb->key ? kuid_to_hex_string(pb->key) : "<no key>", publish_strerror(code)); } @@ -534,26 +536,24 @@ case PUBLISH_CACHE: if (!(pb->flags & PB_F_SUBORDINATE)) { if (pb->published == pb->cnt) { - gnet_stats_count_general(GNR_DHT_CACHING_SUCCESSFUL, 1); + gnet_stats_inc_general(GNR_DHT_CACHING_SUCCESSFUL); } else if (pb->published > 0) { - gnet_stats_count_general( - GNR_DHT_CACHING_PARTIALLY_SUCCESSFUL, 1); + gnet_stats_inc_general(GNR_DHT_CACHING_PARTIALLY_SUCCESSFUL); } } break; case PUBLISH_VALUE: if (pb->published == pb->cnt) { if (pb->flags & PB_F_BACKGROUND) { - gnet_stats_count_general(GNR_DHT_PUBLISHING_BG_SUCCESSFUL, 1); + gnet_stats_inc_general(GNR_DHT_PUBLISHING_BG_SUCCESSFUL); } else { - gnet_stats_count_general(GNR_DHT_PUBLISHING_SUCCESSFUL, 1); + gnet_stats_inc_general(GNR_DHT_PUBLISHING_SUCCESSFUL); } } else if (pb->published > 0) { if (pb->flags & PB_F_BACKGROUND) { - gnet_stats_count_general(GNR_DHT_PUBLISHING_BG_IMPROVEMENTS, 1); + gnet_stats_inc_general(GNR_DHT_PUBLISHING_BG_IMPROVEMENTS); } else { - gnet_stats_count_general( - GNR_DHT_PUBLISHING_PARTIALLY_SUCCESSFUL, 1); + gnet_stats_inc_general(GNR_DHT_PUBLISHING_PARTIALLY_SUCCESSFUL); } } @@ -582,10 +582,9 @@ if (pb->target.o.child) publish_cancel(pb->target.o.child, FALSE); if (pb->published == pb->cnt) { - gnet_stats_count_general(GNR_DHT_KEY_OFFLOADING_SUCCESSFUL, 1); + gnet_stats_inc_general(GNR_DHT_KEY_OFFLOADING_SUCCESSFUL); } else if (pb->published > 0) { - gnet_stats_count_general( - GNR_DHT_KEY_OFFLOADING_PARTIALLY_SUCCESSFUL, 1); + gnet_stats_inc_general(GNR_DHT_KEY_OFFLOADING_PARTIALLY_SUCCESSFUL); } break; } @@ -627,7 +626,7 @@ * @param callback whether to invoke the callback for value publishing */ void -publish_cancel(publish_t *pb, gboolean callback) +publish_cancel(publish_t *pb, bool callback) { publish_check(pb); @@ -639,7 +638,7 @@ (pb->flags & PB_F_SUBORDINATE) ? "subordinate " : "", (pb->flags & PB_F_BACKGROUND) ? "background " : "", publish_type_to_string(pb->type), - pb->published, pb->cnt, 1 == pb->cnt ? "" : "s", + pb->published, pb->cnt, plural(pb->cnt), kuid_to_hex_string(pb->key)); } @@ -666,14 +665,13 @@ * Expiration timeout on caching requesst. */ static void -publish_cache_expired(cqueue_t *unused_cq, gpointer obj) +publish_cache_expired(cqueue_t *cq, void *obj) { publish_t *pb = obj; - (void) unused_cq; publish_check(pb); - pb->expire_ev = NULL; + cq_zero(cq, &pb->expire_ev); if (GNET_PROPERTY(dht_publish_debug)) g_debug("DHT PUBLISH%s %s%s%s publish of %d value%s for %s expired", @@ -681,7 +679,7 @@ (pb->flags & PB_F_SUBORDINATE) ? "subordinate " : "", (pb->flags & PB_F_BACKGROUND) ? "background " : "", publish_type_to_string(pb->type), - pb->cnt, 1 == pb->cnt ? "" : "s", + pb->cnt, plural(pb->cnt), kuid_to_hex_string(pb->key)); publish_terminate(pb, PUBLISH_E_EXPIRED); @@ -691,19 +689,18 @@ * Expiration timeout for offloading. */ static void -publish_offload_expired(cqueue_t *unused_cq, gpointer obj) +publish_offload_expired(cqueue_t *cq, void *obj) { publish_t *pb = obj; - (void) unused_cq; publish_check(pb); - pb->expire_ev = NULL; + cq_zero(cq, &pb->expire_ev); if (GNET_PROPERTY(dht_publish_debug)) g_debug("DHT PUBLISH%s %s publish of %d key%s to %s expired", nid_to_string(&pb->pid), publish_type_to_string(pb->type), - pb->cnt, 1 == pb->cnt ? "" : "s", + pb->cnt, plural(pb->cnt), knode_to_string(pb->target.o.kn)); publish_terminate(pb, PUBLISH_E_EXPIRED); @@ -713,21 +710,20 @@ * Expiration timeout for STORE. */ static void -publish_store_expired(cqueue_t *unused_cq, gpointer obj) +publish_store_expired(cqueue_t *cq, void *obj) { publish_t *pb = obj; - (void) unused_cq; publish_check(pb); - pb->expire_ev = NULL; + cq_zero(cq, &pb->expire_ev); if (GNET_PROPERTY(dht_publish_debug)) g_debug("DHT PUBLISH%s %s publish of %s expired: " "published to %d/%d root%s", nid_to_string(&pb->pid), publish_type_to_string(pb->type), dht_value_to_string(pb->target.v.value), - pb->published, pb->cnt, 1 == pb->cnt ? "" : "s"); + pb->published, pb->cnt, plural(pb->cnt)); publish_terminate(pb, PUBLISH_E_EXPIRED); } @@ -757,24 +753,23 @@ g_debug("DHT PUBLISH%s B/W incoming=%d bytes, outgoing=%d bytes", nid_to_string(&pb->pid), pb->bw_incoming, pb->bw_outgoing); g_debug("DHT PUBLISH%s published %s%d/%d %s%s (%d error%s)", - nid_to_string(&pb->pid), + nid_to_string(&pb->pid), PUBLISH_VALUE == pb->type ? "to " : "", pb->published, pb->cnt, - PUBLISH_VALUE == pb->type ? "root" : "item", - 1 == pb->cnt ? "" : "s", - pb->errors, 1 == pb->errors ? "" : "s"); + PUBLISH_VALUE == pb->type ? "root" : "item", plural(pb->cnt), + pb->errors, plural(pb->errors)); } /** * @return how many DHT values are held in message block, containing a STORE. */ -static guint8 +static uint8 values_held(pmsg_t *mb) { const void *header = pmsg_start(mb); - guint8 toklen; + uint8 toklen; const void *p; - guint8 result; + uint8 result; g_assert(KDA_MSG_STORE_REQUEST == kademlia_header_get_function(header)); g_assert(pmsg_size(mb) > KDA_HEADER_SIZE + 1); @@ -800,7 +795,7 @@ first_creator_kuid(pmsg_t *mb) { const void *header = pmsg_start(mb); - guint8 toklen; + uint8 toklen; const void *p; g_assert(KDA_MSG_STORE_REQUEST == kademlia_header_get_function(header)); @@ -820,18 +815,16 @@ * Delay expiration. */ static void -publish_delay_expired(cqueue_t *unused_cq, gpointer obj) +publish_delay_expired(cqueue_t *cq, void *obj) { publish_t *pb = obj; - (void) unused_cq; - if (G_UNLIKELY(NULL == publishes)) return; /* Shutdown occurred */ publish_check(pb); - pb->delay_ev = NULL; + cq_zero(cq, &pb->delay_ev); pb->flags &= ~PB_F_DELAYED; publish_iterate(pb); } @@ -888,14 +881,14 @@ * @return TRUE if OK, FALSE if there is a fatal condition on the node that * means we have to stop publishing there. */ -static gboolean +static bool publish_handle_reply(publish_t *pb, const knode_t *kn, - const char *payload, size_t len, pmsg_t *mb, guint16 *code_ptr) + const char *payload, size_t len, pmsg_t *mb, uint16 *code_ptr) { - guint8 published; + uint8 published; const kuid_t *id; bstr_t *bs; - guint8 acks; + uint8 acks; const char *reason; unsigned i = 0; @@ -934,7 +927,7 @@ g_warning("DHT PUBLISH%s STORE ACK from %s has %u status%s " "(expected %u)", nid_to_string(&pb->pid), knode_to_string(kn), - acks, 1 == acks ? "" : "es", published); + acks, plural_es(acks), published); if (acks > published) goto ignore; /* How can remote send us more acks? */ @@ -948,8 +941,8 @@ kuid_t primary; kuid_t secondary; struct { - guint16 code; - guint16 length; + uint16 code; + uint16 length; const char *description; } status; @@ -1064,8 +1057,8 @@ g_warning("DHT PUBLISH%s the STORE_RESPONSE payload (%lu byte%s) " "from %s has %lu byte%s of unparsed trailing data (ignored)", nid_to_string(&pb->pid), - (gulong) len, len == 1 ? "" : "s", knode_to_string(kn), - (gulong) unparsed, 1 == unparsed ? "" : "s"); + (ulong) len, plural(len), knode_to_string(kn), + (ulong) unparsed, plural(unparsed)); } /* FALL THROUGH */ @@ -1104,7 +1097,7 @@ g_warning("DHT PUBLISH%s improper STORE_RESPONSE payload " "(%zu byte%s) from %s: %s%s%s", nid_to_string(&pb->pid), - len, len == 1 ? "" : "s", knode_to_string(kn), reason, + len, plural(len), knode_to_string(kn), reason, bstr_has_error(bs) ? ": " : "", bstr_has_error(bs) ? bstr_error(bs) : ""); @@ -1126,7 +1119,7 @@ * Records the STORE status code returned by the node. */ static void -publish_value_set_store_status(publish_t *pb, const knode_t *kn, guint16 code) +publish_value_set_store_status(publish_t *pb, const knode_t *kn, uint16 code) { size_t count; size_t i; @@ -1155,8 +1148,8 @@ * Is the publish status code indicating that we can re-attempt a STORE * of the same DHT value after some time has passed? */ -static gboolean -publish_status_retryable(guint16 status) +static bool +publish_status_retryable(uint16 status) { switch (status) { case STORE_SC_ERROR: @@ -1207,7 +1200,7 @@ * @param status the STORE status from a previous publish */ static size_t -publish_value_candidates(const lookup_rs_t *rs, const guint16 *status) +publish_value_candidates(const lookup_rs_t *rs, const uint16 *status) { size_t count; size_t i; @@ -1235,7 +1228,7 @@ ***/ static void -pb_freeing_msg(gpointer obj) +pb_freeing_msg(void *obj) { publish_t *pb = obj; publish_check(pb); @@ -1245,7 +1238,7 @@ } static void -pb_msg_sent(gpointer obj, pmsg_t *mb) +pb_msg_sent(void *obj, pmsg_t *mb) { publish_t *pb = obj; publish_check(pb); @@ -1258,7 +1251,7 @@ } static void -pb_msg_dropped(gpointer obj, knode_t *unused_kn, pmsg_t *mb) +pb_msg_dropped(void *obj, knode_t *unused_kn, pmsg_t *mb) { publish_t *pb = obj; @@ -1294,28 +1287,28 @@ if (!(pb->flags & PB_F_SENDING)) { /* Did not send the message -- asynchronous dropping */ if (GNET_PROPERTY(dht_publish_debug) > 2) { - guint8 held = values_held(mb); + uint8 held = values_held(mb); const kuid_t *id = first_creator_kuid(mb); g_debug("DHT PUBLISH%s UDP dropped STORE with %u value%s sk=%s", - nid_to_string(&pb->pid), held, 1 == held ? "" : "s", + nid_to_string(&pb->pid), held, plural(held), kuid_to_hex_string(id)); } } else { pb->flags |= PB_F_UDP_DROP; /* Caller must retry later */ if (GNET_PROPERTY(dht_publish_debug) > 2) { - guint8 held = values_held(mb); + uint8 held = values_held(mb); const kuid_t *id = first_creator_kuid(mb); g_debug("DHT PUBLISH%s " "synchronous UDP drop of STORE with %u value%s sk=%s", - nid_to_string(&pb->pid), held, 1 == held ? "" : "s", + nid_to_string(&pb->pid), held, plural(held), kuid_to_hex_string(id)); } } } static void -pb_rpc_cancelled(gpointer obj, guint32 unused_udata) +pb_rpc_cancelled(void *obj, uint32 unused_udata) { publish_t *pb = obj; @@ -1356,8 +1349,8 @@ } static void -pb_cache_handling_rpc(gpointer obj, enum dht_rpc_ret type, - const knode_t *unused_kn, guint32 unused_udata) +pb_cache_handling_rpc(void *obj, enum dht_rpc_ret type, + const knode_t *unused_kn, uint32 unused_udata) { publish_t *pb = obj; @@ -1391,9 +1384,9 @@ pb->rpc_timeouts++; if (pb->target.c.timeouts++ >= PB_MAX_MSG_RETRY - 1) { if (GNET_PROPERTY(dht_publish_debug) > 1) { - guint8 held = values_held(pb->target.c.pending); + uint8 held = values_held(pb->target.c.pending); g_debug("DHT PUBLISH%s dropping publishing of %u value%s", - nid_to_string(&pb->pid), held, 1 == held ? "" : "s"); + nid_to_string(&pb->pid), held, plural(held)); } pmsg_free(mbp); pb->target.c.timeouts = 0; @@ -1406,12 +1399,12 @@ } } -static gboolean -pb_cache_handle_reply(gpointer obj, const knode_t *kn, - kda_msg_t function, const char *payload, size_t len, guint32 udata) +static bool +pb_cache_handle_reply(void *obj, const knode_t *kn, + kda_msg_t function, const char *payload, size_t len, uint32 udata) { publish_t *pb = obj; - guint32 hop = udata; + uint32 hop = udata; publish_check(pb); g_assert(PUBLISH_CACHE == pb->type); @@ -1483,8 +1476,8 @@ } static void -pb_value_handling_rpc(gpointer obj, enum dht_rpc_ret type, - const knode_t *kn, guint32 unused_udata) +pb_value_handling_rpc(void *obj, enum dht_rpc_ret type, + const knode_t *kn, uint32 unused_udata) { publish_t *pb = obj; @@ -1522,14 +1515,14 @@ } } -static gboolean -pb_value_handle_reply(gpointer obj, const knode_t *kn, - kda_msg_t function, const char *payload, size_t len, guint32 udata) +static bool +pb_value_handle_reply(void *obj, const knode_t *kn, + kda_msg_t function, const char *payload, size_t len, uint32 udata) { publish_t *pb = obj; - guint32 hop = udata; - guint16 code; - gboolean can_iterate = TRUE; + uint32 hop = udata; + uint16 code; + bool can_iterate = TRUE; publish_check(pb); g_assert(PUBLISH_VALUE == pb->type); @@ -1632,7 +1625,7 @@ } static void -pb_iterate(gpointer obj, enum dht_rpc_ret unused_type, guint32 unused_data) +pb_iterate(void *obj, enum dht_rpc_ret unused_type, uint32 unused_data) { publish_t *pb = obj; @@ -1706,7 +1699,7 @@ nid_to_string(&pb->pid), pb->hops, pmsg_size(mb), pb->target.c.timeouts + 1, kuid_to_hex_string(first_creator_kuid(mb)), - held, 1 == held ? "" : "s"); + held, plural(held)); } revent_store(pb->target.c.kn, mb, pb->pid, &publish_cache_ops, pb->hops); @@ -1775,7 +1768,7 @@ * Completion callback for subordinate publishing. */ static void -pb_offload_child_done(gpointer obj, int count, int published, int errors, +pb_offload_child_done(void *obj, int count, int published, int errors, int bw_incoming, int bw_outgoing) { publish_t *pb = obj; @@ -1791,9 +1784,8 @@ "in=%d bytes, out=%d bytes", nid_to_string(&pb->pid), tm_elapsed_f(&now, &pb->start), pb->hops, - published, count, 1 == published ? "" : "s", - errors, 1 == errors ? "" : "s", - bw_incoming, bw_outgoing); + published, count, plural(published), + errors, plural(errors), bw_incoming, bw_outgoing); } pb->target.o.child = NULL; @@ -1849,7 +1841,7 @@ pb->hops++; key = slist_shift(pb->target.o.keys); - valcnt = keys_get_all(key, valvec, G_N_ELEMENTS(valvec)); + valcnt = keys_get_all(key, valvec, N_ITEMS(valvec)); if (GNET_PROPERTY(dht_publish_debug) > 3) { tm_t now; @@ -1858,7 +1850,7 @@ "%g secs, hop %u: offloaded key %s has %d value%s", nid_to_string(&pb->pid), tm_elapsed_f(&now, &pb->start), pb->hops, - kuid_to_hex_string(key), valcnt, 1 == valcnt ? "" : "s"); + kuid_to_hex_string(key), valcnt, plural(valcnt)); } if (valcnt > 0) { @@ -1926,7 +1918,7 @@ publish_value_iterate(publish_t *pb) { pmsg_t *mb; - GSList *sl; + pslist_t *sl; lookup_rc_t *rc; publish_check(pb); @@ -1972,10 +1964,10 @@ sl = kmsg_build_store(rc->token, rc->token_len, &pb->target.v.value, 1); g_assert(sl != NULL); - g_assert(g_slist_length(sl) == 1); + g_assert(pslist_length(sl) == 1); mb = sl->data; - g_slist_free(sl); + pslist_free(sl); /* * Send message to node. @@ -2031,7 +2023,7 @@ g_assert_not_reached(); } -/** +/** * Create a new publish request. * * @param key the primary key for accessing published values @@ -2073,16 +2065,16 @@ "starting %s publishing %s %d %s%s for %s", nid_to_string(&pb->pid), publish_type_to_string(pb->type), PUBLISH_VALUE == pb->type ? "to" : "of", - cnt, PUBLISH_VALUE == pb->type ? "root" : "item", - 1 == cnt ? "" : "s", kuid_to_hex_string(pb->key)); + cnt, PUBLISH_VALUE == pb->type ? "root" : "item", plural(cnt), + kuid_to_hex_string(pb->key)); } - g_hash_table_insert(publishes, &pb->pid, pb); + htable_insert(publishes, &pb->pid, pb); return pb; } -/** +/** * Create a new publish to one-node request. * * This is used to cache values returned by a FIND_VALUE, to the first node @@ -2103,8 +2095,8 @@ lookup_rc_t *target, dht_value_t **vvec, int vcnt) { publish_t *pb; - GSList *msg; - GSList *sl; + pslist_t *msg; + pslist_t *sl; int vheld = 0; /* Make sure all values bear the same primary key */ @@ -2115,27 +2107,27 @@ } g_assert(target != NULL); g_assert(vvec != NULL); - g_assert(vcnt > 0 && vcnt <= MAX_INT_VAL(guint8)); + g_assert(vcnt > 0 && vcnt <= MAX_INT_VAL(uint8)); pb = publish_create(key, PUBLISH_CACHE, vcnt); pb->target.c.kn = knode_refcnt_inc(target->kn); pb->target.c.messages = slist_new(); /* - * Create all the STORE messages we'll need and insert them in a PATRICIA - * keyed by the KUID of the creator of the first value held in each message - * (we know there cannot be any duplicate there, by construction). + * Create all the STORE messages we'll need and record them in a list. + * All messages carry a blank MUID that will be superseded by the RPC + * layer when messages are sent out. */ msg = kmsg_build_store(target->token, target->token_len, vvec, vcnt); - GM_SLIST_FOREACH(msg, sl) { + PSLIST_FOREACH(msg, sl) { pmsg_t *mb = sl->data; slist_append(pb->target.c.messages, mb); vheld += values_held(mb); } - g_slist_free(msg); + pslist_free(msg); g_assert(vheld == vcnt); /* We have all our values in the messages */ @@ -2143,7 +2135,7 @@ g_debug("DHT PUBLISH%s to %s (security token: %u byte%s)", nid_to_string(&pb->pid), knode_to_string(target->kn), target->token_len, - 1 == target->token_len ? "" : "s"); + plural(target->token_len)); } if (GNET_PROPERTY(dht_publish_debug) > 3) { @@ -2158,7 +2150,7 @@ return pb; } -/** +/** * Create a new publish to one-node request. * * This is used to cache values returned by a FIND_VALUE, to the first node @@ -2180,7 +2172,7 @@ { publish_t *pb; - gnet_stats_count_general(GNR_DHT_CACHING_ATTEMPTS, 1); + gnet_stats_inc_general(GNR_DHT_CACHING_ATTEMPTS); pb = publish_cache_internal(key, target, vvec, vcnt); pb->target.c.cb = NULL; @@ -2196,7 +2188,7 @@ static publish_t * publish_subcache(const kuid_t *key, lookup_rc_t *target, dht_value_t **vvec, int vcnt, - publish_subcache_done_t cb, gpointer arg) + publish_subcache_done_t cb, void *arg) { publish_t *pb; @@ -2213,7 +2205,7 @@ * Record security token for an offloading publish. */ static void -publish_offload_set_token(publish_t *pb, guint8 token_len, const void *token) +publish_offload_set_token(publish_t *pb, uint8 token_len, const void *token) { publish_check(pb); g_assert(PUBLISH_OFFLOAD == pb->type); @@ -2228,7 +2220,7 @@ * Got the token for the node. */ static void -pb_token_found(const kuid_t *kuid, const lookup_rs_t *rs, gpointer arg) +pb_token_found(const kuid_t *kuid, const lookup_rs_t *rs, void *arg) { publish_t *pb = arg; lookup_rc_t *rc; @@ -2248,7 +2240,7 @@ "offloading got security token (%d byte%s) for %s", nid_to_string(&pb->pid), tm_elapsed_f(&now, &pb->start), - rc->token_len, 1 == rc->token_len ? "" : "s", + rc->token_len, plural(rc->token_len), knode_to_string(pb->target.o.kn)); } @@ -2259,7 +2251,7 @@ * Could not get the token for the node. */ static void -pb_token_error(const kuid_t *kuid, lookup_error_t error, gpointer arg) +pb_token_error(const kuid_t *kuid, lookup_error_t error, void *arg) { publish_t *pb = arg; @@ -2283,7 +2275,7 @@ */ static void pb_token_lookup_stats(const kuid_t *kuid, - const struct lookup_stats *ls, gpointer arg) + const struct lookup_stats *ls, void *arg) { publish_t *pb = arg; @@ -2306,12 +2298,12 @@ * @return created publishing object. */ publish_t * -publish_offload(const knode_t *kn, GSList *keys) +publish_offload(const knode_t *kn, pslist_t *keys) { publish_t *pb; slist_t *skeys; - GSList *sl; - guint8 toklen; + pslist_t *sl; + uint8 toklen; const void *token; knode_check(kn); @@ -2319,7 +2311,7 @@ skeys = slist_new(); - GM_SLIST_FOREACH(keys, sl) { + PSLIST_FOREACH(keys, sl) { kuid_t *id = sl->data; slist_append(skeys, kuid_get_atom(id)); } @@ -2329,7 +2321,7 @@ pb->target.o.keys = skeys; gnet_stats_count_general(GNR_DHT_KEYS_SELECTED_FOR_OFFLOADING, pb->cnt); - gnet_stats_count_general(GNR_DHT_KEY_OFFLOADING_ATTEMPTS, 1); + gnet_stats_inc_general(GNR_DHT_KEY_OFFLOADING_ATTEMPTS); /* * Before starting to iterate, we need to fetch the security token @@ -2391,7 +2383,7 @@ if (-1 == kuid_cmp3(pb->key, get_our_kuid(), kth_node->id)) { knode_t *ourselves = get_our_knode(); - guint16 status; + uint16 status; if (GNET_PROPERTY(dht_publish_debug)) { g_debug("DHT PUBLISH%s locally publishing %s", @@ -2400,7 +2392,7 @@ } status = values_store(ourselves, pb->target.v.value, TRUE); - gnet_stats_count_general(GNR_DHT_PUBLISHING_TO_SELF, 1); + gnet_stats_inc_general(GNR_DHT_PUBLISHING_TO_SELF); if (status != STORE_SC_OK) { if (GNET_PROPERTY(dht_publish_debug)) { @@ -2433,14 +2425,14 @@ */ publish_t * publish_value(dht_value_t *value, const lookup_rs_t *rs, - publish_cb_t cb, gpointer arg) + publish_cb_t cb, void *arg) { publish_t *pb; g_assert(size_is_positive(rs->path_len)); lookup_result_check(rs); - gnet_stats_count_general(GNR_DHT_PUBLISHING_ATTEMPTS, 1); + gnet_stats_inc_general(GNR_DHT_PUBLISHING_ATTEMPTS); /* * Even though we may have more than KDA_K items in the lookup path, @@ -2469,7 +2461,7 @@ * Initially the array is zeroed because 0 is not a valid store status. */ - pb->target.v.status = walloc0(rs->path_len * sizeof *pb->target.v.status); + WALLOC0_ARRAY(pb->target.v.status, rs->path_len); /* * Before iterating, attempt to publish to ourselves if our node happens @@ -2497,15 +2489,15 @@ */ publish_t * publish_value_background(dht_value_t *value, - const lookup_rs_t *rs, const guint16 *status, - publish_cb_t cb, gpointer arg) + const lookup_rs_t *rs, const uint16 *status, + publish_cb_t cb, void *arg) { publish_t *pb; g_assert(size_is_positive(rs->path_len)); lookup_result_check(rs); - gnet_stats_count_general(GNR_DHT_PUBLISHING_BG_ATTEMPTS, 1); + gnet_stats_inc_general(GNR_DHT_PUBLISHING_BG_ATTEMPTS); /* * Publish to at most the nodes where the status indicates that we can @@ -2519,8 +2511,7 @@ pb->target.v.value = value; pb->target.v.cb = cb; pb->target.v.arg = arg; - pb->target.v.status = wcopy(status, - rs->path_len * sizeof *pb->target.v.status); + pb->target.v.status = WCOPY_ARRAY(status, rs->path_len); pb->flags |= PB_F_BACKGROUND; pb->target.v.idx = publish_value_next_unstored(pb, 0); @@ -2542,17 +2533,17 @@ { g_assert(NULL == publishes); - publishes = g_hash_table_new(nid_hash, nid_equal); + publishes = htable_create_any(nid_hash, nid_hash2, nid_equal); } -/** +/** * Hashtable iteration callback to free the publish_t object held as the key. */ static void -free_publish(gpointer key, gpointer value, gpointer data) +free_publish(const void *key, void *value, void *data) { publish_t *pb = value; - gboolean *exiting = data; + bool *exiting = data; publish_check(pb); g_assert(key == &pb->pid); @@ -2587,10 +2578,10 @@ * @param exiting whether the whole process is about to exit */ void -publish_close(gboolean exiting) +publish_close(bool exiting) { - g_hash_table_foreach(publishes, free_publish, &exiting); - gm_hash_table_destroy_null(&publishes); + htable_foreach(publishes, free_publish, &exiting); + htable_free_null(&publishes); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/publish.h -> gtk-gnutella-1.1.9.tar.bz2/src/dht/publish.h
Changed
@@ -44,11 +44,13 @@ */ void publish_init(void); -void publish_close(gboolean exiting); +void publish_close(bool exiting); + +struct pslist; publish_t *publish_cache(const kuid_t *key, lookup_rc_t *target, dht_value_t **vvec, int vcnt); -publish_t *publish_offload(const knode_t *kn, GSList *keys); +publish_t *publish_offload(const knode_t *kn, struct pslist *keys); #endif /* _dht_publish_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/revent.c -> gtk-gnutella-1.1.9.tar.bz2/src/dht/revent.c
Changed
@@ -63,6 +63,8 @@ #include "knode.h" #include "kmsg.h" +#include "core/nodes.h" + #include "if/gnet_property_priv.h" #include "lib/nid.h" @@ -87,7 +89,7 @@ struct nid rid; /**< ID of RPC event, to spot outdated replies */ struct revent_ops *ops; /**< Callbacks */ struct revent_pmsg_info *pmi; /**< In case the RPC times out */ - guint32 udata; /**< User-supplied information (opaque to us) */ + uint32 udata; /**< User-supplied information (opaque to us) */ }; static inline void @@ -106,7 +108,7 @@ * @param ops user callbacks to invoke during RPC callback */ static struct revent_rpc_info * -revent_rpi_alloc(struct nid id, guint32 udata, struct revent_ops *ops) +revent_rpi_alloc(struct nid id, uint32 udata, struct revent_ops *ops) { struct revent_rpc_info *rpi; @@ -141,7 +143,7 @@ struct revent_ops *ops; /**< Callbacks */ knode_t *kn; /**< The node to which we sent it to (refcounted) */ struct revent_rpc_info *rpi; /**< Attached RPC info (for cancelling) */ - gboolean rpc_done; /**< TRUE if RPC times out before message sent */ + bool rpc_done; /**< TRUE if RPC times out before message sent */ }; static inline void @@ -201,7 +203,7 @@ */ static void revent_get_pair( - struct nid id, knode_t *kn, guint32 udata, struct revent_ops *ops, + struct nid id, knode_t *kn, uint32 udata, struct revent_ops *ops, struct revent_pmsg_info **pmi, struct revent_rpc_info **rpi) { struct revent_rpc_info *r = revent_rpi_alloc(id, udata, ops); @@ -216,11 +218,11 @@ * Free routine for our extended message blocks. */ static void -revent_pmsg_free(pmsg_t *mb, gpointer arg) +revent_pmsg_free(pmsg_t *mb, void *arg) { struct revent_pmsg_info *pmi = arg; struct revent_ops *ops; - gpointer obj; + void *obj; pmi_check(pmi); g_assert(pmsg_is_extended(mb)); @@ -276,7 +278,7 @@ if (*ops->debug > 4) g_debug("DHT %s%s sent %s (%d bytes) to %s, RTT=%u", ops->name, nid_to_string(&pmi->rid), - kmsg_infostr(pmsg_start(mb)), + kmsg_infostr(pmsg_start(mb)), pmsg_written_size(mb), knode_to_string(kn), kn->rtt); } else { knode_t *kn = pmi->kn; @@ -294,7 +296,7 @@ if (ops->msg_dropped) (*ops->msg_dropped)(obj, kn, mb); - + /* * Cancel the RPC, since the message was never sent out... * The MUID is at the start of the message. @@ -329,13 +331,13 @@ revent_rpc_cb( enum dht_rpc_ret type, const knode_t *kn, - const struct gnutella_node *unused_n, + const gnutella_node_t *unused_n, kda_msg_t function, - const char *payload, size_t len, gpointer arg) + const char *payload, size_t len, void *arg) { struct revent_rpc_info *rpi = arg; struct revent_ops *ops; - gpointer obj; + void *obj; (void) unused_n; knode_check(kn); @@ -412,7 +414,7 @@ */ void revent_find_node(knode_t *kn, const kuid_t *kuid, - struct nid id, struct revent_ops *ops, guint32 udata) + struct nid id, struct revent_ops *ops, uint32 udata) { struct revent_pmsg_info *pmi; struct revent_rpc_info *rpi; @@ -447,7 +449,7 @@ void revent_find_value(knode_t *kn, const kuid_t *kuid, dht_value_type_t type, kuid_t **skeys, int scnt, - struct nid id, struct revent_ops *ops, guint32 udata) + struct nid id, struct revent_ops *ops, uint32 udata) { struct revent_pmsg_info *pmi; struct revent_rpc_info *rpi; @@ -479,7 +481,7 @@ */ void revent_store(knode_t *kn, pmsg_t *mb, - struct nid id, struct revent_ops *ops, guint32 udata) + struct nid id, struct revent_ops *ops, uint32 udata) { struct revent_pmsg_info *pmi; struct revent_rpc_info *rpi;
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/revent.h -> gtk-gnutella-1.1.9.tar.bz2/src/dht/revent.h
Changed
@@ -45,19 +45,19 @@ struct revent_ops { const char *name; /**< Caller name, for logging purposes */ const char *udata_name; /**< What is udata, for logging purposes */ - const guint32 *debug; /**< Debug level */ - gpointer (*is_alive)(struct nid id); + const uint32 *debug; /**< Debug level */ + void *(*is_alive)(struct nid id); /* message free routine callbacks */ - void (*freeing_msg)(gpointer obj); - void (*msg_sent)(gpointer obj, pmsg_t *mb); - void (*msg_dropped)(gpointer obj, knode_t *kn, pmsg_t *mb); - void (*rpc_cancelled)(gpointer obj, guint32 udata); + void (*freeing_msg)(void *obj); + void (*msg_sent)(void *obj, pmsg_t *mb); + void (*msg_dropped)(void *obj, knode_t *kn, pmsg_t *mb); + void (*rpc_cancelled)(void *obj, uint32 udata); /* RPC callbacks */ - void (*handling_rpc)(gpointer obj, enum dht_rpc_ret type, - const knode_t *kn, guint32 udata); - gboolean (*handle_reply)(gpointer obj, const knode_t *kn, - kda_msg_t function, const char *payload, size_t len, guint32 udata); - void (*iterate)(gpointer obj, enum dht_rpc_ret type, guint32 udata); + void (*handling_rpc)(void *obj, enum dht_rpc_ret type, + const knode_t *kn, uint32 udata); + bool (*handle_reply)(void *obj, const knode_t *kn, + kda_msg_t function, const char *payload, size_t len, uint32 udata); + void (*iterate)(void *obj, enum dht_rpc_ret type, uint32 udata); }; /* @@ -65,12 +65,12 @@ */ void revent_find_node(knode_t *kn, const kuid_t *kuid, - struct nid id, struct revent_ops *ops, guint32 udata); + struct nid id, struct revent_ops *ops, uint32 udata); void revent_find_value(knode_t *kn, const kuid_t *kuid, dht_value_type_t type, kuid_t **skeys, int scnt, - struct nid id, struct revent_ops *ops, guint32 udata); + struct nid id, struct revent_ops *ops, uint32 udata); void revent_store(knode_t *kn, pmsg_t *mb, - struct nid id, struct revent_ops *ops, guint32 udata); + struct nid id, struct revent_ops *ops, uint32 udata); #endif /* _dht_revent_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/roots.c -> gtk-gnutella-1.1.9.tar.bz2/src/dht/roots.c
Changed
@@ -74,7 +74,7 @@ #include "lib/cq.h" #include "lib/dbmw.h" #include "lib/dbstore.h" -#include "lib/glib-missing.h" +#include "lib/hset.h" #include "lib/map.h" #include "lib/patricia.h" #include "lib/stringify.h" @@ -82,6 +82,7 @@ #include "lib/unsigned.h" #include "lib/vendors.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ #define ROOTS_CALLOUT 5000 /**< Heartbeat every 5 seconds */ @@ -146,15 +147,15 @@ * The structure is serialized first, not written as-is. */ struct rootdata { - guint64 dbkeysKDA_K; /**< SDBM keys pointing to contact information */ + uint64 dbkeysKDA_K; /**< SDBM keys pointing to contact information */ time_t last_update; /**< When we last updated the key set */ - guint8 count; /**< Amount of dbkeys contained */ + uint8 count; /**< Amount of dbkeys contained */ }; /** * Internal counter used to assign DB keys to the contacts we're storing. */ -static guint64 contactid = 1; /* 0 is not a valid key (used as marker) */ +static uint64 contactid = 1; /* 0 is not a valid key (used as marker) */ #define CONTACT_STRUCT_VERSION 1 @@ -167,9 +168,9 @@ vendor_code_t vcode; /**< Vendor code */ time_t first_seen; /**< First seen time */ host_addr_t addr; /**< IP of the node */ - guint16 port; /**< Port of the node */ - guint8 major; /**< Major version */ - guint8 minor; /**< Minor version */ + uint16 port; /**< Port of the node */ + uint8 major; /**< Major version */ + uint8 minor; /**< Minor version */ }; static unsigned targets_managed; /**< Amount of targets held in database */ @@ -215,10 +216,12 @@ if (NULL == rd) { if (dbmw_has_ioerr(db_rootdata)) { - g_warning("DBMW \"%s\" I/O error, bad things could happen...", + s_warning_once_per(LOG_PERIOD_MINUTE, + "DBMW \"%s\" I/O error, bad things could happen...", dbmw_name(db_rootdata)); } else { - g_warning("key %s exists but was not found in DBMW \"%s\"", + s_warning_once_per(LOG_PERIOD_SECOND, + "key %s exists but was not found in DBMW \"%s\"", kuid_to_hex_string(id), dbmw_name(db_rootdata)); } } @@ -230,7 +233,7 @@ * Get contact from database. */ static struct contact * -get_contact(guint64 dbkey, gboolean shout) +get_contact(uint64 dbkey, bool shout) { struct contact *c; @@ -238,10 +241,12 @@ if (NULL == c) { if (dbmw_has_ioerr(db_contact)) { - g_warning("DBMW \"%s\" I/O error, bad things could happen...", + s_warning_once_per(LOG_PERIOD_MINUTE, + "DBMW \"%s\" I/O error, bad things could happen...", dbmw_name(db_contact)); } else if (shout) { - g_warning("key %s exists but was not found in DBMW \"%s\"", + s_warning_once_per(LOG_PERIOD_SECOND, + "key %s exists but was not found in DBMW \"%s\"", uint64_to_string(dbkey), dbmw_name(db_contact)); } } @@ -253,12 +258,12 @@ * Delete contact from database. */ static void -delete_contact(guint64 dbkey) +delete_contact(uint64 dbkey) { g_assert(uint_is_positive(contacts_managed)); contacts_managed--; - gnet_stats_count_general(GNR_DHT_CACHED_ROOTS_HELD, -1); + gnet_stats_dec_general(GNR_DHT_CACHED_ROOTS_HELD); dbmw_delete(db_contact, &dbkey); @@ -294,9 +299,9 @@ * Map iterator callback to reclaim a DB-key value. */ static void -reclaim_dbkey(gpointer u_key, gpointer val, gpointer u_data) +reclaim_dbkey(void *u_key, void *val, void *u_data) { - guint64 *dbkey = val; + uint64 *dbkey = val; (void) u_key; (void) u_data; @@ -308,20 +313,19 @@ * Callout queue callback to expire target. */ static void -roots_expire(cqueue_t *unused_cq, gpointer obj) +roots_expire(cqueue_t *cq, void *obj) { struct rootinfo *ri = obj; - (void) unused_cq; rootinfo_check(ri); g_assert(uint_is_positive(targets_managed)); - ri->expire_ev = NULL; /* Event triggered */ + cq_zero(cq, &ri->expire_ev); /* Event triggered */ delete_rootdata(ri->kuid); patricia_remove(roots, ri->kuid); free_rootinfo(ri); targets_managed--; - gnet_stats_count_general(GNR_DHT_CACHED_KUID_TARGETS_HELD, -1); + gnet_stats_dec_general(GNR_DHT_CACHED_KUID_TARGETS_HELD); } /** @@ -338,13 +342,13 @@ struct rootdata new_rd; struct { kuid_t id; - guint64 dbkey; + uint64 dbkey; } previousKDA_K; map_t *existing; patricia_iter_t *iter; unsigned i; - unsigned new = 0, reused = 0; /* For logging */ - gboolean existed = FALSE; /* For logging */ + unsigned new = 0, reused = 0; /* For logging */ + bool existed = FALSE; /* For logging */ g_assert(nodes != NULL); g_assert(kuid != NULL); @@ -366,7 +370,7 @@ rd = &new_rd; new_rd.count = 0; targets_managed++; - gnet_stats_count_general(GNR_DHT_CACHED_KUID_TARGETS_HELD, +1); + gnet_stats_inc_general(GNR_DHT_CACHED_KUID_TARGETS_HELD); } else { rd = get_rootdata(kuid); if (NULL == rd) { @@ -390,7 +394,7 @@ * are no longer present among the k-closest roots will be deleted. */ - STATIC_ASSERT(G_N_ELEMENTS(rd->dbkeys) == G_N_ELEMENTS(previous)); + STATIC_ASSERT(N_ITEMS(rd->dbkeys) == N_ITEMS(previous)); existing = map_create_patricia(KUID_RAW_BITSIZE); @@ -409,7 +413,7 @@ */ if (NULL == c) - continue; /* I/O error or stale info in ``rd'' */ + continue; /* I/O error or stale info in ``rd'' */ previousi.id = *c->id; /* Struct copy */ previousi.dbkey = rd->dbkeysi; @@ -423,9 +427,9 @@ iter = patricia_metric_iterator_lazy(nodes, kuid, TRUE); i = 0; - while (patricia_iter_has_next(iter) && i < G_N_ELEMENTS(rd->dbkeys)) { + while (patricia_iter_has_next(iter) && i < N_ITEMS(rd->dbkeys)) { knode_t *kn = patricia_iter_next_value(iter); - guint64 *dbkey_ptr; + uint64 *dbkey_ptr; /* * If entry existed in the previous set, we reuse the old contact. @@ -445,13 +449,12 @@ continue; /* I/O error, most probably */ /* Update contact addr:port information, if stale */ - if (c->port != kn->port || !host_addr_equal(c->addr, kn->addr)) { + if (c->port != kn->port || !host_addr_equiv(c->addr, kn->addr)) { c->port = kn->port; c->addr = kn->addr; c->first_seen = tm_time(); /* New node address */ dbmw_write(db_contact, dbkey_ptr, c, sizeof *c); - gnet_stats_count_general( - GNR_DHT_CACHED_ROOTS_CONTACT_REFRESHED, 1); + gnet_stats_inc_general(GNR_DHT_CACHED_ROOTS_CONTACT_REFRESHED); } map_remove(existing, kn->id); /* We reused it */ @@ -459,7 +462,7 @@ reused++; } else { struct contact nc; - guint64 dbkey; + uint64 dbkey; nc.id = kuid_get_atom(kn->id); /* Freed through free_contact() */ nc.vcode = kn->vcode; /* Struct copy */ @@ -470,10 +473,10 @@ nc.first_seen = kn->first_seen; dbkey = contactid++; contacts_managed++; - gnet_stats_count_general(GNR_DHT_CACHED_ROOTS_HELD, +1); + gnet_stats_inc_general(GNR_DHT_CACHED_ROOTS_HELD); dbmw_write(db_contact, &dbkey, &nc, sizeof nc); - + rd->dbkeysi++ = dbkey; new++; } @@ -505,8 +508,7 @@ if (GNET_PROPERTY(dht_roots_debug) > 1) { g_debug("DHT ROOTS cached %u/%u k-closest node%s to %s target %s " "(new=%u, reused=%u, elapsed=%s)", - rd->count, (unsigned) patricia_count(nodes), - 1 == rd->count ? "" : "s", + rd->count, (unsigned) patricia_count(nodes), plural(rd->count), existed ? "existing" : "new", kuid_to_hex_string(kuid), new, reused, existed ? @@ -586,7 +588,7 @@ { struct rootinfo *ri; int filled = 0; - gboolean approximate = TRUE; + bool approximate = TRUE; g_assert(id != NULL); g_assert(kcnt > 0); @@ -600,7 +602,7 @@ */ if (dht_is_active() && keys_within_kball(id)) { - gnet_stats_count_general(GNR_DHT_CACHED_ROOTS_KBALL_LOOKUPS, 1); + gnet_stats_inc_general(GNR_DHT_CACHED_ROOTS_KBALL_LOOKUPS); return 0; } @@ -618,13 +620,13 @@ */ filled = roots_fill_vector(rd, kvec, kcnt, known, NULL, NULL); - gnet_stats_count_general(GNR_DHT_CACHED_ROOTS_EXACT_HITS, 1); + gnet_stats_inc_general(GNR_DHT_CACHED_ROOTS_EXACT_HITS); if (GNET_PROPERTY(dht_roots_debug) > 1) { g_debug("DHT ROOTS exact match for %s (%s), filled %d new node%s", kuid_to_hex_string(id), compact_time(delta_time(tm_time(), ri->last_update)), - filled, 1 == filled ? "" : "s"); + filled, plural(filled)); } /* @@ -733,18 +735,17 @@ struct rootdata *rd = get_rootdata(cri->kuid); int added; - if (NULL == rd) - return 0; /* I/O error or corrupted database */ + if (NULL == rd) /* I/O error or corrupted database */ + goto approximate_done; /* May have filled some nodes above */ added = roots_fill_vector(rd, &kvecfilled, kcnt - filled, aknown, furthest, id); filled += added; if (added > 0) { - gnet_stats_count_general( - GNR_DHT_CACHED_ROOTS_APPROXIMATE_HITS, 1); + gnet_stats_inc_general(GNR_DHT_CACHED_ROOTS_APPROXIMATE_HITS); } else if (NULL == ri) { - gnet_stats_count_general(GNR_DHT_CACHED_ROOTS_MISSES, 1); + gnet_stats_inc_general(GNR_DHT_CACHED_ROOTS_MISSES); } if (GNET_PROPERTY(dht_roots_debug) > 1) { @@ -753,10 +754,10 @@ kuid_to_hex_string(id), kuid_to_hex_string2(cri->kuid), compact_time(delta_time(tm_time(), cri->last_update)), - added, 1 == added ? "" : "s"); + added, plural(added)); } } else if (NULL == ri) { - gnet_stats_count_general(GNR_DHT_CACHED_ROOTS_MISSES, 1); + gnet_stats_inc_general(GNR_DHT_CACHED_ROOTS_MISSES); if (GNET_PROPERTY(dht_roots_debug) > 1) { g_debug("DHT ROOTS no suitable cached entry for %s, " @@ -767,6 +768,8 @@ } } + approximate_done: + if (aknown != known) { patricia_destroy(aknown); } @@ -779,7 +782,7 @@ * Serialization routine for rootdata. */ static void -serialize_rootdata(pmsg_t *mb, gconstpointer data) +serialize_rootdata(pmsg_t *mb, const void *data) { const struct rootdata *rd = data; unsigned i; @@ -806,17 +809,17 @@ * Deserialization routine for rootdata. */ static void -deserialize_rootdata(bstr_t *bs, gpointer valptr, size_t len) +deserialize_rootdata(bstr_t *bs, void *valptr, size_t len) { struct rootdata *rd = valptr; unsigned i; - guint8 version; + uint8 version; g_assert(sizeof *rd == len); bstr_read_u8(bs, &rd->count); bstr_read_time(bs, &rd->last_update); - g_assert(rd->count <= G_N_ELEMENTS(rd->dbkeys)); + g_assert(rd->count <= N_ITEMS(rd->dbkeys)); for (i = 0; i < rd->count; i++) { bstr_read_be64(bs, &rd->dbkeysi); @@ -829,7 +832,7 @@ * Serialization routine for contacts. */ static void -serialize_contact(pmsg_t *mb, gconstpointer data) +serialize_contact(pmsg_t *mb, const void *data) { const struct contact *c = data; @@ -857,11 +860,11 @@ * Deserialization routine for contacts. */ static void -deserialize_contact(bstr_t *bs, gpointer valptr, size_t len) +deserialize_contact(bstr_t *bs, void *valptr, size_t len) { struct contact *c = valptr; kuid_t id; - guint8 version; + uint8 version; g_assert(sizeof *c == len); @@ -900,7 +903,7 @@ * the structure itself. */ static void -free_contact(gpointer valptr, size_t len) +free_contact(void *valptr, size_t len) { struct contact *c = valptr; @@ -913,16 +916,15 @@ * Context for recreate_ri() and remove_orphan(). */ struct recreate_context { - GHashTable *dbkeys; /* Seen DB keys (atoms) */ - guint orphans; /* Orphan keys found */ + hset_t *dbkeys; /* Seen DB keys (atoms) */ + uint orphans; /* Orphan keys found */ }; static void -free_dbkey_kv(gpointer key, gpointer u_value, gpointer u_data) +free_dbkey_kv(const void *key, void *u_data) { - guint64 *dbkey = key; + const uint64 *dbkey = key; - (void) u_value; (void) u_data; atom_uint64_free(dbkey); @@ -932,8 +934,8 @@ * DBMW foreach iterator to recreate keyinfo if not too ancient. * @return TRUE if entry is too ancient and key must be deleted. */ -static gboolean -recreate_ri(gpointer key, gpointer value, size_t u_len, gpointer data) +static bool +recreate_ri(void *key, void *value, size_t u_len, void *data) { struct recreate_context *ctx = data; const struct rootdata *rd = value; @@ -969,14 +971,14 @@ */ for (i = 0; i < rd->count; i++) { - guint64 dbkey = rd->dbkeysi; + uint64 dbkey = rd->dbkeysi; if (dbkey >= contactid) contactid = dbkey + 1; - if (!g_hash_table_lookup(ctx->dbkeys, &dbkey)) { - const guint64 *dbatom = atom_uint64_get(&dbkey); - gm_hash_table_insert_const(ctx->dbkeys, dbatom, uint_to_pointer(1)); + if (!hset_contains(ctx->dbkeys, &dbkey)) { + const uint64 *dbatom = atom_uint64_get(&dbkey); + hset_insert(ctx->dbkeys, dbatom); } } @@ -991,14 +993,14 @@ */ targets_managed++; - gnet_stats_count_general(GNR_DHT_CACHED_KUID_TARGETS_HELD, +1); + gnet_stats_inc_general(GNR_DHT_CACHED_KUID_TARGETS_HELD); contacts_managed += rd->count; gnet_stats_count_general(GNR_DHT_CACHED_ROOTS_HELD, rd->count); if (GNET_PROPERTY(dht_roots_debug) > 3) g_debug("DHT ROOTS retrieved %u closest node%s from %s kept (for %s)", - rd->count, 1 == rd->count ? "" : "s", + rd->count, plural(rd->count), kuid_to_hex_string(id), compact_time(ROOTKEY_LIFETIME / 1000 - d)); return FALSE; @@ -1008,16 +1010,16 @@ * DBMW foreach iterator to remove orphan DB keys. * @return TRUE if entry is an orphan and must be deleted. */ -static gboolean -remove_orphan(gpointer key, gpointer u_value, size_t u_len, gpointer data) +static bool +remove_orphan(void *key, void *u_value, size_t u_len, void *data) { struct recreate_context *ctx = data; - guint64 *dbkey = key; + uint64 *dbkey = key; (void) u_value; (void) u_len; - if (!g_hash_table_lookup(ctx->dbkeys, dbkey)) { + if (!hset_contains(ctx->dbkeys, dbkey)) { ctx->orphans++; return TRUE; } @@ -1028,8 +1030,8 @@ /** * Periodic DB synchronization. */ -static gboolean -roots_sync(gpointer unused_obj) +static bool +roots_sync(void *unused_obj) { (void) unused_obj; @@ -1051,26 +1053,26 @@ if (GNET_PROPERTY(dht_roots_debug)) { count = dbmw_count(db_rootdata); g_debug("DHT ROOTS scanning %u retrieved target KUID%s", - (unsigned) count, 1 == count ? "" : "s"); + (unsigned) count, plural(count)); } - ctx.dbkeys = g_hash_table_new(uint64_mem_hash, uint64_mem_eq); + ctx.dbkeys = hset_create(HASH_KEY_FIXED, sizeof(uint64)); ctx.orphans = 0; dbmw_foreach_remove(db_rootdata, recreate_ri, &ctx); dbmw_foreach_remove(db_contact, remove_orphan, &ctx); - g_hash_table_foreach(ctx.dbkeys, free_dbkey_kv, NULL); - gm_hash_table_destroy_null(&ctx.dbkeys); + hset_foreach(ctx.dbkeys, free_dbkey_kv, NULL); + hset_free_null(&ctx.dbkeys); count = dbmw_count(db_rootdata); if (GNET_PROPERTY(dht_roots_debug)) { g_debug("DHT ROOTS kept %u target KUID%s: targets=%u, contacts=%u", - (unsigned) count, 1 == count ? "" : "s", + (unsigned) count, plural(count), targets_managed, contacts_managed); g_debug("DHT ROOTS stripped %u orphan contact DB-key%s", - ctx.orphans, 1 == ctx.orphans ? "" : "s"); + ctx.orphans, plural(ctx.orphans)); } /* @@ -1093,8 +1095,8 @@ } } - dbstore_shrink(db_rootdata); - dbstore_shrink(db_contact); + dbstore_compact(db_rootdata); + dbstore_compact(db_contact); if (GNET_PROPERTY(dht_roots_debug)) { g_debug("DHT ROOTS first allocated contact DB-key will be %s", @@ -1105,11 +1107,11 @@ /** * Initialize root node caching. */ -G_GNUC_COLD void +void G_COLD roots_init(void) { dbstore_kv_t root_kv = { KUID_RAW_SIZE, NULL, sizeof(struct rootdata), 0 }; - dbstore_kv_t contact_kv = { sizeof(guint64), NULL, sizeof(struct contact), + dbstore_kv_t contact_kv = { sizeof(uint64), NULL, sizeof(struct contact), sizeof(struct contact) + KUID_RAW_SIZE }; dbstore_packing_t root_packing = { serialize_rootdata, deserialize_rootdata, NULL }; @@ -1121,13 +1123,9 @@ g_assert(NULL == db_rootdata); g_assert(NULL == db_contact); - roots_cq = cq_submake("roots", callout_queue, ROOTS_CALLOUT); + roots_cq = cq_main_submake("roots", ROOTS_CALLOUT); roots = patricia_create(KUID_RAW_BITSIZE); - /* Legacy: remove after 0.97 -- RAM, 2011-05-03 */ - dbstore_move(settings_config_dir(), settings_dht_db_dir(), db_rootdata_base); - dbstore_move(settings_config_dir(), settings_dht_db_dir(), db_contact_base); - db_rootdata = dbstore_open(db_rootdata_what, settings_dht_db_dir(), db_rootdata_base, root_kv, root_packing, ROOTKEYS_DB_CACHE_SIZE, kuid_hash, kuid_eq, @@ -1148,7 +1146,7 @@ * Map iterator to free the items held in `roots'. */ static void -roots_free_kv(gpointer u_key, gpointer val, gpointer u_x) +roots_free_kv(void *u_key, void *val, void *u_x) { struct rootinfo *ri = val; @@ -1161,7 +1159,7 @@ /** * Close root node caching. */ -G_GNUC_COLD void +void G_COLD roots_close(void) { if (roots) {
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/routing.c -> gtk-gnutella-1.1.9.tar.bz2/src/dht/routing.c
Changed
@@ -56,6 +56,7 @@ #include <math.h> #include "routing.h" + #include "acct.h" #include "kuid.h" #include "knode.h" @@ -84,23 +85,29 @@ #include "lib/atoms.h" #include "lib/base16.h" +#include "lib/bigint.h" #include "lib/bit_array.h" #include "lib/cq.h" #include "lib/file.h" #include "lib/getdate.h" -#include "lib/glib-missing.h" #include "lib/hashlist.h" +#include "lib/hikset.h" #include "lib/host_addr.h" #include "lib/map.h" -#include "lib/patricia.h" #include "lib/parse.h" +#include "lib/patricia.h" +#include "lib/plist.h" #include "lib/pow2.h" +#include "lib/pslist.h" #include "lib/random.h" #include "lib/stats.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/timestamp.h" +#include "lib/tokenizer.h" #include "lib/vendors.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ #define K_BUCKET_GOOD KDA_K /* Keep k good contacts per k-bucket */ @@ -170,15 +177,15 @@ hash_list_t *good; /**< The good nodes */ hash_list_t *stale; /**< The (possibly) stale nodes */ hash_list_t *pending; /**< The nodes which are awaiting decision */ - GHashTable *all; /**< All nodes in one of the lists */ - GHashTable *c_class; /**< Counts class-C networks in bucket */ + hikset_t *all; /**< All nodes in one of the lists */ + acct_net_t *c_class; /**< Counts class-C networks in bucket */ cevent_t *aliveness; /**< Periodic aliveness checks */ cevent_t *refresh; /**< Periodic bucket refresh */ cevent_t *staleness; /**< Periodic staleness checks */ time_t last_lookup; /**< Last time node lookup was performed */ }; -static GHashTable *c_class; /**< Counts class-C networks in whole table */ +static acct_net_t *c_class; /**< Counts class-C networks in whole table */ /** * The routing table is a binary tree. Each node holds a k-bucket containing @@ -192,8 +199,8 @@ struct kbucket *zero; /**< Child node for "0" prefix */ struct kbucket *one; /**< Child node for "1" prefix */ struct kbnodes *nodes; /**< Node information, in leaf k-buckets */ - guchar depth; /**< Depth in tree (meaningful bits) */ - guchar split_depth; /**< Depth at which we left our space */ + uchar depth; /**< Depth in tree (meaningful bits) */ + uchar split_depth; /**< Depth at which we left our space */ unsigned ours:1; /**< Whether our KUID falls in that bucket */ unsigned no_split:1; /**< Hysteresis: forbid splits for a while */ unsigned frozen_depth:1; /**< Do not split until next bucket refresh */ @@ -203,7 +210,7 @@ * A (locallay determined) size estimate. */ struct ksize { - guint64 estimate; /**< Value (64 bits should be enough!) */ + uint64 estimate; /**< Value (64 bits should be enough!) */ size_t amount; /**< Amount of nodes used to compute estimate */ time_t computed; /**< When did we compute it? */ }; @@ -240,7 +247,7 @@ struct nsize networkK_REGIONS; /**< K_OTHER_SIZE items at most */ statx_t *lookdata; /**< Statistics on lookups */ statx_t *netdata; /**< Statistics on network */ - gboolean dirty; /**< The "good" list was changed */ + bool dirty; /**< The "good" list was changed */ }; /** @@ -248,23 +255,23 @@ */ struct other_size { kuid_t *id; /**< Node who made the estimate (atom) */ - guint64 size; /**< Its own size estimate */ + uint64 size; /**< Its own size estimate */ }; -static gboolean initialized; /**< Whether dht_init() was called */ +static bool initialized; /**< Whether dht_init() was called */ static enum dht_bootsteps old_boot_status = DHT_BOOT_NONE; static struct kbucket *root = NULL; /**< The root of the routing table tree. */ static kuid_t *our_kuid; /**< Our own KUID (atom) */ static struct kstats stats; /**< Statistics on the routing table */ -static const gchar dht_route_file = "dht_nodes"; -static const gchar dht_route_what = "the DHT routing table"; +static const char dht_route_file = "dht_nodes"; +static const char dht_route_what = "the DHT routing table"; static const kuid_t kuid_null; -static void bucket_alive_check(cqueue_t *cq, gpointer obj); -static void bucket_stale_check(cqueue_t *cq, gpointer obj); -static void bucket_refresh(cqueue_t *cq, gpointer obj); +static void bucket_alive_check(cqueue_t *cq, void *obj); +static void bucket_stale_check(cqueue_t *cq, void *obj); +static void bucket_refresh(cqueue_t *cq, void *obj); static void dht_route_retrieve(void); static struct kbucket *dht_find_bucket(const kuid_t *id); @@ -272,7 +279,7 @@ * Define DHT_ROUTING_DEBUG to enable more costly run-time assertions which * make all hash list insertions O(n), basically. */ -#undef DHT_ROUTING_DEBUG +#define DHT_ROUTING_DEBUG static const char * const boot_status_str = { "not bootstrapped yet", /**< DHT_BOOT_NONE */ @@ -291,9 +298,9 @@ { size_t i = status; - STATIC_ASSERT(DHT_BOOT_MAX_VALUE == G_N_ELEMENTS(boot_status_str)); + STATIC_ASSERT(DHT_BOOT_MAX_VALUE == N_ITEMS(boot_status_str)); - if (i >= G_N_ELEMENTS(boot_status_str)) + if (i >= N_ITEMS(boot_status_str)) return "invalid boot status"; return boot_status_stri; @@ -335,7 +342,7 @@ dht_configured_mode_changed(dht_mode_t mode) { dht_mode_t new_mode = mode; - gboolean bootstrap_needed = FALSE; + bool bootstrap_needed = FALSE; switch (mode) { case DHT_MODE_INACTIVE: @@ -367,7 +374,7 @@ /** * Is DHT running in active mode? */ -gboolean +bool dht_is_active(void) { return GNET_PROPERTY(dht_current_mode) == DHT_MODE_ACTIVE; @@ -410,7 +417,7 @@ /** * Is bucket a leaf? */ -static gboolean +static bool is_leaf(const struct kbucket *kb) { g_assert(kb); @@ -427,7 +434,7 @@ struct kbucket *parent = kb->parent; if (!parent) - return deconstify_gpointer(kb); /* Root is its own sibling */ + return deconstify_pointer(kb); /* Root is its own sibling */ return (parent->one == kb) ? parent->zero : parent->one; } @@ -435,7 +442,7 @@ /** * Is the bucket under the tree spanned by the parent? */ -static gboolean +static bool is_under(const struct kbucket *kb, const struct kbucket *parent) { if (parent->depth >= kb->depth) @@ -447,7 +454,7 @@ /** * Is the bucket in our closest subtree? */ -static gboolean +static bool is_among_our_closest(const struct kbucket *kb) { struct kbucket *kours; @@ -502,7 +509,7 @@ /** * Is the k-bucket splitable? */ -static gboolean +static bool is_splitable(const struct kbucket *kb) { g_assert(is_leaf(kb)); @@ -517,7 +524,7 @@ * since they don't need to maintain a full table. On the other hand, * all the buckets are made splitable, even those in the closest subtree. * This will create 2^K_BUCKET_MAX_DEPTH_PASSIVE leaf buckets, enabling - * the sending of initial lookups to nodes that have at least + * the sending of initial lookups to nodes that have at least * K_BUCKET_MAX_DEPTH_PASSIVE common leading bits. */ @@ -574,7 +581,7 @@ /** * Is the DHT "bootstrapped"? */ -gboolean +bool dht_bootstrapped(void) { return DHT_BOOT_COMPLETED == GNET_PROPERTY(dht_boot_status); @@ -583,7 +590,7 @@ /** * Is the DHT "seeded"? */ -gboolean +bool dht_seeded(void) { return root && !is_leaf(root); /* We know more than "k" hosts */ @@ -616,7 +623,7 @@ /** * Compute how many nodes the leaf k-bucket contains for the given status. */ -static guint +static uint list_count(const struct kbucket *kb, knode_status_t status) { hash_list_t *hl; @@ -634,7 +641,7 @@ * Compute how mnay nodes are held with a given status under all the leaves * of the k-bucket. */ -static guint +static uint recursive_list_count(const struct kbucket *kb, knode_status_t status) { if (kb->nodes) @@ -706,26 +713,28 @@ check_leaf_list_consistency( const struct kbucket *kb, hash_list_t *hl, knode_status_t status) { - GList *nodes; - GList *l; - guint count = 0; + plist_t *nodes, *l; + uint count = 0; g_assert(kb->nodes); g_assert(list_for(kb, status) == hl); nodes = hash_list_list(hl); - for (l = nodes; l; l = g_list_next(l)) { - knode_t *kn = l->data; + PLIST_FOREACH(nodes, l) { + knode_t *kn = plist_data(l); knode_check(kn); - g_assert(kn->status == status); + g_assert_log(kn->status == status, + "kn->status=%s, status=%s, kn={%s}", + knode_status_to_string(kn->status), knode_status_to_string(status), + knode_to_string(kn)); count++; } g_assert(count == hash_list_length(hl)); - g_list_free(nodes); + plist_free(nodes); } #else #define check_leaf_list_consistency(a, b, c) @@ -764,7 +773,7 @@ */ static unsigned int -other_size_hash(gconstpointer key) +other_size_hash(const void *key) { const struct other_size *os = key; @@ -772,7 +781,7 @@ } static int -other_size_eq(gconstpointer a, gconstpointer b) +other_size_eq(const void *a, const void *b) { const struct other_size *os1 = a; const struct other_size *os2 = b; @@ -803,7 +812,7 @@ bin_to_hex_buf((char *) &kb->prefix, KUID_RAW_SIZE, kuid, sizeof kuid); - gm_snprintf(buf, sizeof buf, "k-bucket %s (%sdepth %d%s%s)" + str_bprintf(buf, sizeof buf, "k-bucket %s (%sdepth %d%s%s)" " good: %u, stale: %u, pending: %u", kuid, kb->frozen_depth ? "frozen " : "", kb->depth, kb->ours ? ", ours" : "", @@ -824,7 +833,8 @@ g_assert(kb->nodes == NULL); WALLOC(kb->nodes); - kb->nodes->all = g_hash_table_new(kuid_hash, kuid_eq); + kb->nodes->all = hikset_create( + offsetof(knode_t, id), HASH_KEY_FIXED, KUID_RAW_SIZE); kb->nodes->good = hash_list_new(knode_hash, knode_eq); kb->nodes->stale = hash_list_new(knode_hash, knode_eq); kb->nodes->pending = hash_list_new(knode_hash, knode_eq); @@ -852,7 +862,7 @@ kn->status = KNODE_UNKNOWN; knode_free(kn); - gnet_stats_count_general(GNR_DHT_ROUTING_EVICTED_NODES, 1); + gnet_stats_inc_general(GNR_DHT_ROUTING_EVICTED_NODES); } /** @@ -871,14 +881,13 @@ list_update_stats(kn->status, -1); /* Node leaving routing table */ kn->flags &= ~KNODE_F_ALIVE; - kn->status = KNODE_UNKNOWN; /* * Freeing will happen in forget_hashlist_node() when the buckets * being merged are freed up. */ - gnet_stats_count_general(GNR_DHT_ROUTING_EVICTED_NODES, 1); + gnet_stats_inc_general(GNR_DHT_ROUTING_EVICTED_NODES); } /** @@ -897,18 +906,12 @@ * * In all cases (and surely in the first two), it can happen that the * nodes are still referenced somewhere else, and still need to be - * ref-uncounted, leaving all other attributes as-is. Unless the node - * is going to be disposed of, at which time we must force the status - * to KNODE_UNKNOWN for knode_dispose(). + * ref-uncounted, leaving all other attributes as-is. * - * Furthermore, at this point, all the node accounting has been done. + * Furthermore, all the node accounting has already been done. */ - if (DHT_BOOT_SHUTDOWN == GNET_PROPERTY(dht_boot_status)) - kn->status = KNODE_UNKNOWN; /* No longer in route table */ - else if (1 == kn->refcnt) - kn->status = KNODE_UNKNOWN; /* For knode_dispose() */ - + kn->status = KNODE_UNKNOWN; /* No longer in route table */ knode_free(kn); } @@ -949,8 +952,8 @@ * all be empty, it means this table is now referencing freed objects. */ - gm_hash_table_destroy_null(&knodes->all); - acct_net_free(&knodes->c_class); + hikset_free_null(&knodes->all); + acct_net_free_null(&knodes->c_class); cq_cancel(&knodes->aliveness); cq_cancel(&knodes->staleness); cq_cancel(&knodes->refresh); @@ -1090,7 +1093,7 @@ */ static void recursively_apply( - struct kbucket *r, void (*f)(struct kbucket *kb, gpointer u), gpointer u) + struct kbucket *r, void (*f)(struct kbucket *kb, void *u), void *u) { if (r == NULL) return; @@ -1113,11 +1116,18 @@ * if they do not want a sticky KUID. * * It will not be possible to run a Kademlia node with ID = 0. That's OK. + * + * In the advent of an unclean restart (i.e. after a crash), we ignore + * the "sticky_kuid" property though since this is merely the resuming + * of the previously interrupted run. */ gnet_prop_get_storage(PROP_KUID, buf.v, sizeof buf.v); - if (kuid_is_blank(&buf) || !GNET_PROPERTY(sticky_kuid)) { + if ( + kuid_is_blank(&buf) || + (!GNET_PROPERTY(sticky_kuid) && GNET_PROPERTY(clean_restart)) + ) { if (GNET_PROPERTY(dht_debug)) g_debug("generating new DHT node ID"); kuid_random_fill(&buf); gnet_prop_set_storage(PROP_KUID, buf.v, sizeof buf.v); @@ -1133,11 +1143,11 @@ * Notification callback of bucket refreshes. */ static void -bucket_refresh_status(const kuid_t *kuid, lookup_error_t error, gpointer arg) +bucket_refresh_status(const kuid_t *kuid, lookup_error_t error, void *arg) { struct kbucket *okb = arg; /* Original k-bucket (may be gone) */ struct kbucket *kb; /* Current k-bucket where KUID lies */ - gboolean was_split = FALSE; + bool was_split = FALSE; /* * Handle disabling of DHT whilst we were busy looking. @@ -1149,7 +1159,7 @@ return; } - gnet_stats_count_general(GNR_DHT_COMPLETED_BUCKET_REFRESH, 1); + gnet_stats_inc_general(GNR_DHT_COMPLETED_BUCKET_REFRESH); if (0 == GNET_PROPERTY(dht_debug) && 0 == GNET_PROPERTY(dht_lookup_debug)) return; /* Not debugging, we're done */ @@ -1197,7 +1207,7 @@ * Issue a bucket refresh, if needed. */ static void -dht_bucket_refresh(struct kbucket *kb, gboolean forced) +dht_bucket_refresh(struct kbucket *kb, bool forced) { kuid_t id; @@ -1222,7 +1232,7 @@ */ if (list_count(kb, KNODE_GOOD) == K_BUCKET_GOOD && !is_splitable(kb)) { - gnet_stats_count_general(GNR_DHT_DENIED_UNSPLITABLE_BUCKET_REFRESH, 1); + gnet_stats_inc_general(GNR_DHT_DENIED_UNSPLITABLE_BUCKET_REFRESH); if (GNET_PROPERTY(dht_debug)) g_debug("DHT denying %srefresh of non-splitable full %s", forced ? "forced " : "", kbucket_to_string(kb)); @@ -1236,7 +1246,7 @@ } if (forced) - gnet_stats_count_general(GNR_DHT_FORCED_BUCKET_REFRESH, 1); + gnet_stats_inc_general(GNR_DHT_FORCED_BUCKET_REFRESH); /* * Generate a random KUID falling within this bucket's range. @@ -1275,7 +1285,7 @@ }; static void bootstrap_completion_status( - const kuid_t *kuid, lookup_error_t error, gpointer arg); + const kuid_t *kuid, lookup_error_t error, void *arg); /** * Iterative bootstrap step. @@ -1289,7 +1299,7 @@ if (!lookup_find_node(&b->id, NULL, bootstrap_completion_status, b)) { if (GNET_PROPERTY(dht_debug)) g_warning("DHT unable to complete bootstrapping"); - + WFREE(b); gnet_prop_set_guint32_val(PROP_DHT_BOOT_STATUS, DHT_BOOT_NONE); return; @@ -1297,7 +1307,7 @@ if (GNET_PROPERTY(dht_debug)) g_warning("DHT completing bootstrap with KUID %s (%d bit%s)", - kuid_to_hex_string(&b->id), b->bits, 1 == b->bits ? "" : "s"); + kuid_to_hex_string(&b->id), b->bits, plural(b->bits)); } /** @@ -1305,7 +1315,7 @@ */ static void bootstrap_completion_status( - const kuid_t *kuid, lookup_error_t error, gpointer arg) + const kuid_t *kuid, lookup_error_t error, void *arg) { struct bootstrap *b = arg; @@ -1322,7 +1332,7 @@ if (GNET_PROPERTY(dht_debug) || GNET_PROPERTY(dht_lookup_debug)) g_debug("DHT bootstrap with ID %s (%d bit%s) done: %s", - kuid_to_hex_string(kuid), b->bits, 1 == b->bits ? "" : "s", + kuid_to_hex_string(kuid), b->bits, plural(b->bits), lookup_strerror(error)); /* @@ -1330,8 +1340,6 @@ */ if (1 == b->bits) { - WFREE(b); - if (GNET_PROPERTY(dht_debug)) g_debug("DHT now completely bootstrapped"); @@ -1349,6 +1357,7 @@ lookup_find_node(our_kuid, NULL, NULL, NULL); } + WFREE(b); return; } @@ -1383,7 +1392,7 @@ * @param complete TRUE if we managed to look up our KUID successfully */ static void -dht_complete_bootstrap(gboolean complete) +dht_complete_bootstrap(bool complete) { struct bootstrap *b; struct kbucket *ours; @@ -1406,9 +1415,9 @@ * Notification callback of lookup of our own ID during DHT bootstrapping. */ static void -bootstrap_status(const kuid_t *kuid, lookup_error_t error, gpointer unused_arg) +bootstrap_status(const kuid_t *kuid, lookup_error_t error, void *unused_arg) { - gboolean own_id; + bool own_id; (void) unused_arg; @@ -1452,7 +1461,7 @@ dht_complete_bootstrap(LOOKUP_E_OK == error); else { kuid_t id; - gboolean started; + bool started; random_bytes(id.v, sizeof id.v); @@ -1470,7 +1479,7 @@ /** * Is the DHT bootstrapping? */ -static gboolean +static bool dht_is_bootstrapping(void) { return @@ -1546,8 +1555,8 @@ * Runtime (re)-initialization of the DHT. * If UDP or the DHT is not enabled, do nothing. */ -G_GNUC_COLD void -dht_initialize(gboolean post_init) +void G_COLD +dht_initialize(bool post_init) { size_t i; @@ -1587,9 +1596,9 @@ install_bucket_periodic_checks(root, 0); stats.buckets++; - gnet_stats_count_general(GNR_DHT_ROUTING_BUCKETS, +1); + gnet_stats_inc_general(GNR_DHT_ROUTING_BUCKETS); stats.leaves++; - gnet_stats_count_general(GNR_DHT_ROUTING_LEAVES, +1); + gnet_stats_inc_general(GNR_DHT_ROUTING_LEAVES); for (i = 0; i < K_REGIONS; i++) { stats.networki.others = hash_list_new(other_size_hash, other_size_eq); } @@ -1609,7 +1618,6 @@ ulq_init(); token_init(); keys_init(); - values_init(); publish_init(); roots_init(); tcache_init(); @@ -1640,14 +1648,11 @@ gnet_prop_set_guint32_val(PROP_DHT_BOOT_STATUS, DHT_BOOT_NONE); /* - * If the DHT is disabled at startup time, clear the KUID. - * A new one will be re-allocated the next time it is enabled. + * If the DHT is disabled at startup time, do not initialize. */ - if (!GNET_PROPERTY(enable_dht)) { - dht_reset_kuid(); + if (!GNET_PROPERTY(enable_dht)) return; - } dht_initialize(FALSE); /* Do not attempt bootstrap yet */ } @@ -1655,15 +1660,15 @@ /** * Does the specified bucket manage the KUID? */ -static gboolean +static bool dht_bucket_manages(struct kbucket *kb, const kuid_t *id) { int bits = kb->depth; int i; for (i = 0; i < KUID_RAW_SIZE && bits > 0; i++, bits -= 8) { - guchar mask = 0xff; - + uchar mask = 0xff; + if (bits < 8) mask = ~((1 << (8 - bits)) - 1) & 0xff; @@ -1681,10 +1686,10 @@ /** * Given a depth within 0 and K_BUCKET_MAX_DEPTH, locate the byte in the - * KUID and the mask that allows to test that bit. + * KUID and the mask that allows one to test that bit. */ static inline void -kuid_position(guchar depth, int *byt, guchar *mask) +kuid_position(uchar depth, int *byt, uchar *mask) { g_assert(depth <= K_BUCKET_MAX_DEPTH); @@ -1703,8 +1708,8 @@ struct kbucket *result; for (i = 0; i < KUID_RAW_SIZE; i++) { - guchar mask; - guchar val = id->vi; + uchar mask; + uchar val = id->vi; int j; for (j = 0, mask = 0x80; j < 8; j++, mask >>= 1) { @@ -1784,13 +1789,13 @@ /** * Total amount of nodes held in bucket (all lists). */ -static guint +static uint bucket_count(const struct kbucket *kb) { g_assert(kb->nodes); g_assert(kb->nodes->all); - return g_hash_table_size(kb->nodes->all); + return hikset_count(kb->nodes->all); } /** @@ -1799,10 +1804,10 @@ static void check_leaf_bucket_consistency(const struct kbucket *kb) { - guint total; - guint good; - guint stale; - guint pending; + uint total; + uint good; + uint stale; + uint pending; g_assert(is_leaf(kb)); @@ -1818,6 +1823,38 @@ check_leaf_list_consistency(kb, kb->nodes->pending, KNODE_PENDING); } +static void +bucket_node_set_status(void *data, void *udata) +{ + knode_t *kn = data; + knode_status_t status = pointer_to_int(udata); + + knode_check(kn); + + kn->status = status; +} + +/** + * Force status of all the nodes held in the list. + */ +static void +bucket_list_set_status(hash_list_t *hl, knode_status_t status) +{ + hash_list_foreach(hl, bucket_node_set_status, int_to_pointer(status)); +} + +/** + * Reset the status to all the nodes held in the bucket to match that of + * the list they belong to. + */ +static void +bucket_reset_node_status(const struct kbucket *kb) +{ + bucket_list_set_status(kb->nodes->good, KNODE_GOOD); + bucket_list_set_status(kb->nodes->stale, KNODE_STALE); + bucket_list_set_status(kb->nodes->pending, KNODE_PENDING); +} + /** * Context for split_among() */ @@ -1825,24 +1862,24 @@ struct kbucket *zero; struct kbucket *one; int byte; - guchar mask; + uchar mask; }; /** * Hash table iterator for bucket splitting. */ static void -split_among(gpointer key, gpointer value, gpointer user_data) +split_among(void *value, void *user_data) { - kuid_t *id = key; + const kuid_t *id; knode_t *kn = value; struct node_balance *nb = user_data; struct kbucket *target; hash_list_t *hl; knode_check(kn); - g_assert(id == kn->id); + id = kn->id; target = (id->vnb->byte & nb->mask) ? nb->one : nb->zero; if (GNET_PROPERTY(dht_debug) > 1) @@ -1855,7 +1892,7 @@ g_assert(hash_list_length(hl) < list_maxsize_for(kn->status)); hash_list_append(hl, knode_refcnt_inc(kn)); - g_hash_table_insert(target->nodes->all, kn->id, kn); + hikset_insert_key(target->nodes->all, &kn->id); c_class_update_count(kn, target, +1); /* @@ -1911,7 +1948,7 @@ { struct kbucket *one, *zero; int byt; - guchar mask; + uchar mask; struct node_balance balance; g_assert(kb); @@ -1921,6 +1958,8 @@ check_leaf_list_consistency(kb, kb->nodes->stale, KNODE_STALE); check_leaf_list_consistency(kb, kb->nodes->pending, KNODE_PENDING); + gnet_stats_inc_general(GNR_DHT_BUCKET_SPLIT); + if (GNET_PROPERTY(dht_debug)) g_debug("DHT splitting %s from %s subtree", kbucket_to_string(kb), @@ -1987,12 +2026,21 @@ balance.byte = byt; balance.mask = mask; - g_hash_table_foreach(kb->nodes->all, split_among, &balance); + hikset_foreach(kb->nodes->all, split_among, &balance); g_assert(bucket_count(kb) == bucket_count(zero) + bucket_count(one)); free_node_lists(kb); /* Parent bucket is now empty */ + /* + * Because forget_hashlist_node() forcefully resets the status of nodes + * to KNODE_UNKNOWN, we need to make sure we reset the status of all the + * nodes in the buckets to match that of the list they belong to. + */ + + bucket_reset_node_status(kb->one); + bucket_reset_node_status(kb->zero); + g_assert(NULL == kb->nodes); /* No longer a leaf node */ g_assert(kb->one); g_assert(kb->zero); @@ -2007,8 +2055,8 @@ stats.leaves++; /* +2 - 1 == +1 */ gnet_stats_count_general(GNR_DHT_ROUTING_BUCKETS, +2); - gnet_stats_count_general(GNR_DHT_ROUTING_LEAVES, +1); - + gnet_stats_inc_general(GNR_DHT_ROUTING_LEAVES); + if (stats.max_depth < kb->depth + 1) { stats.max_depth = kb->depth + 1; gnet_stats_set_general(GNR_DHT_ROUTING_MAX_DEPTH, stats.max_depth); @@ -2025,7 +2073,7 @@ */ static void add_node_internal(struct kbucket *kb, - knode_t *kn, knode_status_t status, gboolean is_new) + knode_t *kn, knode_status_t status, bool is_new) { hash_list_t *hl = list_for(kb, status); @@ -2034,7 +2082,7 @@ g_assert(kn->status == status); hash_list_append(hl, knode_refcnt_inc(kn)); - g_hash_table_insert(kb->nodes->all, kn->id, kn); + hikset_insert_key(kb->nodes->all, &kn->id); c_class_update_count(kn, kb, +1); if (GNET_PROPERTY(dht_debug) > 2) @@ -2068,17 +2116,17 @@ * * @return TRUE if we added the node to the table. */ -static gboolean -dht_add_node_to_bucket(knode_t *kn, struct kbucket *kb, gboolean traffic) +static bool +dht_add_node_to_bucket(knode_t *kn, struct kbucket *kb, bool traffic) { - gboolean added = FALSE; - guint good; - guint stale; + bool added = FALSE; + uint good; + uint stale; knode_check(kn); g_assert(is_leaf(kb)); g_assert(kb->nodes->all != NULL); - g_assert(!g_hash_table_lookup(kb->nodes->all, kn->id)); + g_assert(!hikset_contains(kb->nodes->all, kn->id)); /* * Not enough good entries for the bucket, add at tail of list @@ -2109,7 +2157,7 @@ while (0 == stale && is_splitable(kb)) { int byt; - guchar mask; + uchar mask; dht_split_bucket(kb); kuid_position(kb->depth, &byt, &mask); @@ -2153,15 +2201,25 @@ static knode_t * move_node(struct kbucket *kb, knode_t *kn) { + /* + * It is no longer possible to move nodes around now that we use an + * hikset to store nodes by KUID: when we return from WMOVE, the structure + * still references an address that is invalid and has potentially been + * freed. We would have to revert to a classic hash table if we were + * to re-enable moving nodes around in memory. + * --RAM, 2012-04-30 + */ +#if 0 if (1 == knode_refcnt(kn)) { knode_t *moved = WMOVE(kn); if (moved != kn) { - g_hash_table_remove(kb->nodes->all, moved->id); - g_hash_table_insert(kb->nodes->all, moved->id, moved); + /* Replace value with ``moved'' */ + hikset_insert_key(kb->nodes->all, &moved->id); return moved; } } - +#endif + (void) kb; return kn; } @@ -2257,15 +2315,14 @@ if (elapsed >= alive_period()) { if (GNET_PROPERTY(dht_debug)) { g_debug("DHT pinging promoted node (last seen %s)", - short_time(elapsed)); + short_time_ascii(elapsed)); } if (dht_lazy_rpc_ping(selected)) { - gnet_stats_count_general( - GNR_DHT_ROUTING_PINGED_PROMOTED_NODES, 1); + gnet_stats_inc_general(GNR_DHT_ROUTING_PINGED_PROMOTED_NODES); } } - gnet_stats_count_general(GNR_DHT_ROUTING_PROMOTED_PENDING_NODES, 1); + gnet_stats_inc_general(GNR_DHT_ROUTING_PROMOTED_PENDING_NODES); } } @@ -2277,17 +2334,20 @@ * * @return TRUE if we found a collision. */ -static gboolean -clashing_nodes(const knode_t *kn1, const knode_t *kn2, gboolean verifying) +static bool +clashing_nodes(const knode_t *kn1, const knode_t *kn2, bool verifying, + const char *where) { - if (!host_addr_equal(kn1->addr, kn2->addr) || kn1->port != kn2->port) { + g_assert(kuid_eq(kn1->id, kn2->id)); + + if (!host_addr_equiv(kn1->addr, kn2->addr) || kn1->port != kn2->port) { if (GNET_PROPERTY(dht_debug)) { - g_warning("DHT %scollision on node %s (also at %s)", + g_warning("DHT %scollision on node %s (also at %s) in %s()", verifying ? "verification " : "", knode_to_string(kn1), - host_addr_port_to_string(kn2->addr, kn2->port)); + host_addr_port_to_string(kn2->addr, kn2->port), where); } - gnet_stats_count_general(GNR_DHT_KUID_COLLISIONS, 1); + gnet_stats_inc_general(GNR_DHT_KUID_COLLISIONS); return TRUE; } @@ -2302,7 +2362,7 @@ { hash_list_t *hl; knode_t *tkn; - gboolean was_good; + bool was_good; knode_check(kn); g_assert(kb); @@ -2310,7 +2370,7 @@ check_leaf_bucket_consistency(kb); - tkn = g_hash_table_lookup(kb->nodes->all, kn->id); + tkn = hikset_lookup(kb->nodes->all, kn->id); if (NULL == tkn) return; @@ -2321,7 +2381,7 @@ */ if (tkn != kn) { - if (clashing_nodes(tkn, kn, FALSE)) + if (clashing_nodes(tkn, kn, FALSE, G_STRFUNC)) return; } @@ -2333,7 +2393,7 @@ */ if (kn->flags & KNODE_F_FIREWALLED) - gnet_stats_count_general(GNR_DHT_ROUTING_EVICTED_FIREWALLED_NODES, 1); + gnet_stats_inc_general(GNR_DHT_ROUTING_EVICTED_FIREWALLED_NODES); /* * From now on, only work on "tkn" which is known to be in the @@ -2344,7 +2404,7 @@ hl = list_for(kb, tkn->status); if (hash_list_remove(hl, tkn)) { - g_hash_table_remove(kb->nodes->all, tkn->id); + hikset_remove(kb->nodes->all, tkn->id); c_class_update_count(tkn, kb, -1); if (GNET_PROPERTY(dht_debug) > 2) @@ -2372,7 +2432,7 @@ hash_list_t *hl; size_t maxsize; struct kbucket *kb; - gboolean in_table; + bool in_table; knode_status_t old; knode_t *tkn; @@ -2385,7 +2445,7 @@ g_assert(kb->nodes); g_assert(kb->nodes->all); - tkn = g_hash_table_lookup(kb->nodes->all, kn->id); + tkn = hikset_lookup(kb->nodes->all, kn->id); in_table = NULL != tkn; /* @@ -2428,8 +2488,27 @@ */ if (tkn != kn) { - if (clashing_nodes(tkn, kn, FALSE)) + if (clashing_nodes(tkn, kn, FALSE, G_STRFUNC)) { + /* + * Because there is a clash, and `tkn' is in the routing table, + * then necessarily `kn' cannot be as well. We need to verify + * whether the old `tkn' node is still alive, if no verfication + * is pending and we have not recently seen traffic from it. + */ + + g_assert(KNODE_UNKNOWN == kn->status); /* Not in routing table */ + + if (delta_time(tm_time(), tkn->last_seen) < ALIVE_PERIOD) { + if (GNET_PROPERTY(dht_debug)) { + g_debug("DHT however we recently got traffic from %s", + knode_to_string(tkn)); + } + } else if (!(tkn->flags & KNODE_F_VERIFYING)) { + dht_verify_node(tkn, kn, new != KNODE_STALE); + } + return; + } } /* @@ -2450,7 +2529,7 @@ is_splitable(kb) ) { int byt; - guchar mask; + uchar mask; if (GNET_PROPERTY(dht_debug)) { g_debug("DHT splitting %s to make room in good list for %s", @@ -2509,7 +2588,7 @@ host_addr_port_to_string(removed->addr, removed->port), kbucket_to_string(kb)); } else { - g_hash_table_remove(kb->nodes->all, removed->id); + hikset_remove(kb->nodes->all, removed->id); c_class_update_count(removed, kb, -1); if (GNET_PROPERTY(dht_debug)) @@ -2551,7 +2630,7 @@ { hash_list_t *hl; struct kbucket *kb; - guint good_length; + uint good_length; knode_check(kn); @@ -2562,13 +2641,13 @@ g_assert(is_leaf(kb)); if (kn->status == KNODE_UNKNOWN) { - g_assert(NULL == g_hash_table_lookup(kb->nodes->all, kn->id)); + g_assert(!hikset_contains(kb->nodes->all, kn->id)); return; } hl = list_for(kb, kn->status); - g_assert(NULL != g_hash_table_lookup(kb->nodes->all, kn->id)); + g_assert(hikset_contains(kb->nodes->all, kn->id)); /* * If the "good" list is not full, try promoting the node to it. @@ -2580,7 +2659,7 @@ kn->status != KNODE_GOOD && (good_length = hash_list_length(kb->nodes->good)) < K_BUCKET_GOOD ) { - guint stale_length = hash_list_length(kb->nodes->stale); + uint stale_length = hash_list_length(kb->nodes->stale); if (stale_length + good_length >= K_BUCKET_GOOD) { if (kn->status == KNODE_STALE) { @@ -2609,8 +2688,8 @@ * @return TRUE if we added the node to the table, FALSE if we rejected it or * if it was already present. */ -static gboolean -record_node(knode_t *kn, gboolean traffic) +static bool +record_node(knode_t *kn, bool traffic) { struct kbucket *kb; @@ -2634,11 +2713,11 @@ g_warning("DHT rejecting clashing node %s: bears our KUID", knode_to_string(kn)); if (!is_my_address_and_port(kn->addr, kn->port)) - gnet_stats_count_general(GNR_DHT_OWN_KUID_COLLISIONS, 1); + gnet_stats_inc_general(GNR_DHT_OWN_KUID_COLLISIONS); return FALSE; } - g_assert(!g_hash_table_lookup(kb->nodes->all, kn->id)); + g_assert(!hikset_contains(kb->nodes->all, kn->id)); /* * Protect against hosts from a class C network presenting too many @@ -2653,7 +2732,7 @@ kuid_to_hex_string(kn->id), host_addr_port_to_string(kn->addr, kn->port), kbucket_to_string(kb)); - gnet_stats_count_general(GNR_DHT_ROUTING_REJECTED_NODE_BUCKET_QUOTA, 1); + gnet_stats_inc_general(GNR_DHT_ROUTING_REJECTED_NODE_BUCKET_QUOTA); return FALSE; } @@ -2668,7 +2747,7 @@ "too many hosts from same class-C network in routing table", kuid_to_hex_string(kn->id), host_addr_port_to_string(kn->addr, kn->port)); - gnet_stats_count_general(GNR_DHT_ROUTING_REJECTED_NODE_GLOBAL_QUOTA, 1); + gnet_stats_inc_general(GNR_DHT_ROUTING_REJECTED_NODE_GLOBAL_QUOTA); return FALSE; } @@ -2732,7 +2811,7 @@ g_assert(kb->nodes != NULL); g_assert(kb->nodes->all != NULL); - return g_hash_table_lookup(kb->nodes->all, kuid); + return hikset_lookup(kb->nodes->all, kuid); } /** @@ -2762,7 +2841,7 @@ kb = dht_find_bucket(kn->id); - if (NULL == g_hash_table_lookup(kb->nodes->all, kn->id)) + if (!hikset_contains(kb->nodes->all, kn->id)) return; /* Node not held in routing table */ dht_set_node_status(kn, KNODE_STALE); @@ -2786,7 +2865,7 @@ }; static void -compute_max_depth(struct kbucket *kb, gpointer u) +compute_max_depth(struct kbucket *kb, void *u) { struct max_depth *md = u; @@ -2811,12 +2890,15 @@ /** * Build a list of all nodes from the two buckets belonging to specified list. */ -static GSList * +static pslist_t * merged_node_list(knode_status_t status, const struct kbucket *kb1, const struct kbucket *kb2) { hash_list_iter_t *iter; - GSList *result = NULL; + pslist_t *result = NULL; + + check_leaf_list_consistency(kb1, list_for(kb1, status), status); + check_leaf_list_consistency(kb2, list_for(kb2, status), status); iter = hash_list_iterator(list_for(kb1, status)); while (hash_list_iter_has_next(iter)) { @@ -2825,7 +2907,7 @@ knode_check(kn); g_assert(status == kn->status); - result = g_slist_prepend(result, kn); + result = pslist_prepend(result, kn); } hash_list_iter_release(&iter); @@ -2836,7 +2918,7 @@ knode_check(kn); g_assert(status == kn->status); - result = g_slist_prepend(result, kn); + result = pslist_prepend(result, kn); } hash_list_iter_release(&iter); @@ -2854,23 +2936,23 @@ * @param nodes a single linked-list of nodes to insert */ static void -insert_nodes(struct kbucket *kb, knode_status_t status, GSList *nodes) +insert_nodes(struct kbucket *kb, knode_status_t status, pslist_t *nodes) { hash_list_t *hl; size_t maxsize; - GSList *sl; - gboolean forget = FALSE; + pslist_t *sl; + bool forget = FALSE; hl = list_for(kb, status); maxsize = list_maxsize_for(status); g_assert(0 == hash_list_length(hl)); - GM_SLIST_FOREACH(nodes, sl) { + PSLIST_FOREACH(nodes, sl) { knode_t *kn = sl->data; knode_check(kn); - g_assert(!g_hash_table_lookup(kb->nodes->all, kn->id)); + g_assert(!hikset_contains(kb->nodes->all, kn->id)); /* * Regardless of whether we forget the node or add it to the merged @@ -2890,7 +2972,7 @@ knode_to_string(kn), kbucket_to_string(kb)); } forget_merged_node(kn); - gnet_stats_count_general(GNR_DHT_ROUTING_EVICTED_QUOTA_NODES, 1); + gnet_stats_inc_general(GNR_DHT_ROUTING_EVICTED_QUOTA_NODES); continue; } @@ -2914,13 +2996,13 @@ * * @return TRUE if merging was completed, FALSE otherwise. */ -static gboolean -dht_merge_siblings(struct kbucket *kb, gboolean forced) +static bool +dht_merge_siblings(struct kbucket *kb, bool forced) { struct kbucket *sibling; unsigned good_nodes; struct kbucket *parent; - GSList *nodes; + pslist_t *nodes; g_assert(is_leaf(kb)); @@ -2947,7 +3029,7 @@ if (GNET_PROPERTY(dht_debug)) { g_debug("DHT merging %s%s with its sibling (total of %u good node%s)", forced ? "(forced) " : "", - kbucket_to_string(kb), good_nodes, 1 == good_nodes ? "" :"s"); + kbucket_to_string(kb), good_nodes, plural(good_nodes)); } /* @@ -2969,7 +3051,9 @@ if (forced) { parent->frozen_depth = TRUE; - gnet_stats_count_general(GNR_DHT_FORCED_BUCKET_MERGE, 1); + gnet_stats_inc_general(GNR_DHT_FORCED_BUCKET_MERGE); + } else { + gnet_stats_inc_general(GNR_DHT_BUCKET_MERGE); } /* @@ -2978,9 +3062,9 @@ nodes = merged_node_list(KNODE_GOOD, kb, sibling); if (forced) - nodes = g_slist_sort(nodes, knode_dead_probability_cmp); + nodes = pslist_sort(nodes, knode_dead_probability_cmp); insert_nodes(parent, KNODE_GOOD, nodes); - g_slist_free(nodes); + pslist_free(nodes); /* * Stale and pending nodes are sorted by increasing "dead probability", @@ -2989,14 +3073,14 @@ */ nodes = merged_node_list(KNODE_STALE, kb, sibling); - nodes = g_slist_sort(nodes, knode_dead_probability_cmp); + nodes = pslist_sort(nodes, knode_dead_probability_cmp); insert_nodes(parent, KNODE_STALE, nodes); - g_slist_free(nodes); + pslist_free(nodes); nodes = merged_node_list(KNODE_PENDING, kb, sibling); - nodes = g_slist_sort(nodes, knode_dead_probability_cmp); + nodes = pslist_sort(nodes, knode_dead_probability_cmp); insert_nodes(parent, KNODE_PENDING, nodes); - g_slist_free(nodes); + pslist_free(nodes); /* * Now that the nodes have been propagated, install periodic checks. @@ -3021,7 +3105,7 @@ stats.leaves--; /* -2 + 1 == -1 */ gnet_stats_count_general(GNR_DHT_ROUTING_BUCKETS, -2); - gnet_stats_count_general(GNR_DHT_ROUTING_LEAVES, -1); + gnet_stats_dec_general(GNR_DHT_ROUTING_LEAVES); if (stats.max_depth == kb->depth) { /* @@ -3036,13 +3120,17 @@ } /* - * Free old leaves. + * Free old leaves, which will reset status of nodes to KNODE_UNKNOWN. */ free_bucket(kb); free_bucket(sibling); - check_leaf_bucket_consistency(parent); + /* + * REstore proper status for the nodes we kept in the merged bucket. + */ + + bucket_reset_node_status(parent); if (GNET_PROPERTY(dht_debug)) { g_debug("DHT merged buckets into %s max depth: %d", @@ -3114,14 +3202,12 @@ * Periodic check of stale contacts. */ static void -bucket_stale_check(cqueue_t *unused_cq, gpointer obj) +bucket_stale_check(cqueue_t *cq, void *obj) { struct kbucket *kb = obj; hash_list_iter_t *iter; - GSList *to_remove = NULL; - GSList *sl; - - (void) unused_cq; + pslist_t *to_remove = NULL; + pslist_t *sl; g_assert(is_leaf(kb)); @@ -3129,6 +3215,7 @@ * Re-instantiate the periodic callback for next time. */ + cq_zero(cq, &kb->nodes->staleness); install_stale_check(kb); if (0 == list_count(kb, KNODE_STALE)) @@ -3158,41 +3245,39 @@ g_assert(KNODE_STALE == kn->status); if (knode_still_alive_probability(kn) < ALIVE_PROBA_LOW_THRESH) { - to_remove = g_slist_prepend(to_remove, kn); + to_remove = pslist_prepend(to_remove, kn); } else if (knode_can_recontact(kn)) { if (dht_lazy_rpc_ping(kn)) { - gnet_stats_count_general(GNR_DHT_ALIVE_PINGS_TO_STALE_NODES, 1); + gnet_stats_inc_general(GNR_DHT_ALIVE_PINGS_TO_STALE_NODES); } } } hash_list_iter_release(&iter); if (to_remove != NULL && GNET_PROPERTY(dht_debug)) { - unsigned count = g_slist_length(to_remove); + unsigned count = pslist_length(to_remove); g_debug("DHT selected %u stale node%s to remove (likely dead)", - count, 1 == count ? "" : "s"); + count, plural(count)); } - GM_SLIST_FOREACH(to_remove, sl) { + PSLIST_FOREACH(to_remove, sl) { knode_t *kn = sl->data; dht_remove_node_from_bucket(kn, kb); } - g_slist_free(to_remove); + pslist_free(to_remove); } /** * Periodic check of live contacts. */ static void -bucket_alive_check(cqueue_t *unused_cq, gpointer obj) +bucket_alive_check(cqueue_t *cq, void *obj) { struct kbucket *kb = obj; hash_list_iter_t *iter; time_t now = tm_time(); - guint good_and_stale; - - (void) unused_cq; + uint good_and_stale; g_assert(is_leaf(kb)); @@ -3200,6 +3285,7 @@ * Re-instantiate the periodic callback for next time. */ + cq_zero(cq, &kb->nodes->aliveness); install_alive_check(kb); if (!GNET_PROPERTY(is_inet_connected)) { @@ -3235,13 +3321,13 @@ good_and_stale = list_count(kb, KNODE_GOOD) + list_count(kb, KNODE_STALE); if (good_and_stale < K_BUCKET_GOOD) { - guint missing = K_BUCKET_GOOD - good_and_stale; - guint old_count; - guint new_count; + uint missing = K_BUCKET_GOOD - good_and_stale; + uint old_count; + uint new_count; if (GNET_PROPERTY(dht_debug)) { g_debug("DHT missing %u good node%s in %s", - missing, 1 == missing ? "" : "s", kbucket_to_string(kb)); + missing, plural(missing), kbucket_to_string(kb)); } do { @@ -3254,10 +3340,10 @@ } while (missing > 0 && new_count > old_count); if (GNET_PROPERTY(dht_debug)) { - guint promoted = K_BUCKET_GOOD - good_and_stale - missing; + uint promoted = K_BUCKET_GOOD - good_and_stale - missing; if (promoted) { g_debug("DHT promoted %u pending node%s in %s", - promoted, 1 == promoted ? "" : "s", kbucket_to_string(kb)); + promoted, plural(promoted), kbucket_to_string(kb)); } } } @@ -3308,12 +3394,12 @@ d < ALIVE_PERIOD_MAX && knode_still_alive_probability(kn) > ALIVE_PROBA_HIGH_THRESH ) { - gnet_stats_count_general(GNR_DHT_ALIVE_PINGS_SKIPPED, 1); + gnet_stats_inc_general(GNR_DHT_ALIVE_PINGS_SKIPPED); continue; } if (dht_lazy_rpc_ping(kn)) { - gnet_stats_count_general(GNR_DHT_ALIVE_PINGS_TO_GOOD_NODES, 1); + gnet_stats_inc_general(GNR_DHT_ALIVE_PINGS_TO_GOOD_NODES); } } hash_list_iter_release(&iter); @@ -3334,14 +3420,14 @@ if ((kn->flags & KNODE_F_SHUTDOWNING) && knode_can_recontact(kn)) { if (dht_lazy_rpc_ping(kn)) { - gnet_stats_count_general( - GNR_DHT_ALIVE_PINGS_TO_SHUTDOWNING_NODES, 1); + gnet_stats_inc_general( + GNR_DHT_ALIVE_PINGS_TO_SHUTDOWNING_NODES); } } } hash_list_iter_release(&iter); - gnet_stats_count_general(GNR_DHT_BUCKET_ALIVE_CHECK, 1); + gnet_stats_inc_general(GNR_DHT_BUCKET_ALIVE_CHECK); /* * In case both this bucket and its sibling are depleted enough, consider @@ -3356,14 +3442,14 @@ * Periodic bucket refresh. */ static void -bucket_refresh(cqueue_t *unused_cq, gpointer obj) +bucket_refresh(cqueue_t *cq, void *obj) { struct kbucket *kb = obj; time_delta_t elapsed; g_assert(is_leaf(kb)); - (void) unused_cq; + cq_zero(cq, &kb->nodes->refresh); /* * To adapt the size of the routing table to the local usage of the node @@ -3458,20 +3544,16 @@ * @param kuid the KUID that was looked for * @param amount the amount of k-closest nodes they wanted */ -static guint64 +static uint64 dht_compute_size_estimate_1(patricia_t *pt, const kuid_t *kuid, int amount) { patricia_iter_t *iter; size_t i; size_t count; - guint32 squares = 0; + uint32 squares = 0; kuid_t *id; - kuid_t dsum; - kuid_t sq; - kuid_t sparseness; - kuid_t r; - kuid_t max; - kuid_t estimate; + bigint_t dsum, sq, sparseness, r, max, estimate, tmp; + uint64 result; #define NCNT K_LOCAL_ESTIMATE @@ -3489,36 +3571,38 @@ * S = sum of i*i for i = 1..NCNT * * D/S represents the sparseness of the results. If all results were - * at distance 1, 2, 3... etc, then D/S = 1. The greater D/S, the more - * sparse the results are. + * at distance 1, 2, 3... etc, then D/S = 1. The greater D/S, the sparser + * the results are. * * The DHT size is then estimated by 2^160 / (D/S). */ iter = patricia_metric_iterator_lazy(pt, kuid, TRUE); i = 1; - kuid_zero(&dsum); - kuid_zero(&max); - kuid_not(&max); /* Max amount: 2^160 - 1 */ + bigint_init(&dsum, KUID_RAW_SIZE + 1); + bigint_init(&tmp, KUID_RAW_SIZE + 1); - STATIC_ASSERT(MAX_INT_VAL(guint32) >= NCNT * NCNT * NCNT); - STATIC_ASSERT(MAX_INT_VAL(guint8) >= NCNT); + STATIC_ASSERT(MAX_INT_VAL(uint32) >= NCNT * NCNT * NCNT); + STATIC_ASSERT(MAX_INT_VAL(uint8) >= NCNT); while (patricia_iter_next(iter, (void *) &id, NULL, NULL)) { - kuid_t di; - gboolean saturated = FALSE; - - kuid_xor_distance(&di, id, kuid); + kuid_t dix; + bigint_t dist; + bool saturated = FALSE; + + kuid_xor_distance(&dix, id, kuid); + bigint_use(&dist, dix.v, sizeof dix.v); + bigint_copy(&tmp, &dist); /* Result has 168 bits, not 160 */ /* - * If any of these operations report a carry, then we're saturating + * If any of these operations reports a carry, then we're saturating * and it's time to leave our computations: the hosts are too sparse * and the distance is getting too large. */ - if (0 != kuid_mult_u8(&di, i)) { + if (0 != bigint_mult_u8(&tmp, i)) { saturated = TRUE; - } else if (kuid_add(&dsum, &di)) { + } else if (bigint_add(&dsum, &tmp)) { saturated = TRUE; } @@ -3526,7 +3610,8 @@ i++; if (saturated) { - kuid_copy(&dsum, &max); + bigint_zero(&dsum); + bigint_set_nth_bit(&dsum, 160); /* 2^160 */ break; /* DHT size too small or incomplete routing table */ } if (i > NCNT) @@ -3540,35 +3625,49 @@ #undef NCNT - kuid_set32(&sq, squares); - kuid_divide(&dsum, &sq, &sparseness, &r); + bigint_init(&sq, KUID_RAW_SIZE + 1); + bigint_init(&sparseness, KUID_RAW_SIZE + 1); + bigint_init(&r, KUID_RAW_SIZE + 1); + bigint_init(&estimate, KUID_RAW_SIZE + 1); + + bigint_set32(&sq, squares); + bigint_divide(&dsum, &sq, &sparseness, &r); if (GNET_PROPERTY(dht_debug)) { - double ds = kuid_to_double(&dsum); - double s = kuid_to_double(&sq); + double ds = bigint_to_double(&dsum); + double s = bigint_to_double(&sq); g_debug("DHT target KUID is %s (%d node%s wanted, %u used)", - kuid_to_hex_string(kuid), amount, 1 == amount ? "" : "s", + kuid_to_hex_string(kuid), amount, plural(amount), (unsigned) (i - 1)); - g_debug("DHT dsum is %s = %F", kuid_to_hex_string(&dsum), ds); + g_debug("DHT dsum is %s = %F", bigint_to_hex_string(&dsum), ds); g_debug("DHT squares is %s = %F (%d)", - kuid_to_hex_string(&sq), s, squares); + bigint_to_hex_string(&sq), s, squares); g_debug("DHT sparseness over %u nodes is %s = %F (%F)", - (unsigned) i - 1, kuid_to_hex_string(&sparseness), - kuid_to_double(&sparseness), ds / s); + (unsigned) i - 1, bigint_to_hex_string(&sparseness), + bigint_to_double(&sparseness), ds / s); } - /* - * We can't divide 2^160 by the sparseness because we can't represent - * that number in a KUID. We're going to divide 2^160 - 1 instead, which - * won't make much of a difference, and we add one (for ourselves). - */ + bigint_init(&max, KUID_RAW_SIZE + 1); + bigint_set_nth_bit(&max, 160); /* 2^160 */ - kuid_divide(&max, &sparseness, &estimate, &r); - kuid_add_u8(&estimate, 1); + bigint_divide(&max, &sparseness, &estimate, &r); + bigint_add_u8(&estimate, 1); + + result = bigint_to_uint64(&estimate); + if G_UNLIKELY(0 == result) + result = (uint64) -1; /* Overflowed, very unlikely on Earth */ + + bigint_free(&tmp); + bigint_free(&estimate); + bigint_free(&max); + bigint_free(&r); + bigint_free(&sparseness); + bigint_free(&sq); + bigint_free(&dsum); - return kuid_to_guint64(&estimate); + return result; } /** @@ -3580,7 +3679,7 @@ * @param pt the PATRICIA trie holding the lookup path * @param kuid the KUID that was looked for */ -static guint64 +static uint64 dht_compute_size_estimate_2(patricia_t *pt, const kuid_t *kuid) { patricia_iter_t *iter; @@ -3592,7 +3691,7 @@ size_t i; size_t b_min; size_t b_max; - guint64 estimate; + uint64 estimate; double bits, weight, total_weight; /* @@ -3667,7 +3766,7 @@ if (GNET_PROPERTY(dht_debug)) { g_debug("DHT target KUID is %s (%u node%s in path, retained %u)", - kuid_to_hex_string(kuid), (unsigned) count, 1 == count ? "" : "s", + kuid_to_hex_string(kuid), (unsigned) count, plural(count), (unsigned) retained); } @@ -3682,7 +3781,7 @@ cumulative0 = prefix0; - for (b_min = 0, i = 1; i < G_N_ELEMENTS(prefix); i++) { + for (b_min = 0, i = 1; i < N_ITEMS(prefix); i++) { cumulativei = cumulativei - 1 + prefixi; if (0 == b_min && cumulativei >= retained / 2) b_min = i; @@ -3721,11 +3820,11 @@ } bits /= total_weight; - estimate = (guint64) (retained * pow(2.0, bits)); + estimate = (uint64) (retained * pow(2.0, bits)); if (GNET_PROPERTY(dht_debug)) { g_debug("DHT average common prefix is %f bits over %zu node%s", - bits, retained, 1 == retained ? "" : "s"); + bits, retained, plural(retained)); } return estimate; @@ -3740,18 +3839,16 @@ * @param pt the PATRICIA trie holding the lookup path * @param kuid the KUID that was looked for */ -static guint64 +static uint64 dht_compute_size_estimate_3(patricia_t *pt, const kuid_t *kuid) { patricia_iter_t *iter; size_t count; size_t intervals; - kuid_t prev; - kuid_t accum; - kuid_t remain; - kuid_t first; - kuid_t avg; + kuid_t first, prev; + bigint_t val, accum, remain, avg; kuid_t *id; + uint64 result; /* * Here is the algorithm used to compute the size estimate. @@ -3773,16 +3870,22 @@ iter = patricia_metric_iterator_lazy(pt, kuid, TRUE); count = intervals = 0; - kuid_zero(&accum); + + bigint_init(&accum, KUID_RAW_SIZE + 1); + bigint_init(&remain, KUID_RAW_SIZE + 1); + bigint_init(&avg, KUID_RAW_SIZE + 1); + bigint_init(&val, KUID_RAW_SIZE + 1); while (patricia_iter_next(iter, (void *) &id, NULL, NULL)) { if (count++ > 0) { - kuid_t dist; - kuid_xor_distance(&dist, &prev, id); /* Between consecutive IDs */ - kuid_add(&accum, &dist); + kuid_t di; + bigint_t dist; + kuid_xor_distance(&di, &prev, id); /* Between consecutive IDs */ + bigint_use(&dist, di.v, sizeof di.v); + bigint_add(&accum, &dist); intervals++; - kuid_xor_distance(&dist, &first, id); /* With first ID */ - kuid_add(&accum, &dist); + kuid_xor_distance(&di, &first, id); /* With first ID */ + bigint_add(&accum, &dist); intervals += count; } else { kuid_copy(&first, id); @@ -3807,14 +3910,14 @@ if (count == 1) return 1 + patricia_count(pt); - kuid_set32(&prev, intervals + 1); - kuid_divide(&accum, &prev, &avg, &remain); + bigint_set32(&val, intervals + 1); + bigint_divide(&accum, &val, &avg, &remain); if (GNET_PROPERTY(dht_debug)) { g_debug("DHT average distance of %u KUIDs near %s is %s (%F)", (unsigned) count - 1, - kuid_to_hex_string(kuid), kuid_to_hex_string2(&avg), - kuid_to_double(&avg)); + kuid_to_hex_string(kuid), bigint_to_hex_string(&avg), + bigint_to_double(&avg)); } /* @@ -3823,12 +3926,19 @@ * population is therefore 2^160 / average_distance. */ - kuid_zero(&prev); - kuid_not(&prev); /* Max amount we can represent: 2^160 - 1 */ + bigint_zero(&val); + bigint_set_nth_bit(&val, 160); /* 2^160 */ - kuid_divide(&prev, &avg, &accum, &remain); + bigint_divide(&val, &avg, &accum, &remain); - return kuid_to_guint64(&accum); + result = bigint_to_uint64(&accum); + + bigint_free(&accum); + bigint_free(&remain); + bigint_free(&avg); + bigint_free(&val); + + return result; } /** @@ -3838,30 +3948,58 @@ * @param pt the PATRICIA trie holding the lookup path * @param kuid the KUID that was looked for * @param amount the amount of k-closest nodes they wanted + * + * @return the average size estimate, 0 if we think we cannot properly + * estimate the size given the sample. */ -static guint64 +static uint64 dht_compute_size_estimate(patricia_t *pt, const kuid_t *kuid, int amount) { - guint64 estimate_1, estimate_2, estimate_3; + uint64 estimate3, sum; + uint i; + statx_t *st; + double mean, sdev; - estimate_1 = dht_compute_size_estimate_1(pt, kuid, amount); - estimate_2 = dht_compute_size_estimate_2(pt, kuid); - estimate_3 = dht_compute_size_estimate_3(pt, kuid); + estimate0 = dht_compute_size_estimate_1(pt, kuid, amount); + estimate1 = dht_compute_size_estimate_2(pt, kuid); + estimate2 = dht_compute_size_estimate_3(pt, kuid); if (GNET_PROPERTY(dht_debug)) { - g_debug("DHT estimated size with method #1: %s", - uint64_to_string(estimate_1)); - g_debug("DHT estimated size with method #2: %s", - uint64_to_string(estimate_2)); - g_debug("DHT estimated size with method #3: %s", - uint64_to_string(estimate_3)); + g_debug("DHT estimated size with method #1: %s (LW method)", + uint64_to_string(estimate0)); + g_debug("DHT estimated size with method #2: %s (prefix size)", + uint64_to_string(estimate1)); + g_debug("DHT estimated size with method #3: %s (avg node distance)", + uint64_to_string(estimate2)); } /* - * Average, will not overflow, 2^64 is a lot of nodes... + * Make sure we do not have points so dispersed that the computed + * average is meaningless: if the mean is smaller than 1 standard + * deviation, we are probably in a situation where our estimation + * is meaningless (because then the chance to have the actual mean + * be negative is too high, and we know that the size is a strictly + * positive number). */ - return (estimate_1 + estimate_2 + estimate_3) / 3; + st = statx_make_nodata(); + + for (sum = 0, i = 0; i < N_ITEMS(estimate); i++) { + statx_add(st, (double) estimatei); + sum = uint64_saturate_add(sum, estimatei); + } + + mean = statx_avg(st); + sdev = statx_sdev(st); + + if (GNET_PROPERTY(dht_debug)) { + g_debug("DHT estimated size: mean = %F, sdev = %F, stderr = %F %s", + mean, sdev, statx_stderr(st), mean > sdev ? "OK" : "REFUSED"); + } + + statx_free(st); + + return mean > sdev ? sum / N_ITEMS(estimate) : 0; } /** @@ -3870,7 +4008,7 @@ static void report_estimated_size(void) { - guint64 size = dht_size(); + uint64 size = dht_size(); if (GNET_PROPERTY(dht_debug)) { g_debug("DHT averaged global size estimate: %s " @@ -3891,33 +4029,32 @@ { time_t now = tm_time(); int i; - guint64 estimate; + uint64 estimate; int n; - guint64 min = 0; - guint64 max = MAX_INT_VAL(guint64); - guint64 avg_stderr; + uint64 min = 0; + uint64 max = MAX_INT_VAL(uint64); + uint64 avg_stderr; statx_t *st; /* - * Only retain the points that fall within one standard deviation of + * Only retain the points that fall within 2 standard deviations of * the mean to remove obvious aberration. */ n = statx_n(stats.lookdata); if (n > 1) { - guint64 sdev = (guint64) statx_sdev(stats.lookdata); - guint64 avg = (guint64) statx_avg(stats.lookdata); - if (sdev < avg) - min = avg - sdev; - max = avg + sdev; - avg_stderr = sdev / sqrt(n); + uint64 sdev = (uint64) statx_sdev(stats.lookdata); + uint64 avg = (uint64) statx_avg(stats.lookdata); + if (2 * sdev < avg) + min = avg - 2 * sdev; + max = avg + 2 * sdev; } st = statx_make_nodata(); for (i = 0; i < K_REGIONS; i++) { if (delta_time(now, stats.lookupsi.computed) <= ESTIMATE_LIFE) { - guint64 val = stats.lookupsi.estimate; + uint64 val = stats.lookupsi.estimate; if (val >= min && val <= max) { statx_add(st, (double) val); } @@ -3938,8 +4075,12 @@ if (dht_is_active() || statx_n(st) == 0) statx_add(st, stats.local.estimate); - estimate = (guint64) statx_avg(st); - avg_stderr = statx_n(st) > 1 ? (guint64) statx_stderr(st) : 0; + g_assert(statx_n(st) != 0); /* Hence we can compute the average */ + + estimate = (uint64) statx_avg(st); + avg_stderr = statx_n(st) > 1 ? (uint64) statx_stderr(st) : 0; + + gnet_stats_set_general(GNR_DHT_ESTIMATED_SIZE_STDERR, avg_stderr); stats.average.estimate = estimate; stats.average.computed = now; @@ -3969,8 +4110,8 @@ "(%d point%s, skipped %d), k-ball furthest: %d bit%s", uint64_to_string(stats.average.estimate), uint64_to_string2(avg_stderr), - count, 1 == count ? "" : "s", n + 1 - count, - stats.kball_furthest, 1 == stats.kball_furthest ? "" : "s"); + count, plural(count), n + 1 - count, + stats.kball_furthest, plural(stats.kball_furthest)); if (n > 1) { g_debug( "DHT collected average is %.0f (%d points), avg_stderr = %g", @@ -3995,9 +4136,9 @@ dht_update_subspace_size_estimate( patricia_t *pt, const kuid_t *kuid, int amount) { - guint8 subspace; + uint8 subspace; time_t now = tm_time(); - guint64 estimate; + uint64 estimate; size_t kept; /* @@ -4013,8 +4154,8 @@ subspace = kuid_leading_u8(kuid); - STATIC_ASSERT(sizeof(guint8) == sizeof subspace); - STATIC_ASSERT(K_REGIONS >= MAX_INT_VAL(guint8)); + STATIC_ASSERT(sizeof(uint8) == sizeof subspace); + STATIC_ASSERT(K_REGIONS >= MAX_INT_VAL(uint8)); /* * If subspace is that of our KUID, we have more precise information @@ -4039,15 +4180,20 @@ if (stats.lookupssubspace.computed != 0) statx_remove(stats.lookdata, (double) stats.lookupssubspace.estimate); - stats.lookupssubspace.estimate = estimate; - stats.lookupssubspace.computed = now; - stats.lookupssubspace.amount = kept; + if (estimate != 0) { + stats.lookupssubspace.estimate = estimate; + stats.lookupssubspace.computed = now; + stats.lookupssubspace.amount = kept; - statx_add(stats.lookdata, (double) estimate); + statx_add(stats.lookdata, (double) estimate); + } else { + stats.lookupssubspace.computed = 0; + } if (GNET_PROPERTY(dht_debug)) { g_debug("DHT subspace \"%02x\" estimate is %s (over %u/%d nodes)", - subspace, uint64_to_string(estimate), (unsigned) kept, amount); + subspace, 0 == estimate ? "refused" : uint64_to_string(estimate), + (unsigned) kept, amount); } update_cached_size_estimate(); @@ -4111,13 +4257,13 @@ knode_t **kvec; int kcnt; patricia_t *pt; - guint64 estimate; - gboolean alive = TRUE; + uint64 estimate; + bool alive = TRUE; if (!dht_enabled()) return; - kvec = walloc(K_LOCAL_ESTIMATE * sizeof(knode_t *)); + WALLOC_ARRAY(kvec, K_LOCAL_ESTIMATE); kcnt = dht_fill_closest(our_kuid, kvec, K_LOCAL_ESTIMATE, NULL, TRUE); pt = patricia_create(KUID_RAW_BITSIZE); @@ -4161,7 +4307,7 @@ stats.local.estimate = estimate; stats.local.amount = K_LOCAL_ESTIMATE; - wfree(kvec, K_LOCAL_ESTIMATE * sizeof(knode_t *)); + WFREE_ARRAY(kvec, K_LOCAL_ESTIMATE); patricia_destroy(pt); /* @@ -4179,11 +4325,14 @@ dht_get_size_estimate(void) { static kuid_t size_estimate; + bigint_t size; - if (stats.average.computed == 0) + if G_UNLIKELY(0 == stats.average.computed) dht_update_size_estimate(); - kuid_set64(&size_estimate, stats.average.estimate); + bigint_use(&size, size_estimate.v, sizeof size_estimate.v); + bigint_set64(&size, stats.average.estimate); + return &size_estimate; } @@ -4194,7 +4343,7 @@ int dht_get_kball_furthest(void) { - if (stats.average.computed == 0) + if G_UNLIKELY(0 == stats.average.computed) dht_update_size_estimate(); return stats.kball_furthest; @@ -4204,24 +4353,24 @@ * Record new DHT size estimate from another node. */ void -dht_record_size_estimate(knode_t *kn, kuid_t *size) +dht_record_size_estimate(knode_t *kn, bigint_t *size) { - guint8 subspace; + uint8 subspace; struct other_size *os; - gconstpointer key; + const void *key; struct other_size *data; hash_list_t *hl; - guint64 estimate; + uint64 estimate; knode_check(kn); g_assert(size); - STATIC_ASSERT(sizeof(guint8) == sizeof subspace); - STATIC_ASSERT(K_REGIONS >= MAX_INT_VAL(guint8)); + STATIC_ASSERT(sizeof(uint8) == sizeof subspace); + STATIC_ASSERT(K_REGIONS >= MAX_INT_VAL(uint8)); subspace = kuid_leading_u8(kn->id); hl = stats.networksubspace.others; - estimate = kuid_to_guint64(size); + estimate = bigint_to_uint64(size); WALLOC(os); os->id = kuid_get_atom(kn->id); @@ -4229,7 +4378,7 @@ if (hash_list_find(hl, os, &key)) { /* This should happen only infrequently */ other_size_free(os); - data = deconstify_gpointer(key); + data = deconstify_pointer(key); if (data->size != estimate) { statx_remove(stats.netdata, (double) data->size); data->size = estimate; @@ -4255,7 +4404,7 @@ * For local user information, compute the probable DHT size, consisting * of the average of all the recent sizes we have collected plus our own. */ -guint64 +uint64 dht_size(void) { return statx_n(stats.netdata) > 0 ? @@ -4267,7 +4416,7 @@ * GList sort callback. */ static int -distance_to(gconstpointer a, gconstpointer b, gpointer user_data) +distance_to(const void *a, const void *b, void *user_data) { const knode_t *ka = a; const knode_t *kb = b; @@ -4293,11 +4442,9 @@ static int fill_closest_in_bucket( const kuid_t *id, struct kbucket *kb, - knode_t **kvec, int kcnt, const kuid_t *exclude, gboolean alive) + knode_t **kvec, int kcnt, const kuid_t *exclude, bool alive) { - GList *nodes = NULL; - GList *good; - GList *l; + plist_t *nodes = NULL, *good, *l; int added; int available = 0; @@ -4314,7 +4461,7 @@ good = hash_list_list(kb->nodes->good); - while (good) { + while (good != NULL) { knode_t *kn = good->data; knode_check(kn); @@ -4324,11 +4471,11 @@ (!exclude || !kuid_eq(kn->id, exclude)) && (!alive || (kn->flags & KNODE_F_ALIVE)) ) { - nodes = g_list_prepend(nodes, kn); + nodes = plist_prepend(nodes, kn); available++; } - good = g_list_remove(good, kn); + good = plist_remove(good, kn); } /* @@ -4343,9 +4490,9 @@ */ if (!alive) { - GList *stale = hash_list_list(kb->nodes->stale); + plist_t *stale = hash_list_list(kb->nodes->stale); - while (stale) { + while (stale != NULL) { knode_t *kn = stale->data; knode_check(kn); @@ -4355,11 +4502,11 @@ (!exclude || !kuid_eq(kn->id, exclude)) && knode_still_alive_probability(kn) >= ALIVE_PROBA_LOW_THRESH ) { - nodes = g_list_prepend(nodes, kn); + nodes = plist_prepend(nodes, kn); available++; } - stale = g_list_remove(stale, kn); + stale = plist_remove(stale, kn); } } @@ -4368,10 +4515,10 @@ */ if (available < kcnt) { - GList *pending = hash_list_list(kb->nodes->pending); + plist_t *pending = hash_list_list(kb->nodes->pending); time_t now = tm_time(); - while (pending) { + while (pending != NULL) { knode_t *kn = pending->data; knode_check(kn); @@ -4387,11 +4534,11 @@ ) ) ) { - nodes = g_list_prepend(nodes, kn); + nodes = plist_prepend(nodes, kn); available++; } - pending = g_list_remove(pending, kn); + pending = plist_remove(pending, kn); } } @@ -4400,15 +4547,15 @@ * insert them in the vector. */ - nodes = g_list_sort_with_data(nodes, distance_to, deconstify_gpointer(id)); + nodes = plist_sort_with_data(nodes, distance_to, deconstify_pointer(id)); - for (added = 0, l = nodes; l && kcnt; l = g_list_next(l)) { + for (added = 0, l = nodes; l && kcnt; l = plist_next(l)) { *kvec++ = l->data; kcnt--; added++; } - g_list_free(nodes); + plist_free(nodes); return added; } @@ -4431,10 +4578,10 @@ recursively_fill_closest_from( const kuid_t *id, struct kbucket *kb, - knode_t **kvec, int kcnt, const kuid_t *exclude, gboolean alive) + knode_t **kvec, int kcnt, const kuid_t *exclude, bool alive) { int byt; - guchar mask; + uchar mask; struct kbucket *closest; int added; @@ -4479,7 +4626,7 @@ int dht_fill_closest( const kuid_t *id, - knode_t **kvec, int kcnt, const kuid_t *exclude, gboolean alive) + knode_t **kvec, int kcnt, const kuid_t *exclude, bool alive) { struct kbucket *kb; int added; @@ -4577,15 +4724,15 @@ random_bytes(id.v, sizeof id.v); kb = dht_find_bucket(&id); - kn = hash_list_tail(list_for(kb, KNODE_GOOD)); /* Recently seen */ + kn = hash_list_random(list_for(kb, KNODE_GOOD)); - if (NULL == kn || map_contains(seen, &kb->prefix)) { - i--; + if (NULL == kn || map_contains(seen, kn->id)) { + i--; /* Stay at same position in next loop */ continue; /* Bad luck: empty list or already seen */ } gnet_host_set(&hveci, kn->addr, kn->port); - map_insert(seen, &kb->prefix, NULL); + map_insert(seen, kn->id, NULL); } map_destroy(seen); @@ -4606,7 +4753,7 @@ /* * Special lookup types are ignored: - * + * * LOOKUP_REFRESH are our own periodic bucket refresh. No need to record * the last time they happen. * @@ -4643,7 +4790,7 @@ * Store all good nodes from a leaf bucket. */ static void -dht_store_leaf_bucket(struct kbucket *kb, gpointer u) +dht_store_leaf_bucket(struct kbucket *kb, void *u) { FILE *f = u; hash_list_iter_t *iter; @@ -4732,7 +4879,7 @@ * Free bucket node. */ static void -dht_free_bucket(struct kbucket *kb, gpointer unused_u) +dht_free_bucket(struct kbucket *kb, void *unused_u) { (void) unused_u; @@ -4744,8 +4891,8 @@ * * @param exiting whether gtk-gnutella is exiting altogether */ -G_GNUC_COLD void -dht_close(gboolean exiting) +void G_COLD +dht_close(bool exiting) { size_t i; @@ -4759,6 +4906,14 @@ dht_route_store(); /* + * We remember the old boot status so as to not restart from scratch + * if the DHT is re-enabled again. + */ + + old_boot_status = GNET_PROPERTY(dht_boot_status); + gnet_prop_set_guint32_val(PROP_DHT_BOOT_STATUS, DHT_BOOT_SHUTDOWN); + + /* * Since we're shutting down the route table, we also need to shut down * the RPC and lookups, which rely on the routing table. */ @@ -4769,15 +4924,11 @@ stable_close(); tcache_close(); roots_close(); - values_close(); keys_close(); dht_rpc_close(); token_close(); kmsg_close(); - old_boot_status = GNET_PROPERTY(dht_boot_status); - gnet_prop_set_guint32_val(PROP_DHT_BOOT_STATUS, DHT_BOOT_SHUTDOWN); - recursively_apply(root, dht_free_bucket, NULL); root = NULL; kuid_atom_free_null(&our_kuid); @@ -4788,7 +4939,7 @@ } statx_free(stats.lookdata); statx_free(stats.netdata); - acct_net_free(&c_class); + acct_net_free_null(&c_class); ZERO(&stats); /* Clear all stats */ gnet_prop_set_guint32_val(PROP_DHT_BOOT_STATUS, DHT_BOOT_NONE); @@ -4807,6 +4958,7 @@ struct addr_verify { knode_t *old; knode_t *new; + unsigned new_is_alive:1; /* Whether `new' is alive (sent us traffic) */ }; /** @@ -4823,9 +4975,9 @@ dht_addr_verify_cb( enum dht_rpc_ret type, const knode_t *kn, - const struct gnutella_node *unused_n, + const gnutella_node_t *unused_n, kda_msg_t unused_function, - const gchar *unused_payload, size_t unused_len, gpointer arg) + const char *unused_payload, size_t unused_len, void *arg) { struct addr_verify *av = arg; @@ -4843,13 +4995,30 @@ * unless it is firewalled. */ - if (GNET_PROPERTY(dht_debug)) - g_warning("DHT verification failed for node %s: %s", + if (GNET_PROPERTY(dht_debug)) { + g_debug("DHT verification failed for node %s: %s", knode_to_string(av->old), type == DHT_RPC_TIMEOUT ? "ping timed out" : "replied with a foreign KUID"); + } + + /* + * Don't remove the old node if the new node was not known to be alive + * and we got a timeout. + */ - dht_remove_node(av->old); + if (type != DHT_RPC_TIMEOUT) + dht_remove_node(av->old); /* KUID changed, remove */ + else if (av->new_is_alive) + dht_remove_node(av->old); /* New node alive, old timed out */ + else { + if (GNET_PROPERTY(dht_debug)) { + g_debug("DHT verification kept old node %s", + knode_to_string(av->old)); + } + av->old->flags &= ~KNODE_F_VERIFYING; + goto done; + } if (av->new->flags & KNODE_F_FIREWALLED) { if (GNET_PROPERTY(dht_debug)) @@ -4865,9 +5034,10 @@ knode_to_string(av->new)); if (NULL == tkn) { - av->new->flags |= KNODE_F_ALIVE; /* Got traffic earlier! */ + if (av->new_is_alive) + av->new->flags |= KNODE_F_ALIVE; dht_add_node(av->new); - } else if (clashing_nodes(tkn, av->new, TRUE)) { + } else if (clashing_nodes(tkn, av->new, TRUE, G_STRFUNC)) { /* Logging was done in clashing_nodes() */ } else { if (GNET_PROPERTY(dht_debug)) @@ -4878,11 +5048,17 @@ } else { av->old->flags &= ~KNODE_F_VERIFYING; /* got reply from proper host */ - if (GNET_PROPERTY(dht_debug)) - g_warning("DHT verification OK, keeping old node %s", + if (GNET_PROPERTY(dht_debug)) { + g_debug("DHT verification OK, keeping old node %s", knode_to_string(av->old)); + if (av->new_is_alive) { + g_warning("DHT verification also knows clashing alive node %s", + knode_to_string(av->new)); + } + } } +done: knode_free(av->old); knode_free(av->new); WFREE(av); @@ -4891,23 +5067,26 @@ /** * Verify the node address when we get a conflicting one. * + * @param kn the old node we had earlier in the routing table + * @param new the new node, NOT in the routing table already + * @param alive whether we got traffic from new node + * * It is possible that the address of the node changed, so we send a PING to - * the old address we had decide whether it is the case (no reply or another + * the old address we had to decide whether it is dead (no reply or another * KUID will come back), or whether the new node we found has a duplicate KUID * (maybe intentionally). */ void -dht_verify_node(knode_t *kn, knode_t *new) +dht_verify_node(knode_t *kn, knode_t *new, bool alive) { struct addr_verify *av; knode_check(kn); knode_check(new); - g_assert(new->refcnt == 1); g_assert(new->status == KNODE_UNKNOWN); g_assert(!(kn->flags & KNODE_F_VERIFYING)); - WALLOC(av); + WALLOC0(av); if (GNET_PROPERTY(dht_debug)) g_debug("DHT node %s was at %s, now %s -- verifying", @@ -4918,6 +5097,9 @@ kn->flags |= KNODE_F_VERIFYING; av->old = knode_refcnt_inc(kn); av->new = knode_refcnt_inc(new); + av->new_is_alive = booleanize(alive); + + gnet_stats_inc_general(GNR_DHT_NODE_VERIFICATIONS); /* * We use RPC_CALL_NO_VERIFY because we want to handle the verification @@ -4942,9 +5124,9 @@ dht_ping_cb( enum dht_rpc_ret type, const knode_t *kn, - const struct gnutella_node *unused_n, + const gnutella_node_t *unused_n, kda_msg_t unused_function, - const gchar *unused_payload, size_t unused_len, gpointer unused_arg) + const char *unused_payload, size_t unused_len, void *unused_arg) { (void) unused_n; (void) unused_function; @@ -4965,7 +5147,7 @@ * every minute. */ static void -dht_ping(host_addr_t addr, guint16 port) +dht_ping(host_addr_t addr, uint16 port) { knode_t *kn; vendor_code_t vc; @@ -4987,7 +5169,7 @@ * Not more than one random ping per minute though. */ - if (delta_time(now, last_sent) < 60 || (random_u32() % 100) >= 10) + if (delta_time(now, last_sent) < 60 || random_value(99) >= 10) return; last_sent = now; @@ -5019,7 +5201,7 @@ * Send a DHT ping as a probe, hoping the pong reply will help us bootstrap. */ static void -dht_probe(host_addr_t addr, guint16 port) +dht_probe(host_addr_t addr, uint16 port) { knode_t *kn; vendor_code_t vc; @@ -5040,7 +5222,7 @@ vc.u32 = T_0000; kn = knode_new(&kuid_null, 0, addr, port, vc, 0, 0); - guid_random_muid(cast_to_gpointer(&muid)); + guid_random_muid(cast_to_pointer(&muid)); kmsg_send_ping(kn, &muid); knode_free(kn); } @@ -5053,7 +5235,7 @@ * the bootstrapping as we will know one good node! */ static void -dht_bootstrap(host_addr_t addr, guint16 port) +dht_bootstrap(host_addr_t addr, uint16 port) { /* * We can be called only until we have been fully bootstrapped, but we @@ -5078,7 +5260,7 @@ * randomly attempt to ping the node. */ void -dht_bootstrap_if_needed(host_addr_t addr, guint16 port) +dht_bootstrap_if_needed(host_addr_t addr, uint16 port) { if (!dht_enabled() || NULL == root) return; @@ -5093,7 +5275,7 @@ * Collect packed IP:port DHT hosts from "DHTIPP" we get in a pong. */ void -dht_ipp_extract(const struct gnutella_node *n, const char *payload, int paylen, +dht_ipp_extract(const gnutella_node_t *n, const char *payload, int paylen, enum net_type type) { int i, cnt; @@ -5106,11 +5288,11 @@ if (GNET_PROPERTY(dht_debug) || GNET_PROPERTY(bootstrap_debug)) g_debug("extracting %d DHT host%s in DHTIPP pong from %s", - cnt, cnt == 1 ? "" : "s", node_addr(n)); + cnt, plural(cnt), node_addr(n)); for (i = 0, p = payload; i < cnt; i++, p = const_ptr_add_offset(p, len)) { host_addr_t ha; - guint16 port; + uint16 port; host_ip_port_peek(p, type, &ha, &port); @@ -5143,13 +5325,10 @@ /* Amount of valid route tags, excluding the unknown placeholder tag */ #define NUM_DHT_ROUTE_TAGS (DHT_ROUTE_TAG_MAX - 1) -static const struct dht_route_tag { - dht_route_tag_t tag; - const char *str; -} dht_route_tag_map = { +static const tokenizer_t dht_route_tags = { /* Must be sorted alphabetically for dichotomic search */ -#define DHT_ROUTE_TAG(x) { CAT2(DHT_ROUTE_TAG_,x), #x } +#define DHT_ROUTE_TAG(x) { #x, CAT2(DHT_ROUTE_TAG_,x) } DHT_ROUTE_TAG(CTIM), DHT_ROUTE_TAG(END), @@ -5163,25 +5342,10 @@ #undef DHT_ROUTE_TAG }; -static dht_route_tag_t +static inline dht_route_tag_t dht_route_string_to_tag(const char *s) { - STATIC_ASSERT(G_N_ELEMENTS(dht_route_tag_map) == NUM_DHT_ROUTE_TAGS); - -#define GET_ITEM(i) dht_route_tag_mapi.str -#define FOUND(i) G_STMT_START { \ - return dht_route_tag_mapi.tag; \ - /* NOTREACHED */ \ -} G_STMT_END - - /* Perform a binary search to find ``s'' */ - BINARY_SEARCH(const char *, s, G_N_ELEMENTS(dht_route_tag_map), strcmp, - GET_ITEM, FOUND); - -#undef FOUND -#undef GET_ITEM - - return DHT_ROUTE_TAG_UNKNOWN; + return TOKENIZE(s, dht_route_tags); } /** @@ -5193,19 +5357,19 @@ bit_array_t tag_usedBIT_ARRAY_SIZE(NUM_DHT_ROUTE_TAGS + 1); char line1024; unsigned line_no = 0; - gboolean done = FALSE; + bool done = TRUE; time_delta_t most_recent = REFRESH_PERIOD; time_t now = tm_time(); patricia_t *nodes; patricia_iter_t *iter; /* Variables filled for each entry */ host_addr_t addr; - guint16 port; + uint16 port; kuid_t kuid; - vendor_code_t vcode = { 0 }; - time_t seen = (time_t) -1; - time_t ctim = (time_t) -1; - guint32 major, minor; + vendor_code_t vcode; + time_t seen; + time_t ctim; + uint32 major, minor; g_return_if_fail(f); @@ -5217,6 +5381,18 @@ char *sp; dht_route_tag_t tag; + if G_UNLIKELY(done) { + /* Reset state */ + done = FALSE; + bit_array_clear_range(tag_used, 0, NUM_DHT_ROUTE_TAGS); + ZERO(&addr); + ZERO(&kuid); + ZERO(&vcode); + port = 0; + seen = ctim = (time_t) -1; + major = minor = 0; + } + line_no++; if (!file_line_chomp_tail(line, sizeof line, NULL)) { @@ -5246,9 +5422,8 @@ g_assert(UNSIGNED(tag) <= NUM_DHT_ROUTE_TAGS); if (tag != DHT_ROUTE_TAG_UNKNOWN && !bit_array_flip(tag_used, tag)) { - g_warning("dht_route_parse(): " - "duplicate tag \"%s\" within entry at line %u", - tag_name, line_no); + g_warning("%s(): duplicate tag \"%s\" within entry at line %u", + G_STRFUNC, tag_name, line_no); goto damaged; } @@ -5256,7 +5431,7 @@ case DHT_ROUTE_TAG_KUID: if ( KUID_RAW_SIZE * 2 != strlen(value) || - KUID_RAW_SIZE != base16_decode((char *) kuid.v, sizeof kuid.v, + KUID_RAW_SIZE != base16_decode(&kuid, sizeof kuid, value, KUID_RAW_SIZE * 2) ) goto damaged; @@ -5299,11 +5474,10 @@ /* All other tags are mandatory */ - for (i = 0; i < G_N_ELEMENTS(dht_route_tag_map); i++) { - if (!bit_array_get(tag_used, dht_route_tag_mapi.tag)) { - g_warning("dht_route_parse(): " - "missing %s tag near line %u", - dht_route_tag_mapi.str, line_no); + for (i = 0; i < N_ITEMS(dht_route_tags); i++) { + if (!bit_array_get(tag_used, dht_route_tagsi.value)) { + g_warning("%s(): missing %s tag near line %u", + G_STRFUNC, dht_route_tagsi.token, line_no); goto damaged; } } @@ -5353,9 +5527,7 @@ patricia_insert(nodes, kn->id, kn); } - /* Reset state */ - done = FALSE; - bit_array_clear_range(tag_used, 0, NUM_DHT_ROUTE_TAGS); + /* State will be reset in the loop since "done" is TRUE */ } continue; @@ -5418,8 +5590,8 @@ dht_update_size_estimate(); } -static const gchar node_file = "dht_nodes"; -static const gchar file_what = "DHT nodes"; +static const char node_file = "dht_nodes"; +static const char file_what = "DHT nodes"; /** * Retrieve previous routing table from ~/.gtk-gnutella/dht_nodes. @@ -5430,8 +5602,10 @@ file_path_t fp1; FILE *f; + TOKENIZE_CHECK_SORTED(dht_route_tags); + file_path_set(fp, settings_config_dir(), node_file); - f = file_config_open_read(file_what, fp, G_N_ELEMENTS(fp)); + f = file_config_open_read(file_what, fp, N_ITEMS(fp)); if (f) { dht_route_parse(f);
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/routing.h -> gtk-gnutella-1.1.9.tar.bz2/src/dht/routing.h
Changed
@@ -43,6 +43,7 @@ #include "if/dht/kademlia.h" #include "if/dht/dht.h" +#include "lib/bigint.h" #include "lib/host_addr.h" #include "lib/patricia.h" #include "lib/vendors.h" @@ -57,19 +58,19 @@ void dht_traffic_from(knode_t *kn); void dht_set_node_status(knode_t *kn, knode_status_t new); -void dht_record_size_estimate(knode_t *kn, kuid_t *size); +void dht_record_size_estimate(knode_t *kn, bigint_t *size); const kuid_t *dht_get_size_estimate(void); int dht_get_kball_furthest(void); -guint64 dht_size(void); +uint64 dht_size(void); int dht_fill_closest(const kuid_t *id, - knode_t **kvec, int kcnt, const kuid_t *exclude, gboolean alive); + knode_t **kvec, int kcnt, const kuid_t *exclude, bool alive); knode_t *dht_find_node(const kuid_t *kuid); void dht_remove_node(knode_t *kn); void dht_record_activity(knode_t *kn); void dht_node_timed_out(knode_t *kn); void dht_lookup_notify(const kuid_t *id, lookup_type_t type); -void dht_verify_node(knode_t *kn, knode_t *new); +void dht_verify_node(knode_t *kn, knode_t *new, bool alive); void dht_update_subspace_size_estimate( patricia_t *pt, const kuid_t *kuid, int amount);
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/rpc.c -> gtk-gnutella-1.1.9.tar.bz2/src/dht/rpc.c
Changed
@@ -34,25 +34,35 @@ #include "common.h" #include "rpc.h" -#include "routing.h" #include "kmsg.h" #include "knode.h" +#include "routing.h" +#include "stable.h" #include "if/gnet_property_priv.h" +#include "if/dht/kuid.h" #include "core/guid.h" #include "core/gnet_stats.h" +#include "lib/aging.h" #include "lib/atoms.h" #include "lib/cq.h" +#include "lib/gnet_host.h" +#include "lib/hikset.h" #include "lib/host_addr.h" -#include "lib/glib-missing.h" +#include "lib/stacktrace.h" /* For stacktrace_function_name() */ +#include "lib/stringify.h" #include "lib/tm.h" +#include "lib/unsigned.h" /* For uint32_saturate_add() */ #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ -enum rpc_cb_magic { RPC_CB_MAGIC = 0x74c8b10U }; +#define DHT_RPC_RECENT_KEEP (5*60) /* 5 minutes */ +#define DHT_RPC_LINGER_MS 15000 /* ms, 15 seconds */ +enum rpc_cb_magic { RPC_CB_MAGIC = 0x74c8b10U }; /** * An RPC callback descriptor. @@ -61,13 +71,15 @@ enum rpc_cb_magic magic; /**< magic */ enum dht_rpc_op op; /**< Operation type */ host_addr_t addr; /**< The host from which we expect a reply */ + uint16 port; /**< The port from which we expect a reply */ tm_t start; /**< The time at which we initiated the RPC */ const guid_t *muid; /**< MUID of the message sent (atom) */ knode_t *kn; /**< Remote node to which RPC was sent */ - guint32 flags; /**< Control flags */ + uint32 flags; /**< Control flags */ dht_rpc_cb_t cb; /**< Callback routine to invoke */ - gpointer arg; /**< Additional opaque argument */ + void *arg; /**< Additional opaque argument */ cevent_t *timeout; /**< Callout queue timeout event */ + unsigned lingering:1; /**< RPC was cancelled / timed out */ }; static inline void @@ -78,7 +90,13 @@ g_assert(NULL != rcb->muid); } -static GHashTable *pending; /**< Pending RPC (GUID -> rpc_cb) */ +static hikset_t *pending; /**< Pending RPC (GUID -> rpc_cb) */ + +/** + * Table recording the mappings between a KUID and an IP:port, as validated + * through an RPC exchange. + */ +static aging_table_t *rpc_recent; /** * RPC operation to string, for logs. @@ -97,6 +115,146 @@ } /** + * Free an entry in the `rpc_recent' aging table. + */ +static void +rpc_free_kuid_addr(void *key, void *value) +{ + kuid_atom_free(key); + gnet_host_free(value); +} + +/** + * Insert entry in the `rpc_recent' aging table, recording the IP:port used + * by given KUID. + */ +static void +dht_record_contact(const kuid_t *kuid, host_addr_t addr, uint16 port) +{ + gnet_host_t *host; + + host = aging_lookup_revitalise(rpc_recent, kuid); + + if (host != NULL) { + if ( + port == gnet_host_get_port(host) && + host_addr_equiv(addr, gnet_host_get_addr(host)) + ) + return; + aging_remove(rpc_recent, kuid); + } + + aging_insert(rpc_recent, kuid_get_atom(kuid), gnet_host_new(addr, port)); + + /* + * Update the count, knowing that it can decrease without us knowing + * immediately since there is no hook that can be plugged on the internal + * cleanup that the aging table routinely performs. + */ + + gnet_stats_set_general(GNR_DHT_RPC_RECENT_NODES_HELD, + aging_count(rpc_recent)); +} + +/** + * Fix given IP:port if we know that the KUID maps to a different address + * using the recent RPC information. + * + * @param kuid the KUID of the node + * @param addr pointer to the address we want to check / update + * @param port pointer to the port we want to check / update + * @param source origin of the KUID, for logging purposes + * + * @return TRUE if IP:port was updated. + */ +bool +dht_fix_kuid_contact(const kuid_t *kuid, host_addr_t *addr, uint16 *port, + const char *source) +{ + gnet_host_t *host; + + /* + * If we had a recent RPC transaction with this KUID, we may know it under + * a different IP:port. + */ + + host = aging_lookup(rpc_recent, kuid); + + if (host != NULL) { + host_addr_t xaddr = gnet_host_get_addr(host); + uint16 xport = gnet_host_get_port(host); + + if (xport == *port && host_addr_equiv(xaddr, *addr)) + return FALSE; + + if (GNET_PROPERTY(dht_lookup_debug)) { + g_warning("DHT fixing contact address (%s) for kuid=%s" + " from %s to %s (using recent RPC info)", + source, kuid_to_hex_string(kuid), + host_addr_port_to_string(*addr, *port), + host_addr_port_to_string2(xaddr, xport)); + } + + *addr = xaddr; /* Struct copy */ + *port = xport; + return TRUE; + } + + return FALSE; +} + +/** + * Fix a knode in-place by changing its IP:port if we know that its KUID + * maps to a different value from the RPC recent info or from the routing + * table. + * + * @param kn the node contact + * @param source origin of the node, for logging purposes + * + * @return TRUE if contact was updated. + */ +bool +dht_fix_contact(knode_t *kn, const char *source) +{ + knode_t *rn; + + g_assert(!knode_is_shared(kn, FALSE)); /* Since addr:port can be patched */ + + /* + * First look using the recent RPC information. + */ + + if (dht_fix_kuid_contact(kn->id, &kn->addr, &kn->port, source)) + return TRUE; + + /* + * If we hold the node in the routing table and already did a successful + * RPC exchange with it, compare the addresses. + */ + + rn = dht_find_node(kn->id); + + if (rn != NULL && (rn->flags & KNODE_F_RPC)) { + if (rn->port == kn->port && host_addr_equiv(rn->addr, kn->addr)) + return FALSE; + + if (GNET_PROPERTY(dht_lookup_debug)) { + g_warning("DHT fixing contact address (%s) for kuid=%s" + " from %s to %s (using routing table)", + source, kuid_to_hex_string(kn->id), + host_addr_port_to_string(kn->addr, kn->port), + host_addr_port_to_string(rn->addr, rn->port)); + } + + kn->addr = rn->addr; /* Struct copy */ + kn->port = rn->port; + return TRUE; + } + + return FALSE; +} + +/** * Initialize the RPC layer. */ void @@ -104,23 +262,32 @@ { g_assert(NULL == pending); - pending = g_hash_table_new(guid_hash, guid_eq); + pending = hikset_create( + offsetof(struct rpc_cb, muid), HASH_KEY_FIXED, GUID_RAW_SIZE); + + rpc_recent = aging_make(DHT_RPC_RECENT_KEEP, + kuid_hash, kuid_eq, rpc_free_kuid_addr); } /** * Free the callback waiting indication. */ static void -rpc_cb_free(struct rpc_cb *rcb, gboolean in_shutdown) +rpc_cb_free(struct rpc_cb *rcb, bool in_shutdown) { rpc_cb_check(rcb); if (in_shutdown) { - knode_rpc_dec(rcb->kn); - if (rcb->cb) - (*rcb->cb)(DHT_RPC_TIMEOUT, rcb->kn, NULL, 0, NULL, 0, rcb->arg); + /* Lingering RPCs have already invoked their callback */ + if (!rcb->lingering) { + knode_rpc_dec(rcb->kn); + if (rcb->cb != NULL) { + (*rcb->cb)(DHT_RPC_TIMEOUT, + rcb->kn, NULL, 0, NULL, 0, rcb->arg); + } + } } else { - g_hash_table_remove(pending, rcb->muid); + hikset_remove(pending, rcb->muid); } atom_guid_free_null(&rcb->muid); knode_free(rcb->kn); @@ -137,7 +304,7 @@ static int rpc_delay(const knode_t *kn) { - int timeout = DHT_RPC_MINDELAY; + uint32 timeout = DHT_RPC_MINDELAY; knode_check(kn); @@ -156,7 +323,7 @@ timeout = 1 << (MIN(kn->rpc_timeouts, 10) + 8); if (kn->rtt) - timeout += 3 * kn->rtt; + timeout = uint32_saturate_add(timeout, 3 * kn->rtt); else timeout = DHT_RPC_FIRSTDELAY; @@ -166,17 +333,30 @@ } /** - * Generic RPC operation timeout (callout queue callback). + * End of RPC lingering time (callout queue callback). */ static void -rpc_timed_out(cqueue_t *unused_cq, gpointer obj) +rpc_lingered(cqueue_t *cq, void *obj) { struct rpc_cb *rcb = obj; rpc_cb_check(rcb); - (void) unused_cq; - rcb->timeout = NULL; + if (GNET_PROPERTY(dht_rpc_debug) > 5) { + g_debug("DHT RPC %s #%s finished lingering", + op_to_string(rcb->op), guid_to_string(rcb->muid)); + } + + cq_zero(cq, &rcb->timeout); + rpc_cb_free(rcb, FALSE); +} + +/** + * Signal an RPC operation timeout by invoking callback, if any. + */ +static void +rpc_timeout(struct rpc_cb *rcb) +{ dht_node_timed_out(rcb->kn); /* @@ -186,10 +366,44 @@ knode_rpc_dec(rcb->kn); - if (rcb->cb) + if (rcb->cb != NULL) { + if (GNET_PROPERTY(dht_rpc_debug) > 4) { + g_debug("DHT RPC %s #%s invoking %s(TIMEOUT, %p)", + op_to_string(rcb->op), guid_to_string(rcb->muid), + stacktrace_function_name(rcb->cb), rcb->arg); + } (*rcb->cb)(DHT_RPC_TIMEOUT, rcb->kn, NULL, 0, NULL, 0, rcb->arg); + } else { + if (GNET_PROPERTY(dht_rpc_debug) > 4) { + g_debug("DHT RPC %s #%s timed out", + op_to_string(rcb->op), guid_to_string(rcb->muid)); + } + } - rpc_cb_free(rcb, FALSE); + /* + * Linger for a while to see how many "late" replies we get. + */ + + g_assert(NULL == rcb->timeout); + + rcb->timeout = cq_main_insert(DHT_RPC_LINGER_MS, rpc_lingered, rcb); + rcb->lingering = TRUE; +} + +/** + * Generic RPC operation timeout (callout queue callback). + */ +static void +rpc_timed_out(cqueue_t *cq, void *obj) +{ + struct rpc_cb *rcb = obj; + + rpc_cb_check(rcb); + + gnet_stats_inc_general(GNR_DHT_RPC_TIMED_OUT); + cq_zero(cq, &rcb->timeout); + + rpc_timeout(rcb); } /** @@ -210,52 +424,79 @@ */ static const guid_t * rpc_call_prepare( - enum dht_rpc_op op, knode_t *kn, int delay, guint32 flags, - dht_rpc_cb_t cb, gpointer arg) + enum dht_rpc_op op, knode_t *kn, int delay, uint32 flags, + dht_rpc_cb_t cb, void *arg) { - int i; struct rpc_cb *rcb; - struct guid muid; knode_check(kn); /* - * Generate a new random MUID for the RPC. - */ - - for (i = 0; i < 100; i++) { - guid_random_muid(&muid); - - if (NULL == g_hash_table_lookup(pending, &muid)) - break; - } - - if (100 == i) - g_error("bad luck with random number generator"); - - /* * Create and fill the RPC control block. */ - WALLOC(rcb); + WALLOC0(rcb); rcb->magic = RPC_CB_MAGIC; rcb->op = op; rcb->kn = knode_refcnt_inc(kn); rcb->flags = flags; - rcb->muid = atom_guid_get(&muid); + rcb->muid = guid_unique_atom(pending, TRUE); rcb->addr = kn->addr; + rcb->port = kn->port; rcb->timeout = cq_main_insert(delay, rpc_timed_out, rcb); rcb->cb = cb; rcb->arg = arg; tm_now_exact(&rcb->start); /* To measure RTT when we get the reply */ knode_rpc_inc(kn); - gm_hash_table_insert_const(pending, rcb->muid, rcb); + hikset_insert_key(pending, &rcb->muid); + gnet_stats_inc_general(GNR_DHT_RPC_MSG_PREPARED); + + if (GNET_PROPERTY(dht_rpc_debug) > 4) { + g_debug("DHT RPC created %s #%s to %s with callback %s(%p), " + "timeout %d ms", + op_to_string(rcb->op), guid_to_string(rcb->muid), + knode_to_string(kn), stacktrace_function_name(cb), arg, delay); + } return rcb->muid; } /** + * Force a timeout on the RPC. + * + * @return whether we found the MUID to time out. + */ +bool +dht_rpc_timeout(const guid_t *muid) +{ + struct rpc_cb *rcb; + + rcb = hikset_lookup(pending, muid); + if (NULL == rcb) + return FALSE; + + rpc_cb_check(rcb); + + if (rcb->lingering) { + cq_expire(rcb->timeout); + return FALSE; /* Already timed out since we're lingering */ + } + + if (GNET_PROPERTY(dht_rpc_debug)) { + g_debug("DHT RPC forcing timeout of %s #%s to %s", + op_to_string(rcb->op), guid_to_string(rcb->muid), + knode_to_string(rcb->kn)); + } + + gnet_stats_inc_general(GNR_DHT_RPC_MSG_CANCELLED); + cq_cancel(&rcb->timeout); + rpc_timeout(rcb); + + return TRUE; +} + +/** * Cancel an RPC. * * The callback will never be invoked and the MUID is cleared. It will be @@ -263,16 +504,30 @@ * * @return whether we found the MUID to cancel. */ -gboolean +bool dht_rpc_cancel(const guid_t *muid) { struct rpc_cb *rcb; - rcb = g_hash_table_lookup(pending, muid); - if (!rcb) + rcb = hikset_lookup(pending, muid); + if (NULL == rcb) return FALSE; rpc_cb_check(rcb); + + if (rcb->lingering) { + cq_expire(rcb->timeout); + return FALSE; /* Already timed out since we're lingering */ + } + + if (GNET_PROPERTY(dht_rpc_debug) > 3) { + g_debug("DHT RPC cancelling %s #%s to %s -- not calling %s(%p)", + op_to_string(rcb->op), guid_to_string(rcb->muid), + knode_to_string(rcb->kn), + stacktrace_function_name(rcb->cb), rcb->arg); + } + + gnet_stats_inc_general(GNR_DHT_RPC_MSG_CANCELLED); knode_rpc_dec(rcb->kn); rpc_cb_free(rcb, FALSE); return TRUE; @@ -284,17 +539,29 @@ * * @return whether we found the MUID and it was cancelled. */ -gboolean +bool dht_rpc_cancel_if_no_callback(const guid_t *muid) { struct rpc_cb *rcb; - rcb = g_hash_table_lookup(pending, muid); - if (!rcb) + rcb = hikset_lookup(pending, muid); + if (NULL == rcb) return FALSE; rpc_cb_check(rcb); + + if (rcb->lingering) { + cq_expire(rcb->timeout); + return FALSE; /* Already timed out since we're lingering */ + } + if (NULL == rcb->cb) { + if (GNET_PROPERTY(dht_rpc_debug) > 3) { + g_debug("DHT RPC cancelling %s #%s to %s with no callback", + op_to_string(rcb->op), guid_to_string(rcb->muid), + knode_to_string(rcb->kn)); + } + knode_rpc_dec(rcb->kn); rpc_cb_free(rcb, FALSE); return TRUE; @@ -309,23 +576,40 @@ * @return TRUE if we found the pending RPC, with host and port filled (when * non-NULL), FALSE otherwise. */ -gboolean -dht_rpc_info(const guid_t *muid, host_addr_t *addr, guint16 *port) +bool +dht_rpc_info(const guid_t *muid, host_addr_t *addr, uint16 *port) { struct rpc_cb *rcb; knode_t *rn; - rcb = g_hash_table_lookup(pending, muid); - if (!rcb) + rcb = hikset_lookup(pending, muid); + if (NULL == rcb) return FALSE; rpc_cb_check(rcb); + /* + * Note that we're not checking for lingering RPCs here because we + * are not handling the RPC itself, we're trying to fixup the contact + * address. If we find a lingering RPC, it means we got a late reply, + * but we can nonethless update the contact. + */ + rn = rcb->kn; knode_check(rn); - if (addr) *addr = rn->addr; - if (port) *port = rn->port; + if ( + GNET_PROPERTY(dht_rpc_debug) && + (rn->port != rcb->port || !host_addr_equiv(rn->addr, rcb->addr)) + ) { + g_warning("DHT RPC had sent %s #%s to %s, now is %s", + op_to_string(rcb->op), guid_to_string(rcb->muid), + host_addr_port_to_string(rcb->addr, rcb->port), + knode_to_string(rn)); + } + + if (addr) *addr = rcb->addr; + if (port) *port = rcb->port; return TRUE; } @@ -343,12 +627,12 @@ * @return TRUE if the message was indeed bearing a MUID for which we had * issued an RPC call. */ -gboolean +bool dht_rpc_answer(const guid_t *muid, knode_t *kn, - const struct gnutella_node *n, + const gnutella_node_t *n, kda_msg_t function, - gconstpointer payload, size_t len) + const void *payload, size_t len) { struct rpc_cb *rcb; tm_t now; @@ -356,12 +640,51 @@ knode_check(kn); - rcb = g_hash_table_lookup(pending, muid); - if (!rcb) + rcb = hikset_lookup(pending, muid); + if (NULL == rcb) return FALSE; rpc_cb_check(rcb); - cq_cancel(&rcb->timeout); + + if (GNET_PROPERTY(dht_rpc_debug) > 2) { + g_debug("DHT RPC got %sanswer to %s #%s sent to %s, timeout in %s ms", + rcb->lingering ? "late " : "", + op_to_string(rcb->op), guid_to_string(rcb->muid), + knode_to_string(rcb->kn), + cq_time_to_string(cq_remaining(rcb->timeout))); + } + + /* + * If this is a late reply (received whilst lingering), do not handle + * the RPC. We can stop the lingering process though since we got + * a reply and we don't expect more. + */ + + if (rcb->lingering) { + gnet_stats_inc_general(GNR_DHT_RPC_LATE_REPLIES_RECEIVED); + + if (GNET_PROPERTY(dht_rpc_debug) > 1) { + g_debug("DHT RPC late reply for %s #%s to %s", + op_to_string(rcb->op), guid_to_string(rcb->muid), + knode_to_string(rcb->kn)); + } + + /* + * If the node from which we got a reply is in the routing table, + * update the RTT EMA, since it took longer than expected to get a + * reply -- we want to do better next time at projecting a suitable RTT. + */ + + if (KNODE_UNKNOWN != kn->status) { + tm_now_exact(&now); + kn->rtt += (tm_elapsed_ms(&now, &rcb->start) >> 1) - (kn->rtt >> 1); + } + + cq_expire(rcb->timeout); /* Will free up `rcb' */ + return FALSE; + } + + cq_cancel(&rcb->timeout); /* This is an RPC timeout, not a lingering */ /* * The node that was registered during the creation of the RPC was @@ -375,7 +698,7 @@ rn = rcb->kn; knode_check(rn); - /* + /* * Verify that the node who replied indeed bears the same KUID as we * think it has. When the RPC_CALL_NO_VERIFY flag is set, it means * the registered callback will perform this kind of verification itself. @@ -388,24 +711,32 @@ /* * This node is stale: the node to which we sent the RPC bears * a KUID different from the one we thought it had. The node we - * knew about is therefore gone. + * knew about is therefore gone and has a new KUID. * * Remove the original node from the routing table (in case it is - * present) and do not handle the reply. + * present) and do not handle the reply: that would be misleading + * if we are performing a node lookup for instance, because we do not + * want to enter the new node in the path. */ - gnet_stats_count_general(GNR_DHT_RPC_KUID_REPLY_MISMATCH, 1); + gnet_stats_inc_general(GNR_DHT_RPC_KUID_REPLY_MISMATCH); - if (GNET_PROPERTY(dht_debug)) { - g_debug("DHT sent %s RPC %s to %s but got reply from %s", + if (GNET_PROPERTY(dht_debug) || GNET_PROPERTY(dht_rpc_debug)) { + g_debug("DHT RPC sent %s #%s to %s but got reply from %s via %s", op_to_string(rcb->op), guid_to_string(rcb->muid), knode_to_string(rn), - knode_to_string2(kn)); + knode_to_string2(kn), node_infostr(n)); } - dht_remove_node(rn); /* Discard obsolete entry */ - rpc_timed_out(callout_queue, rcb); /* Invoke user callback if any */ + /* Mark alive for stable_replace() */ + rn->flags |= KNODE_F_ALIVE; /* Receiving RPC reply traffic */ + kn->flags |= KNODE_F_ALIVE; /* Got traffic from that node */ + + stable_replace(rn, kn); /* KUID of rn was changed */ + dht_remove_node(rn); /* Remove obsolete entry from routing */ + cq_cancel(&rcb->timeout); + rpc_timeout(rcb); /* Invoke user callback if any */ return FALSE; /* RPC was sent to wrong node, ignore */ } @@ -419,7 +750,7 @@ */ if (kn != rn) { - guint32 flags = kn->flags & (KNODE_F_FIREWALLED | KNODE_F_SHUTDOWNING); + uint32 flags = kn->flags & (KNODE_F_FIREWALLED | KNODE_F_SHUTDOWNING); rn->flags &= ~(KNODE_F_FIREWALLED | KNODE_F_SHUTDOWNING); rn->flags |= flags | KNODE_F_ALIVE; @@ -459,22 +790,40 @@ * found at RPC reply time, a new node in "unknown" status was created. */ - if (kn->status == KNODE_STALE) { + if (KNODE_STALE == kn->status) { dht_set_node_status(kn, KNODE_GOOD); - gnet_stats_count_general(GNR_DHT_REVITALIZED_STALE_NODES, 1); + gnet_stats_inc_general(GNR_DHT_REVITALIZED_STALE_NODES); } /* + * Record the IP:port associated with this KUID so that we may fixup the + * KUID => address mappings when performing FIND_NODE operations. + * + * We use the IP:port to which we sent the RPC, since we got a good reply + * by sending something there. + */ + + if (!(rcb->flags & RPC_CALL_NO_VERIFY) || kuid_eq(kn->id, rn->id)) + dht_record_contact(kn->id, rcb->addr, rcb->port); + + /* * Invoke user callback, if any configured. * The amount of pending RPCs is decreased before invoking the callback. */ knode_rpc_dec(rcb->kn); - if (rcb->cb) + if (rcb->cb != NULL) { + if (GNET_PROPERTY(dht_rpc_debug) > 4) { + g_debug("DHT RPC %s #%s invoking %s(REPLY, %s, %zu byte%s, %p)", + op_to_string(rcb->op), guid_to_string(rcb->muid), + stacktrace_function_name(rcb->cb), kmsg_name(function), + len, plural(len), rcb->arg); + } (*rcb->cb)(DHT_RPC_REPLY, rn, n, function, payload, len, rcb->arg); + } - rpc_cb_free(rcb, FALSE); + rpc_cb_free(rcb, FALSE); /* Got a reply, no need to linger */ return TRUE; } @@ -487,7 +836,7 @@ * @param arg additional opaque callback argument */ void -dht_rpc_ping_extended(knode_t *kn, guint32 flags, dht_rpc_cb_t cb, gpointer arg) +dht_rpc_ping_extended(knode_t *kn, uint32 flags, dht_rpc_cb_t cb, void *arg) { const guid_t *muid; @@ -505,7 +854,7 @@ * @param arg additional opaque callback argument */ void -dht_rpc_ping(knode_t *kn, dht_rpc_cb_t cb, gpointer arg) +dht_rpc_ping(knode_t *kn, dht_rpc_cb_t cb, void *arg) { dht_rpc_ping_extended(kn, 0, cb, arg); } @@ -521,16 +870,16 @@ * * @return TRUE if PING is actually sent, FALSE if optimized out. */ -gboolean +bool dht_lazy_rpc_ping(knode_t *kn) { if (knode_rpc_pending(kn)) { if (GNET_PROPERTY(dht_debug)) { g_debug("DHT not sending any alive ping to %s (%u pending RPC%s)", knode_to_string(kn), kn->rpc_pending, - 1 == kn->rpc_pending ? "" : "s"); + plural(kn->rpc_pending)); } - gnet_stats_count_general(GNR_DHT_ALIVE_PINGS_AVOIDED, 1); + gnet_stats_inc_general(GNR_DHT_ALIVE_PINGS_AVOIDED); return FALSE; } else { dht_rpc_ping(kn, NULL, NULL); @@ -550,8 +899,8 @@ */ void dht_rpc_find_node(knode_t *kn, const kuid_t *id, - dht_rpc_cb_t cb, gpointer arg, - pmsg_free_t mfree, gpointer marg) + dht_rpc_cb_t cb, void *arg, + pmsg_free_t mfree, void *marg) { const guid_t *muid; @@ -577,8 +926,8 @@ void dht_rpc_find_value(knode_t *kn, const kuid_t *id, dht_value_type_t type, kuid_t **skeys, int scnt, - dht_rpc_cb_t cb, gpointer arg, - pmsg_free_t mfree, gpointer marg) + dht_rpc_cb_t cb, void *arg, + pmsg_free_t mfree, void *marg) { const guid_t *muid; @@ -603,8 +952,8 @@ */ void dht_rpc_store(knode_t *kn, pmsg_t *mb, - dht_rpc_cb_t cb, gpointer arg, - pmsg_free_t mfree, gpointer marg) + dht_rpc_cb_t cb, void *arg, + pmsg_free_t mfree, void *marg) { const guid_t *muid; pmsg_t *smb; @@ -635,9 +984,8 @@ * Free the RPC callback descriptor held in the hash table at shutdown time. */ static void -rpc_free_kv(gpointer unused_key, gpointer val, gpointer unused_x) +rpc_free_kv(void *val, void *unused_x) { - (void) unused_key; (void) unused_x; /* @@ -655,8 +1003,9 @@ void dht_rpc_close(void) { - g_hash_table_foreach(pending, rpc_free_kv, NULL); - gm_hash_table_destroy_null(&pending); + hikset_foreach(pending, rpc_free_kv, NULL); + hikset_free_null(&pending); + aging_destroy(&rpc_recent); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/rpc.h -> gtk-gnutella-1.1.9.tar.bz2/src/dht/rpc.h
Changed
@@ -86,7 +86,7 @@ const knode_t *kn, const struct gnutella_node *n, kda_msg_t function, - const gchar *payload, size_t len, gpointer arg); + const char *payload, size_t len, void *arg); /** * RPC call control flags. @@ -101,30 +101,33 @@ void dht_rpc_init(void); void dht_rpc_close(void); -gboolean dht_rpc_answer(const guid_t *muid, knode_t *kn, +bool dht_rpc_answer(const guid_t *muid, knode_t *kn, const struct gnutella_node *n, kda_msg_t function, - gconstpointer payload, size_t len); - -gboolean dht_rpc_info(const guid_t *muid, - host_addr_t *addr, guint16 *port); - -gboolean dht_rpc_cancel(const guid_t *muid); -gboolean dht_rpc_cancel_if_no_callback(const guid_t *muid); -gboolean dht_lazy_rpc_ping(knode_t *kn); -void dht_rpc_ping(knode_t *kn, dht_rpc_cb_t cb, gpointer arg); + const void *payload, size_t len); + +bool dht_rpc_info(const guid_t *muid, host_addr_t *addr, uint16 *port); +bool dht_fix_contact(knode_t *kn, const char *source); +bool dht_fix_kuid_contact(const kuid_t *kuid, host_addr_t *addr, uint16 *port, + const char *source); + +bool dht_rpc_timeout(const guid_t *muid); +bool dht_rpc_cancel(const guid_t *muid); +bool dht_rpc_cancel_if_no_callback(const guid_t *muid); +bool dht_lazy_rpc_ping(knode_t *kn); +void dht_rpc_ping(knode_t *kn, dht_rpc_cb_t cb, void *arg); void dht_rpc_ping_extended( - knode_t *kn, guint32 flags, dht_rpc_cb_t cb, gpointer arg); + knode_t *kn, uint32 flags, dht_rpc_cb_t cb, void *arg); void dht_rpc_find_node( - knode_t *kn, const kuid_t *id, dht_rpc_cb_t cb, gpointer arg, - pmsg_free_t mfree, gpointer marg); + knode_t *kn, const kuid_t *id, dht_rpc_cb_t cb, void *arg, + pmsg_free_t mfree, void *marg); void dht_rpc_find_value(knode_t *kn, const kuid_t *id, dht_value_type_t type, kuid_t **skeys, int scnt, - dht_rpc_cb_t cb, gpointer arg, - pmsg_free_t mfree, gpointer marg); + dht_rpc_cb_t cb, void *arg, + pmsg_free_t mfree, void *marg); void dht_rpc_store(knode_t *kn, pmsg_t *mb, - dht_rpc_cb_t cb, gpointer arg, - pmsg_free_t mfree, gpointer marg); + dht_rpc_cb_t cb, void *arg, + pmsg_free_t mfree, void *marg); #endif /* _dht_rpc_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/stable.c -> gtk-gnutella-1.1.9.tar.bz2/src/dht/stable.c
Changed
@@ -151,7 +151,7 @@ #define STABLE_DB_CACHE_SIZE 4096 /**< Cached amount of stable nodes */ #define STABLE_MAP_CACHE_SIZE 64 /**< Amount of SDBM pages to cache */ -#define STABLE_UPPER_THRESH (3600 * 24 * 30 * 3) /**< ~ 3 months in s */ +#define STABLE_UPPER_THRESH (3600 * 24 * 7 * 2) /**< ~ 2 weeks in s */ #define STABLE_EXPIRE (2 * DHT_VALUE_REPUBLISH) /**< 2 republish periods */ #define STABLE_PROBA (0.3333) /**< 33.33% */ @@ -178,7 +178,7 @@ struct lifedata { time_t first_seen; /**< Time when we first seen the node */ time_t last_seen; /**< Last time we saw the node */ - guint8 version; /**< Structure version information */ + uint8 version; /**< Structure version information */ }; /** @@ -192,7 +192,8 @@ ld = dbmw_read(db_lifedata, id, NULL); if (NULL == ld && dbmw_has_ioerr(db_lifedata)) { - g_warning("DBMW \"%s\" I/O error, bad things could happen...", + s_warning_once_per(LOG_PERIOD_MINUTE, + "DBMW \"%s\" I/O error, bad things could happen...", dbmw_name(db_lifedata)); } @@ -299,7 +300,7 @@ new_ld.first_seen = kn->first_seen; new_ld.last_seen = kn->last_seen; - gnet_stats_count_general(GNR_DHT_STABLE_NODES_HELD, +1); + gnet_stats_inc_general(GNR_DHT_STABLE_NODES_HELD); } else { if (kn->last_seen <= ld->last_seen) return; @@ -310,6 +311,40 @@ } /** + * The KUID of the node has changed: remove its entry if it had one and make + * sure we have an entry for the new KUID. + * + * @param kn the old node + * @param rn the replacing node + */ +void +stable_replace(const knode_t *kn, const knode_t *rn) +{ + struct lifedata *ld; + + knode_check(kn); + knode_check(rn); + g_assert(rn->flags & KNODE_F_ALIVE); + + ld = get_lifedata(kn->id); + if (NULL == ld) + return; /* Node was not recorded in the "stable" set */ + + if (GNET_PROPERTY(dht_stable_debug)) { + g_debug("DHT STABLE removing obsolete %s, now at %s", + knode_to_string(kn), knode_to_string2(rn)); + } + + /* + * Remove the old node and create an entry for the new one. + */ + + dbmw_delete(db_lifedata, kn->id->v); + gnet_stats_dec_general(GNR_DHT_STABLE_NODES_HELD); + stable_record_activity(rn); +} + +/** * Estimate probability of presence for a value published to some roots in * a given time frame. * @@ -321,7 +356,7 @@ */ double stable_store_presence(time_delta_t d, - const lookup_rs_t *rs, const guint16 *status) + const lookup_rs_t *rs, const uint16 *status) { double q = 1.0; size_t i; @@ -369,13 +404,13 @@ * DBMW foreach iterator to remove old entries. * @return TRUE if entry must be deleted. */ -static gboolean -prune_old(gpointer key, gpointer value, size_t u_len, gpointer u_data) +static bool +prune_old(void *key, void *value, size_t u_len, void *u_data) { const kuid_t *id = key; const struct lifedata *ld = value; time_delta_t d; - gboolean expired; + bool expired; double p; (void) u_len; @@ -423,14 +458,14 @@ dbmw_count(db_lifedata)); } - dbstore_shrink(db_lifedata); + dbstore_compact(db_lifedata); } /** * Callout queue periodic event to expire old entries. */ -static gboolean -stable_periodic_prune(gpointer unused_obj) +static bool +stable_periodic_prune(void *unused_obj) { (void) unused_obj; @@ -441,8 +476,8 @@ /** * Callout queue periodic event to synchronize persistent DB. */ -static gboolean -stable_sync(gpointer unused_obj) +static bool +stable_sync(void *unused_obj) { (void) unused_obj; @@ -454,7 +489,7 @@ * Serialization routine for lifedata. */ static void -serialize_lifedata(pmsg_t *mb, gconstpointer data) +serialize_lifedata(pmsg_t *mb, const void *data) { const struct lifedata *ld = data; @@ -467,7 +502,7 @@ * Deserialization routine for lifedata. */ static void -deserialize_lifedata(bstr_t *bs, gpointer valptr, size_t len) +deserialize_lifedata(bstr_t *bs, void *valptr, size_t len) { struct lifedata *ld = valptr; @@ -481,7 +516,7 @@ /** * Initialize node stability caching. */ -G_GNUC_COLD void +void G_COLD stable_init(void) { dbstore_kv_t kv = { KUID_RAW_SIZE, NULL, sizeof(struct lifedata), 0 }; @@ -492,9 +527,6 @@ g_assert(NULL == stable_sync_ev); g_assert(NULL == stable_prune_ev); - /* Legacy: remove after 0.97 -- RAM, 2011-05-03 */ - dbstore_move(settings_config_dir(), settings_dht_db_dir(), db_stable_base); - db_lifedata = dbstore_open(db_stable_what, settings_dht_db_dir(), db_stable_base, kv, packing, STABLE_DB_CACHE_SIZE, kuid_hash, kuid_eq, GNET_PROPERTY(dht_storage_in_memory)); @@ -512,7 +544,7 @@ /** * Close node stability caching. */ -G_GNUC_COLD void +void G_COLD stable_close(void) { dbstore_close(db_lifedata, settings_dht_db_dir(), db_stable_base);
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/stable.h -> gtk-gnutella-1.1.9.tar.bz2/src/dht/stable.h
Changed
@@ -49,6 +49,7 @@ double stable_still_alive_probability(time_t first_seen, time_t last_seen); void stable_record_activity(const knode_t *kn); +void stable_replace(const knode_t *kn, const knode_t *rn); #endif /* _dht_stable_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/tcache.c -> gtk-gnutella-1.1.9.tar.bz2/src/dht/tcache.c
Changed
@@ -78,6 +78,7 @@ #include "lib/atoms.h" #include "lib/cq.h" +#include "lib/debug.h" #include "lib/map.h" #include "lib/dbmw.h" #include "lib/dbstore.h" @@ -97,6 +98,20 @@ static cperiodic_t *tcache_prune_ev; /** + * Debugging configuration for the DBM wrapper. + */ +static dbg_config_t tcache_dbmw_dbg = { + "DHT TCACHE ", /* prefix */ + "DBMW", /* type */ + 0, 0, /* level, flags */ + (stringify_fn_t) dbmw_name, /* o2str */ + (stringify_fn_t) kuid_to_hex_string, /* k2str */ + NULL, /* klen2str */ + NULL, /* v2str */ + NULL, /* vlen2str */ +}; + +/** * DBM wrapper to associate a target KUID its STORE security token. */ static dbmw_t *db_tokdata; @@ -109,11 +124,21 @@ */ struct tokdata { time_t last_update; /**< When we last updated the security token */ - guint8 length; /**< Token length (0 if none) */ + uint8 length; /**< Token length (0 if none) */ void *token; /**< Token binary data -- walloc()-ed */ }; /** + * Debugging variables changed. + */ +void +tcache_debugging_changed(void) +{ + tcache_dbmw_dbg.level = GNET_PROPERTY(dht_tcache_debug); + tcache_dbmw_dbg.flags = GNET_PROPERTY(dht_tcache_debug_flags); +} + +/** * Get tokdata from database, returning NULL if not found. */ static struct tokdata * @@ -125,7 +150,8 @@ if (NULL == td) { if (dbmw_has_ioerr(db_tokdata)) { - g_warning("DBMW \"%s\" I/O error, bad things could happen...", + s_warning_once_per(LOG_PERIOD_MINUTE, + "DBMW \"%s\" I/O error, bad things could happen...", dbmw_name(db_tokdata)); } } @@ -140,18 +166,25 @@ delete_tokdata(const kuid_t *id) { dbmw_delete(db_tokdata, id); - gnet_stats_count_general(GNR_DHT_CACHED_TOKENS_HELD, -1); + gnet_stats_dec_general(GNR_DHT_CACHED_TOKENS_HELD); if (GNET_PROPERTY(dht_tcache_debug) > 2) g_debug("DHT TCACHE security token from %s reclaimed", kuid_to_hex_string(id)); + + if (GNET_PROPERTY(dht_tcache_debug_flags) & DBG_DSF_USR1) { + g_debug("DHT TCACHE %s: stats=%s, count=%zu, id=%s", + G_STRFUNC, uint64_to_string( + gnet_stats_get_general(GNR_DHT_CACHED_TOKENS_HELD)), + dbmw_count(db_tokdata), kuid_to_hex_string(id)); + } } /** * Serialization routine for tokdata. */ static void -serialize_tokdata(pmsg_t *mb, gconstpointer data) +serialize_tokdata(pmsg_t *mb, const void *data) { const struct tokdata *td = data; @@ -164,7 +197,7 @@ * Deserialization routine for tokdata. */ static void -deserialize_tokdata(bstr_t *bs, gpointer valptr, size_t len) +deserialize_tokdata(bstr_t *bs, void *valptr, size_t len) { struct tokdata *td = valptr; @@ -186,7 +219,7 @@ * the structure itself. */ static void -free_tokdata(gpointer valptr, size_t len) +free_tokdata(void *valptr, size_t len) { struct tokdata *td = valptr; @@ -199,7 +232,7 @@ * Map iterator to record security tokens in the database. */ static void -record_token(gpointer key, gpointer value, gpointer unused_u) +record_token(void *key, void *value, void *unused_u) { kuid_t *id = key; lookup_token_t *ltok = value; @@ -211,7 +244,7 @@ td.length = ltok->token->length; td.token = td.length ? wcopy(ltok->token->v, td.length) : NULL; - if (GNET_PROPERTY(dht_tcache_debug) > 4) { + if (GNET_PROPERTY(dht_tcache_debug) > 4 && td.token != NULL) { char buf80; bin_to_hex_buf(td.token, td.length, buf, sizeof buf); g_debug("DHT TCACHE adding security token for %s: %u-byte \"%s\"", @@ -224,9 +257,16 @@ */ if (!dbmw_exists(db_tokdata, id->v)) - gnet_stats_count_general(GNR_DHT_CACHED_TOKENS_HELD, +1); + gnet_stats_inc_general(GNR_DHT_CACHED_TOKENS_HELD); dbmw_write(db_tokdata, id->v, &td, sizeof td); + + if (GNET_PROPERTY(dht_tcache_debug_flags) & DBG_DSF_USR1) { + g_debug("DHT TCACHE %s: stats=%s, count=%zu, id=%s", + G_STRFUNC, uint64_to_string( + gnet_stats_get_general(GNR_DHT_CACHED_TOKENS_HELD)), + dbmw_count(db_tokdata), kuid_to_hex_string(id)); + } } /** @@ -252,9 +292,9 @@ * the information about the length and the token pointer. Information is * returned from a static memory buffer so it must be perused immediately. */ -gboolean +bool tcache_get(const kuid_t *id, - guint8 *len_ptr, const void **tok_ptr, time_t *time_ptr) + uint8 *len_ptr, const void **tok_ptr, time_t *time_ptr) { struct tokdata *td; @@ -282,7 +322,7 @@ compact_time(delta_time(tm_time(), td->last_update))); } - gnet_stats_count_general(GNR_DHT_CACHED_TOKENS_HITS, 1); + gnet_stats_inc_general(GNR_DHT_CACHED_TOKENS_HITS); return TRUE; } @@ -292,7 +332,7 @@ * * @return TRUE if entry existed */ -gboolean +bool tcache_remove(const kuid_t *id) { if (!dbmw_exists(db_tokdata, id)) @@ -306,8 +346,8 @@ * DBMW foreach iterator to remove old entries. * @return TRUE if entry must be deleted. */ -static gboolean -tk_prune_old(gpointer key, gpointer value, size_t u_len, gpointer u_data) +static bool +tk_prune_old(void *key, void *value, size_t u_len, void *u_data) { const kuid_t *id = key; const struct tokdata *td = value; @@ -323,6 +363,12 @@ kuid_to_hex_string(id)); } + if (GNET_PROPERTY(dht_tcache_debug) > 5) { + g_debug("DHT TCACHE %s: %s id=%s", + G_STRFUNC, d > token_life ? "prune" : "keep ", + kuid_to_hex_string(id)); + } + return d > token_life; } @@ -332,25 +378,27 @@ static void tcache_prune_old(void) { + size_t pruned; + if (GNET_PROPERTY(dht_tcache_debug)) { g_debug("DHT TCACHE pruning expired tokens (%zu)", dbmw_count(db_tokdata)); } - dbmw_foreach_remove(db_tokdata, tk_prune_old, NULL); + pruned = dbmw_foreach_remove(db_tokdata, tk_prune_old, NULL); gnet_stats_set_general(GNR_DHT_CACHED_TOKENS_HELD, dbmw_count(db_tokdata)); if (GNET_PROPERTY(dht_tcache_debug)) { - g_debug("DHT TCACHE pruned expired tokens (%zu remaining)", - dbmw_count(db_tokdata)); + g_debug("DHT TCACHE pruned expired tokens (%zu pruned, %zu remaining)", + pruned, dbmw_count(db_tokdata)); } } /** * Callout queue periodic event to expire old entries. */ -static gboolean -tcache_periodic_prune(gpointer unused_obj) +static bool +tcache_periodic_prune(void *unused_obj) { (void) unused_obj; @@ -361,25 +409,23 @@ /** * Initialize security token caching. */ -G_GNUC_COLD void +void G_COLD tcache_init(void) { dbstore_kv_t kv = { KUID_RAW_SIZE, NULL, sizeof(struct tokdata), - sizeof(struct tokdata) + MAX_INT_VAL(guint8) }; + sizeof(struct tokdata) + MAX_INT_VAL(uint8) }; dbstore_packing_t packing = { serialize_tokdata, deserialize_tokdata, free_tokdata }; g_assert(NULL == db_tokdata); g_assert(NULL == tcache_prune_ev); - /* Legacy: remove after 0.97 -- RAM, 2011-05-03 */ - dbstore_move(settings_config_dir(), settings_dht_db_dir(), db_tcache_base); - db_tokdata = dbstore_create(db_tcache_what, settings_dht_db_dir(), db_tcache_base, kv, packing, TOK_DB_CACHE_SIZE, kuid_hash, kuid_eq, GNET_PROPERTY(dht_storage_in_memory)); dbmw_set_map_cache(db_tokdata, TOK_MAP_CACHE_SIZE); + dbmw_set_debugging(db_tokdata, &tcache_dbmw_dbg); token_life = MIN(TOK_LIFE, token_lifetime());
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/tcache.h -> gtk-gnutella-1.1.9.tar.bz2/src/dht/tcache.h
Changed
@@ -44,8 +44,8 @@ void tcache_init(void); void tcache_close(void); void tcache_record(map_t *tokens); -gboolean tcache_get(const kuid_t *id, guint8 *, const void **, time_t *); -gboolean tcache_remove(const kuid_t *id); +bool tcache_get(const kuid_t *id, uint8 *, const void **, time_t *); +bool tcache_remove(const kuid_t *id); #endif /* _dht_tcache_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/token.c -> gtk-gnutella-1.1.9.tar.bz2/src/dht/token.c
Changed
@@ -74,7 +74,7 @@ /* * Is specified token still valid for this Kademlia node? */ -gboolean +bool token_is_valid(const sectoken_t *tok, const knode_t *kn) { /*
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/token.h -> gtk-gnutella-1.1.9.tar.bz2/src/dht/token.h
Changed
@@ -48,7 +48,7 @@ time_delta_t token_lifetime(void); void token_generate(sectoken_t *tok, const knode_t *kn); -gboolean token_is_valid(const sectoken_t *tok, const knode_t *kn); +bool token_is_valid(const sectoken_t *tok, const knode_t *kn); #endif /* _dht_token_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/ulq.c -> gtk-gnutella-1.1.9.tar.bz2/src/dht/ulq.c
Changed
@@ -67,7 +67,9 @@ #include "lib/cq.h" #include "lib/fifo.h" #include "lib/slist.h" +#include "lib/str.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ #define ULQ_MAX_RUNNING 3 /**< Initial amount of concurrent reqs */ @@ -91,7 +93,7 @@ int running; /**< Amount of launched lookups */ int weight; /**< Scheduling weight */ int scheduled; /**< Amount scheduled in the round */ - gboolean runnable; /**< Is queue placed in the runq? */ + bool runnable; /**< Is queue placed in the runq? */ }; enum ulqitem_magic { @@ -117,7 +119,7 @@ } u; lookup_cb_start_t start; /**< Optional starting callback */ lookup_cb_err_t err; /**< Error callback */ - gpointer arg; /**< Common callback opaque argument */ + void *arg; /**< Common callback opaque argument */ }; /** @@ -150,7 +152,7 @@ int sz_in_ema; /**< Slow EMA of incoming message size */ int sz_out_ema; /**< Slow EMA of outgoing message size */ int msg_dropped; /**< Exponentially decaying # of drops */ - gboolean udp_flow_controlled; /**< Whether UDP was flow-controlled */ + bool udp_flow_controlled; /**< Whether UDP was flow-controlled */ } sched; static void ulq_needs_servicing(void); @@ -175,7 +177,7 @@ */ static struct ulq_item * allocate_ulq_item(lookup_type_t type, const kuid_t *kuid, - lookup_cb_start_t start, lookup_cb_err_t err, gpointer arg) + lookup_cb_start_t start, lookup_cb_err_t err, void *arg) { struct ulq_item *ui; @@ -225,7 +227,7 @@ { size_t i; - for (i = 0; i < G_N_ELEMENTS(ulq); i++) { + for (i = 0; i < N_ITEMS(ulq); i++) { struct ulq *uq = ulqi; g_assert(!uq->runnable); @@ -263,7 +265,7 @@ * Intercepting "error" callback. */ static void -ulq_error_cb(const kuid_t *kuid, lookup_error_t error, gpointer arg) +ulq_error_cb(const kuid_t *kuid, lookup_error_t error, void *arg) { struct ulq_item *ui = arg; @@ -279,7 +281,7 @@ * Intercepting "value found" callback. */ static void -ulq_value_found_cb(const kuid_t *kuid, const lookup_val_rs_t *rs, gpointer arg) +ulq_value_found_cb(const kuid_t *kuid, const lookup_val_rs_t *rs, void *arg) { struct ulq_item *ui = arg; @@ -295,7 +297,7 @@ * Intercepting "node found" callback. */ static void -ulq_node_found_cb(const kuid_t *kuid, const lookup_rs_t *rs, gpointer arg) +ulq_node_found_cb(const kuid_t *kuid, const lookup_rs_t *rs, void *arg) { struct ulq_item *ui = arg; @@ -313,7 +315,7 @@ */ static void ulq_lookup_stats(const kuid_t *kuid, - const struct lookup_stats *ls, gpointer arg) + const struct lookup_stats *ls, void *arg) { struct ulq_item *ui = arg; int avg; @@ -379,10 +381,10 @@ static char buf120; size_t i, offset = 0; - for (i = 0; i < G_N_ELEMENTS(ulq); i++) { + for (i = 0; i < N_ITEMS(ulq); i++) { struct ulq *uq = ulqi; - offset += gm_snprintf(&bufoffset, sizeof(buf) - offset, + offset += str_bprintf(&bufoffset, sizeof(buf) - offset, "%s%s: %u/%u", offset > 0 ? ", " : "", uq->name, uq->running, fifo_count(uq->q)); } @@ -395,7 +397,7 @@ * * @return whether a lookup was actually launched */ -static gboolean +static bool ulq_launch(struct ulq *uq) { nlookup_t *nl; @@ -461,13 +463,13 @@ * These are scheduled in the ULQ_PROX queue. */ if (uq == ulqULQ_PROX) - gnet_stats_count_general(GNR_DHT_PUSH_PROXY_LOOKUPS, 1); + gnet_stats_inc_general(GNR_DHT_PUSH_PROXY_LOOKUPS); break; case DHT_VT_PROX: - gnet_stats_count_general(GNR_DHT_PUSH_PROXY_LOOKUPS, 1); + gnet_stats_inc_general(GNR_DHT_PUSH_PROXY_LOOKUPS); break; case DHT_VT_ALOC: - gnet_stats_count_general(GNR_DHT_ALT_LOC_LOOKUPS, 1); + gnet_stats_inc_general(GNR_DHT_ALT_LOC_LOOKUPS); break; default: break; @@ -560,7 +562,7 @@ while (sched.pending > 0 && sched.running < max) { struct ulq *uq; - gboolean launched; + bool launched; /* * If the UDP queue would flow-control with the first batch of @@ -616,12 +618,11 @@ * Callout queue callback to perform queue servicing. */ static void -ulq_do_service(cqueue_t *unused_cq, gpointer unused_obj) +ulq_do_service(cqueue_t *cq, void *unused_obj) { - (void) unused_cq; (void) unused_obj; - service_ev = NULL; + cq_zero(cq, &service_ev); /* * If the DHT is not properly seeded, do not perform user lookups. @@ -695,7 +696,7 @@ * the lookup is flagged as urgent. */ static struct ulq * -ulq_get(lookup_type_t ltype, dht_value_type_t vtype, gboolean prioritary) +ulq_get(lookup_type_t ltype, dht_value_type_t vtype, bool prioritary) { if (prioritary) return ulqULQ_PRIO; @@ -751,8 +752,8 @@ * directly invoked by user code. */ void -ulq_find_store_roots(const kuid_t *kuid, gboolean prioritary, - lookup_cb_ok_t ok, lookup_cb_err_t error, gpointer arg) +ulq_find_store_roots(const kuid_t *kuid, bool prioritary, + lookup_cb_ok_t ok, lookup_cb_err_t error, void *arg) { struct ulq_item *ui; struct ulq *uq; @@ -774,7 +775,7 @@ void ulq_find_value(const kuid_t *kuid, dht_value_type_t type, lookup_cbv_ok_t ok, lookup_cb_start_t start, lookup_cb_err_t error, - gpointer arg) + void *arg) { struct ulq_item *ui; struct ulq *uq; @@ -799,7 +800,7 @@ */ void ulq_find_any_value(const kuid_t *kuid, dht_value_type_t queue_type, - lookup_cbv_ok_t ok, lookup_cb_err_t error, gpointer arg) + lookup_cbv_ok_t ok, lookup_cb_err_t error, void *arg) { struct ulq_item *ui; struct ulq *uq; @@ -824,7 +825,7 @@ * * @return the created queue */ -static G_GNUC_COLD struct ulq * +static struct ulq * G_COLD ulq_init_queue(const char *name, int weight) { struct ulq *uq; @@ -845,10 +846,10 @@ /** * Initialize the user lookup queues. */ -G_GNUC_COLD void +void G_COLD ulq_init(void) { - STATIC_ASSERT(ULQ_QUEUE_COUNT == G_N_ELEMENTS(ulq)); + STATIC_ASSERT(ULQ_QUEUE_COUNT == N_ITEMS(ulq)); g_assert(NULL == ulqULQ_PROX); g_assert(NULL == ulqULQ_ALOC); @@ -889,10 +890,10 @@ * FIFO free item freeing callback. */ static void -free_fifo_item(gpointer item, gpointer data) +free_fifo_item(void *item, void *data) { struct ulq_item *ui = item; - gboolean *exiting = data; + bool *exiting = data; ulq_item_check(ui); @@ -913,16 +914,16 @@ * * @param exiting whether the whole process is exiting */ -G_GNUC_COLD void -ulq_close(gboolean exiting) +void G_COLD +ulq_close(bool exiting) { size_t i; - gboolean one = TRUE; + bool one = TRUE; cq_cancel(&service_ev); slist_free(&sched.runq); - for (i = 0; i < G_N_ELEMENTS(ulq); i++) { + for (i = 0; i < N_ITEMS(ulq); i++) { struct ulq *uq = ulqi; if (uq) {
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/ulq.h -> gtk-gnutella-1.1.9.tar.bz2/src/dht/ulq.h
Changed
@@ -42,7 +42,7 @@ */ void ulq_init(void); -void ulq_close(gboolean exiting); +void ulq_close(bool exiting); #endif /* _dht_ulq_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/values.c -> gtk-gnutella-1.1.9.tar.bz2/src/dht/values.c
Changed
@@ -43,7 +43,7 @@ * published locally by a given IP address and by class C networks (/24) and * define a reasonable maximum for each. * - * Values are bounded to a maximum size, which is node-dependent. For GTKG, + * Values are bound to a maximum size, which is node-dependent. For GTKG, * this is hardwired to 512 bytes and non-configurable. * * Each key tracks the amount of values stored under it and will not accept @@ -63,11 +63,12 @@ #include "common.h" #include "values.h" -#include "kuid.h" -#include "knode.h" #include "acct.h" #include "keys.h" #include "kmsg.h" +#include "knode.h" +#include "kuid.h" +#include "routing.h" #include "stable.h" #include "if/gnet_property.h" @@ -78,20 +79,24 @@ #include "lib/ascii.h" #include "lib/atoms.h" -#include "lib/cq.h" #include "lib/bstr.h" +#include "lib/cq.h" #include "lib/dbmw.h" #include "lib/dbstore.h" -#include "lib/glib-missing.h" +#include "lib/hashing.h" #include "lib/host_addr.h" +#include "lib/hset.h" #include "lib/log.h" /* For log_file_printable() */ +#include "lib/mempcpy.h" #include "lib/parse.h" #include "lib/pmsg.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/tm.h" #include "lib/unsigned.h" #include "lib/vendors.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ /* @@ -102,9 +107,18 @@ * However, we must understand that due to caching, we may very well be * handed out values that fall well outside our k-ball. So we must keep * the thresholds high enough to not limit useful STORE requests. + * + * Moreover, the threshold cannot be static: the size of the DHT can shrink + * or expand dynamically and the thresholds must follow this expansion. + * Therefore, we define the limits for a theoretical kball of 10. If the + * kball expands to 12, it means the size of the network quadrupled and we can + * safely lower the limits by 4, down to a minimum. */ -#define MAX_VALUES_IP 128 /**< Max # of values allowed per IP address */ -#define MAX_VALUES_NET 1024 /**< Max # of values allowed per class C net */ +#define MAX_VALUES_IP 64 /**< Max # of values allowed per IP address */ +#define MIN_VALUES_IP 2 /**< Min # of values allowed per IP address */ +#define MAX_VALUES_NET 512 /**< Max # of values allowed per class C net */ +#define MIN_VALUES_NET 16 /**< Min # of values allowed per class C net */ +#define VALUES_KBALL 10 /**< Theoretical k-ball for max thresholds */ #define MAX_VALUES 262144 /**< Max # of values we accept to manage */ #define EXPIRE_PERIOD 30 /**< Asynchronous expire period: 30 secs */ @@ -112,8 +126,6 @@ #define VALUES_DB_CACHE_SIZE 1024 /**< Amount of values to keep cached */ #define RAW_DB_CACHE_SIZE 512 /**< Amount of raw data to keep cached */ -#define equiv(p,q) (!(p) == !(q)) - /** * Information about a value that is stored to disk and not kept in memory. * The structure is serialized first, not written as-is. @@ -139,22 +151,22 @@ kuid_t cid; /**< The "secondary key" of the value */ vendor_code_t vcode; /**< Vendor code who created the info */ host_addr_t addr; /**< IP address of creator */ - guint16 port; /**< Port number of creator */ - guint8 major; /**< Version major of creator */ - guint8 minor; /**< Version minor of creator */ + uint16 port; /**< Port number of creator */ + uint8 major; /**< Version major of creator */ + uint8 minor; /**< Version minor of creator */ /* Value information */ dht_value_type_t type; /**< Type of value stored */ - guint8 value_major; /**< Major version of value */ - guint8 value_minor; /**< Minor version of value */ - guint16 length; /**< Value length */ - gboolean original; /**< Whether we got data from creator */ + uint8 value_major; /**< Major version of value */ + uint8 value_minor; /**< Minor version of value */ + uint16 length; /**< Value length */ + bool original; /**< Whether we got data from creator */ /* Statistics */ time_t created; /**< When we first created the value */ - guint32 n_republish; /**< Amount of republishing we had */ - guint32 n_replication; /**< Amount of replication we had */ - guint32 s_elapsed_publish; /**< Sum of elapsed time between publications */ - guint32 s_elapsed_replicat; /**< Sum of elapsed time between replications */ - guint32 n_requests; /**< Amount of time value was requested */ + uint32 n_republish; /**< Amount of republishing we had */ + uint32 n_replication; /**< Amount of replication we had */ + uint32 s_elapsed_publish; /**< Sum of elapsed time between publications */ + uint32 s_elapsed_replicat; /**< Sum of elapsed time between replications */ + uint32 n_requests; /**< Amount of time value was requested */ }; /** @@ -162,7 +174,7 @@ * These access keys are retrievable from another DB indexed by the primary * key of the value (see keys.c). */ -static guint64 valueid = 1; /* 0 is not a valid key (used as marker) */ +static uint64 valueid = 1; /* 0 is not a valid key (used as marker) */ /** * Total amount of values currently managed. @@ -173,14 +185,14 @@ * Counts number of values currently stored per IPv4 address and per class C * network. */ -static GHashTable *values_per_ip; -static GHashTable *values_per_class_c; +static acct_net_t *values_per_ip; +static acct_net_t *values_per_class_c; /** * Records expired DB keys that have been identified but not physically * removed yet. */ -static GHashTable *expired; +static hset_t *expired; /** * DBM wrapper to store valuedata. @@ -217,13 +229,64 @@ } /** + * @return max amount of values we can accept per IP address. + */ +static size_t +values_max_per_ip(void) +{ + int kball = dht_get_kball_furthest(); + uint result = MAX_VALUES_IP; + + /* + * The larger the network, the less values we store per IP address. + */ + + if (kball < VALUES_KBALL) { + int delta = VALUES_KBALL - kball; + result *= 1U << delta; + } else if (kball > VALUES_KBALL) { + int delta = kball - VALUES_KBALL; + result /= 1U << delta; + } + + return MAX(result, MIN_VALUES_IP); +} + +/** + * @return max amount of values we can accept per class C network. + */ +static size_t +values_max_per_net(void) +{ + int kball = dht_get_kball_furthest(); + uint result = MAX_VALUES_NET; + + /* + * The larger the network, the less values we store per class C network. + */ + + if (kball < VALUES_KBALL) { + int delta = VALUES_KBALL - kball; + result *= 1U << delta; + } else if (kball > VALUES_KBALL) { + int delta = kball - VALUES_KBALL; + result /= 1U << delta; + } + + return MAX(result, MIN_VALUES_NET); +} + +#define VALUES_DATA_VERSION 1 /* Serialization version number */ + +/** * Serialization routine for valuedata. */ static void -serialize_valuedata(pmsg_t *mb, gconstpointer data) +serialize_valuedata(pmsg_t *mb, const void *data) { const struct valuedata *vd = data; + pmsg_write_u8(mb, VALUES_DATA_VERSION); pmsg_write(mb, vd->id.v, KUID_RAW_SIZE); pmsg_write_time(mb, vd->publish); pmsg_write_time(mb, vd->replicated); @@ -254,12 +317,14 @@ * Deserialization routine for valuedata. */ static void -deserialize_valuedata(bstr_t *bs, gpointer valptr, size_t len) +deserialize_valuedata(bstr_t *bs, void *valptr, size_t len) { struct valuedata *vd = valptr; + uint8 version; g_assert(sizeof *vd == len); + bstr_read_u8(bs, &version); bstr_read(bs, vd->id.v, KUID_RAW_SIZE); bstr_read_time(bs, &vd->publish); bstr_read_time(bs, &vd->replicated); @@ -312,9 +377,9 @@ * @return human-readable error string corresponding to error code `errnum'. */ const char * -dht_store_error_to_string(guint16 errnum) +dht_store_error_to_string(uint16 errnum) { - if (errnum == 0 || errnum >= G_N_ELEMENTS(store_errstr)) + if (errnum == 0 || errnum >= N_ITEMS(store_errstr)) return "Invalid error code"; return store_errstrerrnum; @@ -327,10 +392,10 @@ const knode_t *creator; /**< The creator of the value */ kuid_t *id; /**< The key of the value (atom) */ dht_value_type_t type; /**< Type of values */ - guint8 major; /**< Value's major version */ - guint8 minor; /**< Value's minor version */ - guint16 length; /**< Length of value */ - gconstpointer data; /**< The actual data value */ + uint8 major; /**< Value's major version */ + uint8 minor; /**< Value's minor version */ + uint16 length; /**< Length of value */ + const void *data; /**< The actual data value */ }; const kuid_t * @@ -351,7 +416,7 @@ return v->type; } -guint16 +uint16 dht_value_length(const dht_value_t *v) { return v->length; @@ -383,7 +448,7 @@ dht_value_t * dht_value_make(const knode_t *creator, const kuid_t *primary_key, dht_value_type_t type, - guint8 major, guint8 minor, gpointer data, guint16 length) + uint8 major, uint8 minor, void *data, uint16 length) { dht_value_t *v; @@ -403,6 +468,50 @@ } /** + * Patch the creator of the value to supersede its address and port. + * + * @param v the value + * @param addr the new address to use for the creator + * @param port the new port to use for the creator + */ +void +dht_value_patch_creator(dht_value_t *v, host_addr_t addr, uint16 port) +{ + const knode_t *cn; + + cn = v->creator; + + /* + * Creator can be shared and we cannot blindly update its IP:port. + * When it is shared, clone it and patch the new private copy. + */ + + if (knode_refcnt(cn) > 1) { + v->creator = knode_clone(cn); + knode_free(deconstify_pointer(cn)); + cn = v->creator; + } + + g_assert(1 == knode_refcnt(cn)); + + + if (GNET_PROPERTY(dht_storage_debug)) { + g_warning( + "DHT patching creator's IP %s:%u to match sender's %s", + host_addr_to_string(cn->addr), cn->port, + host_addr_port_to_string(addr, port)); + } + + { + knode_t *wcn = deconstify_pointer(cn); + + wcn->addr = addr; + wcn->port = port; + wcn->flags |= KNODE_F_PCONTACT; + } +} + +/** * Clone a DHT value. */ dht_value_t * @@ -432,17 +541,17 @@ * Free DHT value, optionally freeing the data as well. */ void -dht_value_free(dht_value_t *v, gboolean free_data) +dht_value_free(dht_value_t *v, bool free_data) { g_assert(v); g_assert(equiv(v->length > 0, v->data != NULL)); - knode_free(deconstify_gpointer(v->creator)); + knode_free(deconstify_pointer(v->creator)); kuid_atom_free_null(&v->id); if (free_data && v->data) { g_assert(v->length && v->length <= DHT_VALUE_MAX_LEN); - wfree(deconstify_gpointer(v->data), v->length); + wfree(deconstify_pointer(v->data), v->length); } WFREE(v); @@ -498,7 +607,7 @@ * @return length of the resulting string before potential truncation. */ size_t -dht_value_type_to_string_buf(guint32 type, char *buf, size_t size) +dht_value_type_to_string_buf(uint32 type, char *buf, size_t size) { if (type == DHT_VT_BINARY) { return g_strlcpy(buf, "BIN.", size); @@ -508,7 +617,7 @@ poke_be32(&tmp0, type); - for (i = 0; i < G_N_ELEMENTS(tmp) - 1; i++) { + for (i = 0; i < N_ITEMS(tmp) - 1; i++) { if (!is_ascii_print(tmpi)) tmpi = '.'; } @@ -523,7 +632,7 @@ * @return pointer to static data */ const char * -dht_value_type_to_string(guint32 type) +dht_value_type_to_string(uint32 type) { static char buf5; @@ -537,7 +646,7 @@ * @return pointer to static data */ const char * -dht_value_type_to_string2(guint32 type) +dht_value_type_to_string2(uint32 type) { static char buf5; @@ -562,9 +671,9 @@ knode_to_string_buf(v->creator, knode, sizeof knode); dht_value_type_to_string_buf(v->type, type, sizeof type); - gm_snprintf(buf, sizeof buf, + str_bprintf(buf, sizeof buf, "value pk=%s as %s v%u.%u (%u byte%s) created by %s", - kuid, type, v->major, v->minor, v->length, 1 == v->length ? "" : "s", + kuid, type, v->major, v->minor, v->length, plural(v->length), knode); return buf; @@ -600,10 +709,10 @@ dht_value_t *dv; kuid_t id; knode_t *creator; - guint8 major, minor; - guint16 length; - gpointer data = NULL; - guint32 type; + uint8 major, minor; + uint16 length; + void *data = NULL; + uint32 type; creator = kmsg_deserialize_contact(bs); if (!creator) @@ -670,7 +779,7 @@ /** * DHT value equality test. */ -gboolean +bool dht_value_eq(const void *p1, const void *p2) { const dht_value_t * const v1 = p1; @@ -716,8 +825,8 @@ /** * Hash a pair of KUIDs. */ -static guint -kuid_pair_hash(gconstpointer key) +static uint +kuid_pair_hash(const void *key) { return binary_hash(key, 2 * KUID_RAW_SIZE); } @@ -726,7 +835,7 @@ * Test equality of two KUID pairs. */ static int -kuid_pair_eq(gconstpointer a, gconstpointer b) +kuid_pair_eq(const void *a, const void *b) { return a == b || 0 == memcmp(a, b, 2 * KUID_RAW_SIZE); } @@ -737,12 +846,14 @@ static void kuid_pair_fill(char *buf, size_t len, const kuid_t *key, const kuid_t *skey) { + void *p; + g_assert(len >= 2 * KUID_RAW_SIZE); STATIC_ASSERT(sizeof(key->v) == KUID_RAW_SIZE); - memcpy(&buf0, key->v, sizeof(key->v)); - memcpy(&bufKUID_RAW_SIZE, skey->v, sizeof(skey->v)); + p = mempcpy(buf, key, KUID_RAW_SIZE); + memcpy(p, skey, KUID_RAW_SIZE); } /** @@ -751,7 +862,7 @@ * @param key primary key * @param skey secondary key */ -static gboolean +static bool kuid_pair_was_expired(const kuid_t *key, const kuid_t *skey) { char buf2 * KUID_RAW_SIZE; @@ -825,7 +936,7 @@ * Get valuedata from database. */ static struct valuedata * -get_valuedata(guint64 dbkey) +get_valuedata(uint64 dbkey) { struct valuedata *vd; @@ -833,10 +944,12 @@ if (vd == NULL) { if (dbmw_has_ioerr(db_valuedata)) { - g_warning("DBMW \"%s\" I/O error, bad things could happen...", + s_warning_once_per(LOG_PERIOD_MINUTE, + "DBMW \"%s\" I/O error, bad things could happen...", dbmw_name(db_valuedata)); } else { - g_warning("value for DB-key %s exists but not found in DBMW \"%s\"", + s_warning_once_per(LOG_PERIOD_SECOND, + "value for DB-key %s exists but not found in DBMW \"%s\"", uint64_to_string(dbkey), dbmw_name(db_valuedata)); } return NULL; @@ -852,7 +965,7 @@ * @param has_expired whether deletion happens because value expired */ static void -delete_valuedata(guint64 dbkey, gboolean has_expired) +delete_valuedata(uint64 dbkey, bool has_expired) { const struct valuedata *vd; @@ -865,7 +978,7 @@ values_managed--; acct_net_update(values_per_class_c, vd->addr, NET_CLASS_C_MASK, -1); acct_net_update(values_per_ip, vd->addr, NET_IPv4_MASK, -1); - gnet_stats_count_general(GNR_DHT_VALUES_HELD, -1); + gnet_stats_dec_general(GNR_DHT_VALUES_HELD); if (has_expired) kuid_pair_has_expired(&vd->id, &vd->cid); @@ -879,12 +992,11 @@ /** * Hash table iterator callback to reclaim an expired DB key. */ -static gboolean -reclaim_dbkey(gpointer key, gpointer u_value, gpointer u_data) +static bool +reclaim_dbkey(const void *key, void *u_data) { - guint64 *dbatom = key; + const uint64 *dbatom = key; - (void) u_value; (void) u_data; delete_valuedata(*dbatom, TRUE); @@ -902,14 +1014,14 @@ void values_reclaim_expired(void) { - g_hash_table_foreach_remove(expired, reclaim_dbkey, NULL); + hset_foreach_remove(expired, reclaim_dbkey, NULL); } /** * Callout queue periodic event for value expiration. */ -static gboolean -values_periodic_expire(gpointer unused_obj) +static bool +values_periodic_expire(void *unused_obj) { (void) unused_obj; @@ -921,7 +1033,7 @@ * Log statistics about an expired value. */ static void -log_expired_value_stats(guint64 dbkey, const struct valuedata *vd) +log_expired_value_stats(uint64 dbkey, const struct valuedata *vd) { if (NULL == vd) return; @@ -935,8 +1047,8 @@ (unsigned) vd->n_requests, uint64_to_string(dbkey)); if (GNET_PROPERTY(dht_storage_debug) > 1) { - guint32 avg_publish = 0; - guint32 avg_replicate = 0; + uint32 avg_publish = 0; + uint32 avg_replicate = 0; if (vd->n_republish) avg_publish = vd->s_elapsed_publish / vd->n_republish; @@ -958,11 +1070,11 @@ * to avoid perturbation in the caller's data structures. */ static void -values_expire(guint64 dbkey, const struct valuedata *vd) +values_expire(uint64 dbkey, const struct valuedata *vd) { - const guint64 *dbatom; + const uint64 *dbatom; - if (g_hash_table_lookup(expired, &dbkey)) + if (hset_contains(expired, &dbkey)) return; if (GNET_PROPERTY(dht_storage_debug)) @@ -972,7 +1084,7 @@ g_debug("DHT value DB-key %s expired", uint64_to_string(dbkey)); dbatom = atom_uint64_get(&dbkey); - gm_hash_table_insert_const(expired, dbatom, GINT_TO_POINTER(1)); + hset_insert(expired, dbatom); } /** @@ -983,19 +1095,18 @@ * happens asynchronously. */ static void -values_unexpire(guint64 dbkey) +values_unexpire(uint64 dbkey) { - gpointer key, value; - - if (g_hash_table_lookup_extended(expired, &dbkey, &key, &value)) { - guint64 *dbatom = key; + const void *key; + + if (hset_contains_extended(expired, &dbkey, &key)) { + const uint64 *dbatom = key; - g_hash_table_remove(expired, &dbkey); + hset_remove(expired, &dbkey); atom_uint64_free(dbatom); if (GNET_PROPERTY(dht_storage_debug) > 2) - g_debug("DHT value DB-key %s un-expired", - uint64_to_string(dbkey)); + g_debug("DHT value DB-key %s un-expired", uint64_to_string(dbkey)); } } @@ -1004,26 +1115,27 @@ * If it has, mark it for deletion. * * @return TRUE if value has expired and will be reclaimed the next time - * values_reclaim_expired() is called. If FALSE is returned, the - * actual expiration time is returned through `expire', if not NULL. + * values_reclaim_expired() is called. + * The actual expiration time is returned through `expire', if not NULL. */ -gboolean -values_has_expired(guint64 dbkey, time_t now, time_t *expire) +bool +values_has_expired(uint64 dbkey, time_t now, time_t *expire) { struct valuedata *vd; vd = get_valuedata(dbkey); + + if (expire != NULL) + *expire = NULL == vd ? 0 : vd->expire; + if (NULL == vd) return FALSE; /* I/O error or corrupted database */ - if (now >= vd->expire) { + if (delta_time(now, vd->expire) >= 0) { values_expire(dbkey, vd); return TRUE; } - if (expire) - *expire = vd->expire; - return FALSE; } @@ -1031,7 +1143,7 @@ * Validate that sender and valued's creator agree on other things than * just the KUID: they must agree on everything. */ -static gboolean +static bool validate_creator(const knode_t *sender, const dht_value_t *v) { const knode_t *creator = v->creator; @@ -1052,7 +1164,7 @@ what = "creator must use an IPv4 address"; goto wrong; } - if (!host_addr_equal(sender->addr, creator->addr)) { + if (!host_addr_equiv(sender->addr, creator->addr)) { what = "IP address"; goto mismatch; } @@ -1090,11 +1202,11 @@ * * @return error code, STORE_SC_OK meaning we are neither full nor loaded. */ -static guint16 +static uint16 validate_load(const dht_value_t *v) { - gboolean full; - gboolean loaded; + bool full; + bool loaded; keys_get_status(v->id, &full, &loaded); @@ -1114,11 +1226,13 @@ * * @return error code, STORE_SC_OK meaning quotas are not reached yet. */ -static guint16 +static uint16 validate_quotas(const dht_value_t *v) { - int count; + uint count; const knode_t *c = v->creator; + size_t max_ip = values_max_per_ip(); + size_t max_net = values_max_per_net(); /* Specifications say: creator address must be IPv4 */ if (!host_addr_is_ipv4(c->addr)) @@ -1127,21 +1241,21 @@ count = acct_net_get(values_per_class_c, c->addr, NET_CLASS_C_MASK); if (GNET_PROPERTY(dht_storage_debug) > 2) { - guint32 net = host_addr_ipv4(c->addr) & NET_CLASS_C_MASK; + uint32 net = host_addr_ipv4(c->addr) & NET_CLASS_C_MASK; - g_debug("DHT STORE has %d/%d value%s for class C network %s", - count, MAX_VALUES_NET, 1 == count ? "" : "s", + g_debug("DHT STORE has %u/%zu value%s for class C network %s", + count, max_net, plural(count), host_addr_to_string(host_addr_get_ipv4(net))); } - if (count >= MAX_VALUES_NET) { + if (count >= max_net) { if (GNET_PROPERTY(dht_storage_debug)) { - guint32 net = host_addr_ipv4(c->addr) & NET_CLASS_C_MASK; + uint32 net = host_addr_ipv4(c->addr) & NET_CLASS_C_MASK; g_debug("DHT STORE rejecting \"%s\": " - "has %d/%d value%s for class C network %s", + "has %u/%zu value%s for class C network %s", dht_value_to_string(v), - count, MAX_VALUES_NET, 1 == count ? "" : "s", + count, max_net, plural(count), host_addr_to_string(host_addr_get_ipv4(net))); } goto reject; @@ -1150,17 +1264,15 @@ count = acct_net_get(values_per_ip, c->addr, NET_IPv4_MASK); if (GNET_PROPERTY(dht_storage_debug) > 2) - g_debug("DHT STORE has %d/%d value%s for IP %s", - count, MAX_VALUES_IP, 1 == count ? "" : "s", + g_debug("DHT STORE has %u/%zu value%s for IP %s", + count, max_ip, plural(count), host_addr_to_string(c->addr)); - if (count >= MAX_VALUES_IP) { + if (count >= max_ip) { if (GNET_PROPERTY(dht_storage_debug)) { - g_debug("DHT STORE rejecting \"%s\": " - "has %d/%d value%s for IP %s", + g_debug("DHT STORE rejecting \"%s\": has %u/%zu value%s for IP %s", dht_value_to_string(v), - count, MAX_VALUES_IP, 1 == count ? "" : "s", - host_addr_to_string(c->addr)); + count, max_ip, plural(count), host_addr_to_string(c->addr)); } goto reject; } @@ -1168,7 +1280,7 @@ return STORE_SC_OK; reject: - gnet_stats_count_general(GNR_DHT_REJECTED_VALUE_ON_QUOTA, 1); + gnet_stats_inc_general(GNR_DHT_REJECTED_VALUE_ON_QUOTA); return STORE_SC_QUOTA; } @@ -1178,10 +1290,10 @@ * @return error code, STORE_SC_OK meaning we can accept the value, any * other code being an error condition that must be propagated back. */ -static guint16 +static uint16 validate_new_acceptable(const dht_value_t *v) { - guint16 status; + uint16 status; /* * Check whether we have already reached the maximum amount of values @@ -1247,7 +1359,7 @@ } } - return time_advance(tm_time(), (gulong) (lifetime / decimation)); + return time_advance(tm_time(), (ulong) (lifetime / decimation)); } /** @@ -1267,7 +1379,7 @@ * we will enter the if() below at the first publish . */ - if (!host_addr_equal(vd->addr, cn->addr)) { + if (!host_addr_equiv(vd->addr, cn->addr)) { if (host_addr_initialized(vd->addr)) { /* Republished from a different IP address */ acct_net_update(values_per_class_c, vd->addr, NET_CLASS_C_MASK, -1); @@ -1305,12 +1417,12 @@ * * @return store status code that will be relayed back to the remote node. */ -static guint16 +static uint16 values_remove(const knode_t *kn, const dht_value_t *v) { const knode_t *cn = v->creator; const char *reason = NULL; - guint64 dbkey; + uint64 dbkey; if (!kuid_eq(kn->id, cn->id)) { reason = "not from creator"; @@ -1349,7 +1461,7 @@ } delete_valuedata(dbkey, FALSE); /* Voluntarily deleted */ - gnet_stats_count_general(GNR_DHT_REMOVED, 1); + gnet_stats_inc_general(GNR_DHT_REMOVED); done: if (reason && GNET_PROPERTY(dht_storage_debug)) @@ -1377,7 +1489,7 @@ { time_t now = tm_time(); - STATIC_ASSERT(DHT_VALUE_EXPIRE < MAX_INT_VAL(gint32)); + STATIC_ASSERT(DHT_VALUE_EXPIRE < MAX_INT_VAL(int32)); /* * We only count a republishing if the value was an original, i.e. not @@ -1385,11 +1497,11 @@ */ if (vd->original) { - guint32 elapsed = (guint32) delta_time(now, vd->publish); + uint32 elapsed = (uint32) delta_time(now, vd->publish); vd->n_republish++; vd->s_elapsed_publish = - guint32_saturate_add(vd->s_elapsed_publish, elapsed); + uint32_saturate_add(vd->s_elapsed_publish, elapsed); if (GNET_PROPERTY(dht_storage_debug)) { g_debug("DHT STORE republishing of \"%s\" %s #%u after %s, " @@ -1401,7 +1513,7 @@ } vd->publish = now; - gnet_stats_count_general(GNR_DHT_REPUBLISH, 1); + gnet_stats_inc_general(GNR_DHT_REPUBLISH); } /** @@ -1412,7 +1524,7 @@ { time_t now = tm_time(); - STATIC_ASSERT(DHT_VALUE_EXPIRE < MAX_INT_VAL(gint32)); + STATIC_ASSERT(DHT_VALUE_EXPIRE < MAX_INT_VAL(int32)); /* * Only update the sum of the elapsed time between replications if @@ -1422,9 +1534,9 @@ vd->n_replication++; if (0 != vd->replicated) { - guint32 elapsed = (guint32) delta_time(now, vd->replicated); + uint32 elapsed = (uint32) delta_time(now, vd->replicated); vd->s_elapsed_replicat = - guint32_saturate_add(vd->s_elapsed_replicat, elapsed); + uint32_saturate_add(vd->s_elapsed_replicat, elapsed); if (GNET_PROPERTY(dht_storage_debug)) g_debug("DHT STORE replication of \"%s\" %s #%u after %s", @@ -1434,7 +1546,7 @@ } vd->replicated = now; - gnet_stats_count_general(GNR_DHT_REPLICATION, 1); + gnet_stats_inc_general(GNR_DHT_REPLICATION); } /** @@ -1442,14 +1554,14 @@ * * @return store status code that will be relayed back to the remote node. */ -static guint16 +static uint16 values_publish(const knode_t *kn, const dht_value_t *v) { - guint64 dbkey; + uint64 dbkey; const char *what; struct valuedata *vd = NULL; struct valuedata new_vd; - gboolean check_data = FALSE; + bool check_data = FALSE; /* * Look whether we already hold this value (in which case it could @@ -1460,7 +1572,7 @@ if (0 == dbkey) { const knode_t *cn = v->creator; - guint16 acceptable; + uint16 acceptable; acceptable = validate_new_acceptable(v); if (acceptable != STORE_SC_OK) @@ -1477,7 +1589,7 @@ if (kuid_eq(kn->id, cn->id)) { if (!validate_creator(kn, v)) { - gnet_stats_count_general(GNR_DHT_REJECTED_VALUE_ON_CREATOR, 1); + gnet_stats_inc_general(GNR_DHT_REJECTED_VALUE_ON_CREATOR); return STORE_SC_BAD_CREATOR; } vd->original = TRUE; @@ -1497,10 +1609,10 @@ keys_add_value(v->id, cn->id, dbkey, vd->expire); values_managed++; - gnet_stats_count_general(GNR_DHT_VALUES_HELD, +1); - gnet_stats_count_general(GNR_DHT_PUBLISHED, 1); + gnet_stats_inc_general(GNR_DHT_VALUES_HELD); + gnet_stats_inc_general(GNR_DHT_PUBLISHED); } else { - gboolean is_original = kuid_eq(kn->id, v->creator->id); + bool is_original = kuid_eq(kn->id, v->creator->id); vd = get_valuedata(dbkey); @@ -1544,7 +1656,7 @@ const knode_t *cn = v->creator; if (!validate_creator(kn, v)) { - gnet_stats_count_general(GNR_DHT_REJECTED_VALUE_ON_CREATOR, 1); + gnet_stats_inc_general(GNR_DHT_REJECTED_VALUE_ON_CREATOR); return STORE_SC_BAD_CREATOR; } @@ -1575,7 +1687,7 @@ values_unexpire(dbkey); kuid_pair_was_republished(&vd->id, &vd->cid); - keys_update_value(&vd->id, vd->expire); + keys_update_value(&vd->id, &vd->cid, vd->expire); } } @@ -1585,13 +1697,20 @@ if (check_data) { size_t length; - gpointer data; + void *data; if (values_has_expired(dbkey, tm_time(), NULL)) goto expired; data = dbmw_read(db_rawdata, &dbkey, &length); + if G_UNLIKELY(NULL == data) { + s_warning_once_per(LOG_PERIOD_MINUTE, + "DBMW \"%s\" I/O error, %s() aborted", + dbmw_name(db_rawdata), G_STRFUNC); + return STORE_SC_DB_IO; /* I/O error or corrupted DB */ + } + g_assert(data); g_assert(length == vd->length); /* Or our bookkeeping is faulty */ g_assert(v->length == vd->length); /* Ensured by preceding code */ @@ -1604,7 +1723,7 @@ goto mismatch; } - /* + /* * Here we checked everything the remote node sent us and it * exactly matches what we have already. Everything is thus fine * and we're done. @@ -1618,7 +1737,7 @@ g_assert(v->length == vd->length); /* Ensured by preceding code */ - dbmw_write(db_rawdata, &dbkey, deconstify_gpointer(v->data), v->length); + dbmw_write(db_rawdata, &dbkey, deconstify_pointer(v->data), v->length); } dbmw_write(db_valuedata, &dbkey, vd, sizeof *vd); @@ -1634,19 +1753,19 @@ kuid_to_hex_string(&vd->id), kuid_to_hex_string2(&vd->cid), dht_value_type_to_string(vd->type), vd->value_major, vd->value_minor, - vd->length, 1 == vd->length ? "" : "s", + vd->length, plural(vd->length), vd->original ? "original" : "copy"); } return STORE_SC_DATA_MISMATCH; expired: - gnet_stats_count_general(GNR_DHT_STALE_REPLICATION, 1); + gnet_stats_inc_general(GNR_DHT_STALE_REPLICATION); if (GNET_PROPERTY(dht_storage_debug)) g_debug("DHT STORE detected replication of expired data %s from %s", dht_value_to_string(v), knode_to_string(kn)); - + return STORE_SC_OK; /* No error reported, data is stale and must die */ } @@ -1659,20 +1778,22 @@ * * @return store status code that will be relayed back to the remote node. */ -guint16 -values_store(const knode_t *kn, const dht_value_t *v, gboolean token) +uint16 +values_store(const knode_t *kn, const dht_value_t *v, bool token) { - guint16 status = STORE_SC_OK; + uint16 status = STORE_SC_OK; knode_check(kn); g_assert(v); - g_assert(dbmw_count(db_rawdata) == (size_t) values_managed); + g_assert_log(dbmw_count(db_rawdata) == (size_t) values_managed, + "rawdata count=%zu, values_managed=%d", + dbmw_count(db_rawdata), values_managed); if (GNET_PROPERTY(dht_storage_debug) > 1) { g_debug("DHT STORE %s as %s v%u.%u (%u byte%s) created by %s (%s)", kuid_to_hex_string(v->id), dht_value_type_to_string(v->type), - v->major, v->minor, v->length, 1 == v->length ? "" : "s", + v->major, v->minor, v->length, plural(v->length), knode_to_string(v->creator), kuid_eq(v->creator->id, kn->id) ? "original" : "copy"); @@ -1729,7 +1850,9 @@ status = 0 == v->length ? values_remove(kn, v) : values_publish(kn, v); - g_assert(dbmw_count(db_rawdata) == (size_t) values_managed); + g_assert_log(dbmw_count(db_rawdata) == (size_t) values_managed, + "rawdata count=%zu, values_managed=%d", + dbmw_count(db_rawdata), values_managed); /* FALL THROUGH */ @@ -1752,10 +1875,10 @@ * @return the DHT value, or NULL if type is not matching. */ dht_value_t * -values_get(guint64 dbkey, dht_value_type_t type) +values_get(uint64 dbkey, dht_value_type_t type) { struct valuedata *vd; - gpointer vdata = NULL; + void *vdata = NULL; knode_t *creator; dht_value_t *v; @@ -1787,13 +1910,21 @@ */ vd->n_requests++; + dbmw_write(db_valuedata, &dbkey, vd, sizeof *vd); if (vd->length) { size_t length; - gpointer data; + void *data; data = dbmw_read(db_rawdata, &dbkey, &length); + if G_UNLIKELY(NULL == data) { + s_warning_once_per(LOG_PERIOD_MINUTE, + "DBMW \"%s\" I/O error, %s() aborted", + dbmw_name(db_rawdata), G_STRFUNC); + return NULL; /* I/O error or corrupted DB */ + } + g_assert(data); g_assert(length == vd->length); /* Or our bookkeeping is faulty */ @@ -1811,14 +1942,150 @@ } /** + * DBMW iterator callback to reload the values from the sepcified DB keys. + * + * @return TRUE if entry must be deleted. + */ +static bool G_COLD +values_reload(void *key, void *value, size_t u_len, void *data) +{ + const uint64 *dbk = key; + const struct valuedata *vd = value; + const hset_t *dbkeys = data; + uint64 vk; + bool full, loaded; + + (void) u_len; + + /* + * If the DB key is not in the set to keep, delete it and remove any + * raw data associated with it (same DB key between the two databases). + */ + + if (!hset_contains(dbkeys, dbk)) + goto delete_value; + + /* + * If the raw data does not exist for this value, then we have a corrupted + * value or raw SDBM file. Delete the value. + */ + + if (!dbmw_exists(db_rawdata, dbk)) { + g_warning("DHT VALUE ignoring persisted value pk=%s, sk=%s: lost data", + kuid_to_hex_string(&vd->id), kuid_to_hex_string2(&vd->cid)); + return TRUE; + } + + /* + * Normally, keys must be unique in the database, but if the file was + * corrupted then we may find ourselves with duplicates. So be careful. + */ + + vk = keys_has(&vd->id, &vd->cid, FALSE); + + if (0 != vk) { + g_warning("DHT VALUE ignoring duplicate persisted value pk=%s, sk=%s", + kuid_to_hex_string(&vd->id), kuid_to_hex_string2(&vd->cid)); + goto delete_value; + } + + /* + * Check that value has not expired. + */ + + if (delta_time(tm_time(), vd->expire) >= 0) + goto delete_value; + + /* + * Ensure key is not full. If the database is corrupted, then we may + * attempt to load more values than the key can hold. + */ + + keys_get_status(&vd->id, &full, &loaded); + + if (full) { + g_warning("DHT VALUE ignoring persisted value pk=%s, sk=%s: full key!", + kuid_to_hex_string(&vd->id), kuid_to_hex_string2(&vd->cid)); + goto delete_value; + } + + /* + * New values we will store in the session must not supersede any existing + * value from the older session. Therefore, make sure the starting point + * for newly allocated DB keys is one higher than the largest DB key we + * are keeping in the database. + */ + + if (*dbk >= valueid) + valueid = *dbk + 1; /* Update next allocated DB key */ + + /* + * Add the value to the key and update quota statistics as we would when + * receiving a DHT publish request. + */ + + keys_add_value(&vd->id, &vd->cid, *dbk, vd->expire); + acct_net_update(values_per_class_c, vd->addr, NET_CLASS_C_MASK, +1); + acct_net_update(values_per_ip, vd->addr, NET_IPv4_MASK, +1); + + return FALSE; /* Keep value entry */ + +delete_value: + dbmw_delete(db_rawdata, dbk); + return TRUE; +} + +/** + * DBMW iterator callback to purge raw data not bearing the sepcified DB keys. + * + * @return TRUE if entry must be deleted. + */ +static bool G_COLD +values_raw_purge(void *key, void *u_value, size_t u_len, void *data) +{ + const uint64 *dbk = key; + const hset_t *dbkeys = data; /* Contains the DB keys to keep */ + + (void) u_value; + (void) u_len; + + if (!hset_contains(dbkeys, dbk)) + return TRUE; + + /* + * Just because a DB key is present in the "raw database" and is among + * the specified keys to reload does not mean that DB key was present + * in the "value database". + */ + + if (!dbmw_exists(db_valuedata, dbk)) { + g_warning("DHT VALUE missing value information for DB key %s", + uint64_to_string(*dbk)); + return TRUE; + } + + return FALSE; /* Keep the entry: in the set, and value exists */ +} + +/** + * Periodic DB synchronization. + */ +void +values_sync(void) +{ + dbstore_sync_flush(db_valuedata); + dbstore_sync_flush(db_rawdata); +} + +/** * Initialize values management. */ -G_GNUC_COLD void +void G_COLD values_init(void) { dbstore_kv_t value_kv = - { sizeof(guint64), NULL, sizeof(struct valuedata), 0 }; - dbstore_kv_t raw_kv = { sizeof(guint64), NULL, DHT_VALUE_MAX_LEN, 0 }; + { sizeof(uint64), NULL, sizeof(struct valuedata), 0 }; + dbstore_kv_t raw_kv = { sizeof(uint64), NULL, DHT_VALUE_MAX_LEN, 0 }; dbstore_kv_t expired_kv = { 2 * KUID_RAW_SIZE, NULL, 0, 0 }; dbstore_packing_t value_packing = { serialize_valuedata, deserialize_valuedata, NULL }; @@ -1832,17 +2099,12 @@ g_assert(NULL == expired); g_assert(NULL == values_expire_ev); - /* Legacy: remove after 0.97 -- RAM, 2011-05-03 */ - dbstore_move(settings_config_dir(), settings_dht_db_dir(), db_valbase); - dbstore_move(settings_config_dir(), settings_dht_db_dir(), db_rawbase); - dbstore_move(settings_config_dir(), settings_dht_db_dir(), db_expbase); - - db_valuedata = dbstore_create(db_valwhat, settings_dht_db_dir(), + db_valuedata = dbstore_open(db_valwhat, settings_dht_db_dir(), db_valbase, value_kv, value_packing, VALUES_DB_CACHE_SIZE, uint64_mem_hash, uint64_mem_eq, GNET_PROPERTY(dht_storage_in_memory)); - db_rawdata = dbstore_create(db_rawwhat, settings_dht_db_dir(), db_rawbase, + db_rawdata = dbstore_open(db_rawwhat, settings_dht_db_dir(), db_rawbase, raw_kv, no_packing, RAW_DB_CACHE_SIZE, uint64_mem_hash, uint64_mem_eq, GNET_PROPERTY(dht_storage_in_memory)); @@ -1852,18 +2114,81 @@ values_per_ip = acct_net_create(); values_per_class_c = acct_net_create(); - expired = g_hash_table_new(uint64_hash, uint64_eq); + expired = hset_create_any(uint64_hash, NULL, uint64_eq); values_expire_ev = cq_periodic_main_add(EXPIRE_PERIOD * 1000, values_periodic_expire, NULL); } +/** + * Reload values whose DB keys are supplied in the set, and discard others. + * + * @param dbkeys set of DB keys to reload + */ +void G_COLD +values_init_data(const hset_t *dbkeys) +{ + g_assert(dbkeys != NULL); + + if (GNET_PROPERTY(dht_values_debug)) { + g_debug("DHT VALUES attempting to reload %zu value%s out of %zu", + hset_count(dbkeys), plural(hset_count(dbkeys)), + dbmw_count(db_valuedata)); + } + + /* + * When we are called, the keys have been reloaded from the database + * and we now have to insert the values in the keys by looking only at + * the specified DB keys. + */ + + dbmw_foreach_remove(db_valuedata, values_reload, + deconstify_pointer(dbkeys)); + + /* + * Purge any raw data that should not be there any longer. + */ + + dbmw_foreach_remove(db_rawdata, values_raw_purge, + deconstify_pointer(dbkeys)); + + /* + * Update statistics, perform sanity checks. + */ + + values_managed = dbmw_count(db_rawdata); + gnet_stats_set_general(GNR_DHT_VALUES_HELD, values_managed); + + g_soft_assert_log(dbmw_count(db_rawdata) == dbmw_count(db_valuedata), + "raw data count: %zu, value count: %zu", + dbmw_count(db_rawdata), dbmw_count(db_valuedata)); + + if (GNET_PROPERTY(dht_values_debug)) { + g_debug("DHT VALUES reloaded %zu value%s", dbmw_count(db_valuedata), + plural(dbmw_count(db_valuedata))); + } + + /* + * Adjust database size. + */ + + if (0 == values_managed) + valueid = 1; + + dbstore_compact(db_rawdata); + dbstore_compact(db_valuedata); + + if (GNET_PROPERTY(dht_values_debug)) { + g_debug("DHT VALUES first allocated value DB-key will be %s", + uint64_to_string(valueid)); + } +} + static void -expired_free_kv(gpointer key, gpointer u_val, gpointer u_data) +expired_free_k(const void *key, void *u_data) { - guint64 *dbkey = key; + const uint64 *dbkey = key; - (void) u_val; (void) u_data; atom_uint64_free(dbkey); @@ -1872,22 +2197,22 @@ /** * Close values management. */ -G_GNUC_COLD void +void G_COLD values_close(void) { - dbstore_delete(db_valuedata); - dbstore_delete(db_rawdata); + dbstore_close(db_valuedata, settings_dht_db_dir(), db_valbase); + dbstore_close(db_rawdata, settings_dht_db_dir(), db_rawbase); dbstore_delete(db_expired); db_valuedata = db_rawdata = db_expired = NULL; - acct_net_free(&values_per_ip); - acct_net_free(&values_per_class_c); + acct_net_free_null(&values_per_ip); + acct_net_free_null(&values_per_class_c); cq_periodic_remove(&values_expire_ev); values_managed = 0; gnet_stats_set_general(GNR_DHT_VALUES_HELD, 0); - g_hash_table_foreach(expired, expired_free_kv, NULL); - gm_hash_table_destroy_null(&expired); + hset_foreach(expired, expired_free_k, NULL); + hset_free_null(&expired); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/dht/values.h -> gtk-gnutella-1.1.9.tar.bz2/src/dht/values.h
Changed
@@ -37,27 +37,32 @@ #include "if/dht/value.h" #include "if/dht/lookup.h" -#include "lib/pmsg.h" #include "lib/bstr.h" +#include "lib/pmsg.h" /* * Public interface. */ +struct hset; + void values_init(void); +void values_init_data(const struct hset *dbkeys); void values_close(void); size_t values_count(void); -guint16 values_store(const knode_t *kn, const dht_value_t *v, gboolean token); -dht_value_t *values_get(guint64 dbkey, dht_value_type_t type); +uint16 values_store(const knode_t *kn, const dht_value_t *v, bool token); +dht_value_t *values_get(uint64 dbkey, dht_value_type_t type); void values_reclaim_expired(void); -gboolean values_has_expired(guint64 dbkey, time_t now, time_t *expire); +bool values_has_expired(uint64 dbkey, time_t now, time_t *expire); +void values_sync(void); void dht_value_serialize(pmsg_t *mb, const dht_value_t *v); dht_value_t *dht_value_deserialize(bstr_t *bs); int dht_value_cmp(const void *a, const void *b); void dht_value_fill_record(const dht_value_t *v, lookup_val_rc_t *rc); +void dht_value_patch_creator(dht_value_t *v, host_addr_t addr, uint16 port); #endif /* _dht_values_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/gcc.h
Added
@@ -0,0 +1,332 @@ +/* + * Copyright (c) 2010-2016 Raphael Manfredi + * Copyright (c) 2003-2009 Chrisian Biere + * Copyright (c) 2001-2003 Richard Eckart + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup core + * @file + * + * Common gcc-specific macros. + * + * @author Richard Eckart + * @date 2001-2003 + * @author Christian Biere + * @date 2003-2009 + * @author Raphael Manfredi + * @date 2010-2016 + */ + +#ifndef _gcc_h_ +#define _gcc_h_ + +#if defined(__GNUC__) && defined(__GNUC_MINOR__) +/** + * HAS_GCC allows conditionalization depending on the version of gcc + * being used to compile the source. + * + * Check each version at "http://gcc.gnu.org/onlinedocs/" for + * support. Specific functionality may also be broken in some + * compiler revisions, so it is useful to conditionalize on the + * version. + */ +#define HAS_GCC(major, minor) \ + ((__GNUC__ > (major)) || \ + (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))) +#else +#define HAS_GCC(major, minor) 0 +#endif + +/* + * If functions have this attribute GCC warns if it one of the specified + * parameters is NULL. This macro takes a list of parameter indices. The + * list must be embraced with parentheses for compatibility with C89 + * compilers. Example: + * + * void my_memcpy(void *dst, const void *src, size_t n) NON_NULL_PARAM((1, 2)); + */ +#if defined(HASATTRIBUTE) && HAS_GCC(3, 3) +#define NON_NULL_PARAM(x) __attribute__((__nonnull__ x)) +#else /* GCC < 3.3 */ +#define NON_NULL_PARAM(x) +#endif + +/** + * This is the same as G_PRINTF() but for function pointers. Older versions + * of GCC do not allow function attributes for function pointers. + */ +#if defined(HASATTRIBUTE) && HAS_GCC(3, 0) +#define G_PRINTF_PTR(x, y) __attribute__((format(_G_GNU_PRINTF_, (x), (y)))) +#else /* GCC < 3.0 */ +#define G_PRINTF_PTR(x, y) +#endif + +/* + * Functions using this attribute cause a warning if the returned + * value is not used. + */ +#if defined(HASATTRIBUTE) && HAS_GCC(3, 4) +#define WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) +#else /* GCC < 3.4 */ +#define WARN_UNUSED_RESULT +#endif + +/* + * Instructs the compiler to emit code for this function even if it is + * or seems to be unused. + */ +#if defined(HASATTRIBUTE) && HAS_GCC(3, 1) +#define G_USED __attribute__((__used__)) +#else /* GCC < 3.1 || !GCC */ +#define G_USED +#endif + +/* + * Let the compiler know that the function may be unused, hence it should + * not emit any warning about it. + * + * Can also tag function parameters as remaining purposedly unused. + */ +#if defined(HASATTRIBUTE) && HAS_GCC(3, 1) +#define G_UNUSED __attribute__((__unused__)) +#else /* GCC < 3.1 */ +#define G_UNUSED +#endif + +/* + * The antidote for WARN_UNUSED_RESULT. This attribute is sometimes + * misused for functions that return a result which SHOULD NOT be + * ignored in contrast to MUST NOT. Unfortunately, a simple "(void)" + * does not suppress this warning. + */ +#define IGNORE_RESULT(x) \ + G_STMT_START { if (0 != (x)) {} } G_STMT_END + +/* + * Functions using this attribute cause a warning if the variable + * argument list does not contain a NULL pointer. + */ +#if defined(HASATTRIBUTE) && HAS_GCC(4, 0) +#define G_NULL_TERMINATED __attribute__((__sentinel__)) +#else /* GCC < 4 */ +#define G_NULL_TERMINATED +#endif /* GCC >= 4 */ + +/* + * Define G_LIKELY() and G_UNLIKELY() so that they are available when + * using GLib 1.2 as well. These allow optimization by static branch + * prediction with GCC. + */ +#ifndef G_LIKELY +#if HAS_GCC(3, 4) /* Just a guess, a Configure check would be better */ +#define G_LIKELY(x) (__builtin_expect((x), 1)) +#define G_UNLIKELY(x) (__builtin_expect((x), 0)) +#else /* !GCC >= 3.4 */ +#define G_LIKELY(x) (x) +#define G_UNLIKELY(x) (x) +#endif /* GCC >= 3.4 */ +#endif /* !G_LIKELY */ + +/** + * A pure function has no effects except its return value and the return value + * depends only on the parameters and/or global variables. + */ +#if defined(HASATTRIBUTE) && HAS_GCC(2, 96) +#define G_PURE __attribute__((__pure__)) +#else +#define G_PURE +#endif /* GCC >= 2.96 */ + +#if defined(HASATTRIBUTE) && HAS_GCC(2, 4) +#define G_CONST __attribute__((__const__)) +#else +#define G_CONST +#endif /* GCC >= 2.4 */ + +/* + * The __gnu__printf__ format appeared in gcc 4.4. + */ +#if HAS_GCC(4, 4) +#define _G_GNU_PRINTF_ __gnu_printf__ +#else +#define _G_GNU_PRINTF_ __printf__ +#endif + +/** + * Used to signal a function that does not return. + * + * The compiler can then optimize calls to that routine by not saving + * registers before calling the routine. However, this can mess up the + * stack unwinding past these routines. + */ +#if defined(HASATTRIBUTE) && HAS_GCC(2, 4) +#define G_NORETURN __attribute__((__noreturn__)) +#else +#define G_NORETURN +#endif /* GCC >= 2.4 */ + +#if defined(HASATTRIBUTE) && HAS_GCC(3, 0) +#define G_MALLOC __attribute__((__malloc__)) WARN_UNUSED_RESULT +#else +#define G_MALLOC +#endif /* GCC >= 3.0 */ + +/** + * A hot function is optimized more aggressively. + */ +#if defined(HASATTRIBUTE) && HAS_GCC(4, 3) +#define G_HOT __attribute__((hot)) +#else +#define G_HOT +#endif /* GCC >= 4.3 */ + +/** + * A cold function is unlikely executed, and is optimized for size rather + * than speed. All branch tests leading to it are marked "unlikely". + */ +#if defined(HASATTRIBUTE) && HAS_GCC(4, 3) +#define G_COLD __attribute__((cold)) +#else +#define G_COLD +#endif /* GCC >= 4.3 */ + +#if defined(HASATTRIBUTE) && HAS_GCC(3, 1) +#define ALWAYS_INLINE __attribute__((always_inline)) +#else +#define ALWAYS_INLINE +#endif /* GCC >= 3.1 */ + +#if defined(HASATTRIBUTE) && HAS_GCC(3, 1) +#define NO_INLINE __attribute__((noinline)) +#else +#define NO_INLINE +#endif /* GCC >= 3.1 */ + +#if defined(HASATTRIBUTE) && HAS_GCC(2, 7) +#define G_ALIGNED(n) __attribute__((aligned(n))) +#else +#define G_ALIGNED(n) +#endif /* GCC >= 3.1 */ + +#if defined(HASATTRIBUTE) && defined(HAS_REGPARM) +#define REGPARM(n) __attribute__((__regparm__((n)))) +#else +#define REGPARM(n) +#endif /* HAS_REGPARM */ + +/** + * This avoid compilation warnings when handing "long long" types with gcc + * invoked with options -pedantic and -ansi. + */ +#if HAS_GCC(2, 8) +#define G_EXTENSION __extension__ +#else +#define G_EXTENSION +#endif + +/* + * Define G_PRINTF to use "GNU printf" argument form (gcc >= 4.4). + * This ensures that "%m" is recognized as valid since the GNU libc supports it. + */ +#if defined(HASATTRIBUTE) && HAS_GCC(3, 0) +#define G_PRINTF(_fmt_, _arg_) \ + __attribute__((__format__ (_G_GNU_PRINTF_, _fmt_, _arg_))) +#else +#define G_PRINTF(_fmt_, _arg_) +#endif + +/** + * G_FORMAT() identifies a printf()-like format argument for a function + * returning a C string. + */ +#if defined(HASATTRIBUTE) && HAS_GCC(2, 5) +#define G_FORMAT(_arg_) __attribute__((__format_arg__ (_arg_))) +#else +#define G_FORMAT(_arg_) +#endif + +/** + * IS_CONSTANT() returns TRUE if the expression is a compile-time constant. + */ +#if HAS_GCC(3, 0) +#define IS_CONSTANT(x) __builtin_constant_p(x) +#else +#define IS_CONSTANT(x) FALSE +#endif + +/* + * Memory pre-fetching requests. + * + * One can request pre-fetch of a memory location for read or write, and + * with a low (default), medium or high expected lifespan in the cache. + */ +#if HAS_GCC(3, 0) /* Just a guess, a Configure check would be better */ +#define G_PREFETCH_R(x) __builtin_prefetch((x), 0, 0) +#define G_PREFETCH_W(x) __builtin_prefetch((x), 1, 0) +#define G_PREFETCH_MED_R(x) __builtin_prefetch((x), 0, 1) +#define G_PREFETCH_MED_W(x) __builtin_prefetch((x), 1, 1) +#define G_PREFETCH_HI_R(x) __builtin_prefetch((x), 0, 3) +#define G_PREFETCH_HI_W(x) __builtin_prefetch((x), 1, 3) +#else /* !GCC >= 3.0 */ +#define G_PREFETCH_R(x) +#define G_PREFETCH_W(x) +#define G_PREFETCH_MED_R(x) +#define G_PREFETCH_MED_W(x) +#define G_PREFETCH_HI_R(x) +#define G_PREFETCH_HI_W(x) +#endif /* GCC >= 3.0 */ + +/** + * G_PRAGMA() lets one add a #pragma directive into another macro. + */ +#if HAS_GCC(3, 0) +#define G_PRAGMA(x) _Pragma(#x) +#else +#define G_PRAGMA(x) +#endif + +/** + * G_IGNORE_PUSH() and G_IGNORE_POP can be used to disable a particular + * warning purposedly for some section of the file and then later restore + * the original warnings. + */ +#if HAS_GCC(3, 0) +#define G_IGNORE_PUSH(x) \ + G_PRAGMA(GCC diagnostic push) \ + G_PRAGMA(GCC diagnostic ignored #x) +#define G_IGNORE_POP G_PRAGMA(GCC diagnostic pop) +#else +#define G_IGNORE_PUSH(x) +#define G_IGNORE_POP +#endif + +/** + * G_IGNORE() can be used to disable a particular warning from here on. + */ +#if HAS_GCC(3, 0) +#define G_IGNORE(x) G_PRAGMA(GCC diagnostic ignored #x) +#else +#define G_IGNORE(x) +#endif + +#endif /* _gcc.h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/gtk-gnutella.h -> gtk-gnutella-1.1.9.tar.bz2/src/gtk-gnutella.h
Changed
@@ -37,21 +37,23 @@ * Constants */ -#define GTA_PRODUCT_NAME "gtk-gnutella" /**< Normally "gtk-gnutella" */ -#define GTA_VERSION 0 /**< major version */ -#define GTA_SUBVERSION 98 /**< minor version */ -#define GTA_PATCHLEVEL 2 /**< patch level or teeny version */ -#define GTA_REVISION "stable" /**< unstable, beta, stable */ -#define GTA_REVCHAR "" /**< (u)nstable, (b)eta, none -> stable */ -#define GTA_RELEASE "2011-12-30" /**< ISO 8601 format YYYY-MM-DD */ -#define GTA_WEBSITE "http://gtk-gnutella.sourceforge.net/" +#define GTA_PRODUCT_NAME "gtk-gnutella" /**< Normally "gtk-gnutella" */ +#define GTA_VERSION 1 /**< major version */ +#define GTA_SUBVERSION 1 /**< minor version */ +#define GTA_PATCHLEVEL 9 /**< patch level or teeny version */ +#define GTA_REVISION "stable" /**< unstable, beta, stable */ +#define GTA_REVCHAR "" /**< (u)nstable, (b)eta, "" -> stable */ +#define GTA_RELEASE "2016-03-06" /**< ISO 8601 format YYYY-MM-DD */ +#define GTA_WEBSITE "http://gtk-gnutella.sourceforge.net/" +#define GTA_VENDOR_CODE "GTKG" +#define GTA_PRODUCT_NICK "gtkg" #if defined(USE_GTK1) -#define GTA_INTERFACE "GTK1" +#define GTA_INTERFACE "GTK1" #elif defined(USE_GTK2) -#define GTA_INTERFACE "GTK2" +#define GTA_INTERFACE "GTK2" #elif defined(USE_TOPLESS) -#define GTA_INTERFACE "Topless" +#define GTA_INTERFACE "Topless" #else #error "Expected Gtk+ 1.2, Gtk+ 2.x or headless as user-interface." #endif @@ -69,7 +71,7 @@ #define GTA_PORT 6346 /**< Default "standard" port */ #ifndef GTA_BUILD -#define GTA_BUILD "$Revision$" +#define GTA_BUILD "$Revision$" #endif /*
View file
gtk-gnutella-0.98.2.tar.bz2/src/gtk-gnutella.man -> gtk-gnutella-1.1.9.tar.bz2/src/gtk-gnutella.man
Changed
@@ -8,7 +8,7 @@ .\" or simply: .\" nroff -man gtk\-gnutella.man | less -s .\" -.TH GTK\\-GNUTELLA 1 "December 2011" Version "0.98.2" +.TH GTK\\-GNUTELLA 1 "March 2016" Version "1.1.9" .SH NAME gtk\-gnutella \- A Gnutella client for Gtk+ .SH SYNOPSIS @@ -30,6 +30,8 @@ .I gtk\-gnutella powerful, efficient and reliable. .SH OPTIONS +All the options can be abbreviated as long as the supplied name is not +ambiguous. .TP .B "\-\-compile-info" Tell @@ -66,7 +68,7 @@ Execute command specified in .I path when -.I gtk-gnutella +.I gtk\-gnutella crashes. .TP .B "\-\-geometry" @@ -108,12 +110,26 @@ .I gtk\-gnutella a SIGHUP signal to create new log files. .TP +.B "\-\-log\-supervise" +Redirects the logs for the supervisor process. +.TP +.B "\-\-no\-dbus" +Disable notifications of +.I gtk\-gnutella +events to D-BUS. +.TP .B "\-\-no\-restart" Prevents .I gtk\-gnutella from auto-restarting itself when crashing on a platform where core dumps are not possible or disabled. .TP +.B "\-\-no\-supervise" +Prevents +.I gtk\-gnutella +from starting a supervising process that will monitor the main process and +automatically restart a new instance when the previous one exits abnormally. +.TP .B "\-\-no\-xshm" Disable MIT shared memory extension, when running with the X graphical user-interface. @@ -336,13 +352,14 @@ .B http://rfc\\-gnutella.sourceforge.net/ .SH AUTHORS Yann Grossel wrote the original -.B gtk\-gnutella . +.B gtk\-gnutella +which was running as a Gnutella 0.4 client in 2000. .PP Raphael Manfredi <Raphael_Manfredi@pobox.com> is the current maintainer and project leader (since version 0.14, released early September 2001). .br For support, please contact the developer list, which can be reached -at <gtk-gnutella-devel@lists.sourceforge.net>. +at <gtk\-gnutella-devel@lists.sourceforge.net>. .PP For a full list of contributors, open the "About" menu. .PP @@ -351,7 +368,7 @@ .SH COPYRIGHT .I gtk\-gnutella is Copyright (c) 2000, Yann Grossel, with additional copyrights held -by other contributors 2000-2009. +by other contributors 2000-2014. .PP License to use and copy .I gtk\-gnutella @@ -359,11 +376,6 @@ License (GPL), version 2. Please see the file COPYING in the distribution for complete information. -Permission is granted to make and distribute verbatim copies of this -manual page provided the copyright notice and this permission notice -are preserved on all copies. - -Permission is granted to copy and distribute modified versions of -this manual page under the conditions for verbatim copying, provided -that the entire resulting derived work is distributed under the -terms of a permission notice identical to this one. +This manual page can also be redistributed under the same conditions as +.I gtk\-gnutella +itself.
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/Jmakefile -> gtk-gnutella-1.1.9.tar.bz2/src/if/Jmakefile
Changed
@@ -27,7 +27,7 @@ ;# $Id$ -SetSubdirs(bridge) +SetSubdirs(bridge gen) DependSubdirs() SOURCES = gnet_property.c gui_property.c @@ -42,19 +42,30 @@ properties: gnet_property.c gui_property.c /* - * In case they don't have autogen, ignore the failure but make the - * targets appear up to date + * Recreate the property files using autogen on the template listing the + * known properties. + * + * NOTE: this is only done when there is a .package file at the root of the + * source tree. This file is created by packinit, a tool that comes with + * "dist", the package which includes metaconfig and jmake. Since only + * developers will need that file around, this allows us to prevent accidental + * regeneration of property files in distributions (should the timestamp of + * the files indicate that the output is not up-to-date with respect to the + * property defintions). */ +#define BuildProperties(def,base) @!\ +base/**/_priv.h base.h base.c: def props.tpl @@\ + -@if test -f $(TOP)/.package; then \ @@\ + echo " autogen def"; \ @@\ + autogen def; \ @@\ + else touch $@; fi -gnet_property_priv.h gnet_property.c gnet_property.h: gnet_props.ag props.tpl - -autogen gnet_props.ag - touch gnet_property_priv.h gnet_property.c gnet_property.h -gui_property_priv.h gui_property.c gui_property.h: gui_props.ag props.tpl - -autogen gui_props.ag - touch gui_property_priv.h gui_property.c gui_property.h +BuildProperties(gnet_props.ag, gnet_property) +BuildProperties(gui_props.ag, gui_property) NormalObjectTarget(gnet_property) NormalObjectTarget(gui_property) + DependTarget()
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/src/if/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-30 -: $X-Id: Jmake.tmpl 30 2009-10-28 07:45:28Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -38,7 +38,7 @@ CC = $cc CTAGS = ctags -JCFLAGS = \$(CFLAGS) $optimize $ccflags $large +JCFLAGS = \$(CFLAGS) $optimize $pthread $ccflags $large JCPPFLAGS = $cppflags MKDEP = $mkdep \$(DPFLAGS) \$(JCPPFLAGS) -- MV = $mv @@ -48,7 +48,7 @@ ######################################################################## # Automatically generated parameters -- do not edit -SUBDIRS = bridge +SUBDIRS = bridge gen USRINC = $usrinc SOURCES = gnet_property.c gui_property.c GLIB_CFLAGS = $glibcflags @@ -63,7 +63,7 @@ $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 18 2006-12-27 10:35:09Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Force 'make depend' to be performed first -- do not edit @@ -75,9 +75,11 @@ ######################################################################## # Start of Jmakefile -# $X-Id: Jmakefile 6535 2004-08-28 06:36:27Z rmanfredi $ +# $X-Id$ -depend:: +depend:: sub_depend + +sub_depend:: @case '${MFLAGS}' in *ik*) set +e;; esac; \ for i in $(SUBDIRS) ;\ do \ @@ -94,13 +96,17 @@ properties: gnet_property.c gui_property.c -gnet_property_priv.h gnet_property.c gnet_property.h: gnet_props.ag props.tpl - -autogen gnet_props.ag - touch gnet_property_priv.h gnet_property.c gnet_property.h +gnet_property_priv.h gnet_property.h gnet_property.c: gnet_props.ag props.tpl + -@if test -f $(TOP)/.package; then \ + echo " autogen gnet_props.ag"; \ + autogen gnet_props.ag; \ + else touch $@; fi -gui_property_priv.h gui_property.c gui_property.h: gui_props.ag props.tpl - -autogen gui_props.ag - touch gui_property_priv.h gui_property.c gui_property.h +gui_property_priv.h gui_property.h gui_property.c: gui_props.ag props.tpl + -@if test -f $(TOP)/.package; then \ + echo " autogen gui_props.ag"; \ + autogen gui_props.ag; \ + else touch $@; fi all:: gnet_property.o @@ -112,12 +118,13 @@ local_realclean:: $(RM) gui_property.o -depend:: ../../mkdep +local_depend:: ../../mkdep ../../mkdep: @echo "You have to run Configure in $(TOP) first."; exit 1 -depend:: +depend:: local_depend +local_depend:: ($(SED) '/^# DO NOT DELETE/q' Makefile && \ $(MKDEP) $(SOURCES) | \ $(SED) -e 's:/usr/lib^ *::g; s:$(USRINC)^ *::g; ' \ @@ -147,6 +154,11 @@ $(RM) Makefile config.sh install:: local_install sub_install + @exit 0 + +install-strip:: local_install-strip sub_install-strip + @exit 0 + install.man:: maybe_install.man sub_install.man deinstall:: sub_deinstall local_deinstall deinstall.man:: sub_deinstall.man maybe_deinstall.man @@ -177,6 +189,8 @@ local_clobber:: $(RM) tags +depend:: + ######################################################################## # Rules for building in sub-directories -- do not edit @@ -184,13 +198,16 @@ @case '${MFLAGS}' in *ik*) set +e;; esac; \ for i in $(SUBDIRS) ;\ do \ - (cd $$i ; echo $(VERB) "in $(DIR)$$i..."; \ + (cd $$i ; echo "$(VERB) in $(DIR)$$i..."; \ $(MAKE) $(MFLAGS) $(FLAGS) $(TARGET)) || exit 1; \ done sub_install:: @$(MAKE) subdirs TARGET=install VERB="Installing" FLAGS= +sub_install-strip:: + @$(MAKE) subdirs TARGET=install-strip VERB="Installing (strip)" FLAGS= + sub_deinstall:: @$(MAKE) subdirs TARGET=deinstall VERB="Deinstalling" FLAGS= @echo "Back to $(CURRENT) for "deinstall... @@ -259,6 +276,7 @@ @$(MAKE) subdirs TARGET=all VERB="Making all" FLAGS= local_install:: +local_install-strip:: local_deinstall:: local_install.man:: local_deinstall.man::
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/bridge/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/src/if/bridge/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-30 -: $X-Id: Jmake.tmpl 30 2009-10-28 07:45:28Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -38,7 +38,7 @@ CC = $cc CTAGS = ctags -JCFLAGS = \$(CFLAGS) $optimize $ccflags $large +JCFLAGS = \$(CFLAGS) $optimize $pthread $ccflags $large JCPPFLAGS = $cppflags MKDEP = $mkdep \$(DPFLAGS) \$(JCPPFLAGS) -- MV = $mv @@ -62,7 +62,7 @@ $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 18 2006-12-27 10:35:09Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Force 'make depend' to be performed first -- do not edit @@ -74,7 +74,7 @@ ######################################################################## # Start of Jmakefile -# $X-Id: Jmakefile 6535 2004-08-28 06:36:27Z rmanfredi $ +# $X-Id$ SRC = c2ui.c ui2c.c OBJ = \ @@ -85,12 +85,13 @@ CFLAGS = -I$(TOP) -I../.. $(GLIB_CFLAGS) -DCURDIR=$(CURRENT) DPFLAGS = $(CFLAGS) -depend:: ../../../mkdep +local_depend:: ../../../mkdep ../../../mkdep: @echo "You have to run Configure in $(TOP) first."; exit 1 -depend:: +depend:: local_depend +local_depend:: ($(SED) '/^# DO NOT DELETE/q' Makefile && \ $(MKDEP) $(SOURCES) | \ $(SED) -e 's:/usr/lib^ *::g; s:$(USRINC)^ *::g; ' \ @@ -139,6 +140,11 @@ $(RM) Makefile config.sh install:: local_install + @exit 0 + +install-strip:: local_install-strip + @exit 0 + install.man:: maybe_install.man deinstall:: local_deinstall deinstall.man:: maybe_deinstall.man @@ -169,12 +175,17 @@ local_clobber:: $(RM) tags +depend:: + ######################################################################## # Empty rules for directories with no sub-directories -- do not edit local_install:: @echo "install in $(CURRENT) done." +local_install-strip:: + @echo "install (strip) in $(CURRENT) done." + local_deinstall:: @echo "deinstall in $(CURRENT) done."
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/bridge/c2ui.c -> gtk-gnutella-1.1.9.tar.bz2/src/if/bridge/c2ui.c
Changed
@@ -61,13 +61,10 @@ #define statusbar_gui_warning(sec, fmt, message) g_message((fmt), (message)) #define statusbar_gui_message(sec, fmt, message) g_message((fmt), (message)) -#define bitzi_gui_update(bitzi_data) ((void) bitzi_data) - #endif /* USE_TOPLESS */ #if defined(USE_GTK1) || defined(USE_GTK2) -extern gboolean running_topless; -#include "if/ui/gtk/bitzi.h" +extern bool running_topless; #include "if/ui/gtk/downloads.h" #include "if/ui/gtk/misc.h" #include "if/ui/gtk/search.h" @@ -106,19 +103,19 @@ } void -guc_allow_rescan_dir(gboolean flag) +guc_allow_rescan_dir(bool flag) { if (!running_topless) { gui_allow_rescan_dir(flag); } } -gint +int gcu_gtk_main_flush(void) { #if defined(USE_GTK1) || defined(USE_GTK2) if (!running_topless) { - extern gint gtk_main_flush(); + extern int gtk_main_flush(); /* Don't include any GTK-related header */ return gtk_main_flush(); } @@ -127,8 +124,8 @@ } /** search interface functions (CORE -> UI) */ -gboolean -gcu_search_gui_new_search(const gchar *query, guint32 flags) +bool +gcu_search_gui_new_search(const gchar *query, uint32 flags) { if (!running_topless) { return search_gui_new_search(query, flags, NULL); @@ -192,21 +189,6 @@ } } -/** - * Bitzi result notification (Core->UI) - * - * If the IPC split goes ahead then the data will need to be copied - * across. For the time being we just pass the pointer. - */ - -void -gcu_bitzi_result(bitzi_data_t *bitzi_data) -{ - if (!running_topless) { - bitzi_gui_update(bitzi_data); - } -} - /* statusbar interface functions (CORE -> UI) */ void gcu_statusbar_warning(const gchar *message)
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/bridge/c2ui.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/bridge/c2ui.h
Changed
@@ -42,7 +42,6 @@ #include "if/core/downloads.h" #include "if/core/uploads.h" -#include "if/core/bitzi.h" #include "lib/host_addr.h" #include "lib/misc.h" @@ -55,12 +54,12 @@ void gcu_download_gui_updates_freeze(void); /* misc interface functions */ -void guc_allow_rescan_dir(gboolean flag); +void guc_allow_rescan_dir(bool flag); void gcu_gui_update_files_scanned(void); -gint gcu_gtk_main_flush(void); +int gcu_gtk_main_flush(void); /** search interface functions */ -gboolean gcu_search_gui_new_search(const gchar *query, guint32 flags); +bool gcu_search_gui_new_search(const gchar *query, uint32 flags); void gcu_search_gui_store_searches(void); /* statusbar interface functions */ @@ -75,8 +74,5 @@ void gcu_upload_stats_gui_freeze(void); void gcu_upload_stats_gui_thaw(void); -/** bitzi results */ -void gcu_bitzi_result(bitzi_data_t *); - #endif /* _if_bridge_c2ui_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/bridge/ui2c.c -> gtk-gnutella-1.1.9.tar.bz2/src/if/bridge/ui2c.c
Changed
@@ -43,14 +43,15 @@ /* includes ui needs to access core */ #include "lib/adns.h" +#include "lib/glib-missing.h" #include "lib/iso3166.h" -#include "if/core/bitzi.h" +#include "lib/pslist.h" + #include "if/core/downloads.h" #include "if/core/fileinfo.h" #include "if/core/net_stats.h" #include "if/core/hcache.h" #include "if/core/hsep.h" -#include "if/core/http.h" #include "if/core/parq.h" #include "if/core/search.h" #include "if/core/share.h" @@ -67,40 +68,13 @@ */ /* adns interface functions (UI -> Core)*/ -gboolean +bool guc_adns_resolve(const char *hostname, - adns_callback_t user_callback, gpointer user_data) + adns_callback_t user_callback, void *user_data) { return adns_resolve(hostname, settings_dns_net(), user_callback, user_data); } -/* bitzi interface functions (UI -> Core)*/ - -void -guc_query_bitzi_by_sha1(const struct sha1 *sha1, filesize_t filesize, gboolean refresh) -{ - bitzi_query_by_sha1(sha1, filesize, refresh); -} - -const char * -guc_bitzi_ticket_by_sha1(const struct sha1 *sha1, filesize_t filesize) -{ - return bitzi_ticket_by_sha1(sha1, filesize); -} - -gboolean -guc_bitzi_data_by_sha1(bitzi_data_t *data, - const struct sha1 *sha1, filesize_t filesize) -{ - return bitzi_data_by_sha1(data, sha1, filesize); -} - -gboolean -guc_bitzi_has_cached_ticket(const struct sha1 *sha1) -{ - return bitzi_has_cached_ticket(sha1); -} - /* download and src interface functions (UI -> Core)*/ char * guc_download_build_url(const struct download *d) @@ -133,20 +107,20 @@ } void -guc_download_fallback_to_push(struct download *d, gboolean on_timeout, - gboolean user_request) +guc_download_fallback_to_push(struct download *d, bool on_timeout, + bool user_request) { download_fallback_to_push(d, on_timeout, user_request); } int guc_download_remove_all_from_peer(const struct guid *guid, - const host_addr_t addr, guint16 port, gboolean unavailable) + const host_addr_t addr, uint16 port, bool unavailable) { return download_remove_all_from_peer(guid, addr, port, unavailable); } -gboolean +bool guc_download_file_exists(const struct download *d) { return download_file_exists(d); @@ -194,31 +168,31 @@ download_thaw_queue(); } -gboolean +bool guc_download_queue_is_frozen(void) { return download_queue_is_frozen(); } void -guc_download_clear_stopped(gboolean complete, - gboolean failed, gboolean unavailable, gboolean finished, gboolean now) +guc_download_clear_stopped(bool complete, + bool failed, bool unavailable, bool finished, bool now) { download_clear_stopped(complete, failed, unavailable, finished, now); } -guint +uint guc_download_handle_magnet(const char *url) { return download_handle_magnet(url); } -gboolean +bool guc_download_new(const char *filename, const char *uri, filesize_t size, const host_addr_t addr, - guint16 port, + uint16 port, const struct guid *guid, const char *hostname, const struct sha1 *sha1, @@ -226,7 +200,7 @@ time_t stamp, fileinfo_t *fi, gnet_host_vec_t *proxies, - guint32 flags, + uint32 flags, const char *parq_id) { return download_new(filename, @@ -249,7 +223,7 @@ guc_download_auto_new(const char *filename, filesize_t size, const host_addr_t addr, - guint16 port, + uint16 port, const struct guid *guid, const char *hostname, const struct sha1 *sha1, @@ -257,7 +231,7 @@ time_t stamp, fileinfo_t *fi, gnet_host_vec_t *proxies, - guint32 flags) + uint32 flags) { download_auto_new(filename, size, @@ -303,14 +277,14 @@ return download_total_progress(d); } -gboolean +bool guc_download_something_to_clear(void) { return download_something_to_clear(); } void -guc_download_index_changed(const host_addr_t addr, guint16 port, +guc_download_index_changed(const host_addr_t addr, uint16 port, const struct guid *guid, filesize_t from, filesize_t to) { download_index_changed(addr, port, guid, from, to); @@ -324,7 +298,7 @@ void guc_src_add_listener(src_listener_t cb, gnet_src_ev_t ev, - frequency_t t, guint32 interval) + frequency_t t, uint32 interval) { src_add_listener(cb, ev, t, interval); } @@ -385,7 +359,7 @@ fi_resume(fih); } -gboolean +bool guc_fi_rename(gnet_fi_t fih, const char *filename) { return fi_rename(fih, filename); @@ -393,7 +367,7 @@ void guc_fi_add_listener(fi_listener_t cb, gnet_fi_ev_t ev, - frequency_t t, guint32 interval) + frequency_t t, uint32 interval) { fi_add_listener(cb, ev, t, interval); } @@ -459,6 +433,18 @@ return gnet_stats_drop_reason_to_string(reason); } +const char * +guc_gnet_stats_general_description(gnr_stats_t gs) +{ + return gnet_stats_general_description(gs); +} + +const char * +guc_gnet_msg_type_description(msg_type_t mt) +{ + return gnet_msg_type_description(mt); +} + /* hcache interface functions (UI -> Core)*/ void guc_hcache_clear_host_type(host_type_t type) @@ -499,33 +485,19 @@ void -guc_hsep_add_global_table_listener(GCallback cb, - frequency_t t, guint32 interval) +guc_hsep_add_global_table_listener(callback_fn_t cb, + frequency_t t, uint32 interval) { hsep_add_global_table_listener(cb, t, interval); } void -guc_hsep_remove_global_table_listener(GCallback cb) +guc_hsep_remove_global_table_listener(callback_fn_t cb) { hsep_remove_global_table_listener(cb); } -/* HTTP interface functions (UI -> Core)*/ -const char * -guc_http_range_to_string(const GSList *list) -{ - return http_range_to_string(list); -} - -GSList * -guc_http_range_merge(GSList *old_list, GSList *new_list) -{ - return http_range_merge(old_list, new_list); -} - - /* node interface functions (UI -> Core)*/ void guc_node_add_node_added_listener(node_added_listener_t l) @@ -576,12 +548,18 @@ } void -guc_node_add(const host_addr_t addr, guint16 port, guint32 flags) +guc_node_add(const host_addr_t addr, uint16 port, uint32 flags) { node_add(addr, port, flags); } void +guc_node_g2_add(const host_addr_t addr, uint16 port, uint32 flags) +{ + node_g2_add(addr, port, flags); +} + +void guc_node_remove_by_id(const struct nid *node_id) { node_remove_by_id(node_id); @@ -590,10 +568,13 @@ void guc_node_remove_nodes_by_id(const GSList *node_list) { - node_remove_nodes_by_id(node_list); + pslist_t *sl = gm_slist_to_pslist(node_list); + + node_remove_nodes_by_id(sl); + pslist_free(sl); } -gboolean +bool guc_node_get_status(const struct nid *node_id, gnet_node_status_t *s) { return node_get_status(node_id, s); @@ -617,13 +598,13 @@ node_free_info(info); } -gboolean +bool guc_node_fill_flags(const struct nid *node_id, gnet_node_flags_t *flags) { return node_fill_flags(node_id, flags); } -gboolean +bool guc_node_fill_info(const struct nid *node_id, gnet_node_info_t *info) { return node_fill_info(node_id, info); @@ -667,19 +648,19 @@ } /* search interface functions (UI -> Core)*/ -guint +uint guc_search_handle_magnet(const char *url) { return search_handle_magnet(url); } void -guc_search_update_items(gnet_search_t sh, guint32 items) +guc_search_update_items(gnet_search_t sh, uint32 items) { search_update_items(sh, items); } -guint32 +uint32 guc_search_get_reissue_timeout(gnet_search_t sh) { return search_get_reissue_timeout(sh); @@ -692,12 +673,12 @@ } void -guc_search_set_reissue_timeout(gnet_search_t sh, guint32 timeout) +guc_search_set_reissue_timeout(gnet_search_t sh, uint32 timeout) { search_set_reissue_timeout(sh, timeout); } -guint +uint guc_search_get_lifetime(gnet_search_t sh) { return search_get_lifetime(sh); @@ -721,43 +702,43 @@ return search_query(sh); } -gboolean +bool guc_search_is_active(gnet_search_t sh) { return search_is_active(sh); } -gboolean +bool guc_search_is_browse(gnet_search_t sh) { return search_is_browse(sh); } -gboolean +bool guc_search_is_local(gnet_search_t sh) { return search_is_local(sh); } -gboolean +bool guc_search_is_passive(gnet_search_t sh) { return search_is_passive(sh); } -gboolean +bool guc_search_is_expired(gnet_search_t sh) { return search_is_expired(sh); } -gboolean +bool guc_search_is_frozen(gnet_search_t sh) { return search_is_frozen(sh); } -gboolean +bool guc_search_is_whats_new(gnet_search_t sh) { return search_is_whats_new(sh); @@ -775,7 +756,7 @@ search_associate_sha1(sh, sha1); } -GSList * +pslist_t * guc_search_associated_sha1(gnet_search_t sh) { return search_associated_sha1(sh); @@ -789,21 +770,21 @@ enum search_new_result guc_search_new(gnet_search_t *ptr, const char *query, unsigned mtype, - time_t create_time, guint lifetime, guint32 reissue_timeout, guint32 flags) + time_t create_time, uint lifetime, uint32 reissue_timeout, uint32 flags) { return search_new(ptr, query, mtype, create_time, lifetime, reissue_timeout, flags); } -gboolean +bool guc_search_browse(gnet_search_t sh, - const char *hostname, host_addr_t addr, guint16 port, - const struct guid *guid, const gnet_host_vec_t *proxies, guint32 flags) + const char *hostname, host_addr_t addr, uint16 port, + const struct guid *guid, const gnet_host_vec_t *proxies, uint32 flags) { return search_browse(sh, hostname, addr, port, guid, proxies, flags); } -gboolean +bool guc_search_locally(gnet_search_t sh, const char *query) { return search_locally(sh, query); @@ -830,10 +811,10 @@ /* settings interface functions (UI -> Core)*/ -guint16 +uint16 guc_listen_port(void) { - guint32 port; + uint32 port; gnet_prop_get_guint32_val(PROP_LISTEN_PORT, &port); return port; } @@ -870,13 +851,13 @@ share_scan(); } -guint64 +uint64 guc_shared_files_scanned(void) { return shared_files_scanned(); } -guint64 +uint64 guc_shared_kbytes_scanned(void) { return shared_kbytes_scanned(); @@ -919,11 +900,35 @@ } void -guc_search_add_kept(gnet_search_t sh, const struct guid *muid, guint32 kept) +guc_search_add_kept(gnet_search_t sh, const struct guid *muid, uint32 kept) { search_add_kept(sh, muid, kept); } +void +guc_guess_event_listener_add(guess_event_listener_t l) +{ + guess_event_listener_add(l); +} + +void +guc_guess_event_listener_remove(guess_event_listener_t l) +{ + guess_event_listener_remove(l); +} + +void +guc_guess_stats_listener_add(guess_stats_listener_t l) +{ + guess_stats_listener_add(l); +} + +void +guc_guess_stats_listener_remove(guess_stats_listener_t l) +{ + guess_stats_listener_remove(l); +} + /* upload interface functions (UI -> Core)*/ gnet_upload_info_t * guc_upload_get_info(gnet_upload_t uh) @@ -999,7 +1004,7 @@ upload_stats_clear_all(); } -gboolean +bool guc_dht_enabled(void) { return dht_enabled();
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/bridge/ui2c.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/bridge/ui2c.h
Changed
@@ -41,16 +41,17 @@ */ #include "lib/adns.h" +#include "lib/pslist.h" #include "if/core/downloads.h" #include "if/core/fileinfo.h" -#include "if/core/net_stats.h" +#include "if/core/guess.h" #include "if/core/hcache.h" #include "if/core/hsep.h" +#include "if/core/net_stats.h" #include "if/core/search.h" #include "if/core/share.h" #include "if/core/uploads.h" -#include "if/core/bitzi.h" /* Property table includes */ #include "if/gnet_property.h" @@ -59,16 +60,16 @@ struct nid; /* adns interface functions */ -gboolean guc_adns_resolve(const char *hostname, - adns_callback_t user_callback, gpointer user_data); +bool guc_adns_resolve(const char *hostname, + adns_callback_t user_callback, void *user_data); /* download and src interface functions */ -gboolean +bool guc_download_new(const char *filename, const char *uri, filesize_t size, const host_addr_t addr, - guint16 port, + uint16 port, const struct guid *guid, const char *hostname, const struct sha1 *sha1, @@ -76,14 +77,14 @@ time_t stamp, fileinfo_t *fi, gnet_host_vec_t *proxies, - guint32 flags, + uint32 flags, const char *parq_id); void guc_download_auto_new(const char *filename, filesize_t size, const host_addr_t addr, - guint16 port, + uint16 port, const struct guid *guid, const char *hostname, const struct sha1 *sha1, @@ -91,18 +92,18 @@ time_t stamp, fileinfo_t *fi, gnet_host_vec_t *proxies, - guint32 flags); + uint32 flags); char *guc_download_build_url(const struct download *); char *guc_file_info_build_magnet(gnet_fi_t); char *guc_file_info_get_file_url(gnet_fi_t); const char *guc_file_info_status_to_string(const gnet_fi_status_t *); int guc_download_get_http_req_percent(const struct download *); -void guc_download_fallback_to_push(struct download *, gboolean on_timeout, - gboolean user_request); +void guc_download_fallback_to_push(struct download *, bool on_timeout, + bool user_request); int guc_download_remove_all_from_peer(const struct guid *guid, - const host_addr_t addr, guint16 port, gboolean unavailable); -gboolean guc_download_file_exists(const struct download *); + const host_addr_t addr, uint16 port, bool unavailable); +bool guc_download_file_exists(const struct download *); void guc_download_requeue(struct download *); void guc_download_start(struct download *); void guc_download_pause(struct download *); @@ -110,21 +111,21 @@ void guc_download_resume(struct download *); void guc_download_freeze_queue(void); void guc_download_thaw_queue(void); -gboolean guc_download_queue_is_frozen(void); -void guc_download_clear_stopped(gboolean complete, - gboolean failed, gboolean unavailable, gboolean finished, gboolean now); -guint guc_download_handle_magnet(const char *url); +bool guc_download_queue_is_frozen(void); +void guc_download_clear_stopped(bool complete, + bool failed, bool unavailable, bool finished, bool now); +uint guc_download_handle_magnet(const char *url); const char *guc_download_get_hostname(const struct download *); const char *guc_download_get_country(const struct download *); const char *guc_download_get_vendor(const struct download *); gdouble guc_download_source_progress(const struct download *); gdouble guc_download_total_progress(const struct download *); -gboolean guc_download_something_to_clear(void); -void guc_download_index_changed(const host_addr_t addr, guint16 port, +bool guc_download_something_to_clear(void); +void guc_download_index_changed(const host_addr_t addr, uint16 port, const struct guid *guid, filesize_t from, filesize_t to); struct download *guc_src_get_download(gnet_src_t src_handle); -void guc_src_add_listener(src_listener_t, gnet_src_ev_t, frequency_t, guint32); +void guc_src_add_listener(src_listener_t, gnet_src_ev_t, frequency_t, uint32); void guc_src_remove_listener(src_listener_t, gnet_src_ev_t); /* fileinfo interface functions */ @@ -137,7 +138,7 @@ void guc_fi_purge(gnet_fi_t); void guc_fi_pause(gnet_fi_t); void guc_fi_resume(gnet_fi_t); -gboolean guc_fi_rename(gnet_fi_t, const char *); +bool guc_fi_rename(gnet_fi_t, const char *); GSList *guc_fi_get_chunks(gnet_fi_t); void guc_fi_free_chunks(GSList *chunks); @@ -145,7 +146,7 @@ GSList *guc_fi_get_ranges(gnet_fi_t); void guc_fi_free_ranges(GSList *ranges); -void guc_fi_add_listener(fi_listener_t, gnet_fi_ev_t, frequency_t, guint32); +void guc_fi_add_listener(fi_listener_t, gnet_fi_ev_t, frequency_t, uint32); void guc_fi_remove_listener(fi_listener_t, gnet_fi_ev_t); /* gnet_stats interface functions */ @@ -154,6 +155,8 @@ void guc_gnet_stats_udp_get(gnet_stats_t *); void guc_gnet_get_bw_stats(gnet_bw_source, gnet_bw_stats_t *); const char *guc_gnet_stats_drop_reason_to_string(msg_drop_reason_t); +const char *guc_gnet_stats_general_description(gnr_stats_t); +const char *guc_gnet_msg_type_description(msg_type_t); /* hcache interface functions */ void guc_hcache_clear_host_type(host_type_t); @@ -164,12 +167,8 @@ int guc_hsep_get_table_size(void); void guc_hsep_get_non_hsep_triple(hsep_triple *); const char *guc_hsep_get_static_str(int row, int column); -void guc_hsep_add_global_table_listener(GCallback, frequency_t, guint32); -void guc_hsep_remove_global_table_listener(GCallback); - -/* http interface functions */ -const char *guc_http_range_to_string(const GSList *); -GSList * guc_http_range_merge(GSList *old_list, GSList *new_list); +void guc_hsep_add_global_table_listener(callback_fn_t, frequency_t, uint32); +void guc_hsep_remove_global_table_listener(callback_fn_t); /* node interface functions */ void guc_node_add_node_added_listener(node_added_listener_t); @@ -181,15 +180,16 @@ void guc_node_remove_node_info_changed_listener(node_info_changed_listener_t); void guc_node_remove_node_flags_changed_listener(node_flags_changed_listener_t); -void guc_node_add(const host_addr_t addr, guint16 port, guint32 flags); +void guc_node_add(const host_addr_t addr, uint16 port, uint32 flags); +void guc_node_g2_add(const host_addr_t addr, uint16 port, uint32 flags); void guc_node_remove_by_id(const struct nid *); void guc_node_remove_nodes_by_id(const GSList *node_list); -gboolean guc_node_get_status(const struct nid *, gnet_node_status_t *); +bool guc_node_get_status(const struct nid *, gnet_node_status_t *); gnet_node_info_t *guc_node_get_info(const struct nid *); void guc_node_clear_info(gnet_node_info_t *); void guc_node_free_info(gnet_node_info_t *); -gboolean guc_node_fill_flags(const struct nid *, gnet_node_flags_t *); -gboolean guc_node_fill_info(const struct nid *, gnet_node_info_t *); +bool guc_node_fill_flags(const struct nid *, gnet_node_flags_t *); +bool guc_node_fill_info(const struct nid *, gnet_node_info_t *); const char *guc_node_flags_to_string(const gnet_node_flags_t *); const char *guc_node_peermode_to_string(node_peer_t); @@ -200,41 +200,41 @@ int guc_get_parq_dl_retry_delay(const struct download *); /* search interface functions */ -guint guc_search_handle_magnet(const char *); -void guc_search_update_items(gnet_search_t, guint32); -guint guc_search_get_lifetime(gnet_search_t); +uint guc_search_handle_magnet(const char *); +void guc_search_update_items(gnet_search_t, uint32); +uint guc_search_get_lifetime(gnet_search_t); time_t guc_search_get_create_time(gnet_search_t); void guc_search_set_create_time(gnet_search_t, time_t); -guint32 guc_search_get_reissue_timeout(gnet_search_t); -void guc_search_set_reissue_timeout(gnet_search_t, guint32 timeout); +uint32 guc_search_get_reissue_timeout(gnet_search_t); +void guc_search_set_reissue_timeout(gnet_search_t, uint32 timeout); unsigned guc_search_get_media_type(gnet_search_t); const char *guc_search_query(gnet_search_t); -gboolean guc_search_is_active(gnet_search_t); -gboolean guc_search_is_browse(gnet_search_t); -gboolean guc_search_is_expired(gnet_search_t); -gboolean guc_search_is_frozen(gnet_search_t); -gboolean guc_search_is_local(gnet_search_t); -gboolean guc_search_is_passive(gnet_search_t); -gboolean guc_search_is_whats_new(gnet_search_t sh); +bool guc_search_is_active(gnet_search_t); +bool guc_search_is_browse(gnet_search_t); +bool guc_search_is_expired(gnet_search_t); +bool guc_search_is_frozen(gnet_search_t); +bool guc_search_is_local(gnet_search_t); +bool guc_search_is_passive(gnet_search_t); +bool guc_search_is_whats_new(gnet_search_t sh); void guc_search_associate_sha1(gnet_search_t sh, const struct sha1 *sha1); -GSList *guc_search_associated_sha1(gnet_search_t sh); +pslist_t *guc_search_associated_sha1(gnet_search_t sh); unsigned guc_search_associated_sha1_count(gnet_search_t sh); const char *guc_search_media_mask_to_string(unsigned mask); enum search_new_result guc_search_new(gnet_search_t *ptr, const char *query, - unsigned mtype, time_t create_time, guint lifetime, - guint32 reissue_timeout, guint32 flags); -gboolean guc_search_browse(gnet_search_t, - const char *hostname, host_addr_t addr, guint16 port, - const struct guid *guid, const gnet_host_vec_t *proxies, guint32 flags); -gboolean guc_search_locally(gnet_search_t, const char *query); + unsigned mtype, time_t create_time, uint lifetime, + uint32 reissue_timeout, uint32 flags); +bool guc_search_browse(gnet_search_t, + const char *hostname, host_addr_t addr, uint16 port, + const struct guid *guid, const gnet_host_vec_t *proxies, uint32 flags); +bool guc_search_locally(gnet_search_t, const char *query); void guc_search_close(gnet_search_t); void guc_search_start(gnet_search_t); void guc_search_stop(gnet_search_t); -void guc_search_add_kept(gnet_search_t, const struct guid *, guint32 kept); +void guc_search_add_kept(gnet_search_t, const struct guid *, uint32 kept); void guc_search_got_results_listener_add(search_got_results_listener_t); void guc_search_got_results_listener_remove(search_got_results_listener_t); @@ -245,8 +245,14 @@ void guc_search_request_listener_add(search_request_listener_t); void guc_search_request_listener_remove(search_request_listener_t); +/* GUESS queries interface functions */ +void guc_guess_event_listener_add(guess_event_listener_t); +void guc_guess_event_listener_remove(guess_event_listener_t); +void guc_guess_stats_listener_add(guess_stats_listener_t); +void guc_guess_stats_listener_remove(guess_stats_listener_t); + /* settings interface functions */ -guint16 guc_listen_port(void); +uint16 guc_listen_port(void); host_addr_t guc_listen_addr(enum net_type); const char *guc_settings_home_dir(void); const char *guc_settings_config_dir(void); @@ -254,8 +260,8 @@ /* share interface functions */ void guc_shared_dir_add(const char *path); void guc_share_scan(void); -guint64 guc_shared_files_scanned(void); -guint64 guc_shared_kbytes_scanned(void); +uint64 guc_shared_files_scanned(void); +uint64 guc_shared_kbytes_scanned(void); /* upload interface functions */ gnet_upload_info_t *guc_upload_get_info(gnet_upload_t); @@ -279,18 +285,11 @@ /** version interface functions*/ const char *guc_version_get_version_string(void); -/* bitzi interface functions*/ -gboolean guc_bitzi_has_cached_ticket(const struct sha1 *); -void guc_query_bitzi_by_sha1(const struct sha1 *, filesize_t, gboolean); -const char *guc_bitzi_ticket_by_sha1(const struct sha1 *, filesize_t); -gboolean guc_bitzi_data_by_sha1(bitzi_data_t *, - const struct sha1 *, filesize_t); - /** main functions */ void guc_gtk_gnutella_exit(int code); /** DHT functions */ -gboolean guc_dht_enabled(void); +bool guc_dht_enabled(void); #endif /* _if_bridge_ui2c_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/core/bsched.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/core/bsched.h
Changed
@@ -62,15 +62,15 @@ bsched_bws_t bws; /**< B/w scheduler for this source */ wrap_io_t *wio; /**< Wrapped I/O object */ unsigned io_tag; /**< Recorded I/O callback tag */ - guint io_flags; /**< Flags for I/O callback */ + uint io_flags; /**< Flags for I/O callback */ inputevt_handler_t io_callback; /**< I/O callback routine */ - gpointer io_arg; /**< I/O callback argument */ - guint32 flags; /**< Source flags */ + void *io_arg; /**< I/O callback argument */ + uint32 flags; /**< Source flags */ unsigned bw_allocated; /**< Allocated bandwidth credit */ - guint bw_actual; /**< Actual bandwidth used in period */ - guint bw_last_bps; /**< B/w used last period (bps) */ - guint bw_fast_ema; /**< Fast EMA of actual bandwidth used */ - guint bw_slow_ema; /**< Slow EMA of actual bandwidth used */ + uint bw_actual; /**< Actual bandwidth used in period */ + uint bw_last_bps; /**< B/w used last period (bps) */ + uint bw_fast_ema; /**< Fast EMA of actual bandwidth used */ + uint bw_slow_ema; /**< Slow EMA of actual bandwidth used */ } bio_source_t; /* @@ -82,6 +82,7 @@ #define BIO_F_ACTIVE (1 << 2) /**< Source active since b/w scheduled */ #define BIO_F_USED (1 << 3) /**< Source used this period */ #define BIO_F_FAVOUR (1 << 4) /**< Try to favour source this period */ +#define BIO_F_PASSIVE (1 << 5) /**< Don't insert source for events */ #define BIO_F_RW (BIO_F_READ|BIO_F_WRITE)
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/core/downloads.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/core/downloads.h
Changed
@@ -25,12 +25,14 @@ #ifndef _if_core_downloads_h_ #define _if_core_downloads_h_ -#include "lib/tm.h" /* For tm_t */ #include "lib/event.h" /* For frequency_t */ -#include "lib/iso3166.h" /* For iso3166_code_is_valid() */ #include "lib/hashlist.h" +#include "lib/htable.h" +#include "lib/http_range.h" +#include "lib/iso3166.h" /* For iso3166_code_is_valid() */ #include "lib/list.h" #include "lib/slist.h" +#include "lib/tm.h" /* For tm_t */ #include "core/pproxy.h" #include "core/rx.h" @@ -43,7 +45,7 @@ *** Sources (traditionally called "downloads") ***/ -typedef guint32 gnet_src_t; +typedef uint32 gnet_src_t; #define URN_INDEX 0xffffffff /**< Marking index, indicates URN instead */ @@ -71,8 +73,8 @@ }; struct vernum { - guint major; - guint minor; + uint major; + uint minor; }; struct guid; @@ -80,7 +82,7 @@ struct dl_key { const struct guid *guid; /**< GUID of server (atom) */ host_addr_t addr; /**< IP address of server */ - guint16 port; /**< Port of server */ + uint16 port; /**< Port of server */ }; enum dl_server_magic { DL_SERVER_MAGIC = 0x5e45e4ffU }; @@ -93,18 +95,18 @@ const char *vendor; /**< Remote server vendor string (atom) */ const char *hostname; /**< Remote hostname, if known (atom) */ pproxy_set_t *proxies; /**< Known push proxies */ - GHashTable *sha1_counts; + htable_t *sha1_counts; time_t retry_after; /**< Time at which we may retry from this host */ time_t dns_lookup; /**< Last DNS lookup for hostname */ time_t last_connect; /**< When we last connected to that server */ struct vernum parq_version; /**< Supported queueing version */ - guint speed_avg; /**< Average (EMA) upload speed, in bytes/sec */ - unsigned latency; /**< HTTP latency, in ms (EMA) */ - guint32 attrs; - guint16 country; /**< Country of origin -- encoded ISO3166 */ + uint speed_avg; /**< Average (EMA) upload speed, in bytes/sec */ + unsigned latency; /**< HTTP latency, in ms (EMA) */ + uint32 attrs; + uint16 country; /**< Country of origin -- encoded ISO3166 */ }; -static inline gboolean +static inline bool dl_server_valid(const struct dl_server *s) { return s != NULL && s->magic == DL_SERVER_MAGIC && @@ -172,7 +174,7 @@ filesize_t size; /**< Length of chunk in the request */ filesize_t start; /**< Starting request offset within file */ filesize_t end; /**< 1st byte offset AFTER requested range */ - guint32 overlap; /**< Overlap with previous chunk */ + uint32 overlap; /**< Overlap with previous chunk */ }; /** @@ -216,7 +218,7 @@ char error_str256; /**< Used to snprintf() error strings */ download_status_t status; /**< Current status of the download */ - gpointer io_opaque; /**< Opaque I/O callback information */ + void *io_opaque; /**< Opaque I/O callback information */ rxdrv_t *rx; /**< RX stack top */ struct bio_source *bio; /**< Bandwidth-limited source */ @@ -225,9 +227,10 @@ enum dl_list list_idx; /**< List to which download belongs in server */ struct dl_file_info *file_info; - guint32 record_index; /**< Index of the file on the Gnutella server */ + uint32 record_index; /**< Index of the file on the Gnutella server */ const char *file_name; /**< Name of the file on the Gnutella server */ filesize_t file_size; /**< Total size of the file, in bytes */ + filesize_t downloaded; /**< Amount of bytes downloaded from source */ struct dl_chunk chunk; /**< Requested chunk */ filesize_t pos; /**< Current file data writing position */ @@ -236,7 +239,7 @@ struct gnutella_socket *socket; struct file_object *out_file; /**< downloaded file */ - guint32 overlap_size; /**< Size of the overlapping window on resume */ + uint32 overlap_size; /**< Size of the overlapping window on resume */ struct http_buffer *req; /**< HTTP request, when partially sent */ struct dl_buffers *buffers; /**< Buffers for reading, only when active */ @@ -248,12 +251,12 @@ time_t head_ping_sent; /**< Time at which last HEAD ping was sent */ tm_t header_sent; /**< When we sent headers, for latency */ - guint32 retries; - guint32 timeout_delay; - guint32 served_reqs; /**< Amount of served requests on connection */ - guint32 mismatches; /**< Amount of resuming data mismatches */ - guint32 header_read_eof; /**< EOF errors with empty headers */ - guint32 data_timeouts; /**< # of timeouts after getting headers */ + uint32 retries; + uint32 timeout_delay; + uint32 served_reqs; /**< Amount of served requests on connection */ + uint32 mismatches; /**< Amount of resuming data mismatches */ + uint32 header_read_eof; /**< EOF errors with empty headers */ + uint32 data_timeouts; /**< # of timeouts after getting headers */ const char *remove_msg; @@ -262,18 +265,19 @@ **< file download */ time_t last_dmesh; /**< Time when last download mesh was sent */ - GSList *ranges; /**< PFSP -- known list of ranges, or NULL */ + http_rangeset_t *ranges; /**< PFSP -- known set of ranges, or NULL */ filesize_t ranges_size; /**< PFSP -- size of remotely available data */ filesize_t sinkleft; /**< Amount of data left to sink */ - guint32 flags; - guint32 cflags; + uint32 flags; + uint32 cflags; unsigned src_handle_valid:1;/**< TRUE if src_handle is initialized */ unsigned keep_alive:1; /**< Keep HTTP connection? */ unsigned always_push:1; /**< Always send PUSH to connect */ unsigned got_giv:1; /**< Whether initiated from GIV reception */ unsigned unavailable:1; /**< Set on Timout, Push route lost */ + unsigned tls_upgraded:1; /**< Was successfully upgraded to TLS */ struct cproxy *cproxy; /**< Push proxy being used currently */ struct parq_dl_queued *parq_dl; /**< Queuing status */ @@ -286,6 +290,7 @@ */ enum { + DL_F_TLS_UPGRADING = 1 << 30, /**< Attempting a TLS upgrade */ DL_F_CLONED = 1 << 29, /**< Parent of a cloned download */ DL_F_PARTIAL = 1 << 28, /**< Partial source */ DL_F_FROM_ERROR = 1 << 27, /**< Switched after error occurred */ @@ -295,7 +300,7 @@ DL_F_FAKE_G2 = 1 << 23, /**< Trying to fake G2, intuition only */ DL_F_TRIED_TLS = 1 << 22, /**< TLS connection was tried already */ DL_F_TRY_TLS = 1 << 21, /**< Try to initiate a TLS connection */ - DL_F_UNUSED_1 = 1 << 20, /**< UNUSED */ + DL_F_TLS_PROPOSED = 1 << 20, /**< Proposed a TLS upgrade */ DL_F_FETCH_TTH = 1 << 19, /**< Tigertree data is being fetched */ DL_F_UDP_PUSH = 1 << 18, /**< UDP push already attempted */ DL_F_THEX = 1 << 17, /**< THEX download */ @@ -322,6 +327,9 @@ * Server attributes. */ enum { + DLS_A_NO_TLS_UPGRD = 1 << 19, /**< Server cannot handle TLS upgrades */ + DLS_A_PIPELINING = 1 << 18, /**< Server known to support pipelining */ + DLS_A_NO_PIPELINE = 1 << 17, /**< Server chokes when pipelining */ DLS_A_IPV6_ONLY = 1 << 16, /**< Server only supports IPv6 */ DLS_A_CAN_IPV6 = 1 << 15, /**< Server supports IPv6 */ DLS_A_DHT_PUBLISH = 1 << 14, /**< Server known to publish in the DHT */ @@ -362,9 +370,11 @@ #define download_pipelining(d) ((d)->pipeline != NULL) /* - * Sorted list of http_range_t objects, telling us about the available ranges + * Set of http_range_t objects, telling us about the available ranges * on the remote size, in case the file is partial. */ +#define download_is_partial(d) (0 != ((d)->flags & DL_F_PARTIAL)) +#define download_is_g2(d) ((d)->server->attrs & DLS_A_G2_ONLY) #define download_ranges(d) ((d)->ranges) #define download_ranges_size(d) ((d)->ranges_size) @@ -435,7 +445,7 @@ #define DOWNLOAD_IS_IN_PUSH_MODE(d) \ (d->always_push && !(d->flags & DL_F_PUSH_IGN)) -gboolean download_has_blank_guid(const struct download *); +bool download_has_blank_guid(const struct download *); static inline void download_check(const struct download * const d) @@ -458,14 +468,14 @@ * actually needs to be in downloads.h and should be called from * search.h and not from search_gui.h. */ -void download_index_changed(const host_addr_t, guint16, const struct guid *, - guint32, guint32); +void download_index_changed(const host_addr_t, uint16, const struct guid *, + uint32, uint32); -gboolean download_new(const char *filename, +bool download_new(const char *filename, const char *uri, filesize_t size, const host_addr_t addr, - guint16 port, + uint16 port, const struct guid *guid, const char *hostname, const struct sha1 *sha1, @@ -473,13 +483,13 @@ time_t stamp, struct dl_file_info *fi, const gnet_host_vec_t *proxies, - guint32 flags, + uint32 flags, const char *parq_id); void download_auto_new(const char *filename, filesize_t size, const host_addr_t addr, - guint16 port, + uint16 port, const struct guid *guid, const char *hostname, const struct sha1 *sha1, @@ -487,49 +497,49 @@ time_t stamp, struct dl_file_info *fi, gnet_host_vec_t *proxies, - guint32 flags); + uint32 flags); void download_dht_auto_new(const char *filename, filesize_t size, const char *hostname, const host_addr_t addr, - guint16 port, + uint16 port, const struct guid *guid, const struct sha1 *sha1, const struct tth *tth, time_t stamp, struct dl_file_info *fi, - guint32 flags); + uint32 flags); -guint download_handle_magnet(const char *url); +uint download_handle_magnet(const char *url); char *download_build_url(const struct download *); int download_get_http_req_percent(const struct download *); -void download_fallback_to_push(struct download *, gboolean, gboolean); +void download_fallback_to_push(struct download *, bool, bool); int download_remove_all_from_peer(const struct guid *, - host_addr_t addr, guint16 port, gboolean unavailable); -void download_remove_file(struct download *, gboolean reset); -gboolean download_file_exists(const struct download *); + host_addr_t addr, uint16 port, bool unavailable); +void download_remove_file(struct download *, bool reset); +bool download_file_exists(const struct download *); void download_request_requeue(struct download *); void download_request_start(struct download *); void download_request_pause(struct download *); -gboolean download_request_remove(struct download *); +bool download_request_remove(struct download *); void download_request_abort(struct download *); void download_request_resume(struct download *); void download_freeze_queue(void); void download_thaw_queue(void); -gboolean download_queue_is_frozen(void); +bool download_queue_is_frozen(void); void download_gui_updates_freeze(void); void download_gui_updates_thaw(void); -void download_clear_stopped(gboolean, gboolean, gboolean, gboolean, gboolean); +void download_clear_stopped(bool, bool, bool, bool, bool); const char *download_get_hostname(const struct download *); double download_source_progress(const struct download *); double download_total_progress(const struct download *); -gboolean download_something_to_clear(void); -guint download_speed_avg(const struct download *); +bool download_something_to_clear(void); +uint download_speed_avg(const struct download *); #endif /* CORE_SOURCES */ #endif /* _if_core_downloads_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/core/fileinfo.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/core/fileinfo.h
Changed
@@ -25,7 +25,12 @@ #define _if_core_fileinfo_h_ #include "common.h" + +#include "lib/eslist.h" +#include "lib/http_range.h" #include "lib/path.h" +#include "lib/pslist.h" + #include "if/core/downloads.h" /* For gnet_srt_t */ struct shared_file; @@ -61,7 +66,7 @@ DL_CHUNK_EMPTY = 0 /**< No data available yet */ }; -typedef guint32 gnet_fi_t; +typedef uint32 gnet_fi_t; typedef struct gnet_fi_info { gnet_fi_t fi_handle; @@ -79,19 +84,19 @@ typedef struct gnet_fi_status { filesize_t size; filesize_t done; - + filesize_t uploaded; filesize_t vrfy_hashed; filesize_t copied; time_t modified; - guint32 recvcount; - guint32 refcount; - guint32 lifecount; - guint32 recv_last_rate; - guint32 active_queued; - guint32 passive_queued; + uint32 recvcount; + uint32 refcount; + uint32 lifecount; + uint32 recv_last_rate; + uint32 active_queued; + uint32 passive_queued; unsigned dht_lookups; /**< Amount of completed DHT lookups */ unsigned dht_values; /**< Amount of successful DHT lookups */ @@ -118,7 +123,7 @@ filesize_t from; filesize_t to; enum dl_chunk_status status; - gboolean old; + bool old; } gnet_fi_chunks_t; enum fi_magic { @@ -136,12 +141,12 @@ * Each download source points to one dl_file_info structure. */ typedef struct dl_file_info { - enum fi_magic magic; + enum fi_magic magic; gnet_fi_t fi_handle; /**< Handle */ const struct guid *guid;/**< Unique fileinfo ID */ - guint32 flags; /**< Operating flags */ + uint32 flags; /**< Operating flags */ const char *pathname; /**< Output pathname (atom) */ - GSList *alias; /**< List of file name aliases (atoms) */ + pslist_t *alias; /**< List of file name aliases (atoms) */ filesize_t size; /**< File size */ const struct sha1 *sha1;/**< server SHA1 (atom) if known, NULL if not. */ const struct tth *tth; /**< server TTH (atom) if known, NULL if not. */ @@ -151,9 +156,9 @@ size_t num_leaves; /**< Number of tigertree leaves */ filesize_t slice_size; /* Slice size (bytes covered by a leaf) */ } tigertree; - gint32 refcount; /**< Reference count of file (number of sources)*/ - GSList *sources; /**< list of sources (struct download *) */ - gint32 lifecount; /**< Amount of "alive" downloads referencing us */ + int32 refcount; /**< Reference count of file (number of sources)*/ + pslist_t *sources; /**< list of sources (struct download *) */ + int32 lifecount; /**< Amount of "alive" downloads referencing us */ time_t stamp; /**< Time stamp */ time_t created; /**< Creation time stamp */ time_t modified; /**< Modification time stamp */ @@ -164,12 +169,13 @@ filesize_t done; /**< Total number of bytes completed (flushed) */ filesize_t buffered; /**< Amount of buffered data (unflushed) */ filesize_t uploaded; /**< Amount of bytes uploaded */ - GSList *chunklist; /**< List of ranges within file */ - GSList *seen_on_network; /**< List of ranges available on network */ - guint32 generation; /**< Generation number, incremented on disk update */ + eslist_t chunklist; /**< List of ranges within file */ + eslist_t available; /**< List of ranges available, with source count */ + http_rangeset_t *seen_on_network; /**< Ranges available on network */ + uint32 generation; /**< Generation number, incremented on disk update */ struct shared_file *sf; /**< When PFSP-server is enabled, share this file */ - guint32 active_queued; /**< Actively queued sources */ - guint32 passive_queued; /**< Passively queued sources */ + uint32 active_queued; /**< Actively queued sources */ + uint32 passive_queued; /**< Passively queued sources */ unsigned dht_lookups; /**< Amount of completed DHT lookups */ unsigned dht_values; /**< Amount of successful DHT lookups */ @@ -177,9 +183,9 @@ * The following group is used to compute the aggregated reception rate. */ - gint32 recvcount; /**< Amount of "receiving" d/l referencing us */ - guint32 recv_last_rate; /**< Last amount of bytes/sec received */ - guint32 recv_amount; /**< Amount of bytes received this period */ + int32 recvcount; /**< Amount of "receiving" d/l referencing us */ + uint32 recv_last_rate; /**< Last amount of bytes/sec received */ + uint32 recv_amount; /**< Amount of bytes received this period */ time_t recv_last_time; /**< When did we last compute recv_last_rate? */ /* @@ -192,7 +198,7 @@ unsigned copy_elapsed; /**< Time spent to copy the file */ /* - * Booleans (bit fields used since gboolean uses too much space). + * Booleans (bit fields used since bool uses too much space). */ unsigned file_size_known:1; /**< File size known? */ @@ -220,21 +226,21 @@ fi->flags |= FI_F_BAD_BITPRINT; } -static inline gboolean +static inline bool fi_has_bad_bitprint(fileinfo_t *fi) { file_info_check(fi); return (fi->flags & FI_F_BAD_BITPRINT) ? TRUE : FALSE; } -static inline gboolean +static inline bool FILE_INFO_COMPLETE(const fileinfo_t *fi) { file_info_check(fi); return fi->file_size_known && fi->done == fi->size; } -static inline gboolean +static inline bool FILE_INFO_FINISHED(const fileinfo_t *fi) { file_info_check(fi); @@ -272,10 +278,10 @@ #ifdef CORE_SOURCES -void fi_add_listener(fi_listener_t, gnet_fi_ev_t, frequency_t, guint32); +void fi_add_listener(fi_listener_t, gnet_fi_ev_t, frequency_t, uint32); void fi_remove_listener(fi_listener_t, gnet_fi_ev_t); -void src_add_listener(src_listener_t, gnet_src_ev_t, frequency_t, guint32); +void src_add_listener(src_listener_t, gnet_src_ev_t, frequency_t, uint32); void src_remove_listener(src_listener_t, gnet_src_ev_t); struct download *src_get_download(gnet_src_t); @@ -288,10 +294,10 @@ GSList *fi_get_ranges(gnet_fi_t); void fi_free_ranges(GSList *ranges); char **fi_get_aliases(gnet_fi_t fih); -gboolean fi_purge(gnet_fi_t fih); +bool fi_purge(gnet_fi_t fih); void fi_pause(gnet_fi_t fih); void fi_resume(gnet_fi_t fih); -gboolean fi_rename(gnet_fi_t fih, const char *); +bool fi_rename(gnet_fi_t fih, const char *); const char *file_info_readable_filename(const struct dl_file_info *fi); char *file_info_build_magnet(gnet_fi_t fih);
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/core/gnutella.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/core/gnutella.h
Changed
@@ -44,6 +44,7 @@ GTA_MSG_DHT = 0x44, /**< DHT message encapsulation */ GTA_MSG_SEARCH = 0x80, GTA_MSG_SEARCH_RESULTS = 0x81, + GTA_MSG_G2_SEARCH = 0x82, /**< Internal, does not exist! */ GTA_MSG_HSEP_DATA = 0xcd }; @@ -78,18 +79,18 @@ #if 0 struct gnutella_header_ { - guint8 muid16; - guint8 function; - guint8 ttl; - guint8 hops; - guint8 size4; + uint8 muid16; + uint8 function; + uint8 ttl; + uint8 hops; + uint8 size4; }; #endif -typedef guint8 gnutella_header_tGTA_HEADER_SIZE; +typedef uint8 gnutella_header_tGTA_HEADER_SIZE; -static inline gconstpointer -gnutella_data(gconstpointer header) +static inline const void * +gnutella_data(const void *header) { return (char *) header + GTA_HEADER_SIZE; } @@ -112,59 +113,59 @@ memcpy(header, muid, 16); } -static inline guint8 +static inline uint8 gnutella_header_get_function(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return u816; } static inline void -gnutella_header_set_function(gnutella_header_t *header, guint8 function) +gnutella_header_set_function(gnutella_header_t *header, uint8 function) { - guint8 *u8 = (void *) header; + uint8 *u8 = (void *) header; u816 = function; } -static inline guint8 +static inline uint8 gnutella_header_get_ttl(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return u817; } static inline void -gnutella_header_set_ttl(gnutella_header_t *header, guint8 ttl) +gnutella_header_set_ttl(gnutella_header_t *header, uint8 ttl) { - guint8 *u8 = (void *) header; + uint8 *u8 = (void *) header; u817 = ttl; } -static inline guint8 +static inline uint8 gnutella_header_get_hops(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return u818; } static inline void -gnutella_header_set_hops(gnutella_header_t *header, guint8 hops) +gnutella_header_set_hops(gnutella_header_t *header, uint8 hops) { - guint8 *u8 = (void *) header; + uint8 *u8 = (void *) header; u818 = hops; } -static inline guint32 +static inline uint32 gnutella_header_get_size(const void *data) { - const guint8 *u8 = data; + const uint8 *u8 = data; return peek_le32(&u819); } static inline void -gnutella_header_set_size(gnutella_header_t *header, guint32 size) +gnutella_header_set_size(gnutella_header_t *header, uint32 size) { - guint8 *u8 = (void *) header; + uint8 *u8 = (void *) header; g_assert(0 == (size & ~GTA_SIZE_MASK)); /* Don't set any "header flags" */ poke_le32(&u819, size); }
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/core/guess.h
Added
@@ -0,0 +1,91 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +#ifndef _if_core_guess_h_ +#define _if_core_guess_h_ + +#include "common.h" + +#include "search.h" /* For gnet_search_t */ + +/** + * Parallelism modes. + */ +enum guess_mode { + GUESS_QUERY_BOUNDED, /**< Bounded parallelism */ + GUESS_QUERY_LOOSE /**< Loose parallelism */ +}; + +/** + * Structure describing a newly created GUESS query. + */ +struct guess_query { + size_t max_ultra; /**< Max amount of ultrapeers queried */ + enum guess_mode mode; /**< Current query mode */ +}; + +/** + * Structure holding the core GUESS stats for a running query. + */ +struct guess_stats { + size_t pool; /**< Pool size (unqueried hosts) */ + size_t queried_ultra; /**< Ultra nodes queried */ + size_t queried_g2; /**< G2 nodes queried */ + size_t acks; /**< Query acknowledgments */ + size_t reached; /**< Amount of ultras & G2 hubs reached by query */ + size_t results; /**< Results received */ + size_t kept; /**< Results kept */ + size_t hops; /**< Iterating hops */ + size_t rpc_pending; /**< RPCs pending */ + size_t bw_out_query; /**< Spent outgoing querying bandwidth */ + size_t bw_out_qk; /**< Estimated outgoing query key bandwidth */ + enum guess_mode mode; /**< Current query mode */ + uint pool_load:1; /**< Pending pool loading */ + uint end_starving:1; /**< Will end as soon as it is starving */ +}; + +/** + * GUESS callbacks + */ + +typedef void (*guess_event_listener_t)(gnet_search_t, + const struct guess_query *query); +typedef void (*guess_stats_listener_t)(gnet_search_t, + const struct guess_stats *stats); + +/* + * GUESS public interface, visible only from the bridge. + */ + +#ifdef CORE_SOURCES + +void guess_event_listener_add(guess_event_listener_t); +void guess_event_listener_remove(guess_event_listener_t); + +void guess_stats_listener_add(guess_stats_listener_t); +void guess_stats_listener_remove(guess_stats_listener_t); + +#endif /* CORE_SOURCES */ +#endif /* _if_core_guess_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/core/guid.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/core/guid.h
Changed
@@ -49,6 +49,6 @@ extern const struct guid blank_guid; -gboolean guid_is_blank(const struct guid *); +bool guid_is_blank(const struct guid *); #endif /* _if_core_guid_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/core/hcache.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/core/hcache.h
Changed
@@ -52,16 +52,19 @@ HCACHE_GUESS_INTRO, /**< GUESS IPv4 introduction cache (LRU-managed) */ HCACHE_GUESS6, /**< Running GUESS IPv6 cache (MRU-managed) */ HCACHE_GUESS6_INTRO, /**< GUESS IPv6 introduction cache (LRU-managed) */ + HCACHE_FRESH_G2HUB, /**< Fresh IPv4 G2 hubs to which we did not connect */ + HCACHE_VALID_G2HUB, /**< Valid IPv4 G2 hubs */ HCACHE_NONE, HCACHE_MAX } hcache_type_t; typedef enum { - HOST_ANY, + HOST_ANY = 0, HOST_ULTRA, HOST_ULTRA6, HOST_GUESS, HOST_GUESS6, + HOST_G2HUB, HOST_MAX } host_type_t; @@ -74,14 +77,15 @@ typedef enum { HCACHE_CLASS_HOST, /**< Classic Gnutella host cache */ + HCACHE_CLASS_G2, /**< Classic G2 host cache */ HCACHE_CLASS_GUESS /**< GUESS-specific host cache */ } hcache_class_t; typedef struct hcache_stats { - gint32 host_count; /**< Number of hosts in cache */ - guint32 hits; /**< Hits to known hosts */ - guint32 misses; /**< Total number of misses (added hosts) */ - gboolean reading; /**< TRUE if currently reading from disk */ + int32 host_count; /**< Number of hosts in cache */ + uint32 hits; /**< Hits to known hosts */ + uint32 misses; /**< Total number of misses (added hosts) */ + bool reading; /**< TRUE if currently reading from disk */ } hcache_stats_t; /*
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/core/hsep.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/core/hsep.h
Changed
@@ -28,7 +28,7 @@ #include "lib/event.h" /* For frequency_t */ -typedef guint64 hsep_triple3; +typedef uint64 hsep_triple3; #define HSEP_N_MAX 7 /**< number of hops to consider */ @@ -49,21 +49,21 @@ hsep_triple sent_tableHSEP_N_MAX; /**< Previous table sent */ time_t last_sent; /**< When last msg was sent */ time_t last_received; /**< When last msg was rcvd */ - guint32 msgs_received; /**< # of msgs received */ - guint32 triples_received; /**< # of triples received */ - guint32 msgs_sent; /**< # of msgs sent */ - guint32 triples_sent; /**< # of triples sent */ + uint32 msgs_received; /**< # of msgs received */ + uint32 triples_received; /**< # of triples received */ + uint32 msgs_sent; /**< # of msgs sent */ + uint32 triples_sent; /**< # of triples sent */ int random_skew; /**< additonal random delay for next exchange */ - guint8 major; /**< their major version */ - guint8 minor; /**< their minor version */ + uint8 major; /**< their major version */ + uint8 minor; /**< their minor version */ } hsep_ctx_t; const char *hsep_get_static_str(int row, int column); int hsep_get_table_size(void); void hsep_get_non_hsep_triple(hsep_triple *tripledest); -void hsep_add_global_table_listener(GCallback cb, - frequency_t type, guint32 interval); -void hsep_remove_global_table_listener(GCallback cb); +void hsep_add_global_table_listener(callback_fn_t cb, + frequency_t type, uint32 interval); +void hsep_remove_global_table_listener(callback_fn_t cb); #endif /* CORE_SOURCES */ #endif /* _if_core_hsep_h */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/core/http.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/core/http.h
Changed
@@ -42,27 +42,6 @@ HTTP_AS_REMOVED /**< Removed, pending free */ } http_state_t; -/** - * HTTP range description. - */ - -typedef struct http_range { - filesize_t start; - filesize_t end; /**< HTTP_OFFSET_MAX if unbounded */ -} http_range_t; - -#define HTTP_OFFSET_MAX ((filesize_t) -1) - -/* - * Public interface, visible from the bridge. - */ - -#ifdef CORE_SOURCES - -const char *http_range_to_string(const GSList *list); -GSList *http_range_merge(GSList *list1, GSList *list2); - -#endif /* CORE_SOURCES */ - #endif /* _if_core_http_h_ */ + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/core/main.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/core/main.h
Changed
@@ -46,13 +46,15 @@ #define GTKG_SHUTDOWN_OFAST (1U << 0) /**< BYE sent to supporting nodes */ #define GTKG_SHUTDOWN_ORESTART (1U << 1) /**< Restart gtk-gnutella */ +#define GTKG_SHUTDOWN_OCRASH (1U << 2) /**< Crash restart */ void gtk_gnutella_exit(int n); void gtk_gnutella_request_shutdown(enum shutdown_mode mode, unsigned flags); -gboolean debugging(guint t); +bool debugging(uint t); char *main_command_line(void); - +const char *gtk_version_string(void); + #endif /* CORE_SOURCES */ #endif /* _if_core_main_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/core/net_stats.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/core/net_stats.h
Changed
@@ -26,327 +26,34 @@ #include "common.h" -/*** - *** General statistics - ***/ - -enum { - MSG_UNKNOWN = 0, - MSG_INIT, - MSG_INIT_RESPONSE, - MSG_BYE, - MSG_QRP, - MSG_HSEP, - MSG_RUDP, - MSG_VENDOR, - MSG_STANDARD, - MSG_PUSH_REQUEST, - MSG_SEARCH, - MSG_SEARCH_RESULTS, - MSG_DHT, - MSG_DHT_PING, - MSG_DHT_PONG, - MSG_DHT_STORE, - MSG_DHT_STORE_ACK, - MSG_DHT_FIND_NODE, - MSG_DHT_FOUND_NODE, - MSG_DHT_FIND_VALUE, - MSG_DHT_VALUE, - MSG_TOTAL, /**< always counted (for all the above types) */ - - MSG_TYPE_COUNT /**< number of known message types */ -}; +#include "if/gen/gnr_stats.h" +#include "if/gen/msg.h" +#include "if/gen/msg_drop.h" #define MSG_DHT_BASE 0xd0 /* Base in lookup table for DHT messages */ - -typedef enum msg_drop_reason { - MSG_DROP_BAD_SIZE = 0, - MSG_DROP_TOO_SMALL, - MSG_DROP_TOO_LARGE, - MSG_DROP_WAY_TOO_LARGE, - MSG_DROP_UNKNOWN_TYPE, - MSG_DROP_UNEXPECTED, - MSG_DROP_TTL0, - MSG_DROP_IMPROPER_HOPS_TTL, - MSG_DROP_MAX_TTL_EXCEEDED, - MSG_DROP_THROTTLE, - MSG_DROP_LIMIT, - MSG_DROP_TRANSIENT, - MSG_DROP_PONG_UNUSABLE, - MSG_DROP_HARD_TTL_LIMIT, - MSG_DROP_MAX_HOP_COUNT, - MSG_DROP_ROUTE_LOST, - MSG_DROP_NO_ROUTE, - MSG_DROP_DUPLICATE, - MSG_DROP_TO_BANNED, - MSG_DROP_FROM_BANNED, - MSG_DROP_SHUTDOWN, - MSG_DROP_FLOW_CONTROL, - MSG_DROP_QUERY_NO_NUL, - MSG_DROP_QUERY_TOO_SHORT, - MSG_DROP_QUERY_OVERHEAD, - MSG_DROP_BAD_URN, - MSG_DROP_MALFORMED_SHA1, - MSG_DROP_MALFORMED_UTF_8, - MSG_DROP_BAD_RESULT, - MSG_DROP_BAD_RETURN_ADDRESS, - MSG_DROP_HOSTILE_IP, - MSG_DROP_MORPHEUS_BOGUS, - MSG_DROP_SPAM, - MSG_DROP_EVIL, - MSG_DROP_MEDIA, - MSG_DROP_INFLATE_ERROR, - MSG_DROP_UNKNOWN_HEADER_FLAGS, - MSG_DROP_OWN_RESULT, - MSG_DROP_OWN_QUERY, - MSG_DROP_ANCIENT_QUERY, - MSG_DROP_BLANK_SERVENT_ID, - MSG_DROP_GUESS_MISSING_TOKEN, - MSG_DROP_GUESS_INVALID_TOKEN, - MSG_DROP_DHT_INVALID_TOKEN, - MSG_DROP_DHT_TOO_MANY_STORE, - MSG_DROP_DHT_UNPARSEABLE, - - MSG_DROP_REASON_COUNT /**< number of known reasons to drop a message */ -} msg_drop_reason_t; - -/* - * Any change in the following enum needs to be reported to: - * - * gnet_stats_general_to_string() core - * general_type_str() ui/gtk - */ - -typedef enum { - GNR_ROUTING_ERRORS = 0, - GNR_ROUTING_TABLE_CHUNKS, - GNR_ROUTING_TABLE_CAPACITY, - GNR_ROUTING_TABLE_COUNT, - GNR_ROUTING_TRANSIENT_AVOIDED, - GNR_DUPS_WITH_HIGHER_TTL, - GNR_SPAM_SHA1_HITS, - GNR_SPAM_NAME_HITS, - GNR_SPAM_FAKE_HITS, - GNR_SPAM_DUP_HITS, - GNR_SPAM_CAUGHT_HOSTILE_IP, - GNR_SPAM_CAUGHT_HOSTILE_HELD, - GNR_SPAM_IP_HELD, - GNR_LOCAL_SEARCHES, - GNR_LOCAL_HITS, - GNR_LOCAL_PARTIAL_HITS, - GNR_LOCAL_WHATS_NEW_HITS, - GNR_LOCAL_QUERY_HITS, - GNR_OOB_PROXIED_QUERY_HITS, - GNR_OOB_QUERIES, - GNR_OOB_QUERIES_STRIPPED, - GNR_QUERY_OOB_PROXIED_DUPS, - GNR_OOB_HITS_FOR_PROXIED_QUERIES, - GNR_OOB_HITS_WITH_ALIEN_IP, - GNR_OOB_HITS_IGNORED_ON_SPAMMER_HIT, - GNR_UNCLAIMED_OOB_HITS, - GNR_PARTIALLY_CLAIMED_OOB_HITS, - GNR_SPURIOUS_OOB_HIT_CLAIM, - GNR_UNREQUESTED_OOB_HITS, - GNR_QUERY_HIT_FOR_UNTRACKED_QUERY, - GNR_QUERY_TRACKED_MUIDS, - GNR_QUERY_COMPACT_COUNT, - GNR_QUERY_COMPACT_SIZE, - GNR_QUERY_UTF8, - GNR_QUERY_SHA1, - GNR_QUERY_WHATS_NEW, - GNR_QUERY_GUESS, - GNR_QUERY_GUESS_02, - GNR_GUESS_CACHED_QUERY_KEYS_HELD, - GNR_GUESS_CACHED_02_HOSTS_HELD, - GNR_GUESS_LOCAL_QUERIES, - GNR_GUESS_LOCAL_RUNNING, - GNR_GUESS_LOCAL_QUERY_HITS, - GNR_GUESS_HOSTS_QUERIED, - GNR_GUESS_HOSTS_ACKNOWLEDGED, - GNR_BROADCASTED_PUSHES, - GNR_PUSH_PROXY_UDP_RELAYED, - GNR_PUSH_PROXY_TCP_RELAYED, - GNR_PUSH_PROXY_BROADCASTED, - GNR_PUSH_PROXY_ROUTE_NOT_PROXIED, - GNR_PUSH_PROXY_FAILED, - GNR_PUSH_RELAYED_VIA_LOCAL_ROUTE, - GNR_PUSH_RELAYED_VIA_TABLE_ROUTE, - GNR_LOCAL_DYN_QUERIES, - GNR_LEAF_DYN_QUERIES, - GNR_OOB_PROXIED_QUERIES, - GNR_DYN_QUERIES_COMPLETED_FULL, - GNR_DYN_QUERIES_COMPLETED_PARTIAL, - GNR_DYN_QUERIES_COMPLETED_ZERO, - GNR_DYN_QUERIES_LINGER_EXTRA, - GNR_DYN_QUERIES_LINGER_RESULTS, - GNR_DYN_QUERIES_LINGER_COMPLETED, - GNR_GTKG_TOTAL_QUERIES, - GNR_GTKG_REQUERIES, - GNR_QUERIES_WITH_GGEP_H, - GNR_GIV_CALLBACKS, - GNR_GIV_DISCARDED, - GNR_QUEUE_CALLBACKS, - GNR_QUEUE_DISCARDED, - GNR_UDP_BOGUS_SOURCE_IP, - GNR_UDP_ALIEN_MESSAGE, - GNR_UDP_UNPROCESSED_MESSAGE, - GNR_UDP_TX_COMPRESSED, - GNR_UDP_RX_COMPRESSED, - GNR_UDP_LARGER_HENCE_NOT_COMPRESSED, - GNR_CONSOLIDATED_SERVERS, - GNR_DUP_DOWNLOADS_IN_CONSOLIDATION, - GNR_DISCOVERED_SERVER_GUID, - GNR_CHANGED_SERVER_GUID, - GNR_GUID_COLLISIONS, - GNR_OWN_GUID_COLLISIONS, - GNR_BANNED_GUID_HELD, - GNR_RECEIVED_KNOWN_FW_NODE_INFO, - GNR_REVITALIZED_PUSH_ROUTES, - GNR_COLLECTED_PUSH_PROXIES, - GNR_ATTEMPTED_RESOURCE_SWITCHING, - GNR_ATTEMPTED_RESOURCE_SWITCHING_AFTER_ERROR, - GNR_SUCCESSFUL_RESOURCE_SWITCHING, - GNR_SUCCESSFUL_PLAIN_RESOURCE_SWITCHING, - GNR_SUCCESSFUL_RESOURCE_SWITCHING_AFTER_ERROR, - GNR_QUEUED_AFTER_SWITCHING, - GNR_SUNK_DATA, - GNR_IGNORED_DATA, - GNR_IGNORING_AFTER_MISMATCH, - GNR_IGNORING_TO_PRESERVE_CONNECTION, - GNR_IGNORING_DURING_AGGRESSIVE_SWARMING, - GNR_IGNORING_REFUSED, - GNR_CLIENT_RESOURCE_SWITCHING, - GNR_CLIENT_PLAIN_RESOURCE_SWITCHING, - GNR_CLIENT_FOLLOWUP_AFTER_ERROR, - GNR_PARQ_SLOT_RESOURCE_SWITCHING, - GNR_PARQ_RETRY_AFTER_VIOLATION, - GNR_PARQ_RETRY_AFTER_KICK_OUT, - GNR_PARQ_SLOT_LIMIT_OVERRIDES, - GNR_PARQ_QUICK_SLOTS_GRANTED, - GNR_PARQ_QUEUE_SENDING_ATTEMPTS, - GNR_PARQ_QUEUE_SENT, - GNR_PARQ_QUEUE_FOLLOW_UPS, - GRN_SHA1_VERIFICATIONS, - GRN_TTH_VERIFICATIONS, - GNR_BITZI_TICKETS_HELD, - GNR_QHIT_SEEDING_OF_ORPHAN, - GNR_UPLOAD_SEEDING_OF_ORPHAN, - GNR_DHT_ESTIMATED_SIZE, - GNR_DHT_KBALL_THEORETICAL, - GNR_DHT_KBALL_FURTHEST, - GNR_DHT_KBALL_CLOSEST, - GNR_DHT_ROUTING_BUCKETS, - GNR_DHT_ROUTING_LEAVES, - GNR_DHT_ROUTING_MAX_DEPTH, - GNR_DHT_ROUTING_GOOD_NODES, - GNR_DHT_ROUTING_STALE_NODES, - GNR_DHT_ROUTING_PENDING_NODES, - GNR_DHT_ROUTING_EVICTED_NODES, - GNR_DHT_ROUTING_EVICTED_FIREWALLED_NODES, - GNR_DHT_ROUTING_EVICTED_QUOTA_NODES, - GNR_DHT_ROUTING_PROMOTED_PENDING_NODES, - GNR_DHT_ROUTING_PINGED_PROMOTED_NODES, - GNR_DHT_ROUTING_REJECTED_NODE_BUCKET_QUOTA, - GNR_DHT_ROUTING_REJECTED_NODE_GLOBAL_QUOTA, - GNR_DHT_COMPLETED_BUCKET_REFRESH, - GNR_DHT_FORCED_BUCKET_REFRESH, - GNR_DHT_FORCED_BUCKET_MERGE, - GNR_DHT_DENIED_UNSPLITABLE_BUCKET_REFRESH, - GNR_DHT_BUCKET_ALIVE_CHECK, - GNR_DHT_ALIVE_PINGS_TO_GOOD_NODES, - GNR_DHT_ALIVE_PINGS_TO_STALE_NODES, - GNR_DHT_ALIVE_PINGS_TO_SHUTDOWNING_NODES, - GNR_DHT_ALIVE_PINGS_AVOIDED, - GNR_DHT_ALIVE_PINGS_SKIPPED, - GNR_DHT_REVITALIZED_STALE_NODES, - GNR_DHT_REJECTED_VALUE_ON_QUOTA, - GNR_DHT_REJECTED_VALUE_ON_CREATOR, - GNR_DHT_LOOKUP_REJECTED_NODE_ON_NET_QUOTA, - GNR_DHT_LOOKUP_REJECTED_NODE_ON_PROXIMITY, - GNR_DHT_LOOKUP_REJECTED_NODE_ON_DIVERGENCE, - GNR_DHT_KEYS_HELD, - GNR_DHT_CACHED_KEYS_HELD, - GNR_DHT_VALUES_HELD, - GNR_DHT_CACHED_KUID_TARGETS_HELD, - GNR_DHT_CACHED_ROOTS_HELD, - GNR_DHT_CACHED_ROOTS_EXACT_HITS, - GNR_DHT_CACHED_ROOTS_APPROXIMATE_HITS, - GNR_DHT_CACHED_ROOTS_MISSES, - GNR_DHT_CACHED_ROOTS_KBALL_LOOKUPS, - GNR_DHT_CACHED_ROOTS_CONTACT_REFRESHED, - GNR_DHT_CACHED_TOKENS_HELD, - GNR_DHT_CACHED_TOKENS_HITS, - GNR_DHT_STABLE_NODES_HELD, - GNR_DHT_FETCH_LOCAL_HITS, - GNR_DHT_FETCH_LOCAL_CACHED_HITS, - GNR_DHT_RETURNED_EXPANDED_VALUES, - GNR_DHT_RETURNED_SECONDARY_KEYS, - GNR_DHT_CLAIMED_SECONDARY_KEYS, - GNR_DHT_RETURNED_EXPANDED_CACHED_VALUES, - GNR_DHT_RETURNED_CACHED_SECONDARY_KEYS, - GNR_DHT_CLAIMED_CACHED_SECONDARY_KEYS, - GNR_DHT_PUBLISHED, - GNR_DHT_REMOVED, - GNR_DHT_STALE_REPLICATION, - GNR_DHT_REPLICATION, - GNR_DHT_REPUBLISH, - GNR_DHT_SECONDARY_KEY_FETCH, - GNR_DHT_DUP_VALUES, - GNR_DHT_KUID_COLLISIONS, - GNR_DHT_OWN_KUID_COLLISIONS, - GNR_DHT_RPC_KUID_REPLY_MISMATCH, - GNR_DHT_CACHING_ATTEMPTS, - GNR_DHT_CACHING_SUCCESSFUL, - GNR_DHT_CACHING_PARTIALLY_SUCCESSFUL, - GNR_DHT_KEY_OFFLOADING_CHECKS, - GNR_DHT_KEYS_SELECTED_FOR_OFFLOADING, - GNR_DHT_KEY_OFFLOADING_ATTEMPTS, - GNR_DHT_KEY_OFFLOADING_SUCCESSFUL, - GNR_DHT_KEY_OFFLOADING_PARTIALLY_SUCCESSFUL, - GNR_DHT_VALUES_OFFLOADED, - GNR_DHT_PUBLISHING_ATTEMPTS, - GNR_DHT_PUBLISHING_SUCCESSFUL, - GNR_DHT_PUBLISHING_PARTIALLY_SUCCESSFUL, - GNR_DHT_PUBLISHING_SATISFACTORY, - GNR_DHT_REPUBLISHED_LATE, - GNR_DHT_PUBLISHING_TO_SELF, - GNR_DHT_PUBLISHING_BG_ATTEMPTS, - GNR_DHT_PUBLISHING_BG_IMPROVEMENTS, - GNR_DHT_PUBLISHING_BG_SUCCESSFUL, - GNR_DHT_SHA1_DATA_TYPE_COLLISIONS, - GNR_DHT_PASSIVELY_PROTECTED_LOOKUP_PATH, - GNR_DHT_ACTIVELY_PROTECTED_LOOKUP_PATH, - GNR_DHT_ALT_LOC_LOOKUPS, - GNR_DHT_PUSH_PROXY_LOOKUPS, - GNR_DHT_SUCCESSFUL_ALT_LOC_LOOKUPS, - GNR_DHT_SUCCESSFUL_PUSH_PROXY_LOOKUPS, - GNR_DHT_SUCCESSFUL_NODE_PUSH_ENTRY_LOOKUPS, - GNR_DHT_SEEDING_OF_ORPHAN, - - GNR_TYPE_COUNT /* number of general stats */ -} gnr_stats_t; +#define MSG_G2_BASE 0x05 /* Base in lookup table for G2 messages */ #define STATS_FLOWC_COLUMNS 10 /**< Type, 0..7, 8+ */ #define STATS_RECV_COLUMNS 10 /**< -"- */ typedef struct gnet_stat { - guint64 drop_reasonMSG_DROP_REASON_COUNTMSG_TYPE_COUNT; + uint64 drop_reasonMSG_DROP_REASON_COUNTMSG_TYPE_COUNT; struct { - guint64 receivedMSG_TYPE_COUNT; - guint64 expiredMSG_TYPE_COUNT; - guint64 droppedMSG_TYPE_COUNT; - guint64 queuedMSG_TYPE_COUNT; - guint64 relayedMSG_TYPE_COUNT; - guint64 gen_queuedMSG_TYPE_COUNT; - guint64 generatedMSG_TYPE_COUNT; - guint64 received_hopsSTATS_RECV_COLUMNSMSG_TYPE_COUNT; - guint64 received_ttlSTATS_RECV_COLUMNSMSG_TYPE_COUNT; - guint64 flowc_hopsSTATS_FLOWC_COLUMNSMSG_TYPE_COUNT; - guint64 flowc_ttlSTATS_FLOWC_COLUMNSMSG_TYPE_COUNT; + uint64 receivedMSG_TYPE_COUNT; + uint64 expiredMSG_TYPE_COUNT; + uint64 droppedMSG_TYPE_COUNT; + uint64 queuedMSG_TYPE_COUNT; + uint64 relayedMSG_TYPE_COUNT; + uint64 gen_queuedMSG_TYPE_COUNT; + uint64 generatedMSG_TYPE_COUNT; + uint64 received_hopsSTATS_RECV_COLUMNSMSG_TYPE_COUNT; + uint64 received_ttlSTATS_RECV_COLUMNSMSG_TYPE_COUNT; + uint64 flowc_hopsSTATS_FLOWC_COLUMNSMSG_TYPE_COUNT; + uint64 flowc_ttlSTATS_FLOWC_COLUMNSMSG_TYPE_COUNT; } pkg, byte; - guint64 generalGNR_TYPE_COUNT; + uint64 generalGNR_TYPE_COUNT; } gnet_stats_t; typedef enum { @@ -363,10 +70,10 @@ } gnet_bw_source; typedef struct gnet_bw_stats { - gboolean enabled; - guint32 current; - guint32 average; - guint32 limit; + bool enabled; + uint32 current; + uint32 average; + uint32 limit; } gnet_bw_stats_t; /*** @@ -379,8 +86,6 @@ void gnet_stats_tcp_get(gnet_stats_t *stats); void gnet_stats_udp_get(gnet_stats_t *stats); void gnet_get_bw_stats(gnet_bw_source type, gnet_bw_stats_t *stats); -const char *gnet_stats_drop_reason_to_string(msg_drop_reason_t reason); -const char *gnet_stats_general_to_string(gnr_stats_t type); #endif /* CORE_SOURCES */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/core/nodes.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/core/nodes.h
Changed
@@ -51,40 +51,40 @@ /* General information always returned */ char vendor4; /**< Vendor code */ enum rnode_mode mode; /**< Running configuration */ - guint32 answer_flags; /**< Flags for the "Node Info Reply" message */ - guint32 op_flags; /**< Operating flags */ - guint32 features2; /**< Optional features */ - guint8 features_count; /**< # of valid entries in features */ - guint8 max_ultra_up; /**< Max # of ultrapeers in ultra mode */ - guint8 max_ultra_lf; /**< Max # of ultrapeers in leaf mode */ - guint8 ultra_count; /**< Current amount of ultra nodes */ - guint8 ttl; /**< TTL limit for messages sent */ - guint8 hard_ttl; /**< Hard TTL limit for messages relayed */ - guint16 max_leaves; /**< Max # of leaf nodes */ - guint16 leaf_count; /**< Current amount of leaf nodes */ - guint32 startup_time; /**< Startup time */ - guint32 ip_change_time; /**< Last IP change time */ + uint32 answer_flags; /**< Flags for the "Node Info Reply" message */ + uint32 op_flags; /**< Operating flags */ + uint32 features2; /**< Optional features */ + uint8 features_count; /**< # of valid entries in features */ + uint8 max_ultra_up; /**< Max # of ultrapeers in ultra mode */ + uint8 max_ultra_lf; /**< Max # of ultrapeers in leaf mode */ + uint8 ultra_count; /**< Current amount of ultra nodes */ + uint8 ttl; /**< TTL limit for messages sent */ + uint8 hard_ttl; /**< Hard TTL limit for messages relayed */ + uint16 max_leaves; /**< Max # of leaf nodes */ + uint16 leaf_count; /**< Current amount of leaf nodes */ + uint32 startup_time; /**< Startup time */ + uint32 ip_change_time; /**< Last IP change time */ /* Bandwidth information, optional */ - guint16 bw_flags; /**< Bandwidth setting flags */ - guint32 gnet_bw_in; /**< Incoming Gnet b/w in KiB/s (0=no limit) */ - guint32 gnet_bw_out; /**< Outgoing Gnet b/w in KiB/s (0=no limit) */ - guint32 gnet_bwl_in; /**< Incoming leaf b/w in KiB/s (0=no limit) */ - guint32 gnet_bwl_out; /**< Outgoing leaf b/w in KiB/s (0=no limit) */ + uint16 bw_flags; /**< Bandwidth setting flags */ + uint32 gnet_bw_in; /**< Incoming Gnet b/w in KiB/s (0=no limit) */ + uint32 gnet_bw_out; /**< Outgoing Gnet b/w in KiB/s (0=no limit) */ + uint32 gnet_bwl_in; /**< Incoming leaf b/w in KiB/s (0=no limit) */ + uint32 gnet_bwl_out; /**< Outgoing leaf b/w in KiB/s (0=no limit) */ /* Packets remote node dropped on this TCP connection */ - guint32 tx_dropped; /**< Amount of dropped packets on TX */ - guint32 rx_dropped; /**< Amount of dropped packets on RX */ + uint32 tx_dropped; /**< Amount of dropped packets on TX */ + uint32 rx_dropped; /**< Amount of dropped packets on RX */ /* Query hit statistics */ - guint16 results_max; /**< Max # of results per query hit */ - guint32 file_hits; /**< Hits on shared files */ - guint32 qhits_tcp; /**< Query hits returned via TCP */ - guint32 qhits_udp; /**< Claimed query hits returned via UDP */ - guint64 qhits_tcp_bytes; /**< Total size of TCP qhits (with header) */ - guint64 qhits_udp_bytes; /**< Total size of UDP qhits (with header) */ + uint16 results_max; /**< Max # of results per query hit */ + uint32 file_hits; /**< Hits on shared files */ + uint32 qhits_tcp; /**< Query hits returned via TCP */ + uint32 qhits_udp; /**< Claimed query hits returned via UDP */ + uint64 qhits_tcp_bytes; /**< Total size of TCP qhits (with header) */ + uint64 qhits_udp_bytes; /**< Total size of UDP qhits (with header) */ /* CPU statistics */ - guint64 cpu_usr; /**< Total user CPU time used, in ms */ - guint64 cpu_sys; /**< Total kernel CPU time used, in ms */ + uint64 cpu_usr; /**< Total user CPU time used, in ms */ + uint64 cpu_sys; /**< Total kernel CPU time used, in ms */ /* Information sent via optional GGEP blocks */ - guint32 ggep_du; /**< Daily average uptime, from "DU" */ + uint32 ggep_du; /**< Daily average uptime, from "DU" */ const char *ggep_ua; /**< User-Agent string (atom), from "UA" */ host_addr_t ggep_ipv6; /**< IPv6 address */ } rnode_info_t; @@ -192,78 +192,78 @@ */ typedef struct gnet_node_status { - guchar status; /**< See possible values below */ + uchar status; /**< See possible values below */ /* FIXME: the variables below should go to gnet_node_info since they * only change very seldom */ time_t connect_date; /**< When we got connected (after handshake) */ time_t up_date; /**< When remote server started (0 if unknown) */ - guint32 gnet_files_count; /**< Amount of files shared */ - guint32 gnet_kbytes_count; /**< Size of the library, in Kbytes */ - gboolean gnet_info_known; /**< Whether previous two values are known */ - gboolean is_pseudo; /**< TRUE if it's the pseudo UDP node */ - - guint32 sent; /**< Number of sent packets */ - guint32 received; /**< Number of received packets */ - guint32 tx_dropped; /**< Number of packets dropped at TX time */ - guint32 rx_dropped; /**< Number of packets dropped at RX time */ - guint32 n_bad; /**< Number of bad packets received */ - guint16 n_dups; /**< Number of dup messages received (bad) */ - guint16 n_hard_ttl; /**< Number of hard_ttl exceeded (bad) */ - guint32 n_weird; /**< Number of weird messages from that node */ - guint32 n_hostile; /**< Number of messages from hostile IP */ - guint32 n_spam; /**< Number of messages rated as spam */ - guint32 n_evil; /**< Number of messages with evil filenames */ - - guint squeue_sent; - guint squeue_count; - guint mqueue_count; - guint mqueue_percent_used; - gboolean in_tx_flow_control; - gboolean in_tx_swift_control; + uint32 gnet_files_count; /**< Amount of files shared */ + uint32 gnet_kbytes_count; /**< Size of the library, in Kbytes */ + bool gnet_info_known; /**< Whether previous two values are known */ + bool is_pseudo; /**< TRUE if it's the pseudo UDP node */ + + uint32 sent; /**< Number of sent packets */ + uint32 received; /**< Number of received packets */ + uint32 tx_dropped; /**< Number of packets dropped at TX time */ + uint32 rx_dropped; /**< Number of packets dropped at RX time */ + uint32 n_bad; /**< Number of bad packets received */ + uint16 n_dups; /**< Number of dup messages received (bad) */ + uint16 n_hard_ttl; /**< Number of hard_ttl exceeded (bad) */ + uint32 n_weird; /**< Number of weird messages from that node */ + uint32 n_hostile; /**< Number of messages from hostile IP */ + uint32 n_spam; /**< Number of messages rated as spam */ + uint32 n_evil; /**< Number of messages with evil filenames */ + + uint squeue_sent; + uint squeue_count; + uint mqueue_count; + uint mqueue_percent_used; + bool in_tx_flow_control; + bool in_tx_swift_control; /* * Traffic statistics -- RAM, 13/05/2002. */ - guint64 tx_given; /**< Bytes fed to the TX stack (from top) */ - guint64 tx_deflated; /**< Bytes deflated by the TX stack */ - guint64 tx_written; /**< Bytes written by the TX stack */ - gboolean tx_compressed; /**< Is TX traffic compressed */ - float tx_compression_ratio; /**< TX compression ratio */ - guint32 tx_bps; /**< TX traffic rate */ + uint64 tx_given; /**< Bytes fed to the TX stack (from top) */ + uint64 tx_deflated; /**< Bytes deflated by the TX stack */ + uint64 tx_written; /**< Bytes written by the TX stack */ + bool tx_compressed; /**< Is TX traffic compressed */ + float tx_compression_ratio; /**< TX compression ratio */ + uint32 tx_bps; /**< TX traffic rate */ - guint64 rx_given; /**< Bytes fed to the RX stack (from bottom) */ - guint64 rx_inflated; /**< Bytes inflated by the RX stack */ - guint64 rx_read; /**< Bytes read from the RX stack */ - gboolean rx_compressed; /**< Is RX traffic compressed */ - float rx_compression_ratio;/**< RX compression ratio */ - float rx_bps; /**< RX traffic rate */ + uint64 rx_given; /**< Bytes fed to the RX stack (from bottom) */ + uint64 rx_inflated; /**< Bytes inflated by the RX stack */ + uint64 rx_read; /**< Bytes read from the RX stack */ + bool rx_compressed; /**< Is RX traffic compressed */ + float rx_compression_ratio;/**< RX compression ratio */ + float rx_bps; /**< RX traffic rate */ /* * Gnutella statistics -- RAM, 10/12/2003. */ - gboolean has_qrp; /**< Whether node is under QRP control */ + bool has_qrp; /**< Whether node is under QRP control */ float qrp_efficiency; /**< Queries matched / received on QRP control */ - guint32 rx_queries; /**< Total amount of queries received */ - guint32 tx_queries; /**< Total amount of queries sent */ - guint32 rx_qhits; /**< Total amount of hits received */ - guint32 tx_qhits; /**< Total amount of hits sent */ + uint32 rx_queries; /**< Total amount of queries received */ + uint32 tx_queries; /**< Total amount of queries sent */ + uint32 rx_qhits; /**< Total amount of hits received */ + uint32 tx_qhits; /**< Total amount of hits sent */ - guint qrt_slots; /**< Amount of slots in leaf's QRT */ - guint qrt_generation; /**< Generation number */ - guint qrt_fill_ratio; /**< % of filling */ - guint qrt_pass_throw; /**< Query limiter pass throw when table filled */ + uint qrt_slots; /**< Amount of slots in leaf's QRT */ + uint qrt_generation; /**< Generation number */ + uint qrt_fill_ratio; /**< % of filling */ + uint qrt_pass_throw; /**< Query limiter pass throw when table filled */ - guint32 rt_avg; /**< Average ping/pong roundtrip time */ - guint32 rt_last; /**< Last ping/pong roundtrip time */ + uint32 rt_avg; /**< Average ping/pong roundtrip time */ + uint32 rt_last; /**< Last ping/pong roundtrip time */ - guint32 tcp_rtt; /**< RTT in ms over TCP */ - guint32 udp_rtt; /**< RTT in ms over UDP */ + uint32 tcp_rtt; /**< RTT in ms over TCP */ + uint32 udp_rtt; /**< RTT in ms over UDP */ - guint shutdown_remain; /**< Number of seconds before shutdown */ + uint shutdown_remain; /**< Number of seconds before shutdown */ char message128; /**< Additional information */ } gnet_node_status_t; @@ -278,14 +278,15 @@ int proto_major; /**< Protocol major number */ int proto_minor; /**< Protocol minor number */ vendor_code_t vcode; /**< Vendor code (vcode.u32 == 0 when unknown) */ - gboolean is_pseudo; /**< TRUE if it's the pseudo UDP node */ + uint is_pseudo:1; /**< TRUE if it's the pseudo UDP node */ + uint is_g2:1; /**< TRUE if this is a G2 node */ host_addr_t addr; /**< ip of the node (connected) */ host_addr_t gnet_addr; /**< Advertised Gnutella address for connecting */ - guint16 port; /**< port of the node (connected) */ - guint16 gnet_port; /**< Advertised Gnutella listening port */ - guint16 country; /**< Country information */ + uint16 port; /**< port of the node (connected) */ + uint16 gnet_port; /**< Advertised Gnutella listening port */ + uint16 country; /**< Country information */ } gnet_node_info_t; @@ -301,6 +302,7 @@ NODE_P_CRAWLER, /**< Crawler node */ NODE_P_UDP, /**< UDP "fake" node */ NODE_P_DHT, /**< DHT "fake" node (UDP-only traffic) */ + NODE_P_G2HUB, /**< G2 Hub */ NODE_P_UNKNOWN /**< Unknown mode yet */ } node_peer_t; @@ -322,7 +324,7 @@ qrt_state_t qrt_state; qrt_state_t uqrt_state; mq_status_t mq_status; - guint8 hops_flow; + uint8 hops_flow; unsigned incoming:1; unsigned writable:1; unsigned readable:1; @@ -331,6 +333,8 @@ unsigned is_push_proxied:1; unsigned is_proxying:1; unsigned tls:1; + unsigned tls_upgraded:1; + unsigned empty_qrt:1; } gnet_node_flags_t; /* @@ -344,7 +348,7 @@ GTA_NODE_REMOVING = 5, /**< Removing node */ GTA_NODE_RECEIVING_HELLO = 6, /**< Receiving 0.6 headers */ GTA_NODE_SHUTDOWN = 7 /**< Connection being shutdown */ - + } gnet_node_state_t; #define GTA_NORMAL_TTL 4 /**< Regular TTL, for hops-flow */ @@ -381,16 +385,20 @@ /* * Nodes public interface */ -void node_add(const host_addr_t addr, guint16, guint32 flags); -void node_add_by_name(const char *host, guint16, guint32 flags); + +struct pslist; + +void node_add(const host_addr_t addr, uint16, uint32 flags); +void node_g2_add(const host_addr_t addr, uint16, uint32 flags); +void node_add_by_name(const char *host, uint16, uint32 flags); void node_remove_by_id(const struct nid *node_id); -void node_remove_nodes_by_id(const GSList *node_list); -gboolean node_get_status(const struct nid *node_id, gnet_node_status_t *s); +void node_remove_nodes_by_id(const struct pslist *node_list); +bool node_get_status(const struct nid *node_id, gnet_node_status_t *s); gnet_node_info_t *node_get_info(const struct nid *node_id); void node_clear_info(gnet_node_info_t *info); void node_free_info(gnet_node_info_t *info); -gboolean node_fill_flags(const struct nid *node_id, gnet_node_flags_t *flags); -gboolean node_fill_info(const struct nid *node_id, gnet_node_info_t *info); +bool node_fill_flags(const struct nid *node_id, gnet_node_flags_t *flags); +bool node_fill_info(const struct nid *node_id, gnet_node_info_t *info); const char *node_flags_to_string(const gnet_node_flags_t *flags); const char *node_peermode_to_string(node_peer_t m);
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/core/pproxy.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/core/pproxy.h
Changed
@@ -55,21 +55,21 @@ cevent_t *udp_ev; /**< UDP PUSH timeout */ host_addr_t addr; /**< IP of the proxy servent */ - guint16 port; /**< Port of the proxy servent */ + uint16 port; /**< Port of the proxy servent */ const char *server; /**< Server string */ const struct guid *guid;/**< GUID (atom) to which push should be sent */ - guint32 file_idx; /**< File index to request */ - gpointer http_handle; /**< Asynchronous HTTP request handle */ - guint32 flags; /**< Operating flags */ + uint32 file_idx; /**< File index to request */ + void *http_handle; /**< Asynchronous HTTP request handle */ + uint32 flags; /**< Operating flags */ /* * For GUI. */ http_state_t state; /**< State of the HTTP request */ - gboolean done; /**< We're done with request */ - gboolean sent; /**< Whether push was sent */ - gboolean directly; /**< Whether push was sent directly or via Gnet */ + bool done; /**< We're done with request */ + bool sent; /**< Whether push was sent */ + bool directly; /**< Whether push was sent directly or via Gnet */ }; #define cproxy_vendor_str(c) ((c)->server ? (c)->server : "")
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/core/search.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/core/search.h
Changed
@@ -26,15 +26,17 @@ #include "common.h" -#include "lib/misc.h" #include "lib/hashlist.h" +#include "lib/misc.h" +#include "lib/pslist.h" #include "lib/vendors.h" + #include "if/core/nodes.h" /*** *** Searches ***/ -typedef guint32 gnet_search_t; +typedef uint32 gnet_search_t; /* * Flags for search_new() @@ -49,9 +51,22 @@ }; /* + * Result sets `spam' flags. + */ +enum { + SPAM_F_ALT = 1 << 5, /** Carries alt-loc spam UNUSED */ + SPAM_F_DUP = 1 << 4, /**< Duplicate entries in results */ + SPAM_F_FAKE = 1 << 3, /**< Fake file */ + SPAM_F_NAME = 1 << 2, /**< Carries filename spam */ + SPAM_F_URL = 1 << 1, /**< Carries action URL spam */ + SPAM_F_URN = 1 << 0 /**< Carries spam known by URN */ +}; + +/* * Result sets `status' flags. */ enum { + ST_SR_UDP = (1 << 29), /**< Got hit via semi-reliable UDP */ ST_BANNED_GUID = (1 << 28), /**< Servent GUID is banned */ ST_MEDIA = (1 << 27), /**< No proper media type in hit */ ST_ALIEN = (1 << 26), /**< Alien IP address in UDP hit */ @@ -64,12 +79,12 @@ ST_HOSTILE = (1 << 19), /**< From an hostile host */ ST_UNREQUESTED = (1 << 18), /**< Unrequested (OOB) result */ ST_EVIL = (1 << 17), /**< Carries evil filename */ - ST_ALT_SPAM = (1 << 16), /**< Carries alt-loc spam UNUSED */ - ST_DUP_SPAM = (1 << 15), /**< Carries spam known by URN */ - ST_FAKE_SPAM = (1 << 14), /**< Fake file */ - ST_NAME_SPAM = (1 << 13), /**< Carries alt-loc spam */ - ST_URL_SPAM = (1 << 12), /**< Carries action URL spam */ - ST_URN_SPAM = (1 << 11), /**< Carries spam known by URN */ + ST_G2 = (1 << 16), /**< Sent by a G2 node */ + ST_UNUSED_4 = (1 << 15), /**< UNUSED */ + ST_UNUSED_3 = (1 << 14), /**< UNUSED */ + ST_UNUSED_2 = (1 << 13), /**< UNUSED */ + ST_UNUSED_1 = (1 << 12), /**< UNUSED */ + ST_SPAM = (1 << 11), /**< Carries spam, flags in `spam' */ ST_TLS = (1 << 10), /**< Indicated support for TLS */ ST_BH = (1 << 9), /**< Browse Host support */ ST_KNOWN_VENDOR = (1 << 8), /**< Found known vendor code */ @@ -80,14 +95,7 @@ ST_GGEP = (1 << 3), /**< Trailer has a GGEP extension */ ST_UPLOADED = (1 << 2), /**< Is "stable", people downloaded */ ST_BUSY = (1 << 1), /**< Has currently no slots */ - ST_FIREWALL = (1 << 0), /**< Is behind a firewall */ - - ST_SPAM = ( ST_ALT_SPAM - |ST_DUP_SPAM - |ST_FAKE_SPAM - |ST_NAME_SPAM - |ST_URL_SPAM - |ST_URN_SPAM) + ST_FIREWALL = (1 << 0) /**< Is behind a firewall */ }; /* @@ -116,26 +124,28 @@ const char *version; /**< Version information (atom) */ const char *query; /**< Optional: Original query string (atom) */ gnet_host_vec_t *proxies; /**< Optional: known push proxies */ - GSList *records; + pslist_t *records; time_t stamp; /**< Reception time of the hit */ vendor_code_t vcode; /**< Vendor code */ - guint32 speed; - guint32 num_recs; - guint32 status; /**< Parsed status bits from trailer */ - - guint32 flags; - guint16 port; - guint16 country; /**< Country code -- encoded ISO3166 */ - guint8 hops; - guint8 ttl; - guint8 media; /**< Optional: media type filtering */ + uint32 speed; + uint32 num_recs; + uint32 status; /**< Parsed status bits from trailer */ + + uint32 flags; + uint16 port; + uint16 country; /**< Country code -- encoded ISO3166 */ + uint8 hops; + uint8 ttl; + uint8 media; /**< Optional: media type filtering */ + uint8 spam; /**< Spam flags */ } gnet_results_set_t; /* * Result record flags */ enum { + SR_ALLOC_NAME = (1 << 11), /* Set if filename was halloc()'ed */ SR_MEDIA = (1 << 10), /* Media type filter mismatch */ SR_PARTIAL_HIT = (1 << 9), /* Got a hit for a partial file */ SR_PUSH = (1 << 8), /* Servent firewalled, will need a PUSH */ @@ -150,7 +160,7 @@ }; /** - * An individual hit. It referes to a file entry on the remote servent, + * An individual hit. It refers to a file entry on the remote servent, * as identified by the parent results_set structure that contains this hit. */ typedef struct gnet_record { @@ -162,9 +172,11 @@ const char *path; /**< Optional path (atom) */ gnet_host_vec_t *alt_locs; /**< Optional: known alternate locations */ filesize_t size; /**< Size of file, in bytes */ - time_t create_time; /**< Create Time of file; zero if unknown */ - guint32 file_index; /**< Index for GET command */ - guint32 flags; + filesize_t available; /**< Available bytes, if partial file */ + time_t create_time; /**< Create Time of file; zero if unknown */ + time_t mod_time; /**< Last modification time of partial file */ + uint32 file_index; /**< Index for GET command */ + uint32 flags; } gnet_record_t; /** @@ -180,10 +192,10 @@ */ typedef void (*search_request_listener_t) ( - query_type_t, const char *query, const host_addr_t addr, guint16); + query_type_t, const char *query, const host_addr_t addr, uint16); typedef void (*search_got_results_listener_t) - (GSList *, const struct guid *, const gnet_results_set_t *); + (pslist_t *, const struct guid *, const gnet_results_set_t *); typedef void (*search_status_change_listener_t)(gnet_search_t); @@ -206,6 +218,13 @@ #define SEARCH_UNIX_TYPE 0x0080 #define SEARCH_TORRENT_TYPE 0x0100 /* Broken as deployed on 2011-05-15 */ +/** + * These additional type flags are specific to G2 and are not supported + * over Gnutella. Hence the G2 in their name to make this more obvious. + */ +#define SEARCH_G2_ROM_TYPE 0x0200 +#define SEARCH_G2_TEXT_TYPE 0x0400 + /* * Search public interface, visible only from the bridge. */ @@ -213,44 +232,40 @@ #ifdef CORE_SOURCES enum search_new_result search_new(gnet_search_t *ptr, const char *, unsigned, - time_t create_time, guint lifetime, guint32 timeout, guint32 flags); + time_t create_time, uint lifetime, uint32 timeout, uint32 flags); void search_close(gnet_search_t); void search_start(gnet_search_t); void search_stop(gnet_search_t); -/* search_is_stopped doesn't exist yet! -gboolean search_is_stopped(gnet_search_t sh); -*/ - -void search_add_kept(gnet_search_t, const struct guid *, guint32 kept); +void search_add_kept(gnet_search_t, const struct guid *, uint32 kept); const char *search_query(gnet_search_t); -gboolean search_is_active(gnet_search_t); -gboolean search_is_browse(gnet_search_t); -gboolean search_is_expired(gnet_search_t); -gboolean search_is_frozen(gnet_search_t); -gboolean search_is_local(gnet_search_t); -gboolean search_is_passive(gnet_search_t); -gboolean search_is_whats_new(gnet_search_t sh); - -void search_set_reissue_timeout(gnet_search_t, guint32 timeout); -guint32 search_get_reissue_timeout(gnet_search_t); -guint search_get_lifetime(gnet_search_t); +bool search_is_active(gnet_search_t); +bool search_is_browse(gnet_search_t); +bool search_is_expired(gnet_search_t); +bool search_is_frozen(gnet_search_t); +bool search_is_local(gnet_search_t); +bool search_is_passive(gnet_search_t); +bool search_is_whats_new(gnet_search_t sh); + +void search_set_reissue_timeout(gnet_search_t, uint32 timeout); +uint32 search_get_reissue_timeout(gnet_search_t); +uint search_get_lifetime(gnet_search_t); time_t search_get_create_time(gnet_search_t); void search_set_create_time(gnet_search_t, time_t); unsigned search_get_media_type(gnet_search_t); void search_free_alt_locs(gnet_record_t *); -void search_update_items(gnet_search_t, guint32 items); +void search_update_items(gnet_search_t, uint32 items); -gboolean search_browse(gnet_search_t, - const char *hostname, host_addr_t addr, guint16 port, - const struct guid *guid, const gnet_host_vec_t *proxies, guint32 flags); -gboolean search_locally(gnet_search_t sh, const char *query); -guint search_handle_magnet(const char *url); +bool search_browse(gnet_search_t, + const char *hostname, host_addr_t addr, uint16 port, + const struct guid *guid, const gnet_host_vec_t *proxies, uint32 flags); +bool search_locally(gnet_search_t sh, const char *query); +uint search_handle_magnet(const char *url); void search_got_results_listener_add(search_got_results_listener_t); void search_got_results_listener_remove(search_got_results_listener_t); @@ -263,7 +278,7 @@ void search_associate_sha1(gnet_search_t sh, const struct sha1 *sha1); void search_dissociate_sha1(const struct sha1 *sha1); -GSList *search_associated_sha1(gnet_search_t sh); +pslist_t *search_associated_sha1(gnet_search_t sh); unsigned search_associated_sha1_count(gnet_search_t sh); const char *search_media_mask_to_string(unsigned mask);
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/core/share.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/core/share.h
Changed
@@ -34,8 +34,8 @@ void shared_dir_add(const char *); void share_scan(void); -guint64 shared_files_scanned(void); -guint64 shared_kbytes_scanned(void); +uint64 shared_files_scanned(void); +uint64 shared_kbytes_scanned(void); #endif /* CORE_SOURCES */ #endif /* _if_core_share_h */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/core/sockets.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/core/sockets.h
Changed
@@ -72,7 +72,9 @@ SOCK_F_OMIT_TOKEN = (1UL << 8), /**< If set X-Token header is omitted */ SOCK_F_PREPARED = (1UL << 9), /**< Prepared (known address) */ SOCK_F_SINGLE = (1UL << 10), /**< Read one single datagram */ - SOCK_F_CONNRESET = (1UL << 11), /**< Got an connection reset event */ + SOCK_F_CONNRESET = (1UL << 11), /**< Got a connection reset event */ + SOCK_F_OLD = (1UL << 12), /**< Processing an "old" UDP datagram */ + SOCK_F_G2 = (1UL << 13), /**< Targeting a G2 node */ SOCK_F_LOCAL = (1UL << 28), /**< Is a local socket */ SOCK_F_UDP = (1UL << 29), /**< Is a UDP socket */ SOCK_F_TCP = (1UL << 30) /**< Is a TCP socket */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/core/uploads.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/core/uploads.h
Changed
@@ -27,7 +27,7 @@ #include "common.h" #include "lib/host_addr.h" -typedef guint32 gnet_upload_t; +typedef uint32 gnet_upload_t; /** * Upload states. @@ -50,20 +50,20 @@ typedef struct gnet_upload_status { upload_stage_t status; - filesize_t pos; /**< Read position in file we're sending */ - guint32 bps; /**< Current transfer rate */ - guint32 avg_bps; /**< Average transfer rate */ - time_t last_update; - guint reqnum; /**< Count of uploaded chunks */ - guint error_count; /**< Number of errors */ - - gboolean parq_quick; - gboolean parq_frozen; - guint parq_position; - guint parq_size; - guint32 parq_lifetime; - guint32 parq_retry; - guint parq_queue_no; + filesize_t pos; /**< Read position in file we're sending */ + uint32 bps; /**< Current transfer rate */ + uint32 avg_bps; /**< Average transfer rate */ + time_t last_update; + uint reqnum; /**< Count of uploaded chunks */ + uint error_count; /**< Number of errors */ + + bool parq_quick; + bool parq_frozen; + uint parq_position; + uint parq_size; + uint32 parq_lifetime; + uint32 parq_retry; + uint parq_queue_no; } gnet_upload_status_t; typedef struct gnet_upload_info { @@ -82,12 +82,13 @@ time_t start_date; time_t last_update; - gboolean push; /**< Whether we're pushing or not */ - gboolean partial; /**< Whether it's a partial file */ - gboolean encrypted; /**< Whether the connection is (TLS) encrypted */ - - guint16 gnet_port; /**< Advertised Gnutella listening port */ - guint16 country; /**< Contry of origin */ + bool push; /**< Whether we're pushing or not */ + bool partial; /**< Whether it's a partial file */ + bool encrypted; /**< Whether the connection is (TLS) encrypted */ + bool tls_upgraded; /**< Whether a TLS upgrade was requested */ + + uint16 gnet_port; /**< Advertised Gnutella listening port */ + uint16 country; /**< Contry of origin */ } gnet_upload_info_t; /* @@ -121,11 +122,11 @@ const char *pathname; /**< Atom, (from sf->pathname) */ const char *filename; /**< Atom, UTF-8 (from sf->name_nfc) */ filesize_t size; - guint32 attempts; - guint32 complete; + uint32 attempts; + uint32 complete; time_t rtime; /**< time of last request */ time_t dtime; /**< time of last downloaded bytes */ - guint64 bytes_sent; + uint64 bytes_sent; double norm; /**< bytes sent / file size */ const struct sha1 *sha1; /**< SHA1 of file (atom), if known, or NULL */ void *user_data; /**< Used by the GUI side to store context */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/core/version.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/core/version.h
Changed
@@ -30,7 +30,7 @@ #ifdef CORE_SOURCES -const char *version_get_string(void) G_GNUC_PURE; +const char *version_get_string(void) G_PURE; #endif /* CORE_SOURCES */ #endif /* _if_core_version_h */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/core/wrap.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/core/wrap.h
Changed
@@ -38,19 +38,29 @@ #include "lib/gnet_host.h" +enum wrap_io_magic { WRAP_IO_MAGIC = 0x40b20646 }; + typedef struct wrap_io { - gpointer ctx; - ssize_t (*write)(struct wrap_io *, gconstpointer, size_t); - ssize_t (*read)(struct wrap_io *, gpointer, size_t); + enum wrap_io_magic magic; + void *ctx; + ssize_t (*write)(struct wrap_io *, const void *, size_t); + ssize_t (*read)(struct wrap_io *, void *, size_t); ssize_t (*writev)(struct wrap_io *, const iovec_t *, int); ssize_t (*readv)(struct wrap_io *, iovec_t *, int); ssize_t (*sendto)(struct wrap_io *, const gnet_host_t *, - gconstpointer, size_t); + const void *, size_t); int (*flush)(struct wrap_io *); int (*fd)(struct wrap_io *); unsigned (*bufsize)(struct wrap_io *, enum socket_buftype); } wrap_io_t; +static inline void +wrap_io_check(const struct wrap_io * const wio) +{ + g_assert(wio != NULL); + g_assert(WRAP_IO_MAGIC == wio->magic); +} + typedef struct wrap_buf { size_t pos; /**< Current position in the buffer. */ size_t len; /**< Amount of currently buffered bytes. */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/dht/dht.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/dht/dht.h
Changed
@@ -36,8 +36,8 @@ struct gnutella_node; void dht_init(void); -void dht_close(gboolean exiting); -void dht_initialize(gboolean post_init); +void dht_close(bool exiting); +void dht_initialize(bool post_init); void dht_reset_kuid(void); void dht_ipp_extract( const struct gnutella_node *n, @@ -45,22 +45,28 @@ int dht_fill_random(gnet_host_t *hvec, int hcnt); void dht_route_store_if_dirty(void); -void dht_bootstrap_if_needed(host_addr_t addr, guint16 port); +void dht_bootstrap_if_needed(host_addr_t addr, uint16 port); void dht_attempt_bootstrap(void); void dht_update_size_estimate(void); -gboolean dht_is_active(void); +bool dht_is_active(void); /** * Is the DHT enabled? */ -static inline gboolean +static inline bool dht_enabled(void) { return GNET_PROPERTY(enable_udp) && GNET_PROPERTY(enable_dht) && GNET_PROPERTY(listen_port) != 0; } +/* + * Debugging interface. + */ + +void tcache_debugging_changed(void); + #endif /* _if_dht_dht_h */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/dht/kademlia.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/dht/kademlia.h
Changed
@@ -84,9 +84,26 @@ #define KDA_HEADER_SIZE 61 #define KDA_IPv4_CONTACT_SIZE 33 +#define KDA_CONTACT_OFFSET 24 /* In Kademlia header */ -typedef guint8 kademlia_header_tKDA_HEADER_SIZE; -typedef guint8 kademlia_ipv4_contact_tKDA_IPv4_CONTACT_SIZE; +#define KDA_GTA_HEADER_SIZE 23 /* Gnutella header size */ +#define KDA_KUID_SIZE 20 + +typedef uint8 kademlia_header_tKDA_HEADER_SIZE; +typedef uint8 kademlia_ipv4_contact_tKDA_IPv4_CONTACT_SIZE; + +static inline kademlia_ipv4_contact_t * +kademlia_contact(const void *header) +{ + return ptr_add_offset(deconstify_pointer(header), KDA_CONTACT_OFFSET); +} + +static inline const kademlia_ipv4_contact_t * +kademlia_contact_const(const void *header) +{ + return (const kademlia_ipv4_contact_t *) + const_ptr_add_offset(header, KDA_CONTACT_OFFSET); +} /*** *** IPv4 Contact. @@ -96,17 +113,18 @@ * Bytes 0-3: Vendor code. (not specified but assuming big-endian) */ -static inline guint32 -kademlia_ipv4_contact_get_vendor(const void *contact) +static inline uint32 +kademlia_ipv4_contact_get_vendor(const kademlia_ipv4_contact_t *contact) { - const guint8 *u8 = (void *) contact; + const uint8 *u8 = (const uint8 *) contact; return peek_be32(&u80); } static inline void -kademlia_ipv4_contact_set_vendor(const void *contact, guint32 vendor) +kademlia_ipv4_contact_set_vendor(kademlia_ipv4_contact_t *contact, + uint32 vendor) { - guint8 *u8 = (void *) contact; + uint8 *u8 = (uint8 *) contact; poke_be32(&u80, vendor); } @@ -114,17 +132,18 @@ * Byte 4: the major version of the contact */ -static inline guint8 -kademlia_ipv4_contact_get_major_version(const void *contact) +static inline uint8 +kademlia_ipv4_contact_get_major_version(const kademlia_ipv4_contact_t *contact) { - guint8 *u8 = (void *) contact; + const uint8 *u8 = (const uint8 *) contact; return u84; } static inline void -kademlia_ipv4_contact_set_major_version(const void *contact, guint8 major) +kademlia_ipv4_contact_set_major_version(kademlia_ipv4_contact_t *contact, + uint8 major) { - guint8 *u8 = (void *) contact; + uint8 *u8 = (uint8 *) contact; u84 = major; } @@ -132,17 +151,18 @@ * Byte 5: the minor version of the contact. */ -static inline guint8 -kademlia_ipv4_contact_get_minor_version(const void *contact) +static inline uint8 +kademlia_ipv4_contact_get_minor_version(const kademlia_ipv4_contact_t *contact) { - guint8 *u8 = (void *) contact; + const uint8 *u8 = (const uint8 *) contact; return u85; } static inline void -kademlia_ipv4_contact_set_minor_version(const void *contact, guint8 minor) +kademlia_ipv4_contact_set_minor_version(kademlia_ipv4_contact_t *contact, + uint8 minor) { - guint8 *u8 = (void *) contact; + uint8 *u8 = (uint8 *) contact; u85 = minor; } @@ -151,17 +171,18 @@ */ static inline const char * -kademlia_ipv4_contact_get_kuid(const void *contact) +kademlia_ipv4_contact_get_kuid(const kademlia_ipv4_contact_t *contact) { - guint8 *u8 = (void *) contact; + const uint8 *u8 = (const uint8 *) contact; return (const char *) &u86; } static inline void -kademlia_ipv4_contact_set_kuid(void *contact, const guchar *kuid) +kademlia_ipv4_contact_set_kuid(kademlia_ipv4_contact_t *contact, + const uchar *kuid) { - guint8 *u8 = (void *) contact; - memcpy(&u86, kuid, 20); + uint8 *u8 = (uint8 *) contact; + memcpy(&u86, kuid, KDA_KUID_SIZE); } /* @@ -170,32 +191,32 @@ * Byte 31-32: port number (assumed little-endian) */ -static inline guint8 -kademlia_ipv4_contact_get_addr_length(const void *contact) +static inline uint8 +kademlia_ipv4_contact_get_addr_length(const kademlia_ipv4_contact_t *contact) { - const guint8 *u8 = contact; + const uint8 *u8 = (const uint8 *) contact; return u826; } -static inline guint32 -kademlia_ipv4_contact_get_addr(const void *contact) +static inline uint32 +kademlia_ipv4_contact_get_addr(const kademlia_ipv4_contact_t *contact) { - const guint8 *u8 = contact; + const uint8 *u8 = (const uint8 *) contact; return peek_be32(&u827); } -static inline guint16 -kademlia_ipv4_contact_get_port(const void *contact) +static inline uint16 +kademlia_ipv4_contact_get_port(const kademlia_ipv4_contact_t *contact) { - const guint8 *u8 = contact; + const uint8 *u8 = (const uint8 *) contact; return peek_be16(&u831); /* Ports are big-endian in Kademlia */ } static inline void -kademlia_ipv4_contact_set_addr_port( - void *contact, guint32 addr, guint16 port) +kademlia_ipv4_contact_set_addr_port(kademlia_ipv4_contact_t *contact, + uint32 addr, uint16 port) { - guint8 *u8 = contact; + uint8 *u8 = (uint8 *) contact; u826 = 4; poke_be32(&u827, addr); poke_be16(&u831, port); /* Watch out: standard, unlike Gnutella... */ @@ -228,205 +249,158 @@ */ static inline void -kademlia_header_set_dht(kademlia_header_t *header, guint8 major, guint8 minor) +kademlia_header_set_dht(kademlia_header_t *header, uint8 major, uint8 minor) { - guint8 *u8 = (void *) header; + uint8 *u8 = (void *) header; u816 = 0x44; u817 = major; u818 = minor; } -static inline guint8 +static inline uint8 kademlia_header_get_major_version(const void *header) { - const guint8 *u8 = header; + const uint8 *u8 = header; return u817; } -static inline guint8 +static inline uint8 kademlia_header_get_minor_version(const void *header) { - const guint8 *u8 = header; + const uint8 *u8 = header; return u818; } /* - * Bytes 19-22: length of the whole payload, viewed as a Gnutella message. - * Stored in little endian. - */ - -static inline guint32 -kademlia_header_get_gnutella_size(const void *data) -{ - const guint8 *u8 = data; - return peek_le32(&u819); -} - -static inline void -kademlia_header_set_gnutella_size(const void *header, guint32 size) -{ - guint8 *u8 = (void *) header; - poke_le32(&u819, size); -} - -/* * Bytes 19-22 interpreted externally as the payload length of a Kademlia * message with its header of 61 bytes. */ -static inline guint32 +static inline uint32 kademlia_header_get_size(const void *data) { - const guint8 *u8 = data; - return peek_le32(&u819) + 23 - KDA_HEADER_SIZE; + const uint8 *u8 = data; + return peek_le32(&u819) + KDA_GTA_HEADER_SIZE - KDA_HEADER_SIZE; } static inline void -kademlia_header_set_size(void *header, guint32 size) +kademlia_header_set_size(void *header, uint32 size) { - guint8 *u8 = (void *) header; - poke_le32(&u819, size + KDA_HEADER_SIZE - 23); + uint8 *u8 = (void *) header; + poke_le32(&u819, size + KDA_HEADER_SIZE - KDA_GTA_HEADER_SIZE); } /* * Byte 23: the Kademlia message function. */ -static inline guint8 +static inline uint8 kademlia_header_get_function(const void *header) { - const guint8 *u8 = header; + const uint8 *u8 = header; return u823; } static inline void -kademlia_header_set_function(kademlia_header_t *header, guint8 function) +kademlia_header_set_function(kademlia_header_t *header, uint8 function) { - guint8 *u8 = (void *) header; + uint8 *u8 = (void *) header; u823 = function; } /* * Bytes 24-56: Contact, the node that created the message, with its address - * architected to an IPv4 one. + * architected as an IPv4 one. */ -static inline guint32 +static inline uint32 kademlia_header_get_contact_vendor(const void *header) { - const guint8 *u8 = header; - return kademlia_ipv4_contact_get_vendor(&u824); + const kademlia_ipv4_contact_t *contact = kademlia_contact_const(header); + return kademlia_ipv4_contact_get_vendor(contact); } static inline void -kademlia_header_set_contact_vendor(kademlia_header_t *header, guint32 vendor) +kademlia_header_set_contact_vendor(kademlia_header_t *header, uint32 vendor) { - guint8 *u8 = (void *) header; - kademlia_ipv4_contact_set_vendor(&u824, vendor); + kademlia_ipv4_contact_t *contact = kademlia_contact(header); + kademlia_ipv4_contact_set_vendor(contact, vendor); } -static inline guint8 +static inline uint8 kademlia_header_get_contact_major_version(const kademlia_header_t *header) { - const guint8 *u8 = (void *) header; - return kademlia_ipv4_contact_get_major_version(&u824); + const kademlia_ipv4_contact_t *contact = kademlia_contact_const(header); + return kademlia_ipv4_contact_get_major_version(contact); } -static inline guint8 +static inline uint8 kademlia_header_get_contact_minor_version(const kademlia_header_t *header) { - const guint8 *u8 = (void *) header; - return kademlia_ipv4_contact_get_minor_version(&u824); + const kademlia_ipv4_contact_t *contact = kademlia_contact_const(header); + return kademlia_ipv4_contact_get_minor_version(contact); } static inline void kademlia_header_set_contact_version(kademlia_header_t *header, - guint8 major, guint8 minor) -{ - const guint8 *u8 = (void *) header; - kademlia_ipv4_contact_set_major_version(&u824, major); - kademlia_ipv4_contact_set_minor_version(&u824, minor); -} - -static inline void -kademlia_header_set_contact_major_version(void *header, guint8 major) -{ - const guint8 *u8 = (void *) header; - kademlia_ipv4_contact_set_major_version(&u824, major); -} - -static inline guint8 -kademlia_header_get_contact_version(const kademlia_header_t *header) + uint8 major, uint8 minor) { - const guint8 *u8 = (void *) header; - return kademlia_ipv4_contact_get_minor_version(&u824); -} - -static inline void -kademlia_header_set_contact_minor_version(void *header, guint8 minor) -{ - const guint8 *u8 = (void *) header; - kademlia_ipv4_contact_set_minor_version(&u824, minor); + kademlia_ipv4_contact_t *contact = kademlia_contact(header); + kademlia_ipv4_contact_set_major_version(contact, major); + kademlia_ipv4_contact_set_minor_version(contact, minor); } static inline const char * kademlia_header_get_contact_kuid(const void *header) { - guint8 *u8 = (void *) header; - return kademlia_ipv4_contact_get_kuid(&u824); + const kademlia_ipv4_contact_t *contact = kademlia_contact_const(header); + return kademlia_ipv4_contact_get_kuid(contact); } static inline void -kademlia_header_set_contact_kuid(void *header, const guchar *kuid) +kademlia_header_set_contact_kuid(void *header, const uchar *kuid) { - guint8 *u8 = (void *) header; - kademlia_ipv4_contact_set_kuid(&u824, kuid); + kademlia_ipv4_contact_t *contact = kademlia_contact(header); + kademlia_ipv4_contact_set_kuid(contact, kuid); } -static inline void * -kademlia_header_contact_kuid_pointer(void *header) -{ - guint8 *u8 = (void *) header; - return &u824; -} - -static inline guint32 +static inline uint32 kademlia_header_get_contact_addr(const void *header) { - guint8 *u8 = (void *) header; - return kademlia_ipv4_contact_get_addr(&u824); + const kademlia_ipv4_contact_t *contact = kademlia_contact_const(header); + return kademlia_ipv4_contact_get_addr(contact); } -static inline guint16 +static inline uint16 kademlia_header_get_contact_port(const void *header) { - guint8 *u8 = (void *) header; - return kademlia_ipv4_contact_get_port(&u824); + const kademlia_ipv4_contact_t *contact = kademlia_contact_const(header); + return kademlia_ipv4_contact_get_port(contact); } static inline void kademlia_header_set_contact_addr_port( - const void *header, guint32 addr, guint16 port) + const void *header, uint32 addr, uint16 port) { - guint8 *u8 = (void *) header; - kademlia_ipv4_contact_set_addr_port(&u824, addr, port); + kademlia_ipv4_contact_t *contact = kademlia_contact(header); + kademlia_ipv4_contact_set_addr_port(contact, addr, port); } /* * Byte 57: contact's instance ID. (what is that?) */ -static inline guint8 +static inline uint8 kademlia_header_get_contact_instance(const kademlia_header_t *header) { - guint8 *u8 = (void *) header; + uint8 *u8 = (void *) header; return u857; } static inline void -kademlia_header_set_contact_instance(kademlia_header_t *header, guint8 instance) +kademlia_header_set_contact_instance(kademlia_header_t *header, uint8 instance) { - guint8 *u8 = (void *) header; + uint8 *u8 = (void *) header; u857 = instance; } @@ -434,17 +408,17 @@ * Byte 58: various flags about the contact (the sender of the message). */ -static inline guint8 +static inline uint8 kademlia_header_get_contact_flags(const kademlia_header_t *header) { - guint8 *u8 = (void *) header; + uint8 *u8 = (void *) header; return u858; } static inline void -kademlia_header_set_contact_flags(kademlia_header_t *header, guint8 flags) +kademlia_header_set_contact_flags(kademlia_header_t *header, uint8 flags) { - guint8 *u8 = (void *) header; + uint8 *u8 = (void *) header; u858 = flags; } @@ -452,17 +426,17 @@ * Bytes 59-60: length of option extended header (assuming big-endian) */ -static inline guint16 +static inline uint16 kademlia_header_get_extended_length(const void *header) { - const guint8 *u8 = header; + const uint8 *u8 = header; return peek_be16(&u859); } static inline void -kademlia_header_set_extended_length(kademlia_header_t *header, guint16 len) +kademlia_header_set_extended_length(kademlia_header_t *header, uint16 len) { - guint8 *u8 = (void *) header; + uint8 *u8 = (void *) header; poke_be16(&u859, len); } @@ -472,13 +446,15 @@ * The length of the IP address of the contact is always 4. */ -static inline gboolean -kademlia_header_constants_ok(void *header) +static inline bool +kademlia_header_constants_ok(const void *header) { - const guint8 *u8 = header; + const uint8 *u8 = header; + const kademlia_ipv4_contact_t *contact = kademlia_contact_const(header); + return - 0x44 == u816 && - 4 == kademlia_ipv4_contact_get_addr_length(&u824); + 0x44 == u816 && + 4 == kademlia_ipv4_contact_get_addr_length(contact); } /** @@ -487,7 +463,7 @@ static inline const void * kademlia_header_end(const void *header) { - const guint8 *u8 = header; + const uint8 *u8 = header; return &u8KDA_HEADER_SIZE; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/dht/kmsg.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/dht/kmsg.h
Changed
@@ -33,14 +33,14 @@ struct gnutella_node; -void kmsg_received(gconstpointer data, size_t len, - host_addr_t addr, guint16 port, +void kmsg_received(const void *data, size_t len, + host_addr_t addr, uint16 port, struct gnutella_node *n); -gboolean kmsg_can_drop(gconstpointer pdu, int size); +bool kmsg_can_drop(const void *pdu, int size); -const char *kmsg_infostr(gconstpointer msg); -const char *kmsg_name(guint function); -size_t kmsg_infostr_to_buf(gconstpointer msg, char *buf, size_t buf_size); +const char *kmsg_infostr(const void *msg); +const char *kmsg_name(uint function); +size_t kmsg_infostr_to_buf(const void *msg, char *buf, size_t buf_size); /* * Inlined routines. @@ -49,8 +49,8 @@ /** * Returns the size (16-bit quantity) of a Kademlia payload. */ -static inline guint16 -kmsg_size(gconstpointer msg) +static inline uint16 +kmsg_size(const void *msg) { return kademlia_header_get_size(msg) - kademlia_header_get_extended_length(msg);
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/dht/knode.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/dht/knode.h
Changed
@@ -29,7 +29,7 @@ #include "kuid.h" #include "lib/vendors.h" #include "lib/host_addr.h" -#include "lib/unsigned.h" /* For guint8_saturate_add() */ +#include "lib/unsigned.h" /* For uint8_saturate_add() */ struct kbucket; @@ -56,15 +56,15 @@ time_t last_seen; /**< Last seen message from that node */ time_t last_sent; /**< Last sent RPC to that node */ vendor_code_t vcode; /**< Vendor code (vcode.u32 == 0 if unknown) */ - guint32 rtt; /**< Round-trip time in milliseconds */ - guint32 flags; /**< Operating flags */ + uint32 rtt; /**< Round-trip time in milliseconds */ + uint32 flags; /**< Operating flags */ host_addr_t addr; /**< IP of the node */ knode_status_t status; /**< Node status (good, stale, pending) */ - guint16 port; /**< Port of the node */ - guint8 rpc_pending; /**< Amount of pending RPCs (may saturate) */ - guint8 rpc_timeouts; /**< Amount of consecutive RPC timeouts */ - guint8 major; /**< Major version */ - guint8 minor; /**< Minor version */ + uint16 port; /**< Port of the node */ + uint8 rpc_pending; /**< Amount of pending RPCs (may saturate) */ + uint8 rpc_timeouts; /**< Amount of consecutive RPC timeouts */ + uint8 major; /**< Major version */ + uint8 minor; /**< Minor version */ } knode_t; /** @@ -78,17 +78,18 @@ #define KNODE_F_SHUTDOWNING (1 << 4) /**< Host said it was shutdowning */ #define KNODE_F_PCONTACT (1 << 5) /**< Patched contact address */ #define KNODE_F_CACHED (1 << 6) /**< Node comes from root cache */ +#define KNODE_F_RPC (1 << 7) /**< Performed successful RPC */ knode_t *get_our_knode(void); void knode_free(knode_t *kn); -void knode_patricia_free(gpointer, size_t, gpointer, gpointer); -void knode_map_free(gpointer, gpointer, gpointer); +void knode_patricia_free(void *, size_t, void *, void *); +void knode_map_free(void *, void *, void *); -unsigned int knode_hash(gconstpointer key); -int knode_eq(gconstpointer a, gconstpointer b); -int knode_seen_cmp(gconstpointer a, gconstpointer b); -int knode_dead_probability_cmp(gconstpointer a, gconstpointer b); +unsigned int knode_hash(const void *key); +int knode_eq(const void *a, const void *b); +int knode_seen_cmp(const void *a, const void *b); +int knode_dead_probability_cmp(const void *a, const void *b); const char * knode_status_to_string(knode_status_t status); const char *knode_to_string(const knode_t *kn); const char *knode_to_string2(const knode_t *kn); @@ -119,7 +120,7 @@ static inline knode_t * knode_refcnt_inc(const knode_t *kn) { - knode_t *knm = deconstify_gpointer(kn); + knode_t *knm = deconstify_pointer(kn); knode_check(kn); @@ -135,7 +136,7 @@ static inline knode_t * knode_refcnt_dec(const knode_t *kn) { - knode_t *knm = deconstify_gpointer(kn); + knode_t *knm = deconstify_pointer(kn); knode_check(kn); g_assert(kn->refcnt > 1); @@ -149,8 +150,8 @@ * * @param no_routing_table if TRUE, do not count the routing table */ -static inline gboolean -knode_is_shared(const knode_t *kn, gboolean no_routing_table) +static inline bool +knode_is_shared(const knode_t *kn, bool no_routing_table) { int refcnt; @@ -182,7 +183,7 @@ * and there's no harm done. */ - kn->rpc_pending = guint8_saturate_add(kn->rpc_pending, 1); + kn->rpc_pending = uint8_saturate_add(kn->rpc_pending, 1); } /** @@ -203,7 +204,7 @@ /** * Are there any RPC pending for this node? */ -static inline gboolean +static inline bool knode_rpc_pending(knode_t *kn) { return booleanize(kn->rpc_pending);
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/dht/kuid.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/dht/kuid.h
Changed
@@ -32,7 +32,7 @@ #define KUID_HEX_BUFLEN (KUID_HEX_SIZE + 1) typedef struct kuid { - guchar vKUID_RAW_SIZE; + uchar vKUID_RAW_SIZE; } kuid_t; /** @@ -49,7 +49,7 @@ */ unsigned kuid_hash(const void *key); -gboolean kuid_eq(const void *k1, const void *k2); +bool kuid_eq(const void *k1, const void *k2); const char *kuid_to_string(const kuid_t *kuid); const char *kuid_to_hex_string(const kuid_t *kuid);
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/dht/lookup.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/dht/lookup.h
Changed
@@ -60,13 +60,13 @@ * Value lookup result record. */ typedef struct lookup_value_rc { - gconstpointer data; /**< The data payload */ + const void *data; /**< The data payload */ size_t length; /**< Length of value, in bytes */ host_addr_t addr; /**< Address of creator */ dht_value_type_t type; /**< Type of value */ - guint16 port; /**< Port of creator */ - guint8 major; /**< Major version of value */ - guint8 minor; /**< Minor version of value */ + uint16 port; /**< Port of creator */ + uint8 major; /**< Major version of value */ + uint8 minor; /**< Minor version of value */ vendor_code_t vcode; /**< Vendor code of creator (informative) */ } lookup_val_rc_t; @@ -87,7 +87,7 @@ * @param arg additional callback opaque argument */ typedef void (*lookup_cbv_ok_t)( - const kuid_t *kuid, const lookup_val_rs_t *rs, gpointer arg); + const kuid_t *kuid, const lookup_val_rs_t *rs, void *arg); /** * Lookup callback invoked on error (both for value lookups and node lookups). @@ -97,7 +97,7 @@ * @param arg additional callback opaque argument */ typedef void (*lookup_cb_err_t)( - const kuid_t *kuid, lookup_error_t error, gpointer arg); + const kuid_t *kuid, lookup_error_t error, void *arg); /** * Lookup callback invoked on dequeuing (notifies item is being processed). @@ -107,7 +107,7 @@ * * @return TRUE if OK, FALSE if lookup must be aborted. */ -typedef gboolean (*lookup_cb_start_t)( const kuid_t *kuid, gpointer arg); +typedef bool (*lookup_cb_start_t)( const kuid_t *kuid, void *arg); typedef struct lookup_result lookup_rs_t; @@ -119,7 +119,7 @@ * @param arg additional callback opaque argument */ typedef void (*lookup_cb_ok_t)( - const kuid_t *kuid, const lookup_rs_t *rs, gpointer arg); + const kuid_t *kuid, const lookup_rs_t *rs, void *arg); /* * Public interface. @@ -131,8 +131,8 @@ void lookup_result_free(const lookup_rs_t *rs); const char *lookup_strerror(lookup_error_t error); -void ulq_find_store_roots(const kuid_t *kuid, gboolean prioritary, - lookup_cb_ok_t ok, lookup_cb_err_t error, gpointer arg); +void ulq_find_store_roots(const kuid_t *kuid, bool prioritary, + lookup_cb_ok_t ok, lookup_cb_err_t error, void *arg); /* * User value lookups. @@ -141,11 +141,11 @@ void ulq_find_value(const kuid_t *kuid, dht_value_type_t type, lookup_cbv_ok_t ok, lookup_cb_start_t start, lookup_cb_err_t error, - gpointer arg); + void *arg); void ulq_find_any_value(const kuid_t *kuid, dht_value_type_t queue_type, - lookup_cbv_ok_t ok, lookup_cb_err_t error, gpointer arg); + lookup_cbv_ok_t ok, lookup_cb_err_t error, void *arg); #endif /* _if_dht_lookup_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/dht/publish.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/dht/publish.h
Changed
@@ -60,7 +60,7 @@ */ typedef struct publish_info { const lookup_rs_t *rs; /**< The set of STORE roots used */ - const guint16 *status; /**< Array of STORE status per node in path */ + const uint16 *status; /**< Array of STORE status per node in path */ unsigned published; /**< # of nodes where publishing was done */ unsigned candidates; /**< # of nodes where STORE was possible */ } publish_info_t; @@ -72,7 +72,7 @@ * @param code status code for publish operation * @param info publishing information */ -typedef void (*publish_cb_t)(gpointer arg, +typedef void (*publish_cb_t)(void *arg, publish_error_t code, const publish_info_t *info); /* @@ -80,13 +80,13 @@ */ const char *publish_strerror(publish_error_t error); -void publish_cancel(publish_t *pb, gboolean callback); +void publish_cancel(publish_t *pb, bool callback); publish_t *publish_value(dht_value_t *value, const lookup_rs_t *rs, - publish_cb_t cb, gpointer arg); + publish_cb_t cb, void *arg); publish_t *publish_value_background(dht_value_t *value, - const lookup_rs_t *rs, const guint16 *status, - publish_cb_t cb, gpointer arg); + const lookup_rs_t *rs, const uint16 *status, + publish_cb_t cb, void *arg); #endif /* _if_dht_publish_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/dht/routing.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/dht/routing.h
Changed
@@ -52,8 +52,8 @@ */ const char *dht_mode_to_string(dht_mode_t mode); -gboolean dht_seeded(void); -gboolean dht_bootstrapped(void); +bool dht_seeded(void); +bool dht_bootstrapped(void); void dht_configured_mode_changed(dht_mode_t mode); #endif /* _if_dht_routing_h */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/dht/stable.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/dht/stable.h
Changed
@@ -42,7 +42,7 @@ */ double stable_store_presence(time_delta_t d, - const lookup_rs_t *rs, const guint16 *status); + const lookup_rs_t *rs, const uint16 *status); #endif /* _if_dht_stable_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/dht/value.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/dht/value.h
Changed
@@ -121,24 +121,24 @@ const kuid_t *dht_value_key(const dht_value_t *v); const knode_t *dht_value_creator(const dht_value_t *v); -guint16 dht_value_length(const dht_value_t *v); +uint16 dht_value_length(const dht_value_t *v); dht_value_type_t dht_value_type(const dht_value_t *v); -const char *dht_store_error_to_string(guint16 errnum); +const char *dht_store_error_to_string(uint16 errnum); dht_value_t *dht_value_make(const knode_t *creator, const kuid_t *primary_key, dht_value_type_t type, - guint8 major, guint8 minor, gpointer data, guint16 length); + uint8 major, uint8 minor, void *data, uint16 length); dht_value_t *dht_value_clone(const dht_value_t *v); -void dht_value_free(dht_value_t *v, gboolean free_data); -size_t dht_value_type_to_string_buf(guint32 type, char *buf, size_t size); +void dht_value_free(dht_value_t *v, bool free_data); +size_t dht_value_type_to_string_buf(uint32 type, char *buf, size_t size); time_delta_t dht_value_lifetime(dht_value_type_t type); -const char *dht_value_type_to_string(guint32 type); -const char *dht_value_type_to_string2(guint32 type); +const char *dht_value_type_to_string(uint32 type); +const char *dht_value_type_to_string2(uint32 type); const char *dht_value_to_string(const dht_value_t *v); unsigned dht_value_hash(const void *key); -gboolean dht_value_eq(const void *v1, const void *v2); +bool dht_value_eq(const void *v1, const void *v2); void dht_value_dump(FILE *out, const dht_value_t *v); #endif /* _if_dht_value_h */
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen
Added
+(directory)
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/Jmakefile
Added
@@ -0,0 +1,56 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + * Jmakefile for interface generated sources. + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/* + * We use "perl ..." in the command below to let the script run even though + * it could be edited -- this avoid the "Text file busy" check in the kernel + * which would happen if we had let the "#!" hook run perl. + * + * The regenerate target forces re-generation of all the files when the script + * generating them is updated in a way that alters the generated code fragments. + */ +#define EnumGenerate(list, base) @!\ +base.c base.h: list @@\ + -perl $(TOP)/scripts/enum-msg.pl list @@\ + touch base.c base.h @!\ + @!\ +all:: base.c base.h @!\ + @!\ +regenerate:: @@\ + $(RM) -f base.c base.h @@\ + $(MAKE) base.c base.h @!\ + +EnumGenerate(dmesh_url.lst, dmesh_url) +EnumGenerate(drop.lst, msg_drop) +EnumGenerate(ignore.lst, ignore) +EnumGenerate(iprange.lst, iprange) +EnumGenerate(stats.lst, gnr_stats) +EnumGenerate(msg.lst, msg) +EnumGenerate(http_async.lst, http_async) +EnumGenerate(http_url.lst, http_url) +EnumGenerate(vxml.lst, vxml) + +DependTarget() +
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/Makefile.SH
Added
@@ -0,0 +1,262 @@ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ + +case $CONFIG in +'') + if test -f config.sh; then TOP=.; + elif test -f ../config.sh; then TOP=..; + elif test -f ../../config.sh; then TOP=../..; + elif test -f ../../../config.sh; then TOP=../../..; + elif test -f ../../../../config.sh; then TOP=../../../..; + else + echo "Can't find config.sh."; exit 1 + fi + . $TOP/config.sh + ;; +esac +case "$0" in +*/*) cd `expr X$0 : 'X\(.*\)/'` ;; +esac +CURRENT=src/if/gen +DIR=`echo $CURRENT/ | sed -e 's/\.\///g'` +echo "Extracting ${DIR}Makefile (with variable substitutions)" + +DATE=`date` + +$spitshell >Makefile <<!GROK!THIS! +######################################################################## +# Makefile generated from Makefile.SH on $DATE + +SHELL = /bin/sh +JMAKE = jmake +TOP = ../../.. +CURRENT = $CURRENT +DIR = $DIR + +######################################################################## +# Parameters set by Configure -- edit config.sh if changes are needed + +CTAGS = ctags +JCPPFLAGS = $cppflags +MKDEP = $mkdep \$(DPFLAGS) \$(JCPPFLAGS) -- +MV = $mv +RM = $rm -f +SED = $sed + +######################################################################## +# Automatically generated parameters -- do not edit + +USRINC = $usrinc + +!GROK!THIS! +$spitshell >>Makefile <<'!NO!SUBS!' +######################################################################## +# Jmake rules for building libraries, programs, scripts, and data files +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ + +######################################################################## +# Force 'make depend' to be performed first -- do not edit + +all:: .FORCE_DEPEND + +.FORCE_DEPEND:: + +######################################################################## +# Start of Jmakefile + +dmesh_url.c dmesh_url.h: dmesh_url.lst + -perl $(TOP)/scripts/enum-msg.pl dmesh_url.lst + touch dmesh_url.c dmesh_url.h + +all:: dmesh_url.c dmesh_url.h + +regenerate:: + $(RM) -f dmesh_url.c dmesh_url.h + $(MAKE) dmesh_url.c dmesh_url.h + +msg_drop.c msg_drop.h: drop.lst + -perl $(TOP)/scripts/enum-msg.pl drop.lst + touch msg_drop.c msg_drop.h + +all:: msg_drop.c msg_drop.h + +regenerate:: + $(RM) -f msg_drop.c msg_drop.h + $(MAKE) msg_drop.c msg_drop.h + +ignore.c ignore.h: ignore.lst + -perl $(TOP)/scripts/enum-msg.pl ignore.lst + touch ignore.c ignore.h + +all:: ignore.c ignore.h + +regenerate:: + $(RM) -f ignore.c ignore.h + $(MAKE) ignore.c ignore.h + +iprange.c iprange.h: iprange.lst + -perl $(TOP)/scripts/enum-msg.pl iprange.lst + touch iprange.c iprange.h + +all:: iprange.c iprange.h + +regenerate:: + $(RM) -f iprange.c iprange.h + $(MAKE) iprange.c iprange.h + +gnr_stats.c gnr_stats.h: stats.lst + -perl $(TOP)/scripts/enum-msg.pl stats.lst + touch gnr_stats.c gnr_stats.h + +all:: gnr_stats.c gnr_stats.h + +regenerate:: + $(RM) -f gnr_stats.c gnr_stats.h + $(MAKE) gnr_stats.c gnr_stats.h + +msg.c msg.h: msg.lst + -perl $(TOP)/scripts/enum-msg.pl msg.lst + touch msg.c msg.h + +all:: msg.c msg.h + +regenerate:: + $(RM) -f msg.c msg.h + $(MAKE) msg.c msg.h + +http_async.c http_async.h: http_async.lst + -perl $(TOP)/scripts/enum-msg.pl http_async.lst + touch http_async.c http_async.h + +all:: http_async.c http_async.h + +regenerate:: + $(RM) -f http_async.c http_async.h + $(MAKE) http_async.c http_async.h + +http_url.c http_url.h: http_url.lst + -perl $(TOP)/scripts/enum-msg.pl http_url.lst + touch http_url.c http_url.h + +all:: http_url.c http_url.h + +regenerate:: + $(RM) -f http_url.c http_url.h + $(MAKE) http_url.c http_url.h + +vxml.c vxml.h: vxml.lst + -perl $(TOP)/scripts/enum-msg.pl vxml.lst + touch vxml.c vxml.h + +all:: vxml.c vxml.h + +regenerate:: + $(RM) -f vxml.c vxml.h + $(MAKE) vxml.c vxml.h + +local_depend:: ../../../mkdep + +../../../mkdep: + @echo "You have to run Configure in $(TOP) first."; exit 1 + +depend:: local_depend +local_depend:: + ($(SED) '/^# DO NOT DELETE/q' Makefile && \ + $(MKDEP) $(SOURCES) | \ + $(SED) -e 's:/usr/lib^ *::g; s:$(USRINC)^ *::g; ' \ + -e '/: / b print' -e '$$ b print' -e 'H; d; n; : print' \ + -e 'x; s/\\$$//; s/\\\n//g; s/ */ /g; s/ :/:/;' -e '/: *$$/d' \ + ) > Makefile.new + cp Makefile Makefile.bak + cp Makefile.new Makefile + $(RM) Makefile.new + +######################################################################## +# Common rules for all Makefiles -- do not edit + +all:: + +clean: local_clean +realclean: local_realclean +clobber: local_clobber + +local_clean:: + if test -f core; then $(RM) core; fi + $(RM) *~ *.o + +local_realclean:: local_clean + +local_clobber:: local_realclean + $(RM) Makefile config.sh + +install:: local_install + @exit 0 + +install-strip:: local_install-strip + @exit 0 + +install.man:: maybe_install.man +deinstall:: local_deinstall +deinstall.man:: maybe_deinstall.man + +install.man-no: +deinstall.man-no: + +maybe_install.man: install.man-no +maybe_deinstall.man: deinstall.man-no + +Makefile.SH: Jmakefile + -@if test -f $(TOP)/.package; then \ + if test -f Makefile.SH; then \ + echo " $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~"; \ + $(RM) Makefile.SH~; $(MV) Makefile.SH Makefile.SH~; \ + fi; \ + echo " $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT)" ; \ + $(JMAKE) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT) ; \ + else touch $@; fi + +Makefile: Makefile.SH + /bin/sh Makefile.SH + +tags:: + $(CTAGS) -w *.ch + $(CTAGS) -xw *.ch > tags + +local_clobber:: + $(RM) tags + +depend:: + +######################################################################## +# Empty rules for directories with no sub-directories -- do not edit + +local_install:: + @echo "install in $(CURRENT) done." + +local_install-strip:: + @echo "install (strip) in $(CURRENT) done." + +local_deinstall:: + @echo "deinstall in $(CURRENT) done." + +local_install.man:: + @echo "install.man in $(CURRENT) done." + +local_deinstall.man:: + @echo "deinstall.man in $(CURRENT) done." + +Makefiles:: + +Makefiles.SH:: + +######################################################################## +# Dependencies generated by make depend +# DO NOT DELETE THIS LINE -- make depend relies on it + +# Put nothing here or make depend will gobble it up +.FORCE_DEPEND:: + @echo "You must run 'make depend' in $(TOP) first."; exit 1 +!NO!SUBS! +chmod 644 Makefile +$eunicefix Makefile +
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/dmesh_url.c
Added
@@ -0,0 +1,42 @@ +/* + * Generated on Sat Apr 5 13:38:59 2014 by enum-msg.pl -- DO NOT EDIT + * + * Command: ../../../scripts/enum-msg.pl dmesh_url.lst + */ + +#include "common.h" + +#include "dmesh_url.h" + +#include "lib/str.h" +#include "lib/override.h" /* Must be the last header included */ + +/* + * English descriptions for dmesh_url_error_t. + */ +static const char *dmesh_url_error_str = { + "OK", + "HTTP parsing error", + "File prefix neither /uri-res nor /get", + "Index in /get/index is reserved", + "No filename after /get/index", + "Bad URL encoding", + "Malformed /uri-res/N2R?", +}; + +/** + * @return the English description of the enum value. + */ +const char * +dmesh_url_error_to_string(dmesh_url_error_t x) +{ + if G_UNLIKELY(UNSIGNED(x) >= N_ITEMS(dmesh_url_error_str)) { + str_t *s = str_private(G_STRFUNC, 80); + str_printf(s, "Invalid dmesh_url_error_t code: %d", (int) x); + return str_2c(s); + } + + return dmesh_url_error_strx; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/dmesh_url.h
Added
@@ -0,0 +1,27 @@ +/* + * Generated on Sat Apr 5 13:38:59 2014 by enum-msg.pl -- DO NOT EDIT + * + * Command: ../../../scripts/enum-msg.pl dmesh_url.lst + */ + +#ifndef _if_gen_dmesh_url_h_ +#define _if_gen_dmesh_url_h_ + +/* + * Enum count: 7 + */ +typedef enum { + DMESH_URL_OK = 0, + DMESH_URL_HTTP_PARSER, + DMESH_URL_BAD_FILE_PREFIX, + DMESH_URL_RESERVED_INDEX, + DMESH_URL_NO_FILENAME, + DMESH_URL_BAD_ENCODING, + DMESH_URL_BAD_URI_RES +} dmesh_url_error_t; + +const char *dmesh_url_error_to_string(dmesh_url_error_t x); + +#endif /* _if_gen_dmesh_url_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/dmesh_url.lst
Added
@@ -0,0 +1,26 @@ +# +# Error codes from dmesh_url_parse() +# + +Prefix: DMESH_URL_ +Lowercase: no +I18N: no +#Count: +Enum: dmesh_url_error_t +Enum-Init: 0 +Enum-File: dmesh_url.h +#Symbolic: +Description: dmesh_url_error_str +#Enum-To-Symbolic: +Enum-To-Description: dmesh_url_error_to_string +Enum-To-Code: dmesh_url.c +Enum-To-Header: dmesh_url.h +Protection-Prefix: if_gen + +OK "OK" +HTTP_PARSER "HTTP parsing error" +BAD_FILE_PREFIX "File prefix neither /uri-res nor /get" +RESERVED_INDEX "Index in /get/index is reserved" +NO_FILENAME "No filename after /get/index" +BAD_ENCODING "Bad URL encoding" +BAD_URI_RES "Malformed /uri-res/N2R?"
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/drop.lst
Added
@@ -0,0 +1,70 @@ +# +# Message drop reasons +# + +Prefix: MSG_DROP_ +Lowercase: yes +I18N: yes +Count: REASON_COUNT +Enum: msg_drop_reason_t +Enum-Init: 0 +Enum-File: msg_drop.h +Symbolic: msg_drop_reasons +Description: msg_drop_reason_text +Enum-To-Symbolic: gnet_stats_drop_reason_name +Enum-To-Description: gnet_stats_drop_reason_to_string +Enum-To-Code: msg_drop.c +Enum-To-Header: msg_drop.h +Protection-Prefix: if_gen + +BAD_SIZE "Bad size" +TOO_SMALL "Too small" +TOO_LARGE "Too large" +WAY_TOO_LARGE "Way too large" +TOO_OLD "Too old" +UNKNOWN_TYPE "Unknown message type" +UNEXPECTED "Unexpected message" +TTL0 "Message sent with TTL = 0" +IMPROPER_HOPS_TTL "Improper hops/ttl combination" +MAX_TTL_EXCEEDED "Max TTL exceeded" +THROTTLE "Message throttle" +LIMIT "Message matched limits" +TRANSIENT "Transient node" +PONG_UNUSABLE "Unusable Pong" +HARD_TTL_LIMIT "Hard TTL limit reached" +MAX_HOP_COUNT "Max hop count reached" +ROUTE_LOST "Route lost" +NO_ROUTE "No route" +DUPLICATE "Duplicate message" +OOB_PROXY_CONFLICT "OOB Proxy MUID Conflict" +TO_BANNED "Message to banned GUID" +FROM_BANNED "Message from banned GUID" +SHUTDOWN "Node shutting down" +FLOW_CONTROL "TX flow control" +QUERY_NO_NUL "Query text had no trailing NUL" +QUERY_TOO_SHORT "Query text too short" +QUERY_OVERHEAD "Query had unnecessary overhead" +BAD_URN "Query had bad URN" +MALFORMED_SHA1 "Message with malformed SHA1" +MALFORMED_UTF_8 "Message with malformed UTF-8" +BAD_RESULT "Malformed Query Hit" +BAD_RETURN_ADDRESS "Bad return address" +HOSTILE_IP "Hostile IP address" +SHUNNED_IP "Shunned IP address" +MORPHEUS_BOGUS "Bogus result from Morpheus" +SPAM "Spam" +EVIL "Evil filename" +MEDIA "Improper media type" +INFLATE_ERROR "Payload inflating error" +UNKNOWN_HEADER_FLAGS "Unknown header flags present" +OWN_RESULT "Own search results" +OWN_QUERY "Own queries" +ANCIENT_QUERY "Ancient query format" +BLANK_SERVENT_ID "Blank Servent ID" +GUESS_MISSING_TOKEN "GUESS Query missing token" +GUESS_INVALID_TOKEN "GUESS Invalid query token" +DHT_INVALID_TOKEN "DHT Invalid security token" +DHT_TOO_MANY_STORE "DHT Too many STORE requests" +DHT_UNPARSEABLE "DHT Malformed message" +G2_UNEXPECTED "G2 Unexpected message" +NETWORK_CROSSING "Cannot cross networks"
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/gnr_stats.c
Added
@@ -0,0 +1,670 @@ +/* + * Generated on Wed Jun 17 13:02:21 2015 by enum-msg.pl -- DO NOT EDIT + * + * Command: ../../../scripts/enum-msg.pl stats.lst + */ + +#include "common.h" + +#include "gnr_stats.h" + +#include "lib/str.h" +#include "lib/override.h" /* Must be the last header included */ + +/* + * Symbolic descriptions for gnr_stats_t. + */ +static const char *stats_symbols = { + "routing_errors", + "routing_table_chunks", + "routing_table_capacity", + "routing_table_count", + "routing_transient_avoided", + "dups_with_higher_ttl", + "spam_sha1_hits", + "spam_name_hits", + "spam_fake_hits", + "spam_dup_hits", + "spam_caught_hostile_ip", + "spam_caught_hostile_held", + "spam_ip_held", + "local_searches", + "local_hits", + "local_partial_hits", + "local_whats_new_hits", + "local_query_hits", + "local_g2_searches", + "local_g2_hits", + "local_g2_partial_hits", + "oob_proxied_query_hits", + "oob_queries", + "oob_queries_stripped", + "oob_queries_ignored", + "query_oob_proxied_dups", + "oob_hits_for_proxied_queries", + "oob_hits_with_alien_ip", + "oob_hits_ignored_on_spammer_hit", + "oob_hits_ignored_on_unsecure_hit", + "unclaimed_oob_hits", + "partially_claimed_oob_hits", + "spurious_oob_hit_claim", + "unrequested_oob_hits", + "query_hit_for_untracked_query", + "query_tracked_muids", + "query_compact_count", + "query_compact_size", + "query_utf8", + "query_sha1", + "query_whats_new", + "query_g2_utf8", + "query_g2_sha1", + "query_guess", + "query_guess_02", + "guess_link_cache", + "guess_cached_query_keys_held", + "guess_cached_02_hosts_held", + "guess_cached_g2_hosts_held", + "guess_local_queries", + "guess_local_running", + "guess_local_query_hits", + "guess_ultra_queried", + "guess_ultra_acknowledged", + "guess_g2_queried", + "guess_g2_acknowledged", + "local_push_throttled", + "remote_push_throttled", + "broadcasted_pushes", + "push_proxy_udp_relayed", + "push_proxy_tcp_relayed", + "push_proxy_tcp_fw2fw", + "push_proxy_broadcasted", + "push_proxy_route_not_proxied", + "push_proxy_failed", + "push_relayed_via_local_route", + "push_relayed_via_table_route", + "local_dyn_queries", + "leaf_dyn_queries", + "oob_proxied_queries", + "dyn_queries_completed_full", + "dyn_queries_completed_partial", + "dyn_queries_completed_zero", + "dyn_queries_linger_extra", + "dyn_queries_linger_results", + "dyn_queries_linger_completed", + "gtkg_total_queries", + "gtkg_requeries", + "queries_with_ggep_h", + "queries_with_sr_udp", + "giv_callbacks", + "giv_discarded", + "queue_callbacks", + "queue_discarded", + "banned_fds_total", + "udp_read_ahead_count_sum", + "udp_read_ahead_bytes_sum", + "udp_read_ahead_old_sum", + "udp_read_ahead_count_max", + "udp_read_ahead_bytes_max", + "udp_read_ahead_delay_max", + "udp_fw2fw_pushes", + "udp_fw2fw_pushes_to_self", + "udp_fw2fw_pushes_patched", + "udp_uhc_pings", + "udp_uhc_pongs", + "udp_bogus_source_ip", + "udp_shunned_source_ip", + "udp_rx_truncated", + "udp_alien_message", + "udp_unprocessed_message", + "udp_tx_compressed", + "udp_rx_compressed", + "udp_compression_attempts", + "udp_larger_hence_not_compressed", + "udp_ambiguous", + "udp_ambiguous_deeper_inspection", + "udp_ambiguous_as_semi_reliable", + "udp_sr_tx_messages_given", + "udp_sr_tx_messages_deflated", + "udp_sr_tx_messages_unsent", + "udp_sr_tx_messages_banned", + "udp_sr_tx_messages_good", + "udp_sr_tx_messages_clogging", + "udp_sr_tx_reliable_messages_given", + "udp_sr_tx_reliable_messages_sent", + "udp_sr_tx_reliable_messages_unsent", + "udp_sr_tx_fragments_sent", + "udp_sr_tx_fragments_resent", + "udp_sr_tx_fragments_sending_avoided", + "udp_sr_tx_fragments_oversent", + "udp_sr_tx_total_acks_received", + "udp_sr_tx_cumulative_acks_received", + "udp_sr_tx_extended_acks_received", + "udp_sr_tx_spurious_acks_received", + "udp_sr_tx_invalid_acks_received", + "udp_sr_tx_acks_requeued", + "udp_sr_tx_plain_acks_dropped", + "udp_sr_tx_enhanced_acks_dropped", + "udp_sr_tx_plain_acks_sent", + "udp_sr_tx_cumulative_acks_sent", + "udp_sr_tx_extended_acks_sent", + "udp_sr_tx_ears_sent", + "udp_sr_tx_ears_oversent", + "udp_sr_tx_ear_nacks_received", + "udp_sr_tx_ear_followed_by_acks", + "udp_sr_rx_fragments_received", + "udp_sr_rx_fragments_duplicate", + "udp_sr_rx_fragments_unreliable", + "udp_sr_rx_fragments_dropped", + "udp_sr_rx_fragments_lingering", + "udp_sr_rx_messages_expired", + "udp_sr_rx_messages_received", + "udp_sr_rx_messages_inflated", + "udp_sr_rx_messages_inflation_error", + "udp_sr_rx_messages_unreliable", + "udp_sr_rx_messages_empty", + "udp_sr_rx_total_acks_sent", + "udp_sr_rx_cumulative_acks_sent", + "udp_sr_rx_extended_acks_sent", + "udp_sr_rx_avoided_acks", + "udp_sr_rx_ears_received", + "udp_sr_rx_ears_for_unknown_message", + "udp_sr_rx_ears_for_lingering_message", + "udp_sr_rx_from_hostile_ip", + "udp_g2_hits_rerouted_to_hub", + "udp_g2_hits_undelivered", + "consolidated_servers", + "dup_downloads_in_consolidation", + "discovered_server_guid", + "changed_server_guid", + "guid_collisions", + "own_guid_collisions", + "banned_guid_held", + "received_known_fw_node_info", + "revitalized_push_routes", + "collected_push_proxies", + "attempted_resource_switching", + "attempted_resource_switching_after_error", + "successful_resource_switching", + "successful_plain_resource_switching", + "successful_resource_switching_after_error", + "queued_after_switching", + "sunk_data", + "ignored_data", + "ignoring_after_mismatch", + "ignoring_to_preserve_connection", + "ignoring_during_aggressive_swarming", + "ignoring_refused", + "client_resource_switching", + "client_plain_resource_switching", + "client_followup_after_error", + "parq_slot_resource_switching", + "parq_retry_after_violation", + "parq_retry_after_kick_out", + "parq_slot_limit_overrides", + "parq_quick_slots_granted", + "parq_queue_sending_attempts", + "parq_queue_sent", + "parq_queue_follow_ups", + "sha1_verifications", + "tth_verifications", + "qhit_seeding_of_orphan", + "upload_seeding_of_orphan", + "rudp_tx_bytes", + "rudp_rx_bytes", + "dht_estimated_size", + "dht_estimated_size_stderr", + "dht_kball_theoretical", + "dht_kball_furthest", + "dht_kball_closest", + "dht_routing_buckets", + "dht_routing_leaves", + "dht_routing_max_depth", + "dht_routing_good_nodes", + "dht_routing_stale_nodes", + "dht_routing_pending_nodes", + "dht_routing_evicted_nodes", + "dht_routing_evicted_firewalled_nodes", + "dht_routing_evicted_quota_nodes", + "dht_routing_promoted_pending_nodes", + "dht_routing_pinged_promoted_nodes", + "dht_routing_rejected_node_bucket_quota", + "dht_routing_rejected_node_global_quota", + "dht_completed_bucket_refresh", + "dht_forced_bucket_refresh", + "dht_forced_bucket_merge", + "dht_bucket_merge", + "dht_bucket_split", + "dht_denied_unsplitable_bucket_refresh", + "dht_bucket_alive_check", + "dht_alive_pings_to_good_nodes", + "dht_alive_pings_to_stale_nodes", + "dht_alive_pings_to_shutdowning_nodes", + "dht_alive_pings_avoided", + "dht_alive_pings_skipped", + "dht_revitalized_stale_nodes", + "dht_rejected_value_on_quota", + "dht_rejected_value_on_creator", + "dht_lookup_rejected_node_on_net_quota", + "dht_lookup_rejected_node_on_proximity", + "dht_lookup_rejected_node_on_divergence", + "dht_lookup_fixed_node_contact", + "dht_keys_held", + "dht_cached_keys_held", + "dht_values_held", + "dht_cached_kuid_targets_held", + "dht_cached_roots_held", + "dht_cached_roots_exact_hits", + "dht_cached_roots_approximate_hits", + "dht_cached_roots_misses", + "dht_cached_roots_kball_lookups", + "dht_cached_roots_contact_refreshed", + "dht_cached_tokens_held", + "dht_cached_tokens_hits", + "dht_stable_nodes_held", + "dht_fetch_local_hits", + "dht_fetch_local_cached_hits", + "dht_returned_expanded_values", + "dht_returned_secondary_keys", + "dht_claimed_secondary_keys", + "dht_returned_expanded_cached_values", + "dht_returned_cached_secondary_keys", + "dht_claimed_cached_secondary_keys", + "dht_published", + "dht_removed", + "dht_stale_replication", + "dht_replication", + "dht_republish", + "dht_secondary_key_fetch", + "dht_dup_values", + "dht_kuid_collisions", + "dht_own_kuid_collisions", + "dht_caching_attempts", + "dht_caching_successful", + "dht_caching_partially_successful", + "dht_key_offloading_checks", + "dht_keys_selected_for_offloading", + "dht_key_offloading_attempts", + "dht_key_offloading_successful", + "dht_key_offloading_partially_successful", + "dht_values_offloaded", + "dht_msg_received", + "dht_msg_matching_contact_address", + "dht_msg_fixed_contact_address", + "dht_msg_from_hostile_address", + "dht_msg_from_hostile_contact_address", + "dht_rpc_msg_prepared", + "dht_rpc_msg_cancelled", + "dht_rpc_timed_out", + "dht_rpc_replies_received", + "dht_rpc_replies_fixed_contact", + "dht_rpc_late_replies_received", + "dht_rpc_kuid_reply_mismatch", + "dht_rpc_recent_nodes_held", + "dht_node_verifications", + "dht_publishing_attempts", + "dht_publishing_successful", + "dht_publishing_partially_successful", + "dht_publishing_satisfactory", + "dht_republished_late", + "dht_publishing_to_self", + "dht_publishing_bg_attempts", + "dht_publishing_bg_improvements", + "dht_publishing_bg_successful", + "dht_sha1_data_type_collisions", + "dht_passively_protected_lookup_path", + "dht_actively_protected_lookup_path", + "dht_alt_loc_lookups", + "dht_push_proxy_lookups", + "dht_successful_alt_loc_lookups", + "dht_successful_push_proxy_lookups", + "dht_successful_node_push_entry_lookups", + "dht_seeding_of_orphan", + "stats_digest", + "stats_tcp_digest", + "stats_udp_digest", +}; + +/** + * @return the symbolic description of the enum value. + */ +const char * +gnet_stats_general_to_string(gnr_stats_t x) +{ + if G_UNLIKELY(UNSIGNED(x) >= N_ITEMS(stats_symbols)) { + str_t *s = str_private(G_STRFUNC, 80); + str_printf(s, "Invalid gnr_stats_t code: %d", (int) x); + return str_2c(s); + } + + return stats_symbolsx; +} + +/* + * English descriptions for gnr_stats_t. + */ +static const char *stats_text = { + N_("Routing errors"), + N_("Routing table chunks"), + N_("Routing table message capacity"), + N_("Routing table message count"), + N_("Routing through transient node avoided"), + N_("Duplicates with higher TTL"), + N_("SPAM SHA1 database hits"), + N_("SPAM filename and size hits"), + N_("SPAM fake hits"), + N_("SPAM duplicate hits"), + N_("SPAM dynamically caught hostile IP addresses"), + N_("SPAM dynamically caught hostile IP held"), + N_("SPAM spotted spamming IP addresses held"), + N_("Searches to local DB"), + N_("Hits on local DB"), + N_("Hits on local partial files"), + N_("Hits on \"what's new?\" queries"), + N_("Query hits received for local queries"), + N_("G2 searches to local DB"), + N_("G2 hits on local DB"), + N_("G2 hits on local partial files"), + N_("Query hits received for OOB-proxied queries"), + N_("Queries requesting OOB hit delivery"), + N_("Stripped OOB flag on queries"), + N_("Ignored OOB queries due to unclaimed hits"), + N_("Duplicate OOB-proxied queries"), + N_("OOB hits received for OOB-proxied queries"), + N_("OOB hits bearing alien IP address"), + N_("OOB hits ignored due to identified spamming address"), + N_("OOB hits ignored due to unsecure promise from known secure host"), + N_("Unclaimed locally-generated OOB hits"), + N_("Partially claimed locally-generated OOB hits"), + N_("Spurious OOB hit claiming received"), + N_("Unrequested OOB hits received"), + N_("Received query hits for untracked queries"), + N_("Tracked query MUIDs"), + N_("Compacted queries"), + N_("Bytes saved by compacting"), + N_("UTF8 queries"), + N_("SHA1 queries"), + N_("\"What's New?\" queries"), + N_("UTF8 G2 queries"), + N_("SHA1 G2 queries"), + N_("GUESS queries"), + N_("GUESS queries (0.2)"), + N_("GUESS link cache size"), + N_("GUESS cached query keys held"), + N_("GUESS cached 0.2 hosts held"), + N_("GUESS cached G2 hosts held"), + N_("GUESS locally generated queries"), + N_("GUESS currently running queries"), + N_("GUESS hits received for locally generated queries"), + N_("GUESS ultra nodes queried"), + N_("GUESS ultra nodes sending back an acknowledgment"), + N_("GUESS G2 nodes queried"), + N_("GUESS G2 nodes sending back an acknowledgment"), + N_("Throttled local push messages"), + N_("Throttled received push messages"), + N_("Broadcasted push messages"), + N_("Push-proxy UDP relayed messages"), + N_("Push-proxy TCP relayed messages"), + N_("Push-proxy TCP for FW<->FW transfers"), + N_("Push-proxy broadcasted messages"), + N_("Push-proxy found un-proxied local route"), + N_("Push-proxy lookup failures"), + N_("Push relayed via local route"), + N_("Push relayed via routing table"), + N_("Locally generated dynamic queries"), + N_("Leaf-generated dynamic queries"), + N_("OOB-proxied leaf queries"), + N_("Fully completed dynamic queries"), + N_("Partially completed dynamic queries"), + N_("Dynamic queries ended with no results"), + N_("Fully completed dynamic queries getting late results"), + N_("Dynamic queries with partial late results"), + N_("Dynamic queries completed by late results"), + N_("Queries seen from GTKG"), + N_("Queries seen from GTKG that were re-queries"), + N_("Queries advertising support of GGEP \"H\""), + N_("Queries advertising support of semi-reliable UDP"), + N_("GIV callbacks received"), + N_("GIV discarded due to no suitable download"), + N_("QUEUE callbacks received"), + N_("QUEUE discarded due to no suitable download"), + N_("File descriptors banned running count"), + N_("UDP read-ahead datagram running count"), + N_("UDP read-ahead datagram running bytes"), + N_("UDP read-ahead datagram \"old\" processed"), + N_("UDP read-ahead datagram max count"), + N_("UDP read-ahead datagram max bytes"), + N_("UDP read-ahead datagram max delay"), + N_("UDP push messages received for FW<->FW connections"), + N_("UDP push messages requesting FW<->FW connection with ourselves"), + N_("UDP push messages patched for FW<->FW connections"), + N_("UDP UHC pings received"), + N_("UDP UHC pongs sent"), + N_("UDP messages with bogus source IP"), + N_("UDP messages from shunned IP (discarded)"), + N_("UDP truncated incoming messages"), + N_("Alien UDP messages (non-Gnutella)"), + N_("Unprocessed UDP Gnutella messages"), + N_("Compressed UDP messages enqueued"), + N_("Compressed UDP messages received"), + N_("Candidates for UDP message compression"), + N_("Uncompressed UDP messages due to no gain"), + N_("Ambiguous UDP messages received"), + N_("Ambiguous UDP messages inspected more deeply"), + N_("Ambiguous UDP messages handled as semi-reliable UDP"), + N_("Semi-reliable UDP total messages given for transmission"), + N_("Semi-reliable UDP total messages deflated"), + N_("Semi-reliable UDP total messages unsent"), + N_("Semi-reliable UDP total messages dropped due to temporary ban"), + N_("Semi-reliable UDP total messages sent to known responsive hosts"), + N_("Semi-reliable UDP total messages partially sent due to clogging"), + N_("Semi-reliable UDP reliable messages given for transmission"), + N_("Semi-reliable UDP reliable messages correctly transmited"), + N_("Semi-reliable UDP reliable messages not fully acknowledged"), + N_("Semi-reliable UDP fragments sent"), + N_("Semi-reliable UDP fragments resent"), + N_("Semi-reliable UDP fragment sendings avoided"), + N_("Semi-reliable UDP fragments sent too many times"), + N_("Semi-reliable UDP total acknowledgments received"), + N_("Semi-reliable UDP cumulative acknowledgments received"), + N_("Semi-reliable UDP extended acknowledgments received"), + N_("Semi-reliable UDP spurious acknowledgments received"), + N_("Semi-reliable UDP invalid acknowledgments received"), + N_("Semi-reliable UDP acknowledgments re-queued for sending"), + N_("Semi-reliable UDP plain acknowledgments dropped"), + N_("Semi-reliable UDP enhanced acknowledgments dropped"), + N_("Semi-reliable UDP plain acknowledgments transmitted"), + N_("Semi-reliable UDP cumulative acknowledgments transmitted"), + N_("Semi-reliable UDP extended acknowledgments transmitted"), + N_("Semi-reliable UDP EARs sent"), + N_("Semi-reliable UDP too many EARs sent"), + N_("Semi-reliable UDP EAR negative acknowledgments received"), + N_("Semi-reliable UDP acknowledgments received after sending EARs"), + N_("Semi-reliable UDP fragments received"), + N_("Semi-reliable UDP duplicate fragments received"), + N_("Semi-reliable UDP unreliable fragments received"), + N_("Semi-reliable UDP dropped received fragments"), + N_("Semi-reliable UDP fragments received whilst lingering"), + N_("Semi-reliable UDP messages expired before re-assembly"), + N_("Semi-reliable UDP messages re-assembled completely"), + N_("Semi-reliable UDP messages inflated successfully"), + N_("Semi-reliable UDP messages inflated incorrectly"), + N_("Semi-reliable UDP unreliable messages received"), + N_("Semi-reliable UDP empty messages received"), + N_("Semi-reliable UDP total acknowledgments sent"), + N_("Semi-reliable UDP cumulative acknowledgments sent"), + N_("Semi-reliable UDP extended acknowledgments sent"), + N_("Semi-reliable UDP avoided acknowledgment sendings"), + N_("Semi-reliable UDP EARs received"), + N_("Semi-reliable UDP EARs received for unknown message"), + N_("Semi-reliable UDP EARs received whilst lingering"), + N_("Semi-reliable UDP fragments from hostile IP addresses"), + N_("UDP G2 hits rerouted to hub for delivery"), + N_("UDP G2 hits undelivered"), + N_("Consolidated servers (after GUID and IP address linking)"), + N_("Duplicate downloads found during server consolidation"), + N_("Discovered server GUIDs"), + N_("Changed server GUIDs"), + N_("Detected GUID collisions"), + N_("Detected collisions with our own GUID"), + N_("GUID dynamically banned"), + N_("Firewalled node info for known hosts received in upload requests"), + N_("Revitalized PUSH routes"), + N_("Collected new PUSH proxies from other query hits"), + N_("Attempted download resource switching on completion"), + N_("Attempted download resource switching after error"), + N_("Successful download resource switching (all kind)"), + N_("Successful download resource switching between plain files"), + N_("Successful download resource switching after error"), + N_("Actively queued after resource switching attempt"), + N_("Sunk HTTP reply data on error codes"), + N_("Ignored downloaded data"), + N_("Ignoring requested after data mismatch"), + N_("Ignoring requested to preserve connection"), + N_("Ignoring requested due to aggressive swarming"), + N_("Ignoring refused (data too large or server too slow)"), + N_("Client resource switching (all detected)"), + N_("Client resource switching between plain files"), + N_("Client follow-up request after HTTP error was returned"), + N_("PARQ client resource switching in slots (SHA-1 based)"), + N_("PARQ client retry-after violation"), + N_("PARQ client kicked out after too many retry-after violations"), + N_("PARQ upload slot limit overrides"), + N_("PARQ quick upload slots granted"), + N_("PARQ QUEUE sending attempts"), + N_("PARQ QUEUE messages sent"), + N_("PARQ QUEUE follow-up requests received"), + N_("Launched SHA-1 file verifications"), + N_("Launched TTH file verifications"), + N_("Re-seeding of orphan downloads through query hits"), + N_("Re-seeding of orphan downloads through upload requests"), + N_("RUDP sent bytes"), + N_("RUDP received bytes"), + N_("DHT estimated amount of nodes"), + N_("DHT standard error of estimated amount of nodes"), + N_("DHT k-ball theoretical frontier (bits)"), + N_("DHT k-ball furthest frontier (bits)"), + N_("DHT k-ball closeest frontier (bits)"), + N_("DHT routing table buckets"), + N_("DHT routing table leaves"), + N_("DHT routing table maximum depth"), + N_("DHT routing table good nodes"), + N_("DHT routing table stale nodes"), + N_("DHT routing table pending nodes"), + N_("DHT routing table evicted nodes"), + N_("DHT routing table evicted firewalled nodes"), + N_("DHT routing table evicted nodes due to quota"), + N_("DHT routing table promoted pending nodes"), + N_("DHT routing table pinged promoted nodes"), + N_("DHT routing table rejected node due to bucket network quota"), + N_("DHT routing table rejected node due to global network quota"), + N_("DHT completed bucket refreshes"), + N_("DHT forced bucket refreshes"), + N_("DHT forced bucket merges"), + N_("DHT bucket merges"), + N_("DHT bucket splits"), + N_("DHT denied non-splitable bucket refresh"), + N_("DHT initiated bucket alive checks"), + N_("DHT alive pings sent to good nodes"), + N_("DHT alive pings sent to stale nodes"), + N_("DHT alive pings sent to shutdowning nodes"), + N_("DHT alive pings avoided"), + N_("DHT alive pings skipped"), + N_("DHT revitalized stale nodes on RPC reply"), + N_("DHT value store rejected on IP/network quota grounds"), + N_("DHT value store rejected on creator validation grounds"), + N_("DHT nodes rejected during lookup based on network quota"), + N_("DHT nodes rejected during lookup based on suspicious proximity"), + N_("DHT nodes rejected during lookup based on frequency divergence"), + N_("DHT node contact IP addresses fixed during lookup"), + N_("DHT keys held"), + N_("DHT cached keys held"), + N_("DHT values held"), + N_("DHT cached KUID targets held"), + N_("DHT cached closest root nodes"), + N_("DHT cached roots exact hits"), + N_("DHT cached roots approximate hits"), + N_("DHT cached roots misses"), + N_("DHT cached roots lookups within k-ball"), + N_("DHT cached roots contact address refreshed"), + N_("DHT cached security tokens held"), + N_("DHT cached security tokens hits"), + N_("DHT stable node information held"), + N_("DHT local hits on value lookups"), + N_("DHT local hits returning values from cached keys"), + N_("DHT returned expanded values"), + N_("DHT returned values as secondary keys"), + N_("DHT claimed values via secondary keys"), + N_("DHT returned cached expanded values"), + N_("DHT returned cached values as secondary-keys"), + N_("DHT claimed cached values via secondary keys"), + N_("DHT successfully received value publications"), + N_("DHT successfully received value removals"), + N_("DHT replication of stale value avoided"), + N_("DHT replication of held values"), + N_("DHT republishing of held values"), + N_("DHT secondary-key value fetch issued"), + N_("DHT duplicate values returned in lookups"), + N_("DHT detected KUID collisions"), + N_("DHT detected collisions with our own KUID"), + N_("DHT caching attempts"), + N_("DHT caching ended successfully"), + N_("DHT caching partially completed"), + N_("DHT key-offloading checks after discovering new closest node"), + N_("DHT keys selected for offloading"), + N_("DHT key-offloading attempts"), + N_("DHT key-offloading ended successfully"), + N_("DHT key-offloading partially completed"), + N_("DHT values successfully offloaded"), + N_("DHT incoming messages"), + N_("DHT incoming messages with UDP-matching contact address"), + N_("DHT incoming messages with contact address fixed"), + N_("DHT incoming messages from hostile addresses"), + N_("DHT incoming messages with hostile contact address"), + N_("DHT RPC messages prepared"), + N_("DHT RPC messages cancelled"), + N_("DHT RPC timed out"), + N_("DHT RPC replies received"), + N_("DHT RPC replies with contact address fixed"), + N_("DHT RPC late replies received"), + N_("DHT RPC detected KUID mismatches on reply"), + N_("DHT RPC recent nodes held"), + N_("DHT node verifications"), + N_("DHT publishing attempts"), + N_("DHT publishing ended successfully (all roots)"), + N_("DHT publishing partially completed (root subset only)"), + N_("DHT publishing ending with proper value presence"), + N_("DHT value republishing occurring too late (after expiry)"), + N_("DHT publishing to self"), + N_("DHT background publishing completion attempts"), + N_("DHT background publishing completion showing improvements"), + N_("DHT background publishing completion successful (all roots)"), + N_("DHT SHA1 data type collisions"), + N_("DHT lookup path passively protected against attack"), + N_("DHT lookup path actively protected against attack"), + N_("DHT alt-loc lookups issued"), + N_("DHT push-proxy lookups issued"), + N_("DHT successful alt-loc lookups"), + N_("DHT successful push-proxy lookups"), + N_("DHT successful node push-entry lookups"), + N_("DHT re-seeding of orphan downloads"), + N_("Digests computed on general statistics"), + N_("Digests computed on TCP statistics"), + N_("Digests computed on UDP statistics"), +}; + +/** + * @return the English description of the enum value. + */ +const char * +gnet_stats_general_description(gnr_stats_t x) +{ + if G_UNLIKELY(UNSIGNED(x) >= N_ITEMS(stats_text)) { + str_t *s = str_private(G_STRFUNC, 80); + str_printf(s, "Invalid gnr_stats_t code: %d", (int) x); + return str_2c(s); + } + + return stats_textx; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/gnr_stats.h
Added
@@ -0,0 +1,331 @@ +/* + * Generated on Wed Jun 17 13:02:21 2015 by enum-msg.pl -- DO NOT EDIT + * + * Command: ../../../scripts/enum-msg.pl stats.lst + */ + +#ifndef _if_gen_gnr_stats_h_ +#define _if_gen_gnr_stats_h_ + +/* + * Enum count: 307 + */ +typedef enum { + GNR_ROUTING_ERRORS = 0, + GNR_ROUTING_TABLE_CHUNKS, + GNR_ROUTING_TABLE_CAPACITY, + GNR_ROUTING_TABLE_COUNT, + GNR_ROUTING_TRANSIENT_AVOIDED, + GNR_DUPS_WITH_HIGHER_TTL, + GNR_SPAM_SHA1_HITS, + GNR_SPAM_NAME_HITS, + GNR_SPAM_FAKE_HITS, + GNR_SPAM_DUP_HITS, + GNR_SPAM_CAUGHT_HOSTILE_IP, + GNR_SPAM_CAUGHT_HOSTILE_HELD, + GNR_SPAM_IP_HELD, + GNR_LOCAL_SEARCHES, + GNR_LOCAL_HITS, + GNR_LOCAL_PARTIAL_HITS, + GNR_LOCAL_WHATS_NEW_HITS, + GNR_LOCAL_QUERY_HITS, + GNR_LOCAL_G2_SEARCHES, + GNR_LOCAL_G2_HITS, + GNR_LOCAL_G2_PARTIAL_HITS, + GNR_OOB_PROXIED_QUERY_HITS, + GNR_OOB_QUERIES, + GNR_OOB_QUERIES_STRIPPED, + GNR_OOB_QUERIES_IGNORED, + GNR_QUERY_OOB_PROXIED_DUPS, + GNR_OOB_HITS_FOR_PROXIED_QUERIES, + GNR_OOB_HITS_WITH_ALIEN_IP, + GNR_OOB_HITS_IGNORED_ON_SPAMMER_HIT, + GNR_OOB_HITS_IGNORED_ON_UNSECURE_HIT, + GNR_UNCLAIMED_OOB_HITS, + GNR_PARTIALLY_CLAIMED_OOB_HITS, + GNR_SPURIOUS_OOB_HIT_CLAIM, + GNR_UNREQUESTED_OOB_HITS, + GNR_QUERY_HIT_FOR_UNTRACKED_QUERY, + GNR_QUERY_TRACKED_MUIDS, + GNR_QUERY_COMPACT_COUNT, + GNR_QUERY_COMPACT_SIZE, + GNR_QUERY_UTF8, + GNR_QUERY_SHA1, + GNR_QUERY_WHATS_NEW, + GNR_QUERY_G2_UTF8, + GNR_QUERY_G2_SHA1, + GNR_QUERY_GUESS, + GNR_QUERY_GUESS_02, + GNR_GUESS_LINK_CACHE, + GNR_GUESS_CACHED_QUERY_KEYS_HELD, + GNR_GUESS_CACHED_02_HOSTS_HELD, + GNR_GUESS_CACHED_G2_HOSTS_HELD, + GNR_GUESS_LOCAL_QUERIES, + GNR_GUESS_LOCAL_RUNNING, + GNR_GUESS_LOCAL_QUERY_HITS, + GNR_GUESS_ULTRA_QUERIED, + GNR_GUESS_ULTRA_ACKNOWLEDGED, + GNR_GUESS_G2_QUERIED, + GNR_GUESS_G2_ACKNOWLEDGED, + GNR_LOCAL_PUSH_THROTTLED, + GNR_REMOTE_PUSH_THROTTLED, + GNR_BROADCASTED_PUSHES, + GNR_PUSH_PROXY_UDP_RELAYED, + GNR_PUSH_PROXY_TCP_RELAYED, + GNR_PUSH_PROXY_TCP_FW2FW, + GNR_PUSH_PROXY_BROADCASTED, + GNR_PUSH_PROXY_ROUTE_NOT_PROXIED, + GNR_PUSH_PROXY_FAILED, + GNR_PUSH_RELAYED_VIA_LOCAL_ROUTE, + GNR_PUSH_RELAYED_VIA_TABLE_ROUTE, + GNR_LOCAL_DYN_QUERIES, + GNR_LEAF_DYN_QUERIES, + GNR_OOB_PROXIED_QUERIES, + GNR_DYN_QUERIES_COMPLETED_FULL, + GNR_DYN_QUERIES_COMPLETED_PARTIAL, + GNR_DYN_QUERIES_COMPLETED_ZERO, + GNR_DYN_QUERIES_LINGER_EXTRA, + GNR_DYN_QUERIES_LINGER_RESULTS, + GNR_DYN_QUERIES_LINGER_COMPLETED, + GNR_GTKG_TOTAL_QUERIES, + GNR_GTKG_REQUERIES, + GNR_QUERIES_WITH_GGEP_H, + GNR_QUERIES_WITH_SR_UDP, + GNR_GIV_CALLBACKS, + GNR_GIV_DISCARDED, + GNR_QUEUE_CALLBACKS, + GNR_QUEUE_DISCARDED, + GNR_BANNED_FDS_TOTAL, + GNR_UDP_READ_AHEAD_COUNT_SUM, + GNR_UDP_READ_AHEAD_BYTES_SUM, + GNR_UDP_READ_AHEAD_OLD_SUM, + GNR_UDP_READ_AHEAD_COUNT_MAX, + GNR_UDP_READ_AHEAD_BYTES_MAX, + GNR_UDP_READ_AHEAD_DELAY_MAX, + GNR_UDP_FW2FW_PUSHES, + GNR_UDP_FW2FW_PUSHES_TO_SELF, + GNR_UDP_FW2FW_PUSHES_PATCHED, + GNR_UDP_UHC_PINGS, + GNR_UDP_UHC_PONGS, + GNR_UDP_BOGUS_SOURCE_IP, + GNR_UDP_SHUNNED_SOURCE_IP, + GNR_UDP_RX_TRUNCATED, + GNR_UDP_ALIEN_MESSAGE, + GNR_UDP_UNPROCESSED_MESSAGE, + GNR_UDP_TX_COMPRESSED, + GNR_UDP_RX_COMPRESSED, + GNR_UDP_COMPRESSION_ATTEMPTS, + GNR_UDP_LARGER_HENCE_NOT_COMPRESSED, + GNR_UDP_AMBIGUOUS, + GNR_UDP_AMBIGUOUS_DEEPER_INSPECTION, + GNR_UDP_AMBIGUOUS_AS_SEMI_RELIABLE, + GNR_UDP_SR_TX_MESSAGES_GIVEN, + GNR_UDP_SR_TX_MESSAGES_DEFLATED, + GNR_UDP_SR_TX_MESSAGES_UNSENT, + GNR_UDP_SR_TX_MESSAGES_BANNED, + GNR_UDP_SR_TX_MESSAGES_GOOD, + GNR_UDP_SR_TX_MESSAGES_CLOGGING, + GNR_UDP_SR_TX_RELIABLE_MESSAGES_GIVEN, + GNR_UDP_SR_TX_RELIABLE_MESSAGES_SENT, + GNR_UDP_SR_TX_RELIABLE_MESSAGES_UNSENT, + GNR_UDP_SR_TX_FRAGMENTS_SENT, + GNR_UDP_SR_TX_FRAGMENTS_RESENT, + GNR_UDP_SR_TX_FRAGMENTS_SENDING_AVOIDED, + GNR_UDP_SR_TX_FRAGMENTS_OVERSENT, + GNR_UDP_SR_TX_TOTAL_ACKS_RECEIVED, + GNR_UDP_SR_TX_CUMULATIVE_ACKS_RECEIVED, + GNR_UDP_SR_TX_EXTENDED_ACKS_RECEIVED, + GNR_UDP_SR_TX_SPURIOUS_ACKS_RECEIVED, + GNR_UDP_SR_TX_INVALID_ACKS_RECEIVED, + GNR_UDP_SR_TX_ACKS_REQUEUED, + GNR_UDP_SR_TX_PLAIN_ACKS_DROPPED, + GNR_UDP_SR_TX_ENHANCED_ACKS_DROPPED, + GNR_UDP_SR_TX_PLAIN_ACKS_SENT, + GNR_UDP_SR_TX_CUMULATIVE_ACKS_SENT, + GNR_UDP_SR_TX_EXTENDED_ACKS_SENT, + GNR_UDP_SR_TX_EARS_SENT, + GNR_UDP_SR_TX_EARS_OVERSENT, + GNR_UDP_SR_TX_EAR_NACKS_RECEIVED, + GNR_UDP_SR_TX_EAR_FOLLOWED_BY_ACKS, + GNR_UDP_SR_RX_FRAGMENTS_RECEIVED, + GNR_UDP_SR_RX_FRAGMENTS_DUPLICATE, + GNR_UDP_SR_RX_FRAGMENTS_UNRELIABLE, + GNR_UDP_SR_RX_FRAGMENTS_DROPPED, + GNR_UDP_SR_RX_FRAGMENTS_LINGERING, + GNR_UDP_SR_RX_MESSAGES_EXPIRED, + GNR_UDP_SR_RX_MESSAGES_RECEIVED, + GNR_UDP_SR_RX_MESSAGES_INFLATED, + GNR_UDP_SR_RX_MESSAGES_INFLATION_ERROR, + GNR_UDP_SR_RX_MESSAGES_UNRELIABLE, + GNR_UDP_SR_RX_MESSAGES_EMPTY, + GNR_UDP_SR_RX_TOTAL_ACKS_SENT, + GNR_UDP_SR_RX_CUMULATIVE_ACKS_SENT, + GNR_UDP_SR_RX_EXTENDED_ACKS_SENT, + GNR_UDP_SR_RX_AVOIDED_ACKS, + GNR_UDP_SR_RX_EARS_RECEIVED, + GNR_UDP_SR_RX_EARS_FOR_UNKNOWN_MESSAGE, + GNR_UDP_SR_RX_EARS_FOR_LINGERING_MESSAGE, + GNR_UDP_SR_RX_FROM_HOSTILE_IP, + GNR_UDP_G2_HITS_REROUTED_TO_HUB, + GNR_UDP_G2_HITS_UNDELIVERED, + GNR_CONSOLIDATED_SERVERS, + GNR_DUP_DOWNLOADS_IN_CONSOLIDATION, + GNR_DISCOVERED_SERVER_GUID, + GNR_CHANGED_SERVER_GUID, + GNR_GUID_COLLISIONS, + GNR_OWN_GUID_COLLISIONS, + GNR_BANNED_GUID_HELD, + GNR_RECEIVED_KNOWN_FW_NODE_INFO, + GNR_REVITALIZED_PUSH_ROUTES, + GNR_COLLECTED_PUSH_PROXIES, + GNR_ATTEMPTED_RESOURCE_SWITCHING, + GNR_ATTEMPTED_RESOURCE_SWITCHING_AFTER_ERROR, + GNR_SUCCESSFUL_RESOURCE_SWITCHING, + GNR_SUCCESSFUL_PLAIN_RESOURCE_SWITCHING, + GNR_SUCCESSFUL_RESOURCE_SWITCHING_AFTER_ERROR, + GNR_QUEUED_AFTER_SWITCHING, + GNR_SUNK_DATA, + GNR_IGNORED_DATA, + GNR_IGNORING_AFTER_MISMATCH, + GNR_IGNORING_TO_PRESERVE_CONNECTION, + GNR_IGNORING_DURING_AGGRESSIVE_SWARMING, + GNR_IGNORING_REFUSED, + GNR_CLIENT_RESOURCE_SWITCHING, + GNR_CLIENT_PLAIN_RESOURCE_SWITCHING, + GNR_CLIENT_FOLLOWUP_AFTER_ERROR, + GNR_PARQ_SLOT_RESOURCE_SWITCHING, + GNR_PARQ_RETRY_AFTER_VIOLATION, + GNR_PARQ_RETRY_AFTER_KICK_OUT, + GNR_PARQ_SLOT_LIMIT_OVERRIDES, + GNR_PARQ_QUICK_SLOTS_GRANTED, + GNR_PARQ_QUEUE_SENDING_ATTEMPTS, + GNR_PARQ_QUEUE_SENT, + GNR_PARQ_QUEUE_FOLLOW_UPS, + GNR_SHA1_VERIFICATIONS, + GNR_TTH_VERIFICATIONS, + GNR_QHIT_SEEDING_OF_ORPHAN, + GNR_UPLOAD_SEEDING_OF_ORPHAN, + GNR_RUDP_TX_BYTES, + GNR_RUDP_RX_BYTES, + GNR_DHT_ESTIMATED_SIZE, + GNR_DHT_ESTIMATED_SIZE_STDERR, + GNR_DHT_KBALL_THEORETICAL, + GNR_DHT_KBALL_FURTHEST, + GNR_DHT_KBALL_CLOSEST, + GNR_DHT_ROUTING_BUCKETS, + GNR_DHT_ROUTING_LEAVES, + GNR_DHT_ROUTING_MAX_DEPTH, + GNR_DHT_ROUTING_GOOD_NODES, + GNR_DHT_ROUTING_STALE_NODES, + GNR_DHT_ROUTING_PENDING_NODES, + GNR_DHT_ROUTING_EVICTED_NODES, + GNR_DHT_ROUTING_EVICTED_FIREWALLED_NODES, + GNR_DHT_ROUTING_EVICTED_QUOTA_NODES, + GNR_DHT_ROUTING_PROMOTED_PENDING_NODES, + GNR_DHT_ROUTING_PINGED_PROMOTED_NODES, + GNR_DHT_ROUTING_REJECTED_NODE_BUCKET_QUOTA, + GNR_DHT_ROUTING_REJECTED_NODE_GLOBAL_QUOTA, + GNR_DHT_COMPLETED_BUCKET_REFRESH, + GNR_DHT_FORCED_BUCKET_REFRESH, + GNR_DHT_FORCED_BUCKET_MERGE, + GNR_DHT_BUCKET_MERGE, + GNR_DHT_BUCKET_SPLIT, + GNR_DHT_DENIED_UNSPLITABLE_BUCKET_REFRESH, + GNR_DHT_BUCKET_ALIVE_CHECK, + GNR_DHT_ALIVE_PINGS_TO_GOOD_NODES, + GNR_DHT_ALIVE_PINGS_TO_STALE_NODES, + GNR_DHT_ALIVE_PINGS_TO_SHUTDOWNING_NODES, + GNR_DHT_ALIVE_PINGS_AVOIDED, + GNR_DHT_ALIVE_PINGS_SKIPPED, + GNR_DHT_REVITALIZED_STALE_NODES, + GNR_DHT_REJECTED_VALUE_ON_QUOTA, + GNR_DHT_REJECTED_VALUE_ON_CREATOR, + GNR_DHT_LOOKUP_REJECTED_NODE_ON_NET_QUOTA, + GNR_DHT_LOOKUP_REJECTED_NODE_ON_PROXIMITY, + GNR_DHT_LOOKUP_REJECTED_NODE_ON_DIVERGENCE, + GNR_DHT_LOOKUP_FIXED_NODE_CONTACT, + GNR_DHT_KEYS_HELD, + GNR_DHT_CACHED_KEYS_HELD, + GNR_DHT_VALUES_HELD, + GNR_DHT_CACHED_KUID_TARGETS_HELD, + GNR_DHT_CACHED_ROOTS_HELD, + GNR_DHT_CACHED_ROOTS_EXACT_HITS, + GNR_DHT_CACHED_ROOTS_APPROXIMATE_HITS, + GNR_DHT_CACHED_ROOTS_MISSES, + GNR_DHT_CACHED_ROOTS_KBALL_LOOKUPS, + GNR_DHT_CACHED_ROOTS_CONTACT_REFRESHED, + GNR_DHT_CACHED_TOKENS_HELD, + GNR_DHT_CACHED_TOKENS_HITS, + GNR_DHT_STABLE_NODES_HELD, + GNR_DHT_FETCH_LOCAL_HITS, + GNR_DHT_FETCH_LOCAL_CACHED_HITS, + GNR_DHT_RETURNED_EXPANDED_VALUES, + GNR_DHT_RETURNED_SECONDARY_KEYS, + GNR_DHT_CLAIMED_SECONDARY_KEYS, + GNR_DHT_RETURNED_EXPANDED_CACHED_VALUES, + GNR_DHT_RETURNED_CACHED_SECONDARY_KEYS, + GNR_DHT_CLAIMED_CACHED_SECONDARY_KEYS, + GNR_DHT_PUBLISHED, + GNR_DHT_REMOVED, + GNR_DHT_STALE_REPLICATION, + GNR_DHT_REPLICATION, + GNR_DHT_REPUBLISH, + GNR_DHT_SECONDARY_KEY_FETCH, + GNR_DHT_DUP_VALUES, + GNR_DHT_KUID_COLLISIONS, + GNR_DHT_OWN_KUID_COLLISIONS, + GNR_DHT_CACHING_ATTEMPTS, + GNR_DHT_CACHING_SUCCESSFUL, + GNR_DHT_CACHING_PARTIALLY_SUCCESSFUL, + GNR_DHT_KEY_OFFLOADING_CHECKS, + GNR_DHT_KEYS_SELECTED_FOR_OFFLOADING, + GNR_DHT_KEY_OFFLOADING_ATTEMPTS, + GNR_DHT_KEY_OFFLOADING_SUCCESSFUL, + GNR_DHT_KEY_OFFLOADING_PARTIALLY_SUCCESSFUL, + GNR_DHT_VALUES_OFFLOADED, + GNR_DHT_MSG_RECEIVED, + GNR_DHT_MSG_MATCHING_CONTACT_ADDRESS, + GNR_DHT_MSG_FIXED_CONTACT_ADDRESS, + GNR_DHT_MSG_FROM_HOSTILE_ADDRESS, + GNR_DHT_MSG_FROM_HOSTILE_CONTACT_ADDRESS, + GNR_DHT_RPC_MSG_PREPARED, + GNR_DHT_RPC_MSG_CANCELLED, + GNR_DHT_RPC_TIMED_OUT, + GNR_DHT_RPC_REPLIES_RECEIVED, + GNR_DHT_RPC_REPLIES_FIXED_CONTACT, + GNR_DHT_RPC_LATE_REPLIES_RECEIVED, + GNR_DHT_RPC_KUID_REPLY_MISMATCH, + GNR_DHT_RPC_RECENT_NODES_HELD, + GNR_DHT_NODE_VERIFICATIONS, + GNR_DHT_PUBLISHING_ATTEMPTS, + GNR_DHT_PUBLISHING_SUCCESSFUL, + GNR_DHT_PUBLISHING_PARTIALLY_SUCCESSFUL, + GNR_DHT_PUBLISHING_SATISFACTORY, + GNR_DHT_REPUBLISHED_LATE, + GNR_DHT_PUBLISHING_TO_SELF, + GNR_DHT_PUBLISHING_BG_ATTEMPTS, + GNR_DHT_PUBLISHING_BG_IMPROVEMENTS, + GNR_DHT_PUBLISHING_BG_SUCCESSFUL, + GNR_DHT_SHA1_DATA_TYPE_COLLISIONS, + GNR_DHT_PASSIVELY_PROTECTED_LOOKUP_PATH, + GNR_DHT_ACTIVELY_PROTECTED_LOOKUP_PATH, + GNR_DHT_ALT_LOC_LOOKUPS, + GNR_DHT_PUSH_PROXY_LOOKUPS, + GNR_DHT_SUCCESSFUL_ALT_LOC_LOOKUPS, + GNR_DHT_SUCCESSFUL_PUSH_PROXY_LOOKUPS, + GNR_DHT_SUCCESSFUL_NODE_PUSH_ENTRY_LOOKUPS, + GNR_DHT_SEEDING_OF_ORPHAN, + GNR_STATS_DIGEST, + GNR_STATS_TCP_DIGEST, + GNR_STATS_UDP_DIGEST, + + GNR_TYPE_COUNT +} gnr_stats_t; + +const char *gnet_stats_general_to_string(gnr_stats_t x); + +const char *gnet_stats_general_description(gnr_stats_t x); + +#endif /* _if_gen_gnr_stats_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/http_async.c
Added
@@ -0,0 +1,54 @@ +/* + * Generated on Sat Apr 5 12:17:58 2014 by enum-msg.pl -- DO NOT EDIT + * + * Command: ../../../scripts/enum-msg.pl http_async.lst + */ + +#include "common.h" + +#include "http_async.h" + +#include "lib/str.h" +#include "lib/override.h" /* Must be the last header included */ + +/* + * English descriptions for http_async_error_t. + */ +static const char *http_async_error_str = { + "OK", + "Invalid HTTP URL", + "Connection failed", + "I/O error", + "Request too large", + "Header too large", + "User cancel", + "Got EOF", + "Unparseable HTTP status", + "Got moved status", + "Connection timeout", + "Data timeout", + "Nested redirection", + "Invalid URI in Location header", + "Connection was closed", + "Redirected", + "Unparseable header value", + "Data too large", + "Mandatory request not understood", +}; + +/** + * @return the English description of the enum value. + */ +const char * +http_async_strerror(http_async_error_t x) +{ + if G_UNLIKELY(UNSIGNED(x) >= N_ITEMS(http_async_error_str)) { + str_t *s = str_private(G_STRFUNC, 80); + str_printf(s, "Invalid http_async_error_t code: %d", (int) x); + return str_2c(s); + } + + return http_async_error_strx; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/http_async.h
Added
@@ -0,0 +1,39 @@ +/* + * Generated on Sat Apr 5 12:17:58 2014 by enum-msg.pl -- DO NOT EDIT + * + * Command: ../../../scripts/enum-msg.pl http_async.lst + */ + +#ifndef _if_gen_http_async_h_ +#define _if_gen_http_async_h_ + +/* + * Enum count: 19 + */ +typedef enum { + HTTP_ASYNC_OK = 0, + HTTP_ASYNC_BAD_URL, + HTTP_ASYNC_CONN_FAILED, + HTTP_ASYNC_IO_ERROR, + HTTP_ASYNC_REQ2BIG, + HTTP_ASYNC_HEAD2BIG, + HTTP_ASYNC_CANCELLED, + HTTP_ASYNC_EOF, + HTTP_ASYNC_BAD_STATUS, + HTTP_ASYNC_NO_LOCATION, + HTTP_ASYNC_CONN_TIMEOUT, + HTTP_ASYNC_TIMEOUT, + HTTP_ASYNC_NESTED, + HTTP_ASYNC_BAD_LOCATION_URI, + HTTP_ASYNC_CLOSED, + HTTP_ASYNC_REDIRECTED, + HTTP_ASYNC_BAD_HEADER, + HTTP_ASYNC_DATA2BIG, + HTTP_ASYNC_MAN_FAILURE +} http_async_error_t; + +const char *http_async_strerror(http_async_error_t x); + +#endif /* _if_gen_http_async_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/http_async.lst
Added
@@ -0,0 +1,38 @@ +# +# Asynchronous request error codes +# + +Prefix: HTTP_ASYNC_ +Lowercase: no +I18N: no +#Count: +Enum: http_async_error_t +Enum-Init: 0 +Enum-File: http_async.h +#Symbolic: +Description: http_async_error_str +#Enum-To-Symbolic: +Enum-To-Description: http_async_strerror +Enum-To-Code: http_async.c +Enum-To-Header: http_async.h +Protection-Prefix: if_gen + +OK "OK" +BAD_URL "Invalid HTTP URL" +CONN_FAILED "Connection failed" +IO_ERROR "I/O error" +REQ2BIG "Request too large" +HEAD2BIG "Header too large" +CANCELLED "User cancel" +EOF "Got EOF" +BAD_STATUS "Unparseable HTTP status" +NO_LOCATION "Got moved status" +CONN_TIMEOUT "Connection timeout" +TIMEOUT "Data timeout" +NESTED "Nested redirection" +BAD_LOCATION_URI "Invalid URI in Location header" +CLOSED "Connection was closed" +REDIRECTED "Redirected" +BAD_HEADER "Unparseable header value" +DATA2BIG "Data too large" +MAN_FAILURE "Mandatory request not understood"
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/http_url.c
Added
@@ -0,0 +1,44 @@ +/* + * Generated on Sat Apr 5 12:40:52 2014 by enum-msg.pl -- DO NOT EDIT + * + * Command: ../../../scripts/enum-msg.pl http_url.lst + */ + +#include "common.h" + +#include "http_url.h" + +#include "lib/str.h" +#include "lib/override.h" /* Must be the last header included */ + +/* + * English descriptions for http_url_error_t. + */ +static const char *http_url_error_str = { + "OK", + "Not an http URI", + "More than one <user>:<password>", + "Truncated <user>:<password>", + "Could not parse port", + "Port value is out of range", + "Could not parse host", + "Could not resolve host into IP", + "URL has no URI part", +}; + +/** + * @return the English description of the enum value. + */ +const char * +http_url_strerror(http_url_error_t x) +{ + if G_UNLIKELY(UNSIGNED(x) >= N_ITEMS(http_url_error_str)) { + str_t *s = str_private(G_STRFUNC, 80); + str_printf(s, "Invalid http_url_error_t code: %d", (int) x); + return str_2c(s); + } + + return http_url_error_strx; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/http_url.h
Added
@@ -0,0 +1,29 @@ +/* + * Generated on Sat Apr 5 12:40:52 2014 by enum-msg.pl -- DO NOT EDIT + * + * Command: ../../../scripts/enum-msg.pl http_url.lst + */ + +#ifndef _if_gen_http_url_h_ +#define _if_gen_http_url_h_ + +/* + * Enum count: 9 + */ +typedef enum { + HTTP_URL_OK = 0, + HTTP_URL_NOT_HTTP, + HTTP_URL_MULTIPLE_CREDENTIALS, + HTTP_URL_BAD_CREDENTIALS, + HTTP_URL_BAD_PORT_PARSING, + HTTP_URL_BAD_PORT_RANGE, + HTTP_URL_BAD_HOST_PART, + HTTP_URL_HOSTNAME_UNKNOWN, + HTTP_URL_MISSING_URI +} http_url_error_t; + +const char *http_url_strerror(http_url_error_t x); + +#endif /* _if_gen_http_url_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/http_url.lst
Added
@@ -0,0 +1,28 @@ +# +# HTTP URL parsing error codes +# + +Prefix: HTTP_URL_ +Lowercase: no +I18N: no +#Count: +Enum: http_url_error_t +Enum-Init: 0 +Enum-File: http_url.h +#Symbolic: +Description: http_url_error_str +#Enum-To-Symbolic: +Enum-To-Description: http_url_strerror +Enum-To-Code: http_url.c +Enum-To-Header: http_url.h +Protection-Prefix: if_gen + +OK "OK" +NOT_HTTP "Not an http URI" +MULTIPLE_CREDENTIALS "More than one <user>:<password>" +BAD_CREDENTIALS "Truncated <user>:<password>" +BAD_PORT_PARSING "Could not parse port" +BAD_PORT_RANGE "Port value is out of range" +BAD_HOST_PART "Could not parse host" +HOSTNAME_UNKNOWN "Could not resolve host into IP" +MISSING_URI "URL has no URI part"
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/ignore.c
Added
@@ -0,0 +1,43 @@ +/* + * Generated on Sat Apr 5 13:52:34 2014 by enum-msg.pl -- DO NOT EDIT + * + * Command: ../../../scripts/enum-msg.pl ignore.lst + */ + +#include "common.h" + +#include "ignore.h" + +#include "lib/str.h" +#include "lib/override.h" /* Must be the last header included */ + +/* + * English descriptions for ignore_val_t. + */ +static const char *ignore_val_str = { + "Not ignored", + "SHA1", + "Name & Size", + "Already owned", + "Hostile IP", + "Points to ourselves", + "Country limit", + "Known spam", +}; + +/** + * @return the English description of the enum value. + */ +const char * +ignore_reason_to_string(ignore_val_t x) +{ + if G_UNLIKELY(UNSIGNED(x) >= N_ITEMS(ignore_val_str)) { + str_t *s = str_private(G_STRFUNC, 80); + str_printf(s, "Invalid ignore_val_t code: %d", (int) x); + return str_2c(s); + } + + return ignore_val_strx; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/ignore.h
Added
@@ -0,0 +1,28 @@ +/* + * Generated on Sat Apr 5 13:52:34 2014 by enum-msg.pl -- DO NOT EDIT + * + * Command: ../../../scripts/enum-msg.pl ignore.lst + */ + +#ifndef _if_gen_ignore_h_ +#define _if_gen_ignore_h_ + +/* + * Enum count: 8 + */ +typedef enum { + IGNORE_FALSE = 0, + IGNORE_SHA1, + IGNORE_NAMESIZE, + IGNORE_LIBRARY, + IGNORE_HOSTILE, + IGNORE_OURSELVES, + IGNORE_LIMIT, + IGNORE_SPAM +} ignore_val_t; + +const char *ignore_reason_to_string(ignore_val_t x); + +#endif /* _if_gen_ignore_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/ignore.lst
Added
@@ -0,0 +1,27 @@ +# +# Download ignore codes +# + +Prefix: IGNORE_ +Lowercase: no +I18N: no +#Count: +Enum: ignore_val_t +Enum-Init: 0 +Enum-File: ignore.h +#Symbolic: +Description: ignore_val_str +#Enum-To-Symbolic: +Enum-To-Description: ignore_reason_to_string +Enum-To-Code: ignore.c +Enum-To-Header: ignore.h +Protection-Prefix: if_gen + +FALSE "Not ignored" +SHA1 "SHA1" +NAMESIZE "Name & Size" +LIBRARY "Already owned" +HOSTILE "Hostile IP" +OURSELVES "Points to ourselves" +LIMIT "Country limit" +SPAM "Known spam"
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/iprange.c
Added
@@ -0,0 +1,41 @@ +/* + * Generated on Sat Apr 19 17:20:54 2014 by enum-msg.pl -- DO NOT EDIT + * + * Command: ../../../scripts/enum-msg.pl iprange.lst + */ + +#include "common.h" + +#include "iprange.h" + +#include "lib/str.h" +#include "lib/override.h" /* Must be the last header included */ + +/* + * English descriptions for iprange_err_t. + */ +static const char *iprange_error_str = { + "OK", + "Incorrect network prefix", + "CIDR range clash", + "Duplicate range", + "Range is subnet of existing range", + "Range is overlapping existing range", +}; + +/** + * @return the English description of the enum value. + */ +const char * +iprange_strerror(iprange_err_t x) +{ + if G_UNLIKELY(UNSIGNED(x) >= N_ITEMS(iprange_error_str)) { + str_t *s = str_private(G_STRFUNC, 80); + str_printf(s, "Invalid iprange_err_t code: %d", (int) x); + return str_2c(s); + } + + return iprange_error_strx; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/iprange.h
Added
@@ -0,0 +1,26 @@ +/* + * Generated on Sat Apr 19 17:20:54 2014 by enum-msg.pl -- DO NOT EDIT + * + * Command: ../../../scripts/enum-msg.pl iprange.lst + */ + +#ifndef _if_gen_iprange_h_ +#define _if_gen_iprange_h_ + +/* + * Enum count: 6 + */ +typedef enum { + IPR_ERR_OK = 0, + IPR_ERR_BAD_PREFIX, + IPR_ERR_RANGE_CLASH, + IPR_ERR_RANGE_DUP, + IPR_ERR_RANGE_SUBNET, + IPR_ERR_RANGE_OVERLAP +} iprange_err_t; + +const char *iprange_strerror(iprange_err_t x); + +#endif /* _if_gen_iprange_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/iprange.lst
Added
@@ -0,0 +1,25 @@ +# +# IP CIDR range specification parsing errors +# + +Prefix: IPR_ERR_ +Lowercase: no +I18N: no +#Count: +Enum: iprange_err_t +Enum-Init: 0 +Enum-File: iprange.h +#Symbolic: +Description: iprange_error_str +#Enum-To-Symbolic: +Enum-To-Description: iprange_strerror +Enum-To-Code: iprange.c +Enum-To-Header: iprange.h +Protection-Prefix: if_gen + +OK "OK" +BAD_PREFIX "Incorrect network prefix" +RANGE_CLASH "CIDR range clash" +RANGE_DUP "Duplicate range" +RANGE_SUBNET "Range is subnet of existing range" +RANGE_OVERLAP "Range is overlapping existing range"
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/msg.c
Added
@@ -0,0 +1,74 @@ +/* + * Generated on Sat Apr 5 12:09:15 2014 by enum-msg.pl -- DO NOT EDIT + * + * Command: ../../../scripts/enum-msg.pl msg.lst + */ + +#include "common.h" + +#include "msg.h" + +#include "lib/str.h" +#include "lib/override.h" /* Must be the last header included */ + +/* + * English descriptions for msg_type_t. + */ +static const char *msg_type_description = { + N_("Unknown"), + N_("Ping"), + N_("Pong"), + N_("Bye"), + N_("QRP"), + N_("HSEP"), + N_("RUDP"), + N_("Vendor spec."), + N_("Vendor std."), + N_("Push"), + N_("Query"), + N_("Query hit"), + N_("DHT (truncated)"), + N_("DHT Ping"), + N_("DHT Pong"), + N_("DHT Store"), + N_("DHT Store Ack"), + N_("DHT Find Node"), + N_("DHT Found Node"), + N_("DHT Find Value"), + N_("DHT Value"), + N_("G2 Crawl Request"), + N_("G2 Hub Advertisement"), + N_("G2 Hub List"), + N_("G2 Hub List Req"), + N_("G2 Hub List Ack"), + N_("G2 Local Node Info"), + N_("G2 Ping"), + N_("G2 Pong"), + N_("G2 Push"), + N_("G2 Query Key Ack"), + N_("G2 Query Key Req"), + N_("G2 Query"), + N_("G2 Query Ack"), + N_("G2 Query Hit"), + N_("G2 Query Hash Table"), + N_("G2 User Profile Check"), + N_("G2 User Profile Data"), + N_("Total"), +}; + +/** + * @return the English description of the enum value. + */ +const char * +gnet_msg_type_description(msg_type_t x) +{ + if G_UNLIKELY(UNSIGNED(x) >= N_ITEMS(msg_type_description)) { + str_t *s = str_private(G_STRFUNC, 80); + str_printf(s, "Invalid msg_type_t code: %d", (int) x); + return str_2c(s); + } + + return msg_type_descriptionx; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/msg.h
Added
@@ -0,0 +1,61 @@ +/* + * Generated on Sat Apr 5 12:09:15 2014 by enum-msg.pl -- DO NOT EDIT + * + * Command: ../../../scripts/enum-msg.pl msg.lst + */ + +#ifndef _if_gen_msg_h_ +#define _if_gen_msg_h_ + +/* + * Enum count: 39 + */ +typedef enum { + MSG_UNKNOWN = 0, + MSG_INIT, + MSG_INIT_RESPONSE, + MSG_BYE, + MSG_QRP, + MSG_HSEP, + MSG_RUDP, + MSG_VENDOR, + MSG_STANDARD, + MSG_PUSH_REQUEST, + MSG_SEARCH, + MSG_SEARCH_RESULTS, + MSG_DHT, + MSG_DHT_PING, + MSG_DHT_PONG, + MSG_DHT_STORE, + MSG_DHT_STORE_ACK, + MSG_DHT_FIND_NODE, + MSG_DHT_FOUND_NODE, + MSG_DHT_FIND_VALUE, + MSG_DHT_VALUE, + MSG_G2_CRAWLR, + MSG_G2_HAW, + MSG_G2_KHL, + MSG_G2_KHLR, + MSG_G2_KHLA, + MSG_G2_LNI, + MSG_G2_PI, + MSG_G2_PO, + MSG_G2_PUSH, + MSG_G2_QKA, + MSG_G2_QKR, + MSG_G2_Q2, + MSG_G2_QA, + MSG_G2_QH2, + MSG_G2_QHT, + MSG_G2_UPROC, + MSG_G2_UPROD, + MSG_TOTAL, + + MSG_TYPE_COUNT +} msg_type_t; + +const char *gnet_msg_type_description(msg_type_t x); + +#endif /* _if_gen_msg_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/msg.lst
Added
@@ -0,0 +1,80 @@ +# +# Message types, for accounting purposes +# + +Prefix: MSG_ +Lowercase: no +I18N: yes +Count: TYPE_COUNT +Enum: msg_type_t +Enum-Init: 0 +Enum-File: msg.h +#Symbolic: +Description: msg_type_description +#Enum-To-Symbolic: +Enum-To-Description: gnet_msg_type_description +Enum-To-Code: msg.c +Enum-To-Header: msg.h +Protection-Prefix: if_gen + +### +### Catch-all for unknown messages +### + +UNKNOWN "Unknown" + +### +### Gnutella messages +### + +INIT "Ping" +INIT_RESPONSE "Pong" +BYE "Bye" +QRP "QRP" +HSEP "HSEP" +RUDP "RUDP" +VENDOR "Vendor spec." +STANDARD "Vendor std." +PUSH_REQUEST "Push" +SEARCH "Query" +SEARCH_RESULTS "Query hit" + +### +### DHT messages (expanded Gnutella "DHT" messages) +### + +DHT "DHT (truncated)" +DHT_PING "DHT Ping" +DHT_PONG "DHT Pong" +DHT_STORE "DHT Store" +DHT_STORE_ACK "DHT Store Ack" +DHT_FIND_NODE "DHT Find Node" +DHT_FOUND_NODE "DHT Found Node" +DHT_FIND_VALUE "DHT Find Value" +DHT_VALUE "DHT Value" + +### +### G2 messages +### + +# Not including CRAWLA -- not expected as we don't send requests +G2_CRAWLR "G2 Crawl Request" +G2_HAW "G2 Hub Advertisement" +G2_KHL "G2 Hub List" +G2_KHLR "G2 Hub List Req" +G2_KHLA "G2 Hub List Ack" +G2_LNI "G2 Local Node Info" +G2_PI "G2 Ping" +G2_PO "G2 Pong" +G2_PUSH "G2 Push" +G2_QKA "G2 Query Key Ack" +G2_QKR "G2 Query Key Req" +G2_Q2 "G2 Query" +G2_QA "G2 Query Ack" +G2_QH2 "G2 Query Hit" +G2_QHT "G2 Query Hash Table" +G2_UPROC "G2 User Profile Check" +G2_UPROD "G2 User Profile Data" + +# Always counted, for all the above message types +TOTAL "Total"
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/msg_drop.c
Added
@@ -0,0 +1,158 @@ +/* + * Generated on Sat Apr 5 12:09:15 2014 by enum-msg.pl -- DO NOT EDIT + * + * Command: ../../../scripts/enum-msg.pl drop.lst + */ + +#include "common.h" + +#include "msg_drop.h" + +#include "lib/str.h" +#include "lib/override.h" /* Must be the last header included */ + +/* + * Symbolic descriptions for msg_drop_reason_t. + */ +static const char *msg_drop_reasons = { + "bad_size", + "too_small", + "too_large", + "way_too_large", + "too_old", + "unknown_type", + "unexpected", + "ttl0", + "improper_hops_ttl", + "max_ttl_exceeded", + "throttle", + "limit", + "transient", + "pong_unusable", + "hard_ttl_limit", + "max_hop_count", + "route_lost", + "no_route", + "duplicate", + "oob_proxy_conflict", + "to_banned", + "from_banned", + "shutdown", + "flow_control", + "query_no_nul", + "query_too_short", + "query_overhead", + "bad_urn", + "malformed_sha1", + "malformed_utf_8", + "bad_result", + "bad_return_address", + "hostile_ip", + "shunned_ip", + "morpheus_bogus", + "spam", + "evil", + "media", + "inflate_error", + "unknown_header_flags", + "own_result", + "own_query", + "ancient_query", + "blank_servent_id", + "guess_missing_token", + "guess_invalid_token", + "dht_invalid_token", + "dht_too_many_store", + "dht_unparseable", + "g2_unexpected", + "network_crossing", +}; + +/** + * @return the symbolic description of the enum value. + */ +const char * +gnet_stats_drop_reason_name(msg_drop_reason_t x) +{ + if G_UNLIKELY(UNSIGNED(x) >= N_ITEMS(msg_drop_reasons)) { + str_t *s = str_private(G_STRFUNC, 80); + str_printf(s, "Invalid msg_drop_reason_t code: %d", (int) x); + return str_2c(s); + } + + return msg_drop_reasonsx; +} + +/* + * English descriptions for msg_drop_reason_t. + */ +static const char *msg_drop_reason_text = { + N_("Bad size"), + N_("Too small"), + N_("Too large"), + N_("Way too large"), + N_("Too old"), + N_("Unknown message type"), + N_("Unexpected message"), + N_("Message sent with TTL = 0"), + N_("Improper hops/ttl combination"), + N_("Max TTL exceeded"), + N_("Message throttle"), + N_("Message matched limits"), + N_("Transient node"), + N_("Unusable Pong"), + N_("Hard TTL limit reached"), + N_("Max hop count reached"), + N_("Route lost"), + N_("No route"), + N_("Duplicate message"), + N_("OOB Proxy MUID Conflict"), + N_("Message to banned GUID"), + N_("Message from banned GUID"), + N_("Node shutting down"), + N_("TX flow control"), + N_("Query text had no trailing NUL"), + N_("Query text too short"), + N_("Query had unnecessary overhead"), + N_("Query had bad URN"), + N_("Message with malformed SHA1"), + N_("Message with malformed UTF-8"), + N_("Malformed Query Hit"), + N_("Bad return address"), + N_("Hostile IP address"), + N_("Shunned IP address"), + N_("Bogus result from Morpheus"), + N_("Spam"), + N_("Evil filename"), + N_("Improper media type"), + N_("Payload inflating error"), + N_("Unknown header flags present"), + N_("Own search results"), + N_("Own queries"), + N_("Ancient query format"), + N_("Blank Servent ID"), + N_("GUESS Query missing token"), + N_("GUESS Invalid query token"), + N_("DHT Invalid security token"), + N_("DHT Too many STORE requests"), + N_("DHT Malformed message"), + N_("G2 Unexpected message"), + N_("Cannot cross networks"), +}; + +/** + * @return the English description of the enum value. + */ +const char * +gnet_stats_drop_reason_to_string(msg_drop_reason_t x) +{ + if G_UNLIKELY(UNSIGNED(x) >= N_ITEMS(msg_drop_reason_text)) { + str_t *s = str_private(G_STRFUNC, 80); + str_printf(s, "Invalid msg_drop_reason_t code: %d", (int) x); + return str_2c(s); + } + + return msg_drop_reason_textx; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/msg_drop.h
Added
@@ -0,0 +1,75 @@ +/* + * Generated on Sat Apr 5 12:09:15 2014 by enum-msg.pl -- DO NOT EDIT + * + * Command: ../../../scripts/enum-msg.pl drop.lst + */ + +#ifndef _if_gen_msg_drop_h_ +#define _if_gen_msg_drop_h_ + +/* + * Enum count: 51 + */ +typedef enum { + MSG_DROP_BAD_SIZE = 0, + MSG_DROP_TOO_SMALL, + MSG_DROP_TOO_LARGE, + MSG_DROP_WAY_TOO_LARGE, + MSG_DROP_TOO_OLD, + MSG_DROP_UNKNOWN_TYPE, + MSG_DROP_UNEXPECTED, + MSG_DROP_TTL0, + MSG_DROP_IMPROPER_HOPS_TTL, + MSG_DROP_MAX_TTL_EXCEEDED, + MSG_DROP_THROTTLE, + MSG_DROP_LIMIT, + MSG_DROP_TRANSIENT, + MSG_DROP_PONG_UNUSABLE, + MSG_DROP_HARD_TTL_LIMIT, + MSG_DROP_MAX_HOP_COUNT, + MSG_DROP_ROUTE_LOST, + MSG_DROP_NO_ROUTE, + MSG_DROP_DUPLICATE, + MSG_DROP_OOB_PROXY_CONFLICT, + MSG_DROP_TO_BANNED, + MSG_DROP_FROM_BANNED, + MSG_DROP_SHUTDOWN, + MSG_DROP_FLOW_CONTROL, + MSG_DROP_QUERY_NO_NUL, + MSG_DROP_QUERY_TOO_SHORT, + MSG_DROP_QUERY_OVERHEAD, + MSG_DROP_BAD_URN, + MSG_DROP_MALFORMED_SHA1, + MSG_DROP_MALFORMED_UTF_8, + MSG_DROP_BAD_RESULT, + MSG_DROP_BAD_RETURN_ADDRESS, + MSG_DROP_HOSTILE_IP, + MSG_DROP_SHUNNED_IP, + MSG_DROP_MORPHEUS_BOGUS, + MSG_DROP_SPAM, + MSG_DROP_EVIL, + MSG_DROP_MEDIA, + MSG_DROP_INFLATE_ERROR, + MSG_DROP_UNKNOWN_HEADER_FLAGS, + MSG_DROP_OWN_RESULT, + MSG_DROP_OWN_QUERY, + MSG_DROP_ANCIENT_QUERY, + MSG_DROP_BLANK_SERVENT_ID, + MSG_DROP_GUESS_MISSING_TOKEN, + MSG_DROP_GUESS_INVALID_TOKEN, + MSG_DROP_DHT_INVALID_TOKEN, + MSG_DROP_DHT_TOO_MANY_STORE, + MSG_DROP_DHT_UNPARSEABLE, + MSG_DROP_G2_UNEXPECTED, + MSG_DROP_NETWORK_CROSSING, + + MSG_DROP_REASON_COUNT +} msg_drop_reason_t; + +const char *gnet_stats_drop_reason_name(msg_drop_reason_t x); + +const char *gnet_stats_drop_reason_to_string(msg_drop_reason_t x); + +#endif /* _if_gen_msg_drop_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/stats.lst
Added
@@ -0,0 +1,415 @@ +# +# General statistics +# + +Prefix: GNR_ +Lowercase: yes +I18N: yes +Count: TYPE_COUNT +Enum: gnr_stats_t +Enum-Init: 0 +Enum-File: gnr_stats.h +Symbolic: stats_symbols +Description: stats_text +Enum-To-Symbolic: gnet_stats_general_to_string +Enum-To-Description: gnet_stats_general_description +Enum-To-Code: gnr_stats.c +Enum-To-Header: gnr_stats.h +Protection-Prefix: if_gen + +ROUTING_ERRORS "Routing errors" +ROUTING_TABLE_CHUNKS "Routing table chunks" +ROUTING_TABLE_CAPACITY "Routing table message capacity" +ROUTING_TABLE_COUNT "Routing table message count" +ROUTING_TRANSIENT_AVOIDED "Routing through transient node avoided" +DUPS_WITH_HIGHER_TTL "Duplicates with higher TTL" +SPAM_SHA1_HITS "SPAM SHA1 database hits" +SPAM_NAME_HITS "SPAM filename and size hits" +SPAM_FAKE_HITS "SPAM fake hits" +SPAM_DUP_HITS "SPAM duplicate hits" +SPAM_CAUGHT_HOSTILE_IP "SPAM dynamically caught hostile IP addresses" +SPAM_CAUGHT_HOSTILE_HELD "SPAM dynamically caught hostile IP held" +SPAM_IP_HELD "SPAM spotted spamming IP addresses held" +LOCAL_SEARCHES "Searches to local DB" +LOCAL_HITS "Hits on local DB" +LOCAL_PARTIAL_HITS "Hits on local partial files" +LOCAL_WHATS_NEW_HITS "Hits on \"what's new?\" queries" +LOCAL_QUERY_HITS "Query hits received for local queries" +LOCAL_G2_SEARCHES "G2 searches to local DB" +LOCAL_G2_HITS "G2 hits on local DB" +LOCAL_G2_PARTIAL_HITS "G2 hits on local partial files" +OOB_PROXIED_QUERY_HITS "Query hits received for OOB-proxied queries" +OOB_QUERIES "Queries requesting OOB hit delivery" +OOB_QUERIES_STRIPPED "Stripped OOB flag on queries" +OOB_QUERIES_IGNORED "Ignored OOB queries due to unclaimed hits" +QUERY_OOB_PROXIED_DUPS "Duplicate OOB-proxied queries" +OOB_HITS_FOR_PROXIED_QUERIES "OOB hits received for OOB-proxied queries" +OOB_HITS_WITH_ALIEN_IP "OOB hits bearing alien IP address" +OOB_HITS_IGNORED_ON_SPAMMER_HIT + "OOB hits ignored due to identified spamming address" +OOB_HITS_IGNORED_ON_UNSECURE_HIT + "OOB hits ignored due to unsecure promise from known secure host" +UNCLAIMED_OOB_HITS "Unclaimed locally-generated OOB hits" +PARTIALLY_CLAIMED_OOB_HITS "Partially claimed locally-generated OOB hits" +SPURIOUS_OOB_HIT_CLAIM "Spurious OOB hit claiming received" +UNREQUESTED_OOB_HITS "Unrequested OOB hits received" +QUERY_HIT_FOR_UNTRACKED_QUERY "Received query hits for untracked queries" +QUERY_TRACKED_MUIDS "Tracked query MUIDs" +QUERY_COMPACT_COUNT "Compacted queries" +QUERY_COMPACT_SIZE "Bytes saved by compacting" +QUERY_UTF8 "UTF8 queries" +QUERY_SHA1 "SHA1 queries" +QUERY_WHATS_NEW "\"What's New?\" queries" +QUERY_G2_UTF8 "UTF8 G2 queries" +QUERY_G2_SHA1 "SHA1 G2 queries" +QUERY_GUESS "GUESS queries" +QUERY_GUESS_02 "GUESS queries (0.2)" +GUESS_LINK_CACHE "GUESS link cache size" +GUESS_CACHED_QUERY_KEYS_HELD "GUESS cached query keys held" +GUESS_CACHED_02_HOSTS_HELD "GUESS cached 0.2 hosts held" +GUESS_CACHED_G2_HOSTS_HELD "GUESS cached G2 hosts held" +GUESS_LOCAL_QUERIES "GUESS locally generated queries" +GUESS_LOCAL_RUNNING "GUESS currently running queries" +GUESS_LOCAL_QUERY_HITS "GUESS hits received for locally generated queries" +GUESS_ULTRA_QUERIED "GUESS ultra nodes queried" +GUESS_ULTRA_ACKNOWLEDGED "GUESS ultra nodes sending back an acknowledgment" +GUESS_G2_QUERIED "GUESS G2 nodes queried" +GUESS_G2_ACKNOWLEDGED "GUESS G2 nodes sending back an acknowledgment" +LOCAL_PUSH_THROTTLED "Throttled local push messages" +REMOTE_PUSH_THROTTLED "Throttled received push messages" +BROADCASTED_PUSHES "Broadcasted push messages" +PUSH_PROXY_UDP_RELAYED "Push-proxy UDP relayed messages" +PUSH_PROXY_TCP_RELAYED "Push-proxy TCP relayed messages" +PUSH_PROXY_TCP_FW2FW "Push-proxy TCP for FW<->FW transfers" +PUSH_PROXY_BROADCASTED "Push-proxy broadcasted messages" +PUSH_PROXY_ROUTE_NOT_PROXIED "Push-proxy found un-proxied local route" +PUSH_PROXY_FAILED "Push-proxy lookup failures" +PUSH_RELAYED_VIA_LOCAL_ROUTE "Push relayed via local route" +PUSH_RELAYED_VIA_TABLE_ROUTE "Push relayed via routing table" +LOCAL_DYN_QUERIES "Locally generated dynamic queries" +LEAF_DYN_QUERIES "Leaf-generated dynamic queries" +OOB_PROXIED_QUERIES "OOB-proxied leaf queries" +DYN_QUERIES_COMPLETED_FULL "Fully completed dynamic queries" +DYN_QUERIES_COMPLETED_PARTIAL "Partially completed dynamic queries" +DYN_QUERIES_COMPLETED_ZERO "Dynamic queries ended with no results" +DYN_QUERIES_LINGER_EXTRA + "Fully completed dynamic queries getting late results" +DYN_QUERIES_LINGER_RESULTS "Dynamic queries with partial late results" +DYN_QUERIES_LINGER_COMPLETED "Dynamic queries completed by late results" +GTKG_TOTAL_QUERIES "Queries seen from GTKG" +GTKG_REQUERIES "Queries seen from GTKG that were re-queries" +QUERIES_WITH_GGEP_H "Queries advertising support of GGEP \"H\"" +QUERIES_WITH_SR_UDP "Queries advertising support of semi-reliable UDP" +GIV_CALLBACKS "GIV callbacks received" +GIV_DISCARDED "GIV discarded due to no suitable download" +QUEUE_CALLBACKS "QUEUE callbacks received" +QUEUE_DISCARDED "QUEUE discarded due to no suitable download" +BANNED_FDS_TOTAL "File descriptors banned running count" +UDP_READ_AHEAD_COUNT_SUM "UDP read-ahead datagram running count" +UDP_READ_AHEAD_BYTES_SUM "UDP read-ahead datagram running bytes" +UDP_READ_AHEAD_OLD_SUM "UDP read-ahead datagram \"old\" processed" +UDP_READ_AHEAD_COUNT_MAX "UDP read-ahead datagram max count" +UDP_READ_AHEAD_BYTES_MAX "UDP read-ahead datagram max bytes" +UDP_READ_AHEAD_DELAY_MAX "UDP read-ahead datagram max delay" +UDP_FW2FW_PUSHES "UDP push messages received for FW<->FW connections" +UDP_FW2FW_PUSHES_TO_SELF + "UDP push messages requesting FW<->FW connection with ourselves" +UDP_FW2FW_PUSHES_PATCHED "UDP push messages patched for FW<->FW connections" +UDP_UHC_PINGS "UDP UHC pings received" +UDP_UHC_PONGS "UDP UHC pongs sent" +UDP_BOGUS_SOURCE_IP "UDP messages with bogus source IP" +UDP_SHUNNED_SOURCE_IP "UDP messages from shunned IP (discarded)" +UDP_RX_TRUNCATED "UDP truncated incoming messages" +UDP_ALIEN_MESSAGE "Alien UDP messages (non-Gnutella)" +UDP_UNPROCESSED_MESSAGE "Unprocessed UDP Gnutella messages" +UDP_TX_COMPRESSED "Compressed UDP messages enqueued" +UDP_RX_COMPRESSED "Compressed UDP messages received" +UDP_COMPRESSION_ATTEMPTS "Candidates for UDP message compression" +UDP_LARGER_HENCE_NOT_COMPRESSED + "Uncompressed UDP messages due to no gain" +UDP_AMBIGUOUS "Ambiguous UDP messages received" +UDP_AMBIGUOUS_DEEPER_INSPECTION "Ambiguous UDP messages inspected more deeply" +UDP_AMBIGUOUS_AS_SEMI_RELIABLE + "Ambiguous UDP messages handled as semi-reliable UDP" +UDP_SR_TX_MESSAGES_GIVEN + "Semi-reliable UDP total messages given for transmission" +UDP_SR_TX_MESSAGES_DEFLATED "Semi-reliable UDP total messages deflated" +UDP_SR_TX_MESSAGES_UNSENT "Semi-reliable UDP total messages unsent" +UDP_SR_TX_MESSAGES_BANNED + "Semi-reliable UDP total messages dropped due to temporary ban" +UDP_SR_TX_MESSAGES_GOOD + "Semi-reliable UDP total messages sent to known responsive hosts" +UDP_SR_TX_MESSAGES_CLOGGING + "Semi-reliable UDP total messages partially sent due to clogging" +UDP_SR_TX_RELIABLE_MESSAGES_GIVEN + "Semi-reliable UDP reliable messages given for transmission" +UDP_SR_TX_RELIABLE_MESSAGES_SENT + "Semi-reliable UDP reliable messages correctly transmited" +UDP_SR_TX_RELIABLE_MESSAGES_UNSENT + "Semi-reliable UDP reliable messages not fully acknowledged" +UDP_SR_TX_FRAGMENTS_SENT "Semi-reliable UDP fragments sent" +UDP_SR_TX_FRAGMENTS_RESENT "Semi-reliable UDP fragments resent" +UDP_SR_TX_FRAGMENTS_SENDING_AVOIDED + "Semi-reliable UDP fragment sendings avoided" +UDP_SR_TX_FRAGMENTS_OVERSENT + "Semi-reliable UDP fragments sent too many times" +UDP_SR_TX_TOTAL_ACKS_RECEIVED + "Semi-reliable UDP total acknowledgments received" +UDP_SR_TX_CUMULATIVE_ACKS_RECEIVED + "Semi-reliable UDP cumulative acknowledgments received" +UDP_SR_TX_EXTENDED_ACKS_RECEIVED + "Semi-reliable UDP extended acknowledgments received" +UDP_SR_TX_SPURIOUS_ACKS_RECEIVED + "Semi-reliable UDP spurious acknowledgments received" +UDP_SR_TX_INVALID_ACKS_RECEIVED + "Semi-reliable UDP invalid acknowledgments received" +UDP_SR_TX_ACKS_REQUEUED + "Semi-reliable UDP acknowledgments re-queued for sending" +UDP_SR_TX_PLAIN_ACKS_DROPPED + "Semi-reliable UDP plain acknowledgments dropped" +UDP_SR_TX_ENHANCED_ACKS_DROPPED + "Semi-reliable UDP enhanced acknowledgments dropped" +UDP_SR_TX_PLAIN_ACKS_SENT + "Semi-reliable UDP plain acknowledgments transmitted" +UDP_SR_TX_CUMULATIVE_ACKS_SENT + "Semi-reliable UDP cumulative acknowledgments transmitted" +UDP_SR_TX_EXTENDED_ACKS_SENT + "Semi-reliable UDP extended acknowledgments transmitted" +UDP_SR_TX_EARS_SENT "Semi-reliable UDP EARs sent" +UDP_SR_TX_EARS_OVERSENT "Semi-reliable UDP too many EARs sent" +UDP_SR_TX_EAR_NACKS_RECEIVED + "Semi-reliable UDP EAR negative acknowledgments received" +UDP_SR_TX_EAR_FOLLOWED_BY_ACKS + "Semi-reliable UDP acknowledgments received after sending EARs" +UDP_SR_RX_FRAGMENTS_RECEIVED + "Semi-reliable UDP fragments received" +UDP_SR_RX_FRAGMENTS_DUPLICATE + "Semi-reliable UDP duplicate fragments received" +UDP_SR_RX_FRAGMENTS_UNRELIABLE + "Semi-reliable UDP unreliable fragments received" +UDP_SR_RX_FRAGMENTS_DROPPED + "Semi-reliable UDP dropped received fragments" +UDP_SR_RX_FRAGMENTS_LINGERING + "Semi-reliable UDP fragments received whilst lingering" +UDP_SR_RX_MESSAGES_EXPIRED + "Semi-reliable UDP messages expired before re-assembly" +UDP_SR_RX_MESSAGES_RECEIVED + "Semi-reliable UDP messages re-assembled completely" +UDP_SR_RX_MESSAGES_INFLATED + "Semi-reliable UDP messages inflated successfully" +UDP_SR_RX_MESSAGES_INFLATION_ERROR + "Semi-reliable UDP messages inflated incorrectly" +UDP_SR_RX_MESSAGES_UNRELIABLE + "Semi-reliable UDP unreliable messages received" +UDP_SR_RX_MESSAGES_EMPTY "Semi-reliable UDP empty messages received" +UDP_SR_RX_TOTAL_ACKS_SENT "Semi-reliable UDP total acknowledgments sent" +UDP_SR_RX_CUMULATIVE_ACKS_SENT + "Semi-reliable UDP cumulative acknowledgments sent" +UDP_SR_RX_EXTENDED_ACKS_SENT + "Semi-reliable UDP extended acknowledgments sent" +UDP_SR_RX_AVOIDED_ACKS "Semi-reliable UDP avoided acknowledgment sendings" +UDP_SR_RX_EARS_RECEIVED "Semi-reliable UDP EARs received" +UDP_SR_RX_EARS_FOR_UNKNOWN_MESSAGE + "Semi-reliable UDP EARs received for unknown message" +UDP_SR_RX_EARS_FOR_LINGERING_MESSAGE + "Semi-reliable UDP EARs received whilst lingering" +UDP_SR_RX_FROM_HOSTILE_IP + "Semi-reliable UDP fragments from hostile IP addresses" +UDP_G2_HITS_REROUTED_TO_HUB "UDP G2 hits rerouted to hub for delivery" +UDP_G2_HITS_UNDELIVERED "UDP G2 hits undelivered" +CONSOLIDATED_SERVERS + "Consolidated servers (after GUID and IP address linking)" +DUP_DOWNLOADS_IN_CONSOLIDATION + "Duplicate downloads found during server consolidation" +DISCOVERED_SERVER_GUID "Discovered server GUIDs" +CHANGED_SERVER_GUID "Changed server GUIDs" +GUID_COLLISIONS "Detected GUID collisions" +OWN_GUID_COLLISIONS "Detected collisions with our own GUID" +BANNED_GUID_HELD "GUID dynamically banned" +RECEIVED_KNOWN_FW_NODE_INFO + "Firewalled node info for known hosts received in upload requests" +REVITALIZED_PUSH_ROUTES "Revitalized PUSH routes" +COLLECTED_PUSH_PROXIES "Collected new PUSH proxies from other query hits" +ATTEMPTED_RESOURCE_SWITCHING + "Attempted download resource switching on completion" +ATTEMPTED_RESOURCE_SWITCHING_AFTER_ERROR + "Attempted download resource switching after error" +SUCCESSFUL_RESOURCE_SWITCHING + "Successful download resource switching (all kind)" +SUCCESSFUL_PLAIN_RESOURCE_SWITCHING + "Successful download resource switching between plain files" +SUCCESSFUL_RESOURCE_SWITCHING_AFTER_ERROR + "Successful download resource switching after error" +QUEUED_AFTER_SWITCHING "Actively queued after resource switching attempt" +SUNK_DATA "Sunk HTTP reply data on error codes" +IGNORED_DATA "Ignored downloaded data" +IGNORING_AFTER_MISMATCH "Ignoring requested after data mismatch" +IGNORING_TO_PRESERVE_CONNECTION "Ignoring requested to preserve connection" +IGNORING_DURING_AGGRESSIVE_SWARMING + "Ignoring requested due to aggressive swarming" +IGNORING_REFUSED + "Ignoring refused (data too large or server too slow)" +CLIENT_RESOURCE_SWITCHING "Client resource switching (all detected)" +CLIENT_PLAIN_RESOURCE_SWITCHING + "Client resource switching between plain files" +CLIENT_FOLLOWUP_AFTER_ERROR + "Client follow-up request after HTTP error was returned" +PARQ_SLOT_RESOURCE_SWITCHING + "PARQ client resource switching in slots (SHA-1 based)" +PARQ_RETRY_AFTER_VIOLATION "PARQ client retry-after violation" +PARQ_RETRY_AFTER_KICK_OUT + "PARQ client kicked out after too many retry-after violations" +PARQ_SLOT_LIMIT_OVERRIDES "PARQ upload slot limit overrides" +PARQ_QUICK_SLOTS_GRANTED "PARQ quick upload slots granted" +PARQ_QUEUE_SENDING_ATTEMPTS "PARQ QUEUE sending attempts" +PARQ_QUEUE_SENT "PARQ QUEUE messages sent" +PARQ_QUEUE_FOLLOW_UPS "PARQ QUEUE follow-up requests received" +SHA1_VERIFICATIONS "Launched SHA-1 file verifications" +TTH_VERIFICATIONS "Launched TTH file verifications" +QHIT_SEEDING_OF_ORPHAN "Re-seeding of orphan downloads through query hits" +UPLOAD_SEEDING_OF_ORPHAN + "Re-seeding of orphan downloads through upload requests" +RUDP_TX_BYTES "RUDP sent bytes" +RUDP_RX_BYTES "RUDP received bytes" +DHT_ESTIMATED_SIZE "DHT estimated amount of nodes" +DHT_ESTIMATED_SIZE_STDERR "DHT standard error of estimated amount of nodes" +DHT_KBALL_THEORETICAL "DHT k-ball theoretical frontier (bits)" +DHT_KBALL_FURTHEST "DHT k-ball furthest frontier (bits)" +DHT_KBALL_CLOSEST "DHT k-ball closeest frontier (bits)" +DHT_ROUTING_BUCKETS "DHT routing table buckets" +DHT_ROUTING_LEAVES "DHT routing table leaves" +DHT_ROUTING_MAX_DEPTH "DHT routing table maximum depth" +DHT_ROUTING_GOOD_NODES "DHT routing table good nodes" +DHT_ROUTING_STALE_NODES "DHT routing table stale nodes" +DHT_ROUTING_PENDING_NODES "DHT routing table pending nodes" +DHT_ROUTING_EVICTED_NODES "DHT routing table evicted nodes" +DHT_ROUTING_EVICTED_FIREWALLED_NODES + "DHT routing table evicted firewalled nodes" +DHT_ROUTING_EVICTED_QUOTA_NODES + "DHT routing table evicted nodes due to quota" +DHT_ROUTING_PROMOTED_PENDING_NODES + "DHT routing table promoted pending nodes" +DHT_ROUTING_PINGED_PROMOTED_NODES + "DHT routing table pinged promoted nodes" +DHT_ROUTING_REJECTED_NODE_BUCKET_QUOTA + "DHT routing table rejected node due to bucket network quota" +DHT_ROUTING_REJECTED_NODE_GLOBAL_QUOTA + "DHT routing table rejected node due to global network quota" +DHT_COMPLETED_BUCKET_REFRESH "DHT completed bucket refreshes" +DHT_FORCED_BUCKET_REFRESH "DHT forced bucket refreshes" +DHT_FORCED_BUCKET_MERGE "DHT forced bucket merges" +DHT_BUCKET_MERGE "DHT bucket merges" +DHT_BUCKET_SPLIT "DHT bucket splits" +DHT_DENIED_UNSPLITABLE_BUCKET_REFRESH + "DHT denied non-splitable bucket refresh" +DHT_BUCKET_ALIVE_CHECK "DHT initiated bucket alive checks" +DHT_ALIVE_PINGS_TO_GOOD_NODES "DHT alive pings sent to good nodes" +DHT_ALIVE_PINGS_TO_STALE_NODES "DHT alive pings sent to stale nodes" +DHT_ALIVE_PINGS_TO_SHUTDOWNING_NODES + "DHT alive pings sent to shutdowning nodes" +DHT_ALIVE_PINGS_AVOIDED "DHT alive pings avoided" +DHT_ALIVE_PINGS_SKIPPED "DHT alive pings skipped" +DHT_REVITALIZED_STALE_NODES "DHT revitalized stale nodes on RPC reply" +DHT_REJECTED_VALUE_ON_QUOTA + "DHT value store rejected on IP/network quota grounds" +DHT_REJECTED_VALUE_ON_CREATOR + "DHT value store rejected on creator validation grounds" +DHT_LOOKUP_REJECTED_NODE_ON_NET_QUOTA + "DHT nodes rejected during lookup based on network quota" +DHT_LOOKUP_REJECTED_NODE_ON_PROXIMITY + "DHT nodes rejected during lookup based on suspicious proximity" +DHT_LOOKUP_REJECTED_NODE_ON_DIVERGENCE + "DHT nodes rejected during lookup based on frequency divergence" +DHT_LOOKUP_FIXED_NODE_CONTACT + "DHT node contact IP addresses fixed during lookup" +DHT_KEYS_HELD "DHT keys held" +DHT_CACHED_KEYS_HELD "DHT cached keys held" +DHT_VALUES_HELD "DHT values held" +DHT_CACHED_KUID_TARGETS_HELD "DHT cached KUID targets held" +DHT_CACHED_ROOTS_HELD "DHT cached closest root nodes" +DHT_CACHED_ROOTS_EXACT_HITS "DHT cached roots exact hits" +DHT_CACHED_ROOTS_APPROXIMATE_HITS "DHT cached roots approximate hits" +DHT_CACHED_ROOTS_MISSES "DHT cached roots misses" +DHT_CACHED_ROOTS_KBALL_LOOKUPS "DHT cached roots lookups within k-ball" +DHT_CACHED_ROOTS_CONTACT_REFRESHED "DHT cached roots contact address refreshed" +DHT_CACHED_TOKENS_HELD "DHT cached security tokens held" +DHT_CACHED_TOKENS_HITS "DHT cached security tokens hits" +DHT_STABLE_NODES_HELD "DHT stable node information held" +DHT_FETCH_LOCAL_HITS "DHT local hits on value lookups" +DHT_FETCH_LOCAL_CACHED_HITS + "DHT local hits returning values from cached keys" +DHT_RETURNED_EXPANDED_VALUES "DHT returned expanded values" +DHT_RETURNED_SECONDARY_KEYS "DHT returned values as secondary keys" +DHT_CLAIMED_SECONDARY_KEYS "DHT claimed values via secondary keys" +DHT_RETURNED_EXPANDED_CACHED_VALUES + "DHT returned cached expanded values" +DHT_RETURNED_CACHED_SECONDARY_KEYS + "DHT returned cached values as secondary-keys" +DHT_CLAIMED_CACHED_SECONDARY_KEYS + "DHT claimed cached values via secondary keys" +DHT_PUBLISHED "DHT successfully received value publications" +DHT_REMOVED "DHT successfully received value removals" +DHT_STALE_REPLICATION "DHT replication of stale value avoided" +DHT_REPLICATION "DHT replication of held values" +DHT_REPUBLISH "DHT republishing of held values" +DHT_SECONDARY_KEY_FETCH "DHT secondary-key value fetch issued" +DHT_DUP_VALUES "DHT duplicate values returned in lookups" +DHT_KUID_COLLISIONS "DHT detected KUID collisions" +DHT_OWN_KUID_COLLISIONS "DHT detected collisions with our own KUID" +DHT_CACHING_ATTEMPTS "DHT caching attempts" +DHT_CACHING_SUCCESSFUL "DHT caching ended successfully" +DHT_CACHING_PARTIALLY_SUCCESSFUL "DHT caching partially completed" +DHT_KEY_OFFLOADING_CHECKS + "DHT key-offloading checks after discovering new closest node" +DHT_KEYS_SELECTED_FOR_OFFLOADING "DHT keys selected for offloading" +DHT_KEY_OFFLOADING_ATTEMPTS "DHT key-offloading attempts" +DHT_KEY_OFFLOADING_SUCCESSFUL "DHT key-offloading ended successfully" +DHT_KEY_OFFLOADING_PARTIALLY_SUCCESSFUL + "DHT key-offloading partially completed" +DHT_VALUES_OFFLOADED "DHT values successfully offloaded" +DHT_MSG_RECEIVED "DHT incoming messages" +DHT_MSG_MATCHING_CONTACT_ADDRESS + "DHT incoming messages with UDP-matching contact address" +DHT_MSG_FIXED_CONTACT_ADDRESS + "DHT incoming messages with contact address fixed" +DHT_MSG_FROM_HOSTILE_ADDRESS + "DHT incoming messages from hostile addresses" +DHT_MSG_FROM_HOSTILE_CONTACT_ADDRESS + "DHT incoming messages with hostile contact address" +DHT_RPC_MSG_PREPARED "DHT RPC messages prepared" +DHT_RPC_MSG_CANCELLED "DHT RPC messages cancelled" +DHT_RPC_TIMED_OUT "DHT RPC timed out" +DHT_RPC_REPLIES_RECEIVED "DHT RPC replies received" +DHT_RPC_REPLIES_FIXED_CONTACT "DHT RPC replies with contact address fixed" +DHT_RPC_LATE_REPLIES_RECEIVED "DHT RPC late replies received" +DHT_RPC_KUID_REPLY_MISMATCH "DHT RPC detected KUID mismatches on reply" +DHT_RPC_RECENT_NODES_HELD "DHT RPC recent nodes held" +DHT_NODE_VERIFICATIONS "DHT node verifications" +DHT_PUBLISHING_ATTEMPTS "DHT publishing attempts" +DHT_PUBLISHING_SUCCESSFUL "DHT publishing ended successfully (all roots)" +DHT_PUBLISHING_PARTIALLY_SUCCESSFUL + "DHT publishing partially completed (root subset only)" +DHT_PUBLISHING_SATISFACTORY + "DHT publishing ending with proper value presence" +DHT_REPUBLISHED_LATE + "DHT value republishing occurring too late (after expiry)" +DHT_PUBLISHING_TO_SELF "DHT publishing to self" +DHT_PUBLISHING_BG_ATTEMPTS "DHT background publishing completion attempts" +DHT_PUBLISHING_BG_IMPROVEMENTS + "DHT background publishing completion showing improvements" +DHT_PUBLISHING_BG_SUCCESSFUL + "DHT background publishing completion successful (all roots)" +DHT_SHA1_DATA_TYPE_COLLISIONS "DHT SHA1 data type collisions" +DHT_PASSIVELY_PROTECTED_LOOKUP_PATH + "DHT lookup path passively protected against attack" +DHT_ACTIVELY_PROTECTED_LOOKUP_PATH + "DHT lookup path actively protected against attack" +DHT_ALT_LOC_LOOKUPS "DHT alt-loc lookups issued" +DHT_PUSH_PROXY_LOOKUPS "DHT push-proxy lookups issued" +DHT_SUCCESSFUL_ALT_LOC_LOOKUPS "DHT successful alt-loc lookups" +DHT_SUCCESSFUL_PUSH_PROXY_LOOKUPS "DHT successful push-proxy lookups" +DHT_SUCCESSFUL_NODE_PUSH_ENTRY_LOOKUPS "DHT successful node push-entry lookups" +DHT_SEEDING_OF_ORPHAN "DHT re-seeding of orphan downloads" +STATS_DIGEST "Digests computed on general statistics" +STATS_TCP_DIGEST "Digests computed on TCP statistics" +STATS_UDP_DIGEST "Digests computed on UDP statistics"
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/vxml.c
Added
@@ -0,0 +1,78 @@ +/* + * Generated on Sat Apr 5 14:15:09 2014 by enum-msg.pl -- DO NOT EDIT + * + * Command: ../../../scripts/enum-msg.pl vxml.lst + */ + +#include "common.h" + +#include "vxml.h" + +#include "lib/str.h" +#include "lib/override.h" /* Must be the last header included */ + +/* + * English descriptions for vxml_error_t. + */ +static const char *vxml_error_str = { + "OK", + "Unsupported byte order", + "Unsupported character set", + "Truncated input stream", + "Expected a valid name start", + "Invalid character reference", + "Invalid Unicode character", + "Invalid character in name", + "Unknown entity reference", + "Unexpected character", + "Unexpected white space", + "Bad character in name", + "Invalid tag nesting", + "Expected quote (\"'\" or '\"')", + "Expected '>'", + "Expected white space", + "Expected ''", + "Expected ''", + "Expected '--'", + "Expected a DOCTYPE declaration", + "Expected a declaration token", + "Expected NDATA token", + "Expected CDATA token", + "Expected INCLUDE or IGNORE", + "Was not expecting '<'", + "Unexpected <?xml...?>", + "Unexpected tag end", + "Nested DOCTYPE declaration", + "Invalid version number", + "Version number out of range", + "Unknown character encoding name", + "Invalid character encoding name", + "Reached illegal character byte sequence", + "Input is unreadable in the specified encoding", + "User-defined error", + "Duplicate attribute", + "Duplicate default namespace", + "Bad character in namespace", + "Invalid namespace redefinition", + "Unknown namespace prefix", + "Empty name", + "I/O error", + "Possible entity recursion", +}; + +/** + * @return the English description of the enum value. + */ +const char * +vxml_strerror(vxml_error_t x) +{ + if G_UNLIKELY(UNSIGNED(x) >= N_ITEMS(vxml_error_str)) { + str_t *s = str_private(G_STRFUNC, 80); + str_printf(s, "Invalid vxml_error_t code: %d", (int) x); + return str_2c(s); + } + + return vxml_error_strx; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/vxml.h
Added
@@ -0,0 +1,63 @@ +/* + * Generated on Sat Apr 5 14:15:09 2014 by enum-msg.pl -- DO NOT EDIT + * + * Command: ../../../scripts/enum-msg.pl vxml.lst + */ + +#ifndef _if_gen_vxml_h_ +#define _if_gen_vxml_h_ + +/* + * Enum count: 43 + */ +typedef enum { + VXML_E_OK = 0, + VXML_E_UNSUPPORTED_BYTE_ORDER, + VXML_E_UNSUPPORTED_CHARSET, + VXML_E_TRUNCATED_INPUT, + VXML_E_EXPECTED_NAME_START, + VXML_E_INVALID_CHAR_REF, + VXML_E_INVALID_CHARACTER, + VXML_E_INVALID_NAME_CHARACTER, + VXML_E_UNKNOWN_ENTITY_REF, + VXML_E_UNEXPECTED_CHARACTER, + VXML_E_UNEXPECTED_WHITESPACE, + VXML_E_BAD_CHAR_IN_NAME, + VXML_E_INVALID_TAG_NESTING, + VXML_E_EXPECTED_QUOTE, + VXML_E_EXPECTED_GT, + VXML_E_EXPECTED_SPACE, + VXML_E_EXPECTED_LBRAK, + VXML_E_EXPECTED_RBRAK, + VXML_E_EXPECTED_TWO_MINUS, + VXML_E_EXPECTED_DOCTYPE_DECL, + VXML_E_EXPECTED_DECL_TOKEN, + VXML_E_EXPECTED_NDATA_TOKEN, + VXML_E_EXPECTED_CDATA_TOKEN, + VXML_E_EXPECTED_COND_TOKEN, + VXML_E_UNEXPECTED_LT, + VXML_E_UNEXPECTED_XML_PI, + VXML_E_UNEXPECTED_TAG_END, + VXML_E_NESTED_DOCTYPE_DECL, + VXML_E_INVALID_VERSION, + VXML_E_VERSION_OUT_OF_RANGE, + VXML_E_UNKNOWN_CHAR_ENCODING_NAME, + VXML_E_INVALID_CHAR_ENCODING_NAME, + VXML_E_ILLEGAL_CHAR_BYTE_SEQUENCE, + VXML_E_UNREADABLE_CHAR_ENCODING, + VXML_E_USER, + VXML_E_DUP_ATTRIBUTE, + VXML_E_DUP_DEFAULT_NAMESPACE, + VXML_E_BAD_CHAR_IN_NAMESPACE, + VXML_E_NAMESPACE_REDEFINITION, + VXML_E_UNKNOWN_NAMESPACE, + VXML_E_EMPTY_NAME, + VXML_E_IO, + VXML_E_ENTITY_RECURSION +} vxml_error_t; + +const char *vxml_strerror(vxml_error_t x); + +#endif /* _if_gen_vxml_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/if/gen/vxml.lst
Added
@@ -0,0 +1,62 @@ +# +# Versatile XML parsing error codes. +# + +Prefix: VXML_E_ +Lowercase: no +I18N: no +#Count: +Enum: vxml_error_t +Enum-Init: 0 +Enum-File: vxml.h +#Symbolic: +Description: vxml_error_str +#Enum-To-Symbolic: +Enum-To-Description: vxml_strerror +Enum-To-Code: vxml.c +Enum-To-Header: vxml.h +Protection-Prefix: if_gen + +OK "OK" +UNSUPPORTED_BYTE_ORDER "Unsupported byte order" +UNSUPPORTED_CHARSET "Unsupported character set" +TRUNCATED_INPUT "Truncated input stream" +EXPECTED_NAME_START "Expected a valid name start" +INVALID_CHAR_REF "Invalid character reference" +INVALID_CHARACTER "Invalid Unicode character" +INVALID_NAME_CHARACTER "Invalid character in name" +UNKNOWN_ENTITY_REF "Unknown entity reference" +UNEXPECTED_CHARACTER "Unexpected character" +UNEXPECTED_WHITESPACE "Unexpected white space" +BAD_CHAR_IN_NAME "Bad character in name" +INVALID_TAG_NESTING "Invalid tag nesting" +EXPECTED_QUOTE "Expected quote (\"'\" or '\"')" +EXPECTED_GT "Expected '>'" +EXPECTED_SPACE "Expected white space" +EXPECTED_LBRAK "Expected ''" +EXPECTED_RBRAK "Expected ''" +EXPECTED_TWO_MINUS "Expected '--'" +EXPECTED_DOCTYPE_DECL "Expected a DOCTYPE declaration" +EXPECTED_DECL_TOKEN "Expected a declaration token" +EXPECTED_NDATA_TOKEN "Expected NDATA token" +EXPECTED_CDATA_TOKEN "Expected CDATA token" +EXPECTED_COND_TOKEN "Expected INCLUDE or IGNORE" +UNEXPECTED_LT "Was not expecting '<'" +UNEXPECTED_XML_PI "Unexpected <?xml...?>" +UNEXPECTED_TAG_END "Unexpected tag end" +NESTED_DOCTYPE_DECL "Nested DOCTYPE declaration" +INVALID_VERSION "Invalid version number" +VERSION_OUT_OF_RANGE "Version number out of range" +UNKNOWN_CHAR_ENCODING_NAME "Unknown character encoding name" +INVALID_CHAR_ENCODING_NAME "Invalid character encoding name" +ILLEGAL_CHAR_BYTE_SEQUENCE "Reached illegal character byte sequence" +UNREADABLE_CHAR_ENCODING "Input is unreadable in the specified encoding" +USER "User-defined error" +DUP_ATTRIBUTE "Duplicate attribute" +DUP_DEFAULT_NAMESPACE "Duplicate default namespace" +BAD_CHAR_IN_NAMESPACE "Bad character in namespace" +NAMESPACE_REDEFINITION "Invalid namespace redefinition" +UNKNOWN_NAMESPACE "Unknown namespace prefix" +EMPTY_NAME "Empty name" +IO "I/O error" +ENTITY_RECURSION "Possible entity recursion"
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/gnet_property.c -> gtk-gnutella-1.1.9.tar.bz2/src/if/gnet_property.c
Changed
@@ -29,7 +29,10 @@ #include "lib/prop.h" #include "lib/eval.h" +#include "lib/mutex.h" #include "lib/omalloc.h" +#include "lib/pslist.h" + #include "gnet_property.h" /* @@ -42,9 +45,20 @@ #include "if/core/sockets.h" #include "dht/kuid.h" #include "if/dht/routing.h" +#include "upnp/upnp.h" #include "lib/override.h" /* Must be the last header included */ +/* + * Some of the generated const variables can be unused, avoid warnings. + * + * The -Wunused-const-variable warning may not be available with a particular + * compiler, so the -Wpragmas that is issued before prevents a warning to be + * emitted in that case... + */ +G_IGNORE(-Wunknown-pragmas); /* clang does not know -Wpragmas */ +G_IGNORE(-Wpragmas); /* For gcc, not clang */ +G_IGNORE(-Wunused-const-variable); /* Appears in clang version 3.4.1 */ gboolean gnet_property_variable_reading_hostfile = FALSE; static const gboolean gnet_property_variable_reading_hostfile_default = FALSE; @@ -138,8 +152,8 @@ static const guint32 gnet_property_variable_max_banned_fd_default = 100; guint32 gnet_property_variable_incoming_connecting_timeout = 60; static const guint32 gnet_property_variable_incoming_connecting_timeout_default = 60; -guint32 gnet_property_variable_node_connecting_timeout = 30; -static const guint32 gnet_property_variable_node_connecting_timeout_default = 30; +guint32 gnet_property_variable_node_connecting_timeout = 90; +static const guint32 gnet_property_variable_node_connecting_timeout_default = 90; guint32 gnet_property_variable_node_connected_timeout = 180; static const guint32 gnet_property_variable_node_connected_timeout_default = 180; guint32 gnet_property_variable_node_sendqueue_size = 98304; @@ -182,8 +196,6 @@ static const guint32 gnet_property_variable_upload_debug_default = 0; guint32 gnet_property_variable_lib_debug = 0; static const guint32 gnet_property_variable_lib_debug_default = 0; -guint32 gnet_property_variable_bitzi_debug = 0; -static const guint32 gnet_property_variable_bitzi_debug_default = 0; guint32 gnet_property_variable_url_debug = 0; static const guint32 gnet_property_variable_url_debug_default = 0; guint32 gnet_property_variable_dh_debug = 0; @@ -220,8 +232,8 @@ static const guint32 gnet_property_variable_parq_time_always_continue_default = 5; guint32 gnet_property_variable_parq_ban_bad_maxcountwait = 10; static const guint32 gnet_property_variable_parq_ban_bad_maxcountwait_default = 10; -guint32 gnet_property_variable_track_props = 0; -static const guint32 gnet_property_variable_track_props_default = 0; +gboolean gnet_property_variable_net_buffer_shortage = FALSE; +static const gboolean gnet_property_variable_net_buffer_shortage_default = FALSE; gboolean gnet_property_variable_stop_host_get = FALSE; static const gboolean gnet_property_variable_stop_host_get_default = FALSE; gboolean gnet_property_variable_bws_in_enabled = FALSE; @@ -279,7 +291,7 @@ static const guint32 gnet_property_variable_proxy_port_default = 0x0000; guint32 gnet_property_variable_proxy_protocol = PROXY_NONE; static const guint32 gnet_property_variable_proxy_protocol_default = PROXY_NONE; -prop_def_choice_t gnet_property_variable_proxy_protocol_choices = { +prop_def_choice_t gnet_property_variable_proxy_protocol_choices = { {N_("No proxy"), PROXY_NONE}, {N_("HTTP"), PROXY_HTTP}, {N_("SOCKS v4"), PROXY_SOCKSV4}, @@ -288,7 +300,7 @@ }; guint32 gnet_property_variable_network_protocol = NET_USE_BOTH; static const guint32 gnet_property_variable_network_protocol_default = NET_USE_BOTH; -prop_def_choice_t gnet_property_variable_network_protocol_choices = { +prop_def_choice_t gnet_property_variable_network_protocol_choices = { {N_("IPv4 only"), NET_USE_IPV4}, {N_("IPv6 only"), NET_USE_IPV6}, {N_("IPv4 and IPv6"), NET_USE_BOTH}, @@ -345,8 +357,8 @@ static const guint32 gnet_property_variable_min_dup_msg_default = 5; guint32 gnet_property_variable_min_dup_ratio = 150; static const guint32 gnet_property_variable_min_dup_ratio_default = 150; -char *gnet_property_variable_scan_extensions = "aac;avi;bin;bz2;7z;cue;dmg;deb;divx;flac;flc;fli;gif;gz;ifo;iso;it;jpeg;jpg;m4a;mjpg;mka;mkv;mod;mov;mp1;mp2;mp3;mp4;mpa;mpeg;mpega;mpg;mpv;nes;oga;ogg;ogm;ogv;qt;pdf;png;ps;ram;rar;rm;rom;rpm;s3m;shn;sid;smc;smd;spx;srt;stm;tar;tbz2;tgz;bittorrent;torrent;txt;vob;voc;vqf;wav;xm;xvid;zip"; -static const char *gnet_property_variable_scan_extensions_default = "aac;avi;bin;bz2;7z;cue;dmg;deb;divx;flac;flc;fli;gif;gz;ifo;iso;it;jpeg;jpg;m4a;mjpg;mka;mkv;mod;mov;mp1;mp2;mp3;mp4;mpa;mpeg;mpega;mpg;mpv;nes;oga;ogg;ogm;ogv;qt;pdf;png;ps;ram;rar;rm;rom;rpm;s3m;shn;sid;smc;smd;spx;srt;stm;tar;tbz2;tgz;bittorrent;torrent;txt;vob;voc;vqf;wav;xm;xvid;zip"; +char *gnet_property_variable_scan_extensions = "aac;avi;bin;bz2;7z;cue;dmg;deb;divx;flac;flc;fli;gif;gz;ifo;iso;it;jpeg;jpg;m4a;mjpg;mka;mkv;mod;mov;mp1;mp2;mp3;mp4;mpa;mpeg;mpega;mpg;mpv;nes;oga;ogg;ogm;ogv;opus;qt;pdf;png;ps;ram;rar;rm;rom;rpm;s3m;shn;sid;smc;smd;spx;srt;stm;tar;tbz2;tgz;bittorrent;torrent;txt;vob;voc;vqf;wav;webm;xm;xvid;zip;zoo"; +static const char *gnet_property_variable_scan_extensions_default = "aac;avi;bin;bz2;7z;cue;dmg;deb;divx;flac;flc;fli;gif;gz;ifo;iso;it;jpeg;jpg;m4a;mjpg;mka;mkv;mod;mov;mp1;mp2;mp3;mp4;mpa;mpeg;mpega;mpg;mpv;nes;oga;ogg;ogm;ogv;opus;qt;pdf;png;ps;ram;rar;rm;rom;rpm;s3m;shn;sid;smc;smd;spx;srt;stm;tar;tbz2;tgz;bittorrent;torrent;txt;vob;voc;vqf;wav;webm;xm;xvid;zip;zoo"; gboolean gnet_property_variable_scan_ignore_symlink_dirs = FALSE; static const gboolean gnet_property_variable_scan_ignore_symlink_dirs_default = FALSE; gboolean gnet_property_variable_scan_ignore_symlink_regfiles = FALSE; @@ -421,13 +433,13 @@ static const gboolean gnet_property_variable_download_require_server_name_default = TRUE; guint32 gnet_property_variable_max_ultrapeers = 4; static const guint32 gnet_property_variable_max_ultrapeers_default = 4; -guint32 gnet_property_variable_quick_connect_pool_size = 10; -static const guint32 gnet_property_variable_quick_connect_pool_size_default = 10; -guint32 gnet_property_variable_max_leaves = 150; -static const guint32 gnet_property_variable_max_leaves_default = 150; +guint32 gnet_property_variable_quick_connect_pool_size = 40; +static const guint32 gnet_property_variable_quick_connect_pool_size_default = 40; +guint32 gnet_property_variable_max_leaves = 300; +static const guint32 gnet_property_variable_max_leaves_default = 300; guint32 gnet_property_variable_search_handle_ignored_files = 0; static const guint32 gnet_property_variable_search_handle_ignored_files_default = 0; -prop_def_choice_t gnet_property_variable_search_handle_ignored_files_choices = { +prop_def_choice_t gnet_property_variable_search_handle_ignored_files_choices = { {N_("displayed normally"), 0}, {N_("displayed marked"), 1}, {N_("not displayed"), 2}, @@ -435,7 +447,7 @@ }; guint32 gnet_property_variable_configured_peermode = NODE_P_AUTO; static const guint32 gnet_property_variable_configured_peermode_default = NODE_P_AUTO; -prop_def_choice_t gnet_property_variable_configured_peermode_choices = { +prop_def_choice_t gnet_property_variable_configured_peermode_choices = { {N_("auto (recommended)"), NODE_P_AUTO}, {N_("ultra node"), NODE_P_ULTRA}, {N_("leaf node"), NODE_P_LEAF}, @@ -443,7 +455,7 @@ }; guint32 gnet_property_variable_current_peermode = 0; static const guint32 gnet_property_variable_current_peermode_default = 0; -prop_def_choice_t gnet_property_variable_current_peermode_choices = { +prop_def_choice_t gnet_property_variable_current_peermode_choices = { {N_("ultra node"), NODE_P_ULTRA}, {N_("leaf node"), NODE_P_LEAF}, {NULL, 0} @@ -632,8 +644,8 @@ static const guint32 gnet_property_variable_qhits_browse_served_default = 0; gboolean gnet_property_variable_overloaded_cpu = FALSE; static const gboolean gnet_property_variable_overloaded_cpu_default = FALSE; -guint32 gnet_property_variable_download_buffer_size = 32768; -static const guint32 gnet_property_variable_download_buffer_size_default = 32768; +guint32 gnet_property_variable_download_buffer_size = 131072; +static const guint32 gnet_property_variable_download_buffer_size_default = 131072; gboolean gnet_property_variable_browse_copied_to_passive = FALSE; static const gboolean gnet_property_variable_browse_copied_to_passive_default = FALSE; gboolean gnet_property_variable_display_metric_units = FALSE; @@ -726,7 +738,7 @@ static const gboolean gnet_property_variable_dht_storage_in_memory_default = FALSE; guint32 gnet_property_variable_download_trace = SOCK_TRACE_NONE; static const guint32 gnet_property_variable_download_trace_default = SOCK_TRACE_NONE; -prop_def_choice_t gnet_property_variable_download_trace_choices = { +prop_def_choice_t gnet_property_variable_download_trace_choices = { {N_("none"), SOCK_TRACE_NONE}, {N_("input only"), SOCK_TRACE_IN}, {N_("output only"), SOCK_TRACE_OUT}, @@ -735,7 +747,7 @@ }; guint32 gnet_property_variable_upload_trace = SOCK_TRACE_NONE; static const guint32 gnet_property_variable_upload_trace_default = SOCK_TRACE_NONE; -prop_def_choice_t gnet_property_variable_upload_trace_choices = { +prop_def_choice_t gnet_property_variable_upload_trace_choices = { {N_("none"), SOCK_TRACE_NONE}, {N_("input only"), SOCK_TRACE_IN}, {N_("output only"), SOCK_TRACE_OUT}, @@ -744,7 +756,7 @@ }; guint32 gnet_property_variable_gnet_trace = SOCK_TRACE_NONE; static const guint32 gnet_property_variable_gnet_trace_default = SOCK_TRACE_NONE; -prop_def_choice_t gnet_property_variable_gnet_trace_choices = { +prop_def_choice_t gnet_property_variable_gnet_trace_choices = { {N_("none"), SOCK_TRACE_NONE}, {N_("input only"), SOCK_TRACE_IN}, {N_("output only"), SOCK_TRACE_OUT}, @@ -753,7 +765,7 @@ }; guint32 gnet_property_variable_push_proxy_trace = SOCK_TRACE_NONE; static const guint32 gnet_property_variable_push_proxy_trace_default = SOCK_TRACE_NONE; -prop_def_choice_t gnet_property_variable_push_proxy_trace_choices = { +prop_def_choice_t gnet_property_variable_push_proxy_trace_choices = { {N_("none"), SOCK_TRACE_NONE}, {N_("input only"), SOCK_TRACE_IN}, {N_("output only"), SOCK_TRACE_OUT}, @@ -762,7 +774,7 @@ }; guint32 gnet_property_variable_http_trace = SOCK_TRACE_NONE; static const guint32 gnet_property_variable_http_trace_default = SOCK_TRACE_NONE; -prop_def_choice_t gnet_property_variable_http_trace_choices = { +prop_def_choice_t gnet_property_variable_http_trace_choices = { {N_("none"), SOCK_TRACE_NONE}, {N_("input only"), SOCK_TRACE_IN}, {N_("output only"), SOCK_TRACE_OUT}, @@ -827,7 +839,7 @@ static const guint32 gnet_property_variable_publisher_debug_default = 0; guint32 gnet_property_variable_dht_trace = SOCK_TRACE_NONE; static const guint32 gnet_property_variable_dht_trace_default = SOCK_TRACE_NONE; -prop_def_choice_t gnet_property_variable_dht_trace_choices = { +prop_def_choice_t gnet_property_variable_dht_trace_choices = { {N_("none"), SOCK_TRACE_NONE}, {N_("input only"), SOCK_TRACE_IN}, {N_("output only"), SOCK_TRACE_OUT}, @@ -858,7 +870,7 @@ static const guint64 gnet_property_variable_cpu_freq_max_default = 0; guint32 gnet_property_variable_dht_boot_status = 0; static const guint32 gnet_property_variable_dht_boot_status_default = 0; -prop_def_choice_t gnet_property_variable_dht_boot_status_choices = { +prop_def_choice_t gnet_property_variable_dht_boot_status_choices = { {N_("none"), DHT_BOOT_NONE}, {N_("seeded"), DHT_BOOT_SEEDED}, {N_("own KUID lookup"), DHT_BOOT_OWN}, @@ -869,14 +881,14 @@ }; guint32 gnet_property_variable_dht_configured_mode = 1; static const guint32 gnet_property_variable_dht_configured_mode_default = 1; -prop_def_choice_t gnet_property_variable_dht_configured_mode_choices = { +prop_def_choice_t gnet_property_variable_dht_configured_mode_choices = { {N_("active (recommended)"), DHT_MODE_ACTIVE}, {N_("passive"), DHT_MODE_PASSIVE}, {NULL, 0} }; guint32 gnet_property_variable_dht_current_mode = 1; static const guint32 gnet_property_variable_dht_current_mode_default = 1; -prop_def_choice_t gnet_property_variable_dht_current_mode_choices = { +prop_def_choice_t gnet_property_variable_dht_current_mode_choices = { {N_("active (recommended)"), DHT_MODE_ACTIVE}, {N_("passive"), DHT_MODE_PASSIVE}, {NULL, 0} @@ -902,7 +914,7 @@ static const guint32 gnet_property_variable_soap_debug_default = 0; guint32 gnet_property_variable_soap_trace = SOCK_TRACE_NONE; static const guint32 gnet_property_variable_soap_trace_default = SOCK_TRACE_NONE; -prop_def_choice_t gnet_property_variable_soap_trace_choices = { +prop_def_choice_t gnet_property_variable_soap_trace_choices = { {N_("none"), SOCK_TRACE_NONE}, {N_("input only"), SOCK_TRACE_IN}, {N_("output only"), SOCK_TRACE_OUT}, @@ -1022,10 +1034,98 @@ static const guint32 gnet_property_variable_tx_deflate_debug_default = 0; char *gnet_property_variable_tx_debug_addrs = ""; static const char *gnet_property_variable_tx_debug_addrs_default = ""; +char *gnet_property_variable_dump_rx_addrs = ""; +static const char *gnet_property_variable_dump_rx_addrs_default = ""; +char *gnet_property_variable_dump_tx_from_addrs = ""; +static const char *gnet_property_variable_dump_tx_from_addrs_default = ""; +char *gnet_property_variable_dump_tx_to_addrs = ""; +static const char *gnet_property_variable_dump_tx_to_addrs_default = ""; +gboolean gnet_property_variable_guess_maximize_bw = TRUE; +static const gboolean gnet_property_variable_guess_maximize_bw_default = TRUE; +guint32 gnet_property_variable_udp_sched_debug = 0; +static const guint32 gnet_property_variable_udp_sched_debug_default = 0; +guint32 gnet_property_variable_tx_ut_debug_flags = 0; +static const guint32 gnet_property_variable_tx_ut_debug_flags_default = 0; +char *gnet_property_variable_rx_debug_addrs = ""; +static const char *gnet_property_variable_rx_debug_addrs_default = ""; +guint32 gnet_property_variable_rx_ut_debug_flags = 0; +static const guint32 gnet_property_variable_rx_ut_debug_flags_default = 0; +gboolean gnet_property_variable_log_sr_udp_tx = FALSE; +static const gboolean gnet_property_variable_log_sr_udp_tx_default = FALSE; +gboolean gnet_property_variable_log_sr_udp_rx = FALSE; +static const gboolean gnet_property_variable_log_sr_udp_rx_default = FALSE; +guint32 gnet_property_variable_secure_oob_debug = 0; +static const guint32 gnet_property_variable_secure_oob_debug_default = 0; +gboolean gnet_property_variable_log_vmsg_tx = FALSE; +static const gboolean gnet_property_variable_log_vmsg_tx_default = FALSE; +gboolean gnet_property_variable_log_vmsg_rx = FALSE; +static const gboolean gnet_property_variable_log_vmsg_rx_default = FALSE; +guint32 gnet_property_variable_dht_tcache_debug_flags = 0; +static const guint32 gnet_property_variable_dht_tcache_debug_flags_default = 0; +gboolean gnet_property_variable_log_weird_dht_headers = FALSE; +static const gboolean gnet_property_variable_log_weird_dht_headers_default = FALSE; +guint32 gnet_property_variable_dht_rpc_debug = 0; +static const guint32 gnet_property_variable_dht_rpc_debug_default = 0; +gboolean gnet_property_variable_log_uhc_pings_rx = FALSE; +static const gboolean gnet_property_variable_log_uhc_pings_rx_default = FALSE; +gboolean gnet_property_variable_log_uhc_pings_tx = FALSE; +static const gboolean gnet_property_variable_log_uhc_pings_tx_default = FALSE; +gboolean gnet_property_variable_clean_shutdown = TRUE; +static const gboolean gnet_property_variable_clean_shutdown_default = TRUE; +gboolean gnet_property_variable_clean_restart = TRUE; +static const gboolean gnet_property_variable_clean_restart_default = TRUE; +guint32 gnet_property_variable_dht_keys_debug = 0; +static const guint32 gnet_property_variable_dht_keys_debug_default = 0; +guint32 gnet_property_variable_dht_values_debug = 0; +static const guint32 gnet_property_variable_dht_values_debug_default = 0; +guint32 gnet_property_variable_pid = 0; +static const guint32 gnet_property_variable_pid_default = 0; +guint32 gnet_property_variable_http_range_debug = 0; +static const guint32 gnet_property_variable_http_range_debug_default = 0; +guint32 gnet_property_variable_upnp_mapping_lease_time = UPNP_MAPPING_LIFE; +static const guint32 gnet_property_variable_upnp_mapping_lease_time_default = UPNP_MAPPING_LIFE; +gboolean gnet_property_variable_user_auto_restart = FALSE; +static const gboolean gnet_property_variable_user_auto_restart_default = FALSE; +guint32 gnet_property_variable_tm_debug = 0; +static const guint32 gnet_property_variable_tm_debug_default = 0; +guint32 gnet_property_variable_tmalloc_debug = 0; +static const guint32 gnet_property_variable_tmalloc_debug_default = 0; +guint32 gnet_property_variable_evq_debug = 0; +static const guint32 gnet_property_variable_evq_debug_default = 0; +guint32 gnet_property_variable_max_g2hub_hosts_cached = 10000; +static const guint32 gnet_property_variable_max_g2hub_hosts_cached_default = 10000; +guint32 gnet_property_variable_hosts_in_g2hub_catcher = 0; +static const guint32 gnet_property_variable_hosts_in_g2hub_catcher_default = 0; +gboolean gnet_property_variable_enable_g2 = TRUE; +static const gboolean gnet_property_variable_enable_g2_default = TRUE; +guint32 gnet_property_variable_node_g2_count = 0; +static const guint32 gnet_property_variable_node_g2_count_default = 0; +guint32 gnet_property_variable_max_g2_hubs = 2; +static const guint32 gnet_property_variable_max_g2_hubs_default = 2; +gboolean gnet_property_variable_log_bad_g2 = FALSE; +static const gboolean gnet_property_variable_log_bad_g2_default = FALSE; +gboolean gnet_property_variable_log_dropped_g2 = FALSE; +static const gboolean gnet_property_variable_log_dropped_g2_default = FALSE; +guint32 gnet_property_variable_g2_rpc_debug = 0; +static const guint32 gnet_property_variable_g2_rpc_debug_default = 0; +gboolean gnet_property_variable_log_query_hits = FALSE; +static const gboolean gnet_property_variable_log_query_hits_default = FALSE; +gboolean gnet_property_variable_log_query_hit_records = FALSE; +static const gboolean gnet_property_variable_log_query_hit_records_default = FALSE; +guint32 gnet_property_variable_g2_browse_count = 0; +static const guint32 gnet_property_variable_g2_browse_count_default = 0; +guint32 gnet_property_variable_g2_browse_served = 0; +static const guint32 gnet_property_variable_g2_browse_served_default = 0; +gboolean gnet_property_variable_log_sending_g2 = FALSE; +static const gboolean gnet_property_variable_log_sending_g2_default = FALSE; +time_t gnet_property_variable_session_start_stamp = 0; +static const time_t gnet_property_variable_session_start_stamp_default = 0; +gboolean gnet_property_variable_tcp_no_listening = FALSE; +static const gboolean gnet_property_variable_tcp_no_listening_default = FALSE; static prop_set_t *gnet_property; -G_GNUC_COLD prop_set_t * +prop_set_t * G_COLD gnet_prop_init(void) { guint32 n; @@ -1035,10 +1135,11 @@ gnet_property->size = GNET_PROPERTY_NUM; gnet_property->offset = (NO_PROP+1); gnet_property->mtime = 0; - gnet_property->props = omalloc(sizeof(prop_def_t) * GNET_PROPERTY_NUM); + OMALLOC_ARRAY(gnet_property->props, GNET_PROPERTY_NUM); gnet_property->get_stub = gnet_prop_get_stub; gnet_property->dirty = FALSE; - gnet_property->byName = NULL; + gnet_property->by_name = NULL; + spinlock_init(&gnet_property->lock); /* @@ -1050,7 +1151,9 @@ gnet_property->props0.desc = _("Indicates whether the hostcache file is being read."); gnet_property->props0.ev_changed = event_new("reading_hostfile_changed"); gnet_property->props0.save = FALSE; + gnet_property->props0.internal = TRUE; gnet_property->props0.vector_size = 1; + mutex_init(&gnet_property->props0.lock); /* Type specific data: */ gnet_property->props0.type = PROP_TYPE_BOOLEAN; @@ -1067,7 +1170,9 @@ gnet_property->props1.desc = _("Indicates whether the ultracache file is being read."); gnet_property->props1.ev_changed = event_new("reading_ultrafile_changed"); gnet_property->props1.save = FALSE; + gnet_property->props1.internal = TRUE; gnet_property->props1.vector_size = 1; + mutex_init(&gnet_property->props1.lock); /* Type specific data: */ gnet_property->props1.type = PROP_TYPE_BOOLEAN; @@ -1084,7 +1189,9 @@ gnet_property->props2.desc = _("Indicates that gtk-gnutella finds the version you run very VERY old. You should upgrade as soon as possible to avoid suffering from non-optimal Gnutella support that may not only damage your abilities to search and download but also harm the network since you're not supporting the newest features."); gnet_property->props2.ev_changed = event_new("ancient_version_changed"); gnet_property->props2.save = FALSE; + gnet_property->props2.internal = TRUE; gnet_property->props2.vector_size = 1; + mutex_init(&gnet_property->props2.lock); /* Type specific data: */ gnet_property->props2.type = PROP_TYPE_BOOLEAN; @@ -1101,7 +1208,9 @@ gnet_property->props3.desc = _("gtk-gnutella found a newer version on the Gnet and gives information about it here."); gnet_property->props3.ev_changed = event_new("new_version_str_changed"); gnet_property->props3.save = FALSE; + gnet_property->props3.internal = TRUE; gnet_property->props3.vector_size = 1; + mutex_init(&gnet_property->props3.lock); /* Type specific data: */ gnet_property->props3.type = PROP_TYPE_STRING; @@ -1122,7 +1231,9 @@ gnet_property->props4.desc = _("Try to keep at least this number of connections to other servents of the same kind as we are (normal or ultra nodes). This should be smaller than the maximum amount of connections to allow incoming connections. Keep in mind that the default TTL on Gnutella is 4, so this needs to be more than 30 to provide decent range for searches."); gnet_property->props4.ev_changed = event_new("up_connections_changed"); gnet_property->props4.save = TRUE; + gnet_property->props4.internal = FALSE; gnet_property->props4.vector_size = 1; + mutex_init(&gnet_property->props4.lock); /* Type specific data: */ gnet_property->props4.type = PROP_TYPE_GUINT32; @@ -1142,7 +1253,9 @@ gnet_property->props5.desc = _("When in ultrapeer mode, try to keep at least this number of connections to normal servents. This should be smaller than the maximum amount of connections to allow incoming connections."); gnet_property->props5.ev_changed = event_new("normal_connections_changed"); gnet_property->props5.save = TRUE; + gnet_property->props5.internal = FALSE; gnet_property->props5.vector_size = 1; + mutex_init(&gnet_property->props5.lock); /* Type specific data: */ gnet_property->props5.type = PROP_TYPE_GUINT32; @@ -1162,7 +1275,9 @@ gnet_property->props6.desc = _("Don't allow more than this number of connections to other servents. As a rule of thumb you should reserve 256 b/s bandwidth per connection. Never use up all your bandwidth, leave a little space for TCP/IP overhead. It's not advisable that you set this to a value smaller than 40."); gnet_property->props6.ev_changed = event_new("max_connections_changed"); gnet_property->props6.save = TRUE; + gnet_property->props6.internal = FALSE; gnet_property->props6.vector_size = 1; + mutex_init(&gnet_property->props6.lock); /* Type specific data: */ gnet_property->props6.type = PROP_TYPE_GUINT32; @@ -1182,7 +1297,9 @@ gnet_property->props7.desc = _("Number of leaf nodes currently connected."); gnet_property->props7.ev_changed = event_new("node_leaf_count_changed"); gnet_property->props7.save = FALSE; + gnet_property->props7.internal = TRUE; gnet_property->props7.vector_size = 1; + mutex_init(&gnet_property->props7.lock); /* Type specific data: */ gnet_property->props7.type = PROP_TYPE_GUINT32; @@ -1202,7 +1319,9 @@ gnet_property->props8.desc = _("Number of normal nodes currently connected."); gnet_property->props8.ev_changed = event_new("node_normal_count_changed"); gnet_property->props8.save = FALSE; + gnet_property->props8.internal = TRUE; gnet_property->props8.vector_size = 1; + mutex_init(&gnet_property->props8.lock); /* Type specific data: */ gnet_property->props8.type = PROP_TYPE_GUINT32; @@ -1222,7 +1341,9 @@ gnet_property->props9.desc = _("Number of ultra nodes currently connected."); gnet_property->props9.ev_changed = event_new("node_ultra_count_changed"); gnet_property->props9.save = FALSE; + gnet_property->props9.internal = TRUE; gnet_property->props9.vector_size = 1; + mutex_init(&gnet_property->props9.lock); /* Type specific data: */ gnet_property->props9.type = PROP_TYPE_GUINT32; @@ -1242,7 +1363,9 @@ gnet_property->props10.desc = _("Don't start more than this number of parallel downloads. Others will remain in the queue waiting for a download slot."); gnet_property->props10.ev_changed = event_new("max_downloads_changed"); gnet_property->props10.save = TRUE; + gnet_property->props10.internal = FALSE; gnet_property->props10.vector_size = 1; + mutex_init(&gnet_property->props10.lock); /* Type specific data: */ gnet_property->props10.type = PROP_TYPE_GUINT32; @@ -1262,7 +1385,9 @@ gnet_property->props11.desc = _("Don't make more connections than given here to a single host to download a file. Be nice to others, and leave it at the default value (1)."); gnet_property->props11.ev_changed = event_new("max_host_downloads_changed"); gnet_property->props11.save = TRUE; + gnet_property->props11.internal = FALSE; gnet_property->props11.vector_size = 1; + mutex_init(&gnet_property->props11.lock); /* Type specific data: */ gnet_property->props11.type = PROP_TYPE_GUINT32; @@ -1282,7 +1407,9 @@ gnet_property->props12.desc = _("Don't allow more than this number of uploads in total. This also defines the amount of PARQ queues that will be used. You should at least set it to 2."); gnet_property->props12.ev_changed = event_new("max_uploads_changed"); gnet_property->props12.save = TRUE; + gnet_property->props12.internal = FALSE; gnet_property->props12.vector_size = 1; + mutex_init(&gnet_property->props12.lock); /* Type specific data: */ gnet_property->props12.type = PROP_TYPE_GUINT32; @@ -1302,7 +1429,9 @@ gnet_property->props13.desc = _("Don't upload more than this number of files in parallel to a single host."); gnet_property->props13.ev_changed = event_new("max_uploads_ip_changed"); gnet_property->props13.save = TRUE; + gnet_property->props13.internal = FALSE; gnet_property->props13.vector_size = 1; + mutex_init(&gnet_property->props13.lock); /* Type specific data: */ gnet_property->props13.type = PROP_TYPE_GUINT32; @@ -1322,7 +1451,9 @@ gnet_property->props14.desc = _("Local IPv4 address last determined."); gnet_property->props14.ev_changed = event_new("local_ip_changed"); gnet_property->props14.save = TRUE; + gnet_property->props14.internal = FALSE; gnet_property->props14.vector_size = 1; + mutex_init(&gnet_property->props14.lock); /* Type specific data: */ gnet_property->props14.type = PROP_TYPE_IP; @@ -1338,7 +1469,9 @@ gnet_property->props15.desc = _("Local IPv6 address last determined."); gnet_property->props15.ev_changed = event_new("local_ip6_changed"); gnet_property->props15.save = TRUE; + gnet_property->props15.internal = FALSE; gnet_property->props15.vector_size = 1; + mutex_init(&gnet_property->props15.lock); /* Type specific data: */ gnet_property->props15.type = PROP_TYPE_IP; @@ -1354,7 +1487,9 @@ gnet_property->props16.desc = _("When the current IPv4 address was determined."); gnet_property->props16.ev_changed = event_new("current_ip_stamp_changed"); gnet_property->props16.save = TRUE; + gnet_property->props16.internal = TRUE; gnet_property->props16.vector_size = 1; + mutex_init(&gnet_property->props16.lock); /* Type specific data: */ gnet_property->props16.type = PROP_TYPE_TIMESTAMP; @@ -1374,7 +1509,9 @@ gnet_property->props17.desc = _("When the current IPv6 address was determined."); gnet_property->props17.ev_changed = event_new("current_ip6_stamp_changed"); gnet_property->props17.save = TRUE; + gnet_property->props17.internal = TRUE; gnet_property->props17.vector_size = 1; + mutex_init(&gnet_property->props17.lock); /* Type specific data: */ gnet_property->props17.type = PROP_TYPE_TIMESTAMP; @@ -1394,7 +1531,9 @@ gnet_property->props18.desc = _("Average uptime with the same IPv4 address."); gnet_property->props18.ev_changed = event_new("average_ip_uptime_changed"); gnet_property->props18.save = TRUE; + gnet_property->props18.internal = TRUE; gnet_property->props18.vector_size = 1; + mutex_init(&gnet_property->props18.lock); /* Type specific data: */ gnet_property->props18.type = PROP_TYPE_GUINT32; @@ -1414,7 +1553,9 @@ gnet_property->props19.desc = _("Average uptime with the same IPv6 address."); gnet_property->props19.ev_changed = event_new("average_ip6_uptime_changed"); gnet_property->props19.save = TRUE; + gnet_property->props19.internal = TRUE; gnet_property->props19.vector_size = 1; + mutex_init(&gnet_property->props19.lock); /* Type specific data: */ gnet_property->props19.type = PROP_TYPE_GUINT32; @@ -1434,7 +1575,9 @@ gnet_property->props20.desc = _("Timestamp at which servent was started."); gnet_property->props20.ev_changed = event_new("start_stamp_changed"); gnet_property->props20.save = FALSE; + gnet_property->props20.internal = TRUE; gnet_property->props20.vector_size = 1; + mutex_init(&gnet_property->props20.lock); /* Type specific data: */ gnet_property->props20.type = PROP_TYPE_TIMESTAMP; @@ -1454,7 +1597,9 @@ gnet_property->props21.desc = _("Average servent uptime."); gnet_property->props21.ev_changed = event_new("average_servent_uptime_changed"); gnet_property->props21.save = TRUE; + gnet_property->props21.internal = TRUE; gnet_property->props21.vector_size = 1; + mutex_init(&gnet_property->props21.lock); /* Type specific data: */ gnet_property->props21.type = PROP_TYPE_GUINT32; @@ -1474,7 +1619,9 @@ gnet_property->props22.desc = _("Local TCP port gtk-gnutella is listening on. ISPs often block or throttle traffic on TCP port 6346 so it is a good idea to change it to something in the range of 1024-65535. Don't forget to update your firewall port forwarding / opening, as necessary. Note that by default, the TCP port 6346 is not used to guard against undue censorship."); gnet_property->props22.ev_changed = event_new("listen_port_changed"); gnet_property->props22.save = TRUE; + gnet_property->props22.internal = FALSE; gnet_property->props22.vector_size = 1; + mutex_init(&gnet_property->props22.lock); /* Type specific data: */ gnet_property->props22.type = PROP_TYPE_GUINT32; @@ -1494,7 +1641,9 @@ gnet_property->props23.desc = _("Use this IP address as source address if 'force local ip' is activated."); gnet_property->props23.ev_changed = event_new("forced_local_ip_changed"); gnet_property->props23.save = TRUE; + gnet_property->props23.internal = FALSE; gnet_property->props23.vector_size = 1; + mutex_init(&gnet_property->props23.lock); /* Type specific data: */ gnet_property->props23.type = PROP_TYPE_IP; @@ -1510,7 +1659,9 @@ gnet_property->props24.desc = _("Use this IPv6 address as source address if 'force local ip' is activated."); gnet_property->props24.ev_changed = event_new("forced_local_ip6_changed"); gnet_property->props24.save = TRUE; + gnet_property->props24.internal = FALSE; gnet_property->props24.vector_size = 1; + mutex_init(&gnet_property->props24.lock); /* Type specific data: */ gnet_property->props24.type = PROP_TYPE_IP; @@ -1526,7 +1677,9 @@ gnet_property->props25.desc = _("The connection bandwidth reported to other hosts. This is the speed at which you can upload things to others."); gnet_property->props25.ev_changed = event_new("connection_speed_changed"); gnet_property->props25.save = TRUE; + gnet_property->props25.internal = FALSE; gnet_property->props25.vector_size = 1; + mutex_init(&gnet_property->props25.lock); /* Type specific data: */ gnet_property->props25.type = PROP_TYPE_GUINT32; @@ -1546,7 +1699,9 @@ gnet_property->props26.desc = _("Whether the connection bandwidth reported to other hosts should be computed based on the current average upload speed. The reported speed is the available speed for a new upload, not the theoretical maximum configured: it is the average bandwidth (or the max configured bandwidth if no traffic yet) divided by the number of upload slots. When it is ON (recommended setting), the hardwired connection speed is not used."); gnet_property->props26.ev_changed = event_new("compute_connection_speed_changed"); gnet_property->props26.save = TRUE; + gnet_property->props26.internal = FALSE; gnet_property->props26.vector_size = 1; + mutex_init(&gnet_property->props26.lock); /* Type specific data: */ gnet_property->props26.type = PROP_TYPE_BOOLEAN; @@ -1563,7 +1718,9 @@ gnet_property->props27.desc = _("Return at most this number of results to a query, using as many query hit packets as necessary. To avoid network flooding, keep this to a reasonable value."); gnet_property->props27.ev_changed = event_new("query_response_max_items_changed"); gnet_property->props27.save = TRUE; + gnet_property->props27.internal = FALSE; gnet_property->props27.vector_size = 1; + mutex_init(&gnet_property->props27.lock); /* Type specific data: */ gnet_property->props27.type = PROP_TYPE_GUINT32; @@ -1583,7 +1740,9 @@ gnet_property->props28.desc = _("Unless this percentage or more of the upload bandwidth is used, allow additional upload slots."); gnet_property->props28.ev_changed = event_new("ul_usage_min_percentage_changed"); gnet_property->props28.save = TRUE; + gnet_property->props28.internal = FALSE; gnet_property->props28.vector_size = 1; + mutex_init(&gnet_property->props28.lock); /* Type specific data: */ gnet_property->props28.type = PROP_TYPE_GUINT32; @@ -1603,7 +1762,9 @@ gnet_property->props29.desc = _("Number of seconds before a download connect attempt times out."); gnet_property->props29.ev_changed = event_new("download_connecting_timeout_changed"); gnet_property->props29.save = TRUE; + gnet_property->props29.internal = FALSE; gnet_property->props29.vector_size = 1; + mutex_init(&gnet_property->props29.lock); /* Type specific data: */ gnet_property->props29.type = PROP_TYPE_GUINT32; @@ -1623,7 +1784,9 @@ gnet_property->props30.desc = _("Number of seconds before a push request times out."); gnet_property->props30.ev_changed = event_new("download_push_sent_timeout_changed"); gnet_property->props30.save = TRUE; + gnet_property->props30.internal = FALSE; gnet_property->props30.vector_size = 1; + mutex_init(&gnet_property->props30.lock); /* Type specific data: */ gnet_property->props30.type = PROP_TYPE_GUINT32; @@ -1643,7 +1806,9 @@ gnet_property->props31.desc = _("Number of seconds before a download times out if no data is received."); gnet_property->props31.ev_changed = event_new("download_connected_timeout_changed"); gnet_property->props31.save = TRUE; + gnet_property->props31.internal = FALSE; gnet_property->props31.vector_size = 1; + mutex_init(&gnet_property->props31.lock); /* Type specific data: */ gnet_property->props31.type = PROP_TYPE_GUINT32; @@ -1663,7 +1828,9 @@ gnet_property->props32.desc = _("Minimum number of seconds to wait on auto-retry timeouts."); gnet_property->props32.ev_changed = event_new("download_retry_timeout_min_changed"); gnet_property->props32.save = TRUE; + gnet_property->props32.internal = FALSE; gnet_property->props32.vector_size = 1; + mutex_init(&gnet_property->props32.lock); /* Type specific data: */ gnet_property->props32.type = PROP_TYPE_GUINT32; @@ -1683,7 +1850,9 @@ gnet_property->props33.desc = _("Maximum number of seconds to wait on auto-retry timeouts."); gnet_property->props33.ev_changed = event_new("download_retry_timeout_max_changed"); gnet_property->props33.save = TRUE; + gnet_property->props33.internal = FALSE; gnet_property->props33.vector_size = 1; + mutex_init(&gnet_property->props33.lock); /* Type specific data: */ gnet_property->props33.type = PROP_TYPE_GUINT32; @@ -1703,7 +1872,9 @@ gnet_property->props34.desc = _("Maximum number of attempts to download a file not counting HTTP busy indications."); gnet_property->props34.ev_changed = event_new("download_max_retries_changed"); gnet_property->props34.save = TRUE; + gnet_property->props34.internal = FALSE; gnet_property->props34.vector_size = 1; + mutex_init(&gnet_property->props34.lock); /* Type specific data: */ gnet_property->props34.type = PROP_TYPE_GUINT32; @@ -1723,7 +1894,9 @@ gnet_property->props35.desc = _("Delay in seconds before retrying after a connection timed out."); gnet_property->props35.ev_changed = event_new("download_retry_timeout_delay_changed"); gnet_property->props35.save = TRUE; + gnet_property->props35.internal = FALSE; gnet_property->props35.vector_size = 1; + mutex_init(&gnet_property->props35.lock); /* Type specific data: */ gnet_property->props35.type = PROP_TYPE_GUINT32; @@ -1743,7 +1916,9 @@ gnet_property->props36.desc = _("Delay in seconds before retrying after getting a 'busy' response from a host."); gnet_property->props36.ev_changed = event_new("download_retry_busy_delay_changed"); gnet_property->props36.save = TRUE; + gnet_property->props36.internal = FALSE; gnet_property->props36.vector_size = 1; + mutex_init(&gnet_property->props36.lock); /* Type specific data: */ gnet_property->props36.type = PROP_TYPE_GUINT32; @@ -1763,7 +1938,9 @@ gnet_property->props37.desc = _("Delay in seconds before retrying after getting a 'connection refused' response from a host."); gnet_property->props37.ev_changed = event_new("download_retry_refused_delay_changed"); gnet_property->props37.save = TRUE; + gnet_property->props37.internal = FALSE; gnet_property->props37.vector_size = 1; + mutex_init(&gnet_property->props37.lock); /* Type specific data: */ gnet_property->props37.type = PROP_TYPE_GUINT32; @@ -1783,7 +1960,9 @@ gnet_property->props38.desc = _("Delay in seconds before retrying after a retry stopped (timed out, connection reset by peer, etc...)."); gnet_property->props38.ev_changed = event_new("download_retry_stopped_delay_changed"); gnet_property->props38.save = TRUE; + gnet_property->props38.internal = FALSE; gnet_property->props38.vector_size = 1; + mutex_init(&gnet_property->props38.lock); /* Type specific data: */ gnet_property->props38.type = PROP_TYPE_GUINT32; @@ -1803,7 +1982,9 @@ gnet_property->props39.desc = _("Amount of bytes to overlap when resuming a download. It should be at least 64 bytes for safe resuming, otherwise gtk-gnutella will not accept to resume a file for which we had no SHA1 known, after a server gives one back."); gnet_property->props39.ev_changed = event_new("download_overlap_range_changed"); gnet_property->props39.save = TRUE; + gnet_property->props39.internal = FALSE; gnet_property->props39.vector_size = 1; + mutex_init(&gnet_property->props39.lock); /* Type specific data: */ gnet_property->props39.type = PROP_TYPE_GUINT32; @@ -1823,7 +2004,9 @@ gnet_property->props40.desc = _("Number of seconds before an upload times out if no connection can be established during a push. It is also the maximum amount of time we wait to get the whole HTTP request."); gnet_property->props40.ev_changed = event_new("upload_connecting_timeout_changed"); gnet_property->props40.save = TRUE; + gnet_property->props40.internal = FALSE; gnet_property->props40.vector_size = 1; + mutex_init(&gnet_property->props40.lock); /* Type specific data: */ gnet_property->props40.type = PROP_TYPE_GUINT32; @@ -1843,7 +2026,9 @@ gnet_property->props41.desc = _("Number of seconds after which an upload times out if no data is transmitted."); gnet_property->props41.ev_changed = event_new("upload_connected_timeout_changed"); gnet_property->props41.save = TRUE; + gnet_property->props41.internal = FALSE; gnet_property->props41.vector_size = 1; + mutex_init(&gnet_property->props41.lock); /* Type specific data: */ gnet_property->props41.type = PROP_TYPE_GUINT32; @@ -1863,7 +2048,9 @@ gnet_property->props42.desc = _("Amount of seconds to wait before a search is issued again to see if new results are available. Be very careful with this parameter, and do not set it too low or you will damage the Gnutella network. A delay of half an hour is fine."); gnet_property->props42.ev_changed = event_new("search_reissue_timeout_changed"); gnet_property->props42.save = TRUE; + gnet_property->props42.internal = FALSE; gnet_property->props42.vector_size = 1; + mutex_init(&gnet_property->props42.lock); /* Type specific data: */ gnet_property->props42.type = PROP_TYPE_GUINT32; @@ -1883,7 +2070,9 @@ gnet_property->props43.desc = _("Maximum ratio of file descriptors reserved for banning. For instance, if your OS gives you 350 file descriptors, a ratio of 10 will reserve at most 35 file descriptors. You should ensure you have around 100 file descriptors for efficient banning."); gnet_property->props43.ev_changed = event_new("ban_ratio_fds_changed"); gnet_property->props43.save = TRUE; + gnet_property->props43.internal = FALSE; gnet_property->props43.vector_size = 1; + mutex_init(&gnet_property->props43.lock); /* Type specific data: */ gnet_property->props43.type = PROP_TYPE_GUINT32; @@ -1903,7 +2092,9 @@ gnet_property->props44.desc = _("Maximum number of file descriptors reserved for banning."); gnet_property->props44.ev_changed = event_new("ban_max_fds_changed"); gnet_property->props44.save = TRUE; + gnet_property->props44.internal = FALSE; gnet_property->props44.vector_size = 1; + mutex_init(&gnet_property->props44.lock); /* Type specific data: */ gnet_property->props44.type = PROP_TYPE_GUINT32; @@ -1923,7 +2114,9 @@ gnet_property->props45.desc = _("Amount of file descriptors currently used for banning, i.e. which are currently kept open for delayed close."); gnet_property->props45.ev_changed = event_new("banned_count_changed"); gnet_property->props45.save = FALSE; + gnet_property->props45.internal = TRUE; gnet_property->props45.vector_size = 1; + mutex_init(&gnet_property->props45.lock); /* Type specific data: */ gnet_property->props45.type = PROP_TYPE_GUINT32; @@ -1943,7 +2136,9 @@ gnet_property->props46.desc = _("Number of file descriptors we'll actually be using for banning."); gnet_property->props46.ev_changed = event_new("max_banned_fd_changed"); gnet_property->props46.save = FALSE; + gnet_property->props46.internal = TRUE; gnet_property->props46.vector_size = 1; + mutex_init(&gnet_property->props46.lock); /* Type specific data: */ gnet_property->props46.type = PROP_TYPE_GUINT32; @@ -1963,7 +2158,9 @@ gnet_property->props47.desc = _("Number of seconds an incoming connection has to start sending out its request."); gnet_property->props47.ev_changed = event_new("incoming_connecting_timeout_changed"); gnet_property->props47.save = TRUE; + gnet_property->props47.internal = FALSE; gnet_property->props47.vector_size = 1; + mutex_init(&gnet_property->props47.lock); /* Type specific data: */ gnet_property->props47.type = PROP_TYPE_GUINT32; @@ -1983,7 +2180,9 @@ gnet_property->props48.desc = _("Number of seconds before a Gnet connect attempt times out if no connection can be established."); gnet_property->props48.ev_changed = event_new("node_connecting_timeout_changed"); gnet_property->props48.save = TRUE; + gnet_property->props48.internal = FALSE; gnet_property->props48.vector_size = 1; + mutex_init(&gnet_property->props48.lock); /* Type specific data: */ gnet_property->props48.type = PROP_TYPE_GUINT32; @@ -1991,7 +2190,7 @@ gnet_property->props48.data.guint32.value = (void *) &gnet_property_variable_node_connecting_timeout; gnet_property->props48.data.guint32.choices = NULL; gnet_property->props48.data.guint32.max = 100000; - gnet_property->props48.data.guint32.min = 15; + gnet_property->props48.data.guint32.min = 30; /* @@ -2003,7 +2202,9 @@ gnet_property->props49.desc = _("Number of seconds before a Gnet connection times out if no data is transmitted."); gnet_property->props49.ev_changed = event_new("node_connected_timeout_changed"); gnet_property->props49.save = TRUE; + gnet_property->props49.internal = FALSE; gnet_property->props49.vector_size = 1; + mutex_init(&gnet_property->props49.lock); /* Type specific data: */ gnet_property->props49.type = PROP_TYPE_GUINT32; @@ -2023,7 +2224,9 @@ gnet_property->props50.desc = _("Maximum size of the sendqueue for the nodes (in bytes). Must be at least 150 percent of the maximum message size."); gnet_property->props50.ev_changed = event_new("node_sendqueue_size_changed"); gnet_property->props50.save = TRUE; + gnet_property->props50.internal = FALSE; gnet_property->props50.vector_size = 1; + mutex_init(&gnet_property->props50.lock); /* Type specific data: */ gnet_property->props50.type = PROP_TYPE_GUINT32; @@ -2043,7 +2246,9 @@ gnet_property->props51.desc = _("Maximum number of seconds a node can remain in transmit flow control before being kicked out."); gnet_property->props51.ev_changed = event_new("node_tx_flowc_timeout_changed"); gnet_property->props51.save = TRUE; + gnet_property->props51.internal = FALSE; gnet_property->props51.vector_size = 1; + mutex_init(&gnet_property->props51.lock); /* Type specific data: */ gnet_property->props51.type = PROP_TYPE_GUINT32; @@ -2063,7 +2268,9 @@ gnet_property->props52.desc = _("Maximum percentage of time over 5 minutes that our node can remain in flow control remotely before dropping the connection. This only works with nodes that will send us an hops-flow message when they are flow-controlling us."); gnet_property->props52.ev_changed = event_new("node_rx_flowc_ratio_changed"); gnet_property->props52.save = TRUE; + gnet_property->props52.internal = FALSE; gnet_property->props52.vector_size = 1; + mutex_init(&gnet_property->props52.lock); /* Type specific data: */ gnet_property->props52.type = PROP_TYPE_GUINT32; @@ -2083,7 +2290,9 @@ gnet_property->props53.desc = _("Maximum TTL we allow in messages we broadcast. If a query comes in with a TTL greater than that, it will be trimmed down to that value. On Gnutella, the standard is TTL=4, so you cannot set a value lower than that."); gnet_property->props53.ev_changed = event_new("max_ttl_changed"); gnet_property->props53.save = TRUE; + gnet_property->props53.internal = FALSE; gnet_property->props53.vector_size = 1; + mutex_init(&gnet_property->props53.lock); /* Type specific data: */ gnet_property->props53.type = PROP_TYPE_GUINT32; @@ -2103,7 +2312,9 @@ gnet_property->props54.desc = _("The TTL we use in messages we generate. The default on Gnutella is TTL=4. If you set it to too large a value, you run the risk of being trimmed down by fellow gtk-gnutella nodes, or kicked out by some other servent."); gnet_property->props54.ev_changed = event_new("my_ttl_changed"); gnet_property->props54.save = TRUE; + gnet_property->props54.internal = FALSE; gnet_property->props54.vector_size = 1; + mutex_init(&gnet_property->props54.lock); /* Type specific data: */ gnet_property->props54.type = PROP_TYPE_GUINT32; @@ -2123,7 +2334,9 @@ gnet_property->props55.desc = _("Maximum hard TTL limit (hops + TTL) on messages we relay. This should be greater than the standard TTL=4, because it is also applied to routed-back messages (query hits) that could be re-routed in case a connection is lost. Standard broadcasted messages have their TTL limited by the maximum TTL you configure, and that limit should be much lower than the value of this parameter."); gnet_property->props55.ev_changed = event_new("hard_ttl_limit_changed"); gnet_property->props55.save = TRUE; + gnet_property->props55.internal = FALSE; gnet_property->props55.vector_size = 1; + mutex_init(&gnet_property->props55.lock); /* Type specific data: */ gnet_property->props55.type = PROP_TYPE_GUINT32; @@ -2143,7 +2356,9 @@ gnet_property->props56.desc = _("For development use: debug level."); gnet_property->props56.ev_changed = event_new("dbg_changed"); gnet_property->props56.save = TRUE; + gnet_property->props56.internal = FALSE; gnet_property->props56.vector_size = 1; + mutex_init(&gnet_property->props56.lock); /* Type specific data: */ gnet_property->props56.type = PROP_TYPE_GUINT32; @@ -2163,7 +2378,9 @@ gnet_property->props57.desc = _("Debug level for banning code."); gnet_property->props57.ev_changed = event_new("ban_debug_changed"); gnet_property->props57.save = TRUE; + gnet_property->props57.internal = FALSE; gnet_property->props57.vector_size = 1; + mutex_init(&gnet_property->props57.lock); /* Type specific data: */ gnet_property->props57.type = PROP_TYPE_GUINT32; @@ -2183,7 +2400,9 @@ gnet_property->props58.desc = _("If not zero, periodic messages show the used CPU time."); gnet_property->props58.ev_changed = event_new("cpu_debug_changed"); gnet_property->props58.save = TRUE; + gnet_property->props58.internal = FALSE; gnet_property->props58.vector_size = 1; + mutex_init(&gnet_property->props58.lock); /* Type specific data: */ gnet_property->props58.type = PROP_TYPE_GUINT32; @@ -2203,7 +2422,9 @@ gnet_property->props59.desc = _("Debug level for download mesh management."); gnet_property->props59.ev_changed = event_new("dmesh_debug_changed"); gnet_property->props59.save = TRUE; + gnet_property->props59.internal = FALSE; gnet_property->props59.vector_size = 1; + mutex_init(&gnet_property->props59.lock); /* Type specific data: */ gnet_property->props59.type = PROP_TYPE_GUINT32; @@ -2223,7 +2444,9 @@ gnet_property->props60.desc = _("Debug level for Gnutella messages."); gnet_property->props60.ev_changed = event_new("gmsg_debug_changed"); gnet_property->props60.save = TRUE; + gnet_property->props60.internal = FALSE; gnet_property->props60.vector_size = 1; + mutex_init(&gnet_property->props60.lock); /* Type specific data: */ gnet_property->props60.type = PROP_TYPE_GUINT32; @@ -2243,7 +2466,9 @@ gnet_property->props61.desc = _("Debug level for file sharing code."); gnet_property->props61.ev_changed = event_new("share_debug_changed"); gnet_property->props61.save = TRUE; + gnet_property->props61.internal = FALSE; gnet_property->props61.vector_size = 1; + mutex_init(&gnet_property->props61.lock); /* Type specific data: */ gnet_property->props61.type = PROP_TYPE_GUINT32; @@ -2263,7 +2488,9 @@ gnet_property->props62.desc = _("Debug level for Gnutella nodes."); gnet_property->props62.ev_changed = event_new("node_debug_changed"); gnet_property->props62.save = TRUE; + gnet_property->props62.internal = FALSE; gnet_property->props62.vector_size = 1; + mutex_init(&gnet_property->props62.lock); /* Type specific data: */ gnet_property->props62.type = PROP_TYPE_GUINT32; @@ -2283,7 +2510,9 @@ gnet_property->props63.desc = _("Debug level for sockets."); gnet_property->props63.ev_changed = event_new("socket_debug_changed"); gnet_property->props63.save = TRUE; + gnet_property->props63.internal = FALSE; gnet_property->props63.vector_size = 1; + mutex_init(&gnet_property->props63.lock); /* Type specific data: */ gnet_property->props63.type = PROP_TYPE_GUINT32; @@ -2303,7 +2532,9 @@ gnet_property->props64.desc = _("Debug level for bootstrapping into the network."); gnet_property->props64.ev_changed = event_new("bootstrap_debug_changed"); gnet_property->props64.save = TRUE; + gnet_property->props64.internal = FALSE; gnet_property->props64.vector_size = 1; + mutex_init(&gnet_property->props64.lock); /* Type specific data: */ gnet_property->props64.type = PROP_TYPE_GUINT32; @@ -2323,7 +2554,9 @@ gnet_property->props65.desc = _("Debug level for HTTP code."); gnet_property->props65.ev_changed = event_new("http_debug_changed"); gnet_property->props65.save = TRUE; + gnet_property->props65.internal = FALSE; gnet_property->props65.vector_size = 1; + mutex_init(&gnet_property->props65.lock); /* Type specific data: */ gnet_property->props65.type = PROP_TYPE_GUINT32; @@ -2343,7 +2576,9 @@ gnet_property->props66.desc = _("Debug level for downloads."); gnet_property->props66.ev_changed = event_new("download_debug_changed"); gnet_property->props66.save = TRUE; + gnet_property->props66.internal = FALSE; gnet_property->props66.vector_size = 1; + mutex_init(&gnet_property->props66.lock); /* Type specific data: */ gnet_property->props66.type = PROP_TYPE_GUINT32; @@ -2363,7 +2598,9 @@ gnet_property->props67.desc = _("Debug level for fileinfo."); gnet_property->props67.ev_changed = event_new("fileinfo_debug_changed"); gnet_property->props67.save = TRUE; + gnet_property->props67.internal = FALSE; gnet_property->props67.vector_size = 1; + mutex_init(&gnet_property->props67.lock); /* Type specific data: */ gnet_property->props67.type = PROP_TYPE_GUINT32; @@ -2383,7 +2620,9 @@ gnet_property->props68.desc = _("Debug level for uploads."); gnet_property->props68.ev_changed = event_new("upload_debug_changed"); gnet_property->props68.save = TRUE; + gnet_property->props68.internal = FALSE; gnet_property->props68.vector_size = 1; + mutex_init(&gnet_property->props68.lock); /* Type specific data: */ gnet_property->props68.type = PROP_TYPE_GUINT32; @@ -2403,7 +2642,9 @@ gnet_property->props69.desc = _("Debug level for code shared between gui and core."); gnet_property->props69.ev_changed = event_new("lib_debug_changed"); gnet_property->props69.save = TRUE; + gnet_property->props69.internal = FALSE; gnet_property->props69.vector_size = 1; + mutex_init(&gnet_property->props69.lock); /* Type specific data: */ gnet_property->props69.type = PROP_TYPE_GUINT32; @@ -2415,808 +2656,894 @@ /* - * PROP_BITZI_DEBUG: + * PROP_URL_DEBUG: * * General data: */ - gnet_property->props70.name = "bitzi_debug"; - gnet_property->props70.desc = _("Verbosity of Bitzi related debug messages."); - gnet_property->props70.ev_changed = event_new("bitzi_debug_changed"); + gnet_property->props70.name = "url_debug"; + gnet_property->props70.desc = _("Verbosity of URL handling related debug messages."); + gnet_property->props70.ev_changed = event_new("url_debug_changed"); gnet_property->props70.save = TRUE; + gnet_property->props70.internal = FALSE; gnet_property->props70.vector_size = 1; + mutex_init(&gnet_property->props70.lock); /* Type specific data: */ gnet_property->props70.type = PROP_TYPE_GUINT32; - gnet_property->props70.data.guint32.def = (void *) &gnet_property_variable_bitzi_debug_default; - gnet_property->props70.data.guint32.value = (void *) &gnet_property_variable_bitzi_debug; + gnet_property->props70.data.guint32.def = (void *) &gnet_property_variable_url_debug_default; + gnet_property->props70.data.guint32.value = (void *) &gnet_property_variable_url_debug; gnet_property->props70.data.guint32.choices = NULL; gnet_property->props70.data.guint32.max = 20; gnet_property->props70.data.guint32.min = 0; /* - * PROP_URL_DEBUG: + * PROP_DH_DEBUG: * * General data: */ - gnet_property->props71.name = "url_debug"; - gnet_property->props71.desc = _("Verbosity of URL handling related debug messages."); - gnet_property->props71.ev_changed = event_new("url_debug_changed"); + gnet_property->props71.name = "dh_debug"; + gnet_property->props71.desc = _("Debug level for dynamic query hit routing."); + gnet_property->props71.ev_changed = event_new("dh_debug_changed"); gnet_property->props71.save = TRUE; + gnet_property->props71.internal = FALSE; gnet_property->props71.vector_size = 1; + mutex_init(&gnet_property->props71.lock); /* Type specific data: */ gnet_property->props71.type = PROP_TYPE_GUINT32; - gnet_property->props71.data.guint32.def = (void *) &gnet_property_variable_url_debug_default; - gnet_property->props71.data.guint32.value = (void *) &gnet_property_variable_url_debug; + gnet_property->props71.data.guint32.def = (void *) &gnet_property_variable_dh_debug_default; + gnet_property->props71.data.guint32.value = (void *) &gnet_property_variable_dh_debug; gnet_property->props71.data.guint32.choices = NULL; gnet_property->props71.data.guint32.max = 20; gnet_property->props71.data.guint32.min = 0; /* - * PROP_DH_DEBUG: + * PROP_DQ_DEBUG: * * General data: */ - gnet_property->props72.name = "dh_debug"; - gnet_property->props72.desc = _("Debug level for dynamic query hit routing."); - gnet_property->props72.ev_changed = event_new("dh_debug_changed"); + gnet_property->props72.name = "dq_debug"; + gnet_property->props72.desc = _("Debug level for dynamic queries."); + gnet_property->props72.ev_changed = event_new("dq_debug_changed"); gnet_property->props72.save = TRUE; + gnet_property->props72.internal = FALSE; gnet_property->props72.vector_size = 1; + mutex_init(&gnet_property->props72.lock); /* Type specific data: */ gnet_property->props72.type = PROP_TYPE_GUINT32; - gnet_property->props72.data.guint32.def = (void *) &gnet_property_variable_dh_debug_default; - gnet_property->props72.data.guint32.value = (void *) &gnet_property_variable_dh_debug; + gnet_property->props72.data.guint32.def = (void *) &gnet_property_variable_dq_debug_default; + gnet_property->props72.data.guint32.value = (void *) &gnet_property_variable_dq_debug; gnet_property->props72.data.guint32.choices = NULL; gnet_property->props72.data.guint32.max = 20; gnet_property->props72.data.guint32.min = 0; /* - * PROP_DQ_DEBUG: + * PROP_VMSG_DEBUG: * * General data: */ - gnet_property->props73.name = "dq_debug"; - gnet_property->props73.desc = _("Debug level for dynamic queries."); - gnet_property->props73.ev_changed = event_new("dq_debug_changed"); + gnet_property->props73.name = "vmsg_debug"; + gnet_property->props73.desc = _("Debug level for vendor messages."); + gnet_property->props73.ev_changed = event_new("vmsg_debug_changed"); gnet_property->props73.save = TRUE; + gnet_property->props73.internal = FALSE; gnet_property->props73.vector_size = 1; + mutex_init(&gnet_property->props73.lock); /* Type specific data: */ gnet_property->props73.type = PROP_TYPE_GUINT32; - gnet_property->props73.data.guint32.def = (void *) &gnet_property_variable_dq_debug_default; - gnet_property->props73.data.guint32.value = (void *) &gnet_property_variable_dq_debug; + gnet_property->props73.data.guint32.def = (void *) &gnet_property_variable_vmsg_debug_default; + gnet_property->props73.data.guint32.value = (void *) &gnet_property_variable_vmsg_debug; gnet_property->props73.data.guint32.choices = NULL; gnet_property->props73.data.guint32.max = 20; gnet_property->props73.data.guint32.min = 0; /* - * PROP_VMSG_DEBUG: + * PROP_QUERY_DEBUG: * * General data: */ - gnet_property->props74.name = "vmsg_debug"; - gnet_property->props74.desc = _("Debug level for vendor messages."); - gnet_property->props74.ev_changed = event_new("vmsg_debug_changed"); + gnet_property->props74.name = "query_debug"; + gnet_property->props74.desc = _("Debug level for queries."); + gnet_property->props74.ev_changed = event_new("query_debug_changed"); gnet_property->props74.save = TRUE; + gnet_property->props74.internal = FALSE; gnet_property->props74.vector_size = 1; + mutex_init(&gnet_property->props74.lock); /* Type specific data: */ gnet_property->props74.type = PROP_TYPE_GUINT32; - gnet_property->props74.data.guint32.def = (void *) &gnet_property_variable_vmsg_debug_default; - gnet_property->props74.data.guint32.value = (void *) &gnet_property_variable_vmsg_debug; + gnet_property->props74.data.guint32.def = (void *) &gnet_property_variable_query_debug_default; + gnet_property->props74.data.guint32.value = (void *) &gnet_property_variable_query_debug; gnet_property->props74.data.guint32.choices = NULL; gnet_property->props74.data.guint32.max = 20; gnet_property->props74.data.guint32.min = 0; /* - * PROP_QUERY_DEBUG: + * PROP_SEARCH_DEBUG: * * General data: */ - gnet_property->props75.name = "query_debug"; - gnet_property->props75.desc = _("Debug level for queries."); - gnet_property->props75.ev_changed = event_new("query_debug_changed"); + gnet_property->props75.name = "search_debug"; + gnet_property->props75.desc = _("Debug level for searches and search results management."); + gnet_property->props75.ev_changed = event_new("search_debug_changed"); gnet_property->props75.save = TRUE; + gnet_property->props75.internal = FALSE; gnet_property->props75.vector_size = 1; + mutex_init(&gnet_property->props75.lock); /* Type specific data: */ gnet_property->props75.type = PROP_TYPE_GUINT32; - gnet_property->props75.data.guint32.def = (void *) &gnet_property_variable_query_debug_default; - gnet_property->props75.data.guint32.value = (void *) &gnet_property_variable_query_debug; + gnet_property->props75.data.guint32.def = (void *) &gnet_property_variable_search_debug_default; + gnet_property->props75.data.guint32.value = (void *) &gnet_property_variable_search_debug; gnet_property->props75.data.guint32.choices = NULL; gnet_property->props75.data.guint32.max = 20; gnet_property->props75.data.guint32.min = 0; /* - * PROP_SEARCH_DEBUG: + * PROP_UDP_DEBUG: * * General data: */ - gnet_property->props76.name = "search_debug"; - gnet_property->props76.desc = _("Debug level for searches and search results management."); - gnet_property->props76.ev_changed = event_new("search_debug_changed"); + gnet_property->props76.name = "udp_debug"; + gnet_property->props76.desc = _("Debug level for the UDP traffic layer."); + gnet_property->props76.ev_changed = event_new("udp_debug_changed"); gnet_property->props76.save = TRUE; + gnet_property->props76.internal = FALSE; gnet_property->props76.vector_size = 1; + mutex_init(&gnet_property->props76.lock); /* Type specific data: */ gnet_property->props76.type = PROP_TYPE_GUINT32; - gnet_property->props76.data.guint32.def = (void *) &gnet_property_variable_search_debug_default; - gnet_property->props76.data.guint32.value = (void *) &gnet_property_variable_search_debug; + gnet_property->props76.data.guint32.def = (void *) &gnet_property_variable_udp_debug_default; + gnet_property->props76.data.guint32.value = (void *) &gnet_property_variable_udp_debug; gnet_property->props76.data.guint32.choices = NULL; gnet_property->props76.data.guint32.max = 20; gnet_property->props76.data.guint32.min = 0; /* - * PROP_UDP_DEBUG: + * PROP_QRP_DEBUG: * * General data: */ - gnet_property->props77.name = "udp_debug"; - gnet_property->props77.desc = _("Debug level for the UDP traffic layer."); - gnet_property->props77.ev_changed = event_new("udp_debug_changed"); + gnet_property->props77.name = "qrp_debug"; + gnet_property->props77.desc = _("Debug level for the Query Routing Protocol."); + gnet_property->props77.ev_changed = event_new("qrp_debug_changed"); gnet_property->props77.save = TRUE; + gnet_property->props77.internal = FALSE; gnet_property->props77.vector_size = 1; + mutex_init(&gnet_property->props77.lock); /* Type specific data: */ gnet_property->props77.type = PROP_TYPE_GUINT32; - gnet_property->props77.data.guint32.def = (void *) &gnet_property_variable_udp_debug_default; - gnet_property->props77.data.guint32.value = (void *) &gnet_property_variable_udp_debug; + gnet_property->props77.data.guint32.def = (void *) &gnet_property_variable_qrp_debug_default; + gnet_property->props77.data.guint32.value = (void *) &gnet_property_variable_qrp_debug; gnet_property->props77.data.guint32.choices = NULL; gnet_property->props77.data.guint32.max = 20; gnet_property->props77.data.guint32.min = 0; /* - * PROP_QRP_DEBUG: + * PROP_ROUTING_DEBUG: * * General data: */ - gnet_property->props78.name = "qrp_debug"; - gnet_property->props78.desc = _("Debug level for the Query Routing Protocol."); - gnet_property->props78.ev_changed = event_new("qrp_debug_changed"); + gnet_property->props78.name = "routing_debug"; + gnet_property->props78.desc = _("Debug level for message routing."); + gnet_property->props78.ev_changed = event_new("routing_debug_changed"); gnet_property->props78.save = TRUE; + gnet_property->props78.internal = FALSE; gnet_property->props78.vector_size = 1; + mutex_init(&gnet_property->props78.lock); /* Type specific data: */ gnet_property->props78.type = PROP_TYPE_GUINT32; - gnet_property->props78.data.guint32.def = (void *) &gnet_property_variable_qrp_debug_default; - gnet_property->props78.data.guint32.value = (void *) &gnet_property_variable_qrp_debug; + gnet_property->props78.data.guint32.def = (void *) &gnet_property_variable_routing_debug_default; + gnet_property->props78.data.guint32.value = (void *) &gnet_property_variable_routing_debug; gnet_property->props78.data.guint32.choices = NULL; gnet_property->props78.data.guint32.max = 20; gnet_property->props78.data.guint32.min = 0; /* - * PROP_ROUTING_DEBUG: + * PROP_GGEP_DEBUG: * * General data: */ - gnet_property->props79.name = "routing_debug"; - gnet_property->props79.desc = _("Debug level for message routing."); - gnet_property->props79.ev_changed = event_new("routing_debug_changed"); + gnet_property->props79.name = "ggep_debug"; + gnet_property->props79.desc = _("Debug level for GGEP."); + gnet_property->props79.ev_changed = event_new("ggep_debug_changed"); gnet_property->props79.save = TRUE; + gnet_property->props79.internal = FALSE; gnet_property->props79.vector_size = 1; + mutex_init(&gnet_property->props79.lock); /* Type specific data: */ gnet_property->props79.type = PROP_TYPE_GUINT32; - gnet_property->props79.data.guint32.def = (void *) &gnet_property_variable_routing_debug_default; - gnet_property->props79.data.guint32.value = (void *) &gnet_property_variable_routing_debug; + gnet_property->props79.data.guint32.def = (void *) &gnet_property_variable_ggep_debug_default; + gnet_property->props79.data.guint32.value = (void *) &gnet_property_variable_ggep_debug; gnet_property->props79.data.guint32.choices = NULL; gnet_property->props79.data.guint32.max = 20; gnet_property->props79.data.guint32.min = 0; /* - * PROP_GGEP_DEBUG: + * PROP_PCACHE_DEBUG: * * General data: */ - gnet_property->props80.name = "ggep_debug"; - gnet_property->props80.desc = _("Debug level for GGEP."); - gnet_property->props80.ev_changed = event_new("ggep_debug_changed"); + gnet_property->props80.name = "pcache_debug"; + gnet_property->props80.desc = _("Debug level for pong caching."); + gnet_property->props80.ev_changed = event_new("pcache_debug_changed"); gnet_property->props80.save = TRUE; + gnet_property->props80.internal = FALSE; gnet_property->props80.vector_size = 1; + mutex_init(&gnet_property->props80.lock); /* Type specific data: */ gnet_property->props80.type = PROP_TYPE_GUINT32; - gnet_property->props80.data.guint32.def = (void *) &gnet_property_variable_ggep_debug_default; - gnet_property->props80.data.guint32.value = (void *) &gnet_property_variable_ggep_debug; + gnet_property->props80.data.guint32.def = (void *) &gnet_property_variable_pcache_debug_default; + gnet_property->props80.data.guint32.value = (void *) &gnet_property_variable_pcache_debug; gnet_property->props80.data.guint32.choices = NULL; gnet_property->props80.data.guint32.max = 20; gnet_property->props80.data.guint32.min = 0; /* - * PROP_PCACHE_DEBUG: + * PROP_HSEP_DEBUG: * * General data: */ - gnet_property->props81.name = "pcache_debug"; - gnet_property->props81.desc = _("Debug level for pong caching."); - gnet_property->props81.ev_changed = event_new("pcache_debug_changed"); + gnet_property->props81.name = "hsep_debug"; + gnet_property->props81.desc = _("Debug level for HSEP."); + gnet_property->props81.ev_changed = event_new("hsep_debug_changed"); gnet_property->props81.save = TRUE; + gnet_property->props81.internal = FALSE; gnet_property->props81.vector_size = 1; + mutex_init(&gnet_property->props81.lock); /* Type specific data: */ gnet_property->props81.type = PROP_TYPE_GUINT32; - gnet_property->props81.data.guint32.def = (void *) &gnet_property_variable_pcache_debug_default; - gnet_property->props81.data.guint32.value = (void *) &gnet_property_variable_pcache_debug; + gnet_property->props81.data.guint32.def = (void *) &gnet_property_variable_hsep_debug_default; + gnet_property->props81.data.guint32.value = (void *) &gnet_property_variable_hsep_debug; gnet_property->props81.data.guint32.choices = NULL; gnet_property->props81.data.guint32.max = 20; gnet_property->props81.data.guint32.min = 0; /* - * PROP_HSEP_DEBUG: + * PROP_TLS_DEBUG: * * General data: */ - gnet_property->props82.name = "hsep_debug"; - gnet_property->props82.desc = _("Debug level for HSEP."); - gnet_property->props82.ev_changed = event_new("hsep_debug_changed"); + gnet_property->props82.name = "tls_debug"; + gnet_property->props82.desc = _("Debug level for TLS."); + gnet_property->props82.ev_changed = event_new("tls_debug_changed"); gnet_property->props82.save = TRUE; + gnet_property->props82.internal = FALSE; gnet_property->props82.vector_size = 1; + mutex_init(&gnet_property->props82.lock); /* Type specific data: */ gnet_property->props82.type = PROP_TYPE_GUINT32; - gnet_property->props82.data.guint32.def = (void *) &gnet_property_variable_hsep_debug_default; - gnet_property->props82.data.guint32.value = (void *) &gnet_property_variable_hsep_debug; + gnet_property->props82.data.guint32.def = (void *) &gnet_property_variable_tls_debug_default; + gnet_property->props82.data.guint32.value = (void *) &gnet_property_variable_tls_debug; gnet_property->props82.data.guint32.choices = NULL; gnet_property->props82.data.guint32.max = 20; gnet_property->props82.data.guint32.min = 0; /* - * PROP_TLS_DEBUG: + * PROP_PARQ_DEBUG: * * General data: */ - gnet_property->props83.name = "tls_debug"; - gnet_property->props83.desc = _("Debug level for TLS."); - gnet_property->props83.ev_changed = event_new("tls_debug_changed"); + gnet_property->props83.name = "parq_debug"; + gnet_property->props83.desc = _("Debug level for PARQ."); + gnet_property->props83.ev_changed = event_new("parq_debug_changed"); gnet_property->props83.save = TRUE; + gnet_property->props83.internal = FALSE; gnet_property->props83.vector_size = 1; + mutex_init(&gnet_property->props83.lock); /* Type specific data: */ gnet_property->props83.type = PROP_TYPE_GUINT32; - gnet_property->props83.data.guint32.def = (void *) &gnet_property_variable_tls_debug_default; - gnet_property->props83.data.guint32.value = (void *) &gnet_property_variable_tls_debug; + gnet_property->props83.data.guint32.def = (void *) &gnet_property_variable_parq_debug_default; + gnet_property->props83.data.guint32.value = (void *) &gnet_property_variable_parq_debug; gnet_property->props83.data.guint32.choices = NULL; gnet_property->props83.data.guint32.max = 20; gnet_property->props83.data.guint32.min = 0; /* - * PROP_PARQ_DEBUG: + * PROP_PARQ_OPTIMISTIC: * * General data: */ - gnet_property->props84.name = "parq_debug"; - gnet_property->props84.desc = _("Debug level for PARQ."); - gnet_property->props84.ev_changed = event_new("parq_debug_changed"); + gnet_property->props84.name = "parq_optimistic"; + gnet_property->props84.desc = _("If set, PARQ will calculate its ETA and retry times more optimistically. If not set PARQ will calculate using a worst case scenario. The default is to be optimistic."); + gnet_property->props84.ev_changed = event_new("parq_optimistic_changed"); gnet_property->props84.save = TRUE; + gnet_property->props84.internal = FALSE; gnet_property->props84.vector_size = 1; + mutex_init(&gnet_property->props84.lock); /* Type specific data: */ - gnet_property->props84.type = PROP_TYPE_GUINT32; - gnet_property->props84.data.guint32.def = (void *) &gnet_property_variable_parq_debug_default; - gnet_property->props84.data.guint32.value = (void *) &gnet_property_variable_parq_debug; - gnet_property->props84.data.guint32.choices = NULL; - gnet_property->props84.data.guint32.max = 20; - gnet_property->props84.data.guint32.min = 0; + gnet_property->props84.type = PROP_TYPE_BOOLEAN; + gnet_property->props84.data.boolean.def = (void *) &gnet_property_variable_parq_optimistic_default; + gnet_property->props84.data.boolean.value = (void *) &gnet_property_variable_parq_optimistic; /* - * PROP_PARQ_OPTIMISTIC: + * PROP_PARQ_SIZE_ALWAYS_CONTINUE: * * General data: */ - gnet_property->props85.name = "parq_optimistic"; - gnet_property->props85.desc = _("If set, PARQ will calculate its ETA and retry times more optimistically. If not set PARQ will calculate using a worst case scenario. The default is to be optimistic."); - gnet_property->props85.ev_changed = event_new("parq_optimistic_changed"); + gnet_property->props85.name = "parq_size_always_continue"; + gnet_property->props85.desc = _("Maximum size in bytes of an upload which PARQ shall not queue and is always allowed to continue. However, if a client requests small chunks over and over the chunk sizes previously requested and uploaded are also counted. If the size requested is greater than the threshold then, and only then, we look at the theoretical time it would take to serve the whole amount to see whether we can still bypass queuing. Set to 0 to disable this size-based bypassing feature and only rely on time-based bypassing."); + gnet_property->props85.ev_changed = event_new("parq_size_always_continue_changed"); gnet_property->props85.save = TRUE; + gnet_property->props85.internal = FALSE; gnet_property->props85.vector_size = 1; + mutex_init(&gnet_property->props85.lock); /* Type specific data: */ - gnet_property->props85.type = PROP_TYPE_BOOLEAN; - gnet_property->props85.data.boolean.def = (void *) &gnet_property_variable_parq_optimistic_default; - gnet_property->props85.data.boolean.value = (void *) &gnet_property_variable_parq_optimistic; + gnet_property->props85.type = PROP_TYPE_GUINT32; + gnet_property->props85.data.guint32.def = (void *) &gnet_property_variable_parq_size_always_continue_default; + gnet_property->props85.data.guint32.value = (void *) &gnet_property_variable_parq_size_always_continue; + gnet_property->props85.data.guint32.choices = NULL; + gnet_property->props85.data.guint32.max = 0xFFFFFFFF; + gnet_property->props85.data.guint32.min = 0x00000000; /* - * PROP_PARQ_SIZE_ALWAYS_CONTINUE: + * PROP_PARQ_TIME_ALWAYS_CONTINUE: * * General data: */ - gnet_property->props86.name = "parq_size_always_continue"; - gnet_property->props86.desc = _("Maximum size in bytes of an upload which PARQ shall not queue and is always allowed to continue. However, if a client requests small chunks over and over the chunk sizes previously requested and uploaded are also counted. If the size requested is greater than the threshold then, and only then, we look at the theoretical time it would take to serve the whole amount to see whether we can still bypass queuing. Set to 0 to disable this size-based bypassing feature and only rely on time-based bypassing."); - gnet_property->props86.ev_changed = event_new("parq_size_always_continue_changed"); + gnet_property->props86.name = "parq_time_always_continue"; + gnet_property->props86.desc = _("When an upload is expected to take less than this setting in seconds, PARQ will be instructed to not queue the upload. This check is done AFTER the file size-based bypassing. Set to 0 to disable this time-based bypassing feature."); + gnet_property->props86.ev_changed = event_new("parq_time_always_continue_changed"); gnet_property->props86.save = TRUE; + gnet_property->props86.internal = FALSE; gnet_property->props86.vector_size = 1; + mutex_init(&gnet_property->props86.lock); /* Type specific data: */ gnet_property->props86.type = PROP_TYPE_GUINT32; - gnet_property->props86.data.guint32.def = (void *) &gnet_property_variable_parq_size_always_continue_default; - gnet_property->props86.data.guint32.value = (void *) &gnet_property_variable_parq_size_always_continue; + gnet_property->props86.data.guint32.def = (void *) &gnet_property_variable_parq_time_always_continue_default; + gnet_property->props86.data.guint32.value = (void *) &gnet_property_variable_parq_time_always_continue; gnet_property->props86.data.guint32.choices = NULL; gnet_property->props86.data.guint32.max = 0xFFFFFFFF; gnet_property->props86.data.guint32.min = 0x00000000; /* - * PROP_PARQ_TIME_ALWAYS_CONTINUE: + * PROP_PARQ_BAN_BAD_MAXCOUNTWAIT: * * General data: */ - gnet_property->props87.name = "parq_time_always_continue"; - gnet_property->props87.desc = _("When an upload is expected to take less than this setting in seconds, PARQ will be instructed to not queue the upload. This check is done AFTER the file size-based bypassing. Set to 0 to disable this time-based bypassing feature."); - gnet_property->props87.ev_changed = event_new("parq_time_always_continue_changed"); + gnet_property->props87.name = "parq_ban_bad_maxcountwait"; + gnet_property->props87.desc = _("Ban the client if it violates the Retry-After interval too often. Set this to 0 to disable the banning. The upload will be removed from the queue in any case though. Default is 10, so the client is banned after retrying too soon 10 times, which is a good balance between abuse and legacy client support."); + gnet_property->props87.ev_changed = event_new("parq_ban_bad_maxcountwait_changed"); gnet_property->props87.save = TRUE; + gnet_property->props87.internal = FALSE; gnet_property->props87.vector_size = 1; + mutex_init(&gnet_property->props87.lock); /* Type specific data: */ gnet_property->props87.type = PROP_TYPE_GUINT32; - gnet_property->props87.data.guint32.def = (void *) &gnet_property_variable_parq_time_always_continue_default; - gnet_property->props87.data.guint32.value = (void *) &gnet_property_variable_parq_time_always_continue; + gnet_property->props87.data.guint32.def = (void *) &gnet_property_variable_parq_ban_bad_maxcountwait_default; + gnet_property->props87.data.guint32.value = (void *) &gnet_property_variable_parq_ban_bad_maxcountwait; gnet_property->props87.data.guint32.choices = NULL; gnet_property->props87.data.guint32.max = 0xFFFFFFFF; gnet_property->props87.data.guint32.min = 0x00000000; /* - * PROP_PARQ_BAN_BAD_MAXCOUNTWAIT: + * PROP_NET_BUFFER_SHORTAGE: * * General data: */ - gnet_property->props88.name = "parq_ban_bad_maxcountwait"; - gnet_property->props88.desc = _("Ban the client if it violates the Retry-After interval too often. Set this to 0 to disable the banning. The upload will be removed from the queue in any case though. Default is 10, so the client is banned after retrying too soon 10 times, which is a good balance between abuse and legacy client support."); - gnet_property->props88.ev_changed = event_new("parq_ban_bad_maxcountwait_changed"); - gnet_property->props88.save = TRUE; + gnet_property->props88.name = "net_buffer_shortage"; + gnet_property->props88.desc = _("Indicates a kernel network buffer shortage."); + gnet_property->props88.ev_changed = event_new("net_buffer_shortage_changed"); + gnet_property->props88.save = FALSE; + gnet_property->props88.internal = TRUE; gnet_property->props88.vector_size = 1; + mutex_init(&gnet_property->props88.lock); /* Type specific data: */ - gnet_property->props88.type = PROP_TYPE_GUINT32; - gnet_property->props88.data.guint32.def = (void *) &gnet_property_variable_parq_ban_bad_maxcountwait_default; - gnet_property->props88.data.guint32.value = (void *) &gnet_property_variable_parq_ban_bad_maxcountwait; - gnet_property->props88.data.guint32.choices = NULL; - gnet_property->props88.data.guint32.max = 0xFFFFFFFF; - gnet_property->props88.data.guint32.min = 0x00000000; + gnet_property->props88.type = PROP_TYPE_BOOLEAN; + gnet_property->props88.data.boolean.def = (void *) &gnet_property_variable_net_buffer_shortage_default; + gnet_property->props88.data.boolean.value = (void *) &gnet_property_variable_net_buffer_shortage; /* - * PROP_TRACK_PROPS: + * PROP_STOP_HOST_GET: * * General data: */ - gnet_property->props89.name = "track_props"; - gnet_property->props89.desc = _("For development use: track properties."); - gnet_property->props89.ev_changed = event_new("track_props_changed"); + gnet_property->props89.name = "stop_host_get"; + gnet_property->props89.desc = _("For development use: don't add new hosts to the host cache."); + gnet_property->props89.ev_changed = event_new("stop_host_get_changed"); gnet_property->props89.save = TRUE; + gnet_property->props89.internal = FALSE; gnet_property->props89.vector_size = 1; + mutex_init(&gnet_property->props89.lock); /* Type specific data: */ - gnet_property->props89.type = PROP_TYPE_GUINT32; - gnet_property->props89.data.guint32.def = (void *) &gnet_property_variable_track_props_default; - gnet_property->props89.data.guint32.value = (void *) &gnet_property_variable_track_props; - gnet_property->props89.data.guint32.choices = NULL; - gnet_property->props89.data.guint32.max = 20; - gnet_property->props89.data.guint32.min = 0; + gnet_property->props89.type = PROP_TYPE_BOOLEAN; + gnet_property->props89.data.boolean.def = (void *) &gnet_property_variable_stop_host_get_default; + gnet_property->props89.data.boolean.value = (void *) &gnet_property_variable_stop_host_get; /* - * PROP_STOP_HOST_GET: + * PROP_BW_HTTP_IN_ENABLED: * * General data: */ - gnet_property->props90.name = "stop_host_get"; - gnet_property->props90.desc = _("For development use: don't add new hosts to the host cache."); - gnet_property->props90.ev_changed = event_new("stop_host_get_changed"); + gnet_property->props90.name = "bandwidth_input_limit"; + gnet_property->props90.desc = _("Enable bandwidth limitation for incoming HTTP traffic."); + gnet_property->props90.ev_changed = event_new("bw_http_in_enabled_changed"); gnet_property->props90.save = TRUE; + gnet_property->props90.internal = FALSE; gnet_property->props90.vector_size = 1; + mutex_init(&gnet_property->props90.lock); /* Type specific data: */ gnet_property->props90.type = PROP_TYPE_BOOLEAN; - gnet_property->props90.data.boolean.def = (void *) &gnet_property_variable_stop_host_get_default; - gnet_property->props90.data.boolean.value = (void *) &gnet_property_variable_stop_host_get; + gnet_property->props90.data.boolean.def = (void *) &gnet_property_variable_bws_in_enabled_default; + gnet_property->props90.data.boolean.value = (void *) &gnet_property_variable_bws_in_enabled; /* - * PROP_BW_HTTP_IN_ENABLED: + * PROP_BW_HTTP_OUT_ENABLED: * * General data: */ - gnet_property->props91.name = "bandwidth_input_limit"; - gnet_property->props91.desc = _("Enable bandwidth limitation for incoming HTTP traffic."); - gnet_property->props91.ev_changed = event_new("bw_http_in_enabled_changed"); + gnet_property->props91.name = "bandwidth_output_limit"; + gnet_property->props91.desc = _("Enable bandwidth limitation for outgoing HTTP traffic."); + gnet_property->props91.ev_changed = event_new("bw_http_out_enabled_changed"); gnet_property->props91.save = TRUE; + gnet_property->props91.internal = FALSE; gnet_property->props91.vector_size = 1; + mutex_init(&gnet_property->props91.lock); /* Type specific data: */ gnet_property->props91.type = PROP_TYPE_BOOLEAN; - gnet_property->props91.data.boolean.def = (void *) &gnet_property_variable_bws_in_enabled_default; - gnet_property->props91.data.boolean.value = (void *) &gnet_property_variable_bws_in_enabled; + gnet_property->props91.data.boolean.def = (void *) &gnet_property_variable_bws_out_enabled_default; + gnet_property->props91.data.boolean.value = (void *) &gnet_property_variable_bws_out_enabled; /* - * PROP_BW_HTTP_OUT_ENABLED: + * PROP_BW_GNET_IN_ENABLED: * * General data: */ - gnet_property->props92.name = "bandwidth_output_limit"; - gnet_property->props92.desc = _("Enable bandwidth limitation for outgoing HTTP traffic."); - gnet_property->props92.ev_changed = event_new("bw_http_out_enabled_changed"); + gnet_property->props92.name = "bandwidth_ginput_limit"; + gnet_property->props92.desc = _("Enable bandwidth limitation for incoming Gnet traffic."); + gnet_property->props92.ev_changed = event_new("bw_gnet_in_enabled_changed"); gnet_property->props92.save = TRUE; + gnet_property->props92.internal = FALSE; gnet_property->props92.vector_size = 1; + mutex_init(&gnet_property->props92.lock); /* Type specific data: */ gnet_property->props92.type = PROP_TYPE_BOOLEAN; - gnet_property->props92.data.boolean.def = (void *) &gnet_property_variable_bws_out_enabled_default; - gnet_property->props92.data.boolean.value = (void *) &gnet_property_variable_bws_out_enabled; + gnet_property->props92.data.boolean.def = (void *) &gnet_property_variable_bws_gin_enabled_default; + gnet_property->props92.data.boolean.value = (void *) &gnet_property_variable_bws_gin_enabled; /* - * PROP_BW_GNET_IN_ENABLED: + * PROP_BW_GNET_LEAF_IN_ENABLED: * * General data: */ - gnet_property->props93.name = "bandwidth_ginput_limit"; - gnet_property->props93.desc = _("Enable bandwidth limitation for incoming Gnet traffic."); - gnet_property->props93.ev_changed = event_new("bw_gnet_in_enabled_changed"); + gnet_property->props93.name = "bandwidth_glinput_limit"; + gnet_property->props93.desc = _("Enable bandwidth limitation for incoming Gnet leaf traffic."); + gnet_property->props93.ev_changed = event_new("bw_gnet_leaf_in_enabled_changed"); gnet_property->props93.save = TRUE; + gnet_property->props93.internal = FALSE; gnet_property->props93.vector_size = 1; + mutex_init(&gnet_property->props93.lock); /* Type specific data: */ gnet_property->props93.type = PROP_TYPE_BOOLEAN; - gnet_property->props93.data.boolean.def = (void *) &gnet_property_variable_bws_gin_enabled_default; - gnet_property->props93.data.boolean.value = (void *) &gnet_property_variable_bws_gin_enabled; + gnet_property->props93.data.boolean.def = (void *) &gnet_property_variable_bws_glin_enabled_default; + gnet_property->props93.data.boolean.value = (void *) &gnet_property_variable_bws_glin_enabled; /* - * PROP_BW_GNET_LEAF_IN_ENABLED: + * PROP_BW_GNET_OUT_ENABLED: * * General data: */ - gnet_property->props94.name = "bandwidth_glinput_limit"; - gnet_property->props94.desc = _("Enable bandwidth limitation for incoming Gnet leaf traffic."); - gnet_property->props94.ev_changed = event_new("bw_gnet_leaf_in_enabled_changed"); + gnet_property->props94.name = "bandwidth_goutput_limit"; + gnet_property->props94.desc = _("Enable bandwidth limitation for outgoing Gnet traffic."); + gnet_property->props94.ev_changed = event_new("bw_gnet_out_enabled_changed"); gnet_property->props94.save = TRUE; + gnet_property->props94.internal = FALSE; gnet_property->props94.vector_size = 1; + mutex_init(&gnet_property->props94.lock); /* Type specific data: */ gnet_property->props94.type = PROP_TYPE_BOOLEAN; - gnet_property->props94.data.boolean.def = (void *) &gnet_property_variable_bws_glin_enabled_default; - gnet_property->props94.data.boolean.value = (void *) &gnet_property_variable_bws_glin_enabled; + gnet_property->props94.data.boolean.def = (void *) &gnet_property_variable_bws_gout_enabled_default; + gnet_property->props94.data.boolean.value = (void *) &gnet_property_variable_bws_gout_enabled; /* - * PROP_BW_GNET_OUT_ENABLED: + * PROP_BW_GNET_LEAF_OUT_ENABLED: * * General data: */ - gnet_property->props95.name = "bandwidth_goutput_limit"; - gnet_property->props95.desc = _("Enable bandwidth limitation for outgoing Gnet traffic."); - gnet_property->props95.ev_changed = event_new("bw_gnet_out_enabled_changed"); + gnet_property->props95.name = "bandwidth_gloutput_limit"; + gnet_property->props95.desc = _("Enable bandwidth limitation for outgoing Gnet leaf traffic."); + gnet_property->props95.ev_changed = event_new("bw_gnet_leaf_out_enabled_changed"); gnet_property->props95.save = TRUE; + gnet_property->props95.internal = FALSE; gnet_property->props95.vector_size = 1; + mutex_init(&gnet_property->props95.lock); /* Type specific data: */ gnet_property->props95.type = PROP_TYPE_BOOLEAN; - gnet_property->props95.data.boolean.def = (void *) &gnet_property_variable_bws_gout_enabled_default; - gnet_property->props95.data.boolean.value = (void *) &gnet_property_variable_bws_gout_enabled; + gnet_property->props95.data.boolean.def = (void *) &gnet_property_variable_bws_glout_enabled_default; + gnet_property->props95.data.boolean.value = (void *) &gnet_property_variable_bws_glout_enabled; /* - * PROP_BW_GNET_LEAF_OUT_ENABLED: + * PROP_BW_UL_USAGE_ENABLED: * * General data: */ - gnet_property->props96.name = "bandwidth_gloutput_limit"; - gnet_property->props96.desc = _("Enable bandwidth limitation for outgoing Gnet leaf traffic."); - gnet_property->props96.ev_changed = event_new("bw_gnet_leaf_out_enabled_changed"); + gnet_property->props96.name = "bw_ul_usage_enabled"; + gnet_property->props96.desc = _("Enable dynamic upload slots allocation."); + gnet_property->props96.ev_changed = event_new("bw_ul_usage_enabled_changed"); gnet_property->props96.save = TRUE; + gnet_property->props96.internal = FALSE; gnet_property->props96.vector_size = 1; + mutex_init(&gnet_property->props96.lock); /* Type specific data: */ gnet_property->props96.type = PROP_TYPE_BOOLEAN; - gnet_property->props96.data.boolean.def = (void *) &gnet_property_variable_bws_glout_enabled_default; - gnet_property->props96.data.boolean.value = (void *) &gnet_property_variable_bws_glout_enabled; + gnet_property->props96.data.boolean.def = (void *) &gnet_property_variable_bw_ul_usage_enabled_default; + gnet_property->props96.data.boolean.value = (void *) &gnet_property_variable_bw_ul_usage_enabled; /* - * PROP_BW_UL_USAGE_ENABLED: + * PROP_BW_ALLOW_STEALING: * * General data: */ - gnet_property->props97.name = "bw_ul_usage_enabled"; - gnet_property->props97.desc = _("Enable dynamic upload slots allocation."); - gnet_property->props97.ev_changed = event_new("bw_ul_usage_enabled_changed"); + gnet_property->props97.name = "bw_allow_stealing"; + gnet_property->props97.desc = _("Allow HTTP and Gnutella to grab whatever bandwidth the other is not using. If FALSE, unused bandwidth is lost."); + gnet_property->props97.ev_changed = event_new("bw_allow_stealing_changed"); gnet_property->props97.save = TRUE; + gnet_property->props97.internal = FALSE; gnet_property->props97.vector_size = 1; + mutex_init(&gnet_property->props97.lock); /* Type specific data: */ gnet_property->props97.type = PROP_TYPE_BOOLEAN; - gnet_property->props97.data.boolean.def = (void *) &gnet_property_variable_bw_ul_usage_enabled_default; - gnet_property->props97.data.boolean.value = (void *) &gnet_property_variable_bw_ul_usage_enabled; + gnet_property->props97.data.boolean.def = (void *) &gnet_property_variable_bw_allow_stealing_default; + gnet_property->props97.data.boolean.value = (void *) &gnet_property_variable_bw_allow_stealing; /* - * PROP_BW_ALLOW_STEALING: + * PROP_AUTOCLEAR_COMPLETED_DOWNLOADS: * * General data: */ - gnet_property->props98.name = "bw_allow_stealing"; - gnet_property->props98.desc = _("Allow HTTP and Gnutella to grab whatever bandwidth the other is not using. If FALSE, unused bandwidth is lost."); - gnet_property->props98.ev_changed = event_new("bw_allow_stealing_changed"); + gnet_property->props98.name = "auto_clear_completed_downloads"; + gnet_property->props98.desc = _("Auto clear completed downloads."); + gnet_property->props98.ev_changed = event_new("autoclear_completed_downloads_changed"); gnet_property->props98.save = TRUE; + gnet_property->props98.internal = FALSE; gnet_property->props98.vector_size = 1; + mutex_init(&gnet_property->props98.lock); /* Type specific data: */ gnet_property->props98.type = PROP_TYPE_BOOLEAN; - gnet_property->props98.data.boolean.def = (void *) &gnet_property_variable_bw_allow_stealing_default; - gnet_property->props98.data.boolean.value = (void *) &gnet_property_variable_bw_allow_stealing; + gnet_property->props98.data.boolean.def = (void *) &gnet_property_variable_clear_complete_downloads_default; + gnet_property->props98.data.boolean.value = (void *) &gnet_property_variable_clear_complete_downloads; /* - * PROP_AUTOCLEAR_COMPLETED_DOWNLOADS: + * PROP_AUTOCLEAR_FAILED_DOWNLOADS: * * General data: */ - gnet_property->props99.name = "auto_clear_completed_downloads"; - gnet_property->props99.desc = _("Auto clear completed downloads."); - gnet_property->props99.ev_changed = event_new("autoclear_completed_downloads_changed"); + gnet_property->props99.name = "auto_clear_failed_downloads"; + gnet_property->props99.desc = _("Auto clear failed downloads (HTTP error, failure to resume, write error, etc...)."); + gnet_property->props99.ev_changed = event_new("autoclear_failed_downloads_changed"); gnet_property->props99.save = TRUE; + gnet_property->props99.internal = FALSE; gnet_property->props99.vector_size = 1; + mutex_init(&gnet_property->props99.lock); /* Type specific data: */ gnet_property->props99.type = PROP_TYPE_BOOLEAN; - gnet_property->props99.data.boolean.def = (void *) &gnet_property_variable_clear_complete_downloads_default; - gnet_property->props99.data.boolean.value = (void *) &gnet_property_variable_clear_complete_downloads; + gnet_property->props99.data.boolean.def = (void *) &gnet_property_variable_clear_failed_downloads_default; + gnet_property->props99.data.boolean.value = (void *) &gnet_property_variable_clear_failed_downloads; /* - * PROP_AUTOCLEAR_FAILED_DOWNLOADS: + * PROP_AUTOCLEAR_UNAVAILABLE_DOWNLOADS: * * General data: */ - gnet_property->props100.name = "auto_clear_failed_downloads"; - gnet_property->props100.desc = _("Auto clear failed downloads (HTTP error, failure to resume, write error, etc...)."); - gnet_property->props100.ev_changed = event_new("autoclear_failed_downloads_changed"); + gnet_property->props100.name = "auto_clear_unavailable_downloads"; + gnet_property->props100.desc = _("Auto clear unavailable downloads (connection timeout, push route lost, etc...)."); + gnet_property->props100.ev_changed = event_new("autoclear_unavailable_downloads_changed"); gnet_property->props100.save = TRUE; + gnet_property->props100.internal = FALSE; gnet_property->props100.vector_size = 1; + mutex_init(&gnet_property->props100.lock); /* Type specific data: */ gnet_property->props100.type = PROP_TYPE_BOOLEAN; - gnet_property->props100.data.boolean.def = (void *) &gnet_property_variable_clear_failed_downloads_default; - gnet_property->props100.data.boolean.value = (void *) &gnet_property_variable_clear_failed_downloads; + gnet_property->props100.data.boolean.def = (void *) &gnet_property_variable_clear_unavailable_downloads_default; + gnet_property->props100.data.boolean.value = (void *) &gnet_property_variable_clear_unavailable_downloads; /* - * PROP_AUTOCLEAR_UNAVAILABLE_DOWNLOADS: + * PROP_AUTOCLEAR_FINISHED_DOWNLOADS: * * General data: */ - gnet_property->props101.name = "auto_clear_unavailable_downloads"; - gnet_property->props101.desc = _("Auto clear unavailable downloads (connection timeout, push route lost, etc...)."); - gnet_property->props101.ev_changed = event_new("autoclear_unavailable_downloads_changed"); + gnet_property->props101.name = "auto_clear_finished_downloads"; + gnet_property->props101.desc = _("Auto clear finished downloads"); + gnet_property->props101.ev_changed = event_new("autoclear_finished_downloads_changed"); gnet_property->props101.save = TRUE; + gnet_property->props101.internal = FALSE; gnet_property->props101.vector_size = 1; + mutex_init(&gnet_property->props101.lock); /* Type specific data: */ gnet_property->props101.type = PROP_TYPE_BOOLEAN; - gnet_property->props101.data.boolean.def = (void *) &gnet_property_variable_clear_unavailable_downloads_default; - gnet_property->props101.data.boolean.value = (void *) &gnet_property_variable_clear_unavailable_downloads; + gnet_property->props101.data.boolean.def = (void *) &gnet_property_variable_clear_finished_downloads_default; + gnet_property->props101.data.boolean.value = (void *) &gnet_property_variable_clear_finished_downloads; /* - * PROP_AUTOCLEAR_FINISHED_DOWNLOADS: + * PROP_SEARCH_REMOVE_DOWNLOADED: * * General data: */ - gnet_property->props102.name = "auto_clear_finished_downloads"; - gnet_property->props102.desc = _("Auto clear finished downloads"); - gnet_property->props102.ev_changed = event_new("autoclear_finished_downloads_changed"); + gnet_property->props102.name = "search_remove_downloaded"; + gnet_property->props102.desc = _("Remove downloaded files from the search result."); + gnet_property->props102.ev_changed = event_new("search_remove_downloaded_changed"); gnet_property->props102.save = TRUE; + gnet_property->props102.internal = FALSE; gnet_property->props102.vector_size = 1; + mutex_init(&gnet_property->props102.lock); /* Type specific data: */ gnet_property->props102.type = PROP_TYPE_BOOLEAN; - gnet_property->props102.data.boolean.def = (void *) &gnet_property_variable_clear_finished_downloads_default; - gnet_property->props102.data.boolean.value = (void *) &gnet_property_variable_clear_finished_downloads; + gnet_property->props102.data.boolean.def = (void *) &gnet_property_variable_search_remove_downloaded_default; + gnet_property->props102.data.boolean.value = (void *) &gnet_property_variable_search_remove_downloaded; /* - * PROP_SEARCH_REMOVE_DOWNLOADED: + * PROP_FORCE_LOCAL_IP: * * General data: */ - gnet_property->props103.name = "search_remove_downloaded"; - gnet_property->props103.desc = _("Remove downloaded files from the search result."); - gnet_property->props103.ev_changed = event_new("search_remove_downloaded_changed"); + gnet_property->props103.name = "force_local_ip"; + gnet_property->props103.desc = _("Enable to use forced_local_ip as local ip."); + gnet_property->props103.ev_changed = event_new("force_local_ip_changed"); gnet_property->props103.save = TRUE; + gnet_property->props103.internal = FALSE; gnet_property->props103.vector_size = 1; + mutex_init(&gnet_property->props103.lock); /* Type specific data: */ gnet_property->props103.type = PROP_TYPE_BOOLEAN; - gnet_property->props103.data.boolean.def = (void *) &gnet_property_variable_search_remove_downloaded_default; - gnet_property->props103.data.boolean.value = (void *) &gnet_property_variable_search_remove_downloaded; + gnet_property->props103.data.boolean.def = (void *) &gnet_property_variable_force_local_ip_default; + gnet_property->props103.data.boolean.value = (void *) &gnet_property_variable_force_local_ip; /* - * PROP_FORCE_LOCAL_IP: + * PROP_FORCE_LOCAL_IP6: * * General data: */ - gnet_property->props104.name = "force_local_ip"; - gnet_property->props104.desc = _("Enable to use forced_local_ip as local ip."); - gnet_property->props104.ev_changed = event_new("force_local_ip_changed"); + gnet_property->props104.name = "force_local_ip6"; + gnet_property->props104.desc = _("Enable to use forced_local_ip6 as local ip."); + gnet_property->props104.ev_changed = event_new("force_local_ip6_changed"); gnet_property->props104.save = TRUE; + gnet_property->props104.internal = FALSE; gnet_property->props104.vector_size = 1; + mutex_init(&gnet_property->props104.lock); /* Type specific data: */ gnet_property->props104.type = PROP_TYPE_BOOLEAN; - gnet_property->props104.data.boolean.def = (void *) &gnet_property_variable_force_local_ip_default; - gnet_property->props104.data.boolean.value = (void *) &gnet_property_variable_force_local_ip; + gnet_property->props104.data.boolean.def = (void *) &gnet_property_variable_force_local_ip6_default; + gnet_property->props104.data.boolean.value = (void *) &gnet_property_variable_force_local_ip6; /* - * PROP_FORCE_LOCAL_IP6: + * PROP_BIND_TO_FORCED_LOCAL_IP: * * General data: */ - gnet_property->props105.name = "force_local_ip6"; - gnet_property->props105.desc = _("Enable to use forced_local_ip6 as local ip."); - gnet_property->props105.ev_changed = event_new("force_local_ip6_changed"); + gnet_property->props105.name = "bind_to_forced_local_ip"; + gnet_property->props105.desc = _("If 'forced_local_ip' is enabled, bind the socket to the forced IP address."); + gnet_property->props105.ev_changed = event_new("bind_to_forced_local_ip_changed"); gnet_property->props105.save = TRUE; + gnet_property->props105.internal = FALSE; gnet_property->props105.vector_size = 1; + mutex_init(&gnet_property->props105.lock); /* Type specific data: */ gnet_property->props105.type = PROP_TYPE_BOOLEAN; - gnet_property->props105.data.boolean.def = (void *) &gnet_property_variable_force_local_ip6_default; - gnet_property->props105.data.boolean.value = (void *) &gnet_property_variable_force_local_ip6; + gnet_property->props105.data.boolean.def = (void *) &gnet_property_variable_bind_to_forced_local_ip_default; + gnet_property->props105.data.boolean.value = (void *) &gnet_property_variable_bind_to_forced_local_ip; /* - * PROP_BIND_TO_FORCED_LOCAL_IP: + * PROP_BIND_TO_FORCED_LOCAL_IP6: * * General data: */ - gnet_property->props106.name = "bind_to_forced_local_ip"; - gnet_property->props106.desc = _("If 'forced_local_ip' is enabled, bind the socket to the forced IP address."); - gnet_property->props106.ev_changed = event_new("bind_to_forced_local_ip_changed"); + gnet_property->props106.name = "bind_to_forced_local_ip6"; + gnet_property->props106.desc = _("If 'forced_local_ip6' is enabled, bind the socket to the forced IP address."); + gnet_property->props106.ev_changed = event_new("bind_to_forced_local_ip6_changed"); gnet_property->props106.save = TRUE; + gnet_property->props106.internal = FALSE; gnet_property->props106.vector_size = 1; + mutex_init(&gnet_property->props106.lock); /* Type specific data: */ gnet_property->props106.type = PROP_TYPE_BOOLEAN; - gnet_property->props106.data.boolean.def = (void *) &gnet_property_variable_bind_to_forced_local_ip_default; - gnet_property->props106.data.boolean.value = (void *) &gnet_property_variable_bind_to_forced_local_ip; + gnet_property->props106.data.boolean.def = (void *) &gnet_property_variable_bind_to_forced_local_ip6_default; + gnet_property->props106.data.boolean.value = (void *) &gnet_property_variable_bind_to_forced_local_ip6; /* - * PROP_BIND_TO_FORCED_LOCAL_IP6: + * PROP_USE_NETMASKS: * * General data: */ - gnet_property->props107.name = "bind_to_forced_local_ip6"; - gnet_property->props107.desc = _("If 'forced_local_ip6' is enabled, bind the socket to the forced IP address."); - gnet_property->props107.ev_changed = event_new("bind_to_forced_local_ip6_changed"); + gnet_property->props107.name = "use_netmasks"; + gnet_property->props107.desc = _("Try to connect to local networks first."); + gnet_property->props107.ev_changed = event_new("use_netmasks_changed"); gnet_property->props107.save = TRUE; + gnet_property->props107.internal = FALSE; gnet_property->props107.vector_size = 1; + mutex_init(&gnet_property->props107.lock); /* Type specific data: */ gnet_property->props107.type = PROP_TYPE_BOOLEAN; - gnet_property->props107.data.boolean.def = (void *) &gnet_property_variable_bind_to_forced_local_ip6_default; - gnet_property->props107.data.boolean.value = (void *) &gnet_property_variable_bind_to_forced_local_ip6; + gnet_property->props107.data.boolean.def = (void *) &gnet_property_variable_use_netmasks_default; + gnet_property->props107.data.boolean.value = (void *) &gnet_property_variable_use_netmasks; /* - * PROP_USE_NETMASKS: + * PROP_ALLOW_PRIVATE_NETWORK_CONNECTION: * * General data: */ - gnet_property->props108.name = "use_netmasks"; - gnet_property->props108.desc = _("Try to connect to local networks first."); - gnet_property->props108.ev_changed = event_new("use_netmasks_changed"); + gnet_property->props108.name = "allow_private_network_connection"; + gnet_property->props108.desc = _("Check this button if you want to use gtk-gnutella on your Local Area Network. RFC1918 will be ignored."); + gnet_property->props108.ev_changed = event_new("allow_private_network_connection_changed"); gnet_property->props108.save = TRUE; + gnet_property->props108.internal = FALSE; gnet_property->props108.vector_size = 1; + mutex_init(&gnet_property->props108.lock); /* Type specific data: */ gnet_property->props108.type = PROP_TYPE_BOOLEAN; - gnet_property->props108.data.boolean.def = (void *) &gnet_property_variable_use_netmasks_default; - gnet_property->props108.data.boolean.value = (void *) &gnet_property_variable_use_netmasks; + gnet_property->props108.data.boolean.def = (void *) &gnet_property_variable_allow_private_network_connection_default; + gnet_property->props108.data.boolean.value = (void *) &gnet_property_variable_allow_private_network_connection; /* - * PROP_ALLOW_PRIVATE_NETWORK_CONNECTION: + * PROP_USE_IP_TOS: * * General data: */ - gnet_property->props109.name = "allow_private_network_connection"; - gnet_property->props109.desc = _("Check this button if you want to use gtk-gnutella on your Local Area Network. RFC1918 will be ignored."); - gnet_property->props109.ev_changed = event_new("allow_private_network_connection_changed"); + gnet_property->props109.name = "use_ip_tos"; + gnet_property->props109.desc = _("Check this button if you want gtk-gnutella to use IP TOS to differentiate interactive, normal and bulk data. This is probably a good idea in most cases, and can particularly help with badly misconfigured hosts, LANs, and ISPs."); + gnet_property->props109.ev_changed = event_new("use_ip_tos_changed"); gnet_property->props109.save = TRUE; + gnet_property->props109.internal = FALSE; gnet_property->props109.vector_size = 1; + mutex_init(&gnet_property->props109.lock); /* Type specific data: */ gnet_property->props109.type = PROP_TYPE_BOOLEAN; - gnet_property->props109.data.boolean.def = (void *) &gnet_property_variable_allow_private_network_connection_default; - gnet_property->props109.data.boolean.value = (void *) &gnet_property_variable_allow_private_network_connection; + gnet_property->props109.data.boolean.def = (void *) &gnet_property_variable_use_ip_tos_default; + gnet_property->props109.data.boolean.value = (void *) &gnet_property_variable_use_ip_tos; /* - * PROP_USE_IP_TOS: + * PROP_DOWNLOAD_DELETE_ABORTED: * * General data: */ - gnet_property->props110.name = "use_ip_tos"; - gnet_property->props110.desc = _("Check this button if you want gtk-gnutella to use IP TOS to differentiate interactive, normal and bulk data. This is probably a good idea in most cases, and can particularly help with badly misconfigured hosts, LANs, and ISPs."); - gnet_property->props110.ev_changed = event_new("use_ip_tos_changed"); + gnet_property->props110.name = "download_delete_aborted"; + gnet_property->props110.desc = _("Remove files of aborted downloads from disk."); + gnet_property->props110.ev_changed = event_new("download_delete_aborted_changed"); gnet_property->props110.save = TRUE; + gnet_property->props110.internal = FALSE; gnet_property->props110.vector_size = 1; + mutex_init(&gnet_property->props110.lock); /* Type specific data: */ gnet_property->props110.type = PROP_TYPE_BOOLEAN; - gnet_property->props110.data.boolean.def = (void *) &gnet_property_variable_use_ip_tos_default; - gnet_property->props110.data.boolean.value = (void *) &gnet_property_variable_use_ip_tos; + gnet_property->props110.data.boolean.def = (void *) &gnet_property_variable_download_delete_aborted_default; + gnet_property->props110.data.boolean.value = (void *) &gnet_property_variable_download_delete_aborted; /* - * PROP_DOWNLOAD_DELETE_ABORTED: + * PROP_PROXY_AUTH: * * General data: */ - gnet_property->props111.name = "download_delete_aborted"; - gnet_property->props111.desc = _("Remove files of aborted downloads from disk."); - gnet_property->props111.ev_changed = event_new("download_delete_aborted_changed"); + gnet_property->props111.name = "proxy_auth"; + gnet_property->props111.desc = _("Use username and password to authenticate to proxy."); + gnet_property->props111.ev_changed = event_new("proxy_auth_changed"); gnet_property->props111.save = TRUE; + gnet_property->props111.internal = FALSE; gnet_property->props111.vector_size = 1; + mutex_init(&gnet_property->props111.lock); /* Type specific data: */ gnet_property->props111.type = PROP_TYPE_BOOLEAN; - gnet_property->props111.data.boolean.def = (void *) &gnet_property_variable_download_delete_aborted_default; - gnet_property->props111.data.boolean.value = (void *) &gnet_property_variable_download_delete_aborted; + gnet_property->props111.data.boolean.def = (void *) &gnet_property_variable_proxy_auth_default; + gnet_property->props111.data.boolean.value = (void *) &gnet_property_variable_proxy_auth; /* - * PROP_PROXY_AUTH: + * PROP_SOCKS_USER: * * General data: */ - gnet_property->props112.name = "proxy_auth"; - gnet_property->props112.desc = _("Use username and password to authenticate to proxy."); - gnet_property->props112.ev_changed = event_new("proxy_auth_changed"); + gnet_property->props112.name = "socks_user"; + gnet_property->props112.desc = _("Username for proxy."); + gnet_property->props112.ev_changed = event_new("socks_user_changed"); gnet_property->props112.save = TRUE; + gnet_property->props112.internal = FALSE; gnet_property->props112.vector_size = 1; + mutex_init(&gnet_property->props112.lock); /* Type specific data: */ - gnet_property->props112.type = PROP_TYPE_BOOLEAN; - gnet_property->props112.data.boolean.def = (void *) &gnet_property_variable_proxy_auth_default; - gnet_property->props112.data.boolean.value = (void *) &gnet_property_variable_proxy_auth; + gnet_property->props112.type = PROP_TYPE_STRING; + gnet_property->props112.data.string.def = (void *) &gnet_property_variable_socks_user_default; + gnet_property->props112.data.string.value = (void *) &gnet_property_variable_socks_user; + if (gnet_property->props112.data.string.def) { + *gnet_property->props112.data.string.value = + g_strdup(eval_subst(*gnet_property->props112.data.string.def)); + } /* - * PROP_SOCKS_USER: + * PROP_SOCKS_PASS: * * General data: */ - gnet_property->props113.name = "socks_user"; - gnet_property->props113.desc = _("Username for proxy."); - gnet_property->props113.ev_changed = event_new("socks_user_changed"); + gnet_property->props113.name = "socks_pass"; + gnet_property->props113.desc = _("Password for proxy."); + gnet_property->props113.ev_changed = event_new("socks_pass_changed"); gnet_property->props113.save = TRUE; + gnet_property->props113.internal = FALSE; gnet_property->props113.vector_size = 1; + mutex_init(&gnet_property->props113.lock); /* Type specific data: */ gnet_property->props113.type = PROP_TYPE_STRING; - gnet_property->props113.data.string.def = (void *) &gnet_property_variable_socks_user_default; - gnet_property->props113.data.string.value = (void *) &gnet_property_variable_socks_user; + gnet_property->props113.data.string.def = (void *) &gnet_property_variable_socks_pass_default; + gnet_property->props113.data.string.value = (void *) &gnet_property_variable_socks_pass; if (gnet_property->props113.data.string.def) { *gnet_property->props113.data.string.value = g_strdup(eval_subst(*gnet_property->props113.data.string.def)); @@ -3224,703 +3551,775 @@ /* - * PROP_SOCKS_PASS: + * PROP_PROXY_ADDR: * * General data: */ - gnet_property->props114.name = "socks_pass"; - gnet_property->props114.desc = _("Password for proxy."); - gnet_property->props114.ev_changed = event_new("socks_pass_changed"); - gnet_property->props114.save = TRUE; + gnet_property->props114.name = "proxy_addr"; + gnet_property->props114.desc = _("Address of the proxy."); + gnet_property->props114.ev_changed = event_new("proxy_addr_changed"); + gnet_property->props114.save = FALSE; + gnet_property->props114.internal = FALSE; gnet_property->props114.vector_size = 1; + mutex_init(&gnet_property->props114.lock); /* Type specific data: */ - gnet_property->props114.type = PROP_TYPE_STRING; - gnet_property->props114.data.string.def = (void *) &gnet_property_variable_socks_pass_default; - gnet_property->props114.data.string.value = (void *) &gnet_property_variable_socks_pass; - if (gnet_property->props114.data.string.def) { - *gnet_property->props114.data.string.value = - g_strdup(eval_subst(*gnet_property->props114.data.string.def)); - } + gnet_property->props114.type = PROP_TYPE_IP; + gnet_property->props114.data.ip.value = (void *) &gnet_property_variable_proxy_addr; /* - * PROP_PROXY_ADDR: + * PROP_PROXY_HOSTNAME: * * General data: */ - gnet_property->props115.name = "proxy_addr"; - gnet_property->props115.desc = _("Address of the proxy."); - gnet_property->props115.ev_changed = event_new("proxy_addr_changed"); - gnet_property->props115.save = FALSE; + gnet_property->props115.name = "proxy_hostname"; + gnet_property->props115.desc = _("Hostname of the proxy."); + gnet_property->props115.ev_changed = event_new("proxy_hostname_changed"); + gnet_property->props115.save = TRUE; + gnet_property->props115.internal = FALSE; gnet_property->props115.vector_size = 1; + mutex_init(&gnet_property->props115.lock); /* Type specific data: */ - gnet_property->props115.type = PROP_TYPE_IP; - gnet_property->props115.data.ip.value = (void *) &gnet_property_variable_proxy_addr; + gnet_property->props115.type = PROP_TYPE_STRING; + gnet_property->props115.data.string.def = (void *) &gnet_property_variable_proxy_hostname_default; + gnet_property->props115.data.string.value = (void *) &gnet_property_variable_proxy_hostname; + if (gnet_property->props115.data.string.def) { + *gnet_property->props115.data.string.value = + g_strdup(eval_subst(*gnet_property->props115.data.string.def)); + } /* - * PROP_PROXY_HOSTNAME: + * PROP_PROXY_PORT: * * General data: */ - gnet_property->props116.name = "proxy_hostname"; - gnet_property->props116.desc = _("Hostname of the proxy."); - gnet_property->props116.ev_changed = event_new("proxy_hostname_changed"); + gnet_property->props116.name = "proxy_port"; + gnet_property->props116.desc = _("TCP Port the proxy is listening on."); + gnet_property->props116.ev_changed = event_new("proxy_port_changed"); gnet_property->props116.save = TRUE; + gnet_property->props116.internal = FALSE; gnet_property->props116.vector_size = 1; + mutex_init(&gnet_property->props116.lock); /* Type specific data: */ - gnet_property->props116.type = PROP_TYPE_STRING; - gnet_property->props116.data.string.def = (void *) &gnet_property_variable_proxy_hostname_default; - gnet_property->props116.data.string.value = (void *) &gnet_property_variable_proxy_hostname; - if (gnet_property->props116.data.string.def) { - *gnet_property->props116.data.string.value = - g_strdup(eval_subst(*gnet_property->props116.data.string.def)); - } + gnet_property->props116.type = PROP_TYPE_GUINT32; + gnet_property->props116.data.guint32.def = (void *) &gnet_property_variable_proxy_port_default; + gnet_property->props116.data.guint32.value = (void *) &gnet_property_variable_proxy_port; + gnet_property->props116.data.guint32.choices = NULL; + gnet_property->props116.data.guint32.max = 0xFFFF; + gnet_property->props116.data.guint32.min = 0x0000; /* - * PROP_PROXY_PORT: + * PROP_PROXY_PROTOCOL: * * General data: */ - gnet_property->props117.name = "proxy_port"; - gnet_property->props117.desc = _("TCP Port the proxy is listening on."); - gnet_property->props117.ev_changed = event_new("proxy_port_changed"); + gnet_property->props117.name = "proxy_protocol"; + gnet_property->props117.desc = _("Protocol the proxy uses."); + gnet_property->props117.ev_changed = event_new("proxy_protocol_changed"); gnet_property->props117.save = TRUE; + gnet_property->props117.internal = FALSE; gnet_property->props117.vector_size = 1; + mutex_init(&gnet_property->props117.lock); /* Type specific data: */ - gnet_property->props117.type = PROP_TYPE_GUINT32; - gnet_property->props117.data.guint32.def = (void *) &gnet_property_variable_proxy_port_default; - gnet_property->props117.data.guint32.value = (void *) &gnet_property_variable_proxy_port; - gnet_property->props117.data.guint32.choices = NULL; - gnet_property->props117.data.guint32.max = 0xFFFF; - gnet_property->props117.data.guint32.min = 0x0000; + gnet_property->props117.type = PROP_TYPE_MULTICHOICE; + gnet_property->props117.data.guint32.def = (void *) &gnet_property_variable_proxy_protocol_default; + gnet_property->props117.data.guint32.value = (void *) &gnet_property_variable_proxy_protocol; + gnet_property->props117.data.guint32.max = 0xFFFFFFFF; + gnet_property->props117.data.guint32.min = 0x00000000; + gnet_property->props117.data.guint32.choices = (void *) &gnet_property_variable_proxy_protocol_choices; /* - * PROP_PROXY_PROTOCOL: + * PROP_NETWORK_PROTOCOL: * * General data: */ - gnet_property->props118.name = "proxy_protocol"; - gnet_property->props118.desc = _("Protocol the proxy uses."); - gnet_property->props118.ev_changed = event_new("proxy_protocol_changed"); + gnet_property->props118.name = "network_protocol"; + gnet_property->props118.desc = _("Network protocols to use."); + gnet_property->props118.ev_changed = event_new("network_protocol_changed"); gnet_property->props118.save = TRUE; + gnet_property->props118.internal = FALSE; gnet_property->props118.vector_size = 1; + mutex_init(&gnet_property->props118.lock); /* Type specific data: */ gnet_property->props118.type = PROP_TYPE_MULTICHOICE; - gnet_property->props118.data.guint32.def = (void *) &gnet_property_variable_proxy_protocol_default; - gnet_property->props118.data.guint32.value = (void *) &gnet_property_variable_proxy_protocol; + gnet_property->props118.data.guint32.def = (void *) &gnet_property_variable_network_protocol_default; + gnet_property->props118.data.guint32.value = (void *) &gnet_property_variable_network_protocol; gnet_property->props118.data.guint32.max = 0xFFFFFFFF; gnet_property->props118.data.guint32.min = 0x00000000; - gnet_property->props118.data.guint32.choices = (void *) &gnet_property_variable_proxy_protocol_choices; + gnet_property->props118.data.guint32.choices = (void *) &gnet_property_variable_network_protocol_choices; /* - * PROP_NETWORK_PROTOCOL: + * PROP_USE_IPV6_TRT: * * General data: */ - gnet_property->props119.name = "network_protocol"; - gnet_property->props119.desc = _("Network protocols to use."); - gnet_property->props119.ev_changed = event_new("network_protocol_changed"); + gnet_property->props119.name = "use_ipv6_trt"; + gnet_property->props119.desc = _("Use an IPv6-to-IPv4 Transport Relay Translator asspecified by RFC 3142."); + gnet_property->props119.ev_changed = event_new("use_ipv6_trt_changed"); gnet_property->props119.save = TRUE; + gnet_property->props119.internal = FALSE; gnet_property->props119.vector_size = 1; + mutex_init(&gnet_property->props119.lock); /* Type specific data: */ - gnet_property->props119.type = PROP_TYPE_MULTICHOICE; - gnet_property->props119.data.guint32.def = (void *) &gnet_property_variable_network_protocol_default; - gnet_property->props119.data.guint32.value = (void *) &gnet_property_variable_network_protocol; - gnet_property->props119.data.guint32.max = 0xFFFFFFFF; - gnet_property->props119.data.guint32.min = 0x00000000; - gnet_property->props119.data.guint32.choices = (void *) &gnet_property_variable_network_protocol_choices; + gnet_property->props119.type = PROP_TYPE_BOOLEAN; + gnet_property->props119.data.boolean.def = (void *) &gnet_property_variable_use_ipv6_trt_default; + gnet_property->props119.data.boolean.value = (void *) &gnet_property_variable_use_ipv6_trt; /* - * PROP_USE_IPV6_TRT: + * PROP_IPV6_TRT_PREFIX: * * General data: */ - gnet_property->props120.name = "use_ipv6_trt"; - gnet_property->props120.desc = _("Use an IPv6-to-IPv4 Transport Relay Translator asspecified by RFC 3142."); - gnet_property->props120.ev_changed = event_new("use_ipv6_trt_changed"); + gnet_property->props120.name = "ipv6_trt_prefix"; + gnet_property->props120.desc = _("The IPv6 address prefix used by the IPv6-to-IPv4 Transport Relay Translator."); + gnet_property->props120.ev_changed = event_new("ipv6_trt_prefix_changed"); gnet_property->props120.save = TRUE; + gnet_property->props120.internal = FALSE; gnet_property->props120.vector_size = 1; + mutex_init(&gnet_property->props120.lock); /* Type specific data: */ - gnet_property->props120.type = PROP_TYPE_BOOLEAN; - gnet_property->props120.data.boolean.def = (void *) &gnet_property_variable_use_ipv6_trt_default; - gnet_property->props120.data.boolean.value = (void *) &gnet_property_variable_use_ipv6_trt; + gnet_property->props120.type = PROP_TYPE_IP; + gnet_property->props120.data.ip.value = (void *) &gnet_property_variable_ipv6_trt_prefix; /* - * PROP_IPV6_TRT_PREFIX: + * PROP_HOSTS_IN_CATCHER: * * General data: */ - gnet_property->props121.name = "ipv6_trt_prefix"; - gnet_property->props121.desc = _("The IPv6 address prefix used by the IPv6-to-IPv4 Transport Relay Translator."); - gnet_property->props121.ev_changed = event_new("ipv6_trt_prefix_changed"); - gnet_property->props121.save = TRUE; + gnet_property->props121.name = "hosts_in_catcher"; + gnet_property->props121.desc = _("Current number of hosts in regular node caches."); + gnet_property->props121.ev_changed = event_new("hosts_in_catcher_changed"); + gnet_property->props121.save = FALSE; + gnet_property->props121.internal = TRUE; gnet_property->props121.vector_size = 1; + mutex_init(&gnet_property->props121.lock); /* Type specific data: */ - gnet_property->props121.type = PROP_TYPE_IP; - gnet_property->props121.data.ip.value = (void *) &gnet_property_variable_ipv6_trt_prefix; + gnet_property->props121.type = PROP_TYPE_GUINT32; + gnet_property->props121.data.guint32.def = (void *) &gnet_property_variable_hosts_in_catcher_default; + gnet_property->props121.data.guint32.value = (void *) &gnet_property_variable_hosts_in_catcher; + gnet_property->props121.data.guint32.choices = NULL; + gnet_property->props121.data.guint32.max = INT_MAX; + gnet_property->props121.data.guint32.min = 0; /* - * PROP_HOSTS_IN_CATCHER: + * PROP_HOSTS_IN_ULTRA_CATCHER: * * General data: */ - gnet_property->props122.name = "hosts_in_catcher"; - gnet_property->props122.desc = _("Current number of hosts in regular node caches."); - gnet_property->props122.ev_changed = event_new("hosts_in_catcher_changed"); + gnet_property->props122.name = "hosts_in_ultra_catcher"; + gnet_property->props122.desc = _("Current number of IPv4 hosts in ultra node caches."); + gnet_property->props122.ev_changed = event_new("hosts_in_ultra_catcher_changed"); gnet_property->props122.save = FALSE; + gnet_property->props122.internal = TRUE; gnet_property->props122.vector_size = 1; + mutex_init(&gnet_property->props122.lock); /* Type specific data: */ gnet_property->props122.type = PROP_TYPE_GUINT32; - gnet_property->props122.data.guint32.def = (void *) &gnet_property_variable_hosts_in_catcher_default; - gnet_property->props122.data.guint32.value = (void *) &gnet_property_variable_hosts_in_catcher; + gnet_property->props122.data.guint32.def = (void *) &gnet_property_variable_hosts_in_ultra_catcher_default; + gnet_property->props122.data.guint32.value = (void *) &gnet_property_variable_hosts_in_ultra_catcher; gnet_property->props122.data.guint32.choices = NULL; gnet_property->props122.data.guint32.max = INT_MAX; gnet_property->props122.data.guint32.min = 0; /* - * PROP_HOSTS_IN_ULTRA_CATCHER: + * PROP_HOSTS_IN_BAD_CATCHER: * * General data: */ - gnet_property->props123.name = "hosts_in_ultra_catcher"; - gnet_property->props123.desc = _("Current number of IPv4 hosts in ultra node caches."); - gnet_property->props123.ev_changed = event_new("hosts_in_ultra_catcher_changed"); + gnet_property->props123.name = "hosts_in_bad_catcher"; + gnet_property->props123.desc = _("Current number of hosts in bad node caches."); + gnet_property->props123.ev_changed = event_new("hosts_in_bad_catcher_changed"); gnet_property->props123.save = FALSE; + gnet_property->props123.internal = TRUE; gnet_property->props123.vector_size = 1; + mutex_init(&gnet_property->props123.lock); /* Type specific data: */ gnet_property->props123.type = PROP_TYPE_GUINT32; - gnet_property->props123.data.guint32.def = (void *) &gnet_property_variable_hosts_in_ultra_catcher_default; - gnet_property->props123.data.guint32.value = (void *) &gnet_property_variable_hosts_in_ultra_catcher; + gnet_property->props123.data.guint32.def = (void *) &gnet_property_variable_hosts_in_bad_catcher_default; + gnet_property->props123.data.guint32.value = (void *) &gnet_property_variable_hosts_in_bad_catcher; gnet_property->props123.data.guint32.choices = NULL; gnet_property->props123.data.guint32.max = INT_MAX; gnet_property->props123.data.guint32.min = 0; /* - * PROP_HOSTS_IN_BAD_CATCHER: + * PROP_MAX_HOSTS_CACHED: * * General data: */ - gnet_property->props124.name = "hosts_in_bad_catcher"; - gnet_property->props124.desc = _("Current number of hosts in bad node caches."); - gnet_property->props124.ev_changed = event_new("hosts_in_bad_catcher_changed"); - gnet_property->props124.save = FALSE; + gnet_property->props124.name = "max_hosts_cached"; + gnet_property->props124.desc = _("Maximum number of hosts in the regular node cache."); + gnet_property->props124.ev_changed = event_new("max_hosts_cached_changed"); + gnet_property->props124.save = TRUE; + gnet_property->props124.internal = FALSE; gnet_property->props124.vector_size = 1; + mutex_init(&gnet_property->props124.lock); /* Type specific data: */ gnet_property->props124.type = PROP_TYPE_GUINT32; - gnet_property->props124.data.guint32.def = (void *) &gnet_property_variable_hosts_in_bad_catcher_default; - gnet_property->props124.data.guint32.value = (void *) &gnet_property_variable_hosts_in_bad_catcher; + gnet_property->props124.data.guint32.def = (void *) &gnet_property_variable_max_hosts_cached_default; + gnet_property->props124.data.guint32.value = (void *) &gnet_property_variable_max_hosts_cached; gnet_property->props124.data.guint32.choices = NULL; - gnet_property->props124.data.guint32.max = INT_MAX; - gnet_property->props124.data.guint32.min = 0; + gnet_property->props124.data.guint32.max = 50000; + gnet_property->props124.data.guint32.min = 100; /* - * PROP_MAX_HOSTS_CACHED: + * PROP_MAX_ULTRA_HOSTS_CACHED: * * General data: */ - gnet_property->props125.name = "max_hosts_cached"; - gnet_property->props125.desc = _("Maximum number of hosts in the regular node cache."); - gnet_property->props125.ev_changed = event_new("max_hosts_cached_changed"); + gnet_property->props125.name = "max_ultra_hosts_cached"; + gnet_property->props125.desc = _("Maximum number of IPv4 hosts in the ultra node cache."); + gnet_property->props125.ev_changed = event_new("max_ultra_hosts_cached_changed"); gnet_property->props125.save = TRUE; + gnet_property->props125.internal = FALSE; gnet_property->props125.vector_size = 1; + mutex_init(&gnet_property->props125.lock); /* Type specific data: */ gnet_property->props125.type = PROP_TYPE_GUINT32; - gnet_property->props125.data.guint32.def = (void *) &gnet_property_variable_max_hosts_cached_default; - gnet_property->props125.data.guint32.value = (void *) &gnet_property_variable_max_hosts_cached; + gnet_property->props125.data.guint32.def = (void *) &gnet_property_variable_max_ultra_hosts_cached_default; + gnet_property->props125.data.guint32.value = (void *) &gnet_property_variable_max_ultra_hosts_cached; gnet_property->props125.data.guint32.choices = NULL; gnet_property->props125.data.guint32.max = 50000; gnet_property->props125.data.guint32.min = 100; /* - * PROP_MAX_ULTRA_HOSTS_CACHED: + * PROP_MAX_BAD_HOSTS_CACHED: * * General data: */ - gnet_property->props126.name = "max_ultra_hosts_cached"; - gnet_property->props126.desc = _("Maximum number of IPv4 hosts in the ultra node cache."); - gnet_property->props126.ev_changed = event_new("max_ultra_hosts_cached_changed"); + gnet_property->props126.name = "max_bad_hosts_cached"; + gnet_property->props126.desc = _("Maximum number of hosts in the BUSY, UNSTABLE and TIMEOUT lists."); + gnet_property->props126.ev_changed = event_new("max_bad_hosts_cached_changed"); gnet_property->props126.save = TRUE; + gnet_property->props126.internal = FALSE; gnet_property->props126.vector_size = 1; + mutex_init(&gnet_property->props126.lock); /* Type specific data: */ gnet_property->props126.type = PROP_TYPE_GUINT32; - gnet_property->props126.data.guint32.def = (void *) &gnet_property_variable_max_ultra_hosts_cached_default; - gnet_property->props126.data.guint32.value = (void *) &gnet_property_variable_max_ultra_hosts_cached; + gnet_property->props126.data.guint32.def = (void *) &gnet_property_variable_max_bad_hosts_cached_default; + gnet_property->props126.data.guint32.value = (void *) &gnet_property_variable_max_bad_hosts_cached; gnet_property->props126.data.guint32.choices = NULL; gnet_property->props126.data.guint32.max = 50000; gnet_property->props126.data.guint32.min = 100; /* - * PROP_MAX_BAD_HOSTS_CACHED: + * PROP_MAX_HIGH_TTL_MSG: * * General data: */ - gnet_property->props127.name = "max_bad_hosts_cached"; - gnet_property->props127.desc = _("Maximum number of hosts in the BUSY, UNSTABLE and TIMEOUT lists."); - gnet_property->props127.ev_changed = event_new("max_bad_hosts_cached_changed"); + gnet_property->props127.name = "max_high_ttl_msg"; + gnet_property->props127.desc = _("Amount of tolerable messages above hard TTL limit per node. See also MAX_HIGH_TTL_RADIUS"); + gnet_property->props127.ev_changed = event_new("max_high_ttl_msg_changed"); gnet_property->props127.save = TRUE; + gnet_property->props127.internal = FALSE; gnet_property->props127.vector_size = 1; + mutex_init(&gnet_property->props127.lock); /* Type specific data: */ gnet_property->props127.type = PROP_TYPE_GUINT32; - gnet_property->props127.data.guint32.def = (void *) &gnet_property_variable_max_bad_hosts_cached_default; - gnet_property->props127.data.guint32.value = (void *) &gnet_property_variable_max_bad_hosts_cached; + gnet_property->props127.data.guint32.def = (void *) &gnet_property_variable_max_high_ttl_msg_default; + gnet_property->props127.data.guint32.value = (void *) &gnet_property_variable_max_high_ttl_msg; gnet_property->props127.data.guint32.choices = NULL; - gnet_property->props127.data.guint32.max = 50000; - gnet_property->props127.data.guint32.min = 100; + gnet_property->props127.data.guint32.max = 10000; + gnet_property->props127.data.guint32.min = 0; /* - * PROP_MAX_HIGH_TTL_MSG: + * PROP_MAX_HIGH_TTL_RADIUS: * * General data: */ - gnet_property->props128.name = "max_high_ttl_msg"; - gnet_property->props128.desc = _("Amount of tolerable messages above hard TTL limit per node. See also MAX_HIGH_TTL_RADIUS"); - gnet_property->props128.ev_changed = event_new("max_high_ttl_msg_changed"); + gnet_property->props128.name = "max_high_ttl_radius"; + gnet_property->props128.desc = _("Hop radius for counting high TTL limit messages (# hops lower than...). See also MAX_HIGH_TTL_MSG"); + gnet_property->props128.ev_changed = event_new("max_high_ttl_radius_changed"); gnet_property->props128.save = TRUE; + gnet_property->props128.internal = FALSE; gnet_property->props128.vector_size = 1; + mutex_init(&gnet_property->props128.lock); /* Type specific data: */ gnet_property->props128.type = PROP_TYPE_GUINT32; - gnet_property->props128.data.guint32.def = (void *) &gnet_property_variable_max_high_ttl_msg_default; - gnet_property->props128.data.guint32.value = (void *) &gnet_property_variable_max_high_ttl_msg; + gnet_property->props128.data.guint32.def = (void *) &gnet_property_variable_max_high_ttl_radius_default; + gnet_property->props128.data.guint32.value = (void *) &gnet_property_variable_max_high_ttl_radius; gnet_property->props128.data.guint32.choices = NULL; - gnet_property->props128.data.guint32.max = 10000; + gnet_property->props128.data.guint32.max = 10; gnet_property->props128.data.guint32.min = 0; /* - * PROP_MAX_HIGH_TTL_RADIUS: + * PROP_BW_HTTP_IN: * * General data: */ - gnet_property->props129.name = "max_high_ttl_radius"; - gnet_property->props129.desc = _("Hop radius for counting high TTL limit messages (# hops lower than...). See also MAX_HIGH_TTL_MSG"); - gnet_property->props129.ev_changed = event_new("max_high_ttl_radius_changed"); + gnet_property->props129.name = "input_bandwidth"; + gnet_property->props129.desc = _("Bandwidth limit for incoming HTTP traffic in bytes/sec."); + gnet_property->props129.ev_changed = event_new("bw_http_in_changed"); gnet_property->props129.save = TRUE; + gnet_property->props129.internal = FALSE; gnet_property->props129.vector_size = 1; + mutex_init(&gnet_property->props129.lock); /* Type specific data: */ gnet_property->props129.type = PROP_TYPE_GUINT32; - gnet_property->props129.data.guint32.def = (void *) &gnet_property_variable_max_high_ttl_radius_default; - gnet_property->props129.data.guint32.value = (void *) &gnet_property_variable_max_high_ttl_radius; + gnet_property->props129.data.guint32.def = (void *) &gnet_property_variable_bw_http_in_default; + gnet_property->props129.data.guint32.value = (void *) &gnet_property_variable_bw_http_in; gnet_property->props129.data.guint32.choices = NULL; - gnet_property->props129.data.guint32.max = 10; - gnet_property->props129.data.guint32.min = 0; + gnet_property->props129.data.guint32.max = BS_BW_MAX; + gnet_property->props129.data.guint32.min = 1024; /* - * PROP_BW_HTTP_IN: + * PROP_BW_HTTP_OUT: * * General data: */ - gnet_property->props130.name = "input_bandwidth"; - gnet_property->props130.desc = _("Bandwidth limit for incoming HTTP traffic in bytes/sec."); - gnet_property->props130.ev_changed = event_new("bw_http_in_changed"); + gnet_property->props130.name = "output_bandwidth"; + gnet_property->props130.desc = _("Bandwidth limit for outgoing HTTP traffic in bytes/sec."); + gnet_property->props130.ev_changed = event_new("bw_http_out_changed"); gnet_property->props130.save = TRUE; + gnet_property->props130.internal = FALSE; gnet_property->props130.vector_size = 1; + mutex_init(&gnet_property->props130.lock); /* Type specific data: */ gnet_property->props130.type = PROP_TYPE_GUINT32; - gnet_property->props130.data.guint32.def = (void *) &gnet_property_variable_bw_http_in_default; - gnet_property->props130.data.guint32.value = (void *) &gnet_property_variable_bw_http_in; + gnet_property->props130.data.guint32.def = (void *) &gnet_property_variable_bw_http_out_default; + gnet_property->props130.data.guint32.value = (void *) &gnet_property_variable_bw_http_out; gnet_property->props130.data.guint32.choices = NULL; gnet_property->props130.data.guint32.max = BS_BW_MAX; gnet_property->props130.data.guint32.min = 1024; /* - * PROP_BW_HTTP_OUT: + * PROP_BW_GNET_IN: * * General data: */ - gnet_property->props131.name = "output_bandwidth"; - gnet_property->props131.desc = _("Bandwidth limit for outgoing HTTP traffic in bytes/sec."); - gnet_property->props131.ev_changed = event_new("bw_http_out_changed"); + gnet_property->props131.name = "input_gnet_bandwidth"; + gnet_property->props131.desc = _("Bandwidth limit for incoming Gnet traffic in bytes/sec."); + gnet_property->props131.ev_changed = event_new("bw_gnet_in_changed"); gnet_property->props131.save = TRUE; + gnet_property->props131.internal = FALSE; gnet_property->props131.vector_size = 1; + mutex_init(&gnet_property->props131.lock); /* Type specific data: */ gnet_property->props131.type = PROP_TYPE_GUINT32; - gnet_property->props131.data.guint32.def = (void *) &gnet_property_variable_bw_http_out_default; - gnet_property->props131.data.guint32.value = (void *) &gnet_property_variable_bw_http_out; + gnet_property->props131.data.guint32.def = (void *) &gnet_property_variable_bw_gnet_in_default; + gnet_property->props131.data.guint32.value = (void *) &gnet_property_variable_bw_gnet_in; gnet_property->props131.data.guint32.choices = NULL; gnet_property->props131.data.guint32.max = BS_BW_MAX; gnet_property->props131.data.guint32.min = 1024; /* - * PROP_BW_GNET_IN: + * PROP_BW_GNET_OUT: * * General data: */ - gnet_property->props132.name = "input_gnet_bandwidth"; - gnet_property->props132.desc = _("Bandwidth limit for incoming Gnet traffic in bytes/sec."); - gnet_property->props132.ev_changed = event_new("bw_gnet_in_changed"); + gnet_property->props132.name = "output_gnet_bandwidth"; + gnet_property->props132.desc = _("Bandwidth limit for outgoing Gnet traffic in bytes/sec."); + gnet_property->props132.ev_changed = event_new("bw_gnet_out_changed"); gnet_property->props132.save = TRUE; + gnet_property->props132.internal = FALSE; gnet_property->props132.vector_size = 1; + mutex_init(&gnet_property->props132.lock); /* Type specific data: */ gnet_property->props132.type = PROP_TYPE_GUINT32; - gnet_property->props132.data.guint32.def = (void *) &gnet_property_variable_bw_gnet_in_default; - gnet_property->props132.data.guint32.value = (void *) &gnet_property_variable_bw_gnet_in; + gnet_property->props132.data.guint32.def = (void *) &gnet_property_variable_bw_gnet_out_default; + gnet_property->props132.data.guint32.value = (void *) &gnet_property_variable_bw_gnet_out; gnet_property->props132.data.guint32.choices = NULL; gnet_property->props132.data.guint32.max = BS_BW_MAX; gnet_property->props132.data.guint32.min = 1024; /* - * PROP_BW_GNET_OUT: + * PROP_BW_GNET_LIN: * * General data: */ - gnet_property->props133.name = "output_gnet_bandwidth"; - gnet_property->props133.desc = _("Bandwidth limit for outgoing Gnet traffic in bytes/sec."); - gnet_property->props133.ev_changed = event_new("bw_gnet_out_changed"); + gnet_property->props133.name = "input_gnet_leaf_bandwidth"; + gnet_property->props133.desc = _("Bandwidth limit for incoming Gnet leaf traffic in bytes/sec. When running as an ultra node, this bandwidth is stolen from the regular HTTP traffic if the shaper for leaves is enabled."); + gnet_property->props133.ev_changed = event_new("bw_gnet_lin_changed"); gnet_property->props133.save = TRUE; + gnet_property->props133.internal = FALSE; gnet_property->props133.vector_size = 1; + mutex_init(&gnet_property->props133.lock); /* Type specific data: */ gnet_property->props133.type = PROP_TYPE_GUINT32; - gnet_property->props133.data.guint32.def = (void *) &gnet_property_variable_bw_gnet_out_default; - gnet_property->props133.data.guint32.value = (void *) &gnet_property_variable_bw_gnet_out; + gnet_property->props133.data.guint32.def = (void *) &gnet_property_variable_bw_gnet_lin_default; + gnet_property->props133.data.guint32.value = (void *) &gnet_property_variable_bw_gnet_lin; gnet_property->props133.data.guint32.choices = NULL; gnet_property->props133.data.guint32.max = BS_BW_MAX; gnet_property->props133.data.guint32.min = 1024; /* - * PROP_BW_GNET_LIN: + * PROP_BW_GNET_LOUT: * * General data: */ - gnet_property->props134.name = "input_gnet_leaf_bandwidth"; - gnet_property->props134.desc = _("Bandwidth limit for incoming Gnet leaf traffic in bytes/sec. When running as an ultra node, this bandwidth is stolen from the regular HTTP traffic if the shaper for leaves is enabled."); - gnet_property->props134.ev_changed = event_new("bw_gnet_lin_changed"); + gnet_property->props134.name = "output_gnet_leaf_bandwidth"; + gnet_property->props134.desc = _("Bandwidth limit for outgoing Gnet leaf traffic in bytes/sec. When running as an ultra node, this bandwidth is stolen from the regular HTTP traffic, if the shaper for leaves is enabled."); + gnet_property->props134.ev_changed = event_new("bw_gnet_lout_changed"); gnet_property->props134.save = TRUE; + gnet_property->props134.internal = FALSE; gnet_property->props134.vector_size = 1; + mutex_init(&gnet_property->props134.lock); /* Type specific data: */ gnet_property->props134.type = PROP_TYPE_GUINT32; - gnet_property->props134.data.guint32.def = (void *) &gnet_property_variable_bw_gnet_lin_default; - gnet_property->props134.data.guint32.value = (void *) &gnet_property_variable_bw_gnet_lin; + gnet_property->props134.data.guint32.def = (void *) &gnet_property_variable_bw_gnet_lout_default; + gnet_property->props134.data.guint32.value = (void *) &gnet_property_variable_bw_gnet_lout; gnet_property->props134.data.guint32.choices = NULL; gnet_property->props134.data.guint32.max = BS_BW_MAX; gnet_property->props134.data.guint32.min = 1024; /* - * PROP_BW_GNET_LOUT: + * PROP_SEARCH_QUERIES_FORWARD_SIZE: * * General data: */ - gnet_property->props135.name = "output_gnet_leaf_bandwidth"; - gnet_property->props135.desc = _("Bandwidth limit for outgoing Gnet leaf traffic in bytes/sec. When running as an ultra node, this bandwidth is stolen from the regular HTTP traffic, if the shaper for leaves is enabled."); - gnet_property->props135.ev_changed = event_new("bw_gnet_lout_changed"); + gnet_property->props135.name = "search_queries_forward_size"; + gnet_property->props135.desc = _("Maximum size of search queries messages we forward to others (in bytes)."); + gnet_property->props135.ev_changed = event_new("search_queries_forward_size_changed"); gnet_property->props135.save = TRUE; + gnet_property->props135.internal = FALSE; gnet_property->props135.vector_size = 1; + mutex_init(&gnet_property->props135.lock); /* Type specific data: */ gnet_property->props135.type = PROP_TYPE_GUINT32; - gnet_property->props135.data.guint32.def = (void *) &gnet_property_variable_bw_gnet_lout_default; - gnet_property->props135.data.guint32.value = (void *) &gnet_property_variable_bw_gnet_lout; + gnet_property->props135.data.guint32.def = (void *) &gnet_property_variable_search_queries_forward_size_default; + gnet_property->props135.data.guint32.value = (void *) &gnet_property_variable_search_queries_forward_size; gnet_property->props135.data.guint32.choices = NULL; - gnet_property->props135.data.guint32.max = BS_BW_MAX; - gnet_property->props135.data.guint32.min = 1024; + gnet_property->props135.data.guint32.max = 256; + gnet_property->props135.data.guint32.min = 128; /* - * PROP_SEARCH_QUERIES_FORWARD_SIZE: + * PROP_SEARCH_QUERIES_KICK_SIZE: * * General data: */ - gnet_property->props136.name = "search_queries_forward_size"; - gnet_property->props136.desc = _("Maximum size of search queries messages we forward to others (in bytes)."); - gnet_property->props136.ev_changed = event_new("search_queries_forward_size_changed"); + gnet_property->props136.name = "search_queries_kick_size"; + gnet_property->props136.desc = _("Maximum size of search queries messages we allow, otherwise close the connection (in bytes)."); + gnet_property->props136.ev_changed = event_new("search_queries_kick_size_changed"); gnet_property->props136.save = TRUE; + gnet_property->props136.internal = FALSE; gnet_property->props136.vector_size = 1; + mutex_init(&gnet_property->props136.lock); /* Type specific data: */ gnet_property->props136.type = PROP_TYPE_GUINT32; - gnet_property->props136.data.guint32.def = (void *) &gnet_property_variable_search_queries_forward_size_default; - gnet_property->props136.data.guint32.value = (void *) &gnet_property_variable_search_queries_forward_size; + gnet_property->props136.data.guint32.def = (void *) &gnet_property_variable_search_queries_kick_size_default; + gnet_property->props136.data.guint32.value = (void *) &gnet_property_variable_search_queries_kick_size; gnet_property->props136.data.guint32.choices = NULL; - gnet_property->props136.data.guint32.max = 256; - gnet_property->props136.data.guint32.min = 128; + gnet_property->props136.data.guint32.max = 1024; + gnet_property->props136.data.guint32.min = 256; /* - * PROP_SEARCH_QUERIES_KICK_SIZE: + * PROP_SEARCH_ANSWERS_FORWARD_SIZE: * * General data: */ - gnet_property->props137.name = "search_queries_kick_size"; - gnet_property->props137.desc = _("Maximum size of search queries messages we allow, otherwise close the connection (in bytes)."); - gnet_property->props137.ev_changed = event_new("search_queries_kick_size_changed"); + gnet_property->props137.name = "search_answers_forward_size"; + gnet_property->props137.desc = _("Maximum size of search answers messages we forward to others (in bytes)."); + gnet_property->props137.ev_changed = event_new("search_answers_forward_size_changed"); gnet_property->props137.save = TRUE; + gnet_property->props137.internal = FALSE; gnet_property->props137.vector_size = 1; + mutex_init(&gnet_property->props137.lock); /* Type specific data: */ gnet_property->props137.type = PROP_TYPE_GUINT32; - gnet_property->props137.data.guint32.def = (void *) &gnet_property_variable_search_queries_kick_size_default; - gnet_property->props137.data.guint32.value = (void *) &gnet_property_variable_search_queries_kick_size; + gnet_property->props137.data.guint32.def = (void *) &gnet_property_variable_search_answers_forward_size_default; + gnet_property->props137.data.guint32.value = (void *) &gnet_property_variable_search_answers_forward_size; gnet_property->props137.data.guint32.choices = NULL; - gnet_property->props137.data.guint32.max = 1024; - gnet_property->props137.data.guint32.min = 256; + gnet_property->props137.data.guint32.max = 65536; + gnet_property->props137.data.guint32.min = 4096; /* - * PROP_SEARCH_ANSWERS_FORWARD_SIZE: + * PROP_SEARCH_ANSWERS_KICK_SIZE: * * General data: */ - gnet_property->props138.name = "search_answers_forward_size"; - gnet_property->props138.desc = _("Maximum size of search answers messages we forward to others (in bytes)."); - gnet_property->props138.ev_changed = event_new("search_answers_forward_size_changed"); + gnet_property->props138.name = "search_answers_kick_size"; + gnet_property->props138.desc = _("Maximum size of search answers messages we allow, otherwise close the connection (in bytes)."); + gnet_property->props138.ev_changed = event_new("search_answers_kick_size_changed"); gnet_property->props138.save = TRUE; + gnet_property->props138.internal = FALSE; gnet_property->props138.vector_size = 1; + mutex_init(&gnet_property->props138.lock); /* Type specific data: */ gnet_property->props138.type = PROP_TYPE_GUINT32; - gnet_property->props138.data.guint32.def = (void *) &gnet_property_variable_search_answers_forward_size_default; - gnet_property->props138.data.guint32.value = (void *) &gnet_property_variable_search_answers_forward_size; + gnet_property->props138.data.guint32.def = (void *) &gnet_property_variable_search_answers_kick_size_default; + gnet_property->props138.data.guint32.value = (void *) &gnet_property_variable_search_answers_kick_size; gnet_property->props138.data.guint32.choices = NULL; gnet_property->props138.data.guint32.max = 65536; - gnet_property->props138.data.guint32.min = 4096; + gnet_property->props138.data.guint32.min = 16384; /* - * PROP_SEARCH_ANSWERS_KICK_SIZE: + * PROP_SEARCH_MUID_TRACK_AMOUNT: * * General data: */ - gnet_property->props139.name = "search_answers_kick_size"; - gnet_property->props139.desc = _("Maximum size of search answers messages we allow, otherwise close the connection (in bytes)."); - gnet_property->props139.ev_changed = event_new("search_answers_kick_size_changed"); + gnet_property->props139.name = "search_muid_track_amount"; + gnet_property->props139.desc = _("Maximum number of relayed Query MUIDs to track. This allows mapping MUIDs of Query Hits to the original search term and media type filtering to be able to avoid relaying spam and non-matching results. In the worst case this causes about 300 bytes per Query of memory overhead, but will be much lower than that in practice (minimum size is about 40 bytes). This is only used when running as an Ultrapeer. When the value specified is greater than the amount of messages that the Gnutella routing table can track, gtk-gnutella will automatically cap the amount of tracked MUIDs to fit the queries it remembers for routing."); + gnet_property->props139.ev_changed = event_new("search_muid_track_amount_changed"); gnet_property->props139.save = TRUE; + gnet_property->props139.internal = FALSE; gnet_property->props139.vector_size = 1; + mutex_init(&gnet_property->props139.lock); /* Type specific data: */ gnet_property->props139.type = PROP_TYPE_GUINT32; - gnet_property->props139.data.guint32.def = (void *) &gnet_property_variable_search_answers_kick_size_default; - gnet_property->props139.data.guint32.value = (void *) &gnet_property_variable_search_answers_kick_size; + gnet_property->props139.data.guint32.def = (void *) &gnet_property_variable_search_muid_track_amount_default; + gnet_property->props139.data.guint32.value = (void *) &gnet_property_variable_search_muid_track_amount; gnet_property->props139.data.guint32.choices = NULL; - gnet_property->props139.data.guint32.max = 65536; - gnet_property->props139.data.guint32.min = 16384; + gnet_property->props139.data.guint32.max = 10000000; + gnet_property->props139.data.guint32.min = 0; /* - * PROP_SEARCH_MUID_TRACK_AMOUNT: + * PROP_OTHER_MESSAGES_KICK_SIZE: * * General data: */ - gnet_property->props140.name = "search_muid_track_amount"; - gnet_property->props140.desc = _("Maximum number of relayed Query MUIDs to track. This allows mapping MUIDs of Query Hits to the original search term and media type filtering to be able to avoid relaying spam and non-matching results. In the worst case this causes about 300 bytes per Query of memory overhead, but will be much lower than that in practice (minimum size is about 40 bytes). This is only used when running as an Ultrapeer. When the value specified is greater than the amount of messages that the Gnutella routing table can track, gtk-gnutella will automatically cap the amount of tracked MUIDs to fit the queries it remembers for routing."); - gnet_property->props140.ev_changed = event_new("search_muid_track_amount_changed"); + gnet_property->props140.name = "other_messages_kick_size"; + gnet_property->props140.desc = _("Maximum size of unknown messages we allow, otherwise close the connection (in bytes)."); + gnet_property->props140.ev_changed = event_new("other_messages_kick_size_changed"); gnet_property->props140.save = TRUE; + gnet_property->props140.internal = FALSE; gnet_property->props140.vector_size = 1; + mutex_init(&gnet_property->props140.lock); /* Type specific data: */ gnet_property->props140.type = PROP_TYPE_GUINT32; - gnet_property->props140.data.guint32.def = (void *) &gnet_property_variable_search_muid_track_amount_default; - gnet_property->props140.data.guint32.value = (void *) &gnet_property_variable_search_muid_track_amount; + gnet_property->props140.data.guint32.def = (void *) &gnet_property_variable_other_messages_kick_size_default; + gnet_property->props140.data.guint32.value = (void *) &gnet_property_variable_other_messages_kick_size; gnet_property->props140.data.guint32.choices = NULL; - gnet_property->props140.data.guint32.max = 10000000; - gnet_property->props140.data.guint32.min = 0; + gnet_property->props140.data.guint32.max = 65536; + gnet_property->props140.data.guint32.min = 1024; /* - * PROP_OTHER_MESSAGES_KICK_SIZE: + * PROP_HOPS_RANDOM_FACTOR: * * General data: */ - gnet_property->props141.name = "other_messages_kick_size"; - gnet_property->props141.desc = _("Maximum size of unknown messages we allow, otherwise close the connection (in bytes)."); - gnet_property->props141.ev_changed = event_new("other_messages_kick_size_changed"); + gnet_property->props141.name = "hops_random_factor"; + gnet_property->props141.desc = _("Random factor for the hops field in search packets we send (between 0 and 3 inclusive)."); + gnet_property->props141.ev_changed = event_new("hops_random_factor_changed"); gnet_property->props141.save = TRUE; + gnet_property->props141.internal = FALSE; gnet_property->props141.vector_size = 1; + mutex_init(&gnet_property->props141.lock); /* Type specific data: */ gnet_property->props141.type = PROP_TYPE_GUINT32; - gnet_property->props141.data.guint32.def = (void *) &gnet_property_variable_other_messages_kick_size_default; - gnet_property->props141.data.guint32.value = (void *) &gnet_property_variable_other_messages_kick_size; + gnet_property->props141.data.guint32.def = (void *) &gnet_property_variable_hops_random_factor_default; + gnet_property->props141.data.guint32.value = (void *) &gnet_property_variable_hops_random_factor; gnet_property->props141.data.guint32.choices = NULL; - gnet_property->props141.data.guint32.max = 65536; - gnet_property->props141.data.guint32.min = 1024; + gnet_property->props141.data.guint32.max = 3; + gnet_property->props141.data.guint32.min = 0; /* - * PROP_HOPS_RANDOM_FACTOR: + * PROP_SEND_PUSHES: * * General data: */ - gnet_property->props142.name = "hops_random_factor"; - gnet_property->props142.desc = _("Random factor for the hops field in search packets we send (between 0 and 3 inclusive)."); - gnet_property->props142.ev_changed = event_new("hops_random_factor_changed"); + gnet_property->props142.name = "send_pushes"; + gnet_property->props142.desc = _("Whether or not to send push requests. If you are firewalled, gtk-gnutella will never send push requests anyway. If you don't let gtk-gnutella send pushes, it will not show search results that would require a push."); + gnet_property->props142.ev_changed = event_new("send_pushes_changed"); gnet_property->props142.save = TRUE; + gnet_property->props142.internal = FALSE; gnet_property->props142.vector_size = 1; + mutex_init(&gnet_property->props142.lock); /* Type specific data: */ - gnet_property->props142.type = PROP_TYPE_GUINT32; - gnet_property->props142.data.guint32.def = (void *) &gnet_property_variable_hops_random_factor_default; - gnet_property->props142.data.guint32.value = (void *) &gnet_property_variable_hops_random_factor; - gnet_property->props142.data.guint32.choices = NULL; - gnet_property->props142.data.guint32.max = 3; - gnet_property->props142.data.guint32.min = 0; + gnet_property->props142.type = PROP_TYPE_BOOLEAN; + gnet_property->props142.data.boolean.def = (void *) &gnet_property_variable_send_pushes_default; + gnet_property->props142.data.boolean.value = (void *) &gnet_property_variable_send_pushes; /* - * PROP_SEND_PUSHES: + * PROP_MIN_DUP_MSG: * * General data: */ - gnet_property->props143.name = "send_pushes"; - gnet_property->props143.desc = _("Whether or not to send push requests. If you are firewalled, gtk-gnutella will never send push requests anyway. If you don't let gtk-gnutella send pushes, it will not show search results that would require a push."); - gnet_property->props143.ev_changed = event_new("send_pushes_changed"); + gnet_property->props143.name = "min_dup_msg"; + gnet_property->props143.desc = _("Minimum amount of dup messages to enable kicking, per node (also see min_dup_ratio)."); + gnet_property->props143.ev_changed = event_new("min_dup_msg_changed"); gnet_property->props143.save = TRUE; + gnet_property->props143.internal = FALSE; gnet_property->props143.vector_size = 1; + mutex_init(&gnet_property->props143.lock); /* Type specific data: */ - gnet_property->props143.type = PROP_TYPE_BOOLEAN; - gnet_property->props143.data.boolean.def = (void *) &gnet_property_variable_send_pushes_default; - gnet_property->props143.data.boolean.value = (void *) &gnet_property_variable_send_pushes; + gnet_property->props143.type = PROP_TYPE_GUINT32; + gnet_property->props143.data.guint32.def = (void *) &gnet_property_variable_min_dup_msg_default; + gnet_property->props143.data.guint32.value = (void *) &gnet_property_variable_min_dup_msg; + gnet_property->props143.data.guint32.choices = NULL; + gnet_property->props143.data.guint32.max = 99; + gnet_property->props143.data.guint32.min = 1; /* - * PROP_MIN_DUP_MSG: + * PROP_MIN_DUP_RATIO: * * General data: */ - gnet_property->props144.name = "min_dup_msg"; - gnet_property->props144.desc = _("Minimum amount of dup messages to enable kicking, per node (also see min_dup_ratio)."); - gnet_property->props144.ev_changed = event_new("min_dup_msg_changed"); + gnet_property->props144.name = "min_dup_ratio"; + gnet_property->props144.desc = _("Minimum ratio of dups on received messages, per node (between 0.00 and 100.00) (also see min_dup_msg) Note: the value is stored between 0 (0.0) and 10000 (100.0) in the config file."); + gnet_property->props144.ev_changed = event_new("min_dup_ratio_changed"); gnet_property->props144.save = TRUE; + gnet_property->props144.internal = FALSE; gnet_property->props144.vector_size = 1; + mutex_init(&gnet_property->props144.lock); /* Type specific data: */ gnet_property->props144.type = PROP_TYPE_GUINT32; - gnet_property->props144.data.guint32.def = (void *) &gnet_property_variable_min_dup_msg_default; - gnet_property->props144.data.guint32.value = (void *) &gnet_property_variable_min_dup_msg; + gnet_property->props144.data.guint32.def = (void *) &gnet_property_variable_min_dup_ratio_default; + gnet_property->props144.data.guint32.value = (void *) &gnet_property_variable_min_dup_ratio; gnet_property->props144.data.guint32.choices = NULL; - gnet_property->props144.data.guint32.max = 99; - gnet_property->props144.data.guint32.min = 1; + gnet_property->props144.data.guint32.max = 10000; + gnet_property->props144.data.guint32.min = 0; /* - * PROP_MIN_DUP_RATIO: + * PROP_SCAN_EXTENSIONS: * * General data: */ - gnet_property->props145.name = "min_dup_ratio"; - gnet_property->props145.desc = _("Minimum ratio of dups on received messages, per node (between 0.00 and 100.00) (also see min_dup_msg) Note: the value is stored between 0 (0.0) and 10000 (100.0) in the config file."); - gnet_property->props145.ev_changed = event_new("min_dup_ratio_changed"); + gnet_property->props145.name = "shared_files_extensions"; + gnet_property->props145.desc = _("Only files with the given extensions will be shared. The special --all-- extension matches all files, even if they don't have any extension. Use with care."); + gnet_property->props145.ev_changed = event_new("scan_extensions_changed"); gnet_property->props145.save = TRUE; + gnet_property->props145.internal = FALSE; gnet_property->props145.vector_size = 1; + mutex_init(&gnet_property->props145.lock); /* Type specific data: */ - gnet_property->props145.type = PROP_TYPE_GUINT32; - gnet_property->props145.data.guint32.def = (void *) &gnet_property_variable_min_dup_ratio_default; - gnet_property->props145.data.guint32.value = (void *) &gnet_property_variable_min_dup_ratio; - gnet_property->props145.data.guint32.choices = NULL; - gnet_property->props145.data.guint32.max = 10000; - gnet_property->props145.data.guint32.min = 0; + gnet_property->props145.type = PROP_TYPE_STRING; + gnet_property->props145.data.string.def = (void *) &gnet_property_variable_scan_extensions_default; + gnet_property->props145.data.string.value = (void *) &gnet_property_variable_scan_extensions; + if (gnet_property->props145.data.string.def) { + *gnet_property->props145.data.string.value = + g_strdup(eval_subst(*gnet_property->props145.data.string.def)); + } /* - * PROP_SCAN_EXTENSIONS: + * PROP_SCAN_IGNORE_SYMLINK_DIRS: * * General data: */ - gnet_property->props146.name = "shared_files_extensions"; - gnet_property->props146.desc = _("Only files with the given extensions will be shared. The special --all-- extension matches all files, even if they don't have any extension. Use with care."); - gnet_property->props146.ev_changed = event_new("scan_extensions_changed"); + gnet_property->props146.name = "scan_ignore_symlink_dirs"; + gnet_property->props146.desc = _("Ignore symbolically linked directories when scanning files to share."); + gnet_property->props146.ev_changed = event_new("scan_ignore_symlink_dirs_changed"); gnet_property->props146.save = TRUE; + gnet_property->props146.internal = FALSE; gnet_property->props146.vector_size = 1; + mutex_init(&gnet_property->props146.lock); /* Type specific data: */ - gnet_property->props146.type = PROP_TYPE_STRING; - gnet_property->props146.data.string.def = (void *) &gnet_property_variable_scan_extensions_default; - gnet_property->props146.data.string.value = (void *) &gnet_property_variable_scan_extensions; - if (gnet_property->props146.data.string.def) { - *gnet_property->props146.data.string.value = - g_strdup(eval_subst(*gnet_property->props146.data.string.def)); - } + gnet_property->props146.type = PROP_TYPE_BOOLEAN; + gnet_property->props146.data.boolean.def = (void *) &gnet_property_variable_scan_ignore_symlink_dirs_default; + gnet_property->props146.data.boolean.value = (void *) &gnet_property_variable_scan_ignore_symlink_dirs; /* - * PROP_SCAN_IGNORE_SYMLINK_DIRS: + * PROP_SCAN_IGNORE_SYMLINK_REGFILES: * * General data: */ - gnet_property->props147.name = "scan_ignore_symlink_dirs"; - gnet_property->props147.desc = _("Ignore symbolically linked directories when scanning files to share."); - gnet_property->props147.ev_changed = event_new("scan_ignore_symlink_dirs_changed"); + gnet_property->props147.name = "scan_ignore_symlink_regfiles"; + gnet_property->props147.desc = _("Ignore symbolically linked regular files when scanning files to share."); + gnet_property->props147.ev_changed = event_new("scan_ignore_symlink_regfiles_changed"); gnet_property->props147.save = TRUE; + gnet_property->props147.internal = FALSE; gnet_property->props147.vector_size = 1; + mutex_init(&gnet_property->props147.lock); /* Type specific data: */ gnet_property->props147.type = PROP_TYPE_BOOLEAN; - gnet_property->props147.data.boolean.def = (void *) &gnet_property_variable_scan_ignore_symlink_dirs_default; - gnet_property->props147.data.boolean.value = (void *) &gnet_property_variable_scan_ignore_symlink_dirs; + gnet_property->props147.data.boolean.def = (void *) &gnet_property_variable_scan_ignore_symlink_regfiles_default; + gnet_property->props147.data.boolean.value = (void *) &gnet_property_variable_scan_ignore_symlink_regfiles; /* - * PROP_SCAN_IGNORE_SYMLINK_REGFILES: + * PROP_SAVE_FILE_PATH: * * General data: */ - gnet_property->props148.name = "scan_ignore_symlink_regfiles"; - gnet_property->props148.desc = _("Ignore symbolically linked regular files when scanning files to share."); - gnet_property->props148.ev_changed = event_new("scan_ignore_symlink_regfiles_changed"); + gnet_property->props148.name = "store_downloading_files_to"; + gnet_property->props148.desc = _("Store incomplete files in this directory."); + gnet_property->props148.ev_changed = event_new("save_file_path_changed"); gnet_property->props148.save = TRUE; + gnet_property->props148.internal = FALSE; gnet_property->props148.vector_size = 1; + mutex_init(&gnet_property->props148.lock); /* Type specific data: */ - gnet_property->props148.type = PROP_TYPE_BOOLEAN; - gnet_property->props148.data.boolean.def = (void *) &gnet_property_variable_scan_ignore_symlink_regfiles_default; - gnet_property->props148.data.boolean.value = (void *) &gnet_property_variable_scan_ignore_symlink_regfiles; + gnet_property->props148.type = PROP_TYPE_STRING; + gnet_property->props148.data.string.def = (void *) &gnet_property_variable_save_file_path_default; + gnet_property->props148.data.string.value = (void *) &gnet_property_variable_save_file_path; + if (gnet_property->props148.data.string.def) { + *gnet_property->props148.data.string.value = + g_strdup(eval_subst(*gnet_property->props148.data.string.def)); + } /* - * PROP_SAVE_FILE_PATH: + * PROP_MOVE_FILE_PATH: * * General data: */ - gnet_property->props149.name = "store_downloading_files_to"; - gnet_property->props149.desc = _("Store incomplete files in this directory."); - gnet_property->props149.ev_changed = event_new("save_file_path_changed"); + gnet_property->props149.name = "move_downloading_files_to"; + gnet_property->props149.desc = _("Move complete files to this directory. If this is set to the SAME directory as the incomplete or corrupted files, files will be renamed with a trailing .OK"); + gnet_property->props149.ev_changed = event_new("move_file_path_changed"); gnet_property->props149.save = TRUE; + gnet_property->props149.internal = FALSE; gnet_property->props149.vector_size = 1; + mutex_init(&gnet_property->props149.lock); /* Type specific data: */ gnet_property->props149.type = PROP_TYPE_STRING; - gnet_property->props149.data.string.def = (void *) &gnet_property_variable_save_file_path_default; - gnet_property->props149.data.string.value = (void *) &gnet_property_variable_save_file_path; + gnet_property->props149.data.string.def = (void *) &gnet_property_variable_move_file_path_default; + gnet_property->props149.data.string.value = (void *) &gnet_property_variable_move_file_path; if (gnet_property->props149.data.string.def) { *gnet_property->props149.data.string.value = g_strdup(eval_subst(*gnet_property->props149.data.string.def)); @@ -3928,20 +4327,22 @@ /* - * PROP_MOVE_FILE_PATH: + * PROP_BAD_FILE_PATH: * * General data: */ - gnet_property->props150.name = "move_downloading_files_to"; - gnet_property->props150.desc = _("Move complete files to this directory. If this is set to the SAME directory as the incomplete or corrupted files, files will be renamed with a trailing .OK"); - gnet_property->props150.ev_changed = event_new("move_file_path_changed"); + gnet_property->props150.name = "move_corrupted_files_to"; + gnet_property->props150.desc = _("Move corrupted, downloaded files to this directory. If this is set to the SAME directory as the incomplete or completed files, files will be renamed with a trailing .BAD"); + gnet_property->props150.ev_changed = event_new("bad_file_path_changed"); gnet_property->props150.save = TRUE; + gnet_property->props150.internal = FALSE; gnet_property->props150.vector_size = 1; + mutex_init(&gnet_property->props150.lock); /* Type specific data: */ gnet_property->props150.type = PROP_TYPE_STRING; - gnet_property->props150.data.string.def = (void *) &gnet_property_variable_move_file_path_default; - gnet_property->props150.data.string.value = (void *) &gnet_property_variable_move_file_path; + gnet_property->props150.data.string.def = (void *) &gnet_property_variable_bad_file_path_default; + gnet_property->props150.data.string.value = (void *) &gnet_property_variable_bad_file_path; if (gnet_property->props150.data.string.def) { *gnet_property->props150.data.string.value = g_strdup(eval_subst(*gnet_property->props150.data.string.def)); @@ -3949,20 +4350,22 @@ /* - * PROP_BAD_FILE_PATH: + * PROP_SHARED_DIRS_PATHS: * * General data: */ - gnet_property->props151.name = "move_corrupted_files_to"; - gnet_property->props151.desc = _("Move corrupted, downloaded files to this directory. If this is set to the SAME directory as the incomplete or completed files, files will be renamed with a trailing .BAD"); - gnet_property->props151.ev_changed = event_new("bad_file_path_changed"); + gnet_property->props151.name = "shared_dirs"; + gnet_property->props151.desc = _("Directories which contain shared files."); + gnet_property->props151.ev_changed = event_new("shared_dirs_paths_changed"); gnet_property->props151.save = TRUE; + gnet_property->props151.internal = FALSE; gnet_property->props151.vector_size = 1; + mutex_init(&gnet_property->props151.lock); /* Type specific data: */ gnet_property->props151.type = PROP_TYPE_STRING; - gnet_property->props151.data.string.def = (void *) &gnet_property_variable_bad_file_path_default; - gnet_property->props151.data.string.value = (void *) &gnet_property_variable_bad_file_path; + gnet_property->props151.data.string.def = (void *) &gnet_property_variable_shared_dirs_paths_default; + gnet_property->props151.data.string.value = (void *) &gnet_property_variable_shared_dirs_paths; if (gnet_property->props151.data.string.def) { *gnet_property->props151.data.string.value = g_strdup(eval_subst(*gnet_property->props151.data.string.def)); @@ -3970,20 +4373,22 @@ /* - * PROP_SHARED_DIRS_PATHS: + * PROP_LOCAL_NETMASKS_STRING: * * General data: */ - gnet_property->props152.name = "shared_dirs"; - gnet_property->props152.desc = _("Directories which contain shared files."); - gnet_property->props152.ev_changed = event_new("shared_dirs_paths_changed"); + gnet_property->props152.name = "local_netmasks"; + gnet_property->props152.desc = _("List of networks considered local. This is a list of IP addresses, separated by ';'. The IP address can be given out fully, as in 192.168.0.1, or be optionally followed by '/' and a network mask prefix length. For instance, 192.168.0.1/24 would represent the whole 192.168.0.* network."); + gnet_property->props152.ev_changed = event_new("local_netmasks_string_changed"); gnet_property->props152.save = TRUE; + gnet_property->props152.internal = FALSE; gnet_property->props152.vector_size = 1; + mutex_init(&gnet_property->props152.lock); /* Type specific data: */ gnet_property->props152.type = PROP_TYPE_STRING; - gnet_property->props152.data.string.def = (void *) &gnet_property_variable_shared_dirs_paths_default; - gnet_property->props152.data.string.value = (void *) &gnet_property_variable_shared_dirs_paths; + gnet_property->props152.data.string.def = (void *) &gnet_property_variable_local_netmasks_string_default; + gnet_property->props152.data.string.value = (void *) &gnet_property_variable_local_netmasks_string; if (gnet_property->props152.data.string.def) { *gnet_property->props152.data.string.value = g_strdup(eval_subst(*gnet_property->props152.data.string.def)); @@ -3991,5437 +4396,6906 @@ /* - * PROP_LOCAL_NETMASKS_STRING: + * PROP_TOTAL_DOWNLOADS: * * General data: */ - gnet_property->props153.name = "local_netmasks"; - gnet_property->props153.desc = _("List of networks considered local. This is a list of IP addresses, separated by ';'. The IP address can be given out fully, as in 192.168.0.1, or be optionally followed by '/' and a network mask prefix length. For instance, 192.168.0.1/24 would represent the whole 192.168.0.* network."); - gnet_property->props153.ev_changed = event_new("local_netmasks_string_changed"); - gnet_property->props153.save = TRUE; + gnet_property->props153.name = "total_downloads"; + gnet_property->props153.desc = _("Total number of completed downloads in this session."); + gnet_property->props153.ev_changed = event_new("total_downloads_changed"); + gnet_property->props153.save = FALSE; + gnet_property->props153.internal = TRUE; gnet_property->props153.vector_size = 1; + mutex_init(&gnet_property->props153.lock); /* Type specific data: */ - gnet_property->props153.type = PROP_TYPE_STRING; - gnet_property->props153.data.string.def = (void *) &gnet_property_variable_local_netmasks_string_default; - gnet_property->props153.data.string.value = (void *) &gnet_property_variable_local_netmasks_string; - if (gnet_property->props153.data.string.def) { - *gnet_property->props153.data.string.value = - g_strdup(eval_subst(*gnet_property->props153.data.string.def)); - } + gnet_property->props153.type = PROP_TYPE_GUINT32; + gnet_property->props153.data.guint32.def = (void *) &gnet_property_variable_total_downloads_default; + gnet_property->props153.data.guint32.value = (void *) &gnet_property_variable_total_downloads; + gnet_property->props153.data.guint32.choices = NULL; + gnet_property->props153.data.guint32.max = 0xFFFFFFFF; + gnet_property->props153.data.guint32.min = 0x00000000; /* - * PROP_TOTAL_DOWNLOADS: + * PROP_UL_RUNNING: * * General data: */ - gnet_property->props154.name = "total_downloads"; - gnet_property->props154.desc = _("Total number of completed downloads in this session."); - gnet_property->props154.ev_changed = event_new("total_downloads_changed"); + gnet_property->props154.name = "ul_running"; + gnet_property->props154.desc = _("Number of running uploads."); + gnet_property->props154.ev_changed = event_new("ul_running_changed"); gnet_property->props154.save = FALSE; + gnet_property->props154.internal = TRUE; gnet_property->props154.vector_size = 1; + mutex_init(&gnet_property->props154.lock); /* Type specific data: */ gnet_property->props154.type = PROP_TYPE_GUINT32; - gnet_property->props154.data.guint32.def = (void *) &gnet_property_variable_total_downloads_default; - gnet_property->props154.data.guint32.value = (void *) &gnet_property_variable_total_downloads; + gnet_property->props154.data.guint32.def = (void *) &gnet_property_variable_ul_running_default; + gnet_property->props154.data.guint32.value = (void *) &gnet_property_variable_ul_running; gnet_property->props154.data.guint32.choices = NULL; gnet_property->props154.data.guint32.max = 0xFFFFFFFF; gnet_property->props154.data.guint32.min = 0x00000000; /* - * PROP_UL_RUNNING: + * PROP_UL_QUICK_RUNNING: * * General data: */ - gnet_property->props155.name = "ul_running"; - gnet_property->props155.desc = _("Number of running uploads."); - gnet_property->props155.ev_changed = event_new("ul_running_changed"); + gnet_property->props155.name = "ul_quick_running"; + gnet_property->props155.desc = _("Number of quick uploads currently running."); + gnet_property->props155.ev_changed = event_new("ul_quick_running_changed"); gnet_property->props155.save = FALSE; + gnet_property->props155.internal = TRUE; gnet_property->props155.vector_size = 1; + mutex_init(&gnet_property->props155.lock); /* Type specific data: */ gnet_property->props155.type = PROP_TYPE_GUINT32; - gnet_property->props155.data.guint32.def = (void *) &gnet_property_variable_ul_running_default; - gnet_property->props155.data.guint32.value = (void *) &gnet_property_variable_ul_running; + gnet_property->props155.data.guint32.def = (void *) &gnet_property_variable_ul_quick_running_default; + gnet_property->props155.data.guint32.value = (void *) &gnet_property_variable_ul_quick_running; gnet_property->props155.data.guint32.choices = NULL; gnet_property->props155.data.guint32.max = 0xFFFFFFFF; gnet_property->props155.data.guint32.min = 0x00000000; /* - * PROP_UL_QUICK_RUNNING: + * PROP_UL_REGISTERED: * * General data: */ - gnet_property->props156.name = "ul_quick_running"; - gnet_property->props156.desc = _("Number of quick uploads currently running."); - gnet_property->props156.ev_changed = event_new("ul_quick_running_changed"); + gnet_property->props156.name = "ul_registered"; + gnet_property->props156.desc = _("Number of registered (pending) uploads."); + gnet_property->props156.ev_changed = event_new("ul_registered_changed"); gnet_property->props156.save = FALSE; + gnet_property->props156.internal = TRUE; gnet_property->props156.vector_size = 1; + mutex_init(&gnet_property->props156.lock); /* Type specific data: */ gnet_property->props156.type = PROP_TYPE_GUINT32; - gnet_property->props156.data.guint32.def = (void *) &gnet_property_variable_ul_quick_running_default; - gnet_property->props156.data.guint32.value = (void *) &gnet_property_variable_ul_quick_running; + gnet_property->props156.data.guint32.def = (void *) &gnet_property_variable_ul_registered_default; + gnet_property->props156.data.guint32.value = (void *) &gnet_property_variable_ul_registered; gnet_property->props156.data.guint32.choices = NULL; gnet_property->props156.data.guint32.max = 0xFFFFFFFF; gnet_property->props156.data.guint32.min = 0x00000000; /* - * PROP_UL_REGISTERED: + * PROP_TOTAL_UPLOADS: * * General data: */ - gnet_property->props157.name = "ul_registered"; - gnet_property->props157.desc = _("Number of registered (pending) uploads."); - gnet_property->props157.ev_changed = event_new("ul_registered_changed"); + gnet_property->props157.name = "total_uploads"; + gnet_property->props157.desc = _("Total number of completed uploads in this session."); + gnet_property->props157.ev_changed = event_new("total_uploads_changed"); gnet_property->props157.save = FALSE; + gnet_property->props157.internal = TRUE; gnet_property->props157.vector_size = 1; + mutex_init(&gnet_property->props157.lock); /* Type specific data: */ gnet_property->props157.type = PROP_TYPE_GUINT32; - gnet_property->props157.data.guint32.def = (void *) &gnet_property_variable_ul_registered_default; - gnet_property->props157.data.guint32.value = (void *) &gnet_property_variable_ul_registered; + gnet_property->props157.data.guint32.def = (void *) &gnet_property_variable_total_uploads_default; + gnet_property->props157.data.guint32.value = (void *) &gnet_property_variable_total_uploads; gnet_property->props157.data.guint32.choices = NULL; gnet_property->props157.data.guint32.max = 0xFFFFFFFF; gnet_property->props157.data.guint32.min = 0x00000000; /* - * PROP_TOTAL_UPLOADS: + * PROP_SERVENT_GUID: * * General data: */ - gnet_property->props158.name = "total_uploads"; - gnet_property->props158.desc = _("Total number of completed uploads in this session."); - gnet_property->props158.ev_changed = event_new("total_uploads_changed"); - gnet_property->props158.save = FALSE; - gnet_property->props158.vector_size = 1; + gnet_property->props158.name = "guid"; + gnet_property->props158.desc = _("Global Unique IDentifier of this node."); + gnet_property->props158.ev_changed = event_new("servent_guid_changed"); + gnet_property->props158.save = TRUE; + gnet_property->props158.internal = FALSE; + gnet_property->props158.vector_size = GUID_RAW_SIZE; + mutex_init(&gnet_property->props158.lock); /* Type specific data: */ - gnet_property->props158.type = PROP_TYPE_GUINT32; - gnet_property->props158.data.guint32.def = (void *) &gnet_property_variable_total_uploads_default; - gnet_property->props158.data.guint32.value = (void *) &gnet_property_variable_total_uploads; - gnet_property->props158.data.guint32.choices = NULL; - gnet_property->props158.data.guint32.max = 0xFFFFFFFF; - gnet_property->props158.data.guint32.min = 0x00000000; + gnet_property->props158.type = PROP_TYPE_STORAGE; + gnet_property->props158.data.storage.value = gnet_property_variable_servent_guid; /* - * PROP_SERVENT_GUID: + * PROP_KUID: * * General data: */ - gnet_property->props159.name = "guid"; - gnet_property->props159.desc = _("Global Unique IDentifier of this node."); - gnet_property->props159.ev_changed = event_new("servent_guid_changed"); + gnet_property->props159.name = "kuid"; + gnet_property->props159.desc = _("Kademlia Unique IDentifier of this node in the DHT."); + gnet_property->props159.ev_changed = event_new("kuid_changed"); gnet_property->props159.save = TRUE; - gnet_property->props159.vector_size = GUID_RAW_SIZE; + gnet_property->props159.internal = FALSE; + gnet_property->props159.vector_size = KUID_RAW_SIZE; + mutex_init(&gnet_property->props159.lock); /* Type specific data: */ gnet_property->props159.type = PROP_TYPE_STORAGE; - gnet_property->props159.data.storage.value = gnet_property_variable_servent_guid; + gnet_property->props159.data.storage.value = gnet_property_variable_kuid; /* - * PROP_KUID: + * PROP_USE_SWARMING: * * General data: */ - gnet_property->props160.name = "kuid"; - gnet_property->props160.desc = _("Kademlia Unique IDentifier of this node in the DHT."); - gnet_property->props160.ev_changed = event_new("kuid_changed"); + gnet_property->props160.name = "use_swarming"; + gnet_property->props160.desc = _("Whether or not to use swarming (recommended = YES)."); + gnet_property->props160.ev_changed = event_new("use_swarming_changed"); gnet_property->props160.save = TRUE; - gnet_property->props160.vector_size = KUID_RAW_SIZE; + gnet_property->props160.internal = FALSE; + gnet_property->props160.vector_size = 1; + mutex_init(&gnet_property->props160.lock); /* Type specific data: */ - gnet_property->props160.type = PROP_TYPE_STORAGE; - gnet_property->props160.data.storage.value = gnet_property_variable_kuid; + gnet_property->props160.type = PROP_TYPE_BOOLEAN; + gnet_property->props160.data.boolean.def = (void *) &gnet_property_variable_use_swarming_default; + gnet_property->props160.data.boolean.value = (void *) &gnet_property_variable_use_swarming; /* - * PROP_USE_SWARMING: + * PROP_USE_AGGRESSIVE_SWARMING: * * General data: */ - gnet_property->props161.name = "use_swarming"; - gnet_property->props161.desc = _("Whether or not to use swarming (recommended = YES)."); - gnet_property->props161.ev_changed = event_new("use_swarming_changed"); + gnet_property->props161.name = "use_aggressive_swarming"; + gnet_property->props161.desc = _("Whether or not to launch competing downloads when swarming and there are many sources available with a few chunks left."); + gnet_property->props161.ev_changed = event_new("use_aggressive_swarming_changed"); gnet_property->props161.save = TRUE; + gnet_property->props161.internal = FALSE; gnet_property->props161.vector_size = 1; + mutex_init(&gnet_property->props161.lock); /* Type specific data: */ gnet_property->props161.type = PROP_TYPE_BOOLEAN; - gnet_property->props161.data.boolean.def = (void *) &gnet_property_variable_use_swarming_default; - gnet_property->props161.data.boolean.value = (void *) &gnet_property_variable_use_swarming; + gnet_property->props161.data.boolean.def = (void *) &gnet_property_variable_use_aggressive_swarming_default; + gnet_property->props161.data.boolean.value = (void *) &gnet_property_variable_use_aggressive_swarming; /* - * PROP_USE_AGGRESSIVE_SWARMING: + * PROP_DL_MINCHUNKSIZE: * * General data: */ - gnet_property->props162.name = "use_aggressive_swarming"; - gnet_property->props162.desc = _("Whether or not to launch competing downloads when swarming and there are many sources available with a few chunks left."); - gnet_property->props162.ev_changed = event_new("use_aggressive_swarming_changed"); + gnet_property->props162.name = "dl_minchunksize"; + gnet_property->props162.desc = _("Minimum chunk size when swarming. This is only a hint as gtk-gnutella will download less if you only have a few bytes to get for a file..."); + gnet_property->props162.ev_changed = event_new("dl_minchunksize_changed"); gnet_property->props162.save = TRUE; + gnet_property->props162.internal = FALSE; gnet_property->props162.vector_size = 1; + mutex_init(&gnet_property->props162.lock); /* Type specific data: */ - gnet_property->props162.type = PROP_TYPE_BOOLEAN; - gnet_property->props162.data.boolean.def = (void *) &gnet_property_variable_use_aggressive_swarming_default; - gnet_property->props162.data.boolean.value = (void *) &gnet_property_variable_use_aggressive_swarming; + gnet_property->props162.type = PROP_TYPE_GUINT32; + gnet_property->props162.data.guint32.def = (void *) &gnet_property_variable_dl_minchunksize_default; + gnet_property->props162.data.guint32.value = (void *) &gnet_property_variable_dl_minchunksize; + gnet_property->props162.data.guint32.choices = NULL; + gnet_property->props162.data.guint32.max = 100*1024*1024; + gnet_property->props162.data.guint32.min = 64*1024; /* - * PROP_DL_MINCHUNKSIZE: + * PROP_DL_MAXCHUNKSIZE: * * General data: */ - gnet_property->props163.name = "dl_minchunksize"; - gnet_property->props163.desc = _("Minimum chunk size when swarming. This is only a hint as gtk-gnutella will download less if you only have a few bytes to get for a file..."); - gnet_property->props163.ev_changed = event_new("dl_minchunksize_changed"); + gnet_property->props163.name = "dl_maxchunksize"; + gnet_property->props163.desc = _("Maximum chunk size when swarming."); + gnet_property->props163.ev_changed = event_new("dl_maxchunksize_changed"); gnet_property->props163.save = TRUE; + gnet_property->props163.internal = FALSE; gnet_property->props163.vector_size = 1; + mutex_init(&gnet_property->props163.lock); /* Type specific data: */ gnet_property->props163.type = PROP_TYPE_GUINT32; - gnet_property->props163.data.guint32.def = (void *) &gnet_property_variable_dl_minchunksize_default; - gnet_property->props163.data.guint32.value = (void *) &gnet_property_variable_dl_minchunksize; + gnet_property->props163.data.guint32.def = (void *) &gnet_property_variable_dl_maxchunksize_default; + gnet_property->props163.data.guint32.value = (void *) &gnet_property_variable_dl_maxchunksize; gnet_property->props163.data.guint32.choices = NULL; - gnet_property->props163.data.guint32.max = 100*1024*1024; + gnet_property->props163.data.guint32.max = 1000*1024*1024; gnet_property->props163.data.guint32.min = 64*1024; /* - * PROP_DL_MAXCHUNKSIZE: + * PROP_AUTO_DOWNLOAD_IDENTICAL: * * General data: */ - gnet_property->props164.name = "dl_maxchunksize"; - gnet_property->props164.desc = _("Maximum chunk size when swarming."); - gnet_property->props164.ev_changed = event_new("dl_maxchunksize_changed"); + gnet_property->props164.name = "auto_download_identical"; + gnet_property->props164.desc = _("Whether or not to automatically queue search results that match a file in the download queue."); + gnet_property->props164.ev_changed = event_new("auto_download_identical_changed"); gnet_property->props164.save = TRUE; + gnet_property->props164.internal = FALSE; gnet_property->props164.vector_size = 1; + mutex_init(&gnet_property->props164.lock); /* Type specific data: */ - gnet_property->props164.type = PROP_TYPE_GUINT32; - gnet_property->props164.data.guint32.def = (void *) &gnet_property_variable_dl_maxchunksize_default; - gnet_property->props164.data.guint32.value = (void *) &gnet_property_variable_dl_maxchunksize; - gnet_property->props164.data.guint32.choices = NULL; - gnet_property->props164.data.guint32.max = 1000*1024*1024; - gnet_property->props164.data.guint32.min = 64*1024; + gnet_property->props164.type = PROP_TYPE_BOOLEAN; + gnet_property->props164.data.boolean.def = (void *) &gnet_property_variable_auto_download_identical_default; + gnet_property->props164.data.boolean.value = (void *) &gnet_property_variable_auto_download_identical; /* - * PROP_AUTO_DOWNLOAD_IDENTICAL: + * PROP_AUTO_FEED_DOWNLOAD_MESH: * * General data: */ - gnet_property->props165.name = "auto_download_identical"; - gnet_property->props165.desc = _("Whether or not to automatically queue search results that match a file in the download queue."); - gnet_property->props165.ev_changed = event_new("auto_download_identical_changed"); + gnet_property->props165.name = "auto_feed_download_mesh"; + gnet_property->props165.desc = _("Whether or not to automatically feed the download mesh with data gathered from the query hits that flow through our node. This looks for new entries for files we are sharing or already have in our mesh."); + gnet_property->props165.ev_changed = event_new("auto_feed_download_mesh_changed"); gnet_property->props165.save = TRUE; + gnet_property->props165.internal = FALSE; gnet_property->props165.vector_size = 1; + mutex_init(&gnet_property->props165.lock); /* Type specific data: */ gnet_property->props165.type = PROP_TYPE_BOOLEAN; - gnet_property->props165.data.boolean.def = (void *) &gnet_property_variable_auto_download_identical_default; - gnet_property->props165.data.boolean.value = (void *) &gnet_property_variable_auto_download_identical; + gnet_property->props165.data.boolean.def = (void *) &gnet_property_variable_auto_feed_download_mesh_default; + gnet_property->props165.data.boolean.value = (void *) &gnet_property_variable_auto_feed_download_mesh; /* - * PROP_AUTO_FEED_DOWNLOAD_MESH: + * PROP_STRICT_SHA1_MATCHING: * * General data: */ - gnet_property->props166.name = "auto_feed_download_mesh"; - gnet_property->props166.desc = _("Whether or not to automatically feed the download mesh with data gathered from the query hits that flow through our node. This looks for new entries for files we are sharing or already have in our mesh."); - gnet_property->props166.ev_changed = event_new("auto_feed_download_mesh_changed"); + gnet_property->props166.name = "strict_sha1_matching"; + gnet_property->props166.desc = _("When enabled, SHA1s must match. Otherwise, name and size will be sufficient."); + gnet_property->props166.ev_changed = event_new("strict_sha1_matching_changed"); gnet_property->props166.save = TRUE; + gnet_property->props166.internal = FALSE; gnet_property->props166.vector_size = 1; + mutex_init(&gnet_property->props166.lock); /* Type specific data: */ gnet_property->props166.type = PROP_TYPE_BOOLEAN; - gnet_property->props166.data.boolean.def = (void *) &gnet_property_variable_auto_feed_download_mesh_default; - gnet_property->props166.data.boolean.value = (void *) &gnet_property_variable_auto_feed_download_mesh; + gnet_property->props166.data.boolean.def = (void *) &gnet_property_variable_strict_sha1_matching_default; + gnet_property->props166.data.boolean.value = (void *) &gnet_property_variable_strict_sha1_matching; /* - * PROP_STRICT_SHA1_MATCHING: + * PROP_IS_FIREWALLED: * * General data: */ - gnet_property->props167.name = "strict_sha1_matching"; - gnet_property->props167.desc = _("When enabled, SHA1s must match. Otherwise, name and size will be sufficient."); - gnet_property->props167.ev_changed = event_new("strict_sha1_matching_changed"); + gnet_property->props167.name = "is_firewalled"; + gnet_property->props167.desc = _("Whether gtk-gnutella thinks you're currently firewalled, TCP-wise."); + gnet_property->props167.ev_changed = event_new("is_firewalled_changed"); gnet_property->props167.save = TRUE; + gnet_property->props167.internal = FALSE; gnet_property->props167.vector_size = 1; + mutex_init(&gnet_property->props167.lock); /* Type specific data: */ gnet_property->props167.type = PROP_TYPE_BOOLEAN; - gnet_property->props167.data.boolean.def = (void *) &gnet_property_variable_strict_sha1_matching_default; - gnet_property->props167.data.boolean.value = (void *) &gnet_property_variable_strict_sha1_matching; + gnet_property->props167.data.boolean.def = (void *) &gnet_property_variable_is_firewalled_default; + gnet_property->props167.data.boolean.value = (void *) &gnet_property_variable_is_firewalled; /* - * PROP_IS_FIREWALLED: + * PROP_IS_INET_CONNECTED: * * General data: */ - gnet_property->props168.name = "is_firewalled"; - gnet_property->props168.desc = _("Whether gtk-gnutella thinks you're currently firewalled, TCP-wise."); - gnet_property->props168.ev_changed = event_new("is_firewalled_changed"); - gnet_property->props168.save = TRUE; + gnet_property->props168.name = "is_inet_connected"; + gnet_property->props168.desc = _("Whether gtk-gnutella thinks it's connected to the Internet."); + gnet_property->props168.ev_changed = event_new("is_inet_connected_changed"); + gnet_property->props168.save = FALSE; + gnet_property->props168.internal = FALSE; gnet_property->props168.vector_size = 1; + mutex_init(&gnet_property->props168.lock); /* Type specific data: */ gnet_property->props168.type = PROP_TYPE_BOOLEAN; - gnet_property->props168.data.boolean.def = (void *) &gnet_property_variable_is_firewalled_default; - gnet_property->props168.data.boolean.value = (void *) &gnet_property_variable_is_firewalled; + gnet_property->props168.data.boolean.def = (void *) &gnet_property_variable_is_inet_connected_default; + gnet_property->props168.data.boolean.value = (void *) &gnet_property_variable_is_inet_connected; /* - * PROP_IS_INET_CONNECTED: + * PROP_IS_UDP_FIREWALLED: * * General data: */ - gnet_property->props169.name = "is_inet_connected"; - gnet_property->props169.desc = _("Whether gtk-gnutella thinks it's connected to the Internet."); - gnet_property->props169.ev_changed = event_new("is_inet_connected_changed"); - gnet_property->props169.save = FALSE; + gnet_property->props169.name = "is_udp_firewalled"; + gnet_property->props169.desc = _("Whether gtk-gnutella thinks you're currently firewalled, UDP-wise."); + gnet_property->props169.ev_changed = event_new("is_udp_firewalled_changed"); + gnet_property->props169.save = TRUE; + gnet_property->props169.internal = FALSE; gnet_property->props169.vector_size = 1; + mutex_init(&gnet_property->props169.lock); /* Type specific data: */ gnet_property->props169.type = PROP_TYPE_BOOLEAN; - gnet_property->props169.data.boolean.def = (void *) &gnet_property_variable_is_inet_connected_default; - gnet_property->props169.data.boolean.value = (void *) &gnet_property_variable_is_inet_connected; + gnet_property->props169.data.boolean.def = (void *) &gnet_property_variable_is_udp_firewalled_default; + gnet_property->props169.data.boolean.value = (void *) &gnet_property_variable_is_udp_firewalled; /* - * PROP_IS_UDP_FIREWALLED: + * PROP_RECV_SOLICITED_UDP: * * General data: */ - gnet_property->props170.name = "is_udp_firewalled"; - gnet_property->props170.desc = _("Whether gtk-gnutella thinks you're currently firewalled, UDP-wise."); - gnet_property->props170.ev_changed = event_new("is_udp_firewalled_changed"); + gnet_property->props170.name = "recv_solicited_udp"; + gnet_property->props170.desc = _("Whether gtk-gnutella determined it could receive solicited UDP."); + gnet_property->props170.ev_changed = event_new("recv_solicited_udp_changed"); gnet_property->props170.save = TRUE; + gnet_property->props170.internal = FALSE; gnet_property->props170.vector_size = 1; + mutex_init(&gnet_property->props170.lock); /* Type specific data: */ gnet_property->props170.type = PROP_TYPE_BOOLEAN; - gnet_property->props170.data.boolean.def = (void *) &gnet_property_variable_is_udp_firewalled_default; - gnet_property->props170.data.boolean.value = (void *) &gnet_property_variable_is_udp_firewalled; + gnet_property->props170.data.boolean.def = (void *) &gnet_property_variable_recv_solicited_udp_default; + gnet_property->props170.data.boolean.value = (void *) &gnet_property_variable_recv_solicited_udp; /* - * PROP_RECV_SOLICITED_UDP: + * PROP_GNET_COMPACT_QUERY: * * General data: */ - gnet_property->props171.name = "recv_solicited_udp"; - gnet_property->props171.desc = _("Whether gtk-gnutella determined it could receive solicited UDP."); - gnet_property->props171.ev_changed = event_new("recv_solicited_udp_changed"); + gnet_property->props171.name = "gnet_compact_query"; + gnet_property->props171.desc = _("Remove unnecessary ballast from query string before processing or forwarding them. Reduces traffic at the cost of little CPU time."); + gnet_property->props171.ev_changed = event_new("gnet_compact_query_changed"); gnet_property->props171.save = TRUE; + gnet_property->props171.internal = FALSE; gnet_property->props171.vector_size = 1; + mutex_init(&gnet_property->props171.lock); /* Type specific data: */ gnet_property->props171.type = PROP_TYPE_BOOLEAN; - gnet_property->props171.data.boolean.def = (void *) &gnet_property_variable_recv_solicited_udp_default; - gnet_property->props171.data.boolean.value = (void *) &gnet_property_variable_recv_solicited_udp; + gnet_property->props171.data.boolean.def = (void *) &gnet_property_variable_gnet_compact_query_default; + gnet_property->props171.data.boolean.value = (void *) &gnet_property_variable_gnet_compact_query; /* - * PROP_GNET_COMPACT_QUERY: + * PROP_DOWNLOAD_OPTIMISTIC_START: * * General data: */ - gnet_property->props172.name = "gnet_compact_query"; - gnet_property->props172.desc = _("Remove unnecessary ballast from query string before processing or forwarding them. Reduces traffic at the cost of little CPU time."); - gnet_property->props172.ev_changed = event_new("gnet_compact_query_changed"); + gnet_property->props172.name = "download_optimistic_start"; + gnet_property->props172.desc = _("Also use sources that don't provide a SHA1 value for the first chunk of a file. This dramatically reduces the 'No URN on server' messages, but may result in overlap problems later if the first chunk was actually from a different file. Use with caution."); + gnet_property->props172.ev_changed = event_new("download_optimistic_start_changed"); gnet_property->props172.save = TRUE; + gnet_property->props172.internal = FALSE; gnet_property->props172.vector_size = 1; + mutex_init(&gnet_property->props172.lock); /* Type specific data: */ gnet_property->props172.type = PROP_TYPE_BOOLEAN; - gnet_property->props172.data.boolean.def = (void *) &gnet_property_variable_gnet_compact_query_default; - gnet_property->props172.data.boolean.value = (void *) &gnet_property_variable_gnet_compact_query; + gnet_property->props172.data.boolean.def = (void *) &gnet_property_variable_download_optimistic_start_default; + gnet_property->props172.data.boolean.value = (void *) &gnet_property_variable_download_optimistic_start; /* - * PROP_DOWNLOAD_OPTIMISTIC_START: + * PROP_LIBRARY_REBUILDING: * * General data: */ - gnet_property->props173.name = "download_optimistic_start"; - gnet_property->props173.desc = _("Also use sources that don't provide a SHA1 value for the first chunk of a file. This dramatically reduces the 'No URN on server' messages, but may result in overlap problems later if the first chunk was actually from a different file. Use with caution."); - gnet_property->props173.ev_changed = event_new("download_optimistic_start_changed"); - gnet_property->props173.save = TRUE; + gnet_property->props173.name = "library_rebuilding"; + gnet_property->props173.desc = _("Whether gtk-gnutella is currently rebuilding its library in the background."); + gnet_property->props173.ev_changed = event_new("library_rebuilding_changed"); + gnet_property->props173.save = FALSE; + gnet_property->props173.internal = TRUE; gnet_property->props173.vector_size = 1; + mutex_init(&gnet_property->props173.lock); /* Type specific data: */ gnet_property->props173.type = PROP_TYPE_BOOLEAN; - gnet_property->props173.data.boolean.def = (void *) &gnet_property_variable_download_optimistic_start_default; - gnet_property->props173.data.boolean.value = (void *) &gnet_property_variable_download_optimistic_start; + gnet_property->props173.data.boolean.def = (void *) &gnet_property_variable_library_rebuilding_default; + gnet_property->props173.data.boolean.value = (void *) &gnet_property_variable_library_rebuilding; /* - * PROP_LIBRARY_REBUILDING: + * PROP_SHA1_REBUILDING: * * General data: */ - gnet_property->props174.name = "library_rebuilding"; - gnet_property->props174.desc = _("Whether gtk-gnutella is currently rebuilding its library in the background."); - gnet_property->props174.ev_changed = event_new("library_rebuilding_changed"); + gnet_property->props174.name = "sha1_rebuilding"; + gnet_property->props174.desc = _("Whether gtk-gnutella is currently computing SHA1 of shared files in the background."); + gnet_property->props174.ev_changed = event_new("sha1_rebuilding_changed"); gnet_property->props174.save = FALSE; + gnet_property->props174.internal = TRUE; gnet_property->props174.vector_size = 1; + mutex_init(&gnet_property->props174.lock); /* Type specific data: */ gnet_property->props174.type = PROP_TYPE_BOOLEAN; - gnet_property->props174.data.boolean.def = (void *) &gnet_property_variable_library_rebuilding_default; - gnet_property->props174.data.boolean.value = (void *) &gnet_property_variable_library_rebuilding; + gnet_property->props174.data.boolean.def = (void *) &gnet_property_variable_sha1_rebuilding_default; + gnet_property->props174.data.boolean.value = (void *) &gnet_property_variable_sha1_rebuilding; /* - * PROP_SHA1_REBUILDING: + * PROP_SHA1_VERIFYING: * * General data: */ - gnet_property->props175.name = "sha1_rebuilding"; - gnet_property->props175.desc = _("Whether gtk-gnutella is currently computing SHA1 of shared files in the background."); - gnet_property->props175.ev_changed = event_new("sha1_rebuilding_changed"); + gnet_property->props175.name = "sha1_verifying"; + gnet_property->props175.desc = _("Whether gtk-gnutella is currently verifying SHA1 of downloaded files in the background."); + gnet_property->props175.ev_changed = event_new("sha1_verifying_changed"); gnet_property->props175.save = FALSE; + gnet_property->props175.internal = TRUE; gnet_property->props175.vector_size = 1; + mutex_init(&gnet_property->props175.lock); /* Type specific data: */ gnet_property->props175.type = PROP_TYPE_BOOLEAN; - gnet_property->props175.data.boolean.def = (void *) &gnet_property_variable_sha1_rebuilding_default; - gnet_property->props175.data.boolean.value = (void *) &gnet_property_variable_sha1_rebuilding; + gnet_property->props175.data.boolean.def = (void *) &gnet_property_variable_sha1_verifying_default; + gnet_property->props175.data.boolean.value = (void *) &gnet_property_variable_sha1_verifying; /* - * PROP_SHA1_VERIFYING: + * PROP_FILE_MOVING: * * General data: */ - gnet_property->props176.name = "sha1_verifying"; - gnet_property->props176.desc = _("Whether gtk-gnutella is currently verifying SHA1 of downloaded files in the background."); - gnet_property->props176.ev_changed = event_new("sha1_verifying_changed"); + gnet_property->props176.name = "file_moving"; + gnet_property->props176.desc = _("Whether gtk-gnutella is currently moving files across filesystems or simply copying in the background."); + gnet_property->props176.ev_changed = event_new("file_moving_changed"); gnet_property->props176.save = FALSE; + gnet_property->props176.internal = TRUE; gnet_property->props176.vector_size = 1; + mutex_init(&gnet_property->props176.lock); /* Type specific data: */ gnet_property->props176.type = PROP_TYPE_BOOLEAN; - gnet_property->props176.data.boolean.def = (void *) &gnet_property_variable_sha1_verifying_default; - gnet_property->props176.data.boolean.value = (void *) &gnet_property_variable_sha1_verifying; + gnet_property->props176.data.boolean.def = (void *) &gnet_property_variable_file_moving_default; + gnet_property->props176.data.boolean.value = (void *) &gnet_property_variable_file_moving; /* - * PROP_FILE_MOVING: + * PROP_PREFER_COMPRESSED_GNET: * * General data: */ - gnet_property->props177.name = "file_moving"; - gnet_property->props177.desc = _("Whether gtk-gnutella is currently moving files across filesystems or simply copying in the background."); - gnet_property->props177.ev_changed = event_new("file_moving_changed"); - gnet_property->props177.save = FALSE; + gnet_property->props177.name = "prefer_compressed_gnet"; + gnet_property->props177.desc = _("If active, only compressed incoming connections are allowed after the minimum number of connections has been established. Always allows for one non-compressed connection."); + gnet_property->props177.ev_changed = event_new("prefer_compressed_gnet_changed"); + gnet_property->props177.save = TRUE; + gnet_property->props177.internal = FALSE; gnet_property->props177.vector_size = 1; + mutex_init(&gnet_property->props177.lock); /* Type specific data: */ gnet_property->props177.type = PROP_TYPE_BOOLEAN; - gnet_property->props177.data.boolean.def = (void *) &gnet_property_variable_file_moving_default; - gnet_property->props177.data.boolean.value = (void *) &gnet_property_variable_file_moving; + gnet_property->props177.data.boolean.def = (void *) &gnet_property_variable_prefer_compressed_gnet_default; + gnet_property->props177.data.boolean.value = (void *) &gnet_property_variable_prefer_compressed_gnet; /* - * PROP_PREFER_COMPRESSED_GNET: + * PROP_ONLINE_MODE: * * General data: */ - gnet_property->props178.name = "prefer_compressed_gnet"; - gnet_property->props178.desc = _("If active, only compressed incoming connections are allowed after the minimum number of connections has been established. Always allows for one non-compressed connection."); - gnet_property->props178.ev_changed = event_new("prefer_compressed_gnet_changed"); + gnet_property->props178.name = "online_mode"; + gnet_property->props178.desc = _("If deactivated, only uploads and downloads will continue. All Gnet connections are disabled/terminated."); + gnet_property->props178.ev_changed = event_new("online_mode_changed"); gnet_property->props178.save = TRUE; + gnet_property->props178.internal = FALSE; gnet_property->props178.vector_size = 1; + mutex_init(&gnet_property->props178.lock); /* Type specific data: */ gnet_property->props178.type = PROP_TYPE_BOOLEAN; - gnet_property->props178.data.boolean.def = (void *) &gnet_property_variable_prefer_compressed_gnet_default; - gnet_property->props178.data.boolean.value = (void *) &gnet_property_variable_prefer_compressed_gnet; + gnet_property->props178.data.boolean.def = (void *) &gnet_property_variable_online_mode_default; + gnet_property->props178.data.boolean.value = (void *) &gnet_property_variable_online_mode; /* - * PROP_ONLINE_MODE: + * PROP_DOWNLOAD_REQUIRE_URN: * * General data: */ - gnet_property->props179.name = "online_mode"; - gnet_property->props179.desc = _("If deactivated, only uploads and downloads will continue. All Gnet connections are disabled/terminated."); - gnet_property->props179.ev_changed = event_new("online_mode_changed"); + gnet_property->props179.name = "download_require_urn"; + gnet_property->props179.desc = _("Whether gtk-gnutella should make sure the server confirms the URN of the file we're requesting when it is known locally and a traditional request by name is used (i.e. gtk-gnutella is not issuing a /uri-res/N2R? request). When set, it supersedes the optimistic first chunk setting."); + gnet_property->props179.ev_changed = event_new("download_require_urn_changed"); gnet_property->props179.save = TRUE; + gnet_property->props179.internal = FALSE; gnet_property->props179.vector_size = 1; + mutex_init(&gnet_property->props179.lock); /* Type specific data: */ gnet_property->props179.type = PROP_TYPE_BOOLEAN; - gnet_property->props179.data.boolean.def = (void *) &gnet_property_variable_online_mode_default; - gnet_property->props179.data.boolean.value = (void *) &gnet_property_variable_online_mode; + gnet_property->props179.data.boolean.def = (void *) &gnet_property_variable_download_require_urn_default; + gnet_property->props179.data.boolean.value = (void *) &gnet_property_variable_download_require_urn; /* - * PROP_DOWNLOAD_REQUIRE_URN: + * PROP_DOWNLOAD_REQUIRE_SERVER_NAME: * * General data: */ - gnet_property->props180.name = "download_require_urn"; - gnet_property->props180.desc = _("Whether gtk-gnutella should make sure the server confirms the URN of the file we're requesting when it is known locally and a traditional request by name is used (i.e. gtk-gnutella is not issuing a /uri-res/N2R? request). When set, it supersedes the optimistic first chunk setting."); - gnet_property->props180.ev_changed = event_new("download_require_urn_changed"); + gnet_property->props180.name = "download_require_server_name"; + gnet_property->props180.desc = _("Whether gtk-gnutella should make sure the server gives us back a non-empty identifying token."); + gnet_property->props180.ev_changed = event_new("download_require_server_name_changed"); gnet_property->props180.save = TRUE; + gnet_property->props180.internal = FALSE; gnet_property->props180.vector_size = 1; + mutex_init(&gnet_property->props180.lock); /* Type specific data: */ gnet_property->props180.type = PROP_TYPE_BOOLEAN; - gnet_property->props180.data.boolean.def = (void *) &gnet_property_variable_download_require_urn_default; - gnet_property->props180.data.boolean.value = (void *) &gnet_property_variable_download_require_urn; + gnet_property->props180.data.boolean.def = (void *) &gnet_property_variable_download_require_server_name_default; + gnet_property->props180.data.boolean.value = (void *) &gnet_property_variable_download_require_server_name; /* - * PROP_DOWNLOAD_REQUIRE_SERVER_NAME: + * PROP_MAX_ULTRAPEERS: * * General data: */ - gnet_property->props181.name = "download_require_server_name"; - gnet_property->props181.desc = _("Whether gtk-gnutella should make sure the server gives us back a non-empty identifying token."); - gnet_property->props181.ev_changed = event_new("download_require_server_name_changed"); + gnet_property->props181.name = "max_ultrapeers"; + gnet_property->props181.desc = _("Maximum amount of Ultrapeers we should connect to as a leaf."); + gnet_property->props181.ev_changed = event_new("max_ultrapeers_changed"); gnet_property->props181.save = TRUE; + gnet_property->props181.internal = FALSE; gnet_property->props181.vector_size = 1; + mutex_init(&gnet_property->props181.lock); /* Type specific data: */ - gnet_property->props181.type = PROP_TYPE_BOOLEAN; - gnet_property->props181.data.boolean.def = (void *) &gnet_property_variable_download_require_server_name_default; - gnet_property->props181.data.boolean.value = (void *) &gnet_property_variable_download_require_server_name; + gnet_property->props181.type = PROP_TYPE_GUINT32; + gnet_property->props181.data.guint32.def = (void *) &gnet_property_variable_max_ultrapeers_default; + gnet_property->props181.data.guint32.value = (void *) &gnet_property_variable_max_ultrapeers; + gnet_property->props181.data.guint32.choices = NULL; + gnet_property->props181.data.guint32.max = 5; + gnet_property->props181.data.guint32.min = 0; /* - * PROP_MAX_ULTRAPEERS: + * PROP_QUICK_CONNECT_POOL_SIZE: * * General data: */ - gnet_property->props182.name = "max_ultrapeers"; - gnet_property->props182.desc = _("Maximum amount of Ultrapeers we should connect to as a leaf."); - gnet_property->props182.ev_changed = event_new("max_ultrapeers_changed"); + gnet_property->props182.name = "quick_connect_pool_size"; + gnet_property->props182.desc = _("To connect more quickly, gtk-gnutella will allow up to this many connections to be active while trying to fill up the connection slots."); + gnet_property->props182.ev_changed = event_new("quick_connect_pool_size_changed"); gnet_property->props182.save = TRUE; + gnet_property->props182.internal = FALSE; gnet_property->props182.vector_size = 1; + mutex_init(&gnet_property->props182.lock); /* Type specific data: */ gnet_property->props182.type = PROP_TYPE_GUINT32; - gnet_property->props182.data.guint32.def = (void *) &gnet_property_variable_max_ultrapeers_default; - gnet_property->props182.data.guint32.value = (void *) &gnet_property_variable_max_ultrapeers; + gnet_property->props182.data.guint32.def = (void *) &gnet_property_variable_quick_connect_pool_size_default; + gnet_property->props182.data.guint32.value = (void *) &gnet_property_variable_quick_connect_pool_size; gnet_property->props182.data.guint32.choices = NULL; - gnet_property->props182.data.guint32.max = 5; - gnet_property->props182.data.guint32.min = 0; + gnet_property->props182.data.guint32.max = 80; + gnet_property->props182.data.guint32.min = 10; /* - * PROP_QUICK_CONNECT_POOL_SIZE: + * PROP_MAX_LEAVES: * * General data: */ - gnet_property->props183.name = "quick_connect_pool_size"; - gnet_property->props183.desc = _("To connect more quickly, gtk-gnutella will allow up to this many connections to be active while trying to fill up the connection slots."); - gnet_property->props183.ev_changed = event_new("quick_connect_pool_size_changed"); + gnet_property->props183.name = "max_leaves"; + gnet_property->props183.desc = _("Maximum amount of leaves we can accept. To be promoted Ultra, you should reserve 32 bytes/sec of bandwidth per leaf."); + gnet_property->props183.ev_changed = event_new("max_leaves_changed"); gnet_property->props183.save = TRUE; + gnet_property->props183.internal = FALSE; gnet_property->props183.vector_size = 1; + mutex_init(&gnet_property->props183.lock); /* Type specific data: */ gnet_property->props183.type = PROP_TYPE_GUINT32; - gnet_property->props183.data.guint32.def = (void *) &gnet_property_variable_quick_connect_pool_size_default; - gnet_property->props183.data.guint32.value = (void *) &gnet_property_variable_quick_connect_pool_size; + gnet_property->props183.data.guint32.def = (void *) &gnet_property_variable_max_leaves_default; + gnet_property->props183.data.guint32.value = (void *) &gnet_property_variable_max_leaves; gnet_property->props183.data.guint32.choices = NULL; - gnet_property->props183.data.guint32.max = 80; - gnet_property->props183.data.guint32.min = 4; + gnet_property->props183.data.guint32.max = 5000; + gnet_property->props183.data.guint32.min = 25; /* - * PROP_MAX_LEAVES: + * PROP_SEARCH_HANDLE_IGNORED_FILES: * * General data: */ - gnet_property->props184.name = "max_leaves"; - gnet_property->props184.desc = _("Maximum amount of leaves we can accept. To be promoted Ultra, you should reserve 32 bytes of bandwidth per leaf."); - gnet_property->props184.ev_changed = event_new("max_leaves_changed"); + gnet_property->props184.name = "search_handle_ignored_files"; + gnet_property->props184.desc = _("What to do with files that will be ignored for downloading."); + gnet_property->props184.ev_changed = event_new("search_handle_ignored_files_changed"); gnet_property->props184.save = TRUE; + gnet_property->props184.internal = FALSE; gnet_property->props184.vector_size = 1; + mutex_init(&gnet_property->props184.lock); /* Type specific data: */ - gnet_property->props184.type = PROP_TYPE_GUINT32; - gnet_property->props184.data.guint32.def = (void *) &gnet_property_variable_max_leaves_default; - gnet_property->props184.data.guint32.value = (void *) &gnet_property_variable_max_leaves; - gnet_property->props184.data.guint32.choices = NULL; - gnet_property->props184.data.guint32.max = 1000; - gnet_property->props184.data.guint32.min = 25; + gnet_property->props184.type = PROP_TYPE_MULTICHOICE; + gnet_property->props184.data.guint32.def = (void *) &gnet_property_variable_search_handle_ignored_files_default; + gnet_property->props184.data.guint32.value = (void *) &gnet_property_variable_search_handle_ignored_files; + gnet_property->props184.data.guint32.max = 0xFFFFFFFF; + gnet_property->props184.data.guint32.min = 0x00000000; + gnet_property->props184.data.guint32.choices = (void *) &gnet_property_variable_search_handle_ignored_files_choices; /* - * PROP_SEARCH_HANDLE_IGNORED_FILES: + * PROP_CONFIGURED_PEERMODE: * * General data: */ - gnet_property->props185.name = "search_handle_ignored_files"; - gnet_property->props185.desc = _("What to do with files that will be ignored for downloading."); - gnet_property->props185.ev_changed = event_new("search_handle_ignored_files_changed"); + gnet_property->props185.name = "configured_peermode"; + gnet_property->props185.desc = _("The peer mode you want to operate as for gtk-gnutella. When auto is selected, gtk-gnutella will start as a leaf node and may be promoted to an ultra node if bandwidth and uptime permits, provided that you are not firewalled."); + gnet_property->props185.ev_changed = event_new("configured_peermode_changed"); gnet_property->props185.save = TRUE; + gnet_property->props185.internal = FALSE; gnet_property->props185.vector_size = 1; + mutex_init(&gnet_property->props185.lock); /* Type specific data: */ gnet_property->props185.type = PROP_TYPE_MULTICHOICE; - gnet_property->props185.data.guint32.def = (void *) &gnet_property_variable_search_handle_ignored_files_default; - gnet_property->props185.data.guint32.value = (void *) &gnet_property_variable_search_handle_ignored_files; + gnet_property->props185.data.guint32.def = (void *) &gnet_property_variable_configured_peermode_default; + gnet_property->props185.data.guint32.value = (void *) &gnet_property_variable_configured_peermode; gnet_property->props185.data.guint32.max = 0xFFFFFFFF; gnet_property->props185.data.guint32.min = 0x00000000; - gnet_property->props185.data.guint32.choices = (void *) &gnet_property_variable_search_handle_ignored_files_choices; + gnet_property->props185.data.guint32.choices = (void *) &gnet_property_variable_configured_peermode_choices; /* - * PROP_CONFIGURED_PEERMODE: + * PROP_CURRENT_PEERMODE: * * General data: */ - gnet_property->props186.name = "configured_peermode"; - gnet_property->props186.desc = _("The peer mode you want to operate as for gtk-gnutella. When auto is selected, gtk-gnutella will start as a leaf node and may be promoted to an ultra node if bandwidth and uptime permits, provided that you are not firewalled."); - gnet_property->props186.ev_changed = event_new("configured_peermode_changed"); - gnet_property->props186.save = TRUE; + gnet_property->props186.name = "current_peermode"; + gnet_property->props186.desc = _("Current peer mode for gtk-gnutella."); + gnet_property->props186.ev_changed = event_new("current_peermode_changed"); + gnet_property->props186.save = FALSE; + gnet_property->props186.internal = TRUE; gnet_property->props186.vector_size = 1; + mutex_init(&gnet_property->props186.lock); /* Type specific data: */ gnet_property->props186.type = PROP_TYPE_MULTICHOICE; - gnet_property->props186.data.guint32.def = (void *) &gnet_property_variable_configured_peermode_default; - gnet_property->props186.data.guint32.value = (void *) &gnet_property_variable_configured_peermode; + gnet_property->props186.data.guint32.def = (void *) &gnet_property_variable_current_peermode_default; + gnet_property->props186.data.guint32.value = (void *) &gnet_property_variable_current_peermode; gnet_property->props186.data.guint32.max = 0xFFFFFFFF; gnet_property->props186.data.guint32.min = 0x00000000; - gnet_property->props186.data.guint32.choices = (void *) &gnet_property_variable_configured_peermode_choices; + gnet_property->props186.data.guint32.choices = (void *) &gnet_property_variable_current_peermode_choices; /* - * PROP_CURRENT_PEERMODE: + * PROP_SYS_NOFILE: * * General data: */ - gnet_property->props187.name = "current_peermode"; - gnet_property->props187.desc = _("Current peer mode for gtk-gnutella."); - gnet_property->props187.ev_changed = event_new("current_peermode_changed"); + gnet_property->props187.name = "sys_nofile"; + gnet_property->props187.desc = _("How many file descriptors this process can open."); + gnet_property->props187.ev_changed = event_new("sys_nofile_changed"); gnet_property->props187.save = FALSE; + gnet_property->props187.internal = TRUE; gnet_property->props187.vector_size = 1; + mutex_init(&gnet_property->props187.lock); /* Type specific data: */ - gnet_property->props187.type = PROP_TYPE_MULTICHOICE; - gnet_property->props187.data.guint32.def = (void *) &gnet_property_variable_current_peermode_default; - gnet_property->props187.data.guint32.value = (void *) &gnet_property_variable_current_peermode; + gnet_property->props187.type = PROP_TYPE_GUINT32; + gnet_property->props187.data.guint32.def = (void *) &gnet_property_variable_sys_nofile_default; + gnet_property->props187.data.guint32.value = (void *) &gnet_property_variable_sys_nofile; + gnet_property->props187.data.guint32.choices = NULL; gnet_property->props187.data.guint32.max = 0xFFFFFFFF; gnet_property->props187.data.guint32.min = 0x00000000; - gnet_property->props187.data.guint32.choices = (void *) &gnet_property_variable_current_peermode_choices; /* - * PROP_SYS_NOFILE: + * PROP_SYS_PHYSMEM: * * General data: */ - gnet_property->props188.name = "sys_nofile"; - gnet_property->props188.desc = _("How many file descriptors this process can open."); - gnet_property->props188.ev_changed = event_new("sys_nofile_changed"); + gnet_property->props188.name = "sys_physmem"; + gnet_property->props188.desc = _("How much physical memory is available."); + gnet_property->props188.ev_changed = event_new("sys_physmem_changed"); gnet_property->props188.save = FALSE; + gnet_property->props188.internal = TRUE; gnet_property->props188.vector_size = 1; + mutex_init(&gnet_property->props188.lock); /* Type specific data: */ - gnet_property->props188.type = PROP_TYPE_GUINT32; - gnet_property->props188.data.guint32.def = (void *) &gnet_property_variable_sys_nofile_default; - gnet_property->props188.data.guint32.value = (void *) &gnet_property_variable_sys_nofile; - gnet_property->props188.data.guint32.choices = NULL; - gnet_property->props188.data.guint32.max = 0xFFFFFFFF; - gnet_property->props188.data.guint32.min = 0x00000000; + gnet_property->props188.type = PROP_TYPE_GUINT64; + gnet_property->props188.data.guint64.def = (void *) &gnet_property_variable_sys_physmem_default; + gnet_property->props188.data.guint64.value = (void *) &gnet_property_variable_sys_physmem; + gnet_property->props188.data.guint64.choices = NULL; + gnet_property->props188.data.guint64.max = (guint64) -1; + gnet_property->props188.data.guint64.min = 0x0000000000000000; /* - * PROP_SYS_PHYSMEM: + * PROP_DL_QUEUE_COUNT: * * General data: */ - gnet_property->props189.name = "sys_physmem"; - gnet_property->props189.desc = _("How much physical memory is available."); - gnet_property->props189.ev_changed = event_new("sys_physmem_changed"); + gnet_property->props189.name = "dl_queue_count"; + gnet_property->props189.desc = _("How many downloads are currently held in the queue."); + gnet_property->props189.ev_changed = event_new("dl_queue_count_changed"); gnet_property->props189.save = FALSE; + gnet_property->props189.internal = TRUE; gnet_property->props189.vector_size = 1; + mutex_init(&gnet_property->props189.lock); /* Type specific data: */ - gnet_property->props189.type = PROP_TYPE_GUINT64; - gnet_property->props189.data.guint64.def = (void *) &gnet_property_variable_sys_physmem_default; - gnet_property->props189.data.guint64.value = (void *) &gnet_property_variable_sys_physmem; - gnet_property->props189.data.guint64.choices = NULL; - gnet_property->props189.data.guint64.max = (guint64) -1; - gnet_property->props189.data.guint64.min = 0x0000000000000000; + gnet_property->props189.type = PROP_TYPE_GUINT32; + gnet_property->props189.data.guint32.def = (void *) &gnet_property_variable_dl_queue_count_default; + gnet_property->props189.data.guint32.value = (void *) &gnet_property_variable_dl_queue_count; + gnet_property->props189.data.guint32.choices = NULL; + gnet_property->props189.data.guint32.max = 0xFFFFFFFF; + gnet_property->props189.data.guint32.min = 0x00000000; /* - * PROP_DL_QUEUE_COUNT: + * PROP_DL_RUNNING_COUNT: * * General data: */ - gnet_property->props190.name = "dl_queue_count"; - gnet_property->props190.desc = _("How many downloads are currently held in the queue."); - gnet_property->props190.ev_changed = event_new("dl_queue_count_changed"); + gnet_property->props190.name = "dl_running_count"; + gnet_property->props190.desc = _("How many downloads are currently running (downloading / connecting)."); + gnet_property->props190.ev_changed = event_new("dl_running_count_changed"); gnet_property->props190.save = FALSE; + gnet_property->props190.internal = TRUE; gnet_property->props190.vector_size = 1; + mutex_init(&gnet_property->props190.lock); /* Type specific data: */ gnet_property->props190.type = PROP_TYPE_GUINT32; - gnet_property->props190.data.guint32.def = (void *) &gnet_property_variable_dl_queue_count_default; - gnet_property->props190.data.guint32.value = (void *) &gnet_property_variable_dl_queue_count; + gnet_property->props190.data.guint32.def = (void *) &gnet_property_variable_dl_running_count_default; + gnet_property->props190.data.guint32.value = (void *) &gnet_property_variable_dl_running_count; gnet_property->props190.data.guint32.choices = NULL; gnet_property->props190.data.guint32.max = 0xFFFFFFFF; gnet_property->props190.data.guint32.min = 0x00000000; /* - * PROP_DL_RUNNING_COUNT: + * PROP_DL_ACTIVE_COUNT: * * General data: */ - gnet_property->props191.name = "dl_running_count"; - gnet_property->props191.desc = _("How many downloads are currently running (downloading / connecting)."); - gnet_property->props191.ev_changed = event_new("dl_running_count_changed"); + gnet_property->props191.name = "dl_active_count"; + gnet_property->props191.desc = _("How many downloads are currently active."); + gnet_property->props191.ev_changed = event_new("dl_active_count_changed"); gnet_property->props191.save = FALSE; + gnet_property->props191.internal = TRUE; gnet_property->props191.vector_size = 1; + mutex_init(&gnet_property->props191.lock); /* Type specific data: */ gnet_property->props191.type = PROP_TYPE_GUINT32; - gnet_property->props191.data.guint32.def = (void *) &gnet_property_variable_dl_running_count_default; - gnet_property->props191.data.guint32.value = (void *) &gnet_property_variable_dl_running_count; + gnet_property->props191.data.guint32.def = (void *) &gnet_property_variable_dl_active_count_default; + gnet_property->props191.data.guint32.value = (void *) &gnet_property_variable_dl_active_count; gnet_property->props191.data.guint32.choices = NULL; gnet_property->props191.data.guint32.max = 0xFFFFFFFF; gnet_property->props191.data.guint32.min = 0x00000000; /* - * PROP_DL_ACTIVE_COUNT: + * PROP_DL_AQUEUED_COUNT: * * General data: */ - gnet_property->props192.name = "dl_active_count"; - gnet_property->props192.desc = _("How many downloads are currently active."); - gnet_property->props192.ev_changed = event_new("dl_active_count_changed"); + gnet_property->props192.name = "dl_aqueued_count"; + gnet_property->props192.desc = _("How many downloads are currently actively queued."); + gnet_property->props192.ev_changed = event_new("dl_aqueued_count_changed"); gnet_property->props192.save = FALSE; + gnet_property->props192.internal = TRUE; gnet_property->props192.vector_size = 1; + mutex_init(&gnet_property->props192.lock); /* Type specific data: */ gnet_property->props192.type = PROP_TYPE_GUINT32; - gnet_property->props192.data.guint32.def = (void *) &gnet_property_variable_dl_active_count_default; - gnet_property->props192.data.guint32.value = (void *) &gnet_property_variable_dl_active_count; + gnet_property->props192.data.guint32.def = (void *) &gnet_property_variable_dl_aqueued_count_default; + gnet_property->props192.data.guint32.value = (void *) &gnet_property_variable_dl_aqueued_count; gnet_property->props192.data.guint32.choices = NULL; gnet_property->props192.data.guint32.max = 0xFFFFFFFF; gnet_property->props192.data.guint32.min = 0x00000000; /* - * PROP_DL_AQUEUED_COUNT: + * PROP_DL_PQUEUED_COUNT: * * General data: */ - gnet_property->props193.name = "dl_aqueued_count"; - gnet_property->props193.desc = _("How many downloads are currently actively queued."); - gnet_property->props193.ev_changed = event_new("dl_aqueued_count_changed"); + gnet_property->props193.name = "dl_pqueued_count"; + gnet_property->props193.desc = _("How many downloads are currently passively queued."); + gnet_property->props193.ev_changed = event_new("dl_pqueued_count_changed"); gnet_property->props193.save = FALSE; + gnet_property->props193.internal = TRUE; gnet_property->props193.vector_size = 1; + mutex_init(&gnet_property->props193.lock); /* Type specific data: */ gnet_property->props193.type = PROP_TYPE_GUINT32; - gnet_property->props193.data.guint32.def = (void *) &gnet_property_variable_dl_aqueued_count_default; - gnet_property->props193.data.guint32.value = (void *) &gnet_property_variable_dl_aqueued_count; + gnet_property->props193.data.guint32.def = (void *) &gnet_property_variable_dl_pqueued_count_default; + gnet_property->props193.data.guint32.value = (void *) &gnet_property_variable_dl_pqueued_count; gnet_property->props193.data.guint32.choices = NULL; gnet_property->props193.data.guint32.max = 0xFFFFFFFF; gnet_property->props193.data.guint32.min = 0x00000000; /* - * PROP_DL_PQUEUED_COUNT: + * PROP_FI_ALL_COUNT: * * General data: */ - gnet_property->props194.name = "dl_pqueued_count"; - gnet_property->props194.desc = _("How many downloads are currently passively queued."); - gnet_property->props194.ev_changed = event_new("dl_pqueued_count_changed"); + gnet_property->props194.name = "fi_all_count"; + gnet_property->props194.desc = _("How many fileinfo do we have."); + gnet_property->props194.ev_changed = event_new("fi_all_count_changed"); gnet_property->props194.save = FALSE; + gnet_property->props194.internal = TRUE; gnet_property->props194.vector_size = 1; + mutex_init(&gnet_property->props194.lock); /* Type specific data: */ gnet_property->props194.type = PROP_TYPE_GUINT32; - gnet_property->props194.data.guint32.def = (void *) &gnet_property_variable_dl_pqueued_count_default; - gnet_property->props194.data.guint32.value = (void *) &gnet_property_variable_dl_pqueued_count; + gnet_property->props194.data.guint32.def = (void *) &gnet_property_variable_fi_all_count_default; + gnet_property->props194.data.guint32.value = (void *) &gnet_property_variable_fi_all_count; gnet_property->props194.data.guint32.choices = NULL; gnet_property->props194.data.guint32.max = 0xFFFFFFFF; gnet_property->props194.data.guint32.min = 0x00000000; /* - * PROP_FI_ALL_COUNT: + * PROP_FI_WITH_SOURCE_COUNT: * * General data: */ - gnet_property->props195.name = "fi_all_count"; - gnet_property->props195.desc = _("How many fileinfo do we have."); - gnet_property->props195.ev_changed = event_new("fi_all_count_changed"); + gnet_property->props195.name = "fi_with_source_count"; + gnet_property->props195.desc = _("How many fileinfo with sources do we have."); + gnet_property->props195.ev_changed = event_new("fi_with_source_count_changed"); gnet_property->props195.save = FALSE; + gnet_property->props195.internal = TRUE; gnet_property->props195.vector_size = 1; + mutex_init(&gnet_property->props195.lock); /* Type specific data: */ gnet_property->props195.type = PROP_TYPE_GUINT32; - gnet_property->props195.data.guint32.def = (void *) &gnet_property_variable_fi_all_count_default; - gnet_property->props195.data.guint32.value = (void *) &gnet_property_variable_fi_all_count; + gnet_property->props195.data.guint32.def = (void *) &gnet_property_variable_fi_with_source_count_default; + gnet_property->props195.data.guint32.value = (void *) &gnet_property_variable_fi_with_source_count; gnet_property->props195.data.guint32.choices = NULL; gnet_property->props195.data.guint32.max = 0xFFFFFFFF; gnet_property->props195.data.guint32.min = 0x00000000; /* - * PROP_FI_WITH_SOURCE_COUNT: + * PROP_DL_QALIVE_COUNT: * * General data: */ - gnet_property->props196.name = "fi_with_source_count"; - gnet_property->props196.desc = _("How many fileinfo with sources do we have."); - gnet_property->props196.ev_changed = event_new("fi_with_source_count_changed"); + gnet_property->props196.name = "dl_qalive_count"; + gnet_property->props196.desc = _("How many queued downloads are currently responsive (remote servent answering requests)."); + gnet_property->props196.ev_changed = event_new("dl_qalive_count_changed"); gnet_property->props196.save = FALSE; + gnet_property->props196.internal = TRUE; gnet_property->props196.vector_size = 1; + mutex_init(&gnet_property->props196.lock); /* Type specific data: */ gnet_property->props196.type = PROP_TYPE_GUINT32; - gnet_property->props196.data.guint32.def = (void *) &gnet_property_variable_fi_with_source_count_default; - gnet_property->props196.data.guint32.value = (void *) &gnet_property_variable_fi_with_source_count; + gnet_property->props196.data.guint32.def = (void *) &gnet_property_variable_dl_qalive_count_default; + gnet_property->props196.data.guint32.value = (void *) &gnet_property_variable_dl_qalive_count; gnet_property->props196.data.guint32.choices = NULL; gnet_property->props196.data.guint32.max = 0xFFFFFFFF; gnet_property->props196.data.guint32.min = 0x00000000; /* - * PROP_DL_QALIVE_COUNT: + * PROP_DL_BYTE_COUNT: * * General data: */ - gnet_property->props197.name = "dl_qalive_count"; - gnet_property->props197.desc = _("How many queued downloads are currently responsive (remote servent answering requests)."); - gnet_property->props197.ev_changed = event_new("dl_qalive_count_changed"); + gnet_property->props197.name = "dl_byte_count"; + gnet_property->props197.desc = _("Amount of bytes downloaded so far, HTTP headers notwithstanding."); + gnet_property->props197.ev_changed = event_new("dl_byte_count_changed"); gnet_property->props197.save = FALSE; + gnet_property->props197.internal = TRUE; gnet_property->props197.vector_size = 1; + mutex_init(&gnet_property->props197.lock); /* Type specific data: */ - gnet_property->props197.type = PROP_TYPE_GUINT32; - gnet_property->props197.data.guint32.def = (void *) &gnet_property_variable_dl_qalive_count_default; - gnet_property->props197.data.guint32.value = (void *) &gnet_property_variable_dl_qalive_count; - gnet_property->props197.data.guint32.choices = NULL; - gnet_property->props197.data.guint32.max = 0xFFFFFFFF; - gnet_property->props197.data.guint32.min = 0x00000000; + gnet_property->props197.type = PROP_TYPE_GUINT64; + gnet_property->props197.data.guint64.def = (void *) &gnet_property_variable_dl_byte_count_default; + gnet_property->props197.data.guint64.value = (void *) &gnet_property_variable_dl_byte_count; + gnet_property->props197.data.guint64.choices = NULL; + gnet_property->props197.data.guint64.max = (guint64) -1; + gnet_property->props197.data.guint64.min = 0x0000000000000000; /* - * PROP_DL_BYTE_COUNT: + * PROP_UL_BYTE_COUNT: * * General data: */ - gnet_property->props198.name = "dl_byte_count"; - gnet_property->props198.desc = _("Amount of bytes downloaded so far, HTTP headers notwithstanding."); - gnet_property->props198.ev_changed = event_new("dl_byte_count_changed"); + gnet_property->props198.name = "ul_byte_count"; + gnet_property->props198.desc = _("Amount of bytes uploaded so far, HTTP headers notwithstanding."); + gnet_property->props198.ev_changed = event_new("ul_byte_count_changed"); gnet_property->props198.save = FALSE; + gnet_property->props198.internal = TRUE; gnet_property->props198.vector_size = 1; + mutex_init(&gnet_property->props198.lock); /* Type specific data: */ gnet_property->props198.type = PROP_TYPE_GUINT64; - gnet_property->props198.data.guint64.def = (void *) &gnet_property_variable_dl_byte_count_default; - gnet_property->props198.data.guint64.value = (void *) &gnet_property_variable_dl_byte_count; + gnet_property->props198.data.guint64.def = (void *) &gnet_property_variable_ul_byte_count_default; + gnet_property->props198.data.guint64.value = (void *) &gnet_property_variable_ul_byte_count; gnet_property->props198.data.guint64.choices = NULL; gnet_property->props198.data.guint64.max = (guint64) -1; gnet_property->props198.data.guint64.min = 0x0000000000000000; /* - * PROP_UL_BYTE_COUNT: + * PROP_PFSP_SERVER: * * General data: */ - gnet_property->props199.name = "ul_byte_count"; - gnet_property->props199.desc = _("Amount of bytes uploaded so far, HTTP headers notwithstanding."); - gnet_property->props199.ev_changed = event_new("ul_byte_count_changed"); - gnet_property->props199.save = FALSE; + gnet_property->props199.name = "pfsp_server"; + gnet_property->props199.desc = _("Whether gtk-gnutella should serve partial files whilst they are still incompletely downloaded. Recommended for network's health unless you already share many files, in which case it does no harm to leave it in, but will not matter as much."); + gnet_property->props199.ev_changed = event_new("pfsp_server_changed"); + gnet_property->props199.save = TRUE; + gnet_property->props199.internal = FALSE; gnet_property->props199.vector_size = 1; + mutex_init(&gnet_property->props199.lock); /* Type specific data: */ - gnet_property->props199.type = PROP_TYPE_GUINT64; - gnet_property->props199.data.guint64.def = (void *) &gnet_property_variable_ul_byte_count_default; - gnet_property->props199.data.guint64.value = (void *) &gnet_property_variable_ul_byte_count; - gnet_property->props199.data.guint64.choices = NULL; - gnet_property->props199.data.guint64.max = (guint64) -1; - gnet_property->props199.data.guint64.min = 0x0000000000000000; + gnet_property->props199.type = PROP_TYPE_BOOLEAN; + gnet_property->props199.data.boolean.def = (void *) &gnet_property_variable_pfsp_server_default; + gnet_property->props199.data.boolean.value = (void *) &gnet_property_variable_pfsp_server; /* - * PROP_PFSP_SERVER: + * PROP_PFSP_FIRST_CHUNK: * * General data: */ - gnet_property->props200.name = "pfsp_server"; - gnet_property->props200.desc = _("Whether gtk-gnutella should serve partial files whilst they are still incompletely downloaded. Recommended for network's health unless you already share many files, in which case it does no harm to leave it in, but will not matter as much."); - gnet_property->props200.ev_changed = event_new("pfsp_server_changed"); + gnet_property->props200.name = "pfsp_first_chunk"; + gnet_property->props200.desc = _("When partial file sharing (PFSP) is enabled, gtk-gnutella will strive to download chunks in a random order, to maximize the spreading of the file in the network. However, this makes auditing (file type, pre-viewing, etc...) of the file impossible. This field sets the size in bytes of the first chunk of data that should be continuously downloaded at the beginning of the file. Don't set it too large."); + gnet_property->props200.ev_changed = event_new("pfsp_first_chunk_changed"); gnet_property->props200.save = TRUE; + gnet_property->props200.internal = FALSE; gnet_property->props200.vector_size = 1; + mutex_init(&gnet_property->props200.lock); /* Type specific data: */ - gnet_property->props200.type = PROP_TYPE_BOOLEAN; - gnet_property->props200.data.boolean.def = (void *) &gnet_property_variable_pfsp_server_default; - gnet_property->props200.data.boolean.value = (void *) &gnet_property_variable_pfsp_server; + gnet_property->props200.type = PROP_TYPE_GUINT32; + gnet_property->props200.data.guint32.def = (void *) &gnet_property_variable_pfsp_first_chunk_default; + gnet_property->props200.data.guint32.value = (void *) &gnet_property_variable_pfsp_first_chunk; + gnet_property->props200.data.guint32.choices = NULL; + gnet_property->props200.data.guint32.max = 0xFFFFFFFF; + gnet_property->props200.data.guint32.min = 0x00000000; /* - * PROP_PFSP_FIRST_CHUNK: + * PROP_PFSP_MINIMUM_FILESIZE: * * General data: */ - gnet_property->props201.name = "pfsp_first_chunk"; - gnet_property->props201.desc = _("When partial file sharing (PFSP) is enabled, gtk-gnutella will strive to download chunks in a random order, to maximize the spreading of the file in the network. However, this makes auditing (file type, pre-viewing, etc...) of the file impossible. This field sets the size in bytes of the first chunk of data that should be continuously downloaded at the beginning of the file. Don't set it too large."); - gnet_property->props201.ev_changed = event_new("pfsp_first_chunk_changed"); + gnet_property->props201.name = "pfsp_minimum_filesize"; + gnet_property->props201.desc = _("When partial file sharing (PFSP) is enabled, gtk-gnutella will not share partial files below this filesize. Don't set it too large."); + gnet_property->props201.ev_changed = event_new("pfsp_minimum_filesize_changed"); gnet_property->props201.save = TRUE; + gnet_property->props201.internal = FALSE; gnet_property->props201.vector_size = 1; + mutex_init(&gnet_property->props201.lock); /* Type specific data: */ gnet_property->props201.type = PROP_TYPE_GUINT32; - gnet_property->props201.data.guint32.def = (void *) &gnet_property_variable_pfsp_first_chunk_default; - gnet_property->props201.data.guint32.value = (void *) &gnet_property_variable_pfsp_first_chunk; + gnet_property->props201.data.guint32.def = (void *) &gnet_property_variable_pfsp_minimum_filesize_default; + gnet_property->props201.data.guint32.value = (void *) &gnet_property_variable_pfsp_minimum_filesize; gnet_property->props201.data.guint32.choices = NULL; gnet_property->props201.data.guint32.max = 0xFFFFFFFF; gnet_property->props201.data.guint32.min = 0x00000000; /* - * PROP_PFSP_MINIMUM_FILESIZE: + * PROP_CRAWLER_VISIT_COUNT: * * General data: */ - gnet_property->props202.name = "pfsp_minimum_filesize"; - gnet_property->props202.desc = _("When partial file sharing (PFSP) is enabled, gtk-gnutella will not share partial files below this filesize. Don't set it too large."); - gnet_property->props202.ev_changed = event_new("pfsp_minimum_filesize_changed"); - gnet_property->props202.save = TRUE; + gnet_property->props202.name = "crawler_visit_count"; + gnet_property->props202.desc = _("Number of crawler visits during this session."); + gnet_property->props202.ev_changed = event_new("crawler_visit_count_changed"); + gnet_property->props202.save = FALSE; + gnet_property->props202.internal = TRUE; gnet_property->props202.vector_size = 1; + mutex_init(&gnet_property->props202.lock); /* Type specific data: */ gnet_property->props202.type = PROP_TYPE_GUINT32; - gnet_property->props202.data.guint32.def = (void *) &gnet_property_variable_pfsp_minimum_filesize_default; - gnet_property->props202.data.guint32.value = (void *) &gnet_property_variable_pfsp_minimum_filesize; + gnet_property->props202.data.guint32.def = (void *) &gnet_property_variable_crawler_visit_count_default; + gnet_property->props202.data.guint32.value = (void *) &gnet_property_variable_crawler_visit_count; gnet_property->props202.data.guint32.choices = NULL; gnet_property->props202.data.guint32.max = 0xFFFFFFFF; gnet_property->props202.data.guint32.min = 0x00000000; /* - * PROP_CRAWLER_VISIT_COUNT: + * PROP_UDP_CRAWLER_VISIT_COUNT: * * General data: */ - gnet_property->props203.name = "crawler_visit_count"; - gnet_property->props203.desc = _("Number of crawler visits during this session."); - gnet_property->props203.ev_changed = event_new("crawler_visit_count_changed"); + gnet_property->props203.name = "udp_crawler_visit_count"; + gnet_property->props203.desc = _("Number of UDP crawler visits during this session."); + gnet_property->props203.ev_changed = event_new("udp_crawler_visit_count_changed"); gnet_property->props203.save = FALSE; + gnet_property->props203.internal = TRUE; gnet_property->props203.vector_size = 1; + mutex_init(&gnet_property->props203.lock); /* Type specific data: */ gnet_property->props203.type = PROP_TYPE_GUINT32; - gnet_property->props203.data.guint32.def = (void *) &gnet_property_variable_crawler_visit_count_default; - gnet_property->props203.data.guint32.value = (void *) &gnet_property_variable_crawler_visit_count; + gnet_property->props203.data.guint32.def = (void *) &gnet_property_variable_udp_crawler_visit_count_default; + gnet_property->props203.data.guint32.value = (void *) &gnet_property_variable_udp_crawler_visit_count; gnet_property->props203.data.guint32.choices = NULL; gnet_property->props203.data.guint32.max = 0xFFFFFFFF; gnet_property->props203.data.guint32.min = 0x00000000; /* - * PROP_UDP_CRAWLER_VISIT_COUNT: + * PROP_HOST_RUNS_NTP: * * General data: */ - gnet_property->props204.name = "udp_crawler_visit_count"; - gnet_property->props204.desc = _("Number of UDP crawler visits during this session."); - gnet_property->props204.ev_changed = event_new("udp_crawler_visit_count_changed"); - gnet_property->props204.save = FALSE; + gnet_property->props204.name = "host_runs_ntp"; + gnet_property->props204.desc = _("Whether the clock of this host is kept accurate via NTP. When set, the computed clock skew is ignored. Normally, gtk-gnutella automatically determines whether you are running NTP locally, but it won't be able to determine whether your host is kept synchronized by regular calls to ntpdate, for instance."); + gnet_property->props204.ev_changed = event_new("host_runs_ntp_changed"); + gnet_property->props204.save = TRUE; + gnet_property->props204.internal = FALSE; gnet_property->props204.vector_size = 1; + mutex_init(&gnet_property->props204.lock); /* Type specific data: */ - gnet_property->props204.type = PROP_TYPE_GUINT32; - gnet_property->props204.data.guint32.def = (void *) &gnet_property_variable_udp_crawler_visit_count_default; - gnet_property->props204.data.guint32.value = (void *) &gnet_property_variable_udp_crawler_visit_count; - gnet_property->props204.data.guint32.choices = NULL; - gnet_property->props204.data.guint32.max = 0xFFFFFFFF; - gnet_property->props204.data.guint32.min = 0x00000000; + gnet_property->props204.type = PROP_TYPE_BOOLEAN; + gnet_property->props204.data.boolean.def = (void *) &gnet_property_variable_host_runs_ntp_default; + gnet_property->props204.data.boolean.value = (void *) &gnet_property_variable_host_runs_ntp; /* - * PROP_HOST_RUNS_NTP: + * PROP_NTP_DETECTED: * * General data: */ - gnet_property->props205.name = "host_runs_ntp"; - gnet_property->props205.desc = _("Whether the clock of this host is kept accurate via NTP. When set, the computed clock skew is ignored. Normally, gtk-gnutella automatically determines whether you are running NTP locally, but it won't be able to determine whether your host is kept synchronized by regular calls to ntpdate, for instance."); - gnet_property->props205.ev_changed = event_new("host_runs_ntp_changed"); - gnet_property->props205.save = TRUE; + gnet_property->props205.name = "ntp_detected"; + gnet_property->props205.desc = _("Whether a running NTP daemon was detected locally."); + gnet_property->props205.ev_changed = event_new("ntp_detected_changed"); + gnet_property->props205.save = FALSE; + gnet_property->props205.internal = FALSE; gnet_property->props205.vector_size = 1; + mutex_init(&gnet_property->props205.lock); /* Type specific data: */ gnet_property->props205.type = PROP_TYPE_BOOLEAN; - gnet_property->props205.data.boolean.def = (void *) &gnet_property_variable_host_runs_ntp_default; - gnet_property->props205.data.boolean.value = (void *) &gnet_property_variable_host_runs_ntp; + gnet_property->props205.data.boolean.def = (void *) &gnet_property_variable_ntp_detected_default; + gnet_property->props205.data.boolean.value = (void *) &gnet_property_variable_ntp_detected; /* - * PROP_NTP_DETECTED: + * PROP_CLOCK_SKEW: * * General data: */ - gnet_property->props206.name = "ntp_detected"; - gnet_property->props206.desc = _("Whether a running NTP daemon was detected locally."); - gnet_property->props206.ev_changed = event_new("ntp_detected_changed"); - gnet_property->props206.save = FALSE; + gnet_property->props206.name = "clock_skew"; + gnet_property->props206.desc = _("The signed clock skew of this host compared to absolute time. Adding this skew to the host clock should give the true time."); + gnet_property->props206.ev_changed = event_new("clock_skew_changed"); + gnet_property->props206.save = TRUE; + gnet_property->props206.internal = TRUE; gnet_property->props206.vector_size = 1; + mutex_init(&gnet_property->props206.lock); /* Type specific data: */ - gnet_property->props206.type = PROP_TYPE_BOOLEAN; - gnet_property->props206.data.boolean.def = (void *) &gnet_property_variable_ntp_detected_default; - gnet_property->props206.data.boolean.value = (void *) &gnet_property_variable_ntp_detected; + gnet_property->props206.type = PROP_TYPE_GUINT32; + gnet_property->props206.data.guint32.def = (void *) &gnet_property_variable_clock_skew_default; + gnet_property->props206.data.guint32.value = (void *) &gnet_property_variable_clock_skew; + gnet_property->props206.data.guint32.choices = NULL; + gnet_property->props206.data.guint32.max = 0xFFFFFFFF; + gnet_property->props206.data.guint32.min = 0x00000000; /* - * PROP_CLOCK_SKEW: + * PROP_NODE_MONITOR_UNSTABLE_IP: * * General data: */ - gnet_property->props207.name = "clock_skew"; - gnet_property->props207.desc = _("The signed clock skew of this host compared to absolute time. Adding this skew to the host clock should give the true time."); - gnet_property->props207.ev_changed = event_new("clock_skew_changed"); + gnet_property->props207.name = "node_monitor_unstable_ip"; + gnet_property->props207.desc = _("Whether gtk-gnutella should keep track of the IP of unstable servents it encounters, preventing further connections attempts to/from them."); + gnet_property->props207.ev_changed = event_new("node_monitor_unstable_ip_changed"); gnet_property->props207.save = TRUE; + gnet_property->props207.internal = FALSE; gnet_property->props207.vector_size = 1; + mutex_init(&gnet_property->props207.lock); /* Type specific data: */ - gnet_property->props207.type = PROP_TYPE_GUINT32; - gnet_property->props207.data.guint32.def = (void *) &gnet_property_variable_clock_skew_default; - gnet_property->props207.data.guint32.value = (void *) &gnet_property_variable_clock_skew; - gnet_property->props207.data.guint32.choices = NULL; - gnet_property->props207.data.guint32.max = 0xFFFFFFFF; - gnet_property->props207.data.guint32.min = 0x00000000; + gnet_property->props207.type = PROP_TYPE_BOOLEAN; + gnet_property->props207.data.boolean.def = (void *) &gnet_property_variable_node_monitor_unstable_ip_default; + gnet_property->props207.data.boolean.value = (void *) &gnet_property_variable_node_monitor_unstable_ip; /* - * PROP_NODE_MONITOR_UNSTABLE_IP: + * PROP_NODE_MONITOR_UNSTABLE_SERVENTS: * * General data: */ - gnet_property->props208.name = "node_monitor_unstable_ip"; - gnet_property->props208.desc = _("Whether gtk-gnutella should keep track of the IP of unstable servents it encounters, preventing further connections attempts to/from them."); - gnet_property->props208.ev_changed = event_new("node_monitor_unstable_ip_changed"); + gnet_property->props208.name = "node_monitor_unstable_servents"; + gnet_property->props208.desc = _("Whether gtk-gnutella should determine the servent types (as identified by their vendor string) that are unstable, preventing further connections to/from them. This only works when gtk-gnutella already keeps track of unstable IP addresses."); + gnet_property->props208.ev_changed = event_new("node_monitor_unstable_servents_changed"); gnet_property->props208.save = TRUE; + gnet_property->props208.internal = FALSE; gnet_property->props208.vector_size = 1; + mutex_init(&gnet_property->props208.lock); /* Type specific data: */ gnet_property->props208.type = PROP_TYPE_BOOLEAN; - gnet_property->props208.data.boolean.def = (void *) &gnet_property_variable_node_monitor_unstable_ip_default; - gnet_property->props208.data.boolean.value = (void *) &gnet_property_variable_node_monitor_unstable_ip; + gnet_property->props208.data.boolean.def = (void *) &gnet_property_variable_node_monitor_unstable_servents_default; + gnet_property->props208.data.boolean.value = (void *) &gnet_property_variable_node_monitor_unstable_servents; /* - * PROP_NODE_MONITOR_UNSTABLE_SERVENTS: + * PROP_DL_REMOVE_FILE_ON_MISMATCH: * * General data: */ - gnet_property->props209.name = "node_monitor_unstable_servents"; - gnet_property->props209.desc = _("Whether gtk-gnutella should determine the servent types (as identified by their vendor string) that are unstable, preventing further connections to/from them. This only works when gtk-gnutella already keeps track of unstable IP addresses."); - gnet_property->props209.ev_changed = event_new("node_monitor_unstable_servents_changed"); + gnet_property->props209.name = "dl_remove_file_on_mismatch"; + gnet_property->props209.desc = _("Whether gtk-gnutella should automatically remove the file whenever it gets a resuming mismatch and retry from scratch. Until Tiger Tree Hashes are widespread, this is the easiest option."); + gnet_property->props209.ev_changed = event_new("dl_remove_file_on_mismatch_changed"); gnet_property->props209.save = TRUE; + gnet_property->props209.internal = FALSE; gnet_property->props209.vector_size = 1; + mutex_init(&gnet_property->props209.lock); /* Type specific data: */ gnet_property->props209.type = PROP_TYPE_BOOLEAN; - gnet_property->props209.data.boolean.def = (void *) &gnet_property_variable_node_monitor_unstable_servents_default; - gnet_property->props209.data.boolean.value = (void *) &gnet_property_variable_node_monitor_unstable_servents; + gnet_property->props209.data.boolean.def = (void *) &gnet_property_variable_dl_remove_file_on_mismatch_default; + gnet_property->props209.data.boolean.value = (void *) &gnet_property_variable_dl_remove_file_on_mismatch; /* - * PROP_DL_REMOVE_FILE_ON_MISMATCH: + * PROP_DL_MISMATCH_BACKOUT: * * General data: */ - gnet_property->props210.name = "dl_remove_file_on_mismatch"; - gnet_property->props210.desc = _("Whether gtk-gnutella should automatically remove the file whenever it gets a resuming mismatch and retry from scratch. Until Tiger Tree Hashes are widespread, this is the easiest option."); - gnet_property->props210.ev_changed = event_new("dl_remove_file_on_mismatch_changed"); + gnet_property->props210.name = "dl_mismatch_backout"; + gnet_property->props210.desc = _("The amount of bytes which gtk-gnutella will strip off the already downloaded bytes after a resuming mismatch, in the hope that only this amount was corrupted, preventing proper resuming. Most of the time, a resuming mismatch indicates bad data on the server, but if the already downloaded data is bad then backing out some of it may allow us to recover from the problem."); + gnet_property->props210.ev_changed = event_new("dl_mismatch_backout_changed"); gnet_property->props210.save = TRUE; + gnet_property->props210.internal = FALSE; gnet_property->props210.vector_size = 1; + mutex_init(&gnet_property->props210.lock); /* Type specific data: */ - gnet_property->props210.type = PROP_TYPE_BOOLEAN; - gnet_property->props210.data.boolean.def = (void *) &gnet_property_variable_dl_remove_file_on_mismatch_default; - gnet_property->props210.data.boolean.value = (void *) &gnet_property_variable_dl_remove_file_on_mismatch; + gnet_property->props210.type = PROP_TYPE_GUINT32; + gnet_property->props210.data.guint32.def = (void *) &gnet_property_variable_dl_mismatch_backout_default; + gnet_property->props210.data.guint32.value = (void *) &gnet_property_variable_dl_mismatch_backout; + gnet_property->props210.data.guint32.choices = NULL; + gnet_property->props210.data.guint32.max = 250000; + gnet_property->props210.data.guint32.min = 0; /* - * PROP_DL_MISMATCH_BACKOUT: + * PROP_SERVER_HOSTNAME: * * General data: */ - gnet_property->props211.name = "dl_mismatch_backout"; - gnet_property->props211.desc = _("The amount of bytes which gtk-gnutella will strip off the already downloaded bytes after a resuming mismatch, in the hope that only this amount was corrupted, preventing proper resuming. Most of the time, a resuming mismatch indicates bad data on the server, but if the already downloaded data is bad then backing out some of it may allow us to recover from the problem."); - gnet_property->props211.ev_changed = event_new("dl_mismatch_backout_changed"); + gnet_property->props211.name = "server_hostname"; + gnet_property->props211.desc = _("The hostname of the server that can be used by downloaders to find the IP address via a DNS resolution. If you have a dynamic IP address coupled with a dynamic DNS service, then this is valuable to downloaders: they may find your node even after a few rotations of your IP address."); + gnet_property->props211.ev_changed = event_new("server_hostname_changed"); gnet_property->props211.save = TRUE; + gnet_property->props211.internal = FALSE; gnet_property->props211.vector_size = 1; + mutex_init(&gnet_property->props211.lock); /* Type specific data: */ - gnet_property->props211.type = PROP_TYPE_GUINT32; - gnet_property->props211.data.guint32.def = (void *) &gnet_property_variable_dl_mismatch_backout_default; - gnet_property->props211.data.guint32.value = (void *) &gnet_property_variable_dl_mismatch_backout; - gnet_property->props211.data.guint32.choices = NULL; - gnet_property->props211.data.guint32.max = 250000; - gnet_property->props211.data.guint32.min = 0; + gnet_property->props211.type = PROP_TYPE_STRING; + gnet_property->props211.data.string.def = (void *) &gnet_property_variable_server_hostname_default; + gnet_property->props211.data.string.value = (void *) &gnet_property_variable_server_hostname; + if (gnet_property->props211.data.string.def) { + *gnet_property->props211.data.string.value = + g_strdup(eval_subst(*gnet_property->props211.data.string.def)); + } /* - * PROP_SERVER_HOSTNAME: + * PROP_GIVE_SERVER_HOSTNAME: * * General data: */ - gnet_property->props212.name = "server_hostname"; - gnet_property->props212.desc = _("The hostname of the server that can be used by downloaders to find the IP address via a DNS resolution. If you have a dynamic IP address coupled with a dynamic DNS service, then this is valuable to downloaders: they may find your node even after a few rotations of your IP address."); - gnet_property->props212.ev_changed = event_new("server_hostname_changed"); + gnet_property->props212.name = "give_server_hostname"; + gnet_property->props212.desc = _("Whether gtk-gnutella should advertise the hostname of your server to downloaders and in query hits."); + gnet_property->props212.ev_changed = event_new("give_server_hostname_changed"); gnet_property->props212.save = TRUE; + gnet_property->props212.internal = FALSE; gnet_property->props212.vector_size = 1; + mutex_init(&gnet_property->props212.lock); /* Type specific data: */ - gnet_property->props212.type = PROP_TYPE_STRING; - gnet_property->props212.data.string.def = (void *) &gnet_property_variable_server_hostname_default; - gnet_property->props212.data.string.value = (void *) &gnet_property_variable_server_hostname; - if (gnet_property->props212.data.string.def) { - *gnet_property->props212.data.string.value = - g_strdup(eval_subst(*gnet_property->props212.data.string.def)); - } + gnet_property->props212.type = PROP_TYPE_BOOLEAN; + gnet_property->props212.data.boolean.def = (void *) &gnet_property_variable_give_server_hostname_default; + gnet_property->props212.data.boolean.value = (void *) &gnet_property_variable_give_server_hostname; /* - * PROP_GIVE_SERVER_HOSTNAME: + * PROP_RESERVE_GTKG_NODES: * * General data: */ - gnet_property->props213.name = "give_server_hostname"; - gnet_property->props213.desc = _("Whether gtk-gnutella should advertise the hostname of your server to downloaders and in query hits."); - gnet_property->props213.ev_changed = event_new("give_server_hostname_changed"); + gnet_property->props213.name = "reserve_gtkg_nodes"; + gnet_property->props213.desc = _("Percentage of the number of connections we should reserve for gtk-gnutella nodes."); + gnet_property->props213.ev_changed = event_new("reserve_gtkg_nodes_changed"); gnet_property->props213.save = TRUE; + gnet_property->props213.internal = FALSE; gnet_property->props213.vector_size = 1; + mutex_init(&gnet_property->props213.lock); /* Type specific data: */ - gnet_property->props213.type = PROP_TYPE_BOOLEAN; - gnet_property->props213.data.boolean.def = (void *) &gnet_property_variable_give_server_hostname_default; - gnet_property->props213.data.boolean.value = (void *) &gnet_property_variable_give_server_hostname; + gnet_property->props213.type = PROP_TYPE_GUINT32; + gnet_property->props213.data.guint32.def = (void *) &gnet_property_variable_reserve_gtkg_nodes_default; + gnet_property->props213.data.guint32.value = (void *) &gnet_property_variable_reserve_gtkg_nodes; + gnet_property->props213.data.guint32.choices = NULL; + gnet_property->props213.data.guint32.max = 90; + gnet_property->props213.data.guint32.min = 0; /* - * PROP_RESERVE_GTKG_NODES: + * PROP_UNIQUE_NODES: * * General data: */ - gnet_property->props214.name = "reserve_gtkg_nodes"; - gnet_property->props214.desc = _("Percentage of the number of connections we should reserve for gtk-gnutella nodes."); - gnet_property->props214.ev_changed = event_new("reserve_gtkg_nodes_changed"); + gnet_property->props214.name = "unique_nodes"; + gnet_property->props214.desc = _("Maximum percentage of slots a vendor can occupy."); + gnet_property->props214.ev_changed = event_new("unique_nodes_changed"); gnet_property->props214.save = TRUE; + gnet_property->props214.internal = FALSE; gnet_property->props214.vector_size = 1; + mutex_init(&gnet_property->props214.lock); /* Type specific data: */ gnet_property->props214.type = PROP_TYPE_GUINT32; - gnet_property->props214.data.guint32.def = (void *) &gnet_property_variable_reserve_gtkg_nodes_default; - gnet_property->props214.data.guint32.value = (void *) &gnet_property_variable_reserve_gtkg_nodes; + gnet_property->props214.data.guint32.def = (void *) &gnet_property_variable_unique_nodes_default; + gnet_property->props214.data.guint32.value = (void *) &gnet_property_variable_unique_nodes; gnet_property->props214.data.guint32.choices = NULL; - gnet_property->props214.data.guint32.max = 90; - gnet_property->props214.data.guint32.min = 0; + gnet_property->props214.data.guint32.max = 100; + gnet_property->props214.data.guint32.min = 10; /* - * PROP_UNIQUE_NODES: + * PROP_DOWNLOAD_RX_SIZE: * * General data: */ - gnet_property->props215.name = "unique_nodes"; - gnet_property->props215.desc = _("Maximum percentage of slots a vendor can occupy."); - gnet_property->props215.ev_changed = event_new("unique_nodes_changed"); + gnet_property->props215.name = "download_rx_size"; + gnet_property->props215.desc = _("Size of the RX socket buffer to be used for downloads, in kibibytes. If you wish to avoid Gnutella downloads using up all your bandwidth, set it to a low value (default is 64K, which is fine). If you don't mind sucking up all the available bandwidth, increasing your connection latency, set it to a greater value. Remember: the smaller the value, the more you will be able to precisely control the incoming rate."); + gnet_property->props215.ev_changed = event_new("download_rx_size_changed"); gnet_property->props215.save = TRUE; + gnet_property->props215.internal = FALSE; gnet_property->props215.vector_size = 1; + mutex_init(&gnet_property->props215.lock); /* Type specific data: */ gnet_property->props215.type = PROP_TYPE_GUINT32; - gnet_property->props215.data.guint32.def = (void *) &gnet_property_variable_unique_nodes_default; - gnet_property->props215.data.guint32.value = (void *) &gnet_property_variable_unique_nodes; + gnet_property->props215.data.guint32.def = (void *) &gnet_property_variable_download_rx_size_default; + gnet_property->props215.data.guint32.value = (void *) &gnet_property_variable_download_rx_size; gnet_property->props215.data.guint32.choices = NULL; - gnet_property->props215.data.guint32.max = 100; - gnet_property->props215.data.guint32.min = 10; + gnet_property->props215.data.guint32.max = 1024; + gnet_property->props215.data.guint32.min = 0; /* - * PROP_DOWNLOAD_RX_SIZE: + * PROP_NODE_RX_SIZE: * * General data: */ - gnet_property->props216.name = "download_rx_size"; - gnet_property->props216.desc = _("Size of the RX socket buffer to be used for downloads, in kibibytes. If you wish to avoid Gnutella downloads using up all your bandwidth, set it to a low value (default is 64K, which is fine). If you don't mind sucking up all the available bandwidth, increasing your connection latency, set it to a greater value. Remember: the smaller the value, the more you will be able to precisely control the incoming rate."); - gnet_property->props216.ev_changed = event_new("download_rx_size_changed"); + gnet_property->props216.name = "node_rx_size"; + gnet_property->props216.desc = _("Size of the RX socket buffer to be used for nodes, in kbytes. The lower the value, the faster the remote end will flow-control at the TCP/IP level if you don't read quickly enough, which would be the case if you limit the incoming bandwidth."); + gnet_property->props216.ev_changed = event_new("node_rx_size_changed"); gnet_property->props216.save = TRUE; + gnet_property->props216.internal = FALSE; gnet_property->props216.vector_size = 1; + mutex_init(&gnet_property->props216.lock); /* Type specific data: */ gnet_property->props216.type = PROP_TYPE_GUINT32; - gnet_property->props216.data.guint32.def = (void *) &gnet_property_variable_download_rx_size_default; - gnet_property->props216.data.guint32.value = (void *) &gnet_property_variable_download_rx_size; + gnet_property->props216.data.guint32.def = (void *) &gnet_property_variable_node_rx_size_default; + gnet_property->props216.data.guint32.value = (void *) &gnet_property_variable_node_rx_size; gnet_property->props216.data.guint32.choices = NULL; - gnet_property->props216.data.guint32.max = 1024; + gnet_property->props216.data.guint32.max = 128; gnet_property->props216.data.guint32.min = 0; /* - * PROP_NODE_RX_SIZE: + * PROP_UPLOAD_TX_SIZE: * * General data: */ - gnet_property->props217.name = "node_rx_size"; - gnet_property->props217.desc = _("Size of the RX socket buffer to be used for nodes, in kbytes. The lower the value, the faster the remote end will flow-control at the TCP/IP level if you don't read quickly enough, which would be the case if you limit the incoming bandwidth."); - gnet_property->props217.ev_changed = event_new("node_rx_size_changed"); + gnet_property->props217.name = "upload_tx_size"; + gnet_property->props217.desc = _("Size of the TX socket buffer to be used for uploads, in kibibytes."); + gnet_property->props217.ev_changed = event_new("upload_tx_size_changed"); gnet_property->props217.save = TRUE; + gnet_property->props217.internal = FALSE; gnet_property->props217.vector_size = 1; + mutex_init(&gnet_property->props217.lock); /* Type specific data: */ gnet_property->props217.type = PROP_TYPE_GUINT32; - gnet_property->props217.data.guint32.def = (void *) &gnet_property_variable_node_rx_size_default; - gnet_property->props217.data.guint32.value = (void *) &gnet_property_variable_node_rx_size; + gnet_property->props217.data.guint32.def = (void *) &gnet_property_variable_upload_tx_size_default; + gnet_property->props217.data.guint32.value = (void *) &gnet_property_variable_upload_tx_size; gnet_property->props217.data.guint32.choices = NULL; - gnet_property->props217.data.guint32.max = 128; + gnet_property->props217.data.guint32.max = 1024; gnet_property->props217.data.guint32.min = 0; /* - * PROP_UPLOAD_TX_SIZE: + * PROP_DL_HTTP_LATENCY: * * General data: */ - gnet_property->props218.name = "upload_tx_size"; - gnet_property->props218.desc = _("Size of the TX socket buffer to be used for uploads, in kibibytes."); - gnet_property->props218.ev_changed = event_new("upload_tx_size_changed"); - gnet_property->props218.save = TRUE; + gnet_property->props218.name = "dl_http_latency"; + gnet_property->props218.desc = _("Average recent latency between the sending of the HTTP request and the reception of the reply from the remote server, in msecs."); + gnet_property->props218.ev_changed = event_new("dl_http_latency_changed"); + gnet_property->props218.save = FALSE; + gnet_property->props218.internal = TRUE; gnet_property->props218.vector_size = 1; + mutex_init(&gnet_property->props218.lock); /* Type specific data: */ gnet_property->props218.type = PROP_TYPE_GUINT32; - gnet_property->props218.data.guint32.def = (void *) &gnet_property_variable_upload_tx_size_default; - gnet_property->props218.data.guint32.value = (void *) &gnet_property_variable_upload_tx_size; + gnet_property->props218.data.guint32.def = (void *) &gnet_property_variable_dl_http_latency_default; + gnet_property->props218.data.guint32.value = (void *) &gnet_property_variable_dl_http_latency; gnet_property->props218.data.guint32.choices = NULL; - gnet_property->props218.data.guint32.max = 1024; - gnet_property->props218.data.guint32.min = 0; + gnet_property->props218.data.guint32.max = 0xFFFFFFFF; + gnet_property->props218.data.guint32.min = 0x00000000; /* - * PROP_DL_HTTP_LATENCY: + * PROP_NODE_LAST_ULTRA_CHECK: * * General data: */ - gnet_property->props219.name = "dl_http_latency"; - gnet_property->props219.desc = _("Average recent latency between the sending of the HTTP request and the reception of the reply from the remote server, in msecs."); - gnet_property->props219.ev_changed = event_new("dl_http_latency_changed"); - gnet_property->props219.save = FALSE; + gnet_property->props219.name = "node_last_ultra_check"; + gnet_property->props219.desc = _("Last time at which we performed the ultrapeer requirement checks."); + gnet_property->props219.ev_changed = event_new("node_last_ultra_check_changed"); + gnet_property->props219.save = TRUE; + gnet_property->props219.internal = FALSE; gnet_property->props219.vector_size = 1; + mutex_init(&gnet_property->props219.lock); /* Type specific data: */ - gnet_property->props219.type = PROP_TYPE_GUINT32; - gnet_property->props219.data.guint32.def = (void *) &gnet_property_variable_dl_http_latency_default; - gnet_property->props219.data.guint32.value = (void *) &gnet_property_variable_dl_http_latency; - gnet_property->props219.data.guint32.choices = NULL; - gnet_property->props219.data.guint32.max = 0xFFFFFFFF; - gnet_property->props219.data.guint32.min = 0x00000000; + gnet_property->props219.type = PROP_TYPE_TIMESTAMP; + gnet_property->props219.data.timestamp.def = (void *) &gnet_property_variable_node_last_ultra_check_default; + gnet_property->props219.data.timestamp.value = (void *) &gnet_property_variable_node_last_ultra_check; + gnet_property->props219.data.timestamp.choices = NULL; + gnet_property->props219.data.timestamp.max = (time_t) ((1U << 31) - 1); + gnet_property->props219.data.timestamp.min = 0x0000000000000000; /* - * PROP_NODE_LAST_ULTRA_CHECK: + * PROP_NODE_LAST_ULTRA_LEAF_SWITCH: * * General data: */ - gnet_property->props220.name = "node_last_ultra_check"; - gnet_property->props220.desc = _("Last time at which we performed the ultrapeer requirement checks."); - gnet_property->props220.ev_changed = event_new("node_last_ultra_check_changed"); - gnet_property->props220.save = TRUE; + gnet_property->props220.name = "node_last_ultra_leaf_switch"; + gnet_property->props220.desc = _("Last time an automatic switch between ultra and leaf mode occurred."); + gnet_property->props220.ev_changed = event_new("node_last_ultra_leaf_switch_changed"); + gnet_property->props220.save = FALSE; + gnet_property->props220.internal = TRUE; gnet_property->props220.vector_size = 1; + mutex_init(&gnet_property->props220.lock); /* Type specific data: */ gnet_property->props220.type = PROP_TYPE_TIMESTAMP; - gnet_property->props220.data.timestamp.def = (void *) &gnet_property_variable_node_last_ultra_check_default; - gnet_property->props220.data.timestamp.value = (void *) &gnet_property_variable_node_last_ultra_check; + gnet_property->props220.data.timestamp.def = (void *) &gnet_property_variable_node_last_ultra_leaf_switch_default; + gnet_property->props220.data.timestamp.value = (void *) &gnet_property_variable_node_last_ultra_leaf_switch; gnet_property->props220.data.timestamp.choices = NULL; gnet_property->props220.data.timestamp.max = (time_t) ((1U << 31) - 1); gnet_property->props220.data.timestamp.min = 0x0000000000000000; /* - * PROP_NODE_LAST_ULTRA_LEAF_SWITCH: + * PROP_UP_REQ_AVG_SERVENT_UPTIME: * * General data: */ - gnet_property->props221.name = "node_last_ultra_leaf_switch"; - gnet_property->props221.desc = _("Last time an automatic switch between ultra and leaf mode occurred."); - gnet_property->props221.ev_changed = event_new("node_last_ultra_leaf_switch_changed"); + gnet_property->props221.name = "up_req_avg_servent_uptime"; + gnet_property->props221.desc = _("Whether we meet the sufficient average uptime requirement to become an Ultra node."); + gnet_property->props221.ev_changed = event_new("up_req_avg_servent_uptime_changed"); gnet_property->props221.save = FALSE; + gnet_property->props221.internal = TRUE; gnet_property->props221.vector_size = 1; + mutex_init(&gnet_property->props221.lock); /* Type specific data: */ - gnet_property->props221.type = PROP_TYPE_TIMESTAMP; - gnet_property->props221.data.timestamp.def = (void *) &gnet_property_variable_node_last_ultra_leaf_switch_default; - gnet_property->props221.data.timestamp.value = (void *) &gnet_property_variable_node_last_ultra_leaf_switch; - gnet_property->props221.data.timestamp.choices = NULL; - gnet_property->props221.data.timestamp.max = (time_t) ((1U << 31) - 1); - gnet_property->props221.data.timestamp.min = 0x0000000000000000; + gnet_property->props221.type = PROP_TYPE_BOOLEAN; + gnet_property->props221.data.boolean.def = (void *) &gnet_property_variable_up_req_avg_servent_uptime_default; + gnet_property->props221.data.boolean.value = (void *) &gnet_property_variable_up_req_avg_servent_uptime; /* - * PROP_UP_REQ_AVG_SERVENT_UPTIME: + * PROP_UP_REQ_AVG_IP_UPTIME: * * General data: */ - gnet_property->props222.name = "up_req_avg_servent_uptime"; - gnet_property->props222.desc = _("Whether we meet the sufficient average uptime requirement to become an Ultra node."); - gnet_property->props222.ev_changed = event_new("up_req_avg_servent_uptime_changed"); + gnet_property->props222.name = "up_req_avg_ip_uptime"; + gnet_property->props222.desc = _("Whether we meet the sufficient average IP address uptime requirement to become an Ultra node."); + gnet_property->props222.ev_changed = event_new("up_req_avg_ip_uptime_changed"); gnet_property->props222.save = FALSE; + gnet_property->props222.internal = TRUE; gnet_property->props222.vector_size = 1; + mutex_init(&gnet_property->props222.lock); /* Type specific data: */ gnet_property->props222.type = PROP_TYPE_BOOLEAN; - gnet_property->props222.data.boolean.def = (void *) &gnet_property_variable_up_req_avg_servent_uptime_default; - gnet_property->props222.data.boolean.value = (void *) &gnet_property_variable_up_req_avg_servent_uptime; + gnet_property->props222.data.boolean.def = (void *) &gnet_property_variable_up_req_avg_ip_uptime_default; + gnet_property->props222.data.boolean.value = (void *) &gnet_property_variable_up_req_avg_ip_uptime; /* - * PROP_UP_REQ_AVG_IP_UPTIME: + * PROP_UP_REQ_NODE_UPTIME: * * General data: */ - gnet_property->props223.name = "up_req_avg_ip_uptime"; - gnet_property->props223.desc = _("Whether we meet the sufficient average IP address uptime requirement to become an Ultra node."); - gnet_property->props223.ev_changed = event_new("up_req_avg_ip_uptime_changed"); + gnet_property->props223.name = "up_req_node_uptime"; + gnet_property->props223.desc = _("Whether we meet the sufficient node uptime requirement to become an Ultra node."); + gnet_property->props223.ev_changed = event_new("up_req_node_uptime_changed"); gnet_property->props223.save = FALSE; + gnet_property->props223.internal = TRUE; gnet_property->props223.vector_size = 1; + mutex_init(&gnet_property->props223.lock); /* Type specific data: */ gnet_property->props223.type = PROP_TYPE_BOOLEAN; - gnet_property->props223.data.boolean.def = (void *) &gnet_property_variable_up_req_avg_ip_uptime_default; - gnet_property->props223.data.boolean.value = (void *) &gnet_property_variable_up_req_avg_ip_uptime; + gnet_property->props223.data.boolean.def = (void *) &gnet_property_variable_up_req_node_uptime_default; + gnet_property->props223.data.boolean.value = (void *) &gnet_property_variable_up_req_node_uptime; /* - * PROP_UP_REQ_NODE_UPTIME: + * PROP_UP_REQ_NOT_FIREWALLED: * * General data: */ - gnet_property->props224.name = "up_req_node_uptime"; - gnet_property->props224.desc = _("Whether we meet the sufficient node uptime requirement to become an Ultra node."); - gnet_property->props224.ev_changed = event_new("up_req_node_uptime_changed"); + gnet_property->props224.name = "up_req_not_firewalled"; + gnet_property->props224.desc = _("Whether we meet the non-firewalled requirement to become an Ultra node."); + gnet_property->props224.ev_changed = event_new("up_req_not_firewalled_changed"); gnet_property->props224.save = FALSE; + gnet_property->props224.internal = TRUE; gnet_property->props224.vector_size = 1; + mutex_init(&gnet_property->props224.lock); /* Type specific data: */ gnet_property->props224.type = PROP_TYPE_BOOLEAN; - gnet_property->props224.data.boolean.def = (void *) &gnet_property_variable_up_req_node_uptime_default; - gnet_property->props224.data.boolean.value = (void *) &gnet_property_variable_up_req_node_uptime; + gnet_property->props224.data.boolean.def = (void *) &gnet_property_variable_up_req_not_firewalled_default; + gnet_property->props224.data.boolean.value = (void *) &gnet_property_variable_up_req_not_firewalled; /* - * PROP_UP_REQ_NOT_FIREWALLED: + * PROP_UP_REQ_ENOUGH_CONN: * * General data: */ - gnet_property->props225.name = "up_req_not_firewalled"; - gnet_property->props225.desc = _("Whether we meet the non-firewalled requirement to become an Ultra node."); - gnet_property->props225.ev_changed = event_new("up_req_not_firewalled_changed"); + gnet_property->props225.name = "up_req_enough_conn"; + gnet_property->props225.desc = _("Whether we meet the minimum amount of peer connections requirement to become an Ultra node."); + gnet_property->props225.ev_changed = event_new("up_req_enough_conn_changed"); gnet_property->props225.save = FALSE; + gnet_property->props225.internal = TRUE; gnet_property->props225.vector_size = 1; + mutex_init(&gnet_property->props225.lock); /* Type specific data: */ gnet_property->props225.type = PROP_TYPE_BOOLEAN; - gnet_property->props225.data.boolean.def = (void *) &gnet_property_variable_up_req_not_firewalled_default; - gnet_property->props225.data.boolean.value = (void *) &gnet_property_variable_up_req_not_firewalled; + gnet_property->props225.data.boolean.def = (void *) &gnet_property_variable_up_req_enough_conn_default; + gnet_property->props225.data.boolean.value = (void *) &gnet_property_variable_up_req_enough_conn; /* - * PROP_UP_REQ_ENOUGH_CONN: + * PROP_UP_REQ_ENOUGH_FD: * * General data: */ - gnet_property->props226.name = "up_req_enough_conn"; - gnet_property->props226.desc = _("Whether we meet the minimum amount of peer connections requirement to become an Ultra node."); - gnet_property->props226.ev_changed = event_new("up_req_enough_conn_changed"); + gnet_property->props226.name = "up_req_enough_fd"; + gnet_property->props226.desc = _("Whether we meet the amount of file descriptor requirement to become an Ultra node."); + gnet_property->props226.ev_changed = event_new("up_req_enough_fd_changed"); gnet_property->props226.save = FALSE; + gnet_property->props226.internal = TRUE; gnet_property->props226.vector_size = 1; + mutex_init(&gnet_property->props226.lock); /* Type specific data: */ gnet_property->props226.type = PROP_TYPE_BOOLEAN; - gnet_property->props226.data.boolean.def = (void *) &gnet_property_variable_up_req_enough_conn_default; - gnet_property->props226.data.boolean.value = (void *) &gnet_property_variable_up_req_enough_conn; + gnet_property->props226.data.boolean.def = (void *) &gnet_property_variable_up_req_enough_fd_default; + gnet_property->props226.data.boolean.value = (void *) &gnet_property_variable_up_req_enough_fd; /* - * PROP_UP_REQ_ENOUGH_FD: + * PROP_UP_REQ_ENOUGH_MEM: * * General data: */ - gnet_property->props227.name = "up_req_enough_fd"; - gnet_property->props227.desc = _("Whether we meet the amount of file descriptor requirement to become an Ultra node."); - gnet_property->props227.ev_changed = event_new("up_req_enough_fd_changed"); + gnet_property->props227.name = "up_req_enough_mem"; + gnet_property->props227.desc = _("Whether we meet the memory requirements to become an Ultra node."); + gnet_property->props227.ev_changed = event_new("up_req_enough_mem_changed"); gnet_property->props227.save = FALSE; + gnet_property->props227.internal = TRUE; gnet_property->props227.vector_size = 1; + mutex_init(&gnet_property->props227.lock); /* Type specific data: */ gnet_property->props227.type = PROP_TYPE_BOOLEAN; - gnet_property->props227.data.boolean.def = (void *) &gnet_property_variable_up_req_enough_fd_default; - gnet_property->props227.data.boolean.value = (void *) &gnet_property_variable_up_req_enough_fd; + gnet_property->props227.data.boolean.def = (void *) &gnet_property_variable_up_req_enough_mem_default; + gnet_property->props227.data.boolean.value = (void *) &gnet_property_variable_up_req_enough_mem; /* - * PROP_UP_REQ_ENOUGH_MEM: + * PROP_UP_REQ_ENOUGH_BW: * * General data: */ - gnet_property->props228.name = "up_req_enough_mem"; - gnet_property->props228.desc = _("Whether we meet the memory requirements to become an Ultra node."); - gnet_property->props228.ev_changed = event_new("up_req_enough_mem_changed"); + gnet_property->props228.name = "up_req_enough_bw"; + gnet_property->props228.desc = _("Whether we meet the bandwidth requirements to become an Ultra node."); + gnet_property->props228.ev_changed = event_new("up_req_enough_bw_changed"); gnet_property->props228.save = FALSE; + gnet_property->props228.internal = TRUE; gnet_property->props228.vector_size = 1; + mutex_init(&gnet_property->props228.lock); /* Type specific data: */ gnet_property->props228.type = PROP_TYPE_BOOLEAN; - gnet_property->props228.data.boolean.def = (void *) &gnet_property_variable_up_req_enough_mem_default; - gnet_property->props228.data.boolean.value = (void *) &gnet_property_variable_up_req_enough_mem; + gnet_property->props228.data.boolean.def = (void *) &gnet_property_variable_up_req_enough_bw_default; + gnet_property->props228.data.boolean.value = (void *) &gnet_property_variable_up_req_enough_bw; /* - * PROP_UP_REQ_ENOUGH_BW: + * PROP_UP_REQ_GOOD_UDP: * * General data: */ - gnet_property->props229.name = "up_req_enough_bw"; - gnet_property->props229.desc = _("Whether we meet the bandwidth requirements to become an Ultra node."); - gnet_property->props229.ev_changed = event_new("up_req_enough_bw_changed"); + gnet_property->props229.name = "up_req_good_udp"; + gnet_property->props229.desc = _("Whether we meet the UDP requirements to become an Ultra node."); + gnet_property->props229.ev_changed = event_new("up_req_good_udp_changed"); gnet_property->props229.save = FALSE; + gnet_property->props229.internal = TRUE; gnet_property->props229.vector_size = 1; + mutex_init(&gnet_property->props229.lock); /* Type specific data: */ gnet_property->props229.type = PROP_TYPE_BOOLEAN; - gnet_property->props229.data.boolean.def = (void *) &gnet_property_variable_up_req_enough_bw_default; - gnet_property->props229.data.boolean.value = (void *) &gnet_property_variable_up_req_enough_bw; + gnet_property->props229.data.boolean.def = (void *) &gnet_property_variable_up_req_good_udp_default; + gnet_property->props229.data.boolean.value = (void *) &gnet_property_variable_up_req_good_udp; /* - * PROP_UP_REQ_GOOD_UDP: + * PROP_SEARCH_QUEUE_SIZE: * * General data: */ - gnet_property->props230.name = "up_req_good_udp"; - gnet_property->props230.desc = _("Whether we meet the UDP requirements to become an Ultra node."); - gnet_property->props230.ev_changed = event_new("up_req_good_udp_changed"); - gnet_property->props230.save = FALSE; + gnet_property->props230.name = "search_queue_size"; + gnet_property->props230.desc = _("Size of the search queue holding the locally generated queries before they are sent on a given connection. When full, the oldest query is dropped without being sent. Set it so that it is slightly larger than the amount of opened searches."); + gnet_property->props230.ev_changed = event_new("search_queue_size_changed"); + gnet_property->props230.save = TRUE; + gnet_property->props230.internal = FALSE; gnet_property->props230.vector_size = 1; + mutex_init(&gnet_property->props230.lock); /* Type specific data: */ - gnet_property->props230.type = PROP_TYPE_BOOLEAN; - gnet_property->props230.data.boolean.def = (void *) &gnet_property_variable_up_req_good_udp_default; - gnet_property->props230.data.boolean.value = (void *) &gnet_property_variable_up_req_good_udp; + gnet_property->props230.type = PROP_TYPE_GUINT32; + gnet_property->props230.data.guint32.def = (void *) &gnet_property_variable_search_queue_size_default; + gnet_property->props230.data.guint32.value = (void *) &gnet_property_variable_search_queue_size; + gnet_property->props230.data.guint32.choices = NULL; + gnet_property->props230.data.guint32.max = 512; + gnet_property->props230.data.guint32.min = 32; /* - * PROP_SEARCH_QUEUE_SIZE: + * PROP_SEARCH_QUEUE_SPACING: * * General data: */ - gnet_property->props231.name = "search_queue_size"; - gnet_property->props231.desc = _("Size of the search queue holding the locally generated queries before they are sent on a given connection. When full, the oldest query is dropped without being sent. Set it so that it is slightly larger than the amount of opened searches."); - gnet_property->props231.ev_changed = event_new("search_queue_size_changed"); + gnet_property->props231.name = "search_queue_spacing"; + gnet_property->props231.desc = _("Minimum amount of seconds between two consecutive queries sent to a given connection (for locally generated queries only!). The larger the value, the less negative impact it has on the network."); + gnet_property->props231.ev_changed = event_new("search_queue_spacing_changed"); gnet_property->props231.save = TRUE; + gnet_property->props231.internal = FALSE; gnet_property->props231.vector_size = 1; + mutex_init(&gnet_property->props231.lock); /* Type specific data: */ gnet_property->props231.type = PROP_TYPE_GUINT32; - gnet_property->props231.data.guint32.def = (void *) &gnet_property_variable_search_queue_size_default; - gnet_property->props231.data.guint32.value = (void *) &gnet_property_variable_search_queue_size; + gnet_property->props231.data.guint32.def = (void *) &gnet_property_variable_search_queue_spacing_default; + gnet_property->props231.data.guint32.value = (void *) &gnet_property_variable_search_queue_spacing; gnet_property->props231.data.guint32.choices = NULL; - gnet_property->props231.data.guint32.max = 512; - gnet_property->props231.data.guint32.min = 32; + gnet_property->props231.data.guint32.max = 60; + gnet_property->props231.data.guint32.min = 10; /* - * PROP_SEARCH_QUEUE_SPACING: + * PROP_ENABLE_SHELL: * * General data: */ - gnet_property->props232.name = "search_queue_spacing"; - gnet_property->props232.desc = _("Minimum amount of seconds between two consecutive queries sent to a given connection (for locally generated queries only!). The larger the value, the less negative impact it has on the network."); - gnet_property->props232.ev_changed = event_new("search_queue_spacing_changed"); + gnet_property->props232.name = "enable_shell"; + gnet_property->props232.desc = _("Whether connection to gtk-gnutella via the 'shell' control interface should be allowed."); + gnet_property->props232.ev_changed = event_new("enable_shell_changed"); gnet_property->props232.save = TRUE; + gnet_property->props232.internal = FALSE; gnet_property->props232.vector_size = 1; + mutex_init(&gnet_property->props232.lock); /* Type specific data: */ - gnet_property->props232.type = PROP_TYPE_GUINT32; - gnet_property->props232.data.guint32.def = (void *) &gnet_property_variable_search_queue_spacing_default; - gnet_property->props232.data.guint32.value = (void *) &gnet_property_variable_search_queue_spacing; - gnet_property->props232.data.guint32.choices = NULL; - gnet_property->props232.data.guint32.max = 60; - gnet_property->props232.data.guint32.min = 10; + gnet_property->props232.type = PROP_TYPE_BOOLEAN; + gnet_property->props232.data.boolean.def = (void *) &gnet_property_variable_enable_shell_default; + gnet_property->props232.data.boolean.value = (void *) &gnet_property_variable_enable_shell; /* - * PROP_ENABLE_SHELL: + * PROP_REMOTE_SHELL_TIMEOUT: * * General data: */ - gnet_property->props233.name = "enable_shell"; - gnet_property->props233.desc = _("Whether connection to gtk-gnutella via the 'shell' control interface should be allowed."); - gnet_property->props233.ev_changed = event_new("enable_shell_changed"); + gnet_property->props233.name = "remote_shell_timeout"; + gnet_property->props233.desc = _("Amount of seconds until an idle remote shell session gets disconnected. If set to zero, no timeout occurs."); + gnet_property->props233.ev_changed = event_new("remote_shell_timeout_changed"); gnet_property->props233.save = TRUE; + gnet_property->props233.internal = FALSE; gnet_property->props233.vector_size = 1; + mutex_init(&gnet_property->props233.lock); /* Type specific data: */ - gnet_property->props233.type = PROP_TYPE_BOOLEAN; - gnet_property->props233.data.boolean.def = (void *) &gnet_property_variable_enable_shell_default; - gnet_property->props233.data.boolean.value = (void *) &gnet_property_variable_enable_shell; + gnet_property->props233.type = PROP_TYPE_GUINT32; + gnet_property->props233.data.guint32.def = (void *) &gnet_property_variable_remote_shell_timeout_default; + gnet_property->props233.data.guint32.value = (void *) &gnet_property_variable_remote_shell_timeout; + gnet_property->props233.data.guint32.choices = NULL; + gnet_property->props233.data.guint32.max = 31536000; + gnet_property->props233.data.guint32.min = 0; /* - * PROP_REMOTE_SHELL_TIMEOUT: + * PROP_ENTRY_REMOVAL_TIMEOUT: * * General data: */ - gnet_property->props234.name = "remote_shell_timeout"; - gnet_property->props234.desc = _("Amount of seconds until an idle remote shell session gets disconnected. If set to zero, no timeout occurs."); - gnet_property->props234.ev_changed = event_new("remote_shell_timeout_changed"); + gnet_property->props234.name = "entry_removal_timeout"; + gnet_property->props234.desc = _("Amount of seconds to leave 'dead' entries around so that they can still be displayed by the GUI along with the termination status."); + gnet_property->props234.ev_changed = event_new("entry_removal_timeout_changed"); gnet_property->props234.save = TRUE; + gnet_property->props234.internal = FALSE; gnet_property->props234.vector_size = 1; + mutex_init(&gnet_property->props234.lock); /* Type specific data: */ gnet_property->props234.type = PROP_TYPE_GUINT32; - gnet_property->props234.data.guint32.def = (void *) &gnet_property_variable_remote_shell_timeout_default; - gnet_property->props234.data.guint32.value = (void *) &gnet_property_variable_remote_shell_timeout; + gnet_property->props234.data.guint32.def = (void *) &gnet_property_variable_entry_removal_timeout_default; + gnet_property->props234.data.guint32.value = (void *) &gnet_property_variable_entry_removal_timeout; gnet_property->props234.data.guint32.choices = NULL; - gnet_property->props234.data.guint32.max = 31536000; - gnet_property->props234.data.guint32.min = 0; + gnet_property->props234.data.guint32.max = 60; + gnet_property->props234.data.guint32.min = 1; /* - * PROP_ENTRY_REMOVAL_TIMEOUT: + * PROP_NODE_WATCH_SIMILAR_QUERIES: * * General data: */ - gnet_property->props235.name = "entry_removal_timeout"; - gnet_property->props235.desc = _("Amount of seconds to leave 'dead' entries around so that they can still be displayed by the GUI along with the termination status."); - gnet_property->props235.ev_changed = event_new("entry_removal_timeout_changed"); + gnet_property->props235.name = "node_watch_similar_queries"; + gnet_property->props235.desc = _("Whether gtk-gnutella should actively monitor query strings by TTL and hop count and drop duplicates. Only applies when not running as a leaf node, and only for queries with hop count > 0, i.e. not from our immediate neighbor. Dropped queries will be accounted for in the 'Message throttle' counter."); + gnet_property->props235.ev_changed = event_new("node_watch_similar_queries_changed"); gnet_property->props235.save = TRUE; + gnet_property->props235.internal = FALSE; gnet_property->props235.vector_size = 1; + mutex_init(&gnet_property->props235.lock); /* Type specific data: */ - gnet_property->props235.type = PROP_TYPE_GUINT32; - gnet_property->props235.data.guint32.def = (void *) &gnet_property_variable_entry_removal_timeout_default; - gnet_property->props235.data.guint32.value = (void *) &gnet_property_variable_entry_removal_timeout; - gnet_property->props235.data.guint32.choices = NULL; - gnet_property->props235.data.guint32.max = 60; - gnet_property->props235.data.guint32.min = 1; + gnet_property->props235.type = PROP_TYPE_BOOLEAN; + gnet_property->props235.data.boolean.def = (void *) &gnet_property_variable_node_watch_similar_queries_default; + gnet_property->props235.data.boolean.value = (void *) &gnet_property_variable_node_watch_similar_queries; /* - * PROP_NODE_WATCH_SIMILAR_QUERIES: + * PROP_NODE_QUERIES_HALF_LIFE: * * General data: */ - gnet_property->props236.name = "node_watch_similar_queries"; - gnet_property->props236.desc = _("Whether gtk-gnutella should actively monitor query strings by TTL and hop count and drop duplicates. Only applies when not running as a leaf node, and only for queries with hop count > 0, i.e. not from our immediate neighbor. Dropped queries will be accounted for in the 'Message throttle' counter."); - gnet_property->props236.ev_changed = event_new("node_watch_similar_queries_changed"); + gnet_property->props236.name = "node_queries_half_life"; + gnet_property->props236.desc = _("Half the duration during which gtk-gnutella should remember the recently relayed queries by TTL and hop count. The default value of 5 should be just fine, but you can experiment with different settings if you want. The higher it is set, the more likely you are to drop legitimate queries, so be careful."); + gnet_property->props236.ev_changed = event_new("node_queries_half_life_changed"); gnet_property->props236.save = TRUE; + gnet_property->props236.internal = FALSE; gnet_property->props236.vector_size = 1; + mutex_init(&gnet_property->props236.lock); /* Type specific data: */ - gnet_property->props236.type = PROP_TYPE_BOOLEAN; - gnet_property->props236.data.boolean.def = (void *) &gnet_property_variable_node_watch_similar_queries_default; - gnet_property->props236.data.boolean.value = (void *) &gnet_property_variable_node_watch_similar_queries; + gnet_property->props236.type = PROP_TYPE_GUINT32; + gnet_property->props236.data.guint32.def = (void *) &gnet_property_variable_node_queries_half_life_default; + gnet_property->props236.data.guint32.value = (void *) &gnet_property_variable_node_queries_half_life; + gnet_property->props236.data.guint32.choices = NULL; + gnet_property->props236.data.guint32.max = 10; + gnet_property->props236.data.guint32.min = 1; /* - * PROP_NODE_QUERIES_HALF_LIFE: + * PROP_NODE_REQUERY_THRESHOLD: * * General data: */ - gnet_property->props237.name = "node_queries_half_life"; - gnet_property->props237.desc = _("Half the duration during which gtk-gnutella should remember the recently relayed queries by TTL and hop count. The default value of 5 should be just fine, but you can experiment with different settings if you want. The higher it is set, the more likely you are to drop legitimate queries, so be careful."); - gnet_property->props237.ev_changed = event_new("node_queries_half_life_changed"); + gnet_property->props237.name = "node_requery_threshold"; + gnet_property->props237.desc = _("The minimum amount of seconds to enforce between two identical queries from leaf nodes. If the requery too early, it is dropped and accounted for in the 'Message throttle' counter. Too frequent requeries are harmful for the network, yet we must allow some amount of requerying given the dynamic nature of Gnutella connections. You can't disable this checking, but you can lower the constraint significantly. Deviations from the default of 1700 have exponential effects on the network traffic."); + gnet_property->props237.ev_changed = event_new("node_requery_threshold_changed"); gnet_property->props237.save = TRUE; + gnet_property->props237.internal = FALSE; gnet_property->props237.vector_size = 1; + mutex_init(&gnet_property->props237.lock); /* Type specific data: */ gnet_property->props237.type = PROP_TYPE_GUINT32; - gnet_property->props237.data.guint32.def = (void *) &gnet_property_variable_node_queries_half_life_default; - gnet_property->props237.data.guint32.value = (void *) &gnet_property_variable_node_queries_half_life; + gnet_property->props237.data.guint32.def = (void *) &gnet_property_variable_node_requery_threshold_default; + gnet_property->props237.data.guint32.value = (void *) &gnet_property_variable_node_requery_threshold; gnet_property->props237.data.guint32.choices = NULL; - gnet_property->props237.data.guint32.max = 10; - gnet_property->props237.data.guint32.min = 1; + gnet_property->props237.data.guint32.max = 1800; + gnet_property->props237.data.guint32.min = 1200; /* - * PROP_NODE_REQUERY_THRESHOLD: + * PROP_LIBRARY_RESCAN_STARTED: * * General data: */ - gnet_property->props238.name = "node_requery_threshold"; - gnet_property->props238.desc = _("The minimum amount of seconds to enforce between two identical queries from leaf nodes. If the requery too early, it is dropped and accounted for in the 'Message throttle' counter. Too frequent requeries are harmful for the network, yet we must allow some amount of requerying given the dynamic nature of Gnutella connections. You can't disable this checking, but you can lower the constraint significantly. Deviations from the default of 1700 have exponential effects on the network traffic."); - gnet_property->props238.ev_changed = event_new("node_requery_threshold_changed"); - gnet_property->props238.save = TRUE; + gnet_property->props238.name = "library_rescan_started"; + gnet_property->props238.desc = _("Time at which we started the last scan of the library."); + gnet_property->props238.ev_changed = event_new("library_rescan_started_changed"); + gnet_property->props238.save = FALSE; + gnet_property->props238.internal = TRUE; gnet_property->props238.vector_size = 1; + mutex_init(&gnet_property->props238.lock); /* Type specific data: */ - gnet_property->props238.type = PROP_TYPE_GUINT32; - gnet_property->props238.data.guint32.def = (void *) &gnet_property_variable_node_requery_threshold_default; - gnet_property->props238.data.guint32.value = (void *) &gnet_property_variable_node_requery_threshold; - gnet_property->props238.data.guint32.choices = NULL; - gnet_property->props238.data.guint32.max = 1800; - gnet_property->props238.data.guint32.min = 1200; + gnet_property->props238.type = PROP_TYPE_TIMESTAMP; + gnet_property->props238.data.timestamp.def = (void *) &gnet_property_variable_library_rescan_started_default; + gnet_property->props238.data.timestamp.value = (void *) &gnet_property_variable_library_rescan_started; + gnet_property->props238.data.timestamp.choices = NULL; + gnet_property->props238.data.timestamp.max = (time_t) ((1U << 31) - 1); + gnet_property->props238.data.timestamp.min = 0x0000000000000000; /* - * PROP_LIBRARY_RESCAN_STARTED: + * PROP_LIBRARY_RESCAN_FINISHED: * * General data: */ - gnet_property->props239.name = "library_rescan_started"; - gnet_property->props239.desc = _("Time at which we started the last scan of the library."); - gnet_property->props239.ev_changed = event_new("library_rescan_started_changed"); + gnet_property->props239.name = "library_rescan_finished"; + gnet_property->props239.desc = _("Time at which the last scan of the library finished."); + gnet_property->props239.ev_changed = event_new("library_rescan_finished_changed"); gnet_property->props239.save = FALSE; + gnet_property->props239.internal = TRUE; gnet_property->props239.vector_size = 1; + mutex_init(&gnet_property->props239.lock); /* Type specific data: */ gnet_property->props239.type = PROP_TYPE_TIMESTAMP; - gnet_property->props239.data.timestamp.def = (void *) &gnet_property_variable_library_rescan_started_default; - gnet_property->props239.data.timestamp.value = (void *) &gnet_property_variable_library_rescan_started; + gnet_property->props239.data.timestamp.def = (void *) &gnet_property_variable_library_rescan_finished_default; + gnet_property->props239.data.timestamp.value = (void *) &gnet_property_variable_library_rescan_finished; gnet_property->props239.data.timestamp.choices = NULL; gnet_property->props239.data.timestamp.max = (time_t) ((1U << 31) - 1); gnet_property->props239.data.timestamp.min = 0x0000000000000000; /* - * PROP_LIBRARY_RESCAN_FINISHED: + * PROP_LIBRARY_RESCAN_DURATION: * * General data: */ - gnet_property->props240.name = "library_rescan_finished"; - gnet_property->props240.desc = _("Time at which the last scan of the library finished."); - gnet_property->props240.ev_changed = event_new("library_rescan_finished_changed"); + gnet_property->props240.name = "library_rescan_duration"; + gnet_property->props240.desc = _("The number of seconds the last scan of the library took."); + gnet_property->props240.ev_changed = event_new("library_rescan_duration_changed"); gnet_property->props240.save = FALSE; + gnet_property->props240.internal = TRUE; gnet_property->props240.vector_size = 1; + mutex_init(&gnet_property->props240.lock); /* Type specific data: */ - gnet_property->props240.type = PROP_TYPE_TIMESTAMP; - gnet_property->props240.data.timestamp.def = (void *) &gnet_property_variable_library_rescan_finished_default; - gnet_property->props240.data.timestamp.value = (void *) &gnet_property_variable_library_rescan_finished; - gnet_property->props240.data.timestamp.choices = NULL; - gnet_property->props240.data.timestamp.max = (time_t) ((1U << 31) - 1); - gnet_property->props240.data.timestamp.min = 0x0000000000000000; + gnet_property->props240.type = PROP_TYPE_GUINT32; + gnet_property->props240.data.guint32.def = (void *) &gnet_property_variable_library_rescan_duration_default; + gnet_property->props240.data.guint32.value = (void *) &gnet_property_variable_library_rescan_duration; + gnet_property->props240.data.guint32.choices = NULL; + gnet_property->props240.data.guint32.max = 0xFFFFFFFF; + gnet_property->props240.data.guint32.min = 0x00000000; /* - * PROP_LIBRARY_RESCAN_DURATION: + * PROP_QRP_INDEXING_STARTED: * * General data: */ - gnet_property->props241.name = "library_rescan_duration"; - gnet_property->props241.desc = _("The number of seconds the last scan of the library took."); - gnet_property->props241.ev_changed = event_new("library_rescan_duration_changed"); + gnet_property->props241.name = "qrp_indexing_started"; + gnet_property->props241.desc = _("Time at which we started shared file indexing."); + gnet_property->props241.ev_changed = event_new("qrp_indexing_started_changed"); gnet_property->props241.save = FALSE; + gnet_property->props241.internal = TRUE; gnet_property->props241.vector_size = 1; + mutex_init(&gnet_property->props241.lock); /* Type specific data: */ - gnet_property->props241.type = PROP_TYPE_GUINT32; - gnet_property->props241.data.guint32.def = (void *) &gnet_property_variable_library_rescan_duration_default; - gnet_property->props241.data.guint32.value = (void *) &gnet_property_variable_library_rescan_duration; - gnet_property->props241.data.guint32.choices = NULL; - gnet_property->props241.data.guint32.max = 0xFFFFFFFF; - gnet_property->props241.data.guint32.min = 0x00000000; + gnet_property->props241.type = PROP_TYPE_TIMESTAMP; + gnet_property->props241.data.timestamp.def = (void *) &gnet_property_variable_qrp_indexing_started_default; + gnet_property->props241.data.timestamp.value = (void *) &gnet_property_variable_qrp_indexing_started; + gnet_property->props241.data.timestamp.choices = NULL; + gnet_property->props241.data.timestamp.max = (time_t) ((1U << 31) - 1); + gnet_property->props241.data.timestamp.min = 0x0000000000000000; /* - * PROP_QRP_INDEXING_STARTED: + * PROP_QRP_INDEXING_DURATION: * * General data: */ - gnet_property->props242.name = "qrp_indexing_started"; - gnet_property->props242.desc = _("Time at which we started shared file indexing."); - gnet_property->props242.ev_changed = event_new("qrp_indexing_started_changed"); + gnet_property->props242.name = "qrp_indexing_duration"; + gnet_property->props242.desc = _("Time spent indexing shared files."); + gnet_property->props242.ev_changed = event_new("qrp_indexing_duration_changed"); gnet_property->props242.save = FALSE; + gnet_property->props242.internal = TRUE; gnet_property->props242.vector_size = 1; + mutex_init(&gnet_property->props242.lock); /* Type specific data: */ - gnet_property->props242.type = PROP_TYPE_TIMESTAMP; - gnet_property->props242.data.timestamp.def = (void *) &gnet_property_variable_qrp_indexing_started_default; - gnet_property->props242.data.timestamp.value = (void *) &gnet_property_variable_qrp_indexing_started; - gnet_property->props242.data.timestamp.choices = NULL; - gnet_property->props242.data.timestamp.max = (time_t) ((1U << 31) - 1); - gnet_property->props242.data.timestamp.min = 0x0000000000000000; + gnet_property->props242.type = PROP_TYPE_GUINT32; + gnet_property->props242.data.guint32.def = (void *) &gnet_property_variable_qrp_indexing_duration_default; + gnet_property->props242.data.guint32.value = (void *) &gnet_property_variable_qrp_indexing_duration; + gnet_property->props242.data.guint32.choices = NULL; + gnet_property->props242.data.guint32.max = 0xFFFFFFFF; + gnet_property->props242.data.guint32.min = 0x00000000; /* - * PROP_QRP_INDEXING_DURATION: + * PROP_QRP_MEMORY: * * General data: */ - gnet_property->props243.name = "qrp_indexing_duration"; - gnet_property->props243.desc = _("Time spent indexing shared files."); - gnet_property->props243.ev_changed = event_new("qrp_indexing_duration_changed"); + gnet_property->props243.name = "qrp_memory"; + gnet_property->props243.desc = _("Memory used by the QRP tables"); + gnet_property->props243.ev_changed = event_new("qrp_memory_changed"); gnet_property->props243.save = FALSE; + gnet_property->props243.internal = TRUE; gnet_property->props243.vector_size = 1; + mutex_init(&gnet_property->props243.lock); /* Type specific data: */ gnet_property->props243.type = PROP_TYPE_GUINT32; - gnet_property->props243.data.guint32.def = (void *) &gnet_property_variable_qrp_indexing_duration_default; - gnet_property->props243.data.guint32.value = (void *) &gnet_property_variable_qrp_indexing_duration; + gnet_property->props243.data.guint32.def = (void *) &gnet_property_variable_qrp_memory_default; + gnet_property->props243.data.guint32.value = (void *) &gnet_property_variable_qrp_memory; gnet_property->props243.data.guint32.choices = NULL; gnet_property->props243.data.guint32.max = 0xFFFFFFFF; gnet_property->props243.data.guint32.min = 0x00000000; /* - * PROP_QRP_MEMORY: + * PROP_QRP_TIMESTAMP: * * General data: */ - gnet_property->props244.name = "qrp_memory"; - gnet_property->props244.desc = _("Memory used by the QRP tables"); - gnet_property->props244.ev_changed = event_new("qrp_memory_changed"); + gnet_property->props244.name = "qrp_timestamp"; + gnet_property->props244.desc = _("Time at which we started query routing table generation."); + gnet_property->props244.ev_changed = event_new("qrp_timestamp_changed"); gnet_property->props244.save = FALSE; + gnet_property->props244.internal = TRUE; gnet_property->props244.vector_size = 1; + mutex_init(&gnet_property->props244.lock); /* Type specific data: */ - gnet_property->props244.type = PROP_TYPE_GUINT32; - gnet_property->props244.data.guint32.def = (void *) &gnet_property_variable_qrp_memory_default; - gnet_property->props244.data.guint32.value = (void *) &gnet_property_variable_qrp_memory; - gnet_property->props244.data.guint32.choices = NULL; - gnet_property->props244.data.guint32.max = 0xFFFFFFFF; - gnet_property->props244.data.guint32.min = 0x00000000; + gnet_property->props244.type = PROP_TYPE_TIMESTAMP; + gnet_property->props244.data.timestamp.def = (void *) &gnet_property_variable_qrp_timestamp_default; + gnet_property->props244.data.timestamp.value = (void *) &gnet_property_variable_qrp_timestamp; + gnet_property->props244.data.timestamp.choices = NULL; + gnet_property->props244.data.timestamp.max = (time_t) ((1U << 31) - 1); + gnet_property->props244.data.timestamp.min = 0x0000000000000000; /* - * PROP_QRP_TIMESTAMP: + * PROP_QRP_COMPUTATION_TIME: * * General data: */ - gnet_property->props245.name = "qrp_timestamp"; - gnet_property->props245.desc = _("Time at which we started query routing table generation."); - gnet_property->props245.ev_changed = event_new("qrp_timestamp_changed"); + gnet_property->props245.name = "qrp_computation_time"; + gnet_property->props245.desc = _("Time spent computing the QRP table, in seconds."); + gnet_property->props245.ev_changed = event_new("qrp_computation_time_changed"); gnet_property->props245.save = FALSE; + gnet_property->props245.internal = TRUE; gnet_property->props245.vector_size = 1; + mutex_init(&gnet_property->props245.lock); /* Type specific data: */ - gnet_property->props245.type = PROP_TYPE_TIMESTAMP; - gnet_property->props245.data.timestamp.def = (void *) &gnet_property_variable_qrp_timestamp_default; - gnet_property->props245.data.timestamp.value = (void *) &gnet_property_variable_qrp_timestamp; - gnet_property->props245.data.timestamp.choices = NULL; - gnet_property->props245.data.timestamp.max = (time_t) ((1U << 31) - 1); - gnet_property->props245.data.timestamp.min = 0x0000000000000000; + gnet_property->props245.type = PROP_TYPE_GUINT32; + gnet_property->props245.data.guint32.def = (void *) &gnet_property_variable_qrp_computation_time_default; + gnet_property->props245.data.guint32.value = (void *) &gnet_property_variable_qrp_computation_time; + gnet_property->props245.data.guint32.choices = NULL; + gnet_property->props245.data.guint32.max = 0xFFFFFFFF; + gnet_property->props245.data.guint32.min = 0x00000000; /* - * PROP_QRP_COMPUTATION_TIME: + * PROP_QRP_PATCH_TIMESTAMP: * * General data: */ - gnet_property->props246.name = "qrp_computation_time"; - gnet_property->props246.desc = _("Time spent computing the QRP table, in seconds."); - gnet_property->props246.ev_changed = event_new("qrp_computation_time_changed"); + gnet_property->props246.name = "qrp_patch_timestamp"; + gnet_property->props246.desc = _("Time at which we started computing our QRP patch."); + gnet_property->props246.ev_changed = event_new("qrp_patch_timestamp_changed"); gnet_property->props246.save = FALSE; + gnet_property->props246.internal = TRUE; gnet_property->props246.vector_size = 1; + mutex_init(&gnet_property->props246.lock); /* Type specific data: */ - gnet_property->props246.type = PROP_TYPE_GUINT32; - gnet_property->props246.data.guint32.def = (void *) &gnet_property_variable_qrp_computation_time_default; - gnet_property->props246.data.guint32.value = (void *) &gnet_property_variable_qrp_computation_time; - gnet_property->props246.data.guint32.choices = NULL; - gnet_property->props246.data.guint32.max = 0xFFFFFFFF; - gnet_property->props246.data.guint32.min = 0x00000000; + gnet_property->props246.type = PROP_TYPE_TIMESTAMP; + gnet_property->props246.data.timestamp.def = (void *) &gnet_property_variable_qrp_patch_timestamp_default; + gnet_property->props246.data.timestamp.value = (void *) &gnet_property_variable_qrp_patch_timestamp; + gnet_property->props246.data.timestamp.choices = NULL; + gnet_property->props246.data.timestamp.max = (time_t) ((1U << 31) - 1); + gnet_property->props246.data.timestamp.min = 0x0000000000000000; /* - * PROP_QRP_PATCH_TIMESTAMP: + * PROP_QRP_PATCH_COMPUTATION_TIME: * * General data: */ - gnet_property->props247.name = "qrp_patch_timestamp"; - gnet_property->props247.desc = _("Time at which we started computing our QRP patch."); - gnet_property->props247.ev_changed = event_new("qrp_patch_timestamp_changed"); + gnet_property->props247.name = "qrp_patch_computation_time"; + gnet_property->props247.desc = _("Time spent computing the QRP table patch, in seconds."); + gnet_property->props247.ev_changed = event_new("qrp_patch_computation_time_changed"); gnet_property->props247.save = FALSE; + gnet_property->props247.internal = TRUE; gnet_property->props247.vector_size = 1; + mutex_init(&gnet_property->props247.lock); /* Type specific data: */ - gnet_property->props247.type = PROP_TYPE_TIMESTAMP; - gnet_property->props247.data.timestamp.def = (void *) &gnet_property_variable_qrp_patch_timestamp_default; - gnet_property->props247.data.timestamp.value = (void *) &gnet_property_variable_qrp_patch_timestamp; - gnet_property->props247.data.timestamp.choices = NULL; - gnet_property->props247.data.timestamp.max = (time_t) ((1U << 31) - 1); - gnet_property->props247.data.timestamp.min = 0x0000000000000000; + gnet_property->props247.type = PROP_TYPE_GUINT32; + gnet_property->props247.data.guint32.def = (void *) &gnet_property_variable_qrp_patch_computation_time_default; + gnet_property->props247.data.guint32.value = (void *) &gnet_property_variable_qrp_patch_computation_time; + gnet_property->props247.data.guint32.choices = NULL; + gnet_property->props247.data.guint32.max = 0xFFFFFFFF; + gnet_property->props247.data.guint32.min = 0x00000000; /* - * PROP_QRP_PATCH_COMPUTATION_TIME: + * PROP_QRP_GENERATION: * * General data: */ - gnet_property->props248.name = "qrp_patch_computation_time"; - gnet_property->props248.desc = _("Time spent computing the QRP table patch, in seconds."); - gnet_property->props248.ev_changed = event_new("qrp_patch_computation_time_changed"); + gnet_property->props248.name = "qrp_generation"; + gnet_property->props248.desc = _("Query routing table generation number."); + gnet_property->props248.ev_changed = event_new("qrp_generation_changed"); gnet_property->props248.save = FALSE; + gnet_property->props248.internal = TRUE; gnet_property->props248.vector_size = 1; + mutex_init(&gnet_property->props248.lock); /* Type specific data: */ gnet_property->props248.type = PROP_TYPE_GUINT32; - gnet_property->props248.data.guint32.def = (void *) &gnet_property_variable_qrp_patch_computation_time_default; - gnet_property->props248.data.guint32.value = (void *) &gnet_property_variable_qrp_patch_computation_time; + gnet_property->props248.data.guint32.def = (void *) &gnet_property_variable_qrp_generation_default; + gnet_property->props248.data.guint32.value = (void *) &gnet_property_variable_qrp_generation; gnet_property->props248.data.guint32.choices = NULL; gnet_property->props248.data.guint32.max = 0xFFFFFFFF; gnet_property->props248.data.guint32.min = 0x00000000; /* - * PROP_QRP_GENERATION: + * PROP_QRP_SLOTS: * * General data: */ - gnet_property->props249.name = "qrp_generation"; - gnet_property->props249.desc = _("Query routing table generation number."); - gnet_property->props249.ev_changed = event_new("qrp_generation_changed"); + gnet_property->props249.name = "qrp_slots"; + gnet_property->props249.desc = _("Amount of slots used by our QRP table."); + gnet_property->props249.ev_changed = event_new("qrp_slots_changed"); gnet_property->props249.save = FALSE; + gnet_property->props249.internal = TRUE; gnet_property->props249.vector_size = 1; + mutex_init(&gnet_property->props249.lock); /* Type specific data: */ gnet_property->props249.type = PROP_TYPE_GUINT32; - gnet_property->props249.data.guint32.def = (void *) &gnet_property_variable_qrp_generation_default; - gnet_property->props249.data.guint32.value = (void *) &gnet_property_variable_qrp_generation; + gnet_property->props249.data.guint32.def = (void *) &gnet_property_variable_qrp_slots_default; + gnet_property->props249.data.guint32.value = (void *) &gnet_property_variable_qrp_slots; gnet_property->props249.data.guint32.choices = NULL; gnet_property->props249.data.guint32.max = 0xFFFFFFFF; gnet_property->props249.data.guint32.min = 0x00000000; /* - * PROP_QRP_SLOTS: + * PROP_QRP_SLOTS_FILLED: * * General data: */ - gnet_property->props250.name = "qrp_slots"; - gnet_property->props250.desc = _("Amount of slots used by our QRP table."); - gnet_property->props250.ev_changed = event_new("qrp_slots_changed"); + gnet_property->props250.name = "qrp_slots_filled"; + gnet_property->props250.desc = _("Amount of slots filled within our QRP table."); + gnet_property->props250.ev_changed = event_new("qrp_slots_filled_changed"); gnet_property->props250.save = FALSE; + gnet_property->props250.internal = TRUE; gnet_property->props250.vector_size = 1; + mutex_init(&gnet_property->props250.lock); /* Type specific data: */ gnet_property->props250.type = PROP_TYPE_GUINT32; - gnet_property->props250.data.guint32.def = (void *) &gnet_property_variable_qrp_slots_default; - gnet_property->props250.data.guint32.value = (void *) &gnet_property_variable_qrp_slots; + gnet_property->props250.data.guint32.def = (void *) &gnet_property_variable_qrp_slots_filled_default; + gnet_property->props250.data.guint32.value = (void *) &gnet_property_variable_qrp_slots_filled; gnet_property->props250.data.guint32.choices = NULL; gnet_property->props250.data.guint32.max = 0xFFFFFFFF; gnet_property->props250.data.guint32.min = 0x00000000; /* - * PROP_QRP_SLOTS_FILLED: + * PROP_QRP_FILL_RATIO: * * General data: */ - gnet_property->props251.name = "qrp_slots_filled"; - gnet_property->props251.desc = _("Amount of slots filled within our QRP table."); - gnet_property->props251.ev_changed = event_new("qrp_slots_filled_changed"); + gnet_property->props251.name = "qrp_fill_ratio"; + gnet_property->props251.desc = _("Percentage of slots filled within our QRP table."); + gnet_property->props251.ev_changed = event_new("qrp_fill_ratio_changed"); gnet_property->props251.save = FALSE; + gnet_property->props251.internal = TRUE; gnet_property->props251.vector_size = 1; + mutex_init(&gnet_property->props251.lock); /* Type specific data: */ gnet_property->props251.type = PROP_TYPE_GUINT32; - gnet_property->props251.data.guint32.def = (void *) &gnet_property_variable_qrp_slots_filled_default; - gnet_property->props251.data.guint32.value = (void *) &gnet_property_variable_qrp_slots_filled; + gnet_property->props251.data.guint32.def = (void *) &gnet_property_variable_qrp_fill_ratio_default; + gnet_property->props251.data.guint32.value = (void *) &gnet_property_variable_qrp_fill_ratio; gnet_property->props251.data.guint32.choices = NULL; gnet_property->props251.data.guint32.max = 0xFFFFFFFF; gnet_property->props251.data.guint32.min = 0x00000000; /* - * PROP_QRP_FILL_RATIO: + * PROP_QRP_CONFLICT_RATIO: * * General data: */ - gnet_property->props252.name = "qrp_fill_ratio"; - gnet_property->props252.desc = _("Percentage of slots filled within our QRP table."); - gnet_property->props252.ev_changed = event_new("qrp_fill_ratio_changed"); + gnet_property->props252.name = "qrp_conflict_ratio"; + gnet_property->props252.desc = _("Percentage of hashing conflicts whilst inserting data in our QRP table."); + gnet_property->props252.ev_changed = event_new("qrp_conflict_ratio_changed"); gnet_property->props252.save = FALSE; + gnet_property->props252.internal = TRUE; gnet_property->props252.vector_size = 1; + mutex_init(&gnet_property->props252.lock); /* Type specific data: */ gnet_property->props252.type = PROP_TYPE_GUINT32; - gnet_property->props252.data.guint32.def = (void *) &gnet_property_variable_qrp_fill_ratio_default; - gnet_property->props252.data.guint32.value = (void *) &gnet_property_variable_qrp_fill_ratio; + gnet_property->props252.data.guint32.def = (void *) &gnet_property_variable_qrp_conflict_ratio_default; + gnet_property->props252.data.guint32.value = (void *) &gnet_property_variable_qrp_conflict_ratio; gnet_property->props252.data.guint32.choices = NULL; gnet_property->props252.data.guint32.max = 0xFFFFFFFF; gnet_property->props252.data.guint32.min = 0x00000000; /* - * PROP_QRP_CONFLICT_RATIO: + * PROP_QRP_HASHED_KEYWORDS: * * General data: */ - gnet_property->props253.name = "qrp_conflict_ratio"; - gnet_property->props253.desc = _("Percentage of hashing conflicts whilst inserting data in our QRP table."); - gnet_property->props253.ev_changed = event_new("qrp_conflict_ratio_changed"); + gnet_property->props253.name = "qrp_hashed_keywords"; + gnet_property->props253.desc = _("Amount of hashed keywords in our QRP table."); + gnet_property->props253.ev_changed = event_new("qrp_hashed_keywords_changed"); gnet_property->props253.save = FALSE; + gnet_property->props253.internal = TRUE; gnet_property->props253.vector_size = 1; + mutex_init(&gnet_property->props253.lock); /* Type specific data: */ gnet_property->props253.type = PROP_TYPE_GUINT32; - gnet_property->props253.data.guint32.def = (void *) &gnet_property_variable_qrp_conflict_ratio_default; - gnet_property->props253.data.guint32.value = (void *) &gnet_property_variable_qrp_conflict_ratio; + gnet_property->props253.data.guint32.def = (void *) &gnet_property_variable_qrp_hashed_keywords_default; + gnet_property->props253.data.guint32.value = (void *) &gnet_property_variable_qrp_hashed_keywords; gnet_property->props253.data.guint32.choices = NULL; gnet_property->props253.data.guint32.max = 0xFFFFFFFF; gnet_property->props253.data.guint32.min = 0x00000000; /* - * PROP_QRP_HASHED_KEYWORDS: + * PROP_QRP_PATCH_RAW_LENGTH: * * General data: */ - gnet_property->props254.name = "qrp_hashed_keywords"; - gnet_property->props254.desc = _("Amount of hashed keywords in our QRP table."); - gnet_property->props254.ev_changed = event_new("qrp_hashed_keywords_changed"); + gnet_property->props254.name = "qrp_patch_raw_length"; + gnet_property->props254.desc = _("Total raw size of the QRP table patch, in bytes."); + gnet_property->props254.ev_changed = event_new("qrp_patch_raw_length_changed"); gnet_property->props254.save = FALSE; + gnet_property->props254.internal = TRUE; gnet_property->props254.vector_size = 1; + mutex_init(&gnet_property->props254.lock); /* Type specific data: */ gnet_property->props254.type = PROP_TYPE_GUINT32; - gnet_property->props254.data.guint32.def = (void *) &gnet_property_variable_qrp_hashed_keywords_default; - gnet_property->props254.data.guint32.value = (void *) &gnet_property_variable_qrp_hashed_keywords; + gnet_property->props254.data.guint32.def = (void *) &gnet_property_variable_qrp_patch_raw_length_default; + gnet_property->props254.data.guint32.value = (void *) &gnet_property_variable_qrp_patch_raw_length; gnet_property->props254.data.guint32.choices = NULL; gnet_property->props254.data.guint32.max = 0xFFFFFFFF; gnet_property->props254.data.guint32.min = 0x00000000; /* - * PROP_QRP_PATCH_RAW_LENGTH: + * PROP_QRP_PATCH_LENGTH: * * General data: */ - gnet_property->props255.name = "qrp_patch_raw_length"; - gnet_property->props255.desc = _("Total raw size of the QRP table patch, in bytes."); - gnet_property->props255.ev_changed = event_new("qrp_patch_raw_length_changed"); + gnet_property->props255.name = "qrp_patch_length"; + gnet_property->props255.desc = _("Final QRP table patch length, after possible compression."); + gnet_property->props255.ev_changed = event_new("qrp_patch_length_changed"); gnet_property->props255.save = FALSE; + gnet_property->props255.internal = TRUE; gnet_property->props255.vector_size = 1; + mutex_init(&gnet_property->props255.lock); /* Type specific data: */ gnet_property->props255.type = PROP_TYPE_GUINT32; - gnet_property->props255.data.guint32.def = (void *) &gnet_property_variable_qrp_patch_raw_length_default; - gnet_property->props255.data.guint32.value = (void *) &gnet_property_variable_qrp_patch_raw_length; + gnet_property->props255.data.guint32.def = (void *) &gnet_property_variable_qrp_patch_length_default; + gnet_property->props255.data.guint32.value = (void *) &gnet_property_variable_qrp_patch_length; gnet_property->props255.data.guint32.choices = NULL; gnet_property->props255.data.guint32.max = 0xFFFFFFFF; gnet_property->props255.data.guint32.min = 0x00000000; /* - * PROP_QRP_PATCH_LENGTH: + * PROP_QRP_PATCH_COMP_RATIO: * * General data: */ - gnet_property->props256.name = "qrp_patch_length"; - gnet_property->props256.desc = _("Final QRP table patch length, after possible compression."); - gnet_property->props256.ev_changed = event_new("qrp_patch_length_changed"); + gnet_property->props256.name = "qrp_patch_comp_ratio"; + gnet_property->props256.desc = _("QRP table patch compression ratio, in percent, 0 means none."); + gnet_property->props256.ev_changed = event_new("qrp_patch_comp_ratio_changed"); gnet_property->props256.save = FALSE; + gnet_property->props256.internal = TRUE; gnet_property->props256.vector_size = 1; + mutex_init(&gnet_property->props256.lock); /* Type specific data: */ gnet_property->props256.type = PROP_TYPE_GUINT32; - gnet_property->props256.data.guint32.def = (void *) &gnet_property_variable_qrp_patch_length_default; - gnet_property->props256.data.guint32.value = (void *) &gnet_property_variable_qrp_patch_length; + gnet_property->props256.data.guint32.def = (void *) &gnet_property_variable_qrp_patch_comp_ratio_default; + gnet_property->props256.data.guint32.value = (void *) &gnet_property_variable_qrp_patch_comp_ratio; gnet_property->props256.data.guint32.choices = NULL; gnet_property->props256.data.guint32.max = 0xFFFFFFFF; gnet_property->props256.data.guint32.min = 0x00000000; /* - * PROP_QRP_PATCH_COMP_RATIO: + * PROP_ANCIENT_VERSION_LEFT_DAYS: * * General data: */ - gnet_property->props257.name = "qrp_patch_comp_ratio"; - gnet_property->props257.desc = _("QRP table patch compression ratio, in percent, 0 means none."); - gnet_property->props257.ev_changed = event_new("qrp_patch_comp_ratio_changed"); + gnet_property->props257.name = "ancient_version_left_days"; + gnet_property->props257.desc = _("Indicates that gtk-gnutella will expire in that many days."); + gnet_property->props257.ev_changed = event_new("ancient_version_left_days_changed"); gnet_property->props257.save = FALSE; + gnet_property->props257.internal = FALSE; gnet_property->props257.vector_size = 1; + mutex_init(&gnet_property->props257.lock); /* Type specific data: */ gnet_property->props257.type = PROP_TYPE_GUINT32; - gnet_property->props257.data.guint32.def = (void *) &gnet_property_variable_qrp_patch_comp_ratio_default; - gnet_property->props257.data.guint32.value = (void *) &gnet_property_variable_qrp_patch_comp_ratio; + gnet_property->props257.data.guint32.def = (void *) &gnet_property_variable_ancient_version_left_days_default; + gnet_property->props257.data.guint32.value = (void *) &gnet_property_variable_ancient_version_left_days; gnet_property->props257.data.guint32.choices = NULL; gnet_property->props257.data.guint32.max = 0xFFFFFFFF; gnet_property->props257.data.guint32.min = 0x00000000; /* - * PROP_ANCIENT_VERSION_LEFT_DAYS: + * PROP_FILE_DESCRIPTOR_SHORTAGE: * * General data: */ - gnet_property->props258.name = "ancient_version_left_days"; - gnet_property->props258.desc = _("Indicates that gtk-gnutella will expire in that many days."); - gnet_property->props258.ev_changed = event_new("ancient_version_left_days_changed"); + gnet_property->props258.name = "file_descriptor_shortage"; + gnet_property->props258.desc = _("When set, gtk-gnutella is running short on file descriptors, but normal operations are still possible. The condition automatically clears itself after 10 minutes without any more shortage."); + gnet_property->props258.ev_changed = event_new("file_descriptor_shortage_changed"); gnet_property->props258.save = FALSE; + gnet_property->props258.internal = TRUE; gnet_property->props258.vector_size = 1; + mutex_init(&gnet_property->props258.lock); /* Type specific data: */ - gnet_property->props258.type = PROP_TYPE_GUINT32; - gnet_property->props258.data.guint32.def = (void *) &gnet_property_variable_ancient_version_left_days_default; - gnet_property->props258.data.guint32.value = (void *) &gnet_property_variable_ancient_version_left_days; - gnet_property->props258.data.guint32.choices = NULL; - gnet_property->props258.data.guint32.max = 0xFFFFFFFF; - gnet_property->props258.data.guint32.min = 0x00000000; + gnet_property->props258.type = PROP_TYPE_BOOLEAN; + gnet_property->props258.data.boolean.def = (void *) &gnet_property_variable_file_descriptor_shortage_default; + gnet_property->props258.data.boolean.value = (void *) &gnet_property_variable_file_descriptor_shortage; /* - * PROP_FILE_DESCRIPTOR_SHORTAGE: + * PROP_FILE_DESCRIPTOR_RUNOUT: * * General data: */ - gnet_property->props259.name = "file_descriptor_shortage"; - gnet_property->props259.desc = _("When set, gtk-gnutella is running short on file descriptors, but normal operations are still possible. The condition automatically clears itself after 10 minutes without any more shortage."); - gnet_property->props259.ev_changed = event_new("file_descriptor_shortage_changed"); + gnet_property->props259.name = "file_descriptor_runout"; + gnet_property->props259.desc = _("When set, gtk-gnutella has run out of file descriptors, and operations are necessarily degraded, if not impossible. The condition automatically clears itself after 10 minutes past the last occurrence."); + gnet_property->props259.ev_changed = event_new("file_descriptor_runout_changed"); gnet_property->props259.save = FALSE; + gnet_property->props259.internal = TRUE; gnet_property->props259.vector_size = 1; + mutex_init(&gnet_property->props259.lock); /* Type specific data: */ gnet_property->props259.type = PROP_TYPE_BOOLEAN; - gnet_property->props259.data.boolean.def = (void *) &gnet_property_variable_file_descriptor_shortage_default; - gnet_property->props259.data.boolean.value = (void *) &gnet_property_variable_file_descriptor_shortage; + gnet_property->props259.data.boolean.def = (void *) &gnet_property_variable_file_descriptor_runout_default; + gnet_property->props259.data.boolean.value = (void *) &gnet_property_variable_file_descriptor_runout; /* - * PROP_FILE_DESCRIPTOR_RUNOUT: + * PROP_CONVERT_SPACES: * * General data: */ - gnet_property->props260.name = "file_descriptor_runout"; - gnet_property->props260.desc = _("When set, gtk-gnutella has run out of file descriptors, and operations are necessarily degraded, if not impossible. The condition automatically clears itself after 10 minutes past the last occurrence."); - gnet_property->props260.ev_changed = event_new("file_descriptor_runout_changed"); - gnet_property->props260.save = FALSE; + gnet_property->props260.name = "convert_spaces"; + gnet_property->props260.desc = _("If set, spaces in filenames are replaced with underscores."); + gnet_property->props260.ev_changed = event_new("convert_spaces_changed"); + gnet_property->props260.save = TRUE; + gnet_property->props260.internal = FALSE; gnet_property->props260.vector_size = 1; + mutex_init(&gnet_property->props260.lock); /* Type specific data: */ gnet_property->props260.type = PROP_TYPE_BOOLEAN; - gnet_property->props260.data.boolean.def = (void *) &gnet_property_variable_file_descriptor_runout_default; - gnet_property->props260.data.boolean.value = (void *) &gnet_property_variable_file_descriptor_runout; + gnet_property->props260.data.boolean.def = (void *) &gnet_property_variable_convert_spaces_default; + gnet_property->props260.data.boolean.value = (void *) &gnet_property_variable_convert_spaces; /* - * PROP_CONVERT_SPACES: + * PROP_CONVERT_EVIL_CHARS: * * General data: */ - gnet_property->props261.name = "convert_spaces"; - gnet_property->props261.desc = _("If set, spaces in filenames are replaced with underscores."); - gnet_property->props261.ev_changed = event_new("convert_spaces_changed"); + gnet_property->props261.name = "convert_evil_chars"; + gnet_property->props261.desc = _("If set, meta shell characters in filenames are replaced with underscores. (This must also be enabled for FAT partitions.)"); + gnet_property->props261.ev_changed = event_new("convert_evil_chars_changed"); gnet_property->props261.save = TRUE; + gnet_property->props261.internal = FALSE; gnet_property->props261.vector_size = 1; + mutex_init(&gnet_property->props261.lock); /* Type specific data: */ gnet_property->props261.type = PROP_TYPE_BOOLEAN; - gnet_property->props261.data.boolean.def = (void *) &gnet_property_variable_convert_spaces_default; - gnet_property->props261.data.boolean.value = (void *) &gnet_property_variable_convert_spaces; + gnet_property->props261.data.boolean.def = (void *) &gnet_property_variable_convert_evil_chars_default; + gnet_property->props261.data.boolean.value = (void *) &gnet_property_variable_convert_evil_chars; /* - * PROP_CONVERT_EVIL_CHARS: + * PROP_CONVERT_OLD_FILENAMES: * * General data: */ - gnet_property->props262.name = "convert_evil_chars"; - gnet_property->props262.desc = _("If set, meta shell characters in filenames are replaced with underscores. (This must also be enabled for FAT partitions.)"); - gnet_property->props262.ev_changed = event_new("convert_evil_chars_changed"); + gnet_property->props262.name = "convert_old_filenames"; + gnet_property->props262.desc = _("If set, gtk-gnutella will, upon startup, sanitize filenames by converting spaces and/or evil characters in them, according to your settings, on existing filenames in your temporary downloading directory. By default, the above settings apply only on newly created entries, not existing ones."); + gnet_property->props262.ev_changed = event_new("convert_old_filenames_changed"); gnet_property->props262.save = TRUE; + gnet_property->props262.internal = FALSE; gnet_property->props262.vector_size = 1; + mutex_init(&gnet_property->props262.lock); /* Type specific data: */ gnet_property->props262.type = PROP_TYPE_BOOLEAN; - gnet_property->props262.data.boolean.def = (void *) &gnet_property_variable_convert_evil_chars_default; - gnet_property->props262.data.boolean.value = (void *) &gnet_property_variable_convert_evil_chars; + gnet_property->props262.data.boolean.def = (void *) &gnet_property_variable_convert_old_filenames_default; + gnet_property->props262.data.boolean.value = (void *) &gnet_property_variable_convert_old_filenames; /* - * PROP_CONVERT_OLD_FILENAMES: + * PROP_TLS_ENFORCE: * * General data: */ - gnet_property->props263.name = "convert_old_filenames"; - gnet_property->props263.desc = _("If set, gtk-gnutella will, upon startup, sanitize filenames by converting spaces and/or evil characters in them, according to your settings, on existing filenames in your temporary downloading directory. By default, the above settings apply only on newly created entries, not existing ones."); - gnet_property->props263.ev_changed = event_new("convert_old_filenames_changed"); + gnet_property->props263.name = "tls_enforce"; + gnet_property->props263.desc = _("If set, all outgoing connections are tunneled over TLS."); + gnet_property->props263.ev_changed = event_new("tls_enforce_changed"); gnet_property->props263.save = TRUE; + gnet_property->props263.internal = FALSE; gnet_property->props263.vector_size = 1; + mutex_init(&gnet_property->props263.lock); /* Type specific data: */ gnet_property->props263.type = PROP_TYPE_BOOLEAN; - gnet_property->props263.data.boolean.def = (void *) &gnet_property_variable_convert_old_filenames_default; - gnet_property->props263.data.boolean.value = (void *) &gnet_property_variable_convert_old_filenames; + gnet_property->props263.data.boolean.def = (void *) &gnet_property_variable_tls_enforce_default; + gnet_property->props263.data.boolean.value = (void *) &gnet_property_variable_tls_enforce; /* - * PROP_TLS_ENFORCE: + * PROP_GNET_DEFLATE_ENABLED: * * General data: */ - gnet_property->props264.name = "tls_enforce"; - gnet_property->props264.desc = _("If set, all outgoing connections are tunneled over TLS."); - gnet_property->props264.ev_changed = event_new("tls_enforce_changed"); + gnet_property->props264.name = "gnet_deflate_enabled"; + gnet_property->props264.desc = _("If not set, support for Gnutella connection compression is disabled."); + gnet_property->props264.ev_changed = event_new("gnet_deflate_enabled_changed"); gnet_property->props264.save = TRUE; + gnet_property->props264.internal = FALSE; gnet_property->props264.vector_size = 1; + mutex_init(&gnet_property->props264.lock); /* Type specific data: */ gnet_property->props264.type = PROP_TYPE_BOOLEAN; - gnet_property->props264.data.boolean.def = (void *) &gnet_property_variable_tls_enforce_default; - gnet_property->props264.data.boolean.value = (void *) &gnet_property_variable_tls_enforce; + gnet_property->props264.data.boolean.def = (void *) &gnet_property_variable_gnet_deflate_enabled_default; + gnet_property->props264.data.boolean.value = (void *) &gnet_property_variable_gnet_deflate_enabled; /* - * PROP_GNET_DEFLATE_ENABLED: + * PROP_ENABLE_UDP: * * General data: */ - gnet_property->props265.name = "gnet_deflate_enabled"; - gnet_property->props265.desc = _("If not set, support for Gnutella connection compression is disabled."); - gnet_property->props265.ev_changed = event_new("gnet_deflate_enabled_changed"); + gnet_property->props265.name = "enable_udp"; + gnet_property->props265.desc = _("Whether UDP shall be used in complement to TCP. When set, gtk-gnutella will also listen for UDP traffic on the same port as the one configured for TCP and process incoming Gnutella traffic in almost the same way as if it was received via TCP. It is safe to leave this set, which is the default behavior."); + gnet_property->props265.ev_changed = event_new("enable_udp_changed"); gnet_property->props265.save = TRUE; + gnet_property->props265.internal = FALSE; gnet_property->props265.vector_size = 1; + mutex_init(&gnet_property->props265.lock); /* Type specific data: */ gnet_property->props265.type = PROP_TYPE_BOOLEAN; - gnet_property->props265.data.boolean.def = (void *) &gnet_property_variable_gnet_deflate_enabled_default; - gnet_property->props265.data.boolean.value = (void *) &gnet_property_variable_gnet_deflate_enabled; + gnet_property->props265.data.boolean.def = (void *) &gnet_property_variable_enable_udp_default; + gnet_property->props265.data.boolean.value = (void *) &gnet_property_variable_enable_udp; /* - * PROP_ENABLE_UDP: + * PROP_PROCESS_OOB_QUERIES: * * General data: */ - gnet_property->props266.name = "enable_udp"; - gnet_property->props266.desc = _("Whether UDP shall be used in complement to TCP. When set, gtk-gnutella will also listen for UDP traffic on the same port as the one configured for TCP and process incoming Gnutella traffic in almost the same way as if it was received via TCP. It is safe to leave this set, which is the default behavior."); - gnet_property->props266.ev_changed = event_new("enable_udp_changed"); + gnet_property->props266.name = "process_oob_queries"; + gnet_property->props266.desc = _("Whether gtk-gnutella should honor the request for out-of-band delivery of query hits via UDP, provided UDP support is enabled. It should not be necessary to add a port forwarding to enable this as your node will be the origin of the UDP traffic and can therefore receive replies sent to the transient UDP port opened by a masquerading firewall. It is enabled by default because it is deemed safe, as your node controls the bulk of the emitted traffic and honors the bandwidth limitations."); + gnet_property->props266.ev_changed = event_new("process_oob_queries_changed"); gnet_property->props266.save = TRUE; + gnet_property->props266.internal = FALSE; gnet_property->props266.vector_size = 1; + mutex_init(&gnet_property->props266.lock); /* Type specific data: */ gnet_property->props266.type = PROP_TYPE_BOOLEAN; - gnet_property->props266.data.boolean.def = (void *) &gnet_property_variable_enable_udp_default; - gnet_property->props266.data.boolean.value = (void *) &gnet_property_variable_enable_udp; + gnet_property->props266.data.boolean.def = (void *) &gnet_property_variable_process_oob_queries_default; + gnet_property->props266.data.boolean.value = (void *) &gnet_property_variable_process_oob_queries; /* - * PROP_PROCESS_OOB_QUERIES: + * PROP_SEND_OOB_QUERIES: * * General data: */ - gnet_property->props267.name = "process_oob_queries"; - gnet_property->props267.desc = _("Whether gtk-gnutella should honor the request for out-of-band delivery of query hits via UDP, provided UDP support is enabled. It should not be necessary to add a port forwarding to enable this as your node will be the origin of the UDP traffic and can therefore receive replies sent to the transient UDP port opened by a masquerading firewall. It is enabled by default because it is deemed safe, as your node controls the bulk of the emitted traffic and honors the bandwidth limitations."); - gnet_property->props267.ev_changed = event_new("process_oob_queries_changed"); + gnet_property->props267.name = "send_oob_queries"; + gnet_property->props267.desc = _("Whether gtk-gnutella should send queries requesting out-of-band delivery of query hits via UDP. The setting is ignored if you seem to be UDP-firewalled, i.e. cannot receive unsolicited UDP traffic. You need to enable UDP support first. This can cause the reception of vast quantities of UDP replies, so you may choose to disable this feature. If disabled, your hits will travel through the Gnutella network and can be dropped by any flow-controlled relaying node, limiting the results you can get."); + gnet_property->props267.ev_changed = event_new("send_oob_queries_changed"); gnet_property->props267.save = TRUE; + gnet_property->props267.internal = FALSE; gnet_property->props267.vector_size = 1; + mutex_init(&gnet_property->props267.lock); /* Type specific data: */ gnet_property->props267.type = PROP_TYPE_BOOLEAN; - gnet_property->props267.data.boolean.def = (void *) &gnet_property_variable_process_oob_queries_default; - gnet_property->props267.data.boolean.value = (void *) &gnet_property_variable_process_oob_queries; + gnet_property->props267.data.boolean.def = (void *) &gnet_property_variable_send_oob_queries_default; + gnet_property->props267.data.boolean.value = (void *) &gnet_property_variable_send_oob_queries; /* - * PROP_SEND_OOB_QUERIES: + * PROP_PROXY_OOB_QUERIES: * * General data: */ - gnet_property->props268.name = "send_oob_queries"; - gnet_property->props268.desc = _("Whether gtk-gnutella should send queries requesting out-of-band delivery of query hits via UDP. The setting is ignored if you seem to be UDP-firewalled, i.e. cannot receive unsolicited UDP traffic. You need to enable UDP support first. This can cause the reception of vast quantities of UDP replies, so you may choose to disable this feature. If disabled, your hits will travel through the Gnutella network and can be dropped by any flow-controlled relaying node, limiting the results you can get."); - gnet_property->props268.ev_changed = event_new("send_oob_queries_changed"); + gnet_property->props268.name = "proxy_oob_queries"; + gnet_property->props268.desc = _("Whether gtk-gnutella should, when running as ultrapeer, act as proxy for leaf queries that are not requesting OOB delivery of query hits: gtk-gnutella will claim the hits from the remote nodes and forward the hits to the proper leaf. This is very beneficial for the leaves, but can cause huge bursts of UDP traffic coming back to you. If you disable it all ultrapeers connected to you will have to relay the hits, possibly dropping other query messages and lowering the efficiency of the search network."); + gnet_property->props268.ev_changed = event_new("proxy_oob_queries_changed"); gnet_property->props268.save = TRUE; + gnet_property->props268.internal = FALSE; gnet_property->props268.vector_size = 1; + mutex_init(&gnet_property->props268.lock); /* Type specific data: */ gnet_property->props268.type = PROP_TYPE_BOOLEAN; - gnet_property->props268.data.boolean.def = (void *) &gnet_property_variable_send_oob_queries_default; - gnet_property->props268.data.boolean.value = (void *) &gnet_property_variable_send_oob_queries; + gnet_property->props268.data.boolean.def = (void *) &gnet_property_variable_proxy_oob_queries_default; + gnet_property->props268.data.boolean.value = (void *) &gnet_property_variable_proxy_oob_queries; /* - * PROP_PROXY_OOB_QUERIES: + * PROP_UPLOADS_STALLING: * * General data: */ - gnet_property->props269.name = "proxy_oob_queries"; - gnet_property->props269.desc = _("Whether gtk-gnutella should, when running as ultrapeer, act as proxy for leaf queries that are not requesting OOB delivery of query hits: gtk-gnutella will claim the hits from the remote nodes and forward the hits to the proper leaf. This is very beneficial for the leaves, but can cause huge bursts of UDP traffic coming back to you. If you disable it all ultrapeers connected to you will have to relay the hits, possibly dropping other query messages and lowering the efficiency of the search network."); - gnet_property->props269.ev_changed = event_new("proxy_oob_queries_changed"); - gnet_property->props269.save = TRUE; + gnet_property->props269.name = "uploads_stalling"; + gnet_property->props269.desc = _("Whether uploads are frequently stalling, indicating that the bandwidth is saturated. Avoid running as an ultra-node under those conditions."); + gnet_property->props269.ev_changed = event_new("uploads_stalling_changed"); + gnet_property->props269.save = FALSE; + gnet_property->props269.internal = TRUE; gnet_property->props269.vector_size = 1; + mutex_init(&gnet_property->props269.lock); /* Type specific data: */ gnet_property->props269.type = PROP_TYPE_BOOLEAN; - gnet_property->props269.data.boolean.def = (void *) &gnet_property_variable_proxy_oob_queries_default; - gnet_property->props269.data.boolean.value = (void *) &gnet_property_variable_proxy_oob_queries; + gnet_property->props269.data.boolean.def = (void *) &gnet_property_variable_uploads_stalling_default; + gnet_property->props269.data.boolean.value = (void *) &gnet_property_variable_uploads_stalling; /* - * PROP_UPLOADS_STALLING: + * PROP_USE_GLOBAL_HOSTILES_TXT: * * General data: */ - gnet_property->props270.name = "uploads_stalling"; - gnet_property->props270.desc = _("Whether uploads are frequently stalling, indicating that the bandwidth is saturated. Avoid running as an ultra-node under those conditions."); - gnet_property->props270.ev_changed = event_new("uploads_stalling_changed"); - gnet_property->props270.save = FALSE; + gnet_property->props270.name = "use_global_hostiles_txt"; + gnet_property->props270.desc = _("If set to TRUE, the global hostiles.txt is used as well as the private $GTK_GNUTELLA_DIR/hostiles.txt. This allows you to separate your private ban list from the global one distributed with gtk-gnutella."); + gnet_property->props270.ev_changed = event_new("use_global_hostiles_txt_changed"); + gnet_property->props270.save = TRUE; + gnet_property->props270.internal = FALSE; gnet_property->props270.vector_size = 1; + mutex_init(&gnet_property->props270.lock); /* Type specific data: */ gnet_property->props270.type = PROP_TYPE_BOOLEAN; - gnet_property->props270.data.boolean.def = (void *) &gnet_property_variable_uploads_stalling_default; - gnet_property->props270.data.boolean.value = (void *) &gnet_property_variable_uploads_stalling; + gnet_property->props270.data.boolean.def = (void *) &gnet_property_variable_use_global_hostiles_txt_default; + gnet_property->props270.data.boolean.value = (void *) &gnet_property_variable_use_global_hostiles_txt; /* - * PROP_USE_GLOBAL_HOSTILES_TXT: + * PROP_USE_SO_LINGER: * * General data: */ - gnet_property->props271.name = "use_global_hostiles_txt"; - gnet_property->props271.desc = _("If set to TRUE, the global hostiles.txt is used as well as the private $GTK_GNUTELLA_DIR/hostiles.txt. This allows to separate your private ban list from the global one distributed with gtk-gnutella."); - gnet_property->props271.ev_changed = event_new("use_global_hostiles_txt_changed"); + gnet_property->props271.name = "use_so_linger"; + gnet_property->props271.desc = _("If set to TRUE, SO_LINGER is used for sockets."); + gnet_property->props271.ev_changed = event_new("use_so_linger_changed"); gnet_property->props271.save = TRUE; + gnet_property->props271.internal = FALSE; gnet_property->props271.vector_size = 1; + mutex_init(&gnet_property->props271.lock); /* Type specific data: */ gnet_property->props271.type = PROP_TYPE_BOOLEAN; - gnet_property->props271.data.boolean.def = (void *) &gnet_property_variable_use_global_hostiles_txt_default; - gnet_property->props271.data.boolean.value = (void *) &gnet_property_variable_use_global_hostiles_txt; + gnet_property->props271.data.boolean.def = (void *) &gnet_property_variable_use_so_linger_default; + gnet_property->props271.data.boolean.value = (void *) &gnet_property_variable_use_so_linger; /* - * PROP_USE_SO_LINGER: + * PROP_TCP_DEFER_ACCEPT_TIMEOUT: * * General data: */ - gnet_property->props272.name = "use_so_linger"; - gnet_property->props272.desc = _("If set to TRUE, SO_LINGER is used for sockets."); - gnet_property->props272.ev_changed = event_new("use_so_linger_changed"); + gnet_property->props272.name = "tcp_defer_accept_timeout"; + gnet_property->props272.desc = _("See the man page for tcp(7). This feature typically only available on Linux systems."); + gnet_property->props272.ev_changed = event_new("tcp_defer_accept_timeout_changed"); gnet_property->props272.save = TRUE; + gnet_property->props272.internal = FALSE; gnet_property->props272.vector_size = 1; + mutex_init(&gnet_property->props272.lock); /* Type specific data: */ - gnet_property->props272.type = PROP_TYPE_BOOLEAN; - gnet_property->props272.data.boolean.def = (void *) &gnet_property_variable_use_so_linger_default; - gnet_property->props272.data.boolean.value = (void *) &gnet_property_variable_use_so_linger; + gnet_property->props272.type = PROP_TYPE_GUINT32; + gnet_property->props272.data.guint32.def = (void *) &gnet_property_variable_tcp_defer_accept_timeout_default; + gnet_property->props272.data.guint32.value = (void *) &gnet_property_variable_tcp_defer_accept_timeout; + gnet_property->props272.data.guint32.choices = NULL; + gnet_property->props272.data.guint32.max = 600; + gnet_property->props272.data.guint32.min = 0; /* - * PROP_TCP_DEFER_ACCEPT_TIMEOUT: + * PROP_BROWSE_HOST_ENABLED: * * General data: */ - gnet_property->props273.name = "tcp_defer_accept_timeout"; - gnet_property->props273.desc = _("See the man page for tcp(7). This feature typically only available on Linux systems."); - gnet_property->props273.ev_changed = event_new("tcp_defer_accept_timeout_changed"); + gnet_property->props273.name = "browse_host_enabled"; + gnet_property->props273.desc = _("If TRUE, other hosts can request a complete list of all shared files."); + gnet_property->props273.ev_changed = event_new("browse_host_enabled_changed"); gnet_property->props273.save = TRUE; + gnet_property->props273.internal = FALSE; gnet_property->props273.vector_size = 1; + mutex_init(&gnet_property->props273.lock); /* Type specific data: */ - gnet_property->props273.type = PROP_TYPE_GUINT32; - gnet_property->props273.data.guint32.def = (void *) &gnet_property_variable_tcp_defer_accept_timeout_default; - gnet_property->props273.data.guint32.value = (void *) &gnet_property_variable_tcp_defer_accept_timeout; - gnet_property->props273.data.guint32.choices = NULL; - gnet_property->props273.data.guint32.max = 600; - gnet_property->props273.data.guint32.min = 0; + gnet_property->props273.type = PROP_TYPE_BOOLEAN; + gnet_property->props273.data.boolean.def = (void *) &gnet_property_variable_browse_host_enabled_default; + gnet_property->props273.data.boolean.value = (void *) &gnet_property_variable_browse_host_enabled; /* - * PROP_BROWSE_HOST_ENABLED: + * PROP_HTML_BROWSE_COUNT: * * General data: */ - gnet_property->props274.name = "browse_host_enabled"; - gnet_property->props274.desc = _("If TRUE, other hosts can request a complete list of all shared files."); - gnet_property->props274.ev_changed = event_new("browse_host_enabled_changed"); - gnet_property->props274.save = TRUE; + gnet_property->props274.name = "html_browse_count"; + gnet_property->props274.desc = _("Number of HTML browsing requests received in this session."); + gnet_property->props274.ev_changed = event_new("html_browse_count_changed"); + gnet_property->props274.save = FALSE; + gnet_property->props274.internal = TRUE; gnet_property->props274.vector_size = 1; + mutex_init(&gnet_property->props274.lock); /* Type specific data: */ - gnet_property->props274.type = PROP_TYPE_BOOLEAN; - gnet_property->props274.data.boolean.def = (void *) &gnet_property_variable_browse_host_enabled_default; - gnet_property->props274.data.boolean.value = (void *) &gnet_property_variable_browse_host_enabled; + gnet_property->props274.type = PROP_TYPE_GUINT32; + gnet_property->props274.data.guint32.def = (void *) &gnet_property_variable_html_browse_count_default; + gnet_property->props274.data.guint32.value = (void *) &gnet_property_variable_html_browse_count; + gnet_property->props274.data.guint32.choices = NULL; + gnet_property->props274.data.guint32.max = 0xFFFFFFFF; + gnet_property->props274.data.guint32.min = 0x00000000; /* - * PROP_HTML_BROWSE_COUNT: + * PROP_HTML_BROWSE_SERVED: * * General data: */ - gnet_property->props275.name = "html_browse_count"; - gnet_property->props275.desc = _("Number of HTML browsing requests received in this session."); - gnet_property->props275.ev_changed = event_new("html_browse_count_changed"); + gnet_property->props275.name = "html_browse_served"; + gnet_property->props275.desc = _("Number of HTML browsing requests fully served in this session."); + gnet_property->props275.ev_changed = event_new("html_browse_served_changed"); gnet_property->props275.save = FALSE; + gnet_property->props275.internal = TRUE; gnet_property->props275.vector_size = 1; + mutex_init(&gnet_property->props275.lock); /* Type specific data: */ gnet_property->props275.type = PROP_TYPE_GUINT32; - gnet_property->props275.data.guint32.def = (void *) &gnet_property_variable_html_browse_count_default; - gnet_property->props275.data.guint32.value = (void *) &gnet_property_variable_html_browse_count; + gnet_property->props275.data.guint32.def = (void *) &gnet_property_variable_html_browse_served_default; + gnet_property->props275.data.guint32.value = (void *) &gnet_property_variable_html_browse_served; gnet_property->props275.data.guint32.choices = NULL; gnet_property->props275.data.guint32.max = 0xFFFFFFFF; gnet_property->props275.data.guint32.min = 0x00000000; /* - * PROP_HTML_BROWSE_SERVED: + * PROP_QHITS_BROWSE_COUNT: * * General data: */ - gnet_property->props276.name = "html_browse_served"; - gnet_property->props276.desc = _("Number of HTML browsing requests fully served in this session."); - gnet_property->props276.ev_changed = event_new("html_browse_served_changed"); + gnet_property->props276.name = "qhits_browse_count"; + gnet_property->props276.desc = _("Number of Gnutella browsing requests received in this session."); + gnet_property->props276.ev_changed = event_new("qhits_browse_count_changed"); gnet_property->props276.save = FALSE; + gnet_property->props276.internal = TRUE; gnet_property->props276.vector_size = 1; + mutex_init(&gnet_property->props276.lock); /* Type specific data: */ gnet_property->props276.type = PROP_TYPE_GUINT32; - gnet_property->props276.data.guint32.def = (void *) &gnet_property_variable_html_browse_served_default; - gnet_property->props276.data.guint32.value = (void *) &gnet_property_variable_html_browse_served; + gnet_property->props276.data.guint32.def = (void *) &gnet_property_variable_qhits_browse_count_default; + gnet_property->props276.data.guint32.value = (void *) &gnet_property_variable_qhits_browse_count; gnet_property->props276.data.guint32.choices = NULL; gnet_property->props276.data.guint32.max = 0xFFFFFFFF; gnet_property->props276.data.guint32.min = 0x00000000; /* - * PROP_QHITS_BROWSE_COUNT: + * PROP_QHITS_BROWSE_SERVED: * * General data: */ - gnet_property->props277.name = "qhits_browse_count"; - gnet_property->props277.desc = _("Number of Gnutella browsing requests received in this session."); - gnet_property->props277.ev_changed = event_new("qhits_browse_count_changed"); + gnet_property->props277.name = "qhits_browse_served"; + gnet_property->props277.desc = _("Number of Gnutella browsing requests fully served in this session."); + gnet_property->props277.ev_changed = event_new("qhits_browse_served_changed"); gnet_property->props277.save = FALSE; + gnet_property->props277.internal = TRUE; gnet_property->props277.vector_size = 1; + mutex_init(&gnet_property->props277.lock); /* Type specific data: */ gnet_property->props277.type = PROP_TYPE_GUINT32; - gnet_property->props277.data.guint32.def = (void *) &gnet_property_variable_qhits_browse_count_default; - gnet_property->props277.data.guint32.value = (void *) &gnet_property_variable_qhits_browse_count; + gnet_property->props277.data.guint32.def = (void *) &gnet_property_variable_qhits_browse_served_default; + gnet_property->props277.data.guint32.value = (void *) &gnet_property_variable_qhits_browse_served; gnet_property->props277.data.guint32.choices = NULL; gnet_property->props277.data.guint32.max = 0xFFFFFFFF; gnet_property->props277.data.guint32.min = 0x00000000; /* - * PROP_QHITS_BROWSE_SERVED: + * PROP_OVERLOADED_CPU: * * General data: */ - gnet_property->props278.name = "qhits_browse_served"; - gnet_property->props278.desc = _("Number of Gnutella browsing requests fully served in this session."); - gnet_property->props278.ev_changed = event_new("qhits_browse_served_changed"); + gnet_property->props278.name = "overloaded_cpu"; + gnet_property->props278.desc = _("The average CPU usage indicates overloading, so gtk-gnutella is reducing the amount of non-critical processing it is performing. Note that the overloading can result from gtk-gnutella not getting enough CPU time because another process is competing for the CPU. Whilst the overloading condition persists, GUI refreshing is reduced and background tasks (SHA1 computation, file moving) are slowed down."); + gnet_property->props278.ev_changed = event_new("overloaded_cpu_changed"); gnet_property->props278.save = FALSE; + gnet_property->props278.internal = FALSE; gnet_property->props278.vector_size = 1; + mutex_init(&gnet_property->props278.lock); /* Type specific data: */ - gnet_property->props278.type = PROP_TYPE_GUINT32; - gnet_property->props278.data.guint32.def = (void *) &gnet_property_variable_qhits_browse_served_default; - gnet_property->props278.data.guint32.value = (void *) &gnet_property_variable_qhits_browse_served; - gnet_property->props278.data.guint32.choices = NULL; - gnet_property->props278.data.guint32.max = 0xFFFFFFFF; - gnet_property->props278.data.guint32.min = 0x00000000; + gnet_property->props278.type = PROP_TYPE_BOOLEAN; + gnet_property->props278.data.boolean.def = (void *) &gnet_property_variable_overloaded_cpu_default; + gnet_property->props278.data.boolean.value = (void *) &gnet_property_variable_overloaded_cpu; /* - * PROP_OVERLOADED_CPU: + * PROP_DOWNLOAD_BUFFER_SIZE: * * General data: */ - gnet_property->props279.name = "overloaded_cpu"; - gnet_property->props279.desc = _("The average CPU usage indicates overloading, so gtk-gnutella is reducing the amount of non-critical processing it is performing. Note that the overloading can result from gtk-gnutella not getting enough CPU time because another process is competing for the CPU. Whilst the overloading condition persists, GUI refreshing is reduced and background tasks (SHA1 computation, file moving) are slowed down."); - gnet_property->props279.ev_changed = event_new("overloaded_cpu_changed"); - gnet_property->props279.save = FALSE; + gnet_property->props279.name = "download_buffer_size"; + gnet_property->props279.desc = _("Amount of data per downloading source that gtk-gnutella will buffer before writing to disk. When swarming from many sources, a larger value will help avoid using too many system calls and should also reduce the fragmentation on the filesystem. The downside is that it uses more memory per active source. Use 0 to disable all buffering, i.e. have gtk-gnutella write to disk as soon as it receives some data. Increase to maximum value if you have RAM."); + gnet_property->props279.ev_changed = event_new("download_buffer_size_changed"); + gnet_property->props279.save = TRUE; + gnet_property->props279.internal = FALSE; gnet_property->props279.vector_size = 1; + mutex_init(&gnet_property->props279.lock); /* Type specific data: */ - gnet_property->props279.type = PROP_TYPE_BOOLEAN; - gnet_property->props279.data.boolean.def = (void *) &gnet_property_variable_overloaded_cpu_default; - gnet_property->props279.data.boolean.value = (void *) &gnet_property_variable_overloaded_cpu; + gnet_property->props279.type = PROP_TYPE_GUINT32; + gnet_property->props279.data.guint32.def = (void *) &gnet_property_variable_download_buffer_size_default; + gnet_property->props279.data.guint32.value = (void *) &gnet_property_variable_download_buffer_size; + gnet_property->props279.data.guint32.choices = NULL; + gnet_property->props279.data.guint32.max = 1048576; + gnet_property->props279.data.guint32.min = 0; /* - * PROP_DOWNLOAD_BUFFER_SIZE: + * PROP_BROWSE_COPIED_TO_PASSIVE: * * General data: */ - gnet_property->props280.name = "download_buffer_size"; - gnet_property->props280.desc = _("Amount of data per downloading source that gtk-gnutella will buffer before writing to disk. When swarming from many sources, a larger value will help avoid using too many system calls and should also reduce the fragmentation on the filesystem. The downside is that it uses more memory per active source. Use 0 to disable all buffering, i.e. have gtk-gnutella write to disk as soon as it receives some data. Increase to maximum value if you have RAM."); - gnet_property->props280.ev_changed = event_new("download_buffer_size_changed"); + gnet_property->props280.name = "browse_copied_to_passive"; + gnet_property->props280.desc = _("When set, all search results from host browsing are dispatched to all opened passive searches. This is useful if you have different selection filters on your passive searches because it lets you classify files easily, regardless of the origin of the files."); + gnet_property->props280.ev_changed = event_new("browse_copied_to_passive_changed"); gnet_property->props280.save = TRUE; + gnet_property->props280.internal = FALSE; gnet_property->props280.vector_size = 1; + mutex_init(&gnet_property->props280.lock); /* Type specific data: */ - gnet_property->props280.type = PROP_TYPE_GUINT32; - gnet_property->props280.data.guint32.def = (void *) &gnet_property_variable_download_buffer_size_default; - gnet_property->props280.data.guint32.value = (void *) &gnet_property_variable_download_buffer_size; - gnet_property->props280.data.guint32.choices = NULL; - gnet_property->props280.data.guint32.max = 131072; - gnet_property->props280.data.guint32.min = 0; + gnet_property->props280.type = PROP_TYPE_BOOLEAN; + gnet_property->props280.data.boolean.def = (void *) &gnet_property_variable_browse_copied_to_passive_default; + gnet_property->props280.data.boolean.value = (void *) &gnet_property_variable_browse_copied_to_passive; /* - * PROP_BROWSE_COPIED_TO_PASSIVE: + * PROP_DISPLAY_METRIC_UNITS: * * General data: */ - gnet_property->props281.name = "browse_copied_to_passive"; - gnet_property->props281.desc = _("When set, all search results from host browsing are dispatched to all opened passive searches. This is useful if you have different selection filters on your passive searches because it lets you classify files easily, regardless of the origin of the files."); - gnet_property->props281.ev_changed = event_new("browse_copied_to_passive_changed"); + gnet_property->props281.name = "display_metric_units"; + gnet_property->props281.desc = _("Enable this if all units should be displayed using the metric system with SI prefixes. If disabled, certain units, for example, filesizes will be displayed using the historical base2 convention with binary prefixes."); + gnet_property->props281.ev_changed = event_new("display_metric_units_changed"); gnet_property->props281.save = TRUE; + gnet_property->props281.internal = FALSE; gnet_property->props281.vector_size = 1; + mutex_init(&gnet_property->props281.lock); /* Type specific data: */ gnet_property->props281.type = PROP_TYPE_BOOLEAN; - gnet_property->props281.data.boolean.def = (void *) &gnet_property_variable_browse_copied_to_passive_default; - gnet_property->props281.data.boolean.value = (void *) &gnet_property_variable_browse_copied_to_passive; + gnet_property->props281.data.boolean.def = (void *) &gnet_property_variable_display_metric_units_default; + gnet_property->props281.data.boolean.value = (void *) &gnet_property_variable_display_metric_units; /* - * PROP_DISPLAY_METRIC_UNITS: + * PROP_RUDP_DEBUG: * * General data: */ - gnet_property->props282.name = "display_metric_units"; - gnet_property->props282.desc = _("Enable this if all units should be displayed using the metric system with SI prefixes. If disabled, certain units, for example, filesizes will be displayed using the historical base2 convention with binary prefixes."); - gnet_property->props282.ev_changed = event_new("display_metric_units_changed"); + gnet_property->props282.name = "rudp_debug"; + gnet_property->props282.desc = _("Debug level for Reliable UDP (RUDP) code."); + gnet_property->props282.ev_changed = event_new("rudp_debug_changed"); gnet_property->props282.save = TRUE; + gnet_property->props282.internal = FALSE; gnet_property->props282.vector_size = 1; + mutex_init(&gnet_property->props282.lock); /* Type specific data: */ - gnet_property->props282.type = PROP_TYPE_BOOLEAN; - gnet_property->props282.data.boolean.def = (void *) &gnet_property_variable_display_metric_units_default; - gnet_property->props282.data.boolean.value = (void *) &gnet_property_variable_display_metric_units; + gnet_property->props282.type = PROP_TYPE_GUINT32; + gnet_property->props282.data.guint32.def = (void *) &gnet_property_variable_rudp_debug_default; + gnet_property->props282.data.guint32.value = (void *) &gnet_property_variable_rudp_debug; + gnet_property->props282.data.guint32.choices = NULL; + gnet_property->props282.data.guint32.max = 0xFFFFFFFF; + gnet_property->props282.data.guint32.min = 0x00000000; /* - * PROP_RUDP_DEBUG: + * PROP_DHT_DEBUG: * * General data: */ - gnet_property->props283.name = "rudp_debug"; - gnet_property->props283.desc = _("Debug level for Reliable UDP (RUDP) code."); - gnet_property->props283.ev_changed = event_new("rudp_debug_changed"); + gnet_property->props283.name = "dht_debug"; + gnet_property->props283.desc = _("Debug level for the Distributed Hash Table (DHT) code."); + gnet_property->props283.ev_changed = event_new("dht_debug_changed"); gnet_property->props283.save = TRUE; + gnet_property->props283.internal = FALSE; gnet_property->props283.vector_size = 1; + mutex_init(&gnet_property->props283.lock); /* Type specific data: */ gnet_property->props283.type = PROP_TYPE_GUINT32; - gnet_property->props283.data.guint32.def = (void *) &gnet_property_variable_rudp_debug_default; - gnet_property->props283.data.guint32.value = (void *) &gnet_property_variable_rudp_debug; + gnet_property->props283.data.guint32.def = (void *) &gnet_property_variable_dht_debug_default; + gnet_property->props283.data.guint32.value = (void *) &gnet_property_variable_dht_debug; gnet_property->props283.data.guint32.choices = NULL; gnet_property->props283.data.guint32.max = 0xFFFFFFFF; gnet_property->props283.data.guint32.min = 0x00000000; /* - * PROP_DHT_DEBUG: + * PROP_OOB_PROXY_DEBUG: * * General data: */ - gnet_property->props284.name = "dht_debug"; - gnet_property->props284.desc = _("Debug level for the Distributed Hash Table (DHT) code."); - gnet_property->props284.ev_changed = event_new("dht_debug_changed"); + gnet_property->props284.name = "oob_proxy_debug"; + gnet_property->props284.desc = _("Debug level for the OOB-proxying of queries."); + gnet_property->props284.ev_changed = event_new("oob_proxy_debug_changed"); gnet_property->props284.save = TRUE; + gnet_property->props284.internal = FALSE; gnet_property->props284.vector_size = 1; + mutex_init(&gnet_property->props284.lock); /* Type specific data: */ gnet_property->props284.type = PROP_TYPE_GUINT32; - gnet_property->props284.data.guint32.def = (void *) &gnet_property_variable_dht_debug_default; - gnet_property->props284.data.guint32.value = (void *) &gnet_property_variable_dht_debug; + gnet_property->props284.data.guint32.def = (void *) &gnet_property_variable_oob_proxy_debug_default; + gnet_property->props284.data.guint32.value = (void *) &gnet_property_variable_oob_proxy_debug; gnet_property->props284.data.guint32.choices = NULL; gnet_property->props284.data.guint32.max = 0xFFFFFFFF; gnet_property->props284.data.guint32.min = 0x00000000; /* - * PROP_OOB_PROXY_DEBUG: + * PROP_ENABLE_LOCAL_SOCKET: * * General data: */ - gnet_property->props285.name = "oob_proxy_debug"; - gnet_property->props285.desc = _("Debug level for the OOB-proxying of queries."); - gnet_property->props285.ev_changed = event_new("oob_proxy_debug_changed"); + gnet_property->props285.name = "enable_local_socket"; + gnet_property->props285.desc = _("If set gtk-gnutella also listens on a local (unix domain) socket which is located in ~/.gtk-gnutella/socket."); + gnet_property->props285.ev_changed = event_new("enable_local_socket_changed"); gnet_property->props285.save = TRUE; + gnet_property->props285.internal = FALSE; gnet_property->props285.vector_size = 1; + mutex_init(&gnet_property->props285.lock); /* Type specific data: */ - gnet_property->props285.type = PROP_TYPE_GUINT32; - gnet_property->props285.data.guint32.def = (void *) &gnet_property_variable_oob_proxy_debug_default; - gnet_property->props285.data.guint32.value = (void *) &gnet_property_variable_oob_proxy_debug; - gnet_property->props285.data.guint32.choices = NULL; - gnet_property->props285.data.guint32.max = 0xFFFFFFFF; - gnet_property->props285.data.guint32.min = 0x00000000; + gnet_property->props285.type = PROP_TYPE_BOOLEAN; + gnet_property->props285.data.boolean.def = (void *) &gnet_property_variable_enable_local_socket_default; + gnet_property->props285.data.boolean.value = (void *) &gnet_property_variable_enable_local_socket; /* - * PROP_ENABLE_LOCAL_SOCKET: + * PROP_MAX_SIMULTANEOUS_DOWNLOADS_PER_FILE: * * General data: */ - gnet_property->props286.name = "enable_local_socket"; - gnet_property->props286.desc = _("If set gtk-gnutella also listens on a local (unix domain) socket which is located in ~/.gtk-gnutella/socket."); - gnet_property->props286.ev_changed = event_new("enable_local_socket_changed"); + gnet_property->props286.name = "max_simultaneous_downloads_per_file"; + gnet_property->props286.desc = _("Don't start more than this number of parallel downloads per file."); + gnet_property->props286.ev_changed = event_new("max_simultaneous_downloads_per_file_changed"); gnet_property->props286.save = TRUE; + gnet_property->props286.internal = FALSE; gnet_property->props286.vector_size = 1; + mutex_init(&gnet_property->props286.lock); /* Type specific data: */ - gnet_property->props286.type = PROP_TYPE_BOOLEAN; - gnet_property->props286.data.boolean.def = (void *) &gnet_property_variable_enable_local_socket_default; - gnet_property->props286.data.boolean.value = (void *) &gnet_property_variable_enable_local_socket; + gnet_property->props286.type = PROP_TYPE_GUINT32; + gnet_property->props286.data.guint32.def = (void *) &gnet_property_variable_max_simultaneous_downloads_per_file_default; + gnet_property->props286.data.guint32.value = (void *) &gnet_property_variable_max_simultaneous_downloads_per_file; + gnet_property->props286.data.guint32.choices = NULL; + gnet_property->props286.data.guint32.max = INT_MAX; + gnet_property->props286.data.guint32.min = 1; /* - * PROP_MAX_SIMULTANEOUS_DOWNLOADS_PER_FILE: + * PROP_DUMP_RECEIVED_GNUTELLA_PACKETS: * * General data: */ - gnet_property->props287.name = "max_simultaneous_downloads_per_file"; - gnet_property->props287.desc = _("Don't start more than this number of parallel downloads per file."); - gnet_property->props287.ev_changed = event_new("max_simultaneous_downloads_per_file_changed"); - gnet_property->props287.save = TRUE; + gnet_property->props287.name = "dump_received_gnutella_packets"; + gnet_property->props287.desc = _("If enabled, all received packets are dumped to $GTK_GNUTELLA_DIR/packets_rx.dump."); + gnet_property->props287.ev_changed = event_new("dump_received_gnutella_packets_changed"); + gnet_property->props287.save = FALSE; + gnet_property->props287.internal = FALSE; gnet_property->props287.vector_size = 1; + mutex_init(&gnet_property->props287.lock); /* Type specific data: */ - gnet_property->props287.type = PROP_TYPE_GUINT32; - gnet_property->props287.data.guint32.def = (void *) &gnet_property_variable_max_simultaneous_downloads_per_file_default; - gnet_property->props287.data.guint32.value = (void *) &gnet_property_variable_max_simultaneous_downloads_per_file; - gnet_property->props287.data.guint32.choices = NULL; - gnet_property->props287.data.guint32.max = INT_MAX; - gnet_property->props287.data.guint32.min = 1; + gnet_property->props287.type = PROP_TYPE_BOOLEAN; + gnet_property->props287.data.boolean.def = (void *) &gnet_property_variable_dump_received_gnutella_packets_default; + gnet_property->props287.data.boolean.value = (void *) &gnet_property_variable_dump_received_gnutella_packets; /* - * PROP_DUMP_RECEIVED_GNUTELLA_PACKETS: + * PROP_SEARCH_RESULTS_EXPOSE_RELATIVE_PATHS: * * General data: */ - gnet_property->props288.name = "dump_received_gnutella_packets"; - gnet_property->props288.desc = _("If enabled, all received packets are dumped to $GTK_GNUTELLA_DIR/packets_rx.dump."); - gnet_property->props288.ev_changed = event_new("dump_received_gnutella_packets_changed"); - gnet_property->props288.save = FALSE; + gnet_property->props288.name = "search_results_expose_relative_paths"; + gnet_property->props288.desc = _("If enabled, queries are also matched against the directory names which are relative to the shared ones. Further, search results will show these. This is especially useful if the shared filenames are ambiguous or meaningless without knowing the directory names as well. However, be sure the directory names do not expose confidential information. You have to initiate a rescan of the shared files before a change becomes fully effective."); + gnet_property->props288.ev_changed = event_new("search_results_expose_relative_paths_changed"); + gnet_property->props288.save = TRUE; + gnet_property->props288.internal = FALSE; gnet_property->props288.vector_size = 1; + mutex_init(&gnet_property->props288.lock); /* Type specific data: */ gnet_property->props288.type = PROP_TYPE_BOOLEAN; - gnet_property->props288.data.boolean.def = (void *) &gnet_property_variable_dump_received_gnutella_packets_default; - gnet_property->props288.data.boolean.value = (void *) &gnet_property_variable_dump_received_gnutella_packets; + gnet_property->props288.data.boolean.def = (void *) &gnet_property_variable_search_results_expose_relative_paths_default; + gnet_property->props288.data.boolean.value = (void *) &gnet_property_variable_search_results_expose_relative_paths; /* - * PROP_SEARCH_RESULTS_EXPOSE_RELATIVE_PATHS: + * PROP_SHELL_DEBUG: * * General data: */ - gnet_property->props289.name = "search_results_expose_relative_paths"; - gnet_property->props289.desc = _("If enabled, queries are also matched against the directory names which are relative to the shared ones. Further, search results will show these. This is especially useful if the shared filenames are ambiguous or meaningless without knowing the directory names as well. However, be sure the directory names do not expose confidential information. You have to initiate a rescan of the shared files before a change becomes fully effective."); - gnet_property->props289.ev_changed = event_new("search_results_expose_relative_paths_changed"); + gnet_property->props289.name = "shell_debug"; + gnet_property->props289.desc = _("Debug level for the shell."); + gnet_property->props289.ev_changed = event_new("shell_debug_changed"); gnet_property->props289.save = TRUE; + gnet_property->props289.internal = FALSE; gnet_property->props289.vector_size = 1; + mutex_init(&gnet_property->props289.lock); /* Type specific data: */ - gnet_property->props289.type = PROP_TYPE_BOOLEAN; - gnet_property->props289.data.boolean.def = (void *) &gnet_property_variable_search_results_expose_relative_paths_default; - gnet_property->props289.data.boolean.value = (void *) &gnet_property_variable_search_results_expose_relative_paths; + gnet_property->props289.type = PROP_TYPE_GUINT32; + gnet_property->props289.data.guint32.def = (void *) &gnet_property_variable_shell_debug_default; + gnet_property->props289.data.guint32.value = (void *) &gnet_property_variable_shell_debug; + gnet_property->props289.data.guint32.choices = NULL; + gnet_property->props289.data.guint32.max = 0xFFFFFFFF; + gnet_property->props289.data.guint32.min = 0x00000000; /* - * PROP_SHELL_DEBUG: + * PROP_DOWNLOAD_QUEUE_FROZEN: * * General data: */ - gnet_property->props290.name = "shell_debug"; - gnet_property->props290.desc = _("Debug level for the shell."); - gnet_property->props290.ev_changed = event_new("shell_debug_changed"); - gnet_property->props290.save = TRUE; + gnet_property->props290.name = "download_queue_frozen"; + gnet_property->props290.desc = _("If larger than zero, no downloads are started."); + gnet_property->props290.ev_changed = event_new("download_queue_frozen_changed"); + gnet_property->props290.save = FALSE; + gnet_property->props290.internal = FALSE; gnet_property->props290.vector_size = 1; + mutex_init(&gnet_property->props290.lock); /* Type specific data: */ gnet_property->props290.type = PROP_TYPE_GUINT32; - gnet_property->props290.data.guint32.def = (void *) &gnet_property_variable_shell_debug_default; - gnet_property->props290.data.guint32.value = (void *) &gnet_property_variable_shell_debug; + gnet_property->props290.data.guint32.def = (void *) &gnet_property_variable_download_queue_frozen_default; + gnet_property->props290.data.guint32.value = (void *) &gnet_property_variable_download_queue_frozen; gnet_property->props290.data.guint32.choices = NULL; gnet_property->props290.data.guint32.max = 0xFFFFFFFF; gnet_property->props290.data.guint32.min = 0x00000000; /* - * PROP_DOWNLOAD_QUEUE_FROZEN: + * PROP_SQ_DEBUG: * * General data: */ - gnet_property->props291.name = "download_queue_frozen"; - gnet_property->props291.desc = _("If larger than zero, no downloads are started."); - gnet_property->props291.ev_changed = event_new("download_queue_frozen_changed"); - gnet_property->props291.save = FALSE; + gnet_property->props291.name = "sq_debug"; + gnet_property->props291.desc = _("Debug level for the search queue."); + gnet_property->props291.ev_changed = event_new("sq_debug_changed"); + gnet_property->props291.save = TRUE; + gnet_property->props291.internal = FALSE; gnet_property->props291.vector_size = 1; + mutex_init(&gnet_property->props291.lock); /* Type specific data: */ gnet_property->props291.type = PROP_TYPE_GUINT32; - gnet_property->props291.data.guint32.def = (void *) &gnet_property_variable_download_queue_frozen_default; - gnet_property->props291.data.guint32.value = (void *) &gnet_property_variable_download_queue_frozen; + gnet_property->props291.data.guint32.def = (void *) &gnet_property_variable_sq_debug_default; + gnet_property->props291.data.guint32.value = (void *) &gnet_property_variable_sq_debug; gnet_property->props291.data.guint32.choices = NULL; gnet_property->props291.data.guint32.max = 0xFFFFFFFF; gnet_property->props291.data.guint32.min = 0x00000000; /* - * PROP_SQ_DEBUG: + * PROP_PUSH_PROXY_DEBUG: * * General data: */ - gnet_property->props292.name = "sq_debug"; - gnet_property->props292.desc = _("Debug level for the search queue."); - gnet_property->props292.ev_changed = event_new("sq_debug_changed"); + gnet_property->props292.name = "push_proxy_debug"; + gnet_property->props292.desc = _("Debug level for push-proxy code."); + gnet_property->props292.ev_changed = event_new("push_proxy_debug_changed"); gnet_property->props292.save = TRUE; + gnet_property->props292.internal = FALSE; gnet_property->props292.vector_size = 1; + mutex_init(&gnet_property->props292.lock); /* Type specific data: */ gnet_property->props292.type = PROP_TYPE_GUINT32; - gnet_property->props292.data.guint32.def = (void *) &gnet_property_variable_sq_debug_default; - gnet_property->props292.data.guint32.value = (void *) &gnet_property_variable_sq_debug; + gnet_property->props292.data.guint32.def = (void *) &gnet_property_variable_push_proxy_debug_default; + gnet_property->props292.data.guint32.value = (void *) &gnet_property_variable_push_proxy_debug; gnet_property->props292.data.guint32.choices = NULL; gnet_property->props292.data.guint32.max = 0xFFFFFFFF; gnet_property->props292.data.guint32.min = 0x00000000; /* - * PROP_PUSH_PROXY_DEBUG: + * PROP_THEX_FILES_REQUESTED: * * General data: */ - gnet_property->props293.name = "push_proxy_debug"; - gnet_property->props293.desc = _("Debug level for push-proxy code."); - gnet_property->props293.ev_changed = event_new("push_proxy_debug_changed"); - gnet_property->props293.save = TRUE; + gnet_property->props293.name = "thex_files_requested"; + gnet_property->props293.desc = _("Number of THEX file requests received in this session."); + gnet_property->props293.ev_changed = event_new("thex_files_requested_changed"); + gnet_property->props293.save = FALSE; + gnet_property->props293.internal = TRUE; gnet_property->props293.vector_size = 1; + mutex_init(&gnet_property->props293.lock); /* Type specific data: */ gnet_property->props293.type = PROP_TYPE_GUINT32; - gnet_property->props293.data.guint32.def = (void *) &gnet_property_variable_push_proxy_debug_default; - gnet_property->props293.data.guint32.value = (void *) &gnet_property_variable_push_proxy_debug; + gnet_property->props293.data.guint32.def = (void *) &gnet_property_variable_thex_files_requested_default; + gnet_property->props293.data.guint32.value = (void *) &gnet_property_variable_thex_files_requested; gnet_property->props293.data.guint32.choices = NULL; gnet_property->props293.data.guint32.max = 0xFFFFFFFF; gnet_property->props293.data.guint32.min = 0x00000000; /* - * PROP_THEX_FILES_REQUESTED: + * PROP_THEX_FILES_SERVED: * * General data: */ - gnet_property->props294.name = "thex_files_requested"; - gnet_property->props294.desc = _("Number of THEX file requests received in this session."); - gnet_property->props294.ev_changed = event_new("thex_files_requested_changed"); + gnet_property->props294.name = "thex_files_served"; + gnet_property->props294.desc = _("Number of THEX file requests fully served in this session."); + gnet_property->props294.ev_changed = event_new("thex_files_served_changed"); gnet_property->props294.save = FALSE; + gnet_property->props294.internal = TRUE; gnet_property->props294.vector_size = 1; + mutex_init(&gnet_property->props294.lock); /* Type specific data: */ gnet_property->props294.type = PROP_TYPE_GUINT32; - gnet_property->props294.data.guint32.def = (void *) &gnet_property_variable_thex_files_requested_default; - gnet_property->props294.data.guint32.value = (void *) &gnet_property_variable_thex_files_requested; + gnet_property->props294.data.guint32.def = (void *) &gnet_property_variable_thex_files_served_default; + gnet_property->props294.data.guint32.value = (void *) &gnet_property_variable_thex_files_served; gnet_property->props294.data.guint32.choices = NULL; gnet_property->props294.data.guint32.max = 0xFFFFFFFF; gnet_property->props294.data.guint32.min = 0x00000000; /* - * PROP_THEX_FILES_SERVED: + * PROP_TIGERTREE_DEBUG: * * General data: */ - gnet_property->props295.name = "thex_files_served"; - gnet_property->props295.desc = _("Number of THEX file requests fully served in this session."); - gnet_property->props295.ev_changed = event_new("thex_files_served_changed"); - gnet_property->props295.save = FALSE; + gnet_property->props295.name = "tigertree_debug"; + gnet_property->props295.desc = _("Debug level for Tigertree-related code."); + gnet_property->props295.ev_changed = event_new("tigertree_debug_changed"); + gnet_property->props295.save = TRUE; + gnet_property->props295.internal = FALSE; gnet_property->props295.vector_size = 1; + mutex_init(&gnet_property->props295.lock); /* Type specific data: */ gnet_property->props295.type = PROP_TYPE_GUINT32; - gnet_property->props295.data.guint32.def = (void *) &gnet_property_variable_thex_files_served_default; - gnet_property->props295.data.guint32.value = (void *) &gnet_property_variable_thex_files_served; + gnet_property->props295.data.guint32.def = (void *) &gnet_property_variable_tigertree_debug_default; + gnet_property->props295.data.guint32.value = (void *) &gnet_property_variable_tigertree_debug; gnet_property->props295.data.guint32.choices = NULL; gnet_property->props295.data.guint32.max = 0xFFFFFFFF; gnet_property->props295.data.guint32.min = 0x00000000; /* - * PROP_TIGERTREE_DEBUG: + * PROP_TTH_REBUILDING: * * General data: */ - gnet_property->props296.name = "tigertree_debug"; - gnet_property->props296.desc = _("Debug level for Tigertree-related code."); - gnet_property->props296.ev_changed = event_new("tigertree_debug_changed"); - gnet_property->props296.save = TRUE; + gnet_property->props296.name = "tth_rebuilding"; + gnet_property->props296.desc = _("Whether gtk-gnutella is currently computing TTH of shared files in the background."); + gnet_property->props296.ev_changed = event_new("tth_rebuilding_changed"); + gnet_property->props296.save = FALSE; + gnet_property->props296.internal = FALSE; gnet_property->props296.vector_size = 1; + mutex_init(&gnet_property->props296.lock); /* Type specific data: */ - gnet_property->props296.type = PROP_TYPE_GUINT32; - gnet_property->props296.data.guint32.def = (void *) &gnet_property_variable_tigertree_debug_default; - gnet_property->props296.data.guint32.value = (void *) &gnet_property_variable_tigertree_debug; - gnet_property->props296.data.guint32.choices = NULL; - gnet_property->props296.data.guint32.max = 0xFFFFFFFF; - gnet_property->props296.data.guint32.min = 0x00000000; + gnet_property->props296.type = PROP_TYPE_BOOLEAN; + gnet_property->props296.data.boolean.def = (void *) &gnet_property_variable_tth_rebuilding_default; + gnet_property->props296.data.boolean.value = (void *) &gnet_property_variable_tth_rebuilding; /* - * PROP_TTH_REBUILDING: + * PROP_TTH_VERIFYING: * * General data: */ - gnet_property->props297.name = "tth_rebuilding"; - gnet_property->props297.desc = _("Whether gtk-gnutella is currently computing TTH of shared files in the background."); - gnet_property->props297.ev_changed = event_new("tth_rebuilding_changed"); + gnet_property->props297.name = "tth_verifying"; + gnet_property->props297.desc = _("Whether gtk-gnutella is currently verifying the TTH of downloaded files in the background."); + gnet_property->props297.ev_changed = event_new("tth_verifying_changed"); gnet_property->props297.save = FALSE; + gnet_property->props297.internal = FALSE; gnet_property->props297.vector_size = 1; + mutex_init(&gnet_property->props297.lock); /* Type specific data: */ gnet_property->props297.type = PROP_TYPE_BOOLEAN; - gnet_property->props297.data.boolean.def = (void *) &gnet_property_variable_tth_rebuilding_default; - gnet_property->props297.data.boolean.value = (void *) &gnet_property_variable_tth_rebuilding; + gnet_property->props297.data.boolean.def = (void *) &gnet_property_variable_tth_verifying_default; + gnet_property->props297.data.boolean.value = (void *) &gnet_property_variable_tth_verifying; /* - * PROP_TTH_VERIFYING: + * PROP_SEARCH_MAX_RESULTS: * * General data: */ - gnet_property->props298.name = "tth_verifying"; - gnet_property->props298.desc = _("Whether gtk-gnutella is currently verifying the TTH of downloaded files in the background."); - gnet_property->props298.ev_changed = event_new("tth_verifying_changed"); - gnet_property->props298.save = FALSE; + gnet_property->props298.name = "search_max_results"; + gnet_property->props298.desc = _("Maximum number of results to show in any search."); + gnet_property->props298.ev_changed = event_new("search_max_results_changed"); + gnet_property->props298.save = TRUE; + gnet_property->props298.internal = FALSE; gnet_property->props298.vector_size = 1; + mutex_init(&gnet_property->props298.lock); /* Type specific data: */ - gnet_property->props298.type = PROP_TYPE_BOOLEAN; - gnet_property->props298.data.boolean.def = (void *) &gnet_property_variable_tth_verifying_default; - gnet_property->props298.data.boolean.value = (void *) &gnet_property_variable_tth_verifying; + gnet_property->props298.type = PROP_TYPE_GUINT32; + gnet_property->props298.data.guint32.def = (void *) &gnet_property_variable_search_max_results_default; + gnet_property->props298.data.guint32.value = (void *) &gnet_property_variable_search_max_results; + gnet_property->props298.data.guint32.choices = NULL; + gnet_property->props298.data.guint32.max = 100000; + gnet_property->props298.data.guint32.min = 10; /* - * PROP_SEARCH_MAX_RESULTS: + * PROP_BROWSE_HOST_MAX_RESULTS: * * General data: */ - gnet_property->props299.name = "search_max_results"; - gnet_property->props299.desc = _("Maximum number of results to show in any search."); - gnet_property->props299.ev_changed = event_new("search_max_results_changed"); + gnet_property->props299.name = "browse_host_max_results"; + gnet_property->props299.desc = _("Maximum number of results to show in a browse_host request."); + gnet_property->props299.ev_changed = event_new("browse_host_max_results_changed"); gnet_property->props299.save = TRUE; + gnet_property->props299.internal = FALSE; gnet_property->props299.vector_size = 1; + mutex_init(&gnet_property->props299.lock); /* Type specific data: */ gnet_property->props299.type = PROP_TYPE_GUINT32; - gnet_property->props299.data.guint32.def = (void *) &gnet_property_variable_search_max_results_default; - gnet_property->props299.data.guint32.value = (void *) &gnet_property_variable_search_max_results; + gnet_property->props299.data.guint32.def = (void *) &gnet_property_variable_browse_host_max_results_default; + gnet_property->props299.data.guint32.value = (void *) &gnet_property_variable_browse_host_max_results; gnet_property->props299.data.guint32.choices = NULL; - gnet_property->props299.data.guint32.max = 100000; - gnet_property->props299.data.guint32.min = 10; + gnet_property->props299.data.guint32.max = 500000; + gnet_property->props299.data.guint32.min = 100; /* - * PROP_BROWSE_HOST_MAX_RESULTS: + * PROP_LATEST_SVN_RELEASE_DATE: * * General data: */ - gnet_property->props300.name = "browse_host_max_results"; - gnet_property->props300.desc = _("Maximum number of results to show in a browse_host request."); - gnet_property->props300.ev_changed = event_new("browse_host_max_results_changed"); + gnet_property->props300.name = "latest_svn_release_date"; + gnet_property->props300.desc = _("Date of the latest SVN release."); + gnet_property->props300.ev_changed = event_new("latest_svn_release_date_changed"); gnet_property->props300.save = TRUE; + gnet_property->props300.internal = FALSE; gnet_property->props300.vector_size = 1; + mutex_init(&gnet_property->props300.lock); /* Type specific data: */ - gnet_property->props300.type = PROP_TYPE_GUINT32; - gnet_property->props300.data.guint32.def = (void *) &gnet_property_variable_browse_host_max_results_default; - gnet_property->props300.data.guint32.value = (void *) &gnet_property_variable_browse_host_max_results; - gnet_property->props300.data.guint32.choices = NULL; - gnet_property->props300.data.guint32.max = 500000; - gnet_property->props300.data.guint32.min = 100; + gnet_property->props300.type = PROP_TYPE_TIMESTAMP; + gnet_property->props300.data.timestamp.def = (void *) &gnet_property_variable_latest_svn_release_date_default; + gnet_property->props300.data.timestamp.value = (void *) &gnet_property_variable_latest_svn_release_date; + gnet_property->props300.data.timestamp.choices = NULL; + gnet_property->props300.data.timestamp.max = (time_t) ((1U << 31) - 1); + gnet_property->props300.data.timestamp.min = 0x0000000000000000; /* - * PROP_LATEST_SVN_RELEASE_DATE: + * PROP_LATEST_SVN_RELEASE_REVISION: * * General data: */ - gnet_property->props301.name = "latest_svn_release_date"; - gnet_property->props301.desc = _("Date of the latest SVN release."); - gnet_property->props301.ev_changed = event_new("latest_svn_release_date_changed"); + gnet_property->props301.name = "latest_svn_release_revision"; + gnet_property->props301.desc = _("Revision of the latest SVN release."); + gnet_property->props301.ev_changed = event_new("latest_svn_release_revision_changed"); gnet_property->props301.save = TRUE; + gnet_property->props301.internal = FALSE; gnet_property->props301.vector_size = 1; + mutex_init(&gnet_property->props301.lock); /* Type specific data: */ - gnet_property->props301.type = PROP_TYPE_TIMESTAMP; - gnet_property->props301.data.timestamp.def = (void *) &gnet_property_variable_latest_svn_release_date_default; - gnet_property->props301.data.timestamp.value = (void *) &gnet_property_variable_latest_svn_release_date; - gnet_property->props301.data.timestamp.choices = NULL; - gnet_property->props301.data.timestamp.max = (time_t) ((1U << 31) - 1); - gnet_property->props301.data.timestamp.min = 0x0000000000000000; + gnet_property->props301.type = PROP_TYPE_GUINT32; + gnet_property->props301.data.guint32.def = (void *) &gnet_property_variable_latest_svn_release_revision_default; + gnet_property->props301.data.guint32.value = (void *) &gnet_property_variable_latest_svn_release_revision; + gnet_property->props301.data.guint32.choices = NULL; + gnet_property->props301.data.guint32.max = 0xFFFFFFFF; + gnet_property->props301.data.guint32.min = 0x00000000; /* - * PROP_LATEST_SVN_RELEASE_REVISION: + * PROP_LATEST_SVN_RELEASE_SIGNATURE: * * General data: */ - gnet_property->props302.name = "latest_svn_release_revision"; - gnet_property->props302.desc = _("Revision of the latest SVN release."); - gnet_property->props302.ev_changed = event_new("latest_svn_release_revision_changed"); + gnet_property->props302.name = "latest_svn_release_signature"; + gnet_property->props302.desc = _("Signature of the latest SVN release notification."); + gnet_property->props302.ev_changed = event_new("latest_svn_release_signature_changed"); gnet_property->props302.save = TRUE; + gnet_property->props302.internal = FALSE; gnet_property->props302.vector_size = 1; + mutex_init(&gnet_property->props302.lock); /* Type specific data: */ - gnet_property->props302.type = PROP_TYPE_GUINT32; - gnet_property->props302.data.guint32.def = (void *) &gnet_property_variable_latest_svn_release_revision_default; - gnet_property->props302.data.guint32.value = (void *) &gnet_property_variable_latest_svn_release_revision; - gnet_property->props302.data.guint32.choices = NULL; - gnet_property->props302.data.guint32.max = 0xFFFFFFFF; - gnet_property->props302.data.guint32.min = 0x00000000; + gnet_property->props302.type = PROP_TYPE_STRING; + gnet_property->props302.data.string.def = (void *) &gnet_property_variable_latest_svn_release_signature_default; + gnet_property->props302.data.string.value = (void *) &gnet_property_variable_latest_svn_release_signature; + if (gnet_property->props302.data.string.def) { + *gnet_property->props302.data.string.value = + g_strdup(eval_subst(*gnet_property->props302.data.string.def)); + } /* - * PROP_LATEST_SVN_RELEASE_SIGNATURE: + * PROP_TLS_CACHE_MAX_HOSTS: * * General data: */ - gnet_property->props303.name = "latest_svn_release_signature"; - gnet_property->props303.desc = _("Signature of the latest SVN release notification."); - gnet_property->props303.ev_changed = event_new("latest_svn_release_signature_changed"); + gnet_property->props303.name = "tls_cache_max_hosts"; + gnet_property->props303.desc = _("Maximum number of hosts in the TLS node cache."); + gnet_property->props303.ev_changed = event_new("tls_cache_max_hosts_changed"); gnet_property->props303.save = TRUE; + gnet_property->props303.internal = FALSE; gnet_property->props303.vector_size = 1; + mutex_init(&gnet_property->props303.lock); /* Type specific data: */ - gnet_property->props303.type = PROP_TYPE_STRING; - gnet_property->props303.data.string.def = (void *) &gnet_property_variable_latest_svn_release_signature_default; - gnet_property->props303.data.string.value = (void *) &gnet_property_variable_latest_svn_release_signature; - if (gnet_property->props303.data.string.def) { - *gnet_property->props303.data.string.value = - g_strdup(eval_subst(*gnet_property->props303.data.string.def)); - } + gnet_property->props303.type = PROP_TYPE_GUINT32; + gnet_property->props303.data.guint32.def = (void *) &gnet_property_variable_tls_cache_max_hosts_default; + gnet_property->props303.data.guint32.value = (void *) &gnet_property_variable_tls_cache_max_hosts; + gnet_property->props303.data.guint32.choices = NULL; + gnet_property->props303.data.guint32.max = 50000; + gnet_property->props303.data.guint32.min = 100; /* - * PROP_TLS_CACHE_MAX_HOSTS: + * PROP_TLS_CACHE_MAX_TIME: * * General data: */ - gnet_property->props304.name = "tls_cache_max_hosts"; - gnet_property->props304.desc = _("Maximum number of hosts in the TLS node cache."); - gnet_property->props304.ev_changed = event_new("tls_cache_max_hosts_changed"); + gnet_property->props304.name = "tls_cache_max_time"; + gnet_property->props304.desc = _("Maximum time before removing hosts from the TLS cache."); + gnet_property->props304.ev_changed = event_new("tls_cache_max_time_changed"); gnet_property->props304.save = TRUE; + gnet_property->props304.internal = FALSE; gnet_property->props304.vector_size = 1; + mutex_init(&gnet_property->props304.lock); /* Type specific data: */ gnet_property->props304.type = PROP_TYPE_GUINT32; - gnet_property->props304.data.guint32.def = (void *) &gnet_property_variable_tls_cache_max_hosts_default; - gnet_property->props304.data.guint32.value = (void *) &gnet_property_variable_tls_cache_max_hosts; + gnet_property->props304.data.guint32.def = (void *) &gnet_property_variable_tls_cache_max_time_default; + gnet_property->props304.data.guint32.value = (void *) &gnet_property_variable_tls_cache_max_time; gnet_property->props304.data.guint32.choices = NULL; - gnet_property->props304.data.guint32.max = 50000; - gnet_property->props304.data.guint32.min = 100; + gnet_property->props304.data.guint32.max = 691200; + gnet_property->props304.data.guint32.min = 14400; /* - * PROP_TLS_CACHE_MAX_TIME: + * PROP_TTH_AUTO_DISCOVERY: * * General data: */ - gnet_property->props305.name = "tls_cache_max_time"; - gnet_property->props305.desc = _("Maximum time before removing hosts from the TLS cache."); - gnet_property->props305.ev_changed = event_new("tls_cache_max_time_changed"); + gnet_property->props305.name = "tth_auto_discovery"; + gnet_property->props305.desc = _("If set to TRUE the tigertree root hash (TTH) can be discovered on the fly. Otherwise, the TTH is only accepted if provided by the user, for example, by a magnet link."); + gnet_property->props305.ev_changed = event_new("tth_auto_discovery_changed"); gnet_property->props305.save = TRUE; + gnet_property->props305.internal = FALSE; gnet_property->props305.vector_size = 1; + mutex_init(&gnet_property->props305.lock); /* Type specific data: */ - gnet_property->props305.type = PROP_TYPE_GUINT32; - gnet_property->props305.data.guint32.def = (void *) &gnet_property_variable_tls_cache_max_time_default; - gnet_property->props305.data.guint32.value = (void *) &gnet_property_variable_tls_cache_max_time; - gnet_property->props305.data.guint32.choices = NULL; - gnet_property->props305.data.guint32.max = 691200; - gnet_property->props305.data.guint32.min = 14400; + gnet_property->props305.type = PROP_TYPE_BOOLEAN; + gnet_property->props305.data.boolean.def = (void *) &gnet_property_variable_tth_auto_discovery_default; + gnet_property->props305.data.boolean.value = (void *) &gnet_property_variable_tth_auto_discovery; /* - * PROP_TTH_AUTO_DISCOVERY: + * PROP_ENABLE_HACKAROUNDS: * * General data: */ - gnet_property->props306.name = "tth_auto_discovery"; - gnet_property->props306.desc = _("If set to TRUE the tigertree root hash (TTH) can be discovered on the fly. Otherwise, the TTH is only accepted if provided by the user, for example, by a magnet link."); - gnet_property->props306.ev_changed = event_new("tth_auto_discovery_changed"); + gnet_property->props306.name = "enable_hackarounds"; + gnet_property->props306.desc = _("If set to TRUE, gtk-gnutella will turn on some hacks which, unfortunately, have to exist at all. The aim is to improve the overall downloading experience."); + gnet_property->props306.ev_changed = event_new("enable_hackarounds_changed"); gnet_property->props306.save = TRUE; + gnet_property->props306.internal = FALSE; gnet_property->props306.vector_size = 1; + mutex_init(&gnet_property->props306.lock); /* Type specific data: */ gnet_property->props306.type = PROP_TYPE_BOOLEAN; - gnet_property->props306.data.boolean.def = (void *) &gnet_property_variable_tth_auto_discovery_default; - gnet_property->props306.data.boolean.value = (void *) &gnet_property_variable_tth_auto_discovery; + gnet_property->props306.data.boolean.def = (void *) &gnet_property_variable_enable_hackarounds_default; + gnet_property->props306.data.boolean.value = (void *) &gnet_property_variable_enable_hackarounds; /* - * PROP_ENABLE_HACKAROUNDS: + * PROP_G2_CACHE_MAX_HOSTS: * * General data: */ - gnet_property->props307.name = "enable_hackarounds"; - gnet_property->props307.desc = _("If set to TRUE, gtk-gnutella will turn on some hacks which, unfortunately, have to exist at all. The aim is to improve the overall downloading experience."); - gnet_property->props307.ev_changed = event_new("enable_hackarounds_changed"); + gnet_property->props307.name = "g2_cache_max_hosts"; + gnet_property->props307.desc = _("Maximum number of hosts in the G2 node cache."); + gnet_property->props307.ev_changed = event_new("g2_cache_max_hosts_changed"); gnet_property->props307.save = TRUE; + gnet_property->props307.internal = FALSE; gnet_property->props307.vector_size = 1; + mutex_init(&gnet_property->props307.lock); /* Type specific data: */ - gnet_property->props307.type = PROP_TYPE_BOOLEAN; - gnet_property->props307.data.boolean.def = (void *) &gnet_property_variable_enable_hackarounds_default; - gnet_property->props307.data.boolean.value = (void *) &gnet_property_variable_enable_hackarounds; + gnet_property->props307.type = PROP_TYPE_GUINT32; + gnet_property->props307.data.guint32.def = (void *) &gnet_property_variable_g2_cache_max_hosts_default; + gnet_property->props307.data.guint32.value = (void *) &gnet_property_variable_g2_cache_max_hosts; + gnet_property->props307.data.guint32.choices = NULL; + gnet_property->props307.data.guint32.max = 50000; + gnet_property->props307.data.guint32.min = 100; /* - * PROP_G2_CACHE_MAX_HOSTS: + * PROP_G2_CACHE_MAX_TIME: * * General data: */ - gnet_property->props308.name = "g2_cache_max_hosts"; - gnet_property->props308.desc = _("Maximum number of hosts in the G2 node cache."); - gnet_property->props308.ev_changed = event_new("g2_cache_max_hosts_changed"); + gnet_property->props308.name = "g2_cache_max_time"; + gnet_property->props308.desc = _("Maximum time before removing hosts from the G2 cache."); + gnet_property->props308.ev_changed = event_new("g2_cache_max_time_changed"); gnet_property->props308.save = TRUE; + gnet_property->props308.internal = FALSE; gnet_property->props308.vector_size = 1; + mutex_init(&gnet_property->props308.lock); /* Type specific data: */ gnet_property->props308.type = PROP_TYPE_GUINT32; - gnet_property->props308.data.guint32.def = (void *) &gnet_property_variable_g2_cache_max_hosts_default; - gnet_property->props308.data.guint32.value = (void *) &gnet_property_variable_g2_cache_max_hosts; + gnet_property->props308.data.guint32.def = (void *) &gnet_property_variable_g2_cache_max_time_default; + gnet_property->props308.data.guint32.value = (void *) &gnet_property_variable_g2_cache_max_time; gnet_property->props308.data.guint32.choices = NULL; - gnet_property->props308.data.guint32.max = 50000; - gnet_property->props308.data.guint32.min = 100; + gnet_property->props308.data.guint32.max = 691200; + gnet_property->props308.data.guint32.min = 14400; /* - * PROP_G2_CACHE_MAX_TIME: + * PROP_G2_DEBUG: * * General data: */ - gnet_property->props309.name = "g2_cache_max_time"; - gnet_property->props309.desc = _("Maximum time before removing hosts from the G2 cache."); - gnet_property->props309.ev_changed = event_new("g2_cache_max_time_changed"); + gnet_property->props309.name = "g2_debug"; + gnet_property->props309.desc = _("Debug level for management of G2-only hosts."); + gnet_property->props309.ev_changed = event_new("g2_debug_changed"); gnet_property->props309.save = TRUE; + gnet_property->props309.internal = FALSE; gnet_property->props309.vector_size = 1; + mutex_init(&gnet_property->props309.lock); /* Type specific data: */ gnet_property->props309.type = PROP_TYPE_GUINT32; - gnet_property->props309.data.guint32.def = (void *) &gnet_property_variable_g2_cache_max_time_default; - gnet_property->props309.data.guint32.value = (void *) &gnet_property_variable_g2_cache_max_time; + gnet_property->props309.data.guint32.def = (void *) &gnet_property_variable_g2_debug_default; + gnet_property->props309.data.guint32.value = (void *) &gnet_property_variable_g2_debug; gnet_property->props309.data.guint32.choices = NULL; - gnet_property->props309.data.guint32.max = 691200; - gnet_property->props309.data.guint32.min = 14400; + gnet_property->props309.data.guint32.max = 20; + gnet_property->props309.data.guint32.min = 0; /* - * PROP_G2_DEBUG: + * PROP_DL_RESOURCE_SWITCHING: * * General data: */ - gnet_property->props310.name = "g2_debug"; - gnet_property->props310.desc = _("Debug level for management of G2-only hosts."); - gnet_property->props310.ev_changed = event_new("g2_debug_changed"); + gnet_property->props310.name = "dl_resource_switching"; + gnet_property->props310.desc = _("Whether GTKG can switch among the several files waiting to be downloaded from a given server, when making a follow-up HTTP request. Turn it off only if you witness problems with a particular servent you're downloading from."); + gnet_property->props310.ev_changed = event_new("dl_resource_switching_changed"); gnet_property->props310.save = TRUE; + gnet_property->props310.internal = FALSE; gnet_property->props310.vector_size = 1; + mutex_init(&gnet_property->props310.lock); /* Type specific data: */ - gnet_property->props310.type = PROP_TYPE_GUINT32; - gnet_property->props310.data.guint32.def = (void *) &gnet_property_variable_g2_debug_default; - gnet_property->props310.data.guint32.value = (void *) &gnet_property_variable_g2_debug; - gnet_property->props310.data.guint32.choices = NULL; - gnet_property->props310.data.guint32.max = 20; - gnet_property->props310.data.guint32.min = 0; + gnet_property->props310.type = PROP_TYPE_BOOLEAN; + gnet_property->props310.data.boolean.def = (void *) &gnet_property_variable_dl_resource_switching_default; + gnet_property->props310.data.boolean.value = (void *) &gnet_property_variable_dl_resource_switching; /* - * PROP_DL_RESOURCE_SWITCHING: + * PROP_PARQ_ENABLED: * * General data: */ - gnet_property->props311.name = "dl_resource_switching"; - gnet_property->props311.desc = _("Whether GTKG can switch among the several files waiting to be downloaded from a given server, when making a follow-up HTTP request. Turn it off only if you witness problems with a particular servent you're downloading from."); - gnet_property->props311.ev_changed = event_new("dl_resource_switching_changed"); + gnet_property->props311.name = "parq_enabled"; + gnet_property->props311.desc = _("If set to TRUE, PARQ (Passive/Active Remote Queuing) is enabled. Do not disable unless you know what you are doing."); + gnet_property->props311.ev_changed = event_new("parq_enabled_changed"); gnet_property->props311.save = TRUE; + gnet_property->props311.internal = FALSE; gnet_property->props311.vector_size = 1; + mutex_init(&gnet_property->props311.lock); /* Type specific data: */ gnet_property->props311.type = PROP_TYPE_BOOLEAN; - gnet_property->props311.data.boolean.def = (void *) &gnet_property_variable_dl_resource_switching_default; - gnet_property->props311.data.boolean.value = (void *) &gnet_property_variable_dl_resource_switching; + gnet_property->props311.data.boolean.def = (void *) &gnet_property_variable_parq_enabled_default; + gnet_property->props311.data.boolean.value = (void *) &gnet_property_variable_parq_enabled; /* - * PROP_PARQ_ENABLED: + * PROP_PFSP_LAST_CHUNK: * * General data: */ - gnet_property->props312.name = "parq_enabled"; - gnet_property->props312.desc = _("If set to TRUE, PARQ (Passive/Active Remote Queuing) is enabled. Do not disable unless you know what you are doing."); - gnet_property->props312.ev_changed = event_new("parq_enabled_changed"); + gnet_property->props312.name = "pfsp_last_chunk"; + gnet_property->props312.desc = _("When partial file sharing (PFSP) is enabled, gtk-gnutella will strive to download chunks in a random order, to maximize the spreading of the file in the network. However, this may make pre-viewing of the file impossible as some file formats make use of a trailer to hold meta-information or seeking indices. GTKG will attempt to download the specified amount of data at the tail of the file as soon as possible. Set it to 0 to disable any tail-downloading preference."); + gnet_property->props312.ev_changed = event_new("pfsp_last_chunk_changed"); gnet_property->props312.save = TRUE; + gnet_property->props312.internal = FALSE; gnet_property->props312.vector_size = 1; + mutex_init(&gnet_property->props312.lock); /* Type specific data: */ - gnet_property->props312.type = PROP_TYPE_BOOLEAN; - gnet_property->props312.data.boolean.def = (void *) &gnet_property_variable_parq_enabled_default; - gnet_property->props312.data.boolean.value = (void *) &gnet_property_variable_parq_enabled; + gnet_property->props312.type = PROP_TYPE_GUINT32; + gnet_property->props312.data.guint32.def = (void *) &gnet_property_variable_pfsp_last_chunk_default; + gnet_property->props312.data.guint32.value = (void *) &gnet_property_variable_pfsp_last_chunk; + gnet_property->props312.data.guint32.choices = NULL; + gnet_property->props312.data.guint32.max = 0xFFFFFFFF; + gnet_property->props312.data.guint32.min = 0x00000000; /* - * PROP_PFSP_LAST_CHUNK: + * PROP_BEAUTIFY_FILENAMES: * * General data: */ - gnet_property->props313.name = "pfsp_last_chunk"; - gnet_property->props313.desc = _("When partial file sharing (PFSP) is enabled, gtk-gnutella will strive to download chunks in a random order, to maximize the spreading of the file in the network. However, this may make pre-viewing of the file impossible as some file formats make use of a trailer to hold meta-information or seeking indices. GTKG will attempt to download the specified amount of data at the tail of the file as soon as possible. Set it to 0 to disable any tail-downloading preference."); - gnet_property->props313.ev_changed = event_new("pfsp_last_chunk_changed"); + gnet_property->props313.name = "beautify_filenames"; + gnet_property->props313.desc = _("Whether GTKG should post-process filenames to remove consecutive '_' in the name, or extra '_' surrounding punctuation for instance, to make the name prettier."); + gnet_property->props313.ev_changed = event_new("beautify_filenames_changed"); gnet_property->props313.save = TRUE; + gnet_property->props313.internal = FALSE; gnet_property->props313.vector_size = 1; + mutex_init(&gnet_property->props313.lock); /* Type specific data: */ - gnet_property->props313.type = PROP_TYPE_GUINT32; - gnet_property->props313.data.guint32.def = (void *) &gnet_property_variable_pfsp_last_chunk_default; - gnet_property->props313.data.guint32.value = (void *) &gnet_property_variable_pfsp_last_chunk; - gnet_property->props313.data.guint32.choices = NULL; - gnet_property->props313.data.guint32.max = 0xFFFFFFFF; - gnet_property->props313.data.guint32.min = 0x00000000; + gnet_property->props313.type = PROP_TYPE_BOOLEAN; + gnet_property->props313.data.boolean.def = (void *) &gnet_property_variable_beautify_filenames_default; + gnet_property->props313.data.boolean.value = (void *) &gnet_property_variable_beautify_filenames; /* - * PROP_BEAUTIFY_FILENAMES: + * PROP_ENABLE_DHT: * * General data: */ - gnet_property->props314.name = "beautify_filenames"; - gnet_property->props314.desc = _("Whether GTKG should post-process filenames to remove consecutive '_' in the name, or extra '_' surrounding punctuation for instance, to make the name prettier."); - gnet_property->props314.ev_changed = event_new("beautify_filenames_changed"); + gnet_property->props314.name = "enable_dht"; + gnet_property->props314.desc = _("Whether the Distributed Hash Table (DHT) should be enabled. The DHT allows you to resolve magnet: URIs and to easily locate alternate locations for files and push-proxies for firewalled hosts. It requires UDP support."); + gnet_property->props314.ev_changed = event_new("enable_dht_changed"); gnet_property->props314.save = TRUE; + gnet_property->props314.internal = FALSE; gnet_property->props314.vector_size = 1; + mutex_init(&gnet_property->props314.lock); /* Type specific data: */ gnet_property->props314.type = PROP_TYPE_BOOLEAN; - gnet_property->props314.data.boolean.def = (void *) &gnet_property_variable_beautify_filenames_default; - gnet_property->props314.data.boolean.value = (void *) &gnet_property_variable_beautify_filenames; + gnet_property->props314.data.boolean.def = (void *) &gnet_property_variable_enable_dht_default; + gnet_property->props314.data.boolean.value = (void *) &gnet_property_variable_enable_dht; /* - * PROP_ENABLE_DHT: + * PROP_CQ_DEBUG: * * General data: */ - gnet_property->props315.name = "enable_dht"; - gnet_property->props315.desc = _("Whether the Distributed Hash Table (DHT) should be enabled. The DHT allows you to resolve magnet: URIs and to easily locate alternate locations for files and push-proxies for firewalled hosts. It requires UDP support."); - gnet_property->props315.ev_changed = event_new("enable_dht_changed"); + gnet_property->props315.name = "cq_debug"; + gnet_property->props315.desc = _("Debug level for the callout queue."); + gnet_property->props315.ev_changed = event_new("cq_debug_changed"); gnet_property->props315.save = TRUE; + gnet_property->props315.internal = FALSE; gnet_property->props315.vector_size = 1; + mutex_init(&gnet_property->props315.lock); /* Type specific data: */ - gnet_property->props315.type = PROP_TYPE_BOOLEAN; - gnet_property->props315.data.boolean.def = (void *) &gnet_property_variable_enable_dht_default; - gnet_property->props315.data.boolean.value = (void *) &gnet_property_variable_enable_dht; + gnet_property->props315.type = PROP_TYPE_GUINT32; + gnet_property->props315.data.guint32.def = (void *) &gnet_property_variable_cq_debug_default; + gnet_property->props315.data.guint32.value = (void *) &gnet_property_variable_cq_debug; + gnet_property->props315.data.guint32.choices = NULL; + gnet_property->props315.data.guint32.max = 0xFFFFFFFF; + gnet_property->props315.data.guint32.min = 0x00000000; /* - * PROP_CQ_DEBUG: + * PROP_DHT_LOOKUP_DEBUG: * * General data: */ - gnet_property->props316.name = "cq_debug"; - gnet_property->props316.desc = _("Debug level for the callout queue."); - gnet_property->props316.ev_changed = event_new("cq_debug_changed"); + gnet_property->props316.name = "dht_lookup_debug"; + gnet_property->props316.desc = _("Debug level for DHT node lookups."); + gnet_property->props316.ev_changed = event_new("dht_lookup_debug_changed"); gnet_property->props316.save = TRUE; + gnet_property->props316.internal = FALSE; gnet_property->props316.vector_size = 1; + mutex_init(&gnet_property->props316.lock); /* Type specific data: */ gnet_property->props316.type = PROP_TYPE_GUINT32; - gnet_property->props316.data.guint32.def = (void *) &gnet_property_variable_cq_debug_default; - gnet_property->props316.data.guint32.value = (void *) &gnet_property_variable_cq_debug; + gnet_property->props316.data.guint32.def = (void *) &gnet_property_variable_dht_lookup_debug_default; + gnet_property->props316.data.guint32.value = (void *) &gnet_property_variable_dht_lookup_debug; gnet_property->props316.data.guint32.choices = NULL; gnet_property->props316.data.guint32.max = 0xFFFFFFFF; gnet_property->props316.data.guint32.min = 0x00000000; /* - * PROP_DHT_LOOKUP_DEBUG: + * PROP_DHT_STORAGE_DEBUG: * * General data: */ - gnet_property->props317.name = "dht_lookup_debug"; - gnet_property->props317.desc = _("Debug level for DHT node lookups."); - gnet_property->props317.ev_changed = event_new("dht_lookup_debug_changed"); + gnet_property->props317.name = "dht_storage_debug"; + gnet_property->props317.desc = _("Debug level for DHT key/value storage."); + gnet_property->props317.ev_changed = event_new("dht_storage_debug_changed"); gnet_property->props317.save = TRUE; + gnet_property->props317.internal = FALSE; gnet_property->props317.vector_size = 1; + mutex_init(&gnet_property->props317.lock); /* Type specific data: */ gnet_property->props317.type = PROP_TYPE_GUINT32; - gnet_property->props317.data.guint32.def = (void *) &gnet_property_variable_dht_lookup_debug_default; - gnet_property->props317.data.guint32.value = (void *) &gnet_property_variable_dht_lookup_debug; + gnet_property->props317.data.guint32.def = (void *) &gnet_property_variable_dht_storage_debug_default; + gnet_property->props317.data.guint32.value = (void *) &gnet_property_variable_dht_storage_debug; gnet_property->props317.data.guint32.choices = NULL; gnet_property->props317.data.guint32.max = 0xFFFFFFFF; gnet_property->props317.data.guint32.min = 0x00000000; /* - * PROP_DHT_STORAGE_DEBUG: + * PROP_DHT_PUBLISH_DEBUG: * * General data: */ - gnet_property->props318.name = "dht_storage_debug"; - gnet_property->props318.desc = _("Debug level for DHT key/value storage."); - gnet_property->props318.ev_changed = event_new("dht_storage_debug_changed"); + gnet_property->props318.name = "dht_publish_debug"; + gnet_property->props318.desc = _("Debug level for DHT key/value publishing."); + gnet_property->props318.ev_changed = event_new("dht_publish_debug_changed"); gnet_property->props318.save = TRUE; + gnet_property->props318.internal = FALSE; gnet_property->props318.vector_size = 1; + mutex_init(&gnet_property->props318.lock); /* Type specific data: */ gnet_property->props318.type = PROP_TYPE_GUINT32; - gnet_property->props318.data.guint32.def = (void *) &gnet_property_variable_dht_storage_debug_default; - gnet_property->props318.data.guint32.value = (void *) &gnet_property_variable_dht_storage_debug; + gnet_property->props318.data.guint32.def = (void *) &gnet_property_variable_dht_publish_debug_default; + gnet_property->props318.data.guint32.value = (void *) &gnet_property_variable_dht_publish_debug; gnet_property->props318.data.guint32.choices = NULL; gnet_property->props318.data.guint32.max = 0xFFFFFFFF; gnet_property->props318.data.guint32.min = 0x00000000; /* - * PROP_DHT_PUBLISH_DEBUG: + * PROP_BW_DHT_LOOKUP_OUT: * * General data: */ - gnet_property->props319.name = "dht_publish_debug"; - gnet_property->props319.desc = _("Debug level for DHT key/value publishing."); - gnet_property->props319.ev_changed = event_new("dht_publish_debug_changed"); + gnet_property->props319.name = "output_dht_lookup_bandwidth"; + gnet_property->props319.desc = _("Bandwidth hint for DHT user lookups, in bytes/sec. This is used both for limiting concurrent publishing and searching. Traffic is made on the Gnutella UDP socket. Output needs are lower than input (between 3 to 5 times less). The larger the numbers, the more values can be looked up concurrently, but the more bandwidth is used."); + gnet_property->props319.ev_changed = event_new("bw_dht_lookup_out_changed"); gnet_property->props319.save = TRUE; + gnet_property->props319.internal = FALSE; gnet_property->props319.vector_size = 1; + mutex_init(&gnet_property->props319.lock); /* Type specific data: */ gnet_property->props319.type = PROP_TYPE_GUINT32; - gnet_property->props319.data.guint32.def = (void *) &gnet_property_variable_dht_publish_debug_default; - gnet_property->props319.data.guint32.value = (void *) &gnet_property_variable_dht_publish_debug; + gnet_property->props319.data.guint32.def = (void *) &gnet_property_variable_bw_dht_lookup_out_default; + gnet_property->props319.data.guint32.value = (void *) &gnet_property_variable_bw_dht_lookup_out; gnet_property->props319.data.guint32.choices = NULL; - gnet_property->props319.data.guint32.max = 0xFFFFFFFF; - gnet_property->props319.data.guint32.min = 0x00000000; + gnet_property->props319.data.guint32.max = BS_BW_MAX; + gnet_property->props319.data.guint32.min = 512; /* - * PROP_BW_DHT_LOOKUP_OUT: + * PROP_BW_DHT_LOOKUP_IN: * * General data: */ - gnet_property->props320.name = "output_dht_lookup_bandwidth"; - gnet_property->props320.desc = _("Bandwidth hint for DHT user lookups, in bytes/sec. This is used both for limiting concurrent publishing and searching. Traffic is made on the Gnutella UDP socket. Output needs are lower than input (between 3 to 5 times less). The larger the numbers, the more values can be looked up concurrently, but the more bandwidth is used."); - gnet_property->props320.ev_changed = event_new("bw_dht_lookup_out_changed"); + gnet_property->props320.name = "input_dht_lookup_bandwidth"; + gnet_property->props320.desc = _("Bandwidth hint for DHT user lookups, in bytes/sec. This is used both for limiting concurrent publishing and searching. Traffic is made on the Gnutella UDP socket and cannot therefore be truly controlled. Input needs are much larger than output as far as lookups are concerned (between 3 to 5 times). The larger the numbers the more values can be looked up concurrently, but the more bandwidth is used."); + gnet_property->props320.ev_changed = event_new("bw_dht_lookup_in_changed"); gnet_property->props320.save = TRUE; + gnet_property->props320.internal = FALSE; gnet_property->props320.vector_size = 1; + mutex_init(&gnet_property->props320.lock); /* Type specific data: */ gnet_property->props320.type = PROP_TYPE_GUINT32; - gnet_property->props320.data.guint32.def = (void *) &gnet_property_variable_bw_dht_lookup_out_default; - gnet_property->props320.data.guint32.value = (void *) &gnet_property_variable_bw_dht_lookup_out; + gnet_property->props320.data.guint32.def = (void *) &gnet_property_variable_bw_dht_lookup_in_default; + gnet_property->props320.data.guint32.value = (void *) &gnet_property_variable_bw_dht_lookup_in; gnet_property->props320.data.guint32.choices = NULL; gnet_property->props320.data.guint32.max = BS_BW_MAX; - gnet_property->props320.data.guint32.min = 512; + gnet_property->props320.data.guint32.min = 2048; /* - * PROP_BW_DHT_LOOKUP_IN: + * PROP_STICKY_GUID: * * General data: */ - gnet_property->props321.name = "input_dht_lookup_bandwidth"; - gnet_property->props321.desc = _("Bandwidth hint for DHT user lookups, in bytes/sec. This is used both for limiting concurrent publishing and searching. Traffic is made on the Gnutella UDP socket and cannot therefore be truly controlled. Input needs are much larger than output as far as lookups are concerned (between 3 to 5 times). The larger the numbers the more values can be looked up concurrently, but the more bandwidth is used."); - gnet_property->props321.ev_changed = event_new("bw_dht_lookup_in_changed"); + gnet_property->props321.name = "sticky_guid"; + gnet_property->props321.desc = _("Whether the GUID should be kept accross sessions. A sticky GUID can be helpful if you are firewalled and share files because the downloaders will be able to contact you again more easily when you come back online."); + gnet_property->props321.ev_changed = event_new("sticky_guid_changed"); gnet_property->props321.save = TRUE; + gnet_property->props321.internal = FALSE; gnet_property->props321.vector_size = 1; + mutex_init(&gnet_property->props321.lock); /* Type specific data: */ - gnet_property->props321.type = PROP_TYPE_GUINT32; - gnet_property->props321.data.guint32.def = (void *) &gnet_property_variable_bw_dht_lookup_in_default; - gnet_property->props321.data.guint32.value = (void *) &gnet_property_variable_bw_dht_lookup_in; - gnet_property->props321.data.guint32.choices = NULL; - gnet_property->props321.data.guint32.max = BS_BW_MAX; - gnet_property->props321.data.guint32.min = 2048; + gnet_property->props321.type = PROP_TYPE_BOOLEAN; + gnet_property->props321.data.boolean.def = (void *) &gnet_property_variable_sticky_guid_default; + gnet_property->props321.data.boolean.value = (void *) &gnet_property_variable_sticky_guid; /* - * PROP_STICKY_GUID: + * PROP_STICKY_KUID: * * General data: */ - gnet_property->props322.name = "sticky_guid"; - gnet_property->props322.desc = _("Whether the GUID should be kept accross sessions. A sticky GUID can be helpful if you are firewalled and share files because the downloaders will be able to contact you again more easily when you come back online."); - gnet_property->props322.ev_changed = event_new("sticky_guid_changed"); + gnet_property->props322.name = "sticky_kuid"; + gnet_property->props322.desc = _("Whether the KUID should be kept accross sessions. A sticky KUID is helpful for the DHT because it promotes routing table stability and ensures that closest nodes will keep mutual knowledge about each other"); + gnet_property->props322.ev_changed = event_new("sticky_kuid_changed"); gnet_property->props322.save = TRUE; + gnet_property->props322.internal = FALSE; gnet_property->props322.vector_size = 1; + mutex_init(&gnet_property->props322.lock); /* Type specific data: */ gnet_property->props322.type = PROP_TYPE_BOOLEAN; - gnet_property->props322.data.boolean.def = (void *) &gnet_property_variable_sticky_guid_default; - gnet_property->props322.data.boolean.value = (void *) &gnet_property_variable_sticky_guid; + gnet_property->props322.data.boolean.def = (void *) &gnet_property_variable_sticky_kuid_default; + gnet_property->props322.data.boolean.value = (void *) &gnet_property_variable_sticky_kuid; /* - * PROP_STICKY_KUID: + * PROP_DHT_ULQ_DEBUG: * * General data: */ - gnet_property->props323.name = "sticky_kuid"; - gnet_property->props323.desc = _("Whether the KUID should be kept accross sessions. A sticky KUID is helpful for the DHT because it promotes routing table stability and ensures that closest nodes will keep mutual knowledge about each other"); - gnet_property->props323.ev_changed = event_new("sticky_kuid_changed"); + gnet_property->props323.name = "dht_ulq_debug"; + gnet_property->props323.desc = _("Debug level for the DHT user lookup queue."); + gnet_property->props323.ev_changed = event_new("dht_ulq_debug_changed"); gnet_property->props323.save = TRUE; + gnet_property->props323.internal = FALSE; gnet_property->props323.vector_size = 1; + mutex_init(&gnet_property->props323.lock); /* Type specific data: */ - gnet_property->props323.type = PROP_TYPE_BOOLEAN; - gnet_property->props323.data.boolean.def = (void *) &gnet_property_variable_sticky_kuid_default; - gnet_property->props323.data.boolean.value = (void *) &gnet_property_variable_sticky_kuid; + gnet_property->props323.type = PROP_TYPE_GUINT32; + gnet_property->props323.data.guint32.def = (void *) &gnet_property_variable_dht_ulq_debug_default; + gnet_property->props323.data.guint32.value = (void *) &gnet_property_variable_dht_ulq_debug; + gnet_property->props323.data.guint32.choices = NULL; + gnet_property->props323.data.guint32.max = 0xFFFFFFFF; + gnet_property->props323.data.guint32.min = 0x00000000; /* - * PROP_DHT_ULQ_DEBUG: + * PROP_DHT_STORAGE_IN_MEMORY: * * General data: */ - gnet_property->props324.name = "dht_ulq_debug"; - gnet_property->props324.desc = _("Debug level for the DHT user lookup queue."); - gnet_property->props324.ev_changed = event_new("dht_ulq_debug_changed"); + gnet_property->props324.name = "dht_storage_in_memory"; + gnet_property->props324.desc = _("If TRUE, DHT storage uses memory instead of diskspace."); + gnet_property->props324.ev_changed = event_new("dht_storage_in_memory_changed"); gnet_property->props324.save = TRUE; + gnet_property->props324.internal = FALSE; gnet_property->props324.vector_size = 1; + mutex_init(&gnet_property->props324.lock); /* Type specific data: */ - gnet_property->props324.type = PROP_TYPE_GUINT32; - gnet_property->props324.data.guint32.def = (void *) &gnet_property_variable_dht_ulq_debug_default; - gnet_property->props324.data.guint32.value = (void *) &gnet_property_variable_dht_ulq_debug; - gnet_property->props324.data.guint32.choices = NULL; - gnet_property->props324.data.guint32.max = 0xFFFFFFFF; - gnet_property->props324.data.guint32.min = 0x00000000; + gnet_property->props324.type = PROP_TYPE_BOOLEAN; + gnet_property->props324.data.boolean.def = (void *) &gnet_property_variable_dht_storage_in_memory_default; + gnet_property->props324.data.boolean.value = (void *) &gnet_property_variable_dht_storage_in_memory; /* - * PROP_DHT_STORAGE_IN_MEMORY: + * PROP_DOWNLOAD_TRACE: * * General data: */ - gnet_property->props325.name = "dht_storage_in_memory"; - gnet_property->props325.desc = _("If TRUE, DHT storage uses memory instead of diskspace."); - gnet_property->props325.ev_changed = event_new("dht_storage_in_memory_changed"); + gnet_property->props325.name = "download_trace"; + gnet_property->props325.desc = _("Defines which download HTTP header exchanges should be traced."); + gnet_property->props325.ev_changed = event_new("download_trace_changed"); gnet_property->props325.save = TRUE; + gnet_property->props325.internal = FALSE; gnet_property->props325.vector_size = 1; + mutex_init(&gnet_property->props325.lock); /* Type specific data: */ - gnet_property->props325.type = PROP_TYPE_BOOLEAN; - gnet_property->props325.data.boolean.def = (void *) &gnet_property_variable_dht_storage_in_memory_default; - gnet_property->props325.data.boolean.value = (void *) &gnet_property_variable_dht_storage_in_memory; + gnet_property->props325.type = PROP_TYPE_MULTICHOICE; + gnet_property->props325.data.guint32.def = (void *) &gnet_property_variable_download_trace_default; + gnet_property->props325.data.guint32.value = (void *) &gnet_property_variable_download_trace; + gnet_property->props325.data.guint32.max = 0xFFFFFFFF; + gnet_property->props325.data.guint32.min = 0x00000000; + gnet_property->props325.data.guint32.choices = (void *) &gnet_property_variable_download_trace_choices; /* - * PROP_DOWNLOAD_TRACE: + * PROP_UPLOAD_TRACE: * * General data: */ - gnet_property->props326.name = "download_trace"; - gnet_property->props326.desc = _("Defines which download HTTP header exchanges should be traced."); - gnet_property->props326.ev_changed = event_new("download_trace_changed"); + gnet_property->props326.name = "upload_trace"; + gnet_property->props326.desc = _("Defines which upload HTTP header exchanges should be traced."); + gnet_property->props326.ev_changed = event_new("upload_trace_changed"); gnet_property->props326.save = TRUE; + gnet_property->props326.internal = FALSE; gnet_property->props326.vector_size = 1; + mutex_init(&gnet_property->props326.lock); /* Type specific data: */ gnet_property->props326.type = PROP_TYPE_MULTICHOICE; - gnet_property->props326.data.guint32.def = (void *) &gnet_property_variable_download_trace_default; - gnet_property->props326.data.guint32.value = (void *) &gnet_property_variable_download_trace; + gnet_property->props326.data.guint32.def = (void *) &gnet_property_variable_upload_trace_default; + gnet_property->props326.data.guint32.value = (void *) &gnet_property_variable_upload_trace; gnet_property->props326.data.guint32.max = 0xFFFFFFFF; gnet_property->props326.data.guint32.min = 0x00000000; - gnet_property->props326.data.guint32.choices = (void *) &gnet_property_variable_download_trace_choices; + gnet_property->props326.data.guint32.choices = (void *) &gnet_property_variable_upload_trace_choices; /* - * PROP_UPLOAD_TRACE: + * PROP_GNET_TRACE: * * General data: */ - gnet_property->props327.name = "upload_trace"; - gnet_property->props327.desc = _("Defines which upload HTTP header exchanges should be traced."); - gnet_property->props327.ev_changed = event_new("upload_trace_changed"); + gnet_property->props327.name = "gnet_trace"; + gnet_property->props327.desc = _("Defines which Gnutella header exchanges should be traced."); + gnet_property->props327.ev_changed = event_new("gnet_trace_changed"); gnet_property->props327.save = TRUE; + gnet_property->props327.internal = FALSE; gnet_property->props327.vector_size = 1; + mutex_init(&gnet_property->props327.lock); /* Type specific data: */ gnet_property->props327.type = PROP_TYPE_MULTICHOICE; - gnet_property->props327.data.guint32.def = (void *) &gnet_property_variable_upload_trace_default; - gnet_property->props327.data.guint32.value = (void *) &gnet_property_variable_upload_trace; + gnet_property->props327.data.guint32.def = (void *) &gnet_property_variable_gnet_trace_default; + gnet_property->props327.data.guint32.value = (void *) &gnet_property_variable_gnet_trace; gnet_property->props327.data.guint32.max = 0xFFFFFFFF; gnet_property->props327.data.guint32.min = 0x00000000; - gnet_property->props327.data.guint32.choices = (void *) &gnet_property_variable_upload_trace_choices; + gnet_property->props327.data.guint32.choices = (void *) &gnet_property_variable_gnet_trace_choices; /* - * PROP_GNET_TRACE: + * PROP_PUSH_PROXY_TRACE: * * General data: */ - gnet_property->props328.name = "gnet_trace"; - gnet_property->props328.desc = _("Defines which Gnutella header exchanges should be traced."); - gnet_property->props328.ev_changed = event_new("gnet_trace_changed"); + gnet_property->props328.name = "push_proxy_trace"; + gnet_property->props328.desc = _("Defines which push-proxy HTTP header exchanges should be traced."); + gnet_property->props328.ev_changed = event_new("push_proxy_trace_changed"); gnet_property->props328.save = TRUE; + gnet_property->props328.internal = FALSE; gnet_property->props328.vector_size = 1; + mutex_init(&gnet_property->props328.lock); /* Type specific data: */ gnet_property->props328.type = PROP_TYPE_MULTICHOICE; - gnet_property->props328.data.guint32.def = (void *) &gnet_property_variable_gnet_trace_default; - gnet_property->props328.data.guint32.value = (void *) &gnet_property_variable_gnet_trace; + gnet_property->props328.data.guint32.def = (void *) &gnet_property_variable_push_proxy_trace_default; + gnet_property->props328.data.guint32.value = (void *) &gnet_property_variable_push_proxy_trace; gnet_property->props328.data.guint32.max = 0xFFFFFFFF; gnet_property->props328.data.guint32.min = 0x00000000; - gnet_property->props328.data.guint32.choices = (void *) &gnet_property_variable_gnet_trace_choices; + gnet_property->props328.data.guint32.choices = (void *) &gnet_property_variable_push_proxy_trace_choices; /* - * PROP_PUSH_PROXY_TRACE: + * PROP_HTTP_TRACE: * * General data: */ - gnet_property->props329.name = "push_proxy_trace"; - gnet_property->props329.desc = _("Defines which push-proxy HTTP header exchanges should be traced."); - gnet_property->props329.ev_changed = event_new("push_proxy_trace_changed"); + gnet_property->props329.name = "http_trace"; + gnet_property->props329.desc = _("Defines which HTTP header exchanges should be traced, other than downloads, uploads and push-proxy exchanges."); + gnet_property->props329.ev_changed = event_new("http_trace_changed"); gnet_property->props329.save = TRUE; + gnet_property->props329.internal = FALSE; gnet_property->props329.vector_size = 1; + mutex_init(&gnet_property->props329.lock); /* Type specific data: */ gnet_property->props329.type = PROP_TYPE_MULTICHOICE; - gnet_property->props329.data.guint32.def = (void *) &gnet_property_variable_push_proxy_trace_default; - gnet_property->props329.data.guint32.value = (void *) &gnet_property_variable_push_proxy_trace; + gnet_property->props329.data.guint32.def = (void *) &gnet_property_variable_http_trace_default; + gnet_property->props329.data.guint32.value = (void *) &gnet_property_variable_http_trace; gnet_property->props329.data.guint32.max = 0xFFFFFFFF; gnet_property->props329.data.guint32.min = 0x00000000; - gnet_property->props329.data.guint32.choices = (void *) &gnet_property_variable_push_proxy_trace_choices; + gnet_property->props329.data.guint32.choices = (void *) &gnet_property_variable_http_trace_choices; /* - * PROP_HTTP_TRACE: + * PROP_VERIFY_DEBUG: * * General data: */ - gnet_property->props330.name = "http_trace"; - gnet_property->props330.desc = _("Defines which HTTP header exchanges should be traced, other than downloads, uploads and push-proxy exchanges."); - gnet_property->props330.ev_changed = event_new("http_trace_changed"); + gnet_property->props330.name = "verify_debug"; + gnet_property->props330.desc = _("Debug level for (generic) file verification code."); + gnet_property->props330.ev_changed = event_new("verify_debug_changed"); gnet_property->props330.save = TRUE; + gnet_property->props330.internal = FALSE; gnet_property->props330.vector_size = 1; + mutex_init(&gnet_property->props330.lock); /* Type specific data: */ - gnet_property->props330.type = PROP_TYPE_MULTICHOICE; - gnet_property->props330.data.guint32.def = (void *) &gnet_property_variable_http_trace_default; - gnet_property->props330.data.guint32.value = (void *) &gnet_property_variable_http_trace; + gnet_property->props330.type = PROP_TYPE_GUINT32; + gnet_property->props330.data.guint32.def = (void *) &gnet_property_variable_verify_debug_default; + gnet_property->props330.data.guint32.value = (void *) &gnet_property_variable_verify_debug; + gnet_property->props330.data.guint32.choices = NULL; gnet_property->props330.data.guint32.max = 0xFFFFFFFF; gnet_property->props330.data.guint32.min = 0x00000000; - gnet_property->props330.data.guint32.choices = (void *) &gnet_property_variable_http_trace_choices; /* - * PROP_VERIFY_DEBUG: + * PROP_LOCAL_ADDR_CACHE_MAX_HOSTS: * * General data: */ - gnet_property->props331.name = "verify_debug"; - gnet_property->props331.desc = _("Debug level for (generic) file verification code."); - gnet_property->props331.ev_changed = event_new("verify_debug_changed"); + gnet_property->props331.name = "local_addr_cache_max_hosts"; + gnet_property->props331.desc = _("Maximum number of hosts in the local address cache, which remembers the recent IP:port combinations we had."); + gnet_property->props331.ev_changed = event_new("local_addr_cache_max_hosts_changed"); gnet_property->props331.save = TRUE; + gnet_property->props331.internal = FALSE; gnet_property->props331.vector_size = 1; + mutex_init(&gnet_property->props331.lock); /* Type specific data: */ gnet_property->props331.type = PROP_TYPE_GUINT32; - gnet_property->props331.data.guint32.def = (void *) &gnet_property_variable_verify_debug_default; - gnet_property->props331.data.guint32.value = (void *) &gnet_property_variable_verify_debug; + gnet_property->props331.data.guint32.def = (void *) &gnet_property_variable_local_addr_cache_max_hosts_default; + gnet_property->props331.data.guint32.value = (void *) &gnet_property_variable_local_addr_cache_max_hosts; gnet_property->props331.data.guint32.choices = NULL; - gnet_property->props331.data.guint32.max = 0xFFFFFFFF; - gnet_property->props331.data.guint32.min = 0x00000000; + gnet_property->props331.data.guint32.max = 100; + gnet_property->props331.data.guint32.min = 1; /* - * PROP_LOCAL_ADDR_CACHE_MAX_HOSTS: + * PROP_LOCAL_ADDR_CACHE_MAX_TIME: * * General data: */ - gnet_property->props332.name = "local_addr_cache_max_hosts"; - gnet_property->props332.desc = _("Maximum number of hosts in the local address cache, which remembers the recent IP:port combinations we had."); - gnet_property->props332.ev_changed = event_new("local_addr_cache_max_hosts_changed"); + gnet_property->props332.name = "local_addr_cache_max_time"; + gnet_property->props332.desc = _("Maximum time before removing hosts from the local address cache, which remembers the recent IP:port combinations we had."); + gnet_property->props332.ev_changed = event_new("local_addr_cache_max_time_changed"); gnet_property->props332.save = TRUE; + gnet_property->props332.internal = FALSE; gnet_property->props332.vector_size = 1; + mutex_init(&gnet_property->props332.lock); /* Type specific data: */ gnet_property->props332.type = PROP_TYPE_GUINT32; - gnet_property->props332.data.guint32.def = (void *) &gnet_property_variable_local_addr_cache_max_hosts_default; - gnet_property->props332.data.guint32.value = (void *) &gnet_property_variable_local_addr_cache_max_hosts; + gnet_property->props332.data.guint32.def = (void *) &gnet_property_variable_local_addr_cache_max_time_default; + gnet_property->props332.data.guint32.value = (void *) &gnet_property_variable_local_addr_cache_max_time; gnet_property->props332.data.guint32.choices = NULL; - gnet_property->props332.data.guint32.max = 100; - gnet_property->props332.data.guint32.min = 1; + gnet_property->props332.data.guint32.max = 2592000; + gnet_property->props332.data.guint32.min = 86400; /* - * PROP_LOCAL_ADDR_CACHE_MAX_TIME: + * PROP_LOCAL_ADDR_DEBUG: * * General data: */ - gnet_property->props333.name = "local_addr_cache_max_time"; - gnet_property->props333.desc = _("Maximum time before removing hosts from the local address cache, which remembers the recent IP:port combinations we had."); - gnet_property->props333.ev_changed = event_new("local_addr_cache_max_time_changed"); + gnet_property->props333.name = "local_addr_debug"; + gnet_property->props333.desc = _("Debug level for management of local address cache."); + gnet_property->props333.ev_changed = event_new("local_addr_debug_changed"); gnet_property->props333.save = TRUE; + gnet_property->props333.internal = FALSE; gnet_property->props333.vector_size = 1; + mutex_init(&gnet_property->props333.lock); /* Type specific data: */ gnet_property->props333.type = PROP_TYPE_GUINT32; - gnet_property->props333.data.guint32.def = (void *) &gnet_property_variable_local_addr_cache_max_time_default; - gnet_property->props333.data.guint32.value = (void *) &gnet_property_variable_local_addr_cache_max_time; + gnet_property->props333.data.guint32.def = (void *) &gnet_property_variable_local_addr_debug_default; + gnet_property->props333.data.guint32.value = (void *) &gnet_property_variable_local_addr_debug; gnet_property->props333.data.guint32.choices = NULL; - gnet_property->props333.data.guint32.max = 2592000; - gnet_property->props333.data.guint32.min = 86400; + gnet_property->props333.data.guint32.max = 20; + gnet_property->props333.data.guint32.min = 0; /* - * PROP_LOCAL_ADDR_DEBUG: + * PROP_DUMP_TRANSMITTED_GNUTELLA_PACKETS: * * General data: */ - gnet_property->props334.name = "local_addr_debug"; - gnet_property->props334.desc = _("Debug level for management of local address cache."); - gnet_property->props334.ev_changed = event_new("local_addr_debug_changed"); - gnet_property->props334.save = TRUE; + gnet_property->props334.name = "dump_transmitted_gnutella_packets"; + gnet_property->props334.desc = _("If enabled, all packets enqueued for transmission are dumped to $GTK_GNUTELLA_DIR/packets_tx.dump."); + gnet_property->props334.ev_changed = event_new("dump_transmitted_gnutella_packets_changed"); + gnet_property->props334.save = FALSE; + gnet_property->props334.internal = FALSE; gnet_property->props334.vector_size = 1; + mutex_init(&gnet_property->props334.lock); /* Type specific data: */ - gnet_property->props334.type = PROP_TYPE_GUINT32; - gnet_property->props334.data.guint32.def = (void *) &gnet_property_variable_local_addr_debug_default; - gnet_property->props334.data.guint32.value = (void *) &gnet_property_variable_local_addr_debug; - gnet_property->props334.data.guint32.choices = NULL; - gnet_property->props334.data.guint32.max = 20; - gnet_property->props334.data.guint32.min = 0; + gnet_property->props334.type = PROP_TYPE_BOOLEAN; + gnet_property->props334.data.boolean.def = (void *) &gnet_property_variable_dump_transmitted_gnutella_packets_default; + gnet_property->props334.data.boolean.value = (void *) &gnet_property_variable_dump_transmitted_gnutella_packets; /* - * PROP_DUMP_TRANSMITTED_GNUTELLA_PACKETS: + * PROP_MQ_TCP_DEBUG: * * General data: */ - gnet_property->props335.name = "dump_transmitted_gnutella_packets"; - gnet_property->props335.desc = _("If enabled, all packets enqueued for transmission are dumped to $GTK_GNUTELLA_DIR/packets_tx.dump."); - gnet_property->props335.ev_changed = event_new("dump_transmitted_gnutella_packets_changed"); - gnet_property->props335.save = FALSE; + gnet_property->props335.name = "mq_tcp_debug"; + gnet_property->props335.desc = _("Debug level the TCP message queues"); + gnet_property->props335.ev_changed = event_new("mq_tcp_debug_changed"); + gnet_property->props335.save = TRUE; + gnet_property->props335.internal = FALSE; gnet_property->props335.vector_size = 1; + mutex_init(&gnet_property->props335.lock); /* Type specific data: */ - gnet_property->props335.type = PROP_TYPE_BOOLEAN; - gnet_property->props335.data.boolean.def = (void *) &gnet_property_variable_dump_transmitted_gnutella_packets_default; - gnet_property->props335.data.boolean.value = (void *) &gnet_property_variable_dump_transmitted_gnutella_packets; + gnet_property->props335.type = PROP_TYPE_GUINT32; + gnet_property->props335.data.guint32.def = (void *) &gnet_property_variable_mq_tcp_debug_default; + gnet_property->props335.data.guint32.value = (void *) &gnet_property_variable_mq_tcp_debug; + gnet_property->props335.data.guint32.choices = NULL; + gnet_property->props335.data.guint32.max = 20; + gnet_property->props335.data.guint32.min = 0; /* - * PROP_MQ_TCP_DEBUG: + * PROP_MQ_UDP_DEBUG: * * General data: */ - gnet_property->props336.name = "mq_tcp_debug"; - gnet_property->props336.desc = _("Debug level the TCP message queues"); - gnet_property->props336.ev_changed = event_new("mq_tcp_debug_changed"); + gnet_property->props336.name = "mq_udp_debug"; + gnet_property->props336.desc = _("Debug level for the UDP message queue."); + gnet_property->props336.ev_changed = event_new("mq_udp_debug_changed"); gnet_property->props336.save = TRUE; + gnet_property->props336.internal = FALSE; gnet_property->props336.vector_size = 1; + mutex_init(&gnet_property->props336.lock); /* Type specific data: */ gnet_property->props336.type = PROP_TYPE_GUINT32; - gnet_property->props336.data.guint32.def = (void *) &gnet_property_variable_mq_tcp_debug_default; - gnet_property->props336.data.guint32.value = (void *) &gnet_property_variable_mq_tcp_debug; + gnet_property->props336.data.guint32.def = (void *) &gnet_property_variable_mq_udp_debug_default; + gnet_property->props336.data.guint32.value = (void *) &gnet_property_variable_mq_udp_debug; gnet_property->props336.data.guint32.choices = NULL; gnet_property->props336.data.guint32.max = 20; gnet_property->props336.data.guint32.min = 0; /* - * PROP_MQ_UDP_DEBUG: + * PROP_NODE_UDP_SENDQUEUE_SIZE: * * General data: */ - gnet_property->props337.name = "mq_udp_debug"; - gnet_property->props337.desc = _("Debug level for the UDP message queue."); - gnet_property->props337.ev_changed = event_new("mq_udp_debug_changed"); + gnet_property->props337.name = "node_udp_sendqueue_size"; + gnet_property->props337.desc = _("Maximum size of the UDP message queue (in bytes). Must be at least 150 percent of the maximum message size."); + gnet_property->props337.ev_changed = event_new("node_udp_sendqueue_size_changed"); gnet_property->props337.save = TRUE; + gnet_property->props337.internal = FALSE; gnet_property->props337.vector_size = 1; + mutex_init(&gnet_property->props337.lock); /* Type specific data: */ gnet_property->props337.type = PROP_TYPE_GUINT32; - gnet_property->props337.data.guint32.def = (void *) &gnet_property_variable_mq_udp_debug_default; - gnet_property->props337.data.guint32.value = (void *) &gnet_property_variable_mq_udp_debug; + gnet_property->props337.data.guint32.def = (void *) &gnet_property_variable_node_udp_sendqueue_size_default; + gnet_property->props337.data.guint32.value = (void *) &gnet_property_variable_node_udp_sendqueue_size; gnet_property->props337.data.guint32.choices = NULL; - gnet_property->props337.data.guint32.max = 20; - gnet_property->props337.data.guint32.min = 0; + gnet_property->props337.data.guint32.max = 256000; + gnet_property->props337.data.guint32.min = 98304; /* - * PROP_NODE_UDP_SENDQUEUE_SIZE: + * PROP_CLOCK_DEBUG: * * General data: */ - gnet_property->props338.name = "node_udp_sendqueue_size"; - gnet_property->props338.desc = _("Maximum size of the UDP message queue (in bytes). Must be at least 150 percent of the maximum message size."); - gnet_property->props338.ev_changed = event_new("node_udp_sendqueue_size_changed"); + gnet_property->props338.name = "clock_debug"; + gnet_property->props338.desc = _("Debug level for the management of the clock accuracy."); + gnet_property->props338.ev_changed = event_new("clock_debug_changed"); gnet_property->props338.save = TRUE; + gnet_property->props338.internal = FALSE; gnet_property->props338.vector_size = 1; + mutex_init(&gnet_property->props338.lock); /* Type specific data: */ gnet_property->props338.type = PROP_TYPE_GUINT32; - gnet_property->props338.data.guint32.def = (void *) &gnet_property_variable_node_udp_sendqueue_size_default; - gnet_property->props338.data.guint32.value = (void *) &gnet_property_variable_node_udp_sendqueue_size; + gnet_property->props338.data.guint32.def = (void *) &gnet_property_variable_clock_debug_default; + gnet_property->props338.data.guint32.value = (void *) &gnet_property_variable_clock_debug; gnet_property->props338.data.guint32.choices = NULL; - gnet_property->props338.data.guint32.max = 256000; - gnet_property->props338.data.guint32.min = 98304; + gnet_property->props338.data.guint32.max = 20; + gnet_property->props338.data.guint32.min = 0; /* - * PROP_CLOCK_DEBUG: + * PROP_FW_DEBUG: * * General data: */ - gnet_property->props339.name = "clock_debug"; - gnet_property->props339.desc = _("Debug level for the management of the clock accuracy."); - gnet_property->props339.ev_changed = event_new("clock_debug_changed"); + gnet_property->props339.name = "fw_debug"; + gnet_property->props339.desc = _("Debug level for the firewalled status management."); + gnet_property->props339.ev_changed = event_new("fw_debug_changed"); gnet_property->props339.save = TRUE; + gnet_property->props339.internal = FALSE; gnet_property->props339.vector_size = 1; + mutex_init(&gnet_property->props339.lock); /* Type specific data: */ gnet_property->props339.type = PROP_TYPE_GUINT32; - gnet_property->props339.data.guint32.def = (void *) &gnet_property_variable_clock_debug_default; - gnet_property->props339.data.guint32.value = (void *) &gnet_property_variable_clock_debug; + gnet_property->props339.data.guint32.def = (void *) &gnet_property_variable_fw_debug_default; + gnet_property->props339.data.guint32.value = (void *) &gnet_property_variable_fw_debug; gnet_property->props339.data.guint32.choices = NULL; gnet_property->props339.data.guint32.max = 20; gnet_property->props339.data.guint32.min = 0; /* - * PROP_FW_DEBUG: + * PROP_HOST_DEBUG: * * General data: */ - gnet_property->props340.name = "fw_debug"; - gnet_property->props340.desc = _("Debug level for the firewalled status management."); - gnet_property->props340.ev_changed = event_new("fw_debug_changed"); + gnet_property->props340.name = "host_debug"; + gnet_property->props340.desc = _("Debug level for host management."); + gnet_property->props340.ev_changed = event_new("host_debug_changed"); gnet_property->props340.save = TRUE; + gnet_property->props340.internal = FALSE; gnet_property->props340.vector_size = 1; + mutex_init(&gnet_property->props340.lock); /* Type specific data: */ gnet_property->props340.type = PROP_TYPE_GUINT32; - gnet_property->props340.data.guint32.def = (void *) &gnet_property_variable_fw_debug_default; - gnet_property->props340.data.guint32.value = (void *) &gnet_property_variable_fw_debug; + gnet_property->props340.data.guint32.def = (void *) &gnet_property_variable_host_debug_default; + gnet_property->props340.data.guint32.value = (void *) &gnet_property_variable_host_debug; gnet_property->props340.data.guint32.choices = NULL; gnet_property->props340.data.guint32.max = 20; gnet_property->props340.data.guint32.min = 0; /* - * PROP_HOST_DEBUG: + * PROP_DHT_ROOTS_DEBUG: * * General data: */ - gnet_property->props341.name = "host_debug"; - gnet_property->props341.desc = _("Debug level for host management."); - gnet_property->props341.ev_changed = event_new("host_debug_changed"); + gnet_property->props341.name = "dht_roots_debug"; + gnet_property->props341.desc = _("Debug level for DHT root node caching."); + gnet_property->props341.ev_changed = event_new("dht_roots_debug_changed"); gnet_property->props341.save = TRUE; + gnet_property->props341.internal = FALSE; gnet_property->props341.vector_size = 1; + mutex_init(&gnet_property->props341.lock); /* Type specific data: */ gnet_property->props341.type = PROP_TYPE_GUINT32; - gnet_property->props341.data.guint32.def = (void *) &gnet_property_variable_host_debug_default; - gnet_property->props341.data.guint32.value = (void *) &gnet_property_variable_host_debug; + gnet_property->props341.data.guint32.def = (void *) &gnet_property_variable_dht_roots_debug_default; + gnet_property->props341.data.guint32.value = (void *) &gnet_property_variable_dht_roots_debug; gnet_property->props341.data.guint32.choices = NULL; - gnet_property->props341.data.guint32.max = 20; - gnet_property->props341.data.guint32.min = 0; + gnet_property->props341.data.guint32.max = 0xFFFFFFFF; + gnet_property->props341.data.guint32.min = 0x00000000; /* - * PROP_DHT_ROOTS_DEBUG: + * PROP_LIB_STATS: * * General data: */ - gnet_property->props342.name = "dht_roots_debug"; - gnet_property->props342.desc = _("Debug level for DHT root node caching."); - gnet_property->props342.ev_changed = event_new("dht_roots_debug_changed"); + gnet_property->props342.name = "lib_stats"; + gnet_property->props342.desc = _("Logged statistics level for code shared between GUI and core."); + gnet_property->props342.ev_changed = event_new("lib_stats_changed"); gnet_property->props342.save = TRUE; + gnet_property->props342.internal = FALSE; gnet_property->props342.vector_size = 1; + mutex_init(&gnet_property->props342.lock); /* Type specific data: */ gnet_property->props342.type = PROP_TYPE_GUINT32; - gnet_property->props342.data.guint32.def = (void *) &gnet_property_variable_dht_roots_debug_default; - gnet_property->props342.data.guint32.value = (void *) &gnet_property_variable_dht_roots_debug; + gnet_property->props342.data.guint32.def = (void *) &gnet_property_variable_lib_stats_default; + gnet_property->props342.data.guint32.value = (void *) &gnet_property_variable_lib_stats; gnet_property->props342.data.guint32.choices = NULL; gnet_property->props342.data.guint32.max = 0xFFFFFFFF; gnet_property->props342.data.guint32.min = 0x00000000; /* - * PROP_LIB_STATS: + * PROP_SPAM_LUT_IN_MEMORY: * * General data: */ - gnet_property->props343.name = "lib_stats"; - gnet_property->props343.desc = _("Logged statistics level for code shared between GUI and core."); - gnet_property->props343.ev_changed = event_new("lib_stats_changed"); + gnet_property->props343.name = "spam_lut_in_memory"; + gnet_property->props343.desc = _("If TRUE, the spam SHA1 database is kept in memory. If FALSE, it is kept in a fast disk database, which saves a large amount of core memory and reduces the overall footprint, at the cost of an increased I/O level. However, the DB cache has a 90 percent hit rate, so the actual overhead is barely noticeable when running as an ultra node and should remain completely unnoticed when running as a leaf."); + gnet_property->props343.ev_changed = event_new("spam_lut_in_memory_changed"); gnet_property->props343.save = TRUE; + gnet_property->props343.internal = FALSE; gnet_property->props343.vector_size = 1; + mutex_init(&gnet_property->props343.lock); /* Type specific data: */ - gnet_property->props343.type = PROP_TYPE_GUINT32; - gnet_property->props343.data.guint32.def = (void *) &gnet_property_variable_lib_stats_default; - gnet_property->props343.data.guint32.value = (void *) &gnet_property_variable_lib_stats; - gnet_property->props343.data.guint32.choices = NULL; - gnet_property->props343.data.guint32.max = 0xFFFFFFFF; - gnet_property->props343.data.guint32.min = 0x00000000; + gnet_property->props343.type = PROP_TYPE_BOOLEAN; + gnet_property->props343.data.boolean.def = (void *) &gnet_property_variable_spam_lut_in_memory_default; + gnet_property->props343.data.boolean.value = (void *) &gnet_property_variable_spam_lut_in_memory; /* - * PROP_SPAM_LUT_IN_MEMORY: + * PROP_SPAM_DEBUG: * * General data: */ - gnet_property->props344.name = "spam_lut_in_memory"; - gnet_property->props344.desc = _("If TRUE, the spam SHA1 database is kept in memory. If FALSE, it is kept in a fast disk database, which saves a large amount of core memory and reduces the overall footprint, at the cost of an increased I/O level. However, the DB cache has typically a 90% hit rate, so the actual overhead is barely noticeable when running as an ultra node and should remain completely unnoticed when running as a leaf."); - gnet_property->props344.ev_changed = event_new("spam_lut_in_memory_changed"); + gnet_property->props344.name = "spam_debug"; + gnet_property->props344.desc = _("Debug level for spam detection."); + gnet_property->props344.ev_changed = event_new("spam_debug_changed"); gnet_property->props344.save = TRUE; + gnet_property->props344.internal = FALSE; gnet_property->props344.vector_size = 1; + mutex_init(&gnet_property->props344.lock); /* Type specific data: */ - gnet_property->props344.type = PROP_TYPE_BOOLEAN; - gnet_property->props344.data.boolean.def = (void *) &gnet_property_variable_spam_lut_in_memory_default; - gnet_property->props344.data.boolean.value = (void *) &gnet_property_variable_spam_lut_in_memory; + gnet_property->props344.type = PROP_TYPE_GUINT32; + gnet_property->props344.data.guint32.def = (void *) &gnet_property_variable_spam_debug_default; + gnet_property->props344.data.guint32.value = (void *) &gnet_property_variable_spam_debug; + gnet_property->props344.data.guint32.choices = NULL; + gnet_property->props344.data.guint32.max = 20; + gnet_property->props344.data.guint32.min = 0; /* - * PROP_SPAM_DEBUG: + * PROP_LOCKFILE_DEBUG: * * General data: */ - gnet_property->props345.name = "spam_debug"; - gnet_property->props345.desc = _("Debug level for spam detection."); - gnet_property->props345.ev_changed = event_new("spam_debug_changed"); + gnet_property->props345.name = "lockfile_debug"; + gnet_property->props345.desc = _("Debug level for lockfile management."); + gnet_property->props345.ev_changed = event_new("lockfile_debug_changed"); gnet_property->props345.save = TRUE; + gnet_property->props345.internal = FALSE; gnet_property->props345.vector_size = 1; + mutex_init(&gnet_property->props345.lock); /* Type specific data: */ gnet_property->props345.type = PROP_TYPE_GUINT32; - gnet_property->props345.data.guint32.def = (void *) &gnet_property_variable_spam_debug_default; - gnet_property->props345.data.guint32.value = (void *) &gnet_property_variable_spam_debug; + gnet_property->props345.data.guint32.def = (void *) &gnet_property_variable_lockfile_debug_default; + gnet_property->props345.data.guint32.value = (void *) &gnet_property_variable_lockfile_debug; gnet_property->props345.data.guint32.choices = NULL; gnet_property->props345.data.guint32.max = 20; gnet_property->props345.data.guint32.min = 0; /* - * PROP_LOCKFILE_DEBUG: + * PROP_ZALLOC_DEBUG: * * General data: */ - gnet_property->props346.name = "lockfile_debug"; - gnet_property->props346.desc = _("Debug level for lockfile management."); - gnet_property->props346.ev_changed = event_new("lockfile_debug_changed"); + gnet_property->props346.name = "zalloc_debug"; + gnet_property->props346.desc = _("Debug level for the zone-based memory allocator."); + gnet_property->props346.ev_changed = event_new("zalloc_debug_changed"); gnet_property->props346.save = TRUE; + gnet_property->props346.internal = FALSE; gnet_property->props346.vector_size = 1; + mutex_init(&gnet_property->props346.lock); /* Type specific data: */ gnet_property->props346.type = PROP_TYPE_GUINT32; - gnet_property->props346.data.guint32.def = (void *) &gnet_property_variable_lockfile_debug_default; - gnet_property->props346.data.guint32.value = (void *) &gnet_property_variable_lockfile_debug; + gnet_property->props346.data.guint32.def = (void *) &gnet_property_variable_zalloc_debug_default; + gnet_property->props346.data.guint32.value = (void *) &gnet_property_variable_zalloc_debug; gnet_property->props346.data.guint32.choices = NULL; gnet_property->props346.data.guint32.max = 20; gnet_property->props346.data.guint32.min = 0; /* - * PROP_ZALLOC_DEBUG: + * PROP_PALLOC_DEBUG: * * General data: */ - gnet_property->props347.name = "zalloc_debug"; - gnet_property->props347.desc = _("Debug level for the zone-based memory allocator."); - gnet_property->props347.ev_changed = event_new("zalloc_debug_changed"); + gnet_property->props347.name = "palloc_debug"; + gnet_property->props347.desc = _("Debug level for the pool-based memory allocator."); + gnet_property->props347.ev_changed = event_new("palloc_debug_changed"); gnet_property->props347.save = TRUE; + gnet_property->props347.internal = FALSE; gnet_property->props347.vector_size = 1; + mutex_init(&gnet_property->props347.lock); /* Type specific data: */ gnet_property->props347.type = PROP_TYPE_GUINT32; - gnet_property->props347.data.guint32.def = (void *) &gnet_property_variable_zalloc_debug_default; - gnet_property->props347.data.guint32.value = (void *) &gnet_property_variable_zalloc_debug; + gnet_property->props347.data.guint32.def = (void *) &gnet_property_variable_palloc_debug_default; + gnet_property->props347.data.guint32.value = (void *) &gnet_property_variable_palloc_debug; gnet_property->props347.data.guint32.choices = NULL; gnet_property->props347.data.guint32.max = 20; gnet_property->props347.data.guint32.min = 0; /* - * PROP_PALLOC_DEBUG: + * PROP_RXBUF_DEBUG: * * General data: */ - gnet_property->props348.name = "palloc_debug"; - gnet_property->props348.desc = _("Debug level for the pool-based memory allocator."); - gnet_property->props348.ev_changed = event_new("palloc_debug_changed"); + gnet_property->props348.name = "rxbuf_debug"; + gnet_property->props348.desc = _("Debug level for the RX buffer allocator."); + gnet_property->props348.ev_changed = event_new("rxbuf_debug_changed"); gnet_property->props348.save = TRUE; + gnet_property->props348.internal = FALSE; gnet_property->props348.vector_size = 1; + mutex_init(&gnet_property->props348.lock); /* Type specific data: */ gnet_property->props348.type = PROP_TYPE_GUINT32; - gnet_property->props348.data.guint32.def = (void *) &gnet_property_variable_palloc_debug_default; - gnet_property->props348.data.guint32.value = (void *) &gnet_property_variable_palloc_debug; + gnet_property->props348.data.guint32.def = (void *) &gnet_property_variable_rxbuf_debug_default; + gnet_property->props348.data.guint32.value = (void *) &gnet_property_variable_rxbuf_debug; gnet_property->props348.data.guint32.choices = NULL; gnet_property->props348.data.guint32.max = 20; gnet_property->props348.data.guint32.min = 0; /* - * PROP_RXBUF_DEBUG: + * PROP_ZALLOC_ALWAYS_GC: * * General data: */ - gnet_property->props349.name = "rxbuf_debug"; - gnet_property->props349.desc = _("Debug level for the RX buffer allocator."); - gnet_property->props349.ev_changed = event_new("rxbuf_debug_changed"); + gnet_property->props349.name = "zalloc_always_gc"; + gnet_property->props349.desc = _("Whether the zone-based memory allocator should always keep the zones in garbage-collecting mode, thereby maximizing the chances of being able to quickly reclaim empty zones after an allocation burst. This causes a slight CPU overhead at block free time but the memory footprint will remain much lower. To further minimize the footprint, you can also set spam_lut_in_memory to FALSE."); + gnet_property->props349.ev_changed = event_new("zalloc_always_gc_changed"); gnet_property->props349.save = TRUE; + gnet_property->props349.internal = FALSE; gnet_property->props349.vector_size = 1; + mutex_init(&gnet_property->props349.lock); /* Type specific data: */ - gnet_property->props349.type = PROP_TYPE_GUINT32; - gnet_property->props349.data.guint32.def = (void *) &gnet_property_variable_rxbuf_debug_default; - gnet_property->props349.data.guint32.value = (void *) &gnet_property_variable_rxbuf_debug; - gnet_property->props349.data.guint32.choices = NULL; - gnet_property->props349.data.guint32.max = 20; - gnet_property->props349.data.guint32.min = 0; + gnet_property->props349.type = PROP_TYPE_BOOLEAN; + gnet_property->props349.data.boolean.def = (void *) &gnet_property_variable_zalloc_always_gc_default; + gnet_property->props349.data.boolean.value = (void *) &gnet_property_variable_zalloc_always_gc; /* - * PROP_ZALLOC_ALWAYS_GC: + * PROP_VMM_DEBUG: * * General data: */ - gnet_property->props350.name = "zalloc_always_gc"; - gnet_property->props350.desc = _("Whether the zone-based memory allocator should always keep the zones in garbage-collecting mode, thereby maximizing the chances of being able to quickly reclaim empty zones after an allocation burst. This causes a slight CPU overhead at block free time but the memory footprint will remain much lower. To further minimize the footprint, you can also set spam_lut_in_memory to FALSE."); - gnet_property->props350.ev_changed = event_new("zalloc_always_gc_changed"); + gnet_property->props350.name = "vmm_debug"; + gnet_property->props350.desc = _("Debug level for the virtual memory manager."); + gnet_property->props350.ev_changed = event_new("vmm_debug_changed"); gnet_property->props350.save = TRUE; + gnet_property->props350.internal = FALSE; gnet_property->props350.vector_size = 1; + mutex_init(&gnet_property->props350.lock); /* Type specific data: */ - gnet_property->props350.type = PROP_TYPE_BOOLEAN; - gnet_property->props350.data.boolean.def = (void *) &gnet_property_variable_zalloc_always_gc_default; - gnet_property->props350.data.boolean.value = (void *) &gnet_property_variable_zalloc_always_gc; + gnet_property->props350.type = PROP_TYPE_GUINT32; + gnet_property->props350.data.guint32.def = (void *) &gnet_property_variable_vmm_debug_default; + gnet_property->props350.data.guint32.value = (void *) &gnet_property_variable_vmm_debug; + gnet_property->props350.data.guint32.choices = NULL; + gnet_property->props350.data.guint32.max = 20; + gnet_property->props350.data.guint32.min = 0; /* - * PROP_VMM_DEBUG: + * PROP_SHUTDOWN_DEBUG: * * General data: */ - gnet_property->props351.name = "vmm_debug"; - gnet_property->props351.desc = _("Debug level for the virtual memory manager."); - gnet_property->props351.ev_changed = event_new("vmm_debug_changed"); + gnet_property->props351.name = "shutdown_debug"; + gnet_property->props351.desc = _("Debug level for final shutdown."); + gnet_property->props351.ev_changed = event_new("shutdown_debug_changed"); gnet_property->props351.save = TRUE; + gnet_property->props351.internal = FALSE; gnet_property->props351.vector_size = 1; + mutex_init(&gnet_property->props351.lock); /* Type specific data: */ gnet_property->props351.type = PROP_TYPE_GUINT32; - gnet_property->props351.data.guint32.def = (void *) &gnet_property_variable_vmm_debug_default; - gnet_property->props351.data.guint32.value = (void *) &gnet_property_variable_vmm_debug; + gnet_property->props351.data.guint32.def = (void *) &gnet_property_variable_shutdown_debug_default; + gnet_property->props351.data.guint32.value = (void *) &gnet_property_variable_shutdown_debug; gnet_property->props351.data.guint32.choices = NULL; gnet_property->props351.data.guint32.max = 20; gnet_property->props351.data.guint32.min = 0; /* - * PROP_SHUTDOWN_DEBUG: + * PROP_COUNTRY_LIMITS: * * General data: */ - gnet_property->props352.name = "shutdown_debug"; - gnet_property->props352.desc = _("Debug level for final shutdown."); - gnet_property->props352.ev_changed = event_new("shutdown_debug_changed"); + gnet_property->props352.name = "country_limits"; + gnet_property->props352.desc = _("Country preferences"); + gnet_property->props352.ev_changed = event_new("country_limits_changed"); gnet_property->props352.save = TRUE; + gnet_property->props352.internal = FALSE; gnet_property->props352.vector_size = 1; + mutex_init(&gnet_property->props352.lock); /* Type specific data: */ - gnet_property->props352.type = PROP_TYPE_GUINT32; - gnet_property->props352.data.guint32.def = (void *) &gnet_property_variable_shutdown_debug_default; - gnet_property->props352.data.guint32.value = (void *) &gnet_property_variable_shutdown_debug; - gnet_property->props352.data.guint32.choices = NULL; - gnet_property->props352.data.guint32.max = 20; - gnet_property->props352.data.guint32.min = 0; + gnet_property->props352.type = PROP_TYPE_STRING; + gnet_property->props352.data.string.def = (void *) &gnet_property_variable_country_limits_default; + gnet_property->props352.data.string.value = (void *) &gnet_property_variable_country_limits; + if (gnet_property->props352.data.string.def) { + *gnet_property->props352.data.string.value = + g_strdup(eval_subst(*gnet_property->props352.data.string.def)); + } /* - * PROP_COUNTRY_LIMITS: + * PROP_CTL_DEBUG: * * General data: */ - gnet_property->props353.name = "country_limits"; - gnet_property->props353.desc = _("Country preferences"); - gnet_property->props353.ev_changed = event_new("country_limits_changed"); + gnet_property->props353.name = "ctl_debug"; + gnet_property->props353.desc = _("Debug level for country limits."); + gnet_property->props353.ev_changed = event_new("ctl_debug_changed"); gnet_property->props353.save = TRUE; + gnet_property->props353.internal = FALSE; gnet_property->props353.vector_size = 1; + mutex_init(&gnet_property->props353.lock); /* Type specific data: */ - gnet_property->props353.type = PROP_TYPE_STRING; - gnet_property->props353.data.string.def = (void *) &gnet_property_variable_country_limits_default; - gnet_property->props353.data.string.value = (void *) &gnet_property_variable_country_limits; - if (gnet_property->props353.data.string.def) { - *gnet_property->props353.data.string.value = - g_strdup(eval_subst(*gnet_property->props353.data.string.def)); - } + gnet_property->props353.type = PROP_TYPE_GUINT32; + gnet_property->props353.data.guint32.def = (void *) &gnet_property_variable_ctl_debug_default; + gnet_property->props353.data.guint32.value = (void *) &gnet_property_variable_ctl_debug; + gnet_property->props353.data.guint32.choices = NULL; + gnet_property->props353.data.guint32.max = 20; + gnet_property->props353.data.guint32.min = 0; /* - * PROP_CTL_DEBUG: + * PROP_LOG_DROPPED_GNUTELLA: * * General data: */ - gnet_property->props354.name = "ctl_debug"; - gnet_property->props354.desc = _("Debug level for country limits."); - gnet_property->props354.ev_changed = event_new("ctl_debug_changed"); + gnet_property->props354.name = "log_dropped_gnutella"; + gnet_property->props354.desc = _("Whether to log dropped Gnutella messages"); + gnet_property->props354.ev_changed = event_new("log_dropped_gnutella_changed"); gnet_property->props354.save = TRUE; + gnet_property->props354.internal = FALSE; gnet_property->props354.vector_size = 1; + mutex_init(&gnet_property->props354.lock); /* Type specific data: */ - gnet_property->props354.type = PROP_TYPE_GUINT32; - gnet_property->props354.data.guint32.def = (void *) &gnet_property_variable_ctl_debug_default; - gnet_property->props354.data.guint32.value = (void *) &gnet_property_variable_ctl_debug; - gnet_property->props354.data.guint32.choices = NULL; - gnet_property->props354.data.guint32.max = 20; - gnet_property->props354.data.guint32.min = 0; + gnet_property->props354.type = PROP_TYPE_BOOLEAN; + gnet_property->props354.data.boolean.def = (void *) &gnet_property_variable_log_dropped_gnutella_default; + gnet_property->props354.data.boolean.value = (void *) &gnet_property_variable_log_dropped_gnutella; /* - * PROP_LOG_DROPPED_GNUTELLA: + * PROP_WHITELIST_DEBUG: * * General data: */ - gnet_property->props355.name = "log_dropped_gnutella"; - gnet_property->props355.desc = _("Whether to log dropped Gnutella messages"); - gnet_property->props355.ev_changed = event_new("log_dropped_gnutella_changed"); + gnet_property->props355.name = "whitelist_debug"; + gnet_property->props355.desc = _("Debug level for whitelist management."); + gnet_property->props355.ev_changed = event_new("whitelist_debug_changed"); gnet_property->props355.save = TRUE; + gnet_property->props355.internal = FALSE; gnet_property->props355.vector_size = 1; + mutex_init(&gnet_property->props355.lock); /* Type specific data: */ - gnet_property->props355.type = PROP_TYPE_BOOLEAN; - gnet_property->props355.data.boolean.def = (void *) &gnet_property_variable_log_dropped_gnutella_default; - gnet_property->props355.data.boolean.value = (void *) &gnet_property_variable_log_dropped_gnutella; + gnet_property->props355.type = PROP_TYPE_GUINT32; + gnet_property->props355.data.guint32.def = (void *) &gnet_property_variable_whitelist_debug_default; + gnet_property->props355.data.guint32.value = (void *) &gnet_property_variable_whitelist_debug; + gnet_property->props355.data.guint32.choices = NULL; + gnet_property->props355.data.guint32.max = 20; + gnet_property->props355.data.guint32.min = 0; /* - * PROP_WHITELIST_DEBUG: + * PROP_DHT_TCACHE_DEBUG: * * General data: */ - gnet_property->props356.name = "whitelist_debug"; - gnet_property->props356.desc = _("Debug level for whitelist management."); - gnet_property->props356.ev_changed = event_new("whitelist_debug_changed"); + gnet_property->props356.name = "dht_tcache_debug"; + gnet_property->props356.desc = _("Debug level for DHT token caching."); + gnet_property->props356.ev_changed = event_new("dht_tcache_debug_changed"); gnet_property->props356.save = TRUE; + gnet_property->props356.internal = FALSE; gnet_property->props356.vector_size = 1; + mutex_init(&gnet_property->props356.lock); /* Type specific data: */ gnet_property->props356.type = PROP_TYPE_GUINT32; - gnet_property->props356.data.guint32.def = (void *) &gnet_property_variable_whitelist_debug_default; - gnet_property->props356.data.guint32.value = (void *) &gnet_property_variable_whitelist_debug; + gnet_property->props356.data.guint32.def = (void *) &gnet_property_variable_dht_tcache_debug_default; + gnet_property->props356.data.guint32.value = (void *) &gnet_property_variable_dht_tcache_debug; gnet_property->props356.data.guint32.choices = NULL; gnet_property->props356.data.guint32.max = 20; gnet_property->props356.data.guint32.min = 0; /* - * PROP_DHT_TCACHE_DEBUG: + * PROP_PUBLISHER_DEBUG: * * General data: */ - gnet_property->props357.name = "dht_tcache_debug"; - gnet_property->props357.desc = _("Debug level for DHT token caching."); - gnet_property->props357.ev_changed = event_new("dht_tcache_debug_changed"); + gnet_property->props357.name = "publisher_debug"; + gnet_property->props357.desc = _("Debug level for DHT publishing from Gnutella."); + gnet_property->props357.ev_changed = event_new("publisher_debug_changed"); gnet_property->props357.save = TRUE; + gnet_property->props357.internal = FALSE; gnet_property->props357.vector_size = 1; + mutex_init(&gnet_property->props357.lock); /* Type specific data: */ gnet_property->props357.type = PROP_TYPE_GUINT32; - gnet_property->props357.data.guint32.def = (void *) &gnet_property_variable_dht_tcache_debug_default; - gnet_property->props357.data.guint32.value = (void *) &gnet_property_variable_dht_tcache_debug; + gnet_property->props357.data.guint32.def = (void *) &gnet_property_variable_publisher_debug_default; + gnet_property->props357.data.guint32.value = (void *) &gnet_property_variable_publisher_debug; gnet_property->props357.data.guint32.choices = NULL; gnet_property->props357.data.guint32.max = 20; gnet_property->props357.data.guint32.min = 0; /* - * PROP_PUBLISHER_DEBUG: + * PROP_DHT_TRACE: * * General data: */ - gnet_property->props358.name = "publisher_debug"; - gnet_property->props358.desc = _("Debug level for DHT publishing from Gnutella."); - gnet_property->props358.ev_changed = event_new("publisher_debug_changed"); + gnet_property->props358.name = "dht_trace"; + gnet_property->props358.desc = _("Defines which DHT messages should be traced."); + gnet_property->props358.ev_changed = event_new("dht_trace_changed"); gnet_property->props358.save = TRUE; + gnet_property->props358.internal = FALSE; gnet_property->props358.vector_size = 1; + mutex_init(&gnet_property->props358.lock); /* Type specific data: */ - gnet_property->props358.type = PROP_TYPE_GUINT32; - gnet_property->props358.data.guint32.def = (void *) &gnet_property_variable_publisher_debug_default; - gnet_property->props358.data.guint32.value = (void *) &gnet_property_variable_publisher_debug; - gnet_property->props358.data.guint32.choices = NULL; - gnet_property->props358.data.guint32.max = 20; - gnet_property->props358.data.guint32.min = 0; + gnet_property->props358.type = PROP_TYPE_MULTICHOICE; + gnet_property->props358.data.guint32.def = (void *) &gnet_property_variable_dht_trace_default; + gnet_property->props358.data.guint32.value = (void *) &gnet_property_variable_dht_trace; + gnet_property->props358.data.guint32.max = 0xFFFFFFFF; + gnet_property->props358.data.guint32.min = 0x00000000; + gnet_property->props358.data.guint32.choices = (void *) &gnet_property_variable_dht_trace_choices; /* - * PROP_DHT_TRACE: + * PROP_BW_DHT_OUT_ENABLED: * * General data: */ - gnet_property->props359.name = "dht_trace"; - gnet_property->props359.desc = _("Defines which DHT messages should be traced."); - gnet_property->props359.ev_changed = event_new("dht_trace_changed"); + gnet_property->props359.name = "bandwidth_dht_output_limit"; + gnet_property->props359.desc = _("Enable bandwidth limitation for outgoing DHT traffic."); + gnet_property->props359.ev_changed = event_new("bw_dht_out_enabled_changed"); gnet_property->props359.save = TRUE; + gnet_property->props359.internal = FALSE; gnet_property->props359.vector_size = 1; + mutex_init(&gnet_property->props359.lock); /* Type specific data: */ - gnet_property->props359.type = PROP_TYPE_MULTICHOICE; - gnet_property->props359.data.guint32.def = (void *) &gnet_property_variable_dht_trace_default; - gnet_property->props359.data.guint32.value = (void *) &gnet_property_variable_dht_trace; - gnet_property->props359.data.guint32.max = 0xFFFFFFFF; - gnet_property->props359.data.guint32.min = 0x00000000; - gnet_property->props359.data.guint32.choices = (void *) &gnet_property_variable_dht_trace_choices; + gnet_property->props359.type = PROP_TYPE_BOOLEAN; + gnet_property->props359.data.boolean.def = (void *) &gnet_property_variable_bws_dht_out_enabled_default; + gnet_property->props359.data.boolean.value = (void *) &gnet_property_variable_bws_dht_out_enabled; /* - * PROP_BW_DHT_OUT_ENABLED: + * PROP_BW_DHT_OUT: * * General data: */ - gnet_property->props360.name = "bandwidth_dht_output_limit"; - gnet_property->props360.desc = _("Enable bandwidth limitation for outgoing DHT traffic."); - gnet_property->props360.ev_changed = event_new("bw_dht_out_enabled_changed"); + gnet_property->props360.name = "output_dht_bandwidth"; + gnet_property->props360.desc = _("Bandwidth limit for outgoing DHT traffic in bytes/sec. It is always pooled with the Gnutella UDP queue, regardless of whether bandwidth stealing is enabled, so that UDP queues can flush more quickly."); + gnet_property->props360.ev_changed = event_new("bw_dht_out_changed"); gnet_property->props360.save = TRUE; + gnet_property->props360.internal = FALSE; gnet_property->props360.vector_size = 1; + mutex_init(&gnet_property->props360.lock); /* Type specific data: */ - gnet_property->props360.type = PROP_TYPE_BOOLEAN; - gnet_property->props360.data.boolean.def = (void *) &gnet_property_variable_bws_dht_out_enabled_default; - gnet_property->props360.data.boolean.value = (void *) &gnet_property_variable_bws_dht_out_enabled; + gnet_property->props360.type = PROP_TYPE_GUINT32; + gnet_property->props360.data.guint32.def = (void *) &gnet_property_variable_bw_dht_out_default; + gnet_property->props360.data.guint32.value = (void *) &gnet_property_variable_bw_dht_out; + gnet_property->props360.data.guint32.choices = NULL; + gnet_property->props360.data.guint32.max = BS_BW_MAX; + gnet_property->props360.data.guint32.min = 8192; /* - * PROP_BW_DHT_OUT: + * PROP_NODE_DHT_SENDQUEUE_SIZE: * * General data: */ - gnet_property->props361.name = "output_dht_bandwidth"; - gnet_property->props361.desc = _("Bandwidth limit for outgoing DHT traffic in bytes/sec. It is always pooled with the Gnutella UDP queue, regardless of whether bandwidth stealing is enabled, so that UDP queues can flush more quickly."); - gnet_property->props361.ev_changed = event_new("bw_dht_out_changed"); + gnet_property->props361.name = "node_dht_sendqueue_size"; + gnet_property->props361.desc = _("Maximum size of the DHT message queue (in bytes)."); + gnet_property->props361.ev_changed = event_new("node_dht_sendqueue_size_changed"); gnet_property->props361.save = TRUE; + gnet_property->props361.internal = FALSE; gnet_property->props361.vector_size = 1; + mutex_init(&gnet_property->props361.lock); /* Type specific data: */ gnet_property->props361.type = PROP_TYPE_GUINT32; - gnet_property->props361.data.guint32.def = (void *) &gnet_property_variable_bw_dht_out_default; - gnet_property->props361.data.guint32.value = (void *) &gnet_property_variable_bw_dht_out; + gnet_property->props361.data.guint32.def = (void *) &gnet_property_variable_node_dht_sendqueue_size_default; + gnet_property->props361.data.guint32.value = (void *) &gnet_property_variable_node_dht_sendqueue_size; gnet_property->props361.data.guint32.choices = NULL; - gnet_property->props361.data.guint32.max = BS_BW_MAX; - gnet_property->props361.data.guint32.min = 8192; + gnet_property->props361.data.guint32.max = 256000; + gnet_property->props361.data.guint32.min = 98304; /* - * PROP_NODE_DHT_SENDQUEUE_SIZE: + * PROP_BSCHED_DEBUG: * * General data: */ - gnet_property->props362.name = "node_dht_sendqueue_size"; - gnet_property->props362.desc = _("Maximum size of the DHT message queue (in bytes)."); - gnet_property->props362.ev_changed = event_new("node_dht_sendqueue_size_changed"); + gnet_property->props362.name = "bsched_debug"; + gnet_property->props362.desc = _("Debug level for bandwidth scheduler."); + gnet_property->props362.ev_changed = event_new("bsched_debug_changed"); gnet_property->props362.save = TRUE; + gnet_property->props362.internal = FALSE; gnet_property->props362.vector_size = 1; + mutex_init(&gnet_property->props362.lock); /* Type specific data: */ gnet_property->props362.type = PROP_TYPE_GUINT32; - gnet_property->props362.data.guint32.def = (void *) &gnet_property_variable_node_dht_sendqueue_size_default; - gnet_property->props362.data.guint32.value = (void *) &gnet_property_variable_node_dht_sendqueue_size; + gnet_property->props362.data.guint32.def = (void *) &gnet_property_variable_bsched_debug_default; + gnet_property->props362.data.guint32.value = (void *) &gnet_property_variable_bsched_debug; gnet_property->props362.data.guint32.choices = NULL; - gnet_property->props362.data.guint32.max = 256000; - gnet_property->props362.data.guint32.min = 98304; + gnet_property->props362.data.guint32.max = 0xFFFFFFFF; + gnet_property->props362.data.guint32.min = 0x00000000; /* - * PROP_BSCHED_DEBUG: + * PROP_DHT_STABLE_DEBUG: * * General data: */ - gnet_property->props363.name = "bsched_debug"; - gnet_property->props363.desc = _("Debug level for bandwidth scheduler."); - gnet_property->props363.ev_changed = event_new("bsched_debug_changed"); + gnet_property->props363.name = "dht_stable_debug"; + gnet_property->props363.desc = _("Debug level for the DHT stable node recorder."); + gnet_property->props363.ev_changed = event_new("dht_stable_debug_changed"); gnet_property->props363.save = TRUE; + gnet_property->props363.internal = FALSE; gnet_property->props363.vector_size = 1; + mutex_init(&gnet_property->props363.lock); /* Type specific data: */ gnet_property->props363.type = PROP_TYPE_GUINT32; - gnet_property->props363.data.guint32.def = (void *) &gnet_property_variable_bsched_debug_default; - gnet_property->props363.data.guint32.value = (void *) &gnet_property_variable_bsched_debug; + gnet_property->props363.data.guint32.def = (void *) &gnet_property_variable_dht_stable_debug_default; + gnet_property->props363.data.guint32.value = (void *) &gnet_property_variable_dht_stable_debug; gnet_property->props363.data.guint32.choices = NULL; gnet_property->props363.data.guint32.max = 0xFFFFFFFF; gnet_property->props363.data.guint32.min = 0x00000000; /* - * PROP_DHT_STABLE_DEBUG: + * PROP_RELOAD_DEBUG: * * General data: */ - gnet_property->props364.name = "dht_stable_debug"; - gnet_property->props364.desc = _("Debug level for the DHT stable node recorder."); - gnet_property->props364.ev_changed = event_new("dht_stable_debug_changed"); + gnet_property->props364.name = "reload_debug"; + gnet_property->props364.desc = _("Debug level for the file (re)loading, on change."); + gnet_property->props364.ev_changed = event_new("reload_debug_changed"); gnet_property->props364.save = TRUE; + gnet_property->props364.internal = FALSE; gnet_property->props364.vector_size = 1; + mutex_init(&gnet_property->props364.lock); /* Type specific data: */ gnet_property->props364.type = PROP_TYPE_GUINT32; - gnet_property->props364.data.guint32.def = (void *) &gnet_property_variable_dht_stable_debug_default; - gnet_property->props364.data.guint32.value = (void *) &gnet_property_variable_dht_stable_debug; + gnet_property->props364.data.guint32.def = (void *) &gnet_property_variable_reload_debug_default; + gnet_property->props364.data.guint32.value = (void *) &gnet_property_variable_reload_debug; gnet_property->props364.data.guint32.choices = NULL; gnet_property->props364.data.guint32.max = 0xFFFFFFFF; gnet_property->props364.data.guint32.min = 0x00000000; /* - * PROP_RELOAD_DEBUG: + * PROP_MOVE_DEBUG: * * General data: */ - gnet_property->props365.name = "reload_debug"; - gnet_property->props365.desc = _("Debug level for the file (re)loading, on change."); - gnet_property->props365.ev_changed = event_new("reload_debug_changed"); + gnet_property->props365.name = "move_debug"; + gnet_property->props365.desc = _("Debug level for the file moving, accross filesystems."); + gnet_property->props365.ev_changed = event_new("move_debug_changed"); gnet_property->props365.save = TRUE; + gnet_property->props365.internal = FALSE; gnet_property->props365.vector_size = 1; + mutex_init(&gnet_property->props365.lock); /* Type specific data: */ gnet_property->props365.type = PROP_TYPE_GUINT32; - gnet_property->props365.data.guint32.def = (void *) &gnet_property_variable_reload_debug_default; - gnet_property->props365.data.guint32.value = (void *) &gnet_property_variable_reload_debug; + gnet_property->props365.data.guint32.def = (void *) &gnet_property_variable_move_debug_default; + gnet_property->props365.data.guint32.value = (void *) &gnet_property_variable_move_debug; gnet_property->props365.data.guint32.choices = NULL; gnet_property->props365.data.guint32.max = 0xFFFFFFFF; gnet_property->props365.data.guint32.min = 0x00000000; /* - * PROP_MOVE_DEBUG: + * PROP_QHIT_DEBUG: * * General data: */ - gnet_property->props366.name = "move_debug"; - gnet_property->props366.desc = _("Debug level for the file moving, accross filesystems."); - gnet_property->props366.ev_changed = event_new("move_debug_changed"); + gnet_property->props366.name = "qhit_debug"; + gnet_property->props366.desc = _("Debug level for query hit message generation."); + gnet_property->props366.ev_changed = event_new("qhit_debug_changed"); gnet_property->props366.save = TRUE; + gnet_property->props366.internal = FALSE; gnet_property->props366.vector_size = 1; + mutex_init(&gnet_property->props366.lock); /* Type specific data: */ gnet_property->props366.type = PROP_TYPE_GUINT32; - gnet_property->props366.data.guint32.def = (void *) &gnet_property_variable_move_debug_default; - gnet_property->props366.data.guint32.value = (void *) &gnet_property_variable_move_debug; + gnet_property->props366.data.guint32.def = (void *) &gnet_property_variable_qhit_debug_default; + gnet_property->props366.data.guint32.value = (void *) &gnet_property_variable_qhit_debug; gnet_property->props366.data.guint32.choices = NULL; gnet_property->props366.data.guint32.max = 0xFFFFFFFF; gnet_property->props366.data.guint32.min = 0x00000000; /* - * PROP_QHIT_DEBUG: + * PROP_VERSION_DEBUG: * * General data: */ - gnet_property->props367.name = "qhit_debug"; - gnet_property->props367.desc = _("Debug level for query hit message generation."); - gnet_property->props367.ev_changed = event_new("qhit_debug_changed"); + gnet_property->props367.name = "version_debug"; + gnet_property->props367.desc = _("Debug level for version management."); + gnet_property->props367.ev_changed = event_new("version_debug_changed"); gnet_property->props367.save = TRUE; + gnet_property->props367.internal = FALSE; gnet_property->props367.vector_size = 1; + mutex_init(&gnet_property->props367.lock); /* Type specific data: */ gnet_property->props367.type = PROP_TYPE_GUINT32; - gnet_property->props367.data.guint32.def = (void *) &gnet_property_variable_qhit_debug_default; - gnet_property->props367.data.guint32.value = (void *) &gnet_property_variable_qhit_debug; + gnet_property->props367.data.guint32.def = (void *) &gnet_property_variable_version_debug_default; + gnet_property->props367.data.guint32.value = (void *) &gnet_property_variable_version_debug; gnet_property->props367.data.guint32.choices = NULL; gnet_property->props367.data.guint32.max = 0xFFFFFFFF; gnet_property->props367.data.guint32.min = 0x00000000; /* - * PROP_VERSION_DEBUG: + * PROP_CPU_FREQ_MIN: * * General data: */ - gnet_property->props368.name = "version_debug"; - gnet_property->props368.desc = _("Debug level for version management."); - gnet_property->props368.ev_changed = event_new("version_debug_changed"); - gnet_property->props368.save = TRUE; + gnet_property->props368.name = "cpu_freq_min"; + gnet_property->props368.desc = _("Minimum CPU frequency, in Hz."); + gnet_property->props368.ev_changed = event_new("cpu_freq_min_changed"); + gnet_property->props368.save = FALSE; + gnet_property->props368.internal = TRUE; gnet_property->props368.vector_size = 1; + mutex_init(&gnet_property->props368.lock); /* Type specific data: */ - gnet_property->props368.type = PROP_TYPE_GUINT32; - gnet_property->props368.data.guint32.def = (void *) &gnet_property_variable_version_debug_default; - gnet_property->props368.data.guint32.value = (void *) &gnet_property_variable_version_debug; - gnet_property->props368.data.guint32.choices = NULL; - gnet_property->props368.data.guint32.max = 0xFFFFFFFF; - gnet_property->props368.data.guint32.min = 0x00000000; + gnet_property->props368.type = PROP_TYPE_GUINT64; + gnet_property->props368.data.guint64.def = (void *) &gnet_property_variable_cpu_freq_min_default; + gnet_property->props368.data.guint64.value = (void *) &gnet_property_variable_cpu_freq_min; + gnet_property->props368.data.guint64.choices = NULL; + gnet_property->props368.data.guint64.max = (guint64) -1; + gnet_property->props368.data.guint64.min = 0x0000000000000000; /* - * PROP_CPU_FREQ_MIN: + * PROP_CPU_FREQ_MAX: * * General data: */ - gnet_property->props369.name = "cpu_freq_min"; - gnet_property->props369.desc = _("Minimum CPU frequency, in Hz."); - gnet_property->props369.ev_changed = event_new("cpu_freq_min_changed"); + gnet_property->props369.name = "cpu_freq_max"; + gnet_property->props369.desc = _("Maximum CPU frequency, in Hz."); + gnet_property->props369.ev_changed = event_new("cpu_freq_max_changed"); gnet_property->props369.save = FALSE; + gnet_property->props369.internal = TRUE; gnet_property->props369.vector_size = 1; + mutex_init(&gnet_property->props369.lock); /* Type specific data: */ gnet_property->props369.type = PROP_TYPE_GUINT64; - gnet_property->props369.data.guint64.def = (void *) &gnet_property_variable_cpu_freq_min_default; - gnet_property->props369.data.guint64.value = (void *) &gnet_property_variable_cpu_freq_min; + gnet_property->props369.data.guint64.def = (void *) &gnet_property_variable_cpu_freq_max_default; + gnet_property->props369.data.guint64.value = (void *) &gnet_property_variable_cpu_freq_max; gnet_property->props369.data.guint64.choices = NULL; gnet_property->props369.data.guint64.max = (guint64) -1; gnet_property->props369.data.guint64.min = 0x0000000000000000; /* - * PROP_CPU_FREQ_MAX: + * PROP_DHT_BOOT_STATUS: * * General data: */ - gnet_property->props370.name = "cpu_freq_max"; - gnet_property->props370.desc = _("Maximum CPU frequency, in Hz."); - gnet_property->props370.ev_changed = event_new("cpu_freq_max_changed"); + gnet_property->props370.name = "dht_boot_status"; + gnet_property->props370.desc = _("DHT bootstrap status."); + gnet_property->props370.ev_changed = event_new("dht_boot_status_changed"); gnet_property->props370.save = FALSE; + gnet_property->props370.internal = TRUE; gnet_property->props370.vector_size = 1; + mutex_init(&gnet_property->props370.lock); /* Type specific data: */ - gnet_property->props370.type = PROP_TYPE_GUINT64; - gnet_property->props370.data.guint64.def = (void *) &gnet_property_variable_cpu_freq_max_default; - gnet_property->props370.data.guint64.value = (void *) &gnet_property_variable_cpu_freq_max; - gnet_property->props370.data.guint64.choices = NULL; - gnet_property->props370.data.guint64.max = (guint64) -1; - gnet_property->props370.data.guint64.min = 0x0000000000000000; + gnet_property->props370.type = PROP_TYPE_MULTICHOICE; + gnet_property->props370.data.guint32.def = (void *) &gnet_property_variable_dht_boot_status_default; + gnet_property->props370.data.guint32.value = (void *) &gnet_property_variable_dht_boot_status; + gnet_property->props370.data.guint32.max = 0xFFFFFFFF; + gnet_property->props370.data.guint32.min = 0x00000000; + gnet_property->props370.data.guint32.choices = (void *) &gnet_property_variable_dht_boot_status_choices; /* - * PROP_DHT_BOOT_STATUS: + * PROP_DHT_CONFIGURED_MODE: * * General data: */ - gnet_property->props371.name = "dht_boot_status"; - gnet_property->props371.desc = _("DHT bootstrap status."); - gnet_property->props371.ev_changed = event_new("dht_boot_status_changed"); - gnet_property->props371.save = FALSE; + gnet_property->props371.name = "dht_configured_mode"; + gnet_property->props371.desc = _("The DHT running mode. An active node will be able to store values and is a fully participating member of the Distributed Hash Table. A passive node can perform lookups and publish but will not store values and cannot be a member of the DHT structure. A firewalled node is necessarily passive, but you can force the passive mode even if you are not firewalled, although that is not recommended because the DHT requires far more active nodes that passive ones to be efficient."); + gnet_property->props371.ev_changed = event_new("dht_configured_mode_changed"); + gnet_property->props371.save = TRUE; + gnet_property->props371.internal = FALSE; gnet_property->props371.vector_size = 1; + mutex_init(&gnet_property->props371.lock); /* Type specific data: */ gnet_property->props371.type = PROP_TYPE_MULTICHOICE; - gnet_property->props371.data.guint32.def = (void *) &gnet_property_variable_dht_boot_status_default; - gnet_property->props371.data.guint32.value = (void *) &gnet_property_variable_dht_boot_status; + gnet_property->props371.data.guint32.def = (void *) &gnet_property_variable_dht_configured_mode_default; + gnet_property->props371.data.guint32.value = (void *) &gnet_property_variable_dht_configured_mode; gnet_property->props371.data.guint32.max = 0xFFFFFFFF; gnet_property->props371.data.guint32.min = 0x00000000; - gnet_property->props371.data.guint32.choices = (void *) &gnet_property_variable_dht_boot_status_choices; + gnet_property->props371.data.guint32.choices = (void *) &gnet_property_variable_dht_configured_mode_choices; /* - * PROP_DHT_CONFIGURED_MODE: + * PROP_DHT_CURRENT_MODE: * * General data: */ - gnet_property->props372.name = "dht_configured_mode"; - gnet_property->props372.desc = _("The DHT running mode. An active node will be able to store values and is a fully participating member of the Distributed Hash Table. A passive node can perform lookups and publish but will not store values and cannot be a member of the DHT structure. A firewalled node is necessarily passive, but you can force the passive mode even if you are not firewalled, although that is not recommended because the DHT requires far more active nodes that passive ones to be efficient."); - gnet_property->props372.ev_changed = event_new("dht_configured_mode_changed"); - gnet_property->props372.save = TRUE; + gnet_property->props372.name = "dht_current_mode"; + gnet_property->props372.desc = _("Current DHT running mode."); + gnet_property->props372.ev_changed = event_new("dht_current_mode_changed"); + gnet_property->props372.save = FALSE; + gnet_property->props372.internal = TRUE; gnet_property->props372.vector_size = 1; + mutex_init(&gnet_property->props372.lock); /* Type specific data: */ gnet_property->props372.type = PROP_TYPE_MULTICHOICE; - gnet_property->props372.data.guint32.def = (void *) &gnet_property_variable_dht_configured_mode_default; - gnet_property->props372.data.guint32.value = (void *) &gnet_property_variable_dht_configured_mode; + gnet_property->props372.data.guint32.def = (void *) &gnet_property_variable_dht_current_mode_default; + gnet_property->props372.data.guint32.value = (void *) &gnet_property_variable_dht_current_mode; gnet_property->props372.data.guint32.max = 0xFFFFFFFF; gnet_property->props372.data.guint32.min = 0x00000000; - gnet_property->props372.data.guint32.choices = (void *) &gnet_property_variable_dht_configured_mode_choices; + gnet_property->props372.data.guint32.choices = (void *) &gnet_property_variable_dht_current_mode_choices; /* - * PROP_DHT_CURRENT_MODE: + * PROP_OMALLOC_DEBUG: * * General data: */ - gnet_property->props373.name = "dht_current_mode"; - gnet_property->props373.desc = _("Current DHT running mode."); - gnet_property->props373.ev_changed = event_new("dht_current_mode_changed"); - gnet_property->props373.save = FALSE; + gnet_property->props373.name = "omalloc_debug"; + gnet_property->props373.desc = _("Debug level for the one-time memory allocator."); + gnet_property->props373.ev_changed = event_new("omalloc_debug_changed"); + gnet_property->props373.save = TRUE; + gnet_property->props373.internal = FALSE; gnet_property->props373.vector_size = 1; + mutex_init(&gnet_property->props373.lock); /* Type specific data: */ - gnet_property->props373.type = PROP_TYPE_MULTICHOICE; - gnet_property->props373.data.guint32.def = (void *) &gnet_property_variable_dht_current_mode_default; - gnet_property->props373.data.guint32.value = (void *) &gnet_property_variable_dht_current_mode; - gnet_property->props373.data.guint32.max = 0xFFFFFFFF; - gnet_property->props373.data.guint32.min = 0x00000000; - gnet_property->props373.data.guint32.choices = (void *) &gnet_property_variable_dht_current_mode_choices; + gnet_property->props373.type = PROP_TYPE_GUINT32; + gnet_property->props373.data.guint32.def = (void *) &gnet_property_variable_omalloc_debug_default; + gnet_property->props373.data.guint32.value = (void *) &gnet_property_variable_omalloc_debug; + gnet_property->props373.data.guint32.choices = NULL; + gnet_property->props373.data.guint32.max = 20; + gnet_property->props373.data.guint32.min = 0; /* - * PROP_OMALLOC_DEBUG: + * PROP_HCACHE_DEBUG: * * General data: */ - gnet_property->props374.name = "omalloc_debug"; - gnet_property->props374.desc = _("Debug level for the one-time memory allocator."); - gnet_property->props374.ev_changed = event_new("omalloc_debug_changed"); + gnet_property->props374.name = "hcache_debug"; + gnet_property->props374.desc = _("Debug level for the host cache."); + gnet_property->props374.ev_changed = event_new("hcache_debug_changed"); gnet_property->props374.save = TRUE; + gnet_property->props374.internal = FALSE; gnet_property->props374.vector_size = 1; + mutex_init(&gnet_property->props374.lock); /* Type specific data: */ gnet_property->props374.type = PROP_TYPE_GUINT32; - gnet_property->props374.data.guint32.def = (void *) &gnet_property_variable_omalloc_debug_default; - gnet_property->props374.data.guint32.value = (void *) &gnet_property_variable_omalloc_debug; + gnet_property->props374.data.guint32.def = (void *) &gnet_property_variable_hcache_debug_default; + gnet_property->props374.data.guint32.value = (void *) &gnet_property_variable_hcache_debug; gnet_property->props374.data.guint32.choices = NULL; gnet_property->props374.data.guint32.max = 20; gnet_property->props374.data.guint32.min = 0; /* - * PROP_HCACHE_DEBUG: + * PROP_RANDOMNESS: * * General data: */ - gnet_property->props375.name = "hcache_debug"; - gnet_property->props375.desc = _("Debug level for the host cache."); - gnet_property->props375.ev_changed = event_new("hcache_debug_changed"); + gnet_property->props375.name = "randomness"; + gnet_property->props375.desc = _("Random bits."); + gnet_property->props375.ev_changed = event_new("randomness_changed"); gnet_property->props375.save = TRUE; - gnet_property->props375.vector_size = 1; + gnet_property->props375.internal = FALSE; + gnet_property->props375.vector_size = KUID_RAW_SIZE; + mutex_init(&gnet_property->props375.lock); /* Type specific data: */ - gnet_property->props375.type = PROP_TYPE_GUINT32; - gnet_property->props375.data.guint32.def = (void *) &gnet_property_variable_hcache_debug_default; - gnet_property->props375.data.guint32.value = (void *) &gnet_property_variable_hcache_debug; - gnet_property->props375.data.guint32.choices = NULL; - gnet_property->props375.data.guint32.max = 20; - gnet_property->props375.data.guint32.min = 0; + gnet_property->props375.type = PROP_TYPE_STORAGE; + gnet_property->props375.data.storage.value = gnet_property_variable_randomness; /* - * PROP_RANDOMNESS: + * PROP_AVERAGE_SERVENT_DOWNTIME: * * General data: */ - gnet_property->props376.name = "randomness"; - gnet_property->props376.desc = _("Random bits."); - gnet_property->props376.ev_changed = event_new("randomness_changed"); + gnet_property->props376.name = "average_servent_downtime"; + gnet_property->props376.desc = _("Average servent downtime."); + gnet_property->props376.ev_changed = event_new("average_servent_downtime_changed"); gnet_property->props376.save = TRUE; - gnet_property->props376.vector_size = KUID_RAW_SIZE; + gnet_property->props376.internal = FALSE; + gnet_property->props376.vector_size = 1; + mutex_init(&gnet_property->props376.lock); /* Type specific data: */ - gnet_property->props376.type = PROP_TYPE_STORAGE; - gnet_property->props376.data.storage.value = gnet_property_variable_randomness; + gnet_property->props376.type = PROP_TYPE_GUINT32; + gnet_property->props376.data.guint32.def = (void *) &gnet_property_variable_average_servent_downtime_default; + gnet_property->props376.data.guint32.value = (void *) &gnet_property_variable_average_servent_downtime; + gnet_property->props376.data.guint32.choices = NULL; + gnet_property->props376.data.guint32.max = 0xFFFFFFFF; + gnet_property->props376.data.guint32.min = 0x00000000; /* - * PROP_AVERAGE_SERVENT_DOWNTIME: + * PROP_SHUTDOWN_TIME: * * General data: */ - gnet_property->props377.name = "average_servent_downtime"; - gnet_property->props377.desc = _("Average servent downtime."); - gnet_property->props377.ev_changed = event_new("average_servent_downtime_changed"); + gnet_property->props377.name = "shutdown_time"; + gnet_property->props377.desc = _("Time when last shutdown occurred."); + gnet_property->props377.ev_changed = event_new("shutdown_time_changed"); gnet_property->props377.save = TRUE; + gnet_property->props377.internal = FALSE; gnet_property->props377.vector_size = 1; + mutex_init(&gnet_property->props377.lock); /* Type specific data: */ - gnet_property->props377.type = PROP_TYPE_GUINT32; - gnet_property->props377.data.guint32.def = (void *) &gnet_property_variable_average_servent_downtime_default; - gnet_property->props377.data.guint32.value = (void *) &gnet_property_variable_average_servent_downtime; - gnet_property->props377.data.guint32.choices = NULL; - gnet_property->props377.data.guint32.max = 0xFFFFFFFF; - gnet_property->props377.data.guint32.min = 0x00000000; + gnet_property->props377.type = PROP_TYPE_TIMESTAMP; + gnet_property->props377.data.timestamp.def = (void *) &gnet_property_variable_shutdown_time_default; + gnet_property->props377.data.timestamp.value = (void *) &gnet_property_variable_shutdown_time; + gnet_property->props377.data.timestamp.choices = NULL; + gnet_property->props377.data.timestamp.max = (time_t) ((1U << 31) - 1); + gnet_property->props377.data.timestamp.min = 0x0000000000000000; /* - * PROP_SHUTDOWN_TIME: + * PROP_ALIVE_DEBUG: * * General data: */ - gnet_property->props378.name = "shutdown_time"; - gnet_property->props378.desc = _("Time when last shutdown occurred."); - gnet_property->props378.ev_changed = event_new("shutdown_time_changed"); + gnet_property->props378.name = "alive_debug"; + gnet_property->props378.desc = _("Debug level for alive pings."); + gnet_property->props378.ev_changed = event_new("alive_debug_changed"); gnet_property->props378.save = TRUE; + gnet_property->props378.internal = FALSE; gnet_property->props378.vector_size = 1; + mutex_init(&gnet_property->props378.lock); /* Type specific data: */ - gnet_property->props378.type = PROP_TYPE_TIMESTAMP; - gnet_property->props378.data.timestamp.def = (void *) &gnet_property_variable_shutdown_time_default; - gnet_property->props378.data.timestamp.value = (void *) &gnet_property_variable_shutdown_time; - gnet_property->props378.data.timestamp.choices = NULL; - gnet_property->props378.data.timestamp.max = (time_t) ((1U << 31) - 1); - gnet_property->props378.data.timestamp.min = 0x0000000000000000; + gnet_property->props378.type = PROP_TYPE_GUINT32; + gnet_property->props378.data.guint32.def = (void *) &gnet_property_variable_alive_debug_default; + gnet_property->props378.data.guint32.value = (void *) &gnet_property_variable_alive_debug; + gnet_property->props378.data.guint32.choices = NULL; + gnet_property->props378.data.guint32.max = 20; + gnet_property->props378.data.guint32.min = 0; /* - * PROP_ALIVE_DEBUG: + * PROP_VXML_DEBUG: * * General data: */ - gnet_property->props379.name = "alive_debug"; - gnet_property->props379.desc = _("Debug level for alive pings."); - gnet_property->props379.ev_changed = event_new("alive_debug_changed"); + gnet_property->props379.name = "vxml_debug"; + gnet_property->props379.desc = _("Debug level for the versatile XML layer."); + gnet_property->props379.ev_changed = event_new("vxml_debug_changed"); gnet_property->props379.save = TRUE; + gnet_property->props379.internal = FALSE; gnet_property->props379.vector_size = 1; + mutex_init(&gnet_property->props379.lock); /* Type specific data: */ gnet_property->props379.type = PROP_TYPE_GUINT32; - gnet_property->props379.data.guint32.def = (void *) &gnet_property_variable_alive_debug_default; - gnet_property->props379.data.guint32.value = (void *) &gnet_property_variable_alive_debug; + gnet_property->props379.data.guint32.def = (void *) &gnet_property_variable_vxml_debug_default; + gnet_property->props379.data.guint32.value = (void *) &gnet_property_variable_vxml_debug; gnet_property->props379.data.guint32.choices = NULL; gnet_property->props379.data.guint32.max = 20; gnet_property->props379.data.guint32.min = 0; /* - * PROP_VXML_DEBUG: + * PROP_UPNP_DEBUG: * * General data: */ - gnet_property->props380.name = "vxml_debug"; - gnet_property->props380.desc = _("Debug level for the versatile XML layer."); - gnet_property->props380.ev_changed = event_new("vxml_debug_changed"); + gnet_property->props380.name = "upnp_debug"; + gnet_property->props380.desc = _("Debug level for the UPnP layer."); + gnet_property->props380.ev_changed = event_new("upnp_debug_changed"); gnet_property->props380.save = TRUE; + gnet_property->props380.internal = FALSE; gnet_property->props380.vector_size = 1; + mutex_init(&gnet_property->props380.lock); /* Type specific data: */ gnet_property->props380.type = PROP_TYPE_GUINT32; - gnet_property->props380.data.guint32.def = (void *) &gnet_property_variable_vxml_debug_default; - gnet_property->props380.data.guint32.value = (void *) &gnet_property_variable_vxml_debug; + gnet_property->props380.data.guint32.def = (void *) &gnet_property_variable_upnp_debug_default; + gnet_property->props380.data.guint32.value = (void *) &gnet_property_variable_upnp_debug; gnet_property->props380.data.guint32.choices = NULL; gnet_property->props380.data.guint32.max = 20; gnet_property->props380.data.guint32.min = 0; /* - * PROP_UPNP_DEBUG: + * PROP_SOAP_DEBUG: * * General data: */ - gnet_property->props381.name = "upnp_debug"; - gnet_property->props381.desc = _("Debug level for the UPnP layer."); - gnet_property->props381.ev_changed = event_new("upnp_debug_changed"); + gnet_property->props381.name = "soap_debug"; + gnet_property->props381.desc = _("Debug level for the SOAP layer."); + gnet_property->props381.ev_changed = event_new("soap_debug_changed"); gnet_property->props381.save = TRUE; + gnet_property->props381.internal = FALSE; gnet_property->props381.vector_size = 1; + mutex_init(&gnet_property->props381.lock); /* Type specific data: */ gnet_property->props381.type = PROP_TYPE_GUINT32; - gnet_property->props381.data.guint32.def = (void *) &gnet_property_variable_upnp_debug_default; - gnet_property->props381.data.guint32.value = (void *) &gnet_property_variable_upnp_debug; + gnet_property->props381.data.guint32.def = (void *) &gnet_property_variable_soap_debug_default; + gnet_property->props381.data.guint32.value = (void *) &gnet_property_variable_soap_debug; gnet_property->props381.data.guint32.choices = NULL; gnet_property->props381.data.guint32.max = 20; gnet_property->props381.data.guint32.min = 0; /* - * PROP_SOAP_DEBUG: + * PROP_SOAP_TRACE: * * General data: */ - gnet_property->props382.name = "soap_debug"; - gnet_property->props382.desc = _("Debug level for the SOAP layer."); - gnet_property->props382.ev_changed = event_new("soap_debug_changed"); + gnet_property->props382.name = "soap_trace"; + gnet_property->props382.desc = _("Defines SOAP exchanges tracing type."); + gnet_property->props382.ev_changed = event_new("soap_trace_changed"); gnet_property->props382.save = TRUE; + gnet_property->props382.internal = FALSE; gnet_property->props382.vector_size = 1; + mutex_init(&gnet_property->props382.lock); /* Type specific data: */ - gnet_property->props382.type = PROP_TYPE_GUINT32; - gnet_property->props382.data.guint32.def = (void *) &gnet_property_variable_soap_debug_default; - gnet_property->props382.data.guint32.value = (void *) &gnet_property_variable_soap_debug; - gnet_property->props382.data.guint32.choices = NULL; - gnet_property->props382.data.guint32.max = 20; - gnet_property->props382.data.guint32.min = 0; + gnet_property->props382.type = PROP_TYPE_MULTICHOICE; + gnet_property->props382.data.guint32.def = (void *) &gnet_property_variable_soap_trace_default; + gnet_property->props382.data.guint32.value = (void *) &gnet_property_variable_soap_trace; + gnet_property->props382.data.guint32.max = 0xFFFFFFFF; + gnet_property->props382.data.guint32.min = 0x00000000; + gnet_property->props382.data.guint32.choices = (void *) &gnet_property_variable_soap_trace_choices; /* - * PROP_SOAP_TRACE: + * PROP_ALLOW_FIREWALLED_ULTRA: * * General data: */ - gnet_property->props383.name = "soap_trace"; - gnet_property->props383.desc = _("Defines SOAP exchanges tracing type."); - gnet_property->props383.ev_changed = event_new("soap_trace_changed"); + gnet_property->props383.name = "allow_firewalled_ultra"; + gnet_property->props383.desc = _("For testing purposes, allow to run as an ultranode even if the node cannot accept incoming TCP connections."); + gnet_property->props383.ev_changed = event_new("allow_firewalled_ultra_changed"); gnet_property->props383.save = TRUE; + gnet_property->props383.internal = FALSE; gnet_property->props383.vector_size = 1; + mutex_init(&gnet_property->props383.lock); /* Type specific data: */ - gnet_property->props383.type = PROP_TYPE_MULTICHOICE; - gnet_property->props383.data.guint32.def = (void *) &gnet_property_variable_soap_trace_default; - gnet_property->props383.data.guint32.value = (void *) &gnet_property_variable_soap_trace; - gnet_property->props383.data.guint32.max = 0xFFFFFFFF; - gnet_property->props383.data.guint32.min = 0x00000000; - gnet_property->props383.data.guint32.choices = (void *) &gnet_property_variable_soap_trace_choices; + gnet_property->props383.type = PROP_TYPE_BOOLEAN; + gnet_property->props383.data.boolean.def = (void *) &gnet_property_variable_allow_firewalled_ultra_default; + gnet_property->props383.data.boolean.value = (void *) &gnet_property_variable_allow_firewalled_ultra; /* - * PROP_ALLOW_FIREWALLED_ULTRA: + * PROP_ENABLE_UPNP: * * General data: */ - gnet_property->props384.name = "allow_firewalled_ultra"; - gnet_property->props384.desc = _("For testing purposes, allow to run as an ultranode even if the node cannot accept incoming TCP connections."); - gnet_property->props384.ev_changed = event_new("allow_firewalled_ultra_changed"); + gnet_property->props384.name = "enable_upnp"; + gnet_property->props384.desc = _("Whether UPnP (Universal Plug and Play) should be enabled. Support for UPnP means gtk-gnutella will be able to discover your Internet Gateway Device (router) and request that the listening port be opened and redirected to your machine, thereby auto-configuring to make sure you are not firewalled. By default you should leave it enabled unless you know how to configure your network equipment manually to prevent the firewalled condition for both TCP and UDP."); + gnet_property->props384.ev_changed = event_new("enable_upnp_changed"); gnet_property->props384.save = TRUE; + gnet_property->props384.internal = FALSE; gnet_property->props384.vector_size = 1; + mutex_init(&gnet_property->props384.lock); /* Type specific data: */ gnet_property->props384.type = PROP_TYPE_BOOLEAN; - gnet_property->props384.data.boolean.def = (void *) &gnet_property_variable_allow_firewalled_ultra_default; - gnet_property->props384.data.boolean.value = (void *) &gnet_property_variable_allow_firewalled_ultra; + gnet_property->props384.data.boolean.def = (void *) &gnet_property_variable_enable_upnp_default; + gnet_property->props384.data.boolean.value = (void *) &gnet_property_variable_enable_upnp; /* - * PROP_ENABLE_UPNP: + * PROP_UPNP_POSSIBLE: * * General data: */ - gnet_property->props385.name = "enable_upnp"; - gnet_property->props385.desc = _("Whether UPnP (Universal Plug and Play) should be enabled. Support for UPnP means gtk-gnutella will be able to discover your Internet Gateway Device (router) and request that the listening port be opened and redirected to your machine, thereby auto-configuring to make sure you are not firewalled. By default you should leave it enabled unless you know how to configure your network equipment manually to prevent the firewalled condition for both TCP and UDP."); - gnet_property->props385.ev_changed = event_new("enable_upnp_changed"); - gnet_property->props385.save = TRUE; + gnet_property->props385.name = "upnp_possible"; + gnet_property->props385.desc = _("Whether gtk-gnutella was able to locate an Internet Gateway Device to install port mappings, if required."); + gnet_property->props385.ev_changed = event_new("upnp_possible_changed"); + gnet_property->props385.save = FALSE; + gnet_property->props385.internal = TRUE; gnet_property->props385.vector_size = 1; + mutex_init(&gnet_property->props385.lock); /* Type specific data: */ gnet_property->props385.type = PROP_TYPE_BOOLEAN; - gnet_property->props385.data.boolean.def = (void *) &gnet_property_variable_enable_upnp_default; - gnet_property->props385.data.boolean.value = (void *) &gnet_property_variable_enable_upnp; + gnet_property->props385.data.boolean.def = (void *) &gnet_property_variable_upnp_possible_default; + gnet_property->props385.data.boolean.value = (void *) &gnet_property_variable_upnp_possible; /* - * PROP_UPNP_POSSIBLE: + * PROP_PORT_MAPPING_REQUIRED: * * General data: */ - gnet_property->props386.name = "upnp_possible"; - gnet_property->props386.desc = _("Whether gtk-gnutella was able to locate an Internet Gateway Device to install port mappings, if required."); - gnet_property->props386.ev_changed = event_new("upnp_possible_changed"); - gnet_property->props386.save = FALSE; + gnet_property->props386.name = "port_mapping_required"; + gnet_property->props386.desc = _("Whether gtk-gnutella thinks it needs to install port mappings on your network router to avoid the firewalled condition."); + gnet_property->props386.ev_changed = event_new("port_mapping_required_changed"); + gnet_property->props386.save = TRUE; + gnet_property->props386.internal = TRUE; gnet_property->props386.vector_size = 1; + mutex_init(&gnet_property->props386.lock); /* Type specific data: */ gnet_property->props386.type = PROP_TYPE_BOOLEAN; - gnet_property->props386.data.boolean.def = (void *) &gnet_property_variable_upnp_possible_default; - gnet_property->props386.data.boolean.value = (void *) &gnet_property_variable_upnp_possible; + gnet_property->props386.data.boolean.def = (void *) &gnet_property_variable_port_mapping_required_default; + gnet_property->props386.data.boolean.value = (void *) &gnet_property_variable_port_mapping_required; /* - * PROP_PORT_MAPPING_REQUIRED: + * PROP_PORT_MAPPING_POSSIBLE: * * General data: */ - gnet_property->props387.name = "port_mapping_required"; - gnet_property->props387.desc = _("Whether gtk-gnutella thinks it needs to install port mappings on your network router to avoid the firewalled condition."); - gnet_property->props387.ev_changed = event_new("port_mapping_required_changed"); - gnet_property->props387.save = TRUE; + gnet_property->props387.name = "port_mapping_possible"; + gnet_property->props387.desc = _("Whether gtk-gnutella can install port mappings, if needed."); + gnet_property->props387.ev_changed = event_new("port_mapping_possible_changed"); + gnet_property->props387.save = FALSE; + gnet_property->props387.internal = TRUE; gnet_property->props387.vector_size = 1; + mutex_init(&gnet_property->props387.lock); /* Type specific data: */ gnet_property->props387.type = PROP_TYPE_BOOLEAN; - gnet_property->props387.data.boolean.def = (void *) &gnet_property_variable_port_mapping_required_default; - gnet_property->props387.data.boolean.value = (void *) &gnet_property_variable_port_mapping_required; + gnet_property->props387.data.boolean.def = (void *) &gnet_property_variable_port_mapping_possible_default; + gnet_property->props387.data.boolean.value = (void *) &gnet_property_variable_port_mapping_possible; /* - * PROP_PORT_MAPPING_POSSIBLE: + * PROP_NATPMP_DEBUG: * * General data: */ - gnet_property->props388.name = "port_mapping_possible"; - gnet_property->props388.desc = _("Whether gtk-gnutella can install port mappings, if needed."); - gnet_property->props388.ev_changed = event_new("port_mapping_possible_changed"); - gnet_property->props388.save = FALSE; + gnet_property->props388.name = "natpmp_debug"; + gnet_property->props388.desc = _("Debug level for the NAT-PMP layer."); + gnet_property->props388.ev_changed = event_new("natpmp_debug_changed"); + gnet_property->props388.save = TRUE; + gnet_property->props388.internal = FALSE; gnet_property->props388.vector_size = 1; + mutex_init(&gnet_property->props388.lock); /* Type specific data: */ - gnet_property->props388.type = PROP_TYPE_BOOLEAN; - gnet_property->props388.data.boolean.def = (void *) &gnet_property_variable_port_mapping_possible_default; - gnet_property->props388.data.boolean.value = (void *) &gnet_property_variable_port_mapping_possible; + gnet_property->props388.type = PROP_TYPE_GUINT32; + gnet_property->props388.data.guint32.def = (void *) &gnet_property_variable_natpmp_debug_default; + gnet_property->props388.data.guint32.value = (void *) &gnet_property_variable_natpmp_debug; + gnet_property->props388.data.guint32.choices = NULL; + gnet_property->props388.data.guint32.max = 20; + gnet_property->props388.data.guint32.min = 0; /* - * PROP_NATPMP_DEBUG: + * PROP_ENABLE_NATPMP: * * General data: */ - gnet_property->props389.name = "natpmp_debug"; - gnet_property->props389.desc = _("Debug level for the NAT-PMP layer."); - gnet_property->props389.ev_changed = event_new("natpmp_debug_changed"); + gnet_property->props389.name = "enable_natpmp"; + gnet_property->props389.desc = _("Whether NAT-PMP (NAT Port Mapping Protocol) should be enabled. Support for NAT-PMP means gtk-gnutella will be able to look whether your default gateway (router) supports the Port Mapping Protocol to allow transparent redirection of the external ports on the router to the local machine, thereby making sure you are not firewalled. By default you should leave it enabled unless you know how to configure your network equipment manually to prevent the firewalled condition for both TCP and UDP."); + gnet_property->props389.ev_changed = event_new("enable_natpmp_changed"); gnet_property->props389.save = TRUE; + gnet_property->props389.internal = FALSE; gnet_property->props389.vector_size = 1; + mutex_init(&gnet_property->props389.lock); /* Type specific data: */ - gnet_property->props389.type = PROP_TYPE_GUINT32; - gnet_property->props389.data.guint32.def = (void *) &gnet_property_variable_natpmp_debug_default; - gnet_property->props389.data.guint32.value = (void *) &gnet_property_variable_natpmp_debug; - gnet_property->props389.data.guint32.choices = NULL; - gnet_property->props389.data.guint32.max = 20; - gnet_property->props389.data.guint32.min = 0; + gnet_property->props389.type = PROP_TYPE_BOOLEAN; + gnet_property->props389.data.boolean.def = (void *) &gnet_property_variable_enable_natpmp_default; + gnet_property->props389.data.boolean.value = (void *) &gnet_property_variable_enable_natpmp; /* - * PROP_ENABLE_NATPMP: + * PROP_NATPMP_POSSIBLE: * * General data: */ - gnet_property->props390.name = "enable_natpmp"; - gnet_property->props390.desc = _("Whether NAT-PMP (NAT Port Mapping Protocol) should be enabled. Support for NAT-PMP means gtk-gnutella will be able to look whether your default gateway (router) supports the Port Mapping Protocol to allow transparent redirection of the external ports on the router to the local machine, thereby making sure you are not firewalled. By default you should leave it enabled unless you know how to configure your network equipment manually to prevent the firewalled condition for both TCP and UDP."); - gnet_property->props390.ev_changed = event_new("enable_natpmp_changed"); - gnet_property->props390.save = TRUE; + gnet_property->props390.name = "natpmp_possible"; + gnet_property->props390.desc = _("Whether gtk-gnutella was able to locate a NAT-PMP gateway to install port mappings, if required."); + gnet_property->props390.ev_changed = event_new("natpmp_possible_changed"); + gnet_property->props390.save = FALSE; + gnet_property->props390.internal = TRUE; gnet_property->props390.vector_size = 1; + mutex_init(&gnet_property->props390.lock); /* Type specific data: */ gnet_property->props390.type = PROP_TYPE_BOOLEAN; - gnet_property->props390.data.boolean.def = (void *) &gnet_property_variable_enable_natpmp_default; - gnet_property->props390.data.boolean.value = (void *) &gnet_property_variable_enable_natpmp; + gnet_property->props390.data.boolean.def = (void *) &gnet_property_variable_natpmp_possible_default; + gnet_property->props390.data.boolean.value = (void *) &gnet_property_variable_natpmp_possible; /* - * PROP_NATPMP_POSSIBLE: + * PROP_TX_DEBUG: * * General data: */ - gnet_property->props391.name = "natpmp_possible"; - gnet_property->props391.desc = _("Whether gtk-gnutella was able to locate a NAT-PMP gateway to install port mappings, if required."); - gnet_property->props391.ev_changed = event_new("natpmp_possible_changed"); - gnet_property->props391.save = FALSE; + gnet_property->props391.name = "tx_debug"; + gnet_property->props391.desc = _("Debug level for the TX (transmit) network layer."); + gnet_property->props391.ev_changed = event_new("tx_debug_changed"); + gnet_property->props391.save = TRUE; + gnet_property->props391.internal = FALSE; gnet_property->props391.vector_size = 1; + mutex_init(&gnet_property->props391.lock); /* Type specific data: */ - gnet_property->props391.type = PROP_TYPE_BOOLEAN; - gnet_property->props391.data.boolean.def = (void *) &gnet_property_variable_natpmp_possible_default; - gnet_property->props391.data.boolean.value = (void *) &gnet_property_variable_natpmp_possible; + gnet_property->props391.type = PROP_TYPE_GUINT32; + gnet_property->props391.data.guint32.def = (void *) &gnet_property_variable_tx_debug_default; + gnet_property->props391.data.guint32.value = (void *) &gnet_property_variable_tx_debug; + gnet_property->props391.data.guint32.choices = NULL; + gnet_property->props391.data.guint32.max = 20; + gnet_property->props391.data.guint32.min = 0; /* - * PROP_TX_DEBUG: + * PROP_RX_DEBUG: * * General data: */ - gnet_property->props392.name = "tx_debug"; - gnet_property->props392.desc = _("Debug level for the TX (transmit) network layer."); - gnet_property->props392.ev_changed = event_new("tx_debug_changed"); + gnet_property->props392.name = "rx_debug"; + gnet_property->props392.desc = _("Debug level for the RX (receive) network layer."); + gnet_property->props392.ev_changed = event_new("rx_debug_changed"); gnet_property->props392.save = TRUE; + gnet_property->props392.internal = FALSE; gnet_property->props392.vector_size = 1; + mutex_init(&gnet_property->props392.lock); /* Type specific data: */ gnet_property->props392.type = PROP_TYPE_GUINT32; - gnet_property->props392.data.guint32.def = (void *) &gnet_property_variable_tx_debug_default; - gnet_property->props392.data.guint32.value = (void *) &gnet_property_variable_tx_debug; + gnet_property->props392.data.guint32.def = (void *) &gnet_property_variable_rx_debug_default; + gnet_property->props392.data.guint32.value = (void *) &gnet_property_variable_rx_debug; gnet_property->props392.data.guint32.choices = NULL; gnet_property->props392.data.guint32.max = 20; gnet_property->props392.data.guint32.min = 0; /* - * PROP_RX_DEBUG: + * PROP_INPUTEVT_DEBUG: * * General data: */ - gnet_property->props393.name = "rx_debug"; - gnet_property->props393.desc = _("Debug level for the RX (receive) network layer."); - gnet_property->props393.ev_changed = event_new("rx_debug_changed"); + gnet_property->props393.name = "inputevt_debug"; + gnet_property->props393.desc = _("Debug level for the I/O input event layer."); + gnet_property->props393.ev_changed = event_new("inputevt_debug_changed"); gnet_property->props393.save = TRUE; + gnet_property->props393.internal = FALSE; gnet_property->props393.vector_size = 1; + mutex_init(&gnet_property->props393.lock); /* Type specific data: */ gnet_property->props393.type = PROP_TYPE_GUINT32; - gnet_property->props393.data.guint32.def = (void *) &gnet_property_variable_rx_debug_default; - gnet_property->props393.data.guint32.value = (void *) &gnet_property_variable_rx_debug; + gnet_property->props393.data.guint32.def = (void *) &gnet_property_variable_inputevt_debug_default; + gnet_property->props393.data.guint32.value = (void *) &gnet_property_variable_inputevt_debug; gnet_property->props393.data.guint32.choices = NULL; gnet_property->props393.data.guint32.max = 20; gnet_property->props393.data.guint32.min = 0; /* - * PROP_INPUTEVT_DEBUG: + * PROP_BG_DEBUG: * * General data: */ - gnet_property->props394.name = "inputevt_debug"; - gnet_property->props394.desc = _("Debug level for the I/O input event layer."); - gnet_property->props394.ev_changed = event_new("inputevt_debug_changed"); + gnet_property->props394.name = "bg_debug"; + gnet_property->props394.desc = _("Debug level for the background task scheduler."); + gnet_property->props394.ev_changed = event_new("bg_debug_changed"); gnet_property->props394.save = TRUE; + gnet_property->props394.internal = FALSE; gnet_property->props394.vector_size = 1; + mutex_init(&gnet_property->props394.lock); /* Type specific data: */ gnet_property->props394.type = PROP_TYPE_GUINT32; - gnet_property->props394.data.guint32.def = (void *) &gnet_property_variable_inputevt_debug_default; - gnet_property->props394.data.guint32.value = (void *) &gnet_property_variable_inputevt_debug; + gnet_property->props394.data.guint32.def = (void *) &gnet_property_variable_bg_debug_default; + gnet_property->props394.data.guint32.value = (void *) &gnet_property_variable_bg_debug; gnet_property->props394.data.guint32.choices = NULL; gnet_property->props394.data.guint32.max = 20; gnet_property->props394.data.guint32.min = 0; /* - * PROP_BG_DEBUG: + * PROP_PORT_MAPPING_SUCCESSFUL: * * General data: */ - gnet_property->props395.name = "bg_debug"; - gnet_property->props395.desc = _("Debug level for the background task scheduler."); - gnet_property->props395.ev_changed = event_new("bg_debug_changed"); - gnet_property->props395.save = TRUE; + gnet_property->props395.name = "port_mapping_successful"; + gnet_property->props395.desc = _("Whether gtk-gnutella was able to configure port mappings."); + gnet_property->props395.ev_changed = event_new("port_mapping_successful_changed"); + gnet_property->props395.save = FALSE; + gnet_property->props395.internal = TRUE; gnet_property->props395.vector_size = 1; + mutex_init(&gnet_property->props395.lock); /* Type specific data: */ - gnet_property->props395.type = PROP_TYPE_GUINT32; - gnet_property->props395.data.guint32.def = (void *) &gnet_property_variable_bg_debug_default; - gnet_property->props395.data.guint32.value = (void *) &gnet_property_variable_bg_debug; - gnet_property->props395.data.guint32.choices = NULL; - gnet_property->props395.data.guint32.max = 20; - gnet_property->props395.data.guint32.min = 0; + gnet_property->props395.type = PROP_TYPE_BOOLEAN; + gnet_property->props395.data.boolean.def = (void *) &gnet_property_variable_port_mapping_successful_default; + gnet_property->props395.data.boolean.value = (void *) &gnet_property_variable_port_mapping_successful; /* - * PROP_PORT_MAPPING_SUCCESSFUL: + * PROP_UPLOADS_BW_NO_STEALING: * * General data: */ - gnet_property->props396.name = "port_mapping_successful"; - gnet_property->props396.desc = _("Whether gtk-gnutella was able to configure port mappings."); - gnet_property->props396.ev_changed = event_new("port_mapping_successful_changed"); + gnet_property->props396.name = "uploads_bw_no_stealing"; + gnet_property->props396.desc = _("Whether gtk-gnutella disabled HTTP bandwidth stealing."); + gnet_property->props396.ev_changed = event_new("uploads_bw_no_stealing_changed"); gnet_property->props396.save = FALSE; + gnet_property->props396.internal = TRUE; gnet_property->props396.vector_size = 1; + mutex_init(&gnet_property->props396.lock); /* Type specific data: */ gnet_property->props396.type = PROP_TYPE_BOOLEAN; - gnet_property->props396.data.boolean.def = (void *) &gnet_property_variable_port_mapping_successful_default; - gnet_property->props396.data.boolean.value = (void *) &gnet_property_variable_port_mapping_successful; + gnet_property->props396.data.boolean.def = (void *) &gnet_property_variable_uploads_bw_no_stealing_default; + gnet_property->props396.data.boolean.value = (void *) &gnet_property_variable_uploads_bw_no_stealing; /* - * PROP_UPLOADS_BW_NO_STEALING: + * PROP_UPLOADS_BW_IGNORE_STOLEN: * * General data: */ - gnet_property->props397.name = "uploads_bw_no_stealing"; - gnet_property->props397.desc = _("Whether gtk-gnutella disabled HTTP bandwidth stealing."); - gnet_property->props397.ev_changed = event_new("uploads_bw_no_stealing_changed"); + gnet_property->props397.name = "uploads_bw_ignore_stolen"; + gnet_property->props397.desc = _("Whether gtk-gnutella ignores HTTP stolen bandwidth."); + gnet_property->props397.ev_changed = event_new("uploads_bw_ignore_stolen_changed"); gnet_property->props397.save = FALSE; + gnet_property->props397.internal = TRUE; gnet_property->props397.vector_size = 1; + mutex_init(&gnet_property->props397.lock); /* Type specific data: */ gnet_property->props397.type = PROP_TYPE_BOOLEAN; - gnet_property->props397.data.boolean.def = (void *) &gnet_property_variable_uploads_bw_no_stealing_default; - gnet_property->props397.data.boolean.value = (void *) &gnet_property_variable_uploads_bw_no_stealing; + gnet_property->props397.data.boolean.def = (void *) &gnet_property_variable_uploads_bw_ignore_stolen_default; + gnet_property->props397.data.boolean.value = (void *) &gnet_property_variable_uploads_bw_ignore_stolen; /* - * PROP_UPLOADS_BW_IGNORE_STOLEN: + * PROP_UPLOADS_BW_UNIFORM: * * General data: */ - gnet_property->props398.name = "uploads_bw_ignore_stolen"; - gnet_property->props398.desc = _("Whether gtk-gnutella ignores HTTP stolen bandwidth."); - gnet_property->props398.ev_changed = event_new("uploads_bw_ignore_stolen_changed"); + gnet_property->props398.name = "uploads_bw_uniform"; + gnet_property->props398.desc = _("Whether gtk-gnutella enforces uniform HTTP outgoing bandwidth."); + gnet_property->props398.ev_changed = event_new("uploads_bw_uniform_changed"); gnet_property->props398.save = FALSE; + gnet_property->props398.internal = TRUE; gnet_property->props398.vector_size = 1; + mutex_init(&gnet_property->props398.lock); /* Type specific data: */ gnet_property->props398.type = PROP_TYPE_BOOLEAN; - gnet_property->props398.data.boolean.def = (void *) &gnet_property_variable_uploads_bw_ignore_stolen_default; - gnet_property->props398.data.boolean.value = (void *) &gnet_property_variable_uploads_bw_ignore_stolen; + gnet_property->props398.data.boolean.def = (void *) &gnet_property_variable_uploads_bw_uniform_default; + gnet_property->props398.data.boolean.value = (void *) &gnet_property_variable_uploads_bw_uniform; /* - * PROP_UPLOADS_BW_UNIFORM: + * PROP_ENABLE_HTTP_PIPELINING: * * General data: */ - gnet_property->props399.name = "uploads_bw_uniform"; - gnet_property->props399.desc = _("Whether gtk-gnutella enforces uniform HTTP outgoing bandwidth."); - gnet_property->props399.ev_changed = event_new("uploads_bw_uniform_changed"); - gnet_property->props399.save = FALSE; + gnet_property->props399.name = "enable_http_pipelining"; + gnet_property->props399.desc = _("Whether gtk-gnutella should use HTTP request pipelining when possible, in order to decrease downloading latency."); + gnet_property->props399.ev_changed = event_new("enable_http_pipelining_changed"); + gnet_property->props399.save = TRUE; + gnet_property->props399.internal = FALSE; gnet_property->props399.vector_size = 1; + mutex_init(&gnet_property->props399.lock); /* Type specific data: */ gnet_property->props399.type = PROP_TYPE_BOOLEAN; - gnet_property->props399.data.boolean.def = (void *) &gnet_property_variable_uploads_bw_uniform_default; - gnet_property->props399.data.boolean.value = (void *) &gnet_property_variable_uploads_bw_uniform; + gnet_property->props399.data.boolean.def = (void *) &gnet_property_variable_enable_http_pipelining_default; + gnet_property->props399.data.boolean.value = (void *) &gnet_property_variable_enable_http_pipelining; /* - * PROP_ENABLE_HTTP_PIPELINING: + * PROP_DL_PIPELINE_MAXCHUNKSIZE: * * General data: */ - gnet_property->props400.name = "enable_http_pipelining"; - gnet_property->props400.desc = _("Whether gtk-gnutella should use HTTP request pipelining when possible, in order to decrease downloading latency."); - gnet_property->props400.ev_changed = event_new("enable_http_pipelining_changed"); + gnet_property->props400.name = "dl_pipeline_maxchunksize"; + gnet_property->props400.desc = _("Maximum chunk size when swarming with HTTP pipelining."); + gnet_property->props400.ev_changed = event_new("dl_pipeline_maxchunksize_changed"); gnet_property->props400.save = TRUE; + gnet_property->props400.internal = FALSE; gnet_property->props400.vector_size = 1; + mutex_init(&gnet_property->props400.lock); /* Type specific data: */ - gnet_property->props400.type = PROP_TYPE_BOOLEAN; - gnet_property->props400.data.boolean.def = (void *) &gnet_property_variable_enable_http_pipelining_default; - gnet_property->props400.data.boolean.value = (void *) &gnet_property_variable_enable_http_pipelining; + gnet_property->props400.type = PROP_TYPE_GUINT32; + gnet_property->props400.data.guint32.def = (void *) &gnet_property_variable_dl_pipeline_maxchunksize_default; + gnet_property->props400.data.guint32.value = (void *) &gnet_property_variable_dl_pipeline_maxchunksize; + gnet_property->props400.data.guint32.choices = NULL; + gnet_property->props400.data.guint32.max = 10*1024*1024; + gnet_property->props400.data.guint32.min = 64*1024; /* - * PROP_DL_PIPELINE_MAXCHUNKSIZE: + * PROP_ENABLE_GUESS: * * General data: */ - gnet_property->props401.name = "dl_pipeline_maxchunksize"; - gnet_property->props401.desc = _("Maximum chunk size when swarming with HTTP pipelining."); - gnet_property->props401.ev_changed = event_new("dl_pipeline_maxchunksize_changed"); + gnet_property->props401.name = "enable_guess"; + gnet_property->props401.desc = _("Whether the Gnutella UDP Extension for Scalable Searches (GUESS) should be enabled. With GUESS enabled, gtk-gnutella offers the network the ability to perform iterative Ultrapeer queries instead of just broadcasting, allowing searches to more places within the Gnutella network. If you want gtk-gnutella to issue GUESS queries, you need to make sure the client-side is enabled as well as this setting only governs mostly the server-side of GUESS (required to allow the client-side)."); + gnet_property->props401.ev_changed = event_new("enable_guess_changed"); gnet_property->props401.save = TRUE; + gnet_property->props401.internal = FALSE; gnet_property->props401.vector_size = 1; + mutex_init(&gnet_property->props401.lock); /* Type specific data: */ - gnet_property->props401.type = PROP_TYPE_GUINT32; - gnet_property->props401.data.guint32.def = (void *) &gnet_property_variable_dl_pipeline_maxchunksize_default; - gnet_property->props401.data.guint32.value = (void *) &gnet_property_variable_dl_pipeline_maxchunksize; - gnet_property->props401.data.guint32.choices = NULL; - gnet_property->props401.data.guint32.max = 10*1024*1024; - gnet_property->props401.data.guint32.min = 64*1024; + gnet_property->props401.type = PROP_TYPE_BOOLEAN; + gnet_property->props401.data.boolean.def = (void *) &gnet_property_variable_enable_guess_default; + gnet_property->props401.data.boolean.value = (void *) &gnet_property_variable_enable_guess; /* - * PROP_ENABLE_GUESS: + * PROP_GUESS_SERVER_DEBUG: * * General data: */ - gnet_property->props402.name = "enable_guess"; - gnet_property->props402.desc = _("Whether the Gnutella UDP Extension for Scalable Searches (GUESS) should be enabled. With GUESS enabled, gtk-gnutella offers the network the ability to perform iterative Ultrapeer queries instead of just broadcasting, allowing searches to more places within the Gnutella network. If you want gtk-gnutella to issue GUESS queries, you need to make sure the client-side is enabled as well as this setting only governs mostly the server-side of GUESS (required to allow the client-side)."); - gnet_property->props402.ev_changed = event_new("enable_guess_changed"); + gnet_property->props402.name = "guess_server_debug"; + gnet_property->props402.desc = _("Debug level for server-side GUESS (Gnutella UDP Extension for Scalable Searches)."); + gnet_property->props402.ev_changed = event_new("guess_server_debug_changed"); gnet_property->props402.save = TRUE; + gnet_property->props402.internal = FALSE; gnet_property->props402.vector_size = 1; + mutex_init(&gnet_property->props402.lock); /* Type specific data: */ - gnet_property->props402.type = PROP_TYPE_BOOLEAN; - gnet_property->props402.data.boolean.def = (void *) &gnet_property_variable_enable_guess_default; - gnet_property->props402.data.boolean.value = (void *) &gnet_property_variable_enable_guess; + gnet_property->props402.type = PROP_TYPE_GUINT32; + gnet_property->props402.data.guint32.def = (void *) &gnet_property_variable_guess_server_debug_default; + gnet_property->props402.data.guint32.value = (void *) &gnet_property_variable_guess_server_debug; + gnet_property->props402.data.guint32.choices = NULL; + gnet_property->props402.data.guint32.max = 0xFFFFFFFF; + gnet_property->props402.data.guint32.min = 0x00000000; /* - * PROP_GUESS_SERVER_DEBUG: + * PROP_GUESS_CLIENT_DEBUG: * * General data: */ - gnet_property->props403.name = "guess_server_debug"; - gnet_property->props403.desc = _("Debug level for server-side GUESS (Gnutella UDP Extension for Scalable Searches)."); - gnet_property->props403.ev_changed = event_new("guess_server_debug_changed"); + gnet_property->props403.name = "guess_client_debug"; + gnet_property->props403.desc = _("Debug level for client-side GUESS (Gnutella UDP Extension for Scalable Searches)."); + gnet_property->props403.ev_changed = event_new("guess_client_debug_changed"); gnet_property->props403.save = TRUE; + gnet_property->props403.internal = FALSE; gnet_property->props403.vector_size = 1; + mutex_init(&gnet_property->props403.lock); /* Type specific data: */ gnet_property->props403.type = PROP_TYPE_GUINT32; - gnet_property->props403.data.guint32.def = (void *) &gnet_property_variable_guess_server_debug_default; - gnet_property->props403.data.guint32.value = (void *) &gnet_property_variable_guess_server_debug; + gnet_property->props403.data.guint32.def = (void *) &gnet_property_variable_guess_client_debug_default; + gnet_property->props403.data.guint32.value = (void *) &gnet_property_variable_guess_client_debug; gnet_property->props403.data.guint32.choices = NULL; gnet_property->props403.data.guint32.max = 0xFFFFFFFF; gnet_property->props403.data.guint32.min = 0x00000000; /* - * PROP_GUESS_CLIENT_DEBUG: + * PROP_MAX_GUESS_HOSTS_CACHED: * * General data: */ - gnet_property->props404.name = "guess_client_debug"; - gnet_property->props404.desc = _("Debug level for client-side GUESS (Gnutella UDP Extension for Scalable Searches)."); - gnet_property->props404.ev_changed = event_new("guess_client_debug_changed"); + gnet_property->props404.name = "max_guess_hosts_cached"; + gnet_property->props404.desc = _("Maximum number of IPv4 hosts in the regular GUESS cache."); + gnet_property->props404.ev_changed = event_new("max_guess_hosts_cached_changed"); gnet_property->props404.save = TRUE; + gnet_property->props404.internal = FALSE; gnet_property->props404.vector_size = 1; + mutex_init(&gnet_property->props404.lock); /* Type specific data: */ gnet_property->props404.type = PROP_TYPE_GUINT32; - gnet_property->props404.data.guint32.def = (void *) &gnet_property_variable_guess_client_debug_default; - gnet_property->props404.data.guint32.value = (void *) &gnet_property_variable_guess_client_debug; + gnet_property->props404.data.guint32.def = (void *) &gnet_property_variable_max_guess_hosts_cached_default; + gnet_property->props404.data.guint32.value = (void *) &gnet_property_variable_max_guess_hosts_cached; gnet_property->props404.data.guint32.choices = NULL; - gnet_property->props404.data.guint32.max = 0xFFFFFFFF; - gnet_property->props404.data.guint32.min = 0x00000000; + gnet_property->props404.data.guint32.max = 10000; + gnet_property->props404.data.guint32.min = 100; /* - * PROP_MAX_GUESS_HOSTS_CACHED: + * PROP_HOSTS_IN_GUESS_CATCHER: * * General data: */ - gnet_property->props405.name = "max_guess_hosts_cached"; - gnet_property->props405.desc = _("Maximum number of IPv4 hosts in the regular GUESS cache."); - gnet_property->props405.ev_changed = event_new("max_guess_hosts_cached_changed"); - gnet_property->props405.save = TRUE; + gnet_property->props405.name = "hosts_in_guess_catcher"; + gnet_property->props405.desc = _("Current number of IPv4 hosts in the regular GUESS cache."); + gnet_property->props405.ev_changed = event_new("hosts_in_guess_catcher_changed"); + gnet_property->props405.save = FALSE; + gnet_property->props405.internal = TRUE; gnet_property->props405.vector_size = 1; + mutex_init(&gnet_property->props405.lock); /* Type specific data: */ gnet_property->props405.type = PROP_TYPE_GUINT32; - gnet_property->props405.data.guint32.def = (void *) &gnet_property_variable_max_guess_hosts_cached_default; - gnet_property->props405.data.guint32.value = (void *) &gnet_property_variable_max_guess_hosts_cached; + gnet_property->props405.data.guint32.def = (void *) &gnet_property_variable_hosts_in_guess_catcher_default; + gnet_property->props405.data.guint32.value = (void *) &gnet_property_variable_hosts_in_guess_catcher; gnet_property->props405.data.guint32.choices = NULL; - gnet_property->props405.data.guint32.max = 10000; - gnet_property->props405.data.guint32.min = 100; + gnet_property->props405.data.guint32.max = INT_MAX; + gnet_property->props405.data.guint32.min = 0; /* - * PROP_HOSTS_IN_GUESS_CATCHER: + * PROP_MAX_GUESS_INTRO_HOSTS_CACHED: * * General data: */ - gnet_property->props406.name = "hosts_in_guess_catcher"; - gnet_property->props406.desc = _("Current number of IPv4 hosts in the regular GUESS cache."); - gnet_property->props406.ev_changed = event_new("hosts_in_guess_catcher_changed"); - gnet_property->props406.save = FALSE; + gnet_property->props406.name = "max_guess_intro_hosts_cached"; + gnet_property->props406.desc = _("Maximum number of IPv4 hosts in the introduction GUESS cache."); + gnet_property->props406.ev_changed = event_new("max_guess_intro_hosts_cached_changed"); + gnet_property->props406.save = TRUE; + gnet_property->props406.internal = FALSE; gnet_property->props406.vector_size = 1; + mutex_init(&gnet_property->props406.lock); /* Type specific data: */ gnet_property->props406.type = PROP_TYPE_GUINT32; - gnet_property->props406.data.guint32.def = (void *) &gnet_property_variable_hosts_in_guess_catcher_default; - gnet_property->props406.data.guint32.value = (void *) &gnet_property_variable_hosts_in_guess_catcher; + gnet_property->props406.data.guint32.def = (void *) &gnet_property_variable_max_guess_intro_hosts_cached_default; + gnet_property->props406.data.guint32.value = (void *) &gnet_property_variable_max_guess_intro_hosts_cached; gnet_property->props406.data.guint32.choices = NULL; - gnet_property->props406.data.guint32.max = INT_MAX; - gnet_property->props406.data.guint32.min = 0; + gnet_property->props406.data.guint32.max = 50000; + gnet_property->props406.data.guint32.min = 1000; /* - * PROP_MAX_GUESS_INTRO_HOSTS_CACHED: + * PROP_HOSTS_IN_GUESS_INTRO_CATCHER: * * General data: */ - gnet_property->props407.name = "max_guess_intro_hosts_cached"; - gnet_property->props407.desc = _("Maximum number of IPv4 hosts in the introduction GUESS cache."); - gnet_property->props407.ev_changed = event_new("max_guess_intro_hosts_cached_changed"); - gnet_property->props407.save = TRUE; + gnet_property->props407.name = "hosts_in_guess_intro_catcher"; + gnet_property->props407.desc = _("Current number of IPv4 hosts in the introduction GUESS cache."); + gnet_property->props407.ev_changed = event_new("hosts_in_guess_intro_catcher_changed"); + gnet_property->props407.save = FALSE; + gnet_property->props407.internal = TRUE; gnet_property->props407.vector_size = 1; + mutex_init(&gnet_property->props407.lock); /* Type specific data: */ gnet_property->props407.type = PROP_TYPE_GUINT32; - gnet_property->props407.data.guint32.def = (void *) &gnet_property_variable_max_guess_intro_hosts_cached_default; - gnet_property->props407.data.guint32.value = (void *) &gnet_property_variable_max_guess_intro_hosts_cached; + gnet_property->props407.data.guint32.def = (void *) &gnet_property_variable_hosts_in_guess_intro_catcher_default; + gnet_property->props407.data.guint32.value = (void *) &gnet_property_variable_hosts_in_guess_intro_catcher; gnet_property->props407.data.guint32.choices = NULL; - gnet_property->props407.data.guint32.max = 50000; - gnet_property->props407.data.guint32.min = 1000; + gnet_property->props407.data.guint32.max = INT_MAX; + gnet_property->props407.data.guint32.min = 0; /* - * PROP_HOSTS_IN_GUESS_INTRO_CATCHER: + * PROP_DBSTORE_DEBUG: * * General data: */ - gnet_property->props408.name = "hosts_in_guess_intro_catcher"; - gnet_property->props408.desc = _("Current number of IPv4 hosts in the introduction GUESS cache."); - gnet_property->props408.ev_changed = event_new("hosts_in_guess_intro_catcher_changed"); - gnet_property->props408.save = FALSE; + gnet_property->props408.name = "dbstore_debug"; + gnet_property->props408.desc = _("Debug level for the DB disk/RAM storage layer."); + gnet_property->props408.ev_changed = event_new("dbstore_debug_changed"); + gnet_property->props408.save = TRUE; + gnet_property->props408.internal = FALSE; gnet_property->props408.vector_size = 1; + mutex_init(&gnet_property->props408.lock); /* Type specific data: */ gnet_property->props408.type = PROP_TYPE_GUINT32; - gnet_property->props408.data.guint32.def = (void *) &gnet_property_variable_hosts_in_guess_intro_catcher_default; - gnet_property->props408.data.guint32.value = (void *) &gnet_property_variable_hosts_in_guess_intro_catcher; + gnet_property->props408.data.guint32.def = (void *) &gnet_property_variable_dbstore_debug_default; + gnet_property->props408.data.guint32.value = (void *) &gnet_property_variable_dbstore_debug; gnet_property->props408.data.guint32.choices = NULL; - gnet_property->props408.data.guint32.max = INT_MAX; + gnet_property->props408.data.guint32.max = 20; gnet_property->props408.data.guint32.min = 0; /* - * PROP_DBSTORE_DEBUG: + * PROP_SESSION_ID: * * General data: */ - gnet_property->props409.name = "dbstore_debug"; - gnet_property->props409.desc = _("Debug level for the DB disk/RAM storage layer."); - gnet_property->props409.ev_changed = event_new("dbstore_debug_changed"); - gnet_property->props409.save = TRUE; - gnet_property->props409.vector_size = 1; + gnet_property->props409.name = "session_id"; + gnet_property->props409.desc = _("The current Session ID. This is a unique ID generated each time gtk-gnutella starts and it can be monitored from the shell interface to check whether gtk-gnutella has been restarted since the last check."); + gnet_property->props409.ev_changed = event_new("session_id_changed"); + gnet_property->props409.save = FALSE; + gnet_property->props409.internal = TRUE; + gnet_property->props409.vector_size = GUID_RAW_SIZE; + mutex_init(&gnet_property->props409.lock); /* Type specific data: */ - gnet_property->props409.type = PROP_TYPE_GUINT32; - gnet_property->props409.data.guint32.def = (void *) &gnet_property_variable_dbstore_debug_default; - gnet_property->props409.data.guint32.value = (void *) &gnet_property_variable_dbstore_debug; - gnet_property->props409.data.guint32.choices = NULL; - gnet_property->props409.data.guint32.max = 20; - gnet_property->props409.data.guint32.min = 0; + gnet_property->props409.type = PROP_TYPE_STORAGE; + gnet_property->props409.data.storage.value = gnet_property_variable_session_id; /* - * PROP_SESSION_ID: + * PROP_PFSP_RARE_SERVER: * * General data: */ - gnet_property->props410.name = "session_id"; - gnet_property->props410.desc = _("The current Session ID. This is a unique ID generated each time gtk-gnutella starts and it can be monitored from the shell interface to check whether gtk-gnutella has been restarted since the last check."); - gnet_property->props410.ev_changed = event_new("session_id_changed"); - gnet_property->props410.save = FALSE; - gnet_property->props410.vector_size = GUID_RAW_SIZE; + gnet_property->props410.name = "pfsp_rare_server"; + gnet_property->props410.desc = _("Whether gtk-gnutella should serve partial files which are rare on the network to increase their spreading rate. It is good for the health of the network to always leave this enabled. This setting supersedes the disabling of global partial file sharing for rare files only."); + gnet_property->props410.ev_changed = event_new("pfsp_rare_server_changed"); + gnet_property->props410.save = TRUE; + gnet_property->props410.internal = FALSE; + gnet_property->props410.vector_size = 1; + mutex_init(&gnet_property->props410.lock); /* Type specific data: */ - gnet_property->props410.type = PROP_TYPE_STORAGE; - gnet_property->props410.data.storage.value = gnet_property_variable_session_id; + gnet_property->props410.type = PROP_TYPE_BOOLEAN; + gnet_property->props410.data.boolean.def = (void *) &gnet_property_variable_pfsp_rare_server_default; + gnet_property->props410.data.boolean.value = (void *) &gnet_property_variable_pfsp_rare_server; /* - * PROP_PFSP_RARE_SERVER: + * PROP_ENABLE_GUESS_CLIENT: * * General data: */ - gnet_property->props411.name = "pfsp_rare_server"; - gnet_property->props411.desc = _("Whether gtk-gnutella should serve partial files which are rare on the network to increase their spreading rate. It is good for the health of the network to always leave this enabled. This setting supersedes the disabling of global partial file sharing for rare files only."); - gnet_property->props411.ev_changed = event_new("pfsp_rare_server_changed"); + gnet_property->props411.name = "enable_guess_client"; + gnet_property->props411.desc = _("Whether the Gnutella UDP Extension for Scalable Searches (GUESS) client side should be enabled, so that gtk-gnutella can indeed issue iterative Ultrapeer queries instead of just broadcasting them. If enabled, it requires general GUESS support enabled as well or it will simply be ignored."); + gnet_property->props411.ev_changed = event_new("enable_guess_client_changed"); gnet_property->props411.save = TRUE; + gnet_property->props411.internal = FALSE; gnet_property->props411.vector_size = 1; + mutex_init(&gnet_property->props411.lock); /* Type specific data: */ gnet_property->props411.type = PROP_TYPE_BOOLEAN; - gnet_property->props411.data.boolean.def = (void *) &gnet_property_variable_pfsp_rare_server_default; - gnet_property->props411.data.boolean.value = (void *) &gnet_property_variable_pfsp_rare_server; + gnet_property->props411.data.boolean.def = (void *) &gnet_property_variable_enable_guess_client_default; + gnet_property->props411.data.boolean.value = (void *) &gnet_property_variable_enable_guess_client; /* - * PROP_ENABLE_GUESS_CLIENT: + * PROP_BW_GUESS_OUT: * * General data: */ - gnet_property->props412.name = "enable_guess_client"; - gnet_property->props412.desc = _("Whether the Gnutella UDP Extension for Scalable Searches (GUESS) client side should be enabled, so that gtk-gnutella can indeed issue iterative Ultrapeer queries instead of just broadcasting them. If enabled, it requires general GUESS support enabled as well or it will simply be ignored."); - gnet_property->props412.ev_changed = event_new("enable_guess_client_changed"); + gnet_property->props412.name = "guess_output_bandwidth"; + gnet_property->props412.desc = _("Bandwidth hint for GUESS querying, in bytes/sec, limiting the amount of concurrency that can be used for GUESS. Lower numbers mean slower querying overall"); + gnet_property->props412.ev_changed = event_new("bw_guess_out_changed"); gnet_property->props412.save = TRUE; + gnet_property->props412.internal = FALSE; gnet_property->props412.vector_size = 1; + mutex_init(&gnet_property->props412.lock); /* Type specific data: */ - gnet_property->props412.type = PROP_TYPE_BOOLEAN; - gnet_property->props412.data.boolean.def = (void *) &gnet_property_variable_enable_guess_client_default; - gnet_property->props412.data.boolean.value = (void *) &gnet_property_variable_enable_guess_client; + gnet_property->props412.type = PROP_TYPE_GUINT32; + gnet_property->props412.data.guint32.def = (void *) &gnet_property_variable_bw_guess_out_default; + gnet_property->props412.data.guint32.value = (void *) &gnet_property_variable_bw_guess_out; + gnet_property->props412.data.guint32.choices = NULL; + gnet_property->props412.data.guint32.max = BS_BW_MAX; + gnet_property->props412.data.guint32.min = 256; /* - * PROP_BW_GUESS_OUT: + * PROP_MATCHING_DEBUG: * * General data: */ - gnet_property->props413.name = "guess_output_bandwidth"; - gnet_property->props413.desc = _("Bandwidth hint for GUESS querying, in bytes/sec, limiting the amount of concurrency that can be used for GUESS. Lower numbers mean slower querying overall"); - gnet_property->props413.ev_changed = event_new("bw_guess_out_changed"); + gnet_property->props413.name = "matching_debug"; + gnet_property->props413.desc = _("Debug level for the matching code."); + gnet_property->props413.ev_changed = event_new("matching_debug_changed"); gnet_property->props413.save = TRUE; + gnet_property->props413.internal = FALSE; gnet_property->props413.vector_size = 1; + mutex_init(&gnet_property->props413.lock); /* Type specific data: */ gnet_property->props413.type = PROP_TYPE_GUINT32; - gnet_property->props413.data.guint32.def = (void *) &gnet_property_variable_bw_guess_out_default; - gnet_property->props413.data.guint32.value = (void *) &gnet_property_variable_bw_guess_out; + gnet_property->props413.data.guint32.def = (void *) &gnet_property_variable_matching_debug_default; + gnet_property->props413.data.guint32.value = (void *) &gnet_property_variable_matching_debug; gnet_property->props413.data.guint32.choices = NULL; - gnet_property->props413.data.guint32.max = BS_BW_MAX; - gnet_property->props413.data.guint32.min = 256; + gnet_property->props413.data.guint32.max = 0xFFFFFFFF; + gnet_property->props413.data.guint32.min = 0x00000000; /* - * PROP_MATCHING_DEBUG: + * PROP_TSYNC_DEBUG: * * General data: */ - gnet_property->props414.name = "matching_debug"; - gnet_property->props414.desc = _("Debug level for the matching code."); - gnet_property->props414.ev_changed = event_new("matching_debug_changed"); + gnet_property->props414.name = "tsync_debug"; + gnet_property->props414.desc = _("Debug level for the time synchronization code."); + gnet_property->props414.ev_changed = event_new("tsync_debug_changed"); gnet_property->props414.save = TRUE; + gnet_property->props414.internal = FALSE; gnet_property->props414.vector_size = 1; + mutex_init(&gnet_property->props414.lock); /* Type specific data: */ gnet_property->props414.type = PROP_TYPE_GUINT32; - gnet_property->props414.data.guint32.def = (void *) &gnet_property_variable_matching_debug_default; - gnet_property->props414.data.guint32.value = (void *) &gnet_property_variable_matching_debug; + gnet_property->props414.data.guint32.def = (void *) &gnet_property_variable_tsync_debug_default; + gnet_property->props414.data.guint32.value = (void *) &gnet_property_variable_tsync_debug; gnet_property->props414.data.guint32.choices = NULL; gnet_property->props414.data.guint32.max = 0xFFFFFFFF; gnet_property->props414.data.guint32.min = 0x00000000; /* - * PROP_TSYNC_DEBUG: + * PROP_QUERY_REQUEST_PARTIALS: * * General data: */ - gnet_property->props415.name = "tsync_debug"; - gnet_property->props415.desc = _("Debug level for the time synchronization code."); - gnet_property->props415.ev_changed = event_new("tsync_debug_changed"); + gnet_property->props415.name = "query_request_partials"; + gnet_property->props415.desc = _("Whether queries can request partial results hits, i.e. files which are incompletely available on remote hosts."); + gnet_property->props415.ev_changed = event_new("query_request_partials_changed"); gnet_property->props415.save = TRUE; + gnet_property->props415.internal = FALSE; gnet_property->props415.vector_size = 1; + mutex_init(&gnet_property->props415.lock); /* Type specific data: */ - gnet_property->props415.type = PROP_TYPE_GUINT32; - gnet_property->props415.data.guint32.def = (void *) &gnet_property_variable_tsync_debug_default; - gnet_property->props415.data.guint32.value = (void *) &gnet_property_variable_tsync_debug; - gnet_property->props415.data.guint32.choices = NULL; - gnet_property->props415.data.guint32.max = 0xFFFFFFFF; - gnet_property->props415.data.guint32.min = 0x00000000; + gnet_property->props415.type = PROP_TYPE_BOOLEAN; + gnet_property->props415.data.boolean.def = (void *) &gnet_property_variable_query_request_partials_default; + gnet_property->props415.data.boolean.value = (void *) &gnet_property_variable_query_request_partials; /* - * PROP_QUERY_REQUEST_PARTIALS: + * PROP_QUERY_ANSWER_PARTIALS: * * General data: */ - gnet_property->props416.name = "query_request_partials"; - gnet_property->props416.desc = _("Whether queries can request partial results hits, i.e. files which are incompletely available on remote hosts."); - gnet_property->props416.ev_changed = event_new("query_request_partials_changed"); + gnet_property->props416.name = "query_answer_partials"; + gnet_property->props416.desc = _("Whether queries for partial files should be answered to.When Partial File Sharing is disabled this setting is of course ignored and no partial results are returned."); + gnet_property->props416.ev_changed = event_new("query_answer_partials_changed"); gnet_property->props416.save = TRUE; + gnet_property->props416.internal = FALSE; gnet_property->props416.vector_size = 1; + mutex_init(&gnet_property->props416.lock); /* Type specific data: */ gnet_property->props416.type = PROP_TYPE_BOOLEAN; - gnet_property->props416.data.boolean.def = (void *) &gnet_property_variable_query_request_partials_default; - gnet_property->props416.data.boolean.value = (void *) &gnet_property_variable_query_request_partials; + gnet_property->props416.data.boolean.def = (void *) &gnet_property_variable_query_answer_partials_default; + gnet_property->props416.data.boolean.value = (void *) &gnet_property_variable_query_answer_partials; /* - * PROP_QUERY_ANSWER_PARTIALS: + * PROP_QUERY_ANSWER_WHATS_NEW: * * General data: */ - gnet_property->props417.name = "query_answer_partials"; - gnet_property->props417.desc = _("Whether queries for partial files should be answered to.When Partial File Sharing is disabled this setting is of course ignored and no partial results are returned."); - gnet_property->props417.ev_changed = event_new("query_answer_partials_changed"); + gnet_property->props417.name = "query_answer_whats_new"; + gnet_property->props417.desc = _("Whether what's-new? queries should be answered to."); + gnet_property->props417.ev_changed = event_new("query_answer_whats_new_changed"); gnet_property->props417.save = TRUE; + gnet_property->props417.internal = FALSE; gnet_property->props417.vector_size = 1; + mutex_init(&gnet_property->props417.lock); /* Type specific data: */ gnet_property->props417.type = PROP_TYPE_BOOLEAN; - gnet_property->props417.data.boolean.def = (void *) &gnet_property_variable_query_answer_partials_default; - gnet_property->props417.data.boolean.value = (void *) &gnet_property_variable_query_answer_partials; + gnet_property->props417.data.boolean.def = (void *) &gnet_property_variable_query_answer_whats_new_default; + gnet_property->props417.data.boolean.value = (void *) &gnet_property_variable_query_answer_whats_new; /* - * PROP_QUERY_ANSWER_WHATS_NEW: + * PROP_SEARCH_SMART_STOP: * * General data: */ - gnet_property->props418.name = "query_answer_whats_new"; - gnet_property->props418.desc = _("Whether what's-new? queries should be answered to."); - gnet_property->props418.ev_changed = event_new("query_answer_whats_new_changed"); + gnet_property->props418.name = "search_smart_stop"; + gnet_property->props418.desc = _("When set, gtk-gnutella will automatically stop opened searches from which all the requested downloads have been completed, regardless of the initially configured expiration time."); + gnet_property->props418.ev_changed = event_new("search_smart_stop_changed"); gnet_property->props418.save = TRUE; + gnet_property->props418.internal = FALSE; gnet_property->props418.vector_size = 1; + mutex_init(&gnet_property->props418.lock); /* Type specific data: */ gnet_property->props418.type = PROP_TYPE_BOOLEAN; - gnet_property->props418.data.boolean.def = (void *) &gnet_property_variable_query_answer_whats_new_default; - gnet_property->props418.data.boolean.value = (void *) &gnet_property_variable_query_answer_whats_new; + gnet_property->props418.data.boolean.def = (void *) &gnet_property_variable_search_smart_stop_default; + gnet_property->props418.data.boolean.value = (void *) &gnet_property_variable_search_smart_stop; /* - * PROP_SEARCH_SMART_STOP: + * PROP_WHATS_NEW_SEARCH_MAX_RESULTS: * * General data: */ - gnet_property->props419.name = "search_smart_stop"; - gnet_property->props419.desc = _("When set, gtk-gnutella will automatically stop opened searches from which all the requested downloads have been completed, regardless of the initially configured expiration time."); - gnet_property->props419.ev_changed = event_new("search_smart_stop_changed"); + gnet_property->props419.name = "whats_new_search_max_results"; + gnet_property->props419.desc = _("Maximum number of results to show in a What's New? request."); + gnet_property->props419.ev_changed = event_new("whats_new_search_max_results_changed"); gnet_property->props419.save = TRUE; + gnet_property->props419.internal = FALSE; gnet_property->props419.vector_size = 1; + mutex_init(&gnet_property->props419.lock); /* Type specific data: */ - gnet_property->props419.type = PROP_TYPE_BOOLEAN; - gnet_property->props419.data.boolean.def = (void *) &gnet_property_variable_search_smart_stop_default; - gnet_property->props419.data.boolean.value = (void *) &gnet_property_variable_search_smart_stop; + gnet_property->props419.type = PROP_TYPE_GUINT32; + gnet_property->props419.data.guint32.def = (void *) &gnet_property_variable_whats_new_search_max_results_default; + gnet_property->props419.data.guint32.value = (void *) &gnet_property_variable_whats_new_search_max_results; + gnet_property->props419.data.guint32.choices = NULL; + gnet_property->props419.data.guint32.max = 500000; + gnet_property->props419.data.guint32.min = 100; /* - * PROP_WHATS_NEW_SEARCH_MAX_RESULTS: + * PROP_PASSIVE_SEARCH_MAX_RESULTS: * * General data: */ - gnet_property->props420.name = "whats_new_search_max_results"; - gnet_property->props420.desc = _("Maximum number of results to show in a What's New? request."); - gnet_property->props420.ev_changed = event_new("whats_new_search_max_results_changed"); + gnet_property->props420.name = "passive_search_max_results"; + gnet_property->props420.desc = _("Maximum number of results to show in a passive search request."); + gnet_property->props420.ev_changed = event_new("passive_search_max_results_changed"); gnet_property->props420.save = TRUE; + gnet_property->props420.internal = FALSE; gnet_property->props420.vector_size = 1; + mutex_init(&gnet_property->props420.lock); /* Type specific data: */ gnet_property->props420.type = PROP_TYPE_GUINT32; - gnet_property->props420.data.guint32.def = (void *) &gnet_property_variable_whats_new_search_max_results_default; - gnet_property->props420.data.guint32.value = (void *) &gnet_property_variable_whats_new_search_max_results; + gnet_property->props420.data.guint32.def = (void *) &gnet_property_variable_passive_search_max_results_default; + gnet_property->props420.data.guint32.value = (void *) &gnet_property_variable_passive_search_max_results; gnet_property->props420.data.guint32.choices = NULL; gnet_property->props420.data.guint32.max = 500000; gnet_property->props420.data.guint32.min = 100; /* - * PROP_PASSIVE_SEARCH_MAX_RESULTS: + * PROP_LOG_DUP_GNUTELLA_SAME_NODE: * * General data: */ - gnet_property->props421.name = "passive_search_max_results"; - gnet_property->props421.desc = _("Maximum number of results to show in a passive search request."); - gnet_property->props421.ev_changed = event_new("passive_search_max_results_changed"); + gnet_property->props421.name = "log_dup_gnutella_same_node"; + gnet_property->props421.desc = _("Whether to log duplicate Gnutella messages from same node."); + gnet_property->props421.ev_changed = event_new("log_dup_gnutella_same_node_changed"); gnet_property->props421.save = TRUE; + gnet_property->props421.internal = FALSE; gnet_property->props421.vector_size = 1; + mutex_init(&gnet_property->props421.lock); /* Type specific data: */ - gnet_property->props421.type = PROP_TYPE_GUINT32; - gnet_property->props421.data.guint32.def = (void *) &gnet_property_variable_passive_search_max_results_default; - gnet_property->props421.data.guint32.value = (void *) &gnet_property_variable_passive_search_max_results; - gnet_property->props421.data.guint32.choices = NULL; - gnet_property->props421.data.guint32.max = 500000; - gnet_property->props421.data.guint32.min = 100; + gnet_property->props421.type = PROP_TYPE_BOOLEAN; + gnet_property->props421.data.boolean.def = (void *) &gnet_property_variable_log_dup_gnutella_same_node_default; + gnet_property->props421.data.boolean.value = (void *) &gnet_property_variable_log_dup_gnutella_same_node; /* - * PROP_LOG_DUP_GNUTELLA_SAME_NODE: + * PROP_LOG_DUP_GNUTELLA_HIGHER_TTL: * * General data: */ - gnet_property->props422.name = "log_dup_gnutella_same_node"; - gnet_property->props422.desc = _("Whether to log duplicate Gnutella messages from same node."); - gnet_property->props422.ev_changed = event_new("log_dup_gnutella_same_node_changed"); + gnet_property->props422.name = "log_dup_gnutella_higher_ttl"; + gnet_property->props422.desc = _("Whether to log duplicate Gnutella messages with a higher TTL."); + gnet_property->props422.ev_changed = event_new("log_dup_gnutella_higher_ttl_changed"); gnet_property->props422.save = TRUE; + gnet_property->props422.internal = FALSE; gnet_property->props422.vector_size = 1; + mutex_init(&gnet_property->props422.lock); /* Type specific data: */ gnet_property->props422.type = PROP_TYPE_BOOLEAN; - gnet_property->props422.data.boolean.def = (void *) &gnet_property_variable_log_dup_gnutella_same_node_default; - gnet_property->props422.data.boolean.value = (void *) &gnet_property_variable_log_dup_gnutella_same_node; + gnet_property->props422.data.boolean.def = (void *) &gnet_property_variable_log_dup_gnutella_higher_ttl_default; + gnet_property->props422.data.boolean.value = (void *) &gnet_property_variable_log_dup_gnutella_higher_ttl; /* - * PROP_LOG_DUP_GNUTELLA_HIGHER_TTL: + * PROP_LOG_DUP_GNUTELLA_OTHER_NODE: * * General data: */ - gnet_property->props423.name = "log_dup_gnutella_higher_ttl"; - gnet_property->props423.desc = _("Whether to log duplicate Gnutella messages with a higher TTL."); - gnet_property->props423.ev_changed = event_new("log_dup_gnutella_higher_ttl_changed"); + gnet_property->props423.name = "log_dup_gnutella_other_node"; + gnet_property->props423.desc = _("Whether to log duplicate Gnutella messages (not from same node)."); + gnet_property->props423.ev_changed = event_new("log_dup_gnutella_other_node_changed"); gnet_property->props423.save = TRUE; + gnet_property->props423.internal = FALSE; gnet_property->props423.vector_size = 1; + mutex_init(&gnet_property->props423.lock); /* Type specific data: */ gnet_property->props423.type = PROP_TYPE_BOOLEAN; - gnet_property->props423.data.boolean.def = (void *) &gnet_property_variable_log_dup_gnutella_higher_ttl_default; - gnet_property->props423.data.boolean.value = (void *) &gnet_property_variable_log_dup_gnutella_higher_ttl; + gnet_property->props423.data.boolean.def = (void *) &gnet_property_variable_log_dup_gnutella_other_node_default; + gnet_property->props423.data.boolean.value = (void *) &gnet_property_variable_log_dup_gnutella_other_node; /* - * PROP_LOG_DUP_GNUTELLA_OTHER_NODE: + * PROP_LOG_NEW_GNUTELLA: * * General data: */ - gnet_property->props424.name = "log_dup_gnutella_other_node"; - gnet_property->props424.desc = _("Whether to log duplicate Gnutella messages (not from same node)."); - gnet_property->props424.ev_changed = event_new("log_dup_gnutella_other_node_changed"); + gnet_property->props424.name = "log_new_gnutella"; + gnet_property->props424.desc = _("Whether to log new Gnutella messages, never seen before."); + gnet_property->props424.ev_changed = event_new("log_new_gnutella_changed"); gnet_property->props424.save = TRUE; + gnet_property->props424.internal = FALSE; gnet_property->props424.vector_size = 1; + mutex_init(&gnet_property->props424.lock); /* Type specific data: */ gnet_property->props424.type = PROP_TYPE_BOOLEAN; - gnet_property->props424.data.boolean.def = (void *) &gnet_property_variable_log_dup_gnutella_other_node_default; - gnet_property->props424.data.boolean.value = (void *) &gnet_property_variable_log_dup_gnutella_other_node; + gnet_property->props424.data.boolean.def = (void *) &gnet_property_variable_log_new_gnutella_default; + gnet_property->props424.data.boolean.value = (void *) &gnet_property_variable_log_new_gnutella; /* - * PROP_LOG_NEW_GNUTELLA: + * PROP_LOG_GNUTELLA_ROUTING: * * General data: */ - gnet_property->props425.name = "log_new_gnutella"; - gnet_property->props425.desc = _("Whether to log new Gnutella messages, never seen before."); - gnet_property->props425.ev_changed = event_new("log_new_gnutella_changed"); + gnet_property->props425.name = "log_gnutella_routing"; + gnet_property->props425.desc = _("Whether to log Gnutella routing decisions."); + gnet_property->props425.ev_changed = event_new("log_gnutella_routing_changed"); gnet_property->props425.save = TRUE; + gnet_property->props425.internal = FALSE; gnet_property->props425.vector_size = 1; + mutex_init(&gnet_property->props425.lock); /* Type specific data: */ gnet_property->props425.type = PROP_TYPE_BOOLEAN; - gnet_property->props425.data.boolean.def = (void *) &gnet_property_variable_log_new_gnutella_default; - gnet_property->props425.data.boolean.value = (void *) &gnet_property_variable_log_new_gnutella; + gnet_property->props425.data.boolean.def = (void *) &gnet_property_variable_log_gnutella_routing_default; + gnet_property->props425.data.boolean.value = (void *) &gnet_property_variable_log_gnutella_routing; /* - * PROP_LOG_GNUTELLA_ROUTING: + * PROP_LOG_BAD_GNUTELLA: * * General data: */ - gnet_property->props426.name = "log_gnutella_routing"; - gnet_property->props426.desc = _("Whether to log Gnutella routing decisions."); - gnet_property->props426.ev_changed = event_new("log_gnutella_routing_changed"); + gnet_property->props426.name = "log_bad_gnutella"; + gnet_property->props426.desc = _("Whether to log bad Gnutella messages, corrupted or unexpected."); + gnet_property->props426.ev_changed = event_new("log_bad_gnutella_changed"); gnet_property->props426.save = TRUE; + gnet_property->props426.internal = FALSE; gnet_property->props426.vector_size = 1; + mutex_init(&gnet_property->props426.lock); /* Type specific data: */ gnet_property->props426.type = PROP_TYPE_BOOLEAN; - gnet_property->props426.data.boolean.def = (void *) &gnet_property_variable_log_gnutella_routing_default; - gnet_property->props426.data.boolean.value = (void *) &gnet_property_variable_log_gnutella_routing; + gnet_property->props426.data.boolean.def = (void *) &gnet_property_variable_log_bad_gnutella_default; + gnet_property->props426.data.boolean.value = (void *) &gnet_property_variable_log_bad_gnutella; /* - * PROP_LOG_BAD_GNUTELLA: + * PROP_LOG_SPAM_QUERY_HIT: * * General data: */ - gnet_property->props427.name = "log_bad_gnutella"; - gnet_property->props427.desc = _("Whether to log bad Gnutella messages, corrupted or unexpected."); - gnet_property->props427.ev_changed = event_new("log_bad_gnutella_changed"); + gnet_property->props427.name = "log_spam_query_hit"; + gnet_property->props427.desc = _("Whether to log conditions triggering query hit spam flagging."); + gnet_property->props427.ev_changed = event_new("log_spam_query_hit_changed"); gnet_property->props427.save = TRUE; + gnet_property->props427.internal = FALSE; gnet_property->props427.vector_size = 1; + mutex_init(&gnet_property->props427.lock); /* Type specific data: */ gnet_property->props427.type = PROP_TYPE_BOOLEAN; - gnet_property->props427.data.boolean.def = (void *) &gnet_property_variable_log_bad_gnutella_default; - gnet_property->props427.data.boolean.value = (void *) &gnet_property_variable_log_bad_gnutella; + gnet_property->props427.data.boolean.def = (void *) &gnet_property_variable_log_spam_query_hit_default; + gnet_property->props427.data.boolean.value = (void *) &gnet_property_variable_log_spam_query_hit; /* - * PROP_LOG_SPAM_QUERY_HIT: + * PROP_MAX_ULTRA6_HOSTS_CACHED: * * General data: */ - gnet_property->props428.name = "log_spam_query_hit"; - gnet_property->props428.desc = _("Whether to log conditions triggering query hit spam flagging."); - gnet_property->props428.ev_changed = event_new("log_spam_query_hit_changed"); + gnet_property->props428.name = "max_ultra6_hosts_cached"; + gnet_property->props428.desc = _("Maximum number of IPv6 hosts in the ultra node cache."); + gnet_property->props428.ev_changed = event_new("max_ultra6_hosts_cached_changed"); gnet_property->props428.save = TRUE; + gnet_property->props428.internal = FALSE; gnet_property->props428.vector_size = 1; + mutex_init(&gnet_property->props428.lock); /* Type specific data: */ - gnet_property->props428.type = PROP_TYPE_BOOLEAN; - gnet_property->props428.data.boolean.def = (void *) &gnet_property_variable_log_spam_query_hit_default; - gnet_property->props428.data.boolean.value = (void *) &gnet_property_variable_log_spam_query_hit; + gnet_property->props428.type = PROP_TYPE_GUINT32; + gnet_property->props428.data.guint32.def = (void *) &gnet_property_variable_max_ultra6_hosts_cached_default; + gnet_property->props428.data.guint32.value = (void *) &gnet_property_variable_max_ultra6_hosts_cached; + gnet_property->props428.data.guint32.choices = NULL; + gnet_property->props428.data.guint32.max = 50000; + gnet_property->props428.data.guint32.min = 100; /* - * PROP_MAX_ULTRA6_HOSTS_CACHED: + * PROP_HOSTS_IN_ULTRA6_CATCHER: * * General data: */ - gnet_property->props429.name = "max_ultra6_hosts_cached"; - gnet_property->props429.desc = _("Maximum number of IPv6 hosts in the ultra node cache."); - gnet_property->props429.ev_changed = event_new("max_ultra6_hosts_cached_changed"); - gnet_property->props429.save = TRUE; + gnet_property->props429.name = "hosts_in_ultra6_catcher"; + gnet_property->props429.desc = _("Current number of IPv6 hosts in ultra node caches."); + gnet_property->props429.ev_changed = event_new("hosts_in_ultra6_catcher_changed"); + gnet_property->props429.save = FALSE; + gnet_property->props429.internal = TRUE; gnet_property->props429.vector_size = 1; + mutex_init(&gnet_property->props429.lock); /* Type specific data: */ gnet_property->props429.type = PROP_TYPE_GUINT32; - gnet_property->props429.data.guint32.def = (void *) &gnet_property_variable_max_ultra6_hosts_cached_default; - gnet_property->props429.data.guint32.value = (void *) &gnet_property_variable_max_ultra6_hosts_cached; + gnet_property->props429.data.guint32.def = (void *) &gnet_property_variable_hosts_in_ultra6_catcher_default; + gnet_property->props429.data.guint32.value = (void *) &gnet_property_variable_hosts_in_ultra6_catcher; gnet_property->props429.data.guint32.choices = NULL; - gnet_property->props429.data.guint32.max = 50000; - gnet_property->props429.data.guint32.min = 100; + gnet_property->props429.data.guint32.max = INT_MAX; + gnet_property->props429.data.guint32.min = 0; /* - * PROP_HOSTS_IN_ULTRA6_CATCHER: + * PROP_HOSTS_IN_GUESS6_CATCHER: * * General data: */ - gnet_property->props430.name = "hosts_in_ultra6_catcher"; - gnet_property->props430.desc = _("Current number of IPv6 hosts in ultra node caches."); - gnet_property->props430.ev_changed = event_new("hosts_in_ultra6_catcher_changed"); + gnet_property->props430.name = "hosts_in_guess6_catcher"; + gnet_property->props430.desc = _("Current number of IPv6 hosts in the regular GUESS cache."); + gnet_property->props430.ev_changed = event_new("hosts_in_guess6_catcher_changed"); gnet_property->props430.save = FALSE; + gnet_property->props430.internal = TRUE; gnet_property->props430.vector_size = 1; + mutex_init(&gnet_property->props430.lock); /* Type specific data: */ gnet_property->props430.type = PROP_TYPE_GUINT32; - gnet_property->props430.data.guint32.def = (void *) &gnet_property_variable_hosts_in_ultra6_catcher_default; - gnet_property->props430.data.guint32.value = (void *) &gnet_property_variable_hosts_in_ultra6_catcher; + gnet_property->props430.data.guint32.def = (void *) &gnet_property_variable_hosts_in_guess6_catcher_default; + gnet_property->props430.data.guint32.value = (void *) &gnet_property_variable_hosts_in_guess6_catcher; gnet_property->props430.data.guint32.choices = NULL; gnet_property->props430.data.guint32.max = INT_MAX; gnet_property->props430.data.guint32.min = 0; /* - * PROP_HOSTS_IN_GUESS6_CATCHER: + * PROP_HOSTS_IN_GUESS6_INTRO_CATCHER: * * General data: */ - gnet_property->props431.name = "hosts_in_guess6_catcher"; - gnet_property->props431.desc = _("Current number of IPv6 hosts in the regular GUESS cache."); - gnet_property->props431.ev_changed = event_new("hosts_in_guess6_catcher_changed"); + gnet_property->props431.name = "hosts_in_guess6_intro_catcher"; + gnet_property->props431.desc = _("Current number of IPv6 hosts in the introduction GUESS cache."); + gnet_property->props431.ev_changed = event_new("hosts_in_guess6_intro_catcher_changed"); gnet_property->props431.save = FALSE; + gnet_property->props431.internal = TRUE; gnet_property->props431.vector_size = 1; + mutex_init(&gnet_property->props431.lock); /* Type specific data: */ gnet_property->props431.type = PROP_TYPE_GUINT32; - gnet_property->props431.data.guint32.def = (void *) &gnet_property_variable_hosts_in_guess6_catcher_default; - gnet_property->props431.data.guint32.value = (void *) &gnet_property_variable_hosts_in_guess6_catcher; + gnet_property->props431.data.guint32.def = (void *) &gnet_property_variable_hosts_in_guess6_intro_catcher_default; + gnet_property->props431.data.guint32.value = (void *) &gnet_property_variable_hosts_in_guess6_intro_catcher; gnet_property->props431.data.guint32.choices = NULL; gnet_property->props431.data.guint32.max = INT_MAX; gnet_property->props431.data.guint32.min = 0; /* - * PROP_HOSTS_IN_GUESS6_INTRO_CATCHER: + * PROP_MAX_GUESS6_HOSTS_CACHED: * * General data: */ - gnet_property->props432.name = "hosts_in_guess6_intro_catcher"; - gnet_property->props432.desc = _("Current number of IPv6 hosts in the introduction GUESS cache."); - gnet_property->props432.ev_changed = event_new("hosts_in_guess6_intro_catcher_changed"); - gnet_property->props432.save = FALSE; + gnet_property->props432.name = "max_guess6_hosts_cached"; + gnet_property->props432.desc = _("Maximum number of IPv6 hosts in the regular GUESS cache."); + gnet_property->props432.ev_changed = event_new("max_guess6_hosts_cached_changed"); + gnet_property->props432.save = TRUE; + gnet_property->props432.internal = FALSE; gnet_property->props432.vector_size = 1; + mutex_init(&gnet_property->props432.lock); /* Type specific data: */ gnet_property->props432.type = PROP_TYPE_GUINT32; - gnet_property->props432.data.guint32.def = (void *) &gnet_property_variable_hosts_in_guess6_intro_catcher_default; - gnet_property->props432.data.guint32.value = (void *) &gnet_property_variable_hosts_in_guess6_intro_catcher; + gnet_property->props432.data.guint32.def = (void *) &gnet_property_variable_max_guess6_hosts_cached_default; + gnet_property->props432.data.guint32.value = (void *) &gnet_property_variable_max_guess6_hosts_cached; gnet_property->props432.data.guint32.choices = NULL; - gnet_property->props432.data.guint32.max = INT_MAX; - gnet_property->props432.data.guint32.min = 0; + gnet_property->props432.data.guint32.max = 10000; + gnet_property->props432.data.guint32.min = 100; /* - * PROP_MAX_GUESS6_HOSTS_CACHED: + * PROP_MAX_GUESS6_INTRO_HOSTS_CACHED: * * General data: */ - gnet_property->props433.name = "max_guess6_hosts_cached"; - gnet_property->props433.desc = _("Maximum number of IPv6 hosts in the regular GUESS cache."); - gnet_property->props433.ev_changed = event_new("max_guess6_hosts_cached_changed"); + gnet_property->props433.name = "max_guess6_intro_hosts_cached"; + gnet_property->props433.desc = _("Maximum number of IPv6 hosts in the introduction GUESS cache."); + gnet_property->props433.ev_changed = event_new("max_guess6_intro_hosts_cached_changed"); gnet_property->props433.save = TRUE; + gnet_property->props433.internal = FALSE; gnet_property->props433.vector_size = 1; + mutex_init(&gnet_property->props433.lock); /* Type specific data: */ gnet_property->props433.type = PROP_TYPE_GUINT32; - gnet_property->props433.data.guint32.def = (void *) &gnet_property_variable_max_guess6_hosts_cached_default; - gnet_property->props433.data.guint32.value = (void *) &gnet_property_variable_max_guess6_hosts_cached; + gnet_property->props433.data.guint32.def = (void *) &gnet_property_variable_max_guess6_intro_hosts_cached_default; + gnet_property->props433.data.guint32.value = (void *) &gnet_property_variable_max_guess6_intro_hosts_cached; gnet_property->props433.data.guint32.choices = NULL; - gnet_property->props433.data.guint32.max = 10000; - gnet_property->props433.data.guint32.min = 100; + gnet_property->props433.data.guint32.max = 50000; + gnet_property->props433.data.guint32.min = 1000; /* - * PROP_MAX_GUESS6_INTRO_HOSTS_CACHED: + * PROP_XMALLOC_DEBUG: * * General data: */ - gnet_property->props434.name = "max_guess6_intro_hosts_cached"; - gnet_property->props434.desc = _("Maximum number of IPv6 hosts in the introduction GUESS cache."); - gnet_property->props434.ev_changed = event_new("max_guess6_intro_hosts_cached_changed"); + gnet_property->props434.name = "xmalloc_debug"; + gnet_property->props434.desc = _("Debug level for the malloc() replacement allocator."); + gnet_property->props434.ev_changed = event_new("xmalloc_debug_changed"); gnet_property->props434.save = TRUE; + gnet_property->props434.internal = FALSE; gnet_property->props434.vector_size = 1; + mutex_init(&gnet_property->props434.lock); /* Type specific data: */ gnet_property->props434.type = PROP_TYPE_GUINT32; - gnet_property->props434.data.guint32.def = (void *) &gnet_property_variable_max_guess6_intro_hosts_cached_default; - gnet_property->props434.data.guint32.value = (void *) &gnet_property_variable_max_guess6_intro_hosts_cached; + gnet_property->props434.data.guint32.def = (void *) &gnet_property_variable_xmalloc_debug_default; + gnet_property->props434.data.guint32.value = (void *) &gnet_property_variable_xmalloc_debug; gnet_property->props434.data.guint32.choices = NULL; - gnet_property->props434.data.guint32.max = 50000; - gnet_property->props434.data.guint32.min = 1000; + gnet_property->props434.data.guint32.max = 20; + gnet_property->props434.data.guint32.min = 0; /* - * PROP_XMALLOC_DEBUG: + * PROP_QHIT_BAD_DEBUG: * * General data: */ - gnet_property->props435.name = "xmalloc_debug"; - gnet_property->props435.desc = _("Debug level for the malloc() replacement allocator."); - gnet_property->props435.ev_changed = event_new("xmalloc_debug_changed"); + gnet_property->props435.name = "qhit_bad_debug"; + gnet_property->props435.desc = _("Debug level for bad query hit messages."); + gnet_property->props435.ev_changed = event_new("qhit_bad_debug_changed"); gnet_property->props435.save = TRUE; + gnet_property->props435.internal = FALSE; gnet_property->props435.vector_size = 1; + mutex_init(&gnet_property->props435.lock); /* Type specific data: */ gnet_property->props435.type = PROP_TYPE_GUINT32; - gnet_property->props435.data.guint32.def = (void *) &gnet_property_variable_xmalloc_debug_default; - gnet_property->props435.data.guint32.value = (void *) &gnet_property_variable_xmalloc_debug; + gnet_property->props435.data.guint32.def = (void *) &gnet_property_variable_qhit_bad_debug_default; + gnet_property->props435.data.guint32.value = (void *) &gnet_property_variable_qhit_bad_debug; gnet_property->props435.data.guint32.choices = NULL; gnet_property->props435.data.guint32.max = 20; gnet_property->props435.data.guint32.min = 0; /* - * PROP_QHIT_BAD_DEBUG: + * PROP_GUID_DEBUG: * * General data: */ - gnet_property->props436.name = "qhit_bad_debug"; - gnet_property->props436.desc = _("Debug level for bad query hit messages."); - gnet_property->props436.ev_changed = event_new("qhit_bad_debug_changed"); + gnet_property->props436.name = "guid_debug"; + gnet_property->props436.desc = _("Debug level for GUID management."); + gnet_property->props436.ev_changed = event_new("guid_debug_changed"); gnet_property->props436.save = TRUE; + gnet_property->props436.internal = FALSE; gnet_property->props436.vector_size = 1; + mutex_init(&gnet_property->props436.lock); /* Type specific data: */ gnet_property->props436.type = PROP_TYPE_GUINT32; - gnet_property->props436.data.guint32.def = (void *) &gnet_property_variable_qhit_bad_debug_default; - gnet_property->props436.data.guint32.value = (void *) &gnet_property_variable_qhit_bad_debug; + gnet_property->props436.data.guint32.def = (void *) &gnet_property_variable_guid_debug_default; + gnet_property->props436.data.guint32.value = (void *) &gnet_property_variable_guid_debug; gnet_property->props436.data.guint32.choices = NULL; gnet_property->props436.data.guint32.max = 20; gnet_property->props436.data.guint32.min = 0; /* - * PROP_GUID_DEBUG: + * PROP_TX_DEFLATE_DEBUG: * * General data: */ - gnet_property->props437.name = "guid_debug"; - gnet_property->props437.desc = _("Debug level for GUID management."); - gnet_property->props437.ev_changed = event_new("guid_debug_changed"); + gnet_property->props437.name = "tx_deflate_debug"; + gnet_property->props437.desc = _("Debug level for the TX (transmit) deflating network layer."); + gnet_property->props437.ev_changed = event_new("tx_deflate_debug_changed"); gnet_property->props437.save = TRUE; + gnet_property->props437.internal = FALSE; gnet_property->props437.vector_size = 1; + mutex_init(&gnet_property->props437.lock); /* Type specific data: */ gnet_property->props437.type = PROP_TYPE_GUINT32; - gnet_property->props437.data.guint32.def = (void *) &gnet_property_variable_guid_debug_default; - gnet_property->props437.data.guint32.value = (void *) &gnet_property_variable_guid_debug; + gnet_property->props437.data.guint32.def = (void *) &gnet_property_variable_tx_deflate_debug_default; + gnet_property->props437.data.guint32.value = (void *) &gnet_property_variable_tx_deflate_debug; gnet_property->props437.data.guint32.choices = NULL; gnet_property->props437.data.guint32.max = 20; gnet_property->props437.data.guint32.min = 0; /* - * PROP_TX_DEFLATE_DEBUG: + * PROP_TX_DEBUG_ADDRS: * * General data: */ - gnet_property->props438.name = "tx_deflate_debug"; - gnet_property->props438.desc = _("Debug level for the TX (transmit) deflating network layer."); - gnet_property->props438.ev_changed = event_new("tx_deflate_debug_changed"); + gnet_property->props438.name = "tx_debug_addrs"; + gnet_property->props438.desc = _("Comma-separated list of TX debugging hosts (IP addresses only)"); + gnet_property->props438.ev_changed = event_new("tx_debug_addrs_changed"); gnet_property->props438.save = TRUE; + gnet_property->props438.internal = FALSE; gnet_property->props438.vector_size = 1; + mutex_init(&gnet_property->props438.lock); /* Type specific data: */ - gnet_property->props438.type = PROP_TYPE_GUINT32; - gnet_property->props438.data.guint32.def = (void *) &gnet_property_variable_tx_deflate_debug_default; - gnet_property->props438.data.guint32.value = (void *) &gnet_property_variable_tx_deflate_debug; - gnet_property->props438.data.guint32.choices = NULL; - gnet_property->props438.data.guint32.max = 20; - gnet_property->props438.data.guint32.min = 0; + gnet_property->props438.type = PROP_TYPE_STRING; + gnet_property->props438.data.string.def = (void *) &gnet_property_variable_tx_debug_addrs_default; + gnet_property->props438.data.string.value = (void *) &gnet_property_variable_tx_debug_addrs; + if (gnet_property->props438.data.string.def) { + *gnet_property->props438.data.string.value = + g_strdup(eval_subst(*gnet_property->props438.data.string.def)); + } /* - * PROP_TX_DEBUG_ADDRS: + * PROP_DUMP_RX_ADDRS: * * General data: */ - gnet_property->props439.name = "tx_debug_addrs"; - gnet_property->props439.desc = _("Comma-separated list of TX debugging host (IP addresses only)"); - gnet_property->props439.ev_changed = event_new("tx_debug_addrs_changed"); + gnet_property->props439.name = "dump_rx_addrs"; + gnet_property->props439.desc = _("Comma-separated list of hosts for whom we want to dump RX traffic (IP addresses only)"); + gnet_property->props439.ev_changed = event_new("dump_rx_addrs_changed"); gnet_property->props439.save = TRUE; + gnet_property->props439.internal = FALSE; gnet_property->props439.vector_size = 1; + mutex_init(&gnet_property->props439.lock); /* Type specific data: */ gnet_property->props439.type = PROP_TYPE_STRING; - gnet_property->props439.data.string.def = (void *) &gnet_property_variable_tx_debug_addrs_default; - gnet_property->props439.data.string.value = (void *) &gnet_property_variable_tx_debug_addrs; + gnet_property->props439.data.string.def = (void *) &gnet_property_variable_dump_rx_addrs_default; + gnet_property->props439.data.string.value = (void *) &gnet_property_variable_dump_rx_addrs; if (gnet_property->props439.data.string.def) { *gnet_property->props439.data.string.value = g_strdup(eval_subst(*gnet_property->props439.data.string.def)); } - gnet_property->byName = g_hash_table_new(g_str_hash, g_str_equal); + + /* + * PROP_DUMP_TX_FROM_ADDRS: + * + * General data: + */ + gnet_property->props440.name = "dump_tx_from_addrs"; + gnet_property->props440.desc = _("Comma-separated list of hosts for whom we want to dump TX traffic they emit (IP addresses only)"); + gnet_property->props440.ev_changed = event_new("dump_tx_from_addrs_changed"); + gnet_property->props440.save = TRUE; + gnet_property->props440.internal = FALSE; + gnet_property->props440.vector_size = 1; + mutex_init(&gnet_property->props440.lock); + + /* Type specific data: */ + gnet_property->props440.type = PROP_TYPE_STRING; + gnet_property->props440.data.string.def = (void *) &gnet_property_variable_dump_tx_from_addrs_default; + gnet_property->props440.data.string.value = (void *) &gnet_property_variable_dump_tx_from_addrs; + if (gnet_property->props440.data.string.def) { + *gnet_property->props440.data.string.value = + g_strdup(eval_subst(*gnet_property->props440.data.string.def)); + } + + + /* + * PROP_DUMP_TX_TO_ADDRS: + * + * General data: + */ + gnet_property->props441.name = "dump_tx_to_addrs"; + gnet_property->props441.desc = _("Comma-separated list of hosts for whom we want to dump TX traffic they receive (IP addresses only)"); + gnet_property->props441.ev_changed = event_new("dump_tx_to_addrs_changed"); + gnet_property->props441.save = TRUE; + gnet_property->props441.internal = FALSE; + gnet_property->props441.vector_size = 1; + mutex_init(&gnet_property->props441.lock); + + /* Type specific data: */ + gnet_property->props441.type = PROP_TYPE_STRING; + gnet_property->props441.data.string.def = (void *) &gnet_property_variable_dump_tx_to_addrs_default; + gnet_property->props441.data.string.value = (void *) &gnet_property_variable_dump_tx_to_addrs; + if (gnet_property->props441.data.string.def) { + *gnet_property->props441.data.string.value = + g_strdup(eval_subst(*gnet_property->props441.data.string.def)); + } + + + /* + * PROP_GUESS_MAXIMIZE_BW: + * + * General data: + */ + gnet_property->props442.name = "guess_maximize_bw"; + gnet_property->props442.desc = _("Allow GUESS to use some of the unused Gnutella outgoing bandwidth regardless of the GUESS bandwidth hint. If FALSE, only the configured bandwidth hint will be used. When running as a leaf this should be set to TRUE to make GUESS queries run faster."); + gnet_property->props442.ev_changed = event_new("guess_maximize_bw_changed"); + gnet_property->props442.save = TRUE; + gnet_property->props442.internal = FALSE; + gnet_property->props442.vector_size = 1; + mutex_init(&gnet_property->props442.lock); + + /* Type specific data: */ + gnet_property->props442.type = PROP_TYPE_BOOLEAN; + gnet_property->props442.data.boolean.def = (void *) &gnet_property_variable_guess_maximize_bw_default; + gnet_property->props442.data.boolean.value = (void *) &gnet_property_variable_guess_maximize_bw; + + + /* + * PROP_UDP_SCHED_DEBUG: + * + * General data: + */ + gnet_property->props443.name = "udp_sched_debug"; + gnet_property->props443.desc = _("Debug level for the UDP TX scheduler."); + gnet_property->props443.ev_changed = event_new("udp_sched_debug_changed"); + gnet_property->props443.save = TRUE; + gnet_property->props443.internal = FALSE; + gnet_property->props443.vector_size = 1; + mutex_init(&gnet_property->props443.lock); + + /* Type specific data: */ + gnet_property->props443.type = PROP_TYPE_GUINT32; + gnet_property->props443.data.guint32.def = (void *) &gnet_property_variable_udp_sched_debug_default; + gnet_property->props443.data.guint32.value = (void *) &gnet_property_variable_udp_sched_debug; + gnet_property->props443.data.guint32.choices = NULL; + gnet_property->props443.data.guint32.max = 20; + gnet_property->props443.data.guint32.min = 0; + + + /* + * PROP_TX_UT_DEBUG_FLAGS: + * + * General data: + */ + gnet_property->props444.name = "tx_ut_debug_flags"; + gnet_property->props444.desc = _("Debugging flags for the semi-reliable UDP TX layer: 1: messages, 2: fragments, 4: acknowledgments, 8: transmissions, 16: timeouts."); + gnet_property->props444.ev_changed = event_new("tx_ut_debug_flags_changed"); + gnet_property->props444.save = TRUE; + gnet_property->props444.internal = FALSE; + gnet_property->props444.vector_size = 1; + mutex_init(&gnet_property->props444.lock); + + /* Type specific data: */ + gnet_property->props444.type = PROP_TYPE_GUINT32; + gnet_property->props444.data.guint32.def = (void *) &gnet_property_variable_tx_ut_debug_flags_default; + gnet_property->props444.data.guint32.value = (void *) &gnet_property_variable_tx_ut_debug_flags; + gnet_property->props444.data.guint32.choices = NULL; + gnet_property->props444.data.guint32.max = 0xFFFFFFFF; + gnet_property->props444.data.guint32.min = 0x00000000; + + + /* + * PROP_RX_DEBUG_ADDRS: + * + * General data: + */ + gnet_property->props445.name = "rx_debug_addrs"; + gnet_property->props445.desc = _("Comma-separated list of RX debugging hosts (IP addresses only)"); + gnet_property->props445.ev_changed = event_new("rx_debug_addrs_changed"); + gnet_property->props445.save = TRUE; + gnet_property->props445.internal = FALSE; + gnet_property->props445.vector_size = 1; + mutex_init(&gnet_property->props445.lock); + + /* Type specific data: */ + gnet_property->props445.type = PROP_TYPE_STRING; + gnet_property->props445.data.string.def = (void *) &gnet_property_variable_rx_debug_addrs_default; + gnet_property->props445.data.string.value = (void *) &gnet_property_variable_rx_debug_addrs; + if (gnet_property->props445.data.string.def) { + *gnet_property->props445.data.string.value = + g_strdup(eval_subst(*gnet_property->props445.data.string.def)); + } + + + /* + * PROP_RX_UT_DEBUG_FLAGS: + * + * General data: + */ + gnet_property->props446.name = "rx_ut_debug_flags"; + gnet_property->props446.desc = _("Debugging flags for the semi-reliable UDP RX layer: 1: messages, 2: fragments, 4: acknowledgments, 8: receptions, 16: timeouts."); + gnet_property->props446.ev_changed = event_new("rx_ut_debug_flags_changed"); + gnet_property->props446.save = TRUE; + gnet_property->props446.internal = FALSE; + gnet_property->props446.vector_size = 1; + mutex_init(&gnet_property->props446.lock); + + /* Type specific data: */ + gnet_property->props446.type = PROP_TYPE_GUINT32; + gnet_property->props446.data.guint32.def = (void *) &gnet_property_variable_rx_ut_debug_flags_default; + gnet_property->props446.data.guint32.value = (void *) &gnet_property_variable_rx_ut_debug_flags; + gnet_property->props446.data.guint32.choices = NULL; + gnet_property->props446.data.guint32.max = 0xFFFFFFFF; + gnet_property->props446.data.guint32.min = 0x00000000; + + + /* + * PROP_LOG_SR_UDP_TX: + * + * General data: + */ + gnet_property->props447.name = "log_sr_udp_tx"; + gnet_property->props447.desc = _("Whether to log sent semi-reliable UDP messages."); + gnet_property->props447.ev_changed = event_new("log_sr_udp_tx_changed"); + gnet_property->props447.save = TRUE; + gnet_property->props447.internal = FALSE; + gnet_property->props447.vector_size = 1; + mutex_init(&gnet_property->props447.lock); + + /* Type specific data: */ + gnet_property->props447.type = PROP_TYPE_BOOLEAN; + gnet_property->props447.data.boolean.def = (void *) &gnet_property_variable_log_sr_udp_tx_default; + gnet_property->props447.data.boolean.value = (void *) &gnet_property_variable_log_sr_udp_tx; + + + /* + * PROP_LOG_SR_UDP_RX: + * + * General data: + */ + gnet_property->props448.name = "log_sr_udp_rx"; + gnet_property->props448.desc = _("Whether to log received semi-reliable UDP messages."); + gnet_property->props448.ev_changed = event_new("log_sr_udp_rx_changed"); + gnet_property->props448.save = TRUE; + gnet_property->props448.internal = FALSE; + gnet_property->props448.vector_size = 1; + mutex_init(&gnet_property->props448.lock); + + /* Type specific data: */ + gnet_property->props448.type = PROP_TYPE_BOOLEAN; + gnet_property->props448.data.boolean.def = (void *) &gnet_property_variable_log_sr_udp_rx_default; + gnet_property->props448.data.boolean.value = (void *) &gnet_property_variable_log_sr_udp_rx; + + + /* + * PROP_SECURE_OOB_DEBUG: + * + * General data: + */ + gnet_property->props449.name = "secure_oob_debug"; + gnet_property->props449.desc = _("Debug level for the secured OOB query hit claiming."); + gnet_property->props449.ev_changed = event_new("secure_oob_debug_changed"); + gnet_property->props449.save = TRUE; + gnet_property->props449.internal = FALSE; + gnet_property->props449.vector_size = 1; + mutex_init(&gnet_property->props449.lock); + + /* Type specific data: */ + gnet_property->props449.type = PROP_TYPE_GUINT32; + gnet_property->props449.data.guint32.def = (void *) &gnet_property_variable_secure_oob_debug_default; + gnet_property->props449.data.guint32.value = (void *) &gnet_property_variable_secure_oob_debug; + gnet_property->props449.data.guint32.choices = NULL; + gnet_property->props449.data.guint32.max = 20; + gnet_property->props449.data.guint32.min = 0; + + + /* + * PROP_LOG_VMSG_TX: + * + * General data: + */ + gnet_property->props450.name = "log_vmsg_tx"; + gnet_property->props450.desc = _("Whether to log sent vendor messages."); + gnet_property->props450.ev_changed = event_new("log_vmsg_tx_changed"); + gnet_property->props450.save = TRUE; + gnet_property->props450.internal = FALSE; + gnet_property->props450.vector_size = 1; + mutex_init(&gnet_property->props450.lock); + + /* Type specific data: */ + gnet_property->props450.type = PROP_TYPE_BOOLEAN; + gnet_property->props450.data.boolean.def = (void *) &gnet_property_variable_log_vmsg_tx_default; + gnet_property->props450.data.boolean.value = (void *) &gnet_property_variable_log_vmsg_tx; + + + /* + * PROP_LOG_VMSG_RX: + * + * General data: + */ + gnet_property->props451.name = "log_vmsg_rx"; + gnet_property->props451.desc = _("Whether to log received vendor messages."); + gnet_property->props451.ev_changed = event_new("log_vmsg_rx_changed"); + gnet_property->props451.save = TRUE; + gnet_property->props451.internal = FALSE; + gnet_property->props451.vector_size = 1; + mutex_init(&gnet_property->props451.lock); + + /* Type specific data: */ + gnet_property->props451.type = PROP_TYPE_BOOLEAN; + gnet_property->props451.data.boolean.def = (void *) &gnet_property_variable_log_vmsg_rx_default; + gnet_property->props451.data.boolean.value = (void *) &gnet_property_variable_log_vmsg_rx; + + + /* + * PROP_DHT_TCACHE_DEBUG_FLAGS: + * + * General data: + */ + gnet_property->props452.name = "dht_tcache_debug_flags"; + gnet_property->props452.desc = _("Debugging flags for the DHT token cache (developers only)."); + gnet_property->props452.ev_changed = event_new("dht_tcache_debug_flags_changed"); + gnet_property->props452.save = TRUE; + gnet_property->props452.internal = FALSE; + gnet_property->props452.vector_size = 1; + mutex_init(&gnet_property->props452.lock); + + /* Type specific data: */ + gnet_property->props452.type = PROP_TYPE_GUINT32; + gnet_property->props452.data.guint32.def = (void *) &gnet_property_variable_dht_tcache_debug_flags_default; + gnet_property->props452.data.guint32.value = (void *) &gnet_property_variable_dht_tcache_debug_flags; + gnet_property->props452.data.guint32.choices = NULL; + gnet_property->props452.data.guint32.max = 0xFFFFFFFF; + gnet_property->props452.data.guint32.min = 0x00000000; + + + /* + * PROP_LOG_WEIRD_DHT_HEADERS: + * + * General data: + */ + gnet_property->props453.name = "log_weird_dht_headers"; + gnet_property->props453.desc = _("Whether to log weird DHT message headers when debugging."); + gnet_property->props453.ev_changed = event_new("log_weird_dht_headers_changed"); + gnet_property->props453.save = TRUE; + gnet_property->props453.internal = FALSE; + gnet_property->props453.vector_size = 1; + mutex_init(&gnet_property->props453.lock); + + /* Type specific data: */ + gnet_property->props453.type = PROP_TYPE_BOOLEAN; + gnet_property->props453.data.boolean.def = (void *) &gnet_property_variable_log_weird_dht_headers_default; + gnet_property->props453.data.boolean.value = (void *) &gnet_property_variable_log_weird_dht_headers; + + + /* + * PROP_DHT_RPC_DEBUG: + * + * General data: + */ + gnet_property->props454.name = "dht_rpc_debug"; + gnet_property->props454.desc = _("Debug level for the DHT Remote Procedure Call (RPC) code."); + gnet_property->props454.ev_changed = event_new("dht_rpc_debug_changed"); + gnet_property->props454.save = TRUE; + gnet_property->props454.internal = FALSE; + gnet_property->props454.vector_size = 1; + mutex_init(&gnet_property->props454.lock); + + /* Type specific data: */ + gnet_property->props454.type = PROP_TYPE_GUINT32; + gnet_property->props454.data.guint32.def = (void *) &gnet_property_variable_dht_rpc_debug_default; + gnet_property->props454.data.guint32.value = (void *) &gnet_property_variable_dht_rpc_debug; + gnet_property->props454.data.guint32.choices = NULL; + gnet_property->props454.data.guint32.max = 0xFFFFFFFF; + gnet_property->props454.data.guint32.min = 0x00000000; + + + /* + * PROP_LOG_UHC_PINGS_RX: + * + * General data: + */ + gnet_property->props455.name = "log_uhc_pings_rx"; + gnet_property->props455.desc = _("Whether to log UHC pings we receive."); + gnet_property->props455.ev_changed = event_new("log_uhc_pings_rx_changed"); + gnet_property->props455.save = TRUE; + gnet_property->props455.internal = FALSE; + gnet_property->props455.vector_size = 1; + mutex_init(&gnet_property->props455.lock); + + /* Type specific data: */ + gnet_property->props455.type = PROP_TYPE_BOOLEAN; + gnet_property->props455.data.boolean.def = (void *) &gnet_property_variable_log_uhc_pings_rx_default; + gnet_property->props455.data.boolean.value = (void *) &gnet_property_variable_log_uhc_pings_rx; + + + /* + * PROP_LOG_UHC_PINGS_TX: + * + * General data: + */ + gnet_property->props456.name = "log_uhc_pings_tx"; + gnet_property->props456.desc = _("Whether to log UHC pings we emit."); + gnet_property->props456.ev_changed = event_new("log_uhc_pings_tx_changed"); + gnet_property->props456.save = TRUE; + gnet_property->props456.internal = FALSE; + gnet_property->props456.vector_size = 1; + mutex_init(&gnet_property->props456.lock); + + /* Type specific data: */ + gnet_property->props456.type = PROP_TYPE_BOOLEAN; + gnet_property->props456.data.boolean.def = (void *) &gnet_property_variable_log_uhc_pings_tx_default; + gnet_property->props456.data.boolean.value = (void *) &gnet_property_variable_log_uhc_pings_tx; + + + /* + * PROP_CLEAN_SHUTDOWN: + * + * General data: + */ + gnet_property->props457.name = "clean_shutdown"; + gnet_property->props457.desc = _("Whether the program was properly shutdown."); + gnet_property->props457.ev_changed = event_new("clean_shutdown_changed"); + gnet_property->props457.save = TRUE; + gnet_property->props457.internal = TRUE; + gnet_property->props457.vector_size = 1; + mutex_init(&gnet_property->props457.lock); + + /* Type specific data: */ + gnet_property->props457.type = PROP_TYPE_BOOLEAN; + gnet_property->props457.data.boolean.def = (void *) &gnet_property_variable_clean_shutdown_default; + gnet_property->props457.data.boolean.value = (void *) &gnet_property_variable_clean_shutdown; + + + /* + * PROP_CLEAN_RESTART: + * + * General data: + */ + gnet_property->props458.name = "clean_restart"; + gnet_property->props458.desc = _("Whether the program restarted after a clean shutdown."); + gnet_property->props458.ev_changed = event_new("clean_restart_changed"); + gnet_property->props458.save = FALSE; + gnet_property->props458.internal = TRUE; + gnet_property->props458.vector_size = 1; + mutex_init(&gnet_property->props458.lock); + + /* Type specific data: */ + gnet_property->props458.type = PROP_TYPE_BOOLEAN; + gnet_property->props458.data.boolean.def = (void *) &gnet_property_variable_clean_restart_default; + gnet_property->props458.data.boolean.value = (void *) &gnet_property_variable_clean_restart; + + + /* + * PROP_DHT_KEYS_DEBUG: + * + * General data: + */ + gnet_property->props459.name = "dht_keys_debug"; + gnet_property->props459.desc = _("Debug level for DHT key management."); + gnet_property->props459.ev_changed = event_new("dht_keys_debug_changed"); + gnet_property->props459.save = TRUE; + gnet_property->props459.internal = FALSE; + gnet_property->props459.vector_size = 1; + mutex_init(&gnet_property->props459.lock); + + /* Type specific data: */ + gnet_property->props459.type = PROP_TYPE_GUINT32; + gnet_property->props459.data.guint32.def = (void *) &gnet_property_variable_dht_keys_debug_default; + gnet_property->props459.data.guint32.value = (void *) &gnet_property_variable_dht_keys_debug; + gnet_property->props459.data.guint32.choices = NULL; + gnet_property->props459.data.guint32.max = 0xFFFFFFFF; + gnet_property->props459.data.guint32.min = 0x00000000; + + + /* + * PROP_DHT_VALUES_DEBUG: + * + * General data: + */ + gnet_property->props460.name = "dht_values_debug"; + gnet_property->props460.desc = _("Debug level for DHT value management."); + gnet_property->props460.ev_changed = event_new("dht_values_debug_changed"); + gnet_property->props460.save = TRUE; + gnet_property->props460.internal = FALSE; + gnet_property->props460.vector_size = 1; + mutex_init(&gnet_property->props460.lock); + + /* Type specific data: */ + gnet_property->props460.type = PROP_TYPE_GUINT32; + gnet_property->props460.data.guint32.def = (void *) &gnet_property_variable_dht_values_debug_default; + gnet_property->props460.data.guint32.value = (void *) &gnet_property_variable_dht_values_debug; + gnet_property->props460.data.guint32.choices = NULL; + gnet_property->props460.data.guint32.max = 0xFFFFFFFF; + gnet_property->props460.data.guint32.min = 0x00000000; + + + /* + * PROP_PID: + * + * General data: + */ + gnet_property->props461.name = "pid"; + gnet_property->props461.desc = _("ID of the current process."); + gnet_property->props461.ev_changed = event_new("pid_changed"); + gnet_property->props461.save = TRUE; + gnet_property->props461.internal = TRUE; + gnet_property->props461.vector_size = 1; + mutex_init(&gnet_property->props461.lock); + + /* Type specific data: */ + gnet_property->props461.type = PROP_TYPE_GUINT32; + gnet_property->props461.data.guint32.def = (void *) &gnet_property_variable_pid_default; + gnet_property->props461.data.guint32.value = (void *) &gnet_property_variable_pid; + gnet_property->props461.data.guint32.choices = NULL; + gnet_property->props461.data.guint32.max = 0xFFFFFFFF; + gnet_property->props461.data.guint32.min = 0x00000000; + + + /* + * PROP_HTTP_RANGE_DEBUG: + * + * General data: + */ + gnet_property->props462.name = "http_range_debug"; + gnet_property->props462.desc = _("Debug level for HTTP range parsing / handling."); + gnet_property->props462.ev_changed = event_new("http_range_debug_changed"); + gnet_property->props462.save = TRUE; + gnet_property->props462.internal = FALSE; + gnet_property->props462.vector_size = 1; + mutex_init(&gnet_property->props462.lock); + + /* Type specific data: */ + gnet_property->props462.type = PROP_TYPE_GUINT32; + gnet_property->props462.data.guint32.def = (void *) &gnet_property_variable_http_range_debug_default; + gnet_property->props462.data.guint32.value = (void *) &gnet_property_variable_http_range_debug; + gnet_property->props462.data.guint32.choices = NULL; + gnet_property->props462.data.guint32.max = 0xFFFFFFFF; + gnet_property->props462.data.guint32.min = 0x00000000; + + + /* + * PROP_UPNP_MAPPING_LEASE_TIME: + * + * General data: + */ + gnet_property->props463.name = "upnp_mapping_lease_time"; + gnet_property->props463.desc = _("Lease time when installing port mappings via UPnP or NAT-PMP, in seconds. A value of 0 requests permanent mappings."); + gnet_property->props463.ev_changed = event_new("upnp_mapping_lease_time_changed"); + gnet_property->props463.save = TRUE; + gnet_property->props463.internal = FALSE; + gnet_property->props463.vector_size = 1; + mutex_init(&gnet_property->props463.lock); + + /* Type specific data: */ + gnet_property->props463.type = PROP_TYPE_GUINT32; + gnet_property->props463.data.guint32.def = (void *) &gnet_property_variable_upnp_mapping_lease_time_default; + gnet_property->props463.data.guint32.value = (void *) &gnet_property_variable_upnp_mapping_lease_time; + gnet_property->props463.data.guint32.choices = NULL; + gnet_property->props463.data.guint32.max = 31536000; + gnet_property->props463.data.guint32.min = 0; + + + /* + * PROP_USER_AUTO_RESTART: + * + * General data: + */ + gnet_property->props464.name = "user_auto_restart"; + gnet_property->props464.desc = _("Whether the program is auto-restarting at the user's request."); + gnet_property->props464.ev_changed = event_new("user_auto_restart_changed"); + gnet_property->props464.save = TRUE; + gnet_property->props464.internal = TRUE; + gnet_property->props464.vector_size = 1; + mutex_init(&gnet_property->props464.lock); + + /* Type specific data: */ + gnet_property->props464.type = PROP_TYPE_BOOLEAN; + gnet_property->props464.data.boolean.def = (void *) &gnet_property_variable_user_auto_restart_default; + gnet_property->props464.data.boolean.value = (void *) &gnet_property_variable_user_auto_restart; + + + /* + * PROP_TM_DEBUG: + * + * General data: + */ + gnet_property->props465.name = "tm_debug"; + gnet_property->props465.desc = _("Debug level for time management."); + gnet_property->props465.ev_changed = event_new("tm_debug_changed"); + gnet_property->props465.save = TRUE; + gnet_property->props465.internal = FALSE; + gnet_property->props465.vector_size = 1; + mutex_init(&gnet_property->props465.lock); + + /* Type specific data: */ + gnet_property->props465.type = PROP_TYPE_GUINT32; + gnet_property->props465.data.guint32.def = (void *) &gnet_property_variable_tm_debug_default; + gnet_property->props465.data.guint32.value = (void *) &gnet_property_variable_tm_debug; + gnet_property->props465.data.guint32.choices = NULL; + gnet_property->props465.data.guint32.max = 20; + gnet_property->props465.data.guint32.min = 0; + + + /* + * PROP_TMALLOC_DEBUG: + * + * General data: + */ + gnet_property->props466.name = "tmalloc_debug"; + gnet_property->props466.desc = _("Debug level for the tmalloc() thread-magazine object distributor."); + gnet_property->props466.ev_changed = event_new("tmalloc_debug_changed"); + gnet_property->props466.save = TRUE; + gnet_property->props466.internal = FALSE; + gnet_property->props466.vector_size = 1; + mutex_init(&gnet_property->props466.lock); + + /* Type specific data: */ + gnet_property->props466.type = PROP_TYPE_GUINT32; + gnet_property->props466.data.guint32.def = (void *) &gnet_property_variable_tmalloc_debug_default; + gnet_property->props466.data.guint32.value = (void *) &gnet_property_variable_tmalloc_debug; + gnet_property->props466.data.guint32.choices = NULL; + gnet_property->props466.data.guint32.max = 20; + gnet_property->props466.data.guint32.min = 0; + + + /* + * PROP_EVQ_DEBUG: + * + * General data: + */ + gnet_property->props467.name = "evq_debug"; + gnet_property->props467.desc = _("Debug level for the event queue thread."); + gnet_property->props467.ev_changed = event_new("evq_debug_changed"); + gnet_property->props467.save = TRUE; + gnet_property->props467.internal = FALSE; + gnet_property->props467.vector_size = 1; + mutex_init(&gnet_property->props467.lock); + + /* Type specific data: */ + gnet_property->props467.type = PROP_TYPE_GUINT32; + gnet_property->props467.data.guint32.def = (void *) &gnet_property_variable_evq_debug_default; + gnet_property->props467.data.guint32.value = (void *) &gnet_property_variable_evq_debug; + gnet_property->props467.data.guint32.choices = NULL; + gnet_property->props467.data.guint32.max = 20; + gnet_property->props467.data.guint32.min = 0; + + + /* + * PROP_MAX_G2HUB_HOSTS_CACHED: + * + * General data: + */ + gnet_property->props468.name = "max_g2hub_hosts_cached"; + gnet_property->props468.desc = _("Maximum number of G2 hubs in the hub cache."); + gnet_property->props468.ev_changed = event_new("max_g2hub_hosts_cached_changed"); + gnet_property->props468.save = TRUE; + gnet_property->props468.internal = FALSE; + gnet_property->props468.vector_size = 1; + mutex_init(&gnet_property->props468.lock); + + /* Type specific data: */ + gnet_property->props468.type = PROP_TYPE_GUINT32; + gnet_property->props468.data.guint32.def = (void *) &gnet_property_variable_max_g2hub_hosts_cached_default; + gnet_property->props468.data.guint32.value = (void *) &gnet_property_variable_max_g2hub_hosts_cached; + gnet_property->props468.data.guint32.choices = NULL; + gnet_property->props468.data.guint32.max = 50000; + gnet_property->props468.data.guint32.min = 100; + + + /* + * PROP_HOSTS_IN_G2HUB_CATCHER: + * + * General data: + */ + gnet_property->props469.name = "hosts_in_g2hub_catcher"; + gnet_property->props469.desc = _("Current number of IPv4 hosts in the G2 hub caches."); + gnet_property->props469.ev_changed = event_new("hosts_in_g2hub_catcher_changed"); + gnet_property->props469.save = FALSE; + gnet_property->props469.internal = TRUE; + gnet_property->props469.vector_size = 1; + mutex_init(&gnet_property->props469.lock); + + /* Type specific data: */ + gnet_property->props469.type = PROP_TYPE_GUINT32; + gnet_property->props469.data.guint32.def = (void *) &gnet_property_variable_hosts_in_g2hub_catcher_default; + gnet_property->props469.data.guint32.value = (void *) &gnet_property_variable_hosts_in_g2hub_catcher; + gnet_property->props469.data.guint32.choices = NULL; + gnet_property->props469.data.guint32.max = INT_MAX; + gnet_property->props469.data.guint32.min = 0; + + + /* + * PROP_ENABLE_G2: + * + * General data: + */ + gnet_property->props470.name = "enable_g2"; + gnet_property->props470.desc = _("Whether the G2 protocol should be enabled."); + gnet_property->props470.ev_changed = event_new("enable_g2_changed"); + gnet_property->props470.save = TRUE; + gnet_property->props470.internal = FALSE; + gnet_property->props470.vector_size = 1; + mutex_init(&gnet_property->props470.lock); + + /* Type specific data: */ + gnet_property->props470.type = PROP_TYPE_BOOLEAN; + gnet_property->props470.data.boolean.def = (void *) &gnet_property_variable_enable_g2_default; + gnet_property->props470.data.boolean.value = (void *) &gnet_property_variable_enable_g2; + + + /* + * PROP_NODE_G2_COUNT: + * + * General data: + */ + gnet_property->props471.name = "node_g2_count"; + gnet_property->props471.desc = _("Number of G2 nodes currently connected."); + gnet_property->props471.ev_changed = event_new("node_g2_count_changed"); + gnet_property->props471.save = FALSE; + gnet_property->props471.internal = TRUE; + gnet_property->props471.vector_size = 1; + mutex_init(&gnet_property->props471.lock); + + /* Type specific data: */ + gnet_property->props471.type = PROP_TYPE_GUINT32; + gnet_property->props471.data.guint32.def = (void *) &gnet_property_variable_node_g2_count_default; + gnet_property->props471.data.guint32.value = (void *) &gnet_property_variable_node_g2_count; + gnet_property->props471.data.guint32.choices = NULL; + gnet_property->props471.data.guint32.max = 0xFFFFFFFF; + gnet_property->props471.data.guint32.min = 0x00000000; + + + /* + * PROP_MAX_G2_HUBS: + * + * General data: + */ + gnet_property->props472.name = "max_g2_hubs"; + gnet_property->props472.desc = _("Maximum amount of G2 hubs we should connect to as a leaf."); + gnet_property->props472.ev_changed = event_new("max_g2_hubs_changed"); + gnet_property->props472.save = TRUE; + gnet_property->props472.internal = FALSE; + gnet_property->props472.vector_size = 1; + mutex_init(&gnet_property->props472.lock); + + /* Type specific data: */ + gnet_property->props472.type = PROP_TYPE_GUINT32; + gnet_property->props472.data.guint32.def = (void *) &gnet_property_variable_max_g2_hubs_default; + gnet_property->props472.data.guint32.value = (void *) &gnet_property_variable_max_g2_hubs; + gnet_property->props472.data.guint32.choices = NULL; + gnet_property->props472.data.guint32.max = 3; + gnet_property->props472.data.guint32.min = 0; + + + /* + * PROP_LOG_BAD_G2: + * + * General data: + */ + gnet_property->props473.name = "log_bad_g2"; + gnet_property->props473.desc = _("Whether to log bad G2 messages, corrupted or unexpected."); + gnet_property->props473.ev_changed = event_new("log_bad_g2_changed"); + gnet_property->props473.save = TRUE; + gnet_property->props473.internal = FALSE; + gnet_property->props473.vector_size = 1; + mutex_init(&gnet_property->props473.lock); + + /* Type specific data: */ + gnet_property->props473.type = PROP_TYPE_BOOLEAN; + gnet_property->props473.data.boolean.def = (void *) &gnet_property_variable_log_bad_g2_default; + gnet_property->props473.data.boolean.value = (void *) &gnet_property_variable_log_bad_g2; + + + /* + * PROP_LOG_DROPPED_G2: + * + * General data: + */ + gnet_property->props474.name = "log_dropped_g2"; + gnet_property->props474.desc = _("Whether to log dropped G2 messages"); + gnet_property->props474.ev_changed = event_new("log_dropped_g2_changed"); + gnet_property->props474.save = TRUE; + gnet_property->props474.internal = FALSE; + gnet_property->props474.vector_size = 1; + mutex_init(&gnet_property->props474.lock); + + /* Type specific data: */ + gnet_property->props474.type = PROP_TYPE_BOOLEAN; + gnet_property->props474.data.boolean.def = (void *) &gnet_property_variable_log_dropped_g2_default; + gnet_property->props474.data.boolean.value = (void *) &gnet_property_variable_log_dropped_g2; + + + /* + * PROP_G2_RPC_DEBUG: + * + * General data: + */ + gnet_property->props475.name = "g2_rpc_debug"; + gnet_property->props475.desc = _("Debug level for the G2 RPC layer."); + gnet_property->props475.ev_changed = event_new("g2_rpc_debug_changed"); + gnet_property->props475.save = TRUE; + gnet_property->props475.internal = FALSE; + gnet_property->props475.vector_size = 1; + mutex_init(&gnet_property->props475.lock); + + /* Type specific data: */ + gnet_property->props475.type = PROP_TYPE_GUINT32; + gnet_property->props475.data.guint32.def = (void *) &gnet_property_variable_g2_rpc_debug_default; + gnet_property->props475.data.guint32.value = (void *) &gnet_property_variable_g2_rpc_debug; + gnet_property->props475.data.guint32.choices = NULL; + gnet_property->props475.data.guint32.max = 20; + gnet_property->props475.data.guint32.min = 0; + + + /* + * PROP_LOG_QUERY_HITS: + * + * General data: + */ + gnet_property->props476.name = "log_query_hits"; + gnet_property->props476.desc = _("Whether to log summary of received query hits"); + gnet_property->props476.ev_changed = event_new("log_query_hits_changed"); + gnet_property->props476.save = TRUE; + gnet_property->props476.internal = FALSE; + gnet_property->props476.vector_size = 1; + mutex_init(&gnet_property->props476.lock); + + /* Type specific data: */ + gnet_property->props476.type = PROP_TYPE_BOOLEAN; + gnet_property->props476.data.boolean.def = (void *) &gnet_property_variable_log_query_hits_default; + gnet_property->props476.data.boolean.value = (void *) &gnet_property_variable_log_query_hits; + + + /* + * PROP_LOG_QUERY_HIT_RECORDS: + * + * General data: + */ + gnet_property->props477.name = "log_query_hit_records"; + gnet_property->props477.desc = _("Whether to log summary of each record in received query hits"); + gnet_property->props477.ev_changed = event_new("log_query_hit_records_changed"); + gnet_property->props477.save = TRUE; + gnet_property->props477.internal = FALSE; + gnet_property->props477.vector_size = 1; + mutex_init(&gnet_property->props477.lock); + + /* Type specific data: */ + gnet_property->props477.type = PROP_TYPE_BOOLEAN; + gnet_property->props477.data.boolean.def = (void *) &gnet_property_variable_log_query_hit_records_default; + gnet_property->props477.data.boolean.value = (void *) &gnet_property_variable_log_query_hit_records; + + + /* + * PROP_G2_BROWSE_COUNT: + * + * General data: + */ + gnet_property->props478.name = "g2_browse_count"; + gnet_property->props478.desc = _("Number of G2 browsing requests received in this session."); + gnet_property->props478.ev_changed = event_new("g2_browse_count_changed"); + gnet_property->props478.save = FALSE; + gnet_property->props478.internal = TRUE; + gnet_property->props478.vector_size = 1; + mutex_init(&gnet_property->props478.lock); + + /* Type specific data: */ + gnet_property->props478.type = PROP_TYPE_GUINT32; + gnet_property->props478.data.guint32.def = (void *) &gnet_property_variable_g2_browse_count_default; + gnet_property->props478.data.guint32.value = (void *) &gnet_property_variable_g2_browse_count; + gnet_property->props478.data.guint32.choices = NULL; + gnet_property->props478.data.guint32.max = 0xFFFFFFFF; + gnet_property->props478.data.guint32.min = 0x00000000; + + + /* + * PROP_G2_BROWSE_SERVED: + * + * General data: + */ + gnet_property->props479.name = "g2_browse_served"; + gnet_property->props479.desc = _("Number of G2 browsing requests fully served in this session."); + gnet_property->props479.ev_changed = event_new("g2_browse_served_changed"); + gnet_property->props479.save = FALSE; + gnet_property->props479.internal = TRUE; + gnet_property->props479.vector_size = 1; + mutex_init(&gnet_property->props479.lock); + + /* Type specific data: */ + gnet_property->props479.type = PROP_TYPE_GUINT32; + gnet_property->props479.data.guint32.def = (void *) &gnet_property_variable_g2_browse_served_default; + gnet_property->props479.data.guint32.value = (void *) &gnet_property_variable_g2_browse_served; + gnet_property->props479.data.guint32.choices = NULL; + gnet_property->props479.data.guint32.max = 0xFFFFFFFF; + gnet_property->props479.data.guint32.min = 0x00000000; + + + /* + * PROP_LOG_SENDING_G2: + * + * General data: + */ + gnet_property->props480.name = "log_sending_g2"; + gnet_property->props480.desc = _("Whether to log G2 messages we're attempting to send"); + gnet_property->props480.ev_changed = event_new("log_sending_g2_changed"); + gnet_property->props480.save = TRUE; + gnet_property->props480.internal = FALSE; + gnet_property->props480.vector_size = 1; + mutex_init(&gnet_property->props480.lock); + + /* Type specific data: */ + gnet_property->props480.type = PROP_TYPE_BOOLEAN; + gnet_property->props480.data.boolean.def = (void *) &gnet_property_variable_log_sending_g2_default; + gnet_property->props480.data.boolean.value = (void *) &gnet_property_variable_log_sending_g2; + + + /* + * PROP_SESSION_START_STAMP: + * + * General data: + */ + gnet_property->props481.name = "session_start_stamp"; + gnet_property->props481.desc = _("Timestamp at which the current session was started. This stamp remains unchanged when gtk-gnutella restarts after a crash or an explicit restart request."); + gnet_property->props481.ev_changed = event_new("session_start_stamp_changed"); + gnet_property->props481.save = TRUE; + gnet_property->props481.internal = TRUE; + gnet_property->props481.vector_size = 1; + mutex_init(&gnet_property->props481.lock); + + /* Type specific data: */ + gnet_property->props481.type = PROP_TYPE_TIMESTAMP; + gnet_property->props481.data.timestamp.def = (void *) &gnet_property_variable_session_start_stamp_default; + gnet_property->props481.data.timestamp.value = (void *) &gnet_property_variable_session_start_stamp; + gnet_property->props481.data.timestamp.choices = NULL; + gnet_property->props481.data.timestamp.max = (time_t) ((1U << 31) - 1); + gnet_property->props481.data.timestamp.min = 0x0000000000000000; + + + /* + * PROP_TCP_NO_LISTENING: + * + * General data: + */ + gnet_property->props482.name = "tcp_no_listening"; + gnet_property->props482.desc = _("No TCP listening socket bound to allow incoming connections."); + gnet_property->props482.ev_changed = event_new("tcp_no_listening_changed"); + gnet_property->props482.save = FALSE; + gnet_property->props482.internal = TRUE; + gnet_property->props482.vector_size = 1; + mutex_init(&gnet_property->props482.lock); + + /* Type specific data: */ + gnet_property->props482.type = PROP_TYPE_BOOLEAN; + gnet_property->props482.data.boolean.def = (void *) &gnet_property_variable_tcp_no_listening_default; + gnet_property->props482.data.boolean.value = (void *) &gnet_property_variable_tcp_no_listening; + + gnet_property->by_name = htable_create(HASH_KEY_STRING, 0); for (n = 0; n < GNET_PROPERTY_NUM; n ++) { - g_hash_table_insert(gnet_property->byName, - gnet_property->propsn.name, GINT_TO_POINTER(n+(NO_PROP+1))); + htable_insert(gnet_property->by_name, + gnet_property->propsn.name, int_to_pointer(n+(NO_PROP+1))); } return gnet_property; @@ -9430,14 +11304,11 @@ /** * Free memory allocated by the property set. */ -G_GNUC_COLD void +void G_COLD gnet_prop_shutdown(void) { guint32 n; - if (gnet_property->byName) { - g_hash_table_destroy(gnet_property->byName); - gnet_property->byName = NULL; - } + htable_free_null(&gnet_property->by_name); for (n = 0; n < GNET_PROPERTY_NUM; n ++) { if (gnet_property->propsn.type == PROP_TYPE_STRING) { @@ -9466,6 +11337,24 @@ } /** + * Lock property. + */ +void +gnet_prop_lock(property_t p) +{ + prop_lock(gnet_property, p); +} + +/** + * Unlock property. + */ +void +gnet_prop_unlock(property_t p) +{ + prop_unlock(gnet_property, p); +} + +/** * Add a change listener to a given property. If init is TRUE then * the listener is immediately called. */ @@ -9609,6 +11498,12 @@ return prop_name(gnet_property, p); } +prop_type_t +gnet_prop_type(property_t p) +{ + return prop_type(gnet_property, p); +} + const char * gnet_prop_type_to_string(property_t p) { @@ -9627,14 +11522,19 @@ return prop_is_saved(gnet_property, p); } +gboolean +gnet_prop_is_internal(property_t p) +{ + return prop_is_internal(gnet_property, p); +} + property_t gnet_prop_get_by_name(const char *name) { - return GPOINTER_TO_UINT( - g_hash_table_lookup(gnet_property->byName, name)); + return pointer_to_uint(htable_lookup(gnet_property->by_name, name)); } -GSList * +pslist_t * gnet_prop_get_by_regex(const char *pattern, int *error) { return prop_get_by_regex(gnet_property, pattern, error); @@ -9643,7 +11543,7 @@ void gnet_prop_set_from_string(property_t prop, const char *val) { - prop_set_from_string(gnet_property, prop, val, FALSE); + prop_set_from_string(gnet_property, prop, val, FALSE); } /**
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/gnet_property.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/gnet_property.h
Changed
@@ -28,8 +28,8 @@ #ifndef _gnet_property_h_ #define _gnet_property_h_ - #include "lib/prop.h" +#include "lib/log.h" /* For s_carp() */ #define GNET_PROPERTY_MIN ((NO_PROP+1)) #define GNET_PROPERTY_MAX ((NO_PROP+1)+GNET_PROPERTY_END-1) @@ -106,7 +106,6 @@ PROP_FILEINFO_DEBUG, PROP_UPLOAD_DEBUG, PROP_LIB_DEBUG, - PROP_BITZI_DEBUG, PROP_URL_DEBUG, PROP_DH_DEBUG, PROP_DQ_DEBUG, @@ -125,7 +124,7 @@ PROP_PARQ_SIZE_ALWAYS_CONTINUE, PROP_PARQ_TIME_ALWAYS_CONTINUE, PROP_PARQ_BAN_BAD_MAXCOUNTWAIT, - PROP_TRACK_PROPS, + PROP_NET_BUFFER_SHORTAGE, PROP_STOP_HOST_GET, PROP_BW_HTTP_IN_ENABLED, PROP_BW_HTTP_OUT_ENABLED, @@ -476,6 +475,50 @@ PROP_GUID_DEBUG, PROP_TX_DEFLATE_DEBUG, PROP_TX_DEBUG_ADDRS, + PROP_DUMP_RX_ADDRS, + PROP_DUMP_TX_FROM_ADDRS, + PROP_DUMP_TX_TO_ADDRS, + PROP_GUESS_MAXIMIZE_BW, + PROP_UDP_SCHED_DEBUG, + PROP_TX_UT_DEBUG_FLAGS, + PROP_RX_DEBUG_ADDRS, + PROP_RX_UT_DEBUG_FLAGS, + PROP_LOG_SR_UDP_TX, + PROP_LOG_SR_UDP_RX, + PROP_SECURE_OOB_DEBUG, + PROP_LOG_VMSG_TX, + PROP_LOG_VMSG_RX, + PROP_DHT_TCACHE_DEBUG_FLAGS, + PROP_LOG_WEIRD_DHT_HEADERS, + PROP_DHT_RPC_DEBUG, + PROP_LOG_UHC_PINGS_RX, + PROP_LOG_UHC_PINGS_TX, + PROP_CLEAN_SHUTDOWN, + PROP_CLEAN_RESTART, + PROP_DHT_KEYS_DEBUG, + PROP_DHT_VALUES_DEBUG, + PROP_PID, + PROP_HTTP_RANGE_DEBUG, + PROP_UPNP_MAPPING_LEASE_TIME, + PROP_USER_AUTO_RESTART, + PROP_TM_DEBUG, + PROP_TMALLOC_DEBUG, + PROP_EVQ_DEBUG, + PROP_MAX_G2HUB_HOSTS_CACHED, + PROP_HOSTS_IN_G2HUB_CATCHER, + PROP_ENABLE_G2, + PROP_NODE_G2_COUNT, + PROP_MAX_G2_HUBS, + PROP_LOG_BAD_G2, + PROP_LOG_DROPPED_G2, + PROP_G2_RPC_DEBUG, + PROP_LOG_QUERY_HITS, + PROP_LOG_QUERY_HIT_RECORDS, + PROP_G2_BROWSE_COUNT, + PROP_G2_BROWSE_SERVED, + PROP_LOG_SENDING_G2, + PROP_SESSION_START_STAMP, + PROP_TCP_NO_LISTENING, GNET_PROPERTY_END } gnet_property_t; @@ -489,15 +532,20 @@ */ prop_def_t *gnet_prop_get_def(property_t); property_t gnet_prop_get_by_name(const char *); -GSList *gnet_prop_get_by_regex(const char *, int *); +pslist_t *gnet_prop_get_by_regex(const char *, int *); const char *gnet_prop_name(property_t); const char *gnet_prop_type_to_string(property_t); const char *gnet_prop_to_string(property_t prop); const char *gnet_prop_default_to_string(property_t); const char *gnet_prop_description(property_t); gboolean gnet_prop_is_saved(property_t); +gboolean gnet_prop_is_internal(property_t); +prop_type_t gnet_prop_type(property_t); void gnet_prop_set_from_string(property_t, const char *); +void gnet_prop_lock(property_t); +void gnet_prop_unlock(property_t); + /* * Property-change listeners */ @@ -553,18 +601,32 @@ gnet_prop_incr_guint32(property_t p) { guint32 value; + gnet_prop_lock(p); gnet_prop_get_guint32_val(p, &value); - value++; - gnet_prop_set_guint32_val(p, value); + if G_UNLIKELY((guint32) -1 == value) { + s_carp("%s(): incrementing property \"%s\" would overflow", + G_STRFUNC, gnet_prop_name(p)); + } else { + value++; + gnet_prop_set_guint32_val(p, value); + } + gnet_prop_unlock(p); } static inline void gnet_prop_decr_guint32(property_t p) { guint32 value; + gnet_prop_lock(p); gnet_prop_get_guint32_val(p, &value); - value--; - gnet_prop_set_guint32_val(p, value); + if G_UNLIKELY(0 == value) { + s_carp("%s(): decrementing property \"%s\" would underflow", + G_STRFUNC, gnet_prop_name(p)); + } else { + value--; + gnet_prop_set_guint32_val(p, value); + } + gnet_prop_unlock(p); } void gnet_prop_set_guint64(
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/gnet_property_priv.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/gnet_property_priv.h
Changed
@@ -47,6 +47,7 @@ #include "if/core/sockets.h" #include "dht/kuid.h" #include "if/dht/routing.h" +#include "upnp/upnp.h" extern const gboolean gnet_property_variable_reading_hostfile; @@ -119,7 +120,6 @@ extern const guint32 gnet_property_variable_fileinfo_debug; extern const guint32 gnet_property_variable_upload_debug; extern const guint32 gnet_property_variable_lib_debug; -extern const guint32 gnet_property_variable_bitzi_debug; extern const guint32 gnet_property_variable_url_debug; extern const guint32 gnet_property_variable_dh_debug; extern const guint32 gnet_property_variable_dq_debug; @@ -138,7 +138,7 @@ extern const guint32 gnet_property_variable_parq_size_always_continue; extern const guint32 gnet_property_variable_parq_time_always_continue; extern const guint32 gnet_property_variable_parq_ban_bad_maxcountwait; -extern const guint32 gnet_property_variable_track_props; +extern const gboolean gnet_property_variable_net_buffer_shortage; extern const gboolean gnet_property_variable_stop_host_get; extern const gboolean gnet_property_variable_bws_in_enabled; extern const gboolean gnet_property_variable_bws_out_enabled; @@ -489,6 +489,50 @@ extern const guint32 gnet_property_variable_guid_debug; extern const guint32 gnet_property_variable_tx_deflate_debug; extern const char *gnet_property_variable_tx_debug_addrs; +extern const char *gnet_property_variable_dump_rx_addrs; +extern const char *gnet_property_variable_dump_tx_from_addrs; +extern const char *gnet_property_variable_dump_tx_to_addrs; +extern const gboolean gnet_property_variable_guess_maximize_bw; +extern const guint32 gnet_property_variable_udp_sched_debug; +extern const guint32 gnet_property_variable_tx_ut_debug_flags; +extern const char *gnet_property_variable_rx_debug_addrs; +extern const guint32 gnet_property_variable_rx_ut_debug_flags; +extern const gboolean gnet_property_variable_log_sr_udp_tx; +extern const gboolean gnet_property_variable_log_sr_udp_rx; +extern const guint32 gnet_property_variable_secure_oob_debug; +extern const gboolean gnet_property_variable_log_vmsg_tx; +extern const gboolean gnet_property_variable_log_vmsg_rx; +extern const guint32 gnet_property_variable_dht_tcache_debug_flags; +extern const gboolean gnet_property_variable_log_weird_dht_headers; +extern const guint32 gnet_property_variable_dht_rpc_debug; +extern const gboolean gnet_property_variable_log_uhc_pings_rx; +extern const gboolean gnet_property_variable_log_uhc_pings_tx; +extern const gboolean gnet_property_variable_clean_shutdown; +extern const gboolean gnet_property_variable_clean_restart; +extern const guint32 gnet_property_variable_dht_keys_debug; +extern const guint32 gnet_property_variable_dht_values_debug; +extern const guint32 gnet_property_variable_pid; +extern const guint32 gnet_property_variable_http_range_debug; +extern const guint32 gnet_property_variable_upnp_mapping_lease_time; +extern const gboolean gnet_property_variable_user_auto_restart; +extern const guint32 gnet_property_variable_tm_debug; +extern const guint32 gnet_property_variable_tmalloc_debug; +extern const guint32 gnet_property_variable_evq_debug; +extern const guint32 gnet_property_variable_max_g2hub_hosts_cached; +extern const guint32 gnet_property_variable_hosts_in_g2hub_catcher; +extern const gboolean gnet_property_variable_enable_g2; +extern const guint32 gnet_property_variable_node_g2_count; +extern const guint32 gnet_property_variable_max_g2_hubs; +extern const gboolean gnet_property_variable_log_bad_g2; +extern const gboolean gnet_property_variable_log_dropped_g2; +extern const guint32 gnet_property_variable_g2_rpc_debug; +extern const gboolean gnet_property_variable_log_query_hits; +extern const gboolean gnet_property_variable_log_query_hit_records; +extern const guint32 gnet_property_variable_g2_browse_count; +extern const guint32 gnet_property_variable_g2_browse_served; +extern const gboolean gnet_property_variable_log_sending_g2; +extern const time_t gnet_property_variable_session_start_stamp; +extern const gboolean gnet_property_variable_tcp_no_listening; prop_set_t *gnet_prop_init(void);
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/gnet_props.ag -> gtk-gnutella-1.1.9.tar.bz2/src/if/gnet_props.ag
Changed
@@ -16,12 +16,14 @@ uses = "if/core/sockets.h"; uses = "dht/kuid.h"; uses = "if/dht/routing.h"; +uses = "upnp/upnp.h"; prop = { name = "reading_hostfile"; desc = "Indicates whether the hostcache file is being read."; type = boolean; save = FALSE; + internal = TRUE; data = { default = FALSE; }; @@ -32,6 +34,7 @@ desc = "Indicates whether the ultracache file is being read."; type = boolean; save = FALSE; + internal = TRUE; data = { default = FALSE; }; @@ -47,6 +50,7 @@ "newest features."; type = boolean; save = FALSE; + internal = TRUE; data = { default = FALSE; }; @@ -58,6 +62,7 @@ "information about it here."; type = string; save = FALSE; + internal = TRUE; data = { default = NULL; }; @@ -111,6 +116,7 @@ name = "node_leaf_count"; desc = "Number of leaf nodes currently connected."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -121,6 +127,7 @@ name = "node_normal_count"; desc = "Number of normal nodes currently connected."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -131,6 +138,7 @@ name = "node_ultra_count"; desc = "Number of ultra nodes currently connected."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -138,7 +146,7 @@ }; prop = { - name ="max_downloads"; + name = "max_downloads"; cfgvar = "max_simultaneous_downloads"; desc = "Don't start more than this number of parallel downloads. " "Others will remain in the queue waiting for a download slot."; @@ -207,6 +215,7 @@ name = "current_ip_stamp"; desc = "When the current IPv4 address was determined."; type = timestamp; + internal = TRUE; data = { default = 0; }; @@ -216,6 +225,7 @@ name = "current_ip6_stamp"; desc = "When the current IPv6 address was determined."; type = timestamp; + internal = TRUE; data = { default = 0; }; @@ -225,6 +235,7 @@ name = "average_ip_uptime"; desc = "Average uptime with the same IPv4 address."; type = guint32; + internal = TRUE; data = { default = 0; }; @@ -234,6 +245,7 @@ name = "average_ip6_uptime"; desc = "Average uptime with the same IPv6 address."; type = guint32; + internal = TRUE; data = { default = 0; }; @@ -244,6 +256,7 @@ name = "start_stamp"; desc = "Timestamp at which servent was started."; save = FALSE; + internal = TRUE; type = timestamp; data = { default = 0; @@ -254,6 +267,7 @@ name = "average_servent_uptime"; desc = "Average servent uptime."; type = guint32; + internal = TRUE; data = { default = 0; }; @@ -547,6 +561,7 @@ desc = "Amount of file descriptors currently used for banning, " "i.e. which are currently kept open for delayed close."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -558,6 +573,7 @@ desc = "Number of file descriptors we'll actually be using for banning."; type = guint32; save = FALSE; + internal = TRUE; data = { default = 100; }; @@ -581,8 +597,8 @@ "out if no connection can be established."; type = guint32; data = { - default = 30; - min = 15; + default = 90; + min = 30; max = 100000; }; }; @@ -811,17 +827,6 @@ }; prop = { - name = "bitzi_debug"; - desc = "Verbosity of Bitzi related debug messages."; - type = guint32; - data = { - default = 0; - min = 0; - max = 20; - }; -}; - -prop = { name = "url_debug"; desc = "Verbosity of URL handling related debug messages."; type = guint32; @@ -1029,13 +1034,13 @@ }; prop = { - name = "track_props"; - desc = "For development use: track properties."; - type = guint32; + name = "net_buffer_shortage"; + desc = "Indicates a kernel network buffer shortage."; + save = FALSE; + internal = TRUE; + type = boolean; data = { - default = 0; - min = 0; - max = 20; + default = FALSE; }; }; @@ -1390,6 +1395,7 @@ name = "hosts_in_catcher"; desc = "Current number of hosts in regular node caches."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -1402,6 +1408,7 @@ name = "hosts_in_ultra_catcher"; desc = "Current number of IPv4 hosts in ultra node caches."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -1414,6 +1421,7 @@ name = "hosts_in_bad_catcher"; desc = "Current number of hosts in bad node caches."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -1707,16 +1715,16 @@ "jpeg;jpg;" "m4a;mjpg;mka;mkv;mod;mov;mp1;mp2;mp3;mp4;mpa;mpeg;mpega;mpg;mpv;" "nes;" - "oga;ogg;ogm;ogv;" + "oga;ogg;ogm;ogv;opus;" "qt;" "pdf;png;ps;" "ram;rar;rm;rom;rpm;" "s3m;shn;sid;smc;smd;spx;srt;stm;" "tar;tbz2;tgz;bittorrent;torrent;txt;" "vob;voc;vqf;" - "wav;" + "wav;webm;" "xm;xvid;" - "zip"; + "zip;zoo"; }; }; @@ -1803,6 +1811,7 @@ name = "total_downloads"; desc = "Total number of completed downloads in this session."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -1815,6 +1824,7 @@ name = "ul_running"; desc = "Number of running uploads."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -1827,6 +1837,7 @@ name = "ul_quick_running"; desc = "Number of quick uploads currently running."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -1839,6 +1850,7 @@ name = "ul_registered"; desc = "Number of registered (pending) uploads."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -1851,6 +1863,7 @@ name = "total_uploads"; desc = "Total number of completed uploads in this session."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -2021,6 +2034,7 @@ desc = "Whether gtk-gnutella is currently rebuilding its library " "in the background."; save = FALSE; + internal = TRUE; type = boolean; data = { default = FALSE; @@ -2032,6 +2046,7 @@ desc = "Whether gtk-gnutella is currently computing SHA1 of shared " "files in the background."; save = FALSE; + internal = TRUE; type = boolean; data = { default = FALSE; @@ -2043,6 +2058,7 @@ desc = "Whether gtk-gnutella is currently verifying SHA1 of downloaded " "files in the background."; save = FALSE; + internal = TRUE; type = boolean; data = { default = FALSE; @@ -2054,6 +2070,7 @@ desc = "Whether gtk-gnutella is currently moving files across " "filesystems or simply copying in the background."; save = FALSE; + internal = TRUE; type = boolean; data = { default = FALSE; @@ -2122,8 +2139,8 @@ "slots."; type = guint32; data = { - default = 10; - min = 4; + default = 40; + min = 10; max = 80; }; }; @@ -2131,12 +2148,12 @@ prop = { name = "max_leaves"; desc = "Maximum amount of leaves we can accept. To be promoted Ultra, " - "you should reserve 32 bytes of bandwidth per leaf."; + "you should reserve 32 bytes/sec of bandwidth per leaf."; type = guint32; data = { - default = 150; + default = 300; min = 25; - max = 1000; + max = 5000; }; }; @@ -2189,6 +2206,7 @@ name = "current_peermode"; desc = "Current peer mode for gtk-gnutella."; save = FALSE; + internal = TRUE; type = multichoice; data = { default = 0; @@ -2207,6 +2225,7 @@ name = "sys_nofile"; desc = "How many file descriptors this process can open."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 1024; @@ -2217,6 +2236,7 @@ name = "sys_physmem"; desc = "How much physical memory is available."; save = FALSE; + internal = TRUE; type = guint64; data = { default = 65536; @@ -2227,6 +2247,7 @@ name = "dl_queue_count"; desc = "How many downloads are currently held in the queue."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -2238,6 +2259,7 @@ desc = "How many downloads are currently running " "(downloading / connecting)."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -2248,6 +2270,7 @@ name = "dl_active_count"; desc = "How many downloads are currently active."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -2258,6 +2281,7 @@ name = "dl_aqueued_count"; desc = "How many downloads are currently actively queued."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -2268,6 +2292,7 @@ name = "dl_pqueued_count"; desc = "How many downloads are currently passively queued."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -2278,6 +2303,7 @@ name = "fi_all_count"; desc = "How many fileinfo do we have."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -2288,6 +2314,7 @@ name = "fi_with_source_count"; desc = "How many fileinfo with sources do we have."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -2299,6 +2326,7 @@ desc = "How many queued downloads are currently responsive " "(remote servent answering requests)."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -2309,6 +2337,7 @@ name = "dl_byte_count"; desc = "Amount of bytes downloaded so far, HTTP headers notwithstanding."; save = FALSE; + internal = TRUE; type = guint64; data = { default = 0; @@ -2319,6 +2348,7 @@ name = "ul_byte_count"; desc = "Amount of bytes uploaded so far, HTTP headers notwithstanding."; save = FALSE; + internal = TRUE; type = guint64; data = { default = 0; @@ -2368,6 +2398,7 @@ name = "crawler_visit_count"; desc = "Number of crawler visits during this session."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -2378,6 +2409,7 @@ name = "udp_crawler_visit_count"; desc = "Number of UDP crawler visits during this session."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -2411,6 +2443,7 @@ name = "clock_skew"; desc = "The signed clock skew of this host compared to absolute time. " "Adding this skew to the host clock should give the true time."; + internal = TRUE; type = guint32; data = { default = 0; @@ -2562,6 +2595,7 @@ "and the reception of the reply from the remote server, in msecs."; type = guint32; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2582,6 +2616,7 @@ "leaf mode occurred."; type = timestamp; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2593,6 +2628,7 @@ "become an Ultra node."; type = boolean; save = FALSE; + internal = TRUE; data = { default = FALSE; }; @@ -2604,6 +2640,7 @@ "requirement to become an Ultra node."; type = boolean; save = FALSE; + internal = TRUE; data = { default = FALSE; }; @@ -2615,6 +2652,7 @@ "become an Ultra node."; type = boolean; save = FALSE; + internal = TRUE; data = { default = FALSE; }; @@ -2626,6 +2664,7 @@ "become an Ultra node."; type = boolean; save = FALSE; + internal = TRUE; data = { default = FALSE; }; @@ -2637,6 +2676,7 @@ "requirement to become an Ultra node."; type = boolean; save = FALSE; + internal = TRUE; data = { default = FALSE; }; @@ -2648,6 +2688,7 @@ "requirement to become an Ultra node."; type = boolean; save = FALSE; + internal = TRUE; data = { default = FALSE; }; @@ -2658,6 +2699,7 @@ desc = "Whether we meet the memory requirements to become an Ultra node."; type = boolean; save = FALSE; + internal = TRUE; data = { default = FALSE; }; @@ -2669,6 +2711,7 @@ "become an Ultra node."; type = boolean; save = FALSE; + internal = TRUE; data = { default = FALSE; }; @@ -2679,6 +2722,7 @@ desc = "Whether we meet the UDP requirements to become an Ultra node."; type = boolean; save = FALSE; + internal = TRUE; data = { default = FALSE; }; @@ -2797,6 +2841,7 @@ desc = "Time at which we started the last scan of the library."; type = timestamp; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2807,6 +2852,7 @@ desc = "Time at which the last scan of the library finished."; type = timestamp; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2817,6 +2863,7 @@ desc = "The number of seconds the last scan of the library took."; type = guint32; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2827,6 +2874,7 @@ desc = "Time at which we started shared file indexing."; type = timestamp; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2837,6 +2885,7 @@ desc = "Time spent indexing shared files."; type = guint32; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2847,6 +2896,7 @@ desc = "Memory used by the QRP tables"; type = guint32; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2857,6 +2907,7 @@ desc = "Time at which we started query routing table generation."; type = timestamp; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2867,6 +2918,7 @@ desc = "Time spent computing the QRP table, in seconds."; type = guint32; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2877,6 +2929,7 @@ desc = "Time at which we started computing our QRP patch."; type = timestamp; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2887,6 +2940,7 @@ desc = "Time spent computing the QRP table patch, in seconds."; type = guint32; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2897,6 +2951,7 @@ desc = "Query routing table generation number."; type = guint32; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2907,6 +2962,7 @@ desc = "Amount of slots used by our QRP table."; type = guint32; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2917,6 +2973,7 @@ desc = "Amount of slots filled within our QRP table."; type = guint32; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2927,6 +2984,7 @@ desc = "Percentage of slots filled within our QRP table."; type = guint32; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2938,6 +2996,7 @@ "our QRP table."; type = guint32; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2948,6 +3007,7 @@ desc = "Amount of hashed keywords in our QRP table."; type = guint32; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2958,6 +3018,7 @@ desc = "Total raw size of the QRP table patch, in bytes."; type = guint32; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2968,6 +3029,7 @@ desc = "Final QRP table patch length, after possible compression."; type = guint32; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -2978,6 +3040,7 @@ desc = "QRP table patch compression ratio, in percent, 0 means none."; type = guint32; save = FALSE; + internal = TRUE; data = { default = 0; }; @@ -3001,6 +3064,7 @@ "any more shortage."; type = boolean; save = FALSE; + internal = TRUE; data = { default = FALSE; }; @@ -3014,6 +3078,7 @@ "the last occurrence."; type = boolean; save = FALSE; + internal = TRUE; data = { default = FALSE; }; @@ -3142,6 +3207,7 @@ "bandwidth is saturated. Avoid running as an ultra-node under " "those conditions."; save = FALSE; + internal = TRUE; type = boolean; data = { default = FALSE; @@ -3151,9 +3217,9 @@ prop = { name = "use_global_hostiles_txt"; desc = "If set to TRUE, the global hostiles.txt is used as well as the " - "private $GTK_GNUTELLA_DIR/hostiles.txt. This allows to separate " - "your private ban list from the global one distributed with " - "gtk-gnutella."; + "private $GTK_GNUTELLA_DIR/hostiles.txt. This allows you to " + "separate your private ban list from the global one distributed " + "with gtk-gnutella."; type = boolean; data = { default = TRUE; @@ -3196,6 +3262,7 @@ name = "html_browse_count"; desc = "Number of HTML browsing requests received in this session."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -3206,6 +3273,7 @@ name = "html_browse_served"; desc = "Number of HTML browsing requests fully served in this session."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -3216,6 +3284,7 @@ name = "qhits_browse_count"; desc = "Number of Gnutella browsing requests received in this session."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -3226,6 +3295,7 @@ name = "qhits_browse_served"; desc = "Number of Gnutella browsing requests fully served in this session."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -3258,9 +3328,9 @@ "receives some data. Increase to maximum value if you have RAM."; type = guint32; data = { - default = 32768; + default = 131072; min = 0; - max = 131072; + max = 1048576; }; }; @@ -3405,6 +3475,7 @@ name = "thex_files_requested"; desc = "Number of THEX file requests received in this session."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -3415,6 +3486,7 @@ name = "thex_files_served"; desc = "Number of THEX file requests fully served in this session."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -4023,7 +4095,7 @@ desc = "If TRUE, the spam SHA1 database is kept in memory. If FALSE, it " "is kept in a fast disk database, which saves a large amount of " "core memory and reduces the overall footprint, at the cost of an " - "increased I/O level. However, the DB cache has typically a 90% hit " + "increased I/O level. However, the DB cache has a 90 percent hit " "rate, so the actual overhead is barely noticeable when running as an " "ultra node and should remain completely unnoticed when running as a " "leaf."; @@ -4306,6 +4378,7 @@ name = "cpu_freq_min"; desc = "Minimum CPU frequency, in Hz."; save = FALSE; + internal = TRUE; type = guint64; data = { default = 0; @@ -4316,6 +4389,7 @@ name = "cpu_freq_max"; desc = "Maximum CPU frequency, in Hz."; save = FALSE; + internal = TRUE; type = guint64; data = { default = 0; @@ -4326,6 +4400,7 @@ name = "dht_boot_status"; desc = "DHT bootstrap status."; save = FALSE; + internal = TRUE; type = multichoice; data = { default = 0; @@ -4383,6 +4458,7 @@ name = "dht_current_mode"; desc = "Current DHT running mode."; save = FALSE; + internal = TRUE; type = multichoice; data = { default = 1; @@ -4543,6 +4619,7 @@ desc = "Whether gtk-gnutella was able to locate an Internet Gateway " "Device to install port mappings, if required."; save = FALSE; + internal = TRUE; type = boolean; data = { default = FALSE; @@ -4553,6 +4630,7 @@ name = "port_mapping_required"; desc = "Whether gtk-gnutella thinks it needs to install port mappings " "on your network router to avoid the firewalled condition."; + internal = TRUE; type = boolean; data = { default = TRUE; @@ -4563,6 +4641,7 @@ name = "port_mapping_possible"; desc = "Whether gtk-gnutella can install port mappings, if needed."; save = FALSE; + internal = TRUE; type = boolean; data = { default = FALSE; @@ -4601,6 +4680,7 @@ desc = "Whether gtk-gnutella was able to locate a NAT-PMP gateway " "to install port mappings, if required."; save = FALSE; + internal = TRUE; type = boolean; data = { default = FALSE; @@ -4655,6 +4735,7 @@ name = "port_mapping_successful"; desc = "Whether gtk-gnutella was able to configure port mappings."; save = FALSE; + internal = TRUE; type = boolean; data = { default = FALSE; @@ -4665,6 +4746,7 @@ name = "uploads_bw_no_stealing"; desc = "Whether gtk-gnutella disabled HTTP bandwidth stealing."; save = FALSE; + internal = TRUE; type = boolean; data = { default = FALSE; @@ -4675,6 +4757,7 @@ name = "uploads_bw_ignore_stolen"; desc = "Whether gtk-gnutella ignores HTTP stolen bandwidth."; save = FALSE; + internal = TRUE; type = boolean; data = { default = FALSE; @@ -4685,6 +4768,7 @@ name = "uploads_bw_uniform"; desc = "Whether gtk-gnutella enforces uniform HTTP outgoing bandwidth."; save = FALSE; + internal = TRUE; type = boolean; data = { default = FALSE; @@ -4763,6 +4847,7 @@ name = "hosts_in_guess_catcher"; desc = "Current number of IPv4 hosts in the regular GUESS cache."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -4786,6 +4871,7 @@ name = "hosts_in_guess_intro_catcher"; desc = "Current number of IPv4 hosts in the introduction GUESS cache."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -4813,6 +4899,7 @@ "the last check."; type = storage; save = FALSE; + internal = TRUE; vector_size = GUID_RAW_SIZE; }; @@ -5015,6 +5102,7 @@ name = "hosts_in_ultra6_catcher"; desc = "Current number of IPv6 hosts in ultra node caches."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -5027,6 +5115,7 @@ name = "hosts_in_guess6_catcher"; desc = "Current number of IPv6 hosts in the regular GUESS cache."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -5039,6 +5128,7 @@ name = "hosts_in_guess6_intro_catcher"; desc = "Current number of IPv6 hosts in the introduction GUESS cache."; save = FALSE; + internal = TRUE; type = guint32; data = { default = 0; @@ -5115,11 +5205,462 @@ prop = { name = "tx_debug_addrs"; - desc = "Comma-separated list of TX debugging host (IP addresses only)"; + desc = "Comma-separated list of TX debugging hosts (IP addresses only)"; type = string; data = { default = ""; }; }; +prop = { + name = "dump_rx_addrs"; + desc = "Comma-separated list of hosts for whom we want to dump RX traffic " + "(IP addresses only)"; + type = string; + data = { + default = ""; + }; +}; + +prop = { + name = "dump_tx_from_addrs"; + desc = "Comma-separated list of hosts for whom we want to dump TX traffic " + " they emit (IP addresses only)"; + type = string; + data = { + default = ""; + }; +}; + +prop = { + name = "dump_tx_to_addrs"; + desc = "Comma-separated list of hosts for whom we want to dump TX traffic " + "they receive (IP addresses only)"; + type = string; + data = { + default = ""; + }; +}; + +prop = { + name = "guess_maximize_bw"; + desc = "Allow GUESS to use some of the unused Gnutella outgoing bandwidth " + "regardless of the GUESS bandwidth hint. If FALSE, only the " + "configured bandwidth hint will be used. When running as a leaf " + "this should be set to TRUE to make GUESS queries run faster."; + type = boolean; + data = { + default = TRUE; + }; +}; + +prop = { + name = "udp_sched_debug"; + desc = "Debug level for the UDP TX scheduler."; + type = guint32; + data = { + default = 0; + min = 0; + max = 20; + }; +}; + +prop = { + name = "tx_ut_debug_flags"; + desc = "Debugging flags for the semi-reliable UDP TX layer: " + "1: messages, " + "2: fragments, " + "4: acknowledgments, " + "8: transmissions, " + "16: timeouts."; + type = guint32; + data = { + default = 0; + }; +}; + +prop = { + name = "rx_debug_addrs"; + desc = "Comma-separated list of RX debugging hosts (IP addresses only)"; + type = string; + data = { + default = ""; + }; +}; + +prop = { + name = "rx_ut_debug_flags"; + desc = "Debugging flags for the semi-reliable UDP RX layer: " + "1: messages, " + "2: fragments, " + "4: acknowledgments, " + "8: receptions, " + "16: timeouts."; + type = guint32; + data = { + default = 0; + }; +}; + +prop = { + name = "log_sr_udp_tx"; + desc = "Whether to log sent semi-reliable UDP messages."; + type = boolean; + data = { + default = FALSE; + }; +}; + +prop = { + name = "log_sr_udp_rx"; + desc = "Whether to log received semi-reliable UDP messages."; + type = boolean; + data = { + default = FALSE; + }; +}; + +prop = { + name = "secure_oob_debug"; + desc = "Debug level for the secured OOB query hit claiming."; + type = guint32; + data = { + default = 0; + min = 0; + max = 20; + }; +}; + +prop = { + name = "log_vmsg_tx"; + desc = "Whether to log sent vendor messages."; + type = boolean; + data = { + default = FALSE; + }; +}; + +prop = { + name = "log_vmsg_rx"; + desc = "Whether to log received vendor messages."; + type = boolean; + data = { + default = FALSE; + }; +}; + +prop = { + name = "dht_tcache_debug_flags"; + desc = "Debugging flags for the DHT token cache (developers only)."; + type = guint32; + data = { + default = 0; + }; +}; + +prop = { + name = "log_weird_dht_headers"; + desc = "Whether to log weird DHT message headers when debugging."; + type = boolean; + data = { + default = FALSE; + }; +}; + +prop = { + name = "dht_rpc_debug"; + desc = "Debug level for the DHT Remote Procedure Call (RPC) code."; + type = guint32; + data = { + default = 0; + }; +}; + +prop = { + name = "log_uhc_pings_rx"; + desc = "Whether to log UHC pings we receive."; + type = boolean; + data = { + default = FALSE; + }; +}; + +prop = { + name = "log_uhc_pings_tx"; + desc = "Whether to log UHC pings we emit."; + type = boolean; + data = { + default = FALSE; + }; +}; + +prop = { + name = "clean_shutdown"; + desc = "Whether the program was properly shutdown."; + internal = TRUE; + type = boolean; + data = { + default = TRUE; + }; +}; + +prop = { + name = "clean_restart"; + desc = "Whether the program restarted after a clean shutdown."; + save = FALSE; + internal = TRUE; + type = boolean; + data = { + default = TRUE; + }; +}; + +prop = { + name = "dht_keys_debug"; + desc = "Debug level for DHT key management."; + type = guint32; + data = { + default = 0; + }; +}; + +prop = { + name = "dht_values_debug"; + desc = "Debug level for DHT value management."; + type = guint32; + data = { + default = 0; + }; +}; + +prop = { + name = "pid"; + desc = "ID of the current process."; + internal = TRUE; + type = guint32; + data = { + default = 0; + }; +}; + +prop = { + name = "http_range_debug"; + desc = "Debug level for HTTP range parsing / handling."; + type = guint32; + data = { + default = 0; + }; +}; + +prop = { + name = "upnp_mapping_lease_time"; + desc = "Lease time when installing port mappings via UPnP or NAT-PMP, " + "in seconds. A value of 0 requests permanent mappings."; + type = guint32; + data = { + default = UPNP_MAPPING_LIFE; + min = 0; + max = 31536000; /* About a year */ + }; +}; + +prop = { + name = "user_auto_restart"; + desc = "Whether the program is auto-restarting at the user's request."; + internal = TRUE; + type = boolean; + data = { + default = FALSE; + }; +}; + +prop = { + name = "tm_debug"; + desc = "Debug level for time management."; + type = guint32; + data = { + default = 0; + min = 0; + max = 20; + }; +}; + +prop = { + name = "tmalloc_debug"; + desc = "Debug level for the tmalloc() thread-magazine object distributor."; + type = guint32; + data = { + default = 0; + min = 0; + max = 20; + }; +}; + +prop = { + name = "evq_debug"; + desc = "Debug level for the event queue thread."; + type = guint32; + data = { + default = 0; + min = 0; + max = 20; + }; +}; + +prop = { + name = "max_g2hub_hosts_cached"; + desc = "Maximum number of G2 hubs in the hub cache."; + type = guint32; + data = { + default = 10000; + min = 100; + max = 50000; + }; +}; + +prop = { + name = "hosts_in_g2hub_catcher"; + desc = "Current number of IPv4 hosts in the G2 hub caches."; + save = FALSE; + internal = TRUE; + type = guint32; + data = { + default = 0; + min = 0; + max = INT_MAX; + }; +}; + +prop = { + name = "enable_g2"; + desc = "Whether the G2 protocol should be enabled."; + type = boolean; + data = { + default = TRUE; + }; +}; + +prop = { + name = "node_g2_count"; + desc = "Number of G2 nodes currently connected."; + save = FALSE; + internal = TRUE; + type = guint32; + data = { + default = 0; + }; +}; + +prop = { + name = "max_g2_hubs"; + desc = "Maximum amount of G2 hubs we should connect to as a leaf."; + type = guint32; + data = { + default = 2; + min = 0; + max = 3; + }; +}; + +prop = { + name = "log_bad_g2"; + desc = "Whether to log bad G2 messages, corrupted or unexpected."; + type = boolean; + data = { + default = FALSE; + }; +}; + +prop = { + name = "log_dropped_g2"; + desc = "Whether to log dropped G2 messages"; + type = boolean; + data = { + default = FALSE; + }; +}; + +prop = { + name = "g2_rpc_debug"; + desc = "Debug level for the G2 RPC layer."; + type = guint32; + data = { + default = 0; + min = 0; + max = 20; + }; +}; + +prop = { + name = "log_query_hits"; + desc = "Whether to log summary of received query hits"; + type = boolean; + data = { + default = FALSE; + }; +}; + +prop = { + name = "log_query_hit_records"; + desc = "Whether to log summary of each record in received query hits"; + type = boolean; + data = { + default = FALSE; + }; +}; + +prop = { + name = "g2_browse_count"; + desc = "Number of G2 browsing requests received in this session."; + save = FALSE; + internal = TRUE; + type = guint32; + data = { + default = 0; + }; +}; + +prop = { + name = "g2_browse_served"; + desc = "Number of G2 browsing requests fully served in this session."; + save = FALSE; + internal = TRUE; + type = guint32; + data = { + default = 0; + }; +}; + +prop = { + name = "log_sending_g2"; + desc = "Whether to log G2 messages we're attempting to send"; + type = boolean; + data = { + default = FALSE; + }; +}; + +prop = { + name = "session_start_stamp"; + desc = "Timestamp at which the current session was started. This stamp " + "remains unchanged when gtk-gnutella restarts after a crash or " + "an explicit restart request."; + internal = TRUE; + type = timestamp; + data = { + default = 0; + }; +}; + +prop = { + name = "tcp_no_listening"; + desc = "No TCP listening socket bound to allow incoming connections."; + save = FALSE; + internal = TRUE; + type = boolean; + data = { + default = FALSE; + }; +}; + /* vi: set ts=4: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/gui_property.c -> gtk-gnutella-1.1.9.tar.bz2/src/if/gui_property.c
Changed
@@ -31,7 +31,10 @@ #include "lib/prop.h" #include "lib/eval.h" +#include "lib/mutex.h" #include "lib/omalloc.h" +#include "lib/pslist.h" + #include "gui_property.h" /* @@ -44,6 +47,16 @@ #include "lib/override.h" /* Must be the last header included */ +/* + * Some of the generated const variables can be unused, avoid warnings. + * + * The -Wunused-const-variable warning may not be available with a particular + * compiler, so the -Wpragmas that is issued before prevents a warning to be + * emitted in that case... + */ +G_IGNORE(-Wunknown-pragmas); /* clang does not know -Wpragmas */ +G_IGNORE(-Wpragmas); /* For gcc, not clang */ +G_IGNORE(-Wunused-const-variable); /* Appears in clang version 3.4.1 */ gboolean gui_property_variable_monitor_enabled = FALSE; static const gboolean gui_property_variable_monitor_enabled_default = FALSE; @@ -145,18 +158,18 @@ static const gboolean gui_property_variable_progressbar_bws_glout_visible_default = TRUE; gboolean gui_property_variable_autohide_bws_gleaf = TRUE; static const gboolean gui_property_variable_autohide_bws_gleaf_default = TRUE; -gboolean gui_property_variable_progressbar_bws_in_avg = TRUE; -static const gboolean gui_property_variable_progressbar_bws_in_avg_default = TRUE; -gboolean gui_property_variable_progressbar_bws_out_avg = TRUE; -static const gboolean gui_property_variable_progressbar_bws_out_avg_default = TRUE; -gboolean gui_property_variable_progressbar_bws_gin_avg = TRUE; -static const gboolean gui_property_variable_progressbar_bws_gin_avg_default = TRUE; -gboolean gui_property_variable_progressbar_bws_gout_avg = TRUE; -static const gboolean gui_property_variable_progressbar_bws_gout_avg_default = TRUE; -gboolean gui_property_variable_progressbar_bws_glin_avg = TRUE; -static const gboolean gui_property_variable_progressbar_bws_glin_avg_default = TRUE; -gboolean gui_property_variable_progressbar_bws_glout_avg = TRUE; -static const gboolean gui_property_variable_progressbar_bws_glout_avg_default = TRUE; +gboolean gui_property_variable_progressbar_bws_in_avg = FALSE; +static const gboolean gui_property_variable_progressbar_bws_in_avg_default = FALSE; +gboolean gui_property_variable_progressbar_bws_out_avg = FALSE; +static const gboolean gui_property_variable_progressbar_bws_out_avg_default = FALSE; +gboolean gui_property_variable_progressbar_bws_gin_avg = FALSE; +static const gboolean gui_property_variable_progressbar_bws_gin_avg_default = FALSE; +gboolean gui_property_variable_progressbar_bws_gout_avg = FALSE; +static const gboolean gui_property_variable_progressbar_bws_gout_avg_default = FALSE; +gboolean gui_property_variable_progressbar_bws_glin_avg = FALSE; +static const gboolean gui_property_variable_progressbar_bws_glin_avg_default = FALSE; +gboolean gui_property_variable_progressbar_bws_glout_avg = FALSE; +static const gboolean gui_property_variable_progressbar_bws_glout_avg_default = FALSE; gboolean gui_property_variable_search_sort_casesense = FALSE; static const gboolean gui_property_variable_search_sort_casesense_default = FALSE; guint32 gui_property_variable_search_sort_default_order = 0; @@ -171,7 +184,7 @@ static const gboolean gui_property_variable_search_jump_to_created_default = TRUE; guint32 gui_property_variable_search_stats_mode = 0; static const guint32 gui_property_variable_search_stats_mode_default = 0; -prop_def_choice_t gui_property_variable_search_stats_mode_choices = { +prop_def_choice_t gui_property_variable_search_stats_mode_choices = { {N_("disable"), 0}, {N_("by words"), 1}, {N_("by whole query"), 2}, @@ -196,7 +209,7 @@ static const gboolean gui_property_variable_gnet_stats_hops_default = FALSE; guint32 gui_property_variable_gnet_stats_source = 0; static const guint32 gui_property_variable_gnet_stats_source_default = 0; -prop_def_choice_t gui_property_variable_gnet_stats_source_choices = { +prop_def_choice_t gui_property_variable_gnet_stats_source_choices = { {N_("TCP & UDP"), GNET_STATS_FULL}, {N_("TCP only"), GNET_STATS_TCP_ONLY}, {N_("UDP only"), GNET_STATS_UDP_ONLY}, @@ -204,7 +217,7 @@ }; guint32 gui_property_variable_gnet_stats_drop_reasons_type = MSG_TOTAL; static const guint32 gui_property_variable_gnet_stats_drop_reasons_type_default = MSG_TOTAL; -prop_def_choice_t gui_property_variable_gnet_stats_drop_reasons_type_choices = { +prop_def_choice_t gui_property_variable_gnet_stats_drop_reasons_type_choices = { {N_("Unknown"), MSG_UNKNOWN}, {N_("Ping"), MSG_INIT}, {N_("Pong"), MSG_INIT_RESPONSE}, @@ -293,7 +306,7 @@ static const guint32 gui_property_variable_gnet_stats_byte_col_widths_default6 = { 60, 20, 20, 20, 20, 20 }; guint32 gui_property_variable_config_toolbar_style = 4; static const guint32 gui_property_variable_config_toolbar_style_default = 4; -prop_def_choice_t gui_property_variable_config_toolbar_style_choices = { +prop_def_choice_t gui_property_variable_config_toolbar_style_choices = { {N_("Icons"), 1}, {N_("Text"), 2}, {N_("Both (vertical)"), 3}, @@ -302,7 +315,7 @@ }; guint32 gui_property_variable_search_lifetime = 0; static const guint32 gui_property_variable_search_lifetime_default = 0; -prop_def_choice_t gui_property_variable_search_lifetime_choices = { +prop_def_choice_t gui_property_variable_search_lifetime_choices = { {N_("This session"), 0}, {N_("1 hour"), 1}, {N_("4 hours"), 4}, @@ -320,10 +333,10 @@ static const gboolean gui_property_variable_progressbar_bws_dht_in_visible_default = TRUE; gboolean gui_property_variable_progressbar_bws_dht_out_visible = TRUE; static const gboolean gui_property_variable_progressbar_bws_dht_out_visible_default = TRUE; -gboolean gui_property_variable_progressbar_bws_dht_in_avg = TRUE; -static const gboolean gui_property_variable_progressbar_bws_dht_in_avg_default = TRUE; -gboolean gui_property_variable_progressbar_bws_dht_out_avg = TRUE; -static const gboolean gui_property_variable_progressbar_bws_dht_out_avg_default = TRUE; +gboolean gui_property_variable_progressbar_bws_dht_in_avg = FALSE; +static const gboolean gui_property_variable_progressbar_bws_dht_in_avg_default = FALSE; +gboolean gui_property_variable_progressbar_bws_dht_out_avg = FALSE; +static const gboolean gui_property_variable_progressbar_bws_dht_out_avg_default = FALSE; gboolean gui_property_variable_search_media_type_audio = FALSE; static const gboolean gui_property_variable_search_media_type_audio_default = FALSE; gboolean gui_property_variable_search_media_type_video = FALSE; @@ -340,10 +353,14 @@ static const gboolean gui_property_variable_search_restart_when_pending_default = FALSE; gboolean gui_property_variable_search_discard_banned_guid = TRUE; static const gboolean gui_property_variable_search_discard_banned_guid_default = TRUE; +gboolean gui_property_variable_search_display_guess_stats = TRUE; +static const gboolean gui_property_variable_search_display_guess_stats_default = TRUE; +gboolean gui_property_variable_guess_stats_show_total = TRUE; +static const gboolean gui_property_variable_guess_stats_show_total_default = TRUE; static prop_set_t *gui_property; -G_GNUC_COLD prop_set_t * +prop_set_t * G_COLD gui_prop_init(void) { guint32 n; @@ -353,10 +370,11 @@ gui_property->size = GUI_PROPERTY_NUM; gui_property->offset = 1000; gui_property->mtime = 0; - gui_property->props = omalloc(sizeof(prop_def_t) * GUI_PROPERTY_NUM); + OMALLOC_ARRAY(gui_property->props, GUI_PROPERTY_NUM); gui_property->get_stub = gui_prop_get_stub; gui_property->dirty = FALSE; - gui_property->byName = NULL; + gui_property->by_name = NULL; + spinlock_init(&gui_property->lock); /* @@ -368,7 +386,9 @@ gui_property->props0.desc = _("Search monitor enabled."); gui_property->props0.ev_changed = event_new("monitor_enabled_changed"); gui_property->props0.save = FALSE; + gui_property->props0.internal = FALSE; gui_property->props0.vector_size = 1; + mutex_init(&gui_property->props0.lock); /* Type specific data: */ gui_property->props0.type = PROP_TYPE_BOOLEAN; @@ -385,7 +405,9 @@ gui_property->props1.desc = _("Maximum number of queries visible in search monitor."); gui_property->props1.ev_changed = event_new("monitor_max_items_changed"); gui_property->props1.save = TRUE; + gui_property->props1.internal = FALSE; gui_property->props1.vector_size = 1; + mutex_init(&gui_property->props1.lock); /* Type specific data: */ gui_property->props1.type = PROP_TYPE_GUINT32; @@ -405,7 +427,9 @@ gui_property->props2.desc = _("Whether to hide hits that have been considered for auto-downloading based on the SHA1 or your filters."); gui_property->props2.ev_changed = event_new("search_hide_downloaded_changed"); gui_property->props2.save = TRUE; + gui_property->props2.internal = FALSE; gui_property->props2.vector_size = 1; + mutex_init(&gui_property->props2.lock); /* Type specific data: */ gui_property->props2.type = PROP_TYPE_BOOLEAN; @@ -422,7 +446,9 @@ gui_property->props3.desc = _("Widths of the columns in the nodes table."); gui_property->props3.ev_changed = event_new("nodes_col_widths_changed"); gui_property->props3.save = TRUE; + gui_property->props3.internal = FALSE; gui_property->props3.vector_size = NODES_VISIBLE_COLUMNS; + mutex_init(&gui_property->props3.lock); /* Type specific data: */ gui_property->props3.type = PROP_TYPE_GUINT32; @@ -442,7 +468,9 @@ gui_property->props4.desc = _("Which columns are visible in the nodes pane."); gui_property->props4.ev_changed = event_new("nodes_col_visible_changed"); gui_property->props4.save = TRUE; + gui_property->props4.internal = FALSE; gui_property->props4.vector_size = NODES_VISIBLE_COLUMNS; + mutex_init(&gui_property->props4.lock); /* Type specific data: */ gui_property->props4.type = PROP_TYPE_BOOLEAN; @@ -459,7 +487,9 @@ gui_property->props5.desc = _("Widths of the columns in the file info table."); gui_property->props5.ev_changed = event_new("file_info_col_widths_changed"); gui_property->props5.save = TRUE; + gui_property->props5.internal = FALSE; gui_property->props5.vector_size = FILEINFO_VISIBLE_COLUMNS; + mutex_init(&gui_property->props5.lock); /* Type specific data: */ gui_property->props5.type = PROP_TYPE_GUINT32; @@ -479,7 +509,9 @@ gui_property->props6.desc = _("Visibility of the columns in the file info table."); gui_property->props6.ev_changed = event_new("file_info_col_visible_changed"); gui_property->props6.save = TRUE; + gui_property->props6.internal = FALSE; gui_property->props6.vector_size = FILEINFO_VISIBLE_COLUMNS; + mutex_init(&gui_property->props6.lock); /* Type specific data: */ gui_property->props6.type = PROP_TYPE_BOOLEAN; @@ -496,7 +528,9 @@ gui_property->props7.desc = _("Widths of the columns in the sources table."); gui_property->props7.ev_changed = event_new("sources_col_widths_changed"); gui_property->props7.save = TRUE; + gui_property->props7.internal = FALSE; gui_property->props7.vector_size = SOURCES_VISIBLE_COLUMNS; + mutex_init(&gui_property->props7.lock); /* Type specific data: */ gui_property->props7.type = PROP_TYPE_GUINT32; @@ -516,7 +550,9 @@ gui_property->props8.desc = _("Widths of the columns in the search list on the sidebar."); gui_property->props8.ev_changed = event_new("search_list_col_widths_changed"); gui_property->props8.save = TRUE; + gui_property->props8.internal = FALSE; gui_property->props8.vector_size = SEARCH_LIST_VISIBLE_COLUMNS; + mutex_init(&gui_property->props8.lock); /* Type specific data: */ gui_property->props8.type = PROP_TYPE_GUINT32; @@ -536,7 +572,9 @@ gui_property->props9.desc = _("Which columns are visible in the search results tables."); gui_property->props9.ev_changed = event_new("search_results_col_visible_changed"); gui_property->props9.save = TRUE; + gui_property->props9.internal = FALSE; gui_property->props9.vector_size = SEARCH_RESULTS_VISIBLE_COLUMNS; + mutex_init(&gui_property->props9.lock); /* Type specific data: */ gui_property->props9.type = PROP_TYPE_BOOLEAN; @@ -553,7 +591,9 @@ gui_property->props10.desc = _("Widths of the columns in the search results tables."); gui_property->props10.ev_changed = event_new("search_results_col_widths_changed"); gui_property->props10.save = TRUE; + gui_property->props10.internal = FALSE; gui_property->props10.vector_size = SEARCH_RESULTS_VISIBLE_COLUMNS; + mutex_init(&gui_property->props10.lock); /* Type specific data: */ gui_property->props10.type = PROP_TYPE_GUINT32; @@ -573,7 +613,9 @@ gui_property->props11.desc = _("Widths of the columns in the search stats table."); gui_property->props11.ev_changed = event_new("search_stats_col_widths_changed"); gui_property->props11.save = TRUE; + gui_property->props11.internal = FALSE; gui_property->props11.vector_size = 3; + mutex_init(&gui_property->props11.lock); /* Type specific data: */ gui_property->props11.type = PROP_TYPE_GUINT32; @@ -593,7 +635,9 @@ gui_property->props12.desc = _("Widths of the columns in the upload stats table."); gui_property->props12.ev_changed = event_new("ul_stats_col_widths_changed"); gui_property->props12.save = TRUE; + gui_property->props12.internal = FALSE; gui_property->props12.vector_size = UPLOAD_STATS_GUI_VISIBLE_COLUMNS; + mutex_init(&gui_property->props12.lock); /* Type specific data: */ gui_property->props12.type = PROP_TYPE_GUINT32; @@ -613,7 +657,9 @@ gui_property->props13.desc = _("Which columns are visible in the upload stats table."); gui_property->props13.ev_changed = event_new("ul_stats_col_visible_changed"); gui_property->props13.save = TRUE; + gui_property->props13.internal = FALSE; gui_property->props13.vector_size = UPLOAD_STATS_GUI_VISIBLE_COLUMNS; + mutex_init(&gui_property->props13.lock); /* Type specific data: */ gui_property->props13.type = PROP_TYPE_BOOLEAN; @@ -630,7 +676,9 @@ gui_property->props14.desc = _("Widths of the columns in the uploads table."); gui_property->props14.ev_changed = event_new("uploads_col_widths_changed"); gui_property->props14.save = TRUE; + gui_property->props14.internal = FALSE; gui_property->props14.vector_size = UPLOADS_GUI_VISIBLE_COLUMNS; + mutex_init(&gui_property->props14.lock); /* Type specific data: */ gui_property->props14.type = PROP_TYPE_GUINT32; @@ -650,7 +698,9 @@ gui_property->props15.desc = _("Which columns are visible in the uploads table."); gui_property->props15.ev_changed = event_new("uploads_col_visible_changed"); gui_property->props15.save = TRUE; + gui_property->props15.internal = FALSE; gui_property->props15.vector_size = UPLOADS_GUI_VISIBLE_COLUMNS; + mutex_init(&gui_property->props15.lock); /* Type specific data: */ gui_property->props15.type = PROP_TYPE_BOOLEAN; @@ -667,7 +717,9 @@ gui_property->props16.desc = _("Widths of the columns in the rules table in the filter dialog."); gui_property->props16.ev_changed = event_new("filter_rules_col_widths_changed"); gui_property->props16.save = TRUE; + gui_property->props16.internal = FALSE; gui_property->props16.vector_size = 4; + mutex_init(&gui_property->props16.lock); /* Type specific data: */ gui_property->props16.type = PROP_TYPE_GUINT32; @@ -687,7 +739,9 @@ gui_property->props17.desc = _("Widths of the columns in the filter table in the filter dialog."); gui_property->props17.ev_changed = event_new("filter_filters_col_widths_changed"); gui_property->props17.save = TRUE; + gui_property->props17.internal = FALSE; gui_property->props17.vector_size = 3; + mutex_init(&gui_property->props17.lock); /* Type specific data: */ gui_property->props17.type = PROP_TYPE_GUINT32; @@ -707,7 +761,9 @@ gui_property->props18.desc = _("Widths of the columns in the Gnet packet stats table."); gui_property->props18.ev_changed = event_new("gnet_stats_msg_col_widths_changed"); gui_property->props18.save = TRUE; + gui_property->props18.internal = FALSE; gui_property->props18.vector_size = 8; + mutex_init(&gui_property->props18.lock); /* Type specific data: */ gui_property->props18.type = PROP_TYPE_GUINT32; @@ -727,7 +783,9 @@ gui_property->props19.desc = _("Widths of the columns in the Gnet fc ttl stats table."); gui_property->props19.ev_changed = event_new("gnet_stats_fc_ttl_col_widths_changed"); gui_property->props19.save = TRUE; + gui_property->props19.internal = FALSE; gui_property->props19.vector_size = 10; + mutex_init(&gui_property->props19.lock); /* Type specific data: */ gui_property->props19.type = PROP_TYPE_GUINT32; @@ -747,7 +805,9 @@ gui_property->props20.desc = _("Widths of the columns in the Gnet fc hops stats table."); gui_property->props20.ev_changed = event_new("gnet_stats_fc_hops_col_widths_changed"); gui_property->props20.save = TRUE; + gui_property->props20.internal = FALSE; gui_property->props20.vector_size = 10; + mutex_init(&gui_property->props20.lock); /* Type specific data: */ gui_property->props20.type = PROP_TYPE_GUINT32; @@ -767,7 +827,9 @@ gui_property->props21.desc = _("Widths of the columns in the Gnet fc hops stats table."); gui_property->props21.ev_changed = event_new("gnet_stats_fc_col_widths_changed"); gui_property->props21.save = TRUE; + gui_property->props21.internal = FALSE; gui_property->props21.vector_size = 10; + mutex_init(&gui_property->props21.lock); /* Type specific data: */ gui_property->props21.type = PROP_TYPE_GUINT32; @@ -787,7 +849,9 @@ gui_property->props22.desc = _("Widths of the columns in the Gnet horizon stats table."); gui_property->props22.ev_changed = event_new("gnet_stats_horizon_col_widths_changed"); gui_property->props22.save = TRUE; + gui_property->props22.internal = FALSE; gui_property->props22.vector_size = 4; + mutex_init(&gui_property->props22.lock); /* Type specific data: */ gui_property->props22.type = PROP_TYPE_GUINT32; @@ -807,7 +871,9 @@ gui_property->props23.desc = _("Widths of the columns in the Gnet stats drop reasons table."); gui_property->props23.ev_changed = event_new("gnet_stats_drop_reasons_col_widths_changed"); gui_property->props23.save = TRUE; + gui_property->props23.internal = FALSE; gui_property->props23.vector_size = 2; + mutex_init(&gui_property->props23.lock); /* Type specific data: */ gui_property->props23.type = PROP_TYPE_GUINT32; @@ -827,7 +893,9 @@ gui_property->props24.desc = _("Widths of the columns in the Gnet stats drop reasons table."); gui_property->props24.ev_changed = event_new("gnet_stats_recv_col_widths_changed"); gui_property->props24.save = TRUE; + gui_property->props24.internal = FALSE; gui_property->props24.vector_size = 10; + mutex_init(&gui_property->props24.lock); /* Type specific data: */ gui_property->props24.type = PROP_TYPE_GUINT32; @@ -847,7 +915,9 @@ gui_property->props25.desc = _("Widths of the columns in the hostcache table."); gui_property->props25.ev_changed = event_new("hcache_col_widths_changed"); gui_property->props25.save = TRUE; + gui_property->props25.internal = FALSE; gui_property->props25.vector_size = 4; + mutex_init(&gui_property->props25.lock); /* Type specific data: */ gui_property->props25.type = PROP_TYPE_GUINT32; @@ -867,7 +937,9 @@ gui_property->props26.desc = _("Position and size of the main window."); gui_property->props26.ev_changed = event_new("window_coords_changed"); gui_property->props26.save = TRUE; + gui_property->props26.internal = FALSE; gui_property->props26.vector_size = 4; + mutex_init(&gui_property->props26.lock); /* Type specific data: */ gui_property->props26.type = PROP_TYPE_GUINT32; @@ -887,7 +959,9 @@ gui_property->props27.desc = _("Position and size of the filter dialog."); gui_property->props27.ev_changed = event_new("filter_dlg_coords_changed"); gui_property->props27.save = TRUE; + gui_property->props27.internal = FALSE; gui_property->props27.vector_size = 4; + mutex_init(&gui_property->props27.lock); /* Type specific data: */ gui_property->props27.type = PROP_TYPE_GUINT32; @@ -907,7 +981,9 @@ gui_property->props28.desc = _("Position and size of the preferences dialog."); gui_property->props28.ev_changed = event_new("prefs_dlg_coords_changed"); gui_property->props28.save = TRUE; + gui_property->props28.internal = FALSE; gui_property->props28.vector_size = 4; + mutex_init(&gui_property->props28.lock); /* Type specific data: */ gui_property->props28.type = PROP_TYPE_GUINT32; @@ -927,7 +1003,9 @@ gui_property->props29.desc = _("Position of the divider in the fileinfo panel."); gui_property->props29.ev_changed = event_new("fileinfo_divider_pos_changed"); gui_property->props29.save = TRUE; + gui_property->props29.internal = FALSE; gui_property->props29.vector_size = 1; + mutex_init(&gui_property->props29.lock); /* Type specific data: */ gui_property->props29.type = PROP_TYPE_GUINT32; @@ -947,7 +1025,9 @@ gui_property->props30.desc = _("Size of the sidebar."); gui_property->props30.ev_changed = event_new("main_divider_pos_changed"); gui_property->props30.save = TRUE; + gui_property->props30.internal = FALSE; gui_property->props30.vector_size = 1; + mutex_init(&gui_property->props30.lock); /* Type specific data: */ gui_property->props30.type = PROP_TYPE_GUINT32; @@ -967,7 +1047,9 @@ gui_property->props31.desc = _("Position of the divider in the Gnet stats pane."); gui_property->props31.ev_changed = event_new("gnet_stats_divider_pos_changed"); gui_property->props31.save = TRUE; + gui_property->props31.internal = FALSE; gui_property->props31.vector_size = 1; + mutex_init(&gui_property->props31.lock); /* Type specific data: */ gui_property->props31.type = PROP_TYPE_GUINT32; @@ -987,7 +1069,9 @@ gui_property->props32.desc = _("Position of the divider in the search results pane."); gui_property->props32.ev_changed = event_new("results_divider_pos_changed"); gui_property->props32.save = TRUE; + gui_property->props32.internal = FALSE; gui_property->props32.vector_size = 1; + mutex_init(&gui_property->props32.lock); /* Type specific data: */ gui_property->props32.type = PROP_TYPE_GUINT32; @@ -1007,7 +1091,9 @@ gui_property->props33.desc = _("Debug level for the gui."); gui_property->props33.ev_changed = event_new("gui_debug_changed"); gui_property->props33.save = TRUE; + gui_property->props33.internal = FALSE; gui_property->props33.vector_size = 1; + mutex_init(&gui_property->props33.lock); /* Type specific data: */ gui_property->props33.type = PROP_TYPE_GUINT32; @@ -1027,7 +1113,9 @@ gui_property->props34.desc = _("Size of the filter tree in the filter dialog."); gui_property->props34.ev_changed = event_new("filter_main_divider_pos_changed"); gui_property->props34.save = TRUE; + gui_property->props34.internal = FALSE; gui_property->props34.vector_size = 1; + mutex_init(&gui_property->props34.lock); /* Type specific data: */ gui_property->props34.type = PROP_TYPE_GUINT32; @@ -1047,7 +1135,9 @@ gui_property->props35.desc = _("Show tabs or search list."); gui_property->props35.ev_changed = event_new("search_results_show_tabs_changed"); gui_property->props35.save = TRUE; + gui_property->props35.internal = FALSE; gui_property->props35.vector_size = 1; + mutex_init(&gui_property->props35.lock); /* Type specific data: */ gui_property->props35.type = PROP_TYPE_BOOLEAN; @@ -1064,7 +1154,9 @@ gui_property->props36.desc = _("Display Searchbar."); gui_property->props36.ev_changed = event_new("searchbar_visible_changed"); gui_property->props36.save = TRUE; + gui_property->props36.internal = FALSE; gui_property->props36.vector_size = 1; + mutex_init(&gui_property->props36.lock); /* Type specific data: */ gui_property->props36.type = PROP_TYPE_BOOLEAN; @@ -1081,7 +1173,9 @@ gui_property->props37.desc = _("Display Sidebar."); gui_property->props37.ev_changed = event_new("sidebar_visible_changed"); gui_property->props37.save = TRUE; + gui_property->props37.internal = FALSE; gui_property->props37.vector_size = 1; + mutex_init(&gui_property->props37.lock); /* Type specific data: */ gui_property->props37.type = PROP_TYPE_BOOLEAN; @@ -1098,7 +1192,9 @@ gui_property->props38.desc = _("Display Menu."); gui_property->props38.ev_changed = event_new("menubar_visible_changed"); gui_property->props38.save = FALSE; + gui_property->props38.internal = FALSE; gui_property->props38.vector_size = 1; + mutex_init(&gui_property->props38.lock); /* Type specific data: */ gui_property->props38.type = PROP_TYPE_BOOLEAN; @@ -1115,7 +1211,9 @@ gui_property->props39.desc = _("Display statusbar."); gui_property->props39.ev_changed = event_new("statusbar_visible_changed"); gui_property->props39.save = TRUE; + gui_property->props39.internal = FALSE; gui_property->props39.vector_size = 1; + mutex_init(&gui_property->props39.lock); /* Type specific data: */ gui_property->props39.type = PROP_TYPE_BOOLEAN; @@ -1132,7 +1230,9 @@ gui_property->props40.desc = _("Display upload statistics in sidebar."); gui_property->props40.ev_changed = event_new("progressbar_uploads_visible_changed"); gui_property->props40.save = TRUE; + gui_property->props40.internal = FALSE; gui_property->props40.vector_size = 1; + mutex_init(&gui_property->props40.lock); /* Type specific data: */ gui_property->props40.type = PROP_TYPE_BOOLEAN; @@ -1149,7 +1249,9 @@ gui_property->props41.desc = _("Display download statistics in sidebar."); gui_property->props41.ev_changed = event_new("progressbar_downloads_visible_changed"); gui_property->props41.save = TRUE; + gui_property->props41.internal = FALSE; gui_property->props41.vector_size = 1; + mutex_init(&gui_property->props41.lock); /* Type specific data: */ gui_property->props41.type = PROP_TYPE_BOOLEAN; @@ -1166,7 +1268,9 @@ gui_property->props42.desc = _("Display connection statistics in sidebar."); gui_property->props42.ev_changed = event_new("progressbar_connections_visible_changed"); gui_property->props42.save = TRUE; + gui_property->props42.internal = FALSE; gui_property->props42.vector_size = 1; + mutex_init(&gui_property->props42.lock); /* Type specific data: */ gui_property->props42.type = PROP_TYPE_BOOLEAN; @@ -1183,7 +1287,9 @@ gui_property->props43.desc = _("Display incoming HTTP traffic bandwidth usage."); gui_property->props43.ev_changed = event_new("progressbar_bws_in_visible_changed"); gui_property->props43.save = TRUE; + gui_property->props43.internal = FALSE; gui_property->props43.vector_size = 1; + mutex_init(&gui_property->props43.lock); /* Type specific data: */ gui_property->props43.type = PROP_TYPE_BOOLEAN; @@ -1200,7 +1306,9 @@ gui_property->props44.desc = _("Display outgoing HTTP traffic bandwidth usage."); gui_property->props44.ev_changed = event_new("progressbar_bws_out_visible_changed"); gui_property->props44.save = TRUE; + gui_property->props44.internal = FALSE; gui_property->props44.vector_size = 1; + mutex_init(&gui_property->props44.lock); /* Type specific data: */ gui_property->props44.type = PROP_TYPE_BOOLEAN; @@ -1217,7 +1325,9 @@ gui_property->props45.desc = _("Display incoming Gnet traffic bandwidth usage."); gui_property->props45.ev_changed = event_new("progressbar_bws_gin_visible_changed"); gui_property->props45.save = TRUE; + gui_property->props45.internal = FALSE; gui_property->props45.vector_size = 1; + mutex_init(&gui_property->props45.lock); /* Type specific data: */ gui_property->props45.type = PROP_TYPE_BOOLEAN; @@ -1234,7 +1344,9 @@ gui_property->props46.desc = _("Display outgoing Gnet traffic bandwidth usage."); gui_property->props46.ev_changed = event_new("progressbar_bws_gout_visible_changed"); gui_property->props46.save = TRUE; + gui_property->props46.internal = FALSE; gui_property->props46.vector_size = 1; + mutex_init(&gui_property->props46.lock); /* Type specific data: */ gui_property->props46.type = PROP_TYPE_BOOLEAN; @@ -1251,7 +1363,9 @@ gui_property->props47.desc = _("Display incoming Gnet leaf traffic bandwidth usage."); gui_property->props47.ev_changed = event_new("progressbar_bws_glin_visible_changed"); gui_property->props47.save = TRUE; + gui_property->props47.internal = FALSE; gui_property->props47.vector_size = 1; + mutex_init(&gui_property->props47.lock); /* Type specific data: */ gui_property->props47.type = PROP_TYPE_BOOLEAN; @@ -1268,7 +1382,9 @@ gui_property->props48.desc = _("Display outgoing Gnet leaf traffic bandwidth usage."); gui_property->props48.ev_changed = event_new("progressbar_bws_glout_visible_changed"); gui_property->props48.save = TRUE; + gui_property->props48.internal = FALSE; gui_property->props48.vector_size = 1; + mutex_init(&gui_property->props48.lock); /* Type specific data: */ gui_property->props48.type = PROP_TYPE_BOOLEAN; @@ -1285,7 +1401,9 @@ gui_property->props49.desc = _("Automatically hide leaf bandwidth display when not in ultrapeer mode."); gui_property->props49.ev_changed = event_new("autohide_bws_gleaf_changed"); gui_property->props49.save = TRUE; + gui_property->props49.internal = FALSE; gui_property->props49.vector_size = 1; + mutex_init(&gui_property->props49.lock); /* Type specific data: */ gui_property->props49.type = PROP_TYPE_BOOLEAN; @@ -1302,7 +1420,9 @@ gui_property->props50.desc = _("Display incoming HTTP traffic bandwidth average."); gui_property->props50.ev_changed = event_new("progressbar_bws_in_avg_changed"); gui_property->props50.save = TRUE; + gui_property->props50.internal = FALSE; gui_property->props50.vector_size = 1; + mutex_init(&gui_property->props50.lock); /* Type specific data: */ gui_property->props50.type = PROP_TYPE_BOOLEAN; @@ -1319,7 +1439,9 @@ gui_property->props51.desc = _("Display outgoing HTTP traffic bandwidth average."); gui_property->props51.ev_changed = event_new("progressbar_bws_out_avg_changed"); gui_property->props51.save = TRUE; + gui_property->props51.internal = FALSE; gui_property->props51.vector_size = 1; + mutex_init(&gui_property->props51.lock); /* Type specific data: */ gui_property->props51.type = PROP_TYPE_BOOLEAN; @@ -1336,7 +1458,9 @@ gui_property->props52.desc = _("Display incoming Gnet traffic bandwidth average."); gui_property->props52.ev_changed = event_new("progressbar_bws_gin_avg_changed"); gui_property->props52.save = TRUE; + gui_property->props52.internal = FALSE; gui_property->props52.vector_size = 1; + mutex_init(&gui_property->props52.lock); /* Type specific data: */ gui_property->props52.type = PROP_TYPE_BOOLEAN; @@ -1353,7 +1477,9 @@ gui_property->props53.desc = _("Display outgoing Gnet traffic bandwidth average."); gui_property->props53.ev_changed = event_new("progressbar_bws_gout_avg_changed"); gui_property->props53.save = TRUE; + gui_property->props53.internal = FALSE; gui_property->props53.vector_size = 1; + mutex_init(&gui_property->props53.lock); /* Type specific data: */ gui_property->props53.type = PROP_TYPE_BOOLEAN; @@ -1370,7 +1496,9 @@ gui_property->props54.desc = _("Display incoming Gnet leaf traffic bandwidth average."); gui_property->props54.ev_changed = event_new("progressbar_bws_glin_avg_changed"); gui_property->props54.save = TRUE; + gui_property->props54.internal = FALSE; gui_property->props54.vector_size = 1; + mutex_init(&gui_property->props54.lock); /* Type specific data: */ gui_property->props54.type = PROP_TYPE_BOOLEAN; @@ -1387,7 +1515,9 @@ gui_property->props55.desc = _("Display outgoing Gnet leaf traffic bandwidth average."); gui_property->props55.ev_changed = event_new("progressbar_bws_glout_avg_changed"); gui_property->props55.save = TRUE; + gui_property->props55.internal = FALSE; gui_property->props55.vector_size = 1; + mutex_init(&gui_property->props55.lock); /* Type specific data: */ gui_property->props55.type = PROP_TYPE_BOOLEAN; @@ -1404,7 +1534,9 @@ gui_property->props56.desc = _("Do a case sensitive sorting."); gui_property->props56.ev_changed = event_new("search_sort_casesense_changed"); gui_property->props56.save = TRUE; + gui_property->props56.internal = FALSE; gui_property->props56.vector_size = 1; + mutex_init(&gui_property->props56.lock); /* Type specific data: */ gui_property->props56.type = PROP_TYPE_BOOLEAN; @@ -1421,7 +1553,9 @@ gui_property->props57.desc = _("Default sort order for search results."); gui_property->props57.ev_changed = event_new("search_sort_default_order_changed"); gui_property->props57.save = TRUE; + gui_property->props57.internal = FALSE; gui_property->props57.vector_size = 1; + mutex_init(&gui_property->props57.lock); /* Type specific data: */ gui_property->props57.type = PROP_TYPE_GUINT32; @@ -1441,7 +1575,9 @@ gui_property->props58.desc = _("Default sort column for search results."); gui_property->props58.ev_changed = event_new("search_sort_default_column_changed"); gui_property->props58.save = TRUE; + gui_property->props58.internal = FALSE; gui_property->props58.vector_size = 1; + mutex_init(&gui_property->props58.lock); /* Type specific data: */ gui_property->props58.type = PROP_TYPE_GUINT32; @@ -1461,7 +1597,9 @@ gui_property->props59.desc = _("Discard search results which are considered spam."); gui_property->props59.ev_changed = event_new("search_discard_spam_changed"); gui_property->props59.save = TRUE; + gui_property->props59.internal = FALSE; gui_property->props59.vector_size = 1; + mutex_init(&gui_property->props59.lock); /* Type specific data: */ gui_property->props59.type = PROP_TYPE_BOOLEAN; @@ -1478,7 +1616,9 @@ gui_property->props60.desc = _("Discard search results which carry no hashsum."); gui_property->props60.ev_changed = event_new("search_discard_hashless_changed"); gui_property->props60.save = TRUE; + gui_property->props60.internal = FALSE; gui_property->props60.vector_size = 1; + mutex_init(&gui_property->props60.lock); /* Type specific data: */ gui_property->props60.type = PROP_TYPE_BOOLEAN; @@ -1495,7 +1635,9 @@ gui_property->props61.desc = _("Jump to newly created searches"); gui_property->props61.ev_changed = event_new("search_jump_to_created_changed"); gui_property->props61.save = TRUE; + gui_property->props61.internal = FALSE; gui_property->props61.vector_size = 1; + mutex_init(&gui_property->props61.lock); /* Type specific data: */ gui_property->props61.type = PROP_TYPE_BOOLEAN; @@ -1512,7 +1654,9 @@ gui_property->props62.desc = _("Collect statistics about searches that go through this node."); gui_property->props62.ev_changed = event_new("search_stats_mode_changed"); gui_property->props62.save = TRUE; + gui_property->props62.internal = FALSE; gui_property->props62.vector_size = 1; + mutex_init(&gui_property->props62.lock); /* Type specific data: */ gui_property->props62.type = PROP_TYPE_MULTICHOICE; @@ -1532,7 +1676,9 @@ gui_property->props63.desc = _("Interval in which the search stats are updated."); gui_property->props63.ev_changed = event_new("search_stats_update_interval_changed"); gui_property->props63.save = TRUE; + gui_property->props63.internal = FALSE; gui_property->props63.vector_size = 1; + mutex_init(&gui_property->props63.lock); /* Type specific data: */ gui_property->props63.type = PROP_TYPE_GUINT32; @@ -1552,7 +1698,9 @@ gui_property->props64.desc = _("A deletion coefficient, so that small non-significant results can be dropped. The lower it is, the more search statistics will be kept in memory."); gui_property->props64.ev_changed = event_new("search_stats_delcoef_changed"); gui_property->props64.save = TRUE; + gui_property->props64.internal = FALSE; gui_property->props64.vector_size = 1; + mutex_init(&gui_property->props64.lock); /* Type specific data: */ gui_property->props64.type = PROP_TYPE_GUINT32; @@ -1572,7 +1720,9 @@ gui_property->props65.desc = _("Show confirmation dialog when leaving gtk-gnutella."); gui_property->props65.ev_changed = event_new("confirm_quit_changed"); gui_property->props65.save = TRUE; + gui_property->props65.internal = FALSE; gui_property->props65.vector_size = 1; + mutex_init(&gui_property->props65.lock); /* Type specific data: */ gui_property->props65.type = PROP_TYPE_BOOLEAN; @@ -1589,7 +1739,9 @@ gui_property->props66.desc = _("Show a helpful message when the mouse pointer lingers over a widget."); gui_property->props66.ev_changed = event_new("show_tooltips_changed"); gui_property->props66.save = TRUE; + gui_property->props66.internal = FALSE; gui_property->props66.vector_size = 1; + mutex_init(&gui_property->props66.lock); /* Type specific data: */ gui_property->props66.type = PROP_TYPE_BOOLEAN; @@ -1606,7 +1758,9 @@ gui_property->props67.desc = _("Show a lot more settings to tweak. If you tamper with them be sure to read up on what they are doing."); gui_property->props67.ev_changed = event_new("expert_mode_changed"); gui_property->props67.save = TRUE; + gui_property->props67.internal = FALSE; gui_property->props67.vector_size = 1; + mutex_init(&gui_property->props67.lock); /* Type specific data: */ gui_property->props67.type = PROP_TYPE_BOOLEAN; @@ -1623,7 +1777,9 @@ gui_property->props68.desc = _("Show percentages instead of absolute values in the Gnet stats."); gui_property->props68.ev_changed = event_new("gnet_stats_perc_changed"); gui_property->props68.save = TRUE; + gui_property->props68.internal = FALSE; gui_property->props68.vector_size = 1; + mutex_init(&gui_property->props68.lock); /* Type specific data: */ gui_property->props68.type = PROP_TYPE_BOOLEAN; @@ -1640,7 +1796,9 @@ gui_property->props69.desc = _("Show bytes instead of packets in the Gnet stats."); gui_property->props69.ev_changed = event_new("gnet_stats_bytes_changed"); gui_property->props69.save = TRUE; + gui_property->props69.internal = FALSE; gui_property->props69.vector_size = 1; + mutex_init(&gui_property->props69.lock); /* Type specific data: */ gui_property->props69.type = PROP_TYPE_BOOLEAN; @@ -1657,7 +1815,9 @@ gui_property->props70.desc = _("Show stats per hops instead of per TTL."); gui_property->props70.ev_changed = event_new("gnet_stats_hops_changed"); gui_property->props70.save = TRUE; + gui_property->props70.internal = FALSE; gui_property->props70.vector_size = 1; + mutex_init(&gui_property->props70.lock); /* Type specific data: */ gui_property->props70.type = PROP_TYPE_BOOLEAN; @@ -1674,7 +1834,9 @@ gui_property->props71.desc = _("Choose source of stats to be displayed."); gui_property->props71.ev_changed = event_new("gnet_stats_source_changed"); gui_property->props71.save = TRUE; + gui_property->props71.internal = FALSE; gui_property->props71.vector_size = 1; + mutex_init(&gui_property->props71.lock); /* Type specific data: */ gui_property->props71.type = PROP_TYPE_MULTICHOICE; @@ -1694,7 +1856,9 @@ gui_property->props72.desc = _("Choose message type for drop reasons."); gui_property->props72.ev_changed = event_new("gnet_stats_drop_reasons_type_changed"); gui_property->props72.save = TRUE; + gui_property->props72.internal = FALSE; gui_property->props72.vector_size = 1; + mutex_init(&gui_property->props72.lock); /* Type specific data: */ gui_property->props72.type = PROP_TYPE_MULTICHOICE; @@ -1714,7 +1878,9 @@ gui_property->props73.desc = _("Include Gnutella packet header size to the volume."); gui_property->props73.ev_changed = event_new("gnet_stats_with_headers_changed"); gui_property->props73.save = TRUE; + gui_property->props73.internal = FALSE; gui_property->props73.vector_size = 1; + mutex_init(&gui_property->props73.lock); /* Type specific data: */ gui_property->props73.type = PROP_TYPE_BOOLEAN; @@ -1731,7 +1897,9 @@ gui_property->props74.desc = _("Show percentages instead of absolute values in the Gnet stats (drop reasons)."); gui_property->props74.ev_changed = event_new("gnet_stats_drop_perc_changed"); gui_property->props74.save = TRUE; + gui_property->props74.internal = FALSE; gui_property->props74.vector_size = 1; + mutex_init(&gui_property->props74.lock); /* Type specific data: */ gui_property->props74.type = PROP_TYPE_BOOLEAN; @@ -1748,7 +1916,9 @@ gui_property->props75.desc = _("Widths of the columns in the Gnet stats general table."); gui_property->props75.ev_changed = event_new("gnet_stats_general_col_widths_changed"); gui_property->props75.save = TRUE; + gui_property->props75.internal = FALSE; gui_property->props75.vector_size = 2; + mutex_init(&gui_property->props75.lock); /* Type specific data: */ gui_property->props75.type = PROP_TYPE_GUINT32; @@ -1768,7 +1938,9 @@ gui_property->props76.desc = _("Auto clear completed uploads."); gui_property->props76.ev_changed = event_new("autoclear_completed_uploads_changed"); gui_property->props76.save = TRUE; + gui_property->props76.internal = FALSE; gui_property->props76.vector_size = 1; + mutex_init(&gui_property->props76.lock); /* Type specific data: */ gui_property->props76.type = PROP_TYPE_BOOLEAN; @@ -1785,7 +1957,9 @@ gui_property->props77.desc = _("Auto clear failed uploads."); gui_property->props77.ev_changed = event_new("autoclear_failed_uploads_changed"); gui_property->props77.save = TRUE; + gui_property->props77.internal = FALSE; gui_property->props77.vector_size = 1; + mutex_init(&gui_property->props77.lock); /* Type specific data: */ gui_property->props77.type = PROP_TYPE_BOOLEAN; @@ -1802,7 +1976,9 @@ gui_property->props78.desc = _("Whether the node's uptime should be shown (not all nodes provide this information)."); gui_property->props78.ev_changed = event_new("node_show_uptime_changed"); gui_property->props78.save = TRUE; + gui_property->props78.internal = FALSE; gui_property->props78.vector_size = 1; + mutex_init(&gui_property->props78.lock); /* Type specific data: */ gui_property->props78.type = PROP_TYPE_BOOLEAN; @@ -1819,7 +1995,9 @@ gui_property->props79.desc = _("Whether the handshaking version number should be displayed."); gui_property->props79.ev_changed = event_new("node_show_handshake_version_changed"); gui_property->props79.save = TRUE; + gui_property->props79.internal = FALSE; gui_property->props79.vector_size = 1; + mutex_init(&gui_property->props79.lock); /* Type specific data: */ gui_property->props79.type = PROP_TYPE_BOOLEAN; @@ -1836,7 +2014,9 @@ gui_property->props80.desc = _("Whether detailed traffic information should be shown for the node. When enabled, it is possible to also customize how much information to display. When disabled, only TX and RX message counts are displayed, followed by the message queue info."); gui_property->props80.ev_changed = event_new("node_show_detailed_info_changed"); gui_property->props80.save = TRUE; + gui_property->props80.internal = FALSE; gui_property->props80.vector_size = 1; + mutex_init(&gui_property->props80.lock); /* Type specific data: */ gui_property->props80.type = PROP_TYPE_BOOLEAN; @@ -1853,7 +2033,9 @@ gui_property->props81.desc = _("Whether TX traffic compression ratio should be displayed."); gui_property->props81.ev_changed = event_new("show_gnet_info_txc_changed"); gui_property->props81.save = TRUE; + gui_property->props81.internal = FALSE; gui_property->props81.vector_size = 1; + mutex_init(&gui_property->props81.lock); /* Type specific data: */ gui_property->props81.type = PROP_TYPE_BOOLEAN; @@ -1870,7 +2052,9 @@ gui_property->props82.desc = _("Whether RX traffic compression ratio should be displayed."); gui_property->props82.ev_changed = event_new("show_gnet_info_rxc_changed"); gui_property->props82.save = TRUE; + gui_property->props82.internal = FALSE; gui_property->props82.vector_size = 1; + mutex_init(&gui_property->props82.lock); /* Type specific data: */ gui_property->props82.type = PROP_TYPE_BOOLEAN; @@ -1887,7 +2071,9 @@ gui_property->props83.desc = _("Whether to display the amount of bytes sent on the TX wire."); gui_property->props83.ev_changed = event_new("show_gnet_info_tx_wire_changed"); gui_property->props83.save = TRUE; + gui_property->props83.internal = FALSE; gui_property->props83.vector_size = 1; + mutex_init(&gui_property->props83.lock); /* Type specific data: */ gui_property->props83.type = PROP_TYPE_BOOLEAN; @@ -1904,7 +2090,9 @@ gui_property->props84.desc = _("Whether to display the amount of bytes received on the RX wire."); gui_property->props84.ev_changed = event_new("show_gnet_info_rx_wire_changed"); gui_property->props84.save = TRUE; + gui_property->props84.internal = FALSE; gui_property->props84.vector_size = 1; + mutex_init(&gui_property->props84.lock); /* Type specific data: */ gui_property->props84.type = PROP_TYPE_BOOLEAN; @@ -1921,7 +2109,9 @@ gui_property->props85.desc = _("Whether TX instantaneous transmission speed should be displayed."); gui_property->props85.ev_changed = event_new("show_gnet_info_tx_speed_changed"); gui_property->props85.save = TRUE; + gui_property->props85.internal = FALSE; gui_property->props85.vector_size = 1; + mutex_init(&gui_property->props85.lock); /* Type specific data: */ gui_property->props85.type = PROP_TYPE_BOOLEAN; @@ -1938,7 +2128,9 @@ gui_property->props86.desc = _("Whether RX instantaneous transmission speed should be displayed."); gui_property->props86.ev_changed = event_new("show_gnet_info_rx_speed_changed"); gui_property->props86.save = TRUE; + gui_property->props86.internal = FALSE; gui_property->props86.vector_size = 1; + mutex_init(&gui_property->props86.lock); /* Type specific data: */ gui_property->props86.type = PROP_TYPE_BOOLEAN; @@ -1955,7 +2147,9 @@ gui_property->props87.desc = _("Whether count of transmitted queries should be displayed."); gui_property->props87.ev_changed = event_new("show_gnet_info_tx_queries_changed"); gui_property->props87.save = TRUE; + gui_property->props87.internal = FALSE; gui_property->props87.vector_size = 1; + mutex_init(&gui_property->props87.lock); /* Type specific data: */ gui_property->props87.type = PROP_TYPE_BOOLEAN; @@ -1972,7 +2166,9 @@ gui_property->props88.desc = _("Whether count of received queries should be displayed."); gui_property->props88.ev_changed = event_new("show_gnet_info_rx_queries_changed"); gui_property->props88.save = TRUE; + gui_property->props88.internal = FALSE; gui_property->props88.vector_size = 1; + mutex_init(&gui_property->props88.lock); /* Type specific data: */ gui_property->props88.type = PROP_TYPE_BOOLEAN; @@ -1989,7 +2185,9 @@ gui_property->props89.desc = _("Whether count of transmitted query hits should be displayed."); gui_property->props89.ev_changed = event_new("show_gnet_info_tx_hits_changed"); gui_property->props89.save = TRUE; + gui_property->props89.internal = FALSE; gui_property->props89.vector_size = 1; + mutex_init(&gui_property->props89.lock); /* Type specific data: */ gui_property->props89.type = PROP_TYPE_BOOLEAN; @@ -2006,7 +2204,9 @@ gui_property->props90.desc = _("Whether count of received query hits should be displayed."); gui_property->props90.ev_changed = event_new("show_gnet_info_rx_hits_changed"); gui_property->props90.save = TRUE; + gui_property->props90.internal = FALSE; gui_property->props90.vector_size = 1; + mutex_init(&gui_property->props90.lock); /* Type specific data: */ gui_property->props90.type = PROP_TYPE_BOOLEAN; @@ -2023,7 +2223,9 @@ gui_property->props91.desc = _("Whether count of locally generated queries should be displayed."); gui_property->props91.ev_changed = event_new("show_gnet_info_gen_queries_changed"); gui_property->props91.save = TRUE; + gui_property->props91.internal = FALSE; gui_property->props91.vector_size = 1; + mutex_init(&gui_property->props91.lock); /* Type specific data: */ gui_property->props91.type = PROP_TYPE_BOOLEAN; @@ -2040,7 +2242,9 @@ gui_property->props92.desc = _("Whether count of local queries pending transmission should be displayed."); gui_property->props92.ev_changed = event_new("show_gnet_info_sq_queries_changed"); gui_property->props92.save = TRUE; + gui_property->props92.internal = FALSE; gui_property->props92.vector_size = 1; + mutex_init(&gui_property->props92.lock); /* Type specific data: */ gui_property->props92.type = PROP_TYPE_BOOLEAN; @@ -2057,7 +2261,9 @@ gui_property->props93.desc = _("Whether count of dropped messages on TX should be displayed."); gui_property->props93.ev_changed = event_new("show_gnet_info_tx_dropped_changed"); gui_property->props93.save = TRUE; + gui_property->props93.internal = FALSE; gui_property->props93.vector_size = 1; + mutex_init(&gui_property->props93.lock); /* Type specific data: */ gui_property->props93.type = PROP_TYPE_BOOLEAN; @@ -2074,7 +2280,9 @@ gui_property->props94.desc = _("Whether count of dropped messages on RX should be displayed."); gui_property->props94.ev_changed = event_new("show_gnet_info_rx_dropped_changed"); gui_property->props94.save = TRUE; + gui_property->props94.internal = FALSE; gui_property->props94.vector_size = 1; + mutex_init(&gui_property->props94.lock); /* Type specific data: */ gui_property->props94.type = PROP_TYPE_BOOLEAN; @@ -2091,7 +2299,9 @@ gui_property->props95.desc = _("Whether Query Routing Protocol statistics should be displayed. For a leaf node, this is simply the ratio of queries that generated a hit over the amount of received queries. For an ultrapeer, it displays the amount of slots in the QRP table, 'g' the generation number, 'f' the fill ratio, 't' the passing threshold and 'e' the efficiency, i.e. the proportion of received queries that are sent to the node after QRP table filtering."); gui_property->props95.ev_changed = event_new("show_gnet_info_qrp_stats_changed"); gui_property->props95.save = TRUE; + gui_property->props95.internal = FALSE; gui_property->props95.vector_size = 1; + mutex_init(&gui_property->props95.lock); /* Type specific data: */ gui_property->props95.type = PROP_TYPE_BOOLEAN; @@ -2108,7 +2318,9 @@ gui_property->props96.desc = _("Whether we should display message counts for duplicate, bad, weird and messages bearing an hostile IP address."); gui_property->props96.ev_changed = event_new("show_gnet_info_dbw_changed"); gui_property->props96.save = TRUE; + gui_property->props96.internal = FALSE; gui_property->props96.vector_size = 1; + mutex_init(&gui_property->props96.lock); /* Type specific data: */ gui_property->props96.type = PROP_TYPE_BOOLEAN; @@ -2125,7 +2337,9 @@ gui_property->props97.desc = _("Whether ping/pong roundtrip times (average and last) should be displayed. Values shown are in milliseconds."); gui_property->props97.ev_changed = event_new("show_gnet_info_rt_changed"); gui_property->props97.save = TRUE; + gui_property->props97.internal = FALSE; gui_property->props97.vector_size = 1; + mutex_init(&gui_property->props97.lock); /* Type specific data: */ gui_property->props97.type = PROP_TYPE_BOOLEAN; @@ -2142,7 +2356,9 @@ gui_property->props98.desc = _("Whether we should display the size of the node's library, when it is known to us."); gui_property->props98.ev_changed = event_new("show_gnet_info_shared_size_changed"); gui_property->props98.save = TRUE; + gui_property->props98.internal = FALSE; gui_property->props98.vector_size = 1; + mutex_init(&gui_property->props98.lock); /* Type specific data: */ gui_property->props98.type = PROP_TYPE_BOOLEAN; @@ -2159,7 +2375,9 @@ gui_property->props99.desc = _("Whether we should display the amount of files shared by nodes, when that is known to us."); gui_property->props99.ev_changed = event_new("show_gnet_info_shared_files_changed"); gui_property->props99.save = TRUE; + gui_property->props99.internal = FALSE; gui_property->props99.vector_size = 1; + mutex_init(&gui_property->props99.lock); /* Type specific data: */ gui_property->props99.type = PROP_TYPE_BOOLEAN; @@ -2176,7 +2394,9 @@ gui_property->props100.desc = _("The amount of time in seconds that the GUI should buffer search results as they come in. This prevents too frequent updates that may cause flickering, but also saves CPU cycles since less redrawing has to occur in the search pane."); gui_property->props100.ev_changed = event_new("search_accumulation_period_changed"); gui_property->props100.save = TRUE; + gui_property->props100.internal = FALSE; gui_property->props100.vector_size = 1; + mutex_init(&gui_property->props100.lock); /* Type specific data: */ gui_property->props100.type = PROP_TYPE_GUINT32; @@ -2196,7 +2416,9 @@ gui_property->props101.desc = _("Expanded stati of the nodes in the treemenu."); gui_property->props101.ev_changed = event_new("treemenu_nodes_expanded_changed"); gui_property->props101.save = TRUE; + gui_property->props101.internal = FALSE; gui_property->props101.vector_size = nb_main_page_num; + mutex_init(&gui_property->props101.lock); /* Type specific data: */ gui_property->props101.type = PROP_TYPE_GUINT32; @@ -2216,7 +2438,9 @@ gui_property->props102.desc = _("Widths of the columns in the Gnet packet stats table (pkg). GTK2"); gui_property->props102.ev_changed = event_new("gnet_stats_pkg_col_widths_changed"); gui_property->props102.save = TRUE; + gui_property->props102.internal = FALSE; gui_property->props102.vector_size = 6; + mutex_init(&gui_property->props102.lock); /* Type specific data: */ gui_property->props102.type = PROP_TYPE_GUINT32; @@ -2236,7 +2460,9 @@ gui_property->props103.desc = _("Widths of the columns in the Gnet packet stats table (byte). GTK2"); gui_property->props103.ev_changed = event_new("gnet_stats_byte_col_widths_changed"); gui_property->props103.save = TRUE; + gui_property->props103.internal = FALSE; gui_property->props103.vector_size = 6; + mutex_init(&gui_property->props103.lock); /* Type specific data: */ gui_property->props103.type = PROP_TYPE_GUINT32; @@ -2256,7 +2482,9 @@ gui_property->props104.desc = _("Configures the appearance of the toolbar."); gui_property->props104.ev_changed = event_new("config_toolbar_style_changed"); gui_property->props104.save = TRUE; + gui_property->props104.internal = FALSE; gui_property->props104.vector_size = 1; + mutex_init(&gui_property->props104.lock); /* Type specific data: */ gui_property->props104.type = PROP_TYPE_MULTICHOICE; @@ -2276,7 +2504,9 @@ gui_property->props105.desc = _("The lifetime of a search. If this time is exceeded, the search is stopped."); gui_property->props105.ev_changed = event_new("search_lifetime_changed"); gui_property->props105.save = FALSE; + gui_property->props105.internal = FALSE; gui_property->props105.vector_size = 1; + mutex_init(&gui_property->props105.lock); /* Type specific data: */ gui_property->props105.type = PROP_TYPE_MULTICHOICE; @@ -2296,7 +2526,9 @@ gui_property->props106.desc = _("Show a status icon in the system tray if possible (requires Gtk+ 2.10 or newer)."); gui_property->props106.ev_changed = event_new("status_icon_enabled_changed"); gui_property->props106.save = TRUE; + gui_property->props106.internal = FALSE; gui_property->props106.vector_size = 1; + mutex_init(&gui_property->props106.lock); /* Type specific data: */ gui_property->props106.type = PROP_TYPE_BOOLEAN; @@ -2313,7 +2545,9 @@ gui_property->props107.desc = _("Automatically hide DHT bandwidth display when DHT not enabled."); gui_property->props107.ev_changed = event_new("autohide_bws_dht_changed"); gui_property->props107.save = TRUE; + gui_property->props107.internal = FALSE; gui_property->props107.vector_size = 1; + mutex_init(&gui_property->props107.lock); /* Type specific data: */ gui_property->props107.type = PROP_TYPE_BOOLEAN; @@ -2330,7 +2564,9 @@ gui_property->props108.desc = _("Display incoming DHT traffic bandwidth usage."); gui_property->props108.ev_changed = event_new("progressbar_bws_dht_in_visible_changed"); gui_property->props108.save = TRUE; + gui_property->props108.internal = FALSE; gui_property->props108.vector_size = 1; + mutex_init(&gui_property->props108.lock); /* Type specific data: */ gui_property->props108.type = PROP_TYPE_BOOLEAN; @@ -2347,7 +2583,9 @@ gui_property->props109.desc = _("Display outgoing DHT traffic bandwidth usage."); gui_property->props109.ev_changed = event_new("progressbar_bws_dht_out_visible_changed"); gui_property->props109.save = TRUE; + gui_property->props109.internal = FALSE; gui_property->props109.vector_size = 1; + mutex_init(&gui_property->props109.lock); /* Type specific data: */ gui_property->props109.type = PROP_TYPE_BOOLEAN; @@ -2364,7 +2602,9 @@ gui_property->props110.desc = _("Display incoming DHT traffic bandwidth as an average."); gui_property->props110.ev_changed = event_new("progressbar_bws_dht_in_avg_changed"); gui_property->props110.save = TRUE; + gui_property->props110.internal = FALSE; gui_property->props110.vector_size = 1; + mutex_init(&gui_property->props110.lock); /* Type specific data: */ gui_property->props110.type = PROP_TYPE_BOOLEAN; @@ -2381,7 +2621,9 @@ gui_property->props111.desc = _("Display outgoing DHT traffic bandwidth as an average."); gui_property->props111.ev_changed = event_new("progressbar_bws_dht_out_avg_changed"); gui_property->props111.save = TRUE; + gui_property->props111.internal = FALSE; gui_property->props111.vector_size = 1; + mutex_init(&gui_property->props111.lock); /* Type specific data: */ gui_property->props111.type = PROP_TYPE_BOOLEAN; @@ -2397,8 +2639,10 @@ gui_property->props112.name = "search_media_type_audio"; gui_property->props112.desc = _("Remote nodes supporting media type filtering will apply your query specifically on their audio files."); gui_property->props112.ev_changed = event_new("search_media_type_audio_changed"); - gui_property->props112.save = FALSE; + gui_property->props112.save = TRUE; + gui_property->props112.internal = FALSE; gui_property->props112.vector_size = 1; + mutex_init(&gui_property->props112.lock); /* Type specific data: */ gui_property->props112.type = PROP_TYPE_BOOLEAN; @@ -2414,8 +2658,10 @@ gui_property->props113.name = "search_media_type_video"; gui_property->props113.desc = _("Remote nodes supporting media type filtering will apply your query specifically on their video files."); gui_property->props113.ev_changed = event_new("search_media_type_video_changed"); - gui_property->props113.save = FALSE; + gui_property->props113.save = TRUE; + gui_property->props113.internal = FALSE; gui_property->props113.vector_size = 1; + mutex_init(&gui_property->props113.lock); /* Type specific data: */ gui_property->props113.type = PROP_TYPE_BOOLEAN; @@ -2431,8 +2677,10 @@ gui_property->props114.name = "search_media_type_document"; gui_property->props114.desc = _("Remote nodes supporting media type filtering will apply your query specifically on their document files. Document files are XML, HTML, Word, PDF, etc..."); gui_property->props114.ev_changed = event_new("search_media_type_document_changed"); - gui_property->props114.save = FALSE; + gui_property->props114.save = TRUE; + gui_property->props114.internal = FALSE; gui_property->props114.vector_size = 1; + mutex_init(&gui_property->props114.lock); /* Type specific data: */ gui_property->props114.type = PROP_TYPE_BOOLEAN; @@ -2448,8 +2696,10 @@ gui_property->props115.name = "search_media_type_image"; gui_property->props115.desc = _("Remote nodes supporting media type filtering will apply your query specifically on their image files."); gui_property->props115.ev_changed = event_new("search_media_type_image_changed"); - gui_property->props115.save = FALSE; + gui_property->props115.save = TRUE; + gui_property->props115.internal = FALSE; gui_property->props115.vector_size = 1; + mutex_init(&gui_property->props115.lock); /* Type specific data: */ gui_property->props115.type = PROP_TYPE_BOOLEAN; @@ -2465,8 +2715,10 @@ gui_property->props116.name = "search_media_type_archive"; gui_property->props116.desc = _("Remote nodes supporting media type filtering will apply your query specifically on archive / program files such as ZIP, 7z, tar, bz2, gz, dep, rpm and also exe files."); gui_property->props116.ev_changed = event_new("search_media_type_archive_changed"); - gui_property->props116.save = FALSE; + gui_property->props116.save = TRUE; + gui_property->props116.internal = FALSE; gui_property->props116.vector_size = 1; + mutex_init(&gui_property->props116.lock); /* Type specific data: */ gui_property->props116.type = PROP_TYPE_BOOLEAN; @@ -2480,10 +2732,12 @@ * General data: */ gui_property->props117.name = "search_discard_alien_ip"; - gui_property->props117.desc = _("Discard search results whith an alien IP address, not matching the one from which the results come from."); + gui_property->props117.desc = _("Discard search results with an alien IP address, not matching the one from which the results come from."); gui_property->props117.ev_changed = event_new("search_discard_alien_ip_changed"); gui_property->props117.save = TRUE; + gui_property->props117.internal = FALSE; gui_property->props117.vector_size = 1; + mutex_init(&gui_property->props117.lock); /* Type specific data: */ gui_property->props117.type = PROP_TYPE_BOOLEAN; @@ -2500,7 +2754,9 @@ gui_property->props118.desc = _("Whether session-only searches which happen to have pending downloads should be restarted when gtk-gnutella is launched."); gui_property->props118.ev_changed = event_new("search_restart_when_pending_changed"); gui_property->props118.save = TRUE; + gui_property->props118.internal = FALSE; gui_property->props118.vector_size = 1; + mutex_init(&gui_property->props118.lock); /* Type specific data: */ gui_property->props118.type = PROP_TYPE_BOOLEAN; @@ -2517,17 +2773,57 @@ gui_property->props119.desc = _("Discard search results coming from servents with a banned GUID."); gui_property->props119.ev_changed = event_new("search_discard_banned_guid_changed"); gui_property->props119.save = TRUE; + gui_property->props119.internal = FALSE; gui_property->props119.vector_size = 1; + mutex_init(&gui_property->props119.lock); /* Type specific data: */ gui_property->props119.type = PROP_TYPE_BOOLEAN; gui_property->props119.data.boolean.def = (void *) &gui_property_variable_search_discard_banned_guid_default; gui_property->props119.data.boolean.value = (void *) &gui_property_variable_search_discard_banned_guid; - gui_property->byName = g_hash_table_new(g_str_hash, g_str_equal); + + /* + * PROP_SEARCH_DISPLAY_GUESS_STATS: + * + * General data: + */ + gui_property->props120.name = "search_display_guess_stats"; + gui_property->props120.desc = _("Whether a summary line with GUESS search stats should be displayed."); + gui_property->props120.ev_changed = event_new("search_display_guess_stats_changed"); + gui_property->props120.save = TRUE; + gui_property->props120.internal = FALSE; + gui_property->props120.vector_size = 1; + mutex_init(&gui_property->props120.lock); + + /* Type specific data: */ + gui_property->props120.type = PROP_TYPE_BOOLEAN; + gui_property->props120.data.boolean.def = (void *) &gui_property_variable_search_display_guess_stats_default; + gui_property->props120.data.boolean.value = (void *) &gui_property_variable_search_display_guess_stats; + + + /* + * PROP_GUESS_STATS_SHOW_TOTAL: + * + * General data: + */ + gui_property->props121.name = "guess_stats_show_total"; + gui_property->props121.desc = _("Whether the GUESS summary line should show total statistics or ones pertaining to the current search only."); + gui_property->props121.ev_changed = event_new("guess_stats_show_total_changed"); + gui_property->props121.save = TRUE; + gui_property->props121.internal = FALSE; + gui_property->props121.vector_size = 1; + mutex_init(&gui_property->props121.lock); + + /* Type specific data: */ + gui_property->props121.type = PROP_TYPE_BOOLEAN; + gui_property->props121.data.boolean.def = (void *) &gui_property_variable_guess_stats_show_total_default; + gui_property->props121.data.boolean.value = (void *) &gui_property_variable_guess_stats_show_total; + + gui_property->by_name = htable_create(HASH_KEY_STRING, 0); for (n = 0; n < GUI_PROPERTY_NUM; n ++) { - g_hash_table_insert(gui_property->byName, - gui_property->propsn.name, GINT_TO_POINTER(n+1000)); + htable_insert(gui_property->by_name, + gui_property->propsn.name, int_to_pointer(n+1000)); } return gui_property; @@ -2536,14 +2832,11 @@ /** * Free memory allocated by the property set. */ -G_GNUC_COLD void +void G_COLD gui_prop_shutdown(void) { guint32 n; - if (gui_property->byName) { - g_hash_table_destroy(gui_property->byName); - gui_property->byName = NULL; - } + htable_free_null(&gui_property->by_name); for (n = 0; n < GUI_PROPERTY_NUM; n ++) { if (gui_property->propsn.type == PROP_TYPE_STRING) { @@ -2572,6 +2865,24 @@ } /** + * Lock property. + */ +void +gui_prop_lock(property_t p) +{ + prop_lock(gui_property, p); +} + +/** + * Unlock property. + */ +void +gui_prop_unlock(property_t p) +{ + prop_unlock(gui_property, p); +} + +/** * Add a change listener to a given property. If init is TRUE then * the listener is immediately called. */ @@ -2715,6 +3026,12 @@ return prop_name(gui_property, p); } +prop_type_t +gui_prop_type(property_t p) +{ + return prop_type(gui_property, p); +} + const char * gui_prop_type_to_string(property_t p) { @@ -2733,14 +3050,19 @@ return prop_is_saved(gui_property, p); } +gboolean +gui_prop_is_internal(property_t p) +{ + return prop_is_internal(gui_property, p); +} + property_t gui_prop_get_by_name(const char *name) { - return GPOINTER_TO_UINT( - g_hash_table_lookup(gui_property->byName, name)); + return pointer_to_uint(htable_lookup(gui_property->by_name, name)); } -GSList * +pslist_t * gui_prop_get_by_regex(const char *pattern, int *error) { return prop_get_by_regex(gui_property, pattern, error); @@ -2749,7 +3071,7 @@ void gui_prop_set_from_string(property_t prop, const char *val) { - prop_set_from_string(gui_property, prop, val, FALSE); + prop_set_from_string(gui_property, prop, val, FALSE); } /**
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/gui_property.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/gui_property.h
Changed
@@ -28,8 +28,8 @@ #ifndef _gui_property_h_ #define _gui_property_h_ - #include "lib/prop.h" +#include "lib/log.h" /* For s_carp() */ #define GUI_PROPERTY_MIN (1000) #define GUI_PROPERTY_MAX (1000+GUI_PROPERTY_END-1) @@ -156,6 +156,8 @@ PROP_SEARCH_DISCARD_ALIEN_IP, PROP_SEARCH_RESTART_WHEN_PENDING, PROP_SEARCH_DISCARD_BANNED_GUID, + PROP_SEARCH_DISPLAY_GUESS_STATS, + PROP_GUESS_STATS_SHOW_TOTAL, GUI_PROPERTY_END } gui_property_t; @@ -169,15 +171,20 @@ */ prop_def_t *gui_prop_get_def(property_t); property_t gui_prop_get_by_name(const char *); -GSList *gui_prop_get_by_regex(const char *, int *); +pslist_t *gui_prop_get_by_regex(const char *, int *); const char *gui_prop_name(property_t); const char *gui_prop_type_to_string(property_t); const char *gui_prop_to_string(property_t prop); const char *gui_prop_default_to_string(property_t); const char *gui_prop_description(property_t); gboolean gui_prop_is_saved(property_t); +gboolean gui_prop_is_internal(property_t); +prop_type_t gui_prop_type(property_t); void gui_prop_set_from_string(property_t, const char *); +void gui_prop_lock(property_t); +void gui_prop_unlock(property_t); + /* * Property-change listeners */ @@ -233,18 +240,32 @@ gui_prop_incr_guint32(property_t p) { guint32 value; + gui_prop_lock(p); gui_prop_get_guint32_val(p, &value); - value++; - gui_prop_set_guint32_val(p, value); + if G_UNLIKELY((guint32) -1 == value) { + s_carp("%s(): incrementing property \"%s\" would overflow", + G_STRFUNC, gui_prop_name(p)); + } else { + value++; + gui_prop_set_guint32_val(p, value); + } + gui_prop_unlock(p); } static inline void gui_prop_decr_guint32(property_t p) { guint32 value; + gui_prop_lock(p); gui_prop_get_guint32_val(p, &value); - value--; - gui_prop_set_guint32_val(p, value); + if G_UNLIKELY(0 == value) { + s_carp("%s(): decrementing property \"%s\" would underflow", + G_STRFUNC, gui_prop_name(p)); + } else { + value--; + gui_prop_set_guint32_val(p, value); + } + gui_prop_unlock(p); } void gui_prop_set_guint64(
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/gui_property_priv.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/gui_property_priv.h
Changed
@@ -166,6 +166,8 @@ extern const gboolean gui_property_variable_search_discard_alien_ip; extern const gboolean gui_property_variable_search_restart_when_pending; extern const gboolean gui_property_variable_search_discard_banned_guid; +extern const gboolean gui_property_variable_search_display_guess_stats; +extern const gboolean gui_property_variable_guess_stats_show_total; prop_set_t *gui_prop_init(void);
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/gui_props.ag -> gtk-gnutella-1.1.9.tar.bz2/src/if/gui_props.ag
Changed
@@ -538,7 +538,7 @@ desc = "Display incoming HTTP traffic bandwidth average."; type = boolean; data = { - default = TRUE; + default = FALSE; }; }; @@ -547,7 +547,7 @@ desc = "Display outgoing HTTP traffic bandwidth average."; type = boolean; data = { - default = TRUE; + default = FALSE; }; }; @@ -556,7 +556,7 @@ desc = "Display incoming Gnet traffic bandwidth average."; type = boolean; data = { - default = TRUE; + default = FALSE; }; }; @@ -565,7 +565,7 @@ desc = "Display outgoing Gnet traffic bandwidth average."; type = boolean; data = { - default = TRUE; + default = FALSE; }; }; @@ -574,7 +574,7 @@ desc = "Display incoming Gnet leaf traffic bandwidth average."; type = boolean; data = { - default = TRUE; + default = FALSE; }; }; @@ -583,7 +583,7 @@ desc = "Display outgoing Gnet leaf traffic bandwidth average."; type = boolean; data = { - default = TRUE; + default = FALSE; }; }; @@ -1288,7 +1288,7 @@ desc = "Display incoming DHT traffic bandwidth as an average."; type = boolean; data = { - default = TRUE; + default = FALSE; }; }; @@ -1297,7 +1297,7 @@ desc = "Display outgoing DHT traffic bandwidth as an average."; type = boolean; data = { - default = TRUE; + default = FALSE; }; }; @@ -1305,7 +1305,6 @@ name = "search_media_type_audio"; desc = "Remote nodes supporting media type filtering will apply your " "query specifically on their audio files."; - save = FALSE; type = boolean; data = { default = FALSE; @@ -1316,7 +1315,6 @@ name = "search_media_type_video"; desc = "Remote nodes supporting media type filtering will apply your " "query specifically on their video files."; - save = FALSE; type = boolean; data = { default = FALSE; @@ -1328,7 +1326,6 @@ desc = "Remote nodes supporting media type filtering will apply your " "query specifically on their document files. " "Document files are XML, HTML, Word, PDF, etc..."; - save = FALSE; type = boolean; data = { default = FALSE; @@ -1339,7 +1336,6 @@ name = "search_media_type_image"; desc = "Remote nodes supporting media type filtering will apply your " "query specifically on their image files."; - save = FALSE; type = boolean; data = { default = FALSE; @@ -1351,7 +1347,6 @@ desc = "Remote nodes supporting media type filtering will apply your " "query specifically on archive / program files such as " "ZIP, 7z, tar, bz2, gz, dep, rpm and also exe files."; - save = FALSE; type = boolean; data = { default = FALSE; @@ -1360,7 +1355,7 @@ prop = { name = "search_discard_alien_ip"; - desc = "Discard search results whith an alien IP address, not matching " + desc = "Discard search results with an alien IP address, not matching " "the one from which the results come from."; type = boolean; data = { @@ -1387,6 +1382,26 @@ }; }; +prop = { + name = "search_display_guess_stats"; + desc = "Whether a summary line with GUESS search stats " + "should be displayed."; + type = boolean; + data = { + default = TRUE; + }; +}; + +prop = { + name = "guess_stats_show_total"; + desc = "Whether the GUESS summary line should show total statistics or " + "ones pertaining to the current search only."; + type = boolean; + data = { + default = TRUE; + }; +}; + #endif /* !USE_TOPLESS */ /* vi: set ts=4: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/props.tpl -> gtk-gnutella-1.1.9.tar.bz2/src/if/props.tpl
Changed
@@ -1,6 +1,9 @@ = AutoGen5 Template == # -# $Id$ +# Autogen template file to generate the property files. +# +# Copyright (c) 2001-2003, Richard Eckart +# Copyright (c) 2013, Raphael Manfredi # == (define license (sprintf @@ -51,12 +54,9 @@ ((= type "timestamp") #t) ((= type "multichoice") #t) (else #f))) +(define func-prefix + (if (exist? "func_prefix") (get "func_prefix") (. prop-set))) == -IF (exist? "func_prefix")== - (define func-prefix (get "func_prefix"))== -ELSE== - (define func-prefix (. prop-set))== -ENDIF== IF (not (exist? "property_set"))== (error "property set has no name")== ENDIF== @@ -76,8 +76,8 @@ #ifndef _=(. set-name-down)=_h_ #define _=(. set-name-down)=_h_ - #include "lib/prop.h" +#include "lib/log.h" /* For s_carp() */ #define =(. prop-min)= (=offset=) #define =(. prop-max)= (=offset=+=(. prop-end)=-1) @@ -101,15 +101,20 @@ */ prop_def_t *=(. func-prefix)=_get_def(property_t); property_t =(. func-prefix)=_get_by_name(const char *); -GSList *=(. func-prefix)=_get_by_regex(const char *, int *); +pslist_t *=(. func-prefix)=_get_by_regex(const char *, int *); const char *=(. func-prefix)=_name(property_t); const char *=(. func-prefix)=_type_to_string(property_t); const char *=(. func-prefix)=_to_string(property_t prop); const char *=(. func-prefix)=_default_to_string(property_t); const char *=(. func-prefix)=_description(property_t); gboolean =(. func-prefix)=_is_saved(property_t); +gboolean =(. func-prefix)=_is_internal(property_t); +prop_type_t =(. func-prefix)=_type(property_t); void =(. func-prefix)=_set_from_string(property_t, const char *); +void =(. func-prefix)=_lock(property_t); +void =(. func-prefix)=_unlock(property_t); + /* * Property-change listeners */ @@ -165,18 +170,32 @@ =(. func-prefix)=_incr_guint32(property_t p) { guint32 value; + =(. func-prefix)=_lock(p); =(. func-prefix)=_get_guint32_val(p, &value); - value++; - =(. func-prefix)=_set_guint32_val(p, value); + if G_UNLIKELY((guint32) -1 == value) { + s_carp("%s(): incrementing property \"%s\" would overflow", + G_STRFUNC, =(. func-prefix)=_name(p)); + } else { + value++; + =(. func-prefix)=_set_guint32_val(p, value); + } + =(. func-prefix)=_unlock(p); } static inline void =(. func-prefix)=_decr_guint32(property_t p) { guint32 value; + =(. func-prefix)=_lock(p); =(. func-prefix)=_get_guint32_val(p, &value); - value--; - =(. func-prefix)=_set_guint32_val(p, value); + if G_UNLIKELY(0 == value) { + s_carp("%s(): decrementing property \"%s\" would underflow", + G_STRFUNC, =(. func-prefix)=_name(p)); + } else { + value--; + =(. func-prefix)=_set_guint32_val(p, value); + } + =(. func-prefix)=_unlock(p); } void =(. func-prefix)=_set_guint64( @@ -260,13 +279,11 @@ = ENDFOR uses = = FOR prop == -IF (exist? "data.value") == -(define item (sprintf "%s_variable_%s" - (. set-name-down) (get "data.value"))) == -ELSE == (define item (sprintf "%s_variable_%s" - (. set-name-down) (string-downcase (get "name")))) == -ENDIF== + (. set-name-down) + (if (exist? "data.value") + (get "data.value") (string-downcase (get "name"))))) +== CASE type== = boolean=extern const gboolean =(. item)== = guint32=extern const guint32 =(. item)== @@ -299,7 +316,10 @@ #include "lib/prop.h" #include "lib/eval.h" +#include "lib/mutex.h" #include "lib/omalloc.h" +#include "lib/pslist.h" + #include "=(sprintf "%s.h" (. set-name-down))=" /* @@ -309,13 +329,22 @@ = ENDFOR uses = #include "lib/override.h" /* Must be the last header included */ +/* + * Some of the generated const variables can be unused, avoid warnings. + * + * The -Wunused-const-variable warning may not be available with a particular + * compiler, so the -Wpragmas that is issued before prevents a warning to be + * emitted in that case... + */ +G_IGNORE(-Wunknown-pragmas); /* clang does not know -Wpragmas */ +G_IGNORE(-Wpragmas); /* For gcc, not clang */ +G_IGNORE(-Wunused-const-variable); /* Appears in clang version 3.4.1 */ = FOR prop == - (if (exist? "data.value") - (define item (sprintf "%s_variable_%s" - (. set-name-down) (get "data.value"))) - (define item (sprintf "%s_variable_%s" - (. set-name-down) (string-downcase (get "name")))))== + (define item (sprintf "%s_variable_%s" + (. set-name-down) + (if (exist? "data.value") + (get "data.value") (string-downcase (get "name")))))== IF (= (get "type") "storage")= char =(. item)==vector_size=; static const char =(. item)=_default=vector_size=; @@ -323,29 +352,30 @@ ELIF (= (get "type") "ip")= host_addr_t =(. item)=;= ELSE== - (cond - ((= (get "type") "boolean") - (define vtype "gboolean ") - (define vdef (get "data.default"))) - ((= (get "type") "guint32") - (define vtype "guint32 ") - (define vdef (get "data.default"))) - ((= (get "type") "guint64") - (define vtype "guint64 ") - (define vdef (get "data.default"))) - ((= (get "type") "multichoice") - (define vtype "guint32 ") - (define vdef (get "data.default"))) - ((= (get "type") "timestamp") - (define vtype "time_t ") - (define vdef (get "data.default"))) - ((= (get "type") "ip") - (define vtype "host_addr_t ")) + (define vtype (cond + ((= (get "type") "boolean") "gboolean ") + ((= (get "type") "guint32") "guint32 ") + ((= (get "type") "guint64") "guint64 ") + ((= (get "type") "multichoice") "guint32 ") + ((= (get "type") "timestamp") "time_t ") + ((= (get "type") "ip") "host_addr_t ") + ((= (get "type") "string") "char *") + ) + ) + + (define vdef (cond + ((= (get "type") "boolean") (get "data.default")) + ((= (get "type") "guint32") (get "data.default")) + ((= (get "type") "guint64") (get "data.default")) + ((= (get "type") "multichoice") (get "data.default")) + ((= (get "type") "timestamp") (get "data.default")) ((= (get "type") "string") - (define vtype "char *") - (if (= (get "data.default") "NULL") - (define vdef (sprintf "NULL")) - (define vdef (sprintf "\"%s\"" (get "data.default")))))) + (if (= (get "data.default") "NULL") + (sprintf "NULL") + (sprintf "\"%s\"" (get "data.default")) + )) + ) + ) == IF (exist? "vector_size")= = (. vtype)==(. item)==vector_size= = =(. vdef)=; @@ -355,7 +385,7 @@ static const = (. vtype)==(. item)=_default = =(. vdef)=;= ENDIF== IF (= (get "type") "multichoice")= -prop_def_choice_t =(. item)=_choices = { = +prop_def_choice_t =(. item)=_choices = {= FOR choice = {N_("=name="), =value=},= ENDFOR choice = @@ -367,7 +397,7 @@ static prop_set_t *=(. prop-set)=; -G_GNUC_COLD prop_set_t * +prop_set_t * G_COLD =(. func-prefix)=_init(void) { guint32 n; @@ -377,10 +407,11 @@ =(. prop-set)=->size = =(. prop-num)=; =(. prop-set)=->offset = =offset=; =(. prop-set)=->mtime = 0; - =(. prop-set)=->props = omalloc(sizeof(prop_def_t) * =(. prop-num)=); + OMALLOC_ARRAY(=(. prop-set)=->props, =(. prop-num)=); =(. prop-set)=->get_stub = =(. func-prefix)=_get_stub; =(. prop-set)=->dirty = FALSE; - =(. prop-set)=->byName = NULL;= + =(. prop-set)=->by_name = NULL; + spinlock_init(&=(. prop-set)=->lock);= FOR prop == (define current-prop (sprintf "%s%u" @@ -395,9 +426,12 @@ (if (not (exist? "desc")) (error "no description given")) - (if (exist? "data.value") - (define prop-var-name (get "data.value")) - (define prop-var-name (string-downcase (get "name")))) + (define prop-var-name + (if (exist? "data.value") + (get "data.value") + (string-downcase (get "name")) + ) + ) (if (and (not (exist? "data.default")) (not (or (= (get "type") "storage") (= (get "type") "ip")))) @@ -425,6 +459,11 @@ ELSE = = (. current-prop) =.save = TRUE;= ENDIF == + IF (exist? "internal") = + = (. current-prop) =.internal = =internal=;= + ELSE = + = (. current-prop) =.internal = FALSE;= + ENDIF == IF (exist? "vector_size") = = (. current-prop) =.vector_size = =vector_size=;= (define prop-var (sprintf "%s_variable_%s" @@ -436,6 +475,7 @@ (. prop-set) (. prop-var-name))) (define prop-def-var (sprintf "%s_default" (. prop-var))) == ENDIF = + mutex_init(&= (. current-prop) =.lock); /* Type specific data: */= CASE type == @@ -524,10 +564,10 @@ ESAC == ENDFOR prop= - =(. prop-set)=->byName = g_hash_table_new(g_str_hash, g_str_equal); + =(. prop-set)=->by_name = htable_create(HASH_KEY_STRING, 0); for (n = 0; n < =(. prop-num)=; n ++) { - g_hash_table_insert(=(. prop-set)=->byName, - =(. prop-array)=n.name, GINT_TO_POINTER(n+=offset=)); + htable_insert(=(. prop-set)=->by_name, + =(. prop-array)=n.name, int_to_pointer(n+=offset=)); } return =(. prop-set)=; @@ -536,14 +576,11 @@ /** * Free memory allocated by the property set. */ -G_GNUC_COLD void +void G_COLD =(. func-prefix)=_shutdown(void) { guint32 n; - if (=(. prop-set)=->byName) { - g_hash_table_destroy(=(. prop-set)=->byName); - =(. prop-set)=->byName = NULL; - } + htable_free_null(&=(. prop-set)=->by_name); for (n = 0; n < =(. prop-num)=; n ++) { if (=(. prop-set)=->propsn.type == PROP_TYPE_STRING) { @@ -572,6 +609,24 @@ } /** + * Lock property. + */ +void +=(. func-prefix)=_lock(property_t p) +{ + prop_lock(=(. prop-set)=, p); +} + +/** + * Unlock property. + */ +void +=(. func-prefix)=_unlock(property_t p) +{ + prop_unlock(=(. prop-set)=, p); +} + +/** * Add a change listener to a given property. If init is TRUE then * the listener is immediately called. */ @@ -715,6 +770,12 @@ return prop_name(=(. prop-set)=, p); } +prop_type_t +=(. func-prefix)=_type(property_t p) +{ + return prop_type(=(. prop-set)=, p); +} + const char * =(. func-prefix)=_type_to_string(property_t p) { @@ -733,14 +794,19 @@ return prop_is_saved(=(. prop-set)=, p); } +gboolean +=(. func-prefix)=_is_internal(property_t p) +{ + return prop_is_internal(=(. prop-set)=, p); +} + property_t =(. func-prefix)=_get_by_name(const char *name) { - return GPOINTER_TO_UINT( - g_hash_table_lookup(=(. prop-set)=->byName, name)); + return pointer_to_uint(htable_lookup(=(. prop-set)=->by_name, name)); } -GSList * +pslist_t * =(. func-prefix)=_get_by_regex(const char *pattern, int *error) { return prop_get_by_regex(=(. prop-set)=, pattern, error); @@ -749,7 +815,7 @@ void =(. func-prefix)=_set_from_string(property_t prop, const char *val) { - prop_set_from_string(=(. prop-set)=, prop, val, FALSE); + prop_set_from_string(=(. prop-set)=, prop, val, FALSE); } /**
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/ui/gtk/search.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/ui/gtk/search.h
Changed
@@ -34,7 +34,7 @@ struct search; -gboolean search_gui_new_search(const gchar *, guint32 flags, +gboolean search_gui_new_search(const gchar *, guint32 flags, struct search **search); void search_gui_store_searches(void); #endif /* GUI_SOURCES */
View file
gtk-gnutella-0.98.2.tar.bz2/src/if/ui/gtk/statusbar.h -> gtk-gnutella-1.1.9.tar.bz2/src/if/ui/gtk/statusbar.h
Changed
@@ -43,10 +43,10 @@ #ifdef GUI_SOURCES statusbar_msgid_t statusbar_gui_message(guint timeout, - const gchar *fmt, ...) G_GNUC_PRINTF(2, 3); + const gchar *fmt, ...) G_PRINTF(2, 3); statusbar_msgid_t statusbar_gui_warning(guint timeout, - const gchar *fmt, ...) G_GNUC_PRINTF(2, 3); + const gchar *fmt, ...) G_PRINTF(2, 3); #endif /* GUI_SOURCES */ #endif /* _if_ui_gtk_statusbar_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/Jmakefile -> gtk-gnutella-1.1.9.tar.bz2/src/lib/Jmakefile
Changed
@@ -31,141 +31,229 @@ * Generation of bit_array.h and bit_field.h from a generic template. */ -GENERIC = bit_array.h bit_field.h +#define BitGenericCat(type) @!\ +bit_/**/type.h: bit_/**/type.ht bit_generic.t @@\ + $(TOP)/scripts/generic-cat bit_/**/type.ht bit_generic.t type >$@ @!\ + @!\ +all:: bit_/**/type.h @!\ +depend:: bit_/**/type.h @!\ +local_realclean:: @@\ + $(RM) bit_/**/type.h -bit_array.h: bit_array.ht bit_generic.t - $(TOP)/scripts/generic-cat bit_array.ht bit_generic.t array >$@ +BitGenericCat(array) +BitGenericCat(field) -bit_field.h: bit_field.ht bit_generic.t - $(TOP)/scripts/generic-cat bit_field.ht bit_generic.t field >$@ +#define HashGenericCat(type,sig,TYPE) @!\ +h/**/type.h: hgeneric.ht @@\ + $(TOP)/scripts/generic-pp /dev/null hgeneric.ht type sig TYPE >$@ @!\ + @!\ +h/**/type.c: hgeneric.ht @@\ + $(TOP)/scripts/generic-pp /dev/null hgeneric.ct type sig TYPE >$@ @!\ + @!\ +all:: h/**/type.h h/**/type.c @!\ +depend:: h/**/type.h h/**/type.c @!\ +local_realclean:: @@\ + $(RM) h/**/type.h h/**/type.c -all:: $(GENERIC) - -local_realclean:: - $(RM) $(GENERIC) - -depend:: $(GENERIC) +HashGenericCat(table,ckeyval,TABLE) +HashGenericCat(set,cdata,SET) LSRC = \ adns.c \ aging.c \ + aje.c \ + alloca.c \ + aq.c \ arc4random.c \ + argv.c \ ascii.c \ + atio.c \ atoms.c \ + barrier.c \ base16.c \ base32.c \ base64.c \ + bfd_util.c \ bg.c \ + bigint.c \ bstr.c \ + buf.c \ + chi2.c \ ckalloc.c \ + cmwc.c \ cobs.c \ + compat_gettid.c \ compat_misc.c \ + compat_pause.c \ compat_pio.c \ compat_poll.c \ + compat_sendfile.c \ + compat_setjmp.c \ compat_sleep_ms.c \ + compat_statvfs.c \ compat_un.c \ + compat_usleep.c \ concat.c \ + cond.c \ + constants.c \ cpufreq.c \ cq.c \ crash.c \ crc.c \ + dam.c \ dbmap.c \ dbmw.c \ dbstore.c \ dbus_util.c \ debug.c \ + dl_util.c \ dualhash.c \ + elist.c \ entropy.c \ + erbtree.c \ + eslist.c \ + etree.c \ eval.c \ event.c \ + evq.c \ exit.c \ + exit2str.c \ fast_assert.c \ fd.c \ - fifo.c \ file.c \ + file_object.c \ filehead.c \ + filelock.c \ filename.c \ float.c \ fragcheck.c \ + frand.c \ fs_free_space.c \ + ftw.c \ + gen-iprange.c \ + gentime.c \ + getcpucount.c \ getdate.c \ - getline.c \ getgateway.c \ + gethomedir.c \ + getline.c \ getphysmemsize.c \ glib-missing.c \ glog.c \ gnet_host.c \ halloc.c \ + hash.c \ + hashing.c \ hashlist.c \ hashtable.c \ header.c \ + hevset.c \ + hikset.c \ host_addr.c \ + hset.c \ + htable.c \ html.c \ + http_range.c \ idtable.c \ inputevt.c \ iprange.c \ + ipset.c \ iso3166.c \ - log.c \ + launch.c \ + leak.c \ list.c \ + listener.c \ + log.c \ magnet.c \ malloc.c \ map.c \ + mem.c \ + mempcpy.c \ memusage.c \ mime_type.c \ mingw32.c \ misc.c \ + mtwist.c \ mutex.c \ nid.c \ nv.c \ offtime.c \ ohash_table.c \ omalloc.c \ + once.c \ options.c \ ostream.c \ pagetable.c \ - parse.c \ palloc.c \ + parse.c \ path.c \ patricia.c \ pattern.c \ + plist.c \ pmsg.c \ pow2.c \ product.c \ + progname.c \ prop.c \ + pslist.c \ + rand31.c \ random.c \ + rbtree.c \ regex.c \ + ripening.c \ + rwlock.c \ sectoken.c \ + semaphore.c \ sequence.c \ + setproctitle.c \ sha1.c \ + shuffle.c \ signal.c \ slist.c \ + smsort.c \ sorted_array.c \ spinlock.c \ + spopen.c \ stacktrace.c \ stats.c \ str.c \ stringify.c \ strtok.c \ + strvec.c \ + symbols.c \ symtab.c \ tea.c \ + teq.c \ thread.c \ tiger.c \ tigertree.c \ timestamp.c \ tm.c \ + tmalloc.c \ + tokenizer.c \ + tqsort.c \ + tsig.c \ url.c \ - url_factory.c \ urn.c \ utf8.c \ vector.c \ vendors.c \ + vmea.c \ vmm.c \ + vsort.c \ + waiter.c \ walloc.c \ watcher.c \ wd.c \ + well.c \ + win32dlp.c \ wordvec.c \ wq.c \ xmalloc.c \ + xslist.c \ + xsort.c \ + xsort_data.c \ + xxtea.c \ zalloc.c \ zlib_util.c @@ -200,6 +288,8 @@ echo " $(MV) y.tab.c $@"; \ $(MV) y.tab.c $@; else touch $@; fi +getdate: getdate.c + $(CC) -o $@ $(JCFLAGS) -DTEST $< libshared.a $(LIBS) ;# ;# Floating point formatting tests @@ -213,6 +303,7 @@ LDFLAGS = LIBS = $(GLIB_LDFLAGS) $(COMMON_LIBS) +IF = ../if floats: floats.bz2 bzip2 -c -d floats.bz2 >$@ @@ -239,8 +330,28 @@ echo -n "free: " >>$@ sh -c "time ./float-test floats dragon > /dev/null" >>$@ 2>&1 +ftw-check: ftw-test + ./ftw-mktree + ./ftw-test -s ftw-root | diff -u - ftw-root.out >$@ + local_clean:: - $(RM) floats float-dragon.out bad-fixed float-times + $(RM) floats float-dragon.out bad-fixed float-times ftw-check + ./ftw-mktree -r + +#define NormalTestTarget(base) @!\ +NormalProgramLibTarget(base-test, base-test.c, base-test.o, libshared.a) + +NormalTestTarget(filelock) +NormalTestTarget(float) +NormalTestTarget(ftw) +NormalTestTarget(launch) +NormalTestTarget(random) +NormalTestTarget(sort) +NormalTestTarget(spopen) +NormalTestTarget(thread) + +#define LinkGenInterface(file) @!\ +LinkSourceFileAlias(file, $(IF)/gen, gen-file) -NormalProgramLibTarget(float-test, float-test.c, float-test.o, libshared.a) +LinkGenInterface(iprange.c)
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/src/lib/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-109 -: $X-Id: Jmake.tmpl 69 2011-01-09 13:57:07Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-200 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -40,11 +40,12 @@ CC = $cc CTAGS = ctags _EXE = $_exe -JCFLAGS = \$(CFLAGS) $optimize $ccflags $large +JCFLAGS = \$(CFLAGS) $optimize $pthread $ccflags $large JCPPFLAGS = $cppflags -JLDFLAGS = \$(LDFLAGS) $optimize $ldflags +JLDFLAGS = \$(LDFLAGS) $optimize $pthread $ldflags JYFLAGS = \$(YFLAGS) $yaccflags LIBS = $libs +LN = $ln MKDEP = $mkdep \$(DPFLAGS) \$(JCPPFLAGS) -- MV = $mv RANLIB = $ranlib @@ -57,8 +58,8 @@ USRINC = $usrinc GLIB_LDFLAGS = $glibldflags -SOURCES = \$(LSRC) float-test.c -OBJECTS = \$(LOBJ) float-test.o +SOURCES = \$(LSRC) filelock-test.c float-test.c ftw-test.c launch-test.c random-test.c sort-test.c spopen-test.c thread-test.c +OBJECTS = \$(LOBJ) filelock-test.o float-test.o ftw-test.o launch-test.o random-test.o sort-test.o spopen-test.o thread-test.o GLIB_CFLAGS = $glibcflags DBUS_CFLAGS = $dbuscflags COMMON_LIBS = $libs @@ -74,7 +75,7 @@ $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 106 2011-11-25 20:36:12Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Force 'make depend' to be performed first -- do not edit @@ -88,264 +89,439 @@ # $X-Id$ -GENERIC = bit_array.h bit_field.h - bit_array.h: bit_array.ht bit_generic.t $(TOP)/scripts/generic-cat bit_array.ht bit_generic.t array >$@ +all:: bit_array.h +depend:: bit_array.h +local_realclean:: + $(RM) bit_array.h + bit_field.h: bit_field.ht bit_generic.t $(TOP)/scripts/generic-cat bit_field.ht bit_generic.t field >$@ -all:: $(GENERIC) +all:: bit_field.h +depend:: bit_field.h +local_realclean:: + $(RM) bit_field.h + +htable.h: hgeneric.ht + $(TOP)/scripts/generic-pp /dev/null hgeneric.ht table ckeyval TABLE >$@ +htable.c: hgeneric.ht + $(TOP)/scripts/generic-pp /dev/null hgeneric.ct table ckeyval TABLE >$@ + +all:: htable.h htable.c +depend:: htable.h htable.c local_realclean:: - $(RM) $(GENERIC) + $(RM) htable.h htable.c + +hset.h: hgeneric.ht + $(TOP)/scripts/generic-pp /dev/null hgeneric.ht set cdata SET >$@ -depend:: $(GENERIC) +hset.c: hgeneric.ht + $(TOP)/scripts/generic-pp /dev/null hgeneric.ct set cdata SET >$@ + +all:: hset.h hset.c +depend:: hset.h hset.c +local_realclean:: + $(RM) hset.h hset.c LSRC = \ adns.c \ aging.c \ + aje.c \ + alloca.c \ + aq.c \ arc4random.c \ + argv.c \ ascii.c \ + atio.c \ atoms.c \ + barrier.c \ base16.c \ base32.c \ base64.c \ + bfd_util.c \ bg.c \ + bigint.c \ bstr.c \ + buf.c \ + chi2.c \ ckalloc.c \ + cmwc.c \ cobs.c \ + compat_gettid.c \ compat_misc.c \ + compat_pause.c \ compat_pio.c \ compat_poll.c \ + compat_sendfile.c \ + compat_setjmp.c \ compat_sleep_ms.c \ + compat_statvfs.c \ compat_un.c \ + compat_usleep.c \ concat.c \ + cond.c \ + constants.c \ cpufreq.c \ cq.c \ crash.c \ crc.c \ + dam.c \ dbmap.c \ dbmw.c \ dbstore.c \ dbus_util.c \ debug.c \ + dl_util.c \ dualhash.c \ + elist.c \ entropy.c \ + erbtree.c \ + eslist.c \ + etree.c \ eval.c \ event.c \ + evq.c \ exit.c \ + exit2str.c \ fast_assert.c \ fd.c \ - fifo.c \ file.c \ + file_object.c \ filehead.c \ + filelock.c \ filename.c \ float.c \ fragcheck.c \ + frand.c \ fs_free_space.c \ + ftw.c \ + gen-iprange.c \ + gentime.c \ + getcpucount.c \ getdate.c \ - getline.c \ getgateway.c \ + gethomedir.c \ + getline.c \ getphysmemsize.c \ glib-missing.c \ glog.c \ gnet_host.c \ halloc.c \ + hash.c \ + hashing.c \ hashlist.c \ hashtable.c \ header.c \ + hevset.c \ + hikset.c \ host_addr.c \ + hset.c \ + htable.c \ html.c \ + http_range.c \ idtable.c \ inputevt.c \ iprange.c \ + ipset.c \ iso3166.c \ - log.c \ + launch.c \ + leak.c \ list.c \ + listener.c \ + log.c \ magnet.c \ malloc.c \ map.c \ + mem.c \ + mempcpy.c \ memusage.c \ mime_type.c \ mingw32.c \ misc.c \ + mtwist.c \ mutex.c \ nid.c \ nv.c \ offtime.c \ ohash_table.c \ omalloc.c \ + once.c \ options.c \ ostream.c \ pagetable.c \ - parse.c \ palloc.c \ + parse.c \ path.c \ patricia.c \ pattern.c \ + plist.c \ pmsg.c \ pow2.c \ product.c \ + progname.c \ prop.c \ + pslist.c \ + rand31.c \ random.c \ + rbtree.c \ regex.c \ + ripening.c \ + rwlock.c \ sectoken.c \ + semaphore.c \ sequence.c \ + setproctitle.c \ sha1.c \ + shuffle.c \ signal.c \ slist.c \ + smsort.c \ sorted_array.c \ spinlock.c \ + spopen.c \ stacktrace.c \ stats.c \ str.c \ stringify.c \ strtok.c \ + strvec.c \ + symbols.c \ symtab.c \ tea.c \ + teq.c \ thread.c \ tiger.c \ tigertree.c \ timestamp.c \ tm.c \ + tmalloc.c \ + tokenizer.c \ + tqsort.c \ + tsig.c \ url.c \ - url_factory.c \ urn.c \ utf8.c \ vector.c \ vendors.c \ + vmea.c \ vmm.c \ + vsort.c \ + waiter.c \ walloc.c \ watcher.c \ wd.c \ + well.c \ + win32dlp.c \ wordvec.c \ wq.c \ xmalloc.c \ + xslist.c \ + xsort.c \ + xsort_data.c \ + xxtea.c \ zalloc.c \ zlib_util.c LOBJ = \ adns.o \ aging.o \ + aje.o \ + alloca.o \ + aq.o \ arc4random.o \ + argv.o \ ascii.o \ + atio.o \ atoms.o \ + barrier.o \ base16.o \ base32.o \ base64.o \ + bfd_util.o \ bg.o \ + bigint.o \ bstr.o \ + buf.o \ + chi2.o \ ckalloc.o \ + cmwc.o \ cobs.o \ + compat_gettid.o \ compat_misc.o \ + compat_pause.o \ compat_pio.o \ compat_poll.o \ + compat_sendfile.o \ + compat_setjmp.o \ compat_sleep_ms.o \ + compat_statvfs.o \ compat_un.o \ + compat_usleep.o \ concat.o \ + cond.o \ + constants.o \ cpufreq.o \ cq.o \ crash.o \ crc.o \ + dam.o \ dbmap.o \ dbmw.o \ dbstore.o \ dbus_util.o \ debug.o \ + dl_util.o \ dualhash.o \ + elist.o \ entropy.o \ + erbtree.o \ + eslist.o \ + etree.o \ eval.o \ event.o \ + evq.o \ exit.o \ + exit2str.o \ fast_assert.o \ fd.o \ - fifo.o \ file.o \ + file_object.o \ filehead.o \ + filelock.o \ filename.o \ float.o \ fragcheck.o \ + frand.o \ fs_free_space.o \ + ftw.o \ + gen-iprange.o \ + gentime.o \ + getcpucount.o \ getdate.o \ - getline.o \ getgateway.o \ + gethomedir.o \ + getline.o \ getphysmemsize.o \ glib-missing.o \ glog.o \ gnet_host.o \ halloc.o \ + hash.o \ + hashing.o \ hashlist.o \ hashtable.o \ header.o \ + hevset.o \ + hikset.o \ host_addr.o \ + hset.o \ + htable.o \ html.o \ + http_range.o \ idtable.o \ inputevt.o \ iprange.o \ + ipset.o \ iso3166.o \ - log.o \ + launch.o \ + leak.o \ list.o \ + listener.o \ + log.o \ magnet.o \ malloc.o \ map.o \ + mem.o \ + mempcpy.o \ memusage.o \ mime_type.o \ mingw32.o \ misc.o \ + mtwist.o \ mutex.o \ nid.o \ nv.o \ offtime.o \ ohash_table.o \ omalloc.o \ + once.o \ options.o \ ostream.o \ pagetable.o \ - parse.o \ palloc.o \ + parse.o \ path.o \ patricia.o \ pattern.o \ + plist.o \ pmsg.o \ pow2.o \ product.o \ + progname.o \ prop.o \ + pslist.o \ + rand31.o \ random.o \ + rbtree.o \ regex.o \ + ripening.o \ + rwlock.o \ sectoken.o \ + semaphore.o \ sequence.o \ + setproctitle.o \ sha1.o \ + shuffle.o \ signal.o \ slist.o \ + smsort.o \ sorted_array.o \ spinlock.o \ + spopen.o \ stacktrace.o \ stats.o \ str.o \ stringify.o \ strtok.o \ + strvec.o \ + symbols.o \ symtab.o \ tea.o \ + teq.o \ thread.o \ tiger.o \ tigertree.o \ timestamp.o \ tm.o \ + tmalloc.o \ + tokenizer.o \ + tqsort.o \ + tsig.o \ url.o \ - url_factory.o \ urn.o \ utf8.o \ vector.o \ vendors.o \ + vmea.o \ vmm.o \ + vsort.o \ + waiter.o \ walloc.o \ watcher.o \ wd.o \ + well.o \ + win32dlp.o \ wordvec.o \ wq.o \ xmalloc.o \ + xslist.o \ + xsort.o \ + xsort_data.o \ + xxtea.o \ zalloc.o \ zlib_util.o @@ -387,6 +563,9 @@ echo " $(MV) y.tab.c $@"; \ $(MV) y.tab.c $@; else touch $@; fi +getdate: getdate.c + $(CC) -o $@ $(JCFLAGS) -DTEST $< libshared.a $(LIBS) + # # Floating point formatting tests # @@ -396,6 +575,7 @@ LDFLAGS = LIBS = $(GLIB_LDFLAGS) $(COMMON_LIBS) +IF = ../if floats: floats.bz2 bzip2 -c -d floats.bz2 >$@ @@ -422,8 +602,24 @@ echo -n "free: " >>$@ sh -c "time ./float-test floats dragon > /dev/null" >>$@ 2>&1 +ftw-check: ftw-test + ./ftw-mktree + ./ftw-test -s ftw-root | diff -u - ftw-root.out >$@ + local_clean:: - $(RM) floats float-dragon.out bad-fixed float-times + $(RM) floats float-dragon.out bad-fixed float-times ftw-check + ./ftw-mktree -r + +all:: filelock-test + +local_realclean:: + $(RM) filelock-test$(_EXE) + +filelock-test: filelock-test.o libshared.a + -$(RM) $@$(_EXE) + if test -f $@$(_EXE); then \ + $(MV) $@$(_EXE) $@~$(_EXE); fi + $(CC) -o $@$(_EXE) filelock-test.o $(JLDFLAGS) libshared.a $(LIBS) all:: float-test @@ -436,6 +632,81 @@ $(MV) $@$(_EXE) $@~$(_EXE); fi $(CC) -o $@$(_EXE) float-test.o $(JLDFLAGS) libshared.a $(LIBS) +all:: ftw-test + +local_realclean:: + $(RM) ftw-test$(_EXE) + +ftw-test: ftw-test.o libshared.a + -$(RM) $@$(_EXE) + if test -f $@$(_EXE); then \ + $(MV) $@$(_EXE) $@~$(_EXE); fi + $(CC) -o $@$(_EXE) ftw-test.o $(JLDFLAGS) libshared.a $(LIBS) + +all:: launch-test + +local_realclean:: + $(RM) launch-test$(_EXE) + +launch-test: launch-test.o libshared.a + -$(RM) $@$(_EXE) + if test -f $@$(_EXE); then \ + $(MV) $@$(_EXE) $@~$(_EXE); fi + $(CC) -o $@$(_EXE) launch-test.o $(JLDFLAGS) libshared.a $(LIBS) + +all:: random-test + +local_realclean:: + $(RM) random-test$(_EXE) + +random-test: random-test.o libshared.a + -$(RM) $@$(_EXE) + if test -f $@$(_EXE); then \ + $(MV) $@$(_EXE) $@~$(_EXE); fi + $(CC) -o $@$(_EXE) random-test.o $(JLDFLAGS) libshared.a $(LIBS) + +all:: sort-test + +local_realclean:: + $(RM) sort-test$(_EXE) + +sort-test: sort-test.o libshared.a + -$(RM) $@$(_EXE) + if test -f $@$(_EXE); then \ + $(MV) $@$(_EXE) $@~$(_EXE); fi + $(CC) -o $@$(_EXE) sort-test.o $(JLDFLAGS) libshared.a $(LIBS) + +all:: spopen-test + +local_realclean:: + $(RM) spopen-test$(_EXE) + +spopen-test: spopen-test.o libshared.a + -$(RM) $@$(_EXE) + if test -f $@$(_EXE); then \ + $(MV) $@$(_EXE) $@~$(_EXE); fi + $(CC) -o $@$(_EXE) spopen-test.o $(JLDFLAGS) libshared.a $(LIBS) + +all:: thread-test + +local_realclean:: + $(RM) thread-test$(_EXE) + +thread-test: thread-test.o libshared.a + -$(RM) $@$(_EXE) + if test -f $@$(_EXE); then \ + $(MV) $@$(_EXE) $@~$(_EXE); fi + $(CC) -o $@$(_EXE) thread-test.o $(JLDFLAGS) libshared.a $(LIBS) + +gen-iprange.c: $(IF)/gen/iprange.c + $(RM) -f $@ + $(LN) $? $@ + +local_depend:: gen-iprange.c + +local_realclean:: + $(RM) -f gen-iprange.c + ######################################################################## # Common rules for all Makefiles -- do not edit @@ -457,6 +728,9 @@ install:: local_install @exit 0 +install-strip:: local_install-strip + @exit 0 + install.man:: maybe_install.man deinstall:: local_deinstall deinstall.man:: maybe_deinstall.man @@ -495,6 +769,9 @@ local_install:: @echo "install in $(CURRENT) done." +local_install-strip:: + @echo "install (strip) in $(CURRENT) done." + local_deinstall:: @echo "deinstall in $(CURRENT) done."
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/adns.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/adns.c
Changed
@@ -1,5 +1,6 @@ /* * Copyright (c) 2004, Christian Biere + * Copyright (c) 2013, Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -29,29 +30,43 @@ * * @author Christian Biere * @date 2004 + * @author Raphael Manfredi + * @date 2013 */ #include "common.h" #include "adns.h" + +#include "aq.h" #include "ascii.h" #include "atoms.h" #include "debug.h" #include "fd.h" #include "glib-missing.h" +#include "hikset.h" +#include "host_addr.h" #include "inputevt.h" +#include "once.h" +#include "pslist.h" #include "signal.h" +#include "thread.h" #include "tm.h" +#include "waiter.h" #include "walloc.h" +#include "xmalloc.h" #include "override.h" /* Must be the last header included */ /* private data types */ +enum adns_magic { ADNS_COMMON_MAGIC = 0x05dc21cb }; + struct adns_common { + enum adns_magic magic; void (*user_callback)(void); void *user_data; - gboolean reverse; + bool reverse; }; struct adns_reverse_query { @@ -89,13 +104,6 @@ } reply; }; -typedef struct adns_async_write { - struct adns_request req; /**< The original ADNS request */ - char *buf; /**< Remaining data to write; walloc()ed */ - size_t pos; /**< Read position */ - size_t size; /**< Size of the buffer */ -} adns_async_write_t; - typedef struct adns_cache_entry { const char *hostname; /**< atom */ time_t timestamp; @@ -125,20 +133,19 @@ } return n; } - + /** * Cache entries will expire after ADNS_CACHE_TIMEOUT seconds. */ -#define ADNS_CACHE_TIMEOUT (60) +#define ADNS_CACHE_TIMEOUT 60 + /** * Cache max. ADNS_CACHE_SIZE of adns_cache_entry_t entries. */ -#define ADNS_CACHE_MAX_SIZE (1024) - -static const char adns_process_title = "DNS helper for gtk-gnutella"; +#define ADNS_CACHE_MAX_SIZE 1024 typedef struct adns_cache_struct { - GHashTable *ht; + hikset_t *ht; unsigned pos; int timeout; adns_cache_entry_t *entriesADNS_CACHE_MAX_SIZE; @@ -148,10 +155,10 @@ /* private variables */ -static int adns_query_fd = -1; -static unsigned adns_query_event_id; static unsigned adns_reply_event_id; -static gboolean is_helper; /**< Are we the DNS helper process? */ +static aqueue_t *adns_req; +static aqueue_t *adns_ans; +static int adns_id = -1; /** * Private functions. @@ -163,11 +170,12 @@ adns_cache_t *cache; size_t i; - cache = g_malloc(sizeof *cache); + XMALLOC(cache); cache->timeout = ADNS_CACHE_TIMEOUT; - cache->ht = g_hash_table_new(g_str_hash, g_str_equal); + cache->ht = hikset_create( + offsetof(adns_cache_entry_t, hostname), HASH_KEY_STRING, 0); cache->pos = 0; - for (i = 0; i < G_N_ELEMENTS(cache->entries); i++) { + for (i = 0; i < N_ITEMS(cache->entries); i++) { cache->entriesi = NULL; } return cache; @@ -181,9 +189,9 @@ adns_cache_get_entry(adns_cache_t *cache, unsigned i) { adns_cache_entry_t *entry; - + g_assert(cache); - g_assert(i < G_N_ELEMENTS(cache->entries)); + g_assert(i < N_ITEMS(cache->entries)); entry = cache->entriesi; if (entry) { @@ -200,7 +208,7 @@ adns_cache_entry_t *entry; g_assert(cache); - g_assert(i < G_N_ELEMENTS(cache->entries)); + g_assert(i < N_ITEMS(cache->entries)); entry = cache->entriesi; if (entry) { @@ -230,11 +238,11 @@ g_assert(cache); g_assert(cache->ht); - for (i = 0; i < G_N_ELEMENTS(cache->entries); i++) { + for (i = 0; i < N_ITEMS(cache->entries); i++) { adns_cache_free_entry(cache, i); } - gm_hash_table_destroy_null(&cache->ht); - G_FREE_NULL(cache); + hikset_free_null(&cache->ht); + XFREE_NULL(cache); } /** @@ -248,22 +256,21 @@ { adns_cache_entry_t *entry; size_t i; - + g_assert(NULL != addrs); g_assert(NULL != cache); g_assert(NULL != hostname); g_assert(n > 0); - g_assert(NULL == g_hash_table_lookup(cache->ht, hostname)); + g_assert(!hikset_contains(cache->ht, hostname)); + g_assert(cache->pos < N_ITEMS(cache->entries)); - g_assert(cache->pos < G_N_ELEMENTS(cache->entries)); - entry = adns_cache_get_entry(cache, cache->pos); if (entry) { g_assert(entry->hostname); - g_assert(g_hash_table_lookup(cache->ht, entry->hostname) == entry); + g_assert(entry == hikset_lookup(cache->ht, entry->hostname)); - g_hash_table_remove(cache->ht, entry->hostname); + hikset_remove(cache->ht, entry->hostname); adns_cache_free_entry(cache, cache->pos); entry = NULL; } @@ -276,9 +283,9 @@ for (i = 0; i < entry->n; i++) { entry->addrsi = addrsi; } - g_hash_table_insert(cache->ht, deconstify_gchar(entry->hostname), entry); + hikset_insert_key(cache->ht, &entry->hostname); cache->entriescache->pos++ = entry; - cache->pos %= G_N_ELEMENTS(cache->entries); + cache->pos %= N_ITEMS(cache->entries); } /** @@ -303,7 +310,7 @@ g_assert(NULL != hostname); g_assert(0 == n || NULL != addrs); - entry = g_hash_table_lookup(cache->ht, hostname); + entry = hikset_lookup(cache->ht, hostname); if (entry) { if (delta_time(now, entry->timestamp) < cache->timeout) { size_t i; @@ -312,18 +319,19 @@ if (i < entry->n) { addrsi = entry->addrsi; if (common_dbg > 0) - g_debug("adns_cache_lookup: \"%s\" cached (addr=%s)", + g_debug("%s: \"%s\" cached (addr=%s)", G_STRFUNC, entry->hostname, host_addr_to_string(addrsi)); } else { addrsi = zero_host_addr; } } } else { - if (common_dbg > 0) - g_debug("adns_cache_lookup: removing \"%s\" from cache", - entry->hostname); + if (common_dbg > 0) { + g_debug("%s: removing \"%s\" from cache", + G_STRFUNC, entry->hostname); + } - g_hash_table_remove(cache->ht, hostname); + hikset_remove(cache->ht, hostname); adns_cache_free_entry(cache, entry->id); entry = NULL; } @@ -333,76 +341,6 @@ } /** - * Transfers the data in `buf' of size `len' through `fd'. If `do_write' is - * FALSE the buffer will be filled from `fd'. Otherwise, the data from the - * buffer will be written to `fd'. The function returns only if all data - * has been transferred or if an unrecoverable error occurs. This function - * should only be used with a blocking `fd'. - */ -static gboolean -adns_do_transfer(int fd, void *buf, size_t len, gboolean do_write) -{ - ssize_t ret; - size_t n = len; - - while (n > 0) { - if (common_dbg > 2) - g_debug("adns_do_transfer (%s): n=%zu", - do_write ? "write" : "read", n); - - if (do_write) - ret = write(fd, buf, n); - else - ret = read(fd, buf, n); - - if ((ssize_t) -1 == ret && !is_temporary_error(errno)) { - /* Ignore the failure, if the parent process is gone. - This prevents an unnecessary warning when quitting. */ - if (!is_helper || getppid() != 1) - g_warning("adns_do_transfer (%s): %s (errno=%d)", - do_write ? "write" : "read", g_strerror(errno), errno); - return FALSE; - } else if (0 == ret) { - /* - * Don't warn on EOF if this is the child process and the - * parent is gone. - */ - if (!do_write && !(is_helper && getppid() == 1)) - g_warning("adns_do_transfer (%s): EOF", - do_write ? "write" : "read"); - return FALSE; - } else if (ret > 0) { - n -= ret; - buf = (char *) buf + ret; - } - } - - return TRUE; -} - -/** - * Read the complete buffer ``buf'' of size ``len'' from file descriptor ``fd'' - * - * @return TRUE on success, FALSE if the operation failed - */ -static gboolean -adns_do_read(int fd, void *buf, size_t len) -{ - return adns_do_transfer(fd, buf, len, FALSE); -} - -/** - * Write the complete buffer ``buf'' of size ``len'' to file descriptor ``fd'' - * - * @return TRUE on success, FALSE if the operation failed - */ -static gboolean -adns_do_write(int fd, void *buf, size_t len) -{ - return adns_do_transfer(fd, buf, len, TRUE); -} - -/** * Copies user_callback and user_data from the query buffer to the * reply buffer. This function won't fail. However, if gethostbyname() * fails ``reply->addr'' will be set to zero. @@ -421,8 +359,8 @@ const char *host; if (common_dbg > 1) { - g_debug("adns_gethostbyname: Resolving \"%s\" ...", - host_addr_to_string(query->addr)); + s_debug("%s: reverse-resolving \"%s\" ...", + G_STRFUNC, host_addr_to_string(query->addr)); } reply->addr = query->addr; @@ -431,91 +369,79 @@ } else { const struct adns_query *query = &req->query.by_addr; struct adns_reply *reply = &ans->reply.by_addr; - GSList *sl_addr, *sl; + pslist_t *sl_addr, *sl; size_t i = 0; if (common_dbg > 1) { - g_debug("adns_gethostbyname: Resolving \"%s\" ...", - query->hostname); + s_debug("%s: resolving \"%s\" ...", G_STRFUNC, query->hostname); } clamp_strcpy(reply->hostname, sizeof reply->hostname, query->hostname); sl_addr = name_to_host_addr(query->hostname, query->net); - for (sl = sl_addr; NULL != sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(sl_addr, sl) { host_addr_t *addr = sl->data; g_assert(addr); - if (i >= G_N_ELEMENTS(reply->addrs)) { + if (i >= N_ITEMS(reply->addrs)) { break; } reply->addrsi++ = *addr; } host_addr_free_list(&sl_addr); - if (i < G_N_ELEMENTS(reply->addrs)) { + if (i < N_ITEMS(reply->addrs)) { reply->addrsi = zero_host_addr; } } } +struct adns_helper_args { + aqueue_t *requests; /* Where helper receives requests from */ + aqueue_t *answers; /* Where helper sends answers to */ +}; + +#define ADNS_HELPER_STACK THREAD_STACK_MIN + /** - * The ``main'' function of the adns helper process (server). + * The ``main'' function of the adns helper thread (server). * - * Simply reads requests (queries) from fd_in, performs a DNS lookup for it - * and writes the result to fd_out. All operations should be blocking. Exits - * in case of non-recoverable error during read or write. + * Simply reads requests (queries) from the queue, performs a DNS lookup for it + * and writes the result back to the output queue. All operations should be + * blocking. */ -static void -adns_helper(int fd_in, int fd_out) +static void * +adns_helper(void *p) { - g_set_prgname(adns_process_title); - gm_setproctitle(g_get_prgname()); + struct adns_helper_args *args = p; + aqueue_t *rq = aq_refcnt_inc(args->requests); + aqueue_t *aq = aq_refcnt_inc(args->answers); -#ifdef SIGQUIT - signal_set(SIGQUIT, SIG_IGN); /* Avoid core dumps on SIGQUIT */ -#endif + thread_set_name("ADNS"); + WFREE(args); - is_helper = TRUE; + s_debug("ADNS thread started"); for (;;) { - struct adns_request req; - struct adns_response ans; - size_t size; - void *buf; - - if (!adns_do_read(fd_in, &req.common, sizeof req.common)) - break; - - if (req.common.reverse) { - size = sizeof req.query.reverse; - buf = &req.query.reverse; - } else { - size = sizeof req.query.by_addr; - buf = &req.query.by_addr; - } + struct adns_request *req; + struct adns_response *ans; - if (!adns_do_read(fd_in, buf, size)) + req = aq_remove(rq); + if G_UNLIKELY(NULL == req) break; - adns_gethostbyname(&req, &ans); + g_assert(ADNS_COMMON_MAGIC == req->common.magic); - if (!adns_do_write(fd_out, &ans.common, sizeof ans.common)) - break; + WALLOC(ans); + adns_gethostbyname(req, ans); + WFREE(req); + aq_put(aq, ans); + } - if (ans.common.reverse) { - size = sizeof ans.reply.reverse; - buf = &ans.reply.reverse; - } else { - size = sizeof ans.reply.by_addr; - buf = &ans.reply.by_addr; - } + s_debug("ADNS thread exiting"); - if (!adns_do_write(fd_out, buf, size)) - break; - } + aq_refcnt_dec(rq); + aq_refcnt_dec(aq); - fd_close(&fd_in); - fd_close(&fd_out); - _exit(EXIT_SUCCESS); + return NULL; } static inline void @@ -532,8 +458,8 @@ const struct adns_reply *reply = &ans->reply.by_addr; adns_callback_t func; size_t n; - - n = count_addrs(reply->addrs, G_N_ELEMENTS(reply->addrs)); + + n = count_addrs(reply->addrs, N_ITEMS(reply->addrs)); func = (adns_callback_t) ans->common.user_callback; func(reply->addrs, n, ans->common.user_data); } @@ -560,32 +486,32 @@ { time_t now = tm_time(); - g_assert(ans); + g_assert(ans != NULL); if (ans->common.reverse) { if (common_dbg > 1) { const struct adns_reverse_reply *reply = &ans->reply.reverse; - - g_debug("adns_reply_ready: Resolved \"%s\" to \"%s\".", - host_addr_to_string(reply->addr), reply->hostname); + + g_debug("%s: resolved \"%s\" to \"%s\".", + G_STRFUNC, host_addr_to_string(reply->addr), reply->hostname); } } else { const struct adns_reply *reply = &ans->reply.by_addr; size_t num; - num = count_addrs(reply->addrs, G_N_ELEMENTS(reply->addrs)); + num = count_addrs(reply->addrs, N_ITEMS(reply->addrs)); num = MAX(1, num); /* For negative caching */ - + if (common_dbg > 1) { size_t i; - + for (i = 0; i < num; i++) { - g_debug("adns_reply_ready: Resolved \"%s\" to \"%s\".", + g_debug("%s: resolved \"%s\" to \"%s\".", G_STRFUNC, reply->hostname, host_addr_to_string(reply->addrsi)); } } - + if (!adns_cache_lookup(adns_cache, now, reply->hostname, NULL, 0)) { adns_cache_add(adns_cache, now, reply->hostname, reply->addrs, num); } @@ -597,352 +523,122 @@ /** * Callback function for inputevt_add(). This function invokes the callback - * function given in DNS query on the client-side i.e., gtk-gnutella itself. - * It handles partial reads if necessary. In case of an unrecoverable error - * the reply pipe will be closed and the callback will be lost. + * function given in DNS query on the client-side i.e., the main thread itself. */ static void adns_reply_callback(void *data, int source, inputevt_cond_t condition) { - static struct adns_response ans; - static void *buf; - static size_t size, pos; + struct adns_response *ans; + waiter_t *w = data; - g_assert(NULL == data); g_assert(condition & INPUT_EVENT_RX); - for (;;) { - ssize_t ret; - size_t n; - - if (pos == size) { - - pos = 0; - if (cast_to_gpointer(&ans.common) == buf) { - if (ans.common.reverse) { - buf = &ans.reply.reverse; - size = sizeof ans.reply.reverse; - } else { - buf = &ans.reply.by_addr; - size = sizeof ans.reply.by_addr; - } - } else { - if (buf) { - adns_reply_ready(&ans); - } - buf = &ans.common; - size = sizeof ans.common; - } - } + (void) source; - g_assert(buf); - g_assert(size > 0); - g_assert(pos < size); - - n = size - pos; - ret = read(source, cast_to_gchar_ptr(buf) + pos, n); - if ((ssize_t) -1 == ret) { - if (!is_temporary_error(errno)) { - g_warning("adns_reply_callback: read() failed: %s", - g_strerror(errno)); - goto error; - } - break; - } else if (0 == ret) { - g_warning("adns_reply_callback: read() failed: EOF"); - goto error; - } else { - g_assert(ret > 0); - g_assert(UNSIGNED(ret) <= n); - pos += (size_t) ret; - } - } - return; - -error: - inputevt_remove(&adns_reply_event_id); - g_warning("adns_reply_callback: removed myself"); - fd_close(&source); -} + waiter_ack(w); /* Acknowledge reception of event */ -/** - * Allocate a "spill" buffer of size `size'. - */ -static adns_async_write_t * -adns_async_write_alloc(const struct adns_request *req, - const void *buf, size_t size) -{ - adns_async_write_t *remain; + /* + * Consume all the data available in the queue, potentially handling + * several pending replies. + */ - g_assert(req); - g_assert(buf); - g_assert(size > 0); - - WALLOC(remain); - remain->req = *req; - remain->size = size; - remain->buf = wcopy(buf, remain->size); - remain->pos = 0; - - return remain; -} + while (NULL != (ans = aq_remove_try(adns_ans))) { + /* + * Inform issuer of request by invoking the user callback. + */ -/** - * Dispose of the "spill" buffer. - */ -static void -adns_async_write_free(adns_async_write_t *remain) -{ - g_assert(remain); - g_assert(remain->buf); - g_assert(remain->size > 0); - - wfree(remain->buf, remain->size); - WFREE(remain); + adns_reply_ready(ans); + WFREE(ans); + } } -/** - * Callback function for inputevt_add(). This function pipes the query to - * the server using the pipe in non-blocking mode, partial writes are handled - * appropriately. In case of an unrecoverable error the query pipe will be - * closed and the blocking adns_fallback() will be invoked. - */ static void -adns_query_callback(void *data, int dest, inputevt_cond_t condition) +adns_helper_init(void) { - adns_async_write_t *remain = data; - - g_assert(NULL != remain); - g_assert(NULL != remain->buf); - g_assert(remain->pos < remain->size); - g_assert(dest == adns_query_fd); - g_assert(0 != adns_query_event_id); - - if (condition & INPUT_EVENT_EXCEPTION) { - g_warning("adns_query_callback: write exception"); - goto abort; - } - - while (remain->pos < remain->size) { - ssize_t ret; - size_t n; - - n = remain->size - remain->pos; - ret = write(dest, &remain->bufremain->pos, n); - - if (0 == ret) { - errno = ECONNRESET; - ret = (ssize_t) -1; - } - /* FALL THROUGH */ - if ((ssize_t) -1 == ret) { - if (!is_temporary_error(errno)) - goto error; - return; - } + waiter_t *waiter; + struct adns_helper_args *args; + int r; - g_assert(ret > 0); - g_assert(UNSIGNED(ret) <= n); - remain->pos += (size_t) ret; - } - g_assert(remain->pos == remain->size); + /* + * The ADNS thread talks to the main thread via a pair of asynchronous + * queues: requests are written to the adns_req queue and replies read + * from the adns_ans queue. + * + * Each side allocates the memory for the data structures put in the queue + * and the other side frees these data after processing them. + * + * In order for the main thread to know when there are data to read from + * the answer queue, we add a waiter object to the asynchronous queue, + * and insert its file descriptor to the main I/O event set. + */ - inputevt_remove(&adns_query_event_id); + waiter = waiter_make(NULL); + adns_req = aq_make(); + adns_ans = aq_make(); + aq_waiter_add(adns_ans, waiter); + adns_reply_event_id = inputevt_add(waiter_fd(waiter), INPUT_EVENT_RX, + adns_reply_callback, waiter); + waiter_destroy_null(&waiter); /* Is now referenced by the queue */ - goto done; + WALLOC(args); + args->requests = adns_req; + args->answers = adns_ans; + r = thread_create(adns_helper, args, + THREAD_F_NO_POOL | THREAD_F_PANIC, ADNS_HELPER_STACK); -error: - g_warning("adns_query_callback: write() failed: %s", g_strerror(errno)); -abort: - g_warning("adns_query_callback: removed myself"); - inputevt_remove(&adns_query_event_id); - fd_close(&adns_query_fd); - g_warning("adns_query_callback: using fallback"); - adns_fallback(&remain->req); -done: - adns_async_write_free(remain); - return; + adns_id = r; } +/** + * One-time initialization. + */ static void -adns_helper_init(void) -#ifdef MINGW32 -{ - mingw_adns_init(); -} -#else +adns_init_once(void) { - int fd_query2 = {-1, -1}; - int fd_reply2 = {-1, -1}; - pid_t pid; - - if (-1 == pipe(fd_query) || -1 == pipe(fd_reply)) { - g_warning("adns_init: pipe() failed: %s", g_strerror(errno)); - goto prefork_failure; - } - - pid = fork(); - if ((pid_t) -1 == pid) { - g_warning("adns_init: fork() failed: %s", g_strerror(errno)); - goto prefork_failure; - } - if (0 == pid) { - /* child process */ - - /** - * Close all standard FILEs so that they don't keep a reference - * to the log files when they are reopened by the main process - * on SIGHUP. This means there will be no visible messages from - * ADNS at all. - */ - - if (!freopen("/dev/null", "r", stdin)) - g_error("adns_init: freopen(\"/dev/null\", \"r\", stdin) failed: " - "%s", g_strerror(errno)); - - if (!freopen("/dev/null", "a", stdout)) - g_error("adns_init: freopen(\"/dev/null\", \"a\", stdout) failed: " - "%s", g_strerror(errno)); - - if (!freopen("/dev/null", "a", stderr)) - g_error("adns_init: freopen(\"/dev/null\", \"a\", stderr) failed: " - "%s", g_strerror(errno)); - - fd_close(&fd_query1); - fd_close(&fd_reply0); - - set_close_on_exec(fd_query0); - set_close_on_exec(fd_reply1); - - adns_helper(fd_query0, fd_reply1); - g_assert_not_reached(); - _exit(EXIT_SUCCESS); - } - - /* parent process */ - fd_close(&fd_query0); - fd_close(&fd_reply1); - - fd_query1 = get_non_stdio_fd(fd_query1); - fd_reply0 = get_non_stdio_fd(fd_reply0); - - adns_query_fd = fd_query1; - - set_close_on_exec(adns_query_fd); - set_close_on_exec(fd_reply0); - fd_set_nonblocking(adns_query_fd); - fd_set_nonblocking(fd_reply0); - - adns_reply_event_id = inputevt_add(fd_reply0, INPUT_EVENT_RX, - adns_reply_callback, NULL); - /* FALL THROUGH */ -prefork_failure: - - if (!adns_reply_event_id) { - g_warning("Cannot use ADNS; DNS lookups may cause stalling"); - fd_close(&fd_query0); - fd_close(&fd_query1); - fd_close(&fd_reply0); - fd_close(&fd_reply1); - } + adns_cache = adns_cache_init(); + adns_helper_init(); } -#endif /* MINGW32 */ /* public functions */ /** - * Initializes the adns helper i.e., fork()s a child process which will - * be used to resolve hostnames asynchronously. + * Initializes the adns helper running in a dedicated therad to resolve + * hostnames asynchronously. */ void adns_init(void) { - adns_cache = adns_cache_init(); - adns_helper_init(); + static once_flag_t inited; + + ONCE_FLAG_RUN(inited, adns_init_once); } /** * @return TRUE on success, FALSE on failure. */ -static gboolean +static bool adns_send_request(const struct adns_request *req) -#ifdef MINGW32 -{ - return mingw_adns_send_request(req); -} -#else { - char bufsizeof *req; - size_t size; - ssize_t written; + struct adns_request *r; - g_assert(req); + g_assert(req != NULL); - if (!adns_reply_event_id || 0 != adns_query_event_id) + if (0 == adns_reply_event_id) return FALSE; - g_assert(adns_query_fd >= 0); - - memcpy(buf, &req->common, sizeof req->common); - size = sizeof req->common; - { - const void *p; - size_t n; - - if (req->common.reverse) { - n = sizeof req->query.reverse; - p = &req->query.reverse; - } else { - n = sizeof req->query.by_addr; - p = &req->query.by_addr; - } - memcpy(&bufsize, p, n); - size += n; - } - - /* - * Try to write the query atomically into the pipe. - */ - - written = write(adns_query_fd, buf, size); - if (written == (ssize_t) -1) { - if (!is_temporary_error(errno)) { - g_warning("adns_resolve: write() failed: %s", - g_strerror(errno)); - inputevt_remove(&adns_reply_event_id); - fd_close(&adns_query_fd); - return FALSE; - } - written = 0; - } - - g_assert(0 == adns_query_event_id); - - /* - * If not written fully, allocate a spill buffer and record - * callback that will write the remaining data when the pipe - * can absorb new data. - */ - - if (UNSIGNED(written) < size) { - adns_async_write_t *aq; - - aq = adns_async_write_alloc(req, &bufwritten, size - written); - adns_query_event_id = inputevt_add(adns_query_fd, INPUT_EVENT_WX, - adns_query_callback, aq); - } + r = WCOPY(req); + aq_put(adns_req, r); return TRUE; } -#endif /* MINGW32 */ /** * Creates a DNS resolve query for ``hostname''. * * The given function ``user_callback'' (which MUST NOT be NULL) * will be invoked with the resolved IP address and ``user_data'' - * as its parameters. The IP address 0.0.0.0 i.e., ``(guint32) 0'' + * as its parameters. The IP address 0.0.0.0 i.e., ``(uint32) 0'' * is used to indicate a failure. In case the hostname is given as * an IP string, it will be directly converted and the callback * immediately invoked. If the adns helper process is ``out of service'' @@ -953,7 +649,7 @@ * synchronous i.e., the callback was called BEFORE adns_resolve() * returned, adns_resolve() returns FALSE. */ -gboolean +bool adns_resolve(const char *hostname, enum net_type net, adns_callback_t user_callback, void *user_data) { @@ -967,16 +663,19 @@ g_assert(NULL != hostname); g_assert(NULL != user_callback); + req.common.magic = ADNS_COMMON_MAGIC; req.common.user_callback = (void (*)(void)) user_callback; req.common.user_data = user_data; req.common.reverse = FALSE; ans.common = req.common; - + query->net = net; reply->hostname0 = '\0'; reply->addrs0 = zero_host_addr; - hostname_len = clamp_strcpy(query->hostname, sizeof query->hostname, hostname); + hostname_len = clamp_strcpy(query->hostname, + sizeof query->hostname, hostname); + if ('\0' != hostnamehostname_len) { /* truncation detected */ adns_invoke_user_callback(&ans); @@ -992,10 +691,10 @@ ascii_strlower(query->hostname, hostname); clamp_strcpy(reply->hostname, sizeof reply->hostname, query->hostname); - + if ( adns_cache_lookup(adns_cache, tm_time(), query->hostname, - reply->addrs, G_N_ELEMENTS(reply->addrs)) + reply->addrs, N_ITEMS(reply->addrs)) ) { adns_invoke_user_callback(&ans); return FALSE; /* synchronous */ @@ -1004,9 +703,9 @@ if (adns_send_request(&req)) return TRUE; /* asynchronous */ - if (adns_reply_event_id) { - g_warning("adns_resolve: using synchronous resolution for \"%s\"", - query->hostname); + if (common_dbg) { + g_warning("%s(): using synchronous resolution for \"%s\"", + G_STRFUNC, query->hostname); } adns_fallback(&req); @@ -1026,7 +725,7 @@ * synchronous i.e., the callback was called BEFORE adns_reverse_lookup() * returned, adns_reverse_lookup() returns FALSE. */ -gboolean +bool adns_reverse_lookup(const host_addr_t addr, adns_reverse_callback_t user_callback, void *user_data) { @@ -1035,6 +734,7 @@ g_assert(user_callback); + req.common.magic = ADNS_COMMON_MAGIC; req.common.user_callback = (void (*)(void)) user_callback; req.common.user_data = user_data; req.common.reverse = TRUE; @@ -1043,8 +743,8 @@ if (adns_send_request(&req)) return TRUE; /* asynchronous */ - g_warning("adns_reverse_lookup: using synchronous resolution for \"%s\"", - host_addr_to_string(query->addr)); + g_warning("%s(): using synchronous resolution for \"%s\"", + G_STRFUNC, host_addr_to_string(query->addr)); adns_fallback(&req); @@ -1057,14 +757,25 @@ void adns_close(void) { -#ifdef MINGW32 - mingw_adns_close(); -#else + aq_put(adns_req, NULL); /* Signals: end of processing */ + aq_destroy_null(&adns_req); + aq_destroy_null(&adns_ans); inputevt_remove(&adns_reply_event_id); - inputevt_remove(&adns_query_event_id); -#endif /* MINGW32 */ - adns_cache_free(&adns_cache); + + /* + * Wait for the ADNS to exit before continuing since we're shutdowning + * and all the important subsystems on which the thread layer relies upon + * are also going to be shutdowned (e.g. the callout queue). + * + * Therefore, having a deterministic destruction is important. + */ + + if (-1 != adns_id) { + if (-1 == thread_join(adns_id, NULL)) + g_warning("%s(): cannot join with ADNS thread: %m", G_STRFUNC); + adns_id = -1; + } } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/adns.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/adns.h
Changed
@@ -37,14 +37,14 @@ #include "common.h" #include "host_addr.h" /* For ``struct host_addr'' */ -typedef void (*adns_callback_t)(const host_addr_t *, size_t, gpointer); -typedef void (*adns_reverse_callback_t)(const char *, gpointer); +typedef void (*adns_callback_t)(const host_addr_t *, size_t, void *); +typedef void (*adns_reverse_callback_t)(const char *, void *); void adns_init(void); -gboolean adns_resolve(const char *, enum net_type net, - adns_callback_t, gpointer); -gboolean adns_reverse_lookup(const host_addr_t, - adns_reverse_callback_t, gpointer); +bool adns_resolve(const char *, enum net_type net, + adns_callback_t, void *); +bool adns_reverse_lookup(const host_addr_t, + adns_reverse_callback_t, void *); void adns_close(void); #endif /* _adns_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/aging.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/aging.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Raphael Manfredi + * Copyright (c) 2004, 2012 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,29 +28,30 @@ * Hash table with aging key/value pairs, removed automatically after * some time has elapsed. * + * All the entries in the table are given the same lifetime, with a granularity + * of one second. It is however possible to revitalize an entry being looked-up + * by restoring its initial lifetime (as if it had been removed and reinserted). + * * @author Raphael Manfredi - * @date 2004 + * @date 2004, 2012 */ #include "common.h" #include "aging.h" #include "cq.h" -#include "glib-missing.h" +#include "elist.h" +#include "hashing.h" +#include "hikset.h" #include "misc.h" +#include "mutex.h" +#include "thread.h" #include "tm.h" #include "walloc.h" -#include "override.h" /* Must be the last header included */ -#define AGING_CALLOUT 1500 /**< Heartbeat every 1.5 seconds */ +#include "override.h" /* Must be the last header included */ -/** - * Private callout queue shared by all aging tables, to avoid cluttering - * the main callout queue with too many entries. It is created with the - * first aging table and cleared when the last aging table is gone. - */ -static cqueue_t *aging_cq; /**< Private callout queue */ -static guint32 aging_refcnt; /**< Amount of alive aging tables */ +#define AGING_CALLOUT 1500 /**< Cleanup every 1.5 seconds */ enum aging_magic { AGING_MAGIC = 0x38e2fac3 @@ -61,10 +62,13 @@ * since the entries expire automatically after some time has elapsed. */ struct aging { - enum aging_magic magic; /**< Magic number */ - GHashTable *table; /**< The table holding values */ - aging_free_t kvfree; /**< The freeing callback for key/value pairs */ - int delay; /**< Initial aging delay, in seconds */ + enum aging_magic magic; /**< Magic number */ + int delay; /**< Initial aging delay, in seconds */ + hikset_t *table; /**< The table holding values */ + cperiodic_t *gc_ev; /**< Periodic garbage collecting event */ + mutex_t *lock; /**< Optional thread-safe lock */ + free_keyval_fn_t kvfree; /**< Freeing callback for key/value pairs */ + elist_t list; /**< List of items in table, oldest first */ }; static void @@ -77,48 +81,101 @@ /** * We wrap the values we insert in the table, since each value must keep * track of its insertion time, and cleanup event. + * + * Because the aging_value structure (inserted in the table) refers to the key, + * we can use a hikset instead of a hash table, which saves a pointer for each + * entry. */ struct aging_value { void *value; /**< The value they inserted in the table */ void *key; /**< The associated key object */ - cevent_t *cq_ev; /**< Scheduled cleanup event */ - aging_table_t *ag; /**< Holding container */ time_t last_insert; /**< Last insertion time */ - int ttl; /**< Time to live */ + link_t lk; /**< Embedded link to chain items together */ }; +/* + * Thread-safe synchronization support. + */ + +#define aging_synchronize(a) G_STMT_START { \ + if G_UNLIKELY((a)->lock != NULL) { \ + aging_table_t *wa = deconstify_pointer(a); \ + mutex_lock(wa->lock); \ + } \ +} G_STMT_END + +#define aging_unsynchronize(a) G_STMT_START { \ + if G_UNLIKELY((a)->lock != NULL) { \ + aging_table_t *wa = deconstify_pointer(a); \ + mutex_unlock(wa->lock); \ + } \ +} G_STMT_END + +#define aging_return(a, v) G_STMT_START { \ + if G_UNLIKELY((a)->lock != NULL) \ + mutex_unlock((a)->lock); \ + return v; \ +} G_STMT_END + +#define aging_return_void(a) G_STMT_START { \ + if G_UNLIKELY((a)->lock != NULL) \ + mutex_unlock((a)->lock); \ + return; \ +} G_STMT_END + +#define assert_aging_locked(a) G_STMT_START { \ + if G_UNLIKELY((a)->lock != NULL) \ + assert_mutex_is_owned((a)->lock); \ +} G_STMT_END + /** - * Create private callout queue if none exists. + * Free keys and values from the aging table. */ static void -ag_create_callout_queue(void) +aging_free(void *value, void *data) { - g_assert((aging_cq != NULL) == (aging_refcnt != 0)); + struct aging_value *aval = value; + aging_table_t *ag = data; - if (NULL == aging_cq) - aging_cq = cq_submake("aging", callout_queue, AGING_CALLOUT); + aging_check(ag); + assert_aging_locked(ag); + + if (ag->kvfree != NULL) + (*ag->kvfree)(aval->key, aval->value); - aging_refcnt++; + elist_remove(&ag->list, aval); + WFREE(aval); } /** - * Remove one reference to callout queue, discarding it when nobody - * references it anymore. + * Periodic garbage collecting routine. */ -static void -ag_unref_callout_queue(void) +static bool +aging_gc(void *obj) { - g_assert(aging_refcnt > 0); + aging_table_t *ag = obj; + time_t now = tm_time(); + struct aging_value *aval; + + aging_check(ag); - if (0 == --aging_refcnt) - cq_free_null(&aging_cq); + aging_synchronize(ag); + + g_assert(elist_count(&ag->list) == hikset_count(ag->table)); + + while (NULL != (aval = elist_head(&ag->list))) { + if (delta_time(now, aval->last_insert) <= ag->delay) + break; /* List is sorted, oldest items first */ + hikset_remove(ag->table, aval->key); + aging_free(aval, ag); + } - g_assert((aging_cq != NULL) == (aging_refcnt != 0)); + aging_return(ag, TRUE); /* Keep calling */ } /** - * Create new aging container, where only keys expire and need to be freed. - * Values are either integers (cast to pointers) or refer to parts of the keys. + * Create new aging container, where keys/values expire and need to be freed. + * Values are either integers (cast to pointers) or refer to real objects. * * @param delay the aging delay, in seconds, for entries * @param hash the hashing function for the keys in the hash table @@ -128,40 +185,34 @@ * @return opaque handle to the container. */ aging_table_t * -aging_make(int delay, GHashFunc hash, GEqualFunc eq, aging_free_t kvfree) +aging_make(int delay, hash_fn_t hash, eq_fn_t eq, free_keyval_fn_t kvfree) { aging_table_t *ag; - ag_create_callout_queue(); - - WALLOC(ag); + WALLOC0(ag); ag->magic = AGING_MAGIC; - ag->table = g_hash_table_new(hash, eq); + ag->table = hikset_create_any( + offsetof(struct aging_value, key), + NULL == hash ? pointer_hash : hash, eq); ag->kvfree = kvfree; + delay = MAX(delay, 1); + delay = MIN(delay, INT_MAX / 1000); ag->delay = delay; + elist_init(&ag->list, offsetof(struct aging_value, lk)); - aging_check(ag); - return ag; -} + /* + * If the callout queue does not run in the thread that is creating + * this table, then concurrent accesses are bound to happen. + * Therefore, make the table thread-safe. + */ -/** - * Free keys and values from the aging table. - */ -static void -aging_free_kv(void *key, void *value, void *udata) -{ - aging_table_t *ag = udata; - struct aging_value *aval = value; + if (cq_main_thread_id() != thread_small_id()) + aging_thread_safe(ag); - aging_check(ag); - g_assert(aval->ag == ag); - g_assert(aval->key == key); + ag->gc_ev = cq_periodic_main_add(AGING_CALLOUT, aging_gc, ag); - if (ag->kvfree != NULL) - (*ag->kvfree)(key, aval->value); - - cq_cancel(&aval->cq_ev); - WFREE(aval); + aging_check(ag); + return ag; } /** @@ -175,61 +226,118 @@ if (ag) { aging_check(ag); - g_hash_table_foreach(ag->table, aging_free_kv, ag); - gm_hash_table_destroy_null(&ag->table); + aging_synchronize(ag); + + hikset_foreach(ag->table, aging_free, ag); + hikset_free_null(&ag->table); + cq_periodic_remove(&ag->gc_ev); + + if (ag->lock != NULL) { + mutex_destroy(ag->lock); + WFREE(ag->lock); + } + ag->magic = 0; WFREE(ag); - - ag_unref_callout_queue(); *ag_ptr = NULL; } } /** - * Expire value entry. + * Mark newly created aging table as being thread-safe. + * + * This will make all external operations on the table thread-safe. */ -static void -aging_expire(cqueue_t *unused_cq, void *obj) +void +aging_thread_safe(aging_table_t *ag) { - struct aging_value *aval = obj; - aging_table_t *ag = aval->ag; + aging_check(ag); + + /* + * Silently do nothing if the aging table was already made thread-safe. + * Indeed, this is implicitly done when the callout queue is not running + * in the thread that creates the aging table, since then we know that + * concurrent calls can happen. + */ + + if (NULL == ag->lock) { + WALLOC0(ag->lock); + mutex_init(ag->lock); + } +} - (void) unused_cq; +/** + * Lock the aging table to allow a sequence of operations to be atomically + * conducted. + * + * It is possible to lock the table several times as long as each locking + * is paired with a corresponding unlocking in the execution flow. + * + * The table must have been marked thread-safe already. + */ +void +aging_lock(aging_table_t *ag) +{ aging_check(ag); + g_assert_log(ag->lock != NULL, + "%s(): aging table %p not marked thread-safe", G_STRFUNC, ag); - aval->cq_ev = NULL; + mutex_lock(ag->lock); +} - g_hash_table_remove(ag->table, aval->key); - aging_free_kv(aval->key, aval, ag); +/* + * Release lock on aging table. + * + * The table must have been marked thread-safe already and locked by the + * calling thread. + */ +void +aging_unlock(aging_table_t *ag) +{ + aging_check(ag); + g_assert_log(ag->lock != NULL, + "%s(): aging table %p not marked thread-safe", G_STRFUNC, ag); + + mutex_unlock(ag->lock); } /** * Lookup value in table. */ void * -aging_lookup(const aging_table_t *ag, gconstpointer key) +aging_lookup(const aging_table_t *ag, const void *key) { struct aging_value *aval; + void *data; aging_check(ag); - aval = g_hash_table_lookup(ag->table, key); - return aval == NULL ? NULL : aval->value; + aging_synchronize(ag); + + aval = hikset_lookup(ag->table, key); + data = aval == NULL ? NULL : aval->value; + + aging_return(ag, data); } /** * Return entry age in seconds, (time_delta_t) -1 if not found. */ time_delta_t -aging_age(const aging_table_t *ag, gconstpointer key) +aging_age(const aging_table_t *ag, const void *key) { struct aging_value *aval; + time_delta_t age; aging_check(ag); - aval = g_hash_table_lookup(ag->table, key); - return aval == NULL ? + aging_synchronize(ag); + + aval = hikset_lookup(ag->table, key); + age = aval == NULL ? (time_delta_t) -1 : delta_time(tm_time(), aval->last_insert); + + aging_return(ag, age); } /** @@ -237,113 +345,128 @@ * initial lifetime the key/value pair had at insertion time. */ void * -aging_lookup_revitalise(const aging_table_t *ag, gconstpointer key) +aging_lookup_revitalise(aging_table_t *ag, const void *key) { struct aging_value *aval; + void *data; aging_check(ag); - aval = g_hash_table_lookup(ag->table, key); + aging_synchronize(ag); + + aval = hikset_lookup(ag->table, key); if (aval != NULL) { - g_assert(aval->cq_ev != NULL); aval->last_insert = tm_time(); - cq_resched(aval->cq_ev, 1000 * aval->ttl); + elist_moveto_tail(&ag->list, aval); } - return aval == NULL ? NULL : aval->value; + data = NULL == aval ? NULL : aval->value; + + aging_return(ag, data); } /** * Remove key from the table, freeing it if we have a key free routine. * - * @return wehether key was found and subsequently removed. + * @return whether key was found and subsequently removed. */ -gboolean +bool aging_remove(aging_table_t *ag, const void *key) { struct aging_value *aval; - void *okey, *ovalue; + void *ovalue; + bool found; - g_assert(ag->magic == AGING_MAGIC); + aging_check(ag); + + aging_synchronize(ag); - if (!g_hash_table_lookup_extended(ag->table, key, &okey, &ovalue)) - return FALSE; + if (!hikset_lookup_extended(ag->table, key, &ovalue)) { + found = FALSE; + goto done; + } aval = ovalue; - g_assert(aval->key == okey); - g_assert(aval->ag == ag); + hikset_remove(ag->table, aval->key); + aging_free(aval, ag); - g_hash_table_remove(ag->table, aval->key); - aging_free_kv(aval->key, aval, ag); + found = TRUE; - return TRUE; +done: + aging_return(ag, found); } /** * Add value to the table. * - * If it was already present, its lifetime is augmented by the aging delay. + * If it was already present, its lifetime is reset to the aging delay. * * The key argument is freed immediately if there is a free routine for * keys and the key was present in the table. * * The previous value is freed and replaced by the new one if there is - * an insertion conflict and the value pointers are different. + * an insertion conflict and the key pointers are different. */ void aging_insert(aging_table_t *ag, const void *key, void *value) { - gboolean found; - void *okey, *ovalue; + bool found; + void *ovalue; time_t now = tm_time(); struct aging_value *aval; - g_assert(ag->magic == AGING_MAGIC); + aging_check(ag); - found = g_hash_table_lookup_extended(ag->table, key, &okey, &ovalue); + aging_synchronize(ag); + + found = hikset_lookup_extended(ag->table, key, &ovalue); if (found) { aval = ovalue; - g_assert(aval->key == okey); - - if (aval->key != key && ag->kvfree != NULL) { + if (ag->kvfree != NULL) { /* * We discard the new and keep the old key instead. * That way, we don't have to update the hash table. */ - (*ag->kvfree)(deconstify_gpointer(key), aval->value); + (*ag->kvfree)(deconstify_pointer(key), aval->value); } - g_assert(aval->cq_ev != NULL); - /* - * Value existed for this key, prolonge its life. + * Value existed for this key, reset its lifetime by moving the + * entry to the tail of the list. */ aval->value = value; - aval->ttl -= delta_time(now, aval->last_insert); - aval->ttl += ag->delay; - aval->ttl = MAX(aval->ttl, 1); - aval->ttl = MIN(aval->ttl, INT_MAX / 1000); aval->last_insert = now; - - cq_resched(aval->cq_ev, 1000 * aval->ttl); + elist_moveto_tail(&ag->list, aval); } else { WALLOC(aval); aval->value = value; - aval->key = deconstify_gpointer(key); - aval->ttl = ag->delay; - aval->ttl = MAX(aval->ttl, 1); - aval->ttl = MIN(aval->ttl, INT_MAX / 1000); + aval->key = deconstify_pointer(key); aval->last_insert = now; - aval->ag = ag; - - aval->cq_ev = cq_insert(aging_cq, 1000 * aval->ttl, aging_expire, aval); - gm_hash_table_insert_const(ag->table, key, aval); + hikset_insert(ag->table, aval); + elist_append(&ag->list, aval); } + + aging_return_void(ag); +} + +/** + * @return amount of entries held in aging table. + */ +size_t +aging_count(const aging_table_t *ag) +{ + size_t count; + + aging_check(ag); + + aging_synchronize(ag); + count = hikset_count(ag->table); + aging_return(ag, count); } /* vi: set ts=4: sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/aging.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/aging.h
Changed
@@ -36,28 +36,27 @@ #define _aging_h_ #include "common.h" -#include "glib-missing.h" /* For GEqualFunc in glib-1.x */ -#include "lib/tm.h" /* For time_delta_t */ +#include "tm.h" /* For time_delta_t */ typedef struct aging aging_table_t; -typedef void (*aging_free_t)(void *key, void *value); - /* * Public interface. */ aging_table_t *aging_make(int delay, - GHashFunc hash, GEqualFunc eq, aging_free_t kfree); + hash_fn_t hash, eq_fn_t eq, free_keyval_fn_t kfree); +void aging_thread_safe(aging_table_t *ag); void aging_destroy(aging_table_t **); -time_delta_t aging_age(const aging_table_t *ag, gconstpointer key); -void *aging_lookup(const aging_table_t *ag, gconstpointer key); -void *aging_lookup_revitalise(const aging_table_t *ag, const void *key); +time_delta_t aging_age(const aging_table_t *ag, const void *key); +void *aging_lookup(const aging_table_t *ag, const void *key); +void *aging_lookup_revitalise(aging_table_t *ag, const void *key); void aging_insert(aging_table_t *ag, const void *key, void *value); -gboolean aging_remove(aging_table_t *ag, const void *key); +bool aging_remove(aging_table_t *ag, const void *key); +size_t aging_count(const aging_table_t *ag); #endif /* _aging_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/aje.c
Added
@@ -0,0 +1,1057 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Alea Jacta Est (AJE) -- a pseudo RNG inspired by Fortuna and Yarrow. + * + * This is a random number generator based on the Fortuna design, mostly, + * but with some adjustments: + * + * - It uses only 23 pools instead of 32: because pool #n is only used 1/(2**n) + * of a time and there can be a reseed every 0.1 second, the 23rd pool will + * be used after (2**23)/10 seconds, or 9.7 days... That's large enough + * for AJE, since we're not going to reseed at the maximum speed, so the + * actual time will be more than that. + * + * - It relies on modulo bias to distribute entropy more frequently to the + * 3 lower pools, which are the ones used more often during reseeds. + * + * - It uses SHA1 instead of SHA256 to hash the entropy in each pool. + * + * - It does not reset the SHA1 context in pools, rather it carries forward + * its state. This was a feature of Yarrow (ability to query the final + * hash without resetting the computation context). + * + * - It uses XXTEA (the Corrected Block Tiny Encryption Algorithm) instead + * of AES to perform the encryption. + * + * The high-level description of Fortuna can be read here: + * http://en.wikipedia.org/wiki/Fortuna_(PRNG) + * + * This implementation of AJE was heavily inspired by the implementation + * of Fortuna by Marko Kreen, which appeared in libfortuna and can be found + * there: + * https://github.com/waitman/libfortuna.git + * + * Including the SHA2 hashing routines and AES was deemed unnecessary for now + * to have a "real" Fortuna implementation (2013-12-27). + * + * Using SHA1 means that we limit the entropy collected to 160 bits. But + * the encryption keys are only 128-bit long, therefore our AJE algorithm + * has only a 128-bit security strength. + * + * When generating bytes without any re-seeding happening, the overall state + * context is an 8-byte counter and a 16-byte key, hence the period of the + * PRNG is bound by 2**192 - 1. + * + * However, when re-seeding happens, and even though the internal context is + * finite and therefore bound to experience repetitions over the long run, + * the ordering of these repetitions depends on external factors (the collected + * entropy). Therefore, the PRNG becomes non-periodic. + * + * This current AJE implementation with SHA1 and XXTEA passes 99.91% of the + * FIPS 140-2 tests on the average and does not fail any of the dieharder + * tests, hence it is a good source of randomness (as good as /dev/urandom). + * + * ./random-test -Al -T | rngtest -c 1000000 + * ./random-test -Al -T | dieharder -g 200 -a + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#include "aje.h" + +#include "entropy.h" +#include "mempcpy.h" +#include "omalloc.h" +#include "once.h" +#include "pslist.h" +#include "random.h" +#include "sha1.h" +#include "pow2.h" /* For IS_POWER_OF_2() */ +#include "spinlock.h" +#include "thread.h" +#include "tm.h" +#include "unsigned.h" +#include "xxtea.h" + +#include "override.h" /* Must be the last header included */ + +#define AJE_POOLS 23 /* amount of pools used */ +#define AJE_RESEED_INTERVAL 100000 /* us: 0.1 seconds */ + +/* + * This is the maximum amount of bytes we can serve in a large request before + * forcefully changing the key, to avoid giving out too many bytes with the + * same key: if our internal counter is known, that would give a golden + * plain-text attack opportunity. + */ +#define AJE_REKEY_BYTES (64*1024) /* new key after that many bytes given */ + +/* + * This is the minimum amount of bytes that must have been added to + * pool #0 since last reseed, otherwise we'll be skipping the reseed. + */ +#define AJE_POOL0_FILL 32 + +/* + * The minimum amount of entropy bytes we attempt to give to a single pool + * when adding external entropy. + */ +#define AJE_POOL_MIN MAX(8, sizeof(void *)) + +/* + * The maximum amount of entropy bytes we attempt to give to a single pool + * when adding external entropy. + */ +#define AJE_POOL_MAX 48 + +/* + * The length of the digest for the pool hashing routine, in bytes. + */ +#define AJE_DIGEST_LEN SHA1_RAW_SIZE + +/* + * The length of the cipher key size, which must be at most AJE_DIGEST_LEN. + */ +#define AJE_CIPHER_KEYLEN XXTEA_KEY_SIZE + +/* + * The length of the ciher blocks. + */ +#define AJE_CIPHER_BLOCKLEN XXTEA_BLOCK_SIZE + +/* + * For speed, we generate a pool of random numbers and then serve them. + */ +#define AJE_RANDOM_COUNT 512 + +/** + * Amount of 32-bit words in the counter. + */ +#define AJE_COUNTER_WORDS (AJE_CIPHER_BLOCKLEN / 4) + +enum aje_magic { AJE_MAGIC = 0x5351db40 }; + +/** + * The AJE context. + */ +typedef struct aje_state { + enum aje_magic magic; /* Magic number */ + int sp; /* Amount of numbers held in vec */ + uint32 counterAJE_COUNTER_WORDS; /* The counter we encrypt */ + uint8 keyAJE_CIPHER_KEYLEN; /* Current key used */ + tm_t last_reseed; /* When we last reseeded */ + SHA1_context poolAJE_POOLS; /* The entropy pools */ + uint32 vecAJE_RANDOM_COUNT; /* Generated random numbers */ + size_t pool0_bytes; /* Bytes added to pool #0 */ + size_t reseed_count; /* Amount of reseeds done */ + uint32 krnd; /* Byte index in key */ + unsigned spread:1; /* Whether we ran initial spreading */ + spinlock_t lock; /* Thread-safe lock */ +} aje_state_t; + +static inline void +aje_check(const struct aje_state * const as) +{ + g_assert(as != NULL); + g_assert(AJE_MAGIC == as->magic); +} + +#define AJE_STATE_LOCK(a) spinlock_hidden(&(a)->lock) +#define AJE_STATE_UNLOCK(a) spinunlock_hidden(&(a)->lock) + +/** + * Increment counter, so that it changes without repeating itself, ever. + */ +static void +aje_counter_inc(aje_state_t *as) +{ + uint i; + + aje_check(as); + + for (i = 0; i < N_ITEMS(as->counter); i++) { + if G_LIKELY(0 != ++as->counteri) + break; + } +} + +/** + * Encrypt data. + * + * @param as the AJE state + * @param in the data to encrypt + * @param out where data should be encrypted + * @param len amount of data to encrypt (size of both ``in'' and ``out'') + */ +static void +aje_encrypt(const aje_state_t *as, void *in, void *out, size_t len) +{ + xxtea_encrypt((xxtea_key_t *) as->key, out, in, len); +} + +/** + * Encrypt counter, then increment it. + * This is what the litterature calls "cipher in counter mode". + * + * @param as the AJE state + * @param dest where encryption should be done + * @param len destination length + */ +static void +aje_counter_encrypt(aje_state_t *as, void *dest, size_t len) +{ + aje_check(as); + g_assert(sizeof as->counter == len); + + aje_encrypt(as, as->counter, dest, len); + aje_counter_inc(as); +} + +/** + * Are we allowed to reseed? + */ +static bool +aje_may_reseed(const aje_state_t *as) +{ + tm_t now; + + aje_check(as); + + tm_now_exact(&now); + + if (tm_elapsed_us(&now, &as->last_reseed) < AJE_RESEED_INTERVAL) + return FALSE; + + /* + * Ensure we are always reseeding the first time we are called! + */ + + return as->pool0_bytes >= AJE_POOL0_FILL || 0 == as->reseed_count; +} + +/** + * Generate new encryption key from all the pools we can use. + */ +static void +aje_reseed(aje_state_t *as) +{ + uint k; + size_t n, offset; + SHA1_context kctx; + sha1_t buf; + + aje_check(as); + + as->pool0_bytes = 0; /* pool is now empty */ + + /* + * Since both pool #0 and #1 would use only pool #0 for reseeding, we + * skip pool #0 in our count and go directly with n=1 initially. + * Hence the pre-incrementation. + */ + + n = ++as->reseed_count; + + /* + * We want to use the k-th pool only 1/(2**k) of the time. + */ + + SHA1_reset(&kctx); + + for (k = 0; k < N_ITEMS(as->pool) && n != 0; k++, n >>= 1) { + /* + * The SHA1 is finalized, but the SHA1 context is kept intact so that + * new entropy added to the pool will add to the previous hash context. + */ + + SHA1_intermediate(&as->poolk, &buf); + SHA1_INPUT(&kctx, buf); + + if (n & 1) + break; + } + + /* + * If the key is smaller than the SHA1 buffer, we can randomly offset + * the key start within the buffer to add more entropy. + */ + +#define AJE_EXTRABYTES (AJE_DIGEST_LEN - AJE_CIPHER_KEYLEN) + + if (AJE_DIGEST_LEN > AJE_CIPHER_KEYLEN) { + /* + * We avoid modulo bias by masking an entire set of trailing bits. + * Surely, that limits the amount of values ``offset'' can take by + * removing the upper value AJE_EXTRABYTES, but it simplifies code. + */ + + STATIC_ASSERT(IS_POWER_OF_2(AJE_EXTRABYTES)); + g_assert(as->krnd < N_ITEMS(as->key)); + + offset = as->keyas->krnd & (AJE_EXTRABYTES - 1); + } else { + offset = 0; + } + +#undef AJE_EXTRABYTES + + /* + * Add the old key, the current counter and the previous reseed time into + * the mix, then generate the new encryption key. + */ + + SHA1_INPUT(&kctx, as->key); + SHA1_INPUT(&kctx, as->counter); + SHA1_INPUT(&kctx, as->last_reseed); + SHA1_result(&kctx, &buf); + + STATIC_ASSERT(sizeof as->key <= sizeof buf); + g_assert(offset + sizeof as->key <= sizeof buf); + + memcpy(as->key, ptr_add_offset(&buf, offset), sizeof as->key); + as->krnd = 0; + + /* + * Clear intermediate values from the stack. + */ + + ZERO(&kctx); + ZERO(&buf); + + /* + * Record time at which we last performed the reseed. + * + * We use the cached time, which was at least computed when we called + * aje_may_reseed() so we know it's recent enough. + */ + + tm_now(&as->last_reseed); +} + +/** + * Change the encryption key. + */ +static void +aje_rekey(aje_state_t *as) +{ + uint8 bufAJE_CIPHER_BLOCKLEN; + uint8 keyAJE_CIPHER_KEYLEN; + size_t i; + + aje_check(as); + + /* + * The new key is made out of the next encrypted counters. + * + * We need to generate the new key in a separate buffer on the stack + * because as->key is still needed to encrypt the counters (the key is + * larger than the counters). + * + * We make no assumption here at how much larger the key is compared to + * the counters, but it needs to be at least as large as the counters + * we encrypt, or the algorithm would be weakend. Hence the static assert. + */ + + STATIC_ASSERT(AJE_CIPHER_BLOCKLEN <= AJE_CIPHER_KEYLEN); + + for (i = 0; i < AJE_CIPHER_KEYLEN; i+= AJE_CIPHER_BLOCKLEN) { + size_t r; /* Remaining bytes to fill the key */ + + aje_counter_encrypt(as, buf, sizeof buf); + r = AJE_CIPHER_KEYLEN - i; + memcpy(&keyi, buf, MIN(r, sizeof buf)); + } + + STATIC_ASSERT(sizeof as->key == sizeof key); + + /* + * Update the encryption key and reset the key random index. + */ + + memcpy(as->key, key, sizeof key); + as->krnd = 0; + + /* + * Clear stack, covering our tracks. + */ + + ZERO(&buf); + ZERO(&key); +} + +/** + * Generate a random byte. + */ +static uint8 +aje_random_byte(aje_state_t *as) +{ + uint8 b; + + aje_check(as); + g_assert(as->krnd < N_ITEMS(as->key)); + + /* + * Use the key bytes as our random source. + */ + + b = as->keyas->krnd++; + + if G_UNLIKELY(as->krnd >= N_ITEMS(as->key)) + aje_rekey(as); /* Get fresh randomness source */ + + return b; +} + +/** + * Pick a random pool to update. + */ +static uint +aje_random_pool(aje_state_t *as) +{ + aje_check(as); + + /* + * The modulo bias is OK: it will slightly prefer lower pools. + */ + + STATIC_ASSERT(MAX_INT_VAL(uint8) >= N_ITEMS(as->pool)); + + return aje_random_byte(as) % N_ITEMS(as->pool); +} + +/** + * Pick a random amount of bytes to process, at least AJE_POOL_MIN if there + * are enough data left, but no more than AJE_POOL_MAX bytes at a time. + */ +static size_t +aje_random_size(aje_state_t *as, size_t max) +{ + size_t n; + + aje_check(as); + g_assert(size_is_positive(max)); + + /* + * The modulo bias is OK: it will favor smaller sizes. + */ + + if (max > AJE_POOL_MIN) { + size_t upper = max - (AJE_POOL_MIN - 1); + upper = MIN(upper, (AJE_POOL_MAX + 1 - AJE_POOL_MIN)); + n = AJE_POOL_MIN + (aje_random_byte(as) % upper); + } else { + n = max; + } + + return n; +} + +/** + * Distribute some of the external entropy to pools, randomly. + * + * @param as the AJE state + * @param data start of the external randomness + * @param len length of the supplied data + * + * @return the amount of data we distributed. + */ +static size_t +aje_distribute_entropy(aje_state_t *as, const void *data, size_t len) +{ + uint n, s; + + aje_check(as); + + /* + * Make sure that pool #0 is initialized, and if it already has + * enough data, then pick another pool randomly. + */ + + if G_UNLIKELY(0 == as->reseed_count && as->pool0_bytes < AJE_POOL0_FILL) + n = 0; + else + n = aje_random_pool(as); + + g_assert(n < N_ITEMS(as->pool)); + + /* + * Hash a random portion of the data we are given into the pool. + */ + + s = aje_random_size(as, len); + + g_assert(s <= len); + + SHA1_input(&as->pooln, data, s); + + /* + * If we were updating pool #0, update the amount of entropy collected + * in that pool, since that is the one we use to decide whether we + * collected enough to allow reseeding. + */ + + if G_UNLIKELY(0 == n) + as->pool0_bytes += s; + + return s; /* The amount of bytes we distributed */ +} + +/** + * Update pools with new entropy (external randomness). + */ +static void +aje_add_entropy(aje_state_t *as, const void *data, size_t len) +{ + size_t n; + const uint8 *p; + + aje_check(as); + + if G_UNLIKELY(NULL == data || 0 == len) + return; + + /* + * Distribute the received entropy over all the pools: the amount of + * data and the pools are chosen randomly. + */ + + for (p = data, n = len; n != 0; /* empty */) { + size_t used; + + used = aje_distribute_entropy(as, p, n); + + g_assert(used <= n); + + n -= used; + p += used; + } +} + +/** + * Spread the initial entropy to all the pools. + */ +static void +aje_spread(aje_state_t *as) +{ + uint i; + uint8 bufAJE_CIPHER_BLOCKLEN; + + aje_check(as); + + /* + * Use next block as the new counter. + */ + + STATIC_ASSERT(sizeof as->counter == sizeof buf); + + aje_counter_encrypt(as, buf, sizeof buf); + memcpy(as->counter, buf, sizeof buf); + + /* + * Now feed entropy to the pools, excluding pool #0. + */ + + for (i = 1; i < N_ITEMS(as->pool); i++) { + size_t j; + + for (j = 0; j < 2; j++) { + aje_counter_encrypt(as, buf, sizeof buf); + SHA1_INPUT(&as->pooli, buf); + } + } + + ZERO(buf); /* Clear the stack */ + aje_rekey(as); /* Hide the key */ + + as->spread = TRUE; /* Can only spread once */ +} + +/** + * Extract random data to supplied buffer. + * + * @param as the AJE state + * @param dest where random data are to be written + * @param len size of the destination buffer + */ +static void +aje_extract(aje_state_t *as, void *dest, size_t len) +{ + size_t block_nr = 0; + uint8 bufAJE_CIPHER_BLOCKLEN; + void *p = dest; + + aje_check(as); + + /* + * Reseed if we can (and therefore should). + * This will always happen the first time we are called. + */ + + if (aje_may_reseed(as)) + aje_reseed(as); + + /* + * Randomize things the first time we are called. + */ + + if G_UNLIKELY(!as->spread) + aje_spread(as); + + /* + * Generate the random bytes. + */ + + while (len != 0) { + size_t n; + + /* + * We must not give out too many bytes with one key to make + * sure there are no duplicate blocks generated. + */ + + if G_UNLIKELY(++block_nr > AJE_REKEY_BYTES / AJE_CIPHER_BLOCKLEN) { + aje_rekey(as); + block_nr = 0; + } + + aje_counter_encrypt(as, buf, sizeof buf); + n = MIN(len, sizeof buf); + p = mempcpy(p, buf, n); + len -= n; + } + + /* + * Change the key after each request, no matter how small. + */ + + aje_rekey(as); + ZERO(&buf); +} + +static aje_state_t aje_state; +static once_flag_t aje_initialized; + +/** + * Initialize the state. + */ +static void +aje_init(aje_state_t *as) +{ + size_t i; + uint8 bufAJE_POOL0_FILL * 8; + + STATIC_ASSERT(AJE_CIPHER_KEYLEN <= AJE_DIGEST_LEN); + STATIC_ASSERT(AJE_CIPHER_KEYLEN == sizeof(xxtea_key_t)); + + ZERO(as); + as->magic = AJE_MAGIC; + + for (i = 0; i < N_ITEMS(as->pool); i++) { + SHA1_reset(&as->pooli); + } + + spinlock_init(&as->lock); + + /* + * Generate a random counter and a random initial key. + * + * The first time we're calling entropy_fill(), we're really generating + * random values from the environment. Once the global AJE is initialized, + * that call is redirected to aje_random_bytes(), meaning thread-specific + * AJE contexts will be seeded with randomness coming from the global AJE + * state. + */ + + entropy_fill(&as->key, sizeof as->key); + entropy_fill(&as->counter, sizeof as->counter); + + /* + * Throw an initial amount of entropy into the pools, randomly spread. + * + * Use uninitialized stack values, then random values. + */ + +#ifndef ALLOW_UNINIT_VALUES + ZERO(&buf); +#endif + + aje_add_entropy(as, buf, sizeof buf); + + for (i = 0; i < 8; i++) { + entropy_fill(buf, sizeof buf); + aje_add_entropy(as, buf, sizeof buf); + + random_bytes_with(entropy_minirand, buf, sizeof buf); + aje_add_entropy(as, buf, sizeof buf); + } + + /* + * Clear the stack. + */ + + ZERO(&buf); +} + +/** + * Initialize the default state. + */ +static void +aje_default_init(void) +{ + aje_init(&aje_state); + + /* + * Now that the global AJE state has been initialized and seeded, it can + * become the source of entropy, meaning routines like entropy_fill() + * get redirected to AJE for generating random bytes. + */ + + entropy_aje_inited(); +} + +/** + * Add entropy. + * + * @param src start of random data to add + * @param len length of data buffer + */ +void +aje_addrandom(const void *src, size_t len) +{ + ONCE_FLAG_RUN(aje_initialized, aje_default_init); + + AJE_STATE_LOCK(&aje_state); + aje_add_entropy(&aje_state, src, len); + AJE_STATE_UNLOCK(&aje_state); +} + +/** + * Extract random bytes into buffer. + * + * @param dest start of buffer to fill + * @param len length of data buffer + */ +void +aje_random_bytes(void *dest, size_t len) +{ + g_assert(dest != NULL); + g_assert(size_is_positive(len)); + + ONCE_FLAG_RUN(aje_initialized, aje_default_init); + + AJE_STATE_LOCK(&aje_state); + aje_extract(&aje_state, dest, len); + AJE_STATE_UNLOCK(&aje_state); +} + +/** + * Refresh the vec pool of random numbers. + */ +static void +aje_refresh(aje_state_t *as) +{ + aje_check(as); + + aje_extract(as, as->vec, sizeof as->vec); + as->sp = N_ITEMS(as->vec); +} + +/** + * Get pre-computed random number, refreshing pool if empty + * + * @param as the AJE state + * + * @return a 32-bit random number. + */ +static uint32 +aje_rand_internal(register aje_state_t *as) +{ + if G_UNLIKELY(as->sp <= 0) + aje_refresh(as); + + return as->vec--as->sp; +} + +/** + * Get pre-computed random number, refreshing pool if empty + * + * @param as the AJE state + * + * @return a 64-bit random number. + */ +static uint64 +aje_rand64_internal(register aje_state_t *as) +{ + register uint32 rn1, rn2; + + /* + * For maximum speed, we'll handle the two overflow cases + * together. That will save us one test in the common case, at + * the expense of an extra one in the overflow case. + * + * We're reusing the same logic here as in mts_rand64_internal(). + */ + + if G_UNLIKELY(--as->sp <= 0) { + if (as->sp < 0) { + aje_refresh(as); + rn1 = as->vec--as->sp; + } else { + rn1 = as->vecas->sp; + aje_refresh(as); + } + } else { + rn1 = as->vecas->sp; + } + + rn2 = as->vec--as->sp; + + return ((uint64) rn1 << 32) | (uint64) rn2; +} + +/** + * Generate 32-bit random value (fast). + */ +uint32 +aje_rand(void) +{ + uint32 v; + + ONCE_FLAG_RUN(aje_initialized, aje_default_init); + + AJE_STATE_LOCK(&aje_state); + v = aje_rand_internal(&aje_state); + AJE_STATE_UNLOCK(&aje_state); + + return v; +} + +/** + * Generate 64-bit random value (fast). + */ +uint64 +aje_rand64(void) +{ + uint64 v; + + ONCE_FLAG_RUN(aje_initialized, aje_default_init); + + AJE_STATE_LOCK(&aje_state); + v = aje_rand64_internal(&aje_state); + AJE_STATE_UNLOCK(&aje_state); + + return v; +} + +/** + * Generate a strong 32-bit random value (slow). + * + * This is a strong number because it does not rely on a pre-computed buffer + * of random values, hence it is immediately influenced by any call to + * aje_addrandom(), and it will change the global AJE key. + * + * It is about 8 times slower than aje_rand() and should only be used when + * the numbers need to be absolutely unpredictable given all the randomness + * collected so-far. + */ +uint32 +aje_rand_strong(void) +{ + uint32 v; + + aje_random_bytes(&v, sizeof v); + return v; +} + +/** + * Generate a strong 64-bit random value (slow). + * + * This is a strong number because it does not rely on a pre-computed buffer + * of random values, hence it is immediately influenced by any call to + * aje_addrandom(), and it will change the global AJE key. + */ +uint64 +aje_rand64_strong(void) +{ + uint64 v; + + aje_random_bytes(&v, sizeof v); + return v; +} + +static once_flag_t aje_key_inited; +static thread_key_t aje_key = THREAD_KEY_INIT; + +/** + * Create the thread-local random pool key, once. + */ +static void +aje_key_init(void) +{ + if (-1 == thread_local_key_create(&aje_key, THREAD_LOCAL_KEEP)) + s_error("cannot initialize AJE random pool key: %m"); + + /* + * As a precaution, make sure the global AJE state is properly initialized + * so that the forthcoming thread-local AJE state can be filled with + * randomness coming from that global pool. + */ + + ONCE_FLAG_RUN(aje_initialized, aje_default_init); +} + +/** + * Get suitable thread-local random pool. + */ +static aje_state_t * +aje_pool(void) +{ + aje_state_t *as; + + ONCE_FLAG_RUN(aje_key_inited, aje_key_init); + + as = thread_local_get(aje_key); + + if G_UNLIKELY(NULL == as) { + /* + * The random pool is kept for each created thread, never freed. + */ + + OMALLOC(as); + aje_init(as); + thread_local_set(aje_key, as); + } + + return as; +} + +/** + * Generate a random number in the range 0 to 2^32-1, inclusive. + * + * This routine uses a thread-private random pool and is mostly a + * lock-free execution path (about 10% faster than aje_rand() with locks + * but no contention). + * + * @return a 32-bit random number + */ +uint32 +aje_thread_rand(void) +{ + return aje_rand_internal(aje_pool()); +} + +/** + * Generate a random number in the range 0 to 2^64-1, inclusive. + * + * This routine uses a thread-private random pool and is mostly a + * lock-free execution path. + * + * @return a 64-bit random number + */ +uint64 +aje_thread_rand64(void) +{ + return aje_rand64_internal(aje_pool()); +} + +/** + * Add randomness to the local AJE state. + * + * @param as the AJE state to which we add randomness + * @param data the start of the random data buffer + * @param len the amount of random bytes to process in the buffer + */ +void +aje_thread_addrandom(const void *data, size_t len) +{ + aje_add_entropy(aje_pool(), data, len); +} + +/** + * Extract random bytes from the local AJE state into buffer. + * + * @param dest start of buffer to fill + * @param len length of data buffer + */ +void +aje_thread_random_bytes(void *dest, size_t len) +{ + g_assert(dest != NULL); + g_assert(size_is_positive(len)); + + aje_extract(aje_pool(), dest, len); +} + +/** + * Generate a strong 32-bit random value (slow) using the thread random pool. + * + * This is a strong number because it does not rely on a pre-computed buffer + * of random values, hence it is immediately influenced by any call to + * aje_thread_addrandom(), and it will change the local AJE key. + */ +uint32 +aje_thread_rand_strong(void) +{ + uint32 v; + + aje_thread_random_bytes(&v, sizeof v); + return v; +} + +/** + * Generate a strong 64-bit random value (slow) using the thread random pool. + * + * This is a strong number because it does not rely on a pre-computed buffer + * of random values, hence it is immediately influenced by any call to + * aje_thread_addrandom(), and it will change the local AJE key. + */ +uint64 +aje_thread_rand64_strong(void) +{ + uint64 v; + + aje_thread_random_bytes(&v, sizeof v); + return v; +} + +/** + * @return a list of thread IDs using a thread-local AJE pool, which must + * be freed with pslist_free(). + */ +pslist_t * +aje_users(void) +{ + ONCE_FLAG_RUN(aje_key_inited, aje_key_init); + + return thread_local_users(aje_key); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/aje.h
Added
@@ -0,0 +1,59 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Alea Jacta Est (AJE) -- a pseudo RNG inspired by Fortuna and Yarrow. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#ifndef _aje_h_ +#define _aje_h_ + +/* + * Public interface. + */ + +uint32 aje_rand(void); +uint64 aje_rand64(void); +void aje_random_bytes(void *dest, size_t len); +void aje_addrandom(const void *src, size_t len); +uint32 aje_rand_strong(void); +uint64 aje_rand64_strong(void); + +uint32 aje_thread_rand(void); +uint64 aje_thread_rand64(void); +void aje_thread_random_bytes(void *dest, size_t len); +void aje_thread_addrandom(const void *data, size_t len); +uint32 aje_thread_rand_strong(void); +uint64 aje_thread_rand64_strong(void); + +struct pslist *aje_users(void); + +#endif /* _aje_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/alloca.c
Added
@@ -0,0 +1,382 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * An emulation of alloca() based on the chunk allocation layer, itself + * based on the VMM layer. + * + * This code does not (and MUST NOT) rely on xmalloc() or zalloc(). + * + * Allocation is thread-safe but cannot be used from signal handlers in + * case they would be executed on a separate signal stack. + * + * When compiling with gcc, the __builtin_alloca() implementation is used, + * hence the emulation is not required. + * + * The alloca_stack_direction() routine is always made available for everyone + * to determine the stack growing direction. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#include "alloca.h" +#include "spinlock.h" + +/** + * Determine whether stack is growing upwards or backwards. + * + * @return +1 if stack is growing in the virtual address space, -1 otherwise. + */ +static int +alloca_stack_direction_compute(void) +{ + static void *old_sp; + int sp; + + if (NULL == old_sp) { + old_sp = &sp; + return alloca_stack_direction_compute(); + } else { + return ptr_cmp(&sp, old_sp); + } +} + +/** + * Determine whether stack is growing upwards or backwards. + * + * @return +1 if stack is growing in the virtual address space, -1 otherwise. + */ +int +alloca_stack_direction(void) +{ + static int direction; + static spinlock_t alloca_slk = SPINLOCK_INIT; + + if G_LIKELY(direction != 0) + return direction; + + spinlock_hidden(&alloca_slk); + + if (0 == direction) + direction = alloca_stack_direction_compute(); + + spinunlock_hidden(&alloca_slk); + + return direction; +} + +#ifdef EMULATE_ALLOCA + +#include "ckalloc.h" +#include "log.h" +#include "thread.h" +#include "unsigned.h" + +#include "override.h" /* Must be the last header included */ + +#define ALLOCA_STACK 32768 /* Upper boundary of allocation space */ +#define ALLOCA_FUNCMAX 65536 /* Largest function size */ +#define ALLOCA_WARNSIZE 4096 /* Above this size, warn about large alloca() */ + +/** + * Memory alignment constraints. + */ +#define ALLOCA_ALIGNBYTES MEM_ALIGNBYTES +#define ALLOCA_MASK (ALLOCA_ALIGNBYTES - 1) +#define alloca_round(s) \ + ((unsigned long) (((unsigned long) (s) + ALLOCA_MASK) & ~ALLOCA_MASK)) + +/** + * Allocation header. + */ +union alloca_header { + char alignALLOCA_ALIGNBYTES; + struct { + const void *sp; /**< Stack pointer at allocation time */ + const void *pc; /**< PC of caller at allocation time */ + union alloca_header *prev; /**< Previous header */ + } header; +}; + +enum alloca_magic { ALLOCA_MAGIC = 0x018886c7 }; + +/** + * Allocation stack structure. + */ +struct alloca_stack { + enum alloca_magic magic; + ckhunk_t *stack; /**< Stack chunk from which we're allocating */ + void *base; /**< Stack base */ + union alloca_header *last; /**< Last allocation (NULL if none) */ +}; + +static inline void +alloca_stack_check(const struct alloca_stack * const as) +{ + g_assert(as != NULL); + g_assert(ALLOCA_MAGIC == as->magic); +} + +/** + * Compare two pointers according to the stack growing direction. + * A pointer is larger than another if it is further up in the stack, i.e. + * it was allocated afterwards (deeper in the stack). + */ +static inline int +alloca_ptr_cmp(const void *a, const void *b) +{ + static int direction; + + if G_UNLIKELY(0 == direction) { + direction = alloca_stack_direction(); + g_assert(direction != 0); + } + + return CMP(direction, 0) * ptr_cmp(a, b); +} + +/** + * Allocate a new alloca() stack. + */ +static struct alloca_stack * +alloca_new_stack(void) +{ + struct alloca_stack *as; + ckhunk_t *ck; + + ck = ck_init_not_leaking(ALLOCA_STACK, 0); + as = ck_alloc(ck, sizeof *as); + + g_assert(as != NULL); + + ZERO(as); + as->magic = ALLOCA_MAGIC; + as->stack = ck; + as->base = ck_save(ck); + + return as; +} + +/** + * Get the thread-private alloca() stack. + */ +static struct alloca_stack * +alloca_get_stack(void) +{ + static bool warned; + struct alloca_stack *as; + + /* + * Warn them that we're using an emulated alloca() in case we enter + * one of the pathological cases where we can't cleanup the allocated + * blocks even though the routines which allocated them have long returned. + */ + + if G_UNLIKELY(!warned) { + s_warning("using emulated alloca() with a %d-byte stack", ALLOCA_STACK); + warned = TRUE; + } + + as = thread_private_get(func_to_pointer(alloca_get_stack)); + + if G_UNLIKELY(NULL == as) { + as = alloca_new_stack(); + thread_private_add(func_to_pointer(alloca_get_stack), as); + } + + return as; +} + +/** + * Check whether alloca() block has expired. + * + * @param ah the header of the allocated block + * @param sp current alloca() stack pointer + * @param pc current program counter of the alloca() caller + * + * @return TRUE if block has expired. + */ +static bool +alloca_expired(const union alloca_header *ah, const void *sp, const void *pc) +{ + int c; + + /* + * Don't simply look at the current stack pointer because if a routine + * calls f() iteratively and f() calls alloca(), we will always enter + * here with the same top stack pointer and we will not be able to cleanup + * previous allocations from f(). + * + * Instead we also look at the PC of the caller, and if the stack pointer + * is the same but the PC is lower, we know we left the routine. + * When the PC is greater, we assume that functions using alloca() are + * not bigger than ALLOCA_FUNCMAX bytes. Therefore, any distance between + * the caller's PC and the allocation PC greater than that indicates that + * we have left the routine, even though the stack pointer is at the + * same level. + * + * Still, we don't detect cases where f() is called first from a stack + * depth=1, then through another chain from a stack depth=2, etc... Its + * allocated blocks will be flagged "alive" because they appear to be + * in the same stack frame, as if some recursion occurred, whereas the + * frames are different. + */ + + c = alloca_ptr_cmp(ah->header.sp, sp); + + if (c < 0) + return FALSE; /* Block was allocated before on the stack */ + + if (c > 0) + return TRUE; /* Block was allocated after on the stack */ + + /* + * Stack pointers are identical. + */ + + if (ptr_cmp(pc, ah->header.pc) <= 0) + return TRUE; /* Allocated by code coming afterwards */ + + if (ptr_diff(pc, ah->header.pc) > ALLOCA_FUNCMAX) + return TRUE; /* We must be in another routine */ + + return FALSE; /* Can't determine for sure, assume still alive! */ +} + +/** + * Compute size of alloca() block. + * + * @attention + * This is inefficient but is only used when dumping the blocks, so it is + * not worth making it faster at the expense of tracking the block size. + */ +static size_t +alloca_block_size(const struct alloca_stack *as, const union alloca_header *ah) +{ + union alloca_header *h; + + if (ah == as->last) + return ptr_diff(ck_save(as->stack), ah); + + for (h = as->last; h != NULL; h = h->header.prev) { + if (ah == h->header.prev) + return ptr_diff(h, ah); + } + + return 0; /* Cannot happen, must be found */ +} + +/** + * Dump allocated blocks. + */ +static void +alloca_dump_used(void) +{ + struct alloca_stack *as; + union alloca_header *ah; + + as = alloca_get_stack(); + + alloca_stack_check(as); + + for (ah = as->last; ah != NULL; ah = ah->header.prev) { + s_info("alloca() block %p (%zu bytes) from %s()", (void *) ah, + alloca_block_size(as, ah), + stacktrace_routine_name(ah->header.pc, FALSE)); + } +} + +/** + * Allocate memory on the current thread's alloca() stack. + */ +void * +alloca_emulate(size_t len) +{ + struct alloca_stack *as; + const void *sp = &as; + const void *pc = stacktrace_caller(1); + union alloca_header *ah, *last_expired = NULL; + + g_assert(size_is_non_negative(len)); + + as = alloca_get_stack(); + + alloca_stack_check(as); + + if G_UNLIKELY(len > ALLOCA_WARNSIZE) + s_carp("large alloca() of %zu bytes", len); + + /* + * Look whether we have to garbage collect something. + */ + + for (ah = as->last; ah != NULL; ah = ah->header.prev) { + if (!alloca_expired(ah, sp, pc)) + break; + last_expired = ah; + } + + if (ah != as->last) { + g_assert(last_expired != NULL); + if (NULL == ah) + ck_restore(as->stack, as->base); + else + ck_restore(as->stack, last_expired); + as->last = ah; + } + + /* + * Calling with a length of 0 has no effect. + * + * The real alloca() will do nothing, we just garbage collect and + * return NULL. + */ + + if (0 == len) + return NULL; + + ah = ck_alloc(as->stack, alloca_round(len + sizeof *ah)); + + if (NULL == ah) { + s_critical("cannot alloca() %zu bytes", len); + alloca_dump_used(); + s_error("out of stack memory"); + } + + ah->header.sp = sp; + ah->header.pc = pc; + ah->header.prev = as->last; + as->last = ah; + + return ptr_add_offset(ah, sizeof *ah); +} + +#endif /* EMULATE_ALLOCA */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/alloca.h
Added
@@ -0,0 +1,53 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * An emulation of alloca(). + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _alloca_h_ +#define _alloca_h_ + +int alloca_stack_direction(void); + +#ifdef EMULATE_ALLOCA +#undef alloca +#define alloca(size) alloca_emulate(size) + +/* + * Public interface. + */ + +void *alloca_emulate(size_t len); + +#endif /* EMULATE_ALLOCA */ + +#endif /* _alloca_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/aq.c
Added
@@ -0,0 +1,474 @@ +/* + * Copyright (c) 2013, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Asynchronous queue. + * + * An asynchronous queue is primarily intended to be used for inter-thread + * message passing. The advantage over traditional kernel-level mechanisms + * (pipes, socketpairs, or even message queues) is that we do not need the + * copyin / copyout stages from user to kernel space and vice-versa to pass + * information within the same process where memory is already shared! + * + * The queue is message-oriented rather than byte-oriented like a pipe would, + * but the message is limited to a single pointer. It is up to the application + * to provide an exchange protocol on top of that to give meaning to the + * pointer being exchanged. + * + * The queue is reference-counted and will be destroyed when the last reference + * to it is gone. One thread is responsible for creating the queue and then + * subsequent threads can attach to it or detach from it. + * + * Messages are normally read in the order they were enqueued. + * + * Writing to the queue never blocks, but reading will if there is nothing + * pending to be read, unless a non-blocking read is performed. + * + * It is possible to add an asynchronous waiter object to the queue which will + * get signaled when there is pending data to read. This allows an I/O-driven + * thread to select() on the waiter's file descriptor to get informed that + * there is pending data on the queue. + * + * Here is pseudo-code showing how to add an asynchronous waiter object and + * tie it to the event loop: + * + * Setup: + * + * waiter_t *waiter = waiter_make(NULL); + * unsigned id; // id is a "global" variable + * aqueue_t *aq; // aq is a "global" variable + * + * aq = aq_make(); + * aq_waiter_add(aq, waiter); + * id = inputevt_add(waiter_fd(waiter), INPUT_EVENT_RX, callback, waiter); + * waiter_destroy_null(&waiter); + * + * The callback (I/O): + * + * void callback(void *data, int source, inputevt_cond_t condition) + * { + * waiter_t *w = data; + * void *item; + * + * waiter_ack(w); + * + * while (NULL != (item = aq_remove_try(aq))) { // aq is "global" + * // whatever processing on item + * } + * } + * + * Cleanup code: + * + * inputevt_remove(&id); + * aq_destroy_null(&aq); + * + * Note that the waiter object is ref-counted and can be "destroyed" as soon + * as it has been given to the queue and its reference given as argument for + * the I/O callback. If no further reference exists, it will be reclaimed when + * the queue is destroyed. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#include "aq.h" +#include "atomic.h" +#include "cond.h" +#include "eslist.h" +#include "log.h" +#include "mutex.h" +#include "stringify.h" +#include "tm.h" +#include "waiter.h" +#include "walloc.h" + +#include "override.h" /* Must be the last header included */ + +enum async_queue_magic { ASYNC_QUEUE_MAGIC = 0x51647584 }; + +/** + * An asynchronous queue. + */ +struct async_queue { + enum async_queue_magic magic; /* Magic number */ + int refcnt; /* Reference count */ + eslist_t queue; /* The list implementing the queue */ + mutex_t lock; /* Thread-safe lock */ + cond_t event; /* To wait/signal events on queue */ +}; + +static inline void +aq_check(const struct async_queue * const aq) +{ + g_assert(aq != NULL); + g_assert(ASYNC_QUEUE_MAGIC == aq->magic); +} + +/** + * A queued item. + */ +struct async_queue_item { + void *data; /* Data being exchanged */ + slink_t lk; /* Embedded link pointer */ +}; + +/** + * Create a new asynchronous queue. + * + * A thread sleeping whilst waiting for more input from the queue will not + * be able to process signals. + */ +aqueue_t * +aq_make(void) +{ + return aq_make_full(FALSE); /* Do not allow signals whilst waiting */ +} + +/** + * Create a new asynchronous queue. + * + * When "signals" is TRUE, the underlying condition variable will use emulated + * semaphores instead of native kernel semaphores to allow processing of inter- + * thread signals whilst waiting. + * + * @param signals whether to process signals whilst waiting + */ +aqueue_t * +aq_make_full(bool signals) +{ + aqueue_t *aq; + + WALLOC0(aq); + aq->magic = ASYNC_QUEUE_MAGIC; + aq->refcnt = 1; + eslist_init(&aq->queue, offsetof(struct async_queue_item, lk)); + mutex_init(&aq->lock); + cond_init_full(&aq->event, &aq->lock, signals); + + return aq; +} + +/** + * Add a waiter object to the queue. + * + * The waiter object will be notified when there is data available on the + * queue, avoiding polling in an I/O-driven thread. + */ +void +aq_waiter_add(aqueue_t *aq, waiter_t *w) +{ + aq_check(aq); + + cond_waiter_add(&aq->event, w); +} + +/** + * Remove a waiter object from the queue. + * + * @return TRUE if the waiter was removed, FALSE if it was not found. + */ +bool +aq_waiter_remove(aqueue_t *aq, waiter_t *w) +{ + aq_check(aq); + + return cond_waiter_remove(&aq->event, w); +} + +static void +aq_free_item(void *item, void *unused_data) +{ + struct async_queue_item *aqi = item; + + (void) unused_data; + WFREE(aqi); +} + +/** + * Destroy an asynchronous queue. + */ +static void +aq_free(aqueue_t *aq) +{ + aq_check(aq); + g_assert(0 == aq->refcnt); + + if G_UNLIKELY(0 != eslist_count(&aq->queue)) { + size_t count = eslist_count(&aq->queue); + s_carp("%s() freeing asynchronous queue still holding %zu item%s", + G_STRFUNC, count, plural(count)); + } + + eslist_foreach(&aq->queue, aq_free_item, NULL); + mutex_destroy(&aq->lock); + cond_destroy(&aq->event); + + aq->magic = 0; + WFREE(aq); +} + +/** + * Add one reference to an asynchronous queue. + * + * @return the referenced queue. + */ +aqueue_t * +aq_refcnt_inc(aqueue_t *aq) +{ + aq_check(aq); + + atomic_int_inc(&aq->refcnt); + return aq; +} + +/** + * Remove one reference to an asynchronous queue. + * + * If the reference count drops to 0, the queue is freed. + * + * @return whether the queue is still referenced. + */ +bool +aq_refcnt_dec(aqueue_t *aq) +{ + aq_check(aq); + + if (1 != atomic_int_dec(&aq->refcnt)) + return TRUE; + + aq_free(aq); + return FALSE; +} + +/** + * Destroy reference to queue and nullify its pointer. + */ +void +aq_destroy_null(aqueue_t **aq_ptr) +{ + aqueue_t *aq = *aq_ptr; + + if (aq != NULL) { + aq_refcnt_dec(aq); + *aq_ptr = NULL; + } +} + +/** + * Explicitly lock the queue to perform several operations atomically. + */ +void +aq_lock(aqueue_t *aq) +{ + aq_check(aq); + + mutex_lock(&aq->lock); +} + +/** + * Unlock a queue that has been explicitly locked. + */ +void +aq_unlock(aqueue_t *aq) +{ + aq_check(aq); + + mutex_unlock(&aq->lock); +} + +/** + * Fetch amount of items held in the queue. + */ +size_t +aq_count(const aqueue_t *aq) +{ + aqueue_t *waq = deconstify_pointer(aq); + size_t count; + + aq_check(aq); + + mutex_lock(&waq->lock); + count = eslist_count(&aq->queue); + mutex_unlock(&waq->lock); + + return count; +} + +/** + * Put new data in the queue. + * + * The amount of items returned is indicative of whether there is backlog + * created and how much. + * + * @param aq the async queue + * @param data pointer to put in the queue + * + * @return amount of items in the queue after the put occured. + */ +size_t +aq_put(aqueue_t *aq, void *data) +{ + struct async_queue_item *aqi; + size_t count; + + aq_check(aq); + + WALLOC0(aqi); + aqi->data = data; + + mutex_lock(&aq->lock); + + eslist_append(&aq->queue, aqi); + count = eslist_count(&aq->queue); + cond_signal(&aq->event, &aq->lock); + + mutex_unlock(&aq->lock); + + return count; +} + +/** + * Remove item from the queue, up to a specified amount of time. + * + * If there are no items in the queue, the calling thread is blocked until + * data comes in or until the waiting time has elapsed. + * + * When timeouts can happen, NULL cannot be a valid data exchanged because + * it is used to signal the timeout condition. + * + * @param aq the async queue + * @param timeout the amount of time we can spend waiting + * + * @return the read data item, NULL if a timeout occurs. + */ +void * +aq_timed_remove(aqueue_t *aq, const tm_t *timeout) +{ + struct async_queue_item *aqi = NULL; + void *data = NULL; + bool has_data = TRUE; + tm_t end; + + aq_check(aq); + g_assert(timeout != NULL); + + tm_now_exact(&end); + tm_add(&end, timeout); + + mutex_lock(&aq->lock); + while (has_data && 0 == eslist_count(&aq->queue)) + has_data = cond_wait_until_clean(&aq->event, &aq->lock, &end); + + if (has_data) + aqi = eslist_shift(&aq->queue); + mutex_unlock(&aq->lock); + + if (has_data) { + g_assert(aqi != NULL); + + data = aqi->data; + WFREE(aqi); + + if G_UNLIKELY(NULL == data) { + s_carp("%s(): found NULL data exchanged with non-blocking reads", + G_STRFUNC); + } + } + + return data; +} + +/** + * Remove item from the queue. + * + * If there are no items in the queue, the calling thread is blocked until + * data comes in. + * + * @param aq the async queue + * + * @return the read data item + */ +void * +aq_remove(aqueue_t *aq) +{ + struct async_queue_item *aqi; + void *data; + + aq_check(aq); + + mutex_lock(&aq->lock); + while (0 == eslist_count(&aq->queue)) + cond_wait_clean(&aq->event, &aq->lock); + + aqi = eslist_shift(&aq->queue); + mutex_unlock(&aq->lock); + + g_assert(aqi != NULL); + + data = aqi->data; + WFREE(aqi); + + return data; +} + +/** + * Try to remove item from the queue. + * + * Because NULL is returned if there is nothing available, it cannot be a + * valid data exchanged when non-blocking reads are to be performed. + * + * @param aq the async queue + * + * @return the read data item, NULL if there was nothing to read. + */ +void * +aq_remove_try(aqueue_t *aq) +{ + struct async_queue_item *aqi; + void *data = NULL; + + aq_check(aq); + + mutex_lock(&aq->lock); + aqi = eslist_shift(&aq->queue); + mutex_unlock(&aq->lock); + + if (aqi != NULL) { + data = aqi->data; + WFREE(aqi); + + if G_UNLIKELY(NULL == data) { + s_carp("%s(): found NULL data exchanged with non-blocking reads", + G_STRFUNC); + } + } + + return data; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/aq.h
Added
@@ -0,0 +1,69 @@ +/* + * Copyright (c) 2013, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Asynchronous queue. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#ifndef _aq_h_ +#define _aq_h_ + +struct async_queue; +typedef struct async_queue aqueue_t; + +/* + * Public interface. + */ + +struct tmval; + +aqueue_t *aq_make(void); +aqueue_t *aq_make_full(bool signals); +aqueue_t *aq_refcnt_inc(aqueue_t *aq); +bool aq_refcnt_dec(aqueue_t *aq); +void aq_destroy_null(aqueue_t **aq_ptr) NON_NULL_PARAM((1)); + +struct waiter; + +void aq_waiter_add(aqueue_t *aq, struct waiter *w); +bool aq_waiter_remove(aqueue_t *aq, struct waiter *w); + +size_t aq_count(const aqueue_t *aq); + +size_t aq_put(aqueue_t *aq, void *data); +void *aq_remove(aqueue_t *aq); +void *aq_timed_remove(aqueue_t *aq, const struct tmval *timeout); +void *aq_remove_try(aqueue_t *aq); + +void aq_lock(aqueue_t *aq); +void aq_unlock(aqueue_t *aq); + +#endif /* _aq_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/arc4random.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/arc4random.c
Changed
@@ -2,7 +2,7 @@ * Copyright (c) 1996, David Mazieres <dm@lcs.mit.edu>. * * Adaptated for inclusion in gtk-gnutella by Raphael Manfredi. - * Copyright (c) 2010, Raphael Manfredi + * Copyright (c) 2010, 2012-2013 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,18 +28,31 @@ * @ingroup lib * @file * - * Arc4 random number generator. + * ARC4 random number generator. + * + * The arc4random() function uses the key stream generator employed by the + * ARC4 cipher, which uses 256 8-bit S-Boxes. The S-Boxes can be in about + * 2^1700 states. + * + * There is no need to call arc4random_stir() before using arc4random() + * since initialization happens auto-magically. The initial seed is collected + * through entropy_collect(), which supplies 160 random bits. + * + * The arc4random_upto64() routine has been added to David Mazieres's code + * to provide uniformly distributed random numbers over a certain range. + * + * The code has also been extended to provide thread-local ARC4 streams, which + * can generate random numbers without taking locks, resulting in a substantial + * increased throughput. * - * @author Raphael Manfredi - * @date 2010 * @author David Mazieres * @date 1996 + * @author Raphael Manfredi + * @date 2010, 2012-2013 */ #include "common.h" -#ifndef HAS_ARC4RANDOM - /* * Arc4 random number generator for OpenBSD. * Copyright 1996 David Mazieres <dm@lcs.mit.edu>. @@ -66,20 +79,24 @@ */ #include "arc4random.h" + #include "entropy.h" -#include "misc.h" /* For sha1_t */ +#include "omalloc.h" +#include "once.h" +#include "pslist.h" +#include "spinlock.h" +#include "thread.h" + +#define ARC4_BOXES 256 struct arc4_stream { - guint8 i; - guint8 j; - guint8 s256; + uint8 i; + uint8 j; + uint8 initialized; + uint8 sARC4_BOXES; }; -static struct arc4_stream rs; -static int rs_initialized; -static int rs_stired; - -static inline guint8 arc4_getbyte(struct arc4_stream *); +static inline uint8 arc4_getbyte(struct arc4_stream *); static void arc4_stir(struct arc4_stream *); static inline void @@ -87,7 +104,7 @@ { int n; - for (n = 0; n < 256; n++) + for (n = 0; n < ARC4_BOXES; n++) as->sn = n; as->i = 0; as->j = 0; @@ -96,16 +113,21 @@ static inline void arc4_addrandom(struct arc4_stream *as, const unsigned char *dat, int datlen) { - int n; - guint8 si; - - as->i--; - for (n = 0; n < 256; n++) { - as->i = (as->i + 1); - si = as->sas->i; - as->j = (as->j + si + datn % datlen); - as->sas->i = as->sas->j; - as->sas->j = si; + while (datlen > 0) { + int n; + + as->i--; + for (n = 0; n < ARC4_BOXES; n++) { + uint8 si; + as->i++; + si = as->sas->i; + as->j += si + datn % datlen; + as->sas->i = as->sas->j; + as->sas->j = si; + } + + dat += ARC4_BOXES; + datlen -= ARC4_BOXES; } } @@ -113,10 +135,24 @@ arc4_stir(struct arc4_stream *as) { int n; - sha1_t entropy; - - entropy_collect(&entropy); - arc4_addrandom(as, cast_to_gpointer(&entropy), sizeof entropy); + + if G_UNLIKELY(!as->initialized) { + arc4_init(as); + as->initialized = TRUE; + } + + /* + * Collect 1024 bytes of initial entropy: the more randomness there + * is in the initial state, the more random combinations we can produce + * after initialization. + */ + + for (n = 0; n < 4; n++) { + unsigned char bufARC4_BOXES; + + entropy_fill(buf, sizeof buf); + arc4_addrandom(as, buf, sizeof buf); + } /* * Throw away the first N bytes of output, as suggested in the @@ -125,29 +161,30 @@ * suggestions in the paper "(Not So) Random Shuffles of RC4" * by Ilya Mironov. */ + for (n = 0; n < 1024; n++) arc4_getbyte(as); } -static inline G_GNUC_HOT guint8 +static inline uint8 G_HOT arc4_getbyte(struct arc4_stream *as) { - guint8 si, sj; + uint8 si, sj; - as->i = (as->i + 1); + as->i++; si = as->sas->i; - as->j = (as->j + si); + as->j += si; sj = as->sas->j; as->sas->i = sj; as->sas->j = si; - return (as->s(si + sj) & 0xff); + return as->s(si + sj) & 0xff; } -static inline G_GNUC_HOT guint32 +static inline uint32 G_HOT arc4_getword(struct arc4_stream *as) { - guint32 val; + uint32 val; val = arc4_getbyte(as) << 24; val |= arc4_getbyte(as) << 16; @@ -157,21 +194,22 @@ return (val); } -static inline void -arc4_check_init(void) -{ - if G_UNLIKELY(!rs_initialized) { - arc4_init(&rs); - rs_initialized = 1; - } -} +#ifndef HAS_ARC4RANDOM -static inline void +static spinlock_t arc4_lck = SPINLOCK_INIT; + +#define ARC4_LOCK spinlock_hidden(&arc4_lck) +#define ARC4_UNLOCK spinunlock_hidden(&arc4_lck) + +static struct arc4_stream rs; +static bool rs_stired; + +static inline ALWAYS_INLINE void arc4_check_stir(void) { if G_UNLIKELY(!rs_stired) { + rs_stired = TRUE; arc4_stir(&rs); - rs_stired = 1; } } @@ -185,10 +223,9 @@ void arc4random_stir(void) { - /* THREAD_LOCK(); */ - arc4_check_init(); + ARC4_LOCK; arc4_stir(&rs); - /* THREAD_UNLOCK(); */ + ARC4_UNLOCK; } /** @@ -203,29 +240,161 @@ g_assert(dat != NULL); g_assert(datlen > 0); - /* THREAD_LOCK(); */ - arc4_check_init(); + ARC4_LOCK; arc4_check_stir(); arc4_addrandom(&rs, dat, datlen); - /* THREAD_UNLOCK(); */ + ARC4_UNLOCK; } /** * @return a new 32-bit random number. */ -G_GNUC_HOT guint32 +uint32 G_HOT arc4random(void) { - guint32 rnd; + uint32 rnd; - /* THREAD_LOCK(); */ - arc4_check_init(); + ARC4_LOCK; arc4_check_stir(); rnd = arc4_getword(&rs); - /* THREAD_UNLOCK(); */ + ARC4_UNLOCK; return rnd; } +/** + * @return 64-bit random number. + */ +uint64 +arc4random64(void) +{ + uint32 hi, lo; + + ARC4_LOCK; + arc4_check_stir(); + hi = arc4_getword(&rs); + lo = arc4_getword(&rs); + ARC4_UNLOCK; + + return ((uint64) hi << 32) | (uint64) lo; +} +#else +/** + * @return 64-bit random number. + */ +uint64 +arc4random64(void) +{ + return ((uint64) arc4random() << 32) | (uint64) arc4random(); +} #endif /* !HAS_ARC4RANDOM */ +/** + * Perform random initialization if not already done. + * + * @attention + * This is a non-standard call, specific to this library. + */ +void G_COLD +arc4random_stir_once(void) +{ + static once_flag_t done; + + once_flag_run(&done, arc4random_stir); +} + +/*** + *** Thread-private ARC4 streams, to avoid locking. + ***/ + +static once_flag_t arc4_key_inited; +static thread_key_t arc4_key = THREAD_KEY_INIT; + +/** + * Create the thread-local random stream key, once. + */ +static void +arc4_key_init(void) +{ + if (-1 == thread_local_key_create(&arc4_key, THREAD_LOCAL_KEEP)) + s_error("cannot initialize ARC4 random stream key: %m"); +} + +/** + * Get suitable thread-local random stream. + */ +static struct arc4_stream * +arc4_stream(void) +{ + struct arc4_stream *as; + + ONCE_FLAG_RUN(arc4_key_inited, arc4_key_init); + + as = thread_local_get(arc4_key); + + if G_UNLIKELY(NULL == as) { + /* + * The random stream is kept for each created thread and is never freed. + */ + + OMALLOC0(as); + arc4_init(as); + arc4_stir(as); + thread_local_set(arc4_key, as); + } + + return as; +} + +/** + * @return a new 32-bit random number (from thread-local stream). + */ +uint32 G_HOT +arc4_thread_rand(void) +{ + return arc4_getword(arc4_stream()); +} + +/** + * @return 64-bit random number (from thread-local stream). + */ +uint64 +arc4_thread_rand64(void) +{ + struct arc4_stream *as = arc4_stream(); + uint32 hi, lo; + + hi = arc4_getword(as); + lo = arc4_getword(as); + + return ((uint64) hi << 32) | (uint64) lo; +} + +/** + * Supply additional randomness to the thread-local pool. + * + * @param dat pointer to a buffer containing random data + * @param datlen length of the buffer + */ +void +arc4_thread_addrandom(const unsigned char *dat, int datlen) +{ + g_assert(dat != NULL); + g_assert(datlen > 0); + + arc4_addrandom(arc4_stream(), dat, datlen); +} + +/** + * @return a list of thread IDs using a thread-local ARC4 pool, which must + * be freed with pslist_free(). + */ +pslist_t * +arc4_users(void) +{ + ONCE_FLAG_RUN(arc4_key_inited, arc4_key_init); + + return thread_local_users(arc4_key); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/arc4random.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/arc4random.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Raphael Manfredi + * Copyright (c) 2010, 2013 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -25,10 +25,10 @@ * @ingroup lib * @file * - * Arc4 random number generator. + * ARC4 random number generator. * * @author Raphael Manfredi - * @date 2010 + * @date 2010, 2013 */ #ifndef _arc4random_h_ @@ -37,11 +37,23 @@ #include "common.h" #ifndef HAS_ARC4RANDOM -guint32 arc4random(void); +uint32 arc4random(void); void arc4random_stir(void); void arc4random_addrandom(const unsigned char *dat, int datlen); #endif +void arc4random_stir_once(void); +uint64 arc4random64(void); + +/* + * ARC4 random numbers using thread-local stream. + */ + +uint32 arc4_thread_rand(void); +uint64 arc4_thread_rand64(void); +void arc4_thread_addrandom(const unsigned char *dat, int datlen); +struct pslist *arc4_users(void); + #endif /* _arc4random_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/argv.c
Added
@@ -0,0 +1,105 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Argument vector utilities. + * + * An argument vector is an array of strings terminated by a NULL pointer, + * and can be represented by a single "char **argv" variable in its most + * generic form, or "char *argv" at times, which is a "char * const *argv". + * + * @author Raphael Manfredi + * @date 2015 + */ + +#include "common.h" + +#include "argv.h" + +#include "halloc.h" + +#include "override.h" /* Must be the last header included */ + +/** + * Create an argv array that must be later freed via argv_free_null(). + * + * @param arg the first mandatory item in the argv array + * @param ap the optional list of additional values + * + * @return a new vector of strings, NULL-terminated. + */ +char ** +argv_create(const char *arg, va_list ap) +{ + const char **argv, **a; + va_list ap2; + const char *s; + size_t cnt = 0; + + /* + * Count amount of additional arguments, past `arg'. + */ + + VA_COPY(ap2, ap); + while (NULL != va_arg(ap2, const char *)) + cnt++; + va_end(ap2); + + /* + * Build argv dynamically. + */ + + HALLOC_ARRAY(argv, cnt + 2); /* +2 for arg and NULL */ + a = argv; + + *a++ = arg; /* argv0 */ + + while (NULL != ((s = va_arg(ap, const char *)))) { + *a++ = s; + } + + g_assert(ptr_diff(a, argv) == (cnt + 1) * sizeof argv0); + + *a = NULL; /* Last item is the argv sentinel */ + + return deconstify_pointer(argv); +} + +/** + * Free memory allocated by argv_create() and nullify pointer. + */ +void +argv_free_null(char ***argv_ptr) +{ + char **argv = *argv_ptr; + + if (argv != NULL) { + hfree(argv); + *argv_ptr = NULL; + } +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/argv.h
Added
@@ -0,0 +1,46 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Argument vector utilities. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#ifndef _argv_h_ +#define _argv_h_ + +/* + * Public interface. + */ + +char **argv_create(const char *arg, va_list ap); +void argv_free_null(char ***argv_ptr); + +#endif /* _argv_h_ */ + +/* vi: set ts=4: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/array_util.h
Added
@@ -0,0 +1,141 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Low-level array insertion and removal macros. + * + * These macros are used to insert, remove or make room for insertion at + * a given array index. The array is simply a plain memory region storing + * each item contiguously in slots, all slots being equally-sized. + * + * There is no metadata attached to these arrays, which is why the macros + * defined here all take a size parameter to specify how many items are held + * in the memory region. + * + * Using these macros to handle insertion and removal from arrays factorizes + * code and prevents typos, since some consistency is required between the + * array name and the sizeof() call for instance. They also add assertions to + * dynamically ensure that the indices are correct with respect to the array + * shape (capacity or current amount of items). + * + * @author Raphael Manfredi + * @date 2014 + */ + +#ifndef _array_util_h_ +#define _array_util_h_ + +/** + * Remove item 'i' from an array of 'n' items (before removal). + * + * When the removed item is not the last one in the array, all subsequent + * items are moved back to fill the hole created by that removed item. + */ +#define ARRAY_REMOVE(ary,i,n) G_STMT_START { \ + g_assert_log((size_t) (i) < (size_t) (n), \ + "%s(): index %zu out of array %s%zu", \ + G_STRFUNC, (size_t) (i), \ + # ary, (size_t) (n)); \ + if G_LIKELY((i) != (n) - 1) { \ + memmove(&aryi, &ary(i) + 1, \ + ((n) - 1 - (i)) * sizeof ary0); \ + } \ +} G_STMT_END + +/** + * Remove item 'i' from an array of 'n' items (before removal), decrementing + * the 'n' argument by one in the process. + * + * When the removed item is not the last one in the array, all subsequent + * items are moved back to fill the hole created by that removed item. + */ +#define ARRAY_REMOVE_DEC(ary,i,n) G_STMT_START { \ + (n)--; \ + g_assert_log((size_t) (i) <= (size_t) (n), \ + "%s(): index %zu out of array %s%zu", \ + G_STRFUNC, (size_t) (i), \ + # ary, (size_t) (n) + 1); \ + if G_LIKELY((i) != (n)) { \ + memmove(&aryi, &ary(i) + 1, \ + ((n) - (i)) * sizeof ary0); \ + } \ +} G_STMT_END + +/** + * Insert value at item 'i' within array of 'n' slots (extended before). + * + * When the item is not inserted as the last one in the array, all subsequent + * items are shifted to make space for the insertion. + * + * The value may be a structure, in which case we rely on the compiler to + * perform the struct copy into the array slot. + */ +#define ARRAY_INSERT(ary,i,n,val) G_STMT_START { \ + g_assert_log((size_t) (i) < (size_t) (n), \ + "%s(): index %zu out of array %s%zu", \ + G_STRFUNC, (size_t) (i), \ + # ary, (size_t) (n)); \ + if G_LIKELY((i) != (n) - 1) { \ + memmove(&ary(i) + 1, &aryi, \ + ((n) - 1 - (i)) * sizeof ary0); \ + } \ + aryi = (val); \ +} G_STMT_END + +/** + * Make room for value at slot 'i' within array of 'f' filled slots (0 .. f-1) + * with a total capacity of 'n' slots. + * + * The 'i' slot MUST be in the range (0 .. f), i.e. either an insertion happens + * within the consecutively filled slots, or we are inserting a new item + * right after the last held item, and of course within the array range. + * + * The slot is NOT filled with any value, it is just made available by moving + * all the items at or above the insertion point by one slot. + */ +#define ARRAY_MAKEROOM(ary,i,f,n) G_STMT_START { \ + g_assert_log((size_t) (f) < (size_t) (n), \ + "%s(): array %s%zu already holds %zu items", \ + G_STRFUNC, # ary, (size_t) (n), (size_t) (f)); \ + g_assert_log((size_t) (i) <= (size_t) (f), \ + "%s(): index %zu above fill %zu in array %s%zu", \ + G_STRFUNC, (size_t) (i), (size_t) (f), \ + # ary, (size_t) (n)); \ + if G_LIKELY((i) < (f)) { \ + memmove(&ary(i) + 1, &aryi, \ + ((f) - (i)) * sizeof ary0); \ + } \ +} G_STMT_END + +/** + * Same as ARRAY_MAKEROOM, used when the size of the array is statically known. + */ +#define ARRAY_FIXED_MAKEROOM(ary,i,f) \ + ARRAY_MAKEROOM(ary,(i),(f),N_ITEMS(ary)) + +#endif /* _array_util_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/ascii.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/ascii.c
Changed
@@ -37,6 +37,7 @@ #include "common.h" #include "ascii.h" +#include "hashing.h" #include "misc.h" #include "override.h" /* Must be the last header included */ @@ -52,12 +53,12 @@ if (dst != src) do { - c = (guchar) *src++; + c = (uchar) *src++; *dst++ = ascii_tolower(c); } while (c != '\0'); else do { - c = (guchar) *src++; + c = (uchar) *src++; if (is_ascii_upper(c)) *dst = ascii_tolower(c); dst++; @@ -76,8 +77,8 @@ g_assert(s2 != NULL); do { - a = (guchar) *s1++; - b = (guchar) *s2++; + a = (uchar) *s1++; + b = (uchar) *s2++; if (a != b) { a = ascii_tolower(a); b = ascii_tolower(b); @@ -103,8 +104,8 @@ return 0; do { - a = (guchar) *s1++; - b = (guchar) *s2++; + a = (uchar) *s1++; + b = (uchar) *s2++; if (a != b) { a = ascii_tolower(a); b = ascii_tolower(b); @@ -121,12 +122,12 @@ char * ascii_strcasestr(const char *haystack, const char *needle) { - guint32 delta256; + uint32 delta256; size_t nlen = strlen(needle); - guint32 *pd = delta; + uint32 *pd = delta; size_t i; const char *n; - guint32 haylen = strlen(haystack); + uint32 haylen = strlen(haystack); const char *end = haystack + haylen; char *tp; @@ -142,7 +143,7 @@ nlen--; /* Restore original pattern length */ for (n = needle, i = 0; i < nlen; i++) { - guchar c = *n++; + uchar c = *n++; deltaascii_tolower(c) = nlen - i; } @@ -152,10 +153,10 @@ for (tp = *(char **) &haystack; tp + nlen <= end; /* empty */) { const char *t; - guchar c; + uchar c; for (n = needle, t = tp, i = 0; i < nlen; n++, t++, i++) - if (ascii_tolower((guchar) *n) != ascii_tolower((guchar) *t)) + if (ascii_tolower((uchar) *n) != ascii_tolower((uchar) *t)) break; if (i == nlen) /* Got a match! */ @@ -171,23 +172,23 @@ /** * ASCII case-insensitive string hashing function. */ -guint -ascii_strcase_hash(gconstpointer key) +uint +ascii_strcase_hash(const void *key) { - const guchar *s = key; - gulong c, hash = 0; - + const uchar *s = key; + ulong c, hash = 0; + while ((c = ascii_tolower(*s++))) { - hash ^= (hash << 8) | c; + hash += (hash << 5) + c; } - return hash ^ (((guint64) 1048573 * hash) >> 32); + return integer_hash_fast(hash); } /** * ASCII case-insensitive equality function. */ int -ascii_strcase_eq(gconstpointer a, gconstpointer b) +ascii_strcase_eq(const void *a, const void *b) { return a == b || 0 == ascii_strcasecmp(a, b); } @@ -197,9 +198,9 @@ */ static int strcmp_delimit_full(const char *a, const char *b, - const char *delimitors, gboolean case_sensitive) + const char *delimitors, bool case_sensitive) { - guchar is_delimit(guchar)-1; + uchar is_delimit(uchar)-1; /* * Initialize delimitors. @@ -209,13 +210,13 @@ size_t i; is_delimit0 = TRUE; - for (i = 1; i < G_N_ELEMENTS(is_delimit); i++) { + for (i = 1; i < N_ITEMS(is_delimit); i++) { is_delimiti = FALSE; } } while (*delimitors) { - guchar c = *delimitors++; + uchar c = *delimitors++; is_delimitcase_sensitive ? c : ascii_tolower(c) = TRUE; } @@ -224,7 +225,7 @@ */ for (;;) { - guchar c, d; + uchar c, d; c = *a++; d = *b++;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/ascii.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/ascii.h
Changed
@@ -49,9 +49,9 @@ * @return 0..15 for valid hexadecimal ASCII characters, -1 otherwise. */ static inline ALWAYS_INLINE int -hex2int_inline(guchar c) +hex2int_inline(uchar c) { - extern const gint8 *hex2int_tab; + extern const int8 *hex2int_tab; return hex2int_tabc; } @@ -62,9 +62,9 @@ * @return 0..9 for valid decimal ASCII characters, -1 otherwise. */ static inline ALWAYS_INLINE int -dec2int_inline(guchar c) +dec2int_inline(uchar c) { - extern const gint8 *dec2int_tab; + extern const int8 *dec2int_tab; return dec2int_tabc; } @@ -75,9 +75,9 @@ * @return 0..9 for valid alphanumeric ASCII characters, -1 otherwise. */ static inline ALWAYS_INLINE int -alnum2int_inline(guchar c) +alnum2int_inline(uchar c) { - extern const gint8 *alnum2int_tab; + extern const int8 *alnum2int_tab; return alnum2int_tabc; } @@ -89,85 +89,85 @@ * GLib 2.x has similar macros/functions but defines only a subset. */ -static inline G_GNUC_CONST WARN_UNUSED_RESULT gboolean +static inline G_CONST WARN_UNUSED_RESULT bool is_ascii_blank(int c) { return c == 32 || c == 9; /* space, tab */ } -static inline G_GNUC_CONST WARN_UNUSED_RESULT gboolean +static inline G_CONST WARN_UNUSED_RESULT bool is_ascii_cntrl(int c) { return (c >= 0 && c <= 31) || c == 127; } -static inline G_GNUC_CONST WARN_UNUSED_RESULT gboolean +static inline G_CONST WARN_UNUSED_RESULT bool is_ascii_digit(int c) { return c >= 48 && c <= 57; /* 0-9 */ } -static inline G_GNUC_CONST WARN_UNUSED_RESULT gboolean +static inline G_CONST WARN_UNUSED_RESULT bool is_ascii_xdigit(int c) { return -1 != hex2int_inline(c) && !(c & ~0x7f); } -static inline G_GNUC_CONST WARN_UNUSED_RESULT gboolean +static inline G_CONST WARN_UNUSED_RESULT bool is_ascii_upper(int c) { return c >= 65 && c <= 90; /* A-Z */ } -static inline G_GNUC_CONST WARN_UNUSED_RESULT gboolean +static inline G_CONST WARN_UNUSED_RESULT bool is_ascii_lower(int c) { return c >= 97 && c <= 122; /* a-z */ } -static inline G_GNUC_CONST WARN_UNUSED_RESULT gboolean +static inline G_CONST WARN_UNUSED_RESULT bool is_ascii_alpha(int c) { return is_ascii_upper(c) || is_ascii_lower(c); /* A-Z, a-z */ } -static inline G_GNUC_CONST WARN_UNUSED_RESULT gboolean +static inline G_CONST WARN_UNUSED_RESULT bool is_ascii_alnum(int c) { return -1 != alnum2int_inline(c) && !(c & ~0x7f); /* A-Z, a-z, 0-9 */ } -static inline G_GNUC_CONST WARN_UNUSED_RESULT gboolean +static inline G_CONST WARN_UNUSED_RESULT bool is_ascii_space(int c) { return c == 32 || (c >= 9 && c <= 13); } -static inline G_GNUC_CONST WARN_UNUSED_RESULT gboolean +static inline G_CONST WARN_UNUSED_RESULT bool is_ascii_graph(int c) { return c >= 33 && c <= 126; } -static inline G_GNUC_CONST WARN_UNUSED_RESULT gboolean +static inline G_CONST WARN_UNUSED_RESULT bool is_ascii_print(int c) { return is_ascii_graph(c) || c == 32; } -static inline G_GNUC_CONST WARN_UNUSED_RESULT gboolean +static inline G_CONST WARN_UNUSED_RESULT bool is_ascii_punct(int c) { return c >= 33 && c <= 126 && !is_ascii_alnum(c); } -static inline G_GNUC_CONST WARN_UNUSED_RESULT int +static inline G_CONST WARN_UNUSED_RESULT int ascii_toupper(int c) { return is_ascii_lower(c) ? c - 32 : c; } -static inline G_GNUC_CONST WARN_UNUSED_RESULT int +static inline G_CONST WARN_UNUSED_RESULT int ascii_tolower(int c) { return is_ascii_upper(c) ? c + 32 : c; @@ -178,7 +178,7 @@ * * @return a pointer to the first non-space character starting from s. */ -static inline G_GNUC_PURE WARN_UNUSED_RESULT char * +static inline G_PURE WARN_UNUSED_RESULT char * skip_ascii_spaces(const char *s) { while (is_ascii_space(*s)) @@ -192,7 +192,7 @@ * * @return a pointer to the first space or NUL character starting from s. */ -static inline G_GNUC_PURE WARN_UNUSED_RESULT char * +static inline G_PURE WARN_UNUSED_RESULT char * skip_ascii_non_spaces(const char *s) { while ('\0' != *s && !is_ascii_space(*s)) @@ -208,7 +208,7 @@ * @return a pointer to the first non-alphanumerical or NUL character * starting from s. */ -static inline G_GNUC_PURE WARN_UNUSED_RESULT char * +static inline G_PURE WARN_UNUSED_RESULT char * skip_ascii_alnum(const char *s) { while (is_ascii_alnum(*s)) @@ -222,7 +222,7 @@ * * @return A pointer to the first non-blank character starting from s. */ -static inline G_GNUC_PURE WARN_UNUSED_RESULT char * +static inline G_PURE WARN_UNUSED_RESULT char * skip_ascii_blanks(const char *s) { while (is_ascii_blank(*s)) @@ -238,8 +238,8 @@ int ascii_strcmp_delimit(const char *a, const char *b, const char *delimit); size_t ascii_chomp_trailing_spaces(char *str, size_t len); -guint ascii_strcase_hash(gconstpointer key); -int ascii_strcase_eq(gconstpointer a, gconstpointer b); +uint ascii_strcase_hash(const void *key); +int ascii_strcase_eq(const void *a, const void *b); #endif /* _ascii_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/atio.c
Added
@@ -0,0 +1,138 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Atomic (respective to other threads) I/O operations. + * + * On linux (and maybe other flavours of UNIX), the write() and writev() + * operations are not atomic in a multi-threaded environment, which is a + * problem when emitting logs to stdout/stderr or other files that we have + * not opened or for which we cannot know whether O_APPEND was specified. + * + * The application-level option to guarantee no log mixing is therefore to + * use locks to protect the I/O operations. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#include "atio.h" +#include "hashing.h" +#include "pow2.h" +#include "spinlock.h" + +#include "override.h" /* Must be the last header included */ + +/* + * To avoid too much lock contention between separate file descriptors, + * we use an array of spinlocks to create the critical sections. The actual + * spinlock to use is obtained by hashing the file descriptor and then indexing + * within that array. + */ +static spinlock_t atio_access = { + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 4 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 8 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 12 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 16 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 20 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 24 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 28 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 32 */ +}; + +#define ATIO_HASH_MASK (N_ITEMS(atio_access) - 1) + +/* + * Get spinlock to use based on file descriptor. + */ +static inline spinlock_t * +atio_get_lock(int fd) +{ + STATIC_ASSERT(IS_POWER_OF_2(ATIO_HASH_MASK + 1)); + + return &atio_accessinteger_hash_fast(fd) & ATIO_HASH_MASK; +} + +/** + * Perform an atomic write(). + */ +ssize_t +atio_write(int fd, const void *buf, size_t count) +{ + ssize_t w; + spinlock_t *l = atio_get_lock(fd); + + /* + * We use raw spinlocks here to avoid any complication with spinlock_loop(). + * Indeed, atomic write operations are conducted from the logging layer + * during critical messages, and we know by design that no deadlock can + * occur on these locks. Therefore, even if the lock operation was + * delayed for some reason, we don't want to pollute the output with more + * messages about a possible deadlock that we know cannot be. + */ + + spinlock_raw(l); + w = write(fd, buf, count); + spinunlock_raw(l); + + return w; +} + +/** + * Perform an atomic writev(). + */ +ssize_t +atio_writev(int fd, const iovec_t *iov, int iovcnt) +{ + ssize_t w; + spinlock_t *l = atio_get_lock(fd); + + spinlock_raw(l); + w = writev(fd, iov, iovcnt); + spinunlock_raw(l); + + return w; +} + +/** + * Perform an atomic fwrite(). + */ +size_t +atio_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *f) +{ + size_t w; + spinlock_t *l = atio_get_lock(fileno(f)); + + spinlock_raw(l); + w = fwrite(ptr, size, nmemb, f); + spinunlock_raw(l); + + return w; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/atio.h
Added
@@ -0,0 +1,49 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Atomic (respective to other threads) I/O operations. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#ifndef _atio_h_ +#define _atio_h_ + +#include "common.h" /* For struct iovec */ + +/* + * Public interface. + */ + +ssize_t atio_write(int fd, const void *buf, size_t count); +ssize_t atio_writev(int fd, const iovec_t *iov, int iovcnt); +size_t atio_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *f); + +#endif /* _atio_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/atomic.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/atomic.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Raphael Manfredi + * Copyright (c) 2011, 2013 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -31,7 +31,7 @@ * and mutexes. * * @author Raphael Manfredi - * @date 2011 + * @date 2011, 2013 */ #ifndef _atomic_h_ @@ -40,6 +40,14 @@ #include "common.h" /* + * To avoid mistakes, the "volatile" attribute is made part of the typedef: + * no access to the lock memory location should be optimized by the compiler, + * or we might loop forever. + */ + +typedef volatile uint8 atomic_lock_t; + +/* * Public interface. */ @@ -47,52 +55,138 @@ #define atomic_mb() __sync_synchronize() #define atomic_ops_available() 1 -static inline ALWAYS_INLINE gboolean -atomic_test_and_set(volatile int *p) +static inline ALWAYS_INLINE void +atomic_release(atomic_lock_t *p) { + /* Prefer this to __sync_lock_release(p) which is obscurely documented */ + *p = 0; + atomic_mb(); +} + +static inline ALWAYS_INLINE bool +atomic_test_and_set(atomic_lock_t *p) { - return __sync_bool_compare_and_swap((p), 0, 1); + return __sync_bool_compare_and_swap(p, 0, 1); } -static inline ALWAYS_INLINE void +static inline ALWAYS_INLINE int atomic_int_inc(int *p) { - (void) __sync_fetch_and_add(p, 1); + return __sync_fetch_and_add(p, 1); /* Previous value */ } -static inline ALWAYS_INLINE void +static inline ALWAYS_INLINE int +atomic_int_dec(int *p) +{ + return __sync_fetch_and_sub(p, 1); /* Previous value */ +} + +static inline ALWAYS_INLINE uint atomic_uint_inc(unsigned *p) { - (void) __sync_fetch_and_add(p, 1); + return __sync_fetch_and_add(p, 1); /* Previous value */ +} + +static inline ALWAYS_INLINE uint +atomic_uint_dec(unsigned *p) +{ + return __sync_fetch_and_sub(p, 1); /* Previous value */ } -static inline ALWAYS_INLINE gboolean +static inline ALWAYS_INLINE bool atomic_int_dec_is_zero(int *p) { return 1 == __sync_fetch_and_sub(p, 1); } -static inline ALWAYS_INLINE gboolean +static inline ALWAYS_INLINE bool atomic_uint_dec_is_zero(unsigned *p) { return 1 == __sync_fetch_and_sub(p, 1); } -#else /* !HAS_SYNC_ATOMIC */ -#define atomic_mb() (void) 0 -static inline gboolean -atomic_test_and_set(volatile int *p) +static inline ALWAYS_INLINE bool +atomic_int_xchg_if_eq(int *p, int ov, int nv) +{ + return __sync_bool_compare_and_swap(p, ov, nv); +} + +static inline ALWAYS_INLINE bool +atomic_uint_xchg_if_eq(uint *p, uint ov, uint nv) +{ + return __sync_bool_compare_and_swap(p, ov, nv); +} + +static inline ALWAYS_INLINE bool +atomic_ptr_xchg_if_eq(void **p, void *ov, void *nv) { - int ok; - if ((ok = (0 == *(p)))) - *(p) = 1; - return ok; + return __sync_bool_compare_and_swap(p, ov, nv); } -#define atomic_int_inc(p) ((*(p))++) -#define atomic_uint_inc(p) ((*(p))++) +/* + * These can be used on "opaque" types like sig_atomic_t + * Otherwise, use the type-safe inline routines whenever possible. + * + * The ATOMIC_INC() and ATOMIC_DEC() macros return the previous value. + */ + +#define ATOMIC_INC(p) __sync_fetch_and_add(p, 1) +#define ATOMIC_DEC(p) __sync_fetch_and_sub(p, 1) +#define ATOMIC_GET(p) (atomic_mb(), *(p)) +#define ATOMIC_SET(p,v) (*(p) = (v), atomic_mb()) +#define ATOMIC_ADD(p,v) __sync_fetch_and_add(p, v) +#define ATOMIC_SUB(p,v) __sync_fetch_and_sub(p, v) + +#else /* !HAS_SYNC_ATOMIC */ + +#define atomic_mb() (void) 0 + +#define ATOMIC_INC(p) ((*(p))++) +#define ATOMIC_DEC(p) ((*(p))--) +#define ATOMIC_GET(p) (*(p)) +#define ATOMIC_SET(p,v) (*(p) = (v)) +#define ATOMIC_ADD(p,v) (*(p) += (v)) +#define ATOMIC_SUB(p,v) (*(p) -= (v)) + +#define atomic_int_inc(p) ((*(p))++) /* Previous value */ +#define atomic_int_dec(p) ((*(p))--) /* Previous value */ +#define atomic_uint_inc(p) ((*(p))++) /* Previous value */ +#define atomic_uint_dec(p) ((*(p))--) /* Previous value */ #define atomic_int_dec_is_zero(p) (0 == --(*(p))) #define atomic_uint_dec_is_zero(p) (0 == --(*(p))) +#define atomic_release(p) (*(p) = 0) #define atomic_ops_available() 0 + +#define ATOMIC_XCHG_IF_EQ(ptr, oldval, newval) \ + bool ok; \ + if ((ok = ((oldval) == *(ptr)))) \ + *(ptr) = (newval); \ + return ok; \ + + +static inline bool +atomic_test_and_set(atomic_lock_t *p) +{ + ATOMIC_XCHG_IF_EQ(p, 0, 1); +} + +static inline bool +atomic_int_xchg_if_eq(int *p, int ov, int nv) +{ + ATOMIC_XCHG_IF_EQ(p, ov, nv); +} + +static inline bool +atomic_uint_xchg_if_eq(uint *p, uint ov, uint nv) +{ + ATOMIC_XCHG_IF_EQ(p, ov, nv); +} + +static inline bool +atomic_ptr_xchg_if_eq(void **p, void *ov, void *nv) +{ + ATOMIC_XCHG_IF_EQ(p, ov, nv); +} + #endif /* HAS_SYNC_ATOMIC */ /** @@ -100,13 +194,196 @@ * * @return TRUE if lock was acquired. */ -static inline gboolean -atomic_acquire(volatile int *lock) +static inline bool +atomic_acquire(atomic_lock_t *lock) { - atomic_mb(); + /* + * Our locking protocol issues a memory barrier after a lock has been + * released, to make sure the changes to the locking object are widely + * visible to all processors. + * + * Therefore, it is not necessary to issue a memory barrier here. + */ + return atomic_test_and_set(lock); } +static inline ALWAYS_INLINE bool +atomic_bool_get(const bool *p) +{ + atomic_mb(); + return *p; +} + +static inline ALWAYS_INLINE void +atomic_bool_set(bool *p, bool v) +{ + *p = v; + atomic_mb(); +} + +static inline ALWAYS_INLINE int +atomic_int_get(const int *p) +{ + atomic_mb(); + return *p; +} + +static inline ALWAYS_INLINE void +atomic_int_set(int *p, int v) +{ + *p = v; + atomic_mb(); +} + +static inline ALWAYS_INLINE uint +atomic_uint_get(const uint *p) +{ + atomic_mb(); + return *p; +} + +static inline ALWAYS_INLINE void +atomic_uint_set(uint *p, uint v) +{ + *p = v; + atomic_mb(); +} + +/*** + *** Atomic 64-bit counters. + *** + *** These are convenience macros allowing us to safely handle 64-bit atomic + *** operations on 32-bit machines. + *** + *** AU64() is a macro to define atomic 64-bit fields. + *** AU64_INC() and AU64_DEC() can atomically increment or decrement counters. + *** AU64_VALUE() atomically reads the 64-bit counter. + ***/ + +#if 4 == LONGSIZE +/* + * On a 32-bit machine, the 64-bit count is split between a "lo" and a "hi" + * 32-bit counter, being updated atomically using 32-bit operations on each + * counter. + */ + +#define AU64(x) uint x ## _lo; uint x ## _hi + +#define AU64_INC(x) G_STMT_START { \ + if G_UNLIKELY(-1U == atomic_uint_inc(x ## _lo)) \ + atomic_uint_inc(x ## _hi); \ +} G_STMT_END + +#define AU64_DEC(x) G_STMT_START { \ + if G_UNLIKELY(0 == atomic_uint_dec(x ## _lo)) \ + atomic_uint_dec(x ## _hi); \ +} G_STMT_END + +/** + * Assemble 64-bit value from the high and low 32-bit parts of the counter. + * + * @param hi pointer to the high 32-bit part + * @param lo pointer to the low 32-bit part + * + * @return 64-bit value reconstructed from two 32-bit counters which are + * atomically updated. + */ +static inline uint64 +au64_value(const uint volatile *hi, const uint volatile *lo) +{ + uint64 v; + register uint low, low2, high, high2; + + atomic_mb(); + low = *lo; high = *hi; + +retry: + v = (((uint64) high) << 32) + low; + + /* + * If `low' is within a zone at risk, where fast increments or decrements + * could modify the high counter, then re-read and update value. + */ + + if G_LIKELY(low > 0x1000 && low < 0xfffff000) + return v; + + atomic_mb(); + low2 = *lo; high2 = *hi; + + if G_LIKELY(low2 == low && high2 == high) + return v; + + low = low2; high = high2; + goto retry; +} + +/** + * Add value to a 64-bit counter split between high and low 32-bit parts. + * + * @param hi pointer to the high 32-bit part + * @param lo pointer to the low 32-bit part + * @param value value to add to the counter. + */ +static inline void +au64_add(uint *hi, uint *lo, long value) +{ + register uint low; + + g_assert(value >= 0); + g_assert(UNSIGNED(value) < MAX_INT_VAL(uint)); + + low = ATOMIC_ADD(lo, value); + if G_UNLIKELY(*lo < low) + atomic_uint_inc(hi); /* Carry */ +} + +/** + * Substract value to a 64-bit counter split between high and low 32-bit parts. + * + * @param hi pointer to the high 32-bit part + * @param lo pointer to the low 32-bit part + * @param value value to substract to the counter. + */ +static inline void +au64_sub(uint *hi, uint *lo, long value) +{ + register uint low; + + g_assert(value >= 0); + g_assert(UNSIGNED(value) < MAX_INT_VAL(uint)); + + low = ATOMIC_SUB(lo, value); + if G_UNLIKELY(*lo > low) + atomic_uint_dec(hi); /* Carry */ +} + +#define AU64_ADD(x,v) au64_add(x ## _hi, x ## _lo, v) +#define AU64_SUB(x,v) au64_sub(x ## _hi, x ## _lo, v) +#define AU64_VALUE(x) au64_value(x ## _hi, x ## _lo) + +#elif 8 == LONGSIZE +/* + * On 64-bit machines, we can expect atomic operations on 64-bit quantities. + * + * We append the _64 token to make sure these fields are only handled through + * the following macros and not as plain uint64 variables because that would + * not work on 32-bit platforms and we want to catch the potential error even + * when compiling on 64-bit machines. + */ + +#define AU64(x) uint64 x ## _64 +#define AU64_INC(x) ATOMIC_INC(x ## _64) +#define AU64_DEC(x) ATOMIC_DEC(x ## _64) +#define AU64_ADD(x,v) ATOMIC_ADD(x ## _64, v) +#define AU64_SUB(x,v) ATOMIC_SUB(x ## _64, v) +#define AU64_VALUE(x) (atomic_mb(), *(x ## _64)) + +#else +#error "unexpected value for LONGSIZE" +#endif + #endif /* _atomic_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/atoms.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/atoms.c
Changed
@@ -39,7 +39,22 @@ #include "common.h" #include "atoms.h" +#include "buf.h" +#include "constants.h" #include "endian.h" +#include "hashing.h" +#include "htable.h" +#include "log.h" +#include "misc.h" +#include "omalloc.h" +#include "once.h" +#include "spinlock.h" +#include "str.h" +#include "stringify.h" +#include "walloc.h" +#include "xmalloc.h" + +#include "override.h" /* Must be the last header included */ #if 0 #define PROTECT_ATOMS @@ -54,12 +69,6 @@ * be modified accidently. This is achieved through mprotect(). The CPU * overhead is significant and there is also some memory overhead but it's * sufficiently low for testing/debugging purposes. - * - * TODO: Separate the reference counter (refcount) from the atom itself. - * This would heavily the reduce the amount of mprotect() calls and - * also reduce the memory overhead. - * We could possibly use the value which we insert into the global - * hashtable as reference counter. */ #ifdef ATOMS_HAVE_MAGIC @@ -69,51 +78,126 @@ #define ATOM_MAGIC_CHECK(a) g_assert(ATOM_MAGIC == (a)->magic) #define ATOM_SET_MAGIC(a) G_STMT_START { (a)->magic = ATOM_MAGIC; } G_STMT_END +#define ATOM_CLEAR_MAGIC(a) G_STMT_START { (a)->magic = 0; } G_STMT_END #else #define ATOM_MAGIC_CHECK(a) #define ATOM_SET_MAGIC(a) +#define ATOM_CLEAR_MAGIC(a) #endif /* ATOMS_HAVE_MAGIC */ - -#include "stringify.h" -#include "glib-missing.h" -#include "log.h" -#include "walloc.h" -#include "xmalloc.h" - -#include "override.h" /* Must be the last header included */ - union mem_chunk { void *next; char alignMEM_ALIGNBYTES; }; -#define ATOM_TYPE_MASK ((size_t) 0x07) - /** * Atoms are ref-counted. * - * The reference count is held at the beginning of the data arena. * What we return to the outside is the value of atom_arena(), not a * pointer to the atom structure. + * + * The reference count is not held in the atom header but is stored in the + * hash table tracking atoms of a given type, to limit the memory overhead, + * and mprotect() overhead when compiling with PROTECT_ATOMS. */ typedef struct atom { #ifdef ATOMS_HAVE_MAGIC atom_prot_magic_t magic; /**< Magic should be at the beginning */ #endif /* ATOM_HAVE_MAGIC */ - int refcnt; /**< Amount of references */ #ifdef TRACK_ATOMS - GHashTable *get; /**< Allocation spots */ - GHashTable *free; /**< Free spots */ -#endif + htable_t *get; /**< Allocation spots */ + htable_t *free; /**< Free spots */ + spinlock_t lock; /**< Thread-safety lock */ + size_t trackcnt; /**< Tracking count (reference count) */ +#endif /* TRACK_ATOMS */ } atom_t; #define ARENA_OFFSET \ (MEM_ALIGNBYTES * ((sizeof(atom_t) / MEM_ALIGNBYTES) + \ ((sizeof(atom_t) % MEM_ALIGNBYTES) ? 1 : 0))) +/* + * On 32-bit machines, the size and reference counts of atoms are stored as + * values in the atom hash table. + * + * On 64-bit machines, the size and reference counts are encoded in the + * pointer field. + * + * The atom size is therefore limited to 4 GiB, which is a reasonable upper + * limit given that each time the atom is requested, we need to hash it. + */ + +#define ATOM_SIZE_MAX 0xffffffffU + +/* + * Atom information on 32-bit machines, stored in the hash table. + */ +struct atom_info { + size_t len; /**< Atom length */ + int refcnt; /**< Reference count */ +}; + +/* + * On 64-bit machines: + * + * - the size is stored in the upper 32 bits of the atom's hash table + * 64-bit value + * - the reference count is held in the lower 32 bits of that value. + * + * This allows us to simply increment or decrement the whole value to account + * for reference changes made to the atom. + */ + +#if PTRSIZE > 4 +#define ATOM_LENGTH(x) ((x) >> 32) +#define ATOM_REFCNT(x) ((x) & ATOM_SIZE_MAX) +#define ATOM_INFO(l) ((l) << 32) +#else /* PTRSIZE <= 4 */ +/* + * Make sure this unreachable code on 32-bit machines does not trigger + * compilation warnings, and is indeed unreacheable. + */ +#define ATOM_LENGTH(x) (s_error_expr("unused code called"), ATOM_SIZE_MAX) +#define ATOM_REFCNT(x) (s_error_expr("unused code called"), 0) +#define ATOM_INFO(x) (s_error_expr("unused code called"), 0) +#endif /* PTRSIZE > 4 */ + +/** + * Return the atom's length from the information stored in the hash table. + */ +static inline size_t +atom_info_length(void *p) +{ + if (4 == sizeof p) { + /* 32-bit machine, value is a pointer to a struct atom_info */ + struct atom_info *ai = p; + return ai->len; + } else { + /* 64-bit machine, value is encoded */ + return ATOM_LENGTH(pointer_to_ulong(p)); + } +} + +/** + * Return the atom's reference count from the information stored in + * the hash table. + */ +static inline int +atom_info_refcnt(void *p) +{ + if (4 == sizeof p) { + /* 32-bit machine, value is a pointer to a struct atom_info */ + struct atom_info *ai = p; + return ai->refcnt; + } else { + /* 64-bit machine, value is encoded */ + return ATOM_REFCNT(pointer_to_ulong(p)); + } +} + + static inline atom_t * -atom_from_arena(gconstpointer key) +atom_from_arena(const void *key) { return (atom_t *) (((char *) key) - ARENA_OFFSET); } @@ -131,12 +215,60 @@ ATOM_MAGIC_CHECK(a); } +static once_flag_t atoms_inited; + +#ifdef TRACK_ATOMS +static spinlock_t atom_track_slk = SPINLOCK_INIT; + +static inline void +ATOM_TRACK_IS_LOCKED(void) +{ + g_assert(spinlock_is_held(&atom_track_slk)); +} + +static inline void +ATOM_ZERO(atom_t *a) +{ + a->get = a->free = NULL; + a->trackcnt = 1; + ZERO(&a->lock); +} + +static inline void +ATOM_TRACK_REFCNT(const void *key, int delta, size_t refcnt) +{ + atom_t *a = atom_from_arena(key); + + /* + * The table where the atoms lies is locked, no need to use atomic ops + * to update the tracking count. + */ + + a->trackcnt += delta; + + /* + * Ensure our tracking count is always the same as the atom's refcount. + */ + + g_assert_log(refcnt == a->trackcnt, + "refcnt=%zu, a->trackcnt=%zu", refcnt, a->trackcnt); +} +#else /* !TRACK_ATOMS */ +#define ATOM_TRACK_IS_LOCKED() +#define ATOM_ZERO(a) +#define ATOM_TRACK_REFCNT(k,d,r) (void) r +#endif /* TRACK_ATOMS */ + #ifdef PROTECT_ATOMS struct mem_pool { union mem_chunk chunks1; }; +#define MEM_CACHE_LOCK(m) spinlock(&(m)->lock) +#define MEM_CACHE_UNLOCK(m) spinunlock(&(m)->lock) + struct mem_cache { + spinlock_t lock; /**< Thread safety */ struct mem_pool **pools; /**< Dynamic array */ union mem_chunk *avail; /**< First available chunk */ size_t num_pools; /**< Element count of ``pools''. */ @@ -149,28 +281,25 @@ static struct mem_pool * mem_pool_new(size_t size, size_t hold) { - struct mem_pool *mp; - size_t len, ps; - - g_assert(size >= sizeof mp->chunks0); - g_assert(0 == size % sizeof mp->chunks0); - g_assert(hold > 0); - - ps = compat_pagesize(); - len = hold * size; - - mp = vmm_core_alloc(len); - if (mp) { - size_t i, step = size / sizeof mp->chunks0; - + struct mem_pool *mp; + size_t len; + size_t i, step = size / sizeof mp->chunks0; + + g_assert(size >= sizeof mp->chunks0); + g_assert(0 == size % sizeof mp->chunks0); + g_assert(hold > 0); + + len = hold * size; + + mp = vmm_core_alloc(len); + for (i = 0; hold-- > 1; i += step) { - mp->chunksi.next = &mp->chunksi + step; + mp->chunksi.next = &mp->chunksi + step; } - mp->chunksi.next = NULL; - } + mp->chunksi.next = NULL; - return mp; + return mp; } /** @@ -181,21 +310,19 @@ static struct mem_cache * mem_new(size_t size) { - struct mem_cache *mc; + struct mem_cache *mc; - g_assert(size > 0); - - mc = xpmalloc(sizeof *mc); - if (mc) { - union mem_chunk chunk; - - mc->size = round_size(sizeof chunk, size); - mc->hold = MAX(1, compat_pagesize() / mc->size); - mc->num_pools = 0; - mc->avail = NULL; - mc->pools = NULL; - } - return mc; + g_assert(size > 0); + + OMALLOC(mc); + spinlock_init(&mc->lock); + mc->size = round_size(sizeof(union mem_chunk), size); + mc->hold = MAX(1, compat_pagesize() / mc->size); + mc->num_pools = 0; + mc->avail = NULL; + mc->pools = NULL; + + return mc; } /** @@ -204,51 +331,47 @@ static void * mem_alloc(struct mem_cache *mc) { - void *p; - - g_assert(mc); - - if (NULL != (p = mc->avail)) { - mc->avail = mc->avail->next; - } else { - struct mem_pool *mp; - - mp = mem_pool_new(mc->size, mc->hold); - if (mp) { - void *q; - - q = xprealloc(mc->pools, (1 + mc->num_pools) * sizeof mc->pools0); - if (q) { - mc->pools = q; - mc->poolsmc->num_pools++ = mp; - - mc->avail = &mp->chunks0; - p = mc->avail; - mc->avail = mc->avail->next; - } else { - vmm_core_free(mp, compat_pagesize() * mc->hold); - } - } - } - - return p; + void *p; + + g_assert(mc); + + MEM_CACHE_LOCK(mc); + + if (NULL != (p = mc->avail)) { + mc->avail = mc->avail->next; + } else { + struct mem_pool *mp; + + mp = mem_pool_new(mc->size, mc->hold); + XREALLOC_ARRAY(mc->pools, 1 + mc->num_pools); + mc->poolsmc->num_pools++ = mp; + mc->avail = &mp->chunks0; + p = mc->avail; + mc->avail = mc->avail->next; + } + + MEM_CACHE_UNLOCK(mc); + + return p; } /** * This does not really "free" the chunk at ``p'' but pushes it back to - * the mem cache and thus makes it available again for mem_alloc(). + * the mem cache and thus makes it available again for mem_alloc(). */ static void mem_free(struct mem_cache *mc, void *p) { - g_assert(mc); + g_assert(mc); + + if (p) { + union mem_chunk *c = p; - if (p) { - union mem_chunk *c = p; - - c->next = mc->avail; - mc->avail = c; - } + MEM_CACHE_LOCK(mc); + c->next = mc->avail; + mc->avail = c; + MEM_CACHE_UNLOCK(mc); + } } /** @@ -257,9 +380,9 @@ static struct mem_cache * atom_get_mc(size_t size) { - guint i; + uint i; - for (i = 0; i < G_N_ELEMENTS(mem_cache); i++) { + for (i = 0; i < N_ITEMS(mem_cache); i++) { if (size <= mem_cachei->size) return mem_cachei; } @@ -271,9 +394,9 @@ * @note All pages partially overlapped by the chunk will be affected. */ static inline void -mem_protect(gpointer ptr, size_t size) +mem_protect(void *ptr, size_t size) { - gpointer p; + void *p; size_t ps; ps = compat_pagesize(); @@ -281,8 +404,8 @@ size = round_size(ps, size); if (-1 == mprotect(p, size, PROT_READ)) - s_warning("mem_protect: mprotect(%p, %u, PROT_READ) failed: %m", - p, size); + s_warning("%s(): mprotect(%p, %zu, PROT_READ) failed: %m", + G_STRFUNC, p, size); } /** @@ -290,9 +413,9 @@ * @note All pages partially overlapped by the chunk will be affected. */ static inline void -mem_unprotect(gpointer ptr, size_t size) +mem_unprotect(void *ptr, size_t size) { - gpointer p; + void *p; size_t ps; ps = compat_pagesize(); @@ -300,8 +423,8 @@ size = round_size(ps, size); if (-1 == mprotect(p, size, PROT_READ | PROT_WRITE)) - s_warning("mem_unprotect: mprotect(%p, %u, PROT_RDWR) failed: %m", - p, size); + s_warning("%s(): mprotect(%p, %zu, PROT_RDWR) failed: %m", + G_STRFUNC, p, size); } /** @@ -346,6 +469,7 @@ a = vmm_alloc(size); } ATOM_SET_MAGIC(a); + ATOM_ZERO(a); return a; } @@ -380,80 +504,121 @@ VMM_FREE_NULL(a, size); } } -#else +#else /* !PROTECT_ATOMS */ -#define atom_protect(a, size) -#define atom_unprotect(a, size) +#define atom_protect(a, size) ATOM_MAGIC_CHECK(a) +#define atom_unprotect(a, size) ATOM_MAGIC_CHECK(a) static inline atom_t * atom_alloc(size_t size) { atom_t *a = walloc(size); - return a; + ATOM_SET_MAGIC(a); + ATOM_ZERO(a); + return a; } static inline void atom_dealloc(atom_t *a, size_t size) { + atom_check(a); + ATOM_CLEAR_MAGIC(a); wfree(a, size); } #endif /* PROTECT_ATOMS */ -typedef size_t (*len_func_t)(gconstpointer v); -typedef const char *(*str_func_t)(gconstpointer v); +typedef size_t (*len_func_t)(const void *v); +typedef const char *(*str_func_t)(const void *v); /** * Description of atom types. */ -typedef struct table_desc { +typedef struct atom_desc { + spinlock_t lock; /**< Lock protecting the hash table */ const char *type; /**< Type of atoms */ - GHashTable *table; /**< Table of atoms: "atom value" => 1 */ - GHashFunc hash_func; /**< Hashing function for atoms */ - GCompareFunc eq_func; /**< Atom equality function */ + htable_t *table; /**< Table of atoms: "atom value" -> size */ + hash_fn_t hash_func; /**< Hashing function for atoms */ + eq_fn_t eq_func; /**< Atom equality function */ len_func_t len_func; /**< Atom length function */ str_func_t str_func; /**< Atom to human-readable string */ -} table_desc_t; - -static size_t str_len(gconstpointer v); -static const char *str_str(gconstpointer v); -static size_t guid_len(gconstpointer v); -static const char *guid_str(gconstpointer v); -static size_t sha1_len(gconstpointer v); -static const char *sha1_str(gconstpointer v); -static size_t tth_len(gconstpointer v); -static const char *tth_str(gconstpointer v); -static size_t uint64_len(gconstpointer v); -static const char *uint64_str(gconstpointer v); -static size_t filesize_len(gconstpointer v); -static const char *filesize_str(gconstpointer v); -static size_t uint32_len(gconstpointer v); -static const char *uint32_str(gconstpointer v); -static const char *gnet_host_str(gconstpointer v); +} atom_desc_t; + +#define ATOM_TABLE_LOCK(t) spinlock(&(t)->lock) +#define ATOM_TABLE_UNLOCK(t) spinunlock(&(t)->lock) + +static size_t str_xlen(const void *v); +static const char *str_str(const void *v); +static size_t guid_len(const void *v); +static const char *guid_str(const void *v); +static size_t sha1_len(const void *v); +static const char *sha1_str(const void *v); +static size_t tth_len(const void *v); +static const char *tth_str(const void *v); +static size_t uint64_len(const void *v); +static const char *uint64_str(const void *v); +static size_t filesize_len(const void *v); +static const char *filesize_str(const void *v); +static size_t uint32_len(const void *v); +static const char *uint32_str(const void *v); +static const char *gnet_host_str(const void *v); +static size_t packed_host_addr_len(const void *v); +static const char *packed_host_addr_str(const void *v); + +#define str_hash string_mix_hash +#define str_eq string_eq +#define fs_hash filesize_hash +#define fs_eq filesize_eq +#define fs_len filesize_len +#define fs_str filesize_str +#define gnh_hash gnet_host_hash +#define gnh_eq gnet_host_equal +#define gnh_len gnet_host_length +#define gnh_str gnet_host_str +#define pha_hash packed_host_addr_hash +#define pha_eq packed_host_addr_equal +#define pha_len packed_host_addr_len +#define pha_str packed_host_addr_str +#define S SPINLOCK_INIT +#define N NULL /** * The set of all atom types we know about. */ -static table_desc_t atoms = { - { "String", NULL, g_str_hash, g_str_equal, str_len, str_str }, /* 0 */ - { "GUID", NULL, guid_hash, guid_eq, guid_len, guid_str }, /* 1 */ - { "SHA1", NULL, sha1_hash, sha1_eq, sha1_len, sha1_str }, /* 2 */ - { "TTH", NULL, tth_hash, tth_eq, tth_len, tth_str }, /* 3 */ - { "uint64", NULL, uint64_hash, uint64_eq, uint64_len, uint64_str},/* 4 */ - { "filesize", NULL, - filesize_hash, filesize_eq, filesize_len, filesize_str}, /* 5 */ - { "uint32", NULL, uint32_hash, uint32_eq, uint32_len, uint32_str},/* 6 */ - { "host", NULL, - gnet_host_hash, gnet_host_eq, gnet_host_length, gnet_host_str}, /* 7 */ +static atom_desc_t atoms = { + { S, "String", N, str_hash, str_eq, str_xlen, str_str }, /* 0 */ + { S, "GUID", N, guid_hash, guid_eq, guid_len, guid_str }, /* 1 */ + { S, "SHA1", N, sha1_hash, sha1_eq, sha1_len, sha1_str }, /* 2 */ + { S, "TTH", N, tth_hash, tth_eq, tth_len, tth_str }, /* 3 */ + { S, "uint64", N, uint64_hash, uint64_eq, uint64_len, uint64_str},/* 4 */ + { S, "filesize", N, fs_hash, fs_eq, fs_len, fs_str }, /* 5 */ + { S, "uint32", N, uint32_hash, uint32_eq, uint32_len, uint32_str},/* 6 */ + { S, "host", N, gnh_hash, gnh_eq, gnh_len, gnh_str }, /* 7 */ + { S, "addr", N, pha_hash, pha_eq, pha_len, pha_str }, /* 8 */ }; -static GHashTable *ht_all_atoms; +#undef str_hash +#undef str_eq +#undef fs_hash +#undef fs_eq +#undef fs_len +#undef fs_str +#undef gnh_hash +#undef gnh_eq +#undef gnh_len +#undef gnh_str +#undef pha_hash +#undef pha_eq +#undef pha_len +#undef pha_str +#undef S +#undef N /** * @return length of string + trailing NUL. */ -static size_t -str_len(gconstpointer v) +static size_t +str_xlen(const void *v) { return strlen((const char *) v) + 1; } @@ -462,52 +627,16 @@ * @return printable form of a string, i.e. self. */ static const char * -str_str(gconstpointer v) +str_str(const void *v) { return (const char *) v; } /** - * Hash `len' bytes starting from `data'. - */ -G_GNUC_HOT guint -binary_hash(gconstpointer data, size_t len) -{ - const unsigned char *key = data; - size_t i, remain, t4; - guint32 hash; - - remain = len & 0x3; - t4 = len & ~0x3U; - - g_assert(remain + t4 == len); - g_assert(remain <= 3); - - hash = len; - for (i = 0; i < t4; i += 4) { - static const guint32 x = { - 0xb0994420, 0x01fa96e3, 0x05066d0e, 0x50c3c22a, - 0xec99f01f, 0xc0eaa79d, 0x157d4257, 0xde2b8419 - }; - hash ^= peek_le32(&keyi); - hash += x(i >> 2) & 0x7; - hash = (hash << 24) ^ (hash >> 8); - } - - for (i = 0; i < remain; i++) { - hash += keyt4 + i; - hash ^= keyt4 + i << (i * 8); - hash = (hash << 24) ^ (hash >> 8); - } - - return pointer_hash_func((void *) (size_t) hash); -} - -/** * Hash a GUID (16 bytes). */ -guint -guid_hash(gconstpointer key) +uint +guid_hash(const void *key) { return binary_hash(key, GUID_RAW_SIZE); } @@ -516,7 +645,7 @@ * Test two GUIDs for equality. */ int -guid_eq(gconstpointer a, gconstpointer b) +guid_eq(const void *a, const void *b) { return a == b || 0 == memcmp(a, b, GUID_RAW_SIZE); } @@ -524,8 +653,8 @@ /** * @return length of GUID. */ -static size_t -guid_len(gconstpointer unused_guid) +static size_t +guid_len(const void *unused_guid) { (void) unused_guid; return GUID_RAW_SIZE; @@ -535,7 +664,7 @@ * @return printable form of a GUID, as pointer to static data. */ static const char * -guid_str(gconstpointer v) +guid_str(const void *v) { const struct guid *guid = v; return guid_hex_str(guid); @@ -544,8 +673,8 @@ /** * Hash a SHA1 (20 bytes). */ -guint -sha1_hash(gconstpointer key) +uint +sha1_hash(const void *key) { return binary_hash(key, SHA1_RAW_SIZE); } @@ -554,7 +683,7 @@ * Test two SHA1s for equality. */ int -sha1_eq(gconstpointer a, gconstpointer b) +sha1_eq(const void *a, const void *b) { return a == b || 0 == memcmp(a, b, SHA1_RAW_SIZE); } @@ -562,8 +691,8 @@ /** * @return length of SHA1. */ -static size_t -sha1_len(gconstpointer unused_sha1) +static size_t +sha1_len(const void *unused_sha1) { (void) unused_sha1; return SHA1_RAW_SIZE; @@ -573,7 +702,7 @@ * @return printable form of a SHA1, as pointer to static data. */ static const char * -sha1_str(gconstpointer sha1) +sha1_str(const void *sha1) { return sha1_base32(sha1); } @@ -581,8 +710,8 @@ /** * Hash a TTH (24 bytes). */ -guint -tth_hash(gconstpointer key) +uint +tth_hash(const void *key) { return binary_hash(key, TTH_RAW_SIZE); } @@ -594,7 +723,7 @@ * NB: This routine is visible for the download mesh. */ int -tth_eq(gconstpointer a, gconstpointer b) +tth_eq(const void *a, const void *b) { return a == b || 0 == memcmp(a, b, TTH_RAW_SIZE); } @@ -602,8 +731,8 @@ /** * @return length of TTH. */ -static size_t -tth_len(gconstpointer unused_tth) +static size_t +tth_len(const void *unused_tth) { (void) unused_tth; return TTH_RAW_SIZE; @@ -613,7 +742,7 @@ * @return printable form of a TTH, as pointer to static data. */ static const char * -tth_str(gconstpointer tth) +tth_str(const void *tth) { return tth_base32(tth); } @@ -622,17 +751,17 @@ * @return length of a 64-bit integer. */ static size_t -uint64_len(gconstpointer unused_v) +uint64_len(const void *unused_v) { (void) unused_v; - return sizeof(guint64); + return sizeof(uint64); } /** * @return length of a filesize_t. */ static size_t -filesize_len(gconstpointer unused_v) +filesize_len(const void *unused_v) { (void) unused_v; return sizeof(filesize_t); @@ -642,22 +771,32 @@ * @return length of a 32-bit integer. */ static size_t -uint32_len(gconstpointer unused_v) +uint32_len(const void *unused_v) { (void) unused_v; - return sizeof(guint32); + return sizeof(uint32); +} + +/** + * @return length of a struct packed_host_addr. + */ +static size_t +packed_host_addr_len(const void *v) +{ + return packed_host_addr_size_ptr(v); } /** * @return printable form of a 64-bit integer, as pointer to static data. */ static const char * -uint64_str(gconstpointer v) +uint64_str(const void *v) { - static char bufUINT64_DEC_BUFLEN; + buf_t *b = buf_private(G_STRFUNC, UINT64_DEC_BUFLEN); + char *p = buf_data(b); - uint64_to_string_buf(*(const guint64 *) v, buf, sizeof buf); - return buf; + uint64_to_string_buf(*(const uint64 *) v, p, buf_size(b)); + return p; } /** @@ -666,9 +805,9 @@ * @return whether both referenced 64-bit integers are equal. */ int -uint64_eq(gconstpointer a, gconstpointer b) +uint64_eq(const void *a, const void *b) { - return *(const guint64 *) a == *(const guint64 *) b; + return *(const uint64 *) a == *(const uint64 *) b; } /** @@ -676,11 +815,16 @@ * * @return the 32-bit hash value for the referenced 64-bit integer. */ -guint -uint64_hash(gconstpointer p) +uint +uint64_hash(const void *p) { - guint64 v = *(const guint64 *) p; - return v ^ (v >> 32); + uint64 v = *(const uint64 *) p; +#if LONGSIZE <= 4 + return integer_hash_fast(v ^ (v >> 32)); +#else + /* uint64 and ulong are identical types */ + return integer_hash_fast(v); +#endif } /** @@ -690,9 +834,9 @@ * @return whether both referenced 64-bit integers are equal. */ int -uint64_mem_eq(gconstpointer a, gconstpointer b) +uint64_mem_eq(const void *a, const void *b) { - return a == b || 0 == memcmp(a, b, sizeof(guint64)); + return a == b || 0 == memcmp(a, b, sizeof(uint64)); } /** @@ -701,34 +845,53 @@ * * @return the 32-bit hash value for the referenced 64-bit integer. */ -guint -uint64_mem_hash(gconstpointer p) +uint +uint64_mem_hash(const void *p) { - return binary_hash(p, sizeof(guint64)); + return binary_hash(p, sizeof(uint64)); } /** * @return printable form of a filesize_t, as pointer to static data. */ static const char * -filesize_str(gconstpointer v) +filesize_str(const void *v) { - static char bufUINT64_DEC_BUFLEN; + buf_t *b = buf_private(G_STRFUNC, UINT64_DEC_BUFLEN); + char *p = buf_data(b); - uint64_to_string_buf(*(const filesize_t *) v, buf, sizeof buf); - return buf; + uint64_to_string_buf(*(const filesize_t *) v, p, buf_size(b)); + return p; } /** * @return printable form of a gnet_host_t *, as pointer to static data. */ static const char * -gnet_host_str(gconstpointer v) +gnet_host_str(const void *v) { - static char bufHOST_ADDR_PORT_BUFLEN; + buf_t *b = buf_private(G_STRFUNC, HOST_ADDR_PORT_BUFLEN); + char *p = buf_data(b); - gnet_host_to_string_buf(v, buf, sizeof buf); - return buf; + gnet_host_to_string_buf(v, p, buf_size(b)); + return p; +} + +/** + * @return printable form of a struct packed_host_addr *, as pointer + * to static data. + */ +static const char * +packed_host_addr_str(const void *v) +{ + buf_t *b = buf_private(G_STRFUNC, HOST_ADDR_PORT_BUFLEN); + char *p = buf_data(b); + host_addr_t addr; + + addr = packed_host_addr_unpack_ptr(v); + host_addr_to_string_buf(addr, p, buf_size(b)); + + return p; } /** @@ -737,7 +900,7 @@ * @return whether both referenced 64-bit integers are equal. */ int -filesize_eq(gconstpointer a, gconstpointer b) +filesize_eq(const void *a, const void *b) { return *(const filesize_t *) a == *(const filesize_t *) b; } @@ -747,10 +910,10 @@ * * @return the 32-bit hash value for the referenced 64-bit integer. */ -guint -filesize_hash(gconstpointer p) +uint +filesize_hash(const void *p) { - guint64 v = *(const filesize_t *) p; + uint64 v = *(const filesize_t *) p; return v ^ (v >> 32); } @@ -760,9 +923,9 @@ * @return whether both referenced 32-bit integers are equal. */ int -uint32_eq(gconstpointer a, gconstpointer b) +uint32_eq(const void *a, const void *b) { - return *(const guint32 *) a == *(const guint32 *) b; + return *(const uint32 *) a == *(const uint32 *) b; } /** @@ -770,59 +933,56 @@ * * @return the 32-bit hash value for the referenced 32-bit integer. */ -guint -uint32_hash(gconstpointer p) +uint +uint32_hash(const void *p) { - guint32 v = *(const guint32 *) p; - return v; + uint32 v = *(const uint32 *) p; + return u32_hash(v); } /** * @return printable form of a 32-bit integer, as pointer to static data. */ static const char * -uint32_str(gconstpointer v) +uint32_str(const void *v) { - static char bufUINT32_DEC_BUFLEN; + buf_t *b = buf_private(G_STRFUNC, UINT32_DEC_BUFLEN); + char *p = buf_data(b); - uint32_to_string_buf(*(const guint32 *) v, buf, sizeof buf); - return buf; + uint32_to_string_buf(*(const uint32 *) v, p, buf_size(b)); + return p; } /** * Initialize atom structures. */ -void -atoms_init(void) +static void G_COLD +atoms_init_once(void) { - gboolean has_setting = FALSE; + bool has_setting = FALSE; struct atom_settings { - guint8 track_atoms; - guint8 protect_atoms; - guint8 atoms_have_magic; + uint8 track_atoms; + uint8 protect_atoms; + uint8 atoms_have_magic; } settings; - guint i; - - if G_UNLIKELY(ht_all_atoms != NULL) - return; /* Already initialized */ + uint i; ZERO(&settings); - STATIC_ASSERT(NUM_ATOM_TYPES <= (ATOM_TYPE_MASK + 1)); - STATIC_ASSERT(NUM_ATOM_TYPES == G_N_ELEMENTS(atoms)); + STATIC_ASSERT(NUM_ATOM_TYPES == N_ITEMS(atoms)); + STATIC_ASSERT(4 == sizeof(void *) || sizeof(void *) == sizeof(ulong)); #ifdef PROTECT_ATOMS - for (i = 0; i < G_N_ELEMENTS(mem_cache); i++) { + for (i = 0; i < N_ITEMS(mem_cache); i++) { mem_cachei = mem_new((2 * sizeof (union mem_chunk)) << i); } #endif /* PROTECT_ATOMS */ - for (i = 0; i < G_N_ELEMENTS(atoms); i++) { - table_desc_t *td = &atomsi; + for (i = 0; i < N_ITEMS(atoms); i++) { + atom_desc_t *ad = &atomsi; - td->table = g_hash_table_new(td->hash_func, td->eq_func); + ad->table = htable_create_any(ad->hash_func, NULL, ad->eq_func); } - ht_all_atoms = g_hash_table_new(pointer_hash_func, NULL); /* * Log atoms configuration. @@ -842,55 +1002,84 @@ #endif if (has_setting) { - g_message("atom settings: %s%s%s", + s_message("atom settings: %s%s%s", settings.track_atoms ? "TRACK_ATOMS " : "", settings.protect_atoms ? "PROTECT_ATOMS " : "", settings.atoms_have_magic ? "ATOMS_HAVE_MAGIC " : ""); } + + log_atoms_inited(); /* Atom layer is up */ +} + +/** + * Initialize atom structures. + */ +void +atoms_init(void) +{ + once_flag_run(&atoms_inited, atoms_init_once); } /** - * Check whether ``key'' is an atom of type ``type''. + * Check whether atom exists. * - * @return the size of the atom if found, 0 otherwise. + * @return TRUE if ``key'' is a known ``type'' atom. */ -static inline size_t -atom_is_registered(enum atom_type type, gconstpointer key) +bool +atom_exists(enum atom_type type, const void *key) { - gpointer value; + g_assert(key != NULL); - if (g_hash_table_lookup_extended(ht_all_atoms, key, NULL, &value)) { - /* - * If the address is already registered in the global atom table, - * this is definitely an atom. However, the same memory object - * could be shared by atoms of different types (in theory at least), - * thus we must check whether the types are identical. - */ + if G_UNLIKELY(!ONCE_DONE(atoms_inited)) + return FALSE; - if (((size_t) value & ATOM_TYPE_MASK) == (guint) type) { - size_t size = (size_t) value & ~ATOM_TYPE_MASK; - g_assert(size >= ARENA_OFFSET); - return size; - } - } - return 0; + return htable_contains(atomstype.table, key); } /** - * Check whether atom exists. + * Check whether key is an atom * * @return TRUE if ``key'' points to a ``type'' atom. */ -gboolean -atom_exists(enum atom_type type, gconstpointer key) +bool +atom_is_atom(enum atom_type type, const void *key) { + const void *atom; + g_assert(key != NULL); - if G_UNLIKELY(NULL == ht_all_atoms) - return 0; + if G_UNLIKELY(!ONCE_DONE(atoms_inited)) + return FALSE; - return atom_is_registered(type, key) > 0 || - gm_hash_table_contains(atomstype.table, key); + return htable_lookup_extended(atomstype.table, key, &atom, NULL) + && key == atom; +} + +/** + * Increment / decrement the atom reference count. + * + * Must be called with the table description locked. + * + * @return new reference count. + */ +static inline size_t +atom_refcnt_add(const atom_desc_t *ad, const void *key, void *value, int delta) +{ + if (4 == sizeof(void *)) { + /* 32-bit machine, we can directly update the atom_info structure */ + struct atom_info *ai = value; + ai->refcnt += delta; + return ai->refcnt; + } else { + /* 64-bit machine, we must update the hash table value */ + ulong v = pointer_to_ulong(value); + if (delta > 0) + v += delta; + else + v -= -delta; /* Necessary since int may be smaller than long */ + htable_insert(ad->table, key, ulong_to_pointer(v)); + return ATOM_REFCNT(v); + } } /** @@ -899,87 +1088,81 @@ * * @return the atom's value. */ -gconstpointer -atom_get(enum atom_type type, gconstpointer key) +const void * +atom_get(enum atom_type type, const void *key) { - table_desc_t *td; - gpointer orig_key; + atom_desc_t *ad; + const void *orig_key; + void *value; size_t size; + atom_t *a; STATIC_ASSERT(0 == ARENA_OFFSET % MEM_ALIGNBYTES); STATIC_ASSERT(ARENA_OFFSET >= sizeof(atom_t)); - + g_assert(key != NULL); - g_assert(UNSIGNED(type) < G_N_ELEMENTS(atoms)); + g_assert(UNSIGNED(type) < N_ITEMS(atoms)); + ATOM_TRACK_IS_LOCKED(); - if G_UNLIKELY(NULL == ht_all_atoms) + if G_UNLIKELY(!ONCE_DONE(atoms_inited)) atoms_init(); - td = &atomstype; /* Where atoms of this type are held */ + ad = &atomstype; /* Where atoms of this type are held */ + ATOM_TABLE_LOCK(ad); - size = atom_is_registered(type, key); - if (size > 0) { - /* Atom already exists for key and type */ - orig_key = deconstify_gpointer(key); - } else { - gpointer value; + if (htable_lookup_extended(ad->table, key, &orig_key, &value)) { + size_t refcnt; + + size = atom_info_length(value); + /* Prevent gcc warning if ARENA_OFFSET == 0 */ + g_assert(size == ARENA_OFFSET || size > ARENA_OFFSET); /* - * Normally, if atom exists, it will be found by atom_is_registered(). - * If not, look in the type-specific table. - * - * This happens when the first few bytes of the atom arena are shared - * by atoms of different types (it creates conflicts in the global - * ht_all_atoms table). + * Atom exists, increment ref count and return it. */ - if (g_hash_table_lookup_extended(td->table, key, &orig_key, &value)) { - size = (size_t) value; - g_assert(size >= ARENA_OFFSET); - } else { - size = 0; - } - } + g_assert(atom_info_refcnt(value) > 0); - /* - * If atom exists, increment ref count and return it. - */ + refcnt = atom_refcnt_add(ad, orig_key, value, +1); + ATOM_TRACK_REFCNT(orig_key, +1, refcnt); + ATOM_TABLE_UNLOCK(ad); - if (size > 0) { - atom_t *a; - - a = atom_from_arena(orig_key); - g_assert(a->refcnt > 0); - - atom_unprotect(a, size); - a->refcnt++; - atom_protect(a, size); return orig_key; } else { size_t len; - gpointer value; - atom_t *a; /* * Create new atom. */ - len = (*td->len_func)(key); - g_assert(len < ((size_t) -1) - ARENA_OFFSET); - size = round_size_fast((ATOM_TYPE_MASK + 1), ARENA_OFFSET + len); + len = (*ad->len_func)(key); + g_assert(len < ATOM_SIZE_MAX - ARENA_OFFSET); + size = round_size_fast(MEM_ALIGNBYTES, ARENA_OFFSET + len); a = atom_alloc(size); - a->refcnt = 1; memcpy(atom_arena(a), key, len); atom_protect(a, size); /* * Insert atom in table. + * + * On 32-bit machines, we have to allocate the atom_info structure. + * On 64-bit machines, encode size and refcnt in a long. */ - value = (gpointer) (size | (guint) type); - g_hash_table_insert(ht_all_atoms, atom_arena(a), value); - g_hash_table_insert(td->table, atom_arena(a), (gpointer) size); + if (4 == sizeof(void *)) { + struct atom_info *ai; + + WALLOC(ai); + ai->len = size; + ai->refcnt = 1; + htable_insert(ad->table, atom_arena(a), ai); + } else { + ulong v = ATOM_INFO(size) + 1; /* +1 means refcnt is 1 */ + htable_insert(ad->table, atom_arena(a), ulong_to_pointer(v)); + } + + ATOM_TABLE_UNLOCK(ad); return atom_arena(a); } @@ -990,35 +1173,58 @@ * Dispose of atom if nobody references it anymore. */ void -atom_free(enum atom_type type, gconstpointer key) +atom_free(enum atom_type type, const void *key) { + atom_desc_t *ad; size_t size; atom_t *a; + bool found; + int refcnt; + void *value; + const void *orig_key; g_assert(key != NULL); - g_assert(UNSIGNED(type) < G_N_ELEMENTS(atoms)); + g_assert(UNSIGNED(type) < N_ITEMS(atoms)); + ATOM_TRACK_IS_LOCKED(); - size = atom_is_registered(type, key); - g_assert(size > 0); + ad = &atomstype; /* Where atoms of this type are held */ + ATOM_TABLE_LOCK(ad); + + found = htable_lookup_extended(ad->table, key, &orig_key, &value); + + g_assert_log(found, + "attempting to free unknown %s atom at %p", ad->type, key); + g_assert_log(key == orig_key, + "attempt to free %s atom copy at %p, atom was at %p", + ad->type, key, orig_key); + + size = atom_info_length(value); + + /* Prevent gcc warning if ARENA_OFFSET == 0 */ + g_assert(size == ARENA_OFFSET || size > ARENA_OFFSET); a = atom_from_arena(key); - g_assert(a->refcnt > 0); + refcnt = atom_info_refcnt(value); /* * Dispose of atom when its reference count reaches 0. */ - atom_unprotect(a, size); - if (--a->refcnt == 0) { - table_desc_t *td; - - td = &atomstype; /* Where atoms of this type are held */ - g_hash_table_remove(td->table, key); - g_hash_table_remove(ht_all_atoms, key); + if (1 == refcnt) { + htable_remove(ad->table, key); + if (4 == sizeof(void *)) { + /* 32-bit machine */ + struct atom_info *ai = value; + WFREE(ai); + } + atom_unprotect(a, size); atom_dealloc(a, size); } else { - atom_protect(a, size); + size_t rcnt = atom_refcnt_add(ad, key, value, -1); + ATOM_TRACK_REFCNT(key, -1, rcnt); } + + ATOM_TABLE_UNLOCK(ad); } #ifdef TRACK_ATOMS @@ -1028,21 +1234,26 @@ int count; /**< Amount of allocation/free performed at spot */ }; +#define ATOM_TRACK_LOCK spinlock_hidden(&atom_track_slk) +#define ATOM_TRACK_UNLOCK spinunlock_hidden(&atom_track_slk) + /** * The tracking version of atom_get(). * * @returns the atom's value. */ -gconstpointer -atom_get_track(enum atom_type type, gconstpointer key, char *file, int line) +const void * +atom_get_track(enum atom_type type, const void *key, const char *file, int line) { - gconstpointer atom; + const void *atom; atom_t *a; char buf512; - gpointer k; - gpointer v; + const void *k; + void *v; struct spot *sp; + ATOM_TRACK_LOCK; + atom = atom_get(type, key); a = atom_from_arena(atom); @@ -1050,46 +1261,63 @@ * Initialize tracking tables on first allocation. */ - if (a->refcnt == 1) { - a->get = g_hash_table_new(g_str_hash, g_str_equal); - a->free = g_hash_table_new(g_str_hash, g_str_equal); + if G_UNLIKELY(NULL == a->get) { + /* Initialized by ATOM_ZERO() */ + g_assert_log(1 == a->trackcnt, + "%s(): a->trackcnt=%zu", G_STRFUNC, a->trackcnt); + spinlock_init(&a->lock); + } + + spinlock(&a->lock); + ATOM_TRACK_UNLOCK; + + if G_UNLIKELY(NULL == a->get) { + a->get = htable_create(HASH_KEY_STRING, 0); + a->free = htable_create(HASH_KEY_STRING, 0); } - gm_snprintf(buf, sizeof(buf), "%s:%d", short_filename(file), line); + str_bprintf(buf, sizeof(buf), "%s:%d", short_filename(file), line); - if (g_hash_table_lookup_extended(a->get, buf, &k, &v)) { + if (htable_lookup_extended(a->get, buf, &k, &v)) { sp = (struct spot *) v; sp->count++; } else { WALLOC(sp); sp->count = 1; - g_hash_table_insert(a->get, g_strdup(buf), sp); + htable_insert(a->get, constant_str(buf), sp); } + spinunlock(&a->lock); + return atom; } /** - * Free key/value pair of the tracking table. + * Free value from the tracking table. */ -static gboolean -tracking_free_kv(gpointer key, gpointer value, gpointer uu_user) +static void +tracking_free_kv(const void *unused_key, void *value, void *unused_data) { - (void) uu_user; + (void) unused_key; + (void) unused_data; + + /* The key is a constant */ - G_FREE_NULL(key); wfree(value, sizeof(struct spot)); - return TRUE; } /** - * Get rid of the tracking hash table. + * Get rid of the tracking hash table and nullify its pointer. */ static void -destroy_tracking_table(GHashTable *h) +destroy_tracking_table(htable_t **h_ptr) { - g_hash_table_foreach_remove(h, tracking_free_kv, NULL); - g_hash_table_destroy(h); + htable_t *h = *h_ptr; + + if (h != NULL) { + htable_foreach(h, tracking_free_kv, NULL); + htable_free_null(h_ptr); + } } /** @@ -1098,37 +1326,80 @@ * Dispose of atom if nobody references it anymore. */ void -atom_free_track(enum atom_type type, gconstpointer key, char *file, int line) +atom_free_track(enum atom_type type, const void *key, + const char *file, int line) { atom_t *a; - char buf512; - gpointer k; - gpointer v; + void *v; struct spot *sp; + bool freed = FALSE; a = atom_from_arena(key); + ATOM_TRACK_LOCK; + /* - * If we're going to free the atom, dispose the tracking tables. + * If we're going to free the atom, dispose of the tracking tables. */ - if (a->refcnt == 1) { - destroy_tracking_table(a->get); - destroy_tracking_table(a->free); + spinlock(&a->lock); + + if (1 == a->trackcnt) { + destroy_tracking_table(&a->get); + destroy_tracking_table(&a->free); + spinlock_destroy(&a->lock); + freed = TRUE; } else { - gm_snprintf(buf, sizeof(buf), "%s:%d", short_filename(file), line); + spinunlock(&a->lock); + } + + atom_free(type, key); + + if (!freed) + spinlock(&a->lock); - if (g_hash_table_lookup_extended(a->free, buf, &k, &v)) { + ATOM_TRACK_UNLOCK; + + if (!freed) { + char buf512; + + str_bprintf(buf, sizeof(buf), "%s:%d", short_filename(file), line); + + if (htable_lookup_extended(a->free, buf, NULL, &v)) { sp = (struct spot *) v; sp->count++; } else { WALLOC(sp); sp->count = 1; - g_hash_table_insert(a->free, g_strdup(buf), sp); + htable_insert(a->free, constant_str(buf), sp); } + spinunlock(&a->lock); } +} - atom_free(type, key); +/** + * Helper routine for atom_track_count. + */ +static void +atom_count_tracking_entry(const void *unused_key, void *value, void *user) +{ + struct spot *sp = value; + size_t *count = user; + + (void) unused_key; + *count += sp->count; +} + +/** + * Count amount of operations recorded in the tracking table. + */ +static size_t +atom_track_count(const htable_t *h) +{ + size_t count = 0; + + htable_foreach(h, atom_count_tracking_entry, &count); + return count; } /** @@ -1136,10 +1407,10 @@ * amount of such operations. */ static void -dump_tracking_entry(gpointer key, gpointer value, gpointer user) +dump_tracking_entry(const void *key, void *value, void *user) { - struct spot *sp = (struct spot *) value; - const char *what = (const char *) user; + struct spot *sp = value; + const char *what = user; g_warning("%10d %s at \"%s\"", sp->count, what, (char *) key); } @@ -1148,14 +1419,15 @@ * Dump the values held in the tracking table `h'. */ static void -dump_tracking_table(gpointer atom, GHashTable *h, char *what) +dump_tracking_table(const void *atom, htable_t *h, char *what) { - guint count = g_hash_table_size(h); + size_t count = htable_count(h); + size_t opcount = atom_track_count(h); - g_warning("all %u %s spot%s for %p:", - count, what, count == 1 ? "" : "s", atom); + g_warning("all %zu %s spot%s (%zu operation%s) for %p:", + count, what, plural(count), opcount, plural(opcount), atom); - g_hash_table_foreach(h, dump_tracking_entry, what); + htable_foreach(h, dump_tracking_entry, what); } #endif /* TRACK_ATOMS */ @@ -1163,31 +1435,30 @@ /** * Warning about existing atom that should have been freed. */ -static gboolean -atom_warn_free(gpointer key, gpointer unused_value, gpointer udata) +static void +atom_warn_free(const void *key, void *value, void *udata) { atom_t *a = atom_from_arena(key); - table_desc_t *td = udata; - - (void) unused_value; + atom_desc_t *ad = udata; g_warning("found remaining %s atom %p, refcnt=%d: \"%s\"", - td->type, key, a->refcnt, (*td->str_func)(key)); + ad->type, key, atom_info_refcnt(value), (*ad->str_func)(key)); #ifdef TRACK_ATOMS + spinlock(&a->lock); dump_tracking_table(key, a->get, "get"); dump_tracking_table(key, a->free, "free"); - destroy_tracking_table(a->get); - destroy_tracking_table(a->free); + destroy_tracking_table(&a->get); + destroy_tracking_table(&a->free); + spinlock_destroy(&a->lock); +#else + (void) a; #endif /* - * Don't free the entry, so that we know where the leak originates from - * when running under -DUSE_DMALLOC or via valgrind. + * Don't free the entry, so that we know where the leak originates from. * --RAM, 02/02/2003 */ - - return TRUE; } /** @@ -1196,15 +1467,16 @@ void atoms_close(void) { - guint i; + uint i; - for (i = 0; i < G_N_ELEMENTS(atoms); i++) { - table_desc_t *td = &atomsi; + for (i = 0; i < N_ITEMS(atoms); i++) { + atom_desc_t *ad = &atomsi; - g_hash_table_foreach_remove(td->table, atom_warn_free, td); - gm_hash_table_destroy_null(&td->table); + ATOM_TABLE_LOCK(ad); + htable_foreach(ad->table, atom_warn_free, ad); + htable_free_null(&ad->table); + ATOM_TABLE_UNLOCK(ad); } - gm_hash_table_destroy_null(&ht_all_atoms); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/atoms.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/atoms.h
Changed
@@ -50,16 +50,18 @@ ATOM_FILESIZE, /**< filesize_t (binary) */ ATOM_UINT32, /**< unsigned 32-bit integers (binary, 4 bytes) */ ATOM_HOST, /**< gnet_host_t "IP:port" (binary) */ + ATOM_ADDR, /**< packed_host_addr "IP" (binary) */ NUM_ATOM_TYPES }; #if !defined(TRACK_ATOMS) || defined(ATOMS_SOURCE) -gconstpointer atom_get(enum atom_type type, gconstpointer key); -void atom_free(enum atom_type type, gconstpointer key); +const void *atom_get(enum atom_type type, const void *key); +void atom_free(enum atom_type type, const void *key); #endif -gboolean atom_exists(enum atom_type type, gconstpointer key); +bool atom_exists(enum atom_type type, const void *key); +bool atom_is_atom(enum atom_type type, const void *key); /* * Convenience macros. @@ -76,7 +78,7 @@ #define atom_sha1_get(k) atom_get_track(ATOM_SHA1, (k), _WHERE_, __LINE__) #define atom_sha1_free(k) atom_free_track(ATOM_SHA1, (k), _WHERE_, __LINE__) -#define atom_tth_get(k) atom_get_track(ATOM_TTH, (k), _WHERE_, __LINE__) +#define atom_tth_get(k) atom_get_track(ATOM_TTH, (k), _WHERE_, __LINE__) #define atom_tth_free(k) atom_free_track(ATOM_TTH, (k), _WHERE_, __LINE__) #define atom_uint64_get(k) atom_get_track(ATOM_UINT64, (k), _WHERE_, __LINE__) @@ -88,6 +90,9 @@ #define atom_host_get(k) atom_get_track(ATOM_HOST, (k), _WHERE_, __LINE__) #define atom_host_free(k) atom_free_track(ATOM_HOST, (k), _WHERE_, __LINE__) +#define atom_addr_get(k) atom_get_track(ATOM_ADDR, (k), _WHERE_, __LINE__) +#define atom_addr_free(k) atom_free_track(ATOM_ADDR, (k), _WHERE_, __LINE__) + #define atom_filesize_get(k) \ atom_get_track(ATOM_FILESIZE, (k), _WHERE_, __LINE__) #define atom_filesize_free(k) \ @@ -148,14 +153,14 @@ atom_free(ATOM_TTH, k); } -static inline const guint64 * -atom_uint64_get(const guint64 *k) +static inline const uint64 * +atom_uint64_get(const uint64 *k) { return atom_get(ATOM_UINT64, k); } static inline void -atom_uint64_free(const guint64 *k) +atom_uint64_free(const uint64 *k) { atom_free(ATOM_UINT64, k); } @@ -172,14 +177,14 @@ atom_free(ATOM_FILESIZE, k); } -static inline const guint32 * -atom_uint32_get(const guint32 *k) +static inline const uint32 * +atom_uint32_get(const uint32 *k) { return atom_get(ATOM_UINT32, k); } static inline void -atom_uint32_free(const guint32 *k) +atom_uint32_free(const uint32 *k) { atom_free(ATOM_UINT32, k); } @@ -196,6 +201,18 @@ atom_free(ATOM_HOST, k); } +static inline const struct packed_host_addr * +atom_addr_get(const struct packed_host_addr *k) +{ + return atom_get(ATOM_ADDR, k); +} + +static inline void +atom_addr_free(const struct packed_host_addr *k) +{ + atom_free(ATOM_ADDR, k); +} + #endif /* TRACK_ATOMS */ /* @@ -205,77 +222,83 @@ void atoms_init(void); void atoms_close(void); -static inline gboolean +static inline bool atom_is_str(const char *k) { - return atom_exists(ATOM_STRING, k); + return atom_is_atom(ATOM_STRING, k); } -static inline gboolean +static inline bool atom_is_guid(const struct guid *k) { - return atom_exists(ATOM_GUID, k); + return atom_is_atom(ATOM_GUID, k); } -static inline gboolean +static inline bool atom_is_sha1(const struct sha1 *k) { - return atom_exists(ATOM_SHA1, k); + return atom_is_atom(ATOM_SHA1, k); } -static inline gboolean +static inline bool atom_is_tth(const struct tth *k) { - return atom_exists(ATOM_TTH, k); + return atom_is_atom(ATOM_TTH, k); } -static inline gboolean -atom_is_uint64(const guint64 *k) +static inline bool +atom_is_uint64(const uint64 *k) { - return atom_exists(ATOM_UINT64, k); + return atom_is_atom(ATOM_UINT64, k); } -static inline gboolean +static inline bool atom_is_filesize(const filesize_t *k) { - return atom_exists(ATOM_FILESIZE, k); + return atom_is_atom(ATOM_FILESIZE, k); } -static inline gboolean -atom_is_uint32(const guint32 *k) +static inline bool +atom_is_uint32(const uint32 *k) { - return atom_exists(ATOM_UINT32, k); + return atom_is_atom(ATOM_UINT32, k); } -static inline gboolean +static inline bool atom_is_host(const gnet_host_t *k) { - return atom_exists(ATOM_HOST, k); + return atom_is_atom(ATOM_HOST, k); +} + +static inline bool +atom_is_addr(const struct packed_host_addr *k) +{ + return atom_is_atom(ATOM_ADDR, k); } /* * Hash functions and equality checks */ -guint filesize_hash(gconstpointer key) G_GNUC_PURE; -int filesize_eq(gconstpointer a, gconstpointer b) G_GNUC_PURE; -guint sha1_hash(gconstpointer key) G_GNUC_PURE; -int sha1_eq(gconstpointer a, gconstpointer b) G_GNUC_PURE; -guint tth_hash(gconstpointer key) G_GNUC_CONST; -int tth_eq(gconstpointer a, gconstpointer b) G_GNUC_PURE; -guint guid_hash(gconstpointer key) G_GNUC_CONST; -int guid_eq(gconstpointer a, gconstpointer b) G_GNUC_PURE; -guint uint64_hash(gconstpointer key) G_GNUC_CONST; -int uint64_eq(gconstpointer a, gconstpointer b) G_GNUC_PURE; -guint uint64_mem_hash(gconstpointer key) G_GNUC_PURE; -int uint64_mem_eq(gconstpointer a, gconstpointer b) G_GNUC_PURE; -guint binary_hash(gconstpointer key, size_t len) G_GNUC_PURE; -guint uint32_hash(gconstpointer key) G_GNUC_PURE; -int uint32_eq(gconstpointer a, gconstpointer b) G_GNUC_PURE; +uint filesize_hash(const void *key) G_PURE; +int filesize_eq(const void *a, const void *b) G_PURE; +uint sha1_hash(const void *key) G_PURE; +int sha1_eq(const void *a, const void *b) G_PURE; +uint tth_hash(const void *key) G_PURE; +int tth_eq(const void *a, const void *b) G_PURE; +uint guid_hash(const void *key) G_PURE; +int guid_eq(const void *a, const void *b) G_PURE; +uint uint64_hash(const void *key) G_CONST; +int uint64_eq(const void *a, const void *b) G_PURE; +uint uint64_mem_hash(const void *key) G_PURE; +int uint64_mem_eq(const void *a, const void *b) G_PURE; +uint uint32_hash(const void *key) G_PURE; +int uint32_eq(const void *a, const void *b) G_PURE; #ifdef TRACK_ATOMS -gconstpointer atom_get_track(enum atom_type, gconstpointer key, - char *file, int line); -void atom_free_track(enum atom_type, gconstpointer key, char *file, int line); +const void *atom_get_track(enum atom_type, const void *key, + const char *file, int line); +void atom_free_track(enum atom_type, const void *key, + const char *file, int line); #endif @@ -284,6 +307,42 @@ * The atom may also point to NULL, so the caller does not have to * check this. */ + +#ifdef TRACK_ATOMS +#define atom_str_free_wl(k,w,l) atom_free_track(ATOM_STRING, (k), (w), (l)) +#define atom_guid_free_wl(k,w,l) atom_free_track(ATOM_GUID, (k), (w), (l)) +#define atom_sha1_free_wl(k,w,l) atom_free_track(ATOM_SHA1, (k), (w), (l)) +#define atom_tth_free_wl(k,w,l) atom_free_track(ATOM_TTH, (k), (w), (l)) +#define atom_uint64_free_wl(k,w,l) atom_free_track(ATOM_UINT64, (k), (w), (l)) +#define atom_uint32_free_wl(k,w,l) atom_free_track(ATOM_UINT32, (k), (w), (l)) +#define atom_host_free_wl(k,w,l) atom_free_track(ATOM_HOST, (k), (w), (l)) +#define atom_addr_free_wl(k,w,l) atom_free_track(ATOM_ADDR, (k), (w), (l)) + +#define atom_filesize_free_wl(k,w,l) \ + atom_free_track(ATOM_FILESIZE, (k), (w), (l)) + +#define atom_str_free_null(kp) atom_str_fntrack((kp), _WHERE_, __LINE__) +#define atom_guid_free_null(kp) atom_guid_fntrack((kp), _WHERE_, __LINE__) +#define atom_sha1_free_null(kp) atom_sha1_fntrack((kp), _WHERE_, __LINE__) +#define atom_tth_free_null(kp) atom_tth_fntrack((kp), _WHERE_, __LINE__) +#define atom_uint64_free_null(kp) atom_uint64_fntrack((kp), _WHERE_, __LINE__) +#define atom_uint32_free_null(kp) atom_uint32_fntrack((kp), _WHERE_, __LINE__) +#define atom_host_free_null(kp) atom_host_fntrack((kp), _WHERE_, __LINE__) +#define atom_addr_free_null(kp) atom_addr_fntrack((kp), _WHERE_, __LINE__) + +#define atom_filesize_free_null(kp) \ + atom_filesize_fntrack((kp), _WHERE_, __LINE__) + +#define GENERATE_ATOM_FREE_NULL(name, type) \ +static inline void \ +atom_ ## name ## _fntrack(const type *k_ptr, const char *where, int line) \ +{ \ + if (*k_ptr) { \ + atom_ ## name ## _free_wl(*k_ptr, where, line); \ + *k_ptr = NULL; \ + } \ +} +#else /* !TRACK_ATOMS */ #define GENERATE_ATOM_FREE_NULL(name, type) \ static inline void \ atom_ ## name ## _free_null(const type *k_ptr) \ @@ -293,6 +352,7 @@ *k_ptr = NULL; \ } \ } +#endif /* TRACK_ATOMS */ struct sha1; struct tth; @@ -302,9 +362,10 @@ GENERATE_ATOM_FREE_NULL(sha1, struct sha1 *) GENERATE_ATOM_FREE_NULL(str, char *) GENERATE_ATOM_FREE_NULL(tth, struct tth *) -GENERATE_ATOM_FREE_NULL(uint64, guint64 *) -GENERATE_ATOM_FREE_NULL(uint32, guint32 *) +GENERATE_ATOM_FREE_NULL(uint64, uint64 *) +GENERATE_ATOM_FREE_NULL(uint32, uint32 *) GENERATE_ATOM_FREE_NULL(host, gnet_host_t *) +GENERATE_ATOM_FREE_NULL(addr, struct packed_host_addr *) #undef GENERATE_ATOM_FREE_NULL /** @@ -327,8 +388,10 @@ GENERATE_ATOM_CHANGE(sha1, struct sha1 *) GENERATE_ATOM_CHANGE(str, char *) GENERATE_ATOM_CHANGE(tth, struct tth *) -GENERATE_ATOM_CHANGE(uint64, guint64 *) -GENERATE_ATOM_CHANGE(uint32, guint32 *) +GENERATE_ATOM_CHANGE(uint64, uint64 *) +GENERATE_ATOM_CHANGE(uint32, uint32 *) +GENERATE_ATOM_CHANGE(host, gnet_host_t *) +GENERATE_ATOM_CHANGE(addr, struct packed_host_addr *) #undef GENERATE_ATOM_CHANGE #endif /* _atoms_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/barrier.c
Added
@@ -0,0 +1,482 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Synchronization barrier. + * + * Routines that may suspend the execution of the thread such as barrier_wait() + * are thread cancellation points. When cancellation occurs, the barrier + * reference count is automatically decreased and the maximum amount of waiting + * threads is adjusted accordingly. + * + * As such, the barrier object should be properly reference-counted when given + * to cancelable threads. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#include "barrier.h" +#include "atomic.h" +#include "cond.h" +#include "mutex.h" +#include "thread.h" +#include "walloc.h" + +#include "override.h" /* Must be the last header included */ + +enum barrier_magic { BARRIER_MAGIC = 0x2c582ae9 }; + +/** + * A barrier variable. + */ +struct barrier { + enum barrier_magic magic; /* Magic number */ + cond_t event; /* Waiting for all to reach the barrier */ + mutex_t lock; /* Mutex protecting barrier updates */ + unsigned id; /* Thread master ID, -1 if none */ + unsigned generation; /* Barrier wait generation (usage) count */ + unsigned release; /* Barrier release generation count */ + int amount; /* Amount of threads to synchronize */ + int waiting; /* Amount of threads waiting on barrier */ + int refcnt; /* Reference count */ + bool has_master; /* Whether master thread is present */ +}; + +static inline void +barrier_check(const struct barrier * const b) +{ + g_assert(b != NULL); + g_assert(BARRIER_MAGIC == b->magic); +} + +/** + * Initialize the barrier. + * + * @param b the barrier to initialize + * @param amount amount of threads to synchronize + * @param emulated whether to use emulated semaphores + */ +static void +barrier_init(barrier_t *b, int amount, bool emulated) +{ + g_assert(b != NULL); + g_assert(0 == b->magic); /* Not already initialized */ + g_assert(amount > 0); + + b->magic = BARRIER_MAGIC; + mutex_init(&b->lock); + cond_init_full(&b->event, &b->lock, emulated); + b->id = -1U; + b->amount = amount; + b->refcnt = 1; +} + +/* + * Destroy the barrier. + */ +static void +barrier_destroy(barrier_t *b) +{ + barrier_check(b); + g_assert(0 == b->waiting); /* Not used */ + + cond_destroy(&b->event); + mutex_destroy(&b->lock); + b->magic = 0; +} + +/** + * Allocate a barrier and initialize it. + * + * @param amount amount of threads to synchronize + * + * @return a newly allocated barrier. + */ +barrier_t * +barrier_new(int amount) +{ + barrier_t *b; + + WALLOC0(b); + barrier_init(b, amount, FALSE); /* Use real semaphores if supported */ + + return b; +} + +/** + * Allocate a barrier and initialize it. + * + * @param emulated whether to use emulated semaphores, for testing purposes + * @param amount amount of threads to synchronize + * + * @return a newly allocated barrier. + */ +barrier_t * +barrier_new_full(int amount, bool emulated) +{ + barrier_t *b; + + WALLOC0(b); + barrier_init(b, amount, emulated); + + return b; +} + +/** + * Free dynamically allocated barrier. + * + * @return TRUE if we destroyed the barrier. + */ +static bool +barrier_free(barrier_t *b) +{ + barrier_check(b); + g_assert(b->refcnt > 0); + + if (atomic_int_dec_is_zero(&b->refcnt)) { + barrier_destroy(b); + WFREE(b); + return TRUE; + } + + return FALSE; +} + +/** + * Free dynamically allocated barrier and nullify its pointer. + */ +void +barrier_free_null(barrier_t **b_ptr) +{ + barrier_t *b = *b_ptr; + + if (b != NULL) { + barrier_free(b); + *b_ptr = NULL; + } +} + +/** + * Increase the reference count on the barrier. + * + * This must be used by any cancelable thread that is going to use the barrier, + * since the cleanup done should a cancel occur during waiting will remove + * one reference to the barrier. + * + * @return the reference to the barrier for convenience. + */ +barrier_t * +barrier_refcnt_inc(barrier_t *b) +{ + barrier_check(b); + g_assert(b->refcnt > 0); + + atomic_int_inc(&b->refcnt); + return b; +} + +/** + * Decrease the reference count on the barrier. + * + * @return the reference to the barrier for convenience, NULL if the barrier + * was freed. + */ +barrier_t * +barrier_refcnt_dec(barrier_t *b) +{ + barrier_check(b); + + if (barrier_free(b)) + return NULL; + + return b; +} + +/** + * Signal that barrier waiting is done. + */ +static void +barrier_done(barrier_t *b) +{ + barrier_check(b); + assert_mutex_is_owned(&b->lock); + + b->generation++; /* Let waiting threads exit their waiting loop */ + + if G_LIKELY(-1U == b->id) { + b->waiting = 0; + b->has_master = FALSE; + } else { + b->has_master = TRUE; + } + + cond_broadcast(&b->event, &b->lock); +} + +/** + * Cleanup routine invoked when a thread stuck in barrier_wait() is cancelled. + */ +static void +barrier_wait_cleanup(void *arg) +{ + barrier_t *b = arg; + + barrier_check(b); + assert_mutex_is_owned(&b->lock); + + /* + * Check whether the master thread is being removed and warn them as + * this is probably an error. + */ + + if G_UNLIKELY(thread_small_id() == b->id) { + b->id = -1U; + s_carp("master %s being cancelled for barrier %p", thread_name(), b); + } + + /* + * A thread that was expected to synchronize on the barrier is going away, + * hence we need to adjust the expected amount of waiting threads, and + * release the other waiting threads if they already reached the barrier. + */ + + g_assert(b->amount >= 1); + g_assert(b->waiting >= 1); + + b->amount--; + b->waiting--; + + if (b->waiting == b->amount) + barrier_done(b); + + mutex_unlock(&b->lock); + barrier_free(b); +} + +/** + * Cleanup routine invoked when a thread stuck in barrier_wait() is cancelled, + * whilst in the final release stage where it is waiting for the master thread. + */ +static void +barrier_wait_release_cleanup(void *arg) +{ + barrier_t *b = arg; + + barrier_check(b); + + mutex_unlock(&b->lock); + barrier_free(b); +} + +/** + * Wait on the barrier. + * + * If no thread waits on the barrier with a "master" privilege request, all + * the threads will be released when the last expected thread reaches the + * barrier. + * + * If a thread waits via barrier_master_wait(), then all other waiting thread + * will remain blocked until the master calls barrier_release(). + * + * When this function returns, it was necessarily called by a non-master + * thread (or there is no master thread for this barrier) and the barrier is + * immediately reusable as a synchronization point. + * + * @note + * This routine is a cancellation point. + */ +void +barrier_wait(barrier_t *b) +{ + unsigned generation, release; + + barrier_check(b); + g_assert(b->waiting < b->amount); + + /* + * Warn loudly if we are called and the reference count is not appropriate. + * Each thread must hold a reference to the barrier and call barrier_free() + * to dispose of the object. + */ + + if (b->refcnt <= b->waiting) { + s_carp_once("%s(): called from %s with improper refcount " + "(waiting=%d, refcnt=%d, amount=%d)", + G_STRFUNC, thread_name(), b->waiting, b->refcnt, b->amount); + } + + mutex_lock(&b->lock); + + /* + * The generation count defines a usage cycle: thread wait on the barrier + * until all the threads are present, at which point we reinitialize the + * barrier so that released threads can immediately reuse it, regardless + * of whether all the threads have left the barrier_wait() call. + * + * The release count is only required when there is a master thread reaching + * the barrier, but we need to capture the count before attempting to + * wait since once we wake up, all bets are off -- there is no scheduling + * guarantee as to when in time we shall leave cond_wait(). + */ + + generation = b->generation; + release = b->release; + b->waiting++; + + if G_UNLIKELY(b->waiting == b->amount) { + /* + * All the threads are present, we may begin a new cycle if there + * is no master thread. + */ + + barrier_done(b); + } else { + /* + * Wait until all the threads are there, the last incoming thread + * increasing the generation number. + */ + + thread_cleanup_push(barrier_wait_cleanup, b); + + while (b->generation == generation) + cond_wait(&b->event, &b->lock); + + thread_cleanup_pop(FALSE); + } + + /* + * All the threads have reached the barrier, but if there is a master + * thread we can only let that thread escape, the other ones remaining + * captive in the barrier until the release count changes. + */ + + if G_LIKELY(!b->has_master) + goto released; /* No master thread, everybody wakes up */ + + if G_UNLIKELY(thread_small_id() == b->id) + goto released; /* Master thread can continue */ + + /* + * During the final waiting stage, the thread can be cancelled as well. + * At which point we only need to release the mutex and free the barrier. + */ + + thread_cleanup_push(barrier_wait_release_cleanup, b); + + while (b->release == release) + cond_wait(&b->event, &b->lock); + + thread_cleanup_pop(FALSE); + +released: + mutex_unlock(&b->lock); +} + +/** + * Wait on the barrier as the master thread. + * + * Only one thread can register to the barrier as a master one, although a + * different thread can be the master each time the barrier is subsequently + * reused. + * + * The calling thread is blocked until all the expected threads have reached + * the barrier, at which point the master thread is released. It can perform + * any cleanup or setup for the next phase before calling barrier_release() + * to let other waiting threads resume execution. + * + * @note + * This routine is a cancellation point. + */ +void +barrier_master_wait(barrier_t *b) +{ + barrier_check(b); + + /* + * Record the small thread ID of the calling thread which wants to be + * the master for this barrier. It will be the first to be awoken. + */ + + mutex_lock(&b->lock); + + g_assert_log(-1U == b->id, + "%s() called whilst %s already registered as master", + G_STRFUNC, thread_id_name(b->id)); + + b->id = thread_small_id(); + mutex_unlock(&b->lock); + + barrier_wait(b); + + /* + * The master thread now has "exclusive access" to the data shared with + * the other computing threads still stuck in the barrier. + */ +} + +/** + * Release all other waiting threads. + * + * This routine needs to be called by the master thread to let the other + * waiting threads resume their execution past barrier_wait(). + */ +void +barrier_release(barrier_t *b) +{ + barrier_check(b); + g_assert(b->waiting == b->amount); + + mutex_lock(&b->lock); + + g_assert_log(thread_small_id() == b->id, + "%s() not called by master %s but by %s instead", + G_STRFUNC, thread_id_name(b->id), thread_name()); + + /* + * All the waiting threads are waiting for the release count to change. + * This is the end of the barrier cycle, and we're beginning a new one: + * reset the waiting count and the master thread ID. + */ + + b->waiting = 0; + b->release++; + b->id = -1U; + b->has_master = FALSE; + cond_broadcast(&b->event, &b->lock); + + /* + * As soon as we're releasing this lock, threads can concurrently resume + * their execution and possibly re-enter the barrier, one of these threads + * possibly becoming a new master thread. + */ + + mutex_unlock(&b->lock); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/barrier.h
Added
@@ -0,0 +1,82 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Sychronization barrier. + * + * A barrier is a thread synchronization primitive allowing parallel processing + * to halt until all the participating threads have reached the barrier point. + * At which point processing can resume. + * + * The barrier must be initialized with the amount of threads that are going + * to synchronize with it, and the barrier to be used must be given to all the + * participating threads. + * + * The last thread to reach the barrier normally unblocks all the threads. + * The barrier is immediately reset and can be reused at once, thereby + * allowing multiple sequential synchronizations points for all the threads, + * one for each step in the processing algorithm. + * + * However, one of the threads reaching the barrier can request to be the + * first one to continue once all the other threads reached the barrier, + * in which case it will have to explicitly release the other waiting threads. + * This is useful if one thread needs to setup the next computation steps + * for the other threads to peruse once they are released. + * + * Here is our API: + * + * barrier_new() -- allocates a new barrier + * barrier_free_null() -- free dynamically allocated barrier + * barrier_wait() -- wait on the barrier + * barrier_master_wait() -- wait on the barrier, first thread released + * barrier_release() -- release all threads waiting on the barrier + * + * @author Raphael Manfredi + * @date 2013 + */ + +#ifndef _barrier_h_ +#define _barrier_h_ + +struct barrier; +typedef struct barrier barrier_t; + +/* + * Public interface. + */ + +barrier_t *barrier_new(int amount); +barrier_t *barrier_new_full(int amount, bool emulated); +void barrier_free_null(barrier_t **b_ptr); +void barrier_wait(barrier_t *b); +void barrier_master_wait(barrier_t *b); +void barrier_release(barrier_t *b); +barrier_t *barrier_refcnt_inc(barrier_t *b); +barrier_t *barrier_refcnt_dec(barrier_t *b); + +#endif /* _barrier_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/base16.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/base16.c
Changed
@@ -83,7 +83,7 @@ size_t i; if (size / 2 < len) { - len = size * 2; + len = size / 2; } for (i = 0; i < len; i++) { @@ -103,12 +103,12 @@ * @param data start of data to decode * @param len amount of encoded data to decode * - * @return the amount of bytes decoded into the destination. + * @return the amount of bytes decoded into the destination, -1 on error. */ size_t -base16_decode(char *dst, size_t size, const void *data, size_t len) +base16_decode(void *dst, size_t size, const char *data, size_t len) { - const unsigned char *p = data; + const unsigned char *p = cast_to_constpointer(data); char *q = dst; size_t i; @@ -131,7 +131,7 @@ *q++ = (high << 4) | low; } - return q - dst; + return ptr_diff(q, dst); } /* vi: set ai et sts=2 sw=2 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/base16.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/base16.h
Changed
@@ -55,7 +55,7 @@ #include "common.h" -size_t base16_decode(char *dst, size_t size, const void *data, size_t len); +size_t base16_decode(void *dst, size_t size, const char *data, size_t len); size_t base16_encode(char *dst, size_t size, const void *data, size_t len); #endif /* BASE16_HEADER_FILE */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/base32.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/base32.c
Changed
@@ -158,7 +158,7 @@ return q - dst; } -static char base32_map(unsigned char) -1; +static char base32_map(size_t) (unsigned char) -1 + 1; /** * Decode a base32 encoding of `len' bytes of `data' into the buffer `dst'. @@ -170,18 +170,18 @@ * * @return the amount of bytes decoded into the destination. */ -G_GNUC_HOT size_t -base32_decode(char *dst, size_t size, const void *data, size_t len) +size_t G_HOT +base32_decode(void *dst, size_t size, const char *data, size_t len) { - const char *end = &dstsize; - const unsigned char *p = data; + const char *end = ptr_add_offset(dst, size); + const unsigned char *p = cast_to_constpointer(data); char s8; char *q = dst; int pad = 0; size_t i, si; if (0 == base32_map0) { - for (i = 0; i < G_N_ELEMENTS(base32_map); i++) { + for (i = 0; i < N_ITEMS(base32_map); i++) { const char *x; x = memchr(base32_alphabet, ascii_toupper(i), @@ -210,11 +210,11 @@ ssi++ = c; - if (G_N_ELEMENTS(s) == si || pad > 0 || i == len) { + if (N_ITEMS(s) == si || pad > 0 || i == len) { char b5; size_t bi; - memset(&ssi, 0, G_N_ELEMENTS(s) - si); + memset(&ssi, 0, N_ITEMS(s) - si); si = 0; b0 = @@ -235,7 +235,7 @@ ((s6 & 0x07) << 5) | (s7 & 0x1f); - for (bi = 0; bi < G_N_ELEMENTS(b) && q != end; bi++) { + for (bi = 0; bi < N_ITEMS(b) && q != end; bi++) { *q++ = bbi; } } @@ -245,7 +245,7 @@ } } - return q - dst; + return ptr_diff(q, dst); } /* vi: set ai et ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/base32.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/base32.h
Changed
@@ -64,7 +64,7 @@ #ifndef BASE32_HEADER_FILE #define BASE32_HEADER_FILE -size_t base32_decode(char *dst, size_t size, const void *data, size_t len); +size_t base32_decode(void *dst, size_t size, const char *data, size_t len); size_t base32_encode(char *dst, size_t size, const void *data, size_t len); #endif /* BASE32_HEADER_FILE */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/base64.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/base64.c
Changed
@@ -58,7 +58,7 @@ * 15 P 32 g 49 x * 16 Q 33 h 50 y */ -static const gint8 values256 = { +static const int8 values256 = { /* 0 1 2 3 4 5 6 7 8 9 */ /* 0123456789 */ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* - 00 -> 09 */ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* - 10 -> 19 */ @@ -102,12 +102,12 @@ * Furthermore, if `pad' is a non-NULL pointer, it is filled with the amount * of padding chars that would be necessary. */ -static guint encode_pad_length(guint len, guint *pad) +static uint encode_pad_length(uint len, uint *pad) { - guint ndigits; /* Base64 digits necessary */ - guint npad = 0; /* Final padding chars necessary */ - guint tcount; /* Amount of full triplets */ - guint remainder; /* Amount of input bytes in final triplet */ + uint ndigits; /* Base64 digits necessary */ + uint npad = 0; /* Final padding chars necessary */ + uint tcount; /* Amount of full triplets */ + uint remainder; /* Amount of input bytes in final triplet */ g_assert(len > 0); @@ -135,10 +135,10 @@ * Encode `len' bytes from `buf' into `enclen' bytes starting from `encbuf'. * Caller must have ensured that there was EXACTLY the needed room in encbuf. */ -static void base64_encode_exactly(const char *buf, guint len, - char *encbuf, guint enclen) +static void base64_encode_exactly(const char *buf, uint len, + char *encbuf, uint enclen) { - guint32 i = 0; /* Input accumulator, 0 for trailing pad */ + uint32 i = 0; /* Input accumulator, 0 for trailing pad */ char const *ip = buf + len; /* Input pointer, one byte off end */ char *op = encbuf + enclen; /* Output pointer, one byte off end */ @@ -171,17 +171,17 @@ case 0: do { g_assert(op - encbuf >= 4); - i = (guchar) *--ip; /* Input #2 */ + i = (uchar) *--ip; /* Input #2 */ *--op = b64_alphabeti & 0x3f; /* Ouput #3 */ i >>= 6; /* upper <45>, input #2 */ /* FALLTHROUGH */ case 2: - i |= ((guchar) *--ip) << 2; /* had 2 bits in `i' */ + i |= ((uchar) *--ip) << 2; /* had 2 bits in `i' */ *--op = b64_alphabeti & 0x3f; /* Output #2 */ i >>= 6; /* upper <2345>, input #1 */ /* FALLTHROUGH */ case 1: - i |= ((guchar) *--ip) << 4; /* had 4 bits in `i' */ + i |= ((uchar) *--ip) << 4; /* had 4 bits in `i' */ *--op = b64_alphabeti & 0x3f; /* Output #1 */ i >>= 6; /* upper <012345>, input #0 */ *--op = b64_alphabeti & 0x3f; /* Output #0 */ @@ -200,11 +200,11 @@ * @attention * NB: No trailing NUL is emitted. */ -void base64_encode_into(const char *buf, guint len, - char *encbuf, guint enclen) +void base64_encode_into(const char *buf, uint len, + char *encbuf, uint enclen) { - guint pad; - guint exactlen = encode_pad_length(len, &pad); + uint pad; + uint exactlen = encode_pad_length(len, &pad); g_assert(enclen >= (exactlen + pad)); @@ -220,10 +220,10 @@ * @returns the new encoded buffer, NUL-terminated, and the added amount * of padding chars in `retpad' if it is a non-NULL pointer. */ -char *base64_encode(const char *buf, guint len, guint *retpad) +char *base64_encode(const char *buf, uint len, uint *retpad) { - guint pad; - guint enclen = encode_pad_length(len, &pad); + uint pad; + uint enclen = encode_pad_length(len, &pad); char *encbuf = g_malloc(enclen + pad + 1); /* Allow for trailing NUL */ base64_encode_exactly(buf, len, encbuf, enclen); @@ -244,15 +244,15 @@ * * @return decoded bytes if successful, 0 if the input was not valid base64. */ -static guint base64_decode_alphabet(const gint8 valmap256, - const char *buf, guint len, char *decbuf, guint declen) +static uint base64_decode_alphabet(const int8 valmap256, + const char *buf, uint len, char *decbuf, uint declen) { - guint32 i = 0; /* Input accumulator, 0 for trailing pad */ - char const *ip = buf + len; /* Input pointer, one byte off end */ - guint dlen = (len >> 2) * 3; /* Exact decoded length */ + uint32 i = 0; /* Input accumulator, 0 for trailing pad */ + char const *ip = buf + len; /* Input pointer, one byte off end */ + uint dlen = (len >> 2) * 3; /* Exact decoded length */ char *op; /* Output pointer, one byte off end */ - guint bytes; /* Bytes decoded without padding */ - gint8 v; + uint bytes; /* Bytes decoded without padding */ + int8 v; g_assert(buf); g_assert(decbuf); @@ -316,26 +316,26 @@ switch ((ip - buf) % 4) { case 0: do { - v = valmap(guchar) *--ip; /* Input #3 */ + v = valmap(uchar) *--ip; /* Input #3 */ if (v < 0) return 0; i = v; /* FALLTHROUGH */ case 3: - v = valmap(guchar) *--ip; /* Input #2 */ + v = valmap(uchar) *--ip; /* Input #2 */ if (v < 0) return 0; i |= v << 6; /* had 6 bits */ *--op = i & 0xff; /* Output #2 */ i >>= 8; /* lower <0123> of output #1 */ /* FALLTHROUGH */ case 2: - v = valmap(guchar) *--ip; /* Input #1 */ + v = valmap(uchar) *--ip; /* Input #1 */ if (v < 0) return 0; i |= v << 4; /* had 4 bits */ *--op = i & 0xff; /* Output #1 */ i >>= 8; /* lower <01> of output #0 */ /* FALLTHROUGH */ case 1: - v = valmap(guchar) *--ip; /* Input #0 */ + v = valmap(uchar) *--ip; /* Input #0 */ if (v < 0) return 0; i |= v << 2; /* had 2 bits */ *--op = i & 0xff; /* Output #0 */ @@ -355,8 +355,7 @@ * @returns the amount of bytes decoded (without trailing padding) if successful, * 0 if the input was not valid base64. */ -guint base64_decode_into(const char *buf, guint len, - char *decbuf, guint declen) +uint base64_decode_into(const char *buf, uint len, char *decbuf, uint declen) { return base64_decode_alphabet(values, buf, len, decbuf, declen); } @@ -370,11 +369,11 @@ * it is filled with the amount of bytes decoded into the buffer (without * trailing padding). */ -char *base64_decode(const char *buf, guint len, guint *outlen) +char *base64_decode(const char *buf, uint len, uint *outlen) { - guint declen; + uint declen; char *decbuf; - guint decoded; + uint decoded; if (len == 0 || (len & 0x3)) /* Empty, or padding bytes missing */ return NULL;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/base64.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/base64.h
Changed
@@ -40,13 +40,11 @@ * Public interface. */ -char *base64_encode(const char *buf, guint len, guint *retpad); -void base64_encode_into(const char *buf, guint len, - char *encbuf, guint enclen); +char *base64_encode(const char *buf, uint len, uint *retpad); +void base64_encode_into(const char *buf, uint len, char *encbuf, uint enclen); -char *base64_decode(const char *buf, guint len, guint *outlen); -guint base64_decode_into(const char *buf, guint len, - char *decbuf, guint declen); +char *base64_decode(const char *buf, uint len, uint *outlen); +guint base64_decode_into(const char *buf, uint len, char *decbuf, uint declen); #endif /* _base64_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/bfd_util.c
Added
@@ -0,0 +1,763 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * BFD library wrapper functions. + * + * This interface is a wrapping API on top of the BFD library which allows + * to conveniently perform operations on a set of files within one execution + * "environment". All the resources are cleaned up when the environment is + * released. + * + * Symbol resolution is typically a two-step operation: + * + * 1- Given a file where the symbol is supposedly located, get the BFD context + * for that file. + * + * 2- Query the BFD context for the address. + * + * The environment keeps all the underlying BFD files opened until it is + * closed. The environment of execution is typically the symbol extraction + * from an executable to format a nice stack trace, for instance. + * + * Once the environment has been closed, all the BFD contexts are released + * and any dangling reference to them becomes unusable. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#ifdef HAS_BFD_LIBRARY +/* + * Starting with binutils 2.23, we need to define two symbols to be able + * to compile with <bfd.h>. It is a shame to have to go through contorsions + * like that, but the BFD folks wish to keep their library unsuitable for + * the general use. + * + * See https://sourceware.org/bugzilla/show_bug.cgi?id=15920 + * + * Their mindset being what it is, let's be smarter and adapt. There is no + * way we are going to bloat our source tree by including a version of the BFD + * sources, just to workaround a library design bug! + * --RAM, 2013-09-94 + * + * There's no need to define the PACKAGE symbol: since it is present in a + * comment, that metaconfig symbol will be automatically defined in config.h. + */ +#define PACKAGE_VERSION /* PACKAGE is already a metaconfig symbol */ + +#include <bfd.h> + +#undef PACKAGE_VERSION +#endif /* HAS_BFD_LIBRARY */ + +#include "bfd_util.h" +#include "concat.h" +#include "mutex.h" +#include "once.h" +#include "path.h" +#include "symbols.h" +#include "vmm.h" /* For vmm_page_start() */ +#include "xmalloc.h" + +#include "override.h" /* Must be the last header included */ + +#ifdef HAS_BFD_LIBRARY + +enum bfd_ctx_magic { BFD_CTX_MAGIC = 0x3bb7920e }; + +struct bfd_ctx { + enum bfd_ctx_magic magic; /* Magic number */ + bfd *handle; /* Opened handle on binary file */ + asymbol **symbols; /* Symbol table */ + size_t offset; /* Memory mapping offset */ + symbols_t *text_symbols; /* Text-only symbols */ + mutex_t lock; /* Thread-safe access */ + unsigned symsize; /* Symbol size in the symbols array */ + long count; /* Amount of symbols in symbols */ + uint dynamic:1; /* Whether symbols holds dynamic symbols */ + uint offseted:1; /* Whether mapping offset was computed */ +}; + +struct bfd_list { + char *path; /* Executable / library path */ + struct bfd_ctx *bc; /* Opened binary context */ + struct bfd_list *next; /* Next in list */ +}; + +enum bfd_env_magic { BFD_ENV_MAGIC = 0x53378fa3 }; + +struct bfd_env { + enum bfd_env_magic magic; /* Magic number */ + struct bfd_list *head; /* List of allocated contexts */ + mutex_t lock; /* Lock for thread-safe access */ +}; + +struct symbol_ctx { + struct symbol_loc location; + asymbol **symbols; + bfd_vma addr; +}; + +static inline void +bfd_ctx_check(const struct bfd_ctx * const bc) +{ + g_assert(bc != NULL); + g_assert(BFD_CTX_MAGIC == bc->magic); +} + +static inline void +bfd_env_check(const struct bfd_env * const be) +{ + g_assert(be != NULL); + g_assert(BFD_ENV_MAGIC == be->magic); +} + +/** + * Load text symbols from the file into supplied table. + * + * @param bc the BFD context pointing to the file + * @param st the symbol table where symbols should be added + */ +static void +bfd_util_load_text(bfd_ctx_t *bc, symbols_t *st) +{ + long i; + asymbol* empty; + void *p; + + bfd_ctx_check(bc); + g_assert(st != NULL); + + if (0 == bc->count) + return; + + mutex_lock_fast(&bc->lock); + + g_assert(bc->symbols != NULL); + + empty = bfd_make_empty_symbol(bc->handle); + symbols_lock(st); + + for ( + i = 0, p = bc->symbols; + i < bc->count; + i++, p = ptr_add_offset(p, bc->symsize) + ) { + asymbol *sym; + symbol_info syminfo; + + sym = bfd_minisymbol_to_symbol(bc->handle, bc->dynamic, p, empty); + bfd_get_symbol_info(bc->handle, sym, &syminfo); + + if ('T' == syminfo.type || 't' == syminfo.type) { + const char *name = bfd_asymbol_name(sym); + + if (name != NULL && name0 != '.') { + void *addr = ulong_to_pointer(syminfo.value); + symbols_append(st, addr, name); + } + } + } + + symbols_unlock(st); + mutex_unlock_fast(&bc->lock); +} + +/** + * Lookup callback. + */ +static void +bfd_util_lookup_section(bfd *b, asection *sec, void *data) +{ + struct symbol_ctx *sc = data; + bfd_vma vma; + + if (sc->location.function != NULL) + return; /* Already found */ + + if (0 == (bfd_get_section_flags(b, sec) & SEC_ALLOC)) + return; + + vma = bfd_get_section_vma(b, sec); + if (sc->addr < vma || sc->addr >= bfd_get_section_size(sec) + vma) + return; + + bfd_find_nearest_line(b, sec, sc->symbols, sc->addr - vma, + &sc->location.file, &sc->location.function, &sc->location.line); +} + +/** + * Locate a symbol at the given addres. + * + * @param bc the BFD context retrieved by bfd_util_get_context() + * @param addr the address of the symbol + * @param loc where location information is returned + * + * @return TRUE if the symbol address was located. + */ +bool +bfd_util_locate(bfd_ctx_t *bc, const void *addr, struct symbol_loc *loc) +{ + struct symbol_ctx sc; + const void *lookaddr; + const char *name; + + g_assert(loc != NULL); + + if G_UNLIKELY(NULL == bc) + return FALSE; + + bfd_ctx_check(bc); + + mutex_lock_fast(&bc->lock); + + ZERO(&sc); + lookaddr = const_ptr_add_offset(addr, bc->offset); + sc.addr = pointer_to_ulong(lookaddr); + sc.symbols = bc->symbols; + + bfd_map_over_sections(bc->handle, bfd_util_lookup_section, &sc); + + if (sc.location.function != NULL) { + *loc = sc.location; /* Struct copy */ + mutex_unlock_fast(&bc->lock); + return TRUE; + } + + /* + * For some reason the BFD library successfully loads symbols but is not + * able to locate them through bfd_map_over_sections(). + * + * Load the symbol table ourselves and perform the lookup then. We will + * only be able to fill the routine name, and not the source code + * information but that is better than nothing. + */ + + if (NULL == bc->text_symbols) { + bc->text_symbols = symbols_make(bc->count, FALSE); + bfd_util_load_text(bc, bc->text_symbols); + symbols_sort(bc->text_symbols); + } + + name = symbols_name_only(bc->text_symbols, lookaddr, FALSE); + if (name != NULL) { + ZERO(loc); + loc->function = name; + mutex_unlock_fast(&bc->lock); + return TRUE; + } + + mutex_unlock_fast(&bc->lock); + return FALSE; +} + +/** + * Check opened bfd for format. + * + * @return TRUE if it matches the format, FALSE otherwise. + */ +static bool +bfd_util_check_format(bfd *b, bfd_format fmt, const char *path) +{ + char **matching; + unsigned i = 0; + + if (bfd_check_format(b, fmt)) + return TRUE; + + if (bfd_error_file_ambiguously_recognized != bfd_get_error()) + return FALSE; + + if (!bfd_check_format_matches(b, fmt, &matching)) + return FALSE; + + s_miniwarn("%s: ambiguous format matching for %s", G_STRFUNC, path); + + while (matchingi != NULL) { + s_miniwarn("%s: possible format is \"%s\"", G_STRFUNC, matchingi); + i++; + } + + free(matching); /* Not xfree(), was allocated by bfd */ + return FALSE; +} + +/** + * Initialize the bfd context. + * + * @return TRUE if OK. + */ +static bool +bfd_util_open(bfd_ctx_t *bc, const char *path) +{ + static mutex_t bfd_library_mtx = MUTEX_INIT; + bfd *b; + void *symbols = NULL; + unsigned size = 0; + long count; + int fd = -1; + const char *libpath = path; + + /* + * On Debian systems, there is a debugging version of libraries held + * under /usr/lib/debug. We'll get better symbol resolution by + * opening these instead of the usually stripped runtime versions + * that will only contain externally visible symbols. + */ + + if (!is_running_on_mingw() && is_absolute_path(path)) { + static char debugpathMAX_PATH_LEN; + const char *base = filepath_basename(path); + + concat_strings(debugpath, sizeof debugpath, + "/usr/lib/debug/", base, NULL_PTR); + + fd = open(debugpath, O_RDONLY); + if (-1 == fd) { + concat_strings(debugpath, sizeof debugpath, + "/usr/lib/debug", path, NULL_PTR); + fd = open(debugpath, O_RDONLY); + } + if (-1 != fd) + libpath = debugpath; + } + + if (-1 == fd) + fd = open(libpath, O_RDONLY); + + if (-1 == fd) { + s_miniwarn("%s: can't open %s: %m", G_STRFUNC, libpath); + return FALSE; + } + + /* + * Protect calls to BFD opening: they don't appear to be fully + * thread-safe and we could enter here concurrently. + */ + + mutex_lock_fast(&bfd_library_mtx); + + b = bfd_fdopenr(libpath, NULL, fd); + if (NULL == b) { + mutex_unlock_fast(&bfd_library_mtx); + close(fd); + return FALSE; + } + + if (!bfd_util_check_format(b, bfd_object, libpath)) { + s_miniwarn("%s: %s is not an object", G_STRFUNC, libpath); + goto failed; + } + + if (0 == (bfd_get_file_flags(b) & HAS_SYMS)) { + s_miniwarn("%s: %s has no symbols", G_STRFUNC, libpath); + goto failed; + } + + count = bfd_read_minisymbols(b, FALSE, &symbols, &size); + if (count <= 0) { + bc->dynamic = TRUE; + count = bfd_read_minisymbols(b, TRUE, &symbols, &size); + } + + if (count >= 0) + goto done; + + s_miniwarn("%s: unable to load symbols from %s ", G_STRFUNC, libpath); + symbols = NULL; + /* FALL THROUGH */ + + /* + * We keep the context on errors to avoid logging them over and over + * each time we attempt to access the same file. The BFD and system + * resources are released though. + */ + +failed: + bfd_close(b); + b = NULL; + count = 0; + /* FALL THROUGH */ + +done: + mutex_unlock_fast(&bfd_library_mtx); + + bc->magic = BFD_CTX_MAGIC; + bc->handle = b; + bc->symbols = symbols; /* Allocated by the bfd library */ + bc->count = count; + bc->symsize = size; + mutex_init(&bc->lock); + + return TRUE; +} + +/** + * Close BFD context, releasing its resources and nullifying its pointer. + */ +static void +bfd_util_close_context_null(bfd_ctx_t **bc_ptr) +{ + bfd_ctx_t *bc = *bc_ptr; + + if (bc != NULL) { + mutex_lock(&bc->lock); /* Not a fast mutex since we'll destroy it */ + if (bc->symbols != NULL) + free(bc->symbols); /* Not xfree(): created by the bfd library */ + + /* + * We use bfd_close_all_done() and not bfd_close() because the latter + * causes a SIGSEGV now that we are using bfd_fdopenr(). The fault + * occurs in some part trying to write changes to the file... + * + * Since the file is opened as read-only and we don't expect any + * write operation, using bfd_close_all_done() is a viable workaround + * for this BFD library bug. + */ + + if (bc->handle != NULL) + bfd_close_all_done(bc->handle); /* Workaround for BFD bug */ + symbols_free_null(&bc->text_symbols); + bc->magic = 0; + mutex_destroy(&bc->lock); + xfree(bc); + *bc_ptr = NULL; + } +} + +/** + * Get a binary file context for the given program / library path. + */ +static bfd_ctx_t * +bfd_util_get_bc(struct bfd_list **list, const char *path) +{ + struct bfd_list *item = *list; + bfd_ctx_t bc, *bp; + + /* + * We're probably crashing, use simple data structures, and not a + * hash table / hash list here. We're going to handle only a handful + * of modules, so linear lookups are perfectly OK. + */ + + while (item != NULL) { + if (0 == strcmp(path, item->path)) + return item->bc; + item = item->next; + } + + ZERO(&bc); + + if (!bfd_util_open(&bc, path)) + return NULL; + + bp = XCOPY(&bc); + item = xmalloc(sizeof *item); + item->bc = bp; + item->path = xstrdup(path); + + /* Insert at head of list */ + + item->next = *list; + *list = item; + + return bp; +} + +/** + * Compute the mapping offset for the program / library. + * + * The .text section could say 0x500000 but the actual virtual memory + * address where the library was mapped could be 0x600000. Hence looking + * for addresses at 0x6xxxxx would not create any match with the symbol + * addresses held in the file. + * + * The base given here should be the actual VM address where the kernel + * loaded the first section. + * + * The computed offset will then be automatically used to adjust the given + * addresses being looked at, remapping them to the proper range for lookup + * purposes. + * + * @param bc the BFD context (NULL allowed for convenience) + * @param base the VM mapping address of the text segment + */ +void +bfd_util_compute_offset(bfd_ctx_t *bc, ulong base) +{ + asection *sec; + bfd *b; + + if (NULL == bc) + return; /* Convenience */ + + bfd_ctx_check(bc); + + if (bc->offseted || NULL == bc->handle) + return; + + mutex_lock_fast(&bc->lock); + + if (bc->offseted) { + mutex_unlock_fast(&bc->lock); + return; + } + + b = bc->handle; + if (NULL == b) { + mutex_unlock_fast(&bc->lock); + return; + } + + /* + * Take the first section of the file and look where its page would start. + * Then compare that to the advertised mapping base for the object to + * know the offset we have to apply for proper symbol resolution. + */ + + sec = b->sections; + + /* + * Notes for later: sections are linked through sec->next. + * + * It is possible to gather the section name via: + * const char *name = bfd_section_name(b, sec); + */ + + if (sec != NULL) { + bfd_vma addr = bfd_section_vma(b, sec); + + bc->offset = ptr_diff(vmm_page_start(ulong_to_pointer(addr)), + vmm_page_start(ulong_to_pointer(base))); + } + + bc->offseted = TRUE; + mutex_unlock_fast(&bc->lock); +} + +/** + * Free the whole list of binary contexts. + */ +static void +bfd_util_free_list(struct bfd_list *list) +{ + struct bfd_list *item = list; + + while (item != NULL) { + struct bfd_list *next = item->next; + xfree(item->path); + bfd_util_close_context_null(&item->bc); + item->next = NULL; + xfree(item); + item = next; + } +} + +/** + * Initialze a BFD symbol lookup environment context. + * + * @return new context that will need to be closed with bfd_util_close_null(). + */ +bfd_env_t * +bfd_util_init(void) +{ + static once_flag_t done; + bfd_env_t *be; + + XMALLOC0(be); + be->magic = BFD_ENV_MAGIC; + mutex_init(&be->lock); + + ONCE_FLAG_RUN(done, bfd_init); + + return be; +} + +/** + * Get a binary file context for the given program / library path. + * + * @param be the BFD environment created by bfd_util_init() + * @param path pathname of the program / library + * + * @return BFD context that can be queried for symbol resolution, NULL if + * it is not possible to gather any information from the specified path. + */ +bfd_ctx_t * +bfd_util_get_context(bfd_env_t *be, const char *path) +{ + bfd_ctx_t *bc; + + bfd_env_check(be); + g_assert(path != NULL); + + mutex_lock_fast(&be->lock); + bc = bfd_util_get_bc(&be->head, path); + mutex_unlock_fast(&be->lock); + + return bc; +} + +/** + * Are symbols available for this BFD context? + */ +bool +bfd_util_has_symbols(const bfd_ctx_t *bc) +{ + bfd_ctx_check(bc); + + return bc->symbols != NULL; +} + +/** + * Release the environment and its associated BFD contexts. + */ +static void +bfd_util_close(bfd_env_t *be) +{ + bfd_env_check(be); + + mutex_lock(&be->lock); /* Not a fast mutex since we'll destroy it */ + bfd_util_free_list(be->head); + be->magic = 0; + mutex_destroy(&be->lock); + xfree(be); +} + +/** + * Close environment, freeing up all the associated resources, then nullifying + * the referenced pointer. + */ +void +bfd_util_close_null(bfd_env_t **be_ptr) +{ + bfd_env_t *be = *be_ptr; + + if (be != NULL) { + bfd_util_close(be); + *be_ptr = NULL; + } +} + +/** + * Load text symbols into the supplied symbol table from the specified file. + * + * This is equivalent to running "nm -p file" and parsing back the results + * although we do not have to actually launch a new process and parse the + * command output: the symbol extraction is handled by the BFD library. + * + * Symbols are merely appended to the symbol table, which will need to be + * sorted before being + * + * @param st the symbol table into which loaded symbols are added + * @param file the object file where symbols should be extracted from + * + * @return whether we could attempt loading from the file (regardless of the + * presence of symbol information). + */ +bool +bfd_util_load_text_symbols(symbols_t *st, const char *file) +{ + bfd_env_t *be; + bfd_ctx_t *bc; + + g_assert(st != NULL); + g_assert(file != NULL); + + be = bfd_util_init(); + bc = bfd_util_get_context(be, file); + if (bc != NULL) + bfd_util_load_text(bc, st); + + bfd_util_close(be); + return TRUE; +} + +#else /* !HAS_BFD_LIBRARY */ + +bfd_env_t * +bfd_util_init(void) +{ + return NULL; +} + +bfd_ctx_t * +bfd_util_get_context(bfd_env_t *env, const char *path) +{ + g_assert(NULL == env); + g_assert(path != NULL); + + return NULL; +} + +bool +bfd_util_locate(bfd_ctx_t *bc, const void *addr, struct symbol_loc *loc) +{ + g_assert(loc != NULL); + g_assert(NULL == bc); + + (void) addr; + + return FALSE; +} + +bool +bfd_util_has_symbols(const bfd_ctx_t *bc) +{ + g_assert(NULL == bc); + + return FALSE; +} + +void +bfd_util_compute_offset(bfd_ctx_t *bc, ulong base) +{ + g_assert(NULL == bc); + (void) base; +} + +bool +bfd_util_load_text_symbols(symbols_t *st, const char *filepath) +{ + g_assert(st != NULL); + g_assert(filepath != NULL); + + return FALSE; +} + +void +bfd_util_close_null(bfd_env_t **be_ptr) +{ + g_assert(NULL == *be_ptr); + + /* Nothing to do */ +} + +#endif /* HAS_BFD_LIBRARY */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/bfd_util.h
Added
@@ -0,0 +1,70 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * BFD library wrapper functions. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _bfd_util_h_ +#define _bfd_util_h_ + +struct bfd_ctx; +typedef struct bfd_ctx bfd_ctx_t; + +struct bfd_env; +typedef struct bfd_env bfd_env_t; + +/** + * A symbol location, as filled by bfd_util_locate(). + */ +struct symbol_loc { + const char *function; + const char *file; + unsigned line; +}; + +/* + * Public interface. + */ + +bfd_env_t *bfd_util_init(void); +bfd_ctx_t *bfd_util_get_context(bfd_env_t *be, const char *path); +bool bfd_util_locate(bfd_ctx_t *bc, const void *pc, struct symbol_loc *loc); +bool bfd_util_has_symbols(const bfd_ctx_t *bc); +void bfd_util_close_null(bfd_env_t **be_ptr); +void bfd_util_compute_offset(bfd_ctx_t *bc, ulong base); + +struct symbols; + +bool bfd_util_load_text_symbols(struct symbols *st, const char *file); + +#endif /* _bfd_util_h_ */ + +/* vi: set ts=4 sw=4 cindent: */ +
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/bg.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/bg.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2013 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -31,37 +31,161 @@ * be split up in small chunks of processing because it would block the * process for too long if executed atomically. * + * It can be thought of as a co-routine, its execution being done + * alternatively with that of the calling routine, excepted that there + * can be many such co-routines running concurrently in the same thread. + * + * Background tasks are inserted into schedulers, and these schedulers are + * then explictly triggered to perform work. A scheduler is given a time + * slice to share with all the tasks that have been registered. + * + * There is a default scheduler which is invoked periodically by the main + * callout queue. Other threads may want to define their own scheduler + * and configure it with large timeslices to perform the work more quickly. + * + * Each background task is defined by a set of steps to run, in sequence. + * The scheduler provides an amount of "ticks" and the task should run its + * processing for that many "ticks". Of course, the value of a tick will + * depend on the step being performed, and the scheduler constantly tries to + * estimate the time cost for a tick to be able to dynamically adjust the + * amount of requested ticks. + * + * Each step is a routine that can return four statuses: + * + * BGR_MORE to request that the scheduler continues to run this step + * BGR_NEXT to request to move to the next step, if any + * BGR_DONE to signal that the processing is completed and the task can exit + * BGR_EXIT to indicate a fatal error and terminate the task immediately + * + * The background task is associated to a "user context", which is a structure + * provided by the user code and which is passed along to each step. This is + * the place to store global task information, to make sure each step can + * stop its processing and resume it later, restarting at the same spot. + * + * A background task can be cancelled. This will cause the BG_SIG_TERM to + * be sent to the task, which it can trap. If it does not terminate explicitly, + * it will be forcefully terminated upon return from this signal handler. + * Cancellation is tested in the scheduler before and after each step, and + * can also be explictly checked for by the task. + * + * When a task terminates (either by returning BGR_DONE, BGR_EXIT, calling + * bg_task_exit(), being cancelled), there are two callbacks that are invoked + * in order: + * + * - An optional "done" callback letting user code be informed that the task + * is being terminated. It is given the background task handle, which is + * still valid at that stage and can be probed or acted upon via getters + * and setters. + * + * - An optional "context freeing" callback letting user code free-up the + * allocated context. This callback only gets the context, not the task + * handle so it cannot access it unless it kept a copy of that task handle. + * + * Both callbacks are defined at task creation time. + * + * There is a special kind a background task, so-called a "daemon" task in + * that, like a UNIX daemon, it waits for work to be added to wake up and + * process it. The daemon task is equipped with callbacks to start and end + * processing of enqueued work items, as well as a free routine for these + * work items. + * + * The difficult part of background tasks is that processing needs to be + * sequential, and each step needs to be able to interrupt its processing at + * any time and resume it at the next invocation. Moreover, the context is + * global to the processing, not lexically scoped as it would be if the + * code was written as a set of routines and not as a big co-routine. This + * makes it more complex and tedious to write, but it gives nice multiplexing + * in an execution thread for "heavy" computations. + * * @author Raphael Manfredi - * @date 2002-2003 + * @date 2002-2003, 2013 */ #include "common.h" #include "bg.h" + +#include "atoms.h" #include "cq.h" +#include "elist.h" +#include "entropy.h" +#include "eslist.h" +#include "log.h" /* For s_debug() and friends */ #include "misc.h" +#include "mutex.h" +#include "once.h" +#include "pslist.h" +#include "spinlock.h" +#include "stacktrace.h" +#include "stringify.h" /* For short_time_ascii() and plural() */ #include "tm.h" #include "walloc.h" -#include "glib-missing.h" -#include "stacktrace.h" #include "override.h" /* Must be the last header included */ -enum bgtask_magic { - BGTASK_MAGIC = 0x3acc931dU, - BGTASK_DEAD_MAGIC = 0x6f5c8a03U -}; - #define MAX_LIFE 50000UL /**< In usecs, MUST be << 250 ms */ #define DELTA_FACTOR 2 /**< Max variations are 200% */ #define BG_TICK_IDLE 1000 /**< Tick every second when idle */ #define BG_TICK_BUSY 250 /**< Tick every 250 ms when busy */ -static struct { - cperiodic_t *pev; /**< Ticker periodic event */ - int period; /**< Current period */ -} bg_ticker; +#define BG_JUMP_END 1 +#define BG_JUMP_CANCEL 2 + +enum bgsched_magic { + BGSCHED_MAGIC = 0x57a5ea07, +}; + +/** + * A background task scheduler (usually one per thread that can run tasks). + * + * Scheduling of tasks held in the scheduler is done by bg_sched_timer(). + * + * A scheduler can have a periodic event scheduled in the main callout queue + * or can be manually triggered periodically from an auxiliary thread. + * + * A scheduler must be run by the same thread: once it has begun to run tasks + * in a thread, it can only be called for that thread. This constraint is + * needed to be able to know on which thread a task is running, to handle + * cancellation from foreign threads. + */ +struct bgsched { + enum bgsched_magic magic; /**< Magic number */ + const char *name; /**< Scheduler name (atom, for logging) */ + eslist_t runq; /**< List of runnable tasks */ + eslist_t sleepq; /**< List of sleeping tasks */ + eslist_t dead_tasks; /**< Dead tasks to reclaim */ + bgtask_t *current_task; /**< Current task scheduled */ + size_t completed; /**< Completed tasks */ + ulong max_life; /**< Maximum life when scheduled, in usecs */ + ulong wtime; /**< Wall-clock run time, in ms */ + int runcount; /**< Amount of runnable tasks */ + int period; /**< Scheduling period for callout, in ms */ + unsigned stid; /**< Thread running scheduler, -1 if unknown */ + cperiodic_t *pev; /**< Ticker periodic event */ + mutex_t lock; /**< Thread-safe lock */ + link_t lnk; /**< Links all active schedulers */ +}; + +static inline void +bg_sched_check(const struct bgsched * const bs) +{ + g_assert(bs != NULL); + g_assert(BGSCHED_MAGIC == bs->magic); +} + +#define BG_SCHED_LOCK(s) mutex_lock_const(&(s)->lock) +#define BG_SCHED_UNLOCK(s) mutex_unlock_const(&(s)->lock) + +#define BGTASK_MAGIC_MASK 0xffffff00 /* Leading 24 bits set */ +#define BGTASK_MAGIC_BASE 0x3acc9300 /* Leading 24 bits significant */ + + +enum bgtask_magic { + BGTASK_TASK_MAGIC = BGTASK_MAGIC_BASE + 0x1d, + BGTASK_DAEMON_MAGIC = BGTASK_MAGIC_BASE + 0x85, + BGTASK_DEAD_MAGIC = 0x6f5c8a03 +}; /** * Internal representation of a user-defined task. @@ -78,21 +202,25 @@ */ struct bgtask { enum bgtask_magic magic;/**< Magic number */ - guint32 flags; /**< Operating flags */ + uint32 flags; /**< Operating flags (internally modified) */ + uint32 uflags; /**< User flags (can be externally modified) */ const char *name; /**< Task name */ + struct bgsched *sched; /**< Scheduler to which task is attached */ + int refcnt; /**< Reference count on task */ int step; /**< Current processing step */ int seqno; /**< Number of calls at same step */ + bgstatus_t status; /**< Final exit status */ bgstep_cb_t *stepvec; /**< Set of steps to run in sequence */ int stepcnt; /**< Amount of steps in the `stepvec' array */ - gpointer ucontext; /**< User context */ + void *ucontext; /**< User context */ time_t created; /**< Creation time */ - int wtime; /**< Wall-clock run time sofar, in ms */ + ulong wtime; /**< Wall-clock run time sofar, in ms */ bgclean_cb_t uctx_free; /**< Free routine for context */ bgdone_cb_t done_cb; /**< Called when done */ - gpointer done_arg; /**< "done" callback argument */ + void *done_arg; /**< "done" callback argument */ int exitcode; /**< Final "exit" code */ bgsig_t signal; /**< Last signal delivered */ - GSList *signals; /**< List of signals pending delivery */ + pslist_t *signals; /**< List of signals pending delivery */ jmp_buf env; /**< Only valid when TASK_F_RUNNING */ tm_t start; /**< Start time of scheduling "tick" */ int ticks; /**< Scheduling ticks for time slice */ @@ -101,41 +229,75 @@ int elapsed; /**< Elapsed during last run, in usec */ double tick_cost; /**< Time in ms. spent by each tick */ bgsig_cb_t sighBG_SIG_COUNT; /**< Signal handlers */ + spinlock_t lock; /**< Thread-safe lock */ + slink_t bgt_link; /**< Links task in appropriate list */ +}; - /* - * Daemon tasks. - */ - - GSList *wq; /**< Work queue (daemon task only) */ +/* + * Daemon tasks. + */ +struct bgdaemon { + struct bgtask task; /**< Common task attributes */ + pslist_t *wq; /**< Work queue (daemon task only) */ + size_t wq_count; /**< Size of work queue */ + size_t wq_done; /**< Amount of items processed */ bgstart_cb_t start_cb; /**< Called when starting working on an item */ bgend_cb_t end_cb; /**< Called when finished working on an item */ bgclean_cb_t item_free; /**< Free routine for work queue items */ bgnotify_cb_t notify; /**< Start/Stop notification (optional) */ }; -/* +static inline void +bg_task_check(const struct bgtask * const bt) +{ + g_assert(bt != NULL); + g_assert(BGTASK_MAGIC_BASE == (bt->magic & BGTASK_MAGIC_MASK)); +} + +#define BG_TASK_LOCK(t) spinlock(&(t)->lock) +#define BG_TASK_TRYLOCK(t) spinlock_try(&(t)->lock) +#define BG_TASK_UNLOCK(t) spinunlock(&(t)->lock) + +static inline bool +bg_task_is_daemon(const struct bgtask * const bt) +{ + return bt != NULL && BGTASK_DAEMON_MAGIC == bt->magic; +} + +#define BG_DAEMON(t) (bg_task_is_daemon(t) ? (struct bgdaemon *) (t) : NULL) + +/** * Operating flags. */ - enum { - TASK_F_EXITED = 1 << 0, /**< Exited */ - TASK_F_SIGNAL = 1 << 1, /**< Signal received */ - TASK_F_RUNNING = 1 << 2, /**< Task is running */ - TASK_F_ZOMBIE = 1 << 3, /**< Task waiting status collect */ - TASK_F_NOTICK = 1 << 4, /**< Do no recompute tick info */ - TASK_F_SLEEPING = 1 << 5, /**< Task is sleeping */ - TASK_F_RUNNABLE = 1 << 6, /**< Task is runnable */ - TASK_F_DAEMON = 1 << 7 /**< Task is a daemon */ + TASK_F_CANCELLING = 1 << 7, /**< Task handling cancel request */ + TASK_F_DAEMON = 1 << 6, /**< Task is a daemon */ + TASK_F_RUNNABLE = 1 << 5, /**< Task is runnable */ + TASK_F_SLEEPING = 1 << 4, /**< Task is sleeping */ + TASK_F_ZOMBIE = 1 << 3, /**< Task waiting status collect */ + TASK_F_RUNNING = 1 << 2, /**< Task is running */ + TASK_F_SIGNAL = 1 << 1, /**< Signal received */ + TASK_F_EXITED = 1 << 0 /**< Exited */ }; -static inline void -bg_task_check(const struct bgtask * const bt) -{ - g_assert(bt); - g_assert(BGTASK_MAGIC == bt->magic); -} +/** + * User flags, can only be modified with the task locked. + */ +enum { + TASK_UF_SLEEPING = 1 << 3, /**< Task put to user-induced sleep */ + TASK_UF_SLEEP_REQ = 1 << 2, /**< Task requesting to be put to sleep */ + TASK_UF_NOTICK = 1 << 1, /**< Do no recompute tick info */ + TASK_UF_CANCELLED = 1 << 0, /**< Task has been cancelled */ +}; static unsigned bg_debug; +static bool bg_closed; +static bgsched_t *bg_sched; /**< Main (default) scheduler */ +static elist_t bg_sched_list = ELIST_INIT(offsetof(struct bgsched, lnk)); +static spinlock_t bg_sched_list_slk = SPINLOCK_INIT; + +#define BG_SCHED_LIST_LOCK spinlock(&bg_sched_list_slk) +#define BG_SCHED_LIST_UNLOCK spinunlock(&bg_sched_list_slk) /** * Set debugging level. @@ -146,37 +308,216 @@ bg_debug = level; } -/* - * Access routines to internal fields. +/** + * Add scheduler to the list. + */ +static void +bg_sched_list_add(bgsched_t *bs) +{ + BG_SCHED_LIST_LOCK; + elist_append(&bg_sched_list, bs); + BG_SCHED_LIST_UNLOCK; +} + +/** + * Remove scheduler from the list. + */ +static void +bg_sched_list_remove(bgsched_t *bs) +{ + BG_SCHED_LIST_LOCK; + elist_remove(&bg_sched_list, bs); + BG_SCHED_LIST_UNLOCK; +} + +/** + * @return the current step index for the task. */ +int +bg_task_step(const bgtask_t *bt) +{ + bg_task_check(bt); + return bt->step; +} +/** + * @return the amount of times current step was called for the task. + */ int -bg_task_seqno(const struct bgtask *bt) +bg_task_seqno(const bgtask_t *bt) { bg_task_check(bt); return bt->seqno; } -gpointer -bg_task_context(const struct bgtask *bt) +/** + * @return the context registered for the task. + */ +void * +bg_task_context(const bgtask_t *bt) { bg_task_check(bt); return bt->ucontext; } -static int bg_runcount; -static GSList *runq; -static GSList *sleepq; -static GSList *dead_tasks; +/** + * @return the task name. + */ +const char * +bg_task_name(const bgtask_t *bt) +{ + bg_task_check(bt); + return bt->name; +} + +/** + * @return the amount of milliseconds spent working on this task (wall-clock). + */ +unsigned long +bg_task_wtime(const bgtask_t *bt) +{ + bg_task_check(bt); + return bt->wtime; +} + +/** + * @return the task's current step name, for logging purposes. + */ +const char * +bg_task_step_name(bgtask_t *bt) +{ + bgstep_cb_t step; + bool locked; + + bg_task_check(bt); + + /* + * This routine can be called with the scheduler locked, and the normal + * lock order is task, then scheduler. So to avoid deadlocks, and since + * this is only for logging purposes and we don't otherwise expect any + * contention, we only lock if possible. We're only reading anyway. + * --RAM, 2015-03-06 + */ + + locked = BG_TASK_TRYLOCK(bt); + + step = bt->stepvecbt->step; + + if (locked) + BG_TASK_UNLOCK(bt); + + return stacktrace_function_name(step); +} + +/** + * @return the task's exit code. + */ +int +bg_task_exitcode(bgtask_t *bt) +{ + uint32 flags; + int exitcode; + + bg_task_check(bt); + + BG_TASK_LOCK(bt); + flags = bt->flags; + exitcode = bt->exitcode; + bt->flags &= ~TASK_F_ZOMBIE; /* Got the exit code */ + BG_TASK_UNLOCK(bt); + + if G_UNLIKELY(0 == (TASK_F_EXITED & flags)) { + s_carp("%s(): calling on non-terminated task %p \"%s\", " + "currently in %s()", + G_STRFUNC, bt, bt->name, bg_task_step_name(bt)); + return 0; + } + + return exitcode; +} + +/** + * Set new context for background task. + * + * @param bt the background task + * @param ucontext the new user context + * + * @return the old context. + */ +void * +bg_task_set_context(bgtask_t *bt, void *ucontext) +{ + void *old; + + bg_task_check(bt); + + BG_TASK_LOCK(bt); + old = bt->ucontext; + bt->ucontext = ucontext; + BG_TASK_UNLOCK(bt); + + return old; +} + +/** + * @return the symbolic mapping of the task exit status. + */ +const char * +bgstatus_to_string(bgstatus_t status) +{ + switch (status) { + case BGS_OK: return "OK"; + case BGS_ERROR: return "ERROR"; + case BGS_KILLED: return "KILLED"; + case BGS_CANCELLED: return "CANCELLED"; + } + + return "UNKNOWN"; +} + +/** + * Assert that a background task is currently running. + */ +static void +bg_task_is_running(bgtask_t *bt, const char *routine) +{ + g_assert_log(bt->flags & TASK_F_RUNNING, + "%s(): task %p \"%s\" must be running to call %s(), flags=0x%x", + G_STRFUNC, bt, bt->name, routine, bt->flags); +} + +/** + * Assert that a background task is currently sleeping or has been flagged + * for sleeping. + */ +static void +bg_task_is_sleeping(bgtask_t *bt, const char *routine) +{ + g_assert_log( + (bt->uflags & + (TASK_UF_SLEEP_REQ | TASK_UF_SLEEPING | TASK_UF_CANCELLED)), + "%s(): task %p \"%s\" must be sleeping to call %s(), " + "flags=0x%x, uflags=0x%x", + G_STRFUNC, bt, bt->name, routine, bt->flags, bt->uflags); +} /** - * Add new task to the scheduler (run queue). + * Add new task to its scheduler (run queue). */ static void -bg_sched_add(struct bgtask *bt) +bg_sched_add(bgtask_t *bt) { + bgsched_t *bs; + bg_task_check(bt); + + bs = bt->sched; + bg_sched_check(bs); + + BG_SCHED_LOCK(bs); + g_assert(!(bt->flags & TASK_F_RUNNABLE)); /* Not already in list */ + g_assert(!(bt->flags & TASK_F_SLEEPING)); /* * Enqueue task at the tail of the runqueue. @@ -184,41 +525,94 @@ */ bt->flags |= TASK_F_RUNNABLE; - runq = g_slist_append(runq, bt); + eslist_append(&bs->runq, bt); + + BG_SCHED_UNLOCK(bs); } /** * Remove task from the scheduler (run queue). */ static void -bg_sched_remove(struct bgtask *bt) +bg_sched_remove(bgtask_t *bt) { + bgsched_t *bs; + bg_task_check(bt); + bs = bt->sched; + bg_sched_check(bs); + + BG_SCHED_LOCK(bs); + + g_assert(bt->flags & TASK_F_RUNNABLE); /* In runq */ + /* * We currently have only one run queue: we don't handle priorities. */ - runq = g_slist_remove(runq, bt); + eslist_remove(&bs->runq, bt); bt->flags &= ~TASK_F_RUNNABLE; + + BG_SCHED_UNLOCK(bs); } /** - * Pick next task to schedule. + * Pick next task to schedule in the scheduler. + * + * @return new task to schedule, or NULL if there are no more tasks. */ -static struct bgtask * -bg_sched_pick(void) +static bgtask_t * +bg_sched_pick(bgsched_t *bs) { + bgtask_t *bt; + + bg_sched_check(bs); + + BG_SCHED_LOCK(bs); + /* * All task in run queue have equal priority, pick the first. */ - if (runq) { - struct bgtask *bt = runq->data; + + if (0 != eslist_count(&bs->runq)) { + bt = eslist_head(&bs->runq); bg_task_check(bt); - return bt; } else { - return NULL; + bt = NULL; + } + + BG_SCHED_UNLOCK(bs); + return bt; +} + +/** + * Compute elapsed time since task started its scheduling period. + */ +static time_delta_t +bg_task_elapsed(const bgtask_t *bt) +{ + tm_t end; + time_delta_t elapsed; + + bg_task_check(bt); + + tm_now_exact(&end); + elapsed = tm_elapsed_us(&end, &bt->start); + + /* + * Compensate any clock adjustment by reusing the previous value we + * measured when we last run that task, taking into accound the fact + * that the number of ticks used then might have been different. + */ + + if G_UNLIKELY(elapsed < 0) { /* Clock adjustment whilst we ran */ + elapsed = bt->elapsed; /* Adjust value from last run */ + if (bt->prev_ticks != 0) + elapsed = elapsed * bt->ticks_used / bt->prev_ticks; } + + return elapsed; } /** @@ -231,9 +625,8 @@ * @param target the runtime target of the task (0 if unknown) */ static void -bg_task_suspend(struct bgtask *bt, int target) +bg_task_suspend(bgtask_t *bt, int target) { - tm_t end; time_delta_t elapsed; bg_task_check(bt); @@ -246,20 +639,7 @@ * Update task running time. */ - tm_now_exact(&end); - elapsed = tm_elapsed_us(&end, &bt->start); - - /* - * Compensate any clock adjustment by reusing the previous value we - * measured when we last run that task, taking into accound the fact - * that the number of ticks used then might have been different. - */ - - if (elapsed < 0) { /* Clock adjustment whilst we ran */ - elapsed = bt->elapsed; /* Adjust value from last run */ - if (bt->prev_ticks != 0) - elapsed = elapsed * bt->ticks_used / bt->prev_ticks; - } + elapsed = bg_task_elapsed(bt); bt->elapsed = elapsed; bt->wtime += (elapsed + 500) / 1000; /* wtime is in ms */ @@ -268,11 +648,11 @@ /* * Now update the tick cost, if elapsed is not null. * - * If task is flagged TASK_F_NOTICK, it was scheduled only to deliver + * If task is flagged TASK_UF_NOTICK, it was scheduled only to deliver * a signal and we cannot really update the tick cost. */ - if (!(bt->flags & TASK_F_NOTICK)) { + if (!(bt->uflags & TASK_UF_NOTICK)) { double new_cost; /* @@ -284,18 +664,18 @@ if (target != 0 && elapsed > target) { if (bg_debug > 4) - g_message("BGTASK \"%s\" resetting tick_cost", bt->name); + s_message("BGTASK \"%s\" %p resetting tick_cost", bt->name, bt); new_cost = elapsed / bt->ticks_used; } else { new_cost = (4 * bt->tick_cost + (elapsed / bt->ticks_used)) / 5.0; } if (bg_debug > 4) { - g_debug("BGTASK \"%s\" total=%d msecs, " - "elapsed=%lu usecs (targeted %d), " + s_debug("BGTASK \"%s\" %p total=%'lu msecs (%s), " + "elapsed=%'lu usecs (targeted %d), " "ticks=%d, used=%d, tick_cost=%g usecs (was %g)", - bt->name, bt->wtime, (gulong) elapsed, target, - bt->ticks, bt->ticks_used, + bt->name, bt, bt->wtime, short_time_ascii(bt->wtime / 1000), + (ulong) elapsed, target, bt->ticks, bt->ticks_used, new_cost, bt->tick_cost); } @@ -307,7 +687,7 @@ * Resume task execution. */ static void -bg_task_resume(struct bgtask *bt) +bg_task_resume(bgtask_t *bt) { bg_task_check(bt); g_assert(!(bt->flags & TASK_F_RUNNING)); @@ -322,138 +702,289 @@ * Add task to the sleep queue. */ static void -bg_sched_sleep(struct bgtask *bt) +bg_sched_sleep(bgtask_t *bt) { + bgsched_t *bs; + bg_task_check(bt); g_assert(!(bt->flags & TASK_F_SLEEPING)); g_assert(!(bt->flags & TASK_F_RUNNING)); - g_assert(bg_runcount > 0); - bg_sched_remove(bt); /* Can no longer be scheduled */ - bg_runcount--; + bs = bt->sched; + bg_sched_check(bs); + g_assert(bs->runcount > 0); + + BG_SCHED_LOCK(bs); + + if (bt->flags & TASK_F_RUNNABLE) + bg_sched_remove(bt); /* Can no longer be scheduled */ + bs->runcount--; bt->flags |= TASK_F_SLEEPING; - sleepq = g_slist_prepend(sleepq, bt); + eslist_prepend(&bs->sleepq, bt); + + BG_SCHED_UNLOCK(bs); } /** * Remove task from the sleep queue and insert it to the runqueue. */ static void -bg_sched_wakeup(struct bgtask *bt) +bg_sched_wakeup(bgtask_t *bt) { + bgsched_t *bs; + bg_task_check(bt); g_assert(bt->flags & TASK_F_SLEEPING); g_assert(!(bt->flags & TASK_F_RUNNING)); - sleepq = g_slist_remove(sleepq, bt); + bs = bt->sched; + bg_sched_check(bs); + + BG_SCHED_LOCK(bs); + + eslist_remove(&bs->sleepq, bt); bt->flags &= ~TASK_F_SLEEPING; - bg_runcount++; + bs->runcount++; bg_sched_add(bt); -} - -static struct bgtask *current_task; + BG_SCHED_UNLOCK(bs); +} /** * Switch to new task `bt'. * If argument is NULL, suspends current task. * + * @param bs the scheduler handling the tasks * @param bt the new task being scheduled * @param target the running time target of current task (0 if unknown) * * @returns previously scheduled task, if any. */ -static struct bgtask * -bg_task_switch(struct bgtask *bt, int target) +static bgtask_t * +bg_task_switch(bgsched_t *bs, bgtask_t *bt, int target) { - struct bgtask *old = current_task; + bgtask_t *old; + + bg_sched_check(bs); + + BG_SCHED_LOCK(bs); + + old = bs->current_task; g_assert(bt == NULL || !(bt->flags & TASK_F_RUNNING)); - if (old) { + if (old != NULL) { bg_task_suspend(old, target); - current_task = NULL; + bs->current_task = NULL; + g_assert(old->sched == bs); } - if (bt) { + if (bt != NULL) { bg_task_check(bt); + g_assert(bt->sched == bs); bg_task_resume(bt); - current_task = bt; + bs->current_task = bt; } + + BG_SCHED_UNLOCK(bs); + return old; } -static struct bgtask * +static void +bg_common_init(bgtask_t *bt) +{ + spinlock_init(&bt->lock); + bt->refcnt = 1; +} + +static bgtask_t * bg_task_alloc(void) { - static const struct bgtask zero_bt; - struct bgtask *bt; + bgtask_t *bt; - WALLOC(bt); - *bt = zero_bt; - bt->magic = BGTASK_MAGIC; + WALLOC0(bt); + bt->magic = BGTASK_TASK_MAGIC; + bg_common_init(bt); return bt; } +static struct bgdaemon * +bg_daemon_alloc(void) +{ + struct bgdaemon *bd; + bgtask_t *bt; + + WALLOC0(bd); + bt = &bd->task; + bt->magic = BGTASK_DAEMON_MAGIC; + bg_common_init(bt); + return bd; +} + /** - * Create a new background task. - * The `steps' array is cloned, so it can be built on the caller's stack. - * - * Each time the task is scheduled, the current processing step is ran. - * Each step should perform a small amount of work, as determined by the - * number of ticks it is allowed to process. When a step is done, we move - * to the next step. + * Internal creation of a background task. * - * When the task is done, the `done_cb' callback is called, if supplied. - * The user-supplied argument `done_arg' will also be given to that callback. - * Note that "done" does not necessarily mean success. + * @param bs The scheduler to put task in (NULL = default) + * @param name Task name (for tracing) + * @param steps Work to perform (copied) + * @param stepcnt Number of steps + * @param ucontext User context + * @param ucontext_free Free routine for context + * @param done_cb Notification callback when done + * @param done_arg Callback argument + * @param running Should task be running immediately or held waiting? * * @returns an opaque handle. */ -struct bgtask * -bg_task_create(const char *name, /**< Task name (for tracing) */ - const bgstep_cb_t *steps, /**< Work to perform (copied) */ - int stepcnt, /**< Number of steps */ - gpointer ucontext, /**< User context */ - bgclean_cb_t ucontext_free, /**< Free routine for context */ - bgdone_cb_t done_cb, /**< Notification callback when done */ - gpointer done_arg) /**< Callback argument */ +static bgtask_t * +bg_task_create_internal( + bgsched_t *bs, const char *name, + const bgstep_cb_t *steps, int stepcnt, + void *ucontext, bgclean_cb_t ucontext_free, + bgdone_cb_t done_cb, void *done_arg, bool running) { - struct bgtask *bt; - int stepsize; + bgtask_t *bt; g_assert(stepcnt > 0); g_assert(steps); + g_assert(NULL == bs || BGSCHED_MAGIC == bs->magic); + + if G_UNLIKELY(bg_closed) + return NULL; /* Refuse to create task, we're shutdowning */ bt = bg_task_alloc(); - bt->name = name; + bt->sched = NULL == bs ? bg_sched : bs; + bt->name = atom_str_get(name); bt->ucontext = ucontext; bt->uctx_free = ucontext_free; bt->done_cb = done_cb; bt->done_arg = done_arg; - stepsize = stepcnt * sizeof(bgstep_cb_t *); bt->stepcnt = stepcnt; - bt->stepvec = walloc(stepsize); - memcpy(bt->stepvec, steps, stepsize); + bt->stepvec = WCOPY_ARRAY(steps, stepcnt); - bg_sched_add(bt); /* Let scheduler know about it */ - bg_runcount++; /* One more task to schedule */ + BG_SCHED_LOCK(bt->sched); + bt->sched->runcount++; /* One more task to schedule */ + if (running) + bg_sched_add(bt); /* Let scheduler know about it */ + else + bg_sched_sleep(bt); /* Record sleeping task */ + BG_SCHED_UNLOCK(bt->sched); if (bg_debug > 1) { - g_debug("BGTASK created task \"%s\" (%d step%s)", - name, stepcnt, 1 == stepcnt ? "" : "s"); + s_debug("BGTASK created task \"%s\" (%d step%s) in %s scheduler", + name, stepcnt, plural(stepcnt), bt->sched->name); } + entropy_harvest_single(PTRLEN(bt)); + return bt; } /** - * A "daemon" is a task equipped with a work queue. + * Create a new background task. + * The `steps' array is cloned, so it can be built on the caller's stack. * - * When the daemon is initially created, it has an empty work queue and it is - * put in the "sleeping" state where it is not scheduled. + * Each time the task is scheduled, the current processing step is ran. + * Each step should perform a small amount of work, as determined by the + * number of ticks it is allowed to process. When a step is done, we move + * to the next step. * - * As long as there is work in the work queue, the task is scheduled. + * When the task is done, the `done_cb' callback is called, if supplied. + * The user-supplied argument `done_arg' will also be given to that callback. + * Note that "done" does not necessarily mean success. + * + * @param bs The scheduler to put task in (NULL = default) + * @param name Task name (for tracing) + * @param steps Work to perform (copied) + * @param stepcnt Number of steps + * @param ucontext User context + * @param ucontext_free Free routine for context + * @param done_cb Notification callback when done + * @param done_arg Callback argument + * + * @returns an opaque handle. + */ +bgtask_t * +bg_task_create( + bgsched_t *bs, const char *name, + const bgstep_cb_t *steps, int stepcnt, + void *ucontext, bgclean_cb_t ucontext_free, + bgdone_cb_t done_cb, void *done_arg) +{ + return bg_task_create_internal(bs, name, steps, stepcnt, + ucontext, ucontext_free, done_cb, done_arg, TRUE); +} + +/** + * Create a new background task, stopped. + * + * This is the same as bg_task_create() but the task is initially put in the + * sleeping state. It will not start until bg_task_run() is called. + * + * When the task scheduler is not running in the same thread as the one + * creating the task, this makes sure we'll capture the returned value (the + * task handle) before the task can actually use it via a callback. + * + * @param bs The scheduler to put task in (NULL = default) + * @param name Task name (for tracing) + * @param steps Work to perform (copied) + * @param stepcnt Number of steps + * @param ucontext User context + * @param ucontext_free Free routine for context + * @param done_cb Notification callback when done + * @param done_arg Callback argument + * + * @returns an opaque handle. + */ +bgtask_t * +bg_task_create_stopped( + bgsched_t *bs, const char *name, + const bgstep_cb_t *steps, int stepcnt, + void *ucontext, bgclean_cb_t ucontext_free, + bgdone_cb_t done_cb, void *done_arg) +{ + return bg_task_create_internal(bs, name, steps, stepcnt, + ucontext, ucontext_free, done_cb, done_arg, FALSE); +} + +/** + * Run a task after bg_task_create_stopped() returned. + * + * The task is awoken and can be scheduled, but will not start its execution + * immediately. + * + * @param bt the task to run + */ +void +bg_task_run(bgtask_t *bt) +{ + bool awoken = FALSE; + + bg_task_check(bt); + + BG_TASK_LOCK(bt); + + if (bt->flags & TASK_F_SLEEPING) { + awoken = TRUE; + bg_sched_wakeup(bt); + } + + BG_TASK_UNLOCK(bt); + + if G_UNLIKELY(!awoken) { + s_carp("%s(): task %p \"%s\" was already running", + G_STRFUNC, bt, bt->name); + } +} + +/** + * A "daemon" is a task equipped with a work queue. + * + * When the daemon is initially created, it has an empty work queue and it is + * put in the "sleeping" state where it is not scheduled. + * + * As long as there is work in the work queue, the task is scheduled. * It goes back to sleep when the work queue becomes empty. * * The `steps' given represent the processing to be done on each item of @@ -464,49 +995,61 @@ * Since a daemon is not supposed to exit (although it can), there is no * `done' callback. * + * @param bs The scheduler to put task in (NULL = default) + * @param name Task name (for tracing) + * @param steps Work to perform (copied) + * @param stepcnt Number of steps + * @param ucontext User context + * @param ucontext_free Free routine for context + * @param start_cb Starting working on an item + * @param end_cb Done working on an item + * @param item_free Free routine for work queue items + * @param notify Start/Stop notify (optional) + * * Use bg_daemon_enqueue() to enqueue more work to the daemon. */ -struct bgtask * +bgtask_t * bg_daemon_create( - const char *name, /**< Task name (for tracing) */ - const bgstep_cb_t *steps, /**< Work to perform (copied) */ - int stepcnt, /**< Number of steps */ - gpointer ucontext, /**< User context */ - bgclean_cb_t ucontext_free, /**< Free routine for context */ - bgstart_cb_t start_cb, /**< Starting working on an item */ - bgend_cb_t end_cb, /**< Done working on an item */ - bgclean_cb_t item_free, /**< Free routine for work queue items */ - bgnotify_cb_t notify) /**< Start/Stop notify (optional) */ -{ - struct bgtask *bt; - int stepsize; + bgsched_t *bs, const char *name, + const bgstep_cb_t *steps, int stepcnt, + void *ucontext, bgclean_cb_t ucontext_free, + bgstart_cb_t start_cb, bgend_cb_t end_cb, + bgclean_cb_t item_free, bgnotify_cb_t notify) +{ + struct bgdaemon *bd; + bgtask_t *bt; g_assert(stepcnt > 0); g_assert(steps); - bt = bg_task_alloc(); + bd = bg_daemon_alloc(); + bt = &bd->task; + bt->sched = NULL == bs ? bg_sched : bs; bt->flags |= TASK_F_DAEMON; - bt->name = name; + bt->name = atom_str_get(name); bt->ucontext = ucontext; bt->uctx_free = ucontext_free; - bt->start_cb = start_cb; - bt->end_cb = end_cb; - bt->item_free = item_free; - bt->notify = notify; - stepsize = stepcnt * sizeof(bgstep_cb_t *); bt->stepcnt = stepcnt; - bt->stepvec = walloc(stepsize); - memcpy(bt->stepvec, steps, stepsize); + bt->stepvec = WCOPY_ARRAY(steps, stepcnt); - bg_runcount++; /* One more task to schedule */ + bd->start_cb = start_cb; + bd->end_cb = end_cb; + bd->item_free = item_free; + bd->notify = notify; + + BG_SCHED_LOCK(bt->sched); + bt->sched->runcount++; /* One more task to schedule */ bg_sched_sleep(bt); /* Record sleeping task */ + BG_SCHED_UNLOCK(bt->sched); if (bg_debug > 1) { - g_debug("BGTASK created daemon task \"%s\" (%d step%s)", - name, stepcnt, 1 == stepcnt ? "" : "s"); + s_debug("BGTASK created daemon task \"%s\" (%d step%s) in %s scheduler", + name, stepcnt, plural(stepcnt), bt->sched->name); } + entropy_harvest_single(PTRLEN(bt)); + return bt; } @@ -515,83 +1058,260 @@ * If task was sleeping, wake it up. */ void -bg_daemon_enqueue(struct bgtask *bt, gpointer item) +bg_daemon_enqueue(bgtask_t *bt, void *item) { + struct bgdaemon *bd; + bool awoken = FALSE; + bg_task_check(bt); g_assert(bt->flags & TASK_F_DAEMON); - bt->wq = g_slist_append(bt->wq, item); + bd = BG_DAEMON(bt); + g_assert(bd != NULL); /* Because it's a daemon task */ - if (bt->flags & TASK_F_SLEEPING) { - if (bg_debug > 1) - g_debug("BGTASK waking up daemon \"%s\" task", bt->name); + BG_TASK_LOCK(bt); + + bd->wq = pslist_append(bd->wq, item); + bd->wq_count++; + entropy_harvest_time(); + if (bt->flags & TASK_F_SLEEPING) { + awoken = TRUE; bg_sched_wakeup(bt); - if (bt->notify) - (*bt->notify)(bt, TRUE); /* Waking up */ } + + BG_TASK_UNLOCK(bt); + + if (awoken && bg_debug > 1) + s_debug("BGTASK waking up daemon \"%s\" task %p", bt->name, bt); + + if (awoken && bd->notify != NULL) + (*bd->notify)(bt, TRUE); /* Waking up */ } /** * Free task structure. */ static void -bg_task_free(struct bgtask *bt) +bg_task_free(bgtask_t *bt) { - GSList *l; - int stepsize; - int count; - g_assert(bt); g_assert(BGTASK_DEAD_MAGIC == bt->magic); - + + BG_TASK_LOCK(bt); + g_assert(!(bt->flags & TASK_F_RUNNING)); g_assert(bt->flags & TASK_F_EXITED); - stepsize = bt->stepcnt * sizeof(bgstep_cb_t *); - wfree(bt->stepvec, stepsize); + WFREE_ARRAY_NULL(bt->stepvec, bt->stepcnt); + atom_str_free_null(&bt->name); + spinlock_destroy(&bt->lock); + + if (bt->flags & TASK_F_DAEMON) { + struct bgdaemon *bd = (struct bgdaemon *) bt; + int count; + pslist_t *l; - for (count = 0, l = bt->wq; l; l = l->next) { - count++; - if (bt->item_free) - (*bt->item_free)(l->data); + for (count = 0, l = bd->wq; l; l = l->next) { + count++; + if (bd->item_free) + (*bd->item_free)(l->data); + } + pslist_free_null(&bd->wq); + + if (count) { + s_warning("%s(): freed %d pending item%s for daemon \"%s\" task %p", + G_STRFUNC, count, plural(count), bt->name, bt); + } + bt->magic = 0; + WFREE(bd); + } else { + bt->magic = 0; + WFREE(bt); + } +} + +/** + * Task has finished and is ready to be reclaimed, as long as its reference + * count has dropped to 1 or 0. + */ +static void +bg_task_finished(bgtask_t *bt) +{ + g_assert(bt->refcnt >= 0); + g_assert(bt->flags & TASK_F_EXITED); + + /* + * If the task is still referenced, put it back to the sleeping queue. + * It should never be scheduled again (it would need to be awoken first, + * but since it is finished, that would be a user-code error). + * + * It will be reclaimed via bg_task_unref() calls. + */ + + if (bt->refcnt > 1) { + bg_sched_sleep(bt); + return; + } + + /* + * Let the user know this task has now ended. + * Upon return from this callback, further user-reference of the + * task structure are FORBIDDEN. + */ + + if (bt->done_cb) { + (*bt->done_cb)(bt, bt->ucontext, bt->status, bt->done_arg); + bt->flags &= ~TASK_F_ZOMBIE; /* Is now totally DEAD */ + } + + /* + * Free user's context. + * + * User code can call bg_task_exitcode() from the context freeing callback + * if it has a reference on the task (otherwise it should have installed + * a "done" callback to know how the task exits). + * + * Therefore we can only warn about the exit status being lost after the + * context has been completely destroyed. + */ + + (*bt->uctx_free)(bt->ucontext); + + if (bt->flags & TASK_F_ZOMBIE) { + s_carp("user code lost exit status of task %p \"%s\": %s", + bt, bt->name, bgstatus_to_string(bt->status)); } - gm_slist_free_null(&bt->wq); - if (count) - g_carp("freed %d pending item%s for daemon \"%s\" task", - count, count == 1 ? "" : "s", bt->name); - bt->magic = 0; - WFREE(bt); + bt->magic = BGTASK_DEAD_MAGIC; /* Prevent further uses! */ + + /* + * Do not free the task structure immediately, in case the calling + * stack is not totally clean and we're about to probe the task + * structure again. + * + * It will be freed at the next scheduler run. + */ + + BG_SCHED_LOCK(bt->sched); + eslist_prepend(&bt->sched->dead_tasks, bt); + BG_SCHED_UNLOCK(bt->sched); +} + +/** + * Add a reference to the task. + * + * @return the task as a convenience. + */ +bgtask_t * +bg_task_ref(bgtask_t *bt) +{ + bg_task_check(bt); + g_assert(bt->refcnt >= 0); + + bt->refcnt++; + + return bt; +} + +/** + * Remove a reference to the task. + */ +void +bg_task_unref(bgtask_t *bt) +{ + bg_task_check(bt); + g_assert(bt->refcnt >= 1); + + /* + * If there is only one reference to the task, removing the last reference + * means we cannot control / cancel the task anymore. Loudly warn when + * this happens, but do not panic as it may be OK. + */ + + if G_UNLIKELY(1 == bt->refcnt && !(bt->flags & TASK_F_EXITED)) { + s_carp("%s(): task %p \"%s\" will no longer be referenced", + G_STRFUNC, bt, bt->name); + } + + /* + * If the task has exited already and its reference count drops below 1, + * we can reclaim it. + */ + + if (bt->refcnt-- <= 2) { + if (bt->flags & TASK_F_EXITED) + bg_task_finished(bt); + } } /** * Terminate the task, invoking the completion callback if defined. */ static void -bg_task_terminate(struct bgtask *bt) +bg_task_terminate(bgtask_t *bt) { - bgstatus_t status; + bgsched_t *bs; bg_task_check(bt); g_assert(!(bt->flags & TASK_F_EXITED)); /* + * If they called bg_close(), then the default scheduler is gone. + * + * However, some background tasks may have escaped killing due to some + * bug and since we're probably exiting and cleaning up, there is no + * need to panic. + */ + + if G_UNLIKELY(bg_closed) { + if (0 == (bt->uflags & TASK_UF_CANCELLED)) { + /* Only warn if task was not cancelled as part of the shutdown */ + s_carp("%s(): ignoring left-over %stask %p \"%s\", " + "flags=0x%x, refcnt=%d", + G_STRFUNC, (bt->flags & TASK_F_DAEMON) ? "daemon " : "", + bt, bt->name, bt->flags, bt->refcnt); + } + + /* + * Check whether thread should stop here, if we're too far down the + * exit sequence and all threads were asked to suspend. + */ + + thread_check_suspended(); + + /* + * OK, continue then, task was not attached to the main scheduler + * (which was already disposed of) and must be running in another + * thread. + */ + } + + bs = bt->sched; + bg_sched_check(bs); + + BG_SCHED_LOCK(bs); + + /* * If the task is running, we can't proceed now, * Go back to the scheduler, which will call us back. */ - if (bt->flags & TASK_F_RUNNING) - longjmp(bt->env, 1); + if (bt->flags & TASK_F_RUNNING) { + BG_SCHED_UNLOCK(bs); + longjmp(bt->env, BG_JUMP_END); + g_assert_not_reached(); + } /* * When we come here, the task is no longer running. */ if (bg_debug > 1) { - g_debug("BGTASK terminating \"%s\"%s, ran %d msecs", - bt->name, (bt->flags & TASK_F_DAEMON) ? " daemon" : "", bt->wtime); + s_debug("BGTASK terminating %p \"%s\"%s, ran %'lu msecs (%s)", + bt, bt->name, (bt->flags & TASK_F_DAEMON) ? " daemon" : "", + bt->wtime, short_time_ascii(bt->wtime / 1000)); } g_assert(!(bt->flags & TASK_F_RUNNING)); @@ -601,20 +1321,30 @@ bt->flags |= TASK_F_EXITED; /* Task has now exited */ bg_sched_remove(bt); /* Ensure it's no longer scheduled */ - bg_runcount--; /* One task less to run */ - g_assert(bg_runcount >= 0); + g_assert_log(bs->runcount != 0, + "%s(): terminating unaccounted %stask %p \"%s\" in %s scheduler, " + "currently in %s()", + G_STRFUNC, (bt->flags & TASK_F_DAEMON) ? "daemon " : "", + bt, bt->name, bs->name, bg_task_step_name(bt)); + + bs->runcount--; /* One task less to run */ + bs->completed++; /* One more task completed */ + + BG_SCHED_UNLOCK(bs); /* * Compute proper status. */ - status = BGS_OK; /* Assume everything was fine */ + bt->status = BGS_OK; /* Assume everything was fine */ - if (bt->flags & TASK_F_SIGNAL) - status = BGS_KILLED; + if (bt->flags & TASK_F_CANCELLING) + bt->status = BGS_CANCELLED; + else if (bt->flags & TASK_F_SIGNAL) + bt->status = BGS_KILLED; else if (bt->exitcode != 0) - status = BGS_ERROR; + bt->status = BGS_ERROR; /* * If there is a status to read, mark task as being a zombie: it will @@ -622,40 +1352,10 @@ * execution status. */ - if (status != BGS_OK && bt->done_cb == NULL) + if (bt->status != BGS_OK && bt->done_cb == NULL) bt->flags |= TASK_F_ZOMBIE; - /* - * Let the user know this task has now ended. - * Upon return from this callback, further user-reference of the - * task structure are FORBIDDEN. - */ - - if (bt->done_cb) { - (*bt->done_cb)(bt, bt->ucontext, status, bt->done_arg); - - if (bt->flags & TASK_F_ZOMBIE) - g_carp("user code lost exit status of task \"%s\"", bt->name); - - bt->flags &= ~TASK_F_ZOMBIE; /* Is now totally DEAD */ - } - - /* - * Free user's context. - */ - - (*bt->uctx_free)(bt->ucontext); - bt->magic = BGTASK_DEAD_MAGIC; /* Prevent further uses! */ - - /* - * Do not free the task structure immediately, in case the calling - * stack is not totally clean and we're about to probe the task - * structure again. - * - * It will be freed at the next scheduler run. - */ - - dead_tasks = g_slist_prepend(dead_tasks, bt); + bg_task_finished(bt); } /** @@ -663,10 +1363,9 @@ * We exit immediately, not returning to the user code. */ void -bg_task_exit(struct bgtask *bt, int code) +bg_task_exit(bgtask_t *bt, int code) { - bg_task_check(bt); - g_assert(bt->flags & TASK_F_RUNNING); + bg_task_is_running(bt, G_STRFUNC); bt->exitcode = code; @@ -675,25 +1374,30 @@ * We know the setjmp buffer is valid, since we're running! */ - longjmp(bt->env, 1); /* Will call bg_task_terminate() */ + longjmp(bt->env, BG_JUMP_END); /* Will call bg_task_terminate() */ + g_assert_not_reached(); } /** * Deliver signal via the user's signal handler. */ static void -bg_task_sendsig(struct bgtask *bt, bgsig_t sig, bgsig_cb_t handler) +bg_task_sendsig(bgtask_t *bt, bgsig_t sig, bgsig_cb_t handler) { bg_task_check(bt); g_assert(bt->flags & TASK_F_RUNNING); + BG_TASK_LOCK(bt); bt->flags |= TASK_F_SIGNAL; bt->signal = sig; + BG_TASK_UNLOCK(bt); (*handler)(bt, bt->ucontext, sig); + BG_TASK_LOCK(bt); bt->flags &= ~TASK_F_SIGNAL; bt->signal = BG_SIG_ZERO; + BG_TASK_UNLOCK(bt); } /** @@ -702,9 +1406,10 @@ * @returns -1 if the task could not be signalled. */ static int -bg_task_kill(struct bgtask *bt, bgsig_t sig) +bg_task_kill(bgtask_t *bt, bgsig_t sig) { bgsig_cb_t sighandler; + bgsched_t *bs; bg_task_check(bt); if (bt->flags & TASK_F_EXITED) /* Already exited */ @@ -714,12 +1419,33 @@ return 0; /* + * If signal is sent from a foreign thread, we cannot process it, so + * queue it and it will be processed as soon as the task is scheduled. + */ + + BG_TASK_LOCK(bt); + + bs = bt->sched; + bg_sched_check(bs); + + if (bs->stid != thread_small_id()) { + if (sig == BG_SIG_KILL) { + bt->signals = pslist_prepend(bt->signals, uint_to_pointer(sig)); + } else if (NULL != bt->sighsig) { + bt->signals = pslist_append(bt->signals, uint_to_pointer(sig)); + } + BG_TASK_UNLOCK(bt); + return 1; + } + + /* * The BG_SIG_KILL signal cannot be trapped. Deliver it synchronously. */ if (sig == BG_SIG_KILL) { bt->flags |= TASK_F_SIGNAL; bt->signal = sig; + BG_TASK_UNLOCK(bt); bg_task_terminate(bt); return 1; } @@ -730,8 +1456,10 @@ sighandler = bt->sighsig; - if (sighandler == NULL) + if (sighandler == NULL) { + BG_TASK_UNLOCK(bt); return 1; + } /* * If the task is not running currently, enqueue the signal. @@ -741,10 +1469,13 @@ */ if (!(bt->flags & TASK_F_RUNNING) || (bt->flags & TASK_F_SIGNAL)) { - bt->signals = g_slist_append(bt->signals, GUINT_TO_POINTER(sig)); + bt->signals = pslist_append(bt->signals, uint_to_pointer(sig)); + BG_TASK_UNLOCK(bt); return 1; } + BG_TASK_UNLOCK(bt); + /* * Task is running, so the processing time of the handler will * be accounted on its running time. @@ -761,11 +1492,12 @@ * @returns previously installed signal handler. */ bgsig_cb_t -bg_task_signal(struct bgtask *bt, bgsig_t sig, bgsig_cb_t handler) +bg_task_signal(bgtask_t *bt, bgsig_t sig, bgsig_cb_t handler) { bgsig_cb_t oldhandler; bg_task_check(bt); + oldhandler = bt->sighsig; bt->sighsig = handler; @@ -776,7 +1508,7 @@ * Deliver all the signals queued so far for the task. */ static void -bg_task_deliver_signals(struct bgtask *bt) +bg_task_deliver_signals(bgtask_t *bt) { bg_task_check(bt); g_assert(bt->flags & TASK_F_RUNNING); @@ -789,8 +1521,8 @@ */ while (bt->signals != NULL) { - GSList *lnk = bt->signals; - bgsig_t sig = (bgsig_t) GPOINTER_TO_UINT(lnk->data); + pslist_t *lnk = bt->signals; + bgsig_t sig = (bgsig_t) pointer_to_uint(lnk->data); /* * If signal kills the thread (it calls bg_task_exit() from the @@ -799,8 +1531,8 @@ bg_task_kill(bt, sig); - bt->signals = g_slist_remove_link(bt->signals, lnk); - g_slist_free_1(lnk); + bt->signals = pslist_remove_link(bt->signals, lnk); + pslist_free_1(lnk); } } @@ -808,20 +1540,86 @@ * Cancel a given task. */ void -bg_task_cancel(struct bgtask *bt) +bg_task_cancel(bgtask_t *bt) { - struct bgtask *old = NULL; + bgsched_t *bs; + bgtask_t *old = NULL; bg_task_check(bt); - if (bt->flags & TASK_F_EXITED) /* Already exited */ + g_assert(bt->refcnt >= 1); + + if (bt->flags & (TASK_F_EXITED | TASK_F_CANCELLING)) /* Already done */ + return; + + BG_TASK_LOCK(bt); + + if (bt->flags & (TASK_F_EXITED | TASK_F_CANCELLING)) { + BG_TASK_UNLOCK(bt); + return; + } + + bt->uflags |= TASK_UF_CANCELLED; /* Mark it cancelled */ + + /* + * If the task is sleeping, wake it up so that it can be cancelled + * as soon as it is scheduled. + */ + + if (bt->flags & TASK_F_SLEEPING) + bg_sched_wakeup(bt); + + bs = bt->sched; + bg_sched_check(bs); + + /* + * If not called from the thread running the scheduler, mark the + * task as cancelled and return. + */ + + if (thread_small_id() != bs->stid) { + BG_TASK_UNLOCK(bt); + if (bg_debug > 1) + s_debug("BGTASK recorded foreign cancel for \"%s\", " + "currently in %s()", bt->name, bg_task_step_name(bt)); + return; + } + + /* + * If called from a thread signal handler, we may be interrupting the + * task that is running or about to run and therefore we can only + * record the cancellation (we know we are in the same thread as the + * scheduler running the task). + */ + + if G_UNLIKELY(0 != thread_sighandler_level()) { + BG_TASK_UNLOCK(bt); + if (bg_debug > 1) { + s_debug("BGTASK recorded local cancel for \"%s\", " + "currently in %s()", bt->name, bg_task_step_name(bt)); + } return; + } + + /* + * Set the TASK_F_CANCELLING flag so that further cancel calls are + * ignored: we're going to process the cancellation request now. + */ + + bt->flags |= TASK_F_CANCELLING; + + BG_TASK_UNLOCK(bt); + + if (bg_debug > 1) { + s_debug("BGTASK cancelling \"%s\", currently in %s()", + bt->name, bg_task_step_name(bt)); + } /* * If task has a BG_SIG_TERM handler, send the signal. */ if (bt->sighBG_SIG_TERM) { - gboolean switched = FALSE; + bool switched = FALSE; /* * If task is not running, switch to it now, so that we can @@ -829,7 +1627,7 @@ */ if (!(bt->flags & TASK_F_RUNNING)) { - old = bg_task_switch(bt, 0); /* Switch to `bt' */ + old = bg_task_switch(bs, bt, 0); /* Switch to `bt' */ switched = TRUE; } @@ -842,8 +1640,11 @@ */ if (switched) { - bt->flags |= TASK_F_NOTICK; /* Disable tick recomputation */ - (void) bg_task_switch(old, 0); /* Restore old thread */ + BG_TASK_LOCK(bt); + bt->uflags |= TASK_UF_NOTICK; /* Disable tick recomputation */ + BG_TASK_UNLOCK(bt); + + (void) bg_task_switch(bs, old, 0); /* Restore old task */ } } @@ -857,39 +1658,136 @@ * all its ticks and it matters for the computation of the cost per tick. */ void -bg_task_ticks_used(struct bgtask *bt, int used) +bg_task_ticks_used(bgtask_t *bt, int used) { - bg_task_check(bt); - g_assert(bt->flags & TASK_F_RUNNING); + bg_task_is_running(bt, G_STRFUNC); g_assert(used >= 0); bt->ticks_used = MIN(used, bt->ticks); - if (used == 0) - bt->flags |= TASK_F_NOTICK; /* Won't update tick info */ + if (used == 0) { + BG_TASK_LOCK(bt); + bt->uflags |= TASK_UF_NOTICK; /* Won't update tick info */ + BG_TASK_UNLOCK(bt); + } } /** - * Reclaim all dead tasks + * This routine can be called by a running task to request that it be put + * to sleep as soon as its current step is finished. + * + * It can then be woken up via bg_task_wakeup() to resume execution at the + * proper step (next or current depending on the returned value to the + * scheduler). */ -static void -bg_reclaim_dead(void) +void +bg_task_sleep(bgtask_t *bt) { - GSList *sl; + bg_task_check(bt); + g_assert(bt->refcnt >= 1); - for (sl = dead_tasks; sl; sl = g_slist_next(sl)) { - bg_task_free(sl->data); + /* + * Because we expect the task to be running, it is only possible to get + * here from the scheduler (i.e the call can only be made "from" the + * running task code). + * + * Hence, we do not need to lock the scheduler: no concurrency is possible. + */ + + BG_TASK_LOCK(bt); + bg_task_is_running(bt, G_STRFUNC); + + bt->uflags |= TASK_UF_SLEEP_REQ; + BG_TASK_UNLOCK(bt); +} + +/** + * Wake up a task put to sleep via bg_task_sleep(). + */ +void +bg_task_wakeup(bgtask_t *bt) +{ + bgsched_t *bs; + bool only_requested = FALSE; + + /* + * To prevent race conditions with bg_sched_sleep() being called from + * the scheduler at the same time someone would want to call this routine, + * we need to hold the lock for the scheduler throughout the execution, + * the leading precondition (about the task being sleeping) included. + */ + + bg_task_check(bt); + g_assert(bt->refcnt >= 1); + + bs = bt->sched; + bg_sched_check(bs); + + BG_TASK_LOCK(bt); /* Strict lock order: task first, then scheduler */ + BG_SCHED_LOCK(bs); + + bg_task_is_sleeping(bt, G_STRFUNC); + + /* + * It is possible that the running task was not yet put to sleep + * in the scheduler: we only recorded its desire to be put to sleep. + * In that case, there is nothing to do apart from clearing the flag. + */ + + if G_UNLIKELY(bt->uflags & TASK_UF_SLEEP_REQ) { + only_requested = TRUE; + bt->uflags &= ~TASK_UF_SLEEP_REQ; /* "awoken" now */ + } + + /* + * If bg_task_cancel() has already been called for the task we are supposed + * to wake up, there is nothing to do here, but we need to warn loudly + * because there is logic bug in the application code: a cancelled task + * could be reclaimed at any time, concurrently with the call to wake it up. + * Therefore we only warn when the reference count on the task is 1. + */ + + if G_UNLIKELY(bt->uflags & TASK_UF_CANCELLED) { + only_requested = TRUE; /* No need to wake it up below */ + if (bt->refcnt <= 1) { + s_carp("%s(): ignoring attempt to wakeup cancelled task %p \"%s\", " + "flags=0x%x", G_STRFUNC, bt, bt->name, bt->flags); + } } - gm_slist_free_null(&dead_tasks); + + if (!only_requested) + bg_sched_wakeup(bt); + + BG_SCHED_UNLOCK(bs); + BG_TASK_UNLOCK(bt); +} + +/** + * Reclaim all dead tasks from a scheduler. + */ +static void +bg_reclaim_dead(bgsched_t *bs) +{ + bg_sched_check(bs); + + BG_SCHED_LOCK(bs); + + eslist_foreach(&bs->dead_tasks, (data_fn_t) bg_task_free, NULL); + eslist_clear(&bs->dead_tasks); + + BG_SCHED_UNLOCK(bs); } /** * Called when a task has ended its processing. */ static void -bg_task_ended(struct bgtask *bt) +bg_task_ended(bgtask_t *bt) { - gpointer item; + struct bgdaemon *bd; + void *item; + time_delta_t elapsed; + bool stopped = FALSE; bg_task_check(bt); @@ -902,22 +1800,43 @@ return; } + bd = BG_DAEMON(bt); + g_assert(bd != NULL); /* Since it's a daemon task */ + bg_sched_check(bt->sched); + + g_assert_log(thread_small_id() == bt->sched->stid, + "%s(): running in %s, scheduler \"%s\" configured to run in %s", + G_STRFUNC, thread_name(), bt->sched->name, + thread_id_name(bt->sched->stid)); + /* * Daemon task: signal we finished with the item, unqueue and free it. */ - g_assert(bt->wq != NULL); + g_assert(bd->wq != NULL); - item = bt->wq->data; + item = bd->wq->data; if (bg_debug > 2) { - g_debug("BGTASK daemon \"%s\" done with item %p", bt->name, item); + s_debug("BGTASK daemon \"%s\" done with item %p", bt->name, item); } - (*bt->end_cb)(bt, bt->ucontext, item); - bt->wq = g_slist_remove(bt->wq, item); - if (bt->item_free) - (*bt->item_free)(item); + (*bd->end_cb)(bt, bt->ucontext, item); + BG_TASK_LOCK(bt); + bd->wq = pslist_remove(bd->wq, item); + bd->wq_count--; + bd->wq_done++; + BG_TASK_UNLOCK(bt); + if (bd->item_free) + (*bd->item_free)(item); + + /* + * Update daemon task running time (which encompasses the end_cb + + * item freeing time). + */ + + elapsed = bg_task_elapsed(bt); + bt->wtime += (elapsed + 500) / 1000; /* wtime is in ms */ /* * The following makes sure we pickup a new item at the next iteration. @@ -931,80 +1850,141 @@ * If task has no more work to perform, put it back to sleep. */ - if (bt->wq == NULL) { - if (bg_debug > 1) - g_debug("BGTASK daemon \"%s\" going back to sleep", bt->name); + BG_TASK_LOCK(bt); + if (NULL == bd->wq) { bg_sched_sleep(bt); - if (bt->notify) - (*bt->notify)(bt, FALSE); /* Stopped */ + stopped = TRUE; } + + BG_TASK_UNLOCK(bt); + + if (bg_debug > 1 && stopped) + s_debug("BGTASK daemon \"%s\" going back to sleep", bt->name); + + if (stopped && bd->notify != NULL) + (*bd->notify)(bt, FALSE); /* Stopped */ } /** - * Adjust the period of the tick delivery event. + * Adjust the period of the tick delivery event for specified scheduler. */ static void -bg_ticker_adjust_period(void) +bg_ticker_adjust_period(bgsched_t *bs) { int target; + bg_sched_check(bs); + + if (NULL == bs->pev) + return; /* Scheduler not using the callout queue */ + /* * Schedule once every BG_TICK_IDLE ms if we have nothing runable. * Otherwise, increase the frequency to once every BG_TICK_BUSY ms. */ - target = 0 == bg_runcount ? BG_TICK_IDLE : BG_TICK_BUSY; + BG_SCHED_LOCK(bs); - if (bg_ticker.period != target) { - bg_ticker.period = target; - cq_periodic_resched(bg_ticker.pev, target); + target = 0 == bs->runcount ? BG_TICK_IDLE : BG_TICK_BUSY; + + if (bs->period != target) { + bs->period = target; + cq_periodic_resched(bs->pev, target); if (bg_debug > 5) { - g_debug("BGTASK will be ticking every %d msecs (runable = %d)", - bg_ticker.period, bg_runcount); + s_debug("BGTASK %s scheduler will be ticking every %'d msecs " + "(runable = %d)", + bs->name, bs->period, bs->runcount); } } + + BG_SCHED_UNLOCK(bs); +} + +/** + * Check whether running task has been cancelled and jump back into the + * scheduler if it has. + */ +void +bg_task_cancel_test(bgtask_t *bt) +{ + bg_task_check(bt); + g_assert(bt->flags & TASK_F_RUNNING); + + if G_UNLIKELY(bt->uflags & TASK_UF_CANCELLED) { + /* + * Immediately go back to the scheduling code. + * We know the setjmp buffer is valid, since we're running! + */ + + longjmp(bt->env, BG_JUMP_CANCEL); /* Will call bg_task_cancel() */ + g_assert_not_reached(); + } } /** * Main task scheduling timer. */ -static gboolean -bg_sched_timer(void *unused_arg) +static bool +bg_sched_timer(void *arg) { - struct bgtask * volatile bt; + bgsched_t *bs = arg; + bgtask_t * volatile bt; volatile int remain = MAX_LIFE; volatile int target; volatile unsigned schedules = 0; volatile int ticks; + volatile int status; bgret_t ret; + unsigned stid; + tm_t start; - g_assert(current_task == NULL); - g_assert(bg_runcount >= 0); + bg_sched_check(bs); + g_assert(NULL == bs->current_task); + g_assert(bs->runcount >= 0); - (void) unused_arg; + stid = thread_small_id(); + if G_UNLIKELY(-1U == bs->stid) + bs->stid = stid; - bg_ticker_adjust_period(); + g_assert_log(stid == bs->stid, + "%s(): attempt to run \"%s\" in from %s, used to run in %s", + G_STRFUNC, bs->name, thread_name(), thread_id_name(bs->stid)); + + tm_now_exact(&start); + bg_ticker_adjust_period(bs); + remain = bs->max_life; /* * Loop as long as there are tasks to be scheduled and we have some * time left to spend. */ - while (bg_runcount > 0 && remain > 0) { + while (bs->runcount > 0 && remain > 0) { /* * Compute how much time we can spend for this task. */ - target = MAX_LIFE / bg_runcount; + target = bs->max_life / bs->runcount; target = MIN(target, remain); - bt = bg_sched_pick(); - g_assert(bt != NULL); /* bg_runcount > 0 => there is a task */ + bt = bg_sched_pick(bs); + g_assert(bt != NULL); /* runcount > 0 => there is a task */ g_assert(bt->flags & TASK_F_RUNNABLE); - bt->flags &= ~TASK_F_NOTICK; /* We'll want tick cost update */ + BG_TASK_LOCK(bt); + bt->uflags &= ~TASK_UF_NOTICK; /* We'll want tick cost update */ + BG_TASK_UNLOCK(bt); + + /* + * If task was cancelled, terminate it. + */ + + if (bt->uflags & TASK_UF_CANCELLED) { + bg_task_cancel(bt); + continue; + } /* * Compute how many ticks we can ask for this processing step. @@ -1043,10 +2023,10 @@ * Switch to the selected task. */ - bg_task_switch(bt, 0); + bg_task_switch(bs, bt, 0); schedules++; - g_assert(current_task == bt); + g_assert(bs->current_task == bt); g_assert(bt->flags & TASK_F_RUNNING); /* @@ -1054,19 +2034,37 @@ * may call bg_task_exit() and immediately come back here. */ - if (setjmp(bt->env)) { + if ((status = Setjmp(bt->env))) { /* * So they exited, or someone is killing the task. */ - if (bg_debug > 1) - g_debug("BGTASK back from setjmp() for \"%s\"", bt->name); + if (bg_debug > 1) { + s_debug("BGTASK back from setjmp() for \"%s\", val=%d", + bt->name, status); + } + + g_assert_log(thread_small_id() == bt->sched->stid, + "%s(): setjmp() for \"%s\" occurred in %s, but its " + "scheduler runs in %s", + G_STRFUNC, bt->name, thread_name(), + thread_id_name(bt->sched->stid)); + + if (BG_JUMP_CANCEL == status) { + g_assert(bt->uflags & TASK_UF_CANCELLED); + bg_task_cancel(bt); + continue; + } + + BG_TASK_LOCK(bt); + bt->uflags |= TASK_UF_NOTICK; + BG_TASK_UNLOCK(bt); + + bg_task_switch(bs, NULL, target); - bt->flags |= TASK_F_NOTICK; - bg_task_switch(NULL, target); if (bg_debug > 0 && remain < bt->elapsed) { - g_debug("%s: remain=%d, bt->elapsed=%d", - G_STRFUNC, remain, bt->elapsed); + s_debug("%s: \"%s\" remain=%'d us, bt->elapsed=%'d us", + G_STRFUNC, bs->name, remain, bt->elapsed); } remain -= MIN(remain, bt->elapsed); bg_task_terminate(bt); @@ -1078,15 +2076,13 @@ */ if (bg_debug > 2 && 0 == bt->seqno) { - g_debug("BGTASK \"%s\" starting step #%d (%s)", - bt->name, bt->step, - stacktrace_routine_name( - func_to_pointer(bt->stepvecbt->step), FALSE)); + s_debug("BGTASK \"%s\" starting step #%d (%s)", + bt->name, bt->step, bg_task_step_name(bt)); } if (bg_debug > 4) { - g_debug("BGTASK \"%s\" running step #%d.%d with %d tick%s", - bt->name, bt->step, bt->seqno, ticks, ticks == 1 ? "" : "s"); + s_debug("BGTASK \"%s\" running step #%d.%d with %d tick%s", + bt->name, bt->step, bt->seqno, ticks, plural(ticks)); } bg_task_deliver_signals(bt); /* Send any queued signal */ @@ -1097,37 +2093,53 @@ */ if ((bt->flags & TASK_F_DAEMON) && bt->step == 0 && bt->seqno == 0) { - gpointer item; + struct bgdaemon *bd = BG_DAEMON(bt); + void *item; - g_assert(bt->wq != NULL); /* Runnable daemon, must have work */ + g_assert(bd != NULL); /* Since task is a daemon */ + g_assert(bd->wq != NULL); /* Runnable daemon, must have work */ - item = bt->wq->data; + item = bd->wq->data; + entropy_harvest_time(); if (bg_debug > 2) { - g_debug("BGTASK daemon \"%s\" starting with item %p", + s_debug("BGTASK daemon \"%s\" starting with item %p", bt->name, item); } - (*bt->start_cb)(bt, bt->ucontext, item); + (*bd->start_cb)(bt, bt->ucontext, item); } g_assert(bt->step < bt->stepcnt); ret = (*bt->stepvecbt->step)(bt, bt->ucontext, ticks); - bg_task_switch(NULL, target); /* Stop current task, update stats */ + /* Stop current task, update stats */ + bg_task_switch(bs, NULL, target); + if (bg_debug > 0 && remain < bt->elapsed) { - g_debug("%s: remain=%d, bt->elapsed=%d", - G_STRFUNC, remain, bt->elapsed); + s_debug("%s: \"%s\" remain=%'d us, bt->elapsed=%'d us", + G_STRFUNC, bs->name, remain, bt->elapsed); } + remain -= MIN(remain, bt->elapsed); - if (bg_debug > 4) - g_debug("BGTASK \"%s\" step #%d.%d ran %d tick%s " + /* + * If task was cancelled, terminate it. + */ + + if (bt->uflags & TASK_UF_CANCELLED) { + bg_task_cancel(bt); + continue; + } + + if (bg_debug > 4) { + s_debug("BGTASK \"%s\" step #%d.%d ran %d tick%s " "in %d usecs ret=%d", bt->name, bt->step, bt->seqno, - bt->ticks_used, bt->ticks_used == 1 ? "" : "s", + bt->ticks_used, plural(bt->ticks_used), bt->elapsed, ret); + } /* * Analyse return code from processing callback. @@ -1136,13 +2148,15 @@ switch (ret) { case BGR_DONE: /* OK, end processing */ bg_task_ended(bt); - break; + goto ended; case BGR_NEXT: /* OK, move to next step */ if (bt->step == (bt->stepcnt - 1)) bg_task_ended(bt); else { + BG_TASK_LOCK(bt); bt->seqno = 0; bt->step++; + BG_TASK_UNLOCK(bt); bt->tick_cost = 0.0; /* Don't know cost of this new step */ } break; @@ -1152,86 +2166,428 @@ case BGR_ERROR: bt->exitcode = -1; /* Fake an exit(-1) */ bg_task_terminate(bt); - break; + goto ended; + } + + /* + * Put the task to sleep if requested. + * + * To prevent race conditions with bg_sched_sleep() being run + * concurrently with a bg_task_wakeup() call for instance, we need + * to lock the scheduler during that check. + */ + + if G_UNLIKELY(bt->uflags & TASK_UF_SLEEP_REQ) { + bool move_to_sleep = FALSE; + + /* Strict lock order: task first, then scheduler */ + BG_TASK_LOCK(bt); + BG_SCHED_LOCK(bt->sched); + + if (bt->uflags & TASK_UF_SLEEP_REQ) { + bt->uflags &= ~TASK_UF_SLEEP_REQ; + bt->uflags |= TASK_UF_SLEEPING; /* Explicitly sleeping */ + move_to_sleep = TRUE; + } + + if (move_to_sleep) + bg_sched_sleep(bt); + + BG_SCHED_UNLOCK(bt->sched); + BG_TASK_UNLOCK(bt); } + + ended: + continue; /* Cannot put an empty label */ } - if (dead_tasks != NULL) - bg_reclaim_dead(); /* Free dead tasks */ + if (0 != eslist_count(&bs->dead_tasks)) + bg_reclaim_dead(bs); /* Free dead tasks */ if (bg_debug > 3 && MAX_LIFE != remain) { - g_debug("BGTASK runable=%d, ran for %lu usecs, scheduling %u task%s", - bg_runcount, MAX_LIFE - remain, - schedules, 1 == schedules ? "" : "s"); + s_debug("BGTASK \"%s\" runable=%d, ran for %lu usecs, " + "scheduling %u task%s", + bs->name, bs->runcount, MAX_LIFE - remain, + schedules, plural(schedules)); + } + + /* + * Update total scheduler work time, in msecs. + */ + + { + tm_t end; + time_delta_t us; + + tm_now_exact(&end); + us = tm_elapsed_us(&end, &start); + bs->wtime += (us + 500) / 1000; /* wtime is in ms */ + + /* + * Use as a source of randomness, to harvest more entropy. + */ + + entropy_harvest_single(VARLEN(us)); } return TRUE; /* Keep calling */ } -static guint -bg_task_terminate_all(GSList **ptr) +/** + * @return amount of runnable tasks in the scheduler. + */ +int +bg_sched_runcount(const bgsched_t *bs) { - guint count; + int r; - count = 0; - if (*ptr) { - GSList *iter, *copy; + bg_sched_check(bs); - copy = g_slist_copy(*ptr); - for (iter = copy; NULL != iter; iter = g_slist_next(iter)) { - count++; - bg_task_terminate(iter->data); - } - gm_slist_free_null(©); - gm_slist_free_null(ptr); + BG_SCHED_LOCK(bs); + r = bs->runcount; + BG_SCHED_UNLOCK(bs); + + return r; +} + +/** + * Iterate on the scheduler's tasks. + * + * @return the amount of runnable tasks that remain. + */ +int +bg_sched_run(bgsched_t *bs) +{ + bg_sched_check(bs); + + (void) bg_sched_timer(bs); + + return bg_sched_runcount(bs); +} + +static uint +bg_task_terminate_all(eslist_t *l) +{ + uint n; + + n = eslist_count(l); + eslist_foreach(l, (data_fn_t) bg_task_terminate, NULL); + eslist_clear(l); + + return n; +} + +/** + * Allocate a new background task scheduler. + * + * @param name scheduler name (for logging purposes) + * @param max_life maximum life time of a scheduling tick, in usecs + * @param schedule whether to schedule periodic servicing via callout queue + */ +static bgsched_t * +bg_sched_alloc(const char *name, ulong max_life, bool schedule) +{ + bgsched_t *bs; + + WALLOC0(bs); + bs->magic = BGSCHED_MAGIC; + mutex_init(&bs->lock); + bs->name = atom_str_get(name); + bs->max_life = max_life; + bs->stid = -1U; + eslist_init(&bs->runq, offsetof(struct bgtask, bgt_link)); + eslist_init(&bs->sleepq, offsetof(struct bgtask, bgt_link)); + eslist_init(&bs->dead_tasks, offsetof(struct bgtask, bgt_link)); + + bg_sched_list_add(bs); + + if (schedule) { + /* + * Initially, the periodic event providing "scheduling ticks" triggers + * every second. This time is adjusted when there is work to do so + * that background tasks can nicely blend in the middle of other + * activities. + */ + + bs->period = BG_TICK_IDLE; + bs->pev = cq_periodic_main_add(BG_TICK_IDLE, bg_sched_timer, bs); } - return count; + + return bs; } /** - * Initialize background task scheduling. + * Create a new background task scheduler. + * + * The application must call bg_sched_run() on that scheduler to execute + * the tasks it holds. + * + * @param name scheduler name (for logging purposes) + * @param max_life maximum life time of a scheduling tick, in usecs + */ +bgsched_t * +bg_sched_create(const char *name, ulong max_life) +{ + return bg_sched_alloc(name, max_life, FALSE); +} + +/** + * Destroy a background task scheduler, terminating all its tasks. + */ +static void +bg_sched_destroy(bgsched_t *bs) +{ + uint count; + + bg_sched_list_remove(bs); + + BG_SCHED_LOCK(bs); + + count = bg_task_terminate_all(&bs->runq); + if (count > 0) { + s_warning("terminated %u running task%s", count, plural(count)); + } + + count = bg_task_terminate_all(&bs->sleepq); + if (count > 0) { + s_warning("terminated %d daemon task%s", count, plural(count)); + } + + bg_reclaim_dead(bs); /* Free dead tasks */ + bs->runcount = 0; + cq_periodic_remove(&bs->pev); + atom_str_free_null(&bs->name); + + mutex_destroy(&bs->lock); + bs->magic = 0; + WFREE(bs); +} + +/** + * Destroy background task scheduler, terminating all its tasks, and nullify + * its pointer. */ void -bg_init(void) +bg_sched_destroy_null(bgsched_t **bs_ptr) { + bgsched_t *bs = *bs_ptr; + + if (bs != NULL) { + bg_sched_destroy(bs); + *bs_ptr = NULL; + } +} + +struct bg_info_list_vars { + pslist_t *sl; + bgsched_t *bs; +}; + +static void +bg_info_get(void *data, void *udata) +{ + bgtask_t *bt = data; + struct bg_info_list_vars *v = udata; + bgtask_info_t *bi; + bool locked; + uint32 flags; + + bg_task_check(bt); + bg_sched_check(v->bs); + + WALLOC0(bi); + bi->magic = BGTASK_INFO_MAGIC; + + /* + * The normal lock order is to lock the task, then the scheduler. + * Here the scheduler is already locked, hence blindly attempting + * to lock the task could create a deadlock. + * + * We therefore only try to lock the task and if we cannot, we avoid + * accessing potentially risky information that could normally change + * at runtime under lock protection. + * --RAM, 2015-03-06 + */ + + locked = BG_TASK_TRYLOCK(bt); + + bi->tname = atom_str_get(bt->name); + bi->sname = atom_str_get(v->bs->name); + bi->stid = v->bs->stid; + bi->wtime = bt->wtime; + bi->step = bt->step; + bi->seqno = bt->seqno; + bi->stepcnt = bt->stepcnt; + if (locked) + bi->signals = pslist_length(bt->signals); /* Expecting low amount */ + flags = bt->flags; /* Read all bits once */ + bi->running = booleanize(flags & TASK_F_RUNNING); + bi->daemon = booleanize(flags & TASK_F_DAEMON); + bi->cancelling = booleanize(flags & TASK_F_CANCELLING); + bi->cancelled = booleanize(bt->uflags & TASK_UF_CANCELLED); + + if (bi->daemon) { + struct bgdaemon *bd = BG_DAEMON(bt); + g_assert(bd != NULL); + bi->wq_count = bd->wq_count; + bi->wq_done = bd->wq_done; + } + /* - * Initially, the periodic event providing "scheduling ticks" triggers - * every second. This time is adjusted when there is work to do so - * that background tasks can nicely blend in the middle of other activities. + * Let them know whether the information we're reporting was obtained + * with the task locked. */ - bg_ticker.period = BG_TICK_IDLE; - bg_ticker.pev = cq_periodic_main_add(BG_TICK_IDLE, bg_sched_timer, NULL); + bi->locked = booleanize(locked); + + if (locked) + BG_TASK_UNLOCK(bt); + + v->sl = pslist_prepend(v->sl, bi); } /** - * Called at shutdown time. + * Retrieve background task information. + * + * @return list of bgtask_info_t that must be freed by calling the + * bg_info_list_free_null() routine. */ -void -bg_close(void) +pslist_t * +bg_info_list(void) { - guint count; + struct bg_info_list_vars v; - count = bg_task_terminate_all(&runq); - if (count > 0) { - g_warning("terminated %u running task%s", - count, count == 1 ? "" : "s"); + v.sl = NULL; + + BG_SCHED_LIST_LOCK; + + ELIST_FOREACH_DATA(&bg_sched_list, v.bs) { + BG_SCHED_LOCK(v.bs); + eslist_foreach(&v.bs->runq, bg_info_get, &v); + eslist_foreach(&v.bs->sleepq, bg_info_get, &v); + if (v.bs->current_task != NULL) + bg_info_get(v.bs->current_task, &v); + BG_SCHED_UNLOCK(v.bs); } - count = bg_task_terminate_all(&sleepq); - if (count > 0) { - g_warning("terminated %d daemon task%s", - count, count == 1 ? "" : "s"); + BG_SCHED_LIST_UNLOCK; + + return v.sl; +} + +static void +bg_info_free(void *data, void *udata) +{ + bgtask_info_t *bi = data; + + bgtask_info_check(bi); + (void) udata; + + atom_str_free_null(&bi->tname); + atom_str_free_null(&bi->sname); + WFREE(bi); +} + +/** + * Free list created by bg_info_list() and nullify pointer. + */ +void +bg_info_list_free_null(pslist_t **sl_ptr) +{ + pslist_t *sl = *sl_ptr; + + pslist_foreach(sl, bg_info_free, NULL); + pslist_free_null(sl_ptr); +} + +/** + * Retrieve background scheduler information. + * + * @return list of bgsched_info_t that must be freed by calling the + * bg_sched_info_list_free_null() routine. + */ +pslist_t * +bg_sched_info_list(void) +{ + bgsched_t *bs; + pslist_t *sl = NULL; + + BG_SCHED_LIST_LOCK; + + ELIST_FOREACH_DATA(&bg_sched_list, bs) { + bgsched_info_t *bsi; + + WALLOC0(bsi); + bsi->magic = BGSCHED_INFO_MAGIC; + + BG_SCHED_LOCK(bs); + bsi->name = atom_str_get(bs->name); + bsi->completed = bs->completed; + bsi->stid = bs->stid; + bsi->wtime = bs->wtime; + bsi->runq_count = eslist_count(&bs->runq); + bsi->sleepq_count = eslist_count(&bs->sleepq); + bsi->runcount = bs->runcount; + bsi->max_life = bs->max_life; + bsi->period = bs->period; + BG_SCHED_UNLOCK(bs); + + sl = pslist_prepend(sl, bsi); } - bg_reclaim_dead(); /* Free dead tasks */ - bg_runcount = 0; - cq_periodic_remove(&bg_ticker.pev); + BG_SCHED_LIST_UNLOCK; + + return pslist_reverse(sl); /* Order list as scheduler definition */ +} + +static void +bg_sched_info_free(void *data, void *udata) +{ + bgsched_info_t *bsi = data; + + bgsched_info_check(bsi); + (void) udata; + + atom_str_free_null(&bsi->name); + WFREE(bsi); +} + +/** + * Free list created by bg_sched_list() and nullify pointer. + */ +void +bg_sched_info_list_free_null(pslist_t **sl_ptr) +{ + pslist_t *sl = *sl_ptr; + + pslist_foreach(sl, bg_sched_info_free, NULL); + pslist_free_null(sl_ptr); +} + +/** + * Initialize background task scheduling. + */ +void +bg_init(void) +{ + g_assert(NULL == bg_sched); + + bg_sched = bg_sched_alloc("main", MAX_LIFE, TRUE); + bg_closed = FALSE; +} + +/** + * Called at shutdown time. + */ +void +bg_close(void) +{ + bg_sched_destroy_null(&bg_sched); + bg_closed = TRUE; } /* bg_task_goto */ /* bg_task_gosub */ -/* bg_task_get_exitcode */ /* bg_task_get_signal */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/bg.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/bg.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2013 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,7 +28,7 @@ * Background task management. * * @author Raphael Manfredi - * @date 2002-2003 + * @date 2002-2003, 2013 */ #ifndef _bg_h_ @@ -52,7 +52,8 @@ typedef enum { BGS_OK = 0, /**< OK, terminated normally */ BGS_ERROR, /**< Terminated with error */ - BGS_KILLED /**< Was killed by signal */ + BGS_KILLED, /**< Was killed by signal */ + BGS_CANCELLED /**< Was cancelled */ } bgstatus_t; /* @@ -67,7 +68,65 @@ BG_SIG_COUNT } bgsig_t; -struct bgtask; +typedef struct bgtask bgtask_t; +typedef struct bgsched bgsched_t; + +enum bg_info_magic { + BGTASK_INFO_MAGIC = 0x4f01b8ee, + BGSCHED_INFO_MAGIC = 0x566b1976 +}; + +/** + * Task information that can be retrieved. + */ +typedef struct { + enum bg_info_magic magic; + const char *tname; /**< Task name (atom) */ + const char *sname; /**< Scheduler name (atom) */ + uint stid; /**< Scheduler's thread ID */ + ulong wtime; /**< Wall-clock run time sofar, in ms */ + int step; /**< Current processing step */ + int seqno; /**< Number of calls made to same step */ + int stepcnt; /**< Amount of steps */ + size_t signals; /**< Signals pending delivery */ + size_t wq_count; /**< Work queue count, for daemon tasks */ + size_t wq_done; /**< Processed items, for daemon tasks */ + uint running:1; /**< Is task running? */ + uint daemon:1; /**< Is task a daemon? */ + uint cancelled:1; /**< Is task cancelled? */ + uint cancelling:1; /**< Is task cancel being processed? */ + uint locked:1; /**< Whether we could lock task to read all info */ +} bgtask_info_t; + +static inline void +bgtask_info_check(const bgtask_info_t * const bi) +{ + g_assert(bi != NULL); + g_assert(BGTASK_INFO_MAGIC == bi->magic); +} + +/** + * Scheduler information that can be retrieved. + */ +typedef struct { + enum bg_info_magic magic; + const char *name; /**< Scheduler name (atom) */ + size_t completed; /**< Amount of completed tasks */ + uint stid; /**< Scheduler's thread ID */ + ulong wtime; /**< Wall-clock run time, in ms */ + uint runq_count; /**< Run queue task count */ + uint sleepq_count; /**< Sleeping queue task count */ + int runcount; /**< Amount of runnable tasks */ + uint max_life; /**< Maximum schedule life, in usecs */ + int period; /**< Scheduling period for callout, in ms */ +} bgsched_info_t; + +static inline void +bgsched_info_check(const bgsched_info_t * const bsi) +{ + g_assert(bsi != NULL); + g_assert(BGSCHED_INFO_MAGIC == bsi->magic); +} /* * Signatures. @@ -81,14 +140,14 @@ * `bgnotify_cb_t' is the start/stop callback when daemon starts/stops working. */ -typedef bgret_t (*bgstep_cb_t)(struct bgtask *h, gpointer ctx, int ticks); -typedef void (*bgsig_cb_t)(struct bgtask *h, gpointer ctx, bgsig_t sig); -typedef void (*bgclean_cb_t)(gpointer ctx); -typedef void (*bgdone_cb_t)(struct bgtask *h, gpointer ctx, - bgstatus_t status, gpointer arg); -typedef void (*bgstart_cb_t)(struct bgtask *h, gpointer ctx, gpointer item); -typedef void (*bgend_cb_t)(struct bgtask *h, gpointer ctx, gpointer item); -typedef void (*bgnotify_cb_t)(struct bgtask *h, gboolean on); +typedef bgret_t (*bgstep_cb_t)(bgtask_t *h, void *ctx, int ticks); +typedef void (*bgsig_cb_t)(bgtask_t *h, void *ctx, bgsig_t sig); +typedef void (*bgclean_cb_t)(void *ctx); +typedef void (*bgdone_cb_t)(bgtask_t *h, void *ctx, + bgstatus_t status, void *arg); +typedef void (*bgstart_cb_t)(bgtask_t *h, void *ctx, void *item); +typedef void (*bgend_cb_t)(bgtask_t *h, void *ctx, void *item); +typedef void (*bgnotify_cb_t)(bgtask_t *h, bool on); /* * Public interface. @@ -98,33 +157,70 @@ void bg_set_debug(unsigned level); void bg_close(void); -struct bgtask *bg_task_create( +bgsched_t *bg_sched_create(const char *name, ulong max_life); +void bg_sched_destroy_null(bgsched_t **bs_ptr); +int bg_sched_run(bgsched_t *bs); +int bg_sched_runcount(const bgsched_t *bs); + +const char *bgstatus_to_string(bgstatus_t status); + +bgtask_t *bg_task_create( + bgsched_t *bs, + const char *name, + const bgstep_cb_t *steps, int stepcnt, + void *ucontext, + bgclean_cb_t ucontext_free, + bgdone_cb_t done_cb, + void *done_arg); + +bgtask_t *bg_task_create_stopped( + bgsched_t *bs, const char *name, const bgstep_cb_t *steps, int stepcnt, - gpointer ucontext, + void *ucontext, bgclean_cb_t ucontext_free, bgdone_cb_t done_cb, - gpointer done_arg); + void *done_arg); -struct bgtask *bg_daemon_create( +bgtask_t *bg_daemon_create( + bgsched_t *bs, const char *name, const bgstep_cb_t *steps, int stepcnt, - gpointer ucontext, + void *ucontext, bgclean_cb_t ucontext_free, bgstart_cb_t start_cb, bgend_cb_t end_cb, bgclean_cb_t item_free, bgnotify_cb_t notify); -void bg_daemon_enqueue(struct bgtask *h, gpointer item); - -void bg_task_cancel(struct bgtask *h); -void bg_task_exit(struct bgtask *h, int code) G_GNUC_NORETURN; -void bg_task_ticks_used(struct bgtask *h, int used); -bgsig_cb_t bg_task_signal(struct bgtask *h, bgsig_t sig, bgsig_cb_t handler); - -int bg_task_seqno(const struct bgtask *h); -gpointer bg_task_context(const struct bgtask *h); +void bg_daemon_enqueue(bgtask_t *h, void *item); +void bg_task_run(bgtask_t *bt); + +void bg_task_cancel(bgtask_t *h); +void bg_task_cancel_test(bgtask_t *bt); +void bg_task_sleep(bgtask_t *bt); +void bg_task_wakeup(bgtask_t *bt); +void bg_task_exit(bgtask_t *h, int code) G_NORETURN; +void bg_task_ticks_used(bgtask_t *h, int used); +bgsig_cb_t bg_task_signal(bgtask_t *h, bgsig_t sig, bgsig_cb_t handler); + +bgtask_t *bg_task_ref(bgtask_t *bt); +void bg_task_unref(bgtask_t *bt); + +int bg_task_step(const bgtask_t *bt); +int bg_task_seqno(const bgtask_t *h); +void *bg_task_context(const bgtask_t *h); +const char *bg_task_name(const bgtask_t *h); +unsigned long bg_task_wtime(const bgtask_t *h); +const char *bg_task_step_name(bgtask_t *bt); +int bg_task_exitcode(bgtask_t *bt); + +void *bg_task_set_context(bgtask_t *bt, void *ucontext); + +struct pslist *bg_info_list(void); +void bg_info_list_free_null(struct pslist **sl_ptr); +struct pslist *bg_sched_info_list(void); +void bg_sched_info_list_free_null(struct pslist **sl_ptr); #endif /* _bg_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/bigint.c
Added
@@ -0,0 +1,706 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Big integer arithmetic operations. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#include <math.h> + +#include "bigint.h" +#include "buf.h" +#include "endian.h" +#include "misc.h" +#include "unsigned.h" +#include "walloc.h" +#include "xmalloc.h" + +#include "override.h" /* Must be the last header included */ + +/** + * A big integer. + * + * Representation of the integer value in the array is big-endian. + */ +struct bigint { + enum bigint_magic magic; /**< Magic number */ + size_t len; /**< Buffer length, in bytes */ + uint8 *v; /**< Value as an array of chars */ + unsigned is_allocated:1; /**< Was v dynamically allocated? */ + unsigned is_static:1; /**< Was structure dynamically allocated? */ +}; + +static void +bigint_check(const struct bigint * const b) +{ + g_assert(b != NULL); + g_assert(BIGINT_MAGIC == b->magic); + g_assert(size_is_positive(b->len)); +} + +#define BIGINT(x) ((struct bigint *) (x)) + +/** + * Initialize big integer to use an existing array representation. + * + * @param bi the big integer to initialize + * @param array array of bytes holding the big interger data + * @param len amount of bytes in array + */ +void +bigint_use(bigint_t *bi, void *array, size_t len) +{ + struct bigint *b = BIGINT(bi); + + g_assert(bi != NULL); + g_assert(array != NULL); + g_assert(size_is_positive(len)); + + STATIC_ASSERT(sizeof(struct bigint_fake) == sizeof(struct bigint)); + + b->magic = BIGINT_MAGIC; + b->len = len; + b->v = array; + b->is_allocated = FALSE; + b->is_static = TRUE; +} + +/** + * Allocate a big integer, set it to 0. + */ +bigint_t * +bigint_new(size_t len) +{ + struct bigint *b; + + WALLOC0(b); + b->magic = BIGINT_MAGIC; + b->len = len; + b->v = walloc0(len); + b->is_allocated = TRUE; + b->is_static = FALSE; + + return (bigint_t *) b; +} + +/** + * Initialize a big integer of specified length, set it to 0. + */ +void +bigint_init(bigint_t *bi, size_t len) +{ + struct bigint *b = BIGINT(bi); + + ZERO(b); + b->magic = BIGINT_MAGIC; + b->len = len; + b->v = walloc0(len); + b->is_allocated = TRUE; + b->is_static = TRUE; +} + +/** + * Free big integer. + */ +void +bigint_free(bigint_t *bi) +{ + struct bigint *b = BIGINT(bi); + + bigint_check(b); + + if (b->is_allocated) + WFREE_NULL(b->v, b->len); + + b->magic = 0; + + if (!b->is_static) + WFREE(b); +} + +/** + * Zero the big integer. + */ +void +bigint_zero(bigint_t *bi) +{ + struct bigint *b = BIGINT(bi); + + bigint_check(b); + memset(b->v, 0, b->len); +} + +/** + * Is big integer zero? + */ +gboolean +bigint_is_zero(const bigint_t *bi) +{ + const struct bigint *b = BIGINT(bi); + size_t i; + + bigint_check(b); + + for (i = 0; i < b->len; i++) { + if (0 != b->vi) + return FALSE; + } + + return TRUE; +} + +/** + * Copy big integer into result. + */ +void +bigint_copy(bigint_t *res, const bigint_t *other) +{ + struct bigint *bres = BIGINT(res); + struct bigint *bother = BIGINT(other); + size_t offset; + + bigint_check(bres); + bigint_check(bother); + g_assert(bres->len >= bother->len); + + offset = bres->len - bother->len; + + memcpy(&bres->voffset, bother->v, bother->len); + if (offset != 0) + memset(bres->v, 0, offset); +} + +/** + * Compare two big integers as unsigned quantities. + */ +int +bigint_cmp(const bigint_t *bi1, const bigint_t *bi2) +{ + const struct bigint *b1 = BIGINT(bi1); + const struct bigint *b2 = BIGINT(bi2); + size_t i; + + bigint_check(b1); + bigint_check(b2); + + if (b1->len != b2->len) { + int s; + size_t offset; + + /* + * Swap b1 and b2 if needed to make sure b1 is the number with the + * longest amount of bytes for its representation. + */ + + if (b1->len < b2->len) { + const struct bigint *bt = b1; + b1 = b2; + b2 = bt; + s = -1; + } else { + s = +1; + } + + /* + * Leading bytes from b1 must be zero or it's greater than b2. + */ + + offset = b1->len - b2->len; + + for (i = offset - 1; size_is_non_negative(i); i--) { + if (b1->vi != 0) + return +1 * s; + } + + for (i = offset; i < b1->len; i++) { + unsigned bv1 = b1->vi; + unsigned bv2 = b2->vi - offset; + + if (bv1 < bv2) + return -1 * s; + else if (bv2 < bv1) + return +1 * s; + } + } else { + for (i = 0; i < b1->len; i++) { + unsigned bv1 = b1->vi; + unsigned bv2 = b2->vi; + + if (bv1 < bv2) + return -1; + else if (bv2 < bv1) + return +1; + } + } + + return 0; +} + +/** + * Set 32-bit quantity in the big number. + */ +void +bigint_set32(bigint_t *bi, uint32 val) +{ + struct bigint *b = BIGINT(bi); + + bigint_check(b); + g_assert(b->len >= sizeof(uint32)); + + memset(b->v, 0, b->len - sizeof(uint32)); + poke_be32(&b->vb->len - sizeof(uint32), val); +} + +/** + * Set 64-bit quantity in the big number. + */ +void +bigint_set64(bigint_t *bi, uint64 val) +{ + struct bigint *b = BIGINT(bi); + + bigint_check(b); + g_assert(b->len >= sizeof(uint64)); + + memset(b->v, 0, b->len - sizeof(uint64)); + poke_be64(&b->vb->len - sizeof(uint64), val); +} + +/** + * Set the nth bit in the big integer to 1. + * + * The lowest bit is 0, at the rightmost part of the integer (big-endian + * representation). + */ +void +bigint_set_nth_bit(bigint_t *bi, size_t n) +{ + struct bigint *b = BIGINT(bi); + size_t byt; + uint8 mask; + + bigint_check(b); + g_assert(size_is_non_negative(n)); + g_assert(n < b->len * 8); + + byt = b->len - (n / 8) - 1; + mask = 1 << (n % 8); + + g_assert(size_is_non_negative(byt) && byt < b->len); + + b->vbyt |= mask; +} + +/** + * Is big integer positive, considering 2-complement arithmetic? + */ +bool +bigint_is_positive(const bigint_t *bi) +{ + const struct bigint *b = BIGINT(bi); + + return 0 == (b->v0 & 0x80) ? TRUE : FALSE; +} + +/** + * Negate big integer, using 2-complement arithmetic. + */ +void +bigint_negate(bigint_t *bi) +{ + struct bigint *b = BIGINT(bi); + size_t i; + bool carry; + + bigint_check(b); + + /* + * Add 1 to ~k. + */ + + for (carry = TRUE, i = b->len - 1; size_is_non_negative(i); i--) { + unsigned sum; + + sum = (~b->vi & 0xff) + (carry ? 1 : 0); + carry = sum >= 0x100; + b->vi = sum & 0xff; + } +} + +/** + * Flip all the bits of the big integer. + */ +void +bigint_not(bigint_t *bi) +{ + struct bigint *b = BIGINT(bi); + size_t i; + + bigint_check(b); + + for (i = 0; i < b->len; i++) { + b->vi = (~b->vi & 0xff); + } +} + +/** + * Add second big integer into the first and return whether there was a + * leading carry bit (addition overflow). + */ +bool +bigint_add(bigint_t *res, const bigint_t *other) +{ + struct bigint *bres = BIGINT(res); + struct bigint *bother = BIGINT(other); + size_t offset, i; + bool carry; + + bigint_check(bres); + bigint_check(bother); + g_assert(bres->len >= bother->len); + + offset = bres->len - bother->len; + + for (carry = FALSE, i = bres->len - 1; size_is_non_negative(i); i--) { + unsigned bo, sum; + + bo = i < offset ? 0 : bother->vi - offset; + sum = bres->vi + bo + (carry ? 1 : 0); + bres->vi = sum & 0xff; + carry = sum >= 0x100; + } + + return carry; +} + +/** + * Add small quantity to the big integer, in place, and return whether there + * was a leading carry bit. + */ +bool +bigint_add_u8(bigint_t *bi, uint8 val) +{ + struct bigint *b = BIGINT(bi); + bool carry; + unsigned sum; + + bigint_check(b); + + sum = b->vb->len - 1 + val; + b->vb->len - 1 = sum & 0xff; + carry = sum >= 0x100; + + if (b->len > 1) { + size_t i; + for (i = b->len - 2; size_is_non_negative(i); i--) { + sum = b->vi + (carry ? 1 : 0); + b->vi = sum & 0xff; + carry = sum >= 0x100; + } + } + + return carry; +} + +/** + * Left shift big integer in place by 1 bit. + * Return whether there was a leading carry. + */ +bool +bigint_lshift(bigint_t *bi) +{ + struct bigint *b = BIGINT(bi); + size_t i; + bool carry; + + bigint_check(b); + + for (carry = FALSE, i = b->len - 1; size_is_non_negative(i); i--) { + unsigned accum; + + accum = b->vi; + accum <<= 1; + if (carry) + accum |= 0x1; + + b->vi = accum & 0xff; + carry = (accum & 0x100) == 0x100; + } + + return carry; +} + +/** + * Right shift big integer in place by 1 bit, leading bit being set to 0. + */ +void +bigint_rshift(bigint_t *bi) +{ + struct bigint *b = BIGINT(bi); + size_t i; + bool carry; + + bigint_check(b); + + for (carry = FALSE, i = 0; i < b->len; i++) { + unsigned accum; + + accum = b->vi; + if (carry) + accum |= 0x100; + + b->vi = accum >> 1; + carry = (accum & 0x1) == 0x1; + } +} + +/** + * Right shift big integer in place by specified amount of bytes, the leading + * bytes being set to 0. + */ +void +bigint_rshift_bytes(bigint_t *bi, size_t n) +{ + struct bigint *b = BIGINT(bi); + + bigint_check(b); + g_assert(size_is_non_negative(n)); + + if (n >= b->len) { + memset(b->v, 0, b->len); + } else { + size_t i; + + for (i = n; i < b->len; i++) { + b->vi = b->vi - n; + } + memset(b->v, 0, n); + } +} + +/** + * Multiply big integer by 8-bit lambda constant, in-place. + * + * @return leading carry byte (if not zero, we overflowed). + */ +uint8 +bigint_mult_u8(bigint_t *bi, uint8 val) +{ + struct bigint *b = BIGINT(bi); + size_t i; + uint8 carry; + + bigint_check(b); + + for (carry = 0, i = b->len - 1; size_is_non_negative(i); i--) { + unsigned accum; + + accum = b->vi * val + carry; + b->vi = accum & 0xff; + carry = (accum & 0xff00) >> 8; + } + + return carry; +} + +/** + * Divide b1 by b2, filling q with quotient and r with remainder. + */ +void +bigint_divide(const bigint_t *bi1, const bigint_t *bi2, + bigint_t *qi, bigint_t *ri) +{ + const struct bigint *b1 = BIGINT(bi1); + const struct bigint *b2 = BIGINT(bi2); + struct bigint *q = BIGINT(qi); + struct bigint *r = BIGINT(ri); + int cmp; + size_t i; + bigint_t nb2, saved; + + bigint_check(b1); + bigint_check(b2); + bigint_check(q); + bigint_check(r); + g_assert(b1->len == b2->len); + g_assert(r->len == b1->len); + g_assert(b1->len == q->len); + + /* + * First the trivial checks. + */ + + cmp = bigint_cmp(bi1, bi2); + + if (cmp < 0) { + bigint_copy(ri, bi1); /* r = b1 */ + bigint_zero(qi); /* q = 0 */ + return; + } else if (0 == cmp) { + bigint_zero(ri); /* r = 0 */ + bigint_zero(qi); + bigint_set_nth_bit(qi, 0); /* q = 1 */ + return; + } + + g_assert(cmp > 0); + + /* + * The algorithm retained for doing the binary division is known as + * the "shift, test and restore" algorithm. In a n-bit integer space, + * it can be described as follows: + * + * Consider the double-width register RQ as being one single 2n-bit + * register made by concatenating R and Q together. (a reminder of + * the "BC" register in the good old Z80...): + * + * R = 0 + * Q = dividend. + * + * For i = 1 to n do + * { + * RQ <<= 1 + * R -= divisor + * If R >= 0 { + * Q |= 1 + * } else { + * R += divisor + * } + * } + * + * At the end, Q has the quotient and R has the remainder. + */ + + bigint_zero(ri); /* R = 0 */ + bigint_copy(qi, bi1); /* Q = b1 */ + + bigint_init(&nb2, b2->len); + bigint_init(&saved, r->len); + + bigint_copy(&nb2, bi2); + bigint_negate(&nb2); /* nb2 = -b2 */ + + for (i = 8 * b1->len - 1; size_is_non_negative(i); i--) { + bool carry; + + /* RQ <<= 1 */ + carry = bigint_lshift(qi); + bigint_lshift(ri); + if (carry) + bigint_set_nth_bit(ri, 0); + + /* R -= divisor */ + bigint_copy(&saved, ri); + bigint_add(ri, &nb2); + + if (bigint_is_positive(ri)) /* If R >= 0 */ + bigint_set_nth_bit(qi, 0); /* Q |= 1 */ + else /* Else */ + bigint_copy(ri, &saved); /* R += divisor */ + } + + bigint_free(&saved); + bigint_free(&nb2); +} + +/** + * Convert big integer interpreted as a big-endian number into floating point. + */ +double +bigint_to_double(const bigint_t *bi) +{ + const struct bigint *b = BIGINT(bi); + int i; + double v = 0.0; + double p; + + bigint_check(b); + + for (i = b->len - 1, p = 0.0; size_is_non_negative(i); i--, p += 8.0) { + uint8 m = b->vi; + if (m != 0) + v += m * pow(2.0, p); + } + + return v; +} + +/** + * Convert big integer to 64-bit integer, truncating it if larger. + */ +uint64 +bigint_to_uint64(const bigint_t *bi) +{ + const struct bigint *b = BIGINT(bi); + + bigint_check(b); + + if G_UNLIKELY(b->len < sizeof(uint64)) { + uint8 bufsizeof(uint64); + + memset(buf, 0, sizeof buf); + memcpy(&bufsizeof(uint64) - b->len, &b->v0, b->len); + return peek_be64(buf); + } else { + return peek_be64(&b->vb->len - sizeof(uint64)); + } +} + +/** + * Convert a big integer into an hex string, with leading zeros stripped. + * + * @return pointer to data that should be considered static. + */ +const char * +bigint_to_hex_string(const bigint_t *bi) +{ + buf_t *bp = buf_private(G_STRFUNC, 64); + size_t buflen; + const struct bigint *b = BIGINT(bi); + const char *p; + + bigint_check(b); + + buflen = b->len * 2 + 1; /* Output space we need, with trailing NUL */ + + if G_UNLIKELY(buf_size(bp) < buflen) + bp = buf_private_resize(G_STRFUNC, buflen); + + bin_to_hex_buf(b->v, b->len, buf_data(bp), buf_size(bp)); + p = buf_data(bp); + + while ('0' == *p) + p++; + + return p; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/bigint.h
Added
@@ -0,0 +1,83 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Big integer arithmetic operations. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _bigint_h_ +#define _bigint_h_ + +enum bigint_magic { BIGINT_MAGIC = 0x3c1a6f4e }; + +/** + * Fake structure defined to allow static variables of type bigint_t. + */ +struct bigint_fake { + const enum bigint_magic m; + const size_t len; + const uint8 *p; + const unsigned flags; +}; + +typedef struct bigint_fake bigint_t; + +/* + * Public interface. + */ + +void bigint_use(bigint_t *bi, void *array, size_t len); +bigint_t *bigint_new(size_t len); +void bigint_init(bigint_t *bi, size_t len); +void bigint_free(bigint_t *bi); +void bigint_zero(bigint_t *bi); +void bigint_copy(bigint_t *res, const bigint_t *other); +gboolean bigint_is_zero(const bigint_t *bi); +int bigint_cmp(const bigint_t *bi1, const bigint_t *bi2); +void bigint_set32(bigint_t *bi, uint32 val); +void bigint_set64(bigint_t *bi, uint64 val); +void bigint_set_nth_bit(bigint_t *bi, size_t n); +bool bigint_is_positive(const bigint_t *bi); +void bigint_negate(bigint_t *bi); +void bigint_not(bigint_t *bi); +bool bigint_add(bigint_t *res, const bigint_t *other); +bool bigint_add_u8(bigint_t *bi, uint8 val); +bool bigint_lshift(bigint_t *bi); +void bigint_rshift(bigint_t *bi); +void bigint_rshift_bytes(bigint_t *bi, size_t n); +uint8 bigint_mult_u8(bigint_t *bi, uint8 val); +void bigint_divide(const bigint_t *bi1, const bigint_t *bi2, + bigint_t *qi, bigint_t *ri); +double bigint_to_double(const bigint_t *bi); +uint64 bigint_to_uint64(const bigint_t *bi); +const char *bigint_to_hex_string(const bigint_t *bi); + +#endif /* _bigint_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/bit_field.ht -> gtk-gnutella-1.1.9.tar.bz2/src/lib/bit_field.ht
Changed
@@ -29,15 +29,15 @@ * @ingroup lib * @file * - * Bit field (linear field of bits with fixed endiannes). + * Bit field (linear field of bits with fixed endianness). * - * Macros defined here are derived from those in <lib/bit_aray.h> but + * Macros defined here are derived from those in <lib/bit_array.h> but * operate on a linear field of byte, with fixed endianness of bits * within each byte. * * This is intended to be used for portable representations of bit fields. - * If used internally only, then bit_array_t should be preferred as it will - * be more efficient computation-wise. + * If used internally only, and on aligned long boundaries, then bit_array_t + * should be preferred as it will be more efficient computation-wise. * * @author Raphael Manfredi * @date 2010 @@ -57,7 +57,7 @@ * all bits of a "char" at once, where possible. */ -typedef guint8 bit_field_t; +typedef uint8 bit_field_t; #define BIT_FIELD_BITSHIFT 3 #define BIT_FIELD_BITSIZE (8 * sizeof(bit_field_t))
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/bit_generic.t -> gtk-gnutella-1.1.9.tar.bz2/src/lib/bit_generic.t
Changed
@@ -120,7 +120,7 @@ * @param n The index of the bit to flip counting from zero. * @return The new state of the bit. */ -static inline ALWAYS_INLINE gboolean +static inline ALWAYS_INLINE bool bit_generic_flip(bit_generic_t *base, size_t i) { return BIT_GENERIC_WORD(base, i) ^= BIT_GENERIC_BIT(base, i); @@ -133,7 +133,7 @@ * @param n The index of the bit to read counting from zero. * @return TRUE if the bit is set, FALSE otherwise. */ -static inline ALWAYS_INLINE gboolean +static inline ALWAYS_INLINE bool bit_generic_get(const bit_generic_t *base, size_t i) { return 0 != (BIT_GENERIC_WORD(base, i) & BIT_GENERIC_BIT(base, i)); @@ -145,7 +145,7 @@ * * @param base The base address of the bit <generic> which must be initialized. * @param from The first bit. - * @param to The last bit, must be equal or above "from". + * @param to The last bit, must be equal to or above "from". * @return TRUE if the bit is set, FALSE otherwise. */ static inline void @@ -179,7 +179,7 @@ * * @param base The base address of the bit <generic> which must be initialized. * @param from The first bit. - * @param to The last bit, must be equal or above "from". + * @param to The last bit, must be equal to or above "from". * @return TRUE if the bit is set, FALSE otherwise. */ static inline void @@ -212,7 +212,7 @@ * * @param base The base address of the bit <generic> which must be initialized. * @param from The first bit. - * @param to The last bit, must be equal or above "from". + * @param to The last bit, must be equal to or above "from". * @return (size_t) -1, if no unset bit was found. On success the * index of the first unset bit is returned. */ @@ -253,11 +253,56 @@ } /** + * Peforms a linear scan for the first set bit of the given bit <generic>. + * + * @param base The base address of the bit <generic> which must be initialized. + * @param from The first bit. + * @param to The last bit, must be equal to or above "from". + * @return (size_t) -1, if no unset bit was found. On success the + * index of the first set bit is returned. + */ +static inline size_t +bit_generic_first_set(const bit_generic_t *base, size_t from, size_t to) +{ + size_t i; + + g_assert(from <= to); + + for (i = from; i <= to; /* NOTHING */) { + if (0 == (i & BIT_GENERIC_BITMASK)) { + size_t n = (to - i) >> BIT_GENERIC_BITSHIFT; + + if (n != 0) { + size_t j = i >> BIT_GENERIC_BITSHIFT; + + while (n-- > 0) { + if (basej++ != 0) { + bit_generic_t value = basej - 1; + while (0 == (value & 0x1)) { + value >>= 1; + i++; + } + return i; + } + i += BIT_GENERIC_BITSIZE; + } + continue; + } + } + if (bit_generic_get(base, i)) + return i; + i++; + } + + return (size_t) -1; +} + +/** * Peforms a linear scan for the last set bit of the given bit <generic>. * * @param base The base address of the bit <generic> which must be initialized. * @param from The first bit. - * @param to The last bit, must be equal or above "from". + * @param to The last bit, must be equal to or above "from". * @return (size_t) -1, if no set bit was found. On success the * index of the last set bit is returned. */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/bsearch.h
Added
@@ -0,0 +1,151 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Binary search over sorted array. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#ifndef _bsearch_h_ +#define _bsearch_h_ + +#include "unsigned.h" + +#ifndef HAS_BSEARCH +/** + * Perform a binary search over a sorted arary. + * + * The sorting order of the array must be the same as the one implied + * by the comparison routine. + * + * If more than one item in the array is identical to the key, the actual + * item returned is undefined, but one of the matching entries of course. + * + * @note + * The comparison function is invoked as cmp(key, item), to compare the + * given key with the item. It means its signature may not be homogeneous, + * and can compare for instance a string with, say, a field like item->name. + * + * To use an homogeneous comparison routine (comparing two items of the + * same type, like strcmp() would for instance), prefer blookup(). However, + * that requires an additional routine to extract the key field to compare + * the key to. + * + * @param key the key being sought for + * @param base the base of the array + * @param count the amount of items in the array + * @param size the size of each item in the array + * @param cmp the item comparison routine, called as cmp(key, item) + * + * @return NULL if item is not found, the address of the item otherwise + */ +static inline void * +bsearch(const void *key, + const void *base, size_t count, size_t size, cmp_fn_t cmp) +{ + size_t low = 0, high = count; + + g_assert(size_is_non_negative(count)); + g_assert(size_is_positive(size)); + + /* Binary search */ + + while (low < high) { + size_t mid = (low + high) / 2; + const void *item = const_ptr_add_offset(base, mid * size); + int c = (*cmp)(key, item); + + if (c > 0) + low = mid + 1; + else if (c < 0) + high = mid; /* Not -1 since high is unsigned */ + else + return deconstify_pointer(item); + } + + return NULL; +} +#endif /* !HAS_BSEARCH */ + +/** + * Perform a binary search over a sorted arary, using homogeneous comparisons. + * + * The sorting order of the array must be the same as the one implied + * by the comparison routine. + * + * If more than one item in the array is identical to the key, the actual + * item returned is undefined, but one of the matching entries of course. + * + * The key extraction routine is given an item and must return a pointer + * to the field suitable for comparing with the key. + * + * @note + * In order to use an homogeneous comparison routine (comparing two items + * of the same type, like strcmp() would for instance), this routine requires + * that a key extraction routine be provided to extract the key from each item. + * + * @param key the key being sought for + * @param base the base of the array + * @param count the amount of items in the array + * @param size the size of each item in the array + * @param cmp the key comparison routine + * @param gkey the key extraction routine + * + * @return NULL if item is not found, the address of the item otherwise + */ +static inline void * +blookup(const void *key, + const void *base, size_t count, size_t size, cmp_fn_t cmp, get_fn_t gkey) +{ + size_t low = 0, high = count; + + g_assert(size_is_non_negative(count)); + g_assert(size_is_positive(size)); + + /* Binary search */ + + while (low < high) { + size_t mid = (low + high) / 2; + const void *item = const_ptr_add_offset(base, mid * size); + const void *ikey = (*gkey)(item); + int c = (*cmp)(key, ikey); + + if (c > 0) + low = mid + 1; + else if (c < 0) + high = mid; /* Not -1 since high is unsigned */ + else + return deconstify_pointer(item); + } + + return NULL; +} + +#endif /* _bsearch_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/bstr.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/bstr.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Raphael Manfredi + * Copyright (c) 2008 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -34,6 +34,7 @@ #include "common.h" #include "bstr.h" + #include "casts.h" #include "endian.h" #include "glib-missing.h" @@ -43,6 +44,7 @@ #include "stringify.h" #include "unsigned.h" #include "walloc.h" + #include "override.h" /* Must be the last header included */ #define BSTR_ERRLEN 160 /**< Default length for error string */ @@ -58,8 +60,8 @@ const unsigned char *rptr; /**< First unread byte in buffer */ const unsigned char *end; /**< First byte beyond buffer */ str_t *error; /**< Last parsing error */ - guint32 flags; /**< Configuration flags */ - gboolean ok; /**< Whether everything is OK so far */ + uint32 flags; /**< Configuration flags */ + bool ok; /**< Whether everything is OK so far */ }; static inline void @@ -82,7 +84,7 @@ * Reset the stream. */ static void -reset_stream(bstr_t *bs, const void *arena, size_t len, guint32 flags) +reset_stream(bstr_t *bs, const void *arena, size_t len, uint32 flags) { bs->ok = TRUE; bs->flags = flags; @@ -118,7 +120,7 @@ * Record End of Stream condition. * @return FALSE */ -static gboolean +static bool error_eos(bstr_t *bs, size_t expected, const char *where) { bs->flags |= BSTR_F_EOS; @@ -126,10 +128,10 @@ if (bs->flags & BSTR_F_ERROR) { alloc_error(bs); str_printf(bs->error, - "%s: end of stream reached at offset %zu; expected %s more byte%s", + "%s(): end of stream reached at offset %zu; " + "expected %s more byte%s", where, ptr_diff(bs->end, bs->start), - expected ? size_t_to_string(expected) : "some", - expected == 1 ? "" : "s"); + expected ? size_t_to_string(expected) : "some", plural(expected)); } return bs->ok = FALSE; @@ -146,7 +148,7 @@ * which can be reused through bstr_close() and bstr_reset() at will. */ bstr_t * -bstr_open(const void *arena, size_t len, guint32 flags) +bstr_open(const void *arena, size_t len, uint32 flags) { bstr_t *bs; @@ -172,7 +174,7 @@ * @param flags configuration flags */ void -bstr_reset(bstr_t *bs, const void *arena, size_t len, guint32 flags) +bstr_reset(bstr_t *bs, const void *arena, size_t len, uint32 flags) { bstr_check(bs); g_assert(arena); @@ -263,7 +265,7 @@ /** * Check whether there was an error. */ -gboolean +bool bstr_has_error(const bstr_t *bs) { bstr_check(bs); @@ -274,7 +276,7 @@ /** * Check whether the stream was fully deserialized with no error. */ -gboolean +bool bstr_ended(const bstr_t *bs) { bstr_check(bs); @@ -308,13 +310,13 @@ * Report invalid length condition. * @return FALSE */ -static gboolean +static bool invalid_len(bstr_t *bs, size_t len, const char *what, const char *where) { if (bs->flags & BSTR_F_ERROR) { alloc_error(bs); str_printf(bs->error, - "%s: invalid %s length %zu at offset %zu", + "%s(): invalid %s length %zu at offset %zu", where, what, len, ptr_diff(bs->rptr, bs->start)); } @@ -325,14 +327,14 @@ * Report invalid length condition, bounded by a maximum value. * @return FALSE */ -static gboolean +static bool invalid_len_max( bstr_t *bs, size_t len, size_t max, const char *what, const char *where) { if (bs->flags & BSTR_F_ERROR) { alloc_error(bs); str_printf(bs->error, - "%s: invalid %s length %zu (max is %zu) at offset %zu", + "%s(): invalid %s length %zu (max is %zu) at offset %zu", where, what, len, max, ptr_diff(bs->rptr, bs->start)); } @@ -343,13 +345,13 @@ * Report invalid encoding detected. * @return FALSE */ -static gboolean +static bool invalid_encoding(bstr_t *bs, const char *what, const char *where) { if (bs->flags & BSTR_F_ERROR) { alloc_error(bs); str_printf(bs->error, - "%s: invalid encoding at offset %zu: %s", + "%s(): invalid encoding at offset %zu: %s", where, ptr_diff(bs->rptr, bs->start), what); } @@ -360,13 +362,13 @@ * Report error. * @return FALSE */ -static gboolean +static bool report_error(bstr_t *bs, const char *what, const char *where) { if (bs->flags & BSTR_F_ERROR) { alloc_error(bs); str_printf(bs->error, - "%s: error at offset %zu: %s", + "%s(): error at offset %zu: %s", where, ptr_diff(bs->rptr, bs->start), what); } @@ -398,10 +400,11 @@ n = bstr_unread_size(bs); if (n != 0) { + bs->ok = FALSE; if (bs->flags & BSTR_F_ERROR) { alloc_error(bs); str_printf(bs->error, "has %zu trailing unread byte%s", - n, 1 == n ? "" : "s"); + n, plural(n)); } else { bs->flags |= BSTR_F_TRAILING; } @@ -412,7 +415,7 @@ * Check that stream contains at least the expected amount of bytes. * Raise the "End Of Stream" error. */ -static gboolean +static bool expect(bstr_t *bs, size_t expected, const char *where) { g_assert(bs); @@ -446,7 +449,7 @@ * * @return TRUE if OK. */ -gboolean +bool bstr_skip(bstr_t *bs, size_t count) { bstr_check(bs); @@ -455,7 +458,7 @@ if (!count) return TRUE; - if (!expect(bs, count, "bstr_skip")) + if (!expect(bs, count, G_STRFUNC)) return FALSE; bs->rptr += count; @@ -468,17 +471,17 @@ * @param bs the binary stream * @param buf where to write read data * @param count amount of data to read - * + * * @return TRUE if OK. */ -gboolean +bool bstr_read(bstr_t *bs, void *buf, size_t count) { bstr_check(bs); g_assert(size_is_positive(count)); g_assert(buf); - if (!expect(bs, count, "bstr_read")) + if (!expect(bs, count, G_STRFUNC)) return FALSE; memcpy(buf, bs->rptr, count); @@ -494,13 +497,13 @@ * * @return TRUE if OK. */ -gboolean -bstr_read_u8(bstr_t *bs, guint8 *pv) +bool +bstr_read_u8(bstr_t *bs, uint8 *pv) { bstr_check(bs); g_assert(pv); - if (!expect(bs, 1, "bstr_read_u8")) + if (!expect(bs, 1, G_STRFUNC)) return FALSE; *pv = peek_u8(bs->rptr++); @@ -515,13 +518,13 @@ * * @return TRUE if OK. */ -gboolean -bstr_read_boolean(bstr_t *bs, gboolean *pv) +bool +bstr_read_boolean(bstr_t *bs, bool *pv) { bstr_check(bs); g_assert(pv); - if (!expect(bs, 1, "bstr_read_boolean")) + if (!expect(bs, 1, G_STRFUNC)) return FALSE; *pv = peek_u8(bs->rptr++) ? TRUE : FALSE; @@ -536,13 +539,13 @@ * * @return TRUE if OK. */ -gboolean -bstr_read_le16(bstr_t *bs, guint16 *pv) +bool +bstr_read_le16(bstr_t *bs, uint16 *pv) { bstr_check(bs); g_assert(pv); - if (!expect(bs, 2, "bstr_read_le16")) + if (!expect(bs, 2, G_STRFUNC)) return FALSE; *pv = peek_le16(bs->rptr); @@ -558,13 +561,13 @@ * * @return TRUE if OK. */ -gboolean -bstr_read_be16(bstr_t *bs, guint16 *pv) +bool +bstr_read_be16(bstr_t *bs, uint16 *pv) { bstr_check(bs); g_assert(pv); - if (!expect(bs, 2, "bstr_read_be16")) + if (!expect(bs, 2, G_STRFUNC)) return FALSE; *pv = peek_be16(bs->rptr); @@ -580,13 +583,13 @@ * * @return TRUE if OK. */ -gboolean -bstr_read_le32(bstr_t *bs, guint32 *pv) +bool +bstr_read_le32(bstr_t *bs, uint32 *pv) { bstr_check(bs); g_assert(pv); - if (!expect(bs, 4, "bstr_read_le32")) + if (!expect(bs, 4, G_STRFUNC)) return FALSE; *pv = peek_le32(bs->rptr); @@ -602,13 +605,13 @@ * * @return TRUE if OK. */ -gboolean -bstr_read_be32(bstr_t *bs, guint32 *pv) +bool +bstr_read_be32(bstr_t *bs, uint32 *pv) { bstr_check(bs); g_assert(pv); - if (!expect(bs, 4, "bstr_read_be32")) + if (!expect(bs, 4, G_STRFUNC)) return FALSE; *pv = peek_be32(bs->rptr); @@ -624,13 +627,13 @@ * * @return TRUE if OK. */ -gboolean -bstr_read_be64(bstr_t *bs, guint64 *pv) +bool +bstr_read_be64(bstr_t *bs, uint64 *pv) { bstr_check(bs); g_assert(pv); - if (!expect(bs, 8, "bstr_read_be64")) + if (!expect(bs, 8, G_STRFUNC)) return FALSE; *pv = peek_be64(bs->rptr); @@ -646,13 +649,13 @@ * * @return TRUE if OK. */ -gboolean +bool bstr_read_time(bstr_t *bs, time_t *pv) { bstr_check(bs); g_assert(pv); - if (!expect(bs, 4, "bstr_read_time")) + if (!expect(bs, 4, G_STRFUNC)) return FALSE; *pv = (time_t) peek_be32(bs->rptr); @@ -668,13 +671,13 @@ * * @return TRUE if OK. */ -gboolean +bool bstr_read_float_be(bstr_t *bs, float *pv) { bstr_check(bs); g_assert(pv); - if (!expect(bs, 4, "bstr_read_float")) + if (!expect(bs, 4, G_STRFUNC)) return FALSE; *pv = peek_float_be32(bs->rptr); @@ -691,15 +694,13 @@ * * @return TRUE if OK */ -gboolean +bool bstr_read_ipv4_addr(bstr_t *bs, host_addr_t *ha) { - static const char where = "bstr_read_ipv4_addr"; - bstr_check(bs); g_assert(ha); - if (!expect(bs, 4, where)) + if (!expect(bs, 4, G_STRFUNC)) return FALSE; *ha = host_addr_peek_ipv4(bs->rptr); @@ -716,15 +717,13 @@ * * @return TRUE if OK */ -gboolean +bool bstr_read_ipv6_addr(bstr_t *bs, host_addr_t *ha) { - static const char where = "bstr_read_ipv6_addr"; - bstr_check(bs); g_assert(ha); - if (!expect(bs, 16, where)) + if (!expect(bs, 16, G_STRFUNC)) return FALSE; *ha = host_addr_peek_ipv6(bs->rptr); @@ -744,23 +743,22 @@ * * @return TRUE if OK */ -gboolean +bool bstr_read_packed_ipv4_or_ipv6_addr(bstr_t *bs, host_addr_t *ha) { - static const char where = "bstr_read_packed_ipv4_or_ipv6_addr"; - guint8 len; + uint8 len; bstr_check(bs); g_assert(ha); - if (!expect(bs, 1, where)) + if (!expect(bs, 1, G_STRFUNC)) return FALSE; len = peek_u8(bs->rptr++); if (len != 4 && len != 16) - return invalid_len(bs, len, "IP address", where); + return invalid_len(bs, len, "IP address", G_STRFUNC); - if (!expect(bs, len, where)) + if (!expect(bs, len, G_STRFUNC)) return FALSE; switch (len) { @@ -789,26 +787,25 @@ * * @return TRUE if OK */ -gboolean -bstr_read_packed_array_u8(bstr_t *bs, size_t max, void *ptr, guint8 *pr) +bool +bstr_read_packed_array_u8(bstr_t *bs, size_t max, void *ptr, uint8 *pr) { - static const char where = "bstr_read_packed_array_u8"; - guint8 len; + uint8 len; bstr_check(bs); g_assert(ptr); g_assert(pr); - if (!expect(bs, 1, where)) + if (!expect(bs, 1, G_STRFUNC)) return FALSE; len = peek_u8(bs->rptr++); if (len > max) - return invalid_len_max(bs, len, max, "array size", where); + return invalid_len_max(bs, len, max, "array size", G_STRFUNC); if (len) { - if (!expect(bs, len, where)) + if (!expect(bs, len, G_STRFUNC)) return FALSE; memcpy(ptr, bs->rptr, len); @@ -830,27 +827,26 @@ * * @return TRUE if OK. */ -gboolean -bstr_read_ule64(bstr_t *bs, guint64 *pv) +bool +bstr_read_ule64(bstr_t *bs, uint64 *pv) { - static const char where = "bstr_read_ule64"; - guint64 value = 0; - guint8 shift = 0; - guint8 n = 0; + uint64 value = 0; + uint8 shift = 0; + uint8 n = 0; bstr_check(bs); g_assert(pv); - if (!expect(bs, 1, where)) /* Need at least one byte */ + if (!expect(bs, 1, G_STRFUNC)) /* Need at least one byte */ return FALSE; for (;;) { - guint8 byt; + uint8 byt; if (!bstr_read_u8(bs, &byt)) return FALSE; n++; if (n > 10) - return invalid_encoding(bs, "no end seen after 10 bytes", where); + return invalid_encoding(bs, "no end seen after 10 bytes", G_STRFUNC); value |= (byt & 0x7f) << shift; /* Got 7 more bits */ if (byt & 0x80) break; /* Highest bit set, end of encoding */ @@ -876,11 +872,10 @@ * * @return TRUE if OK. */ -gboolean +bool bstr_read_fixed_string(bstr_t *bs, size_t *slen, char *buf, size_t len) { - static const char where = "bstr_read_fixed_string"; - guint64 length; + uint64 length; size_t n; bstr_check(bs); @@ -888,25 +883,25 @@ g_assert(buf); g_assert(size_is_positive(len)); - if (!expect(bs, 1, where)) /* Need at least one byte */ + if (!expect(bs, 1, G_STRFUNC)) /* Need at least one byte */ return FALSE; if (!bstr_read_ule64(bs, &length)) return FALSE; if (length > MAX_INT_VAL(size_t)) - return report_error(bs, "encoded length too large", where); + return report_error(bs, "encoded length too large", G_STRFUNC); n = (size_t) length; - g_assert((guint64) n == length); /* Nothing lost by casting */ + g_assert((uint64) n == length); /* Nothing lost by casting */ if (slen != NULL) { *slen = n; } if (len < n + 1) - return report_error(bs, "buffer smaller than string", where); + return report_error(bs, "buffer smaller than string", G_STRFUNC); bufn = '\0'; /* NUL-terminate in advance */ @@ -928,30 +923,29 @@ * * @return TRUE if OK, FALSE otherwise in which case nothing is allocated. */ -gboolean +bool bstr_read_string(bstr_t *bs, size_t *slen, char **sptr) { - static const char where = "bstr_read_string"; - guint64 length; + uint64 length; size_t n; char *buf; - gboolean ok; + bool ok; bstr_check(bs); g_assert(sptr); - if (!expect(bs, 1, where)) /* Need at least one byte */ + if (!expect(bs, 1, G_STRFUNC)) /* Need at least one byte */ return FALSE; if (!bstr_read_ule64(bs, &length)) return FALSE; if (length > MAX_INT_VAL(size_t)) - return report_error(bs, "encoded length too large", where); + return report_error(bs, "encoded length too large", G_STRFUNC); n = (size_t) length; - g_assert((guint64) n == length); /* Nothing lost by casting */ + g_assert((uint64) n == length); /* Nothing lost by casting */ if (slen != NULL) { *slen = n;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/bstr.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/bstr.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Raphael Manfredi + * Copyright (c) 2008 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -55,38 +55,38 @@ * Public interface */ -bstr_t *bstr_open(const void *arena, size_t len, guint32 flags); +bstr_t *bstr_open(const void *arena, size_t len, uint32 flags); bstr_t *bstr_create(void); void bstr_close(bstr_t *); -void bstr_reset(bstr_t *, const void *arena, size_t len, guint32 flags); -gboolean bstr_has_error(const bstr_t *); +void bstr_reset(bstr_t *, const void *arena, size_t len, uint32 flags); +bool bstr_has_error(const bstr_t *); void bstr_clear_error(bstr_t *); void bstr_free(bstr_t **); const char *bstr_error(const bstr_t *); -gboolean bstr_ended(const bstr_t *bs); +bool bstr_ended(const bstr_t *bs); void bstr_trailing_error(bstr_t *bs); size_t bstr_unread_size(const bstr_t *); const void *bstr_read_base(const bstr_t *); -gboolean bstr_skip(bstr_t *, size_t count); -gboolean bstr_read(bstr_t *, void *buf, size_t count); -gboolean bstr_read_u8(bstr_t *, guint8 *pv); -gboolean bstr_read_boolean(bstr_t *, gboolean *pv); -gboolean bstr_read_le16(bstr_t *, guint16 *pv); -gboolean bstr_read_be16(bstr_t *, guint16 *pv); -gboolean bstr_read_le32(bstr_t *, guint32 *pv); -gboolean bstr_read_be32(bstr_t *, guint32 *pv); -gboolean bstr_read_be64(bstr_t *, guint64 *pv); -gboolean bstr_read_time(bstr_t *, time_t *pv); -gboolean bstr_read_float_be(bstr_t *, float *pv); -gboolean bstr_read_ipv4_addr(bstr_t *, host_addr_t *); -gboolean bstr_read_ipv6_addr(bstr_t *, host_addr_t *); -gboolean bstr_read_packed_ipv4_or_ipv6_addr(bstr_t *, host_addr_t *); -gboolean bstr_read_packed_array_u8(bstr_t *, - size_t max, void *ptr, guint8 *pr); -gboolean bstr_read_ule64(bstr_t *, guint64 *pv); -gboolean bstr_read_fixed_string(bstr_t *, size_t *slen, char *buf, size_t len); -gboolean bstr_read_string(bstr_t *, size_t *slen, char **sptr); +bool bstr_skip(bstr_t *, size_t count); +bool bstr_read(bstr_t *, void *buf, size_t count); +bool bstr_read_u8(bstr_t *, uint8 *pv); +bool bstr_read_boolean(bstr_t *, bool *pv); +bool bstr_read_le16(bstr_t *, uint16 *pv); +bool bstr_read_be16(bstr_t *, uint16 *pv); +bool bstr_read_le32(bstr_t *, uint32 *pv); +bool bstr_read_be32(bstr_t *, uint32 *pv); +bool bstr_read_be64(bstr_t *, uint64 *pv); +bool bstr_read_time(bstr_t *, time_t *pv); +bool bstr_read_float_be(bstr_t *, float *pv); +bool bstr_read_ipv4_addr(bstr_t *, host_addr_t *); +bool bstr_read_ipv6_addr(bstr_t *, host_addr_t *); +bool bstr_read_packed_ipv4_or_ipv6_addr(bstr_t *, host_addr_t *); +bool bstr_read_packed_array_u8(bstr_t *, + size_t max, void *ptr, uint8 *pr); +bool bstr_read_ule64(bstr_t *, uint64 *pv); +bool bstr_read_fixed_string(bstr_t *, size_t *slen, char *buf, size_t len); +bool bstr_read_string(bstr_t *, size_t *slen, char **sptr); #endif /* _bstr_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/buf.c
Added
@@ -0,0 +1,414 @@ +/* + * Copyright (c) 2013, 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Fix-sized buffers, for using as thread-private "static" containers. + * + * These buffers are expected to be relatively short, hence they are allocated + * via xmalloc() to benefit from the thread-private allocation pools. + * + * @author Raphael Manfredi + * @date 2013, 2015 + */ + +#include "common.h" + +#include "buf.h" + +#include "misc.h" /* For clamp_memcpy() */ +#include "str.h" +#include "thread.h" +#include "unsigned.h" /* For size_is_positive() */ +#include "walloc.h" +#include "xmalloc.h" + +#include "override.h" /* Must be the last header included */ + +#define BUF_DATA_OFFSET offsetof(struct buf, b_u.bu_data) + +/** + * Allocate a new buffer of the specified size. + */ +buf_t * +buf_new(size_t size) +{ + buf_t *b; + + g_assert(size_is_positive(size)); /* Size cannot be 0 either */ + + WALLOC0(b); + b->b_magic = BUF_MAGIC; + b->b_size = size; + b->b_u.bu_data = xmalloc(size); + + return b; +} + +/** + * Allocate a new embedded buffer of the specified size. + * The data part of the embedded buffer is zeroed. + */ +buf_t * +buf_new_embedded(size_t size) +{ + buf_t *b; + + g_assert(size_is_positive(size)); /* Size cannot be 0 either */ + + b = xmalloc0(BUF_DATA_OFFSET + size); + b->b_magic = BUF_MAGIC_EMBEDDED; + b->b_size = size; + + return b; +} + +/** + * Free buffer. + */ +static void +buf_free(buf_t *b) +{ + buf_check(b); + g_assert_log(b->b_magic != BUF_MAGIC_PRIVATE, + "%s(): attempting to free thread-private buffer %p", + G_STRFUNC, b); + g_assert_log(b->b_magic != BUF_MAGIC_STATIC, + "%s(): attempting to free buffer %p wrapping arena %p", + G_STRFUNC, b, buf_data(b)); + + if (buf_is_embedded(b)) { + b->b_magic = 0; + xfree(b); + } else { + XFREE_NULL(b->b_u.bu_data); + b->b_magic = 0; + WFREE(b); + } +} + +/** + * Free buffer and nullify its pointer. + */ +void +buf_free_null(buf_t **b_ptr) +{ + buf_t *b = *b_ptr; + + if (b != NULL) { + buf_free(b); + *b_ptr = NULL; + } +} + +/** + * Reclaim a thread-private buffer when the thread is exiting. + */ +static void +buf_private_reclaim(void *data, void *unused) +{ + buf_t *b = data; + + (void) unused; + + buf_check(b); + g_assert(BUF_MAGIC_PRIVATE == b->b_magic); + + b->b_magic = BUF_MAGIC_EMBEDDED; + buf_free(b); +} + + +/** + * Get a thread-private buffer attached to the specified key. + * + * If the buffer already existed in the thread for this key, it is returned, + * and the size parameter is ignored. + * + * Otherwise, a new buffer is created, zeroed, and attached to the key. + * + * A typical usage of this routine is to make a routine returning static + * data thread-safe: + * + * const char * + * routine(int arg) + * { + * buf_t *b = buf_private(G_STRFUNC, 10); + * char *p = buf_data(b); // the "static" buffer, on the heap + * size_t n; + * + * n = transfer_to_buffer(arg, p); // returns amount of chars + * g_assert(n < buf_size(b)); // allow trailing NUL + * return p; // the private copy for this thread + * } + * + * @param key the key to use to identify this string + * @param size length of the data buffer + * + * @note + * The buffer will be reclaimed automatically when the thread exits and its + * pointer should not be given to foreign threads but used solely in the + * context of the thread. This applies to the buffer object and its data. + * + * @return a buffer object dedicated to the calling thread, which is zeroed + * initially. + */ +buf_t * +buf_private(const void *key, size_t size) +{ + buf_t *b; + + b = thread_private_get(key); + + if G_LIKELY(b != NULL) { + g_assert(BUF_MAGIC_PRIVATE == b->b_magic); + return b; + } + + /* + * Allocate a new buffer and declare it as a thread-private variable + * with an associated free routine. + */ + + b = buf_new_embedded(size); + b->b_magic = BUF_MAGIC_PRIVATE; /* Prevents accidental free */ + + thread_private_add_extended(key, b, buf_private_reclaim, NULL); + + return b; +} + +/** + * Resize buffer to the specified size. + * + * When the new size is larger, the extra data in the buffer is zeroed. + * + * @param b the buffer to resize + * @param size the new desired buffer size + * + * @return the new buffer, since the address can change due to reallocation + * when the buffer is embedded. + */ +static buf_t * +buf_resize_internal(buf_t *b, size_t size) +{ + size_t old_size = b->b_size; + char *p; + + g_assert(size_is_positive(size)); /* Implies `size' cannot be 0 */ + + if (buf_is_embedded(b)) { + b = xrealloc(b, BUF_DATA_OFFSET + size); + p = (char *) b->b_u.bu_edata; + } else { + p = b->b_u.bu_data = xrealloc(b->b_u.bu_data, size); + } + + b->b_size = size; + if (old_size < size) + memset(p + old_size, 0, size - old_size); + + return b; +} + +/** + * Resize buffer to the specified size. + * + * When the new size is larger, the extra data in the buffer is zeroed. + * + * @param b the buffer to resize + * @param size the new desired buffer size + * + * @return the new buffer, since the address can change due to reallocation + * when the buffer is embedded. + */ +buf_t * +buf_resize(buf_t *b, size_t size) +{ + buf_check(b); + g_assert(BUF_MAGIC_PRIVATE != b->b_magic); + + return buf_resize_internal(b, size); +} + +/** + * Resize private buffer attached to given key to the specified size. + * + * When the new size is larger, the extra data in the buffer is zeroed. + * + * If the buffer was not already existing for that thread, it is allocated + * transparently to the proper size. + * + * @param key the key to access the thread-private buffer + * @param size the new desired buffer size + * + * @return the new buffer, since the address can change due to reallocation + * when the buffer is embedded. + */ +buf_t * +buf_private_resize(const void *key, size_t size) +{ + buf_t *b, *nb; + + b = thread_private_get(key); + + if G_UNLIKELY(NULL == b) + return buf_private(key, size); + + g_assert(BUF_MAGIC_PRIVATE == b->b_magic); + + nb = buf_resize_internal(b, size); + if (nb != b) { + bool found; + + /* + * Since the address of the thread-private value changes, we need + * to update the data structure. We cannot simply remove the + * value because the free routine would be invoked, and the address + * just changed! + * + * We therefore remove the old free-routine we had installed, then + * remove the value from the table, then re-install the new value + * with the proper free routine. + */ + + thread_private_set_extended(key, b, NULL, NULL); + found = thread_private_remove(key); + g_assert(found); + + thread_private_add_extended(key, nb, buf_private_reclaim, NULL); + } + + return nb; +} + +/** + * Set character in buffer ``b'' at offset ``i'' to ``c'' + */ +void +buf_setc(buf_t *b, size_t i, char c) +{ + char *data; + + buf_check(b); + g_assert_log(i < buf_size(b), + "%s(): i=%zu, buf_size(b)=%zu", G_STRFUNC, i, buf_size(b)); + + data = buf_data(b); + datai = c; +} + +/** + * Get character in buffer ``b'' at offset ``i''. + */ +char +buf_getc(const buf_t *b, size_t i) +{ + char *data; + + buf_check(b); + g_assert_log(i < buf_size(b), + "%s(): i=%zu, buf_size(b)=%zu", G_STRFUNC, i, buf_size(b)); + + data = buf_data(b); + return datai; +} + +/** + * Copy data into buffer. + * + * @param b the buffer to which data is copied + * @param src data source + * @param len length of data source, in bytes + * + * @return the amount of bytes copied. + */ +size_t +buf_copyin(buf_t *b, const void *src, size_t len) +{ + buf_check(b); + + return clamp_memcpy(buf_data(b), b->b_size, src, len); +} + +/** + * A regular sprintf() into the buffer, without fear of overflow. + * + * @return the amount of formatted chars. + */ +size_t +buf_printf(buf_t *b, const char *fmt, ...) +{ + va_list args; + size_t n; + + va_start(args, fmt); + n = str_vbprintf(buf_data(b), buf_size(b), fmt, args); + va_end(args); + + return n; +} + +/** + * A regular sprintf() into the buffer, without fear of overflow. + * + * @return the amount of formatted chars. + */ +size_t +buf_vprintf(buf_t *b, const char *fmt, va_list args) +{ + return str_vbprintf(buf_data(b), buf_size(b), fmt, args); +} + +/** + * Append formatted string to previous string in fix-sized buffer. + * + * @return the amount of formatted chars. + */ +size_t +buf_catf(buf_t *b, const char *fmt, ...) +{ + va_list args; + size_t n; + + va_start(args, fmt); + n = str_vbcatf(buf_data(b), buf_size(b), fmt, args); + va_end(args); + + return n; +} + +/** + * Append formatted string to previous string in fix-sized buffer. + * + * @return the amount of formatted chars. + */ +size_t +buf_vcatf(buf_t *b, const char *fmt, va_list args) +{ + return str_vbcatf(buf_data(b), buf_size(b), fmt, args); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/buf.h
Added
@@ -0,0 +1,151 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Fix-sized buffers, for using as thread-private "static" containers. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#ifndef _buf_h_ +#define _buf_h_ + +#include "unsigned.h" /* For size_is_positive()) */ + +/* + * The buffer structure is public to allow static buffer objects. + */ + +#define BUF_MAGIC_MASK 0xffffff00 /* Leading 24 bits set */ +#define BUF_MAGIC_VAL 0x00e72800 /* Leading 24 bits significant */ + +#define BUF_MAGIC_EMBMASK 0xfffffff0 /* Leading 28 bits set */ +#define BUF_MAGIC_EMBVAL 0x00e72860 /* Leading 28 bits set */ + +enum buf_magic { + BUF_MAGIC = BUF_MAGIC_VAL + 0xc4, + BUF_MAGIC_STATIC = BUF_MAGIC_VAL + 0xf1, + BUF_MAGIC_EMBEDDED = BUF_MAGIC_VAL + 0x6b, + BUF_MAGIC_PRIVATE = BUF_MAGIC_VAL + 0x68 +}; + +/* + * A fix-sized buffer description. + */ +typedef struct buf { + enum buf_magic b_magic; + size_t b_size; /**< Available data size (NOT total size) */ + union { + char bu_edata1; /**< Where data start (embedded data) */ + char *bu_data; /**< Data pointer */ + } b_u; +} buf_t; + +static inline void +buf_check(const struct buf * const b) +{ + g_assert(b != NULL); + g_assert(BUF_MAGIC_VAL == (b->b_magic & BUF_MAGIC_MASK)); +} + +/** + * Initialize buffer structure with pre-allocated data arena. + * + * This allows using formtting routines without having to pass both + * the buffer and its size separately, thereby limiting the potential + * for mistakes. + * + * @param b the buffer structure to initialize + * @param arena the data arena start + * @param size the size of the supplied arena, in bytes + * + * @return its parameter b, as a convenience. + */ +static inline buf_t * +buf_init(buf_t *b, void *arena, size_t size) +{ + g_assert(arena != NULL); + g_assert(size_is_positive(size)); + b->b_magic = BUF_MAGIC_STATIC; + b->b_size = size; + b->b_u.bu_data = arena; + + return b; +} + +/** + * @return the physical size of the data buffer. + */ +static inline size_t +buf_size(const buf_t *b) +{ + buf_check(b); + return b->b_size; +} + +/** + * Does buffer have embedded data? + */ +static inline bool +buf_is_embedded(const buf_t *b) +{ + return b != NULL && BUF_MAGIC_EMBVAL == (BUF_MAGIC_EMBMASK & b->b_magic); +} + +/** + * @return the physical data buffer. + */ +static inline void * +buf_data(const buf_t *b) +{ + buf_check(b); + return buf_is_embedded(b) ? (char *) b->b_u.bu_edata : b->b_u.bu_data; +} + +/* + * Public interface. + */ + +buf_t *buf_new(size_t size); +buf_t *buf_new_embedded(size_t size); +buf_t *buf_private(const void *key, size_t size); +void buf_free_null(buf_t **b_ptr); + +buf_t *buf_resize(buf_t *b, size_t size); +buf_t *buf_private_resize(const void *key, size_t size); + +void buf_setc(buf_t *b, size_t i, char c); +char buf_getc(const buf_t *b, size_t i); +size_t buf_copyin(buf_t *b, const void *src, size_t len); + +size_t buf_printf(buf_t *b, const char *fmt, ...) G_PRINTF(2, 3); +size_t buf_vprintf(buf_t *b, const char *fmt, va_list args); +size_t buf_catf(buf_t *b, const char *fmt, ...) G_PRINTF(2, 3); +size_t buf_vcatf(buf_t *b, const char *fmt, va_list args); + +#endif /* _buf_h_ */ +
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/chi2.c
Added
@@ -0,0 +1,142 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Chi-squared statistics. + * + * This is based on a public implementation of the Chi-squared distribution + * by Jacob Wells (released July 31st 2012), which was adapted for inclusion + * in this library. + * + * Reference material: + * + * http://en.wikipedia.org/wiki/Regularized_Gamma_function + * http://en.wikipedia.org/wiki/Chi-squared_distribution + * + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#ifdef I_MATH +#include <math.h> +#endif /* I_MATH */ + +#include "chi2.h" + +static double +KM(double s, double z) +{ + double sum = 1.0, num = 1.0, denom = 1.0; + int i; + + /* Make the power series converge */ + + for (i = 0; i < 200; i++) { + num *= z; + denom *= ++s; + sum += (num / denom); + } + + return sum; +} + +/** + * Computes the lower Incomplete Gamma Function. + * + * The computation is slow because it involves a power series that needs to + * be developped sufficiently to ensure convergence. + */ +static double +lower_igf(double s, double z) +{ + double c; + + if (z < 0.0) + return 0.0; + + c = 1.0 / s; + c *= pow(z, s) * exp(-z); + + return c * KM(s, z); +} + +/** + * Approximates the Gamma function with Stirling's formula. + */ +static double +approx_gf(double z) +{ + const double INV_E = 0.36787944117144232; /* 1.0 / e */ + const double TWO_PI = 6.2831853071795865; /* 2.0 * PI */ + const double INV_Z = 1.0 / z; + double d; + + /* + * gf(z) ~ sqrt(2*PI/z) * (1/e * (z + (1 / (12z - 1/10z))))^z + */ + + d = 0.1 * INV_Z; + d = 1.0 / ((12 * z) - d); + d = (d + z) * INV_E; + d = pow(d, z); + d *= sqrt(TWO_PI * INV_Z); + + return d; +} + +/** + * Computes the value of the chi-squared cumulative distribution (one-tail). + * + * When conducting a chi-squared fitness test, the critical value is the sum of + * (Oi - Ei)^2 / Ei, where Oi is the set of observed frequencies and Ei the set + * of expected frequencies. + * + * @param freedom degrees of freedom + * @param critical critical value for chi-squared test + * + * @return the one-tail cumulative distribution of the chi-squared probability + * density function, from the critical value up to infinity. + */ +double +chi2_upper_tail(int freedom, double critical) +{ + double k, x; + + if G_UNLIKELY(critical < 0.0 || freedom < 1) + return 0.0; + + if (2 == freedom) + return exp(-0.5 * critical); + + x = critical * 0.5; + k = freedom * 0.5; + + return 1.0 - lower_igf(k, x) / approx_gf(k); +} + +/* vi: set ts=4: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/chi2.h
Added
@@ -0,0 +1,47 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Chi-squared statistics. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _chi2_h_ +#define _chi2_h_ + +#include "common.h" + +/* + * Public interface. + */ + +double chi2_upper_tail(int freedom, double critical); + +#endif /* _chi2_h_ */ + +/* vi: set ts=4: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/ckalloc.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/ckalloc.c
Changed
@@ -55,7 +55,7 @@ #define CKALLOC_ALIGNBYTES MEM_ALIGNBYTES #define CKALLOC_MASK (CKALLOC_ALIGNBYTES - 1) #define ckalloc_round(s) \ - ((gulong) (((gulong) (s) + CKALLOC_MASK) & ~CKALLOC_MASK)) + ((ulong) (((ulong) (s) + CKALLOC_MASK) & ~CKALLOC_MASK)) enum ckhunk_magic { CKHUNK_MAGIC = 0x09b1f3c2 }; @@ -82,7 +82,7 @@ /** * Is chunk read-only? */ -gboolean +bool ck_is_readonly(ckhunk_t *ck) { ckhunk_check(ck); @@ -100,7 +100,7 @@ * @return a new chunk allocator object. */ static ckhunk_t * -ckinit(size_t size, size_t reserved, gboolean leaking) +ckinit(size_t size, size_t reserved, bool leaking) { void *arena; ckhunk_t *ck; @@ -111,7 +111,7 @@ g_assert(size_is_positive(size)); g_assert(size_is_non_negative(reserved)); - arena = leaking ? vmm_alloc(size) : vmm_alloc_not_leaking(size); + arena = leaking ? vmm_core_alloc(size) : vmm_core_alloc_not_leaking(size); ck = arena; ZERO(ck); ck->magic = CKHUNK_MAGIC; @@ -185,14 +185,14 @@ /** * @return whether someething has been allocated. */ -gboolean +bool ck_used(const ckhunk_t *ck) { ckhunk_check(ck); if (NULL == ck) return FALSE; - + return ck->avail != ck->arena + ckalloc_round(sizeof(struct ckhunk)); } @@ -301,7 +301,7 @@ * @return pointer to allocated memory, NULL if memory cannot be allocated. */ static void * -ckalloc(ckhunk_t *ck, size_t len, gboolean critical) +ckalloc(ckhunk_t *ck, size_t len, bool critical) { void *p = NULL; sigset_t set; @@ -310,12 +310,13 @@ ckhunk_check(ck); g_assert(size_is_positive(len)); - g_assert(!ck->read_only); if (NULL == ck) return NULL; - /** + g_assert(!ck->read_only); + + /* * FIXME: Don't increase the alignment, a single byte allocation * does not have be aligned by MEM_ALIGN_BYTES. */ @@ -572,7 +573,7 @@ * possible to shrink it or if the specified size was larger than the * actual size. */ -gboolean +bool ck_shrink(ckhunk_t *ck, size_t size) { size_t nsize, used; @@ -625,7 +626,7 @@ * * @return TRUE of OK, FALSE on error. */ -gboolean +bool ck_memcpy(ckhunk_t *ck, void *dest, const void *src, size_t size) { void *chunk_start;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/ckalloc.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/ckalloc.h
Changed
@@ -47,7 +47,7 @@ void ck_destroy_null(ckhunk_t **ck_ptr); void *ck_alloc(ckhunk_t *ck, size_t len); void *ck_alloc_critical(ckhunk_t *ck, size_t len); -gboolean ck_used(const ckhunk_t *ck); +bool ck_used(const ckhunk_t *ck); void *ck_save(const ckhunk_t *ck); void ck_restore(ckhunk_t *ck, void *saved); void ck_free_all(ckhunk_t *ck); @@ -58,9 +58,9 @@ void *ck_alloc_readonly(ckhunk_t *ck, size_t len); void *ck_copy_readonly(ckhunk_t *ck, const void *p, size_t size); char *ck_strdup_readonly(ckhunk_t *ck, const char *str); -gboolean ck_shrink(ckhunk_t *ck, size_t size); -gboolean ck_memcpy(ckhunk_t *ck, void *dest, const void *src, size_t size); -gboolean ck_is_readonly(ckhunk_t *ck); +bool ck_shrink(ckhunk_t *ck, size_t size); +bool ck_memcpy(ckhunk_t *ck, void *dest, const void *src, size_t size); +bool ck_is_readonly(ckhunk_t *ck); #endif /* _ckalloc_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/cmwc.c
Added
@@ -0,0 +1,547 @@ +/* + * Copyright (c) 2003 George Marsaglia (posting in sci.math) + * + * Adaptated and enhanced for inclusion in gtk-gnutella by Raphael Manfredi. + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Complimentary Multiply With Carry (CMWC) pseudo random number generator. + * + * This is a PRNG with a very large period (about 2**131086 - 1) with a + * 16388-byte internal state. + * + * Here is what the author wrote about it in sci.math: + + * CMWC4096 "provides more than 10**39460 base-b digits in the expansion of + * (p-1)/p, where p is the prime p = 18782 * b**4096 + 1, b = 2**32 - 1. + * Those base-b 'digits' are returned in reverse order from a random starting + * point determined by the random choice of the initial values in Q4096 + * and c". + * + * This PRNG with a large internal state is useful when generating permutations + * on large arrays, since we are therefore able to cover more space in the set + * of all possible permutations (the initial state of the PRNG governs which + * permutation will be picked among the set of these permutations, which for + * a set of n items is n!, a number that gets huge very quickly). + * + * @author George Marsaglia + * @date 2003 + * @author Raphael Manfredi + * @date 2014 + */ + +#include "common.h" + +#include "cmwc.h" + +#include "arc4random.h" +#include "endian.h" +#include "entropy.h" +#include "omalloc.h" +#include "once.h" +#include "random.h" +#include "spinlock.h" +#include "thread.h" +#include "walloc.h" + +/** + * The internal state of CMWC4096 is 4096 32-bit words (plus one 32-bit word, + * the carry word, not counted here). + */ +#define CMWC_STATE_SIZE 4096 + +/* + * Initial amount of random values to discard after initialization. + */ +#define CMWC_STATE_DISCARD (4 * CMWC_STATE_SIZE) + +/* + * Internal state for the CMWC PRNG. The user can keep multiple state + * structures around as a way of generating multiple streams of random + * numbers. + */ + +enum cmwc_state_magic { CMWC_STATE_MAGIC = 0x10cd2a91 }; + +struct cmwc_state { + enum cmwc_state_magic magic; + uint32 QCMWC_STATE_SIZE; /* Current state */ + uint32 c; /* The 32-bit carry word */ + uint32 i; /* Internal index within the state */ + spinlock_t lock; /* Lock for thread-safe accesses */ +}; + +static void +cmwc_state_check(const struct cmwc_state * const cs) +{ + g_assert(cs != NULL); + g_assert(CMWC_STATE_MAGIC == cs->magic); +} + +#define STATE_LOCK(c) spinlock_hidden(&(c)->lock) +#define STATE_UNLOCK(c) spinunlock_hidden(&(c)->lock) + +#define CMWC_STATE_MASK (CMWC_STATE_SIZE - 1) + +#define CMWC_MULT 18782 + +/** + * Generate a new 32-bit random number using the supplied CMWC state. + * + * This generator has an approximative period of 2**131086 - 1. + * + * (Routine adapted by RAM from code posted by George Marsaglia on sci.math) + */ +static inline uint32 +cmwc_rand_internal(cmwc_state_t *cs) +{ + uint64 t; + uint32 x; + + cs->i = (cs->i + 1) & CMWC_STATE_MASK; + t = (uint64) CMWC_MULT * cs->Qcs->i + cs->c; + cs->c = t >> 32; + x = t + cs->c; + + if (x < cs->c) { + x++; + cs->c++; + } + + return cs->Qcs->i = 0xfffffffeU - x; +} + +/* + * Discard the first CMWC_STATE_DISCARD values to make sure the internal + * state is random enough. + */ +static void +cmwc_state_discard(cmwc_state_t *cs) +{ + unsigned i; + + for (i = 0; i < CMWC_STATE_DISCARD; i++) { + (void) cmwc_rand_internal(cs); + } +} + +/** + * Initialize the state with random values drawn from specified PRNG function. + * + * @param rf random function to initialize the state + * @param cs the CMWC state we want to initialize + */ +static void +cmwc_seed_with(random_fn_t rf, cmwc_state_t *cs) +{ + if (NULL == rf) + rf = entropy_random; + + random_bytes_with(rf, &cs->Q, sizeof cs->Q); + cs->c = random_upto(rf, CMWC_MULT - 1); + cs->i = CMWC_STATE_SIZE - 1; + cmwc_state_discard(cs); + spinlock_init(&cs->lock); +} + +/** + * Allocate a new state, initialized randomly using supplied random function. + * + * If the random function is NULL, the state is initialized with the strong + * but slow entropy_random(). + * + * @param rf random function to initialize the state + * + * @return a new state that can be freed with cmwc_state_free_null(). + */ +cmwc_state_t * +cmwc_state_new(random_fn_t rf) +{ + cmwc_state_t *cs; + + WALLOC0(cs); + cs->magic = CMWC_STATE_MAGIC; + + cmwc_seed_with(rf, cs); + return cs; +} + +/** + * Clone CMWC state, allowing replay of a random number generation sequence. + * + * @param cs the CMWC state to clone + * + * @return a copy of the state which can be freed with cmwc_state_free_null(). + */ +cmwc_state_t * +cmwc_state_clone(const cmwc_state_t *cs) +{ + cmwc_state_t *ccs, *wcs; + + cmwc_state_check(cs); + + wcs = deconstify_pointer(cs); /* Only hidden state is changed */ + + STATE_LOCK(wcs); + ccs = WCOPY(wcs); + STATE_UNLOCK(wcs); + + spinlock_init(&ccs->lock); /* Was locked when cloned */ + + return ccs; +} + +/** + * Free CMWC state and nullify its pointer. + */ +void +cmwc_state_free_null(cmwc_state_t **cs_ptr) +{ + cmwc_state_t *cs = *cs_ptr; + + if (cs != NULL) { + cmwc_state_check(cs); + spinlock_destroy(&cs->lock); + WFREE(cs); + *cs_ptr = NULL; + } +} + +/** + * Distribute random 32-bit words over the state context. + */ +static void +cmwc_state_patch(cmwc_state_t *cs, const void *data, size_t len) +{ + size_t n; + + g_assert(len <= sizeof cs->Q); + g_assert(0 == (len & 0x3)); /* Multiple of 4 */ + + for (n = 0; n < N_ITEMS(cs->Q) && len != 0; n++, len -= 4) { + cs->Qn ^= peek_be32(data); + data = const_ptr_add_offset(data, 4); + } +} + +/** + * Merge randomness to the CMWC state. + */ +static void +cmwc_state_merge_random(cmwc_state_t *cs, const void *data, size_t len) +{ + STATIC_ASSERT(0 == (0x3 & sizeof cs->Q)); + + while (len >= 4) { + size_t n = (MIN(len, sizeof cs->Q) >> 2) << 2; /* Multiple of 4 */ + cmwc_state_patch(cs, data, n); + data = const_ptr_add_offset(data, n); + len -= n; + } + + if (len < 4) { + char buf4; + size_t i; + + ZERO(&buf); + for (i = 0; i < len; i++) { + bufi = ((char *) data)i; + } + + cmwc_state_patch(cs, buf, sizeof buf); + } + + /* + * After changing the state, perform iterations whose aim it is to spread + * the bits we just added, in case they are not too random. + */ + + cmwc_state_discard(cs); +} + +/** + * Generate a new 64-bit random number using the supplied CMWC state. + */ +static uint64 +cmwc_rand64_internal(cmwc_state_t *cs) +{ + return ((uint64) cmwc_rand_internal(cs) << 32) | cmwc_rand_internal(cs); +} + +/** + * Generate a random number in the range 0 to 2^32-1, inclusive, working + * from a given state vector. + * + * @param cs state for the PRNG + * + * @return a 32-bit random number + */ +uint32 +cmwc_state_rand(cmwc_state_t *cs) +{ + cmwc_state_check(cs); + + return cmwc_rand_internal(cs); +} + +/** + * Generate a random number in the range 0 to 2^64-1, inclusive, working + * from a given state vector. + * + * @param cs state for the PRNG + * + * @return a 64-bit random number + */ +uint64 +cmwc_state_rand64(cmwc_state_t *cs) +{ + cmwc_state_check(cs); + + return cmwc_rand64_internal(cs); +} + +/** + * Add randomness to the CMWC state. + * + * @param cs the CMWC state to which we add randomness + * @param data the start of the random data buffer + * @param len the amount of random bytes to process in the buffer + */ +void +cmwc_state_addrandom(cmwc_state_t *cs, const void *data, size_t len) +{ + cmwc_state_check(cs); + + cmwc_state_merge_random(cs, data, len); +} + +/** + * Generate a random number in the range 0 to 2^32-1, inclusive, working + * from a given state vector. + * + * @param cs state for the PRNG, locked before access + * + * @return a 32-bit random number + */ +uint32 +cmwc_state_lock_rand(cmwc_state_t *cs) +{ + uint32 rn; + + cmwc_state_check(cs); + + STATE_LOCK(cs); + rn = cmwc_rand_internal(cs); + STATE_UNLOCK(cs); + + return rn; +} + +/** + * Generate a random number in the range 0 to 2^64-1, inclusive, working + * from a given state vector. + * + * @param cs state for the PRNG, locked before access + * + * @return a 64-bit random number + */ +uint64 +cmwc_state_lock_rand64(cmwc_state_t *cs) +{ + uint64 rn; + + cmwc_state_check(cs); + + STATE_LOCK(cs); + rn = cmwc_rand64_internal(cs); + STATE_UNLOCK(cs); + + return rn; +} + +/** + * Add randomness to the CMWC state, locked. + * + * @param cs the CMWC state to which we add randomness + * @param data the start of the random data buffer + * @param len the amount of random bytes to process in the buffer + */ +void +cmwc_state_lock_addrandom(cmwc_state_t *cs, const void *data, size_t len) +{ + cmwc_state_check(cs); + + STATE_LOCK(cs); + cmwc_state_merge_random(cs, data, len); + STATE_UNLOCK(cs); +} + +static cmwc_state_t cmwc_default; +static once_flag_t cmwc_seeded; + +/** + * Seed the default state, once. + */ +static void +cmwc_default_seed(void) +{ + cmwc_default.magic = CMWC_STATE_MAGIC; + cmwc_seed_with(NULL, &cmwc_default); +} + +/** + * Generate a random number in the range 0 to 2^32-1, inclusive. + * + * @return a 32-bit random number + */ +uint32 +cmwc_rand(void) +{ + ONCE_FLAG_RUN(cmwc_seeded, cmwc_default_seed); + + return cmwc_state_lock_rand(&cmwc_default); +} + +/** + * Generate a random number in the range 0 to 2^64-1, inclusive. + * + * @return a 64-bit random number + */ +uint64 +cmwc_rand64(void) +{ + ONCE_FLAG_RUN(cmwc_seeded, cmwc_default_seed); + + return cmwc_state_lock_rand64(&cmwc_default); +} + +/** + * Add randomness to the default (shared) CMWC state. + * + * @param data the start of the random data buffer + * @param len the amount of random bytes to process in the buffer + */ +void +cmwc_addrandom(const void *data, size_t len) +{ + ONCE_FLAG_RUN(cmwc_seeded, cmwc_default_seed); + + cmwc_state_lock_addrandom(&cmwc_default, data, len); +} + +static once_flag_t cmwc_key_inited; +static thread_key_t cmwc_key = THREAD_KEY_INIT; + +/** + * Create the thread-local random pool key, once. + */ +static void +cmwc_key_init(void) +{ + if (-1 == thread_local_key_create(&cmwc_key, THREAD_LOCAL_KEEP)) + s_error("cannot initialize CMWC random pool key: %m"); +} + +/** + * Get suitable thread-local random pool. + */ +static cmwc_state_t * +cmwc_pool(void) +{ + cmwc_state_t *cs; + + ONCE_FLAG_RUN(cmwc_key_inited, cmwc_key_init); + + cs = thread_local_get(cmwc_key); + + if G_UNLIKELY(NULL == cs) { + /* + * The random pool is kept for each created thread, never freed. + */ + + OMALLOC0(cs); + cs->magic = CMWC_STATE_MAGIC; + cmwc_seed_with(arc4random, cs); + thread_local_set(cmwc_key, cs); + } + + return cs; +} + +/** + * Generate a random number in the range 0 to 2^32-1, inclusive. + * + * This routine uses a thread-private random pool and is mostly a + * lock-free execution path (about 25% faster than cmwc_rand() with locks) + * + * @return a 32-bit random number + */ +uint32 +cmwc_thread_rand(void) +{ + return cmwc_rand_internal(cmwc_pool()); +} + +/** + * Generate a random number in the range 0 to 2^64-1, inclusive. + * + * This routine uses a thread-private random pool and is mostly a + * lock-free execution path. + * + * @return a 64-bit random number + */ +uint64 +cmwc_thread_rand64(void) +{ + return cmwc_rand64_internal(cmwc_pool()); +} + +/** + * Add randomness to the local CMWC state. + * + * @param cs the CMWC state to which we add randomness + * @param data the start of the random data buffer + * @param len the amount of random bytes to process in the buffer + */ +void +cmwc_thread_addrandom(const void *data, size_t len) +{ + cmwc_state_merge_random(cmwc_pool(), data, len); +} + +/** + * @return a list of thread IDs using a thread-local CMWC pool, which must + * be freed with pslist_free(). + */ +pslist_t * +cmwc_users(void) +{ + ONCE_FLAG_RUN(cmwc_key_inited, cmwc_key_init); + + return thread_local_users(cmwc_key); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/cmwc.h
Added
@@ -0,0 +1,68 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Complimentary Multiply With Carry (CMWC) pseudo random number generator. + * + * @author Raphael Manfredi + * @date 2014 + */ + +#ifndef _cmwc_h_ +#define _cmwc_h_ + +struct cmwc_state; +typedef struct cmwc_state cmwc_state_t; + +/* + * Public interface. + */ + +cmwc_state_t *cmwc_state_new(random_fn_t rf); +cmwc_state_t *cmwc_state_clone(const cmwc_state_t *cs); +void cmwc_state_free_null(cmwc_state_t **cs_ptr); + +uint32 cmwc_state_rand(cmwc_state_t *cs); +uint64 cmwc_state_rand64(cmwc_state_t *cs); +void cmwc_state_addrandom(cmwc_state_t *cs, const void *data, size_t len); + +uint32 cmwc_state_lock_rand(cmwc_state_t *cs); +uint64 cmwc_state_lock_rand64(cmwc_state_t *cs); +void cmwc_state_lock_addrandom(cmwc_state_t *cs, const void *data, size_t len); + +uint32 cmwc_rand(void); +uint64 cmwc_rand64(void); +void cmwc_addrandom(const void *data, size_t len); + +uint32 cmwc_thread_rand(void); +uint64 cmwc_thread_rand64(void); +void cmwc_thread_addrandom(const void *data, size_t len); + +struct pslist *cmwc_users(void); + +#endif /* _cmwc_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/cobs.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/cobs.c
Changed
@@ -56,7 +56,7 @@ char *out; char *o; /* Iterates over output */ char *cp; /* Where we'll write the code length */ - guchar code, last_code = 0; + uchar code, last_code = 0; iovec_t *xiov; int i; @@ -134,8 +134,7 @@ { iovec_t iov; - iovec_set_base(&iov, buf); - iovec_set_len(&iov, len); + iovec_set(&iov, buf, len); *retlen = len; return cobs_encodev(&iov, 1, retlen); @@ -148,7 +147,7 @@ * @returns whether the input was valid COBS encoding. * The length of the decoded buffer is returned in `retlen'. */ -gboolean +bool cobs_decode_into(const char *buf, size_t len, char *out, size_t outlen, size_t *retlen) { @@ -156,7 +155,7 @@ const char *oend = &outoutlen; /* First byte off buffer */ const char *p; char *o; - guchar last_code = 0; + uchar last_code = 0; g_assert(NULL != buf); g_assert(len > 0); @@ -169,7 +168,7 @@ */ for (p = buf, o = out; p != end && o != oend; /* empty */) { - guchar code; + uchar code; last_code = code = *p++; @@ -213,7 +212,7 @@ /** * Check whether supplied buffer forms a valid COBS encoding. */ -gboolean +bool cobs_is_valid(const char *buf, size_t len) { const char *p, *end = &buflen; /* First byte off buffer */ @@ -222,7 +221,7 @@ g_assert(len > 0); for (p = buf; p != end; /* empty */) { - guchar code; + uchar code; if (0 == (code = *p++)) return FALSE; /* There cannot be any NUL */ @@ -247,7 +246,7 @@ * encoding. The length of the decoded buffer is in `retlen'. */ char * -cobs_decode(char *buf, size_t len, size_t *retlen, gboolean inplace) +cobs_decode(char *buf, size_t len, size_t *retlen, bool inplace) { char *out; @@ -282,7 +281,7 @@ * @param len length of supplied buffer */ void -cobs_stream_init(cobs_stream_t *cs, gpointer data, size_t len) +cobs_stream_init(cobs_stream_t *cs, void *data, size_t len) { g_assert(len != 0); g_assert(data != NULL); @@ -307,8 +306,8 @@ * * @return TRUE if OK, FALSE if we cannot put the data any more. */ -gboolean -cobs_stream_write(cobs_stream_t *cs, gpointer data, size_t len) +bool +cobs_stream_write(cobs_stream_t *cs, void *data, size_t len) { char *p = data; const char *end = &plen; @@ -356,7 +355,7 @@ * @return the final length of the stream on success, 0 on error. */ size_t -cobs_stream_close(cobs_stream_t *cs, gboolean *saw_nul) +cobs_stream_close(cobs_stream_t *cs, bool *saw_nul) { g_assert(cobs_stream_is_valid(cs)); @@ -400,7 +399,8 @@ /** * Check whether the stream descriptor is valid, for assertions. */ -gboolean cobs_stream_is_valid(cobs_stream_t *cs) +bool +cobs_stream_is_valid(cobs_stream_t *cs) { if (NULL == cs) return FALSE;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/cobs.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/cobs.h
Changed
@@ -48,10 +48,10 @@ char *end; /**< First char beyond output buffer */ char *o; /**< Where next non-NUL data will be written */ char *cp; /**< Where we'll write the code length */ - guchar code; /**< Current code length */ - guchar last_code; /**< Last code we emitted */ - gboolean saw_nul; /**< True if we saw a NUL in the input */ - gboolean closed; /**< True if the stream has been closed */ + uchar code; /**< Current code length */ + uchar last_code; /**< Last code we emitted */ + bool saw_nul; /**< True if we saw a NUL in the input */ + bool closed; /**< True if the stream has been closed */ } cobs_stream_t; /* @@ -61,17 +61,17 @@ char *cobs_encode(char *buf, size_t len, size_t *retlen); char *cobs_encodev(iovec_t *iov, int iovcnt, size_t *retlen); -char *cobs_decode(char *buf, size_t len, size_t *retlen, gboolean inplace); -gboolean cobs_decode_into( +char *cobs_decode(char *buf, size_t len, size_t *retlen, bool inplace); +bool cobs_decode_into( const char *buf, size_t len, char *out, size_t outlen, size_t *retlen); -gboolean cobs_is_valid(const char *buf, size_t len); +bool cobs_is_valid(const char *buf, size_t len); -void cobs_stream_init(cobs_stream_t *cs, gpointer data, size_t len); -size_t cobs_stream_close(cobs_stream_t *cs, gboolean *saw_nul); -gboolean cobs_stream_write(cobs_stream_t *cs, gpointer data, size_t len); +void cobs_stream_init(cobs_stream_t *cs, void *data, size_t len); +size_t cobs_stream_close(cobs_stream_t *cs, bool *saw_nul); +bool cobs_stream_write(cobs_stream_t *cs, void *data, size_t len); void cobs_stream_invalidate(cobs_stream_t *cs); -gboolean cobs_stream_is_valid(cobs_stream_t *cs); +bool cobs_stream_is_valid(cobs_stream_t *cs); #endif /* _cobs_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/compat_gettid.c
Added
@@ -0,0 +1,79 @@ +/* + * Copyright (c) 2016 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Portable system thread ID computation. + * + * @author Raphael Manfredi + * @date 2016 + */ + +#include "common.h" + +#ifdef HAS_SYSCALL +#include <sys/syscall.h> +#endif + +#include "compat_gettid.h" + +#define THREAD_SOURCE /* For thread_self() */ +#include "thread.h" + +#include "override.h" /* Must be the last header included */ + +/** + * Get the system thread ID. + * + * This value is meant to be used by low-level system-specific calls. + * It needs to be cast back to the proper type if the native type is not + * an unsigned long. + * + * @note + * The meaning of this ID is system-specific: + * On UNIX, this can be the kernel thread ID, or the pthread_t value cast. + * On Windows, this is a thread handle. + */ +systid_t +compat_gettid(void) +{ + systid_t id; + +#if defined(HAS_SYSCALL) && defined(SYS_gettid) + id = syscall(SYS_gettid); + if ((systid_t) -1 != id) + return id; +#endif /* HAS_SYSCALL && SYS_gettid */ + +#ifdef MINGW32 + id = mingw_gettid(); +#else + id = (systid_t) thread_self(); +#endif /* MINGW32 */ + + return id; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/compat_gettid.h
Added
@@ -0,0 +1,43 @@ +/* + * Copyright (c) 2016 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Portable system thread ID computation. + * + * @author Raphael Manfredi + * @date 2016 + */ + +#ifndef _compat_gettid_h_ +#define _compat_gettid_h_ + +typedef unsigned long systid_t; + +systid_t compat_gettid(void); + +#endif /* _compat_gettid_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/compat_misc.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/compat_misc.c
Changed
@@ -41,11 +41,11 @@ #include "override.h" /* Must be the last header included */ -gboolean +bool compat_is_superuser(void) { - gboolean ret = FALSE; /* Assume luser by default */ - + bool ret = FALSE; /* Assume luser by default */ + #ifdef HAS_GETUID ret |= 0 == getuid(); #endif /* HAS_GETUID */ @@ -57,17 +57,29 @@ return ret; } -gboolean -compat_process_is_alive(pid_t pid) +/** + * Performs a kill(pid, 0), portably between UNIX and Windows. + */ +int +compat_kill_zero(pid_t pid) { #ifdef MINGW32 - return mingw_process_is_alive(pid); + return mingw_process_access_check(pid); #else - return -1 != kill(pid, 0); + return kill(pid, 0); #endif } /** + * Check whether process exists. + */ +bool +compat_process_exists(pid_t pid) +{ + return -1 != compat_kill_zero(pid) || EPERM == errno; +} + +/** * Daemonizes the current process. * * @param directory We will chdir() to this directory. A value of NULL @@ -76,7 +88,10 @@ int compat_daemonize(const char *directory) { -#ifndef MINGW32 /* FIXME MINGW32 */ +#ifdef MINGW32 + /* FIXME MINGW32 */ + (void) directory; +#else pid_t pid; int i; @@ -90,7 +105,7 @@ fflush(NULL); pid = fork(); if ((pid_t) -1 == pid) { - s_warning("fork() failed: %m"); + s_warning("%s(): fork() failed: %m", G_STRFUNC); return -1; } @@ -102,19 +117,19 @@ /* Create a new session after the first fork() */ if (0 == i && (pid_t) -1 == setsid()) { - s_warning("setsid() failed: %m"); + s_warning("%s(): setsid() failed: %m", G_STRFUNC); return -1; } } pid = getpid(); if (setpgid(0, pid)) { - s_warning("setpgid(0, %lu) failed: %m", (unsigned long) pid); + s_warning("%s(): setpgid(0, %lu) failed: %m", G_STRFUNC, (ulong) pid); return -1; } if (chdir(directory)) { - s_warning("chdir(\"%s\") failed: %m", directory); + s_warning("%s(): chdir(\"%s\") failed: %m", G_STRFUNC, directory); return -1; } @@ -140,7 +155,7 @@ g_warning("freopen() failed for stderr"); return -1; } -#endif /* !MINGW32 */ +#endif /* MINGW32 */ return 0; } @@ -159,7 +174,7 @@ const void *pattern, size_t pattern_size) { const char *next, *p, *pat; - + pat = pattern; for (p = data; NULL != p; p = next) { if (data_size < pattern_size) { @@ -175,11 +190,10 @@ return deconstify_gchar(p); } -#ifdef HAS_POSIX_FADVISE /** * See posix_fadvise(2). * - * @param fd A valid file descriptor of a regular file. + * @param fd A valid file descriptor of a regular file. * @param offset Start of range. * @param size Size of range. Zero means up to end of file but see note below. * @param hint One of the POSIX_FADVISE_* values. These CANNOT be combined. @@ -198,44 +212,48 @@ */ size = OFF_T_MAX; } +#ifdef HAS_POSIX_FADVISE posix_fadvise(fd, offset, size, hint); +#endif } + +#ifndef HAS_POSIX_FADVISE +#ifndef POSIX_FADV_SEQUENTIAL +#define POSIX_FADV_SEQUENTIAL 0 +#endif +#ifndef POSIX_FADV_RANDOM +#define POSIX_FADV_RANDOM 0 +#endif +#ifndef POSIX_FADV_NOREUSE +#define POSIX_FADV_NOREUSE 0 +#endif +#ifndef POSIX_FADV_DONTNEED +#define POSIX_FADV_DONTNEED 0 +#endif #endif /* HAS_POSIX_FADVISE */ void compat_fadvise_sequential(int fd, fileoffset_t offset, fileoffset_t size) { -#ifdef HAS_POSIX_FADVISE compat_fadvise(fd, offset, size, POSIX_FADV_SEQUENTIAL); -#else - (void) fd; - (void) offset; - (void) size; -#endif /* HAS_POSIX_FADVISE */ +} + +void +compat_fadvise_random(int fd, fileoffset_t offset, fileoffset_t size) +{ + compat_fadvise(fd, offset, size, POSIX_FADV_RANDOM); } void compat_fadvise_noreuse(int fd, fileoffset_t offset, fileoffset_t size) { -#ifdef HAS_POSIX_FADVISE compat_fadvise(fd, offset, size, POSIX_FADV_NOREUSE); -#else - (void) fd; - (void) offset; - (void) size; -#endif /* HAS_POSIX_FADVISE */ } void compat_fadvise_dontneed(int fd, fileoffset_t offset, fileoffset_t size) { -#ifdef HAS_POSIX_FADVISE compat_fadvise(fd, offset, size, POSIX_FADV_DONTNEED); -#else - (void) fd; - (void) offset; - (void) size; -#endif /* HAS_POSIX_FADVISE */ } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/compat_misc.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/compat_misc.h
Changed
@@ -37,11 +37,13 @@ #ifndef _compat_misc_h_ #define _compat_misc_h_ -gboolean compat_is_superuser(void); +bool compat_is_superuser(void); int compat_daemonize(const char *directory); -gboolean compat_process_is_alive(pid_t pid); +int compat_kill_zero(pid_t pid); +bool compat_process_exists(pid_t pid); void compat_fadvise_sequential(int fd, fileoffset_t offset, fileoffset_t size); +void compat_fadvise_random(int fd, fileoffset_t offset, fileoffset_t size); void compat_fadvise_noreuse(int fd, fileoffset_t offset, fileoffset_t size); void compat_fadvise_dontneed(int fd, fileoffset_t offset, fileoffset_t size); void *compat_memmem(const void *data, size_t data_size,
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/compat_pause.c
Added
@@ -0,0 +1,77 @@ +/* + * Copyright (c) 2008 Christian Biere + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Process suspension until a signal is received. + * + * @author Raphael Manfredi + * @date 2012 + * @author Chritian Biere + * @date 2008 + */ + +#include "common.h" + +#include "compat_pause.h" +#include "compat_sleep_ms.h" +#include "thread.h" + +#include "override.h" /* Must be the last header included */ + +/** + * Suspend process until a signal is delivered. + * + * @note + * This routine is a cancellation point. + */ +void +compat_pause(void) +{ + thread_cancel_test(); + +#if defined(HAS_SIGPROCMASK) + { + sigset_t oset; + + if (sigprocmask(SIG_BLOCK, NULL, &oset) != -1) { + sigsuspend(&oset); + } + } +#elif defined(HAS_PAUSE) + pause(); +#else /* !HAS_SIGPROCMASK && !HAS_PAUSE */ + { + for (;;) { + compat_sleep_ms(MAX_INT_VAL(unsigned)); + } + } +#endif /* HAS_SIGPROCMASK || HAS_PAUSE */ + + thread_cancel_test(); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/compat_pause.h
Added
@@ -0,0 +1,38 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Process suspension until a signal is received. + * + * @author Christian Biere + * @date 2008 + */ + +#include "common.h" + +void compat_pause(void); + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/compat_pio.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/compat_pio.c
Changed
@@ -33,18 +33,76 @@ /** * @note NOTE: - * The replacement functions do NOT restore the original file offset and they - * are NOT thread-safe. As gtk-gnutella is mono-threaded this should never be a - * problem. + * The replacement functions do NOT restore the original file offset. + * However, the routines are thread-safe. */ #include "common.h" -#include "lib/compat_pio.h" -#include "lib/iovec.h" -#include "lib/misc.h" +#include "compat_pio.h" +#include "iovec.h" +#include "misc.h" +#include "once.h" +#include "spinlock.h" +#include "xmalloc.h" -#include "lib/override.h" /* Must be the last header included */ +#include "override.h" /* Must be the last header included */ + +/* + * Determine if we need emulation of pread(), pwrite(), and friends. + */ +#if !defined(HAS_PWRITE) || !defined(HAS_PREAD) || \ + !defined(HAS_PWRITEV) || !defined(HAS_PREADV) +#define PIO_EMULATION +#endif + +/* + * If we need to emulate positionned I/Os, we need to make sure the seek() + * and the I/O operation that follows are thread-safe. To that end, we + * allocate a per-fd spinlock that will be used to ensure atomicity at the + * application level. + */ +#ifdef PIO_EMULATION +static spinlock_t *pio_locks; /* Array of spinlocks */ +static unsigned pio_capacity; /* Capacity of the spinlock array */ +static once_flag_t pio_inited; /* Whether array of spinlocks was inited */ + +/** + * Initialize the spinlock array, once. + */ +static void +pio_init_once(void) +{ + unsigned i; + + g_assert(NULL == pio_locks); + + pio_capacity = getdtablesize(); + XMALLOC_ARRAY(pio_locks, pio_capacity); + (void) NOT_LEAKING(pio_locks); + + for (i = 0; i < pio_capacity; i++) { + spinlock_init(&pio_locksi); + } +} + +static inline ALWAYS_INLINE void +PIO_LOCK(int fd) +{ + ONCE_FLAG_RUN(pio_inited, pio_init_once); + + g_assert(fd >= 0); + g_assert(UNSIGNED(fd) < pio_capacity); + + spinlock(&pio_locksfd); +} + +static inline ALWAYS_INLINE void +PIO_UNLOCK(int fd) +{ + spinunlock(&pio_locksfd); +} +#endif /* PIO_EMULATION */ /** * Write the given data to a file descriptor at the given offset. @@ -76,10 +134,15 @@ } #else /* !HAS_PWRITE */ { - if (0 != seek_to_filepos(fd, pos)) { - return -1; - } - return write(fd, data, size); + ssize_t r; + + PIO_LOCK(fd); + r = seek_to_filepos(fd, pos); + if (0 == r) + r = write(fd, data, size); + PIO_UNLOCK(fd); + + return r; } #endif /* HAS_PWRITE */ @@ -120,10 +183,16 @@ return compat_pwrite(fd, iovec_base(iov), iovec_len(iov), pos); - } else if (0 != seek_to_filepos(fd, pos)) { - return -1; } else { - return writev(fd, iov, MIN(iov_cnt, MAX_IOV_COUNT)); + ssize_t r; + + PIO_LOCK(fd); + r = seek_to_filepos(fd, pos); + if (0 == r) + r = writev(fd, iov, MIN(iov_cnt, MAX_IOV_COUNT)); + PIO_UNLOCK(fd); + + return r; } } #endif /* HAS_PWRITEV */ @@ -158,10 +227,15 @@ } #else /* !HAS_PREAD */ { - if (0 != seek_to_filepos(fd, pos)) { - return -1; - } - return read(fd, data, size); + ssize_t r; + + PIO_LOCK(fd); + r = seek_to_filepos(fd, pos); + if (0 == r) + r = read(fd, data, size); + PIO_UNLOCK(fd); + + return r; } #endif /* HAS_PREAD */ @@ -203,10 +277,16 @@ return compat_pread(fd, iovec_base(iov), iovec_len(iov), pos); - } else if (0 != seek_to_filepos(fd, pos)) { - return -1; } else { - return readv(fd, iov, MIN(iov_cnt, MAX_IOV_COUNT)); + ssize_t r; + + PIO_LOCK(fd); + r = seek_to_filepos(fd, pos); + if (0 == r) + r = readv(fd, iov, MIN(iov_cnt, MAX_IOV_COUNT)); + PIO_UNLOCK(fd); + + return r; } } #endif /* HAS_PREADV */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/compat_poll.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/compat_poll.c
Changed
@@ -34,17 +34,16 @@ #include "common.h" -#include "compat_poll.h" -#include "fd.h" /* For assertions */ - #ifdef I_SYS_SELECT #include <sys/select.h> #endif -#include "lib/fd.h" -#include "lib/log.h" +#include "compat_poll.h" +#include "fd.h" /* For assertions */ +#include "log.h" +#include "thread.h" -#include "lib/override.h" /* Must be the last header included */ +#include "override.h" /* Must be the last header included */ /* Fallback on select() if they miss poll() */ #ifndef HAS_POLL @@ -73,7 +72,7 @@ #define safety_assert(x) #endif -#ifdef HAS_SELECT +#if defined(USE_SELECT_FOR_POLL) || defined(MINGW32) static inline int is_okay_for_select(int fd) @@ -103,7 +102,7 @@ fdsi.revents = POLLERR; continue; } - + max_fd = MAX(fd, max_fd); fdsi.revents = 0; @@ -116,16 +115,13 @@ FD_SET(socket_fd(fd), &efds); } - if (timeout < 0) { - tv.tv_sec = 0; - tv.tv_usec = 0; - } else { + if (timeout >= 0) { tv.tv_sec = timeout / 1000; tv.tv_usec = (timeout % 1000) * 1000UL; } ret = select(max_fd + 1, &rfds, &wfds, &efds, timeout < 0 ? NULL : &tv); - + if (ret > 0) { n = MIN(n, FD_SETSIZE); /* POLLERR is already set above */ @@ -150,31 +146,38 @@ } return ret; } -#endif /* HAS_SELECT */ +#endif /* USE_SELECT_FOR_POLL || MINGW32 */ + /** * A wrapper for poll() that falls back to select() when poll() is missing. */ int compat_poll(struct pollfd *fds, unsigned int n, int timeout) -#ifdef USE_SELECT_FOR_POLL { - return emulate_poll_with_select(fds, n, timeout); -} + int r; + + if (timeout != 0) + thread_in_syscall_set(TRUE); + +#ifdef USE_SELECT_FOR_POLL + r = emulate_poll_with_select(fds, n, timeout); #elif defined(MINGW32) -{ /* * Only Windows versions starting at Vista have WSAPoll(), but we * know all Windows have select() under MinGW. */ if (mingw_has_wsapoll()) - return mingw_poll(fds, n, timeout); + r = mingw_poll(fds, n, timeout); else - return emulate_poll_with_select(fds, n, timeout); -} + r = emulate_poll_with_select(fds, n, timeout); #else /* !USE_SELECT_FOR_POLL */ -{ - return poll(fds, n, timeout); -} + r = poll(fds, n, timeout); #endif /* USE_SELECT_FOR_POLL */ + if (timeout != 0) + thread_in_syscall_set(FALSE); + + return r; +} + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/compat_sendfile.c
Added
@@ -0,0 +1,233 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Data transfer between file descriptors without user/kernel memory copies. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#include "common.h" + +#include "compat_sendfile.h" + +#include "compat_pio.h" +#include "fd.h" +#include "halloc.h" +#include "misc.h" +#include "stringify.h" +#include "unsigned.h" + +#include "override.h" /* Must be the last header included */ + +#define SENDFILE_BUFSIZ_MAX 65536 /* Reading buffer size */ + +/** + * Emulates sendfile() using read() and write() operations. + * + * @param out_fd the file descriptor opened for writing + * @param in_fd the file descriptor opened for reading + * @param offset input = offset where to read, output = next unread offset + * @param count amount of bytes to transfer + * + * @return the amount of bytes written to out_fd, -1 on errors with ernno set. + */ +static ssize_t +compat_sendfile_emulated(int out_fd, int in_fd, off_t *offset, size_t count) +{ + off_t start = *offset; + ssize_t r; + void *buf; + size_t bufsize, remain = count; + + bufsize = MIN(count, SENDFILE_BUFSIZ_MAX); + buf = halloc(bufsize); + + while (remain != 0) { + size_t nread = MIN(remain, bufsize); + r = compat_pread(in_fd, buf, nread, start); + if G_UNLIKELY(-1 == r) + goto failed; + if (-1 == write(out_fd, buf, r)) + goto failed; + remain -= r; + start += r; + if G_UNLIKELY(UNSIGNED(r) < nread) + break; /* Short read, probably indicates EOF */ + } + + *offset = start; + hfree(buf); + + return count - remain; + +failed: + hfree(buf); + return -1; +} + +#if defined(HAS_SENDFILE) && !defined(USE_BSD_SENDFILE) +/** + * Wrapper over Linux-compatible sendfile(). + * + * @param out_fd the file descriptor opened for writing + * @param in_fd the file descriptor opened for reading + * @param offset input = offset where to read, output = next unread offset + * @param count amount of bytes to transfer + * + * @return the amount of bytes written to out_fd, -1 on errors with ernno set. + */ +static ssize_t +compat_sendfile_linux(int out_fd, int in_fd, off_t *offset, size_t count) +{ + off_t start = *offset; + ssize_t r; + + r = sendfile(out_fd, in_fd, offset, count); + + /* + * Paranoid checks, verifying semantics are in line with what we expect. + */ + + if G_UNLIKELY(r >= 0 && *offset != start + r) { + g_assert(UNSIGNED(r) <= count); + s_carp("%s(): fixed sendfile() returned offset: " + "was set to %s instead of %s (%zu byte%s written)", + G_STRFUNC, uint64_to_string(*offset), uint64_to_string2(start + r), + r, plural(r)); + *offset = start + r; + } else if G_UNLIKELY((ssize_t) -1 == r) { + *offset = start; /* In case sendfile() touched it */ + + /* + * Before linux 2.6.33, the ``out_fd'' parameter must be a socket. + * Otherwise, sendfile() sets errno to EINVAL. + */ + + if (EINVAL == errno && !is_a_socket(out_fd)) + r = compat_sendfile_emulated(out_fd, in_fd, offset, count); + } + + return r; +} +#endif /* HAS_SENDFILE && !USE_BSD_SENDFILE */ + +#if defined(HAS_SENDFILE) && defined(USE_BSD_SENDFILE) +/** + * Wrapper over BSD-compatible sendfile(). + * + * The FreeBSD semantics for sendfile() differ from the Linux one: + * + * . FreeBSD sendfile() returns 0 on success, -1 on failure. + * . FreeBSD sendfile() returns the amount of written bytes via a parameter + * when EAGAIN. + * . FreeBSD sendfile() does not update the offset inplace. + * . FreeBSD sendfile() does not accept regular files for out_fd, only sockets. + * + * @param out_fd the file descriptor opened for writing + * @param in_fd the file descriptor opened for reading + * @param offset input = offset where to read, output = next unread offset + * @param count amount of bytes to transfer + * + * @return the amount of bytes written to out_fd, -1 on errors with ernno set. + */ +static ssize_t +compat_sendfile_bsd(int out_fd, int in_fd, off_t *offset, size_t count) +{ + fileoffset_t written = 0; + off_t start = *offset; + ssize_t r; + + r = sendfile(in_fd, out_fd, start, count, NULL, &written, 0); + + if G_UNLIKELY((ssize_t) -1 == r) { + if (is_temporary_error(errno)) + r = written > 0 ? (ssize_t) written : (ssize_t) -1; + } else { + r = count; /* Everything written, but returns 0 if OK */ + } + + if G_LIKELY(r > 0) { + *offset = start + r; + } else if (r < 0) { + switch (errno) { + case ENOBUFS: /* kernel cannot allocate an internal buffer */ + case ENOTSOCK: /* out_fd is not a socket */ + case EOPNOTSUPP: /* in_fd does not support sendfile() */ + r = compat_sendfile_emulated(out_fd, in_fd, offset, count); + break; + } + } + + return r; +} +#endif /* HAS_SENDFILE && USE_BSD_SENDFILE */ + +/** + * Transfer data between file descriptors. + * + * The signature of this routine is the one found on Linux. + * + * On FreeBSD, the sendfile() routine has a different signature and semantics + * of its parameters and returned values. They are all mapped back to Linux + * semantics. + * + * When sendfile() is not available, this routine emulates the behaviour at + * the expense of user/kernel memory copies. + * + * When sendfile() returns errors because out_fd is not a socket or in_fd + * is not a suitable file descriptor (probably because mmap() will not work + * over it -- a pipe or another non-plain file), we also emulate the behaviour + * using plain read() and write() calls. + * + * @param out_fd the file descriptor opened for writing + * @param in_fd the file descriptor opened for reading + * @param offset input = offset where to read, output = next unread offset + * @param count amount of bytes to transfer + * + * @return the amount of bytes written to out_fd, -1 on errors with ernno set. + */ +ssize_t +compat_sendfile(int out_fd, int in_fd, off_t *offset, size_t count) +{ + g_assert(is_valid_fd(out_fd)); + g_assert(is_valid_fd(in_fd)); + g_assert(offset != NULL); + g_assert(size_is_non_negative(count)); + +#ifdef HAS_SENDFILE +#ifdef USE_BSD_SENDFILE + return compat_sendfile_bsd(out_fd, in_fd, offset, count); +#else /* !USE_BSD_SENDFILE */ + return compat_sendfile_linux(out_fd, in_fd, offset, count); +#endif /* USE_BSD_SENDFILE */ +#else /* !HAS_SENDFILE */ + return compat_sendfile_emulated(out_fd, in_fd, offset, count); +#endif /* HAS_SENDFILE */ +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/compat_sendfile.h
Added
@@ -0,0 +1,36 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Data transfer between file descriptors without user/kernel memory copies. + * + * @author Raphael Manfredi + * @date 2015 + */ + +ssize_t compat_sendfile(int out_fd, int in_fd, off_t *offset, size_t count); + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/compat_setjmp.c
Added
@@ -0,0 +1,155 @@ +/* + * Copyright (c) 2016 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Compatible and portable setjmp/sigsetjmp with longjmp/siglongjmp. + * + * Portability comes from the ability for the code to use Setjmp() and + * Sigsetjmp() along with jmp_buf and sigjmp_buf freely and without worrying + * about whether the feature is actually supported on the machine. + * + * Compatibility comes with the integration of idiosyncrasies from our + * runtime: we monitor signal handlers so that we can determine whether we + * are running in one of them. Therefore, we need to track when we leave + * a signal handler through a longjmp() or siglongjmp() call. + * + * As an added benefit, we can enforce that the Setjmp() buffer be not + * reused after a longjmp() was made and that it is properly initialized + * when given to longjmp(). + * + * @author Raphael Manfredi + * @date 2016 + */ + +#define SETJMP_SOURCE /* Must not remap longjmp(), etc */ + +#include "common.h" + +#include "compat_setjmp.h" + +#include "signal.h" +#include "thread.h" + +#include "override.h" /* Must be the last header included */ + +/** + * Prepare for a setjmp(). + * + * @note + * The jmp_buf type here is not the system one but the one we redefine. + */ +void +setjmp_prep(jmp_buf env) +{ + env->stid = thread_small_id(); + env->sig_level = signal_thread_handler_level(env->stid); + env->magic = SETJMP_MAGIC; +} + +/** + * Prepare for a sigsetjmp(). + * + * @note + * The sigjmp_buf type here is not the system one but the one we redefine. + */ +void +sigsetjmp_prep(sigjmp_buf env, int savesigs) +{ + env->stid = thread_small_id(); + env->sig_level = signal_thread_handler_level(env->stid); + env->magic = SIGSETJMP_MAGIC; + +#ifndef HAS_SIGSETJMP + env->mask_saved = booleanize(savesigs); + + if (env->mask_saved) { + sigset_t old, zero; + + sigemptyset(&zero); + sigprocmask(SIG_BLOCK, &zero, &old); + env->mask = old; + } +#else + (void) savesigs; +#endif /* !HAS_SIGSETJMP */ +} + +/** + * Wrapper for the longjmp() call to restore the signal handler level. + * + * @note + * The jmp_buf type here is not the system one but the one we redefine. + */ +void +compat_longjmp(jmp_buf env, int val) +{ + uint stid = thread_small_id(); + + g_assert(env->magic != SETJMP_USED_MAGIC); + g_assert(SETJMP_MAGIC == env->magic); + g_assert(val != 0); + + g_assert_log(env->stid == stid, + "%s(): env->stid=%u {%s}, stid=%u {%s}", + G_STRFUNC, env->stid, thread_safe_id_name(env->stid), + stid, thread_safe_id_name(stid)); + + signal_thread_handler_level_set(stid, env->sig_level); + env->magic = SETJMP_USED_MAGIC; + longjmp(env->buf, val); +} + +/** + * Wrapper for the siglongjmp() call to restore the signal handler level. + * + * @note + * The sigjmp_buf type here is not the system one but the one we redefine. + */ +void +compat_siglongjmp(sigjmp_buf env, int val) +{ + uint stid = thread_small_id(); + + g_assert(env->magic != SETJMP_USED_MAGIC); + g_assert(SIGSETJMP_MAGIC == env->magic); + g_assert(val != 0); + + g_assert_log(env->stid == stid, + "%s(): env->stid=%u {%s}, stid=%u {%s}", + G_STRFUNC, env->stid, thread_safe_id_name(env->stid), + stid, thread_safe_id_name(stid)); + +#ifndef HAS_SIGSETJMP + if (env->mask_saved) + sigprocmask(SIG_SETMASK, &env->mask, NULL); +#endif /* !HAS_SIGSETJMP */ + + signal_thread_handler_level_set(stid, env->sig_level); + env->magic = SETJMP_USED_MAGIC; + Siglongjmp(env->buf, val); /* metaconfig symbol definition */ +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/compat_setjmp.h
Added
@@ -0,0 +1,150 @@ +/* + * Copyright (c) 2016 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Compatible and portable setjmp/sigsetjmp with longjmp/siglongjmp. + * + * In order to work properly with signal handlers, the code should use + * Setjmp() and Sigsetjmp(), but can use longjmp() and siglongjmp(). + * + * @author Raphael Manfredi + * @date 2016 + */ + +#ifndef _compat_setjmp_h_ +#define _compat_setjmp_h_ + +#include "config.h" + +/* + * Before including <setjmp.h> we need to remap the jmp_buf and sigjmp_buf + * symbols because we are going to redefine our own types. + * + * If there is no sigjmp_buf defined, use the native jmp_buf. + */ + +#define jmp_buf native_jmp_buf + +#ifdef HAS_SIGSETJMP +#define sigjmp_buf native_sigjmp_buf +#else +#define native_sigjmp_buf native_jmp_buf +#endif /* HAS_SIGSETJMP */ + +#include <setjmp.h> + +#undef jmp_buf +#undef sigjmp_buf + +/* + * If SETJMP_SOURCE is defined, we are implementing our own Setjmp() and + * longjmp() therefore we need access to the real calls! + * + * Note that, unfortunately, we cannot redefine setjmp() as a function hence + * we need to use the capitalized Setjmp() -- and Sigsetjmp() if needed -- + * in the program. We can remap longjmp() and siglongjmp() though. + * + * The reason for which we cannot wrap setjmp() in our own routine but need + * a macro is simple: we cannot let the stack unwind when our wrapping routine + * returns the first time and expect longjmp() to later place us at the right + * place. That's why the idiom for using Setjmp() is: + * + * if (Setjmp(env)) { + * // code to run if we longjmp() is here + * } + * + * because we cannot return from the routine calling setjmp(). + */ + +#ifndef SETJMP_SOURCE +#undef Setjmp +#undef Sigsetjmp +#undef longjmp +#undef siglongjmp +#undef Siglongjmp + +#define Setjmp(e) (setjmp_prep(e), setjmp((e)->buf)) + +#ifdef HAS_SIGSETJMP +#define Sigsetjmp(e,s) (sigsetjmp_prep((e), (s)), sigsetjmp((e)->buf, (s))) +#else +#define Sigsetjmp(e,s) (sigsetjmp_prep((e), (s)), setjmp((e)->buf)) +#endif + +#define longjmp(e,v) compat_longjmp((e), (v)) +#define siglongjmp(e,v) compat_siglongjmp((e), (v)) +#define Siglongjmp(e,v) compat_siglongjmp((e), (v)) +#endif /* SETJMP_SOURCE */ + +/* + * Our own jmp_buf and sigjmp_buf encapsulate the native ones to include + * the signal handler level at the time Setjmp() or Sigsetjmp() was called. + * + * On Windows, since we emulate sigprocmask() and there is no native support + * for sigsetjmp(), we have to include the necessary information to be able + * to perform siglongjmp() correctly. + * + * We put the CPU state at the start of our new structures to avoid problems + * if these are used with setjmp() and sigsetjmp(). + */ + +enum setjmp_magic { + SETJMP_MAGIC = 0x6790e2ab, + SIGSETJMP_MAGIC = 0x4b539cdb, + SETJMP_USED_MAGIC = 0x780be360 +}; + +typedef struct compat_jmpbuf { + native_jmp_buf buf; /**< CPU state, must be at the start */ + sig_atomic_t sig_level; /**< Internal signal handler level */ + enum setjmp_magic magic; /**< Magic number */ + uint stid; /**< Thread which saved the context */ +} jmp_buf1; + +typedef struct compat_sigjmpbuf { + native_sigjmp_buf buf; /**< CPU state, must be at the start */ + sig_atomic_t sig_level; /**< Internal signal handler level */ + enum setjmp_magic magic; /**< Magic number */ + uint stid; /**< Thread which saved the context */ +#ifndef HAS_SIGSETJMP + bool mask_saved; /**< Did we save the signal mask? */ + sigset_t mask; /**< Signal mask saved */ +#endif /* !HAS_SIGSETJMP */ +} sigjmp_buf1; + +/* + * Public interface. + */ + +void setjmp_prep(jmp_buf env); +void sigsetjmp_prep(sigjmp_buf env, int savesigs); + +void compat_longjmp(jmp_buf env, int val) G_NORETURN; +void compat_siglongjmp(sigjmp_buf env, int val) G_NORETURN; + +#endif /* _compat_setjmp_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/compat_sleep_ms.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/compat_sleep_ms.c
Changed
@@ -35,49 +35,67 @@ #include "compat_sleep_ms.h" #include "compat_poll.h" +#include "thread.h" #include "override.h" /* Must be the last header included */ /** * Suspend process execution for a duration specified in milliseconds. + * + * @note + * This routine is a cancellation point. + * * @param ms milliseconds to sleep. */ void compat_sleep_ms(unsigned int ms) -#if defined(HAS_NANOSLEEP) { - struct timespec ts; + thread_cancel_test(); + thread_sleeping(TRUE); - /** - * Prefer nanosleep() over usleep() because it is guaranteed to - * not interact with signals. - */ +#if defined(HAS_NANOSLEEP) + { + struct timespec ts; - ts.tv_sec = ms / 1000; - ts.tv_nsec = (ms % 1000) * 1000000UL; - nanosleep(&ts, NULL); -} + /* + * Prefer nanosleep() over usleep() because it is guaranteed to + * not interact with signals. + */ + + ts.tv_sec = ms / 1000; + ts.tv_nsec = (ms % 1000) * 1000000UL; + nanosleep(&ts, NULL); + } #elif defined(HAS_USLEEP) -{ - while (ms > 0) { - unsigned int d; + { + if G_UNLIKELY(0 == ms) { + usleep(0); + return; + } - /** - * usleep() may fail if the delay is not less than 1000 milliseconds. - * Therefore, usleep() is called multiple times for longer delays. - */ + while (ms > 0) { + unsigned int d; + + /* + * usleep() may fail if the delay is not less than 1000 msecs. + * Therefore, usleep() is called multiple times for longer delays. + */ - d = MIN(ms, 990); - ms -= d; + d = MIN(ms, 990); + ms -= d; - /* Value must be less than 1000000! (< 1 second) */ - usleep(d * 1000UL); + /* Value must be less than 1000000! (< 1 second) */ + usleep(d * 1000UL); + } } -} #else -{ - compat_poll(NULL, 0, d); -} + { + compat_poll(NULL, 0, ms); + } #endif /* HAS_NANOSLEEP || HAS_USLEEP */ + thread_sleeping(FALSE); + thread_cancel_test(); +} + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/compat_statvfs.c
Added
@@ -0,0 +1,99 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Get file system statistics. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#include "common.h" + +#if defined(HAS_STATVFS) + +#ifdef I_SYS_STATVFS +#include <sys/statvfs.h> +#endif + +#elif defined(HAS_STATFS) + +#ifdef I_SYS_VFS +#include <sys/vfs.h> +#endif +#ifdef I_SYS_MOUNT +#include <sys/mount.h> +#endif + +#endif /* HAS_STATFS */ + +#include "compat_statvfs.h" + +#include "hashing.h" + +#include "override.h" /* Must be the last header included */ + +/** + * Get file system statistics. + */ +int +compat_statvfs(const char *path, struct statvfs *buf) +#if defined(HAS_STATVFS) +{ + return statvfs(path, buf); +} +#elif defined(HAS_STATFS) +{ + struct statfs sfs; + + if (-1 == statfs(path, &sfs)) + return -1; + + buf->f_bsize = sfs.f_bsize; + buf->f_frsize = sfs.f_bsize; /* f_frsize only introduced in Linux 2.6) */ + buf->f_blocks = sfs.f_blocks; + buf->f_bfree = sfs.f_bfree; + buf->f_bavail = sfs.f_bavail; + buf->f_files = sfs.f_files; + buf->f_ffree = sfs.f_ffree; + buf->f_favail = sfs.f_ffree; + buf->f_fsid = binary_hash(&sfs.f_fsid, sizeof sfs.f_fsid); + buf->f_flag = 0; + buf->f_namemax = sfs.f_namelen; + + return 0; +} +#else +{ + (void) path; + (void) buf; + + errno = ENOSYS; + return -1; +} +#endif + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/compat_statvfs.h
Added
@@ -0,0 +1,62 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Get file system statistics. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#include "common.h" + +#ifdef I_SYS_STATVFS +#include <sys/statvfs.h> +#endif + +#ifndef HAS_STATVFS +struct statvfs { + ulong f_bsize; /* file system block size */ + ulong f_frsize; /* fragment size */ + uint64 f_blocks; /* size of fs in f_frsize units */ + uint64 f_bfree; /* # free blocks */ + uint64 f_bavail; /* # free blocks for unprivileged users */ + uint64 f_files; /* # inodes */ + uint64 f_ffree; /* # free inodes */ + uint64 f_favail; /* # free inodes for unprivileged users */ + ulong f_fsid; /* file system ID */ + ulong f_flag; /* mount flags */ + ulong f_namemax; /* maximum filename length */ +}; + +#define ST_RDONLY (1U << 0) /* Read-only file system */ +#define ST_NOSUID (1U << 1) /* Setuid/setgid bits are ignored by exec() */ + +#endif /* !HAS_STATVFS */ + +int compat_statvfs(const char *path, struct statvfs *buf); + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/compat_un.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/compat_un.c
Changed
@@ -36,7 +36,7 @@ * ^ ^ ^ ^ ^ ^ * magic port | | client cookie NUL * | server cookie - * socket type + * socket type * * The leading "<?socket?>" string is just a magic string. * The port is the INET port on which the server is listening @@ -79,7 +79,7 @@ #include "fd.h" #include "file.h" #include "host_addr.h" -#include "glib-missing.h" +#include "htable.h" #include "log.h" #include "misc.h" #include "parse.h" @@ -105,8 +105,8 @@ int refcnt; union { struct { /* listening socket */ - guint32 client_cookieSUN_CLT_COOKIE_LEN; - guint32 server_cookieSUN_CLT_COOKIE_LEN; + uint32 client_cookieSUN_CLT_COOKIE_LEN; + uint32 server_cookieSUN_CLT_COOKIE_LEN; } l; struct sock_un_accepted{ /* accepted socket */ struct sock_un *lsun; @@ -131,7 +131,7 @@ g_assert(sun->refcnt > 0); } -static GHashTable *un_desc; /**< Maps a fd to a UNIX socket descriptor */ +static htable_t *un_desc; /**< Maps a fd to a UNIX socket descriptor */ static const char SOCK_FILE_MAGIC = "<?socket?>"; @@ -218,9 +218,9 @@ return -1; if (NULL == un_desc) - un_desc = g_hash_table_new(NULL, NULL); + un_desc = htable_create(HASH_KEY_SELF, 0); - g_assert(!gm_hash_table_contains(un_desc, int_to_pointer(sd))); + g_assert(!htable_contains(un_desc, int_to_pointer(sd))); sun = sock_un_alloc(); @@ -235,7 +235,7 @@ g_assert_not_reached(); } - g_hash_table_insert(un_desc, int_to_pointer(sd), sun); + htable_insert(un_desc, int_to_pointer(sd), sun); return sd; } @@ -250,7 +250,7 @@ { sockaddr_unix_t *saddr = (sockaddr_unix_t *) my_addr; struct sock_un *sun; - guint16 port; + uint16 port; int fd; ssize_t rw; @@ -266,7 +266,7 @@ if (NULL == un_desc) goto bad_sd; - sun = g_hash_table_lookup(un_desc, int_to_pointer(sd)); + sun = htable_lookup(un_desc, int_to_pointer(sd)); if (NULL == sun) goto bad_sd; @@ -439,7 +439,7 @@ if (NULL == un_desc) goto regular; - sun = g_hash_table_lookup(un_desc, int_to_pointer(sd)); + sun = htable_lookup(un_desc, int_to_pointer(sd)); if (NULL == sun) goto regular; @@ -480,7 +480,7 @@ if (NULL == un_desc) goto regular; - sun = g_hash_table_lookup(un_desc, int_to_pointer(sd)); + sun = htable_lookup(un_desc, int_to_pointer(sd)); if (NULL == sun) goto regular; @@ -504,7 +504,7 @@ */ len = sizeof sin4; - if (getsockname(fd, cast_to_gpointer(&sin4), &len) != 0) { + if (getsockname(fd, cast_to_pointer(&sin4), &len) != 0) { s_warning("getsockname(accepted emulated UNIX socket #%d) failed: %m", fd); goto bad_protocol; @@ -515,7 +515,7 @@ ha = host_addr_peek_ipv4(&sin4.sin_addr.s_addr); - if (!host_addr_equal(ha, ipv4_loopback)) { + if (!host_addr_equiv(ha, ipv4_loopback)) { g_warning("connection on emulated UNIX listening socket #%d " "comes from non-local %s", sd, host_addr_to_string(ha)); @@ -559,7 +559,7 @@ asun->connected = TRUE; asun->u.a.lsun = sock_un_refcnt_inc(sun); - g_hash_table_insert(un_desc, int_to_pointer(fd), asun); + htable_insert(un_desc, int_to_pointer(fd), asun); } /* @@ -585,10 +585,10 @@ * * @return TRUE on success, with value filled. */ -static gboolean -sock_un_parse_cookie(const char *p, const char **endptr, guint32 *value) +static bool +sock_un_parse_cookie(const char *p, const char **endptr, uint32 *value) { - guint32 v; + uint32 v; int error; v = parse_uint32(p, endptr, 16, &error); @@ -611,9 +611,9 @@ sockaddr_unix_t *saddr = (sockaddr_unix_t *) addr; struct sock_un *sun; int fd; - guint16 port; - guint32 clientSUN_CLT_COOKIE_LEN; - guint32 serverSUN_SRV_COOKIE_LEN; + uint16 port; + uint32 clientSUN_CLT_COOKIE_LEN; + uint32 serverSUN_SRV_COOKIE_LEN; ssize_t rw; g_assert(addr != NULL); @@ -628,7 +628,7 @@ if (NULL == un_desc) goto bad_sd; - sun = g_hash_table_lookup(un_desc, int_to_pointer(sd)); + sun = htable_lookup(un_desc, int_to_pointer(sd)); if (NULL == sun) goto bad_sd; @@ -714,12 +714,12 @@ if (*p++ != ' ') goto not_a_socket; - for (i = 0; i < G_N_ELEMENTS(client); i++) { + for (i = 0; i < N_ITEMS(client); i++) { if (!sock_un_parse_cookie(p, &endptr, &clienti)) goto not_a_socket; p = endptr; - if (i != G_N_ELEMENTS(client) - 1 && *p++ != '-') + if (i != N_ITEMS(client) - 1 && *p++ != '-') goto not_a_socket; } @@ -759,7 +759,7 @@ */ { - guint32 value; + uint32 value; if (sizeof value != s_read(sd, &value, sizeof value)) return -1; @@ -805,11 +805,11 @@ static void sock_un_remove(int sd, struct sock_un *sun) { - g_hash_table_remove(un_desc, int_to_pointer(sd)); + htable_remove(un_desc, int_to_pointer(sd)); sock_un_free(sun); - if (0 == g_hash_table_size(un_desc)) - gm_hash_table_destroy_null(&un_desc); + if (0 == htable_count(un_desc)) + htable_free_null(&un_desc); } /** @@ -829,7 +829,7 @@ * Emulation layer for UNIX sockets. */ - sun = g_hash_table_lookup(un_desc, int_to_pointer(sd)); + sun = htable_lookup(un_desc, int_to_pointer(sd)); if (NULL == sun) goto regular; @@ -864,7 +864,7 @@ if (NULL == un_desc) goto regular; - sun = g_hash_table_lookup(un_desc, int_to_pointer(sd)); + sun = htable_lookup(un_desc, int_to_pointer(sd)); if (NULL == sun) goto regular; @@ -893,8 +893,8 @@ * @return FALSE if no more data needs to be read, TRUE if either more data * needs to be read or there is an error and the connection MUST be closed. */ -gboolean -compat_accept_check(int sd, gboolean *error) +bool +compat_accept_check(int sd, bool *error) { struct sock_un *sun; ssize_t rw; @@ -903,7 +903,7 @@ if (NULL == un_desc) return FALSE; - sun = g_hash_table_lookup(un_desc, int_to_pointer(sd)); + sun = htable_lookup(un_desc, int_to_pointer(sd)); if (NULL == sun) return FALSE; @@ -956,9 +956,9 @@ * Client cookie matched, assure the client that we're the proper server. */ - rw = s_write(sd, suna->lsun->u.l.server_cookie, sizeof(guint32)); + rw = s_write(sd, suna->lsun->u.l.server_cookie, sizeof(uint32)); - if (rw != sizeof(guint32)) { + if (rw != sizeof(uint32)) { *error = TRUE; return TRUE; } @@ -981,12 +981,12 @@ compat_socket_duped(int sd, int nsd) { if (un_desc != NULL) { - struct sock_un *sun = g_hash_table_lookup(un_desc, int_to_pointer(sd)); + struct sock_un *sun = htable_lookup(un_desc, int_to_pointer(sd)); if (sun != NULL) { - g_assert(!gm_hash_table_contains(un_desc, int_to_pointer(nsd))); - g_hash_table_remove(un_desc, int_to_pointer(sd)); - g_hash_table_insert(un_desc, int_to_pointer(nsd), sun); + g_assert(!htable_contains(un_desc, int_to_pointer(nsd))); + htable_remove(un_desc, int_to_pointer(sd)); + htable_insert(un_desc, int_to_pointer(nsd), sun); } } }
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/compat_un.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/compat_un.h
Changed
@@ -84,7 +84,7 @@ int compat_getsockname(int sd, struct sockaddr *addr, socklen_t *addrlen); int compat_socket_close(int sd); -gboolean compat_accept_check(int sd, gboolean *error); +bool compat_accept_check(int sd, bool *error); void compat_socket_duped(int sd, int nsd); #endif /* HAS_SOCKADDR_UN */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/compat_usleep.c
Added
@@ -0,0 +1,150 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Process suspension with microsecond accuracy. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#ifdef I_SYS_SELECT +#include <sys/select.h> +#endif + +#include "compat_usleep.h" +#include "thread.h" + +#include "override.h" /* Must be the last header included */ + +/** + * Suspend process execution for a duration specified in microseconds. + * + * @param us amount of microseconds to sleep. + * @param cancel whether routine is a thread cancellation point + */ +static void +compat_usleep_internal(unsigned int us, bool cancel) +{ + if (cancel) { + thread_cancel_test(); + thread_sleeping(TRUE); + } else { + thread_in_syscall_set(TRUE); + } + +#if defined(HAS_NANOSLEEP) + { + struct timespec ts; + + /* + * Prefer nanosleep() over usleep() because it is guaranteed to + * not interact with signals. + */ + + ts.tv_sec = us / 1000000; + ts.tv_nsec = (us % 1000000) * 1000UL; + nanosleep(&ts, NULL); + } +#elif defined(HAS_USLEEP) + { + if G_UNLIKELY(0 == us) { + usleep(0); + return; + } + + while (us > 0) { + unsigned int d; + + /* + * usleep() may fail if the delay is not less than 1000 msecs. + * Therefore, usleep() is called multiple times for longer delays. + */ + + d = MIN(us, 990000); + us -= d; + + /* Value must be less than 1000000! (< 1 second) */ + usleep(d); + } + } +#else + { + struct timeval tv; + fd_set rfds, wfds, efds; + + FD_ZERO(&rfds); + FD_ZERO(&wfds); + FD_ZERO(&efds); + + tv.tv_sec = us / 1000000; + tv.tv_usec = us % 1000000; + + (void) select(0, &rfds, &wfds, &efds, &tv); + } +#endif /* HAS_NANOSLEEP || HAS_USLEEP */ + + if (cancel) { + thread_sleeping(FALSE); + thread_cancel_test(); + } else { + thread_in_syscall_set(FALSE); + } +} + +/** + * Suspend process execution for a duration specified in microseconds. + * + * @note + * This routine is a cancellation point. + * + * @param us amount of microseconds to sleep. + */ +void +compat_usleep(unsigned int us) +{ + compat_usleep_internal(us, TRUE); +} + +/** + * Suspend process execution for a duration specified in microseconds, but + * without testing for thread cancellation and without recording that the + * thread is sleeping. + * + * This routine should be reserved to low-level routines, like spinlock code + * or thread_yield(). + * + * @param us amount of microseconds to sleep. + */ +void +compat_usleep_nocancel(unsigned int us) +{ + compat_usleep_internal(us, FALSE); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/compat_usleep.h
Added
@@ -0,0 +1,39 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Process suspension with microsecond accuracy. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +void compat_usleep(unsigned int); +void compat_usleep_nocancel(unsigned int); + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/concat.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/concat.c
Changed
@@ -37,9 +37,11 @@ #include "common.h" #include "concat.h" + #include "glib-missing.h" #include "unsigned.h" #include "walloc.h" + #include "override.h" /* Must be the last header included */ size_t @@ -125,23 +127,28 @@ w_concat_strings(char **dst_ptr, const char *first, ...) { va_list ap; + va_list ap2; size_t len; va_start(ap, first); + VA_COPY(ap2, ap); + len = concat_strings_v(NULL, 0, first, ap); va_end(ap); + len = size_saturate_add(len, 1); + if (dst_ptr) { size_t ret; - *dst_ptr = walloc(len + 1); - va_start(ap, first); - ret = concat_strings_v(*dst_ptr, len + 1, first, ap); - va_end(ap); - g_assert(ret == len); + *dst_ptr = walloc(len); + ret = concat_strings_v(*dst_ptr, len, first, ap2); + g_assert(ret == len - 1); } - return 1 + len; + va_end(ap2); + + return len; } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/concat.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/concat.h
Changed
@@ -38,9 +38,9 @@ #define _concat_h_ size_t concat_strings(char *dst, size_t size, - const char *s, ...) G_GNUC_NULL_TERMINATED; + const char *s, ...) G_NULL_TERMINATED; size_t w_concat_strings(char **dst, - const char *first, ...) G_GNUC_NULL_TERMINATED; + const char *first, ...) G_NULL_TERMINATED; size_t concat_strings_v(char *dst, size_t size, const char *s, va_list ap); #endif /* _concat_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/cond.c
Added
@@ -0,0 +1,1598 @@ +/* + * Copyright (c) 2012-2013, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Condition waiting. + * + * A condition variable is rather expensive because it uses scarce system + * resources (when semaphores are not emulated) so applications should strive + * to limit the amount of conditions used and free them up when they are no + * longer useful. + * + * Routines that may suspend the execution of the thread such as cond_wait() + * are thread cancellation points. When cancellation occurs, the application + * mutex is re-acquired before invoking the cleanup callbacks. + * + * Therefore, all application code calling cond_wait() and friends MUST install + * a cleanup handler, to at least unlock the application mutex. If the only + * cleanup operation required is the unlocking of the mutex, then the _clean + * version of the waiting routine should be used. For instance, instead of + * calling cond_wait_until(), use cond_wait_until_clean() to make sure that + * the mutex will be unlocked should a cancellation occur. + * + * @author Raphael Manfredi + * @date 2012-2013 + */ + +#include "common.h" + +#include "cond.h" +#include "elist.h" +#include "hashing.h" +#include "mutex.h" +#include "once.h" +#include "pow2.h" +#include "semaphore.h" +#include "slist.h" +#include "spinlock.h" +#include "stringify.h" +#include "thread.h" +#include "tm.h" +#include "waiter.h" +#include "walloc.h" + +#include "override.h" /* Must be the last header included */ + +enum cond_magic { + COND_MAGIC = 0x4983d0fe, + COND_EXT_MAGIC = 0x29a7f826 +}; + +/** + * A condition variable. + */ +struct cond { + enum cond_magic magic; /* Magic number */ + int refcnt; /* Reference count */ + int waiting; /* Amount of threads waiting */ + int signals; /* Amount of wakeup signals sent */ + uint generation; /* Signal generation number (can wrap up) */ + semaphore_t *sem; /* Semaphore grabbed to wait on condition */ + const mutex_t *mutex; /* Guarding mutex for condition */ + spinlock_t lock; /* Thread-safe lock for updating condition */ + link_t lnk; /* Links all active condition variables */ +}; + +/** + * An extended condition variable has a list of implicit waiters which do not + * necessarily hold the mutex whilst waiting and which nonetheless want to + * be notified when the condition has been signaled. + */ +struct cond_ext { + struct cond cond; + /* Extra fields specific to an extended condition */ + slist_t *waiters; /* Registered waiters */ +}; + +static inline void +cond_check(const struct cond * const cd) +{ + g_assert(cd != NULL); + g_assert(COND_MAGIC == cd->magic || COND_EXT_MAGIC == cd->magic); +} + +static inline bool +cond_is_extended(const struct cond * const cd) +{ + return COND_EXT_MAGIC == cd->magic; +} + +static inline ALWAYS_INLINE struct cond_ext * +cast_to_cond_ext(const struct cond * const cd) +{ + g_assert(COND_EXT_MAGIC == cd->magic); + + return (struct cond_ext *) cd; +} + +/** + * All the condition variables created are inserted in a list so that we can + * force a wakeup on all the conditions each time the system clock is updated + * significantly (for instance after a daylight saving change). + * + * This is a global list, protected by its dedicated lock. + * + * A listener routine (cond_time_adjust) is installed to iterate on all the + * known condition variables and broadcast a signal to all waiters, each time + * the system clock is adjusted. This will cause spurious wakeups, but all + * application code using condition variables must prepare for these anyway. + */ +static elist_t cond_vars = ELIST_INIT(offsetof(struct cond, lnk)); +static spinlock_t cond_vars_slk = SPINLOCK_INIT; + +#define COND_VARS_LOCK spinlock(&cond_vars_slk) +#define COND_VARS_UNLOCK spinunlock(&cond_vars_slk) + +/* + * Our design for condition variables uses an initial indirection to fetch + * the actual object: routines get a "cond_t *c" and need to de-reference + * "c" to get at the allocated object. + * + * This is nice because it allows to transparently reset condition variables + * when they are no longer needed, or to extend them on-the-fly (when adding + * waiters for instance) whilst the condition may be already in use. + * + * This ease of use from the user-level comes with a price at our level since + * we need to ensure atomicity of the de-reference operation and at the + * same time guarantee that the object we get will not be freed underneath + * whilst we hold a pointer to it. + * + * Therefore, we need to create a critical section surrounding each access to + * "*c" to get the condition variable, and we need to reference-count the + * condition variables from this critical section to ensure the object will not + * be reclaimed whilst in use. + * + * To avoid too much lock contention between separate condition variables, + * we use an array of spinlocks to create the critical sections. The actual + * spinlock to use is obtained by hashing the "c" pointer and then indexing + * within that array. + */ +static spinlock_t cond_access = { + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 4 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 8 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 12 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 16 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 20 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 24 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 28 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 32 */ +}; + +#define COND_HASH_MASK (N_ITEMS(cond_access) - 1) + +static void cond_time_adjust(int delta); + +/* + * We want the real implementations here, not the macros. + * + * These macros are used to make sure that there is a cleanup handler installed + * in cancellable threads, since a cancel would leave the thread with the + * mutex locked. + */ +#undef cond_wait +#undef cond_wait_until +#undef cond_timed_wait + +/* + * Get spinlock to use based on condition address. + */ +static inline spinlock_t * +cond_get_lock(const cond_t * const c) +{ + STATIC_ASSERT(IS_POWER_OF_2(COND_HASH_MASK + 1)); + + return &cond_accesspointer_hash_fast(c) & COND_HASH_MASK; +} + +/** + * Install time event listener to react in case the system clock is adjusted. + */ +static void +cond_vars_install_listener(void) +{ + tm_event_listener_add(cond_time_adjust); +} + +/** + * Add condition variable to the list. + */ +static void +cond_vars_add(struct cond *cv) +{ + static once_flag_t done; + + /* + * We install the listener the first time we add a condition variable. + * There is no need to remove the listener, since it can safely be + * called even where there are no more active condition variables. + */ + + once_flag_run(&done, cond_vars_install_listener); + + COND_VARS_LOCK; + elist_append(&cond_vars, cv); + COND_VARS_UNLOCK; +} + +/** + * Remove condition variable from the list. + */ +static void +cond_vars_remove(struct cond *cv) +{ + COND_VARS_LOCK; + elist_remove(&cond_vars, cv); + COND_VARS_UNLOCK; +} + +/** + * @return amount of allocated condition variables. + */ +size_t +cond_vars_count(void) +{ + size_t n; + + COND_VARS_LOCK; + n = elist_count(&cond_vars); + COND_VARS_UNLOCK; + + return n; +} + +/** + * Allocate a new condition. + * + * @param m the mutex guarding the condition + * @param emulated whether to use emulated semaphores, for testing + * @param extended whether to create an extended condtion + * + * @return a new condition that can be freed with cond_free(). + */ +static struct cond * +cond_create(const mutex_t *m, bool emulated, bool extended) +{ + struct cond *cd; + + g_assert(NULL == m || mutex_is_valid(m)); + + if (extended) { + struct cond_ext *cde; + + WALLOC0(cde); + cde->waiters = slist_new(); + cd = &cde->cond; + cd->magic = COND_EXT_MAGIC; + } else { + WALLOC0(cd); + cd->magic = COND_MAGIC; + } + + cd->sem = semaphore_create_full(0, emulated); + cd->mutex = m; + cd->refcnt = 1; + spinlock_init(&cd->lock); + cond_vars_add(cd); + + return cd; +} + +static void +cond_waiter_release(void *p) +{ + (void) waiter_refcnt_dec(p); +} + +/** + * Free a condition variable object when its reference count drops to zero. + * + * @param cv the condition variable object + * @param locked whether c->lock is already taken + */ +static void +cond_free(struct cond *cv, bool locked) +{ + cond_check(cv); + + if (!atomic_int_dec_is_zero(&cv->refcnt)) { + if (locked) + spinunlock(&cv->lock); + return; + } + + cond_vars_remove(cv); + + if (!locked) + spinlock(&cv->lock); + + g_assert_log(0 == cv->waiting, + "%s(): cv->waiting=%u", G_STRFUNC, cv->waiting); + + spinlock_destroy(&cv->lock); + semaphore_destroy(&cv->sem); + + if (cond_is_extended(cv)) { + struct cond_ext *ce = cast_to_cond_ext(cv); + slist_free_all(&ce->waiters, cond_waiter_release); + cv->magic = 0; + WFREE(ce); + } else { + cv->magic = 0; + WFREE(cv); + } +} + +/** + * Extend an already allocated condition. + * + * @param cd the regular condition variable object to extend + * + * @return pointer to the new (extended) condition + */ +static struct cond * +cond_extend(const struct cond *cd) +{ + struct cond_ext *cde; + + g_assert(COND_MAGIC == cd->magic); /* Not already extended */ + g_assert(spinlock_is_held(&cd->lock)); + + WALLOC0(cde); + cde->cond = *cd; /* Struct copy */ + cde->cond.magic = COND_EXT_MAGIC; + cde->waiters = slist_new(); + cond_vars_add(&cde->cond); + + return &cde->cond; +} + +/** + * Get condition variable. + * + * This is the mainstream use case: the condition variable pointed at has + * already been initialized correctly. + * + * Caller will need to invoke cond_free() on the returned variable once + * it is done with it. + * + * @param c the user-visible condition variable + * + * @return the condition variable ref-counted, NULL if not initialized yet + * or destroyed. + */ +static struct cond * +cond_get(cond_t * const c) +{ + spinlock_t *lock = cond_get_lock(c); + struct cond *cv; + + g_assert(c != NULL); + + spinlock_hidden(lock); + cv = *c; + if (cv != NULL && cv != COND_INIT && cv != COND_DESTROYED) { + cond_check(cv); + atomic_int_inc(&cv->refcnt); + } else { + cv = NULL; + } + spinunlock_hidden(lock); + + return cv; +} + +/** + * Get condition variable, initing it if necessary. + * + * Call cond_free() on the returned variable when done with it. + * + * @param c the condition variable to initialize + * @param m the external mutex, if known + * @param destroyed whether to allow initialization of COND_DESTROYED vars + * + * @return the condition variable ref-counted. + */ +static struct cond * +cond_get_init(cond_t * const c, const mutex_t *m, bool destroyed) +{ + spinlock_t *lock = cond_get_lock(c); + struct cond *cv; + + g_assert(c != NULL); + + spinlock(lock); + cv = *c; + if G_UNLIKELY(COND_INIT == cv || NULL == cv || COND_DESTROYED == cv) { + if G_UNLIKELY(!destroyed && COND_DESTROYED == cv) { + s_error("%s(): condition %p already destroyed", G_STRFUNC, c); + } + /* Auto-init uses real semaphores and creates normal conditions */ + *c = cv = cond_create(m, FALSE, FALSE); + atomic_int_inc(&cv->refcnt); + } else { + cond_check(cv); + atomic_int_inc(&cv->refcnt); + } + spinunlock(lock); + + return cv; +} + +/** + * Access the extended condition, promoting the existing condition to the + * extended status if needed. + * + * @param c pointer to the condition to initialize + */ +static struct cond_ext * +cond_get_extended(cond_t *c) +{ + spinlock_t *lock; + struct cond *cv, *cn; + + g_assert(c != NULL); + + cv = cond_get(c); + + if (cv != NULL && cond_is_extended(cv)) + return cast_to_cond_ext(cv); + + lock = cond_get_lock(c); + spinlock(lock); + + if (cv != NULL) + goto extend; + + cv = *c; + if G_UNLIKELY(COND_DESTROYED == cv) { + spinunlock(lock); + s_error("%s(): condition %p already destroyed", G_STRFUNC, c); + } else if G_UNLIKELY(COND_INIT == cv || NULL == cv) { + /* Auto-init uses real semaphores */ + *c = cv = cond_create(NULL, FALSE, TRUE); + atomic_int_inc(&cv->refcnt); + } else { + cond_check(cv); + atomic_int_inc(&cv->refcnt); + } + + if (cond_is_extended(cv)) { + spinunlock(lock); + return cast_to_cond_ext(cv); + } + + /* FALL THROUGH */ + +extend: + + /* + * We protect the extension (and the writing to *c) with the global + * spinlock to guard against any possible race with other threads + * atttempting to access the indirection. + * + * No deadlocks are possible despite the critical section overlaps + * because the lock order is always the same: the global spinlock, + * then the condition variable. + */ + + spinlock_hidden(&cv->lock); /* Will be copied, must be hidden */ + cn = cond_extend(cv); /* Copies the common fields over */ + + /* + * All the resources were copied, we just need to reset them in the + * old condition variable to make sure cond_free() will not attempt + * to release them. + * + * The reference count of the old (non-extended) variable was increased + * above, so it needs to be reduced now. The reference count of the + * new variable (the one we exetended) is forced to 2 because our caller + * will invoke cond_free(). + */ + + cv->sem = NULL; + cv->waiting = 0; /* Old cond variable no longer used */ + atomic_int_dec(&cv->refcnt); + cn->refcnt = 2; + + *c = cn; /* Upgraded the condition variable */ + + spinunlock_hidden(&cn->lock); /* Not the same lock but the copy */ + spinunlock_hidden(&cv->lock); /* This is the lock we took above */ + spinunlock(lock); + + cond_free(cv, FALSE); + cv = cn; + + return cast_to_cond_ext(cv); +} + +/** + * Add a new waiter to the condition. + * + * @param c pointer to the condition to initialize + * @param w the waiter to add + */ +void +cond_waiter_add(cond_t *c, waiter_t *w) +{ + struct cond_ext *cve; + struct cond *cv; + + cve = cond_get_extended(c); + cv = &cve->cond; + + spinlock(&cv->lock); + if (!slist_contains_identical(cve->waiters, w)) { + slist_append(cve->waiters, waiter_refcnt_inc(w)); + } + spinunlock(&cv->lock); + cond_free(cv, FALSE); +} + +/** + * Remove a waiter from the condition. + * + * @param c pointer to the condition to initialize + * @param w the waiter to add + * + * @return TRUE if the waiter was removed, FALSE if it was not found. + */ +bool +cond_waiter_remove(cond_t *c, waiter_t *w) +{ + struct cond_ext *cve; + struct cond *cv; + bool found; + + cve = cond_get_extended(c); + cv = &cve->cond; + + spinlock(&cv->lock); + found = slist_remove(cve->waiters, w); + spinunlock(&cv->lock); + + if (found) + waiter_refcnt_dec(w); + + cond_free(cv, FALSE); + return found; +} + +/** + * Explicitly initialize a condition. + * + * @param c pointer to the condition to initialize + * @param m the mutex that will be guarding the condition + * @param emulated whether to use emulated semaphores, for testing + */ +void +cond_init_full(cond_t *c, const mutex_t *m, bool emulated) +{ + spinlock_t *lock = cond_get_lock(c); + struct cond *cv, *cn; + + g_assert(c != NULL); + g_assert(mutex_is_valid(m)); + + cn = cond_create(m, emulated, FALSE); + + /* + * Make sure there are no concurrent initialization of the same variable + * and that the variable was still not initialized. + */ + + spinlock_hidden(lock); + cv = *c; + g_assert(COND_INIT == cv || NULL == cv || COND_DESTROYED == cv); + *c = cn; + spinunlock_hidden(lock); +} + +/** + * Explicitly initialize a condition. + * + * @param c pointer to the condition to initialize + * @param m the mutex that will be guarding the condition + */ +void +cond_init(cond_t *c, const mutex_t *m) +{ + cond_init_full(c, m, FALSE); /* Use real semaphores by default */ +} + +/** + * Explicitly destroy a condition. + * + * The condition cannot be used any more unless it is explicitly inited again. + */ +void +cond_destroy(cond_t *c) +{ + spinlock_t *lock = cond_get_lock(c); + struct cond *cv; + bool locked = FALSE; + + g_assert(c != NULL); + + /* + * Need to overlap critical sections to ensure there will be no race + * condition. + */ + + spinlock(lock); + cv = *c; + if (cv != COND_DESTROYED && cv != COND_INIT && cv != NULL) { + spinlock_swap(&cv->lock, lock); + locked = TRUE; + } + *c = COND_DESTROYED; + spinunlock(lock); + + if (locked) { + if G_UNLIKELY(cv->waiting != 0) { + s_carp("%s(): condition variable still has %u waiting thread%s", + G_STRFUNC, cv->waiting, plural(cv->waiting)); + } + cond_free(cv, TRUE); + } +} + +/** + * Reset a condition to its initial auto-initable status provided it is not + * currently used and no waiters are currently installed. + * + * @param c the condition to reset + * + * @return TRUE if condition was reset, FALSE otherwise. + */ +bool +cond_reset(cond_t *c) +{ + spinlock_t *lock = cond_get_lock(c); + struct cond *cv; + bool locked = FALSE, reset = FALSE; + + g_assert(c != NULL); + + spinlock(lock); + cv = *c; + if (cv != NULL && cv != COND_INIT && cv != COND_DESTROYED) { + spinlock_swap(&cv->lock, lock); + locked = TRUE; + } + + if (!locked) { + spinunlock(lock); + return FALSE; + } + + cond_check(cv); + + if (cv->waiting != 0) + goto done; + + if (cond_is_extended(cv)) { + struct cond_ext *cve = cast_to_cond_ext(cv); + if (0 != slist_length(cve->waiters)) + goto done; + } + + /* + * Reset the condition variable and free it. + */ + + *c = COND_INIT; + reset = TRUE; + + /* FALL THROUGH */ + +done: + spinunlock(lock); /* Lock ordering was swapped above */ + + if (reset) { + /* + * Note that the cv->lock is still held at this point. + * + * We warn if there is more than one reference to the condition + * variable because we're about to free it. Since there are no + * waiters on the variable and the cond_t was already reset to + * COND_INIT above, we should be safe: cond_free() will not destroy + * the variable physically, and only when the last reference will be + * gone will it be destroyed. Therefore, we do not panic when this + * happens, just warn loudly with a stack trace to help identify + * the root of the problem. + */ + + if G_UNLIKELY(cv->refcnt != 1) { + s_carp("%s(): reset condition at %p had refcnt=%d (expected 1)", + G_STRFUNC, c, cv->refcnt); + } + cond_free(cv, TRUE); /* Will destroy cv->lock */ + } else { + spinunlock(&cv->lock); + } + + return reset; +} + +/** + * Factorizes common code for simple getters on the condition variable. + * + * @param cp the cond_t argument + * @param v the variable used to get the underlying condition var + * @param expr expression to evaluate + */ +#define GET_CONDITION(c_, cv_, expr_) \ + struct cond *cv_ = cond_get(c_); \ + size_t r = 0; \ + \ + if (cv_ != NULL) { \ + spinlock_hidden(&cv_->lock); \ + r = expr_; \ + spinunlock_hidden(&cv_->lock); \ + cond_free(cv_, FALSE); \ + } \ + return r; + +/** + * Fetch the current amount of waiting threads. + * + * Note that the amount is "informative" and can become stale as soon as it + * has been fetched. The nature of the application using the condition will + * determine whether this is useful or not. + * + * It is not required to hold the mutex protecting the predicate but holding + * the mutex is not a guarantee that the count returned is not about to become + * stale: a thread waiting on the condition could have been already awaked but + * not scheduled to decrease the count yet. + * + * However, if the mutex protecting the predicate is held and this routine + * returns 0, then we have the assurance that nobody is using that condition + * because the count is increased whilst the mutex is being held. + * + * @return current amount of waiting threads + */ +size_t +cond_waiting_count(const cond_t * const c) +{ + cond_t *cw = deconstify_pointer(c); + + GET_CONDITION(cw, cv, cv->waiting); +} + +/** + * Fetch the current amount of signals (waiting threads that will wake up). + * + * Note that the amount is "informative" and can become stale as soon as it + * has been fetched. The nature of the application using the condition will + * determine whether this is useful or not. + * + * It is not required to hold the mutex protecting the predicate but holding + * the mutex is not a guarantee that the count returned is not about to become + * stale: a thread waiting on the condition could have been already scheduled + * and the actual amount of signals has already been decreased. + * + * @return current amount of signals sent. + */ +size_t +cond_signal_count(const cond_t * const c) +{ + cond_t *cw = deconstify_pointer(c); + + GET_CONDITION(cw, cv, cv->signals); +} + +/** + * Fetch the net amount of waiting threads (waiting - signals sent). + * + * Note that the amount is "informative" and can become stale as soon as it + * has been fetched. The nature of the application using the condition will + * determine whether this is useful or not. + * + * Also, signalling a thread does not mean it will be able to proceed after + * its waiting predicate has been evaluated: it could go back to waiting. + */ +size_t +cond_pending_count(const cond_t * const c) +{ + cond_t *cw = deconstify_pointer(c); + int p; + + GET_CONDITION(cw, cv, ((p = cv->waiting - cv->signals), MAX(0, p))); +} + +/** + * Check that a cancellable thread has installed a cleanup handler when + * using the regular condition waiting routines, or is calling the _clean + * versions which provide the necessary handlers. + * + * @param waiting the condition waiting routine + * @param routine the calling routine name that should have a handler + * @param file the file where the condition waiting routine is called + * @param line the line where the condition waiting routine is called + */ +static void +cond_cancel_safe_check(const char *waiting, + const char *routine, const char *file, unsigned line) +{ + if (!thread_is_cancelable()) + return; /* No protection required */ + + if (thread_cleanup_has_from(routine)) + return; /* OK, caller installed a cleanup handler */ + + /* + * Emit loud critical warning, once per calling stackframe. + */ + + s_carp_once( + "issuing %s() from cancelable %s without cleanup in %s() at %s:%u", + waiting, thread_name(), routine, file, line); +} + +struct cond_wait_until_vars { + mutex_t *m; + const char *file; + unsigned line; + const void *element; + struct cond *cv; +}; + +/** + * Cleanup handler for cond_wait_until(). + */ +static void +cond_wait_until_cleanup(void *arg) +{ + struct cond_wait_until_vars *v = arg; + + thread_cond_waiting_done(v->element); + cond_free(v->cv, FALSE); + + /* + * Reacquire the mutex before returning to the application. + * + * When compiled with SPINLOCK_DEBUG, we propagate the original locking + * point back into the mutex in case there is a deadlock later. + */ + + mutex_lock(v->m); + mutex_set_lock_source(v->m, v->file, v->line); +} + +/** + * Wait on condition, whose predicate is protected by given mutex. + * + * Upon entry, the mutex must be locked (normally, no hidden or fast locks + * are permitted). + * + * Upon return, the mutex is still locked but the application can re-check + * the predicate if we were awaken, or cleanup if a timeout occurred. + * + * All application errors are fatal (bugs) so the code does not need to + * bother with error conditions. + * + * @param c the condition variable + * @param m the mutex protecting the predicate (locked normally) + * @param end absolute time when we must stop waiting (NULL = no limit) + * + * @return FALSE if the wait expired, TRUE if we were awaken. + */ +static bool +cond_wait_until(cond_t *c, mutex_t *m, const tm_t *end) +{ + spinlock_t *lock = cond_get_lock(c); + struct cond *cv; + struct cond_wait_until_vars v; + bool awaked, resend; + uint generation; + tm_t waiting; + semaphore_t *sem; + + g_assert(c != NULL); + assert_mutex_is_owned(m); + g_assert(1 == mutex_held_depth(m)); + + v.cv = cv = cond_get_init(c, m, TRUE); + v.m = m; + + spinlock(&cv->lock); + + if G_UNLIKELY(NULL == cv->mutex) + cv->mutex = m; + + g_assert_log(cv->mutex == m, + "%s(): attempting to wait on %p with different mutex (used %p, now %p)", + G_STRFUNC, c, cv->mutex, m); + + /* + * Register ourselves as a waiting thread. + * + * The generation number is there to make sure we'll only handle signals + * sent AFTER we enter the waiting stage, leaving the ones present before + * to be handled by the threads already waiting. + * + * Note that because cv->waiting is increased with the mutex still locked, + * the cond_waiting_count() routine can accurately indicate whether the + * condition variable is used when called with the mutex locked. + */ + + cv->waiting++; + generation = cv->generation; + sem = cv->sem; + spinunlock(&cv->lock); + + /* + * Now release the application mutex and wait to be awaken by a + * timeout, a cond_signal() or a cond_broadcast(). + * + * Because we already registered ourselves as waiting, a broadcast + * will increase the semaphore sufficiently so that we don't have to + * wait on it, hence we do not lose any wakeup event. + * + * Note that the application mutex MUST be grabbed normally: no hidden + * or fast grabbing is allowed here because the mutex does not know how + * it was grabbed. Besides, condition waiting is a heaven for race + * conditions to develop, hence it's important to be able to track locks, + * especially since we're about to possibly be suspended and we must make + * sure there are none still held (the semaphore code checks that for us). + */ + + v.file = mutex_get_lock_source(m, &v.line); + mutex_unlock(m); + + /* + * Tell the thread layer we're waiting on a condition variable so that + * we may process incoming signals even if we're not using the emulated + * semaphores, at the cost of spurious wakeups for all waiting threads. + */ + + v.element = thread_cond_waiting_element(c); + + /* + * Install a cleanup handler in case we are cancelled whilst waiting. + * + * An important requirement is that the mutex be re-acquired so that + * the enclosing cleanup handler be executed under the protection of + * the application mutex. + */ + + thread_cleanup_push(cond_wait_until_cleanup, &v); + +retry: + thread_cancel_test(); + + /* + * If we expired our waiting time, we'll try to acquire the semaphore + * nonetheless but without blocking. + * + * Otherwise we need to adjust down the waiting time to account for + * the time we spent sleeping already. + */ + + if (end != NULL) { + long remain; + + remain = tm_remaining_ms(end); + + if G_UNLIKELY(remain <= 0) { + awaked = semaphore_acquire_try(sem, 1); + goto signaled; + } + + tm_fill_ms(&waiting, remain); + } + + /* + * Wait here. + */ + + if (!semaphore_acquire(sem, 1, NULL == end ? NULL : &waiting)) { + /* + * There are only two errors we accept from the semaphore layer: + * + * EAGAIN: the semaphore operation timed out. + * EINTR: the operation was interrupted by a signal. + * + * Any other error is fatal. + */ + + if (EINTR == errno) + goto retry; + + if (errno != EAGAIN) + s_error("%s(): unable to get the semaphore: %m", G_STRFUNC); + + awaked = FALSE; /* EAGAIN indicates that we timed out */ + } else { + awaked = TRUE; + } + +signaled: + + /* + * Make sure the condition variable did not change whilst we were + * waiting on it. + * + * Because we do not own the mutex at this point, and the condition could + * be extended at any time between now and the time we attempt to re-grab + * the mutex, we need to be careful. + * + * On-the-fly extensions of a condition variable is only possible under + * rare circumstances, and we protect it with a global spinlock. We need + * to hold that lock until after we can lock the condition variable. + * + * Here we know there won't be any deadlock possible because the locking + * order is always the same: the global lock, then the condition variable. + */ + + spinlock(lock); /* Held until we grab cv->lock */ + + cv = *c; + + if G_UNLIKELY(COND_DESTROYED == cv) { + s_error("%s(): condition at %p destroyed whilst we were waiting", + G_STRFUNC, c); + } + + cond_check(cv); + + /* + * When a waiter is added on a condition variable, it is mutated into + * an extended condition if it was a simple one. In that case, a + * new variable is allocated hence the assertion below must take care + * of that. --RAM, 2015-02-22 + */ + + g_assert_log( + cv == v.cv || /* No change, still the same variable */ + (COND_EXT_MAGIC == cv->magic && COND_MAGIC == v.cv->magic && + cv->mutex == v.cv->mutex), /* Mutated by waiter addition */ + "%s(): condition at %p changed whilst waiting: " + "was %s%p, now %s%p, mutex=%p", + G_STRFUNC, c, COND_EXT_MAGIC == v.cv->magic ? "extended " : "", v.cv, + COND_EXT_MAGIC == cv->magic ? "extended " : "", cv, cv->mutex); + + g_assert(cv->sem == sem); + g_assert_log(cv->mutex == m, + "%s(): mutex changed in condition %p (used %p, now %p)", + G_STRFUNC, c, m, cv->mutex); + + /* + * In the unlikely case the condition was mutated, since we have validated + * that it was referring to the same mutex, update the cleanup variable. + * --RAM, 2015-02-22 + */ + + if G_UNLIKELY(cv != v.cv) { + struct cond *old_cv = v.cv; + atomic_int_inc(&cv->refcnt); /* Simulates cond_get_init() */ + v.cv = cv; + cond_free(old_cv, FALSE); + g_assert(cv->sem == sem); + g_assert(cv->mutex == m); + } + + /* + * If we were awoken (no timeout), then we consume a signal. + * + * If we timed out, we may have been sent a signal before we got a chance + * to decrement our waiting counter, and we will try to correct the + * situation later by adjusting the semaphore count before returning. + * + * Lock because we do not own the mutex yet and we want the whole + * section to be executed atomically with respect to the pending one + * in cond_wakeup(). + */ + + spinlock_swap(&cv->lock, lock); + spinunlock(lock); /* Critical section overlap */ + + if (awaked) { + if G_UNLIKELY(cv->generation == generation) { + /* Consumed a signal that was not for us */ + resend = cv->signals <= cv->waiting; + goto cannot_consume; + } + cv->signals--; /* Acknoweldge that a signal awaked us */ + } + + /* + * From here on, we're returning to user code. + */ + + cv->waiting--; + g_assert(cv->waiting >= 0); + + /* + * If we end-up having more pending signals than we have waiting threads, + * an earlier broadcasting sent too many signals, so we adjust the + * semaphore count using non-blocking operations to avoid spurious + * wakeups later. + */ + + if (cv->signals > cv->waiting) { + int extra = cv->signals - cv->waiting; + while (extra-- != 0 && semaphore_acquire_try(cv->sem, 1)) { + cv->signals--; /* Consumed one more signal */ + } + } + g_assert(cv->signals >= 0); + + spinunlock(&cv->lock); + + thread_cancel_test(); + thread_cleanup_pop(TRUE); /* Will reacquire the mutex */ + + return awaked; + +cannot_consume: + + /* + * We consumed a signal that was not for us. If there were more signals + * than waiters, we won't need to resend the signal we consumed. + */ + + if (!resend) + cv->signals--; /* We swallowed an extra signal */ + spinunlock(&cv->lock); + + if (resend) + semaphore_release(cv->sem, 1); + + /* + * Since we got a signal that was not for us, give the intended signal + * target a chance to process it before we go back to the contention + * wait along with them. + */ + + thread_yield(); + goto retry; +} + +/** + * Wait on condition, whose predicate is protected by given mutex. + * + * Upon entry, the mutex must be locked (normally, no hidden or fast locks + * are permitted). + * + * Upon return, the mutex is still locked but the application can re-check + * the predicate if we were awaken, or cleanup if a timeout occurred. + * + * All application errors are fatal (bugs) so the code does not need to + * bother with error conditions. + * + * @note + * This routine is a cancellation point. + * + * @param c the condition variable + * @param m the mutex protecting the predicate (locked normally) + * @param end absolute time when we must stop waiting (NULL = no limit) + * @param routine routine where cond_wait_until() is issued, for assertions + * @param file the file where the condition waiting routine is called + * @param line the line where the condition waiting routine is called + * + * @return FALSE if the wait expired, TRUE if we were awaken. + */ +bool +cond_wait_until_from(cond_t *c, mutex_t *m, const tm_t *end, + const char *routine, const char *file, unsigned line) +{ + cond_cancel_safe_check("cond_wait_until", routine, file, line); + return cond_wait_until(c, m, end); +} + +/** + * Wait on condition, whose predicate is protected by given mutex. + * + * Upon entry, the mutex must be locked (normally, no hidden or fast locks + * are permitted). + * + * Upon return, the mutex is still locked but the application can re-check + * the predicate if we were awaken, or cleanup if a timeout occurred. + * + * All application errors are fatal (bugs) so the code does not need to + * bother with error conditions. + * + * @note + * This routine is a cancellation point. + * + * @param c the condition variable + * @param m the mutex protecting the predicate (locked normally) + * @param timeout how long to wait for (NULL means no limit) + * @param routine routine where cond_timed_wait() is issued, for assertions + * @param file the file where the condition waiting routine is called + * @param line the line where the condition waiting routine is called + * + * @return FALSE if the wait expired, TRUE if we were awaken. + */ +bool +cond_timed_wait_from(cond_t *c, mutex_t *m, const tm_t *timeout, + const char *routine, const char *file, unsigned line) +{ + tm_t end; + + cond_cancel_safe_check("cond_timed_wait", routine, file, line); + + if (timeout != NULL) { + tm_now_exact(&end); + tm_add(&end, timeout); + } + + return cond_wait_until(c, m, NULL == timeout ? NULL : &end); +} + +static void +cond_waiter_signal(void *p, void *unused_data) +{ + waiter_t *w = p; + + (void) unused_data; + waiter_signal(w); +} + +/** + * Notify waiters on the extended condition that it got signaled. + * + * @param cve the extended condition listing all the waiters + * @param all whether all or just one waiter should be notified + */ +static void +cond_notify(struct cond_ext *cve, bool all) +{ + struct cond *cv = &cve->cond; + + spinlock(&cv->lock); + if (all) { + slist_foreach(cve->waiters, cond_waiter_signal, NULL); + } else { + waiter_t *w = slist_shift(cve->waiters); + if (w != NULL) { + slist_append(cve->waiters, w); + waiter_signal(w); + } + } + spinunlock(&cv->lock); +} + +/** + * Wake up one or all threads waiting on a condition. + * + * The condition variable object is freed at the end of the routine. + * + * @param cv the condition variable object + * @param m the mutex protecting the predicate (possibly locked) + * @param all if TRUE, all waiters are awakened, otherwise just one + */ +static void +cond_unblock(struct cond *cv, const mutex_t *m, bool all) +{ + int signals = 0; /* Amount of signals to send */ + + g_assert(cv != NULL); + + /* + * Even though we may own the mutex, we need to protect the condition + * variable with its lock because we have to be atomic with the + * corresponding critical section in cond_timed_wait(). + * + * If we have already sent more signals than there are waiting parties, + * we further limit the signals to avoid system calls in cond_timed_wait() + * to purge the extra signals: we can do it cheaply from here by simply + * avoiding sending them in the first place. + */ + + spinlock(&cv->lock); + + if G_UNLIKELY(NULL == cv->mutex) + cv->mutex = m; + + g_assert_log(cv->mutex == m, + "%s(): attempting to wakeup with different mutex (used %p, now %p)", + G_STRFUNC, cv->mutex, m); + + g_assert(cv->waiting >= 0); + + if (cv->waiting > 0 && cv->signals < cv->waiting) + signals = cv->waiting - cv->signals; + if (!all && signals != 0) + signals = 1; + cv->signals += signals; /* Now committed to send these signals */ + cv->generation++; /* Signal all current waiters */ + + spinunlock(&cv->lock); + + /* + * Posting of the signals to the semaphore can be done outside of the + * critical section. True, cv->signals was updated already but the + * pending critical section in cond_timed_wait() will attempt to consume + * the extra signals without blocking, stopping as soon as it cannot + * consume them any more. + */ + + if (signals != 0) + semaphore_release(cv->sem, signals); + + /* + * If the condition is extended, notify waiters that a signal was posted + * to the variable (regardless of whether we ended up sending signals at + * all). The waiters are not counted in cv->waiting because they are not + * blocked waiting for the condition but may be doing something else until + * the condition is signaled. + * + * When waiters will process the signal, they will need to acquire the + * mutex, check the predicate and decide whether they now want to block + * or whether they resume other activities, up to the next notification. + */ + + if (cond_is_extended(cv)) + cond_notify(cast_to_cond_ext(cv), all); + + cond_free(cv, FALSE); +} + +/** + * Wake up one or all threads waiting on a condition. + * + * @param c the condition variable + * @param m the mutex protecting the predicate (locked) + * @param all if TRUE, all waiters are awakened, otherwise just one + */ +static void +cond_wakeup(cond_t *c, const mutex_t *m, bool all) +{ + struct cond *cv; + + g_assert(c != NULL); + assert_mutex_is_owned(m); + + cv = cond_get_init(c, m, FALSE); + cond_unblock(cv, m, all); +} + +/** + * Wait on condition, whose predicate is protected by given mutex. + * + * Upon entry, the mutex must be locked (normally, no hidden or fast locks + * are permitted). + * + * Upon return, the mutex is still locked but the application can re-check + * the predicate. + * + * All application errors are fatal (bugs) so the code does not need to + * bother with error conditions. + * + * @note + * This routine is a cancellation point. + * + * @param c the condition variable + * @param m the mutex protecting the predicate (locked normally) + * @param routine routine where cond_wait() is issued, for assertions + * @param file the file where the condition waiting routine is called + * @param line the line where the condition waiting routine is called + */ +void +cond_wait_from(cond_t *c, mutex_t *m, + const char *routine, const char *file, unsigned line) +{ + cond_cancel_safe_check("cond_wait", routine, file, line); + cond_wait_until(c, m, NULL); +} + +/** + * Signal one waiting thread that it can wake up and re-evalute the predicate. + * + * Upon entry, the mutex must be locked. It is NOT unlocked. + * + * @param c the condition variable + * @param m the mutex protecting the predicate (locked) + */ +void +cond_signal(cond_t *c, const mutex_t *m) +{ + cond_wakeup(c, m, FALSE); +} + +/** + * Signal all waiting threads that they can wake up and re-evalute the + * predicate. + * + * Upon entry, the mutex must be locked. It is NOT unlocked. + * + * @param c the condition variable + * @param m the mutex protecting the predicate (locked) + */ +void +cond_broadcast(cond_t *c, const mutex_t *m) +{ + cond_wakeup(c, m, TRUE); +} + +/** + * Signal all waiting threads that they can wake up and re-evalute the + * predicate. + * + * This is used when attempting to wakeup all the waiting threads regardless + * of what the predicate value is, and may therefore cause spurious wakeups. + * The intend is to allow threads to process pending thread signals received + * whilst they are blocked waiting on the condition. + * + * This call should not be used when the predicate is changed, it is reserved + * to "outsiders". + * + * @param cv the condition variable + */ +void +cond_wakeup_all(cond_t cv) +{ + cond_check(cv); + + atomic_int_inc(&cv->refcnt); /* Counter cond_free() */ + cond_unblock(cv, cv->mutex, TRUE); /* Will issue a cond_free() */ +} + +/** + * Increase reference count on condition variable. + * + * @param c the condition variable + * + * @returns the ref-counter condition variable value, NULL on error. + */ +cond_t +cond_refcnt_inc(cond_t *c) +{ + if G_UNLIKELY(NULL == c) + return NULL; + + return cond_get(c); +} + +/** + * Decrease reference count on condition variable value. + */ +void +cond_refcnt_dec(cond_t cv) +{ + cond_check(cv); + + cond_free(cv, FALSE); +} + +/** + * List iterator callback to wakeup all waiting parties on the condition. + */ +static void +cond_vars_wakeup(void *item, void *unused_data) +{ + struct cond *cv = item; + + cond_check(cv); + (void) unused_data; + + /* + * Must increase the reference count since cond_unblock() is going + * to call cond_free() before returning. + */ + + atomic_int_inc(&cv->refcnt); + cond_unblock(cv, cv->mutex, TRUE); +} + +/** + * Callback invoked when a time adjustment has been detected. + * + * @param unused_delta delta, in ms + */ +static void +cond_time_adjust(int unused_delta) +{ + (void) unused_delta; + + COND_VARS_LOCK; + elist_foreach(&cond_vars, cond_vars_wakeup, NULL); + COND_VARS_UNLOCK; +} + +/** + * Default cleanup handler. + */ +static void +cond_cleanup_mutex(void *arg) +{ + mutex_t *m = arg; + + mutex_unlock(m); +} + +/** + * Wait on condition, whose predicate is protected by given mutex. + * + * This is a normal cond_wait_until() which installs a simple cleanup handler + * to unlock the mutex should the thread be cancelled. + * + * @note + * This routine is a cancellation point. + * + * @param c the condition variable + * @param m the mutex protecting the predicate (locked normally) + * @param end absolute time when we must stop waiting (NULL = no limit) + * + * @return FALSE if the wait expired, TRUE if we were awaken. + */ +bool +cond_wait_until_clean(cond_t *c, mutex_t *m, const tm_t *end) +{ + bool cancelable = thread_is_cancelable(); + bool result; + + if (cancelable) + thread_cleanup_push(cond_cleanup_mutex, m); + + result = cond_wait_until(c, m, end); + + if (cancelable) + thread_cleanup_pop(FALSE); + + return result; +} + +/** + * Wait on condition, whose predicate is protected by given mutex. + * + * This is a normal cond_timed_wait() which installs a simple cleanup handler + * to unlock the mutex should the thread be cancelled. + * + * @note + * This routine is a cancellation point. + * + * @param c the condition variable + * @param m the mutex protecting the predicate (locked normally) + * @param timeout how long to wait for (NULL means no limit) + * + * @return FALSE if the wait expired, TRUE if we were awaken. + */ +bool +cond_timed_wait_clean(cond_t *c, mutex_t *m, const tm_t *timeout) +{ + tm_t end; + + if (timeout != NULL) { + tm_now_exact(&end); + tm_add(&end, timeout); + } + + return cond_wait_until_clean(c, m, NULL == timeout ? NULL : &end); +} + +/** + * Wait on condition, whose predicate is protected by given mutex. + * + * This is a normal cond_wait() which installs a simple cleanup handler + * to unlock the mutex should the thread be cancelled. + * + * @note + * This routine is a cancellation point. + * + * @param c the condition variable + * @param m the mutex protecting the predicate (locked normally) + */ +void +cond_wait_clean(cond_t *c, mutex_t *m) +{ + cond_wait_until_clean(c, m, NULL); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/cond.h
Added
@@ -0,0 +1,174 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Condition waiting. + * + * A condition object is simply tracking how many threads are interested in + * some event. That event is not expressed in the condition itself but is + * a predicate that each waiting party evaluates to determine whether they + * need to continue waiting or whether they can proceed. + * + * One thread will at some point set the environment so that the predicate + * can evaluate to true, and then it will be responsible for waking up + * either one thread or all the waiting threads. + * + * Before waiting on a condition, a mutex needs to be held. That mutex is + * protecting the predicate. Waiting will atomically register the thread + * as waiting and will then of course release the mutex. When a thread is + * awaken, the mutex is grabbed again before exiting the waiting call. Hence + * from the thread's perspective, the waiting call is "transparent". + * + * When several threads are awoken by a broadcast, the predicate can become + * false again before the thread gets a chance to evaluate it. This is called + * a "spurious wakeup". Therefore, each waiting thread should wait using a + * loop construct as outlined by this pseudo code: + * + * <lock mutex> + * while (!<predicate>) { + * cond_wait(<cond>, <mutex>); + * } + * ... <predicate> now true, <mutex> is owned ... + * ... axe grinding ... + * <unlock mutex> + * + * The first cond_wait() done on a condition variable irremediably binds it + * to that mutex. Further callers will have to supply the same mutex or a + * fatal error will occur. Since it is necessary to hold the mutex whilst the + * predicate is evaluated, the cond_wait() call cannot grab the mutex. + * + * The waking party must use the following code construct to avoid race + * conditions: + * + * <lock mutex> + * set <predicate> to true + * cond_signal(<cond>, <mutex>); -- or cond_broadcast() + * <unlock mutex> + * + * Note the presence of the mutex in the cond_signal() call. This enables + * assertion checking, making sure this is the same mutex as the one used + * by waiters, and that it is still held. Since there can be some code after + * the cond_signal() and before the release of the mutex, cond_signal() is + * not taking care of releasing the mutex. + * + * Here is our API: + * + * cond_init() -- setup condition + * cond_wait() -- wait + * cond_timed_wait() -- wait for some time + * cond_signal() -- signals one waiter + * cond_broadcast() -- signals all waiters + * cond_destroy() -- destroy condition, waking all waiting threads + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _cond_h_ +#define _cond_h_ + +/* + * @attention + * In order to keep the condition variable totally opaque to user code, + * yet allow static initializations to be performed, the cond_t type is + * NOT an expanded type but a pointer. + */ + +struct cond; +typedef struct cond * cond_t; + +#define COND_INIT ((cond_t) 1) /**< Perform auto-init */ +#define COND_DESTROYED ((cond_t) -1) /**< Destroyed, cannot be used */ + +/* + * Internal. + */ + +#ifdef THREAD_SOURCE +cond_t cond_refcnt_inc(cond_t *c); +void cond_refcnt_dec(cond_t cv); +void cond_wakeup_all(cond_t cv); +#endif /* THREAD_SOURCE */ + + +/* + * Public interface. + */ + +struct lmutex; +struct tmval; +struct waiter; + +void cond_init(cond_t *c, const struct lmutex *m); +void cond_init_full(cond_t *c, const struct lmutex *m, bool emulated); +void cond_destroy(cond_t *c); +bool cond_reset(cond_t *c); +bool cond_timed_wait_from(cond_t *c, struct lmutex *m, + const struct tmval *timeout, + const char *routine, const char *file, unsigned line); +bool cond_wait_until_from(cond_t *c, struct lmutex *m, + const struct tmval *abstime, + const char *routine, const char *file, unsigned line); +void cond_wait_from(cond_t *c, struct lmutex *m, + const char *routine, const char *file, unsigned line); +void cond_signal(cond_t *c, const struct lmutex *m); +void cond_broadcast(cond_t *c, const struct lmutex *m); + +size_t cond_vars_count(void); + +size_t cond_waiting_count(const cond_t * const c); +size_t cond_signal_count(const cond_t * const c); +size_t cond_pending_count(const cond_t * const c); + +void cond_waiter_add(cond_t *c, struct waiter *w); +bool cond_waiter_remove(cond_t *c, struct waiter *w); + +/* + * Macros trapping access to condition waiting calls to make sure there is + * a cleanup handler installed when used from a cancelable thread. + */ + +#define cond_wait(c,m) \ + cond_wait_from((c), (m), G_STRFUNC, _WHERE_, __LINE__) + +#define cond_wait_until(c,m,t) \ + cond_wait_until_from((c), (m), (t), G_STRFUNC, _WHERE_, __LINE__) + +#define cond_timed_wait(c,m,t) \ + cond_timed_wait_from((c), (m), (t), G_STRFUNC, _WHERE_, __LINE__) + +/* + * Condition waiting calls which install a default cleanup routine to unlock + * the mutex should the thread be cancelled. + */ + +void cond_wait_clean(cond_t *, struct lmutex *); +bool cond_timed_wait_clean(cond_t *, struct lmutex *, const struct tmval *); +bool cond_wait_until_clean(cond_t *, struct lmutex *, const struct tmval *); + +#endif /* _cond_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/constants.c
Added
@@ -0,0 +1,88 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Constant value management. + * + * Constants are atomic values that do not need to be reference-counted because + * their lifetime is that of the program. + * + * Like atoms, they are allocated only once in memory and all constants with + * the same value bear the same address. + * + * Unlike atoms however, they are enforced read-only values. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#include "constants.h" +#include "hashing.h" +#include "hashtable.h" +#include "omalloc.h" +#include "spinlock.h" + +#include "override.h" /* Must be the last header included */ + +static hash_table_t *constant_strings; + +/** + * @return a constant read-only string. + */ +const char * +constant_str(const char *s) +{ + static spinlock_t constant_slk = SPINLOCK_INIT; + const char *v; + + if G_UNLIKELY(NULL == constant_strings) { + spinlock(&constant_slk); + if (NULL == constant_strings) { + constant_strings = + hash_table_new_full_not_leaking(string_mix_hash, string_eq); + hash_table_thread_safe(constant_strings); + } + spinunlock(&constant_slk); + } + + v = hash_table_lookup(constant_strings, s); + + if G_UNLIKELY(NULL == v) { + hash_table_lock(constant_strings); + v = hash_table_lookup(constant_strings, s); + if G_LIKELY(NULL == v) { + v = ostrdup_readonly(s); + hash_table_insert(constant_strings, v, v); + } + hash_table_unlock(constant_strings); + } + + return v; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/constants.h
Added
@@ -0,0 +1,45 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Constant value management. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _constants_h_ +#define _constants_h_ + +/* + * Public interface. + */ + +const char *constant_str(const char *s); + +#endif /* _constants_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/cpufreq.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/cpufreq.c
Changed
@@ -45,11 +45,11 @@ * * @return minimum frequency in Hz, 0 if not supported. */ -guint64 +uint64 cpufreq_min(void) { - static guint64 freq; - static guchar done; + static uint64 freq; + static uchar done; if (done) return freq; @@ -76,11 +76,11 @@ * * @return maximum frequency in Hz, 0 if not supported. */ -guint64 +uint64 cpufreq_max(void) { - static guint64 freq; - static guchar done; + static uint64 freq; + static uchar done; if (done) return freq; @@ -102,11 +102,11 @@ * * @return current frequency in Hz, 0 if not supported. */ -guint64 +uint64 cpufreq_current(void) { - static guchar supported = TRUE; - guint64 freq; + static uchar supported = TRUE; + uint64 freq; if (!supported) return 0;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/cpufreq.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/cpufreq.h
Changed
@@ -34,9 +34,9 @@ #ifndef _cpufreq_h_ #define _cpufreq_h_ -guint64 cpufreq_min(void); -guint64 cpufreq_max(void); -guint64 cpufreq_current(void); +uint64 cpufreq_min(void); +uint64 cpufreq_max(void); +uint64 cpufreq_current(void); #endif /* _cpufreq_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/cq.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/cq.c
Changed
@@ -34,41 +34,101 @@ #include "common.h" -#include "atoms.h" #include "cq.h" -#include "glib-missing.h" -#include "halloc.h" + +#include "atoms.h" +#include "buf.h" +#include "elist.h" +#include "entropy.h" +#include "hashing.h" /* For integer_hash_fast() */ +#include "hset.h" #include "log.h" -#include "misc.h" +#include "mutex.h" +#include "once.h" +#include "pow2.h" +#include "pslist.h" +#include "spinlock.h" +#include "stacktrace.h" +#include "stringify.h" +#include "thread.h" #include "tm.h" +#include "tsig.h" #include "walloc.h" +#include "xmalloc.h" + #include "override.h" /* Must be the last header included */ -static void cq_run_idle(cqueue_t *cq); +#define CQ_IDLE_FORCE 30 /* Force idle callbacks once every 30 seconds */ +#define CQ_IDLE_PERIOD 1 /* Minimal period in seconds for idle callbacks */ + +static size_t cq_run_idle(cqueue_t *cq); -static const guint32 *cq_debug_ptr; -static inline guint32 cq_debug(void) { return *cq_debug_ptr; } +static uint32 cq_debug_ptr_default; +static const uint32 *cq_debug_ptr = &cq_debug_ptr_default; +static inline uint32 cq_debug(void) { return *cq_debug_ptr; } -enum cevent_magic { CEVENT_MAGIC = 0x40110172U }; +#define cq_debugging(lvl) G_UNLIKELY(cq_debug() > (lvl)) + +enum cevent_magic { + CEVENT_MAGIC = 0x40110172, + CEVENT_EXT_MAGIC = 0x6a8fe830 +}; /** * Callout queue event. */ struct cevent { enum cevent_magic ce_magic; /**< Magic number (must be at the top) */ + cq_time_t ce_time; /**< Absolute trigger time (virtual cq time) */ struct cevent *ce_bnext; /**< Next item in hash bucket */ struct cevent *ce_bprev; /**< Prev item in hash bucket */ cqueue_t *ce_cq; /**< Callout queue where event is registered */ cq_service_t ce_fn; /**< Callback routine */ - gpointer ce_arg; /**< Argument to pass to said callback */ - cq_time_t ce_time; /**< Absolute trigger time (virtual cq time) */ + void *ce_arg; /**< Argument to pass to said callback */ }; static inline void cevent_check(const struct cevent * const ce) { g_assert(ce); - g_assert(CEVENT_MAGIC == ce->ce_magic); + g_assert(CEVENT_MAGIC == ce->ce_magic || CEVENT_EXT_MAGIC == ce->ce_magic); +} + +/** + * Callout queue extended event. + * + * An extended event is created when the thread registering the event is not + * the one running the callout queue: since destruction / scheduling of the + * event can occur concurrently, we need an extra layer of protection. + * + * Structural equivalence guarantees that we can use an extended event as + * a regular event as long as we don't need to access the extra fields. + * + * An extended event is created by cq_insert() (or any wrapping convenience + * routine) when the caller is not the thread that runs the queue, and the + * caller will need to keep a reference on the created event. + * + * The caller will need to explictly call cq_cancel() to free the event, + * regardless of whether it was already scheduled, unless it does not call + * cq_zero(), in which case it will be freed upon return. This would happen + * if the caller does not (need to) remember the value returned by cq_insert(). + */ +struct cevent_ext { + struct cevent event; + int cex_refcnt; /**< Reference count */ +}; + +static inline ALWAYS_INLINE struct cevent_ext * +cast_to_cevent_ext(const cevent_t *ce) +{ + g_assert(CEVENT_EXT_MAGIC == ce->ce_magic); + return (struct cevent_ext *) ce; +} + +static inline ALWAYS_INLINE bool +cevent_is_extended(const cevent_t *ce) +{ + return CEVENT_EXT_MAGIC == ce->ce_magic; } /** @@ -113,12 +173,21 @@ const char *cq_name; /**< Queue name, for logging */ struct chash *cq_hash; /**< Array of buckets for hash list */ struct chash *cq_current; /**< Current bucket scanned in cq_clock() */ - GHashTable *cq_periodic; /**< Periodic events registered */ - GHashTable *cq_idle; /**< Idle events registered */ + elist_t cq_periodic; /**< Periodic events registered */ + hset_t *cq_idle; /**< Idle events registered */ + const cevent_t *cq_call; /**< Event being called out, for cq_zero() */ + size_t cq_triggered; /**< Events triggered */ + unsigned cq_stid; /**< Thread where callout queue runs */ int cq_ticks; /**< Number of cq_clock() calls processed */ int cq_items; /**< Amount of recorded events */ int cq_last_bucket; /**< Last bucket slot we were at */ int cq_period; /**< Regular callout period, in ms */ + uint8 cq_call_extended; /**< Is cq_call an extended event? */ + time_t cq_last_idle; /**< Last time we ran the idle callbacks */ + mutex_t cq_lock; /**< Thread-safety for queue changes */ + mutex_t cq_idle_lock; /**< Protects idle callbacks */ + spinlock_t cq_periodic_lock;/**< Protects cq_periodic */ + link_t lk; /**< Embedded link to list all queues */ }; static inline void @@ -140,7 +209,80 @@ #define EV_HASH(x) (((x) >> 5) & HASH_MASK) #define EV_OVER(x) (((x) >> 5) & ~HASH_MASK) -cqueue_t *callout_queue; +/** + * Locking of the callout queue for short period of time, in sections that + * do not encompass memory allocation or do not call other routines that may + * take other locks. These locks can be "hidden" and therefore faster because + * they do not involve the lock tracking logic. + */ +#define CQ_LOCK(q) mutex_lock_hidden(&(q)->cq_lock) +#define CQ_UNLOCK(q) mutex_unlock_hidden(&(q)->cq_lock) + +/** + * All the callout queues are linked together so that we can collect statistics + * about them. + */ +static elist_t cq_vars = ELIST_INIT(offsetof(cqueue_t, lk)); +static spinlock_t cq_vars_slk = SPINLOCK_INIT; + +#define CQ_VARS_LOCK spinlock(&cq_vars_slk) +#define CQ_VARS_UNLOCK spinunlock(&cq_vars_slk) + +static cqueue_t *callout_queue; /**< The main callout queue */ +static once_flag_t cq_global_inited; /**< Records global initialization */ +static void cq_global_init(void); + +/** + * Add a new callout queue to the global list. + */ +static void +cq_vars_add(cqueue_t *cq) +{ + cqueue_check(cq); + + CQ_VARS_LOCK; + elist_append(&cq_vars, cq); + CQ_VARS_UNLOCK; +} + +/** + * Remove callout queue from the list. + */ +static void +cq_vars_remove(cqueue_t *cq) +{ + cqueue_check(cq); + + CQ_VARS_LOCK; + elist_remove(&cq_vars, cq); + CQ_VARS_UNLOCK; +} + +static inline ALWAYS_INLINE void +cq_main_init(void) +{ + ONCE_FLAG_RUN(cq_global_inited, cq_global_init); +} + +/** + * @return the main callout queue. + */ +cqueue_t * +cq_main(void) +{ + cq_main_init(); + return callout_queue; +} + +/** + * @return the thread ID running the main callout queue. + */ +unsigned +cq_main_thread_id(void) +{ + cq_main_init(); + return callout_queue->cq_stid; +} /** * Initialize newly created callout queue object. @@ -160,13 +302,15 @@ cq->cq_magic = CQUEUE_MAGIC; cq->cq_name = atom_str_get(name); - cq->cq_hash = halloc0(HASH_SIZE * sizeof *cq->cq_hash); - cq->cq_items = 0; - cq->cq_ticks = 0; + XMALLOC0_ARRAY(cq->cq_hash, HASH_SIZE); cq->cq_time = now; cq->cq_last_bucket = EV_HASH(now); - cq->cq_current = NULL; cq->cq_period = period; + cq->cq_stid = THREAD_INVALID_ID; + mutex_init(&cq->cq_lock); + mutex_init(&cq->cq_idle_lock); + spinlock_init(&cq->cq_periodic_lock); + tm_now_exact(&cq->cq_last_heartbeat); cqueue_check(cq); return cq; @@ -187,7 +331,10 @@ cqueue_t *cq; WALLOC0(cq); - return cq_initialize(cq, name, now, period); + cq_initialize(cq, name, now, period); + cq_vars_add(cq); + + return cq; } /** @@ -196,6 +343,7 @@ int cq_count(const cqueue_t *cq) { + cqueue_check(cq); return cq->cq_items; } @@ -205,6 +353,7 @@ int cq_ticks(const cqueue_t *cq) { + cqueue_check(cq); return cq->cq_ticks; } @@ -214,10 +363,94 @@ const char * cq_name(const cqueue_t *cq) { + cqueue_check(cq); return cq->cq_name; } /** + * Fetch the callout queue associated with the event. + * + * @return the callout queue (locked) associated with the event. + */ +static cqueue_t * +EV_CQ_LOCK(const cevent_t *ev) +{ + cqueue_t *cq; + + cevent_check(ev); + + /* + * An extended event is referenced twice: once by the callout queue + * while it is linked into its bucket, awaiting trigger, and once by + * the thread that registered the event. + * + * This prevents freing race conditions since both parties need to + * stop referencing the event before we dispose of the structure, + * bringing a guarantee that each side can call this routine freely + * without fear of accessing memory that has been reused for something + * else. + * + * Locking the queue is the minimum synchronization required, since both + * sides will call this routine before handling the event. + */ + + cq = ev->ce_cq; + cqueue_check(cq); + + CQ_LOCK(cq); + return cq; +} + +/** + * Did the event trigger? + */ +static bool +ev_triggered(const cevent_t *ev) +{ + /* + * An extended event is referenced at most twice: by the thread that + * registered it and by the callout queue. + * + * When the callout queue triggers the event, it ceases to reference the + * event, and therefore we can know that the event was fired when its + * reference count is only one. + * + * A regular event has necessarily not fired or it would have been freed. + */ + + if G_UNLIKELY(cevent_is_extended(ev)) { + const struct cevent_ext *evx = cast_to_cevent_ext(ev); + g_assert(evx->cex_refcnt <= 2); + return 1 == evx->cex_refcnt; + } + + return FALSE; +} + +/** + * Free callout queue event. + */ +static void +ev_free(cevent_t *ev) +{ + cevent_check(ev); + + /* + * There is no need to have a lock on the callout queue to call this + * routine. + */ + + if G_UNLIKELY(cevent_is_extended(ev)) { + ev->ce_magic = 0; + wfree(ev, sizeof(struct cevent_ext)); + } else { + g_assert(CEVENT_MAGIC == ev->ce_magic); + ev->ce_magic = 0; + WFREE(ev); + } +} + +/** * Link event into the callout queue. */ static void @@ -233,6 +466,7 @@ cq = ev->ce_cq; cqueue_check(cq); g_assert(ev->ce_time > cq->cq_time || cq->cq_current); + assert_mutex_is_owned(&cq->cq_lock); trigger = ev->ce_time; cq->cq_items++; @@ -325,6 +559,7 @@ cevent_check(ev); cq = ev->ce_cq; cqueue_check(cq); + assert_mutex_is_owned(&cq->cq_lock); ch = &cq->cq_hashEV_HASH(ev->ce_time); cq->cq_items--; @@ -348,6 +583,43 @@ } /** + * Internal initialization and insertion of event in the callout queue. + * + * @param cq the callout queue + * @param ev the allocated event + * @param delay the delay, expressed in cq's "virtual time" (see cq_clock) + * @param fn the callback function + * @param arg the argument to be passed to the callback function + * + * @returns the event handle. + */ +static cevent_t * +cq_insert_internal(cqueue_t *cq, cevent_t *ev, + int delay, cq_service_t fn, void *arg) +{ + cqueue_check(cq); + cevent_check(ev); + g_assert(fn); + g_assert(delay >= 0); + + ev->ce_fn = fn; + ev->ce_arg = arg; + ev->ce_cq = cq; + + /* + * For performance reasons, use hidden locks: we know the ev_link() + * routine is not going to take locks, so it is safe. + */ + + CQ_LOCK(cq); + ev->ce_time = cq->cq_time + delay; + ev_link(ev); + CQ_UNLOCK(cq); + + return ev; +} + +/** * Insert a new event in the callout queue and return an opaque handle that * can be used to cancel the event. * @@ -355,32 +627,119 @@ * time we shall call fn(cq, arg), where cq is the callout queue from * where we triggered, and arg is an additional argument. * + * The call will happen from the thread that runs the callout queue, not + * necessarily from * the thread that is registering this event (which could + * be a "foreign" thread). + * + * Regardless of whether the call is triggered, the registering thread will + * need to run cq_cancel() on the event handle returned to clean it up. + * * @param cq The callout queue * @param delay The delay, expressed in cq's "virtual time" (see cq_clock) * @param fn The callback function * @param arg The argument to be passed to the callback function * - * @returns the handle, or NULL on error. + * @returns the event handle. */ cevent_t * -cq_insert(cqueue_t *cq, int delay, cq_service_t fn, gpointer arg) +cq_insert(cqueue_t *cq, int delay, cq_service_t fn, void *arg) { cevent_t *ev; /* Event to insert */ + /* + * If we are called from a "foreign" thread, i.e. not from the thread + * that runs the callout queue, we create extended events. + */ + + if (thread_small_id() != cq->cq_stid) { + struct cevent_ext *evx; /* Event to insert */ + + /* + * The exented event is reference-counted: at creation time, it is + * supposed to be * referenced by the queue and by the thread, which + * will keep the returned value in a variable. + */ + + WALLOC(evx); + ev = &evx->event; + ev->ce_magic = CEVENT_EXT_MAGIC; + evx->cex_refcnt = 2; /* One by queue, one by thread */ + } else { + WALLOC(ev); + ev->ce_magic = CEVENT_MAGIC; + } + + return cq_insert_internal(cq, ev, delay, fn, arg); +} + +/** + * Zero pointer referring to the current event being dispatched. + * + * This is the preferred way of zeroing a reference to the event because it + * checks that this is indeed the event being dispatched. It can only be + * called from a callout callback. + * + * It can be used on normal or extended events (registrations from a foreign + * thread). It must only be called once per event, but client code should not + * keep multiple references to the same event anyway or they would have no way + * to track which ones have triggered. + * + * If the callback does not call cq_zero(), then it means it does not hold any + * reference to the event being triggered and therefore the event will be + * freed immediately upon return. + * + * If cq_zero() is called, it means a reference to the event was kept and + * cq_cancel() will be called. Note that cq_zero() only clears the reference + * to a normal event, not a foreign event. + * + * @param cq the callout queue that dispatched the event + * @param ev_ptr reference to the event + */ +void +cq_zero(cqueue_t *cq, cevent_t **ev_ptr) +{ + cevent_t *ev; + cqueue_check(cq); - g_assert(fn); - g_assert(delay >= 0); + g_assert(ev_ptr != NULL); - WALLOC(ev); - ev->ce_magic = CEVENT_MAGIC; - ev->ce_time = cq->cq_time + delay; - ev->ce_fn = fn; - ev->ce_arg = arg; - ev->ce_cq = cq; + ev = *ev_ptr; + CQ_LOCK(cq); - ev_link(ev); + /* + * One nice side effect of calling cq_zero() is that we can assert that + * the proper reference is being cleared, namely the one referring to + * the event being dispatched. + * + * Note that for external events, it is perfectly possible to get a NULL + * "ev" at this point: if the item is dispatched before the event address + * was returned to the calling thread to be stored in "ev_ptr". + */ - return ev; + g_assert_log(cq->cq_call != NULL, + "%s() can only be called once on a given event", G_STRFUNC); + + g_assert_log(ev == cq->cq_call || (NULL == ev && cq->cq_call_extended), + "%s() not called on current event: %p points to ev=%p, current is %s%p", + G_STRFUNC, ev_ptr, ev, cq->cq_call_extended ? "foreign " : "", + cq->cq_call); + + cq->cq_call = NULL; /* cq_zero() can only be called once */ + + /* + * If the event was not extended, we need to nullify its reference + * so that cq_cancel() will do nothing: the event was already freed. + * + * If the event is extended, we will let cq_cancel() do the cleanup. + * That way, there is no race condition between the callout queue thread + * and the thread that keeps a reference to the event. + */ + + if G_LIKELY(!cq->cq_call_extended) { + *ev_ptr = NULL; + } + + CQ_UNLOCK(cq); } /** @@ -390,43 +749,104 @@ * If the de-referenced value is NULL, it is assumed the event has already * fired and therefore there is nothing to cancel. * - * @note - * This routine is also used internally to remove an expired event from - * the list before firing it off. + * @return TRUE if the event has already triggered (possible if the thread + * recording the event is not the same as the one running the callout queue). */ -void +bool cq_cancel(cevent_t **handle_ptr) { cevent_t *ev = *handle_ptr; + bool triggered = FALSE; - if (ev) { + if (ev != NULL) { cqueue_t *cq; - cevent_check(ev); - cq = ev->ce_cq; - cqueue_check(cq); - g_assert(cq->cq_items > 0); + /* + * For performance reasons, we use hidden mutexes: the ev_unlink() + * routine is not using locks so there is no potential for deadlocks. + */ - ev_unlink(ev); - ev->ce_magic = 0; /* Prevent further use as a valid event */ - WFREE(ev); + cq = EV_CQ_LOCK(ev); + + if G_LIKELY(!ev_triggered(ev)) { + g_assert(cq->cq_items > 0); + ev_unlink(ev); + } else { + triggered = TRUE; + } + + CQ_UNLOCK(cq); + ev_free(ev); *handle_ptr = NULL; } + + return triggered; +} + +/** + * Clear event if it already triggered. + * + * A thread registering an event that is dispatched in another thread can + * always have a doubt whether the event has triggered upon return. + * + * This routine will atomically verify whether the event has been triggered + * and will reclaim it if it has, zeroing the pointer. Otherwise, nothing + * happens, i.e. the event is NOT cancelled. + * + * @return TRUE if the event has triggered already. + */ +bool +cq_zero_if_triggered(cevent_t **ev_ptr) +{ + cevent_t *ev = *ev_ptr; + bool triggered = FALSE; + + if (ev != NULL) { + cqueue_t *cq; + + /* + * For performance reasons, we use hidden mutexes. + */ + + cq = EV_CQ_LOCK(ev); + + if G_UNLIKELY(ev_triggered(ev)) + triggered = TRUE; + + CQ_UNLOCK(cq); + + if G_UNLIKELY(triggered) { + ev_free(ev); + *ev_ptr = NULL; + } + } + + return triggered; } /** * Reschedule event at some other point in time. It is the responsibility * of the user code to determine that the handle for the event has not yet * expired, i.e. that the event has not triggered yet. + * + * For extended events, returns FALSE if the event has already triggered + * before we could reschedule it. It still needs to be cancelled explicitly + * by the thread that registered it. + * + * @return TRUE if event was rescheduled. */ -void +bool cq_resched(cevent_t *ev, int delay) { cqueue_t *cq; - cevent_check(ev); - cq = ev->ce_cq; - cqueue_check(cq); + cq = EV_CQ_LOCK(ev); + + if G_UNLIKELY(ev_triggered(ev)) { + CQ_UNLOCK(cq); + s_carp("%s() called on already triggered event", G_STRFUNC); + return FALSE; + } /* * If is perfectly possible that whilst running cq_clock() and @@ -438,66 +858,193 @@ /* * Events are sorted into the callout queue by trigger time, and are also - * put into an hash list depending on that trigger time. + * put into a hash list depending on that trigger time. * * Therefore, since we are updating the trigger time, we need to remove * the event from the queue lists first, update the firing delay, and relink * the event. It's possible that it will end up being relinked at the exact * same place, but determining that in advance would probably cost as much * as doing the unlink/link blindly anyway. + * + * For performance reasons, use hidden locks: we know the ev_link() and + * ev_unlink() routines are not going to take locks, so it is safe. */ ev_unlink(ev); ev->ce_time = cq->cq_time + delay; ev_link(ev); + CQ_UNLOCK(cq); + + return TRUE; +} + +/** + * What is the remaining (virtual) time until a given event expires? + */ +cq_time_t +cq_remaining(const cevent_t *ev) +{ + bool triggered = FALSE; + cqueue_t *cq; + cq_time_t remaining; + + cq = EV_CQ_LOCK(ev); + + if G_UNLIKELY(ev_triggered(ev)) { + triggered = TRUE; + remaining = 0; + } else if (ev->ce_time <= cq->cq_time) { + remaining = 0; + } else { + remaining = ev->ce_time - cq->cq_time; + } + + CQ_UNLOCK(cq); + + if G_UNLIKELY(triggered) { + s_carp("%s() called on already triggered event", G_STRFUNC); + } + + return remaining; +} + +/** + * Expire timeout by removing it from the queue and firing its callback. + */ +static void +cq_expire_internal(cqueue_t *cq, cevent_t *ev) +{ + cq_service_t fn; + void *arg; + + assert_mutex_is_owned(&cq->cq_lock); + + /* + * Remove event from queue before firing. + * + * If it is an extended event, mark it as fired but do not free it. + * The caller who inserted that foreign event will have to call cq_cancel() + * to free it. Since the callout queue is locked, there cannot be any + * race condition with the event: it cannot be cancelled now. + */ + + ev_unlink(ev); + + fn = ev->ce_fn; + arg = ev->ce_arg; + + if G_UNLIKELY(cevent_is_extended(ev)) { + struct cevent_ext *evx = cast_to_cevent_ext(ev); + g_assert(2 == evx->cex_refcnt); /* Not fired nor canceled yet */ + evx->cex_refcnt--; /* Was fired */ + cq->cq_call_extended = TRUE; + } else { + ev_free(ev); + cq->cq_call_extended = FALSE; + } + + /* + * Record the address of the event being dispatched. Even though it may + * have been freed, we allow one cq_zero() call on it. + */ + + cq->cq_call = ev; + cq->cq_triggered++; + + /* + * All the callout queue data structures were updated. + * It is now safe to invoke the callback, even if there is some + * re-entry to the same callout queue. + * + * The called-out routine may invoke cq_zero() to zero pointers + * to the event being dispatched. + */ + + g_assert(fn != NULL); + + CQ_UNLOCK(cq); + (*fn)(cq, arg); /* Callback invoked with queue unlocked */ + CQ_LOCK(cq); + + /* + * If the event was extended and they did not call cq_zero(), + * then we assume they do not own any reference on the event to + * call cq_cancel(), and therefore we need to free the event + * immediately. + */ + + if G_UNLIKELY(cq->cq_call_extended && NULL != cq->cq_call) { + if (cq_debugging(0)) { + s_debug("CQ called-out %s() did not to call cq_zero() on event %p", + stacktrace_function_name(fn), ev); + } + ev_free(ev); + } } -/** - * What is the remaining (virtual) time until a given event expires? - */ -cq_time_t -cq_remaining(const cevent_t *ev) -{ - cqueue_t *cq; +/** + * Expire timeout by removing it from the queue and firing its callback. + * + * @return TRUE if we triggered the event, FALSE if it had already triggered + * (only possible for events registered by other threads). + */ +bool +cq_expire(cevent_t *ev) +{ + cqueue_t *cq; + const cevent_t *saved_call; + bool saved_call_extended; + + cq = EV_CQ_LOCK(ev); + + if G_UNLIKELY(ev_triggered(ev)) { + CQ_UNLOCK(cq); + s_carp("%s() called on already triggered event", G_STRFUNC); + return FALSE; + } + + /* + * To allow cq_expire() calls from a callout event, we need to save and + * restore the current call being made so that cq_zero() can work properly. + */ + + saved_call = cq->cq_call; + saved_call_extended = cq->cq_call_extended; + + cq_expire_internal(cq, ev); - cevent_check(ev); - cq = ev->ce_cq; - cqueue_check(cq); + cq->cq_call = saved_call; + cq->cq_call_extended = saved_call_extended; - if (ev->ce_time <= cq->cq_time) - return 0; + CQ_UNLOCK(cq); - return ev->ce_time - cq->cq_time; + return TRUE; } /** - * Expire timeout by removing it out of the queue and firing its callback. + * Change callback and argument of an existing event. + * + * @return TRUE if we were able to change the event, FALSE if the event + * had already triggered (only possible for events registered by other threads). */ -void -cq_expire(cevent_t *ev) +bool +cq_replace(cevent_t *ev, cq_service_t fn, void *arg) { cqueue_t *cq; - cq_service_t fn; - gpointer arg; - cevent_check(ev); - cq = ev->ce_cq; - cqueue_check(cq); - - fn = ev->ce_fn; - arg = ev->ce_arg; - - g_assert(fn); + cq = EV_CQ_LOCK(ev); - cq_cancel(&ev); /* Remove event from queue before firing */ + if G_UNLIKELY(ev_triggered(ev)) { + CQ_UNLOCK(cq); + s_carp("%s() called on already triggered event", G_STRFUNC); + return FALSE; + } - /* - * All the callout queue data structures were updated. - * It is now safe to invoke the callback, even if there is some - * re-entry to the same callout queue. - */ + ev->ce_fn = fn; + ev->ce_arg = arg; + CQ_UNLOCK(cq); - (*fn)(cq, arg); + return TRUE; } /** @@ -506,22 +1053,28 @@ * Called to notify us about the elapsed "time" so that we can expire timeouts * and maintain our notion of "current time". * - * NB: The time maintained by the callout queue is "virtual". It's the - * elapased delay given by regular calls to cq_clock() that define its unit. - * For gtk-gnutella, the time unit is the millisecond. + * NB: The time maintained by the callout queue is "virtual". + * + * @param cq the callout queue + * @param elapsed the elapsed time, in milliseconds + * + * @return the amount of events triggered (excluding "idle" events). */ -static void +static size_t cq_clock(cqueue_t *cq, int elapsed) { int bucket; int last_bucket, old_last_bucket; struct chash *ch, *old_current; cevent_t *ev; + const cevent_t *old_call; + bool old_call_extended, force_idle = FALSE; cq_time_t now; - int processed = 0; + size_t processed = 0; cqueue_check(cq); g_assert(elapsed >= 0); + assert_mutex_is_owned(&cq->cq_lock); /* * Recursive calls are possible: in the middle of an event, we could @@ -531,9 +1084,15 @@ * entry and restore them at the end as appropriate. If cq_current is * NULL initially, it means we were not in the middle of any recursion * so we won't have to restore cq_last_bucket. + * + * Note that we enforce recursive calls to cq_clock() to be on the + * same thread due to the use of a mutex. However, each initial run of + * cq_clock() could happen on a different thread each time. */ old_current = cq->cq_current; + old_call = cq->cq_call; + old_call_extended = cq->cq_call_extended; old_last_bucket = cq->cq_last_bucket; cq->cq_ticks++; @@ -561,7 +1120,7 @@ cq->cq_current = ch; while ((ev = ch->ch_head) && ev->ce_time <= now) { - cq_expire(ev); + cq_expire_internal(cq, ev); processed++; } @@ -589,7 +1148,7 @@ cq->cq_current = ch; while ((ev = ch->ch_head) && ev->ce_time <= now) { - cq_expire(ev); + cq_expire_internal(cq, ev); processed++; } @@ -597,46 +1156,200 @@ done: cq->cq_current = old_current; + cq->cq_call = old_call; + cq->cq_call_extended = old_call_extended; if G_UNLIKELY(old_current != NULL) cq->cq_last_bucket = old_last_bucket; /* Was in recursive call */ - if (cq_debug() > 5) { - s_debug("CQ: %squeue \"%s\" %striggered %d event%s (%d item%s)", + if (cq_debugging(5)) { + s_debug("CQ: %squeue \"%s\" %striggered %zu event%s (%d item%s)", cq->cq_magic == CSUBQUEUE_MAGIC ? "sub" : "", cq->cq_name, NULL == old_current ? "" : "recursively", - processed, 1 == processed ? "" : "s", - cq->cq_items, 1 == cq->cq_items ? "" : "s"); + processed, plural(processed), cq->cq_items, plural(cq->cq_items)); + } + + /* + * Make sure the idle tasks are scheduled once in a while. + * + * We don't know how busy the callout queue is going to get, so forcing + * its "idle" tasks to run may be the only option to ensure these + * background but important operations get a chance to be run at all. + */ + + if G_UNLIKELY( + cq->cq_idle != NULL && + delta_time(tm_time(), cq->cq_last_idle) >= CQ_IDLE_FORCE + ) { + if (cq_debugging(0)) { + s_debug("CQ: %squeue \"%s\" forcing idle callback run", + cq->cq_magic == CSUBQUEUE_MAGIC ? "sub" : "", cq->cq_name); + } + force_idle = TRUE; /* Will force idle run below */ } + CQ_UNLOCK(cq); + /* * Run idle callbacks if nothing was processed. + * + * Note that we released the mutex before running idle callbacks, to let + * concurrent threads register callout events. */ - if (0 == processed) + if G_UNLIKELY(0 == processed || force_idle) cq_run_idle(cq); + + return processed; /* Do not count idle events */ +} + +/** + * Compute delay until the next registered event, expressed in units of the + * callout queue "virtual time". + * + * @note + * This is indicative only since external users do not have a way to lock + * the callout queue (and therefore new events could be added right after + * this call returns). However, for applications creating a facade on top + * of the callout queue, this can be meaningful because then the facade can + * handle proper locking through its own interface. + * + * @param cq the callout queue + * + * @return the "virtual time" delay until the next registered event. + */ +int +cq_delay(const cqueue_t *cq) +{ + int delay = MAX_INT_VAL(int); + int last_bucket; + int i; + cq_time_t now; + bool adjusted = FALSE; + + cqueue_check(cq); + + mutex_lock_const(&cq->cq_lock); + + last_bucket = cq->cq_last_bucket; /* Last bucket scanned */ + now = cq->cq_time; + + for (i = 0; i < HASH_SIZE; i++) { + int b = (last_bucket + i) & HASH_MASK; + struct chash *ch = &cq->cq_hashb; + cevent_t *ev = ch->ch_head; + int edelay; + + /* + * If the delay we have so far is not too large (does not overflow + * the size of the hashing array) and we have moved away from the + * last scanned bucket by an amount that is large-enough, we know + * we cannot find a smaller delay ahead in the buckets. + */ + + if (!EV_OVER(delay) && i > EV_HASH(delay)) + break; + + if (NULL == ev) + continue; + + edelay = ev->ce_time - now; + + if G_UNLIKELY(edelay <= 0) { + delay = 0; + break; + } + + delay = MIN(delay, edelay); + } + + /* + * If there are idle events registered in the queue, then we need to make + * sure they are scheduled at least once every CQ_IDLE_FORCE seconds. + */ + + if (cq->cq_idle != NULL) { + time_delta_t elapsed = delta_time(tm_time(), cq->cq_last_idle); + int idelay = CQ_IDLE_FORCE - elapsed; + + if (idelay <= 0) { + delay = 0; /* Idle events are due! */ + adjusted = TRUE; + } else { + int sdelay = delay / 1000; /* Convert into seconds */ + + if (idelay < sdelay) { + delay = idelay * 1000; /* Delay in ms */ + adjusted = TRUE; + } + } + } + + mutex_unlock_const(&cq->cq_lock); + + if (cq_debugging(4)) { + s_debug("%s(%s): %smin delay is %d, scanned %d bucket%s", + G_STRFUNC, cq->cq_name, adjusted ? "adjusted " : "", + delay, i, plural(i)); + } + + return delay; } /** * Force callout queue idle tasks to be run. + * + * @return amount of processed events. */ -void +size_t cq_idle(cqueue_t *cq) { - cq_run_idle(cq); + return cq_run_idle(cq); +} + +/** + * Convenience routine to run the idle tasks on the main callout queue. + * + * @return amount of processed events. + */ +size_t +cq_main_idle(void) +{ + cq_main_init(); + return cq_run_idle(callout_queue); } /** * Called every period to heartbeat the callout queue. + * + * @return the amount of triggered events. */ -static void +size_t cq_heartbeat(cqueue_t *cq) { tm_t tv; - time_delta_t delay; + time_delta_t delay, upper_delay; + uint stid = thread_small_id(); + bool extra = FALSE; + size_t triggered; cqueue_check(cq); + CQ_LOCK(cq); + + /* + * Make sure the callout queue always receives its heartbeats from + * the same thread. This is important to be able to determine whether + * an event needs to be inserted as "extended" or not. + */ + + if G_UNLIKELY(THREAD_INVALID_ID == cq->cq_stid) + cq->cq_stid = stid; + + g_assert_log(stid == cq->cq_stid, + "%s(): callout queue \"%s\" used to heartbeat from %s, called from %s", + G_STRFUNC, cq->cq_name, thread_id_name(cq->cq_stid), thread_name()); + /* * How much milliseconds elapsed since last heart beat? */ @@ -647,13 +1360,47 @@ /* * If too much variation, or too little, maybe the clock was adjusted. - * Assume a single period then. + * Adjust the delay so that we do not flush events for more than 10 periods, + * but process at least a single period. + */ + + upper_delay = 10 * cq->cq_period; + + if (delay < 0 || delay > upper_delay) { + time_delta_t adjusted; + + adjusted = MAX(delay, cq->cq_period); /* At least one period */ + adjusted = MIN(adjusted, upper_delay); /* At most ten periods */ + + if (cq_debugging(0)) { + s_warning("%s(%s): adjusting delay of %'ld ms down to %'ld ms", + G_STRFUNC, cq->cq_name, (long) delay, (long) adjusted); + } + + extra = TRUE; + delay = adjusted; + } + + /* + * We hold the mutex when calling cq_clock(), and it will be released there. + */ + + triggered = cq_clock(cq, delay); + + /* + * If there was extra delay in scheduling the heartbeat, collect this + * amount as entropy, as well as the time spent in scheduling events. + * We do this after the callout queue lock was released. */ - if (delay < 0 || delay > 10 * cq->cq_period) - delay = cq->cq_period; + if G_UNLIKELY(extra) { + time_delta_t since_last; + tm_now_exact(&tv); + since_last = tm_elapsed_us(&tv, &cq->cq_last_heartbeat); + entropy_harvest_small(VARLEN(delay), VARLEN(since_last), NULL); + } - cq_clock(cq, delay); + return triggered; } /** @@ -661,21 +1408,22 @@ * * Same as calling: * - * cq_insert(callout_queue, delay, fn, arg); + * cq_insert(cq_main(), delay, fn, arg); * * only it is shorter. */ cevent_t * -cq_main_insert(int delay, cq_service_t fn, gpointer arg) +cq_main_insert(int delay, cq_service_t fn, void *arg) { + cq_main_init(); return cq_insert(callout_queue, delay, fn, arg); } /** * Trampoline to invoke heartbeat. */ -static gboolean -cq_heartbeat_trampoline(gpointer p) +static bool +cq_heartbeat_trampoline(void *p) { cqueue_t *cq = p; @@ -688,31 +1436,41 @@ * if not existing already). */ static void -cq_register_object(GHashTable **hptr, gpointer o) +cq_register_object(hset_t **hptr, void *o) { - GHashTable *h = *hptr; + hset_t *h = *hptr; g_assert(o != NULL); + /* + * We must make sure we avoid walloc() for this set, since walloc() + * now uses a thread-magazine allocator, which itself relies on the + * callout queue layer to register events at creation time... We would + * cause changes to the set to occur each time the arena is resized and + * we need to allocate a new thread-magazine allocator for the new size + * we are trying to allocate, leading to a catch 22. + * --RAM, 2013-11-23 + */ + if (NULL == h) - *hptr = h = g_hash_table_new(pointer_hash_func, NULL); + *hptr = h = hset_create_real(HASH_KEY_SELF, 0); - g_assert(!g_hash_table_lookup(h, o)); + g_assert(!hset_contains(h, o)); - g_hash_table_insert(h, o, o); + hset_insert(h, o); } /** * Unregister object from the hash table. */ static void -cq_unregister_object(GHashTable *h, gpointer o) +cq_unregister_object(hset_t *h, void *o) { g_assert(h != NULL); g_assert(o != NULL); - g_assert(g_hash_table_lookup(h, o)); + g_assert(hset_contains(h, o)); - g_hash_table_remove(h, o); + hset_remove(h, o); } /*** @@ -732,10 +1490,11 @@ struct cperiodic { enum cperiodic_magic magic; cq_invoke_t event; /**< Periodic callback */ - gpointer arg; /**< Callback argument */ + void *arg; /**< Callback argument */ int period; /**< Period between invocations, in ms */ cqueue_t *cq; /**< Callout queue scheduling this */ cevent_t *ev; /**< Scheduled event */ + link_t lk; /**< Links all periodic events in queue */ unsigned to_free:1; /**< Marked for freeing */ }; @@ -750,7 +1509,7 @@ * Free allocated periodic event. */ static void -cq_periodic_free(cperiodic_t *cp, gboolean force) +cq_periodic_free(cperiodic_t *cp, bool force) { cperiodic_check(cp); @@ -770,7 +1529,11 @@ cqueue_check(cq); cq_cancel(&cp->ev); - cq_unregister_object(cq->cq_periodic, cp); + + spinlock(&cq->cq_periodic_lock); + elist_remove(&cq->cq_periodic, cp); + spinunlock(&cq->cq_periodic_lock); + cp->magic = 0; WFREE(cp); } @@ -780,15 +1543,15 @@ * Trampoline for dispatching periodic events. */ static void -cq_periodic_trampoline(cqueue_t *cq, gpointer data) +cq_periodic_trampoline(cqueue_t *cq, void *data) { cperiodic_t *cp = data; - gboolean reschedule; + bool reschedule; cqueue_check(cq); cperiodic_check(cp); - cp->ev = NULL; + cq_zero(cq, &cp->ev); /* * As long as the periodic event returns TRUE, keep scheduling it. @@ -822,7 +1585,7 @@ * is no need to explicitly remove it between firing periods. */ cperiodic_t * -cq_periodic_add(cqueue_t *cq, int period, cq_invoke_t event, gpointer arg) +cq_periodic_add(cqueue_t *cq, int period, cq_invoke_t event, void *arg) { cperiodic_t *cp; @@ -836,7 +1599,13 @@ cp->cq = cq; cp->ev = cq_insert(cq, period, cq_periodic_trampoline, cp); - cq_register_object(&cq->cq_periodic, cp); + spinlock(&cq->cq_periodic_lock); + + if G_UNLIKELY(!elist_is_initialized(&cq->cq_periodic)) + elist_init(&cq->cq_periodic, offsetof(cperiodic_t, lk)); + elist_append(&cq->cq_periodic, cp); + + spinunlock(&cq->cq_periodic_lock); return cp; } @@ -846,13 +1615,14 @@ * * Same as calling: * - * cq_periodic_add(callout_queue, period, event, arg); + * cq_periodic_add(cq_main(), period, event, arg); * * only it is shorter. */ cperiodic_t * -cq_periodic_main_add(int period, cq_invoke_t event, gpointer arg) +cq_periodic_main_add(int period, cq_invoke_t event, void *arg) { + cq_main_init(); return cq_periodic_add(callout_queue, period, event, arg); } @@ -935,10 +1705,13 @@ WALLOC0(csq); cq_initialize(&csq->sub_cq, name, parent->cq_time, period); csq->sub_cq.cq_magic = CSUBQUEUE_MAGIC; + csq->sub_cq.cq_stid = parent->cq_stid; /* Runs out of same thread */ csq->heartbeat = cq_periodic_add(parent, period, cq_heartbeat_trampoline, &csq->sub_cq); + cq_vars_add(&csq->sub_cq); + csubqueue_check(csq); cqueue_check(&csq->sub_cq); @@ -946,6 +1719,22 @@ } /** + * Convenience routine: insert event in the main callout queue. + * + * Same as calling: + * + * cq_submake(name, cq_main(), period); + * + * only it is shorter. + */ +cqueue_t * +cq_main_submake(const char *name, int period) +{ + cq_main_init(); + return cq_submake(name, callout_queue, period); +} + +/** * Get rid of a sub-queue, removing its heartbeat in the parent queue and * freeing the sub-queue object. */ @@ -953,7 +1742,7 @@ cq_subqueue_free(struct csubqueue *csq) { csubqueue_check(csq); - + cq_periodic_remove(&csq->heartbeat); csq->sub_cq.cq_magic = 0; WFREE(csq); @@ -976,7 +1765,7 @@ struct cidle { enum cidle_magic magic; cq_invoke_t event; /**< Periodic callback */ - gpointer arg; /**< Callback argument */ + void *arg; /**< Callback argument */ cqueue_t *cq; /**< Callout queue to which they belong */ }; @@ -996,7 +1785,9 @@ cidle_check(ci); cqueue_check(ci->cq); + mutex_lock(&ci->cq->cq_idle_lock); cq_unregister_object(ci->cq->cq_idle, ci); + mutex_unlock(&ci->cq->cq_idle_lock); ci->magic = 0; WFREE(ci); } @@ -1005,6 +1796,10 @@ * Create a new idle event, invoked each time the associated callout queue * has nothing else to schedule on a given heartbeat. * + * Idle events are guaranteed to be scheduled at least once per CQ_IDLE_FORCE + * seconds, and no more frequently than CQ_IDLE_PERIOD seconds on a given + * callout queue. + * * When the callout queue is freed, registered idle events are automatically * reclaimed as well, so they need not be removed explicitly. * @@ -1016,7 +1811,7 @@ * is no need to explicitly remove it between firing periods. */ cidle_t * -cq_idle_add(cqueue_t *cq, cq_invoke_t event, gpointer arg) +cq_idle_add(cqueue_t *cq, cq_invoke_t event, void *arg) { cidle_t *ci; @@ -1028,7 +1823,9 @@ ci->arg = arg; ci->cq = cq; + mutex_lock(&cq->cq_idle_lock); cq_register_object(&cq->cq_idle, ci); + mutex_unlock(&cq->cq_idle_lock); return ci; } @@ -1050,13 +1847,12 @@ /** * Trampoline for dispatching idle events. */ -static gboolean -cq_idle_trampoline(gpointer key, gpointer val, gpointer data) +static bool +cq_idle_trampoline(const void *key, void *data) { - cidle_t *ci = key; - gboolean remove_it = FALSE; + cidle_t *ci = deconstify_pointer(key); + bool remove_it = FALSE; - (void) val; (void) data; cidle_check(ci); @@ -1075,14 +1871,46 @@ /** * Launch idle events for the queue. + * + * @return amount of triggered events */ -static void +static size_t cq_run_idle(cqueue_t *cq) { + time_t now = tm_time(); + size_t triggered = 0; + cqueue_check(cq); - if (cq->cq_idle) - g_hash_table_foreach_remove(cq->cq_idle, cq_idle_trampoline, NULL); + entropy_harvest_time(); + + /* + * Never run idle events more than once per CQ_IDLE_PERIOD seconds. + */ + + CQ_LOCK(cq); + if (delta_time(now, cq->cq_last_idle) < CQ_IDLE_PERIOD) { + CQ_UNLOCK(cq); + return 0; + } + + if (cq->cq_idle != NULL) { + CQ_UNLOCK(cq); + /* + * cq->cq_idle is never freed once created, until queue is freed + */ + mutex_lock(&cq->cq_idle_lock); + triggered = hset_count(cq->cq_idle); + hset_foreach_remove(cq->cq_idle, cq_idle_trampoline, NULL); + mutex_unlock(&cq->cq_idle_lock); + CQ_LOCK(cq); + cq->cq_last_idle = tm_time(); + cq->cq_triggered += triggered; + } + + CQ_UNLOCK(cq); + + return triggered; } /** @@ -1093,10 +1921,26 @@ * @param old_ticks the previous amount of processed ticks */ double -callout_queue_coverage(int old_ticks) +cq_main_coverage(int old_ticks) +{ + cqueue_t *cqm = cq_main(); + + return (cqm->cq_ticks - old_ticks) * cqm->cq_period / 1000.0; +} + +/** + * Stringify callout queue time. + * + * @return pointer to static buffer + */ +const char * +cq_time_to_string(cq_time_t t) { - return (callout_queue->cq_ticks - old_ticks) * - callout_queue->cq_period / 1000.0; + buf_t *b = buf_private(G_STRFUNC, UINT64_DEC_BUFLEN); + char *p = buf_data(b); + + uint64_to_string_buf(t, p, buf_size(b)); + return p; } /*** @@ -1104,8 +1948,95 @@ ***/ #define CALLOUT_PERIOD 25 /* milliseconds */ +#define CALLOUT_THREAD_STACK (32 * PTRSIZE * 1024) + +static uint callout_timer_id; +static bool callout_thread; + +/** + * Callout queue thread. + * + * This is launched only when the main thread has been identified as blockable, + * meaning it will not be suitable for proper callout manangement. + * + * A working callout queue is necessary for semaphore emulation, otherwise + * timed operations will not work and deadlocks can occur. + */ +static void * +cq_thread_main(void *unused_arg) +{ + tsigset_t set; + tm_t period; + + (void) unused_arg; + + thread_set_name("callout queue"); + + /* + * To let cq_dispatch() work properly in case the callout queue does not + * run in the same thread as the one calling cq_dispatch(), we use an + * interruptible sleep in the callout queue thread. + */ + + tsig_emptyset(&set); + tm_fill_ms(&period, CALLOUT_PERIOD); + + while (callout_thread) { + cq_heartbeat(callout_queue); + thread_timed_sigsuspend(&set, &period); /* Interruptible sleep */ + } + + return NULL; +} + +/** + * Global initialization, run once. + * + * This allows the callout queue services to be available even when cq_init() + * is not explicitly called at the beginning of the program. + */ +static void +cq_global_init(void) +{ + static uint32 zero; + + /* + * To cut auto-initialization dependencies, we need to intialize the + * time thread first. Calling tm_now_exact() will do. + * + * The reason for that is because hash table routines need to compute the + * random hash offset and will call the entropy collection layer, which in + * turn needs to get the time. If the time thread is not started at the + * time, we could get recursion when the code attempts to auto-initialize + * the callout queue again. + */ + + (void) tm_now_exact(NULL); -static guint callout_timer_id = 0; + cq_debug_ptr = &zero; + callout_queue = cq_make("main", 0, CALLOUT_PERIOD); + + /* + * If the main thread is blockable, instantiate the callout queue in + * a separate thread to make sure events can still be called out even + * when the main thread is blocked. + * + * The cq_insert() routine will automatically create extended events + * when it is called from a different thread. + */ + + if (thread_main_is_blockable()) { + callout_thread = TRUE; + callout_queue->cq_stid = thread_create(cq_thread_main, NULL, + THREAD_F_DETACH | THREAD_F_CLEARSIG | + THREAD_F_NO_POOL | THREAD_F_PANIC, + CALLOUT_THREAD_STACK); + } else { + callout_timer_id = g_timeout_add(CALLOUT_PERIOD, + cq_heartbeat_trampoline, callout_queue); + callout_queue->cq_stid = thread_small_id(); + } +} /** * Initialization. @@ -1117,28 +2048,56 @@ * @param debug pointer to the property governing the cq_debug level */ void -cq_init(cq_invoke_t idle, const guint32 *debug) +cq_init(cq_invoke_t idle, const uint32 *debug) { - cq_debug_ptr = debug; + STATIC_ASSERT(IS_POWER_OF_2(HASH_SIZE)); - callout_queue = cq_make("main", 0, CALLOUT_PERIOD); - callout_timer_id = g_timeout_add(CALLOUT_PERIOD, - cq_heartbeat_trampoline, callout_queue); + /* + * Loudly warn if the callout queue already exists when this routine + * is called: it could have been initialized to run in the main thread + * and that thread may not be the proper one. It indicates that the + * appplication initialization order is not correct. + * --RAM. 2015-11-18 + */ + + if G_UNLIKELY(callout_queue != NULL) { + s_minicarp("%s(): callout queue already setup and running in %s", + G_STRFUNC, thread_id_name(callout_queue->cq_stid)); + } + + cq_main_init(); + cq_debug_ptr = debug; if (idle != NULL) cq_idle_add(callout_queue, idle, callout_queue); + + if (callout_queue->cq_stid != 0) { + s_miniinfo("callout queue will be running in thread #%u", + callout_queue->cq_stid); + } } /** - * Manual callout queue ticking. + * Manual main callout queue ticking. * * This is meant to be used during final shutdown when the main glib loop * (responsible to dispatch the heart beats) may not be invoked. */ void -cq_dispatch(void) +cq_main_dispatch(void) { - cq_heartbeat_trampoline(callout_queue); + cq_main_init(); + + /* + * The callout queue must always be heartbeating from the same thread. + * If it is not running in the current thread, send that thread a signal + * to let it wake-up and call the heartbeat routine. + */ + + if (thread_small_id() == callout_queue->cq_stid) + cq_heartbeat_trampoline(callout_queue); + else + thread_kill(callout_queue->cq_stid, TSIG_1); } /** @@ -1151,15 +2110,15 @@ g_source_remove(callout_timer_id); callout_timer_id = 0; } + callout_thread = FALSE; } -static gboolean -cq_free_periodic(gpointer key, gpointer value, gpointer data) +static bool +cq_free_periodic(void *key, void *data) { cperiodic_t *cp = key; (void) data; - (void) value; cperiodic_check(cp); cp->magic = 0; @@ -1167,13 +2126,12 @@ return TRUE; } -static gboolean -cq_free_idle(gpointer key, gpointer value, gpointer data) +static bool +cq_free_idle(const void *key, void *data) { - cidle_t *ci = key; + cidle_t *ci = deconstify_pointer(key); (void) data; - (void) value; cidle_check(ci); ci->magic = 0; @@ -1194,33 +2152,59 @@ cqueue_check(cq); + cq_vars_remove(cq); + if (cq->cq_current != NULL) { s_carp("%s(): %squeue \"%s\" still within cq_clock()", G_STRFUNC, CSUBQUEUE_MAGIC == cq->cq_magic ? "sub" : "", cq->cq_name); } + mutex_lock(&cq->cq_lock); + for (ch = cq->cq_hash, i = 0; i < HASH_SIZE; i++, ch++) { for (ev = ch->ch_head; ev; ev = ev_next) { ev_next = ev->ce_bnext; - ev->ce_magic = 0; - WFREE(ev); + ev_free(ev); } } - if (cq->cq_periodic) { - g_hash_table_foreach_remove(cq->cq_periodic, cq_free_periodic, NULL); - gm_hash_table_destroy_null(&cq->cq_periodic); + if (elist_is_initialized(&cq->cq_periodic)) { + elist_foreach_remove(&cq->cq_periodic, cq_free_periodic, NULL); + elist_discard(&cq->cq_periodic); } if (cq->cq_idle) { - g_hash_table_foreach_remove(cq->cq_idle, cq_free_idle, cq); - gm_hash_table_destroy_null(&cq->cq_idle); + hset_foreach_remove(cq->cq_idle, cq_free_idle, cq); + hset_free_null(&cq->cq_idle); } - HFREE_NULL(cq->cq_hash); + XFREE_NULL(cq->cq_hash); atom_str_free_null(&cq->cq_name); /* + * Unlocking the cq->cq_lock mutex (taken above) prevents a loud warning in + * mutex_destroy() in case the mutex was already locked by our thread, + * meaning we were already in cq_clock(). In that situation however, + * we already warned upon entry, and therefore there is no need for a + * second warning. + * + * If the mutex was not taken and someone else attempts to grab it at that + * stage, there will be a slight window which fortunately will be loudly + * detected by mutex_destroy(), as a case of a mutex being destroyed + * whilst owned by another thread. + * + * No valid application code should attempt to sneak in at this stage to + * grab that mutex anyway, so our logic is safe and we will be copiously + * warned if something unexpected happens. + * --RAM, 2012-12-04. + */ + + mutex_unlock(&cq->cq_lock); + mutex_destroy(&cq->cq_lock); + mutex_destroy(&cq->cq_idle_lock); + spinlock_destroy(&cq->cq_periodic_lock); + + /* * If freeing a sub-queue, the object is a bit larger than a queue, * and we have more cleanup to do... */ @@ -1253,8 +2237,89 @@ void cq_close(void) { - callout_queue->cq_current = NULL; /* No warning if we were recursing */ - cq_free_null(&callout_queue); + if G_LIKELY(ONCE_DONE(cq_global_inited)) { + cq_halt(); + /* No warning if we were recursing */ + callout_queue->cq_current = NULL; + cq_free_null(&callout_queue); + } +} + +/** + * Retrieve callout queue information. + * + * @return list of cq_info_t that must be freed by calling the + * cq_info_list_free_null() routine. + */ +pslist_t * +cq_info_list(void) +{ + pslist_t *sl = NULL; + cqueue_t *cq; + + CQ_VARS_LOCK; + + ELIST_FOREACH_DATA(&cq_vars, cq) { + cq_info_t *cqi; + + cqueue_check(cq); + + WALLOC0(cqi); + cqi->magic = CQ_INFO_MAGIC; + + CQ_LOCK(cq); + cqi->name = atom_str_get(cq->cq_name); + if (CSUBQUEUE_MAGIC == cq->cq_magic) { + struct csubqueue *csq = (struct csubqueue *) cq; + cqueue_t *pcq; + + pcq = csq->heartbeat->cq; + cqueue_check(pcq); + cqi->parent = atom_str_get(pcq->cq_name); + } + cqi->stid = cq->cq_stid; + cqi->periodic_count = elist_is_initialized(&cq->cq_periodic) ? + elist_count(&cq->cq_periodic) : 0; + cqi->idle_count = NULL == cq->cq_idle ? 0 : hset_count(cq->cq_idle); + /* Each periodic event counts as an item, do not count them twice */ + cqi->event_count = cq->cq_items - cqi->periodic_count; + cqi->period = cq->cq_period; + cqi->heartbeat_count = cq->cq_ticks; + cqi->triggered_count = cq->cq_triggered; + cqi->last_idle = cq->cq_last_idle; + CQ_UNLOCK(cq); + + sl = pslist_prepend(sl, cqi); + } + + CQ_VARS_UNLOCK; + + return pslist_reverse(sl); /* Order list as queue definition */ +} + +static void +cq_info_free(void *data, void *udata) +{ + cq_info_t *cqi = data; + + cq_info_check(cqi); + (void) udata; + + atom_str_free_null(&cqi->name); + atom_str_free_null(&cqi->parent); + WFREE(cqi); +} + +/** + * Free list created by cq_info_list() and nullify pointer. + */ +void +cq_info_list_free_null(pslist_t **sl_ptr) +{ + pslist_t *sl = *sl_ptr; + + pslist_foreach(sl, cq_info_free, NULL); + pslist_free_null(sl_ptr); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/cq.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/cq.h
Changed
@@ -34,7 +34,7 @@ #ifndef _cq_h_ #define _cq_h_ -#include "common.h" +#include "common.h" typedef struct cqueue cqueue_t; typedef struct cevent cevent_t; @@ -47,7 +47,7 @@ * @param cq the queue which fired the event * @param udata user-supplied callback data */ -typedef void (*cq_service_t)(struct cqueue *cq, gpointer udata); +typedef void (*cq_service_t)(struct cqueue *cq, void *udata); /** * A periodic event callback. @@ -56,45 +56,83 @@ * * @return whether the perdioc event should continue to be called. */ -typedef gboolean (*cq_invoke_t)(gpointer udata); +typedef bool (*cq_invoke_t)(void *udata); -typedef guint64 cq_time_t; /**< Virtual time for callout queue */ +typedef uint64 cq_time_t; /**< Virtual time for callout queue */ + +enum cq_info_magic { CQ_INFO_MAGIC = 0x12c867d4 }; + +/** + * Callout queue information that can be retrieved. + */ +typedef struct { + enum cq_info_magic magic; + const char *name; /**< Queue name (atom) */ + const char *parent; /**< Parent queue name (atom), NULL if none */ + uint stid; /**< Scheduling thread ID */ + size_t periodic_count; /**< Amount of periodic events */ + size_t idle_count; /**< Amount of idle events */ + size_t event_count; /**< Amount of registered events */ + size_t heartbeat_count; /**< Amount of heartbeats */ + size_t triggered_count; /**< Amount of triggered events */ + int period; /**< Period, in ms */ + time_t last_idle; /**< Last idle scheduling */ +} cq_info_t; + +static inline void +cq_info_check(const cq_info_t * const cqi) +{ + g_assert(cqi != NULL); + g_assert(CQ_INFO_MAGIC == cqi->magic); +} /* * Interface routines. */ -extern cqueue_t *callout_queue; /* Single global instance */ - -double callout_queue_coverage(int old_ticks); +double cq_main_coverage(int old_ticks); -void cq_init(cq_invoke_t idle, const guint32 *debug); -void cq_dispatch(void); +void cq_init(cq_invoke_t idle, const uint32 *debug); +void cq_main_dispatch(void); void cq_halt(void); void cq_close(void); +cqueue_t *cq_main(void); cqueue_t *cq_make(const char *name, cq_time_t now, int period); cqueue_t *cq_submake(const char *name, cqueue_t *parent, int period); +cqueue_t *cq_main_submake(const char *name, int period); void cq_free_null(cqueue_t **cq_ptr); -cevent_t *cq_insert(cqueue_t *cq, int delay, cq_service_t fn, gpointer arg); -cevent_t *cq_main_insert(int delay, cq_service_t fn, gpointer arg); +cevent_t *cq_insert(cqueue_t *cq, int delay, cq_service_t fn, void *arg); +cevent_t *cq_main_insert(int delay, cq_service_t fn, void *arg); cq_time_t cq_remaining(const cevent_t *ev); -void cq_expire(cevent_t *ev); -void cq_cancel(cevent_t **handle_ptr); -void cq_resched(cevent_t *handle, int delay); +size_t cq_heartbeat(cqueue_t *cq); +bool cq_expire(cevent_t *ev); +void cq_zero(cqueue_t *cq, cevent_t **ev_ptr); +bool cq_zero_if_triggered(cevent_t **ev_ptr); +bool cq_cancel(cevent_t **handle_ptr); +bool cq_replace(cevent_t *ev, cq_service_t fn, void *arg); +bool cq_resched(cevent_t *handle, int delay); int cq_ticks(const cqueue_t *cq); int cq_count(const cqueue_t *cq); +int cq_delay(const cqueue_t *cq); const char *cq_name(const cqueue_t *cq); -void cq_idle(cqueue_t *cq); +size_t cq_idle(cqueue_t *cq); +size_t cq_main_idle(void); +unsigned cq_main_thread_id(void); cperiodic_t *cq_periodic_add(cqueue_t *cq, - int period, cq_invoke_t event, gpointer arg); -cperiodic_t *cq_periodic_main_add(int period, cq_invoke_t event, gpointer arg); + int period, cq_invoke_t event, void *arg); +cperiodic_t *cq_periodic_main_add(int period, cq_invoke_t event, void *arg); void cq_periodic_resched(cperiodic_t *cp, int period); void cq_periodic_remove(cperiodic_t **cp_ptr); -cidle_t *cq_idle_add(cqueue_t *cq, cq_invoke_t event, gpointer arg); +cidle_t *cq_idle_add(cqueue_t *cq, cq_invoke_t event, void *arg); void cq_idle_remove(cidle_t **ci_ptr); +const char *cq_time_to_string(cq_time_t t); + +struct pslist *cq_info_list(void); +void cq_info_list_free_null(struct pslist **sl_ptr); + #endif /* _cq_h_ */ /* vi: set ts=4: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/crash.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/crash.c
Changed
@@ -2,7 +2,7 @@ * Copyright (c) 2006 Christian Biere <christianbiere@gmx.de> * All rights reserved. * - * Copyright (c) 2009-2011 Raphael Manfredi <Raphael_Manfredi@pobox.com> + * Copyright (c) 2009-2015 Raphael Manfredi <Raphael_Manfredi@pobox.com> * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -70,31 +70,52 @@ * @author Christian Biere * @date 2006 * @author Raphael Manfredi - * @date 2009-2011 + * @date 2009-2011, 2014-2015 */ #include "common.h" #include "crash.h" + #include "atomic.h" #include "ckalloc.h" -#include "compat_sleep_ms.h" +#include "compat_pause.h" +#include "compat_poll.h" +#include "compat_usleep.h" +#include "cq.h" +#include "eslist.h" +#include "evq.h" #include "fast_assert.h" #include "fd.h" #include "file.h" +#include "ftw.h" +#include "getcpucount.h" #include "halloc.h" +#include "hashing.h" #include "hashtable.h" #include "iovec.h" #include "log.h" +#include "mempcpy.h" +#include "mutex.h" /* For mutex_crash_mode() */ #include "offtime.h" +#include "omalloc.h" +#include "once.h" #include "path.h" +#include "progname.h" /* For progstart_dup() */ #include "signal.h" +#include "spinlock.h" /* For spinlock_crash_mode() */ +#include "spopen.h" +#include "stacktrace.h" #include "str.h" #include "stringify.h" +#include "thread.h" /* For thread_name(), et al. */ #include "timestamp.h" #include "tm.h" #include "unsigned.h" /* For size_is_positive() */ -#include "stacktrace.h" +#include "vmea.h" /* For vmea_maxsize() */ +#include "vmm.h" /* For vmm_crash_mode() */ +#include "walloc.h" /* For walloc_crash_mode() */ +#include "xmalloc.h" #include "override.h" /* Must be the last header included */ @@ -103,6 +124,9 @@ #define CRASH_MSG_MAXLEN 3072 /**< Pre-allocated max length */ #define CRASH_MSG_SAFELEN 512 /**< Failsafe static string */ #define CRASH_MIN_ALIVE 600 /**< secs, minimum uptime for exec() */ +#define CRASH_RESTART_GRACE 60 /**< secs, grace for async restart */ + +#define CRASH_RUNTIME_BUFLEN 12 /**< Buffer length for crash_run_time() */ #ifdef HAS_FORK #define has_fork() 1 @@ -111,11 +135,25 @@ #define has_fork() 0 #endif +/** + * Our defined crash levels. + * + * The higher the crash level, the less resources we can count on and the + * more careful we need to be if we want to continue collecting crash data. + */ +enum crash_level { + CRASH_LVL_NONE = 0, /**< No crash yet */ + CRASH_LVL_BASIC, /**< Basic crash level */ + CRASH_LVL_OOM, /**< Out of memory */ + CRASH_LVL_DEADLOCKED, /**< Application deadlocked */ + CRASH_LVL_FAILURE, /**< Assertion failure */ + CRASH_LVL_EXCEPTION, /**< Asynchronous signal */ + CRASH_LVL_RECURSIVE, /**< Crashing again during crash handling */ +}; + struct crash_vars { void *stackSTACKTRACE_DEPTH_MAX; /**< Stack frame on assert failure */ ckhunk_t *mem; /**< Reserved memory, read-only */ - ckhunk_t *mem2; /**< Reserved memory, read-only */ - ckhunk_t *mem3; /**< Reserved memory, read-only */ ckhunk_t *logck; /**< Reserved memory, read-only */ ckhunk_t *fmtck; /**< Reserved memory, read-only */ ckhunk_t *hookmem; /**< Reserved memory, read-only */ @@ -124,40 +162,81 @@ const char *exec_path; /**< Path of program (optional, may be NULL) */ const char *crashfile; /**< Environment variable "Crashfile=..." */ const char *cwd; /**< Current working directory (NULL if unknown) */ + const char *crashlog; /**< Full path to the crash file */ const char *crashdir; /**< Directory where crash logs are written */ const char *version; /**< Program version string (NULL if unknown) */ const assertion_data *failure; /**< Failed assertion, NULL if none */ const char *message; /**< Additional error messsage, NULL if none */ const char *filename; /**< Filename where error occurred, NULL if node */ - time_delta_t gmtoff; /**< Offset to GMT, supposed to be fixed */ + const char *fail_name; /**< Name of thread triggering assertion failure */ + unsigned fail_stid; /**< ID of thread triggering assertion failure */ + pid_t pid; /**< Initial process ID */ + pid_t ppid; /**< Parent PID, when supervising */ time_t start_time; /**< Launch time (at crash_init() call) */ size_t stackcnt; /**< Valid stack items in stack */ + int stackid; /**< Known thread ID to which stack belongs */ str_t *logstr; /**< String to build and hold error message */ str_t *fmtstr; /**< String to allow log formatting during crash */ hash_table_t *hooks; /**< Records crash hooks by file name */ + action_fn_t restart; /**< Optional restart callback to invoke */ + const char *lock_file; /**< Deadlocking file */ + unsigned lock_line; /**< Deadlocking line */ const char * const *argv; /**< Saved argv array */ const char * const *envp; /**< Saved environment array */ int argc; /**< Saved argv count */ unsigned build; /**< Build number, unique version number */ - guint8 crash_mode; /**< True when we enter crash mode */ - guint8 recursive; /**< True when we are in a recursive crash */ - guint8 closed; /**< True when crash_close() was called */ - guint8 invoke_inspector; - unsigned pause_process:1; - unsigned dumps_core:1; - unsigned may_restart:1; + uint8 major; /**< Major version */ + uint8 minor; /**< Minor version */ + uint8 patchlevel; /**< Patchlevel version */ + uint8 crashing; /**< True when we enter crash mode */ + uint8 recursive; /**< True when we are in a recursive crash */ + uint8 closed; /**< True when crash_close() was called */ + uint8 deadlocked; /**< True when the application deadlocked */ + uint8 invoke_inspector; + uint8 has_numbers; /**< True if major/minor/patchlevel were inited */ + /* Not boolean fields because we need to update them individually */ + uint8 pause_process; + uint8 dumps_core; + uint8 may_restart; + uint8 supervised; + uint8 hooks_run; /**< True when hooks have been run */ + uint8 logged; /**< True when a crash log has been generated */ }; #define crash_set_var(name, src) \ G_STMT_START { \ STATIC_ASSERT(sizeof(src) == sizeof(vars->name)); \ ck_memcpy(vars->mem, (void *) &(vars->name), &(src), sizeof(vars->name)); \ + atomic_mb(); \ } G_STMT_END static const struct crash_vars *vars; /**< read-only after crash_init()! */ +static bool crash_closed; +static bool crash_pausing; + +static cevent_t *crash_restart_ev; /* Async restart event */ +static int crash_exit_started; +static bool crash_restart_initiated; +static const struct assertion_data *crash_last_assertion_failure; +static const char *crash_last_deadlock_file; +static int crash_thread_id = THREAD_INVALID_ID; +static enum crash_level crash_current_level; /** - * Signals that usually lead to a crash. + * An item in the crash_hooks list. + */ +typedef struct crash_hook_item { + const char *filename; /**< File for which hook is installed */ + callback_fn_t hook; /**< The hook to install */ + slink_t link; /**< Embedded link */ +} crash_hook_item_t; + +static eslist_t crash_hooks = ESLIST_INIT(offsetof(crash_hook_item_t, link)); + +static const char CRASHFILE_ENV = "Crashfile="; + +/** + * Signals that usually lead to a crash and which we don't normally expect. */ static const int signals = { #ifdef SIGBUS @@ -166,12 +245,18 @@ #ifdef SIGTRAP SIGTRAP, #endif +#ifdef SIGSYS + SIGSYS, +#endif SIGABRT, SIGFPE, SIGILL, SIGSEGV, }; +static void crash_directory_cleanup(const char *crashdir); +static void crash_dump_stacks(int fd); + /** * Determines whether coredumps are disabled. * @@ -179,7 +264,7 @@ */ int crash_coredumps_disabled(void) -#ifdef RLIMIT_CORE +#if defined(HAS_GETRLIMIT) && defined(RLIMIT_CORE) { struct rlimit lim; @@ -194,7 +279,7 @@ errno = ENOTSUP; return -1; } -#endif /* RLIMIT_CORE */ +#endif /* HAS_GETRLIMIT && RLIMIT_CORE */ typedef struct cursor { char *buf; @@ -202,9 +287,9 @@ } cursor_t; /** - * Append positive value to buffer, formatted as "%02u". + * Append positive value to buffer, formatted as "%02lu". */ -static G_GNUC_COLD void +static void crash_append_fmt_02u(cursor_t *cursor, long v) { if (cursor->size < 2 || v < 0) @@ -226,30 +311,64 @@ } /** - * Append positive value to buffer, formatted as "%u". + * Append positive value to buffer, formatted as "%03lu". */ -static G_GNUC_COLD void +static void +crash_append_fmt_03u(cursor_t *cursor, long v) +{ + if (cursor->size < 3 || v < 0) + return; + + if (v >= 1000) + v %= 1000; + + if (v < 10) { + *cursor->buf++ = '0'; + *cursor->buf++ = '0'; + *cursor->buf++ = dec_digit(v); + } else if (v < 100) { + int c = v / 10; + int d = v - c * 10; + *cursor->buf++ = '0'; + *cursor->buf++ = dec_digit(c); + *cursor->buf++ = dec_digit(d); + } else { + int t, d, c; + t = v / 100; + v -= t * 100; + c = v / 10; + d = v - c * 10; + *cursor->buf++ = dec_digit(t); + *cursor->buf++ = dec_digit(c); + *cursor->buf++ = dec_digit(d); + } + cursor->size -= 3; +} + +/** + * Append positive value to buffer, formatted as "%lu". + */ +static void crash_append_fmt_u(cursor_t *cursor, unsigned long v) { char bufULONG_DEC_BUFLEN; const char *s; size_t len; - s = print_number(buf, sizeof buf, v); + s = PRINT_NUMBER(buf, v); len = strlen(s); if (cursor->size < len) return; - memcpy(cursor->buf, s, len); - cursor->buf += len; + cursor->buf = mempcpy(cursor->buf, s, len); cursor->size -= len; } /** * Append a character to supplied buffer. */ -static G_GNUC_COLD void +static void crash_append_fmt_c(cursor_t *cursor, unsigned char c) { if (cursor->size < 1) @@ -260,19 +379,25 @@ } /** - * Fill supplied buffer with the current time formatted as yy-mm-dd HH:MM:SS - * and should be at least 18-byte long or the string will be truncated. + * Fill supplied buffer with the current time formatted as yy-mm-dd HH:MM:SS.sss + * and should be at least CRASH_TIME_BUFLEN byte-long or the string will be + * truncated. * * This routine can safely be used in a signal handler as it does not rely * on unsafe calls. + * + * @param buf buffer where current time is formatted + * @param size length of buffer + * @param raw whether to use raw time computation */ -G_GNUC_COLD void -crash_time(char *buf, size_t size) +static void +crash_time_internal(char *buf, size_t size, bool raw) { const size_t num_reserved = 1; struct tm tm; + tm_t tv; + time_t loc; cursor_t cursor; - time_delta_t gmtoff; /* We need at least space for a NUL */ if (size < num_reserved) @@ -282,13 +407,19 @@ cursor.size = size - num_reserved; /* Reserve one byte for NUL */ /* - * If called very early from the logging layer, crash_init() may not have - * been invoked yet, so vars would still be NULL. + * Within crashes, force raw time computation to avoid doing further + * thread_check_suspended() calls during time computation. */ - gmtoff = (vars != NULL) ? vars->gmtoff : 0; + if G_UNLIKELY(raw || CRASH_LVL_NONE != crash_current_level) { + tm_current_time(&tv); /* Get system value, no locks */ + loc = tm_localtime_raw(); + } else { + tm_now_exact(&tv); + loc = tm_localtime(); + } - if (!off_time(time(NULL) + gmtoff, 0, &tm)) { + if (!off_time(loc, 0, &tm)) { buf0 = '\0'; return; } @@ -304,20 +435,59 @@ crash_append_fmt_02u(&cursor, tm.tm_min); crash_append_fmt_c(&cursor, ':'); crash_append_fmt_02u(&cursor, tm.tm_sec); + crash_append_fmt_c(&cursor, '.'); + crash_append_fmt_03u(&cursor, tv.tv_usec / 1000); cursor.size += num_reserved; /* We reserved one byte for NUL above */ crash_append_fmt_c(&cursor, '\0'); } /** + * Fill supplied buffer with the current time formatted as yy-mm-dd HH:MM:SS.sss + * and should be at least CRASH_TIME_BUFLEN byte-long or the string will be + * truncated. + * + * This routine can safely be used in a signal handler as it does not rely + * on unsafe calls. + * + * @param buf buffer where current time is formatted + * @param size length of buffer + */ +void +crash_time(char *buf, size_t size) +{ + crash_time_internal(buf, size, FALSE); +} + +/** + * Fill supplied buffer with the current time formatted as yy-mm-dd HH:MM:SS.sss + * and should be at least CRASH_TIME_BUFLEN byte-long or the string will be + * truncated. + * + * The difference with crash_time() is that the routine uses a direct time + * computation and therefore does not take any locks. + * + * This routine can safely be used in a signal handler as it does not rely + * on unsafe calls. + * + * @param buf buffer where current time is formatted + * @param size length of buffer + */ +void +crash_time_raw(char *buf, size_t size) +{ + crash_time_internal(buf, size, TRUE); +} + +/** * Fill supplied buffer with the current time formatted using the ISO format - * yyyy-mm-dd HH:MM:SSZ and should be at least 21-byte long or the string - * will be truncated. + * yyyy-mm-dd HH:MM:SSZ and should be at least CRASH_TIME_ISO_BUFLEN byte-long + * or the string will be truncated. * * This routine can safely be used in a signal handler as it does not rely * on unsafe calls. */ -G_GNUC_COLD void +void crash_time_iso(char *buf, size_t size) { const size_t num_reserved = 1; @@ -331,7 +501,7 @@ cursor.buf = buf; cursor.size = size - num_reserved; /* Reserve one byte for NUL */ - if (!off_time(time(NULL) + vars->gmtoff, 0, &tm)) { + if (!off_time(tm_localtime_exact(), 0, &tm)) { buf0 = '\0'; return; } @@ -358,18 +528,23 @@ * This routine can safely be used in a signal handler as it does not rely * on unsafe calls. */ -static G_GNUC_COLD void +static void G_COLD crash_run_time(char *buf, size_t size) { const size_t num_reserved = 1; time_delta_t t; cursor_t cursor; - guint s; + uint s; /* We need at least space for a NUL */ if (size < num_reserved) return; + if (NULL == vars) { + g_strlcpy(buf, "0 s?", size); + return; + } + t = delta_time(time(NULL), vars->start_time); s = MAX(t, 0); /* seconds */ @@ -404,11 +579,30 @@ } /** + * Stringify a crash level. + */ +static const char * +crash_level_to_string(const enum crash_level level) +{ + switch (level) { + case CRASH_LVL_NONE: return "none"; + case CRASH_LVL_BASIC: return "basic"; + case CRASH_LVL_OOM: return "OOM"; + case CRASH_LVL_DEADLOCKED: return "deadlocked"; + case CRASH_LVL_FAILURE: return "failure"; + case CRASH_LVL_EXCEPTION: return "exception"; + case CRASH_LVL_RECURSIVE: return "recursive"; + } + + return "UNKNOWN"; +} + +/** * Get the hook function that we have to run in order to log more context. * * @return the hook function to run, NULL if nothing. */ -static G_GNUC_COLD crash_hook_t +static callback_fn_t G_COLD crash_get_hook(void) { const char *file; @@ -428,6 +622,8 @@ file = vars->failure->file; else if (vars->filename != NULL) file = vars->filename; + else if (vars->lock_file != NULL) + file = vars->lock_file; else file = NULL; @@ -438,18 +634,33 @@ } /** + * Get the PID of the running process. + * + * This routine uses the cached pid computed at crash_init() time to get + * the proper PID, even if we are in the fork()ed child presently. + */ +static pid_t +crash_getpid(void) +{ + if (vars != NULL) + return vars->pid; + + return getpid(); +} + +/** * Run crash hooks if we have an identified assertion failure. * * @param logfile if non-NULL, redirect messages there as well. - * @param logfd if not -1, the already opened file where we should log ot + * @param logfd if not -1, the opened file where we should log to */ -static G_GNUC_COLD void +static void G_COLD crash_run_hooks(const char *logfile, int logfd) { - crash_hook_t hook; + callback_fn_t hook; const char *routine; - char pid_buf22; - char time_buf18; + char pid_bufULONG_DEC_BUFLEN; + char time_bufCRASH_TIME_BUFLEN; DECLARE_STR(7); int fd = logfd; @@ -457,6 +668,9 @@ if (NULL == hook) return; + if (vars != NULL && vars->hooks_run) + return; /* Prevent duplicate run */ + /* * Let them know we're going to run a hook. * @@ -464,12 +678,12 @@ * hardwire the stderr file descriptor but get it from the log layer. */ - routine = stacktrace_routine_name(func_to_pointer(hook), FALSE); + routine = stacktrace_function_name(hook); crash_time(time_buf, sizeof time_buf); print_str(time_buf); /* 0 */ print_str(" CRASH (pid="); /* 1 */ - print_str(print_number(pid_buf, sizeof pid_buf, getpid())); /* 2 */ + print_str(PRINT_NUMBER(pid_buf, crash_getpid())); /* 2 */ print_str(") "); /* 3 */ print_str(" invoking crash hook \""); /* 4 */ print_str(routine); /* 5 */ @@ -512,10 +726,12 @@ (*hook)(); + routine = stacktrace_function_name(hook); + crash_time(time_buf, sizeof time_buf); print_str(time_buf); /* 0 */ print_str(" CRASH (pid="); /* 1 */ - print_str(print_number(pid_buf, sizeof pid_buf, getpid())); /* 2 */ + print_str(PRINT_NUMBER(pid_buf, crash_getpid())); /* 2 */ print_str(") "); /* 3 */ print_str("done with hook \""); /* 4 */ print_str(routine); /* 5 */ @@ -530,6 +746,11 @@ flush_str(fd); } + if (vars != NULL) { + uint8 t = TRUE; + crash_set_var(hooks_run, t); + } + /* * We do not close the file if opened so as to continue logging * duplicate information until the end should anyone call g_logv() @@ -540,14 +761,14 @@ /** * Emit leading crash information: who crashed and why. */ -static G_GNUC_COLD void -crash_message(const char *signame, gboolean trace, gboolean recursive) +static void G_COLD +crash_message(const char *signame, bool trace, bool recursive) { DECLARE_STR(11); - char pid_buf22; - char time_buf18; - char runtime_buf22; - char build_buf22; + char pid_bufULONG_DEC_BUFLEN; + char time_bufCRASH_TIME_BUFLEN; + char runtime_bufCRASH_RUNTIME_BUFLEN; + char build_bufULONG_DEC_BUFLEN; unsigned iov_prolog; crash_time(time_buf, sizeof time_buf); @@ -556,7 +777,7 @@ /* The following precedes each line */ print_str(time_buf); /* 0 */ print_str(" CRASH (pid="); /* 1 */ - print_str(print_number(pid_buf, sizeof pid_buf, getpid())); /* 2 */ + print_str(PRINT_NUMBER(pid_buf, getpid())); /* 2 */ print_str(") "); /* 3 */ iov_prolog = getpos_str(); @@ -567,7 +788,7 @@ print_str(vars->progname); /* 5 */ if (0 != vars->build) { print_str(" build #"); /* 6 */ - print_str(print_number(build_buf, sizeof build_buf, vars->build)); + print_str(PRINT_NUMBER(build_buf, vars->build)); /* 7 */ } } print_str("\n"); /* 8, at most */ @@ -594,25 +815,51 @@ } /** + * Signal that we are attempting to print a decorated stack trace. + */ +static void G_COLD +crash_decorating_stack(void) +{ + DECLARE_STR(5); + char pid_bufULONG_DEC_BUFLEN; + char time_bufCRASH_TIME_BUFLEN; + + if (!vars->invoke_inspector && !vars->closed) + crash_run_hooks(NULL, -1); + + crash_time(time_buf, sizeof time_buf); + print_str(time_buf); /* 0 */ + print_str(" CRASH (pid="); /* 1 */ + print_str(PRINT_NUMBER(pid_buf, crash_getpid())); /* 2 */ + print_str(") "); /* 3 */ + print_str("attempting to dump a decorated stack trace:\n"); /* 4 */ + flush_err_str(); + if (log_stdout_is_distinct()) + flush_str(STDOUT_FILENO); +} + +/** * Marks end of crash logging and potential pausing or debugger hook calling. */ -static G_GNUC_COLD void -crash_end_of_line(void) +static void G_COLD +crash_end_of_line(bool forced) { DECLARE_STR(7); - char pid_buf22; - char time_buf18; + char pid_bufULONG_DEC_BUFLEN; + char time_bufCRASH_TIME_BUFLEN; - if (!vars->invoke_inspector && !vars->closed) + if (!forced && !vars->invoke_inspector && !vars->closed) crash_run_hooks(NULL, -1); crash_time(time_buf, sizeof time_buf); print_str(time_buf); /* 0 */ print_str(" CRASH (pid="); /* 1 */ - print_str(print_number(pid_buf, sizeof pid_buf, getpid())); /* 2 */ + print_str(PRINT_NUMBER(pid_buf, crash_getpid())); /* 2 */ print_str(") "); /* 3 */ - if (vars->closed) { + if (forced) { + print_str("recursively crashing -- end of line."); /* 4 */ + } else if (vars->closed) { print_str("end of line."); /* 4 */ } else if (vars->invoke_inspector) { if (NULL != vars->exec_path) { @@ -635,11 +882,26 @@ /** * Construct name of GTKG crash log. */ -static G_GNUC_COLD void +static void G_COLD crash_logname(char *buf, size_t len, const char *pidstr) { clamp_strcpy(buf, len, EMPTY_STRING(vars->progname)); + if (0 != vars->has_numbers) { + char num_bufULONG_DEC_BUFLEN + 2; + const char *num_str; + + num_str = PRINT_NUMBER(num_buf, vars->major); + clamp_strcat(buf, len, "-"); + clamp_strcat(buf, len, num_str); + num_str = PRINT_NUMBER(num_buf, vars->minor); + clamp_strcat(buf, len, "."); + clamp_strcat(buf, len, num_str); + num_str = PRINT_NUMBER(num_buf, vars->patchlevel); + clamp_strcat(buf, len, "."); + clamp_strcat(buf, len, num_str); + } + /* * File is opened with O_EXCL so we need to make the filename as unique * as possible. Therefore, include the build number if available. @@ -649,17 +911,19 @@ char build_bufULONG_DEC_BUFLEN + 2; const char *build_str; - build_str = print_number(build_buf, sizeof build_buf, vars->build); + build_str = PRINT_NUMBER(build_buf, vars->build); clamp_strcat(buf, len, "-r"); clamp_strcat(buf, len, build_str); } clamp_strcat(buf, len, "-crash."); - clamp_strcat(buf, len, pidstr); /* * Because we can re-execute ourselves (at user's request after an upgrade * or after a crash), we need to include our starting time as well. + * + * Having the time right after the version allows natural sorting of + * files for the same version, with the latest one at the end. */ { @@ -667,32 +931,210 @@ const char *time_str; time_str = print_hex(time_buf, sizeof time_buf, vars->start_time); - clamp_strcat(buf, len, "."); clamp_strcat(buf, len, time_str); } + /* + * Finish with the PID, to really ensure we get a unique filename. + */ + + clamp_strcat(buf, len, "."); + clamp_strcat(buf, len, pidstr); clamp_strcat(buf, len, ".log"); } /** + * Fill specified buffer with the full path of the crashlog file. + */ +static void G_COLD +crash_logpath(char *buf, size_t len) +{ + const char *pid_str; + char pid_bufULONG_DEC_BUFLEN; + char filename80; + + pid_str = PRINT_NUMBER(pid_buf, crash_getpid()); + crash_logname(filename, sizeof filename, pid_str); + if (vars != NULL && vars->crashdir != NULL) { + str_bprintf(buf, len, + "%s%c%s", vars->crashdir, G_DIR_SEPARATOR, filename); + } else { + str_bprintf(buf, len, "%s", filename); + } +} + +/** * Emit the current stack frame to specified file, or the assertion stack * if we have one. */ -static G_GNUC_COLD NO_INLINE void +static NO_INLINE void G_COLD crash_stack_print(int fd, size_t offset) { if (vars != NULL && vars->stackcnt != 0) { /* Saved assertion stack preferred over current stack trace */ - stacktrace_stack_safe_print(fd, vars->stack, vars->stackcnt); + stacktrace_stack_safe_print(fd, + vars->stackid, vars->stack, vars->stackcnt); } else { stacktrace_where_cautious_print_offset(fd, offset + 1); } } +static sigjmp_buf crash_safe_envTHREAD_MAX; + +/** + * Invoked on a fatal signal during decorated stack building. + */ +static void G_COLD +crash_decorated_got_signal(int signo) +{ + int stid = thread_small_id(); + + s_miniwarn("got %s during stack dump generation", signal_name(signo)); + siglongjmp(crash_safe_envstid, signo); +} + +/** + * Emit a decorated stack frame to specified file, using a gdb-like format. + * + * @return TRUE on success, FALSE if we caught a harmful signal + */ +static NO_INLINE bool G_COLD +crash_stack_print_decorated(int fd, size_t offset, bool in_child) +{ + int stid = thread_small_id(); + const uint flags = STACKTRACE_F_ORIGIN | STACKTRACE_F_SOURCE | + STACKTRACE_F_GDB | STACKTRACE_F_ADDRESS | STACKTRACE_F_NO_INDENT | + STACKTRACE_F_NUMBER | STACKTRACE_F_PATH; + volatile bool success = TRUE; + signal_handler_t old_sigsegv; +#ifdef SIGBUS + signal_handler_t old_sigbus; +#endif + + /* + * Install signal handlers for harmful signals that could happen during + * symbols loading and stack unwinding. + * + * We use signal_catch() and not signal_set() because we do not want any + * extra information collected when these signals occur. + */ + + old_sigsegv = signal_catch(SIGSEGV, crash_decorated_got_signal); +#ifdef SIGBUS + old_sigbus = signal_catch(SIGBUS, crash_decorated_got_signal); +#endif + + if (Sigsetjmp(crash_safe_envstid, TRUE)) { + success = FALSE; + goto done; + } + + if (!in_child && vars != NULL && vars->stackcnt != 0) { + /* Saved assertion stack preferred over current stack trace */ + stacktrace_stack_print_decorated(fd, + vars->stackid, vars->stack, vars->stackcnt, flags); + } else { + void *stackSTACKTRACE_DEPTH_MAX; + size_t count; + + count = stacktrace_safe_unwind(stack, N_ITEMS(stack), offset + 1); + stacktrace_stack_print_decorated(fd, stid, stack, count, flags); + } + + /* FALL THROUGH */ + +done: + signal_set(SIGSEGV, old_sigsegv); +#ifdef SIGBUS + signal_set(SIGBUS, old_sigbus); +#endif + + return success; +} + +/** + * Print a decorated stack for the current frame to given file descriptor. + */ +void +crash_print_decorated_stack(int fd) +{ + const char *name = thread_name(); + DECLARE_STR(3); + + print_str("Currently in "); + print_str(name); + print_str(":\n"); + flush_str(fd); + + crash_stack_print_decorated(fd, 2, FALSE); + thread_lock_dump_all(fd); +} + +/** + * Emit a decorated stack. + */ +static NO_INLINE void G_COLD +crash_emit_decorated_stack(size_t offset, bool in_child) +{ + crash_decorating_stack(); + if (!crash_stack_print_decorated(STDERR_FILENO, offset + 1, in_child)) + return; + thread_lock_dump_all(STDERR_FILENO); + if (log_stdout_is_distinct()) { + crash_stack_print_decorated(STDOUT_FILENO, offset + 1, in_child); + thread_lock_dump_all(STDOUT_FILENO); + } +} + +/** + * Append a decorated stack to the crashlog. + * + * @return TRUE on success. + */ +static NO_INLINE bool G_COLD +crash_append_decorated_stack(size_t offset) +{ + int clf; + bool success = TRUE; + + if (NULL == vars || NULL == vars->crashlog) { + s_miniwarn("%s(): path to crashlog file unknown", G_STRFUNC); + return FALSE; + } + + if (!file_exists(vars->crashlog)) { + s_miniwarn("%s(): crash log \"%s\" does not exist", + G_STRFUNC, vars->crashlog); + return FALSE; + } + + clf = open(vars->crashlog, O_APPEND | O_WRONLY); + if (-1 == clf) { + s_miniwarn("%s(): cannot append to crash log \"%s\": %m", + G_STRFUNC, vars->crashlog); + return FALSE; + } + + if (!crash_stack_print_decorated(clf, offset + 1, FALSE)) { + success = FALSE; + goto done; + } + + /* Since we were able to dump before, we should be OK for these copies */ + + crash_stack_print_decorated(STDERR_FILENO, offset + 1, FALSE); + if (log_stdout_is_distinct()) + crash_stack_print_decorated(STDOUT_FILENO, offset + 1, FALSE); + +done: + close(clf); + return success; +} + /** * Reset the handler of all the signals we trap, and unblock them. */ -static G_GNUC_COLD void +static void G_COLD crash_reset_signals(void) { unsigned i; @@ -703,37 +1145,37 @@ * are about to re-exec() ourselves from a signal handler! */ - for (i = 0; i < G_N_ELEMENTS(signals); i++) { + for (i = 0; i < N_ITEMS(signals); i++) { signal_set(signalsi, SIG_DFL); signal_unblock(signalsi); } } #ifdef HAS_FORK -static Sigjmp_buf crash_fork_env; +static sigjmp_buf crash_fork_env; /** * Handle fork() timeouts. */ -static G_GNUC_COLD void +static void G_COLD crash_fork_timeout(int signo) { DECLARE_STR(2); - char time_buf18; + char time_bufCRASH_TIME_BUFLEN; crash_time(time_buf, sizeof time_buf); print_str(time_buf); print_str(" (WARNING): fork() timed out, found a libc bug?\n"); flush_err_str(); - Siglongjmp(crash_fork_env, signo); + siglongjmp(crash_fork_env, signo); } #endif /* HAS_FORK */ /** - * A fork() wrapper to work around libc6 bugs causing hangs within fork(). + * A fork() wrapper to handle multi-threaded environments "safely". */ -static G_GNUC_COLD pid_t +static pid_t G_COLD crash_fork(void) { #ifdef HAS_FORK @@ -775,12 +1217,238 @@ signal_set(SIGALRM, old_sigalrm); #endif + /* + * If we are in the child process, we are now the sole thread running + * because only the thread executing the fork() is kept running. + * + * However, we are in crash-mode, hence all the locks are pass-through + * and we cannot deadlock with a lock that one of the other threads could + * have been taking in the parent process. + * + * We MUST NOT call thread_forked() here as we would in normal user code + * because that would reset the thread information that we are going to + * propagate in the crash log, in particular the list of locks held by + * the other non-crashing threads, or corrupt the amount of running threads + * as returned by thread_count(). + */ + return pid; #else return 0; /* Act as if we were in a child upon return */ #endif /* HAS_FORK */ } +/** + * Write crash log header. + * + * @param clf crash log file descriptor + * @param signo crashing signal number + * @param filename name of the crash log file + */ +static void +crash_log_write_header(int clf, int signo, const char *filename) +{ + char tbufCRASH_TIME_BUFLEN; + char rbufCRASH_RUNTIME_BUFLEN; + char sbufULONG_DEC_BUFLEN; + char nbufULONG_DEC_BUFLEN; + char lbufULONG_DEC_BUFLEN; + char pbufULONG_DEC_BUFLEN; + time_delta_t t; + struct utsname u; + long cpucount = getcpucount(); + DECLARE_STR(15); + + crash_time_iso(tbuf, sizeof tbuf); + crash_run_time(rbuf, sizeof rbuf); + t = delta_time(time(NULL), vars->start_time); + + print_str("Operating-System: "); /* 0 */ + if (-1 != uname(&u)) { + print_str(u.sysname); /* 1 */ + print_str(" "); /* 2 */ + print_str(u.release); /* 3 */ + print_str(" "); /* 4 */ + print_str(u.version); /* 5 */ + print_str("\n"); /* 6 */ + } else { + print_str("Unknown\n"); + } + print_str("CPU-Architecture: "); /* 7 */ + if (-1 != uname(&u)) { + print_str(u.machine); /* 8 */ + } else { + print_str("unknown"); /* 8 */ + } + if (cpucount > 1) { + print_str(" * "); /* 9 */ + print_str(PRINT_NUMBER(sbuf, cpucount)); /* 10 */ + } + print_str(", "); /* 11 */ + print_str(PRINT_NUMBER(nbuf, PTRSIZE * 8)); /* 12 */ + print_str(" bits\n"); /* 13 */ + flush_str(clf); + rewind_str(0); + + print_str("Executable-Path: "); /* 0 */ + print_str(vars->argv0); /* 1 */ + print_str("\n"); /* 2 */ + if (NULL != vars->version) { + print_str("Version: "); /* 3 */ + print_str(vars->version); /* 4 */ + print_str("\n"); /* 5 */ + } + print_str("Run-Elapsed: "); /* 6 */ + print_str(rbuf); /* 7 */ + print_str("\n"); /* 8 */ + print_str("Run-Seconds: "); /* 9 */ + print_str(PRINT_NUMBER(sbuf, MAX(t, 0))); /* 10 */ + print_str("\n"); /* 11 */ + print_str("Crash-Signal: "); /* 12 */ + print_str(signal_name(signo)); /* 13 */ + print_str("\n"); /* 14 */ + flush_str(clf); + rewind_str(0); + print_str("Crash-PID: "); /* 0 */ + print_str(PRINT_NUMBER(pbuf, crash_getpid())); /* 1 */ + print_str("\n"); /* 2 */ + print_str("Crash-Level: "); /* 3 */ + print_str(crash_level_to_string(crash_current_level)); /* 4 */ + print_str("\n"); /* 5 */ + flush_str(clf); + rewind_str(0); + print_str("Crash-Time: "); /* 0 */ + print_str(tbuf); /* 1 */ + print_str("\n"); /* 2 */ + print_str("Core-Dump: "); /* 3 */ + print_str(vars->dumps_core ? "enabled" : "disabled"); /* 4 */ + print_str("\n"); /* 5 */ + if (NULL != vars->cwd) { + print_str("Working-Directory: "); /* 6 */ + print_str(vars->cwd); /* 7 */ + print_str("\n"); /* 8 */ + } + if (NULL != vars->exec_path) { + print_str("Exec-Path: "); /* 9 */ + print_str(vars->exec_path); /* 10 */ + print_str("\n"); /* 11 */ + } + if (NULL != vars->crashdir) { + print_str("Crash-Directory: "); /* 12 */ + print_str(vars->crashdir); /* 13 */ + print_str("\n"); /* 14 */ + } + flush_str(clf); + rewind_str(0); + print_str("Crash-File: "); /* 0 */ + print_str(filename); /* 1 */ + print_str("\n"); /* 2 */ + if (vars->failure != NULL) { + const assertion_data *failure = vars->failure; + unsigned line = failure->line & ~FAST_ASSERT_NOT_REACHED; + bool assertion = line == failure->line; + if (assertion) { + print_str("Assertion-At: "); /* 3 */ + } else { + print_str("Reached-Code-At: "); /* 3 */ + } + print_str(failure->file); /* 4 */ + print_str(":"); /* 5 */ + print_str(PRINT_NUMBER(lbuf, line));/* 6 */ + print_str("\n"); /* 7 */ + if (assertion) { + print_str("Assertion-Expr: "); /* 8 */ + print_str(failure->expr); /* 9 */ + print_str("\n"); /* 10 */ + } else { + print_str("Routine-Name: "); /* 8 */ + print_str(failure->expr); /* 9 */ + print_str("()\n"); /* 10 */ + } + if (vars->message != NULL) { + print_str("Assertion-Info: "); /* 11 */ + print_str(vars->message); /* 12 */ + print_str("\n"); /* 13 */ + } + } else if (vars->message != NULL) { + print_str("Error-Message: "); /* 3 */ + print_str(vars->message); /* 4 */ + print_str("\n"); /* 5 */ + } else if (vars->deadlocked) { + print_str("Deadlocked-At: "); /* 3 */ + print_str(vars->lock_file); /* 4 */ + print_str(":"); /* 5 */ + print_str(PRINT_NUMBER(lbuf, vars->lock_line)); /* 6 */ + print_str("\n"); /* 7 */ + } + flush_str(clf); + + if (vars->fail_name != NULL || vars->fail_stid != 0) { + rewind_str(0); + print_str("Thread-ID: "); /* 0 */ + print_str(PRINT_NUMBER(lbuf, vars->fail_stid)); /* 1 */ + print_str("\n"); /* 2 */ + if (vars->fail_name != NULL) { + print_str("Thread-Name: "); /* 3 */ + print_str(vars->fail_name); /* 4 */ + print_str("\n"); /* 5 */ + } + flush_str(clf); + } + + rewind_str(0); + print_str("Atomic-Operations: "); /* 0 */ + print_str(atomic_ops_available() ? "yes" : "no"); /* 1 */ + print_str("\n"); /* 2 */ + print_str("Threads: "); /* 3 */ + print_str(PRINT_NUMBER(sbuf, thread_count())); /* 4 */ + print_str(" ("); /* 5 */ + print_str(PRINT_NUMBER(nbuf, thread_discovered_count())); /* 6 */ + print_str(" discovered)\n"); /* 7 */ + flush_str(clf); + + rewind_str(0); + print_str("Auto-Restart: "); /* 0 */ + print_str(vars->supervised ? "supervised" : + vars->may_restart ? "enabled" : "disabled"); /* 1 */ + if (vars->supervised) { + if (1 == getppid()) { + print_str("; parent is gone though"); /* 2 */ + if (vars->may_restart) + print_str(", will auto-restart"); /* 3 */ + } else { + print_str("; parent still there"); /* 2 */ + } + } else if (t <= CRASH_MIN_ALIVE) { + char rtbufULONG_DEC_BUFLEN; + print_str("; run time threshold of "); /* 2 */ + print_str(PRINT_NUMBER(rtbuf, CRASH_MIN_ALIVE)); + print_str("s not reached"); /* 4 */ + } else { + print_str("; "); /* 2 */ + print_str(vars->may_restart ? "will" : "would"); /* 3 */ + print_str(" be attempted"); /* 4 */ + } + print_str("\n"); /* 5 */ + { + enum stacktrace_sym_quality sq = stacktrace_quality(); + if (STACKTRACE_SYM_GOOD != sq) { + const char *quality = stacktrace_quality_string(sq); + print_str("Stacktrace-Symbols: "); /* 6 */ + print_str(quality); /* 7 */ + print_str("\n"); /* 8 */ + } + } + + print_str("Stacktrace:\n"); /* 9 */ + flush_str(clf); + crash_stack_print(clf, 3); + + rewind_str(0); + print_str("\n"); /* 0 -- End of Header */ + flush_str(clf); +} + /* * Carefully close opened file descriptor. * @@ -803,32 +1471,109 @@ } /** + * Generate a crash logfile. + * + * This is used when there is no inspector run, to leave a trace of the crash. + */ +static void G_COLD +crash_generate_crashlog(int signo) +{ + static char crashlogMAX_PATH_LEN; + int clf; + const mode_t mode = S_IRUSR | S_IWUSR; + const int flags = O_CREAT | O_TRUNC | O_EXCL | O_WRONLY; + + crash_logpath(crashlog, sizeof crashlog); + clf = open(crashlog, flags, mode); + if (-1 == clf) { + char buf256; + str_bprintf(buf, sizeof buf, "cannot create %s: %m", crashlog); + s_miniwarn("%s", buf); + return; + } + crash_log_write_header(clf, signo, filepath_basename(crashlog)); + thread_lock_dump_all(clf); + crash_stack_print_decorated(clf, 2, FALSE); + crash_run_hooks(NULL, clf); + crash_dump_stacks(clf); + close(clf); + s_minimsg("trace left in %s", crashlog); + if (vars != NULL) { + uint8 t = TRUE; + crash_set_var(logged, t); + if (vars->dumps_core) { + bool gotcwd = NULL != getcwd(crashlog, sizeof crashlog); + s_minimsg("core dumped in %s", + gotcwd ? crashlog : "current directory"); + } + } +} + +/** + * Log system call error. + * + * Messsage is not duplicated to fd2 or out if they are identical to fd. + * + * @param what what failed exactly + * @param pid_str parent's PID string + * @param fd main fd to which we log + * @param fd2 second fd to which we log (can be -1) + * @param out if stdout is not stderr, additional fd to log to, if not -1 + */ +static void +crash_logerr(const char *what, const char *pid_str, int fd, int fd2, int out) +{ + char tbufCRASH_TIME_BUFLEN; + DECLARE_STR(10); + + crash_time(tbuf, sizeof tbuf); + rewind_str(0); + print_str(tbuf); /* 0 */ + print_str(" CRASH (pid="); /* 1 */ + print_str(pid_str); /* 2 (parent's PID) */ + print_str(") "); /* 3 */ + print_str(what); /* 4 */ + print_str(": "); /* 5 */ + print_str(symbolic_errno(errno)); /* 6 */ + print_str(" ("); /* 7 */ + print_str(g_strerror(errno)); /* 8 */ + print_str(")\n"); /* 9 */ + flush_str(fd); + if (fd2 != fd) + flush_str(fd2); + if (fd2 != out && fd2 != fd && log_stdout_is_distinct()) + flush_str(out); +} + +/** * Invoke the inspector process (gdb, or any other program specified at * initialization time). * * @return TRUE if we were able to invoke the crash hooks. */ -static G_GNUC_COLD gboolean +static bool G_COLD crash_invoke_inspector(int signo, const char *cwd) { const char *pid_str; - char pid_buf22; + char pid_bufULONG_DEC_BUFLEN; pid_t pid; int fd2; const char *stage = NULL; - gboolean retried_child = FALSE; - gboolean could_fork = has_fork(); + bool retried_child = FALSE, child_signal; + bool could_fork = has_fork(); int fork_errno = 0; int parent_stdout = STDOUT_FILENO; + int spfd = -1; /* set if we use spopenlp(), on Windows only */ - pid_str = print_number(pid_buf, sizeof pid_buf, getpid()); + pid_str = PRINT_NUMBER(pid_buf, crash_getpid()); #ifdef HAS_WAITPID retry_child: #endif + child_signal = FALSE; /* set if fork()ed child dies via a signal */ /* Make sure we don't exceed the system-wide file descriptor limit */ - close_file_descriptors(3); + fd_close_unpreserved_from(3); if (has_fork()) { /* In case fork() fails, make sure we leave stdout open */ @@ -856,7 +1601,7 @@ } } else { DECLARE_STR(2); - char time_buf18; + char time_bufCRASH_TIME_BUFLEN; crash_time(time_buf, sizeof time_buf); print_str(time_buf); @@ -877,7 +1622,7 @@ could_fork = FALSE; { DECLARE_STR(6); - char time_buf18; + char time_bufCRASH_TIME_BUFLEN; crash_time(time_buf, sizeof time_buf); print_str(time_buf); @@ -903,13 +1648,9 @@ char const *argv8; char filename80; char cmdMAX_PATH_LEN; - char rbuf22; - char sbufULONG_DEC_BUFLEN; - char tbuf22; - char lbuf22; - time_delta_t t; int clf = STDOUT_FILENO; /* crash log file fd */ - DECLARE_STR(15); + bool file_existed = FALSE; + const char *what = "something failed"; /* * Immediately unplug the crash handler in case we do something @@ -917,16 +1658,22 @@ * the parent see the failure. */ - if (could_fork) { + if (could_fork) crash_reset_signals(); - } /* * If we are retrying the child, don't discard what we can * have already from a previous run. + * + * Likewise, if the crashlog file already exists, we do not + * want to lose any information already present there. */ - if (retried_child) { + crash_logname(filename, sizeof filename, pid_str); + + file_existed = retried_child || file_exists(filename); + + if (file_existed) { flags = O_WRONLY | O_APPEND; } else { flags = O_CREAT | O_TRUNC | O_EXCL | O_WRONLY; @@ -937,7 +1684,7 @@ argv1 = vars->argv0; argv2 = pid_str; argv3 = NULL; - } else { + } else if (has_fork()) { const char quote_ch = '\''; size_t max_argv0; @@ -971,10 +1718,6 @@ argv2 = cmd; argv3 = NULL; } - crash_logname(filename, sizeof filename, pid_str); - crash_time_iso(tbuf, sizeof tbuf); - crash_run_time(rbuf, sizeof rbuf); - t = delta_time(time(NULL), vars->start_time); if (could_fork) { /* STDIN must be kept open when piping to gdb */ @@ -982,12 +1725,14 @@ if ( crash_fd_close(STDIN_FILENO) || STDIN_FILENO != open("/dev/null", O_RDONLY, 0) - ) + ) { + what = "stdin redirection"; goto child_failure; + } } - set_close_on_exec(PARENT_STDERR_FILENO); - set_close_on_exec(PARENT_STDOUT_FILENO); + fd_set_close_on_exec(PARENT_STDERR_FILENO); + fd_set_close_on_exec(PARENT_STDOUT_FILENO); } if (could_fork) { @@ -996,135 +1741,87 @@ crash_fd_close(STDERR_FILENO) || STDOUT_FILENO != open(filename, flags, mode) || STDERR_FILENO != dup(STDOUT_FILENO) - ) + ) { + what = "stdout/stderr redirection"; goto child_failure; + } } else { clf = open(filename, flags, mode); + if (-1 == clf) { + crash_logerr("cannot open crashlog file", pid_str, + STDERR_FILENO, -1, STDOUT_FILENO); + } + /* Don't mind if clf is -1 from now on */ } /* - * When retrying, issue a blank line, and mark retrying attempt. + * When the file was already existing and we're going to append + * to it, issue a blank line, flag the new starting point. */ - if (retried_child) { - print_str("\n---- Retrying:\n\n"); /* 0 */ + if (file_existed) { + DECLARE_STR(1); + if (retried_child) + print_str("\n---- Retrying:\n\n"); /* 0 */ + else + print_str("\n---- Appending:\n\n"); /* 0 */ flush_str(clf); - rewind_str(0); } /* * Emit crash header. */ - print_str("Executable-Path: "); /* 0 */ - print_str(vars->argv0); /* 1 */ - print_str("\n"); /* 2 */ - if (NULL != vars->version) { - print_str("Version: "); /* 3 */ - print_str(vars->version); /* 4 */ - print_str("\n"); /* 5 */ - } - print_str("Run-Elapsed: "); /* 6 */ - print_str(rbuf); /* 7 */ - print_str("\n"); /* 8 */ - print_str("Run-Seconds: "); /* 9 */ - print_str(print_number(sbuf, sizeof sbuf, MAX(t, 0))); /* 10 */ - print_str("\n"); /* 11 */ - print_str("Crash-Signal: "); /* 12 */ - print_str(signal_name(signo)); /* 13 */ - print_str("\n"); /* 14 */ - flush_str(clf); - rewind_str(0); - print_str("Crash-Time: "); /* 0 */ - print_str(tbuf); /* 1 */ - print_str("\n"); /* 2 */ - print_str("Core-Dump: "); /* 3 */ - print_str(vars->dumps_core ? "enabled" : "disabled"); /* 4 */ - print_str("\n"); /* 5 */ - if (NULL != vars->cwd) { - print_str("Working-Directory: "); /* 6 */ - print_str(vars->cwd); /* 7 */ - print_str("\n"); /* 8 */ - } - if (NULL != vars->exec_path) { - print_str("Exec-Path: "); /* 9 */ - print_str(vars->exec_path); /* 10 */ - print_str("\n"); /* 11 */ - } - if (NULL != vars->crashdir) { - print_str("Crash-Directory: "); /* 12 */ - print_str(vars->crashdir); /* 13 */ - print_str("\n"); /* 14 */ - } - flush_str(clf); - rewind_str(0); - print_str("Crash-File: "); /* 0 */ - print_str(filename); /* 1 */ - print_str("\n"); /* 2 */ - if (vars->failure != NULL) { - const assertion_data *failure = vars->failure; - if (failure->expr != NULL) { - print_str("Assertion-At: "); /* 3 */ - } else { - print_str("Reached-Code-At: "); /* 3 */ - } - print_str(failure->file); /* 4 */ - print_str(":"); /* 5 */ - print_str(print_number(lbuf, sizeof lbuf, failure->line)); - print_str("\n"); /* 6 */ - if (failure->expr != NULL) { - print_str("Assertion-Expr: "); /* 7 */ - print_str(failure->expr); /* 8 */ - print_str("\n"); /* 9 */ - } - if (vars->message != NULL) { - print_str("Assertion-Info: "); /* 10 */ - print_str(vars->message); /* 11 */ - print_str("\n"); /* 12 */ - } - } else if (vars->message != NULL) { - print_str("Error-Message: "); /* 3 */ - print_str(vars->message); /* 4 */ - print_str("\n"); /* 5 */ - } - flush_str(clf); + crash_log_write_header(clf, signo, filename); - rewind_str(0); - print_str("Atomic-Operations: "); /* 0 */ - print_str(atomic_ops_available() ? "yes" : "no"); /* 1 */ - print_str("\n"); /* 2 */ - flush_str(clf); + /* + * If we don't have fork() on this platform (Windows...), and + * they have not specified a program to exec(), we're going + * to attempt to launch gdb via spopenlp(), which will work when + * running under a MinGW shell or with Cygwin installed, provided + * gdb is anywhere in the PATH. + * --RAM, 2015-11-02 + */ - rewind_str(0); - print_str("Auto-Restart: "); /* 0 */ - print_str(vars->may_restart ? "enabled" : "disabled"); /* 1 */ - if (t <= CRASH_MIN_ALIVE) { - char rtbufULONG_DEC_BUFLEN; - print_str("; run time threshold of "); /* 2 */ - print_str(print_number(rtbuf, sizeof rtbuf, CRASH_MIN_ALIVE)); - print_str("s not reached"); /* 4 */ - } else { - print_str("; "); /* 2 */ - print_str(vars->may_restart ? "will" : "would"); /* 3 */ - print_str(" be attempted"); /* 4 */ - } - print_str("\n"); /* 5 */ - { - enum stacktrace_sym_quality sq = stacktrace_quality(); - if (STACKTRACE_SYM_GOOD != sq) { - const char *quality = stacktrace_quality_string(sq); - print_str("Stacktrace-Symbols: "); /* 6 */ - print_str(quality); /* 7 */ - print_str("\n"); /* 8 */ + if (!has_fork() && NULL == vars->exec_path) { + int dup_clf; + DECLARE_STR(2); + + thread_lock_dump_all(clf); + IGNORE_RESULT(write(clf, "\n", 1)); + crash_stack_print_decorated(clf, 2, FALSE); + + print_str("\n"); + print_str("Will try to launch gdb from Cygwin or MinGW...\n"); + flush_str(clf); + + /* + * We don't care if the dup() below fails because -1 is a + * valid value for fd0: it means SPOPEN_ASIS, which will let + * the child use the parent's stdout, so we'll see the output + * somewhere in the logs. + */ + + dup_clf = dup(clf); /* Will be closed by spopenlp() */ + + fd0 = dup_clf; /* Child's stdout, -1 works as well! */ + fd1 = SPOPEN_CHILD_STDOUT; + + spfd = spopenlp("gdb", "w", fd, + "gdb", "-q", "-n", "-p", pid_str, NULL_PTR); + + if (-1 == spfd) { + crash_logerr("spopen() failed", pid_str, + STDERR_FILENO, clf, STDOUT_FILENO); + crash_stack_print_decorated(clf, 2, FALSE); + } else { + /* We'll wait for child and close the pipe ourselves */ + pid = sppid(spfd, TRUE); } - } - print_str("Stacktrace:\n"); /* 9 */ - flush_str(clf); - crash_stack_print(clf, 2); - rewind_str(0); - print_str("\n"); /* 0 -- End of Header */ - flush_str(clf); + crash_fd_close(clf); + goto parent_process; + } /* * If we don't have fork() on this platform (or could not fork) @@ -1133,17 +1830,15 @@ */ if (!could_fork) { - rewind_str(0); - if (!has_fork()) { - print_str("No fork() on this platform.\n"); - } else { - print_str("fork() failed: "); - print_str(symbolic_errno(fork_errno)); - print_str(" ("); - print_str(g_strerror(fork_errno)); - print_str(")\n"); + if (has_fork()) { + /* Was already logged above to stderr/stdout */ + errno = fork_errno; + crash_logerr("fork() failed", pid_str, clf, -1, -1); } - flush_str(clf); + thread_lock_dump_all(clf); + IGNORE_RESULT(write(clf, "\n", 1)); + crash_stack_print_decorated(clf, 2, FALSE); + crash_dump_stacks(clf); crash_fd_close(clf); goto parent_process; } @@ -1163,7 +1858,28 @@ if (!retried_child) { log_force_fd(LOG_STDERR, PARENT_STDERR_FILENO); log_set_disabled(LOG_STDOUT, TRUE); + + thread_lock_dump_all(STDOUT_FILENO); + IGNORE_RESULT(write(STDOUT_FILENO, "\n", 1)); + crash_run_hooks(NULL, STDOUT_FILENO); + IGNORE_RESULT(write(STDOUT_FILENO, "\n", 1)); + + /* + * Even though we're in the child process, say FALSE because + * we want the original stack frame from the parent if it was + * saved, not the current one. + */ + + crash_stack_print_decorated(STDOUT_FILENO, 2, FALSE); + + /* + * Unfortunately, we cannot run crash_dump_stacks() in the + * child because fork() is not going to recreate all the + * threads: only the one running fork() will end up remaining + * in the child process. + */ + log_set_disabled(LOG_STDOUT, FALSE); } @@ -1204,32 +1920,27 @@ execve(argv0, (const void *) argv, NULL); } - /* Log exec failure */ - crash_time(tbuf, sizeof tbuf); - rewind_str(0); - print_str(tbuf); /* 0 */ - print_str(" CRASH (pid="); /* 1 */ - print_str(pid_str); /* 2 (parent's PID) */ - print_str(") "); /* 3 */ - print_str("exec() error: "); /* 4 */ - print_str(symbolic_errno(errno)); /* 5 */ - print_str(" ("); /* 6 */ - print_str(g_strerror(errno)); /* 7 */ - print_str(")\n"); /* 8 */ - flush_str(PARENT_STDERR_FILENO); - flush_str(STDOUT_FILENO); /* into crash file as well */ - if (log_stdout_is_distinct()) - flush_str(parent_stdout); + what = "exec() error"; + + /* FALL THROUGH */ child_failure: + + /* Log child failure */ + + crash_logerr(what, pid_str, + PARENT_STDERR_FILENO, STDOUT_FILENO, parent_stdout); + _exit(EXIT_FAILURE); - } + } break; default: /* executed by parent */ break; } + /* FALL THROUGH */ + /* * The following is only executed by the parent process. */ @@ -1238,9 +1949,9 @@ { DECLARE_STR(10); unsigned iov_prolog; - char time_buf18; + char time_bufCRASH_TIME_BUFLEN; int status; - gboolean child_ok = FALSE; + bool child_ok = FALSE; if (has_fork()) { crash_fd_close(PARENT_STDERR_FILENO); @@ -1252,12 +1963,14 @@ * succeed or get EPIPE if the child dies and closes its end. */ - if (could_fork) { - static const char commands = "bt\nbt full\nquit\n"; + if (could_fork || is_valid_fd(spfd)) { + static const char commands = + "thread\nbt\nbt full\nthread apply all bt\nquit\n"; const size_t n = CONST_STRLEN(commands); ssize_t ret; + int cfd = is_valid_fd(spfd) ? spfd : STDOUT_FILENO; - ret = write(STDOUT_FILENO, commands, n); + ret = write(cfd, commands, n); if (n != UNSIGNED(ret)) { /* * EPIPE is acceptable if the child's immediate action @@ -1288,7 +2001,7 @@ print_str(") "); /* 3 */ iov_prolog = getpos_str(); - if (!could_fork) { + if (!could_fork && !is_valid_fd(spfd)) { child_ok = TRUE; goto no_fork; } @@ -1297,7 +2010,7 @@ if ((pid_t) -1 == waitpid(pid, &status, 0)) { char bufULONG_DEC_BUFLEN; print_str("could not wait for child (errno = "); /* 4 */ - print_str(print_number(buf, sizeof buf, errno)); /* 5 */ + print_str(PRINT_NUMBER(buf, errno)); /* 5 */ print_str(")\n"); /* 6 */ flush_err_str(); } else if (WIFEXITED(status)) { @@ -1307,15 +2020,14 @@ char bufULONG_DEC_BUFLEN; print_str("child exited with status "); /* 4 */ - print_str(print_number(buf, sizeof buf, - WEXITSTATUS(status))); /* 5 */ + print_str(PRINT_NUMBER(buf, WEXITSTATUS(status))); /* 5 */ print_str("\n"); /* 6 */ flush_err_str(); if (log_stdout_is_distinct()) flush_str(parent_stdout); } } else { - gboolean may_retry = FALSE; + bool may_retry = FALSE; if (WIFSIGNALED(status)) { int sig = WTERMSIG(status); @@ -1324,6 +2036,7 @@ if (!retried_child && NULL != crash_get_hook()) { may_retry = TRUE; } + child_signal = TRUE; } else { print_str("child exited abnormally"); /* 4 */ } @@ -1348,10 +2061,20 @@ goto retry_child; } } + + /* + * Since gdb frowns upon its stdin being closed before it quits, + * we close the pipe only after the child is gone (since we send + * it a "quit" command, we know it will exit). + */ + + fd_close(&spfd); /* Only if we spopen()ed a gdb command */ #else (void) status; #endif /* HAS_WAITPID */ + /* FALL THROUGH */ + /* * Let them know where the trace is. * @@ -1388,6 +2111,39 @@ flush_err_str(); if (log_stdout_is_distinct()) flush_str(parent_stdout); + + /* + * If we could fork but the child failed with a signal (assertion + * failure, segmentation fault), append a decorated stack trace + * to the crashlog. + * + * We don't do it on "normal" child failure, which could happen + * if the program does not launch, fails, etc... because we + * append such a stack trace normally before exec(). + */ + + if (could_fork && child_signal) { + bool success; + + rewind_str(iov_prolog); + print_str("attempting to append a decorated stacktrace to "); + print_str(buf); + print_str("\n"); + flush_err_str(); + if (log_stdout_is_distinct()) + flush_str(parent_stdout); + + success = crash_append_decorated_stack(2); + + rewind_str(iov_prolog); + if (success) + print_str("appending was successful\n"); + else + print_str("appending attempt failed\n"); + flush_err_str(); + if (log_stdout_is_distinct()) + flush_str(parent_stdout); + } } /* @@ -1447,7 +2203,7 @@ parent_failure: { DECLARE_STR(6); - char time_buf18; + char time_bufCRASH_TIME_BUFLEN; crash_time(time_buf, sizeof time_buf); print_str(time_buf); /* 0 */ @@ -1464,17 +2220,436 @@ return FALSE; } +struct crash_inspect_args { + int signo; + const char *cwd; + int *done; +}; + +static void * +crash_inspect_thread(void *args) +{ + struct crash_inspect_args *v = args; + bool hooks; + + hooks = crash_invoke_inspector(v->signo, v->cwd); + + /* + * Propagate back to crash_invoke_threaded_inspector() that we are + * done (since we're running detached) and whether we run the crash + * hooks at all. + */ + + atomic_int_set(v->done, hooks ? 2 : 1); + + return NULL; +} + +/** + * The threaded version of crash_invoke_inspector(), for Windows. + */ +static bool G_COLD +crash_invoke_threaded_inspector(int signo, const char *cwd) +{ + struct crash_inspect_args v; + int done = 0; + uint flags = THREAD_F_DETACH | THREAD_F_NO_CANCEL | THREAD_F_UNSUSPEND; + + /* + * Generate a first crashlog, as if there was no inspector being run, + * in case we fail miserably when attempting to create the thread below. + */ + + crash_generate_crashlog(signo); + + v.signo = signo; + v.cwd = cwd; + v.done = &done; /* Communication channel with thread */ + + if (-1 == thread_create(crash_inspect_thread, &v, flags, 0)) + return FALSE; + + /* + * Yes, this is an *active* waiting loop but there is no other way: we + * MUST NOT be in any Windows DLL otherwise gdb will not be able to trace + * back this thread, which is the crashing thread so precisely the one + * we want to backtrace! + */ + + while (0 == atomic_int_get(&done)) + /* empty */; + + return done > 1; +} + +/** + * Wrapper to invoke the inspecting process. + * + * @return TRUE if we were able to invoke the crash hooks. + */ +static bool G_COLD +crash_inspect(int signo, const char *cwd) +{ + /* + * We need to pay attention to Windows because when gdb attaches + * to the running process, it messes up the stack backtracing of + * the running thread. + * + * So we create a thread and actively wait for its termination before + * resuming, propagating the results back. Hopefully the crash will + * not prevent the memory operations necessary to create a new thread. + * --RAM, 2015-11-06 + */ + + if (is_running_on_mingw() && NULL == vars->exec_path) { + return crash_invoke_threaded_inspector(signo, cwd); + } else { + return crash_invoke_inspector(signo, cwd); + } +} + +/** + * Record failing thread information. + */ +static void G_COLD +crash_record_thread(void) +{ + if (vars != NULL && NULL == vars->fail_name) { + unsigned stid = thread_safe_small_id(); + const char *name; + + if (THREAD_UNKNOWN_ID == stid) { + name = "could not compute thread ID"; + crash_set_var(fail_name, name); + } else { + crash_set_var(fail_stid, stid); + if (vars->logck != NULL) { + const char *tname = thread_safe_id_name(stid); + name = ck_strdup_readonly(vars->logck, tname); + if (NULL == name) + name = "could not allocate name"; + crash_set_var(fail_name, name); + } else { + name = "no log chunk to allocate from"; + crash_set_var(fail_name, name); + } + } + } +} + +/** + * Invoked when we've detected a memory shortage condition, + * + * Enble safety precaution since this is a prelude to a fatal out-of-memory. + * We are running on thin memory, burning our reserves so limit consumption + * of memory when logging or dumping stacks. + */ +void G_COLD +crash_oom_condition(void) +{ + log_crash_mode(); + stacktrace_crash_mode(); +} + +/** + * Check whether last assertion failure seen indicates an error in the + * specified file, or whether the current thread is holding a lock + * originating from the specified file. + * + * This is used to detect panics from memory allocators for instance, to + * put them into a minimal and hopefully safe state when their code is + * the one triggering an error. + * + * @param file the source file from which we are looking for an error + * + * @return TRUE if the last assertion failure occurred in the file or if + * we are currently holding a lock from that file. + */ +static bool G_COLD +crash_is_from(const char *file) +{ + if ( + NULL != crash_last_assertion_failure && + 0 == strcmp(file, crash_last_assertion_failure->file) + ) + return TRUE; + + if ( + NULL != crash_last_deadlock_file && + 0 == strcmp(file, crash_last_deadlock_file) + ) + return TRUE; + + if (vars != NULL) { + if (NULL != vars->failure && 0 == strcmp(file, vars->failure->file)) + return TRUE; + if (vars->deadlocked && 0 == strcmp(file, vars->lock_file)) + return TRUE; + } + + return thread_lock_holds_from(file); +} + +/** + * Arena used by the fix-sized hash table that keeps track of things we + * have already disabled in crash_disable(). + */ +static char crash_disable_buffer1024; +static hash_table_t *crash_disabled; +static once_flag_t disable_inited; + + +/** + * Initialize the fix-sized hash table for crash_disable_if_from(). + */ +static void +crash_disable_init(void) +{ + crash_disabled = hash_table_new_fixed( + crash_disable_buffer, sizeof crash_disable_buffer); +} + +/** + * Forcefully disable a memory allocator. + * + * @param name name of the memory allocator + * @param cb disabling callback to invoke + */ +static void G_COLD +crash_disable(const char *name, callback_fn_t cb) +{ + once_flag_run(&disable_inited, crash_disable_init); + + if (!hash_table_contains(crash_disabled, cb)) { + hash_table_insert(crash_disabled, cb, bool_to_pointer(TRUE)); + s_miniwarn("enabling crash mode for %s", name); + (*cb)(); + } +} + +/** + * Disable a memory allocator if crash comes from the listed file. + * + * @param file the file to look for a failure or a lock being held + * @param name name of the memory allocator + * @param cb disabling callback to invoke + */ +static void G_COLD +crash_disable_if_from(const char *file, const char *name, callback_fn_t cb) +{ + if (crash_is_from(file)) + crash_disable(name, cb); +} + +static spinlock_t crash_mode_slk = SPINLOCK_INIT; + +/** + * Get current crash level. + */ +static enum crash_level G_COLD +crash_level(void) +{ + enum crash_level level; + + spinlock_hidden(&crash_mode_slk); + level = crash_current_level; + spinunlock_hidden(&crash_mode_slk); + + return level; +} + /** - * Entering crash mode. + * Entering crash mode, for a given level. + * + * @param level the crash level, to determine what we need to disable + * + * @return FALSE if we had already entered crash_mode(), TRUE the first time. */ -static G_GNUC_COLD void -crash_mode(void) +static bool G_COLD +crash_mode(enum crash_level level) { + static int done; + static int haltedTHREAD_MAX; + enum crash_level old_level, new_level; + int depth = atomic_int_inc(&done); + int stid; + + g_assert(level != CRASH_LVL_NONE); + + /* + * Record the ID of the first crashing thread. + * + * This thread can never be suspended or it will not be able to + * continue gathering the crashing information. + */ + + if (0 == depth) { + s_rawdebug("%s(): initial call, level=%s from %s", + G_STRFUNC, crash_level_to_string(level), thread_safe_name()); + + crash_thread_id = thread_safe_small_id(); + atomic_mb(); + } else if (!crash_is_crashing_thread(&stid)) { + /* + * Ensure we do not endlessly log concurrent calls because for some + * reason there is another cause for calling crash_mode() during + * the processing of s_rawarn() or thread_halt(). + */ + + if (stid >= 0) { + if (haltedstid) { + /* + * Something is wrong, the thread was supposed to be halted. + * Use the simplest system call we can to definitely stop + * the thread forever! + */ + for (;;) { + compat_poll(NULL, 0, 1000); + } + } else { + haltedstid = TRUE; /* About to stop thread */ + } + } + + s_rawwarn("%s(): concurrent call, level=%s from %s", + G_STRFUNC, crash_level_to_string(level), thread_safe_name()); + + thread_halt(); /* No coming back */ + } else if (level > crash_current_level) { + s_rawdebug("%s(): subsequent call, level=%s", + G_STRFUNC, crash_level_to_string(level)); + } + + spinlock_hidden(&crash_mode_slk); + + /* + * Crash level can only increase. + */ + + old_level = crash_current_level; + new_level = MAX(old_level, level); + + /* + * If called another time with something more critical than an OOM + * condition, force a recursive level. + */ + + if (level != CRASH_LVL_BASIC && old_level > CRASH_LVL_OOM) + new_level = CRASH_LVL_RECURSIVE; + + crash_current_level = new_level; + + spinunlock_hidden(&crash_mode_slk); + + if (old_level == new_level) + return FALSE; /* No change, still crashing */ + + switch (new_level) { + case CRASH_LVL_RECURSIVE: + /* + * Since we are recursing into the crash handler, do not take risks + * and make sure memory allocators are not adding an additional + * failure cause. + */ + + crash_disable("xmalloc", xmalloc_crash_mode); + crash_disable("VMM", vmm_crash_mode); + crash_disable("walloc", walloc_crash_mode); + stacktrace_crash_mode(); + + /* FALL THROUGH */ + + case CRASH_LVL_EXCEPTION: + /* + * Make sure critical routines will avoid memory allocationn -- all + * those checking for signal_in_exception() -- when we are actually + * crashing, in order to limit potentially risky behaviours whilst we + * are gathering crashing information. + */ + + signal_crashing(); + log_crash_mode(); + thread_lock_disable(FALSE); + + /* FALL THROUGH */ + + case CRASH_LVL_FAILURE: + case CRASH_LVL_DEADLOCKED: + /* + * Put our main allocators in crash mode, which will limit risks if we + * are crashing due to a data structure corruption or an assertion + * failure. + * + * We only do this when the allocator is actually involved in the + * crash, and disabling of a particular allocator is only done once, + * based on the disabling routine. + * + * Some allocators rely on others, so we need to take that into account. + * For instance, xmalloc() can use palloc() to allocate thread chunks. + * Therefore, any failure in palloc() must diable xmalloc() as well. + * Likewise, tmalloc() is used by both walloc() and the VMM layer + * for small pages, hence any failure in tmalloc() must disable both + * upper clients. + */ + + crash_disable_if_from("lib/xmalloc.c", "xmalloc", xmalloc_crash_mode); + crash_disable_if_from("lib/palloc.c", "xmalloc", xmalloc_crash_mode); + crash_disable_if_from("lib/vmm.c", "VMM", vmm_crash_mode); + crash_disable_if_from("lib/walloc.c", "walloc", walloc_crash_mode); + crash_disable_if_from("lib/zalloc.c", "walloc", walloc_crash_mode); + crash_disable_if_from("lib/zalloc.c", "VMM", vmm_crash_mode); + crash_disable_if_from("lib/tmalloc.c", "walloc", walloc_crash_mode); + crash_disable_if_from("lib/tmalloc.c", "VMM", vmm_crash_mode); + + /* FALL THROUGH */ + + case CRASH_LVL_OOM: + case CRASH_LVL_BASIC: + /* + * Suspend the other threads if possible, to avoid a cascade of errors + * and other assertion failures. If a thread is crashing, something is + * wrong in the application global state. + * + * This is advisory suspension only, and we do not wait for all the + * other threads to have released their locks since we are in a rather + * emergency situation. + */ + + thread_crash_mode(); + goto done; + + case CRASH_LVL_NONE: + break; + } + + g_assert_not_reached(); + +done: + /* + * Specifically for OOM conditions, also put the logging layer in crash + * mode so that we avoid fancy stack traces -- they require a lot of memory. + */ + + if (CRASH_LVL_OOM == level) + crash_oom_condition(); + + /* + * Specifically for deadlock conditions, disable all locks. + */ + + if (CRASH_LVL_DEADLOCKED == level) + thread_lock_disable(FALSE); + + /* + * Activate crash mode. + */ + if (vars != NULL) { - if (!vars->crash_mode) { - guint8 t = TRUE; + if (!vars->crashing) { + uint8 t = TRUE; - crash_set_var(crash_mode, t); + crash_set_var(crashing, t); + crash_record_thread(); /* * Configuring crash mode logging requires a formatting string. @@ -1485,10 +2660,10 @@ */ ck_writable(vars->fmtck); /* Chunk holding vars->fmtstr */ - log_crashing(vars->fmtstr); + log_crashing_str(vars->fmtstr); } if (ck_is_readonly(vars->fmtck)) { - char time_buf18; + char time_bufCRASH_TIME_BUFLEN; DECLARE_STR(2); crash_time(time_buf, sizeof time_buf); @@ -1497,10 +2672,10 @@ flush_err_str(); } } else { - static gboolean warned; + static bool warned; if (!warned) { - char time_buf18; + char time_bufCRASH_TIME_BUFLEN; DECLARE_STR(2); warned = TRUE; @@ -1510,6 +2685,81 @@ flush_err_str(); } } + + return TRUE; +} + +/** + * Report on emergency memory usage, once, if needed at all. + */ +static void G_COLD +crash_vmea_usage(void) +{ + static bool done; + size_t reserved; + + if (done) + return; + + done = TRUE; + reserved = vmea_capacity(); + + /* + * Logging the amount of emergency memory used lets us tailor the amount + * we really need to reserve at startup to avoid wasting too much unused + * memory, yet allow room for dire conditions. + */ + + if (reserved != 0) { + size_t nba = vmea_allocations(); + + if (nba != 0) { + size_t nbf = vmea_freeings(); + size_t allocated = vmea_allocated(); + + s_miniinfo("still using %'zu bytes out of the %'zu reserved, " + "after %zu emergency allocation%s and %zu freeing%s", + allocated, reserved, nba, plural(nba), nbf, plural(nbf)); + } + } +} + +/** + * Called when we're about to re-exec() ourselves in some way to auto-restart. + */ +static void G_COLD +crash_restart_notify(const char *caller) +{ + crash_vmea_usage(); /* Report on emergency memory usage, if needed */ + + if (NULL == vars) { + s_minicrit("%s(): no crash_init() yet!", caller); + _exit(EXIT_FAILURE); + } + + /* + * This covers situation where an assertion failure occurs on the + * application exit path, after crash_restarting() has been called. + * + * However, if crash_restart() was called, then crash_restart_initiated + * is set and the application wants to restart after it terminates + * its exit sequence. + */ + + if (atomic_int_get(&crash_exit_started) && !crash_restart_initiated) { + s_miniwarn("%s(): already started exiting, forcing.", caller); + _exit(EXIT_SUCCESS); + } + + /* + * We cannot restart if we have not saved the original argv in order + * to build the proper exec() arguments. + */ + + if (0 == vars->argc) { + s_minicrit("%s(): no crash_setmain() yet!", caller); + _exit(EXIT_FAILURE); + } } /** @@ -1517,14 +2767,36 @@ * * This function only returns when exec()ing fails. */ -static G_GNUC_COLD void +static void G_COLD crash_try_reexec(void) { char dirMAX_PATH_LEN; - if (NULL == vars) { - s_carp("%s(): no crash_init() yet!", G_STRFUNC); - _exit(EXIT_FAILURE); + crash_restart_notify(G_STRFUNC); + + /* + * If process is supervised and the parent is still here, then exit + * with a failure status to let our parent handle the restarting. + */ + + if (vars->supervised) { + pid_t parent = getppid(); + + if (1 != parent) { + /* Watch out on Windows: make sure our getppid() is reliable */ + if (parent != vars->ppid) { + s_miniwarn("%s(): changed parent? (was PID=%lu, now %lu)", + G_STRFUNC, (ulong) vars->ppid, (ulong) parent); + } + s_minimsg("%s(): letting our parent (PID=%lu) restart ourselves", + G_STRFUNC, (ulong) parent); + _exit(EXIT_FAILURE); + } else { + s_miniwarn("%s(): supervising parent (PID=%lu) is gone!", + G_STRFUNC, (ulong) vars->ppid); + } + + /* FALL THROUGH -- parent is gone */ } /* @@ -1534,13 +2806,13 @@ */ if (NULL != vars->cwd) { - gboolean gotcwd = NULL != getcwd(dir, sizeof dir); + bool gotcwd = NULL != getcwd(dir, sizeof dir); if (-1 == chdir(vars->cwd)) { - s_warning("%s(): cannot chdir() to \"%s\": %m", + s_miniwarn("%s(): cannot chdir() to \"%s\": %m", G_STRFUNC, vars->cwd); } else if (gotcwd && 0 != strcmp(dir, vars->cwd)) { - s_message("switched back to directory %s", vars->cwd); + s_minimsg("switched back to directory %s", vars->cwd); } } @@ -1563,10 +2835,10 @@ str_cat(vars->logstr, vars->argvi); } - s_message("launching %s", str_2c(vars->logstr)); + s_minimsg("launching %s", str_2c(vars->logstr)); } else { - s_message("launching %s with %d argument%s", vars->argv0, - vars->argc, 1 == vars->argc ? "" : "s"); + s_minimsg("launching %s with %d argument%s", vars->argv0, + vars->argc, plural(vars->argc)); } /* @@ -1577,15 +2849,15 @@ signal_set(SIGPROF, SIG_IGN); /* In case we're running under profiler */ #endif - close_file_descriptors(3); + signal_perform_cleanup(); + fd_close_from(3); crash_reset_signals(); - execve(vars->argv0, - (const void *) vars->argv, (const void *) vars->envp); + execve(vars->argv0, (const void *) vars->argv, (const void *) vars->envp); /* Log exec() failure */ { - char tbuf22; + char tbufCRASH_TIME_BUFLEN; DECLARE_STR(6); crash_time(tbuf, sizeof tbuf); @@ -1623,9 +2895,58 @@ * Handle possible auto-restart, if configured. * This function does not return when auto-restart succeeds */ -static G_GNUC_COLD void +static void G_COLD crash_auto_restart(void) { + crash_restart_notify(G_STRFUNC); + + /* + * If process is supervised and the parent is still here, then abort, + * which will report failure in parent. + */ + + if (vars->supervised) { + pid_t parent; + char time_bufCRASH_TIME_BUFLEN; + char pid_bufULONG_DEC_BUFLEN; + DECLARE_STR(6); + + crash_time(time_buf, sizeof time_buf); + print_str(time_buf); /* 0 */ + parent = getppid(); + + if (1 != parent) { + print_str(" (WARNING) not auto-restarting: "); /* 1 */ + print_str("supervising parent PID="); /* 2 */ + print_str(PRINT_NUMBER(pid_buf, parent)); /* 3 */ + print_str(" still present"); /* 4 */ + } else { + print_str(" (WARNING) supervising parent PID=");/* 1 */ + print_str(PRINT_NUMBER(pid_buf, vars->ppid)); /* 2 */ + print_str(" is gone!"); /* 3 */ + } + print_str("\n"); /* 5 */ + flush_err_str(); + if (log_stdout_is_distinct()) + flush_str(STDOUT_FILENO); + + if (1 != parent) { + /* + * Still superviseed, but if we can dump a core, it would + * be nice to have one for post-mortem analysis. + */ + + if (vars->dumps_core) { + signal(SIGABRT, SIG_DFL); /* Not signal_catch() */ + raise(SIGABRT); + } + + exit(EXIT_FAILURE); /* For our parent to catch */ + } + + /* FALL THROUGH -- parent is gone */ + } + /* * When the process has been alive for some time (CRASH_MIN_ALIVE secs, * to avoid repetitive frequent failures), we can consider auto-restarts @@ -1634,8 +2955,8 @@ if (delta_time(time(NULL), vars->start_time) <= CRASH_MIN_ALIVE) { if (vars->may_restart) { - char time_buf18; - char runtime_buf22; + char time_bufCRASH_TIME_BUFLEN; + char runtime_bufCRASH_RUNTIME_BUFLEN; DECLARE_STR(5); crash_time(time_buf, sizeof time_buf); @@ -1653,8 +2974,8 @@ } if (vars->may_restart) { - char time_buf18; - char runtime_buf22; + char time_bufCRASH_TIME_BUFLEN; + char runtime_bufCRASH_RUNTIME_BUFLEN; DECLARE_STR(6); crash_time(time_buf, sizeof time_buf); @@ -1733,17 +3054,103 @@ } /** + * Pause the process and make sure crash_is_pausing() sees us as pausing. + */ +static void +crash_pause(void) +{ + atomic_bool_set(&crash_pausing, TRUE); + compat_pause(); + atomic_bool_set(&crash_pausing, FALSE); +} + +/** + * Context variable for crash_handler(). + */ +struct crash_handler_ctx { + const char *cwd; + const char *name; + bool trace; + bool recursive; + bool in_child; + int signo; +}; + +static volatile sig_atomic_t crash_count; + +/** + * Heavy processing from crash_handler() that we attempt to divert to the + * main thread if possible (hence it being done in a separate routine, with + * all the variable gathered by crash_handler() already passed in a structure. + */ +static void * G_COLD +crash_handler_process(void *arg) +{ + struct crash_handler_ctx *v = arg; + + crash_message(v->name, v->trace, v->recursive); + if (v->trace) { + crash_stack_print(STDERR_FILENO, 1); + if (log_stdout_is_distinct()) + crash_stack_print(STDOUT_FILENO, 1); + + /* + * If we are in a signal handler and are not going to invoke an + * inspector, dump a decorated stack. + */ + + if (signal_in_handler() && !vars->invoke_inspector) + crash_emit_decorated_stack(1, v->in_child); + } + if ((v->recursive && 1 == ATOMIC_GET(&crash_count)) || v->in_child) { + crash_emit_decorated_stack(1, v->in_child); + crash_end_of_line(TRUE); + goto the_end; + } + if (!vars->invoke_inspector) + crash_generate_crashlog(v->signo); + crash_end_of_line(FALSE); + if (vars->invoke_inspector) { + bool hooks; + + hooks = crash_inspect(v->signo, v->cwd); + if (!hooks) { + uint8 f = FALSE; + crash_run_hooks(NULL, -1); + crash_set_var(invoke_inspector, f); + crash_end_of_line(FALSE); + } + } + if (vars->pause_process && vars->invoke_inspector) { + uint8 f = FALSE; + crash_set_var(invoke_inspector, f); + crash_end_of_line(FALSE); + } + if (vars->pause_process) { + crash_pause(); + } + +the_end: + if (!v->in_child) + crash_auto_restart(); + raise(SIGABRT); /* This is the end of our road */ + + g_assert_not_reached(); + return NULL; /* Never used by caller! */ +} +/** * The signal handler used to trap harmful signals. */ -G_GNUC_COLD void +void G_COLD crash_handler(int signo) { - static volatile sig_atomic_t crashed; - const char *name; - const char *cwd = ""; + struct crash_handler_ctx v; unsigned i; - gboolean trace; - gboolean recursive = crashed > 0; + + ZERO(&v); + v.cwd = ""; + v.recursive = ATOMIC_GET(&crash_count) > 0; + v.signo = signo; /* * SIGBUS and SIGSEGV are configured by signal_set() to be reset to the @@ -1755,22 +3162,54 @@ * the default handler normally leads to fatal error triggering a core dump. */ - if (crashed++ > 1) { - if (2 == crashed) { + if (ATOMIC_INC(&crash_count) > 1) { + if (2 == ATOMIC_GET(&crash_count)) { DECLARE_STR(1); print_str("\nERROR: too many recursive crashes\n"); flush_err_str(); signal_set(signo, SIG_DFL); raise(signo); - } else if (3 == crashed) { + } else if (3 == ATOMIC_GET(&crash_count)) { raise(signo); } _exit(EXIT_FAILURE); /* Die, die, die! */ } - for (i = 0; i < G_N_ELEMENTS(signals); i++) { + /* + * Since we're about to crash, we need to perform emergency cleanup. + * + * This is cleanup meant to release precious system resources, as necessary, + * which would not otherwise be cleaned up by the kernel upon process exit. + */ + + if (1 == ATOMIC_GET(&crash_count)) + signal_perform_cleanup(); + + /* + * If we are in the child process, prevent any exec() or pausing. + */ + + if (vars != NULL && vars->pid != getpid()) { + uint8 f = FALSE; + v.in_child = TRUE; + crash_set_var(invoke_inspector, f); + crash_set_var(may_restart, f); + crash_set_var(pause_process, f); + } + + for (i = 0; i < N_ITEMS(signals); i++) { int sig = signalsi; + + /* + * Do not change disposition of the signal used by the thread layer + * to generate thread interrupts. It may be harmful if received, + * but it is caught and handled. + */ + + if G_UNLIKELY(THREAD_SIGINTR == sig) + continue; + switch (sig) { #ifdef SIGBUS case SIGBUS: @@ -1813,11 +3252,20 @@ * Enter crash mode and configure safe logging parameters. */ - crash_mode(); + if (v.recursive) + crash_mode(CRASH_LVL_RECURSIVE); + else if (signal_in_exception()) + crash_mode(CRASH_LVL_EXCEPTION); + else if (SIGABRT == signo && crash_last_assertion_failure != NULL) + crash_mode(CRASH_LVL_FAILURE); + else if (signal_in_handler()) + crash_mode(CRASH_LVL_EXCEPTION); + else + crash_mode(CRASH_LVL_BASIC); - if (recursive) { + if (v.recursive) { if (!vars->recursive) { - guint8 t = TRUE; + uint8 t = TRUE; crash_set_var(recursive, t); } } @@ -1826,11 +3274,13 @@ * When crash_close() was called, print minimal error message and exit. */ - name = signal_name(signo); + v.name = signal_name(signo); if (vars->closed) { - crash_message(name, FALSE, recursive); - crash_end_of_line(); + crash_message(v.name, FALSE, v.recursive); + if (!v.recursive) + crash_emit_decorated_stack(1, v.in_child); + crash_end_of_line(FALSE); _exit(EXIT_FAILURE); } @@ -1840,74 +3290,79 @@ * even if we're daemonized. */ - if (!recursive && NULL != vars->crashdir && vars->invoke_inspector) { + if (!v.recursive && NULL != vars->crashdir && vars->invoke_inspector) { if (-1 == chdir(vars->crashdir)) { if (NULL != vars->cwd) { - s_warning("cannot chdir() back to \"%s\", " + s_miniwarn("cannot chdir() back to \"%s\", " "staying in \"%s\" (errno = %d)", vars->crashdir, vars->cwd, errno); - cwd = vars->cwd; + v.cwd = vars->cwd; } else { - s_warning("cannot chdir() back to \"%s\" (errno = %d)", + s_miniwarn("cannot chdir() back to \"%s\" (errno = %d)", vars->crashdir, errno); } } else { - cwd = vars->crashdir; + v.cwd = vars->crashdir; } } - trace = recursive ? FALSE : !stacktrace_cautious_was_logged(); - - crash_message(name, trace, recursive); - if (trace) { - crash_stack_print(STDERR_FILENO, 1); - if (log_stdout_is_distinct()) - crash_stack_print(STDOUT_FILENO, 1); - } - crash_end_of_line(); - if (vars->invoke_inspector) { - gboolean hooks = crash_invoke_inspector(signo, cwd); - if (!hooks) { - guint8 f = FALSE; - crash_run_hooks(NULL, -1); - crash_set_var(invoke_inspector, f); - crash_end_of_line(); - } - } - if (vars->pause_process && vars->invoke_inspector) { - guint8 f = FALSE; - crash_set_var(invoke_inspector, f); - crash_end_of_line(); + if (v.recursive && NULL != vars->crashdir && vars->invoke_inspector) { + /* + * We've likely chdir-ed back there when recursing. It's a better + * default value than "" anyway. + */ + v.cwd = vars->crashdir; } - if (vars->pause_process) -#if defined(HAS_SIGPROCMASK) - { - sigset_t oset; - if (sigprocmask(SIG_BLOCK, NULL, &oset) != -1) { - sigsuspend(&oset); - } - } -#elif defined(HAS_PAUSE) - { - pause(); - } -#else /* !HAS_SIGPROCMASK && !HAS_PAUSE */ - { - for (;;) { - compat_sleep_ms(MAX_INT_VAL(unsigned)); - } - } -#endif /* HAS_SIGPROCMASK || HAS_PAUSE */ + v.trace = v.recursive ? FALSE : !stacktrace_cautious_was_logged(); - crash_auto_restart(); - raise(SIGABRT); /* This is the end of our road */ + /* + * If we have no stackframe, then we're probably not on an assertion + * failure path. Capture the stack including the crash handler so + * that we know were the capture was made from. + */ + + if (0 == vars->stackcnt) + crash_save_current_stackframe(0); + + /* + * If we're not running in the main thread, try to divert processing + * there as there is likely more stack space available than in another + * runtime thread. + */ + + crash_divert_main(G_STRFUNC, crash_handler_process, &v); } -static size_t -str_hash(const void *p) +/** + * Attempt to divert heavy crash processing to the main thread if possible, + * since sub-threads may not have enough stack space available to run + * everything whereas the kernel can usually extend the stack of the main + * thread on demand, within limits of course. + * + * @param caller the calling routine, for logging purposes + * @param cb the function to invoke in the main thread if possible + * @param arg argument to pass to function + */ +void G_COLD +crash_divert_main(const char *caller, process_fn_t cb, void *arg) { - return g_str_hash(p); + if (!thread_is_main()) { + int crashing = crash_thread_id; + + s_miniwarn("%s(): trying to divert into main thread", caller); + + crash_thread_id = THREAD_MAIN; /* Assume success */ + errno = thread_divert(THREAD_MAIN, cb, arg, NULL); + crash_thread_id = crashing; /* Still in crashing thread */ + + g_assert(errno != 0); /* If we return, there was a problem */ + + s_miniwarn("%s(): can't divert to main thread: %m", caller); + /* FALL THROUGH */ + } + + (void) (*cb)(arg); } static void * @@ -1917,45 +3372,169 @@ } /** + * Alter crash flags. + */ +void G_COLD +crash_ctl(enum crash_alter_mode mode, int flags) +{ + uint8 value; + + g_assert(CRASH_FLAG_SET == mode || CRASH_FLAG_CLEAR == mode); + + value = booleanize(CRASH_FLAG_SET == mode); + + if (CRASH_F_PAUSE & flags) + crash_set_var(pause_process, value); + + if (CRASH_F_GDB & flags) + crash_set_var(invoke_inspector, value); + + if (CRASH_F_RESTART & flags) + crash_set_var(may_restart, value); + + if (CRASH_F_SUPERVISED & flags) + crash_set_var(supervised, value); +} + +/** + * Invoked when process is restarted after a crash and we are able to figure + * out the previous PID of the (now crashed) process from some context. + * + * The purpose is to rename the old core file, if present and if the current + * process is configured to dump a core during crashes. + * + * @param pid PID of the previous process + */ +void G_COLD +crash_exited(uint32 pid) +{ + str_t *cfile; + int i; + + /* + * If there is a core file in the crash directory and the process is + * configured to dump cores, then rename the old core file in case + * we crash again. + */ + + if (NULL == vars) { + s_minicarp("%s(): no crash_init() yet!", G_STRFUNC); + return; + } + + if (!vars->dumps_core) + return; + + /* + * We're restarting: we can allocate memory and use high-level functions. + */ + + cfile = str_new(MAX_PATH_LEN); + + for (i = 0; i < 4; i++) { + const char *progname = filepath_basename(vars->argv0); + + /* + * We look for the core file in various forms and at various places: + * + * 0: a file named "core" in the crash directory + * 1: a file named "progname.core" in the crash directory + * 2: a file named "core" in the local directory + * 3: a file named "progname.core" in the local directory + * + * The "core" file is for Linux, the "progname.core" is for FreeBSD. + * We stop our renaming logic after the first match. + */ + + switch (i) { + case 0: + str_printf(cfile, "%s%ccore", vars->crashdir, G_DIR_SEPARATOR); + break; + case 1: + str_printf(cfile, "%s%c%s.core", + vars->crashdir, G_DIR_SEPARATOR, progname); + break; + case 2: + STR_CPY(cfile, "core"); + break; + case 3: + str_printf(cfile, "%s.core", progname); + break; + default: + g_assert_not_reached(); + } + + if (file_exists(str_2c(cfile))) { + str_t *pfile = str_clone(cfile); + + str_catf(pfile, ".%u", pid); + + if (-1 == rename(str_2c(cfile), str_2c(pfile))) { + s_miniwarn("cannot rename old core file %s: %m", + str_2c(cfile)); + } else { + s_miniinfo("previous core file renamed as %s", str_2c(pfile)); + } + + str_destroy_null(&pfile); + break; + } + } + + str_destroy_null(&cfile); +} + +/** + * Install crash hooks that were registered before crash_init() was called. + * + * This is an eslist iterator callback. + */ +void G_COLD +crash_hook_install(void *data, void *udata) +{ + crash_hook_item_t *ci = data; + + (void) udata; + crash_hook_add(ci->filename, ci->hook); +} + +/** * Installs a simple crash handler. - * + * + * Supported flags are: + * + * CRASH_F_GDB run gdb to inspect and bactkrace all threads + * CRASH_F_PAUSE pause the process, waiting for debugger to attach + * CRASH_F_RESTART restart by exec()ing yourself on crash + * CRASH_F_SUPERVISED parent supervises child and will restart on failure + * + * Of course, when CRASH_F_SUPERVISED is given, the process will not honor the + * CRASH_F_RESTART flag, unless the supervising parent is gone. + * * @param argv0 the original argv0 from main(). * @param progname the program name, to generate the proper crash file - * @param flags any combination of CRASH_F_GDB and CRASH_F_PAUSE + * @param flags combination of CRASH_F_GDB, CRASH_F_PAUSE, CRASH_F_RESTART * @parah exec_path pathname of custom program to execute on crash */ -G_GNUC_COLD void +void G_COLD crash_init(const char *argv0, const char *progname, int flags, const char *exec_path) { struct crash_vars iv; unsigned i; char dirMAX_PATH_LEN; - size_t size; - char *executable = NULL; + char *executable; - ZERO(&iv); + if (NULL == argv0) + s_minierror("%s(): called with NULL argv0!", G_STRFUNC); - /* - * Must set this early in case we have to call crash_time(), since - * vars->gtmoff must be set. - */ + ZERO(&iv); - iv.gmtoff = timestamp_gmt_offset(time(NULL), NULL); vars = &iv; if (NULL == getcwd(dir, sizeof dir)) { - char time_buf18; - DECLARE_STR(4); - - crash_time(time_buf, sizeof time_buf); - dir0 = '\0'; - print_str(time_buf); - print_str(" (WARNING): cannot get current working directory: "); - print_str(g_strerror(errno)); - print_str("\n"); - flush_err_str(); + s_miniwarn("%s(): cannot get current working directory: %m", G_STRFUNC); } if (NULL != exec_path) { @@ -1963,20 +3542,11 @@ if ( -1 == stat(exec_path, &buf) || - !S_ISREG(buf.st_mode) || + !S_ISREG(buf.st_mode) || -1 == access(exec_path, X_OK) ) { - char time_buf18; - DECLARE_STR(4); - - crash_time(time_buf, sizeof time_buf); - - print_str(time_buf); - print_str(" (ERROR): unusable program \""); - print_str(exec_path); - print_str("\"\n"); - flush_err_str(); - exit(EXIT_FAILURE); + s_fatal_exit(EXIT_FAILURE, "%s(): unusable program \"%s\"", + G_STRFUNC, exec_path); } } @@ -1987,55 +3557,48 @@ * be restored on crash if the executable path ends up being relative). */ - if (argv0 != NULL && !file_exists(argv0)) + if (!file_exists(argv0)) executable = file_locate_from_path(argv0); - - if (NULL == executable) + else executable = deconstify_char(argv0); - /* - * Pre-size the chunk with enough space to hold the given strings. - */ - - size = 5 * MEM_ALIGNBYTES; /* Provision for alignment constraints */ - size = size_saturate_add(size, sizeof iv); - size = size_saturate_add(size, 1 + strlen(EMPTY_STRING(executable))); - size = size_saturate_add(size, 1 + strlen(EMPTY_STRING(progname))); - size = size_saturate_add(size, 1 + strlen(EMPTY_STRING(exec_path))); - size = size_saturate_add(size, 1 + strlen(dir)); - - iv.mem = ck_init_not_leaking(size, 0); + iv.mem = ck_init_not_leaking(sizeof iv, 0); if ('\0' != dir0) { - iv.cwd = ck_strdup(iv.mem, dir); + iv.cwd = ostrdup_readonly(dir); g_assert(NULL != iv.cwd); } - iv.argv0 = ck_strdup(iv.mem, executable); - g_assert(NULL == executable || NULL != iv.argv0); + iv.argv0 = ostrdup_readonly(executable); - iv.progname = ck_strdup(iv.mem, progname); + g_assert_log(NULL != iv.argv0, + "%s(): executable=\"%s\", argv0=\"%s\"", + G_STRFUNC, executable, argv0); + + iv.progname = ostrdup_readonly(progname); g_assert(NULL == progname || NULL != iv.progname); - iv.exec_path = ck_strdup(iv.mem, exec_path); + iv.exec_path = ostrdup_readonly(exec_path); g_assert(NULL == exec_path || NULL != iv.exec_path); iv.pause_process = booleanize(CRASH_F_PAUSE & flags); iv.invoke_inspector = booleanize(CRASH_F_GDB & flags) || NULL != exec_path; iv.may_restart = booleanize(CRASH_F_RESTART & flags); + iv.supervised = booleanize(CRASH_F_SUPERVISED & flags); iv.dumps_core = booleanize(!crash_coredumps_disabled()); iv.start_time = time(NULL); + iv.pid = getpid(); + iv.ppid = getppid(); - for (i = 0; i < G_N_ELEMENTS(signals); i++) { + for (i = 0; i < N_ITEMS(signals); i++) { + if G_UNLIKELY(THREAD_SIGINTR == signalsi) + continue; signal_set(signalsi, crash_handler); } vars = ck_copy(iv.mem, &iv, sizeof iv); ck_readonly(vars->mem); - if (executable != argv0) - HFREE_NULL(executable); - /* * This chunk is used to save error messages and to hold a string object * that can be used to format an error message. @@ -2091,20 +3654,39 @@ crash_set_var(hookmem, hookmem); ht = hash_table_new_special_full(crash_ck_allocator, hookmem, - str_hash, g_str_equal); + string_mix_hash, string_eq); crash_set_var(hooks, ht); hash_table_readonly(ht); ck_readonly(vars->hookmem); + + eslist_foreach(&crash_hooks, crash_hook_install, NULL); + eslist_wfree(&crash_hooks, sizeof(crash_hook_item_t)); } + + /* + * Since we install a crash handler, we can load program symbols + * immediately! Indeed, we could fail to do so later on when we + * actully would desperately need symbols... + * --RAM, 2015-11-07 + */ + + stacktrace_init(executable, FALSE); + + if (executable != argv0) + HFREE_NULL(executable); } /** - * @param dst The destination buffer, may be NULL for dry run. - * @param dst_size The size of the destination buffer in bytes. + * Generate crashfile environment variable into destination buffer. + * + * @param dst the destination buffer, may be NULL for dry run. + * @param dst_size the size of the destination buffer in bytes. + * @param pathname the directory where crash file is to be held + * * @return Required buffer size. */ -static G_GNUC_COLD size_t +static size_t G_COLD crashfile_name(char *dst, size_t dst_size, const char *pathname) { const char *pid_str, *item; @@ -2112,8 +3694,7 @@ char filename80; size_t size = 1; /* Minimum is one byte for NUL */ - /* @BUG: The ADNS helper process has a different PID. */ - pid_str = print_number(pid_buf, sizeof pid_buf, getpid()); + pid_str = PRINT_NUMBER(pid_buf, crash_getpid()); crash_logname(filename, sizeof filename, pid_str); if (NULL == dst) { @@ -2121,7 +3702,7 @@ dst_size = 0; } - item = "Crashfile="; + item = CRASHFILE_ENV; clamp_strcpy(dst, dst_size, item); size = size_saturate_add(size, strlen(item)); @@ -2142,16 +3723,17 @@ /** * Record current working directory and configured crash directory. + * + * @param pathname the absolute pathname of the crash directory */ -G_GNUC_COLD void +void G_COLD crash_setdir(const char *pathname) { const char *curdir = NULL; - ckhunk_t *mem2; - size_t size, crashfile_size = 0; + size_t crashfile_size = 0; char dirMAX_PATH_LEN; - g_assert(NULL != vars->mem); + g_assert(is_absolute_path(pathname)); if ( NULL != getcwd(dir, sizeof dir) && @@ -2161,46 +3743,55 @@ } /* - * When they specified a exec_path, we generate the environment - * string "Crashfile=pathname" which will be used to pass the name - * of the crashfile to the program. + * When they specified an exec_path, we will use the environment + * string "Crashfile=pathname" which to pass the name of the crashfile + * to the program. + * + * We always generate the variable when they have fork(), regardless of + * whether they specified an exec_path to be able to determine the full + * path of the crashlog file if we need to access the full path to append + * something to the crash log from the parent process. + * --RAM, 2012-12-08 */ - if (has_fork() && NULL != vars->exec_path) { + if (has_fork()) crashfile_size = crashfile_name(NULL, 0, pathname); - } - - size = 3 * MEM_ALIGNBYTES; /* Provision for alignment constraints */ - size = size_saturate_add(size, 1 + strlen(EMPTY_STRING(curdir))); - size = size_saturate_add(size, 1 + strlen(EMPTY_STRING(pathname))); - size = size_saturate_add(size, crashfile_size); - - mem2 = ck_init_not_leaking(size, 0); if (crashfile_size > 0) { - char *crashfile = ck_alloc(mem2, crashfile_size); - g_assert(NULL != crashfile); /* Chunk pre-sized, must have room */ + char *crashfile = xmalloc(crashfile_size); + const char *crashlog; + const char *ro; crashfile_name(crashfile, crashfile_size, pathname); - crash_set_var(crashfile, crashfile); + ro = ostrdup_readonly(crashfile); + crash_set_var(crashfile, ro); + xfree(crashfile); + + crashlog = is_strprefix(ro, CRASHFILE_ENV); + g_assert(crashlog != NULL); + crash_set_var(crashlog, crashlog); } - curdir = ck_strdup(mem2, curdir); - pathname = ck_strdup(mem2, pathname); + curdir = ostrdup_readonly(curdir); + pathname = ostrdup_readonly(pathname); - crash_set_var(mem2, mem2); crash_set_var(crashdir, pathname); - if (curdir) { + if (curdir != NULL) { crash_set_var(cwd, curdir); } - ck_readonly(vars->mem2); + /* + * Now that we know they have a crash directory, clean it up to remove + * old files that could otherwise stay there for a long, long time. + */ + + crash_directory_cleanup(pathname); } /** * Record program's version string. */ -G_GNUC_COLD void +void G_COLD crash_setver(const char *version) { const char *value; @@ -2208,23 +3799,24 @@ g_assert(NULL != vars->mem); g_assert(NULL != version); - value = ck_strdup_readonly(vars->mem, version); - if (NULL == value && vars->mem2 != NULL) - value = ck_strdup_readonly(vars->mem2, version); - - if (NULL == value) { - ckhunk_t *mem3; - - mem3 = ck_init_not_leaking(1 + strlen(version), 0); - crash_set_var(mem3, mem3); - value = ck_strdup(vars->mem3, version); - } - + value = ostrdup_readonly(version); crash_set_var(version, value); + g_assert(NULL != vars->version); +} + +/** + * Set program's numbers (major, minor and patchlevel). + */ +void +crash_setnumbers(uint8 major, uint8 minor, uint8 patchlevel) +{ + uint8 t = TRUE; - if (vars->mem3 != NULL) - ck_readonly(vars->mem3); + crash_set_var(major, major); + crash_set_var(minor, minor); + crash_set_var(patchlevel, patchlevel); + crash_set_var(has_numbers, t); } /** @@ -2238,30 +3830,71 @@ /** * Save original argc/argv and environment. - * - * These should not be the original argv and environ pointer but rather - * copies that point to read-only memory to prevent tampering. - * - * The gm_dupmain() routine handles this duplication into a read-only memory - * region and it should ideally be called before calling this routine. */ void -crash_setmain(int argc, const char *argv, const char *env) +crash_setmain(void) { + const char **argv; + const char **env; + int argc; + + argc = progstart_dup(&argv, &env); + + g_assert_log(argc > 0, "%s(): argc=%d", G_STRFUNC, argc); + crash_set_var(argc, argc); crash_set_var(argv, argv); crash_set_var(envp, env); } /** + * Record callback to invoke in order to restart the application cleanly. + * + * This callback will be invoked by crash_restart() if defined. Upon return + * of that callback, crash_reexec() will be called if the callback returns 0. + * Otherwise, it will assume restarting will be asynchronous and will give + * the application some time to issue the restart. + */ +void +crash_set_restart(action_fn_t cb) +{ + if (NULL == vars) { + s_carp("%s(): should not be called before crash_init(), ignoring!", + G_STRFUNC); + return; + } + + crash_set_var(restart, cb); +} + +/** * Record a crash hook for a file. */ void -crash_hook_add(const char *filename, const crash_hook_t hook) +crash_hook_add(const char *filename, const callback_fn_t hook) { g_assert(filename != NULL); g_assert(hook != NULL); - g_assert(vars != NULL); /* Must have run crash_init() */ + + /* + * If crash_init() has not been run yet, record the pending hook + * for deferred processing. The hook will not be installed until + * crash_init() is called, naturally. + * + * This is required for low-level hooks like the thread crash hook + * which is configured very early. + * --RAM, 2015-03-11 + */ + + if G_UNLIKELY(NULL == vars) { + crash_hook_item_t *ci; + + WALLOC0(ci); + ci->filename = filename; /* Must be a static item */ + ci->hook = hook; + eslist_append(&crash_hooks, ci); + return; + } /* * Only one crash hook can be added per file. @@ -2270,7 +3903,7 @@ if (hash_table_contains(vars->hooks, filename)) { const void *oldhook = hash_table_lookup(vars->hooks, filename); s_carp("CRASH cannot add hook \"%s\" for \"%s\", already have \"%s\"", - stacktrace_routine_name(func_to_pointer(hook), FALSE), + stacktrace_function_name(hook), filename, stacktrace_routine_name(oldhook, FALSE)); } else { ck_writable(vars->hookmem); /* Holds the hash table object */ @@ -2288,8 +3921,7 @@ void crash_post_init(void) { - ck_shrink(vars->mem, 0); /* Shrink as much as possible */ - ck_shrink(vars->mem2, 0); + /* Nothing to be done currently */ } /** @@ -2304,13 +3936,97 @@ void crash_close(void) { - if (vars != NULL) { - guint8 t = TRUE; - crash_set_var(closed, t); + if (!crash_closed) { + crash_closed = TRUE; + + if (vars != NULL) { + uint8 t = TRUE; + crash_set_var(closed, t); + } } } /** + * Are we done? + * + * @return TRUE if crash_close() has been called. + */ +bool +crash_is_closed(void) +{ + if (vars != NULL) + return vars->closed; + + return crash_closed; +} + +/** + * Are we deadlocked? + */ +bool +crash_is_deadlocked(void) +{ + return crash_last_deadlock_file != NULL; +} + +/** + * Are we pausing? + * + * @return TRUE if the process is voluntarily pausing. + */ +bool +crash_is_pausing(void) +{ + return atomic_bool_get(&crash_pausing); +} + +/** + * Are we running supervised? + * + * @return TRUE if we are supervised and our parent process is still there. + */ +bool +crash_is_supervised(void) +{ + if (NULL == vars) + return FALSE; + + return vars->supervised && 1 != getppid(); +} + +/** + * Are we running in the crashing thread? + * + * @param stid if non-NULL, where stid of current thread is returned + * + * @return TRUE if the thread is the crashing thread. The returned thread ID + * may be THREAD_UNKNOWN_ID if we cannot determine the ID of the thread. + */ +bool +crash_is_crashing_thread(int *stid) +{ + int id = thread_safe_small_id(); + + if (stid != NULL) + *stid = id; + + atomic_mb(); + return crash_thread_id == id && crash_thread_id >= 0; +} + +/** + * Did we already generate a crash log? + */ +bool +crash_is_logged(void) +{ + if (NULL == vars) + return FALSE; + + return vars->logged; +} + +/** * Abort execution, synchronously. */ void @@ -2325,29 +4041,496 @@ * * This function does not return: either it succeeds exec()ing or it exits. */ -G_GNUC_COLD void +void G_COLD crash_reexec(void) { - crash_mode(); /* Not really, but prevents any memory allocation */ + crash_mode(CRASH_LVL_RECURSIVE); /* Prevent any memory allocation */ crash_try_reexec(); _exit(EXIT_FAILURE); } +/** + * Callout queue event to force application restart. + */ +static void G_COLD +crash_force_restart(cqueue_t *cq, void *unused) +{ + char bufCRASH_RUNTIME_BUFLEN; + + (void) unused; + + cq_zero(cq, &crash_restart_ev); + + crash_run_time(buf, sizeof buf); + s_miniwarn("%s(): forcing immediate restart after %s", G_STRFUNC, buf); + crash_reexec(); /* Does not return */ +} + +/** + * Preventive restart of the application to avoid an out-of-memory condition. + * + * If a user-supplied callback was supplied via crash_set_restart(), it is + * invoked first. It is valid for the callback to attempt to auto-restart + * if it needs to. The application will be auto-restarted unconditionally + * should the callback return 0. On any other reply, it is assumed that + * asynchronous restart will be attempted: during CRASH_RESTART_GRACE seconds, + * no further call of crash_restart() will be handled and once the delay + * expires, the application will be forcefully restarted. + * + * When this routine is called, we are not in a critical situation so we + * do not put a minimum runtime constrainst to restart the application: it + * is up to the user of that routine to ensure the conditions leading to + * that routine will be infrequent enough. + * + * If the crash handling layer was not yet configured or they did not ask + * for auto-restarts, then calls to crash_restart() are simply ignored. + * + * This routine may return, hence the caller must be prepared for it. + */ +void G_COLD +crash_restart(const char *format, ...) +{ + static int registered; + bool has_callback = FALSE; + char bufCRASH_RUNTIME_BUFLEN; + va_list args; + + /* + * If they did not call crash_init() yet or did not supply CRASH_F_RESTART + * to allow auto-restarts, then do nothing. + */ + + if (NULL == vars || !vars->may_restart) + return; /* Silently ignored */ + + /* + * Since a callback could request asynchronous restarting, we need to + * record the first time we enter here and ignore subsequent calls. + */ + + if (0 != atomic_int_inc(®istered)) + return; + + /* + * First log the condition, without allocating any memory, bypassing stdio. + */ + + va_start(args, format); + s_minilogv(G_LOG_LEVEL_INFO, TRUE, format, args); + va_end(args); + + /* + * If we have already started crashing, there is no need to request + * a restart, it will happen if configured as part of the normal crash + * handling logic. + */ + + if (crash_level() > CRASH_LVL_OOM) + return; + + /* + * If they did not have time to call crash_setmain(), we do not know + * what to restart. + */ + + if G_UNLIKELY(0 == vars->argc) { + s_miniwarn("%s(): need to call crash_setmain() to allow restarts", + G_STRFUNC); + return; + } + + /* + * If we're on the exit path already for another reason, no need to + * recurse into requesting another exit! + */ + + if (atomic_int_get(&crash_exit_started)) { + s_miniinfo("%s(): already started exiting, ignoring.", G_STRFUNC); + return; + } + + s_miniinfo("%s(): requesting restart", G_STRFUNC); + + /* + * If there is a restart callback, invoke it. + * + * Its exit status matters: a 0 means that an immediate restart should be + * initiated. Anything else means a deferred restart will be triggered + * by the application, and it will do so in the next CRASH_RESTART_GRACE + * seconds (or we will forcefully trigger it). + * + * The application promises to call crash_restarting() when it will + * initiate its exit sequence. + */ + + if (vars != NULL && vars->restart != NULL) { + s_miniinfo("%s(): issuing shutdown via %s()...", + G_STRFUNC, stacktrace_function_name(vars->restart)); + + has_callback = TRUE; + if (0 != (*vars->restart)()) + goto asynchronous; + } + + /* + * When the callback returns 0, manually attempt auto-restart. + * + * The callback may choose to attempt to auto-restart manually. + * If it does not, we attempt to re-exec ourselves anway. + */ + + crash_run_time(buf, sizeof buf); + s_miniinfo("%s(): attempting auto-restart%s after %s...", + G_STRFUNC, has_callback ? " on clean shutdown" : "", buf); + + crash_reexec(); /* Does not return */ + + /* + * Handle asynchronous restarts: we give the application some time + * to shutdown manually and we will then force a shutdown. + */ + +asynchronous: + crash_restart_initiated = TRUE; + s_miniinfo("%s(): auto-restart should happen soon", G_STRFUNC); + crash_restart_ev = + evq_raw_insert(CRASH_RESTART_GRACE * 1000, crash_force_restart, NULL); +} + +/** + * Signal that shutdown is starting. + * + * This routine can be called when there is a possibility to have asynchronous + * shutdown requested by the restart callback: it cancels the timer after + * which a forced and brutal shutdown will occur. + * + * It also avoids recursion on the application exit path, so that any call to + * crash_restart() will be properly ignored, and crash_try_reexec() will + * properly exit(). + */ +void +crash_restarting(void) +{ + atomic_int_inc(&crash_exit_started); + + if (crash_restart_ev != NULL) { + char bufCRASH_RUNTIME_BUFLEN; + + cq_cancel(&crash_restart_ev); + + crash_run_time(buf, sizeof buf); + s_miniinfo("%s(): auto-restart initiated after %s...", G_STRFUNC, buf); + } +} + /*** *** Calling any of the following routines means we're about to crash. ***/ /** + * Out of memory condition. + * + * This is critical, we may not be able to allocate more memory to even + * go much further. It is also fatal, we do not return from here. + * + * Log the error and try to auto-restart the program if configured to do + * so, otherwise crash immediately. + */ +void G_COLD +crash_oom(const char *format, ...) +{ + static int recursive; + unsigned flags = G_LOG_LEVEL_CRITICAL; + int level; + va_list args; + + /* + * First log the error, without allocating any memory, bypassing stdio. + */ + + va_start(args, format); + + if (0 != (level = atomic_int_inc(&recursive))) { + thread_check_suspended(); + flags |= G_LOG_FLAG_RECURSION; + } + + s_minilogv(flags, TRUE, format, args); + va_end(args); + + /* + * Now attempt auto-restart if configured. + */ + + s_minilog(flags, "%s(): process is out of memory, aborting...", G_STRFUNC); + + crash_vmea_usage(); /* Report on emergency memory usage, if needed */ + + /* + * Watch out for endless crash_oom() calls. + */ + + if (level > 1) + _exit(EXIT_FAILURE); + else + exit(EXIT_FAILURE); + + crash_mode(CRASH_LVL_OOM); + crash_auto_restart(); + crash_abort(); +} + +#define CRASH_STACK_DUMP_DEPTH 64 + +struct crash_stack { + void *stackCRASH_STACK_DUMP_DEPTH; /* The frames */ + size_t count; /* How many frames were captured */ + int stid; /* Thread to which stack belongs */ + int fd; /* File descriptor for dumping */ + bool fancy; /* Whether to dump fancy or plain */ +}; + +/** + * Diversion callback to get a stack trace from current thread. + */ +static void * +crash_fill_stack(void *arg) +{ + struct crash_stack *t = arg; + + t->count = stacktrace_unwind(t->stack, N_ITEMS(t->stack), 2); + return NULL; +} + +static uint8 crash_interrupt_acksTHREAD_MAX; + +/** + * Thread interrupt acknowledgment. + */ +static void +crash_interrupt_ack(void *unused_result, void *user_data) +{ + uint id = pointer_to_uint(user_data); + + (void) unused_result; + + g_assert(id < N_ITEMS(crash_interrupt_acks)); + + crash_interrupt_acksid = TRUE; +} + +/** + * Send an interrupt to the thread, waiting for the acknowledge. + * + * @param id the targeted thread ID + * @param cb the callback to invoke when interrupted + * @param trace where to put the stack trace + * + * @return 0 if OK, an error code otherwise. + */ +static int +crash_interrupt(uint id, process_fn_t cb, struct crash_stack *trace) +{ + int error; + int i; + + g_assert(id < N_ITEMS(crash_interrupt_acks)); + + crash_interrupt_acksid = FALSE; + + error = thread_interrupt(id, cb, trace, + crash_interrupt_ack, uint_to_pointer(id)); + + if (0 != error) + return error; + + /* + * We interrupted, now wait for the indication that the interrupt + * was processed, for roughly 2.5 secs. + */ + + for (i = 0; i < 500; i++) { + if (crash_interrupt_acksid) + return 0; + compat_usleep_nocancel(5000); /* in usecs */ + } + + return EINPROGRESS; /* Execution did not finish in time */ +} + +/** + * Attempt to fetch a stack trace from given thread. + * + * @param id thread whose stack we want + * @param trace where to put the stack trace + * + * @return 0 if OK, a POSIX error code otherwise. + */ +static int +crash_get_stack(uint id, struct crash_stack *trace) +{ + ZERO(trace); + + if (thread_small_id() == id) { + crash_fill_stack(trace); + } else { + void *res; + int e; + + if (0 != (e = thread_divert(id, crash_fill_stack, trace, &res))) { + /* + * If we get EBUSY, the targeted thread is neither suspended + * nor blocked. The only way we can get a stack trace is to + * attempt an interrupt. + */ + + if (EBUSY == e) { + s_line_writef(trace->fd, "WARNING: interrupting busy %s", + thread_safe_id_name(id)); + + if (0 != (e = crash_interrupt(id, crash_fill_stack, trace))) + goto done; + } + + return e; + } + } + +done: + trace->stid = id; + return 0; +} + +/** + * Print a light version of the stack trace. + */ +static void * G_COLD +crash_thread_stack_print(void *arg) +{ + const struct crash_stack *t = arg; + const char *type = t->fancy ? "decorated" : "light"; + + if (0 == t->count) { + s_line_writef(t->fd, "stack trace for %s is empty", + thread_safe_id_name(t->stid)); + return NULL; + } + + s_line_writef(t->fd, "---- dumping %zu-frame long %s stack trace for %s:", + t->count, type, thread_safe_id_name(t->stid)); + + if (t->fancy) + stacktrace_stack_fancy_print(t->fd, t->stack, t->count); + else + stacktrace_stack_plain_print(t->fd, t->stack, t->count); + + s_line_writef(t->fd, "---- end of %s stack trace for %s.", + type, thread_safe_id_name(t->stid)); + + return NULL; +} + +/** + * Attempt to offload processing to the main thread if possible. + * + * Contrary to crash_divert_main(), this does not attempt to permanently + * transfer control to the main thread. + * + * @param cb the function to invoke in the main thread if possible + * @param arg argument to pass to function + */ +static void G_COLD +crash_offload_main(process_fn_t cb, void *arg) +{ + if (!thread_is_main()) { + void *res; /* Supplied result, to make this an RPC to main */ + if (0 == thread_divert(THREAD_MAIN, cb, arg, &res)) + return; + /* FALL THROUGH */ + } + + (void) (*cb)(arg); +} + +/* + * Attempt to collect stack traces from all the threads that are + * now hopefully supended, then dump their stack. + * + * @param fd where to print the stack traces + */ +static void G_COLD +crash_dump_stacks(int fd) +{ + int i, e; + bool f; + struct crash_stack trace; + + s_line_writef(fd, "Attempting to dump stacks for all the known threads..."); + + /* + * We first try to get stack and dump them in plain form, which is + * less stressful from a resource point of view. + * + * Once we were able to get all the stacks, we redo the same operation + * dumping decorated stacks. + */ + + for (f = FALSE; f <= TRUE; f++) { + for (i = 0; i < THREAD_MAX; i++) { + if (0 == (e = crash_get_stack(i, &trace))) { + trace.fancy = f; + trace.fd = fd; + crash_offload_main(crash_thread_stack_print, &trace); + } else if (e != ESRCH) { + errno = e; + s_line_writef(fd, "WARNING: cannot get stack for %s: %m", + thread_safe_id_name(i)); + } + } + } +} + +/** + * Record that we are deadlocked. + */ +void G_COLD +crash_deadlocked(const char *file, unsigned line) +{ + crash_last_deadlock_file = file; + + /* + * Avoid endless recursions, record the deadlock the first time only. + */ + + if (crash_mode(CRASH_LVL_DEADLOCKED)) { + if (vars != NULL) { + uint8 t = TRUE; + crash_set_var(deadlocked, t); + crash_set_var(lock_file, file); + crash_set_var(lock_line, line); + } + + crash_dump_stacks(STDERR_FILENO); + } +} + +/** * Record failed assertion data. */ -G_GNUC_COLD void +void G_COLD crash_assert_failure(const struct assertion_data *a) { - crash_mode(); + crash_last_assertion_failure = a; - if (vars != NULL) - crash_set_var(failure, a); + /* + * Avoid endless recursions, record the failure the first time only. + */ + + if (crash_mode(CRASH_LVL_FAILURE)) { + if (vars != NULL) + crash_set_var(failure, a); + } } /** @@ -2355,10 +4538,10 @@ * * @return formatted message string, NULL if it could not be built */ -G_GNUC_COLD const char * +const char * G_COLD crash_assert_logv(const char * const fmt, va_list ap) { - crash_mode(); + crash_mode(CRASH_LVL_FAILURE); if (vars != NULL && vars->logstr != NULL) { const char *msg; @@ -2384,14 +4567,14 @@ } /** - * Record crash filename (static string). + * Record the name of the file from which we're crashing. * * This allows triggering of crash hooks, if any defined for the file. */ -G_GNUC_COLD void +void G_COLD crash_set_filename(const char * const filename) { - crash_mode(); + crash_mode(CRASH_LVL_BASIC); if (vars != NULL && vars->logck != NULL) { const char *f = ck_strdup_readonly(vars->logck, filename); @@ -2402,10 +4585,10 @@ /** * Record crash error message. */ -G_GNUC_COLD void +void G_COLD crash_set_error(const char * const msg) { - crash_mode(); + crash_mode(CRASH_LVL_BASIC); if (vars != NULL && vars->logck != NULL) { const char *m; @@ -2429,10 +4612,10 @@ /** * Append information to existing error message. */ -G_GNUC_COLD void +void G_COLD crash_append_error(const char * const msg) { - crash_mode(); + crash_mode(CRASH_LVL_BASIC); if (vars != NULL && vars->logck != NULL) { const char *m; @@ -2454,19 +4637,24 @@ /** * Save given stack trace, which will be displayed during crashes instead * of the current stack frame. + * + * @param stid small thread ID to which stack belong + * @param stack the captured stack + * @param count how many items are valid in stack */ -G_GNUC_COLD void -crash_save_stackframe(void *stack, size_t count) +void G_COLD +crash_save_stackframe(int stid, void *stack, size_t count) { - crash_mode(); + crash_mode(CRASH_LVL_BASIC); - if (count > G_N_ELEMENTS(vars->stack)) - count = G_N_ELEMENTS(vars->stack); + if (count > N_ITEMS(vars->stack)) + count = N_ITEMS(vars->stack); - if (vars != NULL) { + if (vars != NULL && 0 == vars->stackcnt) { ck_memcpy(vars->mem, - &vars->stack, (void *) stack, count * sizeof(void *)); + (void *) &vars->stack, (void *) stack, count * sizeof(void *)); crash_set_var(stackcnt, count); + crash_set_var(stackid, stid); } } @@ -2477,18 +4665,117 @@ * is to protect against SIGABRT signal delivery happening on a dedicated * signal stack. */ -G_GNUC_COLD void +void G_COLD crash_save_current_stackframe(unsigned offset) { - crash_mode(); + crash_mode(CRASH_LVL_BASIC); - if (vars != NULL) { + if (vars != NULL && 0 == vars->stackcnt) { void *stackSTACKTRACE_DEPTH_MAX; size_t count; - count = stacktrace_safe_unwind(stack, G_N_ELEMENTS(stack), offset + 1); - crash_save_stackframe(stack, count); + count = stacktrace_safe_unwind(stack, N_ITEMS(stack), offset + 1); + crash_save_stackframe(thread_safe_small_id(), stack, count); + } +} + +#define DAYS 86400 +#define CRASH_LOG_MAXAGE (183 * DAYS) /* 6 months */ +#define CRASH_CORE_MAXAGE (30 * DAYS) /* 1 month */ + +static void +crash_directory_unlink(const char *path) +{ + if (-1 == unlink(path)) + g_warning("%s(): cannot unlink %s: %m", G_STRFUNC, path); +} + +/** + * ftw_foreach() callback to remove old crashlogs and core files. + */ +static ftw_status_t +crash_directory_cleanup_cb( + const ftw_info_t *info, const filestat_t *sb, void *unused_data) +{ + (void) unused_data; + + if (0 == info->level) + return FTW_STATUS_OK; /* Don't process root */ + + if (FTW_F_DIR & info->flags) + return FTW_STATUS_SKIP_SUBTREE; /* No recursion */ + + g_assert(1 == info->level); + + if (0 == (FTW_F_FILE & info->flags)) { + g_warning("%s(): ignoring non-file entry: %s", G_STRFUNC, info->fpath); + return FTW_STATUS_OK; + } + + if (FTW_F_NOSTAT & info->flags) + return FTW_STATUS_OK; + + if (0 == (sb->st_mode & S_IWUSR)) + return FTW_STATUS_OK; /* Skip write-protected files */ + + if (is_strsuffix(info->fbase, info->fbase_len, ".log")) { + if (delta_time(tm_time(), sb->st_mtime) >= CRASH_LOG_MAXAGE) + crash_directory_unlink(info->fpath); + } else if ( + NULL != strstr(info->fbase, "core.") || + is_strsuffix(info->fbase, info->fbase_len, ".core") || + 0 == strcmp(info->fbase, "core") + ) { + if (delta_time(tm_time(), sb->st_mtime) >= CRASH_CORE_MAXAGE) + crash_directory_unlink(info->fpath); + } else { + g_warning("%s(): skipping unknown file: %s", G_STRFUNC, info->fpath); + } + + return FTW_STATUS_OK; +} + +static void * +crash_directory_cleanup_thread(void *arg) +{ + const char *crashdir = arg; + char *rootdir; + uint32 flags; + ftw_status_t res; + + if (!is_directory(crashdir)) + return NULL; /* No crash directory yet */ + + flags = FTW_O_PHYS | FTW_O_MOUNT; + rootdir = h_strdup(crashdir); + res = ftw_foreach(rootdir, flags, 0, crash_directory_cleanup_cb, NULL); + + if (res != FTW_STATUS_OK) { + g_warning("%s(): cleanup traversal of \"%s\" failed with %d", + G_STRFUNC, rootdir, res); } + + hfree(rootdir); + return NULL; +} + +/** + * Clean specified crash directory. + * + * Crashlog files are kept for CRASH_LOG_MAXAGE seconds and core files are + * kept for CRASH_CORE_MAXAGE. + * + * To prevent files from being purged when they reach their maximum age, + * write-protect them by clearing the user-writeable bit. + */ +static void +crash_directory_cleanup(const char *crashdir) +{ + g_assert(is_absolute_path(crashdir)); + + thread_create(crash_directory_cleanup_thread, + deconstify_char(crashdir), THREAD_F_DETACH | THREAD_F_WARN, + THREAD_STACK_MIN); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/crash.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/crash.h
Changed
@@ -42,6 +42,7 @@ #define _crash_h_ #include "common.h" +#include "atio.h" /** * The following macros are intended for use in signal handlers, or wherever it @@ -65,10 +66,10 @@ * // or flush_err_str() can be used multiple times. * * rewind_str(after_header); // rewind to offset 1; keep the first string - * print_str(some_other_text); + * print_str(some_other_text); * flush_str(fd); // Sent all strings to file descriptor fd with writev() * } - * + * * @attention * There is no formatting done here, this is not a printf()-like function. * It only records an array of constant strings in a vector. @@ -85,26 +86,37 @@ const char *print_str_text_ = (text); \ if ( \ print_str_text_ && \ - print_str_iov_cnt_ < G_N_ELEMENTS(print_str_iov_) \ + print_str_iov_cnt_ < N_ITEMS(print_str_iov_) \ ) { \ - iovec_set_base(&print_str_iov_print_str_iov_cnt_, \ - print_str_text_); \ - iovec_set_len(&print_str_iov_print_str_iov_cnt_, \ - strlen(print_str_text_)); \ + iovec_set(&print_str_iov_print_str_iov_cnt_, \ + print_str_text_, strlen(print_str_text_)); \ print_str_iov_cnt_++; \ } else { \ - iovec_set_base(&print_str_iov_G_N_ELEMENTS(print_str_iov_) - 1, \ - TRUNCATION_STR); \ - iovec_set_len(&print_str_iov_G_N_ELEMENTS(print_str_iov_) - 1, \ - sizeof(TRUNCATION_STR) - 1); \ + iovec_set(&print_str_iov_N_ITEMS(print_str_iov_) - 1, \ + TRUNCATION_STR, sizeof TRUNCATION_STR - 1); \ } \ } G_STMT_END +/* + * Do not use atio_writev() here, on purpose. + * + * These routines are called during exceptional circumstances and we need + * to limit the amout of resources required. + */ #define flush_str(fd) \ IGNORE_RESULT(writev((fd), print_str_iov_, print_str_iov_cnt_)) #define flush_err_str() flush_str(STDERR_FILENO) +/* + * This one uses atio_writev() and should be used for "regular" message, where + * it's OK to use extra resources because we're likely not on an error path. + */ +#define flush_str_atomic(fd) \ + IGNORE_RESULT(atio_writev((fd), print_str_iov_, print_str_iov_cnt_)) + +#define flush_err_str_atomic() flush_str_atomic(STDERR_FILENO) + #define rewind_str(i) \ G_STMT_START { \ unsigned rewind_str_i_ = (i); \ @@ -143,6 +155,13 @@ } /** + * Convenience macro to make sure we're passing the 2nd parameter correctly + * and do not mistakenly use another buffer length, inconsistent with the + * actual buffer. + */ +#define PRINT_NUMBER(buf_, val_) print_number(buf_, sizeof buf_, val_) + +/** * Print an "unsigned long" as hexadecimal NUL-terminated string into supplied * buffer and returns the address within that buffer where the printed string * starts (value is generated backwards from the end of the buffer). @@ -171,45 +190,66 @@ return p; } - -/** - * Signature of a crash hook. - */ -typedef void (*crash_hook_t)(void); - /* * Public interface. */ -#define CRASH_F_PAUSE (1 << 0) -#define CRASH_F_GDB (1 << 1) -#define CRASH_F_RESTART (1 << 2) +#define CRASH_F_PAUSE (1 << 0) +#define CRASH_F_GDB (1 << 1) +#define CRASH_F_RESTART (1 << 2) +#define CRASH_F_SUPERVISED (1 << 3) + +enum crash_alter_mode { + CRASH_FLAG_SET, + CRASH_FLAG_CLEAR +}; + +#define CRASH_TIME_BUFLEN 22 /**< Buffer length for crash_time() */ +#define CRASH_TIME_ISO_BUFLEN 21 /**< Buffer length for crash_time_iso() */ struct assertion_data; void crash_init(const char *argv0, const char *progname, int flags, const char *exec_path); +void crash_exited(uint32 pid); void crash_close(void); +bool crash_is_closed(void); +bool crash_is_deadlocked(void); +bool crash_is_crashing_thread(int *stid); +bool crash_is_pausing(void); +bool crash_is_logged(void); +bool crash_is_supervised(void); +void crash_ctl(enum crash_alter_mode mode, int flags); void crash_time(char *buf, size_t buflen); +void crash_time_raw(char *buf, size_t size); void crash_time_iso(char *buf, size_t size); const char *crash_signame(int signo); void crash_handler(int signo); -void crash_abort(void) G_GNUC_NORETURN; +void crash_abort(void) G_NORETURN; void crash_setdir(const char *dir); void crash_setver(const char *version); +void crash_setnumbers(uint8 major, uint8 minor, uint8 patchlevel); void crash_setbuild(unsigned build); -void crash_setmain(int argc, const char *argv, const char *env); +void crash_setmain(void); +void crash_oom(const char *format, ...) G_NORETURN G_PRINTF(1, 2); +void crash_oom_condition(void); +void crash_deadlocked(const char *file, unsigned line); void crash_assert_failure(const struct assertion_data *a); const char *crash_assert_logv(const char * const fmt, va_list ap); void crash_set_filename(const char * const filename); void crash_set_error(const char * const msg); void crash_append_error(const char * const msg); void crash_save_current_stackframe(unsigned offset); -void crash_save_stackframe(void *stack, size_t count); +void crash_save_stackframe(int stid, void *stack, size_t count); void crash_post_init(void); int crash_coredumps_disabled(void); -void crash_hook_add(const char *filename, const crash_hook_t hook); -void crash_reexec(void) G_GNUC_NORETURN; +void crash_hook_add(const char *filename, const callback_fn_t hook); +void crash_set_restart(action_fn_t cb); +void crash_reexec(void) G_NORETURN; +void crash_restart(const char *format, ...) G_PRINTF(1, 2); +void crash_restarting(void); +void crash_print_decorated_stack(int fd); +void crash_divert_main(const char *caller, process_fn_t cb, void *arg); #endif /* _crash_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/crc.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/crc.c
Changed
@@ -27,6 +27,12 @@ * * CRC computations. * + * CRC-32 generation code is courtesy of Charles Michael Heard. + * + * Also reproduced in the article "Fast Incremental CRC Updates for IP + * over ATM Networks" by Florian Braun and Marcel Waldvogel, published + * on April 25th, 2001. + * * @author Raphael Manfredi * @date 2003 */ @@ -37,6 +43,11 @@ #include "override.h" /* Must be the last header included */ /** + * CRC-32 computation code by Charles Michael Heard. + * + * Compute 32-bit CRC one byte at a time using the high-bit first + * (Big-Endian) bit ordering convention. + * * The generator polynomial used for this version of the package is * X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 * as specified in the Autodin/Ethernet/ADCCP protocol standards. @@ -58,7 +69,7 @@ #define POLYNOMIAL 0x04c11db7L -static guint32 crc_table256; +static uint32 crc_table256; /** * Generates a 256-word table containing all CRC remainders for every @@ -67,7 +78,7 @@ static void crc32_gen_crc_table(void) { - guint32 i, crc_accum; + uint32 i, crc_accum; for (i = 0; i < 256; i++) { int j; @@ -91,14 +102,14 @@ * @param len no brief description. * */ -G_GNUC_HOT guint32 -crc32_update(guint32 crc_accum, gconstpointer data, size_t len) +uint32 G_HOT +crc32_update(uint32 crc_accum, const void *data, size_t len) { - const guchar *p = data; + const uchar *p = data; size_t j; for (j = 0; j < len; j++) { - guint8 i; + uint8 i; i = (crc_accum >> 24) ^ *p++; crc_accum = (crc_accum << 8) ^ crc_tablei; @@ -113,6 +124,12 @@ void crc_init(void) { + static gboolean done; + + if G_UNLIKELY(done) + return; + + done = TRUE; crc32_gen_crc_table(); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/crc.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/crc.h
Changed
@@ -37,7 +37,7 @@ #include "common.h" void crc_init(void); -guint32 crc32_update(guint32 crc_accum, gconstpointer data, size_t len); +uint32 crc32_update(uint32 crc_accum, const void *data, size_t len); #endif /* _crc_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/dam.c
Added
@@ -0,0 +1,381 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Synchronization dam. + * + * Routines that may suspend the execution of the thread such as dam_wait() + * are thread cancellation points. When cancellation occurs, the dam's + * reference count is automatically decreased and the thread is cleanly removed + * from the set of waiters. + * + * As such, the dam object should be properly reference-counted when given to + * cancelable threads. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#include "dam.h" +#include "atomic.h" +#include "cond.h" +#include "mutex.h" +#include "random.h" +#include "thread.h" +#include "tm.h" +#include "walloc.h" + +#include "override.h" /* Must be the last header included */ + +enum dam_magic { DAM_MAGIC = 0x1d6fe2cc }; + +/** + * A dam variable. + */ +struct dam { + enum dam_magic magic; /* Magic number */ + cond_t event; /* Waiting for master release */ + mutex_t lock; /* Mutex protecting barrier updates */ + uint key; /* Master key to open the dam */ + unsigned generation; /* Last generation released */ + int waiting; /* Amount of threads waiting on dam */ + int refcnt; /* Reference count */ + bool disabled; /* Whether dam was disabled by owner */ +}; + +static inline void +dam_check(const struct dam * const d) +{ + g_assert(d != NULL); + g_assert(DAM_MAGIC == d->magic); +} + +/** + * Initialize the dam. + * + * The key will be required to release the dam. If a NULL pointer is given, + * then the key will be forced to 0. + * + * @param d the dam to initialize + * @param key where dam's opening key is returned, if non-NULL + * @param emulated whether to use emulated semaphores + */ +static void +dam_init(dam_t *d, uint *key, bool emulated) +{ + g_assert(d != NULL); + g_assert(0 == d->magic); /* Not already initialized */ + + d->magic = DAM_MAGIC; + mutex_init(&d->lock); + cond_init_full(&d->event, &d->lock, emulated); + d->key = key != NULL ? random_u32() : 0; + d->waiting = 0; + d->generation = 0; + d->refcnt = 1; + + if (key != NULL) + *key = d->key; +} + +/* + * Destroy the dam. + */ +static void +dam_destroy(dam_t *d) +{ + dam_check(d); + g_assert(0 == d->refcnt); /* Not used */ + + cond_destroy(&d->event); + mutex_destroy(&d->lock); + d->magic = 0; +} + +/** + * Allocate a new dam and initialize it. + * + * The key will be required to release the dam. If a NULL pointer is given, + * then the key will be forced to 0. + * + * @param key where dam's opening key is returned, if non-NULL + * + * @return a newly allocated dam. + */ +dam_t * +dam_new(uint *key) +{ + dam_t *d; + + WALLOC0(d); + dam_init(d, key, FALSE); /* Use real semaphores if supported */ + + return d; +} + +/** + * Allocate a dam and initialize it. + * + * @param key where dam's opening key is returned, if non-NULL + * @param emulated whether to use emulated semaphores, for testing purposes + * + * @return a newly allocated barrier. + */ +dam_t * +dam_new_full(uint *key, bool emulated) +{ + dam_t *d; + + WALLOC0(d); + dam_init(d, key, emulated); + + return d; +} + +/** + * Free dynamically allocated dam. + */ +static void +dam_free(dam_t *d) +{ + dam_check(d); + g_assert(d->refcnt > 0); + + if (atomic_int_dec_is_zero(&d->refcnt)) { + dam_destroy(d); + WFREE(d); + } +} + +/** + * Free dynamically allocated dam and nullify its pointer. + */ +void +dam_free_null(dam_t **d_ptr) +{ + dam_t *d = *d_ptr; + + if (d != NULL) { + dam_free(d); + *d_ptr = NULL; + } +} + + +/** + * Increase the reference count on the dam. + * + * This must be used by any cancelable thread that is going to use the dam, + * since the cleanup done should a cancel occur during waiting will remove + * one reference to the dam. + * + * @return the reference to the dam, for convenience. + */ +dam_t * +dam_refcnt_inc(dam_t *d) +{ + dam_check(d); + g_assert(d->refcnt > 0); + + atomic_int_inc(&d->refcnt); + return d; +} + +/** + * Cleanup routine invoked when a thread stuck in dam_wait() is cancelled. + */ +static void +dam_wait_cleanup(void *arg) +{ + dam_t *d = arg; + + dam_check(d); + + d->waiting--; + mutex_unlock(&d->lock); + dam_free(d); +} + +/** + * Wait until the owner releases the dam or until the absolute time is reached. + * + * @note + * This routine is a cancellation point. + * + * @param d the dam blocking us + * @param end absolute time when we must stop waiting (NULL = no limit) + * + * @return FALSE if the wait expired, TRUE if we were properly released. + */ +bool +dam_wait_until(dam_t *d, const tm_t *end) +{ + unsigned generation; + bool released = TRUE; + + dam_check(d); + + /* + * Warn them loudly if the reference count is not appropriate. + * Each thread must hold a reference to the dam and call dam_free_null() + * to dispose of the object. + */ + + if (d->refcnt <= d->waiting) { + s_carp_once("%s(): called from %s with improper refcount " + "(waiting=%d, refcnt=%d)", + G_STRFUNC, thread_name(), d->waiting, d->refcnt); + } + + mutex_lock(&d->lock); + + /* + * The generation count is our main driver to release the waiting threads. + * A disabled dam will also free up all the threads. + */ + + generation = d->generation; + d->waiting++; + + thread_cleanup_push(dam_wait_cleanup, d); + + while (d->generation == generation && !d->disabled) { + bool awoken = cond_wait_until(&d->event, &d->lock, end); + if (!awoken) { + released = FALSE; + break; /* Timed out */ + } + } + + thread_cleanup_pop(FALSE); + + mutex_unlock(&d->lock); + return released; +} + +/** + * Wait until the owner releases the dam. + * + * @note + * This routine is a cancellation point. + */ +void +dam_wait(dam_t *d) +{ + dam_wait_until(d, NULL); +} + +/** + * Wait until the owner releases the dam or until the timeout is reached. + * + * @note + * This routine is a cancellation point. + * + * @param d the dam blocking us + * @param timeout how long to wait for (NULL means no limit) + * + * @return FALSE if the wait expired, TRUE if we were properly released. + */ +bool +dam_timed_wait(dam_t *d, const tm_t *timeout) +{ + tm_t end; + + if (timeout != NULL) { + tm_now_exact(&end); + tm_add(&end, timeout); + } + + return dam_wait_until(d, NULL == timeout ? NULL : &end); +} + +/** + * Release all the waiting threads. + * + * @param d the dam blocking the threads + * @param key the owner's key to release the dam + */ +void +dam_release(dam_t *d, uint key) +{ + dam_check(d); + g_assert(d->refcnt > 0); + g_assert_log(d->key == key, + "%s() called with invalid owner key by %s: got %u, expected %u", + G_STRFUNC, thread_name(), key, d->key); + + mutex_lock(&d->lock); + + /* + * All the waiting threads are waiting for the generation count to change. + */ + + d->waiting = 0; + d->generation++; + cond_broadcast(&d->event, &d->lock); + mutex_unlock(&d->lock); +} + +/** + * Flag the dam as being disabled. + * + * A disabled dam is open for everyone, meaning no thread will block on it. + * All the threads currently waiting on the dam are also being released. + * + * @param d the dam blocking the threads + * @param key the owner's key to release the dam + */ +void +dam_disable(dam_t *d, uint key) +{ + dam_check(d); + g_assert(d->refcnt > 0); + g_assert_log(d->key == key, + "%s() called with invalid owner key by %s: got %u, expected %u", + G_STRFUNC, thread_name(), key, d->key); + + mutex_lock(&d->lock); + d->disabled = TRUE; + dam_release(d, key); + mutex_unlock(&d->lock); + +} + +/** + * @return whether dam is disabled. + */ +bool +dam_is_disabled(const dam_t *d) +{ + dam_check(d); + g_assert(d->refcnt > 0); + + return d->disabled; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/dam.h
Added
@@ -0,0 +1,86 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Sychronization dam. + * + * A dam is a thread synchronization primitive allowing parallel processing + * to halt until the dam owner decides to release the waiting parties. + * + * Contrary to a barrier, the dam is not pre-configured with an amount of + * parties that need to join. Rather, it is a halting point for all reaching + * parties until the owner determines that processing can continue. + * + * The owner of the dam is given a random key, and only that key can be used + * to successfully open the dam to release the waiting threads. This ensures + * nobody but the creator of the dam can accidentally release it. + * + * To atomically make the dam a non-blocking point (before freeing it), the + * owner can disable it: this will also release all the waiting parties. + * Anyone still holding a reference to that dam will no longer block when + * calling dam_wait() and friends. + * + * Here is our API: + * + * dam_new() -- allocates a new dam + * dam_free_nul() -- free dynamically allocated dam + * dam_wait() -- wait for the dam to be released + * dam_timed_wait() -- wait on the dam until timeout expires + * dam_wait_until() -- wait on the dam until given absolute time + * dam_release() -- release all threads waiting on the dam + * dam_disable() -- disable dam and release all threads waiting + * dam_refcnt_inc() -- take an extra reference on the dam + * + * @author Raphael Manfredi + * @date 2013 + */ + +#ifndef _dam_h_ +#define _dam_h_ + +struct dam; +typedef struct dam dam_t; + +struct tmval; + +/* + * Public interface. + */ + +dam_t *dam_new(uint *key); +dam_t *dam_new_full(uint *key, bool emulated); +void dam_free_null(dam_t **d_ptr); +void dam_wait(dam_t *d); +bool dam_timed_wait(dam_t *d, const struct tmval *timeout); +bool dam_wait_until(dam_t *d, const struct tmval *abstime); +void dam_release(dam_t *d, uint key); +void dam_disable(dam_t *d, uint key); +bool dam_is_disabled(const dam_t *d); +dam_t *dam_refcnt_inc(dam_t *d); + +#endif /* _dam_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/dbmap.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/dbmap.c
Changed
@@ -45,17 +45,19 @@ #include "common.h" -#include "sdbm/sdbm.h" - #include "dbmap.h" -#include "atoms.h" + #include "bstr.h" +#include "pslist.h" #include "debug.h" #include "map.h" #include "pmsg.h" #include "stringify.h" /* For compact_time() */ +#include "unsigned.h" /* For size_is_non_negative() */ #include "walloc.h" +#include "sdbm/sdbm.h" + #include "override.h" /* Must be the last header included */ enum dbmap_magic { DBMAP_MAGIC = 0x5890dc4fU }; @@ -73,13 +75,13 @@ } m; struct { DBM *sdbm; - const char *path; /**< SDBM file path (atom), if known */ time_t last_check; /**< When we last checked keys */ unsigned is_volatile:1; /**< Whether DB can be discarded */ } s; } u; size_t key_size; /**< Constant width keys are a requirement */ dbmap_keylen_t key_len; /**< Optional, computes serialized key length */ + const dbg_config_t *dbg;/**< Optional debugging */ size_t count; /**< Amount of items */ int error; /**< Last errno value consecutive to an error */ unsigned ioerr:1; /**< Last operation raised an I/O error */ @@ -107,9 +109,9 @@ * Superblock stored in the superkey. */ struct dbmap_superblock { - guint32 key_size; /**< Constant width keys are a requirement */ - guint32 count; /**< Amount of items */ - guint32 flags; /**< Status flags */ + uint32 key_size; /**< Constant width keys are a requirement */ + uint32 count; /**< Amount of items */ + uint32 flags; /**< Status flags */ time_t last_check; /**< When we last checked keys */ }; @@ -137,21 +139,21 @@ * Store a superblock in an SDBM DB map. * @return TRUE on success. */ -static gboolean +static bool dbmap_sdbm_store_superblock(const dbmap_t *dm) { datum key, value; DBM *sdbm; pmsg_t *mb; - guint32 flags = 0; - gboolean ok = TRUE; + uint32 flags = 0; + bool ok = TRUE; dbmap_check(dm); g_assert(DBMAP_SDBM == dm->type); sdbm = dm->u.s.sdbm; - key.dptr = deconstify_gpointer(dbmap_superkey); + key.dptr = deconstify_pointer(dbmap_superkey); key.dsize = CONST_STRLEN(dbmap_superkey); if (dm->had_ioerr) { @@ -187,15 +189,15 @@ * Read the superblock stored in an opened SDBM file. * @return TRUE if we read the superblock correctly. */ -static gboolean +static bool dbmap_sdbm_retrieve_superblock(DBM *sdbm, struct dbmap_superblock *block) { datum key, value; - gboolean ok; + bool ok; bstr_t *bs; - guint8 version; + uint8 version; - key.dptr = deconstify_gpointer(dbmap_superkey); + key.dptr = deconstify_pointer(dbmap_superkey); key.dsize = CONST_STRLEN(dbmap_superkey); value = sdbm_fetch(sdbm, key); @@ -212,7 +214,7 @@ } if (version > DBMAP_SUPERKEY_VERSION) { - g_warning("SDBM \"%s\": superblock more recent " + s_warning("SDBM \"%s\": superblock more recent " "(version %u, can only understand up to version %u)", sdbm_name(sdbm), version, DBMAP_SUPERKEY_VERSION); } @@ -238,20 +240,20 @@ * Remove superblock from the SDBM file. * @return TRUE on success. */ -static gboolean +static bool dbmap_sdbm_strip_superblock(DBM *sdbm) { datum key; g_assert(!sdbm_rdonly(sdbm)); - key.dptr = deconstify_gpointer(dbmap_superkey); + key.dptr = deconstify_pointer(dbmap_superkey); key.dsize = CONST_STRLEN(dbmap_superkey); - + if (0 == sdbm_delete(sdbm, key)) return TRUE; - g_warning("SDBM \"%s\": cannot strip superblock: %m", sdbm_name(sdbm)); + s_warning("SDBM \"%s\": cannot strip superblock: %m", sdbm_name(sdbm)); return FALSE; } @@ -265,14 +267,14 @@ * * @return TRUE on error */ -static gboolean +static bool dbmap_sdbm_error_check(const dbmap_t *dm) { dbmap_check(dm); g_assert(DBMAP_SDBM == dm->type); if (sdbm_error(dm->u.s.sdbm)) { - dbmap_t *dmw = deconstify_gpointer(dm); + dbmap_t *dmw = deconstify_pointer(dm); dmw->ioerr = TRUE; dmw->had_ioerr = TRUE; dmw->error = errno; @@ -281,7 +283,7 @@ } return TRUE; } else if (dm->ioerr) { - dbmap_t *dmw = deconstify_gpointer(dm); + dbmap_t *dmw = deconstify_pointer(dm); dmw->ioerr = FALSE; dmw->error = 0; } @@ -293,7 +295,7 @@ * Helper routine to count keys in an opened SDBM database. */ size_t -dbmap_sdbm_count_keys(dbmap_t *dm, gboolean expect_superblock) +dbmap_sdbm_count_keys(dbmap_t *dm, bool expect_superblock) { datum key; size_t count = 0; @@ -311,10 +313,9 @@ if (dbmap_sdbm_retrieve_superblock(sdbm, &sblock)) { if (common_dbg) { - g_debug("SDBM \"%s\": superblock has %u key%s%s, " + s_debug("SDBM \"%s\": superblock has %u key%s%s, " "last check done %s ago", - sdbm_name(sdbm), (unsigned) sblock.count, - 1 == sblock.count ? "" : "s", + sdbm_name(sdbm), (unsigned) sblock.count, plural(sblock.count), (sblock.flags & DBMAP_SF_KEYCHECK) ? " (keycheck required)" : "", compact_time(delta_time(tm_time(), sblock.last_check))); @@ -325,14 +326,14 @@ time_delta_t d = delta_time(tm_time(), sblock.last_check); if (d >= DBMAP_SDBM_CHECK_PERIOD) { if (common_dbg) { - g_debug("SDBM \"%s\": %s since last check, verifying keys", + s_debug("SDBM \"%s\": %s since last check, verifying keys", sdbm_name(sdbm), compact_time(d)); } goto check_db; } if (sblock.flags & DBMAP_SF_KEYCHECK) { if (common_dbg) { - g_debug("SDBM \"%s\": verifying keys as requested", + s_debug("SDBM \"%s\": verifying keys as requested", sdbm_name(sdbm)); } goto check_db; @@ -341,26 +342,30 @@ return sblock.count; } else { if (common_dbg) { - g_debug("SDBM \"%s\": unexpected superblock, checking keys", + s_debug("SDBM \"%s\": unexpected superblock, checking keys", sdbm_name(sdbm)); } } } else if (expect_superblock) { if (common_dbg) { - g_debug("SDBM \"%s\": no superblock, counting and checking keys", + s_debug("SDBM \"%s\": no superblock, counting and checking keys", sdbm_name(sdbm)); } } check_db: - for (key = sdbm_firstkey_safe(sdbm); key.dptr; key = sdbm_nextkey(sdbm)) + for (key = sdbm_firstkey_safe(sdbm); key.dptr; key = sdbm_nextkey(sdbm)) { + datum value = sdbm_value(sdbm); + if (NULL == value.dptr) + continue; /* Invalid value, do not count key */ count++; + } dm->validated = TRUE; dm->u.s.last_check = tm_time(); if (sdbm_error(sdbm)) { - g_warning("SDBM \"%s\": I/O error after key counting, clearing", + s_warning("SDBM \"%s\": I/O error after key counting, clearing", sdbm_name(sdbm)); sdbm_clearerr(sdbm); } @@ -396,7 +401,7 @@ /** * Check whether I/O error has occurred. */ -gboolean +bool dbmap_has_ioerr(const dbmap_t *dm) { dbmap_check(dm); @@ -459,7 +464,7 @@ */ dbmap_t * dbmap_create_hash(size_t key_size, dbmap_keylen_t key_len, - GHashFunc hash_func, GEqualFunc key_eq_func) + hash_fn_t hash_func, eq_fn_t key_eq_func) { dbmap_t *dm; @@ -513,7 +518,6 @@ } dm->magic = DBMAP_MAGIC; - dm->u.s.path = atom_str_get(path); if (flags & O_TRUNC) dm->u.s.last_check = tm_time(); @@ -612,8 +616,8 @@ * * @return success status. */ -gboolean -dbmap_insert(dbmap_t *dm, gconstpointer key, dbmap_datum_t value) +bool +dbmap_insert(dbmap_t *dm, const void *key, dbmap_datum_t value) { dbmap_check(dm); @@ -621,9 +625,9 @@ case DBMAP_MAP: { dbmap_datum_t *d; - gpointer okey; - gpointer ovalue; - gboolean found; + void *okey; + void *ovalue; + bool found; WALLOC(d); @@ -634,7 +638,7 @@ d->data = NULL; d->len = 0; } - + found = map_lookup_extended(dm->u.m.map, key, &okey, &ovalue); if (found) { dbmap_datum_t *od = ovalue; @@ -645,7 +649,7 @@ wfree(od->data, od->len); WFREE(od); } else { - gpointer dkey = wcopy(key, dbmap_keylen(dm, key)); + void *dkey = wcopy(key, dbmap_keylen(dm, key)); map_insert(dm->u.m.map, dkey, d); dm->count++; @@ -656,12 +660,12 @@ { datum dkey; datum dval; - gboolean existed = FALSE; + bool existed = FALSE; int ret; - dkey.dptr = deconstify_gpointer(key); + dkey.dptr = deconstify_pointer(key); dkey.dsize = dbmap_keylen(dm, key); - dval.dptr = deconstify_gpointer(value.data); + dval.dptr = deconstify_pointer(value.data); dval.dsize = value.len; errno = dm->error = 0; @@ -687,18 +691,18 @@ * @return success status (not whether the key was present, rather whether * the key has been physically removed). */ -gboolean -dbmap_remove(dbmap_t *dm, gconstpointer key) +bool +dbmap_remove(dbmap_t *dm, const void *key) { dbmap_check(dm); switch (dm->type) { case DBMAP_MAP: { - gpointer dkey; - gpointer dvalue; - gboolean found; - + void *dkey; + void *dvalue; + bool found; + found = map_lookup_extended(dm->u.m.map, key, &dkey, &dvalue); if (found) { dbmap_datum_t *d; @@ -719,7 +723,7 @@ datum dkey; int ret; - dkey.dptr = deconstify_gpointer(key); + dkey.dptr = deconstify_pointer(key); dkey.dsize = dbmap_keylen(dm, key); errno = dm->error = 0; @@ -732,18 +736,18 @@ return FALSE; } } else { - if (0 == dm->count) { + if G_UNLIKELY(0 == dm->count) { if (dm->validated) { - g_carp("DBMAP on sdbm \"%s\": BUG: " + s_critical("DBMAP on sdbm \"%s\": BUG: " "sdbm_delete() worked but we had no key tracked", sdbm_name(dm->u.s.sdbm)); } else { - g_warning("DBMAP on sdbm \"%s\": " + s_warning("DBMAP on sdbm \"%s\": " "key count inconsistency, validating database", sdbm_name(dm->u.s.sdbm)); } dm->count = dbmap_sdbm_count_keys(dm, FALSE); - g_warning("DBMAP on sdbm \"%s\": " + s_warning("DBMAP on sdbm \"%s\": " "key count reset to %zu after counting", sdbm_name(dm->u.s.sdbm), dm->count); } else { @@ -762,8 +766,8 @@ /** * Check whether DB map contains the key. */ -gboolean -dbmap_contains(dbmap_t *dm, gconstpointer key) +bool +dbmap_contains(dbmap_t *dm, const void *key) { dbmap_check(dm); @@ -775,7 +779,7 @@ datum dkey; int ret; - dkey.dptr = deconstify_gpointer(key); + dkey.dptr = deconstify_pointer(key); dkey.dsize = dbmap_keylen(dm, key); dm->error = errno = 0; @@ -797,7 +801,7 @@ * Lookup a key in the DB map. */ dbmap_datum_t -dbmap_lookup(dbmap_t *dm, gconstpointer key) +dbmap_lookup(dbmap_t *dm, const void *key) { dbmap_datum_t result = { NULL, 0 }; @@ -822,7 +826,7 @@ datum dkey; datum value; - dkey.dptr = deconstify_gpointer(key); + dkey.dptr = deconstify_pointer(key); dkey.dsize = dbmap_keylen(dm, key); errno = dm->error = 0; @@ -844,7 +848,7 @@ /** * Returns the underlying dbmap implementation. */ -gpointer +void * dbmap_implementation(const dbmap_t *dm) { dbmap_check(dm); @@ -865,19 +869,15 @@ * Release the map encapsulation, returning the underlying implementation * object (will need to be cast back to the proper type for perusal). */ -gpointer +void * dbmap_release(dbmap_t *dm) { - gpointer implementation; + void *implementation; dbmap_check(dm); implementation = dbmap_implementation(dm); - if (DBMAP_SDBM == dm->type) { - atom_str_free_null(&dm->u.s.path); - } - dm->type = DBMAP_MAXTYPE; dm->magic = 0; WFREE(dm); @@ -889,7 +889,7 @@ * Map iterator to free key/values */ static void -free_kv(gpointer key, gpointer value, gpointer u) +free_kv(void *key, void *value, void *u) { dbmap_t *dm = u; dbmap_datum_t *d = value; @@ -904,7 +904,7 @@ * Destroy a DB map. * * A memory-backed map is lost. - * An SDBM-backed map is lost if marked volatile, provided its path is known. + * An SDBM-backed map is lost if marked volatile. */ void dbmap_destroy(dbmap_t *dm) @@ -918,9 +918,6 @@ break; case DBMAP_SDBM: sdbm_close(dm->u.s.sdbm); - if (dm->u.s.is_volatile && dm->u.s.path != NULL) - dbmap_unlink_sdbm(dm->u.s.path); - atom_str_free_null(&dm->u.s.path); break; case DBMAP_MAXTYPE: g_assert_not_reached(); @@ -932,7 +929,7 @@ } struct insert_ctx { - GSList *sl; + pslist_t *sl; const dbmap_t *dm; }; @@ -940,25 +937,25 @@ * Map iterator to insert a copy of the map keys into a singly-linked list. */ static void -insert_key(gpointer key, gpointer unused_value, gpointer u) +insert_key(void *key, void *unused_value, void *u) { - gpointer kdup; + void *kdup; struct insert_ctx *ctx = u; (void) unused_value; kdup = wcopy(key, dbmap_keylen(ctx->dm, key)); - ctx->sl = g_slist_prepend(ctx->sl, kdup); + ctx->sl = pslist_prepend(ctx->sl, kdup); } /** * Snapshot all the constant-width keys, returning them in a singly linked list. * To free the returned keys, use the dbmap_free_all_keys() helper. */ -GSList * +pslist_t * dbmap_all_keys(const dbmap_t *dm) { - GSList *sl = NULL; + pslist_t *sl = NULL; dbmap_check(dm); @@ -984,13 +981,13 @@ key.dptr != NULL; key = sdbm_nextkey(sdbm) ) { - gpointer kdup; + void *kdup; if (dbmap_keylen(dm, key.dptr) != key.dsize) continue; /* Invalid key, corrupted file? */ kdup = wcopy(key.dptr, key.dsize); - sl = g_slist_prepend(sl, kdup); + sl = pslist_prepend(sl, kdup); } dbmap_sdbm_error_check(dm); } @@ -1006,32 +1003,35 @@ * Helper routine to free list and keys returned by dbmap_all_keys(). */ void -dbmap_free_all_keys(const dbmap_t *dm, GSList *keys) +dbmap_free_all_keys(const dbmap_t *dm, pslist_t *keys) { - GSList *sl; + pslist_t *sl; - GM_SLIST_FOREACH(keys, sl) { + PSLIST_FOREACH(keys, sl) { wfree(sl->data, dbmap_keylen(dm, sl->data)); } - g_slist_free(keys); + pslist_free(keys); } /** - * Structure used as context by dbmap_foreach_*trampoline(). + * Structure used as context by dbmap_foreach_*trampoline() and + * dbmap_foreach_*sdbm(). */ struct foreach_ctx { union { dbmap_cb_t cb; dbmap_cbr_t cbr; } u; - gpointer arg; + void *arg; + const dbmap_t *dm; /* Used only by SDBM iterators */ + size_t deleted; /* Used only by SDBM removal iterators */ }; /** * Trampoline to invoke the map iterator and do the proper casts. */ static void -dbmap_foreach_trampoline(gpointer key, gpointer value, gpointer arg) +dbmap_foreach_trampoline(void *key, void *value, void *arg) { dbmap_datum_t *d = value; struct foreach_ctx *ctx = arg; @@ -1042,12 +1042,12 @@ /** * Trampoline to invoke the map iterator and do the proper casts. */ -static gboolean -dbmap_foreach_remove_trampoline(gpointer key, gpointer value, gpointer arg) +static bool +dbmap_foreach_remove_trampoline(void *key, void *value, void *arg) { dbmap_datum_t *d = value; struct foreach_ctx *ctx = arg; - gboolean to_remove; + bool to_remove; to_remove = (*ctx->u.cbr)(key, d, ctx->arg); @@ -1061,63 +1061,99 @@ } /** + * Trampoline to invoke the sdbm iterator and do the proper casts. + */ +static void +dbmap_foreach_sdbm(const datum key, const datum value, void *arg) +{ + dbmap_datum_t d; + struct foreach_ctx *ctx = arg; + + if (dbmap_keylen(ctx->dm, key.dptr) != key.dsize) + return; /* Invalid key, corrupted file? */ + + d.data = value.dptr; + d.len = value.dsize; + + (*ctx->u.cb)(deconstify_pointer(key.dptr), &d, ctx->arg); +} + +/** + * Trampoline to invoke the sdbm iterator and do the proper casts. + */ +static bool +dbmap_foreach_remove_sdbm(const datum key, const datum value, void *arg) +{ + dbmap_datum_t d; + struct foreach_ctx *ctx = arg; + bool to_remove; + + if (dbmap_keylen(ctx->dm, key.dptr) != key.dsize) + return FALSE; /* Invalid key, corrupted file, keep it */ + + d.data = value.dptr; + d.len = value.dsize; + + to_remove = (*ctx->u.cbr)(deconstify_pointer(key.dptr), &d, ctx->arg); + + if (to_remove) + ctx->deleted++; + + return to_remove; +} + +/** + * Reset count of items. + * + * @attention + * The argument is "const" but nonetheless the structure is updated. This is + * OK because we're only updating a cached attribute, not changing the abstract + * data type (the underlying map/database). + * + * This is a macro to get a proper G_STRFUNC expansion depending on where + * it is being used. + */ +#define dbmap_reset_count(d,c) \ +{ \ + dbmap_t *dmw = deconstify_pointer(d); \ + dmw->count = (c); \ + \ + if (dbg_ds_debugging(dm->dbg, 1, DBG_DSF_CACHING)) { \ + dbg_ds_log((d)->dbg, (d), "%s: setting count to %zu", \ + G_STRFUNC, (c)); \ + } \ +} + +/** * Iterate over the map, invoking the callback on each item along with the * supplied argument. */ void -dbmap_foreach(const dbmap_t *dm, dbmap_cb_t cb, gpointer arg) +dbmap_foreach(const dbmap_t *dm, dbmap_cb_t cb, void *arg) { + struct foreach_ctx ctx; + dbmap_check(dm); g_assert(cb); + ctx.u.cb = cb; + ctx.arg = arg; + switch (dm->type) { case DBMAP_MAP: - { - struct foreach_ctx ctx; - - ctx.u.cb = cb; - ctx.arg = arg; - map_foreach(dm->u.m.map, dbmap_foreach_trampoline, &ctx); - } + map_foreach(dm->u.m.map, dbmap_foreach_trampoline, &ctx); break; case DBMAP_SDBM: { - datum key; - DBM *sdbm = dm->u.s.sdbm; - size_t count = 0; - size_t invalid = 0; + size_t count; - errno = 0; - for ( - key = sdbm_firstkey(sdbm); - key.dptr != NULL; - key = sdbm_nextkey(sdbm) - ) { - datum value; + ctx.dm = dm; - count++; + count = sdbm_foreach( + dm->u.s.sdbm, DBM_F_SKIP, dbmap_foreach_sdbm, &ctx); - if (dbmap_keylen(dm, key.dptr) != key.dsize) { - invalid++; - continue; /* Invalid key, corrupted file? */ - } - - value = sdbm_value(sdbm); - if (value.dptr) { - dbmap_datum_t d; - d.data = value.dptr; - d.len = value.dsize; - (*cb)(key.dptr, &d, arg); - } - } - if (!dbmap_sdbm_error_check(dm)) { - dbmap_t *dmw = deconstify_gpointer(dm); - dmw->count = count; - } - if (invalid) { - g_warning("DBMAP on sdbm \"%s\": found %zu invalid key%s", - sdbm_name(sdbm), invalid, 1 == invalid ? "" : "s"); - } + if (!dbmap_sdbm_error_check(dm)) + dbmap_reset_count(dm, count); } break; case DBMAP_MAXTYPE: @@ -1128,106 +1164,55 @@ /** * Iterate over the map, invoking the callback on each item along with the * supplied argument and removing the item when the callback returns TRUE. + * + * @return the amount of items deleted */ -void -dbmap_foreach_remove(const dbmap_t *dm, dbmap_cbr_t cbr, gpointer arg) +size_t +dbmap_foreach_remove(const dbmap_t *dm, dbmap_cbr_t cbr, void *arg) { + size_t deleted = 0; + struct foreach_ctx ctx; + dbmap_check(dm); g_assert(cbr); + ctx.u.cbr = cbr; + ctx.arg = arg; + switch (dm->type) { case DBMAP_MAP: { - struct foreach_ctx ctx; - dbmap_t *dmw; - ctx.u.cbr = cbr; - ctx.arg = arg; - map_foreach_remove(dm->u.m.map, + deleted = map_foreach_remove(dm->u.m.map, dbmap_foreach_remove_trampoline, &ctx); - - dmw = deconstify_gpointer(dm); - dmw->count = map_count(dm->u.m.map); + + dbmap_reset_count(dm, map_count(dm->u.m.map)); } break; case DBMAP_SDBM: { - datum key; - DBM *sdbm = dm->u.s.sdbm; - size_t count = 0; - size_t invalid = 0; + size_t count; - errno = 0; - for ( - key = sdbm_firstkey(sdbm); - key.dptr != NULL; - key = sdbm_nextkey(sdbm) - ) { - datum value; - - count++; + ctx.dm = dm; + ctx.deleted = 0; - if (dbmap_keylen(dm, key.dptr) != key.dsize) { - invalid++; - continue; /* Invalid key, corrupted file? */ - } + count = sdbm_foreach_remove( + dm->u.s.sdbm, DBM_F_SKIP, dbmap_foreach_remove_sdbm, &ctx); - value = sdbm_value(sdbm); - if (value.dptr) { - dbmap_datum_t d; - d.data = value.dptr; - d.len = value.dsize; - if ((*cbr)(key.dptr, &d, arg)) { - if (0 == sdbm_deletekey(sdbm)) { - count--; - } - } - } - } dbmap_sdbm_error_check(dm); - { - dbmap_t *dmw = deconstify_gpointer(dm); - dmw->count = count; - } - if (invalid) { - g_warning("DBMAP on sdbm \"%s\": found %zu invalid key%s", - sdbm_name(sdbm), invalid, 1 == invalid ? "" : "s"); - } + dbmap_reset_count(dm, count); + deleted = ctx.deleted; } break; case DBMAP_MAXTYPE: g_assert_not_reached(); } -} - -static void -unlink_sdbm(const char *file) -{ - if (-1 == unlink(file) && errno != ENOENT) - g_warning("cannot unlink SDBM file %s: %m", file); -} - -/** - * Helper routine to remove SDBM files under specified basename. - */ -void -dbmap_unlink_sdbm(const char *base) -{ - char *dir_file; - char *pag_file; - - dir_file = g_strconcat(base, DBM_DIRFEXT, NULL); - pag_file = g_strconcat(base, DBM_PAGFEXT, NULL); - unlink_sdbm(dir_file); - unlink_sdbm(pag_file); - - G_FREE_NULL(dir_file); - G_FREE_NULL(pag_file); + return deleted; } static void -dbmap_store_entry(gpointer key, dbmap_datum_t *d, gpointer arg) +dbmap_store_entry(void *key, dbmap_datum_t *d, void *arg) { dbmap_insert(arg, key, *d); } @@ -1246,11 +1231,11 @@ * * @return TRUE on success. */ -gboolean -dbmap_store(dbmap_t *dm, const char *base, gboolean inplace) +bool +dbmap_store(dbmap_t *dm, const char *base, bool inplace) { dbmap_t *ndm; - gboolean ok = TRUE; + bool ok = TRUE; dbmap_check(dm); @@ -1261,7 +1246,7 @@ return ok; } - g_warning("SDBM \"%s\": cannot store superblock: %m", + s_warning("SDBM \"%s\": cannot store superblock: %m", sdbm_name(dm->u.s.sdbm)); /* FALL THROUGH */ @@ -1274,7 +1259,7 @@ O_CREAT | O_TRUNC | O_RDWR, S_IRUSR | S_IWUSR); if (!ndm) { - g_warning("SDBM \"%s\": cannot store to %s: %m", + s_warning("SDBM \"%s\": cannot store to %s: %m", sdbm_name(dm->u.s.sdbm), base); return FALSE; } @@ -1282,7 +1267,7 @@ dbmap_foreach(dm, dbmap_store_entry, ndm); if (sdbm_error(ndm->u.s.sdbm)) { - g_warning("SDBM \"%s\": cannot store to %s: errors during dump", + s_warning("SDBM \"%s\": cannot store to %s: errors during dump", sdbm_name(dm->u.s.sdbm), base); ok = FALSE; goto done; @@ -1300,12 +1285,12 @@ * Copy context. */ struct copy_context { - dbmap_t *to; /**< Destination */ - gboolean error; /**< Whether an error occurred */ + dbmap_t *to; /**< Destination */ + bool error; /**< Whether an error occurred */ }; static void -dbmap_copy_entry(gpointer key, dbmap_datum_t *d, gpointer arg) +dbmap_copy_entry(void *key, dbmap_datum_t *d, void *arg) { struct copy_context *ctx = arg; @@ -1322,7 +1307,7 @@ * * @return TRUE on success. */ -gboolean +bool dbmap_copy(dbmap_t *from, dbmap_t *to) { struct copy_context ctx; @@ -1366,7 +1351,7 @@ * Attempt to shrink the database. * @return TRUE if no error occurred. */ -gboolean +bool dbmap_shrink(dbmap_t *dm) { dbmap_check(dm); @@ -1384,10 +1369,31 @@ } /** + * Attempt to rebuild the database (to compact it on disk). + * @return TRUE if no error occurred. + */ +bool +dbmap_rebuild(dbmap_t *dm) +{ + dbmap_check(dm); + + switch (dm->type) { + case DBMAP_MAP: + return TRUE; + case DBMAP_SDBM: + return 0 == sdbm_rebuild(dm->u.s.sdbm); + case DBMAP_MAXTYPE: + g_assert_not_reached(); + } + + return FALSE; +} + +/** * Discard all data from the database. * @return TRUE if no error occurred. */ -gboolean +bool dbmap_clear(dbmap_t *dm) { dbmap_check(dm); @@ -1437,7 +1443,7 @@ * @return 0 if OK, -1 on errors with errno set. */ int -dbmap_set_deferred_writes(dbmap_t *dm, gboolean on) +dbmap_set_deferred_writes(dbmap_t *dm, bool on) { dbmap_check(dm); @@ -1458,7 +1464,7 @@ * @return 0 if OK, -1 on errors with errno set. */ int -dbmap_set_volatile(dbmap_t *dm, gboolean is_volatile) +dbmap_set_volatile(dbmap_t *dm, bool is_volatile) { dbmap_check(dm); @@ -1475,4 +1481,20 @@ return 0; } +/** + * Record debugging configuration. + */ +void +dbmap_set_debugging(dbmap_t *dm, const dbg_config_t *dbg) +{ + dbmap_check(dm); + + dm->dbg = dbg; + + if (dbg_ds_debugging(dm->dbg, 1, DBG_DSF_DEBUGGING)) { + dbg_ds_log(dm->dbg, dm, "%s: attached with %s back-end (count=%zu)", + G_STRFUNC, DBMAP_SDBM == dm->type ? "sdbm" : "map", dm->count); + } +} + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/dbmap.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/dbmap.h
Changed
@@ -25,7 +25,7 @@ * @ingroup lib * @file * - * DB map generic interface.. + * DB map generic interface. * * @author Raphael Manfredi * @date 2008 @@ -53,7 +53,7 @@ typedef struct dbmap dbmap_t; typedef struct dbmap_datum { - gpointer data; + void *data; size_t len; } dbmap_datum_t; @@ -68,15 +68,15 @@ /** * DB map "foreach" iterator callbacks. */ -typedef void (*dbmap_cb_t)(gpointer key, dbmap_datum_t *value, gpointer u); -typedef gboolean (*dbmap_cbr_t)(gpointer key, dbmap_datum_t *value, gpointer u); +typedef void (*dbmap_cb_t)(void *key, dbmap_datum_t *value, void *u); +typedef bool (*dbmap_cbr_t)(void *key, dbmap_datum_t *value, void *u); /** * Creation interface. */ dbmap_t *dbmap_create_hash(size_t ks, dbmap_keylen_t kl, - GHashFunc hashf, GEqualFunc key_eqf); + hash_fn_t hashf, eq_fn_t key_eqf); dbmap_t * dbmap_create_sdbm(size_t ks, dbmap_keylen_t kl, const char *name, const char *path, int flags, int mode); dbmap_t *dbmap_create_from_map(size_t ks, dbmap_keylen_t kl, map_t *map); @@ -88,44 +88,43 @@ * Public DB map interface. */ -gboolean dbmap_insert(dbmap_t *dm, gconstpointer key, dbmap_datum_t value); -gboolean dbmap_remove(dbmap_t *dm, gconstpointer key); -gboolean dbmap_contains(dbmap_t *dm, gconstpointer key); -dbmap_datum_t dbmap_lookup(dbmap_t *dm, gconstpointer key); -gpointer dbmap_implementation(const dbmap_t *dm); -gpointer dbmap_release(dbmap_t *dm); +bool dbmap_insert(dbmap_t *dm, const void *key, dbmap_datum_t value); +bool dbmap_remove(dbmap_t *dm, const void *key); +bool dbmap_contains(dbmap_t *dm, const void *key); +dbmap_datum_t dbmap_lookup(dbmap_t *dm, const void *key); +void *dbmap_implementation(const dbmap_t *dm); +void *dbmap_release(dbmap_t *dm); void dbmap_destroy(dbmap_t *dm); size_t dbmap_key_size(const dbmap_t *dm); dbmap_keylen_t dbmap_key_length(const dbmap_t *dm); -gboolean dbmap_has_ioerr(const dbmap_t *dm); +bool dbmap_has_ioerr(const dbmap_t *dm); const char *dbmap_strerror(const dbmap_t *dm); enum dbmap_type dbmap_type(const dbmap_t *dm); size_t dbmap_count(const dbmap_t *dm); -void dbmap_foreach(const dbmap_t *dm, dbmap_cb_t cb, gpointer arg); -void dbmap_foreach_remove(const dbmap_t *dm, dbmap_cbr_t cbr, gpointer arg); +void dbmap_foreach(const dbmap_t *dm, dbmap_cb_t cb, void *arg); +size_t dbmap_foreach_remove(const dbmap_t *dm, dbmap_cbr_t cbr, void *arg); /** * Key snapshot utilities. */ -GSList * dbmap_all_keys(const dbmap_t *dm); -void dbmap_free_all_keys(const dbmap_t *dm, GSList *keys); +struct pslist *dbmap_all_keys(const dbmap_t *dm); +void dbmap_free_all_keys(const dbmap_t *dm, struct pslist *keys); -/** - * Other helper routines. - */ -void dbmap_unlink_sdbm(const char *base); +struct dbg_config; -gboolean dbmap_store(dbmap_t *dm, const char *base, gboolean inplace); -gboolean dbmap_copy(dbmap_t *from, dbmap_t *to); -gboolean dbmap_shrink(dbmap_t *dm); -gboolean dbmap_clear(dbmap_t *dm); +bool dbmap_store(dbmap_t *dm, const char *base, bool inplace); +bool dbmap_copy(dbmap_t *from, dbmap_t *to); +bool dbmap_shrink(dbmap_t *dm); +bool dbmap_rebuild(dbmap_t *dm); +bool dbmap_clear(dbmap_t *dm); ssize_t dbmap_sync(dbmap_t *dm); int dbmap_set_cachesize(dbmap_t *dm, long pages); -int dbmap_set_deferred_writes(dbmap_t *dm, gboolean on); -int dbmap_set_volatile(dbmap_t *dm, gboolean is_volatile); +int dbmap_set_deferred_writes(dbmap_t *dm, bool on); +int dbmap_set_volatile(dbmap_t *dm, bool is_volatile); +void dbmap_set_debugging(dbmap_t *dm, const struct dbg_config *dbg); #endif /* _dbmap_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/dbmw.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/dbmw.c
Changed
@@ -34,17 +34,20 @@ #include "common.h" -#include "debug.h" #include "dbmw.h" + +#include "bstr.h" #include "dbmap.h" +#include "debug.h" +#include "hashlist.h" #include "map.h" #include "pmsg.h" -#include "bstr.h" -#include "hashlist.h" +#include "pslist.h" #include "stacktrace.h" #include "stringify.h" -#include "zalloc.h" #include "walloc.h" +#include "zalloc.h" + #include "override.h" /* Must be the last header included */ #define DBMW_CACHE 128 /**< Default amount of items to cache */ @@ -62,18 +65,21 @@ bstr_t *bs; /**< Binary stream used for deserialization */ hash_list_t *keys; /**< LRU list of keys cached */ map_t *values; /**< Map of values cached */ - guint64 r_access; /**< Number of read accesses */ - guint64 w_access; /**< Number of write accesses */ - guint64 r_hits; /**< Number of read cache hits */ - guint64 w_hits; /**< Number of write cache hits */ + uint64 r_access; /**< Number of read accesses */ + uint64 w_access; /**< Number of write accesses */ + uint64 r_hits; /**< Number of read cache hits */ + uint64 w_hits; /**< Number of write cache hits */ size_t key_size; /**< Size of keys (constant or maximum) */ dbmap_keylen_t key_len; /**< Optional, computes actual key length */ size_t value_size; /**< Maximum size of values (structure) */ size_t value_data_size; /**< Maximum size of values (serialized form) */ size_t max_cached; /**< Max amount of items to cache */ + ssize_t cached; /**< Cached entries not present in dbmap */ dbmw_serialize_t pack; /**< Serialization routine for values */ dbmw_deserialize_t unpack; /**< Deserialization routine for values */ dbmw_free_t valfree; /**< Free routine for deserialized values */ + const dbg_config_t *dbg; /**< Optional debugging */ + dbg_config_t *dbmap_dbg; /**< Object created for DBMAP debugging */ int error; /**< Last errno value */ unsigned ioerr:1; /**< Had I/O error */ unsigned count_needs_sync:1;/**< Whether we need to sync to get count */ @@ -88,7 +94,7 @@ } /** - * A cached entry (deserialized value). + * A cached entry (deserialized value). * * A clean item found in the DB has dirty=FALSE, absent=FALSE. * A dirty item (new or modified) has dirty=TRUE, absent=FALSE. @@ -96,7 +102,7 @@ * A deleted item has dirty=TRUE, absent=TRUE. */ struct cached { - gpointer data; /**< Value data */ + void *data; /**< Value data */ size_t len; /**< Length of data */ unsigned dirty:1; /**< Whether entry is dirty */ unsigned absent:1; /**< Whether entry is absent from database */ @@ -122,7 +128,7 @@ /** * Check whether I/O error has occurred during last operation. */ -gboolean +bool dbmw_has_ioerr(const dbmw_t *dw) { return dw->ioerr; @@ -169,7 +175,7 @@ if (dw->count_needs_sync) dbmw_sync(dw, DBMW_SYNC_CACHE); - return dbmap_count(dw->dm); + return dbmap_count(dw->dm) + dw->cached; } /** @@ -196,7 +202,7 @@ dbmw_create(dbmap_t *dm, const char *name, size_t value_size, size_t value_data_size, dbmw_serialize_t pack, dbmw_deserialize_t unpack, dbmw_free_t valfree, - size_t cache_size, GHashFunc hash_func, GEqualFunc eq_func) + size_t cache_size, hash_fn_t hash_func, eq_fn_t eq_func) { dbmw_t *dw; @@ -275,7 +281,7 @@ dw->max_cached = cache_size; if (common_dbg) - g_debug("DBMW created \"%s\" with %s back-end " + s_debug("DBMW created \"%s\" with %s back-end " "(max cached = %zu, key=%zu bytes, value=%zu bytes, " "%zu max serialized)", dw->name, dbmw_map_type(dw) == DBMAP_SDBM ? "sdbm" : "map", @@ -288,11 +294,11 @@ * Write back cached value to disk. * @return TRUE on success */ -static gboolean -write_back(dbmw_t *dw, gconstpointer key, struct cached *value) +static bool +write_back(dbmw_t *dw, const void *key, struct cached *value) { dbmap_datum_t dval; - gboolean ok; + bool ok; g_assert(value->dirty); @@ -320,12 +326,10 @@ */ if (dval.len > dw->value_data_size) { - /* Don't g_carp() as this is asynchronous wrt data change */ - g_critical("DBMW \"%s\" serialization overflow in %s() " - "whilst %s dirty entry", - dw->name, - stacktrace_routine_name(func_to_pointer(dw->pack), FALSE), - value->absent ? "deleting" : "flushing"); + /* Don't s_carp() as this is asynchronous wrt data change */ + s_critical("DBMW \"%s\" serialization overflow in %s() " + "whilst flushing dirty entry", + dw->name, stacktrace_function_name(dw->pack)); return FALSE; } } else { @@ -341,10 +345,15 @@ * Dirty bit is cleared on success. */ - if (common_dbg > 4) - g_debug("DBMW \"%s\" %s dirty value (%zu byte%s)", - dw->name, value->absent ? "deleting" : "flushing", - dval.len, 1 == dval.len ? "" : "s"); + if ( + dbg_ds_debugging(dw->dbg, 1, + DBG_DSF_CACHING | DBG_DSF_UPDATE | DBG_DSF_INSERT | DBG_DSF_DELETE) + ) { + dbg_ds_log(dw->dbg, dw, "%s: %s dirty value (%zu byte%s) key=%s", + G_STRFUNC, value->absent ? "deleting" : "flushing", + dval.len, plural(dval.len), + dbg_ds_keystr(dw->dbg, key, (size_t) -1)); + } dw->ioerr = FALSE; ok = value->absent ? @@ -355,11 +364,11 @@ } else if (dbmap_has_ioerr(dw->dm)) { dw->ioerr = TRUE; dw->error = errno; - g_warning("DBMW \"%s\" I/O error whilst %s dirty entry: %s", + s_warning("DBMW \"%s\" I/O error whilst %s dirty entry: %s", dw->name, value->absent ? "deleting" : "flushing", dbmap_strerror(dw->dm)); } else { - g_warning("DBMW \"%s\" error whilst %s dirty entry: %s", + s_warning("DBMW \"%s\" error whilst %s dirty entry: %s", dw->name, value->absent ? "deleting" : "flushing", dbmap_strerror(dw->dm)); } @@ -379,7 +388,7 @@ * is not freed and can be reused. */ static void -free_value(const dbmw_t *dw, struct cached *cv, gboolean reclaim) +free_value(const dbmw_t *dw, struct cached *cv, bool reclaim) { if (cv->len) { if (dw->valfree) @@ -400,19 +409,26 @@ * indeed cached, NULL otherwise. */ static struct cached * -remove_entry(dbmw_t *dw, gconstpointer key, gboolean dispose, gboolean flush) +remove_entry(dbmw_t *dw, const void *key, bool dispose, bool flush) { struct cached *old; - gpointer old_key; - gboolean found; + void *old_key; + bool found; - found = map_lookup_extended(dw->values, key, &old_key, (gpointer) &old); + found = map_lookup_extended(dw->values, key, &old_key, (void *) &old); if (!found) return NULL; g_assert(old != NULL); + if (dbg_ds_debugging(dw->dbg, 3, DBG_DSF_CACHING)) { + dbg_ds_log(dw->dbg, dw, "%s: %s key=%s (%s)", + G_STRFUNC, old->dirty ? "dirty" : "clean", + dbg_ds_keystr(dw->dbg, key, (size_t) -1), + flush ? "flushing" : " discarding"); + } + if (old->dirty && flush) write_back(dw, key, old); @@ -449,10 +465,10 @@ * @return a cache entry object that can be filled with the value. */ static struct cached * -allocate_entry(dbmw_t *dw, gconstpointer key, struct cached *filled) +allocate_entry(dbmw_t *dw, const void *key, struct cached *filled) { struct cached *entry; - gpointer saved_key; + void *saved_key; g_assert(!hash_list_contains(dw->keys, key)); g_assert(!map_contains(dw->values, key)); @@ -471,7 +487,7 @@ else WALLOC0(entry); } else { - gpointer head; + void *head; g_assert(hash_list_length(dw->keys) == dw->max_cached); @@ -501,7 +517,7 @@ */ static void fill_entry(const dbmw_t *dw, - struct cached *entry, gpointer value, size_t length) + struct cached *entry, void *value, size_t length) { /* * Try to reuse old entry arena if same size. @@ -513,7 +529,7 @@ */ if (length != (size_t) entry->len) { - gpointer arena = NULL; + void *arena = NULL; if (length) arena = wcopy(value, length); @@ -536,7 +552,7 @@ * iterating on the database. */ static void -cache_reset_before_traversal(gpointer u_key, gpointer value, gpointer u_data) +cache_reset_before_traversal(void *u_key, void *value, void *u_data) { struct cached *entry = value; @@ -552,6 +568,19 @@ } /** + * Structure used as context by dbmw_foreach_*trampoline(). + */ +struct foreach_ctx { + union { + dbmw_cb_t cb; + dbmw_cbr_t cbr; + void *any; /* For logging the function pointer */ + } u; + void *arg; + dbmw_t *dw; +}; + +/** * Structure used to iterate on the cached entries that were not traversed. */ struct cache_foreach_ctx { @@ -561,6 +590,9 @@ dbmap_cbr_t cbr; } u; unsigned removing:1; /* Union discriminant */ + unsigned warned_clean_key:1; /* Did we warn during cache traversal? */ + size_t removed; /* Counts cached entries that are removed */ + size_t cached; /* Counts cached entries not present in dbmap */ }; /** @@ -568,7 +600,7 @@ * as being traversed, invoking the supplied trampoline callback. */ static void -cache_finish_traversal(gpointer key, gpointer value, gpointer data) +cache_finish_traversal(void *key, void *value, void *data) { struct cached *entry = value; struct cache_foreach_ctx *fctx = data; @@ -577,6 +609,34 @@ if (entry->traversed) return; +#define dw fctx->foreach->dw + + if (dbg_ds_debugging(dw->dbg, 3, DBG_DSF_ITERATOR)) { + dbg_ds_log(dw->dbg, dw, "%s: traversing cached %s key=%s%s", + G_STRFUNC, entry->dirty ? "dirty" : "clean", + dbg_ds_keystr(dw->dbg, key, (size_t) -1), + entry->absent ? " (absent)" : ""); + } + + if (entry->absent) + return; /* Entry not there, just caching it is missing */ + + /* + * We should not be traversing a clean entry at this stage: if the entry + * is clean, it means it was flushed to the database, and we should + * have traversed it already. Loudly warn, but process anyway! + */ + + if (!entry->dirty && !fctx->warned_clean_key) { + fctx->warned_clean_key = TRUE; + s_critical("%s(): DBMW \"%s\" " + "iterating via %s over a clean key in cache", + G_STRFUNC, dw->name, + stacktrace_routine_name(fctx->foreach->u.any, FALSE)); + } + +#undef dw + d.data = entry->data; d.len = entry->len; @@ -584,20 +644,31 @@ * We ignore the returned value because to-be-removed data (when traversing * for removal) will be marked as "removable": we can't delete them yet as * we are traversing the cache structure already. + * + * For values we're keeping, we increment the cached count: these are keys + * present in the cache but not in the underlying database because they + * have not been flushed yet. Knowing this count allows us to compute an + * accurate item count without flushing. */ if (fctx->removing) { - (void) (*fctx->u.cbr)(key, &d, fctx->foreach); + if ((*fctx->u.cbr)(key, &d, fctx->foreach)) { + fctx->removed++; /* Item removed in cache_free_removable() */ + entry->removable = TRUE; + } else { + fctx->cached++; + } } else { (*fctx->u.cb)(key, &d, fctx->foreach); + fctx->cached++; } } /** * Map iterator to free cached entries that have been marked as removable. */ -static gboolean -cache_free_removable(gpointer key, gpointer value, gpointer data) +static bool +cache_free_removable(void *key, void *value, void *data) { dbmw_t *dw = data; struct cached *entry = value; @@ -630,7 +701,7 @@ * Map iterator to flush dirty cached entries. */ static void -flush_dirty(gpointer key, gpointer value, gpointer data) +flush_dirty(void *key, void *value, void *data) { struct flush_context *ctx = data; struct cached *entry = value; @@ -667,7 +738,10 @@ dbmw_sync(dbmw_t *dw, int which) { ssize_t amount = 0; - gboolean error = FALSE; + size_t pages = 0, values = 0; + bool error = FALSE; + + dbmw_check(dw); if (which & DBMW_SYNC_CACHE) { struct flush_context ctx; @@ -677,19 +751,48 @@ ctx.deleted_only = booleanize(which & DBMW_DELETED_ONLY); ctx.amount = 0; + if (dbg_ds_debugging(dw->dbg, 6, DBG_DSF_CACHING)) { + dbg_ds_log(dw->dbg, dw, "%s: syncing cache%s", + G_STRFUNC, ctx.deleted_only ? " (deleted only)" : ""); + } + map_foreach(dw->values, flush_dirty, &ctx); - if (!ctx.error) + + if (!ctx.error && !ctx.deleted_only) dw->count_needs_sync = FALSE; + /* + * We can safely reset the amount of cached entries to 0, regardless + * of whether we only sync'ed deleted entries: that value is rather + * meaningless when ``count_needs_sync'' is TRUE anyway since we will + * come here first, and we'll then reset it to zero. + */ + + dw->cached = 0; /* No more dirty values */ + amount += ctx.amount; + values = ctx.amount; error = ctx.error; } if (which & DBMW_SYNC_MAP) { - ssize_t ret = dbmap_sync(dw->dm); - if (-1 == ret) + ssize_t ret; + + if (dbg_ds_debugging(dw->dbg, 6, DBG_DSF_CACHING)) + dbg_ds_log(dw->dbg, dw, "%s: syncing map", G_STRFUNC); + + ret = dbmap_sync(dw->dm); + if (-1 == ret) { error = TRUE; - else + } else { amount += ret; + pages = ret; + } + } + + if (dbg_ds_debugging(dw->dbg, 5, DBG_DSF_CACHING)) { + dbg_ds_log(dw->dbg, dw, "%s: %s (flushed %zu value%s, %zu page%s)", + G_STRFUNC, error ? "FAILED" : "OK", + values, plural(values), pages, plural(pages)); } return error ? -1 : amount; @@ -700,13 +803,32 @@ * * @return TRUE if successful (not implying that anything was actually shrunk). */ -gboolean +bool dbmw_shrink(dbmw_t *dw) { return dbmap_shrink(dw->dm); } /** + * Attempt to rebuild the DB on disk. + * + * @return TRUE if successful. + */ +bool +dbmw_rebuild(dbmw_t *dw) +{ + /* + * We're going to work at the SDBM level, so we need to flush the cache + * to make sure SDBM knows the latest database state: cached data pending + * writing need to be flushed, including deleted data. + */ + + dbmw_sync(dw, DBMW_SYNC_CACHE); + + return dbmap_rebuild(dw->dm); +} + +/** * Wrapper to the user-supplied deserialization routine for values. * * @param dw the DBM wrapper object @@ -716,8 +838,8 @@ * * @return TRUE if deserialization was OK. */ -static gboolean -dbmw_deserialize(const dbmw_t *dw, bstr_t *bs, gpointer valptr, size_t len) +static bool +dbmw_deserialize(const dbmw_t *dw, bstr_t *bs, void *valptr, size_t len) { (*dw->unpack)(bs, valptr, len); @@ -739,7 +861,7 @@ * Write data to disk immediately. */ static void -write_immediately(dbmw_t *dw, gconstpointer key, gpointer value, size_t length) +write_immediately(dbmw_t *dw, const void *key, void *value, size_t length) { struct cached tmp; @@ -770,7 +892,7 @@ * @param length length of the value */ void -dbmw_write_nocache(dbmw_t *dw, gconstpointer key, gpointer value, size_t length) +dbmw_write_nocache(dbmw_t *dw, const void *key, void *value, size_t length) { dbmw_check(dw); g_assert(key); @@ -778,8 +900,16 @@ g_assert(length || value == NULL); g_assert(length == 0 || value); - (void) remove_entry(dw, key, TRUE, FALSE); /* Discard any cached data */ + /* + * The data allocation model of DBMW allows one to issue a dbmw_read(), + * modify the actual value we got and immediately request a write of that + * same data. + * + * Therefore, we must remove the cached entry only after flushing its value. + */ + write_immediately(dw, key, value, length); + (void) remove_entry(dw, key, TRUE, FALSE); /* Discard any cached data */ } /** @@ -795,7 +925,7 @@ * @param length length of the value */ void -dbmw_write(dbmw_t *dw, gconstpointer key, gpointer value, size_t length) +dbmw_write(dbmw_t *dw, const void *key, void *value, size_t length) { struct cached *entry; @@ -809,17 +939,36 @@ entry = map_lookup(dw->values, key); if (entry) { + if (dbg_ds_debugging(dw->dbg, 2, DBG_DSF_CACHING | DBG_DSF_UPDATE)) { + dbg_ds_log(dw->dbg, dw, "%s: %s key=%s%s", + G_STRFUNC, entry->dirty ? "dirty" : "clean", + dbg_ds_keystr(dw->dbg, key, (size_t) -1), + entry->absent ? " (was absent)" : ""); + } + if (entry->dirty) dw->w_hits++; - else if (entry->absent) - dw->count_needs_sync = TRUE; /* Key exists now */ + if (entry->absent) + dw->cached++; /* Key exists now, in unflushed status */ fill_entry(dw, entry, value, length); hash_list_moveto_tail(dw->keys, key); + } else if (dw->max_cached > 1) { + if (dbg_ds_debugging(dw->dbg, 2, DBG_DSF_CACHING | DBG_DSF_UPDATE)) { + dbg_ds_log(dw->dbg, dw, "%s: deferring key=%s", + G_STRFUNC, dbg_ds_keystr(dw->dbg, key, (size_t) -1)); + } + entry = allocate_entry(dw, key, NULL); fill_entry(dw, entry, value, length); dw->count_needs_sync = TRUE; /* Does not know whether key exists */ - } else { + + } else { + if (dbg_ds_debugging(dw->dbg, 2, DBG_DSF_CACHING | DBG_DSF_UPDATE)) { + dbg_ds_log(dw->dbg, dw, "%s: writing key=%s", + G_STRFUNC, dbg_ds_keystr(dw->dbg, key, (size_t) -1)); + } + write_immediately(dw, key, value, length); } } @@ -840,8 +989,8 @@ * @return pointer to value, or NULL if it was either not found or the * deserialization failed. */ -G_GNUC_HOT gpointer -dbmw_read(dbmw_t *dw, gconstpointer key, size_t *lenptr) +void * G_HOT +dbmw_read(dbmw_t *dw, const void *key, size_t *lenptr) { struct cached *entry; dbmap_datum_t dval; @@ -853,6 +1002,13 @@ entry = map_lookup(dw->values, key); if (entry) { + if (dbg_ds_debugging(dw->dbg, 5, DBG_DSF_CACHING | DBG_DSF_ACCESS)) { + dbg_ds_log(dw->dbg, dw, "%s: read cache hit on %s key=%s%s", + G_STRFUNC, entry->dirty ? "dirty" : "clean", + dbg_ds_keystr(dw->dbg, key, (size_t) -1), + entry->absent ? " (absent)" : ""); + } + dw->r_hits++; if (lenptr) *lenptr = entry->len; @@ -869,7 +1025,8 @@ if (dbmap_has_ioerr(dw->dm)) { dw->ioerr = TRUE; dw->error = errno; - g_warning("DBMW \"%s\" I/O error whilst reading entry: %s", + s_warning_once_per(LOG_PERIOD_SECOND, + "DBMW \"%s\" I/O error whilst reading entry: %s", dw->name, dbmap_strerror(dw->dm)); return NULL; } else if (NULL == dval.data) @@ -896,9 +1053,8 @@ bstr_reset(dw->bs, dval.data, dval.len, BSTR_F_ERROR); if (!dbmw_deserialize(dw, dw->bs, entry->data, dw->value_size)) { - g_carp("DBMW \"%s\" deserialization error in %s(): %s", - dw->name, - stacktrace_routine_name(func_to_pointer(dw->unpack), FALSE), + s_critical("DBMW \"%s\" deserialization error in %s(): %s", + dw->name, stacktrace_function_name(dw->unpack), bstr_error(dw->bs)); /* Not calling value free routine on deserialization failures */ wfree(entry->data, dw->value_size); @@ -931,17 +1087,24 @@ (void) allocate_entry(dw, key, entry); + if (dbg_ds_debugging(dw->dbg, 4, DBG_DSF_CACHING)) { + dbg_ds_log(dw->dbg, dw, "%s: cached %s key=%s%s", + G_STRFUNC, entry->dirty ? "dirty" : "clean", + dbg_ds_keystr(dw->dbg, key, (size_t) -1), + entry->absent ? " (absent)" : ""); + } + return entry->data; } /** * Is key present in the database? */ -gboolean -dbmw_exists(dbmw_t *dw, gconstpointer key) +bool +dbmw_exists(dbmw_t *dw, const void *key) { struct cached *entry; - gboolean ret; + bool ret; dbmw_check(dw); g_assert(key); @@ -950,6 +1113,13 @@ entry = map_lookup(dw->values, key); if (entry) { + if (dbg_ds_debugging(dw->dbg, 5, DBG_DSF_CACHING | DBG_DSF_ACCESS)) { + dbg_ds_log(dw->dbg, dw, "%s: read cache hit on %s key=%s%s", + G_STRFUNC, entry->dirty ? "dirty" : "clean", + dbg_ds_keystr(dw->dbg, key, (size_t) -1), + entry->absent ? " (absent)" : ""); + } + dw->r_hits++; return !entry->absent; } @@ -960,7 +1130,7 @@ if (dbmap_has_ioerr(dw->dm)) { dw->ioerr = TRUE; dw->error = errno; - g_warning("DBMW \"%s\" I/O error whilst checking key existence: %s", + s_warning("DBMW \"%s\" I/O error whilst checking key existence: %s", dw->name, dbmap_strerror(dw->dm)); return FALSE; } @@ -982,6 +1152,12 @@ WALLOC0(entry); entry->absent = !ret; (void) allocate_entry(dw, key, entry); + + if (dbg_ds_debugging(dw->dbg, 2, DBG_DSF_CACHING)) { + dbg_ds_log(dw->dbg, dw, "%s: cached %s key=%s", + G_STRFUNC, entry->absent ? "absent" : "present", + dbg_ds_keystr(dw->dbg, key, (size_t) -1)); + } } return ret; @@ -991,7 +1167,7 @@ * Delete key from database. */ void -dbmw_delete(dbmw_t *dw, gconstpointer key) +dbmw_delete(dbmw_t *dw, const void *key) { struct cached *entry; @@ -1002,22 +1178,51 @@ entry = map_lookup(dw->values, key); if (entry) { + if (dbg_ds_debugging(dw->dbg, 2, DBG_DSF_CACHING | DBG_DSF_DELETE)) { + dbg_ds_log(dw->dbg, dw, "%s: %s key=%s%s", + G_STRFUNC, entry->dirty ? "dirty" : "clean", + dbg_ds_keystr(dw->dbg, key, (size_t) -1), + entry->absent ? " (was absent)" : ""); + } + if (entry->dirty) dw->w_hits++; if (!entry->absent) { - dw->count_needs_sync = TRUE; /* Deferred delete */ + /* + * Entry was present but is now deleted. + * + * If it was clean, then it was flushed to the database and we now + * know that there is one less entry in the database than there is + * physically present in the map. + * + * If it was dirty, then we do not know whether it exists in the + * database or not, and therefore we cannot adjust the amount + * of cached entries down. + */ + + if (entry->dirty) + dw->count_needs_sync = TRUE; /* Deferred delete */ + else + dw->cached--; /* One less entry in database */ + fill_entry(dw, entry, NULL, 0); entry->absent = TRUE; } hash_list_moveto_tail(dw->keys, key); + } else { + if (dbg_ds_debugging(dw->dbg, 2, DBG_DSF_DELETE)) { + dbg_ds_log(dw->dbg, dw, "%s: removing key=%s", + G_STRFUNC, dbg_ds_keystr(dw->dbg, key, (size_t) -1)); + } + dw->ioerr = FALSE; dbmap_remove(dw->dm, key); if (dbmap_has_ioerr(dw->dm)) { dw->ioerr = TRUE; dw->error = errno; - g_warning("DBMW \"%s\" I/O error whilst deleting key: %s", + s_warning("DBMW \"%s\" I/O error whilst deleting key: %s", dw->name, dbmap_strerror(dw->dm)); } @@ -1035,6 +1240,11 @@ WALLOC0(entry); entry->absent = TRUE; (void) allocate_entry(dw, key, entry); + + if (dbg_ds_debugging(dw->dbg, 2, DBG_DSF_CACHING)) { + dbg_ds_log(dw->dbg, dw, "%s: cached absent key=%s", + G_STRFUNC, dbg_ds_keystr(dw->dbg, key, (size_t) -1)); + } } } } @@ -1042,8 +1252,8 @@ /** * Map iterator to free cached entries. */ -static gboolean -free_cached(gpointer key, gpointer value, gpointer data) +static bool +free_cached(void *key, void *value, void *data) { dbmw_t *dw = data; struct cached *entry = value; @@ -1080,7 +1290,7 @@ * * @return TRUE if successful. */ -gboolean +bool dbmw_clear(dbmw_t *dw) { if (!dbmap_clear(dw->dm)) @@ -1089,6 +1299,7 @@ dbmw_clear_cache(dw); dw->ioerr = FALSE; dw->count_needs_sync = FALSE; + dw->cached = 0; return TRUE; } @@ -1097,19 +1308,31 @@ * Destroy the DBM wrapper, optionally closing the underlying DB map. */ void -dbmw_destroy(dbmw_t *dw, gboolean close_map) +dbmw_destroy(dbmw_t *dw, bool close_map) { dbmw_check(dw); - if (common_stats) - g_debug("DBMW destroying \"%s\" with %s back-end " + if (common_stats) { + s_debug("DBMW destroying \"%s\" with %s back-end " "(read cache hits = %.2f%% on %s request%s, " "write cache hits = %.2f%% on %s request%s)", dw->name, dbmw_map_type(dw) == DBMAP_SDBM ? "sdbm" : "map", dw->r_hits * 100.0 / MAX(1, dw->r_access), - uint64_to_string(dw->r_access), 1 == dw->r_access ? "" : "s", + uint64_to_string(dw->r_access), plural(dw->r_access), dw->w_hits * 100.0 / MAX(1, dw->w_access), - uint64_to_string2(dw->w_access), 1 == dw->w_access ? "" : "s"); + uint64_to_string2(dw->w_access), plural(dw->w_access)); + } + + if (dbg_ds_debugging(dw->dbg, 1, DBG_DSF_DESTROY)) { + dbg_ds_log(dw->dbg, dw, "%s: with %s back-end " + "(read cache hits = %.2f%% on %s request%s, " + "write cache hits = %.2f%% on %s request%s)", + G_STRFUNC, dbmw_map_type(dw) == DBMAP_SDBM ? "sdbm" : "map", + dw->r_hits * 100.0 / MAX(1, dw->r_access), + uint64_to_string(dw->r_access), plural(dw->r_access), + dw->w_hits * 100.0 / MAX(1, dw->w_access), + uint64_to_string2(dw->w_access), plural(dw->w_access)); + } /* * If we close the map and we're volatile, there's no need to flush @@ -1131,29 +1354,17 @@ if (close_map) dbmap_destroy(dw->dm); + WFREE_TYPE_NULL(dw->dbmap_dbg); dw->magic = 0; WFREE(dw); } /** - * Structure used as context by dbmw_foreach_*trampoline(). - */ -struct foreach_ctx { - union { - dbmw_cb_t cb; - dbmw_cbr_t cbr; - } u; - gpointer arg; - dbmw_t *dw; -}; - -/** * Common code for dbmw_foreach_trampoline() and * dbmw_foreach_remove_trampoline(). */ -static gboolean -dbmw_foreach_common(gboolean removing, - gpointer key, dbmap_datum_t *d, gpointer arg) +static bool +dbmw_foreach_common(bool removing, void *key, dbmap_datum_t *d, void *arg) { struct foreach_ctx *ctx = arg; dbmw_t *dw = ctx->dw; @@ -1178,14 +1389,22 @@ * - Should the cached key need to be deleted (as determined by * the user callback, we make sure we delete the entry in the * cache upon callback return). + * + * Because we sync the cache (the dirty deleted items only), we should + * normally never iterate on a deleted entry, coming from the + * underlying database, hence we loudly complain! */ entry->traversed = TRUE; /* Signal we iterated on cached value */ - if (entry->absent) + if (entry->absent) { + s_carp("%s(): DBMW \"%s\" iterating over a %s absent key in cache!", + G_STRFUNC, dw->name, entry->dirty ? "dirty" : "clean"); return TRUE; /* Key was already deleted, info cached */ + } + if (removing) { - gboolean status; + bool status; status = (*ctx->u.cbr)(key, entry->data, entry->len, ctx->arg); if (status) { entry->removable = TRUE; /* Discard it after traversal */ @@ -1196,8 +1415,8 @@ return FALSE; } } else { - gboolean status = FALSE; - gpointer data = d->data; + bool status = FALSE; + void *data = d->data; size_t len = d->len; /* @@ -1212,9 +1431,9 @@ bstr_reset(dw->bs, d->data, d->len, BSTR_F_ERROR); if (!dbmw_deserialize(dw, dw->bs, data, len)) { - g_carp("DBMW \"%s\" deserialization error in %s(): %s", + s_critical("DBMW \"%s\" deserialization error in %s(): %s", dw->name, - stacktrace_routine_name(func_to_pointer(dw->unpack), FALSE), + stacktrace_function_name(dw->unpack), bstr_error(dw->bs)); /* Not calling value free routine on deserialization failures */ wfree(data, len); @@ -1242,7 +1461,7 @@ * Trampoline to invoke the DB map iterator and do the proper casts. */ static void -dbmw_foreach_trampoline(gpointer key, dbmap_datum_t *d, gpointer arg) +dbmw_foreach_trampoline(void *key, dbmap_datum_t *d, void *arg) { dbmw_foreach_common(FALSE, key, d, arg); } @@ -1250,8 +1469,8 @@ /** * Trampoline to invoke the map iterator and do the proper casts. */ -static gboolean -dbmw_foreach_remove_trampoline(gpointer key, dbmap_datum_t *d, gpointer arg) +static bool +dbmw_foreach_remove_trampoline(void *key, dbmap_datum_t *d, void *arg) { return dbmw_foreach_common(TRUE, key, d, arg); } @@ -1260,13 +1479,19 @@ * Iterate over the DB, invoking the callback on each item along with the * supplied argument. */ -void dbmw_foreach(dbmw_t *dw, dbmw_cb_t cb, gpointer arg) +void +dbmw_foreach(dbmw_t *dw, dbmw_cb_t cb, void *arg) { struct foreach_ctx ctx; struct cache_foreach_ctx fctx; dbmw_check(dw); + if (dbg_ds_debugging(dw->dbg, 1, DBG_DSF_ITERATOR)) { + dbg_ds_log(dw->dbg, dw, "%s: starting with %s(%p)", G_STRFUNC, + stacktrace_function_name(cb), arg); + } + /* * Before iterating we flush the deleted keys we know about in the cache * and whose deletion was deferred, so that the underlying map will @@ -1295,26 +1520,48 @@ /* * Continue traversal with all the cached entries that were not traversed * already because they do not exist in the underlying map. + * + * We count these and remember how many there are so that we can determine + * the correct overall item count after an iteration without having to + * flush all the dirty values! */ - fctx.removing = FALSE; + ZERO(&fctx); fctx.foreach = &ctx; fctx.u.cb = dbmw_foreach_trampoline; map_foreach(dw->values, cache_finish_traversal, &fctx); + dw->cached = fctx.cached; + dw->count_needs_sync = FALSE; /* We just counted items the slow way! */ + + if (dbg_ds_debugging(dw->dbg, 1, DBG_DSF_ITERATOR)) { + dbg_ds_log(dw->dbg, dw, "%s: done with %s(%p)" + "has %zu unflushed entr%s in cache", G_STRFUNC, + stacktrace_function_name(cb), arg, + dw->cached, plural_y(dw->cached)); + } } /** * Iterate over the DB, invoking the callback on each item along with the * supplied argument and removing the item when the callback returns TRUE. + * + * @return the amount of removed entries. */ -void dbmw_foreach_remove(dbmw_t *dw, dbmw_cbr_t cbr, gpointer arg) +size_t +dbmw_foreach_remove(dbmw_t *dw, dbmw_cbr_t cbr, void *arg) { struct foreach_ctx ctx; struct cache_foreach_ctx fctx; + size_t pruned; dbmw_check(dw); + if (dbg_ds_debugging(dw->dbg, 1, DBG_DSF_ITERATOR)) { + dbg_ds_log(dw->dbg, dw, "%s: starting with %s(%p)", G_STRFUNC, + stacktrace_function_name(cbr), arg); + } + /* * Before iterating we flush the deleted keys we know about in the cache * and whose deletion was deferred, so that the underlying map will @@ -1338,8 +1585,9 @@ ctx.dw = dw; map_foreach(dw->values, cache_reset_before_traversal, NULL); - dbmap_foreach_remove(dw->dm, dbmw_foreach_remove_trampoline, &ctx); + pruned = dbmap_foreach_remove(dw->dm, dbmw_foreach_remove_trampoline, &ctx); + ZERO(&fctx); fctx.removing = TRUE; fctx.foreach = &ctx; fctx.u.cbr = dbmw_foreach_remove_trampoline; @@ -1348,6 +1596,10 @@ * Continue traversal with all the cached entries that were not traversed * already because they do not exist in the underlying map. * + * We count these and remember how many there are so that we can determine + * the correct overall item count after an iteration without having to + * flush all the dirty values! + * * Any cached entry that needs to be removed will be marked as such * and we'll complete processing by discarding from the cache all * the entries that have been marked as "removable" during the traversal. @@ -1355,13 +1607,27 @@ map_foreach(dw->values, cache_finish_traversal, &fctx); map_foreach_remove(dw->values, cache_free_removable, dw); + dw->cached = fctx.cached; + dw->count_needs_sync = FALSE; /* We just counted items the slow way! */ + + if (dbg_ds_debugging(dw->dbg, 1, DBG_DSF_ITERATOR)) { + dbg_ds_log(dw->dbg, dw, "%s: done with %s(%p): " + "pruned %zu from dbmap, %zu from cache (%zu total), " + "has %zu unflushed entr%s in cache", + G_STRFUNC, + stacktrace_function_name(cbr), arg, + pruned, fctx.removed, pruned + fctx.removed, + dw->cached, plural_y(dw->cached)); + } + + return pruned + fctx.removed; } /** * Snapshot all the keys, returning them into a singly linked list. * To free the returned keys, use the dbmw_free_all_keys() helper. */ -GSList * +pslist_t * dbmw_all_keys(dbmw_t *dw) { dbmw_check(dw); @@ -1374,7 +1640,7 @@ * Helper routine to free list and keys returned by dbmw_all_keys(). */ void -dbmw_free_all_keys(const dbmw_t *dw, GSList *keys) +dbmw_free_all_keys(const dbmw_t *dw, pslist_t *keys) { dbmw_check(dw); @@ -1391,8 +1657,8 @@ * * @return TRUE on success. */ -gboolean -dbmw_store(dbmw_t *dw, const char *base, gboolean inplace) +bool +dbmw_store(dbmw_t *dw, const char *base, bool inplace) { dbmw_check(dw); @@ -1406,7 +1672,7 @@ * * @return TRUE on success. */ -gboolean +bool dbmw_copy(dbmw_t *from, dbmw_t *to) { dbmw_check(from); @@ -1428,7 +1694,7 @@ * Set the map cache size, as an amount of 1 KiB pages. * @return TRUE on success. */ -gboolean +bool dbmw_set_map_cache(dbmw_t *dw, long pages) { dbmw_check(dw); @@ -1441,8 +1707,8 @@ * * @return TRUE on success. */ -gboolean -dbmw_set_volatile(dbmw_t *dw, gboolean is_volatile) +bool +dbmw_set_volatile(dbmw_t *dw, bool is_volatile) { dbmw_check(dw); @@ -1450,4 +1716,35 @@ return 0 == dbmap_set_volatile(dw->dm, is_volatile); } +/** + * Record debugging configuration. + */ +void +dbmw_set_debugging(dbmw_t *dw, const dbg_config_t *dbg) +{ + dbmw_check(dw); + + dw->dbg = dbg; + + if (dbg_ds_debugging(dw->dbg, 1, DBG_DSF_DEBUGGING)) { + dbg_ds_log(dw->dbg, dw, "%s: attached with %s back-end " + "(max cached = %zu, key=%zu bytes, value=%zu bytes, " + "%zu max serialized)", G_STRFUNC, + dbmw_map_type(dw) == DBMAP_SDBM ? "sdbm" : "map", + dw->max_cached, dw->key_size, dw->value_size, dw->value_data_size); + } + + /* + * Patch in place for the DBMAP. + */ + + WFREE_TYPE_NULL(dw->dbmap_dbg); + + dw->dbmap_dbg = WCOPY(dbg); + dw->dbmap_dbg->o2str = NULL; + dw->dbmap_dbg->type = "DBMAP"; + + dbmap_set_debugging(dw->dm, dw->dbmap_dbg); +} + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/dbmw.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/dbmw.h
Changed
@@ -48,7 +48,7 @@ * @param mb where the serialization will occur * @param data data to serialize */ -typedef void (*dbmw_serialize_t)(pmsg_t *mb, gconstpointer data); +typedef void (*dbmw_serialize_t)(pmsg_t *mb, const void *data); /** * Deserialization routine for values. @@ -59,7 +59,7 @@ * * It returns nothing: errors are diagnosed by looking at ``bs'' afterwards. */ -typedef void (*dbmw_deserialize_t)(bstr_t *bs, gpointer valptr, size_t len); +typedef void (*dbmw_deserialize_t)(bstr_t *bs, void *valptr, size_t len); /** * Free routine for values, to reclaim data allocated during deserialization @@ -69,7 +69,7 @@ * @param valptr where deserialization was done * @param len length of arena allocated for value, for assertions */ -typedef void (*dbmw_free_t)(gpointer valptr, size_t len); +typedef void (*dbmw_free_t)(void *valptr, size_t len); /** * DBMW "foreach" iterator callbacks. @@ -81,9 +81,8 @@ * * @return TRUE if key/value pair is to be removed (for the dbmw_cbr_t callbak). */ -typedef void (*dbmw_cb_t)(gpointer key, gpointer value, size_t len, gpointer u); -typedef gboolean (*dbmw_cbr_t)( - gpointer key, gpointer value, size_t len, gpointer u); +typedef void (*dbmw_cb_t)(void *key, void *value, size_t len, void *u); +typedef bool (*dbmw_cbr_t)(void *key, void *value, size_t len, void *u); /** * Flags for dbmw_sync(). @@ -92,36 +91,40 @@ #define DBMW_SYNC_MAP (1 << 1) /**< Sync DBMW underlying map */ #define DBMW_DELETED_ONLY (1 << 2) /**< Only sync deleted keys */ +struct dbg_config; + dbmw_t *dbmw_create(dbmap_t *dm, const char *name, size_t value_size, size_t value_data_size, dbmw_serialize_t pack, dbmw_deserialize_t unpack, dbmw_free_t valfree, - size_t cache_size, GHashFunc hash_func, GEqualFunc eq_func); -void dbmw_destroy(dbmw_t *dw, gboolean close_sdbm); + size_t cache_size, hash_fn_t hash_func, eq_fn_t eq_func); +void dbmw_destroy(dbmw_t *dw, bool close_sdbm); ssize_t dbmw_sync(dbmw_t *dw, int which); -void dbmw_write(dbmw_t *dw, gconstpointer key, gpointer value, size_t length); +void dbmw_write(dbmw_t *dw, const void *key, void *value, size_t length); void dbmw_write_nocache( - dbmw_t *dw, gconstpointer key, gpointer value, size_t length); -gpointer dbmw_read(dbmw_t *dw, gconstpointer key, size_t *lenptr); -gboolean dbmw_exists(dbmw_t *dw, gconstpointer key); -void dbmw_delete(dbmw_t *dw, gconstpointer key); + dbmw_t *dw, const void *key, void *value, size_t length); +void *dbmw_read(dbmw_t *dw, const void *key, size_t *lenptr); +bool dbmw_exists(dbmw_t *dw, const void *key); +void dbmw_delete(dbmw_t *dw, const void *key); enum dbmap_type dbmw_map_type(const dbmw_t *dw); size_t dbmw_count(dbmw_t *dw); -gboolean dbmw_has_ioerr(const dbmw_t *dw); +bool dbmw_has_ioerr(const dbmw_t *dw); const char *dbmw_name(const dbmw_t *dw); -gboolean dbmw_set_map_cache(dbmw_t *dw, long pages); -gboolean dbmw_set_volatile(dbmw_t *dw, gboolean is_volatile); -gboolean dbmw_shrink(dbmw_t *dw); -gboolean dbmw_clear(dbmw_t *dw); +bool dbmw_set_map_cache(dbmw_t *dw, long pages); +bool dbmw_set_volatile(dbmw_t *dw, bool is_volatile); +void dbmw_set_debugging(dbmw_t *dw, const struct dbg_config *dbg); +bool dbmw_shrink(dbmw_t *dw); +bool dbmw_rebuild(dbmw_t *dw); +bool dbmw_clear(dbmw_t *dw); const char *dbmw_strerror(const dbmw_t *dw); -GSList *dbmw_all_keys(dbmw_t *dw); -void dbmw_free_all_keys(const dbmw_t *dw, GSList *keys); +struct pslist *dbmw_all_keys(dbmw_t *dw); +void dbmw_free_all_keys(const dbmw_t *dw, struct pslist *keys); -void dbmw_foreach(dbmw_t *dw, dbmw_cb_t cb, gpointer arg); -void dbmw_foreach_remove(dbmw_t *dw, dbmw_cbr_t cbr, gpointer arg); +void dbmw_foreach(dbmw_t *dw, dbmw_cb_t cb, void *arg); +size_t dbmw_foreach_remove(dbmw_t *dw, dbmw_cbr_t cbr, void *arg); -gboolean dbmw_store(dbmw_t *dw, const char *base, gboolean inplace); -gboolean dbmw_copy(dbmw_t *from, dbmw_t *to); +bool dbmw_store(dbmw_t *dw, const char *base, bool inplace); +bool dbmw_copy(dbmw_t *from, dbmw_t *to); #endif /* _dbmw_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/dbstore.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/dbstore.c
Changed
@@ -46,7 +46,10 @@ #include "dbmw.h" #include "file.h" #include "halloc.h" +#include "log.h" #include "path.h" +#include "stringify.h" + #include "override.h" /* Must be the last header included */ static const mode_t STORAGE_FILE_MODE = S_IRUSR | S_IWUSR; /* 0600 */ @@ -83,8 +86,8 @@ static dbmw_t * dbstore_create_internal(const char *name, const char *dir, const char *base, int flags, dbstore_kv_t kv, dbstore_packing_t packing, - size_t cache_size, GHashFunc hash_func, GEqualFunc eq_func, - gboolean incore) + size_t cache_size, hash_fn_t hash_func, eq_fn_t eq_func, + bool incore) { dbmap_t *dm; dbmw_t *dw; @@ -108,7 +111,7 @@ if (dm != NULL) { dbmap_set_deferred_writes(dm, TRUE); } else { - g_warning("DBSTORE cannot open SDBM at %s for %s: %m", path, name); + s_warning("DBSTORE cannot open SDBM at %s for %s: %m", path, name); } HFREE_NULL(path); } else { @@ -154,8 +157,8 @@ dbmw_t * dbstore_create(const char *name, const char *dir, const char *base, dbstore_kv_t kv, dbstore_packing_t packing, - size_t cache_size, GHashFunc hash_func, GEqualFunc eq_func, - gboolean incore) + size_t cache_size, hash_fn_t hash_func, eq_fn_t eq_func, + bool incore) { dbmw_t *dw; @@ -189,8 +192,8 @@ dbmw_t * dbstore_open(const char *name, const char *dir, const char *base, dbstore_kv_t kv, dbstore_packing_t packing, - size_t cache_size, GHashFunc hash_func, GEqualFunc eq_func, - gboolean incore) + size_t cache_size, hash_fn_t hash_func, eq_fn_t eq_func, + bool incore) { dbmw_t *dw; @@ -200,7 +203,7 @@ if (dw != NULL && dbstore_debug > 0) { size_t count = dbmw_count(dw); g_debug("DBSTORE opened DBMW \"%s\" (%u key%s) from %s", - dbmw_name(dw), (unsigned) count, 1 == count ? "" : "s", base); + dbmw_name(dw), (unsigned) count, plural(count), base); } /* @@ -214,7 +217,7 @@ if (dbstore_debug > 0) { g_debug("DBSTORE loading DBMW \"%s\" (%u key%s) from %s", - dbmw_name(dw), (unsigned) count, 1 == count ? "" : "s", base); + dbmw_name(dw), (unsigned) count, plural(count), base); } dram = dbstore_create_internal(name, NULL, NULL, 0, @@ -222,7 +225,7 @@ if (!dbmw_copy(dw, dram)) { g_warning("DBSTORE could not load DBMW \"%s\" (%u key%s) from %s", - dbmw_name(dw), (unsigned) count, 1 == count ? "" : "s", base); + dbmw_name(dw), (unsigned) count, plural(count), base); } dbmw_destroy(dw, TRUE); @@ -246,7 +249,7 @@ dbmw_name(dw)); } else if (n && dbstore_debug > 1) { g_debug("DBSTORE flushed %u SDBM page%s in DBMW \"%s\"", - (unsigned) n, 1 == n ? "" : "s", dbmw_name(dw)); + (unsigned) n, plural(n), dbmw_name(dw)); } } @@ -264,7 +267,7 @@ dbmw_name(dw)); } else if (n && dbstore_debug > 1) { g_debug("DBSTORE flushed %u dirty value%s in DBMW \"%s\"", - (unsigned) n, 1 == n ? "" : "s", dbmw_name(dw)); + (unsigned) n, plural(n), dbmw_name(dw)); } } @@ -286,7 +289,7 @@ void dbstore_close(dbmw_t *dw, const char *dir, const char *base) { - gboolean ok; + bool ok; char *path; if (NULL == dw) @@ -304,7 +307,7 @@ size_t count = dbmw_count(dw); g_debug("DBSTORE %ssucessfully persisted DBMW \"%s\" (%u key%s)", ok ? "" : "un", dbmw_name(dw), - (unsigned) count, 1 == count ? "" : "s"); + (unsigned) count, plural(count)); } dbmw_destroy(dw, TRUE); @@ -321,10 +324,14 @@ } /** - * Attempt to clear / shrink the DBMW database. + * Attempt to clear / rebuild the DBMW database. + * + * The aim is to reduce the disk size of the database since it can grow very + * large after many insertions and deletions, with most pages being empty or + * holding only a few keys. */ void -dbstore_shrink(dbmw_t *dw) +dbstore_compact(dbmw_t *dw) { /* * If we retained no entries, issue a dbmw_clear() to restore underlying @@ -342,16 +349,20 @@ if (dbstore_debug) { g_warning("DBSTORE unable to clear DBMW \"%s\"", dbmw_name(dw)); } + } else if (dbstore_debug) { + g_debug("DBSTORE database DBMW \"%s\" cleared", dbmw_name(dw)); } } else { if (dbstore_debug > 1) { - g_debug("DBSTORE shrinking database DBMW \"%s\"", dbmw_name(dw)); + g_debug("DBSTORE rebuilding database DBMW \"%s\"", dbmw_name(dw)); } - if (!dbmw_shrink(dw)) { + if (!dbmw_rebuild(dw)) { if (dbstore_debug) { - g_warning("DBSTORE unable to shrink DBMW \"%s\"", + g_warning("DBSTORE unable to rebuild DBMW \"%s\"", dbmw_name(dw)); } + } else if (dbstore_debug) { + g_debug("DBSTORE database DBMW \"%s\" rebuilt", dbmw_name(dw)); } } } @@ -359,12 +370,12 @@ static void dbstore_move_file(const char *old_path, const char *new_path, const char *ext) { - char *old_file = h_strconcat(old_path, ext, (void *) 0); - char *new_file = h_strconcat(new_path, ext, (void *) 0); + char *old_file = h_strconcat(old_path, ext, NULL_PTR); + char *new_file = h_strconcat(new_path, ext, NULL_PTR); if (file_exists(old_file)) { if (-1 == rename(old_file, new_file)) { - g_warning("could not rename \"%s\" as \"%s\": %m", + s_carp("could not rename \"%s\" as \"%s\": %m", old_file, new_file); } } @@ -397,4 +408,38 @@ HFREE_NULL(new_path); } +static void +dbstore_unlink_file(const char *path, const char *ext) +{ + char *file = h_strconcat(path, ext, NULL_PTR); + + if (file_exists(file)) { + if (-1 == unlink(file)) { + s_carp("could not unlink \"%s\": %m", file); + } + } + + HFREE_NULL(file); +} + +/** + * Remove SDBM files from "dir". + * + * @param dir the directory where SDBM files are stored + * @param base the base name of SDBM files + */ +void +dbstore_unlink(const char *dir, const char *base) +{ + char *path; + + path = make_pathname(dir, base); + + dbstore_unlink_file(path, DBM_DIRFEXT); + dbstore_unlink_file(path, DBM_PAGFEXT); + dbstore_unlink_file(path, DBM_DATFEXT); + + HFREE_NULL(path); +} + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/dbstore.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/dbstore.h
Changed
@@ -71,21 +71,22 @@ dbmw_t *dbstore_create(const char *name, const char *dir, const char *base, dbstore_kv_t kv, dbstore_packing_t packing, - size_t cache_size, GHashFunc hash_func, GEqualFunc eq_func, - gboolean incore); + size_t cache_size, hash_fn_t hash_func, eq_fn_t eq_func, + bool incore); dbmw_t *dbstore_open(const char *name, const char *dir, const char *base, dbstore_kv_t kv, dbstore_packing_t packing, - size_t cache_size, GHashFunc hash_func, GEqualFunc eq_func, - gboolean incore); + size_t cache_size, hash_fn_t hash_func, eq_fn_t eq_func, + bool incore); void dbstore_sync(dbmw_t *dw); void dbstore_flush(dbmw_t *dw); void dbstore_sync_flush(dbmw_t *dw); void dbstore_close(dbmw_t *dw, const char *dir, const char *base); void dbstore_delete(dbmw_t *dw); -void dbstore_shrink(dbmw_t *dw); +void dbstore_compact(dbmw_t *dw); void dbstore_move(const char *src, const char *dst, const char *base); +void dbstore_unlink(const char *dir, const char *base); #endif /* _dbstore_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/dbus_util.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/dbus_util.c
Changed
@@ -39,8 +39,10 @@ #include "common.h" #include "dbus_util.h" -#include "misc.h" /* For str_chomp() */ + #include "halloc.h" /* For h_strdup() */ +#include "log.h" +#include "misc.h" /* For str_chomp() */ #include "override.h" /* Must be last header included */ @@ -60,23 +62,25 @@ /** * Initialize the bus connection. */ -G_GNUC_COLD void -dbus_util_init(void) +void G_COLD +dbus_util_init(bool disabled) { DBusError error; + if (disabled) + return; /* Leaving the `bus' variable to NULL */ + dbus_error_init(&error); bus = dbus_bus_get(DBUS_BUS_SESSION, &error); if (NULL == bus) { char *msg = h_strdup(error.message); strchomp(msg, 0); - g_message("could not open connection to DBus bus: %s", msg); + s_warning("could not open connection to DBus bus: %s", msg); hfree(msg); dbus_error_free(&error); } else { - - g_message("D-BUS set up and ready for use."); + s_message("D-BUS set up and ready for use."); /** @todo Include a timestamp or some other useful info */ dbus_util_send_message(DBS_EVT, "started"); } @@ -99,7 +103,6 @@ */ } - /** * Send a message on the bus. * @param signal_name The name of the dbus signal to use @@ -121,7 +124,7 @@ message = dbus_message_new_signal(DBUS_PATH, DBUS_INTERFACE, signal_name); if (NULL == message) { - g_message("could not create D-BUS message!"); + s_message("could not create D-BUS message!"); } else { /* Add the message to the Events signal */ @@ -132,7 +135,7 @@ dbus_connection_send(bus, message, NULL); #if 0 - g_message("Sent D-BUS signal '%s': %s", signal_name, text); + s_message("Sent D-BUS signal '%s': %s", signal_name, text); #endif /* Free the message */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/dbus_util.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/dbus_util.h
Changed
@@ -47,13 +47,13 @@ #ifdef HAS_DBUS -void dbus_util_init(void); +void dbus_util_init(bool disabled); void dbus_util_close(void); void dbus_util_send_message(const char *, const char *); #else /* !HAS_DBUS */ -#define dbus_util_init() G_STMT_START { } G_STMT_END +#define dbus_util_init(d) G_STMT_START { (void) (d); } G_STMT_END #define dbus_util_close() G_STMT_START { } G_STMT_END #define dbus_util_send_message(signal, txt) \ G_STMT_START { (void) (signal); (void) (txt); } G_STMT_END
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/debug.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/debug.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Raphael Manfredi + * Copyright (c) 2008, 2012 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,22 +28,27 @@ * Debug level configuration for library files. * * @author Raphael Manfredi - * @date 2008 + * @date 2008, 2012 */ #include "common.h" #include "debug.h" + +#include "buf.h" +#include "misc.h" +#include "stringify.h" + #include "override.h" /* Must be the last header included */ -guint32 common_dbg = 0; /**< Common debug level for library files */ -guint32 common_stats = 0; /**< Common log level for library statistics */ +uint32 common_dbg = 0; /**< Common debug level for library files */ +uint32 common_stats = 0; /**< Common log level for library statistics */ /** * Set the debug level for library files. */ void -set_library_debug(guint32 level) +set_library_debug(uint32 level) { common_dbg = level; } @@ -52,9 +57,147 @@ * Set the log level for library runtime statistics. */ void -set_library_stats(guint32 level) +set_library_stats(uint32 level) { common_stats = level; } +/** + * Stringify the object name of a data structure. + * + * @param dc the debug config + * @param o the object being debugged + * + * @return pointer to (possibly static) name. + */ +const char * +dbg_ds_name(const dbg_config_t *dc, const void *o) +{ + if (NULL == dc->o2str) { + buf_t *b = buf_private(G_STRFUNC, POINTER_BUFLEN); + buf_printf(b, "%p", o); + return buf_data(b); + } else { + return (*dc->o2str)(o); + } +} + +/** + * Stringify the keys in a data structure. + * + * @param dc the debug config + * @param key the key to stringify + * @param len size of key (-1 if unknown) + * + * @return pointer to (possibly static) stringified key. + */ +const char * +dbg_ds_keystr(const dbg_config_t *dc, const void *key, size_t len) +{ + buf_t *b = buf_private(G_STRFUNC, + POINTER_BUFLEN + SIZE_T_DEC_BUFLEN + CONST_STRLEN("<key@,len=>")); + + if (NULL == key) + return "<null key>"; + + if ((size_t) -1 == len) { + if (NULL == dc->k2str) { + buf_printf(b, "<key@%p>", key); + return buf_data(b); + } else { + return (*dc->k2str)(key); + } + } else { + if (NULL == dc->klen2str) { + if (NULL == dc->k2str) { + buf_printf(b, "<key@%p,len=%zu>", key, len); + return buf_data(b); + } else { + return (*dc->k2str)(key); + } + } else { + return (*dc->klen2str)(key, len); + } + } +} + +/** + * Stringify the values in a data structure. + * + * @param dc the debug config + * @param value the value to stringify + * @param len size of value (-1 if unknown) + * + * @return pointer to (possibly static) stringified value. + */ +const char * +dbg_ds_valstr(const dbg_config_t *dc, const void *value, size_t len) +{ + buf_t *b = buf_private(G_STRFUNC, + POINTER_BUFLEN + SIZE_T_DEC_BUFLEN + CONST_STRLEN("<value@,len=>")); + + if (NULL == value) + return "<null value>"; + + if ((size_t) -1 == len) { + if (NULL == dc->v2str) { + buf_printf(b, "<value@%p>", value); + return buf_data(b); + } else { + return (*dc->v2str)(value); + } + } else { + if (NULL == dc->vlen2str) { + if (NULL == dc->v2str) { + buf_printf(b, "<value@%p,len=%zu>", value, len); + return buf_data(b); + } else { + return (*dc->v2str)(value); + } + } else { + return (*dc->vlen2str)(value, len); + } + } +} + +/** + * Logging wrapper for debugged data structures. + * + * @param dc the debug config + * @param o the debugged object + * @param fmt formatting string + * @param args points to additional format arguments + */ +void +dbg_ds_logv(const dbg_config_t *dc, const void *o, + const char *fmt, va_list args) +{ + buf_t *b = buf_private(G_STRFUNC, 512); + const char *str = buf_data(b); + size_t len; + + len = buf_vprintf(b, fmt, args); + g_debug("%s%s \"%s\" %s%s", + dc->prefix, dc->type, dbg_ds_name(dc, o), str, + len == buf_size(b) - 1 ? "...more..." : ""); +} + +/** + * Logging wrapper for debugged data structures. + * + * @param dc the debug config + * @param o the debugged object + * @param fmt formatting string + * @param ... additional format arguments + */ +void +dbg_ds_log(const dbg_config_t *dc, const void *o, const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + dbg_ds_logv(dc, o, fmt, args); + va_end(args); +} + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/debug.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/debug.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Raphael Manfredi + * Copyright (c) 2008, 2012 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,7 +28,7 @@ * Debug level configuration for library files. * * @author Raphael Manfredi - * @date 2008 + * @date 2008, 2012 */ #ifndef _debug_h_ @@ -36,11 +36,101 @@ #include "common.h" -extern guint32 common_dbg; /**< Debug level for library files */ -extern guint32 common_stats; /**< Log level for library statistics */ +extern uint32 common_dbg; /**< Debug level for library files */ +extern uint32 common_stats; /**< Log level for library statistics */ -void set_library_debug(guint32 level); -void set_library_stats(guint32 level); +void set_library_debug(uint32 level); +void set_library_stats(uint32 level); + +/* + * Data structure debugging. + */ + +/** + * Generic debugging configuration for data structures, which can be + * statically initialized to debug a particular instance of a data structure. + * + * This is suitable for lists, trees, hash tables, etc... + * + * The data structure can use dbg_ds_log() calls to log debugging information, + * conditionally guarded by dbg_ds_debugging() checks. The latter call + * compares the specified level and flags to the ones held in the structure to + * determine whether one should actually perform logging. + * + * The logging routine automatically adds the prefix string, followed by + * the type of data structure and a stringified representation of the object + * being debugged. + * + * Data structures willing to be dynamically debuggable with this mechanism + * should reserve an attribute in their structure (and a procedure to set + * the variable from the outside): + * + * const dbg_config_t *dbg; + * + * If NULL, then no debugging will occur, i.e. dbg_ds_debugging() will + * never return TRUE. + * + * Although the attribute is declared "const" (i.e. the data structure is + * not going to need to modify this object), the user may alter the value of + * the level and flags dynamically, to adjust debugging levels and areas. + * + * All the stringification routines can be NULL, and a suitable generic + * stringification will be used. The prefix and type must not be NULL but + * can be set to the empty string. + * + * The length-aware stringification routine is called when the length of + * the key/value is known. See dbg_ds_keystr() and dbg_ds_valstr(), which + * are the entry points to generate to stringified keys and values in the + * log messages. + */ +typedef struct dbg_config { + const char *prefix; /**< Debugging prefix to use */ + const char *type; /**< Type of data structure */ + unsigned level; /**< Debugging level */ + unsigned flags; /**< Debugging flags */ + stringify_fn_t o2str; /**< Stringification for object debugged */ + stringify_fn_t k2str; /**< Stringification for keys */ + stringify_len_fn_t klen2str;/**< Alternate stringification for keys */ + stringify_fn_t v2str; /**< Stringification for values */ + stringify_len_fn_t vlen2str;/**< Alternate stringification for values */ +} dbg_config_t; + +/** + * Debugging flags for dbg_config, to select particular areas of the code. + * (DSF = Data Structure Flags) + * + * Those are completely general and their usage depends on the data structure, + * although of course the named categories should be used to segregate logs. + */ +#define DBG_DSF_INSERT (1U << 0) /**< Insertions */ +#define DBG_DSF_UPDATE (1U << 1) /**< Updates */ +#define DBG_DSF_DELETE (1U << 2) /**< Deletions */ +#define DBG_DSF_ACCESS (1U << 3) /**< Accesses */ +#define DBG_DSF_CACHING (1U << 4) /**< Caching */ +#define DBG_DSF_STATS (1U << 5) /**< Statistics */ +#define DBG_DSF_CONFIG (1U << 6) /**< Configuration */ +#define DBG_DSF_DEBUGGING (1U << 7) /**< Debug plugging */ +#define DBG_DSF_DESTROY (1U << 8) /**< Destruction of data structure */ +#define DBG_DSF_ITERATOR (1U << 9) /**< Iterators */ +#define DBG_DSF_USR1 (1U << 10) /**< User-specific flag #1 */ +#define DBG_DSF_USR2 (1U << 11) /**< User-specific flag #2 */ +#define DBG_DSF_USR3 (1U << 12) /**< User-specific flag #3 */ +#define DBG_DSF_LOG1 (1U << 13) /**< Data-structure specific flag #1 */ +#define DBG_DSF_LOG2 (1U << 14) /**< Data-structure specific flag #2 */ +#define DBG_DSF_LOG3 (1U << 15) /**< Data-structure specific flag #3 */ + +#define DBG_DSF_ALL 0xffffffff /**< All 32 debugging flags */ + +#define dbg_ds_debugging(dc, lvl, mask) \ + G_UNLIKELY((dc) != NULL && (dc)->level >= (lvl) && (dc)->flags & (mask)) + +const char *dbg_ds_name(const dbg_config_t *dc, const void *o); +const char *dbg_ds_keystr(const dbg_config_t *dc, const void *key, size_t len); +const char *dbg_ds_valstr(const dbg_config_t *dc, const void *val, size_t len); +void dbg_ds_log(const dbg_config_t *dc, const void *o, + const char *fmt, ...) G_PRINTF(3, 4); +void dbg_ds_logv(const dbg_config_t *dc, const void *o, + const char *fmt, va_list args); #endif /* _debug_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/dl_util.c
Added
@@ -0,0 +1,251 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Dynamic linker library wrapper functions. + * + * This interface is a wrapping API on top of the dl library which allows + * to conveniently perform operations without necessarily knowing whether + * the dl library is there and supports the operation. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#ifdef I_DLFCN +#define _GNU_SOURCE /* Needed on linux to get dladdr() and Dl_info */ +#include <dlfcn.h> +#endif + +#include "dl_util.h" +#include "signal.h" +#include "thread.h" /* For THREAD_MAX */ + +#include "override.h" /* Must be the last header included */ + +static bool dl_util_inited; + +enum dl_addr_op { + DL_ADDR_GET_BASE, + DL_ADDR_GET_NAME, + DL_ADDR_GET_PATH, + DL_ADDR_GET_START +}; + +/** + * Initialize dynamic linker operations. + */ +static void +dl_util_init(void) +{ + if (!dl_util_inited) { + /* Nothing yet */ + dl_util_inited = TRUE; + } +} + +/** + * Terminate dynamic linker operations, for now. + */ +void +dl_util_done(void) +{ + if (dl_util_inited) { + /* Nothing yet */ + dl_util_inited = FALSE; + } +} + +static sigjmp_buf dl_util_envTHREAD_MAX; + +/** + * Invoked when a fatal signal is received during dladdr(). + */ +static void G_COLD +dl_util_got_signal(int signo) +{ + int stid = thread_small_id(); + + (void) signo; + + siglongjmp(dl_util_envstid, signo); +} + +/** + * Perform specify operation on the address. + * + * @param addr the address we're querying + * @param op the operation to perform + * + * @return NULL on failure, an address whose interpretation is op-specific + * otherwise. + */ +static const void * +dl_util_query(const void *addr, enum dl_addr_op op) +{ + if G_UNLIKELY(!dl_util_inited) + dl_util_init(); + +#ifdef HAS_DLADDR + { + static Dl_info info; + static const void *last_addr; + int stid = thread_small_id(); + + /* + * Cache results for a given address. This will help our stack + * pretty-printing code which is going to gather the various + * items at different times instead of doing one dladdr() call. + * For a given stack item, we may therefore face various calls + * for the same address. + * + * The rationale is that we may want to use different routines on + * another platform without dladdr() some days and therefore we wish + * to hide the existence of dladdr() and rather provide higher-level + * services like dl_util_get_base(). + */ + + if (addr != last_addr) { + signal_handler_t old_sigsegv; + int ret; + + ZERO(&info); + + /* + * Protect against segmentation faults in dladdr(). + * + * We use signal_catch() instead of signal_set() because we + * don't need extra information about the fault context. + */ + + old_sigsegv = signal_catch(SIGSEGV, dl_util_got_signal); + + if (Sigsetjmp(dl_util_envstid, TRUE)) { + last_addr = NULL; + return NULL; + } + + ret = dladdr(deconstify_pointer(addr), &info); + signal_set(SIGSEGV, old_sigsegv); + + if (0 == ret) { + last_addr = NULL; + return NULL; + } + last_addr = addr; + } + + switch (op) { + case DL_ADDR_GET_BASE: + return info.dli_fbase; + case DL_ADDR_GET_NAME: + return info.dli_sname; + case DL_ADDR_GET_PATH: + return info.dli_fname; + case DL_ADDR_GET_START: + return info.dli_saddr; + } + } + + g_assert_not_reached(); +#else /* !HAS_DLADDR */ + (void) addr; + (void) op; + + return NULL; +#endif /* HAS_DLADDR */ +} + +/** + * Fetch the base address of the shared object containing the address. + * + * @param addr the address we're querying + * + * @return the base address at which the shared object is loaded, NULL if + * not found. + */ +const void * +dl_util_get_base(const void *addr) +{ + return dl_util_query(addr, DL_ADDR_GET_BASE); +} + +/** + * Fetch the pathname of the shared object that contains the address. + * + * @param addr the address we're querying + * + * @return the path name, NULL if not found. + */ +const char * +dl_util_get_path(const void *addr) +{ + const char *path; + + path = dl_util_query(addr, DL_ADDR_GET_PATH); + + if (path != NULL && '\0' == path0) + return NULL; + + return path; +} + +/** + * Fetch the symbolic name of the address. + * + * @param addr the address we're querying + * + * @return the symbol name, NULL if not found or unknown. + */ +const char * +dl_util_get_name(const void *addr) +{ + const char *name; + + name = dl_util_query(addr, DL_ADDR_GET_NAME); + + if (name != NULL && '\0' == name0) + return NULL; + + return name; +} + +/** + * Fetch the routine starting address. + * + * @param addr the address we're querying + * + * @return the starting address, NULL if not found or unknown. + */ +const void * +dl_util_get_start(const void *addr) +{ + return dl_util_query(addr, DL_ADDR_GET_START); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/dl_util.h
Added
@@ -0,0 +1,50 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Dynamic linker library wrapper functions. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _dl_util_h_ +#define _dl_util_h_ + +/* + * Public interface. + */ + +void dl_util_done(void); +const void *dl_util_get_base(const void *addr); +const char *dl_util_get_path(const void *addr); +const char *dl_util_get_name(const void *addr); +const void *dl_util_get_start(const void *addr); + +#endif /* _dl_util_h_ */ + +/* vi: set ts=4 sw=4 cindent: */ +
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/dualhash.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/dualhash.c
Changed
@@ -37,7 +37,10 @@ #include "common.h" #include "dualhash.h" -#include "glib-missing.h" + +#include "hashing.h" +#include "htable.h" +#include "mutex.h" #include "walloc.h" #include "override.h" /* Must be the last header included */ @@ -49,10 +52,11 @@ */ struct dualhash { enum dualhash_magic magic; - GHashTable *kht; /**< Hash table from the keys viewpoint */ - GHashTable *vht; /**< Hash table from the values viewpoint */ - GEqualFunc key_eq_func; - GEqualFunc val_eq_func; + htable_t *kht; /**< Hash table from the keys' viewpoint */ + htable_t *vht; /**< Hash table from the values' viewpoint */ + eq_fn_t key_eq_func; + eq_fn_t val_eq_func; + mutex_t *lock; /**< Thread-safe lock (optional) */ }; static inline void @@ -64,28 +68,49 @@ g_assert(dh->vht != NULL); } +#define dualhash_synchronize(d) G_STMT_START { \ + if G_UNLIKELY((d)->lock != NULL) \ + mutex_lock((d)->lock); \ +} G_STMT_END + +#define dualhash_unsynchronize(d) G_STMT_START { \ + if G_UNLIKELY((d)->lock != NULL) \ + mutex_unlock((d)->lock); \ +} G_STMT_END + /** * Create a new dual hash table. * - * @param key_hash_func the hash function for keys - * @param keys_eq_func the key comparison function - * @param val_hash_func the hash function for values - * @param val_eq_func the value comparison function + * If a NULL hash function is provided, pointer_hash() will be used. + * If a NULL equality is provided, '==' will be used to compare items. + * + * @param khash the hash function for keys + * @param keq the key comparison function + * @param vhash the hash function for values + * @param veq the value comparison function * * @return the new dual hash table. */ dualhash_t * -dualhash_new(GHashFunc key_hash_func, GEqualFunc key_eq_func, - GHashFunc val_hash_func, GEqualFunc val_eq_func) +dualhash_new(hash_fn_t khash, eq_fn_t keq, hash_fn_t vhash, eq_fn_t veq) { dualhash_t *dh; - WALLOC(dh); + WALLOC0(dh); dh->magic = DUALHASH_MAGIC; - dh->kht = g_hash_table_new(key_hash_func, key_eq_func); - dh->vht = g_hash_table_new(val_hash_func, val_eq_func); - dh->key_eq_func = key_eq_func; - dh->val_eq_func = val_eq_func; + + if (NULL == khash || pointer_hash == khash) + dh->kht = htable_create_any(pointer_hash, pointer_hash2, keq); + else + dh->kht = htable_create_any(khash, NULL, keq); + + if (NULL == vhash || pointer_hash == vhash) + dh->vht = htable_create_any(pointer_hash, pointer_hash2, veq); + else + dh->vht = htable_create_any(vhash, NULL, veq); + + dh->key_eq_func = keq; + dh->val_eq_func = veq; return dh; } @@ -98,8 +123,16 @@ { dualhash_check(dh); - gm_hash_table_destroy_null(&dh->kht); - gm_hash_table_destroy_null(&dh->vht); + dualhash_synchronize(dh); + + htable_free_null(&dh->kht); + htable_free_null(&dh->vht); + + if (dh->lock != NULL) { + mutex_destroy(dh->lock); /* Releases lock */ + WFREE(dh->lock); + } + dh->magic = 0; WFREE(dh); } @@ -119,6 +152,50 @@ } /** + * Mark dualhash thread-safe. + */ +void +dualhash_thread_safe(dualhash_t *dh) +{ + dualhash_check(dh); + g_assert(NULL == dh->lock); + + WALLOC0(dh->lock); + mutex_init(dh->lock); +} + +/** + * Lock dualhash. + * + * The hash must have been marked thread-safe already. + */ +void +dualhash_lock(dualhash_t *dh) +{ + dualhash_check(dh); + g_assert_log(dh->lock != NULL, + "%s(): dualhash %p not marked thread-safe", G_STRFUNC, dh); + + mutex_lock(dh->lock); +} + +/** + * Unlock dualhash. + * + * The hash must have been marked thread-safe already and locked by the + * calling thread. + */ +void +dualhash_unlock(dualhash_t *dh) +{ + dualhash_check(dh); + g_assert_log(dh->lock != NULL, + "%s(): dualhash %p not marked thread-safe", G_STRFUNC, dh); + + mutex_unlock(dh->lock); +} + +/** * Insert a key/value pair in the table. */ void @@ -128,25 +205,31 @@ void *held_value; dualhash_check(dh); - g_assert(g_hash_table_size(dh->kht) == g_hash_table_size(dh->vht)); - if (g_hash_table_lookup_extended(dh->kht, key, NULL, &held_value)) { + dualhash_synchronize(dh); + + g_assert(htable_count(dh->kht) == htable_count(dh->vht)); + + if (htable_lookup_extended(dh->kht, key, NULL, &held_value)) { if ((*dh->val_eq_func)(held_value, value)) { - return; /* Key/value tuple already present in the table */ + goto done; /* Key/value tuple already present in the table */ } else { - g_hash_table_remove(dh->vht, held_value); + htable_remove(dh->vht, held_value); } } - if (g_hash_table_lookup_extended(dh->vht, value, NULL, &held_key)) { + if (htable_lookup_extended(dh->vht, value, NULL, &held_key)) { /* Keys cannot be equal, or we'd have the key/value tuple already */ g_assert(!(*dh->key_eq_func)(held_key, key)); - g_hash_table_remove(dh->kht, held_key); + htable_remove(dh->kht, held_key); } - gm_hash_table_replace_const(dh->kht, key, value); - gm_hash_table_replace_const(dh->vht, value, key); + htable_insert_const(dh->kht, key, value); + htable_insert_const(dh->vht, value, key); + + g_assert(htable_count(dh->kht) == htable_count(dh->vht)); - g_assert(g_hash_table_size(dh->kht) == g_hash_table_size(dh->vht)); +done: + dualhash_unsynchronize(dh); } /** @@ -165,22 +248,27 @@ * * @return TRUE if the key was found and removed. */ -gboolean +bool dualhash_remove_key(dualhash_t *dh, const void *key) { void *held_value; - gboolean existed = FALSE; + bool existed = FALSE; dualhash_check(dh); - g_assert(g_hash_table_size(dh->kht) == g_hash_table_size(dh->vht)); - if (g_hash_table_lookup_extended(dh->kht, key, NULL, &held_value)) { - g_hash_table_remove(dh->kht, key); - g_hash_table_remove(dh->vht, held_value); + dualhash_synchronize(dh); + + g_assert(htable_count(dh->kht) == htable_count(dh->vht)); + + if (htable_lookup_extended(dh->kht, key, NULL, &held_value)) { + htable_remove(dh->kht, key); + htable_remove(dh->vht, held_value); existed = TRUE; } - g_assert(g_hash_table_size(dh->kht) == g_hash_table_size(dh->vht)); + g_assert(htable_count(dh->kht) == htable_count(dh->vht)); + + dualhash_unsynchronize(dh); return existed; } @@ -190,22 +278,27 @@ * * @return TRUE if the value was found and removed. */ -gboolean +bool dualhash_remove_value(dualhash_t *dh, const void *value) { void *held_key; - gboolean existed = FALSE; + bool existed = FALSE; dualhash_check(dh); - g_assert(g_hash_table_size(dh->kht) == g_hash_table_size(dh->vht)); - if (g_hash_table_lookup_extended(dh->vht, value, NULL, &held_key)) { - g_hash_table_remove(dh->vht, value); - g_hash_table_remove(dh->kht, held_key); + dualhash_synchronize(dh); + + g_assert(htable_count(dh->kht) == htable_count(dh->vht)); + + if (htable_lookup_extended(dh->vht, value, NULL, &held_key)) { + htable_remove(dh->vht, value); + htable_remove(dh->kht, held_key); existed = TRUE; } - g_assert(g_hash_table_size(dh->kht) == g_hash_table_size(dh->vht)); + g_assert(htable_count(dh->kht) == htable_count(dh->vht)); + + dualhash_unsynchronize(dh); return existed; } @@ -213,23 +306,35 @@ /** * Check whether a key is contained in the table. */ -gboolean +bool dualhash_contains_key(const dualhash_t *dh, const void *key) { + bool res; + dualhash_check(dh); - return gm_hash_table_contains(dh->kht, key); + dualhash_synchronize(dh); + res = htable_contains(dh->kht, key); + dualhash_unsynchronize(dh); + + return res; } /** * Check whether a value is contained in the table. */ -gboolean +bool dualhash_contains_value(const dualhash_t *dh, const void *value) { + bool res; + dualhash_check(dh); - return gm_hash_table_contains(dh->vht, value); + dualhash_synchronize(dh); + res = htable_contains(dh->vht, value); + dualhash_unsynchronize(dh); + + return res; } /** @@ -238,9 +343,15 @@ void * dualhash_lookup_key(const dualhash_t *dh, const void *key) { + void *res; + dualhash_check(dh); - return g_hash_table_lookup(dh->kht, key); + dualhash_synchronize(dh); + res = htable_lookup(dh->kht, key); + dualhash_unsynchronize(dh); + + return res; } /** @@ -249,33 +360,51 @@ void * dualhash_lookup_value(const dualhash_t *dh, const void *value) { + void *res; + dualhash_check(dh); - return g_hash_table_lookup(dh->vht, value); + dualhash_synchronize(dh); + res = htable_lookup(dh->vht, value); + dualhash_unsynchronize(dh); + + return res; } /** * Extended lookup of a key in the table, returning both key/value pointers. */ -gboolean +bool dualhash_lookup_key_extended(const dualhash_t *dh, const void *key, - void *okey, void *oval) + void **okey, void **oval) { + bool res; + dualhash_check(dh); - return g_hash_table_lookup_extended(dh->kht, key, okey, oval); + dualhash_synchronize(dh); + res = htable_lookup_extended(dh->kht, key, (const void **) okey, oval); + dualhash_unsynchronize(dh); + + return res; } /** * Extended lookup of a value in the table, returning both key/value pointers. */ -gboolean +bool dualhash_lookup_value_extended(const dualhash_t *dh, const void *value, - void *okey, void *oval) + void **okey, void **oval) { + bool res; + dualhash_check(dh); - return g_hash_table_lookup_extended(dh->vht, value, oval, okey); + dualhash_synchronize(dh); + res = htable_lookup_extended(dh->vht, value, (const void **) oval, okey); + dualhash_unsynchronize(dh); + + return res; } /** @@ -288,11 +417,30 @@ dualhash_check(dh); - count = g_hash_table_size(dh->kht); + dualhash_synchronize(dh); + + count = htable_count(dh->kht); + g_assert(htable_count(dh->vht) == count); - g_assert(g_hash_table_size(dh->vht) == count); + dualhash_unsynchronize(dh); return count; } +/** + * Iterate over the held items in table, traversing (key, value) tuples. + */ +void +dualhash_foreach(const dualhash_t *dh, ckeyval_fn_t fn, void *data) +{ + dualhash_check(dh); + + dualhash_synchronize(dh); + + g_assert(htable_count(dh->vht) == htable_count(dh->kht)); + htable_foreach(dh->kht, fn, data); + + dualhash_unsynchronize(dh); +} + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/dualhash.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/dualhash.h
Changed
@@ -36,7 +36,6 @@ #define _dualhash_h_ #include "common.h" -#include "glib-missing.h" struct dualhash; typedef struct dualhash dualhash_t; @@ -45,24 +44,29 @@ * Public interface. */ -dualhash_t *dualhash_new(GHashFunc key_hash_func, GEqualFunc key_eq_func, - GHashFunc val_hash_func, GEqualFunc val_eq_func); +dualhash_t *dualhash_new(hash_fn_t kh, eq_fn_t keq, hash_fn_t vh, eq_fn_t veq); void dualhash_destroy(dualhash_t *dh); void dualhash_destroy_null(dualhash_t **dh_ptr); void dualhash_insert_key(dualhash_t *dh, const void *key, const void *value); void dualhash_insert_value(dualhash_t *dh, const void *value, const void *key); -gboolean dualhash_remove_key(dualhash_t *dh, const void *key); -gboolean dualhash_remove_value(dualhash_t *dh, const void *value); -gboolean dualhash_contains_key(const dualhash_t *dh, const void *key); -gboolean dualhash_contains_value(const dualhash_t *dh, const void *val); +bool dualhash_remove_key(dualhash_t *dh, const void *key); +bool dualhash_remove_value(dualhash_t *dh, const void *value); +bool dualhash_contains_key(const dualhash_t *dh, const void *key); +bool dualhash_contains_value(const dualhash_t *dh, const void *val); void *dualhash_lookup_key(const dualhash_t *dh, const void *key); void *dualhash_lookup_value(const dualhash_t *dh, const void *value); -gboolean dualhash_lookup_key_extended(const dualhash_t *dh, const void *key, - void *okey, void *oval); -gboolean dualhash_lookup_value_extended(const dualhash_t *dh, const void *value, - void *okey, void *oval); +bool dualhash_lookup_key_extended(const dualhash_t *dh, const void *key, + void **okey, void **oval); +bool dualhash_lookup_value_extended(const dualhash_t *dh, const void *value, + void **okey, void **oval); size_t dualhash_count(const dualhash_t *dh); +void dualhash_thread_safe(dualhash_t *dh); +void dualhash_lock(dualhash_t *dh); +void dualhash_unlock(dualhash_t *dh); + +void dualhash_foreach(const dualhash_t *dh, ckeyval_fn_t fn, void *data); + #endif /* _dualhash_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/dump_options.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/dump_options.h
Changed
@@ -35,6 +35,7 @@ #define _dump_options_h_ #define DUMP_OPT_PRETTY (1U << 0) /**< Pretty-print option */ +#define DUMP_OPT_SHORT (1U << 1) /**< Give a short output */ #endif /* _dump_options_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/eclist.h
Added
@@ -0,0 +1,275 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Embedded "circular" lists. + * + * This provides the illusion that a list (one-way or two-way) is actually a + * circular list that can be traversed from a given starting point, not + * necessarily the head of the list. + * + * Once the iteration starts, it will loop around and will stop after it has + * iterated over all the items present in the underlying list, as determined + * by the list count at the time the iteration starts. + * + * One can iterate forward on one-way or two-way lists, and backwards only + * on two-way lists. + * + * Here is a sample pattern that can be used to iterate on a one-way list + * starting from a given item in the list as if it were the head of the + * circular list: + * + * eslist_t list; + * eclist_t clist; + * slink_t *sl; + * void *item; + * + * eclist_init(&clist, &list, item); + * ... + * for (sl = eclist_first(&clist); sl; sl = eclist_next(&clist, sl)) { + * void *data = eclist_data(&clist, sl); + * .... + * } + * + * The iteration stops when the amount of traversed items reaches the item + * count in the list, which means direction cannot be changed once chosen. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _eclist_h_ +#define _eclist_h_ + +#include "elist.h" +#include "eslist.h" + +enum eclist_magic { ECLIST_MAGIC = 0x0f6c4428 }; + +enum eclist_direction { + ECLIST_UNKNOWN = 0, + ECLIST_FORWARD, + ECLIST_BACKWARD +}; + +typedef struct eclist { + enum eclist_magic magic; + enum eclist_direction dir; + int list_magic; /* Union discriminent */ + union { + elist_t *l; + eslist_t *sl; + } u; + size_t count; /* Amount of items to iterate over */ + size_t iterated; /* Amount of items we traversed already */ + size_t offset; /* Offset of embedded link in the item */ + const void *start; /* Initial item to start with */ +} eclist_t; + +static inline void +eclist_check(const struct eclist * const cl) +{ + g_assert(cl != NULL); + g_assert(ECLIST_MAGIC == cl->magic); +} + +/** + * Initialize "circular" iteration over a list from a given item. + * + * @param cl the circular list we're initializing + * @param list the physical list where items are chained + * @param item the starting point in the circular list we create + */ +static inline void +eclist_init(eclist_t *cl, void *list, const void *item) +{ + struct { int magic; } *head = list; /* Relies on magic at the start */ + + g_assert(cl != NULL); + g_assert(item != NULL); + g_assert(list != NULL); + + ZERO(cl); + cl->magic = ECLIST_MAGIC; + cl->list_magic = head->magic; + cl->start = item; + + switch (head->magic) { + case ELIST_MAGIC: + { + elist_t *l = list; + cl->u.l = l; + cl->offset = l->offset; + } + break; + case ESLIST_MAGIC: + { + eslist_t *sl = list; + cl->u.sl = sl; + cl->offset = sl->offset; + } + break; + default: + g_error("%s(): unknown list type %d in list %p", + G_STRFUNC, head->magic, list); + } +} + +/** + * @return the data associated with the curernt link, NULL if none. + */ +static inline void * +eclist_data(const eclist_t *cl, const void * const lk) +{ + eclist_check(cl); + + return NULL == lk ? NULL : + deconstify_pointer(const_ptr_add_offset(lk, -cl->offset)); +} + +/** + * Starts iteration on the pseudo-circular list. + * + * @return the first link in the "circular" list, NULL if list is empty. + */ +static inline void * +eclist_first(eclist_t *cl) +{ + eclist_check(cl); + + cl->iterated = 0; + cl->dir = ECLIST_UNKNOWN; + + switch (cl->list_magic) { + case ELIST_MAGIC: + cl->count = cl->u.l->count; + break; + case ESLIST_MAGIC: + cl->count = cl->u.sl->count; + break; + default: + g_error("%s(): unknown list type %d", G_STRFUNC, cl->list_magic); + } + + return NULL == cl->start ? NULL : + deconstify_pointer(const_ptr_add_offset(cl->start, cl->offset)); +} + +/** + * @return next link in the "circular" list, NULL if none. + */ +static inline void * +eclist_next(eclist_t *cl, const void * const lk) +{ + void *next; + + eclist_check(cl); + + if G_UNLIKELY(cl->count == cl->iterated) + return NULL; + + if G_UNLIKELY(ECLIST_UNKNOWN == cl->dir) + cl->dir = ECLIST_FORWARD; + + g_assert(ECLIST_FORWARD == cl->dir); /* No change in direction */ + + cl->iterated++; + + switch (cl->list_magic) { + case ELIST_MAGIC: + { + elist_t *l = cl->u.l; + next = elist_next(lk); + if (NULL == next) + next = elist_first(l); + } + break; + case ESLIST_MAGIC: + { + eslist_t *sl = cl->u.sl; + next = eslist_next(lk); + if (NULL == next) + next = eslist_first(sl); + } + break; + default: + g_assert_not_reached(); + } + + return next; +} + +/** + * @return previous link in the "circular" list, NULL if none. + */ +static inline void * +eclist_prev(eclist_t *cl, const void * const lk) +{ + void *prev; + + eclist_check(cl); + + if G_UNLIKELY(cl->count == cl->iterated) + return NULL; + + if G_UNLIKELY(ECLIST_UNKNOWN == cl->dir) + cl->dir = ECLIST_BACKWARD; + + g_assert(ECLIST_BACKWARD == cl->dir); /* No change in direction */ + + cl->iterated++; + + switch (cl->list_magic) { + case ELIST_MAGIC: + { + elist_t *l = cl->u.l; + prev = elist_prev(lk); + if (NULL == prev) + prev = elist_last(l); + } + break; + case ESLIST_MAGIC: + g_error("%s(): backward iteration not possible with one-way list", + G_STRFUNC); + default: + g_assert_not_reached(); + } + + return prev; +} + +/** + * This is in line with other E*LIST_FOREACH() iterators. + * + * An earlier eclist_init() needs to define the starting point in the + * pseudo-circular list. + */ +#define ECLIST_FOREACH(list, l) \ + for ((l) = eclist_first(list); (l) != NULL; (l) = eclist_next((list), (l))) + +#endif /* _eclist_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/elist.c
Added
@@ -0,0 +1,1269 @@ +/* + * Copyright (c) 2012-2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Embedded two-way list (within another data structure). + * + * Embedded lists are created when the linking pointers are directly + * held within the data structure, as opposed to glib's lists which are + * containers pointing at objects. + * + * Embedded lists are intrusive in the sense that the objects have an explicit + * link_t field, but this saves one pointer per item being linked compared + * to glib's lists. On the other hand, if an object may belong to several lists + * based on certain criteria, but not all of the lists (and without any mutual + * exclusion), then the embedded list approach is not necessarily saving space + * since some items will have link_t fields that do not get used. + * + * Due to the nature of the data structure, the definition of the internal + * structures is visible in the header file but users must refrain from + * peeking and poking into the structures. Using embedded data structures + * requires more discipline than opaque data structures. + * + * The API of embedded lists mirrors that of glib's lists to make a smooth + * transition possible and maintain some consistency in the code. That said, + * the glib list API is quite good so mirroring it is not a problem. + * + * @author Raphael Manfredi + * @date 2012-2013 + */ + +#include "common.h" + +#include "elist.h" + +#include "eslist.h" +#include "random.h" +#include "shuffle.h" +#include "unsigned.h" +#include "walloc.h" +#include "xmalloc.h" + +#include "override.h" /* Must be the last header included */ + +#if 0 +#define ELIST_SAFETY_ASSERT /**< Turn on costly integrity assertions */ +#endif + +#ifdef ELIST_SAFETY_ASSERT +#define safety_assert(x) g_assert(x) +#else +#define safety_assert(x) +#endif + +/** + * Initialize embedded list. + * + * Assuming items in the list are defined as: + * + * struct item { + * <data fields> + * link_t lk; + * }; + * + * then the last argument can be given as: + * + * offsetof(struct item, lk) + * + * to indicate the place of the node field within the item. + * + * @param list the list structure to initialize + * @param offset the offset of the embedded link field within items + */ +void +elist_init(elist_t *list, size_t offset) +{ + g_assert(list != NULL); + g_assert(size_is_non_negative(offset)); + + list->magic = ELIST_MAGIC; + list->head = NULL; + list->tail = NULL; + list->count = 0; + list->offset = offset; +} + +/** + * Discard list, making the list object invalid. + * + * This does not free any of the items, it just discards the list descriptor. + * The underlying items remain chained though, so retaining a pointer to one + * of the link_t of one item still allows limited link-level traversal. + */ +void +elist_discard(elist_t *list) +{ + elist_check(list); + + list->magic = 0; +} + +/** + * Clear list, forgetting about all the items + * + * This does not free or unlink any of the items, it just empties the list + * descriptor. + */ +void +elist_clear(elist_t *list) +{ + elist_check(list); + + list->head = list->tail = NULL; + list->count = 0; +} + +/** + * Free all items in the list, using wfree() on each of them, clearing the list. + * + * Each item must be of the same size and have been allocated via walloc(). + * Each item must have been cleared first, so that any internal memory allocated + * and referenced by the item has been properly released. + * + * This is more efficient that looping over all the items, clearing them and + * then calling wfree() on them because we amortize the wfree() cost over a + * large amount of objects and need to lock/unlock once only, if any lock is + * to be taken. + * + * @param list the list to free + * @param size the size of each item, passed to wfree() + */ +void +elist_wfree(elist_t *list, size_t size) +{ + eslist_t slist; + + elist_check(list); + + if G_UNLIKELY(0 == list->count) + return; + + /* + * We're creating an eslist_t out of the elist_t. + * + * This works because we know wfree_eslist() will only follow the next + * pointer and the offset of the next pointer is identical in the + * link_t and slink_t structures, and the embedded list knows the offset + * where the link is stored within each item. + */ + + STATIC_ASSERT(offsetof(slink_t, next) == offsetof(link_t, next)); + + eslist_init(&slist, list->offset); + slist.head = (slink_t *) list->head; + slist.tail = (slink_t *) list->tail; /* Not needed, but be correct */ + slist.count = list->count; /* Needed for assertions */ + + wfree_eslist(&slist, size); + elist_clear(list); +} + +static inline void +elist_link_append_internal(elist_t *list, link_t *lk) +{ + if G_UNLIKELY(NULL == list->tail) { + g_assert(NULL == list->head); + g_assert(0 == list->count); + list->head = list->tail = lk; + lk->next = lk->prev = NULL; + } else { + g_assert(NULL == list->tail->next); + g_assert(NULL != list->head); /* Since list not empty */ + g_assert(size_is_positive(list->count)); + list->tail->next = lk; + lk->prev = list->tail; + lk->next = NULL; + list->tail = lk; + } + + list->count++; + + safety_assert(elist_length(list->head) == list->count); +} + +/** + * Append new link to the list. + * + * This is efficient and does not require a full traversal of the list. + */ +void +elist_link_append(elist_t *list, link_t *lk) +{ + elist_check(list); + g_assert(lk != NULL); + + elist_link_append_internal(list, lk); +} + +/** + * Append new item with embedded link to the list. + * + * This is efficient and does not require a full traversal of the list. + */ +void +elist_append(elist_t *list, void *data) +{ + link_t *lk; + + elist_check(list); + g_assert(data != NULL); + + lk = ptr_add_offset(data, list->offset); + elist_link_append_internal(list, lk); +} + +static inline void +elist_link_prepend_internal(elist_t *list, link_t *lk) +{ + if G_UNLIKELY(NULL == list->head) { + g_assert(NULL == list->tail); + g_assert(0 == list->count); + list->head = list->tail = lk; + lk->next = lk->prev = NULL; + } else { + g_assert(NULL == list->head->prev); + g_assert(NULL != list->tail); /* Since list not empty */ + g_assert(size_is_positive(list->count)); + list->head->prev = lk; + lk->next = list->head; + lk->prev = NULL; + list->head = lk; + } + + list->count++; + + safety_assert(elist_length(list->head) == list->count); +} + +/** + * Prepend link to the list. + */ +void +elist_link_prepend(elist_t *list, link_t *lk) +{ + elist_check(list); + g_assert(lk != NULL); + + elist_link_prepend_internal(list, lk); +} + +/** + * Prepend new item with embedded link to the list. + */ +void +elist_prepend(elist_t *list, void *data) +{ + link_t *lk; + + elist_check(list); + g_assert(data != NULL); + + lk = ptr_add_offset(data, list->offset); + elist_link_prepend_internal(list, lk); +} + +/** + * Prepend other list to the list. + * + * The other list descriptor is cleared, since its items are transferred + * to the first list. + * + * The two lists must be compatible, that is the offset to the link pointer + * must be identical. + * + * @param list the destination list + * @param other the other list to prepend (descriptor will be cleared) + */ +void +elist_prepend_list(elist_t *list, elist_t *other) +{ + elist_check(list); + elist_check(other); + g_assert(list->offset == other->offset); + + if G_UNLIKELY(0 == other->count) + return; + + if G_UNLIKELY(NULL == list->head) { + g_assert(NULL == list->tail); + g_assert(0 == list->count); + list->tail = other->tail; + list->count = other->count; + } else { + g_assert(NULL != other->tail); /* Since list not empty */ + g_assert(NULL == other->tail->next); + g_assert(NULL == list->head->prev); + g_assert(size_is_positive(list->count)); + other->tail->next = list->head; + list->head->prev = other->tail; + list->count += other->count; + } + + list->head = other->head; + elist_clear(other); + + safety_assert(elist_length(list->head) == list->count); +} + +/** + * Append other list to the list. + * + * The other list descriptor is cleared, since its items are transferred + * to the first list. + * + * The two lists must be compatible, that is the offset to the link pointer + * must be identical. + * + * @param list the destination list + * @param other the other list to append (descriptor will be cleared) + */ +void +elist_append_list(elist_t *list, elist_t *other) +{ + elist_check(list); + elist_check(other); + g_assert(list->offset == other->offset); + + if G_UNLIKELY(0 == other->count) + return; + + if G_UNLIKELY(NULL == list->tail) { + g_assert(NULL == list->head); + g_assert(0 == list->count); + list->head = other->head; + list->count = other->count; + } else { + g_assert(NULL == list->tail->next); + g_assert(NULL != other->head); /* Since list not empty */ + g_assert(NULL == other->head->prev); + g_assert(size_is_positive(list->count)); + list->tail->next = other->head; + other->head->prev = list->tail; + list->count += other->count; + } + + list->tail = other->tail; + elist_clear(other); + + safety_assert(elist_length(list->head) == list->count); +} + +static inline void +elist_link_remove_internal(elist_t *list, link_t *lk, bool safe) +{ + g_assert(size_is_positive(list->count)); + elist_invariant(list); + + if G_UNLIKELY(list->head == lk) + list->head = lk->next; + + if G_UNLIKELY(list->tail == lk) + list->tail = lk->prev; + + if (lk->prev != NULL) { + g_assert(!safe || lk->prev->next == lk); + lk->prev->next = lk->next; + } + if (lk->next != NULL) { + g_assert(!safe || lk->next->prev == lk); + lk->next->prev = lk->prev; + } + + lk->next = lk->prev = NULL; + list->count--; + + safety_assert(elist_invariant(list)); + safety_assert(elist_length(list->head) == list->count); +} + +/** + * Remove link from list. + * + * The link must be part of that list. + */ +void +elist_link_remove(elist_t *list, link_t *lk) +{ + elist_check(list); + g_assert(lk != NULL); + + elist_link_remove_internal(list, lk, TRUE); +} + +/** + * Remove item with embedded link from list. + * + * The item must be part of that list. + */ +void +elist_remove(elist_t *list, void *data) +{ + link_t *lk; + + elist_check(list); + g_assert(data != NULL); + safety_assert(elist_contains(list, data)); + + lk = ptr_add_offset(data, list->offset); + + /* + * Low-cost version of elist_contains(): since we're removing an item, + * it has to be part of some list, hence either "prev" is not NULL or + * the item is the head of the list. Same reasonning for "next". + */ + + g_assert(lk->prev != NULL || list->head == lk); + g_assert(lk->next != NULL || list->tail == lk); + + elist_link_remove_internal(list, lk, TRUE); +} + +static void +elist_link_insert_before_internal(elist_t *list, link_t *siblk, link_t *lk) +{ + g_assert(size_is_positive(list->count)); + elist_invariant(list); + + if G_UNLIKELY(list->head == siblk) + list->head = lk; + + if (siblk->prev != NULL) + siblk->prev->next = lk; + + lk->prev = siblk->prev; + lk->next = siblk; + siblk->prev = lk; + + list->count++; + safety_assert(elist_invariant(list)); + safety_assert(elist_length(list->head) == list->count); +} + +/** + * Insert link before another one in list. + * + * The sibling must already be part of the list, the new link must not. + * If the sibling is NULL, insertion is made at the tail of the list. + */ +void +elist_link_insert_before(elist_t *list, link_t *sibling_lk, link_t *lk) +{ + elist_check(list); + g_assert(lk != NULL); + + if (NULL == sibling_lk) + elist_link_append_internal(list, lk); + else + elist_link_insert_before_internal(list, sibling_lk, lk); +} + +/** + * Insert item before another one in list. + * + * The sibling item must already be part of the list, the data item must not. + * If the sibling is NULL, insertion is made at the tail of the list. + */ +void +elist_insert_before(elist_t *list, void *sibling, void *data) +{ + link_t *lk; + + elist_check(list); + g_assert(data != NULL); + + lk = ptr_add_offset(data, list->offset); + if (NULL == sibling) { + elist_link_append_internal(list, lk); + } else { + link_t *siblk = ptr_add_offset(sibling, list->offset); + elist_link_insert_before_internal(list, siblk, lk); + } +} + +static void +elist_link_insert_after_internal(elist_t *list, link_t *siblk, link_t *lk) +{ + g_assert(size_is_positive(list->count)); + elist_invariant(list); + + if G_UNLIKELY(list->tail == siblk) + list->tail = lk; + + if (siblk->next != NULL) + siblk->next->prev = lk; + + lk->next = siblk->next; + lk->prev = siblk; + siblk->next = lk; + + list->count++; + safety_assert(elist_invariant(list)); + safety_assert(elist_length(list->head) == list->count); +} + +/** + * Insert link after another one in list. + * + * The sibling must already be part of the list, the new link must not. + * If the sibling is NULL, insertion happens at the head of the list. + */ +void +elist_link_insert_after(elist_t *list, link_t *sibling_lk, link_t *lk) +{ + elist_check(list); + g_assert(lk != NULL); + + if (NULL == sibling_lk) + elist_link_prepend_internal(list, lk); + else + elist_link_insert_after_internal(list, sibling_lk, lk); +} + +/** + * Insert item after another one in list. + * + * The sibling item must already be part of the list, the data item must not. + * If the sibling is NULL, insertion happens at the head of the list. + */ +void +elist_insert_after(elist_t *list, void *sibling, void *data) +{ + link_t *lk; + + elist_check(list); + g_assert(data != NULL); + + lk = ptr_add_offset(data, list->offset); + if (NULL == sibling) { + elist_link_prepend_internal(list, lk); + } else { + link_t *siblk = ptr_add_offset(sibling, list->offset); + elist_link_insert_after_internal(list, siblk, lk); + } +} + +static inline void +elist_link_replace_internal(elist_t *list, link_t *old, link_t *new, bool valid) +{ + elist_invariant(list); + + if G_UNLIKELY(list->head == old) + list->head = new; + + if G_UNLIKELY(list->tail == old) + list->tail = new; + + if (valid) { + if (old->prev != NULL) + old->prev->next = new; + if (old->next != NULL) + old->next->prev = new; + } + + safety_assert(elist_invariant(list)); + safety_assert(elist_length(list->head) == list->count); +} + +/** + * Replace a link in the list with another link not already in the list. + */ +void +elist_link_replace(elist_t *list, link_t *old, link_t *new) +{ + elist_check(list); + g_assert(old != NULL); + g_assert(new != NULL); + + if G_UNLIKELY(old == new) + return; + + elist_link_replace_internal(list, old, new, TRUE); + + *new = *old; + old->next = old->prev = NULL; +} + +/** + * Replace an item in the list with another item not already in the list. + * + * The old item is no longer part of the list after the switching and + * can be safely freed. + */ +void +elist_replace(elist_t *list, void *old, void *new) +{ + link_t *ol, *nl; + + elist_check(list); + g_assert(old != NULL); + g_assert(new != NULL); + + if G_UNLIKELY(old == new) + return; + + ol = ptr_add_offset(old, list->offset); + nl = ptr_add_offset(new, list->offset); + + elist_link_replace_internal(list, ol, nl, TRUE); + + *nl = *ol; + ol->next = ol->prev = NULL; +} + +/** + * Reverse list. + */ +void +elist_reverse(elist_t *list) +{ + link_t *lk, *next;; + + elist_check(list); + + for (lk = list->head; lk != NULL; lk = next) { + /* Swap next and prev */ + next = lk->next; + lk->next = lk->prev; + lk->prev = next; + } + + /* Swap head and tail */ + lk = list->head; + list->head = list->tail; + list->tail = lk; + + safety_assert(elist_length(list->head) == list->count); +} + +/** + * Find item in list, using supplied comparison callback to compare list + * items with the key we're looking for. + * + * The key is usually a "dummy" structure with enough fields set to allow + * comparisons to be made. + * + * @param list the list + * @param key key item to locate + * @param cmp comparison function to use + * + * @return the found item, or NULL if not found. + */ +void * +elist_find(const elist_t *list, const void *key, cmp_fn_t cmp) +{ + link_t *lk; + + elist_check(list); + g_assert(key != NULL); + g_assert(cmp != NULL); + + for (lk = list->head; lk != NULL; lk = lk->next) { + void *data = ptr_add_offset(lk, -list->offset); + if (0 == (*cmp)(data, key)) + return data; + } + + return NULL; +} + +/** + * Iterate over the list, invoking the callback for every data item. + * + * It is safe for the callback to destroy the item, however this corrupts + * the list which must therefore be discarded upon return. + * + * @param list the list + * @param cb function to invoke on all items + * @param data opaque user-data to pass to callback + */ +void +elist_foreach(const elist_t *list, data_fn_t cb, void *data) +{ + link_t *lk, *next; + + elist_check(list); + elist_invariant(list); + g_return_unless(cb != NULL); + safety_assert(elist_length(list->head) == list->count); + + for (lk = list->head; lk != NULL; lk = next) { + void *item = ptr_add_offset(lk, -list->offset); + next = lk->next; /* Allow callback to destroy item */ + (*cb)(item, data); + } + + safety_assert(elist_invariant(list)); + safety_assert(elist_length(list->head) == list->count); +} + +/** + * Iterate over the list, invoking the callback for every data item + * and removing the current item if it returns TRUE. + * + * @param list the list + * @param cbr function to invoke to determine whether to remove item + * @param data opaque user-data to pass to callback + * + * @return amount of removed items from the list. + */ +size_t +elist_foreach_remove(elist_t *list, data_rm_fn_t cbr, void *data) +{ + link_t *lk, *next; + size_t removed = 0; + + elist_check(list); + elist_invariant(list); + g_return_val_unless(cbr != NULL, 0); + safety_assert(elist_length(list->head) == list->count); + + for (lk = list->head; lk != NULL; lk = next) { + void *item = ptr_add_offset(lk, -list->offset); + link_t itemlk; + + /* + * The callback can free the item, so we must copy the link first. + * The remove operation can then use that copied link. + */ + + next = lk->next; + itemlk = *lk; /* Struct copy */ + + if ((*cbr)(item, data)) { + /* Tweak the list to replace possibly gone ``lk'' */ + elist_link_replace_internal(list, lk, &itemlk, FALSE); + elist_link_remove_internal(list, &itemlk, FALSE); + removed++; + } + } + + safety_assert(elist_invariant(list)); + safety_assert(elist_length(list->head) == list->count); + + return removed; +} + +/** + * Run the merge sort algorithm of the sublist, merging back into list. + * + * @return the head of the list + */ +static link_t * G_HOT +elist_merge_sort(elist_t *list, link_t *sublist, size_t count, + cmp_data_fn_t cmp, void *data) +{ + link_t *l1, *l2, *l, *prev; + size_t n1, i; + link_t head; + + if (count <= 1) { + g_assert(0 != count || NULL == sublist); + g_assert(0 == count || NULL == sublist->next); + + return sublist; /* Trivially sorted */ + } + + /* + * Divide and conquer: split the list into two, sort each part then + * merge the two sorted sublists. + */ + + n1 = count / 2; + + for (i = 1, l1 = sublist; i < n1; l1 = l1->next, i++) + /* empty */; + + l2 = l1->next; /* Start of second list */ + l1->next = NULL; /* End of first list with ``n1'' items */ + + l1 = elist_merge_sort(list, sublist, n1, cmp, data); + l2 = elist_merge_sort(list, l2, count - n1, cmp, data); + + /* + * We now have two sorted (one-way) lists: ``l1'' and ``l2''. + * Merge them into `list', taking care of updating its tail, since + * we return the head. + */ + + l = &head; + prev = NULL; + + while (l1 != NULL && l2 != NULL) { + void *d1 = ptr_add_offset(l1, -list->offset); + void *d2 = ptr_add_offset(l2, -list->offset); + int c = (*cmp)(d1, d2, data); + + if (c <= 0) { + l = l->next = l1; + l1 = l1->next; + } else { + l = l->next = l2; + l2 = l2->next; + } + l->prev = prev; + prev = l; + } + + l->next = (NULL == l1) ? l2 : l1; + l->next->prev = l; + + return head.next; +} + +/** + * Sort list in place using a merge sort. + */ +static void +elist_sort_internal(elist_t *list, cmp_data_fn_t cmp, void *data) +{ + elist_check(list); + elist_invariant(list); + g_return_unless(cmp != NULL); + + /* + * During merging, we use the list as a one-way list chained through + * its next pointers and identified by its head and by its amount of + * items (to make sub-splitting faster). + * + * When we come back from the recursion we merge the two sorted lists + * and restore its two-way nature, updating the head/tail pointers. + */ + + list->head = elist_merge_sort(list, list->head, list->count, cmp, data); + list->tail = elist_last_link(list->head); + + safety_assert(elist_invariant(list)); + safety_assert(elist_length(list->head) == list->count); +} + +/** + * Sort list according to the comparison function, which takes two items + * plus an additional opaque argument, meant to be used as context to sort + * the two items. + * + * @param list the list to sort + * @param cmp comparison routine to use (for two items) + * @param data additional argument to supply to comparison routine + */ +void +elist_sort_with_data(elist_t *list, cmp_data_fn_t cmp, void *data) +{ + elist_sort_internal(list, cmp, data); +} + +/** + * Sort list according to the comparison function, which compares items. + * + * @param list the list to sort + * @param cmp comparison routine to use (for two items) + */ +void +elist_sort(elist_t *list, cmp_fn_t cmp) +{ + elist_sort_internal(list, (cmp_data_fn_t) cmp, NULL); +} + +/** + * Insert item in sorted list at the proper position. + * + * @param list the list into which we insert + * @param item the item to insert + * @param cmp comparison routine to use (for two items) with extra data + * @param data user-supplied data for the comparison routine + */ +static void +elist_insert_sorted_internal(elist_t *list, void *item, + cmp_data_fn_t cmp, void *data) +{ + link_t *lk, *ln; + + elist_check(list); + elist_invariant(list); + g_assert(item != NULL); + g_assert(cmp != NULL); + + ln = ptr_add_offset(item, list->offset); + + for (lk = list->head; lk != NULL; lk = lk->next) { + void *p = ptr_add_offset(lk, -list->offset); + if ((*cmp)(item, p, data) <= 0) + break; + } + + if (NULL == lk) { + elist_link_append_internal(list, ln); + } else { + elist_link_insert_before_internal(list, lk, ln); + } + + safety_assert(elist_length(list->head) == list->count); +} + +/** + * Insert item in sorted list at the proper position, as determined by + * the item comparison routine, in order to keep the whole list sorted + * after insertion, using the same comparison criteria. + * + * The comparison routine takes an extra user-defined context, to assist + * in the item comparison. + * + * @param list the list into which we insert + * @param item the item to insert + * @param cmp comparison routine to use (for two items) with extra data + * @param data user-supplied data for the comparison routine + */ +void +elist_insert_sorted_with_data(elist_t *list, void *item, + cmp_data_fn_t cmp, void *data) +{ + elist_insert_sorted_internal(list, item, cmp, data); +} + +/** + * Insert item in sorted list at the proper position, as determined by + * the item comparison routine, in order to keep the whole list sorted + * after insertion, using the same comparison criteria. + * + * @param list the list into which we insert + * @param item the item to insert + * @param cmp comparison routine to use (for two items) + */ +void +elist_insert_sorted(elist_t *list, void *item, cmp_fn_t cmp) +{ + elist_insert_sorted_internal(list, item, (cmp_data_fn_t) cmp, NULL); +} + +/** + * Get the n-th item in the list (0-based index). + * + * A negative index gets items from the tail of the list, i.e. -1 gets the + * last item, -2 the penultimate one, -3 the antepenultimate one, etc... + * + * @param list the list + * @param n the n-th item index to retrieve (0 = first item) + * + * @return the n-th item, NULL if the position is off the end of the list. + */ +void * +elist_nth(const elist_t *list, long n) +{ + size_t i = n; + link_t *lk; + + elist_check(list); + + if (n < 0) + i = list->count + n; + + if (i >= list->count) + return NULL; + + /* + * Select from the head if index is before the middle of the list, + * otherwise start from the tail. + */ + + if (i < list->count / 2) { + for (lk = list->head; lk != NULL; lk = lk->next) { + if (0 == i--) + return ptr_add_offset(lk, -list->offset); + } + } else { + i = list->count - i - 1; /* 0-based index from tail */ + + for (lk = list->tail; lk != NULL; lk = lk->prev) { + if (0 == i--) + return ptr_add_offset(lk, -list->offset); + } + } + + g_assert_not_reached(); /* Item must have been selected above */ +} + +/** + * Given a link, return the item associated with the nth link that follows it, + * or NULL if there is nothing. The 0th item is the data associated with + * the given link. + * + * @param list the list + * @param lk the starting link, which must be part of the list + * @param n how mnay items to move forward starting from the link + * + * @return item at the nth position following the link, NULL if none. + */ +void * +elist_nth_next_data(const elist_t *list, const link_t *lk, size_t n) +{ + link_t *l; + + elist_check(list); + g_assert(lk != NULL); + g_assert(size_is_non_negative(n)); + + l = elist_nth_next(lk, n); + return NULL == l ? NULL : ptr_add_offset(l, -list->offset); +} + +/** + * Given a link, return the item associated with the nth link that precedes it, + * or NULL if there is nothing. The 0th item is the data associated with + * the given link. + * + * @param list the list + * @param lk the starting link, which must be part of the list + * @param n how mnay items to move backwards starting from the link + * + * @return item at the nth position preceding the link, NULL if none. + */ +void * +elist_nth_prev_data(const elist_t *list, const link_t *lk, size_t n) +{ + link_t *l; + + elist_check(list); + g_assert(lk != NULL); + g_assert(size_is_non_negative(n)); + + l = elist_nth_prev(lk, n); + return NULL == l ? NULL : ptr_add_offset(l, -list->offset); +} + +/** + * Pick random item in list. + * + * @return pointer to the selected item, NULL if list is empty. + */ +void * +elist_random(const elist_t *list) +{ + elist_check(list); + g_assert(list->count <= MAX_INT_VAL(long)); + + if G_UNLIKELY(0 == list->count) + return NULL; + + return elist_nth(list, random_ulong_value(list->count - 1)); +} + +/** + * Randomly shuffle the items in the list using supplied random function. + * + * @param rf the random function to use (NULL means: use defaults) + * @param list the list to shuffle + */ +void +elist_shuffle_with(random_fn_t rf, elist_t *list) +{ + link_t *lk; + link_t **array; + size_t i; + + elist_check(list); + elist_invariant(list); + + if G_UNLIKELY(list->count <= 1U) + return; + + /* + * To ensure O(n) shuffling, build an array containing all the items, + * shuffle that array then recreate the list according to the shuffled + * array. + */ + + XMALLOC_ARRAY(array, list->count); + + for (i = 0, lk = list->head; lk != NULL; i++, lk = lk->next) { + arrayi = lk; + } + + shuffle_with(rf, array, list->count, sizeof array0); + + /* + * Rebuild the list. + */ + + list->head = array0; + list->tail = arraylist->count - 1; + + lk = list->head; + lk->prev = NULL; + + for (i = 1; i < list->count; i++) { + link_t *ln = arrayi; + + lk->next = ln; + ln->prev = lk; + lk = ln; + } + + lk->next = NULL; + xfree(array); + + safety_assert(elist_invariant(list)); + safety_assert(elist_length(list->head) == list->count); +} + +/** + * Randomly shuffle the items in the list. + */ +void +elist_shuffle(elist_t *list) +{ + elist_shuffle_with(NULL, list); +} + +/** + * Rotate list by one item to the left. + * + * The head is inserted back at the tail. + */ +void +elist_rotate_left(elist_t *list) +{ + link_t *lk; + + elist_check(list); + + if G_UNLIKELY(list->count <= 1U) + return; + + lk = list->head; + elist_link_remove_internal(list, lk, TRUE); + elist_link_append_internal(list, lk); + + safety_assert(elist_invariant(list)); + safety_assert(elist_length(list->head) == list->count); +} + +/** + * Rotate list by one item to the right. + * + * The tail is inserted back at the head. + */ +void +elist_rotate_right(elist_t *list) +{ + link_t *lk; + + elist_check(list); + + if G_UNLIKELY(list->count <= 1U) + return; + + lk = list->tail; + elist_link_remove_internal(list, lk, TRUE); + elist_link_prepend_internal(list, lk); + + safety_assert(elist_invariant(list)); + safety_assert(elist_length(list->head) == list->count); +} + +/** + * Move entry to the head of the list. + */ +void +elist_moveto_head(elist_t *list, void *data) +{ + link_t *lk; + + elist_check(list); + g_assert(data != NULL); + g_assert(size_is_positive(list->count)); + + lk = ptr_add_offset(data, list->offset); + + if (list->head != lk) { + elist_link_remove_internal(list, lk, TRUE); + elist_link_prepend_internal(list, lk); + } + + safety_assert(elist_invariant(list)); +} + +/** + * Move entry to the tail of the list. + */ +void +elist_moveto_tail(elist_t *list, void *data) +{ + link_t *lk; + + elist_check(list); + g_assert(data != NULL); + g_assert(size_is_positive(list->count)); + + lk = ptr_add_offset(data, list->offset); + + if (list->tail != lk) { + elist_link_remove_internal(list, lk, TRUE); + elist_link_append_internal(list, lk); + } + + safety_assert(elist_invariant(list)); +} + +/** + * Remove head of list, return pointer to item, NULL if list was empty. + */ +void * +elist_shift(elist_t *list) +{ + void *item; + + elist_check(list); + + if (NULL == list->head) { + item = NULL; + } else { + item = ptr_add_offset(list->head, -list->offset); + elist_link_remove_internal(list, list->head, TRUE); + } + + return item; +} + +/** + * Remove tail of list, return pointer to item, NULL if list was empty. + */ +void * +elist_pop(elist_t *list) +{ + void *item; + + elist_check(list); + + if (NULL == list->tail) { + item = NULL; + } else { + item = ptr_add_offset(list->tail, -list->offset); + elist_link_remove_internal(list, list->tail, TRUE); + } + + return item; + } + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/elist.h
Added
@@ -0,0 +1,365 @@ +/* + * Copyright (c) 2012-2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Embedded two-way list (within another data structure). + * + * @author Raphael Manfredi + * @date 2012-2013 + */ + +#ifndef _elist_h_ +#define _elist_h_ + +/** + * Get the enclosing data item from an embedded link. + */ +#ifdef __GNUC__ +#define elist_item(lnk, type, field) G_EXTENSION({ \ + const struct link *__mptr = (lnk); \ + (type *)((char *) __mptr - offsetof(type, field));}) +#else +#define elist_item(lnk, type, field) \ + ((type *)((char *) (node) - offsetof(type, field))) +#endif + +/** + * A list link. + */ +typedef struct link { + struct link *next, *prev; +} link_t; + +enum elist_magic { ELIST_MAGIC = 0x12a51414 }; + +/** + * An embedded list is represented by this structure. + */ +typedef struct elist { + enum elist_magic magic; + link_t *head, *tail; + size_t offset; /* Offset of embedded link in the item structure */ + size_t count; /* Amount of items held */ +} elist_t; + +static inline void +elist_check(const elist_t * const el) +{ + g_assert(el != NULL); + g_assert(ELIST_MAGIC == el->magic); +} + +#define ELIST_INIT(offset) { ELIST_MAGIC, NULL, NULL, offset, 0 } + +static inline bool +elist_invariant(const elist_t * const list) +{ + g_assert(list->count != 0 || (NULL == list->head && NULL == list->tail)); + g_assert((list->head != list->tail) == (list->count > 1U)); + g_assert(NULL == list->head || NULL == list->head->prev); + g_assert(NULL == list->tail || NULL == list->tail->next); + return TRUE; /* So that we can safety_assert() this routine */ +} + +/** + * Public interface. + */ + +/** + * @return whether the embedded list descriptor is non-zero. + */ +static inline bool +elist_is_initialized(const elist_t * const el) +{ + return 0 != el->magic; /* Initialized, not necessarily valid! */ +} + +/** + * @return length of embedded list. + */ +static inline size_t +elist_count(const elist_t * const el) +{ + elist_check(el); + return el->count; +} + +/** + * @return length of embedded list by traversing the list from the + * specified link, following forward pointers. + */ +static inline size_t +elist_length(const link_t *lk) +{ + size_t n = 0; + + while (lk != NULL) { + n++; + lk = lk->next; + } + + return n; +} + +/** + * @return pointer to first item of list, NULL if empty. + */ +static inline void * +elist_head(const elist_t * const el) +{ + elist_check(el); + return NULL == el->head ? NULL : ptr_add_offset(el->head, -el->offset); +} + +/** + * @return pointer to last item of list, NULL if empty. + */ +static inline void * +elist_tail(const elist_t * const el) +{ + elist_check(el); + return NULL == el->tail ? NULL : ptr_add_offset(el->tail, -el->offset); +} + +/** + * @return pointer to first link of list, NULL if empty. + */ +static inline link_t * +elist_first(const elist_t * const el) +{ + elist_check(el); + return el->head; +} + +/** + * @return pointer to last link of list, NULL if empty. + */ +static inline link_t * +elist_last(const elist_t * const el) +{ + elist_check(el); + return el->tail; +} + +/** + * @return first link in backward chain. + */ +static inline link_t * +elist_first_link(const link_t *lk) +{ + if (NULL == lk) + return NULL; + + while (lk->prev != NULL) + lk = lk->prev; + + return deconstify_pointer(lk); +} + +/** + * @return last link in forward chain. + */ +static inline link_t * +elist_last_link(const link_t *lk) +{ + if (NULL == lk) + return NULL; + + while (lk->next != NULL) + lk = lk->next; + + return deconstify_pointer(lk); +} + +/** + * @return next link, NULL if none. + */ +static inline link_t * +elist_next(const link_t * const lk) +{ + return NULL == lk ? NULL : lk->next; +} + +/** + * @return previous link, NULL if none. + */ +static inline link_t * +elist_prev(const link_t * const lk) +{ + return NULL == lk ? NULL : lk->prev; +} + +/** + * @return nth next link, NULL if none. + */ +static inline link_t * +elist_nth_next(const link_t * const lk, size_t n) +{ + const link_t *l = lk; + + while (n-- > 0 && l != NULL) + l = l->next; + + return deconstify_pointer(l); +} + +/** + * @return nth previous link, NULL if none. + */ +static inline link_t * +elist_nth_prev(const link_t * const lk, size_t n) +{ + const link_t *l = lk; + + while (n-- > 0 && l != NULL) + l = l->prev; + + return deconstify_pointer(l); +} + +/** + * @return the data associated with the curernt link, NULL if none. + */ +static inline void * +elist_data(const elist_t *list, const link_t * const lk) +{ + elist_check(list); + + return NULL == lk ? NULL : + deconstify_pointer(const_ptr_add_offset(lk, -list->offset)); +} + +/** + * @return the data associated with the next item, NULL if none. + */ +static inline void * +elist_next_data(const elist_t *list, const void *p) +{ + const link_t *lk; + + elist_check(list); + g_assert(p != NULL); + + lk = const_ptr_add_offset(p, list->offset); + return NULL == lk->next ? NULL : + deconstify_pointer(const_ptr_add_offset(lk->next, -list->offset)); +} + +/** + * @return the data associated with the previous item, NULL if none. + */ +static inline void * +elist_prev_data(const elist_t *list, const void *p) +{ + const link_t *lk; + + elist_check(list); + g_assert(p != NULL); + + lk = const_ptr_add_offset(p, list->offset); + return NULL == lk->prev ? NULL : + deconstify_pointer(const_ptr_add_offset(lk->prev, -list->offset)); +} + +/** + * For assertions, check whether item is a member of the list. + * + * @attention + * This is very inefficient, as it needs to traverse the whole list, possibly. + * It only needs to be called when debugging. + */ +static inline bool +elist_contains(const elist_t *list, const void *p) +{ + const link_t *l, *lk; + + elist_check(list); + g_assert(p != NULL); + + lk = const_ptr_add_offset(p, list->offset); + l = list->head; + + while (l != NULL) { + if G_UNLIKELY(l == lk) + return TRUE; + l = l->next; + } + + return FALSE; +} + +void elist_init(elist_t *list, size_t offset); +void elist_discard(elist_t *list); +void elist_clear(elist_t *list); +void elist_wfree(elist_t *list, size_t size); + +void elist_foreach(const elist_t *list, data_fn_t cb, void *data); +size_t elist_foreach_remove(elist_t *list, data_rm_fn_t cbr, void *data); + +void elist_link_append(elist_t *list, link_t *lk); +void elist_append(elist_t *list, void *data); +void elist_link_prepend(elist_t *list, link_t *lk); +void elist_prepend(elist_t *list, void *data); +void elist_link_remove(elist_t *list, link_t *lk); +void elist_remove(elist_t *list, void *data); +void elist_link_insert_before(elist_t *list, link_t *sibling_lk, link_t *lk); +void elist_insert_before(elist_t *list, void *sibling, void *data); +void elist_link_insert_after(elist_t *list, link_t *sibling_lk, link_t *lk); +void elist_insert_after(elist_t *list, void *sibling, void *data); +void elist_link_replace(elist_t *list, link_t *old, link_t *new); +void elist_replace(elist_t *list, void *old, void *new); +void elist_reverse(elist_t *list); +void elist_moveto_head(elist_t *list, void *data); +void elist_moveto_tail(elist_t *list, void *data); +void *elist_find(const elist_t *list, const void *key, cmp_fn_t cmp); +void elist_sort_with_data(elist_t *list, cmp_data_fn_t cmp, void *data); +void elist_sort(elist_t *list, cmp_fn_t cmp); +void elist_insert_sorted_with_data(elist_t *list, void *item, + cmp_data_fn_t cmp, void *data); +void elist_insert_sorted(elist_t *list, void *item, cmp_fn_t cmp); +void *elist_nth(const elist_t *list, long n); +void *elist_nth_next_data(const elist_t *list, const link_t *lk, size_t n); +void *elist_nth_prev_data(const elist_t *list, const link_t *lk, size_t n); +void *elist_random(const elist_t *list); +void elist_shuffle(elist_t *list); +void elist_shuffle_with(random_fn_t rf, elist_t *list); +void elist_rotate_left(elist_t *list); +void elist_rotate_right(elist_t *list); +void *elist_shift(elist_t *list); +void *elist_pop(elist_t *list); + +void elist_append_list(elist_t *list, elist_t *other); +void elist_prepend_list(elist_t *list, elist_t *other); + +#define ELIST_FOREACH(list, l) \ + for ((l) = elist_first(list); NULL != (l); (l) = elist_next(l)) + +#define ELIST_FOREACH_DATA(ls, d) \ + for ((d) = elist_head(ls); NULL != (d); (d) = elist_next_data((ls), (d))) + +#endif /* _elist_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/endian.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/endian.h
Changed
@@ -26,7 +26,7 @@ * @ingroup lib * @file * - * Endiannes peek/poke routines. + * Endianness peek/poke routines. * * @author Raphael Manfredi * @date 2001-2003 @@ -40,112 +40,156 @@ #include "common.h" /** + * UINT32_ROTR() rotates a 32-bit value to the right by `n' bits. + * UINT32_ROTL() rotates a 32-bit value to the left by `n' bits. + */ +#define UINT32_ROTR(x_,n_) \ + (((uint32) (x_) >> (n_)) | ((uint32) (x_) << (32 - (n_)))) + +#define UINT32_ROTL(x_,n_) \ + (((uint32) (x_) << (n_)) | ((uint32) (x_) >> (32 - (n_)))) + +/** + * UINT32_SWAP_CONSTANT() byte-swaps a 32-bit word, preferrably a constant. + * If the value is a variable, use UINT32_SWAP(). + */ +#define UINT32_SWAP_CONSTANT(x_) \ + ((UINT32_ROTR((x_), 8) & 0xff00ff00) | (UINT32_ROTL((x_), 8) & 0x00ff00ff)) + +/** + * UINT64_SWAP_CONSTANT() byte-swaps a 64-bit word, preferrably a constant. + * If the value is a variable, use UINT64_SWAP(). + */ +#define UINT64_SWAP_CONSTANT(x_) \ + (UINT32_SWAP_CONSTANT((uint32) ((x_) >> 32)) | \ + ((uint64) UINT32_SWAP_CONSTANT((uint32) (x_)) << 32)) + +/** + * UINT16_SWAP() byte-swaps a 16-bit word. + */ +#define UINT16_SWAP(x_) ((uint16)((x_) >> 8) | (uint16)((x_) << 8)) + +/** + * UINT32_SWAP() byte-swaps a 32-bit word. + * + * Avoid using glib's GUINT32_SWAP_LE_BE(): it triggers compile-time + * warnings on a wrong __asm__ statement with glib 1.2. This version + * should be as efficient as the one defined by glib. + */ +#ifdef HAS_BUILTIN_BSWAP32 +#define UINT32_SWAP(x_) \ + (IS_CONSTANT(x_) ? UINT32_SWAP_CONSTANT(x_) : __builtin_bswap32(x_)) +#else +#define UINT32_SWAP(x_) UINT32_SWAP_CONSTANT(x_) +#endif + +/** + * UINT64_SWAP() byte-swaps a 64-bit word. + */ +#ifdef HAS_BUILTIN_BSWAP64 +#define UINT64_SWAP(x_) \ + (IS_CONSTANT(x_) ? UINT64_SWAP_CONSTANT(x_) : __builtin_bswap64(x_)) +#else +#define UINT64_SWAP(x_) UINT64_SWAP_CONSTANT(x_) +#endif + +/** * Functions for writing and reading fixed-size integers in big-endian * or little-endian. */ -static inline ALWAYS_INLINE G_GNUC_PURE guint8 +static inline ALWAYS_INLINE G_PURE uint8 peek_u8(const void *p) { - const guint8 *q = p; + const uint8 *q = p; return q0; } -static inline ALWAYS_INLINE G_GNUC_PURE guint16 +static inline ALWAYS_INLINE G_PURE uint16 peek_u16(const void *p) { const unsigned char *q = p; - guint16 v; + uint16 v; memcpy(&v, q, sizeof v); return v; } -static inline ALWAYS_INLINE G_GNUC_PURE guint32 +static inline ALWAYS_INLINE G_PURE uint32 peek_u32(const void *p) { const unsigned char *q = p; - guint32 v; + uint32 v; memcpy(&v, q, sizeof v); return v; } -static inline ALWAYS_INLINE G_GNUC_PURE guint64 +static inline ALWAYS_INLINE G_PURE uint64 peek_u64(const void *p) { const unsigned char *q = p; - guint64 v; + uint64 v; memcpy(&v, q, sizeof v); return v; } -static inline G_GNUC_PURE guint16 +static inline G_PURE uint16 peek_be16(const void *p) { - const unsigned char *q = p; - guint16 v; - -#if G_BYTE_ORDER == G_BIG_ENDIAN - memcpy(&v, q, sizeof v); +#if IS_BIG_ENDIAN + return peek_u16(p); #else - v = ((guint16) peek_u8(q) << 8) | peek_u8(&qsizeof v / 2); + return UINT16_SWAP(peek_u16(p)); #endif - return v; } -static inline G_GNUC_PURE guint32 +static inline G_PURE uint32 peek_be32(const void *p) { - const unsigned char *q = p; - guint32 v; - -#if G_BYTE_ORDER == G_BIG_ENDIAN - memcpy(&v, q, sizeof v); +#if IS_BIG_ENDIAN + return peek_u32(p); #else - v = ((guint32) peek_be16(q) << 16) | peek_be16(&qsizeof v / 2); + return UINT32_SWAP(peek_u32(p)); #endif - return v; } -static inline G_GNUC_PURE guint64 +static inline G_PURE uint64 peek_be64(const void *p) { - const unsigned char *q = p; - guint64 v; - -#if G_BYTE_ORDER == G_BIG_ENDIAN - memcpy(&v, q, sizeof v); +#if IS_BIG_ENDIAN + return peek_u64(p); #else - v = ((guint64) peek_be32(q) << 32) | peek_be32(&qsizeof v / 2); + return UINT64_SWAP(peek_u64(p)); #endif - return v; } -static inline G_GNUC_PURE guint16 +static inline G_PURE uint16 peek_le16(const void *p) { - const unsigned char *q = p; - guint16 v; - -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - memcpy(&v, q, sizeof v); +#if IS_LITTLE_ENDIAN + return peek_u16(p); #else - v = peek_u8(q) | ((guint16) peek_u8(&qsizeof v / 2) << 8); + return UINT16_SWAP(peek_u32(p)); #endif - return v; } -static inline G_GNUC_PURE guint32 +static inline G_PURE uint32 peek_le32(const void *p) { - const unsigned char *q = p; - guint32 v; +#if IS_LITTLE_ENDIAN + return peek_u32(p); +#else + return UINT32_SWAP(peek_u32(p)); +#endif +} -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - memcpy(&v, q, sizeof v); +static inline G_PURE uint64 +peek_le64(const void *p) +{ +#if IS_LITTLE_ENDIAN + return peek_u64(p); #else - v = peek_le16(q) | ((guint32) peek_le16(&qsizeof v / 2) << 16); + return UINT64_SWAP(peek_u64(p)); #endif - return v; } /* @@ -153,161 +197,149 @@ * written bytes. */ -static inline ALWAYS_INLINE gpointer -poke_u8(gpointer p, unsigned char v) +static inline ALWAYS_INLINE void * +poke_u8(void *p, unsigned char v) { unsigned char *q = p; *q = v & 0xff; return &qsizeof v; } -static inline gpointer -poke_be16(gpointer p, guint16 v) +static inline ALWAYS_INLINE void * +poke_u16(void *p, uint16 v) { unsigned char *q = p; - -#if G_BYTE_ORDER == G_BIG_ENDIAN memcpy(q, &v, sizeof v); -#else - poke_u8(&q0, v >> 8); - poke_u8(&qsizeof v / 2, v); -#endif - return &qsizeof v; } -static inline gpointer -poke_be32(gpointer p, guint32 v) +static inline ALWAYS_INLINE void * +poke_u32(void *p, uint32 v) { unsigned char *q = p; - -#if G_BYTE_ORDER == G_BIG_ENDIAN memcpy(q, &v, sizeof v); -#else - poke_be16(&q0, v >> 16); - poke_be16(&qsizeof v / 2, v); -#endif - return &qsizeof v; } -static inline gpointer -poke_be64(gpointer p, guint64 v) +static inline ALWAYS_INLINE void * +poke_u64(void *p, uint64 v) { unsigned char *q = p; - -#if G_BYTE_ORDER == G_BIG_ENDIAN memcpy(q, &v, sizeof v); -#else - poke_be32(&q0, v >> 32); - poke_be32(&qsizeof v / 2, v); -#endif - return &qsizeof v; } -static inline gpointer -poke_le16(gpointer p, guint16 v) +static inline void * +poke_be16(void *p, uint16 v) { - unsigned char *q = p; - -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - memcpy(q, &v, sizeof v); -#else - poke_u8(&q0, v); - poke_u8(&qsizeof v / 2, v >> 8); +#if IS_LITTLE_ENDIAN + v = UINT16_SWAP(v); #endif - - return &qsizeof v; + return poke_u16(p, v); } -static inline gpointer -poke_le32(gpointer p, guint32 v) +static inline void * +poke_be32(void *p, uint32 v) { - unsigned char *q = p; - -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - memcpy(q, &v, sizeof v); -#else - poke_le16(&q0, v); - poke_le16(&qsizeof v / 2, v >> 16); +#if IS_LITTLE_ENDIAN + v = UINT32_SWAP(v); #endif - - return &qsizeof v; + return poke_u32(p, v); } -static inline gpointer -poke_le64(gpointer p, guint64 v) +static inline void * +poke_be64(void *p, uint64 v) { - unsigned char *q = p; - -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - memcpy(q, &v, sizeof v); -#else - poke_le32(&q0, v); - poke_le32(&qsizeof v / 2, v >> 32); +#if IS_LITTLE_ENDIAN + v = UINT64_SWAP(v); #endif + return poke_u64(p, v); +} - return &qsizeof v; +static inline void * +poke_le16(void *p, uint16 v) +{ +#if IS_BIG_ENDIAN + v = UINT16_SWAP(v); +#endif + return poke_u16(p, v); } +static inline void * +poke_le32(void *p, uint32 v) +{ +#if IS_BIG_ENDIAN + v = UINT32_SWAP(v); +#endif + return poke_u32(p, v); +} -/* - * The list of architectures is taken from xdr_float.c of - * SUN's XDR implementation. - */ -#if \ - defined(__alpha__) || \ - defined(__arm__) || \ - defined(__hppa__) || \ - defined(__i386__) || \ - defined(__ia64__) || \ - defined(__m68k__) || \ - defined(__mips__) || \ - defined(__ns32k__) || \ - defined(__powerpc__) || \ - defined(__ppc__) || \ - defined(__s390__) || \ - defined(__sh__) || \ - defined(__sparc__) || \ - defined(__sparc) || \ - defined(__x86_64__) -#define FLOAT_USES_IEEE754 -#else -#undef FLOAT_USES_IEEE754 -#error "This architecture may be unsupported. float must use IEEE 754." +static inline void * +poke_le64(void *p, uint64 v) +{ +#if IS_BIG_ENDIAN + v = UINT64_SWAP(v); #endif + return poke_u64(p, v); +} -#ifdef FLOAT_USES_IEEE754 +#ifdef USE_IEEE754_FLOAT /* - * The following routines assume integer byte order is float byte order. * Handles IEC 60559/IEEE 754 floating point single-precision (32-bit). */ -static inline gpointer -poke_float_be32(gpointer p, float v) +static inline void * +poke_float_be32(void *p, float v) { - guint32 tmp; + uint32 tmp; STATIC_ASSERT(sizeof(float) == 4); memcpy(&tmp, &v, 4); +#if BYTEORDER == IEEE754_BYTEORDER return poke_be32(p, tmp); +#else + return poke_le32(p, tmp); /* Will swap the ordering */ +#endif } -static inline G_GNUC_PURE float +static inline G_PURE float peek_float_be32(const void *p) { - guint32 tmp; + uint32 tmp; float v; STATIC_ASSERT(sizeof(float) == 4); +#if BYTEORDER == IEEE754_BYTEORDER tmp = peek_be32(p); +#else + tmp = peek_le32(p); /* Will swap the ordering */ +#endif memcpy(&v, &tmp, 4); return v; } -#endif /* FLOAT_USES_IEEE754 */ +#endif /* USE_IEEE754_FLOAT */ + +/* + * The peek_*_advance() routines return a pointer to the byte immediately + * following the read value, and fill-in the given pointer with the read value. + */ + +static inline const void * +peek_be32_advance(const void *p, uint32 *v) +{ + *v = peek_be32(p); + return const_ptr_add_offset(p, 4); +} + +static inline const void * +peek_le32_advance(const void *p, uint32 *v) +{ + *v = peek_le32(p); + return const_ptr_add_offset(p, 4); +} #endif /* _endian_h_ */ + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/entropy.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/entropy.c
Changed
@@ -1,6 +1,6 @@ /* - * Copyright (c) 2008, Christian Biere - * Copyright (c) 2008, Raphael Manfredi + * Copyright (c) 2008 Christian Biere + * Copyright (c) 2008, 2012, 2014-2015 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,9 +28,56 @@ * * Entropy collection. * + * The aim is to produce random bits by probing the environment and combining + * the information collected with a good hash function (SHA-1 here) to create + * sufficient diffusion. + * + * The entropy collected here is meant to be as unique as possible, even + * when called multiple times (with the same items being probed), so that + * more than 160 bits of randomness can be collected. Ensuring a good initial + * random seed is critical when generating unique IDs, such as a servent GUID + * or a DHT identifier. + * + * In order to do that, a simple pseudo-random number generation (PRNG) engine + * is used to vary the order with which each source of "randomness" is probed. + * An history of the collected entropy is also kept through successive merging + * of newly collected bits with previously collected ones. + * + * Entropy is mostly collected at the beginning to initialize some random + * values and set the initial state of much stronger PRNG engines: ARC4, + * WELL, or MT. + * + * When AJE (Alea Jacta Est) has been initialized, all entropy retrieval is + * transparently remapped to the global AJE state. + * + * Why so much care at computing randomness? + * + * The aim here is not to achieve cryptographic strength but rather make + * sure the random sequence generated by this program will be as unique + * as possible over time, and as unpredictable as possible. + * + * Uniqueness takes care of random IDs that need to be unique, even if millions + * of CPUs generate such an ID at the same time using the same exact logic. + * + * Unpredictability takes care of possible hostility against the random + * sequence, whereby an attacker would attempt to generate similar random + * IDs or attempt to guess what the next ID will be based on recently seen + * random IDs. Being able to anticipate the next IDs would be the basis of + * denial of service. + * + * Good randomness requires the use of good pseudo random number generators + * (PRNGs), proper initial seeding and understanding the limits imposed by the + * (necessarily constrained) size of the internal context of these PRNGs. + * + * Strong randomness requires the use of cryptographically secure PRNGs, so + * that prediction of future outputs based on previous inputs cannot be easily + * made (meaning the internal context remains unknown despite the output of + * the algorithm being seen). + * * @author Christian Biere - * @author Raphael Manfredi * @date 2008 + * @author Raphael Manfredi + * @date 2008, 2012, 2014-2015 */ #include "common.h" @@ -40,106 +87,423 @@ #endif #include "entropy.h" + +#include "aje.h" +#include "atomic.h" +#include "bigint.h" #include "compat_misc.h" -#include "compat_sleep_ms.h" -#include "eval.h" +#include "compat_statvfs.h" +#include "compat_usleep.h" +#include "crc.h" +#include "endian.h" +#include "getgateway.h" +#include "gethomedir.h" +#include "hashing.h" +#include "host_addr.h" +#include "log.h" +#include "mempcpy.h" #include "misc.h" +#include "pow2.h" +#include "pslist.h" +#include "rand31.h" +#include "random.h" #include "sha1.h" +#include "shuffle.h" +#include "spinlock.h" +#include "stringify.h" +#include "thread.h" #include "tm.h" +#include "unsigned.h" #include "vmm.h" /* For vmm_trap_page() */ #include "override.h" /* Must be the last header included */ +/** + * Maximum amount of items we can randomly shuffle. + * + * We're using a PRNG with 128 bits of internal context and a period of, at + * least, 2**125. To ensure we can reach all the possible permutations of + * the set, we cannot shuffle more than 33 items since 33! < 2**123 but 34! + * is greater than the minimum period. + */ +#define RANDOM_SHUFFLE_MAX 33 /* 33! < 2**123 */ + +typedef void (*entropy_cb_t)(SHA1_context *ctx); + +/** + * Buffer where we keep track of previously generated randomness. + */ +static sha1_t entropy_previous; +static spinlock_t entropy_previous_slk = SPINLOCK_INIT; + +#define ENTROPY_PREV_LOCK spinlock_hidden(&entropy_previous_slk) +#define ENTROPY_PREV_UNLOCK spinunlock_hidden(&entropy_previous_slk) + +/** + * Amount of input bytes necessary to harvest one byte of entropy to + * the pool when computing SHA1 sums. + */ +#define ENTROPY_ALPHA 3 /* Bytes to harvest 8 bits of entropy */ + +#define ENTROPY_NONCE_MAX 1023 /* Change "nonce" after that many uses */ + +/** + * Context for the entropy_minirand() routine. + */ +static struct entropy_minictx { + spinlock_t lock; + uint32 x, y, z, c; + bool seeded; +} entropy_minictx = { + SPINLOCK_INIT, + 0, 0, 0, 0, + FALSE +}; +#define ENTROPY_MINICTX_LOCK(c) spinlock_hidden(&(c)->lock) +#define ENTROPY_MINICTX_UNLOCK(c) spinunlock_hidden(&(c)->lock) + +static void entropy_seed(struct entropy_minictx *c); + +static void +sha1_feed_ulong(SHA1_context *ctx, unsigned long value) +{ + SHA1_INPUT(ctx, value); +} + static void -sha1_feed_ulong(SHA1Context *ctx, unsigned long value) +sha1_feed_uint(SHA1_context *ctx, unsigned value) { - SHA1Input(ctx, &value, sizeof value); + SHA1_INPUT(ctx, value); } static void -sha1_feed_double(SHA1Context *ctx, double value) +sha1_feed_double(SHA1_context *ctx, double value) { - SHA1Input(ctx, &value, sizeof value); + SHA1_INPUT(ctx, value); } static void -sha1_feed_pointer(SHA1Context *ctx, gconstpointer p) +sha1_feed_pointer(SHA1_context *ctx, const void *p) { - SHA1Input(ctx, &p, sizeof p); + SHA1_INPUT(ctx, p); } static void -sha1_feed_string(SHA1Context *ctx, const char *s) +sha1_feed_string(SHA1_context *ctx, const char *s) { - if (s) { - SHA1Input(ctx, s, strlen(s)); + sha1_feed_pointer(ctx, s); + if (s != NULL) { + SHA1_input(ctx, s, strlen(s)); } } static void -sha1_feed_stat(SHA1Context *ctx, const char *path) +sha1_feed_errno(SHA1_context *ctx) +{ + uint32 e = integer_hash_fast(errno); + uint32 b = rand31_u32() & 0x1f; + tm_nano_t now; + + tm_precise_time(&now); + sha1_feed_uint(ctx, integer_hash_fast(now.tv_nsec) + UINT32_ROTL(e, b)); +} + +static void +sha1_feed_stat(SHA1_context *ctx, const char *path) { filestat_t buf; + sha1_feed_string(ctx, path); + if (-1 != stat(path, &buf)) { - SHA1Input(ctx, &buf, sizeof buf); + SHA1_INPUT(ctx, buf); } else { - sha1_feed_string(ctx, path); - sha1_feed_ulong(ctx, errno); + sha1_feed_errno(ctx); } } static void -sha1_feed_fstat(SHA1Context *ctx, int fd) +sha1_feed_fstat(SHA1_context *ctx, int fd) { filestat_t buf; + sha1_feed_uint(ctx, fd); + if (-1 != fstat(fd, &buf)) { - SHA1Input(ctx, &buf, sizeof buf); + SHA1_INPUT(ctx, buf); + } else { + sha1_feed_errno(ctx); + } +} + +static void +sha1_feed_statvfs(SHA1_context *ctx, const char *path) +{ + struct statvfs buf; + + sha1_feed_string(ctx, path); + + if (-1 != compat_statvfs(path, &buf)) { + SHA1_INPUT(ctx, buf); } else { - sha1_feed_ulong(ctx, fd); - sha1_feed_ulong(ctx, errno); + sha1_feed_errno(ctx); } } /** - * Collect entropy and fill supplied SHA1 buffer with 160 random bits. + * Create a small but unpredictable delay in the process execution. + */ +void +entropy_delay(void) +{ + thread_yield(); +} + +/** + * Add entropy from previous calls. + */ +static void G_COLD +entropy_merge(sha1_t *digest) +{ + bigint_t older, newer; + + STATIC_ASSERT(sizeof entropy_previous == SHA1_RAW_SIZE); + + /* + * These big integers operate on the buffer space from ``digest'' and + * ``entropy_previous'' directly. + */ + + ENTROPY_PREV_LOCK; + + bigint_use(&older, &entropy_previous, SHA1_RAW_SIZE); + bigint_use(&newer, digest, SHA1_RAW_SIZE); + bigint_add(&newer, &older); + bigint_copy(&older, &newer); + + ENTROPY_PREV_UNLOCK; +} + +#define ENTROPY_KISS_MULT 698769069L + +/** + * Minimal random number generation, to be used very early in the process + * initialization when we cannot use entropy_minimal_collect() yet. * - * @attention - * This is a slow operation, and the routine even sleeps for 250 ms, so it - * must be called only when a truly random seed is required, ideally only - * during initialization. + * @note + * This routine MUST NOT be used directly by applications, as it is only + * meant to be used in entropy_array_shuffle() for internal shuffling purposes + * and in other parts of the entropy collection process where we need a random + * number but have not finished collecting entropy yet. + * It is only exported to be exercised in the random-test program. + * + * @return a 32-bit random number. */ -G_GNUC_COLD void -entropy_collect(struct sha1 *digest) +uint32 +entropy_minirand(void) { - SHA1Context ctx; - tm_t start, end; - jmp_buf env; + uint64 t; + uint32 r; + struct entropy_minictx *ctx = &entropy_minictx; + + ENTROPY_MINICTX_LOCK(ctx); + + if G_UNLIKELY(!ctx->seeded) { + ctx->seeded = TRUE; + entropy_seed(ctx); + } /* - * Get random entropy from the system. + * George Marsaglia's KISS alogorithm, posted in sci.math circa 2003. + * The period of this PRNG is more than 2**125, and it keeps 128 bits + * of context. */ - tm_now_exact(&start); + ctx->x = 69069 * ctx->x + 12345; + ctx->y ^= (ctx->y << 13); + ctx->y ^= (ctx->y >> 17); + ctx->y ^= (ctx->y << 5); + t = (uint64) ENTROPY_KISS_MULT * ctx->z + ctx->c; + ctx->c = t >> 32; + r = ctx->x + ctx->y + (ctx->z = t); + + ENTROPY_MINICTX_UNLOCK(ctx); + + return r; +} + +/** + * Shuffle array in-place. + */ +static void +entropy_array_shuffle(void *ary, size_t len, size_t elem_size) +{ + g_assert(ary != NULL); + g_assert(size_is_non_negative(len)); + g_assert(size_is_positive(elem_size)); + + if (len > RANDOM_SHUFFLE_MAX) + s_carp("%s: cannot shuffle %zu items without bias", G_STRFUNC, len); + + shuffle_with(entropy_minirand, ary, len, elem_size); +} + +/** + * Collect entropy by randomly executing the callbacks given in the array. + */ +static void +entropy_array_cb_collect(SHA1_context *ctx, entropy_cb_t *ary, size_t len) +{ + size_t i; + + g_assert(ctx != NULL); + g_assert(ary != NULL); + g_assert(size_is_non_negative(len)); + + entropy_array_shuffle(ary, len, sizeof ary0); + + for (i = 0; i < len; i++) { + (*aryi)(ctx); + } +} + +enum entropy_data { + ENTROPY_ULONG, + ENTROPY_STRING, + ENTROPY_STAT, + ENTROPY_FSTAT, + ENTROPY_STATVFS, + ENTROPY_DOUBLE, + ENTROPY_POINTER +}; + +/** + * Collect entropy by randomly feeding values from array. + */ +static void +entropy_array_data_collect(SHA1_context *ctx, + enum entropy_data data, void *ary, size_t len, size_t elem_size) +{ + size_t i; + void *p; + + g_assert(ctx != NULL); + g_assert(ary != NULL); + g_assert(size_is_non_negative(len)); + g_assert(size_is_positive(elem_size)); + + entropy_array_shuffle(ary, len, elem_size); + + for (i = 0, p = ary; i < len; i++, p = ptr_add_offset(p, elem_size)) { + switch (data) { + case ENTROPY_ULONG: + sha1_feed_ulong(ctx, *(unsigned long *) p); + break; + case ENTROPY_STRING: + sha1_feed_string(ctx, *(char **) p); + break; + case ENTROPY_STAT: + sha1_feed_stat(ctx, *(char **) p); + break; + case ENTROPY_FSTAT: + sha1_feed_fstat(ctx, *(int *) p); + break; + case ENTROPY_STATVFS: + sha1_feed_statvfs(ctx, *(char **) p); + break; + case ENTROPY_DOUBLE: + sha1_feed_double(ctx, *(double *) p); + break; + case ENTROPY_POINTER: + sha1_feed_pointer(ctx, *(void **) p); + break; + } + } +} + +/** + * Collect entropy by randomly feeding unsigned long values from array. + */ +static void +entropy_array_ulong_collect(SHA1_context *ctx, unsigned long *ary, size_t len) +{ + entropy_array_data_collect(ctx, ENTROPY_ULONG, ary, len, sizeof ary0); +} + +/** + * Collect entropy by randomly feeding strings from array. + */ +static void +entropy_array_string_collect(SHA1_context *ctx, const char **ary, size_t len) +{ + entropy_array_data_collect(ctx, ENTROPY_STRING, ary, len, sizeof ary0); +} + +/** + * Collect entropy by randomly feeding stat() info from paths in array. + */ +static void +entropy_array_stat_collect(SHA1_context *ctx, const char **ary, size_t len) +{ + entropy_array_data_collect(ctx, ENTROPY_STAT, ary, len, sizeof ary0); +} + +/** + * Collect entropy by randomly feeding statvfs() info from paths in array. + */ +static void +entropy_array_statvfs_collect(SHA1_context *ctx, const char **ary, size_t len) +{ + entropy_array_data_collect(ctx, ENTROPY_STATVFS, ary, len, sizeof ary0); +} + +/** + * Collect entropy by randomly feeding fstat() info from file descriptors. + */ +static void +entropy_array_fstat_collect(SHA1_context *ctx, int *ary, size_t len) +{ + entropy_array_data_collect(ctx, ENTROPY_FSTAT, ary, len, sizeof ary0); +} + +/** + * Collect entropy by randomly feeding double values from array. + */ +static void +entropy_array_double_collect(SHA1_context *ctx, double *ary, size_t len) +{ + entropy_array_data_collect(ctx, ENTROPY_DOUBLE, ary, len, sizeof ary0); +} - SHA1Reset(&ctx); - SHA1Input(&ctx, &start, sizeof start); +/** + * Collect entropy by randomly feeding pointers from array. + */ +static void +entropy_array_pointer_collect(SHA1_context *ctx, void **ary, size_t len) +{ + entropy_array_data_collect(ctx, ENTROPY_POINTER, ary, len, sizeof ary0); +} +/** + * Collect hopefully random bytes. + */ +static void +entropy_collect_randomness(SHA1_context *ctx) +{ #ifdef MINGW32 { - guint8 data128; + uint8 data128; if (0 == mingw_random_bytes(data, sizeof data)) { - g_warning("unable to generate random bytes: %m"); + s_warning("%s(): unable to generate random bytes: %m", G_STRFUNC); } else { - SHA1Input(&ctx, data, sizeof data); + SHA1_INPUT(ctx, data); } } #else /* !MINGW32 */ { filestat_t buf; FILE *f = NULL; - gboolean is_pipe = TRUE; + bool is_pipe = TRUE; /* * If we have a /dev/urandom character device, use it. @@ -149,7 +513,7 @@ if (-1 != stat("/dev/urandom", &buf) && S_ISCHR(buf.st_mode)) { f = fopen("/dev/urandom", "r"); is_pipe = FALSE; - SHA1Input(&ctx, &buf, sizeof buf); + SHA1_INPUT(ctx, buf); } else if (-1 != access("/bin/ps", X_OK)) { f = popen("/bin/ps -ef", "r"); } else if (-1 != access("/usr/bin/ps", X_OK)) { @@ -158,24 +522,22 @@ f = popen("/usr/ucb/ps aux", "r"); } - if (f == NULL) - g_warning("was unable to %s on your system", + if (f == NULL) { + s_warning("%s(): was unable to %s on your system", + G_STRFUNC, is_pipe ? "find the ps command" : "open /dev/urandom"); - else { + } else { /* * Compute the SHA1 of the output (either ps or /dev/urandom). */ for (;;) { - guint8 data1024; + uint8 data1024; size_t r, len = sizeof(data); - if (is_pipe) - len = MIN(128, len); /* 128 is probably magic */ - r = fread(data, 1, len, f); if (r > 0) - SHA1Input(&ctx, data, r); + SHA1_input(ctx, data, r); if (r < len || !is_pipe) /* Read once from /dev/urandom */ break; } @@ -187,34 +549,64 @@ } } #endif /* MINGW32 */ +} - /* - * Add local CPU state noise. - */ - - ZERO(&env); /* Avoid uninitialized memory reads */ - - if (setjmp(env)) { - /* We will never longjmp() back here */ - g_assert_not_reached(); - } - SHA1Input(&ctx, env, sizeof env); /* "env" is an array */ +/** + * Collect user ID information. + */ +static void +entropy_collect_user_id(SHA1_context *ctx) +{ + unsigned long id2; - /* Add some host/user dependent noise */ #ifdef HAS_GETUID - sha1_feed_ulong(&ctx, getuid()); - sha1_feed_ulong(&ctx, getgid()); + id0 = getuid(); + id1 = getgid(); +#else + id0 = entropy_minirand(); + id1 = entropy_minirand(); #endif /* HAS_GETUID */ -#ifdef HAS_GETPPID - sha1_feed_ulong(&ctx, getppid()); -#endif /* HAS_GETPPID */ - sha1_feed_ulong(&ctx, getpid()); - sha1_feed_ulong(&ctx, getdtablesize()); - sha1_feed_string(&ctx, __DATE__); - sha1_feed_string(&ctx, __TIME__); - sha1_feed_string(&ctx, - "$Id$"); + entropy_array_ulong_collect(ctx, id, N_ITEMS(id)); +} + +/** + * Collect process ID information + */ +static void +entropy_collect_process_id(SHA1_context *ctx) +{ + unsigned long id2; + + id0 = getppid(); + id1 = getpid(); + + entropy_array_ulong_collect(ctx, id, N_ITEMS(id)); +} + +/** + * Collect compile-time information. + */ +static void +entropy_collect_compile_time(SHA1_context *ctx) +{ + const char *str2; + + str0 = __DATE__; + str1 = __TIME__; + + entropy_array_string_collect(ctx, str, N_ITEMS(str)); +} + +/** + * Collect user information. + */ +static void +entropy_collect_user(SHA1_context *ctx) +{ + const char *str3; + + str0 = gethomedir(); #if GLIB_CHECK_VERSION(2,6,0) /* @@ -222,138 +614,1247 @@ * systems as they trigger a bug in GLib causing a crash. On Darwin * there's still a problem before GLib 2.6 due to a bug in Darwin though. */ - sha1_feed_string(&ctx, g_get_user_name()); - sha1_feed_string(&ctx, g_get_real_name()); + + str1 = g_get_user_name(); + str2 = g_get_real_name(); + entropy_array_string_collect(ctx, str, N_ITEMS(str)); +#else + { + char userUINT32_DEC_BUFLEN; + char realUINT32_DEC_BUFLEN; + + uint32_to_string_buf(entropy_minirand(), user, sizeof user); + uint32_to_string_buf(entropy_minirand(), real, sizeof real); + str1 = user; + str2 = real; + entropy_array_string_collect(ctx, str, N_ITEMS(str)); + } #endif /* GLib >= 2.0 */ +} +/** + * Collect login information. + */ +static void +entropy_collect_login(SHA1_context *ctx) +{ #ifdef HAS_GETLOGIN { const char *name = getlogin(); - sha1_feed_string(&ctx, name); - sha1_feed_pointer(&ctx, name); /* name points to static data */ + sha1_feed_string(ctx, name); + sha1_feed_pointer(ctx, name); /* name points to static data */ } +#else + sha1_feed_uint(ctx, entropy_minirand()); #endif /* HAS_GETLOGIN */ +} -#ifdef HAS_GETUID +/** + * Collect information from /etc/passwd. + */ +static void +entropy_collect_pw(SHA1_context *ctx) +{ +#ifdef HAS_GETPWUID { const struct passwd *pp = getpwuid(getuid()); - sha1_feed_pointer(&ctx, pp); /* pp points to static data */ + sha1_feed_pointer(ctx, pp); /* pp points to static data */ if (pp != NULL) { - SHA1Input(&ctx, pp, sizeof *pp); + SHA1_INPUT(ctx, *pp); } else { - sha1_feed_ulong(&ctx, errno); + sha1_feed_errno(ctx); } } -#endif /* HAS_GETUID */ +#else + sha1_feed_uint(ctx, entropy_minirand()); +#endif /* HAS_GETPWUID */ +} + +/** + * Collect information from file system. + */ +static void +entropy_collect_filesystem(SHA1_context *ctx) +{ + const char *pathRANDOM_SHUFFLE_MAX; + size_t i = 0; + + pathi++ = gethomedir(); + pathi++ = "."; + pathi++ = ".."; + pathi++ = "../.."; + pathi++ = "../../.."; + pathi++ = "/"; - sha1_feed_string(&ctx, eval_subst("~")); - sha1_feed_stat(&ctx, eval_subst("~")); - sha1_feed_stat(&ctx, "."); - sha1_feed_stat(&ctx, ".."); - sha1_feed_stat(&ctx, "/"); if (is_running_on_mingw()) { - sha1_feed_stat(&ctx, "C:/"); - sha1_feed_stat(&ctx, "C:/Windows"); - sha1_feed_stat(&ctx, mingw_getpersonal()); - /* FIXME: These paths are valid for English installations only! */ - sha1_feed_stat(&ctx, "C:/Windows/Temp"); - sha1_feed_stat(&ctx, "C:/Program Files"); - sha1_feed_stat(&ctx, "C:/Program Files (x86)"); - sha1_feed_stat(&ctx, "C:/Users"); - sha1_feed_stat(&ctx, "C:/Documents and Settings"); + pathi++ = "C:/"; + pathi++ = "C:/WINDOWS/Temp"; + pathi++ = mingw_get_admin_tools_path(); + pathi++ = mingw_get_common_appdata_path(); + pathi++ = mingw_get_common_docs_path(); + pathi++ = mingw_get_cookies_path(); + pathi++ = mingw_get_fonts_path(); + pathi++ = mingw_get_history_path(); + pathi++ = mingw_get_home_path(); + pathi++ = mingw_get_internet_cache_path(); + pathi++ = mingw_get_mypictures_path(); + pathi++ = mingw_get_personal_path(); + pathi++ = mingw_get_program_files_path(); + pathi++ = mingw_get_startup_path(); + pathi++ = mingw_get_system_path(); + pathi++ = mingw_get_windows_path(); } else { - sha1_feed_stat(&ctx, "/bin"); - sha1_feed_stat(&ctx, "/boot"); - sha1_feed_stat(&ctx, "/dev"); - sha1_feed_stat(&ctx, "/etc"); - sha1_feed_stat(&ctx, "/home"); - sha1_feed_stat(&ctx, "/lib"); - sha1_feed_stat(&ctx, "/mnt"); - sha1_feed_stat(&ctx, "/opt"); - sha1_feed_stat(&ctx, "/proc"); - sha1_feed_stat(&ctx, "/root"); - sha1_feed_stat(&ctx, "/sbin"); - sha1_feed_stat(&ctx, "/sys"); - sha1_feed_stat(&ctx, "/tmp"); - sha1_feed_stat(&ctx, "/usr"); - sha1_feed_stat(&ctx, "/var"); - } - - sha1_feed_fstat(&ctx, STDIN_FILENO); - sha1_feed_fstat(&ctx, STDOUT_FILENO); - sha1_feed_fstat(&ctx, STDERR_FILENO); - - sha1_feed_double(&ctx, fs_free_space_pct(eval_subst("~"))); - sha1_feed_double(&ctx, fs_free_space_pct("/")); - sha1_feed_double(&ctx, fs_free_space_pct(".")); - -#ifdef HAS_UNAME - { - struct utsname un; - - if (-1 != uname(&un)) { - SHA1Input(&ctx, &un, sizeof un); - } + pathi++ = "/bin"; + pathi++ = "/boot"; + pathi++ = "/dev"; + pathi++ = "/etc"; + pathi++ = "/home"; + pathi++ = "/lib"; + pathi++ = "/mnt"; + pathi++ = "/opt"; + pathi++ = "/proc"; + pathi++ = "/root"; + pathi++ = "/sbin"; + pathi++ = "/sys"; + pathi++ = "/tmp"; + pathi++ = "/usr"; + pathi++ = "/var"; + pathi++ = "/var/run"; } -#endif /* HAS_UNAME */ - - sha1_feed_pointer(&ctx, &ctx); - sha1_feed_pointer(&ctx, cast_func_to_pointer(&entropy_collect)); - sha1_feed_pointer(&ctx, cast_func_to_pointer(&exit)); /* libc */ - sha1_feed_pointer(&ctx, &errno); - sha1_feed_pointer(&ctx, vmm_trap_page()); - { - extern char **environ; - size_t i; - for (i = 0; NULL != environi; i++) { - sha1_feed_string(&ctx, environi); - } - sha1_feed_ulong(&ctx, i); - } + g_assert(i <= N_ITEMS(path)); -#ifdef HAS_TTYNAME - sha1_feed_string(&ctx, ttyname(STDIN_FILENO)); -#endif /* HAS_TTYNAME */ + entropy_array_stat_collect(ctx, path, i); + entropy_array_statvfs_collect(ctx, path, i); +} + +/** + * Collect entropy from standard file descriptors. + */ +static void +entropy_collect_stdio(SHA1_context *ctx) +{ + int fd3; + + fd0 = STDIN_FILENO; + fd1 = STDOUT_FILENO; + fd2 = STDERR_FILENO; + + entropy_array_fstat_collect(ctx, fd, N_ITEMS(fd)); +} + +/** + * Collect entropy from available space on filesystem. + */ +static void +entropy_collect_free_space(SHA1_context *ctx) +{ + double fs3; + fs0 = fs_free_space_pct(gethomedir()); + fs1 = fs_free_space_pct("/"); + fs2 = fs_free_space_pct("."); + + entropy_array_double_collect(ctx, fs, N_ITEMS(fs)); +} + +/** + * Collect entropy from used CPU time. + */ +static void +entropy_collect_usage(SHA1_context *ctx) +{ #ifdef HAS_GETRUSAGE { struct rusage usage; if (-1 != getrusage(RUSAGE_SELF, &usage)) { - SHA1Input(&ctx, &usage, sizeof usage); + SHA1_INPUT(ctx, usage); + } else { + sha1_feed_errno(ctx); } } +#else + sha1_feed_uint(ctx, entropy_minirand()); #endif /* HAS_GETRUSAGE */ +} - /* - * Add timing entropy. - */ - +/** + * Collect entropy from system name. + */ +static void +entropy_collect_uname(SHA1_context *ctx) +{ +#ifdef HAS_UNAME { - double u, s; - tm_t before, after; + struct utsname un; + + if (-1 != uname(&un)) { + SHA1_INPUT(ctx, un); + } else { + sha1_feed_errno(ctx); + } + } +#else + sha1_feed_uint(ctx, entropy_minirand()); +#endif /* HAS_UNAME */ +} + +/** + * Collect entropy from terminal line name. + */ +static void +entropy_collect_ttyname(SHA1_context *ctx) +{ +#ifdef HAS_TTYNAME + sha1_feed_string(ctx, ttyname(STDIN_FILENO)); +#else + sha1_feed_uint(ctx, entropy_minirand()); +#endif /* HAS_TTYNAME */ +} + +/** + * Collect entropy from amount of files we can open. + */ +static void +entropy_collect_file_amount(SHA1_context *ctx) +{ + sha1_feed_uint(ctx, getdtablesize()); +} + +/** + * Collect entropy from constant pointers. + */ +static void +entropy_collect_pointers(SHA1_context *ctx) +{ + void *ptr6; + + ptr0 = ctx; + ptr1 = cast_func_to_pointer(&entropy_collect); + ptr2 = cast_func_to_pointer(&entropy_collect_pointers); + ptr3 = cast_func_to_pointer(&exit); /* libc */ + ptr4 = &errno; + ptr5 = &ptr; + + entropy_array_pointer_collect(ctx, ptr, N_ITEMS(ptr)); +} + +/** + * Collect entropy based on current CPU state. + */ +static void +entropy_collect_cpu(SHA1_context *ctx) +{ + jmp_buf env; + ulong rsizeof(env) / sizeof(ulong); + + /* + * Add local CPU state noise. + */ + + ZERO(&env); /* Avoid uninitialized memory reads */ + + if (Setjmp(env)) { + /* We will never longjmp() back here */ + g_assert_not_reached(); + } + + /* + * Can't call entropy_array_ulong_collect() here since we are also called + * from entropy_seed(), which is used to seed entropy_minirand(). + * Hence we manually shuffle the registers. + */ + + memcpy(r, env, sizeof r); + SHUFFLE_ARRAY_WITH(rand31_u32, r); + + SHA1_INPUT(ctx, env); /* "env" is an array */ + SHA1_INPUT(ctx, r); +} + +/** + * Collect entropy from environment. + */ +static void +entropy_collect_environ(SHA1_context *ctx) +{ + extern char **environ; + size_t i, j; + const char *strRANDOM_SHUFFLE_MAX; + + for (i = 0, j = 0; NULL != environi; i++) { + strj++ = environi; + if (RANDOM_SHUFFLE_MAX == j) { + entropy_array_string_collect(ctx, str, RANDOM_SHUFFLE_MAX); + j = 0; + } + } + if (j != 0) + entropy_array_string_collect(ctx, str, j); + sha1_feed_ulong(ctx, i); +} + +/** + * Collect a few pseudo-random numbers. + */ +static void +entropy_collect_minirand(SHA1_context *ctx) +{ + ulong rnRANDOM_SHUFFLE_MAX; + int i = 0; + + while (i < RANDOM_SHUFFLE_MAX) { + rni++ = entropy_minirand(); + } + + entropy_array_ulong_collect(ctx, rn, N_ITEMS(rn)); +} + +/** + * Collect entropy from current time. + */ +static void +entropy_collect_time(SHA1_context *ctx) +{ + tm_nano_t now; + + tm_precise_time(&now); + SHA1_INPUT(ctx, now); +} + +/** + * Collect stack garbage. + */ +static void +entropy_collect_garbage(SHA1_context *ctx) +{ + ulong garbageRANDOM_SHUFFLE_MAX; /* Left un-initialized on purpose */ + +#ifndef ALLOW_UNINIT_VALUES + ZERO(&garbage); +#endif + + entropy_array_ulong_collect(ctx, garbage, N_ITEMS(garbage)); +} + +/** + * Collect volume entropy. + */ +static void +entropy_collect_vfs(SHA1_context *ctx) +{ + const char *pathRANDOM_SHUFFLE_MAX; + size_t i = 0; + + pathi++ = "."; + pathi++ = "/"; + + if (is_running_on_mingw()) { + pathi++ = "C:/"; + pathi++ = "D:/"; + } else { + pathi++ = "/tmp"; + pathi++ = "/var/run"; + } + + g_assert(i <= N_ITEMS(path)); + + entropy_array_statvfs_collect(ctx, path, i); +} + +/** + * Collect entropy from current thread. + */ +static void +entropy_collect_thread(SHA1_context *ctx) +{ + thread_t th = thread_current(); + + SHA1_INPUT(ctx, th); +} + +/** + * Collect entropy from current IP gateway. + */ +static void +entropy_collect_gateway(SHA1_context *ctx) +{ + host_addr_t addr; + + ZERO(&addr); - sha1_feed_double(&ctx, tm_cputime(&u, &s)); - sha1_feed_double(&ctx, u); - sha1_feed_double(&ctx, s); + if (-1 == getgateway(&addr)) + sha1_feed_errno(ctx); - tm_now_exact(&before); - compat_sleep_ms(250); /* 250 ms */ - tm_now_exact(&after); - sha1_feed_double(&ctx, 0.25 - tm_elapsed_f(&after, &before)); + SHA1_INPUT(ctx, addr); +} + +/** + * Collect entropy from host. + * + * This uses the name of the host. + */ +static void +entropy_collect_host(SHA1_context *ctx) +{ + const char *name; + + name = local_hostname(); + sha1_feed_string(ctx, name); + + /* + * We used to call + * + * name_to_host_addr(name, NET_TYPE_NONE); + * + * to also lookup the host name and get its IP address but depending + * on the DNS configuration, that could cause long delays, even up to + * a timeout, causing the auto-initialization phase to also timeout, + * leading to a crash! + * --RAM, 2016-02-16 + */ +} + +/** + * Collect entropy from VMM information. + */ +static void +entropy_collect_vmm(SHA1_context *ctx) +{ + void *p, *q; + void *ptr3; + + ptr0 = deconstify_pointer(vmm_trap_page()); + ptr1 = p = vmm_alloc(1); + ptr2 = q = vmm_alloc(1); + + entropy_array_pointer_collect(ctx, ptr, N_ITEMS(ptr)); + + vmm_free(p, 1); + vmm_free(q, 1); +} + +/** + * Collect entropy based on CPU time used and scheduling delays. + */ +static void +entropy_collect_timing(SHA1_context *ctx, bool slow) +{ + double v4; + tm_nano_t before, after; + + tm_precise_time(&before); + + v0 = tm_cputime(&v1, &v2); + + if (slow) { + compat_usleep_nocancel(2000); /* 2 ms */ + } else { + entropy_delay(); /* create small, unpredictable delay */ } - tm_now_exact(&end); - SHA1Input(&ctx, &end, sizeof end); - sha1_feed_double(&ctx, tm_elapsed_f(&end, &start)); + tm_precise_time(&after); + v3 = tm_precise_elapsed_f(&after, &before); + + entropy_array_double_collect(ctx, v, N_ITEMS(v)); +} + +/** + * Feed the (shuffled) SHA1 context to itself. + */ +static void +entropy_self_feed(SHA1_context *ctx) +{ + char cbytessizeof(SHA1_context); + int i; + + /* + * Because there are about 108 bytes to shuffle, rand31_u32() + * is a poor source of randomness: we don't have enough bits + * of context to produce all the combinations. Therefore, the + * shuffling is biased. + * + * To randomize things a little more, we perform our shuffling + * several times. + * + * Here, we want to introduce as much chaos as possible in the original + * seed computation to prevent several computers executing the same + * logic (this program) at around the same time with similar machines + * from producing the same seed. + * + * We cannot use entropy_minirand() to shuffle since we can be called + * from entropy_seed() when we're precisely seeding the initial context + * used by entropy_minirand(). + */ + + memcpy(cbytes, ctx, sizeof cbytes); + for (i = 0; i < 7; i++) { + tm_nano_t now; + tm_precise_time(&now); + rand31_addrandom(&now, sizeof now); + SHUFFLE_ARRAY_WITH(rand31_u32, cbytes); + } + SHA1_INPUT(ctx, cbytes); +} + +/** + * Collect entropy and fill supplied SHA1 buffer with 160 random bits. + * + * @param digest where generated random 160 bits are output + * @param can_malloc if FALSE, make sure we never malloc() + * @param slow whether we can sleep for 2 ms + * + * @attention + * This is a slow operation, and the routine can even sleep for 2 ms, so it + * must be called only when a truly random seed is required, ideally only + * during initialization. + */ +void G_COLD +entropy_collect_internal(sha1_t *digest, bool can_malloc, bool slow) +{ + static tm_nano_t last; + SHA1_context ctx; + tm_nano_t start, end; + entropy_cb_t fnRANDOM_SHUFFLE_MAX; + size_t i = 0; + + /* + * Get random entropy from the system. + */ + + tm_precise_time(&start); + + SHA1_reset(&ctx); + SHA1_INPUT(&ctx, start); + + if (can_malloc) { + fni++ = entropy_collect_randomness; + fni++ = entropy_collect_user; + fni++ = entropy_collect_login; + fni++ = entropy_collect_pw; + fni++ = entropy_collect_filesystem; + fni++ = entropy_collect_free_space; + fni++ = entropy_collect_ttyname; + fni++ = entropy_collect_vmm; + fni++ = entropy_collect_thread; + fni++ = entropy_collect_gateway; + fni++ = entropy_collect_host; + fni++ = entropy_collect_vfs; + + g_assert(i <= N_ITEMS(fn)); + } + + fni++ = entropy_collect_cpu; + fni++ = entropy_collect_environ; + fni++ = entropy_collect_user_id; + fni++ = entropy_collect_process_id; + fni++ = entropy_collect_compile_time; + fni++ = entropy_collect_stdio; + fni++ = entropy_collect_usage; + fni++ = entropy_collect_uname; + fni++ = entropy_collect_pointers; + fni++ = entropy_collect_file_amount; + fni++ = entropy_collect_minirand; + fni++ = entropy_collect_time; + fni++ = entropy_collect_garbage; + fni++ = entropy_self_feed; + + g_assert(i <= N_ITEMS(fn)); + + entropy_array_cb_collect(&ctx, fn, i); + + /* + * Finish by collecting various information that cannot be easily + * dispatched randomly due to parameters or conditions. + */ + + entropy_collect_timing(&ctx, slow); + + { + double v2; + + v0 = tm_precise_elapsed_f(&start, &last); + last = start; /* struct copy */ + + tm_precise_time(&end); + SHA1_INPUT(&ctx, end); + v1 = tm_precise_elapsed_f(&end, &start); + + entropy_array_double_collect(&ctx, v, N_ITEMS(v)); + } /* * Done, finalize SHA1 computation into supplied digest buffer. */ - SHA1Result(&ctx, digest); + SHA1_result(&ctx, digest); + + /* + * Merge entropy from all the previous calls to make this as unique + * a random bitstream as possible. + */ + + entropy_merge(digest); +} + +/** + * Randomly feed the SHA1 context to itself 20% of the time. + */ +static void G_COLD +entropy_self_feed_maybe(SHA1_context *ctx) +{ + if (random_upto(rand31_u32, 999) < 200) + entropy_self_feed(ctx); +} + +/** + * Seed the entropy_minirand() context variable, once. + * + * We're collecting changing and contextual data, to be able to compute an + * initial 160-bit value, which is better than the default zero value. + */ +static void G_COLD +entropy_seed(struct entropy_minictx *c) +{ + extern char **environ; + ulong garbage16; /* Left uninitialized on purpose */ + const char *strRANDOM_SHUFFLE_MAX; + SHA1_context ctx; + size_t i, j; + tm_nano_t now; + + /* + * This routine must not allocate any memory because it will be called + * very early during initialization. + */ + +#define ENTROPY_CONTEXT_FEED entropy_self_feed_maybe(&ctx) + +#define ENTROPY_SHUFFLE_FEED(a, f) G_STMT_START { \ + size_t x; \ + SHUFFLE_ARRAY_WITH(rand31_u32, a); \ + for (x = 0; x < N_ITEMS(a); x++) \ + f(&ctx, ax); \ + ENTROPY_CONTEXT_FEED; \ +} G_STMT_END + + SHA1_reset(&ctx); + + tm_precise_time(&now); /* Do not use tm_now_exact(), it's too soon */ + SHA1_INPUT(&ctx, now); + + j = popcount(now.tv_nsec); + for (i = 0; i <= j; i++) { + ENTROPY_CONTEXT_FEED; + } + + { + ulong along = { now.tv_sec, now.tv_nsec, + getpid(), getppid(), getuid(), getgid() }; + ENTROPY_SHUFFLE_FEED(along, sha1_feed_ulong); + } + + entropy_collect_cpu(&ctx); + ENTROPY_CONTEXT_FEED; + + { + int afd3 = { STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO }; + ENTROPY_SHUFFLE_FEED(afd, sha1_feed_fstat); + } + + /* Reseed the rand31 PRNG */ + + { + sha1_t hash; + uint8 dataSHA1_RAW_SIZE; + + SHA1_intermediate(&ctx, &hash); + memcpy(data, &hash, sizeof data); + SHUFFLE_ARRAY_WITH(rand31_u32, data); + SHA1_INPUT(&ctx, data); + tm_precise_time(&now); + SHA1_INPUT(&ctx, now); + SHA1_intermediate(&ctx, &hash); + rand31_set_seed(peek_be32(&hash)); + } + + for (i = 0, j = 0; NULL != environi; i++) { + strj++ = environi; + if (RANDOM_SHUFFLE_MAX == j) { + ENTROPY_SHUFFLE_FEED(str, sha1_feed_string); + j = 0; + } + } + sha1_feed_ulong(&ctx, i); + if (j != 0) { + shuffle_with(rand31_u32, str, j, sizeof str0); + for (i = 0; i < j; i++) { + sha1_feed_string(&ctx, stri); + } + } + ENTROPY_CONTEXT_FEED; + + { + void *aptr = { environ, &now, sbrk(0), entropy_seed }; + ENTROPY_SHUFFLE_FEED(aptr, sha1_feed_pointer); + } + +#ifdef MINGW32 +#define ENTROPY_TMP "C:/WINDOWS/Temp" +#define ENTROPY_VAR "D:/" +#else +#define ENTROPY_TMP "/tmp" +#define ENTROPY_VAR "/var" +#endif + + { + const char *astr = + { ".", "..", "../..", "../../..", "/", ENTROPY_TMP, ENTROPY_VAR }; + ENTROPY_SHUFFLE_FEED(astr, sha1_feed_stat); + } + +#ifndef ALLOW_UNINIT_VALUES + ZERO(&garbage); +#endif + + SHUFFLE_ARRAY_WITH(rand31_u32, garbage); + SHA1_INPUT(&ctx, garbage); + ENTROPY_CONTEXT_FEED; + + entropy_delay(); + tm_precise_time(&now); + SHA1_INPUT(&ctx, now); + + tm_precise_time(&now); + j = popcount(now.tv_nsec * 11); + for (i = 0; i <= j; i++) { + ENTROPY_CONTEXT_FEED; + } + + /* Partial SHA1 result */ + + { + sha1_t hash; + const void *p = &hash; + uint32 v, n; + + SHA1_intermediate(&ctx, &hash); + p = peek_be32_advance(p, &v); + + entropy_delay(); + tm_precise_time(&now); + n = popcount(peek_be32(p) + now.tv_nsec); + j = UINT32_ROTR(v, n) & 0xff; + for (i = 0; i <= j; i++) { + ENTROPY_CONTEXT_FEED; + } + + SHA1_intermediate(&ctx, &hash); + sha1_feed_uint(&ctx, peek_be32(&hash)); + } + + entropy_delay(); + tm_precise_time(&now); + + { + double r = random_double_generate(rand31_u32); + double usr, sys, cpu = tm_cputime(&usr, &sys); + double adouble6 = { cpu, usr, sys, r, + now.tv_nsec / 101.0, now.tv_nsec / (now.tv_sec + 0.1) }; + ENTROPY_SHUFFLE_FEED(adouble, sha1_feed_double); + } + +#undef ENTROPY_SHUFFLE_FEED +#undef ENTROPY_CONTEXT_FEED + + tm_precise_time(&now); + SHA1_INPUT(&ctx, now); + + { + sha1_t hash; + const void *p = &hash; + uint32 v; + + SHA1_result(&ctx, &hash); + p = peek_be32_advance(p, &c->x); + p = peek_be32_advance(p, &c->y); + p = peek_be32_advance(p, &c->z); + p = peek_be32_advance(p, &v); + c->c = (v ^ peek_be32(p)) % ENTROPY_KISS_MULT; + + /* + * The `y' context variable must not be seeded with zero, or it + * will only produce zeroes. Find another random value. + */ + + for (v = 0; v < 100 && 0 == c->y; v++) { + c->y = rand31_u32(); + } + + if (0 == c->y) + s_error("%s(): no luck with rand31_u32()", G_STRFUNC); + } +} + +/** + * Fold extra entropy bytes in place, putting result in the trailing n bytes. + * + * @return pointer to the start of the folded trailing n bytes in the digest. + */ +static void * +entropy_fold(sha1_t *digest, size_t n) +{ + sha1_t result; + bigint_t h, v; + + g_assert(size_is_non_negative(n)); + g_assert(n < SHA1_RAW_SIZE); + + bigint_use(&v, &result, SHA1_RAW_SIZE); + bigint_use(&h, digest, SHA1_RAW_SIZE); + + bigint_zero(&v); + + while (!bigint_is_zero(&h)) { + bigint_add(&v, &h); + bigint_rshift_bytes(&h, n); + } + + bigint_copy(&h, &v); + + return &digest->dataSHA1_RAW_SIZE - n; +} + +/** + * Functions to call when entropy information is needed. + */ +struct entropy_ops { + void (*ent_collect)(sha1_t *digest); + void (*ent_mini_collect)(sha1_t *digest); + uint32 (*ent_random)(void); + void (*ent_fill)(void *buffer, size_t len); +}; + +static struct entropy_ops entropy_ops; + +/** + * Internal wrapper to collect 160 bits of entropy via AJE. + */ +static void +entropy_aje_collect(sha1_t *digest) +{ + aje_random_bytes(digest, sizeof *digest); +} + +/** + * When AJE (Alea Jacta Est) has been initialized, we can use it as our main + * entropy source. Hence redirect all entropy requests to that layer. + */ +void G_COLD +entropy_aje_inited(void) +{ + entropy_ops.ent_collect = entropy_aje_collect; + entropy_ops.ent_mini_collect = entropy_aje_collect; + entropy_ops.ent_random = aje_rand_strong; + entropy_ops.ent_fill = aje_random_bytes; + atomic_mb(); +} + +/** + * Collect entropy and fill supplied SHA1 buffer with 160 random bits. + * + * It should be called only when a truly random seed is required, ideally only + * during initialization. + * + * @attention + * This is a slow operation, and the routine will even sleep for 2 ms the + * first time it is invoked. + */ +static void G_COLD +entropy_do_collect(sha1_t *digest) +{ + static bool done; + + misc_init(); /* Required since we have to call parse_uint32() */ + + entropy_collect_internal(digest, TRUE, !done); + done = TRUE; +} + +/** + * Collect minimal entropy, making sure no memory is allocated, and fill + * supplied SHA1 buffer with 160 random bits. + * + * @attention + * This is a slow operation, so it must be called only when a truly random + * seed is required. + */ +static void G_COLD +entropy_do_minimal_collect(sha1_t *digest) +{ + entropy_collect_internal(digest, FALSE, FALSE); +} + +/** + * Random number generation based on entropy collection (without any memory + * allocation). + * + * This is a strong random number generator, but it is very slow and should + * be reserved to low-level initializations, before the ARC4 random number + * has been properly seeded. + * + * @return 32-bit random number. + */ +static uint32 +entropy_do_random(void) +{ + static sha1_t digest; + static void *p = &digest; + static spinlock_t entropy_random_slk = SPINLOCK_INIT; + uint32 rnd; + + /* + * Collect entropy again once we have exhausted reading from the pool. + */ + + spinlock_hidden(&entropy_random_slk); + + if G_UNLIKELY(&digest == p) { + sha1_t tmp; + + spinunlock_hidden(&entropy_random_slk); + + entropy_minimal_collect(&tmp); + + spinlock_hidden(&entropy_random_slk); + + digest = tmp; /* struct copy */ + p = ptr_add_offset(&digest, sizeof digest); + } + + /* + * Get the next 32-bit value from the pool, moving right to left. + */ + + p = ptr_add_offset(p, -4); + rnd = peek_be32(p); + + spinunlock_hidden(&entropy_random_slk); + + return rnd; +} + +/** + * Fill supplied buffer with random entropy bytes. + * + * Memory allocation may happen during this call. + * + * @param buffer buffer to fill + * @param len buffer length, in bytes + */ +static void +entropy_do_fill(void *buffer, size_t len) +{ + size_t complete, partial, i; + void *p = buffer; + + g_assert(buffer != NULL); + g_assert(size_is_non_negative(len)); + + complete = len / SHA1_RAW_SIZE; + partial = len - complete * SHA1_RAW_SIZE; + + for (i = 0; i < complete; i++) { + sha1_t digest; + + entropy_collect(&digest); + p = mempcpy(p, &digest, SHA1_RAW_SIZE); + } + + if (partial != 0) { + sha1_t digest; + void *folded; + + entropy_collect(&digest); + folded = entropy_fold(&digest, partial); + p = mempcpy(p, folded, partial); + } + + g_assert(ptr_diff(p, buffer) == len); +} + +/** + * Collect entropy and fill supplied SHA1 buffer with 160 random bits. + * + * It should be called only when a truly random seed is required, ideally only + * during initialization. + * + * @attention + * This is a slow operation, and the routine will even sleep for 2 ms the + * first time it is invoked. + * + * @note + * Once AJE has been initialized, this is transparently re-routed there and + * the call becomes more efficient by several orders of magnitude! + */ +void G_COLD +entropy_collect(sha1_t *digest) +{ + return entropy_ops.ent_collect(digest); +} + +/** + * Collect minimal entropy, making sure no memory is allocated, and fill + * supplied SHA1 buffer with 160 random bits. + * + * @attention + * This is a slow operation, so it must be called only when a truly random + * seed is required. + * + * @note + * Once AJE has been initialized, this is transparently re-routed there and + * the call becomes more efficient by several orders of magnitude! + */ +void G_COLD +entropy_minimal_collect(sha1_t *digest) +{ + return entropy_ops.ent_mini_collect(digest); +} + +/** + * Random number generation based on entropy collection (without any memory + * allocation). + * + * This is a strong random number generator, but it is very slow and should + * be reserved to low-level initializations, before the ARC4 random number + * has been properly seeded. + * + * @note + * Once AJE has been initialized, this is transparently re-routed there and + * the call becomes more efficient by several orders of magnitude! + * + * @return 32-bit random number. + */ +uint32 +entropy_random(void) +{ + return entropy_ops.ent_random(); +} + +/** + * Fill supplied buffer with random entropy bytes. + * + * Memory allocation may happen during this call. + * + * @note + * Once AJE has been initialized, this is transparently re-routed there. + * + * @param buffer buffer to fill + * @param len buffer length, in bytes + */ +void +entropy_fill(void *buffer, size_t len) +{ + return entropy_ops.ent_fill(buffer, len); +} + +static struct entropy_ops entropy_ops = { + entropy_do_collect, /* ent_collect */ + entropy_do_minimal_collect, /* ent_mini_collect */ + entropy_do_random, /* ent_random */ + entropy_do_fill, /* ent_fill */ +}; + +/** + * Get the entropy nonce, a number used to alter time-based entropy collection + * in a way that cannot be guessed by an outsider. + * + * @return the nonce to use for the session + */ +static uint32 +entropy_nonce(void) +{ + static uint32 base; + static int nused; + int c; + + c = atomic_int_inc(&nused); + + /* + * Should two threads collide and reach the maximum base usage time, + * we want them to both recompute the base. Sure, we could make the + * first thread do that only by using an equality test, but this adds + * more entropy because the computation becomes less deterministic due + * to the possible lock contentions. + */ + + if G_UNLIKELY(0 == base || ENTROPY_NONCE_MAX <= c) { + static spinlock_t base_slk = SPINLOCK_INIT; + uint32 newbase; + + do { + newbase = entropy_random(); + } while (0 == newbase); + + spinlock_hidden(&base_slk); + base = newbase; + nused = 0; + spinunlock_hidden(&base_slk); + } + + return base + c; /* Number used once */ +} + +/** + * Compute hash of current time, using the most precise clock time we have. + */ +static uint32 +entropy_clock_time(void) +{ + tm_nano_t now; + + tm_precise_time(&now); + + return integer_hash_fast(now.tv_nsec) + + integer_hash_fast(now.tv_sec) + entropy_nonce(); +} + +/** + * Harvest entropy from the current time. + */ +void +entropy_harvest_time(void) +{ + uint16 rnd = entropy_clock_time(); + + random_pool_append(&rnd, sizeof rnd); +} + +/** + * Harvest entropy from a single value. + * + * @param p pointer to value from which we want to harvest entropy + * @param len length of the data to read + */ +void +entropy_harvest_single(const void *p, size_t len) +{ + g_assert(p != NULL); + g_assert(size_is_positive(len)); + + if (len <= sizeof(long)) { + entropy_harvest_small(p, len, NULL); + } else { + entropy_harvest_many(p, len, NULL); + } +} + +/** + * Harvest entropy from a NULL-terminated list of (pointer, length). + * + * The overall entropy is supposed to be poor and is therefore limited + * to the collection of 4 bytes, using a CRC32 computation. + * + * @param p pointer to first value + * @param len length of first value + * @param ... NULL-terminated list of (p, len) + */ +void +entropy_harvest_small(const void *p, size_t len, ...) +{ + uint32 c, h; + va_list ap; + + g_assert(p != NULL); + g_assert(size_is_positive(len)); + + h = entropy_clock_time(); + c = crc32_update(-1U, VARLEN(h)); + c = crc32_update(c, p, len); + + va_start(ap, len); + + for ( + p = va_arg(ap, const void *); + p != NULL; + p = va_arg(ap, const void *) + ) { + len = va_arg(ap, size_t); + g_assert(size_is_positive(len)); + c = crc32_update(c, p, len); + } + + va_end(ap); + + random_pool_append(&c, sizeof c); +} + +/** + * Harvest entropy from a NULL-terminated list of (pointer, length). + * + * The overall entropy is supposed to be large and is therefore harvested + * through a SHA1 computation. + * + * @param p pointer to first value + * @param len length of first value + * @param ... NULL-terminated list of (p, len) + */ +void +entropy_harvest_many(const void *p, size_t len, ...) +{ + sha1_t digest; + SHA1_context ctx; + tm_nano_t now; + uint32 nonce; + size_t runlen = 0; + va_list ap; + + g_assert(p != NULL); + g_assert(size_is_positive(len)); + + tm_precise_time(&now); + nonce = entropy_nonce(); + + SHA1_reset(&ctx); + SHA1_INPUT(&ctx, nonce); + SHA1_INPUT(&ctx, now); + SHA1_input(&ctx, p, len); + runlen = len; + + va_start(ap, len); + + for ( + p = va_arg(ap, const void *); + p != NULL; + p = va_arg(ap, const void *) + ) { + len = va_arg(ap, size_t); + g_assert(size_is_positive(len)); + SHA1_input(&ctx, p, len); + runlen = size_saturate_add(runlen, len); + } + + va_end(ap); + + SHA1_result(&ctx, &digest); + + /* + * If we have collected data from enough bytes, we can use the full + * digest to add randomness. Otherwise, fold the digest to limit + * the amount of entropy added each time. However, we collect at least + * 4 bytes each time. + */ + + if (runlen < ENTROPY_ALPHA * SHA1_RAW_SIZE) { + size_t l = runlen / ENTROPY_ALPHA; + void *q = entropy_fold(&digest, (l = MAX(l, 4))); + + random_pool_append(q, l); + } else { + random_pool_append(&digest, sizeof digest); + } } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/entropy.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/entropy.h
Changed
@@ -25,7 +25,7 @@ * @ingroup lib * @file * - * Entropy collection. + * Entropy collection, during bootstrapping. * * @author Raphael Manfredi * @date 2008 @@ -37,6 +37,19 @@ struct sha1; void entropy_collect(struct sha1 *digest); +void entropy_minimal_collect(struct sha1 *digest); +uint32 entropy_random(void); +uint32 entropy_minirand(void); +void entropy_fill(void *buffer, size_t len); +void entropy_delay(void); +void entropy_aje_inited(); + +void entropy_harvest_time(void); +void entropy_harvest_single(const void *p, size_t len); +void entropy_harvest_small( + const void *p, size_t len, ...) G_NULL_TERMINATED; +void entropy_harvest_many( + const void *p, size_t len, ...) G_NULL_TERMINATED; #endif /* _entropy_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/erbtree.c
Added
@@ -0,0 +1,1175 @@ +/* + * Copyright (C) 2010 Franck Bui-Huu <fbuihuu@gmail.com> + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * This implementation of embedded red-black trees comes from the libtree + * package authored by Franck Bui-Huu, which can be found at: + * + * https://github.com/fbuihuu/libtree.git + * + * Inclusion in gtk-gnutella was done by Raphael Manfredi, with mostly cosmetic + * changes: addition of magic number, counting of items in the tree, order + * of parameters (the target always comes first), assertions, routine + * signatures, etc... + * + * The most radical change is that the comparison routine compares items, not + * embedded nodes, and lookups are done by passing pointers to items, not nodes + * and lookups return pointers to items. This requires the offset of the + * embedded node pointer to be given to the erbtree_init() routine. + * + * Additions were made to introduce generic iterators that handle all the + * items through callbacks: erbtree_foreach() and erbtree_foreach_remove(), + * efficient tree disposal erbtree_discard() and erbtree_discard_with_data() + * and extensions to have a comparison callback take one additional argument + * to suppply context (to allow implementation of red-black trees that can + * store arbitrary data not embedding the rbnode_t structure). + * + * Inspired by the README of libtree: + * + * 1. DESIGN + * + * Here's a list of the major points: + * + * - Nodes of the tree aim to be embedded inside your own structure. + * This removes the need to do some malloc/free during insertion/removal + * operations and saves some space since no allocation infrastructure + * (such as object descriptors or object alignment) is required. + * + * - On most architectures (at least the ones I'm using), pointers have some + * unused bits which can be used to store node's meta-data. This allows us to + * reduce the size of the node structure, and make them as small as possible. + * + * - Traversals in both direction are efficient. + * + * - The trees don't store duplicate keys. It's fairly easy to implement + * duplicate from the user point of view (by having a list at the node for + * instance) and this enables a simple but efficient API (see below). + * + * 2. API + * + * You should never actually need to play with the internal members of + * either tree or node structures. + * + * Nodes are embedded inside your own structure, for example: + * + * struct my_struct { + * int key; + * rbnode_t node; + * }; + * + * A tree needs to be initialized before being used. For example: + * + * erbtree_t tree; + * + * erbtree_init(&tree, cmp_routine, offsetof(struct my_struct, node)); + * + * The user must provide a comparison function. This function will be called + * by the library with two arguments that point to the structures embeding + * the nodes, not the nodes themselves. + * + * For instance, the user must provide a function like this: + * + * int my_cmp(const void *a, const void *b) + * { + * const struct my_struct *p = a, *q = b; + * + * return p->key - q->key; + * } + * + * A set of functions is provided to manipulate trees. All of them take + * only pointers to tree and node structures. They have no idea about the + * user's structures which contain them. + * + * The only exception are lookup routines which take a key, i.e. a pointer + * to the base of the structure that contains the node, NOT the nodes + * themselves. + * + * 3. LOOKUP + * + * If you need to search for the node having a specific key then you need + * to fill up a dummy structure with the key initialized to the value so + * your compare function will successfully compare the passed dummy structure + * with the ones inside the tree. + * + * The lookup routine takes a key as parameter, and returns a pointer to + * the item, or NULL if the key does not exist. It is then possible to get + * the node directly, which is more convenient for traversing. + * + * 4. INSERTION + * + * Trees don't store duplicate keys, since rotations don't preserve the + * binary search tree property in that case. If the user needs to do so, + * then he can keep a separate list of all records having the same key. + * + * This is the reason why the insertion functions do insert a key only if + * the key hasn't been already inserted. Otherwise it's equivalent to a + * lookup operation and the insertion operation just returns the node + * with the same key already inserted, and no insertion happened. At this + * point the user can use a list and append the new node to the list + * given by the returned node. + * + * 5. REMOVAL + * + * For speed reasons, the remove operation assumes that the node was + * already inserted into the tree. + * + * Indeed tree implementations using parent pointers don't need to do any + * lookups to retrieve the node's parent needed during the remove operation. + * + * Therefore you must use the remove operation with an already inserted node. + * + * 6. REPLACE + * + * Since trees don't store duplicate keys, the library provides an operation + * to replace a node with another one whose key is equal to the replaced node. + * + * This operation is faster than remove/insert operations for balanced trees + * since it doesn't need to rebalance the tree. + * + * 7. TRAVERSAL + * + * The API allows you to walk through the tree in sorted order. + * + * For that, you can retrieve the next or the previous of any inserted node. + * You can also get the first (leftmost) and the last (rightmost) node of + * a tree in O(1) because these values are maintained.. + * + * @author Franck Bui-Huu <fbuihuu@gmail.com> + * @date 2010 + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#include "erbtree.h" +#include "unsigned.h" + +#include "override.h" /* Must be the last header included */ + +/* + * rbtree - Implements a red-black tree with parent pointers. + * + * Copyright (C) 2010 Franck Bui-Huu <fbuihuu@gmail.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2 of the + * License. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +/* + * For recall, a red-black tree has the following properties: + * + * 1. All nodes are either BLACK or RED + * 2. The root is BLACK + * 3. Leaves are BLACK + * 4. A RED node has only BLACK children + * 5. Paths from a node to any leaf have the same number of BLACK nodes + * + * These properties ensure O(log2 n) complexity for lookups, insertions and + * removals, whilst retaining an O(n) storage space. + * + * This implementation takes a node for removal, not a key, hence it can skip + * the initial node lookup operation. + */ + +enum rbcolor { + RB_INVALID = 0, + RB_BLACK = 1, + RB_RED = 3, +}; + +#define RB_COLOR_MASK 3UL /* Last 2 bits of parent pointer hold color */ + +#define ERBTREE_E(x) ((erbtree_ext_t *) (x)) + +static inline bool +erbtree_is_extended(const erbtree_t * const t) +{ + return t->magic & 0x1; +} + +static inline enum rbcolor +get_color(const rbnode_t *node) +{ + return pointer_to_ulong(node->parent) & RB_COLOR_MASK; +} + +static inline +void set_color(rbnode_t *node, enum rbcolor color) +{ + g_assert(RB_BLACK == color || RB_RED == color); + + node->parent = ulong_to_pointer( + (pointer_to_ulong(node->parent) & ~RB_COLOR_MASK) | color); +} + +static inline +void invalidate(rbnode_t *node) +{ + node->parent = ulong_to_pointer( + (pointer_to_ulong(node->parent) & ~RB_COLOR_MASK)); +} + + +static inline rbnode_t * +get_parent(const rbnode_t *node) +{ + return ulong_to_pointer(pointer_to_ulong(node->parent) & ~RB_COLOR_MASK); +} + +static inline void +set_parent(rbnode_t *node, rbnode_t *parent) +{ + node->parent = ulong_to_pointer( + pointer_to_ulong(parent) | + (pointer_to_ulong(node->parent) & RB_COLOR_MASK) + ); +} + +static inline bool +is_root(const rbnode_t *node) +{ + return get_parent(node) == NULL; +} + +static inline bool +is_black(const rbnode_t *node) +{ + return get_color(node) == RB_BLACK; +} + +static inline bool +is_red(const rbnode_t *node) +{ + return get_color(node) == RB_RED; +} + +static inline bool +is_valid(const rbnode_t *node) +{ + return get_color(node) != RB_INVALID; +} + +/** + * @return amount of items in the tree. + */ +size_t +erbtree_count(const erbtree_t *tree) +{ + erbtree_check(tree); + + return tree->count; +} + +/* + * Iterators + */ + +static inline rbnode_t * +get_first(rbnode_t *node) +{ + while (node->left != NULL) + node = node->left; + return node; +} + +static inline rbnode_t * +get_last(rbnode_t *node) +{ + while (node->right != NULL) + node = node->right; + return node; +} + +/** + * Get next item in the tree, following natural order. + */ +rbnode_t * +erbtree_next(const rbnode_t *node) +{ + rbnode_t *parent; + + g_assert(node != NULL); + + if (node->right != NULL) + return get_first(node->right); + + while (NULL != (parent = get_parent(node)) && parent->right == node) + node = parent; + + return parent; +} + +/** + * Get previous item in the tree, following natural order. + */ +rbnode_t * +erbtree_prev(const rbnode_t *node) +{ + rbnode_t *parent; + + g_assert(node != NULL); + + if (node->left != NULL) + return get_last(node->left); + + while (NULL != (parent = get_parent(node)) && parent->left == node) + node = parent; + return parent; +} + +/** + * Lookup key in the tree. + * + * 'pparent' and 'is_left' are only used for insertions. Normally GCC + * will notice this and get rid of them for lookups. + */ +static inline rbnode_t * +do_lookup(const erbtree_t *tree, const void *key, + rbnode_t **pparent, bool *is_left) +{ + rbnode_t *node = tree->root; + + *pparent = NULL; + *is_left = FALSE; + + while (node != NULL) { + int res; + const void *nbase = const_ptr_add_offset(node, -tree->offset); + res = (*tree->u.cmp)(nbase, key); + if (0 == res) + return node; + *pparent = node; + if ((*is_left = res > 0)) + node = node->left; + else + node = node->right; + } + + return NULL; +} + +/** + * Lookup key in the (extended) tree. + * + * 'pparent' and 'is_left' are only used for insertions. Normally GCC + * will notice this and get rid of them for lookups. + */ +static inline rbnode_t * +do_lookup_ext(const erbtree_ext_t *tree, const void *key, + rbnode_t **pparent, bool *is_left) +{ + rbnode_t *node = tree->root; + + *pparent = NULL; + *is_left = FALSE; + + while (node != NULL) { + int res; + const void *nbase = const_ptr_add_offset(node, -tree->offset); + res = (*tree->u.dcmp)(nbase, key, tree->data); + if (0 == res) + return node; + *pparent = node; + if ((*is_left = res > 0)) + node = node->left; + else + node = node->right; + } + + return NULL; +} + + +/* + * Rotate operations (they preserve the binary search tree property, + * assuming the keys are unique). + */ + +static void +rotate_left(erbtree_t *tree, rbnode_t *node) +{ + rbnode_t *p = node; + rbnode_t *q = node->right; /* can't be NULL */ + rbnode_t *parent = get_parent(p); + + g_assert(q != NULL); + + if (!is_root(p)) { + if (parent->left == p) + parent->left = q; + else + parent->right = q; + } else + tree->root = q; + set_parent(q, parent); + set_parent(p, q); + + p->right = q->left; + if (p->right) + set_parent(p->right, p); + q->left = p; +} + +static void +rotate_right(erbtree_t *tree, rbnode_t *node) +{ + rbnode_t *p = node; + rbnode_t *q = node->left; /* can't be NULL */ + rbnode_t *parent = get_parent(p); + + g_assert(q != NULL); + + if (!is_root(p)) { + if (parent->left == p) + parent->left = q; + else + parent->right = q; + } else + tree->root = q; + set_parent(q, parent); + set_parent(p, q); + + p->left = q->right; + if (p->left != NULL) + set_parent(p->left, p); + q->right = p; +} + +/** + * @param tree the red-black tree + * @param key pointer to the key structure (NOT a node) + * + * @return whether tree contains key. + */ +bool +erbtree_contains(const erbtree_t *tree, const void *key) +{ + rbnode_t *parent; + bool is_left; + + erbtree_check(tree); + g_assert(key != NULL); + + if (erbtree_is_extended(tree)) { + return NULL != do_lookup_ext(ERBTREE_E(tree), key, &parent, &is_left); + } else { + return NULL != do_lookup(tree, key, &parent, &is_left); + } +} + +/** + * Look up key in the tree, returning the associated key item if found. + * + * @param tree the red-black tree + * @param key pointer to the key structure (NOT a node) + * + * @return found item associated with key, NULL if not found. + */ +void * +erbtree_lookup(const erbtree_t *tree, const void *key) +{ + rbnode_t *parent; + bool is_left; + rbnode_t *rn; + + erbtree_check(tree); + g_assert(key != NULL); + + if (erbtree_is_extended(tree)) { + rn = do_lookup_ext(ERBTREE_E(tree), key, &parent, &is_left); + } else { + rn = do_lookup(tree, key, &parent, &is_left); + } + + return NULL == rn ? NULL : ptr_add_offset(rn, -tree->offset); +} + +/** + * Look up key in the tree, returning the associated node pointer. + * + * This interface returns a node and not a key pointer to allow for direct + * traversal or manipulation of the node (removal from tree for instance). + * To simply get the key structure, use erbtree_lookup(). + * + * To get back at the key from the returned node pointer, and assuming items + * in the tree are defined as: + * + * struct item { + * int key; + * <other fields> + * rbnode_t node; + * }; + * + * use the following method: + * + * struct item *item; + * rbnode_t *rn; + * struct item key; + * + * key.key = <some value>; + * rn = erbtreee_getnode(tree, &key); + * item = NULL == rn ? NULL : erbtree_key(rn, struct item, node); + * + * Usage of erbtree_key() should be avoided whenever possible by using + * erbtree_lookup(), and high-level iterators that handle keys directly. + * + * @param tree the red-black tree + * @param key pointer to the key structure (NOT a node) + * + * @return node associated with key, NULL if not found. + */ +rbnode_t * +erbtree_getnode(const erbtree_t *tree, const void *key) +{ + rbnode_t *parent; + bool is_left; + + erbtree_check(tree); + g_assert(key != NULL); + + if (erbtree_is_extended(tree)) { + return do_lookup_ext(ERBTREE_E(tree), key, &parent, &is_left); + } else { + return do_lookup(tree, key, &parent, &is_left); + } +} + +static void +set_child(rbnode_t *node, rbnode_t *child, bool left) +{ + if (left) + node->left = child; + else + node->right = child; +} + +/** + * Insert node in tree. + * + * @return the existing key if the key already existed, NULL if the node + * was properly inserted. + */ +void * G_HOT +erbtree_insert(erbtree_t *tree, rbnode_t *node) +{ + rbnode_t *key, *parent; + const void *kbase; + bool is_left; + + erbtree_check(tree); + g_assert(node != NULL); + + kbase = const_ptr_add_offset(node, -tree->offset); + + if (erbtree_is_extended(tree)) { + key = do_lookup_ext(ERBTREE_E(tree), kbase, &parent, &is_left); + } else { + key = do_lookup(tree, kbase, &parent, &is_left); + } + + if (key != NULL) + return ptr_add_offset(key, -tree->offset); + + g_assert(!is_valid(node)); /* Not yet part of the tree */ + + node->left = NULL; + node->right = NULL; + set_color(node, RB_RED); + set_parent(node, parent); + tree->count++; + + if (parent != NULL) { + if (is_left) { + if (parent == tree->first) + tree->first = node; + } else { + if (parent == tree->last) + tree->last = node; + } + set_child(parent, node, is_left); + } else { + tree->root = node; + tree->first = node; + tree->last = node; + } + + /* + * Fixup the modified tree by recoloring nodes and performing + * rotations (2 at most) hence the red-black tree properties are + * preserved. + */ + + while (NULL != (parent = get_parent(node)) && is_red(parent)) { + rbnode_t *grandpa = get_parent(parent); + + if (parent == grandpa->left) { + rbnode_t *uncle = grandpa->right; + + if (uncle != NULL && is_red(uncle)) { + set_color(parent, RB_BLACK); + set_color(uncle, RB_BLACK); + set_color(grandpa, RB_RED); + node = grandpa; + } else { + if (node == parent->right) { + rotate_left(tree, parent); + node = parent; + parent = get_parent(node); + } + set_color(parent, RB_BLACK); + set_color(grandpa, RB_RED); + rotate_right(tree, grandpa); + } + } else { + rbnode_t *uncle = grandpa->left; + + if (uncle != NULL && is_red(uncle)) { + set_color(parent, RB_BLACK); + set_color(uncle, RB_BLACK); + set_color(grandpa, RB_RED); + node = grandpa; + } else { + if (node == parent->left) { + rotate_right(tree, parent); + node = parent; + parent = get_parent(node); + } + set_color(parent, RB_BLACK); + set_color(grandpa, RB_RED); + rotate_left(tree, grandpa); + } + } + } + set_color(tree->root, RB_BLACK); + return NULL; +} + +/** + * Remove node from tree. + * + * @attention + * It is assumed that the node is already part of the tree. + */ +void G_HOT +erbtree_remove(erbtree_t *tree, rbnode_t *node) +{ + rbnode_t *removed = node; + rbnode_t *parent = get_parent(node); + rbnode_t *left = node->left; + rbnode_t *right = node->right; + rbnode_t *next; + enum rbcolor color; + + erbtree_check(tree); + g_assert(size_is_positive(tree->count)); + g_assert(node != NULL); + g_assert(is_valid(node)); /* Does not verify it is part of THIS tree */ + + tree->count--; + + if (node == tree->first) + tree->first = erbtree_next(node); + if (node == tree->last) + tree->last = erbtree_prev(node); + + if (NULL == left) + next = right; + else if (NULL == right) + next = left; + else + next = get_first(right); + + if (parent != NULL) + set_child(parent, next, parent->left == node); + else + tree->root = next; + + if (left != NULL && right != NULL) { + color = get_color(next); + set_color(next, get_color(node)); + + next->left = left; + set_parent(left, next); + + if (next != right) { + parent = get_parent(next); + set_parent(next, get_parent(node)); + + node = next->right; + parent->left = node; + + next->right = right; + set_parent(right, next); + } else { + set_parent(next, parent); + parent = next; + node = next->right; + } + } else { + color = get_color(node); + node = next; + } + + /* + * 'node' is now the sole successor's child and 'parent' its + * new parent (since the successor can have been moved). + */ + + if (node != NULL) + set_parent(node, parent); + + invalidate(removed); + + /* + * The "easy" cases. + */ + + if (color == RB_RED) + return; + if (node != NULL && is_red(node)) { + set_color(node, RB_BLACK); + return; + } + + do { + if (node == tree->root) + break; + + if (node == parent->left) { + rbnode_t *sibling = parent->right; + + if (is_red(sibling)) { + set_color(sibling, RB_BLACK); + set_color(parent, RB_RED); + rotate_left(tree, parent); + sibling = parent->right; + } + if ( + (NULL == sibling->left || is_black(sibling->left)) && + (NULL == sibling->right || is_black(sibling->right)) + ) { + set_color(sibling, RB_RED); + node = parent; + parent = get_parent(parent); + continue; + } + if (NULL == sibling->right || is_black(sibling->right)) { + set_color(sibling->left, RB_BLACK); + set_color(sibling, RB_RED); + rotate_right(tree, sibling); + sibling = parent->right; + } + set_color(sibling, get_color(parent)); + set_color(parent, RB_BLACK); + set_color(sibling->right, RB_BLACK); + rotate_left(tree, parent); + node = tree->root; + break; + } else { + rbnode_t *sibling = parent->left; + + if (is_red(sibling)) { + set_color(sibling, RB_BLACK); + set_color(parent, RB_RED); + rotate_right(tree, parent); + sibling = parent->left; + } + if ( + (NULL == sibling->left || is_black(sibling->left)) && + (NULL == sibling->right || is_black(sibling->right)) + ) { + set_color(sibling, RB_RED); + node = parent; + parent = get_parent(parent); + continue; + } + if (NULL == sibling->left || is_black(sibling->left)) { + set_color(sibling->right, RB_BLACK); + set_color(sibling, RB_RED); + rotate_left(tree, sibling); + sibling = parent->left; + } + set_color(sibling, get_color(parent)); + set_color(parent, RB_BLACK); + set_color(sibling->left, RB_BLACK); + rotate_right(tree, parent); + node = tree->root; + break; + } + } while (is_black(node)); + + if (node != NULL) + set_color(node, RB_BLACK); +} + +static int +erbtree_cmp(erbtree_t *tree, rbnode_t *a, rbnode_t *b) +{ + const void *p = const_ptr_add_offset(a, -tree->offset); + const void *q = const_ptr_add_offset(b, -tree->offset); + + if (erbtree_is_extended(tree)) { + erbtree_ext_t *etree = ERBTREE_E(tree); + return (*etree->u.dcmp)(p, q, etree->data); + } else { + return (*tree->u.cmp)(p, q); + } +} + +static inline void +erbtree_replace_internal(erbtree_t *tree, + rbnode_t *parent, rbnode_t *old, rbnode_t *new) +{ + if (parent != NULL) + set_child(parent, new, parent->left == old); + else + tree->root = new; + + if (old->left != NULL) + set_parent(old->left, new); + if (old->right != NULL) + set_parent(old->right, new); + + if (tree->first == old) + tree->first = new; + if (tree->last == old) + tree->last = new; +} + +/** + * Replace node in the tree. + * + * Great care must be taken to make sure the order in the tree is preserved. + */ +void +erbtree_replace(erbtree_t *tree, rbnode_t *old, rbnode_t *new) +{ + rbnode_t *prev, *next; + + erbtree_check(tree); + g_assert(old != NULL); + g_assert(new != NULL); + g_assert(old != new); + g_assert(is_valid(old)); + g_assert(!is_valid(new)); + + prev = erbtree_prev(old); + next = erbtree_next(old); + + g_assert(NULL == prev || erbtree_cmp(tree, prev, old) < 0); + g_assert(NULL == next || erbtree_cmp(tree, next, old) > 0); + g_assert(NULL == prev || erbtree_cmp(tree, prev, new) < 0); + g_assert(NULL == next || erbtree_cmp(tree, next, new) > 0); + + erbtree_replace_internal(tree, get_parent(old), old, new); + + *new = *old; + invalidate(old); +} + +struct erbtree_foreach_args { + size_t offset; + data_fn_t cb; + void *data; +}; + +static void +erbtree_foreach_recursive( + const rbnode_t *rn, const struct erbtree_foreach_args *args) +{ + if (rn->left != NULL) + erbtree_foreach_recursive(rn->left, args); + + (*args->cb)(ptr_add_offset((void *) rn, args->offset), args->data); + + if (rn->right != NULL) + erbtree_foreach_recursive(rn->right, args); +} + +/** + * Traverse all the items in the tree, invoking the callback on each item. + * + * @attention + * The tree structure MUST NOT be modified by the callback to add (or remove) + * items. For traversal with optional removal of the current item, use + * erbtree_foreach_remove(). + */ +void +erbtree_foreach(const erbtree_t *tree, data_fn_t cb, void *data) +{ + erbtree_check(tree); + + /* + * Since there is no tree modification during traversal, we can hardwire + * the descent to be more efficient than the non-recursive traversal we + * do in erbtree_foreach_remove(). + */ + + if (tree->root != NULL) { + struct erbtree_foreach_args args; + + args.offset = -tree->offset; + args.cb = cb; + args.data = data; + + erbtree_foreach_recursive(tree->root, &args); + } +} + +/** + * Traverse all the items in the tree, invoking the callback on each item + * and removing it when the callback returns TRUE. + * + * @return the amount of removed items. + */ +size_t +erbtree_foreach_remove(erbtree_t *tree, data_rm_fn_t cbr, void *data) +{ + rbnode_t *rn, *next; + size_t removed = 0, visited = 0; + + erbtree_check(tree); + + for (rn = erbtree_first(tree); rn != NULL; rn = next) { + void *key; + rbnode_t node; + + next = erbtree_next(rn); + key = ptr_add_offset(rn, -tree->offset); + + /* + * Copy node to allow the callback to free the item (since the node + * is embedded within the item structure). This works because the + * erbtree_remove() operation only handles the node and does not care + * about the structure containing it. + */ + + node = *rn; /* Struct copy */ + visited++; + + if ((*cbr)(key, data)) { + /* Tweak tree to remove all references to freed address ``rn'' */ + erbtree_replace_internal(tree, get_parent(&node), rn, &node); + erbtree_remove(tree, &node); + removed++; + } + } + + /* + * Due to rebalancing of tree during removals, it might be possible we do + * not visit all the items due to a traversal bug, so only do a soft assert + * to get a loud trace when that happens. This will not detect duplicate + * node visits negating unvisited nodes, but we're not asserting correctness + * here, just trying to spot obvious misbehaviour. + */ + + g_soft_assert_log(tree->count + removed == visited, + "%s(): count=%zu, visited=%zu (removed=%zu)", + G_STRFUNC, tree->count, visited, removed); + + return removed; +} + +/** + * Recursively free items in the tree via application of given free routine. + */ +static void +erbtree_discard_recursive(erbtree_t *tree, rbnode_t *node, free_fn_t fcb) +{ + void *item; + + if (node->left != NULL) + erbtree_discard_recursive(tree, node->left, fcb); + if (node->right != NULL) + erbtree_discard_recursive(tree, node->right, fcb); + + item = ptr_add_offset(node, -tree->offset); + (*fcb)(item); +} + +/** + * Recursively free items in the tree via application of given free routine + * which takes an additional context argument. + */ +static void +erbtree_discard_recursive_data(erbtree_t *tree, rbnode_t *node, + free_data_fn_t fcb, void *data) +{ + void *item; + + if (node->left != NULL) + erbtree_discard_recursive_data(tree, node->left, fcb, data); + if (node->right != NULL) + erbtree_discard_recursive_data(tree, node->right, fcb, data); + + item = ptr_add_offset(node, -tree->offset); + (*fcb)(item, data); +} + +/** + * Reset tree to the empty state. + */ +static inline void +erbtree_reset(erbtree_t *tree) +{ + tree->root = NULL; + tree->first = NULL; + tree->last = NULL; + tree->count = 0; +} + +/** + * Clear the tree, without discarding the allocated items. + */ +void +erbtree_clear(erbtree_t *tree) +{ + erbtree_check(tree); + + erbtree_reset(tree); +} + +/** + * Free all items in the tree with supplied callback routine. + * + * This is more efficient than running erbtree_foreach_remove() on the + * tree because there is no need to rebalance the tree after each item + * removal. + * + * @param tree the tree where we want to free all the items + * @param fcb free routine invoked on each item + * + * Upon return, the tree is completely empty. + */ +void +erbtree_discard(erbtree_t *tree, free_fn_t fcb) +{ + erbtree_check(tree); + + if (tree->root != NULL) + erbtree_discard_recursive(tree, tree->root, fcb); + + erbtree_reset(tree); +} + +/** + * Free all items in the tree with supplied callback routine. + * + * This is more efficient than running erbtree_foreach_remove() on the + * tree because there is no need to rebalance the tree after each item + * removal. + * + * @param tree the tree where we want to free all the items + * @param fcb free routine invoked on each item + * @param data allocation context passed to the free routine + * + * Upon return, the tree is completely empty. + */ +void +erbtree_discard_with_data(erbtree_t *tree, free_data_fn_t fcb, void *data) +{ + erbtree_check(tree); + + if (tree->root != NULL) + erbtree_discard_recursive_data(tree, tree->root, fcb, data); + + erbtree_reset(tree); +} + +/** + * Initialize embedded tree. + * + * Assuming items in the tree are defined as: + * + * struct item { + * int key; + * <other fields> + * rbnode_t node; + * }; + * + * then the last argument can be given as: + * + * offsetof(struct item, node) + * + * to indicate the place of the node field within the item. + * + * @param tree the tree structure to initialize + * @param cmp the item comparison routine + * @param offset the offset of the embedded node field within items + */ +void +erbtree_init(erbtree_t *tree, cmp_fn_t cmp, size_t offset) +{ + g_assert(tree != NULL); + g_assert(cmp != NULL); + g_assert(size_is_non_negative(offset)); + + tree->magic = ERBTREE_MAGIC; + tree->u.cmp = cmp; + tree->offset = offset; + erbtree_reset(tree); +} + +/** + * Initialize embedded tree with extended comparison function. + * + * This is used for red-black tree containers which can store any data + * and therefore need an additinal argument passed to the comparison routine. + * + * @param tree the tree structure to initialize + * @param cmp the item comparison routine + * @param data the additional argument for the item comparison routine + * @param offset the offset of the embedded node field within items + */ +void erbtree_init_data(erbtree_ext_t *tree, + cmp_data_fn_t cmp, void *data, size_t offset) +{ + g_assert(tree != NULL); + g_assert(cmp != NULL); + g_assert(size_is_non_negative(offset)); + + tree->magic = ERBTREE_EXT_MAGIC; + tree->u.dcmp = cmp; + tree->data = data; + tree->offset = offset; + erbtree_reset((erbtree_t *) tree); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/erbtree.h
Added
@@ -0,0 +1,186 @@ +/* + * Copyright (C) 2010 Franck Bui-Huu <fbuihuu@gmail.com> + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Embedded red-black tree (within another data structure). + * + * @author Franck Bui-Huu <fbuihuu@gmail.com> + * @date 2010 + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _erbtree_h_ +#define _erbtree_h_ + +/** + * These definitions have been stolen from the Linux kernel. + * + * Given a pointer to ``node'', an expanded structure in ``type'' declared + * as ``field'', computes the starting address of the enclosing type. + * + * In other words, if x is a variable of type ``type'', compute &x + * given &x.field, knowing this is the address of the field named ``field''. + * + * @param node the address of ``field'' within ``type'' + * @param type the type of the containing structure containing ``field'' + * @param field the name of the field within ``type'' whose address is ``node'' + * + * @return the starting address of the container for the node, aka the key. + */ +#ifdef __GNUC__ +#define erbtree_key(node, type, field) G_EXTENSION({ \ + const struct rbnode *__mptr = (node); \ + (type *)((char *) __mptr - offsetof(type, field));}) +#else +#define erbtree_key(node, type, field) \ + ((type *)((char *) (node) - offsetof(type, field))) +#endif + +/** + * A node in a red-black tree. + */ +typedef struct rbnode { + struct rbnode *left, *right, *parent; +} G_ALIGNED(4) rbnode_t; + +enum erbtree_magic { + ERBTREE_MAGIC = 0x6483afd6, /* bit 0 clear */ + ERBTREE_EXT_MAGIC = 0x6483afd7 /* bit 0 set */ +}; + +#define ERBTREE_COMMON_ATTRIBUTES \ + enum erbtree_magic magic; \ + rbnode_t *root, *first, *last; \ + union { \ + cmp_fn_t cmp; /* Item comparison routine */ \ + cmp_data_fn_t dcmp; /* Item comparison routine with data */ \ + } u; \ + size_t offset; /* Offset of embedded node in the item structure */ \ + size_t count; /* Amount of items held in tree */ + +/** + * An embedded red-black tree is represented by this structure. + */ +typedef struct erbtree { + ERBTREE_COMMON_ATTRIBUTES +} erbtree_t; + +/** + * An extended embedded red-black tree is represented by this structure. + */ +typedef struct erbtree_ext { + ERBTREE_COMMON_ATTRIBUTES + void *data; /* Additional data for comparison routine */ +} erbtree_ext_t; + +static inline void +erbtree_check(const erbtree_t * const t) +{ + g_assert(t != NULL); + g_assert(ERBTREE_MAGIC == (t->magic & ~0x1)); /* bit 0 is a flag */ +} + +/** + * Public interface. + */ + +void erbtree_init(erbtree_t *tree, cmp_fn_t cmp, size_t offset); +void erbtree_init_data(erbtree_ext_t *tree, + cmp_data_fn_t cmp, void *data, size_t offset); +void erbtree_clear(erbtree_t *tree); + +size_t erbtree_count(const erbtree_t *tree); +rbnode_t *erbtree_next(const rbnode_t *node); +rbnode_t *erbtree_prev(const rbnode_t *node); +bool erbtree_contains(const erbtree_t *tree, const void *key); +void *erbtree_lookup(const erbtree_t *tree, const void *key); +rbnode_t *erbtree_getnode(const erbtree_t *tree, const void *key); +void *erbtree_insert(erbtree_t *tree, rbnode_t *node); +void erbtree_remove(erbtree_t *tree, rbnode_t *node); +void erbtree_replace(erbtree_t *tree, rbnode_t *old, rbnode_t *new); +void erbtree_foreach(const erbtree_t *tree, data_fn_t cb, void *data); +size_t erbtree_foreach_remove(erbtree_t *tree, data_rm_fn_t cbr, void *data); +void erbtree_discard(erbtree_t *tree, free_fn_t fcb); +void erbtree_discard_with_data(erbtree_t *tree, free_data_fn_t fcb, void *data); + +/** + * Computes the data item address given the embedded node pointer. + */ +static inline void * +erbtree_data(const erbtree_t *t, rbnode_t *node) +{ + erbtree_check(t); + return NULL == node ? NULL : ptr_add_offset(node, -t->offset); +} + +/** + * @return pointer to the first item of the tree, NULL if empty. + */ +static inline void * +erbtree_head(const erbtree_t * const t) +{ + erbtree_check(t); + return NULL == t->first ? NULL : ptr_add_offset(t->first, -t->offset); +} + +/** + * @return pointer to the last item of the tree, NULL if empty. + */ +static inline void * +erbtree_tail(const erbtree_t * const t) +{ + erbtree_check(t); + return NULL == t->last ? NULL : ptr_add_offset(t->last, -t->offset); +} + +/** + * Get first (smallest) item in the tree. + */ +static inline rbnode_t * +erbtree_first(const erbtree_t * const t) +{ + erbtree_check(t); + return t->first; +} + +/** + * Get last (bigest) item in the tree. + */ +static inline rbnode_t * +erbtree_last(const erbtree_t * const t) +{ + erbtree_check(t); + return t->last; +} + +#define ERBTREE_FOREACH(tree, rn) \ + for ((rn) = erbtree_first(tree); (rn) != NULL; (rn) = erbtree_next(rn)) + +#endif /* _erbtree_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/eslist.c
Added
@@ -0,0 +1,196 @@ +/* + * Copyright (c) 2012-2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Embedded one-way list (within another data structure). + * + * +-----+ +-----+ +-----+ ^ + * |/////| |/////| |/////| | + * |/////| |/////| |/////| | offset + * |/////| |/////| |/////| | + * +=====+ +=====+ +=====+ v + * | ***-+---->| ***-+---->|(nil)| link offset = 0 + * +=====+ +=====+ +=====+ + * + * Embedded lists are created when the linking pointers are directly + * held within the data structure, as opposed to glib's lists which are + * containers pointing at objects. + * + * Embedded lists are intrusive in the sense that the objects have an explicit + * slink_t field, but this saves one pointer per item being linked compared + * to glib's lists. On the other hand, if an object may belong to several lists + * based on certain criteria, but not all of the lists (and without any mutual + * exclusion), then the embedded list approach is not necessarily saving space + * since some items will have slink_t fields that do not get used. + * + * Due to the nature of the data structure, the definition of the internal + * structures is visible in the header file but users must refrain from + * peeking and poking into the structures. Using embedded data structures + * requires more discipline than opaque data structures. + * + * The API of embedded lists mirrors that of glib's lists to make a smooth + * transition possible and maintain some consistency in the code. That said, + * the glib list API is quite good so mirroring it is not a problem. + * + * @author Raphael Manfredi + * @date 2012-2015 + */ + +#include "common.h" + +#include "eslist.h" + +#include "unsigned.h" +#include "walloc.h" + +#if 0 +#define ESLIST_SAFETY_ASSERT /**< Turn on costly integrity assertions */ +#endif + +#ifdef ESLIST_SAFETY_ASSERT +#define safety_assert(x) g_assert(x) +#else +#define safety_assert(x) +#endif + +/* + * Configure owlist-gen.c for an "eslist". + */ + +#define CHECK(l) eslist_check(l) +#define INVARIANT(l) eslist_invariant(l) +#define CONTAINS(l,v) eslist_contains(l,v) +#define PREFIX eslist_ +#define OWLIST_T eslist_t +#define OWLINK_T slink_t +#define NEXT(l,lk) ((lk)->next) +#define SET_NEXT(l,lk,v) ((lk)->next = (v)) +#define LENGTH(l,h) eslist_length(h) +#define LINK_OFFSET(l) 0 +#define LIST_ARG(l) + +/** + * Initialize embedded list. + * + * Assuming items in the list are defined as: + * + * struct item { + * <data fields> + * slink_t lk; + * }; + * + * then the last argument can be given as: + * + * offsetof(struct item, lk) + * + * to indicate the place of the node field within the item. + * + * @param list the list structure to initialize + * @param offset the offset of the embedded link field within items + */ +void +eslist_init(eslist_t *list, size_t offset) +{ + g_assert(list != NULL); + g_assert(size_is_non_negative(offset)); + + list->magic = ESLIST_MAGIC; + list->head = NULL; + list->tail = NULL; + list->count = 0; + list->offset = offset; +} + +/** + * Free all items in the list, using wfree() on each of them, clearing the list. + * + * Each item must be of the same size and have been allocated via walloc(). + * Each item must have been cleared first, so that any internal memory allocated + * and referenced by the item has been properly released. + * + * This is more efficient that looping over all the items, clearing them and + * then calling wfree() on them because we amortize the wfree() cost over a + * large amount of objects and need to lock/unlock once only, if any lock is + * to be taken. + * + * @param list the list to free + * @param size the size of each item, passed to wfree() + */ +void +eslist_wfree(eslist_t *list, size_t size) +{ + eslist_check(list); + + if G_UNLIKELY(0 == list->count) + return; + + wfree_eslist(list, size); + eslist_clear(list); +} + +#include "owlist-gen.c" + +/* + * These defines are there only for tags + * Routines are defined in owlist-gen.c, as included above + */ + +#define eslist_discard OWLIST_discard +#define eslist_clear OWLIST_clear +#define eslist_link_append_internal OWLIST_link_append_internal +#define eslist_link_append OWLIST_link_append +#define eslist_append OWLIST_append +#define eslist_link_prepend_internal OWLIST_link_prepend_internal +#define eslist_link_prepend OWLIST_link_prepend +#define eslist_prepend OWLIST_prepend +#define eslist_prepend_list OWLIST_prepend_list +#define eslist_append_list OWLIST_append_list +#define eslist_link_remove_after_internal OWLIST_link_remove_after_internal +#define eslist_shift OWLIST_shift +#define eslist_rotate_left OWLIST_rotate_left +#define eslist_link_insert_after_internal OWLIST_link_insert_after_internal +#define eslist_link_insert_after OWLIST_link_insert_after +#define eslist_insert_after OWLIST_insert_after +#define eslist_remove OWLIST_remove +#define eslist_remove_after OWLIST_remove_after +#define eslist_reverse OWLIST_reverse +#define eslist_find OWLIST_find +#define eslist_foreach OWLIST_foreach +#define eslist_foreach_remove OWLIST_foreach_remove +#define eslist_merge_sort OWLIST_merge_sort +#define eslist_sort_internal OWLIST_sort_internal +#define eslist_sort_with_data OWLIST_sort_with_data +#define eslist_sort OWLIST_sort +#define eslist_insert_sorted_internal OWLIST_insert_sorted_internal +#define eslist_insert_sorted_with_data OWLIST_insert_sorted_with_data +#define eslist_insert_sorted OWLIST_insert_sorted +#define eslist_nth OWLIST_nth +#define eslist_nth_next_data OWLIST_nth_next_data +#define eslist_random OWLIST_random +#define eslist_shuffle_with OWLIST_shuffle_with +#define eslist_shuffle OWLIST_shuffle + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/eslist.h
Added
@@ -0,0 +1,302 @@ +/* + * Copyright (c) 2012-2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Embedded one-way list (within another data structure). + * + * @author Raphael Manfredi + * @date 2012-2015 + */ + +#ifndef _eslist_h_ +#define _eslist_h_ + +/** + * Get the enclosing data item from an embedded link. + */ +#ifdef __GNUC__ +#define eslist_item(lnk, type, field) G_EXTENSION({ \ + const struct slink *__mptr = (lnk); \ + (type *)((char *) __mptr - offsetof(type, field));}) +#else +#define eslist_item(lnk, type, field) \ + ((type *)((char *) (node) - offsetof(type, field))) +#endif + +/** + * A list one-way (single) link. + */ +typedef struct slink { + struct slink *next; +} slink_t; + +enum eslist_magic { ESLIST_MAGIC = 0x1662f297 }; + +/** + * An embedded one-way list is represented by this structure. + */ +typedef struct eslist { + enum eslist_magic magic; + slink_t *head, *tail; + size_t offset; /* Offset of embedded slink in the item structure */ + size_t count; /* Amount of items held */ +} eslist_t; + +static inline void +eslist_check(const eslist_t * const es) +{ + g_assert(es != NULL); + g_assert(ESLIST_MAGIC == es->magic); +} + +#define ESLIST_INIT(offset) { ESLIST_MAGIC, NULL, NULL, offset, 0 } + +static inline bool +eslist_invariant(const eslist_t * const list) +{ + g_assert(list->count != 0 || (NULL == list->head && NULL == list->tail)); + g_assert((list->head != list->tail) == (list->count > 1U)); + g_assert(NULL == list->tail || NULL == list->tail->next); + return TRUE; /* So that we can safety_assert() this routine */ +} + +/** + * Public interface. + */ + +/** + * @return whether the embedded list descriptor is non-zero. + */ +static inline bool +eslist_is_initialized(const eslist_t * const es) +{ + return 0 != es->magic; /* Initialized, not necessarily valid! */ +} + +/** + * @return length of embedded list. + */ +static inline size_t +eslist_count(const eslist_t * const es) +{ + eslist_check(es); + return es->count; +} + +/** + * @return length of embedded list by traversing the list from the + * specified link, following forward pointers. + */ +static inline size_t +eslist_length(const slink_t *lk) +{ + size_t n = 0; + + while (lk != NULL) { + n++; + lk = lk->next; + } + + return n; +} + +/** + * @return pointer to first item of list, NULL if empty. + */ +static inline void * +eslist_head(const eslist_t * const es) +{ + eslist_check(es); + return NULL == es->head ? NULL : ptr_add_offset(es->head, -es->offset); +} + +/** + * @return pointer to last item of list, NULL if empty. + */ +static inline void * +eslist_tail(const eslist_t * const es) +{ + eslist_check(es); + return NULL == es->tail ? NULL : ptr_add_offset(es->tail, -es->offset); +} + +/** + * @return pointer to first link of list, NULL if empty. + */ +static inline slink_t * +eslist_first(const eslist_t * const es) +{ + eslist_check(es); + return es->head; +} + +/** + * @return pointer to last link of list, NULL if empty. + */ +static inline slink_t * +eslist_last(const eslist_t * const es) +{ + eslist_check(es); + return es->tail; +} + +/** + * @return last link in forward chain. + */ +static inline slink_t * +eslist_last_link(const slink_t *lk) +{ + if (NULL == lk) + return NULL; + + while (lk->next != NULL) + lk = lk->next; + + return deconstify_pointer(lk); +} + +/** + * @return next link, NULL if none. + */ +static inline slink_t * +eslist_next(const slink_t * const lk) +{ + return NULL == lk ? NULL : lk->next; +} + +/** + * @return nth next link, NULL if none. + */ +static inline slink_t * +eslist_nth_next(const slink_t * const lk, size_t n) +{ + const slink_t *l = lk; + + while (n-- > 0 && l != NULL) + l = l->next; + + return deconstify_pointer(l); +} + +/** + * @return the data associated with the curernt link, NULL if none. + */ +static inline void * +eslist_data(const eslist_t *list, const slink_t * const lk) +{ + eslist_check(list); + + return NULL == lk ? NULL : + deconstify_pointer(const_ptr_add_offset(lk, -list->offset)); +} + +/** + * @return the data associated with the next item, NULL if none. + */ +static inline void * +eslist_next_data(const eslist_t *list, const void *p) +{ + const slink_t *lk; + + eslist_check(list); + g_assert(p != NULL); + + lk = const_ptr_add_offset(p, list->offset); + return NULL == lk->next ? NULL : + deconstify_pointer(const_ptr_add_offset(lk->next, -list->offset)); +} + +/** + * For assertions, check whether item is a member of the list. + * + * @attention + * This is very inefficient, as it needs to traverse the whole list, possibly. + * It only needs to be called when debugging. + */ +static inline bool +eslist_contains(const eslist_t *list, const void *p) +{ + const slink_t *l, *lk; + + eslist_check(list); + g_assert(p != NULL); + + lk = const_ptr_add_offset(p, list->offset); + l = list->head; + + while (l != NULL) { + if G_UNLIKELY(l == lk) + return TRUE; + l = l->next; + } + + return FALSE; +} + +void eslist_init(eslist_t *list, size_t offset); +void eslist_discard(eslist_t *list); +void eslist_clear(eslist_t *list); +void eslist_wfree(eslist_t *list, size_t size); +size_t eslist_load(eslist_t *list, void *head, size_t offset); + +void eslist_foreach(const eslist_t *list, data_fn_t cb, void *data); +size_t eslist_foreach_remove(eslist_t *list, data_rm_fn_t cbr, void *data); + +void eslist_link_append(eslist_t *list, slink_t *lk); +void eslist_append(eslist_t *list, void *data); +void eslist_link_prepend(eslist_t *list, slink_t *lk); +void eslist_prepend(eslist_t *list, void *data); +void *eslist_shift(eslist_t *list); +void eslist_rotate_left(eslist_t *list); +void eslist_link_insert_after(eslist_t *list, slink_t *sibling_lk, slink_t *lk); +void eslist_insert_after(eslist_t *list, void *sibling, void *data); +void eslist_reverse(eslist_t *list); +void eslist_remove(eslist_t *list, void *data); +void *eslist_remove_after(eslist_t *list, void *sibling); +void *eslist_find(const eslist_t *list, const void *key, cmp_fn_t cmp); +void eslist_sort_with_data(eslist_t *list, cmp_data_fn_t cmp, void *data); +void eslist_sort(eslist_t *list, cmp_fn_t cmp); +void eslist_insert_sorted_with_data(eslist_t *list, void *item, + cmp_data_fn_t cmp, void *data); +void eslist_insert_sorted(eslist_t *list, void *item, cmp_fn_t cmp); +void *eslist_nth(const eslist_t *list, long n); +void *eslist_nth_next_data(const eslist_t *list, const slink_t *lk, size_t n); +void *eslist_random(const eslist_t *list); +void eslist_shuffle(eslist_t *list); +void eslist_shuffle_with(random_fn_t rf, eslist_t *list); + +void eslist_append_list(eslist_t *list, eslist_t *other); +void eslist_prepend_list(eslist_t *list, eslist_t *other); + +#define ESLIST_FOREACH(slist, l) \ + for ((l) = eslist_first(slist); NULL != (l); (l) = eslist_next(l)) + +#define ESLIST_FOREACH_DATA(ls, d) \ + for ((d) = eslist_head(ls); NULL != (d); (d) = eslist_next_data((ls), (d))) + +#endif /* _eslist_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/etree.c
Added
@@ -0,0 +1,1034 @@ +/* + * Copyright (c) 2012, 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Embedded trees are created when the linking pointers are directly + * held within the data structure. + * + * Embedded trees are intrusive in the sense that the objects have an explicit + * node_t field, but this saves one pointer per item being held compared + * to glib's trees. + * + * Due to the nature of the data structure, the definition of the internal + * structures is visible in the header file but users must refrain from + * peeking and poking into the structures. Using embedded data structures + * requires more discipline than opaque data structures. + * + * The API of embedded trees has been derived from the need of the user's + * code and as evolved incrementally. It was then extended with some of + * glib's API for trees, which is a good one. + * + * This library handles arbitrary n-ary trees, not balanced binary trees or + * other kind of specialized trees, but with a single root (i.e. the root + * has no siblings). + * + * There are two node structures available for trees, and the type of structure + * used must be given when the etree_t is initialized: the node_t is the usual + * tree representation with { parent, child, sibling } pointers. The nodex_t + * is an extended node which also stores the last_child to make appending of + * new children faster. + * + * +x + * +/ | \ | is a parent link b -> x + * +/ | \ + is a child link x +> a + * a==b==c = is a sibling link a => b => c + * + * All links are one-way, so it is not possible to iterate freely on the tree + * with ideal performance for all types of traversal. The aim is reasonable + * performance given the memory trade-offs we're taking. + * + * @author Raphael Manfredi + * @date 2012, 2014 + */ + +#include "common.h" + +#include "etree.h" + +#include "unsigned.h" +#include "xslist.h" + +#include "override.h" /* Must be the last header included */ + +/** + * Initialize embedded tree. + * + * Assuming items in the tree are defined as: + * + * struct item { + * <data fields> + * node_t n; + * }; + * + * then the last argument can be given as: + * + * offsetof(struct item, n) + * + * to indicate the place of the node field within the item. + * + * Extended trees are available to make etree_append_child() efficient but if + * children can only be prepended, use normal trees (less overhead per node). + * + * @param tree the tree structure to initialize + * @param extended whether extended nodex_t are used instead of node_t + * @param offset the offset of the embedded link field within items + */ +void +etree_init(etree_t *tree, bool extended, size_t offset) +{ + g_assert(tree != NULL); + g_assert(size_is_non_negative(offset)); + + tree->magic = extended ? ETREE_EXT_MAGIC : ETREE_MAGIC; + tree->root = NULL; + tree->offset = offset; + tree->count = 0; +} + +/** + * Set initial root of empty tree. + */ +void +etree_set_root(etree_t *tree, const void *root) +{ + etree_check(tree); + g_assert(NULL == tree->root); + + tree->root = ptr_add_offset(deconstify_pointer(root), tree->offset); + if (NULL == tree->root->child) + tree->count = 1; +} + +/** + * Discard tree, making the tree object invalid. + * + * This does not free any of the items, it just discards the tree descriptor. + * The underlying items remain chained though, so retaining a pointer to one + * of the node_t of one item still allows limited tree traversal. + */ +void +etree_discard(etree_t *tree) +{ + etree_check(tree); + + tree->magic = 0; +} + +/** + * Is item the root node? + */ +bool +etree_is_root(const etree_t *tree, const void *item) +{ + const node_t *n; + + etree_check(tree); + + n = const_ptr_add_offset(item, tree->offset); + return NULL == n->parent && n == tree->root; +} + +/** + * Is item an "orphan" node? (no parent, no sibling) + */ +bool +etree_is_orphan(const etree_t *tree, const void *item) +{ + const node_t *n; + + etree_check(tree); + + n = const_ptr_add_offset(item, tree->offset); + return NULL == n->parent && NULL == n->sibling; +} + +/** + * Is item an "standalone" node? (no parent, no sibling, no children) + */ +bool +etree_is_standalone(const etree_t *tree, const void *item) +{ + const node_t *n; + + etree_check(tree); + + n = const_ptr_add_offset(item, tree->offset); + return NULL == n->parent && NULL == n->sibling && NULL == n->child; +} + +/** + * @return last sibling of node, NULL if node is NULL. + */ +static node_t * +etree_node_last_sibling(const node_t *n) +{ + const node_t *sn, *next; + + if (NULL == n) + return NULL; + + for (sn = n; /* empty */; sn = next) { + next = sn->sibling; + if (NULL == next) + break; + } + + g_assert(sn != NULL); /* Found last sibling */ + + return deconstify_pointer(sn); +} + +/** + * @return pointer to last child of item, NULL if leaf item. + */ +void * +etree_last_child(const etree_t *tree, const void *item) +{ + etree_check(tree); + + if (etree_is_extended(tree)) { + const nodex_t *n = const_ptr_add_offset(item, tree->offset); + if (NULL == n->last_child) + return NULL; + return ptr_add_offset(n->last_child, -tree->offset); + } else { + const node_t *n = const_ptr_add_offset(item, tree->offset); + node_t *sn = etree_node_last_sibling(n->child); + + if (NULL == sn) + return NULL; + + return ptr_add_offset(sn, -tree->offset); + } +} + +/** + * Computes the root of the tree, starting from any item. + * + * This disregards the actual root in the etree_t structure passed, which may + * be inaccurate, i.e. a sub-node of the actual tree. The only accurate + * information that etree_t must contain is the offset of the node_t within + * the items. + * + * @param tree the tree descriptor (with possible inaccurate root) + * @param item an item belonging to the tree + * + * @return the root of the tree to which item belongs. + */ +void * +etree_find_root(const etree_t *tree, const void *item) +{ + const node_t *n, *p; + void *root; + + etree_check(tree); + g_assert(item != NULL); + + n = const_ptr_add_offset(item, tree->offset); + + for (p = n; p != NULL; p = n->parent) + n = p; + + root = ptr_add_offset(deconstify_pointer(n), -tree->offset); + + g_assert(etree_is_orphan(tree, root)); /* No parent, no sibling */ + + return root; +} + +/** + * Given an item, find the first matching sibling starting with this item, + * NULL if none. + * + * @param tree the tree descriptor (with possible inaccurate root) + * @param item item at which search begins + * @param match matching predicate + * @param data additional callback argument + */ +void * +etree_find_sibling(const etree_t *tree, const void *item, + match_fn_t match, void *data) +{ + const node_t *s; + + etree_check(tree); + g_assert(item != NULL); + g_assert(match != NULL); + + for ( + s = const_ptr_add_offset(item, tree->offset); + s != NULL; + s = s->sibling + ) { + const void *node = const_ptr_add_offset(s, -tree->offset); + if ((*match)(node, data)) + return deconstify_pointer(node); + } + + return NULL; /* No matching item */ +} + +/** + * Detach item and all its sub-tree from a tree, making it the new root + * of a smaller tree. + */ +void +etree_detach(etree_t *tree, void *item) +{ + node_t *n; + + etree_check(tree); + g_assert(item != NULL); + + n = ptr_add_offset(item, tree->offset); + + if (NULL == n->parent) { + /* Root node already, cannot have any sibling */ + g_assert(NULL == n->sibling); + g_assert(n == tree->root); + tree->root = NULL; /* Root node is now detached */ + tree->count = 0; + } else { + node_t *parent = n->parent; + + if (n == parent->child) { + if (etree_is_extended(tree)) { + nodex_t *px = (nodex_t *) parent; + if (n == px->last_child) { + g_assert(NULL == n->sibling); /* Last child! */ + px->child = px->last_child = NULL; + } else { + g_assert(NULL != n->sibling); /* Not last child */ + parent->child = n->sibling; + } + } else { + parent->child = n->sibling; + } + } else { + node_t *cn; + bool found = FALSE; + + /* + * Not removing first child of parent, so locate its previous + * sibling in the list of the parent's immediate children. + */ + + for (cn = parent->child; cn != NULL; cn = cn->sibling) { + if (cn->sibling == n) { + found = TRUE; + break; + } + } + + g_assert(found); /* Must find it or tree is corrupted */ + + cn->sibling = n->sibling; /* Remove node ``n'' from list */ + + /* + * Update ``last_child'' in the parent node if we removed the + * last child node. + */ + + if (etree_is_extended(tree)) { + nodex_t *px = (nodex_t *) parent; + + if (n == px->last_child) { + g_assert(NULL == n->sibling); + px->last_child = cn; + } + } + } + + n->sibling = NULL; /* Node is now a root node */ + tree->count = 0; /* Count is now unknown */ + } +} + +/** + * Increment tree count if known and added node is a leaf. + */ +static inline void +etree_count_update_added(etree_t *tree, const node_t *node) +{ + if (NULL == node->child && 0 != tree->count) + tree->count++; /* Adding leaf node */ + else + tree->count = 0; /* Tree count is now unknown */ +} + +/** + * Append child to parent. + * + * If this is a frequent operation, consider using an extended tree. + */ +void +etree_append_child(etree_t *tree, void *parent, void *child) +{ + node_t *cn, *pn; + + etree_check(tree); + g_assert(parent != NULL); + g_assert(child != NULL); + g_assert(etree_is_orphan(tree, child)); + + cn = ptr_add_offset(child, tree->offset); + pn = ptr_add_offset(parent, tree->offset); + + if (etree_is_extended(tree)) { + nodex_t *px = ptr_add_offset(parent, tree->offset); + + if (px->last_child != NULL) { + node_t *lcn = px->last_child; + + g_assert(0 == ptr_cmp(lcn->parent, px)); + g_assert(NULL == lcn->sibling); + + lcn->sibling = cn; + } else { + g_assert(NULL == px->child); + + px->child = cn; + } + + px->last_child = cn; + } else { + if (NULL == pn->child) { + pn->child = cn; + } else { + node_t *lcn = etree_node_last_sibling(pn->child); + lcn->sibling = cn; + } + } + + cn->parent = pn; + + etree_count_update_added(tree, cn); +} + +/** + * Prepend child to parent. + * + * This is always a fast operation. + */ +void +etree_prepend_child(etree_t *tree, void *parent, void *child) +{ + node_t *cn, *pn; + + etree_check(tree); + g_assert(parent != NULL); + g_assert(child != NULL); + g_assert(etree_is_orphan(tree, child)); + + cn = ptr_add_offset(child, tree->offset); + pn = ptr_add_offset(parent, tree->offset); + + cn->parent = pn; + cn->sibling = pn->child; + pn->child = cn; + + if (etree_is_extended(tree)) { + nodex_t *px = (nodex_t *) pn; + + if (NULL == px->last_child) { + g_assert(NULL == cn->sibling); /* Parent did not have any child */ + px->last_child = cn; + } + } + + etree_count_update_added(tree, cn); +} + +/** + * Reverse the order of children in a given node. + */ +void +etree_reverse_children(etree_t *tree, void *node) +{ + node_t *cn, *n, *prev; + + etree_check(tree); + g_assert(node != NULL); + + n = ptr_add_offset(node, tree->offset); + + /* + * This is a classic one-way list reversal alogrithm, with the head + * of the list being n->child and each item being linked via ``sibling''. + */ + + for (cn = n->child, prev = NULL; cn != NULL; /* empty */) { + node_t *next = cn->sibling; + + cn->sibling = prev; + prev = cn; + cn = next; + } + + if (etree_is_extended(tree)) { + nodex_t *nx = (nodex_t *) n; + nx->last_child = n->child; /* Last child is the previous head */ + } + + n->child = prev; /* New head of list */ +} + +/** + * Add item as right-sibling of node (cannot be the root node). + */ +void +etree_add_right_sibling(etree_t *tree, void *node, void *item) +{ + node_t *n, *i; + + etree_check(tree); + g_assert(node != NULL); + g_assert(item != NULL); + g_assert(etree_is_orphan(tree, item)); + g_assert(!etree_is_root(tree, node)); + + n = ptr_add_offset(node, tree->offset); + i = ptr_add_offset(item, tree->offset); + + i->parent = n->parent; + i->sibling = n->sibling; + n->sibling = i; + + if (NULL == i->sibling && etree_is_extended(tree)) { + nodex_t *px = (nodex_t *) n->parent; + px->last_child = i; + } + + etree_count_update_added(tree, i); +} + +/** + * Add item as left-sibling of node (cannot be the root node). + * + * This is inefficient if the node is not the first child (the head of the + * sibling list) given that the siblings are linked through a one-way list. + */ +void +etree_add_left_sibling(etree_t *tree, void *node, void *item) +{ + node_t *n, *i; + + etree_check(tree); + g_assert(node != NULL); + g_assert(item != NULL); + g_assert(etree_is_orphan(tree, item)); + g_assert(!etree_is_root(tree, node)); + + n = ptr_add_offset(node, tree->offset); + i = ptr_add_offset(item, tree->offset); + + i->parent = n->parent; + i->sibling = n; + + if (n == n->parent->child) { + /* node is first child, optimized case */ + n->parent->child = i; + } else { + node_t *p; + + for (p = n->parent->child; p->sibling != n; p = p->sibling) + /* empty */; + + g_assert(p != NULL); /* previous node found */ + + p->sibling = i; + } + + etree_count_update_added(tree, i); +} + +/** + * Recursively sort all the children of each tree node. + * + * This does NOT sort the tree so that traversal is in a given order implied + * by the comparison routine. It only deals with the immediate children of + * each parent node. + * + * @param tree the tree to sort + * @param root the parent node whose children we want to sort + * @param cmp the comparison routine for two items in the tree + * @param data additional argument to supply to comparison routine + * + * @return amount of nodes visited. + */ +static size_t +etree_sort_internal(etree_t *tree, node_t *root, cmp_data_fn_t cmp, void *data) +{ + void *child; + node_t *n, *next; + xslist_t siblings; + bool is_extended; + size_t visited; + + etree_check(tree); + + if (NULL == root->child) + return 1; + + /* + * Sort the siblings before iterating over them to recurse. + * + * We're going to treat the sibling list (one-way linked via n->sibling) + * as an expanded single list whose link offset is the offset of the + * ``sibling'' field in the node_t structure. + */ + + child = ptr_add_offset(root->child, -tree->offset); + xslist_load(&siblings, child, tree->offset, offsetof(node_t, sibling)); + xslist_sort_with_data(&siblings, cmp, data); + root->child = xslist_first(&siblings); + + is_extended = etree_is_extended(tree); + visited = 1; + + for (n = root->child; n != NULL; n = next) { + g_assert(root == n->parent); /* Sorting did not alter structure */ + + next = n->sibling; + visited += etree_sort_internal(tree, n, cmp, data); + + if G_UNLIKELY(is_extended && NULL == next) { + nodex_t *nx = (nodex_t *) root; + nx->last_child = n; + } + } + + return visited; +} + +/** + * Sort the children of each tree node with the item-comparison routine. + * + * @param tree the tree whose children we want to sort + * @param cmp the comparison routine to compare two items + */ +void +etree_sort(etree_t *tree, cmp_fn_t cmp) +{ + etree_check(tree); + + if (NULL == tree->root) + return; + + tree->count = + etree_sort_internal(tree, tree->root, (cmp_data_fn_t) cmp, NULL); +} + +/** + * Sort the children of each tree node with the item-comparison routine, + * which is extended to take an additional user-supplied context. + * + * @param tree the tree whose children we want to sort + * @param cmp the comparison routine to compare two items + * @param data additional argument to supply to comparison routine + */ +void +etree_sort_with_data(etree_t *tree, cmp_data_fn_t cmp, void *data) +{ + etree_check(tree); + + if (NULL == tree->root) + return; + + tree->count = + etree_sort_internal(tree, tree->root, (cmp_data_fn_t) cmp, data); +} + +/** + * General tree traversal routine, in depth-first order. + * + * The "enter" function is called when we enter a node, and its returned + * value is monitored: a FALSE indicates that the node should be skipped + * (which includes its children) and that the action callback should not be + * invoked. When missing, it is as if the "enter" callback had returned TRUE. + * + * The "action" callback can be invokded before or after processing the node's + * children, as indicated by the flags. That callback is allowed to free the + * traversed node. + * + * @param tree the tree descriptor + * @param root the item at which traversal starts + * @param flags nodes to visit + when to invoke action callback + * @param curdepth current depth + * @param mindepth depth when callbacks start (0 = now, 1 = children, etc...) + * @param maxdepth 0 = root node only, 1 = root + its children, etc... + * @param enter (optional) callback when we enter a node + * @param action (mandatory) action on the node + * @param data user-defined argument passed to callbacks + * + * @return amount of nodes visited. + */ +static size_t +etree_traverse_internal(const etree_t *tree, node_t *root, + unsigned flags, unsigned curdepth, unsigned mindepth, unsigned maxdepth, + match_fn_t enter, data_fn_t action, void *data) +{ + size_t visited = 1; /* 1 for this node */ + void *item; + bool actionable; + node_t *child; + + etree_check(tree); + + if (curdepth > maxdepth) + return 0; + + /* + * Check whether we need to execute action on the node. + */ + + child = root->child; + + if (curdepth < mindepth) + actionable = FALSE; + else if ((flags & ETREE_TRAVERSE_NON_LEAVES) && NULL != child) + actionable = TRUE; + else if ((flags & ETREE_TRAVERSE_LEAVES) && NULL == child) + actionable = TRUE; + else + actionable = FALSE; + + item = ptr_add_offset(root, -tree->offset); + + /* + * The optional "enter" callback is only activated when we have reached + * the minimal depth. + */ + + if (enter != NULL && curdepth >= mindepth && !(*enter)(item, data)) + return 0; + + if (actionable && (flags & ETREE_CALL_BEFORE)) + (*action)(item, data); /* MUST NOT free node */ + + /* + * Only visit children when we've not reached the maximum depth. + */ + + if (curdepth != maxdepth) { + node_t *n, *next; + + for (n = child; n != NULL; n = next) { + next = n->sibling; + visited += etree_traverse_internal(tree, n, flags, + curdepth + 1, mindepth, maxdepth, enter, action, data); + } + } + + if (actionable && (flags & ETREE_CALL_AFTER)) + (*action)(item, data); /* Can safely free node */ + + return visited; +} + +/** + * Recursively apply function on each node, in depth-first mode. + * + * Traversal is done in such a way that the applied function can safely + * free up the local node. + * + * @param tree the tree descriptor + * @param cb the callback to invoke on each item + * @param data user-defined additional callback argument + */ +void +etree_foreach(const etree_t *tree, data_fn_t cb, void *data) +{ + etree_check(tree); + g_assert(cb != NULL); + + if G_UNLIKELY(NULL == tree->root) + return; + + etree_traverse_internal(tree, tree->root, + ETREE_TRAVERSE_ALL | ETREE_CALL_AFTER, + 0, 0, ETREE_MAX_DEPTH, NULL, cb, data); +} + +/** + * Apply function to the immediate children of the node. + * + * Traversal is done in such a way that the applied function can safely + * free up the local node. + * + * The root node is NOT traversed, and it MUST belong to the tree. + * + * @param tree the tree descriptor + * @param parent the parent node of the children to traverse + * @param cb the callback to invoke on each item + * @param data user-defined additional callback argument + */ +void +etree_foreach_children(const etree_t *tree, void *parent, + data_fn_t cb, void *data) +{ + node_t *root; + + etree_check(tree); + g_assert(cb != NULL); + g_assert(parent != NULL); + + if G_UNLIKELY(NULL == tree->root) + return; + + root = ptr_add_offset(parent, tree->offset); + + etree_traverse_internal(tree, root, + ETREE_TRAVERSE_ALL | ETREE_CALL_AFTER, + 0, 1, 1, NULL, cb, data); +} + +/** + * Recursively traverse tree, in depth-first mode. + * + * Traversal can be pruned with an optional "enter" callback, and/or by depth. + * + * The "action" callback can be invoked before or after processing children. + * It can be triggered on non-leaf nodes, on leaves only, or on both. + * It is always allowed to free-up the node. + * + * The function returns the number of visited nodes, regardless of whether the + * action was run on them. This allows them to know how many nodes were + * selected by the "enter" callback and see the effect of depth-pruning. + * + * @param tree the tree descriptor + * @param flags nodes to visit + when to invoke action callback + * @param mindepth 0 = immediately, 1 = children, 2 = grand-children, etc... + * @param maxdepth 0 = root node only, 1 = root + its children, etc... + * @param enter (optional) callback when we enter a node + * @param action (optional) action on the node + * @param data user-defined argument passed to callbacks + * + * @return amount of nodes visited, regardless of whether action was run. + */ +size_t +etree_traverse(const etree_t *tree, unsigned flags, + unsigned mindepth, unsigned maxdepth, + match_fn_t enter, data_fn_t action, void *data) +{ + etree_check(tree); + g_assert(uint_is_non_negative(mindepth)); + g_assert(uint_is_non_negative(maxdepth) || ETREE_MAX_DEPTH == maxdepth); + g_assert(NULL == action || + (flags & ETREE_CALL_BEFORE) ^ (flags & ETREE_CALL_AFTER)); + g_assert(NULL != action || + 0 == (flags & (ETREE_CALL_BEFORE | ETREE_CALL_AFTER))); + g_assert(0 != (flags & ETREE_TRAVERSE_ALL)); + + if G_UNLIKELY(NULL == tree->root) + return 0; + + return etree_traverse_internal(tree, tree->root, flags, + 0, mindepth, maxdepth, + enter, action, data); +} + +/** + * Internal recursive matching routine. + */ +static void * +etree_find_depth_internal(const etree_t *tree, node_t *root, + unsigned curdepth, unsigned maxdepth, match_fn_t match, void *data) +{ + node_t *n, *next; + void *item; + + etree_check(tree); + + item = ptr_add_offset(root, -tree->offset); + + if ((*match)(item, data)) + return item; + + if (maxdepth == curdepth) + return NULL; + + for (n = root->child; n != NULL; n = next) { + next = n->sibling; + item = etree_find_depth_internal(tree, n, + curdepth + 1, maxdepth, match, data); + if (item != NULL) + return item; + } + + return NULL; +} + +/** + * Recursively apply matching function on each node, in depth-first order, + * until it returns TRUE or the maximum depth is reached, at which time we + * return the matching node. + * + * A depth of 0 limits searching to the root node, 1 to the root node plus + * its immediate children, etc... + * + * @param tree the tree descriptor + * @param maxdepth maximum search depth + * @param match the item matching function + * @param data user-defined argument passed to the matching callback + * + * @return the first matching node in the traversal path, NULL if none matched. + */ +void * +etree_find_depth(const etree_t *tree, unsigned maxdepth, + match_fn_t match, void *data) +{ + etree_check(tree); + g_assert(uint_is_non_negative(maxdepth) || ETREE_MAX_DEPTH == maxdepth); + g_assert(match != NULL); + + return etree_find_depth_internal(tree, tree->root, 0, maxdepth, + match, data); +} + +/** + * Recursively apply matching function on each node, in depth-first order, + * until it returns TRUE, at which time we return the matching node. + * + * @param tree the tree descriptor + * @param match the item matching function + * @param data user-defined argument passed to the matching callback + * + * @return the first matching node in the traversal path, NULL if none matched. + */ +void * +etree_find(const etree_t *tree, match_fn_t match, void *data) +{ + etree_check(tree); + g_assert(match != NULL); + + return etree_find_depth_internal(tree, tree->root, 0, ETREE_MAX_DEPTH, + match, data); +} + +struct etree_item_free_data_ctx { + free_data_fn_t fcb; + void *data; +}; + +/** + * Helper routine for etree_free_data() to free up each item. + */ +static void +etree_item_free_data(void *item, void *data) +{ + struct etree_item_free_data_ctx *ctx = data; + + (*ctx->fcb)(item, ctx->data); +} + +/** + * Helper routine for etree_free() to free up each item. + */ +static void +etree_item_free(void *item, void *data) +{ + free_fn_t fcb = cast_pointer_to_func(data); + + (*fcb)(item); +} + +/** + * Free whole tree, discarding each node with the supplied free routine. + * + * @param tree the tree descriptor + * @param fcb free routine for each item + * @param data user-supplied argument to the free routine + */ +void +etree_free_data(etree_t *tree, free_data_fn_t fcb, void *data) +{ + struct etree_item_free_data_ctx ctx; + + ctx.fcb = fcb; + ctx.data = data; + + etree_foreach(tree, etree_item_free_data, &ctx); + tree->root = NULL; + tree->count = 0; +} + +/** + * Free whole tree, discarding each node with the supplied free routine. + * + * @param tree the tree descriptor + * @param fcb free routine for each item + */ +void +etree_free(etree_t *tree, free_fn_t fcb) +{ + etree_foreach(tree, etree_item_free, cast_func_to_pointer(fcb)); + tree->root = NULL; + tree->count = 0; +} + +/** + * Free sub-tree, destroying all its items and removing the reference in + * the parent node, if any. + * + * @param tree the tree descriptor + * @param item root item of sub-tree to remove + * @param fcb free routine for each item + * @param data user-supplied argument to the free routine + */ +void +etree_sub_free_data(etree_t *tree, void *item, free_data_fn_t fcb, void *data) +{ + etree_t dtree; + + etree_check(tree); + + etree_detach(tree, item); + etree_init_root(&dtree, item, etree_is_extended(tree), tree->offset); + etree_free_data(&dtree, fcb, data); +} + +/** + * Free sub-tree, destroying all its items and removing the reference in + * the parent node, if any. + * + * @param tree the tree descriptor + * @param item root item of sub-tree to remove + * @param fcb free routine for each item + */ +void +etree_sub_free(etree_t *tree, void *item, free_fn_t fcb) +{ + etree_t dtree; + + etree_check(tree); + + etree_detach(tree, item); + etree_init_root(&dtree, item, etree_is_extended(tree), tree->offset); + etree_free(&dtree, fcb); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/etree.h
Added
@@ -0,0 +1,265 @@ +/* + * Copyright (c) 2012, 2014-2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Embedded n-ary trees (within another data structure). + * + * @author Raphael Manfredi + * @date 2012, 2014-2015 + */ + +#ifndef _etree_h_ +#define _etree_h_ + +/** + * Get the enclosing data item from an embedded node. + */ +#ifdef __GNUC__ +#define etree_item(lnk, type, field) G_EXTENSION({ \ + const struct node *__mptr = (lnk); \ + (type *)((char *) __mptr - offsetof(type, field));}) +#else +#define etree_item(lnk, type, field) \ + ((type *)((char *) (node) - offsetof(type, field))) +#endif + +/** + * A tree structure. + */ +typedef struct node { + struct node *parent, *child, *sibling; +} node_t; + +/** + * An extended tree structure for optimized child appending. + * + * @attention + * Structure equivalence allows us to have pointers to node_t within a nodex_t. + */ +typedef struct nodex { + struct node *parent, *child, *sibling, *last_child; +} nodex_t; + +enum etree_magic { + ETREE_MAGIC = 0x70b0b6c7, /**< uses struct node */ + ETREE_EXT_MAGIC = 0x44a57f69 /**< uses struct nodex */ +}; + +/** + * An embedded tree is represented by this structure. + */ +typedef struct etree { + enum etree_magic magic; + node_t *root; /* Can be a nodex_t * for extended trees */ + size_t offset; /* Offset of embedded node in the item structure */ + size_t count; /* Amount of nodes held (0 means possibly unknown) */ +} etree_t; + +static inline void +etree_check(const etree_t * const et) +{ + g_assert(et != NULL); + g_assert(ETREE_MAGIC == et->magic || ETREE_EXT_MAGIC == et->magic); +} + +/** + * Traversal flags. + */ +#define ETREE_TRAVERSE_LEAVES (1U << 0) +#define ETREE_TRAVERSE_NON_LEAVES (1U << 1) +#define ETREE_CALL_AFTER (1U << 2) +#define ETREE_CALL_BEFORE (1U << 3) + +#define ETREE_TRAVERSE_ALL \ + (ETREE_TRAVERSE_LEAVES | ETREE_TRAVERSE_NON_LEAVES) + +#define ETREE_MAX_DEPTH ((unsigned) -1) + +/** + * Public interface. + */ + +/** + * Initialize tree from root item. + */ +static inline void +etree_init_root(etree_t *tree, const void *root, bool extended, size_t offset) +{ + tree->magic = extended ? ETREE_EXT_MAGIC : ETREE_MAGIC; + tree->root = ptr_add_offset(deconstify_pointer(root), offset); + tree->offset = offset; + tree->count = (NULL == tree->root->child) ? 1 : 0; +} + +/** + * Is tree using "extended nodes"? + */ +static inline bool +etree_is_extended(const etree_t *tree) +{ + etree_check(tree); + + return ETREE_EXT_MAGIC == tree->magic; +} + +/** + * @return pointer to root of tree, as indicated by the tree descriptor, + * NULL if empty. + */ +static inline void * +etree_root(const etree_t * const et) +{ + etree_check(et); + return NULL == et->root ? NULL : ptr_add_offset(et->root, -et->offset); +} + +/** + * @return pointer to parent of node, NULL if root node. + */ +static inline void * +etree_parent(const etree_t * const et, const void *item) +{ + const node_t *n; + + etree_check(et); + + n = const_ptr_add_offset(item, et->offset); + return NULL == n->parent ? NULL : ptr_add_offset(n->parent, -et->offset); +} + +/** + * @return pointer to first child of item, NULL if leaf item. + */ +static inline void * +etree_first_child(const etree_t * const et, const void *item) +{ + const node_t *n; + + etree_check(et); + + n = const_ptr_add_offset(item, et->offset); + return NULL == n->child ? NULL : ptr_add_offset(n->child, -et->offset); +} + +/** + * @return pointer to the next sibling of item, NULL if item has no more + * siblings. + */ +static inline void * +etree_next_sibling(const etree_t * const et, const void *item) +{ + const node_t *n; + + etree_check(et); + + n = const_ptr_add_offset(item, et->offset); + return NULL == n->sibling ? NULL : ptr_add_offset(n->sibling, -et->offset); +} + +/** + * @return the data associated with the curernt node, NULL if none. + */ +static inline void * +etree_data(const etree_t *et, const node_t * const node) +{ + etree_check(et); + + return NULL == node ? NULL : + deconstify_pointer(const_ptr_add_offset(node, -et->offset)); +} + +void etree_foreach(const etree_t *tree, data_fn_t cb, void *data); +void etree_foreach_children(const etree_t *tree, void *parent, + data_fn_t cb, void *data); +size_t etree_traverse(const etree_t *tree, unsigned flags, + unsigned mindepth, unsigned maxdepth, + match_fn_t enter, data_fn_t action, void *data); + +/** + * Get (possibly cached) amount of items in the tree. + * + * @return amount of items in tree. + */ +static inline size_t +etree_count(const etree_t *et) +{ + etree_t *wet; + + etree_check(et); + + if G_UNLIKELY(NULL == et->root) + return 0; + + /* + * Cache count in the object. + */ + + if G_LIKELY(0 != et->count) + return et->count; + + wet = deconstify_pointer(et); + + return wet->count = etree_traverse(et, + ETREE_TRAVERSE_ALL, 0, ETREE_MAX_DEPTH, + NULL, NULL, NULL); +} + +void etree_init(etree_t *tree, bool extended, size_t offset); +void etree_set_root(etree_t *tree, const void *root); + +bool etree_is_standalone(const etree_t *tree, const void *item); +bool etree_is_orphan(const etree_t *tree, const void *item); + +void *etree_find(const etree_t *tree, match_fn_t match, void *data); +void *etree_find_depth(const etree_t *tree, unsigned maxdepth, + match_fn_t match, void *data); +void *etree_find_root(const etree_t *tree, const void *item); +void *etree_find_sibling(const etree_t *tree, const void *item, + match_fn_t match, void *data); + +void etree_append_child(etree_t *tree, void *parent, void *child); +void etree_prepend_child(etree_t *tree, void *parent, void *child); +void etree_reverse_children(etree_t *tree, void *node); + +void etree_add_right_sibling(etree_t *tree, void *node, void *item); +void etree_add_left_sibling(etree_t *tree, void *node, void *item); + +void *etree_last_child(const etree_t *tree, const void *item); + +void etree_detach(etree_t *tree, void *item); + +void etree_sort(etree_t *tree, cmp_fn_t cmp); +void etree_sort_with_data(etree_t *tree, cmp_data_fn_t cmp, void *data); + +void etree_free_data(etree_t *tree, free_data_fn_t fcb, void *data); +void etree_free(etree_t *tree, free_fn_t fcb); +void etree_sub_free_data(etree_t *tree, void *item, + free_data_fn_t fcb, void *data); +void etree_sub_free(etree_t *tree, void *item, free_fn_t fcb); + +#endif /* _etree_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/eval.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/eval.c
Changed
@@ -38,8 +38,9 @@ #include "eval.h" #include "ascii.h" -#include "atoms.h" +#include "constants.h" #include "debug.h" +#include "gethomedir.h" #include "glib-missing.h" #include "halloc.h" #include "path.h" @@ -49,69 +50,57 @@ #define MAX_STRING 1024 /**< Max length for substitution */ -static GHashTable *constants; -static const char *home; /* string atom */ - -static const char *get_home(void); -static const char *get_variable(const char *s, const char **end); -static gboolean initialized; - /** - * Create a constant string, or reuse an existing one if possible. + * Extract variable name from string `s', then fetch value from environment. * - * @returns a string atom. + * @return variable's value, or "" if not found and set `end' to the address + * of the character right after the variable name. */ static const char * -constant_make(const char *s) +get_variable(const char *s, const char **end) { - const char *v; + const char *value, *p = s; + bool end_brace = FALSE; - v = g_hash_table_lookup(constants, s); - if (v != NULL) - return v; /* Already exists */ + /* + * Grab variable's name. + */ - v = atom_str_get(s); - gm_hash_table_insert_const(constants, v, v); + if (*p == '{') { + p++; + s++; + end_brace = TRUE; + } - return v; -} + while (is_ascii_alnum(*p) || *p == '_') { + p++; + } -/** - * Initialize string evaluation. - */ -void -eval_init(void) -{ - g_return_if_fail(!initialized); + if (end_brace && *p == '}') + *end = &p1; + else + *end = p; - constants = g_hash_table_new(g_str_hash, g_str_equal); - home = get_home(); - g_assert(home); + /* + * Get value from environment. + */ - initialized = TRUE; -} + { + char *name; -static void -constants_free_kv(gpointer key, - gpointer unused_val, gpointer unused_x) -{ - (void) unused_val; - (void) unused_x; - atom_str_free(key); -} + name = h_strndup(s, p - s); + value = getenv(name); -/** - * Cleanup local structures at shutdown time. - */ -void -eval_close(void) -{ - if (home) { - atom_str_free(home); - home = NULL; + if (value == NULL) + value = ""; + + if (common_dbg > 4) + g_debug("variable \"%s\" is \"%s\"", name, value); + + HFREE_NULL(name); } - g_hash_table_foreach(constants, constants_free_kv, NULL); - gm_hash_table_destroy_null(&constants); + + return value; } /** @@ -154,7 +143,7 @@ * * If given a NULL input, we return NULL. * - * @return string atom, which is not meant to be freed until exit time. + * @return string constant, which is not meant to be freed until exit time. */ const char * eval_subst(const char *str) @@ -165,21 +154,19 @@ size_t len; char c; - g_assert(initialized); - if (str == NULL) return NULL; len = g_strlcpy(buf, str, sizeof buf); if (len >= sizeof buf) { - g_warning("eval_subst: string too large for substitution (%zu bytes)", - len); - return constant_make(str); + g_warning("%s(): string too large for substitution (%zu bytes)", + G_STRFUNC, len); + return constant_str(str); } if (common_dbg > 3) - g_debug("eval_subst: on entry: \"%s\"", buf); + g_debug("%s: on entry: \"%s\"", G_STRFUNC, buf); for (p = buf, c = *p++; c; c = *p++) { const char *val = NULL; @@ -189,7 +176,7 @@ case '~': if (start == buf && ('\0' == buf1 || '/' == buf1)) { /* Leading ~ only */ - val = home; + val = gethomedir(); g_assert(val); memmove(start, &start1, len - (start - buf)); len--; @@ -213,7 +200,7 @@ if (val != NULL) { char *next; - + next = insert_value(val, start, start - buf, len, sizeof buf - 1); len += next - start; p = next; @@ -226,122 +213,11 @@ } if (common_dbg > 3) - g_debug("eval_subst: on exit: \"%s\"", buf); + g_debug("%s: on exit: \"%s\"", G_STRFUNC, buf); g_assert(len == strlen(buf)); - return constant_make(buf); -} - -/** - * Compute the user's home directory. - * Uses the HOME environment variable first, then the entry from /etc/passwd. - * - * @return string atom. - */ -static const char * -get_home(void) -{ - const char *dir; - -#ifdef MINGW32 - dir = mingw_gethome(); -#else - dir = getenv("HOME"); - - if (dir && !is_absolute_path(dir)) { - /* Ignore $HOME if it's empty or a relative path */ - dir = NULL; - } - -#if defined(HAS_GETLOGIN) - if (!dir) { - const char *name; - - name = getlogin(); - if (name) { - const struct passwd *pp; - - pp = getpwnam(name); - if (pp) - dir = pp->pw_dir; - } - } -#endif - -#if defined(HAS_GETUID) - if (!dir) { - const struct passwd *pp; - - pp = getpwuid(getuid()); - if (pp) - dir = pp->pw_dir; - } -#endif /* HAS_GETUID */ - - if (!dir) - dir = g_get_home_dir(); - - if (!dir) { - g_warning("could not determine home directory"); - dir = "/"; - } -#endif /* MINGW32 */ - - return atom_str_get(dir); -} - -/** - * Extract variable name from string `s', then fetch value from environment. - * - * @return variable's value, or "" if not found and set `end' to the address - * of the character right after the variable name. - */ -static const char * -get_variable(const char *s, const char **end) -{ - const char *value, *p = s; - gboolean end_brace = FALSE; - - /* - * Grab variable's name. - */ - - if (*p == '{') { - p++; - s++; - end_brace = TRUE; - } - - while (is_ascii_alnum(*p) || *p == '_') { - p++; - } - - if (end_brace && *p == '}') - *end = &p1; - else - *end = p; - - /* - * Get value from environment. - */ - - { - char *name; - - name = h_strndup(s, p - s); - value = getenv(name); - - if (value == NULL) - value = ""; - - if (common_dbg > 4) - g_debug("variable \"%s\" is \"%s\"", name, value); - - HFREE_NULL(name); - } - - return value; + return constant_str(buf); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/eval.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/eval.h
Changed
@@ -40,9 +40,6 @@ * Public interface */ -void eval_init(void); -void eval_close(void); - const char *eval_subst(const char *str); #endif /* _eval_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/event.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/event.c
Changed
@@ -1,5 +1,6 @@ /* - * Copyright (c) 2002-2003, Richard Eckart + * Copyright (c) 2002-2003 Richard Eckart + * Copyright (c) 2013 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -25,21 +26,28 @@ * @ingroup lib * @file * + * Event mangement & dispatching logic. + * * @author Richard Eckart * @date 2002-2003 + * @author Raphael Manfredi + * @date 2013 */ #include "common.h" #include "event.h" -#include "glib-missing.h" + #include "misc.h" +#include "mutex.h" #include "omalloc.h" +#include "stacktrace.h" #include "walloc.h" + #include "override.h" /* Must be the last header included */ static inline struct subscriber * -subscriber_new(GCallback cb, enum frequency_type t, guint32 interval) +subscriber_new(callback_fn_t cb, enum frequency_type t, uint32 interval) { struct subscriber *s; @@ -71,8 +79,9 @@ g_assert(name != NULL); - evt = omalloc0(sizeof *evt); + OMALLOC0(evt); evt->name = name; + mutex_init(&evt->lock); return evt; /* Allocated once, never freed */ } @@ -82,136 +91,101 @@ * event will be NULL after this call. */ void -real_event_destroy(struct event *evt) -{ - GSList *sl; - for (sl = evt->subscribers; sl; sl = g_slist_next(sl)) - subscriber_destroy(sl->data); -} - -void -event_add_subscriber(struct event *evt, GCallback cb, - enum frequency_type t, guint32 interval) +event_destroy(struct event *evt) { - struct subscriber *s; - GSList *sl; + mutex_lock(&evt->lock); - g_assert(evt != NULL); - g_assert(cb != NULL); + pslist_free_full(evt->subscribers, (free_fn_t) subscriber_destroy); + evt->subscribers = NULL; + evt->destroyed = TRUE; - for (sl = evt->subscribers; sl; sl = g_slist_next(sl)) { - s = sl->data; - g_assert(s->cb != cb); - } + mutex_unlock(&evt->lock); - s = subscriber_new(cb, t, interval); - evt->subscribers = g_slist_append(evt->subscribers, s); + /* Event not freed, allocated via omalloc() */ } void -event_remove_subscriber(struct event *evt, GCallback cb) +event_add_subscriber(struct event *evt, callback_fn_t cb, + enum frequency_type t, uint32 interval) { - GSList *sl; - struct subscriber *s = NULL; + struct subscriber *s; + pslist_t *sl; g_assert(evt != NULL); g_assert(cb != NULL); + g_assert(!evt->destroyed); - for (sl = evt->subscribers; sl; sl = g_slist_next(sl)) { - s = sl->data; - if (s->cb == cb) - break; - } - - g_assert(sl != NULL); - g_assert(s != NULL); - g_assert(s->cb == cb); - - evt->subscribers = g_slist_remove(evt->subscribers, s); - subscriber_destroy(s); -} - -guint -event_subscriber_count(struct event *evt) -{ - return g_slist_length(evt->subscribers); -} - -gboolean -event_subscriber_active(struct event *evt) -{ - return NULL != evt->subscribers; -} - -struct event_table * -event_table_new(void) -{ - struct event_table *t; - - WALLOC0(t); - t->events = g_hash_table_new(g_str_hash, g_str_equal); + s = subscriber_new(cb, t, interval); - return t; -} + mutex_lock(&evt->lock); + PSLIST_FOREACH(evt->subscribers, sl) { + struct subscriber *sb = sl->data; + g_assert(sb != NULL); -void -real_event_table_destroy(struct event_table *t, gboolean cleanup) -{ - if (cleanup) - event_table_remove_all(t); + g_assert_log(sb->cb != cb, + "%s(): attempt to add callback %s() twice", + G_STRFUNC, stacktrace_function_name(cb)); + } - gm_hash_table_destroy_null(&t->events); + evt->subscribers = pslist_prepend(evt->subscribers, s); + mutex_unlock(&evt->lock); } void -event_table_add_event(struct event_table *t, struct event *evt) +event_remove_subscriber(struct event *evt, callback_fn_t cb) { - GHashTable *ht; + pslist_t *sl; + struct subscriber *s = NULL; - g_assert(t != NULL); g_assert(evt != NULL); + g_assert(cb != NULL); - ht = t->events; + mutex_lock(&evt->lock); - g_assert(ht != NULL); - g_assert(g_hash_table_lookup(ht, evt->name) == NULL); + if G_UNLIKELY(evt->destroyed) { + /* + * Event was destroyed, all subcribers were already removed. + */ - g_hash_table_insert(ht, (gpointer) evt->name, evt); -} + mutex_unlock(&evt->lock); + return; + } -void -event_table_remove_event(struct event_table *t, struct event *evt) -{ - GHashTable *ht; + PSLIST_FOREACH(evt->subscribers, sl) { + s = sl->data; + g_assert(s != NULL); + if G_UNLIKELY(s->cb == cb) + goto found; + } - g_assert(t != NULL); - g_assert(evt != NULL); + g_error("%s(): attempt to remove unknown callback %s()", + G_STRFUNC, stacktrace_function_name(cb)); - ht = t->events; +found: + g_assert(s->cb == cb); - g_assert(ht != NULL); - g_assert(g_hash_table_lookup(ht, evt->name) != NULL); + evt->subscribers = pslist_remove(evt->subscribers, s); + mutex_unlock(&evt->lock); - g_hash_table_remove(ht, evt->name); + subscriber_destroy(s); } -static gboolean -remove_helper(gpointer unused_key, gpointer value, gpointer unused_data) +uint +event_subscriber_count(struct event *evt) { - (void) unused_key; - (void) unused_data; - event_destroy(value); + uint len; + + mutex_lock(&evt->lock); + len = pslist_length(evt->subscribers); + mutex_unlock(&evt->lock); - return TRUE; + return len; } -void -event_table_remove_all(struct event_table *t) +bool +event_subscriber_active(struct event *evt) { - g_assert(t != NULL); - g_assert(t->events != NULL); - - g_hash_table_foreach_remove(t->events, remove_helper, NULL); + return NULL != evt->subscribers; } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/event.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/event.h
Changed
@@ -1,5 +1,6 @@ /* * Copyright (c) 2002-2003, Richard Eckart + * Copyright (c) 2013 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -21,11 +22,25 @@ *---------------------------------------------------------------------- */ +/** + * @ingroup lib + * @file + * + * Event mangement & dispatching logic. + * + * @author Richard Eckart + * @date 2002-2003 + * @author Raphael Manfredi + * @date 2013 + */ + #ifndef _event_h_ #define _event_h_ #include "common.h" +#include "pslist.h" +#include "mutex.h" #include "tm.h" typedef enum frequency_type { @@ -34,33 +49,29 @@ } frequency_t; struct subscriber { - GCallback cb; + callback_fn_t cb; enum frequency_type f_type; - guint32 f_interval; + uint32 f_interval; time_t last_call; }; typedef struct event { const char *name; - guint32 triggered_count; - GSList *subscribers; + uint32 triggered_count; + pslist_t *subscribers; + mutex_t lock; + bool destroyed; } event_t; struct event *event_new(const char *name); -#define event_destroy(evt) G_STMT_START { \ - real_event_destroy(evt); \ - /* Event not freed, allocated via omalloc() */ \ -} G_STMT_END - -void real_event_destroy(struct event *evt); - +void event_destroy(struct event *evt); void event_add_subscriber( - struct event *evt, GCallback cb, frequency_t t, guint32 interval); -void event_remove_subscriber(struct event *evt, GCallback cb); + struct event *evt, callback_fn_t cb, frequency_t t, uint32 interval); +void event_remove_subscriber(struct event *evt, callback_fn_t cb); -guint event_subscriber_count(struct event *evt); -gboolean event_subscriber_active(struct event *evt); +uint event_subscriber_count(struct event *evt); +bool event_subscriber_active(struct event *evt); /* * T_VETO: breaks trigger chain as soon as a subscriber returns @@ -74,17 +85,18 @@ #define event_trigger(ev, callback) G_STMT_START { \ struct { \ - GSList *sl; \ + pslist_t *sl; \ event_t *evt; \ struct subscriber *s; \ time_t now; \ - gboolean t; \ + bool t; \ } vars_; \ \ + mutex_lock(&(ev)->lock); \ vars_.evt = (ev); \ vars_.now = (time_t) -1; \ vars_.sl = vars_.evt->subscribers; \ - for (/* NOTHING */; vars_.sl; vars_.sl = g_slist_next(vars_.sl)) { \ + for (/* NOTHING */; vars_.sl; vars_.sl = pslist_next(vars_.sl)) { \ vars_.s = vars_.sl->data; \ vars_.t = 0 == vars_.s->f_interval; \ if (!vars_.t) { \ @@ -97,7 +109,7 @@ if ((time_t) -1 == vars_.now) \ vars_.now = tm_time(); \ vars_.t = vars_.s->f_interval <= \ - (guint32) delta_time(vars_.now, vars_.s->last_call);\ + (uint32) delta_time(vars_.now, vars_.s->last_call); \ break; \ default: \ g_assert_not_reached(); \ @@ -113,25 +125,9 @@ } \ } \ vars_.evt->triggered_count++; \ + mutex_unlock(&(ev)->lock); \ } G_STMT_END -struct event_table { - GHashTable *events; -}; - -struct event_table *event_table_new(void); - -#define event_table_destroy(t) G_STMT_START { \ - real_event_table_destroy(t); \ - WFREE_NULL(t, sizeof *t); \ -} G_STMT_END -void real_event_table_destroy(struct event_table *t, gboolean cleanup); - - -void event_table_add_event(struct event_table *t, struct event *evt); -void event_table_remove_event(struct event_table *t, struct event *evt); -void event_table_remove_all(struct event_table *t); - #endif /* _event_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/evq.c
Added
@@ -0,0 +1,1173 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Event Queue. + * + * This is a per-thread callout queue, which guarantees that events are + * delivered in the thread that registered them. + * + * It is implemented as a private callout queue running in a dedicated thread + * and which wraps events through a trampoline that will dispatch the event + * via a per-thread signal handler, using the TSIG_EVQ signal. + * + * Each event-registering thread has a local queue, recording the events it + * registers in the global event queue (so that they may be reclaimed when + * the thread exits), but also the events that have triggered already and + * need to be dispatched to the thread. + * + * Direct access to the callout queue is also given because it is guaranteed + * that the event queue will run in a dedicated thread. As such, the library + * code should use the event queue for its own processing and leave the main + * callout queue to the application. Events registered directly to the + * event queue are run from the event queue thread, not dispatched to the + * registering thread. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#include "evq.h" + +#include "atomic.h" +#include "cq.h" +#include "elist.h" +#include "log.h" +#include "mutex.h" +#include "once.h" +#include "spinlock.h" +#include "stacktrace.h" +#include "thread.h" +#include "tm.h" +#include "tsig.h" +#include "walloc.h" + +#include "override.h" /* Must be the last header included */ + +#define EVQ_PERIOD 2000 /**< 2 s, in ms */ + +#define EVQ_STACK_SIZE MAX(THREAD_STACK_MIN, 32768) + +enum evq_event_magic { EVQ_EVENT_MAGIC = 0x70ecb781 }; + +/** + * Event queue event. + */ +struct evq_event { + enum evq_event_magic magic; /**< Magic number (must be at the top) */ + cevent_t *ev; /**< Callout queue event registered */ + notify_fn_t cb; /**< Callback routine */ + void *arg; /**< Argument to pass to said callback */ + uint stid; /**< Registering thread */ + int refcnt; /**< Reference count */ + uint cancelable:1; /**< Whether event will be evq_cancel()ed */ + uint cancelled:1; /**< Whether they called evq_cancel() */ + link_t lk; /**< Links all events for given thread */ + uint64 qid; /**< Queue ID where event was put */ +}; + +static inline void +evq_event_check(const struct evq_event * const eve) +{ + g_assert(eve != NULL); + g_assert(EVQ_EVENT_MAGIC == eve->magic); +} + +enum evq_magic { EVQ_MAGIC = 0x00d0f996 }; + +/** + * Event queue descriptor, instantiated locally on a per-thread basis. + */ +struct evq { + enum evq_magic magic; /**< Magic number */ + uint stid; /**< Thread where event queue runs */ + int refcnt; /**< Reference count */ + uint64 qid; /**< Queue ID */ + elist_t events; /**< Events registered for this thread */ + elist_t triggered; /**< Events triggered for this thread */ + mutex_t lock; /**< Thread-safety for queue changes */ +}; + +static inline void +evq_check(const struct evq * const evq) +{ + g_assert(evq != NULL); + g_assert(EVQ_MAGIC == evq->magic); +} + +#define EVQ_LOCK(q) mutex_lock(&(q)->lock) +#define EVQ_UNLOCK(q) mutex_unlock(&(q)->lock) + +static int evq_debug = 0; /**< Debugging level */ +static cqueue_t *ev_queue; /**< Our private callout queue */ +static once_flag_t evq_inited; /**< Records global initialization */ +static spinlock_t evq_global_slk = SPINLOCK_INIT; +static uint evq_thread_id = THREAD_INVALID_ID; +static tm_t evq_sleep_end; /**< Expected wake-up time */ +static bool evq_run; /**< Whether evq thread should run */ +static bool evq_fully_inited; /**< Set when init fully done */ +static bool evq_running; /**< Set when evq thread running */ +static uint64 evq_queue_id; /**< Unique queue ID generator */ + +#define EVQ_GLOBAL_LOCK spinlock(&evq_global_slk) +#define EVQ_GLOBAL_UNLOCK spinunlock(&evq_global_slk) + +/** + * Thread-specific array of event queues. + * + * Each thread is given a queue where it can register events. When a thread + * dies, all the events registered for it are discarded. + */ +static struct evq *evqsTHREAD_MAX; +static spinlock_t evqs_slk = SPINLOCK_INIT; + +#define EVQ_ARRAY_LOCK spinlock_hidden(&evqs_slk) +#define EVQ_ARRAY_UNLOCK spinunlock_hidden(&evqs_slk) + +#define evq_debugging(lvl) G_UNLIKELY(evq_debug > (lvl)) + +/** + * Set debugging level. + */ +void +evq_set_debug(uint32 lvl) +{ + evq_debug = lvl; +} + +/** + * Event queue thread. + */ +static void * +evq_thread_main(void *unused_arg) +{ + tsigset_t nset; + + (void) unused_arg; + + atomic_bool_set(&evq_running, TRUE); + thread_set_name("event queue"); + + /* + * "nset" contains only a signal signal: TSIG_EVQ. + */ + + tsig_emptyset(&nset); + tsig_addset(&nset, TSIG_EVQ); + + /* + * Periodically run our private "evq" callout queue, dynamically + * adjusting our sleeping intervals to call cq_heartbeat() only + * when necessary. + */ + + while (atomic_bool_get(&evq_run)) { + int delay; + tm_t ms; + tsigset_t oset; + + if (evq_debugging(3)) + s_debug("%s(): heart-beating", G_STRFUNC); + + /* + * Because we dynamically compute the delay until the next event, + * we normally dispatch a callback every heartbeat we schedule. + * + * As such, idle tasks are not going to be scheduled regularily + * so we force a dispatch each time we have processed events during + * the heartbeat -- it will be throttled anyway if the idle tasks + * were recently run. + */ + + if (0 != cq_heartbeat(ev_queue)) + cq_idle(ev_queue); + + /* + * Compute the delay when the next event would fire in our queue, and + * determine the absolute time at which we would wake up. + * + * Of course, there is a potential for race condition since at any + * time a new event scheduled before that computed delay could be + * inserted in the queue. + * + * To close that race condition, we publish the expected end time + * at which we will end our sleep. The protocol is that if any event + * to be enqueued would end up firing before the published end time, + * the enqueuing thread will send us a TSIG_EVQ signal, which will + * take us out of thread_timed_sigsuspend() -- see evq_notify(). + * + * Note that we do not trap the TSIG_EVQ signal in this thread. + */ + + thread_sigmask(TSIG_BLOCK, &nset, &oset); /* Critical section */ + + g_assert_log(!tsig_ismember(&oset, TSIG_EVQ), + "%s(): cannot run with TSIG_EVQ blocked", G_STRFUNC); + + delay = cq_delay(ev_queue); + delay = MIN(delay, EVQ_PERIOD); /* Run at least every EVQ_PERIOD */ + tm_fill_ms(&ms, delay); + + EVQ_GLOBAL_LOCK; + tm_now(&evq_sleep_end); + tm_add(&evq_sleep_end, &ms); + EVQ_GLOBAL_UNLOCK; + + /* + * Atomically restore the previous signal mask and wait for signals + * (we really only expect TSIG_EVQ, but any signal will wake us up) + * or until the specified delay is expired. + * + * If any signals are present, thread_timed_sigsuspend() will return + * immediately. + * + * Upon return, we schedule a callout queue heartbeat to dispatch + * any expired event. + */ + + if (evq_debugging(0)) + s_debug("%s(): sleeping for %d ms", G_STRFUNC, delay); + + if (thread_timed_sigsuspend(&oset, &ms)) { + if (evq_debugging(0)) + s_debug("%s(): sleep interrupted by signal", G_STRFUNC); + } + } + + if (evq_debugging(0)) + s_debug("%s(): exiting", G_STRFUNC); + + atomic_bool_set(&evq_running, FALSE); + cq_free_null(&ev_queue); + return NULL; +} + +/** + * Perform global initialization of the EVQ layer. + */ +static void +evq_init_once(void) +{ + /* + * Make sure the time thread starts before, to avoid a deadlock during + * the auto-initialization of our runtime now that xmalloc_xgc_install() + * uses the EVQ to invoke xgc() periodically. + */ + + (void) tm_time_exact(); + + /* + * The callout queue will determine its heartbeating thread when we + * first call cq_heartbeat() on it. + */ + + ev_queue = cq_make("evq", 0, EVQ_PERIOD); + atomic_bool_set(&evq_run, TRUE); + + /* + * By default, the thread signal mask is inherited by the new thread, + * following the traditional POSIX semantics. Here, we want to make + * sure the new thread has a cleared signal mask when it starts up, + * to ensure TSIG_EVQ is not blocked. + * + * The THREAD_F_CLEARSIG flag requests that the present signal mask + * be not propagated to the new thread, which will thus start with + * a zeroed mask (all signals allowed). + */ + + evq_thread_id = thread_create(evq_thread_main, NULL, + THREAD_F_DETACH | THREAD_F_NO_CANCEL | + THREAD_F_NO_POOL | THREAD_F_PANIC | + THREAD_F_CLEARSIG, + EVQ_STACK_SIZE); + + evq_fully_inited = TRUE; +} + +/** + * @return whether the event queue is fully inited. + */ +bool +evq_is_inited(void) +{ + return evq_fully_inited && evq_run; +} + +static inline ALWAYS_INLINE void +evq_init(void) +{ + ONCE_FLAG_RUN(evq_inited, evq_init_once); +} + +/** + * Shutdown the event queue. + */ +void +evq_close(void) +{ + atomic_bool_set(&evq_run, FALSE); + if (-1 != thread_kill(evq_thread_id, TSIG_TERM)) { + tm_t tmout; + + /* + * The event queue runs in a detached thread, with which we cannot + * join, but we can wait for it since we know we're at shutdown time + * and no other threads will be created. + * + * To avoid blocking in case of problems, wait for at most 2 seconds. + */ + + tmout.tv_sec = 2; + tmout.tv_usec = 0; + thread_timed_wait(evq_thread_id, &tmout, NULL); + } else { + s_warning("%s(): could not signal evq thread: %m", G_STRFUNC); + } + evq_thread_id = THREAD_INVALID_ID; +} + +/** + * Allocate a local event queue. + * + * @param id the thread ID for which we allocate the queue + */ +static struct evq * +evq_alloc(uint id) +{ + struct evq *q; + + WALLOC0(q); + q->magic = EVQ_MAGIC; + q->stid = id; + q->refcnt = 1; + elist_init(&q->events, offsetof(struct evq_event, lk)); + elist_init(&q->triggered, offsetof(struct evq_event, lk)); + mutex_init(&q->lock); + + return q; +} + +/** + * Allocate a new event. + * + * @param id thread ID recording the event + * @param fn routine to call + * @param arg argument to supply to routine + * + * @return a new event. + */ +static struct evq_event * +evq_event_alloc(uint id, notify_fn_t fn, const void *arg) +{ + struct evq_event *eve; + + WALLOC0(eve); + eve->magic = EVQ_EVENT_MAGIC; + eve->stid = id; + eve->cb = fn; + eve->arg = deconstify_pointer(arg); + eve->refcnt = 1; + + return eve; +} + +/** + * Free event. + */ +static void +evq_event_free(struct evq_event *eve) +{ + evq_event_check(eve); + + if (evq_debugging(2)) { + s_debug("%s(): freeing %s%s(%p), refcnt=%d", + G_STRFUNC, eve->cancelable ? "cancelable " : "", + stacktrace_function_name(eve->cb), eve->arg, + atomic_int_get(&eve->refcnt)); + } + + /* + * Watch out for shutdown, when the event queue thread is freeing its + * own queued events: if the ev_queue variable has been nullified, + * the callout queue is gone, hence we must not attempt to cancel the + * events. + */ + + if G_LIKELY(ev_queue != NULL) + cq_cancel(&eve->ev); + + eve->magic = 0; + WFREE(eve); +} + +/** + * Forcefully discard events when thread is exiting. + */ +static void +evq_event_discard(void *data, void *udata) +{ + struct evq_event *eve = data; + const char *what = udata; + + evq_event_check(eve); + + /* + * Do not warn when we're clearing an event in the event queue thread + * itself, since the event queue thread can only disappear when we're + * actually shutdowning the process. + */ + + if (eve->stid != evq_thread_id) { + s_warning("%s(): discarding %s %sevent %s(%p) for %s", + G_STRFUNC, what, eve->cancelable ? "cancelable " : "", + stacktrace_function_name(eve->cb), eve->arg, + thread_id_name(eve->stid)); + + /* + * If the event is cancelable and has not fired yet, it won't be + * able to be cancelled by the thread, since that thread is exiting! + */ + + if (eve->cancelable) { + g_assert_log(thread_small_id() == eve->stid, + "%s(): in %s, but event recorded by %s", + G_STRFUNC, thread_name(), thread_id_name(eve->stid)); + + if (ev_queue != NULL) + cq_cancel(&eve->ev); + + /* + * An extra reference was taken for the cancelable event. + * + * Because we've dropped the event queue from the thread, a + * concurrent evq_trampoline() call will not enter its main + * processing part and will simply decrement the reference + * count, freeing the event when it drops to 0. + * + * As such, there is no need to flag the event as "cancelled", + * but we have to remove the extra reference to be able to + * free the event, either here or in evq_trampoline(). + */ + + atomic_int_dec(&eve->refcnt); + } + } + + /* + * When closing down the event queue thread, there is no risk of any + * concurrent scheduling of the event, so we can free the event regardless + * of its reference count. + */ + + if G_LIKELY( + atomic_int_dec_is_zero(&eve->refcnt) || + eve->stid == evq_thread_id /* Shutting down, event cannot trigger */ + ) + evq_event_free(eve); +} + +/** + * Release local event queue, freeing it when no longer referenced. + */ +static void +evq_release(struct evq *q) +{ + evq_check(q); + + if G_UNLIKELY(atomic_int_dec_is_zero(&q->refcnt)) { + if (evq_debugging(0)) { + s_debug("%s(): destroying queue for %s", + G_STRFUNC, thread_id_name(q->stid)); + } + + mutex_lock(&q->lock); + elist_foreach(&q->events, evq_event_discard, "future"); + elist_foreach(&q->triggered, evq_event_discard, "triggered"); + mutex_destroy(&q->lock); + + q->magic = 0; + WFREE(q); + } +} + +/** + * Free local event queue. + * + * This is invoked as a thread exit callback. + */ +static void +evq_free(void *value, void *arg) +{ + struct evq *q = arg; + + evq_check(q); + + (void) value; /* Thread exit value is ignored */ + + EVQ_ARRAY_LOCK; + evqsq->stid = NULL; + EVQ_ARRAY_UNLOCK; + + evq_release(q); +} + +/** + * Get local event queue, reference-counting it. + * + * @param id the thread ID for which we want the queue + * + * @return the ref-counted queue, NULL if none. + */ +static struct evq * +evq_get(uint id) +{ + struct evq *q; + + EVQ_ARRAY_LOCK; + q = evqsid; + if (q != NULL) { + evq_check(q); + atomic_int_inc(&q->refcnt); + } + EVQ_ARRAY_UNLOCK; + + return q; +} + +/** + * Event dispatcher signal handler. + * + * There is one such dispatcher per client thread using the event queue and + * it is the origin point of all the callbacks. + * + * Invoked when there are triggered events in the local queue to be dispatched + * in the thread. + */ +static void +evq_local_dispatch(int sig) +{ + uint id = thread_small_id(); + struct evq *q; + evq_event_t *eve; + + g_assert(TSIG_EVQ == sig); + + q = evq_get(id); + + /* + * This should never happen: if the thread is gone, the events should have + * been removed from its local queue, and the callout events cancelled. + * But if it does happen, don't panic, just log that something is wrong. + */ + + if G_UNLIKELY(NULL == q) { + s_critical_once_per(LOG_PERIOD_MINUTE, + "%s(): local queue missing in %s, cannot dispatch events", + G_STRFUNC, thread_name()); + return; + } + + /* + * Process the triggered events, removing them from the triggered queue + * one at a time. + */ + + mutex_lock(&q->lock); + + while (NULL != (eve = elist_shift(&q->triggered))) { + evq_event_check(eve); + g_assert(id == eve->stid); + g_assert(NULL == eve->ev); /* Event triggered in callout queue */ + g_assert(eve->refcnt >= 1); + + if G_UNLIKELY(eve->cancelled) { + evq_event_free(eve); + continue; + } + + mutex_unlock(&q->lock); + + (*eve->cb)(eve->arg); + + /* + * A cancellable event is not freed here, it will be freed when + * they call evq_cancel() on it and the reference count drops. + * This is due to the fact that it was initially created with a + * reference count of 3. + */ + + if G_LIKELY(atomic_int_dec_is_zero(&eve->refcnt)) + evq_event_free(eve); + + mutex_lock(&q->lock); + } + + mutex_unlock(&q->lock); + evq_release(q); +} + +/** + * Create an event queue to hold events for this thread. + * + * @param id the thread ID for which we want to init the queue. + * + * @return the allocated queue (ref-counted, so must call evq_release() on it). + */ +static struct evq * +evq_local_init(uint id) +{ + struct evq *q; + tsighandler_t old; + + g_assert(thread_small_id() == id); + + /* + * Create the queue and register cleanup, when the thread exits. + * + * We associate a unique queue ID to each queue in order to verify, + * when the event triggers and is processed, that it really belongs + * to the current queue for the thread and not to a previous queue + * installed for the same thread ID. + */ + + q = evq_alloc(id); + + EVQ_ARRAY_LOCK; + q->qid = evq_queue_id++; /* Updated under lock protection */ + g_assert(NULL == evqsid); + evqsid = q; + EVQ_ARRAY_UNLOCK; + + thread_atexit(evq_free, q); + + /* + * Install the signal handler to be able to process fired events: + * the event queue thread will send us a TSIG_EVQ signal when it + * has enqueued triggered events in our queue so that we can dispatch + * them in the context of the thread that registered the original event. + */ + + old = thread_signal(TSIG_EVQ, evq_local_dispatch); + + g_assert_log(old != TSIG_ERR, + "%s(): could not install signal handler in %s: %m", + G_STRFUNC, thread_name()); + + g_assert_log(TSIG_DFL == old, + "%s(): found existing signal handler %s() for TSIG_EVQ in %s", + G_STRFUNC, stacktrace_function_name(old), thread_name()); + + atomic_int_inc(&q->refcnt); + return q; +} + +/** + * Trampoline code, invoked from the event queue thread. + */ +static void +evq_trampoline(cqueue_t *cq, void *obj) +{ + struct evq_event *eve = obj; + struct evq *q; + uint id; + + evq_event_check(eve); + g_assert(thread_small_id() == evq_thread_id); + + cq_zero(cq, &eve->ev); /* Callback fired */ + + /* + * We need the cq_cancel() on top of cq_zero() above because that + * callout queue event is an extended one (created by a thread other + * than the one running the callout queue). + */ + + cq_cancel(&eve->ev); /* Clear event */ + + /* + * Now that the callback fired, it can no longer be cancelled by + * the issuer. However, we need to dispatch it to the proper thread. + */ + + id = eve->stid; + q = evq_get(id); + + if G_UNLIKELY(NULL == q) { + const char *tname = thread_id_name(eve->stid); + + /* + * Since thread_id_name() uses stacktrace_function_name() which + * returns a pointer to static data, we need to call the former + * first, which will copy the output of stacktrace_function_name() + * to a thread-private buffer. + * + * We cannot call both routines as part of the argument list for + * s_critical_once_per() since we cannot know the evaluation order + * chosen by the compiler. We force that order by doing an explicit + * computation in the order we want for results to be correct. + */ + + s_warning("%s(): queue gone in %s, cannot dispatch %s(%p)", + G_STRFUNC, tname, stacktrace_function_name(eve->cb), eve->arg); + + evq_event_check(eve); /* Since no queue locked, ensure still valid */ + + if G_LIKELY(atomic_int_dec_is_zero(&eve->refcnt)) + evq_event_free(eve); + + return; + } + + /* + * If the event queue ID does not match that of the queue installed for + * the thread, it means we hit a race condition and are processing an + * old obsolete event -- the old queue is gone so we can blindly free + * that event that nobody can refer now. + */ + + if G_UNLIKELY(eve->qid != q->qid) { + s_warning("%s(): ignoring obsolete %s(%p) event", + G_STRFUNC, stacktrace_function_name(eve->cb), eve->arg); + evq_event_free(eve); + return; + } + + /* + * Transfer event into the list of triggered events. + * + * As soon as the item is transferred and the mutex unlocked, we shall no + * longer access the event, as it could have already been processed + * by the thread and freed. This is why we saved the thread id in a local + * variable before. + */ + + mutex_lock(&q->lock); + + elist_remove(&q->events, eve); /* Event triggered */ + + /* + * An event could be concurrently cancelled by the registering thread + * and at the same time dispatched by the callout queue. In that case, + * we must not do anything with the event. See evq_cancel(). + */ + + if G_UNLIKELY(2 == atomic_int_dec(&eve->refcnt) && eve->cancelable) { + mutex_unlock(&q->lock); + evq_event_free(eve); + goto done; + } + + /* + * Event will be handled by the signal handler. + */ + + elist_append(&q->triggered, eve); + + /* + * Need to log during the critical section because as soon as we exit + * the critical section, ``eve'' could be freed. + */ + + if (evq_debugging(1)) { + s_debug("%s(): queued %s() for %s", G_STRFUNC, + stacktrace_function_name(eve->cb), thread_id_name(id)); + } + + mutex_unlock(&q->lock); + + /* + * Signal the target thread that it has triggered events to dispatch. + */ + + if (-1 == thread_kill(id, TSIG_EVQ)) { + s_critical_once_per(LOG_PERIOD_SECOND, + "%s(): cannot send TSIG_EVQ to %s: %m", + G_STRFUNC, thread_id_name(id)); + } + +done: + evq_release(q); +} + +/** + * Notify the thread running the event queue if an event is scheduled + * before its wakeup time. + * + * @param delay the event delay, in ms + */ +static void +evq_notify(int delay) +{ + tm_t ms, target; + bool before; + + tm_now(&target); + tm_fill_ms(&ms, delay); + tm_add(&target, &ms); + + /* + * Check whether the thread will end its sleep before ``delay'' ms + * have passed and, if not, update the desired targe time (so that + * subsequent calls to this routine do not needlessly attempt to + * re-signal). + */ + + EVQ_GLOBAL_LOCK; + before = tm_elapsed_ms(&target, &evq_sleep_end); + if G_UNLIKELY(before < 0) + evq_sleep_end = target; /* Struct copy */ + EVQ_GLOBAL_UNLOCK; + + /* + * Sending the signal will let the thread process the callout queue. + */ + + if G_UNLIKELY(before < 0 && atomic_bool_get(&evq_running)) { + if (evq_debugging(0)) { + s_debug("%s(): notifying (need to trigger %'ld ms earlier)", + G_STRFUNC, -(long) before); + } + if (-1 == thread_kill(evq_thread_id, TSIG_EVQ)) { + s_carp("%s(): cannot signal %s: %m", + G_STRFUNC, thread_id_name(evq_thread_id)); + } + } +} + +/** + * Add event in the event queue. + * + * @param delay delay in ms + * @param fn the routine to call + * @param arg routine argument + * @param cancelable whether event can be cancelled + * + * @return opaque event handle. + */ +static evq_event_t * +evq_add(int delay, notify_fn_t fn, const void *arg, bool cancelable) +{ + uint id = thread_small_id(); + struct evq *q; + struct evq_event *eve; + + g_assert(delay > 0); + g_assert(fn != NULL); + + evq_init(); + + if G_UNLIKELY(NULL == ev_queue) + return NULL; /* Shutdowning */ + + q = evq_get(id); + + if G_UNLIKELY(NULL == q) + q = evq_local_init(id); + + evq_check(q); + + /* + * Allocate an event and enqueue it in the thread's queue. + * + * The registered callout queue event will trigger the event through + * the trampoline to redirect the call to the proper thread. + * + * The event is associated with the current queue ID of the targeted + * thread to avoid any race condition later on: the thread processing + * the callout queue could decide to trigger the event, and at the same + * time the old thread could disappear and a new thread replace it with + * another queue! + */ + + eve = evq_event_alloc(id, fn, arg); + eve->cancelable = booleanize(cancelable); + eve->qid = q->qid; + + eve->refcnt++; /* Now about to be referenced by callout queue */ + + /* + * If the event is cancellable, we need an extra reference to make sure + * we keep the object around until evq_cancel(). + * + * A non-cancelable event has therefore an initial reference count of 2, + * but a cancelable one will have a count of 3. + * + * The reference count can be decremented at 3 places: in evq_cancel(), + * which only cancelable events can call, in evq_trampoline() once the + * callout event has expired, and in evq_local_dispatch() when the event + * is finally dispatched to the thread that registered it. + */ + + if (eve->cancelable) + eve->refcnt++; + + mutex_lock(&q->lock); + eve->ev = cq_insert(ev_queue, delay, evq_trampoline, eve); + elist_append(&q->events, eve); + mutex_unlock(&q->lock); + + evq_release(q); + + /* + * If the event queue thread will wake up later than the event we + * just recorded, notify it via a signal so that it can recompute + * the proper delay. + */ + + evq_notify(delay); + + return eve; +} + +/** + * Schedule a new event in the event queue that cannot be cancelled. + * + * @param delay delay in ms + * @param fn the routine to call + * @param arg routine argument + */ +void +evq_schedule(int delay, notify_fn_t fn, const void *arg) +{ + evq_add(delay, fn, arg, FALSE); +} + +/** + * Insert a new event in the event queue and return an opaque handle that + * can be used to cancel the event. + * + * The caller MUST call evq_cancel() on the returned value, regardless of + * whether the event triggered or not, to be able to cleanup memory. Hence, + * the result of this routine must not be ignored. + * + * @param delay delay in ms + * @param fn the routine to call + * @param arg routine argument + * + * @return opaque event handle that must be used to evq_cancel() it. + */ +evq_event_t * +evq_insert(int delay, notify_fn_t fn, const void *arg) +{ + return evq_add(delay, fn, arg, TRUE); +} + +/** + * Cancel a recorded event and nullify its pointer. + * + * This must be called from the same thread that registered the event. + */ +void +evq_cancel(evq_event_t **eve_ptr) +{ + evq_event_t *eve = *eve_ptr; + + if G_UNLIKELY(NULL == ev_queue) + return; /* Shutdowning */ + + if (eve != NULL) { + uint stid = thread_small_id(); + struct evq *q; + bool triggered; + + q = evq_get(stid); + + /* + * We cannot blindly assert that q != NULL. + * + * During thread cleanup, there is one valid reason that could lead + * to evq_cancel() being called with the queue already removed: the + * thread-magazine allocator installs events, and the event queue + * thread itself uses the thread-magazine allocator... + * + * When q == NULL, the calling thread must be exiting, and in that + * case, we must not access the event since it has already been freed. + */ + + if G_UNLIKELY(NULL == q) { + if (thread_is_exiting()) + return; /* Given a freed event since queue is gone */ + + s_error("%s(): local queue missing for %s", + G_STRFUNC, thread_name()); + } + + if (evq_debugging(2)) { + s_debug("%s() on %s(%p) refcnt=%d", + G_STRFUNC, stacktrace_function_name(eve->cb), + eve->arg, eve->refcnt); + } + + mutex_lock(&q->lock); + + /* + * Handle concurrent event dispatching: we can call evq_cancel() + * whilst the event is being dispatched by the event queue thread. + * + * We rely on cq_cancel() to tell us whether the callout queue has + * already been dispatching the registered event, when eve->ev is + * not NULL already. + */ + + evq_event_check(eve); /* Not already freed */ + g_assert(stid == eve->stid); /* In same thread as registration */ + g_assert(eve->cancelable); + g_assert(!eve->cancelled); + + triggered = cq_cancel(&eve->ev); + eve->cancelled = TRUE; + + /* + * A cancellable event has an inital reference count of 3. + */ + + if G_LIKELY(3 == atomic_int_dec(&eve->refcnt)) { + /* + * If the event triggered, we have not yet reached the part in + * evq_trampoline() where we decrement the reference count, but + * we're soon going to, and then it will see that the reference + * count dropped to 2 and it will remove the event. + * + * If the event has not triggered already, it has been cancelled + * properly by our call above and we can now dispose of it. + */ + + if (!triggered) { + g_assert(2 == eve->refcnt); + elist_remove(&q->events, eve); + evq_event_free(eve); + } + } else { + /* + * The event necessarily triggered already. + * + * Only free it if we're the last reference on it, otherwise it + * is still awaiting delivery in the triggered queue. + */ + + if (0 == eve->refcnt) + evq_event_free(eve); + } + + mutex_unlock(&q->lock); + evq_release(q); + *eve_ptr = NULL; + } +} + +/*** + *** The following routines are interfacing with the event queue directly. + *** + *** Registered events will be delivered from the event queue thread, hence + *** the "evq_raw_" prefix for the involved routines: the routines are just + *** wrapping the calls to the callout queue to be able to notify the thread + *** in case it needs to wake up earlier than expected to deliver the event. + ***/ + +/** + * Insert event in our main event queue. + * + * Use cq_cancel() directly to cancel this event. + * + * @attention + * We do not make the ev_queue variable visible from the outside because + * we need to call evq_notify() each time we add an event since the event + * queue heartbeats are not regularily spaced. + * + * @param delay delay (in ms) before triggering the event + * @param fn the function to invoke when delay expired + * @param arg argument to pass to function + */ +cevent_t * +evq_raw_insert(int delay, cq_service_t fn, void *arg) +{ + cevent_t *ev; + + evq_init(); + + if G_UNLIKELY(NULL == ev_queue) + return NULL; /* Shutdowning */ + + ev = cq_insert(ev_queue, delay, fn, arg); + evq_notify(delay); + + return ev; +} + +/** + * Create a new idle event. + * + * Use cq_idle_remove() directly to cancel it or have the event return FALSE + * to stop periodic invocations.. + * + * @param event the function to invoke when idle + * @param arg argument to pass to function + */ +cidle_t * +evq_raw_idle_add(cq_invoke_t event, void *arg) +{ + cidle_t *ci; + + evq_init(); + + if G_UNLIKELY(NULL == ev_queue) + return NULL; /* Shutdowning */ + + ci = cq_idle_add(ev_queue, event, arg); + evq_notify(0); /* Always wake-up thread when new idle event added */ + + return ci; +} + +/** + * Create a new periodic event. + * + * Use cq_periodic_remove() directly to cancel it or have the event return + * FALSE to stop periodic invocations.. + * + * @param delay period (in ms) between two event invocations + * @param event the function to invoke periodically + * @param arg argument to pass to function + */ +cperiodic_t * +evq_raw_periodic_add(int period, cq_invoke_t event, void *arg) +{ + cperiodic_t *cp; + + evq_init(); + + if G_UNLIKELY(NULL == ev_queue) + return NULL; /* Shutdowning */ + + cp = cq_periodic_add(ev_queue, period, event, arg); + evq_notify(period); + + return cp; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/evq.h
Added
@@ -0,0 +1,64 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Event Queue. + * + * This is a specialized callout queue dedicated to events that need to + * be dispached in the thread registering the event. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#ifndef _evq_h_ +#define _evq_h_ + +#include "cq.h" + +typedef struct evq_event evq_event_t; + +/* + * Public interface. + */ + +void evq_close(void); +bool evq_is_inited(void); + +void evq_set_debug(uint32 lvl); + +evq_event_t *evq_insert(int delay, notify_fn_t fn, const void *arg) + WARN_UNUSED_RESULT; +void evq_schedule(int delay, notify_fn_t fn, const void *arg); +void evq_cancel(evq_event_t **eve_ptr); + +cevent_t *evq_raw_insert(int delay, cq_service_t fn, void *arg); +cidle_t *evq_raw_idle_add(cq_invoke_t event, void *arg); +cperiodic_t *evq_raw_periodic_add(int period, cq_invoke_t event, void *arg); + +#endif /* _evq_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/exit.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/exit.c
Changed
@@ -32,6 +32,9 @@ * supersedes malloc(): at startup time, we had no chance to initialize the * necessary constants to compute page size alignments. * + * They suspend the other threads to avoid problems and parasite logging as + * we reclaim important resources during signal_perform_cleanup(). + * * @author Raphael Manfredi * @date 2011 */ @@ -39,7 +42,12 @@ #include "common.h" #include "exit.h" + +#include "atomic.h" #include "crash.h" +#include "signal.h" +#include "thread.h" +#include "win32dlp.h" #include "xmalloc.h" #include "override.h" /* Must be the last header included */ @@ -47,14 +55,40 @@ #undef exit #undef _exit +static int exit_cleanup_started; + /** - * Exit with given status for the parent process. + * Exit common cleanup. */ -G_GNUC_COLD void -do_exit(int status) +void G_COLD +exit_cleanup(void) { + /* + * Run this only once, to avoid endless loops should one of the cleanup + * routines have to call a remapped exit(), re-entering do_exit() and here + * endlessly until we run out of stack. + */ + + if (0 != atomic_int_inc(&exit_cleanup_started)) + return; + +#ifdef MINGW32 + win32dlp_exiting(); +#endif + + thread_exit_mode(); xmalloc_stop_freeing(); + signal_perform_cleanup(); crash_close(); +} + +/** + * Exit with given status for the parent process. + */ +void G_COLD +do_exit(int status) +{ + exit_cleanup(); exit(status); } @@ -63,10 +97,10 @@ * * Handlers registered with atexit() are not invoked. */ -G_GNUC_COLD void +void G_COLD do__exit(int status) { - xmalloc_stop_freeing(); + exit_cleanup(); _exit(status); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/exit.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/exit.h
Changed
@@ -45,8 +45,9 @@ * Public interface. */ -void do_exit(int status) G_GNUC_NORETURN; -void do__exit(int status) G_GNUC_NORETURN; +void exit_cleanup(void); +void do_exit(int status) G_NORETURN; +void do__exit(int status) G_NORETURN; #endif /* _exit_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/exit2str.c
Added
@@ -0,0 +1,78 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Converts process exit status into human-readable string. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#include "common.h" + +#include "exit2str.h" + +#include "buf.h" +#include "signal.h" + +#include "override.h" /* Must be the last header included */ + +#ifdef I_SYS_WAIT +#include <sys/wait.h> +#endif + +/** + * Converts process exit status into human-readable string. + * + * @return pointer to static string. + */ +const char * +exit2str(int status) +{ + buf_t *b = buf_private(G_STRFUNC, 48); + + if (WIFEXITED(status)) { + buf_printf(b, "exited, status=%d", WEXITSTATUS(status)); + } else if (WIFSIGNALED(status)) { + int signo = WTERMSIG(status); +#ifdef WCOREDUMP + bool core_dumped = WCOREDUMP(status); +#else + bool core_dumped = FALSE; +#endif /* WCOREDUMP */ + buf_printf(b, "killed by %s%s", + signal_name(signo), core_dumped ? ", core dumped" : ""); + } else if (WIFSTOPPED(status)) { + int signo = WSTOPSIG(status); + buf_printf(b, "stopped by %s", signal_name(signo)); + } else if (WIFCONTINUED(status)) { + buf_printf(b, "continued"); + } + + return buf_data(b); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/exit2str.h
Added
@@ -0,0 +1,45 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Converts process exit status into human-readable string. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#ifndef _exit2str_h_ +#define _exit2str_h_ + +/* + * Public interface. + */ + +const char *exit2str(int status); + +#endif /* _exit2str_h_ */ + +/* vi: set ts=4: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/fast_assert.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/fast_assert.c
Changed
@@ -1,5 +1,6 @@ /* - * Copyright (c) 2006, Christian Biere + * Copyright (c) 2012-2016 Raphael Manfredi + * Copyright (c) 2006 Christian Biere * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -29,62 +30,122 @@ * * @author Christian Biere * @date 2006 + * @author Raphael Manfredi + * @date 2012-2016 */ #include "common.h" -#include "crash.h" /* For print_str() and crash_time() */ #include "fast_assert.h" +#include "atomic.h" +#include "crash.h" /* For print_str() and crash_time_raw() */ #include "log.h" +#include "misc.h" /* For CONST_STRLEN() */ #include "stacktrace.h" #include "str.h" +#include "stringify.h" /* For UINT_DEC_BUFLEN */ +#include "thread.h" + #include "override.h" /* Must be the last header included */ +#define STACK_OFF 2 /* 2 extra calls: calling routine, then here */ + /** * @note For maximum safety this is kept signal-safe, so that we can * even use assertions in signal handlers. See also: * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html */ -static G_GNUC_COLD void +static void G_COLD assertion_message(const assertion_data * const data, int fatal) { - char line_buf22; - char time_buf18; + char line_bufULONG_DEC_BUFLEN; + char time_bufCRASH_TIME_BUFLEN; + char prefixUINT_DEC_BUFLEN + CONST_STRLEN(" (WARNING-): "); + unsigned stid, line; + bool assertion; DECLARE_STR(16); - crash_time(time_buf, sizeof time_buf); + /* + * Something is wrong, hence use the raw time computation and get the + * current thread ID using thread_safe_small_id(): we need to avoid + * thread_small_id() in case we're having problems in the thread layer. + * + * Because we're displaying the thread ID as an unsigned value, any + * problem into computing the proper ID will be immediately visible + * as a very large integer will be displayed! + * --RAM, 2016-01-02 + */ + + crash_time_raw(time_buf, sizeof time_buf); + stid = thread_safe_small_id(); + + /* + * When an assertion failed in some thread, things are likely to break in + * all the other threads and we want to avoid a cascade of failures being + * reported. We suspend after computing the crash time, in case we were + * not suspended due to a fatal error. + */ + + thread_check_suspended(); print_str(time_buf); - print_str(fatal ? " (FATAL): " : " (WARNING): "); - if (data->expr) { - print_str("Assertion failure in "); + if (0 == stid) { + print_str(fatal ? " (FATAL): " : " (WARNING): "); + } else { + str_bprintf(prefix, sizeof prefix, " (%s-%u): ", + fatal ? "FATAL" : "WARNING", stid); + print_str(prefix); + } + + /* + * If the FAST_ASSERT_NOT_REACHED bit is set in the line number, + * then it does not indicate an assertion failure but rather that + * we reached a point in the code that should never have been reached. + * --RAM, 2013-10-28 + */ + + line = data->line & ~FAST_ASSERT_NOT_REACHED; + assertion = line == data->line; + + if (assertion) { + print_str("Assertion failure at "); } else { print_str("Code should not have been reached in "); + print_str(data->expr); /* Routine name */ + print_str("() at "); } print_str(data->file); print_str(":"); - print_str(print_number(line_buf, sizeof line_buf, data->line)); - if (data->expr) { + print_str(PRINT_NUMBER(line_buf, line)); + if (assertion) { print_str(": \""); print_str(data->expr); print_str("\""); } print_str("\n"); - flush_err_str(); + flush_err_str_atomic(); if (log_stdout_is_distinct()) - flush_str(STDOUT_FILENO); + flush_str_atomic(STDOUT_FILENO); } /** + * Argument passed to assertion_abort_process(). + */ +struct assertion_abort_process_arg { + void *stackSTACKTRACE_DEPTH_MAX; + size_t count; + int stid; +}; + +/** * Abort execution, possibly dumping a stack frame. */ -static G_GNUC_COLD G_GNUC_NORETURN void -assertion_abort(void) +static void * G_COLD G_NORETURN +assertion_abort_process(void *arg) { static volatile sig_atomic_t seen_fatal; - - -#define STACK_OFF 2 /* 2 extra calls: assertion_failure(), then here */ + sig_atomic_t depth; + struct assertion_abort_process_arg *v = arg; /* * We're going to stop the execution. @@ -95,11 +156,24 @@ * the failure. */ - if (!seen_fatal) { - seen_fatal = TRUE; - stacktrace_where_cautious_print_offset(STDERR_FILENO, STACK_OFF); + if (0 == (depth = ATOMIC_INC(&seen_fatal))) { + /* + * If the thread holds any locks, dump them. + */ + + thread_lock_dump_if_any(STDERR_FILENO, v->stid); if (log_stdout_is_distinct()) - stacktrace_where_cautious_print_offset(STDOUT_FILENO, STACK_OFF); + thread_lock_dump_if_any(STDOUT_FILENO, v->stid); + + /* + * Dump stacktrace. + */ + + stacktrace_cautious_print(STDERR_FILENO, v->stid, v->stack, v->count); + if (log_stdout_is_distinct()) { + stacktrace_cautious_print(STDOUT_FILENO, + v->stid, v->stack, v->count); + } /* * Before calling abort(), which will generate a SIGABRT and invoke @@ -108,7 +182,21 @@ * longer be possible to get the frame of the assertion failure. */ - crash_save_current_stackframe(STACK_OFF); + crash_save_stackframe(v->stid, v->stack, v->count); + } + + /* + * Allow at most two assertion failures in a row, but the third one + * requires that we exit immediately because something is deeply wrong + * on the exception path. + */ + + if (depth > 1) { + s_rawcrit("%s(): too many assertion failures (%u) in a row, exiting", + G_STRFUNC, (uint) depth + 1); + if (depth > 2) + _exit(EXIT_FAILURE); /* In case atexit() callbacks fail */ + exit(EXIT_FAILURE); } /* @@ -128,16 +216,37 @@ crash_abort(); -#undef STACK_OFF + g_assert_not_reached(); +} + +/** + * Abort execution, possibly dumping a stack frame. + */ +static void G_COLD G_NORETURN +assertion_abort(void) +{ + struct assertion_abort_process_arg v; + + /* + * Since crash_divert_main() can potentially redirect processing + * to another thread, we need to capture the current stack and + * the current thread ID to pass it along to the diversion routine. + */ + + ZERO(&v); + v.stid = thread_safe_small_id(); + v.count = stacktrace_safe_unwind(v.stack, N_ITEMS(v.stack), STACK_OFF); + + crash_divert_main(G_STRFUNC, assertion_abort_process, &v); + g_assert_not_reached(); } /* * Trace the code path leading to this assertion. */ -static NO_INLINE void G_GNUC_COLD +static NO_INLINE void G_COLD assertion_stacktrace(void) { -#define STACK_OFF 2 /* 2 extra calls: assertion_warning(), then here */ stacktrace_where_safe_print_offset(STDERR_FILENO, STACK_OFF); if (log_stdout_is_distinct()) @@ -154,21 +263,21 @@ * --RAM, 2009-10-31 */ -NO_INLINE void G_GNUC_COLD +NO_INLINE void G_COLD assertion_warning(const assertion_data * const data) { assertion_message(data, FALSE); assertion_stacktrace(); } -NO_INLINE void G_GNUC_COLD +NO_INLINE void G_COLD assertion_warning_log(const assertion_data * const data, const char * const fmt, ...) { static str_t *str; va_list args; - assertion_message(data, TRUE); + assertion_message(data, FALSE); if G_UNLIKELY(NULL == str) str = str_new_not_leaking(512); @@ -182,24 +291,31 @@ va_end(args); { - char time_buf18; + char time_bufCRASH_TIME_BUFLEN; + char prefixUINT_DEC_BUFLEN + CONST_STRLEN(" (WARNING-): "); + unsigned stid = thread_safe_small_id(); DECLARE_STR(4); - crash_time(time_buf, sizeof time_buf); + crash_time_raw(time_buf, sizeof time_buf); print_str(time_buf); - print_str(" (WARNING): "); + if (0 == stid) { + print_str(" (WARNING): "); + } else { + str_bprintf(prefix, sizeof prefix, " (WARNING-%u): ", stid); + print_str(prefix); + } print_str(str_2c(str)); print_str("\n"); - flush_err_str(); + flush_err_str_atomic(); if (log_stdout_is_distinct()) - flush_str(STDOUT_FILENO); + flush_str_atomic(STDOUT_FILENO); } assertion_stacktrace(); } -NO_INLINE void G_GNUC_COLD +NO_INLINE void G_COLD assertion_failure(const assertion_data * const data) { assertion_message(data, TRUE); @@ -213,7 +329,7 @@ assertion_abort(); } -NO_INLINE void G_GNUC_COLD +NO_INLINE void G_COLD assertion_failure_log(const assertion_data * const data, const char * const fmt, ...) { @@ -242,18 +358,25 @@ */ if (msg != NULL) { - char time_buf18; + char time_bufCRASH_TIME_BUFLEN; + char prefixUINT_DEC_BUFLEN + CONST_STRLEN(" (FATAL-): "); + unsigned stid = thread_safe_small_id(); DECLARE_STR(4); - crash_time(time_buf, sizeof time_buf); + crash_time_raw(time_buf, sizeof time_buf); print_str(time_buf); - print_str(" (FATAL): "); + if (0 == stid) { + print_str(" (FATAL): "); + } else { + str_bprintf(prefix, sizeof prefix, " (FATAL-%u): ", stid); + print_str(prefix); + } print_str(msg); print_str("\n"); - flush_err_str(); + flush_err_str_atomic(); if (log_stdout_is_distinct()) - flush_str(STDOUT_FILENO); + flush_str_atomic(STDOUT_FILENO); } assertion_abort();
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/fast_assert.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/fast_assert.h
Changed
@@ -48,9 +48,22 @@ #ifndef _fast_assert_h_ #define _fast_assert_h_ +/* + * Highest integer bit flags an assertion data for "code not reached". + * In which case the expr is not a failing expression but the routine name + * where the unreachable code was reached by the execution flow. + * + * This can help debug situations where the assertion fails in code that has + * been changed (e.g. from an old release) and the source location is not + * enough to spot where the failure happens, with no symbolic stack trace + * reported. + * --RAM, 2013-10-28 + */ +#define FAST_ASSERT_NOT_REACHED (1U << (INTSIZE * CHAR_BIT - 1)) + typedef struct assertion_data { const char *file, *expr; - unsigned line; + unsigned line; /* Highest bit flags "code not reached" */ } assertion_data; /* @@ -61,16 +74,16 @@ * --RAM, 2009-10-31 */ -void G_GNUC_NORETURN NON_NULL_PARAM((1)) /* REGPARM(1) */ +void G_NORETURN NON_NULL_PARAM((1)) /* REGPARM(1) */ assertion_failure(const assertion_data * const data); -void G_GNUC_NORETURN NON_NULL_PARAM((1)) G_GNUC_PRINTF(2,3) +void G_NORETURN NON_NULL_PARAM((1)) G_PRINTF(2,3) assertion_failure_log(const assertion_data * const data, const char *fmt, ...); void NON_NULL_PARAM((1)) /* REGPARM(1) */ assertion_warning(const assertion_data * const data); -void NON_NULL_PARAM((1)) G_GNUC_PRINTF(2,3) +void NON_NULL_PARAM((1)) G_PRINTF(2,3) assertion_warning_log(const assertion_data * const data, const char *fmt, ...); #define RUNTIME_ASSERT(expr) fast_assert(expr, #expr) @@ -99,7 +112,7 @@ #define fast_assert_not_reached() \ G_STMT_START { \ static const struct assertion_data assertion_data_ = { \ - _WHERE_, NULL, __LINE__ \ + _WHERE_, G_STRFUNC, FAST_ASSERT_NOT_REACHED | __LINE__ \ }; \ assertion_failure(&assertion_data_); \ } G_STMT_END
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/fd.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/fd.c
Changed
@@ -1,6 +1,6 @@ /* - * Copyright (c) 2009, Raphael Manfredi - * Copyright (c) 2006-2008, Christian Biere + * Copyright (c) 2009-2013 Raphael Manfredi + * Copyright (c) 2006-2008 Christian Biere * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -29,7 +29,7 @@ * File descriptor functions. * * @author Raphael Manfredi - * @date 2009 + * @date 2009-2013 * @author Christian Biere * @date 2006-2008 */ @@ -37,13 +37,22 @@ #include "common.h" #include "fd.h" + #include "compat_misc.h" #include "compat_un.h" #include "glib-missing.h" /* For g_info() */ +#include "hset.h" +#include "log.h" /* For s_carp() */ +#include "once.h" + #include "override.h" /* Must be the last header included */ +static hset_t *fd_sockets; +static hset_t *fd_preserved; +static once_flag_t fd_preserved_allocated; + void -set_close_on_exec(int fd) +fd_set_close_on_exec(int fd) { #ifdef FD_CLOEXEC int flags; @@ -51,14 +60,15 @@ flags = fcntl(fd, F_GETFD); if (0 == (flags & FD_CLOEXEC)) { flags |= FD_CLOEXEC; - fcntl(fd, F_SETFD, flags); + if (-1 == fcntl(fd, F_SETFD, flags)) + s_carp("%s(): failed for #%d: %m", G_STRFUNC, fd); } #else (void) fd; #endif /* FD_CLOEXEC */ } -static inline gboolean +static inline bool try_close_from(const int first_fd) { #if defined(F_CLOSEM) @@ -75,37 +85,99 @@ #endif /* HAS_CLOSEFROM */ } -static inline gboolean +static inline bool fd_is_opened(const int fd) { return is_open_fd(fd) || is_a_socket(fd) || is_a_fifo(fd); } /** - * Closes all file descriptors greater or equal to ``first_fd''. + * Determine the file descriptor that will likely be used at next open(). + * + * This is used at initialization time to determine the first available + * file descriptor so that we do not try to close special files opened by + * libraries. + * + * @return the first available file descriptor. + */ +int +fd_first_available(void) +{ + int fd; + + fd = open("/dev/null", O_RDWR, 0); + if (-1 == fd) + s_error("%s(): failed to open /dev/null: %m", G_STRFUNC); + close(fd); + + return fd; +} + +/** + * Set iterator to close all known socket descriptors. + */ +static void +fd_socket_close(const void *data, void *udata) +{ + (void) udata; + + if (is_running_on_mingw()) { + socket_fd_t fd = pointer_to_int(data); + (void) s_close(fd); + } +} + +/** + * Allocate the fd_preserved set if not done already. + */ +static void +fd_preserved_allocate(void) +{ + fd_preserved = hset_create(HASH_KEY_SELF, 0); + hset_thread_safe(fd_preserved); +} + +/** + * Mark a file descriptor as being preserved from closing by + * fd_close_unpreserved_from(). */ void -close_file_descriptors(const int first_fd) +fd_preserve(int fd) +{ + g_assert(!is_a_socket(fd)); + + ONCE_FLAG_RUN(fd_preserved_allocated, fd_preserved_allocate); + hset_insert(fd_preserved, int_to_pointer(fd)); +} + +/** + * Closes all file descriptors greater or equal to ``first_fd'', skipping + * preserved ones if ``preserve'' is TRUE. + */ +static void +fd_close_from_internal(const int first_fd, bool preserve) { int fd; g_return_if_fail(first_fd >= 0); - if (try_close_from(first_fd)) + if (!preserve && try_close_from(first_fd)) return; fd = getdtablesize() - 1; while (fd >= first_fd) { + if (preserve && hset_contains(fd_preserved, int_to_pointer(fd))) + goto next; #ifdef HAVE_GTKOSXAPPLICATION /* OS X doesn't allow fds being closed not opened by us. During * GUI initialisation a new kqueue fd is created for UI events. This - * is visible to us as a fifo which we are not allowed to close. + * is visible to us as a fifo which we are not allowed to close. * Set close on exec on all fifo's so we won't leak any of our other * fifo's * -- JA 2011-11-28 */ if (is_a_fifo(fd)) - set_close_on_exec(fd); + fd_set_close_on_exec(fd); else #endif /* OS X frowns upon random fds being closed --RAM 2011-11-13 */ @@ -117,8 +189,56 @@ #endif /* F_MAXFD */ } } + next: fd--; } + + /* + * When called with a first_fd of 3, and we are on Windows, also make + * sure we close all the known sockets we have. This lets the process + * safely auto-restart, avoiding multiple listening sockets on the same + * port. + * --RAM, 2015-04-05 + */ + + if ( + is_running_on_mingw() && !preserve && + 3 == first_fd && NULL != fd_sockets + ) { + hset_t *fds = fd_sockets; + + /* + * We're about to exec() another process, and we may be crashing, + * hence do not bother using hset_foreach_remove() to ensure minimal + * processing. We also reset the fd_sockets pointer to NULL to + * make sure s_close() will do nothing when fd_notify_socket_closed() + * is called. + */ + + fd_sockets = NULL; /* We don't expect race conditions here */ + hset_foreach(fds, fd_socket_close, NULL); + + /* Don't bother freeing / clearing set, we're about to exec() */ + } +} + +/** + * Closes all file descriptors greater or equal to ``first_fd''. + */ +void +fd_close_from(const int first_fd) +{ + fd_close_from_internal(first_fd, FALSE); +} + +/** + * Closes all file descriptors greater or equal to ``first_fd'', skipping + * all the ones that were marked as preserved via fd_preserve(). + */ +void +fd_close_unpreserved_from(const int first_fd) +{ + fd_close_from_internal(first_fd, fd_preserved != NULL); } /** @@ -126,7 +246,7 @@ * * @return 0 on success, -1 on failure. */ -G_GNUC_COLD int +int G_COLD reserve_standard_file_descriptors(void) { int fd; @@ -147,7 +267,7 @@ /* The following shouldn't happen on POSIX */ if (fd != ret) { int fd2 = ret; - + ret = dup2(fd2, fd); close(fd2); if (-1 == ret || !is_open_fd(fd)) @@ -157,8 +277,8 @@ return 0; } -G_GNUC_COLD gboolean -need_get_non_stdio_fd(void) +bool G_COLD +fd_need_non_stdio(void) { static int needed = -1; @@ -200,9 +320,9 @@ * descriptor is returned. */ int -get_non_stdio_fd(int fd) +fd_get_non_stdio(int fd) { - if (need_get_non_stdio_fd() && fd > 2 && fd < 256) { + if (fd_need_non_stdio() && fd > 2 && fd < 256) { int nfd, saved_errno; saved_errno = errno; @@ -214,28 +334,77 @@ } errno = saved_errno; } + + /* + * On Windows, files and sockets do not share the same ID space. + * Therefore, on that platform we use this routine as a hook to + * record active socket descriptors in a table. + * --RAM, 2015-04-05 + */ + + if (is_running_on_mingw()) { + /* We don't expect thread race conditions here */ + if G_UNLIKELY(NULL == fd_sockets) + fd_sockets = hset_create(HASH_KEY_SELF, 0); + + if (is_a_socket(fd)) + hset_insert(fd_sockets, int_to_pointer(fd)); + } + return fd; } void fd_set_nonblocking(int fd) -#ifdef MINGW32 { - unsigned long nonblock = 1; + bool failed = FALSE; + +#ifdef MINGW32 + { + unsigned long nonblock = 1; - if (ioctlsocket(fd, FIONBIO, &nonblock)) - errno = WSAGetLastError(); + if (ioctlsocket(fd, FIONBIO, &nonblock)) { + errno = WSAGetLastError(); + failed = TRUE; + } + } +#else /* !MINGW32 */ + { + int ret, flags; + + ret = fcntl(fd, F_GETFL, 0); + flags = ret | VAL_O_NONBLOCK; + if (flags != ret) { + if (-1 == fcntl(fd, F_SETFL, flags)) + failed = TRUE; + } + } +#endif /* MINGW32 */ + + if (failed) + s_carp("%s(): failed for #%d: %m", G_STRFUNC, fd); } -#else -{ - int ret, flags; - ret = fcntl(fd, F_GETFL, 0); - flags = ret | VAL_O_NONBLOCK; - if (flags != ret) - fcntl(fd, F_SETFL, flags); +/** + * Notifies that a socket descriptor has been closed. + * + * This is only required on Windows, since we need to keep track of opened + * socket descriptors, in order to close them before exec(). Failure to + * do so would leave listen sockets around, and because we use SO_REUSEADDR + * to bind our listening sockets, we would have two processes listening on + * the same socket -- a recipe for blackouts on Windows! + */ +void +fd_notify_socket_closed(socket_fd_t fd) +{ + if (!is_running_on_mingw()) { + s_carp_once("%s(): not needed on UNIX", G_STRFUNC); + return; + } else { + if G_LIKELY(fd_sockets != NULL) + hset_remove(fd_sockets, int_to_pointer(fd)); + } } -#endif /* MINGW32 */ /** * Closes the file and sets the descriptor to -1. Does nothing if @@ -258,6 +427,8 @@ if (fd < 0) { ret = 0; } else { + if (fd_preserved != NULL) + hset_remove(fd_preserved, int_to_pointer(fd)); ret = close(fd); *fd_ptr = -1; } @@ -281,6 +452,58 @@ return fd_close(fd_ptr); } +#if !defined(HAS_FSYNC) && !defined(HAS_FDATASYNC) +static void +fd_warn_no_fsync(void) +{ + static bool warned; + + if (!warned) { + warned = TRUE; + g_warning("no fsync(), assuming no delayed disk block allocation"); + } +} +#endif /* !HAS_FSYNC && !HAS_FDATASYNC */ + +/** + * Synchronize a file's in-core state with the storage device. + */ +int +fd_fsync(int fd) +{ + g_assert(fd >= -1); + +#if defined(HAS_FSYNC) + return fsync(fd); +#elif defined(HAS_FDATASYNC) + return fdatasync(fd); +#else + (void) fd; + fd_warn_no_fsync(); + return 0; /* Silently ignore request if no fsync() nor fdatasync() */ +#endif +} + +/** + * Synchronize a file's in-core state with the storage device, but not the + * metadata if they do not help in recovering the data blocks. + */ +int +fd_fdatasync(int fd) +{ + g_assert(fd >= -1); + +#if defined(HAS_FDATASYNC) + return fdatasync(fd); +#elif defined(HAS_FSYNC) + return fsync(fd); +#else + (void) fd; + fd_warn_no_fsync(); + return 0; /* Silently ignore request if no fdatasync() nor fsync() */ +#endif +} + /** * Uses fstat() or getsockopt() to determine whether the given file descriptor * is a socket. @@ -288,7 +511,7 @@ * @param fd An arbitrary file descriptor. * @return TRUE if fd is a socket, FALSE otherwise. */ -gboolean +bool is_a_socket(int fd) #ifdef S_ISSOCK { @@ -316,7 +539,7 @@ * @param fd An arbitrary file descriptor. * @return TRUE if fd is a FIFO, FALSE otherwise. */ -gboolean +bool is_a_fifo(int fd) { filestat_t sb; @@ -330,9 +553,93 @@ * @param fd An arbitrary file descriptor. * @return TRUE if fd is opened, FALSE otherwise. */ -gboolean +bool is_open_fd(int fd) { return -1 != fcntl(fd, F_GETFL); } + +/** + * Checks whether the given file descriptor is opened for write operations. + * + * @param fd A valid file descriptor. + * @return TRUE if the file descriptor is opened with O_WRONLY or O_RDWR. + */ +bool +fd_is_writable(const int fd) +{ + int flags; + + g_return_val_if_fail(fd >= 0, FALSE); + + flags = fcntl(fd, F_GETFL); + g_return_val_if_fail(-1 != flags, FALSE); + + flags &= O_ACCMODE; + return O_WRONLY == flags || O_RDWR == flags; +} + +/** + * Checks whether the given file descriptor is opened for read operations. + * + * @param fd A valid file descriptor. + * @return TRUE if the file descriptor is opened with O_RDONLY or O_RDWR. + */ +bool +fd_is_readable(const int fd) +{ + int flags; + + g_return_val_if_fail(fd >= 0, FALSE); + + flags = fcntl(fd, F_GETFL); + g_return_val_if_fail(-1 != flags, FALSE); + + flags &= O_ACCMODE; + return O_RDONLY == flags || O_RDWR == flags; +} + +/** + * Checks whether the given file descriptor is opened for read and write + * operations. + * + * @param fd A valid file descriptor. + * @return TRUE if the file descriptor is opened with O_RDWR. + */ +bool +fd_is_readable_and_writable(const int fd) +{ + int flags; + + g_return_val_if_fail(fd >= 0, FALSE); + + flags = fcntl(fd, F_GETFL); + g_return_val_if_fail(-1 != flags, FALSE); + + flags &= O_ACCMODE; + return O_RDWR == flags; +} + +/** + * Checks whether the given file descriptor is compatible with given + * access mode. For example, if fd has access mode O_RDONLY but + * accmode is O_WRONLY or O_RDWR FALSE is returned, because the + * file descriptor is not writable. + * + * @param fd A valid file descriptor. + * @return TRUE if the file descriptor is compatible with the access mode. + */ +bool +fd_accmode_is_valid(const int fd, const int accmode) +{ + g_return_val_if_fail(fd >= 0, FALSE); + + switch (accmode) { + case O_RDONLY: return fd_is_readable(fd); + case O_WRONLY: return fd_is_writable(fd); + case O_RDWR: return fd_is_readable_and_writable(fd); + } + return FALSE; +} + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/fd.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/fd.h
Changed
@@ -37,17 +37,27 @@ #ifndef _fd_h_ #define _fd_h_ -void close_file_descriptors(const int first_fd); +void fd_close_from(const int first_fd); +void fd_close_unpreserved_from(const int first_fd); +int fd_first_available(void); int reserve_standard_file_descriptors(void); -void set_close_on_exec(int fd); +void fd_set_close_on_exec(int fd); void fd_set_nonblocking(int fd); +int fd_fsync(int fd); +int fd_fdatasync(int fd); int fd_forget_and_close(int *fd_ptr); int fd_close(int *fd_ptr); -int get_non_stdio_fd(int fd); -gboolean need_get_non_stdio_fd(); -gboolean is_a_socket(int fd); -gboolean is_a_fifo(int fd); -gboolean is_open_fd(int fd); +void fd_preserve(int fd); +void fd_notify_socket_closed(socket_fd_t fd); +int fd_get_non_stdio(int fd); +bool fd_need_non_stdio(); +bool is_a_socket(int fd); +bool is_a_fifo(int fd); +bool is_open_fd(int fd); +bool fd_accmode_is_valid(const int fd, const int accmode); +bool fd_is_readable_and_writable(const int fd); +bool fd_is_readable(const int fd); +bool fd_is_writable(const int fd); static inline int is_valid_fd(int fd)
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/fifo.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/fifo.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Raphael Manfredi + * Copyright (c) 2004, 2013 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -27,26 +27,93 @@ * * A FIFO. * + * As of 2013-11-09, a FIFO is simply a facade of slist_t. + * * @author Raphael Manfredi - * @date 2004 + * @date 2004, 2013 */ #ifndef _fifo_h_ #define _fifo_h_ -#include "common.h" +#include "slist.h" + +typedef slist_t fifo_t; + +/** + * Create new FIFO. + */ +static inline fifo_t * +fifo_make(void) +{ + return slist_new(); +} -struct fifo; -typedef struct fifo fifo_t; +/** + * Destroy FIFO. + */ +static inline void +fifo_free(fifo_t *f) +{ + slist_free(&f); +} -typedef void (*fifo_free_t)(gpointer item, gpointer udata); +/** + * Destroy FIFO, invoking freeing callback on all items still held. + * + * @param f the FIFO to free + * @param cb the freeing callback to invoke on all items + * @param udata the extra user data passed as-is to the freeing callback + */ +static inline void +fifo_free_all(fifo_t *f, free_data_fn_t cb, void *udata) +{ + slist_foreach(f, cb, udata); + slist_free(&f); +} -fifo_t *fifo_make(void); -void fifo_free(fifo_t *f); -void fifo_free_all(fifo_t *f, fifo_free_t cb, gpointer udata); -int fifo_count(fifo_t *f); -void fifo_put(fifo_t *f, gconstpointer data); -gpointer fifo_remove(fifo_t *f); +/** + * Destroy FIFO, invoking freeing callback on all items, then nullify pointer. + */ +static inline void +fifo_free_all_null(fifo_t **f_ptr, free_data_fn_t cb, void *udata) +{ + fifo_t *f = *f_ptr; + + if (f != NULL) { + slist_foreach(f, cb, udata); + slist_free(f_ptr); + } +} + +/** + * @return the amount of items queued in FIFO. + */ +static inline uint +fifo_count(const fifo_t *f) +{ + return slist_length(f); +} + +/** + * Add entry to FIFO. + */ +static inline void +fifo_put(fifo_t *f, const void *data) +{ + slist_append(f, deconstify_pointer(data)); +} + +/** + * Remove entry from FIFO. + * + * @return the oldest item still held in FIFO, NULL if no item remains. + */ +static inline void * +fifo_remove(fifo_t *f) +{ + return slist_shift(f); +} #endif /* _fifo_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/file.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/file.c
Changed
@@ -38,10 +38,12 @@ #include "debug.h" #include "fd.h" #include "file.h" -#include "glib-missing.h" #include "halloc.h" +#include "log.h" /* For s_carp() */ #include "misc.h" /* For is_strsuffix() */ #include "path.h" +#include "str.h" +#include "stringify.h" /* For plural() */ #include "timestamp.h" #include "tm.h" @@ -63,7 +65,7 @@ /** * Check for file existence. */ -gboolean +bool file_exists(const char *pathname) { filestat_t st; @@ -92,7 +94,7 @@ char * file_locate_from_path(const char *argv0) { - static gboolean already_done; + static bool already_done; char *path; char *tok; char filepathMAX_PATH_LEN + 1; @@ -105,24 +107,50 @@ if (filepath_basename(argv0) != argv0) { if (!already_done) { - g_warning("can't locate \"%s\" in PATH: name contains '%c' already", + s_warning("can't locate \"%s\" in PATH: name contains '%c' already", argv0, strchr(argv0, G_DIR_SEPARATOR) != NULL ? G_DIR_SEPARATOR : '/'); } + result = h_strdup(argv0); goto done; } path = getenv("PATH"); if (NULL == path) { if (!already_done) { - g_warning("can't locate \"%s\" in PATH: " + s_warning("can't locate \"%s\" in PATH: " "no such environment variable", argv0); } goto done; } + /* + * On Windows, we need to implicitly add "." to the path if not already + * present -- this is done by appending a separator and a dot, not by + * checking whether "." is already part of the path. + * + * The reason is that "." is implied, and also because one may omit the + * ".exe" extension when launching a program. This means checks done + * in crash_init() for instance to see whether the file listed in + * argv0 exists and which do not account for a missing ".exe" will + * attempt to locate the program in the PATH to get a full name and will + * fail if we do not add ".". + * + * On UNIX this cannot happen because there is no hidden extension and + * the "." is never made part of the PATH implictly. + * + * --RAM, 2015-12-06 + */ + + if (is_running_on_mingw()) + path = h_strdup_printf("%s%c.", path, *G_SEARCHPATH_SEPARATOR_S); + else + path = h_strdup(path); + path = h_strdup(path); + /* FIXME: strtok() is not thread-safe --RAM, 2015-12-06 */ + tok = strtok(path, G_SEARCHPATH_SEPARATOR_S); while (NULL != tok) { const char *dir = tok; @@ -131,7 +159,7 @@ if ('\0' == *dir) dir = "."; concat_strings(filepath, sizeof filepath, - dir, G_DIR_SEPARATOR_S, argv0, ext, NULL); + dir, G_DIR_SEPARATOR_S, argv0, ext, NULL_PTR); if (-1 != stat(filepath, &buf)) { if (S_ISREG(buf.st_mode) && -1 != access(filepath, X_OK)) { @@ -150,13 +178,49 @@ } /** + * Get the full program path. + * + * @return a newly allocated string (through halloc()) that points to the + * path of the program being run, NULL if we can't compute a suitable path. + */ +char * +file_program_path(const char *argv0) +{ + filestat_t buf; + char *file = deconstify_char(argv0); + char filepathMAX_PATH_LEN + 1; + + if (is_running_on_mingw() && !is_strsuffix(argv0, (size_t) -1, ".exe")) { + concat_strings(filepath, sizeof filepath, argv0, ".exe", NULL_PTR); + } else { + clamp_strcpy(filepath, sizeof filepath, argv0); + } + + if (-1 == stat(filepath, &buf)) { + int saved_errno = errno; + file = file_locate_from_path(argv0); + if (NULL == file) { + errno = saved_errno; + s_warning("%s(): could not stat() \"%s\": %m", G_STRFUNC, filepath); + return NULL; + } + } + + if (file != NULL && file != argv0) + return file; /* Allocated by file_locate_from_path() */ + + return h_strdup(filepath); +} + +/** * Open configuration file, renaming it as ".orig" when `renaming' is TRUE. * If configuration file cannot be found, try opening the ".orig" variant * if already present and `renaming' is TRUE. * If not found, try with successive alternatives, if supplied. * * @attention - * NB: the supplied `fv' argument is a vector of `fvcnt' elements. + * NB: the supplied `fv' argument is a vector of `fvcnt' elements. Items + * with a NULL `dir' field are ignored, but fv0.dir cannot be NULL. * * @param what is what is being opened, for logging purposes. * @param fv is a vector of files to try to open, in sequence @@ -170,7 +234,7 @@ */ static FILE * open_read( - const char *what, const file_path_t *fv, int fvcnt, gboolean renaming, + const char *what, const file_path_t *fv, int fvcnt, bool renaming, int *chosen) { FILE *in; @@ -181,6 +245,7 @@ g_assert(fv != NULL); g_assert(fvcnt >= 1); + g_assert(fv->dir != NULL); path = make_pathname(fv->dir, fv->name); if (!is_absolute_path(path)) { @@ -190,33 +255,45 @@ path_orig = h_strdup_printf("%s.%s", path, orig_ext); in = fopen(path, "r"); - if (in) { - if (is_running_on_mingw()) { - /* Windows can't rename an open file */ - fclose(in); - in = NULL; - } - if (renaming && -1 == rename(path, path_orig)) { - g_warning("%s could not rename \"%s\" as \"%s\": %m", - what, path, path_orig); - } - if (NULL == in) { - in = fopen(path_orig, "r"); - } - goto out; - } else { - if (ENOENT == errno) { - if (common_dbg > 0) { - g_debug("%s cannot load non-existent \"%s\"", what, path); + + if (in != NULL) { + if (renaming) { + if (is_running_on_mingw()) { + /* Windows can't rename an opened file */ + fclose(in); + in = NULL; + } + if (-1 == rename(path, path_orig)) { + s_warning("%s could not rename \"%s\" as \"%s\": %m", + what, path, path_orig); + if (is_running_on_mingw()) + in = fopen(path, "r"); + } else { + if (is_running_on_mingw()) + in = fopen(path_orig, "r"); + } + if (is_running_on_mingw() && NULL == in) { + s_warning("%s cannot reopen \"%s\": %m", what, path); + goto open_failed; } - } else { - instead = instead_str; /* Regular file was present */ - g_warning("%s failed to retrieve from \"%s\": %m", what, path); } - if (fvcnt > 1 && common_dbg > 0) - g_debug("%s trying to load from alternate locations...", what); + goto out; } + /* FALL THROUGH */ + +open_failed: + if (ENOENT == errno) { + if (common_dbg > 0) { + s_debug("%s cannot load non-existent \"%s\"", what, path); + } + } else { + instead = instead_str; /* Regular file was present */ + s_warning("%s failed to retrieve from \"%s\": %m", what, path); + } + if (fvcnt > 1 && common_dbg > 0) + s_debug("%s trying to load from alternate locations...", what); + /* * Maybe we crashed after having retrieved the file in a previous run * but before being able to write it again correctly? Try to open the @@ -248,12 +325,14 @@ for (xfv = fv + 1, xfvcnt = fvcnt - 1; xfvcnt; xfv++, xfvcnt--) { HFREE_NULL(path); + if (NULL == xfv->dir) /* In alternatives, dir may be NULL */ + continue; path = make_pathname(xfv->dir, xfv->name); idx++; if (NULL != path && NULL != (in = fopen(path, "r"))) break; if (path != NULL && common_dbg > 0) { - g_debug("%s cannot load non-existent \"%s\" either", + s_debug("%s cannot load non-existent \"%s\" either", what, path); } } @@ -261,12 +340,12 @@ if (common_dbg > 0) { if (in) { - g_debug("%s retrieving from \"%s\"%s", what, path, instead); + s_debug("%s retrieving from \"%s\"%s", what, path, instead); } else if (instead == instead_str) { - g_debug("%s unable to retrieve: tried %d alternate location%s", - what, fvcnt, fvcnt == 1 ? "" : "s"); + s_debug("%s unable to retrieve: tried %d alternate location%s", + what, fvcnt, plural(fvcnt)); } else { - g_debug("%s unable to retrieve: no alternate locations known", + s_debug("%s unable to retrieve: no alternate locations known", what); } } @@ -286,6 +365,12 @@ * cannot be found, try opening the ".orig" variant if already present. * If not found, try with successive alternatives, if supplied. * + * @note + * Renaming only happens if the opened file is the first in the vector. + * Other entries are expected to be fallbacks and are either non-writable + * or should be left as-is. Likewise, opening the ".orig" is only attempted + * for the first entry. + * * @attention * NB: the supplied `fv' argument is a vector of `fvcnt' elements. * @@ -298,6 +383,17 @@ } /** + * Same as file_config_open_read(), but also returns the index + * of the path chosen within the array, if a file was opened at all. + */ +FILE * +file_config_open_read_chosen( + const char *what, const file_path_t *fv, int fvcnt, int *chosen) +{ + return open_read(what, fv, fvcnt, TRUE, chosen); +} + +/** * Open configuration file, without renaming it. If configuration file * cannot be found, try opening the ".orig" variant if already present. * If not found, try with successive alternatives, if supplied. @@ -338,14 +434,15 @@ FILE *out = NULL; char *path; - path = h_strconcat(fv->dir, G_DIR_SEPARATOR_S, fv->name, ".", - new_ext, (void *) 0); + path = h_strconcat(fv->dir, G_DIR_SEPARATOR_S, fv->name, + ".", new_ext, NULL_PTR); + g_return_val_if_fail(NULL != path, NULL); if (is_absolute_path(path)) { out = file_fopen(path, "w"); if (out == NULL) - g_warning("unable to persist %s", what); + s_warning("unable to persist %s", what); } HFREE_NULL(path); return out; @@ -365,15 +462,26 @@ * * @returns TRUE on success. */ -gboolean +bool file_config_close(FILE *out, const file_path_t *fv) { char *path = NULL; char *path_new = NULL; - gboolean success = FALSE; + bool success = FALSE; - if (0 != fclose(out)) { - g_warning("could not flush \"%s\": %m", fv->name); + /* + * Be extra careful when operating on filesystems with delayed disk block + * allocation, such as "ext4". If there is a crash and the data was not + * properly allocated to disk, we could lose both the old and new file data! + * + * To fight against that, make sure we sync the new data to disk before + * renaming the new file into the old, as the rename operation is likely + * to be stored on disk before allocation of the new data blocks is made. + * --RAM, 2013-08-12 + */ + + if (0 != file_sync_fclose(out)) { + s_warning("could not flush \"%s\": %m", fv->name); goto failed; } @@ -384,7 +492,7 @@ goto failed; if (-1 == rename(path_new, path)) { - g_warning("could not rename \"%s\" as \"%s\": %m", path_new, path); + s_warning("could not rename \"%s\" as \"%s\": %m", path_new, path); goto failed; } @@ -413,6 +521,9 @@ /** * Initializes `fp' with directory path `dir' and filename `name'. + * + * The directory must be an absolute path or the entry is initialized with NULL + * values and a loud warning is emitted. */ void file_path_set(file_path_t *fp, const char *dir, const char *name) @@ -420,26 +531,47 @@ g_assert(fp); g_assert(dir); g_assert(name); - g_assert(is_absolute_path(dir)); - fp->dir = dir; - fp->name = name; + /* + * For robustness, we no longer assert that the path must be absolute. + * + * The open_read() routine will skip file_path_t entries in the vector + * that are NULL, the only requirement being that the first entry of the + * vector be non-NULL, i.e. an absolute path. + * + * Since this is an abnormal situation, loudly warn so that we may find + * out who the culprit is. + */ + + if (!is_absolute_path(dir)) { + s_carp("%s(): ignoring non-absolute path \"%s\" for \"%s\"", + G_STRFUNC, dir, name); + + fp->dir = NULL; + fp->name = NULL; + } else { + fp->dir = dir; + fp->name = name; + } } /** * Open file, returning file descriptor or -1 on error with errno set. - * Errors are logged as a warning, unless `missing' is true, in which + * Errors are logged as a warning, unless `missing' is TRUE, in which * case no error is logged for ENOENT. + * No errors from open() due to invalid permission are logged when `silent' + * is TRUE. */ static int do_open(const char *path, int flags, int mode, - gboolean missing, gboolean absolute) + bool missing, bool absolute, bool silent) { const char *what; int fd; if (absolute && !is_absolute_path(path)) { - g_warning("do_open(): can't open absolute \"%s\": relative path", path); + s_warning("%s(): can't open absolute \"%s\": relative path", + G_STRFUNC, path); errno = EPERM; return -1; } @@ -452,9 +584,9 @@ if (fd < 0) { if (flags & O_CREAT) what = "create"; - else if (flags & O_RDONLY) + else if (O_RDONLY == (flags & O_ACCMODE)) what = "read"; - else if (flags & O_WRONLY) + else if (O_WRONLY == (flags & O_ACCMODE)) what = "write into"; else what = "open"; @@ -470,15 +602,15 @@ ) { fd = open(path, flags, mode); if (fd >= 0) { - g_warning("do_open(): had to close a banned fd to %s file", - what); + s_message("%s(): had to reclaim an unused to %s file", + G_STRFUNC, what); } } } if (fd >= 0) { - fd = get_non_stdio_fd(fd); - set_close_on_exec(fd); /* Just in case */ + fd = fd_get_non_stdio(fd); + fd_set_close_on_exec(fd); /* Just in case */ return fd; } @@ -490,13 +622,15 @@ */ if (errno == 0) { - g_warning("do_open(): " - "open() returned -1 with errno = 0, assuming ENOENT"); + s_warning("%s(): open() returned -1 with errno = 0, assuming ENOENT", + G_STRFUNC); errno = ENOENT; } if (!missing || errno != ENOENT) { - g_warning("do_open(): can't %s file \"%s\": %m", what, path); + if (!silent || errno != EACCES) { + s_warning("%s(): can't %s file \"%s\": %m", G_STRFUNC, what, path); + } } return -1; @@ -512,7 +646,16 @@ int file_open(const char *path, int flags, int mode) { - return do_open(path, flags, mode, FALSE, FALSE); + return do_open(path, flags, mode, FALSE, FALSE, FALSE); +} + +/** + * Same as file_open(), no open() errors logged, but can reclaim fd on shortage. + */ +int +file_open_silent(const char *path, int flags, int mode) +{ + return do_open(path, flags, mode, FALSE, FALSE, TRUE); } /** @@ -523,7 +666,16 @@ int file_absolute_open(const char *path, int flags, int mode) { - return do_open(path, flags, mode, FALSE, TRUE); + return do_open(path, flags, mode, FALSE, TRUE, FALSE); +} + +/* + * Same as file_absolute_open(), no open() error logged. + */ +int +file_absolute_open_silent(const char *path, int flags, int mode) +{ + return do_open(path, flags, mode, FALSE, TRUE, TRUE); } /** @@ -534,7 +686,16 @@ int file_open_missing(const char *path, int flags) { - return do_open(path, flags, 0, TRUE, TRUE); + return do_open(path, flags, 0, TRUE, TRUE, FALSE); +} + +/** + * Same as file_open_missing(), no error logging. + */ +int +file_open_missing_silent(const char *path, int flags) +{ + return do_open(path, flags, 0, TRUE, TRUE, TRUE); } /** @@ -544,7 +705,7 @@ int file_create(const char *path, int flags, int mode) { - return do_open(path, flags | O_CREAT, mode, FALSE, TRUE); + return do_open(path, flags | O_CREAT, mode, FALSE, TRUE, FALSE); } /** @@ -555,7 +716,7 @@ int file_create_missing(const char *path, int flags, int mode) { - return do_open(path, flags | O_CREAT, mode, TRUE, TRUE); + return do_open(path, flags | O_CREAT, mode, TRUE, TRUE, FALSE); } /** @@ -564,7 +725,7 @@ * is TRUE. */ static FILE * -do_fopen(const char *path, const char *mode, gboolean missing) +do_fopen(const char *path, const char *mode, bool missing) { char m; FILE *f; @@ -600,13 +761,13 @@ ) { f = fopen(path, mode); if (f != NULL) { - g_warning("had to close a banned fd to %s file", what); + s_warning("had to close a banned fd to %s file", what); return f; } } if (!missing || errno != ENOENT) - g_warning("can't %s file \"%s\": %m", what, path); + s_warning("can't %s file \"%s\": %m", what, path); return NULL; } @@ -633,6 +794,31 @@ } /** + * Close a stream, flushing data to disk. + * + * This is needed on "ext4" filesystems or any other filesystem which delays + * the allocation of data blocks, in case there is a crash between the close + * and the moment the data is written physically to the disk. + * + * @return the fclose() status. + */ +int +file_sync_fclose(FILE *f) +{ + int fd, ret; + + g_assert(f != NULL); + + ret = fflush(f); /* Send all buffered data to kernel first */ + fd = fileno(f); + + if (-1 == fd_fdatasync(fd)) + s_warning("cannot flush data blocks to disk for fd=%d: %m", fd); + + return fclose(f) | ret; /* Report error if fflush() failed */ +} + +/** * Remove trailing white space from line held within buffer. * * This is meant to be used to validate the line returned by fgets() and to @@ -645,7 +831,7 @@ * * @return TRUE if we were facing a line terminated by "\n", FALSE otherwise. */ -gboolean +bool file_line_chomp_tail(char *line, size_t size, size_t *lenptr) { size_t len; @@ -670,4 +856,46 @@ return TRUE; } +/** + * Convert open() flags to string, for debugging and logging purposes. + * + * @param flags open() flags value + * + * @return pointer to static string. + */ +const char * +file_oflags_to_string(int flags) +{ + str_t *s = str_private(G_STRFUNC, 32); + + /* We assume there will be at least one of O_RDWR, O_RDONLY or O_WRONLY */ + + str_printf(s, "%s%s%s%s%s", + file_accmode_to_string(flags), + (flags & O_APPEND) ? " | O_APPEND" : "", + (flags & O_CREAT) ? " | O_CREAT" : "", + (flags & O_TRUNC) ? " | O_TRUNC" : "", + (flags & O_EXCL) ? " | O_EXCL" : ""); + + return str_2c(s); +} + +/** + * Convert open() access mode to string, for debugging and logging purposes. + * + * @param accmode open() access mode value (O_RDWR, O_RDONLY, O_WRONLY) + * + * @return pointer to static string. + */ +const char * +file_accmode_to_string(const int accmode) +{ + switch (accmode & O_ACCMODE) { + case O_RDWR: return "O_RDWR"; + case O_WRONLY: return "O_WRONLY"; + case O_RDONLY: return "O_RDONLY"; + default: return "UNKNOWN_ACCMODE"; + } +} + /* vi: set ts=4: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/file.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/file.h
Changed
@@ -49,25 +49,34 @@ */ void file_register_fd_reclaimer(reclaim_fd_t callback); -gboolean file_exists(const char *pathname); +bool file_exists(const char *pathname); char *file_locate_from_path(const char *argv0); +char *file_program_path(const char *argv0); FILE *file_config_open_read( const char *what, const file_path_t *fv, int fvcnt); +FILE *file_config_open_read_chosen( + const char *what, const file_path_t *fv, int fvcnt, int *chosen); FILE *file_config_open_read_norename( const char *what, const file_path_t *fv, int fvcnt); FILE *file_config_open_read_norename_chosen( const char *what, const file_path_t *fv, int fvcnt, int *chosen); FILE *file_config_open_write(const char *what, const file_path_t *fv); -gboolean file_config_close(FILE *out, const file_path_t *fv); +bool file_config_close(FILE *out, const file_path_t *fv); +int file_sync_fclose(FILE *f); void file_config_preamble(FILE *out, const char *what); void file_path_set(file_path_t *fp, const char *dir, const char *name); +const char *file_oflags_to_string(int flags); +const char *file_accmode_to_string(const int accmode) G_CONST; int file_open(const char *path, int flags, int mode); +int file_open_silent(const char *path, int flags, int mode); int file_absolute_open(const char *path, int flags, int mode); +int file_absolute_open_silent(const char *path, int flags, int mode); int file_open_missing(const char *path, int flags); +int file_open_missing_silent(const char *path, int flags); int file_create(const char *path, int flags, int mode); int file_create_missing(const char *path, int flags, int mode); FILE *file_fopen(const char *path, const char *mode); @@ -77,12 +86,12 @@ * File line predicates. */ -gboolean file_line_chomp_tail(char *line, size_t size, size_t *lenptr); +bool file_line_chomp_tail(char *line, size_t size, size_t *lenptr); /** * Is line a comment? */ -static inline ALWAYS_INLINE gboolean G_GNUC_PURE +static inline ALWAYS_INLINE bool G_PURE file_line_is_comment(const char * const line) { return '#' == line0; @@ -91,13 +100,13 @@ /** * Is line empty? */ -static inline ALWAYS_INLINE gboolean G_GNUC_PURE +static inline ALWAYS_INLINE bool G_PURE file_line_is_empty(const char * const line) { return '\0' == line0; } -static inline ALWAYS_INLINE gboolean G_GNUC_PURE +static inline ALWAYS_INLINE bool G_PURE file_line_is_skipable(const char * const line) { return file_line_is_comment(line) || file_line_is_empty(line);
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/file_object.c
Added
@@ -0,0 +1,1458 @@ +/* + * Copyright (c) 2006 Christian Biere + * Copyright (c) 2013-2014 Raphael Manfredi + * + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Sharing of file descriptors through file objects. + * + * @author Christian Biere + * @date 2006 + * @author Raphael Manfredi + * @date 2013-2014 + */ + +/** + * @note NOTE: + * It is the callers responsibility to ensure consistency between the file + * descriptor and the pathname. Thus, this must not be used with arbitrary + * paths but only for directories under our control. For example, the file + * could be removed by another process and file_object_open() would return the + * file descriptor of the already removed file. When the last file object for + * this pathname is released, the file contents would be lost. + * + * Likewise, you can open a file that has already been deleted or moved when + * using file_object_open(). Whether the file still exists can be checked with + * fstat(). However this is not necessarily the same file referenced by the + * file object. + * + * The current offset is shared that means, you should always use pread() + * instead of read(), pwrite() instead of write() etc. The replacement + * functions -- compat_pread() and compat_pwrite() -- do not restore the + * original file offset. + * + * Normally, file objects should be acquired as follows: + * + * // Open file, do not create it if missing + * file = file_object_open(pathname, mode); + * if (NULL == file) { + * // Error handling + * } + * + * // Open file, creating it if missing + * file = file_object_create(pathname, mode, permissions); + * if (NULL == file) { + * // Error handling + * } + * + * Internally, all files are opened O_RDWR if possible to be able to share + * the file descriptors, but the API checks the access mode and will loudly + * complain if the user is trying to read from a write-only file for instance, + * since that indicates a programming error. + * + * If the underlying file cannot be opened O_RDWR, we open it for the type of + * access the user wants (e.g. O_RDONLY), but then any attempt to open the + * file with O_WRONLY will be trapped by this layer to return EACCES, unless + * by then permissions on the filesystem have changed and we can re-open the + * file transparently in O_RDWR mode. + */ + +#include "common.h" + +#include "file_object.h" + +#include "atomic.h" +#include "atoms.h" +#include "compat_misc.h" +#include "compat_pio.h" +#include "fd.h" +#include "file.h" +#include "hikset.h" +#include "hset.h" +#include "iovec.h" +#include "mutex.h" +#include "once.h" +#include "path.h" +#include "pslist.h" +#include "spinlock.h" +#include "str.h" /* For str_private() */ +#include "walloc.h" + +#include "override.h" /* Must be the last header included */ + +/** + * Table contains all the file descriptors, indexed by absolute pathname + * + */ +static hikset_t *file_descriptors; +static mutex_t file_descriptors_mtx = MUTEX_INIT; + +#define FILE_OBJECTS_LOCK mutex_lock(&file_descriptors_mtx) +#define FILE_OBJECTS_UNLOCK mutex_unlock(&file_descriptors_mtx) + +#define assert_file_objects_locked() \ + assert_mutex_is_owned(&file_descriptors_mtx) + +/* + * Set containing all the opened files, to be able to warn at close time if + * the application forgot to close some (file descriptor leak). + */ +static hset_t *file_objects; + +enum file_object_magic { FILE_OBJECT_MAGIC = 0x6b084325 }; + +/** + * Structure returned to users which describe the file being opened, the + * mode of access, and which references the internal file descriptor. + */ +struct file_object { + enum file_object_magic magic; + struct file_descriptor *fd; /* Internal file descriptor */ + const char *file; /* Place where file was opened */ + int accmode; /* O_RDONLY, O_WRONLY, O_RDWR */ + int line; /* Line number where file was opened */ +}; + +static inline void +file_object_check_minimal(const file_object_t * const fo) +{ + g_assert(fo != NULL); + g_assert(FILE_OBJECT_MAGIC == fo->magic); +} + +enum file_descriptor_magic { FILE_DESCRIPTOR_MAGIC = 0x69ba3bc8 }; + +/** + * Internal attributes for a file descriptor. + */ +struct file_descriptor { + enum file_descriptor_magic magic; + const char *pathname; /* Atom, internal indexing key */ + int refcnt; /* Reference count */ + int fd; /* The file descriptor, opened O_RDWR usually */ + int omode; /* Opening mode of file descriptor */ + bool revoked; /* Whether descriptor was revoked */ + spinlock_t lock; /* Concurrent access protection */ +}; + +static inline void +file_descriptor_check(const struct file_descriptor * const fd) +{ + g_assert(fd != NULL); + g_assert(FILE_DESCRIPTOR_MAGIC == fd->magic); +} + +/* + * It is necessary to lock descriptors for each operation accessing the + * kernel file descriptor held within because of possible concurrent renaming + * or file moving operation that could happen. This means all pread() and + * pwrite() I/Os done from here are serialized for a given file descriptor. + */ + +#define FILE_DESCRIPTOR_LOCK(fd) spinlock_const(&(fd)->lock) +#define FILE_DESCRIPTOR_UNLOCK(fd) spinunlock_const(&(fd)->lock) + +#define FILE_DESCRIPTOR_LOCKED(fd) spinlock_is_held(&(fd)->lock) + +static inline void +file_object_check(const file_object_t * const fo) +{ + file_object_check_minimal(fo); + file_descriptor_check(fo->fd); +} + +/** + * @return English description of file opening mode. + */ +static const char * +file_object_mode_to_string(const int mode) +{ + switch (mode) { + case O_RDONLY: return "read-only"; + case O_WRONLY: return "write-only"; + case O_RDWR: return "read-write"; + } + + return str_smsg("mode 0%o", mode); +} + +/** + * Lookup file decriptor in the table. + * + * @param pathname path to file for which we want a file descriptor + * + * @return found file descriptor, NULL if not found + */ +static inline struct file_descriptor * +file_object_lookup(const char * const pathname) +{ + assert_file_objects_locked(); + return hikset_lookup(file_descriptors, pathname); +} + +/** + * Insert file descriptor in the table. + * + * @param fd the file descriptor to insert + */ +static inline void +file_object_insert(const struct file_descriptor *fd) +{ + assert_file_objects_locked(); + hikset_insert(file_descriptors, fd); +} + +/** + * Remove file object from the table. + * + * @param fd the file descriptor to insert + */ +static inline void +file_object_remove(const struct file_descriptor *fd) +{ + assert_file_objects_locked(); + hikset_remove(file_descriptors, fd->pathname); +} + +/** + * Find an existing file descriptor associated with the given pathname. + * + * @return the file descriptor if found, NULL otherwise. + */ +static struct file_descriptor * +file_object_find(const char * const pathname) +{ + struct file_descriptor *fd; + + assert_file_objects_locked(); + + g_return_val_if_fail(pathname != NULL, NULL); + g_return_val_if_fail(is_absolute_path(pathname), NULL); + + fd = file_object_lookup(pathname); + + if (fd != NULL) { + file_descriptor_check(fd); + g_assert(is_valid_fd(fd->fd)); + g_assert(fd_accmode_is_valid(fd->fd, fd->omode)); + g_assert(!fd->revoked); + } + + return fd; +} + +/** + * Free file descriptor. + */ +static void +file_object_free_descriptor(struct file_descriptor * const fd) +{ + file_descriptor_check(fd); + g_assert(0 == fd->refcnt); + + fd_close(&fd->fd); + atom_str_free_null(&fd->pathname); + spinlock_destroy(&fd->lock); + fd->magic = 0; + WFREE(fd); +} + +/** + * Allocate a new file descriptor and register it in the table. + * + * When there is already an entry for the path in the table (race condition) + * the old entry is returned and the kernel descriptor is closed. + * + * @param d kernel descriptor for opened file + * @param pathname absolute pathname + * @param omode opening mode (O_RDONLY, O_WRONLY, O_RDWR) + */ +static struct file_descriptor * +file_object_new_descriptor(const int d, const char * const pathname, int omode) +{ + struct file_descriptor *fd, *fdn; + + g_return_val_if_fail(d >= 0, NULL); + g_return_val_if_fail(is_absolute_path(pathname), NULL); + + /* + * Assume there will be no race condition and create the new descriptor + * prior to taking the global lock. + */ + + WALLOC0(fdn); + fdn->magic = FILE_DESCRIPTOR_MAGIC; + fdn->fd = d; + spinlock_init(&fdn->lock); + + FILE_OBJECTS_LOCK; + fd = file_object_find(pathname); + + if G_UNLIKELY(fd != NULL) { + /* + * Race condition detected, we're returning the existing fd. + */ + + atomic_int_inc(&fd->refcnt); + FILE_OBJECTS_UNLOCK; + + /* + * Free the object we had created, which will close ``d''. + * + * However, if we managed to open ``d'' with O_RDWR and the + * descriptor is currently not opened with O_RDWR, swap in the + * kernel file descriptors. + */ + + g_assert(fd->fd != d); + + if (fd->omode != O_RDWR && O_RDWR == omode) { + FILE_DESCRIPTOR_LOCK(fd); + fdn->fd = fd->fd; /* The previously opened file */ + fd->fd = d; /* The newly opened file, O_RDWR now */ + fd->omode = omode; + FILE_DESCRIPTOR_UNLOCK(fd); + } + + file_object_free_descriptor(fdn); + return fd; + } + + /* + * Nominal case, we're using the new object + */ + + fdn->refcnt = 1; + fdn->pathname = atom_str_get(pathname); + fdn->omode = omode; + file_object_insert(fdn); + FILE_OBJECTS_UNLOCK; + + return fdn; +} + +/** + * Allocate a new file object referencing a file descriptor (which has + * already been ref-counted). + * + * @param fd the file descriptor + * @param accmode user access mode on the file + * @param file location where file was opened + * @param line line number where file was opened + */ +static file_object_t * +file_object_alloc(struct file_descriptor *fd, int accmode, + const char *file, int line) +{ + file_object_t *fo; + + WALLOC0(fo); + fo->magic = FILE_OBJECT_MAGIC; + fo->fd = fd; + fo->accmode = accmode; + fo->file = file; + fo->line = line; + + /* + * Track all the files being opened so that we can warn them at exit + * time if there are some files which were opened and never closed, + * a source for file descriptor leaking! + */ + + hset_insert(file_objects, fo); + + file_object_check(fo); + + return fo; +} + +/** + * Revoke a file descriptor. + */ +static void +file_object_revoke(struct file_descriptor * const fd) +{ + file_descriptor_check(fd); + + assert_file_objects_locked(); + g_return_if_fail(!fd->revoked); + + file_object_remove(fd); + fd->revoked = TRUE; + atomic_mb(); /* Since update was made without locking */ +} + +/** + * Remove a reference on a file descriptor, freeing it if it reaches zero. + */ +static void +file_object_unref_descriptor(struct file_descriptor *fd) +{ + /* + * If d->refcnt is not zero, we don't need to take the global lock. + * Otherwise, we need to take the lock and recheck, since file descriptor + * could have been concurrently re-used. + */ + + if (atomic_int_dec_is_zero(&fd->refcnt)) { + bool need_free = FALSE; + FILE_OBJECTS_LOCK; + if (0 == atomic_int_get(&fd->refcnt)) { + file_object_remove(fd); + need_free = TRUE; + } + FILE_OBJECTS_UNLOCK; + if (need_free) + file_object_free_descriptor(fd); + } +} + +/** + * Free file object. + */ +static void +file_object_free(file_object_t *fo) +{ + file_object_check(fo); + + file_object_unref_descriptor(fo->fd); + hset_remove(file_objects, fo); + fo->magic = 0; + WFREE(fo); +} + +/** + * Check whether the kernel file descriptor is opened with the proper access + * mode for the I/O operations that the user wants. + * + * @param fd the internal file descriptor we have already + * @param pathname the file they wish to access + * @param accmode the access mode the user wants to perform on the file + * + * @return TRUE if OK, FALSE if the permissions are not adequate. + */ +static bool +file_object_descriptor_is_compatible(struct file_descriptor *fd, + const char *pathname, int accmode) +{ + int d; + + /* + * We are not always able to open the file in O_RDWR mode internally. + * For instance, a file could be marked as read-only on the file system + * and therefore can only be opened for reading. + * + * If the kernel file opening mode does not match what they want, try + * to re-open the file (permissions may have changed on the file system. + */ + + if G_LIKELY(O_RDWR == fd->omode) + return TRUE; + + if (fd->omode == accmode) + return TRUE; + + /* + * Try to upgrade the kernel file descriptor. + */ + + if (O_RDONLY == accmode) { + d = file_absolute_open_silent(pathname, O_RDWR, 0); + } else { + d = file_open_missing_silent(pathname, O_RDWR); + } + + if (-1 == d) + return FALSE; + + /* + * We managed to opend the file in read-write mode, update the + * file descriptor. + */ + + FILE_DESCRIPTOR_LOCK(fd); + + if (fd->omode != O_RDWR) { + /* + * Replace kernel descriptor with new one and upgrade to O_RDWR mode. + * + * @attention + * This is not the traditional UNIX semantics: releasing the old kernel + * fd and attaching the new one is not safe: the file could have changed + * on the disk and we're now replacing I/Os to the old file with I/Os + * to a new file. But with cached file_object I/Os, one needs to + * perform a file_object_unlink() operation to unlink a file. If the + * file is changed on the filesystem directly via an unlink(), all bets + * are off. + */ + close(fd->fd); + fd->fd = d; + fd->omode = O_RDWR; + } else { + /* Race condition, close new file */ + close(d); + } + + FILE_DESCRIPTOR_UNLOCK(fd); + + return TRUE; /* OK, since we managed to get a read-write fd */ +} + +/** + * Acquires a file object for a given pathname and access mode. + * When no matching file object exists and the file cannot be opened, NULL + * is returned. + * + * @param pathname absolute pathname + * @param accmode the access mode they want for this file + * @param file file location where file is opened + * @param line line number whenre file is opened + * + * @return file object if opened, NULL on error. + */ +file_object_t * +file_object_open_from(const char * const pathname, int accmode, + const char *file, int line) +{ + struct file_descriptor *fd; + + g_assert(pathname != NULL); + g_return_val_if_fail(is_absolute_path(pathname), NULL); + + file_object_init(); + + FILE_OBJECTS_LOCK; + fd = file_object_find(pathname); + FILE_OBJECTS_UNLOCK; + + if (fd != NULL) { + atomic_int_inc(&fd->refcnt); + if (!file_object_descriptor_is_compatible(fd, pathname, accmode)) { + file_object_unref_descriptor(fd); + errno = EACCES; + return NULL; /* Permission denied */ + } + } else { + int d; + + /* + * No known file descriptor for this path. Open the file then and + * if we can, wrap the file descriptor and record it. + * + * NOTE: we do not have the lock during file opening. + * We have to recheck for the file descriptor presence in + * file_object_new_descriptor(). + */ + + if (O_RDONLY == accmode) { + d = file_absolute_open_silent(pathname, O_RDWR, 0); + } else { + d = file_open_missing_silent(pathname, O_RDWR); + } + + if G_LIKELY(d >= 0) { + fd = file_object_new_descriptor(d, pathname, O_RDWR); + } else if (EACCES == errno) { + /* + * Could not open the file with read-write access. Maybe the + * file exists already and therefore cannot be opened as both + * read-and-write... Try the access mode they want, do not force + * read-write. + */ + + if (O_RDONLY == accmode) { + d = file_absolute_open(pathname, O_RDONLY, 0); + } else { + d = file_open_missing(pathname, accmode); + } + + if (d >= 0) + fd = file_object_new_descriptor(d, pathname, accmode); + } + } + + g_assert(NULL == fd || is_valid_fd(fd->fd)); + + if G_UNLIKELY(NULL == fd) + return NULL; + + return file_object_alloc(fd, accmode, file, line); +} + +/** + * Acquires a file object for a given pathname (created if missing) and + * access mode. When no matching file object exists and the file cannot + * be created, NULL is returned. + * + * @param pathname absolute pathname to file + * @param accmode access mode for the file (O_RDONLY, O_WRONLY, O_RDWR) + * @param mode permission mode, if creating + * @param file file location where file is opened + * @param line line number whenre file is opened + * + * @return a file object enabling I/O operations on success, NULL on error. + */ +file_object_t * +file_object_create_from(const char * const pathname, int accmode, mode_t mode, + const char *file, int line) +{ + struct file_descriptor *fd; + + file_object_init(); + + g_assert(pathname != NULL); + g_return_val_if_fail(is_absolute_path(pathname), NULL); + + FILE_OBJECTS_LOCK; + fd = file_object_find(pathname); + FILE_OBJECTS_UNLOCK; + + if (fd != NULL) { + atomic_int_inc(&fd->refcnt); + if (!file_object_descriptor_is_compatible(fd, pathname, accmode)) { + file_object_unref_descriptor(fd); + errno = EACCES; + return NULL; /* Permission denied */ + } + } else { + int d; + + /* + * No known file descriptor for this path. Open the file then and + * if we can, wrap the file descriptor and record it. + * + * NOTE: we do not have the lock during file opening. + * We have to recheck for the file descriptor presence in + * file_object_new_descriptor(). + */ + + d = file_create(pathname, O_RDWR, mode); + + if G_LIKELY(d >= 0) { + fd = file_object_new_descriptor(d, pathname, O_RDWR); + } else if (EACCES == errno) { + /* + * Could not open the file with read-write access. Maybe the + * file exists already and therefore cannot be opened as both + * read-and-write... Try the access mode they want, do not force + * read-write. + */ + + d = file_create(pathname, accmode, mode); + if (d >= 0) + fd = file_object_new_descriptor(d, pathname, accmode); + } + } + + g_assert(NULL == fd || is_valid_fd(fd->fd)); + + if G_UNLIKELY(NULL == fd) + return NULL; + + return file_object_alloc(fd, accmode, file, line); +} + +/** + * Releases a file object and frees its memory. The underlying file + * descriptor however is not closed unless no other file object references + * it. The pointer is nullified. + * + * @param fo_ptr If pointing to NULL, nothing happens. Otherwise, it must + * point to an initialized file_object. + */ +void +file_object_release(file_object_t **fo_ptr) +{ + g_assert(fo_ptr != NULL); + + if (*fo_ptr) { + file_object_t *fo = *fo_ptr; + + file_object_free(fo); + *fo_ptr = NULL; + } +} + +/** + * Special operations that we can perform on file objects. + * + * These require special treatment because Windows frowns upon renaming + * and unlinking of opened files and will not, unlike UNIX, keep an already + * opened file accessible after it has been removed from the filesystem. + * + * Special operations provide uniform semantics on every platform: + * + * - FO_OP_UNLINK unlinks the file, denying further access to the file + * even if it was already opened. + * + * - FO_OP_RENAME renames the file, making it transparent for users with + * current accesses on the file being renamed. + * + * - FO_OP_MOVED notifies that the file was moved around (accross file + * systems possibly) and that current users of the old path should be + * transparently remapped to the new file with the same access levels, + * the old location being unlinked afterwards. + */ +enum file_object_op { + FO_OP_UNLINK = 0, /**< Unlink file, further access denied */ + FO_OP_RENAME, /**< Rename file (on same filesystem) */ + FO_OP_MOVED /**< Moving notification */ +}; + +/** + * Convert special operation to string. + */ +static const char * +file_object_op_to_string(enum file_object_op op) +{ + switch (op) { + case FO_OP_UNLINK: return "unlink()"; + case FO_OP_RENAME: return "rename()"; + case FO_OP_MOVED: return "unlink()"; /* "unlink()" is NOT a typo */ + } + + g_assert_not_reached(); + return NULL; +} + +/** + * Execute special operation. + * + * @param old_name An absolute pathname, the old file name. + * @param new_name An absolute pathname, the new file name. + * + * @return TRUE if operation was successful, FALSE otherwise, with errno set. + */ +static bool +file_object_special_op(enum file_object_op op, + const char * const old_name, const char * const new_name) +{ + struct file_descriptor *fd; + bool ok = TRUE; + int saved_errno = 0; + + errno = EINVAL; /* In case one of the soft assertions fails */ + + g_return_val_if_fail(old_name, FALSE); + g_return_val_if_fail(is_absolute_path(old_name), FALSE); + if (op != FO_OP_UNLINK) { + g_return_val_if_fail(new_name, FALSE); + g_return_val_if_fail(is_absolute_path(new_name), FALSE); + } + + /* + * By taking this global lock, we ensure we can safely access all the + * file objects stored in any of the tables and manipulate them directly. + * + * This is a recursive lock, because we'll call file_object_find() which + * also needs to take the same lock to access the tables. + */ + + FILE_OBJECTS_LOCK; + fd = file_object_find(old_name); + + if (fd != NULL) + FILE_DESCRIPTOR_LOCK(fd); + + /* + * On Windows, close all the files prior renaming / unlinking. + * + * On UNIX, only close all the files on unlink and moving. There is + * no need to do anything for a rename() operation. + */ + + if (fd != NULL && (op != FO_OP_RENAME || is_running_on_mingw())) { + fd_forget_and_close(&fd->fd); + } + + /* + * Perform the rename() operation now since we can't update the file + * names if that operation fails. + * + * We can defer the unlink() operation after we have updated the file + * names for two reasons: + * + * - if we can't unlink the file, we can still revoke the file objects + * as if we did unlink it... and if the unlink is the result of a + * successful "move" operation, we want the application to open the + * new file anyway. + * + * - an unlink() operation for large files can take a long time on some + * filesystems and we are still holding the lock, preventing concurrent + * file opening to take place in other threads. + */ + + if (FO_OP_RENAME == op && -1 == rename(old_name, new_name)) { + saved_errno = errno; + ok = FALSE; + if (NULL == fd) + goto done; + goto reopen; + } + + ok = TRUE; + + if (NULL == fd) + goto done; + + if (op != FO_OP_UNLINK) { + /* + * Re-index the file descriptor with its new name. + * + * Because we hold the global lock, we can safely update the pathname + * of the file descriptor: nobody can access that value from the outside + * without first taking the lock. + */ + + hikset_remove(file_descriptors, fd->pathname); + atom_str_change(&fd->pathname, new_name); + hikset_insert(file_descriptors, fd); + } else { + /* + * Revoke the file descriptor on unlinking. + * + * This will prevent further file_object_open() pointing to the (now + * removed) path from returning an existing file object. + * It will also invalidate all current file objects: further read/write + * attempts on these will return EBADF. + */ + + file_object_revoke(fd); + goto done; /* No re-opening required with unlink */ + } + + /* FALL THROUGH */ + +reopen: + + /* + * On Windows, reopen the file. + * + * On UNIX, reopen the file after a move operation. There is nothing + * to be done on a rename() since we did not close the files before the + * operation and the kernel will do the right thing. + */ + + if (FO_OP_MOVED == op || is_running_on_mingw()) { + fd->fd = file_absolute_open(fd->pathname, fd->omode, 0); + + if (!is_valid_fd(fd->fd)) { + s_warning("%s(): cannot reopen \"%s\" %s " + "after successful %s of \"%s\": %m", + G_STRFUNC, fd->pathname, file_object_mode_to_string(fd->omode), + file_object_op_to_string(op), old_name); + } + } + + /* FALL THROUGH */ + +done: + if (fd != NULL) + FILE_DESCRIPTOR_UNLOCK(fd); + FILE_OBJECTS_UNLOCK; + + if (!ok) + errno = saved_errno; + + /* + * Now that we released the lock we can perform the unlink() if needed. + * If we can't unlink the file we report a success for a move notification + * and we warn. For a plain unlink(), we do not log anything but return + * a failure status. + */ + + switch (op) { + case FO_OP_UNLINK: + ok = unlink(old_name) != -1; + break; + case FO_OP_MOVED: + if (-1 == unlink(old_name)) { + s_warning("%s(): cannot unlink \"%s\" after a copy to \"%s\": %m", + G_STRFUNC, old_name, new_name); + } + ok = TRUE; + break; + case FO_OP_RENAME: + break; /* Already handled above */ + } + + return ok; +} + +/** + * Renames a file and transparently re-opens the file descriptor pointing to + * the old name, re-inserting the file descriptor with the new names, assuming + * renaming was successful. + * + * @param old_name An absolute pathname, the old file name. + * @param new_name An absolute pathname, the new file name. + * + * @return TRUE if renaming was successful, FALSE otherwise, with errno set. + */ +bool +file_object_rename(const char * const old_name, const char * const new_name) +{ + return file_object_special_op(FO_OP_RENAME, old_name, new_name); +} + +/** + * Notification that a file was successfully copied. Access by file objects + * to the old path are transferred to the new one and the old file is unlinked. + * + * @param old_name An absolute pathname, the old file name. + * @param new_name An absolute pathname, the new file name. + */ +void +file_object_moved(const char * const old_name, const char * const new_name) +{ + file_object_special_op(FO_OP_MOVED, old_name, new_name); +} + +/** + * Deletes a file. + * + * @param path An absolute pathname, the file to unkink() + * + * @return TRUE if unlinking was successful, FALSE otherwise, with errno set. + */ +bool +file_object_unlink(const char * const path) +{ + return file_object_special_op(FO_OP_UNLINK, path, NULL); +} + +static ssize_t +file_object_ebadf(void) +{ + errno = EBADF; + return (ssize_t) -1; +} + +static ssize_t +file_object_eperm(const file_object_t * const fo, const char *what, + const char *where) +{ + s_carp("%s(): cannot %s to file opened %s at %s:%d", + where, what, + file_object_mode_to_string(fo->accmode), fo->file, fo->line); + + errno = EPERM; + return (ssize_t) -1; +} + +/** + * Is file object readable? + */ +static inline bool +file_object_readable(const file_object_t * const fo) +{ + return O_RDONLY == fo->accmode || O_RDWR == fo->accmode; +} + +/** + * Is file object writable? + */ +static inline bool +file_object_writable(const file_object_t * const fo) +{ + return O_WRONLY == fo->accmode || O_RDWR == fo->accmode; +} + +/** + * Write the given data to a file object at the given offset. + * + * @param fo An initialized file object. + * @param data An initialized buffer holding the data to write. + * @param size The amount of bytes to write (i.e., the size of data). + * @param offset The file offset at which to start writing the data. + * + * @return On failure -1 is returned and errno is set. On success the + * amount of bytes written is returned. + */ +ssize_t +file_object_pwrite(const file_object_t * const fo, + const void * const data, const size_t size, const filesize_t offset) +{ + const struct file_descriptor *fd; + ssize_t w; + + file_object_check(fo); + + fd = fo->fd; + FILE_DESCRIPTOR_LOCK(fd); + + if G_UNLIKELY(!is_valid_fd(fd->fd)) + w = file_object_ebadf(); + else if G_UNLIKELY(!file_object_writable(fo)) + w = file_object_eperm(fo, "write", G_STRFUNC); + else + w = compat_pwrite(fd->fd, data, size, offset); + + FILE_DESCRIPTOR_UNLOCK(fd); + + return w; +} + +/** + * Write the given data to a file object at the given offset. + * + * @param fo An initialized file object. + * @param iov An initialized I/O vector buffer. + * @param iov_cnt The number of initialized buffer in iov (i.e., its size). + * @param offset The file offset at which to start writing the data. + * + * @return On failure -1 is returned and errno is set. On success the amount + * of data bytes written is returned. + */ +ssize_t +file_object_pwritev(const file_object_t * const fo, + const iovec_t * iov, const int iov_cnt, const filesize_t offset) +{ + const struct file_descriptor *fd; + ssize_t w; + + file_object_check(fo); + g_assert(iov != NULL); + g_assert(iov_cnt > 0); + + fd = fo->fd; + FILE_DESCRIPTOR_LOCK(fd); + + if G_UNLIKELY(!is_valid_fd(fd->fd)) + w = file_object_ebadf(); + else if G_UNLIKELY(!file_object_writable(fo)) + w = file_object_eperm(fo, "write", G_STRFUNC); + else + w = compat_pwritev(fd->fd, iov, iov_cnt, offset); + + FILE_DESCRIPTOR_UNLOCK(fd); + + return w; +} + +/** + * Read data from the file object from the given offset. + * + * @param fo An initialized file object. + * @param data A buffer for holding the data to be read. + * @param size The amount of bytes to read (i.e., the size of data). + * @param offset The file offset from which to start reading data. + * + * @return On failure -1 is returned and errno is set. On success the + * amount of bytes read is returned. + */ +ssize_t +file_object_pread(const file_object_t * const fo, + void * const data, const size_t size, const filesize_t offset) +{ + const struct file_descriptor *fd; + ssize_t r; + + file_object_check(fo); + + fd = fo->fd; + FILE_DESCRIPTOR_LOCK(fd); + + if G_UNLIKELY(!is_valid_fd(fd->fd)) + r = file_object_ebadf(); + else if G_UNLIKELY(!file_object_readable(fo)) + r = file_object_eperm(fo, "read", G_STRFUNC); + else + r = compat_pread(fd->fd, data, size, offset); + + FILE_DESCRIPTOR_UNLOCK(fd); + + return r; +} + +/** + * Read data from a file object from the given offset. + * + * @param fo An initialized file object. + * @param iov An initialized I/O vector buffer. + * @param iov_cnt The number of initialized buffer in iov (i.e., its size). + * @param offset The file offset at which to start reading data. + * + * @return On failure -1 is returned and errno is set. On success the amount + * of data bytes read is returned. + */ +ssize_t +file_object_preadv(const file_object_t * const fo, + iovec_t * const iov, const int iov_cnt, const filesize_t offset) +{ + const struct file_descriptor *fd; + ssize_t r; + + file_object_check(fo); + g_assert(iov); + g_assert(iov_cnt > 0); + + fd = fo->fd; + FILE_DESCRIPTOR_LOCK(fd); + + if G_UNLIKELY(!is_valid_fd(fd->fd)) + r = file_object_ebadf(); + else if G_UNLIKELY(!file_object_readable(fo)) + r = file_object_eperm(fo, "read", G_STRFUNC); + else + r = compat_preadv(fd->fd, iov, MIN(iov_cnt, MAX_IOV_COUNT), offset); + + FILE_DESCRIPTOR_UNLOCK(fd); + + return r; +} + +/** + * Get opened file status. + * + * @return 0 if OK, -1 on failure with errno set. + */ +int +file_object_fstat(const file_object_t * const fo, filestat_t *buf) +{ + const struct file_descriptor *fd; + int s; + + file_object_check(fo); + + fd = fo->fd; + FILE_DESCRIPTOR_LOCK(fd); + + if G_UNLIKELY(fd->revoked) { + s_carp("%s(): descriptor for \"%s\" was revoked", + G_STRFUNC, fd->pathname); + s = -1; + errno = EBADF; + } else { + g_assert(is_valid_fd(fd->fd)); + s = fstat(fd->fd, buf); + } + + FILE_DESCRIPTOR_UNLOCK(fd); + + return s; +} + +/** + * Truncate file. + * + * @return 0 if OK, -1 on failure with errno set. + */ +int +file_object_ftruncate(const file_object_t * const fo, filesize_t off) +{ + const struct file_descriptor *fd; + int s; + + file_object_check(fo); + + fd = fo->fd; + FILE_DESCRIPTOR_LOCK(fd); + + if G_UNLIKELY(fd->revoked) { + s_carp("%s(): descriptor for \"%s\" was revoked", + G_STRFUNC, fd->pathname); + s = -1; + errno = EBADF; + } else { + g_assert(is_valid_fd(fd->fd)); + s = ftruncate(fd->fd, off); + } + + FILE_DESCRIPTOR_UNLOCK(fd); + + return s; +} + +/** + * Predeclare a sequential access pattern for file data. + */ +void +file_object_fadvise_sequential(const file_object_t * const fo) +{ + const struct file_descriptor *fd; + + file_object_check(fo); + + fd = fo->fd; + FILE_DESCRIPTOR_LOCK(fd); + + if G_UNLIKELY(fd->revoked) { + s_carp("%s(): descriptor for \"%s\" was revoked", + G_STRFUNC, fd->pathname); + } else { + g_assert(is_valid_fd(fd->fd)); + compat_fadvise_sequential(fd->fd, 0, 0); + } + + FILE_DESCRIPTOR_UNLOCK(fd); +} + +/** + * Get the file descriptor associated with a file object. This should + * not be used lightly and the returned file descriptor should not be + * cached. Future versions might open/close the file descriptor on + * demand or dynamically. + * + * @warning + * If a concurrent renaming operation happens on Windows, or a concurrent + * file moving operation occurred, the file descriptor we're returning might + * already be obsolete. + * + * @param fo An initialized file object. + * + * @return The file descriptor of the file object. + */ +int +file_object_fd(const file_object_t * const fo) +{ + const struct file_descriptor *fd; + int d; + + file_object_check(fo); + + fd = fo->fd; + FILE_DESCRIPTOR_LOCK(fd); + + if G_UNLIKELY(fd->revoked) { + s_carp("%s(): descriptor for \"%s\" was revoked", + G_STRFUNC, fd->pathname); + d = -1; + } else { + g_assert(is_valid_fd(fd->fd)); + d = fd->fd; + } + + FILE_DESCRIPTOR_UNLOCK(fd); + + return d; /* Might already be obsolete if concurrent rename / moving */ +} + +/** + * Get the pathname associated with a file object. + * + * @param An initialized file object. + * + * @return The pathname of the file object, held in a thread-private buffer. + */ +const char * +file_object_pathname(const file_object_t * const fo) +{ + str_t *s = str_private(G_STRFUNC, 256); + const char *pathname; + const struct file_descriptor *fd; + + file_object_check(fo); + + /* + * Is is necessary to take the lock to access the value because it can + * be changed from file_object_special_op(). + * + * There is a possible race because the pathname atom could be freed from + * within file_object_special_op() if the file is concurrently renamed + * or moved whilst this routine is called. The lock only guarantees that + * we'll read a consistent value, but does not protect from concurrent + * freeing that could happen once the lock was released. + * + * Unfortunately, fixing this transparently for the caller is non-trivial. + * --RAM, 2013-03-16 + * + * To fix the race, we make a copy of the read pathname into a private + * buffer. The caller must make sure to duplicate the returned value + * if it wants to peruse it. + * --RAM, 2013-11-09 + */ + + fd = fo->fd; + + FILE_DESCRIPTOR_LOCK(fd); + pathname = fd->pathname; + str_cpy(s, pathname); + FILE_DESCRIPTOR_UNLOCK(fd); + + return str_2c(s); +} + +/** + * Initialize module, once. + */ +static void +file_object_init_once(void) +{ + size_t offset = offsetof(struct file_descriptor, pathname); + + g_return_if_fail(NULL == file_descriptors); + g_return_if_fail(NULL == file_objects); + + /* + * This set is indexed by the "pathname" field of the file object, + * as indicated by the "offset" variable (Hashed Internal Key SET). + */ + + file_descriptors = hikset_create(offset, HASH_KEY_STRING, 0); + + file_objects = hset_create(HASH_KEY_SELF, 0); + hset_thread_safe(file_objects); +} + +/** + * Initializes this module and must be called before using any other function + * of this module. + */ +void +file_object_init(void) +{ + static once_flag_t inited; + + ONCE_FLAG_RUN(inited, file_object_init_once); +} + +static void +file_object_show_item(const void *value, void *unused_udata) +{ + const file_object_t * const fo = value; + + (void) unused_udata; + + file_object_check(fo); + + s_warning("leaked file object: pathname=\"%s\", opened %s at %s:%d", + file_object_pathname(fo), file_object_mode_to_string(fo->accmode), + fo->file, fo->line); +} + +static inline void +file_object_destroy_table(hikset_t **ht_ptr, const char * const name) +{ + hikset_t *ht; + uint n; + + g_assert(ht_ptr); + ht = *ht_ptr; + g_return_if_fail(ht); + + n = hikset_count(ht); + if (n > 0) { + s_warning("%s(): %s still contains %u items", G_STRFUNC, name, n); + } else { + hikset_free_null(ht_ptr); + *ht_ptr = NULL; + } +} + +/** + * Releases all used resources and should be called on shutdown. + * @note Still existing file objects are not destroyed. + */ +void +file_object_close(void) +{ +#define D(x) &x, #x + + file_object_destroy_table(D(file_descriptors)); + +#undef D + + hset_foreach(file_objects, file_object_show_item, NULL); + if (0 == hset_count(file_objects)) + hset_free_null(&file_objects); +} + +/** + * Set iterator to get information about specific file object and add + * it to the returned list of structures. + */ +static void +file_object_info_get(const void *data, void *udata) +{ + const file_object_t *fo = data; + const struct file_descriptor *fd; + pslist_t **list = udata; /* List being built for user */ + pslist_t *sl = *list; /* Current list head pointer */ + file_object_info_t *foi; + + file_object_check(fo); + + WALLOC0(foi); + foi->magic = FILE_OBJECT_INFO_MAGIC; + + fd = fo->fd; + FILE_DESCRIPTOR_LOCK(fd); + + foi->path = atom_str_get(fd->pathname); + foi->refcnt = fd->refcnt; + + FILE_DESCRIPTOR_UNLOCK(fd); + + foi->mode = fo->accmode; + foi->file = fo->file; + foi->line = fo->line; + + sl = pslist_prepend(sl, foi); + *list = sl; /* Update list head pointer */ +} + +/** + * Retrieve file_object information. + * + * @return list of file_object_info_t that must be freed by calling the + * file_object_info_list_free_null() routine. + */ +pslist_t * +file_object_info_list(void) +{ + pslist_t *sl = NULL; + + hset_foreach(file_objects, file_object_info_get, &sl); + return sl; +} + +static void +file_object_info_free(void *data, void *udata) +{ + file_object_info_t *foi = data; + + file_object_info_check(foi); + (void) udata; + + atom_str_free_null(&foi->path); + foi->magic = 0; + WFREE(foi); +} + +/** + * Free list returned by file_object_info_list() and nullify pointer. + */ +void +file_object_info_list_free_nulll(pslist_t **sl_ptr) +{ + pslist_t *sl = *sl_ptr; + + pslist_foreach(sl, file_object_info_free, NULL); + pslist_free_null(sl_ptr); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/file_object.h
Added
@@ -0,0 +1,104 @@ +/* + * Copyright (c) 2006 Christian Biere + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Sharing of file descriptors through file objects. + * + * @author Christian Biere + * @date 2006 + * @author Raphael Manfredi + * @date 2013 + */ + +#ifndef _file_object_h_ +#define _file_object_h_ + +#include "common.h" + +typedef struct file_object file_object_t; + +enum file_object_info_magic { FILE_OBJECT_INFO_MAGIC = 0x56f2fd57 }; + +/* + * File object information that can be retrieved. + */ +typedef struct { + enum file_object_info_magic magic; + const char *path; /**< Pathname opened (atom) */ + int mode; /**< Access mode */ + int refcnt; /**< Shared openings on file */ + const char *file; /**< Where file was opened */ + int line; /**< Line where file was opened */ +} file_object_info_t; + +static inline void +file_object_info_check(const file_object_info_t * const foi) +{ + g_assert(foi != NULL); + g_assert(FILE_OBJECT_INFO_MAGIC == foi->magic); +} + +void file_object_init(void); +void file_object_close(void); + +#define file_object_create(p,a,m) \ + file_object_create_from((p), (a), (m), _WHERE_, __LINE__) + +#define file_object_open(p,a) \ + file_object_open_from((p), (a), _WHERE_, __LINE__) + +file_object_t *file_object_create_from(const char *path, int accmode, + mode_t mode, const char *file, int line); +file_object_t *file_object_open_from(const char *path, int accmode, + const char *file, int line); + +ssize_t file_object_pwrite(const file_object_t *fo, + const void *data, size_t buf, filesize_t offset); +ssize_t file_object_pwritev(const file_object_t *fo, + const iovec_t *iov, int iov_cnt, filesize_t offset); +ssize_t file_object_pread(const file_object_t *fo, + void *data, size_t size, filesize_t pos); +ssize_t file_object_preadv(const file_object_t *fo, + iovec_t *iov, int iov_cnt, filesize_t offset); + +int file_object_fd(const file_object_t *fo); +const char *file_object_pathname(const file_object_t *fo); + +void file_object_release(file_object_t **fo_ptr); +bool file_object_rename(const char * const o, const char * const n); +bool file_object_unlink(const char * const path); +void file_object_moved(const char * const o, const char * const n); +int file_object_fstat(const file_object_t * const fo, filestat_t *b); +int file_object_ftruncate(const file_object_t * const fo, filesize_t off); +void file_object_fadvise_sequential(const file_object_t * const fo); + +struct pslist *file_object_info_list(void) WARN_UNUSED_RESULT; +void file_object_info_list_free_nulll(struct pslist **sl_ptr); + +#endif /* _file_object_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/filehead.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/filehead.c
Changed
@@ -56,11 +56,11 @@ * The ``errptr'' parameter needs to be used to distinguish between * a file containing "0" and a file which could not be parsed correctly. */ -guint64 -filehead_uint64(const char *path, gboolean missing, int *errptr) +uint64 +filehead_uint64(const char *path, bool missing, int *errptr) { int fd; - guint64 value; + uint64 value; char dataFILEHEAD_LINE_MAXLEN + 1; ssize_t r; int error;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/filehead.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/filehead.h
Changed
@@ -34,7 +34,7 @@ #ifndef _filehead_h_ #define _filehead_h_ -guint64 filehead_uint64(const char *path, gboolean missing, int *errptr); +uint64 filehead_uint64(const char *path, bool missing, int *errptr); #endif /* _filehead_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/filelock-test.c
Added
@@ -0,0 +1,753 @@ +/* + * filelock-test -- file locking unit tests. + * + * Copyright (c) 2015 Raphael Manfredi <Raphael_Manfredi@pobox.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the authors nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "common.h" + +#ifdef I_SYS_WAIT +#include <sys/wait.h> +#endif + +#include "concat.h" +#include "exit2str.h" +#include "fd.h" +#include "file.h" +#include "filelock.h" +#include "halloc.h" +#include "hset.h" +#include "htable.h" +#include "launch.h" +#include "log.h" +#include "misc.h" +#include "progname.h" +#include "spopen.h" +#include "stacktrace.h" +#include "str.h" +#include "strtok.h" +#include "thread.h" +#include "tm.h" +#include "walloc.h" + +const char *progpath; +static bool debugging, pid_only; + +static void G_NORETURN +usage(void) +{ + fprintf(stderr, + "Usage: %s -cdehp lockfile\n" + " -z fn1,fn2...\n" + " -X k1=v1,k2=v2\n" + " -c : check concurrent locking requests\n" + " -d : activate lock debugging output\n" + " -e : check lock existence\n" + " -h : prints this help message\n" + " -p : force PID-only locking\n" + " -z : zap (suppress) messages from listed routines\n" + " -X : key/value tuples to execute tests (in children process)\n" + , getprogname()); + exit(EXIT_FAILURE); +} + +static hset_t *zap; + +static void +zap_record(const char *value) +{ + strtok_t *s; + const char *tok; + + zap = hset_create(HASH_KEY_STRING, 0); + s = strtok_make_strip(value); + + while ((tok = strtok_next(s, ","))) { + hset_insert(zap, h_strdup(tok)); + } + + strtok_free_null(&s); +} + +static void +emitv(bool nl, const char *fmt, va_list args) +{ + static pid_t pid; + str_t *s = str_new(512); + + if G_UNLIKELY(0 == pid) + pid = getpid(); + + str_vprintf(s, fmt, args); + fprintf(stderr, "%d ", (int) pid); + fputs(str_2c(s), stderr); + if (nl) + fputc('\n', stderr); + fflush(stderr); + + str_destroy_null(&s); +} + +static void G_PRINTF(1, 2) +emit(const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + emitv(TRUE, fmt, args); + va_end(args); +} + +static void G_PRINTF(2, 3) +emit_zap(const char *caller, const char *fmt, ...) +{ + va_list args; + + if (zap != NULL && hset_contains(zap, caller)) + return; /* Zap messages from this caller */ + + va_start(args, fmt); + emitv(TRUE, fmt, args); + va_end(args); +} + +#define emitz(fmt, ...) emit_zap(G_STRFUNC, (fmt), __VA_ARGS__) + +static void +verbose_unlink(const char *lock) +{ + emitz("unlinking \"%s\"", lock); + + if (-1 == unlink(lock)) + emitz("could not unlink \"%s\": %m", lock); +} + +static pid_t G_NULL_TERMINATED +verbose_launch(const char *path, ...) +{ + pid_t p; + va_list ap; + char *cmd; + size_t cnt = 0; + char **array, **q; + const char *s; + + va_start(ap, path); + while (NULL != va_arg(ap, const char *)) + cnt++; + va_end(ap); + + HALLOC_ARRAY(array, cnt + 1); + q = array; + + va_start(ap, path); + while (NULL != ((s = va_arg(ap, const char *)))) + *q++ = deconstify_char(s); + va_end(ap); + + *q++ = NULL; + + g_assert(ptr_diff(q, array) == (cnt + 1) * sizeof array0); + + cmd = h_strjoinv(" ", array); + emitz("launching %s %s", path, cmd); + + HFREE_NULL(cmd); + HFREE_NULL(array); + + va_start(ap, path); + p = launchl_v(path, path, ap); + va_end(ap); + + if (-1 == p) + s_error("cannot launch test: %m"); + + return p; +} + +static void +test_child_expect_where(pid_t p, bool success, const char *where) +{ + int status; + + g_assert(p > 0); + + pid_t r = waitpid(p, &status, 0); + + if (-1 == r) { + s_error("waitpid() failed: %m"); + return; + } + + g_assert(r == p); + + if (WIFEXITED(status)) { + if (success != (0 == WEXITSTATUS(status))) { + s_error("was expecting %s from PID %lu at %s", + success ? "success" : "failure", (ulong) p, where); + } + emitz("exit status for PID %lu is %d (PASSED) at %s", + (ulong) p, WEXITSTATUS(status), where); + } else { + s_error("abnormal exit for PID %lu at %s: %s", (ulong) p, where, + exit2str(status)); + } +} + +#define test_child_expect(p,s) test_child_expect_where((p), (s), G_STRLOC) + +static void +test_lock_existence(const char *lock) +{ + pid_t p; + filelock_t *fl; + filelock_params_t params; + char buf128; + char args64; + const char *test = "t=exists,"; + + str_bprintf(args, sizeof args, "%s", debugging ? ",debug" : ""); + str_bcatf(args, sizeof args, "%s", pid_only ? ",pid" : ""); + + verbose_unlink(lock); + + concat_strings(buf, sizeof buf, test, "x.grab", args, NULL_PTR); + p = verbose_launch(progpath, "-X", buf, lock, NULL_PTR); + test_child_expect(p, TRUE); + + concat_strings(buf, sizeof buf, test, "pid,x.grab", args, NULL_PTR); + p = verbose_launch(progpath, "-X", buf, lock, NULL_PTR); + test_child_expect(p, TRUE); + + ZERO(¶ms); + params.pid_only = pid_only; + + fl = filelock_create(lock, ¶ms); + g_assert(fl != NULL); + + emitz("locked \"%s\" in %s mode", lock, pid_only ? "PID-only" : "default"); + + concat_strings(buf, sizeof buf, test, "x.fail", args, NULL_PTR); + p = verbose_launch(progpath, "-X", buf, lock, NULL_PTR); + test_child_expect(p, TRUE); + + concat_strings(buf, sizeof buf, test, "pid,x.fail", args, NULL_PTR); + p = verbose_launch(progpath, "-X", buf, lock, NULL_PTR); + test_child_expect(p, TRUE); + + filelock_free_null(&fl); + emitz("un-locked \"%s\"", lock); + + params.pid_only = TRUE;; + + fl = filelock_create(lock, ¶ms); + g_assert(fl != NULL); + + emitz("re-locked \"%s\" in PID-only mode", lock); + + p = verbose_launch(progpath, "-X", buf, lock, NULL_PTR); + test_child_expect(p, TRUE); + + p = filelock_pid(lock); + emitz("file \"%s\" holds PID %lu", lock, (ulong) p); + g_assert(getpid() == p); /* We own the lock! */ + + filelock_free_null(&fl); +} + +static double +launch_and_wait(void) +{ + const char *args = debugging ? ",debug" : ""; + const char *test = "t=concur,"; + char buf128; + int fd; + tm_t start, end; + int status; + + concat_strings(buf, sizeof buf, test, "x.nop", args, NULL_PTR); + fd = spopenl(progpath, "r", NULL, + progpath, "-X", buf, "/dev/null", NULL_PTR); + g_assert_log(fd != -1, "%s(): spopenl() failed: %m", G_STRFUNC); + read(fd, buf, 1); /* Wait for child to be up and write back 1 byte */ + tm_now_exact(&start); + status = spclose(fd); + g_assert_log(0 == status, "%s(): child %s", G_STRFUNC, exit2str(status)); + tm_now_exact(&end); + + return tm_elapsed_f(&end, &start); /* Time spent waiting for child */ +} + +typedef double (*test_launch_t)(void); + +static double +timeit(test_launch_t cb) +{ + tm_t start, end; + size_t i; + const size_t n = 5; + double waiting = 0.0; + + tm_now_exact(&start); + for (i = 0; i < n; i++) { + waiting += (*cb)(); + } + tm_now_exact(&end); + + return (tm_elapsed_f(&end, &start) - waiting) / n; +} + +#define LOCK_PROCS 5 /* Amount of processes to launch */ + +static void +test_lock_concurrency(const char *lock) +{ + filelock_t *fl; + filelock_params_t params; + char buf128; + char args64; + const char *test = "t=concur,"; + double elapsed; + int procsLOCK_PROCS; + int pfdLOCK_PROCS; + int fd2; + tm_t start; + double total_delay; + size_t i, locked; + + str_bprintf(args, sizeof args, "%s", debugging ? ",debug" : ""); + str_bcatf(args, sizeof args, "%s", pid_only ? ",pid" : ""); + + verbose_unlink(lock); + + emitz("%s(): timing child creation overhead...", G_STRFUNC); + elapsed = timeit(launch_and_wait); + emitz("takes %.3f secs on average", elapsed); + + /* + * Launch locking processes, trying to have them wake up roughly at + * the same time for maximum concurrency. + */ + + total_delay = elapsed * LOCK_PROCS; + concat_strings(buf, sizeof buf, test, "x.lock", args, NULL_PTR); + + emitz("total delay will be %.3f secs", total_delay); + + tm_now_exact(&start); + + for (i = 0; i < N_ITEMS(procs); i++) { + int pipefd2; + + /* + * This pipe will link the child's stdin to pfdi, so that we can + * have the child wait until we close our writing end of the pipe + * in the parent. + */ + + if (-1 == pipe(pipefd)) + s_error("%s(): pipe() failed: %m", G_STRFUNC); + + pfdi = pipefd1; /* Keep writing end in parent */ + fd_set_close_on_exec(pfdi); /* Ensure child closes writing end */ + fd0 = pipefd0; /* Give reading end to child as stdin */ + fd1 = SPOPEN_ASIS; + + procsi = spopenl(progpath, "r", fd, + progpath, "-X", buf, lock, NULL_PTR); + + if (-1 == procsi) + s_error("%s(): cannot create process #%zu: %m", G_STRFUNC, i + 1); + + emitz("child #%zu uses fd #%d, PID %lu", + i + 1, procsi, (ulong) sppidof(procsi)); + } + + { + tm_t now; + + tm_now_exact(&now); + elapsed = tm_elapsed_f(&now, &start); + + if (elapsed > total_delay) { + emitz("spent %.3f secs creating children, not waiting", elapsed); + } else { + double s = total_delay - elapsed;; + emitz("parent waiting %.3f secs", s); + thread_sleep_ms(1000 * s); + } + } + + /* + * Unblock children. + */ + + for (i = 0; i < N_ITEMS(procs); i++) { + char b = '\0'; + + if (-1 == write(pfdi, &b, 1)) { + s_warning("%s(): write error to child #%zu: %m", G_STRFUNC, i + 1); + } else { + emitz("awoke child #%zu, PID %lu", + i + 1, (ulong) sppidof(procsi)); + } + } + + + /* + * Now see who could lock. + */ + + for (locked = 0, i = 0; i < N_ITEMS(procs); i++) { + char b; + + if (-1 == read(procsi, &b, 1)) { + s_warning("%s(): read error from child #%zu: %m", G_STRFUNC, i + 1); + } else if (b) { + locked++; + emitz("child #%zu, PID %lu, obtained the lock!", + i + 1, (ulong) sppidof(procsi)); + } + } + + g_assert_log(1 == locked, + "%s(): MORE THAN ONE PROCESS GOT THE LOCK (%zu of them)", + G_STRFUNC, locked); + + ZERO(¶ms); + params.pid_only = pid_only; + + fl = filelock_create(lock, ¶ms); + g_assert(NULL == fl); + + /* + * Closing pipes will create a POLLHUP / POLLERR error in the child + * which will then cause it to exit. Only the child that got the + * lock will exit with status 100. + */ + + for (i = 0; i < N_ITEMS(procs); i++) { + int status; + + /* Closing writing end will unblock read(STDIN) in child */ + if (-1 == close(pfdi)) + s_error("%s(): cannot close writing end: %m", G_STRFUNC); + + emitz("waiting for child #%zu, PID %lu...", + i + 1, (ulong) sppidof(procsi)); + + status = spclose(procsi); + if (-1 == status) + s_error("%s(): spclose() failed: %m", G_STRFUNC); + + if (0 != status) + emitz("child #%zu %s", i + 1, exit2str(status)); + } + + fl = filelock_create(lock, ¶ms); + g_assert(fl != NULL); + filelock_free_null(&fl); +} + +static bool +x_wants(const htable_t *xv, const char *key) +{ + const char *val = htable_lookup(xv, key); + + if (NULL == val || !is_strcaseprefix(val, "y")) + return FALSE; + + return TRUE; +} + +static void +x_common_args(const htable_t *xv, filelock_params_t *p) +{ + if (x_wants(xv, "debug")) + p->debug = TRUE; + + if (x_wants(xv, "pid")) + p->pid_only = TRUE; + + if (x_wants(xv, "keep")) + p->noclean = TRUE; + + if (x_wants(xv, "check")) + p->check_only = TRUE; +} + +static void +x_spurious_if(bool *b, const char *name, const char *caller) +{ + if (*b) { + emit("WARNING: spurious setting of -X \"%s\" for %s()", + name, caller); + } else { + *b = TRUE; + } +} + +static void +x_expr_check(bool expr, const char *estr, const char *fn, const char *wh) +{ + if (!expr) { + emit("FAILED: \"%s\" in %s() at %s", estr, fn, wh); + exit(EXIT_FAILURE); + } +} + +static void G_PRINTF(5,6) +x_expr_check_log(bool expr, const char *estr, const char *fn, const char *wh, + const char *fmt, ...) +{ + if (!expr) { + va_list ap; + + emit("FAILED: \"%s\" in %s() at %s", estr, fn, wh); + va_start(ap, fmt); + emitv(TRUE, fmt, ap); + va_end(ap); + exit(EXIT_FAILURE); + } +} + +#define x_check(expr) x_expr_check((expr), # expr, G_STRFUNC, G_STRLOC) + +#define x_check_log(expr, fmt, ...) \ + x_expr_check_log((expr), # expr, G_STRFUNC, G_STRLOC, (fmt), __VA_ARGS__) + +static void +x_lock_existence(const htable_t *xv, const char *lock) +{ + filelock_params_t params; + filelock_t *fl; + + ZERO(¶ms); + + x_common_args(xv, ¶ms); + x_spurious_if(¶ms.check_only, "check", G_STRFUNC); + + fl = filelock_create(lock, ¶ms); + + if (x_wants(xv, "x.grab")) { + /* ensure we could grab the lock if we wanted to */ + x_check(NULL == fl); + x_check_log(ESTALE == errno, "got %m%s", ""); + x_check(!file_exists(lock)); + } else if (x_wants(xv, "x.fail")) { + /* ensure we cannot grab the lock even if we wanted to */ + x_check(NULL == fl); + x_check_log(EEXIST == errno, "got %m%s", ""); + x_check(file_exists(lock)); + } +} + +static void +x_lock_concurrent(const htable_t *xv, const char *lock) +{ + filelock_params_t params; + filelock_t *fl; + + ZERO(¶ms); + + x_common_args(xv, ¶ms); + + if (x_wants(xv, "x.nop")) { + write(STDOUT_FILENO, ¶ms, 1); + return; + } else if (x_wants(xv, "x.lock")) { + char b; + + emitz("child ready, waiting for parent to unblock%s", "..."); + + (void) read(STDIN_FILENO, &b, sizeof b); + + fl = filelock_create(lock, ¶ms); + b = fl != NULL; + + if (b) + emitz("GOT LOCK%c", '!'); + + if (-1 == write(STDOUT_FILENO, &b, 1)) + s_error("child %lu cannot write back to parent: %m", + (ulong) getpid()); + + x_check(is_a_fifo(STDIN_FILENO)); + + /* Wait for parent to close its writing end to unblock us */ + (void) read(STDIN_FILENO, &b, sizeof b); + + exit(b * 100); /* Only child that got lock will exit with 100 */ + } +} + +static htable_t *xv, *tv; + +static void +x_record(const char *value) +{ + strtok_t *s; + const char *tok; + + if (NULL == xv) + xv = htable_create(HASH_KEY_STRING, 0); + + s = strtok_make_strip(value); + + while ((tok = strtok_next(s, ","))) { + char *kv = h_strdup(tok); + char *eq = strstr(kv, "="); /* What follows is the value */ + + if (NULL == eq) { + htable_insert(xv, kv, "y"); /* No value, assume "y" (for yes) */ + } else { + *eq++ = '\0'; /* Breaks up key from value */ + htable_insert(xv, kv, eq); + } + } + + strtok_free_null(&s); +} + +typedef void (*filelock_test_cb_t)(const htable_t *xv, const char *lock); + +static struct { + const char *name; + filelock_test_cb_t cb; +} filelock_tests = { + { "concur", x_lock_concurrent }, + { "exists", x_lock_existence }, +}; + +static void +filelock_tests_install(void) +{ + size_t i; + + g_assert(NULL == tv); + + tv = htable_create(HASH_KEY_STRING, 0); + + for (i = 0; i < N_ITEMS(filelock_tests); i++) { + htable_insert(tv, filelock_testsi.name, filelock_testsi.cb); + } +} + +static filelock_test_cb_t +filelock_tests_lookup(void) +{ + filelock_test_cb_t cb; + const char *name; + + g_assert(tv != NULL); + g_assert(xv != NULL); + + name = htable_lookup(xv, "t"); + if (NULL == name) + s_fatal_exit(EXIT_FAILURE, "no \"t\" key in -X"); + + cb = htable_lookup(tv, name); + if (NULL == cb) + s_fatal_exit(EXIT_FAILURE, "no test \"%s\" found", name); + + return cb; +} + +int +main(int argc, char *argv) +{ + extern int optind; + extern char *optarg; + const char options = "cdehpz:X:"; + bool cflag = FALSE, eflag = FALSE; + int c; + const char *lock; + + progstart(argc, argv); + progpath = argv0; + thread_set_main(TRUE); /* We're the main thread, we can block */ + log_show_pid(TRUE); /* Since we're launching other processes */ + stacktrace_init(argv0, FALSE); + + misc_init(); + + while ((c = getopt(argc, argv, options)) != EOF) { + switch (c) { + case 'c': /* concurrent locking requests */ + cflag++; + break; + case 'd': /* turn on debugging output */ + debugging = TRUE; + break; + case 'e': /* test lock existence */ + eflag++; + break; + case 'p': /* force weak "pid-only" everywhere locking */ + pid_only++; + break; + case 'z': /* zap message from routines using emitz() */ + zap_record(optarg); + break; + case 'X': /* parameters for the child process */ + x_record(optarg); + break; + case 'h': /* show help */ + default: + usage(); + break; + } + } + + if ((argc -= optind) != 1) + usage(); + + argv += optind; + + lock = argv0; + + if (NULL == xv) { + /* Parent process, the driver */ + emitz("using \"%s\" as the lock file", lock); + if (eflag) + test_lock_existence(lock); + if (cflag) + test_lock_concurrency(lock); + } else { + filelock_test_cb_t cb; + + filelock_tests_install(); + cb = filelock_tests_lookup(); + + (*cb)(xv, lock); + } + + return 0; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/filelock.c
Added
@@ -0,0 +1,896 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + * The fcntl() logic implemented here for locking is: + * Copyright (c) 2005 Christian Biere + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * File locks. + * + * Locks taken via filelock_create() are auto-cleaned by default when the + * process exits, but not when a fork()ed child exits. + * + * To release a lock explicitly, use filelock_free_null(). + * + * Note that these locks are advisory locks only and require that all the + * contendents be requesting permission via filelock_create() on the same path. + * + * Although filelock_create() takes paramters, applications establishing a + * locking protocol on a given file must consistently use the same parameters + * to grab the lock. Key parameters are "pid_only" and "fd_unlock". + * + * Implementation notes: + * + * If the kernel and the targeted filesystem support fcntl() locking, then + * fcntl() is the preferred way of obtaining the lock. Users can request that + * locking be done via a PID file only, but this is not recommended as this + * is full of race conditions that we attempt to fight as best as we can, but + * we can only reduce the opportunities for misbehaviour, not close all the + * loopholes. + * + * On Windows systems, fcntl() locks are mandatory locks, not advisory ones. + * As such, the file is only locked during the critical section where we read + * the existing PID and write our PID. This is different (and stronger) than + * just requesting a "pid_only" locking mode. So "fd_unlock" is implied and + * cannot be turned off. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#include "common.h" + +#include "filelock.h" + +#include "compat_misc.h" +#include "compat_usleep.h" +#include "elist.h" +#include "fd.h" +#include "file.h" +#include "log.h" +#include "misc.h" /* For is_temporary_error() */ +#include "once.h" +#include "parse.h" +#include "random.h" +#include "signal.h" +#include "spinlock.h" +#include "str.h" +#include "stringify.h" +#include "timestamp.h" +#include "tm.h" +#include "xmalloc.h" + +#include "override.h" /* Must be the last header included */ + +static const mode_t FILELOCK_MODE = S_IRUSR | S_IWUSR; /* 0600 */ + +enum filelock_magic { FILELOCK_MAGIC = 0x1e773759 }; + +/** + * A file lock. + */ +struct filelock { + enum filelock_magic magic; /**< Magic number */ + uint noclean:1; /**< If set, lock will not auto-clean */ + int fd; /**< fcntl() lock file */ + pid_t pid; /**< Process that created the lock */ + char *path; /**< Lock file path */ + link_t fl_link; /**< Links all file locks together */ +}; + +static inline void +filelock_check(const struct filelock * const fl) +{ + g_assert(fl != NULL); + g_assert(FILELOCK_MAGIC == fl->magic); +} + +/** + * All the auto-cleaned locks are linked together. + */ +static elist_t filelock_vars = ELIST_INIT(offsetof(filelock_t, fl_link)); +static spinlock_t filelock_vars_slk = SPINLOCK_INIT; + +#define FILELOCK_VARS_LOCK spinlock(&filelock_vars_slk) +#define FILELOCK_VARS_UNLOCK spinunlock(&filelock_vars_slk) + +static once_flag_t filelock_inited; + +/** + * Add new lock to the global lock list. + */ +static void +filelock_vars_add(filelock_t *fl) +{ + filelock_check(fl); + + FILELOCK_VARS_LOCK; + elist_append(&filelock_vars, fl); + FILELOCK_VARS_UNLOCK; +} + +/** + * Remove lock from the global lock list. + */ +static void +filelock_vars_remove(filelock_t *fl) +{ + filelock_check(fl); + + FILELOCK_VARS_LOCK; + elist_remove(&filelock_vars, fl); + FILELOCK_VARS_UNLOCK; +} + +/** + * Unlock filelock. + */ +static void +filelock_unlock(filelock_t *fl) +{ + filelock_check(fl); + + /* + * There is a small race condition here because we close the fcntl() + * file descriptor before unlinking the file. Another process could + * come-in and attenpt to create the file, lock it and then we would + * remove it underneath. + * + * Doing things the other way round would create problems on Windows, + * so we have to cope with that race condition at lock creation time, + * which accounts for much of the complexity of filelock_create(). + * --RAM, 2015-10-20 + */ + + fd_forget_and_close(&fl->fd); + if (-1 == unlink(fl->path)) + s_miniwarn("%s(): cannot remove \"%s\": %m", G_STRFUNC, fl->path); +} + +/** + * Free lock, unlinking the file and destroying the object. + * + * @param fl the filelock to destroy + */ +static void +filelock_free(filelock_t *fl) +{ + filelock_check(fl); + + filelock_unlock(fl); + xfree(fl->path); + + if (!fl->noclean) + filelock_vars_remove(fl); + + fl->magic = 0; + xfree(fl); +} + +/** + * Free lock, unlinking the file and nullifying the lock pointer. + * + * This effectively releases the lock we had taken. + */ +void +filelock_free_null(filelock_t **fl_ptr) +{ + filelock_t *fl = *fl_ptr; + + if (fl != NULL) { + filelock_free(fl); + *fl_ptr = NULL; + } +} + +/** + * Embedded list iterator callback to clean the lock. + */ +static bool +filelock_clean(void *data, void *udata) +{ + filelock_t *fl = data; + pid_t pid = pointer_to_ulong(udata); + + filelock_check(fl); + + /* + * Because an atexit() cleanup is inherited by children, we need to make + * sure we're only cleaning locks taken by this process! + */ + + if (fl->pid != pid) + return FALSE; /* Keep it in list */ + + /* + * Avoid any memory allocation so late in the process, so use a logging + * routine that is guaranteed to never allocate memory and which + * will by-pass stdio as well. + */ + + s_miniwarn("%s(): unlocking %s", G_STRFUNC, fl->path); + + /* + * Because this routine can be called at exit time, very late, we make + * sure all memory allocation is done via xmalloc(), an allocator we + * know will not attempt to invalidate allocated pages during application + * shutdown. + */ + + filelock_unlock(fl); /* Don't even attempt to free object */ + return TRUE; /* Remove from list */ +} + +/** + * Auto-cleaning routine invoked at exit() time or before emergency restarts. + * + * On Windows, it is critical to cleanup existing locks before we execve() + * ourselves again because the PID will change and the parent process will + * still be present for a while, causing denied locking to the child process. + * This is taken care of by crash_try_reexec(). + */ +static void +filelock_autoclean(void) +{ + pid_t pid = getpid(); + + FILELOCK_VARS_LOCK; + elist_foreach_remove(&filelock_vars, filelock_clean, ulong_to_pointer(pid)); + FILELOCK_VARS_UNLOCK; +} + +/** + * Once routine initializing the auto-cleaning of file locks. + */ +static void +filelock_init_once(void) +{ + signal_cleanup_add(filelock_autoclean); +} + +/** + * Read PID from specified file. + * + * @param fd opened file from which we want to read a PID + * + * @return the read PID, 0 if we cannot parse it with errno set. + */ +static pid_t +filelock_read_pid(int fd) +{ + ssize_t r; + char bufUINT64_DEC_BUFLEN; + uint64 u; + int error; + + /* + * Since we don't expect any errors from the system calls, we trace + * them loudly, showing the calling stack to give context given we + * only have the file descriptor down here... + */ + + if (0 != lseek(fd, 0, SEEK_SET)) { + s_carp("%s(): cannot seek to start of fd #%d: %m", G_STRFUNC, fd); + return 0; + } + + r = read(fd, buf, sizeof buf - 1); + + if ((ssize_t) -1 == r) { + s_carp("%s(): cannot read from fd #%d: %m", G_STRFUNC, fd); + return 0; + } + + /* Check the PID in the file */ + + g_assert(r >= 0 && (size_t) r < sizeof buf); + bufr = '\0'; + + u = parse_uint64(buf, NULL, 10, &error); + if (error) { + errno = error; + return 0; /* Could not parse PID */ + } + + if (u <= 1) { + errno = EDOM; /* Out of exepected domain! */ + return 0; + } + + return (pid_t) u; +} + +/** + * Write our PID into specified file descriptor. + * + * @return 0 if OK, -1 on error with errno set. + */ +static int +filelock_write_pid(int fd, pid_t ourpid) +{ + size_t w; + ssize_t r; + char bufULONG_DEC_BUFLEN + 1; /* +1 for "\n", since NUL is included */ + + w = str_bprintf(buf, sizeof buf, "%ld\n", (ulong) ourpid); + + /* + * Since we don't expect any errors from the system calls, we trace + * them loudly, showing the calling stack to give context given we + * only have the file descriptor down here... + */ + + if (0 != lseek(fd, 0, SEEK_SET)) { + s_carp("%s(): cannot seek to start fd #%d: %m", G_STRFUNC, fd); + return -1; + } + + if (-1 == ftruncate(fd, 0)) { + s_carp("%s(): cannot truncate fd #%d: %m", G_STRFUNC, fd); + return -1; + } + + r = write(fd, buf, w); + + if ((ssize_t) -1 == r) { + s_carp("%s(): cannot write %zu byte%s to fd #%d: %m", + G_STRFUNC, w, plural(w), fd); + return -1; + } + + if (UNSIGNED(r) != w) { + s_carp("%s(): could only write %zd byte%s out of %zu to fd #%d", + G_STRFUNC, r, plural(r), w, fd); + errno = ENOSPC; /* Assume it's a filesystem space problem */ + return -1; + } + + return 0; +} + +/** + * Do they want to close the fd of the lock file after writing a PID into it, + * in effect unlocking the lock file? + */ +static inline bool +filelock_is_fd_unlock(const filelock_params_t *p) +{ + /* + * On Windows, since our fcntl(F_WRLCK) implementation relies on native + * locks which are mandatory, we do not want to keep the lock file + * locked because that prevents other processes from reading it and + * seeing which PID locked the file -- there is no fcntl(F_GETLK) possible. + * --RAM, 2015-10-23 + */ + + if (is_running_on_mingw()) { + return TRUE; /* Always TRUE */ + } else { + return p != NULL && p->fd_unlock; + } +} + +/** + * Do they want to avoid auto-cleaning for the taken lock? + */ +static inline bool +filelock_is_noclean(const filelock_params_t *p) +{ + return p != NULL && p->noclean; +} + +/** + * Can other processes compete, or is it just processes launched by user? + */ +static inline bool +filelock_is_system(const filelock_params_t *p) +{ + return p != NULL && p->system; +} + +/** + * Do they want "PID-only" locking? + */ +static inline bool +filelock_is_pid_only(const filelock_params_t *p) +{ + return p != NULL && p->pid_only; +} + +/** + * Are we in "check-only" mode? + */ +static inline bool +filelock_is_check_only(const filelock_params_t *p) +{ + return p != NULL && p->check_only; +} + +/** + * Are we in "debug" mode? + */ +static inline bool +filelock_is_debug(const filelock_params_t *p) +{ + return p != NULL && p->debug; +} + +#define FILELOCK_MAX_RESTARTS 5 /* How many times can we restart */ +#define FILELOCK_MAX_OPENS 100 /* How many open() can we do? */ +#define FILELOCK_MAX_AGE 2 /* (s) File is stale if older */ + +/** + * Sleep randomly between 100 and 5000 usecs. + */ +static void +filelock_usleep(const filelock_params_t *p, const char *caller) +{ + uint us = 100 + random_value(4900); + + if (filelock_is_debug(p)) { + s_debug("%s(): sleeping for %u usec%s", caller, us, plural(us)); + } + + compat_usleep(us); +} + +/** + * Create a lockfile. + * + * The optional ``p'' argument (can be NULL) is used to customize the logic: + * + * p->debug decisions taken by the locking algorithm are traced. + * p->system processes not owned by current user can compete with lock + * p->noclean lock will not be auto-cleaned at process exit time + * p->pid_only request that we only use weaker PID-file locking logic + * p->check_only check whether we could take the lock, errno=ESTALE if OK + * p->fd_unlock unlock lockfile after writing PID, by closing it + * + * @param path the path to the lockfile (copied) + * @param p (optional) custom locking parameters + * + * @return a lockfile object on success, NULL on error with errno set: + * + * ESTALE if we could have got the lock, had we not been in check-only mode + * EEXIST if the lock could not be taken + * Other codes probably mean an error during file operations. + */ +filelock_t * +filelock_create(const char *path, const filelock_params_t *p) +{ + bool locked, existed; + int fd = -1; + int attempts = 0, restarts = 0; + filelock_t *f; + pid_t ourpid = getpid(); + + g_assert(path != NULL); + +restart: + locked = FALSE; + existed = FALSE; + + if (restarts++) { + fd_forget_and_close(&fd); + if (restarts >= FILELOCK_MAX_RESTARTS) { + if (filelock_is_debug(p)) { + s_debug("%s(): too many restarts for \"%s\"", G_STRFUNC, path); + } + goto failed; + } + filelock_usleep(p, G_STRFUNC); + } + + g_assert_log(-1 == fd, + "%s(): fd=%d, restarts=%d", G_STRFUNC, fd, restarts); + +reopen: + fd = open(path, O_RDWR | O_CREAT | O_EXCL, FILELOCK_MODE); + if (fd < 0) { + if (EEXIST == errno) { + fd = open(path, O_RDWR); + if (fd < 0) { + /* Hit a race condition, retry */ + if (ENOENT == errno && attempts++ < FILELOCK_MAX_OPENS) { + filelock_usleep(p, G_STRFUNC); + goto reopen; + } + /* FALL THROUGH -- unexpected error */ + } else { + existed = TRUE; + goto opened; + } + } + s_warning("%s(): can't open nor create \"%s\": %m", G_STRFUNC, path); + return NULL; + } + +opened: + if (filelock_is_debug(p)) { + s_debug("%s(): %s \"%s\"", + G_STRFUNC, existed ? "opened" : "created", path); + } + +/* FIXME: These might be enums, a compile-time check would be better */ +#if defined(F_SETLK) && defined(F_WRLCK) + if (!filelock_is_pid_only(p)) { + struct flock fl; + bool locking_failed; + + ZERO(&fl); + fl.l_type = F_WRLCK; + fl.l_whence = SEEK_SET; + /* l_start and l_len are zero, which means the whole file is locked */ + + locking_failed = -1 == fcntl(fd, F_SETLK, &fl); + + if (filelock_is_debug(p)) { + s_debug("%s(): fcntl-locking \"%s\" %s", + G_STRFUNC, path, locking_failed ? "failed" : "succeeded"); + } + + if (locking_failed) { + int saved_errno = errno; + + if (!filelock_is_check_only(p) || filelock_is_debug(p)) { + /* + * Use F_GETLK to determine the PID of the process, the + * reinitialization of "fl" might be unnecessary but who + * knows. + */ + + ZERO(&fl); + fl.l_type = F_WRLCK; + fl.l_whence = SEEK_SET; + + if (filelock_is_debug(p)) { + s_warning("%s(): fcntl(%d, F_SETLK, ...) failed " + "for \"%s\": %m", + G_STRFUNC, fd, path); + } + + /* + * If we're crashing and restarting automatically, we'll have + * the same PID as the lock and that is OK. + */ + + if (-1 != fcntl(fd, F_GETLK, &fl)) { + if (ourpid == fl.l_pid) { + if (filelock_is_debug(p)) { + s_debug("%s(): lock already owned (PID=%lu)", + G_STRFUNC, (ulong) fl.l_pid); + } + locked = TRUE; + } else { + if (filelock_is_debug(p)) { + s_debug("%s(): file \"%s\" is locked by PID=%lu", + G_STRFUNC, path, (ulong) fl.l_pid); + } + } + } else { + s_warning("%s(): fcntl(%d, F_GETLK, ...) failed " + "for \"%s\": %m", + G_STRFUNC, fd, path); + } + } + + if (is_temporary_error(saved_errno) || EACCES == saved_errno) { + goto failed; /* The file seems to be locked */ + } + } else { + locked = TRUE; + } + } +#else /* !F_SETLK || !F_WRLCK */ + if (!filelock_is_pid_only(p)) { + s_carp_once("%s(): no fcntl() locking available, using PID-file only", + G_STRFUNC); + } +#endif /* F_SETLK && F_WRLCK */ + + /* + * Maybe F_SETLK is not supported by the OS or filesystem? + * Fall back to weaker PID locking + * + * When we release the lock after writing the PID, we cannot assume + * we got the lock -- we just got exclusive access to the file to + * be able to write our PID without races! + */ + + if (!locked || filelock_is_fd_unlock(p)) { + pid_t pid; + filestat_t buf_fd, buf_path; + + /* + * If the lockfile did not exist, we have it because we managed to + * create the file atomically (O_CREAT | O_EXCL). + */ + + if (!existed) { + if (filelock_is_debug(p)) { + s_debug("%s(): created \"%s\" atomically, taking lock!", + G_STRFUNC, path); + } + goto locked; + } + + /* Check the PID in the file */ + + if (filelock_is_debug(p)) { + s_debug("%s(): reading \"%s\" for PID", G_STRFUNC, path); + } + + pid = filelock_read_pid(fd); + + /* If the pidfile seems to be corrupted, ignore it */ + + if (pid != 0) { + bool valid_owner; + + if (filelock_is_debug(p)) { + s_debug("%s(): checking whether PID %lu is %s", + G_STRFUNC, (ulong) pid, + filelock_is_system(p) ? "alive" : "from current user"); + } + + valid_owner = filelock_is_system(p) ? + compat_process_exists(pid) : (0 == compat_kill_zero(pid)); + + if (valid_owner) { + if (ourpid == pid) { + if (filelock_is_debug(p)) { + s_debug("%s(): it is our PID!", G_STRFUNC); + } + goto locked; /* It's our PID, we have the lock */ + } + if (!filelock_is_check_only(p)) { + s_warning("%s(): file \"%s\" already used by PID=%lu", + G_STRFUNC, path, (ulong) pid); + } + goto failed; + } else if (filelock_is_debug(p)) { + s_debug("%s(): PID %lu is %s", G_STRFUNC, (ulong) pid, + filelock_is_system(p) ? "dead" : "not from current user"); + } + } + + /* If the pidfile is locked, we got our lock anyway */ + + if (locked) { + if (filelock_is_debug(p)) { + s_debug("%s(): got right to lock since we fcntl()-locked file", + G_STRFUNC); + } + goto locked; /* We'll write our PID in the lockfile */ + } + + /* + * File did exist, with no valid / alive PID found. + * + * We're going to check that the file we have opened still exists + * on the disk, and that it is identical. If not, then we are in + * the middle of a race condition and it's best to bail out. + */ + + if (!file_exists(path)) { + if (filelock_is_debug(p)) { + s_debug("%s(): file \"%s\" now gone, found race condition #1", + G_STRFUNC, path); + } + goto failed; + } + + if (-1 == fstat(fd, &buf_fd)) { + s_warning("%s(): fstat(%d) failed for \"%s\": %m", + G_STRFUNC, fd, path); + goto failed; + } + + /* + * If there was no PID in the file and it is "recent", we may be + * facing a race condition whereby another process created the file + * but did not have time yet to write its PID. Restart from the + * beginning! + */ + + if (delta_time(tm_time_exact(), buf_fd.st_mtime) < FILELOCK_MAX_AGE) { + if (filelock_is_debug(p)) { + time_delta_t age = delta_time(tm_time(), buf_fd.st_mtime); + s_debug("%s(): file \"%s\" recent: %d sec%s old, retrying...", + G_STRFUNC, path, (int) age, plural(age)); + } + goto restart; + } + + filelock_usleep(p, G_STRFUNC); /* Let the race begin */ + + if (-1 == stat(path, &buf_path)) { + if (filelock_is_debug(p)) { + s_debug("%s(): file \"%s\" now gone, found race condition #2", + G_STRFUNC, path); + } + goto failed; + } + + if ( + buf_path.st_dev != buf_fd.st_dev || + buf_path.st_ino != buf_fd.st_ino || + buf_path.st_mtime != buf_fd.st_mtime + ) { + if (filelock_is_debug(p)) { + s_debug("%s(): file \"%s\" changed, found race condition #3", + G_STRFUNC, path); + } + goto failed; + } + + /* + * When was the file last changed? If it's "old enough", more than a + * few seconds, then it's probably stale: close it, unlink it and + * restart from the beginning after waiting for some random time. + */ + + if (delta_time(tm_time_exact(), buf_fd.st_mtime) > FILELOCK_MAX_AGE) { + if (filelock_is_debug(p)) { + time_delta_t age = delta_time(tm_time(), buf_fd.st_mtime); + s_debug("%s(): file \"%s\" is %d sec%s old, retrying...", + G_STRFUNC, path, (int) age, plural(age)); + } + if (-1 == unlink(path)) { + if (ENOENT == errno) { + if (filelock_is_debug(p)) { + s_debug("%s(): file \"%s\" gone, in race condition #4", + G_STRFUNC, path); + } + goto failed; + } + s_warning("%s(): cannot unlink \"%s\": %m", G_STRFUNC, path); + goto failed; + } + + goto restart; + } + + /* FALL THROUGH -- assume file was locked */ + } + +locked: + + if (filelock_is_debug(p)) { + s_debug("%s(): file \"%s\" LOCKED (%s mode)", + G_STRFUNC, path, filelock_is_check_only(p) ? "check" : + (locked || !existed) ? "permanent" : "hopeful"); + } + + if (filelock_is_check_only(p)) { + fd_forget_and_close(&fd); + if (-1 == unlink(path)) { + s_warning("%s(): cannot unlink \"%s\": %m", G_STRFUNC, path); + } + errno = ESTALE; /* Lock could be taken */ + return NULL; + } + + /* + * Take ownership of the file by writing our PID + */ + + if (-1 == filelock_write_pid(fd, ourpid)) { + s_warning("%s(): cannot write our PID %lu into \"%s\": %m", + G_STRFUNC, (ulong) ourpid, path); + goto failed; + } + + /* + * If we do not have a kernel lock on the file, be extra safe if we were + * not able to atomically create the file: wait a little bit and re-check + * that the file is still there and contains our PID. + */ + + if (!locked && existed) { + int lfd; + pid_t pid; + + filelock_usleep(p, G_STRFUNC); /* Let the race continue */ + lfd = open(path, O_RDONLY); + + if (-1 == lfd) { + if (filelock_is_debug(p)) { + s_debug("%s(): cannot reopen \"%s\", in race condition #5: %m", + G_STRFUNC, path); + } + goto failed; + } + + pid = filelock_read_pid(lfd); + fd_close(&lfd); + + if (ourpid != pid) { + if (filelock_is_debug(p)) { + s_debug("%s(): foreign PID %ld in \"%s\", in race condition #6", + G_STRFUNC, (ulong) pid, path); + } + goto failed; + } + } + + /* + * We obtained the lock. + * + * We use our malloc() layer here on purpose, because the locks can be + * disposed of very late when auto-cleaning triggers. + */ + + once_flag_run(&filelock_inited, filelock_init_once); + + if (filelock_is_pid_only(p) || filelock_is_fd_unlock(p)) + fd_forget_and_close(&fd); + + XMALLOC0(f); + f->magic = FILELOCK_MAGIC; + f->noclean = booleanize(filelock_is_noclean(p)); + f->fd = fd; + f->pid = ourpid; + f->path = xstrdup(path); + + if (!f->noclean) + filelock_vars_add(f); + + return f; + +failed: + + if (filelock_is_debug(p)) { + s_debug("%s(): file \"%s\" NOT LOCKED", G_STRFUNC, path); + } + fd_forget_and_close(&fd); + errno = EEXIST; + return NULL; +} + +/** + * Convenience routine to extract the PID written in a lock file. + * + * @param path the lock file to check + * + * @return the PID contained in the file, 0 if we could not read it. + */ +pid_t +filelock_pid(const char *path) +{ + int fd; + pid_t pid; + + if (-1 == (fd = open(path, O_RDONLY))) + return 0; + + pid = filelock_read_pid(fd); + fd_close(&fd); + + return pid; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/filelock.h
Added
@@ -0,0 +1,61 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * File locks. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#ifndef _filelock_h_ +#define _filelock_h_ + +typedef struct filelock filelock_t; + +/** + * Filelock parameters (options). + */ +typedef struct filelock_params { + bool debug; /**< Whether to trace decisions, for debugging */ + bool system; /**< Competing with system-wide processes */ + bool noclean; /**< Do not register lock for autoclean at exit() */ + bool pid_only; /**< Don't attempt fcntl() locking, use a PID file */ + bool check_only; /**< Check whether lock is taken (EEXIST / ESTALE) */ + bool fd_unlock; /**< Whether to fcntl(F_UNLCK) lock file once taken */ +} filelock_params_t; + +/* + * Interface routines. + */ + +filelock_t *filelock_create(const char *path, const filelock_params_t *p); +void filelock_free_null(filelock_t **fl_ptr); +pid_t filelock_pid(const char *path); + +#endif /* _filelock_h_ */ + +/* vi: set ts=4: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/filename.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/filename.c
Changed
@@ -39,11 +39,12 @@ #include "filename.h" #include "ascii.h" #include "concat.h" -#include "glib-missing.h" -#include "random.h" +#include "glib-missing.h" /* For g_strlcat() with glib 1.x */ +#include "halloc.h" #include "path.h" +#include "random.h" +#include "str.h" #include "utf8.h" -#include "halloc.h" #include "if/core/guid.h" @@ -64,7 +65,7 @@ g_assert(filename); g_assert(buf); - + /* Try to preserve the filename extension */ ext = strrchr(filename, '.'); if (ext) { @@ -95,10 +96,10 @@ static char * unique_pathname(const char *path, const char *filename, - gboolean (*name_is_uniq)(const char *pathname)) + bool (*name_is_uniq)(const char *pathname)) { char *pathname; - + if (!name_is_uniq) { name_is_uniq = path_does_not_exist; } @@ -109,7 +110,7 @@ return pathname; } -static inline gboolean +static inline bool filename_is_evil_char(int c) { /** @@ -139,7 +140,7 @@ return FALSE; } -static gboolean +static bool filename_is_reserved(const char *filename) { const char *endptr; @@ -166,7 +167,7 @@ (endptr = is_strcaseprefix(filename, "prn")) )) return FALSE; - + switch (*endptr) { case '\0': return TRUE; @@ -174,7 +175,7 @@ /* con.txt is reserved con.blah.txt isn't */ return NULL == strchr(&endptr1, '.'); case '1': case '2': case '3': case '4': case '5': case '6': case '7': - case '8': case '9': + case '8': case '9': /* lpt0, com0 are not reserved */ endptr++; switch (*endptr) { @@ -204,7 +205,7 @@ * if it was a valid filename already. */ char * -filename_sanitize(const char *filename, gboolean no_spaces, gboolean no_evil) +filename_sanitize(const char *filename, bool no_spaces, bool no_evil) { const char *p; const char *s; @@ -228,24 +229,44 @@ q = NULL; } - /* Replace shell meta characters and likely problematic characters */ + /* + * Replace shell meta characters and likely problematic characters. + * + * Although parentheses are not evil per se, they make it a pain to + * copy-n-paste filenames without going through the shell's auto- + * completion (which normally does the necessary escaping). + * + * To keep things "readable", we replace parentheses with brackets. + * Although brackets are meaningful for the shells, they are only + * interpreted in the presence of "*" or "?", two characters that we + * strip already. + * --RAM, 2013-11-03 + */ { size_t i; - guchar c; - + uchar c; + for (i = 0; '\0' != (c = si); i++) { if ( c < 32 || is_ascii_cntrl(c) || G_DIR_SEPARATOR == c - || '/' == c + || '/' == c || (0 == i && ('.' == c || '-' == c)) || (no_spaces && is_ascii_space(c)) || (no_evil && filename_is_evil_char(c)) - ) { + ) { if (!q) q = h_strdup(s); qi = '_'; /* replace undesired char with underscore */ + } else if ('(' == c) { + if (!q) + q = h_strdup(s); + qi = ''; + } else if (')' == c) { + if (!q) + q = h_strdup(s); + qi = ''; } } @@ -288,7 +309,7 @@ { const char *s; char *q; - guchar c; + uchar c; size_t len; size_t j = 0; static const char punct = "_-+=.,<>{}"; /* 1st MUST be '_' */ @@ -302,7 +323,7 @@ q = halloc(len + 1); /* Trailing NUL */ while ((c = *s++)) { - guchar d; + uchar d; /* Beautified filename cannot start with stripped characters */ if (j == 0) { @@ -345,7 +366,7 @@ */ if (NULL == strchr(q, '.') && j < len && '.' == filenamelen - j) { - char *r = h_strconcat(empty, ".", q, (void *) 0); + char *r = h_strconcat(empty, ".", q, NULL_PTR); HFREE_NULL(q); return r; @@ -392,7 +413,7 @@ */ char * filename_unique(const char *path, const char *name, const char *ext, - gboolean (*name_is_uniq)(const char *pathname)) + bool (*name_is_uniq)(const char *pathname)) { char filename_bufFILENAME_MAXBYTES; char name_bufFILENAME_MAXBYTES; @@ -446,7 +467,7 @@ mid_len = utf8_truncate(mid, mid_buf, mid_len + 1); name_len = utf8_truncate(name, name_buf, name_len + 1); - gm_snprintf(filename_buf, sizeof filename_buf, "%s%s%s", + str_bprintf(filename_buf, sizeof filename_buf, "%s%s%s", name_buf, mid_buf, ext_buf); pathname = unique_pathname(path, filename_buf, name_is_uniq); @@ -468,7 +489,7 @@ name_len = utf8_truncate(name, name_buf, name_len + 1); for (i = 0; i < 100; i++) { - gm_snprintf(filename_buf, sizeof filename_buf, "%s.%02u%s%s", + str_bprintf(filename_buf, sizeof filename_buf, "%s.%02u%s%s", name_buf, i, mid_buf, ext_buf); pathname = unique_pathname(path, filename_buf, name_is_uniq); @@ -487,7 +508,7 @@ name_len = utf8_truncate(name, name_buf, name_len + 1); for (i = 0; i < 100; i++) { - gm_snprintf(filename_buf, sizeof filename_buf, "%s.%x%s%s", + str_bprintf(filename_buf, sizeof filename_buf, "%s.%x%s%s", name_buf, (unsigned) random_u32(), mid_buf, ext_buf); pathname = unique_pathname(path, filename_buf, name_is_uniq); @@ -511,7 +532,7 @@ struct guid guid; guid_random_fill(&guid); - gm_snprintf(filename_buf, sizeof filename_buf, "%s.%s%s%s", + str_bprintf(filename_buf, sizeof filename_buf, "%s.%s%s%s", name_buf, guid_hex_str(&guid), mid_buf, ext_buf); } @@ -523,7 +544,7 @@ * This may also be the result of permission problems or inode * exhaustion. */ - g_warning("no luck with random number generator"); + g_warning("%s(): no luck with random number generator", G_STRFUNC); finish: return pathname;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/filename.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/filename.h
Changed
@@ -38,12 +38,12 @@ #define _filename_h_ char *filename_sanitize(const char *filename, - gboolean no_spaces, gboolean no_evil); + bool no_spaces, bool no_evil); char *filename_beautify(const char *filename); size_t filename_shrink(const char *filename, char *buf, size_t size); char *filename_unique(const char *path, const char *file, const char *ext, - gboolean (*name_is_uniq)(const char *pathname)); + bool (*name_is_uniq)(const char *pathname)); #endif /* _filename_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/float-test.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/float-test.c
Changed
@@ -42,6 +42,7 @@ #include "common.h" #include "float.h" +#include "progname.h" /* locally defined functions */ static void read_floats(FILE *f); @@ -77,7 +78,7 @@ for (n = nfloats, fp = floats; n > 0; n--) { char s; int e, h, l; - + if (bytein(f) != fasl_flonum) { fprintf(stderr, "non-flonum in list\n"); exit(3); @@ -122,7 +123,7 @@ shift = 0; e = 0; eneg = 0; - + state0: c = *s++; if (c == 0) goto done; @@ -165,7 +166,7 @@ goto state2; } else IERROR(2); - + state3: /* Seen 0*.0*1-90-9* */ c = *s++; if (c == 0) goto done; @@ -187,7 +188,7 @@ } if (c == 0) goto done; else IERROR(4); - + done: for (; count > 0; count--) *buf++ = '0'; *buf = 0; @@ -201,7 +202,7 @@ int main (int argc, char **argv) { FILE *f; - mingw_early_init(); + progstart(argc, argv); if (argc != 3) USAGE_ERROR; @@ -220,7 +221,7 @@ int n; double *fp; char s32; - + for (n = nfloats, fp = floats; n > 0; n--) { sprintf(s,"%.17g", *fp++); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/float.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/float.c
Changed
@@ -1,6 +1,6 @@ /* - * Copyright (c) 1996, Robert G. Burger - * Copyright (c) 2011, Raphael Manfredi + * Copyright (c) 1996 Robert G. Burger + * Copyright (c) 2011, 2013 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -51,13 +51,14 @@ * Floating point formatting. * * @author Raphael Manfredi - * @date 2011 + * @date 2011, 2013 * @author Robert G. Burger * @date 1996 */ #include "common.h" #include "float.h" +#include "once.h" #include "unsigned.h" #include "override.h" /* Must be the last header included */ @@ -83,34 +84,14 @@ #define m1mask 0xf #define hidden_bit 0x100000 -/* Little-Endian IEEE Double Floats */ -struct dblflt_le { - unsigned int m4: 16; - unsigned int m3: 16; - unsigned int m2: 16; - unsigned int m1: 4; - unsigned int e: 11; - unsigned int s: 1; -}; - -/* Big-Endian IEEE Double Floats */ -struct dblflt_be { - unsigned int s: 1; - unsigned int e: 11; - unsigned int m1: 4; - unsigned int m2: 16; - unsigned int m3: 16; - unsigned int m4: 16; -}; - #define BIGSIZE 24 #define MIN_E -1074 #define MAX_FIVE 325 -#define B_P1 ((guint64)1 << 52) +#define B_P1 ((uint64) 1 << 52) typedef struct { int l; - guint64 dBIGSIZE; + uint64 dBIGSIZE; } bignum_t; /* @@ -123,40 +104,17 @@ * keep the context static but have a set of context elements indexed by a * global recursion variable. * --RAM, 2011-11-06 + * + * Finally went with big context on the stack to make the float formatting + * routines thread-safe, without having to funnel code execution. + * --RAM, 2013-01-11 */ -#define FLOAT_RECURSION 3 /**< Maximum recursion levels allowed */ - -static struct float_context { - bignum_t c_R, c_S, c_MM; - bignum_t c_S2, c_S3, c_S4, c_S5, c_S6, c_S7, c_S8, c_S9; - int c_s_n, c_qr_shift; - /* For float_dragon() */ - bignum_t c_MP; -} float_contextFLOAT_RECURSION; - static bignum_t fiveMAX_FIVE; -static int recursion_level = -1; -static gboolean float_inited; -static gboolean float_little_endian; - -#define R float_contextrecursion_level.c_R -#define S float_contextrecursion_level.c_S -#define MM float_contextrecursion_level.c_MM -#define S2 float_contextrecursion_level.c_S2 -#define S3 float_contextrecursion_level.c_S3 -#define S4 float_contextrecursion_level.c_S4 -#define S5 float_contextrecursion_level.c_S5 -#define S6 float_contextrecursion_level.c_S6 -#define S7 float_contextrecursion_level.c_S7 -#define S8 float_contextrecursion_level.c_S8 -#define S9 float_contextrecursion_level.c_S9 -#define s_n float_contextrecursion_level.c_s_n -#define qr_shift float_contextrecursion_level.c_qr_shift -#define MP float_contextrecursion_level.c_MP +static once_flag_t float_inited; #define ADD(x, y, z, k) {\ - guint64 x_add, z_add;\ + uint64 x_add, z_add;\ x_add = (x);\ if ((k))\ z_add = x_add + (y) + 1, (k) = (z_add <= x_add);\ @@ -166,7 +124,7 @@ } #define SUB(x, y, z, b) {\ - guint64 x_sub, y_sub;\ + uint64 x_sub, y_sub;\ x_sub = (x); y_sub = (y);\ if ((b))\ (z) = x_sub - y_sub - 1, b = (y_sub >= x_sub);\ @@ -175,7 +133,7 @@ } #define MUL(x, y, z, k) {\ - guint64 x_mul, low, high;\ + uint64 x_mul, low, high;\ x_mul = (x);\ low = (x_mul & 0xffffffff) * (y) + (k);\ high = (x_mul >> 32) * (y) + (low >> 32);\ @@ -184,7 +142,7 @@ } #define SLL(x, y, z, k) {\ - guint64 x_sll = (x);\ + uint64 x_sll = (x);\ (z) = (x_sll << (y)) | (k);\ (k) = x_sll >> (64 - (y));\ } @@ -194,14 +152,14 @@ print_big(bignum_t *x) { int i; - guint64 *p; + uint64 *p; printf("#x"); i = x->l; safety_assert(i < BIGSIZE); p = &x->di; for (p = &x->di; i >= 0; i--) { - guint64 b = *p--; + uint64 b = *p--; printf("%08x%08x", (int)(b >> 32), (int)(b & 0xffffffff)); } } @@ -211,7 +169,7 @@ mul10(bignum_t *x) { int i, l; - guint64 *p, k; + uint64 *p, k; safety_assert(x->l < BIGSIZE); safety_assert(x->l >= 0); @@ -229,11 +187,11 @@ } static void -big_short_mul(bignum_t *x, guint64 y, bignum_t *z) +big_short_mul(bignum_t *x, uint64 y, bignum_t *z) { int i, xl, zl; - guint64 *xp, *zp, k; - guint32 high, low; + uint64 *xp, *zp, k; + uint32 high, low; safety_assert(x->l < BIGSIZE); safety_assert(x->l >= 0); @@ -245,7 +203,7 @@ high = y >> 32; low = y & 0xffffffff; for (i = xl, k = 0; i >= 0; i--, xp++, zp++) { - guint64 xlow, xhigh, z0, t, c, z1; + uint64 xlow, xhigh, z0, t, c, z1; xlow = *xp & 0xffffffff; xhigh = *xp >> 32; z0 = (xlow * low) + k; /* Cout is (z0 < k) */ @@ -282,7 +240,7 @@ one_shift_left(int y, bignum_t *z) { int n, m, i; - guint64 *zp; + uint64 *zp; n = y / 64; m = y % 64; @@ -290,7 +248,7 @@ zp = &z->d0; for (i = n; i > 0; i--) *zp++ = 0; - *zp = (guint64)1 << m; + *zp = (uint64)1 << m; z->l = n; safety_assert(z->l >= 0); @@ -298,10 +256,10 @@ } static void -short_shift_left(guint64 x, int y, bignum_t *z) +short_shift_left(uint64 x, int y, bignum_t *z) { int n, m, i, zl; - guint64 *zp; + uint64 *zp; n = y / 64; m = y % 64; @@ -313,7 +271,7 @@ if (m == 0) { *zp = x; } else { - guint64 high = x >> (64 - m); + uint64 high = x >> (64 - m); *zp = x << m; if (high != 0) *++zp = high, zl++; @@ -328,7 +286,7 @@ big_shift_left(bignum_t *x, int y, bignum_t *z) { int n, m, i, xl, zl; - guint64 *xp, *zp, k; + uint64 *xp, *zp, k; n = y / 64; m = y % 64; @@ -359,7 +317,7 @@ big_comp(bignum_t *x, bignum_t *y) { int i, xl, yl; - guint64 *xp, *yp; + uint64 *xp, *yp; safety_assert(x->l < BIGSIZE); safety_assert(x->l >= 0); @@ -375,8 +333,8 @@ xp = &x->dxl; yp = &y->dxl; for (i = xl; i >= 0; i--, xp--, yp--) { - guint64 a = *xp; - guint64 b = *yp; + uint64 a = *xp; + uint64 b = *yp; if (a > b) return 1; else if (a < b) return -1; @@ -388,7 +346,7 @@ sub_big(bignum_t *x, bignum_t *y, bignum_t *z) { int xl, yl, zl, b, i; - guint64 *xp, *yp, *zp; + uint64 *xp, *yp, *zp; safety_assert(x->l < BIGSIZE); safety_assert(x->l >= 0); @@ -406,7 +364,7 @@ for (i = yl, b = 0; i >= 0; i--) SUB(*xp++, *yp++, *zp++, b); for (i = xl-yl; b && i > 0; i--) { - guint64 x_sub; + uint64 x_sub; x_sub = *xp++; *zp++ = x_sub - 1; b = (x_sub == 0); @@ -430,7 +388,7 @@ add_big(bignum_t *x, bignum_t *y, bignum_t *z) { int xl, yl, k, i; - guint64 *xp, *yp, *zp; + uint64 *xp, *yp, *zp; safety_assert(x->l < BIGSIZE); safety_assert(x->l >= 0); @@ -453,7 +411,7 @@ for (i = yl, k = 0; i >= 0; i--) ADD(*xp++, *yp++, *zp++, k); for (i = xl-yl; k && i > 0; i--) { - guint64 z_add; + uint64 z_add; z_add = *xp++ + 1; k = (z_add == 0); *zp++ = z_add; @@ -469,86 +427,67 @@ } static int -qr(void) +float_qr(bignum_t *r, bignum_t *s, + bignum_t *s2, bignum_t *s3, bignum_t *s4, bignum_t *s5, + bignum_t *s6, bignum_t *s7, bignum_t *s8, bignum_t *s9) { - if (big_comp(&R, &S5) < 0) { - if (big_comp(&R, &S2) < 0) { - if (big_comp(&R, &S) < 0) { + if (big_comp(r, s5) < 0) { + if (big_comp(r, s2) < 0) { + if (big_comp(r, s) < 0) { return 0; } else { - sub_big(&R, &S, &R); + sub_big(r, s, r); return 1; } - } else if (big_comp(&R, &S3) < 0) { - sub_big(&R, &S2, &R); + } else if (big_comp(r, s3) < 0) { + sub_big(r, s2, r); return 2; - } else if (big_comp(&R, &S4) < 0) { - sub_big(&R, &S3, &R); + } else if (big_comp(r, s4) < 0) { + sub_big(r, s3, r); return 3; } else { - sub_big(&R, &S4, &R); + sub_big(r, s4, r); return 4; } - } else if (big_comp(&R, &S7) < 0) { - if (big_comp(&R, &S6) < 0) { - sub_big(&R, &S5, &R); + } else if (big_comp(r, s7) < 0) { + if (big_comp(r, s6) < 0) { + sub_big(r, s5, r); return 5; } else { - sub_big(&R, &S6, &R); + sub_big(r, s6, r); return 6; } - } else if (big_comp(&R, &S9) < 0) { - if (big_comp(&R, &S8) < 0) { - sub_big(&R, &S7, &R); + } else if (big_comp(r, s9) < 0) { + if (big_comp(r, s8) < 0) { + sub_big(r, s7, r); return 7; } else { - sub_big(&R, &S8, &R); + sub_big(r, s8, r); return 8; } } else { - sub_big(&R, &S9, &R); + sub_big(r, s9, r); return 9; } } /** - * Initialized floating point formatting constants. + * Initialize floating point formatting constants. * - * This routine will be called as needed the first time the API is - * used but is made public to allow setting a baseline when doing - * timing measurements. + * This routine will be called once, as needed the first time the API is used. */ -G_GNUC_COLD void -float_init(void) +static void G_COLD +float_init_once(void) { int n, i, l; bignum_t *b; - guint64 *xp, *zp, k; + uint64 *xp, *zp, k; /* - * Determine dynamically whether floats are stored as - * little- or big-endian. This will only impose negligeable - * overhead to the formatting. - * --RAM, 2011-11-06 + * No need to grab mutex: if called externally, we're in tests and so + * we know we are single-threaded. */ - { - double v = 4.0; - struct dblflt_le *le; - struct dblflt_be *be; - - le = (struct dblflt_le *) &v; - be = (struct dblflt_be *) &v; - - if (0 == le->s && 1025 == le->e) { - float_little_endian = TRUE; - } else if (0 == be->s && 1025 == be->e) { - float_little_endian = FALSE; - } else { - g_error("your double values are not stored in IEEE format"); - } - } - five0.l = l = 0; five0.d0 = 5; for (n = MAX_FIVE-1, b = &five0; n > 0; n--) { @@ -565,61 +504,63 @@ #ifdef FLOAT_DEBUG for (n = 1, b = &five0; n <= MAX_FIVE; n++) { + bignum_t R; big_shift_left(b++, n, &R); print_big(&R); putchar('\n'); } fflush(0); #endif /* FLOAT_DEBUG */ +} - float_inited = TRUE; +/** + * Initialize floating point formatting constants. + * + * This routine is made public to allow setting a baseline when doing + * timing measurements. + */ +void G_COLD +float_init(void) +{ + ONCE_FLAG_RUN(float_inited, float_init_once); } static int -add_cmp(int use_mp) +add_cmp(bignum_t *b, bignum_t *r, bignum_t *s) { int rl, ml, sl, suml; - static bignum_t sum; + bignum_t sum; - rl = R.l; - ml = (use_mp ? MP.l : MM.l); - sl = S.l; + rl = r->l; + ml = b->l; + sl = s->l; suml = rl >= ml ? rl : ml; - if ((sl > suml+1) || ((sl == suml+1) && (S.dsl > 1))) return -1; + if ((sl > suml+1) || ((sl == suml+1) && (s->dsl > 1))) return -1; if (sl < suml) return 1; - add_big(&R, (use_mp ? &MP : &MM), &sum); - return big_comp(&sum, &S); + add_big(r, b, &sum); + return big_comp(&sum, s); } -static guint64 +static uint64 float_decompose(double v, int *sign, int *ep) { - guint64 f; + uint64 f; int e; + union double_decomposition dc; - STATIC_ASSERT(sizeof v == sizeof(struct dblflt_le)); - STATIC_ASSERT(sizeof(struct dblflt_le) == sizeof(struct dblflt_be)); + STATIC_ASSERT(sizeof v == sizeof(dc.d)); /* decompose float into sign, mantissa & exponent */ - if (float_little_endian) { - struct dblflt_le *x = (struct dblflt_le *)&v; - *sign = x->s; - e = x->e; - f = (guint64)(x->m1 << 16 | x->m2) << 32 | - (guint32)(x->m3 << 16 | x->m4); - } else { - struct dblflt_be *x = (struct dblflt_be *)&v; - *sign = x->s; - e = x->e; - f = (guint64)(x->m1 << 16 | x->m2) << 32 | - (guint32)(x->m3 << 16 | x->m4); - } + dc.value = v; + *sign = dc.d.s; + e = dc.d.e; + f = ((uint64) dc.d.mh << 32) | (uint32) dc.d.ml; if (e != 0) { *ep = e - bias - bitstoright; - f |= (guint64)hidden_bit << 32; + f |= (uint64) hidden_bit << 32; } else if (f != 0) { /* denormalized */ *ep = 1 - bias - bitstoright; @@ -672,19 +613,18 @@ size_t float_dragon(char *dest, size_t len, double v, int *exponent) { - int sign, e, f_n, m_n, i, d, tc1, tc2; - guint64 f; + int sign, e = 0, f_n, s_n, m_n, i, d, tc1, tc2, qr_shift; + uint64 f; int ruf, k, sl = 0, slr = 0; int use_mp; char *bp = dest; size_t remain = len; + bignum_t MP, MM, R, S; + bignum_t S2, S3, S4, S5, S6, S7, S8, S9; - if G_UNLIKELY(!float_inited) + if G_UNLIKELY(!ONCE_DONE(float_inited)) float_init(); - recursion_level++; - g_assert(recursion_level < FLOAT_RECURSION); - /* decompose float into sign, mantissa & exponent */ f = float_decompose(v, &sign, &e); @@ -703,9 +643,9 @@ k = estimate(e+52); } else { int n; - guint64 y; + uint64 y; - for (n = e+52, y = (guint64)1 << 52; f < y; n--) + for (n = e+52, y = (uint64)1 << 52; f < y; n--) y >>= 1; k = estimate(n); } @@ -721,7 +661,7 @@ else use_mp = 1, f_n = 2, s_n = 2-e, m_n = 0; } - + /* Scale it! */ if (k == 0) { short_shift_left(f, f_n, &R); @@ -734,7 +674,7 @@ s_n += k; if (m_n >= s_n) f_n -= s_n, m_n -= s_n, s_n = 0; - else + else f_n -= m_n, s_n -= m_n, m_n = 0; short_shift_left(f, f_n, &R); big_shift_left(&fivek-1, s_n, &S); @@ -756,7 +696,7 @@ } /* fixup */ - if (add_cmp(use_mp) <= -ruf) { + if (add_cmp(use_mp ? &MP : &MM, &R, &S) <= -ruf) { k--; mul10(&R); mul10(&MM); @@ -773,7 +713,7 @@ putchar('\n'); fflush(0); #endif /* FLOAT_DEBUG */ - + if (qr_shift) { sl = s_n / 64; slr = s_n % 64; @@ -794,30 +734,30 @@ if (R.l < sl) { d = 0; } else if (R.l == sl) { - guint64 *p; + uint64 *p; p = &R.dsl; d = *p >> slr; - *p &= ((guint64)1 << slr) - 1; + *p &= ((uint64)1 << slr) - 1; for (i = sl; (i > 0) && (*p == 0); i--) p--; R.l = i; } else { - guint64 *p; + uint64 *p; p = &R.dsl+1; d = *p << (64 - slr) | *(p-1) >> slr; p--; - *p &= ((guint64)1 << slr) - 1; + *p &= ((uint64)1 << slr) - 1; for (i = sl; (i > 0) && (*p == 0); i--) p--; R.l = i; } } else { /* We need to do quotient-remainder */ - d = qr(); + d = float_qr(&R, &S, &S2, &S3, &S4, &S5, &S6, &S7, &S8, &S9); } tc1 = big_comp(&R, &MM) < ruf; - tc2 = add_cmp(use_mp) > -ruf; + tc2 = add_cmp(use_mp ? &MP : &MM, &R, &S) > -ruf; if (!tc1) { if (!tc2) { mul10(&R); @@ -850,9 +790,6 @@ "ptr_diff=%zu, len=%zu, remain=%zu, len-remain=%zu", ptr_diff(bp, dest), len, remain, len - remain); - recursion_level--; - g_assert(recursion_level >= -1); - return ptr_diff(bp, dest); } @@ -878,24 +815,23 @@ size_t float_fixed(char *dest, size_t len, double v, int prec, int *exponent) { - int sign, e, f_n, i, d, n; - guint64 f; + int sign, e = 0, f_n, s_n, i, d, n, qr_shift; + uint64 f; int k, sl = 0, slr = 0; char *bp = dest; size_t remain = len; size_t flen; + bignum_t MM, R, S; + bignum_t S2, S3, S4, S5, S6, S7, S8, S9; g_assert(dest != NULL); g_assert(exponent != NULL); g_assert(size_is_positive(len)); g_assert(prec >= 0); - if G_UNLIKELY(!float_inited) + if G_UNLIKELY(!ONCE_DONE(float_inited)) float_init(); - recursion_level++; - g_assert(recursion_level < FLOAT_RECURSION); - /* decompose float into sign, mantissa & exponent */ f = float_decompose(v, &sign, &e); @@ -915,9 +851,9 @@ if (e > MIN_E) { k = estimate(e+52); } else { - guint64 y; + uint64 y; - for (n = e+52, y = (guint64)1 << 52; f < y; n--) y >>= 1; + for (n = e+52, y = (uint64)1 << 52; f < y; n--) y >>= 1; k = estimate(n); } @@ -935,7 +871,7 @@ s_n += k; if (f_n >= s_n) f_n -= s_n, s_n = 0; - else + else s_n -= f_n, f_n = 0; short_shift_left(f, f_n, &R); big_shift_left(&fivek-1, s_n, &S); @@ -974,28 +910,31 @@ if (R.l < sl) { d = 0; } else if (R.l == sl) { - guint64 *p; + uint64 *p; p = &R.dsl; d = *p >> slr; - *p &= ((guint64)1 << slr) - 1; + *p &= ((uint64)1 << slr) - 1; for (i = sl; (i > 0) && (*p == 0); i--) p--; R.l = i; } else { - guint64 *p; + uint64 *p; p = &R.dsl+1; - d = *p << (64 - slr) | *(p-1) >> slr; + if G_UNLIKELY(0 == slr) + d = *(p-1); + else + d = *p << (64 - slr) | *(p-1) >> slr; p--; - *p &= ((guint64)1 << slr) - 1; + *p &= ((uint64)1 << slr) - 1; for (i = sl; (i > 0) && (*p == 0); i--) p--; R.l = i; } } else { /* We need to do quotient-remainder */ - d = qr(); + d = float_qr(&R, &S, &S2, &S3, &S4, &S5, &S6, &S7, &S8, &S9); } PUTINC_CHAR(d + '0'); @@ -1045,9 +984,6 @@ g_assert(size_is_positive(flen)); g_assert(flen <= len); - recursion_level--; - g_assert(recursion_level >= -1); - return flen; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/float.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/float.h
Changed
@@ -34,9 +34,76 @@ #ifndef _float_h_ #define _float_h_ +#include "common.h" /* If not already done, we need it */ + #define float_radix 2.147483648e9 /* + * Definition of structures allowing to decompose doubles and floats. + * + * Note that the exponent is biased (+1023) and that the mantissa has a + * hidden "1" bit when the exponent (in the float representation) is not zero. + * + * Here are representation examples for double values: + * + * 1.0 (s=0, e=1023, mh=0, ml=0) + * 0.5 (s=0, e=1022, mh=0, ml=0) + * 0.25 (s=0, e=1021, mh=0, ml=0) + * 1/2**n (s=0, e=1023-n, mh=0, ml=0) + * 0.75 (s=0, e=1022, mh=0x80000, ml=0) + * -0.5 (s=1, e=1022, mh=0, ml=0) + */ + +#if IS_LITTLE_ENDIAN_FLOAT +struct double_ieee754 { + /* Little-Endian IEEE Double Floats */ + unsigned int ml: 32; /**< Mantissa, low */ + unsigned int mh: 20; /**< Mantissa, high */ + unsigned int e: 11; /**< Exponent (biased) */ + unsigned int s: 1; /**< Sign */ +}; +struct float_ieee754 { + /* Little-Endian IEEE Floats */ + unsigned int m: 23; /**< Mantissa */ + unsigned int e: 8; /**< Exponent (biased) */ + unsigned int s: 1; /**< Sign */ +}; +#elif IS_BIG_ENDIAN_FLOAT +struct double_ieee754 { + /* Big-Endian IEEE Double Floats */ + unsigned int s: 1; /**< Sign */ + unsigned int e: 11; /**< Exponent (biased) */ + unsigned int mh: 20; /**< Mantissa, high */ + unsigned int ml: 32; /**< Mantissa, low */ +}; +struct float_ieee754 { + /* Big-Endian IEEE Floats */ + unsigned int s: 1; /**< Sign */ + unsigned int e: 8; /**< Exponent (biased) */ + unsigned int m: 23; /**< Mantissa */ +}; +#else +#error "unknown float endianness -- not IEEE 754?" +#endif + +/* + * Unions allowing portable decomposition of floats and doubles. + * + * One can set the value and read from the decomposition, or set the + * decomposition and read back the value from the union. + */ + +union double_decomposition { + double value; /* Double value */ + struct double_ieee754 d; /* Decomposition of double value */ +}; + +union float_decomposition { + float value; /* Float value */ + struct float_ieee754 f; /* Decomposition of float value */ +}; + +/* * Public interface. */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/fragcheck.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/fragcheck.c
Changed
@@ -32,15 +32,15 @@ */ #include "common.h" -#include "lib/fragcheck.h" +#include "fragcheck.h" #ifdef FRAGCHECK -#include "lib/glib-missing.h" -#include "lib/bit_array.h" -#include "lib/misc.h" +#include "glib-missing.h" +#include "bit_array.h" +#include "misc.h" -#include "lib/override.h" /* Must be the last header included */ +#include "override.h" /* Must be the last header included */ #if HAS_GCC(3, 0) #define FRAGCHECK_TRACK_CALLERS @@ -101,7 +101,7 @@ bit_array_t touchedBIT_ARRAY_SIZE(BIT_COUNT); } vars; -static inline guint32 +static inline uint32 fragcheck_meta_hash(const void *p) { size_t x = (size_t) p; @@ -131,7 +131,7 @@ static struct fragcheck_meta * fragcheck_meta_lookup(const void *p) { - guint32 i, slot = fragcheck_meta_hash(p); + uint32 i, slot = fragcheck_meta_hash(p); for (i = 0; i < MAX_ALLOC_NUM; i++) { size_t x = slot * 2; @@ -155,7 +155,7 @@ RUNTIME_ASSERT(meta); { size_t x, slot; - + slot = meta - &vars.meta_tab0; x = slot * 2; bit_array_clear(vars.meta_index, x); /* free slot */ @@ -165,7 +165,7 @@ } } -static gpointer +static void * my_malloc(gsize n) { struct fragcheck_meta *meta; @@ -174,7 +174,7 @@ n = round_size(sizeof (union alloc), n); p = malloc(n); -#ifdef FRAGCHECK_VERBOSE +#ifdef FRAGCHECK_VERBOSE printf("%s(%lu)=0x%08lx\n", __func__, (unsigned long) n, (unsigned long) p); #endif /* FRAGCHECK_VERBOSE */ @@ -214,7 +214,7 @@ } } #endif /* FRAGCHECK_TRACK_CALLERS */ - + { size_t from, to; @@ -224,7 +224,7 @@ RUNTIME_ASSERT(from < BIT_COUNT); RUNTIME_ASSERT(to <= BIT_COUNT); RUNTIME_ASSERT(to >= from); - + RUNTIME_ASSERT(!bit_array_get(vars.allocated, from)); RUNTIME_ASSERT(!bit_array_get(vars.allocated, to)); bit_array_set_range(vars.allocated, from, to); @@ -235,9 +235,9 @@ } static void -my_free(gpointer p) +my_free(void *p) { -#ifdef FRAGCHECK_VERBOSE +#ifdef FRAGCHECK_VERBOSE printf("%s(%p)\n", __func__, p); #endif /* FRAGCHECK_VERBOSE */ @@ -273,16 +273,16 @@ } } -static gpointer -my_realloc(gpointer p, gsize n) +static void * +my_realloc(void *p, gsize n) { - static volatile gboolean lock; - gpointer x; + static volatile bool lock; + void *x; RUNTIME_ASSERT(!lock); lock = TRUE; -#ifdef FRAGCHECK_VERBOSE +#ifdef FRAGCHECK_VERBOSE printf("%s(%p, %lu)\n", __func__, p, (unsigned long) n); #endif /* FRAGCHECK_VERBOSE */ @@ -306,7 +306,7 @@ } void -alloc_dump(FILE *f, gboolean unused_flag) +alloc_dump(FILE *f, bool unused_flag) { size_t i, base_i = 0; int cur = -1; @@ -347,7 +347,7 @@ } void -alloc_dump2(FILE *f, gboolean unused_flag) +alloc_dump2(FILE *f, bool unused_flag) { size_t i; @@ -365,7 +365,7 @@ #ifdef FRAGCHECK_TRACK_CALLERS { unsigned j; - + fputs(" callers:", f); for (j = FC_RET_0; j < NUM_FC_RET; j++) { fprintf(f, " 0x%08lx", (unsigned long) meta->retj); @@ -390,6 +390,10 @@ putenv(variable); +#undef malloc +#undef realloc +#undef free + vtable.malloc = my_malloc; vtable.realloc = my_realloc; vtable.free = my_free;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/fragcheck.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/fragcheck.h
Changed
@@ -40,8 +40,8 @@ #if defined(FRAGCHECK) void fragcheck_init(void); -void alloc_dump(FILE *f, gboolean unused_flag); -void alloc_dump2(FILE *unused_f, gboolean unused_flag); +void alloc_dump(FILE *f, bool unused_flag); +void alloc_dump2(FILE *unused_f, bool unused_flag); #define alloc_reset(a, b) alloc_dump2((a), (b)) #endif /* FRAGCHECK */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/frand.c
Added
@@ -0,0 +1,196 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Random value file persistency. + * + * This layer provides utilities to read / write random seeds. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#include "frand.h" + +#include "file.h" +#include "random.h" + +#include "override.h" /* Must be the last header included */ + +/** + * Use specified random filler to create a file full of random bytes. + * + * @param path pathname where random data should be generated + * @param rfn random number buffer-filling routine to use + * @param len amount of random bytes to generate + * + * @return the amount of bytes generated if OK, a short count or -1 on error, + * with errno set. + */ +ssize_t +frand_save(const char *path, randfill_fn_t rfn, size_t len) +{ + char buf256; + int fd; + ssize_t written = 0; + + fd = file_create(path, O_WRONLY, S_IRUSR | S_IWUSR); + + if (-1 == fd) + return -1; + + while (len != 0) { + size_t n = MIN(len, sizeof buf); + ssize_t w; + + (*rfn)(buf, n); + w = write(fd, buf, n); + if (-1 == w) + break; + written += w; + if (UNSIGNED(w) != n) + break; + len -= n; + } + + ZERO(buf); /* Leave no memory trail */ + close(fd); + return written; +} + +/** + * Use specified random filler to merge randomness into existing file content. + * + * @param path pathname where random data should be merged + * @param rfn random number buffer-filling routine to use + * @param len amount of random bytes to generate + * + * @return the amount of bytes generated if OK, a short count or -1 on error, + * with errno set. + */ +ssize_t +frand_merge(const char *path, randfill_fn_t rfn, size_t len) +{ + char buf256, data256; + int fd; + ssize_t written = 0; + fileoffset_t pos = 0; + + fd = file_create(path, O_RDWR, S_IRUSR | S_IWUSR); + + if (-1 == fd) + return -1; + + STATIC_ASSERT(N_ITEMS(buf) == N_ITEMS(data)); + STATIC_ASSERT(N_ITEMS(buf) == sizeof buf); + + while (len != 0) { + size_t i, n = MIN(len, sizeof buf); + ssize_t r, w; + + (*rfn)(buf, n); + r = read(fd, data, n); + if (-1 == r) + break; + for (i = 0; i < n; i++) + bufi ^= datai; + r = lseek(fd, pos, SEEK_SET); + if (-1 == r) + break; + w = write(fd, buf, n); + if (-1 == w) + break; + written += w; + if (UNSIGNED(w) != n) + break; + len -= n; + pos += n; + } + + ZERO(buf); /* Leave no memory trail */ + close(fd); + return written; +} + +/** + * Grab random data from file and feed them to the specified routine. + * + * @param path pathname where random data are expected + * @param rfd random filling routine to feed data + * @param len amount of random bytes to read + * + * @return the amount of bytes fed if OK, a short count or -1 on error, + * with errno set. + */ +ssize_t +frand_restore(const char *path, feed_fn_t rfd, size_t len) +{ + char buf256; + int fd; + ssize_t bytes_read = 0; + + fd = file_open_missing(path, O_RDONLY); + + if (-1 == fd) + return -1; + + while (len != 0) { + size_t n = MIN(len, sizeof buf); + ssize_t r; + + r = read(fd, buf, n); + if (-1 == r) + break; + bytes_read += r; + (*rfd)(buf, r); + if (UNSIGNED(r) != n) + break; + len -= n; + } + + ZERO(buf); /* Leave no memory trail */ + close(fd); + return bytes_read; +} + +/** + * Clear the leading bytes of specified file. + * + * @param path pathname where random data are stored + * @param len amount of leading bytes to clear + * + * @return the amount of bytes cleared if OK, a short count or -1 on error, + * with errno set. + */ +ssize_t +frand_clear(const char *path, size_t len) +{ + return frand_save(path, random_strong_bytes, len); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/frand.h
Added
@@ -0,0 +1,48 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Random value file persistency. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#ifndef _frand_h_ +#define _frand_h_ + +/* + * Public interface. + */ + +ssize_t frand_save(const char *path, randfill_fn_t rfn, size_t len); +ssize_t frand_merge(const char *path, randfill_fn_t rfn, size_t len); +ssize_t frand_restore(const char *path, feed_fn_t rfd, size_t len); +ssize_t frand_clear(const char *path, size_t len); + +#endif /* _frand_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/fs_free_space.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/fs_free_space.c
Changed
@@ -33,30 +33,11 @@ #include "common.h" -/* - * NOTE: The following header files pull in definition of ST_* macros - * which are conflicting with identifiers in the GUI code. Therefore, - * these are only included here. - */ -#if defined(HAS_STATVFS) - -#if defined(I_SYS_STATVFS) -#include <sys/statvfs.h> -#endif - -#elif defined(HAS_STATFS) - -#ifdef I_SYS_VFS -#include <sys/vfs.h> -#endif -#ifdef I_SYS_MOUNT -#include <sys/mount.h> -#endif - -#endif /* HAS_STATFS */ - #include "fs_free_space.h" +#include "compat_statvfs.h" +#include "log.h" + #include "override.h" /* Must be the last header included */ struct fs_info { @@ -68,56 +49,21 @@ * Get information about the filesystem mounted under the given directory * by filling the fs_info structure. */ -static void +static int get_fs_info(const char *path, struct fs_info *fsi) { - filesize_t free_space = MAX_INT_VAL(filesize_t); - filesize_t total_space = MAX_INT_VAL(filesize_t); + struct statvfs buf; - g_assert(path); - g_assert(fsi); + g_assert(path != NULL); + g_assert(fsi != NULL); - (void) path; + if (-1 == compat_statvfs(path, &buf)) + return -1; -#if defined(HAS_STATVFS) - { - /* statvfs() is a POSIX.1-2001 system call */ - struct statvfs buf; + fsi->free_space = ((filesize_t) 0 + buf.f_bavail) * buf.f_bsize; + fsi->total_space = ((filesize_t) 0 + buf.f_blocks) * buf.f_frsize; - if (-1 == statvfs(path, &buf)) { - g_warning("statvfs(\"%s\") failed: %m", path); - } else { - free_space = ((filesize_t) 0 + buf.f_bavail) * buf.f_bsize; - total_space = ((filesize_t) 0 + buf.f_blocks) * buf.f_frsize; - } - } -#elif defined(HAS_STATFS) - { - /* statfs() is deprecated but older systems may not have statvfs() */ - struct statfs buf; - - if (-1 == statfs(path, &buf)) { - g_warning("statfs(\"%s\") failed: %m", path); - } else { - free_space = ((filesize_t) 0 + buf.f_bavail) * buf.f_bsize; - total_space = ((filesize_t) 0 + buf.f_blocks) * buf.f_bsize; - } - } -#elif defined(MINGW32) - { - struct mingw_statvfs buf; - - if (-1 == mingw_statvfs(path, &buf)) { - g_warning("statvfs(\"%s\") failed: %m", path); - } else { - free_space = ((filesize_t) 0 + buf.f_cavail) * buf.f_csize; - total_space = ((filesize_t) 0 + buf.f_clusters) * buf.f_csize; - } - } -#endif /* HAS_STATVFS || HAS_STATFS || MINGW32 */ - - fsi->free_space = free_space; - fsi->total_space = total_space; + return 0; } /** @@ -129,7 +75,10 @@ { struct fs_info buf; - get_fs_info(path, &buf); + if (-1 == get_fs_info(path, &buf)) { + s_warning("%s(): cannot statvfs(\"%s\"): %m", G_STRFUNC, path); + return 0; + } return buf.free_space; } @@ -137,13 +86,17 @@ /** * Return the free space available currently in the filesystem mounted * under the given directory in percentage of the total space. + * + * This routine is used for entropy collection, therefore we are totally + * silent on failures. */ double fs_free_space_pct(const char *path) { struct fs_info buf; - get_fs_info(path, &buf); + if (-1 == get_fs_info(path, &buf)) + return 0.0; if (buf.total_space == 0 || buf.total_space < buf.free_space) return 100.0; /* Something is wrong */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/ftw-mktree
Added
@@ -0,0 +1,29 @@ +#!/bin/sh +# Create a test tree for ftw-test + +ROOT=ftw-root + +if test -d $ROOT; then + chmod -R a+rX $ROOT 2>/dev/null + chmod a+x $ROOT/c + rm -rf $ROOT +fi + +case "$1" in +-r) exit 0;; +esac + +for dir in a b c d; do + mkdir -p $ROOT/$dir + for file in 1 2 3; do + touch $ROOT/$dir/$dir$file + ls -l $ROOT/$dir > $ROOT/$dir/ls + done +done + +chmod a-x $ROOT/c +chmod a-r $ROOT/b +cd $ROOT/a +ln -s .. bar +ln -s ../d/d1 . +mknod foo p 2>/dev/null || mkfifo foo
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/ftw-root.out
Added
@@ -0,0 +1,85 @@ +launch(): starting traversal of "ftw-root" + calling sortpath(data) + flags FTW_O_DEPTH | FTW_O_ENTRY | FTW_O_MOUNT | FTW_O_PHYS | FTW_O_ALL +launch(): traversal of "ftw-root" done, result=0 +sorted_tree(): tree has 20 items +printpath(): level=2, fbase = a1 2 + flags = FTW_F_FILE + fpath = ftw-root/a/a1 13 + rpath = a/a1 4 +printpath(): level=2, fbase = a2 2 + flags = FTW_F_FILE + fpath = ftw-root/a/a2 13 + rpath = a/a2 4 +printpath(): level=2, fbase = a3 2 + flags = FTW_F_FILE + fpath = ftw-root/a/a3 13 + rpath = a/a3 4 +printpath(): level=2, fbase = bar 3 + flags = FTW_F_SYMLINK + fpath = ftw-root/a/bar 14 + rpath = a/bar 5 +printpath(): level=2, fbase = d1 2 + flags = FTW_F_SYMLINK + fpath = ftw-root/a/d1 13 + rpath = a/d1 4 +printpath(): level=2, fbase = foo 3 + flags = FTW_F_OTHER + fpath = ftw-root/a/foo 14 + rpath = a/foo 5 +printpath(): level=2, fbase = ls 2 + flags = FTW_F_FILE + fpath = ftw-root/a/ls 13 + rpath = a/ls 4 +printpath(): level=1, fbase = a 1 + flags = FTW_F_DIR + fpath = ftw-root/a 10 + rpath = a 1 +printpath(): level=1, fbase = b 1 + flags = FTW_F_DIR | FTW_F_NOREAD + fpath = ftw-root/b 10 + rpath = b 1 +printpath(): level=2, fbase = c1 2 + flags = FTW_F_FILE | FTW_F_NOSTAT + fpath = ftw-root/c/c1 13 + rpath = c/c1 4 +printpath(): level=2, fbase = c2 2 + flags = FTW_F_FILE | FTW_F_NOSTAT + fpath = ftw-root/c/c2 13 + rpath = c/c2 4 +printpath(): level=2, fbase = c3 2 + flags = FTW_F_FILE | FTW_F_NOSTAT + fpath = ftw-root/c/c3 13 + rpath = c/c3 4 +printpath(): level=2, fbase = ls 2 + flags = FTW_F_FILE | FTW_F_NOSTAT + fpath = ftw-root/c/ls 13 + rpath = c/ls 4 +printpath(): level=1, fbase = c 1 + flags = FTW_F_DIR + fpath = ftw-root/c 10 + rpath = c 1 +printpath(): level=2, fbase = d1 2 + flags = FTW_F_FILE + fpath = ftw-root/d/d1 13 + rpath = d/d1 4 +printpath(): level=2, fbase = d2 2 + flags = FTW_F_FILE + fpath = ftw-root/d/d2 13 + rpath = d/d2 4 +printpath(): level=2, fbase = d3 2 + flags = FTW_F_FILE + fpath = ftw-root/d/d3 13 + rpath = d/d3 4 +printpath(): level=2, fbase = ls 2 + flags = FTW_F_FILE + fpath = ftw-root/d/ls 13 + rpath = d/ls 4 +printpath(): level=1, fbase = d 1 + flags = FTW_F_DIR + fpath = ftw-root/d 10 + rpath = d 1 +printpath(): level=0, fbase = ftw-root 8 + flags = FTW_F_DIR + fpath = ftw-root 8 + rpath = 0
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/ftw-test.c
Added
@@ -0,0 +1,392 @@ +/* + * ftw-test -- file tree walker unit tests. + * + * Copyright (c) 2015 Raphael Manfredi <Raphael_Manfredi@pobox.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the authors nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "common.h" + +#include "etree.h" +#include "ftw.h" +#include "halloc.h" +#include "hset.h" +#include "misc.h" +#include "progname.h" +#include "stacktrace.h" +#include "str.h" +#include "stringify.h" +#include "strtok.h" +#include "walloc.h" + +static void G_NORETURN +usage(void) +{ + fprintf(stderr, + "Usage: %s -hls rootdir\n" + " -z fn1,fn2...\n" + " -h : prints this help message\n" + " -l : show file length (size)\n" + " -s : dumps sorted file tree\n" + " -z : zap (suppress) messages from listed routines\n" + , getprogname()); + exit(EXIT_FAILURE); +} + +static hset_t *zap; +static bool show_length = FALSE; + +static void +zap_record(const char *value) +{ + strtok_t *s; + const char *tok; + + zap = hset_create(HASH_KEY_STRING, 0); + s = strtok_make_strip(value); + + while ((tok = strtok_next(s, ","))) { + hset_insert(zap, h_strdup(tok)); + } + + strtok_free_null(&s); +} + +static void +emitv(bool nl, const char *fmt, va_list args) +{ + str_t *s = str_new(512); + + str_vprintf(s, fmt, args); + fputs(str_2c(s), stdout); + if (nl) + fputc('\n', stdout); + fflush(stdout); + + str_destroy_null(&s); +} + +static void G_PRINTF(1, 2) +emit(const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + emitv(TRUE, fmt, args); + va_end(args); +} + +static void G_PRINTF(2, 3) +emit_zap(const char *caller, const char *fmt, ...) +{ + va_list args; + + if (zap != NULL && hset_contains(zap, caller)) + return; /* Zap messages from this caller */ + + va_start(args, fmt); + emitv(TRUE, fmt, args); + va_end(args); +} + +#define emitz(fmt, ...) emit_zap(G_STRFUNC, (fmt), __VA_ARGS__) + +struct flags { + const char *name; + uint32 value; +}; + +#define FLAG(x) { #x, x } + +struct flags ftwflagv = { + FLAG(FTW_O_CHDIR), + FLAG(FTW_O_DEPTH), + FLAG(FTW_O_ENTRY), + FLAG(FTW_O_MOUNT), + FLAG(FTW_O_PHYS), + FLAG(FTW_O_ALL), + FLAG(FTW_O_SILENT), +}; + +struct flags cbflagv = { + FLAG(FTW_F_FILE), + FLAG(FTW_F_DIR), + FLAG(FTW_F_OTHER), + FLAG(FTW_F_NOREAD), + FLAG(FTW_F_NOSTAT), + FLAG(FTW_F_DONE), + FLAG(FTW_F_SYMLINK), + FLAG(FTW_F_DANGLING), +}; + +#undef FLAG + +static void +strflags(str_t *s, uint32 flags, struct flags *descv, size_t nv) +{ + size_t i; + + str_reset(s); + + for (i = 0; i < nv; i++) { + if (flags & descvi.value) { + if (0 != str_len(s)) + STR_CAT(s, " | "); + str_cat(s, descvi.name); + } + } +} + +static const char * +ftwflags(uint32 flags) +{ + static str_t *s; + + if (NULL == s) + s = str_new(0); + + strflags(s, flags, ftwflagv, N_ITEMS(ftwflagv)); + return str_2c(s); +} + +static const char * +cbflags(uint32 flags) +{ + static str_t *s; + + if (NULL == s) + s = str_new(0); + + strflags(s, flags, cbflagv, N_ITEMS(cbflagv)); + return str_2c(s); +} + +static ftw_status_t +printpath(const ftw_info_t *info, const filestat_t *sb, void *data) +{ + (void) data; + + emitz("%s(): level=%d, fbase = %s %d", G_STRFUNC, info->level, + info->fbase, info->fbase_len); + emitz("\tflags = %s", cbflags(info->flags)); + emitz("\tfpath = %s %d", info->fpath, info->fpath_len); + emitz("\trpath = %s %d", info->rpath, info->rpath_len); + if (show_length) + emitz("\tsize = %zu", (size_t) sb->st_size); + + return FTW_STATUS_OK; +} + +static void +launch(const char *rootdir, uint32 flags, ftw_fn_t cb, void *data) +{ + ftw_status_t res; + + emit("%s(): starting traversal of \"%s\"", G_STRFUNC, rootdir); + emitz("\tcalling %s(%s)", + stacktrace_function_name(cb), NULL == data ? "NULL" : "data"); + emitz("\tflags %s", ftwflags(flags)); + + res = ftw_foreach(rootdir, flags, 0, cb, data); + + emitz("%s(): traversal of \"%s\" done, result=%d", G_STRFUNC, rootdir, res); +} + +enum filenode_magic { FILENODE_MAGIC = 0x75c1aadb }; + +typedef struct filenode { + enum filenode_magic magic; + ftw_info_t info; + filestat_t sb; + node_t node; +} filenode_t; + +static inline void +filenode_check(const struct filenode * const fn) +{ + g_assert(fn != NULL); + g_assert(FILENODE_MAGIC == fn->magic); +} + +static int +filenode_cmp(const void *a, const void *b) +{ + const filenode_t *fa = a, *fb = b; + + filenode_check(fa); + filenode_check(fb); + + return strcmp(fa->info.fbase, fb->info.fbase); +} + +static filenode_t * +filenode_alloc(const ftw_info_t *info, const filestat_t *sb) +{ + filenode_t *fn; + + WALLOC0(fn); + fn->magic = FILENODE_MAGIC; + fn->info = *info; + fn->sb = *sb; + + fn->info.fpath = h_strdup(info->fpath); + fn->info.fbase = fn->info.fpath + info->base; + fn->info.rpath = fn->info.fpath + info->root; + + return fn; +} + +static void +filenode_free(void *data) +{ + filenode_t *fn = data; + + filenode_check(fn); + + hfree((void *) fn->info.fpath); + fn->magic = 0; + WFREE(fn); +} + +static void +filenode_print(void *data, void *udata) +{ + filenode_t *fn = data; + const ftw_info_t *info = &fn->info; + const filestat_t *sb = &fn->sb; + + filenode_check(fn); + + printpath(info, sb, udata); +} + +struct sorted_context { + etree_t *tree; + filenode_t *cur; +}; + +static ftw_status_t +sortpath(const ftw_info_t *info, const filestat_t *sb, void *data) +{ + struct sorted_context *ctx = data; + + if (0 == info->level) { + if (0 == (FTW_F_DONE & info->flags)) { + g_assert(NULL == ctx->cur); + ctx->cur = filenode_alloc(info, sb); + etree_set_root(ctx->tree, ctx->cur); + } + } else { + if (FTW_F_DONE & info->flags) { + ctx->cur = etree_parent(ctx->tree, ctx->cur); + if (NULL != ctx->cur) + filenode_check(ctx->cur); + } else { + filenode_t *fn = filenode_alloc(info, sb); + filenode_check(ctx->cur); + etree_prepend_child(ctx->tree, ctx->cur, fn); + if (FTW_F_DIR == (info->flags & (FTW_F_DIR | FTW_F_NOREAD))) + ctx->cur = fn; /* Will only process readable directory */ + } + } + + return FTW_STATUS_OK; +} + +static void +sorted_tree(const char *rootdir, uint32 flags) +{ + struct sorted_context ctx; + etree_t tree; + + ZERO(&ctx); + ctx.tree = &tree; + + etree_init(&tree, FALSE, offsetof(filenode_t, node)); + launch(rootdir, flags, sortpath, &ctx); + + emitz("%s(): tree has %zu item%s", + G_STRFUNC, etree_count(&tree), plural(etree_count(&tree))); + + etree_sort(&tree, filenode_cmp); + etree_foreach(&tree, filenode_print, NULL); + etree_free(&tree, filenode_free); +} + +int +main(int argc, char **argv) +{ + extern int optind; + extern char *optarg; + const char options = "hlsz:"; + bool sorted = FALSE; + const char *rootdir; + int c; + const uint32 ftw_flags = + FTW_O_PHYS | FTW_O_ALL | FTW_O_MOUNT | FTW_O_DEPTH | FTW_O_ENTRY; + + progstart(argc, argv); + thread_set_main(TRUE); /* We're the main thread, we can block */ + stacktrace_init(argv0, FALSE); + + misc_init(); + + while ((c = getopt(argc, argv, options)) != EOF) { + switch (c) { + case 'l': /* show file length */ + show_length = TRUE; + break; + case 's': /* sort the filesystem tree before dumping */ + sorted = TRUE; + break; + case 'z': /* zap message from routines using emitz() */ + zap_record(optarg); + break; + case 'h': /* show help */ + default: + usage(); + break; + } + } + + if ((argc -= optind) != 1) + usage(); + + argv += optind; + rootdir = argv0; + + if (sorted) { + sorted_tree(rootdir, ftw_flags); + } else { + launch(rootdir, ftw_flags, printpath, NULL); + } + + return 0; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/ftw.c
Added
@@ -0,0 +1,1488 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * File tree walk. + * + * The interface was inspired by the specifications of the standard nftw() + * C library interface, with a few adjustments to allow the callback to + * get an externally-supplied opaque data argument and get more readable + * callback flags, whilst keeping the amount of callback arguments reasonable. + * + * The initial aim was to implement the functionality to get it under Windows, + * since the nftw() routine is not available within the MinGW environment. + * It was never a goal to be a drop-in replacement for nftw(), rather an + * alternative, on which the application can be based regardless of the + * actual platform. + * + * The nice thing about engineering your own wheel is that you can then + * customize it and go beyond its original specifications... + * + * @author Raphael Manfredi + * @date 2015 + */ + +#include "common.h" + +#include "ftw.h" + +#include "erbtree.h" +#include "eslist.h" +#include "fd.h" +#include "halloc.h" +#include "log.h" +#include "misc.h" /* For dir_entry_mode() */ +#include "path.h" +#include "stacktrace.h" +#include "str.h" +#include "thread.h" /* For thread_stack_check() */ +#include "walloc.h" + +#include "override.h" /* Must be the last header included */ + +enum ftw_ctx_magic { FTW_CTX_MAGIC = 0x39cba316 }; + +/** + * Context used when recursing. + */ +struct ftw_ctx { + enum ftw_ctx_magic magic; /* Magic number */ + int nfd; /* Maximum file descriptors we can use */ + int odirs; /* Opened dirs */ + int callfd; /* Descriptor of caller's current dir */ + uint32 flags; /* Flags for ftw_foreach() */ + int rootlen; /* Length of spath for root directory */ + int base; /* Offset of file basename in spath */ + int level; /* Filesystem depth (0 for root dir) */ + dev_t rootdev; /* Device of root dir, for FTW_O_MOUNT */ + char *calldir; /* In case we need to chdir back there */ + char *rootdir; /* To safely escape from symlinked dirs */ + ftw_fn_t cb; /* Callback to invoke */ + void *udata; /* Opaque user-supplied argument */ + str_t spath; /* Dynamic string to build path info */ + ftw_info_t info; /* Informational context passed to user */ + erbtree_t entries; /* Seen entries, if no FTW_O_PHYS */ +}; + +static inline void +ftw_ctx_check(const struct ftw_ctx * const fx) +{ + g_assert(fx != NULL); + g_assert(FTW_CTX_MAGIC == fx->magic); +} + +/** + * An entry in the filesystem. + * + * It is necessary to keep track of the visited entries when traversing + * without FTW_O_PHYS since symbolic links could create loops and we need + * to ensure we're only visiting each entry once. + */ +struct ftw_entry { + dev_t dev; /* Device */ + ino_t ino; /* Inode number */ + rbnode_t node; /* Embedded red-black node */ +}; + +enum ftw_dir_magic { FTW_DIR_MAGIC = 0x0d63ab62 }; + +/** + * A directory descriptor. + * + * These structures live on the stack and represent a directory we are + * processing as part of the recursive traversal. + * + * When we have enough file descriptors, the ``dp'' descriptor points to + * an opened directory. If NULL, then the descriptor had to be closed, + * in which case ``listing'' contains a list of all the directory entries + * we have yet to process. + * + * The ftw_readdir() routine uses these descriptors to fill in ftw_dirent + * structures much like readdir() fills in dirent ones. This completely + * hides whether the physical directory is still opened or whether its content + * was already read and is being processed instead. + * + * The ftw_opendir() routine creates the descriptor and ftw_closedir() will + * perform the necessary cleanup. + */ +struct ftw_dir { + enum ftw_dir_magic magic; /* Magic number */ + int fd; /* dirfd(dp), or -1 if no dirfd() */ + DIR *dp; /* If non-NULL, opened directory */ + struct ftw_dir *parent; /* Parent directory, NULL if at root */ + eslist_t listing; /* Content */ + size_t count; /* Amount of listing entries to process */ +}; + +static inline void +ftw_dir_check(const struct ftw_dir * const dp) +{ + g_assert(dp != NULL); + g_assert(FTW_DIR_MAGIC == dp->magic); +} + +/** + * A directory listing entry that we saved. + */ +struct ftw_dirent { + char *d_name; /* Filename -- walloc()'ed */ + ino_t d_ino; /* Inode number */ + uint16 d_namelen; /* Filename length -- strlen(d_name) */ + mode_t d_mode; /* File type, 0 means unknown */ + slink_t lnk; /* Embedded list */ +}; + +static ftw_status_t ftw_process_dir( + struct ftw_ctx *fx, filestat_t *sb, struct ftw_dir *pdir, bool is_link); + +/** + * Comparison routine for the filesystem entries we insert in the tree. + */ +static int +ftw_entry_cmp(const void *a, const void *b) +{ + const struct ftw_entry *fa = a, *fb = b; + int c; + + c = CMP(fa->ino, fb->ino); + + if G_UNLIKELY(0 == c) + c = CMP(fa->dev, fb->dev); + + return c; +} + +/** + * Allocate a filesystem entry. + */ +static struct ftw_entry * +ftw_entry_alloc(dev_t dev, ino_t ino) +{ + struct ftw_entry *fe; + + WALLOC0(fe); + fe->dev = dev; + fe->ino = ino; + + return fe; +} + +/** + * Free filesystem entry. + */ +static void +ftw_entry_free(void *p) +{ + struct ftw_entry *fe = p; + + WFREE(fe); +} + +/** + * Get the current working directory. + * + * @return the directory in a newly halloc()'ed string, NULL on error. + */ +static char * +ftw_getcwd(void) +{ + char *dir; + + dir = halloc(MAX_PATH_LEN); + + if (NULL == getcwd(dir, MAX_PATH_LEN)) { + HFREE_NULL(dir); + } else { + dir = hrealloc(dir, 1 + strlen(dir)); + } + + return dir; +} + +/** + * Read all the content of the directory stream that we have still not yet + * processed and close its stream. + * + * @param fx the tree walker context + * @param dir directory descriptor we need to close + * + * @return 0 if OK, -1 on error with errno set. + */ +static int +ftw_readdir_all(struct ftw_ctx *fx, struct ftw_dir *dir) +{ + struct dirent *entry; + + ftw_ctx_check(fx); + ftw_dir_check(dir); + g_assert(dir->dp != NULL); + g_assert(!eslist_is_initialized(&dir->listing)); + g_assert(fx->odirs > 0); + + eslist_init(&dir->listing, offsetof(struct ftw_dirent, lnk)); + + errno = 0; /* Must disambiguate NULL on end-of-dir and NULL on error */ + + while (NULL != (entry = readdir(dir->dp))) { + uint16 namelen = dir_entry_namelen(entry); + const char *name = dir_entry_filename(entry); + struct ftw_dirent *fde; + + WALLOC0(fde); + fde->d_name = wcopy(name, namelen + 1); /* Include trailing NUL */ + fde->d_namelen = namelen; + fde->d_mode = dir_entry_mode(entry); + fde->d_ino = entry->d_ino; + + eslist_append(&dir->listing, fde); + } + + dir->count = eslist_count(&dir->listing); + + closedir(dir->dp); + dir->dp = NULL; + dir->fd = -1; + fx->odirs--; + + return 0 == errno ? 0 : -1; +} + +/** + * Find a directory among our parents that we could close. + * + * @param fx the tree walker context + * @param dir first directory which we can consider for closing + * + * @return 0 if OK, -1 on error with errno set. + */ +static int +ftw_parent_close(struct ftw_ctx *fx, struct ftw_dir *dir) +{ + struct ftw_dir *d; + int n; + + for (d = dir, n = 1; d != NULL; d = d->parent, n++) { + if (d->dp != NULL) { + if (0 == ftw_readdir_all(fx, d)) + return 0; + + if (0 == (fx->flags & FTW_O_SILENT)) { + ssize_t pos = 0; /* End of path string, due to "--" below */ + int i; + + for (i = n; i != 0; i--) { + pos = str_rchr_at(&fx->spath, '/', --pos); + if (pos <= 0) + break; /* No more '/' found, or reached start */ + } + + if (pos > 0) { + str_t *sub = str_slice(&fx->spath, 0, pos - 1); + s_carp("%s(): cannot fully read \"%s\": %m", + G_STRFUNC, str_2c(sub)); + str_destroy(sub); + } else { + s_carp("%s(): cannot grab %dth parent dir of \"%s\": %m", + G_STRFUNC, n, str_2c(&fx->spath)); + } + } + return -1; + } + } + + return 0; +} + +/** + * Open new directory. + * + * @param fx the tree walker context + * @param dir descriptor to initialize + * @param pdir parent descriptor, NULL if at the top of the tree + * + * @return 0 if OK, -1 on error with errno set. + */ +static int +ftw_opendir(struct ftw_ctx *fx, struct ftw_dir *dir, struct ftw_dir *pdir) +{ + bool retried; + + ftw_ctx_check(fx); + g_assert(fx->odirs <= fx->nfd); + + ZERO(dir); + dir->magic = FTW_DIR_MAGIC; + dir->fd = -1; + dir->parent = pdir; + + /* + * If we have used up all the descriptors we could, we have to close + * the parent directory's stream. + */ + + if G_UNLIKELY(fx->odirs == fx->nfd) { + if (0 != ftw_parent_close(fx, pdir)) + return -1; + } + + g_assert(fx->odirs < fx->nfd); + + /* + * If they have openat() and fdopendir(), we can accelerate things a bit + * by not having the kernel process and validate the full path, as long as + * the parent directory is still opened. + */ + +#if defined(HAS_FDOPENDIR) && defined(HAS_OPENAT) + if (pdir != NULL && is_valid_fd(pdir->fd)) { + int nfd; + int flags = O_RDONLY; + const char *dname = str_2c(&fx->spath) + fx->base; + +#ifdef O_DIRECTORY + flags |= O_DIRECTORY; /* Fail if entry is no longer a directory! */ +#endif + + g_assert('\0' != *dname); + + nfd = openat(pdir->fd, dname, flags); + + /* + * Even though we are below the amount of configured file descriptors + * for our tree walking, the system or the process could hit a limit + * on the amount of files that can be opened. + * + * When that happens, we attempt to close file descriptors still opened + * among our parent directories. + */ + + if G_UNLIKELY(-1 == nfd) { + if (EMFILE == errno || ENFILE == errno) { + if (0 != ftw_parent_close(fx, pdir)) + return -1; + goto use_opendir; /* Parent directory closed */ + } + goto error; + } + + dir->dp = fdopendir(nfd); + if G_UNLIKELY(NULL == dir->dp) { + close(nfd); /* Guess, fdopendir() could leave it dangling */ + goto error; + } + + dir->fd = nfd; /* Necessarily! */ + } + +use_opendir: +#endif /* HAS_FDOPENDIR && HAS_OPENAT */ + + /* + * If they lack one of fdopendir(), openat(), we'll fall through + * here. Otherwise, we have already opened the directory if they had + * an opened parent directory. + */ + + retried = FALSE; + + /* FALL THROUGH */ + +retry: + if (NULL == dir->dp) { + if (fx->flags & FTW_O_CHDIR) { + dir->dp = opendir(str_2c(&fx->spath) + fx->base); + } else { + dir->dp = opendir(str_2c(&fx->spath)); + } + + /* + * Same logic as above: retry once after closing one of the + * descriptors still kept opened in our parent directories should + * we hit an "out of descriptors" error condition. + */ + + if G_UNLIKELY(NULL == dir->dp) { + if (EMFILE == errno || ENFILE == errno) { + if (!retried) { + if (0 != ftw_parent_close(fx, pdir)) + return -1; + retried = TRUE; + goto retry; + } + } + goto error; + } + +#ifdef HAS_DIRFD + dir->fd = dirfd(dir->dp); +#endif /* HAS_DIRFD */ + } + + fx->odirs++; + return 0; + +error: + /* + * The only error our caller expects and can recover from is EACCES, + * therefore do not emit any error message when it happens. + */ + + if (0 == (fx->flags & FTW_O_SILENT) && errno != EACCES) { + s_carp("%s(): cannot opendir(\"%s\"): %m", + G_STRFUNC, str_2c(&fx->spath)); + } + return -1; +} + +/** + * Close directory stream. + */ +static void +ftw_closedir(struct ftw_ctx *fx, struct ftw_dir *dir) +{ + ftw_ctx_check(fx); + ftw_dir_check(dir); + g_assert(fx->odirs <= fx->nfd); + + if (NULL == dir->dp) { + struct ftw_dirent *fde; + + /* Free allocated names */ + ESLIST_FOREACH_DATA(&dir->listing, fde) { + WFREE_NULL(fde->d_name, fde->d_namelen + 1); + } + + /* Discard all the list items in one single call */ + eslist_wfree(&dir->listing, sizeof *fde); + } else { + g_assert(fx->odirs > 0); + closedir(dir->dp); + fx->odirs--; + } + + ZERO(dir); /* Makes whole descriptor invalid */ + dir->fd = -1; +} + +/** + * Change to processed directory. + * + * @param fx the tree walker context + * @param dir the local directory handle + * + * @return 0 if OK, -1 on error with errno set. + */ +static int +ftw_chdir(struct ftw_ctx *fx, struct ftw_dir *dir) +{ + ftw_ctx_check(fx); + ftw_dir_check(dir); + g_assert(dir->dp != NULL); + +#ifdef HAS_FCHDIR + if (is_valid_fd(dir->fd)) + return fchdir(dir->fd); +#endif /* HAS_FCHDIR */ + + return chdir(str_2c(&fx->spath) + fx->base); +} + +/** + * Change to parent directory. + * + * @param fx the tree walker context + * @param pdir the parent directory handle + * @param via_link whether we crossed a symbolic link + * + * @return 0 if OK, -1 on error with errno set, -2 on error with warning. + */ +static int +ftw_chdir_parent(struct ftw_ctx *fx, struct ftw_dir *pdir, bool via_link) +{ + int ret; + + ftw_ctx_check(fx); + ftw_dir_check(pdir); + +#ifdef HAS_FCHDIR + if (is_valid_fd(pdir->fd)) + return fchdir(pdir->fd); +#endif /* HAS_FCHDIR */ + + /* + * If they can follow symbolic links, we must not blindly chdir to ".." + * since it will point to the parent directory of the link and not to the + * parent directory where we want to go, which is the directory where we + * traversed the symbolic link! + */ + + if G_UNLIKELY(via_link) { + char *relpath; + + g_assert(fx->rootdir != NULL); /* Created by ftw_process_dir() */ + + /* + * Reconstruct the relative path to the root directory, where we + * started our tree walk. + */ + + relpath = str_2c(&fx->spath) + fx->rootlen; + + if ('\0' == *relpath) { + ret = chdir(fx->rootdir); + if (0 != ret) { + ret = -2; + s_carp("%s(): unable to chdir() back to %s: %m", + G_STRFUNC, fx->rootdir); + } + } else { + str_t *s = str_new(MAX_PATH_LEN / 2); + + str_printf(s, "%s/%s", fx->rootdir, relpath); + ret = chdir(str_2c(s)); + if (0 != ret) { + ret = -2; + s_carp("%s(): unable to chdir() back to %s: %m", + G_STRFUNC, str_2c(s)); + } + str_destroy_null(&s); + } + } else { + ret = chdir(".."); + } + + return ret; +} + +/** + * Read next directory entry, copying data into the supplied structure. + * + * @param dir the directory handle + * @param entry the entry to fill-in + * + * @return 0 if OK, -1 on error, +1 when we reached the end of the directory. + */ +static int +ftw_readdir(struct ftw_dir *dir, struct ftw_dirent *entry) +{ + ftw_dir_check(dir); + g_assert(entry != NULL); + + if (dir->dp != NULL) { + struct dirent *de; + + errno = 0; /* Disambiguates NULL returns from readdir() */ + de = readdir(dir->dp); + + if (NULL == de) + return 0 == errno ? +1 : -1; + + ZERO(entry); + entry->d_name = deconstify_char(dir_entry_filename(de)); + entry->d_namelen = dir_entry_namelen(de); + entry->d_ino = de->d_ino; + entry->d_mode = dir_entry_mode(de); + } else { + struct ftw_dirent *fde; + + if (0 == dir->count) + return +1; + + /* + * We do not remove processed items from the list for two reasons: + * + * 1. we need to keep around the allocated name since we're copying + * the pointer. + * 2. freeing the list as a whole will be more efficient overall than + * doing it one cell at a time. + * + * Therefore, we have a separate count of unprocessed items. The next + * record is at the head of the list, and it is being moved at the tail + * of the list after processing. + */ + + fde = eslist_head(&dir->listing); + g_assert(fde != NULL); /* Since dir->count was not 0 */ + eslist_rotate_left(&dir->listing); /* Keep record around */ + dir->count--; + + *entry = *fde; /* struct copy */ + } + + return 0; +} + +/** + * Invoke the callback for current entry. + * + * @param fx the tree walker context + * @param sb the stat buffer for the current entry + * @param flags additional flags in addition to the file mode + * + * @return the callback status. + */ +static ftw_status_t +ftw_callback(struct ftw_ctx *fx, filestat_t *sb, uint32 flags) +{ + ftw_ctx_check(fx); + g_assert(sb != NULL); + g_assert(flags != 0); + + /* + * Address of string buffer can change when re-allocated, hence always + * update pointers. Since these are given to "userland", the content of + * the structure could be altered so it's good to always reset it. + */ + + fx->info.fpath = str_2c(&fx->spath); + fx->info.fpath_len = str_len(&fx->spath); + fx->info.fbase = fx->info.fpath + fx->base; + fx->info.fbase_len = fx->info.fpath_len - fx->base; + fx->info.base = fx->base; + fx->info.level = fx->level; + + /* + * Make sure the relative path (empty when we are processing the root + * directory of the tree) does not start with a '/'. + */ + + fx->info.rpath = fx->info.fpath + fx->rootlen; + if ('/' == *fx->info.rpath) + fx->info.rpath++; + fx->info.root = fx->info.rpath - fx->info.fpath; + fx->info.rpath_len = fx->info.fpath_len - fx->info.root; + + fx->info.flags = flags; + fx->info.ftw_flags = fx->flags; + + return (*fx->cb)(&fx->info, sb, fx->udata); +} +/* + * Perform stat() on the entry and compute the callback flags. + * + * @param fx the tree walker context + * @param sb the stat buffer we can use + * @param dir the directory handle + * @param entry the directory entry to process + * @param flags the flags to be filled + * + * @return 0 if we computed suitable flags, -1 on non-recoverable error. + */ +static int +ftw_stat( + struct ftw_ctx *fx, filestat_t *sb, + struct ftw_dir *dir, struct ftw_dirent *entry, uint32 *flags) +{ + int ret; + + ftw_ctx_check(fx); + ftw_dir_check(dir); + g_assert(sb != NULL); + g_assert(entry != NULL); + g_assert(flags != NULL); + +#ifdef HAS_FSTATAT + if (is_valid_fd(dir->fd)) { + ret = fstatat(dir->fd, entry->d_name, sb, + (fx->flags & FTW_O_PHYS) ? AT_SYMLINK_NOFOLLOW : 0); + } else +#endif /* HAS_FSTATAT */ + { + const char *name; + + name = (fx->flags & FTW_O_CHDIR) ? entry->d_name : str_2c(&fx->spath); + ret = (fx->flags & FTW_O_PHYS) ? lstat(name, sb) : stat(name, sb); + } + + if (0 != ret) { + if (errno != EACCES && errno != ENOENT) { + if (0 == (fx->flags & FTW_O_SILENT)) { + s_carp("%s(): cannot stat(\"%s\"): %m", + G_STRFUNC, str_2c(&fx->spath)); + } + return -1; /* Non-recoverable error */ + } + + if (fx->flags & FTW_O_PHYS) + *flags = FTW_F_NOSTAT; + else if (S_ISLNK(entry->d_mode)) + *flags = FTW_F_SYMLINK | FTW_F_DANGLING | FTW_F_NOSTAT; + else { + /* + * FTW_O_PHYS was not given, i.e. we can follow symlinks, but + * entry->d_mode was not set accordingly (probably because the + * filesystem does not report d_type). + * + * Therefore we need to do an lstat() to get proper flags. + */ + +#ifdef HAS_FSTATAT + if (is_valid_fd(dir->fd)) { + ret = fstatat(dir->fd, entry->d_name, sb, AT_SYMLINK_NOFOLLOW); + } else +#endif /* HAS_FSTATAT */ + { + const char *name = (fx->flags & FTW_O_CHDIR) ? + entry->d_name : str_2c(&fx->spath); + ret = lstat(name, sb); + } + + if (0 == ret && S_ISLNK(sb->st_mode)) + *flags = FTW_F_SYMLINK | FTW_F_DANGLING; + else + *flags = FTW_F_NOSTAT; + } + + /* + * When FTW_F_NOSTAT is on, we have no valid stat() information in + * the structure, so zero it to avoid confusion. + * + * Also, if we have d_type fields in the dirent structure and we can + * identify that the entry was of a certain type, flag it as such so + * that we can nonetheless invoke the callback with as much information + * as we could gather. + */ + + if (*flags & FTW_F_NOSTAT) { + ZERO(sb); + + if (S_ISDIR(entry->d_mode)) + *flags |= FTW_F_DIR; + else if (S_ISLNK(entry->d_mode)) + *flags |= FTW_F_SYMLINK; + else if (S_ISREG(entry->d_mode)) + *flags |= FTW_F_FILE; + else if (0 != entry->d_mode) + *flags |= FTW_F_OTHER; + } + } else { + if (S_ISREG(sb->st_mode)) + *flags = FTW_F_FILE; + else if (S_ISDIR(sb->st_mode)) + *flags = FTW_F_DIR; + else if (S_ISLNK(sb->st_mode)) + *flags = FTW_F_SYMLINK; + else + *flags = FTW_F_OTHER; + } + + /* + * If we're dealing with a directory, we need to know whether it was + * a symbolic link we crossed, in case we also chdir() to it, to be + * able to properly restore the current working directory later on. + */ + + if G_UNLIKELY( + FTW_O_CHDIR == (fx->flags & (FTW_O_PHYS | FTW_O_CHDIR)) && + (*flags & FTW_F_DIR) + ) { + /* + * If the filesystem sets d_type, we'll know without issuing another + * lstat() call. We don't need fstatat() here since we know we're + * doing chdir() to process directories. + */ + + if (S_ISLNK(entry->d_mode)) { + *flags |= FTW_F_SYMLINK; + } else { + filestat_t buf; + ret = lstat(entry->d_name, &buf); + if (0 == ret && S_ISLNK(buf.st_mode)) + *flags |= FTW_F_SYMLINK; + } + } + + return 0; +} + +/** + * Process a directory entry. + * + * @param fx the tree walker context + * @param sb the stat buffer we can use (filled with directory info) + * @param dir the directory handle + * @param entry the directory entry to process + */ +static ftw_status_t +ftw_process_entry( + struct ftw_ctx *fx, + filestat_t *sb, struct ftw_dir *dir, struct ftw_dirent *entry) +{ + uint32 flags; + ftw_status_t result; + + ftw_ctx_check(fx); + ftw_dir_check(dir); + g_assert(entry != NULL); + + /* + * We always skip "." and ".." entries. + */ + + if G_UNLIKELY('.' == entry->d_name0) { + if ( + '\0' == entry->d_name1 || + ('.' == entry->d_name1 && '\0' == entry->d_name2) + ) + return FTW_STATUS_OK; + } + + str_cat_len(&fx->spath, entry->d_name, entry->d_namelen); + + if (-1 == ftw_stat(fx, sb, dir, entry, &flags)) + return FTW_STATUS_ERROR; + + /* + * If it's not a file, directory or symlink, only process when FTW_O_ALL. + */ + + if ((flags & FTW_F_OTHER) && 0 == (fx->flags & FTW_O_ALL)) + return FTW_STATUS_OK; + + /* + * If we could not stat the entry, we obviously cannot recurse even + * if it is a directory. We cannot detect duplicate entries either + * since we have no information at all. Still, we have a name that + * was present in the directory at the time we read it, so let them + * know about the entry and decide. + */ + + if G_UNLIKELY(flags & FTW_F_NOSTAT) + return ftw_callback(fx, sb, flags); + + /* + * If we're crossing mount points, skip the entry. + */ + + if ((fx->flags & FTW_O_MOUNT) && sb->st_dev != fx->rootdev) + return FTW_STATUS_OK; + + /* + * When we can follow symbolic links, ensure this is not an entry + * we have already processed. + */ + + if (0 == (fx->flags & FTW_O_PHYS)) { + struct ftw_entry fe; + struct ftw_entry *nfe; + void *old; + + fe.dev = sb->st_dev; + fe.ino = sb->st_ino; + + if (erbtree_contains(&fx->entries, &fe)) + return FTW_STATUS_OK; + + nfe = ftw_entry_alloc(fe.dev, fe.ino); + old = erbtree_insert(&fx->entries, &nfe->node); + + g_assert(NULL == old); /* Node was not present in tree */ + } + + /* + * If we're dealing with a directory, we need to recurse down. + * Otherwise, just invoke the callback on the entry. + */ + + if (flags & FTW_F_DIR) { + result = ftw_process_dir(fx, sb, dir, 0 != (flags & FTW_F_SYMLINK)); + } else { + result = ftw_callback(fx, sb, flags); + + if G_UNLIKELY(FTW_STATUS_SKIP_SUBTREE == result) { + s_carp_once("%s(): ignoring FTW_STATUS_SKIP_SUBTREE from %s(): " + "called on entry without FTW_F_DIR", + G_STRFUNC, stacktrace_function_name(fx->cb)); + result = FTW_STATUS_OK; + } + } + + return result; +} + +/** + * Recursively process the directory whose path is held in ``fx->spath''. + * + * @param fx the tree walker context + * @param sb the stat buffer we can use (filled with directory info) + * @param pdir the parent directory (NULL if at the top of tree) + * @param is_link whether we're traversing a symbolic link + * + * @return processing status, one of FTW_STATUS_*. + */ +static ftw_status_t +ftw_process_dir( + struct ftw_ctx *fx, filestat_t *sb, struct ftw_dir *pdir, bool is_link) +{ + struct ftw_dir dir; + struct ftw_dirent entry; + ftw_status_t result = FTW_STATUS_OK; + int saved_base; + size_t saved_len; + int r; + + ftw_ctx_check(fx); + g_assert(NULL == pdir || fx->base >= fx->rootlen); + g_assert(NULL != pdir || 0 == fx->base); + + /* + * This is a recursive routine, we do not know how deep the file system + * hierarchy is going to be. Make sure we're not too deep to avoid + * accidental stack overflows. + */ + + thread_stack_check(); /* Ensure we're not recursing too deeply */ + + if G_UNLIKELY(0 != ftw_opendir(fx, &dir, pdir)) { + if (EACCES == errno) { + /* + * Directory exists, was stat()-ed but cannot be opened for reading. + * This is not an error condition a priori, but we let the callback + * decide how to handle this. + * + * Note that we do not attempt to chdir() to it, even if they gave + * the FTW_O_CHDIR flag. + * + * And this will be a one-time call: no pre-order / post-order + * since the directory cannot be read. + */ + + return ftw_callback(fx, sb, FTW_F_DIR | FTW_F_NOREAD); + } + return FTW_STATUS_ERROR; + } + + /* + * If we're notifying directories in pre-order, now is the time. + */ + + if (fx->flags & FTW_O_ENTRY) { + result = ftw_callback(fx, sb, FTW_F_DIR); + + if G_UNLIKELY(result != FTW_STATUS_OK) { + ftw_closedir(fx, &dir); + + if G_UNLIKELY(FTW_STATUS_SKIP_SUBTREE == result) + result = FTW_STATUS_OK; + + return result; + } + } + + /* + * Move to that directory if requested. + */ + + if (fx->flags & FTW_O_CHDIR) { + if G_UNLIKELY(0 != ftw_chdir(fx, &dir)) { + ftw_closedir(fx, &dir); + return FTW_STATUS_ERROR; + } + + /* + * Since we have to chdir() to each directory we traverse, we need to + * save the absolute path of the intial directory we're traversing so + * that we can always reconstruct the absolute path to the parent + * directory when we chdir() through a symlink! + * + * See ftw_chdir_parent() to see how this value will be used. + */ + + if G_UNLIKELY(0 == (fx->flags & FTW_O_PHYS) && NULL == pdir) { + g_assert(NULL == fx->rootdir); + + fx->rootdir = ftw_getcwd(); + + if (NULL == fx->rootdir) { + s_carp("%s(): cannot get current working directory in %s: %m", + G_STRFUNC, str_2c(&fx->spath)); + ftw_closedir(fx, &dir); + return FTW_STATUS_ERROR; + } + } + } + + /* + * Process that directory. + * + * Note that we always use '/' as the path separator since that works + * on all UNIX and Windows platforms. + */ + + saved_base = fx->base; + saved_len = str_len(&fx->spath); + + /* + * Traps traversals from "/", to avoid two successive '/' in path. + * Otherwise, we know that there cannot be any trailing '/' in the path. + */ + + if (fx->level != 0 || '/' != str_at(&fx->spath, -1)) + str_putc(&fx->spath, '/'); + + fx->base = str_len(&fx->spath); + fx->level++; + + g_assert(UNSIGNED(fx->base) >= saved_len); /* No int overflow */ + + while (0 == (r = ftw_readdir(&dir, &entry))) { + str_setlen(&fx->spath, fx->base); /* Useless for first entry */ + result = ftw_process_entry(fx, sb, &dir, &entry); + + if G_UNLIKELY(FTW_STATUS_SKIP_SUBTREE == result) + result = FTW_STATUS_OK; + + if G_UNLIKELY(result != FTW_STATUS_OK) + break; + } + + ftw_closedir(fx, &dir); + + if (r < 0) + return FTW_STATUS_ERROR; + + if G_UNLIKELY(FTW_STATUS_SKIP_SIBLINGS == result) + result = FTW_STATUS_OK; /* OK, exited directory processing loop */ + + /* + * Done with directory, retore previous context. + */ + + g_assert(fx->level > 0); + g_assert(fx->base >= 1); + + fx->level--; + str_setlen(&fx->spath, saved_len); /* Also strips any '/' added above */ + fx->base = saved_base; + + /* + * If we're notifying directories in post-order, now is the time. + * + * Note that we do not invoke the post-order callback if we have an + * error / abort condition so far. + */ + + if (FTW_STATUS_OK == result && (fx->flags & FTW_O_DEPTH)) { + result = ftw_callback(fx, sb, FTW_F_DIR | FTW_F_DONE); + + if G_UNLIKELY(FTW_STATUS_SKIP_SUBTREE == result) { + /* They are confused, it's too late! */ + s_carp_once("%s(): ignoring FTW_STATUS_SKIP_SUBTREE from %s(): " + "called with FTW_F_DONE (post-order visit)", + G_STRFUNC, stacktrace_function_name(fx->cb)); + result = FTW_STATUS_OK; + } + } + + /* + * If we're changing directories, we need to move out of the processed + * directory, back to the parent directory. + * + * However, don't bother if we're going to abort processing or if we would + * go back to the root directory, since the ftw_foreach() routine will + * handle the restoration of the original working directory. + */ + + if ( + pdir != NULL && (fx->flags & FTW_O_CHDIR) && + !(FTW_STATUS_CANCELLED == result || FTW_STATUS_ABORT == result) + ) { + int ret = ftw_chdir_parent(fx, pdir, is_link); + + if (0 != ret) { + /* If ret is -2, then ftw_chdir_parent() already emitted warning */ + if (-1 == ret && 0 == (fx->flags & FTW_O_SILENT)) { + s_carp("%s(): cannot chdir() back to parent of \"%s\"%s: %m", + G_STRFUNC, str_2c(&fx->spath), + is_link ? " (traversed via symlink)" : ""); + } + result = FTW_STATUS_ERROR; + } + } + + return result; +} + +/** + * Cleanup resources used to track the original current working directory. + */ +static void +ftw_cleanup_cwd(struct ftw_ctx *fx) +{ + ftw_ctx_check(fx); + + if (-1 != fx->callfd) + close(fx->callfd); + + HFREE_NULL(fx->calldir); +} + +/** + * Restore previous current working directory and cleanup resources. + */ +static void +ftw_restore_cwd(struct ftw_ctx *fx) +{ + ftw_ctx_check(fx); + +#ifdef HAS_FCHDIR + if (-1 != fx->callfd) { + if (-1 == fchdir(fx->callfd)) { + s_carp("%s(): cannot restore original working directory: %m", + G_STRFUNC); + } + } else +#endif /* HAS_FCHDIR */ + { + if (-1 == chdir(fx->calldir)) { + s_carp("%s(): cannot go back to directory \"%s\": %m", + G_STRFUNC, fx->calldir); + } + } + + ftw_cleanup_cwd(fx); +} + +/** + * Starting from ``dirpath'', recursively traverse the filesystem, invoking + * the supplied ``cb'' on each entry. + * + * The callback function will get paths under the initial ``dirpath'': if that + * directory was relative from the current working directory, they will be + * relative; otherwise they will be absolute paths. However, when FTW_O_CHDIR + * is given, callbacks are executed within the currently visited directory, + * so if the file has to be opened, it must be through its basename. + * + * The callback status is monitored to determine whether traversal can continue. + * + * By default, symbolic links are traversed and mount points are no obstacles. + * However, each file will only be reported once, no matter how many loops + * the symbolic links create. + * + * Most of the time, one would specify FTW_O_PHYS to prevent symbolic links + * from being followed and FTW_O_MOUNT to stay on the original file system and + * prevent crossing mount points. + * + * To allow the callback to be executed in the context of the processed + * directory, use FTW_O_CHDIR. The initial working directory will be restored + * before returning. + * + * Unless FTW_O_ALL is given, the callback is only invoked for files, + * directories and symlinks (when FTW_O_PHYS is given). This means entries + * like devices, fifos, sockets will be skipped. + * + * The normal tree traversal is pre-order: the directory is handled and then + * its entries are processed. To request post-order traversal, whereby the + * directory is processed only after all its entries where, use FTW_O_DEPTH. + * In that case, the callback will get the FTW_F_DONE flag set to let the + * processing callback know that the directory was fully processed. + * + * It is also possible to request directory notifications in both pre- and post- + * oder by specifying FTW_O_ENTRY | FTW_O_DEPTH. + * + * To avoid reading the directory content into memory, we keep the parent + * directories opened whilst recursing. The maximum amount amout of file + * descriptors to use can however be specified through ``nfd'', with 0 meaning + * that we let the routine guess a suitable amount. + * + * @param dirpath the root directory to start traversal from + * @param flags operating flags (combination of FTW_O_*) + * @param nfd max opened directories we can keep simultaneously + * @param cb the callback to invoke on each entry + * @param data opaque argument to pass to the callback + * + * @return FTW_STATUS_OK if OK, FTW_STATUS_ERROR if an error occurred, + * FTW_STATUS_CANCELLED if the callback was externally told to cancel the + * traversal (through a global variable being set, for instance), and + * FTW_STATUS_ABORT if the callback decided to abort the traversal. + */ +ftw_status_t +ftw_foreach(const char *dirpath, uint32 flags, int nfd, ftw_fn_t cb, void *data) +{ + struct ftw_ctx fx; + filestat_t buf; + ftw_status_t result = FTW_STATUS_OK; + bool is_link = FALSE; + + g_assert(dirpath != NULL); + g_assert(nfd >= 0); + g_assert(cb != NULL); + + if ('\0' == *dirpath) { + errno = ENOENT; + if (0 == (flags & FTW_O_SILENT)) + s_carp("%s(): given an empty path to process", G_STRFUNC); + return FTW_STATUS_ERROR; + } + + if (0 == nfd) + nfd = getdtablesize() / 25; /* 4% of available descriptors */ + + nfd = MAX(nfd, 1); + + ZERO(&fx); + fx.nfd = nfd; + fx.udata = data; + fx.info.ftw_flags = fx.flags = flags; + fx.callfd = -1; + fx.cb = cb; + +#ifndef HAS_LSTAT + fx.flags |= FTW_O_PHYS; /* No symbolic links on that platform */ +#endif + + if (0 == (flags & FTW_O_DEPTH)) + fx.flags |= FTW_O_ENTRY; /* Default is pre-order directory visits */ + + if (-1 == lstat(dirpath, &buf)) { + if (0 == (flags & FTW_O_SILENT)) + s_carp("%s(): cannot stat(\"%s\"): %m", G_STRFUNC, dirpath); + return FTW_STATUS_ERROR; + } + + /* + * If we'll have to get back here, we have these options: + * + * 1. when fchdir() is available, we open the current directory. + * 2. we request the current working directory to chdir() to later. + */ + + if (0 == (flags & FTW_O_CHDIR)) + goto got_cwd; + +#ifdef HAS_FCHDIR + + if (nfd > 1) { + fx.callfd = open(".", O_RDONLY); + if (-1 != fx.callfd) { + fx.nfd--; /* We're using one fd now to track the cwd */ + goto got_cwd; + } + if (0 == (flags & FTW_O_SILENT)) { + s_carp("%s(): unable to open \".\" to keep current directory: %m", + G_STRFUNC); + } + } + /* FALL THROUGH */ + +#endif /* HAS_FCHDIR */ + + fx.calldir = ftw_getcwd(); + if (NULL == fx.calldir) { + if (0 == (flags & FTW_O_SILENT)) { + s_carp("%s(): unable to get initial current directory: %m", + G_STRFUNC); + } + return FTW_STATUS_ERROR; + } + +got_cwd: + /* + * Check the ``dirpath'' argument: if it's not a directory, it can + * probably be processed immediately and we will be done! + */ + + fx.magic = FTW_CTX_MAGIC; /* About to use the context */ + + g_assert(0 == fx.info.flags); + + if (!(FTW_O_PHYS & flags) && S_ISLNK(buf.st_mode)) { + is_link = TRUE; + if (-1 == stat(dirpath, &buf)) + fx.info.flags |= FTW_F_DANGLING; + } + + if (!S_ISDIR(buf.st_mode)) { + if ( + S_ISREG(buf.st_mode) || /* Regular file */ + S_ISLNK(buf.st_mode) || /* Symlink, no FTW_O_PHYS */ + (FTW_O_ALL & flags) /* Any entry */ + ) { + fx.info.fpath = dirpath; + fx.info.fbase = filepath_basename(dirpath); + fx.info.rpath = fx.info.fbase; + fx.info.base = ptr_diff(fx.info.fbase, fx.info.fpath); + fx.info.root = fx.info.base; + + if (S_ISREG(buf.st_mode)) { + fx.info.flags |= FTW_F_FILE; + } else if (S_ISLNK(buf.st_mode)) { + fx.info.flags |= FTW_F_SYMLINK; + } else { + fx.info.flags |= FTW_F_OTHER; + } + + if (flags & FTW_O_CHDIR) { + char *dir = filepath_directory(dirpath); + bool error = FALSE; + if (dir != NULL) { + if (-1 == chdir(dir)) { + if (0 == (flags & FTW_O_SILENT)) { + s_carp("%s(): cannot chdir() to \"%s\": %m", + G_STRFUNC, dir); + } + HFREE_NULL(fx.calldir); /* Have not changed cwd! */ + result = FTW_STATUS_ERROR; + error = TRUE; + } + HFREE_NULL(dir); + if (error) + goto done; + } + } + + result = (*cb)(&fx.info, &buf, fx.udata); + goto restore_cwd; + } + + /* + * We're not processing the entry, we did not change the workding dir. + */ + + if (flags & FTW_O_CHDIR) + ftw_cleanup_cwd(&fx); /* Cleanup memory used */ + + goto done; + } + + /* + * At this stage, we have validated that ``dirpath'' is a directory. + * It has been successfully stat()'ed and is described in ``buf''. + */ + + if (flags & FTW_O_MOUNT) { + /* + * We need to avoid crossing filesystems, so remember the device on + * which the root directory lies. If ``dirpath'' was a symbolic link + * and they have ommitted FTW_O_PHYS, we may already be on another + * device at this stage, but that is OK -- the crossing of mountpoints + * is only relative to the actual physical root directory... + */ + + fx.rootdev = buf.st_dev; + } + + if (0 == (flags & FTW_O_PHYS)) { + struct ftw_entry *nfe; + void *old; + + /* + * Since we're following symbolic links (logical traversal of the + * tree, not a physical one), we may go through loops. In order to + * not visit the same entry twice, we remember all the (dev, ino) + * tuples we encounter by storing them in a red-black tree. + */ + + erbtree_init(&fx.entries, + ftw_entry_cmp, offsetof(struct ftw_entry, node)); + + /* + * Insert the root directory, which we are about to enter. + */ + + nfe = ftw_entry_alloc(buf.st_dev, buf.st_ino); + old = erbtree_insert(&fx.entries, &nfe->node); + + g_assert(NULL == old); /* Node was not present in tree */ + } + + /* + * This string will be used to construct the path of each entry, + * as we move down the file tree. It is a path derived from ``dirpath''. + * As such, it cannot be used to access the files directly when traversing + * with FTW_O_CHDIR: the callback must use the ``fbase'' field from the + * ftw_info_t structure to access the processed items. + */ + + { + size_t dirlen = strlen(dirpath); + + str_create(&fx.spath, MAX_PATH_LEN / 4 + 1 + dirlen); + str_cpy_len(&fx.spath, dirpath, dirlen); + + /* Remove trailing '/' in path, unless it ends-up being standalone */ + + while ('/' == str_at(&fx.spath, -1) && str_len(&fx.spath) > 1) + str_chop(&fx.spath); + + /* Remove trailing G_DIR_SEPARATOR in path */ + + if (G_DIR_SEPARATOR != '/') { + while ( + G_DIR_SEPARATOR == str_at(&fx.spath, -1) && + str_len(&fx.spath) > 1 + ) + str_chop(&fx.spath); + } + } + + /* + * Handle the directory, recursively. + */ + + fx.base = 0; + fx.rootlen = str_len(&fx.spath); + + result = ftw_process_dir(&fx, &buf, NULL, is_link); + + /* + * Cleanup data structures. + */ + + str_discard(&fx.spath); + + if (0 == (flags & FTW_O_PHYS)) { + erbtree_discard(&fx.entries, ftw_entry_free); + HFREE_NULL(fx.rootdir); /* Allocated in ftw_process_dir() */ + } + + /* FALL THROUGH */ + +restore_cwd: + if (flags & FTW_O_CHDIR) + ftw_restore_cwd(&fx); /* Will cleanup memory */ + + /* FALL THROUGH */ + +done: + fx.magic = 0; + + g_assert(0 == fx.odirs); + + /* + * Never let one of the internal statuses (either governing the pruning of + * whole directories like FTW_STATUS_SKIP_SUBTREE, or allowing to skip + * the remaining entries from a directory like FTW_STATUS_SKIP_SIBLINGS) + * be visible from the outside of the tree walking process. + */ + + if (FTW_STATUS_SKIP_SIBLINGS == result || FTW_STATUS_SKIP_SUBTREE == result) + result = FTW_STATUS_OK; + + return result; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/ftw.h
Added
@@ -0,0 +1,114 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * File tree walk. + * + * ftw_foreach() was modelled after the standard C library ftw() call, albeit + * with a slightly different interface which also combines nftw() features + * plus the ability to provide an additional callback argument. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#ifndef _ftw_h_ +#define _ftw_h_ + +#include "common.h" + +/** + * Status that ftw_foreach() callbacks can return. + */ +typedef enum ftw_status { + FTW_STATUS_ERROR = -1, /**< Stop processing on error condition */ + FTW_STATUS_OK = 0, /**< OK, continue processing */ + FTW_STATUS_SKIP_SIBLINGS, /**< Skip siblings of current entry */ + FTW_STATUS_SKIP_SUBTREE, /**< Do not process this directory */ + FTW_STATUS_CANCELLED, /**< Stop processing on external cancel */ + FTW_STATUS_ABORT /**< Stop processing, normal decision */ +} ftw_status_t; + +/** + * Descriptive argument passed to callbacks. + */ +typedef struct ftw_info { + const char *fpath; /**< File path */ + const char *fbase; /**< Pointer to file basename */ + const char *rpath; /**< File path underneath traversal root */ + uint32 flags; /**< Descriptive flags */ + uint32 ftw_flags; /**< Flags used on ftw_foreach() */ + int root; /**< Offset of rootdir in ``fpath'' */ + int base; /**< Offset of file basename in ``fpath'' */ + int level; /**< Depth of ``fpath'' in root tree */ + int fpath_len; /**< Length of file path */ + int fbase_len; /**< Length of file basename */ + int rpath_len; /**< Length of relative path */ +} ftw_info_t; + +/** + * ftw_foreach() callback signature. + * + * @param info the ftw_info_t structure + * @param sb the result of the lstat() call on the entry + * @param data opaque user-supplied argument + */ +typedef ftw_status_t (*ftw_fn_t)( + const ftw_info_t *info, const filestat_t *sb, void *data); + +/** + * Callback flags. + */ +#define FTW_F_FILE (1U << 0) /**< is a regular file */ +#define FTW_F_DIR (1U << 1) /**< is a directory */ +#define FTW_F_OTHER (1U << 2) /**< is neither a file nor a dir */ +#define FTW_F_NOREAD (1U << 3) /**< is an unreadable directory */ +#define FTW_F_NOSTAT (1U << 4) /**< stat() failed */ +#define FTW_F_DONE (1U << 5) /**< directory fully processed */ +#define FTW_F_SYMLINK (1U << 6) /**< is a symbolic link */ +#define FTW_F_DANGLING (1U << 7) /**< symbolic link points to nothing */ + +/** + * Operating flags for ftw_foreach(). + */ +#define FTW_O_CHDIR (1U << 0) /**< chdir() to dirs before handling */ +#define FTW_O_DEPTH (1U << 1) /**< recurse to children first */ +#define FTW_O_ENTRY (1U << 2) /**< On DEPTH, also call on dir entry */ +#define FTW_O_MOUNT (1U << 3) /**< Do NOT cross mount points */ +#define FTW_O_PHYS (1U << 4) /**< Do NOT follow symbolic links */ +#define FTW_O_ALL (1U << 5) /**< Report all filesystem entries */ +#define FTW_O_SILENT (1U << 6) /**< No loud warnings on minor errors */ + +/* + * Public interface. + */ + +ftw_status_t ftw_foreach(const char *dirpath, uint32 flags, int nfd, + ftw_fn_t cb, void *data); + +#endif /* _ftw_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/gentime.c
Added
@@ -0,0 +1,267 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Generation Timestamp functions. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#include "gentime.h" +#include "atomic.h" +#include "once.h" +#include "pow2.h" +#include "spinlock.h" +#include "timestamp.h" +#include "tm.h" + +#include "override.h" /* Must be the last header included */ + +#define GENTIME_GEN_MAX 16 /* Max amount of generations we track */ +#define GENTIME_GEN_MASK (GENTIME_GEN_MAX - 1) + +/* + * A generation time adjustment. + * + * A negative delta means time went backwards, as detected at the given time. + */ +struct gentime_adj { + unsigned generation; /* When adjustment was detected */ + int delta; /* Delta reported with previous time, in ms */ +}; + +/* + * Structure used to track the various generation adjustments. + * + * This is used as a circular buffer, with "next" recording the next slot + * usable and "first" recording the first valid adjustment. If the two are + * equal then the buffer is empty. + */ +static struct gentime_rec { + struct gentime_adj adjustmentGENTIME_GEN_MAX; + unsigned first, next; +} gentime_rec; + +static unsigned gentime_gen; /* Generation number */ +static spinlock_t gentime_slk = SPINLOCK_INIT; + +/* + * It is necessary to use a low-level raw spinlock implementation here + * because gentime routines are used during the regular spinlock implementation + * to detect deadlocks, and that could cause endless recursion otherwise. + * + * This means there will be no deadlock detection for these locks, and they + * do not make thread suspension or signal handling points. + */ +#define GENTIME_LOCK spinlock_raw(&gentime_slk) +#define GENTIME_UNLOCK spinunlock_raw(&gentime_slk) + +static void gentime_adjust(int delta); + +/** + * Install the time adjustment event, once. + */ +static void +gentime_event_install(void) +{ + tm_event_listener_add(gentime_adjust); +} + +/** + * Initialize the generation timestamp layer. + * + * This is done by installing the adjustment event, which will get triggered + * from the time thread when it detects that the system clock was suddenly + * adjusted. + */ +void +gentime_init(void) +{ + static once_flag_t gentime_inited; + + once_flag_run(&gentime_inited, gentime_event_install); + +} + +/** + * Uninstall time adjustment event when shutting down. + */ +void +gentime_close(void) +{ + tm_event_listener_remove(gentime_adjust); +} + +/** + * @return current generation time (cached). + */ +gentime_t +gentime_now(void) +{ + gentime_t now; + + now.stamp = tm_time(); + now.generation = atomic_uint_get(&gentime_gen); + + return now; +} + +/** + * @return current generation time (exact). + */ +gentime_t +gentime_now_exact(void) +{ + gentime_t now; + + now.stamp = tm_time_exact(); + now.generation = atomic_uint_get(&gentime_gen); + + return now; +} + +/** + * Get generation time from current system time. + * + * @param stamp current system time + * + * @return generation time from given time, assumed to be the current one. + */ +gentime_t +gentime_from(time_t stamp) +{ + gentime_t now; + + now.stamp = stamp; + now.generation = atomic_uint_get(&gentime_gen); + + return now; +} + +/** + * Correct the timestamp by applying all the recorded adjustments that + * came after the timestamp was computed. + * + * @param stamp the timestamp to adjust + * @param generation when the timestamp was computed + * + * @return adjusted timestamp. + */ +static time_t +gentime_correct(time_t stamp, unsigned generation) +{ + struct gentime_rec *g = &gentime_rec; + unsigned i, idx; + int adjustments = 0; + + g_assert(spinlock_is_held(&gentime_slk)); + + /* + * Move backwards in the recorded time adjustments and apply them, + * thereby restoring the original "absolute time" when the timestamp + * was taken, if we assume that all the clock adjustments that occurred + * since have corrected the time reference (i.e. the current time is now + * the correct "absolute time"). + */ + + for (i = g->next; i != g->first; i = idx) { + struct gentime_adj *adj; + + idx = (i - 1) & GENTIME_GEN_MASK; + adj = &g->adjustmentidx; + + if G_LIKELY(generation >= adj->generation) + break; + + adjustments += adj->delta; + } + + return stamp + adjustments / 1000; +} + +/** + * @return the time difference "t1 - t0" accounting for any adjustments + * made to the clock inbetween. + */ +time_delta_t +gentime_diff(const gentime_t t1, const gentime_t t0) +{ + struct gentime_rec *g = &gentime_rec; + unsigned lidx, last; + + GENTIME_LOCK; + + if G_UNLIKELY(g->first == g->next) { + /* No adjustments recorded yet */ + GENTIME_UNLOCK; + return delta_time(t1.stamp, t0.stamp); + } + + lidx = (g->next - 1) & GENTIME_GEN_MASK; + last = g->adjustmentlidx.generation; + + if G_LIKELY(t0.generation >= last && t1.generation >= last) { + /* Both timestamps come after the last adjustment */ + GENTIME_UNLOCK; + return delta_time(t1.stamp, t0.stamp); + } else { + time_t ts1, ts0; + + ts1 = gentime_correct(t1.stamp, t1.generation); + ts0 = gentime_correct(t0.stamp, t0.generation); + GENTIME_UNLOCK; + return delta_time(ts1, ts0); + } +} + +/** + * Record a new time adjustment. + * + * @param delta delta, in ms + */ +static void +gentime_adjust(int delta) +{ + struct gentime_rec *g = &gentime_rec; + unsigned lidx; + + STATIC_ASSERT(IS_POWER_OF_2(GENTIME_GEN_MAX)); + + GENTIME_LOCK; + lidx = g->next & GENTIME_GEN_MASK; + g->adjustmentlidx.generation = gentime_gen + 1; + g->adjustmentlidx.delta = delta; + g->next = (g->next + 1) & GENTIME_GEN_MASK; + if (g->next == g->first) + g->first = (g->first + 1) & GENTIME_GEN_MASK; + atomic_uint_inc(&gentime_gen); + GENTIME_UNLOCK; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/gentime.h
Added
@@ -0,0 +1,86 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Generation Timestamp functions. + * + * A generation timestamp is a timestamp that can be compared to another + * generation timestamp by taking into account any clock adjustments that + * can have been performed between the two, provided there are not too many + * generations between the two stamps. + * + * The aim of generation timestamps is to provide safe timeout computatations + * in critical code such as spinlocks. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#ifndef _gentime_h_ +#define _gentime_h_ + +#include "timestamp.h" + +/* + * A generation timestamp. + */ +typedef struct gentime { + unsigned generation; /* The generation number */ + time_t stamp; /* The associated timestamp */ +} gentime_t; + +#define GENTIME_ZERO { 0, 0 } + +/* + * Public interface. + */ + +gentime_t gentime_now(void); +gentime_t gentime_now_exact(void); +gentime_t gentime_from(time_t stamp); +time_delta_t gentime_diff(const gentime_t t1, const gentime_t t0); + +void gentime_init(void); +void gentime_close(void); + +static inline bool ALWAYS_INLINE +gentime_is_zero(const gentime_t gt) +{ + return 0 == gt.stamp; +} + +/** + * Extract the time from a generation time. + */ +static inline time_t ALWAYS_INLINE +gentime_time(const gentime_t gt) +{ + return gt.stamp; +} + +#endif /* _gentime_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/getcpucount.c
Added
@@ -0,0 +1,95 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Get amount of online CPUs. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" +#include "getcpucount.h" + +#if defined(I_SYS_SYSCTL) && defined(HAS_SYSCTL) +#include <sys/sysctl.h> +#endif + +#include "override.h" /* Must be the last header included */ + +/** + * Compute the amount of available CPUs. + * + * @return amount of online CPUs. + */ +long +getcpucount(void) +#ifdef MINGW32 +{ + return mingw_cpu_count(); +} +#elif defined(_SC_NPROCESSORS_ONLN) +{ + long count; + + errno = 0; + count = sysconf(_SC_NPROCESSORS_ONLN); + if (-1L == count && 0 != errno) + g_warning("%s: sysconf(_SC_NPROCESSORS_ONLN) failed: %m", G_STRFUNC); + return MAX(1, count); +} +#elif defined(HAS_SYSCTL) && defined(CTL_HW) && defined(HW_AVAILCPU) +{ + int mib2 = { CTL_HW, HW_AVAILCPU }; + long count; + size_t len = sizeof count; + + if (-1 == sysctl(mib, N_ITEMS(mib), &count, &len, NULL, 0)) { + g_warning("%s: sysctl() for HW_AVAILCPU failed: %m", G_STRFUNC); + return 1; + } + return MAX(1, count); +} +#elif defined(HAS_SYSCTL) && defined(CTL_HW) && defined(HW_NCPU) +{ + int mib2 = { CTL_HW, HW_NCPU }; + long count; + size_t len = sizeof count; + + if (-1 == sysctl(mib, N_ITEMS(mib), &count, &len, NULL, 0)) { + g_warning("%s: sysctl() for HW_NCPU failed: %m", G_STRFUNC); + return 1; + } + return MAX(1, count); +} +#else +{ + g_warning("unable to determine amount of CPU cores"); + return 1; +} +#endif + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/getcpucount.h
Added
@@ -0,0 +1,45 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Get amount of online CPUs. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _getcpucount_h_ +#define _getcpucount_h_ + +/* + * Public interface. + */ + +long getcpucount(void); + +#endif /* _getcpucount_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/getdate.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/getdate.c
Changed
@@ -1,4 +1,4 @@ -#ifndef lint +#if 0 static const char yysccsid = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; #endif @@ -942,6 +942,7 @@ || yyHaveDay > 1) return -1; + ZERO(&tm); tm.tm_year = ToYear(yyYear) - TM_YEAR_ORIGIN + yyRelYear; tm.tm_mon = yyMonth - 1 + yyRelMonth; tm.tm_mday = yyDay + yyRelDay;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/getdate.y -> gtk-gnutella-1.1.9.tar.bz2/src/lib/getdate.y
Changed
@@ -945,6 +945,7 @@ || yyHaveDay > 1) return -1; + ZERO(&tm); tm.tm_year = ToYear(yyYear) - TM_YEAR_ORIGIN + yyRelYear; tm.tm_mon = yyMonth - 1 + yyRelMonth; tm.tm_mday = yyDay + yyRelDay;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/getgateway.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/getgateway.c
Changed
@@ -44,11 +44,17 @@ #endif #include "getgateway.h" + #include "ascii.h" +#include "compat_usleep.h" #include "fd.h" #include "host_addr.h" +#include "mempcpy.h" #include "misc.h" #include "parse.h" +#include "spinlock.h" +#include "timestamp.h" +#include "tm.h" #include "override.h" /* Must be the last header included */ @@ -60,13 +66,13 @@ * * @return 0 on success, -1 on failure with errno set. */ -static G_GNUC_COLD int +static int G_COLD parse_netstat(host_addr_t *addrp) #ifdef HAS_POPEN { FILE *f = NULL; char tmp80; - guint32 gate = 0; + uint32 gate = 0; /* * This implementation should be a safe default on UNIX platforms, but @@ -97,7 +103,7 @@ while (fgets(tmp, sizeof tmp, f)) { char *p; - guint32 ip; + uint32 ip; p = is_strprefix(tmp, "default"); if (NULL == p) @@ -125,12 +131,12 @@ } #else { - static gboolean warned; + static bool warned; (void) addrp; if (!warned) { - g_warning("getgateway(): no popen() on this platform"); + g_warning("%s(): no popen() on this platform", G_STRFUNC); warned = TRUE; } @@ -149,14 +155,14 @@ * * @return 0 on success, -1 on failure with errno set. */ -G_GNUC_COLD int +int G_COLD getgateway(host_addr_t *addrp) #if defined(MINGW32) { - guint32 ip; + uint32 ip; if (-1 == mingw_getgateway(&ip)) { - g_warning("getgateway(): GetBestRoute() failed: %m"); + g_warning("%s(): GetBestRoute() failed: %m", G_STRFUNC); return parse_netstat(addrp); /* Avoids "unused function" warning */ } @@ -170,12 +176,15 @@ unsigned seq = 1; __u32 pid = getpid(); /* not pid_t because nlmsg_pid is of type __u32 */ host_addr_t gateway; - gboolean done; + bool done; struct { struct nlmsghdr hdr; struct rtmsg rtm; unsigned char space1024; /* Unexplained magic buffer size */ } nlm; + static host_addr_t gw; /* Previously computed gateway */ + static time_t gw_time; /* When it was computed */ + static spinlock_t gw_slk = SPINLOCK_INIT; /* * This implementation uses the linux netlink interface. @@ -183,7 +192,7 @@ fd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE); if (-1 == fd) - return -1; + goto error; ZERO(&nlm); nlm.hdr.nlmsg_len = NLMSG_LENGTH(sizeof nlm.rtm); @@ -202,13 +211,33 @@ for (done = FALSE; !done; /* empty */) { unsigned nlen; struct nlmsghdr *nl; + int i; - rw = recv(fd, &nlm, sizeof nlm, MSG_DONTWAIT); - if ((ssize_t) -1 == rw) { - g_warning("getgateway(): recv() failed: %m"); - goto error; + /* + * Unfortunately, the recv() call is non-blocking and can sometimes + * return EAGAIN, multiple times. Hence the loop and the usleep(). + */ + + for (i = 0; i < 1000; i++) { + rw = recv(fd, &nlm, sizeof nlm, MSG_DONTWAIT); + if ((ssize_t) -1 == rw) { + if (EAGAIN == errno || EWOULDBLOCK == errno) { + compat_usleep(1000); /* 1 ms */ + continue; + } + break; + } else { + goto answered; + } } + if (EAGAIN == errno || EWOULDBLOCK == errno) + goto try_cached; + + g_warning("%s(): recv() failed: %m", G_STRFUNC); + goto error; + + answered: nl = &nlm.hdr; if (0 == NLMSG_OK(nl, UNSIGNED(rw)) || NLMSG_ERROR == nl->nlmsg_type) @@ -241,7 +270,7 @@ if (rt->rtm_family != AF_INET && rt->rtm_family != AF_INET6) continue; - /* + /* * Look for an attribute of type RTA_GATEWAY. */ @@ -270,13 +299,40 @@ error: fd_close(&fd); - g_warning("getgateway(): netlink failed, using the netstat command"); + g_warning("%s(): netlink failed, using the netstat command", G_STRFUNC); return parse_netstat(addrp); found: fd_close(&fd); *addrp = gateway; + + /* + * Save compute gateway in case we cannot compute it next time we are + * called due to the kernel being busy. + */ + + spinlock(&gw_slk); + gw = gateway; + gw_time = tm_time(); + spinunlock(&gw_slk); + return 0; + +try_cached: + /* + * Could not get a reply, see if we can return previously computed + * information if it is not too ancient (less than 60 secs ago). + */ + + spinlock(&gw_slk); + if (is_host_addr(gw) && delta_time(tm_time(), gw_time) < 60) { + gateway = gw; + spinunlock(&gw_slk); + goto found; + } + + spinunlock(&gw_slk); + goto error; } #elif defined(I_NET_ROUTE) && defined(PF_ROUTE) && defined(RTM_GET) { @@ -301,7 +357,7 @@ fd = socket(PF_ROUTE, SOCK_RAW, 0); if (-1 == fd) - return -1; + goto error; ZERO(rt); ZERO(&dest); @@ -319,10 +375,8 @@ STATIC_ASSERT(2 * sizeof dest <= sizeof rtm.data); p = payload; - memcpy(p, &dest, sizeof dest); - p += sizeof dest; - memcpy(p, &mask, sizeof mask); - p += sizeof mask; + p = mempcpy(p, &dest, sizeof dest); + p = mempcpy(p, &mask, sizeof mask); rt->rtm_msglen = (p - payload) + sizeof *rt; @@ -378,7 +432,7 @@ * be incorrect the day BSD starts to return AF_INET6. * --RAM, 2011-01-27 */ - + memcpy(&sa, gate, sizeof sa); if (AF_INET == sa.sa_family) { @@ -398,7 +452,8 @@ error: fd_close(&fd); - g_warning("getgateway(): route socket failed, using the netstat command"); + g_warning("%s(): route socket failed, using the netstat command", + G_STRFUNC); return parse_netstat(addrp); found: @@ -408,7 +463,7 @@ } #else { - static gboolean warned; + static bool warned; /* * Let's get information about which systems cannot benefit from a @@ -416,7 +471,7 @@ */ if (!warned) { - g_warning("getgateway(): using the slow netstat command"); + g_warning("%s(): using the slow netstat command", G_STRFUNC); warned = TRUE; }
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/gethomedir.c
Added
@@ -0,0 +1,118 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Get user's home directory. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#ifdef I_PWD +#include <pwd.h> +#endif + +#include "constants.h" +#include "gethomedir.h" +#include "misc.h" +#include "path.h" + +#include "override.h" /* Must be the last header included */ + +/** + * Compute the user's home directory. + * + * Uses the HOME environment variable first, then the entry from /etc/passwd. + * + * @return read-only string constant. + */ +const char * +gethomedir(void) +{ + static const char *home; + const char *dir; + + if G_LIKELY(home != NULL) + return home; + +#ifdef MINGW32 + dir = mingw_get_home_path(); +#else + dir = getenv("HOME"); + + if (dir != NULL && !is_absolute_path(dir)) { + /* Ignore $HOME if it's empty or a relative path */ + g_warning("ignoring environment HOME: not an absolute path"); + dir = NULL; + } + + if (dir != NULL && !is_directory(dir)) { + g_warning("ignoring environment HOME: not a directory"); + dir = NULL; + } + + if (dir != NULL && -1 == access(dir, R_OK | W_OK | X_OK)) { + g_warning("ignoring non-accessible environment HOME: %m"); + dir = NULL; + } + +#ifdef HAS_GETPWNAM + if (!dir) { + const char *name; + + name = getlogin(); + if (name) { + const struct passwd *pp; + + pp = getpwnam(name); + if (pp) + dir = pp->pw_dir; + } + } +#endif /* HAS_GETPWNAM */ + +#ifdef HAS_GETPWUID + if (!dir) { + const struct passwd *pp; + + pp = getpwuid(getuid()); + if (pp) + dir = pp->pw_dir; + } +#endif /* HAS_GETPWUID */ + + if (NULL == dir) { + g_warning("could not determine home directory"); + dir = "/"; + } +#endif /* MINGW32 */ + + return home = constant_str(dir); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/gethomedir.h
Added
@@ -0,0 +1,45 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Get user's home directory. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _gethomedir_h_ +#define _gethomedir_h_ + +/* + * Public interface. + */ + +const char *gethomedir(void); + +#endif /* _gethomedir_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/getline.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/getline.c
Changed
@@ -110,6 +110,20 @@ } /** + * Destroy getline object and nullify its pointer. + */ +void +getline_free_null(getline_t **o_ptr) +{ + getline_t *o = *o_ptr; + + if (o != NULL) { + getline_free(o); + *o_ptr = NULL; + } +} + +/** * Prepare getline object for a new read cycle by forgetting whatever it * currently holds. */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/getline.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/getline.h
Changed
@@ -57,6 +57,7 @@ getline_t *getline_make(size_t maxsize); void getline_free(getline_t *); +void getline_free_null(getline_t **); void getline_reset(getline_t *); getline_result_t getline_read(getline_t *, const char *data, size_t len, size_t *used);
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/getphysmemsize.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/getphysmemsize.c
Changed
@@ -34,7 +34,7 @@ #include "common.h" #include "vmm.h" -#include "lib/getphysmemsize.h" +#include "getphysmemsize.h" #if defined(I_SYS_SYSCTL) && defined(HAS_SYSCTL) #include <sys/sysctl.h> @@ -44,16 +44,25 @@ #include <invent.h> #endif +static uint64 memsize; + /** * @return the amount of physical RAM in bytes, or zero in case of failure. */ -guint64 -getphysmemsize(void) +static uint64 +getphysmemsize_internal(void) #ifdef MINGW32 { - return mingw_getphysmemsize(); + uint64 mem; + + if ((uint64) -1 == (mem = mingw_getphysmemsize())) { + g_warning("%s(): GlobalMemoryStatusEx() failed: %m", G_STRFUNC); + return 0; + } + + return mem; } -#elif defined (_SC_PHYS_PAGES) +#elif defined(_SC_PHYS_PAGES) { size_t pagesize = compat_pagesize(); long pages; @@ -61,51 +70,46 @@ errno = 0; pages = sysconf(_SC_PHYS_PAGES); if (-1L == pages && 0 != errno) { - g_warning("sysconf(_SC_PHYS_PAGES) failed: %s", g_strerror(errno)); + g_warning("%s: sysconf(_SC_PHYS_PAGES) failed: %m", G_STRFUNC); return 0; } - return pagesize * (guint64) (unsigned long) pages; + return pagesize * (uint64) (unsigned long) pages; } -#elif defined (HAS_SYSCTL) && defined (CTL_HW) && defined (HW_USERMEM64) +#elif defined(HAS_SYSCTL) && defined(CTL_HW) && defined(HW_USERMEM64) { /* There's also HW_PHYSMEM but HW_USERMEM is better for our needs. */ int mib2 = { CTL_HW, HW_USERMEM64 }; - guint64 amount = 0; + uint64 amount = 0; size_t len = sizeof amount; if (-1 == sysctl(mib, 2, &amount, &len, NULL, 0)) { - g_warning( - "settings_getphysmemsize: sysctl() for HW_USERMEM64 failed: %s", - g_strerror(errno)); + g_warning("%s: sysctl() for HW_USERMEM64 failed: %m", G_STRFUNC); return 0; } return amount; } -#elif defined (HAS_SYSCTL) && defined (CTL_HW) && defined (HW_USERMEM) +#elif defined(HAS_SYSCTL) && defined(CTL_HW) && defined(HW_USERMEM) { /* There's also HW_PHYSMEM but HW_USERMEM is better for our needs. */ int mib2 = { CTL_HW, HW_USERMEM }; - guint32 amount = 0; + uint32 amount = 0; size_t len = sizeof amount; if (-1 == sysctl(mib, 2, &amount, &len, NULL, 0)) { - g_warning( - "settings_getphysmemsize: sysctl() for HW_USERMEM failed: %s", - g_strerror(errno)); + g_warning("%s: sysctl() for HW_USERMEM failed: %m", G_STRFUNC); return 0; } return amount; } -#elif defined (HAS_GETINVENT) +#elif defined(HAS_GETINVENT) { inventory_t *inv; long physmem = 0; if (-1 == setinvent()) { - g_warning("settings_getphysmemsize: setinvent() failed: %s", - g_strerror(errno)); + g_warning("%s: setinvent() failed: %m", G_STRFUNC); return 0; } @@ -119,18 +123,45 @@ endinvent(); if (-1L == physmem && 0 != errno) { - g_warning("settings_getphysmemsize: " - "getinvent() for INV_MEMORY faild: %s", g_strerror(errno)); + g_warning("%s: getinvent() for INV_MEMORY faild: %m", G_STRFUNC); return 0; } - return (guint64) (unsigned long) physmem * 1024 * 1024; + return (uint64) (unsigned long) physmem * 1024 * 1024; } #else /* ! _SC_PHYS_PAGES && ! HAS_SYSCTL && ! HAS_GETINVENT */ { - g_warning("Unable to determine amount of physical RAM"); + g_warning("unable to determine amount of physical RAM"); return 0; } #endif /* _SC_PHYS_PAGES */ +/** + * Get the amount of physical RAM available. + * + * @return the amount of physical RAM in bytes, or zero in case of failure. + */ +uint64 +getphysmemsize(void) +{ + if G_UNLIKELY(0 == memsize) + memsize = getphysmemsize_internal(); + + return memsize; +} + +/** + * Get the amount of physical RAM available, if known. + * + * The purpose is to avoid any memory allocation, which sysconf() or sysctl() + * may otherwise cause. + * + * @return the known amount of physical RAM in bytes, or 0 if unknown yet. + */ +uint64 +getphysmemsize_known(void) +{ + return memsize; +} + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/getphysmemsize.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/getphysmemsize.h
Changed
@@ -37,7 +37,8 @@ #ifndef _getphysmemsize_h_ #define _getphysmemsize_h_ -guint64 getphysmemsize(void); +uint64 getphysmemsize(void); +uint64 getphysmemsize_known(void); #endif /* _getphysmemsize_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/glib-missing.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/glib-missing.c
Changed
@@ -40,12 +40,14 @@ #include "common.h" #include "glib-missing.h" + #include "ascii.h" #include "compat_poll.h" -#include "iovec.h" #include "log.h" /* For s_minicarp() */ #include "misc.h" /* For clamp_strcpy() */ +#include "pslist.h" #include "str.h" +#include "stringify.h" #include "unsigned.h" #include "utf8.h" @@ -82,11 +84,11 @@ strlcat(char *dst, const char *src, size_t dst_size) { size_t n; - + g_assert(NULL != dst); g_assert(NULL != src); - n = strlen(dst); + n = strlen(dst); if (n < dst_size) { dst_size -= n; } else if (dst_size > 0) { @@ -105,7 +107,7 @@ * @return new list head. */ GSList * -gm_slist_insert_after(GSList *list, GSList *lnk, gpointer data) +gm_slist_insert_after(GSList *list, GSList *lnk, void *data) { GSList *new; @@ -130,7 +132,7 @@ * @return new list head. */ GList * -gm_list_insert_after(GList *list, GList *lnk, gpointer data) +gm_list_insert_after(GList *list, GList *lnk, void *data) { GList *new; @@ -178,7 +180,7 @@ } GList * -g_list_insert_before(GList *l, GList *lk, gpointer data) +g_list_insert_before(GList *l, GList *lk, void *data) { GList *new; @@ -203,14 +205,14 @@ #ifdef USE_GLIB1 void -g_hash_table_replace(GHashTable *ht, gpointer key, gpointer value) +g_hash_table_replace(GHashTable *ht, void *key, void *value) { g_hash_table_remove(ht, key); g_hash_table_insert(ht, key, value); } -gboolean -gm_hash_table_remove(GHashTable *ht, gconstpointer key) +bool +gm_hash_table_remove(GHashTable *ht, const void *key) { /* In glib 1.x, g_hash_table_remove() does not return anything */ @@ -235,14 +237,14 @@ * @param args The variable argument list. * @return The length of the resulting string. */ -static inline size_t +static inline size_t G_PRINTF(3, 0) buf_vprintf(char *dst, size_t size, const char *fmt, va_list args) #ifdef HAS_VSNPRINTF { int retval; /* printf()-functions really return int, not size_t */ int truncated = 0; - g_assert(size_is_positive(size)); + g_assert(size_is_positive(size)); dst0 = '\0'; retval = vsnprintf(dst, size, fmt, args); @@ -259,7 +261,7 @@ } if G_UNLIKELY(truncated != 0) { s_minicarp("truncated %d byte%s when formatting into %zu-byte buffer " - "with \"%s\"", truncated, 1 == truncated ? "" : "s", + "with \"%s\"", truncated, plural(truncated), size, fmt); } return retval; @@ -267,8 +269,8 @@ #else /* !HAS_VSNPRINTF */ { static str_t *s; - - g_assert(size > 0); + + g_assert(size > 0); if (NULL == s) s = str_new_not_leaking(0); @@ -355,7 +357,7 @@ * Do not use unless ``fmt'' is a variable that cannot be used for * static argument list checking by gcc. */ -size_t +size_t G_PRINTF(3, 0) gm_snprintf_unchecked(char *dst, size_t size, const char *fmt, ...) { va_list args; @@ -375,205 +377,6 @@ return len; } -static int orig_argc; -static char **orig_argv; -static char **orig_env; - -/** - * Save the original main() arguments. - */ -void -gm_savemain(int argc, char **argv, char **env) -{ - orig_argc = argc; - orig_argv = argv; - orig_env = env; -} - -static inline size_t -string_vec_count(char *strv) -{ - size_t i = 0; - - while (strvi) { - i++; - } - return i; -} - -static inline size_t -string_vec_size(char *strv) -{ - size_t i = 0; - size_t bytes = 0; - - while (strvi) { - bytes += strlen(strvi) + 1; /* Include trailing NUL */ - i++; - } - - return bytes; -} - -static void * -string_vec_strdup(char *orig, int count, const char *dest, void *mem) -{ - int i; - - for (i = 0; i < count; i++) { - size_t len = strlen(origi) + 1; - void *p = mem; /* Linearily increased allocation pointer */ - - mem = ptr_add_offset(mem, len); - clamp_strncpy(p, len, origi, len - 1); - desti = p; - } - - destcount = NULL; - return mem; -} - -/** - * Duplicate the original main() arguments + environment into read-only - * memory, returning pointers to the argument vector, the environment and - * the size of the argument vector. - * - * The gm_savemain() routine must be called first to record the original - * argument pointers and gm_dupmain() must be called as soon as possible, - * before alteration of the argument list or the passed environment. - * - * @param argv_ptr where the allocated argment vector is returned - * @param env_ptr where the allocated environment is returned - * - * @return the amount of entries in the returned argv - */ -int -gm_dupmain(const char ***argv_ptr, const char ***env_ptr) -{ - size_t env_count, arg_count; - size_t env_size, arg_size; - size_t total_size; - void *p, *q; - const char **argv; - const char **env; - - g_assert(orig_argv != NULL); /* gm_savemain() was called */ - - env_count = string_vec_count(orig_env); - env_size = string_vec_size(orig_env); - arg_count = orig_argc; - arg_size = string_vec_size(orig_argv); - - total_size = (arg_count + env_count + 2) * sizeof(char *) + - env_size + arg_size; - - p = vmm_alloc_not_leaking(total_size); - argv = p; - env = ptr_add_offset(argv, (arg_count + 1) * sizeof(char *)); - q = ptr_add_offset(env, (env_count + 1) * sizeof(char *)); - - q = string_vec_strdup(orig_argv, arg_count, argv, q); - q = string_vec_strdup(orig_env, env_count, env, q); - - g_assert(ptr_diff(q, p) == total_size); - - if (-1 == mprotect(p, total_size, PROT_READ)) - s_warning("%s(): cannot protect memory as read-only: %m", G_STRFUNC); - - *argv_ptr = argv; - *env_ptr = env; - - return arg_count; -} - -#if !defined(HAS_SETPROCTITLE) -/** - * Compute the length of the exec() arguments that were given to us. - * - * @param argc The original ``argc'' argument from main(). - * @param argv The original ``argv'' argument from main(). - * @param env_ptr The original ``env'' variable. - */ -static iovec_t -gm_setproctitle_init(int argc, char *argv, char *env_ptr) -{ - size_t env_count, n; - iovec_t *iov; - - g_assert(argc > 0); - g_assert(argv); - g_assert(env_ptr); - - env_count = string_vec_count(env_ptr); - n = argc + env_count; - iov = iov_alloc_n(n); - - iov_reset_n(iov, n); - - iov_init_from_string_vector(&iov0, n, argv, argc); - iov_init_from_string_vector(&iovargc, n - argc, env_ptr, env_count); - - /* - * Let's see how many argv arguments were contiguous. - */ - { - size_t size; - - size = iov_contiguous_size(iov, n); - g_info("%zu bytes available for gm_setproctitle().", size); - } - - /* - * Scrap references to the arguments. - */ - { - int i; - - for (i = 1; i < argc; i++) - argvi = NULL; - } - - - return iov_get(iov, n); -} -#endif /* !HAS_SETPROCTITLE */ - -/** - * Change the process title as seen by "ps". - */ -void -gm_setproctitle(const char *title) -#if defined(HAS_SETPROCTITLE) -{ - setproctitle("%s", title); -} -#else /* !HAS_SETPROCTITLE */ -{ - static iovec_t *args; - static size_t n; - - if (!args) { - iovec_t iov; - - iov = gm_setproctitle_init(orig_argc, orig_argv, orig_env); - args = cast_to_gpointer(iovec_base(&iov)); /* Solaris has caddr_t */ - n = iovec_len(&iov); - } - - /* Scatter the title over the argv and env elements */ - iov_scatter_string(args, n, title); -} -#endif /* HAS_SETPROCTITLE */ - -/** - * Return the process title as seen by "ps" - */ -const char * -gm_getproctitle(void) -{ - return orig_argv0; -} - #ifdef USE_GLIB1 /* * Emulations for missing routines in glib 1.x to get/set glib's poll function. @@ -583,7 +386,7 @@ static GPollFunc gpoll_func; static gint -compat_poll_wrapper(GPollFD *ufds, guint nfsd, gint timeout) +compat_poll_wrapper(GPollFD *ufds, uint nfsd, int timeout) { return compat_poll((struct pollfd *) ufds, nfsd, timeout); } @@ -609,34 +412,11 @@ } #endif /* USE_GLIB1 */ -/** - * Detects a loop in a singly-linked list. - * - * @return TRUE if the given slist contains a loop; FALSE otherwise. - */ -gboolean -gm_slist_is_looping(const GSList *slist) -{ - const GSList *sl, *p; - - p = slist; - sl = slist; - for (sl = slist; /* NOTHING */; sl = g_slist_next(sl)) { - p = g_slist_next(g_slist_next(p)); - if (p == sl || p == g_slist_next(sl)) { - break; - } - } - - return NULL != p; -} - static void -gm_hash_table_all_keys_helper(gpointer key, - gpointer unused_value, gpointer udata) +gm_hash_table_all_keys_helper(void *key, void *unused_value, void *udata) { GSList **sl_ptr = udata; - + (void) unused_value; *sl_ptr = g_slist_prepend(*sl_ptr, key); } @@ -654,15 +434,14 @@ struct gm_hash_table_foreach_keys_helper { GFunc func; /* Function to call on each key */ - gpointer udata; /* Original user data */ + void *udata; /* Original user data */ }; static void -gm_hash_table_foreach_keys_helper(gpointer key, - gpointer unused_value, gpointer udata) +gm_hash_table_foreach_keys_helper(void *key, void *unused_value, void *udata) { struct gm_hash_table_foreach_keys_helper *hp = udata; - + (void) unused_value; (*hp->func)(key, hp->udata); } @@ -672,7 +451,7 @@ * Apply function to all the keys of the hash table. */ void -gm_hash_table_foreach_key(GHashTable *ht, GFunc func, gpointer user_data) +gm_hash_table_foreach_key(GHashTable *ht, GFunc func, void *user_data) { struct gm_hash_table_foreach_keys_helper hp; @@ -698,11 +477,11 @@ */ static GList * g_list_sort_merge( - GList *l1, GList *l2, GCompareDataFunc compare_func, gpointer user_data) + GList *l1, GList *l2, GCompareDataFunc compare_func, void *user_data) { GList list, *l, *lprev; - l = &list; + l = &list; lprev = NULL; while (l1 && l2) { @@ -716,7 +495,7 @@ l2 = l2->next; } l = l->next; - l->prev = lprev; + l->prev = lprev; lprev = l; } l->next = l1 ? l1 : l2; @@ -732,25 +511,25 @@ */ GList * g_list_sort_with_data( - GList *list, GCompareDataFunc compare_func, gpointer user_data) + GList *list, GCompareDataFunc compare_func, void *user_data) { GList *l1, *l2; - - if (!list) + + if (!list) return NULL; - if (!list->next) + if (!list->next) return list; - - l1 = list; + + l1 = list; l2 = list->next; while ((l2 = l2->next)) { - if (NULL == (l2 = l2->next)) + if (NULL == (l2 = l2->next)) break; l1 = l1->next; } - l2 = l1->next; - l1->next = NULL; + l2 = l1->next; + l1->next = NULL; return g_list_sort_merge( g_list_sort_with_data(list, compare_func, user_data), @@ -796,6 +575,42 @@ } /*** + *** To ease the migration off GSList and GList (still used by the GUI layer). + ***/ + +/** + * Shallow cloning of a GSList into a pslist_t. + */ +pslist_t * +gm_slist_to_pslist(const GSList *list) +{ + const GSList *sl; + pslist_t *pl = NULL; + + GM_SLIST_FOREACH(list, sl) { + pl = pslist_prepend(pl, sl->data); + } + + return pslist_reverse(pl); +} + +/** + * Shallow cloning of a pslist_t into a GSList. + */ +GSList * +gm_pslist_to_slist(const pslist_t *list) +{ + const pslist_t *pl; + GSList *sl = NULL; + + PSLIST_FOREACH(list, pl) { + sl = g_slist_prepend(sl, pl->data); + } + + return g_slist_reverse(sl); +} + +/*** *** This set of routines must be kept at the tail of the file because they *** undefine malloc, g_malloc, etc... which are possibly set up by override.h. ***/ @@ -807,49 +622,49 @@ static GMemVTable gm_vtable; #define GM_VTABLE_METHOD(method, params) \ - (gm_vtable.gmvt_ ## method \ - ? (gm_vtable.gmvt_ ## method params) \ - : (method params)) + gm_vtable. method \ + ? (gm_vtable. method params) \ + : (method params) #undef malloc -static inline ALWAYS_INLINE gpointer -gm_malloc(gulong size) +static inline ALWAYS_INLINE void * +gm_malloc(ulong size) { return GM_VTABLE_METHOD(malloc, (size)); } #undef calloc -static inline ALWAYS_INLINE gpointer -gm_malloc0(gulong size) +static inline ALWAYS_INLINE void * +gm_malloc0(ulong size) { return GM_VTABLE_METHOD(calloc, (1, size)); } #undef realloc -static inline ALWAYS_INLINE gpointer -gm_realloc(gpointer p, gulong size) +static inline ALWAYS_INLINE void * +gm_realloc(void *p, ulong size) { return GM_VTABLE_METHOD(realloc, (p, size)); } #undef free static inline ALWAYS_INLINE void -gm_free(gpointer p) +gm_free(void *p) { return GM_VTABLE_METHOD(free, (p)); } #define try_malloc malloc -static inline ALWAYS_INLINE gpointer -gm_try_malloc(gulong size) +static inline ALWAYS_INLINE void * +gm_try_malloc(ulong size) { return GM_VTABLE_METHOD(try_malloc, (size)); } #undef try_malloc #define try_realloc realloc -static inline ALWAYS_INLINE gpointer -gm_try_realloc(gpointer p, gulong size) +static inline ALWAYS_INLINE void * +gm_try_realloc(void *p, ulong size) { return GM_VTABLE_METHOD(try_realloc, (p, size)); } @@ -864,11 +679,11 @@ ***/ #undef g_malloc -gpointer -g_malloc(gulong size) +void * +g_malloc(ulong size) { if (G_LIKELY(size != 0)) { - gpointer p = gm_malloc(size); + void *p = gm_malloc(size); if (p) return p; @@ -879,12 +694,12 @@ } #undef g_malloc0 -gpointer -g_malloc0(gulong size) +void * +g_malloc0(ulong size) { if (G_LIKELY(size != 0)) { - gpointer p = gm_malloc(size); + void *p = gm_malloc(size); if (p) { memset(p, 0, size); @@ -897,10 +712,10 @@ } #undef g_realloc -gpointer -g_realloc(gpointer p, gulong size) +void * +g_realloc(void *p, ulong size) { - gpointer n; + void *n; if (G_UNLIKELY(0 == size)) { gm_free(p); @@ -918,21 +733,21 @@ #undef g_free void -g_free(gpointer p) +g_free(void *p) { gm_free(p); } #undef g_try_malloc -gpointer -g_try_malloc(gulong size) +void * +g_try_malloc(ulong size) { return size > 0 ? gm_try_malloc(size) : NULL; } #undef g_try_realloc -gpointer -g_try_realloc(gpointer p, gulong size) +void * +g_try_realloc(void *p, ulong size) { return size > 0 ? gm_try_realloc(p, size) : NULL; } @@ -940,10 +755,10 @@ /** * Emulates a calloc(). */ -static gpointer +static void * emulate_calloc(gsize n, gsize m) { - gpointer p; + void *p; if (n > 0 && m > 0 && m < ((size_t) -1) / n) { size_t size = n * m; @@ -961,36 +776,36 @@ * * The vtable only needs to provide malloc(), realloc(), and free() functions; * GLib can provide default implementations of the others. - * The malloc() and realloc() implementations should return NULL on failure, + * The malloc() and realloc() implementations should return NULL on failure, */ void g_mem_set_vtable(GMemVTable *vtable) { - gm_vtable.gmvt_malloc = vtable->gmvt_malloc; - gm_vtable.gmvt_realloc = vtable->gmvt_realloc; - gm_vtable.gmvt_free = vtable->gmvt_free; + gm_vtable.malloc = vtable->malloc; + gm_vtable.realloc = vtable->realloc; + gm_vtable.free = vtable->free; - gm_vtable.gmvt_calloc = vtable->gmvt_calloc - ? vtable->gmvt_calloc + gm_vtable.calloc = vtable->calloc + ? vtable->calloc : emulate_calloc; - gm_vtable.gmvt_try_malloc = vtable->gmvt_try_malloc - ? vtable->gmvt_try_malloc - : vtable->gmvt_malloc; - gm_vtable.gmvt_try_realloc = vtable->gmvt_try_realloc - ? vtable->gmvt_try_realloc - : vtable->gmvt_realloc; + gm_vtable.try_malloc = vtable->try_malloc + ? vtable->try_malloc + : vtable->malloc; + gm_vtable.try_realloc = vtable->try_realloc + ? vtable->try_realloc + : vtable->realloc; } /** * Are we using system's malloc? */ -gboolean +bool g_mem_is_system_malloc(void) { - return NULL == gm_vtable.gmvt_malloc || - cast_pointer_to_func(gm_vtable.gmvt_malloc) == + return NULL == gm_vtable.malloc || + cast_pointer_to_func(gm_vtable.malloc) == cast_pointer_to_func(real_malloc) || - cast_pointer_to_func(gm_vtable.gmvt_malloc) == + cast_pointer_to_func(gm_vtable.malloc) == cast_pointer_to_func(malloc); } #else @@ -1008,7 +823,7 @@ /** * Are we using system's malloc? */ -gboolean +bool g_mem_is_system_malloc(void) { return TRUE; /* Remapping is not possible natively with glib1 */ @@ -1019,7 +834,7 @@ /** * Safe reallocation routine during final memory cleanup. */ -static inline void * +static inline void * G_UNUSED safe_realloc(void *p, size_t len) { if (NULL == p) { @@ -1036,7 +851,7 @@ /** * Safe free routine during final memory cleanup. */ -static inline void +static inline void G_UNUSED safe_free(void *unused_p) { (void) unused_p; @@ -1066,15 +881,13 @@ if (g_mem_is_system_malloc()) return; -#if GLIB_CHECK_VERSION(2,0,0) +#undef malloc +#undef realloc +#undef free + vtable.malloc = real_malloc; vtable.realloc = safe_realloc; vtable.free = safe_free; -#else /* GLib < 2.0.0 */ - vtable.gmvt_malloc = real_malloc; - vtable.gmvt_realloc = safe_realloc; - vtable.gmvt_free = safe_free; -#endif /* GLib >= 2.0.0 */ g_mem_set_vtable(&vtable);
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/glib-missing.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/glib-missing.h
Changed
@@ -49,16 +49,16 @@ #endif #ifdef USE_GLIB1 -typedef gboolean (*GEqualFunc)(gconstpointer a, gconstpointer b); +typedef bool (*GEqualFunc)(const void *a, const void *b); typedef struct GMemVTable { - gpointer (*gmvt_malloc) (gsize n_bytes); - gpointer (*gmvt_realloc) (gpointer mem, gsize n_bytes); - void (*gmvt_free) (gpointer mem); + void * (*malloc) (gsize n_bytes); + void * (*realloc) (void *mem, gsize n_bytes); + void (*free) (void *mem); /* optional */ - gpointer (*gmvt_calloc) (gsize n_blocks, gsize n_block_bytes); - gpointer (*gmvt_try_malloc) (gsize n_bytes); - gpointer (*gmvt_try_realloc) (gpointer mem, gsize n_bytes); + void * (*calloc) (gsize n_blocks, gsize n_block_bytes); + void * (*try_malloc) (gsize n_bytes); + void * (*try_realloc) (void *mem, gsize n_bytes); } GMemVTable; #endif @@ -68,27 +68,25 @@ void gm_mem_set_safe_vtable(void); -gboolean gm_slist_is_looping(const GSList *slist); -GSList *gm_slist_insert_after(GSList *list, GSList *lnk, gpointer data); - -GList *gm_list_insert_after(GList *list, GList *lnk, gpointer data); +GSList *gm_slist_insert_after(GSList *list, GSList *lnk, void *data); +GList *gm_list_insert_after(GList *list, GList *lnk, void *data); #ifdef USE_GLIB1 GList *g_list_delete_link(GList *l, GList *lnk); GSList *g_slist_delete_link(GSList *sl, GSList *lnk); -GList *g_list_insert_before(GList *l, GList *lk, gpointer data); +GList *g_list_insert_before(GList *l, GList *lk, void *data); -void g_hash_table_replace(GHashTable *ht, gpointer key, gpointer value); -gboolean gm_hash_table_remove(GHashTable *ht, gconstpointer key); +void g_hash_table_replace(GHashTable *ht, void *key, void *value); +bool gm_hash_table_remove(GHashTable *ht, const void *key); void g_mem_set_vtable(GMemVTable *vtable); -gboolean g_mem_is_system_malloc(void); +bool g_mem_is_system_malloc(void); typedef int (*GCompareDataFunc) - (gconstpointer a, gconstpointer b, gpointer user_data); + (const void *a, const void *b, void *user_data); GList *g_list_sort_with_data( - GList *l, GCompareDataFunc cmp, gpointer user_data); + GList *l, GCompareDataFunc cmp, void *user_data); typedef void *GMainContext; @@ -105,6 +103,53 @@ */ #ifndef USE_GLIB2 +/* + * (Copied from BSD man pages) + * + * NAME + * + * strlcpy, strlcat -- size-bounded string copying and concatenation + * + * DESCRIPTION + * + * The strlcpy() and strlcat() functions copy and concatenate strings + * respectively. They are designed to be safer, more consistent, and less + * error prone replacements for strncpy(3) and strncat(3). Unlike those + * functions, strlcpy() and strlcat() take the full size of the buffer (not + * just the length) and guarantee to NUL-terminate the result (as long as + * size is larger than 0 or, in the case of strlcat(), as long as there is + * at least one byte free in dst). Note that a byte for the NUL should be + * included in size. Also note that strlcpy() and strlcat() only operate on + * true ``C'' strings. This means that for strlcpy() src must be NUL-termi- + * nated and for strlcat() both src and dst must be NUL-terminated. + * + * The strlcpy() function copies up to size - 1 characters from the NUL-ter- + * minated string src to dst, NUL-terminating the result. + * + * The strlcat() function appends the NUL-terminated string src to the end + * of dst. It will append at most size - strlen(dst) - 1 bytes, NUL-termi- + * nating the result. + * + * The source and destination strings should not overlap, as the behavior is + * undefined. + * + * RETURN VALUES + * + * The strlcpy() and strlcat() functions return the total length of the + * string they tried to create. For strlcpy() that means the length of src. + * For strlcat() that means the initial length of dst plus the length of + * src. While this may seem somewhat confusing, it was done to make trunca- + * tion detection simple. + * + * Note however, that if strlcat() traverses size characters without finding + * a NUL, the length of the string is considered to be size and the destina- + * tion string will not be NUL-terminated (since there was no space for the + * NUL). This keeps strlcat() from running off the end of a string. In + * practice this should not happen (as it means that either size is incor- + * rect or that dst is not a proper ``C'' string). The check exists to pre- + * vent potential security problems in incorrect code. + */ + #ifndef HAS_STRLCPY size_t strlcpy(char *dst, const char *src, size_t dst_size); #endif /* HAS_STRLCPY */ @@ -121,44 +166,44 @@ void gm_list_free_null(GList **l_ptr); void gm_hash_table_destroy_null(GHashTable **h_ptr); -size_t gm_vsnprintf(char *str, size_t n, char const *fmt, va_list args); +size_t gm_vsnprintf(char *str, size_t n, char const *fmt, va_list args) + G_PRINTF(3, 0); size_t gm_snprintf(char *str, size_t n, - char const *fmt, ...) G_GNUC_PRINTF(3, 4); + char const *fmt, ...) G_PRINTF(3, 4); size_t gm_snprintf_unchecked(char *dst, size_t size, - const char *fmt, ...); /* No G_GNUC_PRINTF here, on purpose! */ + const char *fmt, ...); /* No G_PRINTF here, on purpose! */ -void gm_savemain(int argc, char **argv, char **env); -int gm_dupmain(const char ***argv_ptr, const char ***env_ptr); -const char *gm_getproctitle(void); -void gm_setproctitle(const char *title); +struct pslist *gm_slist_to_pslist(const GSList *sl); +GSList *gm_pslist_to_slist(const struct pslist *sl); -static inline gboolean -gm_hash_table_contains(GHashTable *ht, gconstpointer key) +static inline bool +gm_hash_table_contains(GHashTable *ht, const void *key) { return g_hash_table_lookup_extended(ht, key, NULL, NULL); } static inline void gm_hash_table_insert_const(GHashTable *ht, - gconstpointer key, gconstpointer value) + const void *key, const void *value) { - g_hash_table_insert(ht, (gpointer) key, (gpointer) value); + g_hash_table_insert(ht, deconstify_pointer(key), deconstify_pointer(value)); } static inline void gm_hash_table_replace_const(GHashTable *ht, - gconstpointer key, gconstpointer value) + const void *key, const void *value) { - g_hash_table_replace(ht, (gpointer) key, (gpointer) value); + g_hash_table_replace(ht, + deconstify_pointer(key), deconstify_pointer(value)); } GSList *gm_hash_table_all_keys(GHashTable *ht); -void gm_hash_table_foreach_key(GHashTable *ht, GFunc func, gpointer user_data); +void gm_hash_table_foreach_key(GHashTable *ht, GFunc func, void *user_data); static inline GSList * -gm_slist_prepend_const(GSList *sl, gconstpointer value) +gm_slist_prepend_const(GSList *sl, const void *value) { - return g_slist_prepend(sl, (gpointer) value); + return g_slist_prepend(sl, deconstify_pointer(value)); } /* @@ -183,7 +228,7 @@ #define G_LIST_FOREACH_WITH_DATA(list, func, user_data) \ G_STMT_START { \ GList *l_ = (list); \ - gpointer user_data_ = (user_data); \ + void *user_data_ = (user_data); \ while (NULL != l_) { \ func(l_->data, user_data_); \ l_ = g_list_next(l_); \ @@ -193,7 +238,7 @@ #define G_LIST_FOREACH_SWAPPED(list, func, user_data) \ G_STMT_START { \ GList *l_ = (list); \ - gpointer user_data_ = (user_data); \ + void *user_data_ = (user_data); \ while (NULL != l_) { \ func(user_data_, l_->data); \ l_ = g_list_next(l_); \ @@ -214,7 +259,7 @@ #define G_SLIST_FOREACH_WITH_DATA(slist, func, user_data) \ G_STMT_START { \ GSList *sl_ = (slist); \ - gpointer user_data_ = (user_data); \ + void *user_data_ = (user_data); \ while (NULL != sl_) { \ func(sl_->data, user_data_); \ sl_ = g_slist_next(sl_); \ @@ -226,7 +271,7 @@ #define G_SLIST_FOREACH_SWAPPED(slist, func, user_data) \ G_STMT_START { \ GSList *sl_ = (slist); \ - gpointer user_data_ = (user_data); \ + void *user_data_ = (user_data); \ while (NULL != sl_) { \ func(user_data_, sl_->data); \ sl_ = g_slist_next(sl_); \
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/glog.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/glog.c
Changed
@@ -36,6 +36,7 @@ #include "glog.h" #include "log.h" #include "str.h" +#include "thread.h" #include "override.h" /* Must be the last header included */ @@ -58,27 +59,38 @@ void gl_logv(const char *domain, GLogLevelFlags flags, const char *fmt, va_list args) { - static str_t *msg; - static gboolean logging; + static str_t *msgTHREAD_MAX; + static bool loggingTHREAD_MAX; + unsigned stid = thread_small_id(); - if (logging) { + G_IGNORE_PUSH(-Wformat-nonliteral); /* s_minilogv() call below */ + + if (loggingstid) { s_minilogv(flags | G_LOG_FLAG_RECURSION, FALSE, fmt, args); return; } - logging = TRUE; + G_IGNORE_POP; + + /* + * This call is thread-unsafe by construction, and supposed to be called + * only from the main thread. This is why it's OK to have a global + * ``logging'' variable. + */ + + loggingstid = TRUE; - if G_UNLIKELY(NULL == msg) - msg = str_new_not_leaking(0); + if G_UNLIKELY(NULL == msgstid) + msgstid = str_new_not_leaking(0); - str_vprintf(msg, fmt, args); + str_vprintf(msgstid, fmt, args); if (handler_cb != NULL) - (*handler_cb)(domain, flags, str_2c(msg), handler_data); + (*handler_cb)(domain, flags, str_2c(msgstid), handler_data); else - s_minilog(flags, "%s", str_2c(msg)); + s_minilog(flags, "%s", str_2c(msgstid)); - logging = FALSE; + loggingstid = FALSE; } /**
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/glog.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/glog.h
Changed
@@ -34,7 +34,8 @@ #ifndef _glog_h_ #define _glog_h_ -#include "lib/stacktrace.h" /* For stacktrace_caller_known() */ +#include "stacktrace.h" /* For stacktrace_caller_known() */ +#include "log.h" /* For log_abort() */ /* * Trap all glib-defined logging and redirect them to our own. @@ -125,7 +126,7 @@ G_LOG_LEVEL_DEBUG, \ format) #else /* !__GNUC__ */ -static inline G_GNUC_PRINTF(1, 2) void +static inline void G_PRINTF(1, 2) g_carp(const char *format, ...) { va_list args; @@ -135,7 +136,7 @@ stacktrace_where_sym_print(stderr); } -static inline G_GNUC_PRINTF(1, 2) void +static inline void G_PRINTF(1, 2) g_carp_once(const char *format, ...) { if (!stacktrace_caller_known(1)) { @@ -147,17 +148,17 @@ } } -static inline G_GNUC_PRINTF(1, 2) void +static inline void G_PRINTF(1, 2) g_error(const char *format, ...) { va_list args; va_start(args, format); gl_logv(G_LOG_DOMAIN, G_LOG_LEVEL_ERROR | G_LOG_FLAG_FATAL, format, args); va_end(args); - raise(SIGABRT); + log_abort(); } -static inline G_GNUC_PRINTF(1, 2) void +static inline void G_PRINTF(1, 2) g_critical(const char *format, ...) { va_list args; @@ -166,7 +167,7 @@ va_end(args); } -static inline G_GNUC_PRINTF(1, 2) void +static inline void G_PRINTF(1, 2) g_warning(const char *format, ...) { va_list args; @@ -175,7 +176,7 @@ va_end(args); } -static inline G_GNUC_PRINTF(1, 2) void +static inline void G_PRINTF(1, 2) g_message(const char *format, ...) { va_list args; @@ -184,7 +185,7 @@ va_end(args); } -static inline G_GNUC_PRINTF(1, 2) void +static inline void G_PRINTF(1, 2) g_info(const char *format, ...) { va_list args; @@ -193,7 +194,7 @@ va_end(args); } -static inline G_GNUC_PRINTF(1, 2) void +static inline void G_PRINTF(1, 2) g_debug(const char *format, ...) { va_list args; @@ -214,9 +215,9 @@ void gl_logv(const char *domain, GLogLevelFlags flags, const char *format, va_list args); void gl_log(const char *domain, GLogLevelFlags flags, - const char *format, ...) G_GNUC_PRINTF(3, 4); + const char *format, ...) G_PRINTF(3, 4); void gl_error(const char *domain, const char *format, ...) - G_GNUC_PRINTF(2, 3) G_GNUC_NORETURN; + G_PRINTF(2, 3) G_NORETURN; #endif /* _glog_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/gnet_host.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/gnet_host.c
Changed
@@ -44,7 +44,7 @@ * byte long. Instead, gnet_host_length(p) MUST be used to determine the * actual length required to represent the host. * - * It follows that no struct copy must occur between to gnet_host_t pointers. + * It follows that no struct copy must occur between two gnet_host_t pointers. * Always use gnet_host_copy(). * * @author Raphael Manfredi @@ -58,10 +58,14 @@ #include "common.h" #include "gnet_host.h" + #include "atoms.h" -#include "stringify.h" +#include "buf.h" +#include "hashing.h" +#include "mempcpy.h" #include "sequence.h" #include "str.h" +#include "stringify.h" #include "walloc.h" #include "override.h" /* Must be the last header included */ @@ -71,27 +75,64 @@ ***/ /** - * Hash function for use in g_hash_table_new. + * Hash function for use in hash tables and sets. + */ +uint G_HOT +gnet_host_hash(const void *key) +{ + const gnet_host_t *host = key; + host_addr_t addr; + uint16 port; + + addr = gnet_host_get_addr(host); + port = gnet_host_get_port(host); + return host_addr_port_hash(addr, port); +} + +/** + * Alternative hash function for use in hash table and sets. */ -G_GNUC_HOT guint -gnet_host_hash(gconstpointer key) +uint G_HOT +gnet_host_hash2(const void *key) { const gnet_host_t *host = key; host_addr_t addr; - guint16 port; + uint16 port; addr = gnet_host_get_addr(host); port = gnet_host_get_port(host); - return host_addr_hash(addr) ^ ((port << 16) | port); + return host_addr_port_hash2(addr, port); +} + +/** + * Compare function which returns TRUE if the hosts are equivalent. + * + * @note + * The host addresses need not be equal if the conversion to an IPv4 address + * makes one of them equivalent to the other. + * + * @attention + * This routine compares the addreses in a way that makes it unsuitable for + * hash tables or sets because we're not testing for true equality, rather + * for equivalence modulo an IPv6 to IPv4 conversion. Therefore, it breaks the + * implicit assumption that equal items will hash to the same value! + */ +bool +gnet_host_equiv(const void *v1, const void *v2) +{ + const gnet_host_t *h1 = v1, *h2 = v2; + + return gnet_host_get_port(h1) == gnet_host_get_port(h2) && + host_addr_equiv(gnet_host_get_addr(h1), gnet_host_get_addr(h2)); } /** * Compare function which returns TRUE if the hosts are equal. * - * @note For use in g_hash_table_new. + * @note For use in hash tables and sets. */ -G_GNUC_HOT int -gnet_host_eq(gconstpointer v1, gconstpointer v2) +bool +gnet_host_equal(const void *v1, const void *v2) { const gnet_host_t *h1 = v1, *h2 = v2; @@ -100,14 +141,14 @@ } /** - * Compare function which returns 0 if the hosts are equal, otherwise 1. - * - * @note For use in g_list_find_custom. + * Compare function which returns TRUE if the host addresses are equivalent. */ -int -gnet_host_cmp(gconstpointer v1, gconstpointer v2) +bool +gnet_host_addr_equiv(const void *v1, const void *v2) { - return gnet_host_eq(v1, v2) ? 0 : 1; + const gnet_host_t *h1 = v1, *h2 = v2; + + return host_addr_equiv(gnet_host_get_addr(h1), gnet_host_get_addr(h2)); } /** @@ -129,7 +170,7 @@ * Create a host for given address and port */ gnet_host_t * -gnet_host_new(const host_addr_t addr, guint16 port) +gnet_host_new(const host_addr_t addr, uint16 port) { gnet_host_t h; @@ -182,7 +223,7 @@ * Free host, version suitable for iterators (additional callback arg unused). */ void -gnet_host_free_item(gpointer key, gpointer unused_data) +gnet_host_free_item(void *key, void *unused_data) { gnet_host_t *h = key; (void) unused_data; @@ -204,7 +245,9 @@ gnet_host_to_string_buf(const gnet_host_t *h, void *buf, size_t len) { host_addr_t addr; - guint16 port; + uint16 port; + + g_assert(h != NULL); packed_host_unpack_addr(&h->data, &addr); port = gnet_host_get_port(h); @@ -218,10 +261,11 @@ const char * gnet_host_to_string(const gnet_host_t *h) { - static char bufHOST_ADDR_PORT_BUFLEN; + buf_t *b = buf_private(G_STRFUNC, HOST_ADDR_PORT_BUFLEN); + char *p = buf_data(b); - gnet_host_to_string_buf(h, buf, sizeof buf); - return buf; + gnet_host_to_string_buf(h, p, buf_size(b)); + return p; } /** @@ -230,10 +274,11 @@ const char * gnet_host_to_string2(const gnet_host_t *h) { - static char bufHOST_ADDR_PORT_BUFLEN; + buf_t *b = buf_private(G_STRFUNC, HOST_ADDR_PORT_BUFLEN); + char *p = buf_data(b); - gnet_host_to_string_buf(h, buf, sizeof buf); - return buf; + gnet_host_to_string_buf(h, p, buf_size(b)); + return p; } /** @@ -247,7 +292,7 @@ * @return pointer following serialization data. */ void * -host_ip_port_poke(void *p, const host_addr_t addr, guint16 port, size_t *len) +host_ip_port_poke(void *p, const host_addr_t addr, uint16 port, size_t *len) { void *q = p; @@ -256,8 +301,7 @@ q = poke_be32(q, host_addr_ipv4(addr)); break; case NET_TYPE_IPV6: - memcpy(q, host_addr_ipv6(&addr), sizeof addr.addr.ipv6); - q = ptr_add_offset(q, sizeof addr.addr.ipv6); + q = mempcpy(q, host_addr_ipv6(&addr), sizeof addr.addr.ipv6); break; case NET_TYPE_LOCAL: case NET_TYPE_NONE: @@ -280,7 +324,7 @@ */ void host_ip_port_peek(const void *p, enum net_type nt, - host_addr_t *addr, guint16 *port) + host_addr_t *addr, uint16 *port) { const void *q = p; @@ -311,9 +355,9 @@ if (*vec_ptr) { gnet_host_vec_t *vec = *vec_ptr; - - WFREE_NULL(vec->hvec_v4, vec->n_ipv4 * sizeof vec->hvec_v40); - WFREE_NULL(vec->hvec_v6, vec->n_ipv6 * sizeof vec->hvec_v60); + + WFREE_ARRAY_NULL(vec->hvec_v4, vec->n_ipv4); + WFREE_ARRAY_NULL(vec->hvec_v6, vec->n_ipv6); WFREE(vec); *vec_ptr = NULL; } @@ -326,7 +370,7 @@ gnet_host_vec_to_string(const gnet_host_vec_t *hvec) { str_t *s; - guint i, n; + uint i, n; g_return_val_if_fail(hvec, NULL); @@ -337,7 +381,7 @@ gchar buf128; if (i > 0) { - str_cat(s, ", "); + STR_CAT(s, ", "); } host = gnet_host_vec_get(hvec, i); host_addr_port_to_string_buf(gnet_host_get_addr(&host), @@ -371,14 +415,10 @@ g_return_val_if_fail(vec->n_ipv4 + vec->n_ipv6 > 0, NULL); vec_copy = wcopy(vec, sizeof *vec); - if (vec->n_ipv4 > 0) { - vec_copy->hvec_v4 = wcopy(vec->hvec_v4, - vec->n_ipv4 * sizeof vec->hvec_v40); - } - if (vec->n_ipv6 > 0) { - vec_copy->hvec_v6 = wcopy(vec->hvec_v6, - vec->n_ipv6 * sizeof vec->hvec_v60); - } + if (vec->n_ipv4 > 0) + vec_copy->hvec_v4 = WCOPY_ARRAY(vec->hvec_v4, vec->n_ipv4); + if (vec->n_ipv6 > 0) + vec_copy->hvec_v6 = WCOPY_ARRAY(vec->hvec_v6, vec->n_ipv6); return vec_copy; } @@ -387,8 +427,8 @@ * * @return TRUE if the host vector already contains it. */ -gboolean -gnet_host_vec_contains(gnet_host_vec_t *vec, host_addr_t addr, guint16 port) +bool +gnet_host_vec_contains(gnet_host_vec_t *vec, host_addr_t addr, uint16 port) { size_t i; @@ -397,9 +437,9 @@ switch (host_addr_net(addr)) { case NET_TYPE_IPV4: for (i = 0; i < vec->n_ipv4; i++) { - char *dest = cast_to_gpointer(&vec->hvec_v4i); - guint32 ip = peek_be32(&dest0); - guint16 pt = peek_le16(&dest4); + char *dest = cast_to_pointer(&vec->hvec_v4i); + uint32 ip = peek_be32(&dest0); + uint16 pt = peek_le16(&dest4); if (pt == port && host_addr_ipv4(addr) == ip) return TRUE; @@ -407,8 +447,8 @@ break; case NET_TYPE_IPV6: for (i = 0; i < vec->n_ipv6; i++) { - char *dest = cast_to_gpointer(&vec->hvec_v6i); - guint16 pt = peek_le16(&dest16); + char *dest = cast_to_pointer(&vec->hvec_v6i); + uint16 pt = peek_le16(&dest16); if (pt == port && 0 == memcmp(dest, host_addr_ipv6(&addr), 16)) return TRUE; @@ -426,7 +466,7 @@ * Add new host (identified by address and port) to the Gnutella host vector. */ void -gnet_host_vec_add(gnet_host_vec_t *vec, host_addr_t addr, guint16 port) +gnet_host_vec_add(gnet_host_vec_t *vec, host_addr_t addr, uint16 port) { g_return_if_fail(vec); @@ -435,12 +475,12 @@ if (vec->n_ipv4 < 255) { size_t size, old_size; char *dest; - + old_size = vec->n_ipv4 * sizeof vec->hvec_v40; size = old_size + sizeof vec->hvec_v40; vec->hvec_v4 = wrealloc(vec->hvec_v4, old_size, size); - dest = cast_to_gpointer(&vec->hvec_v4vec->n_ipv4++); + dest = cast_to_pointer(&vec->hvec_v4vec->n_ipv4++); poke_be32(&dest0, host_addr_ipv4(addr)); poke_le16(&dest4, port); } @@ -449,14 +489,14 @@ if (vec->n_ipv6 < 255) { size_t size, old_size; char *dest; - + old_size = vec->n_ipv6 * sizeof vec->hvec_v60; size = old_size + sizeof vec->hvec_v60; vec->hvec_v6 = wrealloc(vec->hvec_v6, old_size, size); - dest = cast_to_gpointer(&vec->hvec_v6vec->n_ipv6++); - memcpy(dest, host_addr_ipv6(&addr), 16); - poke_le16(&dest16, port); + dest = cast_to_pointer(&vec->hvec_v6vec->n_ipv6++); + dest = mempcpy(dest, host_addr_ipv6(&addr), 16); + poke_le16(dest, port); } break; case NET_TYPE_LOCAL: @@ -473,7 +513,7 @@ { sequence_iter_t *iter; gnet_host_vec_t *vec; - guint n_ipv6 = 0, n_ipv4 = 0, hcnt; + uint n_ipv6 = 0, n_ipv4 = 0, hcnt; if (sequence_is_empty(s)) return NULL; @@ -505,12 +545,10 @@ vec->n_ipv4 = MIN(n_ipv4, 255); vec->n_ipv6 = MIN(n_ipv6, 255); - if (vec->n_ipv4 > 0) { - vec->hvec_v4 = walloc(vec->n_ipv4 * sizeof vec->hvec_v40); - } - if (vec->n_ipv6 > 0) { - vec->hvec_v6 = walloc(vec->n_ipv6 * sizeof vec->hvec_v60); - } + if (vec->n_ipv4 > 0) + WALLOC_ARRAY(vec->hvec_v4, vec->n_ipv4); + if (vec->n_ipv6 > 0) + WALLOC_ARRAY(vec->hvec_v6, vec->n_ipv6); n_ipv4 = 0; n_ipv6 = 0; @@ -519,21 +557,21 @@ while (sequence_iter_has_next(iter)) { const gnet_host_t *host = sequence_iter_next(iter); host_addr_t addr = gnet_host_get_addr(host); - guint16 port = gnet_host_get_port(host); - + uint16 port = gnet_host_get_port(host); + switch (gnet_host_get_net(host)) { case NET_TYPE_IPV4: if (n_ipv4 < vec->n_ipv4) { - char *dest = cast_to_gpointer(&vec->hvec_v4n_ipv4++); + char *dest = cast_to_pointer(&vec->hvec_v4n_ipv4++); poke_be32(&dest0, host_addr_ipv4(addr)); poke_le16(&dest4, port); } break; case NET_TYPE_IPV6: if (n_ipv6 < vec->n_ipv6) { - char *dest = cast_to_gpointer(&vec->hvec_v6n_ipv6++); - memcpy(dest, host_addr_ipv6(&addr), 16); - poke_le16(&dest16, port); + char *dest = cast_to_pointer(&vec->hvec_v6n_ipv6++); + dest = mempcpy(dest, host_addr_ipv6(&addr), 16); + poke_le16(dest, port); } break; case NET_TYPE_LOCAL: @@ -557,6 +595,17 @@ } /** + * Create a new Gnutella host vector out of a pslist_t of gnet_host_t items. + */ +gnet_host_vec_t * +gnet_host_vec_from_pslist(pslist_t *pl) +{ + sequence_t seq; + + return gnet_host_vec_from_sequence(sequence_fill_from_pslist(&seq, pl)); +} + +/** * Create a new Gnutella host vector out of a GSList of gnet_host_t items. */ gnet_host_vec_t *
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/gnet_host.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/gnet_host.h
Changed
@@ -42,6 +42,7 @@ #include "hashlist.h" #include "host_addr.h" +#include "pslist.h" #include "vector.h" /** @@ -51,13 +52,13 @@ struct packed_host data; } gnet_host_t; -gnet_host_t *gnet_host_new(const host_addr_t addr, guint16 port); +gnet_host_t *gnet_host_new(const host_addr_t addr, uint16 port); gnet_host_t *gnet_host_dup(const gnet_host_t *h); size_t gnet_host_length(const void *p); void gnet_host_free(void *h); void gnet_host_free_atom(void *h); void gnet_host_free_atom2(void *h, void *unused); -void gnet_host_free_item(gpointer key, gpointer unused_data); +void gnet_host_free_item(void *key, void *unused_data); /** * This routine MUST only be used on a gnet_host_t variable, that is to @@ -68,7 +69,7 @@ * that is stored within. */ static inline void -gnet_host_set(gnet_host_t *h, const host_addr_t addr, guint16 port) +gnet_host_set(gnet_host_t *h, const host_addr_t addr, uint16 port) { h->data = host_pack(addr, port); } @@ -95,25 +96,25 @@ return addr; } -static inline G_GNUC_PURE ALWAYS_INLINE guint16 +static inline G_PURE ALWAYS_INLINE uint16 gnet_host_get_port(const gnet_host_t *h) { return peek_be16(&h->data.port); } -static inline G_GNUC_PURE enum net_type +static inline G_PURE enum net_type gnet_host_get_net(const gnet_host_t *h) { return h->data.ha.net; } -static inline G_GNUC_PURE gboolean +static inline G_PURE bool gnet_host_is_ipv4(const gnet_host_t *h) { return NET_TYPE_IPV4 == h->data.ha.net; } -static inline G_GNUC_PURE gboolean +static inline G_PURE bool gnet_host_is_ipv6(const gnet_host_t *h) { return NET_TYPE_IPV6 == h->data.ha.net; @@ -128,20 +129,22 @@ * Gnutella host hashing and comparison functions. */ -guint gnet_host_hash(gconstpointer key) G_GNUC_PURE; -int gnet_host_eq(gconstpointer v1, gconstpointer v2) G_GNUC_PURE; -int gnet_host_cmp(gconstpointer v1, gconstpointer v2) G_GNUC_PURE; +uint gnet_host_hash(const void *key) G_PURE; +uint gnet_host_hash2(const void *key) G_PURE; +bool gnet_host_equiv(const void *v1, const void *v2) G_PURE; +bool gnet_host_equal(const void *v1, const void *v2) G_PURE; +bool gnet_host_addr_equiv(const void *v1, const void *v2) G_PURE; /* * Serialized IPv4 and IPv6 Gnutella hosts. */ typedef struct { - guint8 data4 + 2; /* IPv4 address (BE) + Port (LE) */ + uint8 data4 + 2; /* IPv4 address (BE) + Port (LE) */ } gnet_ipv4_host_t; typedef struct { - guint8 data16 + 2; /* IPv6 address + Port (LE) */ + uint8 data16 + 2; /* IPv6 address + Port (LE) */ } gnet_ipv6_host_t; /* @@ -150,25 +153,25 @@ typedef struct gnet_host_vec { gnet_ipv4_host_t *hvec_v4; /**< Vector of alternate IPv4 locations */ gnet_ipv6_host_t *hvec_v6; /**< Vector of alternate IPv6 locations */ - guint8 n_ipv4; /**< Amount of hosts in IPv4 vector */ - guint8 n_ipv6; /**< Amount of hosts in IPv6 vector */ + uint8 n_ipv4; /**< Amount of hosts in IPv4 vector */ + uint8 n_ipv6; /**< Amount of hosts in IPv6 vector */ } gnet_host_vec_t; static inline int gnet_host_vec_count(const gnet_host_vec_t *hvec) { - return UNSIGNED(hvec->n_ipv4) + hvec->n_ipv6; + return UNSIGNED(hvec->n_ipv4) + hvec->n_ipv6; } /** * @return the ith element of the Gnutella host vector. */ static inline gnet_host_t -gnet_host_vec_get(const gnet_host_vec_t *hvec, guint i) +gnet_host_vec_get(const gnet_host_vec_t *hvec, uint i) { gnet_host_t host; host_addr_t addr; - guint16 port; + uint16 port; g_assert(i < UNSIGNED(gnet_host_vec_count(hvec))); @@ -190,9 +193,10 @@ gnet_host_vec_t *gnet_host_vec_alloc(void); void gnet_host_vec_free(gnet_host_vec_t **vec_ptr); gnet_host_vec_t *gnet_host_vec_copy(const gnet_host_vec_t *); -gboolean gnet_host_vec_contains(gnet_host_vec_t *, host_addr_t, guint16); -void gnet_host_vec_add(gnet_host_vec_t *, host_addr_t addr, guint16 port); +bool gnet_host_vec_contains(gnet_host_vec_t *, host_addr_t, uint16); +void gnet_host_vec_add(gnet_host_vec_t *, host_addr_t addr, uint16 port); gnet_host_vec_t *gnet_host_vec_from_gslist(GSList *); +gnet_host_vec_t *gnet_host_vec_from_pslist(pslist_t *); gnet_host_vec_t *gnet_host_vec_from_hash_list(hash_list_t *); gnet_host_vec_t *gnet_host_vec_from_vector(vector_t *); @@ -200,9 +204,9 @@ * Gnutella-style addr:port serialization routines (port as little-endian). */ -void *host_ip_port_poke(void *p, const host_addr_t ha, guint16 port, size_t *l); +void *host_ip_port_poke(void *p, const host_addr_t ha, uint16 port, size_t *l); void host_ip_port_peek(const void *p, enum net_type nt, - host_addr_t *addr, guint16 *port); + host_addr_t *addr, uint16 *port); #endif /* _gnet_host_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/halloc.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/halloc.c
Changed
@@ -43,17 +43,26 @@ #include "common.h" #include "halloc.h" -#include "hashtable.h" -#include "pagetable.h" + +#include "atomic.h" #include "concat.h" -#include "misc.h" +#include "dump_options.h" +#include "glib-missing.h" +#include "hashtable.h" #include "malloc.h" -#include "walloc.h" +#include "mempcpy.h" +#include "misc.h" +#include "once.h" +#include "pagetable.h" +#include "spinlock.h" +#include "stringify.h" +#include "thread.h" #include "unsigned.h" #include "vmm.h" -#include "zalloc.h" /* Only for possible zalloc_shift_pointer() */ +#include "walloc.h" +#include "zalloc.h" /* For zalloc_shift_pointer() */ +#include "xmalloc.h" /* In case halloc() is disabled at runtime */ -#include "glib-missing.h" #include "override.h" /* Must be the last header included */ /* @@ -66,8 +75,45 @@ #endif /* REMAP_ZALLOC || TRACK_MALLOC */ #endif /* USE_HALLOC */ -static size_t bytes_allocated; /* Amount of bytes allocated */ -static size_t chunks_allocated; /* Amount of chunks allocated */ +/** + * Internal statistics collected. + */ +static struct hstats { + uint64 allocations; /**< Total # of allocations */ + AU64(allocations_zeroed); /**< Total # of zeroed allocations */ + uint64 alloc_via_walloc; /**< Allocations from walloc() */ + uint64 alloc_via_xpmalloc; /**< Allocations from xpmalloc() */ + uint64 alloc_via_vmm; /**< Allocations from VMM */ + uint64 freeings; /**< Total # of freeings */ + AU64(reallocs); /**< Total # of reallocs */ + AU64(realloc_noop); /**< Nothing to do */ + uint64 realloc_via_wrealloc; /**< Reallocs handled by wrealloc() */ + uint64 realloc_via_xprealloc; /**< Reallocs handled by xprealloc() */ + AU64(realloc_via_copy); /**< Reallocs handled by copy */ + uint64 realloc_via_vmm_shrink; /**< Shrunk VMM region */ + AU64(realloc_noop_same_vmm); /**< Same VMM size */ + AU64(realloc_relocatable); /**< Forced relocation for VMM */ + uint64 wasted_cumulative; /**< Cumulated allocation waste */ + uint64 wasted_cumulative_walloc; /**< Cumulated waste for walloc */ + uint64 wasted_cumulative_xpmalloc; /**< Cumulated waste for xpmalloc */ + uint64 wasted_cumulative_vmm; /**< Cumulated waste for VMM allocs */ + size_t memory; /**< Amount of bytes allocated */ + size_t blocks; /**< Amount of blocks allocated */ + /* Counter to prevent digest from being the same twice in a row */ + AU64(halloc_stats_digest); +} hstats; +static spinlock_t hstats_slk = SPINLOCK_INIT; + +#define HSTATS_LOCK spinlock_hidden(&hstats_slk) +#define HSTATS_UNLOCK spinunlock_hidden(&hstats_slk) + +#define HSTATS_INCX(x) AU64_INC(&hstats.x) + +enum halloc_type { + HALLOC_WALLOC, + HALLOC_VMM, + HALLOC_XPMALLOC +}; #if !defined(REMAP_ZALLOC) && !defined(TRACK_MALLOC) @@ -75,61 +121,104 @@ static page_table_t *pt_pages; static hash_table_t *ht_pages; static size_t walloc_threshold; /* walloc() size upper limit */ +static size_t xpmalloc_threshold; /* xpmalloc() size upper limit */ +static size_t halloc_pagesize; +static bool halloc_disabled; -union align { +union halign { size_t size; char bytesMEM_ALIGNBYTES; }; +static spinlock_t hpage_slk = SPINLOCK_INIT; + +#define HPAGE_LOCK spinlock(&hpage_slk) +#define HPAGE_UNLOCK spinunlock(&hpage_slk) + static inline size_t -page_lookup(void *p) +page_lookup(const void *p) { + size_t result; + + HPAGE_LOCK; if (use_page_table) { - return page_table_lookup(pt_pages, p); + result = page_table_lookup(pt_pages, p); } else { - return (size_t) hash_table_lookup(ht_pages, p); + result = (size_t) hash_table_lookup(ht_pages, p); } + HPAGE_UNLOCK; + + return result; } static inline int -page_insert(void *p, size_t size) +page_insert(const void *p, size_t size) { + int result; + + g_assert(size != 0); + + HPAGE_LOCK; if (use_page_table) { - return page_table_insert(pt_pages, p, size); + result = page_table_insert(pt_pages, p, size); } else { - return hash_table_insert(ht_pages, p, (void *) size); + result = hash_table_insert(ht_pages, p, size_to_pointer(size)); } + HPAGE_UNLOCK; + + return result; +} + +static inline void +page_replace(const void *p, size_t size) +{ + g_assert(size != 0); + + HPAGE_LOCK; + if (use_page_table) { + page_table_replace(pt_pages, p, size); + } else { + hash_table_replace(ht_pages, p, size_to_pointer(size)); + } + HPAGE_UNLOCK; } static inline int -page_remove(void *p) +page_remove(const void *p) { + int result; + + HPAGE_LOCK; if (use_page_table) { - return page_table_remove(pt_pages, p); + result = page_table_remove(pt_pages, p); } else { - return hash_table_remove(ht_pages, p); + result = hash_table_remove(ht_pages, p); } + HPAGE_UNLOCK; + + return result; } static void hdestroy_page_table_item(void *key, size_t size, void *unused_udata) { (void) unused_udata; - RUNTIME_ASSERT(size > 0); - hfree(key); + g_assert(size > 0); + vmm_free(key, size); } static void hdestroy_hash_table_item(const void *key, void *value, void *unused_udata) { (void) unused_udata; - RUNTIME_ASSERT((size_t) value > 0); - hfree(deconstify_gpointer(key)); + g_assert((size_t) value > 0); + vmm_free(deconstify_pointer(key), pointer_to_size(value)); } static inline void page_destroy(void) { + HPAGE_LOCK; if (use_page_table) { page_table_foreach(pt_pages, hdestroy_page_table_item, NULL); page_table_destroy(pt_pages); @@ -139,23 +228,40 @@ hash_table_destroy(ht_pages); ht_pages = NULL; } + HPAGE_UNLOCK; } static inline size_t -halloc_get_size(void *p) +halloc_get_size(const void *p, enum halloc_type *type) { size_t size; size = page_lookup(p); - if (size) { - RUNTIME_ASSERT(size >= walloc_threshold); + if (size != 0) { + g_assert(size >= walloc_threshold); + *type = HALLOC_VMM; } else { - union align *head = p; + const union halign *head = p; + + /* + * xmalloc() and halloc() use similar headers, so regardless of + * whether this is a halloc()'ed block through walloc() or an + * xmalloc()'ed block, we get the same blocksize information + * at the same place. To ensure the presence of such a header, + * we use xpmalloc(). + * --RAM, 2015-11-17 + */ head--; - RUNTIME_ASSERT(head->size > 0); - RUNTIME_ASSERT(head->size < walloc_threshold); - size = head->size; + g_assert(size_is_positive(head->size)); + + if (head->size < walloc_threshold) { + size = head->size + sizeof *head; + *type = HALLOC_WALLOC; + } else { + size = xpallocated(p); + *type = HALLOC_XPMALLOC; + } } return size; } @@ -179,11 +285,14 @@ if (0 == size) return NULL; - if G_UNLIKELY(0 == walloc_threshold) + if G_UNLIKELY(0 == walloc_threshold) { + if (halloc_disabled) + return xmalloc(size); halloc_init(TRUE); + } - if (size < walloc_threshold) { - union align *head; + if G_LIKELY(size < walloc_threshold) { + union halign *head; allocated = size + sizeof head0; #ifdef TRACK_ZALLOC @@ -196,19 +305,39 @@ #if defined(TRACK_ZALLOC) || defined(MALLOC_STATS) zalloc_shift_pointer(head, p); #endif + HSTATS_LOCK; + hstats.alloc_via_walloc++; + hstats.wasted_cumulative_walloc += sizeof head0; + } else if (size < xpmalloc_threshold) { + p = xpmalloc(size); + allocated = xpallocated(p); + HSTATS_LOCK; + hstats.alloc_via_xpmalloc++; + hstats.wasted_cumulative_xpmalloc += allocated - size; } else { int inserted; /* round_pagesize() is unsafe and wraps! */ allocated = round_pagesize(size); - RUNTIME_ASSERT(allocated >= size); + g_assert(allocated >= size); p = vmm_alloc(allocated); inserted = page_insert(p, allocated); - RUNTIME_ASSERT(inserted); + g_assert(inserted); + + HSTATS_LOCK; + hstats.alloc_via_vmm++; + hstats.wasted_cumulative_vmm += allocated - size; } - bytes_allocated += allocated; - chunks_allocated++; + + /* Stats are still locked at this point */ + + hstats.allocations++;; + hstats.wasted_cumulative += allocated - size; + hstats.memory += allocated; + hstats.blocks++; + HSTATS_UNLOCK; + return p; } @@ -228,9 +357,11 @@ #else void *p = halloc(size); #endif - if (p) { + if G_LIKELY(p != NULL) { memset(p, 0, size); } + + HSTATS_INCX(allocations_zeroed); return p; } @@ -240,28 +371,37 @@ void hfree(void *p) { - size_t size; size_t allocated; + enum halloc_type type; + + if G_UNLIKELY(NULL == p) + return; - if (NULL == p) + if G_UNLIKELY(halloc_disabled) { + xfree(p); return; + } - size = halloc_get_size(p); - RUNTIME_ASSERT(size > 0); + allocated = halloc_get_size(p, &type); + g_assert(size_is_positive(allocated)); - if (size < walloc_threshold) { - union align *head = p; + if (HALLOC_WALLOC == type) { + union halign *head = p; head--; - allocated = size + sizeof(union align); wfree(head, allocated); + } else if (HALLOC_XPMALLOC == type) { + xfree(p); } else { - allocated = size; page_remove(p); - vmm_free(p, size); + vmm_free(p, allocated); } - bytes_allocated -= allocated; - chunks_allocated--; + + HSTATS_LOCK; + hstats.freeings++; + hstats.memory -= allocated; + hstats.blocks--; + HSTATS_UNLOCK; } /** @@ -272,68 +412,161 @@ void * hrealloc(void *old, size_t new_size) { - size_t old_size; - size_t rounded_new_size; + size_t old_size, allocated; void *p; + enum halloc_type type; - if (NULL == old) + if G_UNLIKELY(NULL == old) return halloc(new_size); - if (0 == new_size) { + if G_UNLIKELY(0 == new_size) { hfree(old); return NULL; } - old_size = halloc_get_size(old); - RUNTIME_ASSERT(size_is_positive(old_size)); + if G_UNLIKELY(halloc_disabled) + return xrealloc(old, new_size); + + allocated = halloc_get_size(old, &type); + g_assert(size_is_positive(allocated)); /* * This is our chance to move a virtual memory fragment out of the way. */ - rounded_new_size = round_pagesize(new_size); + HSTATS_INCX(reallocs); + + if (HALLOC_VMM == type) { + size_t rounded_new_size = round_pagesize(new_size); - if (old_size >= walloc_threshold) { - if (vmm_is_relocatable(old, rounded_new_size)) + old_size = allocated; + + if (vmm_is_relocatable(old, rounded_new_size)) { + HSTATS_INCX(realloc_relocatable); goto relocate; + } + + if (new_size >= walloc_threshold) { + if (rounded_new_size == old_size) { + HSTATS_INCX(realloc_noop); + HSTATS_INCX(realloc_noop_same_vmm); + return old; + } + if (old_size > rounded_new_size) { + vmm_shrink(old, old_size, rounded_new_size); + page_replace(old, rounded_new_size); + HSTATS_LOCK; + hstats.memory += rounded_new_size - old_size; + hstats.realloc_via_vmm_shrink++; + HSTATS_UNLOCK; + + return old; + } + } + } else if (HALLOC_XPMALLOC == type) { + size_t new_allocated; + + old_size = allocated; + + if (new_size < walloc_threshold || new_size >= xpmalloc_threshold) + goto relocate; /* Will change allocation type */ + + p = xprealloc(old, new_size); + new_allocated = xpallocated(p); + + HSTATS_LOCK; + hstats.realloc_via_xprealloc++; + hstats.memory += new_allocated - allocated; + HSTATS_UNLOCK; + + return p; } else { + union halign *old_head; + + old_size = allocated - sizeof *old_head; /* User size */ + if (new_size < walloc_threshold) { - union align *old_head = old; - union align *new_head; - size_t old_allocated = old_size + sizeof old_head0; - size_t new_allocated = new_size + sizeof new_head0; + union halign *new_head; + size_t new_allocated = new_size + sizeof *new_head; + old_head = old; old_head--; - new_head = wrealloc(old_head, old_allocated, new_allocated); + new_head = wrealloc(old_head, allocated, new_allocated); new_head->size = new_size; - bytes_allocated += new_allocated - old_allocated; + + HSTATS_LOCK; + hstats.realloc_via_wrealloc++; + hstats.memory += new_allocated - allocated; + HSTATS_UNLOCK; + return &new_head1; } } - if (new_size >= walloc_threshold && rounded_new_size == old_size) - return old; - - if (old_size >= new_size && old_size / 2 < new_size) + if (old_size >= new_size && old_size / 2 < new_size) { + HSTATS_INCX(realloc_noop); return old; + } relocate: p = halloc(new_size); - RUNTIME_ASSERT(NULL != p); + g_assert(NULL != p); memcpy(p, old, MIN(new_size, old_size)); hfree(old); - + HSTATS_INCX(realloc_via_copy); return p; } /** + * Attempt to disable halloc(), remapping it to xmalloc() dynamically. + * + * This is only possible before any halloc() has been performed, otherwise + * we would not be able to correctly hfree() blocks allocated before disabling + * the allocator. + * + * @return TRUE if we managed to disable halloc(). + */ +bool +halloc_disable(void) +{ + bool result = FALSE; + + thread_suspend_others(TRUE); + + if (0 == walloc_threshold) { + result = TRUE; /* No halloc_init() yet */ + } else if (hstats.allocations == hstats.freeings) { + hdestroy(); + walloc_threshold = 0; + result = TRUE; + } + + if (result) + halloc_disabled = TRUE; + + thread_unsuspend_others(); + + return result; +} + +/** + * @return whether halloc() was disabled. + */ +bool +halloc_is_disabled(void) +{ + return halloc_disabled; +} + +/** * Destroy all the zones we allocated so far. */ void hdestroy(void) { page_destroy(); + halloc_disabled = TRUE; } #else /* REMAP_ZALLOC || TRACK_MALLOC */ @@ -368,26 +601,38 @@ { return g_realloc(old, size); } + +bool +halloc_disable(void) +{ + return TRUE; +} + +bool +halloc_is_disabled(void) +{ + return TRUE; +} #endif /* REMAP_ZALLOC */ #endif /* !REMAP_ZALLOC && !TRACK_MALLOC */ #ifdef USE_HALLOC -static gpointer +static void * ha_malloc(gsize size) { return halloc(size); } -static gpointer -ha_realloc(gpointer p, gsize size) +static void * +ha_realloc(void *p, gsize size) { return hrealloc(p, size); } static void -ha_free(gpointer p) +ha_free(void *p) { hfree(p); } @@ -396,7 +641,8 @@ halloc_glib12_check(void) { #if !GLIB_CHECK_VERSION(2,0,0) - gpointer p; + void *p; + enum halloc_type type; /* * Check whether the remapping is effective. This may not be @@ -404,7 +650,7 @@ * for example. */ p = g_strdup(""); - if (0 == halloc_get_size(p)) { + if (0 == halloc_get_size(p, &type)) { static GMemVTable zero_vtable; fprintf(stderr, "WARNING: Resetting g_mem_set_vtable\n"); g_mem_set_vtable(&zero_vtable); @@ -419,6 +665,10 @@ { static GMemVTable vtable; +#undef malloc +#undef realloc +#undef free + #if GLIB_CHECK_VERSION(2,0,0) { /* NOTE: This string is not read-only because it will be overwritten @@ -428,15 +678,11 @@ static char variable = "G_SLICE=always-malloc"; putenv(variable); } +#endif /* GLib >= 2.0.0 */ vtable.malloc = ha_malloc; vtable.realloc = ha_realloc; vtable.free = ha_free; -#else /* GLib < 2.0.0 */ - vtable.gmvt_malloc = ha_malloc; - vtable.gmvt_realloc = ha_realloc; - vtable.gmvt_free = ha_free; -#endif /* GLib >= 2.0.0 */ g_mem_set_vtable(&vtable); @@ -452,56 +698,86 @@ #endif /* USE_HALLOC */ +/** + * Is halloc() possible given current walloc() limits? + */ +bool +halloc_is_possible(void) +{ + return walloc_maxsize() > sizeof(union halign); +} + #if !defined(REMAP_ZALLOC) && !defined(TRACK_MALLOC) -static gboolean replacing_malloc; -static gboolean halloc_is_compiled = TRUE; +static bool replacing_malloc; +static bool halloc_is_compiled = TRUE; -void -halloc_init(gboolean replace_malloc) +static void +halloc_init_once(void) { - static int initialized; - int sp; + vmm_init(); /* Just in case, since we're built on top of VMM */ - RUNTIME_ASSERT(!initialized); - initialized = TRUE; - replacing_malloc = replace_malloc; + halloc_pagesize = compat_pagesize(); - vmm_init(&sp); /* Just in case, since we're built on top of VMM */ + if (halloc_disabled || !halloc_is_possible()) { + g_assert(0 == walloc_threshold); + halloc_disabled = TRUE; + return; + } + + use_page_table = (size_t) -1 == (uint32) -1 && 4096 == halloc_pagesize; + walloc_threshold = walloc_maxsize() - sizeof(union halign) + 1; + xpmalloc_threshold = 2 * halloc_pagesize - sizeof(union halign) + 1; - use_page_table = (size_t) -1 == (guint32) -1 && 4096 == compat_pagesize(); - walloc_threshold = WALLOC_MAX - sizeof(union align) + 1; + g_assert(size_is_positive(walloc_threshold)); + g_assert(size_is_positive(xpmalloc_threshold)); + HPAGE_LOCK; if (use_page_table) { pt_pages = page_table_new(); } else { ht_pages = hash_table_new(); } + HPAGE_UNLOCK; +} + +void +halloc_init(bool replace_malloc) +{ + static once_flag_t initialized; + static once_flag_t vtable_inited; + + once_flag_run(&initialized, halloc_init_once); + + if G_UNLIKELY(halloc_disabled) + return; + + replacing_malloc = replace_malloc; if (replace_malloc) - halloc_init_vtable(); + once_flag_run(&vtable_inited, halloc_init_vtable); } /** * Did they request that halloc() be a malloc() replacement? */ -gboolean +bool halloc_replaces_malloc(void) { return replacing_malloc; } #else /* REMAP_ZALLOC || TRACK_MALLOC */ -static gboolean halloc_is_compiled = FALSE; +static bool halloc_is_compiled = FALSE; void -halloc_init(gboolean unused_replace_malloc) +halloc_init(bool unused_replace_malloc) { (void) unused_replace_malloc; /* EMPTY */ } -gboolean +bool halloc_replaces_malloc(void) { return FALSE; @@ -509,7 +785,7 @@ #endif /* !REMAP_ZALLOC && !TRACK_MALLOC */ -gboolean +bool halloc_is_available(void) { return halloc_is_compiled; @@ -518,13 +794,13 @@ size_t halloc_bytes_allocated(void) { - return bytes_allocated; + return hstats.memory; } size_t halloc_chunks_allocated(void) { - return chunks_allocated; + return hstats.blocks; } #ifndef TRACK_MALLOC @@ -554,13 +830,16 @@ char * h_strndup(const char *str, size_t n) { + g_assert(size_is_non_negative(n)); + if (str != NULL) { size_t len = clamp_strlen(str, n); char *result = halloc(len + 1); - + char *p; + /* Not hcopy() because we shouldn't even read the nth byte of src. */ - memcpy(result, str, len); - resultlen = '\0'; + p = mempcpy(result, str, len); + *p = '\0'; return result; } else { @@ -569,31 +848,26 @@ } /** - * A clone of g_strjoinv() which uses halloc(). - * The resulting string must be freed via hfree(). + * Like h_strjoinv() but the length of the separator is given, meaning it can + * contain embedded NUL characters and does not require to be NUL-terminated. * - * Joins a number of strings together to form one long string, with the - * optional separator inserted between each of them. - * - * @param separator string to insert between each strings, or NULL + * @param separator string to insert between each strings + * @param seplen amount of bytes in the separator string * @param str_array a NULL-terminated array of strings to join * * @return a newly allocated string joining all the strings from the array, * with the separator between them. */ char * -h_strjoinv(const char *separator, char **str_array) +h_strnjoinv(const char *separator, size_t seplen, char * const *str_array) { const char *sep = separator; char *result; g_assert(str_array != NULL); - - if (NULL == sep) - sep = ""; + g_assert(separator != NULL || 0 == seplen); if (str_array0 != NULL) { - size_t seplen = strlen(sep); size_t i, len, pos; len = size_saturate_add(1, strlen(str_array0)); @@ -610,7 +884,8 @@ /* We can freely add to pos, we know it cannot saturate now */ for (i = 1; str_arrayi != NULL; i++) { - pos += strcpy_len(&resultpos, sep); + memcpy(&resultpos, sep, seplen); + pos += seplen; pos += strcpy_len(&resultpos, str_arrayi); } @@ -623,6 +898,30 @@ } /** + * A clone of g_strjoinv() which uses halloc(). + * The resulting string must be freed via hfree(). + * + * Joins a number of strings together to form one long string, with the + * optional separator inserted between each of them. + * + * If separator is NULL, strings in the array are simply concatenated together. + * + * @param separator string to insert between each strings, or NULL + * @param str_array a NULL-terminated array of strings to join + * + * @return a newly allocated string joining all the strings from the array, + * with the separator between them. + */ +char * +h_strjoinv(const char *separator, char * const *str_array) +{ + if G_UNLIKELY(NULL == separator) + return h_strnjoinv(NULL, 0, str_array); + + return h_strnjoinv(separator, strlen(separator), str_array); +} + +/** * A clone of g_strfreev(). * * Frees (via hfree()) a NULL-terminated array of strings, and the array itself. @@ -643,6 +942,29 @@ } /** + * The vectorized version of h_strconcat(). + */ +char * +h_strconcat_v(const char *first, va_list ap) +{ + va_list ap2; + size_t len, ret; + char *dst; + + VA_COPY(ap2, ap); + len = concat_strings_v(NULL, 0, first, ap2); + va_end(ap2); + + len = size_saturate_add(len, 1); + dst = halloc(len); + ret = concat_strings_v(dst, len, first, ap); + + g_assert(ret == len - 1); /* Do not count the trailing NUL */ + + return dst; +} + +/** * A clone of g_strconcat() using halloc(). * The resulting string must be freed via hfree(). * @@ -655,33 +977,26 @@ h_strconcat(const char *first, ...) { va_list ap; - size_t len, ret; - char *dst; - - va_start(ap, first); - len = concat_strings_v(NULL, 0, first, ap); - va_end(ap); + char *result; - dst = halloc(len + 1); va_start(ap, first); - ret = concat_strings_v(dst, len + 1, first, ap); + result = h_strconcat_v(first, ap); va_end(ap); - g_assert(ret == len); - return dst; + return result; } /** * Calculate the size of the buffer required to hold the string * resulting from vnsprintf(). - * + * * @param format The printf format string. * @param ap The argument list. * * @return The size of the buffer required to hold the resulting * string including the terminating NUL. */ -static size_t +static size_t G_PRINTF(1, 0) vprintf_get_size(const char *format, va_list ap) { char *buf; @@ -728,7 +1043,7 @@ } WFREE_NULL(buf, size); - return ret < 0 ? (size_t)-1 : size_saturate_add(ret, 1); + return size_saturate_add(ret, 1); } /** @@ -800,4 +1115,162 @@ } #endif /* !TRACK_MALLOC */ +enum hpriv_magic { HPRIV_MAGIC = 0x683e6188 }; + +struct hpriv { + enum hpriv_magic magic; /**< Magic number */ + void *p; /**< Thread-private pointer (halloc-ed) */ +}; + +static inline void +hpriv_check(const struct hpriv * const hp) +{ + g_assert(hp != NULL); + g_assert(HPRIV_MAGIC == hp->magic); +} + +/** + * Reclaim a thread-private pointer when the thread is exiting. + */ +static void +h_private_reclaim(void *data, void *unused) +{ + struct hpriv *hp = data; + + (void) unused; + + hpriv_check(hp); + + HFREE_NULL(hp->p); + hp->magic = 0; + WFREE(hp); +} + +/** + * Record a pointer as being an halloc-ed() memory zone that needs to be freed + * when the thread exists or when a new value is recorded. + * + * This is used to provide thread-private "lazy memory" whose lifetime does not + * exceeed that of the next call to the routine that produces these pointers. + * + * @param key the key to use to identify this pointer value + * @param p the allocated pointer + * + * @return the pointer, as a convenience. + */ +void * +h_private(const void *key, void *p) +{ + struct hpriv *hp; + + hp = thread_private_get(key); + + if G_LIKELY(hp != NULL) { + hpriv_check(hp); + + HFREE_NULL(hp->p); /* Free old pointer */ + return hp->p = p; /* Will be freed next time or at thread exit */ + } + + /* + * Allocate a new thread-private pointer object, with a specialized free + * routine to be able to reclaim the allocated memory when the thread + * exits. + */ + + WALLOC0(hp); + hp->magic = HPRIV_MAGIC; + + thread_private_add_extended(key, hp, h_private_reclaim, NULL); + + return hp->p = p; +} + +/** + * Generate a SHA1 digest of the current halloc statistics. + * + * This is meant for dynamic entropy collection. + */ +void +halloc_stats_digest(sha1_t *digest) +{ + /* + * Don't take locks to read the statistics, to enhance unpredictability. + */ + + HSTATS_INCX(halloc_stats_digest); + SHA1_COMPUTE(hstats, digest); +} + +/** + * Dump halloc statistics to specified log agent. + */ +void G_COLD +halloc_dump_stats_log(logagent_t *la, unsigned options) +{ + struct hstats stats; + uint64 wasted_average, wasted_average_walloc, wasted_average_vmm; + uint64 wasted_average_xpmalloc; + bool groupped = booleanize(options & DUMP_OPT_PRETTY); + + HSTATS_LOCK; + stats = hstats; /* struct copy under lock protection */ + HSTATS_UNLOCK; + +#define DUMP(x) log_info(la, "HALLOC %s = %s", #x, \ + uint64_to_string_grp(stats.x, groupped)) + +#define DUMP64(x) G_STMT_START { \ + uint64 v = AU64_VALUE(&hstats.x); \ + log_info(la, "HALLOC %s = %s", #x, \ + uint64_to_string_grp(v, groupped)); \ +} G_STMT_END + +#define DUMS(x) log_info(la, "HALLOC %s = %s", #x, \ + size_t_to_string_grp(stats.x, groupped)) + +#define DUMV(x) log_info(la, "HALLOC %s = %s", #x, \ + uint64_to_string_grp(x, groupped)) + + wasted_average = stats.wasted_cumulative / + (0 == stats.allocations ? 1 : stats.allocations); + wasted_average_walloc = stats.wasted_cumulative_walloc / + (0 == stats.alloc_via_walloc ? 1 : stats.alloc_via_walloc); + wasted_average_xpmalloc = stats.wasted_cumulative_xpmalloc / + (0 == stats.alloc_via_xpmalloc ? 1 : stats.alloc_via_xpmalloc); + wasted_average_vmm = stats.wasted_cumulative_vmm / + (0 == stats.alloc_via_vmm ? 1 : stats.alloc_via_vmm); + + DUMP(allocations); + DUMP64(allocations_zeroed); + DUMP(alloc_via_walloc); + DUMP(alloc_via_xpmalloc); + DUMP(alloc_via_vmm); + DUMP(freeings); + DUMP64(reallocs); + DUMP64(realloc_noop); + DUMP64(realloc_noop_same_vmm); + DUMP(realloc_via_wrealloc); + DUMP64(realloc_via_copy); + DUMP(realloc_via_vmm_shrink); + DUMP64(realloc_relocatable); + DUMP(wasted_cumulative); + DUMP(wasted_cumulative_walloc); + DUMP(wasted_cumulative_xpmalloc); + DUMP(wasted_cumulative_vmm); + DUMV(wasted_average); + DUMV(wasted_average_walloc); + DUMV(wasted_average_xpmalloc); + DUMV(wasted_average_vmm); + DUMS(memory); + DUMS(blocks); + + DUMP64(halloc_stats_digest); + +#undef DUMP +#undef DUMP64 +#undef DUMS +#undef DUMV +} + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/halloc.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/halloc.h
Changed
@@ -46,13 +46,13 @@ #define halloc0(_s) halloc0_track(_s, _WHERE_, __LINE__) void *halloc_track(size_t size, - const char *file, int line) WARN_UNUSED_RESULT G_GNUC_MALLOC; + const char *file, int line) G_MALLOC; void *halloc0_track(size_t size, - const char *file, int line) WARN_UNUSED_RESULT G_GNUC_MALLOC; + const char *file, int line) G_MALLOC; #else #ifndef TRACK_MALLOC -void *halloc(size_t size) WARN_UNUSED_RESULT G_GNUC_MALLOC; -void *halloc0(size_t size) WARN_UNUSED_RESULT G_GNUC_MALLOC; +void *halloc(size_t size) G_MALLOC; +void *halloc0(size_t size) G_MALLOC; #endif #endif /* TRACK_ZALLOC */ @@ -64,7 +64,7 @@ void hfree(void *ptr); void *hrealloc(void *old, size_t size) WARN_UNUSED_RESULT; -static inline void * WARN_UNUSED_RESULT G_GNUC_MALLOC +static inline void * G_MALLOC hcopy(const void *p, size_t size) { void *cp = halloc(size); @@ -72,25 +72,38 @@ return cp; } -char *h_strdup(const char *str) WARN_UNUSED_RESULT G_GNUC_MALLOC; -char *h_strndup(const char *str, size_t n) WARN_UNUSED_RESULT G_GNUC_MALLOC; -char *h_strjoinv(const char *separator, char **str_array); +char *h_strdup(const char *str) G_MALLOC; +char *h_strndup(const char *str, size_t n) G_MALLOC; +char *h_strjoinv(const char *separator, char * const *str_ary); +char *h_strnjoinv(const char *separator, size_t seplen, char * const *str_ary); void h_strfreev(char **str_array); -char *h_strconcat(const char *str1, ...) WARN_UNUSED_RESULT G_GNUC_MALLOC - G_GNUC_NULL_TERMINATED; -char *h_strdup_printf(const char *format, ...) G_GNUC_PRINTF(1, 2); -char *h_strdup_vprintf(const char *format, va_list ap); -char *h_strdup_len_vprintf(const char *format, va_list ap, size_t *len); +char *h_strconcat(const char *str1, ...) G_MALLOC G_NULL_TERMINATED; +char *h_strconcat_v(const char *first, va_list ap) G_MALLOC; +char *h_strdup_printf(const char *format, ...) G_PRINTF(1, 2); +char *h_strdup_vprintf(const char *format, va_list ap) G_PRINTF(1, 0); +char *h_strdup_len_vprintf(const char *format, va_list ap, size_t *len) + G_PRINTF(1, 0); #endif /* !TRACK_MALLOC */ -void halloc_init(gboolean replace_malloc); +void halloc_init(bool replace_malloc); +bool halloc_disable(void); +bool halloc_is_disabled(void); +bool halloc_is_possible(void); void hdestroy(void); -gboolean halloc_replaces_malloc(void); -gboolean halloc_is_available(void); +bool halloc_replaces_malloc(void); +bool halloc_is_available(void); size_t halloc_bytes_allocated(void); size_t halloc_chunks_allocated(void); +void *h_private(const void *key, void *p); + +struct logagent; +struct sha1; + +void halloc_dump_stats_log(struct logagent *la, unsigned options); +void halloc_stats_digest(struct sha1 *digest); + #ifdef TRACK_MALLOC #define HFREE_NULL(p) \ @@ -113,5 +126,23 @@ #endif /* TRACK_MALLOC */ +#define HALLOC_ARRAY(p,n) \ +G_STMT_START { \ + p = halloc((n) * sizeof p0); \ +} G_STMT_END + +#define HALLOC0_ARRAY(p,n) \ +G_STMT_START { \ + p = halloc0((n) * sizeof p0); \ +} G_STMT_END + +#define HREALLOC_ARRAY(p,n) \ +G_STMT_START { \ + p = hrealloc(p, (n) * sizeof p0); \ +} G_STMT_END + +#define HCOPY_ARRAY(p,n) hcopy(p, (n) * sizeof p0) + #endif /* _halloc_h_ */ + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/hash.c
Added
@@ -0,0 +1,1270 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Hash table implementation using open addressing and linear double hashing. + * + * Open addressing means that collision handling is done by using alternative + * slots in the table, not by chaining values within the same hash bin (a + * technique referred to as closed addressing). + * + * Alternative places in the table are looked at using a second hashing + * function, hence the "double hashing" name. Since it is highly unlikely + * that two distinct hashing functions will have the same collision set, + * the technique prevents secondary clustering in the table. + * + * Keys can be classified into four distinct categories: + * + * 1. pointers and other stand-for-themselves integer values + * 2. strings and other NUL-terminated buffers + * 3. fixed-size buffers + * 4. complex structures whose hashing depends on its field values. + * + * The first 3 classes can be handled natively by this implementation, i.e. + * the set of hashing routines / equality routines are supplied for the user. + * But this can be overridden, pretending that the key is of the 4th type. + * + * The 4th class requires that two hashing functions and an equality function + * be supplied, although the hash table can do with one hashing function only, + * the second hashing being done based on the hash value. This means that + * secondary clustering is possible when the hash function collides easily, + * since two keys hashing with to the same value will have a similar lookup + * path within the table. + * + * For practical reasons and because double hashing is by design relatively + * immune to clustering, the hash table size is a power of 2: the modulo + * operator is much slower than a simple trailing bit masking. + * + * When a collision occurs and alternative slots are to be used, the distance + * from the "home" slot is computed via the secondary hash routine, and then + * linear probing of slots is done, using the computed distance. To guarantee + * that all the slots will be visited, the distance must be prime with the + * hash table size. Because the table size is a power of 2, any odd number + * will be prime with it. This is enough to guarantee that for any odd number + * "d" and a hash table size "S", the first "n", n > 1, for which n*d = 0 + * modulo S is when n = S since d and S are prime with each-other. + * + * Because the final position of an item depends on the presence of other + * items in the traversed path (in case the item is not at its "home" slot), + * deletion of an item must not mark the slot as free, but must remember + * that there used to be an item there. This is done by erecting a tombstone + * when the item is deleted. + * + * Too many items in the table or too many tombstones can affect the overall + * performance, by increasing the amount of probed slots before finding a value + * or determining that the value is not present. Including tombstones, let + * "r" be the fill ratio of the table, i.e. the number of occupied slots + * divided by the hash table size. The theoretical amount of probes done is: + * + * Successful lookup: -ln(1 - r) / r (2.01 for r = 0.75) + * Unsuccessful lookup: 1 / (1 - r) (4 for r = 0.75) + * + * To keep the performances reasonable, the hash table must therefore be + * resized when its load factor reaches 0.75, or shrinked (or simply rebuilt) + * when there are more than, say, 25% tombstones present. + * + * In order to accelerate table rebuilds, we keep a copy of the hashed value + * of every key in the table. This allows more efficient key comparisons + * during lookups (keys can't match if they don't have an identical hash) and + * also allows for flagging empty slots and tombstones, at the cost of + * reserving two hash values for that purpose: 0 and 1. + * + * The code contained here allows for hash tables and hash sets. Most of the + * logic is shared, but the API for iteration and insertion is slightly + * different given that there is no value associated with a key within a set, + * and the vocabulary is different (we speak of set "items", not "keys"). + * + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#define HASH_SOURCE + +#include "hash.h" + +#include "endian.h" +#include "hashing.h" +#include "rand31.h" +#include "random.h" +#include "unsigned.h" +#include "vmm.h" +#include "walloc.h" + +#include "override.h" /* Must be the last header included */ + +#define HASH_HOPS_MIN 4 /* Theoretical hops when full at 75% */ + +/* + * The following definitions help control the amount of hash codes we can keep + * in a single CPU cacheline, whose size is estimated by HASH_CACHELINE. + * + * It's OK if HASH_CACHELINE is not the exact hardware CPU cacheline: we + * accept to load a few cache lines and have a few cache misses when looking + * for a match in the hash array. + * + * A hash code is an "uint", therefore its size is INTSIZE bytes. + */ +#define HASH_CACHELINE 64 /* Amount of bytes in a CPU cacheline */ +#define HASH_LINE_ITEMS (HASH_CACHELINE / INTSIZE) /* hashes are `uint' */ + +/** + * Type of table resizing we want to perform. + */ +enum hash_resize_mode { + HASH_RESIZE_SAME, /* Rebuild table, no size change */ + HASH_RESIZE_GROW, /* Grow table */ + HASH_RESIZE_SHRINK, /* Shrink table */ + HASH_RESIZE_CACHELINE, /* Shrink small table fitting in cacheline */ + + HASH_RESIZE_MAXMODE +}; + +static inline void +hash_check(const void * const p) +{ + const struct hash *h = p; + + g_assert(h != NULL); + g_assert(HASH_MAGIC_COMMON == (h->magic >> HASH_MAGIC_SHIFT)); +} + +/** + * Avoid complexity attacks on the hash table. + * + * Random numbers are used to perturb the hash values for all the keys + * so that no attack on the hash table insertion complexity can be made. + */ +static unsigned hash_offset_primary; +static unsigned hash_offset_secondary; + +/** + * Initialize random hash offset if not already done. + */ +static void G_COLD +hash_random_offset_init(void) +{ + static bool done; + + /* + * We used to call entropy_random() here but we really do not need such + * a strong random number. Moreover, this triggers quite a lot of code + * whilst we can be called very early in the auto-initialization sequence. + * Therefore, let's switch to rand31_u32() which will be lighter and + * less likely to accidentally trigger auto-init loops. + * --RAM, 2015-07-17 + */ + + if G_UNLIKELY(!done) { + hash_offset_primary = rand31_u32(); + hash_offset_secondary = rand31_u32(); + done = TRUE; + } +} + +/** + * How many extra hops past the home location do we allow in the table before + * considering resizing it. + */ +static inline size_t +hash_hops_max(const struct hkeys *hk) +{ + /* + * We allow HASH_HOPS_MIN hops at least, because this is the theoretical + * average amount of hops we can expect when the table is full at the + * nominal rate we allow. + * + * However we want the hash table to be more efficient than what a binary + * search on a sorted table would bring, which would require hk->bits + * comparisons at most. + * + * The exception is when there are up to HASH_LINE_ITEMS slots in the + * hash table: when everything fits in the "memory cacheline", it's pretty + * cheap to iterate through the hash array, even if it's completely full. + * This trade-off helps hash tables with a small amount of items keep a + * small memory footprint. + * --RAM, 2012-12-15 + */ + + if G_UNLIKELY(hk->size <= HASH_LINE_ITEMS) + return HASH_LINE_ITEMS; /* Allows to loop over all keys */ + + return HASH_HOPS_MIN + (hk->bits - HASH_MIN_BITS) / 2; +} + +/** + * Compute the total size of the arena required for given amount of items. + */ +static size_t +hash_arena_size(size_t items, bool has_values) +{ + size_t size; + + /* + * To avoid too much fragmentation, we allocate the arena as a contiguous + * memory region, using walloc() or vmm_alloc() as appropriate. + * + * When the hash table has values, the layout in memory is: + * + * key array | value array | hashes array + * + * When the hash table has no values, the layout is: + * + * key array | hashes array + * + * This allows the hashes array to be correctly aligned since the size + * of a pointer is always larger or equal to the size of an unsigned value. + */ + + STATIC_ASSERT(sizeof(void *) >= sizeof(unsigned)); + STATIC_ASSERT(INTSIZE == sizeof(unsigned)); + + size = items * sizeof(void *); + if (has_values) + size *= 2; + size += items * sizeof(unsigned); + + return size; +} + +/** + * Allocate arena for the hash. + * + * @param hk the keyset structure + * @param bits log2(size) for the key array + */ +void +hash_arena_allocate(struct hash *h, size_t bits) +{ + struct hkeys *hk = &h->kset; + size_t size; + void *arena; + + hash_check(h); + g_assert(bits >= HASH_MIN_BITS); + + hash_random_offset_init(); + + hk->size = 1UL << bits; + hk->bits = bits; + hk->tombs = 0; + hk->resize = FALSE; + + /* + * If the arena size is more than a page size, use VMM to allocate the + * memory, otherwise rely on walloc(). + * + * For structures in "raw" mode, avoid walloc() and use the VMM layer. + */ + + size = hash_arena_size(hk->size, hk->has_values); + + if (size >= compat_pagesize() || hk->raw_memory) + arena = vmm_alloc(size); + else + arena = walloc(size); + + hk->keys = arena; + arena = ptr_add_offset(arena, hk->size * sizeof(void *)); + if (hk->has_values) { + (*h->ops->set_values)(h, arena); + arena = ptr_add_offset(arena, hk->size * sizeof(void *)); + } + hk->hashes = arena; + memset(hk->hashes, 0, hk->size * sizeof(unsigned)); +} + +/** + * Release arena of given length. + */ +static void +hash_arena_size_free(void *arena, size_t len, bool raw) +{ + /* + * If the arena size is more than a page size, we used VMM to allocate the + * memory, otherwise it was walloc()'ed. + * + * When the hash is in "raw" mode, we avoid walloc(). + */ + + if (len >= compat_pagesize() || raw) + vmm_free(arena, len); + else + wfree(arena, len); +} + +/** + * Free arena key set. + */ +static void +hash_arena_kset_free(struct hash *h) +{ + struct hkeys *hk = &h->kset; + size_t size; + + size = hash_arena_size(hk->size, hk->has_values); + hash_arena_size_free(hk->keys, size, hk->raw_memory); +} + +/** + * Free allocated arena structures. + */ +void +hash_arena_free(struct hash *h) +{ + hash_check(h); + + hash_arena_kset_free(h); + + /* + * If the table was marked thread-safe, now is a good time to clean up + * the allocated lock. + */ + + if (h->lock != NULL) { + mutex_destroy(h->lock); + WFREE(h->lock); + } +} + +/** + * Setup hashing routines for keys. + * + * @param hk the keyset structure + * @param ktype key type + * @param keysize expected for HASH_KEY_FIXED to give key size, otherwise 0 + */ +void +hash_keyhash_setup(struct hkeys *hk, enum hash_key_type ktype, size_t keysize) +{ + g_assert(hk != NULL); + + hk->type = ktype; + + switch (ktype) { + case HASH_KEY_SELF: + hk->uh.h.hash = pointer_hash; + hk->uh.h.hash2 = pointer_hash2; + hk->uk.eq = NULL; /* Will use '==' comparison */ + break; + case HASH_KEY_STRING: + hk->uh.h.hash = string_mix_hash; + hk->uh.h.hash2 = string_hash; + hk->uk.eq = string_eq; + break; + case HASH_KEY_FIXED: + hk->uh.h.hash = NULL; /* Will use binary_hash() */ + hk->uh.h.hash2 = NULL; /* Will use binary_hash2() */ + hk->uk.keysize = keysize; /* Will use binary_eq() */ + break; + case HASH_KEY_ANY: + case HASH_KEY_ANY_DATA: + case HASH_KEY_MAXTYPE: + g_assert_not_reached(); + } +} + +/** + * Setup hashing routines for keys. + * + * @param hk the keyset structure + * @param primary primary hash function (cannot be NULL) + * @param secondary secondary hash function (may be NULL) + * @param eq key equality function (NULL means '==' checks) + */ +void +hash_keyhash_any_setup(struct hkeys *hk, + hash_fn_t primary, hash_fn_t secondary, eq_fn_t eq) +{ + g_assert(hk != NULL); + g_assert(primary != NULL); + + hk->type = HASH_KEY_ANY; + hk->uh.h.hash = primary; + hk->uh.h.hash2 = secondary; + hk->uk.eq = NULL == eq ? pointer_eq : eq; +} + +/** + * Setup hashing routines for keys when the hashing routine needs extra data. + * + * @param hk the keyset structure + * @param hash the hash function (cannot be NULL) + * @param data extra data to pass to the hashing / equality function + * @param eq key equality function (cannot be NULL) + */ +void +hash_keyhash_data_setup(struct hkeys *hk, + hash_data_fn_t hash, void *data, eq_data_fn_t eq) +{ + g_assert(hk != NULL); + g_assert(hash != NULL); + g_assert(eq != NULL); + + hk->type = HASH_KEY_ANY_DATA; /* Union discriminent for uh */ + hk->uh.hd.hash = hash; + hk->uh.hd.data = data; + hk->uk.eq_data = eq; +} + +/** + * Compute primary hash key. + */ +static inline ALWAYS_INLINE unsigned +hash_compute_primary(const struct hkeys *hk, const void *key) +{ + unsigned hv; + + if (HASH_KEY_FIXED == hk->type) { + hv = binary_hash(key, hk->uk.keysize); + } else if (HASH_KEY_ANY_DATA != hk->type) { + hv = (*hk->uh.h.hash)(key); + } else { + hv = (*hk->uh.hd.hash)(key, hk->uh.hd.data); + } + + hv += hash_offset_primary; + + return G_LIKELY(HASH_IS_REAL(hv)) ? hv : hv + HASH_REAL; +} + +/** + * Compute increment used to jump around the table looking for the key. + * + * Makes sure the increment is odd so that it is prime with the table size + * and non-zero at the same time. + */ +static inline unsigned +hash_compute_increment(const struct hkeys *hk, const void *key, unsigned hv) +{ + unsigned hv2; + + if (HASH_KEY_FIXED == hk->type) { + hv2 = binary_hash2(key, hk->uk.keysize); + } else if (HASH_KEY_ANY_DATA == hk->type || NULL == hk->uh.h.hash2) { + hv2 = UINT32_SWAP(hv) ^ GOLDEN_RATIO_32; + } else { + hv2 = (*hk->uh.h.hash2)(key); + } + + hv2 += hash_offset_secondary; + + return (hv2 & 0x1) ? hv2 : ~hv2; /* Ensure it is an odd number */ +} + +/** + * Compares two keys. + */ +static bool +hash_keyset_equals(const struct hkeys *hk, const void *k1, const void *k2) +{ + switch (hk->type) { + case HASH_KEY_SELF: + return k1 == k2; + case HASH_KEY_STRING: + case HASH_KEY_ANY: + return (*hk->uk.eq)(k1, k2); + case HASH_KEY_ANY_DATA: + return (*hk->uk.eq_data)(k1, k2, hk->uh.hd.data); + case HASH_KEY_FIXED: + return binary_eq(k1, k2, hk->uk.keysize); + case HASH_KEY_MAXTYPE: + break; + } + g_assert_not_reached(); +} + +/** + * Lookup key in the key set. + * + * Because a lookup is the initial operation before one can insert anything, + * we keep track of some important parameters that are gathered during the + * lookup operation: the primary hashed value of the key, the index where + * the key could be inserted at or where the key is located. + * + * @param hk the keyset structure + * @param key the key we are looking for + * @param hv the hashed value for the key (primary hash) + * @param kidx where the key was found or can be inserted + * @param tombidx index of the first tomb in the lookup path, -1 if none + * + * @return TRUE if key was found with kidx now holding the index of the key, + * FALSE otherwise with kidx now holding the insertion index for the key. + */ +static bool G_HOT +hash_keyset_lookup(struct hkeys *hk, const void *key, unsigned hv, + size_t *kidx, size_t *tombidx) +{ + unsigned inc, ih; + size_t idx, nidx; + size_t first_tomb, mask, hops; + bool found; + + idx = hashing_keep(hv, hk->bits); + ih = hk->hashesidx; + + /* + * If the home slot is free, we're done: the key does not exist and + * it can be inserted there. + */ + + if (HASH_IS_FREE(ih)) { + *kidx = idx; + if (tombidx != NULL) + *tombidx = (size_t) -1; + return FALSE; + } + + /* + * If the home slot contains the key we're looking for, we're done. + */ + + if (HASH_IS_REAL(ih)) { + if (ih == hv && hash_keyset_equals(hk, hk->keysidx, key)) { + *kidx = idx; + if (tombidx != NULL) + *tombidx = (size_t) -1; + return TRUE; + } + first_tomb = (size_t) -1; + } else { + first_tomb = idx; /* Not free and not real -> must be a tomb */ + } + + /* + * We're going to need the secondary hash now. + */ + + inc = hash_compute_increment(hk, key, hv); + found = FALSE; + mask = hk->size - 1; /* Size is power of two */ + + /* + * By design, the hash table can never become full because we're constantly + * monitoring its size and resizing it as it grows past a high watermark. + * Therefore, we know we have to end up on a free slot or a tomb. + * + * We may very well loop back to the original home slot though, meaning + * the key was nowhere to be found. We can't go back to the home slot + * before we have been through all the other slots in the table since + * the increment and the table size are prime with each other. + * + * Here's the mathematical proof: let S be the table size (a power of 2) + * and i be the increment (odd number). + * + * Lemma: S and i are prime together. + * Proof: let d be a common divisor of S and i. Since S is a power of 2, + * then d is of the form 2^k with k a natural number. Because i is odd, + * it cannot be divided by 2, so d is necessary 2^0 = 1. QED. + * + * Now that the lemma is established, here's the original proposition proof. + * Let x be the initial position index. Suppose we find a natural number k + * such that x + i*k = x (modulo S). Here k represents the number of + * steps after which we are back to the initial position. + * + * Because (Z/nZ, +) is a group, each item has on opposite y such that + * x + y = 0 (modulo n). Let us write y = -x. Adding -x to both sides + * of our equation leads to i*k = 0 (modulo S). This means that it can + * also be written i*k = a*S, with "a" an integer number, this being an + * equation within R, the set of real numbers. So k = a*(S/i). Because + * S and i are prime together, S/i is not an integer value unless i = S + * or i = 1. The former would mean that i = 0 (modulo S) and i was odd, + * so that's impossible, and the latter means trivially that k is a + * multiple of S, meaning k = 0 (mod S). The only other alternatives for + * k to be a natural number when S/i is not an integer are a = 0, in which + * case k = 0, or a = n*i, in which case k = n*S so k = 0 (mod S). + * + * Therefore, we have established the only k such that x + i*k = x (mod S) + * is k = 0 (mod S). We won't come back to x before having looped through + * all the other slots first. QED + * + * Our proof does not depend on the value of x, the initial position, hence + * we have demonstrated that the while loop below will either look at all + * the slots or stop when it reaches a free slot. + */ + + hops = 1; + nidx = (idx + inc) & mask; + ih = hk->hashesnidx; + + while (!HASH_IS_FREE(ih) && nidx != idx) { + size_t aidx = (nidx + inc) & mask; + G_PREFETCH_R(&hk->hashesaidx); + if (ih == hv && hash_keyset_equals(hk, hk->keysnidx, key)) { + found = TRUE; + break; + } else if ((size_t) -1 == first_tomb && HASH_IS_TOMB(ih)) { + first_tomb = nidx; + } + nidx = aidx; + ih = hk->hashesnidx; + hops++; + } + + G_PREFETCH_W(kidx); + + /* + * When lookups go through too many hops before ending, flag for a resizing + * at the next opportunity. + * + * If we looped back to the initial index, it means the table is full... + */ + + if G_UNLIKELY(hops > hash_hops_max(hk) || nidx == idx) + hk->resize = TRUE; + + if (tombidx != NULL) + *tombidx = first_tomb; + *kidx = (found || (size_t) -1 == first_tomb) ? nidx : first_tomb; + + return found; +} + +/** + * Erect a new tombstone at the specified key index. + * + * @return TRUE if we erected a new tombstone, FALSE if there was already one. + */ +bool +hash_erect_tombstone(struct hash *h, size_t idx) +{ + struct hkeys *hk; + + hash_check(h); + assert_hash_locked(h); + g_assert(size_is_non_negative(idx)); + g_assert(idx < h->kset.size); + + hk = &h->kset; + + if G_UNLIKELY(HASH_TOMB == hk->hashesidx) + return FALSE; + + hk->hashesidx = HASH_TOMB; + hk->tombs++; + return TRUE; +} + +/** + * Resize empty table to its minimal state. + * + * @return TRUE if we actually re-allocated the arena. + */ +static bool +hash_resize_min(struct hash *h) +{ + assert_hash_locked(h); + + if G_UNLIKELY(HASH_MIN_BITS == h->kset.bits) { + memset(h->kset.hashes, 0, + (1U << HASH_MIN_BITS) * sizeof h->kset.hashes0); + h->kset.tombs = 0; + h->kset.resize = FALSE; + return FALSE; + } else { + hash_arena_kset_free(h); + hash_arena_allocate(h, HASH_MIN_BITS); + return TRUE; + } +} + +/** + * Resize table according to the resizing mode: + * + * HASH_RESIZE_SAME Rebuild table, no size change + * HASH_RESIZE_GROW Double the table size + * HASH_RESIZE_SHRINK Reduce table size + * HASH_RESIZE_CACHELINE Reduce small table fitting in CPU cacheline + */ +static void +hash_resize(struct hash *h, enum hash_resize_mode mode) +{ + const void **old_values = NULL, **new_values = NULL; + const void **old_keys, **hk; + unsigned *old_hashes, *hp; + size_t old_size, old_arena_size, i, keys; + + hash_check(h); + assert_hash_locked(h); + + old_keys = h->kset.keys; + old_hashes = h->kset.hashes; + if (h->kset.has_values) + old_values = (*h->ops->get_values)(h); + old_size = h->kset.size; + old_arena_size = hash_arena_size(old_size, h->kset.has_values); + + switch (mode) { + case HASH_RESIZE_SAME: + g_assert(h->kset.items <= h->kset.size); + goto size_computed; + case HASH_RESIZE_GROW: + g_assert(h->kset.items <= h->kset.size); + h->kset.bits++; + goto size_computed; + case HASH_RESIZE_SHRINK: + g_assert(size_is_positive(h->kset.bits)); + g_assert(h->kset.items <= h->kset.size / 2); /* Can loop once */ + do { + h->kset.bits--; + h->kset.size = 1UL << h->kset.bits; + } while + (h->kset.items < h->kset.size / 4 && h->kset.bits > HASH_MIN_BITS); + goto size_computed; + case HASH_RESIZE_CACHELINE: + g_assert(size_is_positive(h->kset.bits)); + g_assert(h->kset.items <= HASH_LINE_ITEMS); + g_assert(h->kset.items <= h->kset.size / 2); /* Can loop once */ + do { + h->kset.bits--; + h->kset.size = 1UL << h->kset.bits; + } while + (h->kset.items < h->kset.size / 2 && h->kset.bits > HASH_MIN_BITS); + goto size_computed; + case HASH_RESIZE_MAXMODE: + break; + } + g_assert_not_reached(); + +size_computed: + + hash_arena_allocate(h, h->kset.bits); + + if (old_values != NULL) + new_values = (*h->ops->get_values)(h); + + keys = 0; /* For assertion, count keys */ + + for (i = 0, hp = old_hashes, hk = old_keys; i < old_size; i++, hp++, hk++) { + if (HASH_IS_REAL(*hp)) { + size_t idx; + bool found; + + found = hash_keyset_lookup(&h->kset, *hk, *hp, &idx, NULL); + g_assert(!found); + + keys++; + h->kset.keysidx = *hk; + h->kset.hashesidx = *hp; + if (old_values != NULL) + new_valuesidx = old_valuesi; + } + } + + g_assert_log(keys == h->kset.items, + "keys=%zu, h->kset.items=%zu, resize mode=%d", + keys, h->kset.items, mode); + + hash_arena_size_free(old_keys, old_arena_size, h->kset.raw_memory); +} + +/** + * Resize hash table if needed. + * + * @return TRUE if resizing occurred, FALSE otherwise. + */ +bool +hash_resize_as_needed(struct hash *h) +{ + hash_check(h); + assert_hash_locked(h); + g_assert(h->kset.items + h->kset.tombs <= h->kset.size); + + /* + * Never resize when iterating, since this would perturb the order + * of the keys and mess up with the iterator's position tracking. + */ + + if G_UNLIKELY(0 != h->refcnt) + return FALSE; + + if (h->kset.items <= HASH_LINE_ITEMS) { + /* + * An empty table is immediately brought back to its minimal state. + */ + + if G_UNLIKELY(0 == h->kset.items) + return hash_resize_min(h); + + /* + * When reducing the table, we use hysteresis to make sure we're not + * going to rebuild a smaller table that will later need to grow + * again. Since the table is small at this stage, we do not waste + * a lot of memory by keeping the table a little oversized. + * --RAM, 2012-12-15 + */ + + if ( + h->kset.items + 1 < h->kset.size / 2 && /* Note the hysteresis */ + h->kset.bits > HASH_MIN_BITS + ) { + hash_resize(h, HASH_RESIZE_CACHELINE); /* Table is oversized */ + return TRUE; + } + + /* + * If the table is small enough (up to HASH_LINE_ITEMS), it is dealt + * with specially: we wish to let this table fill-up, to the point + * where there are no free slots. Because the hashes array is held in + * a few memory cache lines and therefore is efficiently looked at even + * if it means going through all the slots, we can trade extra CPU + * cycles for optimum memory footprint for small tables. + */ + + if (h->kset.size <= HASH_LINE_ITEMS) { + /* + * We also allow for more tomb density than in the general case: + * we only rebuild when 50% of the slots are tombs, as opposed to + * 25% in the general case. Again, since the cost of looping over + * the hashes array is small (no memory fetching required past the + * first), the runtime penalty is negligeable. + * --RAM, 2012-12-15 + */ + + if (h->kset.tombs > h->kset.size / 2) { + hash_resize(h, HASH_RESIZE_SAME); /* Remove tombstones */ + return TRUE; + } + + h->kset.resize = FALSE; /* No resize wanted */ + return FALSE; + } + + /* FALL THROUGH -- table has not many items but is not "small" */ + } + + if (h->kset.items < h->kset.size / 4) { + if (h->kset.bits > HASH_MIN_BITS) { + hash_resize(h, HASH_RESIZE_SHRINK); /* Table is oversized */ + return TRUE; + } + } else if (h->kset.items + h->kset.tombs > h->kset.size / 4 * 3) { + /* Rebuild if less keys than 3/5 of the size, grow otherwise */ + hash_resize(h, (h->kset.items < h->kset.size / 5 * 3) ? + HASH_RESIZE_SAME : HASH_RESIZE_GROW); + return TRUE; + } else if (h->kset.tombs >= h->kset.size / 4) { + hash_resize(h, HASH_RESIZE_SAME); /* Remove tombstones */ + return TRUE; + } else if (h->kset.resize) { + if (h->kset.tombs != 0) { + /* + * Grow if we won't be attempting to shrink later + * + * Otherwise make sure there has been a significant variation + * in the amount of tombstones before attempting to rebuild, in + * order to avoid a pathological case where we would rebuild + * after each deletion. + * + * We need a number of tombs of at least 1/32th of the table + * size to allow a rebuild. + */ + + if (h->kset.items > h->kset.size / 2) { + hash_resize(h, HASH_RESIZE_GROW); + } else if (h->kset.tombs < (h->kset.size >> 5)) { + return FALSE; /* But leave the "resize" flag set */ + } else { + hash_resize(h, HASH_RESIZE_SAME); + } + return TRUE; + } else if (h->kset.items > h->kset.size / 2) { + /* Grow if we won't be attempting to shrink later */ + hash_resize(h, HASH_RESIZE_GROW); + return TRUE; + } else { + h->kset.resize = FALSE; /* Bad luck, live by large hops */ + } + } + + return FALSE; +} + +/** + * Insert key in table, returning index where insertion was made. + */ +size_t +hash_insert_key(struct hash *h, const void *key) +{ + bool found; + unsigned hv; + size_t idx, tombidx; + + hash_check(h); + assert_hash_locked(h); + + /* + * When table is small, don't resize immediately because maybe the + * key already exists hence we won't need to resize to insert it + * even when the table is full. + */ + + hv = hash_compute_primary(&h->kset, key); + + if (h->kset.size <= HASH_LINE_ITEMS) { + found = hash_keyset_lookup(&h->kset, key, hv, &idx, &tombidx); + if (!found && 0 == h->kset.tombs) { + /* + * Key does not exist and there are no tombstones to reuse. + * Resize the table if full then look up the key again to find + * the proper insertion index in the grown table. + */ + + if (h->kset.items == h->kset.size) { + hash_resize(h, HASH_RESIZE_GROW); /* No more room */ + found = hash_keyset_lookup(&h->kset, key, hv, &idx, &tombidx); + } + } else { + h->kset.resize = FALSE; /* Don't resize even if already full */ + } + } else { + hash_resize_as_needed(h); + found = hash_keyset_lookup(&h->kset, key, hv, &idx, &tombidx); + } + + if (!found) { + g_assert(size_is_non_negative(idx)); + g_assert(idx < h->kset.size); + g_assert(h->kset.items < h->kset.size); + + if (tombidx == idx) { + g_assert(size_is_positive(h->kset.tombs)); + g_assert(HASH_TOMB == h->kset.hashesidx); + + h->kset.tombs--; + } + h->kset.items++; + h->kset.hashesidx = hv; + } + + h->kset.keysidx = key; /* Could be a new pointer, so always update */ + + return idx; +} + +/** + * Lookup key in table, returning index where key was found or -1 if absent. + */ +size_t +hash_lookup_key(struct hash *h, const void *key) +{ + bool found; + unsigned hv; + size_t idx, tombidx; + + hash_check(h); + assert_hash_locked(h); + + hv = hash_compute_primary(&h->kset, key); + found = hash_keyset_lookup(&h->kset, key, hv, &idx, &tombidx); + + /* + * Regardless of whether key was found, attempt a resize if we went + * through too many hops. If the table ends-up being resized, then + * we'll have to look up the key again if it was initially present. + */ + + if G_UNLIKELY(h->kset.resize) { + if (!hash_resize_as_needed(h)) + goto no_resize; + + if (found) { + bool kept; + + kept = hash_keyset_lookup(&h->kset, key, hv, &idx, &tombidx); + g_assert(kept); /* Since key existed before resizing */ + } + } + +no_resize: + + if (found) { + /* + * Optimize search path for future lookups of this key: if the lookup + * path stepped over a tomb, move the key to that new index and + * erect a tombstone at the old location. + * + * When the reference count is not 0, we don't optimize because they + * are iterating on the hash table and therefore we cannot disrupt + * the order of the keys. + */ + + if G_UNLIKELY((size_t) -1 != tombidx && 0 == h->refcnt) { + const void **values = NULL; + + G_PREFETCH_R(&hv); + G_PREFETCH_R(&h->kset.keysidx); + G_PREFETCH_W(&h->kset.keystombidx); + G_PREFETCH_W(&h->kset.hashestombidx); + G_PREFETCH_W(&h->kset.hashesidx); + + if (h->kset.has_values) { + values = (*h->ops->get_values)(h); + G_PREFETCH_W(valuestombidx); + G_PREFETCH_R(valuesidx); + } + + g_assert(tombidx != idx); + g_assert(size_is_positive(h->kset.tombs)); + + h->kset.keystombidx = h->kset.keysidx; + h->kset.hashestombidx = hv; + if (values != NULL) + valuestombidx = valuesidx; + + h->kset.hashesidx = HASH_TOMB; + return tombidx; + } + + return idx; + } else { + return (size_t) -1; /* Key not found */ + } +} + +/** + * Delete key from table, returning whether key was found. + */ +bool +hash_delete_key(struct hash *h, const void *key) +{ + bool found; + unsigned hv; + size_t idx; + + hash_check(h); + assert_hash_locked(h); + + hv = hash_compute_primary(&h->kset, key); + found = hash_keyset_lookup(&h->kset, key, hv, &idx, NULL); + + if (found) { + bool erected; + + g_assert(size_is_positive(h->kset.items)); + + erected = hash_erect_tombstone(h, idx); + g_assert(erected); + h->kset.items--; + hash_resize_as_needed(h); + return TRUE; + } else { + return FALSE; /* Key not found */ + } +} + +/** + * Remove all items. + */ +void +hash_clear(struct hash *h) +{ + hash_check(h); + g_assert(0 == h->refcnt); + + hash_synchronize(h); + + hash_resize_min(h); + h->kset.items = 0; + + hash_return_void(h); +} + +/** + * Increase iterator reference count. + */ +void +hash_refcnt_inc(const struct hash *h) +{ + struct hash *wh = deconstify_pointer(h); + + hash_check(h); + assert_hash_locked(h); + + wh->refcnt++; +} + +/** + * Decrease iterator reference count. + */ +void +hash_refcnt_dec(const struct hash *h) +{ + struct hash *wh = deconstify_pointer(h); + + hash_check(h); + g_assert(size_is_positive(h->refcnt)); + assert_hash_locked(h); + + wh->refcnt--; +} + +/** + * Pick a random key among the ones present in the table. + * + * @param h the hash table + * @param keyptr where chosen key is written, if non-NULL + * + * @return the index of the chosen key, (size_t) -1 if the table is empty. + */ +size_t +hash_random(const struct hash *h, const void **keyptr) +{ + size_t i, n, idx; + const struct hkeys *hk; + + hash_check(h); + + hash_synchronize(h); + + if G_UNLIKELY(0 == h->kset.items) { + i = (size_t) -1; + goto done; + } + + /* + * Pick a random item number, then loop through the array to find that + * nth item (0-based counting). + * + * Assuming that the dispersion in the table is uniform, we start from the + * top if the chosen number is in the upper half of the item count, and + * from the bottom otherwise. + */ + + hk = &h->kset; + n = (size_t) random_ulong_value(hk->items - 1); + + if (n < hk->items / 2) { + idx = 0; + for (i = 0; i < hk->size; i++) { + unsigned ih = hk->hashesi; + + if (HASH_IS_REAL(ih)) { + if G_UNLIKELY(idx++ == n) + goto found; + } + } + } else { + idx = hk->items - 1; + for (i = hk->size; i != 0; /* empty */) { + unsigned ih = hk->hashes--i; + + if (HASH_IS_REAL(ih)) { + if G_UNLIKELY(idx-- == n) + goto found; + } + } + } + + g_assert_not_reached(); /* Item #n must have been found in table */ + +found: + if (keyptr != NULL) + *keyptr = hk->keysi; + + /* FALL THROUGH */ + +done: + hash_return(h, i); +} + +/** + * Polymorphic traversal, invoking callback for each key. + * + * @param h the hash table + * @param fn callback to invoke on the key + * @param data additional callback parameter + */ +void +hash_foreach(const struct hash *h, data_fn_t fn, void *data) +{ + unsigned *hp, *end; + size_t i, n; + + hash_check(h); + + hash_synchronize(h); + + end = &h->kset.hashesh->kset.size; + hash_refcnt_inc(h); /* Prevent any key relocation */ + + for (i = n = 0, hp = h->kset.hashes; hp != end; i++, hp++) { + if (HASH_IS_REAL(*hp)) { + (*fn)(deconstify_pointer(h->kset.keysi), data); + n++; + } + } + + g_assert(n == h->kset.items); + + hash_refcnt_dec(h); + hash_return_void(h); +} + +/** + * @return amount of itemsi in the hash table/set. + */ +size_t +hash_count(const struct hash *h) +{ + size_t count; + + hash_check(h); + + hash_synchronize(h); + count = h->kset.items; + hash_return(h, count); +} + +/** + * Free hash structure. + */ +void +hash_free(struct hash *h) +{ + hash_check(h); + + (*h->ops->hash_free)(h); +} + +/** + * Mark the hash as thread-safe. + * + * This needs to be done right after creating the hash table, when no + * concurrent access to the hash can be made. + */ +void +hash_thread_safe(struct hash *h) +{ + hash_check(h); + g_assert(NULL == h->lock); + + WALLOC0(h->lock); + mutex_init(h->lock); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/hash.h
Added
@@ -0,0 +1,226 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Definitions common for hash tables and hash sets. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _hash_h_ +#define _hash_h_ + +#include "mutex.h" + +enum hash_key_type { + HASH_KEY_SELF, /* Self-representing value */ + HASH_KEY_STRING, /* Strings, NUL-terminated buffer of variable length */ + HASH_KEY_FIXED, /* Fixed-length buffer keys */ + HASH_KEY_ANY, /* General key */ + HASH_KEY_ANY_DATA, /* General key, hashed and compared with data */ + + HASH_KEY_MAXTYPE +}; + +struct hash; + +/* + * The following definitions are only visible within the library. + */ + +#if defined(HTABLE_SOURCE) || defined(HSET_SOURCE) || defined(HASH_SOURCE) + +enum hmagic { + HTABLE_MAGIC = 0x7e62fd45, + HSET_MAGIC = 0x7e6295b9, + HEVSET_MAGIC = 0x7e622c20, + HIKSET_MAGIC = 0x7e626feb +}; + +#define HASH_MAGIC_SHIFT 16 /* How many trailing unique bits */ +#define HASH_MAGIC_COMMON 0x7e62 /* Common leading magic for all types */ + +#define HASH_MIN_BITS 1 +#define HASH_MIN_SIZE (1U << HASH_MIN_BITS) + +/** + * The key set structure. + */ +struct hkeys { + enum hash_key_type type; /* Type of keys */ + size_t size; /* Size of table (power of 2) */ + size_t items; /* Number of items held */ + size_t tombs; /* Amount of deleted items (tombstones) */ + const void **keys; /* Array of keys */ + unsigned *hashes; /* Array of hashed keys */ + union { + struct { + hash_fn_t hash; /* Primary key hashing function */ + hash_fn_t hash2; /* Secondary key hashing function */ + } h; + struct { + hash_data_fn_t hash; /* Single key hashing function */ + void *data; /* Extra parameter for hashing function */ + } hd; + } uh; + union { + eq_fn_t eq; /* Key equality test */ + eq_data_fn_t eq_data; /* Key equality test with extra data */ + size_t keysize; /* Fixed-length of keys */ + } uk; + unsigned bits:6; /* log2(size) -- large enough to hold 63 */ + unsigned resize:1; /* Too many hops, rebuild or resize */ + unsigned has_values:1; /* Whether keys have associated values */ + unsigned raw_memory:1; /* Don't use walloc(), use VMM and xpmalloc() */ +}; + +#define HASH(x) ((struct hash *) (x)) + +/* + * Type of item in given position (hashes from key set). + */ + +#define HASH_FREE 0 /* Nothing there */ +#define HASH_TOMB 1 /* Item deleted */ +#define HASH_REAL 2 /* First real hash value */ + +#define HASH_IS_FREE(x) (HASH_FREE == (x)) +#define HASH_IS_TOMB(x) (HASH_TOMB == (x)) +#define HASH_IS_REAL(x) ((x) >= HASH_REAL) + +/** + * Redefined routines in each heir. + * + * These operations are defined for polymorphic dispatching from routines + * that are defined in the ancestor, not for all the operations that can + * happen on a hash table. + */ +struct hash_ops { + void (*set_values)(struct hash *h, const void **p); + const void **(*get_values)(const struct hash *h); + void (*hash_free)(struct hash *h); +}; + +/** + * Common hash attributes. + * + * This is the ancestor of our little hierarchy here, which has two heirs: + * a hash table and a hash set. + */ +#define HASH_COMMON_ATTRIBUTES \ + enum hmagic magic; /* Magic number */ \ + size_t refcnt; /* Iterator reference count */ \ + size_t stamp; /* Modification stamp */ \ + struct hkeys kset; /* Set of keys */ \ + mutex_t *lock; /* Thread-safe lock (optional) */ \ + const struct hash_ops *ops; /* Polymorphism */ + +/** + * A hash table or hash set header. + */ +struct hash { + HASH_COMMON_ATTRIBUTES +}; + +/* + * Thread-safe synchronization support. + */ + +void hash_thread_safe(struct hash *h); + +#define hash_synchronize(h) G_STMT_START { \ + if G_UNLIKELY((h)->lock != NULL) \ + mutex_lock((h)->lock); \ +} G_STMT_END + +#define hash_unsynchronize(h) G_STMT_START { \ + if G_UNLIKELY((h)->lock != NULL) \ + mutex_unlock((h)->lock); \ +} G_STMT_END + +#define hash_return(h, v) G_STMT_START { \ + if G_UNLIKELY((h)->lock != NULL) \ + mutex_unlock((h)->lock); \ + return v; \ +} G_STMT_END + +#define hash_return_void(h) G_STMT_START { \ + if G_UNLIKELY((h)->lock != NULL) \ + mutex_unlock((h)->lock); \ + return; \ +} G_STMT_END + +#define assert_hash_locked(h) G_STMT_START { \ + if G_UNLIKELY((h)->lock != NULL) \ + assert_mutex_is_owned((h)->lock); \ +} G_STMT_END + +/* + * Protected interface. + */ + +/* + * Routines with a keyset parameter only handle keys. + */ + +void hash_keyhash_setup(struct hkeys *hk, + enum hash_key_type ktype, size_t keysize); +void hash_keyhash_any_setup(struct hkeys *hk, + hash_fn_t primary, hash_fn_t secondary, eq_fn_t eq); +void hash_keyhash_data_setup(struct hkeys *hk, + hash_data_fn_t hash, void *data, eq_data_fn_t eq); + +/* + * Routines with a hash parameter also handle values, if any, when resizing. + */ + +void hash_arena_allocate(struct hash *h, size_t bits); +void hash_arena_free(struct hash *h); +bool hash_resize_as_needed(struct hash *h); +size_t hash_insert_key(struct hash *h, const void *key); +size_t hash_lookup_key(struct hash *h, const void *key); +bool hash_delete_key(struct hash *h, const void *key); +bool hash_erect_tombstone(struct hash *h, size_t idx); + +void hash_refcnt_inc(const struct hash *h); +void hash_refcnt_dec(const struct hash *h); + +#endif /* HTABLE_SOURCE || HSET_SOURCE || HASH_SOURCE */ + +/* + * Public polymorphic interface. + */ + +void hash_foreach(const struct hash *h, data_fn_t fn, void *data); +void hash_clear(struct hash *h); +size_t hash_count(const struct hash *h); +size_t hash_random(const struct hash *h, const void **keyptr); +void hash_free(struct hash *h); + +#endif /* _hash_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/hashing.c
Added
@@ -0,0 +1,527 @@ +/* + * Copyright (c) 2003-2008 Christian Biere + * Copyright (c) 2008-2012, 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Hashing functions and related ancillary routines. + * + * Routines flagged with a "2", such as binary_hash2(), are alternative + * hashing routines for some class of key. They produce different hash + * values than the other routine (the one without the "2") and have + * different colliding keys. They are meant to be used as secondary + * hash routines for hash tables using double hashing. + * + * The hashing_fold() routine is not a hashing function but is a way to + * reduce an unsigned value down to a smaller number of bits without simply + * dropping a part of the hashed value. When using hash tables whose size + * is a power of two, this should give better results than just masking the + * lower bits of the hash code because all the bits participate into the + * construction of the smaller hash code. + * + * The key-equality routines defined here are meant to be used by hash + * tables to compare the keys. + * + * @author Raphael Manfredi + * @date 2008-2012 + * @author Christian Biere + * @date 2003-2008 + */ + +#include "common.h" + +#include "hashing.h" +#include "endian.h" +#include "unsigned.h" + +#include "override.h" /* Must be the last header included */ + +#define rotl(x, k) (((x) << (k)) | ((x) >> (32 - (k)))) + +/** + * Hashing of pointers. + * + * The identity function makes a poor hash for pointers. + */ +unsigned +pointer_hash(const void *p) +{ +#if PTRSIZE <= 4 + return u32_ptr_hash(pointer_to_ulong(p)); +#else + uint64 v = pointer_to_ulong(p); + return u32_ptr_hash(v) + u32_hash(v >> 32); +#endif +} + +/** + * Alternate hashing of pointers. + * + * The identity function makes a poor hash for pointers. + */ +unsigned +pointer_hash2(const void *p) +{ +#if PTRSIZE <= 4 + return u32_ptr_hash2(pointer_to_ulong(p)); +#else + uint64 v = pointer_to_ulong(p); + return u32_ptr_hash2(v) + u32_hash2(v >> 32); +#endif +} + +/** + * Equality comparison of pointers. + */ +bool +pointer_eq(const void *a, const void *b) +{ + return a == b; +} + +/** + * Hashing of integers. + * + * The identity function makes a poor hash for consecutive integers. + */ +unsigned +integer_hash(ulong v) +{ +#if LONGSIZE <= 4 + return u32_hash(v); +#else + return u32_hash(v) + u32_hash(v >> 32); +#endif +} + +/** + * Alternate hashing of integers. + * + * The identity function makes a poor hash for consecutive integers. + */ +unsigned +integer_hash2(ulong v) +{ +#if LONGSIZE <= 4 + return u32_hash2(v); +#else + return u32_hash2(v) + u32_hash2(v >> 32); +#endif +} + +/** + * Hash `len' bytes starting from `data'. + */ +unsigned G_HOT +binary_hash(const void *data, size_t len) +{ + const unsigned char *key = data; + size_t i, remain, t4; + uint32 hash; + + remain = len & 0x3; + t4 = len & ~0x3U; + + g_assert(remain + t4 == len); + g_assert(remain <= 3); + + hash = len; + for (i = 0; i < t4; i += 4) { + static const uint32 x = { + 0xb0994420, 0x01fa96e3, 0x05066d0e, 0x50c3c22a, + 0xec99f01f, 0xc0eaa79d, 0x157d4257, 0xde2b8419 + }; + hash ^= peek_le32(&keyi); + hash += x(i >> 2) & 0x7; + hash = rotl(hash, 13); + } + + for (i = 0; i < remain; i++) { + hash += keyt4 + i; + hash ^= keyt4 + i << (i * 8); + hash = rotl(hash, 23); + } + + return hashing_mix32(hash); +} + +/** + * Alternate hashing of `len' bytes starting from `data'. + */ +unsigned G_HOT +binary_hash2(const void *data, size_t len) +{ + const unsigned char *key = data; + size_t i, remain, t4; + uint32 hash; + + remain = len & 0x3; + t4 = len & ~0x3U; + + g_assert(remain + t4 == len); + g_assert(remain <= 3); + + hash = len; + for (i = 0; i < t4; i += 4) { + static const uint32 x = { + 0xe58b8e35, 0x27366c0a, 0x358b0c38, 0x1e538b42, + 0x4dc6694c, 0x394dca87, 0x7ecb71bb, 0x594da47a + }; + hash ^= peek_le32(&keyi); + hash += x(i >> 2) & 0x7; + hash = rotl(hash, 15); + } + + for (i = 0; i < remain; i++) { + hash += keyt4 + i; + hash ^= keyt4 + i << (i * 8); + hash = rotl(hash, 25); + } + + return hashing_mix32(hash); +} + +/** + * Buffer comparison, the two having the same length. + */ +bool +binary_eq(const void *a, const void *b, size_t len) +{ + return 0 == memcmp(a, b, len); +} + +/** + * String hashing routine. + * + * This hash function is based on the principle of multiplication by a + * prime number which can be decomposed as a series of additions and shifts. + * + * Here it achieves a multiplication by 31, as originally proposed by + * Brian Kernighan and Dennis Ritchie in their book on C. + */ +unsigned +string_hash(const void *s) +{ + const signed char *p = s; + unsigned hash = 0; + int c; + + while ('\0' != (c = *p++)) + hash = (hash << 5) - hash + c; /* 31 = 32 - 1 */ + + return hash; +} + +/** + * Alternate string hashing routine. + * + * This hash function is based on the principle of multiplication by a + * prime number which can be decomposed as a series of additions and shifts. + * + * Here it achieves a multiplication by the prime number 131; + */ +unsigned +string_hash2(const void *s) +{ + const signed char *p = s; + unsigned hash = 0; + int c; + + while ('\0' != (c = *p++)) + hash += (hash << 7) + (hash << 1) + c; /* 131 = 128 + 2 + 1 */ + + return hash; +} + +/** + * String comparison. + */ +bool +string_eq(const void *a, const void *b) +{ + return a == b || 0 == strcmp(a, b); +} + +#define HASH_M3_C1 0xCC9E2D51U +#define HASH_M3_C2 0x1B873593U +#define HASH_M3_C3 0xE6546B64U + +/** + * This is the Murmur3 hashing algorithm which exhibits good distribution + * properties leading to fewer collisions in hash tables. + */ +unsigned G_HOT +universal_hash(const void *data, size_t len) +{ + uint32 k, hash = len * GOLDEN_RATIO_32; /* Initial hash by RAM */ + size_t n, remain; + const unsigned char *p = data; + + if G_UNLIKELY(!size_is_positive(len) || NULL == data) + return 0; + + remain = len & 0x3; + + /* + * Process 32-bit words + */ + + for (n = len >> 2; n != 0; n--, p += 4) { + k = peek_le32(p); + + k *= HASH_M3_C1; + k = rotl(k, 15); + k *= HASH_M3_C2; + + hash ^= k; + hash = rotl(hash, 13); + hash = hash * 5 + HASH_M3_C3; + } + + /* + * Process trailing bytes. + */ + + k = 0; + + switch (remain) { + case 3: k ^= *(p + 2) << 16; + case 2: k ^= *(p + 1) << 8; + case 1: k ^= *p; + k *= HASH_M3_C1; k = rotl(k, 15); k *= HASH_M3_C2; + hash ^= k; + } + + /* + * Force "avalanching" of bits. + */ + + hash ^= len; + + return hashing_mix32(hash); +} + +#define mix(a, b, c) G_STMT_START { \ + a -= c; a ^= rotl(c, 4); c += b; \ + b -= a; b ^= rotl(a, 6); a += c; \ + c -= b; c ^= rotl(b, 8); b += a; \ + a -= c; a ^= rotl(c, 16); c += b; \ + b -= a; b ^= rotl(a, 19); a += c; \ + c -= b; c ^= rotl(b, 4); b += a; \ +} G_STMT_END + +#define final(a, b, c) G_STMT_START { \ + c ^= b; c -= rotl(b, 14); \ + a ^= c; a -= rotl(c, 11); \ + b ^= a; b -= rotl(a, 25); \ + c ^= b; c -= rotl(b, 16); \ + a ^= c; a -= rotl(c, 4); \ + b ^= a; b -= rotl(a, 14); \ + c ^= b; c -= rotl(b, 24); \ +} G_STMT_END + +/** + * Bob Jenkins's so-called "lookup3 hashlittle" routine. + * + * This routine is slower than binary_hash() and is included here to be + * able to measure clustering impacts when an alternative hash is used. + */ +unsigned G_HOT +universal_mix_hash(const void *data, size_t len) +{ + uint32 a, b, c; /* Internal state */ + size_t n; + const uint8 *p = data; + + /* Set up the internal state */ + a = b = c = GOLDEN_RATIO_32 + ((uint32) len) + 0xf51b9dab; /* random */ + n = len; + + while (n > 12) { + a += peek_le32(&p0); + b += peek_le32(&p4); + c += peek_le32(&p8); + p += 12; + mix(a, b, c); + n -= 12; + } + + switch (n) { + case 12: + a += peek_le32(&p0); + b += peek_le32(&p4); + c += peek_le32(&p8); + break; + case 11: + c += ((uint32) p10) << 16; + /* FALL THROUGH */ + case 10: + c += ((uint32) p9) << 8; + /* FALL THROUGH */ + case 9: + c += p8; + /* FALL THROUGH */ + case 8: + a += peek_le32(&p0); + b += peek_le32(&p4); + break; + case 7: + b += ((uint32) p6) << 16; + /* FALL THROUGH */ + case 6: + b += ((uint32) p5) << 8; + /* FALL THROUGH */ + case 5: + b += p4; + /* FALL THROUGH */ + case 4: + a += peek_le32(&p0); + break; + case 3: + a += ((uint32) p2) << 16; + /* FALL THROUGH */ + case 2: + a += ((uint32) p1) << 8; + case 1: + a += p0; + break; + case 0: + return c; + } + + final(a, b, c); + return c; +} + +/** + * Alternate string hashing routine, using Bob Jenkins's hash algorithm. + */ +unsigned G_HOT +string_mix_hash(const void *s) +{ + const uint8 *p = s; + uint32 a, b, c; /* Internal state */ + uint32 v; + int n = 0; + + a = b = c = GOLDEN_RATIO_32; + + while (0 != (v = *p++)) { + switch (n++) { + case 0: + a += v; + break; + case 1: + a += v << 8; + break; + case 2: + a += v << 16; + break; + case 3: + a += v << 24; + break; + case 4: + b += v; + break; + case 5: + b += v << 8; + break; + case 6: + b += v << 16; + break; + case 7: + b += v << 24; + break; + case 8: + c += v; + break; + case 9: + c += v << 8; + break; + case 10: + c += v << 16; + break; + case 11: + c += v << 24; + mix(a, b, c); + n = 0; + break; + } + } + + if (n != 0) + final(a, b, c); + + return c; +} + +/** + * Fold bits from hash value into a smaller amount of bits by considering all + * the bits from the value, not just the trailing bits. + * + * @param hash the original hash value + * @param bits amount of bits to keep + * + * @return a folded value of ``bits'' bits. + */ +unsigned G_HOT +hashing_fold(unsigned hash, size_t bits) +{ + unsigned v = 0; + unsigned h = hash; + + g_assert(bits != 0); + + if G_UNLIKELY(bits >= 8 * sizeof(unsigned)) + return hash; + + /* Unroll loop as this is a hot spot */ + +#define FOLD_STEP \ + v ^= h; \ + h >>= bits; + +#define FOLD_STEP_TEST \ + FOLD_STEP \ + if G_UNLIKELY(0 == h) break; + + while (h != 0) { + FOLD_STEP_TEST + FOLD_STEP_TEST + FOLD_STEP_TEST + FOLD_STEP_TEST + FOLD_STEP_TEST + FOLD_STEP_TEST + FOLD_STEP_TEST + FOLD_STEP + } + +#undef FOLD_STEP +#undef FOLD_STEP_TEST + + return v & ((1 << bits) - 1); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/hashing.h
Added
@@ -0,0 +1,237 @@ +/* + * Copyright (c) 2003-2008 Christian Biere + * Copyright (c) 2008-2012, 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Hashing functions and other ancillary routines. + * + * @author Christian Biere + * @date 2003-2008 + * @author Raphael Manfredi + * @date 2008-2012, 2015 + */ + +#ifndef _hashing_h_ +#define _hashing_h_ + +/* + * Golden ratios. + * + * Let A = (sqrt(5) - 1) / 2 + * + * We're going to compute: + * + * h(k) = floor(m * (kA - floor(kA))) + * + * using integer arithmetic and keeping only the "fractional" part of + * the product. + * + * With m = 2^b, we can achieve this the following way: + * + * Multiply the w bits of k by floor(A * 2^w) to obtain a w-bit product. + * Extract the b most significant bits of the lower half of this product. + * + * The GOLDEN_RATIO_xx constant are floor(A * 2^xx). + * The multiplication is done using 32-bit arithmetic and we let it overflow, + * keeping only the lower "half" of the product. + */ +#define GOLDEN_RATIO_31 0x4F1BBCDCUL /* Golden ratio of 2^31 */ +#define GOLDEN_RATIO_32 0x9E3779B9UL /* Golden ratio of 2^32 */ +#define GOLDEN_RATIO_48 UINT64_CONST(0x9E3779B97F4B) /* Golden ratio of 2^48 */ + +/* + * Public interface. + */ + +unsigned pointer_hash(const void *p) G_CONST; +unsigned binary_hash(const void *data, size_t len) G_PURE; +unsigned string_hash(const void *s) G_PURE; +unsigned integer_hash(ulong v) G_CONST; + +unsigned pointer_hash2(const void *p) G_CONST; +unsigned binary_hash2(const void *data, size_t len) G_PURE; +unsigned string_hash2(const void *s) G_PURE; +unsigned integer_hash2(ulong v) G_CONST; + +unsigned universal_hash(const void *data, size_t len) G_PURE; +unsigned universal_mix_hash(const void *data, size_t len) G_PURE; +unsigned string_mix_hash(const void *s) G_PURE; + +bool pointer_eq(const void *a, const void *b) G_CONST; +bool binary_eq(const void *a, const void *b, size_t len) G_PURE; +bool string_eq(const void *a, const void *b) G_PURE; + +unsigned hashing_fold(unsigned hash, size_t bits) G_CONST; + +/** + * @note + * In order for pointer_hash_fast() to distribute its trailing bits evenly + * among the set of aligned pointers, we need to make sure u32_ptr_hash() will + * shift its bits by an amount at least equal to the alignment constraint. + * + * If we are not careful, the trailing bit of pointer_hash_fast() will not + * distribute evenly and masking a number of these trailing bits to index + * an array will cause only certain indices to be selected, others being left + * alone. To force dispersion among this subset of bits, we need to take + * into acount the fact that pointers are discrete quantities, aligned on some + * boundary, which means some of their trailing bits are always zero! + * + * For instance, if alignments is on an 8-byte boundary, we need to shift + * the trailing bits of the multiplicative hash by at least 3 since 2**3 = 8 + * and the 3 trailing bits of all pointers will be zero, causing the 3 trailing + * bits of the hash to be unevenly distributed. + * + * That number of bits is the base-2 logarihtm of the alignment. + * + * We define HASHING_PTR_SHIFT for common values of MEM_ALIGNBYTES. + */ +#if 2 == MEM_ALIGNBYTES +#define HASHING_PTR_SHIFT 1 +#elif 4 == MEM_ALIGNBYTES +#define HASHING_PTR_SHIFT 2 +#elif 8 == MEM_ALIGNBYTES +#define HASHING_PTR_SHIFT 3 +#elif 16 == MEM_ALIGNBYTES +#define HASHING_PTR_SHIFT 4 +#elif 32 == MEM_ALIGNBYTES +#define HASHING_PTR_SHIFT 5 +#else +#error "unexpected value for MEM_ALIGNBYTES" +#endif + +/** + * Hashing of a 16-bit value. + */ +static inline ALWAYS_INLINE unsigned +u16_hash(uint16 v) +{ + return (GOLDEN_RATIO_48 * (uint64) v) >> 13; +} + +/** + * Alternative hashing of a 16-bit value. + */ +static inline ALWAYS_INLINE unsigned +u16_hash2(uint16 v) +{ + return (GOLDEN_RATIO_32 * (uint64) v) >> 2; +} + +/** + * Hashing of a 32-bit value. + */ +static inline ALWAYS_INLINE unsigned +u32_hash(uint32 v) +{ + return (GOLDEN_RATIO_32 * (uint64) v) >> 3; +} + +/** + * Alternative hashing of a 32-bit value. + */ +static inline ALWAYS_INLINE unsigned +u32_hash2(uint32 v) +{ + return (GOLDEN_RATIO_48 * (uint64) v) >> 7; +} + +/** + * Hashing of a 32-bit "discrete" pointer value whose HASHING_PTR_SHIFT + * trailing bits are always 0. + */ +static inline ALWAYS_INLINE unsigned +u32_ptr_hash(uint32 v) +{ + return (GOLDEN_RATIO_32 * (uint64) v) >> HASHING_PTR_SHIFT; +} + +/** + * Alternate hashing of a 32-bit "discrete" pointer value whose + * HASHING_PTR_SHIFT trailing bits are always 0. + */ +static inline ALWAYS_INLINE unsigned +u32_ptr_hash2(uint32 v) +{ + return (GOLDEN_RATIO_48 * (uint64) v) >> HASHING_PTR_SHIFT; +} + +/** + * Fast inlined hashing of integers. + * + * The identity function makes a poor hash for consecutive integers. + */ +static inline ALWAYS_INLINE unsigned +integer_hash_fast(ulong v) +{ +#if LONGSIZE <= 4 + return u32_hash(v); +#else + return u32_hash(v) + u32_hash(v >> 32); +#endif +} + +/** + * Fast inlined hashing of pointers. + * + * The identity function makes a poor hash for pointers. + */ +static inline ALWAYS_INLINE unsigned +pointer_hash_fast(const void *p) +{ +#if PTRSIZE <= 4 + return u32_ptr_hash(pointer_to_ulong(p)); +#else + uint64 v = pointer_to_ulong(p); + return u32_ptr_hash(v) + u32_hash(v >> 32); +#endif +} + +/** + * Keep only the trailing ``bits'' from hash value, zeroing the others. + */ +static inline ALWAYS_INLINE unsigned G_CONST +hashing_keep(unsigned hash, size_t bits) +{ + return hash & (~0U >> (sizeof(unsigned) * 8 - bits)); +} + +/** + * Force "avalanching" of all the bits among the 32-bit value. + */ +static inline uint32 ALWAYS_INLINE +hashing_mix32(uint32 h) +{ + h ^= h >> 16; + h *= 0x85EBCA6BU; + h ^= h >> 13; + h *= 0xC2B2AE35U; + h ^= h >> 16; + return h; +} + +#endif /* _hashing_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/hashlist.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/hashlist.c
Changed
@@ -1,5 +1,6 @@ /* * Copyright (c) 2003, Christian Biere + * Copyright (c) 2009-2013, Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -37,34 +38,52 @@ * It is NOT a hash table preserving the order of keys. This structure only * stores items, not an association between a key and a value. * + * Each hash list object can be made thread-safe, optionally, so that + * concurrent access to it be possible. + * * @author Christian Biere * @date 2003 + * @author Raphael Manfredi + * @date 2009-2013 */ #include "common.h" #include "hashlist.h" + +#include "elist.h" +#include "hashing.h" +#include "hikset.h" #include "misc.h" -#include "glib-missing.h" +#include "mutex.h" +#include "plist.h" +#include "unsigned.h" #include "walloc.h" + #include "override.h" /* Must be the last header included */ +#if 0 +#define USE_HASH_LIST_REGRESSION +#endif + enum hash_list_magic { HASH_LIST_MAGIC = 0x338954fdU }; struct hash_list { enum hash_list_magic magic; unsigned stamp; - GHashTable *ht; - GList *head, *tail; - int len; + mutex_t *lock; + hikset_t *ht; + elist_t list; int refcount; }; struct hash_list_item { - const void *orig_key; - GList *list; + const void *key; /* The "key" is the data we store in the hashlist */ + link_t lnk; /* The embedded link to chain items together */ }; +#define ITEM(l) elist_item((l), struct hash_list_item, lnk); + enum hash_list_iter_magic { HASH_LIST_ITER_MAGIC = 0x438954efU }; enum hash_list_iter_direction { @@ -78,11 +97,11 @@ enum hash_list_iter_direction dir; unsigned stamp; hash_list_t *hl; - GList *prev, *next; + link_t *prev, *next; struct hash_list_item *item; }; -static G_GNUC_HOT void +static void G_HOT hash_list_iter_check(const hash_list_iter_t * const iter) { g_assert(NULL != iter); @@ -92,35 +111,62 @@ g_assert(iter->hl->stamp == iter->stamp); } -#if 0 -#define USE_HASH_LIST_REGRESSION 1 -#endif +/* + * Thread-safe synchronization support. + */ + +#define hash_list_synchronize(h) G_STMT_START { \ + if G_UNLIKELY((h)->lock != NULL) { \ + hash_list_t *wh = deconstify_pointer(h); \ + mutex_lock(wh->lock); \ + } \ +} G_STMT_END + +#define hash_list_unsynchronize(h) G_STMT_START { \ + if G_UNLIKELY((h)->lock != NULL) { \ + hash_list_t *wh = deconstify_pointer(h); \ + mutex_unlock(wh->lock); \ + } \ +} G_STMT_END + +#define hash_list_return(h, v) G_STMT_START { \ + if G_UNLIKELY((h)->lock != NULL) \ + mutex_unlock((h)->lock); \ + return v; \ +} G_STMT_END + +#define hash_list_return_void(h) G_STMT_START { \ + if G_UNLIKELY((h)->lock != NULL) \ + mutex_unlock((h)->lock); \ + return; \ +} G_STMT_END + +#define assert_hash_list_locked(h) G_STMT_START { \ + if G_UNLIKELY((h)->lock != NULL) \ + assert_mutex_is_owned((h)->lock); \ +} G_STMT_END -#define equiv(p,q) (!(p) == !(q)) #ifdef USE_HASH_LIST_REGRESSION static inline void hash_list_regression(const hash_list_t * const hl) { g_assert(NULL != hl->ht); - g_assert(hl->len >= 0); - g_assert(g_list_first(hl->head) == hl->head); - g_assert(g_list_first(hl->tail) == hl->head); - g_assert(g_list_last(hl->head) == hl->tail); - g_assert(g_list_length(hl->head) == UNSIGNED(hl->len)); - g_assert(g_hash_table_size(hl->ht) == UNSIGNED(hl->len)); + hash_list_synchronize(hl); + g_assert(elist_count(&hl->list) == hikset_count(hl->ht)); + g_assert(elist_count(&hl->list) == elist_length(elist_first(&hl->list))); + hash_list_unsynchronize(hl); } #else #define hash_list_regression(hl) #endif -static G_GNUC_HOT void +static void G_HOT hash_list_check(const hash_list_t * const hl) { g_assert(NULL != hl); g_assert(HASH_LIST_MAGIC == hl->magic); g_assert(hl->refcount > 0); - g_assert(equiv(hl->len == 0, hl->tail == NULL)); hash_list_regression(hl); } @@ -154,16 +200,16 @@ * Create a new hash list. */ hash_list_t * -hash_list_new(GHashFunc hash_func, GEqualFunc eq_func) +hash_list_new(hash_fn_t hash_func, eq_fn_t eq_func) { hash_list_t *hl; - WALLOC(hl); - hl->ht = g_hash_table_new(hash_func, eq_func); - hl->head = NULL; - hl->tail = NULL; + WALLOC0(hl); + hl->ht = hikset_create_any( + offsetof(struct hash_list_item, key), + NULL == hash_func ? pointer_hash : hash_func, eq_func); + elist_init(&hl->list, offsetof(struct hash_list_item, lnk)); hl->refcount = 1; - hl->len = 0; hl->stamp = (unsigned) HASH_LIST_MAGIC + 1; hl->magic = HASH_LIST_MAGIC; hash_list_regression(hl); @@ -172,12 +218,65 @@ } /** + * Mark newly created hash list as being thread-safe. + * + * This will make all external operations on the list thread-safe. + */ +void +hash_list_thread_safe(hash_list_t *hl) +{ + hash_list_check(hl); + g_assert(NULL == hl->lock); + + WALLOC0(hl->lock); + mutex_init(hl->lock); +} + +/** + * Lock the hash list to allow a sequence of operations to be atomically + * conducted. + * + * It is possible to lock the list several times as long as each locking + * is paired with a corresponding unlocking in the execution flow. + * + * The list must have been marked thread-safe already. + */ +void +hash_list_lock(hash_list_t *hl) +{ + hash_list_check(hl); + g_assert_log(hl->lock != NULL, + "%s(): table %p not marked thread-safe", G_STRFUNC, hl); + + mutex_lock(hl->lock); +} + +/* + * Release lock on hash list. + * + * The list must have been marked thread-safe already and locked by the + * calling thread. + */ +void +hash_list_unlock(hash_list_t *hl) +{ + hash_list_check(hl); + g_assert_log(hl->lock != NULL, + "%s(): table %p not marked thread-safe", G_STRFUNC, hl); + + mutex_unlock(hl->lock); +} + +/** * Dispose of the data structure, but not of the items it holds. * * @param hl_ptr pointer to the variable containing the address of the list * * As a side effect, the variable containing the address of the list * is nullified, since it is no longer allowed to refer to the structure. + * + * Calling the routine with the lock already taken is OK, since this + * is handled specially (given that the lock will be destroyed anyway). */ void hash_list_free(hash_list_t **hl_ptr) @@ -186,23 +285,34 @@ if (*hl_ptr) { hash_list_t *hl = *hl_ptr; - GList *iter; hash_list_check(hl); + /* + * When coming from hash_list_free_all() we're already locked, so + * we must not relock or we'll get a critical warning when the + * mutex is destroyed below.. + */ + + if (hl->lock != NULL) { + if (!mutex_is_owned(hl->lock)) + mutex_lock(hl->lock); + } + if (--hl->refcount != 0) { - g_carp("hash_list_free: hash list is still referenced! " - "(hl=%p, hl->refcount=%d)", - cast_to_gconstpointer(hl), hl->refcount); + g_critical("%s(): hash list is still referenced! " + "(hl=%p, hl->refcount=%d)", + G_STRFUNC, cast_to_pointer(hl), hl->refcount); } - gm_hash_table_destroy_null(&hl->ht); + hikset_free_null(&hl->ht); + elist_wfree(&hl->list, sizeof(struct hash_list_item)); + elist_discard(&hl->list); - for (iter = hl->head; NULL != iter; iter = g_list_next(iter)) { - struct hash_list_item *item = iter->data; - WFREE(item); + if (hl->lock != NULL) { + mutex_destroy(hl->lock); + WFREE(hl->lock); } - gm_list_free_null(&hl->head); hl->magic = 0; WFREE(hl); @@ -213,11 +323,11 @@ static void hash_list_freecb_wrapper(void *data, void *user_data) { - hashlist_destroy_cb freecb = cast_pointer_to_func(user_data); + free_fn_t freecb = cast_pointer_to_func(user_data); struct hash_list_item *item = data; - (*freecb)(deconstify_gpointer(item->orig_key)); - item->orig_key = NULL; + (*freecb)(deconstify_pointer(item->key)); + item->key = NULL; } /** @@ -226,7 +336,7 @@ * and nullifying its pointer. */ void -hash_list_free_all(hash_list_t **hl_ptr, hashlist_destroy_cb freecb) +hash_list_free_all(hash_list_t **hl_ptr, free_fn_t freecb) { g_assert(hl_ptr != NULL); g_assert(freecb != NULL); @@ -235,8 +345,12 @@ hash_list_t *hl = *hl_ptr; hash_list_check(hl); - G_LIST_FOREACH_WITH_DATA(hl->head, hash_list_freecb_wrapper, + + hash_list_synchronize(hl); + + elist_foreach(&hl->list, hash_list_freecb_wrapper, cast_func_to_pointer(freecb)); + hash_list_free(hl_ptr); } } @@ -244,11 +358,10 @@ static void hash_list_insert_item(hash_list_t *hl, struct hash_list_item *item) { - g_assert(NULL == g_hash_table_lookup(hl->ht, item->orig_key)); - gm_hash_table_insert_const(hl->ht, item->orig_key, item); + g_assert(!hikset_contains(hl->ht, item->key)); + assert_hash_list_locked(hl); - g_assert(hl->len < INT_MAX); - hl->len++; + hikset_insert_key(hl->ht, &item->key); /* * Insertion in the list is "safe" with respect to iterators. @@ -279,13 +392,14 @@ hash_list_check(hl); WALLOC(item); - hl->tail = g_list_last(g_list_append(hl->tail, item)); - if (NULL == hl->head) { - hl->head = hl->tail; - } - item->orig_key = key; - item->list = hl->tail; + item->key = key; + + hash_list_synchronize(hl); + + elist_append(&hl->list, item); hash_list_insert_item(hl, item); + + hash_list_return_void(hl); } /** @@ -301,13 +415,14 @@ hash_list_check(hl); WALLOC(item); - hl->head = g_list_prepend(hl->head, item); - if (NULL == hl->tail) { - hl->tail = hl->head; - } - item->orig_key = key; - item->list = hl->head; + item->key = key; + + hash_list_synchronize(hl); + + elist_prepend(&hl->list, item); hash_list_insert_item(hl, item); + + hash_list_return_void(hl); } /** @@ -317,69 +432,66 @@ * guarantee as to whether the iteration will see the new item. */ void -hash_list_insert_sorted(hash_list_t *hl, const void *key, GCompareFunc func) +hash_list_insert_sorted(hash_list_t *hl, const void *key, cmp_fn_t func) { - GList *iter; + link_t *lk; hash_list_check(hl); g_assert(NULL != func); - g_assert(NULL == g_hash_table_lookup(hl->ht, key)); + g_assert(!hikset_contains(hl->ht, key)); + + hash_list_synchronize(hl); - for (iter = hl->head; iter; iter = g_list_next(iter)) { - struct hash_list_item *item = iter->data; - if (func(key, item->orig_key) <= 0) + for (lk = elist_first(&hl->list); lk != NULL; lk = elist_next(lk)) { + struct hash_list_item *item = ITEM(lk); + if ((*func)(key, item->key) <= 0) break; } - if (NULL == iter) { + if (NULL == lk) { hash_list_append(hl, key); } else { struct hash_list_item *item; WALLOC(item); - item->orig_key = key; + item->key = key; - /* Inserting ``item'' before ``iter'' */ - - hl->head = g_list_insert_before(hl->head, iter, item); - item->list = g_list_previous(iter); + /* Inserting ``item'' before ``lk'' */ + elist_link_insert_before(&hl->list, lk, &item->lnk); hash_list_insert_item(hl, item); } + + hash_list_return_void(hl); } static int sort_wrapper(const void *a, const void *b, void *data) { - GCompareFunc func = (GCompareFunc) cast_pointer_to_func(data); + cmp_fn_t func = (cmp_fn_t) cast_pointer_to_func(data); const struct hash_list_item *ha = a; const struct hash_list_item *hb = b; - return (*func)(ha->orig_key, hb->orig_key); + return (*func)(ha->key, hb->key); } /** * Sort the list with ``func'' comparing keys. */ void -hash_list_sort(hash_list_t *hl, GCompareFunc func) +hash_list_sort(hash_list_t *hl, cmp_fn_t func) { hash_list_check(hl); g_assert(1 == hl->refcount); g_assert(NULL != func); - /* - * Unfortunately, relying on g_list_sort() requires one more traversal - * to update the tail. -- FIXME - */ - - hl->head = g_list_sort_with_data(hl->head, sort_wrapper, - func_to_pointer(func)); - hl->tail = g_list_last(hl->head); + hash_list_synchronize(hl); + elist_sort_with_data(&hl->list, sort_wrapper, func_to_pointer(func)); + hash_list_return_void(hl); } struct sort_with_data { - GCompareDataFunc func; + cmp_data_fn_t func; void *data; }; @@ -390,7 +502,7 @@ const struct hash_list_item *ha = a; const struct hash_list_item *hb = b; - return (*ctx->func)(ha->orig_key, hb->orig_key, ctx->data); + return (*ctx->func)(ha->key, hb->key, ctx->data); } /** @@ -398,23 +510,78 @@ * to the keys to make the comparison. */ void -hash_list_sort_with_data(hash_list_t *hl, GCompareDataFunc func, void *data) +hash_list_sort_with_data(hash_list_t *hl, cmp_data_fn_t func, void *data) { struct sort_with_data ctx; + hash_list_check(hl); g_assert(1 == hl->refcount); g_assert(NULL != func); - /* - * Unfortunately, relying on g_list_sort() requires one more - * traversal to update the tail. -- FIXME - */ - ctx.func = func; ctx.data = data; - hl->head = g_list_sort_with_data(hl->head, sort_data_wrapper, &ctx); - hl->tail = g_list_last(hl->head); + hash_list_synchronize(hl); + elist_sort_with_data(&hl->list, sort_data_wrapper, &ctx); + hash_list_return_void(hl); +} + +/** + * Randomly shuffle the list using supplied random function. + * + * @param rf the random function to use (NULL means: use defaults) + * @param hl the hashlist to shuffle + */ +void +hash_list_shuffle_with(random_fn_t rf, hash_list_t *hl) +{ + hash_list_check(hl); + g_assert(1 == hl->refcount); + + hash_list_synchronize(hl); + elist_shuffle_with(rf, &hl->list); + hash_list_return_void(hl); +} + +/** + * Randomly shuffle the list. + */ +void +hash_list_shuffle(hash_list_t *hl) +{ + hash_list_shuffle_with(NULL, hl); +} + +/** + * Rotate list by one item to the left. + * + * The head is inserted back at the tail. + */ +void +hash_list_rotate_left(hash_list_t *hl) +{ + hash_list_check(hl); + g_assert(1 == hl->refcount); + + hash_list_synchronize(hl); + elist_rotate_left(&hl->list); + hash_list_return_void(hl); +} + +/** + * Rotate list by one item to the right. + * + * The tail is inserted back at the head. + */ +void +hash_list_rotate_right(hash_list_t *hl) +{ + hash_list_check(hl); + g_assert(1 == hl->refcount); + + hash_list_synchronize(hl); + elist_rotate_right(&hl->list); + hash_list_return_void(hl); } /** @@ -422,27 +589,24 @@ * * @return the original key. */ -static void * +static void * hash_list_remove_item(hash_list_t *hl, struct hash_list_item *item) { - void *orig_key; + void *key; g_assert(item); + assert_hash_list_locked(hl); - orig_key = deconstify_gpointer(item->orig_key); - g_hash_table_remove(hl->ht, orig_key); - if (hl->tail == item->list) { - hl->tail = g_list_previous(hl->tail); - } - hl->head = g_list_delete_link(hl->head, item->list); + key = deconstify_pointer(item->key); + hikset_remove(hl->ht, key); + elist_link_remove(&hl->list, &item->lnk); WFREE(item); - g_assert(hl->len > 0); - hl->len--; hl->stamp++; /* Unsafe operation when iterating */ hash_list_regression(hl); - return orig_key; + + return key; } enum hash_list_position_magic { HASH_LIST_POSITION_MAGIC = 0x169eede3U }; @@ -450,7 +614,7 @@ struct hash_list_position { enum hash_list_position_magic magic; hash_list_t *hl; - GList *prev; + link_t *prev; unsigned stamp; }; @@ -489,23 +653,21 @@ hash_list_check(hl); hash_list_position_check(pt); - g_assert(1 == hl->refcount); g_assert(pt->hl == hl); - g_assert(pt->stamp == hl->stamp); WALLOC(item); - hl->head = gm_list_insert_after(hl->head, pt->prev, item); - if (pt->prev == hl->tail) { - if (NULL == hl->tail) { - hl->tail = hl->head; - } else { - hl->tail = g_list_last(pt->prev); - } - } - item->orig_key = key; - item->list = NULL == pt->prev ? hl->head : g_list_next(pt->prev); + item->key = key; + + hash_list_synchronize(hl); + + g_assert(1 == hl->refcount); + g_assert(pt->stamp == hl->stamp); + + elist_link_insert_after(&hl->list, pt->prev, &item->lnk); hash_list_insert_item(hl, item); + hash_list_unsynchronize(hl); + hash_list_forget_position(position); } @@ -527,13 +689,14 @@ struct hash_list_position *pt; hash_list_check(hl); + + hash_list_synchronize(hl); + g_assert(1 == hl->refcount); - item = g_hash_table_lookup(hl->ht, key); + item = hikset_lookup(hl->ht, key); if (NULL == item) - return NULL; - - hash_list_remove_item(hl, item); + hash_list_return(hl, NULL); /* * Record position in the list so that re-insertion can happen after @@ -547,68 +710,126 @@ WALLOC(pt); pt->magic = HASH_LIST_POSITION_MAGIC; pt->hl = hl; - pt->prev = g_list_previous(item->list); + pt->prev = elist_prev(&item->lnk); pt->stamp = hl->stamp; - return pt; + hash_list_remove_item(hl, item); + + hash_list_return(hl, pt); } /** * Remove `data' from the list. - * @return The data that was associated with the given key. + * + * @return the data that was associated with the given key. */ void * hash_list_remove(hash_list_t *hl, const void *key) { struct hash_list_item *item; + void *data; hash_list_check(hl); + + hash_list_synchronize(hl); + g_assert(1 == hl->refcount); - item = g_hash_table_lookup(hl->ht, key); - return item ? hash_list_remove_item(hl, item) : NULL; + item = hikset_lookup(hl->ht, key); + data = item != NULL ? hash_list_remove_item(hl, item) : NULL; + + hash_list_return(hl, data); } /** * Remove head item from the list. - * @return The data that was stored there. + * + * @return the data that was stored there. */ void * hash_list_remove_head(hash_list_t *hl) { - if (NULL == hl->head) - return NULL; + struct hash_list_item *item; + void *data; - return hash_list_remove_item(hl, hl->head->data); + hash_list_check(hl); + + hash_list_synchronize(hl); + + item = elist_head(&hl->list); + data = NULL == item ? NULL : hash_list_remove_item(hl, item); + + hash_list_return(hl, data); } /** * Remove tail item from the list. - * @return The data that was stored there. + * + * @return the data that was stored there. */ void * hash_list_remove_tail(hash_list_t *hl) { - if (NULL == hl->tail) - return NULL; + struct hash_list_item *item; + void *data; - return hash_list_remove_item(hl, hl->tail->data); + hash_list_check(hl); + + hash_list_synchronize(hl); + + item = elist_tail(&hl->list); + data = NULL == item ? NULL : hash_list_remove_item(hl, item); + + hash_list_return(hl, data); } /** * Remove head item from the list. - * @return The data that was stored there. + * + * @return the data that was stored there. */ void * hash_list_shift(hash_list_t *hl) { struct hash_list_item *item; + void *data; hash_list_check(hl); + + hash_list_synchronize(hl); + g_assert(1 == hl->refcount); - item = hl->head ? hl->head->data : NULL; - return item ? hash_list_remove_item(hl, item) : NULL; + item = elist_head(&hl->list); + data = NULL == item ? NULL : hash_list_remove_item(hl, item); + + hash_list_return(hl, data); +} + +/** + * Select a random element in the list. + * + * @return the randomly selected item, NULL if there is none. + */ +void * +hash_list_random(const hash_list_t *hl) +{ + struct hash_list_item *item; + void *data; + + hash_list_check(hl); + + hash_list_synchronize(hl); + + /* + * For locality of memory references, it is more efficient to use + * hikset_random() than it would be to use elist_random(). + */ + + item = hikset_random(hl->ht); + data = NULL == item ? NULL : deconstify_pointer(item->key); + + hash_list_return(hl, data); } /** @@ -618,31 +839,36 @@ hash_list_clear(hash_list_t *hl) { hash_list_check(hl); + + hash_list_synchronize(hl); + g_assert(1 == hl->refcount); - while (NULL != hl->head) { - struct hash_list_item *item = hl->head->data; + while (0 != elist_count(&hl->list)) { + struct hash_list_item *item = elist_head(&hl->list); hash_list_remove_item(hl, item); } + + hash_list_return_void(hl); } /** - * @returns The data associated with the last item, or NULL if none. + * @returns the data associated with the last item, or NULL if none. */ void * hash_list_tail(const hash_list_t *hl) { + struct hash_list_item *item; + void *data; + hash_list_check(hl); - if (hl->tail) { - struct hash_list_item *item; + hash_list_synchronize(hl); - item = hl->tail->data; - g_assert(item); - return deconstify_gpointer(item->orig_key); - } else { - return NULL; - } + item = elist_tail(&hl->list); + data = NULL == item ? NULL : deconstify_pointer(item->key); + + hash_list_return(hl, data); } /** @@ -651,17 +877,17 @@ void * hash_list_head(const hash_list_t *hl) { + struct hash_list_item *item; + void *data; + hash_list_check(hl); - if (hl->head) { - struct hash_list_item *item; + hash_list_synchronize(hl); - item = hl->head->data; - g_assert(item); - return deconstify_gpointer(item->orig_key); - } else { - return NULL; - } + item = elist_head(&hl->list); + data = NULL == item ? NULL : deconstify_pointer(item->key); + + hash_list_return(hl, data); } /** @@ -673,37 +899,20 @@ struct hash_list_item *item; hash_list_check(hl); - g_assert(1 == hl->refcount); - g_assert(hl->len > 0); - - item = g_hash_table_lookup(hl->ht, key); - g_assert(item); - - if (hl->head == item->list) - goto done; /* Item already at the head */ - - /* - * Remove item from list - */ - - if (hl->tail == item->list) - hl->tail = g_list_previous(hl->tail); - hl->head = g_list_delete_link(hl->head, item->list); + g_assert(size_is_positive(elist_count(&hl->list))); - g_assert(hl->head != NULL); /* Or item would be at the head */ - g_assert(hl->tail != NULL); /* Item not the head and not sole entry */ + hash_list_synchronize(hl); - /* - * Insert link back at the head. - */ + g_assert(1 == hl->refcount); - hl->head = g_list_prepend(hl->head, item); - item->list = hl->head; + item = hikset_lookup(hl->ht, key); + g_assert(item != NULL); -done: + elist_moveto_head(&hl->list, item); hl->stamp++; hash_list_regression(hl); + hash_list_return_void(hl); } /** @@ -715,34 +924,20 @@ struct hash_list_item *item; hash_list_check(hl); - g_assert(1 == hl->refcount); - g_assert(hl->len > 0); + g_assert(size_is_positive(elist_count(&hl->list))); - item = g_hash_table_lookup(hl->ht, key); - g_assert(item); - - if (hl->tail == item->list) - goto done; /* Item already at the tail */ - - /* - * Remove item from list - */ + hash_list_synchronize(hl); - hl->head = g_list_delete_link(hl->head, item->list); - - g_assert(hl->head != NULL); /* Or item would be at the tail */ - - /* - * Insert link back at the tail. - */ + g_assert(1 == hl->refcount); - hl->tail = g_list_last(g_list_append(hl->tail, item)); - item->list = hl->tail; + item = hikset_lookup(hl->ht, key); + g_assert(item != NULL); -done: + elist_moveto_tail(&hl->list, item); hl->stamp++; hash_list_regression(hl); + hash_list_return_void(hl); } /** @@ -751,50 +946,75 @@ unsigned hash_list_length(const hash_list_t *hl) { + unsigned count; + hash_list_check(hl); - return hl->len; + hash_list_synchronize(hl); + count = elist_count(&hl->list); + hash_list_return(hl, count); +} + +/** + * @returns the length of the list. + * + * NOTE: same as hash_list_length() but returns a size_t and consistent + * with our other data structures where "count" returns the amount of + * data held in the container. + */ +size_t +hash_list_count(const hash_list_t *hl) +{ + size_t count; + + hash_list_check(hl); + + hash_list_synchronize(hl); + count = elist_count(&hl->list); + hash_list_return(hl, count); } /** * Extract the list of items so that the caller can iterate at will over - * it as sort it. The caller must dispose of that list via g_list_free(). + * it as sort it. The caller must dispose of that list via plist_free(). * The underlying data is not copied so it must NOT be freed. * * @returns a shallow copy of the underlying list. */ -GList * +plist_t * hash_list_list(hash_list_t *hl) { - GList *l = NULL; - GList *lc = NULL; + plist_t *l = NULL; + link_t *lk; hash_list_check(hl); - for (l = hl->tail; l; l = g_list_previous(l)) { - struct hash_list_item *item = l->data; + hash_list_synchronize(hl); - lc = g_list_prepend(lc, deconstify_gpointer(item->orig_key)); + for (lk = elist_last(&hl->list); lk != NULL; lk = elist_prev(lk)) { + struct hash_list_item *item = ITEM(lk); + + l = plist_prepend(l, deconstify_pointer(item->key)); } - return lc; + hash_list_return(hl, l); } static hash_list_iter_t * hash_list_iterator_new(hash_list_t *hl, enum hash_list_iter_direction dir) { - static const hash_list_iter_t zero_iter; hash_list_iter_t *iter; hash_list_check(hl); + assert_hash_list_locked(hl); - WALLOC(iter); - *iter = zero_iter; + WALLOC0(iter); iter->magic = HASH_LIST_ITER_MAGIC; iter->dir = dir; iter->hl = hl; iter->stamp = hl->stamp; hl->refcount++; + return iter; } @@ -805,12 +1025,17 @@ hash_list_iter_t * hash_list_iterator(hash_list_t *hl) { - if (hl) { + if (hl != NULL) { hash_list_iter_t *iter; hash_list_check(hl); + + hash_list_synchronize(hl); + iter = hash_list_iterator_new(hl, HASH_LIST_ITER_FORWARDS); - iter->next = hl->head; + iter->next = elist_first(&hl->list); + + hash_list_unsynchronize(hl); return iter; } else { return NULL; @@ -828,8 +1053,13 @@ hash_list_iter_t *iter; hash_list_check(hl); + + hash_list_synchronize(hl); + iter = hash_list_iterator_new(hl, HASH_LIST_ITER_BACKWARDS); - iter->prev = hl->tail; + iter->prev = elist_last(&hl->list); + + hash_list_unsynchronize(hl); return iter; } else { return NULL; @@ -850,17 +1080,19 @@ hash_list_check(hl); - item = g_hash_table_lookup(hl->ht, key); + hash_list_synchronize(hl); + + item = hikset_lookup(hl->ht, key); if (item) { hash_list_iter_t *iter; iter = hash_list_iterator_new(hl, HASH_LIST_ITER_UNDEFINED); - iter->prev = g_list_previous(item->list); - iter->next = g_list_next(item->list); + iter->prev = elist_prev(&item->lnk); + iter->next = elist_next(&item->lnk); iter->item = item; - return iter; + hash_list_return(hl, iter); } else { - return NULL; + hash_list_return(hl, NULL); } } else { return NULL; @@ -870,28 +1102,36 @@ /** * Get the next data item from the iterator, or NULL if none. */ -G_GNUC_HOT void * +void * G_HOT hash_list_iter_next(hash_list_iter_t *iter) { - GList *next; + link_t *next; + hash_list_t *hl; + void *data; hash_list_iter_check(iter); + hl = iter->hl; + + hash_list_synchronize(hl); + next = iter->next; - if (next) { - iter->item = next->data; - iter->prev = g_list_previous(next); - iter->next = g_list_next(next); - return deconstify_gpointer(iter->item->orig_key); + if (next != NULL) { + iter->item = ITEM(next); + iter->prev = elist_prev(next); + iter->next = elist_next(next); + data = deconstify_pointer(iter->item->key); } else { - return NULL; + data = NULL; } + + hash_list_return(hl, data); } /** * Checks whether there is a next item to be iterated over. */ -gboolean +bool hash_list_iter_has_next(const hash_list_iter_t *iter) { hash_list_iter_check(iter); @@ -902,28 +1142,35 @@ /** * Get the previous data item from the iterator, or NULL if none. */ -G_GNUC_HOT void * +void * G_HOT hash_list_iter_previous(hash_list_iter_t *iter) { - GList *prev; + link_t *prev; + hash_list_t *hl; + void *data; hash_list_iter_check(iter); + hl = iter->hl; + hash_list_synchronize(hl); + prev = iter->prev; - if (prev) { - iter->item = prev->data; - iter->next = g_list_next(prev); - iter->prev = g_list_previous(prev); - return deconstify_gpointer(iter->item->orig_key); + if (prev != NULL) { + iter->item = ITEM(prev); + iter->next = elist_next(prev); + iter->prev = elist_prev(prev); + data = deconstify_pointer(iter->item->key); } else { - return NULL; + data = NULL; } + + hash_list_return(hl, data); } /** * Checks whether there is a previous item in the iterator. */ -gboolean +bool hash_list_iter_has_previous(const hash_list_iter_t *iter) { hash_list_iter_check(iter); @@ -934,7 +1181,7 @@ /** * Checks whether there is a successor in the iterator's direction. */ -gboolean +bool hash_list_iter_has_more(const hash_list_iter_t *iter) { hash_list_iter_check(iter); @@ -982,30 +1229,27 @@ hash_list_iter_remove(hash_list_iter_t *iter) { struct hash_list_item *item; + hash_list_t *hl; + void *key; hash_list_iter_check(iter); + hl = iter->hl; + hash_list_synchronize(hl); + item = iter->item; if (item != NULL) { - void *orig_key = deconstify_gpointer(item->orig_key); - hash_list_t *hl = iter->hl; - + key = deconstify_pointer(item->key); iter->item = NULL; - g_hash_table_remove(hl->ht, orig_key); - if (hl->tail == item->list) { - hl->tail = g_list_previous(hl->tail); - } - hl->head = g_list_delete_link(hl->head, item->list); - - g_assert(hl->len > 0); - hl->len--; + hikset_remove(hl->ht, key); + elist_link_remove(&hl->list, &item->lnk); WFREE(item); - - return orig_key; } else { - return NULL; + key = NULL; } + + hash_list_return(hl, key); } /** @@ -1019,7 +1263,10 @@ hash_list_iter_check(iter); + hash_list_synchronize(iter->hl); iter->hl->refcount--; + hash_list_unsynchronize(iter->hl); + iter->magic = 0; WFREE(iter); @@ -1033,7 +1280,7 @@ * * @return TRUE if the key is present. */ -gboolean +bool hash_list_find(hash_list_t *hl, const void *key, const void **orig_key_ptr) { @@ -1041,23 +1288,49 @@ hash_list_check(hl); - item = g_hash_table_lookup(hl->ht, key); + hash_list_synchronize(hl); + + item = hikset_lookup(hl->ht, key); if (item && orig_key_ptr) { - *orig_key_ptr = item->orig_key; + *orig_key_ptr = item->key; } - return NULL != item; + + hash_list_return(hl, NULL != item); +} + +/** + * Find key in hashlist, returning pointer to the stored key. + * + * @return the item associated with the key if found, NULL otherwise. + */ +void * +hash_list_lookup(hash_list_t *hl, const void *key) +{ + struct hash_list_item *item; + + hash_list_check(hl); + + hash_list_synchronize(hl); + + item = hikset_lookup(hl->ht, key); + + hash_list_return(hl, NULL == item ? NULL : deconstify_pointer(item->key)); } /** * Check whether hashlist contains the key. * @return TRUE if the key is present. */ -gboolean +bool hash_list_contains(hash_list_t *hl, const void *key) { + bool contains; + hash_list_check(hl); - return NULL != g_hash_table_lookup(hl->ht, key); + hash_list_synchronize(hl); + contains = hikset_contains(hl->ht, key); + hash_list_return(hl, contains); } /** @@ -1082,12 +1355,17 @@ hash_list_next(hash_list_t *hl, const void *key) { struct hash_list_item *item; + void *data; hash_list_check(hl); - item = g_hash_table_lookup(hl->ht, key); - item = item ? g_list_nth_data(g_list_next(item->list), 0) : NULL; - return item ? deconstify_gpointer(item->orig_key) : NULL; + hash_list_synchronize(hl); + + item = hikset_lookup(hl->ht, key); + item = item != NULL ? elist_data(&hl->list, elist_next(&item->lnk)) : NULL; + data = item != NULL ? deconstify_pointer(item->key) : NULL; + + hash_list_return(hl, data); } /** @@ -1097,33 +1375,39 @@ hash_list_previous(hash_list_t *hl, const void *key) { struct hash_list_item *item; + void *data; hash_list_check(hl); - item = g_hash_table_lookup(hl->ht, key); - item = item ? g_list_nth_data(g_list_previous(item->list), 0) : NULL; - return item ? deconstify_gpointer(item->orig_key) : NULL; + hash_list_synchronize(hl); + + item = hikset_lookup(hl->ht, key); + item = item != NULL ? elist_data(&hl->list, elist_prev(&item->lnk)) : NULL; + data = item != NULL ? deconstify_pointer(item->key) : NULL; + + hash_list_return(hl, data); } /** * Apply `func' to all the items in the structure. */ void -hash_list_foreach(const hash_list_t *hl, GFunc func, void *user_data) +hash_list_foreach(const hash_list_t *hl, data_fn_t func, void *user_data) { - GList *list; - + link_t *lk; + hash_list_check(hl); g_assert(NULL != func); - for (list = hl->head; NULL != list; list = g_list_next(list)) { - struct hash_list_item *item; + hash_list_synchronize(hl); - item = list->data; - (*func)(deconstify_gpointer(item->orig_key), user_data); + for (lk = elist_first(&hl->list); lk != NULL; lk = elist_next(lk)) { + struct hash_list_item *item = ITEM(lk); + (*func)(deconstify_pointer(item->key), user_data); } hash_list_regression(hl); + hash_list_return_void(hl); } /** @@ -1133,29 +1417,28 @@ * @return the amount of entries removed from the list. */ size_t -hash_list_foreach_remove(hash_list_t *hl, hashlist_cbr_t func, void *data) +hash_list_foreach_remove(hash_list_t *hl, data_rm_fn_t func, void *data) { - GList *list; - GList *next; + link_t *lk, *next; size_t removed = 0; - + hash_list_check(hl); - g_assert(NULL != func); + g_assert(func != NULL); - for (list = hl->head; NULL != list; list = next) { - struct hash_list_item *item; + hash_list_synchronize(hl); - next = g_list_next(list); - item = list->data; - if ((*func)(deconstify_gpointer(item->orig_key), data)) { + for (lk = elist_first(&hl->list); lk != NULL; lk = next) { + struct hash_list_item *item = ITEM(lk); + + next = elist_next(lk); + if ((*func)(deconstify_pointer(item->key), data)) { hash_list_remove_item(hl, item); removed++; } } hash_list_regression(hl); - - return removed; + hash_list_return(hl, removed); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/hashlist.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/hashlist.h
Changed
@@ -1,5 +1,6 @@ /* * Copyright (c) 2003, Christian Biere + * Copyright (c) 2009-2013, Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -25,24 +26,24 @@ #define _hashlist_h_ #include "common.h" -#include "glib-missing.h" typedef struct hash_list_iter hash_list_iter_t; typedef struct hash_list hash_list_t; -typedef gboolean (*hashlist_cbr_t)(void *key, void *u); -typedef void (*hashlist_destroy_cb)(void *data); - -hash_list_t *hash_list_new(GHashFunc, GEqualFunc); +hash_list_t *hash_list_new(hash_fn_t, eq_fn_t); +void hash_list_thread_safe(hash_list_t *); +void hash_list_lock(hash_list_t *); +void hash_list_unlock(hash_list_t *); void hash_list_free(hash_list_t **); -void hash_list_free_all(hash_list_t **hl_ptr, hashlist_destroy_cb freecb); +void hash_list_free_all(hash_list_t **hl_ptr, free_fn_t freecb); void *hash_list_remove(hash_list_t *, const void *key); void *hash_list_remove_head(hash_list_t *); void *hash_list_remove_tail(hash_list_t *); void *hash_list_shift(hash_list_t *); +void *hash_list_random(const hash_list_t *); void hash_list_append(hash_list_t *, const void *key); void hash_list_prepend(hash_list_t *, const void *key); -void hash_list_insert_sorted(hash_list_t *, const void *key, GCompareFunc); +void hash_list_insert_sorted(hash_list_t *, const void *key, cmp_fn_t); void hash_list_moveto_head(hash_list_t *, const void *key); void hash_list_moveto_tail(hash_list_t *, const void *key); void *hash_list_head(const hash_list_t *); @@ -51,35 +52,41 @@ void *hash_list_previous(hash_list_t *, const void *key); void hash_list_clear(hash_list_t *hl); unsigned hash_list_length(const hash_list_t *); -GList *hash_list_list(hash_list_t *); -void hash_list_sort(hash_list_t *, GCompareFunc); -void hash_list_sort_with_data(hash_list_t *, GCompareDataFunc, void *); +size_t hash_list_count(const hash_list_t *); +struct plist *hash_list_list(hash_list_t *) WARN_UNUSED_RESULT; +void hash_list_sort(hash_list_t *, cmp_fn_t); +void hash_list_sort_with_data(hash_list_t *, cmp_data_fn_t, void *); +void hash_list_shuffle(hash_list_t *hl); +void hash_list_shuffle_with(random_fn_t rf, hash_list_t *hl); +void hash_list_rotate_left(hash_list_t *hl); +void hash_list_rotate_right(hash_list_t *hl); hash_list_iter_t *hash_list_iterator(hash_list_t *); hash_list_iter_t *hash_list_iterator_tail(hash_list_t *); hash_list_iter_t *hash_list_iterator_at(hash_list_t *, const void *key); void hash_list_iter_release(hash_list_iter_t **); -gboolean hash_list_iter_has_next(const hash_list_iter_t *) G_GNUC_PURE; -gboolean hash_list_iter_has_previous(const hash_list_iter_t *) G_GNUC_PURE; -gboolean hash_list_iter_has_more(const hash_list_iter_t *iter) G_GNUC_PURE; +bool hash_list_iter_has_next(const hash_list_iter_t *) G_PURE; +bool hash_list_iter_has_previous(const hash_list_iter_t *) G_PURE; +bool hash_list_iter_has_more(const hash_list_iter_t *iter) G_PURE; void *hash_list_iter_next(hash_list_iter_t *); void *hash_list_iter_previous(hash_list_iter_t *); void *hash_list_iter_move(hash_list_iter_t *iter); void *hash_list_iter_remove(hash_list_iter_t *iter); -gboolean hash_list_find(hash_list_t *, const void *key, const void **orig_key); -gboolean hash_list_contains(hash_list_t *, const void *key); -void hash_list_foreach(const hash_list_t *, GFunc, void *user_data); -size_t hash_list_foreach_remove(hash_list_t *hl, hashlist_cbr_t func, void *u); +bool hash_list_find(hash_list_t *, const void *key, const void **orig_key); +bool hash_list_contains(hash_list_t *, const void *key); +void *hash_list_lookup(hash_list_t *hl, const void *key); +void hash_list_foreach(const hash_list_t *, data_fn_t, void *); +size_t hash_list_foreach_remove(hash_list_t *, data_rm_fn_t, void *); void *hash_list_remove_position(hash_list_t *hl, const void *key); void hash_list_insert_position(hash_list_t *hl, const void *key, void *pos); void hash_list_forget_position(void *position); -static inline hashlist_destroy_cb +static inline free_fn_t cast_to_hashlist_destroy(func_ptr_t fn) { - return (hashlist_destroy_cb) fn; + return (free_fn_t) fn; } #endif /* _hashlist_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/hashtable.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/hashtable.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2011 Raphael Manfredi <Raphael_Manfredi@pobox.com> + * Copyright (c) 2009-2013 Raphael Manfredi <Raphael_Manfredi@pobox.com> * All rights reserved. * * Copyright (c) 2006 Christian Biere <christianbiere@gmx.de> @@ -37,32 +37,50 @@ * * A simple hashtable implementation. * - * There are two interesting properties in this hash table: + * There are fiven interesting properties in this hash table: * * - The items and the internal data structures are allocated out of a * same contiguous memory region (aka the "arena"). * * - Memory for the arena is allocated directly through the VMM layer. * + * - The access interface can be dynamically configured to be thread-safe. + * + * - The table can be put in read-only mode, preventing any data corruption + * for the items it holds. When inserting data, it can be reverted to + * writable mode and then back to read-only, but this needs to be explicit + * to prevent accidental (unexpected) insertions. + * + * - The table can configured to use a statically-allocated space and run + * without allocating any memory (but then it can possibly become full). + * * As such, this hash table is suitable for being used by low-level memory - * allocators. + * allocators and by the thread management code. * * @author Raphael Manfredi - * @date 2009-2011 + * @date 2009-2013 * @author Christian Biere * @date 2006 */ #include "common.h" -#include "lib/hashtable.h" -#include "lib/atomic.h" -#include "lib/mutex.h" -#include "lib/vmm.h" -#include "lib/xmalloc.h" +#include "hashtable.h" -#include "lib/override.h" /* Must be the last header included */ +#include "atomic.h" +#include "hashing.h" +#include "mutex.h" +#include "omalloc.h" +#include "once.h" +#include "pow2.h" +#include "rand31.h" +#include "spinlock.h" +#include "vmm.h" +#include "xmalloc.h" +#include "override.h" /* Must be the last header included */ + +#define HASH_ITEMS_BINS 2 /* Initial amount of bins */ #define HASH_ITEMS_PER_BIN 4 #define HASH_ITEMS_GROW 56 @@ -91,17 +109,22 @@ struct hash_table { enum hashtable_magic magic; /* Magic number */ mutex_t lock; /* Lock for thread-safe operations */ - mutex_t external_lock; /* Lock for external atomic operations */ size_t num_items; /* Array length of "items" */ size_t num_bins; /* Number of bins */ + size_t bin_bits; /* Number of bits to fold hashed value to */ size_t num_held; /* Number of items actually in the table */ size_t bin_fill; /* Number of bins in use */ - hash_table_hash_func hash; /* Key hash functions, or NULL */ - hash_table_eq_func eq; /* Key equality function, or NULL */ + hash_fn_t hash; /* Key hash functions, or NULL */ + eq_fn_t eq; /* Key equality function, or NULL */ hash_item_t **bins; /* Array of bins of size ``num_bins'' */ hash_item_t *free_list; /* List of free hash items */ hash_item_t *items; /* Array of items */ -#ifdef TRACK_VMM + /* + * Lookup caching. + */ + const void *last_key; /* Last looked-up key */ + hash_item_t *last_item; /* Last looked-up item (NULL if invalid) */ + size_t last_bin; /* Last bin where looked-up key belongs */ /* * Since we use these data structures during tracking, be careful: * if the table is created with the _real variant, it is used by @@ -109,87 +132,160 @@ * layer specially. */ unsigned real:1; /* If TRUE, created as "real" */ -#endif + unsigned not_leaking:1; /* Don't track allocated VMM regions */ unsigned special:1; /* Set if structure allocated specially */ unsigned readonly:1; /* Set if data structures protected */ unsigned thread_safe:1; /* Set if table must be thread-safe */ + unsigned once:1; /* Object allocated using "once" memory */ + unsigned self_keys:1; /* Keys are self-representing */ + unsigned fixed_size:1; /* Table allocated statically */ }; +/** + * Avoid complexity attacks on the hash table. + * + * A random number is used to perturb the hash value for all the keys so + * that no attack on the hash table insertion complexity can be made, such + * as presenting a set of keys that will pathologically make insertions + * O(n) instead of O(1) on average. + */ +static unsigned hash_offset2; /* indexed by boolean: ht->fixed_size */ + +/** + * Minimal amount of bins we we want (power of two) that can fill up one page. + */ +static size_t hash_min_bins; + +static bool hash_offset_inited; +static once_flag_t hash_min_bins_computed; + +static void G_COLD +hash_offset_init_once(void) +{ + /* + * Don't allocate any memory, hence can't call arc4random(). + * Also, on Windows, we cannot enter the POSIX layer by trying + * to open files, hence cannot use entropy_minirand() either. + */ + + hash_offset0 = rand31_u32(); + + /* + * Note that we leave hash_offset1 set to 0: hash offsetting is not + * used for fixed-size hash tables because they are used by low-level + * code and we may not be able to allocate the random hash offset at + * the time the fixed-size hash table is used. + */ +} + +/** + * Initialize hash offset if not already done. + */ +static void +hash_offset_init(void) +{ + static spinlock_t hash_offset_init_slk = SPINLOCK_INIT; + + /* + * Cannot use once_flag_run() here since it uses a hash table to keep + * track of the running routines and we could recurse. + */ + + if G_LIKELY(hash_offset_inited) + return; + + spinlock_raw(&hash_offset_init_slk); + + if (!hash_offset_inited) { + hash_offset_init_once(); + hash_offset_inited = TRUE; + } + + spinunlock_raw(&hash_offset_init_slk); +} + +/** + * Computes the minimum amount of bins we can have to fill one VMM page. + */ +static void G_COLD +hash_compute_min_bins_once(void) +{ + size_t n; + hash_table_t ht; + + n = compat_pagesize() / (sizeof ht.bins0 + + HASH_ITEMS_PER_BIN * sizeof ht.items0); + + hash_min_bins = 1 << highest_bit_set(n); + + g_assert(hash_min_bins > 1); + g_assert(IS_POWER_OF_2(hash_min_bins)); +} + +static inline size_t +hash_min_bin_count(void) +{ + ONCE_FLAG_RUN(hash_min_bins_computed, hash_compute_min_bins_once); + return hash_min_bins; +} + static inline void * -hash_vmm_alloc(const struct hash_table *ht, size_t size) +hash_vmm_alloc(const hash_table_t *ht, size_t size) { #ifdef TRACK_VMM - if (ht->real) + if (ht->real || ht->not_leaking) return vmm_alloc_notrack(size); else - return vmm_alloc(size); #else - (void) ht; - return vmm_alloc(size); -#endif + { + (void) ht; + return vmm_alloc(size); + } +#endif /* TRACK_VMM */ } static inline void -hash_vmm_free(const struct hash_table *ht, void *p, size_t size) +hash_vmm_free(const hash_table_t *ht, void *p, size_t size) { #ifdef TRACK_VMM - if (ht->real) + if (ht->real || ht->not_leaking) vmm_free_notrack(p, size); else - vmm_free(p, size); #else - (void) ht; - vmm_free(p, size); -#endif + { + (void) ht; + vmm_free(p, size); + } +#endif /* TRACK_VMM */ } static inline void -hash_mark_real(hash_table_t * ht, gboolean is_real) +hash_mark_real(hash_table_t *ht, bool is_real) { -#ifdef TRACK_VMM ht->real = booleanize(is_real); -#else - (void) ht; - (void) is_real; -#endif } static inline void -hash_copy_real_flag(hash_table_t *dest, const hash_table_t *src) +hash_mark_once(hash_table_t *ht, bool is_once) +{ + ht->once = booleanize(is_once); +} + +static inline void +hash_copy_flags(hash_table_t *dest, const hash_table_t *src) { -#ifdef TRACK_VMM dest->real = src->real; -#else - (void) dest; - (void) src; -#endif + dest->not_leaking = src->not_leaking; } static inline void -hash_table_check(const struct hash_table *ht) +hash_table_check(const hash_table_t *ht) { g_assert(ht != NULL); g_assert(HASHTABLE_MAGIC == ht->magic); g_assert(ht->num_bins > 0 && ht->num_bins < SIZE_MAX / 2); } -/** - * NOTE: A naive direct use of the pointer has a much worse distribution e.g., - * only a quarter of the bins are used. - */ -static inline size_t -hash_id_key(const void *key) -{ - size_t n = (size_t) key; - return ((0x4F1BBCDCUL * (guint64) n) >> 32) ^ n; -} - -static inline gboolean -hash_id_eq(const void *a, const void *b) -{ - return a == b; -} - static hash_item_t * hash_item_alloc(hash_table_t *ht, const void *key, const void *value) { @@ -243,9 +339,9 @@ static void hash_table_new_intern(hash_table_t *ht, - size_t num_bins, hash_table_hash_func hash, hash_table_eq_func eq) + size_t num_bins, hash_fn_t hash, eq_fn_t eq, void *space, size_t len) { - size_t i; + size_t i, min_bins; size_t arena; size_t items_off; @@ -255,16 +351,73 @@ ht->magic = HASHTABLE_MAGIC; ht->num_held = 0; ht->bin_fill = 0; - ht->hash = hash ? hash : hash_id_key; - ht->eq = eq ? eq : hash_id_eq; + ht->hash = hash != NULL ? hash : pointer_hash; + ht->eq = eq != NULL ? eq : pointer_eq; + ht->self_keys = booleanize(pointer_eq == ht->eq); - ht->num_bins = num_bins; - ht->num_items = ht->num_bins * HASH_ITEMS_PER_BIN; + /* + * If data space is not-NULL, then the table is going to be of fixed_size. + * The table will not be resizable and insertions will fail when it becomes + * full. Also, performances will degrade as the table fills-up. + */ + + if G_UNLIKELY(space != NULL) { + size_t n; + + g_assert(len != 0); + + ht->fixed_size = TRUE; + + /* + * Iteratively compute the largest amount of bins and items we can + * fit in the table, + */ + + for (n = HASH_ITEMS_BINS; n != 0; n <<= 1) { + ht->num_bins = n; + ht->num_items = n * HASH_ITEMS_PER_BIN; + arena = hash_bins_items_arena_size(ht, NULL); + + if (arena > len) { + n >>= 1; + break; + } + } + + g_assert_log(n >= HASH_ITEMS_BINS, + "%s(): remaining space (%zu bytes) in fixed arena too small", + G_STRFUNC, len); + + ht->num_bins = n; + ht->num_items = n * HASH_ITEMS_PER_BIN; + } else { + /* + * Since the arena is going to be held in a VMM page with nothing + * else, make sure we're filling the page as much as we can. + */ + + hash_offset_init(); + + min_bins = hash_min_bin_count(); + + ht->num_bins = MAX(num_bins, min_bins); + ht->num_items = ht->num_bins * HASH_ITEMS_PER_BIN; + } + + ht->bin_bits = highest_bit_set64(ht->num_bins); + + g_assert(IS_POWER_OF_2(ht->num_bins)); + g_assert((1UL << ht->bin_bits) == ht->num_bins); arena = hash_bins_items_arena_size(ht, &items_off); - ht->bins = hash_vmm_alloc(ht, arena); - g_assert(ht->bins); + if G_UNLIKELY(ht->fixed_size) { + ht->bins = space; + } else { + ht->bins = hash_vmm_alloc(ht, arena); + } + + g_assert(ht->bins != NULL); g_assert(items_off != 0); ht->items = ptr_add_offset(ht->bins, items_off); @@ -288,14 +441,12 @@ } hash_table_t * -hash_table_new_full(hash_table_hash_func hash, hash_table_eq_func eq) +hash_table_new_full(hash_fn_t hash, eq_fn_t eq) { - hash_table_t *ht = xpmalloc(sizeof *ht); + hash_table_t *ht; - g_assert(ht); - - ZERO(ht); - hash_table_new_intern(ht, 2, hash, eq); + XMALLOC0(ht); + hash_table_new_intern(ht, HASH_ITEMS_BINS, hash, eq, NULL, 0); return ht; } @@ -306,9 +457,10 @@ } /** - * Checks how many items are currently in stored in the hash_table. + * Checks how many items are currently stored in the hash_table. * * @param ht the hash_table to check. + * * @return the number of items in the hash_table. */ size_t @@ -323,30 +475,73 @@ } /** - * Synchronize access to hash table if thread-safe. + * Get the current capacity of the hash_table. + * + * @param ht the hash table + * + * @return the maximum number of items that can currently be stored. */ -static inline ALWAYS_INLINE void -ht_synchronize(const hash_table_t *ht) +size_t +hash_table_capacity(const hash_table_t *ht) { - if (ht->thread_safe) { - hash_table_t *wht = deconstify_gpointer(ht); - mutex_get(&wht->lock); - g_assert(HASHTABLE_MAGIC == ht->magic); - } + hash_table_check(ht); + + if G_UNLIKELY(ht->thread_safe) + atomic_mb(); + + return ht->num_items; +} + +/** + * Get the amount of buckets in the hash_table. + * + * @param ht the hash table + * + * @return the current amount of buckets used to distribute items. + */ +size_t +hash_table_buckets(const hash_table_t *ht) +{ + hash_table_check(ht); + + if G_UNLIKELY(ht->thread_safe) + atomic_mb(); + + return ht->num_bins; } +/** + * Synchronize access to hash table if thread-safe. + */ + +/* Not an inlined routine to get proper lines in mutex_lock() when debugging */ +#define ht_synchronize(ht) G_STMT_START { \ + if (ht->thread_safe) { \ + hash_table_t *wht = deconstify_pointer(ht); \ + mutex_lock(&wht->lock); \ + g_assert(HASHTABLE_MAGIC == ht->magic); \ + } \ +} G_STMT_END + +#define ht_unsynchronize(ht) G_STMT_START { \ + if (ht->thread_safe) { \ + hash_table_t *wht = deconstify_pointer(ht); \ + mutex_unlock(&wht->lock); \ + } \ +} G_STMT_END + #define ht_return(ht,v) G_STMT_START { \ if (ht->thread_safe) { \ - hash_table_t *wht = deconstify_gpointer(ht); \ - mutex_release(&wht->lock); \ + hash_table_t *wht = deconstify_pointer(ht); \ + mutex_unlock(&wht->lock); \ } \ return v; \ } G_STMT_END #define ht_return_void(ht) G_STMT_START { \ if (ht->thread_safe) { \ - hash_table_t *wht = deconstify_gpointer(ht); \ - mutex_release(&wht->lock); \ + hash_table_t *wht = deconstify_pointer(ht); \ + mutex_unlock(&wht->lock); \ } \ return; \ } G_STMT_END @@ -364,20 +559,22 @@ ht_return(ht, ret); } -/** - * NOTE: A naive direct use of the pointer has a much worse distribution e.g., - * only a quarter of the bins are used. - */ -static inline size_t +static inline unsigned hash_key(const hash_table_t *ht, const void *key) { - return (*ht->hash)(key); + /* + * There is no offseting of the hashed value for fixed-size table. + * Rather than issuing a test and a branch, we use an array indexed + * by 0 or 1. + */ + + return (*ht->hash)(key) + hash_offsetht->fixed_size; } -static inline gboolean +static inline bool hash_eq(const hash_table_t *ht, const void *a, const void *b) { - return (*ht->eq)(a, b); + return a == b || (*ht->eq)(a, b); } /** @@ -393,19 +590,41 @@ hash_table_find(const hash_table_t *ht, const void *key, size_t *bin) { hash_item_t *item; - size_t hash; + size_t idx; hash_table_check(ht); - hash = hash_key(ht, key) & (ht->num_bins - 1); - item = ht->binshash; + /* + * Caching of last successful lookup result for self-representing keys. + */ + + if (ht->last_item != NULL && ht->self_keys && ht->last_key == key) { + if (bin != NULL) + *bin = ht->last_bin; + return ht->last_item; + } + + /* + * Lookup key in the hash table. + */ + + idx = hashing_keep(hash_key(ht, key), ht->bin_bits); + item = ht->binsidx; if (bin) { - *bin = hash; + *bin = idx; } for ( /* NOTHING */ ; item != NULL; item = item->next) { - if (hash_eq(ht, key, item->key)) + if G_LIKELY(hash_eq(ht, key, item->key)) { + if (ht->self_keys) { + /* Cache successful lookup result */ + hash_table_t *wht = deconstify_pointer(ht); + wht->last_key = key; + wht->last_bin = idx; + wht->last_item = item; + } return item; + } } return NULL; @@ -414,20 +633,17 @@ /** * Iterate over the hashtable, invoking the "func" callback on each item * with the additional "data" argument. - * - * @attention - * This call is not thread-safe atomically and requires explicit locking - * to perform mutual exclusion. */ void -hash_table_foreach(const hash_table_t *ht, - hash_table_foreach_func func, void *data) +hash_table_foreach(const hash_table_t *ht, ckeyval_fn_t func, void *data) { size_t i, n; hash_table_check(ht); g_assert(func != NULL); + ht_synchronize(ht); + n = ht->num_held; i = ht->num_bins; @@ -435,11 +651,13 @@ hash_item_t *item; for (item = ht->binsi; NULL != item; item = item->next) { - (*func)(item->key, deconstify_gpointer(item->value), data); + (*func)(item->key, deconstify_pointer(item->value), data); n--; } } g_assert(0 == n); + + ht_return_void(ht); } /** @@ -474,6 +692,7 @@ ht->num_held = 0; ht->bin_fill = 0; + ht->last_item = NULL; /* Clear lookup cache */ ht_return_void(ht); } @@ -498,6 +717,8 @@ ht->num_held = 0; ht->num_items = 0; ht->free_list = NULL; + ht->last_key = NULL; + ht->last_item = NULL; } /** @@ -506,21 +727,22 @@ * * @return FALSE if the item could not be added, TRUE on success. */ -static gboolean +static bool hash_table_insert_no_resize(hash_table_t *ht, - const void *key, const void *value) + const void *key, const void *value, size_t *known_bin) { hash_item_t *item; size_t bin; hash_table_check(ht); - g_assert(key); - g_assert(value); - - if (hash_table_find(ht, key, &bin)) { - return FALSE; + if G_LIKELY(NULL == known_bin) { + if (hash_table_find(ht, key, &bin)) + return FALSE; + } else { + bin = *known_bin; } + safety_assert(NULL == hash_table_lookup(ht, key)); item = hash_item_alloc(ht, key, value); @@ -541,8 +763,8 @@ static void hash_table_resize_helper(const void *key, void *value, void *data) { - gboolean ok; - ok = hash_table_insert_no_resize(data, key, value); + bool ok; + ok = hash_table_insert_no_resize(data, key, value, NULL); g_assert(ok); } @@ -551,9 +773,11 @@ { hash_table_t tmp; + g_assert(!ht->fixed_size); + ZERO(&tmp); - hash_copy_real_flag(&tmp, ht); - hash_table_new_intern(&tmp, n, ht->hash, ht->eq); + hash_copy_flags(&tmp, ht); + hash_table_new_intern(&tmp, n, ht->hash, ht->eq, NULL, 0); hash_table_foreach(ht, hash_table_resize_helper, &tmp); g_assert(ht->num_held == tmp.num_held); @@ -566,6 +790,7 @@ ht->num_items = tmp.num_items; ht->num_held = tmp.num_held; ht->bin_fill = tmp.bin_fill; + ht->bin_bits = tmp.bin_bits; ht->free_list = tmp.free_list; } @@ -574,14 +799,28 @@ { size_t n; size_t needed_bins = ht->num_held / HASH_ITEMS_PER_BIN; + size_t min_bins = hash_min_bin_count(); + +#define EXTRA (HASH_ITEMS_GROW / HASH_ITEMS_PER_BIN) n = ht->num_bins / 2; - if (needed_bins + (HASH_ITEMS_GROW / HASH_ITEMS_PER_BIN) >= n) + if (n < min_bins || needed_bins + EXTRA >= n) return; + for (;;) { + size_t v = n / 2; + + if (v < min_bins || needed_bins + EXTRA >= v) + break; + + n = v; + } + +#undef EXTRA + n = MAX(2, n); - if (n < needed_bins) + if (n < MAX(needed_bins, min_bins)) return; hash_table_resize(ht, n); @@ -602,17 +841,26 @@ * * @return FALSE if the item could not be added, TRUE on success. */ -gboolean +bool hash_table_insert(hash_table_t *ht, const void *key, const void *value) { - gboolean ret; + bool ret; hash_table_check(ht); ht_synchronize(ht); g_assert(!ht->readonly); - hash_table_resize_on_insert(ht); - ret = hash_table_insert_no_resize(ht, key, value); + if G_UNLIKELY(ht->fixed_size) { + if (ht->num_held == ht->num_bins) { + if (hash_table_find(ht, key, NULL)) + return FALSE; + s_error("%s(): hash table is full", G_STRFUNC); + } + } else { + hash_table_resize_on_insert(ht); + } + + ret = hash_table_insert_no_resize(ht, key, value, NULL); ht_return(ht, ret); } @@ -633,12 +881,16 @@ #endif /* UNUSED */ /** - * Remove item from the hash table. + * Remove item from the hash table, optionally allowing resizing at the end. + * + * @param ht the hash table + * @param key the key to remove + * @param can_resize whether to resize table after item removal * * @return TRUE if item was present in the hash table. */ -gboolean -hash_table_remove(hash_table_t *ht, const void *key) +static bool +hash_table_remove_key(hash_table_t *ht, const void *key, bool can_resize) { hash_item_t *item; size_t bin; @@ -674,9 +926,13 @@ hash_item_free(ht, item); ht->num_held--; + if G_UNLIKELY(item == ht->last_item) + ht->last_item = NULL; /* Clear lookup cache */ + safety_assert(!hash_table_lookup(ht, key)); - hash_table_resize_on_remove(ht); + if (can_resize && !ht->fixed_size) + hash_table_resize_on_remove(ht); ht_return(ht, TRUE); } @@ -685,20 +941,49 @@ } /** + * Remove item from the hash table, without resizing it. + * + * @return TRUE if item was present in the hash table. + */ +bool +hash_table_remove_no_resize(hash_table_t *ht, const void *key) +{ + return hash_table_remove_key(ht, key, FALSE); +} + +/** + * Remove item from the hash table. + * + * @return TRUE if item was present in the hash table. + */ +bool +hash_table_remove(hash_table_t *ht, const void *key) +{ + return hash_table_remove_key(ht, key, TRUE); +} + +/** * Add key/value tuple to the hash table, replacing any existing key/value. */ void hash_table_replace(hash_table_t *ht, const void *key, const void *value) { hash_item_t *item; + size_t bin; hash_table_check(ht); ht_synchronize(ht); g_assert(!ht->readonly); - item = hash_table_find(ht, key, NULL); + item = hash_table_find(ht, key, &bin); if (item == NULL) { - hash_table_insert(ht, key, value); + if G_UNLIKELY(ht->fixed_size) { + if (ht->num_held == ht->num_bins) + s_error("%s(): hash table is full", G_STRFUNC); + } else { + hash_table_resize_on_insert(ht); + } + hash_table_insert_no_resize(ht, key, value, &bin); } else { item->key = key; item->value = value; @@ -708,28 +993,37 @@ } /** + * Lookup key in the table. + * * @return value associated with the key. */ void * hash_table_lookup(const hash_table_t *ht, const void *key) { hash_item_t *item; + void *p; hash_table_check(ht); ht_synchronize(ht); item = hash_table_find(ht, key, NULL); + p = item ? deconstify_pointer(item->value) : NULL; - ht_return(ht, item ? deconstify_gpointer(item->value) : NULL); + ht_return(ht, p); } /** * Lookup key in the hash table, returning physical pointers to the key/value * items into ``kp'' and ``vp'' respectively, if non-NULL. * + * @param ht the hash table + * @param key the key to lookup + * @param kp where the key pointer is copied, if non-NULL + * @param vp where the value pointer is copied, if non-NULL + * * @return TRUE if item was found. */ -gboolean +bool hash_table_lookup_extended(const hash_table_t *ht, const void *key, const void **kp, void **vp) { @@ -746,19 +1040,20 @@ if (kp) *kp = item->key; if (vp) - *vp = deconstify_gpointer(item->value); + *vp = deconstify_pointer(item->value); ht_return(ht, TRUE); } /** * Check whether hashlist contains the key. + * * @return TRUE if the key is present. */ -gboolean +bool hash_table_contains(const hash_table_t *ht, const void *key) { - gboolean ret; + bool ret; hash_table_check(ht); ht_synchronize(ht); @@ -768,6 +1063,65 @@ } /** + * Iterate over the hashtable, invoking the "func" callback on each item + * with the additional "data" argument and removing the item if the + * callback returns TRUE. + * + * @return the amount of items removed from the table. + */ +size_t +hash_table_foreach_remove(hash_table_t *ht, ckeyval_rm_fn_t func, void *data) +{ + size_t i, n, old_n, removed = 0; + + hash_table_check(ht); + g_assert(func != NULL); + + ht_synchronize(ht); + + n = old_n = ht->num_held; + i = ht->num_bins; + + while (i-- > 0) { + hash_item_t *item, *next = NULL, *prev = NULL; + + for (item = ht->binsi; NULL != item; item = next) { + next = item->next; + if ((*func)(item->key, deconstify_pointer(item->value), data)) { + /* Remove the item from the table */ + if (item == ht->binsi) { + if (NULL == next) { + g_assert(ht->bin_fill > 0); + ht->bin_fill--; + } + ht->binsi = next; + } else { + g_assert(prev != NULL); + g_assert(prev->next == item); + + prev->next = next; + } + hash_item_free(ht, item); + ht->num_held--; + if G_UNLIKELY(item == ht->last_item) + ht->last_item = NULL; /* Clear lookup cache */ + removed++; + } else { + prev = item; /* Item was kept, becoming new previous item */ + } + n--; + } + } + g_assert(0 == n); + g_assert(old_n == removed + ht->num_held); + + if (removed != 0 && !ht->fixed_size) + hash_table_resize_on_remove(ht); + + ht_return(ht, removed); +} + +/** * Destroy hash table, reclaiming all the space. */ void @@ -776,10 +1130,10 @@ hash_table_check(ht); ht_synchronize(ht); g_assert(!ht->special); + g_assert(!ht->once); hash_table_reset(ht); if (ht->thread_safe) { - mutex_destroy(&ht->external_lock); mutex_destroy(&ht->lock); } ht->magic = 0; @@ -853,7 +1207,6 @@ if (!ht->thread_safe) { mutex_init(&ht->lock); - mutex_init(&ht->external_lock); ht->thread_safe = TRUE; atomic_mb(); } @@ -874,7 +1227,7 @@ hash_table_check(ht); g_assert(ht->thread_safe); - mutex_get(&ht->external_lock); + mutex_lock(&ht->lock); } /** @@ -889,7 +1242,25 @@ hash_table_check(ht); g_assert(ht->thread_safe); - mutex_release(&ht->external_lock); + mutex_unlock(&ht->lock); +} + +/** + * Is the hash table locked? + * + * If the table is not marked thread-safe, then this returns FALSE. + * + * @return whether the table is locked by the calling thread. + */ +bool +hash_table_is_locked(const hash_table_t *ht) +{ + hash_table_check(ht); + + if G_UNLIKELY(!ht->thread_safe) + return FALSE; + + return mutex_is_owned(&ht->lock); } /** @@ -919,7 +1290,7 @@ void **array; size_t count; size_t i; - gboolean keys; + bool keys; }; /** @@ -932,14 +1303,14 @@ g_assert(htl->i < htl->count); - htl->arrayhtl->i++ = htl->keys ? deconstify_gpointer(key) : value; + htl->arrayhtl->i++ = htl->keys ? deconstify_pointer(key) : value; } /** * Linearize the keys/values into dynamically allocated array. */ static void ** -hash_table_linearize(const hash_table_t *ht, size_t *count, gboolean keys) +hash_table_linearize(const hash_table_t *ht, size_t *count, bool keys) { struct ht_linearize htl; @@ -951,29 +1322,33 @@ htl.keys = keys; /* - * We want to avoid calling xpmalloc() here, but since xmalloc() can - * call walloc() which can create a new zone, we have to be careful. - * Indeed, zalloc() uses a hash table to store its zones by size, and - * we could be linearizing this specific hash table! - * - * For most hash tables our logic will have no impact and does not add - * significant overhead (just another hash_table_size() call). However, - * it can prevent having to allocate more core since small-enough objects - * will be allocated using walloc(). + * Since this hashtable layer can be used by low-level allocators to track + * blocks, for instance, allocating memory could cause the hash table to + * be resized, hence the loop below to delay linearization until we have + * the proper size. */ - htl.array = xmalloc(htl.count * sizeof htl.array0); - while (hash_table_size(ht) != htl.count) { +again: + ht_unsynchronize(ht); + + XMALLOC_ARRAY(htl.array, htl.count); + + while (hash_table_size(ht) > htl.count) { htl.count = hash_table_size(ht); - htl.array = xrealloc(htl.array, htl.count * sizeof htl.array0); + XREALLOC_ARRAY(htl.array, htl.count); } + ht_synchronize(ht); + + if (hash_table_size(ht) > htl.count) + goto again; + hash_table_foreach(ht, hash_table_linearize_item, &htl); - g_assert(htl.count == htl.i); + g_assert(htl.count >= htl.i); if (count != NULL) - *count = htl.count; + *count = htl.i; /* This is the real amount of items we inserted */ ht_return(ht, htl.array); } @@ -1008,12 +1383,55 @@ } /** + * Compute the clustering factor of the hash table. + * + * If there are ``n'' items spread over ``m'' bins, each bin should have + * n/m items. + * + * We can measure the clustering factor ``c'' by computing for each bin i the + * value Bi = size(bin #i)^2 / n. Then c = (Sum Bi) - n/m + 1. + * + * If each bin has the theoretical value, Bi = (n/m)^2 / n = n/m^2. + * Hence c = m * n/m^2 - n/m + 1 = 1. + * + * If c > 1, then it means there is clustering occurring, the higher the value + * the higher the clustering. If c < 1, then the hash function disperses + * values more efficiently than a pure random function! + */ +double +hash_table_clustering(const hash_table_t *ht) +{ + size_t i, n, m; + double c = 0.0; + + hash_table_check(ht); + + ht_synchronize(ht); + + n = ht->num_held; + m = i = ht->num_bins; + + while (i-- > 0) { + hash_item_t *item; + size_t j = 0; + + for (item = ht->binsi; NULL != item; item = item->next) + j++; + + if (j != 0) + c += j*j / (double) n; + } + + ht_return(ht, 1.0 + c - n / (0 == m ? 1.0 : (double) m)); +} + +/** * Create "special" hash table, where the object is allocated through the * specified allocator. */ hash_table_t * hash_table_new_special_full(const hash_table_alloc_t alloc, void *obj, - hash_table_hash_func hash, hash_table_eq_func eq) + hash_fn_t hash, eq_fn_t eq) { hash_table_t *ht = (*alloc)(obj, sizeof *ht); @@ -1021,7 +1439,7 @@ ZERO(ht); ht->special = booleanize(TRUE); - hash_table_new_intern(ht, 2, hash, eq); + hash_table_new_intern(ht, HASH_ITEMS_BINS, hash, eq, NULL, 0); return ht; } @@ -1031,6 +1449,24 @@ return hash_table_new_special_full(alloc, obj, NULL, NULL); } +hash_table_t * +hash_table_new_full_not_leaking(hash_fn_t hash, eq_fn_t eq) +{ + hash_table_t *ht; + + OMALLOC0(ht); + ht->not_leaking = booleanize(TRUE); + ht->once = booleanize(TRUE); + hash_table_new_intern(ht, HASH_ITEMS_BINS, hash, eq, NULL, 0); + return ht; +} + +hash_table_t * +hash_table_new_not_leaking(void) +{ + return hash_table_new_full_not_leaking(NULL, NULL); +} + /* * The hash table is used to keep track of the malloc() and free() operations, * so we need special routines to ensure allocation and freeing of memory @@ -1044,34 +1480,104 @@ #undef malloc #undef free -hash_table_t * -hash_table_new_full_real(hash_table_hash_func hash, hash_table_eq_func eq) +static hash_table_t * +hash_table_new_full_real_using(hash_table_t *ht, bool once, + hash_fn_t hash, eq_fn_t eq) { - hash_table_t *ht = malloc(sizeof *ht); - - g_assert(ht); + g_assert(ht != NULL); ZERO(ht); hash_mark_real(ht, TRUE); - hash_table_new_intern(ht, 2, hash, eq); + hash_mark_once(ht, once); + hash_table_new_intern(ht, HASH_ITEMS_BINS, hash, eq, NULL, 0); return ht; } hash_table_t * +hash_table_once_new_full_real(hash_fn_t hash, eq_fn_t eq) +{ + hash_table_t *ht; + + OMALLOC(ht); + return hash_table_new_full_real_using(ht, TRUE, hash, eq); +} + +hash_table_t * +hash_table_new_full_real(hash_fn_t hash, eq_fn_t eq) +{ + hash_table_t *ht = malloc(sizeof *ht); + + return hash_table_new_full_real_using(ht, FALSE, hash, eq); +} + +hash_table_t * +hash_table_once_new_real(void) +{ + hash_table_t *ht; + + OMALLOC(ht); + return hash_table_new_full_real_using(ht, TRUE, NULL, NULL); +} + +hash_table_t * hash_table_new_real(void) { return hash_table_new_full_real(NULL, NULL); } +/** + * Allocate hash table (the object and the data space) within the arena. + * + * @attention + * The hash table will have a fixed size, meaning it can become full. + * + * @param hash the key hashing function (NULL means identity) + * @param eq the key equality function (NULL means ==) + * @param arena start of the supplied buffer + * @param len length of the buffer where hash table will be stored + * + * @return pointer to the created hash table. + */ +hash_table_t * +hash_table_new_full_fixed(hash_fn_t hash, eq_fn_t eq, void *arena, size_t len) +{ + hash_table_t *ht = arena; + + g_assert(len >= sizeof *ht); + + ZERO(ht); + hash_table_new_intern(ht, HASH_ITEMS_BINS, hash, eq, + ptr_add_offset(arena, sizeof *ht), len - sizeof *ht); + + return ht; +} + +/** + * Allocate hash table (the object and the data space) within the arena. + * + * @attention + * The hash table will have a fixed size, meaning it can become full. + * + * @param arena start of the supplied buffer + * @param len length of the buffer where hash table will be stored + * + * @return pointer to the created hash table. + */ +hash_table_t * +hash_table_new_fixed(void *arena, size_t len) +{ + return hash_table_new_full_fixed(NULL, NULL, arena, len); +} + void hash_table_destroy_real(hash_table_t *ht) { hash_table_check(ht); ht_synchronize(ht); + g_assert(!ht->once); hash_table_reset(ht); if (ht->thread_safe) { - mutex_destroy(&ht->external_lock); mutex_destroy(&ht->lock); } ht->magic = 0;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/hashtable.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/hashtable.h
Changed
@@ -47,14 +47,8 @@ typedef struct hash_table hash_table_t; -typedef void (*hash_table_foreach_func)( - const void *key, void *value, void *data); -typedef size_t (*hash_table_hash_func)(const void *key); -typedef gboolean (*hash_table_eq_func)(const void *a, const void *b); - hash_table_t *hash_table_new(void); -hash_table_t *hash_table_new_full( - hash_table_hash_func hash, hash_table_eq_func eq); +hash_table_t *hash_table_new_full(hash_fn_t hash, eq_fn_t eq); void hash_table_clear(hash_table_t *ht); void hash_table_destroy(hash_table_t *ht); void hash_table_destroy_null(hash_table_t **ht_ptr); @@ -65,29 +59,41 @@ hash_table_t *hash_table_new_special(const hash_table_alloc_t alloc, void *obj); hash_table_t *hash_table_new_special_full( const hash_table_alloc_t alloc, void *obj, - hash_table_hash_func hash, hash_table_eq_func eq); + hash_fn_t hash, eq_fn_t eq); + +hash_table_t *hash_table_new_not_leaking(void); +hash_table_t *hash_table_new_full_not_leaking(hash_fn_t hash, eq_fn_t eq); + +hash_table_t *hash_table_new_fixed(void *arena, size_t len); +hash_table_t *hash_table_new_full_fixed(hash_fn_t hash, eq_fn_t eq, + void *arena, size_t len); #if defined(MALLOC_SOURCE) || defined(VMM_SOURCE) || defined(THREAD_SOURCE) -/* These routines are reserved for the tracking malloc code */ +/* These routines are reserved for the tracking malloc code and for threads */ hash_table_t *hash_table_new_real(void); -hash_table_t *hash_table_new_full_real( - hash_table_hash_func hash, hash_table_eq_func eq); +hash_table_t *hash_table_once_new_real(void); +hash_table_t *hash_table_new_full_real(hash_fn_t hash, eq_fn_t eq); +hash_table_t *hash_table_once_new_full_real(hash_fn_t hash, eq_fn_t eq); void hash_table_destroy_real(hash_table_t *ht); #endif /* MALLOC_SOURCE || VMM_SOURCE || THREAD_SOURCE */ size_t hash_table_size(const hash_table_t *ht); +size_t hash_table_capacity(const hash_table_t *ht); +size_t hash_table_buckets(const hash_table_t *ht); size_t hash_table_memory(const hash_table_t *ht); size_t hash_table_arena_memory(const hash_table_t *ht); -gboolean hash_table_insert(hash_table_t *ht, +bool hash_table_insert(hash_table_t *ht, const void *key, const void *value); void hash_table_replace(hash_table_t *ht, const void *key, const void *value); void *hash_table_lookup(const hash_table_t *ht, const void *key); -gboolean hash_table_lookup_extended(const hash_table_t *ht, +bool hash_table_lookup_extended(const hash_table_t *ht, const void *key, const void **kp, void **vp); -gboolean hash_table_contains(const hash_table_t *ht, const void *key); -gboolean hash_table_remove(hash_table_t *ht, const void *key); -void hash_table_foreach(const hash_table_t *ht, hash_table_foreach_func func, - void *data); +bool hash_table_contains(const hash_table_t *ht, const void *key); +bool hash_table_remove(hash_table_t *ht, const void *key); +bool hash_table_remove_no_resize(hash_table_t *ht, const void *key); +void hash_table_foreach(const hash_table_t *ht, ckeyval_fn_t func, void *data); +size_t hash_table_foreach_remove(hash_table_t *ht, + ckeyval_rm_fn_t func, void *data); const void **hash_table_keys(const hash_table_t *ht, size_t *count); void **hash_table_values(const hash_table_t *ht, size_t *count); @@ -95,6 +101,9 @@ void hash_table_thread_safe(hash_table_t *ht); void hash_table_lock(hash_table_t *ht); void hash_table_unlock(hash_table_t *ht); +bool hash_table_is_locked(const hash_table_t *ht); + +double hash_table_clustering(const hash_table_t *ht) G_PURE; #endif /* _hash_table_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/header.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/header.c
Changed
@@ -34,15 +34,18 @@ #include "common.h" #include "header.h" + #include "ascii.h" #include "atoms.h" +#include "buf.h" #include "getline.h" /* For MAX_LINE_SIZE */ -#include "glib-missing.h" #include "halloc.h" +#include "htable.h" #include "log.h" /* For log_file_printable() */ #include "misc.h" #include "slist.h" #include "str.h" +#include "stringify.h" #include "unsigned.h" #include "walloc.h" @@ -63,7 +66,7 @@ struct header { enum header_magic magic; - GHashTable *headers; /**< Indexed by name */ + htable_t *headers; /**< Indexed by name (case-insensitively) */ slist_t *fields; /**< Ordered list of header_field_t */ int flags; /**< Various operating flags */ int size; /**< Total header size, in bytes */ @@ -142,9 +145,9 @@ * @return human-readable error string corresponding to error code `errnum'. */ const char * -header_strerror(guint errnum) +header_strerror(uint errnum) { - if (errnum >= G_N_ELEMENTS(error_str)) + if (errnum >= N_ITEMS(error_str)) return "Invalid error code"; return error_strerrnum; @@ -218,7 +221,7 @@ hfield_dump(const header_field_t *h, FILE *out) { slist_iter_t *iter; - gboolean first; + bool first; header_field_check(h); g_assert(h->lines); @@ -230,10 +233,11 @@ for (/* NOTHING */; slist_iter_has_item(iter); slist_iter_next(iter)) { const char *s; - if (!first) { + if (first) first = FALSE; + else fputs(" ", out); /* Continuation line */ - } + s = slist_iter_current(iter); if (is_printable_iso8859_string(s)) { fputs(s, out); @@ -242,8 +246,8 @@ const char *p = s; int c; size_t len = strlen(s); - gm_snprintf(buf, sizeof buf, "<%u non-printable byte%s>", - (unsigned) len, 1 == len ? "" : "s"); + str_bprintf(buf, sizeof buf, "<%u non-printable byte%s>", + (unsigned) len, plural(len)); fputs(buf, out); while ((c = *p++)) { if (is_ascii_print(c) || is_ascii_space(c)) @@ -254,20 +258,22 @@ } fputc('\n', out); } - slist_iter_free(&iter); + slist_iter_free(&iter); } /*** *** header object ***/ -static GHashTable * +static htable_t * header_get_table(header_t *o) { header_check(o); - if (!o->headers) - o->headers = g_hash_table_new(ascii_strcase_hash, ascii_strcase_eq); + if (NULL == o->headers) { + o->headers = htable_create_any(ascii_strcase_hash, + NULL, ascii_strcase_eq); + } return o->headers; } @@ -289,12 +295,15 @@ /** * Frees the key/values from the headers hash. */ -static gboolean -free_header_data(gpointer key, gpointer value, gpointer unused_udata) +static bool +free_header_data(const void *key, void *value, void *unused_udata) { + void *k; + (void) unused_udata; - HFREE_NULL(key); /* XXX if shared, don't do that */ + k = deconstify_pointer(key); + hfree(k); /* XXX if shared, don't do that */ str_destroy(value); return TRUE; } @@ -352,11 +361,11 @@ { header_check(o); - if (o->headers) { - g_hash_table_foreach_remove(o->headers, free_header_data, NULL); - gm_hash_table_destroy_null(&o->headers); + if (o->headers != NULL) { + htable_foreach_remove(o->headers, free_header_data, NULL); + htable_free_null(&o->headers); } - slist_free_all(&o->fields, cast_to_slist_destroy(hfield_free)); + slist_free_all(&o->fields, cast_to_free_fn(hfield_free)); o->flags = o->size = o->num_lines = 0; } @@ -373,7 +382,7 @@ header_check(o); if (o->headers) { - v = g_hash_table_lookup(o->headers, deconstify_gchar(field)); + v = htable_lookup(o->headers, deconstify_char(field)); } else { v = NULL; } @@ -396,7 +405,7 @@ header_check(o); if (o->headers) { - v = g_hash_table_lookup(o->headers, deconstify_gchar(field)); + v = htable_lookup(o->headers, deconstify_char(field)); } else { v = NULL; } @@ -413,20 +422,20 @@ static void add_header(header_t *o, const char *field, const char *text) { - GHashTable *ht; + htable_t *ht; str_t *v; header_check(o); ht = header_get_table(o); - v = g_hash_table_lookup(ht, field); + v = htable_lookup(ht, field); if (v) { /* * Header already exists, according to RFC2616 we need to append * the value, comma-separated. */ - str_cat(v, ", "); + STR_CAT(v, ", "); str_cat(v, text); } else { @@ -438,7 +447,7 @@ key = h_strdup(field); v = str_new_from(text); - g_hash_table_insert(ht, key, v); + htable_insert(ht, key, v); } } @@ -454,7 +463,7 @@ header_check(o); g_assert(o->headers); - v = g_hash_table_lookup(o->headers, field); + v = htable_lookup(o->headers, field); g_assert(v != NULL); str_putc(v, ' '); str_cat(v, text); @@ -471,7 +480,7 @@ { char bufMAX_LINE_SIZE; const char *p = text; - guchar c; + uchar c; header_field_t *hf; header_check(o); @@ -562,7 +571,7 @@ } else { char *b; - gboolean seen_space = FALSE; + bool seen_space = FALSE; /* * It's a new header line. @@ -586,7 +595,7 @@ continue; } if ( - seen_space || (c != '-' && + seen_space || (c != '-' && c != '.' && (!isascii(c) || is_ascii_cntrl(c) || is_ascii_punct(c))) ) { o->flags |= HEAD_F_SKIP; @@ -642,7 +651,7 @@ } static void -header_dump_item(gpointer p, gpointer user_data) +header_dump_item(void *p, void *user_data) { hfield_dump(p, user_data); } @@ -763,7 +772,7 @@ hf->seplen = strlen(hf->sep); hf->stripped_seplen = stripped_strlen(hf->sep, hf->seplen); str_cat(hf->header, field); - str_cat(hf->header, ": "); + STR_CAT(hf->header, ": "); hf->current_len = str_len(hf->header); @@ -821,7 +830,7 @@ * within the maximum header size requirement in case a continuation * is emitted, and using the configured separator. */ -gboolean +bool header_fmt_value_fits(const header_fmt_t *hf, size_t len) { size_t final_len; @@ -868,13 +877,13 @@ * resulted in the header being larger than the configured max size (the * header line is left in the state it was in upon entry, in that case). */ -static gboolean +static bool header_fmt_append_full(header_fmt_t *hf, const char *str, const char *separator, size_t slen, size_t sslen) { size_t len, curlen; gsize gslen; - gboolean success; + bool success; header_fmt_check(hf); g_assert(size_is_non_negative(slen)); @@ -904,7 +913,7 @@ str_cat_len(hf->header, separator, sslen); } - str_cat(hf->header, "\r\n\t"); /* Includes continuation */ + STR_CAT(hf->header, "\r\n\t"); /* Includes continuation */ curlen = 1; /* One tab */ } else if (hf->data_emitted) { str_cat(hf->header, separator); @@ -944,7 +953,7 @@ * @return TRUE if we were able to append the data whilst remaining under * the configured maximum length. */ -gboolean +bool header_fmt_append(header_fmt_t *hf, const char *str, const char *separator) { size_t seplen; @@ -969,7 +978,7 @@ * @return TRUE if we were able to append the data whilst remaining under * the configured maximum length. */ -gboolean +bool header_fmt_append_value(header_fmt_t *hf, const char *str) { header_fmt_check(hf); @@ -1001,7 +1010,7 @@ g_assert(!hf->frozen); if (!hf->empty) - str_cat(hf->header, "\r\n"); + STR_CAT(hf->header, "\r\n"); hf->frozen = TRUE; g_assert(str_len(hf->header) < hf->max_size); @@ -1027,16 +1036,18 @@ const char * header_fmt_to_string(const header_fmt_t *hf) { - static char lineHEADER_FMT_MAX_SIZE + 1; + buf_t *b = buf_private(G_STRFUNC, HEADER_FMT_MAX_SIZE + 1); + char *p = buf_data(b); + size_t n = buf_size(b); header_fmt_check(hf); - if (str_len(hf->header) >= sizeof line) { + if (str_len(hf->header) >= n) { g_warning("trying to format too long an HTTP line (%zu bytes)", str_len(hf->header)); } - clamp_strncpy(line, sizeof line, str_2c(hf->header), str_len(hf->header)); - return line; + clamp_strncpy(p, n, str_2c(hf->header), str_len(hf->header)); + return p; } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/header.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/header.h
Changed
@@ -76,7 +76,7 @@ void header_reset(header_t *o); int header_append(header_t *o, const char *text, int len); void header_dump(FILE *out, const header_t *o, const char *trailer); -const char *header_strerror(guint errnum); +const char *header_strerror(uint errnum); char *header_get(const header_t *o, const char *field); char *header_get_extended(const header_t *o, const char *field, size_t *lptr); @@ -86,9 +86,9 @@ size_t len_hint, size_t max_size); void header_fmt_free(header_fmt_t **hf); void header_fmt_set_line_length(header_fmt_t *hf, size_t maxlen); -gboolean header_fmt_value_fits(const header_fmt_t *hf, size_t len); -gboolean header_fmt_append(header_fmt_t *hf, const char *str, const char *sep); -gboolean header_fmt_append_value(header_fmt_t *hf, const char *str); +bool header_fmt_value_fits(const header_fmt_t *hf, size_t len); +bool header_fmt_append(header_fmt_t *hf, const char *str, const char *sep); +bool header_fmt_append_value(header_fmt_t *hf, const char *str); size_t header_fmt_length(const header_fmt_t *hf); void header_fmt_end(header_fmt_t *hf); const char *header_fmt_string(const header_fmt_t *hf);
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/hevset.c
Added
@@ -0,0 +1,749 @@ +/* + * Copyright (c) 2012-2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Hashed set with embedded keys within values. + * + * A set with embedded keys can actually behave as a hash table from an + * external point of view. The keys that are put in the set are structured + * thusly: + * + * struct item { + * <value fields> + * struct key key; // The key + * <other value fields> + * }; + * + * The set points to the embedded key in the item. The value structure ties + * the key with associated attibutes. + * + * From an implementation perspective, we use a set but store the offset of + * the key within the item, so we can always derive the address of the item + * from that of the key. + * + * This allows us to create a hash table, i.e store (key, value) tuples, + * without requiring an extra pointer for the value. + * + * The API is closer to hash sets than to hash tables. + * + * Each hash set object can be made thread-safe, optionally, so that + * concurrent access to it be possible. + * + * @author Raphael Manfredi + * @date 2012-2013 + */ + +#include "common.h" + +#define HASH_SOURCE + +#include "hevset.h" +#include "unsigned.h" +#include "walloc.h" +#include "xmalloc.h" + +#include "override.h" /* Must be the last header included */ + +/* Reverse assignment attempt */ +#define HASH_EVSET(x) \ + (((x) != NULL && \ + HEVSET_MAGIC == (x)->magic) ? (hevset_t *) (x) : NULL) + +/** + * The hash set structure. + */ +struct hevset { + HASH_COMMON_ATTRIBUTES + size_t offset; /* Offset of key within the value structure */ +}; + +enum hevset_iter_magic { HEVSET_ITER_MAGIC = 0x33cbb728 }; + +static inline void +hevset_check(const hevset_t * const hx) +{ + g_assert(hx != NULL); + g_assert(HEVSET_MAGIC == hx->magic); +} + +/** + * A hash set iterator. + */ +struct hevset_iter { + enum hevset_iter_magic magic; + const hevset_t *hx; + size_t pos; /* Current position (next item returned) */ + size_t stamp; /* Modification stamp */ + unsigned deleted:1; /* Whether we deleted items */ +}; + +static inline void +hevset_iter_check(const hevset_iter_t * const hxi) +{ + g_assert(hxi != NULL); + g_assert(HEVSET_ITER_MAGIC == hxi->magic); + hevset_check(hxi->hx); +} + +static const struct hash_ops hevset_ops; + +static void +hevset_values_set(struct hash *h, const void **values) +{ + (void) h; + (void) values; + + g_assert_not_reached(); /* Cannot be called */ +} + +static const void ** +hevset_values_get(const struct hash *h) +{ + (void) h; + + return NULL; /* No values (embedded with keys) */ +} + +static void +hevset_hash_free(struct hash *h) +{ + hevset_t *hx = HASH_EVSET(h); + + hevset_free_null(&hx); +} + +/** + * Allocate a new hash set capable of holding 2^bits items. + */ +static hevset_t * +hevset_allocate(size_t bits, bool raw, size_t offset) +{ + hevset_t *hx; + + if (raw) + XMALLOC0(hx); + else + WALLOC0(hx); + + hx->magic = HEVSET_MAGIC; + hx->ops = &hevset_ops; + hx->kset.raw_memory = booleanize(raw); + hx->offset = offset; + hash_arena_allocate(HASH(hx), bits); + + return hx; +} + +/** + * Create a new hash set using default sizing approach, for specific + * key types (i.e. not HASH_KEY_ANY). + * + * @param offset the offset of the key in the value structure + * @param ktype key type + * @param keysize expected for HASH_KEY_FIXED to give key size, otherwise 0 + * + * @return new hash set. + */ +hevset_t * +hevset_create(size_t offset, enum hash_key_type ktype, size_t keysize) +{ + hevset_t *hx; + + g_assert(ktype != HASH_KEY_ANY); /* Use hevset_create_any() */ + + hx = hevset_allocate(HASH_MIN_BITS, FALSE, offset); + hash_keyhash_setup(&hx->kset, ktype, keysize); + + return hx; +} + +/** + * Create a new hash set using default sizing approach, for specific + * key types (i.e. not HASH_KEY_ANY). + * + * The object is allocated via xpmalloc() and avoids walloc() for the arena. + * + * @param offset the offset of the key in the value structure + * @param ktype key type + * @param keysize expected for HASH_KEY_FIXED to give key size, otherwise 0 + * + * @return new hash set. + */ +hevset_t * +hevset_create_real(size_t offset, enum hash_key_type ktype, size_t keysize) +{ + hevset_t *hx; + + g_assert(ktype != HASH_KEY_ANY); /* Use hevset_create_any() */ + + hx = hevset_allocate(HASH_MIN_BITS, TRUE, offset); + hash_keyhash_setup(&hx->kset, ktype, keysize); + + return hx; +} + +/** + * Create a new hash set using default sizing approach, for any key. + * + * @param offset the offset of the key in the value structure + * @param primary primary hash function (cannot be NULL) + * @param secondary secondary hash function (may be NULL) + * @param eq key equality function (NULL means '==' checks) + * + * @return new hash set. + */ +hevset_t * +hevset_create_any(size_t offset, + hash_fn_t primary, hash_fn_t secondary, eq_fn_t eq) +{ + hevset_t *hx; + + g_assert(primary != NULL); + + hx = hevset_allocate(HASH_MIN_BITS, FALSE, offset); + hash_keyhash_any_setup(&hx->kset, primary, secondary, eq); + + return hx; +} + +/** + * Create a new hash set using default sizing approach, for any key. + * + * The object is allocated via xpmalloc() and avoids walloc() for the arena. + * + * @param offset the offset of the key in the value structure + * @param primary primary hash function (cannot be NULL) + * @param secondary secondary hash function (may be NULL) + * @param eq key equality function (NULL means '==' checks) + * + * @return new hash set. + */ +hevset_t * +hevset_create_any_real(size_t offset, + hash_fn_t primary, hash_fn_t secondary, eq_fn_t eq) +{ + hevset_t *hx; + + g_assert(primary != NULL); + + hx = hevset_allocate(HASH_MIN_BITS, TRUE, offset); + hash_keyhash_any_setup(&hx->kset, primary, secondary, eq); + + return hx; +} + +/** + * Destroy hash set. + */ +static void +hevset_free(hevset_t *hx) +{ + hevset_check(hx); + g_assert(0 == hx->refcnt); /* No pending iterators */ + + hash_arena_free(HASH(hx)); + hx->magic = 0; + if (hx->kset.raw_memory) + xfree(hx); + else + WFREE(hx); +} + +/** + * Destroy hash set and nullify its pointer. + */ +void +hevset_free_null(hevset_t **hx_ptr) +{ + hevset_t *hx = *hx_ptr; + + if (hx != NULL) { + hevset_free(hx); + *hx_ptr = NULL; + } +} + +/** + * Mark hash set as thread-safe. + */ +void +hevset_thread_safe(hevset_t *ht) +{ + hevset_check(ht); + + hash_thread_safe(HASH(ht)); +} + +/** + * Lock the hash set to allow a sequence of operations to be atomically + * conducted. + * + * It is possible to lock the set several times as long as each locking + * is paired with a corresponding unlocking in the execution flow. + * + * The set must have been marked thread-safe already. + */ +void +hevset_lock(hevset_t *hx) +{ + hevset_check(hx); + g_assert_log(hx->lock != NULL, + "%s(): hash set %p not marked thread-safe", G_STRFUNC, hx); + + mutex_lock(hx->lock); +} + +/* + * Release lock on hash set. + * + * The set must have been marked thread-safe already and locked by the + * calling thread. + */ +void +hevset_unlock(hevset_t *hx) +{ + hevset_check(hx); + g_assert_log(hx->lock != NULL, + "%s(): hash set %p not marked thread-safe", G_STRFUNC, hx); + + mutex_unlock(hx->lock); +} + +/** + * Insert item in hash set. + * + * Any previously existing value for the key is replaced by the new one. + * + * @param ht the hash table + * @param key pointer to the key within the value structure + * + * @attention + * This routine takes a reference to the embedded key within the value to + * insert. It should be preferred to hevset_insert() when the values can have + * multiple indexing keys, to emphasize which key is going to be used for + * the insertion in that table. + */ +void +hevset_insert_key(hevset_t *ht, const void *key) +{ + hevset_check(ht); + g_assert(key != NULL); + + hash_synchronize(HASH(ht)); + + hash_insert_key(HASH(ht), key); + ht->stamp++; + + hash_return_void(HASH(ht)); +} + +/** + * Insert item in hash set. + * + * Any previously existing value for the key is replaced by the new one. + * + * @param ht the hash table + * @param value the value (which embeds the key) + * + * @attention + * This routine takes a value with its embedded expanded key, not the key. + */ +void +hevset_insert(hevset_t *ht, const void *value) +{ + const void *key; + + hevset_check(ht); + g_assert(value != NULL); + + key = const_ptr_add_offset(value, ht->offset); + hash_synchronize(HASH(ht)); + + hash_insert_key(HASH(ht), key); + ht->stamp++; + + hash_return_void(HASH(ht)); +} + +/** + * Check whether key is held in hash set. + * + * @param hx the hash table + * @param key the key + * + * @return whether table contains the key. + */ +bool +hevset_contains(const hevset_t *hx, const void *key) +{ + bool found; + + hevset_check(hx); + g_assert(key != NULL); + + hash_synchronize(HASH(hx)); + found = (size_t) -1 != hash_lookup_key(HASH(hx), key); + hash_return(HASH(hx), found); +} + +/** + * Fetch value from the hash set. + * + * @param ht the hash table + * @param key the key being looked up + * + * @return found value, or NULL if not found. + */ +void * +hevset_lookup(const hevset_t *ht, const void *key) +{ + size_t idx; + void *value; + + hevset_check(ht); + g_assert(key != NULL); + + hash_synchronize(HASH(ht)); + idx = hash_lookup_key(HASH(ht), key); + + if ((size_t) -1 == idx) + hash_return(HASH(ht), NULL); + + value = ptr_add_offset(deconstify_pointer(ht->kset.keysidx), -ht->offset); + hash_return(HASH(ht), value); +} + +/** + * Fetch key/value from the hash table, returning whether the key exists. + * If it does, the original value pointer is written valptr. + * + * @param ht the hash table + * @param key the key being looked up + * @param valptr if non-NULL, where the original value pointer is written + * + * @return whether key exists in the table. + */ +bool +hevset_lookup_extended(const hevset_t *ht, const void *key, void **valptr) +{ + size_t idx; + + hevset_check(ht); + + hash_synchronize(HASH(ht)); + idx = hash_lookup_key(HASH(ht), key); + + if ((size_t) -1 == idx) + hash_return(HASH(ht), FALSE); + + if (valptr != NULL) { + void *kptr = deconstify_pointer(ht->kset.keysidx); + *valptr = ptr_add_offset(kptr, -ht->offset); + } + + hash_return(HASH(ht), TRUE); +} + +/** + * Fetch a random value from the set. + * + * @return the chosen random value, NULL if the set was empty. + */ +void * +hevset_random(const hevset_t *ht) +{ + size_t idx; + const void *key; + + hevset_check(ht); + + idx = hash_random(HASH(ht), &key); + + if ((size_t) -1 == idx) + return NULL; + + return ptr_add_offset(deconstify_pointer(key), -ht->offset); +} + +/** + * Remove key from the hash table. + * + * @return TRUE if the key was present in the table. + */ +bool +hevset_remove(hevset_t *hx, const void *key) +{ + bool present; + + hevset_check(hx); + + hash_synchronize(HASH(hx)); + + hx->stamp++; + present = hash_delete_key(HASH(hx), key); + + hash_return(HASH(hx), present); +} + +/** + * @return amount of items in the table. + */ +size_t +hevset_count(const hevset_t *hx) +{ + size_t count; + + hevset_check(hx); + + hash_synchronize(HASH(hx)); + count = hx->kset.items; + hash_return(HASH(hx), count); +} + +/** + * Remove all items from hash table. + */ +void hevset_clear(hevset_t *hx) +{ + hevset_check(hx); + + hash_clear(HASH(hx)); +} + +/** + * Traverse table, invoking callback for each entry. + * + * @param hx the hash table + * @param fn callback to invoke + * @param data additional callback parameter + */ +void +hevset_foreach(const hevset_t *hx, data_fn_t fn, void *data) +{ + unsigned *hp, *end; + size_t i, n; + + hevset_check(hx); + + hash_synchronize(HASH(hx)); + + end = &hx->kset.hasheshx->kset.size; + hash_refcnt_inc(HASH(hx)); /* Prevent any key relocation */ + + for (i = n = 0, hp = hx->kset.hashes; hp != end; i++, hp++) { + if (HASH_IS_REAL(*hp)) { + void *kptr = deconstify_pointer(hx->kset.keysi); + (*fn)(ptr_add_offset(kptr, -hx->offset), data); + n++; + } + } + + g_assert(n == hx->kset.items); + + hash_refcnt_dec(HASH(hx)); + hash_return_void(HASH(hx)); +} + +/** + * Traverse table, invoking callback for each key. + * + * @param hx the hash table + * @param fn callback to invoke on the key + * @param data additional callback parameter + */ +void +hevset_foreach_key(const hevset_t *ht, data_fn_t fn, void *data) +{ + hash_foreach(HASH(ht), fn, data); +} + +/** + * Traverse table, invoking callback for each entry and removing it when + * the callback function returns TRUE. + * + * @param hx the hash table + * @param fn callback to invoke + * @param data additional callback parameter + * + * @return the number of entries removed from the hash table. + */ +size_t +hevset_foreach_remove(hevset_t *hx, data_rm_fn_t fn, void *data) +{ + unsigned *hp, *end; + size_t i, n, nr; + + hevset_check(hx); + + hash_synchronize(HASH(hx)); + + end = &hx->kset.hasheshx->kset.size; + hash_refcnt_inc(HASH(hx)); /* Prevent any key relocation */ + + for (i = n = nr = 0, hp = hx->kset.hashes; hp != end; i++, hp++) { + if (HASH_IS_REAL(*hp)) { + void *kptr = deconstify_pointer(hx->kset.keysi); + bool r = (*fn)(ptr_add_offset(kptr, -hx->offset), data); + n++; + if (r) { + nr++; + hash_erect_tombstone(HASH(hx), i); + hx->stamp++; + } + } + } + + g_assert(n == hx->kset.items); + g_assert(nr <= hx->kset.items); + + hash_refcnt_dec(HASH(hx)); + + hx->kset.items -= nr; + + if (nr != 0) + hash_resize_as_needed(HASH(hx)); + + hash_return(HASH(hx), nr); +} + +/** + * Create a new hash set iterator. + */ +hevset_iter_t * +hevset_iter_new(const hevset_t *hx) +{ + hevset_iter_t *hxi; + + hevset_check(hx); + + WALLOC0(hxi); + hxi->magic = HEVSET_ITER_MAGIC; + hxi->hx = hx; + + hash_synchronize(HASH(hx)); + + hxi->stamp = hx->stamp; + hash_refcnt_inc(HASH(hx)); + + hash_unsynchronize(HASH(hx)); + + return hxi; +} + +/** + * Release hash set iterator. + */ +void +hevset_iter_release(hevset_iter_t **hxi_ptr) +{ + hevset_iter_t *hxi = *hxi_ptr; + + if (hxi != NULL) { + hevset_iter_check(hxi); + + hash_synchronize(HASH(hxi->hx)); + + hash_refcnt_dec(HASH(hxi->hx)); + if (hxi->deleted && 0 == hxi->hx->refcnt) + hash_resize_as_needed(HASH(hxi->hx)); + + hash_unsynchronize(HASH(hxi->hx)); + + hxi->magic = 0; + WFREE(hxi); + *hxi_ptr = NULL; + } +} + +/** + * Fetch next entry from iterator. + * + * @param hxi the hash table iterator + * @param vp where value is written, if non-NULL + * + * @return TRUE if a new entry exists, FALSE otherwise. + */ +bool +hevset_iter_next(hevset_iter_t *hxi, void **vp) +{ + const hevset_t *hx; + + hevset_iter_check(hxi); + + hx = hxi->hx; + hash_synchronize(HASH(hx)); + + while (hxi->pos < hx->kset.size && !HASH_IS_REAL(hx->kset.hasheshxi->pos)) + hxi->pos++; + + if (hxi->pos >= hx->kset.size) + hash_return(HASH(hx), FALSE); + + if (vp != NULL) { + void *kptr = deconstify_pointer(hx->kset.keyshxi->pos); + *vp = ptr_add_offset(kptr, -hx->offset); + } + + hash_unsynchronize(HASH(hx)); + + hxi->pos++; + return TRUE; +} + +/** + * Remove current iterator item, returned by hevset_iter_next(). + */ +void +hevset_iter_remove(hevset_iter_t *hxi) +{ + hevset_t *hx; + size_t idx; + + hevset_iter_check(hxi); + g_assert(size_is_positive(hxi->pos)); /* Called _next() once */ + g_assert(hxi->pos <= hxi->hx->kset.size); + + hx = deconstify_pointer(hxi->hx); + hash_synchronize(HASH(hx)); + + idx = hxi->pos - 1; /* Current item */ + if (hash_erect_tombstone(HASH(hx), idx)) + hx->kset.items--; + + hash_unsynchronize(HASH(hx)); + hxi->deleted = TRUE; +} + +/** + * Polymorphic operations. + */ +static const struct hash_ops hevset_ops = { + hevset_values_set, /* set_values */ + hevset_values_get, /* get_values */ + hevset_hash_free, /* hash_free */ +}; + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/hevset.h
Added
@@ -0,0 +1,107 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Hash sets with embedded keys within values. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _hevset_h_ +#define _hevset_h_ + +#include "hash.h" + +struct hevset; +typedef struct hevset hevset_t; + +struct hevset_iter; +typedef struct hevset_iter hevset_iter_t; + +/** + * Cast set to a polmorphic hash const. + */ +static inline ALWAYS_INLINE const struct hash * +hevset_cast_to_const_hash(const struct hevset *hx) +{ + return (const struct hash *) hx; +} + +/** + * Cast set to a polmorphic hash. + */ +static inline ALWAYS_INLINE struct hash * +hevset_cast_to_hash(const struct hevset *hx) +{ + return (struct hash *) hx; +} + +/** + * Cast pointer to set to a pointer to a polmorphic hash. + */ +static inline ALWAYS_INLINE struct hash ** +hevset_ptr_cast_to_hash(struct hevset * const *hx) +{ + return (struct hash **) hx; +} + +/* + * Public interface. + */ + +hevset_t *hevset_create(size_t offset, enum hash_key_type ktype, size_t ksize); +hevset_t *hevset_create_real(size_t offset, + enum hash_key_type ktype, size_t keysize); +hevset_t *hevset_create_any(size_t offset, hash_fn_t primary, + hash_fn_t secondary, eq_fn_t eq); +hevset_t *hevset_create_any_real(size_t offset, hash_fn_t primary, + hash_fn_t secondary, eq_fn_t eq); +void hevset_free_null(hevset_t **); +void hevset_clear(hevset_t *); +void hevset_thread_safe(hevset_t *); +void hevset_lock(hevset_t *); +void hevset_unlock(hevset_t *); + +bool hevset_contains(const hevset_t *, const void *key); +void hevset_insert_key(hevset_t *ht, const void *key); +void hevset_insert(hevset_t *, const void *value); +void *hevset_lookup(const hevset_t *, const void *key); +bool hevset_lookup_extended(const hevset_t *, const void *key, void **valptr); +void *hevset_random(const hevset_t *ht); +bool hevset_remove(hevset_t *, const void *key); +size_t hevset_count(const hevset_t *); +void hevset_foreach(const hevset_t *, data_fn_t fn, void *data); +size_t hevset_foreach_remove(hevset_t *, data_rm_fn_t, void *); + +hevset_iter_t *hevset_iter_new(const hevset_t *); +void hevset_iter_release(hevset_iter_t **); +bool hevset_iter_next(hevset_iter_t *, void **kp); +void hevset_iter_remove(hevset_iter_t *); + +#endif /* _hevset_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/hgeneric.ct
Added
@@ -0,0 +1,984 @@ +/* + * Copyright (c) 2012-2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Hash <generic> implementation. + * + * Each hash <generic> object can be made thread-safe, optionally, so that + * concurrent access to it be possible. + * + * @author Raphael Manfredi + * @date 2012-2013 + */ + +#include "common.h" + +#define H<GENERIC>_SOURCE + +#include "h<generic>.h" +#include "unsigned.h" +#include "walloc.h" +#include "xmalloc.h" + +#include "override.h" /* Must be the last header included */ + +/* Reverse assignment attempt */ +#define HASH_<GENERIC>(x) \ + (((x) != NULL && \ + H<GENERIC>_MAGIC == (x)->magic) ? (h<generic>_t *) (x) : NULL) + +@if TABLE +/** + * The hash table structure. + */ +struct htable { + HASH_COMMON_ATTRIBUTES + const void **values; /* Array of values */ +}; + +enum htable_iter_magic { HTABLE_ITER_MAGIC = 0x4b0236cd }; +@end +@if SET +/** + * The hash set structure. + */ +struct hset { + HASH_COMMON_ATTRIBUTES +}; + +enum hset_iter_magic { HSET_ITER_MAGIC = 0x34419ef9 }; +@end + +static inline void +h<generic>_check(const h<generic>_t * const hx) +{ + g_assert(hx != NULL); + g_assert(H<GENERIC>_MAGIC == hx->magic); +} + +/** + * A hash <generic> iterator. + */ +struct h<generic>_iter { + enum h<generic>_iter_magic magic; + const h<generic>_t *hx; + size_t pos; /* Current position (next item returned) */ + size_t stamp; /* Modification stamp */ + unsigned deleted:1; /* Whether we deleted items */ +}; + +static inline void +h<generic>_iter_check(const h<generic>_iter_t * const hxi) +{ + g_assert(hxi != NULL); + g_assert(H<GENERIC>_ITER_MAGIC == hxi->magic); + h<generic>_check(hxi->hx); +} + +static const struct hash_ops h<generic>_ops; + +@if TABLE +/** + * Record the base of the values array. + */ +static void +htable_values_set(struct hash *h, const void **values) +{ + htable_t *ht = HASH_TABLE(h); + + g_assert(values != NULL); + htable_check(ht); + + ht->values = values; +} + +/** + * Return the values array. + */ +static const void ** +htable_values_get(const struct hash *h) +{ + const htable_t *ht = HASH_TABLE(h); + + return ht->values; +} +@end +@if SET +static void +hset_values_set(struct hash *h, const void **values) +{ + (void) h; + (void) values; + + g_assert_not_reached(); /* Cannot be called */ +} + +static const void ** +hset_values_get(const struct hash *h) +{ + (void) h; + + return NULL; /* No values */ +} +@end + +static void +h<generic>_hash_free(struct hash *h) +{ + h<generic>_t *hx = HASH_<GENERIC>(h); + + h<generic>_free_null(&hx); +} + +/** + * Allocate a new hash <generic> capable of holding 2^bits items. + */ +static h<generic>_t * +h<generic>_allocate(size_t bits, bool raw) +{ + h<generic>_t *hx; + + if (raw) + XMALLOC0(hx); + else + WALLOC0(hx); + + hx->magic = H<GENERIC>_MAGIC; + hx->ops = &h<generic>_ops; +@if TABLE + hx->kset.has_values = TRUE; +@end + hx->kset.raw_memory = booleanize(raw); + hash_arena_allocate(HASH(hx), bits); + + return hx; +} + +/** + * Create a new hash <generic> using default sizing approach, for specific + * key types (i.e. not HASH_KEY_ANY). + * + * @param ktype key type + * @param keysize expected for HASH_KEY_FIXED to give key size, otherwise 0 + * + * @return new hash <generic>. + */ +h<generic>_t * +h<generic>_create(enum hash_key_type ktype, size_t keysize) +{ + h<generic>_t *hx; + + g_assert(ktype != HASH_KEY_ANY); /* Use h<generic>_create_any() */ + + hx = h<generic>_allocate(HASH_MIN_BITS, FALSE); + hash_keyhash_setup(&hx->kset, ktype, keysize); + + return hx; +} + +/** + * Create a new hash <generic> using default sizing approach, for specific + * key types (i.e. not HASH_KEY_ANY). + * + * The object is allocated via xpmalloc() and avoids walloc() for the arena. + * + * @param ktype key type + * @param keysize expected for HASH_KEY_FIXED to give key size, otherwise 0 + * + * @return new hash <generic>. + */ +h<generic>_t * +h<generic>_create_real(enum hash_key_type ktype, size_t keysize) +{ + h<generic>_t *hx; + + g_assert(ktype != HASH_KEY_ANY); /* Use h<generic>_create_any() */ + + hx = h<generic>_allocate(HASH_MIN_BITS, TRUE); + hash_keyhash_setup(&hx->kset, ktype, keysize); + + return hx; +} + +/** + * Create a new hash <generic> using default sizing approach, for any key. + * + * @param primary primary hash function (cannot be NULL) + * @param secondary secondary hash function (may be NULL) + * @param eq key equality function (NULL means '==' checks) + * + * @return new hash <generic>. + */ +h<generic>_t * +h<generic>_create_any(hash_fn_t primary, hash_fn_t secondary, eq_fn_t eq) +{ + h<generic>_t *hx; + + g_assert(primary != NULL); + + hx = h<generic>_allocate(HASH_MIN_BITS, FALSE); + hash_keyhash_any_setup(&hx->kset, primary, secondary, eq); + + return hx; +} + +/** + * Create a new hash <generic> using default sizing approach, for any key. + * + * The object is allocated via xpmalloc() and avoids walloc() for the arena. + * + * @param primary primary hash function (cannot be NULL) + * @param secondary secondary hash function (may be NULL) + * @param eq key equality function (NULL means '==' checks) + * + * @return new hash <generic>. + */ +h<generic>_t * +h<generic>_create_any_real(hash_fn_t primary, hash_fn_t secondary, eq_fn_t eq) +{ + h<generic>_t *hx; + + g_assert(primary != NULL); + + hx = h<generic>_allocate(HASH_MIN_BITS, TRUE); + hash_keyhash_any_setup(&hx->kset, primary, secondary, eq); + + return hx; +} + +/** + * Destroy hash <generic>. + */ +static void +h<generic>_free(h<generic>_t *hx) +{ + h<generic>_check(hx); + g_assert(0 == hx->refcnt); /* No pending iterators */ + + hash_arena_free(HASH(hx)); + hx->magic = 0; + if (hx->kset.raw_memory) + xfree(hx); + else + WFREE(hx); +} + +/** + * Destroy hash <generic> and nullify its pointer. + */ +void +h<generic>_free_null(h<generic>_t **hx_ptr) +{ + h<generic>_t *hx = *hx_ptr; + + if (hx != NULL) { + h<generic>_free(hx); + *hx_ptr = NULL; + } +} + +/** + * Mark hash <generic> as thread-safe. + */ +void +h<generic>_thread_safe(h<generic>_t *hx) +{ + h<generic>_check(hx); + + hash_thread_safe(HASH(hx)); +} + +/** + * Lock the hash <generic> to allow a sequence of operations to be atomically + * conducted. + * + * It is possible to lock the <generic> several times as long as each locking + * is paired with a corresponding unlocking in the execution flow. + * + * The <generic> must have been marked thread-safe already. + */ +void +h<generic>_lock(h<generic>_t *hx) +{ + h<generic>_check(hx); + g_assert_log(hx->lock != NULL, + "%s(): hash <generic> %p not marked thread-safe", G_STRFUNC, hx); + + mutex_lock(hx->lock); +} + +/* + * Release lock on hash <generic>. + * + * The <generic> must have been marked thread-safe already and locked by the + * calling thread. + */ +void +h<generic>_unlock(h<generic>_t *hx) +{ + h<generic>_check(hx); + g_assert_log(hx->lock != NULL, + "%s(): hash <generic> %p not marked thread-safe", G_STRFUNC, hx); + + mutex_unlock(hx->lock); +} + +@if TABLE +/** + * Insert item in hash table. + * + * Any previously existing value for the key is replaced by the new one. + * NULL is a valid value. + * + * @param ht the hash table + * @param key the key + * @param value the value + */ +void +htable_insert(htable_t *ht, const void *key, void *value) +{ + size_t idx; + + htable_check(ht); + + hash_synchronize(HASH(ht)); + + idx = hash_insert_key(HASH(ht), key); + ht->valuesidx = value; + ht->stamp++; + + hash_return_void(HASH(ht)); +} +@end /* TABLE */ +@if SET +/** + * Insert item in hash set. + * + * Any previously existing key is replaced by the new one. + * + * @param hs the hash set + * @param key the key + */ +void +hset_insert(hset_t *hs, const void *key) +{ + hset_check(hs); + + hash_synchronize(HASH(hs)); + + hash_insert_key(HASH(hs), key); + hs->stamp++; + + hash_return_void(HASH(hs)); +} +@end /* SET */ + +/** + * Check whether key is held in hash <generic>. + * + * @param hx the hash <generic> + * @param key the key + * + * @return whether <generic> contains the key. + */ +bool +h<generic>_contains(const h<generic>_t *hx, const void *key) +{ + bool found; + + h<generic>_check(hx); + + hash_synchronize(HASH(hx)); + found = (size_t) -1 != hash_lookup_key(HASH(hx), key); + hash_return(HASH(hx), found); +} + +/** + * Get a random key from the hash <generic>. + * + * @param hx the hash <generic> + * + * @return the selected random key, NULL if the <generic> is empty. + */ +const void * +h<generic>_random(const h<generic>_t *hx) +{ + size_t idx; + const void *key; + + h<generic>_check(hx); + + if ((size_t) -1 == (idx = hash_random(HASH(hx), &key))) + return NULL; + + return key; +} + +@if TABLE +/** + * Fetch value from the hash table. + * + * @param ht the hash table + * @param key the key being looked up + * + * @return found value, or NULL if not found. + * + * @attention + * Since NULL is a valid value, one cannot use NULL as a valid signal + * for a missing key unless one knows that no NULL is inserted in the + * table. + */ +void * +htable_lookup(const htable_t *ht, const void *key) +{ + size_t idx; + void *value; + + htable_check(ht); + + hash_synchronize(HASH(ht)); + + idx = hash_lookup_key(HASH(ht), key); + value = (size_t) -1 == idx ? NULL : deconstify_pointer(ht->valuesidx); + + hash_return(HASH(ht), value); +} + +/** + * Fetch key/value from the hash table, returning whether the key exists. + * If it does, the original key/value pointers are written in keyptr and + * valptr. + * + * @param ht the hash table + * @param key the key being looked up + * @param keyptr if non-NULL, where the original key pointer is written + * @param valptr if non-NULL, where the original value pointer is written + * + * @return whether key exists in the table. + */ +bool +htable_lookup_extended(const htable_t *ht, const void *key, + const void **keyptr, void **valptr) +{ + size_t idx; + + htable_check(ht); + + hash_synchronize(HASH(ht)); + + idx = hash_lookup_key(HASH(ht), key); + + if ((size_t) -1 == idx) + hash_return(HASH(ht), FALSE); + + if (keyptr != NULL) + *keyptr = ht->kset.keysidx; + if (valptr != NULL) + *valptr = deconstify_pointer(ht->valuesidx); + + hash_return(HASH(ht), TRUE); +} + +/** + * Fetch random key/value pair from table. + * + * @param ht the hash table + * @param keyptr if non-NULL, where the chosen key pointer is written + * @param valptr if non-NULL, where the chosen value pointer is written + * + * @return whether a key was selected (always TRUE, unless table was empty). + */ +bool +htable_random_extended(const htable_t *ht, const void **keyptr, void **valptr) +{ + size_t idx; + bool selected; + + htable_check(ht); + + hash_synchronize(HASH(ht)); + + idx = hash_random(HASH(ht), keyptr); + selected = idx != (size_t) -1; + + if (selected && valptr != NULL) + *valptr = deconstify_pointer(ht->valuesidx); + + hash_return(HASH(ht), selected); +} +@end /* TABLE */ +@if SET +/** + * Fetch original key from the hash set. + * + * @param hs the hash set + * @param key the key being looked up + * + * @return found key, or NULL if not found. + * + * @attention + * Since NULL could be a valid key, one cannot use NULL as a valid signal + * for a missing key unless one knows that no NULL is inserted in the set. + */ +void * +hset_lookup(const hset_t *hs, const void *key) +{ + size_t idx; + void *fkey; + + hset_check(hs); + + hash_synchronize(HASH(hs)); + + idx = hash_lookup_key(HASH(hs), key); + fkey = (size_t) -1 == idx ? NULL : deconstify_pointer(hs->kset.keysidx); + + hash_return(HASH(hs), fkey); +} + +/** + * Lookup key from the hash set, returning whether the key exists. + * If it does, the original key pointer is written in keyptr. + * + * @param hs the hash set + * @param key the key being looked up + * @param keyptr if non-NULL, where the original key pointer is written + * + * @return whether key exists in the set. + */ +bool +hset_contains_extended(const hset_t *hs, const void *key, const void **keyptr) +{ + size_t idx; + + hset_check(hs); + + hash_synchronize(HASH(hs)); + + idx = hash_lookup_key(HASH(hs), key); + + if ((size_t) -1 == idx) + hash_return(HASH(hs), FALSE); + + if (keyptr != NULL) + *keyptr = hs->kset.keysidx; + + hash_return(HASH(hs), TRUE); +} + +/** + * Choose random key from set. + * + * @param hs the hash set + * @param keyptr if non-NULL, where the chosen key pointer is written + * + * @return whether a key was selected (always TRUE, unless set was empty). + */ +bool +hset_random_extended(const hset_t *hs, const void **keyptr) +{ + hset_check(hs); + + return (size_t) -1 != hash_random(HASH(hs), keyptr); +} +@end /* SET */ + +/** + * Remove key from the hash <generic>. + * + * @return TRUE if the key was present in the <generic>. + */ +bool +h<generic>_remove(h<generic>_t *hx, const void *key) +{ + bool present; + + h<generic>_check(hx); + + hash_synchronize(HASH(hx)); + + hx->stamp++; + present = hash_delete_key(HASH(hx), key); + + hash_return(HASH(hx), present); +} + +/** + * @return amount of items in the <generic>. + */ +size_t +h<generic>_count(const h<generic>_t *hx) +{ + size_t count; + + h<generic>_check(hx); + + hash_synchronize(HASH(hx)); + count = hx->kset.items; + hash_return(HASH(hx), count); +} + +/** + * Remove all items from hash table. + */ +void h<generic>_clear(h<generic>_t *hx) +{ + h<generic>_check(hx); + + hash_clear(HASH(hx)); +} + +/** + * Traverse <generic>, invoking callback for each entry. + * + * @param hx the hash <generic> + * @param fn callback to invoke + * @param data additional callback parameter + */ +void +h<generic>_foreach(const h<generic>_t *hx, <iterator>_fn_t fn, void *data) +{ + unsigned *hp, *end; + size_t i, n; + + h<generic>_check(hx); + + hash_synchronize(HASH(hx)); + + end = &hx->kset.hasheshx->kset.size; + hash_refcnt_inc(HASH(hx)); /* Prevent any key relocation */ + + for (i = n = 0, hp = hx->kset.hashes; hp != end; i++, hp++) { + if (HASH_IS_REAL(*hp)) { +@if TABLE + (*fn)(hx->kset.keysi, deconstify_pointer(hx->valuesi), data); +@end +@if SET + (*fn)(hx->kset.keysi, data); +@end + n++; + } + } + + g_assert(n == hx->kset.items); + + hash_refcnt_dec(HASH(hx)); + hash_return_void(HASH(hx)); +} + +@if TABLE +/** + * Traverse table, invoking callback for each key. + * + * @param hx the hash <generic> + * @param fn callback to invoke on the key + * @param data additional callback parameter + */ +void +htable_foreach_key(const htable_t *ht, data_fn_t fn, void *data) +{ + hash_foreach(HASH(ht), fn, data); +} +@end + +/** + * Traverse <generic>, invoking callback for each entry and removing it when + * the callback function returns TRUE. + * + * @param hx the hash <generic> + * @param fn callback to invoke + * @param data additional callback parameter + * + * @return the number of entries removed from the hash <generic>. + */ +size_t +h<generic>_foreach_remove(h<generic>_t *hx, <iterator>_rm_fn_t fn, void *data) +{ + unsigned *hp, *end; + size_t i, n, nr; + + h<generic>_check(hx); + + hash_synchronize(HASH(hx)); + + end = &hx->kset.hasheshx->kset.size; + hash_refcnt_inc(HASH(hx)); /* Prevent any key relocation */ + + for (i = n = nr = 0, hp = hx->kset.hashes; hp != end; i++, hp++) { + if (HASH_IS_REAL(*hp)) { +@if TABLE + bool r = (*fn)(hx->kset.keysi, + deconstify_pointer(hx->valuesi), data); +@end +@if SET + bool r = (*fn)(hx->kset.keysi, data); +@end + n++; + if (r) { + nr++; + hash_erect_tombstone(HASH(hx), i); + hx->stamp++; + } + } + } + + g_assert(n == hx->kset.items); + g_assert(nr <= hx->kset.items); + + hash_refcnt_dec(HASH(hx)); + + hx->kset.items -= nr; + + if (nr != 0) + hash_resize_as_needed(HASH(hx)); + + hash_return(HASH(hx), nr); +} + +/** + * Create a new hash <generic> iterator. + */ +h<generic>_iter_t * +h<generic>_iter_new(const h<generic>_t *hx) +{ + h<generic>_iter_t *hxi; + + h<generic>_check(hx); + + WALLOC0(hxi); + hxi->magic = H<GENERIC>_ITER_MAGIC; + hxi->hx = hx; + + hash_synchronize(HASH(hx)); + + hxi->stamp = hx->stamp; + hash_refcnt_inc(HASH(hx)); + + hash_unsynchronize(HASH(hx)); + + return hxi; +} + +/** + * Release hash <generic> iterator. + */ +void +h<generic>_iter_release(h<generic>_iter_t **hxi_ptr) +{ + h<generic>_iter_t *hxi = *hxi_ptr; + + if (hxi != NULL) { + h<generic>_iter_check(hxi); + + hash_synchronize(HASH(hxi->hx)); + + hash_refcnt_dec(HASH(hxi->hx)); + if (hxi->deleted && 0 == hxi->hx->refcnt) + hash_resize_as_needed(HASH(hxi->hx)); + + hash_unsynchronize(HASH(hxi->hx)); + + hxi->magic = 0; + WFREE(hxi); + *hxi_ptr = NULL; + } +} + +@if TABLE +/** + * Fetch next entry from iterator. + * + * @param hxi the hash table iterator + * @param kp where key is written, if non-NULL + * @param vp where value is written, if non-NULL + * + * @return TRUE if a new entry exists, FALSE otherwise. + */ +bool +htable_iter_next(htable_iter_t *hxi, const void **kp, void **vp) +@end /* TABLE */ +@if SET +/** + * Fetch next entry from iterator. + * + * @param hxi the hash set iterator + * @param kp where key is written, if non-NULL + * + * @return TRUE if a new entry exists, FALSE otherwise. + */ +bool +hset_iter_next(hset_iter_t *hxi, const void **kp) +@end /* SET */ +{ + const h<generic>_t *hx; + + h<generic>_iter_check(hxi); + + hx = hxi->hx; + + hash_synchronize(HASH(hx)); + + while (hxi->pos < hx->kset.size && !HASH_IS_REAL(hx->kset.hasheshxi->pos)) + hxi->pos++; + + if (hxi->pos >= hx->kset.size) + hash_return(HASH(hx), FALSE); + + if (kp != NULL) + *kp = hx->kset.keyshxi->pos; +@if TABLE + if (vp != NULL) + *vp = deconstify_pointer(hx->valueshxi->pos); +@end + + hash_unsynchronize(HASH(hx)); + + hxi->pos++; + return TRUE; +} + +/** + * Remove current iterator item, returned by h<generic>_iter_next(). + */ +void +h<generic>_iter_remove(h<generic>_iter_t *hxi) +{ + h<generic>_t *hx; + size_t idx; + + h<generic>_iter_check(hxi); + g_assert(size_is_positive(hxi->pos)); /* Called _next() once */ + g_assert(hxi->pos <= hxi->hx->kset.size); + + hx = deconstify_pointer(hxi->hx); + hash_synchronize(HASH(hx)); + + idx = hxi->pos - 1; /* Current item */ + if (hash_erect_tombstone(HASH(hx), idx)) + hx->kset.items--; + + hash_unsynchronize(HASH(hx)); + + hxi->deleted = TRUE; +} + +/** + * Polymorphic operations. + */ +static const struct hash_ops h<generic>_ops = { + h<generic>_values_set, /* set_values */ + h<generic>_values_get, /* get_values */ + h<generic>_hash_free, /* hash_free */ +}; + +/*** + *** Unit tests. + ***/ + +/* + * The hash set implementation is mostly derived from the same source as the + * hash table and therefore does not need to be tested: the only variation + * between the two implementations concerns the value management. + */ + +@if TABLE +static void G_COLD +htable_test_fill(htable_t *ht) +{ + size_t i; + + for (i = 0; i < 256; i++) { + void *p = ulong_to_pointer(i); + g_assert(!htable_contains(ht, p)); + htable_insert(ht, p, p); + g_assert(htable_contains(ht, p)); + } +} + +/** + * Perform unit tests for hash tables. + */ +void G_COLD +htable_test(void) +{ + size_t i; + htable_t *ht; + htable_iter_t *hti; + char flags256; + const void *key; + int keys4 = { 0xc7569bda, 0x65cb1432, 0x18659927, 0xf3362dc7 }; + + ht = htable_create(HASH_KEY_SELF, 0); + htable_test_fill(ht); + for (i = 0; i < 256; i++) { + void *p = ulong_to_pointer(i); + g_assert(htable_contains(ht, p)); + htable_remove(ht, p); + g_assert(!htable_contains(ht, p)); + } + htable_test_fill(ht); + for (i = 256; i < 512; i++) { + void *p = ulong_to_pointer(i); + void *o = ulong_to_pointer(i - 256); + g_assert(htable_contains(ht, o)); + g_assert(!htable_contains(ht, p)); + htable_remove(ht, o); + htable_insert(ht, p, p); + g_assert(htable_contains(ht, p)); + g_assert(!htable_contains(ht, o)); + } + g_assert(256 == htable_count(ht)); + ZERO(&flags); + hti = htable_iter_new(ht); + while (htable_iter_next(hti, &key, NULL)) { + size_t idx = pointer_to_ulong(key) - 256; + g_assert(htable_contains(ht, key)); + g_assert(size_is_non_negative(idx)); + g_assert(idx < 256); + g_assert('\0' == flagsidx); + flagsidx = '1'; + htable_iter_remove(hti); + g_assert(!htable_contains(ht, key)); + } + htable_iter_release(&hti); + g_assert(0 == htable_count(ht)); + for (i = 0; i < 256; i++) { + g_assert(flagsi != '\0'); + } + htable_free_null(&ht); + + ht = htable_create(HASH_KEY_FIXED, sizeof(int)); + for (i = 0; i < 16; i++) { + size_t idx = i % G_N_ELEMENTS(keys); + htable_insert(ht, &keysidx, NULL); + g_assert(htable_contains(ht, &keysidx)); + } + g_assert(G_N_ELEMENTS(keys) == htable_count(ht)); + htable_free_null(&ht); +} +@end /* TABLE */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/hgeneric.ht
Added
@@ -0,0 +1,136 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Hash <generic>s. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _h<generic>_h_ +#define _h<generic>_h_ + +#include "hash.h" + +struct h<generic>; +typedef struct h<generic> h<generic>_t; + +struct h<generic>_iter; +typedef struct h<generic>_iter h<generic>_iter_t; + +/** + * Cast <generic> to a polmorphic hash const. + */ +static inline ALWAYS_INLINE const struct hash * +h<generic>_cast_to_const_hash(const struct h<generic> *hx) +{ + return (const struct hash *) hx; +} + +/** + * Cast <generic> to a polmorphic hash. + */ +static inline ALWAYS_INLINE struct hash * +h<generic>_cast_to_hash(const struct h<generic> *hx) +{ + return (struct hash *) hx; +} + +/** + * Cast pointer to <generic> to a pointer to a polmorphic hash. + */ +static inline ALWAYS_INLINE struct hash ** +h<generic>_ptr_cast_to_hash(struct h<generic> * const *hx) +{ + return (struct hash **) hx; +} + +/* + * Public interface. + */ + +h<generic>_t *h<generic>_create(enum hash_key_type ktype, size_t keysize); +h<generic>_t *h<generic>_create_real(enum hash_key_type ktype, size_t keysize); +h<generic>_t *h<generic>_create_any(hash_fn_t primary, + hash_fn_t secondary, eq_fn_t eq); +h<generic>_t *h<generic>_create_any_real(hash_fn_t primary, + hash_fn_t secondary, eq_fn_t eq); +void h<generic>_free_null(h<generic>_t **); +void h<generic>_clear(h<generic>_t *); +void h<generic>_thread_safe(h<generic>_t *); +void h<generic>_lock(h<generic>_t *); +void h<generic>_unlock(h<generic>_t *); + +bool h<generic>_contains(const h<generic>_t *, const void *key); +const void *h<generic>_random(const h<generic>_t *); +@if TABLE +void htable_insert(htable_t *, const void *key, void *value); +void *htable_lookup(const htable_t *, const void *key); +bool htable_lookup_extended(const htable_t *, const void *key, + const void **keyptr, void **valptr); +bool htable_random_extended(const htable_t *, + const void **keyptr, void **valptr); + +static inline void +htable_insert_const(htable_t *ht, const void *key, const void *value) +{ + htable_insert(ht, key, deconstify_gpointer(value)); +} + +@end +@if SET +void hset_insert(hset_t *, const void *key); +void *hset_lookup(const hset_t *, const void *key); +bool hset_contains_extended(const hset_t *, const void *key, + const void **keyptr); +bool hset_random_extended(const hset_t *, const void **keyptr); +@end +bool h<generic>_remove(h<generic>_t *, const void *key); +size_t h<generic>_count(const h<generic>_t *); +void h<generic>_foreach(const h<generic>_t *, <iterator>_fn_t fn, void *data); +size_t h<generic>_foreach_remove(h<generic>_t *, <iterator>_rm_fn_t, void *); +@if TABLE +void htable_foreach_key(const htable_t *, data_fn_t fn, void *data); +@end + +h<generic>_iter_t *h<generic>_iter_new(const h<generic>_t *); +void h<generic>_iter_release(h<generic>_iter_t **); +@if TABLE +bool htable_iter_next(htable_iter_t *, const void **kp, void **vp); +@end +@if SET +bool hset_iter_next(hset_iter_t *, const void **kp); +@end +void h<generic>_iter_remove(h<generic>_iter_t *); + +@if TABLE +void htable_test(void); +@end + +#endif /* _h<generic>_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/hikset.c
Added
@@ -0,0 +1,891 @@ +/* + * Copyright (c) 2012-2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Hashed set with keys internally referenced within values. + * + * A set with internal keys can actually behave as a hash table from an + * external point of view. The keys that are put in the set are structured + * thusly: + * + * struct item { + * <value fields> + * struct key *key; // The key reference + * <other value fields> + * }; + * + * From an implementation perspective, we use a set to store the items but + * we keep the offset of the key within the item, so we can always derive a + * proper hashing of the item. + * + * This allows us to create a hash table, i.e store (key, value) tuples, + * without requiring an extra pointer for the value. + * + * The API is closer to hash sets than to hash tables. + * + * Each hash set object can be made thread-safe, optionally, so that + * concurrent access to it be possible. + * + * @author Raphael Manfredi + * @date 2012-2013 + */ + +#include "common.h" + +#define HASH_SOURCE + +#include "hikset.h" +#include "hashing.h" /* For binary_hash() and friends */ +#include "unsigned.h" +#include "walloc.h" +#include "xmalloc.h" + +#include "override.h" /* Must be the last header included */ + +/* Reverse assignment attempt */ +#define HASH_IKSET(x) \ + (((x) != NULL && \ + HIKSET_MAGIC == (x)->magic) ? (hikset_t *) (x) : NULL) + +/** + * The hash set structure. + * + * We'll be storing the address of the key, trapping the hash function to come + * back to this wrapping layer that will dereference the key pointer in the item + * and call the original hashing routine or equality routine. + * + * Therefore we need to keep these original hash/equality routines in addition + * to the offset of the key field in the value. + */ +struct hikset { + HASH_COMMON_ATTRIBUTES + enum hash_key_type ktype; /* Real key type */ + size_t offset; /* Offset of key within the value structure */ + hash_fn_t ihash; /* Initial hash function for key */ + union { + eq_fn_t eq; /* Key equality test */ + size_t keysize; /* For fixed-length keys */ + } uik; +}; + +enum hikset_iter_magic { HIKSET_ITER_MAGIC = 0x3d3f97a7 }; + +static inline void +hikset_check(const hikset_t * const hx) +{ + g_assert(hx != NULL); + g_assert(HIKSET_MAGIC == hx->magic); +} + +/** + * A hash set iterator. + */ +struct hikset_iter { + enum hikset_iter_magic magic; + const hikset_t *hx; + size_t pos; /* Current position (next item returned) */ + size_t stamp; /* Modification stamp */ + unsigned deleted:1; /* Whether we deleted items */ +}; + +static inline void +hikset_iter_check(const hikset_iter_t * const hxi) +{ + g_assert(hxi != NULL); + g_assert(HIKSET_ITER_MAGIC == hxi->magic); + hikset_check(hxi->hx); +} + +static const struct hash_ops hikset_ops; + +static void +hikset_values_set(struct hash *h, const void **values) +{ + (void) h; + (void) values; + + g_assert_not_reached(); /* Cannot be called */ +} + +static const void ** +hikset_values_get(const struct hash *h) +{ + (void) h; + + return NULL; /* No values (stored as keys) */ +} + +static void +hikset_hash_free(struct hash *h) +{ + hikset_t *hx = HASH_IKSET(h); + + hikset_free_null(&hx); +} + +/** + * Hash key. + * + * This is the trapping function we're installing for our hash set, which will + * dereference the pointer field of the user's key within the value and hash it. + */ +static uint +hikset_key_hash(const void *value, void *data) +{ + hikset_t *hik = data; + const void * const *key = value; + + hikset_check(hik); + + return NULL == hik->ihash ? + binary_hash(*key, hik->uik.keysize) : + (*hik->ihash)(*key); +} + +/** + * Key equality check. + * + * This is the trapping function we're installing for our hash set. + */ +static bool +hikset_key_equals(const void *a, const void *b, void *data) +{ + hikset_t *hik = data; + const void * const *ka = a; + const void * const *kb = b; + + hikset_check(hik); + + switch (hik->ktype) { + case HASH_KEY_SELF: + return *ka == *kb; + case HASH_KEY_STRING: + case HASH_KEY_ANY: + return (*hik->uik.eq)(*ka, *kb); + case HASH_KEY_FIXED: + return binary_eq(*ka, *kb, hik->uik.keysize); + case HASH_KEY_ANY_DATA: + case HASH_KEY_MAXTYPE: + break; + } + + g_assert_not_reached(); +} + +/** + * Allocate a new hash set capable of holding 2^bits items. + */ +static hikset_t * +hikset_allocate(size_t bits, bool raw, size_t offset) +{ + hikset_t *hx; + + if (raw) + XMALLOC0(hx); + else + WALLOC0(hx); + + hx->magic = HIKSET_MAGIC; + hx->ops = &hikset_ops; + hx->kset.raw_memory = booleanize(raw); + hx->offset = offset; + hash_arena_allocate(HASH(hx), bits); + + return hx; +} + +/** + * Setut hashing / comparison routines for keys. + */ +static void +hikset_key_setup(hikset_t *hik, enum hash_key_type ktype, size_t keysize) +{ + hik->ktype = ktype; + switch (ktype) { + case HASH_KEY_SELF: + hik->ihash = pointer_hash; + hik->uik.eq = NULL; /* Will use == comparison */ + break; + case HASH_KEY_STRING: + hik->ihash = string_mix_hash; + hik->uik.eq = string_eq; + break; + case HASH_KEY_FIXED: + hik->ihash = NULL; /* Will use binary_hash() */ + hik->uik.keysize = keysize; /* Will use binary_eq() */ + break; + case HASH_KEY_ANY: + case HASH_KEY_ANY_DATA: + case HASH_KEY_MAXTYPE: + g_assert_not_reached(); + } +} + +/** + * Create a new hash set using default sizing approach, for specific + * key types (i.e. not HASH_KEY_ANY). + * + * @param ktype key type + * @param offset the offset of the key in the value structure + * @param keysize expected for HASH_KEY_FIXED to give key size, otherwise 0 + * @param real whether to use VMM and avoid walloc() + * + * @return new hash set. + */ +static hikset_t * +hikset_new(enum hash_key_type ktype, size_t offset, size_t keysize, bool real) +{ + hikset_t *hx; + + g_assert(ktype != HASH_KEY_ANY); /* Use hikset_create_any() */ + + hx = hikset_allocate(HASH_MIN_BITS, real, offset); + hx->offset = offset; + hikset_key_setup(hx, ktype, keysize); + hash_keyhash_data_setup(&hx->kset, hikset_key_hash, hx, hikset_key_equals); + + return hx; +} + +/** + * Create a new hash set using default sizing approach, for specific + * key types (i.e. not HASH_KEY_ANY). + * + * @param offset the offset of the key in the value structure + * @param ktype key type + * @param keysize expected for HASH_KEY_FIXED to give key size, otherwise 0 + * + * @return new hash set. + */ +hikset_t * +hikset_create(size_t offset, enum hash_key_type ktype, size_t keysize) +{ + return hikset_new(ktype, offset, keysize, FALSE); +} + +/** + * Create a new hash set using default sizing approach, for specific + * key types (i.e. not HASH_KEY_ANY). + * + * The object is allocated via xpmalloc() and avoids walloc() for the arena. + * + * @param offset the offset of the key in the value structure + * @param ktype key type + * @param keysize expected for HASH_KEY_FIXED to give key size, otherwise 0 + * + * @return new hash set. + */ +hikset_t * +hikset_create_real(size_t offset, enum hash_key_type ktype, size_t keysize) +{ + return hikset_new(ktype, offset, keysize, TRUE); +} + +/** + * Create a new hash set using default sizing approach, for any key. + * + * Note that there is no secondary hash defined here: values with embedded + * keys use a default secondary hash routine. + * + * @param offset the offset of the key in the value structure + * @param hash hash function (cannot be NULL) + * @param eq key equality function (NULL means '==' checks) + * @param real whether to use VMM and avoid walloc() + * + * @return new hash set. + */ +static hikset_t * +hikset_new_any(size_t offset, hash_fn_t hash, eq_fn_t eq, bool real) +{ + hikset_t *hx; + + g_assert(hash != NULL); + + hx = hikset_allocate(HASH_MIN_BITS, real, offset); + hx->ktype = HASH_KEY_ANY; + hx->offset = offset; + hx->ihash = hash; + hx->uik.eq = NULL == eq ? pointer_eq : eq; + hash_keyhash_data_setup(&hx->kset, hikset_key_hash, hx, hikset_key_equals); + + return hx; +} + +/** + * Create a new hash set using default sizing approach, for any key. + * + * Note that there is no secondary hash defined here: values with embedded + * keys use a default secondary hash routine. + * + * @param offset the offset of the key in the value structure + * @param hash hash function (cannot be NULL) + * @param eq key equality function (NULL means '==' checks) + * + * @return new hash set. + */ +hikset_t * +hikset_create_any(size_t offset, hash_fn_t hash, eq_fn_t eq) +{ + return hikset_new_any(offset, hash, eq, FALSE); +} + +/** + * Create a new hash set using default sizing approach, for any key. + * + * Note that there is no secondary hash defined here: values with embedded + * keys use a default secondary hash routine. + * + * The object is allocated via xpmalloc() and avoids walloc() for the arena. + * + * @param offset the offset of the key in the value structure + * @param hash hash function (cannot be NULL) + * @param eq key equality function (NULL means '==' checks) + * + * @return new hash set. + */ +hikset_t * +hikset_create_any_real(size_t offset, hash_fn_t hash, eq_fn_t eq) +{ + return hikset_new_any(offset, hash, eq, TRUE); +} + +/** + * Destroy hash set. + */ +static void +hikset_free(hikset_t *hx) +{ + hikset_check(hx); + g_assert(0 == hx->refcnt); /* No pending iterators */ + + hash_arena_free(HASH(hx)); + hx->magic = 0; + if (hx->kset.raw_memory) + xfree(hx); + else + WFREE(hx); +} + +/** + * Destroy hash set and nullify its pointer. + */ +void +hikset_free_null(hikset_t **hx_ptr) +{ + hikset_t *hx = *hx_ptr; + + if (hx != NULL) { + hikset_free(hx); + *hx_ptr = NULL; + } +} + +/** + * Mark hash set as thread-safe. + */ +void +hikset_thread_safe(hikset_t *hx) +{ + hikset_check(hx); + + hash_thread_safe(HASH(hx)); +} + +/** + * Lock the hash set to allow a sequence of operations to be atomically + * conducted. + * + * It is possible to lock the set several times as long as each locking + * is paired with a corresponding unlocking in the execution flow. + * + * The set must have been marked thread-safe already. + */ +void +hikset_lock(hikset_t *hx) +{ + hikset_check(hx); + g_assert_log(hx->lock != NULL, + "%s(): hash set %p not marked thread-safe", G_STRFUNC, hx); + + mutex_lock(hx->lock); +} + +/* + * Release lock on hash set. + * + * The set must have been marked thread-safe already and locked by the + * calling thread. + */ +void +hikset_unlock(hikset_t *hx) +{ + hikset_check(hx); + g_assert_log(hx->lock != NULL, + "%s(): hash set %p not marked thread-safe", G_STRFUNC, hx); + + mutex_unlock(hx->lock); +} + +/** + * Insert item in hash set. + * + * Any previously existing value for the key is replaced by the new one. + * + * @param ht the hash table + * @param keyptr pointer to the key field in the value + * + * @attention + * This routine takes a reference to the embedded key pointer within the value + * to insert. It should be preferred to hikset_insert() when the values can + * have multiple indexing keys, to emphasize which key is going to be used + * for the insertion in the table. + */ +void +hikset_insert_key(hikset_t *hik, const void *keyptr) +{ + hikset_check(hik); + g_assert(keyptr != NULL); + + /* + * We're really inserting the address within the value where the key + * is stored. It will be hashed through hikset_key_hash() which + * will perform the necessary indirection. + */ + + hash_synchronize(HASH(hik)); + + hash_insert_key(HASH(hik), keyptr); + hik->stamp++; + + hash_return_void(HASH(hik)); +} + +/** + * Insert item in hash set. + * + * Any previously existing value for the key is replaced by the new one. + * + * @param ht the hash table + * @param value the value (which embeds the key) + * + * @attention + * This routine takes a value with its embedded key reference, not the key. + */ +void +hikset_insert(hikset_t *hik, const void *value) +{ + void * const *key; /* Pointer to the key field in the value */ + + hikset_check(hik); + g_assert(value != NULL); + + /* + * We're really inserting the address within the value where the key + * is stored. It will be hashed through hikset_key_hash() which + * will perform the necessary indirection. + */ + + key = const_ptr_add_offset(value, hik->offset); + hash_synchronize(HASH(hik)); + + hash_insert_key(HASH(hik), key); + hik->stamp++; + + hash_return_void(HASH(hik)); +} + +/** + * Check whether key is held in hash set. + * + * @param hx the hash table + * @param key the key + * + * @return whether table contains the key. + */ +bool +hikset_contains(const hikset_t *hx, const void *key) +{ + bool found; + + hikset_check(hx); + + /* + * We store a pointer to the key, we look for a pointer to the key + * because the hashing routine hikset_key_hash() will do the additional + * indirection to get at the key pointer. + */ + + hash_synchronize(HASH(hx)); + + found = (size_t) -1 != hash_lookup_key(HASH(hx), &key); + + hash_return(HASH(hx), found); +} + +/** + * Fetch value from the hash set. + * + * @param ht the hash table + * @param key the key being looked up + * + * @return found value, or NULL if not found. + */ +void * +hikset_lookup(const hikset_t *ht, const void *key) +{ + size_t idx; + void *value; + + hikset_check(ht); + + hash_synchronize(HASH(ht)); + idx = hash_lookup_key(HASH(ht), &key); + + if ((size_t) -1 == idx) + hash_return(HASH(ht), NULL); + + /* + * We stored a pointer to the key in the value structure. + * To get the start of the value, we simply offset that pointer. + */ + + value = ptr_add_offset(deconstify_pointer(ht->kset.keysidx), -ht->offset); + + hash_return(HASH(ht), value); +} + +/** + * Fetch key/value from the hash table, returning whether the key exists. + * If it does, the original value pointer is written valptr. + * + * @param ht the hash table + * @param key the key being looked up + * @param valptr if non-NULL, where the original value pointer is written + * + * @return whether key exists in the table. + */ +bool +hikset_lookup_extended(const hikset_t *ht, const void *key, void **valptr) +{ + size_t idx; + + hikset_check(ht); + + hash_synchronize(HASH(ht)); + idx = hash_lookup_key(HASH(ht), &key); + + if ((size_t) -1 == idx) + hash_return(HASH(ht), FALSE); + + if (valptr != NULL) { + void *kptr = deconstify_pointer(ht->kset.keysidx); + *valptr = ptr_add_offset(kptr, -ht->offset); + } + + hash_return(HASH(ht), TRUE); +} + +/** + * Fetch a random value from the set. + * + * @return the chosen random value, NULL if the set was empty. + */ +void * +hikset_random(const hikset_t *ht) +{ + size_t idx; + const void *key; + + hikset_check(ht); + + idx = hash_random(HASH(ht), &key); + + if ((size_t) -1 == idx) + return NULL; + + return ptr_add_offset(deconstify_pointer(key), -ht->offset); +} + +/** + * Remove key from the hash table. + * + * @return TRUE if the key was present in the table. + */ +bool +hikset_remove(hikset_t *hx, const void *key) +{ + bool present; + + hikset_check(hx); + + hash_synchronize(HASH(hx)); + + hx->stamp++; + present = hash_delete_key(HASH(hx), &key); + + hash_return(HASH(hx), present); +} + +/** + * @return amount of items in the table. + */ +size_t +hikset_count(const hikset_t *hx) +{ + size_t count; + + hikset_check(hx); + + hash_synchronize(HASH(hx)); + count = hx->kset.items; + hash_return(HASH(hx), count); +} + +/** + * Remove all items from hash table. + */ +void hikset_clear(hikset_t *hx) +{ + hikset_check(hx); + + hash_clear(HASH(hx)); +} + +/** + * Traverse table, invoking callback for each entry. + * + * @param hx the hash table + * @param fn callback to invoke + * @param data additional callback parameter + */ +void +hikset_foreach(const hikset_t *hx, data_fn_t fn, void *data) +{ + unsigned *hp, *end; + size_t i, n; + + hikset_check(hx); + + hash_synchronize(HASH(hx)); + + end = &hx->kset.hasheshx->kset.size; + hash_refcnt_inc(HASH(hx)); /* Prevent any key relocation */ + + for (i = n = 0, hp = hx->kset.hashes; hp != end; i++, hp++) { + if (HASH_IS_REAL(*hp)) { + void *kptr = deconstify_pointer(hx->kset.keysi); + (*fn)(ptr_add_offset(kptr, -hx->offset), data); + n++; + } + } + + g_assert(n == hx->kset.items); + + hash_refcnt_dec(HASH(hx)); + hash_return_void(HASH(hx)); +} + +/** + * Traverse table, invoking callback for each key. + * + * @param hx the hash table + * @param fn callback to invoke on the key + * @param data additional callback parameter + */ +void +hikset_foreach_key(const hikset_t *ht, data_fn_t fn, void *data) +{ + hash_foreach(HASH(ht), fn, data); +} + +/** + * Traverse table, invoking callback for each entry and removing it when + * the callback function returns TRUE. + * + * @param hx the hash table + * @param fn callback to invoke + * @param data additional callback parameter + * + * @return the number of entries removed from the hash table. + */ +size_t +hikset_foreach_remove(hikset_t *hx, data_rm_fn_t fn, void *data) +{ + unsigned *hp, *end; + size_t i, n, nr; + + hikset_check(hx); + + hash_synchronize(HASH(hx)); + + end = &hx->kset.hasheshx->kset.size; + hash_refcnt_inc(HASH(hx)); /* Prevent any key relocation */ + + for (i = n = nr = 0, hp = hx->kset.hashes; hp != end; i++, hp++) { + if (HASH_IS_REAL(*hp)) { + void *kptr = deconstify_pointer(hx->kset.keysi); + bool r = (*fn)(ptr_add_offset(kptr, -hx->offset), data); + n++; + if (r) { + nr++; + hash_erect_tombstone(HASH(hx), i); + hx->stamp++; + } + } + } + + g_assert(n == hx->kset.items); + g_assert(nr <= hx->kset.items); + + hash_refcnt_dec(HASH(hx)); + + hx->kset.items -= nr; + + if (nr != 0) + hash_resize_as_needed(HASH(hx)); + + hash_return(HASH(hx), nr); +} + +/** + * Create a new hash set iterator. + */ +hikset_iter_t * +hikset_iter_new(const hikset_t *hx) +{ + hikset_iter_t *hxi; + + hikset_check(hx); + + WALLOC0(hxi); + hxi->magic = HIKSET_ITER_MAGIC; + + hash_synchronize(HASH(hx)); + + hxi->hx = hx; + hxi->stamp = hx->stamp; + hash_refcnt_inc(HASH(hx)); + + hash_unsynchronize(HASH(hx)); + + return hxi; +} + +/** + * Release hash set iterator. + */ +void +hikset_iter_release(hikset_iter_t **hxi_ptr) +{ + hikset_iter_t *hxi = *hxi_ptr; + + if (hxi != NULL) { + hikset_iter_check(hxi); + + hash_synchronize(HASH(hxi->hx)); + + hash_refcnt_dec(HASH(hxi->hx)); + if (hxi->deleted && 0 == hxi->hx->refcnt) + hash_resize_as_needed(HASH(hxi->hx)); + + hash_unsynchronize(HASH(hxi->hx)); + + hxi->magic = 0; + WFREE(hxi); + *hxi_ptr = NULL; + } +} + +/** + * Fetch next entry from iterator. + * + * @param hxi the hash table iterator + * @param vp where value is written, if non-NULL + * + * @return TRUE if a new entry exists, FALSE otherwise. + */ +bool +hikset_iter_next(hikset_iter_t *hxi, void **vp) +{ + const hikset_t *hx; + + hikset_iter_check(hxi); + + hx = hxi->hx; + hash_synchronize(HASH(hx)); + + while (hxi->pos < hx->kset.size && !HASH_IS_REAL(hx->kset.hasheshxi->pos)) + hxi->pos++; + + if (hxi->pos >= hx->kset.size) + hash_return(HASH(hx), FALSE); + + if (vp != NULL) { + void *kptr = deconstify_pointer(hx->kset.keyshxi->pos); + *vp = ptr_add_offset(kptr, -hx->offset); + } + + hash_unsynchronize(HASH(hx)); + + hxi->pos++; + return TRUE; +} + +/** + * Remove current iterator item, returned by hikset_iter_next(). + */ +void +hikset_iter_remove(hikset_iter_t *hxi) +{ + hikset_t *hx; + size_t idx; + + hikset_iter_check(hxi); + g_assert(size_is_positive(hxi->pos)); /* Called _next() once */ + g_assert(hxi->pos <= hxi->hx->kset.size); + + hx = deconstify_pointer(hxi->hx); + hash_synchronize(HASH(hx)); + + idx = hxi->pos - 1; /* Current item */ + if (hash_erect_tombstone(HASH(hx), idx)) + hx->kset.items--; + + hash_unsynchronize(HASH(hx)); + + hxi->deleted = TRUE; +} + +/** + * Polymorphic operations. + */ +static const struct hash_ops hikset_ops = { + hikset_values_set, /* set_values */ + hikset_values_get, /* get_values */ + hikset_hash_free, /* hash_free */ +}; + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/hikset.h
Added
@@ -0,0 +1,105 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Hash sets with internal key pointers within values. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _hikset_h_ +#define _hikset_h_ + +#include "hash.h" + +struct hikset; +typedef struct hikset hikset_t; + +struct hikset_iter; +typedef struct hikset_iter hikset_iter_t; + +/** + * Cast set to a polmorphic hash const. + */ +static inline ALWAYS_INLINE const struct hash * +hikset_cast_to_const_hash(const struct hikset *hx) +{ + return (const struct hash *) hx; +} + +/** + * Cast set to a polmorphic hash. + */ +static inline ALWAYS_INLINE struct hash * +hikset_cast_to_hash(const struct hikset *hx) +{ + return (struct hash *) hx; +} + +/** + * Cast pointer to set to a pointer to a polmorphic hash. + */ +static inline ALWAYS_INLINE struct hash ** +hikset_ptr_cast_to_hash(struct hikset * const *hx) +{ + return (struct hash **) hx; +} + +/* + * Public interface. + */ + +hikset_t *hikset_create(size_t offset, enum hash_key_type ktype, size_t ksize); +hikset_t *hikset_create_real(size_t offset, + enum hash_key_type ktype, size_t keysize); +hikset_t *hikset_create_any(size_t offset, hash_fn_t primary, eq_fn_t eq); +hikset_t *hikset_create_any_real(size_t offset, hash_fn_t primary, eq_fn_t eq); +void hikset_free_null(hikset_t **); +void hikset_clear(hikset_t *); +void hikset_thread_safe(hikset_t *); +void hikset_lock(hikset_t *); +void hikset_unlock(hikset_t *); + +bool hikset_contains(const hikset_t *, const void *key); +void hikset_insert_key(hikset_t *hik, const void *keyptr); +void hikset_insert(hikset_t *, const void *value); +void *hikset_lookup(const hikset_t *, const void *key); +bool hikset_lookup_extended(const hikset_t *, const void *key, void **valptr); +void *hikset_random(const hikset_t *); +bool hikset_remove(hikset_t *, const void *key); +size_t hikset_count(const hikset_t *); +void hikset_foreach(const hikset_t *, data_fn_t fn, void *data); +size_t hikset_foreach_remove(hikset_t *, data_rm_fn_t, void *); + +hikset_iter_t *hikset_iter_new(const hikset_t *); +void hikset_iter_release(hikset_iter_t **); +bool hikset_iter_next(hikset_iter_t *, void **kp); +void hikset_iter_remove(hikset_iter_t *); + +#endif /* _hikset_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/host_addr.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/host_addr.c
Changed
@@ -46,13 +46,17 @@ #include <netdb.h> /* For gethostbyname() */ #endif /* I_NETDB */ -#include "ascii.h" -#include "atoms.h" /* For binary_hash */ #include "host_addr.h" + +#include "ascii.h" +#include "buf.h" #include "concat.h" #include "endian.h" #include "glib-missing.h" /* For g_strlcpy() */ +#include "hashing.h" /* For binary_hash() */ +#include "hset.h" #include "parse.h" +#include "pslist.h" #include "random.h" #include "stringify.h" #include "walloc.h" @@ -60,6 +64,171 @@ #include "override.h" /* Must be the last header included */ /** + * Hashing of host_addr_t. + */ +unsigned +host_addr_hash(host_addr_t ha) +{ + switch (ha.net) { + case NET_TYPE_IPV6: + { + host_addr_t ha_ipv4; + + if (!host_addr_convert(ha, &ha_ipv4, NET_TYPE_IPV4)) + return binary_hash(&ha.addr.ipv60, sizeof ha.addr.ipv6); + ha = ha_ipv4; + } + /* FALL THROUGH */ + case NET_TYPE_IPV4: + return ha.net ^ integer_hash_fast(host_addr_ipv4(ha)); + case NET_TYPE_LOCAL: + case NET_TYPE_NONE: + return ha.net; + } + g_assert_not_reached(); + return (unsigned) -1; +} + +/** + * Alternate hashing of host_addr_t. + */ +unsigned +host_addr_hash2(host_addr_t ha) +{ + switch (ha.net) { + case NET_TYPE_IPV6: + { + host_addr_t ha_ipv4; + + if (!host_addr_convert(ha, &ha_ipv4, NET_TYPE_IPV4)) + return binary_hash2(&ha.addr.ipv60, sizeof ha.addr.ipv6); + ha = ha_ipv4; + } + /* FALL THROUGH */ + case NET_TYPE_IPV4: + return ha.net ^ integer_hash2(host_addr_ipv4(ha)); + case NET_TYPE_LOCAL: + case NET_TYPE_NONE: + return ha.net; + } + g_assert_not_reached(); + return (unsigned) -1; +} + +/** + * Hashing of host_addr_t + port. + */ +unsigned +host_addr_port_hash(host_addr_t ha, uint16 port) +{ + switch (ha.net) { + case NET_TYPE_IPV6: + { + host_addr_t ha_ipv4; + + if (!host_addr_convert(ha, &ha_ipv4, NET_TYPE_IPV4)) + return binary_hash(&ha.addr.ipv60, sizeof ha.addr.ipv6); + ha = ha_ipv4; + } + /* FALL THROUGH */ + case NET_TYPE_IPV4: + return hashing_mix32( + ha.net + integer_hash_fast(host_addr_ipv4(ha)) + u16_hash(port)); + case NET_TYPE_LOCAL: + case NET_TYPE_NONE: + return hashing_mix32(ha.net + u16_hash(port)); + } + g_assert_not_reached(); + return (unsigned) -1; +} + +/** + * Alternate hashing of host_addr_t + port. + */ +unsigned +host_addr_port_hash2(host_addr_t ha, uint16 port) +{ + switch (ha.net) { + case NET_TYPE_IPV6: + { + host_addr_t ha_ipv4; + + if (!host_addr_convert(ha, &ha_ipv4, NET_TYPE_IPV4)) + return binary_hash2(&ha.addr.ipv60, sizeof ha.addr.ipv6); + ha = ha_ipv4; + } + /* FALL THROUGH */ + case NET_TYPE_IPV4: + return ha.net + integer_hash2(host_addr_ipv4(ha)) + u16_hash2(port); + case NET_TYPE_LOCAL: + case NET_TYPE_NONE: + return ha.net + u16_hash2(port); + } + g_assert_not_reached(); + return (unsigned) -1; +} + +/** + * Check whether hosts are equal. + */ +bool +host_addr_equal(const host_addr_t a, const host_addr_t b) +{ + if (a.net == b.net) { + switch (a.net) { + case NET_TYPE_IPV4: + return host_addr_ipv4(a) == host_addr_ipv4(b); + case NET_TYPE_IPV6: + return 0 == memcmp(a.addr.ipv6, b.addr.ipv6, sizeof a.addr.ipv6); + case NET_TYPE_LOCAL: + case NET_TYPE_NONE: + return TRUE; + } + g_assert_not_reached(); + } + return FALSE; +} + +/** + * Check whether hosts are "equivalent", modulo conversion to IPv4 for IPv6. + * + * @attention + * This routine CANNOT be used directly or indirectly as a comparison function + * for hash tables because it's not possible to have two items being "equal" + * that do not hash to the same value! For hash tables, use host_addr_equal() + * which tests true equality. + */ +bool +host_addr_equiv(const host_addr_t a, const host_addr_t b) +{ + if (a.net == b.net) { + switch (a.net) { + case NET_TYPE_IPV4: + return host_addr_ipv4(a) == host_addr_ipv4(b); + case NET_TYPE_IPV6: + if (0 != memcmp(a.addr.ipv6, b.addr.ipv6, sizeof a.addr.ipv6)) { + host_addr_t a_ipv4, b_ipv4; + + return host_addr_convert(a, &a_ipv4, NET_TYPE_IPV4) && + host_addr_convert(b, &b_ipv4, NET_TYPE_IPV4) && + host_addr_ipv4(a_ipv4) == host_addr_ipv4(b_ipv4); + } + return TRUE; + + case NET_TYPE_LOCAL: + case NET_TYPE_NONE: + return TRUE; + } + g_assert_not_reached(); + } else { + host_addr_t to; + + return host_addr_convert(a, &to, b.net) && host_addr_equiv(to, b); + } + return FALSE; +} + +/** * @param ha An initialized host address. * @return The proper AF_* value or -1 if not available. */ @@ -67,8 +236,8 @@ host_addr_family(const host_addr_t ha) { if (!host_addr_initialized(ha)) { - g_error("host_addr_family(): ha.net=%u", (guint8) ha.net); - } + g_error("host_addr_family(): ha.net=%u", (uint8) ha.net); + } switch (ha.net) { case NET_TYPE_IPV4: return AF_INET; @@ -92,13 +261,13 @@ * * @return TRUE if is a private address. */ -gboolean +bool is_private_addr(const host_addr_t addr) { host_addr_t addr_ipv4; if (host_addr_convert(addr, &addr_ipv4, NET_TYPE_IPV4)) { - guint32 ip = host_addr_ipv4(addr_ipv4); + uint32 ip = host_addr_ipv4(addr_ipv4); /* 10.0.0.0 -- (10/8 prefix) */ if ((ip & 0xff000000) == 0xa000000) @@ -121,7 +290,7 @@ case NET_TYPE_IPV4: g_assert_not_reached(); case NET_TYPE_IPV6: - return host_addr_equal(addr, ipv6_loopback) || + return host_addr_equiv(addr, ipv6_loopback) || host_addr_matches(addr, ipv6_link_local, 10) || host_addr_matches(addr, ipv6_site_local, 10); case NET_TYPE_LOCAL: @@ -133,11 +302,11 @@ return FALSE; } -static inline gboolean -ipv4_addr_is_routable(guint32 ip) +static inline bool +ipv4_addr_is_routable(uint32 ip) { static const struct { - const guint32 addr, mask; + const uint32 addr, mask; } net = { { 0x00000000UL, 0xff000000UL }, /* 0.0.0.0/8 "This" Network */ { 0xe0000000UL, 0xe0000000UL }, /* 224.0.0.0/4 Multicast + Reserved */ @@ -146,9 +315,9 @@ { 0xc0586300UL, 0xffffff00UL }, /* 192.88.99.0/24 6to4 RFC 3068 */ { 0xc6120000UL, 0xfffe0000UL }, /* 198.18.0.0/15 RFC 2544 */ }; - guint i; + uint i; - for (i = 0; i < G_N_ELEMENTS(net); i++) { + for (i = 0; i < N_ITEMS(net); i++) { if ((ip & neti.mask) == neti.addr) return FALSE; } @@ -156,31 +325,31 @@ return TRUE; } -static inline gboolean +static inline bool host_addr_is_6to4(const host_addr_t ha) { return host_addr_is_ipv6(ha) && 0x2002 == peek_be16(&ha.addr.ipv60); } -static inline gboolean +static inline bool host_addr_is_teredo(const host_addr_t ha) { return host_addr_is_ipv6(ha) && 0x20010000UL == peek_be32(&ha.addr.ipv60); } -static inline guint32 +static inline uint32 host_addr_6to4_client_ipv4(const host_addr_t ha) { return peek_be32(&ha.addr.ipv62); /* 2002:AABBCCDD::/48 */ } -static inline guint32 +static inline uint32 host_addr_teredo_client_ipv4(const host_addr_t ha) { return ~peek_be32(&ha.addr.ipv612); /* 2001::~A~B~C~D */ } -gboolean +bool host_addr_6to4_client(const host_addr_t from, host_addr_t *to) { if (host_addr_is_6to4(from)) { @@ -196,7 +365,7 @@ } } -gboolean +bool host_addr_teredo_client(const host_addr_t from, host_addr_t *to) { if (host_addr_is_teredo(from)) { @@ -212,19 +381,19 @@ } } -static gboolean +static bool host_addr_is_tunneled(const host_addr_t ha) { return host_addr_is_teredo(ha) || host_addr_is_6to4(ha); } -gboolean +bool host_addr_tunnel_client(const host_addr_t from, host_addr_t *to) { return host_addr_teredo_client(from, to) || host_addr_6to4_client(from, to); } -guint32 +uint32 host_addr_tunnel_client_ipv4(const host_addr_t from) { host_addr_t to; @@ -235,20 +404,20 @@ /** * Checks whether the given address is 127.0.0.1 or ::1. */ -gboolean +bool host_addr_is_loopback(const host_addr_t addr) { host_addr_t ha; - + if (!host_addr_convert(addr, &ha, NET_TYPE_IPV4)) ha = addr; - + switch (host_addr_net(ha)) { case NET_TYPE_IPV4: return host_addr_ipv4(ha) == 0x7f000001; /* 127.0.0.1 in host endian */ case NET_TYPE_IPV6: - return host_addr_equal(ha, ipv6_loopback); + return host_addr_equiv(ha, ipv6_loopback); case NET_TYPE_LOCAL: case NET_TYPE_NONE: @@ -262,7 +431,7 @@ /** * Checks whether the given address is unspecified (all zeroes). */ -gboolean +bool host_addr_is_unspecified(const host_addr_t addr) { switch (host_addr_net(addr)) { @@ -270,7 +439,7 @@ return host_addr_ipv4(addr) == 0; case NET_TYPE_IPV6: - return host_addr_equal(addr, ipv6_unspecified); + return host_addr_equiv(addr, ipv6_unspecified); case NET_TYPE_LOCAL: case NET_TYPE_NONE: @@ -285,7 +454,7 @@ * Check whether host can be reached from the Internet. * We rule out IPs of private networks, plus some other invalid combinations. */ -gboolean +bool host_addr_is_routable(const host_addr_t addr) { host_addr_t ha; @@ -319,7 +488,7 @@ return FALSE; } -gboolean +bool host_addr_can_convert(const host_addr_t from, enum net_type to_net) { if (from.net == to_net) @@ -364,10 +533,10 @@ * @param from The address to convert. * @param to Will hold the converted address. * @param to_net The network type to convert the address to. - * + * * @return TRUE if the address could be converted, FALSE otherwise. */ -gboolean +bool host_addr_convert(const host_addr_t from, host_addr_t *to, enum net_type to_net) { @@ -453,12 +622,13 @@ const char * host_addr_to_string(const host_addr_t ha) { - static char bufHOST_ADDR_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, HOST_ADDR_BUFLEN); + char *p = buf_data(b); + size_t len, n = buf_size(b); - n = host_addr_to_string_buf(ha, buf, sizeof buf); - g_assert(n < sizeof buf); - return buf; + len = host_addr_to_string_buf(ha, p, n); + g_assert(len < n); + return p; } /** @@ -467,12 +637,13 @@ const char * host_addr_to_string2(const host_addr_t ha) { - static char bufHOST_ADDR_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, HOST_ADDR_BUFLEN); + char *p = buf_data(b); + size_t len, n = buf_size(b); - n = host_addr_to_string_buf(ha, buf, sizeof buf); - g_assert(n < sizeof buf); - return buf; + len = host_addr_to_string_buf(ha, p, n); + g_assert(len < n); + return p; } /** @@ -488,7 +659,7 @@ * @return The length of the resulting string assuming ``size'' is sufficient. */ size_t -host_addr_port_to_string_buf(const host_addr_t ha, guint16 port, +host_addr_port_to_string_buf(const host_addr_t ha, uint16 port, char *dst, size_t size) { char host_bufHOST_ADDR_BUFLEN; @@ -501,10 +672,10 @@ switch (host_addr_net(ha)) { case NET_TYPE_IPV6: n = concat_strings(dst, size, "", host_buf, ":", - port_buf, (void *) 0); + port_buf, NULL_PTR); break; case NET_TYPE_IPV4: - n = concat_strings(dst, size, host_buf, ":", port_buf, (void *) 0); + n = concat_strings(dst, size, host_buf, ":", port_buf, NULL_PTR); break; default: n = g_strlcpy(dst, host_buf, size); @@ -514,7 +685,7 @@ } /** - * Prints the host address ``ha'' followed by ``port'' to a static buffer. + * Prints the host address ``ha'' followed by ``port'' to a static buffer. * * @param ha the host address. * @param port the port number. @@ -523,25 +694,27 @@ * representing the given host address and port. */ const char * -host_addr_port_to_string(const host_addr_t ha, guint16 port) +host_addr_port_to_string(const host_addr_t ha, uint16 port) { - static char bufHOST_ADDR_PORT_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, HOST_ADDR_PORT_BUFLEN); + char *p = buf_data(b); + size_t len, n = buf_size(b); - n = host_addr_port_to_string_buf(ha, port, buf, sizeof buf); - g_assert(n < sizeof buf); - return buf; + len = host_addr_port_to_string_buf(ha, port, p, n); + g_assert(len < n); + return p; } const char * -host_addr_port_to_string2(const host_addr_t ha, guint16 port) +host_addr_port_to_string2(const host_addr_t ha, uint16 port) { - static char bufHOST_ADDR_PORT_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, HOST_ADDR_PORT_BUFLEN); + char *p = buf_data(b); + size_t len, n = buf_size(b); - n = host_addr_port_to_string_buf(ha, port, buf, sizeof buf); - g_assert(n < sizeof buf); - return buf; + len = host_addr_port_to_string_buf(ha, port, p, n); + g_assert(len < n); + return p; } /** @@ -557,7 +730,7 @@ * @return The length of the resulting string assuming ``size'' is sufficient. */ size_t -host_port_addr_to_string_buf(guint16 port, const host_addr_t ha, +host_port_addr_to_string_buf(uint16 port, const host_addr_t ha, char *dst, size_t size) { char port_bufUINT32_DEC_BUFLEN; @@ -569,11 +742,10 @@ switch (host_addr_net(ha)) { case NET_TYPE_IPV6: - n = concat_strings(dst, size, port_buf, ":", host_buf, "", - (void *) 0); + n = concat_strings(dst, size, port_buf, ":", host_buf, "", NULL_PTR); break; case NET_TYPE_IPV4: - n = concat_strings(dst, size, port_buf, ":", host_buf, (void *) 0); + n = concat_strings(dst, size, port_buf, ":", host_buf, NULL_PTR); break; default: n = g_strlcpy(dst, host_buf, size); @@ -583,7 +755,7 @@ } /** - * Prints the host address ``ha'' followed by ``port'' to a static buffer. + * Prints the host address ``ha'' followed by ``port'' to a static buffer. * * @param ha the host address. * @param port the port number. @@ -592,30 +764,32 @@ * representing the given host address and port. */ const char * -port_host_addr_to_string(guint16 port, const host_addr_t ha) +port_host_addr_to_string(uint16 port, const host_addr_t ha) { - static char bufHOST_ADDR_PORT_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, HOST_ADDR_PORT_BUFLEN); + char *p = buf_data(b); + size_t len, n = buf_size(b); - n = host_port_addr_to_string_buf(port, ha, buf, sizeof buf); - g_assert(n < sizeof buf); - return buf; + len = host_port_addr_to_string_buf(port, ha, p, n); + g_assert(len < n); + return p; } const char * -host_port_to_string(const char *hostname, host_addr_t addr, guint16 port) +host_port_to_string(const char *hostname, host_addr_t addr, uint16 port) { - static char bufMAX_HOSTLEN + 32; + buf_t *b = buf_private(G_STRFUNC, MAX_HOSTLEN + HOST_ADDR_PORT_BUFLEN); + char *p = buf_data(b); - if (hostname) { + if (hostname != NULL) { char port_bufUINT32_DEC_BUFLEN; uint32_to_string_buf(port, port_buf, sizeof port_buf); - concat_strings(buf, sizeof buf, hostname, ":", port_buf, (void *) 0); + concat_strings(p, buf_size(b), hostname, ":", port_buf, NULL_PTR); } else { - host_addr_port_to_string_buf(addr, port, buf, sizeof buf); + host_addr_port_to_string_buf(addr, port, p, buf_size(b)); } - return buf; + return p; } /** @@ -634,11 +808,11 @@ * ``zero_host_addr'' on failure. * @return Returns TRUE on success; otherwise FALSE. */ -gboolean +bool string_to_host_addr(const char *s, const char **endptr, host_addr_t *addr_ptr) { - guint32 ip; - gboolean brackets = FALSE; + uint32 ip; + bool brackets = FALSE; g_assert(s); @@ -653,9 +827,9 @@ } return TRUE; } else { - guint8 ipv616; + uint8 ipv616; const char *end; - gboolean ok; + bool ok; ok = parse_ipv6_addr(s, ipv6, &end); if (ok) { @@ -699,7 +873,7 @@ * @return TRUE if the string points to host address or is a possible * hostname. */ -gboolean +bool string_to_host_or_addr(const char *s, const char **endptr, host_addr_t *ha) { const char *ep; @@ -739,14 +913,14 @@ * @return TRUE if we parsed the string correctly, FALSE if it did not * look like a valid "IP:port" string. */ -gboolean +bool string_to_host_addr_port(const char *str, const char **endptr, - host_addr_t *addr_ptr, guint16 *port_ptr) + host_addr_t *addr_ptr, uint16 *port_ptr) { const char *ep; host_addr_t addr; - gboolean ret; - guint16 port; + bool ret; + uint16 port; ret = string_to_host_or_addr(str, &ep, &addr); if (ret && ':' == *ep && is_host_addr(addr)) { @@ -782,14 +956,14 @@ * @return TRUE if we parsed the string correctly, FALSE if it did not * look like a valid "port:IP" string. */ -gboolean +bool string_to_port_host_addr(const char *str, const char **endptr, - guint16 *port_ptr, host_addr_t *addr_ptr) + uint16 *port_ptr, host_addr_t *addr_ptr) { const char *ep; host_addr_t addr; - gboolean ret; - guint16 port; + bool ret; + uint16 port; int error; port = parse_uint16(str, &ep, 10, &error); @@ -811,6 +985,7 @@ return ret; } +#ifndef HAS_GETNAMEINFO static void gethostbyname_error(const char *host) { @@ -823,6 +998,7 @@ g_warning("cannot resolve \"%s\": gethostbyname() failed!", host); #endif /* defined(HAS_HSTRERROR) */ } +#endif /* !HAS_GETNAMEINFO */ /** * Initializes sa_ptr from a host address and a port number. @@ -834,7 +1010,7 @@ * @return The length of the initialized structure. */ socklen_t -socket_addr_set(socket_addr_t *sa_ptr, const host_addr_t addr, guint16 port) +socket_addr_set(socket_addr_t *sa_ptr, const host_addr_t addr, uint16 port) { switch (host_addr_net(addr)) { case NET_TYPE_IPV4: @@ -903,11 +1079,11 @@ struct sockaddr_in sin4; socklen_t len; host_addr_t addr = zero_host_addr; - guint16 port = 0; - gboolean success = FALSE; + uint16 port = 0; + bool success = FALSE; len = sizeof sin4; - if (-1 != getsockname(fd, cast_to_gpointer(&sin4), &len)) { + if (-1 != getsockname(fd, cast_to_pointer(&sin4), &len)) { addr = host_addr_peek_ipv4(&sin4.sin_addr.s_addr); port = ntohs(sin4.sin_port); success = TRUE; @@ -918,7 +1094,7 @@ struct sockaddr_in6 sin6; len = sizeof sin6; - if (-1 != getsockname(fd, cast_to_gpointer(&sin6), &len)) { + if (-1 != getsockname(fd, cast_to_pointer(&sin6), &len)) { addr = host_addr_peek_ipv6(sin6.sin6_addr.s6_addr); port = ntohs(sin6.sin6_port); success = TRUE; @@ -967,6 +1143,54 @@ } /** + * Mask out given address, clearing the trailing v4 or v6 bits, depending + * on the address type. + * + * @param addr the address to mask out + * @param v4 amount of trailing bits to mask out for IPv4 address + * @param v6 amount of trailing bits to mask out for IPv6 address + * + * @return masked out address, possibly converted from IPv6 to IPv4. + */ +host_addr_t +host_addr_mask_net(host_addr_t addr, int v4, int v6) +{ + host_addr_t masked = addr; + + g_assert(v4 >= 0 && v4 <= 32); + g_assert(v6 >= 0 && v6 <= 128); + + if (host_addr_can_convert(addr, NET_TYPE_IPV4)) + (void) host_addr_convert(addr, &masked, NET_TYPE_IPV4); + + switch (host_addr_net(addr)) { + case NET_TYPE_IPV4: + if (32 == v4) + masked.addr.ipv4 = 0; + else + masked.addr.ipv4 &= ~((1U << v4) - 1); + break; + case NET_TYPE_IPV6: + { + int bytes = v6 / 8; /* Amount of trailing bytes to clear */ + int bits = v6 % 8; /* Trailing bits in upper byte */ + int i; + + for (i = 0; i < bytes; i++) { + masked.addr.ipv615 - i = 0; + } + masked.addr.ipv615 - bytes &= ~((1U << bits) - 1); + } + break; + case NET_TYPE_LOCAL: + case NET_TYPE_NONE: + break; + } + + return masked; +} + +/** * Resolves an IP address to a hostname per DNS. * * @param ha The host address to resolve. @@ -1050,7 +1274,7 @@ if (ai->ai_addrlen >= 4) { const struct sockaddr_in *sin4; - sin4 = cast_to_gconstpointer(ai->ai_addr); + sin4 = cast_to_constpointer(ai->ai_addr); addr = host_addr_peek_ipv4(&sin4->sin_addr.s_addr); } break; @@ -1060,8 +1284,8 @@ if (ai->ai_addrlen >= 16) { const struct sockaddr_in6 *sin6; - sin6 = cast_to_gconstpointer(ai->ai_addr); - addr = host_addr_peek_ipv6(cast_to_gconstpointer( + sin6 = cast_to_constpointer(ai->ai_addr); + addr = host_addr_peek_ipv6(cast_to_constpointer( sin6->sin6_addr.s6_addr)); } break; @@ -1072,18 +1296,18 @@ } #endif /* HAS_GETADDRINFO */ -static GSList * +static pslist_t * resolve_hostname(const char *host, enum net_type net) #ifdef HAS_GETADDRINFO { static const struct addrinfo zero_hints; struct addrinfo hints, *ai, *ai0 = NULL; - GHashTable *ht; - GSList *sl_addr; + hset_t *hs; + pslist_t *sl_addr; int error; g_assert(host); - + hints = zero_hints; hints.ai_family = net_type_to_pf(net); @@ -1095,7 +1319,7 @@ } sl_addr = NULL; - ht = g_hash_table_new(host_addr_hash_func, host_addr_eq_func); + hs = hset_create_any(host_addr_hash_func, NULL, host_addr_eq_func); for (ai = ai0; ai; ai = ai->ai_next) { host_addr_t addr; @@ -1104,26 +1328,26 @@ addr = addrinfo_to_addr(ai); - if (is_host_addr(addr) && !g_hash_table_lookup(ht, &addr)) { + if (is_host_addr(addr) && !hset_contains(hs, &addr)) { host_addr_t *addr_copy; addr_copy = wcopy(&addr, sizeof addr); - sl_addr = g_slist_prepend(sl_addr, addr_copy); - g_hash_table_insert(ht, addr_copy, GINT_TO_POINTER(1)); + sl_addr = pslist_prepend(sl_addr, addr_copy); + hset_insert(hs, addr_copy); } } - g_hash_table_destroy(ht); + hset_free_null(&hs); if (ai0) freeaddrinfo(ai0); - return g_slist_reverse(sl_addr); + return pslist_reverse(sl_addr); } #else /* !HAS_GETADDRINFO */ { const struct hostent *he; - GHashTable *ht; - GSList *sl_addr; + hset_t *hs; + pslist_t *sl_addr; int af; size_t i; @@ -1143,28 +1367,28 @@ switch (he->h_addrtype) { case AF_INET: if (4 != he->h_length) { - g_warning("host_to_addr: Wrong length of IPv4 address (\"%s\")", - host); + g_warning("%s(): wrong length %d for IPv4 address \"%s\"", + G_STRFUNC, he->h_length, host); return NULL; } break; - + #ifdef HAS_IPV6 case AF_INET6: if (16 != he->h_length) { - g_warning("host_to_addr: Wrong length of IPv6 address (\"%s\")", - host); + g_warning("%s(): wrong length %d for IPv6 address \"%s\"", + G_STRFUNC, he->h_length, host); return NULL; } break; #endif /* HAS_IPV6 */ - + default: return NULL; } - + sl_addr = NULL; - ht = g_hash_table_new(host_addr_hash_func, host_addr_eq_func); + hs = hset_create_any(host_addr_hash_func, NULL, host_addr_eq_func); for (i = 0; NULL != he->h_addr_listi; i++) { host_addr_t addr; @@ -1176,47 +1400,46 @@ #ifdef HAS_IPV6 case AF_INET6: addr = host_addr_peek_ipv6( - cast_to_gconstpointer(he->h_addr_listi)); + cast_to_constpointer(he->h_addr_listi)); break; #endif /* !HAS_IPV6 */ default: g_assert_not_reached(); } - if (is_host_addr(addr) && !g_hash_table_lookup(ht, &addr)) { + if (is_host_addr(addr) && !hset_contains(hs, &addr)) { host_addr_t *addr_copy; addr_copy = wcopy(&addr, sizeof addr); - sl_addr = g_slist_prepend(sl_addr, addr_copy); - g_hash_table_insert(ht, addr_copy, GINT_TO_POINTER(1)); + sl_addr = pslist_prepend(sl_addr, addr_copy); + hset_insert(hs, addr_copy); } } - g_hash_table_destroy(ht); + hset_free_null(&hs); - return g_slist_reverse(sl_addr); + return pslist_reverse(sl_addr); } #endif /* HAS_GETADDRINFO */ /** * Resolves a hostname to IP addresses per DNS. * - * @todo TODO: This should return all resolved address not just the first - * and it should be possible to request only IPv4 or IPv6 - * addresses. + * This returns a list of IP addresses (containing "host_addr_t *" values) + * that must be freed by the caller using host_addr_free_list(). * - * @param host A NUL-terminated string holding the hostname to resolve. - * @param net Use NET_TYPE_IPV4 if you want only IPv4 addresses or like-wise - NET_TYPE_IPV6. If you don't care, use NET_TYPE_NONE. - * @return On success, a single-linked list of walloc()ated host_addr_t - * items is returned. Use host_addr_free_list() for convience. - * On failure, NULL is returned. + * @param host A NUL-terminated string holding the hostname to resolve. + * @param net Use NET_TYPE_IPV4 if you want only IPv4 addresses or like-wise + * NET_TYPE_IPV6. If you don't care, use NET_TYPE_NONE. + * + * @return a single-linked list of walloc()ated host_addr_t on success or + * NULL on failure. */ -GSList * +pslist_t * name_to_host_addr(const char *host, enum net_type net) { const char *endptr; host_addr_t addr; - + g_assert(host); /* As far as I know, some broken implementations won't resolve numeric @@ -1226,7 +1449,7 @@ */ if (string_to_host_addr(host, &endptr, &addr) && '\0' == *endptr) { - return g_slist_append(NULL, wcopy(&addr, sizeof addr)); + return pslist_append(NULL, wcopy(&addr, sizeof addr)); } return resolve_hostname(host, net); @@ -1236,18 +1459,18 @@ * Frees a singly-linked list of host_addr_t elements. */ void -host_addr_free_list(GSList **sl_ptr) +host_addr_free_list(pslist_t **sl_ptr) { g_assert(sl_ptr); if (*sl_ptr) { - GSList *sl; + pslist_t *sl; - for (sl = *sl_ptr; NULL != sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(*sl_ptr, sl) { host_addr_t *addr_ptr = sl->data; WFREE(addr_ptr); } - gm_slist_free_null(sl_ptr); + pslist_free_null(sl_ptr); } } @@ -1259,27 +1482,20 @@ host_addr_t name_to_single_host_addr(const char *host, enum net_type net) { - GSList *sl_addr; + pslist_t *sl_addr; host_addr_t addr; - + addr = zero_host_addr; sl_addr = name_to_host_addr(host, net); if (sl_addr) { - GSList *sl; size_t i, len; + const host_addr_t *addr_ptr; - len = g_slist_length(sl_addr); - i = len > 1 ? (random_u32() % len) : 0; - - for (sl = sl_addr; NULL != sl; sl = g_slist_next(sl)) { - const host_addr_t *addr_ptr = sl->data; - - g_assert(addr_ptr); - if (0 == i--) { - addr = *addr_ptr; - break; - } - } + len = pslist_length(sl_addr); + i = len > 1 ? random_value(len - 1) : 0; + addr_ptr = pslist_nth_data(sl_addr, i); + g_assert(addr_ptr != NULL); + addr = *addr_ptr; host_addr_free_list(&sl_addr); } @@ -1287,18 +1503,25 @@ return addr; } -guint -host_addr_hash_func(gconstpointer key) +uint +host_addr_hash_func(const void *key) { const host_addr_t *addr = key; return host_addr_hash(*addr); } -gboolean -host_addr_eq_func(gconstpointer p, gconstpointer q) +uint +host_addr_hash_func2(const void *key) +{ + const host_addr_t *addr = key; + return host_addr_hash2(*addr); +} + +bool +host_addr_eq_func(const void *p, const void *q) { const host_addr_t *a = p, *b = q; - return host_addr_equal(*a, *b); + return host_addr_equiv(*a, *b); } /** @@ -1314,7 +1537,7 @@ * Aging table callback. */ void -wfree_host_addr(gpointer key, gpointer unused_data) +wfree_host_addr(void *key, void *unused_data) { (void) unused_data; wfree(key, sizeof(host_addr_t)); @@ -1324,12 +1547,12 @@ * @return A list of all IPv4 and IPv6 addresses assigned to interfaces * of the machine. */ -GSList * +pslist_t * host_addr_get_interface_addrs(const enum net_type net) #if defined(HAS_GETIFADDRS) { struct ifaddrs *ifa0, *ifa; - GSList *sl_addrs = NULL; + pslist_t *sl_addrs = NULL; if (0 != getifaddrs(&ifa0)) { return NULL; @@ -1351,14 +1574,14 @@ if (AF_INET == ifa->ifa_addr->sa_family) { const struct sockaddr_in *sin4; - - sin4 = cast_to_gconstpointer(ifa->ifa_addr); + + sin4 = cast_to_constpointer(ifa->ifa_addr); addr = host_addr_peek_ipv4(&sin4->sin_addr.s_addr); #ifdef HAS_IPV6 } else if (AF_INET6 == ifa->ifa_addr->sa_family) { const struct sockaddr_in6 *sin6; - sin6 = cast_to_gconstpointer(ifa->ifa_addr); + sin6 = cast_to_constpointer(ifa->ifa_addr); addr = host_addr_peek_ipv6(sin6->sin6_addr.s6_addr); #endif /* HAS_IPV6 */ } else { @@ -1369,12 +1592,12 @@ (NET_TYPE_NONE == net || host_addr_net(addr) == net) && is_host_addr(addr) ) { - sl_addrs = g_slist_prepend(sl_addrs, wcopy(&addr, sizeof addr)); + sl_addrs = pslist_prepend(sl_addrs, wcopy(&addr, sizeof addr)); } } freeifaddrs(ifa0); - return g_slist_reverse(sl_addrs); + return pslist_reverse(sl_addrs); } #else /* !HAS_GETIFADDRS */ { @@ -1388,18 +1611,18 @@ * host_addr_get_interface_addrs() and nullifies the given pointer. */ void -host_addr_free_interface_addrs(GSList **sl_ptr) +host_addr_free_interface_addrs(pslist_t **sl_ptr) { g_assert(sl_ptr); if (*sl_ptr) { - GSList *sl; + pslist_t *sl; - for (sl = *sl_ptr; NULL != sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(*sl_ptr, sl) { host_addr_t *addr = sl->data; g_assert(host_addr_initialized(*addr)); WFREE(addr); } - gm_slist_free_null(sl_ptr); + pslist_free_null(sl_ptr); } } @@ -1447,12 +1670,34 @@ return zero_host_addr; } -guint -packed_host_addr_size(const struct packed_host_addr paddr) +host_addr_t +packed_host_addr_unpack_ptr(const struct packed_host_addr *paddr) { - switch (paddr.net) { - case NET_TYPE_IPV4: return 5; - case NET_TYPE_IPV6: return 17; + g_assert(paddr != NULL); + + switch (paddr->net) { + case NET_TYPE_IPV4: + return host_addr_peek_ipv4(&paddr->addr0); + case NET_TYPE_IPV6: + return host_addr_peek_ipv6(paddr->addr); + case NET_TYPE_LOCAL: + return local_host_addr; + case NET_TYPE_NONE: + return zero_host_addr; + } + g_assert_not_reached(); + return zero_host_addr; +} + +/** + * Significant size of a packed host_addr (serialization size). + */ +uint +packed_host_addr_size_ptr(const struct packed_host_addr *paddr) +{ + switch (paddr->net) { + case NET_TYPE_IPV4: return 1 + 4; + case NET_TYPE_IPV6: return 1 + 16; case NET_TYPE_LOCAL: return 1; case NET_TYPE_NONE: return 1; } @@ -1460,8 +1705,14 @@ return 0; } +uint +packed_host_addr_size(const struct packed_host_addr paddr) +{ + return packed_host_addr_size_ptr(&paddr); +} + struct packed_host -host_pack(const host_addr_t addr, guint16 port) +host_pack(const host_addr_t addr, uint16 port) { struct packed_host phost; @@ -1470,17 +1721,19 @@ return phost; } -G_GNUC_HOT void +void G_HOT packed_host_unpack_addr( const struct packed_host *phost, /* MUST be a pointer */ host_addr_t *addr_ptr) { + g_assert(phost != NULL); + switch (phost->ha.net) { case NET_TYPE_IPV4: if (addr_ptr) { /* * Compiler hack alert! - * + * * Ensure generated code will NEVER try to access the whole array * since only the necessary bytes may have been allocated to hold * the packed representation! When "phost->ha.addr" causes a @@ -1524,7 +1777,7 @@ /** * Significant size of a packed host (serialization size), given by address. */ -static inline guint +static inline uint packed_host_size_ptr(const struct packed_host *phost) { switch (phost->ha.net) { @@ -1537,11 +1790,10 @@ return 0; } - /** * Significant size of a packed host (serialization size). */ -guint +uint packed_host_size(const struct packed_host phost) { return packed_host_size_ptr(&phost); @@ -1555,22 +1807,32 @@ /** * Hash a packed host buffer (variable-sized). */ -guint -packed_host_hash_func(gconstpointer key) +uint +packed_host_hash_func(const void *key) { const struct packed_host *p = key; return binary_hash(key, packed_host_size_ptr(p)); } /** + * Alternate hash for a packed host buffer (variable-sized). + */ +uint +packed_host_hash_func2(const void *key) +{ + const struct packed_host *p = key; + return binary_hash2(key, packed_host_size_ptr(p)); +} + +/** * Compare two packed host buffers (variable-sized). */ -gboolean -packed_host_eq_func(gconstpointer p, gconstpointer q) +bool +packed_host_eq_func(const void *p, const void *q) { const struct packed_host *a = p, *b = q; - guint asize = packed_host_size_ptr(a); - guint bsize = packed_host_size_ptr(b); + uint asize = packed_host_size_ptr(a); + uint bsize = packed_host_size_ptr(b); if (asize != bsize) return FALSE; @@ -1581,26 +1843,19 @@ /** * Allocate a packed_host key. */ -gpointer -walloc_packed_host(const host_addr_t addr, guint16 port) +void * +walloc_packed_host(const host_addr_t addr, uint16 port) { - struct packed_host packed; - gpointer key; - guint len; + struct packed_host packed = host_pack(addr, port); - packed = host_pack(addr, port); - len = packed_host_size_ptr(&packed); - key = walloc(len); - memcpy(key, &packed, len); - - return key; + return wcopy(&packed, packed_host_size_ptr(&packed)); } /** * Release packed_host key. */ void -wfree_packed_host(gpointer key, gpointer unused_data) +wfree_packed_host(void *key, void *unused_data) { const struct packed_host *p = key; @@ -1609,4 +1864,79 @@ wfree(key, packed_host_size_ptr(p)); } +/*** + *** The following routines are meant to be used for hash tables indexed + *** by packed_host_addr structures, which are variable-sized entities. + ***/ + +/** + * Hash a packed host_addr buffer (variable-sized). + */ +uint +packed_host_addr_hash(const void *key) +{ + const struct packed_host_addr *p = key; + return binary_hash(key, packed_host_addr_size_ptr(p)); +} + +/** + * Alternate hash for a packed host_addr buffer (variable-sized). + */ +uint +packed_host_addr_hash2(const void *key) +{ + const struct packed_host_addr *p = key; + return binary_hash2(key, packed_host_addr_size_ptr(p)); +} + +/** + * Compare two packed host_addr buffers (variable-sized). + */ +bool +packed_host_addr_equal(const void *p, const void *q) +{ + const struct packed_host_addr *a = p, *b = q; + uint asize = packed_host_addr_size_ptr(a); + uint bsize = packed_host_addr_size_ptr(b); + + if (asize != bsize) + return FALSE; + + return 0 == memcmp(a, b, asize); +} + +/** + * Allocate a packed_host_addr object from a host address. + */ +void * +walloc_packed_host_addr(const host_addr_t addr) +{ + struct packed_host_addr packed = host_addr_pack(addr); + + return wcopy(&packed, packed_host_addr_size_ptr(&packed)); +} + +/** + * Allocate a packed_host_addr object from a host address pointer. + */ +void * +walloc_packed_host_addr_ptr(const void *paddr) +{ + const host_addr_t *addr = paddr; + struct packed_host_addr packed = host_addr_pack(*addr); + + return wcopy(&packed, packed_host_addr_size_ptr(&packed)); +} + +/** + * Release packed_host_addr allocated via walloc_packed_host_addr(). + */ +void +wfree_packed_host_addr(void *pha) +{ + const struct packed_host_addr *p = pha; + + wfree(pha, packed_host_addr_size_ptr(p)); +} + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/host_addr.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/host_addr.h
Changed
@@ -95,10 +95,10 @@ * of which type it is. */ typedef struct host_addr { - guint32 net; /**< The address network type */ + uint32 net; /**< The address network type */ union { - guint8 ipv616; /**< This is valid if "net == NET_TYPE_IPV6" */ - guint32 ipv4; /**< @attention: Always in host byte order! */ + uint8 ipv616; /**< This is valid if "net == NET_TYPE_IPV6" */ + uint32 ipv4; /**< @attention: Always in host byte order! */ } addr; } host_addr_t; @@ -106,15 +106,15 @@ * Serialized host address. */ struct packed_host_addr { - guchar net; - guchar addrsizeof ((host_addr_t *) 0)->addr; + uchar net; + uchar addrsizeof ((host_addr_t *) 0)->addr; }; /** * Serialized host (IP:port). */ struct packed_host { - guchar portsizeof (guint16); + uchar portsizeof (uint16); struct packed_host_addr ha; }; @@ -137,7 +137,7 @@ static const host_addr_t ipv4_loopback = { /* 127.0.0.1/32 */ NET_TYPE_IPV4, -#if G_BYTE_ORDER == G_BIG_ENDIAN +#if IS_BIG_ENDIAN { { 0x7f, 0x00, 0x00, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, #else { { 0x01, 0x00, 0x00, 0x7f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, @@ -208,13 +208,13 @@ return ptr_diff(&ph->ha.addr0, ph); } -gboolean host_addr_convert(const host_addr_t from, host_addr_t *to, +bool host_addr_convert(const host_addr_t from, host_addr_t *to, enum net_type to_net); -gboolean host_addr_can_convert(const host_addr_t from, enum net_type to_net); -gboolean host_addr_tunnel_client(const host_addr_t from, host_addr_t *to); +bool host_addr_can_convert(const host_addr_t from, enum net_type to_net); +bool host_addr_tunnel_client(const host_addr_t from, host_addr_t *to); -static inline gboolean +static inline bool host_addr_initialized(const host_addr_t ha) { switch (ha.net) { @@ -242,92 +242,70 @@ return NULL; } -static inline G_GNUC_CONST enum net_type +static inline G_CONST enum net_type host_addr_net(const host_addr_t ha) { return ha.net; } -static inline G_GNUC_CONST gboolean +static inline G_CONST bool host_addr_is_ipv4(const host_addr_t ha) { return NET_TYPE_IPV4 == ha.net; } -static inline G_GNUC_CONST gboolean +static inline G_CONST bool host_addr_is_ipv6(const host_addr_t ha) { return NET_TYPE_IPV6 == ha.net; } -static inline G_GNUC_CONST guint32 +static inline G_CONST uint32 host_addr_ipv4(const host_addr_t ha) { return NET_TYPE_IPV4 == ha.net ? ha.addr.ipv4 : 0; } -static inline const guint8 * +static inline const uint8 * host_addr_ipv6(const host_addr_t *ha) { return NET_TYPE_IPV6 == ha->net ? ha->addr.ipv6 : NULL; } -static inline G_GNUC_CONST host_addr_t -host_addr_get_ipv4(guint32 ip) +static inline G_CONST host_addr_t +host_addr_get_ipv4(uint32 ip) { host_addr_t ha; +#ifndef ALLOW_UNINIT_VALUES + ZERO(&ha); /* Needed for "valgrind" */ +#endif + ha.net = NET_TYPE_IPV4; ha.addr.ipv4 = ip; return ha; } -static inline G_GNUC_PURE host_addr_t +static inline G_PURE host_addr_t host_addr_peek_ipv4(const void *ipv4) { return host_addr_get_ipv4(peek_be32(ipv4)); } -static inline G_GNUC_PURE host_addr_t +static inline G_PURE host_addr_t host_addr_peek_ipv6(const void *ipv6) { host_addr_t ha; - + +#ifndef ALLOW_UNINIT_VALUES + ZERO(&ha); /* Needed for "valgrind" */ +#endif + ha.net = NET_TYPE_IPV6; memcpy(ha.addr.ipv6, ipv6, 16); return ha; } -static inline gboolean -host_addr_equal(const host_addr_t a, const host_addr_t b) -{ - if (a.net == b.net) { - switch (a.net) { - case NET_TYPE_IPV4: - return host_addr_ipv4(a) == host_addr_ipv4(b); - case NET_TYPE_IPV6: - if (0 != memcmp(a.addr.ipv6, b.addr.ipv6, sizeof a.addr.ipv6)) { - host_addr_t a_ipv4, b_ipv4; - - return host_addr_convert(a, &a_ipv4, NET_TYPE_IPV4) && - host_addr_convert(b, &b_ipv4, NET_TYPE_IPV4) && - host_addr_ipv4(a_ipv4) == host_addr_ipv4(b_ipv4); - } - return TRUE; - - case NET_TYPE_LOCAL: - case NET_TYPE_NONE: - return TRUE; - } - g_assert_not_reached(); - } else { - host_addr_t to; - - return host_addr_convert(a, &to, b.net) && host_addr_equal(to, b); - } - return FALSE; -} - static inline int host_addr_cmp(host_addr_t a, host_addr_t b) { @@ -347,9 +325,9 @@ return CMP(host_addr_ipv4(a), host_addr_ipv4(b)); case NET_TYPE_IPV6: { - guint i; + uint i; - for (i = 0; i < G_N_ELEMENTS(a.addr.ipv6); i++) { + for (i = 0; i < N_ITEMS(a.addr.ipv6); i++) { r = CMP(a.addr.ipv6i, b.addr.ipv6i); if (0 != r) break; @@ -364,11 +342,11 @@ return 0; } -static inline gboolean -host_addr_matches(const host_addr_t a, const host_addr_t b, guint8 bits) +static inline bool +host_addr_matches(const host_addr_t a, const host_addr_t b, uint8 bits) { host_addr_t to; - guint8 shift; + uint8 shift; if (!host_addr_convert(b, &to, a.net)) return FALSE; @@ -406,7 +384,7 @@ } -static inline G_GNUC_PURE gboolean +static inline G_PURE bool is_host_addr(const host_addr_t ha) { switch (host_addr_net(ha)) { @@ -423,36 +401,6 @@ return FALSE; } -static inline guint32 -host_addr_hash(host_addr_t ha) -{ - switch (ha.net) { - case NET_TYPE_IPV6: - { - host_addr_t ha_ipv4; - - if (!host_addr_convert(ha, &ha_ipv4, NET_TYPE_IPV4)) { - guint32 h = ha.net ^ ha.addr.ipv615; - guint i; - - for (i = 0; i < sizeof ha.addr.ipv6; i++) - h ^= (guint32) ha.addr.ipv6i << (i * 2); - - return h; - } - ha = ha_ipv4; - } - /* FALL THROUGH */ - case NET_TYPE_IPV4: - return ha.net ^ host_addr_ipv4(ha); - case NET_TYPE_LOCAL: - case NET_TYPE_NONE: - return ha.net; - } - g_assert_not_reached(); - return (guint32) -1; -} - /** * Retrieves the address from a socket_addr_t. * @@ -485,7 +433,7 @@ * @param addr a pointer to an initialized socket_addr_t * @return the port number in host byte order */ -static inline guint16 +static inline uint16 socket_addr_get_port(const socket_addr_t *addr) { g_assert(addr != NULL); @@ -523,10 +471,10 @@ g_assert(addr != NULL); if (AF_INET == addr->inet4.sin_family) { - return cast_to_gconstpointer(&addr->inet4); + return cast_to_constpointer(&addr->inet4); #if defined(HAS_IPV6) } else if (AF_INET6 == addr->inet6.sin6_family) { - return cast_to_gconstpointer(&addr->inet6); + return cast_to_constpointer(&addr->inet6); #endif /* HAS_IPV6 */ } @@ -556,51 +504,61 @@ } socklen_t socket_addr_set(socket_addr_t *sa_ptr, - const host_addr_t addr, guint16 port); + const host_addr_t addr, uint16 port); socklen_t socket_addr_init(socket_addr_t *sa_ptr, enum net_type net); int socket_addr_getpeername(socket_addr_t *p_addr, int fd); int socket_addr_getsockname(socket_addr_t *p_addr, int fd); -guint host_addr_hash_func(gconstpointer key); -gboolean host_addr_eq_func(gconstpointer p, gconstpointer q); +unsigned host_addr_hash(host_addr_t ha); +unsigned host_addr_hash2(host_addr_t ha); +unsigned host_addr_port_hash(host_addr_t ha, uint16 port); +unsigned host_addr_port_hash2(host_addr_t ha, uint16 port); +bool host_addr_equal(const host_addr_t a, const host_addr_t b) G_PURE; +bool host_addr_equiv(const host_addr_t a, const host_addr_t b); + +uint host_addr_hash_func(const void *key); +uint host_addr_hash_func2(const void *key); +bool host_addr_eq_func(const void *p, const void *q); void wfree_host_addr1(void *key); -void wfree_host_addr(gpointer key, gpointer unused_data); +void wfree_host_addr(void *key, void *unused_data); int host_addr_family(const host_addr_t ha); -gboolean is_private_addr(const host_addr_t addr); -gboolean host_addr_is_routable(const host_addr_t addr); -gboolean host_addr_is_loopback(const host_addr_t addr); -gboolean host_addr_is_unspecified(const host_addr_t addr); +bool is_private_addr(const host_addr_t addr); +bool host_addr_is_routable(const host_addr_t addr); +bool host_addr_is_loopback(const host_addr_t addr); +bool host_addr_is_unspecified(const host_addr_t addr); -static inline gboolean +static inline bool host_addr_is_ipv4_mapped(const host_addr_t addr) { - return host_addr_is_ipv6(addr) && + return host_addr_is_ipv6(addr) && host_addr_matches(addr, ipv6_ipv4_mapped, 96); } +host_addr_t host_addr_mask_net(host_addr_t addr, int v4, int v6); + const char *host_addr_to_string(const host_addr_t ha); const char *host_addr_to_string2(const host_addr_t ha); size_t host_addr_to_string_buf(const host_addr_t addr, char *, size_t); -gboolean string_to_host_addr(const char *s, const char **endptr, +bool string_to_host_addr(const char *s, const char **endptr, host_addr_t *addr_ptr); -const char *host_addr_port_to_string(const host_addr_t addr, guint16 port); -const char *host_addr_port_to_string2(const host_addr_t addr, guint16 port); +const char *host_addr_port_to_string(const host_addr_t addr, uint16 port); +const char *host_addr_port_to_string2(const host_addr_t addr, uint16 port); size_t host_addr_port_to_string_buf(const host_addr_t addr, - guint16 port, char *, size_t); -gboolean string_to_host_addr_port(const char *str, const char **endptr, - host_addr_t *addr_ptr, guint16 *port_ptr); -gboolean + uint16 port, char *, size_t); +bool string_to_host_addr_port(const char *str, const char **endptr, + host_addr_t *addr_ptr, uint16 *port_ptr); +bool string_to_port_host_addr(const char *str, const char **endptr, - guint16 *port_ptr, host_addr_t *addr_ptr); + uint16 *port_ptr, host_addr_t *addr_ptr); const char *host_port_to_string(const char *hostname, - host_addr_t addr, guint16 port); -const char *port_host_addr_to_string(guint16 port, const host_addr_t ha); -size_t host_port_addr_to_string_buf(guint16 port, const host_addr_t ha, + host_addr_t addr, uint16 port); +const char *port_host_addr_to_string(uint16 port, const host_addr_t ha); +size_t host_port_addr_to_string_buf(uint16 port, const host_addr_t ha, char *dst, size_t size); -GSList *name_to_host_addr(const char *host, enum net_type net); -void host_addr_free_list(GSList **sl_ptr); +struct pslist *name_to_host_addr(const char *host, enum net_type net); +void host_addr_free_list(struct pslist **sl_ptr); host_addr_t name_to_single_host_addr(const char *host, enum net_type net); #ifdef HAS_GETADDRINFO @@ -609,24 +567,34 @@ #endif const char *host_addr_to_name(const host_addr_t addr); -gboolean string_to_host_or_addr(const char *s, const char **endptr, +bool string_to_host_or_addr(const char *s, const char **endptr, host_addr_t *ha); -GSList *host_addr_get_interface_addrs(enum net_type net); -void host_addr_free_interface_addrs(GSList **sl_ptr); +struct pslist *host_addr_get_interface_addrs(enum net_type net); +void host_addr_free_interface_addrs(struct pslist **sl_ptr); -guint packed_host_addr_size(const struct packed_host_addr paddr); +uint packed_host_addr_size(const struct packed_host_addr paddr); +uint packed_host_addr_size_ptr(const struct packed_host_addr *paddr); struct packed_host_addr host_addr_pack(const host_addr_t addr); host_addr_t packed_host_addr_unpack(const struct packed_host_addr paddr); +host_addr_t packed_host_addr_unpack_ptr(const struct packed_host_addr *paddr); -guint packed_host_size(const struct packed_host paddr); -struct packed_host host_pack(const host_addr_t addr, guint16 port); +uint packed_host_size(const struct packed_host paddr); +struct packed_host host_pack(const host_addr_t addr, uint16 port); void packed_host_unpack_addr(const struct packed_host *phost, host_addr_t *addr_ptr); -guint packed_host_hash_func(gconstpointer key); -gboolean packed_host_eq_func(gconstpointer p, gconstpointer q); -gpointer walloc_packed_host(const host_addr_t addr, guint16 port); -void wfree_packed_host(gpointer key, gpointer unused_data); +uint packed_host_hash_func(const void *key); +uint packed_host_hash_func2(const void *key); +bool packed_host_eq_func(const void *p, const void *q); +void *walloc_packed_host(const host_addr_t addr, uint16 port); +void wfree_packed_host(void *key, void *unused_data); + +uint packed_host_addr_hash(const void *key); +uint packed_host_addr_hash2(const void *key); +bool packed_host_addr_equal(const void *p, const void *q); +void *walloc_packed_host_addr(const host_addr_t addr); +void *walloc_packed_host_addr_ptr(const void *paddr); +void wfree_packed_host_addr(void *pha); #endif /* _host_addr_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/html.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/html.c
Changed
@@ -87,8 +87,8 @@ struct render_context { struct html_output *output; struct html_node *root; - gboolean preformatted; - gboolean closing; + bool preformatted; + bool closing; }; static const struct render_context zero_render_context; @@ -178,26 +178,26 @@ size_t i, len; char name32; - STATIC_ASSERT(G_N_ELEMENTS(tab) == NUM_HTML_ATTR - 1); - + STATIC_ASSERT(N_ITEMS(tab) == NUM_HTML_ATTR - 1); + len = 0; for (i = 0; i < attr.size; i++) { const unsigned char c = attr.datai; - if (G_N_ELEMENTS(name) == len || !is_ascii_alpha(c)) + if (N_ITEMS(name) == len || !is_ascii_alpha(c)) break; namelen = ascii_toupper(c); len++; } - if (len > 0 && len < G_N_ELEMENTS(name)) { + if (len > 0 && len < N_ITEMS(name)) { namelen = '\0'; - for (i = 0; i < G_N_ELEMENTS(tab); i++) { + for (i = 0; i < N_ITEMS(tab); i++) { if (0 == strcmp(name, tabi.name)) return tabi.attr; } - g_warning("Unknown attribute: \"%s\"", name); + g_warning("%s(): unknown attribute: \"%s\"", G_STRFUNC, name); } return HTML_ATTR_UNKNOWN; } @@ -258,13 +258,13 @@ size_t i, len; char name32; - STATIC_ASSERT(G_N_ELEMENTS(tab) == NUM_HTML_TAG); - + STATIC_ASSERT(N_ITEMS(tab) == NUM_HTML_TAG); + len = 0; for (i = 0; i < tag.size; i++) { const unsigned char c = tag.datai; - if (G_N_ELEMENTS(name) == len) + if (N_ITEMS(name) == len) break; if (0 == len) { @@ -279,18 +279,18 @@ len++; } - if (len > 0 && len < G_N_ELEMENTS(name)) { + if (len > 0 && len < N_ITEMS(name)) { namelen = '\0'; - for (i = 0; i < G_N_ELEMENTS(tab); i++) { + for (i = 0; i < N_ITEMS(tab); i++) { if (0 == strcmp(name, tabi.name)) return tabi.tag; } - g_warning("Unknown tag: \"%s\"", name); + g_warning("%s(): unknown tag: \"%s\"", G_STRFUNC, name); } return HTML_TAG_UNKNOWN; } -gboolean +bool html_tag_is_closing(const struct array *tag) { return tag && @@ -323,7 +323,7 @@ /** <tag-name>(<space><attr><space>'='<space>'"'<value>'"')* */ - + /* skip <tag-name> */ while (i < tag->size && !is_ascii_space(tag->datai)) i++; @@ -350,7 +350,7 @@ i++; if (i < tag->size && '=' == tag->datai) { - gboolean quoted = FALSE; + bool quoted = FALSE; size_t start; i++; @@ -385,12 +385,12 @@ return value; } -not_found: +not_found: return zero_array; } static void -render_tag(struct render_context *ctx, const struct array tag) +html_render_tag(struct render_context *ctx, const struct array tag) { if (tag.size > 0) { ctx->closing = html_tag_is_closing(&tag); @@ -401,13 +401,13 @@ } } -static guint32 +static uint32 parse_named_entity(const struct array entity) { size_t i, len; char name16 + 2; - if (entity.size >= G_N_ELEMENTS(name) - 2) + if (entity.size >= N_ITEMS(name) - 2) goto error; len = 0; @@ -430,14 +430,14 @@ return -1; } -static guint32 +static uint32 parse_numeric_entity(const struct array entity) { size_t i = 0; if (i < entity.size && '#' == entity.datai) { unsigned base; - guint32 v; + uint32 v; i++; switch (entity.datai) { @@ -452,7 +452,7 @@ v = 0; while (i < entity.size) { unsigned d; - + d = hex2int_inline(entity.datai++); if (d >= base) goto error; @@ -470,8 +470,8 @@ return -1; } -static guint32 -parse_entity(const struct array entity) +static uint32 +html_parse_entity(const struct array entity) { if (entity.size > 0) { const unsigned char c = entity.data0; @@ -486,12 +486,12 @@ } static void -render_entity(struct render_context *ctx, const struct array entity) +html_render_entity(struct render_context *ctx, const struct array entity) { - guint32 c; + uint32 c; - c = parse_entity(entity); - if ((guint32)-1 == c) { + c = html_parse_entity(entity); + if ((uint32)-1 == c) { html_output_print(ctx->output, array_from_string("&")); html_output_print(ctx->output, array_init(entity.data, entity.size)); html_output_print(ctx->output, array_from_string(";")); @@ -505,11 +505,11 @@ } static void -render_text(struct render_context *ctx, const struct array text) +html_render_text(struct render_context *ctx, const struct array text) { unsigned c_len; size_t i; - gboolean whitespace = FALSE; + bool whitespace = FALSE; struct array entity, current; entity = zero_array; @@ -517,7 +517,7 @@ for (i = 0; i < text.size; i += c_len) { const unsigned char c = text.datai; - gboolean is_whitespace; + bool is_whitespace; is_whitespace = FALSE; c_len = utf8_first_byte_length_hint(c); @@ -546,14 +546,14 @@ html_output_print(ctx->output, array_from_string(" ")); } else if ('&' == c) { if (entity.data) { - render_entity(ctx, entity); + html_render_entity(ctx, entity); } entity.data = deconstify_gchar(&text.datai + c_len); entity.size = 0; continue; } else if (';' == c) { if (entity.data) { - render_entity(ctx, entity); + html_render_entity(ctx, entity); entity = zero_array; continue; } @@ -571,30 +571,41 @@ } static void -render(struct render_context *ctx) +html_render(struct render_context *ctx) { const struct html_node *node; - for (node = ctx->root; node != NULL; node = node->next) { + for (node = ctx->root; node != NULL; node = node->next) { switch (node->type) { case HTML_NODE_ROOT: break; case HTML_NODE_TAG: - render_tag(ctx, node->array); + html_render_tag(ctx, node->array); break; case HTML_NODE_TEXT: - render_text(ctx, node->array); + html_render_text(ctx, node->array); break; } } } +static void +html_free(struct html_node *root) +{ + struct html_node *node, *next; + + for (node = root; NULL != node; node = next) { + next = node->next; + html_node_free(&node); + } +} + static int -parse(struct html_output *output, const struct array array) +html_parse(struct html_output *output, const struct array array) { size_t i, line_num; const char *msg; - guint32 c; + uint32 c; unsigned c_len; struct array tag, text; struct html_node *nodes, *root; @@ -605,13 +616,13 @@ nodes = root; tag = zero_array; - text = array_init(array.data, 0); + text = array_init(array.data, 0); for (i = 0; i < array.size; i += c_len) { const char *next_ptr; c = utf8_decode(&array.datai, i - array.size); - if ((guint32)-1 == c) { + if ((uint32)-1 == c) { msg = "Invalid UTF-8 encoding"; goto error; } @@ -638,7 +649,7 @@ tag.size = 0; } break; - + case '>': if (!tag.data) { g_warning("'>' but no open tag"); @@ -659,7 +670,7 @@ nodes->next = node; nodes = node; tag = zero_array; - text = array_init(next_ptr, 0); + text = array_init(next_ptr, 0); } break; @@ -681,29 +692,22 @@ ctx = zero_render_context; ctx.output = output; ctx.root = root; - render(&ctx); - } - - { - struct html_node *node, *next; - - for (node = root; NULL != node; node = next) { - next = node->next; - html_node_free(&node); - } + html_render(&ctx); } + html_free(root); return 0; error: g_warning("line %zu: error: %s", line_num, msg); + html_free(root); return -1; } int html_load_memory(struct html_output *output, const struct array data) { - return parse(output, data); + return html_parse(output, data); } int
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/html.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/html.h
Changed
@@ -112,7 +112,7 @@ void (*tag)(struct html_output *, const struct array *)); void *html_output_get_udata(struct html_output *output); enum html_tag html_parse_tag(const struct array *tag); -gboolean html_tag_is_closing(const struct array *tag); +bool html_tag_is_closing(const struct array *tag); struct array html_get_attribute(const struct array *tag, enum html_attr attribute); void html_output_free(struct html_output **output_ptr);
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/html_entities.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/html_entities.h
Changed
@@ -7,7 +7,7 @@ */ static const struct { const char *name; - const guint16 uc; /* all listed codepoints are below 0xFFFF */ + const uint16 uc; /* all listed codepoints are below 0xFFFF */ } html_entities = { { "AElig", 0x00C6 }, { "Aacute", 0x00C1 },
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/http_range.c
Added
@@ -0,0 +1,1942 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * HTTP range handling. + * + * This organizes HTTP ranges into a data structure that can be easily iterated + * over as a sorted list of http_range_t items. + * + * But it also manages the set of HTTP ranges to be able to quickly determine + * whether a particular range is covered, how many bytes the known ranges + * cover, etc... One can efficiently add new HTTP ranges in the set, merging + * them with the existing ranges. + * + * Internally, the HTTP ranges are part of a red-black tree and also held into + * a one-way list. This makes it trivial to iterate over the list of ranges + * and efficient to query for presence of a given range. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#include "http_range.h" + +#include "ascii.h" +#include "buf.h" +#include "erbtree.h" +#include "eslist.h" +#include "misc.h" +#include "parse.h" +#include "str.h" +#include "stringify.h" +#include "walloc.h" + +#include "override.h" /* Must be the last header included */ + +#if 0 +#define HTTP_RANGE_SAFETY_ASSERT /**< Turn on costly assertion checks */ +#endif + +#if 0 +#define HTTP_RANGE_TESTING /**< Perform unit testing at startup */ +#endif + +#if 0 +#define HTTP_RANGE_DEBUGGING /**< Extra debugging */ +#endif + +#ifdef HTTP_RANGE_SAFETY_ASSERT +#define safety_assert(x) g_assert(x) +#else +#define safety_assert(x) +#endif + +#define http_range_debugging(x) G_UNLIKELY(http_range_debug > (x)) + +#ifdef HTTP_RANGE_DEBUGGING +#define HTTP_RANGE_DEBUG(l, msg, ...) G_STMT_START { \ + if (http_range_debugging(l)) { \ + g_debug("%s(): " msg, G_STRFUNC, __VA_ARGS__); \ + } \ +} G_STMT_END + +#define HTTP_RANGE_PRINT(l, msg) G_STMT_START { \ + if (http_range_debugging(l)) { \ + g_debug("%s(): " msg, G_STRFUNC); \ + } \ +} G_STMT_END +#else +#define HTTP_RANGE_DEBUG(l, msg, ...) +#define HTTP_RANGE_PRINT(l, msg) +#endif /* HTTP_RANGE_DEBUGGING */ + +enum http_range_magic { HTTP_RANGE_MAGIC = 0x6e8d7dfd }; + +/** + * Internal representation of an HTTP range in our set. + * + * The first two fields MUST be the same as http_range_t so as to let our + * data structure pass for an http_range_t thanks to structural equivalence. + */ +struct http_range_item { + /* Leading fields MUST match those in http_range_t */ + filesize_t start; /**< First byte of range */ + filesize_t end; /**< Last byte, HTTP_OFFSET_MAX if unbounded */ + rbnode_t node; /**< Embedded red-black node */ + slink_t lk; /**< Embedded one-way list */ + enum http_range_magic magic;/**< Magic number, cannot be at the start */ +}; + +static inline void +http_range_item_check(const struct http_range_item * const hri) +{ + g_assert(hri != NULL); + g_assert(HTTP_RANGE_MAGIC == hri->magic); + g_assert(hri->start <= hri->end); +} + +enum http_rangeset_magic { HTTP_RANGESET_MAGIC = 0x640a1e25 }; + +/** + * HTTP range set. + */ +struct http_rangeset { + enum http_rangeset_magic magic; /**< Magic number */ + erbtree_t tree; /**< Tree of HTTP range items */ + eslist_t list; /**< List of HTTP range items */ + filesize_t length; /**< Total length of held HTTP ranges */ +}; + +static inline void +http_rangeset_check(const struct http_rangeset * const hrs) +{ + g_assert(hrs != NULL); + g_assert(HTTP_RANGESET_MAGIC == hrs->magic); +} + +static inline bool +http_rangeset_invariant(const struct http_rangeset * const hrs) +{ + g_assert(eslist_count(&hrs->list) == erbtree_count(&hrs->tree)); + + return TRUE; /* So that we can safety_assert() this routine */ +} + +/** + * Cast an http_range_item to an http_range structure, thanks to equivalence. + */ +static const http_range_t * +HTTP_RANGE(const struct http_range_item *x) +{ + /* Assert structural equivalence, which guarantees cast safety */ + + STATIC_ASSERT(offsetof(http_range_t, start) == + offsetof(struct http_range_item, start)); + STATIC_ASSERT(offsetof(http_range_t, end) == + offsetof(struct http_range_item, end)); + + if G_LIKELY(x != NULL) + http_range_item_check(x); + + return (const http_range_t *) x; +} + +static uint32 http_range_debug; + +/** + * Set debug level. + */ +void +set_http_range_debug(uint32 level) +{ + http_range_debug = level; +} + +/** + * Compares two HTTP ranges so that ranges are equal only when they overlap. + */ +int +http_range_overlap_cmp(const void *a, const void *b) +{ + const http_range_t *ra = a, *rb = b; + + if (ra->end < rb->start) /* `end' is part of the HTTP range */ + return -1; + + if (rb->end < ra->start) + return +1; + + return 0; /* Overlapping ranges are equal */ +} + +/** + * Allocate a new HTTP range item. + */ +static struct http_range_item * +http_range_item_alloc(filesize_t start, filesize_t end) +{ + struct http_range_item *hri; + + g_assert(start <= end); + + WALLOC0(hri); + hri->magic = HTTP_RANGE_MAGIC; + hri->start = start; + hri->end = end; + + return hri; +} + +/** + * Free HTTP range item (as generic callback for tree). + */ +static void +http_range_item_free(struct http_range_item *hri) +{ + http_range_item_check(hri); + + hri->magic = 0; + WFREE(hri); +} + +/** + * @returns the length of the HTTP range. + */ +static inline filesize_t +http_range_item_length(const struct http_range_item * const hri) +{ + http_range_item_check(hri); + + return hri->end - hri->start + 1; +} + +/** + * @return string representation for HTTP range (pointer to static data). + */ +static const char * +http_range_item_to_string(const struct http_range_item * const hri) +{ + buf_t *b = buf_private(G_STRFUNC, FILESIZE_DEC_BUFLEN * 2 + 1); + + if (NULL == hri) + return "null"; + + http_range_item_check(hri); + + buf_printf(b, "%s-%s", + filesize_to_string(hri->start), filesize_to_string2(hri->end)); + + return buf_data(b); +} + +/** + * @return string representation for HTTP range (pointer to static data). + */ +static const char * +http_range_item_to_string2(const struct http_range_item * const hri) +{ + buf_t *b = buf_private(G_STRFUNC, FILESIZE_DEC_BUFLEN * 2 + 1); + + if (NULL == hri) + return "null"; + + http_range_item_check(hri); + + buf_printf(b, "%s-%s", + filesize_to_string(hri->start), filesize_to_string2(hri->end)); + + return buf_data(b); +} + +/** + * Computes the HTTP range length, for assertions. + * + * As a side effect, also validates that the list of ranges is sorted and + * that there are no adjacent ranges (they should always be coalesced). + */ +static inline filesize_t G_UNUSED +http_rangeset_compute_length(const http_rangeset_t *hrs) +{ + slink_t *sl; + filesize_t length = 0; + const struct http_range_item *prev = NULL; + + http_rangeset_check(hrs); + + ESLIST_FOREACH(&hrs->list, sl) { + const struct http_range_item *hri = eslist_data(&hrs->list, sl); + length += http_range_item_length(hri); + if (prev != NULL) { + g_assert(prev->end + 1 < hri->start); + } + prev = hri; + } + + return length; +} + +/** + * Allocate a new empty HTTP range set. + */ +http_rangeset_t * +http_rangeset_create(void) +{ + http_rangeset_t *hrs; + + WALLOC0(hrs); + hrs->magic = HTTP_RANGESET_MAGIC; + erbtree_init(&hrs->tree, http_range_overlap_cmp, + offsetof(struct http_range_item, node)); + eslist_init(&hrs->list, offsetof(struct http_range_item, lk)); + + return hrs; +} + +/** + * Clear the HTTP range set, discarding all the ranges. + */ +void +http_rangeset_clear(http_rangeset_t *hrs) +{ + http_rangeset_check(hrs); + http_rangeset_invariant(hrs); + + eslist_wfree(&hrs->list, sizeof(struct http_range_item)); + erbtree_clear(&hrs->tree); +} + +/** + * Free HTTP range set. + */ +static void +http_rangeset_free(http_rangeset_t *hrs) +{ + http_rangeset_check(hrs); + + http_rangeset_clear(hrs); + hrs->magic = 0; + WFREE(hrs); +} + +/** + * Free HTTP range set and nullify its pointer. + */ +void +http_rangeset_free_null(http_rangeset_t **hrs_ptr) +{ + http_rangeset_t *hrs = *hrs_ptr; + + if (hrs != NULL) { + http_rangeset_free(hrs); + *hrs_ptr = NULL; + } +} + +/** + * @return the length covered by the HTTP ranges. + */ +filesize_t +http_rangeset_length(const http_rangeset_t *hrs) +{ + http_rangeset_check(hrs); + + return hrs->length; +} + +/** + * @return the amount of distinct HTTP ranges held. + */ +size_t +http_rangeset_count(const http_rangeset_t *hrs) +{ + http_rangeset_check(hrs); + safety_assert(http_rangeset_invariant(hrs)); + + return eslist_count(&hrs->list); +} + +/** + * Does HTTP range set contain a set overlapping with the specified boundaries. + * + * @param hrs the HTTP range set + * @param start start of HTTP range + * @param end end (last byte) of HTTP range + * + * @return TRUE if one of the held ranges overlaps with the given range. + */ +bool +http_rangeset_contains(const http_rangeset_t *hrs, + filesize_t start, filesize_t end) +{ + http_range_t range; + + http_rangeset_check(hrs); + g_assert(start <= end); + + range.start = start; + range.end = end; + + return erbtree_contains(&hrs->tree, &range); +} + +/** + * Lookup any range overlapping with the specified boundaries. + * + * @param hrs the HTTP range set + * @param start start of HTTP range + * @param end end (last byte) of HTTP range + * + * @return an HTTP range if a match is found, NULL if no overlapping range. + */ +const http_range_t * +http_rangeset_lookup(const http_rangeset_t *hrs, + filesize_t start, filesize_t end) +{ + http_range_t range; + const struct http_range_item *hri; + + http_rangeset_check(hrs); + g_assert(start <= end); + + range.start = start; + range.end = end; + + hri = erbtree_lookup(&hrs->tree, &range); + + return HTTP_RANGE(hri); +} + +/** + * Lookup the first range (with the smallest starting point) overlapping with + * the specified boundaries. + * + * @param hrs the HTTP range set + * @param start start of HTTP range + * @param end end (last byte) of HTTP range + * + * @return first HTTP range if a match is found, NULL if no overlapping range. + */ +const http_range_t * +http_rangeset_lookup_first(const http_rangeset_t *hrs, + filesize_t start, filesize_t end) +{ + http_range_t range; + const struct http_range_item *hri; + + http_rangeset_check(hrs); + g_assert(start <= end); + + range.start = start; + range.end = end; + + hri = erbtree_lookup(&hrs->tree, &range); + + if (NULL == hri) + return NULL; + + /* + * Move to the earliest overlapping range. + */ + + for (;;) { + rbnode_t *prev; + struct http_range_item *prange; + + prev = erbtree_prev(&hri->node); + if (NULL == prev) + break; /* We are already at the first known range */ + + prange = erbtree_data(&hrs->tree, prev); + http_range_item_check(prange); + + if (prange->end < start) + break; /* Not overlapping */ + + hri = prange; /* Update earliest overlapping range */ + } + + return HTTP_RANGE(hri); +} + +/** + * Insert a new standalone HTTP range in the set, which does not overlap with + * any previous or next range nor is adjacent to them. + * + * @param hrs the HTTP range set + * @param start start of HTTP range + * @param end end (last byte) of HTTP range + */ +static void +http_rangeset_insert_standalone(http_rangeset_t *hrs, + filesize_t start, filesize_t end) +{ + struct http_range_item *hrnew; + void *old; + rbnode_t *prev; + + safety_assert(http_rangeset_invariant(hrs)); + safety_assert(http_rangeset_compute_length(hrs) == hrs->length); + + hrnew = http_range_item_alloc(start, end); + + old = erbtree_insert(&hrs->tree, &hrnew->node); + g_assert(NULL == old); /* It's a standalone chunk */ + + prev = erbtree_prev(&hrnew->node); + if (NULL == prev) { + eslist_prepend(&hrs->list, hrnew); + } else { + struct http_range_item *hri = erbtree_data(&hrs->tree, prev); + eslist_insert_after(&hrs->list, hri, hrnew); + g_assert(hri->end + 1 < hrnew->start); /* Not adjacent */ + } + + /* + * Ensure we're not adjacent to the next range, if any, otherwise this + * routine should not have been called. + */ + + { + slink_t *next; + + next = eslist_next(&hrnew->lk); + if (next != NULL) { + const struct http_range_item *hri = eslist_data(&hrs->list, next); + g_assert(hrnew->end + 1 < hri->start); /* Not adjacent */ + } + } + + hrs->length += end - start + 1; + + safety_assert(http_rangeset_invariant(hrs)); + safety_assert(http_rangeset_compute_length(hrs) == hrs->length); +} + +/** + * Append a new standalone HTTP range in the set, which does not overlap with + * any previous range nor is adjacent to it. + * + * @param hrs the HTTP range set + * @param start start of HTTP range + * @param end end (last byte) of HTTP range + */ +static void +http_rangeset_append(http_rangeset_t *hrs, filesize_t start, filesize_t end) +{ + struct http_range_item *hrnew; + void *old; + + safety_assert(http_rangeset_invariant(hrs)); + safety_assert(http_rangeset_compute_length(hrs) == hrs->length); + + hrnew = http_range_item_alloc(start, end); + old = erbtree_insert(&hrs->tree, &hrnew->node); + g_assert(NULL == old); + + eslist_append(&hrs->list, hrnew); + hrs->length += http_range_item_length(hrnew); + + safety_assert(http_rangeset_invariant(hrs)); + safety_assert(http_rangeset_compute_length(hrs) == hrs->length); +} + +/** + * Coalesce all the HTTP ranges between ``start'' and ``end'' which overlap + * or can be coalesced with ranges from ``left'' to ``right''. + * + * Upon return, ``left'' is the coalesced range and all HTTP ranges afterwards + * and up to ``right'' have been removed, provided ``right'' is different from + * ``left''. + */ +static void +http_rangeset_coalesce_ranges(http_rangeset_t *hrs, + struct http_range_item *left, struct http_range_item *right, + filesize_t start, filesize_t end) +{ + filesize_t length, lower, upper, newlen; + + http_rangeset_check(hrs); + http_range_item_check(left); + http_range_item_check(right); + g_assert(start <= end); + g_assert(left->start <= right->start); + g_assert(left->end <= right->end); + g_assert(right->start <= end + 1); + g_assert(left->end + 1 >= start); + safety_assert(http_rangeset_invariant(hrs)); + safety_assert(http_rangeset_compute_length(hrs) == hrs->length); + + HTTP_RANGE_DEBUG(5, "coalescing for %s-%s", + filesize_to_string(start), filesize_to_string2(end)); + HTTP_RANGE_DEBUG(5, "left=%s, right=%s", + http_range_item_to_string(left), http_range_item_to_string2(right)); + + lower = MIN(left->start, start); + upper = MAX(right->end, end); + + length = http_range_item_length(left); + left->start = lower; + + if (left == right) + goto coalesce; + + /* + * Remove all the ranges after ``left'', updating the running length. + */ + + for (;;) { + struct http_range_item *nrange; + slink_t *next; + void *removed; + + /* + * We use the one-way list to move from one range to the next, but + * we need to remove ranges from both the list and the tree. + */ + + next = eslist_next(&left->lk); + g_assert(next != NULL); + + nrange = eslist_data(&hrs->list, next); + length += http_range_item_length(nrange); + removed = eslist_remove_after(&hrs->list, left); + g_assert(nrange == removed); + + HTTP_RANGE_DEBUG(5, "removing %s-%s", + filesize_to_string(nrange->start), + filesize_to_string2(nrange->end)); + + erbtree_remove(&hrs->tree, &nrange->node); + http_range_item_free(nrange); + + if (nrange == right) + break; + } + +coalesce: + + /* + * Coalesce the whole range in the left-most range item. + */ + + left->end = upper; + newlen = http_range_item_length(left); /* New spanned length */ + + g_assert(newlen >= length); + + hrs->length += newlen - length; + + HTTP_RANGE_DEBUG(5, "final range is %s-%s, added %s byte%s", + filesize_to_string(left->start), + filesize_to_string2(left->end), + filesize_to_string3(newlen - length), plural(newlen - length)); + + safety_assert(http_rangeset_invariant(hrs)); + safety_assert(http_rangeset_compute_length(hrs) == hrs->length); +} + +/* + * Find the lowest overlapping or right-adjacent range given lower boundary. + * + * @param hrs the HTTP range set + * @param first lookup starting position + * @param lower lower boundary (right-adjacent position) + * @param upper upper boundary for determining overlapping condition + * @param last last looked-up range + * + * @return first (left-most) range overlapping or right-adjacent with lower, + * NULL if there is none. + */ +static struct http_range_item * +http_rangeset_lowest_lookup(const http_rangeset_t *hrs, + const struct http_range_item *first, filesize_t lower, filesize_t upper, + struct http_range_item **last) +{ + const struct http_range_item *hrlast = first; + + http_range_item_check(first); + g_assert(lower <= upper); + g_assert(last != NULL); + + for (;;) { + slink_t *next; + + *last = deconstify_pointer(hrlast); + + if (hrlast->start > upper) + break; /* No overlap possible, we're past upper point */ + + if (hrlast->end + 1 >= lower) + return deconstify_pointer(hrlast); /* Found match */ + + next = eslist_next(&hrlast->lk); + if (NULL == next) { + *last = NULL; /* Tell caller that no range is suitable */ + break; /* Reached the tail of the list */ + } + + hrlast = eslist_data(&hrs->list, next); + http_range_item_check(hrlast); + } + + /* + * Even though we do not return a match, we leave in ``last'' the last + * chunk we visited, or NULL if we reached the end of the list with no + * possible overlap and with all the ranges well before the ``lower'' + * point, i.e. with no adjacent merging possible. + */ + + return NULL; /* No match found */ +} + +/* + * Find the highest overlapping or left-adjacent range given upper boundary + * and first overlapping or right-adjacent range. + * + * @param hrs the HTTP range set + * @param first lookup starting position, overlapping or right-adjacent + * @param upper upper boundary (target for left-adjacent position) + * + * @return last (right-most) range overlapping or left-adjacent with upper. + */ +static struct http_range_item * +http_rangeset_highest_lookup(const http_rangeset_t *hrs, + struct http_range_item *first, filesize_t upper) +{ + struct http_range_item *hrlast = first; + + http_range_item_check(first); + + for (;;) { + slink_t *next; + struct http_range_item *nrange; + + next = eslist_next(&hrlast->lk); + if (NULL == next) + break; /* Reached the tail of the list */ + + nrange = eslist_data(&hrs->list, next); + http_range_item_check(nrange); + + if (upper + 1 < nrange->start) + break; /* No overlap and not adjacent */ + + hrlast = nrange; + } + + return hrlast; +} + +/** + * Insert a new HTTP range in the set, merging with any existing range that + * it would overlap with or with which it would become adjacent. + * + * Because of coalescing, this routine can perform in O(n). However, when + * inserting without coalescing, or when the inserted range already exists, + * it will perform in O(log n). + * + * @param hrs the HTTP range set + * @param start start of HTTP range + * @param end end (last byte) of HTTP range + */ +void +http_rangeset_insert(http_rangeset_t *hrs, filesize_t start, filesize_t end) +{ + struct http_range_item *hri, *hrlast; + http_range_t range; + + http_rangeset_check(hrs); + g_assert(start <= end); + http_rangeset_invariant(hrs); + safety_assert(http_rangeset_compute_length(hrs) == hrs->length); + + range.start = start; + range.end = end; + + HTTP_RANGE_DEBUG(5, "adding %s-%s to existing %s", + filesize_to_string(start), filesize_to_string2(end), + http_rangeset_to_string(hrs)); + + hri = erbtree_lookup(&hrs->tree, &range); + + if (NULL == hri) { + /* + * Range overlaps with nothing. + * + * See whether we can coalesce it with the previous range, and + * if not, with the next range. + */ + + if (start != 0) { + range.start = range.end = start - 1; + hri = erbtree_lookup(&hrs->tree, &range); + } + + if (NULL == hri) { + /* No coalescing possible with previous range */ + + HTTP_RANGE_PRINT(5, "cannot coalesce with previous"); + + range.start = range.end = end + 1; + hri = erbtree_lookup(&hrs->tree, &range); + + if (NULL == hri) { + /* No coalescing possible with next range either */ + + HTTP_RANGE_PRINT(5, "cannot coalesce with next"); + + http_rangeset_insert_standalone(hrs, start, end); + goto done; + } + + /* + * Can coalesce with the next range but not with the previous. + */ + + HTTP_RANGE_PRINT(5, "can coalesce with next only"); + + http_range_item_check(hri); + g_assert(end + 1 == hri->start); + + hrs->length += end - start + 1; + hri->start = start; + goto done; + } else { + struct http_range_item *hrnext; + slink_t *sln; + void *next; + + http_range_item_check(hri); + + HTTP_RANGE_PRINT(5, "can coalesce with previous"); + + /* + * Can coalesce with the previous rnage, see whether we can also + * coalesce with the next range. + */ + + g_assert(hri->end + 1 == start); + + sln = eslist_next(&hri->lk); + hrnext = eslist_data(&hrs->list, sln); + + if (NULL == hrnext || hrnext->start > end + 1) { + /* No coalescing possible with the next range */ + + HTTP_RANGE_DEBUG(5, "cannot coalesce with next%s", + NULL == hrnext ? " (nothing there)" : ""); + + hrs->length += end - start + 1; + hri->end = end; + goto done; + } + + /* + * The new chunk fits exactly between the previous and the next + * range, hence we can remove the next range and merge it + * with the previous one. + */ + + HTTP_RANGE_DEBUG(5, "exact in-between fit with %s and %s", + http_range_item_to_string(hri), + http_range_item_to_string2(hrnext)); + + http_range_item_check(hrnext); + g_assert(end + 1 == hrnext->start); + + erbtree_remove(&hrs->tree, &hrnext->node); + next = eslist_remove_after(&hrs->list, hri); + + g_assert_log(next == hrnext, + "next: %s, hrnext: %s", + http_range_item_to_string(next), + http_range_item_to_string2(hrnext)); + + hri->end = hrnext->end; + hrs->length += end - start + 1; + http_range_item_free(hrnext); + goto done; + } + g_assert_not_reached(); + } + + /* + * If range is already contained, do nothing. + */ + + if (start >= hri->start && end <= hri->end) { + HTTP_RANGE_PRINT(5, "range already contained"); + goto done; + } + + /* + * Look for the earliest overlapping or right-adjacent range. + */ + + for (;;) { + rbnode_t *prev; + struct http_range_item *prange; + + prev = erbtree_prev(&hri->node); + if (NULL == prev) + break; /* We are already at the first known range */ + + prange = erbtree_data(&hrs->tree, prev); + http_range_item_check(prange); + + if (prange->end + 1 < start) + break; /* No overlap and not adjacent */ + + hri = prange; /* Update earliest overlapping range */ + } + + HTTP_RANGE_DEBUG(5, "earliest overalaping/adjacent is %s", + http_range_item_to_string(hri)); + + /* + * Find the highest overlapping or left-adjacent range after the + * earliest overlapping or right-adjacent range `hri'. + */ + + hrlast = http_rangeset_highest_lookup(hrs, hri, end); + + HTTP_RANGE_DEBUG(5, "last overalaping/adjacent is %s", + http_range_item_to_string(hrlast)); + + /* + * We can now compute the union between the range we're adding and + * all the chunks between ``hri'' and ``hrlast'' (both included). + */ + + http_rangeset_coalesce_ranges(hrs, hri, hrlast, start, end); + + /* FALL THROUGH */ + +done: + http_rangeset_invariant(hrs); + safety_assert(http_rangeset_compute_length(hrs) == hrs->length); +} + +/** + * Start iteration over the list of HTTP ranges. + * + * @param hrs the HTTP range set + * + * @return NULL if the set is empty, or the first HTTP range. + */ +const http_range_t * +http_range_first(const http_rangeset_t *hrs) +{ + struct http_range_item *hri; + slink_t *first; + + /* + * This is a convenience routine for HTTP_RANGE_FOREACH() hence it must + * accept a NULL argument, in which case of course there is nothing + * to iterate over. + */ + + if (NULL == hrs) + return NULL; + + http_rangeset_check(hrs); + + first = eslist_first(&hrs->list); + if (NULL == first) + return NULL; + + hri = eslist_data(&hrs->list, first); + + return HTTP_RANGE(hri); +} + +/** + * Continue iteration over the list of HTTP ranges. + * + * @param hrs the HTTP range set + * @param r the previous HTTP range iterated over + * + * @return NULL if the item was the last one, or the next HTTP range. + */ +const http_range_t * +http_range_next(const http_rangeset_t *hrs, const http_range_t *r) +{ + struct http_range_item *hri; + const struct http_range_item *hitem; + slink_t *next; + + http_rangeset_check(hrs); + + hitem = (const struct http_range_item *) r; + http_range_item_check(hitem); + + next = eslist_next(&hitem->lk); + if (NULL == next) + return NULL; + + hri = eslist_data(&hrs->list, next); + + return HTTP_RANGE(hri); +} + +/** + * Possible returned values from parsing callback. + */ +enum http_range_parser_status { + HTTP_RANGE_PARSER_OK = 0, /* OK, range accepted */ + HTTP_RANGE_PARSER_STOP, /* OK, range accepted, stop parsing */ + HTTP_RANGE_OVERLAP, /* Partial overlapping with another range */ + HTTP_RANGE_DUPLICATE, /* Range was already fully known */ +}; + +/** + * Callback invoked for each valid range found by http_range_parser(). + * + * @param start the first byte of the range + * @param end the last byte included in the range + * @param data user-supplied extra argument + * + * @return TRUE if we can continue the parsing, FALSE if parsing should stop. + */ +typedef enum http_range_parser_status (*http_range_parser_cb_t)( + filesize_t start, filesize_t end, void *data); + +/** + * Invoke range-adding callback + * + * @return TRUE if we need to stop processing. + */ +static bool +http_range_parser_add_range(const char *where, + filesize_t start, filesize_t end, + http_range_parser_cb_t cb, void *data, + size_t count, const char *field, const char *vendor, size_t offset, + const char *value) +{ + switch ((*cb)(start, end, data)) { + case HTTP_RANGE_PARSER_OK: + break; + case HTTP_RANGE_PARSER_STOP: + return TRUE; + case HTTP_RANGE_OVERLAP: + if (http_range_debugging(0)) { + g_warning("%s(): weird %s header from <%s>, offset %zu " + "(overlapping range #%zu %s-%s): %s", + where, field, vendor, offset, count, + filesize_to_string(start), filesize_to_string(end), + value); + } + break; + case HTTP_RANGE_DUPLICATE: + if (http_range_debugging(0)) { + g_warning("%s(): weird %s header from <%s>, offset %zu " + "(duplicate range #%zu %s-%s): %s", + where, field, vendor, offset, count, + filesize_to_string(start), filesize_to_string(end), + value); + } + break; + } + return FALSE; +} + +/** + * Parse a Range: header from an HTTP request, invoking a callback for each + * valid range we find. Invalid ranges are ignored. + * + * Only "bytes" ranges are supported. + * + * When parsing a "bytes=" style, it means it's a request, so we allow + * negative ranges. Otherwise, for "bytes " specifications, it's a reply + * and we ignore negative ranges. + * + * `size' gives the length of the resource, to resolve negative ranges and + * make sure we don't have ranges that extend past that size. + * + * The `field' and `vendor' arguments are only there to log errors, if any. + * + * @param field the name of the HTTP header we're parsing, for logging + * @param value the HTTP header value where ranges are expected + * @param size the total known size of the resource, or HTTP_OFFSET_MAX + * @param vendor the user-agent of the requester/server, for logging + * @param cb parsing callback to invoke for each range found + * @param data extra callback argument + * + * @return TRUE if OK, FALSE if we had to abort due to a syntax error. + */ +static bool +http_range_parser( + const char *field, const char *value, filesize_t size, const char *vendor, + http_range_parser_cb_t cb, void *data) +{ + static const char unit = "bytes"; + const char *str = value; + uchar c; + filesize_t start, end; + bool request = FALSE; /* True if 'bytes=' is seen */ + bool has_start, has_end, skipping, minus_seen; + int count = 0; + + g_assert(size != 0); + vendor = vendor != NULL ? vendor : "unknown"; + + if (NULL != (str = is_strprefix(str, unit))) { + c = *str; + if (!is_ascii_space(c) && c != '=') { + if (http_range_debugging(0)) { + g_warning("%s(): improper %s header from <%s>: %s", + G_STRFUNC, field, vendor, value); + } + return FALSE; + } + } else { + if (http_range_debugging(0)) { + g_warning("%s(): improper %s header from <%s> (not bytes?): %s", + G_STRFUNC, field, vendor, value); + } + return FALSE; + } + + /* + * Move to the first non-space char. + * Meanwhile, if we see a '=', we know it's a request-type range header. + */ + + while ((c = *str)) { + if ('=' == c) { + if (request) { + if (http_range_debugging(0)) { + g_warning("%s(): improper %s header from <%s> " + "(multiple '='): %s", G_STRFUNC, field, vendor, value); + } + return FALSE; + } + request = TRUE; + str++; + continue; + } + if (is_ascii_space(c)) { + str++; + continue; + } + break; + } + + start = 0; + has_start = FALSE; + has_end = FALSE; + end = size - 1; + skipping = FALSE; + minus_seen = FALSE; + + while ((c = *str++)) { + if (is_ascii_space(c)) + continue; + + if (',' == c) { + if (skipping) { + skipping = FALSE; /* ',' is a resynch point */ + continue; + } + + if (!minus_seen) { + if (http_range_debugging(0)) { + g_warning("%s(): weird %s header from <%s>, offset %zu " + "(no range?): %s", + G_STRFUNC, field, vendor, (str - value) - 1, value); + } + goto reset; + } + + if (HTTP_OFFSET_MAX == start && !has_end) { + /* Bad negative range */ + if (http_range_debugging(0)) { + g_warning("%s(): weird %s header from <%s>, offset %zu " + "(incomplete negative range): %s", + G_STRFUNC, field, vendor, (str - value) - 1, value); + } + goto reset; + } + + if (start > end) { + if (http_range_debugging(0)) { + g_warning("%s(): weird %s header from <%s>, offset %zu " + "(swapped range?): %s", + G_STRFUNC, field, vendor, (str - value) - 1, value); + } + goto reset; + } + + /* + * Found a valid range, invoke callback for processing it. + */ + + count++; + + if ( + http_range_parser_add_range(G_STRFUNC, + start, end, cb, data, + count, field, vendor, (str - value) - 1, value) + ) + return TRUE; + + goto reset; + } + + if (skipping) /* Waiting for a ',' */ + continue; + + if ('-' == c) { + if (minus_seen) { + if (http_range_debugging(0)) { + g_warning("%s(): weird %s header from <%s>, " + "offset %zu (spurious '-'): %s", + G_STRFUNC, field, vendor, (str - value) - 1, value); + } + goto resync; + } + minus_seen = TRUE; + if (!has_start) { /* Negative range */ + if (!request) { + if (http_range_debugging(0)) { + g_warning("%s(): weird %s header from <%s>, offset %zu " + "(negative range in reply): %s", + G_STRFUNC, field, vendor, (str - value) - 1, value); + } + goto resync; + } + start = HTTP_OFFSET_MAX; /* Indicates negative range */ + has_start = TRUE; + } + continue; + } + + if (is_ascii_digit(c)) { + int error; + const char *dend; + uint64 val = parse_uint64(str - 1, &dend, 10, &error); + + /* Started with digit! */ + g_assert(dend != (str - 1)); + + str = dend; /* Skip number */ + + if (has_end) { + if (http_range_debugging(0)) { + g_warning("%s(): weird %s header from <%s>, offset %zu " + "(spurious boundary %s): %s", + G_STRFUNC, field, vendor, (str - value) - 1, + uint64_to_string(val), value); + } + goto resync; + } + + if (val >= size) { + /* + * ``last-byte-pos'' may extend beyond the actual + * filesize. It's more a response limit than an exact + * range end specifier. + */ + val = size - 1; + } + + if (has_start) { + if (!minus_seen) { + if (http_range_debugging(0)) { + g_warning("%s(): weird %s header from <%s>, offset %zu " + "(no '-' before boundary %s): %s", + G_STRFUNC, field, vendor, (str - value) - 1, + uint64_to_string(val), value); + } + goto resync; + } + if (HTTP_OFFSET_MAX == start) { /* Negative range */ + start = (val > size) ? 0 : size - val; /* Last bytes */ + end = size - 1; + } else { + end = val; + } + has_end = TRUE; + } else { + start = val; + has_start = TRUE; + } + continue; + } + + if (http_range_debugging(0)) { + g_warning("%s(): weird %s header from <%s>, offset %zu " + "(unexpected char '%c'): %s", + G_STRFUNC, field, vendor, (str - value) - 1, c, value); + } + + /* FALL THROUGH */ + + resync: + skipping = TRUE; + reset: + start = 0; + has_start = FALSE; + has_end = FALSE; + minus_seen = FALSE; + end = size - 1; + } + + /* + * Handle trailing range, if needed. + */ + + if (minus_seen) { + if (HTTP_OFFSET_MAX == start && !has_end) { /* Bad negative range */ + if (http_range_debugging(0)) { + g_warning("%s(): weird %s header from <%s>, offset %zu " + "(incomplete trailing negative range): %s", + G_STRFUNC, field, vendor, (str - value) - 1, value); + } + goto final; + } + + if (start > end) { + if (http_range_debugging(0)) { + g_warning("%s(): weird %s header from <%s>, offset %zu " + "(swapped trailing range?): %s", + G_STRFUNC, field, vendor, (str - value) - 1, value); + } + goto final; + } + + count++; + + if ( + http_range_parser_add_range(G_STRFUNC, + start, end, cb, data, + count, field, vendor, (str - value) - 1, value) + ) + return TRUE; + } + + /* FALL THROUGH */ + +final: + + if (http_range_debugging(0) && 0 == count) { + g_warning("%s(): retained no ranges in %s header from <%s>: %s", + G_STRFUNC, field, vendor, value); + } + + return TRUE; +} + +/** + * @returns a pointer to static data, containing the available ranges. + */ +const char * +http_rangeset_to_string(const http_rangeset_t *hrs) +{ + str_t *s = str_private(G_STRFUNC, 80); + static const char comma = ", "; + slink_t *sl; + + http_rangeset_check(hrs); + http_rangeset_invariant(hrs); + + str_reset(s); + + ESLIST_FOREACH(&hrs->list, sl) { + const struct http_range_item *hri = eslist_data(&hrs->list, sl); + char sbufFILESIZE_DEC_BUFLEN, ebufFILESIZE_DEC_BUFLEN; + size_t slen, elen; + + if (0 != str_len(s)) + str_cat_len(s, comma, CONST_STRLEN(comma)); + + slen = uint64_to_string_buf(hri->start, sbuf, sizeof sbuf); + elen = uint64_to_string_buf(hri->end, ebuf, sizeof ebuf); + + str_cat_len(s, sbuf, slen); + str_putc(s, '-'); + str_cat_len(s, ebuf, elen); + } + + return str_2c(s); +} + +/** + * Merge second rangeset into the first. + * + * @param hdest the destination range set + * @param hsrc the source range set, ranges to merge into destination + * + * @return new length covered by the merged set. + */ +filesize_t +http_rangeset_merge(http_rangeset_t *hdest, const http_rangeset_t *hsrc) +{ + slink_t *sld, *sls; + + http_rangeset_check(hdest); + http_rangeset_check(hsrc); + http_rangeset_invariant(hdest); + http_rangeset_invariant(hsrc); + safety_assert(http_rangeset_compute_length(hdest) == hdest->length); + + /* + * Use a linear walk with on-the-fly merging, running in O(m + n). + * + * This is better than looping over the second set and inserting the ranges + * into the first because that would be about O(n * log(m + n)), with + * n being the count of the second set and m the count of the first set, + * assuming no coalescing is done, tending towards O(n * m) in the worst + * case. + */ + + HTTP_RANGE_DEBUG(5, "destination is %s", http_rangeset_to_string(hdest)); + HTTP_RANGE_DEBUG(5, "source is %s", http_rangeset_to_string(hsrc)); + + sld = eslist_first(&hdest->list); + + ESLIST_FOREACH(&hsrc->list, sls) { + const struct http_range_item *hri = eslist_data(&hsrc->list, sls); + + http_range_item_check(hri); + + HTTP_RANGE_DEBUG(5, "dealing with %s", http_range_item_to_string(hri)); + + if (NULL == sld) { + /* + * Reached end of destination list, all its ranges come before + * the sourced ones, so we can just append all the ranges we see. + */ + + HTTP_RANGE_PRINT(5, "reached destination end, appending"); + + http_rangeset_append(hdest, hri->start, hri->end); + } else { + const struct http_range_item *hcur = eslist_data(&hdest->list, sld); + struct http_range_item *left, *last; + + HTTP_RANGE_DEBUG(5, "current merge point is %s", + http_range_item_to_string(hcur)); + + /* + * Look for a chunk in the destination list that is adjacent to + * the left of `hri', or which is overlapping with it. + */ + + left = http_rangeset_lowest_lookup(hdest, hcur, + hri->start, hri->end, &last); + + if (NULL == left) { + if (NULL == last) { + /* + * We reached the end of the list without finding a match or + * an adjacent range we can merge with, so we're back to the + * appending case. + */ + + HTTP_RANGE_PRINT(5, "will be appending from now on"); + + sld = NULL; + http_rangeset_append(hdest, hri->start, hri->end); + } else { + /* + * The range we last considered is not overlapping nor is + * it adjacent on its right to the range we're attempting + * to insert. And there is no match for an overlapping + * or adjacent range on our left. + * + * If the last range is adjacent on its left to the range + * we're adding, then we can merge, otherwise we can + * insert a standalone range. + */ + + HTTP_RANGE_DEBUG(5, "last lowest range was %s", + http_range_item_to_string(last)); + + sld = &last->lk; /* Next merging starting point */ + + g_assert(last->start > hri->end); + + if (hri->end + 1 == last->start) { + /* Coalesce */ + + HTTP_RANGE_PRINT(5, "coalescing last lowest range"); + + last->start = hri->start; + hdest->length += http_range_item_length(hri); + } else { + /* No colaescing possible, insert standalone range */ + + HTTP_RANGE_DEBUG(5, "cannot coalesce %s with %s", + http_range_item_to_string(hri), + http_range_item_to_string(last)); + + http_rangeset_insert_standalone(hdest, + hri->start, hri->end); + } + } + } else { + struct http_range_item *right; + + HTTP_RANGE_DEBUG(5, "lowest overlapping/adjacent is %s", + http_range_item_to_string(left)); + + right = http_rangeset_highest_lookup(hdest, left, hri->end); + + HTTP_RANGE_DEBUG(5, "highest overlapping/adjacent is %s", + http_range_item_to_string(right)); + + http_rangeset_coalesce_ranges(hdest, left, right, + hri->start, hri->end); + + HTTP_RANGE_DEBUG(5, "merged item is %s", + http_range_item_to_string(left)); + + sld = &left->lk; /* Last merging point */ + } + } + } + + HTTP_RANGE_DEBUG(5, "result is %s", http_rangeset_to_string(hdest)); + + http_rangeset_invariant(hdest); + safety_assert(http_rangeset_compute_length(hdest) == hdest->length); + + return hdest->length; +} + +/** + * Are two rangesets equal? + */ +bool +http_rangeset_equal(const http_rangeset_t *hrs1, const http_rangeset_t *hrs2) +{ + const slink_t *sl1, *sl2; + + http_rangeset_check(hrs1); + http_rangeset_check(hrs2); + + if (hrs1->length != hrs2->length) + return FALSE; + + for ( + sl1 = eslist_first(&hrs1->list), sl2 = eslist_first(&hrs2->list); + sl1 != NULL && sl2 != NULL; + sl1 = eslist_next(sl1), sl2 = eslist_next(sl2) + ) { + const struct http_range_item *r1 = eslist_data(&hrs1->list, sl1); + const struct http_range_item *r2 = eslist_data(&hrs2->list, sl2); + + if (r1->start != r2->start || r1->end != r2->end) + return FALSE; + } + + return NULL == sl1 && NULL == sl2; /* Same list length, ranges identical */ +} + +/** + * Range parsing callback to insert new range to the set. + */ +static enum http_range_parser_status +http_rangeset_fill(filesize_t start, filesize_t end, void *data) +{ + http_rangeset_t *hrs = data; + filesize_t oldlength, newlength; + + http_rangeset_check(hrs); + g_assert(start <= end); + + oldlength = hrs->length; + newlength = oldlength + end - start + 1; + + http_rangeset_insert(hrs, start, end); + + if (newlength == hrs->length) + return HTTP_RANGE_PARSER_OK; + + return hrs->length == oldlength ? HTTP_RANGE_DUPLICATE : HTTP_RANGE_OVERLAP; +} + +/** + * Parse an HTTP range header to extract all the advertised ranges in a new + * range set. + * + * @param field the name of the HTTP header we're parsing, for logging + * @param value the HTTP header value where ranges are expected + * @param size the total known size of the resource, or HTTP_OFFSET_MAX + * @param vendor the user-agent of the requester/server, for logging + * + * @return a new range set if OK, NULL if we could not parse the header. + */ +http_rangeset_t * +http_rangeset_extract( + const char *field, const char *value, filesize_t size, const char *vendor) +{ + http_rangeset_t *hrs; + bool ok; + + hrs = http_rangeset_create(); + ok = http_range_parser(field, value, size, vendor, http_rangeset_fill, hrs); + + if (!ok) { + http_rangeset_free(hrs); + return NULL; + } + + return hrs; +} + +struct http_range_extract_ctx { + filesize_t start; + filesize_t end; + uint has_range:1; + uint has_multi:1; +}; + +/** + * Range parsing callback to extract the first range we see. + */ +static enum http_range_parser_status +http_range_got(filesize_t start, filesize_t end, void *data) +{ + struct http_range_extract_ctx *ctx = data; + + g_assert(start <= end); + + if (ctx->has_range) { + ctx->has_multi = TRUE; + return HTTP_RANGE_PARSER_STOP; + } + + ctx->start = start; + ctx->end = end; + ctx->has_range = TRUE; + + return HTTP_RANGE_PARSER_OK; +} + +/** + * Parse an HTTP range header and extract the first range. + * + * @param field the name of the HTTP header we're parsing, for logging + * @param value the HTTP header value where ranges are expected + * @param size the total known size of the resource, or HTTP_OFFSET_MAX + * @param vendor the user-agent of the requester/server, for logging + * @param start where the start of the extracted range is written + * @param end where the end of the extracted range is written + * + * @return HTTP_RANGE_NONE on parsing error, HTTP_RANGE_SINGLE if there was + * only a single range, HTTP_RANGE_MULTI if multiple ranges were present. + */ +enum http_range_extract_status +http_range_extract_first( + const char *field, const char *value, filesize_t size, const char *vendor, + filesize_t *start, filesize_t *end) +{ + struct http_range_extract_ctx ctx; + bool ok; + + ZERO(&ctx); + ok = http_range_parser(field, value, size, vendor, http_range_got, &ctx); + + if (!ok || !ctx.has_range) + return HTTP_RANGE_NONE; + + if (start != NULL) *start = ctx.start; + if (end != NULL) *end = ctx.end; + + return ctx.has_multi ? HTTP_RANGE_MULTI : HTTP_RANGE_SINGLE; +} + +/*** + *** Unit tests. + ***/ + +#ifdef HTTP_RANGE_TESTING + +static const http_range_t hrtest_even = { + { 0, 0 }, + { 2, 2 }, + { 4, 4 }, + { 6, 6 }, + { 8, 8 }, +}; + +static const http_range_t hrtest_odd = { + { 1, 1 }, + { 3, 3 }, + { 5, 5 }, + { 7, 7 }, + { 9, 9 }, +}; + +static const http_range_t hrtest_overlap = { + { 0, 1 }, + { 3, 9 }, +}; + +static const http_range_t hrtest_partial = { + { 1, 2 }, + { 4, 5 }, + { 9, 10 }, + { 15, 19 }, + { 21, 24 }, + { 26, 29 }, + { 31, 32 }, + { 37, 41 }, + { 43, 43 }, + { 45, 47 }, + { 50, 50 }, + { 58, 58 }, +}; + +static const http_range_t hrtest_added = { + { 0, 4 }, + { 7, 11 }, + { 17, 18 }, + { 22, 27 }, + { 34, 49 }, + { 51, 53 }, + { 51, 53 }, + { 55, 60 }, +}; + +static const http_range_t hrtest_result = { + { 0, 5 }, + { 7, 11 }, + { 15, 19 }, + { 21, 29 }, + { 31, 32 }, + { 34, 53 }, + { 55, 60 }, +}; + +/** + * Test utility to create a rangeset from an array of ranges. + */ +static http_rangeset_t * +http_range_test_load(const http_range_t ranges, size_t cnt) +{ + http_rangeset_t *hrs; + size_t i; + + hrs = http_rangeset_create(); + for (i = 0; i < cnt; i++) { + http_rangeset_insert(hrs, rangesi.start, rangesi.end); + } + + return hrs; +} + +#define HTTP_RANGE_TEST_LOAD(x) http_range_test_load((x), N_ITEMS(x)) + +/** + * Perform unit tests for HTTP ranges. + */ +void G_COLD +http_range_test(void) +{ + http_rangeset_t *hrs_even, *hrs_odd, *hrs_over; + http_rangeset_t *hrs_partial, *hrs_added, *hrs_result; + const http_range_t *hr; + uint test = 0; + str_t *s; + + hrs_even = http_range_test_load(hrtest_even, N_ITEMS(hrtest_even)); + hrs_odd = http_range_test_load(hrtest_odd, N_ITEMS(hrtest_odd)); + + g_assert(N_ITEMS(hrtest_even) == http_rangeset_length(hrs_even)); + g_assert(N_ITEMS(hrtest_even) == http_rangeset_count(hrs_even)); + g_assert(N_ITEMS(hrtest_odd) == http_rangeset_length(hrs_odd)); + g_assert(N_ITEMS(hrtest_odd) == http_rangeset_count(hrs_odd)); + + HTTP_RANGE_FOREACH(hrs_odd, hr) { + http_rangeset_insert(hrs_even, hr->start, hr->end); + } + + g_assert(http_rangeset_length(hrs_even) == + N_ITEMS(hrtest_even) + N_ITEMS(hrtest_odd)); + g_assert(1 == http_rangeset_count(hrs_even)); + + http_rangeset_free_null(&hrs_even); + g_info("%s(): test #%-2u OK at %s", G_STRFUNC, test++, G_STRLOC); + + hrs_even = HTTP_RANGE_TEST_LOAD(hrtest_even); + http_rangeset_merge(hrs_even, hrs_odd); + + g_assert(http_rangeset_length(hrs_even) == + N_ITEMS(hrtest_even) + N_ITEMS(hrtest_odd)); + g_assert(1 == http_rangeset_count(hrs_even)); + + http_rangeset_free_null(&hrs_even); + http_rangeset_free_null(&hrs_odd); + g_info("%s(): test #%-2u OK at %s", G_STRFUNC, test++, G_STRLOC); + + hrs_even = HTTP_RANGE_TEST_LOAD(hrtest_even); + hrs_odd = HTTP_RANGE_TEST_LOAD(hrtest_odd); + + HTTP_RANGE_FOREACH(hrs_even, hr) { + http_rangeset_insert(hrs_odd, hr->start, hr->end); + } + + g_assert(http_rangeset_length(hrs_odd) == + N_ITEMS(hrtest_even) + N_ITEMS(hrtest_odd)); + g_assert(1 == http_rangeset_count(hrs_odd)); + + http_rangeset_free_null(&hrs_odd); + g_info("%s(): test #%-2u OK at %s", G_STRFUNC, test++, G_STRLOC); + + hrs_odd = HTTP_RANGE_TEST_LOAD(hrtest_odd); + http_rangeset_merge(hrs_odd, hrs_even); + + g_assert(http_rangeset_length(hrs_odd) == + N_ITEMS(hrtest_even) + N_ITEMS(hrtest_odd)); + g_assert(1 == http_rangeset_count(hrs_odd)); + + http_rangeset_free_null(&hrs_even); + http_rangeset_free_null(&hrs_odd); + g_info("%s(): test #%-2u OK at %s", G_STRFUNC, test++, G_STRLOC); + + hrs_even = HTTP_RANGE_TEST_LOAD(hrtest_even); + hrs_over = HTTP_RANGE_TEST_LOAD(hrtest_overlap); + + HTTP_RANGE_FOREACH(hrs_even, hr) { + http_rangeset_insert(hrs_over, hr->start, hr->end); + } + + g_assert(http_rangeset_length(hrs_over) == + N_ITEMS(hrtest_even) + N_ITEMS(hrtest_odd)); + g_assert(1 == http_rangeset_count(hrs_over)); + + http_rangeset_free_null(&hrs_over); + g_info("%s(): test #%-2u OK at %s", G_STRFUNC, test++, G_STRLOC); + + hrs_over = HTTP_RANGE_TEST_LOAD(hrtest_overlap); + + HTTP_RANGE_FOREACH(hrs_over, hr) { + http_rangeset_insert(hrs_even, hr->start, hr->end); + } + + g_assert(http_rangeset_length(hrs_even) == + N_ITEMS(hrtest_even) + N_ITEMS(hrtest_odd)); + g_assert(1 == http_rangeset_count(hrs_even)); + + http_rangeset_free_null(&hrs_even); + http_rangeset_free_null(&hrs_over); + g_info("%s(): test #%-2u OK at %s", G_STRFUNC, test++, G_STRLOC); + + hrs_even = HTTP_RANGE_TEST_LOAD(hrtest_even); + hrs_odd = HTTP_RANGE_TEST_LOAD(hrtest_odd); + hrs_over = HTTP_RANGE_TEST_LOAD(hrtest_overlap); + + http_rangeset_merge(hrs_odd, hrs_over); + http_rangeset_merge(hrs_even, hrs_over); + + g_assert(http_rangeset_length(hrs_even) == + N_ITEMS(hrtest_even) + N_ITEMS(hrtest_odd)); + g_assert(1 == http_rangeset_count(hrs_even)); + + g_assert(http_rangeset_length(hrs_odd) == + N_ITEMS(hrtest_even) + N_ITEMS(hrtest_odd) - 1); + g_assert(2 == http_rangeset_count(hrs_odd)); /* 0-1, 3-9 */ + + http_rangeset_free_null(&hrs_even); + http_rangeset_free_null(&hrs_odd); + http_rangeset_free_null(&hrs_over); + g_info("%s(): test #%-2u OK at %s", G_STRFUNC, test++, G_STRLOC); + + hrs_partial = HTTP_RANGE_TEST_LOAD(hrtest_partial); + hrs_added = HTTP_RANGE_TEST_LOAD(hrtest_added); + hrs_result = HTTP_RANGE_TEST_LOAD(hrtest_result); + + g_assert(!http_rangeset_equal(hrs_partial, hrs_added)); + g_assert(!http_rangeset_equal(hrs_partial, hrs_result)); + g_assert(http_rangeset_equal(hrs_partial, hrs_partial)); + + http_rangeset_merge(hrs_partial, hrs_added); + + g_assert(http_rangeset_equal(hrs_partial, hrs_result)); + + http_rangeset_free_null(&hrs_partial); + g_info("%s(): test #%-2u OK at %s", G_STRFUNC, test++, G_STRLOC); + + hrs_partial = HTTP_RANGE_TEST_LOAD(hrtest_partial); + + http_rangeset_merge(hrs_added, hrs_partial); + + g_assert(http_rangeset_equal(hrs_added, hrs_result)); + + http_rangeset_free_null(&hrs_partial); + http_rangeset_free_null(&hrs_added); + http_rangeset_free_null(&hrs_result); + g_info("%s(): test #%-2u OK at %s", G_STRFUNC, test++, G_STRLOC); + + hrs_result = HTTP_RANGE_TEST_LOAD(hrtest_result); + s = str_new(0); + + str_printf(s, "bytes %s", http_rangeset_to_string(hrs_result)); + + { + enum http_range_extract_status status; + filesize_t start, end; + + status = http_range_extract_first("Test", str_2c(s), 70, "test", + &start, &end); + + g_assert(HTTP_RANGE_MULTI == status); + g_assert(hrtest_result0.start == start); + g_assert(hrtest_result0.end == end); + } + + g_info("%s(): test #%-2u OK at %s", G_STRFUNC, test++, G_STRLOC); + + { + http_rangeset_t *hrs; + + hrs = http_rangeset_extract("Test", str_2c(s), 70, "test"); + + g_assert(hrs != NULL); + g_assert(http_rangeset_equal(hrs, hrs_result)); + + http_rangeset_free_null(&hrs); + } + + str_destroy_null(&s); + http_rangeset_free_null(&hrs_result); + g_info("%s(): test #%-2u OK at %s", G_STRFUNC, test++, G_STRLOC); +} +#else /* !HTTP_RANGE_TESTING */ +void G_COLD +http_range_test(void) +{ + /* Empty */ +} +#endif /* HTTP_RANGE_TESTING */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/http_range.h
Added
@@ -0,0 +1,108 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * HTTP range handling routines. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _http_range_h_ +#define _http_range_h_ + +#include "common.h" + +/** + * HTTP range description. + * + * The `end' field defines the last byte of the range, and is therefore + * included in the range. + */ +typedef struct http_range { + filesize_t start; + filesize_t end; /**< HTTP_OFFSET_MAX if unbounded */ +} http_range_t; + +#define HTTP_OFFSET_MAX ((filesize_t) -1) + +struct http_rangeset; +typedef struct http_rangeset http_rangeset_t; + +/** + * Returned values for http_range_extract_first(). + */ +enum http_range_extract_status { + HTTP_RANGE_NONE = 0, /* No range found, parsing error */ + HTTP_RANGE_SINGLE, /* OK, there was only a single range */ + HTTP_RANGE_MULTI, /* Multiple ranges were present */ +}; + +/* + * Public interface. + */ + +void set_http_range_debug(uint32 level); + +http_rangeset_t *http_rangeset_create(void); +void http_rangeset_free_null(http_rangeset_t **hrs_ptr); +void http_rangeset_clear(http_rangeset_t *hrs); +void http_rangeset_insert(http_rangeset_t *hrs, + filesize_t start, filesize_t end); +filesize_t http_rangeset_length(const http_rangeset_t *hrs); +size_t http_rangeset_count(const http_rangeset_t *hrs); +const char *http_rangeset_to_string(const http_rangeset_t *hrs); +filesize_t http_rangeset_merge(http_rangeset_t *hd, const http_rangeset_t *hs); +bool http_rangeset_equal(const http_rangeset_t *h1, const http_rangeset_t *h2); +bool http_rangeset_contains(const http_rangeset_t *hrs, + filesize_t start, filesize_t end); +const http_range_t *http_rangeset_lookup(const http_rangeset_t *hrs, + filesize_t start, filesize_t end); +const http_range_t *http_rangeset_lookup_first(const http_rangeset_t *hrs, + filesize_t start, filesize_t end); + +http_rangeset_t *http_rangeset_extract(const char *field, const char *value, + filesize_t size, const char *vendor); +enum http_range_extract_status http_range_extract_first( + const char *field, const char *value, filesize_t size, const char *vendor, + filesize_t *start, filesize_t *end); + +const http_range_t *http_range_first(const http_rangeset_t *hrs); +const http_range_t *http_range_next(const http_rangeset_t *hrs, + const http_range_t *r); + +int http_range_overlap_cmp(const void *a, const void *b); + +void http_range_test(void); + +#define HTTP_RANGE_FOREACH(hrs, r) \ + for ((r) = http_range_first(hrs); \ + (r) != NULL; \ + (r) = http_range_next((hrs), (r))) + +#endif /* _http_range_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/idtable.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/idtable.c
Changed
@@ -25,27 +25,37 @@ * @ingroup lib * @file * + * Allocation of unique IDs tied to a value. + * * @author Richard Eckart * @date 2001 */ #include "common.h" -#include "lib/glib-missing.h" -#include "lib/idtable.h" -#include "lib/random.h" -#include "lib/walloc.h" +#include "idtable.h" +#include "htable.h" +#include "random.h" +#include "walloc.h" -#include "lib/override.h" /* Must be the last header included */ +#include "override.h" /* Must be the last header included */ -#define IDTABLE_MASK (((guint32)-1) >> 1) -#define IDTABLE_BASE (IDTABLE_MASK + 1) +enum idtable_magic { IDTABLE_MAGIC = 0x749afefb }; struct idtable { - GHashTable *ht; - guint32 last_id; + enum idtable_magic magic; + htable_t *ht; + uint32 last_id; + uint32 mask; }; +static inline void +idtable_check(const struct idtable * const tbl) +{ + g_assert(tbl != NULL); + g_assert(IDTABLE_MAGIC == tbl->magic); +} + /*** *** Public functions ***/ @@ -54,15 +64,17 @@ * Allocate new id table. */ idtable_t * -idtable_new(void) +idtable_new(int bits) { - static const idtable_t zero_idtable; idtable_t *tbl; - WALLOC(tbl); - *tbl = zero_idtable; - tbl->last_id = (random_u32() & IDTABLE_MASK) + IDTABLE_BASE; - tbl->ht = g_hash_table_new(NULL, NULL); + g_assert(bits > 0 && bits <= IDTABLE_MAXBITS); + + WALLOC0(tbl); + tbl->magic = IDTABLE_MAGIC; + tbl->mask = IDTABLE_MAXBITS == bits ? (uint32) -1 : ((1U << bits) - 1); + tbl->last_id = random_u32() & tbl->mask; + tbl->ht = htable_create(HASH_KEY_SELF, 0); return tbl; } @@ -73,7 +85,10 @@ void idtable_destroy(idtable_t *tbl) { - gm_hash_table_destroy_null(&tbl->ht); + idtable_check(tbl); + + htable_free_null(&tbl->ht); + tbl->magic = 0; WFREE(tbl); } @@ -82,34 +97,88 @@ * not in use. If the id is outside the current table range it also returns * FALSE. The table is not modified by this call. */ -gboolean -idtable_is_id_used(const idtable_t *tbl, guint32 id) +bool +idtable_is_id_used(const idtable_t *tbl, uint32 id) { - return gm_hash_table_contains(tbl->ht, uint_to_pointer(id)); + idtable_check(tbl); + + return htable_contains(tbl->ht, uint_to_pointer(id)); } /** * Get a id for the given value. The id can be used to look up the * value later. + * + * @param tbl the ID table + * @param id where the allocated ID is returned + * @param value value to associate to the allocated ID + * + * @return TRUE if the ID was allocated, FALSE if table is full. + * + * @return */ -guint32 -idtable_new_id(idtable_t *tbl, void *value) +bool +idtable_try_new_id(idtable_t *tbl, uint32 *id, void *value) { - while (idtable_is_id_used(tbl, tbl->last_id)) { - tbl->last_id = ((tbl->last_id + 1) & IDTABLE_MASK) + IDTABLE_BASE; + uint32 i = 0; + + idtable_check(tbl); + g_assert(id != NULL); + + /* + * Rotate through the whole ID space for three reasons: + * + * - to detect accidental reuse of a stale ID: someone keeping a copy of + * an ID that has already been freed. + * - to be able to use the ID table as a source of temporally unique IDs. + * - to accelerate the ID allocation, limiting the amount of probing in + * the ID space before finding a free ID. + * + * Therefore, start the lookup process one slot past the last allocated ID. + */ + + tbl->last_id = (tbl->last_id + 1) & tbl->mask; + + while (idtable_is_id_used(tbl, tbl->last_id) && i != tbl->mask) { + tbl->last_id = (tbl->last_id + 1) & tbl->mask; + i++; } - g_hash_table_insert(tbl->ht, uint_to_pointer(tbl->last_id), value); - return tbl->last_id; + + if G_UNLIKELY(i == tbl->mask) + return FALSE; /* Table is full */ + + htable_insert(tbl->ht, uint_to_pointer(tbl->last_id), value); + *id = tbl->last_id; + + return TRUE; } /** - * Replace the value of a give id. The id must already be in use. + * Get a id for the given value. The id can be used to look up the + * value later. + */ +uint32 +idtable_new_id(idtable_t *tbl, void *value) +{ + uint32 id; + + idtable_check(tbl); + + if (!idtable_try_new_id(tbl, &id, value)) + g_error("%s: table is full", G_STRFUNC); + + return id; +} + +/** + * Replace the value of a given id. The id must already be in use. */ void -idtable_set_value(idtable_t *tbl, guint32 id, void * value) +idtable_set_value(idtable_t *tbl, uint32 id, void *value) { g_assert(idtable_is_id_used(tbl, id)); - g_hash_table_replace(tbl->ht, uint_to_pointer(id), value); + + htable_insert(tbl->ht, uint_to_pointer(id), value); } /** @@ -118,13 +187,14 @@ * after it has been dropped by idtable_drop_id. */ void * -idtable_get_value(const idtable_t *tbl, guint32 id) +idtable_get_value(const idtable_t *tbl, uint32 id) { - void *key, *value; - gboolean found; + void *value; + bool found; + + idtable_check(tbl); - key = uint_to_pointer(id); - found = g_hash_table_lookup_extended(tbl->ht, key, NULL, &value); + found = htable_lookup_extended(tbl->ht, uint_to_pointer(id), NULL, &value); g_assert(found); return value; } @@ -138,25 +208,105 @@ * @return the value if the ID exists, NULL otherwise. */ void * -idtable_probe_value(const idtable_t *tbl, guint32 id) +idtable_probe_value(const idtable_t *tbl, uint32 id) { - return g_hash_table_lookup(tbl->ht, uint_to_pointer(id)); + idtable_check(tbl); + + return htable_lookup(tbl->ht, uint_to_pointer(id)); } /** * Mark this id as unused. It will eventually be reissued. */ void -idtable_free_id(idtable_t *tbl, guint32 id) +idtable_free_id(idtable_t *tbl, uint32 id) { g_assert(idtable_is_id_used(tbl, id)); - g_hash_table_remove(tbl->ht, uint_to_pointer(id)); + + htable_remove(tbl->ht, uint_to_pointer(id)); +} + +/** + * @return amount of IDs used in the table. + */ +size_t +idtable_count(idtable_t *tbl) +{ + idtable_check(tbl); + + return htable_count(tbl->ht); +} + +/** + * @return the highest possible ID of the table. + */ +size_t +idtable_max_id(idtable_t *tbl) +{ + idtable_check(tbl); + + return tbl->mask; } -guint -idtable_ids(idtable_t *tbl) + +struct idtable_foreach_ctx { + data_fn_t cb; + void *data; +}; + +static void +idtable_foreach_wrapper(const void *unused_key, void *value, void *data) +{ + struct idtable_foreach_ctx *ctx = data; + + (void) unused_key; + + (*ctx->cb)(value, ctx->data); +} + +/** + * Loop through all the values stored in the ID table. + */ +void +idtable_foreach(idtable_t *tbl, data_fn_t cb, void *data) { - return g_hash_table_size(tbl->ht); + struct idtable_foreach_ctx ctx; + + idtable_check(tbl); + + ctx.cb = cb; + ctx.data = data; + + htable_foreach(tbl->ht, idtable_foreach_wrapper, &ctx); +} + +struct idtable_foreach_id_ctx { + id_data_fn_t cb; + void *data; +}; + +static void +idtable_foreach_id_wrapper(const void *key, void *value, void *data) +{ + struct idtable_foreach_id_ctx *ctx = data; + + (*ctx->cb)(pointer_to_uint(key), value, ctx->data); +} + +/** + * Loop through all the IDs and values stored in the ID table. + */ +void +idtable_foreach_id(idtable_t *tbl, id_data_fn_t cb, void *data) +{ + struct idtable_foreach_id_ctx ctx; + + idtable_check(tbl); + + ctx.cb = cb; + ctx.data = data; + + htable_foreach(tbl->ht, idtable_foreach_id_wrapper, &ctx); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/idtable.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/idtable.h
Changed
@@ -25,26 +25,18 @@ * @ingroup lib * @file * - * Needs brief description here. + * Allocation of unique IDs tied to a value. * - * The idtable provides a automatically growing table which can resolve - * ids to values very fast. The ids are issues by the table and internally - * refer to an array row in the table. The table starts with an initial size - * and if full is extended by a definable number of rows. Initial size and - * extend size are internally rounded up to a multiple of 32. There is no - * limitation to the value and is can be queried whether a given id is in - * use. + * The idtable provides an automatic generation of unique IDs that fit + * into a specified amount of bits. * - * You can also request special id/value combinations, but you need to keep - * in mind that the ids are row numbers. The table is then automatically - * grown to contain the requested id, but you can't shrink it later, because - * that would mean that the row numbers change and the ids already issued - * would become invalid. + * IDs are associated with a value that can be quickly retrieved by its ID, + * and the value can be changed at will. * - * If the application needs to shrink a table, I suggest creating a new - * table and request the needed number of ids from that. Of course all - * ids currently in use by the application must be updated. Once that is - * done, flush and destroy the old table. + * The allocation strategy used for new IDs prevents reusing an older ID until + * we have allocated (and possibly already freed) all the other available IDs + * in the defined ID space. This helps detection of stale IDs and enables + * allocation of temporally unique IDs. * * @author Richard Eckart * @date 2001-2003 @@ -53,19 +45,34 @@ #ifndef _idtable_h_ #define _idtable_h_ -#include "common.h" +#include "common.h" + +#define IDTABLE_MAXBITS 32 /* Maximum width of IDs */ + +/** + * Callback signature used by idtable_foreach_id(). + * + * @param id the ID in the table + * @param value the value associated with the ID + * @param udata opaque user-specific data + */ +typedef void (*id_data_fn_t)(uint32 id, void *value, void *udata); struct idtable; typedef struct idtable idtable_t; -idtable_t *idtable_new(void); +idtable_t *idtable_new(int bits); void idtable_destroy(idtable_t *table); -guint idtable_ids(idtable_t *tbl); -guint32 idtable_new_id(idtable_t *tbl, void *value); -void idtable_free_id(idtable_t *tbl, guint32 id); -gboolean idtable_is_id_used(const idtable_t *tbl, guint32 id); -void idtable_set_value(idtable_t *tbl, guint32 id, void *value); -void *idtable_get_value(const idtable_t *tbl, guint32 id); -void *idtable_probe_value(const idtable_t *tbl, guint32 id); +size_t idtable_count(idtable_t *tbl); +size_t idtable_max_id(idtable_t *tbl); +uint32 idtable_new_id(idtable_t *tbl, void *value); +bool idtable_try_new_id(idtable_t *tbl, uint32 *id, void *value); +void idtable_free_id(idtable_t *tbl, uint32 id); +bool idtable_is_id_used(const idtable_t *tbl, uint32 id); +void idtable_set_value(idtable_t *tbl, uint32 id, void *value); +void *idtable_get_value(const idtable_t *tbl, uint32 id); +void *idtable_probe_value(const idtable_t *tbl, uint32 id); +void idtable_foreach(idtable_t *tbl, data_fn_t cb, void *data); +void idtable_foreach_id(idtable_t *tbl, id_data_fn_t cb, void *data); #endif /* _idtable_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/inputevt.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/inputevt.c
Changed
@@ -106,24 +106,35 @@ #include <sys/devpoll.h> #endif /* HAS_DEV_POLL */ +#include "inputevt.h" + #include "bit_array.h" #include "compat_poll.h" #include "fd.h" +#include "glib-missing.h" /* For g_main_context_get_poll_func() with GTK1 */ #include "hashlist.h" -#include "inputevt.h" -#include "glib-missing.h" +#include "htable.h" #include "log.h" /* For s_error() */ #include "misc.h" +#include "mutex.h" +#include "plist.h" +#include "pslist.h" +#include "stacktrace.h" +#include "stringify.h" +#include "thread.h" /* For thread_in_syscall_set() */ #include "tm.h" #include "walloc.h" +#include "xmalloc.h" + #include "override.h" /* Must be the last header included */ static unsigned inputevt_debug; +static unsigned inputevt_stid = THREAD_INVALID_ID; /** * Set debugging level. */ -void +void inputevt_set_debug(unsigned level) { inputevt_debug = level; @@ -145,6 +156,7 @@ { switch (cond) { #define CASE(x) case x: return #x + CASE(INPUT_EVENT_NONE); CASE(INPUT_EVENT_EXCEPTION); CASE(INPUT_EVENT_R); CASE(INPUT_EVENT_W); @@ -169,7 +181,7 @@ } inputevt_relay_t; typedef struct relay_list { - GSList *sl; + pslist_t *sl; size_t readers; size_t writers; unsigned poll_idx; @@ -181,23 +193,32 @@ unsigned data_available; }; +struct new_relay { + inputevt_relay_t *relay; + unsigned id; +}; + static const inputevt_handler_t zero_handler; static int (*default_poll_func)(GPollFD *, unsigned, int); struct poll_ctx { + mutex_t lock; /**< Thread-safe lock */ inputevt_relay_t **relay; /**< The relay contexts */ bit_array_t *used_event_id; /**< A bit array, which ID slots are used */ bit_array_t *used_poll_idx; /**< -"-, which Poll IDX slots are used */ - GSList *removed; /**< List of removed IDs */ - GHashTable *ht; /**< Records file descriptors */ + pslist_t *removed; /**< List of removed IDs */ + pslist_t *added_relays; /**< List of added relays */ + htable_t *ht; /**< Records file descriptors */ hash_list_t *readable; /**< Records readable file descriptors */ int master_fd; /**< The ``master'' fd for epoll or kqueue */ unsigned num_ev; /**< Length of the "ev" and "relay" arrays */ + unsigned num_ev_reserved; /**< Next reserved ID */ unsigned num_poll_idx; /**< Length of used_poll_idx array */ unsigned max_poll_idx; unsigned num_ready; /**< Used for /dev/poll only */ unsigned initialized:1; /**< TRUE if the context has been initialized */ unsigned dispatching:1; /**< TRUE if dispatching events */ + unsigned collecting:1; /**< TRUE when collecing / waiting for events */ #ifdef HAS_KQUEUE struct kevent *kev_arr; @@ -221,7 +242,19 @@ inputevt_cond_t, inputevt_cond_t); }; +/* + * The lock used by the context must be recursive since inputevt_remove() + * can be called in the middle of inputevt_timer(). + */ + +#define CTX_LOCK(c) mutex_lock(&c->lock) +#define CTX_UNLOCK(c) mutex_unlock(&c->lock) +#define CTX_IS_LOCKED(c) mutex_is_owned(&c->lock) + static unsigned data_available; + +static void inputevt_process_added(struct poll_ctx *ctx); + /** * @return A positive value indicates how much data is available for reading. * If zero is returned the amount of available data is unknown. @@ -239,11 +272,45 @@ return &ctx; } +/** + * Start "collecting" events through a possibly blocking system call. + */ +static void +inputevt_collect_start(struct poll_ctx *ctx, int timeout_ms) +{ + g_assert(CTX_IS_LOCKED(ctx)); + + ctx->collecting = TRUE; + CTX_UNLOCK(ctx); + + if (timeout_ms != 0) + thread_in_syscall_set(TRUE); +} + +/** + * End "collecting" events. + */ +static void +inputevt_collect_end(struct poll_ctx *ctx, int timeout_ms) +{ + g_assert(!CTX_IS_LOCKED(ctx)); + + if (timeout_ms != 0) + thread_in_syscall_set(FALSE); + + CTX_LOCK(ctx); + ctx->collecting = FALSE; + + if (ctx->added_relays != NULL) + inputevt_process_added(ctx); +} + static inline unsigned inputevt_poll_idx_new(struct poll_ctx *ctx, int fd) { unsigned idx; + g_assert(CTX_IS_LOCKED(ctx)); g_assert(is_valid_fd(fd)); if (ctx->num_poll_idx > 0) @@ -285,6 +352,7 @@ { const unsigned idx = *idx_ptr; + g_assert(CTX_IS_LOCKED(ctx)); g_assert(!ctx->dispatching); g_assert((unsigned) -1 != idx); g_assert(idx < ctx->num_poll_idx); @@ -307,7 +375,7 @@ pfd = &ctx->pfd_arrlast_idx; safety_assert(is_valid_fd(pfd->fd)); - rl = g_hash_table_lookup(ctx->ht, int_to_pointer(pfd->fd)); + rl = htable_lookup(ctx->ht, int_to_pointer(pfd->fd)); safety_assert(NULL != rl); safety_assert(last_idx == rl->poll_idx); @@ -334,6 +402,8 @@ const struct kevent *ev = &ctx->kev_arridx; struct event event; + g_assert(CTX_IS_LOCKED(ctx)); + event.fd = pointer_to_uint(KEVENT_UDATA_TO_PTR(ev->udata)); event.condition = EV_ERROR & ev->flags ? INPUT_EVENT_EXCEPTION : 0; switch (ev->filter) { @@ -361,6 +431,8 @@ void *udata; int ret; + g_assert(CTX_IS_LOCKED(ctx)); + if ((INPUT_EVENT_RW & old) == (INPUT_EVENT_RW & cur)) return 0; @@ -382,7 +454,7 @@ } if (-1 == (ret = kevent(ctx->master_fd, kev, i, NULL, 0, &zero_ts))) - s_error("kevent() failed: %m"); + s_error("%s(): kevent() failed: %m", G_STRFUNC); return ret; } @@ -391,9 +463,10 @@ event_check_all_with_kqueue(struct poll_ctx *ctx) { static const struct timespec zero_ts; - + g_assert(ctx); g_assert(ctx->initialized); + g_assert(CTX_IS_LOCKED(ctx)); return kevent(ctx->master_fd, NULL, 0, ctx->kev_arr, ctx->num_ev, &zero_ts); } @@ -407,7 +480,9 @@ const struct epoll_event *ev = &ctx->ep_arridx; struct event event; - event.fd = GPOINTER_TO_INT(ev->data.ptr); + g_assert(CTX_IS_LOCKED(ctx)); + + event.fd = pointer_to_int(ev->data.ptr); event.condition = ((EPOLLIN | EPOLLPRI | EPOLLHUP) & ev->events ? INPUT_EVENT_R : 0) | (EPOLLOUT & ev->events ? INPUT_EVENT_W : 0) @@ -424,6 +499,8 @@ struct epoll_event ev; int op; + g_assert(CTX_IS_LOCKED(ctx)); + old &= INPUT_EVENT_RW; cur &= INPUT_EVENT_RW; if (cur == old) @@ -452,7 +529,8 @@ { g_assert(ctx); g_assert(ctx->initialized); - + g_assert(CTX_IS_LOCKED(ctx)); + return epoll_wait(ctx->master_fd, ctx->ep_arr, ctx->num_ev, 0); } #endif /* HAS_EPOLL */ @@ -462,8 +540,11 @@ event_set_mask_with_dev_poll(struct poll_ctx *ctx, int fd, inputevt_cond_t old, inputevt_cond_t cur) { + g_assert(CTX_IS_LOCKED(ctx)); + old &= INPUT_EVENT_RW; cur &= INPUT_EVENT_RW; + if (cur != old) { static const struct pollfd zero_pfd; struct pollfd pfd2; @@ -498,16 +579,23 @@ static int collect_events_with_devpoll(struct poll_ctx *ctx, int timeout_ms) { - struct dvpoll dvp; + struct dvpoll dvp; int ret; + g_assert(timeout_ms >= 0); /* Never infinite (blocking) */ + g_assert(CTX_IS_LOCKED(ctx)); + dvp.dp_timeout = timeout_ms; dvp.dp_nfds = ctx->num_ev; dvp.dp_fds = ctx->pfd_arr; + inputevt_collect_start(ctx, timeout_ms); ret = ioctl(ctx->master_fd, DP_POLL, &dvp); + inputevt_collect_end(ctx, timeout_ms); + if (-1 == ret && !is_temporary_error(errno)) { - g_warning("check_dev_poll(): ioctl() failed: %m"); + s_warning("%s(): ioctl(%d, DP_POLL) failed: %m", + G_STRFUNC, ctx->master_fd); } return ret; } @@ -520,12 +608,13 @@ struct pollfd *pfd; relay_list_t *rl; + g_assert(CTX_IS_LOCKED(ctx)); g_assert(is_valid_fd(fd)); old &= INPUT_EVENT_RW; cur &= INPUT_EVENT_RW; - rl = g_hash_table_lookup(ctx->ht, int_to_pointer(fd)); + rl = htable_lookup(ctx->ht, int_to_pointer(fd)); g_assert(NULL != rl); g_assert(NULL != rl->sl); @@ -547,6 +636,7 @@ } #ifdef MINGW32 + static unsigned get_poll_idx(const struct poll_ctx *ctx, int fd) { @@ -554,9 +644,10 @@ safety_assert(is_valid_fd(fd)); safety_assert(is_open_fd(fd)); + g_assert(CTX_IS_LOCKED(ctx)); - rl = g_hash_table_lookup(ctx->ht, int_to_pointer(fd)); - g_assert(NULL != rl); + rl = htable_lookup(ctx->ht, int_to_pointer(fd)); + g_assert(rl != NULL); return rl->poll_idx; } @@ -568,6 +659,9 @@ unsigned i, num_fd = 0; int ret; + g_assert(timeout_ms >= 0); /* Never infinite (blocking) */ + g_assert(CTX_IS_LOCKED(ctx)); + /* FD_ZERO() */ r.fd_count = 0; w.fd_count = 0; @@ -603,20 +697,19 @@ if (0 == num_fd) return 0; - if (timeout_ms < 0) { - tv.tv_sec = 0; - tv.tv_usec = 0; - } else { + if (timeout_ms >= 0) { tv.tv_sec = timeout_ms / 1000; tv.tv_usec = (timeout_ms % 1000) * 1000UL; } + inputevt_collect_start(ctx, timeout_ms); ret = select(FD_SETSIZE, (void *) &r, (void *) &w, (void *) &x, timeout_ms < 0 ? NULL : &tv); + inputevt_collect_end(ctx, timeout_ms); if (ret < 0) { if (!is_temporary_error(errno)) { - g_warning("select() failed: %m"); + s_warning("%s(): select() failed: %m", G_STRFUNC); } return -1; } @@ -625,7 +718,7 @@ /* FD_ISSET() */ for (i = UNSIGNED(r.fd_count); i-- > 0; /* NOTHING */) { int fd = cast_to_fd(r.fd_arrayi); - ctx->pfd_arrget_poll_idx(ctx, fd).revents |= POLLIN; + ctx->pfd_arrget_poll_idx(ctx, fd).revents |= POLLIN; } for (i = UNSIGNED(w.fd_count); i-- > 0; /* NOTHING */) { int fd = cast_to_fd(w.fd_arrayi); @@ -645,9 +738,21 @@ { int ret; + g_assert(timeout_ms >= 0); /* Never infinite (blocking) */ + g_assert(CTX_IS_LOCKED(ctx)); + + /* + * Since compat_poll() already accounts for the system call, we pass + * a timeout of 0 to make sure inputevt_collect_start() is not declaring + * it again to the thread layer. + */ + + inputevt_collect_start(ctx, 0); ret = compat_poll(ctx->pfd_arr, ctx->max_poll_idx, timeout_ms); + inputevt_collect_end(ctx, 0); + if (-1 == ret && !is_temporary_error(errno)) { - g_warning("collect_events(): poll() failed: %m"); + s_warning("%s(): poll() failed: %m", G_STRFUNC); } return ret; } @@ -655,7 +760,11 @@ static int event_check_all_with_poll(struct poll_ctx *ctx) { - int ret = ctx->num_ready; + int ret; + + g_assert(CTX_IS_LOCKED(ctx)); + + ret = ctx->num_ready; ctx->num_ready = 0; return ret; } @@ -666,6 +775,8 @@ const struct pollfd *pfd = &ctx->pfd_arridx; struct event event; + g_assert(CTX_IS_LOCKED(ctx)); + event.fd = pfd->fd; event.data_available = 0; event.condition = ((POLLIN | POLLHUP) & pfd->revents ? INPUT_EVENT_R : 0) @@ -682,6 +793,7 @@ int ret, timeout_ms; g_assert(ctx); + g_assert(CTX_IS_LOCKED(ctx)); g_assert(timeout_ms_ptr); g_assert(0 == ctx->num_ready); @@ -691,6 +803,12 @@ return; } + /* + * Make sure event checking is non-blocking: if the timeout is negative, + * then force 0 to ensure the application will not block if the kernel + * has no pending events to report. + */ + timeout_ms = *timeout_ms_ptr; timeout_ms = MAX(0, timeout_ms); @@ -710,12 +828,14 @@ */ if (*timeout_ms_ptr >= 0 || ret > 0) { *timeout_ms_ptr = timeout_ms; - } + } } void inputevt_poll_idx_compact(struct poll_ctx *ctx) { + CTX_LOCK(ctx); + if (inputevt_debug > 9) { str_t *str = str_new_from("pollfd = {"); unsigned num_unused = 0; @@ -736,9 +856,9 @@ } g_assert(num_unused <= ctx->max_poll_idx); - str_cat(str, "}"); - g_debug("%s (used=%u, unused=%u)", - str_2c(str), ctx->max_poll_idx - num_unused, num_unused); + str_putc(str, '}'); + s_debug("%s(): %s (used=%u, unused=%u)", + G_STRFUNC, str_2c(str), ctx->max_poll_idx - num_unused, num_unused); str_destroy_null(&str); /* Indices max_poll_idx...num_poll_idx must not be used! */ @@ -748,6 +868,8 @@ g_assert(!bit_array_get(ctx->used_poll_idx, i)); } } + + CTX_UNLOCK(ctx); } static void @@ -758,22 +880,23 @@ g_assert(id > 0); g_assert(id < ctx->num_ev); + g_assert(CTX_IS_LOCKED(ctx)); relay = ctx->relayid; g_assert(relay); g_assert(zero_handler == relay->handler); g_assert(is_valid_fd(relay->fd)); - rl = g_hash_table_lookup(ctx->ht, int_to_pointer(relay->fd)); + rl = htable_lookup(ctx->ht, int_to_pointer(relay->fd)); g_assert(NULL != rl); g_assert(NULL != rl->sl); - - rl->sl = g_slist_remove(rl->sl, uint_to_pointer(id)); + + rl->sl = pslist_remove(rl->sl, uint_to_pointer(id)); if (NULL == rl->sl) { g_assert(0 == rl->readers && 0 == rl->writers); inputevt_poll_idx_free(ctx, &rl->poll_idx); hash_list_remove(ctx->readable, int_to_pointer(relay->fd)); - g_hash_table_remove(ctx->ht, int_to_pointer(relay->fd)); + htable_remove(ctx->ht, int_to_pointer(relay->fd)); WFREE(rl); } } @@ -784,13 +907,15 @@ static void inputevt_purge_removed(struct poll_ctx *ctx) { - GSList *sl; + pslist_t *sl; - for (sl = ctx->removed; NULL != sl; sl = g_slist_next(sl)) { + g_assert(CTX_IS_LOCKED(ctx)); + + PSLIST_FOREACH(ctx->removed, sl) { inputevt_relay_t *relay; unsigned id; - id = GPOINTER_TO_UINT(sl->data); + id = pointer_to_uint(sl->data); g_assert(id > 0); g_assert(id < ctx->num_ev); @@ -798,41 +923,52 @@ bit_array_clear(ctx->used_event_id, id); relay = ctx->relayid; - relay_list_remove(ctx, id); + relay_list_remove(ctx, id); WFREE(relay); ctx->relayid = NULL; } - gm_slist_free_null(&ctx->removed); + pslist_free_null(&ctx->removed); } -static G_GNUC_HOT void +/** + * Our main I/O event dispatching loop. + */ +static void G_HOT inputevt_timer(struct poll_ctx *ctx) { int num_events; - g_assert(ctx); + g_assert(ctx != NULL); + + CTX_LOCK(ctx); + g_assert(ctx->initialized); - g_assert(ctx->ht); + g_assert(ctx->ht != NULL); /* Maybe this must safely fail for general use, thus no assertion */ - g_return_if_fail(!ctx->dispatching); + if (ctx->dispatching) { + CTX_UNLOCK(ctx); + s_critical("%s(): called recursively / concurrently", G_STRFUNC); + return; + } num_events = (*ctx->event_check_all)(ctx); if (-1 == num_events && !is_temporary_error(errno)) { - g_warning("event_check_all(%d) failed: %m", ctx->master_fd); + s_warning("%s(): event_check_all(%d) failed with %s(): %m", + G_STRFUNC, ctx->master_fd, + stacktrace_function_name(ctx->event_check_all)); } ctx->dispatching = TRUE; if (num_events > 0) { unsigned idx; + pslist_t *evlist = NULL, *es; g_assert(UNSIGNED(num_events) <= ctx->num_ev); - + for (idx = 0; num_events > 0 && idx < ctx->num_ev; idx++) { - relay_list_t *rl; - GSList *sl; struct event event; event = (*ctx->event_get)(ctx, idx); @@ -842,7 +978,24 @@ continue; num_events--; - rl = g_hash_table_lookup(ctx->ht, int_to_pointer(event.fd)); + evlist = pslist_prepend(evlist, WCOPY(&event)); + } + + /* + * Invoke I/O callbacks without any locks. + * + * Becauuse ctx->dispatching is TRUE, no changes to the relay list + * can happen concurrently (hopefully -- RAM). + */ + + CTX_UNLOCK(ctx); + + PSLIST_FOREACH(evlist, es) { + relay_list_t *rl; + pslist_t *sl; + struct event *event = es->data; + + rl = htable_lookup(ctx->ht, int_to_pointer(event->fd)); g_assert(NULL != rl); g_assert((0 == rl->readers && 0 == rl->writers) || NULL != rl->sl); @@ -850,46 +1003,62 @@ inputevt_relay_t *relay; unsigned id; - id = GPOINTER_TO_UINT(sl->data); + id = pointer_to_uint(sl->data); g_assert(id > 0); g_assert(id < ctx->num_ev); - sl = g_slist_next(sl); + sl = pslist_next(sl); relay = ctx->relayid; g_assert(relay); - g_assert(relay->fd == event.fd); + g_assert(relay->fd == event->fd); - if (zero_handler == relay->handler) + if G_UNLIKELY(zero_handler == relay->handler) continue; - if (relay->condition & event.condition) { - data_available = event.data_available; - relay->handler(relay->data, relay->fd, event.condition); + if (relay->condition & event->condition) { + data_available = event->data_available; + relay->handler(relay->data, relay->fd, event->condition); } } + + WFREE(event); } + + pslist_free_null(&evlist); + CTX_LOCK(ctx); } if (hash_list_length(ctx->readable) > 0) { - GList *iter, *list = hash_list_list(ctx->readable); + plist_t *iter, *list = hash_list_list(ctx->readable); hash_list_clear(ctx->readable); + /* + * Now that we snapshot the list of readable file descriptors, we + * can release the context lock to make sure callbacks are invoked + * with not locks held. + * + * Same as above for regular fd events, we hope that the relay list + * will not be concurrently updated in a way that would corrupt our + * processing whilst we no longer hold the lock. --RAM + */ + + CTX_UNLOCK(ctx); + if (inputevt_debug > 2) { - unsigned long count = g_list_length(list); - g_debug("%s: %lu fake event%s", G_STRFUNC, - count, 1 == count ? "" : "s"); + unsigned long count = plist_length(list); + s_debug("%s(): %lu fake event%s", G_STRFUNC, count, plural(count)); } - for (iter = list; NULL != iter; iter = g_list_next(iter)) { - int fd = GPOINTER_TO_INT(iter->data); + PLIST_FOREACH(list, iter) { + int fd = pointer_to_int(iter->data); relay_list_t *rl; - GSList *sl; + pslist_t *sl; g_assert(is_valid_fd(fd)); - rl = g_hash_table_lookup(ctx->ht, int_to_pointer(fd)); + rl = htable_lookup(ctx->ht, int_to_pointer(fd)); g_assert(NULL != rl); g_assert((0 == rl->readers && 0 == rl->writers) || NULL != rl->sl); @@ -897,8 +1066,8 @@ inputevt_relay_t *relay; unsigned id; - id = GPOINTER_TO_UINT(sl->data); - sl = g_slist_next(sl); + id = pointer_to_uint(sl->data); + sl = pslist_next(sl); g_assert(id > 0); g_assert(id < ctx->num_ev); @@ -907,7 +1076,7 @@ g_assert(relay); g_assert(relay->fd == fd); - if (zero_handler == relay->handler) + if G_UNLIKELY(zero_handler == relay->handler) continue; if (INPUT_EVENT_R & relay->condition) { @@ -916,24 +1085,32 @@ } } } - gm_list_free_null(&list); + plist_free_null(&list); + CTX_LOCK(ctx); } - + ctx->dispatching = FALSE; if (ctx->removed) { inputevt_purge_removed(ctx); } + + CTX_UNLOCK(ctx); } -static gboolean +/** + * Trampoline function bridging glib's event loop with ours. + */ +static bool dispatch_poll(GIOChannel *unused_source, GIOCondition unused_cond, void *udata) { + struct poll_ctx *ctx = udata; + (void) unused_cond; (void) unused_source; - inputevt_timer(udata); + inputevt_timer(ctx); return TRUE; } @@ -942,31 +1119,43 @@ { struct poll_ctx *ctx; int r; + bool dispatching; ctx = get_global_poll_ctx(); g_assert(ctx); g_assert(ctx->initialized); + CTX_LOCK(ctx); + if (0 == ctx->num_ready) { check_for_events(ctx, &timeout_ms); } - if (ctx->num_ready > 0) { + dispatching = ctx->num_ready > 0; + + CTX_UNLOCK(ctx); + + if (dispatching) { dispatch_poll(NULL, 0, ctx); } + CTX_LOCK(ctx); + + inputevt_collect_start(ctx, timeout_ms); r = default_poll_func(gfds, n, timeout_ms); + inputevt_collect_end(ctx, timeout_ms); + + CTX_UNLOCK(ctx); #ifdef INPUTEVT_DEBUGGING if (-1 == r) { - g_warning("INPUTEVT default poll function failed: %m"); + s_warning("%s(): INPUTEVT default poll function failed: %m", G_STRFUNC); } #endif return r; } - /** * @todo TODO: * @@ -979,8 +1168,8 @@ * * For kqueue it might be possible to queue up kevent changes until the * next kevent() polling call but use the above mentioned hinting to - * flush the kevent calls. This useful because unlike epoll, kqueue allows to - * add/modify/delete multiple events per syscall. The knowledge about closed + * flush the kevent calls. This is useful because unlike epoll, kqueue allows + * to add/modify/delete multiple events per syscall. The knowledge about closed * descriptors is necessary as kevent() fails with EBADF otherwise and it * must be kept in mind, that file descriptor numbers are recycled. */ @@ -995,7 +1184,7 @@ int fd; id = *id_ptr; - if (0 == id) + if G_UNLIKELY(0 == id) return; ctx = get_global_poll_ctx(); @@ -1005,13 +1194,15 @@ g_assert(id < ctx->num_ev); g_assert(0 != bit_array_get(ctx->used_event_id, id)); + CTX_LOCK(ctx); + relay = ctx->relayid; g_assert(NULL != relay); g_assert(zero_handler != relay->handler); g_assert(is_valid_fd(relay->fd)); fd = relay->fd; - rl = g_hash_table_lookup(ctx->ht, int_to_pointer(fd)); + rl = htable_lookup(ctx->ht, int_to_pointer(fd)); g_assert(NULL != rl); g_assert(NULL != rl->sl); @@ -1032,82 +1223,80 @@ (rl->writers ? INPUT_EVENT_W : 0); if (-1 == (*ctx->event_set_mask)(ctx, fd, old, cur)) { - g_warning("event_set_mask(%d, %d) failed: %m", ctx->master_fd, fd); + s_warning("%s(): event_set_mask(%d, %d) failed using %s(): %m", + G_STRFUNC, ctx->master_fd, fd, + stacktrace_function_name(ctx->event_set_mask)); + } + + if (inputevt_debug > 3) { + s_debug("%s(): fd=%d, cond=%s, handler was %s()", + G_STRFUNC, fd, inputevt_cond_to_string(relay->condition), + stacktrace_function_name(relay->handler)); } /* Mark as removed */ relay->handler = zero_handler; - if (ctx->dispatching) { + if (ctx->dispatching || ctx->collecting) { /* * Don't clear the "used_event_id" bit yet because this slot must * not be recycled whilst dispatching events. */ - ctx->removed = g_slist_prepend(ctx->removed, GUINT_TO_POINTER(id)); + ctx->removed = pslist_prepend(ctx->removed, uint_to_pointer(id)); } else { - relay_list_remove(ctx, id); + relay_list_remove(ctx, id); WFREE(relay); ctx->relayid = NULL; bit_array_clear(ctx->used_event_id, id); } *id_ptr = 0; + + CTX_UNLOCK(ctx); } static inline unsigned inputevt_get_free_id(const struct poll_ctx *ctx) { + g_assert(CTX_IS_LOCKED(ctx)); + if (0 == ctx->num_ev) return (unsigned) -1; - + return bit_array_first_clear(ctx->used_event_id, 0, ctx->num_ev - 1); } -static unsigned -inputevt_add_source(inputevt_relay_t *relay) +static void +inputevt_add_source(struct poll_ctx *ctx, inputevt_relay_t *relay, uint id) { - struct poll_ctx *ctx; inputevt_cond_t old; - unsigned f, id; - ctx = get_global_poll_ctx(); - g_assert(ctx->initialized); + g_assert(CTX_IS_LOCKED(ctx)); g_assert(is_valid_fd(relay->fd)); + g_assert(id != 0); - g_assert(ctx->ht); - - f = inputevt_get_free_id(ctx); - g_assert((unsigned) -1 == f || f < ctx->num_ev); - - if ((unsigned) -1 != f) { - id = f; - } else { - unsigned i, n = ctx->num_ev; + if (id >= ctx->num_ev) { + unsigned n = ctx->num_ev, i = n; /* - * If there was no free ID, the arrays are resized to the - * double size. + * If there was no free ID, the size of arrays is doubled. */ - ctx->num_ev = 0 != n ? n << 1 : 32; + while (i <= ctx->num_ev_reserved) + i = ctx->num_ev = 0 != i ? i << 1 : 32; + + ctx->num_ev_reserved = i; + + g_assert(id < ctx->num_ev_reserved); #ifdef HAS_KQUEUE - { - size_t size = ctx->num_ev * sizeof ctx->kev_arr0; - ctx->kev_arr = g_realloc(ctx->kev_arr, size); - } -#endif /* HAS_KQUEUE */ + XREALLOC_ARRAY(ctx->kev_arr, ctx->num_ev); +#endif #ifdef HAS_EPOLL - { - size_t size = ctx->num_ev * sizeof ctx->ep_arr0; - ctx->ep_arr = g_realloc(ctx->ep_arr, size); - } -#endif /* HAS_EPOLL */ + XREALLOC_ARRAY(ctx->ep_arr, ctx->num_ev); +#endif - { - size_t size = ctx->num_ev * sizeof ctx->pfd_arr0; - ctx->pfd_arr = g_realloc(ctx->pfd_arr, size); - } + XREALLOC_ARRAY(ctx->pfd_arr, ctx->num_ev); for (i = n; i < ctx->num_ev; i++) { struct pollfd *pfd = &ctx->pfd_arri; @@ -1118,33 +1307,25 @@ bit_array_resize(&ctx->used_event_id, n, ctx->num_ev); - if (0 == n) { - /* ID 0 is reserved for compatibility with GLib's IDs */ - bit_array_set(ctx->used_event_id, 0); - id = 1; - } else { - id = n; - } + XREALLOC_ARRAY(ctx->relay, ctx->num_ev); + for (i = n; i < ctx->num_ev; i++) + ctx->relayi = NULL; - { - size_t size = ctx->num_ev * sizeof ctx->relay0; - ctx->relay = g_realloc(ctx->relay, size); - for (i = n; i < ctx->num_ev; i++) - ctx->relayi = NULL; - } + /* ID 0 is reserved for compatibility with GLib's IDs */ + if (0 == n) + bit_array_set(ctx->used_event_id, 0); } g_assert(id < ctx->num_ev); - bit_array_set(ctx->used_event_id, id); - g_assert(0 != bit_array_get(ctx->used_event_id, id)); + bit_array_set(ctx->used_event_id, id); ctx->relayid = relay; { void *key = int_to_pointer(relay->fd); relay_list_t *rl; - rl = g_hash_table_lookup(ctx->ht, key); + rl = htable_lookup(ctx->ht, key); if (rl) { if (rl->writers || rl->readers) { @@ -1153,7 +1334,7 @@ g_assert(NULL != rl->sl); - x = GPOINTER_TO_UINT(rl->sl->data); + x = pointer_to_uint(rl->sl->data); g_assert(x != id); g_assert(x > 0); g_assert(x < ctx->num_ev); @@ -1171,7 +1352,7 @@ rl->sl = NULL; rl->poll_idx = inputevt_poll_idx_new(ctx, relay->fd); old = 0; - g_hash_table_insert(ctx->ht, key, rl); + htable_insert(ctx->ht, key, rl); } if (INPUT_EVENT_R & relay->condition) @@ -1179,19 +1360,38 @@ if (INPUT_EVENT_W & relay->condition) rl->writers++; - rl->sl = g_slist_prepend(rl->sl, GUINT_TO_POINTER(id)); + rl->sl = pslist_prepend(rl->sl, uint_to_pointer(id)); } - if + if (-1 == (*ctx->event_set_mask)(ctx, relay->fd, old, (old | relay->condition)) ) { - g_error("event_set_mask(%d, %d, ...) failed: %m", - ctx->master_fd, relay->fd); + s_error("%s(): event_set_mask(%d, %d, ...) failed using %s(): %m", + G_STRFUNC, ctx->master_fd, relay->fd, + stacktrace_function_name(ctx->event_set_mask)); + } +} + +/** + * Process added sources. + */ +static void +inputevt_process_added(struct poll_ctx *ctx) +{ + pslist_t *sl; + + g_assert(CTX_IS_LOCKED(ctx)); + g_assert(!ctx->collecting); + + PSLIST_FOREACH(ctx->added_relays, sl) { + struct new_relay *nr = sl->data; + + inputevt_add_source(ctx, nr->relay, nr->id); + WFREE(nr); } - g_assert(0 != id); - return id; + pslist_free_null(&ctx->added_relays); } void @@ -1201,16 +1401,20 @@ void *key = int_to_pointer(fd); if (inputevt_debug > 3) { - g_debug("%s: fd=%d", G_STRFUNC, fd); + s_debug("%s(): fd=%d", G_STRFUNC, fd); } g_assert(is_valid_fd(fd)); + CTX_LOCK(ctx); + if ( - gm_hash_table_contains(ctx->ht, key) && + htable_contains(ctx->ht, key) && !hash_list_contains(ctx->readable, key) ) { hash_list_append(ctx->readable, key); } + + CTX_UNLOCK(ctx); } static int @@ -1218,12 +1422,14 @@ #ifdef HAS_KQUEUE { const int fd = kqueue(); - + if (!is_valid_fd(fd)) { - g_warning("kqueue() failed: %m"); + s_warning("%s(): kqueue() failed: %m", G_STRFUNC); return -1; } + g_assert(CTX_IS_LOCKED(ctx)); + g_main_context_set_poll_func(NULL, default_poll_func); ctx->master_fd = fd; ctx->polling_method = "kqueue()"; @@ -1245,13 +1451,15 @@ init_with_devpoll(struct poll_ctx *ctx) #ifdef HAS_DEV_POLL { - const int fd = get_non_stdio_fd(open("/dev/poll", O_RDWR)); + const int fd = fd_get_non_stdio(open("/dev/poll", O_RDWR)); if (!is_valid_fd(fd)) { - g_warning("open(\"/dev/poll\", O_RDWR) failed: %m"); + s_warning("%s(): open(\"/dev/poll\", O_RDWR) failed: %m", G_STRFUNC); return -1; } + g_assert(CTX_IS_LOCKED(ctx)); + g_main_context_set_poll_func(NULL, default_poll_func); ctx->master_fd = fd; ctx->polling_method = "/dev/poll"; @@ -1276,10 +1484,12 @@ const int fd = epoll_create(1024 /* Just an arbitrary value as hint */); if (!is_valid_fd(fd)) { - g_warning("epoll_create() failed: %m"); + s_warning("%s(): epoll_create() failed: %m", G_STRFUNC); return -1; } + g_assert(CTX_IS_LOCKED(ctx)); + g_main_context_set_poll_func(NULL, default_poll_func); ctx->master_fd = fd; ctx->polling_method = "epoll()"; @@ -1302,6 +1512,8 @@ { default_poll_func = g_main_context_get_poll_func(NULL); + g_assert(CTX_IS_LOCKED(ctx)); + g_main_context_set_poll_func(NULL, poll_func); ctx->master_fd = -1; ctx->polling_method = "poll()"; @@ -1321,6 +1533,15 @@ } /** + * @return the thread ID where the I/O event loop runs from. + */ +unsigned +inputevt_thread_id(void) +{ + return inputevt_stid; +} + +/** * Performs module initialization. * @param use_poll If TRUE, kqueue(), epoll(), /dev/poll etc. won't be used. */ @@ -1330,11 +1551,22 @@ struct poll_ctx *ctx; ctx = get_global_poll_ctx(); + inputevt_stid = thread_small_id(); + g_assert(!ctx->initialized); - ctx->initialized = TRUE; - ctx->ht = g_hash_table_new(NULL, NULL); + ctx->ht = htable_create(HASH_KEY_SELF, 0); ctx->readable = hash_list_new(NULL, NULL); + mutex_init(&ctx->lock); + + /* + * This hash table can be accessed from inputevt_timer() without the + * context lock, hence it needs to be marked thread-safe. + */ + + htable_thread_safe(ctx->ht); + + CTX_LOCK(ctx); init_with_poll(ctx); /* Must be called first and provides the default */ @@ -1346,10 +1578,12 @@ } } + CTX_UNLOCK(ctx); + if (is_valid_fd(ctx->master_fd)) { GIOChannel *ch; - set_close_on_exec(ctx->master_fd); /* Just in case */ + fd_set_close_on_exec(ctx->master_fd); /* Just in case */ ch = g_io_channel_unix_new(ctx->master_fd); @@ -1361,7 +1595,7 @@ } #ifdef INPUTEVT_DEBUGGING - g_info("INPUTEVT using customized I/O dispatching with %s", + s_info("INPUTEVT using customized I/O dispatching with %s", ctx->polling_method); #endif } @@ -1378,6 +1612,8 @@ inputevt_handler_t handler, void *data) { inputevt_relay_t *relay; + struct poll_ctx *ctx; + uint id; g_assert(is_valid_fd(fd)); g_assert(zero_handler != handler); @@ -1385,6 +1621,11 @@ safety_assert(is_open_fd(fd)); safety_assert(is_a_socket(fd) || is_a_fifo(fd)); + ctx = get_global_poll_ctx(); + + g_assert(ctx->initialized); + g_assert(ctx->ht != NULL); + switch (cond) { case INPUT_EVENT_RX: case INPUT_EVENT_R: @@ -1394,7 +1635,9 @@ case INPUT_EVENT_RW: goto cond_is_okay; case INPUT_EVENT_EXCEPTION: - g_error("must not specify INPUT_EVENT_EXCEPTION only!"); + s_error("%s(): cannot specify INPUT_EVENT_EXCEPTION only!", G_STRFUNC); + case INPUT_EVENT_NONE: + s_error("%s(): cannot specify INPUT_EVENT_NONE only!", G_STRFUNC); } g_assert_not_reached(); @@ -1405,7 +1648,57 @@ relay->data = data; relay->fd = fd; - return inputevt_add_source(relay); + if (inputevt_debug > 3) { + s_debug("%s(): fd=%d, cond=%s, handler=%s()", + G_STRFUNC, fd, inputevt_cond_to_string(cond), + stacktrace_function_name(handler)); + } + + /* + * We cannot resize the arrays used to collect events if we are in + * the middle of a collection because the context is unlocked when + * this happens (since we are in a system call and cannot block other + * threads wishing to add / remove sources by keeping the context locked). + * + * However, we need to synchronously return an ID to the caller, so we + * need to decide now and reserve the ID without necessarily adding the + * source. + */ + + CTX_LOCK(ctx); + + { + uint f = inputevt_get_free_id(ctx); + g_assert((unsigned) -1 == f || f < ctx->num_ev); + + if ((unsigned) -1 != f) { + id = f; + bit_array_set(ctx->used_event_id, id); + } else { + id = ctx->num_ev_reserved++; + } + + /* ID 0 is reserved for compatibility with GLib's IDs */ + if G_UNLIKELY(0 == id) { + id = 1; + ctx->num_ev_reserved = 1; + } + } + + if (ctx->collecting) { + struct new_relay *nr; + + WALLOC(nr); + nr->relay = relay; + nr->id = id; + ctx->added_relays = pslist_prepend(ctx->added_relays, nr); + } else { + inputevt_add_source(ctx, relay, id); + } + + CTX_UNLOCK(ctx); + + return id; } /** @@ -1417,7 +1710,9 @@ void inputevt_dispatch(void) { - inputevt_timer(get_global_poll_ctx()); + struct poll_ctx *ctx = get_global_poll_ctx(); + + inputevt_timer(ctx); } /** @@ -1427,17 +1722,24 @@ inputevt_close(void) { struct poll_ctx *ctx; - + ctx = get_global_poll_ctx(); + inputevt_stid = THREAD_INVALID_ID; + + CTX_LOCK(ctx); + inputevt_purge_removed(ctx); - gm_hash_table_destroy_null(&ctx->ht); + htable_free_null(&ctx->ht); hash_list_free(&ctx->readable); G_FREE_NULL(ctx->used_poll_idx); G_FREE_NULL(ctx->used_event_id); - G_FREE_NULL(ctx->relay); - G_FREE_NULL(ctx->pfd_arr); + XFREE_NULL(ctx->relay); + XFREE_NULL(ctx->pfd_arr); fd_close(&ctx->master_fd); ctx->initialized = FALSE; + + CTX_UNLOCK(ctx); + mutex_destroy(&ctx->lock); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/inputevt.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/inputevt.h
Changed
@@ -37,7 +37,7 @@ #ifndef _inputevt_h_ #define _inputevt_h_ -#include "common.h" +#include "common.h" /** * This mimics the GDK input condition type. @@ -47,11 +47,13 @@ INPUT_EVENT_W = 1 << 1, /* poll for Write events */ INPUT_EVENT_EXCEPTION = 1 << 2, /* poll for exceptions */ - INPUT_EVENT_RX = ((unsigned) INPUT_EVENT_R | (guint) INPUT_EVENT_EXCEPTION), - INPUT_EVENT_WX = ((unsigned) INPUT_EVENT_W | (guint) INPUT_EVENT_EXCEPTION), - - INPUT_EVENT_RW = ((unsigned) INPUT_EVENT_R | (guint) INPUT_EVENT_W), - INPUT_EVENT_RWX = ((unsigned) INPUT_EVENT_RW | (guint) INPUT_EVENT_EXCEPTION) + INPUT_EVENT_NONE = 0, + + INPUT_EVENT_RX = ((uint) INPUT_EVENT_R | (uint) INPUT_EVENT_EXCEPTION), + INPUT_EVENT_WX = ((uint) INPUT_EVENT_W | (uint) INPUT_EVENT_EXCEPTION), + + INPUT_EVENT_RW = ((uint) INPUT_EVENT_R | (uint) INPUT_EVENT_W), + INPUT_EVENT_RWX = ((uint) INPUT_EVENT_RW | (uint) INPUT_EVENT_EXCEPTION) } inputevt_cond_t; /** @@ -65,13 +67,14 @@ /* * Module initialization and cleanup functions. - * These don't do anything and are not called (yet). */ + void inputevt_init(int use_poll); void inputevt_close(void); void inputevt_dispatch(void); void inputevt_set_debug(unsigned level); +unsigned inputevt_thread_id(void); /** * This emulates the GDK input interface.
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/iovec.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/iovec.h
Changed
@@ -26,6 +26,8 @@ #include "common.h" +#include "xmalloc.h" + /** * Allocates an array of "struct iov" elements. * @param n The desired array length in elements. @@ -39,12 +41,12 @@ g_assert_not_reached(); /* We don't want to handle failed allocations */ return NULL; } - iov = g_malloc(n * sizeof *iov); + XMALLOC0_ARRAY(iov, n); return iov; } static inline iovec_t -iov_get(gpointer base, size_t size) +iov_get(void *base, size_t size) { static const iovec_t zero_iov; iovec_t iov; @@ -56,6 +58,15 @@ } /** + * Free array of "struct iov" elements allocated via iov_alloc_n(). + */ +static inline void +iov_free(iovec_t *iov) +{ + xfree(iov); +} + +/** * Resets an array of "struct iov" elements, so that iov_base is NULL * and iov_len is 0 for each element. * @@ -84,7 +95,7 @@ * @param size The amount of bytes to copy from "src". * @return The amount of elements initialized. Thus, MIN(iov_cnt, argc). */ -static inline size_t +static inline size_t iov_init_from_string_vector(iovec_t *iov, size_t iov_cnt, char *argv, size_t argc) { @@ -107,7 +118,7 @@ * * @return TRUE if b->iov_base directly follows after &a->iov_basea->iov_len. */ -static inline G_GNUC_PURE gboolean +static inline G_PURE bool iov_is_contiguous(const iovec_t * const a, const iovec_t * const b) { g_assert(a); @@ -123,7 +134,7 @@ * @param iov_cnt The array length of iov. * @return The amount contiguous bytes. */ -static inline size_t +static inline size_t iov_contiguous_size(const iovec_t *iov, size_t iov_cnt) { iovec_t iov0; @@ -157,7 +168,7 @@ iov_clear(iovec_t *iov, size_t byte_offset) { g_assert(iov); - + if (byte_offset < iovec_len(iov)) { char *p = iovec_base(iov); memset(&pbyte_offset, 0, iovec_len(iov) - byte_offset); @@ -172,7 +183,7 @@ * @param iov_cnt The array length of iov. * @return The sum of all buffer sizes. */ -static inline G_GNUC_PURE size_t +static inline G_PURE size_t iov_calculate_size(const iovec_t *iov, size_t iov_cnt) { size_t size = 0;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/iprange.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/iprange.c
Changed
@@ -57,18 +57,18 @@ * A CIDR network description for IPv4 addresses. */ struct iprange_net4 { - guint32 ip; /**< The IP of the network */ - guint16 value; /**< Associated token value */ - guint8 bits; /**< Leading meaningful bits */ + uint32 ip; /**< The IP of the network */ + uint16 value; /**< Associated token value */ + uint8 bits; /**< Leading meaningful bits */ }; /** * A CIDR network description for IPv6 addresses. */ struct iprange_net6 { - guint8 ip16; /**< The IP of the network */ - guint16 value; /**< Associated token value */ - guint8 bits; /**< Leading meaningful bits */ + uint8 ip16; /**< The IP of the network */ + uint16 value; /**< Associated token value */ + uint8 bits; /**< Leading meaningful bits */ }; /* @@ -89,37 +89,11 @@ g_assert(IPRANGE_DB_MAGIC == idb->magic); } -/** - * Error code stings. - */ -static const char *iprange_errstr = { - "OK", /**< IPR_ERR_OK */ - "Incorrect network prefix", /**< IPR_ERR_BAD_PREFIX */ - "CIDR range clash", /**< IPR_ERR_RANGE_CLASH */ - "Duplicate range", /**< IPR_ERR_RANGE_DUP */ - "Range is subnet of existing range", /**< IPR_ERR_RANGE_SUBNET */ - "Range is overlapping existing range", /**< IPR_ERR_RANGE_OVERLAP */ -}; - -/** - * @return human-readable error string for given error code. - */ -const char * -iprange_strerror(iprange_err_t errnum) -{ - STATIC_ASSERT(IPR_ERROR_COUNT == G_N_ELEMENTS(iprange_errstr)); - - if (UNSIGNED(errnum) >= G_N_ELEMENTS(iprange_errstr)) - return "Invalid error code"; - - return iprange_errstrerrnum; -} - -static G_GNUC_HOT int +static int G_HOT iprange_net4_cmp(const void *p, const void *q) { const struct iprange_net4 *a = p, *b = q; - guint32 mask, a_key, b_key; + uint32 mask, a_key, b_key; mask = cidr_to_netmask(a->bits) & cidr_to_netmask(b->bits); a_key = a->ip & mask; @@ -127,7 +101,7 @@ return CMP(a_key, b_key); } -static G_GNUC_HOT int +static int G_HOT iprange_net6_cmp(const void *p, const void *q) { const struct iprange_net6 *a = p, *b = q; @@ -185,7 +159,7 @@ iprange_free(struct iprange_db **idb_ptr) { struct iprange_db *idb; - + idb = *idb_ptr; if (idb) { iprange_db_check(idb); @@ -205,8 +179,8 @@ * * @return The data associated with the IP address or 0 if not found. */ -guint16 -iprange_get(const struct iprange_db *idb, guint32 ip) +uint16 +iprange_get(const struct iprange_db *idb, uint32 ip) { struct iprange_net4 key, *item; @@ -227,8 +201,8 @@ * * @return The data associated with the IP address or 0 if not found. */ -guint16 -iprange_get6(const struct iprange_db *idb, const guint8 *ip6) +uint16 +iprange_get6(const struct iprange_db *idb, const uint8 *ip6) { struct iprange_net6 key, *item; @@ -249,7 +223,7 @@ * * @return The data associated with the IP address or 0 if not found. */ -guint16 +uint16 iprange_get_addr(const struct iprange_db *idb, const host_addr_t ha) { host_addr_t to; @@ -277,11 +251,11 @@ */ iprange_err_t iprange_add_cidr(struct iprange_db *idb, - guint32 net, unsigned bits, guint16 value) + uint32 net, unsigned bits, uint16 value) { struct iprange_net4 item; - guint32 mask; - + uint32 mask; + iprange_db_check(idb); g_assert(value != 0); g_return_val_if_fail(bits > 0, IPR_ERR_BAD_PREFIX); @@ -314,7 +288,7 @@ */ iprange_err_t iprange_add_cidr6(struct iprange_db *idb, - const guint8 *net, unsigned bits, guint16 value) + const uint8 *net, unsigned bits, uint16 value) { struct iprange_net6 item; unsigned i, trailing, bytes, n; @@ -337,7 +311,7 @@ n = trailing - 8 * bytes; /* Trailing bits in first zero byte */ if (n != 0) { - guint8 mask = ~(~0U << n); + uint8 mask = ~(~0U << n); if (0 != (net(bits - 1) / 8 & mask)) return IPR_ERR_BAD_PREFIX; @@ -363,7 +337,7 @@ ip_to_string(a->ip), a->bits, host_addr_to_string(host_addr_get_ipv4(b->ip)), b->bits); - return a->bits < b->bits ? 1 : -1; + return CMP(b->bits, a->bits); /* Reversed comparison */ } static int @@ -374,7 +348,7 @@ g_warning("iprange_sync(): %s/%u overlaps with %s/%u", ipv6_to_string(a->ip), a->bits, ipv6_to_string2(b->ip), b->bits); - return a->bits < b->bits ? 1 : -1; + return CMP(b->bits, a->bits); /* Reversed comparison */ } /** @@ -411,7 +385,7 @@ iprange_get_item_count(const struct iprange_db *idb) { iprange_db_check(idb); - return sorted_array_size(idb->tab4) + sorted_array_size(idb->tab6); + return sorted_array_count(idb->tab4) + sorted_array_count(idb->tab6); } /** @@ -425,7 +399,7 @@ iprange_get_item_count4(const struct iprange_db *idb) { iprange_db_check(idb); - return sorted_array_size(idb->tab4); + return sorted_array_count(idb->tab4); } /** @@ -439,7 +413,7 @@ iprange_get_item_count6(const struct iprange_db *idb) { iprange_db_check(idb); - return sorted_array_size(idb->tab6); + return sorted_array_count(idb->tab6); } /** @@ -455,7 +429,7 @@ size_t i, n; unsigned hosts = 0; - n = sorted_array_size(idb->tab4); + n = sorted_array_count(idb->tab4); for (i = 0; i < n; i++) { struct iprange_net4 *item = sorted_array_item(idb->tab4, i);
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/iprange.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/iprange.h
Changed
@@ -37,21 +37,7 @@ #include "common.h" #include "lib/host_addr.h" - -/** - * Error codes. - */ - -typedef enum { - IPR_ERR_OK = 0, /**< OK */ - IPR_ERR_BAD_PREFIX, /**< Incorrect network prefix */ - IPR_ERR_RANGE_CLASH, /**< CIDR range clash */ - IPR_ERR_RANGE_DUP, /**< Duplicate range */ - IPR_ERR_RANGE_SUBNET, /**< Range is subnet of existing range */ - IPR_ERR_RANGE_OVERLAP, /**< Range is overlapping existing range */ - - IPR_ERROR_COUNT /**< Amount of error codes defined */ -} iprange_err_t; +#include "if/gen/iprange.h" /* * Public interface. @@ -63,12 +49,12 @@ struct iprange_db *iprange_new(void); iprange_err_t iprange_add_cidr( - struct iprange_db *db, guint32 net, unsigned bits, guint16 value); + struct iprange_db *db, uint32 net, unsigned bits, uint16 value); iprange_err_t iprange_add_cidr6( - struct iprange_db *db, const guint8 *net, unsigned bits, guint16 value); -guint16 iprange_get(const struct iprange_db *db, guint32 ip); -guint16 iprange_get6(const struct iprange_db *db, const guint8 *ip6); -guint16 iprange_get_addr(const struct iprange_db *idb, const host_addr_t ha); + struct iprange_db *db, const uint8 *net, unsigned bits, uint16 value); +uint16 iprange_get(const struct iprange_db *db, uint32 ip); +uint16 iprange_get6(const struct iprange_db *db, const uint8 *ip6); +uint16 iprange_get_addr(const struct iprange_db *idb, const host_addr_t ha); void iprange_sync(struct iprange_db *idb); void iprange_free(struct iprange_db **idb_ptr); void iprange_reset_ipv4(struct iprange_db *idb);
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/ipset.c
Added
@@ -0,0 +1,165 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Maintains a set of IP addresses, externally provided through a string + * containing comma-separated addresses (IPv4 or IPv6). + * + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#include "ipset.h" +#include "hset.h" +#include "strtok.h" +#include "walloc.h" + +#include "override.h" /* Must be the last header included */ + +static inline void +ipset_check(const ipset_t * const ips) +{ + g_assert(ips != NULL); + g_assert(IPSET_MAGIC == ips->magic); +} + +/** + * Hash set iterator callback to free address. + */ +static bool +ipset_free_addrs(const void *key, void *udata) +{ + host_addr_t *ha = deconstify_pointer(key); + + (void) udata; + + WFREE(ha); + return TRUE; +} + +/** + * Record IP addresses in the set. + * + * The supplied set of addresses supersedes any existing addresses. + * + * If the string is empty, this removes all the records and frees up all + * the dynamically allocated memory for the set. + * + * @param ips the IP set + * @param s string containing comma-separated IP addresses + */ +void +ipset_set_addrs(ipset_t *ips, const char *s) +{ + strtok_t *st; + const char *tok; + + ipset_check(ips); + g_assert(s != NULL); + + if (NULL == ips->addrs) { + ips->addrs = hset_create_any(host_addr_hash_func, + host_addr_hash_func2, host_addr_eq_func); + } else { + hset_foreach_remove(ips->addrs, ipset_free_addrs, NULL); + } + + st = strtok_make_strip(s); + + while ((tok = strtok_next(st, ","))) { + host_addr_t ha; + ZERO(&ha); + if (string_to_host_addr(tok, NULL, &ha)) { + host_addr_t *h = WCOPY(&ha); + hset_insert(ips->addrs, h); + } else if ('\0' != *tok) { + g_carp("ignoring invalid IP address \"%s\"", tok); + } + } + + strtok_free_null(&st); + + if (0 == hset_count(ips->addrs)) + hset_free_null(&ips->addrs); +} + +/** + * Empty the IP set. + */ +void +ipset_clear(ipset_t *ips) +{ + ipset_check(ips); + + if (NULL != ips->addrs) + hset_foreach_remove(ips->addrs, ipset_free_addrs, NULL); + + hset_free_null(&ips->addrs); +} + +/** + * Is the IP of the host among the set of addresses? + * + * @param ips the IP set + * @param h the host we're looking for + * @param any value to return if set is empty + */ +bool +ipset_contains_host(const ipset_t *ips, const gnet_host_t *h, bool any) +{ + ipset_check(ips); + g_assert(h != NULL); + + if G_UNLIKELY(NULL != ips->addrs) { + host_addr_t ha = gnet_host_get_addr(h); + return hset_contains(ips->addrs, &ha); + } else { + return any; + } +} + +/** + * Is the IP address among the set of addresses? + * + * @param ips the IP set + * @param ha the IP address we're looking for + * @param any value to return if set is empty + */ +bool +ipset_contains_addr(const ipset_t *ips, const host_addr_t ha, bool any) +{ + ipset_check(ips); + + if G_UNLIKELY(NULL != ips->addrs) { + return hset_contains(ips->addrs, &ha); + } else { + return any; + } +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/ipset.h
Added
@@ -0,0 +1,67 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Maintenance of a set of IP addresses. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _ipset_h_ +#define _ipset_h_ + +#include "lib/gnet_host.h" +#include "lib/host_addr.h" + +enum ipset_magic { IPSET_MAGIC = 0x18df36aa }; + +struct hset; + +/** + * An IP set container. + * + * This structure is public to make sure we can declare static variables. + */ +typedef struct ipset { + enum ipset_magic magic; + struct hset *addrs; +} ipset_t; + +#define IPSET_INIT { IPSET_MAGIC, NULL } + +/* + * Public interface. + */ + +void ipset_clear(ipset_t *ips); +void ipset_set_addrs(ipset_t *ips, const char *s); +bool ipset_contains_host(const ipset_t *ips, const gnet_host_t *h, bool any); +bool ipset_contains_addr(const ipset_t *ips, const host_addr_t ha, bool any); + +#endif /* _ipset_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/iso3166.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/iso3166.c
Changed
@@ -83,12 +83,15 @@ { "bh", N_("Bahrain") }, { "bi", N_("Burundi") }, { "bj", N_("Benin") }, + { "bl", N_("Saint Barthelemy") }, { "bm", N_("Bermuda") }, { "bn", N_("Brunei Darussalam") }, { "bo", N_("Bolivia") }, + { "bq", N_("Bonaire, Sint Eustatius and Saba") }, { "br", N_("Brazil") }, { "bs", N_("Bahamas") }, { "bt", N_("Bhutan") }, + { "bu", N_("Burma") }, /* deprecated */ { "bv", N_("Bouvet Island") }, { "bw", N_("Botswana") }, { "by", N_("Belarus") }, @@ -109,6 +112,7 @@ { "cs", N_("Serbia and Montenegro") }, /* deprecated */ { "cu", N_("Cuba") }, { "cv", N_("Cape Verde") }, + { "cw", N_("Curacao") }, { "cx", N_("Christmas Island") }, { "cy", N_("Cyprus") }, { "cz", N_("Czech Republic") }, @@ -264,8 +268,10 @@ { "sn", N_("Senegal") }, { "so", N_("Somalia") }, { "sr", N_("Suriname") }, + { "ss", N_("South Sudan") }, { "st", N_("Sao Tome and Principe") }, { "sv", N_("El Salvador") }, + { "sx", N_("Sint Maarten") }, { "sy", N_("Syrian Arab Republic") }, { "sz", N_("Swaziland") }, { "tc", N_("Turks and Caicos Islands") }, @@ -304,9 +310,11 @@ { "za", N_("South Africa") }, { "zm", N_("Zambia") }, { "zw", N_("Zimbabwe") }, + + /* Above line intentionally left blank for vi sorting */ }; -static iso3166_entry_t iso3166_entriesG_N_ELEMENTS(iso3166_tab); +static iso3166_entry_t iso3166_entriesN_ITEMS(iso3166_tab); static iso3166_entry_t *iso3166_countriesISO3166_NUM_CODES; @@ -318,12 +326,12 @@ * string is in a static buffer. */ static const char * -iso3166_decode_cc(guint16 code) +iso3166_decode_cc(uint16 code) { static char s3; - guint i; + uint i; - if (code >= G_N_ELEMENTS(iso3166_countries)) + if (code >= N_ITEMS(iso3166_countries)) return NULL; if (NULL == iso3166_countriescode) @@ -344,19 +352,19 @@ * @return ISO3166_INVALID if the given string is obviously not * a 2-letter country code. */ -guint16 +uint16 iso3166_encode_cc(const char *cc) { g_assert(cc != NULL); if (is_ascii_alnum(cc0) && is_ascii_alnum(cc1) && '\0' == cc2) { const char *d; - guint16 code; + uint16 code; int error; code = parse_uint16(cc, NULL, 36, &error); - if (code >= G_N_ELEMENTS(iso3166_countries)) + if (code >= N_ITEMS(iso3166_countries)) return ISO3166_INVALID; g_assert(0 == error); @@ -370,52 +378,53 @@ return ISO3166_INVALID; } -G_GNUC_COLD void +void G_COLD iso3166_init(void) { size_t i; - for (i = 0; i < G_N_ELEMENTS(iso3166_tab); i++) { + for (i = 0; i < N_ITEMS(iso3166_tab); i++) { iso3166_entry_t *entry; entry = &iso3166_entriesi; strncpy(entry->cc, iso3166_tabi.cc, sizeof entry->cc); + entry->ccsizeof entry->cc - 1 = '\0'; /* Paranoid */ entry->country = atom_str_get(_(iso3166_tabi.country)); { const char *endptr; - guint16 code; + uint16 code; int error; code = parse_uint16(entry->cc, &endptr, 36, &error); g_assert(*endptr == '\0'); g_assert(!error); - g_assert((size_t) code < G_N_ELEMENTS(iso3166_countries)); + g_assert((size_t) code < N_ITEMS(iso3166_countries)); iso3166_countriescode = entry; } } } -G_GNUC_COLD void +void G_COLD iso3166_close(void) { size_t i; - for (i = 0; i < G_N_ELEMENTS(iso3166_entries); i++) { + for (i = 0; i < N_ITEMS(iso3166_entries); i++) { iso3166_entry_t *entry = &iso3166_entriesi; atom_str_free_null(&entry->country); } } static inline const iso3166_entry_t * -iso3166_country_entry(guint16 code) +iso3166_country_entry(uint16 code) { if (ISO3166_INVALID == code) { static const iso3166_entry_t unknown = { "??", "??" }; return &unknown; } else { static const iso3166_entry_t none = { "(null)", "??" }; - g_assert(code < G_N_ELEMENTS(iso3166_countries)); + g_assert(code < N_ITEMS(iso3166_countries)); return iso3166_countriescode ? iso3166_countriescode : &none; } } @@ -423,12 +432,11 @@ /** * Maps a valid encoded country code to the country name. * - * @return NULL integer isn't a validly encoded country code. If the country - * is valid, a string pointing two the country name is returned. Each - * string has its own buffer which is only free()d by iso3166_close(). + * @return "(null") if integer isn't a validly encoded country code. If the + * country is valid, a string pointing two the country name is returned. */ const char * -iso3166_country_name(guint16 code) +iso3166_country_name(uint16 code) { return iso3166_country_entry(code)->country; } @@ -436,12 +444,11 @@ /** * Maps a valid encoded country code to the 2-letter code. * - * @return NULL integer isn't a validly encoded country code. If the country - * is valid, a string pointing two the 2-letter code is returned. Each - * string has its own buffer which is only free()d by iso3166_close(). + * @return "??" if integer isn't a validly encoded country code. If the country + * is valid, a string pointing two the 2-letter code is returned. */ const char * -iso3166_country_cc(guint16 code) +iso3166_country_cc(uint16 code) { return iso3166_country_entry(code)->cc; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/iso3166.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/iso3166.h
Changed
@@ -26,16 +26,16 @@ #include "common.h" -#define ISO3166_INVALID ((guint16)-1) +#define ISO3166_INVALID ((uint16)-1) #define ISO3166_NUM_CODES (36 * 35 + 35) -guint16 iso3166_encode_cc(const char *cc); +uint16 iso3166_encode_cc(const char *cc); void iso3166_init(void); void iso3166_close(void); -const char *iso3166_country_name(guint16 code); -const char *iso3166_country_cc(guint16 code); +const char *iso3166_country_name(uint16 code); +const char *iso3166_country_cc(uint16 code); -static inline gboolean iso3166_code_is_valid(guint16 code) +static inline bool iso3166_code_is_valid(uint16 code) { return ISO3166_INVALID == code || code < (unsigned) ISO3166_NUM_CODES; }
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/launch-test.c
Added
@@ -0,0 +1,584 @@ +/* + * launch-test -- launchve() unit tests. + * + * Copyright (c) 2015 Raphael Manfredi <Raphael_Manfredi@pobox.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the authors nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "common.h" + +#ifdef I_SYS_WAIT +#include <sys/wait.h> +#endif + +#include "concat.h" +#include "exit2str.h" +#include "file.h" +#include "glib-missing.h" +#include "halloc.h" +#include "hset.h" +#include "htable.h" +#include "launch.h" +#include "log.h" +#include "misc.h" +#include "progname.h" +#include "stacktrace.h" +#include "str.h" +#include "stringify.h" +#include "strtok.h" +#include "thread.h" +#include "walloc.h" + +const char *progpath; +static bool verbose, reparenting; + +/* Duplicated main() arguments, in read-only memory */ +static int main_argc; +static const char **main_argv; +static const char **main_env; + +static void G_NORETURN +usage(void) +{ + fprintf(stderr, + "Usage: %s -hv\n" + " -z fn1,fn2...\n" + " -X k1=v1,k2=v2\n" + " -h : prints this help message\n" + " -i : also test that getppid() returns 1 for orphans on Windows\n" + " -v : ask for details about what is happening\n" + " -z : zap (suppress) messages from listed routines\n" + " -X : key/value tuples to execute tests (in children process)\n" + , getprogname()); + exit(EXIT_FAILURE); +} + +static hset_t *zap; + +static void +zap_record(const char *value) +{ + strtok_t *s; + const char *tok; + + zap = hset_create(HASH_KEY_STRING, 0); + s = strtok_make_strip(value); + + while ((tok = strtok_next(s, ","))) { + hset_insert(zap, h_strdup(tok)); + } + + strtok_free_null(&s); +} + +static void +emitv(bool nl, const char *fmt, va_list args) +{ + static pid_t pid; + str_t *s = str_new(512); + + if G_UNLIKELY(0 == pid) + pid = getpid(); + + str_vprintf(s, fmt, args); + fprintf(stdout, "%d ", (int) pid); + fputs(str_2c(s), stdout); + if (nl) + fputc('\n', stdout); + fflush(stdout); + + str_destroy_null(&s); +} + +static void G_PRINTF(1, 2) +emit(const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + emitv(TRUE, fmt, args); + va_end(args); +} + +static void G_PRINTF(2, 3) +emit_zap(const char *caller, const char *fmt, ...) +{ + va_list args; + + if (zap != NULL && hset_contains(zap, caller)) + return; /* Zap messages from this caller */ + + va_start(args, fmt); + emitv(TRUE, fmt, args); + va_end(args); +} + +#define emitz(fmt, ...) emit_zap(G_STRFUNC, (fmt), __VA_ARGS__) + +static pid_t G_NULL_TERMINATED +verbose_launch(char * const envp, const char *path, ...) +{ + pid_t p; + va_list ap; + char *cmd; + size_t cnt = 0; + char **array, **q; + const char *s; + + if (!verbose) + goto launch; + + va_start(ap, path); + while (NULL != va_arg(ap, const char *)) + cnt++; + va_end(ap); + + HALLOC_ARRAY(array, cnt + 1); + q = array; + + va_start(ap, path); + while (NULL != ((s = va_arg(ap, const char *)))) + *q++ = deconstify_char(s); + va_end(ap); + + *q++ = NULL; + + g_assert(ptr_diff(q, array) == (cnt + 1) * sizeof array0); + + cmd = h_strjoinv(" ", array); + emitz("launching %s %s", path, cmd); + + HFREE_NULL(cmd); + HFREE_NULL(array); + +launch: + va_start(ap, path); + p = launchle_v(path, path, ap, envp); + va_end(ap); + + if (-1 == p) + s_error("cannot launch test: %m"); + + return p; +} + +static void +test_child_expect_where(pid_t p, bool success, const char *where) +{ + int status; + + g_assert(p > 0); + + pid_t r = waitpid(p, &status, 0); + + if (-1 == r) { + s_error("waitpid() failed: %m"); + return; + } + + g_assert(r == p); + + if (WIFEXITED(status)) { + if (success != (0 == WEXITSTATUS(status))) { + s_error("was expecting %s from PID %lu at %s, got %d", + success ? "success" : "failure", (ulong) p, where, + WEXITSTATUS(status)); + } + emitz("exit status for PID %lu is %d (PASSED) at %s", + (ulong) p, WEXITSTATUS(status), where); + } else { + s_error("abnormal exit for PID %lu at %s: %s", (ulong) p, where, + exit2str(status)); + } +} + +#define test_child_expect(p,s) test_child_expect_where((p), (s), G_STRLOC) + +static const char *qargs = { + "with space", + "'with space quoted'", + "\"with space double-quoted\"", + "\"with escaped double-quote \\\"double-quoted\\\"\"", + "'with unescaped \"double-quote\" in quoted'", + "'with escaped \\'quote\\' in quoted'", + "with stray \" double-quote", + "stray-\"-double-quote-without-space", + "\\path\\with\\trailing\\backslash\\", + "escaped\\ space", +}; + +static void +test_launchve(void) +{ + pid_t p; + char buf128; + char pid_strULONG_DEC_BUFLEN; + const char *test = "t=plain,"; + const char *ppid = ",ppid="; + const char *verb = verbose ? ",verb" : ""; + char *envp = { + "a1=a1", + "A1=A1", + "a2=a2", + NULL + }; + + str_bprintf(pid_str, sizeof pid_str, "%lu", (ulong) getpid()); + + concat_strings(buf, sizeof buf, test, "x.plain", + verb, ppid, pid_str, NULL_PTR); + p = verbose_launch(NULL, progpath, "-X", buf, NULL_PTR); + test_child_expect(p, TRUE); + + concat_strings(buf, sizeof buf, test, "x.quoted", verb, NULL_PTR); + p = verbose_launch(NULL, progpath, "-X", buf, + qargs0, qargs1, qargs2, qargs3, qargs4, qargs5, + qargs6, qargs7, qargs8, qargs9, NULL_PTR); + test_child_expect(p, TRUE); + + test = "t=env,"; + + concat_strings(buf, sizeof buf, test, verb, ",envp", NULL_PTR); + p = verbose_launch(NULL, progpath, "-X", buf, NULL_PTR); + test_child_expect(p, TRUE); + + concat_strings(buf, sizeof buf, test, "x.vars", verb, ",envp", NULL_PTR); + p = verbose_launch(envp, progpath, "-X", buf, NULL_PTR); + test_child_expect(p, TRUE); + + if (reparenting) { + test = "t=parent,"; + + concat_strings(buf, sizeof buf, test, verb, NULL_PTR); + p = verbose_launch(NULL, progpath, "-X", buf, NULL_PTR); + test_child_expect(p, TRUE); + } +} + +static bool +x_wants(const htable_t *xv, const char *key) +{ + const char *val = htable_lookup(xv, key); + + if (NULL == val || !is_strcaseprefix(val, "y")) + return FALSE; + + return TRUE; +} + +static void +x_expr_check(bool expr, const char *estr, const char *fn, const char *wh) +{ + if (!expr) { + emit("FAILED: \"%s\" in %s() at %s", estr, fn, wh); + exit(EXIT_FAILURE); + } +} + +static void G_PRINTF(5,6) +x_expr_check_log(bool expr, const char *estr, const char *fn, const char *wh, + const char *fmt, ...) +{ + if (!expr) { + va_list ap; + + emit("FAILED: \"%s\" in %s() at %s", estr, fn, wh); + va_start(ap, fmt); + emitv(TRUE, fmt, ap); + va_end(ap); + exit(EXIT_FAILURE); + } +} + +#define x_check(expr) x_expr_check((expr), # expr, G_STRFUNC, G_STRLOC) + +#define x_check_log(expr, fmt, ...) \ + x_expr_check_log((expr), # expr, G_STRFUNC, G_STRLOC, (fmt), __VA_ARGS__) + +static void +x_dump_strvec(const char *name, const char **vec) +{ + size_t i = 0; + const char *s; + + while (NULL != ((s = veci))) { + emitz("%s%zu = \"%s\"", name, i, s); + i++; + } +} + +static void +x_launchve_plain(const htable_t *xv) +{ + if (x_wants(xv, "x.plain")) { + const char *p = htable_lookup(xv, "ppid"); + pid_t ppid; + + x_check(p != NULL); /* Must have a ppid= argument */ + x_check_log(3 == main_argc, "main_argc=%d", main_argc); + x_check(0 == strcmp(main_argv1, "-X")); + ppid = (pid_t) atol(p); + x_check_log(getppid() == ppid, + "getppid()=%lu, ppid=%lu", (ulong) getppid(), (ulong) ppid); + /* Ensure idempotent on Windows */ + x_check_log(getppid() == ppid, + "getppid()=%lu, ppid=%lu", (ulong) getppid(), (ulong) ppid); + } else if (x_wants(xv, "x.quoted")) { + size_t i; + + x_check_log(N_ITEMS(qargs) + 3 == main_argc, + "main_argc=%d", main_argc); + x_check(0 == strcmp(main_argv1, "-X")); + + for (i = 0; i < N_ITEMS(qargs); i++) { + x_check_log(0 == strcmp(main_argv3+i, qargsi), + "main_argv3+%zu = \"%s\", qargs%zu = \"%s\"", + i, main_argv3+i, i, qargsi); + } + } +} + +static void +x_launchve_env(const htable_t *xv) +{ + const char *a1 = getenv("a1"); + const char *A1 = getenv("A1"); + const char *a2 = getenv("a2"); + const char *no = getenv("no"); + + /* + * On Windows, the environment is case-insensitive. So "A1" and "a1" are + * actually mishandled there. + */ + + if (x_wants(xv, "x.vars")) { + x_check(a1 != NULL); + x_check(A1 != NULL); + x_check(a2 != NULL); + x_check(NULL == no); + + if (x_wants(xv, "verb")) { + emitz("A1=%s", A1); + emitz("a1=%s", a1); + } + + x_check_log(0 == strcasecmp(a1, "a1"), "a1=\"%s\"", a1); + x_check_log(0 == strcasecmp(A1, "A1"), "A1=\"%s\"", A1); + x_check_log(0 == strcmp(a2, "a2"), "a2=\"%s\"", a2); + } else { + x_check(NULL == a1); + x_check(NULL == A1); + x_check(NULL == a2); + x_check(NULL == no); + } +} + +static void +x_launchve_parent(const htable_t *xv) +{ + pid_t pid; + char buf128; + const char *test = "t=ppid,"; + const char *verb = verbose ? ",verb" : ""; + int delay = 2; + + (void) xv; + + concat_strings(buf, sizeof buf, test, verb, NULL_PTR); + pid = verbose_launch(NULL, progpath, "-X", buf, NULL_PTR); + emitz("sleeping %d secs", delay); + thread_sleep_ms(1000 * delay); + emitz("will now exit, child PID %lu will check getppid()", (ulong) pid); +} + +static void +x_launchve_ppid(const htable_t *xv) +{ + int i; + + (void) xv; + + for (i = 0; i < 20; i++) { + pid_t ppid = getppid(); + + emitz("try #%d, parent PID is %lu", i+1, (ulong) getppid()); + if (1 == ppid) + return; + emitz("sleeping for %d msec", 500); + thread_sleep_ms(500); + } + + s_fatal_exit(EXIT_FAILURE, "parent pid still %lu, was expecting 1", + (ulong) getppid()); +} + +static htable_t *xv, *tv; + +static void +x_record(const char *value) +{ + strtok_t *s; + const char *tok; + + if (NULL == xv) + xv = htable_create(HASH_KEY_STRING, 0); + + s = strtok_make_strip(value); + + while ((tok = strtok_next(s, ","))) { + char *kv = h_strdup(tok); + char *eq = strstr(kv, "="); /* What follows is the value */ + + if (NULL == eq) { + htable_insert(xv, kv, "y"); /* No value, assume "y" (for yes) */ + } else { + *eq++ = '\0'; /* Breaks up key from value */ + htable_insert(xv, kv, eq); + } + } + + strtok_free_null(&s); +} + +typedef void (*launchve_test_cb_t)(const htable_t *xv); + +static struct { + const char *name; + launchve_test_cb_t cb; +} launchve_tests = { + { "plain", x_launchve_plain }, + { "env", x_launchve_env }, + { "parent", x_launchve_parent }, + { "ppid", x_launchve_ppid }, +}; + +static void +launchve_tests_install(void) +{ + size_t i; + + g_assert(NULL == tv); + + tv = htable_create(HASH_KEY_STRING, 0); + + for (i = 0; i < N_ITEMS(launchve_tests); i++) { + htable_insert(tv, launchve_testsi.name, launchve_testsi.cb); + } +} + +static launchve_test_cb_t +launchve_tests_lookup(void) +{ + launchve_test_cb_t cb; + const char *name; + + g_assert(tv != NULL); + g_assert(xv != NULL); + + name = htable_lookup(xv, "t"); + if (NULL == name) + s_fatal_exit(EXIT_FAILURE, "no \"t\" key in -X"); + + cb = htable_lookup(tv, name); + if (NULL == cb) + s_fatal_exit(EXIT_FAILURE, "no test \"%s\" found", name); + + return cb; +} + +int +main(int argc, char **argv) +{ + extern int optind; + extern char *optarg; + extern char **environ; + const char options = "hivz:X:"; + int c; + + progstart(argc, argv); + main_argc = progstart_dup(&main_argv, &main_env); + + progpath = main_argv0; + thread_set_main(TRUE); /* We're the main thread, we can block */ + stacktrace_init(argv0, FALSE); + log_show_pid(TRUE); + + misc_init(); + + while ((c = getopt(argc, argv, options)) != EOF) { + switch (c) { + case 'i': /* test getppid() -- useful only on Windows */ + reparenting++; + break; + case 'v': /* verbose */ + verbose++; + break; + case 'z': /* zap message from routines using emitz() */ + zap_record(optarg); + break; + case 'X': /* parameters for the child process */ + x_record(optarg); + break; + case 'h': /* show help */ + default: + usage(); + break; + } + } + + /* Child can have as many arguments as we want */ + if (NULL == xv && (argc -= optind) != 0) + usage(); + + argv += optind; + + if (NULL == xv) { + /* Parent process, the driver */ + test_launchve(); + } else { + launchve_test_cb_t cb; + + if (x_wants(xv, "verb")) + verbose++; + + if (verbose) { + x_dump_strvec("argv", main_argv); + if (x_wants(xv, "envp")) + x_dump_strvec("env", main_env); + } + + launchve_tests_install(); + cb = launchve_tests_lookup(); + + (*cb)(xv); + } + + return 0; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/launch.c
Added
@@ -0,0 +1,194 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Process launcher. + * + * This is a compatibility layer: UNIX systems launch new processes by + * the ways of fork() and exec(), whilst Windows only has spawn(). + * + * The launch() interface gives a common API to the two systems and allows + * us to provide a decent waitpid() emulation on Windows. + * + * As is traditional for this family of functions in the litterature, + * the radix "launch" is supplemented with additional letter which give + * a hint towards the function signature... + * + * The first letter is either 'l' or 'v': + * + * 'l' when command line arguments are passed as arguments to the routine. + * 'v' when command line arguments are passed in a vector given to the routine. + * + * Then, either 'p', 'e', or both can be appended, in that order: + * + * 'p' is appended when the actual command needs to be located using the PATH + * 'e' is appended when the last argument provides an environment vector. + * + * The real core function is usually the 've' one, others being wrappers + * which transform their arguments into the ones expected by the 've' routine. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#include "common.h" + +#include "launch.h" + +#include "argv.h" + +#include "override.h" /* Must be the last header included */ + +/* + * On Windows, we use mingw_launchve() and launchve() is remapped by cpp + * to point to that routine instead, so the version compiled here is for + * UNIX systems. + */ + +#ifndef MINGW32 + +#ifndef HAS_VFORK +#define vfork() fork() +#endif + +/** + * Launch `path', supplying it with arguments argv and environment envp. + * + * The argv0 argument is the name the new process will see, but the actual + * process to launch is located in the file `path'. + * + * @return -1 on failure, the PID of the child process otherwise. + */ +pid_t +launchve(const char *path, char *const argv, char *const envp) +{ + pid_t c; + extern char **environ; + + g_assert(path != NULL); + + switch ((c = vfork())) { + case -1: + return -1; + case 0: /* Child process */ + execve(path, argv, NULL == envp ? environ : envp); + _exit(EXIT_FAILURE); + default: /* Parent process */ + break; + } + + return c; +} + +#endif /* !MINGW32 */ + +/** + * Vectorized version of launchl() or launchle(). + * + * It is a wrapper over launchve() to construct the argv array from + * an argument list. + */ +pid_t +launchle_v(const char *path, const char *arg, va_list ap, char *const envp) +{ + pid_t pid; + char **argv; + + argv = argv_create(arg, ap); + pid = launchve(path, argv, envp); + argv_free_null(&argv); + + return pid; +} + +/** + * Vectorized version of launchl(). + * + * It is a wrapper over launchve() to construct the argv array from + * an argument list. + */ +pid_t +launchl_v(const char *path, const char *arg, va_list ap) +{ + return launchle_v(path, arg, ap, NULL); +} + +/** + * Launch `path', supplying it with arguments starting with `arg' and + * followed by the listed additional argument strings, up to the trailing + * NULL sentinel. + * + * @param path the executable to launch + * @param arg what will be given as argv0 to the new process + * + * @return -1 on failure, the PID of the child process otherwise. + */ +pid_t +launchl(const char *path, const char *arg, ...) +{ + pid_t pid; + va_list ap; + + va_start(ap, arg); + pid = launchl_v(path, arg, ap); + va_end(ap); + + return pid; +} + +/** + * Launch `path', supplying it with arguments starting with `arg' and + * followed by the listed additional argument strings, up to the trailing + * NULL sentinel, followed by a last argument being the new environment. + * + * @param path the executable to launch + * @param arg what will be given as argv0 to the new process + * @param ... argument list, NULL-terminated + * @param envp the environment strings to setup for the new process + * + * @return -1 on failure, the PID of the child process otherwise. + */ +pid_t +launchle(const char *path, const char *arg, ...) +{ + pid_t pid; + va_list ap; + char **envp; + + va_start(ap, arg); + while (NULL != va_arg(ap, char *)) + /* empty */; + envp = va_arg(ap, char **); + va_end(ap); + + va_start(ap, arg); + pid = launchle_v(path, arg, ap, envp); + va_end(ap); + + return pid; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/launch.h
Added
@@ -0,0 +1,52 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Process launcher. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#ifndef _launch_h_ +#define _launch_h_ + +/* + * Public interface. + */ + +pid_t launchve(const char *path, char *const argv, char *const envp); + +pid_t launchl(const char *path, const char *arg, ...) G_NULL_TERMINATED; +pid_t launchle(const char *path, const char *arg, ...); + +pid_t launchl_v(const char *path, const char *arg, va_list ap); +pid_t launchle_v(const char *path, + const char *arg, va_list ap, char *const envp); + +#endif /* _launch_h_ */ + +/* vi: set ts=4: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/leak.c
Added
@@ -0,0 +1,352 @@ +/* + * Copyright (c) 2004, 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Leak summarizing routines. + * + * These general-purpose leak summarizing routines can be used by both + * malloc() and zalloc() when tracking allocations, to be able to report + * on leaks at exit time. + * + * Because the code here can be executed during final shutdown of the memory + * allocators, we cannot use walloc() for the data structures and need to + * rely on the VMM and xmalloc() layers only. Hence the hash table is + * create in "real" mode to prevent any usage of walloc(). + * + * @author Raphael Manfredi + * @date 2004, 2012 + */ + +#include "common.h" + +#include "concat.h" +#include "leak.h" +#include "htable.h" +#include "log.h" +#include "stacktrace.h" /* For struct stackatom, stack_hash(), stack_eq() */ +#include "stringify.h" +#include "xmalloc.h" +#include "xsort.h" + +#include "override.h" /* Must be the last header included */ + +enum leak_set_magic { LEAK_SET_MAGIC = 0x15ba83bf }; + +struct leak_set { + enum leak_set_magic magic; + htable_t *places; /* Maps "file:4" -> leak_record */ + htable_t *stacks; /* Maps stackatom -> leak_record */ +}; + +static inline void +leak_set_check(const struct leak_set * const ls) +{ + g_assert(ls != NULL); + g_assert(LEAK_SET_MAGIC == ls->magic); +} + +struct leak_record { /* Informations about leak at some place */ + size_t size; /* Total size allocated there */ + size_t count; /* Amount of allocations */ +}; + +/** + * Initialize the leak accumulator by "file:line" + */ +leak_set_t * +leak_init(void) +{ + struct leak_set *ls; + + XMALLOC0(ls); + ls->magic = LEAK_SET_MAGIC; + ls->places = htable_create_real(HASH_KEY_STRING, 0); /* No walloc() */ + ls->stacks = htable_create_any_real(stack_hash, NULL, stack_eq); + + return ls; +} + +/** + * Get rid of the key/value tupple in the leak table. + */ +static void +leak_free_kv(const void *key, void *value, void *unused) +{ + (void) unused; + xfree(deconstify_pointer(key)); + xfree(value); +} + +/** + * Get rid of the value in the leak table. + */ +static void +leak_free_v(const void *key, void *value, void *unused) +{ + (void) key; + (void) unused; + xfree(value); +} + +/** + * Dispose of the leaks accumulated. + */ +static void +leak_close(leak_set_t *ls) +{ + leak_set_check(ls); + + htable_foreach(ls->places, leak_free_kv, NULL); + htable_foreach(ls->stacks, leak_free_v, NULL); + htable_free_null(&ls->places); + htable_free_null(&ls->stacks); + ls->magic = 0; + xfree(ls); +} + +/* + * Free leak set and nullify its pointer. + */ +void +leak_close_null(leak_set_t **ls_ptr) +{ + leak_set_t *ls = *ls_ptr; + + if (ls != NULL) { + leak_close(ls); + *ls_ptr = NULL; + } +} + +/** + * Record a new leak of `size' bytes allocated at `file', line `line'. + */ +void +leak_add(leak_set_t *ls, size_t size, const char *file, int line) +{ + char key1024; + struct leak_record *lr; + bool found; + void *v; + + leak_set_check(ls); + g_assert(file); + g_assert(line >= 0); + + concat_strings(key, sizeof key, + file, ":", uint64_to_string(line), NULL_PTR); + found = htable_lookup_extended(ls->places, key, NULL, &v); + + if (found) { + lr = v; + lr->size += size; + lr->count++; + } else { + XMALLOC(lr); + lr->size = size; + lr->count = 1; + htable_insert(ls->places, xstrdup(key), lr); + } +} + +/** + * Record a new leak of `size' bytes allocated from stack trace. + */ +void +leak_stack_add(leak_set_t *ls, size_t size, const struct stackatom *sa) +{ + struct leak_record *lr; + bool found; + void *v; + + leak_set_check(ls); + + found = htable_lookup_extended(ls->stacks, sa, NULL, &v); + + if (found) { + lr = v; + lr->size += size; + lr->count++; + } else { + XMALLOC(lr); + lr->size = size; + lr->count = 1; + htable_insert(ls->stacks, sa, lr); + } +} + +enum leak_keytype { + LEAK_KEY_PLACE, + LEAK_KEY_STACK +}; + +struct leak { /* A memory leak, for sorting purposes */ + /* + * The union discriminant is implicit: it is derived from the hash table + * were the leak structure is held. + */ + union { + const char *place; + const struct stackatom *sa; + } u; + struct leak_record *lr; +}; + +/** + * leak_size_cmp -- qsort() callback + * + * Compare two pointers to "struct leak" based on their size value, + * in reverse order. + */ +static int +leak_size_cmp(const void *p1, const void *p2) +{ + const struct leak *leak1 = p1, *leak2 = p2; + + /* Reverse order: largest first */ + return CMP(leak2->lr->size, leak1->lr->size); +} + +struct filler { /* Used by hash table iterator to fill leak array */ + struct leak *leaks; + int count; /* Size of `leaks' array */ + int idx; /* Next index to be filled */ + enum leak_keytype kt; /* The union discriminant */ +}; + +/** + * fill_array -- hash table iterator + * + * Append current hash table entry at the end of the "leaks" array. + */ +static void +fill_array(const void *key, void *value, void *user) +{ + struct filler *filler = user; + struct leak *l; + struct leak_record *lr = value; + + g_assert(filler->idx < filler->count); + + l = &filler->leaksfiller->idx++; + switch (filler->kt) { + case LEAK_KEY_PLACE: + l->u.place = key; + break; + case LEAK_KEY_STACK: + l->u.sa = key; + break; + } + l->lr = lr; +} + +/** + * Dump the links sorted by decreasing leak size. + */ +void G_COLD +leak_dump(const leak_set_t *ls) +{ + int count; + struct filler filler; + int i; + + leak_set_check(ls); + + count = htable_count(ls->stacks); + + if (count == 0) + goto leaks_by_place; + + /* + * Linearize hash table into an array before sorting it by + * decreasing leak size. + */ + + XMALLOC_ARRAY(filler.leaks, count); + filler.count = count; + filler.idx = 0; + filler.kt = LEAK_KEY_STACK; + + htable_foreach(ls->stacks, fill_array, &filler); + xqsort(filler.leaks, count, sizeof(struct leak), leak_size_cmp); + + /* + * Dump the leaks by allocation place. + */ + + s_warning("leak summary by stackframe and total decreasing size:"); + s_warning("distinct calling stacks found: %d", count); + + for (i = 0; i < count; i++) { + struct leak *l = &filler.leaksi; + size_t avg = l->lr->size / (0 == l->lr->count ? 1 : l->lr->count); + s_warning("%zu bytes (%zu block%s, average %zu byte%s) from:", + l->lr->size, l->lr->count, plural(l->lr->count), avg, plural(avg)); + stacktrace_atom_decorate(stderr, l->u.sa, + STACKTRACE_F_ORIGIN | STACKTRACE_F_SOURCE); + } + + xfree(filler.leaks); + +leaks_by_place: + + count = htable_count(ls->places); + + if (count == 0) + return; + + /* + * Linearize hash table into an array before sorting it by + * decreasing leak size. + */ + + XMALLOC_ARRAY(filler.leaks, count); + filler.count = count; + filler.idx = 0; + filler.kt = LEAK_KEY_PLACE; + + htable_foreach(ls->places, fill_array, &filler); + xqsort(filler.leaks, count, sizeof(struct leak), leak_size_cmp); + + /* + * Dump the leaks by allocation place. + */ + + s_warning("leak summary by origin and total decreasing size:"); + s_warning("distinct allocation points found: %d", count); + + for (i = 0; i < count; i++) { + struct leak *l = &filler.leaksi; + size_t avg = l->lr->size / (0 == l->lr->count ? 1 : l->lr->count); + s_warning("%zu bytes (%zu block%s, average %zu byte%s) from \"%s\"", + l->lr->size, l->lr->count, plural(l->lr->count), + avg, plural(avg), l->u.place); + } + + xfree(filler.leaks); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/leak.h
Added
@@ -0,0 +1,55 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Memory leak reporting utilities. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _leak_h_ +#define _leak_h_ + +struct leak_set; +typedef struct leak_set leak_set_t; + +struct stackatom; + +/* + * Public interface. + */ + +leak_set_t *leak_init(void); +void leak_close_null(leak_set_t **ls_ptr); +void leak_add(leak_set_t *ls, size_t size, const char *file, int line); +void leak_stack_add(leak_set_t *ls, size_t size, const struct stackatom *sa); +void leak_dump(const leak_set_t *ls); + +#endif /* _leak_h_ */ + +/* vi: set ts=4 sw=4 cindent: */ +
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/list.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/list.c
Changed
@@ -1,5 +1,6 @@ /* - * Copyright (c) 2003, Christian Biere + * Copyright (c) 2003 Christian Biere + * Copyright (c) 2013 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -25,25 +26,38 @@ * @ingroup lib * @file * - * Handling of lists on a slightly higher level than GList. + * Handling of lists on a slightly higher level than plist_t. * * The purpose of this list functions is providing efficient appending, * prepending of items to a list structure, fast lookup of the list * length, fast access to the list head and tail. Additionally, some basic * checks prevent modification of the list whilst traversing it. * + * Each linked list object can be made thread-safe, optionally, so that + * concurrent access to it be possible. + * * @author Christian Biere - * @date 2006 + * @date 2003 + * @author Raphael Manfredi + * @date 2013 */ #include "common.h" #include "list.h" + +#include "log.h" #include "misc.h" -#include "glib-missing.h" +#include "mutex.h" +#include "plist.h" #include "walloc.h" + #include "override.h" /* Must be the tail header included */ +#if 0 +#define USE_LIST_REGRESSION +#endif + typedef enum { LIST_MAGIC = 0x134747a9U } list_magic_t; @@ -55,34 +69,66 @@ struct list { list_magic_t magic; int refcount; - GList *head; - GList *tail; + plist_t *head; + plist_t *tail; + mutex_t *lock; int length; - guint stamp; + uint stamp; }; struct list_iter { list_iter_magic_t magic; list_t *list; - GList *prev, *next; - gpointer data; - guint stamp; + plist_t *prev, *next; + void *data; + uint stamp; }; -#if 0 -#define USE_LIST_REGRESSION 1 -#endif +/* + * Thread-safe synchronization support. + */ -#define equiv(p,q) (!(p) == !(q)) +#define list_synchronize(l) G_STMT_START { \ + if G_UNLIKELY((l)->lock != NULL) { \ + list_t *wl = deconstify_pointer(l); \ + mutex_lock(wl->lock); \ + } \ +} G_STMT_END + +#define list_unsynchronize(l) G_STMT_START { \ + if G_UNLIKELY((l)->lock != NULL) { \ + list_t *wl = deconstify_pointer(l); \ + mutex_unlock(wl->lock); \ + } \ +} G_STMT_END + +#define list_return(l, v) G_STMT_START { \ + if G_UNLIKELY((l)->lock != NULL) \ + mutex_unlock((l)->lock); \ + return v; \ +} G_STMT_END + +#define list_return_void(l) G_STMT_START { \ + if G_UNLIKELY((l)->lock != NULL) \ + mutex_unlock((l)->lock); \ + return; \ +} G_STMT_END + +#define assert_list_locked(l) G_STMT_START { \ + if G_UNLIKELY((l)->lock != NULL) \ + assert_mutex_is_owned((l)->lock); \ +} G_STMT_END #ifdef USE_LIST_REGRESSION static inline void list_regression(const list_t *list) { - g_assert(g_list_first(list->head) == list->head); - g_assert(g_list_first(list->tail) == list->head); - g_assert(g_list_last(list->head) == list->tail); - g_assert(g_list_length(list->head) == (guint) list->length); + list_synchronize(list); + g_assert(plist_first(list->head) == list->head); + g_assert(plist_first(list->tail) == list->head); + g_assert(plist_last(list->head) == list->tail); + g_assert(plist_length(list->head) == (uint) list->length); + list_unsynchronize(list); } #else #define list_regression(list) @@ -95,7 +141,9 @@ g_assert(LIST_MAGIC == list->magic); g_assert(list->refcount > 0); g_assert(list->length >= 0); - g_assert(equiv(list->length == 0, !list->head && !list->tail)); + /* Only check the "equiv" when list is not configured for concurrency */ + g_assert(list->lock != NULL || + equiv(list->length == 0, !list->head && !list->tail)); list_regression(list); } @@ -143,12 +191,9 @@ list_new(void) { list_t *list; - - WALLOC(list); - list->head = NULL; - list->tail = NULL; + + WALLOC0(list); list->refcount = 1; - list->length = 0; list->stamp = LIST_MAGIC + 1; list->magic = LIST_MAGIC; list_regression(list); @@ -165,19 +210,22 @@ g_assert(list_ptr); if (*list_ptr) { list_t *list; - + list = *list_ptr; g_assert(LIST_MAGIC == list->magic); + + list_synchronize(list); + g_assert(equiv(list->length == 0, list->tail == NULL)); list_regression(list); if (--list->refcount != 0) { - g_carp("list_free: list is still referenced! " - "(list=%p, list->refcount=%d)", - cast_to_gconstpointer(list), list->refcount); + s_critical("%s(): list is still referenced! " + "(list=%p, list->refcount=%d)", + G_STRFUNC, cast_to_constpointer(list), list->refcount); } - gm_list_free_null(&list->head); + plist_free_null(&list->head); list->tail = NULL; list->magic = 0; @@ -187,6 +235,56 @@ } /** + * Mark newly created list as being thread-safe. + * + * This will make all external operations on the list thread-safe. + */ +void +list_thread_safe(list_t *l) +{ + list_check(l); + g_assert(NULL == l->lock); + + WALLOC0(l->lock); + mutex_init(l->lock); +} + +/** + * Lock the list to allow a sequence of operations to be atomically + * conducted. + * + * It is possible to lock the list several times as long as each locking + * is paired with a corresponding unlocking in the execution flow. + * + * The list must have been marked thread-safe already. + */ +void +list_lock(list_t *l) +{ + list_check(l); + g_assert_log(l->lock != NULL, + "%s(): list %p not marked thread-safe", G_STRFUNC, l); + + mutex_lock(l->lock); +} + +/* + * Release lock on list. + * + * The list must have been marked thread-safe already and locked by the + * calling thread. + */ +void +list_unlock(list_t *l) +{ + list_check(l); + g_assert_log(l->lock != NULL, + "%s(): list %p not marked thread-safe", G_STRFUNC, l); + + mutex_unlock(l->lock); +} + +/** * Append `key' to the list. */ void @@ -195,8 +293,10 @@ list_check(list); g_assert(1 == list->refcount); - list->tail = g_list_append(list->tail, deconstify_gpointer(key)); - list->tail = g_list_last(list->tail); + list_synchronize(list); + + list->tail = plist_append(list->tail, deconstify_pointer(key)); + list->tail = plist_last(list->tail); if (!list->head) { list->head = list->tail; } @@ -205,6 +305,7 @@ list->stamp++; list_regression(list); + list_return_void(list); } /** @@ -216,7 +317,9 @@ list_check(list); g_assert(1 == list->refcount); - list->head = g_list_prepend(list->head, deconstify_gpointer(key)); + list_synchronize(list); + + list->head = plist_prepend(list->head, deconstify_pointer(key)); if (!list->tail) { list->tail = list->head; } @@ -225,22 +328,25 @@ list->stamp++; list_regression(list); + list_return_void(list); } /** * Insert `key' into the list. */ void -list_insert_sorted(list_t *list, const void *key, GCompareFunc func) +list_insert_sorted(list_t *list, const void *key, cmp_fn_t func) { list_check(list); - g_assert(1 == list->refcount); g_assert(func); - list->head = g_list_insert_sorted(list->head, - deconstify_gpointer(key), func); + list_synchronize(list); + + g_assert(1 == list->refcount); + + list->head = plist_insert_sorted(list->head, deconstify_pointer(key), func); if (list->tail) { - list->tail = g_list_last(list->tail); + list->tail = plist_last(list->tail); } else { list->tail = list->head; } @@ -249,41 +355,43 @@ list->stamp++; list_regression(list); + list_return_void(list); } /** * Remove `key' from the list. * @return whether we found the item in the list and deleted it. */ -gboolean +bool list_remove(list_t *list, const void *key) { - GList *item; + plist_t *item; + bool found; list_check(list); - item = g_list_find(list->head, deconstify_gpointer(key)); + list_synchronize(list); + + item = plist_find(list->head, deconstify_pointer(key)); if (item) { if (item == list->head) { - list->head = g_list_next(list->head); + list->head = plist_next(list->head); } if (item == list->tail) { - list->tail = g_list_previous(list->tail); + list->tail = plist_prev(list->tail); } - /* @note: Return value is only assigned to "item" because - * g_slist_delete_link is incorrectly tagged to - * cause a GCC compiler warning otherwise. - */ - item = g_list_delete_link(item, item); + plist_delete_link(item, item); list->length--; list->stamp++; list_regression(list); - return TRUE; + found = TRUE; + } else { + found = FALSE; } - return FALSE; + list_return(list, found); } /** @@ -294,22 +402,25 @@ void * list_shift(list_t *list) { - GList *item; + plist_t *item; void *key; - gboolean found; list_check(list); - item = list->head; - if (NULL == item) - return NULL; + list_synchronize(list); - key = item->data; - found = list_remove(list, key); + item = list->head; + if (NULL == item) { + key = NULL; + } else { + bool found; - g_assert(found); + key = item->data; + found = list_remove(list, key); + g_assert(found); + } - return key; + list_return(list, key); } /** @@ -318,9 +429,13 @@ void * list_tail(const list_t *list) { + void *data; + list_check(list); - return list->tail ? list->tail->data : NULL; + list_synchronize(list); + data = list->tail ? list->tail->data : NULL; + list_return(list, data); } /** @@ -329,46 +444,72 @@ void * list_head(const list_t *list) { + void *data; + list_check(list); - return list->head ? list->head->data : NULL; + list_synchronize(list); + data = list->head ? list->head->data : NULL; + list_return(list, data); } /** * Move entry to the head of the list. + * + * @return whether key was present in the list. */ -gboolean +bool list_moveto_head(list_t *list, const void *key) { + bool found; + + list_synchronize(list); + if (list_remove(list, key)) { list_prepend(list, key); - return TRUE; + found = TRUE; + } else { + found = FALSE; } - return FALSE; + + list_return(list, found); } /** * Move entry to the tail of the list. + * + * @return whether key was present in the list. */ -gboolean +bool list_moveto_tail(list_t *list, const void *key) { + bool found; + + list_synchronize(list); + if (list_remove(list, key)) { list_append(list, key); - return TRUE; + found = TRUE; + } else { + found = FALSE; } - return FALSE; + + list_return(list, found); } /** * @returns the length of the list. */ -guint +uint list_length(const list_t *list) { + uint length; + list_check(list); - return list->length; + list_synchronize(list); + length = list->length; + list_return(list, length); } /** @@ -387,12 +528,16 @@ iter->magic = LIST_ITER_MAGIC; iter->list = list; - iter->next = list->head; iter->prev = NULL; iter->data = NULL; + list_synchronize(list); + + iter->next = list->head; iter->stamp = list->stamp; list->refcount++; + + list_unsynchronize(list); } else { iter = NULL; } @@ -417,11 +562,15 @@ iter->list = list; iter->next = NULL; - iter->prev = list->tail; iter->data = NULL; + list_synchronize(list); + + iter->prev = list->tail; iter->stamp = list->stamp; list->refcount++; + + list_unsynchronize(list); } else { iter = NULL; } @@ -433,28 +582,34 @@ * Moves the iterator to the next element and returns its key. If * there is no next element, NULL is returned. */ -gpointer +void * list_iter_next(list_iter_t *iter) { - GList *next; + void *data; + plist_t *next; list_iter_check(iter); next = iter->next; if (next) { - iter->data = next->data; - iter->prev = g_list_previous(next); - iter->next = g_list_next(next); - return iter->data; + list_t *list = iter->list; + + data = iter->data = next->data; + list_synchronize(list); + iter->prev = plist_prev(next); + iter->next = plist_next(next); + list_unsynchronize(list); } else { - return NULL; + data = NULL; } + + return data; } /** * Checks whether there is a next item to be iterated over. */ -gboolean +bool list_iter_has_next(const list_iter_t *iter) { if (iter) { @@ -469,25 +624,31 @@ * Moves the iterator to the previous element and returns its key. If * there is no previous element, NULL is returned. */ -gpointer +void * list_iter_previous(list_iter_t *iter) { - GList *prev; + void *data; + plist_t *prev; list_iter_check(iter); prev = iter->prev; if (prev) { - iter->data = prev->data; - iter->next = g_list_next(prev); - iter->prev = g_list_previous(prev); - return iter->data; + list_t *list = iter->list; + + data = iter->data = prev->data; + list_synchronize(list); + iter->next = plist_next(prev); + iter->prev = plist_prev(prev); + list_unsynchronize(list); } else { - return NULL; + data = NULL; } + + return data; } -gpointer +void * list_iter_current(list_iter_t *iter) { list_iter_check(iter); @@ -498,7 +659,7 @@ /** * Checks whether there is a previous item in the iterator. */ -gboolean +bool list_iter_has_previous(const list_iter_t *iter) { if (iter) { @@ -519,11 +680,16 @@ if (*iter_ptr) { list_iter_t *iter; + list_t *list; iter = *iter_ptr; list_iter_check(iter); - iter->list->refcount--; + list = iter->list; + list_synchronize(list); + list->refcount--; + list_unsynchronize(list); + iter->magic = 0; WFREE(iter); @@ -535,37 +701,61 @@ * Check whether list contains the `key' whereas equality is determined * using `func'. */ -gboolean -list_contains(list_t *list, const void *key, GEqualFunc func, void **orig_key) +bool +list_contains(const list_t *list, const void *key, + eq_fn_t func, void **orig_key) { - GList *item; + plist_t *item; + bool found = FALSE; list_check(list); g_assert(func); - for (item = list->head; NULL != item; item = g_list_next(item)) { + list_synchronize(list); + + PLIST_FOREACH(list->head, item) { if (func(key, item->data)) { - if (orig_key) { + if (orig_key != NULL) { *orig_key = item->data; } - return TRUE; + found = TRUE; + break; } } - return FALSE; + + list_return(list, found); +} + +/** + * Check whether list contains the `key'. + */ +bool +list_contains_identical(const list_t *list, const void *key) +{ + bool contains; + + list_check(list); + + list_synchronize(list); + contains = NULL != plist_find(list->head, deconstify_pointer(key)); + list_return(list, contains); } /** * Apply `func' to all the items in the structure. */ void -list_foreach(const list_t *list, GFunc func, gpointer user_data) +list_foreach(const list_t *list, GFunc func, void *user_data) { list_check(list); g_assert(func); - g_list_foreach(list->head, func, user_data); + list_synchronize(list); + + plist_foreach(list->head, func, user_data); list_regression(list); + list_return_void(list); } static void @@ -590,8 +780,12 @@ list_t *list = *list_ptr; list_check(list); - G_LIST_FOREACH_WITH_DATA(list->head, list_freecb_wrapper, + list_synchronize(list); + + PLIST_FOREACH_CALL_DATA(list->head, list_freecb_wrapper, cast_func_to_pointer(freecb)); + + list_unsynchronize(list); list_free(list_ptr); } }
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/list.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/list.h
Changed
@@ -34,26 +34,27 @@ list_t *list_new(void); void list_free(list_t **list_ptr); -gboolean list_remove(list_t *list, const void *key); +bool list_remove(list_t *list, const void *key); void list_append(list_t *list, const void *key); void list_prepend(list_t *list, const void *key); -void list_insert_sorted(list_t *list, const void *key, GCompareFunc func); -gboolean list_moveto_head(list_t *list, const void *key); -gboolean list_moveto_tail(list_t *list, const void *key); +void list_insert_sorted(list_t *list, const void *key, cmp_fn_t func); +bool list_moveto_head(list_t *list, const void *key); +bool list_moveto_tail(list_t *list, const void *key); void *list_shift(list_t *list); void *list_head(const list_t *list); void *list_tail(const list_t *list); -guint list_length(const list_t *list); -gboolean list_contains(list_t *list, const void *key, - GEqualFunc func, void **orig_key); +uint list_length(const list_t *list); +bool list_contains(const list_t *list, const void *key, + eq_fn_t func, void **orig_key); +bool list_contains_identical(const list_t *list, const void *key); void list_foreach(const list_t *list, GFunc func, void *user_data); void list_free_all(list_t **list_ptr, list_destroy_cb freecb); list_iter_t *list_iter_before_head(list_t *list); list_iter_t *list_iter_after_tail(list_t *list); void list_iter_free(list_iter_t **iter_ptr); -gboolean list_iter_has_next(const list_iter_t *iter); -gboolean list_iter_has_previous(const list_iter_t *iter); +bool list_iter_has_next(const list_iter_t *iter); +bool list_iter_has_previous(const list_iter_t *iter); void *list_iter_next(list_iter_t *iter); void *list_iter_previous(list_iter_t *iter); void *list_iter_current(list_iter_t *iter);
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/listener.c
Added
@@ -0,0 +1,73 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Event listening interface. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#include "listener.h" +#include "hashing.h" +#include "pow2.h" +#include "spinlock.h" + +#include "override.h" /* Must be the last header included */ + +/* + * To avoid too much lock contention between separate event names, we use an + * array of spinlocks to create the critical sections. The actual spinlock + * to use is obtained by hashing the signal name and then indexing within + * that array. + */ +static spinlock_t listener_access = { + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 4 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 8 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 12 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 16 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 20 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 24 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 28 */ + SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, SPINLOCK_INIT, /* 32 */ +}; + +#define LISTENER_HASH_MASK (N_ITEMS(listener_access) - 1) + +/* + * Get spinlock to use based on the signal name. + */ +spinlock_t * +listener_get_lock(const char *name) +{ + STATIC_ASSERT(IS_POWER_OF_2(LISTENER_HASH_MASK + 1)); + + return &listener_accessstring_mix_hash(name) & LISTENER_HASH_MASK; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/listener.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/listener.h
Changed
@@ -25,7 +25,7 @@ * @ingroup lib * @file * - * Needs brief description here. + * Event listening interface. * * @author Richard Eckart * @date 2001-2003 @@ -36,7 +36,12 @@ #include "common.h" +#include "spinlock.h" +#include "pslist.h" + /** + * OVERVIEW + * * To use the macros below with a "node_added" signal for example, * you need to have a storage stucture to hold the listeners list * This needs to be defined in the following fashion. The name is @@ -50,34 +55,129 @@ * * typedef void (*node_added_listener_t) (gnutella_node_t *, const char *); * - * Again the name is important (like above). + * Again the name prefix is important (like above). + * + * EXAMPLE + * + * Here's a full working example showing how to use listening interface. + * + * We want to monitor the creation of GUESS queries from the outside, without + * the GUESS code knowing who is monitoring it exactly. + * + * - We declare the following in the GUESS layer (guess.h): + * + * enum guess_mode { + * GUESS_QUERY_BOUNDED, + * GUESS_QUERY_LOOSE + * }; + * + * struct guess_query { + * size_t max_ultra; + * enum guess_mode mode; + * }; + * + * typedef void (*guess_event_listener_t)(gnet_search_t, + * const struct guess_query *query); + * + * void guess_event_listener_add(guess_event_listener_t); + * void guess_event_listener_remove(guess_event_listener_t); + * + * - We implement the following in the GUESS layer (guess.c): + * + * static listeners_t guess_event_listeners; + * + * void guess_event_listener_add(guess_event_listener_t l) { + * LISTENER_ADD(guess_event, l); + * } + * + * void guess_event_listener_remove(guess_event_listener_t l) { + * LISTENER_REMOVE(guess_event, l); + * } + * + * static void + * guess_event_fire(const guess_t *gq, bool created) + * { + * struct guess_query query; + * + * query.max_ultra = gq->max_ultrapeers; + * query.mode = gq->mode; + * + * LISTENER_EMIT(guess_event, (gq->sh, created ? &query : NULL)); + * } + * + * - We use it as follows from the GUESS layer: + * + * guess_event_fire(gq, TRUE); // Each time a new query is created + * + * - We register listeners externally like this, from the GUI for instance: + * + * guess_event_listener_add(gui_guess_event); + * + * - We implement the listening callback in the GUI: + * + * static void + * gui_guess_event(gnet_search_t sh, const struct guess_query *query) + * { + * // whatever needs to be done + * } + * + * NOTES + * + * The parameters for the callback need to be enclosed in parentheses within + * the second LISTENER_EMIT() macro argument, according to the defined + * signature for that particular callback -- each event can have a different + * signature! + * + * There is a fair amount of plumbering required, but this pattern allows + * total separation of concerns between the GUESS and the GUI modules: the + * GUESS layer does not know who is listening to events (there could be + * multiple parties interested) and the GUI only needs to register its + * listener but does not need to know when events are fired. There is no + * access of the GUESS internals by the callback: all the necessary data for + * the listener is copied by the GUESS layer. + * + * The only dependency is in the listener registering/removal interface that + * the GUESS layer has to provide, plus the definition of the parameters that + * will be passed to the callback. And of course, the semantics of the + * events triggered must be clearly known. */ -typedef GSList *listeners_t; +typedef pslist_t *listeners_t; + +spinlock_t *listener_get_lock(const char *name); #define LISTENER_ADD(signal, callback) \ G_STMT_START { \ void *p = func_to_pointer(callback); \ + spinlock_t *lock = listener_get_lock(STRINGIFY(signal)); \ g_assert(NULL != p); \ - CAT2(signal,_listeners) = g_slist_append(CAT2(signal,_listeners), p); \ + spinlock(lock); \ + CAT2(signal,_listeners) = pslist_append(CAT2(signal,_listeners), p); \ + spinunlock(lock); \ } G_STMT_END #define LISTENER_REMOVE(signal, callback) \ G_STMT_START { \ void *p = func_to_pointer(callback); \ + spinlock_t *lock = listener_get_lock(STRINGIFY(signal)); \ g_assert(NULL != p); \ - CAT2(signal,_listeners) = g_slist_remove(CAT2(signal,_listeners), p); \ + spinlock(lock); \ + CAT2(signal,_listeners) = pslist_remove(CAT2(signal,_listeners), p); \ + spinunlock(lock); \ } G_STMT_END #define LISTENER_EMIT(signal, params) \ G_STMT_START { \ - GSList *sl; \ - for (sl = CAT2(signal,_listeners); sl != NULL; sl = g_slist_next(sl)) { \ + pslist_t *sl; \ + spinlock_t *lock = listener_get_lock(STRINGIFY(signal)); \ + spinlock(lock); \ + for (sl = CAT2(signal,_listeners); sl != NULL; sl = pslist_next(sl)) { \ CAT2(signal,_listener_t) fn; \ g_assert(NULL != sl->data); \ - fn = (CAT2(signal,_listener_t)) cast_pointer_to_func(sl->data); \ + fn = (CAT2(signal,_listener_t)) cast_pointer_to_func(sl->data); \ fn params; \ } \ + spinunlock(lock); \ } G_STMT_END #endif /* _listener_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/log.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/log.c
Changed
@@ -38,9 +38,10 @@ * The t_xxx() routines are meant to be used in dedicate threads to avoid * concurrent memory allocation which is not otherwise supported. They require * a thread-private logging object, which can be NULL to request a default - * object for the main thread. A side effect of using t_xxx() routines is that - * there is a guarantee that no malloc()-like routine will be called to log - * the message. + * object for the main thread. + * + * A side effect of using t_xxx() or s_xxx() routines is that there is a + * guarantee that no malloc()-like routine will be called to log the message. * * There is also support for a polymorphic logging interface, through a * so-called "log agent" object. @@ -59,19 +60,25 @@ #include "common.h" #include "log.h" +#include "atio.h" +#include "atomic.h" #include "atoms.h" #include "ckalloc.h" #include "crash.h" -#include "halloc.h" #include "fd.h" /* For is_valid_fd() */ #include "glog.h" +#include "halloc.h" +#include "hashing.h" /* For string_mix_hash() and string_eq() */ +#include "hashtable.h" +#include "misc.h" /* For CONST_STRLEN() */ #include "offtime.h" +#include "once.h" #include "signal.h" +#include "spinlock.h" #include "stacktrace.h" #include "str.h" #include "stringify.h" #include "thread.h" -#include "timestamp.h" #include "tm.h" #include "walloc.h" @@ -81,14 +88,39 @@ #define LOG_MSG_DEFAULT 4080 /**< Default string length for logger */ #define LOG_IOERR_GRACE 5 /**< Seconds between I/O errors */ +/* + * An internal log flag given to s_logv() to request explicit copy of the + * message to stdout. Since we're extending the GLogLevelFlags enum, we have + * also to avoid using G_LOG_LEVEL_MASK to sort out the logging level out of + * the flags... + */ +#define LOG_FLAG_COPY (1 << G_LOG_LEVEL_USER_SHIFT) +#define LOG_LEVEL_MASK (G_LOG_LEVEL_MASK & ~LOG_FLAG_COPY) + static const char * const log_domains = { - G_LOG_DOMAIN, "Gtk", "GLib", "Pango" + G_LOG_DOMAIN, "Gtk", "Gdk", "GLib", "Pango" }; -static gboolean atoms_are_inited; -static gboolean log_inited; +static bool atoms_are_inited; +static bool log_inited; static str_t *log_str; -static time_delta_t log_gmtoff; +static thread_key_t log_okey = THREAD_KEY_INIT; +static once_flag_t log_okey_inited; +static thread_key_t log_strkey = THREAD_KEY_INIT; +static once_flag_t log_strkey_inited; + +/** + * How large is the string holding the optional PID to log (e.g " 12345"). + */ +#define LOG_PIDLEN (ULONG_DEC_BUFLEN + CONST_STRLEN(" ")) + +/** + * Length of a buffer able to hold the formatted time plus optionally + * the PID of the process. + */ +#define LOG_TIME_BUFLEN (CRASH_TIME_BUFLEN + LOG_PIDLEN) + +static char logpidLOG_PIDLEN; /**< If non-empty, also log process PID */ /** * A Log file we manage. @@ -114,11 +146,12 @@ /** * Thread private logging data. */ -struct logthread { +typedef struct logthread { enum logthread_magic magic; volatile sig_atomic_t in_log_handler; /**< Recursion detection */ ckhunk_t *ck; /**< Chunk from which we can allocate memory */ -}; + unsigned stid; /**< Thread small ID */ +} logthread_t; static inline void logthread_check(const struct logthread * const lt) @@ -132,6 +165,7 @@ * Logging agent types. */ enum agent { + LOG_A_STDOUT, /**< Log to stdout */ LOG_A_STDERR, /**< Log to stderr */ LOG_A_STRING, /**< Log to string */ @@ -188,28 +222,52 @@ static struct logfile logfileLOG_MAX_FILES; #define log_flush_out() \ - flush_str(G_LIKELY(log_inited) ? logfileLOG_STDOUT.fd : STDOUT_FILENO) + flush_str( \ + G_LIKELY(log_inited) ? logfileLOG_STDOUT.fd : STDOUT_FILENO) + #define log_flush_err() \ - flush_str(G_LIKELY(log_inited) ? logfileLOG_STDERR.fd : STDERR_FILENO) + flush_str( \ + G_LIKELY(log_inited) ? logfileLOG_STDERR.fd : STDERR_FILENO) +#define log_flush_out_atomic() \ + flush_str_atomic( \ + G_LIKELY(log_inited) ? logfileLOG_STDOUT.fd : STDOUT_FILENO) -/** - * This is used to detect recurstion in s_logv(). - */ -static volatile sig_atomic_t in_safe_handler; +#define log_flush_err_atomic() \ + flush_str_atomic( \ + G_LIKELY(log_inited) ? logfileLOG_STDERR.fd : STDERR_FILENO) +static bool log_crashing; static const char DEV_NULL = "/dev/null"; /** + * Make sure all logging routines are always using a raw log. + * + * Also a copy of all the logs is made to stdout automatically. + * + * This is used during emergency crashing conditions to ensure logging is + * always going to use a safe logging mode. + */ +void G_COLD +log_crash_mode(void) +{ + log_crashing = TRUE; +} + +/** * @return pre-allocated chunk for allocating memory when no malloc() wanted. */ static ckhunk_t * log_chunk(void) { static ckhunk_t *ck; + static spinlock_t chunk_slk = SPINLOCK_INIT; if G_UNLIKELY(NULL == ck) { - ck = ck_init(LOG_MSG_MAXLEN * 4, LOG_MSG_MAXLEN); + spinlock_raw(&chunk_slk); + if (NULL == ck) + ck = ck_init(LOG_MSG_MAXLEN * 4, LOG_MSG_MAXLEN); + spinunlock_raw(&chunk_slk); } return ck; @@ -222,6 +280,34 @@ } /** + * Get logging agent for stdout logging. + * + * @attention + * There must not be any memory allocation done here in case this routine + * is called during a crash, through a crashing hook. + */ +logagent_t * +log_agent_stdout_get(void) +{ + static logagent_t la; + static spinlock_t agent_lck = SPINLOCK_INIT; + + if G_UNLIKELY(la.magic != LOGAGENT_MAGIC) { + spinlock(&agent_lck); + if (la.magic != LOGAGENT_MAGIC) { + struct logfile *lf = &logfileLOG_STDOUT; + + la.magic = LOGAGENT_MAGIC; + la.type = LOG_A_STDOUT; + la.u.f = lf; + } + spinunlock(&agent_lck); + } + + return &la; +} + +/** * Get logging agent for stderr logging. * * @attention @@ -232,13 +318,18 @@ log_agent_stderr_get(void) { static logagent_t la; + static spinlock_t agent_lck = SPINLOCK_INIT; if G_UNLIKELY(la.magic != LOGAGENT_MAGIC) { - struct logfile *lf = &logfileLOG_STDERR; + spinlock(&agent_lck); + if (la.magic != LOGAGENT_MAGIC) { + struct logfile *lf = &logfileLOG_STDERR; - la.magic = LOGAGENT_MAGIC; - la.type = LOG_A_STDERR; - la.u.f = lf; + la.magic = LOGAGENT_MAGIC; + la.type = LOG_A_STDERR; + la.u.f = lf; + } + spinunlock(&agent_lck); } return &la; @@ -279,6 +370,17 @@ } /** + * Reserve room in the logging string. + */ +static void +log_driver_string_reserve(struct logstring *ls, size_t len) +{ + logstring_check(ls); + + str_reserve(ls->buffer, len); +} + +/** * Create a new logging agent for string logging. * * @param size size hint for the string (0 for default) @@ -349,6 +451,34 @@ } /** + * Reserve room in the log agent to be able to safely append ``len'' bytes + * of data without memory allocation. + * + * This routine does nothing if called on a logging agent not tied to + * a string buffer. + * + * @param la the log agent + * @param len amount of bytes we would like to reserve (pre-extension) + */ +void +log_agent_reserve(logagent_t *la, size_t len) +{ + logagent_check(la); + + switch (la->type) { + case LOG_A_STDOUT: + case LOG_A_STDERR: + return; /* Nothing we can do here */ + case LOG_A_STRING: + log_driver_string_reserve(la->u.s, len); + return; + case LOG_A_MAXTYPE: + break; + } + g_assert_not_reached(); +} + +/** * Free logging agent structure. */ static void @@ -357,6 +487,7 @@ logagent_check(la); switch (la->type) { + case LOG_A_STDOUT: case LOG_A_STDERR: /* The logfile_t structure is static */ goto freeing; @@ -389,56 +520,116 @@ /** * Allocate a thread-private logging data descriptor. * - * This must be done in the main thread before starting subsequent threads - * since the memory allocation code is not thread-safe. + * @return newly created logging descriptor, NULL if we can't allocate memory. */ -logthread_t * +static logthread_t * log_thread_alloc(void) { logthread_t *lt; ckhunk_t *ck; + if (signal_in_unsafe_handler()) + return NULL; /* Can't allocate memory right now */ + ck = ck_init_not_leaking(2 * LOG_MSG_MAXLEN, 0); lt = ck_alloc(ck, sizeof *lt); lt->magic = LOGTHREAD_MAGIC; lt->ck = ck; lt->in_log_handler = FALSE; + lt->stid = thread_small_id(); return lt; } /** - * Get suitable thread-private logging data descriptor. + * Create the log object key, once. + */ +static void +log_okey_init(void) +{ + if (-1 == thread_local_key_create(&log_okey, THREAD_LOCAL_KEEP)) + s_minierror("cannot initialize logthread object key: %m"); +} + +/** + * Get suitable thread-local logging data descriptor. * - * If argument is non-NULL, use that one, otherwise use a private local one. - * This allows non-threaded code to use the t_xxx() logging routines with a - * NULL object and get safe logging with no call to malloc(). + * @param once if TRUE, don't record the object as it will be used once * - * @return valid logging data object. + * @return valid logging data object for the current thread, NULL if we cannot + * allocate one. */ static logthread_t * -logthread_object(logthread_t *lt) +logthread_object(bool once) { - if (NULL == lt) { - logthread_t *ltp; + logthread_t *lt; - ltp = thread_private_get(func_to_pointer(logthread_object)); + ONCE_FLAG_RUN(log_okey_inited, log_okey_init); - if G_UNLIKELY(NULL == ltp) { - ltp = log_thread_alloc(); - thread_private_add(func_to_pointer(logthread_object), ltp); - } + lt = thread_local_get(log_okey); - return ltp; - } else { - return lt; + if G_UNLIKELY(NULL == lt) { + lt = log_thread_alloc(); + if (NULL == lt) + return NULL; + if (!once) + thread_local_set(log_okey, lt); + } + + logthread_check(lt); + return lt; +} + +/** + * Allocate local log formatting string object. + */ +static str_t * +log_string_alloc(void) +{ + /* + * We set a reasonable initial size, but this string can dynamically + * grow and has no upper limit. + */ + + return str_new_not_leaking(LOG_MSG_MAXLEN); +} + +/** + * Create the log string key, once. + */ +static void +log_strkey_init(void) +{ + if (-1 == thread_local_key_create(&log_strkey, THREAD_LOCAL_KEEP)) + s_minierror("cannot initialize logstring object key: %m"); +} + +/** + * Get suitable thread-local logging string. + * + * @return valid logging string object for the current thread. + */ +static str_t * +logstring_object(void) +{ + str_t *s; + + ONCE_FLAG_RUN(log_strkey_inited, log_strkey_init); + + s = thread_local_get(log_strkey); + + if G_UNLIKELY(NULL == s) { + s = log_string_alloc(); + thread_local_set(log_strkey, s); } + + return s; } /** * Is stdio file printable? */ -gboolean +bool log_file_printable(const FILE *out) { if (stderr == out) @@ -452,7 +643,7 @@ /** * Is log file printable? */ -gboolean +bool log_printable(enum log_file which) { struct logfile *lf; @@ -479,12 +670,16 @@ * Emit log message. */ static void -log_fprint(enum log_file which, const struct tm *ct, GLogLevelFlags level, - const char *prefix, const char *msg) +log_fprint(enum log_file which, const struct tm *ct, long usec, + GLogLevelFlags level, const char *prefix, unsigned stid, const char *msg) { struct logfile *lf; + char buf32; + const char *tprefix; + str_t *ls; + ssize_t w; -#define FORMAT_STR "%02d-%02d-%02d %.2d:%.2d:%.2d (%s)%s%s: %s\n" +#define FORMAT_STR "%02d-%02d-%02d %.02d:%.02d:%.02d.%03ld%s (%s)%s%s: %s\n" log_file_check(which); @@ -493,54 +688,55 @@ lf = &logfilewhich; + if (stid != 0) { + str_bprintf(buf, sizeof buf, "%s-%u", prefix, stid); + tprefix = buf; + } else { + tprefix = prefix; + } + /* * When crashing. we use a pre-allocated string object to format the * message and the write() system call to log, bypassing any memory * allocation and stdio. */ - if G_UNLIKELY(log_str != NULL) { - ssize_t w; + if G_UNLIKELY(log_str != NULL) + ls = log_str; + else + ls = logstring_object(); + + str_printf(ls, FORMAT_STR, + (TM_YEAR_ORIGIN + ct->tm_year) % 100, + ct->tm_mon + 1, ct->tm_mday, + ct->tm_hour, ct->tm_min, ct->tm_sec, usec / 1000, logpid, tprefix, + (level & G_LOG_FLAG_RECURSION) ? " RECURSIVE" : "", + (level & G_LOG_FLAG_FATAL) ? " FATAL" : "", + msg); - str_printf(log_str, FORMAT_STR, - (TM_YEAR_ORIGIN + ct->tm_year) % 100, - ct->tm_mon + 1, ct->tm_mday, - ct->tm_hour, ct->tm_min, ct->tm_sec, prefix, - (level & G_LOG_FLAG_RECURSION) ? " RECURSIVE" : "", - (level & G_LOG_FLAG_FATAL) ? " FATAL" : "", - msg); + /* + * Unfortunately, output made by two threads can intermix, i.e. the + * write() system call is not atomically flushing all the bytes to + * the file. Hence use our own atio_write() routine. + */ - w = write(fileno(lf->f), str_2c(log_str), str_len(log_str)); + w = atio_write(fileno(lf->f), str_2c(ls), str_len(ls)); - if G_UNLIKELY((ssize_t) -1 == w) { - lf->ioerror = TRUE; - lf->etime = tm_time(); - } + if G_UNLIKELY((ssize_t) -1 == w) { + lf->ioerror = TRUE; + lf->etime = tm_time(); + } - /* - * When duplication is configured, write a copy of the message - * without any timestamp and debug level tagging. - */ + /* + * When duplication is configured, write a copy of the message + * without any timestamp and debug level tagging. + */ - if (lf->duplicate) { - IGNORE_RESULT(write(lf->crash_fd, msg, strlen(msg))); - IGNORE_RESULT(write(lf->crash_fd, "\n", 1)); - } - } else { - gboolean ioerr; - - ioerr = 0 > fprintf(lf->f, FORMAT_STR, - (TM_YEAR_ORIGIN + ct->tm_year) % 100, - ct->tm_mon + 1, ct->tm_mday, - ct->tm_hour, ct->tm_min, ct->tm_sec, prefix, - (level & G_LOG_FLAG_RECURSION) ? " RECURSIVE" : "", - (level & G_LOG_FLAG_FATAL) ? " FATAL" : "", - msg); - - if G_UNLIKELY(ioerr) { - lf->ioerror = TRUE; - lf->etime = tm_time(); - } + if (lf->duplicate) { + iovec_t iov2; + iovec_set(&iov0, msg, strlen(msg)); + iovec_set(&iov1, "\n", 1); + atio_writev(lf->crash_fd, iov, N_ITEMS(iov)); } #undef FORMAT_STR @@ -552,31 +748,112 @@ * @return pointer to static string. */ const char * -log_prefix(GLogLevelFlags loglvl) +log_prefix(GLogLevelFlags level) { - switch (loglvl) { + /* + * Don't use G_LOG_LEVEL_MASK here: we need to clear our own LOG_FLAG_COPY + * flag as well + */ + + switch (level & LOG_LEVEL_MASK) { case G_LOG_LEVEL_CRITICAL: return "CRITICAL"; case G_LOG_LEVEL_ERROR: return "ERROR"; - case G_LOG_LEVEL_WARNING: return "WARNING"; + case G_LOG_LEVEL_WARNING: return "WARNING"; case G_LOG_LEVEL_MESSAGE: return "MESSAGE"; - case G_LOG_LEVEL_INFO: return "INFO"; + case G_LOG_LEVEL_INFO: return "INFO"; case G_LOG_LEVEL_DEBUG: return "DEBUG"; default: return "UNKNOWN"; } } /** + * Same as log_time(), albeit optionally use the raw time computation version. + */ +static void +log_time_careful(char *buf, size_t size, bool raw) +{ + if G_UNLIKELY(raw) + crash_time_raw(buf, size); + else + crash_time(buf, size); + + clamp_strcat(buf, size, logpid); +} + +/** + * Fill supplied buffer with the current time formatted as yy-mm-dd HH:MM:SS.sss + * and optionally the process PID, if configured to do so. + * + * The buffer should be at least LOG_TIME_BUFLEN bytes. + * + * @param buf buffer where current time is formatted + * @param size length of buffer + */ +static void +log_time(char *buf, size_t size) +{ + log_time_careful(buf, size, FALSE); +} + +/** + * Same as log_time() but uses raw time, and therefore does not take locks. + * + * @param buf buffer where current time is formatted + * @param size length of buffer + */ +static void +log_time_raw(char *buf, size_t size) +{ + log_time_careful(buf, size, TRUE); +} + +/** * Abort and make sure we never return. */ -void log_abort(void) +void +log_abort(void) { + static void *log_stackSTACKTRACE_DEPTH_MAX; + size_t count; + + /* + * If we have already generated a crash log and we are running supervised, + * it is time to exit: we're looping into errors. + */ + + if (crash_is_logged() && crash_is_supervised()) { + DECLARE_STR(3); + char time_bufLOG_TIME_BUFLEN; + + log_time(time_buf, sizeof time_buf); + print_str(time_buf); /* 0 */ + print_str(" (CRITICAL): crash log generated"); /* 1 */ + print_str(", good bye.\n"); /* 2 */ + + log_flush_err_atomic(); + if (log_stdout_is_distinct()) + log_flush_out_atomic(); + + _exit(EXIT_FAILURE); /* Immediate exit */ + } + + /* + * It may be difficult to backtrace the stack past the signal handler + * which is going to be invoked by raise(), hence save a copy of the + * current stack before crashing. + */ + + count = stacktrace_safe_unwind(log_stack, N_ITEMS(log_stack), 0); + crash_save_stackframe(thread_safe_small_id(), log_stack, count); + /* - * In case the error occurs within a critical section with - * all the signals blocked, make sure to unblock SIGBART. + * This is a synchronous error from the logging layer, so make sure we + * won't handle it as an asynchronous interrupt preventing symbol loading + * or fully decorated stack tracing if the crash handler has been + * installed. */ - signal_unblock(SIGABRT); - raise(SIGABRT); + signal_abort(); /* * Back from raise(), that's bad. @@ -589,15 +866,15 @@ { DECLARE_STR(3); - char time_buf18; + char time_bufLOG_TIME_BUFLEN; - crash_time(time_buf, sizeof time_buf); - print_str(time_buf); /* 0 */ + log_time(time_buf, sizeof time_buf); + print_str(time_buf); /* 0 */ print_str(" (CRITICAL): back from raise(SIGBART)"); /* 1 */ print_str(" -- invoking crash_handler()\n"); /* 2 */ - log_flush_err(); + log_flush_err_atomic(); if (log_stdout_is_distinct()) - log_flush_out(); + log_flush_out_atomic(); crash_handler(SIGABRT); @@ -608,36 +885,52 @@ */ rewind_str(0); - crash_time(time_buf, sizeof time_buf); - print_str(time_buf); /* 0 */ + log_time(time_buf, sizeof time_buf); + print_str(time_buf); /* 0 */ print_str(" (CRITICAL): back from crash_handler()"); /* 1 */ print_str(" -- exiting\n"); /* 2 */ - log_flush_err(); + log_flush_err_atomic(); if (log_stdout_is_distinct()) - log_flush_out(); + log_flush_out_atomic(); _exit(EXIT_FAILURE); /* Immediate exit */ } } /** - * Minimal logging service, in case of recursion or other drastic conditions. + * Raw logging service, in case of recursion or other drastic conditions. * - * This routine never allocates memory and by-passes stdio. + * This routine never allocates memory, by-passes stdio and does NOT save + * errno (since accessing errno in multi-threaded programs needs to access + * some pthread-data that may not be accessible if we corrupted memory). + * + * When the ``raw'' argument is set, it also carefully avoids taking locks, + * using a non-atomic log flushing, etc.. + * + * It is suitable to be called (directly or through its wrappers) when we are + * about to terminate the process anyway, so preserving errno is not critical. * * @param level glib-compatible log level flags + * @param raw if TRUE, carefully avoid taking locks, use safe routines * @param copy whether to copy message to stdout as well * @param fmt formatting string * @param args variable argument list to format + * + * @attention + * This routine will clobber "errno" if an error occurs. */ void -s_minilogv(GLogLevelFlags level, gboolean copy, const char *fmt, va_list args) +s_rawlogv(GLogLevelFlags level, bool raw, bool copy, + const char *fmt, va_list args) { char dataLOG_MSG_MAXLEN; - DECLARE_STR(9); - char time_buf18; + DECLARE_STR(11); + char time_bufLOG_TIME_BUFLEN; const char *prefix; - GLogLevelFlags loglvl; + unsigned stid; + + if G_UNLIKELY(logfileLOG_STDERR.disabled) + return; /* * Force emisison on stdout as well for fatal messages. @@ -653,8 +946,33 @@ if (!copy && !log_printable(LOG_STDERR)) return; - loglvl = level & ~(G_LOG_FLAG_RECURSION | G_LOG_FLAG_FATAL); - prefix = log_prefix(loglvl); + prefix = log_prefix(level); + + /* + * In a unsafe signal handler, always use "raw" mode. + * + * Note that we use this call to compute the (safe) small ID as a side + * effect, since checking for us running in a signal handler already + * requires the computation to be made. + */ + + if (signal_in_unsafe_handler_stid(&stid)) + raw = TRUE; + + /* + * In "raw" mode, use minimalistic routines, which of course may not + * yield correct information all the time. + */ + + if G_UNLIKELY(raw) { + if (THREAD_UNKNOWN_ID == stid) + stid = 0; + log_time_raw(time_buf, sizeof time_buf); /* Raw, no locks! */ + } else { + if (THREAD_UNKNOWN_ID == stid) + stid = thread_small_id(); /* New discovered thread! */ + log_time(time_buf, sizeof time_buf); + } /* * Because str_vncatf() is recursion-safe, we know we can't return @@ -663,46 +981,165 @@ str_vbprintf(data, sizeof data, fmt, args); /* Uses str_vncatf() */ - crash_time(time_buf, sizeof time_buf); print_str(time_buf); /* 0 */ print_str(" ("); /* 1 */ print_str(prefix); /* 2 */ - print_str(")"); /* 3 */ + if (stid != 0) { + char stid_bufULONG_DEC_BUFLEN; + const char *stid_str = PRINT_NUMBER(stid_buf, stid); + print_str("-"); /* 3 */ + print_str(stid_str); /* 4 */ + } + print_str(")"); /* 5 */ if G_UNLIKELY(level & G_LOG_FLAG_RECURSION) - print_str(" RECURSIVE"); /* 4 */ + print_str(" RECURSIVE"); /* 6 */ if G_UNLIKELY(level & G_LOG_FLAG_FATAL) - print_str(" FATAL"); /* 5 */ - print_str(": "); /* 6 */ - print_str(data); /* 7 */ - print_str("\n"); /* 8 */ - log_flush_err(); - if (copy && log_stdout_is_distinct()) - log_flush_out(); + print_str(" FATAL"); /* 7 */ + print_str(": "); /* 8 */ + print_str(data); /* 9 */ + print_str("\n"); /* 10 */ + + /* + * In "raw" mode, use non-atomic flushes to avoid locks. + */ + + if G_UNLIKELY(raw) { + log_flush_err(); + if (copy && log_stdout_is_distinct()) + log_flush_out(); + } else { + log_flush_err_atomic(); + if (copy && log_stdout_is_distinct()) + log_flush_out_atomic(); + } + + /* + * When duplication is configured, write a copy of the message + * without any timestamp and debug level tagging. + */ + + if G_UNLIKELY(logfileLOG_STDERR.duplicate) { + int fd = logfileLOG_STDERR.crash_fd; + iovec_t iov2; + iovec_set(&iov0, data, clamp_strlen(data, sizeof data)); + iovec_set(&iov1, "\n", 1); + if (raw) + IGNORE_RESULT(writev(fd, iov, N_ITEMS(iov))); + else + atio_writev(fd, iov, N_ITEMS(iov)); + } +} + +/** + * Minimal logging service, in case of recursion or other drastic conditions. + * + * This routine never allocates memory and by-passes stdio. + * + * @param level glib-compatible log level flags + * @param copy whether to copy message to stdout as well + * @param fmt formatting string + * @param args variable argument list to format + */ +void +s_minilogv(GLogLevelFlags level, bool copy, const char *fmt, va_list args) +{ + int saved_errno; + bool crashing = log_crashing; + + saved_errno = errno; + s_rawlogv(level, crashing, copy || crashing, fmt, args); + errno = saved_errno; } +enum stacktrace_stack_level { + STACKTRACE_NONE = 0, + STACKTRACE_NORMAL, + STACKTRACE_PLAIN +}; + /** * Emit stacktrace to stderr and stdout (if distinct from stderr). * * @param no_stdio whether we must avoid stdio * @param offset stack offset to apply to remove overhead from stack */ -static void NO_INLINE -s_stacktrace(gboolean no_stdio, unsigned offset) +void NO_INLINE +s_stacktrace(bool no_stdio, unsigned offset) { - if (no_stdio) { - stacktrace_where_safe_print_offset(STDERR_FILENO, offset + 1); - if (log_stdout_is_distinct()) - stacktrace_where_safe_print_offset(STDOUT_FILENO, offset + 1); + static enum stacktrace_stack_level tracingTHREAD_MAX; + static bool warnedTHREAD_MAX; + unsigned stid = thread_small_id(); + + /* + * Protect thread, in case any of the tracing causes a recursion. + * Indeed, recursion would probably be fatal (endless) and would prevent + * further important debugging messages to be emitted by the thread. + * + * Initialally, the tracing level is STACKTRACE_NONE. The first time + * we attempt a trace, we move to STACKTRACE_NORMAL. If a recursion + * happens we raise to STACKTRACE_PLAIN, at which point a further recursion + * causes us to skip the tracing, warning once. + */ + + if (STACKTRACE_NONE != tracingstid) { + if (STACKTRACE_PLAIN == tracingstid) { + if (!warnedstid) { + warnedstid = TRUE; + s_rawwarn("skipping trace for %s (already in progress)", + thread_id_name(stid)); + } + return; + } else { + tracingstid = STACKTRACE_PLAIN; + } + } + + /* + * If the process has entered "crash mode", then it is unsafe to emit + * a stacktrace here because memory allocation could do weird things + * with locks being disabled... Only let the crashing thread continue. + */ + + if (thread_in_crash_mode() && !thread_is_crashing()) { + if (!warnedstid) { + warnedstid = TRUE; + s_rawwarn("skipping trace for %s (crash mode)", + thread_safe_id_name(stid)); + } + thread_check_suspended(); /* Probably was already suspended? */ + return; + } + + if (STACKTRACE_NONE == tracingstid) + tracingstid = STACKTRACE_NORMAL; + + if (STACKTRACE_NORMAL == tracingstid) { + if (no_stdio) { + stacktrace_where_safe_print_offset(STDERR_FILENO, offset + 1); + if (log_stdout_is_distinct()) + stacktrace_where_safe_print_offset(STDOUT_FILENO, offset + 1); + } else { + stacktrace_where_sym_print_offset(stderr, offset + 1); + if (log_stdout_is_distinct()) + stacktrace_where_sym_print_offset(stdout, offset + 1); + + if (is_running_on_mingw()) { + /* Unbuffering does not work on Windows, flush both */ + fflush(stderr); + fflush(stdout); + } + } } else { - stacktrace_where_sym_print_offset(stderr, offset + 1); + stacktrace_where_plain_print_offset(STDERR_FILENO, offset + 1); if (log_stdout_is_distinct()) - stacktrace_where_sym_print_offset(stdout, offset + 1); + stacktrace_where_plain_print_offset(STDOUT_FILENO, offset + 1); + } - if (is_running_on_mingw()) { - /* Unbuffering does not work on Windows, flush both */ - fflush(stderr); - fflush(stdout); - } + if (STACKTRACE_PLAIN == tracingstid) { + tracingstid = STACKTRACE_NORMAL; + warnedstid = FALSE; + } else { + tracingstid = STACKTRACE_NONE; } } @@ -711,149 +1148,155 @@ * from a signal handler if needed, or from a concurrent thread with a * thread-private allocation chunk. * + * This routine does not use malloc(). + * * @param lt thread-private context (NULL if not in a concurrent thread) * @param level glib-compatible log level flags * @param format formatting string * @param args variable argument list to format */ -static void +static void G_PRINTF(3, 0) s_logv(logthread_t *lt, GLogLevelFlags level, const char *format, va_list args) { + static volatile sig_atomic_t loggingTHREAD_MAX; int saved_errno = errno; - gboolean in_signal_handler = signal_in_handler(); - gboolean avoid_malloc; - static str_t *cstr; + bool in_signal_handler = signal_in_handler(); const char *prefix; str_t *msg; ckhunk_t *ck; void *saved; - gboolean recursing; - GLogLevelFlags loglvl; + bool recursing; + unsigned stid; + thread_sigsets_t set; if (G_UNLIKELY(logfileLOG_STDERR.disabled)) return; + if G_UNLIKELY(log_crashing) { + s_rawlogv(level, TRUE, TRUE, format, args); + return; + } + /* - * Until the atom layer is up, consider it unsafe to use malloc() - * because we have not fully initialized the memory layer yet - * (only the VMM layer can be assumed to be ready). + * The per-thread log object allows us to track recursion and contains + * our small thread-ID. It is allocated once per thread. * - * This allows the usage of s_xxx() logging routines very early in - * the process. + * We don't attempt to grab a new one when logging a fatal condition + * because the state of the application may be corrupted and could + * fail the memory allocation. */ - avoid_malloc = lt != NULL || in_signal_handler || - !atoms_are_inited || log_str != NULL; + if G_UNLIKELY(NULL == lt && 0 == (level & G_LOG_FLAG_FATAL)) + lt = logthread_object(FALSE); /* - * An error is fatal, and indicates something is terribly wrong. - * Avoid allocating memory as much as possible, acting as if we - * were in a signal handler. + * Block all signals, to preserve the ability to log from a signal + * handler without causing recursions. */ - if G_UNLIKELY(G_LOG_LEVEL_ERROR == level) - avoid_malloc = TRUE; + thread_enter_critical(&set); /* * Detect recursion, but don't make it fatal. */ - if (G_UNLIKELY(lt != NULL)) { + if G_LIKELY(lt != NULL) { recursing = lt->in_log_handler; } else { - recursing = in_safe_handler; + recursing = loggingthread_small_id(); } if G_UNLIKELY(recursing) { - DECLARE_STR(6); - char time_buf18; + DECLARE_STR(9); + char time_bufLOG_TIME_BUFLEN; const char *caller; + bool copy; + stid = NULL == lt ? thread_small_id() : lt->stid; caller = stacktrace_caller_name(2); /* Could log, so pre-compute */ - crash_time(time_buf, sizeof time_buf); - print_str(time_buf); /* 0 */ - print_str(" (CRITICAL): recursion to format string \""); /* 1 */ - print_str(format); /* 2 */ - print_str("\" from "); /* 3 */ - print_str(caller); /* 4 */ - print_str("\n"); /* 5 */ - log_flush_err(); + log_time_raw(time_buf, sizeof time_buf); + print_str(time_buf); /* 0 */ + print_str(" (CRITICAL"); /* 1 */ + if (0 != stid) { + char stid_bufUINT_DEC_BUFLEN; + const char *snum = PRINT_NUMBER(stid_buf, stid); + + print_str("-"); /* 2 */ + print_str(snum); /* 3 */ + } + print_str("): recursion to format string \""); /* 4 */ + print_str(format); /* 5 */ + print_str("\" from "); /* 6 */ + print_str(caller); /* 7 */ + print_str("\n"); /* 8 */ + log_flush_err_atomic(); /* * A recursion with an error message is always fatal. */ - if (G_LOG_LEVEL_ERROR == level) + if (G_LOG_LEVEL_ERROR & level) log_abort(); /* * Use minimal logging. */ - s_minilogv(level | G_LOG_FLAG_RECURSION, level & G_LOG_FLAG_FATAL, - format, args); + copy = level & + (G_LOG_FLAG_FATAL | G_LOG_LEVEL_CRITICAL | LOG_FLAG_COPY); + s_minilogv(level | G_LOG_FLAG_RECURSION, copy, format, args); goto done; } /* * OK, no recursion so far. Emit log. - */ - - if (G_LIKELY(NULL == lt)) { - in_safe_handler = TRUE; - } else { - lt->in_log_handler = TRUE; - } - - /* + * * Within a signal handler, we can safely allocate memory to be * able to format the log message by using the pre-allocated signal * chunk and creating a string object out of it. * - * When not from a signal handler, we use a static string object to - * perform the formatting. + * When not from a signal handler, we use a static chunk or a per-thread + * chunk, as supplied through the log-thread object. */ - if G_UNLIKELY(avoid_malloc) { - ck = (lt != NULL) ? lt->ck : - in_signal_handler ? signal_chunk() : log_chunk(); - saved = ck_save(ck); - msg = str_new_in_chunk(ck, LOG_MSG_MAXLEN); + if G_UNLIKELY(NULL == lt) { + stid = thread_small_id(); + loggingstid = TRUE; + ck = in_signal_handler ? signal_chunk() : log_chunk(); + } else { + lt->in_log_handler = TRUE; + stid = lt->stid; + ck = lt->ck; + } - if G_UNLIKELY(NULL == msg) { - DECLARE_STR(6); - char time_buf18; + saved = ck_save(ck); + msg = str_new_in_chunk(ck, LOG_MSG_MAXLEN); - crash_time(time_buf, sizeof time_buf); - print_str(time_buf); /* 0 */ - print_str(" (CRITICAL): no memory to format string \""); /* 1 */ - print_str(format); /* 2 */ - print_str("\" from "); /* 3 */ - print_str(stacktrace_caller_name(2)); /* 4 */ - print_str("\n"); /* 5 */ - log_flush_err(); - ck_restore(ck, saved); - goto done; - } + if G_UNLIKELY(NULL == msg) { + DECLARE_STR(6); + char time_bufLOG_TIME_BUFLEN; - g_assert(ptr_diff(ck_save(ck), saved) > LOG_MSG_MAXLEN); - } else { - if G_UNLIKELY(NULL == cstr) - cstr = str_new_not_leaking(0); - msg = cstr; - ck = NULL; - saved = NULL; + log_time_careful(time_buf, sizeof time_buf, in_signal_handler); + print_str(time_buf); /* 0 */ + print_str(" (CRITICAL): no memory to format string \""); /* 1 */ + print_str(format); /* 2 */ + print_str("\" from "); /* 3 */ + print_str(stacktrace_caller_name(2)); /* 4 */ + print_str("\n"); /* 5 */ + log_flush_err_atomic(); + ck_restore(ck, saved); + goto log_done; } + g_assert(ptr_diff(ck_save(ck), saved) > LOG_MSG_MAXLEN); + /* * The str_vprintf() routine is safe to use in signal handlers. */ str_vprintf(msg, format, args); - - loglvl = level & ~(G_LOG_FLAG_RECURSION | G_LOG_FLAG_FATAL); - prefix = log_prefix(loglvl); + prefix = log_prefix(level); /* * Avoid stdio's fprintf() from within a signal handler since we @@ -861,31 +1304,38 @@ * re-entering fprintf() through a signal handler would be safe. */ - if (avoid_malloc) { - DECLARE_STR(9); - char time_buf18; + { + DECLARE_STR(11); + char time_bufLOG_TIME_BUFLEN; - crash_time(time_buf, sizeof time_buf); + log_time_careful(time_buf, sizeof time_buf, in_signal_handler); print_str(time_buf); /* 0 */ print_str(" ("); /* 1 */ print_str(prefix); /* 2 */ - print_str(")"); /* 3 */ + if (stid != 0) { + char stid_bufULONG_DEC_BUFLEN; + const char *stid_str = PRINT_NUMBER(stid_buf, stid); + print_str("-"); /* 3 */ + print_str(stid_str); /* 4 */ + } + print_str(")"); /* 5 */ if G_UNLIKELY(level & G_LOG_FLAG_RECURSION) - print_str(" RECURSIVE"); /* 4 */ + print_str(" RECURSIVE"); /* 6 */ if G_UNLIKELY(level & G_LOG_FLAG_FATAL) - print_str(" FATAL"); /* 5 */ - print_str(": "); /* 6 */ - print_str(str_2c(msg)); /* 7 */ - print_str("\n"); /* 8 */ - log_flush_err(); + print_str(" FATAL"); /* 7 */ + print_str(": "); /* 8 */ + print_str(str_2c(msg)); /* 9 */ + print_str("\n"); /* 10 */ + log_flush_err_atomic(); if G_UNLIKELY( - (level & G_LOG_FLAG_FATAL) || - G_LOG_LEVEL_CRITICAL == loglvl || - G_LOG_LEVEL_ERROR == loglvl + level & ( + G_LOG_FLAG_FATAL | G_LOG_LEVEL_CRITICAL | + G_LOG_LEVEL_ERROR | LOG_FLAG_COPY + ) ) { if (log_stdout_is_distinct()) - log_flush_out(); + log_flush_out_atomic(); if (level & G_LOG_FLAG_FATAL) crash_set_error(str_2c(msg)); } @@ -897,41 +1347,15 @@ if G_UNLIKELY(logfileLOG_STDERR.duplicate) { int fd = logfileLOG_STDERR.crash_fd; - IGNORE_RESULT(write(fd, str_2c(msg), str_len(msg))); - IGNORE_RESULT(write(fd, "\n", 1)); - } - } else { - time_t now = tm_time_exact(); - struct tm ct; - - /* - * Can't use localtime(&now) to fill-in ``ct'' since we're in a - * safe logging routine and we may be in the middle of a regular - * g_logv() call which calls localtime() already, and that call - * can malloc(). Any logging done in a memory allocator would cause - * us to come here and deadlock on the second localtime(). - * - * Therefore, do the conversion ourselves. - */ - - if G_UNLIKELY(!off_time(now + log_gmtoff, 0, &ct)) { - ZERO(&ct); - } - - log_fprint(LOG_STDERR, &ct, level, prefix, str_2c(msg)); - - if G_UNLIKELY( - (level & G_LOG_FLAG_FATAL) || - G_LOG_LEVEL_CRITICAL == loglvl || - G_LOG_LEVEL_ERROR == loglvl - ) { - if (log_stdout_is_distinct()) - log_fprint(LOG_STDOUT, &ct, level, prefix, str_2c(msg)); - if (level & G_LOG_FLAG_FATAL) - crash_set_error(str_2c(msg)); + iovec_t iov2; + iovec_set(&iov0, str_2c(msg), str_len(msg)); + iovec_set(&iov1, "\n", 1); + atio_writev(fd, iov, N_ITEMS(iov)); } } +log_done: + /* * Free up the string memory by restoring the allocation context * using the checkpoint we made before allocating that string. @@ -941,14 +1365,10 @@ * message logged. */ - if (avoid_malloc) - ck_restore(ck, saved); - - if (is_running_on_mingw() && !avoid_malloc) - fflush(stderr); /* Unbuffering does not work on Windows */ + ck_restore(ck, saved); if (G_LIKELY(NULL == lt)) { - in_safe_handler = FALSE; + loggingstid = FALSE; } else { lt->in_log_handler = FALSE; } @@ -962,14 +1382,111 @@ * until the end to avoid recursion. */ - if G_UNLIKELY(G_LOG_LEVEL_CRITICAL == loglvl || G_LOG_LEVEL_ERROR == loglvl) - s_stacktrace(avoid_malloc, 2); + if G_UNLIKELY(level & (G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_ERROR)) + s_stacktrace(TRUE, 2); /* Copied to stdout if different */ done: + thread_leave_critical(&set); errno = saved_errno; } /** + * Make sure there is no recursive s_error() or t_error() calls. + * + * @return TRUE if are in recursion and can continue. + */ +static bool +log_check_recursive(const char *format, va_list ap) +{ + static int recursive; + static char bufLOG_MSG_MAXLEN; + static int stid; + int depth; + + depth = atomic_int_inc(&recursive); + + if (0 == depth) { + str_vbprintf(buf, sizeof buf, format, ap); + stid = thread_safe_small_id(); + return FALSE; + } else if (1 == depth) { + /* + * Ensure we're not losing previous error in case we did not go + * far enough, but flag the string as being from a previous error + * in case it was already logged, to avoid confusion. + */ + crash_set_error("previous error: "); + crash_append_error(buf); + s_miniwarn("error whilst processing error from thread #%d:", stid); + s_miniinfo("previous error: %s", buf); + return TRUE; + } else if (2 == depth) { + s_rawwarn("recursive or concurrent error, aborting"); + log_abort(); + } else if (3 == depth) { + abort(); + } else { + _exit(EXIT_FAILURE); + } +} + +/** + * Wrapper over s_logv() to limit frequency of messages to once per period + * for a given source location. + * + * This routine does not use malloc() but relies on the VMM layer. + * + * @param period how often to emit message from origin (in seconds) + * @param origin orgin of the message (constant string expected) + * @param lt thread-private context (NULL if not in a concurrent thread) + * @param level glib-compatible log level flags + * @param format formatting string + * @param args variable argument list to format + */ +static void G_PRINTF(5, 0) +s_logv_once_per(long period, const char *origin, + logthread_t *lt, GLogLevelFlags level, const char *format, va_list args) +{ + static spinlock_t logtime_slk = SPINLOCK_INIT; + static hash_table_t *logtime; /* origin -> time_t of last log */ + time_t lastlog, now; + + g_assert(origin != NULL); + + /* + * Don't use once_flag_run() to keep all the variables private to + * this routine. + */ + + if G_UNLIKELY(NULL == logtime) { + spinlock(&logtime_slk); + if (NULL == logtime) { + logtime = + hash_table_new_full_not_leaking(string_mix_hash, string_eq); + hash_table_thread_safe(logtime); + } + spinunlock(&logtime_slk); + } + + lastlog = pointer_to_long(hash_table_lookup(logtime, origin)); + now = tm_time(); + + /* + * Skip log if we already logged message within the period already. + */ + + if (delta_time(now, lastlog) < period) + return; + + /* + * OK, record current time and log message. + */ + + hash_table_replace(logtime, origin, long_to_pointer(now)); + s_logv(lt, level, format, args); +} + +/** * Safe fatal warning message, resulting in an exit with specified status. */ void @@ -992,7 +1509,26 @@ va_list args; va_start(args, format); - s_logv(NULL, G_LOG_LEVEL_CRITICAL, format, args); + s_logv(logthread_object(FALSE), G_LOG_LEVEL_CRITICAL, format, args); + va_end(args); +} + +/** + * Safe critical message, limited to one occurrence per origin per period. + * + * @note + * This routine should not be called directly, use the s_critical_once_per() + * macro instead. + */ +void +s_critical_once_per_from(long period, const char *origin, + const char *format, ...) +{ + va_list args; + + va_start(args, format); + s_logv_once_per(period, origin, + logthread_object(FALSE), G_LOG_LEVEL_CRITICAL, format, args); va_end(args); } @@ -1002,13 +1538,43 @@ void s_error(const char *format, ...) { + va_list args, acopy; + unsigned flags = G_LOG_LEVEL_ERROR | G_LOG_FLAG_FATAL; + + va_start(args, format); + VA_COPY(acopy, args); + + if (log_check_recursive(format, acopy)) { + s_minilogv(flags | G_LOG_FLAG_RECURSION, TRUE, format, args); + } else { + s_logv(NULL /* take no risk */, flags, format, args); + } + + va_end(acopy); + va_end(args); + + log_abort(); +} + +/** + * Safe error. + * + * This returns a value so that we can use it in comma expressions, but + * the behaviour is really the same as s_error(), i.e. it aborts the + * process. + */ +int +s_error_expr(const char *format, ...) +{ va_list args; va_start(args, format); - s_logv(NULL, G_LOG_LEVEL_ERROR | G_LOG_FLAG_FATAL, format, args); + s_logv(NULL /* take no risk */, + G_LOG_LEVEL_ERROR | G_LOG_FLAG_FATAL, format, args); va_end(args); log_abort(); + return 0; } /* @@ -1017,34 +1583,49 @@ void s_error_from(const char *file, const char *format, ...) { - va_list args; + va_list args, acopy; + unsigned flags = G_LOG_LEVEL_ERROR | G_LOG_FLAG_FATAL; crash_set_filename(file); va_start(args, format); - s_logv(NULL, G_LOG_LEVEL_ERROR | G_LOG_FLAG_FATAL, format, args); + VA_COPY(acopy, args); + + if (log_check_recursive(format, acopy)) { + s_minilogv(flags | G_LOG_FLAG_RECURSION, TRUE, format, args); + } else { + s_logv(NULL /* take no risk */, flags, format, args); + } + + va_end(acopy); va_end(args); log_abort(); } /** - * Safe verbose warning message. + * Safe verbose warning message, identifying a severe problem that could + * indicate some malfunction or cause one later. + * + * Although only a warning, it is duplicated (along with the stacktrace) + * to stdout if it is different from stderr. */ void s_carp(const char *format, ...) { - gboolean in_signal_handler = signal_in_handler(); + bool in_signal_handler = signal_in_unsafe_handler(); va_list args; + thread_pending_add(+1); + va_start(args, format); - s_logv(NULL, G_LOG_LEVEL_WARNING, format, args); + s_logv(logthread_object(FALSE), + G_LOG_LEVEL_WARNING | LOG_FLAG_COPY, format, args); va_end(args); - if (in_signal_handler) - stacktrace_where_safe_print_offset(STDERR_FILENO, 1); - else - stacktrace_where_sym_print_offset(stderr, 1); + s_stacktrace(in_signal_handler, 1); /* Copied to stdout if different */ + + thread_pending_add(-1); } /** @@ -1066,7 +1647,7 @@ */ va_start(args, format); - s_logv(NULL, G_LOG_LEVEL_CRITICAL, format, args); + s_logv(logthread_object(FALSE), G_LOG_LEVEL_CRITICAL, format, args); va_end(args); } } @@ -1080,9 +1661,14 @@ void s_minicarp(const char *format, ...) { - gboolean in_signal_handler = signal_in_handler(); va_list args; + /* + * This test duplicates the one in s_minilogv() but if we don't emit + * the message we don't want to emit the stacktrace afterwards either. + * Hence we need to know now. + */ + if G_UNLIKELY(logfileLOG_STDERR.disabled) return; @@ -1096,7 +1682,40 @@ s_minilogv(G_LOG_LEVEL_WARNING, TRUE, format, args); va_end(args); - s_stacktrace(in_signal_handler, 1); + s_stacktrace(TRUE, 1); /* Copied to stdout if different */ +} + +/** + * Safe verbose minimal warning message, emitted once per calling stack. + * + * We guarantee no memory allocation during the check for known stacks + * by relying on a circular buffer that will hold the stacks while we + * are in a signal handler. + */ +void +s_minicarp_once(const char *format, ...) +{ + if G_UNLIKELY(logfileLOG_STDERR.disabled) + return; + + if (!stacktrace_caller_known(2)) { /* Caller of our caller */ + va_list args; + + /* + * We use a CRITICAL level because "once" carping denotes a + * potentially dangerous situation something that we want to + * note loudly in case there is a problem later. + * + * This will NOT automatically trigger stack tracing in s_minilogv() + * so we need to do it explicitly. + */ + + va_start(args, format); + s_minilogv(G_LOG_LEVEL_CRITICAL, TRUE, format, args); + va_end(args); + + s_stacktrace(TRUE, 0); /* Copied to stdout if different */ + } } /** @@ -1110,9 +1729,6 @@ { va_list args; - if G_UNLIKELY(logfileLOG_STDERR.disabled) - return; - /* * This routine is only called in exceptional conditions, so even if * the LOG_STDERR file is not deemed printable for now, attempt to log @@ -1125,221 +1741,420 @@ } /** - * Safe warning message. + * Safe termination with minimal resource consumption. + * + * This is intended to be used in emergency situations when higher-level + * logging mechanisms can't be used (recursion possibility, logging layer, + * deadlock condition). */ void -s_warning(const char *format, ...) +s_minierror(const char *format, ...) { + static int recursion; va_list args; + char dataLOG_MSG_MAXLEN; + char time_bufLOG_TIME_BUFLEN; + char sbufUINT_DEC_BUFLEN; + DECLARE_STR(9); + bool recursing; + int stid = thread_safe_small_id(); + + recursing = 0 != atomic_int_inc(&recursion); va_start(args, format); - s_logv(NULL, G_LOG_LEVEL_WARNING, format, args); + str_vbprintf(data, sizeof data, format, args); va_end(args); + + crash_set_error(data); + + log_time(time_buf, sizeof time_buf); + print_str(time_buf); /* 0 */ + print_str(" (ERROR"); /* 1 */ + if (stid != 0) { + print_str("-"); /* 2 */ + print_str(PRINT_NUMBER(sbuf, stid));/* 3 */ + } + print_str(")"); /* 4 */ + if (recursing) + print_str(" RECURSIVE"); /* 5 */ + print_str(": "); /* 6 */ + print_str(data); /* 7 */ + print_str("\n"); /* 8 */ + log_flush_err_atomic(); + if (log_stdout_is_distinct()) + log_flush_out_atomic(); + + if (!recursing) + s_stacktrace(TRUE, 1); + + abort(); } /** - * Safe regular message. + * Safe logging of critical message with minimal resource consumption. + * + * This is intended to be used in emergency situations when higher-level + * logging mechanisms can't be used (recursion possibility, logging layer). + * + * @attention + * This routine can clobber "errno" if an error occurs. */ void -s_message(const char *format, ...) +s_rawcrit(const char *format, ...) { + bool in_signal_handler = signal_in_unsafe_handler(); va_list args; va_start(args, format); - s_logv(NULL, G_LOG_LEVEL_MESSAGE, format, args); + s_rawlogv(G_LOG_LEVEL_CRITICAL, TRUE, TRUE, format, args); va_end(args); + + s_stacktrace(in_signal_handler, 1); /* Copied to stdout if different */ } /** - * Safe info message. + * Safe logging of warning message with minimal resource consumption. + * + * This is intended to be used in emergency situations when higher-level + * logging mechanisms can't be used (recursion possibility, logging layer). + * + * @attention + * This routine can clobber "errno" if an error occurs. */ void -s_info(const char *format, ...) +s_rawwarn(const char *format, ...) { va_list args; va_start(args, format); - s_logv(NULL, G_LOG_LEVEL_INFO, format, args); + s_rawlogv(G_LOG_LEVEL_WARNING, TRUE, FALSE, format, args); va_end(args); } /** - * Safe debug message. + * Safe logging of message with minimal resource consumption. + * + * This is intended to be used in emergency situations when higher-level + * logging mechanisms can't be used (recursion possibility, logging layer). + * + * @attention + * This routine can clobber "errno" if an error occurs. */ void -s_debug(const char *format, ...) +s_rawmsg(const char *format, ...) { va_list args; va_start(args, format); - s_logv(NULL, G_LOG_LEVEL_DEBUG, format, args); + s_rawlogv(G_LOG_LEVEL_MESSAGE, TRUE, FALSE, format, args); va_end(args); } + /** - * Thread-safe critical message. + * Safe logging of informational message with minimal resource consumption. + * + * This is intended to be used in emergency situations when higher-level + * logging mechanisms can't be used (recursion possibility, logging layer). + * + * @attention + * This routine can clobber "errno" if an error occurs. */ void -t_critical(logthread_t *lt, const char *format, ...) +s_rawinfo(const char *format, ...) { va_list args; - lt = logthread_object(lt); - logthread_check(lt); - va_start(args, format); - s_logv(lt, G_LOG_LEVEL_CRITICAL, format, args); + s_rawlogv(G_LOG_LEVEL_INFO, TRUE, FALSE, format, args); va_end(args); } /** - * Thread-safe error. + * Safe logging of debugging message with minimal resource consumption. + * + * This is intended to be used in emergency situations when higher-level + * logging mechanisms can't be used (recursion possibility, logging layer). + * + * @attention + * This routine can clobber "errno" if an error occurs. */ void -t_error(logthread_t *lt, const char *format, ...) +s_rawdebug(const char *format, ...) { va_list args; - lt = logthread_object(lt); - logthread_check(lt); + va_start(args, format); + s_rawlogv(G_LOG_LEVEL_DEBUG, TRUE, FALSE, format, args); + va_end(args); +} + +/** + * Safe logging of critical message with minimal resource consumption. + * + * This is intended to be used in emergency situations when higher-level + * logging mechanisms can't be used (recursion possibility, logging layer). + */ +void +s_minicrit(const char *format, ...) +{ + va_list args; va_start(args, format); - s_logv(lt, G_LOG_LEVEL_ERROR | G_LOG_FLAG_FATAL, format, args); + s_minilogv(G_LOG_LEVEL_CRITICAL, TRUE, format, args); va_end(args); - log_abort(); + s_stacktrace(TRUE, 1); /* Copied to stdout if different */ } /** - * Thread-safe error, recording the source of the crash to allow crash hooks. + * Safe logging of warning message with minimal resource consumption. + * + * This is intended to be used in emergency situations when higher-level + * logging mechanisms can't be used (recursion possibility, logging layer). */ void -t_error_from(const char *file, logthread_t *lt, const char *format, ...) +s_miniwarn(const char *format, ...) { va_list args; - lt = logthread_object(lt); - logthread_check(lt); + va_start(args, format); + s_minilogv(G_LOG_LEVEL_WARNING, FALSE, format, args); + va_end(args); +} - crash_set_filename(file); +/** + * Safe logging of regular message with minimal resource consumption. + * + * This is intended to be used in emergency situations when higher-level + * logging mechanisms can't be used (recursion possibility, logging layer). + */ +void +s_minimsg(const char *format, ...) +{ + va_list args; va_start(args, format); - s_logv(lt, G_LOG_LEVEL_ERROR | G_LOG_FLAG_FATAL, format, args); + s_minilogv(G_LOG_LEVEL_MESSAGE, FALSE, format, args); va_end(args); - - log_abort(); } /** - * Thread-safe verbose warning message. + * Safe logging of information with minimal resource consumption. + * + * This is intended to be used in emergency situations when higher-level + * logging mechanisms can't be used (recursion possibility, logging layer). */ void -t_carp(logthread_t *lt, const char *format, ...) +s_miniinfo(const char *format, ...) { va_list args; - lt = logthread_object(lt); - logthread_check(lt); - va_start(args, format); - s_logv(lt, G_LOG_LEVEL_WARNING, format, args); + s_minilogv(G_LOG_LEVEL_INFO, FALSE, format, args); va_end(args); - - stacktrace_where_safe_print_offset(STDERR_FILENO, 1); } /** - * Thread-safe verbose warning message, emitted once per calling stack. + * Safe logging of debugging with minimal resource consumption. + * + * This is intended to be used in emergency situations when higher-level + * logging mechanisms can't be used (recursion possibility, logging layer). */ void -t_carp_once(logthread_t *lt, const char *format, ...) +s_minidbg(const char *format, ...) { - if (!stacktrace_caller_known(2)) { /* Caller of our caller */ - va_list args; + va_list args; - lt = logthread_object(lt); - logthread_check(lt); + va_start(args, format); + s_minilogv(G_LOG_LEVEL_DEBUG, FALSE, format, args); + va_end(args); +} - /* - * We use a CRITICAL level because "once" carping denotes a - * potentially dangerous situation something that we want to - * note loudly in case there is a problem later. - * - * This will automatically trigger stack tracing in s_logv() - * plus force a copy of the message to stdout, if distinct. - */ +/** + * Safe warning message. + */ +void +s_warning(const char *format, ...) +{ + va_list args; - va_start(args, format); - s_logv(lt, G_LOG_LEVEL_CRITICAL, format, args); - va_end(args); - } + va_start(args, format); + s_logv(logthread_object(FALSE), G_LOG_LEVEL_WARNING, format, args); + va_end(args); } /** - * Thread-safe warning message. + * Safe warning message, limited to one occurrence per origin per period. + * + * @note + * This routine should not be called directly, use the s_warning_once_per() + * macro instead. */ void -t_warning(logthread_t *lt, const char *format, ...) +s_warning_once_per_from(long period, const char *origin, + const char *format, ...) { va_list args; - lt = logthread_object(lt); - logthread_check(lt); - va_start(args, format); - s_logv(lt, G_LOG_LEVEL_WARNING, format, args); + s_logv_once_per(period, origin, + logthread_object(FALSE), G_LOG_LEVEL_WARNING, format, args); va_end(args); } /** - * Thread-safe regular message. + * Safe regular message. */ void -t_message(logthread_t *lt, const char *format, ...) +s_message(const char *format, ...) { va_list args; - lt = logthread_object(lt); - logthread_check(lt); + va_start(args, format); + s_logv(logthread_object(FALSE), G_LOG_LEVEL_MESSAGE, format, args); + va_end(args); +} + +/** + * Safe regular message, limited to one occurrence per origin per period. + * + * @note + * This routine should not be called directly, use the s_message_once_per() + * macro instead. + */ +void +s_message_once_per_from(long period, const char *origin, + const char *format, ...) +{ + va_list args; va_start(args, format); - s_logv(lt, G_LOG_LEVEL_MESSAGE, format, args); + s_logv_once_per(period, origin, + logthread_object(FALSE), G_LOG_LEVEL_MESSAGE, format, args); va_end(args); } /** - * Thread-safe info message. + * Safe info message. */ void -t_info(logthread_t *lt, const char *format, ...) +s_info(const char *format, ...) { va_list args; - lt = logthread_object(lt); - logthread_check(lt); + va_start(args, format); + s_logv(logthread_object(FALSE), G_LOG_LEVEL_INFO, format, args); + va_end(args); +} + +/** + * Safe info message, limited to one occurrence per origin per period. + * + * @note + * This routine should not be called directly, use the s_info_once_per() + * macro instead. + */ +void +s_info_once_per_from(long period, const char *origin, + const char *format, ...) +{ + va_list args; va_start(args, format); - s_logv(lt, G_LOG_LEVEL_INFO, format, args); + s_logv_once_per(period, origin, + logthread_object(FALSE), G_LOG_LEVEL_INFO, format, args); va_end(args); } /** - * Thread-safe debug message. + * Safe debug message. */ void -t_debug(logthread_t *lt, const char *format, ...) +s_debug(const char *format, ...) { va_list args; - lt = logthread_object(lt); - logthread_check(lt); + va_start(args, format); + s_logv(logthread_object(FALSE), G_LOG_LEVEL_DEBUG, format, args); + va_end(args); +} + +/** + * Safe debug message, limited to one occurrence per origin per period. + * + * @note + * This routine should not be called directly, use the s_debug_once_per() + * macro instead. + */ +void +s_debug_once_per_from(long period, const char *origin, + const char *format, ...) +{ + va_list args; va_start(args, format); - s_logv(lt, G_LOG_LEVEL_DEBUG, format, args); + s_logv_once_per(period, origin, + logthread_object(FALSE), G_LOG_LEVEL_DEBUG, format, args); va_end(args); } /** + * Write formatted string to specified file descriptor. + * + * @note + * This routine is very low-level and is meant to be used as a building block + * for higher-level routines or when we are operating under dire circumstances. + * + * There is no leading timestamp nor thread indication prepended to the log. + * A trailing "\n" is appended to the formatted string automatically though. + * + * The maximum message length is hardwired to LOG_MSG_MAXLEN (512 bytes). + * + * No memory allocation is performed by this routine and a direct system call + * is issued to the specified file descriptor without any locking. + * + * @param fd the file descriptor + * @param fmt the printf()-like formatting string + * @param ... the arguments to be formatted + */ +void G_PRINTF(2, 3) +s_line_writef(int fd, const char *fmt, ...) +{ + char bufLOG_MSG_MAXLEN; + str_t str; + va_list args; + iovec_t iov2; + + str_new_buffer(&str, buf, 0, sizeof buf); + + va_start(args, fmt); + str_vprintf(&str, fmt, args); + va_end(args); + + iovec_set(&iov0, str_2c(&str), str_len(&str)); + iovec_set(&iov1, "\n", 1); + + IGNORE_RESULT(writev(fd, iov, N_ITEMS(iov))); +} + +/** + * Print message to stdout. + */ +static void +log_stdout_logv(const char *format, va_list args) +{ + char dataLOG_MSG_MAXLEN; + DECLARE_STR(2); + + str_vbprintf(data, sizeof data, format, args); /* Uses str_vncatf() */ + + print_str(data); /* 0 */ + print_str("\n"); /* 1 */ + log_flush_out_atomic(); +} + +/** * Append log message to string. */ static void @@ -1372,14 +2187,17 @@ * @param format formatting string * @param args variable argument list to format */ -static void +static void G_PRINTF(3, 0) log_logv(logagent_t *la, GLogLevelFlags level, const char *format, va_list args) { logagent_check(la); switch (la->type) { + case LOG_A_STDOUT: + log_stdout_logv(format, args); + return; case LOG_A_STDERR: - s_logv(logthread_object(NULL), level, format, args); + s_logv(logthread_object(FALSE), level, format, args); return; case LOG_A_STRING: log_str_logv(la->u.s, level, format, args); @@ -1459,59 +2277,55 @@ * Regular log handler used for glib's logging routines (the g_xxx() ones). */ static void -log_handler(const char *unused_domain, GLogLevelFlags level, +log_handler(const char *domain, GLogLevelFlags level, const char *message, void *unused_data) { int saved_errno = errno; time_t now; struct tm *ct; + tm_t tv; const char *prefix; char *safer; - GLogLevelFlags loglvl; + unsigned stid; - (void) unused_domain; (void) unused_data; if (G_UNLIKELY(logfileLOG_STDERR.disabled)) return; - now = tm_time_exact(); + tm_now_exact(&tv); + now = tv.tv_sec; ct = localtime(&now); - loglvl = level & ~(G_LOG_FLAG_RECURSION | G_LOG_FLAG_FATAL); - prefix = log_prefix(loglvl); + prefix = log_prefix(level); + stid = thread_small_id(); if (level & G_LOG_FLAG_RECURSION) { /* Probably logging from memory allocator, string should be safe */ - safer = deconstify_gpointer(message); + safer = deconstify_pointer(message); } else { safer = control_escape(message); } - log_fprint(LOG_STDERR, ct, level, prefix, safer); + log_fprint(LOG_STDERR, ct, tv.tv_usec, level, prefix, stid, safer); if G_UNLIKELY( - (level & G_LOG_FLAG_FATAL) || - G_LOG_LEVEL_CRITICAL == loglvl || - G_LOG_LEVEL_ERROR == loglvl + level & + (G_LOG_FLAG_FATAL | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_ERROR) ) { if (log_stdout_is_distinct()) - log_fprint(LOG_STDOUT, ct, level, prefix, safer); + log_fprint(LOG_STDOUT, ct, tv.tv_usec, level, prefix, stid, safer); if (level & G_LOG_FLAG_FATAL) crash_set_error(safer); } if G_UNLIKELY( - G_LOG_LEVEL_CRITICAL == loglvl || - G_LOG_LEVEL_ERROR == loglvl || - (level & (G_LOG_FLAG_RECURSION|G_LOG_FLAG_FATAL)) + level & ( + G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION | + G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_ERROR + ) ) { - stacktrace_where_sym_print_offset(stderr, 3); - if (log_stdout_is_distinct()) { - stacktrace_where_sym_print_offset(stdout, 3); - if (is_running_on_mingw()) - fflush(stdout); /* Unbuffering does not work on Windows */ - } + s_stacktrace(FALSE, 3); } if G_UNLIKELY(safer != message) { @@ -1521,12 +2335,22 @@ if (is_running_on_mingw()) fflush(stderr); /* Unbuffering does not work on Windows */ + /* + * If GTK or Glib is starting to emit critical messages and we're past + * the exit() point, abort. + */ + + if G_UNLIKELY(domain != NULL) { + if (crash_is_closed()) + crash_abort(); + } + #if 0 /* Define to debug Glib or Gtk problems */ if (domain) { unsigned i; - for (i = 0; i < G_N_ELEMENTS(log_domains); i++) { + for (i = 0; i < N_ITEMS(log_domains); i++) { const char *dom = log_domainsi; if (dom && 0 == strcmp(domain, dom)) { raise(SIGTRAP); @@ -1544,12 +2368,13 @@ * * @return TRUE on success. */ -gboolean +bool log_reopen(enum log_file which) { - gboolean success = TRUE; + bool success = TRUE; FILE *f; struct logfile *lf; + int fd = -1; log_file_check(which); g_assert(logfilewhich.path != NULL); /* log_set() called */ @@ -1558,18 +2383,51 @@ f = lf->f; g_assert(f != NULL); + /* + * Not being able to reopen stderr would be critical as further messages + * will be lost. Therefore duplicate the file descriptor before calling + * freopen() to be able to log something in case we fail. + */ + + if (LOG_STDERR == which) { + fd = dup(fileno(f)); + + if (!is_valid_fd(fd)) + s_warning("%s(): unable to dup(%d): %m", G_STRFUNC, fileno(f)); + } + if (freopen(lf->path, "a", f)) { setvbuf(f, NULL, _IOLBF, 0); lf->disabled = 0 == strcmp(lf->path, DEV_NULL); lf->otime = tm_time(); lf->changed = FALSE; } else { - s_critical("freopen(\"%s\", \"a\", ...) failed: %m", lf->path); + if (LOG_STDERR != which) { + s_critical("freopen(\"%s\", \"a\", ...) failed: %m", lf->path); + } else if (is_valid_fd(fd)) { + DECLARE_STR(8); + char time_bufLOG_TIME_BUFLEN; + + log_time(time_buf, sizeof time_buf); + print_str(time_buf); /* 0 */ + print_str(" (CRITICAL): cannot freopen() stderr to "); /* 1 */ + print_str(lf->path); /* 2 */ + print_str(": "); /* 3 */ + print_str(symbolic_errno(errno)); /* 4 */ + print_str(" ("); /* 5 */ + print_str(g_strerror(errno)); /* 6 */ + print_str(")\n"); /* 7 */ + flush_str_atomic(fd); + log_flush_out_atomic(); + } lf->disabled = TRUE; lf->otime = 0; success = FALSE; } + if (LOG_STDERR == which && is_valid_fd(fd)) + close(fd); + return success; } @@ -1578,7 +2436,7 @@ * * @return TRUE if we explicitly (re)opened the file */ -gboolean +bool log_is_managed(enum log_file which) { log_file_check(which); @@ -1589,7 +2447,7 @@ /** * Is logfile disabled? */ -gboolean +bool log_is_disabled(enum log_file which) { log_file_check(which); @@ -1607,7 +2465,7 @@ * missed, but stderr could be disabled, so printing a copy on stdout will * at least give minimal feedback to the user. */ -gboolean +bool log_stdout_is_distinct(void) { return !log_is_disabled(LOG_STDOUT) && log_is_managed(LOG_STDOUT) && @@ -1620,7 +2478,7 @@ * * @return TRUE on success */ -gboolean +bool log_reopen_if_managed(enum log_file which) { log_file_check(which); @@ -1636,13 +2494,13 @@ * * @return TRUE if OK. */ -gboolean -log_reopen_all(gboolean daemonized) +bool +log_reopen_all(bool daemonized) { size_t i; - gboolean success = TRUE; + bool success = TRUE; - for (i = 0; i < G_N_ELEMENTS(logfile); i++) { + for (i = 0; i < N_ITEMS(logfile); i++) { struct logfile *lf = &logfilei; if (NULL == lf->path) { @@ -1662,7 +2520,7 @@ * Enable or disable stderr output. */ void -log_set_disabled(enum log_file which, gboolean disabled) +log_set_disabled(enum log_file which, bool disabled) { log_file_check(which); @@ -1670,6 +2528,19 @@ } /** + * Enable or disable PID logging. + */ +void +log_show_pid(bool enabled) +{ + if (enabled) { + str_bprintf(logpid, sizeof logpid, " %lu", (ulong) getpid()); + } else { + logpid0 = '\0'; /* Empty string, shows nothing */ + } +} + +/** * Record duplicate file descriptor where messages will also be written * albeit without any prefixing. * @@ -1718,12 +2589,12 @@ * * @return TRUE on success, FALSE on errors with errno set. */ -gboolean +bool log_rename(enum log_file which, const char *newname) { struct logfile *lf; int saved_errno = 0; - gboolean ok = TRUE; + bool ok = TRUE; log_file_check(which); g_assert(newname != NULL); @@ -1835,12 +2706,12 @@ /** * Initialization of logging layer. */ -G_GNUC_COLD void +void G_COLD log_init(void) { unsigned i; - for (i = 0; i < G_N_ELEMENTS(log_domains); i++) { + for (i = 0; i < N_ITEMS(log_domains); i++) { g_log_set_handler(log_domainsi, G_LOG_FLAG_RECURSION | G_LOG_FLAG_FATAL | G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | @@ -1862,7 +2733,6 @@ (void) log_chunk(); /* Ensure log chunk is pre-allocated early */ - log_gmtoff = timestamp_gmt_offset(time(NULL), NULL); log_inited = TRUE; } @@ -1879,7 +2749,7 @@ * Record formatting string to be used to format messages when crashing. */ void -log_crashing(struct str *str) +log_crashing_str(struct str *str) { g_assert(str != NULL); @@ -1937,12 +2807,12 @@ /** * Shutdown the logging layer. */ -G_GNUC_COLD void +void G_COLD log_close(void) { size_t i; - for (i = 0; i < G_N_ELEMENTS(logfile); i++) { + for (i = 0; i < N_ITEMS(logfile); i++) { struct logfile *lf = &logfilei; if (lf->path_is_atom)
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/log.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/log.h
Changed
@@ -52,9 +52,6 @@ unsigned need_reopen:1; /**< Logfile pending a reopen */ }; -struct logthread; -typedef struct logthread logthread_t; - struct logagent; typedef struct logagent logagent_t; @@ -64,26 +61,27 @@ struct str; -logthread_t *log_thread_alloc(void); -const char *log_prefix(GLogLevelFlags loglvl) G_GNUC_CONST; -void log_abort(void) G_GNUC_NORETURN; +const char *log_prefix(GLogLevelFlags loglvl) G_CONST; +void log_abort(void) G_NORETURN; void log_init(void); -void log_crashing(struct str *str); +void log_crash_mode(void); +void log_crashing_str(struct str *str); void log_atoms_inited(void); void log_close(void); -void log_set_disabled(enum log_file which, gboolean disabled); +void log_show_pid(bool enabled); +void log_set_disabled(enum log_file which, bool disabled); void log_set(enum log_file which, const char *path); -gboolean log_reopen(enum log_file which); -gboolean log_rename(enum log_file which, const char *newname); -gboolean log_reopen_if_managed(enum log_file which); -gboolean log_reopen_all(gboolean daemonized); +bool log_reopen(enum log_file which); +bool log_rename(enum log_file which, const char *newname); +bool log_reopen_if_managed(enum log_file which); +bool log_reopen_all(bool daemonized); void log_stat(enum log_file which, struct logstat *buf); -gboolean log_is_managed(enum log_file which); -gboolean log_is_disabled(enum log_file which); -gboolean log_stdout_is_distinct(void); -gboolean log_printable(enum log_file which); -gboolean log_file_printable(const FILE *out); +bool log_is_managed(enum log_file which); +bool log_is_disabled(enum log_file which); +bool log_stdout_is_distinct(void); +bool log_printable(enum log_file which); +bool log_file_printable(const FILE *out); void log_set_duplicate(enum log_file which, int dupfd); void log_force_fd(enum log_file which, int fd); int log_get_fd(enum log_file which); @@ -92,51 +90,97 @@ * Safe logging interface (to avoid recursive logging, or from signal handlers). */ -void s_critical(const char *format, ...) G_GNUC_PRINTF(1, 2); -void s_error(const char *format, ...) G_GNUC_PRINTF(1, 2); -void s_carp(const char *format, ...) G_GNUC_PRINTF(1, 2); -void s_carp_once(const char *format, ...) G_GNUC_PRINTF(1, 2); -void s_minicarp(const char *format, ...) G_GNUC_PRINTF(1, 2); -void s_minilog(GLogLevelFlags flags, const char *fmt, ...) G_GNUC_PRINTF(2, 3); -void s_warning(const char *format, ...) G_GNUC_PRINTF(1, 2); -void s_message(const char *format, ...) G_GNUC_PRINTF(1, 2); -void s_info(const char *format, ...) G_GNUC_PRINTF(1, 2); -void s_debug(const char *format, ...) G_GNUC_PRINTF(1, 2); -void s_fatal_exit(int status, const char *format, ...) G_GNUC_PRINTF(2, 3); -void s_error_from(const char *file, const char *fmt, ...) G_GNUC_PRINTF(2, 3); -void s_minilogv(GLogLevelFlags, gboolean copy, const char *fmt, va_list args); +void s_critical(const char *format, ...) G_PRINTF(1, 2); +void s_error(const char *format, ...) G_PRINTF(1, 2) G_NORETURN; +int s_error_expr(const char *format, ...) G_PRINTF(1, 2); +void s_carp(const char *format, ...) G_PRINTF(1, 2); +void s_carp_once(const char *format, ...) G_PRINTF(1, 2); +void s_minicarp(const char *format, ...) G_PRINTF(1, 2); +void s_minicarp_once(const char *format, ...) G_PRINTF(1, 2); +void s_minilog(GLogLevelFlags flags, const char *fmt, ...) G_PRINTF(2, 3); +void s_warning(const char *format, ...) G_PRINTF(1, 2); +void s_message(const char *format, ...) G_PRINTF(1, 2); +void s_info(const char *format, ...) G_PRINTF(1, 2); +void s_debug(const char *format, ...) G_PRINTF(1, 2); +void s_fatal_exit(int status, const char *format, ...) + G_PRINTF(2, 3) G_NORETURN; +void s_error_from(const char *file, const char *fmt, ...) + G_PRINTF(2, 3) G_NORETURN; +void s_minilogv(GLogLevelFlags, bool copy, const char *fmt, va_list args) + G_PRINTF(3, 0); +void s_minierror(const char *format, ...) G_PRINTF(1, 2) G_NORETURN; +void s_minicrit(const char *format, ...) G_PRINTF(1, 2); +void s_miniwarn(const char *format, ...) G_PRINTF(1, 2); +void s_minimsg(const char *format, ...) G_PRINTF(1, 2); +void s_miniinfo(const char *format, ...) G_PRINTF(1, 2); +void s_minidbg(const char *format, ...) G_PRINTF(1, 2); +void s_rawcrit(const char *format, ...) G_PRINTF(1, 2); +void s_rawwarn(const char *format, ...) G_PRINTF(1, 2); +void s_rawmsg(const char *format, ...) G_PRINTF(1, 2); +void s_rawinfo(const char *format, ...) G_PRINTF(1, 2); +void s_rawdebug(const char *format, ...) G_PRINTF(1, 2); +void s_rawlogv(GLogLevelFlags, bool raw, bool copy, const char *f, va_list a) + G_PRINTF(4, 0); + +void s_line_writef(int fd, const char *fmt, ...) G_PRINTF(2, 3); + +void s_stacktrace(bool no_stdio, unsigned offset); + +/* + * These routines should not be called directly, use the macros below. + */ +void s_critical_once_per_from(long period, const char *origin, + const char *format, ...) G_PRINTF(3, 4); +void s_warning_once_per_from(long period, const char *origin, + const char *format, ...) G_PRINTF(3, 4); +void s_message_once_per_from(long period, const char *origin, + const char *format, ...) G_PRINTF(3, 4); +void s_info_once_per_from(long period, const char *origin, + const char *format, ...) G_PRINTF(3, 4); +void s_debug_once_per_from(long period, const char *origin, + const char *format, ...) G_PRINTF(3, 4); + +#define s_critical_once_per(p,fmt,...) \ + s_critical_once_per_from((p), G_STRLOC, (fmt), __VA_ARGS__) + +#define s_warning_once_per(p,fmt,...) \ + s_warning_once_per_from((p), G_STRLOC, (fmt), __VA_ARGS__) + +#define s_message_once_per(p,fmt,...) \ + s_message_once_per_from((p), G_STRLOC, (fmt), __VA_ARGS__) + +#define s_info_once_per(p,fmt,...) \ + s_info_once_per_from((p), G_STRLOC, (fmt), __VA_ARGS__) + +#define s_debug_once_per(p,fmt,...) \ + s_debug_once_per_from((p), G_STRLOC, (fmt), __VA_ARGS__) /* - * Thread-safe logging interface. + * Pre-defined logging periods for the xxx_once_per() logging routines. */ -void t_critical(logthread_t *lt, const char *format, ...) G_GNUC_PRINTF(2, 3); -void t_error(logthread_t *lt, const char *format, ...) G_GNUC_PRINTF(2, 3); -void t_carp(logthread_t *lt, const char *format, ...) G_GNUC_PRINTF(2, 3); -void t_carp_once(logthread_t *lt, const char *format, ...) G_GNUC_PRINTF(2, 3); -void t_warning(logthread_t *lt, const char *format, ...) G_GNUC_PRINTF(2, 3); -void t_message(logthread_t *lt, const char *format, ...) G_GNUC_PRINTF(2, 3); -void t_info(logthread_t *lt, const char *format, ...) G_GNUC_PRINTF(2, 3); -void t_debug(logthread_t *lt, const char *format, ...) G_GNUC_PRINTF(2, 3); -void t_error_from(const char *file, - logthread_t *lt, const char *format, ...) G_GNUC_PRINTF(3, 4); +#define LOG_PERIOD_SECOND 1 +#define LOG_PERIOD_MINUTE 60 +#define LOG_PERIOD_HOUR 3600 /* * Polymorphic logging interface. */ +logagent_t *log_agent_stdout_get(void); logagent_t *log_agent_stderr_get(void); logagent_t *log_agent_string_make(size_t size, const char *prefix); +void log_agent_reserve(logagent_t *la, size_t len); void log_agent_string_reset(logagent_t *la); const char *log_agent_string_get(const logagent_t *la); char *log_agent_string_get_null(logagent_t **la_ptr); void log_agent_free_null(logagent_t **la_ptr); -void log_critical(logagent_t *la, const char *format, ...) G_GNUC_PRINTF(2, 3); -void log_warning(logagent_t *la, const char *format, ...) G_GNUC_PRINTF(2, 3); -void log_message(logagent_t *la, const char *format, ...) G_GNUC_PRINTF(2, 3); -void log_info(logagent_t *la, const char *format, ...) G_GNUC_PRINTF(2, 3); -void log_debug(logagent_t *la, const char *format, ...) G_GNUC_PRINTF(2, 3); +void log_critical(logagent_t *la, const char *format, ...) G_PRINTF(2, 3); +void log_warning(logagent_t *la, const char *format, ...) G_PRINTF(2, 3); +void log_message(logagent_t *la, const char *format, ...) G_PRINTF(2, 3); +void log_info(logagent_t *la, const char *format, ...) G_PRINTF(2, 3); +void log_debug(logagent_t *la, const char *format, ...) G_PRINTF(2, 3); #endif /* _log_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/magnet.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/magnet.c
Changed
@@ -36,17 +36,19 @@ #include "common.h" #include "magnet.h" + #include "ascii.h" #include "atoms.h" #include "concat.h" -#include "glib-missing.h" #include "gnet_host.h" #include "halloc.h" +#include "once.h" #include "parse.h" #include "sequence.h" #include "str.h" #include "stringify.h" #include "tm.h" +#include "tokenizer.h" #include "unsigned.h" #include "url.h" #include "urn.h" @@ -66,7 +68,7 @@ */ enum magnet_key { - MAGNET_KEY_NONE, + MAGNET_KEY_NONE = 0, MAGNET_KEY_DISPLAY_NAME, /* Display Name */ MAGNET_KEY_KEYWORD_TOPIC, /* Keyword Topic */ MAGNET_KEY_EXACT_LENGTH, /* eXact file Length */ @@ -77,20 +79,19 @@ MAGNET_KEY_GUID, /* Servent GUID */ MAGNET_KEY_VENDOR, /* Servent vendor */ MAGNET_KEY_DHT, /* Servent known to publish in the DHT */ + MAGNET_KEY_G2, /* Servent is a G2 node */ NUM_MAGNET_KEYS }; -static const struct { - const char * const key; - const enum magnet_key id; -} magnet_keys = { +static tokenizer_t magnet_keys = { /* Must be sorted alphabetically */ { "", MAGNET_KEY_NONE }, { "as", MAGNET_KEY_ALTERNATE_SOURCE }, { "dn", MAGNET_KEY_DISPLAY_NAME }, { "kt", MAGNET_KEY_KEYWORD_TOPIC }, { "x.dht", MAGNET_KEY_DHT }, + { "x.g2", MAGNET_KEY_G2 }, { "x.guid", MAGNET_KEY_GUID }, { "x.parq-id", MAGNET_KEY_PARQ_ID }, { "x.vndr", MAGNET_KEY_VENDOR }, @@ -116,31 +117,29 @@ } static void -free_proxies_list(GSList *sl) +free_proxies_list(pslist_t *sl) +{ + pslist_foreach(sl, gnet_host_free_item, NULL); + pslist_free(sl); +} + +static once_flag_t magnet_keys_checked; + +static void G_COLD +magnet_key_check(void) { - g_slist_foreach(sl, gnet_host_free_item, NULL); - g_slist_free(sl); + TOKENIZE_CHECK_SORTED_WITH(magnet_keys, ascii_strcasecmp); } static enum magnet_key magnet_key_get(const char *s) { - STATIC_ASSERT(G_N_ELEMENTS(magnet_keys) == NUM_MAGNET_KEYS); - g_assert(s); - -#define GET_KEY(i) (magnet_keys(i).key) -#define FOUND(i) G_STMT_START { \ - return magnet_keys(i).id; \ - /* NOTREACHED */ \ -} G_STMT_END - - BINARY_SEARCH(const char *, s, G_N_ELEMENTS(magnet_keys), ascii_strcasecmp, - GET_KEY, FOUND); - -#undef FOUND -#undef GET_KEY - - return MAGNET_KEY_NONE; + STATIC_ASSERT(N_ITEMS(magnet_keys) == NUM_MAGNET_KEYS); + g_assert(s != NULL); + + ONCE_FLAG_RUN(magnet_keys_checked, magnet_key_check); + + return TOKENIZE_WITH(s, ascii_strcasecmp, magnet_keys); } static void @@ -177,7 +176,7 @@ endptr = is_strprefix(p, "/uri-res/N2R?"); if (endptr) { struct sha1 sha1; - + p = endptr; if (!urn_get_sha1(p, &sha1)) { *error_str = "Bad SHA1 in MAGNET URI"; @@ -193,7 +192,7 @@ static const char * magnet_parse_host_port(const char *hostport, - host_addr_t *addr, guint16 *port, const char **host, const char **host_end, + host_addr_t *addr, uint16 *port, const char **host, const char **host_end, const char **error_str) { const char *p; @@ -221,7 +220,7 @@ if (':' == *p) { const char *ep2; int error; - guint16 u; + uint16 u; p++; u = parse_uint16(p, &ep2, 10, &error); @@ -246,7 +245,7 @@ struct magnet_source *ms; const char *p, *host, *host_end; host_addr_t addr; - guint16 port; + uint16 port; clear_error_str(&error_str); g_return_val_if_fail(uri, NULL); @@ -273,11 +272,11 @@ return ms; } -static gboolean +static bool magnet_parse_addr_list(const char *proxies, - const char **endptr, GSList **list, const char **error_str) + const char **endptr, pslist_t **list, const char **error_str) { - GSList *sl = NULL; + pslist_t *sl = NULL; const char *p; clear_error_str(&error_str); @@ -287,7 +286,7 @@ while (*p == ':') { host_addr_t addr; - guint16 port; + uint16 port; gnet_host_t *host; p = magnet_parse_host_port(p+1, &addr, &port, NULL, NULL, error_str); @@ -295,10 +294,10 @@ goto cleanup; host = gnet_host_new(addr, port); - sl = g_slist_prepend(sl, host); /* Will reverse list below */ + sl = pslist_prepend(sl, host); /* Will reverse list below */ } - sl = g_slist_reverse(sl); /* Keep order of listed push-proxies */ + sl = pslist_reverse(sl); /* Keep order of listed push-proxies */ *endptr = p; *list = sl; @@ -314,7 +313,7 @@ { struct magnet_source *ms; const char *p, *endptr = NULL; - GSList *sl = NULL; + pslist_t *sl = NULL; clear_error_str(&error_str); g_return_val_if_fail(uri, NULL); @@ -429,11 +428,11 @@ g_return_if_fail(res); g_return_if_fail(name); g_return_if_fail(value); - + if (!utf8_is_valid_string(value)) { const char *encoding; char *result; - + g_message("MAGNET URI key \"%s\" is not UTF-8 encoded", name); if (MAGNET_KEY_DISPLAY_NAME != magnet_key_get(name)) @@ -467,7 +466,7 @@ res->sha1 = atom_sha1_get(ms->sha1); } if (!ms->sha1 || sha1_eq(res->sha1, ms->sha1)) { - res->sources = g_slist_prepend(res->sources, ms); + res->sources = pslist_prepend(res->sources, ms); } else { magnet_source_free(&ms); } @@ -492,7 +491,7 @@ case MAGNET_KEY_EXACT_LENGTH: { int error; - guint64 u; + uint64 u; u = parse_uint64(value, NULL, 10, &error); if (!error) { @@ -516,7 +515,7 @@ case MAGNET_KEY_DHT: { int error; - guint8 u; + uint8 u; u = parse_uint8(value, NULL, 10, &error); if (!error) { @@ -525,6 +524,18 @@ } break; + case MAGNET_KEY_G2: + { + int error; + uint8 u; + + u = parse_uint8(value, NULL, 10, &error); + if (!error) { + magnet_set_g2(res, u); + } + } + break; + case MAGNET_KEY_NONE: g_message("unhandled parameter in MAGNET URI: \"%s\"", name); break; @@ -536,7 +547,7 @@ G_FREE_NULL(to_free); } -struct magnet_resource * +struct magnet_resource * magnet_parse(const char *url, const char **error_str) { static const struct magnet_resource zero_resource; @@ -607,8 +618,8 @@ next = endptr; } - res.sources = g_slist_reverse(res.sources); - res.searches = g_slist_reverse(res.searches); + res.sources = pslist_reverse(res.sources); + res.searches = pslist_reverse(res.searches); return wcopy(&res, sizeof res); } @@ -617,7 +628,7 @@ magnet_source_free(struct magnet_source **ms_ptr) { struct magnet_source *ms = *ms_ptr; - + if (ms) { atom_str_free_null(&ms->hostname); atom_str_free_null(&ms->path); @@ -640,7 +651,7 @@ struct magnet_resource *res = *res_ptr; if (res) { - GSList *sl; + pslist_t *sl; atom_str_free_null(&res->display_name); atom_sha1_free_null(&res->sha1); @@ -649,17 +660,17 @@ atom_str_free_null(&res->guid); atom_str_free_null(&res->vendor); - for (sl = res->sources; sl != NULL; sl = g_slist_next(sl)) { + PSLIST_FOREACH(res->sources, sl) { struct magnet_source *ms = sl->data; magnet_source_free(&ms); } - gm_slist_free_null(&res->sources); + pslist_free_null(&res->sources); - for (sl = res->searches; sl != NULL; sl = g_slist_next(sl)) { + PSLIST_FOREACH(res->searches, sl) { const char *s = sl->data; atom_str_free_null(&s); } - gm_slist_free_null(&res->searches); + pslist_free_null(&res->searches); wfree(res, sizeof *res); *res_ptr = NULL; } @@ -684,8 +695,8 @@ { g_return_if_fail(res); g_return_if_fail(s); - - res->sources = g_slist_prepend(res->sources, s); + + res->sources = pslist_prepend(res->sources, s); } void @@ -703,7 +714,7 @@ void magnet_add_sha1_source(struct magnet_resource *res, const struct sha1 *sha1, - const host_addr_t addr, const guint16 port, const struct guid *guid, + const host_addr_t addr, const uint16 port, const struct guid *guid, const gnet_host_vec_t *proxies) { struct magnet_source *s; @@ -725,14 +736,14 @@ if (proxies != NULL) { int i, n; - GSList *sl = NULL; + pslist_t *sl = NULL; n = gnet_host_vec_count(proxies); for (i = 0; i < n; i++) { gnet_host_t host; host = gnet_host_vec_get(proxies, i); - sl = g_slist_prepend(sl, gnet_host_dup(&host)); + sl = pslist_prepend(sl, gnet_host_dup(&host)); } s->proxies = sl; @@ -747,7 +758,7 @@ g_return_if_fail(res); g_return_if_fail(search); - res->searches = g_slist_prepend(res->searches, + res->searches = pslist_prepend(res->searches, deconstify_gchar(atom_str_get(search))); } @@ -779,7 +790,7 @@ } -gboolean +bool magnet_set_exact_topic(struct magnet_resource *res, const char *topic) { struct sha1 sha1; @@ -828,7 +839,7 @@ } static inline void -magnet_append_item(str_t *s, gboolean escape_value, +magnet_append_item(str_t *s, bool escape_value, const char *key, const char *value) { g_return_if_fail(s); @@ -836,7 +847,7 @@ g_return_if_fail(value); if (0 == str_len(s)) { - str_cat(s, "magnet:?"); + STR_CAT(s, "magnet:?"); } else { str_putc(s, '&'); } @@ -885,11 +896,11 @@ * @return A halloc()ed string. */ static char * -proxies_to_string(GSList *proxies) +proxies_to_string(pslist_t *proxies) { sequence_t seq; - return proxy_sequence_to_string(sequence_fill_from_gslist(&seq, proxies)); + return proxy_sequence_to_string(sequence_fill_from_pslist(&seq, proxies)); } /** @@ -905,7 +916,7 @@ { if (NULL == proxies) return h_strdup(""); - + return proxy_sequence_to_string(proxies); } @@ -931,20 +942,20 @@ if (s->guid) { char guid_bufGUID_HEX_SIZE + 1; - + guid_to_string_buf(s->guid, guid_buf, sizeof guid_buf); concat_strings(prefix_buf, sizeof prefix_buf, - "push://", guid_buf, (void *) 0); + "push://", guid_buf, NULL_PTR); prefix = prefix_buf; } else { prefix = "http://"; } - + port_buf0 = '\0'; if (s->hostname) { host = s->hostname; if (80 != s->port) { - gm_snprintf(port_buf, sizeof port_buf, ":%u", + str_bprintf(port_buf, sizeof port_buf, ":%u", (unsigned) s->port); } } else if (s->guid) { @@ -954,13 +965,13 @@ host = host_addr_port_to_string(s->addr, s->port); } if (s->path) { - url = g_strconcat(prefix, host, port_buf, s->path, (void *) 0); + url = g_strconcat(prefix, host, port_buf, s->path, NULL_PTR); } else if (s->sha1) { url = g_strconcat(prefix, host, port_buf, "/uri-res/N2R?", bitprint_to_urn_string(s->sha1, s->tth), - (void *) 0); + NULL_PTR); } else { - url = g_strconcat(prefix, host, port_buf, "/", (void *) 0); + url = g_strconcat(prefix, host, port_buf, "/", NULL_PTR); } HFREE_NULL(proxies); @@ -977,11 +988,11 @@ char * magnet_to_string(const struct magnet_resource *res) { - GSList *sl; + pslist_t *sl; str_t *s; g_return_val_if_fail(res, NULL); - + s = str_new(0); if (res->display_name) { @@ -1009,8 +1020,11 @@ if (res->dht) { magnet_append_item(s, TRUE, "x.dht", "1"); } + if (res->g2) { + magnet_append_item(s, TRUE, "x.g2", "1"); + } - for (sl = res->sources; NULL != sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(res->sources, sl) { char *url; url = magnet_source_to_string(sl->data); @@ -1018,7 +1032,7 @@ G_FREE_NULL(url); } - for (sl = res->searches; NULL != sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(res->searches, sl) { magnet_append_item(s, TRUE, "kt", sl->data); } @@ -1100,11 +1114,24 @@ * valid for a certain source. */ void -magnet_set_dht(struct magnet_resource *res, gboolean dht_support) +magnet_set_dht(struct magnet_resource *res, bool dht_support) { g_return_if_fail(res); res->dht = booleanize(dht_support); } +/** + * This is a bit of a hack (an extension anyway) and should only be used + * for magnets with a single logical source because G2 support is only + * valid for a certain source. + */ +void +magnet_set_g2(struct magnet_resource *res, bool g2) +{ + g_return_if_fail(res); + + res->g2 = booleanize(g2); +} + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/magnet.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/magnet.h
Changed
@@ -39,6 +39,7 @@ #include "lib/gnet_host.h" #include "lib/host_addr.h" #include "lib/misc.h" +#include "lib/pslist.h" #include "lib/sequence.h" struct magnet_source { @@ -48,9 +49,9 @@ const struct sha1 *sha1; /* SHA1 atom */ const struct tth *tth; /* TTH atom */ const struct guid *guid; /* GUID atom */ - GSList *proxies; /* List of walloc()ed (gnet_host_t *) */ + pslist_t *proxies; /* List of walloc()ed (gnet_host_t *) */ host_addr_t addr; - guint16 port; + uint16 port; }; struct magnet_resource { @@ -60,10 +61,11 @@ const char *parq_id; /* string atom */ const char *vendor; /* string atom */ const char *guid; /* string atom */ - GSList *sources; /* List of walloc()ed (struct magnet_source *) */ - GSList *searches; /* List of string atoms */ + pslist_t *sources; /* List of walloc()ed (struct magnet_source *) */ + pslist_t *searches; /* List of string atoms */ filesize_t size; unsigned dht:1; /* DHT support for this source */ + unsigned g2:1; /* G2 support for this source */ }; struct magnet_resource *magnet_parse(const char *url, const char **error_str); @@ -78,20 +80,21 @@ char *magnet_source_to_string(const struct magnet_source *s); void magnet_set_filesize(struct magnet_resource *res, filesize_t size); void magnet_set_display_name(struct magnet_resource *res, const char *name); -gboolean magnet_set_exact_topic(struct magnet_resource *res, +bool magnet_set_exact_topic(struct magnet_resource *res, const char *topic); void magnet_set_sha1(struct magnet_resource *res, const struct sha1 *sha1); void magnet_set_tth(struct magnet_resource *res, const struct tth *tth); void magnet_add_search(struct magnet_resource *res, const char *search); void magnet_add_source_by_url(struct magnet_resource *res, const char *url); void magnet_add_sha1_source(struct magnet_resource *res, - const struct sha1 *sha1, const host_addr_t addr, const guint16 port, + const struct sha1 *sha1, const host_addr_t addr, const uint16 port, const struct guid *guid, const gnet_host_vec_t *proxies); /* Extensions */ void magnet_set_parq_id(struct magnet_resource *res, const char *parq_id); void magnet_set_guid(struct magnet_resource *res, const char *guid); -void magnet_set_dht(struct magnet_resource *res, gboolean dht_support); +void magnet_set_dht(struct magnet_resource *res, bool dht_support); +void magnet_set_g2(struct magnet_resource *res, bool g2); void magnet_set_vendor(struct magnet_resource *res, const char *vendor); char *magnet_proxies_to_string(const sequence_t *proxies);
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/malloc.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/malloc.c
Changed
@@ -40,20 +40,24 @@ #define MALLOC_SOURCE /**< Avoid nasty remappings, but include signatures */ #include "ascii.h" +#include "atomic.h" #include "atoms.h" /* For binary_hash() */ -#include "concat.h" /* For concat_strings() */ #include "cq.h" #include "endian.h" /* For peek_*() and poke_*() */ -#include "glib-missing.h" +#include "hashing.h" #include "hashtable.h" +#include "leak.h" #include "log.h" #include "omalloc.h" #include "parse.h" /* For parse_pointer() */ #include "path.h" /* For filepath_basename() */ +#include "spinlock.h" #include "stacktrace.h" -#include "stringify.h" /* For uint64_to_string() and short_time() */ +#include "str.h" +#include "stringify.h" #include "tm.h" /* For tm_time() */ #include "unsigned.h" /* For size_is_non_negative() */ +#include "vsort.h" #include "xmalloc.h" /* @@ -140,13 +144,13 @@ #define MALLOC_TRAILER_MARK '\245' /* 0xa5 */ union mem_chunk { - void *next; - guint8 u8; - guint16 u16; - guint32 u32; - guint64 u64; - float f; - double d; + void *next; + uint8 u8; + uint16 u16; + uint32 u32; + uint64 u64; + float f; + double d; }; #ifdef MALLOC_SAFE_HEAD @@ -204,7 +208,17 @@ #endif #ifdef MALLOC_VTABLE -static gboolean vtable_works; /* Whether we can trap glib memory calls */ +static bool vtable_works; /* Whether we can trap glib memory calls */ +#endif + +#ifdef malloc +#error "malloc() should not be a macro here." +#endif +#ifdef free +#error "free() should not be a macro here." +#endif +#ifdef realloc +#error "realloc() should not be a macro here." #endif /** @@ -249,7 +263,7 @@ static time_t init_time = 0; static time_t reset_time = 0; -static gboolean free_record(gconstpointer o, const char *file, int line); +static bool free_record(const void *o, const char *file, int line); #endif #if defined(TRACK_MALLOC) || defined(MALLOC_SAFE_HEAD) @@ -289,7 +303,14 @@ ht = *hptr; if (NULL == ht) { - *hptr = ht = hash_table_new_full_real(stack_hash, stack_eq); + static spinlock_t frame_lock = SPINLOCK_INIT; + spinlock(&frame_lock); + if (NULL == (ht = *hptr)) { + ht = hash_table_new_full_real(stack_hash, stack_eq); + hash_table_thread_safe(ht); + *hptr = ht; + } + spinunlock(&frame_lock); } else { fr = hash_table_lookup(ht, ast); } @@ -298,7 +319,7 @@ fr = omalloc0(sizeof *fr); /* Never freed */ fr->ast = ast; if (!hash_table_insert(ht, ast, fr)) { - g_error("cannot record stack frame atom"); + s_error("cannot record stack frame atom"); } } @@ -343,12 +364,15 @@ * Hashing routine for "struct stats". * Only the "file" and "line" fields are considered. */ -static guint -stats_hash(gconstpointer key) +static unsigned +stats_hash(const void *key) { const struct stats *s = key; + unsigned h; + + h = string_mix_hash(s->file) ^ integer_hash_fast(s->line); - return g_str_hash(s->file) ^ s->line; + return hashing_mix32(h); } /** @@ -356,7 +380,7 @@ * Only the "file" and "line" fields are considered. */ static int -stats_eq(gconstpointer a, gconstpointer b) +stats_eq(const void *a, const void *b) { const struct stats *sa = a, *sb = b; @@ -384,16 +408,16 @@ #ifdef MALLOC_SAFE_HEAD static inline struct malloc_header * -malloc_header_from_arena(gconstpointer o) +malloc_header_from_arena(const void *o) { - return (gpointer) ((char *) o - SAFE_ARENA_OFFSET); + return cast_to_pointer((char *) o - SAFE_ARENA_OFFSET); } #endif /* MALLOC_SAFE_HEAD */ static inline struct real_malloc_header * -real_malloc_header_from_arena(gconstpointer o) +real_malloc_header_from_arena(const void *o) { - return (gpointer) ((char *) o - REAL_ARENA_OFFSET); + return cast_to_pointer((char *) o - REAL_ARENA_OFFSET); } static inline size_t @@ -403,20 +427,20 @@ #ifdef MALLOC_SAFE_HEAD SAFE_ARENA_OFFSET + #endif - sizeof(guint32) + MALLOC_TRAILER_LEN; + sizeof(uint32) + MALLOC_TRAILER_LEN; } static inline size_t real_malloc_safe_size(size_t size) { - return size + REAL_ARENA_OFFSET + sizeof(guint32) + MALLOC_TRAILER_LEN; + return size + REAL_ARENA_OFFSET + sizeof(uint32) + MALLOC_TRAILER_LEN; } /** * Mark allocated block trailer. */ -static void -block_write_trailer(gpointer o, size_t size) +static void G_UNUSED +block_write_trailer(void *o, size_t size) { size_t trailer = MALLOC_TRAILER_LEN; char *p; @@ -439,29 +463,29 @@ * * @return whether an error was detected. */ -static gboolean -block_check_trailer(gconstpointer o, size_t size, +static bool G_UNUSED +block_check_trailer(const void *o, size_t size, const char *file, int line, const char *op_file, int op_line, - gboolean showstack) + bool showstack) { - gboolean error = FALSE; + bool error = FALSE; size_t trailer = MALLOC_TRAILER_LEN; const char *p; if (MALLOC_END_MARK != peek_be32(const_ptr_add_offset(o, size))) { error = TRUE; - g_warning( + s_warning( "MALLOC (%s:%d) block %p (%zu bytes) from %s:%d " "has corrupted end mark", op_file, op_line, o, size, file, line); goto done; } - p = const_ptr_add_offset(o, size + sizeof(guint32)); + p = const_ptr_add_offset(o, size + sizeof(uint32)); while (trailer--) { if (*p++ != MALLOC_TRAILER_MARK) { error = TRUE; - g_warning( + s_warning( "MALLOC (%s:%d) block %p (%zu bytes) from %s:%d " "has corrupted trailer", op_file, op_line, o, size, file, line); @@ -487,10 +511,10 @@ * @param size the user-known size of the buffer */ static void -block_check_marks(gconstpointer o, struct block *b, +block_check_marks(const void *o, struct block *b, const char *file, int line) { - gboolean error = FALSE; + bool error = FALSE; if (b->corrupted) return; /* Already identified it was corrupted */ @@ -505,7 +529,7 @@ if (mh->start != MALLOC_START_MARK) { error = TRUE; b->corrupted = TRUE; - g_warning( + s_warning( "MALLOC (%s:%d) block %p from %s:%d has corrupted start mark", file, line, o, b->file, b->line); } @@ -524,13 +548,15 @@ #endif /* TRACK_MALLOC */ #else /* !MALLOC_SAFE */ -static inline void block_write_trailer(gpointer o, size_t size) +static inline void G_UNUSED +block_write_trailer(void *o, size_t size) { (void) o; (void) size; } -static inline gboolean block_check_trailer(gconstpointer o, size_t size, +static inline bool G_UNUSED +block_check_trailer(const void *o, size_t size, const char *file, int line, const char *op_file, int op_line, - gboolean showstack) + bool showstack) { (void) o; (void) size; (void) file; (void) line; (void) op_file; (void) op_line; (void) showstack; @@ -548,7 +574,7 @@ static inline void block_erase(const void *o, size_t size) { - void *p = deconstify_gpointer(o); + void *p = deconstify_pointer(o); memset(p, MALLOC_ERASE_MARK, size); } #else /* !MALLOC_FREE_ERASE */ @@ -566,24 +592,24 @@ static inline void block_mark_dead(const void *p, size_t size) { - if (size >= sizeof(guint)) { - *(guint *) p = MALLOC_DEAD_MARK; + if (size >= sizeof(uint)) { + *(uint *) p = MALLOC_DEAD_MARK; } } static inline void block_clear_dead(const void *p, size_t size) { - if (size >= sizeof(guint)) { - *(guint *) p = MALLOC_DEAD_CLEAR; + if (size >= sizeof(uint)) { + *(uint *) p = MALLOC_DEAD_CLEAR; } } -static inline gboolean +static inline bool block_is_dead(const void *p, size_t size) { - if (size >= sizeof(guint)) { - return MALLOC_DEAD_MARK == *(guint *) p; + if (size >= sizeof(uint)) { + return MALLOC_DEAD_MARK == *(uint *) p; } return FALSE; @@ -602,7 +628,7 @@ */ #ifdef MALLOC_PERIODIC -static gboolean need_periodic; +static bool need_periodic; struct block_check_context { size_t tracked_size; @@ -622,7 +648,7 @@ { struct block_check_context *bc = ctx; struct block *b = value; - gboolean was_corrupted; + bool was_corrupted; bc->tracked_count++; bc->tracked_size = size_saturate_add(bc->tracked_size, b->size); @@ -654,7 +680,7 @@ { struct block_check_context *bc = ctx; struct realblock *rb = value; - void *p = deconstify_gpointer(key); + void *p = deconstify_pointer(key); bc->real_count++; bc->real_size = size_saturate_add(bc->real_size, rb->size); @@ -671,7 +697,7 @@ rb->corrupted = TRUE; } if (block_is_dead(p, rb->size)) { - g_warning("MALLOC allocated block %p marked as DEAD", p); + s_warning("MALLOC allocated block %p marked as DEAD", p); } #ifdef MALLOC_SAFE @@ -680,15 +706,15 @@ if (REAL_MALLOC_MAGIC != rmh->magic) { rb->header_corrupted = TRUE; bc->new_corrupted++; - g_warning("MALLOC corrupted real block magic at %p (%zu byte%s)", - p, rb->size, 1 == rb->size ? "" : "s"); + s_warning("MALLOC corrupted real block magic at %p (%zu byte%s)", + p, rb->size, plural(rb->size)); } else if (rmh->size != rb->size) { /* Can indicate memory corruption as well */ bc->new_corrupted++; rb->header_corrupted = TRUE; - g_warning("MALLOC size mismatch for real block %p: " + s_warning("MALLOC size mismatch for real block %p: " "hashtable says %zu byte%s, header says %zu", - p, rb->size, 1 == rb->size ? "" : "s", rmh->size); + p, rb->size, plural(rb->size), rmh->size); } } #endif /* MALLOC_SAFE */ @@ -697,23 +723,23 @@ /** * Periodic check to make sure all the known blocks are correct. */ -static gboolean -malloc_periodic(gpointer unused_obj) +static bool +malloc_periodic(void *unused_obj) { struct block_check_context ctx; - gboolean checked = FALSE; + bool checked = FALSE; tm_t start, end; static unsigned errors; char tracked_sizeSIZE_FIELD_MAX; char real_sizeSIZE_FIELD_MAX; - + (void) unused_obj; if (0 == errors) { - g_message("malloc periodic check starting..."); + s_message("malloc periodic check starting..."); } else { - g_message("malloc periodic check starting... %u error%s already", - errors, 1 == errors ? "" : "s"); + s_message("malloc periodic check starting... %u error%s already", + errors, plural(errors)); } ZERO(&ctx); @@ -730,7 +756,7 @@ #endif if (!checked) { - g_message("malloc periodic: nothing to check, disabling."); + s_message("malloc periodic: nothing to check, disabling."); return FALSE; } @@ -742,7 +768,7 @@ real_size, sizeof real_size); if (0 == ctx.old_corrupted && 0 == ctx.new_corrupted) { - g_message("malloc periodic check done (%u msecs): " + s_message("malloc periodic check done (%u msecs): " "tracked: %u %s, real: %u %s", (unsigned) tm_elapsed_ms(&end, &start), ctx.tracked_count, tracked_size, @@ -751,7 +777,7 @@ if (ctx.new_corrupted) { errors++; } - g_warning("malloc periodic check done (%u msecs): %s" + s_warning("malloc periodic check done (%u msecs): %s" "tracked: %u %s, real: %u %s, " "NEWLY CORRUPTED: %u (%u old)", (unsigned) tm_elapsed_ms(&end, &start), @@ -784,11 +810,10 @@ b = hash_table_lookup(blocks, p); if (b != NULL) { - g_warning("MALLOC (%s:%d) reusing %sblock %p (%zu byte%s) " + s_warning("MALLOC (%s:%d) reusing %sblock %p (%zu byte%s) " "from %s:%d, missed its freeing", file, line, b->owned ? "owned " : "foreign ", - p, b->size, 1 == b->size ? "" : "s", - b->file, b->line); + p, b->size, plural(b->size), b->file, b->line); stacktrace_where_print(stderr); b->owned = FALSE; /* No need to check markers */ @@ -823,24 +848,23 @@ * reuse the address and need to track it. */ - g_warning("MALLOC reusing %s block %p (%zu byte%s) " + s_warning("MALLOC reusing %s block %p (%zu byte%s) " "from %s:%d, missed its freeing", b->owned ? "owned" : "foreign", - p, rb->size, 1 == rb->size ? "" : "s", - b->file, b->line); + p, rb->size, plural(rb->size), b->file, b->line); b->owned = FALSE; free_record(p, _WHERE_, __LINE__); } } #else /* !TRACK_MALLOC */ - g_warning("MALLOC reusing real block %p (%zu byte%s), " + s_warning("MALLOC reusing real block %p (%zu byte%s), " "missed its freeing", - p, rb->size, 1 == rb->size ? "" : "s"); + p, rb->size, plural(rb->size)); #endif /* TRACK_MALLOC */ - g_warning("current_frame:"); + s_warning("current_frame:"); stacktrace_where_print(stderr); #ifdef MALLOC_FRAMES - g_warning("allocation frame:"); + s_warning("allocation frame:"); stacktrace_atom_print(stderr, rb->alloc->ast); #endif hash_table_remove(reals, p); @@ -858,7 +882,7 @@ void *o; #ifdef MALLOC_PERIODIC - if (need_periodic && NULL != callout_queue) + if (need_periodic) install_malloc_periodic(); #endif @@ -870,7 +894,7 @@ rmh = malloc(len); if (rmh == NULL) - g_error("unable to allocate %zu bytes", size); + s_error("unable to allocate %zu bytes", size); rmh->magic = REAL_MALLOC_MAGIC; rmh->size = size; @@ -884,7 +908,7 @@ #endif /* MALLOC_SAFE */ if (o == NULL) - g_error("unable to allocate %zu bytes", size); + s_error("unable to allocate %zu bytes", size); block_clear_dead(o, size); @@ -896,7 +920,7 @@ rb->size = size; real_check_missed_free(o); if (!hash_table_insert(reals, o, rb)) { - g_error("MALLOC cannot record real block %p", o); + s_error("MALLOC cannot record real block %p", o); } #ifdef MALLOC_TIME rb->atime = tm_time(); @@ -908,9 +932,9 @@ stacktrace_get(&t); /* Want to see real_malloc() in stack */ fr = get_frame_atom(&gst.alloc_frames, &t); - fr->count += size; - fr->total_count += size; - fr->blocks++; + ATOMIC_ADD(fr->count, size); + ATOMIC_ADD(fr->total_count, size); + ATOMIC_INC(fr->blocks); rb->alloc = fr; } #endif /* MALLOC_FRAMES */ @@ -933,12 +957,13 @@ struct real_malloc_header *rmh = real_malloc_header_from_arena(p); if (REAL_MALLOC_MAGIC != rmh->magic) - g_warning("MALLOC free(): corrupted real block magic at %p", p); + s_warning("MALLOC free(): corrupted real block magic at %p", p); free(rmh); } #endif /* MALLOC_SAFE */ +#if defined(TRACK_MALLOC) || defined(TRACK_VMM) /** * Calls real free(), no tracking. * Block must have been allocated via real_malloc(). @@ -947,8 +972,8 @@ real_free(void *p) { #if defined(TRACK_MALLOC) || defined(MALLOC_VTABLE) - gboolean owned = FALSE; - gboolean real = FALSE; + bool owned = FALSE; + bool real = FALSE; void *start = p; #endif #ifdef TRACK_MALLOC @@ -956,7 +981,7 @@ #endif #ifdef MALLOC_PERIODIC - if (need_periodic && NULL != callout_queue) + if (need_periodic) install_malloc_periodic(); #endif @@ -1011,18 +1036,18 @@ free(rb); real = TRUE; /* Was allocated via real_malloc() */ } else { - if (block_is_dead(start, sizeof(guint))) { - g_warning("MALLOC probable duplicate free of %p", p); + if (block_is_dead(start, sizeof(uint))) { + s_warning("MALLOC probable duplicate free of %p", p); stacktrace_where_print(stderr); - g_error("MALLOC invalid free()"); + s_error("MALLOC invalid free()"); } else { - gboolean ok = FALSE; + bool ok = FALSE; #ifdef MALLOC_VTABLE /* See comment in free_track() */ ok = hash_table_lookup(unknowns, p) != NULL; #endif if (!ok) { - g_warning("MALLOC freeing unknown block %p", p); + s_warning("MALLOC freeing unknown block %p", p); stacktrace_where_print(stderr); } } @@ -1055,9 +1080,10 @@ free(p); /* NOT g_free(): would recurse if MALLOC_VTABLE */ } } +#endif /* TRACK_MALLOC || TRACK_VMM */ #endif /* TRACK_MALLOC || TRACK_ZALLOC || TRACK_VMM || MALLOC_VTABLE */ -#if defined(TRACK_MALLOC) || defined(TRACK_ZALLOC) || defined(TRACK_VMM) +#if defined(TRACK_MALLOC) || defined(TRACK_VMM) /** * Wraps strdup() call so that real_free() can be used on the result. */ @@ -1076,7 +1102,7 @@ return p; } -#endif /* TRACK_MALLOC || TRACK_ZALLOC || TRACK_VMM */ +#endif /* TRACK_MALLOC || TRACK_VMM */ #if defined(TRACK_MALLOC) || defined(MALLOC_VTABLE) /** @@ -1091,7 +1117,7 @@ struct block *b = NULL; #endif #ifdef MALLOC_PERIODIC - if (need_periodic && NULL != callout_queue) + if (need_periodic) install_malloc_periodic(); #endif @@ -1126,7 +1152,7 @@ size_t len = real_malloc_safe_size(size); if (REAL_MALLOC_MAGIC != rmh->magic) { - g_error("MALLOC realloc(): corrupted real block magic at %p", + s_error("MALLOC realloc(): corrupted real block magic at %p", p); } @@ -1162,7 +1188,7 @@ #endif /* MALLOC_SAFE */ if (n == NULL) - g_error("cannot realloc block into a %zu-byte one", size); + s_error("cannot realloc block into a %zu-byte one", size); #ifdef TRACK_MALLOC if (n != p && not_leaking != NULL) { @@ -1177,7 +1203,7 @@ hash_table_remove(blocks, p); block_check_missed_free(n, "FAKED", 0); if (!hash_table_insert(blocks, n, b)) { - g_error("MALLOC cannot track reallocated block %p", n); + s_error("MALLOC cannot track reallocated block %p", n); } } } @@ -1186,16 +1212,16 @@ struct realblock *rb = hash_table_lookup(reals, ptr); if (NULL == rb) { - g_warning("MALLOC reallocated unknown block %p", p); + s_warning("MALLOC reallocated unknown block %p", p); stacktrace_where_print(stderr); - g_error("MALLOC invalid realloc()"); + s_error("MALLOC invalid realloc()"); } if (result != ptr) { hash_table_remove(reals, ptr); real_check_missed_free(result); if (!hash_table_insert(reals, result, rb)) { - g_error("MALLOC cannot record reallocated block %p", + s_error("MALLOC cannot record reallocated block %p", result); } } @@ -1244,11 +1270,16 @@ blocks = hash_table_new_real(); not_leaking = hash_table_new_real(); + hash_table_thread_safe(blocks); + hash_table_thread_safe(not_leaking); + #ifdef MALLOC_STATS stats = hash_table_new_full_real(stats_hash, stats_eq); + hash_table_thread_safe(stats); #endif #ifdef MALLOC_FRAMES alloc_points = hash_table_new_real(); + hash_table_thread_safe(alloc_points); #endif init_time = reset_time = tm_time_exact(); @@ -1260,7 +1291,7 @@ * Log used block, and record it among the `leaksort' set for future summary. */ static void -malloc_log_block(const void *k, void *v, gpointer leaksort) +malloc_log_block(const void *k, void *v, void *leaksort) { const struct block *b = v; char ago32; @@ -1269,23 +1300,23 @@ return; #ifdef MALLOC_TIME - gm_snprintf(ago, sizeof ago, " %s", - short_time(delta_time(tm_time(), b->ttime))); + str_bprintf(ago, sizeof ago, " %s", + short_time_ascii(delta_time(tm_time(), b->ttime))); #else ago0 = '\0'; #endif /* MALLOC_TIME */ - g_warning("leaked block %p (%zu bytes) from \"%s:%d\"%s", + s_warning("leaked block %p (%zu bytes) from \"%s:%d\"%s", k, b->size, b->file, b->line, ago); leak_add(leaksort, b->size, b->file, b->line); if (b->reallocations) { struct block *r = b->reallocations->data; - guint cnt = g_slist_length(b->reallocations); + uint cnt = g_slist_length(b->reallocations); - g_warning(" (realloc'ed %u time%s, lastly from \"%s:%d\")", - cnt, cnt == 1 ? "" : "s", r->file, r->line); + s_warning(" (realloc'ed %u time%s, lastly from \"%s:%d\")", + cnt, plural(cnt), r->file, r->line); } #ifdef MALLOC_FRAMES @@ -1294,10 +1325,10 @@ fr = hash_table_lookup(alloc_points, k); if (fr == NULL) - g_warning("no allocation record for %p from %s:%d?", + s_warning("no allocation record for %p from %s:%d?", k, b->file, b->line); else { - g_message("block %p (out of %u) allocated from:", + s_message("block %p (out of %u) allocated from:", k, (unsigned) fr->blocks); stacktrace_atom_print(stderr, fr->ast); } @@ -1312,7 +1343,7 @@ * Log used block, and record it among the `leaksort' set for future summary. */ static void -malloc_log_real_block(const void *k, void *v, gpointer leaksort) +malloc_log_real_block(const void *k, void *v, void *leaksort) { const struct realblock *rb = v; const void *p = k; @@ -1362,18 +1393,18 @@ return; /* Was already logged through malloc_log_block() */ #ifdef MALLOC_TIME - gm_snprintf(ago, sizeof ago, " %s", - short_time(delta_time(tm_time(), rb->atime))); + str_bprintf(ago, sizeof ago, " %s", + short_time_ascii(delta_time(tm_time(), rb->atime))); #else ago0 = '\0'; #endif /* MALLOC_TIME */ - g_warning("leaked block %p (%zu bytes)%s", p, rb->size, ago); + s_warning("leaked block %p (%zu bytes)%s", p, rb->size, ago); leak_add(leaksort, rb->size, "FAKED", 0); #ifdef MALLOC_FRAMES - g_message("block %p (out of %u) allocated from:", + s_message("block %p (out of %u) allocated from:", p, (unsigned) rb->alloc->blocks); stacktrace_atom_print(stderr, rb->alloc->ast); #endif /* MALLOC_FRAMES */ @@ -1384,8 +1415,8 @@ * Flag object ``o'' as "not leaking" if not freed at exit time. * @return argument ``o''. */ -gpointer -malloc_not_leaking(gconstpointer o) +void * +malloc_not_leaking(const void *o) { /* * Could be called on memory that was not allocated dynamically or which @@ -1419,20 +1450,20 @@ * something we know nothing about. */ - g_warning("MALLOC asked to ignore leaks on unknown address %p", o); + s_warning("MALLOC asked to ignore leaks on unknown address %p", o); stacktrace_where_print(stderr); #endif done: - return deconstify_gpointer(o); + return deconstify_pointer(o); } /** * Record object `o' allocated at `file' and `line' of size `s'. * @return argument `o'. */ -gpointer -malloc_record(gconstpointer o, size_t sz, gboolean owned, +void * +malloc_record(const void *o, size_t sz, bool owned, const char *file, int line) { struct block *b; @@ -1448,9 +1479,9 @@ b = calloc(1, sizeof(*b)); if (b == NULL) - g_error("unable to allocate %u bytes", (unsigned) sizeof(*b)); + s_error("unable to allocate %u bytes", (unsigned) sizeof(*b)); - b->file = short_filename(deconstify_gpointer(file)); + b->file = short_filename(deconstify_pointer(file)); b->line = line; b->size = sz; b->reallocations = NULL; @@ -1473,7 +1504,7 @@ block_check_missed_free(o, file, line); if (!hash_table_insert(blocks, o, b)) { - g_error("MALLOC cannot track block %p", o); + s_error("MALLOC cannot track block %p", o); } #ifdef MALLOC_STATS @@ -1492,10 +1523,10 @@ hash_table_insert(stats, st, st); } - st->total_blocks++; - st->blocks++; - st->allocated += sz; - st->total_allocated += sz; + ATOMIC_INC(st->total_blocks); + ATOMIC_INC(st->blocks); + ATOMIC_ADD(st->allocated, sz); + ATOMIC_ADD(st->total_allocated, sz); } #endif /* MALLOC_STATS */ #ifdef MALLOC_FRAMES @@ -1506,24 +1537,24 @@ stacktrace_get_offset(&t, 1); fr = get_frame_atom(st ? &st->alloc_frames : &gst.alloc_frames, &t); - fr->count += sz; - fr->total_count += sz; - fr->blocks++; + ATOMIC_ADD(fr->count, sz); + ATOMIC_ADD(fr->total_count, sz); + ATOMIC_INC(fr->blocks); hash_table_insert(alloc_points, o, fr); } #endif /* MALLOC_FRAMES */ - return deconstify_gpointer(o); + return deconstify_pointer(o); } /** * Allocate `s' bytes. */ -gpointer +void * malloc_track(size_t size, const char *file, int line) { - gpointer o; + void *o; #ifdef MALLOC_SAFE { @@ -1534,7 +1565,7 @@ mh = real_malloc(len); if (mh == NULL) - g_error("unable to allocate %zu bytes", size); + s_error("unable to allocate %zu bytes", size); mh->start = MALLOC_START_MARK; o = mh->arena; @@ -1548,7 +1579,7 @@ #endif /* MALLOC_SAFE */ if (o == NULL) - g_error("unable to allocate %zu bytes", size); + s_error("unable to allocate %zu bytes", size); block_clear_dead(o, size); @@ -1558,10 +1589,10 @@ /** * Allocate `s' bytes, zero the allocated zone. */ -gpointer +void * malloc0_track(size_t size, const char *file, int line) { - gpointer o; + void *o; o = malloc_track(size, file, line); memset(o, 0, size); @@ -1573,14 +1604,14 @@ * Record freeing of allocated block. * @return TRUE if the block was owned */ -static gboolean -free_record(gconstpointer o, const char *file, int line) +static bool +free_record(const void *o, const char *file, int line) { struct block *b; const void *k; void *v; GSList *l; - gboolean owned = FALSE; + bool owned = FALSE; #if defined(MALLOC_STATS) || defined(MALLOC_FRAMES) struct stats *st = NULL; /* Needed in case MALLOC_FRAMES is also set */ #endif @@ -1593,13 +1624,13 @@ return FALSE; if (block_is_dead(o, 4)) { - g_error("MALLOC (%s:%d) duplicate free of %p", file, line, o); + s_error("MALLOC (%s:%d) duplicate free of %p", file, line, o); } - g_warning("MALLOC (%s:%d) attempt to free block at %p twice?", + s_warning("MALLOC (%s:%d) attempt to free block at %p twice?", file, line, o); stacktrace_where_print(stderr); - g_error("MALLOC free() of unknown address %p", o); + s_error("MALLOC free() of unknown address %p", o); return FALSE; } @@ -1635,23 +1666,23 @@ st = hash_table_lookup(stats, &s); if (st == NULL) - g_warning( + s_warning( "MALLOC (%s:%d) no alloc record of block %p from %s:%d?", file, line, o, b->file, b->line); else { /* Count present block size, after possible realloc() */ - st->freed += b->size; - st->total_freed += b->size; + ATOMIC_ADD(st->freed, b->size); + ATOMIC_ADD(st->total_freed, b->size); if (st->total_blocks > 0) - st->total_blocks--; + ATOMIC_DEC(st->total_blocks); else - g_warning( + s_warning( "MALLOC (%s:%d) live # of blocks was zero at free time?", file, line); /* We could free blocks allocated before "reset", don't warn */ if (st->blocks > 0) - st->blocks--; + ATOMIC_DEC(st->blocks); } } #endif /* MALLOC_STATS */ @@ -1663,8 +1694,8 @@ stacktrace_get_offset(&t, 1); fr = get_frame_atom(&st->free_frames, &t); - fr->count += b->size; /* Counts actual size, not original */ - fr->total_count += b->size; + ATOMIC_INC(fr->count, b->size); /* Counts actual size, not original */ + ATOMIC_INC(fr->total_count, b->size); } hash_table_remove(alloc_points, o); #endif /* MALLOC_FRAMES */ @@ -1687,7 +1718,7 @@ * Free allocated block. */ void -free_track(gpointer o, const char *file, int line) +free_track(void *o, const char *file, int line) { struct block *b; @@ -1751,10 +1782,10 @@ * Update data structures to record that block `o' was re-alloced into * a block of `s' bytes at `n'. */ -static gpointer -realloc_record(gpointer o, gpointer n, size_t size, const char *file, int line) +static void * +realloc_record(void *o, void *n, size_t size, const char *file, int line) { - gboolean blocks_updated = FALSE; + bool blocks_updated = FALSE; struct block *b; struct block *r; #if defined(MALLOC_STATS) || defined(MALLOC_FRAMES) @@ -1776,18 +1807,16 @@ if (NULL != (b = hash_table_lookup(blocks, n))) { blocks_updated = TRUE; } else { - g_error("MALLOC (%s:%d) attempt to realloc freed block at %p?", + s_error("MALLOC (%s:%d) attempt to realloc freed block at %p?", file, line, o); - /* In case the g_error() above is non-fatal or is a g_warning() */ - return malloc_record(n, size, FALSE, file, line); } } r = calloc(sizeof(*r), 1); if (r == NULL) - g_error("unable to allocate %u bytes", (unsigned) sizeof(*r)); + s_error("unable to allocate %u bytes", (unsigned) sizeof(*r)); - r->file = short_filename(deconstify_gpointer(file)); + r->file = short_filename(deconstify_pointer(file)); r->line = line; r->size = b->size; /* Previous size before realloc */ r->reallocations = NULL; @@ -1801,7 +1830,7 @@ if (!blocks_updated) { block_check_missed_free(n, file, line); if (!hash_table_insert(blocks, n, b)) { - g_error("MALLOC cannot track reallocated block %p", n); + s_error("MALLOC cannot track reallocated block %p", n); } } if (not_leaking != NULL && hash_table_remove(not_leaking, o)) { @@ -1819,13 +1848,13 @@ st = hash_table_lookup(stats, &s); if (st == NULL) - g_warning( + s_warning( "MALLOC (%s:%d) no alloc record of block %p from %s:%d?", file, line, o, b->file, b->line); else { /* We store variations in size, as algebric quantities */ - st->reallocated += b->size - r->size; - st->total_reallocated += b->size - r->size; + ATOMIC_INC(st->reallocated, b->size - r->size); + ATOMIC_INC(st->total_reallocated, b->size - r->size); } } #endif /* MALLOC_STATS */ @@ -1837,8 +1866,8 @@ stacktrace_get_offset(&t, 1); fr = get_frame_atom(&st->realloc_frames, &t); - fr->count += b->size - r->size; - fr->total_count += b->size - r->size; + ATOMIC_INC(fr->count, b->size - r->size); + ATOMIC_INC(fr->total_count, b->size - r->size); } if (n != o) { struct frame *fra = hash_table_lookup(alloc_points, o); @@ -1847,7 +1876,7 @@ hash_table_remove(alloc_points, o); hash_table_insert(alloc_points, n, fra); } else { - g_warning("MALLOC lost allocation frame for %p at %s:%d -> %p", + s_warning("MALLOC lost allocation frame for %p at %s:%d -> %p", o, b->file, b->line, n); } } @@ -1859,8 +1888,8 @@ /** * Realloc object `o' to `size' bytes. */ -gpointer -realloc_track(gpointer o, size_t size, const char *file, int line) +void * +realloc_track(void *o, size_t size, const char *file, int line) { if (o == NULL) return malloc_track(size, file, line); @@ -1869,7 +1898,7 @@ free_track(o, file, line); return NULL; } else { - gpointer n; + void *n; #ifdef MALLOC_SAFE struct block *b; @@ -1884,7 +1913,7 @@ mh = real_realloc(mh, total); if (mh == NULL) { - g_error("cannot realloc block into a %zu-byte one", size); + s_error("cannot realloc block into a %zu-byte one", size); } mh->start = MALLOC_START_MARK; @@ -1905,7 +1934,7 @@ #endif /* MALLOC_SAFE */ if (n == NULL) - g_error("cannot realloc block into a %zu-byte one", size); + s_error("cannot realloc block into a %zu-byte one", size); return realloc_record(o, n, size, file, line); } @@ -1914,10 +1943,10 @@ /** * Duplicate buffer `p' of length `size'. */ -gpointer -memdup_track(gconstpointer p, size_t size, const char *file, int line) +void * +memdup_track(const void *p, size_t size, const char *file, int line) { - gpointer o; + void *o; if (p == NULL) return NULL; @@ -1934,7 +1963,7 @@ char * strdup_track(const char *s, const char *file, int line) { - gpointer o; + void *o; size_t len; if (s == NULL) @@ -1953,7 +1982,7 @@ char * strndup_track(const char *s, size_t n, const char *file, int line) { - gpointer o; + void *o; char *q; if (s == NULL) @@ -1995,7 +2024,7 @@ size = strlen(s) + 1; res = real_malloc(size); if (NULL == res) - g_error("out of memory"); + s_error("out of memory"); memcpy(res, s, size); @@ -2005,7 +2034,7 @@ if (len > 0) { res = real_realloc(res, size + len); if (NULL == res) - g_error("out of memory"); + s_error("out of memory"); memcpy(&ressize - 1, add, len + 1); /* Includes trailing NULL */ size += len; @@ -2046,6 +2075,33 @@ } /** + * Perform string concatenation, returning newly allocated string. + */ +char * +strconcat_v_track(const char *file, int line, const char *s, va_list ap) +{ + char *o; + + o = m_strconcatv(s, ap); + + /* + * FIXME: + * + * m_strconcatv() uses real_malloc(), but we cannot mark we own this + * block as there is no malloc_header structure put in case we're + * compiled with MALLOC_SAFE_HEAD. + * + * To be able to do that, we need to have more flags in the block + * and be able to pass them on to malloc_record (i.e. it must not just + * take TRUE/FALSE but a set of flags) so that we can tell the lower + * layers whether a block allocated through real_malloc() has an + * additional malloc_header in front of the data. + */ + + return malloc_record(o, strlen(o) + 1, FALSE, file, line); +} + +/** * Perform printf into newly allocated string. */ char * @@ -2193,7 +2249,7 @@ for (iter = list; NULL != iter; iter = g_slist_next(iter)) { malloc_record(iter, sizeof *iter, FALSE, file, line); } - return deconstify_gpointer(list); + return deconstify_pointer(list); } GSList * @@ -2203,7 +2259,7 @@ } GSList * -track_slist_append(GSList *l, gpointer data, const char *file, int line) +track_slist_append(GSList *l, void *data, const char *file, int line) { GSList *new; @@ -2219,7 +2275,7 @@ } GSList * -track_slist_prepend(GSList *l, gpointer data, const char *file, int line) +track_slist_prepend(GSList *l, void *data, const char *file, int line) { GSList *new; @@ -2231,13 +2287,13 @@ } GSList * -track_slist_prepend_const(GSList *l, gconstpointer data, +track_slist_prepend_const(GSList *l, const void *data, const char *file, int line) { GSList *new; new = track_slist_alloc(file, line); - new->data = deconstify_gpointer(data); + new->data = deconstify_pointer(data); new->next = l; return new; @@ -2271,7 +2327,7 @@ } GSList * -track_slist_remove(GSList *l, gpointer data, const char *file, int line) +track_slist_remove(GSList *l, void *data, const char *file, int line) { GSList *lk; @@ -2294,7 +2350,7 @@ } GSList * -track_slist_insert(GSList *l, gpointer data, int pos, const char *file, int line) +track_slist_insert(GSList *l, void *data, int pos, const char *file, int line) { GSList *lk; @@ -2311,7 +2367,7 @@ } GSList * -track_slist_insert_sorted(GSList *l, gpointer d, GCompareFunc c, +track_slist_insert_sorted(GSList *l, void *d, GCompareFunc c, const char *file, int line) { int cmp; @@ -2348,7 +2404,7 @@ } GSList * -track_slist_insert_after(GSList *l, GSList *lk, gpointer data, +track_slist_insert_after(GSList *l, GSList *lk, void *data, const char *file, int line) { GSList *new; @@ -2372,7 +2428,7 @@ } GList * -track_list_append(GList *l, gpointer data, const char *file, int line) +track_list_append(GList *l, void *data, const char *file, int line) { GList *new; @@ -2389,7 +2445,7 @@ } GList * -track_list_prepend(GList *l, gpointer data, const char *file, int line) +track_list_prepend(GList *l, void *data, const char *file, int line) { GList *new; @@ -2420,7 +2476,7 @@ for (iter = list; NULL != iter; iter = g_list_next(iter)) { malloc_record(iter, sizeof *iter, FALSE, file, line); } - return deconstify_gpointer(list); + return deconstify_pointer(list); } @@ -2452,7 +2508,7 @@ } GList * -track_list_remove(GList *l, gpointer data, const char *file, int line) +track_list_remove(GList *l, void *data, const char *file, int line) { GList *lk; @@ -2464,7 +2520,7 @@ } GList * -track_list_insert(GList *l, gpointer data, int pos, const char *file, int line) +track_list_insert(GList *l, void *data, int pos, const char *file, int line) { GList *lk; @@ -2481,7 +2537,7 @@ } GList * -track_list_insert_sorted(GList *l, gpointer d, GCompareFunc c, +track_list_insert_sorted(GList *l, void *d, GCompareFunc c, const char *file, int line) { int cmp; @@ -2520,7 +2576,7 @@ } GList * -track_list_insert_after(GList *l, GList *lk, gpointer data, +track_list_insert_after(GList *l, GList *lk, void *data, const char *file, int line) { GList *new; @@ -2543,7 +2599,7 @@ } GList * -track_list_insert_before(GList *l, GList *lk, gpointer data, +track_list_insert_before(GList *l, GList *lk, void *data, const char *file, int line) { GList *new; @@ -2578,185 +2634,6 @@ #endif /* TRACK_MALLOC */ /*** - *** This section contains general-purpose leak summarizing routines that - *** can be used by both malloc() and zalloc(). - ***/ - -#if defined(TRACK_MALLOC) || defined(TRACK_ZALLOC) || defined(TRACK_VMM) - -struct leak_record { /* Informations about leak at some place */ - size_t size; /* Total size allocated there */ - size_t count; /* Amount of allocations */ -}; - -struct leak_set { - GHashTable *places; /* Maps "file:4" -> leak_record */ -}; - -/** - * Initialize the leak accumulator by "file:line" - */ -gpointer -leak_init(void) -{ - struct leak_set *ls; - - ls = real_malloc(sizeof *ls); - ls->places = g_hash_table_new(g_str_hash, g_str_equal); - - return ls; -} - -/** - * Get rid of the key/value tupple in the leak table. - */ -static gboolean -leak_free_kv(gpointer key, gpointer value, gpointer unused_user) -{ - (void) unused_user; - real_free(key); - real_free(value); - return TRUE; -} - -/** - * Dispose of the leaks accumulated. - */ -void -leak_close(gpointer o) -{ - struct leak_set *ls = o; - - g_hash_table_foreach_remove(ls->places, leak_free_kv, NULL); - gm_hash_table_destroy_null(&ls->places); - - real_free(ls); -} - -/** - * Record a new leak of `size' bytes allocated at `file', line `line'. - */ -void -leak_add(gpointer o, size_t size, const char *file, int line) -{ - struct leak_set *ls = o; - char key1024; - struct leak_record *lr; - gboolean found; - gpointer k; - gpointer v; - - g_assert(file); - g_assert(line >= 0); - - concat_strings(key, sizeof key, - file, ":", uint64_to_string(line), (void *) 0); - found = g_hash_table_lookup_extended(ls->places, key, &k, &v); - - if (found) { - lr = v; - lr->size += size; - lr->count++; - } else { - lr = real_malloc(sizeof(*lr)); - lr->size = size; - lr->count = 1; - g_hash_table_insert(ls->places, real_strdup(key), lr); - } -} - -struct leak { /* A memory leak, for sorting purposes */ - char *place; - struct leak_record *lr; -}; - -/** - * leak_size_cmp -- qsort() callback - * - * Compare two pointers to "struct leak" based on their size value, - * in reverse order. - */ -static int -leak_size_cmp(const void *p1, const void *p2) -{ - const struct leak *leak1 = p1, *leak2 = p2; - - /* Reverse order: largest first */ - return CMP(leak2->lr->size, leak1->lr->size); -} - -struct filler { /* Used by hash table iterator to fill leak array */ - struct leak *leaks; - int count; /* Size of `leaks' array */ - int idx; /* Next index to be filled */ -}; - -/** - * fill_array -- hash table iterator - * - * Append current hash table entry at the end of the "leaks" array. - */ -static void -fill_array(gpointer key, gpointer value, gpointer user) -{ - struct filler *filler = user; - struct leak *l; - struct leak_record *lr = value; - - g_assert(filler->idx < filler->count); - - l = &filler->leaksfiller->idx++; - l->place = (char *) key; - l->lr = lr; -} - -/** - * Dump the links sorted by decreasing leak size. - */ -G_GNUC_COLD void -leak_dump(gpointer o) -{ - struct leak_set *ls = o; - int count; - struct filler filler; - int i; - - count = g_hash_table_size(ls->places); - - if (count == 0) - return; - - filler.leaks = real_malloc(sizeof(struct leak) * count); - filler.count = count; - filler.idx = 0; - - /* - * Linearize hash table into an array before sorting it by - * decreasing leak size. - */ - - g_hash_table_foreach(ls->places, fill_array, &filler); - qsort(filler.leaks, count, sizeof(struct leak), leak_size_cmp); - - /* - * Dump the leaks. - */ - - g_warning("leak summary by total decreasing size:"); - g_warning("leaks found: %d", count); - - for (i = 0; i < count; i++) { - struct leak *l = &filler.leaksi; - g_warning("%zu bytes (%zu block%s) from \"%s\"", - l->lr->size, l->lr->count, l->lr->count == 1 ? "" : "s", l->place); - } - - real_free(filler.leaks); -} - -#endif /* TRACK_MALLOC || TRACK_ZALLOC || TRACK_VMM */ - -/*** *** This section contains general-purpose allocation summarizing routines that *** are used when MALLOC_STATS is on. *** @@ -2856,7 +2733,7 @@ /** * Dump the stats held in the specified array. */ -static G_GNUC_COLD void +static void G_COLD stats_array_dump(FILE *f, struct afiller *filler) { int i; @@ -2933,7 +2810,7 @@ * the incremental ones. */ void -alloc_dump(FILE *f, gboolean total) +alloc_dump(FILE *f, bool total) { int count; struct afiller filler; @@ -2946,7 +2823,7 @@ now = tm_time(); fprintf(f, "--- distinct allocation spots found: %d at %s\n", - count, short_time(delta_time(now, init_time))); + count, short_time_ascii(delta_time(now, init_time))); filler.stats = real_malloc(sizeof(struct stats *) * count); filler.count = count; @@ -2958,7 +2835,7 @@ */ hash_table_foreach(stats, stats_fill_array, &filler); - qsort(filler.stats, count, sizeof(struct stats *), + vsort(filler.stats, count, sizeof(struct stats *), total ? stats_total_allocated_cmp : stats_allocated_cmp); /* @@ -2967,7 +2844,7 @@ fprintf(f, "--- summary by decreasing %s allocation size %s %s:\n", total ? "total" : "incremental", total ? "at" : "after", - short_time(delta_time(now, total ? init_time : reset_time))); + short_time_ascii(delta_time(now, total ? init_time : reset_time))); stats_array_dump(f, &filler); /* @@ -2977,12 +2854,12 @@ filler.idx = 0; hash_table_foreach(stats, stats_fill_array, &filler); - qsort(filler.stats, count, sizeof(struct stats *), + vsort(filler.stats, count, sizeof(struct stats *), total ? stats_total_residual_cmp : stats_residual_cmp); fprintf(f, "--- summary by decreasing %s residual memory size %s %s:\n", total ? "total" : "incremental", total ? "at" : "after", - short_time(now - (total ? init_time : reset_time))); + short_time_ascii(now - (total ? init_time : reset_time))); stats_array_dump(f, &filler); /* @@ -2994,15 +2871,15 @@ filler.idx = 0; hash_table_foreach(stats, stats_fill_array, &filler); - qsort(filler.stats, count, sizeof(struct stats *), + vsort(filler.stats, count, sizeof(struct stats *), stats_total_residual_cmp); fprintf(f, "--- summary by decreasing %s residual memory size %s %s:\n", - "total", "at", short_time(delta_time(now, init_time))); + "total", "at", short_time_ascii(delta_time(now, init_time))); stats_array_dump(f, &filler); } - fprintf(f, "--- end summary at %s\n", short_time(now - init_time)); + fprintf(f, "--- end summary at %s\n", short_time_ascii(now - init_time)); real_free(filler.stats); } @@ -3011,7 +2888,7 @@ * Reset incremental allocation and free counters. -- hash table iterator */ static void -stats_reset(const void *uu_key, void *value, gpointer uu_user) +stats_reset(const void *uu_key, void *value, void *uu_user) { struct stats *st = value; @@ -3026,7 +2903,7 @@ * statistics. */ void -alloc_reset(FILE *f, gboolean total) +alloc_reset(FILE *f, bool total) { time_t now = tm_time(); @@ -3034,7 +2911,7 @@ hash_table_foreach(stats, stats_reset, NULL); fprintf(f, "--- incremental allocation stats reset after %s.\n", - short_time(now - reset_time)); + short_time_ascii(now - reset_time)); reset_time = now; } @@ -3049,14 +2926,14 @@ * This routine checks whether calling a simple memory allocation * function from glib will cause real_malloc() to be called. */ -static G_GNUC_COLD void +static void G_COLD malloc_glib12_check(void) { vtable_works = TRUE; #if !GLIB_CHECK_VERSION(2,0,0) { - gpointer p; + void *p; size_t old_size = hash_table_size(reals); /* @@ -3081,7 +2958,7 @@ /* * Sanity checks of malloc settings. */ -static G_GNUC_COLD void +static void G_COLD malloc_sanity_checks(void) { static const char test_string = "test string"; @@ -3115,83 +2992,82 @@ * enables us to see frees for blocks we track but give to GTK, and never * see again otherwise. */ -G_GNUC_COLD void +void G_COLD malloc_init_vtable(void) { #if defined(TRACK_MALLOC) || defined(MALLOC_VTABLE) reals = hash_table_new_real(); unknowns = hash_table_new_real(); + + hash_table_thread_safe(reals); + hash_table_thread_safe(unknowns); #endif + G_IGNORE_PUSH(-Wdeprecated-declarations); /* For g_mem_set_vtable() */ + #ifdef MALLOC_VTABLE { static GMemVTable vtable; -#if GLIB_CHECK_VERSION(2,0,0) vtable.malloc = real_malloc; vtable.realloc = real_realloc; vtable.free = real_free; -#else /* GLib < 2.0.0 */ - vtable.gmvt_malloc = real_malloc; - vtable.gmvt_realloc = real_realloc; - vtable.gmvt_free = real_free; -#endif /* GLib >= 2.0.0 */ g_mem_set_vtable(&vtable); malloc_glib12_check(); } #else /* !MALLOC_VTABLE */ /* - * On Windows, when xmalloc() is actually malloc(), redirect all glib - * memory allocation to malloc() / free(). + * On Windows, redirect all glib memory allocation to xmalloc() / xfree(). */ - if (is_running_on_mingw() && xmalloc_is_malloc()) { + if (is_running_on_mingw()) { static GMemVTable vtable; #if GLIB_CHECK_VERSION(2,0,0) - vtable.malloc = malloc; - vtable.realloc = realloc; - vtable.free = free; -#else /* GLib < 2.0.0 */ - vtable.gmvt_malloc = malloc; - vtable.gmvt_realloc = realloc; - vtable.gmvt_free = free; + static char variable = "G_SLICE=always-malloc"; + putenv(variable); #endif /* GLib >= 2.0.0 */ + vtable.malloc = xmalloc; + vtable.realloc = xrealloc; + vtable.free = xfree; + g_mem_set_vtable(&vtable); } #endif /* MALLOC_VTABLE */ + G_IGNORE_POP; /* For g_mem_set_vtable() */ + malloc_sanity_checks(); } /** * Called from main() to log settings at startup. */ -G_GNUC_COLD void +void G_COLD malloc_show_settings_log(logagent_t *la) { - gboolean has_setting = FALSE; + bool has_setting = FALSE; struct malloc_settings { - guint8 use_halloc; - guint8 track_vmm; - guint8 track_malloc; - guint8 track_zalloc; - guint8 remap_zalloc; - guint8 malloc_stats; - guint8 malloc_frames; - guint8 malloc_safe; - guint8 malloc_safe_head; - gulong malloc_trailer_len; - guint8 malloc_free_erase; - guint8 malloc_dup_free; - guint8 malloc_vtable; - guint8 malloc_periodic; - gulong malloc_period; - gulong malloc_leak_all; - gulong malloc_time; - gboolean vtable_works; + uint8 use_halloc; + uint8 track_vmm; + uint8 track_malloc; + uint8 track_zalloc; + uint8 remap_zalloc; + uint8 malloc_stats; + uint8 malloc_frames; + uint8 malloc_safe; + uint8 malloc_safe_head; + ulong malloc_trailer_len; + uint8 malloc_free_erase; + uint8 malloc_dup_free; + uint8 malloc_vtable; + uint8 malloc_periodic; + ulong malloc_period; + ulong malloc_leak_all; + ulong malloc_time; + bool vtable_works; } settings; ZERO(&settings); @@ -3306,7 +3182,7 @@ /** * Called from main() to log settings at startup. */ -G_GNUC_COLD void +void G_COLD malloc_show_settings(void) { malloc_show_settings_log(log_agent_stderr_get()); @@ -3315,7 +3191,7 @@ /** * @return amount of VMM memory used by internal tracking structures. */ -G_GNUC_COLD size_t +size_t G_COLD malloc_memory_used(void) { size_t res = 0; @@ -3339,11 +3215,11 @@ /** * Dump all the blocks that are still used. */ -G_GNUC_COLD void +void G_COLD malloc_close(void) { #ifdef TRACK_MALLOC - gpointer leaksort; + void *leaksort; #ifdef MALLOC_LEAK_ALL hash_table_t *saved_reals; #endif /* MALLOC_LEAK_ALL */ @@ -3375,7 +3251,7 @@ #endif /* MALLOC_LEAK_ALL */ leak_dump(leaksort); - leak_close(leaksort); + leak_close_null(&leaksort); #ifdef MALLOC_LEAK_ALL /*
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/malloc.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/malloc.h
Changed
@@ -193,6 +193,8 @@ #define h_strconcat(s, ...) \ strconcat_track(_WHERE_, __LINE__, s, __VA_ARGS__) +#define h_strconcat_v(s, ap) strconcat_v_track(_WHERE_, __LINE__, s, ap) + /* * Use STRTRACK() to track an allocated string by some obscure routine that * does not happen to be wrapped here, so that we can remember it is an @@ -244,28 +246,29 @@ #if defined(TRACK_MALLOC) || defined(MALLOC_SOURCE) char *string_record(const char *s, const char *file, int line); -gpointer malloc_record(gconstpointer o, size_t size, gboolean owned, +void *malloc_record(const void *o, size_t size, bool owned, const char *file, int line); GSList *gslist_record(const GSList *, const char *file, int line); GList *glist_record(const GList *, const char *file, int line); -gpointer malloc_not_leaking(gconstpointer o); +void *malloc_not_leaking(const void *o); -gpointer malloc_track(size_t size, const char *file, int line); -gpointer malloc0_track(size_t size, const char *file, int line); -void free_track(gpointer o, const char *file, int line); +void *malloc_track(size_t size, const char *file, int line); +void *malloc0_track(size_t size, const char *file, int line); +void free_track(void *o, const char *file, int line); void strfreev_track(char **v, const char *file, int line); -gpointer realloc_track(gpointer o, size_t size, const char *file, int line); +void *realloc_track(void *o, size_t size, const char *file, int line); char *strdup_track(const char *s, const char *file, int line); char *strndup_track(const char *s, size_t n, const char *file, int line); -gpointer memdup_track(gconstpointer p, size_t size, const char *file, int line); +void *memdup_track(const void *p, size_t size, const char *file, int line); char *strjoinv_track(const char *s, char **vec, const char *file, int line); char *strconcat_track(const char *file, int line, const char *s, ...); +char *strconcat_v_track(const char *file, int line, const char *s, va_list ap); char *strdup_vprintf_track(const char *file, int line, const char *fmt, va_list ap); char *strdup_len_vprintf_track(const char *file, int line, const char *fmt, va_list ap, size_t *len); char *strdup_printf_track(const char *file, int line, const char *fmt, ...) - G_GNUC_PRINTF(3, 4); + G_PRINTF(3, 4); char **strsplit_track( const char *s, const char *d, size_t m, const char *file, int line); @@ -278,57 +281,48 @@ void hash_list_free_track(hash_list_t **hl_ptr, const char *file, int line); GSList *track_slist_alloc(const char *file, int line); -GSList *track_slist_append(GSList *l, gpointer data, +GSList *track_slist_append(GSList *l, void *data, const char *file, int line); -GSList *track_slist_prepend(GSList *l, gpointer data, +GSList *track_slist_prepend(GSList *l, void *data, const char *file, int line); -GSList *track_slist_prepend_const(GSList *l, gconstpointer data, +GSList *track_slist_prepend_const(GSList *l, const void *data, const char *file, int line); GSList *track_slist_copy(GSList *l, const char *file, int line); void track_slist_free(GSList *l, const char *file, int line); void track_slist_free1(GSList *l, const char *file, int line); -GSList *track_slist_remove(GSList *l, gpointer data, +GSList *track_slist_remove(GSList *l, void *data, const char *file, int line); GSList *track_slist_insert( - GSList *l, gpointer d, int pos, const char *file, int line); + GSList *l, void *d, int pos, const char *file, int line); GSList *track_slist_insert_sorted( - GSList *l, gpointer d, GCompareFunc c, const char *file, int line); + GSList *l, void *d, GCompareFunc c, const char *file, int line); GSList *track_slist_insert_after( - GSList *l, GSList *lk, gpointer data, const char *file, int line); + GSList *l, GSList *lk, void *data, const char *file, int line); GSList *track_slist_delete_link(GSList *l, GSList *lk, const char *file, int line); GList *track_list_alloc(const char *file, int line); -GList *track_list_append(GList *l, gpointer data, const char *file, int line); -GList *track_list_prepend(GList *l, gpointer data, const char *file, int line); +GList *track_list_append(GList *l, void *data, const char *file, int line); +GList *track_list_prepend(GList *l, void *data, const char *file, int line); GList *track_list_copy(GList *l, const char *file, int line); void track_list_free(GList *l, const char *file, int line); void track_list_free1(GList *l, const char *file, int line); -GList *track_list_remove(GList *l, gpointer data, const char *file, int line); +GList *track_list_remove(GList *l, void *data, const char *file, int line); GList *track_list_insert( - GList *l, gpointer d, int pos, const char *file, int line); + GList *l, void *d, int pos, const char *file, int line); GList *track_list_insert_sorted( - GList *l, gpointer d, GCompareFunc c, const char *file, int line); + GList *l, void *d, GCompareFunc c, const char *file, int line); GList *track_list_insert_after( - GList *l, GList *lk, gpointer data, const char *file, int line); + GList *l, GList *lk, void *data, const char *file, int line); GList *track_list_insert_before( - GList *l, GList *lk, gpointer data, const char *file, int line); + GList *l, GList *lk, void *data, const char *file, int line); GList *track_list_delete_link(GList *l, GList *lk, const char *file, int line); #endif /* TRACK_MALLOC || MALLOC_SOURCE */ -#if defined(TRACK_MALLOC) || defined(TRACK_ZALLOC) || defined (TRACK_VMM) - -gpointer leak_init(void); -void leak_add(gpointer o, size_t size, const char *file, int line); -void leak_dump(gpointer o); -void leak_close(gpointer o); - -#endif /* TRACK_MALLOC || TRACK_ZALLOC || TRACK_VMM */ - #ifdef MALLOC_STATS -void alloc_dump(FILE *f, gboolean total); -void alloc_reset(FILE *f, gboolean total); +void alloc_dump(FILE *f, bool total); +void alloc_reset(FILE *f, bool total); #endif #ifdef MALLOC_FRAMES
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/map.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/map.c
Changed
@@ -36,11 +36,14 @@ #include "map.h" #include "atoms.h" /* For tests */ #include "debug.h" +#include "htable.h" #include "ohash_table.h" #include "patricia.h" #include "random.h" +#include "stringify.h" /* For plural() */ #include "tm.h" /* For tests */ #include "walloc.h" +#include "xmalloc.h" #include "override.h" /* Must be the last header included */ @@ -65,7 +68,7 @@ enum map_magic magic; enum map_type type; union { - GHashTable *ht; + htable_t *ht; patricia_t *pt; ohash_table_t *ot; } u; @@ -87,14 +90,14 @@ * @return the new map */ map_t * -map_create_hash(GHashFunc hash_func, GEqualFunc key_eq_func) +map_create_hash(hash_fn_t hash_func, eq_fn_t key_eq_func) { map_t *m; WALLOC(m); m->magic = MAP_MAGIC; m->type = MAP_HASH; - m->u.ht = g_hash_table_new(hash_func, key_eq_func); + m->u.ht = htable_create_any(hash_func, NULL, key_eq_func); return m; } @@ -108,7 +111,7 @@ * @return the new map */ map_t * -map_create_ordered_hash(GHashFunc hash_func, GEqualFunc key_eq_func) +map_create_ordered_hash(hash_fn_t hash_func, eq_fn_t key_eq_func) { map_t *m; @@ -143,7 +146,7 @@ * Use map_release() to discard the map encapsulation. */ map_t * -map_create_from_hash(GHashTable *ht) +map_create_from_hash(htable_t *ht) { map_t *m; @@ -199,10 +202,10 @@ * Switch the implementation of an existing map to a hash table. * Returns the previous implementation. */ -gpointer -map_switch_to_hash(map_t *m, GHashTable *ht) +void * +map_switch_to_hash(map_t *m, htable_t *ht) { - gpointer implementation; + void *implementation; map_check(m); g_assert(ht); @@ -218,10 +221,10 @@ * Switch the implementation of an existing map to an ordered hash table. * Returns the previous implementation. */ -gpointer +void * map_switch_to_ordered_hash(map_t *m, ohash_table_t *ot) { - gpointer implementation; + void *implementation; map_check(m); g_assert(ot); @@ -237,10 +240,10 @@ * Switch the implementation of an existing map to a PATRICIA tree. * Returns the previous implementation. */ -gpointer +void * map_switch_to_patricia(map_t *m, patricia_t *pt) { - gpointer implementation; + void *implementation; map_check(m); g_assert(pt); @@ -256,13 +259,13 @@ * Insert a key/value pair in the map. */ void -map_insert(const map_t *m, gconstpointer key, gconstpointer value) +map_insert(const map_t *m, const void *key, const void *value) { map_check(m); switch (m->type) { case MAP_HASH: - gm_hash_table_insert_const(m->u.ht, key, value); + htable_insert_const(m->u.ht, key, value); break; case MAP_ORDERED_HASH: ohash_table_insert(m->u.ot, key, value); @@ -279,13 +282,13 @@ * Replace a key/value pair in the map. */ void -map_replace(const map_t *m, gconstpointer key, gconstpointer value) +map_replace(const map_t *m, const void *key, const void *value) { map_check(m); switch (m->type) { case MAP_HASH: - gm_hash_table_replace_const(m->u.ht, key, value); + htable_insert_const(m->u.ht, key, value); break; case MAP_ORDERED_HASH: ohash_table_replace(m->u.ot, key, value); @@ -303,14 +306,14 @@ * * @return TRUE if the key was found and removed from the map. */ -gboolean -map_remove(const map_t *m, gconstpointer key) +bool +map_remove(const map_t *m, const void *key) { map_check(m); switch (m->type) { case MAP_HASH: - return gm_hash_table_remove(m->u.ht, key); + return htable_remove(m->u.ht, key); break; case MAP_ORDERED_HASH: return ohash_table_remove(m->u.ot, key); @@ -329,14 +332,14 @@ /** * Check whether map contains the key. */ -gboolean -map_contains(const map_t *m, gconstpointer key) +bool +map_contains(const map_t *m, const void *key) { map_check(m); switch (m->type) { case MAP_HASH: - return gm_hash_table_contains(m->u.ht, key); + return htable_contains(m->u.ht, key); case MAP_ORDERED_HASH: return ohash_table_contains(m->u.ot, key); case MAP_PATRICIA: @@ -350,14 +353,14 @@ /** * Lookup a key in the map. */ -gpointer -map_lookup(const map_t *m, gconstpointer key) +void * +map_lookup(const map_t *m, const void *key) { map_check(m); switch (m->type) { case MAP_HASH: - return g_hash_table_lookup(m->u.ht, key); + return htable_lookup(m->u.ht, key); case MAP_ORDERED_HASH: return ohash_table_lookup(m->u.ot, key); case MAP_PATRICIA: @@ -378,7 +381,7 @@ switch (m->type) { case MAP_HASH: - return g_hash_table_size(m->u.ht); + return htable_count(m->u.ht); case MAP_ORDERED_HASH: return ohash_table_count(m->u.ot); case MAP_PATRICIA: @@ -392,15 +395,14 @@ /** * Extended lookup of a key in the map, returning both key/value pointers. */ -gboolean -map_lookup_extended(const map_t *m, gconstpointer key, - gpointer *okey, gpointer *oval) +bool +map_lookup_extended(const map_t *m, const void *key, void **okey, void **oval) { map_check(m); switch (m->type) { case MAP_HASH: - return g_hash_table_lookup_extended(m->u.ht, key, okey, oval); + return htable_lookup_extended(m->u.ht, key, (const void **) okey, oval); case MAP_ORDERED_HASH: return ohash_table_lookup_extended(m->u.ot, key, okey, oval); case MAP_PATRICIA: @@ -412,18 +414,48 @@ } /** + * Mark map as thread-safe. + * + * If the underlying implementation does not implement thread-safety, this + * causes a fatal error. + */ +void +map_thread_safe(const map_t *m) +{ + const char *type = NULL; + + map_check(m); + + switch (m->type) { + case MAP_HASH: + htable_thread_safe(m->u.ht); + return; + case MAP_ORDERED_HASH: + type = "ordered hash"; + break; + case MAP_PATRICIA: + type = "PATRICIA"; + break; + case MAP_MAXTYPE: + g_assert_not_reached(); + } + + s_error("%s(): %s implementation is not thread-safe yet", G_STRFUNC, type); +} + +/** * Structure used to handle foreach() trampoline for PATRICIA. */ struct pat_foreach { - map_cb_t cb; /* Registered user callback */ - gpointer u; /* User callback additional arg */ + keyval_fn_t cb; /* Registered user callback */ + void *u; /* User callback additional arg */ }; /** * foreach() trampoline for PATRICIA. */ static void -pat_foreach_wrapper(gpointer key, size_t u_keybits, gpointer value, gpointer u) +pat_foreach_wrapper(void *key, size_t u_keybits, void *value, void *u) { struct pat_foreach *ctx = u; @@ -436,14 +468,14 @@ * Iterate on each item of the map, applying callback. */ void -map_foreach(const map_t *m, map_cb_t cb, gpointer u) +map_foreach(const map_t *m, keyval_fn_t cb, void *u) { map_check(m); g_assert(cb); switch (m->type) { case MAP_HASH: - g_hash_table_foreach(m->u.ht, cb, u); + htable_foreach(m->u.ht, (ckeyval_fn_t) cb, u); break; case MAP_ORDERED_HASH: ohash_table_foreach(m->u.ot, cb, u); @@ -467,16 +499,15 @@ * Structure used to handle foreach_remove() trampoline for PATRICIA. */ struct pat_foreach_remove { - map_cbr_t cb; /* Registered user callback */ - gpointer u; /* User callback additional arg */ + keyval_rm_fn_t cb; /* Registered user callback */ + void *u; /* User callback additional arg */ }; /** * foreach() trampoline for PATRICIA. */ -static gboolean -pat_foreach_remove_wrapper( - gpointer key, size_t u_keybits, gpointer value, gpointer u) +static bool +pat_foreach_remove_wrapper(void *key, size_t u_keybits, void *value, void *u) { struct pat_foreach_remove *ctx = u; @@ -491,14 +522,14 @@ * @return the amount of items deleted. */ size_t -map_foreach_remove(const map_t *m, map_cbr_t cb, gpointer u) +map_foreach_remove(const map_t *m, keyval_rm_fn_t cb, void *u) { map_check(m); g_assert(cb); switch (m->type) { case MAP_HASH: - return g_hash_table_foreach_remove(m->u.ht, cb, u); + return htable_foreach_remove(m->u.ht, (ckeyval_rm_fn_t) cb, u); case MAP_ORDERED_HASH: return ohash_table_foreach_remove(m->u.ot, cb, u); case MAP_PATRICIA: @@ -520,7 +551,7 @@ /** * Returns the underlying map implementation. */ -gpointer +void * map_implementation(const map_t *m) { map_check(m); @@ -543,10 +574,10 @@ * Release the map encapsulation, returning the underlying implementation * object (will need to be cast back to the proper type for perusal). */ -gpointer +void * map_release(map_t *m) { - gpointer implementation; + void *implementation; map_check(m); @@ -569,7 +600,7 @@ switch (m->type) { case MAP_HASH: - gm_hash_table_destroy_null(&m->u.ht); + htable_free_null(&m->u.ht); break; case MAP_ORDERED_HASH: ohash_table_destroy_null(&m->u.ot); @@ -641,11 +672,11 @@ map_remove(m, &keysi); } -static G_GNUC_COLD double +static double G_COLD timeit( void (*f)(void *, sha1_t *, size_t), void *o, sha1_t *keys, size_t count, size_t iter, const char *what, - gboolean verbose) + bool verbose) { size_t i; tm_t start, end; @@ -659,12 +690,12 @@ if (verbose) g_debug("%s (%zu items, %zu loop%s): %F s (average: %F s)", what, - count, iter, iter == 1 ? "" : "s", elapsed, elapsed / iter); + count, iter, plural(iter), elapsed, elapsed / iter); return elapsed; } -G_GNUC_COLD void +void G_COLD map_test(void) { sha1_t *keys; @@ -675,12 +706,12 @@ struct { unsigned insertion, contains, removal; } faster = { 0, 0, 0}; - gboolean verbose = common_stats > 1; + bool verbose = common_stats > 1; if (common_stats <= 0) return; - keys = g_malloc(ITEM_COUNT * sizeof *keys); + XMALLOC_ARRAY(keys, ITEM_COUNT); for (i = 0; i < ITEM_COUNT; i++) random_bytes(keysi.data, SHA1_RAW_SIZE); @@ -760,7 +791,7 @@ g_info("PATRICIA remove was faster than hash in %d out of %d tests", faster.removal, tests); - G_FREE_NULL(keys); + XFREE_NULL(keys); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/map.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/map.h
Changed
@@ -36,49 +36,47 @@ #include "common.h" -#include "glib-missing.h" +#include "htable.h" #include "patricia.h" #include "ohash_table.h" struct map; typedef struct map map_t; -typedef void (*map_cb_t)(gpointer key, gpointer value, gpointer u); -typedef gboolean (*map_cbr_t)(gpointer key, gpointer value, gpointer u); - /** * Creation interface. */ -map_t *map_create_hash(GHashFunc hash_func, GEqualFunc key_eq_func); -map_t *map_create_ordered_hash(GHashFunc hash_func, GEqualFunc key_eq_func); +map_t *map_create_hash(hash_fn_t hash_func, eq_fn_t key_eq_func); +map_t *map_create_ordered_hash(hash_fn_t hash_func, eq_fn_t key_eq_func); map_t *map_create_patricia(size_t keybits); -map_t *map_create_from_hash(GHashTable *ht); +map_t *map_create_from_hash(htable_t *ht); map_t *map_create_from_patricia(patricia_t *pt); map_t *map_create_from_ordered_hash(ohash_table_t *ot); -gpointer map_switch_to_hash(map_t *m, GHashTable *ht); -gpointer map_switch_to_patricia(map_t *m, patricia_t *pt); -gpointer map_switch_to_ordered_hash(map_t *m, ohash_table_t *ot); +void *map_switch_to_hash(map_t *m, htable_t *ht); +void *map_switch_to_patricia(map_t *m, patricia_t *pt); +void *map_switch_to_ordered_hash(map_t *m, ohash_table_t *ot); /** * Public map interface. */ -void map_insert(const map_t *m, gconstpointer key, gconstpointer value); -void map_replace(const map_t *m, gconstpointer key, gconstpointer value); -gboolean map_remove(const map_t *m, gconstpointer key); -gpointer map_lookup(const map_t *m, gconstpointer key); -gboolean map_lookup_extended(const map_t *m, gconstpointer key, - gpointer *okey, gpointer *oval); -gboolean map_contains(const map_t *m, gconstpointer key); +void map_insert(const map_t *m, const void *key, const void *value); +void map_replace(const map_t *m, const void *key, const void *value); +bool map_remove(const map_t *m, const void *key); +void *map_lookup(const map_t *m, const void *key); +bool map_lookup_extended(const map_t *m, const void *key, + void **okey, void **oval); +bool map_contains(const map_t *m, const void *key); size_t map_count(const map_t *m); -gpointer map_implementation(const map_t *m); -gpointer map_release(map_t *m); +void *map_implementation(const map_t *m); +void *map_release(map_t *m); +void map_thread_safe(const map_t *m); void map_destroy(map_t *m); void map_destroy_null(map_t **m_ptr); -void map_foreach(const map_t *m, map_cb_t cb, gpointer u); -size_t map_foreach_remove(const map_t *m, map_cbr_t cb, gpointer u); +void map_foreach(const map_t *m, keyval_fn_t cb, void *u); +size_t map_foreach_remove(const map_t *m, keyval_rm_fn_t cb, void *u); void map_test(void);
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/mem.c
Added
@@ -0,0 +1,472 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Memory checking routines. + * + * The purpose is to verify whether a memory location / range is valid, i.e. + * that is can safely be read by the process. It does not check that the + * memory pointed at is properly allocated for usage: a pointer to a freed + * block might appear as valid because the page where it lies is still mapped + * in the process. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#include "mem.h" + +#include "fd.h" /* For is_a_fifo() */ +#include "file.h" +#include "log.h" +#include "spinlock.h" +#include "unsigned.h" +#include "vmm.h" + +#include "override.h" /* Must be the last header included */ + +typedef struct mem_pipe { + int fd2; + uint8 flags2; + const char *name; + spinlock_t lock; +} mem_pipe_t; + +/* + * Flag position within flags. + */ + +#define MEM_PIPE_WARNED 0 +#define MEM_PIPE_ENOMEM 1 + +mem_pipe_t mem_fp = { { -1, -1 }, { FALSE }, "protection", SPINLOCK_INIT }; +mem_pipe_t mem_fr = { { -1, -1 }, { FALSE }, "reading", SPINLOCK_INIT }; + +#define MEM_PIPE_LOCK(mp) spinlock_hidden(&(mp)->lock) +#define MEM_PIPE_UNLOCK(mp) spinunlock_hidden(&(mp)->lock) + +#define mem_pipe_is_locked(mp) spinlock_is_held(&(mp)->lock) + +/** + * Check whether pipe flag was set, and set it. + * + * @param mp the mem pipe + * @param idx flag index to test within the flags array + * + * @return whether flag was already set. + */ +static inline bool +mem_pipe_test_and_set(mem_pipe_t *mp, int idx) +{ + return atomic_test_and_set(&mp->flagsidx); +} + +/** + * Set pipe flag. + * + * @param mp the mem pipe + * @param idx flag index to test within the flags array + */ +static inline void +mem_pipe_set(mem_pipe_t *mp, int idx) +{ + mp->flagsidx = TRUE; +} + +/** + * Close pipe on error. + */ +static void +mem_close_pipe(mem_pipe_t *mp) +{ + g_assert(mem_pipe_is_locked(mp)); + + fd_close(&mp->fd0); + fd_close(&mp->fd1); +} + +/** + * @return whether pipe file descriptors are valid. + */ +static bool +mem_initialized_pipe(const mem_pipe_t *mp) +{ + return is_valid_fd(mp->fd0) && is_valid_fd(mp->fd1); +} + +/** + * Assert that pipe holds invalid fds. + */ +static inline void +assert_mem_pipe_is_invalid(const mem_pipe_t *mp) +{ + g_assert(!mem_initialized_pipe(mp)); +} + +/** + * Opens the pipe. + * + * @return TRUE if pipe was correctly opened. + */ +static bool +mem_open_pipe(mem_pipe_t *mp) +{ + g_assert(mem_pipe_is_locked(mp)); + assert_mem_pipe_is_invalid(mp); + + if (-1 == pipe(mp->fd) && !mem_pipe_test_and_set(mp, MEM_PIPE_WARNED)) { + s_miniwarn("%s: pipe() failed for \"%s\": %m", G_STRFUNC, mp->name); + assert_mem_pipe_is_invalid(mp); + return FALSE; + } + + /* Sanity check */ + + if (!is_a_fifo(mp->fd1)) { + s_miniwarn("%s: pipe() \"%s\" opened but writing fd #%d not a FIFO?", + G_STRFUNC, mp->name, mp->fd1); + mem_pipe_set(mp, MEM_PIPE_WARNED); + mem_close_pipe(mp); + return FALSE; + } + + /* + * Mark the pipe file descriptors as "preserved" so that they survive + * a call to fd_close_unpreserved_from() during crashes when we attempt + * to close all the unnecessary descriptors. + */ + + fd_preserve(mp->fd0); + fd_preserve(mp->fd1); + + return TRUE; /* We'll never close these file descriptors */ +} + +/** + * @return whether the two file descriptors in the pipe are indeed FIFO fds. + */ +static bool +mem_valid_pipe(const mem_pipe_t *mp) +{ + /* + * The check for is_a_fifo() is necessary because these routines may be + * called during crashes, after all file descriptors have been closed, and + * we are not notified. + * + * Any former use of these routines would therefore leave us with a stale + * file descriptor. + * + * NOTE: starting from 2015-12-30, the pipe fds are fd_preserve()'ed, + * which means they will not be closed by fd_close_unpreserved_from(). + * As such, this routine is no longer called from mem_is_valid_ptr(). + */ + + return is_a_fifo(mp->fd0) && is_a_fifo(mp->fd1); +} + +/** + * Report write error on the pipe. + * + * @param mp the pipe on which the write() failed + * @param p the address we were trying to test + * @param caller the calling routine + */ +static void +mem_pipe_write_error(mem_pipe_t *mp, const void *p, const char *caller) +{ + if (ENOMEM == errno && mem_pipe_test_and_set(mp, MEM_PIPE_ENOMEM)) + return; + + s_miniwarn("%s(): write(%u, %p, 1) to pipe failed: %m", + caller, mp->fd1, p); +} + +/** + * Is pointer valid? + * + * This routine does not take locks during normal operations. + * + * This is a costly check involving kernel operations to verify whether + * the pointer lies in the virtual address space of the process. It should + * only be used in exceptional situations, not as part of routinely executed + * assertions for instance. + * + * @return whether we can read a byte at the supplied memory location. + */ +bool +mem_is_valid_ptr(const void *p) +{ + mem_pipe_t *mp = &mem_fr; + char c; + + /* + * We do not use mem_valid_pipe() but mem_initialized_pipe() here because + * we expect the write() below to return EBADF if the file descriptor is + * invalid and also because we now fd_preserve() the file descriptors, + * meaning they will not be closed by the crash handler until we're ready + * to perform an exec(). + * --RAM, 2015-12-30 + */ + + if G_UNLIKELY(!mem_initialized_pipe(mp)) { + bool ok = TRUE; + MEM_PIPE_LOCK(mp); + if (!mem_initialized_pipe(mp)) + ok = mem_open_pipe(mp); + MEM_PIPE_UNLOCK(mp); + if (!ok) + return TRUE; /* Assume memory pointer is valid */ + } + + /* + * The write() system call will fail with EFAULT if the pointer is not + * within a valid memory region. + */ + +retry: + if (-1 == write(mp->fd1, p, 1)) { + if (EFAULT == errno) + return FALSE; + if (EPIPE == errno || EBADF == errno) { + bool ok; + /* + * We get EPIPE when fd0, the original reading end, was closed. + * We get EBADF when fd1 is invalid, probably closed. + */ + MEM_PIPE_LOCK(mp); + mem_close_pipe(mp); + ok = mem_open_pipe(mp); + MEM_PIPE_UNLOCK(mp); + if (!ok) + return TRUE; + goto retry; + } + mem_pipe_write_error(mp, p, G_STRFUNC); + return TRUE; /* Assume memory pointer is valid */ + } + + if (-1 == read(mp->fd0, &c, 1)) { + s_miniwarn("%s(): read(%u, %p, 1) from pipe failed: %m", + G_STRFUNC, mp->fd0, &c); + MEM_PIPE_LOCK(mp); + mem_close_pipe(mp); + MEM_PIPE_UNLOCK(mp); + } + + return TRUE; +} + +/** + * Probe address to determine wheher the memory is readable or writable. + * + * If a page is not readable, it is assumed to not be writable. We do not + * probe for executable pages. + * + * This is a costly check involving kernel operations to verify whether + * the pointer lies in the virtual address space of the process. It should + * only be used in exceptional situations, not as part of routinely executed + * assertions for instance. + * + * @return memory protection flags: either MEM_PROT_NONE, MEM_PROT_READ + * or MEM_PROT_READ | MEM_PROT_WRITE. + */ +int +mem_protection(const void *p) +{ + mem_pipe_t *mp = &mem_fp; + char c, o; + + MEM_PIPE_LOCK(mp); + + if G_UNLIKELY(!mem_valid_pipe(mp)) { + mem_close_pipe(mp); + if (!mem_open_pipe(mp)) { + MEM_PIPE_UNLOCK(mp); + return MEM_PROT_NONE; /* Assume memory pointer is not writable */ + } + } + + /* + * The write() system call will fail with EFAULT if the pointer is not + * within a valid memory region. + */ + +retry: + + if (-1 == write(mp->fd1, p, 1)) { + if (EFAULT == errno) { + MEM_PIPE_UNLOCK(mp);; + return MEM_PROT_NONE; /* Not readable, assume not writable */ + } + if (EPIPE == errno) { + /* fd0, the original reading end, was closed */ + mem_close_pipe(mp); + if (!mem_open_pipe(mp)) { + MEM_PIPE_UNLOCK(mp);; + return MEM_PROT_NONE; /* Assume not accessible */ + } + goto retry; + } + MEM_PIPE_UNLOCK(mp);; + mem_pipe_write_error(mp, p, G_STRFUNC); + return MEM_PROT_READ; /* Assume memory pointer is not writable */ + } + + /* + * Read back the byte we just sent to the pipe, knowing that the read() + * system call will fail with EFAULT if the pointer is not writable. + */ + + o = *(char *) p; /* For assertions, we know pointer is readable */ + + if (-1 == read(mp->fd0, deconstify_pointer(p), 1)) { + if (EFAULT == errno) { + if (-1 == read(mp->fd0, &c, 1)) { + s_miniwarn("%s: sink read(%u, %p, 1) from pipe failed: %m", + G_STRFUNC, mp->fd0, &c); + mem_close_pipe(mp); + } + } else { + s_miniwarn("%s: initial read(%u, %p, 1) from pipe failed: %m", + G_STRFUNC, mp->fd0, p); + mem_close_pipe(mp); + } + MEM_PIPE_UNLOCK(mp); + g_assert(o == *(char *) p); + return MEM_PROT_READ; /* Not writable */ + } + + MEM_PIPE_UNLOCK(mp); + g_assert(o == *(char *) p); + + return MEM_PROT_READ | MEM_PROT_WRITE; +} + +/** + * Is memory writable at the specified location? + * + * This is a costly check involving kernel operations to verify whether + * the pointer lies in the virtual address space of the process. It should + * only be used in exceptional situations, not as part of routinely executed + * assertions for instance. + * + * @return whether we can write a byte at the supplied memory location. + */ +bool +mem_is_writable(const void *p) +{ + return booleanize(mem_protection(p) & MEM_PROT_WRITE); +} + +/** + * Is memory range accessible, as determined by the predicate? + * + * @return whether all the encompassed memory pages are accessible. + */ +static bool +mem_is_accessible(const void *p, size_t len, bool (*predicate)(const void *)) +{ + const void *end = const_ptr_add_offset(p, len); + const void *page; + + g_assert(size_is_positive(len)); + + /* + * The kernel handles permissions at the page-level granularity, so if + * we can access one byte in the page, we can access the whole page. + */ + + page = vmm_page_start(p); + + do { + if (!(*predicate)(page)) + return FALSE; + page = vmm_page_next(page); + } while (ptr_cmp(page, end) < 0); + + return TRUE; +} + +/** + * Is memory range readable? + * + * This does not mean the range is allocated or is usable by the process, + * just that the memory region can be read. It can be instructions, read-only + * data, shared library data segment, etc... + * + * The check is costly as it involves system calls for each page within the + * specified memory range. It should only be used in exceptional circumstances + * and not as part of routine checks. + * + * @return whether all the encompassed memory pages are readable. + */ +bool +mem_is_valid_range(const void *p, size_t len) +{ + return mem_is_accessible(p, len, mem_is_valid_ptr); +} + +/** + * Is memory range writable? + * + * The check is costly as it involves system calls for each page within the + * specified memory range. It should only be used in exceptional circumstances + * and not as part of routine checks. + * + * @return whether all the encompassed memory pages are writable. + */ +bool +mem_is_writable_range(const void *p, size_t len) +{ + return mem_is_accessible(p, len, mem_is_writable); +} + +/** + * Ensure memory checking primitives are working properly. + */ +void +mem_test(void) +{ + static const char str = "x"; + + if (!mem_is_valid_ptr(str) || mem_is_valid_ptr(NULL)) + s_warning("%s(): cannot check whether a pointer is valid", G_STRFUNC); + + if (mem_is_writable(str) || mem_is_writable(mem_test)) + s_warning("%s(): writable memory checks may not be working", G_STRFUNC); + + if (MEM_PROT_NONE == mem_protection(str)) + s_warning("%s(): memory protection checks are not working", G_STRFUNC); + + g_assert('x' == str0); /* mem_protection() leaves memory intact */ + + if (!mem_is_valid_range(str, sizeof str)) + s_warning("%s(): memory range checks are not working", G_STRFUNC); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/mem.h
Added
@@ -0,0 +1,77 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Memory checking routines. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _mem_h_ +#define _mem_h_ + +/** + * Memory protections we know how to probe for. + */ +#define MEM_PROT_NONE 0 +#define MEM_PROT_READ (1U << 0) +#define MEM_PROT_WRITE (1U << 1) +#define MEM_PROT_RW (MEM_PROT_READ | MEM_PROT_WRITE) + +/* + * Public interface. + */ + +int mem_protection(const void *p); + +bool mem_is_valid_ptr(const void *p); +bool mem_is_valid_range(const void *p, size_t len); + +bool mem_is_writable(const void *p); +bool mem_is_writable_range(const void *p, size_t len); + +void mem_test(void); + +/* + * Convenience aliases, for symetry with mem_is_writable(). + */ + +static inline bool +mem_is_readable(const void *p) +{ + return mem_is_valid_ptr(p); +} + +static inline bool +mem_is_readable_range(const void *p, size_t len) +{ + return mem_is_valid_range(p, len); +} + +#endif /* _mem_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/mempcpy.c
Added
@@ -0,0 +1,50 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Default mempcpy() implementation. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#include "mempcpy.h" + +#ifndef HAS_MEMPCPY +/** + * A memcpy() routine returning the first destination byte beyond the copy. + */ +void * +mempcpy(void *dest, const void *src, size_t n) +{ + memcpy(dest, src, n); + return ptr_add_offset(dest, n); +} +#endif /* !HAS_MEMPCPY */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/mempcpy.h
Added
@@ -0,0 +1,45 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Default mempcpy() implementation. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _mempcpy_h_ +#define _mempcpy_h_ + +/* + * Definition of this GNU-specific routine is not always visible in system + * headers, so declare it here. + */ +void *mempcpy(void *dest, const void *src, size_t n); + +#endif /* _mempcpy_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/memusage.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/memusage.c
Changed
@@ -47,10 +47,13 @@ #include "hashtable.h" #include "log.h" #include "misc.h" -#include "str.h" +#include "mutex.h" +#include "spinlock.h" #include "stacktrace.h" +#include "str.h" #include "stringify.h" #include "unsigned.h" +#include "vsort.h" #include "xmalloc.h" #include "override.h" /* Must be the last header included */ @@ -75,22 +78,22 @@ struct memusage { enum memusage_magic magic; char *name; /**< Name for logging (xfree-able) */ - guint64 allocation_bytes; /**< Total size allocated */ - guint64 freeing_bytes; /**< Total size freed */ - guint64 prev_allocation_bytes; /**< Previous size allocated */ - guint64 prev_freeing_bytes; /**< Previous size freed */ - guint64 allocations; /**< Total amount of allocations */ - guint64 freeings; /**< Total amount of freeings */ - guint64 prev_allocations; /**< Previous amount of allocations */ - guint64 prev_freeings; /**< Previous amount of freeings */ + uint64 allocation_bytes; /**< Total size allocated */ + uint64 freeing_bytes; /**< Total size freed */ + uint64 prev_allocation_bytes; /**< Previous size allocated */ + uint64 prev_freeing_bytes; /**< Previous size freed */ + uint64 allocations; /**< Total amount of allocations */ + uint64 freeings; /**< Total amount of freeings */ + uint64 prev_allocations; /**< Previous amount of allocations */ + uint64 prev_freeings; /**< Previous amount of freeings */ size_t alloc_recursions; /**< Recursions during allocations */ size_t free_recursions; /**< Recursions during freeings */ - guint64 alloc_fast_ema; /**< EMA of allocation rate */ - guint64 alloc_medium_ema; /**< EMA of allocation rate */ - guint64 alloc_slow_ema; /**< EMA of allocation rate */ - guint64 free_fast_ema; /**< EMA of allocation rate */ - guint64 free_medium_ema; /**< EMA of allocation rate */ - guint64 free_slow_ema; /**< EMA of allocation rate */ + uint64 alloc_fast_ema; /**< EMA of allocation rate */ + uint64 alloc_medium_ema; /**< EMA of allocation rate */ + uint64 alloc_slow_ema; /**< EMA of allocation rate */ + uint64 free_fast_ema; /**< EMA of allocation rate */ + uint64 free_medium_ema; /**< EMA of allocation rate */ + uint64 free_slow_ema; /**< EMA of allocation rate */ size_t width; /**< Object width, if constant */ cperiodic_t *timer_ev; /**< EMA updater periodic event */ hash_table_t *allocs; /**< All allocations */ @@ -100,6 +103,8 @@ hash_table_t *recent_frees; /**< Recent freeings */ hash_table_t *other_frees; /**< For half-life management */ unsigned recursion; /**< Recursion detection */ + spinlock_t lock; /**< Thread-safe statistics lock */ + mutex_t tlock; /**< Thread-safe table locks */ }; static inline void @@ -118,10 +123,10 @@ */ struct memusage_counter { enum memusage_counter_magic magic; - guint64 size; /**< Total size */ - guint64 total; /**< Total events */ - guint64 periodic; /**< Events this period */ - guint64 size_periodic; /**< Size this period */ + uint64 size; /**< Total size */ + uint64 total; /**< Total events */ + uint64 periodic; /**< Events this period */ + uint64 size_periodic; /**< Size this period */ }; static inline void @@ -134,12 +139,18 @@ /** * Check whether memory usage tracker is valid. */ -gboolean +bool memusage_is_valid(const memusage_t * const mu) { return mu != NULL && MEMUSAGE_MAGIC == mu->magic; } +#define MEMUSAGE_LOCK(mu) spinlock_hidden(&(mu)->lock) +#define MEMUSAGE_UNLOCK(mu) spinunlock_hidden(&(mu)->lock) + +#define MEMUSAGE_THREAD_LOCK(mu) mutex_lock(&(mu)->tlock) +#define MEMUSAGE_THREAD_UNLOCK(mu) mutex_unlock(&(mu)->tlock) + /** * Allocate a new memusage counter. */ @@ -148,7 +159,7 @@ { struct memusage_counter *mc; - mc = xpmalloc0(sizeof *mc); + XMALLOC0(mc); mc->magic = MEMUSAGE_COUNTER_MAGIC; return mc; @@ -221,23 +232,29 @@ } \ } G_STMT_END + MEMUSAGE_THREAD_LOCK(mu); + mu->recursion++; /* Could allocate or free memory we track */ HT_SWAP(allocs); HT_SWAP(frees); mu->recursion--; + + MEMUSAGE_THREAD_UNLOCK(mu); } /** * Periodic timer to update the EMAs. */ -static G_GNUC_HOT gboolean +static bool G_HOT memusage_timer(void *data) { memusage_t *mu = data; - guint64 delta; + uint64 delta; memusage_check(mu); + MEMUSAGE_LOCK(mu); + if (0 != mu->width) { mu->allocation_bytes += mu->width * (mu->allocations - mu->prev_allocations); @@ -267,6 +284,8 @@ #undef COMPUTE + MEMUSAGE_UNLOCK(mu); + if (mu->allocs != NULL) memusage_swap(mu); @@ -289,11 +308,13 @@ g_assert(name != NULL); g_assert(size_is_non_negative(width)); - mu = xpmalloc0(sizeof *mu); + XMALLOC0(mu); mu->magic = MEMUSAGE_MAGIC; - mu->name = xpstrdup(name); + mu->name = xstrdup(name); mu->width = width; mu->timer_ev = cq_periodic_main_add(MEMUSAGE_PERIOD_MS, memusage_timer, mu); + spinlock_init(&mu->lock); + mutex_init(&mu->tlock); return mu; } @@ -337,9 +358,12 @@ { memusage_check(mu); + MEMUSAGE_THREAD_LOCK(mu); memusage_trace_free(mu); XFREE_NULL(mu->name); cq_periodic_remove(&mu->timer_ev); + spinlock_destroy(&mu->lock); + mutex_destroy(&mu->tlock); mu->magic = 0; XFREE_NULL(mu); } @@ -475,25 +499,30 @@ static inline ALWAYS_INLINE void memusage_trace_allocs(memusage_t *mu, size_t size) { + MEMUSAGE_THREAD_LOCK(mu); memusage_stacktrace(mu, size, mu->allocs, mu->recent_allocs, mu->other_allocs); + MEMUSAGE_THREAD_UNLOCK(mu); } static inline ALWAYS_INLINE void memusage_trace_frees(memusage_t *mu, size_t size) { + MEMUSAGE_THREAD_LOCK(mu); memusage_stacktrace(mu, size, mu->frees, mu->recent_frees, mu->other_frees); + MEMUSAGE_THREAD_UNLOCK(mu); } /** * Turn stackframe grabbing on/off. */ void -memusage_set_stack_accounting(memusage_t *mu, gboolean on) +memusage_set_stack_accounting(memusage_t *mu, bool on) { memusage_check(mu); + MEMUSAGE_THREAD_LOCK(mu); if (on) { if (NULL == mu->allocs) { memusage_trace_allocate(mu); @@ -503,6 +532,7 @@ memusage_trace_free(mu); } } + MEMUSAGE_THREAD_UNLOCK(mu); } struct callframe { @@ -527,7 +557,7 @@ size_t capacity; size_t count; const memusage_t *mu; - gboolean periodic; + bool periodic; }; /** @@ -568,7 +598,7 @@ * usage object is tracking variable or fix-sized objects. */ static void -memusage_sort_frames(const memusage_t *mu, gboolean periodic, +memusage_sort_frames(const memusage_t *mu, bool periodic, hash_table_t *ht, struct callframe_filler *fill) { size_t count; @@ -588,10 +618,10 @@ */ count = hash_table_size(ht); - fill->array = xmalloc(count * sizeof fill->array0); + XMALLOC_ARRAY(fill->array, count); while (hash_table_size(ht) != count) { count = hash_table_size(ht); - fill->array = xrealloc(fill->array, count * sizeof fill->array0); + XREALLOC_ARRAY(fill->array, count); } fill->capacity = count; fill->count = 0; @@ -600,7 +630,7 @@ g_assert(fill->count == fill->capacity); - qsort(fill->array, fill->count, sizeof fill->array0, callframe_cmp); + vsort(fill->array, fill->count, sizeof fill->array0, callframe_cmp); } /** @@ -625,13 +655,12 @@ size_t all_count; log_info(la, "Decreasing list of %zu %s%s for %s (%zu recursion%s):", - count, what, 1 == count ? "" : "s", name, recurses, - 1 == recurses ? "" : "s"); + count, what, plural(count), name, recurses, plural(recurses)); all_count = hash_table_size(all); - log_info(la, "Totaling %zu distinct stackrame%s", all_count, - 1 == all_count ? "" : "s"); + log_info(la, "Totaling %zu distinct stackrame%s", + all_count, plural(all_count)); event = (0 == mu->width) ? "size" : "calls"; @@ -665,6 +694,7 @@ { struct callframe_filler filler; const char *name; + memusage_t *wmu = deconstify_pointer(mu); memusage_check(mu); @@ -676,6 +706,8 @@ return; } + MEMUSAGE_THREAD_LOCK(wmu); + memusage_summary_dump_log(mu, la, 0); memusage_sort_frames(mu, TRUE, mu->recent_allocs, &filler); @@ -687,6 +719,8 @@ memusage_sorted_frame_dump_log(la, mu, name, "recent freeing", filler.array, filler.count, mu->frees, mu->free_recursions); xfree(filler.array); + + MEMUSAGE_THREAD_UNLOCK(wmu); } /*** @@ -705,13 +739,40 @@ memusage_check(mu); g_assert(0 != mu->width); + MEMUSAGE_LOCK(mu); mu->allocations++; + MEMUSAGE_UNLOCK(mu); if G_UNLIKELY(mu->allocs != NULL) memusage_trace_allocs(mu, 0); } /** + * Record batch allocation of constant-width object. + * + * No stack trace is captured, only the allocation count is updated. + * + * This is primarily used when the memusage_t object is created after some + * allocations were done and we wish to capture this to get an accurate block + * count (otherwise we could have an apparent negative count if were were to + * free some of the blocks that were allocated before the creation of the + * usage tracker). + */ +void +memusage_add_batch(memusage_t *mu, size_t count) +{ + if G_UNLIKELY(NULL == mu) + return; + + memusage_check(mu); + g_assert(0 != mu->width); + + MEMUSAGE_LOCK(mu); + mu->allocations += count; + MEMUSAGE_UNLOCK(mu); +} + +/** * Record allocation of object of specified size. */ void @@ -723,8 +784,10 @@ memusage_check(mu); g_assert(0 == mu->width); + MEMUSAGE_LOCK(mu); mu->allocations++; mu->allocation_bytes += size; + MEMUSAGE_UNLOCK(mu); if G_UNLIKELY(mu->allocs != NULL) memusage_trace_allocs(mu, size); @@ -742,13 +805,41 @@ memusage_check(mu); g_assert(0 != mu->width); + MEMUSAGE_LOCK(mu); mu->freeings++; + MEMUSAGE_UNLOCK(mu); if G_UNLIKELY(mu->frees != NULL) memusage_trace_frees(mu, 0); } /** + * Record freeing of multiple constant-width objects. + */ +void +memusage_remove_multiple(memusage_t *mu, size_t n) +{ + if G_UNLIKELY(NULL == mu) + return; + + memusage_check(mu); + g_assert(0 != mu->width); + + MEMUSAGE_LOCK(mu); + mu->freeings += n; + MEMUSAGE_UNLOCK(mu); + + if G_UNLIKELY(mu->frees != NULL) { + MEMUSAGE_THREAD_LOCK(mu); + while (n-- != 0) { + memusage_stacktrace(mu, 0, + mu->frees, mu->recent_frees, mu->other_frees); + } + MEMUSAGE_THREAD_UNLOCK(mu); + } +} + +/** * Record freeing of object of specified size. */ void @@ -760,8 +851,10 @@ memusage_check(mu); g_assert(0 == mu->width); + MEMUSAGE_LOCK(mu); mu->freeings++; mu->freeing_bytes += size; + MEMUSAGE_UNLOCK(mu); if G_UNLIKELY(mu->frees != NULL) memusage_trace_frees(mu, size); @@ -778,6 +871,7 @@ char fastSIZE_T_DEC_GRP_BUFLEN; char mediumSIZE_T_DEC_GRP_BUFLEN; char slowSIZE_T_DEC_GRP_BUFLEN; + memusage_t *wmu = deconstify_pointer(mu); memusage_check(mu); @@ -798,6 +892,8 @@ #define MSIGN(x) (mu->alloc_##x##_ema > mu->free_##x##_ema ? '+' : '-') + MEMUSAGE_THREAD_LOCK(wmu); + COMPUTE(fast); COMPUTE(medium); COMPUTE(slow); @@ -811,7 +907,7 @@ mu->alloc_recursions, mu->free_recursions, compact_size(mu->allocation_bytes - mu->freeing_bytes, FALSE)); } else { - guint64 blocks = mu->allocations - mu->freeings; + uint64 blocks = mu->allocations - mu->freeings; log_info(la, "%s(%zu bytes): " @@ -820,10 +916,11 @@ MSIGN(fast), fast, MSIGN(medium), medium, MSIGN(slow), slow, mu->alloc_recursions, mu->free_recursions, compact_size(mu->allocation_bytes - mu->freeing_bytes, FALSE), - (opt & DUMP_OPT_PRETTY) ? - size_t_to_gstring(blocks) : size_t_to_string(blocks)); + uint64_to_string_grp(blocks, 0 != (opt & DUMP_OPT_PRETTY))); } + MEMUSAGE_THREAD_UNLOCK(wmu); + #undef COMPUTE #undef MSIGN }
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/memusage.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/memusage.h
Changed
@@ -45,11 +45,13 @@ void memusage_free_null(memusage_t **mu_ptr); void memusage_add(memusage_t *mu, size_t size); void memusage_add_one(memusage_t *mu); +void memusage_add_batch(memusage_t *mu, size_t count); void memusage_remove(memusage_t *mu, size_t size); void memusage_remove_one(memusage_t *mu); -void memusage_set_stack_accounting(memusage_t *mu, gboolean on); +void memusage_remove_multiple(memusage_t *mu, size_t n); +void memusage_set_stack_accounting(memusage_t *mu, bool on); -gboolean memusage_is_valid(const memusage_t * const mu) G_GNUC_PURE; +bool memusage_is_valid(const memusage_t * const mu) G_PURE; struct logagent;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/mime_type.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/mime_type.c
Changed
@@ -145,6 +145,7 @@ { "ogm", MIME_TYPE_VIDEO_OGM }, { "ogv", MIME_TYPE_VIDEO_OGG }, { "opf", MIME_TYPE_APPLICATION_OPEN_PACKAGING_FORMAT }, + { "opus", MIME_TYPE_AUDIO_OGG }, { "patch", MIME_TYPE_TEXT_DIFF }, { "pdf", MIME_TYPE_APPLICATION_PDF }, { "pif", MIME_TYPE_APPLICATION_DOSEXEC }, @@ -197,6 +198,7 @@ { "tr", MIME_TYPE_APPLICATION_TROFF }, { "txt", MIME_TYPE_TEXT_PLAIN }, { "wav", MIME_TYPE_AUDIO_WAVE }, + { "webm", MIME_TYPE_VIDEO_WEBM }, /* Could also be audio-only! */ { "wma", MIME_TYPE_AUDIO_MS_ASF }, { "wmv", MIME_TYPE_VIDEO_MS_ASF }, { "xhtml", MIME_TYPE_TEXT_XHTML }, @@ -205,6 +207,7 @@ { "xpm", MIME_TYPE_IMAGE_XPM }, { "z", MIME_TYPE_APPLICATION_COMPRESS }, { "zip", MIME_TYPE_APPLICATION_ZIP }, + { "zoo", MIME_TYPE_APPLICATION_ZOO }, /* Above line intentionally left blank (for "!}sort" on vi) */ }; @@ -217,53 +220,81 @@ { static const char *names = { #define MIME_TYPE(id, name) name, -#include "lib/mime_types.h" +#include "mime_types.h" #undef MIME_TYPE }; size_t i; - - STATIC_ASSERT(MIME_TYPE_NUM == G_N_ELEMENTS(names)); - i = (size_t) type < G_N_ELEMENTS(names) + + STATIC_ASSERT(MIME_TYPE_NUM == N_ITEMS(names)); + i = (size_t) type < N_ITEMS(names) ? type : MIME_TYPE_APPLICATION_OCTET_STREAM; return namesi; } +/** + * Computes the MIME type to use based on the supplied file extension. + * + * @param extension the file name extension (e.g. "zip" or "html") + * + * @return the dedicated MIME type, or MIME_TYPE_APPLICATION_OCTET_STREAM when + * the extension is not recognized. + */ enum mime_type mime_type_from_extension(const char *extension) { if (extension) { #define GET_KEY(i) mime_type_map(i).extension #define FOUND(i) return mime_type_map(i).type; + BINARY_SEARCH(const char *, extension, - G_N_ELEMENTS(mime_type_map), + N_ITEMS(mime_type_map), ascii_strcasecmp, GET_KEY, FOUND); + #undef FOUND #undef GET_KEY } return MIME_TYPE_APPLICATION_OCTET_STREAM; } +/** + * Computes the MIME type to use based on the extension present in the + * file name. + * + * The extension is whatever comes after the final "." in the name. + * + * @param filename the file name + * + * @return the dedicated MIME type, or MIME_TYPE_APPLICATION_OCTET_STREAM when + * the extension is not recognized. + */ enum mime_type mime_type_from_filename(const char *filename) { const char *extension; - + g_return_val_if_fail(filename, MIME_TYPE_APPLICATION_OCTET_STREAM); extension = strrchr(filename, '.'); return mime_type_from_extension(extension ? &extension1 : NULL); } -G_GNUC_COLD void +/** + * Initialize the MIME table. + */ +void G_COLD mime_type_init(void) { size_t i; - for (i = 0; i < G_N_ELEMENTS(mime_type_map); i++) { + /* + * Ensure the MIME table is sorted. + */ + + for (i = 0; i < N_ITEMS(mime_type_map); i++) { enum mime_type ret; ret = mime_type_from_extension(mime_type_mapi.extension); if (ret != mime_type_mapi.type) { - g_error("mime_type_map is not sorted!"); + g_error("mime_type_map is not sorted!"); } } }
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/mime_type.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/mime_type.h
Changed
@@ -53,7 +53,7 @@ void mime_type_init(void); enum mime_type mime_type_from_filename(const char *); enum mime_type mime_type_from_extension(const char *); -const char *mime_type_to_string(enum mime_type) G_GNUC_PURE; +const char *mime_type_to_string(enum mime_type) G_PURE; #endif /* _lib_mime_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/mime_types.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/mime_types.h
Changed
@@ -55,6 +55,7 @@ MIME_TYPE(APPLICATION_TROFF_ME, "application/x-troff-me") MIME_TYPE(APPLICATION_TROFF_MS, "application/x-troff-ms") MIME_TYPE(APPLICATION_ZIP, "application/zip") +MIME_TYPE(APPLICATION_ZOO, "application/x-zoo") MIME_TYPE(AUDIO_BASIC, "audio/basic") MIME_TYPE(AUDIO_FLAC, "audio/flac") MIME_TYPE(AUDIO_MATROSKA, "audio/x-matroska") @@ -68,6 +69,7 @@ MIME_TYPE(AUDIO_SPEEX, "audio/speex") MIME_TYPE(AUDIO_MS_ASF, "audio/x-ms-asf") MIME_TYPE(AUDIO_WAVE, "audio/x-wav") +MIME_TYPE(AUDIO_WEBM, "audio/webm") MIME_TYPE(IMAGE_BMP, "image/bmp") MIME_TYPE(IMAGE_GIF, "image/gif") MIME_TYPE(IMAGE_JPEG, "image/jpeg") @@ -104,3 +106,4 @@ MIME_TYPE(VIDEO_OGG, "video/ogg") MIME_TYPE(VIDEO_OGM, "video/x-ogg") MIME_TYPE(VIDEO_QUICKTIME, "video/quicktime") +MIME_TYPE(VIDEO_WEBM, "video/webm")
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/mingw32.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/mingw32.c
Changed
@@ -1,5 +1,6 @@ /* - * Copyright (c) 2010, Jeroen Asselman & Raphael Manfredi + * Copyright (c) 2010 Jeroen Asselman & Raphael Manfredi + * Copyright (c) 2012, 2013-2015 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,8 +29,9 @@ * Win32 cross-compiling utility routines. * * @author Jeroen Asselman - * @author Raphael Manfredi * @date 2010 + * @author Raphael Manfredi + * @date 2010-2015 */ #include "common.h" @@ -51,6 +53,7 @@ #include <conio.h> /* For _kbhit() */ #include <imagehlp.h> /* For backtrace() emulation */ #include <iphlpapi.h> /* For GetBestRoute() */ +#include <tlhelp32.h> /* For CreateToolhelp32Snapshot() et al. */ #include <glib.h> #include <glib/gprintf.h> @@ -58,27 +61,53 @@ #include <stdio.h> #include <wchar.h> +#define THREAD_SOURCE /* we want hash_table_once_new_full_real() */ + #include "host_addr.h" /* ADNS */ -#include "adns.h" #include "ascii.h" /* For is_ascii_alpha() */ +#include "atomic.h" +#include "buf.h" +#include "compat_sleep_ms.h" +#include "constants.h" #include "cq.h" #include "crash.h" #include "debug.h" +#include "dl_util.h" +#include "dualhash.h" +#include "endian.h" #include "fd.h" /* For is_open_fd() */ -#include "glib-missing.h" +#include "getphysmemsize.h" #include "halloc.h" +#include "hashing.h" /* For string_mix_hash() */ +#include "hashtable.h" +#include "hset.h" #include "iovec.h" #include "log.h" +#include "mem.h" +#include "mempcpy.h" #include "misc.h" +#include "mutex.h" +#include "once.h" #include "path.h" /* For filepath_basename() */ #include "product.h" +#include "progname.h" +#include "pslist.h" +#include "sha1.h" +#include "signal.h" +#include "spinlock.h" +#include "spopen.h" #include "stacktrace.h" #include "str.h" #include "stringify.h" /* For ULONG_DEC_BUFLEN */ +#include "thread.h" #include "unsigned.h" #include "utf8.h" +#include "vmm.h" /* For vmm_page_start() */ +#include "vsort.h" #include "walloc.h" +#include "win32dlp.h" +#include "xmalloc.h" #include "override.h" /* Must be the last header included */ @@ -87,9 +116,14 @@ #endif #if 0 #define MINGW_STARTUP_DEBUG /**< Trace early startup stages */ +#define MINGW_STARTUP_LOGDIR "C:/cygwin/tmp" +#endif +#if 0 +#define MINGW_BACKTRACE_DEBUG /**< Trace our own backtracing */ #endif #undef signal +#undef sleep #undef stat #undef fstat @@ -103,12 +137,15 @@ #undef chdir #undef remove #undef lseek +#undef dup #undef dup2 +#undef fsync #undef unlink #undef opendir #undef readdir #undef closedir +#undef gethostname #undef getaddrinfo #undef freeaddrinfo @@ -121,13 +158,25 @@ #undef shutdown #undef getsockopt #undef setsockopt +#undef recv #undef sendto +#undef socketpair #undef abort +#undef execve +#undef statvfs -#define VMM_MINSIZE (1024*1024*100) /* At least 100 MiB */ +#undef _exit /* _exit() is the real one here */ -#define WS2_LIBRARY "ws2_32.dll" +#define VMM_MINSIZE (1024*1024*100) /* At least 100 MiB */ +#define VMM_GRANULARITY (1024*1024*4) /* 4 MiB during initalization */ +#define WS2_LIBRARY "ws2_32.dll" + +#define TM_MILLION 1000000L +#define TM_BILLION 1000000000L + +/* Offset of the UNIX Epoch compared to the Window's one, in microseconds */ +#define EPOCH_OFFSET UINT64_CONST(11644473600000000) #ifdef MINGW_SYSCALL_DEBUG #define mingw_syscall_debug() 1 @@ -136,7 +185,10 @@ #endif static HINSTANCE libws2_32; -static gboolean mingw_inited; +static once_flag_t mingw_socket_inited; +static bool mingw_vmm_inited; + +static void mingw_stdio_reset(bool console); typedef struct processor_power_information { ULONG Number; @@ -147,11 +199,68 @@ ULONG CurrentIdleState; } PROCESSOR_POWER_INFORMATION; -extern gboolean vmm_is_debugging(guint32 level); +extern bool vmm_is_debugging(uint32 level); typedef int (*WSAPoll_func_t)(WSAPOLLFD fdarray, ULONG nfds, INT timeout); WSAPoll_func_t WSAPoll = NULL; +#ifdef MINGW_STARTUP_DEBUG +static FILE *mingw_debug_lf; + +static void +getlog(bool initial) +{ + char buf128; + char *exe; + + /* + * Because this is used at startup and progstart() invokes the MINGW32 + * startup code before stripping the .exe from the tail of the program + * name, we have to do it here as well. + * + * Normal user code of getprogname() does not have to do that since upon + * return from progstart(), the returned value is correctly stripped if + * necessary. + */ + + str_bprintf(buf, sizeof buf, "%s/%s", MINGW_STARTUP_LOGDIR, getprogname()); + exe = is_strcasesuffix(buf, (size_t) -1, ".exe"); + if (exe != NULL) + *exe = '\0'; + clamp_strcat(buf, sizeof buf, "-log.txt"); + + mingw_debug_lf = fopen(buf, initial ? "wb" : "ab"); +} + +static void +closelog(void) +{ + if (mingw_debug_lf != NULL) + fclose(mingw_debug_lf); + mingw_debug_lf = NULL; +} + +#define STARTUP_DEBUG(...) G_STMT_START { \ + if (mingw_debug_lf != NULL) { \ + FILE *lf = mingw_debug_lf; \ + char tbCRASH_TIME_BUFLEN; \ + crash_time_raw(tb, sizeof tb); \ + fputs(tb, lf); \ + fputc(' ', lf); \ + fprintf(lf, __VA_ARGS__); \ + fputc('\n', lf); \ + fflush(lf); \ + } \ +} G_STMT_END + +#else /* !MINGW_STARTUP_DEBUG */ +#define getlog(x) +#define closelog() +#define STARTUP_DEBUG(...) {} +#endif /* MINGW_STARTUP_DEBUG */ + +enum pncs_magic { PNCS_MAGIC = 0x7c0e73af }; + /** * Path Name Conversion Structure. * @@ -160,10 +269,18 @@ * 256 characters. */ typedef struct pncs { - wchar_t *utf16; - wchar_t bufMAX_PATH_LEN; + enum pncs_magic magic; /* To protect pncs_dup() */ + wchar_t *utf16; /* Thread-private allocated buffer */ + size_t len; /* Path length, in wide-chars, for pncs_dup() */ } pncs_t; +static inline void +pncs_check(const pncs_t * const p) +{ + g_assert(p != NULL); + g_assert(PNCS_MAGIC == p->magic); +} + /** * Converts a NUL-terminated MBCS string to an UTF-16 string. * @note mbtowcs() is not async-signal safe. @@ -172,24 +289,30 @@ * @param dest The destination buffer. * @param dest_size The size of the destination buffer in number of elements. * - * @return NULL on failure with errno set, dest on success. + * @return -1 on failure with errno set, wide-char string length otherwize. */ -static wchar_t * +static size_t locale_to_wchar(const char *src, wchar_t *dest, size_t dest_size) { size_t n; n = mbstowcs(NULL, src, 0); - if ((size_t) -1 == n) - return NULL; + if ((size_t) -1 == n) { + s_rawwarn("%s(): illegal character sequence found in path", G_STRFUNC); + errno = EILSEQ; + return (size_t) -1; + } if (n < dest_size) { (void) mbstowcs(dest, src, dest_size); } else { - dest = NULL; + s_rawwarn("%s(): wide-char path would be %zu-character long, max=%zu", + G_STRFUNC, n, dest_size); errno = ENAMETOOLONG; + return (size_t) -1; } - return dest; + + return n; } /* @@ -214,9 +337,26 @@ static const char * get_native_path(const char *pathname, int *error) { - static char pathname_bufMAX_PATH_LEN; + buf_t *b, bs; + char *p, *pathbuf; + size_t pathsz; const char *npath = pathname; - char *p; + + STARTUP_DEBUG("%s(): pathname=%s", G_STRFUNC, pathname); + + /* + * In a signal handler, don't allocate memory. + */ + + if (signal_in_unsafe_handler()) { + static char bufMAX_PATH_LEN; + b = buf_init(&bs, buf, sizeof buf); + } else { + b = buf_private(G_STRFUNC, MAX_PATH_LEN); + } + + pathbuf = buf_data(b); + pathsz = buf_size(b); /* * Skip leading "/cygdrive/" string, up to the second "/". @@ -252,15 +392,17 @@ ) { size_t plen = strlen(npath); - if (sizeof pathname_buf <= plen) { + if (pathsz <= plen) { + s_rawwarn("%s(): path is %zu-byte long", G_STRFUNC, plen); + s_debug("%s(): given path was \"%s\"", G_STRFUNC, pathname); *error = ENAMETOOLONG; return NULL; } - clamp_strncpy(pathname_buf, sizeof pathname_buf, npath, plen); - pathname_buf0 = npath1; /* Replace with correct drive letter */ - pathname_buf1 = ':'; - npath = pathname_buf; + clamp_strncpy(pathbuf, pathsz, npath, plen); + pathbuf0 = npath1; /* Replace with correct drive letter */ + pathbuf1 = ':'; + npath = pathbuf; } return npath; @@ -282,11 +424,31 @@ } /** + * Duplicate wide-char string held in the pncs_t structure. + * + * @return new wide-char string that must be freed via hfree(). + */ +static wchar_t * +pncs_dup(const pncs_t *pncs) +{ + pncs_check(pncs); + g_assert(size_is_positive(pncs->len)); + + return hcopy(pncs->utf16, pncs->len * sizeof(wchar_t)); +} + +/** * Convert pathname to a UTF-16 representation. * * On success, the member utf16 points to the converted pathname that can be * used in Unicode-aware Windows calls. * + * @attention + * The converted pathname lies in a thread-private buffer, therefore it needs + * to be perused immediately and saved away if another routine that could use + * pncs_convert() is called. Use pncs_dup() to return a new dynamically + * allocated pathname. + * * @return 0 on success, -1 on error with errno set. */ static int @@ -294,9 +456,31 @@ { const char *npath; /* Native path */ int error; + const size_t buflen = MAX_PATH_LEN; + buf_t *b, bs; + wchar_t *pathbuf; + size_t ret; /* On Windows wchar_t should always be 16-bit and use UTF-16 encoding. */ - STATIC_ASSERT(sizeof(guint16) == sizeof(wchar_t)); + STATIC_ASSERT(sizeof(uint16) == sizeof(wchar_t)); + + ZERO(pncs); + pncs->magic = PNCS_MAGIC; /* In case they call pncs_dup() */ + + STARTUP_DEBUG("%s(): pathname=%s", G_STRFUNC, pathname); + + /* + * In a signal handler, don't allocate memory. + */ + + if (signal_in_unsafe_handler()) { + static char bufMAX_PATH_LEN * sizeof(wchar_t); + b = buf_init(&bs, buf, sizeof buf); + } else { + b = buf_private(G_STRFUNC, MAX_PATH_LEN * sizeof(wchar_t)); + } + + pathbuf = buf_data(b); if (NULL == (npath = get_native_path(pathname, &error))) { errno = error; @@ -304,24 +488,45 @@ } if (utf8_is_valid_string(npath)) { - size_t ret; - - ret = utf8_to_utf16(npath, pncs->buf, G_N_ELEMENTS(pncs->buf)); - if (ret < G_N_ELEMENTS(pncs->buf)) { - pncs->utf16 = pncs->buf; + ret = utf8_to_utf16(npath, pathbuf, buflen); + if (ret < buflen) { + pncs->utf16 = pathbuf; } else { + s_rawwarn("%s(): UFT-16 path would be %zu-character long, max=%zu", + G_STRFUNC, ret, buflen); errno = ENAMETOOLONG; pncs->utf16 = NULL; } } else { - pncs->utf16 = - locale_to_wchar(npath, pncs->buf, G_N_ELEMENTS(pncs->buf)); + ret = locale_to_wchar(npath, pathbuf, buflen); + if ((size_t) -1 == ret) + pncs->utf16 = NULL; /* errno set by locale_to_wchar() */ + } + + if G_UNLIKELY(NULL == pncs->utf16) { + s_debug("%s(): given path was \"%s\"", G_STRFUNC, pathname); + } else { + pncs->len = ret + 1; /* +1 for trailing NUL */ } return NULL != pncs->utf16 ? 0 : -1; } -static inline gboolean +static void +mingw_socket_init(void) +{ + WSADATA wsaData; + + if (WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR) + s_error("WSAStartup() failed"); + + libws2_32 = LoadLibrary(WS2_LIBRARY); + if (libws2_32 != NULL) { + WSAPoll = (WSAPoll_func_t) GetProcAddress(libws2_32, "WSAPoll"); + } +} + +static inline bool mingw_fd_is_opened(int fd) { unsigned long dummy; @@ -340,10 +545,27 @@ int error = WSAGetLastError(); int result = error; + /* + * Not all the Winsock error codes are translated here. The ones + * not conflicting with other POSIX defines have already been mapped. + * + * For instance, we have: + * + * #define ENOTSOCK WSAENOTSOCK + * + * so there is no need to catch WSAENOTSOCK here to translate it to + * ENOTSOCK since the remapping has already been done for that constant. + * + * So the ones that remain are those which are not really socket-specific + * and for which we cannot do a remapping that would conflict with other + * definitions in the MinGW headers. + */ + switch (error) { case WSAEWOULDBLOCK: result = EAGAIN; break; - case WSAEINTR: result = EINTR; break; - case WSAENOTSOCK: result = ENOTSOCK; break; + case WSAEINTR: result = EINTR; break; + case WSAEINVAL: result = EINVAL; break; + case ERROR_IO_PENDING: result = EINTR; break; } if (mingw_syscall_debug()) { @@ -361,11 +583,7 @@ static int mingw_win2posix(int error) { - static GHashTable *warned; - - if (NULL == warned) { - warned = NOT_LEAKING(g_hash_table_new(NULL, NULL)); - } + static hset_t *warned; /* * This is required when using non-POSIX routines, for instance @@ -392,16 +610,18 @@ return ENOENT; case ERROR_TOO_MANY_OPEN_FILES: return EMFILE; - case ERROR_ACCESS_DENIED: - return EPERM; case ERROR_INVALID_HANDLE: return EBADF; case ERROR_NOT_ENOUGH_MEMORY: - return ENOMEM; - case ERROR_INVALID_ACCESS: - return EPERM; + case ERROR_COMMITMENT_LIMIT: case ERROR_OUTOFMEMORY: + case ERROR_NO_SYSTEM_RESOURCES: return ENOMEM; + case ERROR_ACCESS_DENIED: + case ERROR_INVALID_ACCESS: + case ERROR_SHARING_VIOLATION: + case ERROR_LOCK_VIOLATION: + return EACCES; case ERROR_INVALID_DRIVE: return ENXIO; case ERROR_NOT_SAME_DEVICE: @@ -409,19 +629,27 @@ case ERROR_NO_MORE_FILES: return ENFILE; case ERROR_WRITE_PROTECT: + case ERROR_CANT_OPEN_ANONYMOUS: /* Can't open anonymous token */ return EPERM; case ERROR_NOT_SUPPORTED: return ENOSYS; case ERROR_DISK_FULL: return ENOSPC; case ERROR_BROKEN_PIPE: + case ERROR_NO_DATA: return EPIPE; case ERROR_INVALID_NAME: /* Invalid syntax in filename */ + case ERROR_INVALID_PARAMETER: /* Invalid function parameter */ return EINVAL; case ERROR_DIRECTORY: /* "Directory name is invalid" */ return ENOTDIR; /* Seems the closest mapping */ case WSAENOTSOCK: /* For fstat() calls */ return ENOTSOCK; + case ERROR_INVALID_ADDRESS: + case ERROR_INVALID_USER_BUFFER: + return EFAULT; + case ERROR_IO_PENDING: /* System call "interrupted" by signal */ + return EINTR; /* * The following remapped because their number is in the POSIX range */ @@ -452,10 +680,9 @@ return ENOSPC; case ERROR_WRITE_FAULT: case ERROR_READ_FAULT: + case ERROR_NOACCESS: /* Invalid access to memory location */ return EFAULT; case ERROR_GEN_FAILURE: - case ERROR_SHARING_VIOLATION: - case ERROR_LOCK_VIOLATION: case ERROR_WRONG_DISK: case ERROR_SHARING_BUFFER_EXCEEDED: return EIO; @@ -463,11 +690,32 @@ return 0; /* EOF must be treated as a read of 0 bytes */ case ERROR_HANDLE_DISK_FULL: return ENOSPC; + case ERROR_ENVVAR_NOT_FOUND: + /* Got this error writing to a closed stdio fd, opened via pipe() */ + return EBADF; + case ERROR_BAD_EXE_FORMAT: + return ENOEXEC; + case ERROR_NETNAME_DELETED: + return EHOSTUNREACH; + case ERROR_NO_TOKEN: + return ESRCH; + case 0: /* Always indicates success */ + return 0; default: - if (!gm_hash_table_contains(warned, int_to_pointer(error))) { - s_warning("Windows error code %d (%s) not remapped to a POSIX one", + if (NULL == warned) { + static spinlock_t warned_slk = SPINLOCK_INIT; + + spinlock(&warned_slk); + if (NULL == warned) { + warned = NOT_LEAKING(hset_create(HASH_KEY_SELF, 0)); + hset_thread_safe(warned); + } + spinunlock(&warned_slk); + } + if (warned != NULL && !hset_contains(warned, int_to_pointer(error))) { + hset_insert(warned, int_to_pointer(error)); + s_minicarp("Windows error code %d (%s) not remapped to a POSIX one", error, g_strerror(error)); - g_hash_table_insert(warned, int_to_pointer(error), NULL); } } @@ -478,7 +726,7 @@ * Get last Windows error, remapping Windows-specific errors into POSIX ones * and clearing the POSIX range so that strerror() works. */ -static int +int mingw_last_error(void) { int error = GetLastError(); @@ -492,12 +740,25 @@ return result; } +unsigned int +mingw_sleep(unsigned int seconds) +{ + while (seconds != 0) { + uint d = MIN(seconds, 1000); + compat_sleep_ms(d * 1000); + seconds -= d; + } + + return 0; /* Never interrupted by a signal here */ +} + static signal_handler_t mingw_sighandlerSIGNAL_COUNT; signal_handler_t mingw_signal(int signo, signal_handler_t handler) { - signal_handler_t res; + signal_handler_t old; + static spinlock_t mingw_signal_slk = SPINLOCK_INIT; g_assert(handler != SIG_ERR); @@ -506,47 +767,68 @@ return SIG_ERR; } + spinlock_hidden(&mingw_signal_slk); + + old = mingw_sighandlersigno; + mingw_sighandlersigno = handler; + + spinunlock_hidden(&mingw_signal_slk); + /* - * Don't call signal() with SIGBUS or SIGTRAP: since we're faking them, - * we'll get an error back as "unrecognized argument value". + * Don't call signal() with fake SIGBUS, SIGTRAP, SIGPIPE. + * We would get an error back as "unrecognized argument value". */ switch (signo) { - case SIGBUS: - case SIGTRAP: - res = mingw_sighandlersigno; - mingw_sighandlersigno = handler; + case SIGSEGV: + signal(signo, handler); break; default: - res = signal(signo, handler); - if (SIG_ERR != res) { - mingw_sighandlersigno = handler; - } break; } - return res; + return old; } +#define FLUSH_ERR_STR() G_STMT_START { \ + flush_err_str(); \ + if (log_stdout_is_distinct()) \ + flush_str(STDOUT_FILENO); \ +} G_STMT_END + +/** + * Sends a signal to specified thread. + */ + /** * Synthesize a fatal signal as the kernel would on an exception. */ -static G_GNUC_COLD void -mingw_sigraise(int signo) +static void G_COLD +mingw_sigraise(int signo, bool verbose) { g_assert(signo > 0 && signo < SIGNAL_COUNT); + if (verbose) + s_rawwarn("%s(): raising %s", G_STRFUNC, signal_name(signo)); + if (SIG_IGN == mingw_sighandlersigno) { /* Nothing */ } else if (SIG_DFL == mingw_sighandlersigno) { + static bool done; DECLARE_STR(3); print_str("Got uncaught "); /* 0 */ print_str(signal_name(signo)); /* 1 */ print_str(" -- crashing.\n"); /* 2 */ - flush_err_str(); - if (log_stdout_is_distinct()) - flush_str(STDOUT_FILENO); + FLUSH_ERR_STR(); + + if (!done) { + done = TRUE; + crash_print_decorated_stack(STDERR_FILENO); + if (log_stdout_is_distinct()) + crash_print_decorated_stack(STDOUT_FILENO); + } + } else { (*mingw_sighandlersigno)(signo); } @@ -562,10 +844,473 @@ void mingw_abort(void) { - mingw_sigraise(SIGABRT); + mingw_sigraise(SIGABRT, TRUE); ExitProcess(EXIT_FAILURE); } +/*** + *** Thread signal emulation. + ***/ + +static struct mingw_thread { + HANDLE h; + CONTEXT c; + DWORD pc; + uint32 sig_pending; + uint32 sig_mask; + uint stid; + bool sig_suspend; + atomic_lock_t lock; +} mingw_threadsTHREAD_MAX; + +/** + * Clear cached system handle for dead thread and reset signal information. + */ +void +mingw_gettid_reset(uint id) +{ + struct mingw_thread *mt = &mingw_threadsid; + + if (NULL != mt->h) { + mt->h = NULL; + CloseHandle(mt->h); + } + + mt->sig_pending = mt->sig_mask = 0; + mt->sig_suspend = FALSE; + mt->lock = 0; +} + +/** + * Return a system thread "ID", which needs to be cast back to a HANDLE + * to be perused by thread-specific system calls. + * + * @return the system thread ID of the current thread. + */ +systid_t +mingw_gettid(void) +{ + uint id = thread_small_id(); + struct mingw_thread *mt = &mingw_threadsid; + HANDLE p; + + if (mt->h != NULL) + return (systid_t) mt->h; + + /* + * We need to duplicate (and cache) the pseudo thread handle to get a + * real handle that represents this thread. + * + * The mingw_gettid_reset() routine is called by the thread layer when + * the old thread exits and we can dispose of the thread handle. + */ + + mt->stid = id; + p = GetCurrentProcess(); + + DuplicateHandle(p, GetCurrentThread(), p, &mt->h, + 0, FALSE, DUPLICATE_SAME_ACCESS); + + return (systid_t) mt->h; +} + +/** + * Atomically record signal in supplied memory location. + */ +static void +mingw_thread_add_sig(uint32 *dest, int signum) +{ + /* + * We merge the signal bit into the value atomically without having + * to take any lock. + */ + + for (;;) { + uint32 current, merged; + + atomic_mb(); + merged = current = *dest; + merged |= tsig_mask(signum); + + if (merged == current) + break; + + if (atomic_uint_xchg_if_eq(dest, current, merged)) + break; + } +} + +/** + * Atomically clear signal in supplied memory location. + */ +static void +mingw_thread_del_sig(uint32 *dest, int signum) +{ + /* + * We clear the signal bit within the value atomically without having + * to take any lock. + */ + + for (;;) { + uint32 current, cleared; + + atomic_mb(); + cleared = current = *dest; + cleared &= ~tsig_mask(signum); + + if (cleared == current) + break; + + if (atomic_uint_xchg_if_eq(dest, current, cleared)) + break; + } +} + +/** + * Handle pending unblocked signals for the thread. + * + * @return TRUE if we handled any signal. + */ +static bool +mingw_sig_handle(struct mingw_thread *mt) +{ + uint32 pending; + bool handled = FALSE; + + while (0 != (pending = ~mt->sig_mask & mt->sig_pending)) { + int s; + + /* + * There is no signal #0, hence bit 0 in the pending mask represents + * signal #1. That's why the loop starts with 1. + */ + + for (s = 1; pending != 0; s++, pending >>= 1) { + if (pending & 0x1) { + /* + * Before delivering the signal, we need to block further + * invocations of the very same signal, restoring it + * afterwards. + * + * Note that the sig_mask field is only handled by the + * thread hence it could be modified freely. It is being + * read by other threads though, so using atomic operations + * ensures synchronization, acting as a memory write barrier. + */ + + mingw_thread_add_sig(&mt->sig_mask, s); + mingw_thread_del_sig(&mt->sig_pending, s); + + mingw_sigraise(s, FALSE); + + mingw_thread_del_sig(&mt->sig_mask, s); + + handled = TRUE; + } + } + } + + return handled; +} + +/** + * We are magically dispatched here in the context of the thread for which + * we need to deliver signals thanks to thread context patching. + */ +static void +mingw_sig_trampoline(void) +{ + int id; + struct mingw_thread *mt; + CONTEXT ctx; + + id = thread_small_id(); + mt = &mingw_threadsid; + + g_assert(mt->lock); /* Busy! */ + + /* + * We need to take a copy of the original context on the stack since, + * before we return from the interruption, we're going to release the + * context lock in the mingw_thread structure (thereby allowing any other + * thread from superseding it to interrupt us again). + * + * Since we need to release the lock before resuming, we need to get the + * copy. Do that now before dispatching interrupts to minimize the race + * condition window (see the FIXME below). + */ + + ctx = mt->c; /* Struct copy */ + ctx.Eip = mt->pc; /* Restore original PC */ + + /* + * Dispatch all the pending signals. + */ + + mingw_sig_handle(mt); + + /* + * Time to resume to our original context. + * + * FIXME: + * We need to release the lock, because we're going to return from the + * interrupt. Unfortunately, this is not an atomic operation: if an + * interrupt is posted between the time we exited the loop above and now, + * we'll miss it! And there's no way we can retest for pending signals + * after restoring the context, because we'll be out of here. + */ + + atomic_release(&mt->lock); + + /* + * We're cheating: we restore the context in the same thread, without + * stopping its execution (we would need an external thread to do that, + * requiring us to launch that new thread...). + * + * We're not checking the return of SetThreadContext() for a good reason: + * if it succeeds, it will not return! Note the use of the pseudo handle + * for the current thread, and not mt->h. + */ + + SetThreadContext(GetCurrentThread(), &ctx); + g_assert_not_reached(); +} + +static int +mingw_thread_sig_deliver(struct mingw_thread *mt) +{ + DWORD cnt; + const char *what = NULL; + + /* + * Check whether we have unmasked pending signals to deliver. + */ + + atomic_mb(); + if (0 == (~mt->sig_mask & mt->sig_pending)) + return 0; /* Queued, will be handled later */ + + /* + * We have signals to deliver. + */ + + if (!atomic_acquire(&mt->lock)) + return 0; /* Busy with another signal dispatch */ + + /* + * If we are within a sigsuspend(), then we can notify that we were + * interrupted by a signal and therefore sigsuspend() can return. + */ + + mt->sig_suspend = FALSE; + + cnt = SuspendThread(mt->h); + + if ((DWORD) -1 == cnt) { + what = "SuspendThread"; + errno = mingw_last_error(); + goto failed; + } + + ZERO(&mt->c); + mt->c.ContextFlags = CONTEXT_FULL; + + if (!GetThreadContext(mt->h ,&mt->c)) { + what = "GetThreadContext"; + errno = mingw_last_error(); + goto failed; + } + + /* + * Patch the instruction pointer (aka. PC) to move execution to our + * signal dispatching routine. + */ + + mt->pc = mt->c.Eip; + mt->c.Eip = (DWORD) mingw_sig_trampoline; + + if (!SetThreadContext(mt->h, &mt->c)) { + what = "SetThreadContext"; + errno = mingw_last_error(); + goto failed; + } + + cnt = ResumeThread(mt->h); + + if ((DWORD) -1 == cnt) { + what = "ResumeThread"; + errno = mingw_last_error(); + goto failed; + } + + if (1 != cnt) { + g_assert(cnt != 0); /* Thread was suspended above */ + what = "ResumeThread"; + errno = EBUSY; /* Thread already suspended from elsewhere */ + goto failed; + } + + return 0; /* OK, keep the lock since context is now active! */ + +failed: + atomic_release(&mt->lock); + s_warning("%s(): %s() failed: %m ", G_STRFUNC, what); + return -1; +} + +/** + * Synchronously check for OS signals in the current thread (whose ID was + * already computed) and deliver those which are unblocked. + * + * We need this routine to periodically check for signals that could be + * missed (recorded as pending but not processed) due to an unavoidable + * race condition in mingw_sig_trampoline(). + * + * @return TRUE if we handled any signal. + */ +bool +mingw_signal_check(uint id) +{ + g_assert(id < THREAD_MAX); + + return mingw_sig_handle(&mingw_threadsid); +} + +/** + * Emulate sigprocmask(), necessary now that we support inter-thread + * "kernel" signals (i.e. interrupts). These are UNIX-like signals, + * not our thread signals implemented by thread_kill() which can only + * be delivered at specific checkpoints. + * + * Because these inter-thread signals can interrupt the processing at + * random places, the application needs to be able to block delivery of + * the signals to create critical sections. + */ +int +mingw_sigprocmask(int how, const sigset_t *set, sigset_t *oldset) +{ + int id = thread_small_id(); + struct mingw_thread *mt = &mingw_threadsid; + + if (oldset != NULL) + *oldset = mt->sig_mask; + + switch (how) { + case SIG_SETMASK: + g_assert(set != NULL); + mt->sig_mask = *set; + atomic_mb(); + goto check; + case SIG_BLOCK: + g_assert(set != NULL); + mt->sig_mask |= *set; + break; + case SIG_UNBLOCK: + g_assert(set != NULL); + mt->sig_mask &= ~*set; + goto check; + default: + errno = EINVAL; + return -1; + } + + return 0; + +check: + /* + * When unblocking signals, we need to check whether there are + * pending signals to process now, and deliver them to the thread. + */ + + return mingw_thread_sig_deliver(mt); +} + +int +mingw_sigpending(sigset_t *set) +{ + int id = thread_small_id(); + struct mingw_thread *mt = &mingw_threadsid; + + if (set != NULL) { + atomic_mb(); + *set = mt->sig_pending; + } + + return 0; +} + +int +mingw_sigsuspend(const sigset_t *mask) +{ + int id = thread_small_id(); + struct mingw_thread *mt = &mingw_threadsid; + sigset_t old; + + if (NULL == mask) { + errno = EFAULT; + return -1; + } + + atomic_mb(); + old = mt->sig_mask; + mt->sig_mask = *mask; + + /* + * Suspend the process until delivery of a signal whose action is to + * invoke a signal handler or terminate the process. + * + * If the signal is caught, return after the signal handler returns, + * restoring the signal mask to the old value. + */ + + mt->sig_suspend = TRUE; + + while (mt->sig_suspend) { + Sleep(100); /* ms */ + } + + mt->sig_mask = old; + errno = EINTR; + return -1; +} + +/** + * Send a signal to specified thread. + * + * This mimics pthread_kill() semantics on UNIX, which unfortunately is not + * supported by the Windows implementation of pthreads. + * + * @param id the thread ID (our internal small thread ID) to signal + * @param sysid the system thread ID (the thread HANDLE) + * @param signo the signal to deliver + * + * @return 0 if OK, -1 on error with errno set. + */ +int +mingw_thread_kill(uint id, systid_t sysid, int signo) +{ + struct mingw_thread *mt; + + STATIC_ASSERT(sizeof(uint32) * 8 >= SIGNAL_COUNT); + g_assert(id < N_ITEMS(mingw_threads)); + g_assert(id != thread_small_id()); /* Cannot use for current thread */ + g_assert(sysid != mingw_gettid()); /* Cannot use for current thread */ + + /* + * We have room for one context, so we just queue signals when we are + * busy handling signals in the thread. + */ + + mt = &mingw_threadsid; + + g_assert(mt->stid == id); + g_assert(mt->h == (HANDLE) sysid); + + mingw_thread_add_sig(&mt->sig_pending, signo); + + return mingw_thread_sig_deliver(mt); +} + int mingw_fcntl(int fd, int cmd, ... /* arg */ ) { @@ -603,20 +1348,33 @@ if (0 == arg->l_len) { /* Special, 0 means the whole file */ - len_high = MAX_INT_VAL(guint32); - len_low = MAX_INT_VAL(guint32); + len_high = MAX_INT_VAL(uint32); + len_low = MAX_INT_VAL(uint32); } else { - len_high = (guint64) arg->l_len >> 32; - len_low = arg->l_len & MAX_INT_VAL(guint32); + len_high = (uint64) arg->l_len >> 32; + len_low = arg->l_len & MAX_INT_VAL(uint32); } - start_high = (guint64) arg->l_start >> 32; - start_low = arg->l_start & MAX_INT_VAL(guint32); + start_high = (uint64) arg->l_start >> 32; + start_low = arg->l_start & MAX_INT_VAL(uint32); if (arg->l_type == F_WRLCK) { if (!LockFile(file, start_low, start_high, len_low, len_high)) errno = mingw_last_error(); else res = 0; + } else if (arg->l_type == F_RDLCK) { + OVERLAPPED ov; + + ZERO(&ov); + ov.Offset = start_low; + ov.OffsetHigh = start_high; + if ( + !LockFileEx(file, LOCKFILE_FAIL_IMMEDIATELY, 0, + len_low, len_high, &ov) + ) { + errno = mingw_last_error(); + } else + res = 0; } else if (arg->l_type == F_UNLCK) { if (!UnlockFile(file, start_low, start_high, len_low, len_high)) errno = mingw_last_error(); @@ -629,7 +1387,8 @@ { va_list args; int min, max; - int i; + pslist_t *opened = NULL, *l; + int error = 0; va_start(args, cmd); min = va_arg(args, int); @@ -642,27 +1401,1448 @@ return -1; } - for (i = min; i < max; i++) { - if (mingw_fd_is_opened(i)) - continue; - return mingw_dup2(fd, i); + /* + * Since we are multi-threaded, we cannot use dup2() because we + * cannot atomically select the new file descriptor, even if + * mingw_fd_is_opened() reports that the fd is currently available. + * So we need to call mingw_dup(), keeping file descriptors opened + * until we reach one above the minimum we can use. + * --RAM, 2015-11-03 + */ + + for (;;) { + res = mingw_dup(fd); + if (-1 == res) { + error = errno; + break; + } + if (res >= min) + break; + opened = pslist_prepend(opened, int_to_pointer(res)); } - errno = EMFILE; + + PSLIST_FOREACH(opened, l) { + int d = pointer_to_int(l->data); + close(d); + } + pslist_free_null(&opened); + + if (0 == error) + return res; + + errno = error; break; } default: res = -1; - errno = EINVAL; + errno = ENOSYS; break; } return res; } +#ifdef EMULATE_FSYNC +/** + * Synchronize the file's in-core data with the storage device by making sure + * all the kernel-buffered data is written. + */ +int +mingw_fsync(int fd) +{ + HANDLE h = (HANDLE) _get_osfhandle(fd); + + if G_UNLIKELY(INVALID_HANDLE_VALUE == h) { + errno = EBADF; + return -1; + } + + if (!FlushFileBuffers(h)) { + errno = mingw_last_error(); + return -1; + } + + return 0; +} +#endif /* EMULATE_FSYNC */ + +#ifdef EMULATE_GETPPID +/** + * Compute byte length of UTF-16 string, scanning up to specified max amount + * of characters (ignoring surrogates, i.e. they are counted as two chars since + * they use two 16-bit slots). + * + * @param s start of UTF-16 string + * @param maxchars maximum amout of UTF-16 entries + * + * @return byte length of string, not counting trailing NUL. + */ +static size_t +wchar_clamp_bytelen(const wchar_t *s, size_t maxchars) +{ + uint16 *p = (uint16 *) s; + size_t c = 0; + + while (*p != 0 && c < maxchars) { + p++; + c++; + } + + return ptr_diff(p, s); +} + +/** + * Find process entry matching the given PID. + * + * If we cannot find the PID, `error' is filled with the an error code if + * it is not NULL. + * + * @param pid the PID we're looking for + * @param pe the process entry we can fill-in + * @param error if not NULL, set with value of errno if we can't find the PID + * + * @return TRUE if found, FALSE if not found with error filled-in. + */ +static bool +mingw_find_process_entry(pid_t pid, PROCESSENTRY32W *pe, int *error) +{ + HANDLE h; + bool ok, found = FALSE; + + ZERO(pe); + pe->dwSize = sizeof(*pe); + if (error != NULL) + *error = 0; + + h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + + if (INVALID_HANDLE_VALUE == h) { + if (error != NULL) + *error = mingw_last_error(); + return FALSE; + } + + for (ok = Process32FirstW(h, pe); ok; ok = Process32NextW(h, pe)) { + if ((pid_t) pe->th32ProcessID == pid) { + found = TRUE; + break; + } + } + + if (!found && error != NULL) + *error = mingw_last_error(); + + CloseHandle(h); + + return found; +} + +/** + * Compute SHA1 digest of given process entry. + */ +static void +mingw_sha1_process_entry(PROCESSENTRY32W *pe, sha1_t *digest) +{ + size_t n = N_ITEMS(pe->szExeFile); + SHA1_context c; + + SHA1_reset(&c); + SHA1_INPUT(&c, pe->th32ProcessID); + SHA1_INPUT(&c, pe->th32ParentProcessID); + SHA1_input(&c, pe->szExeFile, wchar_clamp_bytelen(pe->szExeFile, n)); + SHA1_result(&c, digest); +} + +/** + * Get the ID of the parent process. + * + * @note + * This is unreliable, prone to race conditions, as the kernel could immediately + * reuse the ID of a dead process and does not actively maintain a process tree + * as on UNIX. The only way to make it more reliable is to compute our parent + * PID very early at startup, hoping the PID we find is the same process that + * launched us and not another process which took its place (very unlikely). + * + * @return the ID of the parent process, 1 meaning our parent died already. + */ +pid_t +mingw_getppid(void) +{ + static pid_t parent_pid = (pid_t) -1; + static sha1_t parent_digest; + static spinlock_t mingw_getppid_slk = SPINLOCK_INIT; + sha1_t digest; + pid_t ppid; + PROCESSENTRY32W pe; + + if ((pid_t) 1 == parent_pid) + return 1; /* Known to be orphan */ + + ppid = parent_pid; + + if ((pid_t) -1 == ppid && mingw_find_process_entry(getpid(), &pe, NULL)) + ppid = pe.th32ParentProcessID; + + if ((pid_t) -1 == ppid) + return 1; /* Can't find ourselves, assume orphaned */ + + /* + * The first time we find a parent PID, make sure it exists and if it + * does, compute the SHA1 of its process information. We will use this + * on further invocations to ensure we still have the same parent, in case + * the PID of our parent was reused. + */ + + if ((pid_t) -1 == parent_pid) { + if (-1 == mingw_process_access_check(ppid)) { + ppid = 1; /* Parent died or runs under another UID */ + } else { + if (mingw_find_process_entry(ppid, &pe, NULL)) { + mingw_sha1_process_entry(&pe, &digest); + } else { + ppid = 1; /* Parent cannot be found */ + } + } + + /* + * Record initial information, return parent PID. + */ + + spinlock_hidden(&mingw_getppid_slk); + + if ((pid_t) -1 == parent_pid) { + parent_pid = ppid; + if (ppid != (pid_t) 1) + parent_digest = digest; /* struct copy */ + } + + spinunlock_hidden(&mingw_getppid_slk); + + return ppid; + } + + /* + * Not the first time, verify that the known parent PID is still + * referring to the same process. + */ + + g_assert(ppid != (pid_t) 1); + + if (mingw_find_process_entry(ppid, &pe, NULL)) { + mingw_sha1_process_entry(&pe, &digest); + } else { + if (0 == mingw_process_access_check(ppid)) { + static bool warned; + + if (!warned) { + warned = TRUE; + s_miniwarn("%s(): assuming PID=%lu is still our parent", + G_STRFUNC, (ulong) ppid); + } + return ppid; + } + ppid = 1; /* Parent cannot be found */ + } + + spinlock(&mingw_getppid_slk); + + if ( + parent_pid != ppid || + 0 != memcmp(&parent_digest, &digest, SHA1_RAW_SIZE) + ) + parent_pid = ppid = 1; + + spinunlock(&mingw_getppid_slk); + + return ppid; +} +#endif /* EMULATE_GETPPID */ + +/** + * Count amount of backslashes that lead to a double quote '"' or to the end + * of the string. + * + * @return the amount of backslashes to escape. + */ +static size_t +mingw_backslashes_to_quote_or_end(const char *str) +{ + const char *p = str; + char c; + size_t backslashes = 0; + + g_assert(*str == '\\'); + + while ('\0' != (c = *p++)) { + if ('\\' == c) + backslashes++; + else if ('"' == c) + break; + else + return 0; /* No need to escape all these backslashes */ + } + + return backslashes; +} + +/** + * Computes the memory necessary to include the string into quotes and escape + * embedded quotes, provided there are embedded spaces or backslashes leading + * to a quote or at the end of the string. + * + * @param str the string where we want to protect embedded spaces / quotes + * + * @return 0 if no escaping is necessary (no embedded spaces or quotes), the + * size of the buffer required to hold the escaped string otherwise (including + * the trailing NUL). + */ +static size_t +mingw_quotedlen(const char *str) +{ + const char *p = str; + char c; + size_t spaces = 0, quotes = 0, backslashes = 0; + + g_assert(str != NULL); + + while ('\0' != (c = *p++)) { + if (' ' == c) + spaces++; + else if ('"' == c) + quotes++; + else if ('\\' == c) { + size_t e = mingw_backslashes_to_quote_or_end(p - 1); + + if (e != 0) { + backslashes += e; + p += e - 1; + } + } + } + + /* + * If there are spaces, we need 2 surrounding quotes, plus 1 extra + * character per quote present (to escape them with a preceding "\") + * and similarily for any backslash present before a quote. + * + * Any quote or backslash present needs also to be preserved. + */ + + if (0 == spaces && 0 == quotes && 0 == backslashes) + return 0; /* No escaping required */ + + return 2 + quotes + backslashes + ptr_diff(p, str); +} + +/** + * Escape string into supplied buffer: two surrounding quotes are added, and + * each embedded quote or backslash is escaped. + * + * @param str the string to escape + * @param dest destination buffer + * @param len length available in buffer + * + * @return a pointer to the next character following the escaped string. + */ +static char * +mingw_quotestr(const char *str, char *dest, size_t len) +{ + char *end = ptr_add_offset(dest, len); + const char *p = str; + char *q; + + g_assert(str != NULL); + g_assert(dest != NULL); + g_assert(size_is_positive(len)); + + dest0 = '"'; /* Opening quote */ + q = &dest1; + + while (q < end) { + char c = *p++; + + if ('"' == c) { + *q++ = '\\'; /* Escape following quote or backslash */ + if (q >= end) + break; + *q++ = c; + } else if ('\\' == c) { + size_t e = mingw_backslashes_to_quote_or_end(p - 1); + + if (0 == e) { + *q++ = c; /* No need to escape that backslash */ + } else { + p += e - 1; /* Skip all remaining backslashes in input */ + /* Escape all the backslashes we've seen */ + do { + *q++ = '\\'; + if (q >= end) + break; + *q++ = '\\'; + if (q >= end) + break; + } while (--e); + } + } else if ('\0' == c) { + *q++ = '"'; /* Close opening quote */ + if (q >= end) + break; + *q++ = c; /* Final NUL */ + break; + } else { + *q++ = c; + } + } + + destlen - 1 = '\0'; /* In case we jumped out of the loop above */ + + return q; +} + +/** + * Convert known valid UTF-8 string to UTF-16. + * + * @return newly allocated string via halloc(). + */ +static wchar_t * +wchar_utf16_convert(const char *s) +{ + size_t len; + wchar_t *ws; + + len = 1 + utf8_to_utf16(s, NULL, 0); /* +1 for final NULL */ + ws = halloc(len * 2); /* Each character is 2 bytes */ + utf8_to_utf16(s, ws, len); + + return ws; +} + +/** + * Convert multi-byte string to wide-char string. + * + * @return newly allocated string via halloc(), NULL on error with errno set. + */ +static wchar_t * +wchar_mbs_convert(const char *s) +{ + size_t len; + wchar_t *ws; + + len = 1 + mbstowcs(NULL, s, 0); /* +1 for final 0x00 */ + if ((size_t) -1 == len) { + errno = EILSEQ; + return NULL; + } + ws = halloc(len * 2); + mbstowcs(ws, s, len); + + return ws; +} + +/** + * Convert string to a wchar version. + * + * If the input string is UTF-8, it is converted into UTF-16. + * If the input string is not UTF-8, it is interpreted as a local string + * and converted to a wide-char string. + * + * @param s the string to convert + * @param uc if non-NULL, filled with TRUE if output is Unicode in UTF-16 + * + * @return newly allocated string via halloc(), NULL if we cannot convert it. + */ +static wchar_t * +wchar_convert(const char *s, bool *uc) +{ + wchar_t *ws; + + if (utf8_is_valid_string(s)) { + ws = wchar_utf16_convert(s); + if (uc != NULL) + *uc = TRUE; + } else { + ws = wchar_mbs_convert(s); + if (uc != NULL) + *uc = FALSE; + } + + return ws; +} + +/** + * Compare two items in a string vector. + */ +static int +strptr_cmp(const void *a, const void *b) +{ + const char * const *pa = a, * const *pb = b; + + return strcmp(*pa, *pb); +} + +/** + * The mingw_launched table is a dual-hash containing Windows process handles + * as keys and PID as values, for all the processes created via launchve(). + */ +static dualhash_t *mingw_launched; /* Launched processes */ +static once_flag_t mingw_launch_inited; + +/** + * Initialize the launched process table, once. + */ +static void +mingw_launch_init_once(void) +{ + mingw_launched = dualhash_new(NULL, pointer_eq, NULL, pointer_eq); + dualhash_thread_safe(mingw_launched); +} + +/* + * Create escpaed command-line string from argv. + * + * Just like mingw_execve(), we need to properly enclose in double-quotes + * all the arguments with embedded spaces or the constructed argv array + * will not be correct. Fortunately, we're not in an emergency situation + * here so we can freely allocate memory. + * + * The reason we have to do all this work is that the underlying interface + * that creates a new process, the CreateProcess() system call, takes + * a single command-line string that it must then parse to reconstruct + * the argv array. Whereas on UNIX systems, execve() already takes the + * argv array and does not need to do any parsing! + * + * @param argv the user-supplied argument vector for command + * + * @return allocated command string with proper argument quoting / escaping. + */ +static char * +mingw_command_line(char * const argv) +{ + char **a; + size_t i, n; + char *cmd; + + for (i = 0; NULL != argvi; i++) + /* empty */; + + n = i + 1; /* Amount of entries in argv array + final NULL */ + HALLOC0_ARRAY(a, n); + + /* + * We're going to only allocate the strings we need to quote, reusing + * the ones given on entry otherwise. This slightly complicates the + * freeing logic later on. + */ + + for (i = 0; NULL != argvi; i++) { + size_t qlen = mingw_quotedlen(argvi); + + if (0 == qlen) { + ai = argvi; /* Reuse original string */ + } else { + ai = halloc(qlen); + mingw_quotestr(argvi, ai, qlen); + } + } + + g_assert(i == n - 1); + + ai = NULL; + + /* + * Build the command line string using the quoted arguments, then + * free all the strings we had to quote and our temporary vector. + */ + + cmd = h_strjoinv(" ", a); + + for (i = 0; NULL != argvi; i++) { + if (argvi != ai) + hfree(ai); + } + + HFREE_NULL(a); + + return cmd; +} + +/* + * Build the environment buffer. + * + * Even when there is no supplied environment, we need to parse the + * process environment to be able to determine whether it uses wide chars. + * + * @param envp the optional user-supplied environment + * @param flags CreateProcess() flags updated for UTF-16 environment + * + * @return allocated environment buffer, NULL if given NULL initially. + */ +static char * +mingw_environment_block(char * const envp, int *flags) +{ + if (envp != NULL) { + size_t i, cnt, acnt = 0; + const char *mandatory = { "PATH", "SYSTEMROOT" }; + bool has_mandatoryN_ITEMS(mandatory); + char *addedN_ITEMS(mandatory); + char **e; + char *env; + + /* + * Compute size of user-supplied environment. + * + * The Windows runtime also requires that at least two environment + * variables be positionned or the child process will not startup + * properly. These are PATH and SYSTEMROOT, which we are going to + * propagate from the process environment, unless superseded. + */ + + ZERO(&has_mandatory); + + for (i = 0; NULL != envpi; i++) { + size_t j; + + for (j = 0; j < N_ITEMS(mandatory); j++) { + const char *p; + + if (has_mandatoryj) + continue; /* Variable already set */ + + p = is_strprefix(envpi, mandatoryj); + if (p != NULL && '=' == *p) { + has_mandatoryj = TRUE; + break; + } + } + } + + cnt = i; /* Amount of variables in envp vector */ + + /* + * If user-supplied environment does not list a mandatory variable, + * then propagate it from the environment of the current process. + */ + + for (i = 0; i < N_ITEMS(mandatory); i++) { + if (!has_mandatoryi) { + const char *v = getenv(mandatoryi); + + if (NULL == v) { + s_minicarp("%s(): missing mandatory \"%s\" in environment", + G_STRFUNC, mandatoryi); + } else { + addedacnt++ = h_strconcat(mandatoryi, "=", v, NULL_PTR); + } + } + } + + g_assert(acnt <= N_ITEMS(added)); + + /* + * Windows requires that environment variables be sorted. + * + * Moreover, unlike UNIX, the environment variables are + * case-insensitive. + */ + + HALLOC_ARRAY(e, acnt + cnt + 2); /* +2 for final "" and NULL */ + + for (i = 0; i < cnt; i++) { + ei = envpi; + } + for (i = 0; i < acnt; i++) { + ecnt + i = addedi; + } + + vsort(e, cnt + acnt, sizeof e0, strptr_cmp); + ecnt + acnt = ""; /* Ensures final NUL emitted in env */ + ecnt + acnt + 1 = NULL; /* End of array for h_strjoinv() */ + + env = h_strnjoinv("\0", 1, e); + + HFREE_NULL(e); + for (i = 0; i < acnt; i++) { + HFREE_NULL(addedi); + } + + return env; + } else { + extern char **environ; + bool uc = FALSE; + + /* Need to check the process environment to position Unicode flag */ + + if (environ0 != NULL) { + char *p = environ0; + char *q = strstr(p, "="); + + /* + * If there is a NUL byte before '=' or the '=' sign is indeed + * followed by a NUL, then we can safely assume this is UTF-16 + * since and ANSI version would have bytes and no NUL before the + * end of the string. + */ + + if (NULL == q || '\0' == q1) + uc = TRUE; /* Little-endian UTF-16 for '=' */ + } + + if (uc) + *flags |= CREATE_UNICODE_ENVIRONMENT; + + return NULL; + } +} + +/* + * Record the handle of the child process and its pid, making sure we do not + * close the process handle to be able to wait on the child later. + * + * @return the PID of the child process. + */ +static pid_t +mingw_record_child(PROCESS_INFORMATION *pi) +{ + HANDLE old; + dualhash_t *dh; + pid_t pid = pi->dwProcessId; + + once_flag_run(&mingw_launch_inited, mingw_launch_init_once); + + /* The main thread handle we can close as we don't need it */ + CloseHandle(pi->hThread); + + dh = mingw_launched; + + dualhash_lock(dh); + + old = dualhash_lookup_value(dh, uint_to_pointer(pid)); + + if (old != NULL) { + s_warning("%s(): had already an unwaited-for child bearing PID=%lu", + G_STRFUNC, (ulong) pid); + CloseHandle(old); + dualhash_remove_value(dh, uint_to_pointer(pid)); + } + + /* Paranoid! */ + + if (dualhash_contains_key(dh, pi->hProcess)) { + pid_t opid = pointer_to_ulong(dualhash_lookup_key(dh, pi->hProcess)); + s_warning("%s(): duplicate handle %p, was for child PID %lu", + G_STRFUNC, pi->hProcess, (ulong) opid); + dualhash_remove_key(dh, pi->hProcess); + } + + dualhash_insert_key(dh, pi->hProcess, uint_to_pointer(pid)); + + dualhash_unlock(dh); + + return pid; +} + +/** + * Create a new process. + * + * This is a low-level routine on which mingw_launchve() and mingw_execve() + * rely to perform their work. + * + * @param path the path ot the command + * @param argv the argument vector + * @param envp the environment vector (can be NULL) + * @param pi where the new process information will be stored + * @param suspended whether to create the new process in a suspended state + * + * @return 0 if OK, -1 on error with errno set. + */ +static int +mingw_create_process(const char *path, char *const argv, char *const envp, + PROCESS_INFORMATION *pi, bool suspended) +{ + STARTUPINFOW si; + pncs_t pncs; + int res, error = 0; + char *file = deconstify_pointer(path), *cmd, *env = NULL; + wchar_t *cmd_utf16 = NULL; + const char exe = ".exe"; + int32 flags = 0; + int ret = -1; + + g_assert(path != NULL); + g_assert(argv != NULL); + + ZERO(pi); + ZERO(&si); + si.cb = sizeof si; + + if (suspended) + flags |= CREATE_SUSPENDED; + + /* + * Add trailing ".exe" extension to the path if missing. + */ + + if (!is_strcasesuffix(path, (size_t) -1, exe)) + file = h_strconcat(path, exe, NULL_PTR); + + /* + * Convert the command line string into a big happy UTF-16 string. + */ + + cmd = mingw_command_line(argv); + + if (NULL == (cmd_utf16 = wchar_convert(cmd, NULL))) { + error = EILSEQ; + goto done; + } + + HFREE_NULL(cmd); + + /* + * Create environment block or check current process for UTF-16, + * updating flags as necessary. + */ + + env = mingw_environment_block(envp, &flags); + + /* + * Transform path to UTF-16. + * We use pncs_convert() to benefit from its path normalization. + */ + + if (pncs_convert(&pncs, file)) { + error = errno; + goto done; + } + + /* + * Now create the process! + */ + + res = CreateProcessW( + pncs.utf16, /* lpApplicationName */ + cmd_utf16, /* lpCommandLine */ + NULL, /* lpProcessAttributes */ + NULL, /* lpThreadAttributes */ + FALSE, /* bInheritHandles */ + flags, /* dwCreationFlags */ + env, /* lpEnvironment */ + NULL, /* lpCurrentDirectory */ + &si, /* lpStartupInfo */ + pi /* lpProcessInformation */ + ); + + if (0 == res) + error = mingw_last_error(); + else + ret = 0; /* Success! */ + + /* FALL THROUGH */ + +done: + HFREE_NULL(cmd); + HFREE_NULL(cmd_utf16); + HFREE_NULL(env); + if (file != path) + HFREE_NULL(file); + + if (error != 0) + errno = error; + + return ret; +} + +/** + * Wrapper for execve(). + */ +int +mingw_execve(const char *filename, char *const argv, char *const envp) +{ + PROCESS_INFORMATION pi; + + g_assert(filename != NULL); + g_assert(argv != NULL); + + _flushall(); + + /* + * We create the child in a suspended state so that we may close our + * stdout and stderr properly before the child starts its execution. + */ + + if (-1 == mingw_create_process(filename, argv, envp, &pi, TRUE)) + return (pid_t) -1; /* errno is already set */ + + /* + * Before exiting, cleanup our resources as we would in do__exit(). + */ + + signal_perform_cleanup(); + mingw_stdio_reset(FALSE); + + /* + * We have cleaned-up, there are no more resources we hold that could + * prevent the new process from running, so resume it. + */ + + ResumeThread(pi.hThread); /* Pray it works... */ + + /* + * We have to use _exit() to skip all the atexit() cleanups. + */ + + _exit(0); /* This is the real one, not the do__exit() call */ +} + +/** + * The Windows version of our launchve() routine. + * On UNIX, this is a simple matter of vfork() + execve()... + * + * The created child handle is stored along with the PID of the process + * in a dualhash, so that we can implement wait() later on. + * + * @return -1 on failure, the PID of the child process otherwise. + */ +pid_t +mingw_launchve(const char *path, char *const argv, char *const envp) +{ + PROCESS_INFORMATION pi; + + g_assert(path != NULL); + g_assert(argv != NULL); + + if (-1 == mingw_create_process(path, argv, envp, &pi, FALSE)) + return (pid_t) -1; /* errno is already set */ + + /* + * Good, process was created. + */ + + return mingw_record_child(&pi); +} + +/** + * Create an inheritable duplicate handle given file descriptor, closing + * and resetting the given fd if `closing' is TRUE. + */ +static HANDLE +mingw_inheritable_handle(int *fd_ptr, bool closing) +{ + int fd = *fd_ptr; + HANDLE h, i, p; + bool ok; + + g_assert(is_valid_fd(fd)); + + /* + * DuplicateHandle() cannot be used with Winsock handles! + * + * See: https://msdn.microsoft.com/en-us/ + * library/windows/desktop/ms740522(v=vs.85).aspx + */ + + g_return_val_unless(!is_a_socket(fd), (HANDLE) 0); + + p = GetCurrentProcess(); + h = (HANDLE) _get_osfhandle(fd); + ok = DuplicateHandle(p, h, p, &i, 0, TRUE, DUPLICATE_SAME_ACCESS); + if (closing) + fd_close(fd_ptr); + + if (!ok) { + errno = mingw_last_error(); + s_carp("%s(): cannot make fd #%d inheritable: %m", G_STRFUNC, fd); + return (HANDLE) 0; + } + + return i; +} + +/** + * The Windows version of our spopenve() routine. + * + * @return -1 on failure, the parent's pipe end to the child process otherwise. + */ +int +mingw_spopenve(const char *path, const char *mode, int fd2, + char *const argv, char *const envp) +{ + PROCESS_INFORMATION pi; + STARTUPINFOW si; + pncs_t pncs; + int res, pfd = -1, error = 0; + char *file = deconstify_pointer(path), *cmd = NULL, *env = NULL; + wchar_t *cmd_utf16 = NULL; + const char exe = ".exe"; + int32 flags = 0; + bool p_read = FALSE, p_write = FALSE, p_cloexec = FALSE; + pid_t pid; + int pipefd2; + int pc2; /* pc0 = parent's fd, pc1 = child's fd */ + const char *p = mode; + int c, r; + HANDLE child_end = (HANDLE) 0; + int dfd2; + + g_assert(path != NULL); + g_assert(mode != NULL); + g_assert(argv != NULL); + + ZERO(&pi); + ZERO(&si); + si.cb = sizeof si; + + /* -- much of this leading code is identical to the UNIX version -- */ + + if (NULL == fd) { + fd = dfd; + fd0 = fd1 = SPOPEN_ASIS; + } + + pc0 = pc1 = -1; + + while ((c = *p++) != '\0') { + switch (c) { + case 'r': p_read = TRUE; break; + case 'w': p_write = TRUE; break; + case 'e': p_cloexec = TRUE; break; + default: goto bad_arg; + } + } + + if (0 == (p_read ^ p_write)) { + s_carp("%s(): cannot specify both \"r\" and \"w\", mode was \"%s\"", + G_STRFUNC, mode); + goto bad_arg; + } + + if (SPOPEN_PARENT_STDOUT == fd0 || SPOPEN_CHILD_STDOUT == fd0) { + s_carp("%s(): cannot specify %d in fd0, only meaningful for fd1", + G_STRFUNC, fd0); + goto bad_arg; + } + + if (p_cloexec) { + s_carp_once("%s(): ignoring \"e\" since no close-on-exec support", + G_STRFUNC); + } + + if (-1 == mingw_pipe(pipefd)) + goto pipe_failed; + + if (p_read) { + pc0 = pipefd0; + pc1 = pipefd1; + } else { + pc0 = pipefd1; + pc1 = pipefd0; + } + + /* -- now for the Windows specific part, similar to mingw_launchve() -- */ + + /* + * Add trailing ".exe" extension to the path if missing. + */ + + if (!is_strcasesuffix(path, (size_t) -1, exe)) + file = h_strconcat(path, exe, NULL_PTR); + + /* + * Convert the command line string into a big happy UTF-16 string. + */ + + cmd = mingw_command_line(argv); + + if (NULL == (cmd_utf16 = wchar_convert(cmd, NULL))) { + error = EILSEQ; + goto done; + } + + HFREE_NULL(cmd); + + /* + * Create environment block or check current process for UTF-16, + * updating flags as necessary. + */ + + env = mingw_environment_block(envp, &flags); + + /* + * Setup appropriate child handles for stdin, stdout, stderr. + */ + + child_end = mingw_inheritable_handle(&pc1, TRUE); + if ((HANDLE) 0 == child_end) + goto pipe_failed; + + si.dwFlags |= STARTF_USESTDHANDLES; + + if (p_read) { + si.hStdOutput = child_end; + } else { + si.hStdInput = child_end; + } + + child_end = (HANDLE) 0; /* copied to `si' now */ + + /* Handle child's standard fd not contected to the pipe */ + + switch (fd0) { + case SPOPEN_ASIS: + r = p_read ? STDIN_FILENO : STDOUT_FILENO; + case SPOPEN_DEV_NULL: + r = mingw_open("/dev/null", p_read ? O_RDONLY : O_WRONLY); + if (-1 == r) + goto pipe_failed; + break; + default: + r = fd0; + break; + } + + /* Redirect stdout / stdin for the child process */ + + { + HANDLE h = mingw_inheritable_handle(&r, FALSE); + + /* + * We only have to close(r) if fd0 was a special negative SPOPEN_* + * value: otherwise, the trailing cleanup code closes all the valid + * descriptors in fd. + */ + + if (SPOPEN_DEV_NULL == fd0) + close(r); + + if ((HANDLE) 0 == h) + goto pipe_failed; + + if (p_read) { + si.hStdInput = h; + } else { + si.hStdOutput = h; + } + } + + /* Handle stderr redirections */ + + switch (fd1) { + case SPOPEN_ASIS: + r = STDERR_FILENO; + break; + case SPOPEN_PARENT_STDOUT: + r = STDOUT_FILENO; + break; + case SPOPEN_DEV_NULL: + r = mingw_open("/dev/null", p_read ? O_RDONLY : O_WRONLY); + if (-1 == r) + goto pipe_failed; + break; + case SPOPEN_CHILD_STDOUT: + { + HANDLE h, i, t; + bool ok; + + t = GetCurrentProcess(); + h = si.hStdOutput; + ok = DuplicateHandle(t, h, t, &i, 0, TRUE, DUPLICATE_SAME_ACCESS); + + if (!ok) { + error = mingw_last_error(); + s_carp("%s(): cannot duplicate stdout handle: %m", G_STRFUNC); + goto pipe_failed; + } + + si.hStdError = i; + r = -1; /* Nothing to do below, we already dup()ed stdout */ + } + break; + default: + r = fd1; + break; + } + + if (is_valid_fd(r)) { + si.hStdError = mingw_inheritable_handle(&r, FALSE); + if (SPOPEN_DEV_NULL == fd1) + close(r); + if ((HANDLE) 0 == si.hStdError) + goto pipe_failed; + } + + /* + * Transform path to UTF-16. + * We use pncs_convert() to benefit from its path normalization. + */ + + if (pncs_convert(&pncs, file)) { + error = errno; + goto done; + } + + /* + * Now create the process, inheriting standard handles we just configured. + */ + + res = CreateProcessW( + pncs.utf16, /* lpApplicationName */ + cmd_utf16, /* lpCommandLine */ + NULL, /* lpProcessAttributes */ + NULL, /* lpThreadAttributes */ + TRUE, /* bInheritHandles */ + flags, /* dwCreationFlags */ + env, /* lpEnvironment */ + NULL, /* lpCurrentDirectory */ + &si, /* lpStartupInfo */ + &pi /* lpProcessInformation */ + ); + + if (0 == res) { + error = mingw_last_error(); + goto done; + } + + /* + * Good, process was created. + */ + + pid = mingw_record_child(&pi); /* So they can waitpid() on child */ + pfd = pc0; + spopen_fd_map(pfd, pid); /* So they can spclose() on pfd */ + + goto done; + +bad_arg: + error = EINVAL; + goto done; + +pipe_failed: + error = errno; + /* FALL THROUGH */ + +done: + HFREE_NULL(cmd); + HFREE_NULL(cmd_utf16); + HFREE_NULL(env); + if (file != path) + HFREE_NULL(file); + + for (c = 0; c < 2; c++) { + if (is_valid_fd(fdc)) + close(fdc); + } + if (is_valid_fd(pc1)) close(pc1); + if ((HANDLE) 0 != si.hStdInput) CloseHandle(si.hStdInput); + if ((HANDLE) 0 != si.hStdOutput) CloseHandle(si.hStdOutput); + if ((HANDLE) 0 != si.hStdError) CloseHandle(si.hStdError); + + if (error != 0) { + if (is_valid_fd(pc0)) + close(pc0); + errno = error; + } + return pfd; +} + +static FILETIME mingw_child_kern_time, mingw_child_user_time; +static spinlock_t mingw_child_time_slk = SPINLOCK_INIT; + +#ifdef EMULATE_WAITPID +pid_t +mingw_wait(int *status) +{ + return mingw_waitpid(-1, status, 0); +} + +/** + * Add filetime from `item' into `sum'. + */ +static void +mingw_filetime_add(FILETIME *sum, FILETIME *item) +{ + DWORD old = sum->dwLowDateTime; + + sum->dwLowDateTime += item->dwLowDateTime; + sum->dwHighDateTime += item->dwHighDateTime; + + if (sum->dwLowDateTime < old) + sum->dwHighDateTime++; /* Propagate carry bit */ +} + +static void +mingw_child_account(FILETIME *kernel, FILETIME *user) +{ + spinlock(&mingw_child_time_slk); + + mingw_filetime_add(&mingw_child_kern_time, kernel); + mingw_filetime_add(&mingw_child_user_time, user); + + spinunlock(&mingw_child_time_slk); +} + +struct mingw_child_args { + HANDLE *hv; /* Handle vector */ + size_t count; /* Amount of items in vector */ + size_t pos; /* Next position to fill in vector */ +}; + +static void +mingw_child_add(const void *key, void *value, void *data) +{ + struct mingw_child_args *arg = data; + HANDLE *h = deconstify_pointer(key); + + g_assert(arg->pos < arg->count); + (void) value; + + arg->hvarg->pos++ = h; +} + +pid_t +mingw_waitpid(pid_t pid, int *status, int options) +{ + dualhash_t *dh = mingw_launched; + int ms; + ulong res; + HANDLE proc = NULL; + pid_t exiting_pid; + + if (NULL == dh || 0 == dualhash_count(dh)) + goto no_child; + + ms = (options & WNOHANG) ? 0 : INFINITE; + + if (pid > 0) { + HANDLE h = dualhash_lookup_value(dh, ulong_to_pointer(pid)); + + if (NULL == h) + goto no_child; + + thread_in_syscall_set(TRUE); + res = WaitForSingleObject(h, ms); + thread_in_syscall_set(FALSE); + + switch (res) { + case WAIT_TIMEOUT: + return 0; + case WAIT_ABANDONED: + s_warning("%s(): got WAIT_ABANDONED while waiting for PID %lu?", + G_STRFUNC, (ulong) pid); + errno = EINTR; /* Such a weird state: handle is for a process! */ + return -1; + case WAIT_OBJECT_0: + proc = h; /* This process has exited */ + break; + case WAIT_FAILED: + default: + errno = mingw_last_error(); + return -1; + } + } else { + HANDLE *hv; + size_t count; + struct mingw_child_args arg; + + dualhash_lock(dh); + + count = dualhash_count(dh); + HALLOC0_ARRAY(hv, count); + + arg.hv = hv; + arg.count = count; + arg.pos = 0; + + dualhash_foreach(dh, mingw_child_add, &arg); + dualhash_unlock(dh); + + thread_in_syscall_set(TRUE); + res = WaitForMultipleObjects(count, hv, FALSE, ms); + thread_in_syscall_set(FALSE); + + if (res < WAIT_ABANDONED_0) + proc = hvres - WAIT_OBJECT_0; /* This process has exited */ + + HFREE_NULL(hv); + + if (proc != NULL) { + goto child_exited; + } else if (WAIT_TIMEOUT == res) { + return 0; + } else { + if (WAIT_FAILED == UNSIGNED(res)) { + errno = mingw_last_error(); + } else { + s_warning("%s(): got WAIT_ABANDONED while waiting for children", + G_STRFUNC); + errno = EINTR; + } + return -1; + } + } + +child_exited: + + g_assert(proc != NULL); /* This process has exited */ + + dualhash_lock(dh); + + exiting_pid = pointer_to_ulong(dualhash_lookup_key(dh, proc)); + dualhash_remove_key(dh, proc); + + dualhash_unlock(dh); + + g_soft_assert_log(0 != exiting_pid, + "%s(): handle %p is no longer associated to any PID?", + G_STRFUNC, proc); + + /* + * Grab the exit status, regardless of whether our caller wants it. + */ + + { + DWORD code; + if (!GetExitCodeProcess(proc, &code)) { + errno = mingw_last_error(); + s_warning("%s(): could not get exit status of PID %lu: %m", + G_STRFUNC, (ulong) exiting_pid); + code = 0; + } + if (status != NULL) + *status = code; + } + + /* + * Get child resource usage, for getrusage(RUSAGE_CHILDREN) calls. + */ + + { + FILETIME creation_time, exit_time, kernel_time, user_time; + + if ( + !GetProcessTimes(proc, + &creation_time, &exit_time, &kernel_time, &user_time) + ) { + errno = mingw_last_error(); + s_warning("%s(): could not get resource usage for PID %lu: %m", + G_STRFUNC, (ulong) exiting_pid); + } else { + mingw_child_account(&kernel_time, &user_time); + } + } + + CloseHandle(proc); + return exiting_pid; + +no_child: + errno = ECHILD; + return -1; +} +#endif /* EMULATE_WAITPID */ + /** * Is WSAPoll() supported? */ -gboolean +bool mingw_has_wsapoll(void) { /* @@ -690,50 +2870,209 @@ errno = WSAEOPNOTSUPP; return -1; } + res = WSAPoll(fds, nfds, timeout); + if (SOCKET_ERROR == res) errno = mingw_wsa_last_error(); + return res; } +/** + * Get special folder path as a UTF-8 string. + * + * @param which which special folder to get (CSIDL code) + * @param what English description of ``which'', for error logging. + * + * @return read-only constant string. + */ +static const char * +get_special(int which, char *what) +{ + static spinlock_t special_slk = SPINLOCK_INIT; + static wchar_t pathnameMAX_PATH; + static char utf8_pathMAX_PATH; + int ret; + const char *result; + + spinlock_hidden(&special_slk); /* Protect access to static vars */ + + ret = SHGetFolderPathW(NULL, which, NULL, 0, pathname); + + if (E_INVALIDARG != ret) { + size_t conv = utf16_to_utf8(pathname, utf8_path, sizeof utf8_path); + if (conv > sizeof utf8_path) { + s_warning("cannot convert %s path from UTF-16 to UTF-8", what); + ret = E_INVALIDARG; + } + } + + if (E_INVALIDARG == ret) { + s_carp("%s: could not get the %s directory", G_STRFUNC, what); + /* ASCII is valid UTF-8 */ + g_strlcpy(utf8_path, G_DIR_SEPARATOR_S, sizeof utf8_path); + } + + result = constant_str(utf8_path); + + spinunlock_hidden(&special_slk); + + return result; +} + const char * -mingw_gethome(void) +mingw_get_home_path(void) { - static char pathnameMAX_PATH; + static const char *result; - if ('\0' == pathname0) { - int ret; + if G_UNLIKELY(NULL == result) + result = get_special(CSIDL_LOCAL_APPDATA, "home"); - /* FIXME: Unicode */ - ret = SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, pathname); + return result; +} - if (E_INVALIDARG == ret) { - s_warning("could not determine home directory"); - g_strlcpy(pathname, "/", sizeof pathname); - } - } +const char * +mingw_get_personal_path(void) +{ + static const char *result; - return pathname; + if G_UNLIKELY(NULL == result) + result = get_special(CSIDL_PERSONAL, "My Documents"); + + return result; } const char * -mingw_getpersonal(void) +mingw_get_common_docs_path(void) { - static char pathnameMAX_PATH; + static const char *result; - if ('\0' == pathname0) { - int ret; + if G_UNLIKELY(NULL == result) + result = get_special(CSIDL_COMMON_DOCUMENTS, "Common Documents"); - /* FIXME: Unicode */ - ret = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, 0, pathname); + return result; +} - if (E_INVALIDARG == ret) { - s_warning("could not determine personal document directory"); - g_strlcpy(pathname, "/", sizeof pathname); - } - } +const char * +mingw_get_common_appdata_path(void) +{ + static const char *result; - return pathname; + if G_UNLIKELY(NULL == result) + result = get_special(CSIDL_COMMON_APPDATA, "Common Application Data"); + + return result; +} + +const char * +mingw_get_admin_tools_path(void) +{ + static const char *result; + + if G_UNLIKELY(NULL == result) + result = get_special(CSIDL_ADMINTOOLS, "Admin Tools"); + + return result; +} + +const char * +mingw_get_windows_path(void) +{ + static const char *result; + + if G_UNLIKELY(NULL == result) + result = get_special(CSIDL_WINDOWS, "Windows"); + + return result; +} + +const char * +mingw_get_system_path(void) +{ + static const char *result; + + if G_UNLIKELY(NULL == result) + result = get_special(CSIDL_SYSTEM, "system"); + + return result; +} + +const char * +mingw_get_internet_cache_path(void) +{ + static const char *result; + + if G_UNLIKELY(NULL == result) + result = get_special(CSIDL_INTERNET_CACHE, "Internet Cache"); + + return result; +} + +const char * +mingw_get_mypictures_path(void) +{ + static const char *result; + + if G_UNLIKELY(NULL == result) + result = get_special(CSIDL_MYPICTURES, "My Pictures"); + + return result; +} + +const char * +mingw_get_program_files_path(void) +{ + static const char *result; + + if G_UNLIKELY(NULL == result) + result = get_special(CSIDL_PROGRAM_FILES, "Program Files"); + + return result; +} + +const char * +mingw_get_fonts_path(void) +{ + static const char *result; + + if G_UNLIKELY(NULL == result) + result = get_special(CSIDL_FONTS, "Font"); + + return result; +} + +const char * +mingw_get_startup_path(void) +{ + static const char *result; + + if G_UNLIKELY(NULL == result) + result = get_special(CSIDL_STARTUP, "Startup"); + + return result; +} + +const char * +mingw_get_history_path(void) +{ + static const char *result; + + if G_UNLIKELY(NULL == result) + result = get_special(CSIDL_HISTORY, "History"); + + return result; +} + +const char * +mingw_get_cookies_path(void) +{ + static const char *result; + + if G_UNLIKELY(NULL == result) + result = get_special(CSIDL_COOKIES, "Cookies"); + + return result; } /** @@ -751,24 +3090,24 @@ static const char * mingw_build_personal_path(const char *file, char *dest, size_t size) { - const char *personal = mingw_getpersonal(); + const char *personal; + + personal = mingw_get_personal_path(); g_strlcpy(dest, personal, size); + STARTUP_DEBUG("%s(): #1 dest=%s", G_STRFUNC, dest); + if (path_does_not_exist(personal)) goto fallback; clamp_strcat(dest, size, G_DIR_SEPARATOR_S); - clamp_strcat(dest, size, product_get_name()); + clamp_strcat(dest, size, product_name()); - /* - * Can't use mingw_mkdir() as we can't allocate memory here. - * Use raw mkdir() but this won't work if there are non-ASCII chars - * in the path. - */ + STARTUP_DEBUG("%s(): #2 dest=%s", G_STRFUNC, dest); if (path_does_not_exist(dest)) - mkdir(dest); + mingw_mkdir(dest, S_IRUSR | S_IWUSR | S_IXUSR); clamp_strcat(dest, size, G_DIR_SEPARATOR_S); clamp_strcat(dest, size, file); @@ -776,38 +3115,60 @@ if (0 != strcmp(filepath_basename(dest), file)) goto fallback; + STARTUP_DEBUG("%s(): returning dest=%s", G_STRFUNC, dest); + return dest; fallback: g_strlcpy(dest, G_DIR_SEPARATOR_S, size); clamp_strcat(dest, size, file); + STARTUP_DEBUG("%s(): returning fallback dest=%s", G_STRFUNC, dest); return dest; } /** * Return default stdout logfile when launched from the GUI. * Directories leading to the dirname of the result are created as needed. - * This routine does not allocate any memory. */ static const char * mingw_getstdout_path(void) { static char pathnameMAX_PATH; + char buf128; + + str_bprintf(buf, sizeof buf, "%s.stdout", product_nickname()); - return mingw_build_personal_path("gtkg.stdout", pathname, sizeof pathname); + return mingw_build_personal_path(buf, pathname, sizeof pathname); } /** * Return default stderr logfile when launched from the GUI. * Directories leading to the dirname of the result are created as needed. - * This routine does not allocate any memory. */ static const char * mingw_getstderr_path(void) { static char pathnameMAX_PATH; + char buf128; + + str_bprintf(buf, sizeof buf, "%s.stderr", product_nickname()); + + return mingw_build_personal_path(buf, pathname, sizeof pathname); +} + +/** + * Return default supervisor logfile when launched from the GUI. + * Directories leading to the dirname of the result are created as needed. + */ +const char * +mingw_get_supervisor_log_path(void) +{ + static char pathnameMAX_PATH; + char buf128; + + str_bprintf(buf, sizeof buf, "%s.super", product_nickname()); - return mingw_build_personal_path("gtkg.stderr", pathname, sizeof pathname); + return mingw_build_personal_path(buf, pathname, sizeof pathname); } /** @@ -822,14 +3183,14 @@ char * mingw_patch_personal_path(const char *pathname) { - const char *home = mingw_gethome(); + const char *home = mingw_get_home_path(); const char *p; p = is_strprefix(pathname, home); if (p != NULL && !is_directory(pathname)) { char *patched; if (is_strsuffix(pathname, -1, "gtk-gnutella-downloads/complete")) { - /* + /* * Put the gtk-gnutella-downloads/complete into the downloads folder * as this is where the user would expect completed downloads to be * be placed @@ -844,8 +3205,8 @@ * running from the GUI. */ - patched = h_strconcat(mingw_getpersonal(), - G_DIR_SEPARATOR_S, product_get_name(), p, (void *) 0); + patched = h_strconcat(mingw_get_personal_path(), + G_DIR_SEPARATOR_S, product_name(), p, NULL_PTR); } s_debug("patched \"%s\" into \"%s\"", pathname, patched); return patched; @@ -854,7 +3215,7 @@ } } -guint64 +uint64 mingw_getphysmemsize(void) { MEMORYSTATUSEX memStatus; @@ -871,7 +3232,36 @@ int mingw_getdtablesize(void) { - return _getmaxstdio(); + /* + * Traditionally, on Windows, the stdio layer can only fopen() 512 files, + * but the low-level I/O layer on top of which it is built can open() + * up to 2048 files. + * + * An application can use _setmaxstdio() to increase the amount of files + * we can fopen(), up to the maximum of 2048. + * + * See: https://msdn.microsoft.com/en-us/library/6e3b887c(v=vs.140).aspx + * + * For our purpose here, we're attempting to return a number that + * quantifies how many "file descriptors" we can have, knowing that we + * do not count sockets in the mix, whereas the UNIX version of + * getdtablesize() does include sockets since they are identified as + * file descriptors. + * + * Hence calling _getmaxstdio() is meaningless. We know there are going + * to be sockets used, but we do not know exactly how many compared to + * files, since that is application-specific. + * + * Therefore, hardwire 2048, which is a known C runtime maximum and does + * not represent the maximum number of Windows HANDLE we can open, which + * is far larger, but represents the maximum amount of files we're going + * to be able to manage with file descriptors: the size of the table + * mapping a fd to its HANDLE. + * + * --RAM, 2016-02-21 + */ + + return 2048; } int @@ -893,6 +3283,22 @@ } int +mingw_rmdir(const char *pathname) +{ + int res; + pncs_t pncs; + + if (pncs_convert(&pncs, pathname)) + return -1; + + res = _wrmdir(pncs.utf16); + if (-1 == res) + errno = mingw_last_error(); + + return res; +} + +int mingw_access(const char *pathname, int mode) { int res; @@ -943,8 +3349,26 @@ int mingw_pipe(int fd2) { + int res; + + /* + * We force O_NOINHERIT on the pipe handles because if a pipe is created + * and passed to children processes, the side of the pipe that remains + * in the parent process must not be seen by the child. + * + * Failure to specify this flag causes spopen() to mis-behave on Windows + * when fd0 is given a pipe end, for instance. So the policy must be + * that hanldes cannot be inherited and those that we want to pass to + * a child process are explicly duplicated via mingw_inheritable_handle(). + * --RAM, 2015-11-04. + */ + /* Buffer size of 8192 is arbitrary */ - return _pipe(fd, 8192, _O_BINARY); + res = _pipe(fd, 8192, O_BINARY | O_NOINHERIT); + if (-1 == res) + errno = mingw_last_error(); + + return res; } int @@ -952,14 +3376,58 @@ { pncs_t pncs; int res; - + if (pncs_convert(&pncs, pathname)) return -1; res = _wstati64(pncs.utf16, buf); - if (-1 == res) + if (-1 == res) { errno = mingw_last_error(); + /* + * If there is a trailing '/' in the pathname, this will perturb + * stat() and we'll get ENOENT. Likewise for a trailing "/." so + * if "/usr" exists, "/usr/" and "/usr/." will fail, but "/usr/.." + * will work. On UNIX, the first two are strictly equivalent. + * --RAM, 2015-04-19 + */ + + if (ENOENT == errno) { + size_t len = strlen(pathname); + const char *p = &pathnamelen - 1; + + if (len <= 1) + goto nofix; /* A simple "/" would have worked */ + + if ('/' == *p) + len--; + else if ('.' == *p && '/' == p-1) + len -= 2; + else + goto nofix; + + /* + * In a signal handler, don't allocate memory. + */ + + if (signal_in_unsafe_handler()) { + static char pathMAX_PATH_LEN; + + clamp_strncpy(path, sizeof path, pathname, len); + if (0 == pncs_convert(&pncs, path)) + res = _wstati64(pncs.utf16, buf); + } else { + char *fixed; + + fixed = h_strndup(pathname, len); + if (0 == pncs_convert(&pncs, fixed)) + res = _wstati64(pncs.utf16, buf); + hfree(fixed); + } + } + } + +nofix: return res; } @@ -967,7 +3435,7 @@ mingw_fstat(int fd, filestat_t *buf) { int res; - + res = _fstati64(fd, buf); if (-1 == res) errno = mingw_last_error(); @@ -980,7 +3448,7 @@ { pncs_t pncs; int res; - + if (pncs_convert(&pncs, pathname)) return -1; @@ -992,10 +3460,19 @@ } int +mingw_dup(int fd) +{ + int res = _dup(fd); + if (-1 == res) + errno = mingw_last_error(); + return res; +} + +int mingw_dup2(int oldfd, int newfd) { int res; - + if (oldfd == newfd) { /* Windows does not like dup2(fd, fd) */ if (is_open_fd(oldfd)) @@ -1028,6 +3505,9 @@ va_end(args); } + if (0 == strcmp(pathname, "/dev/null")) + pathname = "NUL"; + if (pncs_convert(&pncs, pathname)) return -1; @@ -1038,7 +3518,7 @@ return res; } -void * +DIR * mingw_opendir(const char *pathname) { _WDIR *res; @@ -1051,26 +3531,36 @@ if (NULL == res) errno = mingw_last_error(); - return res; + return (DIR *) res; } -void * -mingw_readdir(void *dir) +struct dirent * +mingw_readdir(DIR *dir) { struct _wdirent *res; + int saved_errno = errno; - res = _wreaddir(dir); + /* + * Do not perturb errno in this routine unless it changes. + * The MinGW runtime implementation of _wreaddir() will make sure + * errno is left untouched when we end up reaching the end of the + * directory. + * --RAM, 2015-04-19 + */ + + res = _wreaddir((_WDIR *) dir); if (NULL == res) { - errno = mingw_last_error(); + if (errno != saved_errno) + errno = mingw_last_error(); return NULL; } - return res; + return (struct dirent *) res; } int -mingw_closedir(void *dir) +mingw_closedir(DIR *dir) { - int res = _wclosedir(dir); + int res = _wclosedir((_WDIR *) dir); if (-1 == res) errno = mingw_last_error(); return 0; @@ -1079,20 +3569,28 @@ /** * @note The returned UTF-8 string becomes invalid after the next * call to dir_entry_filename(). - * In order to avoid a memory leak, you may pass NULL as - * parameter to free the memory. */ const char * dir_entry_filename(const void *dirent) { const struct _wdirent *wdirent = dirent; - static char *filename; - HFREE_NULL(filename); - if (NULL != wdirent) { - filename = utf16_to_utf8_string(wdirent->d_name); - } - return filename; + g_assert(dirent != NULL); + + return h_private(G_STRFUNC, utf16_to_utf8_string(wdirent->d_name)); +} + +/** + * @return the byte length of the directory entry filename, converted to UTF-8. + */ +size_t +dir_entry_namelen(const void *dirent) +{ + const struct _wdirent *wdirent = dirent; + + g_assert(dirent != NULL); + + return utf16_to_utf8(wdirent->d_name, NULL, 0); } fileoffset_t @@ -1111,7 +3609,7 @@ res = read(fd, buf, MIN(count, UINT_MAX)); g_assert(-1 == res || (res >= 0 && UNSIGNED(res) <= count)); - + if (-1 == res) errno = mingw_last_error(); return res; @@ -1127,7 +3625,7 @@ */ int i; ssize_t total_read = 0, r = -1; - + for (i = 0; i < iov_cnt; i++) { r = mingw_read(fd, iovec_base(&iovi), iovec_len(&iovi)); @@ -1149,10 +3647,50 @@ ssize_t mingw_write(int fd, const void *buf, size_t count) { - ssize_t res = write(fd, buf, MIN(count, UINT_MAX)); - if (-1 == res) + HANDLE h = (HANDLE) _get_osfhandle(fd); + DWORD written; + + /* + * Apparently, on Win 7 (but not on XP and I do not know what + * happens on later version after 7), the C runtime causes write() + * to return ENOTSOCK on ERROR_NOACCESS, which should really + * be translated to EFAULT. Experiments calling WriteFile() + * directly show that it is write() which incorrectly remaps the + * error code, not WriteFile() that returns a different code. + * + * Hence we now provide our own implementation on top of the Windows + * API, without calling write(), to ensure proper errno setting. + * --RAM, 2016-02-16 + */ + + if G_UNLIKELY(INVALID_HANDLE_VALUE == h) { + errno = EBADF; + return -1; + } + + if (!WriteFile(h, buf, MIN(count, UINT_MAX), &written, NULL)) { errno = mingw_last_error(); - return res; + written = (ssize_t) -1; + + if G_UNLIKELY(EPIPE == errno) { + /* + * If we get EPIPE back, see whether there is a signal handler + * installed for SIGPIPE and raise the signal if there is. + * When there is no signal handler (still set to SIG_DFL), + * SIGPIPE is fatal -- this is done to mimic UNIX semantics. + * --RAM, 2015-11-13 + */ + + if (SIG_DFL == mingw_sighandlerSIGPIPE) { + s_error("%s(): write to fd #%d caused SIGPIPE", + G_STRFUNC, fd); + } else if (SIG_IGN != mingw_sighandlerSIGPIPE) { + mingw_sigraise(SIGPIPE, FALSE); + } + } + } + + return written; } ssize_t @@ -1182,8 +3720,7 @@ for (i = 0; i < iov_cnt; i++) { size_t n = iovec_len(&iovi); - memcpy(p, iovec_base(&iovi), n); - p += n; + p = mempcpy(p, iovec_base(&iovi), n); } g_assert(ptr_diff(p, gather) <= sizeof gather); @@ -1235,24 +3772,49 @@ /*** *** Socket wrappers ***/ - -int + +int mingw_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) { - int res = select(nfds, readfds, writefds, exceptfds, timeout); - + int res; + + ONCE_FLAG_RUN(mingw_socket_inited, mingw_socket_init); + + res = select(nfds, readfds, writefds, exceptfds, timeout); + if (res < 0) errno = mingw_wsa_last_error(); - + return res; } int +mingw_gethostname(char *name, size_t len) +{ + int result; + + /* Initialize the socket layer */ + ONCE_FLAG_RUN(mingw_socket_inited, mingw_socket_init); + + result = gethostname(name, len); + + if (result != 0) + errno = mingw_wsa_last_error(); + return result; +} + +int mingw_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res) { - int result = getaddrinfo(node, service, hints, res); + int result; + + /* Initialize the socket layer */ + ONCE_FLAG_RUN(mingw_socket_inited, mingw_socket_init); + + result = getaddrinfo(node, service, hints, res); + if (result != 0) errno = mingw_wsa_last_error(); return result; @@ -1270,8 +3832,7 @@ socket_fd_t res; /* Initialize the socket layer */ - if G_UNLIKELY(!mingw_inited) - mingw_init(); + ONCE_FLAG_RUN(mingw_socket_inited, mingw_socket_init); /* * Use WSASocket() to avoid creating "overlapped" sockets (i.e. sockets @@ -1296,8 +3857,7 @@ int res; /* Initialize the socket layer */ - if G_UNLIKELY(!mingw_inited) - mingw_init(); + ONCE_FLAG_RUN(mingw_socket_inited, mingw_socket_init); res = bind(sockfd, addr, addrlen); if (-1 == res) @@ -1312,12 +3872,25 @@ socket_fd_t res; /* Initialize the socket layer */ - if G_UNLIKELY(!mingw_inited) - mingw_init(); + ONCE_FLAG_RUN(mingw_socket_inited, mingw_socket_init); res = connect(sockfd, addr, addrlen); - if (INVALID_SOCKET == res) + if (INVALID_SOCKET == res) { errno = mingw_wsa_last_error(); + /* + * We need to remap WSAEWOULDBLOCK, which is translated into EAGAIN + * by mingw_wsa_last_error() -- to accomodate send() and other I/O + * operations -- to the expected EINPROGRESS for connect() operations. + * + * On modern UNIX systems, EAGAIN is used to signal that no more + * local ports can be auto-assigned for this connection endpoint. + * Thereby, returning EAGAIN would send the wrong message. + * --RAM, 2015-04-04. + */ + + if (EAGAIN == errno) + errno = EINPROGRESS; + } return res; } @@ -1327,8 +3900,7 @@ int res; /* Initialize the socket layer */ - if G_UNLIKELY(!mingw_inited) - mingw_init(); + ONCE_FLAG_RUN(mingw_socket_inited, mingw_socket_init); res = listen(sockfd, backlog); if (-1 == res) @@ -1342,8 +3914,7 @@ socket_fd_t res; /* Initialize the socket layer */ - if G_UNLIKELY(!mingw_inited) - mingw_init(); + ONCE_FLAG_RUN(mingw_socket_inited, mingw_socket_init); res = accept(sockfd, addr, addrlen); if (INVALID_SOCKET == res) @@ -1354,12 +3925,10 @@ int mingw_shutdown(socket_fd_t sockfd, int how) { - int res; /* Initialize the socket layer */ - if G_UNLIKELY(!mingw_inited) - mingw_init(); + ONCE_FLAG_RUN(mingw_socket_inited, mingw_socket_init); res = shutdown(sockfd, how); if (-1 == res) @@ -1367,6 +3936,138 @@ return res; } +#ifdef EMULATE_SOCKETPAIR +static int +socketpair(int domain, int type, int protocol, socket_fd_t sv2) +{ + socket_fd_t as = INVALID_SOCKET, cs = INVALID_SOCKET, ls = INVALID_SOCKET; + struct sockaddr_in laddr, caddr; + socklen_t laddrlen, caddrlen; + int r; + + if (AF_UNIX != domain) { + errno = EAFNOSUPPORT; + return -1; + } + + if (NULL == sv) { + errno = EINVAL; + return -1; + } + + g_assert_log(SOCK_STREAM == type, + "%s() only emulates SOCK_STREAM pairs", G_STRFUNC); + + ZERO(&laddr); + ZERO(&caddr); + + ls = socket(AF_INET, type, protocol); + if (INVALID_SOCKET == ls) { + errno = mingw_wsa_last_error(); + return -1; + } + + laddr.sin_family = AF_INET; + laddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + laddr.sin_port = 0; + + /* + * We're starting a succession of system calls. + */ + + thread_in_syscall_set(TRUE); + + r = bind(ls, (struct sockaddr *) &laddr, sizeof laddr); + if (-1 == r) + goto failed; + r = listen(ls, 1); + if (-1 == r) + goto failed; + + cs = socket(AF_INET, type, protocol); + if (INVALID_SOCKET == cs) + goto failed; + + /* + * Where do we connect to (the kernel chooses the port)? + */ + + laddrlen = sizeof laddr; + r = getsockname(ls, (struct sockaddr *) &laddr, &laddrlen); + if (-1 == r || laddrlen != sizeof laddr) + goto failed; + + /* + * The following won't block because the listening socket has a backlog + * of 1 and the connection will happen "immediately". + */ + + r = connect(cs, (struct sockaddr *) &laddr, sizeof laddr); + if (-1 == r) + goto failed; + + /* + * Now that we have a half-opened connection on the listening socket + * we can accept without blocking. + */ + + caddrlen = sizeof caddr; + as = accept(ls, (struct sockaddr *) &caddr, &caddrlen); + if (INVALID_SOCKET == as || caddrlen != sizeof caddr) + goto failed; + + s_close(ls); + ls = -1; + + /* + * Check that the two sockets are indeed connected to each other. + */ + + r = getsockname(as, (struct sockaddr *) &caddr, &caddrlen); + if (-1 == r || caddrlen != sizeof caddr) + goto failed; + + g_assert(caddr.sin_addr.s_addr == laddr.sin_addr.s_addr); + g_assert(caddr.sin_port == laddr.sin_port); + + sv0 = cs; + sv1 = as; + + thread_in_syscall_set(FALSE); + + return 0; + +failed: + thread_in_syscall_set(FALSE); + + errno = mingw_wsa_last_error(); + if (INVALID_SOCKET != ls) + s_close(ls); + if (INVALID_SOCKET != as) + s_close(as); + if (INVALID_SOCKET != cs) + s_close(cs); + + return -1; +} +#endif /* EMULATE_SOCKETPAIR */ + +int +mingw_socketpair(int domain, int type, int protocol, socket_fd_t sv2) +{ + int res; + + /* Initialize the socket layer */ + ONCE_FLAG_RUN(mingw_socket_inited, mingw_socket_init); + + res = socketpair(domain, type, protocol, sv); +#ifndef EMULATE_SOCKETPAIR + if (-1 == res) + errno = mingw_wsa_last_error(); +#endif + return res; +} + int mingw_getsockopt(socket_fd_t sockfd, int level, int optname, void *optval, socklen_t *optlen) @@ -1374,8 +4075,7 @@ int res; /* Initialize the socket layer */ - if G_UNLIKELY(!mingw_inited) - mingw_init(); + ONCE_FLAG_RUN(mingw_socket_inited, mingw_socket_init); res = getsockopt(sockfd, level, optname, optval, optlen); if (-1 == res) @@ -1388,10 +4088,9 @@ const void *optval, socklen_t optlen) { int res; - + /* Initialize the socket layer */ - if G_UNLIKELY(!mingw_inited) - mingw_init(); + ONCE_FLAG_RUN(mingw_socket_inited, mingw_socket_init); res = setsockopt(sockfd, level, optname, optval, optlen); if (-1 == res) @@ -1405,7 +4104,7 @@ { ssize_t res; - count = MIN(count, UNSIGNED(INT_MAX)); + count = MIN(count, UNSIGNED(INT_MAX)); res = send(fd, buf, count, 0); if (-1 == res) errno = mingw_wsa_last_error(); @@ -1416,8 +4115,8 @@ s_read(socket_fd_t fd, void *buf, size_t count) { ssize_t res; - - count = MIN(count, UNSIGNED(INT_MAX)); + + count = MIN(count, UNSIGNED(INT_MAX)); res = recv(fd, buf, count, 0); if (-1 == res) errno = mingw_wsa_last_error(); @@ -1430,10 +4129,29 @@ int res = closesocket(fd); if (-1 == res) errno = mingw_wsa_last_error(); + fd_notify_socket_closed(fd); return res; } ssize_t +mingw_recv(socket_fd_t fd, void *buf, size_t len, int recv_flags) +{ + DWORD r, flags = recv_flags; + iovec_t iov; + int res; + + iovec_set(&iov, buf, len); + + res = WSARecv(fd, (LPWSABUF) &iov, 1, &r, &flags, NULL, NULL); + + if (res != 0) { + errno = mingw_wsa_last_error(); + return (ssize_t) -1; + } + return (ssize_t) r; +} + +ssize_t mingw_s_readv(socket_fd_t fd, const iovec_t *iov, int iovcnt) { DWORD r, flags = 0; @@ -1482,7 +4200,7 @@ return -1; } return received; -} +} #endif /* HAS_WSARECVMSG */ ssize_t @@ -1494,7 +4212,7 @@ INT ifromLen = *addrlen; int res; - len = MIN(len, UNSIGNED(INT_MAX)); + len = MIN(len, UNSIGNED(INT_MAX)); buf.buf = data; buf.len = len; res = WSARecvFrom(s, &buf, 1, &received, &dflags, @@ -1514,8 +4232,8 @@ const struct sockaddr *dest_addr, socklen_t addrlen) { ssize_t res; - - len = MIN(len, UNSIGNED(INT_MAX)); + + len = MIN(len, UNSIGNED(INT_MAX)); res = sendto(sockfd, buf, len, flags, dest_addr, addrlen); if (-1 == res) errno = mingw_wsa_last_error(); @@ -1526,104 +4244,314 @@ *** Memory allocation routines. ***/ -static void *mingw_vmm_res_mem; -static size_t mingw_vmm_res_size; -static int mingw_vmm_res_nonhinted = 0; +static struct { + void *reserved; /* Reserved memory */ + void *base; /* Next available base for reserved memory */ + const void *heap_break; /* Initial heap break */ + size_t consumed; /* Consumed space in reserved memory */ + size_t size; /* Size for hinted allocation */ + size_t later; /* Size of "later" memory we did not reserve */ + size_t physical; /* Physical RAM available */ + size_t available; /* Virtual memory initially available */ + size_t allocated; /* Memory we allocated */ + size_t baseline; /* Committed memory at VMM init time */ + bool stop_vfree; /* VMM no longer freeing allocated memory */ + int hinted; +} mingw_vmm; -void * -mingw_valloc(void *hint, size_t size) +/** + * Called with TRUE when the VMM layer is shutting down, no longer freeing + * the memory it allocates. + */ +void +mingw_set_stop_vfree(bool val) { - void *p = NULL; + mingw_vmm.stop_vfree = val; +} - if (NULL == hint && mingw_vmm_res_nonhinted >= 0) { - if G_UNLIKELY(NULL == mingw_vmm_res_mem) { - MEMORYSTATUSEX memStatus; - SYSTEM_INFO system_info; - void *mem_later; +/** + * @return the amount of memory (in bytes) already committed by the process. + */ +static size_t +mingw_mem_committed(void) +{ + PROCESS_MEMORY_COUNTERS c; - /* Determine maximum possible memory first */ + if (GetProcessMemoryInfo(GetCurrentProcess(), &c, sizeof c)) + return c.PagefileUsage; - GetNativeSystemInfo(&system_info); + errno = mingw_last_error(); - mingw_vmm_res_size = - system_info.lpMaximumApplicationAddress - - - system_info.lpMinimumApplicationAddress; + s_warning_once_per(LOG_PERIOD_MINUTE, + "%s(): cannot compute process memory usage: %m", G_STRFUNC); - memStatus.dwLength = sizeof memStatus; - if (GlobalMemoryStatusEx(&memStatus)) { - if (memStatus.ullTotalPhys < mingw_vmm_res_size) - mingw_vmm_res_size = memStatus.ullTotalPhys; - } + /* At least that is known */ + return mingw_vmm.allocated + mingw_vmm.baseline; +} - /* Declare some space for feature allocs without hinting */ - mem_later = VirtualAlloc( - NULL, VMM_MINSIZE, MEM_RESERVE, PAGE_NOACCESS); - - /* Try to reserve it */ - while ( - NULL == mingw_vmm_res_mem && mingw_vmm_res_size > VMM_MINSIZE - ) { - mingw_vmm_res_mem = p = VirtualAlloc( - NULL, mingw_vmm_res_size, MEM_RESERVE, PAGE_NOACCESS); +/** + * Initialize the VM region we're going to manage through the VMM layer. + */ +static void +mingw_vmm_init(void) +{ + SYSTEM_INFO system_info; + void *mem_later; + size_t mem_latersize; + size_t mem_size; + size_t mem_available; + size_t granularity; - if (NULL == mingw_vmm_res_mem) - mingw_vmm_res_size -= system_info.dwAllocationGranularity; - } + mingw_vmm.baseline = mingw_mem_committed(); - VirtualFree(mem_later, 0, MEM_RELEASE); + /* + * Determine maximum possible memory first + * + * Don't use GetNativeSystemInfo(), rely on GetSsystemInfo() + * so that we get proper results for the 32-bit environment + * if running under WOW64. + */ - if (NULL == mingw_vmm_res_mem) { - s_error("could not reserve %s of memory", - compact_size(mingw_vmm_res_size, FALSE)); - } else if (vmm_is_debugging(0)) { - s_debug("reserved %s of memory", - compact_size(mingw_vmm_res_size, FALSE)); - } - } else { - size_t n; + GetSystemInfo(&system_info); - if (vmm_is_debugging(0)) - s_debug("no hint given for %s allocation", - compact_size(size, FALSE)); + granularity = round_pagesize(system_info.dwAllocationGranularity); + granularity = MAX(granularity, VMM_GRANULARITY); /* Speed up init */ - n = mingw_getpagesize(); - n = size_saturate_mult(n, ++mingw_vmm_res_nonhinted); - p = ptr_add_offset(mingw_vmm_res_mem, n); - } - if (NULL == p) { + mingw_vmm.size = + system_info.lpMaximumApplicationAddress + - + system_info.lpMinimumApplicationAddress; + + mingw_vmm.physical = getphysmemsize(); + mingw_vmm.heap_break = vmm_page_start(mingw_sbrk(0)); + + /* + * Declare some space for future allocations without hinting. + * We initially reserve about 80% of the virtual address space, + * with VMM_MINSIZE at least but we make sure we have also room + * available for non-VMM allocations. + */ + + mem_size = mingw_vmm.size; /* For the VMM space, theoretical max */ + mem_latersize = mem_size; /* For non-hinted allocation */ + +reserve_less: + mem_latersize *= 0.9; + mem_latersize = MAX(mem_latersize, VMM_MINSIZE); + mingw_vmm.later = mem_latersize; + mem_later = VirtualAlloc(NULL, + mem_latersize, MEM_RESERVE, PAGE_NOACCESS); + + if (NULL == mem_later) { + if (VMM_MINSIZE == mem_latersize) { errno = mingw_last_error(); - if (vmm_is_debugging(0)) - s_debug("could not allocate %s of memory: %m", - compact_size(size, FALSE)); + s_error("could not reserve %s of memory: %m", + compact_size(mem_latersize, FALSE)); + } else { + goto reserve_less; } - } else if (NULL == hint && mingw_vmm_res_nonhinted < 0) { - /* - * Non hinted request after hinted request are used. Allow usage of - * non VMM space - */ + } + + /* + * Try to reserve the remaining virtual space, asking for as + * much as we can and reducing the requested size by the + * system's granularity until we get a success status. + */ - p = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); + mingw_vmm.size = round_pagesize(mem_size - mem_latersize); - if (p == NULL) { - errno = mingw_last_error(); - p = MAP_FAILED; + while ( + NULL == mingw_vmm.reserved && mingw_vmm.size > VMM_MINSIZE + ) { + mingw_vmm.reserved = VirtualAlloc( + NULL, mingw_vmm.size, MEM_RESERVE, PAGE_NOACCESS); + + if (NULL == mingw_vmm.reserved) + mingw_vmm.size -= granularity; + } + + VirtualFree(mem_later, 0, MEM_RELEASE); + + mem_available = mem_latersize + mingw_vmm.size; + mingw_vmm.available = mem_available; + + /* + * We are trying to balance reserved space within the total available space, + * and we can directly compute the value X of the "mem_latersize" we want, + * satisfying: + * + * available = X + size + * size = 80% * available + * + * This trivially solves to: X = 20% * available. The assumption + * made here is that the total memory size we computed above as + * "mem_available" is going to be constant. + * --RAM, 2015-11-04 + */ + + mem_latersize = 0.2 * mem_available; + mingw_vmm.later = mem_latersize; + mingw_vmm.size = mem_available - mem_latersize; + + /* + * Now that we know how much we can reserve for the VMM layer, + * free everything and redo the VMM reservation so that we let + * the kernel pick the highest possible address space, so as to + * leave optimal growing space for the other allocators. + * --RAM, 2015-10-16 + */ + + VirtualFree(mingw_vmm.reserved, 0, MEM_RELEASE); + + mingw_vmm.reserved = VirtualAlloc( + NULL, mingw_vmm.size, MEM_RESERVE, PAGE_NOACCESS); + + if (NULL == mingw_vmm.reserved) { + s_error("could not reserve %s of memory: %m", + compact_size(mingw_vmm.size, FALSE)); + } + + mingw_vmm.base = mingw_vmm.reserved; + mingw_vmm_inited = TRUE; +} + +void * +mingw_valloc(void *hint, size_t size) +{ + void *p = NULL; + + if G_UNLIKELY(NULL == hint) { + if (mingw_vmm.hinted >= 0) { + static spinlock_t valloc_slk = SPINLOCK_INIT; + + spinlock(&valloc_slk); + + if G_UNLIKELY(NULL == mingw_vmm.reserved) + mingw_vmm_init(); + + if (vmm_is_debugging(0)) { + s_debug("no hint given for %s allocation #%d", + compact_size(size, FALSE), mingw_vmm.hinted); + } + + mingw_vmm.hinted++; + if G_UNLIKELY(mingw_vmm.consumed + size > mingw_vmm.size) { + spinunlock(&valloc_slk); + /* We don't want a stacktrace, use s_minilog() directly */ + s_minilog(G_LOG_LEVEL_CRITICAL, + "%s(): out of reserved memory for %zu bytes", + G_STRFUNC, size); + goto failed; + } + p = mingw_vmm.base; + mingw_vmm.base = ptr_add_offset(mingw_vmm.base, size); + mingw_vmm.consumed += size; + spinunlock(&valloc_slk); + } else { + /* + * Non-hinted request after hinted requests have been used. + * Allow usage of non-reserved space. + */ + + p = VirtualAlloc(NULL, size, + MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); + + if (p == NULL) { + /* We don't want a stacktrace, use s_minilog() directly */ + errno = mingw_last_error(); + s_minilog(G_LOG_LEVEL_CRITICAL, + "%s(): cannot allocate %'zu bytes: %m", G_STRFUNC, size); + goto failed; + } + + /* + * Warn them, since this VM region space will never be released + * to the system: the memory will be decomitted when the region + * is freed, but the space will be taken, fragmenting the VM space. + * --RAM, 2015-04-06 + * + * When the VMM layer stops freeing memory, it uses NULL hints, + * at which point we don't want to warn about non-hinted memory + * allocations since we're shutting down! + * --RAM, 2015-04-07 + * + * During crashes, the VMM layer always requests NULL hints. + * --RAM, 2015-10-24 + * + * During pmap extensions, the VMM layer also requests NULL hints. + * --RAM, 2015-11-08 + */ + + if ( + !mingw_vmm.stop_vfree && + !vmm_is_extending() && + !vmm_is_crashing() + ) { + s_minicarp("%s(): non-hinted allocation of %'zu bytes at %p", + G_STRFUNC, size, p); + } + + goto allocated; } - return p; } else { - /* Can't handle non-hinted allocations anymore */ - mingw_vmm_res_nonhinted = -1; + if G_UNLIKELY(mingw_vmm.hinted >= 0) { + mingw_vmm.hinted = -1; /* Can now handle non-hinted allocs */ + atomic_mb(); + } p = hint; } p = VirtualAlloc(p, size, MEM_COMMIT, PAGE_READWRITE); if (p == NULL) { - p = MAP_FAILED; + /* We don't want a stacktrace, use s_minilog() directly */ errno = mingw_last_error(); + s_minilog(G_LOG_LEVEL_CRITICAL, + "%s(): failed to commit %'zu bytes at %p: %m", + G_STRFUNC, size, hint); + + /* + * If errno is EFAULT and the hint was not NULL, then it means we have + * selected an address that lies too close to the end of the initially + * reserved memory segment, and it cannot be fully committed by the + * kernel. + * --RAM, 2015-04-06 + */ + + if (hint != NULL && EFAULT == errno) { + /* + * In order to allow the process to continue, we're going to try + * to allocate memory outside our reserved region. If we can, + * we request a clean application restart. Otherwise, we'll let + * our caller handle the situation since there is nothing else + * we can do from down here. + * --RAM, 2015-04-06 + */ + + p = VirtualAlloc(NULL, size, + MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); + + if (p != NULL) { + crash_restart("%s(): had to allocate %'zu bytes " + "outside reserved region at %p", G_STRFUNC, size, p); + goto allocated; + } + + /* FALL THROUGH, p is still NULL */ + } + + goto failed; } + /* FALL THROUGH */ + +allocated: + mingw_vmm.allocated += size; return p; + +failed: + errno = ENOMEM; /* Expected errno value from VMM layer */ + return MAP_FAILED; } int @@ -1634,27 +4562,60 @@ /* * VMM hint should always be respected. So this function should not - * be reached from VMM, ever. + * be reached from VMM, except when we are out-of-memory and + * mingw_valloc() tried to allocate outside the reserved region. + * + * Since we also tell the VMM layer on Windows to avoid testing to see + * whether we're hitting "foreign" regions, this routine still can never + * be called. */ - g_assert_not_reached(); + s_error("%s(): should not be called on Windows", G_STRFUNC); } int mingw_vfree_fragment(void *addr, size_t size) { - if (ptr_cmp(mingw_vmm_res_mem, addr) < 0 && - ptr_cmp(ptr_add_offset(mingw_vmm_res_mem, mingw_vmm_res_size), addr) > 0) - { + void *end = ptr_add_offset(mingw_vmm.reserved, mingw_vmm.size); + + g_assert_log(mingw_vmm.allocated >= size, + "%s(): attempt to free unallocated memory (%'zu bytes at %p): " + "has total of %'zu allocated bytes", + G_STRFUNC, size, addr, mingw_vmm.allocated); + + mingw_vmm.allocated -= size; + + if (ptr_cmp(mingw_vmm.reserved, addr) <= 0 && ptr_cmp(end, addr) > 0) { /* Allocated in reserved space */ if (!VirtualFree(addr, size, MEM_DECOMMIT)) { errno = mingw_last_error(); return -1; } - } else if (!VirtualFree(addr, 0, MEM_RELEASE)) { + } else { + /* + * Now that we have emergency allocations, we can no longer use + * MEM_RELEASE, even if the region is not in the (initially) + * non-reserved space. The reason is that we would have to + * use: + * + * VirtualFree(addr, 0, MEM_RELEASE) + * + * (i.e. pass 0 as the size parameter) and that would decommit + * and release the *whole range* starting at addr. But because of + * the way the VMM layer works and keeps track of allocated regions, + * they can be coalesced and we cannot ensure we're not going to + * start freeing region A, that happens to be adjacent to region B, + * and passing the start of region A would release region B as well! + * + * To avoid this, memory allocated outside the reserved region is + * never released, only decommitted. + */ + /* Allocated in non-reserved space */ - errno = mingw_last_error(); - return -1; + if (!VirtualFree(addr, size, MEM_DECOMMIT)) { + errno = mingw_last_error(); + return -1; + } } return 0; @@ -1667,6 +4628,19 @@ DWORD newProtect; BOOL res; + /* + * The PROT_GUARD is specific to Windows and is convenient to create + * red-pages in stacks to detect overflows: given Windows does not + * support an alternate signal stack, there is no way we could easily + * detect a stack overflow without it and still be able to process it. + * + * A guard page will simply be protected as PROT_NONE but read-write + * access will be restored after the first fault on it, which generates + * an exception of type EXCEPTION_GUARD_PAGE. + * + * --RAM, 2015-11-09 + */ + switch (prot) { case PROT_NONE: newProtect = PAGE_NOACCESS; @@ -1677,8 +4651,11 @@ case PROT_READ | PROT_WRITE: newProtect = PAGE_READWRITE; break; + case PROT_GUARD: + newProtect = PAGE_READWRITE | PAGE_GUARD; + break; default: - g_carp("mingw_mprotect(): unsupported protection flags 0x%x", prot); + s_critical("%s(): unsupported protection flags 0x%x", G_STRFUNC, prot); res = EINVAL; return -1; } @@ -1695,6 +4672,62 @@ return 0; /* OK */ } +/** + * Log memory information about the memory region to which an address belongs. + * + * This is only useful when debugging problems on Windows at the lowest + * possible level. + * + * @param p the address for which we want information + */ +void +mingw_log_meminfo(const void *p) +{ + MEMORY_BASIC_INFORMATION mbi; + size_t res; + + ZERO(&mbi); + + res = VirtualQuery(p, &mbi, sizeof mbi); + if (0 == res) { + errno = mingw_last_error(); + s_rawwarn("VirtualQuery() failed for %p: %m", p); + } else { + s_rawdebug("VirtualQuery(%p):", p); + s_rawdebug("\tBaseAddress: %p", mbi.BaseAddress); + s_rawdebug("\tAllocationBase: %p", mbi.AllocationBase); + s_rawdebug("\tRegionSize: %'lu", mbi.RegionSize); + s_rawdebug("\tAllocationProtect: 0x%lx", mbi.AllocationProtect); + } +} + +/** + * Compute the allocation start of a memory region. + * + * @param p a pointer in the region for which we want the start + * + * @return the start of the allocated region, NULL if we cannot figure it out. + */ +void * +mingw_memstart(const void *p) +{ + MEMORY_BASIC_INFORMATION mbi; + size_t res; + void *base = NULL; + + ZERO(&mbi); + + res = VirtualQuery(p, &mbi, sizeof mbi); + if (0 == res) { + errno = mingw_last_error(); + s_rawwarn("%s(): VirtualQuery() failed for %p: %m", G_STRFUNC, p); + } else { + base = mbi.AllocationBase; + } + + return base; +} + /*** *** Random numbers. ***/ @@ -1749,7 +4782,7 @@ case ECHILD: return "No child process"; case EAGAIN: return "Resource temporarily unavailable"; case ENOMEM: return "Not enough memory space"; - case EACCES: return "Permission denied"; + case EACCES: return "Access denied"; case EFAULT: return "Bad address"; case EBUSY: return "Device busy"; case EEXIST: return "File already exists"; @@ -1776,6 +4809,13 @@ case ENOTEMPTY: return "Directory not empty"; case EILSEQ: return "Illegal byte sequence"; case EOVERFLOW: return "Value too large to be stored in data type"; + case EIDRM: return "Identifier removed"; /* Emulated */ + + /* + * Non-POSIX error codes for which we want our own message... + */ + case ESHUTDOWN: return "Transport endpoint already shutdown"; + default: return NULL; } @@ -1786,7 +4826,8 @@ mingw_strerror(int errnum) { const char *msg; - static char strerrbuf1024; + buf_t *b; + char *p; /* * We have one global "errno" but conflicting ranges for errors: the @@ -1802,41 +4843,50 @@ if (msg != NULL) return msg; + b = buf_private(G_STRFUNC, 1024); + p = buf_data(b); + FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, NULL, errnum, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) strerrbuf, - sizeof strerrbuf, NULL ); + (LPTSTR) p, buf_size(b), NULL); - strchomp(strerrbuf, 0); /* Remove final "\r\n" */ - return strerrbuf; + strchomp(p, 0); /* Remove final "\r\n" */ + return p; } int mingw_rename(const char *oldpathname, const char *newpathname) { - pncs_t old, new; + pncs_t pncs; int res; + wchar_t *old_utf16; - if (pncs_convert(&old, oldpathname)) + if (pncs_convert(&pncs, oldpathname)) return -1; - if (pncs_convert(&new, newpathname)) - return -1; + old_utf16 = pncs_dup(&pncs); /* pncs_convert() returns static data */ + + if (pncs_convert(&pncs, newpathname)) { + res = -1; + goto done; /* errno already set */ + } /* * FIXME: Try to rename a file with SetFileInformationByHandle * and FILE_INFO_BY_HANDLE_CLASS */ - if (MoveFileExW(old.utf16, new.utf16, MOVEFILE_REPLACE_EXISTING)) { + if (MoveFileExW(old_utf16, pncs.utf16, MOVEFILE_REPLACE_EXISTING)) { res = 0; } else { errno = mingw_last_error(); res = -1; } +done: + hfree(old_utf16); return res; } @@ -1854,14 +4904,14 @@ bin_model = '\0'; mode = bin_mode; } - + if (pncs_convert(&wpathname, pathname)) return NULL; if ( !is_ascii_string(mode) || - utf8_to_utf16(mode, wmode, G_N_ELEMENTS(wmode)) >= - G_N_ELEMENTS(wmode) + utf8_to_utf16(mode, wmode, N_ITEMS(wmode)) >= + N_ITEMS(wmode) ) { errno = EINVAL; return NULL; @@ -1891,11 +4941,11 @@ bin_model = '\0'; mode = bin_mode; } - + if ( !is_ascii_string(mode) || - utf8_to_utf16(mode, wmode, G_N_ELEMENTS(wmode)) >= - G_N_ELEMENTS(wmode) + utf8_to_utf16(mode, wmode, N_ITEMS(wmode)) >= + N_ITEMS(wmode) ) { errno = EINVAL; return NULL; @@ -1915,7 +4965,13 @@ DWORD BytesPerSector; DWORD NumberOfFreeClusters; DWORD TotalNumberOfClusters; + DWORD MaxComponentLength; + DWORD FileSystemFlags; + wchar_t vname256; + wchar_t mountpMAX_PATH_LEN; pncs_t pncs; + const wchar_t *root; + char volume256; if (pncs_convert(&pncs, pathname)) return -1; @@ -1930,24 +4986,117 @@ return -1; } - buf->f_csize = SectorsPerCluster * BytesPerSector; - buf->f_clusters = TotalNumberOfClusters; - buf->f_cavail = NumberOfFreeClusters; + ZERO(buf); + + buf->f_bsize = SectorsPerCluster * BytesPerSector; + buf->f_frsize = buf->f_bsize; + buf->f_blocks = TotalNumberOfClusters; + buf->f_bfree = NumberOfFreeClusters; + buf->f_bavail = NumberOfFreeClusters; + buf->f_namemax = FILENAME_MAX; /* From <stdio.h> */ + + ZERO(&mountp); + + ret = GetVolumePathNameW(pncs.utf16, mountp, N_ITEMS(mountp)); + root = ret ? mountp : pncs.utf16; + + ZERO(&vname); + + ret = GetVolumeInformationW(root, + vname, N_ITEMS(vname), /* VolumeName{Buffer,Size} */ + NULL, /* VolumeSerialNumber */ + &MaxComponentLength, /* MaximumComponentLength */ + &FileSystemFlags, /* FileSystemFlags */ + NULL, 0); /* FileSystemName{Buffer,Size} */ + + if (ret) { + if (FileSystemFlags & FILE_READ_ONLY_VOLUME) + buf->f_flag |= ST_RDONLY; + buf->f_namemax = MaxComponentLength; + + /* + * All we want is a stable file system ID, so we hash the volume name. + */ + + utf16_to_utf8(vname, volume, N_ITEMS(volume)); + volumeN_ITEMS(volume) - 1 = '\0'; + buf->f_fsid = string_mix_hash(volume); + } return 0; } +#ifdef EMULATE_GETRLIMIT +/** + * Get process resource limits. + */ +int +mingw_getrlimit(int resource, struct rlimit *rlim) +{ + switch (resource) { + case RLIMIT_CORE: + ZERO(rlim); + break; + case RLIMIT_DATA: + if G_LIKELY(mingw_vmm_inited) { + /* + * Assume the data segment (heap) will grow up to the start + * of the reserved region we have, since now that region is + * put at the lowest possible address. This only approximates + * the truth. + * --RAM, 2015-10-16 + */ + rlim->rlim_max = ptr_diff(mingw_vmm.reserved, mingw_vmm.heap_break); + rlim->rlim_cur = ptr_diff(mingw_vmm.reserved, mingw_sbrk(0)); + break; + } + /* FALL THROUGH */ + case RLIMIT_AS: + { + SYSTEM_INFO system_info; + + GetSystemInfo(&system_info); + rlim->rlim_max = + system_info.lpMaximumApplicationAddress + - + system_info.lpMinimumApplicationAddress; + rlim->rlim_cur = rlim->rlim_max - + size_saturate_sub(mingw_mem_committed(), mingw_vmm.baseline); + } + break; + default: + errno = ENOTSUP; + return -1; + } + + return 0; +} +#endif /* EMULATE_GETRLIMIT */ + +#ifdef EMULATE_SCHED_YIELD +/** + * Cause the calling thread to relinquish the CPU. + */ +int +mingw_sched_yield(void) +{ + Sleep(0); + return 0; +} +#endif /* EMULATE_SCHED_YIELD */ + #ifdef EMULATE_GETRUSAGE /** * Convert a FILETIME into a timeval. * * @param ft the FILETIME structure to convert * @param tv the struct timeval to fill in + * @param offset offset to substract to the FILETIME value */ static void -mingw_filetime_to_timeval(const FILETIME *ft, struct timeval *tv) +mingw_filetime_to_timeval(const FILETIME *ft, struct timeval *tv, uint64 offset) { - guint64 v; + uint64 v; /* * From MSDN documentation: @@ -1966,9 +5115,10 @@ * the LowPart and HighPart members into the FILETIME structure. */ - v = (ft->dwLowDateTime | ((ft->dwHighDateTime + (guint64) 0) << 32)) / 10; - tv->tv_usec = v % 1000000UL; - v /= 1000000UL; + v = (ft->dwLowDateTime | ((ft->dwHighDateTime + (uint64) 0) << 32)) / 10; + v -= offset; + tv->tv_usec = v % TM_MILLION; + v /= TM_MILLION; /* If time_t is a 32-bit integer, there could be an overflow */ tv->tv_sec = MIN(v, UNSIGNED(MAX_INT_VAL(time_t))); } @@ -1976,28 +5126,46 @@ int mingw_getrusage(int who, struct rusage *usage) { - FILETIME creation_time, exit_time, kernel_time, user_time; - - if (who != RUSAGE_SELF) { - errno = EINVAL; - return -1; - } if (NULL == usage) { errno = EACCES; return -1; } - if ( - 0 == GetProcessTimes(GetCurrentProcess(), - &creation_time, &exit_time, &kernel_time, &user_time) - ) { - errno = mingw_last_error(); + ZERO(usage); + + switch (who) { + case RUSAGE_SELF: + { + FILETIME creation_time, exit_time, kernel_time, user_time; + + if ( + 0 == GetProcessTimes(GetCurrentProcess(), + &creation_time, &exit_time, &kernel_time, &user_time) + ) { + errno = mingw_last_error(); + return -1; + } + + mingw_filetime_to_timeval(&user_time, &usage->ru_utime, 0); + mingw_filetime_to_timeval(&kernel_time, &usage->ru_stime, 0); + } + break; + case RUSAGE_CHILDREN: + spinlock(&mingw_child_time_slk); + + mingw_filetime_to_timeval(&mingw_child_user_time, &usage->ru_utime, 0); + mingw_filetime_to_timeval(&mingw_child_kern_time, &usage->ru_stime, 0); + + spinunlock(&mingw_child_time_slk); + break; + case RUSAGE_THREAD: + errno = ENOSYS; + return -1; + default: + errno = EINVAL; return -1; } - mingw_filetime_to_timeval(&user_time, &usage->ru_utime); - mingw_filetime_to_timeval(&kernel_time, &usage->ru_stime); - return 0; } #endif /* EMULATE_GETRUSAGE */ @@ -2007,7 +5175,7 @@ { static char buf128; static char *result; - static gboolean inited; + static bool inited; DWORD size; if (G_LIKELY(inited)) @@ -2020,6 +5188,259 @@ return result; } +/** + * Extract SID (Security IDentifier) from the specified token. + * + * The extracted SID is stored in ``sid_ptr'' and must be xfree()'ed + * by the caller when it is done with it. + * + * @param token the token handle + * @param which the information class we want from the token + * @param sid_ptr where allocated SID will be stored + * + * @return TRUE if ok and we allocated a new SID, FALSE otherwise. + */ +static bool +mingw_token_sid(HANDLE token, TOKEN_INFORMATION_CLASS which, SID **sid_ptr) +{ + DWORD len, needed = 0; + void *data = NULL; + SID *tsid, *sid = NULL; + + if (NULL == token || INVALID_HANDLE_VALUE == token) + return FALSE; + + GetTokenInformation(token, which, NULL, 0, &needed); + if (0 == needed) + return FALSE; + + len = needed; + data = xmalloc0(len); + + if (!GetTokenInformation(token, which, data, len, &needed) || needed > len) + goto failed; + + switch (which) { + case TokenUser: + { + TOKEN_USER *u = data; + tsid = u->User.Sid; + } + break; + case TokenPrimaryGroup: + { + TOKEN_PRIMARY_GROUP *g = data; + tsid = g->PrimaryGroup; + } + break; + default: + s_rawwarn("%s(): unexpected token class %d", G_STRFUNC, which); + goto failed; + } + + len = GetLengthSid(tsid); + sid = xmalloc(len); + if (!CopySid(len, sid, tsid) || !IsValidSid(sid)) + goto failed; + + xfree(data); + *sid_ptr = sid; /* Caller will need to xfree() this once done */ + + return TRUE; + +failed: + XFREE_NULL(sid); + XFREE_NULL(data); + return FALSE; +} + +/** + * Extract the last relative identifier (RID) authority from a SID and free + * that SID. + */ +static ulong +mingw_token_sid_last_rid_free(SID *sid) +{ + ulong rid, *rp; + uint8 n, *np; + + g_assert(IsValidSid(sid)); + + /* + * From MSDN: + * + * Standardized string notation for SIDs, making it simpler to visualize + * their components: + * + * S-R-I-X# + * + * In this notation, the literal character "S" identifies the following + * series of digits as a SID, R is the revision level, I is the + * identifier-authority value, and X# is one or more subauthority values. + * + * For instance, a SID string could be: "S-1-5-32-544", meaning: + * + * - A revision level of 1 + * - An identifier-authority value of 5 (SECURITY_NT_AUTHORITY) + * - A first subauthority value of 32 (SECURITY_BUILTIN_DOMAIN_RID) + * - A second subauthority value of 544 (DOMAIN_ALIAS_RID_ADMINS) + * + * A SID must contain a top-level authority and at least one relative + * identifier (RID) value. + */ + + np = GetSidSubAuthorityCount(sid); + n = *np; + rp = GetSidSubAuthority(sid, n - 1); + rid = *rp; + xfree(sid); + + return rid; +} + +static uid_t +mingw_token_uid(HANDLE token) +{ + SID *sid = NULL; + bool ok; + + ok = mingw_token_sid(token, TokenUser, &sid); + if (!ok) + return UID_NOBODY; + + return (uid_t) mingw_token_sid_last_rid_free(sid); +} + +static gid_t +mingw_token_gid(HANDLE token) +{ + SID *sid = NULL; + bool ok; + + ok = mingw_token_sid(token, TokenPrimaryGroup, &sid); + if (!ok) + return GID_NOBODY; + + return (gid_t) mingw_token_sid_last_rid_free(sid); +} + +/** + * Get the effective security token, which must get closed by caller when done. + */ +static HANDLE +mingw_get_effective_token(void) +{ + HANDLE t = GetCurrentThread(); + HANDLE token = NULL; + const int flags = TOKEN_READ | TOKEN_QUERY_SOURCE; + bool ok; + + ok = OpenThreadToken(t, flags, FALSE, &token); + if (!ok) { + if (ERROR_NO_TOKEN != GetLastError()) + goto failed; + ok = OpenThreadToken(t, flags, TRUE, &token); + } + if (!ok) { + if (ERROR_NO_TOKEN != GetLastError()) + goto failed; + ok = OpenProcessToken(GetCurrentProcess(), flags, &token); + } + if (!ok) + goto failed; + + return token; + +failed: + errno = mingw_last_error(); + s_rawwarn("%s(): can't open thread/process token: %m", G_STRFUNC); + return NULL; +} + +/** + * Get the process security token, which must get closed by caller when done. + */ +static HANDLE +mingw_get_token(void) +{ + HANDLE p = GetCurrentProcess(); + HANDLE token = NULL; + bool ok; + + ok = OpenProcessToken(p, TOKEN_READ | TOKEN_QUERY_SOURCE, &token); + if (!ok) { + errno = mingw_last_error(); + s_rawwarn("%s(): can't open process token: %m", G_STRFUNC); + return NULL; + } + + return token; +} + +uid_t +mingw_getuid(void) +{ + HANDLE token; + uid_t id; + + token = mingw_get_token(); + if (NULL == token) + return UID_NOBODY; + + id = mingw_token_uid(token); + CloseHandle(token); + + return id; +} + +uid_t +mingw_geteuid(void) +{ + HANDLE token; + uid_t id; + + token = mingw_get_effective_token(); + if (NULL == token) + return UID_NOBODY; + + id = mingw_token_uid(token); + CloseHandle(token); + + return id; +} + +gid_t +mingw_getgid(void) +{ + HANDLE token; + gid_t id; + + token = mingw_get_token(); + if (NULL == token) + return GID_NOBODY; + + id = mingw_token_gid(token); + CloseHandle(token); + + return id; +} + +gid_t +mingw_getegid(void) +{ + HANDLE token; + uid_t id; + + token = mingw_get_effective_token(); + if (NULL == token) + return GID_NOBODY; + + id = mingw_token_gid(token); + CloseHandle(token); + + return id; +} + int mingw_getpagesize(void) { @@ -2040,7 +5461,7 @@ mingw_proc_arch(void) { static SYSTEM_INFO system_info; - static gboolean done; + static bool done; if (done) return system_info.wProcessorArchitecture; @@ -2055,7 +5476,7 @@ int mingw_uname(struct utsname *buf) { - OSVERSIONINFOEX osvi; + OSVERSIONINFO osvi; DWORD len; const char *cpu; @@ -2072,11 +5493,11 @@ g_strlcpy(buf->machine, cpu, sizeof buf->machine); osvi.dwOSVersionInfoSize = sizeof osvi; - if (GetVersionEx((OSVERSIONINFO *) &osvi)) { - gm_snprintf(buf->release, sizeof buf->release, "%u.%u", + if (GetVersionEx(&osvi)) { + str_bprintf(buf->release, sizeof buf->release, "%u.%u", (unsigned) osvi.dwMajorVersion, (unsigned) osvi.dwMinorVersion); - gm_snprintf(buf->version, sizeof buf->version, "%u", - (unsigned) osvi.dwBuildNumber); + str_bprintf(buf->version, sizeof buf->version, "%u %s", + (unsigned) osvi.dwBuildNumber, osvi.szCSDVersion); } len = sizeof buf->nodename; @@ -2090,9 +5511,17 @@ int mingw_nanosleep(const struct timespec *req, struct timespec *rem) { - static HANDLE t = NULL; + static struct thread_timer { + HANDLE timer; + atomic_lock_t lock; + } thread_timerTHREAD_MAX; + static uint idx; + uint i; + struct thread_timer *tt; + HANDLE t; LARGE_INTEGER dueTime; - guint64 value; + uint64 value; + ulong r; /* * There's no residual time, there cannot be early terminations. @@ -2103,23 +5532,62 @@ rem->tv_nsec = 0; } - if (G_UNLIKELY(NULL == t)) { - t = CreateWaitableTimer(NULL, TRUE, NULL); - - if (NULL == t) - g_carp("unable to create waitable timer, ignoring nanosleep()"); - - errno = ENOMEM; /* System problem anyway */ - return -1; - } + if (0 == req->tv_sec && 0 == req->tv_nsec) + return 0; if (req->tv_sec < 0 || req->tv_nsec < 0 || req->tv_nsec > 999999999L) { errno = EINVAL; return -1; } - if (0 == req->tv_sec && 0 == req->tv_nsec) - return 0; + /* + * On UNIX, nanosleep() is a system call but it is not on Windows. + * Therefore we need to clear the "in syscall" state for now, until + * we are ready to block, waiting for the timer to expire. + */ + + thread_in_syscall_reset(); + + /* + * We need one timer per thread, but since nanosleep() is called by + * spinlock_loop() indirectly through compat_sleep_ms(), we have to + * manage this expectation specially. + * + * Since a given thread can only wait once at a time, we have a rotating + * array of existing timers, one per thread at most and we rotate + * atomically each time. + * + * Each timer is locked using a low-level lock (since we cannot recurse + * into the spinlock code). + */ + + for (i = 0; i < 1000; i++) { + uint j, k; + for (k = 0, j = atomic_uint_inc(&idx); k < THREAD_MAX; k++, j++) { + tt = &thread_timerj % THREAD_MAX; + if (atomic_acquire(&tt->lock)) + goto found; + } + } + + s_minierror("%s() unable to get a timer", G_STRFUNC); + +found: + + t = tt->timer; + + if (G_UNLIKELY(NULL == t)) { + t = CreateWaitableTimer(NULL, TRUE, NULL); + + if (NULL == t) { + atomic_release(&tt->lock); + s_carp("unable to create waitable timer, ignoring nanosleep()"); + errno = ENOMEM; /* System problem anyway */ + return -1; + } + + tt->timer = t; + } /* * For Windows, the time specification unit is 100 nsec. @@ -2127,62 +5595,108 @@ * Negative values indicate relative time. */ - value = guint64_saturate_add( - guint64_saturate_mult(req->tv_sec, 10000000UL), + value = uint64_saturate_add( + uint64_saturate_mult(req->tv_sec, TM_MILLION * 10UL), (req->tv_nsec + 99) / 100); - dueTime.QuadPart = -MIN(value, MAX_INT_VAL(gint64)); + dueTime.QuadPart = -MIN(value, MAX_INT_VAL(int64)); if (0 == SetWaitableTimer(t, &dueTime, 0, NULL, NULL, FALSE)) { + atomic_release(&tt->lock); errno = mingw_last_error(); s_carp("could not set timer, unable to nanosleep(): %m"); return -1; } - if (WaitForSingleObject(t, INFINITE) != WAIT_OBJECT_0) { - s_warning("timer returned an unexpected value, nanosleep() failed"); + thread_in_syscall_set(TRUE); + r = WaitForSingleObject(t, INFINITE); + thread_in_syscall_set(FALSE); + + if (WAIT_OBJECT_0 != r) { + atomic_release(&tt->lock); + errno = mingw_last_error(); + s_carp("timer returned an unexpected value, nanosleep() failed: %m"); errno = EINTR; return -1; } + atomic_release(&tt->lock); return 0; } #endif -gboolean -mingw_process_is_alive(pid_t pid) +/* + * Check whether a given PID could be sent a signal with kill(pid, 0), would + * Windows support such a system call. + + * @return 0 on success, -1 on failure. + * + * If it returns -1, errno is set to indicate why process PID cannot be + * queried: ESRCH when process does not exist, EPERM when it exists but cannot + * be accessed by the user. + */ +int +mingw_process_access_check(pid_t pid) { - char our_process_name1024; - char process_name1024; HANDLE p; - BOOL res = FALSE; + int res = -1; + + p = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); + if (NULL == p) { + errno = mingw_last_error(); + /* + * Remap our POSIX error codes to that of what kill(pid, 0) + * would return on UNIX. We skip EINVAL, since that is only + * used by kill() when an invalid signal is passed, which is + * irrelevant here! + */ + if (EINVAL == errno) /* When PID does not exist */ + errno = ESRCH; /* we want ESRCH to be returned */ + else if (EACCES == errno) /* When process cannot be queried */ + errno = EPERM; /* we want EPERM to be returned */ + else { + s_carp_once("%s(): unexpected error: %m", G_STRFUNC); + errno = EPERM; /* Assume process exists */ + } + } else { + /* + * Make sure Windows returns a handle to the PID we asked -- it has + * a tendency to sometimes open a process that bear a PID that is + * slightly less to the one requested when the requested PID does + * not exist! + */ - pid_t our_pid = GetCurrentProcessId(); + if (GetProcessId(p) == UNSIGNED(pid)) + res = 0; + else + errno = ESRCH; - /* PID might be reused */ - if (our_pid == pid) - return FALSE; + /* + * Also make sure the process is still running and is not in a + * zombie state. + */ - p = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid); + if (0 == res) { + DWORD code; - if (NULL != p) { - GetModuleBaseName(p, NULL, process_name, sizeof process_name); - GetModuleBaseName(GetCurrentProcess(), - NULL, our_process_name, sizeof our_process_name); + if (GetExitCodeProcess(p, &code) && STILL_ACTIVE != code) { + res = -1; + errno = ESRCH; /* Process is a zombie */ + } + } - res = g_strcmp0(process_name, our_process_name) == 0; CloseHandle(p); - } + } return res; } -static unsigned long +long mingw_cpu_count(void) { - static unsigned long result; + static long result; SYSTEM_INFO system_info; - if (G_UNLIKELY(result == 0)) { + if G_UNLIKELY(0 == result) { GetSystemInfo(&system_info); result = system_info.dwNumberOfProcessors; g_assert(result > 0); @@ -2190,16 +5704,16 @@ return result; } -guint64 +uint64 mingw_cpufreq(enum mingw_cpufreq freq) { unsigned long cpus = mingw_cpu_count(); PROCESSOR_POWER_INFORMATION *p, powarray16; size_t len; - guint64 result = 0; + uint64 result = 0; len = size_saturate_mult(cpus, sizeof *p); - if (cpus <= G_N_ELEMENTS(powarray)) { + if (cpus <= N_ITEMS(powarray)) { p = powarray; } else { p = walloc(len); @@ -2212,11 +5726,11 @@ switch (freq) { case MINGW_CPUFREQ_CURRENT: /* Convert to Hz */ - result = guint64_saturate_mult(p0.CurrentMhz, 1000000UL); + result = uint64_saturate_mult(p0.CurrentMhz, TM_MILLION); break; case MINGW_CPUFREQ_MAX: /* Convert to Hz */ - result = guint64_saturate_mult(p0.MaxMhz, 1000000UL); + result = uint64_saturate_mult(p0.MaxMhz, TM_MILLION); break; } } @@ -2227,635 +5741,1744 @@ return result; } -/*** - *** ADNS - *** - *** Functions ending with _thread are executed in the context of the ADNS - *** thread, others are executed in the context of the main thread. - *** - *** All logging within the thread must use the t_xxx() logging routines - *** with the ``altc'' parameter in order to be thread-safe. - ***/ +/** + * Get special folder path. + * + * @note + * Our caller handles the caching so that it is guaranteed that we will be + * called just once per folder type. + */ +static const char * +mingw_get_folder_basepath(enum special_folder folder) +{ + const char *special_path = NULL; -static logthread_t *altc; /* ADNS logging thread context */ - -static GAsyncQueue *mingw_gtkg_main_async_queue; -static GAsyncQueue *mingw_gtkg_adns_async_queue; -static volatile gboolean mingw_adns_thread_run; - -struct async_data { - void *user_data; - - void *thread_return_data; - void *thread_arg_data; - - void (*thread_func)(struct async_data *); - void (*callback_func)(struct async_data *); -}; + switch (folder) { + case PRIVLIB_PATH: + special_path = mingw_filename_nearby( + "share" G_DIR_SEPARATOR_S PACKAGE); + goto done; + case NLS_PATH: + special_path = mingw_filename_nearby( + "share" G_DIR_SEPARATOR_S "locale"); + goto done; + case SPECIAL_FOLDER_COUNT: + g_assert_not_reached(); + } -struct arg_data { - const struct sockaddr *sa; - union { - struct sockaddr_in sa_inet4; - struct sockaddr_in6 sa_inet6; - } u; - char hostnameNI_MAXHOST; - char servinfoNI_MAXSERV; -}; + s_carp("%s() needs implementation for foldertype %d", G_STRFUNC, folder); -struct adns_common { - void (*user_callback)(void); - void * user_data; - gboolean reverse; -}; +done: + return special_path; +} -struct adns_reverse_query { - host_addr_t addr; -}; +/** + * Build pathname of file located nearby our executable. + * + * @return pointer to static data. + */ +const char * +mingw_filename_nearby(const char *filename) +{ + buf_t *b = buf_private(G_STRFUNC, MAX_PATH_LEN); + char *pathname = buf_data(b); + static size_t offset; + static spinlock_t nearby_slk = SPINLOCK_INIT; -struct adns_query { - enum net_type net; - char hostnameMAX_HOSTLEN + 1; -}; + spinlock_hidden(&nearby_slk); /* Protect access to static vars */ -struct adns_reply { - char hostnameMAX_HOSTLEN + 1; - host_addr_t addrs10; -}; + if ('\0' == pathname0) { + static wchar_t wpathnameMAX_PATH_LEN; + bool error = FALSE; + size_t pathsz = buf_size(b); -struct adns_reverse_reply { - char hostnameMAX_HOSTLEN + 1; - host_addr_t addr; -}; + if (0 == GetModuleFileNameW(NULL, wpathname, sizeof wpathname)) { + error = TRUE; + errno = mingw_last_error(); + s_warning("cannot locate my executable: %m"); + } else { + size_t conv = utf16_to_utf8(wpathname, pathname, pathsz); + if (conv > pathsz) { + error = TRUE; + s_carp("%s: cannot convert UTF-16 path into UTF-8", G_STRFUNC); + } + } -struct adns_request { - struct adns_common common; - union { - struct adns_query by_addr; - struct adns_reverse_query reverse; - } query; -}; + if (error) + g_strlcpy(pathname, G_DIR_SEPARATOR_S, buf_size(b)); -struct adns_response { - struct adns_common common; - union { - struct adns_reply by_addr; - struct adns_reverse_reply reverse; - } reply; -}; + offset = filepath_basename(pathname) - pathname; + } + + clamp_strcpy(&pathnameoffset, buf_size(b) - offset, filename); + + spinunlock_hidden(&nearby_slk); + + return pathname; +} -/* ADNS getaddrinfo */ /** - * ADNS getaddrinfo on ADNS thread. + * Check whether there is pending data for us to read on a pipe. */ -static void -mingw_adns_getaddrinfo_thread(struct async_data *ad) +static bool +mingw_fifo_pending(int fd) { - struct addrinfo *results; - const char *hostname = ad->thread_arg_data; - - if (common_dbg > 1) { - t_debug(altc, "ADNS resolving '%s'", hostname); - } - getaddrinfo(hostname, NULL, NULL, &results); + HANDLE h = (HANDLE) _get_osfhandle(fd); + DWORD pending; - if (common_dbg > 1) { - t_debug(altc, "ADNS got result for '%s' @%p", hostname, results); + if (INVALID_HANDLE_VALUE == h) + return FALSE; + + if (0 == PeekNamedPipe(h, NULL, 0, NULL, &pending, NULL)) { + errno = mingw_last_error(); + if (EPIPE == errno) + return TRUE; /* Let them read EOF */ + s_warning("peek failed for fd #%d: %m", fd); + return FALSE; } - ad->thread_return_data = results; + + return pending != 0; } /** - * ADNS getaddrinfo callback function. + * Check whether there is pending data for us to read on a tty / fifo stdin. */ -static void -mingw_adns_getaddrinfo_cb(struct async_data *ad) +bool +mingw_stdin_pending(bool fifo) { - struct adns_request *req; - struct addrinfo *response; - host_addr_t addrs10; - unsigned i; - - if (common_dbg > 2) - s_debug("mingw_adns_getaddrinfo_cb"); - - g_assert(ad); - g_assert(ad->user_data); - g_assert(ad->thread_arg_data); - - req = ad->user_data; - response = ad->thread_return_data; - - for (i = 0; i < G_N_ELEMENTS(addrs); i++) { - if (NULL == response) - break; - - addrsi = addrinfo_to_addr(response); - if (common_dbg) { - s_debug("ADNS got %s for hostname %s", - host_addr_to_string(addrsi), - (const char *) ad->thread_arg_data); - } - response = response->ai_next; - } - - { - adns_callback_t func = (adns_callback_t) req->common.user_callback; - g_assert(NULL != func); - if (common_dbg) { - s_debug("ADNS performing user-callback to %p with %u results", - req->common.user_data, i); - } - func(addrs, i, req->common.user_data); - } - - if (NULL != ad->thread_return_data) { - freeaddrinfo(ad->thread_return_data); - ad->thread_return_data = NULL; - } - HFREE_NULL(ad->thread_arg_data); - WFREE(ad); - HFREE_NULL(req); + return fifo ? mingw_fifo_pending(STDIN_FILENO) : booleanize(_kbhit()); } /** - * ADNS getaddrinfo. Retrieves DNS info by hostname. Returns multiple - * @see host_addr_t in the callbackfunction. - * - * Performs a hostname lookup on the ADNS thread. Thread function is set to - * @see mingw_adns_getaddrinfo_thread, which will call the - * @see mingw_adns_getaddrinfo_cb function on completion. The - * mingw_adns_getaddrinfo_cb is responsible for performing the user callback. - * - * @param req The adns request, where: - * - req->query.by_addr.hostname the hostname to lookup. - * - req->common.user_callback, a @see adns_callback_t callback function - * pointer. Raised on completion. - */ -static void -mingw_adns_getaddrinfo(const struct adns_request *req) -{ - struct async_data *ad; - - if (common_dbg > 2) { - s_debug("%s", G_STRFUNC); - } - g_assert(req); - g_assert(req->common.user_callback); - - WALLOC0(ad); - ad->thread_func = mingw_adns_getaddrinfo_thread; - ad->callback_func = mingw_adns_getaddrinfo_cb; - ad->user_data = hcopy(req, sizeof *req); - ad->thread_arg_data = h_strdup(req->query.by_addr.hostname); - - g_async_queue_push(mingw_gtkg_adns_async_queue, ad); + * Get file ID. + * + * @return TRUE on success. + */ +static bool +mingw_get_file_id(const char *pathname, uint64 *id) +{ + HANDLE h; + BY_HANDLE_FILE_INFORMATION fi; + bool ok; + pncs_t pncs; + + if (pncs_convert(&pncs, pathname)) + return FALSE; + + h = CreateFileW(pncs.utf16, 0, + FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, 0, NULL); + + if (INVALID_HANDLE_VALUE == h) + return FALSE; + + ok = 0 != GetFileInformationByHandle(h, &fi); + CloseHandle(h); + + if (!ok) + return FALSE; + + *id = (uint64) fi.nFileIndexHigh << 32 | (uint64) fi.nFileIndexLow; + + return TRUE; } -/* ADNS Get name info */ /** - * ADNS getnameinfo on ADNS thread. + * Are the two files sharing the same file ID? */ -static void -mingw_adns_getnameinfo_thread(struct async_data *ad) +bool +mingw_same_file_id(const char *pathname_a, const char *pathname_b) { - struct arg_data *arg_data = ad->thread_arg_data; - - getnameinfo(arg_data->sa, sizeof arg_data->u, - arg_data->hostname, sizeof arg_data->hostname, - arg_data->servinfo, sizeof arg_data->servinfo, - NI_NUMERICSERV); + uint64 ia, ib; - t_debug(altc, "ADNS resolved to %s", arg_data->hostname); + if (!mingw_get_file_id(pathname_a, &ia)) + return FALSE; + + if (!mingw_get_file_id(pathname_b, &ib)) + return FALSE; + + return ia == ib; } /** - * ADNS getnameinfo callback function. + * Compute default gateway address. + * + * @param ip where IPv4 gateway address is to be written + * + * @return 0 on success, -1 on failure with errno set. */ -static void -mingw_adns_getnameinfo_cb(struct async_data *ad) +int +mingw_getgateway(uint32 *ip) { - struct adns_request *req = ad->user_data; - struct arg_data *arg_data = ad->thread_arg_data; + MIB_IPFORWARDROW ipf; - if (common_dbg) { - s_debug("ADNS resolved to %s", arg_data->hostname); + ZERO(&ipf); + if (GetBestRoute(0, 0, &ipf) != NO_ERROR) { + errno = mingw_last_error(); + return -1; } - - { - adns_reverse_callback_t func = - (adns_reverse_callback_t) req->common.user_callback; - s_debug("ADNS getnameinfo performing user-callback to %p with %s", - req->common.user_data, arg_data->hostname); - func(arg_data->hostname, req->common.user_data); - } - - HFREE_NULL(req); - WFREE(arg_data); + + *ip = ntohl(ipf.dwForwardNextHop); + return 0; } +#ifdef EMULATE_GETTIMEOFDAY /** - * ADNS getnameinfo. Retrieves DNS info by ip address. Returns the hostname in - * the callbackfunction. - * - * Performs a reverse hostname lookup on the ADNS thread. Thread function is - * set to @see mingw_adns_getnameinfo_thread, which will call the - * @see mingw_adns_getnameinfo_cb function on completion. The - * mingw_adns_getnameinfo_cb is responsible for performing the user callback. - * - * @param req The adns request, where: - * - req->query.reverse.addr.net == @see NET_TYPE_IPV6 or - * @see NET_TYPE_IPV4 - * - req->query.addr.addr.ipv6 the ipv6 address if NET_TYPE_IPV6 - * - req->query.addr.addr.ipv4 the ipv4 address if NET_TYPE_IPV4 - * - req->common.user_callback, a @see adns_callback_t callback function - * pointer. Raised on completion. + * Get the current system time. + * + * @param tv the structure to fill with the current time. + * @param tz (unused) normally a "struct timezone" */ -static void -mingw_adns_getnameinfo(const struct adns_request *req) +int +mingw_gettimeofday(struct timeval *tv, void *tz) { - const struct adns_reverse_query *query = &req->query.reverse; - struct async_data *ad; - struct arg_data *arg_data; - - WALLOC0(ad); - WALLOC(arg_data); - ad->thread_func = mingw_adns_getnameinfo_thread; - ad->callback_func = mingw_adns_getnameinfo_cb; - ad->user_data = hcopy(req, sizeof *req); - ad->thread_arg_data = arg_data; - - switch (query->addr.net) { - struct sockaddr_in *inet4; - struct sockaddr_in6 *inet6; - case NET_TYPE_IPV6: - inet6 = &arg_data->u.sa_inet6; - inet6->sin6_family = AF_INET6; - memcpy(inet6->sin6_addr.s6_addr, query->addr.addr.ipv6, 16); - arg_data->sa = (const struct sockaddr *) inet6; - break; - case NET_TYPE_IPV4: - inet4 = &arg_data->u.sa_inet4; - inet4->sin_family = AF_INET; - inet4->sin_addr.s_addr = htonl(query->addr.addr.ipv4); - arg_data->sa = (const struct sockaddr *) inet4; - break; - case NET_TYPE_LOCAL: - case NET_TYPE_NONE: - g_assert_not_reached(); - break; - } + FILETIME ft; - g_async_queue_push(mingw_gtkg_adns_async_queue, ad); -} + (void) tz; /* We don't handle the timezone */ -/* ADNS Main thread */ + GetSystemTimeAsFileTime(&ft); -static void * -mingw_adns_thread(void *unused_data) -{ - GAsyncQueue *read_queue, *result_queue; - - /* On ADNS thread */ - (void) unused_data; + /* + * MSDN says that FILETIME contains a 64-bit value representing the number + * of 100-nanosecond intervals since January 1, 1601 (UTC). + * + * This is exactly 11644473600000000 usecs before the UNIX Epoch. + */ - read_queue = g_async_queue_ref(mingw_gtkg_adns_async_queue); - result_queue = g_async_queue_ref(mingw_gtkg_main_async_queue); - mingw_adns_thread_run = TRUE; - - while (mingw_adns_thread_run) { - struct async_data *ad = g_async_queue_pop(read_queue); + mingw_filetime_to_timeval(&ft, tv, EPOCH_OFFSET); - if (NULL == ad) - break; + return 0; +} +#endif /* EMULATE_GETTIMEOFDAY */ + +#ifdef EMULATE_CLOCK_GETTIME +/** + * Retrieve the time of the specified clock. + * + * @note + * Only the CLOCK_REALTIME clock is supported. + * + * @param clock_id the ID of the clock to fetch + * @param tp where the clock time should be written to + * + * @return 0 if OK, -1 on error with errno set. + */ +int +mingw_clock_gettime(int clock_id, struct timespec *tp) +{ + LARGE_INTEGER t; + static bool inited; + static LARGE_INTEGER start; + static LARGE_INTEGER freq; + static tm_nano_t origin; - ad->thread_func(ad); - g_async_queue_push(result_queue, ad); + if G_UNLIKELY(clock_id != CLOCK_REALTIME) { + errno = EINVAL; + return -1; } - if (common_dbg) { - t_message(altc, "adns thread exit"); + if G_UNLIKELY(!inited) { + static spinlock_t clock_gettime_slk = SPINLOCK_INIT; + + spinlock_hidden(&clock_gettime_slk); + + if (!inited) { + struct timeval tm; + + gettimeofday(&tm, NULL); + origin.tv_sec = tm.tv_sec; + origin.tv_nsec = tm.tv_usec * 1000; + QueryPerformanceCounter(&start); + QueryPerformanceFrequency(&freq); + inited = TRUE; + } + + spinunlock_hidden(&clock_gettime_slk); } - /* - * FIXME: The calls below cause a: - * - * assertion `g_atomic_int_get (&queue->ref_count) > 0' failed - * - * I'm wondering whether they are needed since the main thread does - * it and the queue could be disposed of by g_async_queue_pop() directly, - * given it can detect the queue became orphan.... - */ + if (!QueryPerformanceCounter(&t)) { + errno = EINVAL; + return -1; + } else { + uint64 nanoseconds; /* Elapsed nanoseconds since start */ + tm_nano_t result; -#if 0 - g_async_queue_unref(mingw_gtkg_adns_async_queue); - g_async_queue_unref(mingw_gtkg_main_async_queue); -#endif + t.QuadPart -= start.QuadPart; + nanoseconds = t.QuadPart * (uint64) TM_BILLION / freq.QuadPart; + result.tv_sec = nanoseconds / TM_BILLION; + result.tv_nsec = nanoseconds % TM_BILLION; + tm_precise_add(&result, &origin); + tm_nano_to_timespec(tp, &result); + } - g_thread_exit(NULL); - return NULL; + return 0; } +#endif /* EMULATE_CLOCK_GETTIME */ +#ifdef EMULATE_CLOCK_GETRES /** - * Shutdown the ADNS thread. + * Retrieve the resolution of the specified clock. + * + * @note + * Only the CLOCK_REALTIME clock is supported. + * + * @param clock_id the ID of the clock to fetch + * @param res where the clock resolution should be written to + * + * @return 0 if OK, -1 on error with errno set. */ -static void -mingw_adns_stop_thread(struct async_data *unused_data) +int +mingw_clock_getres(int clock_id, struct timespec *res) { - (void) unused_data; - mingw_adns_thread_run = FALSE; + LARGE_INTEGER freq; + ulong nanosecs; + + if G_UNLIKELY(clock_id != CLOCK_REALTIME) { + errno = EINVAL; + return -1; + } + + if (!QueryPerformanceFrequency(&freq)) { + errno = EINVAL; + return -1; + } + + nanosecs = (uint64) TM_BILLION / freq.QuadPart; + if (0 == nanosecs) + nanosecs = 1; + + res->tv_sec = nanosecs / TM_BILLION; + res->tv_nsec = nanosecs % TM_BILLION; + + return 0; } +#endif /* EMULATE_CLOCK_GETRES */ + +static hash_table_t *semaphores; /* semaphore sets by ID */ +static int next_semid; /* next ID we create */ +static spinlock_t sem_slk = SPINLOCK_INIT; + +/** + * A semaphore set. + */ +struct semset { + int count; /* amount of semaphores */ + int refcnt; /* amount of users in a sem*() call */ + int semid; /* semaphore set internal ID */ + HANDLE *handle; /* semaphore handles */ + int *token; /* tokens per semaphore */ + spinlock_t lock; /* thread-safe lock */ + uint destroyed:1; /* signals the semaphore was destroyed */ +}; -static gboolean -mingw_adns_timer(void *unused_arg) +static hash_table_t * +sem_table(void) { - struct async_data *ad = g_async_queue_try_pop(mingw_gtkg_main_async_queue); + if G_UNLIKELY(NULL == semaphores) { + static spinlock_t semaphores_slk = SPINLOCK_INIT; - (void) unused_arg; - - if (NULL != ad) { - if (common_dbg) { - s_debug("performing callback to func @%p", ad->callback_func); + spinlock(&semaphores_slk); + if (NULL == semaphores) { + semaphores = hash_table_once_new_full_real(NULL, NULL); + hash_table_thread_safe(semaphores); } - ad->callback_func(ad); - } + spinunlock(&semaphores_slk); + } - return TRUE; /* Keep calling */ + return semaphores; } -gboolean -mingw_adns_send_request(const struct adns_request *req) +static void +semset_destroy(struct semset *s) { - if (req->common.reverse) { - mingw_adns_getnameinfo(req); - } else { - mingw_adns_getaddrinfo(req); + int i; + + g_assert(spinlock_is_held(&s->lock)); + g_assert(0 == s->refcnt); + + spinlock_destroy(&s->lock); + + for (i = 0; i < s->count; i++) { + if (s->handlei != NULL) { + if (0 == CloseHandle(s->handlei)) { + errno = mingw_last_error(); + s_minicarp("%s(%d, IPC_RMID) cannot close handle " + "for semaphore #%d: %m", G_STRFUNC, s->semid, i); + /* Ignore error */ + } + } } - return TRUE; + + WFREE_ARRAY(s->handle, s->count); + WFREE_ARRAY(s->token, s->count); + WFREE(s); } -void -mingw_adns_init(void) +/* Must be a macro for proper spinlock source tracking */ +#define SEMSET_LOCK(s,y) G_STMT_START { \ + spinlock_swap(&(s)->lock, (y)); \ + atomic_int_inc(&(s)->refcnt); \ +} G_STMT_END + +static void +SEMSET_UNLOCK(struct semset *s) { - altc = log_thread_alloc(); /* Thread-private logging context */ + g_assert(spinlock_is_held(&s->lock)); + + /* + * Because we release the spinlock on the set before issuing a system call, + * we need to reference count the users of the semaphore set and defer + * cleanup of the structure until after the last user is gone. + */ - /* Be extremely careful in the ADNS thread! - * gtk-gnutella was designed as mono-threaded application so its regular - * routines are NOT thread-safe. Do NOT access any public functions or - * modify global variables from the ADNS thread! Dynamic memory - * allocation is absolutely forbidden. - */ - g_thread_init(NULL); - mingw_gtkg_main_async_queue = g_async_queue_new(); - mingw_gtkg_adns_async_queue = g_async_queue_new(); + if (1 == atomic_int_dec(&s->refcnt)) { + if G_UNLIKELY(s->destroyed) { + semset_destroy(s); + return; + } + } - g_thread_create(mingw_adns_thread, NULL, FALSE, NULL); - cq_periodic_main_add(1000, mingw_adns_timer, NULL); + spinunlock(&s->lock); } -void -mingw_adns_close(void) +int +mingw_semget(key_t key, int nsems, int semflg) { - /* Quit our ADNS thread */ - struct async_data *ad; + int id; + struct semset *s; + bool ok; - WALLOC0(ad); - ad->thread_func = mingw_adns_stop_thread; + g_assert_log(IPC_PRIVATE == key, + "%s() only supports IPC_PRIVATE keys", G_STRFUNC); - g_async_queue_push(mingw_gtkg_adns_async_queue, ad); + if (nsems < 0 || nsems > SEMMSL) { + errno = EINVAL; + return -1; + } - g_async_queue_unref(mingw_gtkg_adns_async_queue); - g_async_queue_unref(mingw_gtkg_main_async_queue); -} + if (0 == (semflg & IPC_CREAT)) { + errno = ENOENT; /* since we only support IPC_PRIVATE */ + return -1; + } -/*** End of ADNS section ***/ + id = next_semid++; + WALLOC0(s); + s->count = nsems; + s->semid = id; + WALLOC0_ARRAY(s->handle, nsems); + WALLOC0_ARRAY(s->token, nsems); + spinlock_init(&s->lock); -static const char * -mingw_get_folder_basepath(enum special_folder which_folder) + ok = hash_table_insert(sem_table(), int_to_pointer(id), s); + g_assert(ok); + + return id; +} + +int +mingw_semctl(int semid, int semnum, int cmd, ...) { - const char *special_path = NULL; + hash_table_t *sems = sem_table(); + struct semset *s; + va_list args; + int value, result = 0; + + spinlock(&sem_slk); + + s = hash_table_lookup(sems, int_to_pointer(semid)); + if (NULL == s) { + spinunlock(&sem_slk); + errno = EIDRM; + return -1; + } - switch (which_folder) { - case PRIVLIB_PATH: - special_path = mingw_filename_nearby( - "share" G_DIR_SEPARATOR_S PACKAGE); + /* + * This critical section crossing ensures that nobody can free up the + * semaphore set until we SEMSET_UNLOCK() it. The reference count is + * increased by SEMSET_LOCK(). + */ + + SEMSET_LOCK(s, &sem_slk); + spinunlock(&sem_slk); + + if (s->destroyed) { + errno = EIDRM; + result = -1; + goto done; + } + + switch (cmd) { + case IPC_RMID: + /* The semnum argument is ignored, hence not validated */ + s->destroyed = TRUE; /* Defer destruction until last user is gone */ + hash_table_remove(sems, int_to_pointer(semid)); break; - case NLS_PATH: - special_path = mingw_filename_nearby( - "share" G_DIR_SEPARATOR_S "locale"); + + case GETVAL: + if (semnum < 0 || semnum >= s->count) { + errno = ERANGE; + result = -1; + break; + } + + if (NULL == s->handlesemnum) { + result = 0; + } else { + result = s->tokensemnum; + } break; + + case SETVAL: + if (semnum < 0 || semnum >= s->count) { + errno = ERANGE; + result = -1; + break; + } + + /* + * The SETVAL command is our signal that the semaphore is initialized. + * Any previous existing handle is just closed. + */ + + if (s->handlesemnum != NULL) { + HANDLE h = s->handlesemnum; + BOOL r; + + spinunlock(&s->lock); + r = CloseHandle(h); + spinlock(&s->lock); + if (s->destroyed) { + errno = EIDRM; + result = -1; + break; + } else if (0 == r) { + errno = mingw_last_error(); + s_minicarp("%s(%d, SETVAL) cannot close semaphore #%d: %m", + G_STRFUNC, s->semid, semnum); + /* Ignore error */ + } + s->handlesemnum = NULL; + } + + va_start(args, cmd); + value = va_arg(args, int); + va_end(args); + + /* + * We release the lock but we do not call SEMSET_UNLOCK(), hence the + * reference count is not altered and this prevents any physical + * destruction of the object. + * + * However, once we release the lock we open the door for concurrent + * destruction of the semaphore set so we need to recheck for that + * condition once we re-enter the critical section. + */ + + spinunlock(&s->lock); + s->handlesemnum = CreateSemaphore(NULL, value, INT_MAX, NULL); + spinlock(&s->lock); + + if G_UNLIKELY(s->destroyed) { + errno = EIDRM; + result = -1; + } else if (NULL == s->handlesemnum) { + errno = mingw_last_error(); + result = -1; + } + + if G_UNLIKELY(-1 == result) { + /* Warn loudly since we use semaphores for inter-thread synchro */ + s_minicarp("%s(%d, SETVAL) cannot create new semaphore #%d: %m", + G_STRFUNC, s->semid, semnum); + } else { + s->tokensemnum = value; + } + break; + default: - s_warning("%s() needs implementation for foldertype %d", - G_STRFUNC, which_folder); + s_error("%s() only supports the GETVAL, SETVAL and IPC_RMID commands", + G_STRFUNC); } - return special_path; +done: + SEMSET_UNLOCK(s); + return result; } -/** - * Build pathname of file located nearby our executable. - * - * @return pointer to static data. - */ -const char * -mingw_filename_nearby(const char *filename) +int +mingw_semop(int semid, struct sembuf *sops, unsigned nsops) { - static char pathnameMAX_PATH_LEN; - static size_t offset; + return mingw_semtimedop(semid, sops, nsops, NULL); +} + +int +mingw_semtimedop(int semid, struct sembuf *sops, + unsigned nsops, struct timespec *timeout) +{ + DWORD ms; + struct semset *s; + int result = 0; + HANDLE h; + + g_assert_log(1 == nsops, + "%s() only supports operations on one semaphore at a time", G_STRFUNC); + + spinlock(&sem_slk); - /** - * FIXME: Unicode + s = hash_table_lookup(sem_table(), int_to_pointer(semid)); + if (NULL == s) { + spinunlock(&sem_slk); + errno = EIDRM; + return -1; + } + + /* + * This is the same critical handling as in mingw_semctl(). */ - if ('\0' == pathname0) { - if (0 == GetModuleFileName(NULL, pathname, sizeof pathname)) { - static gboolean done; - if (!done) { - done = TRUE; - errno = mingw_last_error(); - s_warning("cannot locate my executable: %m"); - } + + SEMSET_LOCK(s, &sem_slk); + spinunlock(&sem_slk); + + if (s->destroyed) { + errno = EIDRM; + result = -1; + goto done; + } + + if (NULL == sops) { + errno = EFAULT; + result = -1; + goto done; + } + + g_assert_log(0 != sops->sem_op, + "%s() does not support waiting for semaphores which reach zero", + G_STRFUNC); + + g_assert_log(0 == (sops->sem_flg & SEM_UNDO), + "%s() does not support SEM_UNDO", G_STRFUNC); + + if (sops->sem_num >= s->count) { + errno = EFBIG; + result = -1; + goto done; + } + + h = s->handlesops->sem_num; + + if (NULL == h) { + s_minicarp("%s(%d) called on un-initialized semaphore #%d", + G_STRFUNC, s->semid, sops->sem_num); + errno = EIDRM; + result = -1; + goto done; + } + + if (sops->sem_op > 0) { + BOOL r; + + /* + * We release the spinlock before calling ReleaseSemaphore() even if + * that call cannot block because we don't want to keep a lock across + * a system call. This opens a window for failure if another thread + * comes in and destroys the semaphore, but in that case our handle + * would become invalid. We trap that to transform EBADF into EIDRM. + * + * We update the token count before the system call to prevent a race + * condition with the waiting side which could be awoken before we + * re-grab the lock. + */ + + s->tokensops->sem_num += sops->sem_op; + + /* See comment in mingw_semctl() about the following sequence */ + + spinunlock(&s->lock); + r = ReleaseSemaphore(h, sops->sem_op, NULL); + spinlock(&s->lock); + + if G_UNLIKELY(s->destroyed) { + errno = EIDRM; + result = -1; + } else if (0 == r) { + errno = mingw_last_error(); + if (EBADF == errno) + errno = EIDRM; + result = -1; + } + if G_UNLIKELY(-1 == result) { + /* Fail loudly since semaphores are used for inter-thread synchro */ + s_minicarp("%s(%d, +%d) failed on semaphore #%d: %m", + G_STRFUNC, s->semid, sops->sem_op, sops->sem_num); + } + } else { + DWORD w; + + /* + * Acquiring semaphores is the tricky part because Windows does not + * support atomic acquisition of more than one token. + * + * Fortunately, we should only need increments of 1. + * --RAM, 2012-12-27 + */ + + g_assert_log(-1 == sops->sem_op, + "%s(): sorry, Windows does not support getting %d tokens at a time", + G_STRFUNC, -sops->sem_op); + + if (sops->sem_flg & IPC_NOWAIT) + ms = 0; + else if (timeout != NULL) + ms = timeout->tv_nsec / TM_MILLION + timeout->tv_sec * 1000; + else + ms = INFINITE; + + /* See comment in mingw_semctl() about the following sequence */ + + spinunlock(&s->lock); + thread_in_syscall_set(TRUE); + w = WaitForSingleObject(h, ms); + thread_in_syscall_set(FALSE); + spinlock(&s->lock); + + if G_UNLIKELY(s->destroyed) { + errno = EIDRM; + result = -1; + goto done; + } + + switch (w) { + case WAIT_OBJECT_0: + s->tokensops->sem_num--; + g_assert(s->tokensops->sem_num >= 0); + break; + case WAIT_TIMEOUT: + errno = EAGAIN; + result = -1; + break; + case WAIT_ABANDONED: /* Should not happen for a semaphore */ + default: + errno = mingw_last_error(); + s_minicarp("%s(%d): acquisition of semaphore failed: %m", + G_STRFUNC, s->semid); + result = -1; + break; } - offset = filepath_basename(pathname) - pathname; } - clamp_strcpy(&pathnameoffset, sizeof pathname - offset, filename); - return pathname; + /* FALL THROUGH */ +done: + SEMSET_UNLOCK(s); + return result; } -/** - * Check whether there is pending data for us to read on a pipe. - */ -static gboolean -mingw_fifo_pending(int fd) +void mingw_vmm_post_init(void) { - HANDLE h = (HANDLE) _get_osfhandle(fd); - DWORD pending; + void *cur_break = mingw_sbrk(0); - if (INVALID_HANDLE_VALUE == h) - return FALSE; + s_info("VMM process has %s of virtual space", + compact_size(mingw_vmm.available, FALSE)); + s_info("VMM reserved %s of virtual space at %p, %p", + compact_size(mingw_vmm.size, FALSE), + mingw_vmm.reserved, + ptr_add_offset(mingw_vmm.reserved, mingw_vmm.size)); + s_info("VMM left %s of virtual space unreserved", + compact_size(mingw_vmm.later, FALSE)); + s_info("VMM had %s already committed at startup", + compact_size(mingw_vmm.baseline, FALSE)); + s_info("VMM will be using %s of VM space at most", + compact_size(mingw_vmm.size + mingw_vmm.baseline, FALSE)); - if (0 == PeekNamedPipe(h, NULL, 0, NULL, &pending, NULL)) { - errno = mingw_last_error(); - if (EPIPE == errno) - return TRUE; /* Let them read EOF */ - s_warning("peek failed for fd #%d: %m", fd); - return FALSE; - } + /* + * On Windows, VM address space grows up, but starts far enough from + * the default process heap. So vmm_reserved > heap_break. + */ - return pending != 0; + s_info("VMM initial break at %p, leaving %s for the heap (%'zu bytes used)", + mingw_vmm.heap_break, + compact_size(ptr_diff(mingw_vmm.reserved, mingw_vmm.heap_break), FALSE), + ptr_diff(cur_break, mingw_vmm.heap_break)); } +void +mingw_init(void) +{ + ONCE_FLAG_RUN(mingw_socket_inited, mingw_socket_init); +} + +#ifdef MINGW_BACKTRACE_DEBUG +#define BACKTRACE_DEBUG(lvl, ...) \ + if ((lvl) & MINGW_BACKTRACE_FLAGS) s_minidbg(__VA_ARGS__) +#define mingw_backtrace_debug() 1 +#else +#define BACKTRACE_DEBUG(...) +#define mingw_backtrace_debug() 0 +#endif /* MINGW_BACKTRACE_DEBUG */ + +#define MINGW_MAX_ROUTINE_LENGTH 0x2000 +#define MINGW_FORWARD_SCAN 32 +#define MINGW_SP_ALIGN 4 +#define MINGW_SP_MASK (MINGW_SP_ALIGN - 1) +#define MINGW_EMPTY_STACKFRAME ((void *) 1) + +/* Debug flags for BACKTRACE_DEBUG */ +#define BACK_F_NAME (1 << 0) +#define BACK_F_PROLOGUE (1 << 1) +#define BACK_F_RA (1 << 2) +#define BACK_F_DRIVER (1 << 3) +#define BACK_F_OTHER (1 << 4) +#define BACK_F_DUMP (1 << 5) +#define BACK_F_RESULT (1 << 6) + +#define BACK_F_ALL \ + (BACK_F_NAME | BACK_F_PROLOGUE | BACK_F_RA | BACK_F_DRIVER | \ + BACK_F_OTHER | BACK_F_DUMP | BACK_F_RESULT) + +#define MINGW_BACKTRACE_FLAGS (BACK_F_DRIVER | BACK_F_RESULT | BACK_F_NAME) + +static inline bool +valid_ptr(const void * const p) +{ + ulong v = pointer_to_ulong(p); + return v > 0x1000 && v < 0xfffff000 && mem_is_valid_ptr(p); +} + +static inline bool +valid_stack_ptr(const void * const p, const void *top) +{ + ulong v = pointer_to_ulong(p); + + return 0 == (v & MINGW_SP_MASK) && vmm_is_stack_pointer(p, top); +} + +/* + * x86 leading instruction opcodes + */ +#define OPCODE_RET_NEAR 0xc3 +#define OPCODE_RET_FAR 0xcb +#define OPCODE_RET_NEAR_POP 0xc2 /* Plus pop immediate 16-bit amount */ +#define OPCODE_RET_FAR_POP 0xca /* Plus pop immediate 16-bit amount */ +#define OPCODE_NOP 0x90 +#define OPCODE_CALL 0xe8 +#define OPCODE_PUSH_EAX 0x50 +#define OPCODE_PUSH_ECX 0x51 +#define OPCODE_PUSH_EDX 0x52 +#define OPCODE_PUSH_EBX 0x53 +#define OPCODE_PUSH_ESP 0x54 +#define OPCODE_PUSH_EBP 0x55 +#define OPCODE_PUSH_ESI 0x56 +#define OPCODE_PUSH_EDI 0x57 +#define OPCODE_SUB_1 0x29 /* Substraction between registers */ +#define OPCODE_SUB_2 0x81 /* Need further probing for real opcode */ +#define OPCODE_SUB_3 0x83 /* Need further probing for real opcode */ +#define OPCODE_MOV_REG 0x89 /* Move one register to another */ +#define OPCODE_MOV_IMM_EAX 0xb8 /* Move immediate value to register EAX */ +#define OPCODE_MOV_IMM_ECX 0xb9 +#define OPCODE_MOV_IMM_EDX 0xba +#define OPCODE_MOV_IMM_EBX 0xbb +#define OPCODE_MOV_IMM_ESP 0xbc +#define OPCODE_MOV_IMM_EBP 0xbd +#define OPCODE_MOV_IMM_ESI 0xbe +#define OPCODE_MOV_IMM_EDI 0xbf +#define OPCODE_JMP_SHORT 0xeb /* Followed by signed byte */ +#define OPCODE_JMP_LONG 0xe9 /* Followed by signed 32-bit value */ +#define OPCODE_LEA 0x8d +#define OPCODE_XOR_1 0x31 /* Between registers if mod=3 */ +#define OPCODE_XOR_2 0x33 /* Complex XOR involving memory */ +#define OPCODE_NONE_1 0x26 /* Not a valid opcode */ +#define OPCODE_NONE_2 0x2e +#define OPCODE_NONE_3 0x36 +#define OPCODE_NONE_4 0x3E +#define OPCODE_NONE_5 0x64 +#define OPCODE_NONE_6 0x65 +#define OPCODE_NONE_7 0x66 +#define OPCODE_NONE_8 0x67 + +/* + * x86 follow-up instruction parsing + */ +#define OPMODE_MODE_MASK 0xc0 /* Mask to get a instruction mode code */ +#define OPMODE_OPCODE 0x38 /* Mask to extract extra opcode info */ +#define OPMODE_REG_SRC_MASK 0x38 /* Mask to extract source register */ +#define OPMODE_REG_DST_MASK 0x07 /* Mask to extract destination register */ +#define OPMODE_SUB 5 /* Extra opcode indicating a SUB */ +#define OPMODE_SUB_ESP 0xec /* Byte after leading opcode for SUB ESP */ +#define OPMODE_REG_ESP_EBP 0xe5 /* Byte after MOVL to move ESP to EBP */ + +/* + * x86 register numbers, as encoded in instructions. + */ +#define OPREG_EAX 0 +#define OPREG_ECX 1 +#define OPREG_EDX 2 +#define OPREG_EBX 3 +#define OPREG_ESP 4 +#define OPREG_EBP 5 +#define OPREG_ESI 6 +#define OPREG_EDI 7 + +static inline uint8 +mingw_op_mod_code(uint8 mbyte) +{ + return (mbyte & OPMODE_MODE_MASK) >> 6; +} + +static inline uint8 +mingw_op_src_register(uint8 mbyte) +{ + return (mbyte & OPMODE_REG_SRC_MASK) >> 3; +} + +static inline uint8 +mingw_op_dst_register(uint8 mbyte) +{ + return mbyte & OPMODE_REG_DST_MASK; +} + +#define MINGW_TEXT_OFFSET 0x1000 /* Text offset after mapping base */ + +#define MINGW_ROUTINE_ALIGN 4 +#define MINGW_ROUTINE_MASK (MINGW_ROUTINE_ALIGN - 1) + +#define mingw_routine_align(x) ulong_to_pointer( \ + (pointer_to_ulong(x) + MINGW_ROUTINE_MASK) & ~MINGW_ROUTINE_MASK) + /** - * Check whether there is pending data for us to read on a tty / fifo stdin. + * Expected unwinding stack frame, if present and maintained by routines. */ -gboolean -mingw_stdin_pending(gboolean fifo) +struct stackframe { + struct stackframe *next; + void *ret; +}; + +#ifdef MINGW_BACKTRACE_DEBUG +/** + * @return opcode leading mnemonic string. + */ +static const char * +mingw_opcode_name(uint8 opcode) { - return fifo ? mingw_fifo_pending(STDIN_FILENO) : _kbhit(); + switch (opcode) { + case OPCODE_RET_NEAR: + case OPCODE_RET_FAR: + case OPCODE_RET_NEAR_POP: + case OPCODE_RET_FAR_POP: + return "RET"; + case OPCODE_NOP: + return "NOP"; + case OPCODE_CALL: + return "CALL"; + case OPCODE_PUSH_EAX: + case OPCODE_PUSH_EBX: + case OPCODE_PUSH_ECX: + case OPCODE_PUSH_EDX: + case OPCODE_PUSH_ESP: + case OPCODE_PUSH_EBP: + case OPCODE_PUSH_ESI: + case OPCODE_PUSH_EDI: + return "PUSH"; + case OPCODE_MOV_REG: + case OPCODE_MOV_IMM_EAX: + case OPCODE_MOV_IMM_EBX: + case OPCODE_MOV_IMM_ECX: + case OPCODE_MOV_IMM_EDX: + case OPCODE_MOV_IMM_ESP: + case OPCODE_MOV_IMM_EBP: + case OPCODE_MOV_IMM_ESI: + case OPCODE_MOV_IMM_EDI: + return "MOV"; + case OPCODE_JMP_SHORT: + case OPCODE_JMP_LONG: + return "JMP"; + case OPCODE_LEA: + return "LEA"; + case OPCODE_XOR_1: + case OPCODE_XOR_2: + return "XOR"; + case OPCODE_NONE_1: + case OPCODE_NONE_2: + case OPCODE_NONE_3: + case OPCODE_NONE_4: + case OPCODE_NONE_5: + case OPCODE_NONE_6: + case OPCODE_NONE_7: + case OPCODE_NONE_8: + default: + return "?"; + } } +#endif /* MINGW_BACKTRACE_DEBUG */ /** - * Get file ID. + * Computes the length taken by the versatile LEA instruction. * - * @return TRUE on success. + * @param op pointer to the LEA opcode */ -static gboolean -mingw_get_file_id(const char *pathname, guint64 *id) +static unsigned +mingw_opcode_lea_length(const uint8 *op) { - HANDLE h; - BY_HANDLE_FILE_INFORMATION fi; - gboolean ok; - pncs_t pncs; + uint8 mode, reg; - if (pncs_convert(&pncs, pathname)) - return FALSE; + g_assert(OPCODE_LEA == *op); - h = CreateFileW(pncs.utf16, 0, - FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, OPEN_EXISTING, 0, NULL); + mode = mingw_op_mod_code(op1); + reg = mingw_op_dst_register(op1); - if (INVALID_HANDLE_VALUE == h) - return FALSE; - - ok = 0 != GetFileInformationByHandle(h, &fi); - CloseHandle(h); + switch (mode) { + case 0: + /* + * ``reg'' encodes the following: + * + * 4 = sib (32-bit SIB Byte follows) + * 5 = disp32 + * others = register + */ - if (!ok) - return FALSE; + if (4 == reg) { + return 3; + } if (5 == reg) { + return 6; + } else { + return 2; + } + g_assert_not_reached(); + case 1: + /* + * ``reg'' encodes the following: + * + * 4 = sib + disp8 + * others = register + disp8 + */ - *id = (guint64) fi.nFileIndexHigh << 32 | (guint64) fi.nFileIndexLow; + if (4 == reg) { + return 4; + } else { + return 3; + } + g_assert_not_reached(); + case 2: + /* + * ``reg'' encodes the following: + * + * 4 = sib + disp32 + * others = register + disp32 + */ + if (4 == reg) { + return 7; + } else { + return 6; + } + g_assert_not_reached(); + case 3: + return 2; + default: + break; + } - return TRUE; + g_assert_not_reached(); + return 0; } /** - * Are the two files sharing the same file ID? + * Is the SUB opcode pointed at by ``op'' targetting ESP? */ -gboolean -mingw_same_file_id(const char *pathname_a, const char *pathname_b) +static bool +mingw_opcode_is_sub_esp(const uint8 *op) { - guint64 ia, ib; + const uint8 *p = op; + uint8 mbyte = p1; - if (!mingw_get_file_id(pathname_a, &ia)) - return FALSE; + BACKTRACE_DEBUG(BACK_F_OTHER, + "%s: op=0x%x, next=0x%x", G_STRFUNC, *op, mbyte); + + switch (*op) { + case OPCODE_SUB_1: + return OPREG_ESP == mingw_op_dst_register(mbyte); + case OPCODE_SUB_2: + case OPCODE_SUB_3: + { + uint8 code = mingw_op_src_register(mbyte); + uint8 mode = mingw_op_mod_code(mbyte); + if (code != OPMODE_SUB || mode != 3) + return FALSE; /* Not a SUB opcode targeting a register */ + return OPREG_ESP == mingw_op_dst_register(mbyte); + } + } - if (!mingw_get_file_id(pathname_b, &ib)) - return FALSE; + g_assert_not_reached(); +} - return ia == ib; +/** + * Scan forward looking for one of the SUB instructions that can substract + * a value from the ESP register. + * + * This can be one of (Intel notation): + * + * SUB ESP, <value> ; short stack reserve + * SUB ESP, EAX ; large stack reserve + * + * @param start initial program counter + * @param max absolute maximum PC value + * @param at_start known to be at the starting point of the routine + * @param has_frame set to TRUE if we saw a frame linking at the beginning + * @param savings indicates leading register savings done by the routine + * + * @return pointer to the start of the SUB instruction, NULL if we can't + * find it, meaning the starting point was probably not the start of + * a routine, MINGW_EMPTY_STACKFRAME if there is no SUB instruction. + */ +static const void * +mingw_find_esp_subtract(const void *start, const void *max, bool at_start, + bool *has_frame, size_t *savings) +{ + const void *maxscan; + const uint8 *p = start; + const uint8 *first_opcode = p; + bool saved_ebp = FALSE, mov_immediate_eax = FALSE; + size_t pushes = 0, calls = 0; + + maxscan = const_ptr_add_offset(start, MINGW_FORWARD_SCAN); + if (ptr_cmp(maxscan, max) > 0) + maxscan = max; + + if (mingw_backtrace_debug() && (BACK_F_DUMP & MINGW_BACKTRACE_FLAGS)) { + s_minidbg("%s: next %zu bytes after pc=%p%s", + G_STRFUNC, 1 + ptr_diff(maxscan, p), + p, at_start ? " (known start)" : ""); + dump_hex(stderr, "", p, 1 + ptr_diff(maxscan, p)); + } + + for (p = start; ptr_cmp(p, maxscan) <= 0; p++) { + const void *window; + uint8 op; + unsigned fill = 0; + + if (!valid_ptr(p)) + return NULL; + + switch ((op = *p)) { + case OPCODE_NONE_1: + case OPCODE_NONE_2: + case OPCODE_NONE_3: + case OPCODE_NONE_4: + case OPCODE_NONE_5: + case OPCODE_NONE_6: + case OPCODE_NONE_7: + case OPCODE_NONE_8: + case OPCODE_NOP: + fill = 1; + goto filler; + case OPCODE_LEA: + /* + * Need to decode further to know how many bytes are taken + * by this versatile instruction. + */ + fill = mingw_opcode_lea_length(p); + goto filler; + case OPCODE_PUSH_EBP: + /* + * The frame pointer is saved if the routine begins with (Intel + * notation): + * + * PUSH EBP + * MOV EBP, ESP + * + * to create the frame pointer link. + * + * When using the Windows call API, the EBP register is saved + * immediately at entry, but more registers can be saved as well + * before the ESP is altered (so the EBP value immediately follows + * the return PC pushed on the stack by the CALL instruction). + */ + first_opcode = p + 1; /* Expects the MOV operation to follow */ + if (0 == pushes) + saved_ebp = TRUE; /* EBP was the first to be pushed */ + /* FALL THROUGH */ + case OPCODE_PUSH_EAX: + case OPCODE_PUSH_EBX: + case OPCODE_PUSH_ECX: + case OPCODE_PUSH_EDX: + case OPCODE_PUSH_ESP: + case OPCODE_PUSH_ESI: + case OPCODE_PUSH_EDI: + pushes++; + break; + case OPCODE_MOV_IMM_EAX: + mov_immediate_eax = TRUE; + /* FALL THROUGH */ + case OPCODE_MOV_IMM_EBX: + case OPCODE_MOV_IMM_ECX: + case OPCODE_MOV_IMM_EDX: + case OPCODE_MOV_IMM_ESP: + case OPCODE_MOV_IMM_EBP: + case OPCODE_MOV_IMM_ESI: + case OPCODE_MOV_IMM_EDI: + p += 4; /* Skip immediate value */ + break; + case OPCODE_MOV_REG: + if (OPMODE_REG_ESP_EBP == p1) + saved_ebp = saved_ebp || p == first_opcode; + p += 1; /* Skip mode byte */ + break; + case OPCODE_CALL: + /* + * Stackframe link created, no stack adjustment + * + * If this is the first CALL instruction and we have seen + * a "MOV EAX, val" (move immediate value into EAX), then + * we need to continue a little bit because this is the + * pattern generated by gcc for large stack frames: + * + * movl $65564, %eax + * call ___chkstk_ms + * subl %eax, %esp + * + * If we have not seen this pattern or this is the second + * CALL we see, assume there is no stack pointer adjustment + * when we saw a leading "PUSH EBB" instruction already. + */ + calls++; + if (saved_ebp && !(1 == calls && mov_immediate_eax)) + return MINGW_EMPTY_STACKFRAME; + p += 4; /* Skip offset */ + break; + case OPCODE_XOR_1: + if (OPMODE_MODE_MASK == (OPMODE_MODE_MASK & p1)) { + /* XOR between registers, same register to zero it */ + uint8 operands = p1; + uint8 reg1 = mingw_op_src_register(operands); + uint8 reg2 = mingw_op_dst_register(operands); + if (reg1 == reg2) { + p += 1; + break; + } + } + /* XOR REG, REG is the only instruction we allow in the prologue */ + return NULL; + case OPCODE_SUB_1: + case OPCODE_SUB_2: + case OPCODE_SUB_3: + if (mingw_opcode_is_sub_esp(p)) { + *has_frame = saved_ebp; + *savings = pushes; + return p; + } + switch (*p) { + case OPCODE_SUB_1: + p += 1; + break; + case OPCODE_SUB_2: + p += 5; + break; + case OPCODE_SUB_3: + p += 2; + break; + } + break; + default: + /* + * If we're not on an aligned routine starting point, assume + * this is part of a filling instruction and ignore, provided + * we haven't seen any PUSH yet. + */ + if (0 == pushes && !at_start && p != mingw_routine_align(p)) { + fill = 1; + goto filler; + } + return NULL; + } + + continue; + + filler: + /* + * Handle "filling" instructions between last RET / JMP and + * the next routine Move the scanning window forward to avoid + * counting filling instructions. + */ + + BACKTRACE_DEBUG(BACK_F_OTHER, + "%s: ignoring %s filler (%u byte%s) at %p", G_STRFUNC, + mingw_opcode_name(op), fill, plural(fill), p); + + first_opcode = p + fill; + p += (fill - 1); + window = const_ptr_add_offset(maxscan, fill); + if (ptr_cmp(window, max) <= 0) + maxscan = window; + } + + return NULL; } /** - * Compute default gateway address. + * Parse beginning of routine to know how many registers are saved, whether + * there is a leading frame being formed, and how large the stack is. * - * @param ip where IPv4 gateway address is to be written + * @param pc starting point + * @param max maximum PC we accept to scan forward + * @param at_start known to be at the starting point of the routine + * @param has_frame set to TRUE if we saw a frame linking at the beginning + * @param savings indicates leading register savings done by the routine + * @param offset computed stack offsetting * - * @return 0 on success, -1 on failure with errno set. + * @return TRUE if ``pc'' pointed to a recognized function prologue. */ -int -mingw_getgateway(guint32 *ip) +static bool +mingw_analyze_prologue(const void *pc, const void *max, bool at_start, + bool *has_frame, size_t *savings, unsigned *offset) { - MIB_IPFORWARDROW ipf; + const uint8 *sub; - ZERO(&ipf); - if (GetBestRoute(0, 0, &ipf) != NO_ERROR) { - errno = mingw_last_error(); - return -1; + if (ptr_cmp(pc, max) >= 0) + return FALSE; + + sub = mingw_find_esp_subtract(pc, max, at_start, has_frame, savings); + + if (MINGW_EMPTY_STACKFRAME == sub) { + BACKTRACE_DEBUG(BACK_F_PROLOGUE, + "%s: no SUB operation at pc=%p, %s frame", + G_STRFUNC, pc, *has_frame ? "with" : "no"); + *offset = 0; + return TRUE; + } else if (sub != NULL) { + uint8 op; + + BACKTRACE_DEBUG(BACK_F_PROLOGUE, + "%s: found SUB operation at " + "pc=%p, opcode=0x%x, mod=0x%x, %s frame", + G_STRFUNC, sub, sub0, sub1, *has_frame ? "with" : "no"); + + switch (*sub) { + case OPCODE_SUB_1: + /* + * This is the pattern used by gcc for large stacks. + * + * (Note this uses AT&T syntax, not the Intel one, so + * order is source, destination as opposed to the regular + * Intel convention) + * + * movl $65564, %eax + * call ___chkstk_ms + * subl %eax, %esp + * + * We found the last instruction, we need to move back 10 + * bytes to reach the MOV instruction + */ + + op = *(sub - 10); + if (op != OPCODE_MOV_IMM_EAX) + return FALSE; + + *offset = peek_le32(sub - 9); /* Read immediate offset of MOVL */ + goto check_offset; + case OPCODE_SUB_2: + /* subl $220, %esp */ + g_assert(OPMODE_SUB_ESP == sub1); + *offset = peek_le32(sub + 2); + goto check_offset; + case OPCODE_SUB_3: + /* subl $28, %esp */ + g_assert(OPMODE_SUB_ESP == sub1); + *offset = peek_u8(sub + 2); + goto check_offset; + } + g_assert_not_reached(); } - *ip = ntohl(ipf.dwForwardNextHop); - return 0; -} + return FALSE; -void -mingw_init(void) -{ - WSADATA wsaData; +check_offset: + /* + * Offsets must be a multiple of 4. Otherwise, we're not parsing + * the opcodes correctly, or rather they are not what we think + * they are (random garbage due to wrong location, for instance). + */ - if G_UNLIKELY(mingw_inited) - return; + if (0 == (*offset & 3)) + return TRUE; - mingw_inited = TRUE; + BACKTRACE_DEBUG(BACK_F_PROLOGUE, + "%s: offset was %u, not a multiple of 4 bytes, " + "pc=%p, opcode=0x%x, mod=0x%x", + G_STRFUNC, *offset, sub, sub0, sub1); - if (WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR) - s_error("WSAStartup() failed"); - - libws2_32 = LoadLibrary(WS2_LIBRARY); - if (libws2_32 != NULL) { - WSAPoll = (WSAPoll_func_t) GetProcAddress(libws2_32, "WSAPoll"); - } + return FALSE; } -static int -mingw_stack_fill(void **buffer, int size, CONTEXT *c, int skip) -{ - STACKFRAME s; - DWORD image; - HANDLE proc, thread; - int i; +/** + * Intuit return address given current PC and SP. + * + * Uses black magic: disassembles the code on the fly knowing the gcc + * initial function patterns to look for the instruction that alters the SP. + * + * @attention + * This is not perfect and based on heuristics. Changes in the compiler + * generation pattern may break this routine. Moreover, backtracing through + * a routine using alloca() will not work because the initial stack reserve is + * later altered, so the stack pointer in any routine that it calls will be + * perturbed and will not allow correct reading of the return address. + * + * @param next_pc where next PC is written + * @param next_sp where next SP is written + * @param next_sf where next SF is written, NULL if none seen + * + * @return TRUE if we were able to recognize the start of the routine and + * compute the proper stack offset, FALSE otherwise. + */ +static bool +mingw_get_return_address(const void **next_pc, const void **next_sp, + const void **next_sf) +{ + const void *pc = *next_pc; + const void *sp = *next_sp; + const uint8 *p; + unsigned offset = 0; + bool has_frame = FALSE; + size_t savings = 0; - proc = GetCurrentProcess(); - thread = GetCurrentThread(); + BACKTRACE_DEBUG(BACK_F_RA, "%s: pc=%p, sp=%p", G_STRFUNC, pc, sp); - ZERO(&s); + /* + * If we can determine the start of the routine, get there first. + * + * We substract 1 because when the return address is pushed, it is + * after the previous instruction (a CALL or a JMP) and when calling + * a non-returning routine, the pc will lie outside the routine and + * will point to the next routine in the code. + */ + + p = stacktrace_routine_start(pc - 1); + + if (p != NULL && valid_ptr(p)) { + BACKTRACE_DEBUG(BACK_F_NAME | BACK_F_RA, + "%s: known routine start for pc=%p is %p (%s)", + G_STRFUNC, pc, p, stacktrace_routine_name(p, TRUE)); + + if (mingw_analyze_prologue(p, pc, TRUE, &has_frame, &savings, &offset)) + goto found_offset; + + BACKTRACE_DEBUG(BACK_F_RA, + "%s: %p does not seem to be a valid prologue, scanning", + G_STRFUNC, p); + } else { + BACKTRACE_DEBUG(BACK_F_NAME | BACK_F_RA, + "%s: pc=%p falls in %s from %s", G_STRFUNC, pc, + stacktrace_routine_name(pc, TRUE), dl_util_get_path(pc)); + } /* - * We're MINGW32, so even on a 64-bit processor we're going to run - * in 32-bit mode, using WOW64 support (if running on a 64-bit Windows). + * Scan backwards to find a previous RET / JMP / NOP / LEA instruction. + */ + + for (p = pc; ptr_diff(pc, p) < MINGW_MAX_ROUTINE_LENGTH; /* empty */) { + uint8 op, pop; + + const uint8 *next; + + if (!valid_ptr(p) || !valid_ptr(p - 1)) + return FALSE; + + /* + * Because this is a CISC processor, single-byte opcodes could actually + * be part of a longer 2-byte instruction. A likely candidate we want + * to avoid is a MOV between registers, where the second byte would + * encode the registers. + */ + + pop = *(p - 1); + if (OPCODE_MOV_REG == pop) { + BACKTRACE_DEBUG(BACK_F_RA, + "%s: skipping %s operation at pc=%p, opcode=0x%x (after a MOV)", + G_STRFUNC, mingw_opcode_name(*p), p, *p); + goto next; + } + + switch ((op = *p)) { + case OPCODE_LEA: + next = p + mingw_opcode_lea_length(p); + break; + case OPCODE_NOP: + case OPCODE_RET_NEAR: + case OPCODE_RET_FAR: + next = p + 1; + break; + case OPCODE_RET_NEAR_POP: + case OPCODE_RET_FAR_POP: + next = p + 3; /* Skip next immediate 16-bit offset */ + break; + case OPCODE_JMP_SHORT: + next = p + 2; /* Skip 8-bit offset */ + break; + case OPCODE_JMP_LONG: + next = p + 5; /* Skip 32-bit target */ + break; + default: + goto next; + } + + BACKTRACE_DEBUG(BACK_F_RA, + "%s: found %s operation at pc=%p, opcode=0x%x", + G_STRFUNC, mingw_opcode_name(op), p, op); + + /* + * Could have found a byte that is part of a longer opcode, since + * the x86 has variable-length instructions. + * + * Scan forward for a SUB instruction targetting the ESP register. + */ + + if ( + mingw_analyze_prologue(next, pc, FALSE, + &has_frame, &savings, &offset) + ) + goto found_offset; + + next: + p--; + } + + return FALSE; + +found_offset: + g_assert(0 == (offset & 3)); /* Multiple of 4 */ + + BACKTRACE_DEBUG(BACK_F_RA, "%s: offset = %u, %zu leading push%s", + G_STRFUNC, offset, savings, plural_es(savings)); + + /* + * We found that the current routine decreased the stack pointer by + * ``offset'' bytes upon entry. It is expected to increase the stack + * pointer by the same amount before returning, at which time it will + * pop from the stack the return address. + * + * This is what we're computing now, to find out the return address + * that is on the stack. * - * FIXME: How is this going to behave on AMD64? There's no definition - * of a context for this machine, and I can't test it. - * --RAM, 2011-01-12 + * Once it pops the return address, the processor will also increase the + * stack pointer by 4 bytes, so this will be the value of ESP upon return. + * + * Moreover, if we have seen a "PUSH EBP; MOV EBP, ESP" sequence at the + * beginning, then the stack frame pointer was maintained by the callee. + * In AT&T syntax (which reverses the order of arguments compared to the + * Intel notation, becoming source, destination) used by gas, that would be: + * + * pushl %ebp + * movl %esp, %ebp ; frame linking now established + * subl $56, %esp ; reserve 56 bytes on the stack */ - image = IMAGE_FILE_MACHINE_I386; - s.AddrPC.Offset = c->Eip; - s.AddrPC.Mode = AddrModeFlat; - s.AddrStack.Offset = c->Esp; - s.AddrStack.Mode = AddrModeFlat; - s.AddrFrame.Offset = c->Ebp; - s.AddrFrame.Mode = AddrModeFlat; + offset += 4 * savings; + sp = const_ptr_add_offset(sp, offset); - i = 0; + if (has_frame) { + const void *sf, *fp; + g_assert(savings >= 1); + sf = const_ptr_add_offset(sp, -4); + fp = ulong_to_pointer(peek_le32(sf)); + if (ptr_cmp(fp, sp) <= 0) { + BACKTRACE_DEBUG(BACK_F_RA, + "%s: inconsistent fp %p (\"above\" sp %p)", G_STRFUNC, fp, sp); + has_frame = FALSE; + } else if (!vmm_is_stack_pointer(fp, sf)) { + BACKTRACE_DEBUG(BACK_F_RA, + "%s: invalid fp %p (not a stack pointer)", G_STRFUNC, fp); + has_frame = FALSE; + } + *next_sf = has_frame ? fp : NULL; + } else { + *next_sf = NULL; + } - while ( - i < size && - StackWalk(image, proc, thread, &s, &c, NULL, NULL, NULL, NULL) + *next_pc = ulong_to_pointer(peek_le32(sp)); /* Pushed return address */ + + if (!valid_ptr(*next_pc)) + return FALSE; + + *next_sp = const_ptr_add_offset(sp, 4); /* After popping return address */ + + if ( + mingw_backtrace_debug() && + (BACK_F_RA & MINGW_BACKTRACE_FLAGS) && + has_frame ) { - if (0 == s.AddrPC.Offset) + const struct stackframe *sf = *next_sf; + s_minidbg("%s: next frame at %p " + "(contains next=%p, ra=%p), computed ra=%p", + G_STRFUNC, sf, sf->next, sf->ret, *next_pc); + } + + return TRUE; +} + +/** + * Unwind the stack, using the saved context to gather the initial program + * counter, stack pointer and stack frame pointer. + * + * @param buffer where function addresses are written to + * @param size amount of entries in supplied buffer + * @param c saved CPU context + * @param offset topmost frames to skip + */ +static int +mingw_stack_unwind(void **buffer, int size, CONTEXT *c, int skip) +{ + int i = 0; + const struct stackframe *sf; + const void *sp, *pc, *top; + + /* + * We used to rely on StackWalk() here, but we no longer do because + * it did not work well and failed to provide useful stacktraces. + * + * Neither does blind following of frame pointers because some routines + * simply do not bother to maintain the frame pointers, especially + * those known by gcc as being non-returning routines such as + * assertion_abort(). Plain stack frame following could not unwind + * past that. + * + * Since it is critical on Windows to obtain a somewhat meaningful + * stack frame to be able to debug anything, given the absence of + * core dumps (for post-mortem analysis) and of fork() (for launching + * a debugger to obtain the stack trace), extraordinary measures were + * called for... + * + * Therefore, we now perform our own unwinding which does not rely on + * plain stack frame pointer following but rather (minimally) + * disassembles the routine prologues to find out how many stack + * space is used by each routine, so that we can find where the + * caller pushed the return address on the stack. + * + * When the start of a routine is not known, the code attempts to + * guess where it may be by scanning backwards until it finds what + * is probably the end of the previous routine. Since the x86 is a + * CISC machine with a variable-length instruction set, this operation + * cannot be entirely fool-proof, since the opcodes used for RET or + * JMP instructions could well be actually parts of immediate operands + * given to some other instruction. + * + * Hence there is logic to determine whether the initial starting point + * is actually a valid routine prologue, relying on what we know gcc + * can use before it adjusts the stack pointer. + * + * Despite being a hack because it is based on known routine generation + * patterns from gcc, it works surprisingly well and, in any case, is + * far more useful than the original code that used StackWalk(), or + * the simple gcc unwinding which merely follows frame pointers. + * --RAM, 2012-03-19 + */ + + sf = ulong_to_pointer(c->Ebp); + sp = ulong_to_pointer(c->Esp); + pc = ulong_to_pointer(c->Eip); + + BACKTRACE_DEBUG(BACK_F_DRIVER, + "%s: pc=%p, sf=%p, sp=%p skip %d (current SP=%p)", + G_STRFUNC, pc, sf, sp, skip, &i); + + if (0 == skip--) { + BACKTRACE_DEBUG(BACK_F_RESULT, + "%s: pushing %p at i=%d", G_STRFUNC, pc, i); + bufferi++ = deconstify_pointer(pc); + } + + if (!valid_stack_ptr(sp, sp)) + goto done; + + top = sp; + + while (i < size) { + const void *next = NULL; + + BACKTRACE_DEBUG(BACK_F_DRIVER, + "%s: i=%d, sp=%p, sf=%p, pc=%p", G_STRFUNC, i, sp, sf, pc); + + if (!valid_ptr(pc) || !valid_stack_ptr(sp, top)) break; - if (skip-- > 0) - continue; + if (!valid_stack_ptr(sf, top) || ptr_cmp(sf, sp) <= 0) + sf = NULL; + + if (!mingw_get_return_address(&pc, &sp, &next)) { + if (sf != NULL) { + BACKTRACE_DEBUG(BACK_F_DRIVER, + "%s: trying to follow sf=%p", G_STRFUNC, sf); + + next = sf->next; + if (!valid_ptr(sf->ret)) + break; + + pc = sf->ret; + sp = &sf1; /* After popping returned value */ + + BACKTRACE_DEBUG(BACK_F_DRIVER, + "%s: following frame: next sf=%p, pc=%p, rebuilt sp=%p", + G_STRFUNC, next, pc, sp); + + if (!valid_stack_ptr(next, top) || ptr_cmp(next, sf) <= 0) + next = NULL; + } else { + BACKTRACE_DEBUG(BACK_F_DRIVER, "%s: out of frames", G_STRFUNC); + break; + } + } else { + int d; + + BACKTRACE_DEBUG(BACK_F_DRIVER, + "%s: intuited next pc=%p, sp=%p, rebuilt sf=%p old sf=%p", + G_STRFUNC, pc, sp, next, sf); + + /* + * Leave frame pointer intact if the stack pointer is still + * smaller than the last frame pointer: it means the routine + * that we backtraced through did not save a frame pointer, so + * it would have been invisible if we had followed the frame + * pointer. + */ + + d = (NULL == sf) ? 0 : ptr_cmp(sp, sf); + + if (d < 0) { + BACKTRACE_DEBUG(BACK_F_DRIVER, + "%s: keeping old sf=%p, since sp=%p", G_STRFUNC, sf, sp); + next = sf; + } else if (d > 0) { + if (sp == &sf1) { + BACKTRACE_DEBUG(BACK_F_DRIVER, + "%s: reached sf=%p at sp=%p, next sf=%p, current ra=%p", + G_STRFUNC, sf, sp, sf->next, sf->ret); + if (NULL == next && valid_stack_ptr(sf->next, top)) + next = sf->next; + } + } + } + + if (skip-- <= 0) { + BACKTRACE_DEBUG(BACK_F_RESULT, + "%s: pushing %p at i=%d", G_STRFUNC, pc, i); + bufferi++ = deconstify_pointer(pc); + } - bufferi++ = ulong_to_pointer(s.AddrPC.Offset); + sf = next; } +done: + BACKTRACE_DEBUG(BACK_F_DRIVER, "%s: returning %d", G_STRFUNC, i); + return i; } +/** + * Fill supplied buffer with current stack, skipping the topmost frames. + * + * @param buffer where function addresses are written to + * @param size amount of entries in supplied buffer + * @param offset topmost frames to skip + * + * @return amount of entries written into buffer. + */ int -mingw_backtrace(void **buffer, int size) +mingw_backtrace(void **buffer, int size, size_t offset) { CONTEXT c; HANDLE thread; @@ -2875,18 +7498,177 @@ GetThreadContext(thread, &c); + return mingw_stack_unwind(buffer, size, &c, offset); +} + +#ifdef EMULATE_DLADDR +static int mingw_dl_error; + +/** + * Return a human readable string describing the most recent error + * that occurred. + */ +const char * +mingw_dlerror(void) +{ + return g_strerror(mingw_dl_error); +} + +/** + * Emulates linux's dladdr() routine. + * + * Given a function pointer, try to resolve name and file where it is located. + * + * If no symbol matching addr could be found, then dli_sname and dli_saddr are + * set to NULL. + * + * @param addr pointer within function + * @param info where results are returned + * + * @return 0 on error, non-zero on success. + */ +int +mingw_dladdr(void *addr, Dl_info *info) +{ + static time_t last_init; + static wchar_t wpathMAX_PATH_LEN; + static char buffersizeof(IMAGEHLP_SYMBOL) + 256; + static mutex_t dladdr_lk = MUTEX_INIT; + static spinlock_t dladdr_slk = SPINLOCK_INIT; + buf_t *b = buf_private(G_STRFUNC, MAX_PATH_LEN); + char *path = buf_data(b); + size_t pathsz = buf_size(b); + buf_t *name = buf_private("mingw_dladdr:name", 255); + time_t now; + HANDLE process = NULL; + IMAGEHLP_SYMBOL *symbol = (IMAGEHLP_SYMBOL *) buffer; + DWORD disp = 0; + /* - * Experience shows we have to skip the first 2 frames to get a - * correct stack frame. + * Do not issue a SymInitialize() too often, yet let us do one from time + * to time in case we loaded a new DLL since last time. + * + * Unfortunately, MinGW does not provide SymRefreshModuleList() to + * refresh the module list, so we have to SymCleanup() and SymInitialize() + * periodically. + * + * When called during a crash, do not attempt to refresh the symbols via + * a SymCleanup() / SymInitialize(): use the symbols we already have. */ - return mingw_stack_fill(buffer, size, &c, 2); + now = tm_time(); + + if ( + 0 == last_init || + (delta_time(now, last_init) > 60 && !signal_in_exception()) + ) { + static bool initialized; + static bool first_init; + static spinlock_t dladdr_first_slk = SPINLOCK_INIT; + bool is_first = FALSE; + + spinlock_hidden(&dladdr_first_slk); + if (!first_init) { + is_first = TRUE; + first_init = TRUE; + } + spinunlock_hidden(&dladdr_first_slk); + + if (is_first) { + mutex_lock_fast(&dladdr_lk); + } else { + if (!mutex_trylock_fast(&dladdr_lk)) + goto skip_init; + } + + process = GetCurrentProcess(); + + if (initialized) + SymCleanup(process); + + if (!SymInitialize(process, NULL, TRUE)) { + mingw_dl_error = GetLastError(); + s_warning("SymInitialize() failed: error = %d (%s)", + mingw_dl_error, mingw_dlerror()); + } else { + initialized = TRUE; + mingw_dl_error = 0; + } + + last_init = now; + mutex_unlock_fast(&dladdr_lk); + } + +skip_init: + ZERO(info); + + if (0 != mingw_dl_error) + return 0; /* Signals error */ + + if (NULL == addr) + return 1; /* OK */ + + if (NULL == process) + process = GetCurrentProcess(); + + info->dli_fbase = ulong_to_pointer( + SymGetModuleBase(process, pointer_to_ulong(addr))); + + if (NULL == info->dli_fbase) { + mingw_dl_error = GetLastError(); + return 0; /* Unknown, error */ + } + + /* + * A spinlock is OK to protect the critical section below because we're + * not expecting any recursion: the routines we call out should not + * allocate memory nor create assertion failures (which would definitely + * create recursion to dump the stack!). + * + * Note that path or symbol name information are returned in a private + * buffer so that two threads can concurrently request dladdr() and yet + * be able to get their own results back. + */ + + spinlock_hidden(&dladdr_slk); /* Protect access to static vars */ + + if (GetModuleFileNameW((HINSTANCE) info->dli_fbase, wpath, sizeof wpath)) { + size_t conv = utf16_to_utf8(wpath, path, pathsz); + if (conv <= pathsz) + info->dli_fname = path; /* Thread-private buffer */ + } + + symbol->SizeOfStruct = sizeof buffer; + symbol->MaxNameLength = buf_size(name); + + /* + * The SymGetSymFromAddr() is mono-threaded, as explained on MSDN, + * but we're running under spinlock protection. + */ + + if (SymGetSymFromAddr(process, pointer_to_ulong(addr), &disp, symbol)) { + g_strlcpy(buf_data(name), symbol->Name, buf_size(name)); + info->dli_sname = buf_data(name); /* Thread-private buffer */ + info->dli_saddr = ptr_add_offset(addr, -disp); + } + + spinunlock_hidden(&dladdr_slk); /* Protect access to static vars */ + + /* + * Windows offsets the actual loading of the text by MINGW_TEXT_OFFSET + * bytes, as determined empirically. + */ + + info->dli_fbase = ptr_add_offset(info->dli_fbase, MINGW_TEXT_OFFSET); + + return 1; /* OK */ } +#endif /* EMULATE_DLADDR */ /** * Convert exception code to string. */ -static G_GNUC_COLD const char * +static const char * G_COLD mingw_exception_to_string(int code) { switch (code) { @@ -2910,66 +7692,94 @@ case EXCEPTION_PRIV_INSTRUCTION: return "Privileged instruction"; case EXCEPTION_NONCONTINUABLE_EXCEPTION:return "Continued after exception"; case EXCEPTION_INVALID_DISPOSITION: return "Invalid disposition"; + case EXCEPTION_GUARD_PAGE: return "Guard page hit"; default: return "Unknown exception"; } } +/* + * Format an error message to propagate into the crash log. + */ +static void G_COLD +mingw_crash_record(int code, const void *pc, + const char *routine, const char *file) +{ + char data256; + str_t s; + + str_new_buffer(&s, data, 0, sizeof data); + str_printf(&s, "%s at PC=%p", mingw_exception_to_string(code), pc); + + if (routine != NULL) + str_catf(&s, " (%s)", routine); + + if (file != NULL) + str_catf(&s, " from %s", file); + + crash_set_error(str_2c(&s)); +} + /** * Log reported exception. */ -static G_GNUC_COLD void -mingw_exception_log(int code, const void *pc) +static void G_COLD +mingw_exception_log(int stid, uint code, const void *pc) { - DECLARE_STR(9); - char time_buf18; - const char *name; + DECLARE_STR(13); + char time_bufCRASH_TIME_BUFLEN; + char bufULONG_DEC_BUFLEN; + const char *s, *name, *file = NULL; crash_time(time_buf, sizeof time_buf); - name = stacktrace_routine_name(pc, TRUE); + name = stacktrace_routine_name(pc, EXCEPTION_STACK_OVERFLOW != code); if (is_strprefix(name, "0x")) name = NULL; - print_str(time_buf); /* 0 */ - print_str(" (CRITICAL): received exception at PC=0x"); /* 1 */ - print_str(pointer_to_string(pc)); /* 2 */ - if (name != NULL) { - print_str(" ("); /* 3 */ - print_str(name); /* 4 */ - print_str(")"); /* 5 */ - } - print_str(": "); /* 6 */ - print_str(mingw_exception_to_string(code)); /* 7 */ - print_str("\n"); /* 8 */ - - flush_err_str(); - if (log_stdout_is_distinct()) - flush_str(STDOUT_FILENO); + if (!stacktrace_pc_within_our_text(pc) && EXCEPTION_STACK_OVERFLOW != code) + file = dl_util_get_path(pc); - /* - * Format an error message to propagate into the crash log. - */ + print_str(time_buf); /* 0 */ + print_str(" (CRITICAL-"); /* 1 */ + if (stid < 0) + stid += 256; + s = PRINT_NUMBER(buf, stid); + print_str(s); /* 2 */ + print_str("): received exception at PC="); /* 3 */ + print_str(pointer_to_string(pc)); /* 4 */ + if (name != NULL) { + print_str(" ("); /* 5 */ + print_str(name); /* 6 */ + print_str(")"); /* 7 */ + } + if (file != NULL) { + print_str(" from "); /* 8 */ + print_str(file); /* 9 */ + } + print_str(": "); /* 10 */ + print_str(mingw_exception_to_string(code)); /* 11 */ + print_str("\n"); /* 12 */ - { - char data128; + FLUSH_ERR_STR(); - str_bprintf(data, sizeof data, "%s at PC=%p%s%s%s", - mingw_exception_to_string(code), pc, - NULL == name ? "" : " (", - NULL == name ? "" : name, - NULL == name ? "" : ")"); - crash_set_error(data); + switch (code) { + case EXCEPTION_STACK_OVERFLOW: + case EXCEPTION_GUARD_PAGE: + break; + default: + mingw_crash_record(code, pc, name, file); } } /** * Log extra information on memory faults. */ -static G_GNUC_COLD void -mingw_memory_fault_log(const EXCEPTION_RECORD *er) +static void G_COLD +mingw_memory_fault_log(int stid, const EXCEPTION_RECORD *er) { - DECLARE_STR(6); - char time_buf18; - const char *prot = "unknown"; + DECLARE_STR(8); + char time_bufCRASH_TIME_BUFLEN; + char bufULONG_DEC_BUFLEN; + const char *s, *prot = "unknown"; const void *va = NULL; if (er->NumberParameters >= 2) { @@ -2983,16 +7793,19 @@ crash_time(time_buf, sizeof time_buf); - print_str(time_buf); /* 0 */ - print_str(" (CRITICAL): memory fault ("); /* 1 */ - print_str(prot); /* 2 */ - print_str(") at VA=0x"); /* 3 */ - print_str(pointer_to_string(va)); /* 4 */ - print_str("\n"); /* 5 */ - - flush_err_str(); - if (log_stdout_is_distinct()) - flush_str(STDOUT_FILENO); + print_str(time_buf); /* 0 */ + print_str(" (CRITICAL-"); /* 1 */ + if (stid < 0) + stid += 256; + s = PRINT_NUMBER(buf, stid); + print_str(s); /* 2 */ + print_str("): memory fault ("); /* 3 */ + print_str(prot); /* 4 */ + print_str(") at VA="); /* 5 */ + print_str(pointer_to_string(va)); /* 6 */ + print_str("\n"); /* 7 */ + + FLUSH_ERR_STR(); /* * Format an additional error message to propagate into the crash log. @@ -3006,61 +7819,52 @@ } } -static volatile sig_atomic_t in_exception_handler; static void *mingw_stackSTACKTRACE_DEPTH_MAX; - -int -mingw_in_exception(void) -{ - return in_exception_handler; -} +static uint8 mingw_excptTHREAD_MAX; /** * Our default exception handler. */ -static G_GNUC_COLD LONG WINAPI +static LONG WINAPI G_COLD mingw_exception(EXCEPTION_POINTERS *ei) { EXCEPTION_RECORD *er; - int signo = 0; + int stid, signo = 0; + const void *sp; + + signal_crashing(); - in_exception_handler = 1; /* Will never be reset, we're crashing */ er = ei->ExceptionRecord; + sp = ulong_to_pointer(ei->ContextRecord->Esp); - /* - * Don't use too much stack if we're facing a stack overflow. - * We'll emit a short message below in that case. - * - * However, apparently the exceptions are delivered on a distinct stack. - * It may be very samll, for all we know, so still be cautious. - */ + stid = thread_safe_small_id_sp(sp); /* Should be safe to execute */ + if (stid >= 0 && stid < THREAD_MAX) + mingw_excptstid++; + + s_rawwarn("%s in thread #%d at pc=%p, sp=%p, current sp=%p " + "depth=%u, count=%d", + mingw_exception_to_string(er->ExceptionCode), + stid, er->ExceptionAddress, sp, thread_sp(), + (stid >= 0 && stid < THREAD_MAX) ? mingw_excptstid : 0, + signal_in_exception()); - if (EXCEPTION_STACK_OVERFLOW != er->ExceptionCode) - mingw_exception_log(er->ExceptionCode, er->ExceptionAddress); + mingw_exception_log(stid, er->ExceptionCode, er->ExceptionAddress); switch (er->ExceptionCode) { case EXCEPTION_BREAKPOINT: case EXCEPTION_SINGLE_STEP: signo = SIGTRAP; break; + case EXCEPTION_GUARD_PAGE: case EXCEPTION_STACK_OVERFLOW: - /* - * With a stack overflow, we may not be able to continue very - * far, so log the fact as soon as possible. - */ - { - DECLARE_STR(1); - - print_str("Got stack overflow -- crashing.\n"); - flush_err_str(); - if (log_stdout_is_distinct()) - flush_str(STDOUT_FILENO); - } + signal_uncrashing(); /* In case we thread_exit() */ + thread_stack_check_overflow(sp); + signal_crashing(); signo = SIGSEGV; break; case EXCEPTION_ACCESS_VIOLATION: case EXCEPTION_IN_PAGE_ERROR: - mingw_memory_fault_log(er); + mingw_memory_fault_log(stid, er); /* FALL THROUGH */ case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: signo = SIGSEGV; @@ -3085,29 +7889,10 @@ break; case EXCEPTION_NONCONTINUABLE_EXCEPTION: case EXCEPTION_INVALID_DISPOSITION: - { - DECLARE_STR(1); - - print_str("Got fatal exception -- crashing.\n"); - flush_err_str(); - if (log_stdout_is_distinct()) - flush_str(STDOUT_FILENO); - } + s_rawwarn("got fatal exception -- crashing."); break; default: - { - char bufULONG_DEC_BUFLEN; - const char *s; - DECLARE_STR(3); - - s = print_number(buf, sizeof buf, er->ExceptionCode); - print_str("Got unknown exception #"); /* 0 */ - print_str(s); /* 1 */ - print_str(" -- crashing.\n"); /* 2 */ - flush_err_str(); - if (log_stdout_is_distinct()) - flush_str(STDOUT_FILENO); - } + s_rawwarn("got unknown exception #%lu -- crashing.", er->ExceptionCode); break; } @@ -3124,17 +7909,34 @@ * time the exception occurred. When calling mingw_sigraise(), the * default crash handler will print the exception stack (the current one) * which will prove rather useless. + * + * We only attempt to unwind the stack when we're hitting the first + * exception: recursive calls are not interesting. */ - { - int count = mingw_stack_fill(mingw_stack, G_N_ELEMENTS(mingw_stack), - ei->ContextRecord, 0); + if ( + EXCEPTION_STACK_OVERFLOW != er->ExceptionCode && + ( + (stid >= 0 && stid < THREAD_MAX && 1 == mingw_excptstid) || + 1 == signal_in_exception() + ) + ) { + int count; + + count = mingw_stack_unwind( + mingw_stack, N_ITEMS(mingw_stack), ei->ContextRecord, 0); - stacktrace_stack_safe_print(STDERR_FILENO, mingw_stack, count); + stacktrace_stack_safe_print(STDERR_FILENO, stid, mingw_stack, count); if (log_stdout_is_distinct()) - stacktrace_stack_safe_print(STDOUT_FILENO, mingw_stack, count); + stacktrace_stack_safe_print(STDOUT_FILENO, stid, mingw_stack, count); - crash_save_stackframe(mingw_stack, count); + crash_save_stackframe(stid, mingw_stack, count); + } else if (signal_in_exception() > 5) { + DECLARE_STR(1); + + print_str("Too many exceptions in a row -- raising SIGBART.\n"); + FLUSH_ERR_STR(); + signo = SIGABRT; } /* @@ -3142,24 +7944,28 @@ */ if (signo != 0) - mingw_sigraise(signo); + mingw_sigraise(signo, TRUE); + + signal_uncrashing(); + if (stid >= 0 && stid < THREAD_MAX) + mingw_excptstid--; return EXCEPTION_CONTINUE_SEARCH; } -void mingw_invalid_parameter(const wchar_t * expression, +static inline void WINAPI +mingw_invalid_parameter(const wchar_t * expression, const wchar_t * function, const wchar_t * file, unsigned int line, - uintptr_t pReserved) + uintptr_t pReserved) { (void) expression; (void) function; (void) pReserved; - + wprintf(L"mingw: Invalid parameter in %s %s:%d\r\n", function, file, line); } #ifdef EMULATE_SBRK -static void *initial_break; static void *current_break; /** @@ -3170,15 +7976,25 @@ mingw_get_break(void) { void *p; + HANDLE h = GetProcessHeap(); + + /* + * We try to allocate a large amount of memory (1 MiB) to avoid the call + * from returning a "fragment" in the heap, and force the allocator to + * get more core, thereby knowing the upper limit. + */ - p = HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, 1); + p = HeapAlloc(h, 0, 1024 * 1024); + + if G_UNLIKELY(NULL == p) + p = HeapAlloc(h, 0, 4096); /* A page, at least */ if (NULL == p) { errno = ENOMEM; return (void *) -1; } - HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, p); + HeapFree(h, 0, p); return p; } @@ -3198,12 +8014,11 @@ if (0 == incr) { p = mingw_get_break(); - if G_UNLIKELY(NULL == initial_break) { - initial_break = current_break = p; - } - return p; + if G_UNLIKELY(p != (void *) -1) + current_break = p; + return current_break; } else if (incr > 0) { - p = HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, incr); + p = HeapAlloc(GetProcessHeap(), 0, incr); if (NULL == p) { errno = ENOMEM; @@ -3212,9 +8027,6 @@ end = ptr_add_offset(p, incr); - if G_UNLIKELY(NULL == initial_break) - initial_break = current_break = p; - if (ptr_cmp(end, current_break) > 0) current_break = end; @@ -3244,32 +8056,11 @@ } #endif /* EMULATE_SBRK */ -#ifdef MINGW_STARTUP_DEBUG -static FILE * -getlog(gboolean initial) -{ - return fopen("gtkg-log.txt", initial ? "wb" : "ab"); -} - -#define STARTUP_DEBUG(...) G_STMT_START { \ - if (lf != NULL) { \ - fprintf(lf, __VA_ARGS__); \ - fputc('\n', lf); \ - } \ -} G_STMT_END - -#else /* !MINGW_STARTUP_DEBUG */ -#define getlog(x) NULL -#define STARTUP_DEBUG(...) -#endif /* MINGW_STARTUP_DEBUG */ - static char mingw_stdout_buf1024; /* Used as stdout buffer */ -static G_GNUC_COLD void -mingw_stdio_reset(FILE *lf, gboolean console) +static void G_COLD +mingw_stdio_reset(bool console) { - (void) lf; /* In case no MINGW_STARTUP_DEBUG */ - /* * A note on setvbuf(): * @@ -3283,7 +8074,7 @@ if (console) { int tty; - + tty = isatty(STDIN_FILENO); STARTUP_DEBUG("stdin is%s a tty", tty ? "" : "n't"); if (tty) { @@ -3305,8 +8096,8 @@ /* stdout to a terminal is line-buffered */ setvbuf(stdout, mingw_stdout_buf, _IOLBF, sizeof mingw_stdout_buf); STARTUP_DEBUG("forced stdout (fd=%d) to buffered " - "(%zu bytes) binary mode", - fileno(stdout), sizeof mingw_stdout_buf); + "(%lu bytes) binary mode", + fileno(stdout), (ulong) sizeof mingw_stdout_buf); } else { setmode(fileno(stdout), O_BINARY); STARTUP_DEBUG("forced stdout (fd=%d) to binary mode", @@ -3332,36 +8123,84 @@ close(STDOUT_FILENO); close(STDERR_FILENO); STARTUP_DEBUG("stdio fully reset"); + + freopen("NUL", "rb", stdin); + STARTUP_DEBUG("stdin reopened from NUL"); + + freopen("NUL", "wb", stdout); + STARTUP_DEBUG("stdout reopened to NUL"); + + freopen("NUL", "wb", stderr); + STARTUP_DEBUG("stderr reopened to NUL"); + } +} + +/** + * Rotate pathname at startup time, renaming existing paths with a .0, .1, .2 + * extension, etc..., up to the maximum specified. + */ +void G_COLD +mingw_file_rotate(const char *pathname, int keep) +{ + static char npathMAX_PATH_LEN; + int i; + + if (keep > 0) { + str_bprintf(npath, sizeof npath, "%s.%d", pathname, keep - 1); + if (-1 != mingw_unlink(npath)) + STARTUP_DEBUG("removed file \"%s\"", npath); } + + for (i = keep - 1; i > 0; i--) { + static char opathMAX_PATH_LEN; + str_bprintf(opath, sizeof opath, "%s.%d", pathname, i - 1); + str_bprintf(npath, sizeof npath, "%s.%d", pathname, i); + if (-1 != mingw_rename(opath, npath)) + STARTUP_DEBUG("file \"%s\" renamed as \"%s\"", opath, npath); + } + + str_bprintf(npath, sizeof npath, "%s.0", pathname); + + if (-1 != mingw_rename(pathname, npath)) + STARTUP_DEBUG("file \"%s\" renamed as \"%s\"", pathname, npath); } -G_GNUC_COLD void +void G_COLD mingw_early_init(void) { int console_err; - FILE *lf = getlog(TRUE); - STARTUP_DEBUG("starting"); + getlog(TRUE); + + STARTUP_DEBUG("starting PID %d", getpid()); + STARTUP_DEBUG("logging on fd=%d", fileno(mingw_debug_lf)); #if __MSVCRT_VERSION__ >= 0x800 + STARTUP_DEBUG("configured invalid parameter handler"); _set_invalid_parameter_handler(mingw_invalid_parameter); #endif /* Disable any Windows pop-up on crash or file access error */ SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); + STARTUP_DEBUG("disabled Windows crash pop-up"); /* Trap all unhandled exceptions */ SetUnhandledExceptionFilter(mingw_exception); + STARTUP_DEBUG("configured exception handler"); + + STARTUP_DEBUG("initializing virtual memory..."); + mingw_vmm_init(); + STARTUP_DEBUG("done!"); _fcloseall(); + getlog(FALSE); - lf = getlog(FALSE); STARTUP_DEBUG("attempting AttachConsole()..."); if (AttachConsole(ATTACH_PARENT_PROCESS)) { STARTUP_DEBUG("AttachConsole() succeeded"); - mingw_stdio_reset(lf, TRUE); + mingw_stdio_reset(TRUE); } else { console_err = GetLastError(); @@ -3371,20 +8210,42 @@ case ERROR_INVALID_HANDLE: case ERROR_GEN_FAILURE: /* We had no console, and we got no console. */ - mingw_stdio_reset(lf, FALSE); - freopen("NUL", "rb", stdin); + mingw_stdio_reset(FALSE); { const char *pathname; + /* + * The stdout/stderr files which are created when GTKG is + * not launched from a console are auto-rotated on startup. + * However, if restarting automatically after a crash, we may + * not be able to perform the renaming (you know, Windows + * usually refuses to rename an opened file). + * + * Therefore, it is probably safest to always open stdout and + * stderr for appending. + */ + pathname = mingw_getstdout_path(); - freopen(pathname, "wb", stdout); - log_set(LOG_STDOUT, pathname); - STARTUP_DEBUG("stdout (unbuffered) sent to %s", pathname); + STARTUP_DEBUG("stdout file will be %s", pathname); + mingw_file_rotate(pathname, MINGW_TRACEFILE_KEEP); + STARTUP_DEBUG("stdout files rotated"); + if (NULL != freopen(pathname, "ab", stdout)) { + log_set(LOG_STDOUT, pathname); + STARTUP_DEBUG("stdout (unbuffered) reopened"); + } else { + STARTUP_DEBUG("could not reopen stdout"); + } pathname = mingw_getstderr_path(); - freopen(pathname, "wb", stderr); - log_set(LOG_STDERR, pathname); - STARTUP_DEBUG("stderr (unbuffered) sent to %s", pathname); + STARTUP_DEBUG("stderr file will be %s", pathname); + mingw_file_rotate(pathname, MINGW_TRACEFILE_KEEP); + STARTUP_DEBUG("stderr files rotated"); + if (NULL != freopen(pathname, "ab", stderr)) { + log_set(LOG_STDERR, pathname); + STARTUP_DEBUG("stderr (unbuffered) reopened"); + } else { + STARTUP_DEBUG("could not reopen stderr"); + } } break; case ERROR_ACCESS_DENIED: @@ -3397,23 +8258,39 @@ } } - if (lf != NULL) - fclose(lf); + /* + * Compute our parent PID immediately to avoid races later on, should + * its PID slot be reused at the time they call getppid(). + */ + +#ifdef EMULATE_GETPPID + (void) mingw_getppid(); +#endif /* EMULATE_GETPPID */ set_folder_basepath_func(mingw_get_folder_basepath); + win32dlp_init(mingw_vmm.reserved, mingw_vmm.size); + + closelog(); } -void +void mingw_close(void) { - mingw_adns_close(); - if (libws2_32 != NULL) { FreeLibrary(libws2_32); - + libws2_32 = NULL; WSAPoll = NULL; } + + if (mingw_launched != NULL) { + size_t cnt = dualhash_count(mingw_launched); + + if (0 != cnt) { + s_warning("%s(): still has %zu child process%s unwaited for", + G_STRFUNC, cnt, plural_es(cnt)); + } + } } #endif /* MINGW32 */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/mingw32.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/mingw32.h
Changed
@@ -37,11 +37,8 @@ #ifdef MINGW32 -#define FD_SETSIZE 4096 - -#ifndef WINVER -#define WINVER 0x0501 -#endif +#define MINGW_TRACEFILE_KEEP 3 /* Keep logs for that many past runs */ +#define FD_SETSIZE 4096 /* Max # of descriptors for select() */ #include <ws2tcpip.h> @@ -52,7 +49,8 @@ #include <sys/stat.h> #include <glib.h> -#include "signal.h" /* For signal_handler_t */ +#include "signal.h" /* For signal_handler_t */ +#include "compat_gettid.h" /* For systid_t */ /* * Winsock to UNIX symbolic error code remapping. @@ -87,6 +85,7 @@ #define EPROTOTYPE WSAEPROTOTYPE #define ESTALE WSAESTALE #define ETIMEDOUT WSAETIMEDOUT +#define ESHUTDOWN WSAESHUTDOWN #define EOVERFLOW ERROR_ARITHMETIC_OVERFLOW /* EOVERFLOW missing */ @@ -112,6 +111,7 @@ #define PROT_NONE 0x0 #define PROT_READ 0x1 #define PROT_WRITE 0x2 +#define PROT_GUARD 0x4 /* Windows-specific, see mingw_mprotect() */ #define O_NONBLOCK 0 @@ -133,6 +133,10 @@ #define signal(n, h) mingw_signal((n), (h)) +#ifndef SIGEMT +#define SIGEMT 7 /* Simulated, unassigned signal number in MingGW32 */ +#endif + #ifndef SIGBUS #define SIGBUS 10 /* Simulated, unassigned signal number in MinGW32 */ #endif @@ -141,9 +145,13 @@ #define SIGTRAP 12 /* Simulated, unassigned signal number in MinGW32 */ #endif -#define getppid() 1 +#ifndef SIGPIPE +#define SIGPIPE 13 /* Simulated, unassigned signal number in MinGW32 */ +#endif + #define fcntl mingw_fcntl #define ffs __builtin_ffs +#define sleep mingw_sleep #define select mingw_select #define socket mingw_socket @@ -156,13 +164,22 @@ #define shutdown mingw_shutdown #define s_writev mingw_s_writev #define s_readv mingw_s_readv +#define socketpair mingw_socketpair +#ifndef HAS_SOCKETPAIR +#define EMULATE_SOCKETPAIR +#define HAS_SOCKETPAIR +#endif /* !HAS_SOCKETPAIR */ + +#define gethostname mingw_gethostname #define getaddrinfo mingw_getaddrinfo #define freeaddrinfo mingw_freeaddrinfo +#undef stat +#undef fstat #define stat(path, buf) mingw_stat((path), (buf)) #define fstat(fd, buf) mingw_fstat((fd), (buf)) -#define unlink(path) mingw_unlink((path)) +#define unlink(path) mingw_unlink(path) #define open mingw_open #define fopen mingw_fopen #define freopen mingw_freopen @@ -170,12 +187,14 @@ #define readdir mingw_readdir #define closedir mingw_closedir #define dup2 mingw_dup2 +#define dup(f) mingw_dup(f) #define lseek mingw_lseek #define read mingw_read #define readv mingw_readv #define write mingw_write #define writev mingw_writev #define truncate mingw_truncate +#define recv mingw_recv #define sendto mingw_sendto #define recvfrom mingw_recvfrom @@ -190,10 +209,16 @@ #undef getdtablesize #define getdtablesize mingw_getdtablesize #define mkdir mingw_mkdir +#define rmdir mingw_rmdir #define access mingw_access #define chdir mingw_chdir #define remove mingw_remove #define pipe mingw_pipe +#define getrlimit mingw_getrlimit + +#define execve mingw_execve +#define launchve mingw_launchve +#define spopenve mingw_spopenve #define abort() mingw_abort() @@ -231,25 +256,117 @@ }; struct flock { - short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */ - short int l_whence; /* Where `l_start' is relative to (like `lseek'). */ - fileoffset_t l_start; /* Offset where the lock begins. */ - fileoffset_t l_len; /* Size of the locked area; zero means until EOF. */ - pid_t l_pid; /* Process holding the lock. */ + short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK */ + short int l_whence; /* Where `l_start' is relative to (like `lseek') */ + fileoffset_t l_start; /* Offset where the lock begins */ + fileoffset_t l_len; /* Size of the locked area; zero means until EOF */ + pid_t l_pid; /* Process holding the lock */ }; -struct mingw_statvfs { - unsigned long f_csize; /* Cluster size, in bytes */ - unsigned long f_cavail; /* Available clusters */ - unsigned long f_clusters; /* Total amount of clusters */ +/* + * statvfs() emulation. + */ + +#ifndef HAS_STATVFS +#define HAS_STATVFS /* We emulate it */ +#endif +typedef unsigned long fsblkcnt_t; +typedef unsigned long fsfilcnt_t; + +#define statvfs mingw_statvfs /* Aliases both struct and routine */ + +#define ST_RDONLY (1U << 0) /* Read-only file system */ +#define ST_NOSUID (1U << 1) /* Setuid/setgid bits are ignored by exec() */ + +struct statvfs { + unsigned long f_bsize; /* file system block size */ + unsigned long f_frsize; /* fragment size */ + fsblkcnt_t f_blocks; /* size of fs in f_frsize units */ + fsblkcnt_t f_bfree; /* # free blocks */ + fsblkcnt_t f_bavail; /* # free blocks for unprivileged users */ + fsfilcnt_t f_files; /* # inodes */ + fsfilcnt_t f_ffree; /* # free inodes */ + fsfilcnt_t f_favail; /* # free inodes for unprivileged users */ + unsigned long f_fsid; /* file system ID */ + unsigned long f_flag; /* mount flags */ + unsigned long f_namemax; /* maximum filename length */ }; +int mingw_statvfs(const char *pathname, struct statvfs *buf); + #ifndef HAS_GETLOGIN #define HAS_GETLOGIN /* We emulate it */ #endif /* + * getuid(), geteuid(), etc... emulation. + */ +#define HAS_GETUID +#define HAS_GETEUID + +typedef unsigned long uid_t; +uid_t mingw_getuid(void); +uid_t mingw_geteuid(void); + +#define getuid() mingw_getuid() +#define geteuid() mingw_geteuid() + +#define UID_NOBODY ((uid_t) -2) + +typedef unsigned long gid_t; +gid_t mingw_getgid(void); +gid_t mingw_getegid(void); + +#define getgid() mingw_getgid() +#define getegid() mingw_getegid() + +#define GID_NOBODY ((gid_t) -2) + +/* + * getrlimit() emulation. + */ +#ifndef HAS_GETRLIMIT +#define HAS_GETRLIMIT /* We emulate it */ +#define EMULATE_GETRLIMIT + +#define RLIMIT_CORE 1 /* Maximum size of core file */ +#define RLIMIT_DATA 2 /* Maximum data segment size */ +#define RLIMIT_AS 3 /* Available Space (VM address space) */ + +typedef unsigned long rlim_t; + +struct rlimit { + rlim_t rlim_cur; + rlim_t rlim_max; +}; + +int mingw_getrlimit(int resource, struct rlimit *rlim); +#endif /* !HAS_GETRLIMIT */ + +/* + * sched_yield() emulation + */ +#ifndef HAS_SCHED_YIELD +#define HAS_SCHED_YIELD /* We emulate it */ +#define EMULATE_SCHED_YIELD +#undef I_SCHED /* Do not include <sched.h> */ + +/* + * We can't define sched_yield because on MinGW, <pthread.h> forcefully + * includes <sched.h> and it will cause sched_yield() to be declared as + * belonging to a DLL. But since that file inclusion occurs after our + * remapping, mingw_sched_yield() is viewed as meaning _imp_mingw_sched_yield + * and causes a link failure. + * + * Hence define it as do_sched_yield. + */ +#define do_sched_yield() mingw_sched_yield() + +int mingw_sched_yield(void); +#endif /* !HAS_SCHED_YIELD */ + +/* * getrusage() emulation. */ #ifndef HAS_GETRUSAGE @@ -259,7 +376,6 @@ #define RUSAGE_SELF 0 #define RUSAGE_CHILDREN (-1) -#define RUSAGE_BOTH (-2) #define RUSAGE_THREAD 1 struct rusage { @@ -271,6 +387,28 @@ #endif /* !HAS_GETRUSAGE */ /* + * fsync() emulation. + */ +#ifndef HAS_FSYNC +#define HAS_FSYNC /* We emulate it */ +#define EMULATE_FSYNC +#define fsync mingw_fsync + +int mingw_fsync(int fd); +#endif /* !HAS_FSYNC */ + +/* + * getppid() emulation. + */ +#ifndef HAS_GETPPID +#define HAS_GETPPID +#define EMULATE_GETPPID +#define getppid mingw_getppid + +pid_t mingw_getppid(void); +#endif /* !HAS_GETPPID */ + +/* * uname() emulation. */ #ifndef HAS_UNAME @@ -278,13 +416,14 @@ #define EMULATE_UNAME #define uname mingw_uname -#define UTSNAME_LENGTH 65 +#define UTSNAME_LENGTH 65 +#define UTSNAME_EXT_LENGTH 128 struct utsname { char sysnameUTSNAME_LENGTH; char nodenameUTSNAME_LENGTH; char releaseUTSNAME_LENGTH; - char versionUTSNAME_LENGTH; + char versionUTSNAME_EXT_LENGTH; char machineUTSNAME_LENGTH; }; @@ -312,6 +451,32 @@ int mingw_nanosleep(const struct timespec *req, struct timespec *rem); #endif /* !HAS_NANOSLEEP */ +/* + * waitpid() emulation. + */ +#ifndef HAS_WAITPID +#define HAS_WAITPID +#define EMULATE_WAITPID +#define waitpid mingw_waitpid +#define wait mingw_wait + +/* waitpid() supported options */ +#define WNOHANG (1U << 0) /* don't wait */ + +/* status queries -- Windows does not support signals nor core dumps */ +#define WIFEXITED(s) TRUE /* can't know termination was forced */ +#define WEXITSTATUS(s) (s) +#define WIFSIGNALED(s) FALSE +#define WTERMSIG(s) 0 +#define WCOREDUMP(s) FALSE +#define WIFSTOPPED(s) FALSE +#define WIFCONTINUED(s) FALSE +#define WSTOPSIG(s) 0 + +pid_t mingw_wait(int *status); +pid_t mingw_waitpid(pid_t pid, int *status, int options); +#endif /* !HAS_WAITPID */ + static inline void * iovec_base(const iovec_t* iovec) { @@ -336,27 +501,50 @@ iovec->len = len; } +static inline void +iovec_set(iovec_t* iovec, const void *base, size_t len) +{ + iovec->buf = (void *) base; + iovec->len = len; +} + signal_handler_t mingw_signal(int signo, signal_handler_t handler); int mingw_fcntl(int fd, int cmd, ... /* arg */ ); -const char *mingw_gethome(void); -const char *mingw_getpersonal(void); -guint64 mingw_getphysmemsize(void); +const char *mingw_get_admin_tools_path(void); +const char *mingw_get_common_appdata_path(void); +const char *mingw_get_common_docs_path(void); +const char *mingw_get_cookies_path(void); +const char *mingw_get_fonts_path(void); +const char *mingw_get_history_path(void); +const char *mingw_get_home_path(void); +const char *mingw_get_internet_cache_path(void); +const char *mingw_get_mypictures_path(void); +const char *mingw_get_personal_path(void); +const char *mingw_get_program_files_path(void); +const char *mingw_get_startup_path(void); +const char *mingw_get_system_path(void); +const char *mingw_get_windows_path(void); + +DIR *mingw_opendir(const char *pathname); +struct dirent *mingw_readdir(DIR *); +int mingw_closedir(DIR *); + +uint64 mingw_getphysmemsize(void); int mingw_getdtablesize(void); const char *mingw_strerror(int errnum); int mingw_stat(const char *pathname, filestat_t *buf); int mingw_fstat(int fd, filestat_t *buf); +int mingw_dup(int fd); int mingw_dup2(int oldfd, int newfd); int mingw_open(const char *pathname, int flags, ...); int mingw_unlink(const char *pathname); -void *mingw_opendir(const char *pathname); -void *mingw_readdir(void *); -int mingw_closedir(void *); fileoffset_t mingw_lseek(int fd, fileoffset_t offset, int whence); int mingw_rename(const char *oldpathname, const char *newpathname); int mingw_truncate(const char *pathname, fileoffset_t len); int mingw_mkdir(const char *pathname, mode_t mode); +int mingw_rmdir(const char *pathname); int mingw_access(const char *pathname, int mode); int mingw_chdir(const char *pathname); int mingw_remove(const char *pathname); @@ -383,6 +571,63 @@ #endif /* !HAS_SBRK */ /* + * gettimeofday() emulation. + */ +#ifndef HAS_GETTIMEOFDAY +#define HAS_GETTIMEOFDAY /* We emulate it */ +#define EMULATE_GETTIMEOFDAY +#define gettimeofday mingw_gettimeofday + +int mingw_gettimeofday(struct timeval *tv, void *unused); +#endif /* !HAS_GETTIMEOFDAY */ + +/* + * clock_gettime() emulation. + */ +#ifndef HAS_CLOCK_GETTIME +#define HAS_CLOCK_GETTIME /* We emulate it */ +#define EMULATE_CLOCK_GETTIME +#define clock_gettime mingw_clock_gettime + +int mingw_clock_gettime(int clock_id, struct timespec *tp); +#endif /* !HAS_CLOCK_GETTIME */ + +/* + * clock_getres() emulation. + */ +#ifndef HAS_CLOCK_GETRES +#define HAS_CLOCK_GETRES /* We emulate it */ +#define EMULATE_CLOCK_GETRES +#define clock_getres mingw_clock_getres + +int mingw_clock_getres(int clock_id, struct timespec *res); +#endif /* !HAS_CLOCK_GETTIME */ + +#ifndef CLOCK_REALTIME +#define CLOCK_REALTIME 0 +#endif + +/* + * dladdr() emulation + */ +#ifndef HAS_DLADDR +#define HAS_DLADDR /* We emulate it */ +#define EMULATE_DLADDR +#define dladdr mingw_dladdr +#define dlerror mingw_dlerror + +typedef struct { + const char *dli_fname; /* Pathname of shared object containing address */ + void *dli_fbase; /* Address at which shared object is loaded */ + const char *dli_sname; /* Name of nearest symbol with lower address */ + void *dli_saddr; /* Exact address of symbol named dli_sname */ +} Dl_info; + +int mingw_dladdr(void *addr, Dl_info *info); +const char *dlerror(void); +#endif /* !HAS_DLADDR */ + +/* * Socket functions * * Under windows, socket descriptors are not the same as file descriptiors. @@ -397,6 +642,7 @@ int mingw_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); +int mingw_gethostname(char *name, size_t len); int mingw_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); void mingw_freeaddrinfo(struct addrinfo *res); @@ -409,6 +655,7 @@ int mingw_shutdown(socket_fd_t sockfd, int how); int mingw_getsockopt(socket_fd_t, int level, int optname, void *, socklen_t *); int mingw_setsockopt(socket_fd_t, int, int, const void *, socklen_t optlen); +ssize_t mingw_recv(socket_fd_t fd, void *buf, size_t len, int recv_flags); ssize_t mingw_sendto(socket_fd_t, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); ssize_t s_write(socket_fd_t fd, const void *buf, size_t count); @@ -416,33 +663,159 @@ ssize_t mingw_s_readv(socket_fd_t fd, const iovec_t *iov, int iovcnt); ssize_t mingw_recvfrom(socket_fd_t, void *, size_t, int, struct sockaddr *, socklen_t *); +int +mingw_socketpair(int domain, int type, int protocol, socket_fd_t sv2); int s_close(socket_fd_t fd); ssize_t mingw_s_writev(socket_fd_t fd, const iovec_t *iov, int iovcnt); +/* + * Semaphore emulation. + */ + +#define semget mingw_semget +#define semctl mingw_semctl +#define semop mingw_semop +#define semtimedop mingw_semtimedop + +typedef int key_t; +#define IPC_PRIVATE 0 /* private resource */ +#define IPC_CREAT 00001000 /* create if key is nonexistent */ +#define IPC_EXCL 00002000 /* fail if key exists */ +#define IPC_NOWAIT 00004000 /* return error on wait */ +#define IPC_RMID 0 /* remove resource */ +#define SEM_UNDO 0x1000 /* undo the operation on exit */ +#define GETVAL 12 /* get semaphore value */ +#define SETVAL 16 /* set semaphore value */ + +#define SEMMSL 64 /* Maximum amount of semaphores per set */ + +struct sembuf { + ushort sem_num; /* semaphore number in the set */ + short sem_op; /* semaphore operation */ + short sem_flg; /* operation flags */ +}; + +/* metaconfig symbols that should not be defined on Windows */ +#define HAS_SEMGET +#define HAS_SEMCTL +#define HAS_SEMOP +#define HAS_SEMTIMEDOP + +int mingw_semget(key_t key, int nsems, int semflg); +int mingw_semctl(int semid, int semnum, int cmd, ...); +int mingw_semop(int semid, struct sembuf *sops, unsigned nsops); +int mingw_semtimedop(int semid, struct sembuf *sops, unsigned nsops, + struct timespec *timeout); + +/* + * sigprocmask(), sigsuspend(), etc... emulation. + */ + +#define HAS_SIGPROCMASK + +/* sigset_t is already defined by system includes, even on Windows */ + +#define SIG_BLOCK 1 +#define SIG_UNBLOCK 2 +#define SIG_SETMASK 3 + +int mingw_sigprocmask(int how, const sigset_t *set, sigset_t *oldset); +int mingw_sigpending(sigset_t *set); +int mingw_sigsuspend(const sigset_t *mask); + +/* The sigprocmask() macro is defined in common.h, since needed also on UNIX */ + +#define sigpending(s) mingw_sigpending(s) +#define sigsuspend(m) mingw_sigsuspend(m) + +#define sigmask(s) (1U << ((s) - 1)) /* 0 is not a signal */ + +static inline int +sigemptyset(sigset_t *s) +{ + *s = 0; + return 0; +} + +static inline int +sigfillset(sigset_t *s) +{ + *s = MAX_INT_VAL(sigset_t); + return 0; +} + +static inline int +sigaddset(sigset_t *s, int n) +{ + if G_UNLIKELY(n <= 0 || n >= SIGNAL_COUNT) { + errno = EINVAL; + return -1; + } + *s |= sigmask(n); + return 0; +} + +static inline int +sigdelset(sigset_t *s, int n) +{ + if G_UNLIKELY(n <= 0 || n >= SIGNAL_COUNT) { + errno = EINVAL; + return -1; + } + *s &= ~sigmask(n); + return 0; +} + +static inline int +sigismember(sigset_t *s, int n) +{ + if G_UNLIKELY(n <= 0 || n >= SIGNAL_COUNT) { + errno = EINVAL; + return -1; + } + return (*s & ~sigmask(n)) ? 1 : 0; +} + +/* + * Additional error codes we want to map. + */ + +#define EIDRM (INT_MAX - 100) /* Identifier removed */ + +/* + * Miscellaneous. + */ + #define rename(oldpath, newpath) mingw_rename((oldpath), (newpath)) #define g_strerror(errnum) mingw_strerror(errnum) void *mingw_valloc(void *hint, size_t size); int mingw_vfree(void *addr, size_t size); int mingw_vfree_fragment(void *addr, size_t size); +void mingw_set_stop_vfree(bool val); + int mingw_mprotect(void *addr, size_t len, int prot); +void *mingw_memstart(const void *p); +void mingw_log_meminfo(const void *p); int mingw_random_bytes(void *buf, size_t len); -gboolean mingw_process_is_alive(pid_t pid); +int mingw_process_access_check(pid_t pid); -int mingw_statvfs(const char *pathname, struct mingw_statvfs *buf); -guint64 mingw_cpufreq_min(void); -guint64 mingw_cpufreq_max(void); +unsigned int mingw_sleep(unsigned int seconds); +long mingw_cpu_count(void); +uint64 mingw_cpufreq_min(void); +uint64 mingw_cpufreq_max(void); const char *mingw_getlogin(void); int mingw_getpagesize(void); +int mingw_backtrace(void **buffer, int size, size_t offset); enum mingw_cpufreq { MINGW_CPUFREQ_CURRENT, MINGW_CPUFREQ_MAX }; -guint64 mingw_cpufreq(enum mingw_cpufreq freq); +uint64 mingw_cpufreq(enum mingw_cpufreq freq); typedef struct pollfd { SOCKET fd; @@ -456,40 +829,68 @@ return fd; } -gboolean mingw_has_wsapoll(void); +bool mingw_has_wsapoll(void); int mingw_poll(struct pollfd *fds, unsigned n, int timeout); void mingw_early_init(void); +void mingw_vmm_post_init(void); void mingw_init(void); void mingw_close(void); const char *mingw_filename_nearby(const char *file); -gboolean mingw_stdin_pending(gboolean fifo); -gboolean mingw_same_file_id(const char *pathname_a, const char *pathname_b); +bool mingw_stdin_pending(bool fifo); +bool mingw_same_file_id(const char *pathname_a, const char *pathname_b); const char *dir_entry_filename(const void *dirent); -int mingw_getgateway(guint32 *ip); +size_t dir_entry_namelen(const void *dirent); -gboolean mingw_in_exception(void); -void G_GNUC_NORETURN mingw_abort(void); +int mingw_getgateway(uint32 *ip); +void mingw_abort(void) G_NORETURN; +int mingw_execve(const char *filename, char *const argv, char *const envp); +pid_t mingw_launchve(const char *path, char *const argv, char *const envp); +int mingw_spopenve(const char *path, const char *mode, int fd2, + char *const argv, char *const envp); struct adns_request; void mingw_adns_init(void); void mingw_adns_close(void); -gboolean mingw_adns_send_request(const struct adns_request *req); +bool mingw_adns_send_request(const struct adns_request *req); char *mingw_patch_personal_path(const char *pathname); const char *mingw_native_path(const char *pathname); +const char *mingw_get_supervisor_log_path(void); +void mingw_file_rotate(const char *pathname, int keep); + +systid_t mingw_gettid(void); +void mingw_gettid_reset(uint id); +int mingw_thread_kill(uint id, systid_t system_thread_id, int signo); +bool mingw_signal_check(uint id); + +int mingw_last_error(void); #else /* !MINGW32 */ -#define mingw_early_init(); +#define PROT_GUARD PROT_NONE /* Guard pages are Windows-specific */ + +#define mingw_vmm_post_init() #define mingw_init() #define mingw_close() #define mingw_patch_personal_path(p) (p) -#define mingw_getpersonal() "/" -#define mingw_in_exception() 0 +#define mingw_get_admin_tools_path() "/" +#define mingw_get_common_appdata_path() "/" +#define mingw_get_common_docs_path() "/" +#define mingw_get_cookies_path() "/" +#define mingw_get_fonts_path() "/" +#define mingw_get_history_path() "/" +#define mingw_get_home_path() "/" +#define mingw_get_internet_cache_path() "/" +#define mingw_get_mypictures_path() "/" +#define mingw_get_personal_path() "/" +#define mingw_get_program_files_path() "/" +#define mingw_get_startup_path() "/" +#define mingw_get_system_path() "/" +#define mingw_get_windows_path() "/" #endif /* MINGW32 */ #endif /* _mingw32_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/misc.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/misc.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2001-2008, Raphael Manfredi + * Copyright (c) 2001-2008, 2013 Raphael Manfredi * Copyright (c) 2003-2008, Christian Biere * *---------------------------------------------------------------------- @@ -29,36 +29,42 @@ * Miscellaneous functions. * * @author Raphael Manfredi - * @date 2001-2008 + * @date 2001-2008, 2013 * @author Christian Biere * @date 2003-2008 */ #include "common.h" +#include "misc.h" + #include "ascii.h" #include "atoms.h" #include "base16.h" #include "base32.h" +#include "buf.h" #include "compat_misc.h" #include "concat.h" #include "endian.h" #include "entropy.h" #include "halloc.h" +#include "htable.h" #include "html_entities.h" #include "log.h" /* For log_file_printable() */ -#include "misc.h" -#include "glib-missing.h" -#include "sha1.h" +#include "mempcpy.h" +#include "once.h" #include "parse.h" #include "path.h" #include "pow2.h" #include "random.h" +#include "sha1.h" +#include "str.h" #include "stringify.h" +#include "thread.h" #include "tm.h" #include "unsigned.h" -#include "walloc.h" #include "utf8.h" +#include "walloc.h" #include "if/core/guid.h" @@ -132,8 +138,10 @@ * @param str a NUL-terminated string or array of "len" bytes. * @param len length of ``str'', (size_t)-1 means compute it * @param suffix the suffix to look for (NUL-terminated string) + * + * @return NULL if suffix is not found, a pointer to the start of it otherwise. */ -gboolean +char * is_strsuffix(const char *str, size_t len, const char *suffix) { size_t suffix_len; @@ -144,12 +152,57 @@ len = (size_t)-1 == len ? strlen(str) : len; suffix_len = strlen(suffix); - if (suffix_len > len) { - return FALSE; - } else { + if (suffix_len <= len) { const char *p = &strlen - suffix_len; - return 0 == memcmp(p, suffix, suffix_len); + if (0 == memcmp(p, suffix, suffix_len)) + return deconstify_char(p); } + + return NULL; +} + +/** + * Check whether ``suffix'' is the end of ``str'', using an ASCII + * case-insensitive comparison. + * + * @param str a NUL-terminated string or array of "len" bytes. + * @param len length of ``str'', (size_t)-1 means compute it + * @param suffix the suffix to look for (NUL-terminated string) + * + * @return NULL if suffix is not found, a pointer to the start of it otherwise. + */ +char * +is_strcasesuffix(const char *str, size_t len, const char *suffix) +{ + size_t suffix_len; + + g_assert(NULL != str); + g_assert(NULL != suffix); + + len = (size_t)-1 == len ? strlen(str) : len; + suffix_len = strlen(suffix); + + if (suffix_len <= len) { + const char *p = &strlen - suffix_len; + const char *q = suffix; + size_t i; + + for (i = 0; i < suffix_len; i++) { + int a = *p++, b = *q++; + + /* + * Optimize a bit: if case matches, or we're dealing with a + * non-letter character, there's no need to invoke acscii_tolower(). + */ + + if (a != b && ascii_tolower(a) != ascii_tolower(b)) + return NULL; + } + + return deconstify_char(&strlen - suffix_len); + } + + return NULL; } /** @@ -238,15 +291,85 @@ const char * local_hostname(void) { - static char name256 + 1; + buf_t *b = buf_private(G_STRFUNC, 256 + 1); + char *name = buf_data(b); + size_t size = buf_size(b); - if (-1 == gethostname(name, sizeof name)) + if (-1 == gethostname(name, size)) { g_warning("gethostname() failed: %m"); + name0 = '\0'; + } - namesizeof(name) - 1 = '\0'; + namesize - 1 = '\0'; return name; } +#define ONEMASK ((size_t) (-1) / 0xff) /* 0x01010101 on 32-bit machine */ + +/** + * Determines the length of a NUL-terminated string looking only at the first + * "src_size" bytes. If src0..size contains no NUL byte, "src_size" is + * returned. Otherwise, the returned value is identical to strlen(str). Thus, + * it is safe to pass a possibly non-terminated buffer. + * + * @param src An initialized buffer. + * @param src_size The size of src in number of bytes. IF AND ONLY IF, + * src is NUL-terminated, src_size may exceed the actual buffer length. + * @return The number of bytes in "src" before the first found NUL or src_size + * if there is no NUL. + */ +size_t +clamp_strlen(const char *src, size_t src_size) +{ + const char * s; + + /* + * Handle any initial misaligned bytes. + */ + + for (s = src; pointer_to_ulong(s) & (sizeof(size_t) - 1); s++) { + if G_UNLIKELY(UNSIGNED(s - src) >= src_size) + goto done; + if G_UNLIKELY(*s == '\0') + goto done; /* Exit if we hit a zero byte. */ + } + + /* + * Handle complete blocks, using the same processing as utf8_strlen() + * to inspect a whole "size_t" word at a time. + * + * This may read more bytes than are present in the string, should the + * trailing NUL byte be in the middle of a block. + * + * However, this is safe because we cannot cross any page boundary + * by doing so, hence we cannot incur a memory fault as long as the first + * bytes we're reading falls within the given src_size boundaries. + */ + + for (; UNSIGNED(s - src) < src_size; s += sizeof(size_t)) { + size_t u = *(size_t *) s; /* Grab 4 or 8 bytes of data */ + + if ((u - ONEMASK) & (~u) & (ONEMASK * 0x80)) + break; /* Exit loop if there are any zero bytes */ + } + + if G_UNLIKELY(UNSIGNED(s - src) > src_size) + s = src + src_size; + + /* + * Take care of the left-over bytes (at most a "size_t" word) to find + * the exact NUL inside. + */ + + for (; UNSIGNED(s - src) < src_size; s++) { + if G_UNLIKELY(*s == '\0') + break; /* Exit if we hit a zero byte */ + } + +done: + return s - src; +} + /** * Remove antepenultimate char of string if it is a "\r" followed by "\n". * Remove final char of string if it is a "\n" or "\r". @@ -278,7 +401,7 @@ /** * Check whether path is a directory. */ -gboolean +bool is_directory(const char *pathname) { filestat_t st; @@ -290,7 +413,7 @@ /** * Check whether path points to a regular file. */ -gboolean +bool is_regular(const char *pathname) { filestat_t st; @@ -302,7 +425,7 @@ /** * Check whether path is a symbolic link. */ -gboolean +bool is_symlink(const char *pathname) #if defined(HAS_LSTAT) { @@ -403,18 +526,15 @@ filesize_t get_random_file_offset(const filesize_t size) { - filesize_t offset; - - offset = 0; - if (size > 1) { - random_bytes(&offset, sizeof offset); - offset %= size - 1; + if (sizeof(size) == sizeof(uint64)) { + return random64_value(size - 1); + } else { + return random_value(size - 1); } - return offset; } -static inline guint -filesize_fraction(filesize_t size, filesize_t part, guint base) +static inline uint +filesize_fraction(filesize_t size, filesize_t part, uint base) { filesize_t x; @@ -436,7 +556,7 @@ } #define GENERATE_FILESIZE_PER_X(base) \ -guint \ +uint \ filesize_per_ ## base (filesize_t size, filesize_t part) \ { \ return filesize_fraction(size, part, base); \ @@ -447,21 +567,21 @@ GENERATE_FILESIZE_PER_X(10000) #undef GENERATE_FILESIZE_PER_X -static inline guint -kilo(gboolean metric) +static inline uint +kilo(bool metric) { return metric ? 1000 : 1024; } static inline const char * -byte_suffix(gboolean metric) +byte_suffix(bool metric) { static const char suffix = "iB"; return &suffixmetric ? 1 : 0; } static inline const char * -scale_prefixes(gboolean metric) +scale_prefixes(bool metric) { return metric ? "\0kMGTPEZ" : "\0KMGTPEZ"; } @@ -470,34 +590,34 @@ * Scales v so that quotient and reminder are both in the range "0..1023". * * @param v no document. - * @param q pointer to a guint; will hold the quotient. - * @param r pointer to a guint; will hold the reminder. + * @param q pointer to a uint; will hold the quotient. + * @param r pointer to a uint; will hold the reminder. * @param s a string holding the scale prefixes; must be sufficiently long. * * @return the appropriate prefix character from "s". */ static inline char -size_scale(guint64 v, guint *q, guint *r, const char *s, gboolean metric) +size_scale(uint64 v, uint *q, uint *r, const char *s, bool metric) { - const guint base = kilo(metric); + const uint base = kilo(metric); if (v < base) { *q = v; *r = 0; } else { - const guint thresh = base * base; + const uint thresh = base * base; for (s++; v >= thresh; v /= base) s++; - - *q = (guint) v / base; - *r = (guint) v % base; + + *q = (uint) v / base; + *r = (uint) v % base; } return *s; } static inline char -norm_size_scale(guint64 v, guint *q, guint *r, gboolean metric) +norm_size_scale(uint64 v, uint *q, uint *r, bool metric) { return size_scale(v, q, r, scale_prefixes(metric), metric); } @@ -507,9 +627,9 @@ * by 1024 (binary). */ static inline char -kib_size_scale(guint64 v, guint *q, guint *r, gboolean metric) +kib_size_scale(uint64 v, uint *q, uint *r, bool metric) { - if (metric && v < ((guint64) -1) / 1024) { + if (metric && v < ((uint64) -1) / 1024) { v = (v * 1024) / 1000; } return size_scale(v, q, r, scale_prefixes(metric) + 1, metric); @@ -525,93 +645,107 @@ * @param dst where to write the string * @param len the size of ``dst'' in bytes. * - * @return The length of the resulting string assuming ``size'' is sufficient. + * @return The length of the resulting string. */ size_t -short_size_to_string_buf(guint64 size, gboolean metric, char *dst, size_t len) +short_size_to_string_buf(uint64 size, bool metric, char *dst, size_t len) { if (size < kilo(metric)) { - guint n = size; - return gm_snprintf(dst, len, NG_("%u Byte", "%u Bytes", n), n); + uint n = size; + return str_bprintf(dst, len, NG_("%u Byte", "%u Bytes", n), n); } else { - guint q, r; + uint q, r; char c; c = norm_size_scale(size, &q, &r, metric); r = (r * 100) / kilo(metric); return - gm_snprintf(dst, len, "%u.%02u %c%s", q, r, c, byte_suffix(metric)); + str_bprintf(dst, len, "%u.%02u %c%s", q, r, c, byte_suffix(metric)); } } const char * -short_size(guint64 size, gboolean metric) +short_size(uint64 size, bool metric) { - static char bSIZE_FIELD_MAX; + buf_t *b = buf_private(G_STRFUNC, SIZE_FIELD_MAX); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - short_size_to_string_buf(size, metric, b, sizeof b); - return b; + n = short_size_to_string_buf(size, metric, p, sz); + g_assert(n < sz); + return p; } const char * -short_frequency(guint64 freq) +short_size2(uint64 size, bool metric) { - static char bSIZE_FIELD_MAX; + buf_t *b = buf_private(G_STRFUNC, SIZE_FIELD_MAX); + char *p = buf_data(b); + size_t n, sz = buf_size(b); + + n = short_size_to_string_buf(size, metric, p, sz); + g_assert(n < sz); + return p; +} + +const char * +short_frequency(uint64 freq) +{ + str_t *s = str_private(G_STRFUNC, SIZE_FIELD_MAX); if (freq < kilo(TRUE)) { - guint n = freq; - gm_snprintf(b, sizeof b, "%u Hz", n); + uint n = freq; + str_printf(s, "%u Hz", n); } else { - guint q, r; + uint q, r; char c; c = norm_size_scale(freq, &q, &r, TRUE); r = (r * 100) / kilo(TRUE); - gm_snprintf(b, sizeof b, "%u.%02u %cHz", q, r, c); + str_printf(s, "%u.%02u %cHz", q, r, c); } - return b; + return str_2c(s); } /** * Like short_size() but with unbreakable space between the digits and unit. */ const char * -short_html_size(guint64 size, gboolean metric) +short_html_size(uint64 size, bool metric) { - static char bSIZE_FIELD_MAX; + str_t *s = str_private(G_STRFUNC, SIZE_FIELD_MAX); if (size < kilo(metric)) { - guint n = size; - gm_snprintf(b, sizeof b, NG_("%u Byte", "%u Bytes", n), n); + uint n = size; + str_printf(s, NG_("%u Byte", "%u Bytes", n), n); } else { - guint q, r; + uint q, r; char c; c = norm_size_scale(size, &q, &r, metric); r = (r * 100) / kilo(metric); - gm_snprintf(b, sizeof b, "%u.%02u %c%s", q, r, c, - byte_suffix(metric)); + str_printf(s, "%u.%02u %c%s", q, r, c, byte_suffix(metric)); } - return b; + return str_2c(s); } size_t -short_byte_size_to_buf(guint64 size, gboolean metric, char *buf, size_t buflen) +short_byte_size_to_buf(uint64 size, bool metric, char *buf, size_t buflen) { size_t w; if (size < kilo(metric)) { - guint n = size; - w = gm_snprintf(buf, buflen, "%u B", n); + uint n = size; + w = str_bprintf(buf, buflen, "%u B", n); } else { - guint q, r; + uint q, r; char c; c = norm_size_scale(size, &q, &r, metric); r = (r * 100) / kilo(metric); - w = gm_snprintf(buf, buflen, + w = str_bprintf(buf, buflen, "%u.%02u %c%s", q, r, c, byte_suffix(metric)); } @@ -623,38 +757,44 @@ * is less than a kilo. */ const char * -short_byte_size(guint64 size, gboolean metric) +short_byte_size(uint64 size, bool metric) { - static char bSIZE_FIELD_MAX; + buf_t *b = buf_private(G_STRFUNC, SIZE_FIELD_MAX); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - short_byte_size_to_buf(size, metric, b, sizeof b); - return b; + n = short_byte_size_to_buf(size, metric, p, sz); + g_assert(n < sz); + return p; } const char * -short_byte_size2(guint64 size, gboolean metric) +short_byte_size2(uint64 size, bool metric) { - static char bSIZE_FIELD_MAX; + buf_t *b = buf_private(G_STRFUNC, SIZE_FIELD_MAX); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - short_byte_size_to_buf(size, metric, b, sizeof b); - return b; + n = short_byte_size_to_buf(size, metric, p, sz); + g_assert(n < sz); + return p; } size_t -short_kb_size_to_buf(guint64 size, gboolean metric, char *buf, size_t buflen) +short_kb_size_to_buf(uint64 size, bool metric, char *buf, size_t buflen) { size_t w; if (size < kilo(metric)) { - w = gm_snprintf(buf, buflen, - "%u %s", (guint) size, metric ? "kB" : "KiB"); + w = str_bprintf(buf, buflen, + "%u %s", (uint) size, metric ? "kB" : "KiB"); } else { - guint q, r; + uint q, r; char c; c = kib_size_scale(size, &q, &r, metric); r = (r * 100) / kilo(metric); - w = gm_snprintf(buf, buflen, + w = str_bprintf(buf, buflen, "%u.%02u %c%s", q, r, c, byte_suffix(metric)); } @@ -666,124 +806,132 @@ * kibibytes, not bytes. */ const char * -short_kb_size(guint64 size, gboolean metric) +short_kb_size(uint64 size, bool metric) { - static char bSIZE_FIELD_MAX; + buf_t *b = buf_private(G_STRFUNC, SIZE_FIELD_MAX); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - short_kb_size_to_buf(size, metric, b, sizeof b); - return b; + n = short_kb_size_to_buf(size, metric, p, sz); + g_assert(n < sz); + return p; } const char * -short_kb_size2(guint64 size, gboolean metric) +short_kb_size2(uint64 size, bool metric) { - static char bSIZE_FIELD_MAX; + buf_t *b = buf_private(G_STRFUNC, SIZE_FIELD_MAX); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - short_kb_size_to_buf(size, metric, b, sizeof b); - return b; + n = short_kb_size_to_buf(size, metric, p, sz); + g_assert(n < sz); + return p; } /** * @return a number of Kbytes in a compact readable form */ const char * -compact_kb_size(guint32 size, gboolean metric) +compact_kb_size(uint32 size, bool metric) { - static char bSIZE_FIELD_MAX; + str_t *s = str_private(G_STRFUNC, SIZE_FIELD_MAX); if (size < kilo(metric)) { - gm_snprintf(b, sizeof b, "%u%s", (guint) size, metric ? "kB" : "KiB"); + str_printf(s, "%u%s", (uint) size, metric ? "kB" : "KiB"); } else { - guint q, r; + uint q, r; char c; c = kib_size_scale(size, &q, &r, metric); r = (r * 10) / kilo(metric); - gm_snprintf(b, sizeof b, "%u.%u%c%s", q, r, c, byte_suffix(metric)); + str_printf(s, "%u.%u%c%s", q, r, c, byte_suffix(metric)); } - return b; + return str_2c(s); } const char * -nice_size(guint64 size, gboolean metric) +nice_size(uint64 size, bool metric) { - static char buf256; + str_t *s = str_private(G_STRFUNC, SIZE_FIELD_MAX); char bytesUINT64_DEC_BUFLEN; uint64_to_string_buf(size, bytes, sizeof bytes); - gm_snprintf(buf, sizeof buf, - _("%s (%s bytes)"), short_size(size, metric), bytes); - return buf; + str_printf(s, _("%s (%s bytes)"), short_size(size, metric), bytes); + return str_2c(s); } char * -compact_value(char *buf, size_t size, guint64 v, gboolean metric) +compact_value(char *buf, size_t size, uint64 v, bool metric) { if (v < kilo(metric)) { - gm_snprintf(buf, size, "%u", (guint) v); + str_bprintf(buf, size, "%u", (uint) v); } else { - guint q, r; + uint q, r; char c; c = norm_size_scale(v, &q, &r, metric); r = (r * 10) / kilo(metric); - gm_snprintf(buf, size, "%u.%u%c%s", q, r, c, metric ? "" : "i"); + str_bprintf(buf, size, "%u.%u%c%s", q, r, c, metric ? "" : "i"); } return buf; } char * -short_value(char *buf, size_t size, guint64 v, gboolean metric) +short_value(char *buf, size_t size, uint64 v, bool metric) { if (v < kilo(metric)) { - gm_snprintf(buf, size, "%u ", (guint) v); + str_bprintf(buf, size, "%u ", (uint) v); } else { - guint q, r; + uint q, r; char c; c = norm_size_scale(v, &q, &r, metric); r = (r * 100) / kilo(metric); - gm_snprintf(buf, size, "%u.%02u %c%s", q, r, c, metric ? "" : "i"); + str_bprintf(buf, size, "%u.%02u %c%s", q, r, c, metric ? "" : "i"); } - + return buf; } const char * -compact_size(guint64 size, gboolean metric) +compact_size(uint64 size, bool metric) { - static char bufSIZE_FIELD_MAX; + char bufSIZE_FIELD_MAX; + str_t *s = str_private(G_STRFUNC, sizeof buf); compact_value(buf, sizeof buf, size, metric); - g_strlcat(buf, "B", sizeof buf); - return buf; + str_printf(s, "%sB", buf); + return str_2c(s); } const char * -compact_size2(guint64 size, gboolean metric) +compact_size2(uint64 size, bool metric) { - static char bufSIZE_FIELD_MAX; + char bufSIZE_FIELD_MAX; + str_t *s = str_private(G_STRFUNC, sizeof buf); compact_value(buf, sizeof buf, size, metric); - g_strlcat(buf, "B", sizeof buf); - return buf; + str_printf(s, "%sB", buf); + return str_2c(s); } const char * -compact_rate(guint64 rate, gboolean metric) +compact_rate(uint64 rate, bool metric) { - static char bufSIZE_FIELD_MAX; + char bufSIZE_FIELD_MAX; + str_t *s = str_private(G_STRFUNC, sizeof buf); compact_value(buf, sizeof buf, rate, metric); /* TRANSLATORS: Don't translate 'B', just 's' is allowed. */ - g_strlcat(buf, _("B/s"), sizeof buf); - return buf; + str_printf(s, "%s%s", buf, _("B/s")); + return str_2c(s); } static size_t -short_rate_to_string_buf(guint64 rate, gboolean metric, char *dst, size_t size) +short_rate_to_string_buf(uint64 rate, bool metric, char *dst, size_t size) { short_value(dst, size, rate, metric); /* TRANSLATORS: Don't translate 'B', just 's' is allowed. */ @@ -791,7 +939,7 @@ } short_string_t -short_rate_get_string(guint64 rate, gboolean metric) +short_rate_get_string(uint64 rate, bool metric) { short_string_t buf; short_rate_to_string_buf(rate, metric, buf.str, sizeof buf.str); @@ -799,11 +947,16 @@ } const char * -short_rate(guint64 rate, gboolean metric) +short_rate(uint64 rate, bool metric) { - static short_string_t buf; + short_string_t buf; + buf_t *b = buf_private(G_STRFUNC, sizeof buf); + char *p = buf_data(b); + size_t sz = buf_size(b); + buf = short_rate_get_string(rate, metric); - return buf.str; + clamp_strcpy(p, sz, buf.str); + return p; } /** @@ -834,8 +987,13 @@ * Convert GUID to hexadecimal string in the supplied buffer. */ size_t -guid_to_string_buf(const struct guid *guid, char *dst, size_t size) +guid_to_string_buf(const guid_t *guid, char *dst, size_t size) { + if G_UNLIKELY(NULL == guid) { + /* Our constant string is 32-byte long */ + return g_strlcpy(dst, "<------ null GUID pointer ----->", size); + } + return bin_to_hex_buf(guid->v, GUID_RAW_SIZE, dst, size); } @@ -843,35 +1001,37 @@ * @return hexadecimal string representing given GUID, in static buffer. */ const char * -guid_to_string(const struct guid *guid) +guid_to_string(const guid_t *guid) { - static char bufGUID_HEX_SIZE + 1; - size_t ret; + buf_t *b = buf_private(G_STRFUNC, GUID_HEX_SIZE + 1); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - ret = guid_to_string_buf(guid, buf, sizeof buf); - g_assert(GUID_HEX_SIZE == ret); - return buf; + n = guid_to_string_buf(guid, p, sz); + g_assert(GUID_HEX_SIZE == n); + return p; } /** * @return hexadecimal string representing given GUID, in static buffer. */ const char * -guid_hex_str(const struct guid *guid) +guid_hex_str(const guid_t *guid) { - static char bufGUID_HEX_SIZE + 1; - size_t ret; + buf_t *b = buf_private(G_STRFUNC, GUID_HEX_SIZE + 1); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - ret = guid_to_string_buf(guid, buf, sizeof buf); - g_assert(GUID_HEX_SIZE == ret); - return buf; + n = guid_to_string_buf(guid, p, sz); + g_assert(GUID_HEX_SIZE == n); + return p; } -static gint8 char2int_tabs3(size_t) (guchar) -1 + 1; +static int8 char2int_tabs3(size_t) (uchar) -1 + 1; -const gint8 *hex2int_tab = char2int_tabs0; -const gint8 *dec2int_tab = char2int_tabs1; -const gint8 *alnum2int_tab = char2int_tabs2; +const int8 *hex2int_tab = char2int_tabs0; +const int8 *dec2int_tab = char2int_tabs1; +const int8 *alnum2int_tab = char2int_tabs2; /** * Converts a hexadecimal char (0-9, A-F, a-f) to an integer. @@ -883,10 +1043,10 @@ * @return "0..15" for valid hexadecimal ASCII characters. */ int -hex2int(guchar c) +hex2int(uchar c) { int ret; - + ret = hex2int_inline(c); g_assert(-1 != ret); return ret; @@ -902,10 +1062,10 @@ * @return "0..9" for valid decimal ASCII characters. */ static int -dec2int(guchar c) +dec2int(uchar c) { int ret; - + ret = dec2int_inline(c); g_assert(-1 != ret); return ret; @@ -921,10 +1081,10 @@ * @return "0..36" for valid decimal ASCII characters. */ static int -alnum2int(guchar c) +alnum2int(uchar c) { int ret; - + ret = alnum2int_inline(c); g_assert(-1 != ret); return ret; @@ -933,23 +1093,23 @@ /** * Initializes the lookup table for hex2int(). */ -static G_GNUC_COLD void +static void G_COLD hex2int_init(void) { size_t i; /* Initialize hex2int_tab */ - - for (i = 0; i < G_N_ELEMENTS(char2int_tabs0); i++) { + + for (i = 0; i < N_ITEMS(char2int_tabs0); i++) { static const char hexa = "0123456789abcdef"; const char *p = i ? strchr(hexa, ascii_tolower(i)): NULL; - + char2int_tabs0i = p ? (p - hexa) : -1; } - + /* Check consistency of hex2int_tab */ - for (i = 0; i <= (guchar) -1; i++) + for (i = 0; i <= (uchar) -1; i++) switch (i) { case '0': g_assert(0 == hex2int(i)); break; case '1': g_assert(1 == hex2int(i)); break; @@ -981,23 +1141,23 @@ /** * Initializes the lookup table for dec2int(). */ -static G_GNUC_COLD void +static void G_COLD dec2int_init(void) { size_t i; /* Initialize dec2int_tab */ - - for (i = 0; i < G_N_ELEMENTS(char2int_tabs1); i++) { + + for (i = 0; i < N_ITEMS(char2int_tabs1); i++) { static const char deca = "0123456789"; const char *p = i ? strchr(deca, i): NULL; - + char2int_tabs1i = p ? (p - deca) : -1; } - + /* Check consistency of hex2int_tab */ - for (i = 0; i <= (guchar) -1; i++) + for (i = 0; i <= (uchar) -1; i++) switch (i) { case '0': g_assert(0 == dec2int(i)); break; case '1': g_assert(1 == dec2int(i)); break; @@ -1017,26 +1177,26 @@ /** * Initializes the lookup table for alnum2int(). */ -static G_GNUC_COLD void +static void G_COLD alnum2int_init(void) { static const char abc = "0123456789abcdefghijklmnopqrstuvwxyz"; size_t i; /* Initialize alnum2int_tab */ - - for (i = 0; i < G_N_ELEMENTS(char2int_tabs2); i++) { + + for (i = 0; i < N_ITEMS(char2int_tabs2); i++) { const char *p = i ? strchr(abc, ascii_tolower(i)): NULL; - + char2int_tabs2i = p ? (p - abc) : -1; } - + /* Check consistency of hex2int_tab */ - for (i = 0; i <= (guchar) -1; i++) { + for (i = 0; i <= (uchar) -1; i++) { const char *p = i ? strchr(abc, ascii_tolower(i)): NULL; int v = p ? (p - abc) : -1; - + g_assert(alnum2int_inline(i) == v); g_assert(!p || alnum2int(i) >= 0); } @@ -1051,11 +1211,11 @@ * * @return TRUE if OK. */ -gboolean -hex_to_guid(const char *hexguid, struct guid *guid) +bool +hex_to_guid(const char *hexguid, guid_t *guid) { size_t ret; - + ret = base16_decode(guid->v, sizeof guid->v, hexguid, GUID_HEX_SIZE); return GUID_RAW_SIZE == ret; } @@ -1066,30 +1226,32 @@ * @return pointer to static data. */ const char * -guid_base32_str(const struct guid *guid) +guid_base32_str(const guid_t *guid) { - static char bufGUID_BASE32_SIZE + 1; - size_t len; + buf_t *b = buf_private(G_STRFUNC, GUID_BASE32_SIZE + 1); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - len = base32_encode(buf, sizeof buf, guid, GUID_RAW_SIZE); - g_assert(len == G_N_ELEMENTS(buf) - 1); - buflen = '\0'; - return buf; + n = base32_encode(p, sz, guid, GUID_RAW_SIZE); + g_assert(GUID_BASE32_SIZE == n); + return p; } /** - * Decode the base32 representation of a GUID. + * Decode the base32 representation of a GUID into supplied buffer. * - * @return pointer to static data, or NULL if the input was not valid base32. + * @return pointer to supplied buffer, NULL if the input was not valid base32. */ -const struct guid * -base32_to_guid(const char *base32) +const guid_t * +base32_to_guid(const char *base32, guid_t *guid) { - static struct guid guid; size_t ret; - ret = base32_decode(guid.v, sizeof guid.v, base32, GUID_BASE32_SIZE); - return (size_t)0 + GUID_RAW_SIZE == ret ? &guid : NULL; + g_assert(base32 != NULL); + g_assert(guid != NULL); + + ret = base32_decode(guid, sizeof *guid, base32, GUID_BASE32_SIZE); + return (size_t) 0 + GUID_RAW_SIZE == ret ? guid : NULL; } /** @@ -1125,10 +1287,14 @@ const char * sha1_base32(const struct sha1 *sha1) { - static char digest_b32SHA1_BASE32_SIZE + 1; + buf_t *b = buf_private(G_STRFUNC, SHA1_BASE32_SIZE + 1); + char *p = buf_data(b); + size_t sz = buf_size(b); - g_assert(sha1); - return sha1_to_base32_buf(sha1, digest_b32, sizeof digest_b32); + g_assert(sha1 != NULL); + + sha1_to_base32_buf(sha1, p, sz); + return p; } /** @@ -1164,24 +1330,35 @@ const char * sha1_base16(const struct sha1 *sha1) { - static char digest_b16SHA1_BASE16_SIZE + 1; + buf_t *b = buf_private(G_STRFUNC, SHA1_BASE16_SIZE + 1); + char *p = buf_data(b); + size_t sz = buf_size(b); - g_assert(sha1); - return sha1_to_base16_buf(sha1, digest_b16, sizeof digest_b16); + g_assert(sha1 != NULL); + + sha1_to_base16_buf(sha1, p, sz); + return p; } const char * sha1_to_string(const struct sha1 *sha1) { - static char digest_b32SHA1_BASE32_SIZE + 1; - return sha1_to_base32_buf(sha1, digest_b32, sizeof digest_b32); + buf_t *b = buf_private(G_STRFUNC, SHA1_BASE32_SIZE + 1); + char *p = buf_data(b); + size_t sz = buf_size(b); + + sha1_to_base32_buf(sha1, p, sz); + return p; } /** * Convert binary SHA1 into a urn:sha1:<base32> string. * - * @param sha1 A binary SHA-1. - * @return The SHA-1 converted to an URN string. + * @param sha1 a binary SHA-1. + * @param dst destination buffer + * @param size size of buffer + * + * @return The length of the SHA-1 converted to a URN string. */ size_t sha1_to_urn_string_buf(const struct sha1 *sha1, char *dst, size_t size) @@ -1198,7 +1375,7 @@ n = MIN(size, (SHA1_BASE32_SIZE + 1)); sha1_to_base32_buf(sha1, &dstCONST_STRLEN(prefix), n); } - return CONST_STRLEN(prefix) + SHA1_BASE32_SIZE + 1; + return CONST_STRLEN(prefix) + SHA1_BASE32_SIZE; } /** @@ -1208,11 +1385,15 @@ const char * sha1_to_urn_string(const struct sha1 *sha1) { - static char bufCONST_STRLEN("urn:sha1:") + SHA1_BASE32_SIZE + 1; + buf_t *b = buf_private(G_STRFUNC, + CONST_STRLEN("urn:sha1:") + SHA1_BASE32_SIZE + 1); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - g_assert(sha1); - sha1_to_urn_string_buf(sha1, buf, sizeof buf); - return buf; + g_assert(sha1 != NULL); + n = sha1_to_urn_string_buf(sha1, p, sz); + g_assert(n < sz); + return p; } /** @@ -1223,33 +1404,36 @@ const char * bitprint_to_urn_string(const struct sha1 *sha1, const struct tth *tth) { - g_assert(sha1); + buf_t *b = buf_private(G_STRFUNC, BITPRINT_BASE32_SIZE + 14); + + g_assert(sha1 != NULL); if (tth) { static const char prefix = "urn:bitprint:"; - static char bufCONST_STRLEN(prefix) + BITPRINT_BASE32_SIZE + 1; + char bufCONST_STRLEN(prefix) + BITPRINT_BASE32_SIZE + 1; const char * const end = &bufsizeof buf; char *p = buf; - memcpy(p, prefix, CONST_STRLEN(prefix)); - p += CONST_STRLEN(prefix); - + p = mempcpy(p, prefix, CONST_STRLEN(prefix)); base32_encode(p, end - p, sha1->data, sizeof sha1->data); p += SHA1_BASE32_SIZE; *p++ = '.'; - + base32_encode(p, end - p, tth->data, sizeof tth->data); p += TTH_BASE32_SIZE; *p = '\0'; - - return buf; + g_assert(ptr_diff(p, buf) <= sizeof buf); + + buf_copyin(b, buf, sizeof buf); } else { - static char bufCONST_STRLEN("urn:sha1:") + SHA1_BASE32_SIZE + 1; + char bufCONST_STRLEN("urn:sha1:") + SHA1_BASE32_SIZE + 1; sha1_to_urn_string_buf(sha1, buf, sizeof buf); - return buf; + buf_copyin(b, buf, sizeof buf); } + + return buf_data(b); } /** @@ -1263,12 +1447,15 @@ const struct sha1 * base32_sha1(const char *base32) { - static struct sha1 sha1; + static struct sha1 sha1THREAD_MAX; + uint stid = thread_small_id(); + struct sha1 *s = &sha1stid; size_t len; - g_assert(base32); - len = base32_decode(sha1.data, sizeof sha1.data, base32, SHA1_BASE32_SIZE); - return SHA1_RAW_SIZE == len ? &sha1 : NULL; + g_assert(base32 != NULL); + + len = base32_decode(s, sizeof *s, base32, SHA1_BASE32_SIZE); + return SHA1_RAW_SIZE == len ? s : NULL; } /** @@ -1279,12 +1466,15 @@ const char * tth_base32(const struct tth *tth) { - static char bufTTH_BASE32_SIZE + 1; + buf_t *b = buf_private(G_STRFUNC, TTH_BASE32_SIZE + 1); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - g_assert(tth); - base32_encode(buf, sizeof buf, tth->data, sizeof tth->data); - bufsizeof buf - 1 = '\0'; - return buf; + g_assert(tth != NULL); + + n = 1 + base32_encode(p, sz, tth->data, sizeof tth->data); + pMAX(n, sz) - 1 = '\0'; + return p; } /** @@ -1298,12 +1488,15 @@ const struct tth * base32_tth(const char *base32) { - static struct tth tth; + static struct tth tthTHREAD_MAX; + uint stid = thread_small_id(); + struct tth *t = &tthstid; size_t len; - g_assert(base32); - len = base32_decode(tth.data, sizeof tth.data, base32, TTH_BASE32_SIZE); - return TTH_RAW_SIZE == len ? &tth : NULL; + g_assert(base32 != NULL); + + len = base32_decode(t, sizeof *t, base32, TTH_BASE32_SIZE); + return TTH_RAW_SIZE == len ? t : NULL; } /** @@ -1320,8 +1513,8 @@ { g_assert(tth); if (size > 0) { - base32_encode(dst, size, tth->data, sizeof tth->data); - dstsize - 1 = '\0'; + size_t n = 1 + base32_encode(dst, size, tth->data, sizeof tth->data); + dstMIN(n, size) - 1 = '\0'; } return dst; } @@ -1329,8 +1522,11 @@ /** * Convert binary TTH into a urn:ttroot:<base32> string. * - * @param tth A binary TTH. - * @return The TTH converted to an URN string. + * @param tth a binary TTH. + * @param dst the destination buffer + * @param size the size of the destination buffer + * + * @return The length of the resulting URN string. */ size_t tth_to_urn_string_buf(const struct tth *tth, char *dst, size_t size) @@ -1347,17 +1543,22 @@ n = MIN(size, (TTH_BASE32_SIZE + 1)); tth_to_base32_buf(tth, &dstCONST_STRLEN(prefix), n); } - return CONST_STRLEN(prefix) + TTH_BASE32_SIZE + 1; + return CONST_STRLEN(prefix) + TTH_BASE32_SIZE; } const char * tth_to_urn_string(const struct tth *tth) { - static char bufCONST_STRLEN("urn:ttroot:") + TTH_BASE32_SIZE + 1; + buf_t *b = buf_private(G_STRFUNC, + CONST_STRLEN("urn:ttroot:") + TTH_BASE32_SIZE + 1); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - g_assert(tth); - tth_to_urn_string_buf(tth, buf, sizeof buf); - return buf; + g_assert(tth != NULL); + + n = tth_to_urn_string_buf(tth, p, sz); + g_assert(n < sz); + return p; } /** @@ -1371,12 +1572,12 @@ * @return the number of common leading bits, which is at most * min(k1bits, k2bits) if everything matches. */ -G_GNUC_HOT size_t +size_t G_HOT common_leading_bits( - gconstpointer k1, size_t k1bits, gconstpointer k2, size_t k2bits) + const void *k1, size_t k1bits, const void *k2, size_t k2bits) { - const guint8 *p1 = k1; - const guint8 *p2 = k2; + const uint8 *p1 = k1; + const uint8 *p2 = k2; size_t cbits; /* Total amount of bits to compare */ size_t bytes; /* Amount of bytes to compare */ size_t bits; /* Remaining bits in last byte */ @@ -1393,7 +1594,7 @@ bytes = cbits >> 3; for (i = 0; i < bytes; i++) { - guint8 diff = *p1++ ^ *p2++; + uint8 diff = *p1++ ^ *p2++; if (diff) return i * 8 + 7 - highest_bit_set(diff); } @@ -1401,8 +1602,8 @@ bits = cbits & 0x7; if (bits != 0) { - guint8 mask = ~((1 << (8 - bits)) - 1); - guint8 diff = (*p1 & mask) ^ (*p2 & mask); + uint8 mask = ~((1 << (8 - bits)) - 1); + uint8 diff = (*p1 & mask) ^ (*p2 & mask); if (diff) return bytes * 8 + 7 - highest_bit_set(diff); } @@ -1436,7 +1637,7 @@ * Check whether buffer contains printable data, suitable for "%s" printing. * If not, consider dump_hex(). */ -gboolean +bool is_printable(const char *buf, int len) { const char *p = buf; @@ -1452,27 +1653,27 @@ } /** - * Prints a single "dump hex" line which consists of 16 byte from data. + * Prints a single "dump hex" line which consists of 16 bytes of data. * - * @param out The stream to print the string at. - * @param data A pointer to the first byte of the data to dump. - * @param length The length of data in bytes. - * @param offset The offset in data to start dumping at. + * @param out the stream to print the string at. + * @param data a pointer to the first byte of the data to dump. + * @param length the length of data in bytes. + * @param offset the offset of the data being printed. */ static void dump_hex_line(FILE *out, const char *data, size_t length, size_t offset) { char char_buf32, hex_buf64; char *p = hex_buf, *q = char_buf; - size_t j, i = offset; + size_t j, i = 0; for (j = 0; j < 16; j++) { *p++ = ' '; if (8 == j) { *p++ = ' '; } - if (i < length) { - guchar c; + if (i < length) { + uchar c; c = datai; i++; @@ -1491,45 +1692,104 @@ *p = '\0'; *q = '\0'; - fprintf(out, "%5u %s %s\n", (guint) (offset & 0xffff), hex_buf, char_buf); + fprintf(out, "%5u %s %s\n", (uint) (offset & 0xffff), hex_buf, char_buf); } +#define DUMP_LINE_LENGTH 16 /* Amount of bytes per line */ + /** + * Dump scattered data. + * * Displays hex & ascii lines to the specified file (for debug) * Displays the "title" then the characters in "s", # of bytes to print in "b" */ void -dump_hex(FILE *out, const char *title, gconstpointer data, int length) +dump_hex_vec(FILE *out, const char *title, const iovec_t *iov, size_t iovcnt) { - int i; + unsigned i; + char bufDUMP_LINE_LENGTH; + size_t length = 0; + iovec_t *xiov; - if (length < 0 || data == NULL) { - g_carp("dump_hex: value out of range data=%p, length=%d for %s", - data, length, title); - return; - } + g_assert(iov != NULL); + g_assert(iovcnt > 0); if (!log_file_printable(out)) return; fprintf(out, "----------------- %s:\n", title); - for (i = 0; i < length; i += MIN(length - i, 16)) { - if (i % 256 == 0) { - if (i > 0) { + xiov = WCOPY_ARRAY(iov, iovcnt); /* Don't modify argument */ + + for (i = 0; i < iovcnt; /* empty */) { + iovec_t *v = &xiovi; + const void *start = iovec_base(v); + size_t len = iovec_len(v); + size_t dumping; + + if (len < DUMP_LINE_LENGTH) { + memcpy(buf, start, len); + i++; + while (i < iovcnt && len < DUMP_LINE_LENGTH) { + size_t to_copy; + size_t missing = DUMP_LINE_LENGTH - len; + + v = &xiovi++; + start = iovec_base(v); + to_copy = MIN(missing, iovec_len(v)); + memcpy(&buflen, start, to_copy); + len += to_copy; + iovec_set_base(v, const_ptr_add_offset(start, to_copy)); + iovec_set_len(v, iovec_len(v) - to_copy); + } + start = buf; + } else { + iovec_set_base(v, const_ptr_add_offset(start, DUMP_LINE_LENGTH)); + iovec_set_len(v, iovec_len(v) - DUMP_LINE_LENGTH); + } + + if (0 == length % 256) { + if (length != 0) { fputc('\n', out); /* break after 256 byte chunk */ } fputs("Offset 0 1 2 3 4 5 6 7 8 9 a b c d e f " "0123456789abcdef\n", out); } - dump_hex_line(out, data, length, i); + + dumping = MIN(len, DUMP_LINE_LENGTH); + dump_hex_line(out, start, dumping, length); + length += dumping; } - fprintf(out, "----------------- (%d bytes).\n", length); + WFREE_ARRAY(xiov, iovcnt); + + fprintf(out, "----------------- (%u byte%s).\n", + (unsigned) length, plural(length)); fflush(out); } /** + * Dump contiguous data. + * + * Displays hex & ascii lines to the specified file (for debug) + * Displays the "title" then the characters in "s", # of bytes to print in "b" + */ +void +dump_hex(FILE *out, const char *title, const void *data, int length) +{ + iovec_t iov; + + if (length < 0 || data == NULL) { + g_critical("%s(): value out of range data=%p, length=%d for %s", + G_STRFUNC, data, length, title); + return; + } + + iovec_set(&iov, data, length); + dump_hex_vec(out, title, &iov, 1); +} + +/** * Dump text string to the specified file, followed by trailer (if non-NULL). * A final "\n" is emitted at the end. */ @@ -1554,7 +1814,7 @@ * Is string made-up of printable ISO-8859 characters? * If not, consider dump_hex(). */ -gboolean +bool is_printable_iso8859_string(const char *s) { int c; @@ -1579,17 +1839,17 @@ locale_strlower(char *dst, const char *src) { do { - *dst++ = tolower((guchar) *src); + *dst++ = tolower((uchar) *src); } while (*src++); } /** - * Generate a new random GUID within given `xuid'. + * Generate a new random GUID within given `guid'. */ void -guid_random_fill(struct guid *guid) +guid_random_fill(guid_t *guid) { - random_bytes(guid, GUID_RAW_SIZE); + random_strong_bytes(guid, GUID_RAW_SIZE); } /** @@ -1665,11 +1925,11 @@ /** * Find amount of common leading bits between two IP addresses. */ -static G_GNUC_HOT guint8 -find_common_leading(guint32 ip1, guint32 ip2) +static uint8 G_HOT +find_common_leading(uint32 ip1, uint32 ip2) { - guint8 n; - guint32 mask; + uint8 n; + uint32 mask; for (n = 0, mask = 0x80000000; n < 32; n++, mask |= (mask >> 1)) { if ((ip1 & mask) != (ip2 & mask)) @@ -1699,17 +1959,22 @@ */ void ip_range_split( - guint32 lower_ip, guint32 upper_ip, cidr_split_t cb, gpointer udata) + uint32 lower_ip, uint32 upper_ip, cidr_split_t cb, void *udata) { - guint8 bits; - guint32 mask; - guint32 trailing; + uint8 bits; + uint32 mask; + uint32 trailing; g_assert(lower_ip <= upper_ip); bits = find_common_leading(lower_ip, upper_ip); - mask = 1 << (32 - bits); - trailing = mask - 1; + if G_UNLIKELY(0 == bits) { + mask = 0; + trailing = ~0; + } else { + mask = 1 << (32 - bits); + trailing = mask - 1; + } if (bits == 32) { g_assert(lower_ip == upper_ip); @@ -1726,7 +1991,7 @@ (*cb)(lower_ip, bits, udata); } else { - guint32 cut; + uint32 cut; /* * Start filling after the first 1 bit in lower_ip. @@ -1745,7 +2010,7 @@ ip_range_split(cut + 1, upper_ip, cb, udata); } } else { - guint32 cut; + uint32 cut; /* * We can't cover the full range. @@ -1771,22 +2036,11 @@ } } -/* - * Hashing of pointers. - * - * The identity function makes a poor hash for pointers. - */ -unsigned -pointer_hash_func(const void *p) -{ - unsigned long v = pointer_to_ulong(p); - return (((guint64) 0x4F1BBCDCUL * v) >> 32) ^ v; -} - static inline const char * html_escape_replacement(char c, size_t *len) { - static char r; + static char rTHREAD_MAX; + uint stid; #define REPLACE(x) { *len = CONST_STRLEN(x); return (x); } @@ -1804,9 +2058,10 @@ } #undef REPLACE - r = c; + stid = thread_small_id(); + rstid = c; *len = 1; - return &r; + return &rstid; } /** @@ -1824,7 +2079,7 @@ { char *d = dst; const char *s = src; - guchar c; + uchar c; g_assert(0 == dst_size || NULL != dst); g_assert(NULL != src); @@ -1854,16 +2109,16 @@ return d - dst; } -static GHashTable *html_entities_lut; +static htable_t *html_entities_lut; -static G_GNUC_COLD void +static void G_COLD html_entities_init(void) { size_t i; - html_entities_lut = g_hash_table_new(g_str_hash, g_str_equal); - for (i = 0; i < G_N_ELEMENTS(html_entities); i++) { - gm_hash_table_insert_const(html_entities_lut, html_entitiesi.name, + html_entities_lut = htable_create(HASH_KEY_STRING, 0); + for (i = 0; i < N_ITEMS(html_entities); i++) { + htable_insert(html_entities_lut, html_entitiesi.name, uint_to_pointer(html_entitiesi.uc)); } } @@ -1871,7 +2126,7 @@ static void html_entities_close(void) { - gm_hash_table_destroy_null(&html_entities_lut); + htable_free_null(&html_entities_lut); } /** @@ -1881,10 +2136,10 @@ * @param endptr If not NULL, it will be set to point either to * the original string or the next character after * the entity. - * @return On failure (guint32)-1 is returned, on success the + * @return On failure (uint32)-1 is returned, on success the * Unicode codepoint. */ -guint32 +uint32 html_decode_entity(const char * const src, const char **endptr) { if ('&' != src0) @@ -1893,7 +2148,7 @@ if ('#' == src1) { const char *ep, *p; int base, error; - guint32 v; + uint32 v; switch (src2) { case 'x': @@ -1934,21 +2189,21 @@ if (!html_entities_lut) { html_entities_init(); } - value = g_hash_table_lookup(html_entities_lut, name); + value = htable_lookup(html_entities_lut, name); if (NULL == value) goto failure; if (endptr) { *endptr = &p1; } - return pointer_to_uint(value); + return pointer_to_uint(value); } failure: if (endptr) { *endptr = src; } - return (guint32) -1; + return (uint32) -1; } /** @@ -1973,12 +2228,12 @@ * * @return 0 on equality, -1 if s1 < s2 and +1 if s1 > s2. */ -G_GNUC_HOT int +int G_HOT bitcmp(const void *s1, const void *s2, size_t n) { int i, bytes, remain; - const guint8 *p1 = s1, *p2 = s2; - guint8 mask, c1, c2; + const uint8 *p1 = s1, *p2 = s2; + uint8 mask, c1, c2; bytes = n / 8; /* First bytes to compare */ @@ -1994,7 +2249,7 @@ if (0 == remain) return 0; - mask = (guint8) -1 << (8 - remain); + mask = (uint8) -1 << (8 - remain); c1 = *p1 & mask; c2 = *p2 & mask; @@ -2006,7 +2261,7 @@ * Replaces all G_DIR_SEPARATOR characters with the canonic path component * separator '/' (a slash). The string is modified in-place. * - * @param s a pathname. + * @param s a pathname. */ void normalize_dir_separators(char *pathname) @@ -2024,6 +2279,103 @@ } /** + * Special-purpose function to create a string list of directories + * seperated by G_SEARCHPATH_SEPARATOR which may also be part of + * directory names. + */ +static void +dirlist_cat(str_t *str, const char *dir) +{ + str_check(str); + + if (str_len(str) > 0) { + str_putc(str, G_SEARCHPATH_SEPARATOR); + } + if (strchr(dir, G_SEARCHPATH_SEPARATOR)) { + const char *p; + + for (p = dir; '\0' != *p; p++) { + str_putc(str, *p); + if (G_SEARCHPATH_SEPARATOR == *p) { + str_putc(str, G_SEARCHPATH_SEPARATOR); + } + } + } else { + str_cat(str, dir); + } +} + +/** + * Creates a string from the given list of directory pathnames. + * + * @return a newly allocated string which must be freed via hfree(). + */ +char * +dirlist_to_string(const pslist_t *pl_dirs) +{ + const pslist_t *sl; + str_t *str = str_new(0); + + /** + * NB: The separator is escaped by appending another separator. + * This is done because the separator may actually appear + * in a pathname. + */ + + PSLIST_FOREACH(pl_dirs, sl) { + dirlist_cat(str, sl->data); + } + return str_s2c_null(&str); +} + + +/** + * Parse a list of directory pathnames separated by G_SEARCHPATH_SEPARATOR. + * + * @return a list of newly allocated strings which must be freed via hfree(). + */ +pslist_t * +dirlist_parse(const char *dirs) +{ + char *pathname, *s; + const char *p; + pslist_t *pl_dirs = NULL; + + /** + * The list of directories must be unescaped as follows: + * A separator followed by another separator means the pathname + * included the separator itself, so one character must be skipped. + */ + + pathname = halloc(strsize(dirs)); + s = pathname; + + for (p = dirs; /* nothing */; p++) { + int c = *p; + + if (G_SEARCHPATH_SEPARATOR == c) { + if (G_SEARCHPATH_SEPARATOR == p1) { + p++; + } else { + c = '\0'; + } + } + *s++ = c; + if ('\0' == c) { + s = pathname; + if (is_absolute_path(pathname)) { + pl_dirs = pslist_prepend(pl_dirs, h_strdup(pathname)); + } + } + if ('\0' == *p) + break; + } + + HFREE_NULL(pathname); + return pslist_reverse(pl_dirs); +} + +/** * Maps errno values to their symbolic names (e.g., EPERM to "EPERM"). * * @return A const static string. If errno is unhandled its stringified @@ -2045,7 +2397,7 @@ CASE(EAGAIN); CASE(EALREADY); CASE(EBADF); -#ifdef EBADMSG /* MingW */ +#ifdef EBADMSG /* MinGW */ CASE(EBADMSG); #endif CASE(EBUSY); @@ -2062,9 +2414,7 @@ CASE(EFAULT); CASE(EFBIG); CASE(EHOSTUNREACH); -#ifdef EIDRM /* MingW */ - CASE(EIDRM); -#endif + CASE(EIDRM); /* Faked on MinGW */ CASE(EILSEQ); CASE(EINPROGRESS); CASE(EINTR); @@ -2076,7 +2426,7 @@ CASE(EMFILE); CASE(EMLINK); CASE(EMSGSIZE); -#ifdef EMULTIHOP /* MingW */ +#ifdef EMULTIHOP /* MinGW */ CASE(EMULTIHOP); #endif CASE(ENAMETOOLONG); @@ -2085,26 +2435,26 @@ CASE(ENETUNREACH); CASE(ENFILE); CASE(ENOBUFS); -#ifdef ENODATA /* MingW */ +#ifdef ENODATA /* MinGW */ CASE(ENODATA); #endif CASE(ENODEV); CASE(ENOENT); CASE(ENOEXEC); CASE(ENOLCK); -#ifdef ENOLINK /* MingW */ +#ifdef ENOLINK /* MinGW */ CASE(ENOLINK); #endif CASE(ENOMEM); -#ifdef ENOMSG /* MingW */ +#ifdef ENOMSG /* MinGW */ CASE(ENOMSG); #endif CASE(ENOPROTOOPT); CASE(ENOSPC); -#ifdef ENOSR /* MingW */ +#ifdef ENOSR /* MinGW */ CASE(ENOSR); #endif -#ifdef ENOSTR /* MingW */ +#ifdef ENOSTR /* MinGW */ CASE(ENOSTR); #endif CASE(ENOSYS); @@ -2115,10 +2465,10 @@ CASE(ENOTSUP); CASE(ENOTTY); CASE(ENXIO); -#if defined(EOPNOTSUPP) && EOPNOTSUPP != ENOTSUP /* GLIBC and MingW */ +#if defined(EOPNOTSUPP) && EOPNOTSUPP != ENOTSUP /* GLIBC and MinGW */ CASE(EOPNOTSUPP); #endif -#ifdef EOVERFLOW /* MingW */ +#ifdef EOVERFLOW /* MinGW */ CASE(EOVERFLOW); #endif CASE(EPERM); @@ -2133,11 +2483,11 @@ CASE(ESPIPE); CASE(ESRCH); CASE(ESTALE); -#ifdef ETIME /* MingW */ +#ifdef ETIME /* MinGW */ CASE(ETIME); #endif CASE(ETIMEDOUT); -#ifdef ETXTBSY /* MingW */ +#ifdef ETXTBSY /* MinGW */ CASE(ETXTBSY); #endif #if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN @@ -2152,6 +2502,9 @@ #ifdef ENOTBLK CASE(ENOTBLK); #endif +#ifdef ESHUTDOWN + CASE(ESHUTDOWN); +#endif } #undef CASE @@ -2172,10 +2525,139 @@ } /** - * Initialize miscellaneous data structures. + * Adds some lexical indendation to XML-like text. + * + * The input text is assumed to be "flat" and well-formed. If these assumptions + * fail, the output might look worse than the input. + * + * @param text the string to format. + * + * @return a newly allocated string which must be freed via hfree(). */ -G_GNUC_COLD void -misc_init(void) +char * +xml_indent(const char *text) +{ + const char *p, *q; + bool quoted, is_special, is_end, is_start, is_singleton, has_cdata; + guint i, depth = 0; + str_t *s; + + s = str_new(0); + q = text; + + quoted = FALSE; + is_special = FALSE; + is_end = FALSE; + is_start = FALSE; + is_singleton = FALSE; + has_cdata = FALSE; + + for (;;) { + bool had_cdata; + + p = q; + /* + * Find the start of the tag and append the text between the + * previous and the current tag. + */ + for (/* NOTHING */; '<' != *p && '\0' != *p; p++) { + if (is_ascii_space(*p) && is_ascii_space(p1)) + continue; + if (has_cdata && '&' == *p) { + const char *endptr; + guint32 uc; + + uc = html_decode_entity(p, &endptr); + if (uc > 0x00 && uc <= 0xff && '<' != uc && '>' != uc) { + str_putc(s, uc); + p = endptr - 1; + continue; + } + } + str_putc(s, is_ascii_space(*p) ? ' ' : *p); + } + if ('\0' == *p) + break; + + /* Find the end of the tag */ + q = strchr(p, '>'); + if (!q) + q = strchr(p, '\0'); + + is_special = '?' == p1 || '!' == p1; + is_end = '/' == p1; + is_start = !(is_special || is_end); + is_singleton = is_start && '>' == *q && '/' == q-1; + had_cdata = has_cdata; + has_cdata = FALSE; + + if (is_end && depth > 0) { + depth--; + } + if (p != text && !(is_end && had_cdata)) { + str_putc(s, '\n'); + for (i = 0; i < depth; i++) + str_putc(s, '\t'); + } + + quoted = FALSE; + for (q = p; '\0' != *q; q++) { + + if (!quoted && is_ascii_space(*q) && is_ascii_space(q1)) + continue; + + if (is_ascii_space(*q)) { + if (quoted || is_special) { + str_putc(s, ' '); + } else { + str_putc(s, '\n'); + for (i = 0; i < depth + 1; i++) + str_putc(s, '\t'); + } + continue; + } + + if (quoted && '&' == *q) { + const char *endptr; + guint32 uc; + + uc = html_decode_entity(q, &endptr); + if (uc > 0x00 && uc <= 0xff && '"' != uc) { + str_putc(s, uc); + q = endptr - 1; + continue; + } + } + + str_putc(s, *q); + + if ('"' == *q) { + quoted ^= TRUE; + } else if ('>' == *q) { + q++; + break; + } + } + if (is_start && !is_singleton) { + const char *next = strchr(q, '<'); + has_cdata = next && '/' == next1; + depth++; + } + } + + /* Ensure there is a final "\n" in the string */ + + if ('\n' != str_at(s, -1)) + str_putc(s, '\n'); + + return str_s2c_null(&s); +} + +/** + * Initialize miscellaneous data structures, once. + */ +static void G_COLD +misc_init_once(void) { hex2int_init(); dec2int_init(); @@ -2184,8 +2666,8 @@ { static const struct { const char *s; - const guint64 v; - const guint base; + const uint64 v; + const uint base; const int error; } tests = { { "", 0, 10, EINVAL }, @@ -2198,7 +2680,7 @@ { "ffff", 0xffff, 16, 0 }, { "fffff", 0xfffff, 16, 0 }, { "ffffffff", 0xffffffffU, 16, 0 }, - { "ffffffffffffffff", (guint64) -1, 16, 0 }, + { "ffffffffffffffff", (uint64) -1, 16, 0 }, { "1111111111111111", 0xffff, 2, 0 }, { "11111111111111111", 0x1ffff, 2, 0 }, { "111111111111111111", 0x3ffff, 2, 0 }, @@ -2212,25 +2694,25 @@ { "8", 0, 8, EINVAL }, { "9", 0, 9, EINVAL }, }; - guint i; + uint i; - for (i = 0; i < G_N_ELEMENTS(tests); i++) { + for (i = 0; i < N_ITEMS(tests); i++) { const char *endptr; int error; - guint64 v; + uint64 v; g_assert((0 == testsi.v) ^ (0 == testsi.error)); - + error = EAGAIN; endptr = GINT_TO_POINTER(-1); v = parse_uint64(testsi.s, &endptr, testsi.base, &error); g_assert(testsi.v == v); g_assert(testsi.error == error); - + error = EAGAIN; endptr = GINT_TO_POINTER(-1); v = parse_uint32(testsi.s, &endptr, testsi.base, &error); - if (testsi.v > (guint32) -1) { + if (testsi.v > (uint32) -1) { g_assert(0 == v); g_assert(ERANGE == error); } else { @@ -2241,7 +2723,7 @@ error = EAGAIN; endptr = GINT_TO_POINTER(-1); v = parse_uint16(testsi.s, &endptr, testsi.base, &error); - if (testsi.v > (guint16) -1) { + if (testsi.v > (uint16) -1) { g_assert(0 == v); g_assert(ERANGE == error); } else { @@ -2251,12 +2733,80 @@ } } + { + static const struct { + const char *s; + const uint src_len; + const uint res; + } t = { + { "", 1, 0 }, + { "ab", 3, 2 }, + { "ab", 2, 2 }, + { "ab", 1, 1 }, + { "abcdefghi", 10, 9 }, + { "abcdefghi", 7, 7 }, + { "abcdefgh", 9, 8 }, + { "abcdefg", 8, 7 }, + { "abcdef", 7, 6 }, + { "abcdefghijklmnop", 17, 16 }, + { "abcdefghijklmno\0p", 17, 15 }, + { "abcdefghijklmn\0op", 17, 14 }, + { "abcdefghijklm\0nop", 17, 13 }, + { "abcdefghijkl\0mnop", 17, 12 }, + { "abcdefghijk\0lmnop", 17, 11 }, + { "abcdefghij\0klmnop", 17, 10 }, + { "abcdefghi\0jklmnop", 17, 9 }, + { "abcdefgh\0ijklmnop", 17, 8 }, + { "abcdefg", 8, 7 }, + { "abcdef\0g", 8, 6 }, + { "abcde\0fg", 8, 5 }, + { "abcd\0efg", 8, 4 }, + { "abc\0defg", 8, 3 }, + { "ab\0cdefg", 8, 2 }, + { "a\0bcdefg", 8, 1 }, + { "\0abcdefg", 8, 0 }, + }; + uint i; + + for (i = 0; i < N_ITEMS(t); i++) { + const char *s = ti.s; + uint src_len = ti.src_len; + uint res = ti.res; + + g_assert(res <= src_len); + + g_assert_log(res == clamp_strlen(s, src_len), + "clamp_strlen(\"%s\", %d) = %zu, expected %u", + s, src_len, clamp_strlen(s, src_len), res); + + while (res != 0) { + s++; + src_len--; + res--; + + g_assert_log(res == clamp_strlen(s, src_len), + "clamp_strlen(\"%s\", %d) = %zu, expected %u", + s, src_len, clamp_strlen(s, src_len), res); + } + } + } +} + +/** + * Initialize miscellaneous data structures. + */ +void G_COLD +misc_init(void) +{ + static once_flag_t done; + + once_flag_run(&done, misc_init_once); } /** * Final cleanup at shutdown time. */ -void +void G_COLD misc_close(void) { html_entities_close();
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/misc.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/misc.h
Changed
@@ -50,7 +50,8 @@ #include "common.h" #include "fs_free_space.h" -#include "tm.h" +#include "pslist.h" +#include "sha1.h" #include "vmm.h" #define SIZE_FIELD_MAX 64 /**< Max size of sprintf-ed size quantity */ @@ -62,7 +63,7 @@ char strSIZE_FIELD_MAX; } short_string_t; -static inline G_GNUC_CONST ALWAYS_INLINE int +static inline G_CONST ALWAYS_INLINE int is_dir_separator(int c) { return '/' == c || G_DIR_SEPARATOR == c; @@ -75,11 +76,11 @@ * @param x An integer between 0 and 15. * @return The ASCII character corresponding to the hex digit 0-9a-f. */ -static inline G_GNUC_PURE ALWAYS_INLINE guchar -hex_digit(guchar x) +static inline G_PURE ALWAYS_INLINE uchar +hex_digit(uchar x) { extern const char hex_alphabet_lower; - return hex_alphabet_lowerx & 0xf; + return hex_alphabet_lowerx & 0xf; } #if !GLIB_CHECK_VERSION(2,4,0) @@ -116,34 +117,32 @@ /* * Size string conversions */ -const char *short_frequency(guint64 freq); -const char *short_size(guint64 size, gboolean metric); -const char *short_html_size(guint64 size, gboolean metric); -const char *short_kb_size(guint64 size, gboolean metric); -const char *short_kb_size2(guint64 size, gboolean metric); -const char *short_rate(guint64 rate, gboolean metric); -const char *short_byte_size(guint64 size, gboolean metric); -const char *short_byte_size2(guint64 size, gboolean metric); -const char *compact_size(guint64 size, gboolean metric); -const char *compact_size2(guint64 size, gboolean metric); -const char *compact_rate(guint64 rate, gboolean metric); -const char *compact_kb_size(guint32 size, gboolean metric); -const char *nice_size(guint64 size, gboolean metric); -char *short_value(char *buf, size_t size, guint64 v, gboolean metric); -char *compact_value(char *buf, size_t size, guint64 v, gboolean metric); - -size_t short_byte_size_to_buf(guint64 size, gboolean metric, char *, size_t); -size_t short_kb_size_to_buf(guint64 size, gboolean metric, char *, size_t); -size_t short_size_to_string_buf(guint64 size, gboolean metric, char *, size_t); - -short_string_t short_rate_get_string(guint64 rate, gboolean metric); +const char *short_frequency(uint64 freq); +const char *short_size(uint64 size, bool metric); +const char *short_size2(uint64 size, bool metric); +const char *short_html_size(uint64 size, bool metric); +const char *short_kb_size(uint64 size, bool metric); +const char *short_kb_size2(uint64 size, bool metric); +const char *short_rate(uint64 rate, bool metric); +const char *short_byte_size(uint64 size, bool metric); +const char *short_byte_size2(uint64 size, bool metric); +const char *compact_size(uint64 size, bool metric); +const char *compact_size2(uint64 size, bool metric); +const char *compact_rate(uint64 rate, bool metric); +const char *compact_kb_size(uint32 size, bool metric); +const char *nice_size(uint64 size, bool metric); +char *short_value(char *buf, size_t size, uint64 v, bool metric); +char *compact_value(char *buf, size_t size, uint64 v, bool metric); + +size_t short_byte_size_to_buf(uint64 size, bool metric, char *, size_t); +size_t short_kb_size_to_buf(uint64 size, bool metric, char *, size_t); +size_t short_size_to_string_buf(uint64 size, bool metric, char *, size_t); + +short_string_t short_rate_get_string(uint64 rate, bool metric); /* * SHA1<->base32 string conversion */ -typedef struct sha1 { - char dataSHA1_RAW_SIZE; -} sha1_t; #define SHA1_URN_LENGTH (CONST_STRLEN("urn:sha1:") + SHA1_BASE32_SIZE) @@ -156,7 +155,7 @@ const char *sha1_base16(const struct sha1 *); const struct sha1 *base32_sha1(const char *base32); -static inline G_GNUC_PURE int +static inline G_PURE int sha1_cmp(const struct sha1 *a, const struct sha1 *b) { return memcmp(a, b, SHA1_RAW_SIZE); @@ -186,7 +185,7 @@ struct guid; const char *guid_hex_str(const struct guid *); -gboolean hex_to_guid(const char *, struct guid *); +bool hex_to_guid(const char *, struct guid *); size_t guid_to_string_buf(const struct guid *, char *, size_t); const char *guid_to_string(const struct guid *); @@ -194,7 +193,7 @@ * GUID<->base32 string conversion */ const char *guid_base32_str(const struct guid *); -const struct guid *base32_to_guid(const char *); +const struct guid *base32_to_guid(const char *, struct guid *); /* * Generic binary to hexadecimal conversion. @@ -204,13 +203,13 @@ /* * Tests */ -gboolean is_directory(const char *pathname); -gboolean is_regular(const char *pathname); -gboolean is_symlink(const char *pathname); +bool is_directory(const char *pathname); +bool is_regular(const char *pathname); +bool is_symlink(const char *pathname); int is_same_file(const char *, const char *); /** - * Tries to extrace the file mode from a struct dirent. Not all systems + * Tries to extract the file mode from a struct dirent. Not all systems * support this, in which case zero is returned. Types other than regular * files, directories and symlinks are ignored and gain a value of zero * as well. @@ -239,13 +238,27 @@ } #ifndef MINGW32 -/** - * @note NULL is allowed as parameter, see MINGW32 implementation. - */ +/* There is a MINGW32 version defined for Windows in lib/mingw32.c */ static inline const char * dir_entry_filename(const struct dirent *dir_entry) { - return NULL != dir_entry ? dir_entry->d_name : NULL; + g_assert(dir_entry != NULL); + + return dir_entry->d_name; +} + +/* There is a MINGW32 version defined for Windows in lib/mingw32.c */ +static inline size_t +dir_entry_namelen(const struct dirent *dir_entry) +{ + g_assert(dir_entry != NULL); + +#ifdef HAS_DIRENT_D_NAMLEN + if G_LIKELY(dir_entry->d_namlen != 0) + return dir_entry->d_namlen; +#endif /* HAS_DIRENT_D_NAMLEN */ + + return strlen(dir_entry->d_name); } #endif /* MINGW32 */ @@ -257,18 +270,23 @@ void misc_close(void); size_t strchomp(char *str, size_t len); -int hex2int(guchar c); -gboolean is_printable(const char *buf, int len); -void dump_hex(FILE *, const char *, gconstpointer, int); +int hex2int(uchar c); +bool is_printable(const char *buf, int len); +void dump_hex(FILE *, const char *, const void *, int); +void dump_hex_vec(FILE *out, const char *title, + const iovec_t *iov, size_t iovcnt); void dump_string(FILE *out, const char *str, size_t len, const char *trailer); -gboolean is_printable_iso8859_string(const char *s); +bool is_printable_iso8859_string(const char *s); void locale_strlower(char *, const char *); size_t common_leading_bits( - gconstpointer k1, size_t k1bits, gconstpointer k2, size_t k2bits) - G_GNUC_PURE; + const void *k1, size_t k1bits, const void *k2, size_t k2bits) + G_PURE; float force_range(float value, float min, float max); const char *short_filename(const char *fullname); char *data_hex_str(const char *data, size_t len); +char *xml_indent(const char *text); +pslist_t *dirlist_parse(const char *dirs); +char *dirlist_to_string(const pslist_t *pl_dirs); #if defined(S_IROTH) && defined(S_IXOTH) /* 0755 */ @@ -282,17 +300,28 @@ char *is_strprefix(const char *s, const char *prefix) WARN_UNUSED_RESULT; char *is_strcaseprefix(const char *s, const char *prefix) WARN_UNUSED_RESULT; -gboolean is_strsuffix(const char *str, size_t len, const char *suffix); +char *is_strsuffix(const char *str, size_t len, const char *suffix); +char *is_strcasesuffix(const char *str, size_t len, const char *suffix); char *is_bufprefix(const char *str, size_t len, const char *prefix); char *is_bufcaseprefix(const char *str, size_t len, const char *prefix); size_t html_escape(const char *src, char *dst, size_t dst_size); -guint32 html_decode_entity(const char *src, const char **endptr); +uint32 html_decode_entity(const char *src, const char **endptr); const char *symbolic_errno(int errnum); void normalize_dir_separators(char *); size_t memcmp_diff(const void *a, const void *b, size_t n); int bitcmp(const void *s1, const void *s2, size_t n); -unsigned pointer_hash_func(const void *p); +size_t clamp_strlen(const char *src, size_t src_size); + +/** + * Returns the length of the string plus one, i.o.w. + * the required buffer size in bytes. + */ +static inline size_t +strsize(const char *src) +{ + return strlen(src) + 1; +} /** * An strcpy() that returns the length of the copied string. @@ -308,7 +337,7 @@ if (NULL == src) return 0; - + while ((c = *p++)) *q++ = c; @@ -318,43 +347,17 @@ } /** - * Determines the length of a NUL-terminated string looking only at the first - * "src_size" bytes. If src0..size contains no NUL byte, "src_size" is - * returned. Otherwise, the returned value is identical to strlen(str). Thus, - * it is safe to pass a possibly non-terminated buffer. - * - * @param src An initialized buffer. - * @param src_size The size of src in number of bytes. IF AND ONLY IF, - * src is NUL-terminated, src_size may exceed the actual buffer length. - * @return The number of bytes in "src" before the first found NUL or src_size - * if there is no NUL. - */ -static inline size_t -clamp_strlen(const char *src, size_t src_size) -{ - const char *p; - - /* @NOTE: memchr() is intentionally NOT used because 'src_size' is allowed - * to exceed the size of the memory object 'src'. - */ - for (p = src; src_size-- > 0 && '\0' != *p; p++) - continue; - - return p - src; -} - -/** * Copies at most MIN(dst_size, src_len) bytes from "src" to "dst". * * @param dst the destination buffer. - * @param dst_size the size of dst in number of bytes. - * @param src the source buffer. + * @param dst_size the size of dst in number of bytes. + * @param src the source buffer. * @param src_len the length of src in number of bytes. * * @return The number of copied bytes. */ static inline size_t -clamp_memcpy(char *dst, size_t dst_size, const char *src, size_t src_len) +clamp_memcpy(void *dst, size_t dst_size, const void *src, size_t src_len) { size_t n; @@ -368,13 +371,13 @@ * * @param dst the destination buffer. * @param dst_size the size of dst in number of bytes. - * @param c the value to set each byte to. + * @param c the value to set each byte to. * @param n the number of bytes to set. * * @return The number of set bytes. */ static inline size_t -clamp_memset(char *dst, size_t dst_size, char c, size_t n) +clamp_memset(void *dst, size_t dst_size, char c, size_t n) { n = MIN(dst_size, n); memset(dst, c, n); @@ -382,6 +385,22 @@ } /** + * Compare at most MIN(a_len, b_len) bytes between "a" and "b". + * + * @param a the first buffer. + * @param a_len the length of the first buffer, in bytes + * @param b the second buffer. + * @param b_len the length of the second buffer, in bytes + * + * @return the result of the memcmp() operation (-1, 0, +1). + */ +static inline int +clamp_memcmp(const void *a, size_t a_len, const void *b, size_t b_len) +{ + return memcmp(a, b, MIN(a_len, b_len)); +} + +/** * Copies at most MIN(dst_size - 1, src_len) characters from the buffer "src" * to the buffer "dst", ensuring the resulting string in "dst" is * NUL-terminated and truncating it if necessary. If "src_len" is (size_t)-1, @@ -391,7 +410,7 @@ * @NOTE: The 'dst' buffer is NOT padded with NUL-bytes. * * @param dst the destination buffer. - * @param dst_size the size of dst in number of bytes. + * @param dst_size the size of dst in number of bytes. * @param src a NUL-terminated string or at an initialized buffer of least * "src_len" bytes. * @param src_len the length of src in number of bytes to copy at maximum. May @@ -424,7 +443,7 @@ * @NOTE: The 'dst' buffer is NOT padded with NUL-bytes. * * @param dst the destination buffer. - * @param dst_size the size of dst in number of bytes. + * @param dst_size the size of dst in number of bytes. * @param src a NUL-terminated string. * * @return The length of the resulting string in number of bytes. @@ -443,7 +462,7 @@ * @NOTE: The 'dst' buffer is NOT padded with NUL-bytes. * * @param dst the destination buffer. Must be initialized. - * @param dst_size the size of dst in number of bytes. + * @param dst_size the size of dst in number of bytes. * @param src a NUL-terminated string. * * @return The length of the resulting string in number of bytes. @@ -474,30 +493,30 @@ /** * Is string NULL or empty? */ -static inline gboolean +static inline bool is_null_or_empty(const char *s) { return NULL == s || '\0' == *s; } /** - * Swap endianness of a guint32. + * Swap endianness of a uint32. * - * @param i the guint32 to swap + * @param i the uint32 to swap * * @returns the value of i after swapping its byte order. */ -static inline G_GNUC_CONST guint32 -swap_guint32(guint32 i) +static inline G_CONST uint32 +swap_uint32(uint32 i) { - guint32 a; - guint32 b; + uint32 a; + uint32 b; /* i -> ABCD */ a = (i & 0x00ff00ff) << 8; /* a -> B0D0 */ b = (i & 0xff00ff00) >> 8; /* b -> 0A0C */ i = a | b; /* i -> BADC */ i = (i << 16) | (i >> 16); /* i -> DCBA */ - + return i; } @@ -509,15 +528,15 @@ * @param netmask an IPv4 netmask in host byte order. * @return The CIDR prefix length (0..32). */ -static inline G_GNUC_CONST WARN_UNUSED_RESULT guint8 -netmask_to_cidr(guint32 netmask) +static inline G_CONST WARN_UNUSED_RESULT uint8 +netmask_to_cidr(uint32 netmask) #ifdef HAS_BUILTIN_POPCOUNT { return __builtin_popcount(netmask); } #else /* !HAS_BUILTIN_POPCOUNT */ { - guint8 bits = 32; + uint8 bits = 32; while (0 == (netmask & 0x1)) { netmask >>= 1; @@ -534,10 +553,10 @@ * @param bits A value between 1..32. * @return The equivalent netmask in host byte order. */ -static inline ALWAYS_INLINE G_GNUC_CONST WARN_UNUSED_RESULT guint32 -cidr_to_netmask(guint bits) +static inline ALWAYS_INLINE G_CONST WARN_UNUSED_RESULT uint32 +cidr_to_netmask(uint bits) { - return (guint32)-1 << (32 - bits); + return (uint32)-1 << (32 - bits); } /** @@ -568,13 +587,10 @@ * Syscall wrappers for errno == 0 bug. --RAM, 27/10/2003 */ -static inline gboolean +static inline bool is_temporary_error(int error) { switch (error) { -#ifdef WSAEWOULDBLOCK - case WSAEWOULDBLOCK: -#endif case EAGAIN: #if defined(EWOULDBLOCK) && EAGAIN != EWOULDBLOCK case EWOULDBLOCK: @@ -589,18 +605,18 @@ int seek_to_filepos(int fd, filesize_t pos); filesize_t get_random_file_offset(const filesize_t size); -guint filesize_per_100(filesize_t size, filesize_t part); -guint filesize_per_1000(filesize_t size, filesize_t part); -guint filesize_per_10000(filesize_t size, filesize_t part); +uint filesize_per_100(filesize_t size, filesize_t part); +uint filesize_per_1000(filesize_t size, filesize_t part); +uint filesize_per_10000(filesize_t size, filesize_t part); /* * CIDR split of IP range. */ -typedef void (*cidr_split_t)(guint32 ip, guint bits, gpointer udata); +typedef void (*cidr_split_t)(uint32 ip, uint bits, void *udata); void ip_range_split( - guint32 lower_ip, guint32 upper_ip, cidr_split_t cb, gpointer udata); + uint32 lower_ip, uint32 upper_ip, cidr_split_t cb, void *udata); /** * Perform a binary search over an array. @@ -650,7 +666,7 @@ #define BINARY_ARRAY_SORTED(bs_array, bs_type, bs_field, bs_cmp, bs_field2str) \ G_STMT_START { \ size_t bs_index; \ - size_t bs_size = G_N_ELEMENTS(bs_array); \ + size_t bs_size = N_ITEMS(bs_array); \ \ for (bs_index = 1; bs_index < bs_size; bs_index++) { \ const bs_type *prev = &bs_arraybs_index - 1; \ @@ -669,8 +685,8 @@ * @param x An integer between 0 and 9. * @return The ASCII character corresponding to the decimal digit 0-9. */ -static inline guchar -dec_digit(guchar x) +static inline uchar +dec_digit(uchar x) { static const char dec_alphabet = "0123456789"; return dec_alphabetx % 10; @@ -691,14 +707,14 @@ * @return The resulting length of string not counting the termating NUL. * Note that NULs that might have been copied from "src" are * included in this count. Thus strlen(dst) would return a lower - * value in this case. + * value in this case. */ static inline size_t reverse_strlcpy(char * const dst, size_t size, const char *src, size_t src_len) { char *p = dst; - + if (size-- > 0) { const char *q = &srcsrc_len, *end = &dstMIN(src_len, size); @@ -711,6 +727,52 @@ return p - dst; } +/** + * Encodes a variable-length integer. This encoding is equivalent to + * little-endian encoding whereas trailing zeros are discarded. + * + * @param v the value to encode. + * @param data must point to a sufficiently large buffer. At maximum + * 8 bytes are required. + * + * @return the length in bytes of the encoded variable-length integer. + */ +static inline int +vlint_encode(uint64 v, char *data) +{ + char *p; + + for (p = data; v != 0; v >>= 8) { + *p++ = v & 0xff; + } + + return p - data; +} + +/** + * Decodes a variable-length integer. This encoding is equivalent to + * little-endian encoding whereas trailing zeros are discarded. + * + * @param data the payload to decode. + * @param len the length of data in bytes. + * + * @return The decoded value. + */ +static inline uint64 +vlint_decode(const char *data, size_t len) +{ + uint64 v; + uint i; + + v = 0; + if (len <= 8) { + for (i = 0; i < len; i++) { + v |= (((uint64) datai) & 0xff) << (i * 8); + } + } + return v; +} + #endif /* _misc_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/mtwist.c
Added
@@ -0,0 +1,829 @@ +/* + * Copyright (c) 2001 Geoff Kuenning + * + * Adaptated and enhanced for inclusion in gtk-gnutella by Raphael Manfredi. + * Copyright (c) 2012-2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Mersenne Twister Pseudo Random Number Generator. + * + * This is a stripped-down implementation originating from the LGPL version + * from Geoff Kuenning, released March 18, 2001, mostly keeping the core + * random number generation algorithm. Additional API routines were added + * by Raphael Manfredi. + * + * Original source code written by Geoff was obtained at: + * http://www.cs.hmc.edu/~geoff/tars/mtwist-1.1.tgz + * + * The Mersenne Twister PRNG was originally developped by Makoto Matsumoto + * and Takuji Nishimura circa 1997. For more information on that algorithm, + * look here: + * http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html + * + * Notes from the manual page in Geoff package, plus additions by RAM: + * + * All of the PRNG functions work from a state vector, which is of type + * mt_state_t. The state vector stores everything that the PRNG needs to + * generate new numbers in the proper sequence. By using multiple state + * vectors, programs can draw random numbers from independent sequences, + * which is important in applications such as simulation (where each + * independent random variable should be drawn from its own sequence to + * avoid unintentional correlations). + * + * For convenience, the interface provides a built-in default state vector + * that is used by mt_xxx() functions. On the other hand, mts_xxx() functions + * manage a user-supplied state. + * + * A new mt_state_t, possibly initialized through a supplied 32-bit random + * function, can be created by mt_state_new() and cloned by mt_state_clone(). + * These states are disposed of by mt_state_free_null(). Cloning allows one to + * snapshot the state to replay the random sequence later. It requires + * an initialized state. + * + * If the state is not initialized with random values (either one created via + * mt_state_new() or for the built-in default state), it will be intialized + * as needed the first time it is used by generating random values with the + * aje_rand() routine. + * + * When using user-supplied states, no lock protection occurs unless + * mts_lock_xxx() routines are used. This allows faster execution paths + * with thread-private states, but the user must not call mts_xxx() with a + * shared state if that call can happen from multiple threads. + * + * The mt_xxx() functions are thread-safe already, as a lock is always + * taken before accessing the built-in default state. + * + * The mt_thread_xxx() functions are thread-safe and use a lock-free path, + * which results in an even greater throughput. They rely on a thread-local + * random pool. + * + * For the curious, a Mersenne number is an integer that is one less than + * a power-of-two. For instance 2^32 - 1 is a Mersenne number. This + * implementation of the Mersenne Twister has a period of 2^19937 - 1, + * which is a Mersenne number, that also happens to be a Mersenne prime. + * + * The name of the Mersenne Twister comes from that, and by fortuity its + * abbreviation, MT, represents the initials of the first names of the + * two inventors of the algorithm. Probably a happy coincidence... + * + * @author Geoff Kuenning + * @date 2001 + * @author Raphael Manfredi + * @date 2012-2013 + */ + +#include "common.h" + +#include "mtwist.h" + +#include "aje.h" +#include "omalloc.h" +#include "once.h" +#include "random.h" +#include "spinlock.h" +#include "stacktrace.h" +#include "thread.h" +#include "walloc.h" + +/* + * The following value is a fundamental parameter of the algorithm. + * It was found experimentally using methods described in Matsumoto + * and Nishimura's paper. It is exceedingly magic; don't change it. + */ +#define MT_STATE_SIZE 624 /* Size of the MT state vector */ + +/* + * Internal state for an MT PRNG. The user can keep multiple mt_state + * structures around as a way of generating multiple streams of random + * numbers. + * + * In Matsumoto and Nishimura's original paper, the state vector was + * processed in a forward direction. I have reversed the state vector + * in this implementation. The reason for the reversal is that it + * allows the critical path to use a test against zero instead of a + * test against 624 to detect the need to refresh the state. on most + * machines, testing against zero is slightly faster. It also means + * that a state that has been set to all zeros will be correctly + * detected as needing initialization; this means that setting a state + * vector to zero (either with memset or by statically allocating it) + * will cause the PRNG to operate properly. + */ + +enum mt_state_magic { MT_STATE_MAGIC = 0x010e1872 }; + +struct mt_state { + enum mt_state_magic magic; /* Magic number (added by RAM) */ + uint32 vecMT_STATE_SIZE; /* Vector holding current state */ + spinlock_t lock; /* Lock for thread-safe accesses */ + int sp; /* Next state entry to be used */ + int initialized; /* NZ if state was initialized */ +}; + +static void +mt_state_check(const struct mt_state * const mts) +{ + g_assert(mts != NULL); + g_assert(MT_STATE_MAGIC == mts->magic); +} + +#define STATE_LOCK(m) spinlock_hidden(&m->lock) +#define STATE_UNLOCK(m) spinunlock_hidden(&m->lock) + +static void mts_discard(mt_state_t *mts); + +/** + * Initialize the state with random values drawn from specified PRNG function. + * + * @param rf random function to initialize the state + * @param mts the MT state we want to initialize + * + * (function added by RAM) + */ +static void +mts_seed_with(random_fn_t rf, mt_state_t *mts) +{ + unsigned i; + + random_bytes_with(rf, &mts->vec, sizeof mts->vec); + + /* + * Make sure we have no value set to 0. If any were generated, we + * supersede them with another non-zero random value. + */ + + for (i = 0; i < N_ITEMS(mts->vec); i++) { + if G_UNLIKELY(0 == mts->veci) { + uint32 v, n = 0; + + while (0 == (v = (*rf)()) && n++ < 100) + /* empty */; + + if G_UNLIKELY(0 == v) { + s_error("bad luck with random number generator %s()", + stacktrace_function_name(rf)); + } + + mts->veci = v; + } + } + + spinlock_init(&mts->lock); + mts->initialized = TRUE; +} + +/* + * The following values are fundamental parameters of the algorithm. + * With the exception of the two masks, all of them were found + * experimentally using methods described in Matsumoto and Nishimura's + * paper. They are exceedingly magic; don't change them. + * + * R_OFFSET: + * Offset into state space for the recurrence relation. The recurrence mashes + * together two values that are separated by this offset in the state space. + * + * MATRIX_A: + * Constant vector A for the recurrence relation. The mashed-together value + * is multiplied by this vector to get a new value that will be stored into + * the state space. + */ +#define R_OFFSET 397 +#define MATRIX_A 0x9908b0df + +/* + * Masks for extracting the bits to be mashed together. The widths of these + * masks are also fundamental parameters of the algorithm, determined + * experimentally -- but of course the masks themselves are simply bit + * selectors. + */ +#define UPPER_MASK 0x80000000 /* Most significant w-r bits */ +#define LOWER_MASK 0x7fffffff /* Least significant r bits */ + +/* + * Macro to simplify code in the generation loop. This function + * combines the top bit of x with the bottom 31 bits of y. + */ +#define COMBINE_BITS(x, y) \ + (((x) & UPPER_MASK) | ((y) & LOWER_MASK)) + +/* + * Another generation-simplification macro. This one does the magic + * scrambling function. + */ +#define MATRIX_MULTIPLY(original, new) \ + ((original) ^ ((new) >> 1) \ + ^ matrix_decider(new) & 0x1) + +/* + * In the recurrence relation, the new value is XORed with MATRIX_A only if + * the lower bit is nonzero. Since most modern machines don't like to + * branch, it's vastly faster to handle this decision by indexing into an + * array. The chosen bit is used as an index into the following vector, + * which produces either zero or MATRIX_A and thus the desired effect. + */ +static const uint32 matrix_decider2 = { 0, MATRIX_A }; + +/** + * Generate 624 more random values. + * + * This function is called when the state vector has been exhausted. + * It generates another batch of pseudo-random values. The performance of + * this function is critical to the performance of the Mersenne Twister PRNG, + * so it has been highly optimized. + * + * @param state state for the PRNG + */ +static void G_HOT +mts_refresh(register mt_state_t *mts) +{ + register int i; /* Index into the state */ + register uint32 *sp; /* Next place to get from state */ + register uint32 val1; /* Scratch val picked up from state */ + register uint32 val2; /* Scratch val picked up from state */ + + /* + * Start by making sure a random seed has been set. If not, set one. + */ + + if G_UNLIKELY(!mts->initialized) { + mts_seed_with(aje_rand, mts); + g_assert(mts->initialized); /* No recursion via mts_discard()! */ + mts_discard(mts); + } + + /* + * Now generate the new pseudo-random values by applying the + * recurrence relation. We use two loops and a final + * 2-statement sequence so that we can handle the wraparound + * explicitly, rather than having to use the relatively slow + * modulus operator. + * + * In essence, the recurrence relation concatenates bits + * chosen from the current random value (last time around) + * with the immediately preceding one. Then it matrix-multiplies + * the concatenated bits with a value R_OFFSET away and a constant + * matrix. The matrix multiplication reduces to a shift and two XORs. + * + * Some comments on the optimizations are in order: + * + * Strictly speaking, none of the optimizations should be + * necessary. All could conceivably be done by a really good + * compiler. However, the compilers available to me aren't quite + * smart enough, so hand optimization needs to be done. + * + * Shawn Cokus was the first to achieve a major speedup. In the + * original code, the first value given to COMBINE_BITS (in my + * characterization) was re-fetched from the state array, rather + * than being carried in a scratch variable. Cokus noticed that + * the first argument to COMBINE_BITS could be saved in a register + * in the previous loop iteration, getting rid of the need for an + * expensive memory reference. + * + * Cokus also switched to using pointers to access the state + * array and broke the original loop into two so that he could + * avoid using the expensive modulus operator. Cokus used three + * pointers; Richard J. Wagner noticed that the offsets between + * the three were constant, so that they could be collapsed into a + * single pointer and constant-offset accesses. This is clearly + * faster on x86 architectures, and is the same cost on RISC + * machines. A secondary benefit is that Cokus' version was + * register-starved on the x86, while Wagner's version was not. + * + * I made several smaller improvements to these observations. + * First, I reversed the contents of the state vector. In the + * current version of the code, this change doesn't directly + * affect the performance of the refresh loop, but it has the nice + * side benefit that an all-zero state structure represents an + * uninitialized generator. It also slightly speeds up the + * random-number routines, since they can compare the state + * pointer against zero instead of against a constant (this makes + * the biggest difference on RISC machines). + * + * Second, I returned to Matsumoto and Nishimura's original + * technique of using a lookup table to decide whether to xor the + * constant vector A (MATRIX_A in this code) with the newly + * computed value. Cokus and Wagner had used the ?: operator, + * which requires a test and branch. Modern machines don't like + * branches, so the table lookup is faster. + * + * Third, in the Cokus and Wagner versions the loop ends with a + * statement similar to "value1 = value2", which is necessary to + * carry the fetched value into the next loop iteration. I + * recognized that if the loop were unrolled so that it generates + * two values per iteration, a bit of variable renaming would get + * rid of that assignment. A nice side effect is that the + * overhead of loop control becomes only half as large. + * + * It is possible to improve the code's performance somewhat + * further. In particular, since the second loop's loop count + * factors into 2*2*3*3*11, it could be unrolled yet further. + * That's easy to do, too: just change the "/ 2" into a division + * by whatever factor you choose, and then use cut-and-paste to + * duplicate the code in the body. To remove a few more cycles, + * fix the code to decrement `sp' by the unrolling factor, and + * adjust the various offsets appropriately. However, the payoff + * will be small. At the moment, the x86 version of the loop is + * 25 instructions, of which 3 are involved in loop control + * (including the decrementing of `sp'). Further unrolling by + * a factor of 2 would thus produce only about a 6% speedup. + * + * The logical extension of the unrolling + * approach would be to remove the loops and create 624 + * appropriate copies of the body. However, I think that doing + * the latter is a bit excessive! + * + * I suspect that a superior optimization would be to simplify the + * mathematical operations involved in the recurrence relation. + * However, I have no idea whether such a simplification is + * feasible. + */ + + sp = &mts->vecMT_STATE_SIZE - 1; + val1 = *sp; + + for (i = (MT_STATE_SIZE - R_OFFSET) / 2; --i >= 0; /* empty */) { + sp -= 2; + val2 = sp1; + val1 = COMBINE_BITS(val1, val2); + sp2 = MATRIX_MULTIPLY(sp-R_OFFSET + 2, val1); + val1 = sp0; + val2 = COMBINE_BITS(val2, val1); + sp1 = MATRIX_MULTIPLY(sp-R_OFFSET + 1, val2); + } + + val2 = *--sp; + val1 = COMBINE_BITS(val1, val2); + sp1 = MATRIX_MULTIPLY(sp-R_OFFSET + 1, val1); + + for (i = (R_OFFSET - 1) / 2; --i >= 0; /* empty */) { + sp -= 2; + val1 = sp1; + val2 = COMBINE_BITS(val2, val1); + sp2 = MATRIX_MULTIPLY(spMT_STATE_SIZE - R_OFFSET + 2, val2); + val2 = sp0; + val1 = COMBINE_BITS(val1, val2); + sp1 = MATRIX_MULTIPLY(spMT_STATE_SIZE - R_OFFSET + 1, val1); + } + + /* + * The final entry in the table requires the "previous" value + * to be gotten from the other end of the state vector, so it + * must be handled specially. + */ + + val1 = COMBINE_BITS(val2, mts->vecMT_STATE_SIZE - 1); + *sp = MATRIX_MULTIPLY(spMT_STATE_SIZE - R_OFFSET, val1); + + /* + * Now that refresh is complete, reset the state pointer to allow more + * pseudo-random values to be fetched from the state array. + */ + + mts->sp = MT_STATE_SIZE; +} + +/** + * Discard random numbers following the initialization of the state to make + * sure the generated numbers exhibit good statistical properties. + * + * (function added by RAM) + */ +static void +mts_discard(mt_state_t *mts) +{ + int i; + + for (i = 0; i < 100; i++) { /* Discard the first 624 * 100 numbers */ + mts_refresh(mts); + } +} + +/* + * Tempering parameters. These are perhaps the most magic of all the magic + * values in the algorithm. The values are again experimentally determined. + * The values generated by the recurrence relation (constants above) are not + * equidistributed in 623-space. For some reason, the tempering process + * produces that effect. Don't ask me why. Read the paper if you can + * understand the math. Or just trust these magic numbers. + */ +#define MT_TEMPERING_MASK_B 0x9d2c5680 +#define MT_TEMPERING_MASK_C 0xefc60000 +#define MT_TEMPERING_SHIFT_U(y) (y >> 11) +#define MT_TEMPERING_SHIFT_S(y) (y << 7) +#define MT_TEMPERING_SHIFT_T(y) (y << 15) +#define MT_TEMPERING_SHIFT_L(y) (y >> 18) + +/* + * Macros to do the tempering. MT_PRE_TEMPER does all but the last step; + * it's useful for situations where the final step can be incorporated + * into a return statement. MT_FINAL_TEMPER does that final step (not as + * an assignment). + * + * The MT_TEMPER macro does the whole process. + * + * Note that both MT_PRE_TEMPER and MT_TEMPER modify their arguments. + */ +#define MT_PRE_TEMPER(value) G_STMT_START { \ + value ^= MT_TEMPERING_SHIFT_U(value); \ + value ^= MT_TEMPERING_SHIFT_S(value) & MT_TEMPERING_MASK_B; \ + value ^= MT_TEMPERING_SHIFT_T(value) & MT_TEMPERING_MASK_C; \ +} G_STMT_END + +#define MT_FINAL_TEMPER(value) ((value) ^ MT_TEMPERING_SHIFT_L(value)) + +#define MT_TEMPER(value) G_STMT_START { \ + MT_PRE_TEMPER(value); \ + value ^= MT_TEMPERING_SHIFT_L(value); \ +} G_STMT_END + +/** + * Generate a random number in the range 0 to 2^32-1, inclusive, working + * from a given state vector. + * + * The generator is optimized for speed. The primary optimization is that + * the pseudo-random numbers are generated in batches of MT_STATE_SIZE. This + * saves the cost of a modulus operation in the critical path. + * + * @param mts state for the PRNG + * + * @return a 32-bit random number + */ +static uint32 +mts_rand_internal(register mt_state_t *mts) +{ + register uint32 rn; /* Pseudo-random value generated */ + + if G_UNLIKELY(mts->sp <= 0) + mts_refresh(mts); + + rn = mts->vec--mts->sp; + MT_PRE_TEMPER(rn); + return MT_FINAL_TEMPER(rn); +} + +/* + * Generate a random number in the range 0 to 2^64-1, inclusive, working + * from a given state vector. + * + * According to Matsumoto and Nishimura, such a number can be generated by + * simply concatenating two 32-bit pseudo-random numbers. Who am I to argue? + * + * Note that there is a slight inefficiency here: if the 624-entry state is + * recycled on the second call to mts_rand(), there will be an unnecessary + * check to see if the state has been initialized. The cost of that check + * seems small (since it happens only once every 624 random numbers, and + * never if only 64-bit numbers are being generated), so I didn't bother to + * optimize it out. Doing so would be messy, since it would require two + * nearly-identical internal implementations of mts_rand(). + * + * @param mts state for the PRNG + * + * @return a 64-bit random number + */ +static uint64 +mts_rand64_internal(register mt_state_t *mts) +{ + register uint32 rn1; /* 1st pseudo-random value generated */ + register uint32 rn2; /* 2nd pseudo-random value generated */ + + /* + * For maximum speed, we'll handle the two overflow cases + * together. That will save us one test in the common case, at + * the expense of an extra one in the overflow case. + */ + + if G_UNLIKELY(--mts->sp <= 0) { + if (mts->sp < 0) { + mts_refresh(mts); + rn1 = mts->vec--mts->sp; + } else { + rn1 = mts->vecmts->sp; + mts_refresh(mts); + } + } else { + rn1 = mts->vecmts->sp; + } + + MT_TEMPER(rn1); + + rn2 = mts->vec--mts->sp; + MT_PRE_TEMPER(rn2); + + return ((uint64) rn1 << 32) | (uint64) MT_FINAL_TEMPER(rn2); +} + +/** + * Generate a random number in the range 0 to 2^32-1, inclusive, working + * from a given state vector. + * + * @param mts state for the PRNG + * + * @return a 32-bit random number + */ +uint32 +mts_rand(register mt_state_t *mts) +{ + mt_state_check(mts); + + return mts_rand_internal(mts); +} + +/** + * Generate a random number in the range 0 to 2^64-1, inclusive, working + * from a given state vector. + * + * @param mts state for the PRNG + * + * @return a 64-bit random number + */ +uint64 +mts_rand64(register mt_state_t *mts) +{ + mt_state_check(mts); + + return mts_rand64_internal(mts); +} + +/** + * Generate a random number in the range 0 to 2^32-1, inclusive, working + * from a given state vector. + * + * @param mts state for the PRNG, locked before access + * + * @return a 32-bit random number + * + * (function added by RAM) + */ +uint32 +mts_lock_rand(register mt_state_t *mts) +{ + uint32 rn; + + mt_state_check(mts); + + STATE_LOCK(mts); + rn = mts_rand_internal(mts); + STATE_UNLOCK(mts); + + return rn; +} + +/** + * Generate a random number in the range 0 to 2^64-1, inclusive, working + * from a given state vector. + * + * @param mts state for the PRNG, locked before access + * + * @return a 64-bit random number + * + * (function added by RAM) + */ +uint64 +mts_lock_rand64(register mt_state_t *mts) +{ + uint64 rn; + + mt_state_check(mts); + + STATE_LOCK(mts); + rn = mts_rand64_internal(mts); + STATE_UNLOCK(mts); + + return rn; +} + +/* + * The default built-in state does not use the embedded lock in the state + * because it needs to be statically initialized. Therefore, we use an + * explicit spinlock. + */ + +static mt_state_t mt_default; +static spinlock_t mtwist_lck = SPINLOCK_INIT; + +#define MTWIST_LOCK spinlock_hidden(&mtwist_lck) +#define MTWIST_UNLOCK spinunlock_hidden(&mtwist_lck) + +/** + * Generate a random number in the range 0 to 2^32-1, inclusive. + * + * @return a 32-bit random number + */ +uint32 +mt_rand(void) +{ + uint32 rn; + + MTWIST_LOCK; + rn = mts_rand_internal(&mt_default); + MTWIST_UNLOCK; + + return rn; +} + +/** + * Generate a random number in the range 0 to 2^64-1, inclusive. + * + * @return a 64-bit random number + */ +uint64 +mt_rand64(void) +{ + uint64 rn; + + MTWIST_LOCK; + rn = mts_rand64_internal(&mt_default); + MTWIST_UNLOCK; + + return rn; +} + +/*** + *** The following are additional routines not present in Geoff's code. + ***/ + +/** + * Allocate a new state, initialized randomly using supplied random function. + * + * If the random function is NULL, the state is left zeroed and it will + * be automatically initialized the first time it is used. + * + * @param rf random function to initialize the state + * + * @return a new state that can be freed with mt_state_free_null(). + */ +mt_state_t * +mt_state_new(random_fn_t rf) +{ + mt_state_t *mts; + + WALLOC0(mts); + mts->magic = MT_STATE_MAGIC; + + if (rf != NULL) { + mts_seed_with(rf, mts); + mts_discard(mts); + } + + return mts; +} + +/** + * Clone state, allowing replay of a random number generation sequence. + * + * The state must already be initialized otherwise cloning would be useless + * since an uninitialized state will be auto-magically initialized the first + * time it is used, by generating random values. + * + * @param mts the initialized state to clone + * + * @return a copy of the state which can be freed with mt_state_free_null(). + */ +mt_state_t * +mt_state_clone(const mt_state_t *mts) +{ + mt_state_t *cmts, *wmts; + + mt_state_check(mts); + g_assert(mts->initialized); + + wmts = deconstify_pointer(mts); /* Only hidden state is changed */ + + STATE_LOCK(wmts); + cmts = WCOPY(wmts); + STATE_UNLOCK(wmts); + + spinlock_init(&cmts->lock); /* Was locked when cloned */ + + return cmts; +} + +/** + * Free MT state and nullify its pointer. + */ +void +mt_state_free_null(mt_state_t **mts_ptr) +{ + mt_state_t *mts = *mts_ptr; + + if (mts != NULL) { + mt_state_check(mts); + WFREE(mts); + *mts_ptr = NULL; + } +} + +static once_flag_t mtp_key_inited; +static thread_key_t mtp_key = THREAD_KEY_INIT; + +/** + * Create the thread-local random pool key, once. + */ +static void +mtp_key_init(void) +{ + if (-1 == thread_local_key_create(&mtp_key, THREAD_LOCAL_KEEP)) + s_error("cannot initialize Mersenne Twister random pool key: %m"); +} + +/** + * Get suitable thread-local random pool. + */ +static mt_state_t * +mtp_pool(void) +{ + mt_state_t *mts; + + ONCE_FLAG_RUN(mtp_key_inited, mtp_key_init); + + mts = thread_local_get(mtp_key); + + if G_UNLIKELY(NULL == mts) { + /* + * The random pool is kept for each created thread, never freed. + */ + + OMALLOC0(mts); + thread_local_set(mtp_key, mts); + } + + return mts; +} + +/** + * Generate a random number in the range 0 to 2^32-1, inclusive. + * + * This routine uses a thread-private random pool and is mostly a + * lock-free execution path, resulting in a 40% increased throughput + * compared to mt_rand(), the version using a locked default pool. + * + * @return a 32-bit random number + */ +uint32 +mt_thread_rand(void) +{ + return mts_rand_internal(mtp_pool()); +} + +/** + * Generate a random number in the range 0 to 2^64-1, inclusive. + * + * This routine uses a thread-private random pool and is mostly a + * lock-free execution path. + * + * @return a 64-bit random number + */ +uint64 +mt_thread_rand64(void) +{ + return mts_rand64_internal(mtp_pool()); +} + +/** + * Initialize built-in default state, once. + */ +static void G_COLD +mt_init_once(void) +{ + MTWIST_LOCK; + mts_seed_with(aje_rand, &mt_default); + mts_discard(&mt_default); + MTWIST_UNLOCK; +} + +/** + * Optional initialization routine that can be called to pre-initialize the + * built-in default state. + */ +void G_COLD +mt_init(void) +{ + static once_flag_t inited; + + once_flag_run(&inited, mt_init_once); + once_flag_run(&mtp_key_inited, mtp_key_init); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/mtwist.h
Added
@@ -0,0 +1,67 @@ +/* + * Copyright (c) 2001 Geoff Kuenning + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Mersenne Twister Pseudo Random Number Generator. + * + * This is a stripped-down implementation originating from the LGPL version + * from Geoff Kuenning, released March 18, 2001. + * + * Original source code was obtained at: + * http://www.cs.hmc.edu/~geoff/tars/mtwist-1.1.tgz + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _mtwist_h_ +#define _mtwist_h_ + +struct mt_state; +typedef struct mt_state mt_state_t; + +void mt_init(void); + +mt_state_t *mt_state_new(random_fn_t rf); +mt_state_t *mt_state_clone(const mt_state_t *mts); +void mt_state_free_null(mt_state_t **mts_ptr); + +uint32 mts_rand(register mt_state_t *mts); +uint64 mts_rand64(register mt_state_t *mts); + +uint32 mts_lock_rand(register mt_state_t *mts); +uint64 mts_lock_rand64(register mt_state_t *mts); + +uint32 mt_rand(void); +uint64 mt_rand64(void); + +uint32 mt_thread_rand(void); +uint64 mt_thread_rand64(void); + +#endif /* _mtwist_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/mutex.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/mutex.c
Changed
@@ -33,25 +33,73 @@ #include "common.h" +#define MUTEX_SOURCE + #include "mutex.h" + #include "atomic.h" -#include "compat_sleep_ms.h" +#include "crash.h" #include "log.h" +#include "spinlock.h" #include "thread.h" #include "tm.h" #include "override.h" /* Must be the last header included */ -#define MUTEX_LOOP 100 /* Loop iterations before sleeping */ -#define MUTEX_DELAY 1 /* Wait 1 ms before looping again */ -#define MUTEX_DEAD 5000 /* # of loops before flagging deadlock */ -#define MUTEX_TIMEOUT 20 /* Crash after 20 seconds */ +static bool mutex_pass_through; + +static inline void +mutex_get_account(const mutex_t *m, const char *file, unsigned line, + const void *element) +{ + thread_lock_got(m, THREAD_LOCK_MUTEX, file, line, element); +} + +static inline void +mutex_get_account_swap(const mutex_t *m, const char *file, unsigned line, + const void *plock, const void *element) +{ + thread_lock_got_swap(m, THREAD_LOCK_MUTEX, file, line, plock, element); +} + +static inline void +mutex_release_account(const mutex_t *m, const void *element) +{ + thread_lock_released(m, THREAD_LOCK_MUTEX, element); +} static inline void -mutex_check(const volatile struct mutex * const mutex) +mutex_check(const volatile mutex_t * const m) +{ + g_assert(mutex_is_valid(m)); +} + +static inline void ALWAYS_INLINE +mutex_recursive_get(mutex_t *m) +{ + m->depth++; +} + +static inline size_t ALWAYS_INLINE +mutex_recursive_release(mutex_t *m) +{ + return --m->depth; +} + +static inline void ALWAYS_INLINE +mutex_set_owner(mutex_t *m, const char *file, unsigned line) { - g_assert(mutex != NULL); - g_assert(MUTEX_MAGIC == mutex->magic); + m->depth = 1; + spinlock_set_owner_external(&m->lock, file, line); +} + +/** + * Enter crash mode: allow all mutexes to be silently released. + */ +void G_COLD +mutex_crash_mode(void) +{ + mutex_pass_through = TRUE; } /** @@ -59,71 +107,61 @@ * * Don't inline to provide a suitable breakpoint. */ -static NO_INLINE void -mutex_deadlock(const volatile mutex_t *m, unsigned count) +static NO_INLINE void G_COLD +mutex_deadlock(const volatile void *obj, unsigned count, + const char *file, unsigned line) { -#ifdef MUTEX_DEBUG - s_minilog(G_LOG_LEVEL_WARNING, "mutex %p already held (depth %zu) by %s:%u", - (void *) m, m->depth, m->file, m->line); + const volatile mutex_t *m = obj; + unsigned stid; + + mutex_check(m); + + stid = thread_stid_from_thread(m->owner); + +#ifdef SPINLOCK_DEBUG + s_miniwarn("mutex %p already held (depth %zu) by %s:%u (%s)", + obj, m->depth, m->lock.file, m->lock.line, thread_safe_id_name(stid)); #endif - s_minicarp("possible mutex deadlock #%u on %p", count, (void *) m); + s_minicarp("possible mutex deadlock #%u on %p at %s:%u", + count, obj, file, line); } /** - * Obtain a mutex, spinning first then spleeping. + * Abort on deadlock condition. + * + * Don't inline to provide a suitable breakpoint. */ -static void -mutex_loop(volatile mutex_t *m, int loops) +static NO_INLINE void G_COLD +mutex_deadlocked(const volatile void *obj, unsigned elapsed, + const char *file, unsigned line) { - unsigned i; - time_t start = 0; + const volatile mutex_t *m = obj; + unsigned stid; - mutex_check(m); - g_assert(loops >= 1); - - for (i = 0; /* empty */; i++) { - int j; - - for (j = 0; j < loops; j++) { - if G_UNLIKELY(MUTEX_MAGIC != m->magic) { - s_error("mutex %p %s whilst waiting, at attempt #%u", - (void *) m, - MUTEX_DESTROYED == m->magic ? "destroyed" : "corrupted", - i); - } - - if (atomic_acquire(&m->lock)) { -#ifdef MUTEX_DEBUG - if (i >= MUTEX_DEAD) { - s_minilog(G_LOG_LEVEL_INFO, - "finally grabbed mutex %p after %u attempts", - (void *) m, i); - } -#endif /* MUTEX_DEBUG */ - return; - } - } + s_rawwarn("deadlock on mutex %p (depth %zu) at %s:%u", + obj, m->depth, file, line); - if G_UNLIKELY(i != 0 && 0 == i % MUTEX_DEAD) { - mutex_deadlock(m, i / MUTEX_DEAD); - } + atomic_mb(); + mutex_check(m); - if G_UNLIKELY(0 == start) - start = tm_time(); + stid = thread_stid_from_thread(m->owner); - if (delta_time(tm_time_exact(), start) > MUTEX_TIMEOUT) { -#ifdef MUTEX_DEBUG - s_minilog(G_LOG_LEVEL_WARNING, "mutex %p still held " - "(depth %zu) by %s:%u", - (void *) m, m->depth, m->file, m->line); +#ifdef SPINLOCK_DEBUG + s_rawwarn("mutex %p still held (depth %zu) by %s:%u (%s) " + "whilst we wait at %s:%u", + obj, m->depth, m->lock.file, m->lock.line, thread_safe_id_name(stid), + file, line); #endif - s_error("deadlocked on mutex %p (depth %zu, after %u secs)", - (void *) m, m->depth, (unsigned) delta_time(tm_time(), start)); - } - compat_sleep_ms(MUTEX_DELAY); - } + if (-1U == stid) + s_miniwarn("unknown thread owner may explain deadlock"); + + crash_deadlocked(file, line); /* Will not return if concurrent call */ + thread_lock_deadlock(obj); + s_error("deadlocked on mutex %p (depth %zu, after %u secs) at %s:%u, " + "owned by %s", obj, m->depth, elapsed, file, line, + thread_safe_id_name(stid)); } /** @@ -135,28 +173,68 @@ g_assert(m != NULL); m->magic = MUTEX_MAGIC; - m->owner = 0; + thread_set(m->owner, THREAD_NONE); m->depth = 0; - m->lock = 0; -#ifdef MUTEX_DEBUG - m->file = NULL; - m->line = 0; -#endif - atomic_mb(); + spinlock_init(&m->lock); /* Issues the memory barrier */ +} + +/** + * Reset a mutex. + * + * This is intended to be used by the thread management layer only. + */ +void +mutex_reset(mutex_t *m) +{ + mutex_check(m); + + m->depth = 0; + m->lock.lock = 0; + thread_set(m->owner, THREAD_NONE); +} + +/** + * Is mutex owned by thread? + */ +static inline ALWAYS_INLINE bool +mutex_is_owned_by_fast(const mutex_t *m, const thread_t t) +{ + return spinlock_is_held_fast(&m->lock) && thread_eq(t, m->owner); +} + +/** + * Is mutex owned by thread? + */ +bool +mutex_is_owned_by(const mutex_t *m, const thread_t t) +{ + mutex_check(m); + + return mutex_is_owned_by_fast(m, t); } /** * Is mutex owned? */ -gboolean +bool mutex_is_owned(const mutex_t *m) { - thread_t t; - mutex_check(m); - t = thread_current(); - return m->lock && thread_eq(t, m->owner); + /* + * Avoid call to thread_self() if we can. + */ + + if (!spinlock_is_held_fast(&m->lock)) + return FALSE; + + /* + * This is mostly used during assertions, so we do not need to call + * thread_current(). Use thread_self() for speed and safety, in case + * something goes wrong in the thread-checking code. + */ + + return thread_eq(m->owner, thread_self()); } /** @@ -174,127 +252,374 @@ void mutex_destroy(mutex_t *m) { + bool was_locked; + mutex_check(m); - if (atomic_acquire(&m->lock) || mutex_is_owned(m)) { + if (spinlock_hidden_try(&m->lock)) { + g_assert(MUTEX_MAGIC == m->magic); + was_locked = FALSE; + } else if (mutex_is_owned(m)) { g_assert(MUTEX_MAGIC == m->magic); + was_locked = TRUE; + + /* + * If the locking depth is not 1, we may have a problem when going back + * to the code that intially locked the mutex, because when it attempts + * to unlock it, the mutex will have been destroyed already. + */ + + if (1 != m->depth) { + s_minicrit("%s(): destroying owned mutex %p at depth=%zu by %s", + G_STRFUNC, m, m->depth, + thread_id_name(thread_stid_from_thread(m->owner))); +#ifdef SPINLOCK_DEBUG + s_miniwarn("%s(): mutex %p was initially locked by %s:%u", + G_STRFUNC, m, m->lock.file, m->lock.line); +#endif + } + } else { + was_locked = FALSE; + + /* + * Due to race condition, the following may provide a wrong thread ID + * if mutex was released since we entered this routine. That's OK, + * it's a sign that something is wrong since no mutex should be + * destroyed if it can be held by another thread. + */ + + s_minicrit("%s(): destroying locked mutex %p (depth %zu) " + "belonging to %s", + G_STRFUNC, m, m->depth, + thread_id_name(thread_stid_from_thread(m->owner))); +#ifdef SPINLOCK_DEBUG + s_miniwarn("%s(): mutex %p was initially locked by %s:%u", + G_STRFUNC, m, m->lock.file, m->lock.line); +#endif } m->magic = MUTEX_DESTROYED; /* Now invalid */ - m->owner = 0; - atomic_mb(); + thread_set(m->owner, THREAD_NONE); + + /* + * Given we internally grab the spinlock in "hidden" mode but + * spinlock_destroy() expects the lock to be recorded, we forcefully + * record it to avoid a warning. + */ + + thread_lock_got(&m->lock, THREAD_LOCK_SPINLOCK, _WHERE_, __LINE__, NULL); + spinlock_destroy(&m->lock); /* Issues the memory barrier */ + + if (was_locked) + mutex_release_account(m, NULL); +} + +/** + * Computes the current thread, optionally caching the element that will + * allow quicker accounting later on. + * + * @param mode the mutex mode + * @param element the opaque thread element pointer + */ +static inline thread_t NON_NULL_PARAM((2)) +mutex_thread(const enum mutex_mode mode, const void **element) +{ + /* + * The "fast" mode mutex does not enter the thread-tracking layer + * to compute the current thread. This makes it faster of course, + * but also safer during critical code that runs when something goes + * wrong, e.g. during assertion failures or deadlocks. + */ + + if G_UNLIKELY(MUTEX_MODE_FAST == mode) { + *element = NULL; + return thread_self(); + } else { + return thread_current_element(element); + } } +#define MUTEX_GRAB \ + if (mutex_is_owned_by_fast(m, t)) { \ + mutex_recursive_get(m); \ + } else { \ + if G_UNLIKELY(!spinlock_hidden_try(&m->lock)) { \ + spinlock_loop(&m->lock, SPINLOCK_SRC_MUTEX, m, \ + mutex_deadlock, mutex_deadlocked, file, line); \ + } \ + thread_set(m->owner, t); \ + mutex_set_owner(m, file, line); \ + } + +#define MUTEX_GRAB_TRY \ + if (mutex_is_owned_by_fast(m, t)) { \ + mutex_recursive_get(m); \ + } else if (spinlock_hidden_try(&m->lock)) { \ + thread_set(m->owner, t); \ + mutex_set_owner(m, file, line); \ + } else { \ + return FALSE; \ + } + + /** * Grab a mutex. + * + * @param m the mutex we're attempting to grab + * @param mode thread management mode + * @param file file where mutex is grabbed + * @param line line where mutex is grabbed */ void -mutex_grab(mutex_t *m) +mutex_grab_from(mutex_t *m, enum mutex_mode mode, + const char *file, unsigned line) { + const void *element; + thread_t t; + mutex_check(m); - if (atomic_acquire(&m->lock)) { - thread_t t = thread_current(); - thread_set(m->owner, t); - m->depth = 1; - } else if (mutex_is_owned(m)) { - m->depth++; - } else { - thread_t t = thread_current(); - mutex_loop(m, MUTEX_LOOP); - thread_set(m->owner, t); - m->depth = 1; - } - atomic_mb(); + /* + * We dispense with memory barriers after getting the spinlock because + * the atomic test-and-set instruction should act as an acquire barrier, + * meaning that anything we write after the lock cannot be moved before + * by the memory logic. + * + * We check for a recursive grabbing of the mutex first because this is + * a cheap test to perform, then we attempt the atomic operations to + * actually grab it. + */ + + t = mutex_thread(mode, &element); + MUTEX_GRAB + + if G_LIKELY(MUTEX_MODE_NORMAL == mode) + mutex_get_account(m, file, line, element); } /** - * Grab mutex only if available. + * Grab mutex only if available, and account for it. + * + * @param m the mutex we're attempting to grab + * @param mode thread management mode + * @param file file where mutex is grabbed + * @param line line where mutex is grabbed * * @return whether we obtained the mutex. */ -gboolean -mutex_grab_try(mutex_t *m) +bool +mutex_grab_try_from(mutex_t *m, enum mutex_mode mode, + const char *file, unsigned line) { + const void *element; + thread_t t; + mutex_check(m); - if (atomic_acquire(&m->lock)) { - thread_t t = thread_current(); - thread_set(m->owner, t); - m->depth = 1; - } else if (mutex_is_owned(m)) { - m->depth++; - } else { - return FALSE; - } + t = mutex_thread(mode, &element); + MUTEX_GRAB_TRY + + if G_LIKELY(MUTEX_MODE_NORMAL == mode) + mutex_get_account(m, file, line, element); - atomic_mb(); return TRUE; } -#ifdef MUTEX_DEBUG /** - * Grab a mutex from said location. + * Grab a mutex, swapping its position with a previously acquired lock. + * + * @param m the mutex we're attempting to grab + * @param plock the previous lock we wish to exchange position with + * @param file file where mutex is grabbed + * @param line line where mutex is grabbed */ void -mutex_grab_from(mutex_t *m, const char *file, unsigned line) +mutex_grab_swap_from(mutex_t *m, const void *plock, + const char *file, unsigned line) { - mutex_grab(m); + const void *element; + thread_t t; - if (1 == m->depth) { - m->file = file; - m->line = line; - } + mutex_check(m); + + t = mutex_thread(MUTEX_MODE_NORMAL, &element); + MUTEX_GRAB + mutex_get_account_swap(m, file, line, plock, element); } /** - * Grab mutex from said location, only if available. + * Grab mutex only if available, and if we get it exchange lock position with + * that of the previous lock we hold. + * + * @param m the mutex we're attempting to grab + * @param plock the previous lock we wish to exchange position with + * @param file file where mutex is grabbed + * @param line line where mutex is grabbed * * @return whether we obtained the mutex. */ -gboolean -mutex_grab_try_from(mutex_t *m, const char *file, unsigned line) +bool +mutex_grab_swap_try_from(mutex_t *m, const void *plock, + const char *file, unsigned line) { - if (mutex_grab_try(m)) { - if (1 == m->depth) { - m->file = file; - m->line = line; - } - return TRUE; - } + const void *element; + thread_t t; - return FALSE; + mutex_check(m); + + t = mutex_thread(MUTEX_MODE_NORMAL, &element); + MUTEX_GRAB_TRY + mutex_get_account_swap(m, file, line, plock, element); + + return TRUE; +} + +#ifdef SPINLOCK_DEBUG +/** + * Get lock source. + * + * If the mutex is not owned, the information returned would be inconsistent + * hence we require that it be owned. + * + * @param m the (owned) mutex + * @param line where line number is written + * + * @return the source file where lock was last taken. + * + */ +const char * +mutex_get_lock_source(const mutex_t * const m, unsigned *line) +{ + mutex_check(m); + assert_mutex_is_owned(m); + + *line = m->lock.line; + return m->lock.file; +} + +/** + * Override lock source in the (owned) mutex. + * + * To safely override the lock source, the mutex must be owned at depth=1, + * otherwise we would be corrupting the real origin of the lock. + * + * @param m the (owned) mutex + * @param file the file name to store as the locking point + * @param line the line number in the file to store as the locking point + */ +void +mutex_set_lock_source(mutex_t *m, const char *file, unsigned line) +{ + mutex_check(m); + assert_mutex_is_owned(m); + g_assert(1 == m->depth); + + m->lock.file = file; + m->lock.line = line; +} +#endif /* SPINLOCK_DEBUG */ + +/** + * Log mutex ownership error. + */ +static void G_NORETURN +mutex_log_error(const mutex_t *m, const char *file, unsigned line) +{ + thread_t t = thread_current(); + +#ifdef SPINLOCK_DEBUG + s_minierror("thread #%u expected to own mutex %p (%s) at %s:%u" + " (depth=%zu, owner=thread #%d %lu from %s:%u," + " current/self=%lu, %lu #%d)", + thread_small_id(), m, thread_lock_holds(m) ? "known" : "hidden", + file, line, m->depth, thread_stid_from_thread(m->owner), + (ulong) m->owner, m->lock.file, m->lock.line, + (ulong) t, (ulong) thread_self(), thread_stid_from_thread(t)); +#else /* !SPINLOCK_DEBUG */ + s_minierror("thread #%u expected to own mutex %p (%s) at %s:%u" + " (depth=%zu, owner=thread #%d %lu, current/self=%lu, %lu #%d)", + thread_small_id(), m, thread_lock_holds(m) ? "known" : "hidden", + file, line, m->depth, thread_stid_from_thread(m->owner), + (ulong) m->owner, (ulong) t, (ulong) thread_self(), + thread_stid_from_thread(t)); +#endif /* SPINLOCK_DEBUG */ } -#endif /* MUTEX_DEBUG */ /** * Release a mutex, which must be owned currently. + * + * The ``mode'' parameter MUST be the same as the one used when the mutex + * was grabbed, although this is not something we track and enforce currently. + * Since abnormal mutex grabbing should be the exception, this is not much of + * a problem right now. */ void -mutex_release(mutex_t *m) +mutex_ungrab_from(mutex_t *m, enum mutex_mode mode, + const char *file, unsigned line) { + const void *element; + thread_t t; + mutex_check(m); - g_assert(mutex_is_owned(m)); - if (0 == --m->depth) { - m->owner = 0; - m->lock = 0; + t = mutex_thread(mode, &element); + + /* + * We don't immediately assert that the mutex is owned to not penalize + * the regular path, and to cleanly cut through the assertion when we're + * in crash mode. + */ + + if G_UNLIKELY(!mutex_is_owned_by_fast(m, t)) { /* Precondition */ + if (mutex_pass_through) { + thread_check_suspended(); + return; + } + /* OK, log the precondition failure */ + mutex_log_error(m, file, line); + } + + if (0 == mutex_recursive_release(m)) { + thread_set(m->owner, THREAD_NONE); + spinunlock_hidden(&m->lock); /* Acts as a "release barrier" */ } - atomic_mb(); + + if G_LIKELY(MUTEX_MODE_NORMAL == mode) + mutex_release_account(m, element); +} + +/** + * Complain when a mutex is not owned by the curent thread. + * + * This is a fatal error, there is no returning from this routine. + * It is invoked through the assert_mutex_is_owned() macro. + */ +void +mutex_not_owned(const mutex_t *m, const char *file, unsigned line) +{ + if G_UNLIKELY(mutex_pass_through) { + thread_check_suspended(); + return; /* Ignore when we're crashing */ + } + + s_minicrit("mutex %p not owned at %s:%u in %s", + m, file, line, thread_name()); + + mutex_log_error(m, file, line); } /** * Convenience routine for locks that are part of a "const" structure. */ void -mutex_release_const(const mutex_t *m) +mutex_unlock_const_from(const mutex_t *m, const char *file, unsigned line) { /* * A lock is not part of the abstract data type, so it's OK to * de-constify it now: no mutex is really read-only. */ - mutex_release(deconstify_gpointer(m)); + mutex_ungrab_from(deconstify_pointer(m), FALSE, file, line); } /** @@ -307,7 +632,7 @@ { mutex_check(m); - return 0 == m->lock ? 0 : m->depth; + return spinlock_is_held(&m->lock) ? m->depth : 0; } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/mutex.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/mutex.h
Changed
@@ -27,6 +27,62 @@ * * Mutual thread exclusion locks. * + * Like spinlocks, mutexes can be "regular" or "hidden": either they are + * tracked on a per-thread basis (which allows checks such as out-of-order + * release and traces of which locks are held when a deadlock occurs), or they + * are "hidden". See "spinlock.h" for more details on "hidden" versus + * "regular" locks. + * + * As a rule of thumb, user-level code should never use "hidden" of "fast" + * mutexes, only "regular" ones because mutexes are supposed to be valid + * suspension points. When the lock duration is just a few instructions and + * the critical section does not make any function calls to routines that are + * taking "regular" locks, then a hidden lock may be used. + * + * The basic API is straightforward: + * + * mutex_lock() -- takes the lock, blocking if busy + * mutex_trylock() -- try to take the lock, returns whether lock was taken + * mutex_unlock() -- releases the lock, which must be owned + * + * When a thread owns a mutex, it can perform as many mutex_lock() as it wants + * without blocking. However, it must issue as many mutex_unlock() calls later + * to fully release the mutex and allow another thread to grab it. + * + * A mutex provides mutual exclusion between threads as well as recursive + * locking abilities. However, a mutex is more costly than a spinlock because + * it needs to track the thread which grabbed it, and involves comparisons + * between thread descriptors to determine whether a grabbing thread already + * owns the mutex. + * + * To allow critical section overlap, it is possible to use one of the + * following calls: + * + * mutex_lock_swap() -- take the lock, then swap lock ordering + * mutex_trylock_swap() -- try to take the lock and swap order + * + * It is possible to intermix mutexes with spinlocks during critical section + * overlaps, this way: + * + * spinlock(A); + * .... + * mutex_lock_swap(B, A); // the critical section overlap + * spinunlock(A); + * .... + * mutex_unlock(B); + * + * Without the mutex_lock_swap() which reverses the order of A and B, it would + * not be possible to release A first since A was taken initially before B: + * the lock monitoring runtime would forbid it. + * + * The following extra routines are available: + * + * mutex_is_owned() -- is the thread owning the lock? + * mutex_held_depth() -- how many recursive locks were taken by thread? + * + * When SPINLOCK_DEBUG is defined, each mutex remembers the location that + * initially grabbed the lock, which can be useful when debugging deadlocks. + * * @author Raphael Manfredi * @date 2011 */ @@ -34,9 +90,8 @@ #ifndef _mutex_h_ #define _mutex_h_ -#if 1 -#define MUTEX_DEBUG -#endif +#include "spinlock.h" +#include "thread.h" enum mutex_magic { MUTEX_MAGIC = 0x1a35dfeb, @@ -49,61 +104,130 @@ * * When the integer is 0, the lock is available, when the integer is 1 * the lock is busy. + * + * It's called "struct lmutex" because "struct mutex" is exposed on Solaris + * within the <sys/mutex.h> file. */ -typedef struct mutex { +typedef struct lmutex { enum mutex_magic magic; - unsigned long owner; + thread_t owner; size_t depth; - int lock; -#ifdef MUTEX_DEBUG - const char *file; - unsigned line; -#endif + spinlock_t lock; } mutex_t; /** + * Verify mutex is valid. + */ +static inline bool +mutex_is_valid(const volatile mutex_t * const m) +{ + return m != NULL && MUTEX_MAGIC == m->magic; +} + +/** * Static initialization value for a mutex structure. */ -#ifdef MUTEX_DEBUG -#define MUTEX_INIT { MUTEX_MAGIC, 0L, 0L, 0, NULL, 0 } -#else -#define MUTEX_INIT { MUTEX_MAGIC, 0L, 0L, 0 } -#endif +#define MUTEX_INIT { MUTEX_MAGIC, THREAD_NONE, 0L, SPINLOCK_INIT } + +/** + * Mode of operation for mutexes. + */ +enum mutex_mode { + MUTEX_MODE_NORMAL = 0, /**< Normal mode */ + MUTEX_MODE_HIDDEN, /**< Hidden mode: do not declare in thread */ + MUTEX_MODE_FAST /**< By-pass all thread management code */ +}; + +/* + * Internal. + */ + +#ifdef THREAD_SOURCE +void mutex_reset(mutex_t *m); +#endif /* THREAD_SOURCE */ /* * These should not be called directly by user code to allow debugging. */ -void mutex_grab(mutex_t *m); -gboolean mutex_grab_try(mutex_t *m); +void mutex_grab_from(mutex_t *m, enum mutex_mode mode, + const char *file, unsigned line); +bool mutex_grab_try_from(mutex_t *m, enum mutex_mode mode, + const char *f, unsigned l); +void mutex_ungrab_from(mutex_t *m, enum mutex_mode mode, + const char *f, unsigned l); +void mutex_unlock_const_from(const mutex_t *m, + const char *f, unsigned l); +void mutex_grab_swap_from(mutex_t *m, const void *plock, + const char *f, unsigned l); +bool mutex_grab_swap_try_from(mutex_t *m, const void *plock, + const char *f, unsigned l); /* * Public interface. */ -#ifdef MUTEX_DEBUG -void mutex_grab_from(mutex_t *m, const char *file, unsigned line); -gboolean mutex_grab_try_from(mutex_t *m, const char *file, unsigned line); +#define mutex_lock(x) \ + mutex_grab_from((x), MUTEX_MODE_NORMAL, _WHERE_, __LINE__) +#define mutex_lock_hidden(x) \ + mutex_grab_from((x), MUTEX_MODE_HIDDEN, _WHERE_, __LINE__) +#define mutex_lock_fast(x) \ + mutex_grab_from((x), MUTEX_MODE_FAST, _WHERE_, __LINE__) + +#define mutex_lock_swap(x,y) \ + mutex_grab_from((x), (y), _WHERE_, __LINE__) + +#define mutex_trylock(x) \ + mutex_grab_try_from((x), MUTEX_MODE_NORMAL, _WHERE_, __LINE__) +#define mutex_trylock_hidden(x) \ + mutex_grab_try_from((x), MUTEX_MODE_HIDDEN, _WHERE_, __LINE__) +#define mutex_trylock_fast(x) \ + mutex_grab_try_from((x), MUTEX_MODE_FAST, _WHERE_, __LINE__) -#define mutex_get(x) mutex_grab_from((x), _WHERE_, __LINE__) -#define mutex_get_try(x) mutex_grab_try_from((x), _WHERE_, __LINE__) +#define mutex_trylock_swap(x,y) \ + mutex_grab_swap_try_from((x), (y), _WHERE_, __LINE__) -#define mutex_get_const(x) \ - mutex_grab_from(deconstify_gpointer(x), _WHERE_, __LINE__) +#define mutex_lock_const(x) \ + mutex_grab_from(deconstify_pointer(x), MUTEX_MODE_NORMAL, _WHERE_, __LINE__) + +#define mutex_unlock(x) \ + mutex_ungrab_from((x), MUTEX_MODE_NORMAL, _WHERE_, __LINE__) +#define mutex_unlock_hidden(x) \ + mutex_ungrab_from((x), MUTEX_MODE_HIDDEN, _WHERE_, __LINE__) +#define mutex_unlock_fast(x) \ + mutex_ungrab_from((x), MUTEX_MODE_FAST, _WHERE_, __LINE__) + +#define mutex_unlock_const(x) \ + mutex_unlock_const_from((x), _WHERE_, __LINE__) + +#ifdef SPINLOCK_DEBUG + +const char *mutex_get_lock_source(const mutex_t * const m, unsigned *line); +void mutex_set_lock_source(mutex_t *m, const char *file, unsigned line); + +#else /* !SPINLOCK_DEBUG */ + +#define mutex_get_lock_source(m,l) ((void) (l), NULL) +#define mutex_set_lock_source(m,f,l) (void) (f), (void) (l) -#else -#define mutex_get(x) mutex_grab((x)) -#define mutex_get_try(x) mutex_grab_try((x)) -#define mutex_get_const(x) mutex_grab(deconstify_gpointer(x)) #endif /* SPINLOCK_DEBUG */ +void mutex_crash_mode(void); + void mutex_init(mutex_t *m); void mutex_destroy(mutex_t *m); -void mutex_release(mutex_t *m); -void mutex_release_const(const mutex_t *m); -gboolean mutex_is_owned(const mutex_t *m); +bool mutex_is_owned(const mutex_t *m); +bool mutex_is_owned_by(const mutex_t *m, const thread_t t); size_t mutex_held_depth(const mutex_t *m); +NON_NULL_PARAM((1, 2)) +void mutex_not_owned(const mutex_t *m, const char *file, unsigned line); + +#define assert_mutex_is_owned(mtx) G_STMT_START { \ + if G_UNLIKELY(!mutex_is_owned(mtx)) \ + mutex_not_owned((mtx), _WHERE_, __LINE__); \ +} G_STMT_END + #endif /* _mutex_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/nid.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/nid.c
Changed
@@ -34,7 +34,10 @@ #include "common.h" #include "nid.h" + #include "atoms.h" +#include "buf.h" +#include "hashing.h" #include "stringify.h" #include "override.h" /* Must be the last header included */ @@ -48,16 +51,38 @@ nid_hash(const void *key) { const struct nid *p = key; - return (unsigned) (nid_value(p) >> 32) ^ (unsigned) nid_value(p); + uint64 v = nid_value(p); +#if LONGSIZE <= 4 + return integer_hash_fast(v ^ (v >> 32)); +#else + /* uint64 and ulong are identical types */ + return integer_hash_fast(v); +#endif +} + +/** + * Second hash code for a numeric ID. + */ +unsigned +nid_hash2(const void *key) +{ + const struct nid *p = key; + uint64 v = nid_value(p); +#if LONGSIZE <= 4 + return integer_hash2(v ^ (v >> 32)); +#else + /* uint64 and ulong are identical types */ + return integer_hash2(v); +#endif } /** * Are two numeric IDs holding the same value? */ -gboolean +bool nid_equal(const void *p, const void *q) { - guint64 a = nid_value(p), b = nid_value(q); + uint64 a = nid_value(p), b = nid_value(q); return a == b; } @@ -67,9 +92,11 @@ const char * nid_to_string(const struct nid *nid) { - static char bufUINT64_DEC_BUFLEN; - uint64_to_string_buf(nid_value(nid), buf, sizeof buf); - return buf; + buf_t *b = buf_private(G_STRFUNC, UINT64_DEC_BUFLEN); + char *p = buf_data(b); + + uint64_to_string_buf(nid_value(nid), p, buf_size(b)); + return p; } /** @@ -78,9 +105,11 @@ const char * nid_to_string2(const struct nid *nid) { - static char bufUINT64_DEC_BUFLEN; - uint64_to_string_buf(nid_value(nid), buf, sizeof buf); - return buf; + buf_t *b = buf_private(G_STRFUNC, UINT64_DEC_BUFLEN); + char *p = buf_data(b); + + uint64_to_string_buf(nid_value(nid), p, buf_size(b)); + return p; } /**
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/nid.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/nid.h
Changed
@@ -38,7 +38,7 @@ * A unique numerical ID that will never overflow, hopefully. */ struct nid { - guint64 value; + uint64 value; }; /* @@ -46,7 +46,8 @@ */ unsigned nid_hash(const void *key); -gboolean nid_equal(const void *p, const void *q); +unsigned nid_hash2(const void *key); +bool nid_equal(const void *p, const void *q); const char *nid_to_string(const struct nid *nid); const char *nid_to_string2(const struct nid *nid); struct nid *nid_ref(const struct nid *nid); @@ -56,7 +57,7 @@ struct nid nid_new_value(void); struct nid nid_new_counter_value(struct nid *counter); -static inline guint64 +static inline uint64 nid_value(const struct nid *nid) { return nid->value;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/nv.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/nv.c
Changed
@@ -51,11 +51,13 @@ #include "nv.h" #include "atoms.h" -#include "glib-missing.h" #include "halloc.h" +#include "hashing.h" #include "hashlist.h" +#include "hikset.h" #include "unsigned.h" #include "walloc.h" + #include "override.h" /* Must be the last header included */ enum nv_pair_magic { NV_PAIR_MAGIC = 0x60f7c898U }; @@ -93,9 +95,9 @@ */ struct nv_table { enum nv_table_magic magic; - gboolean ordered; /**< Whether table is ordered */ + bool ordered; /**< Whether table is ordered */ union { /**< Maps "name" -> nv_pair */ - GHashTable *ht; + hikset_t *ht; hash_list_t *hl; } u; }; @@ -127,7 +129,7 @@ */ static nv_pair_t * nv_pair_make_full(const char *name, const void *value, size_t length, - gboolean copy, gboolean atom) + bool copy, bool atom) { nv_pair_t *nvp; @@ -141,7 +143,7 @@ nvp->name = atom ? atom_str_get(name) : name; nvp->atom = booleanize(atom); if (value != NULL) { - nvp->value = deconstify_gpointer(copy ? hcopy(value, length) : value); + nvp->value = deconstify_pointer(copy ? hcopy(value, length) : value); } else { nvp->value = NULL; } @@ -362,13 +364,13 @@ { const nv_pair_t *nv = key; - return g_str_hash(nv->name); + return string_mix_hash(nv->name); } /** * Are two name/vale pairs bearing the same name? */ -gboolean +bool nv_pair_eq(const void *k1, const void *k2) { const nv_pair_t *n1 = k1; @@ -384,17 +386,19 @@ * the hash table can later be traversed in that same order. */ nv_table_t * -nv_table_make(gboolean ordered) +nv_table_make(bool ordered) { nv_table_t *nvt; WALLOC(nvt); nvt->magic = NV_TABLE_MAGIC; nvt->ordered = ordered; - if (ordered) + if (ordered) { nvt->u.hl = hash_list_new(nv_pair_hash, nv_pair_eq); - else - nvt->u.ht = g_hash_table_new(g_str_hash, g_str_equal); + } else { + nvt->u.ht = hikset_create( + offsetof(nv_pair_t, name), HASH_KEY_STRING, 0); + } return nvt; } @@ -403,9 +407,8 @@ * Hash table iterator to free up values in the nv_table_t. */ static void -nv_table_ht_free_value(void *u_key, void *value, void *u_data) +nv_table_ht_free_value(void *value, void *u_data) { - (void) u_key; (void) u_data; nv_pair_free(value); } @@ -430,8 +433,8 @@ if (nvt->ordered) { hash_list_free_all(&nvt->u.hl, nv_table_hl_free_value); } else { - g_hash_table_foreach(nvt->u.ht, nv_table_ht_free_value, NULL); - gm_hash_table_destroy_null(&nvt->u.ht); + hikset_foreach(nvt->u.ht, nv_table_ht_free_value, NULL); + hikset_free_null(&nvt->u.ht); } nvt->magic = 0; WFREE(nvt); @@ -476,7 +479,7 @@ if (nvt->ordered) pos = hash_list_remove_position(nvt->u.hl, old); else - g_hash_table_remove(nvt->u.ht, nvp->name); + hikset_remove(nvt->u.ht, nvp->name); nv_pair_free(old); } @@ -486,7 +489,7 @@ else hash_list_append(nvt->u.hl, nvp); } else { - gm_hash_table_insert_const(nvt->u.ht, nvp->name, nvp); + hikset_insert_key(nvt->u.ht, &nvp->name); } } @@ -565,7 +568,7 @@ * * @return TRUE if name/value pair existed. */ -gboolean +bool nv_table_remove(const nv_table_t *nvt, const char *name) { nv_pair_t *nvp; @@ -580,7 +583,7 @@ if (nvt->ordered) hash_list_remove(nvt->u.hl, nvp); else - g_hash_table_remove(nvt->u.ht, nvp->name); + hikset_remove(nvt->u.ht, nvp->name); nv_pair_free(nvp); return TRUE; @@ -604,11 +607,11 @@ key.name = name; if (hash_list_find(nvt->u.hl, &key, &nvp)) - return deconstify_gpointer(nvp); + return deconstify_pointer(nvp); else return NULL; } else { - return g_hash_table_lookup(nvt->u.ht, name); + return hikset_lookup(nvt->u.ht, name); } } @@ -643,7 +646,7 @@ if (nvt->ordered) return hash_list_length(nvt->u.hl); else - return g_hash_table_size(nvt->u.ht); + return hikset_count(nvt->u.ht); } struct nvt_foreach_remove_ctx { @@ -651,19 +654,18 @@ void *data; /**< User additional argument data */ }; -static gboolean -nv_table_ht_foreach_rwrap(gpointer ukey, gpointer value, gpointer data) +static bool +nv_table_ht_foreach_rwrap(void *value, void *data) { nv_pair_t *nvp = value; struct nvt_foreach_remove_ctx *ctx = data; nv_pair_check(nvp); - (void) ukey; return (*ctx->func)(nvp, ctx->data); } -static gboolean +static bool nv_table_hl_foreach_rwrap(void *key, void *data) { nv_pair_t *nvp = key; @@ -696,8 +698,7 @@ return nvt->ordered ? hash_list_foreach_remove(nvt->u.hl, nv_table_hl_foreach_rwrap, &ctx) : - g_hash_table_foreach_remove(nvt->u.ht, nv_table_ht_foreach_rwrap, &ctx); - + hikset_foreach_remove(nvt->u.ht, nv_table_ht_foreach_rwrap, &ctx); } struct nvt_foreach_ctx { @@ -706,13 +707,12 @@ }; static void -nv_table_ht_foreach_wrap(gpointer ukey, gpointer value, gpointer data) +nv_table_ht_foreach_wrap(void *value, void *data) { nv_pair_t *nvp = value; struct nvt_foreach_ctx *ctx = data; nv_pair_check(nvp); - (void) ukey; (*ctx->func)(nvp, ctx->data); } @@ -748,7 +748,7 @@ if (nvt->ordered) hash_list_foreach(nvt->u.hl, nv_table_hl_foreach_wrap, &ctx); else - g_hash_table_foreach(nvt->u.ht, nv_table_ht_foreach_wrap, &ctx); + hikset_foreach(nvt->u.ht, nv_table_ht_foreach_wrap, &ctx); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/nv.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/nv.h
Changed
@@ -46,7 +46,7 @@ typedef struct nv_table nv_table_t; typedef void (*nv_table_cb_t)(nv_pair_t *nv, void *u); -typedef gboolean (*nv_table_cbr_t)(nv_pair_t *nv, void *u); +typedef bool (*nv_table_cbr_t)(nv_pair_t *nv, void *u); /** * Free routine signature for the value of a name/value pair. @@ -74,9 +74,9 @@ void nv_pair_set_value_free(nv_pair_t *nvp, nv_pair_val_free_t vf); unsigned nv_pair_hash(const void *key); -gboolean nv_pair_eq(const void *k1, const void *k2); +bool nv_pair_eq(const void *k1, const void *k2); -nv_table_t *nv_table_make(gboolean ordered); +nv_table_t *nv_table_make(bool ordered); void nv_table_free(nv_table_t *nvt); void nv_table_free_null(nv_table_t **nvt_ptr); void nv_table_insert_pair(const nv_table_t *nvt, nv_pair_t *nvp); @@ -84,7 +84,7 @@ void nv_table_insert_str(const nv_table_t *nvt, const char *n, const char *v); void nv_table_insert_nocopy(const nv_table_t *nvt, const char *name, const void *value, size_t length); -gboolean nv_table_remove(const nv_table_t *nvt, const char *name); +bool nv_table_remove(const nv_table_t *nvt, const char *name); nv_pair_t *nv_table_lookup(const nv_table_t *nvt, const char *name); const char *nv_table_lookup_str(const nv_table_t *nvt, const char *name); size_t nv_table_count(const nv_table_t *nvt);
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/offtime.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/offtime.c
Changed
@@ -46,7 +46,7 @@ {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366} }; -static inline gboolean is_leap(long year) { +static inline bool is_leap(long year) { return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); } @@ -64,7 +64,7 @@ * This code was taken from the GNU libc 2.10.1 (distributed under the LGPL). * It was slightly adapted to meet GTKG's coding standards. */ -gboolean +bool off_time(time_t t, time_delta_t offset, struct tm *tp) { long days, rem, y;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/offtime.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/offtime.h
Changed
@@ -38,7 +38,7 @@ #define TM_YEAR_ORIGIN 1900 -gboolean off_time(time_t t, time_delta_t offset, struct tm *tp); +bool off_time(time_t t, time_delta_t offset, struct tm *tp); #endif /* _offtime_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/ohash_table.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/ohash_table.c
Changed
@@ -48,8 +48,8 @@ struct ohash_table { enum ohash_table_magic magic; hash_list_t *hl; /**< Remembers order of keys, contains values */ - GHashFunc hash_func; - GEqualFunc key_eq_func; + hash_fn_t hash_func; + eq_fn_t key_eq_func; }; /** @@ -111,7 +111,7 @@ * @return the new ordered hash table. */ ohash_table_t * -ohash_table_new(GHashFunc hash_func, GEqualFunc key_eq_func) +ohash_table_new(hash_fn_t hash_func, eq_fn_t key_eq_func) { ohash_table_t *oh; @@ -198,7 +198,7 @@ * * @return TRUE when replacement occurred (the key existed). */ -gboolean +bool ohash_table_replace(ohash_table_t *oh, const void *key, const void *value) { struct ohash_pair pk; @@ -212,7 +212,7 @@ pk.key = key; if (hash_list_find(oh->hl, &pk, &hkey)) { - op = deconstify_gpointer(hkey); + op = deconstify_pointer(hkey); g_assert(op->oh == oh); pos = hash_list_remove_position(oh->hl, &pk); } else { @@ -236,7 +236,7 @@ * * @return TRUE if the key was found and removed. */ -gboolean +bool ohash_table_remove(ohash_table_t *oh, const void *key) { struct ohash_pair pk; @@ -260,7 +260,7 @@ /** * Check whether a key is contained in the table. */ -gboolean +bool ohash_table_contains(const ohash_table_t *oh, const void *key) { struct ohash_pair pk; @@ -290,7 +290,7 @@ if (hash_list_find(oh->hl, &pk, &hkey)) { const struct ohash_pair *op = hkey; g_assert(op->oh == oh); - return deconstify_gpointer(op->value); + return deconstify_pointer(op->value); } else { return NULL; } @@ -299,7 +299,7 @@ /** * Extended lookup of a key in the table, returning both key/value pointers. */ -gboolean +bool ohash_table_lookup_extended(const ohash_table_t *oh, const void *key, void *okey, void *oval) { @@ -315,9 +315,9 @@ const struct ohash_pair *op = hkey; g_assert(op->oh == oh); if (okey != NULL) - *(void **) okey = deconstify_gpointer(op->key); + *(void **) okey = deconstify_pointer(op->key); if (oval != NULL) - *(void **) oval = deconstify_gpointer(op->value); + *(void **) oval = deconstify_pointer(op->value); return TRUE; } else { return FALSE; @@ -336,7 +336,7 @@ } struct ohash_foreach_ctx { - GHFunc func; + keyval_fn_t func; void *data; }; @@ -346,7 +346,7 @@ struct ohash_pair *op = key; struct ohash_foreach_ctx *ctx = data; - (*ctx->func)(deconstify_gpointer(op->key), deconstify_gpointer(op->value), + (*ctx->func)(deconstify_pointer(op->key), deconstify_pointer(op->value), ctx->data); } @@ -356,7 +356,7 @@ * The table is traversed in the order of keys. */ void -ohash_table_foreach(const ohash_table_t *oh, GHFunc func, void *data) +ohash_table_foreach(const ohash_table_t *oh, keyval_fn_t func, void *data) { struct ohash_foreach_ctx ctx; @@ -367,18 +367,18 @@ } struct ohash_foreach_remove_ctx { - GHRFunc func; + keyval_rm_fn_t func; void *data; }; -static gboolean +static bool ohash_table_foreach_remove_helper(void *key, void *data) { struct ohash_pair *op = key; struct ohash_foreach_remove_ctx *ctx = data; - return (*ctx->func)(deconstify_gpointer(op->key), - deconstify_gpointer(op->value), ctx->data); + return (*ctx->func)(deconstify_pointer(op->key), + deconstify_pointer(op->value), ctx->data); } /** @@ -390,7 +390,8 @@ * @return the amount of items removed from the table. */ size_t -ohash_table_foreach_remove(const ohash_table_t *oh, GHRFunc func, void *data) +ohash_table_foreach_remove(const ohash_table_t *oh, + keyval_rm_fn_t func, void *data) { struct ohash_foreach_remove_ctx ctx;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/ohash_table.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/ohash_table.h
Changed
@@ -45,19 +45,20 @@ * Public interface. */ -ohash_table_t *ohash_table_new(GHashFunc hash_func, GEqualFunc key_eq_func); +ohash_table_t *ohash_table_new(hash_fn_t hash_func, eq_fn_t key_eq_func); void ohash_table_destroy(ohash_table_t *oh); void ohash_table_destroy_null(ohash_table_t **oh_ptr); void ohash_table_insert(ohash_table_t *oh, const void *key, const void *value); -gboolean ohash_table_replace(ohash_table_t *oh, const void *k, const void *v); -gboolean ohash_table_remove(ohash_table_t *oh, const void *key); -gboolean ohash_table_contains(const ohash_table_t *oh, const void *key); +bool ohash_table_replace(ohash_table_t *oh, const void *k, const void *v); +bool ohash_table_remove(ohash_table_t *oh, const void *key); +bool ohash_table_contains(const ohash_table_t *oh, const void *key); void *ohash_table_lookup(const ohash_table_t *oh, const void *key); -gboolean ohash_table_lookup_extended(const ohash_table_t *oh, const void *key, +bool ohash_table_lookup_extended(const ohash_table_t *oh, const void *key, void *okey, void *oval); size_t ohash_table_count(const ohash_table_t *oh); -void ohash_table_foreach(const ohash_table_t *oh, GHFunc func, void *data); -size_t ohash_table_foreach_remove(const ohash_table_t *oh, GHRFunc f, void *u); +void ohash_table_foreach(const ohash_table_t *oh, keyval_fn_t func, void *data); +size_t ohash_table_foreach_remove(const ohash_table_t *oh, + keyval_rm_fn_t f, void *u); #endif /* _ohash_table_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/omalloc.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/omalloc.c
Changed
@@ -44,7 +44,7 @@ * The only work required is to avoid wasting too much memory. * * The algorithm retained is to allocate memory out of a "big chunk", putting - * objects one after the other until we can no longer fit an object, at which + * objects one after the other until we can no longer fit any object, at which * point we allocate a new chunk. * * Waste is kept at a minimum by not discarding completely chunks in which @@ -71,14 +71,19 @@ #include "common.h" /* For RCSID */ #include "omalloc.h" + +#include "atomic.h" #include "dump_options.h" #include "glib-missing.h" #include "log.h" #include "misc.h" #include "pow2.h" +#include "signal.h" +#include "spinlock.h" #include "stringify.h" #include "unsigned.h" #include "vmm.h" +#include "xmalloc.h" #include "override.h" /* Must be the last header included */ @@ -88,7 +93,7 @@ #define OMALLOC_ALIGNBYTES MEM_ALIGNBYTES #define OMALLOC_MASK (OMALLOC_ALIGNBYTES - 1) #define omalloc_round(s) \ - ((gulong) (((gulong) (s) + OMALLOC_MASK) & ~OMALLOC_MASK)) + ((ulong) (((ulong) (s) + OMALLOC_MASK) & ~OMALLOC_MASK)) /** * Maximum chunk size. @@ -105,21 +110,24 @@ /** * Chunk header to govern allocation. * - * The header marks the beginning of the free space in the chunk. + * The header marks the tail of the free space in the chunk. * - * As more objects are allocated, the header slides down until it reaches - * the tail of the allocated chunk, at which time it will probably dissolve + * As objects are allocated, the header is updated until everything before + * the header has been allocated, at which time it will probably dissolve * itself to provide room for one last allocation of a small object. */ struct ochunk { struct ochunk *next; /* Linking in chunk "free list" */ struct ochunk *prev; - void *end; /* End of physical chunk (first byte beyond) */ + void *first; /* First free location (up to struct's address) */ }; #define OMALLOC_HEADER_SIZE (sizeof(struct ochunk)) -static guint32 omalloc_debug; +static uint32 omalloc_debug; +static size_t omalloc_pagesize; + +#define OMALLOC_CHUNK_COUNT (OMALLOC_CHUNK_BITS + 1) /** * Array of chunks with free space. @@ -127,34 +135,99 @@ * An entry at index ``i'' guarantees at least 2^i free bytes in the chunk, * including the chunk header. */ -static struct ochunk *chunksOMALLOC_CHUNK_BITS + 1; +static struct ochunk *chunks_rwOMALLOC_CHUNK_COUNT; /* Read & Write */ +static struct ochunk *chunks_roOMALLOC_CHUNK_COUNT; /* Read-Only */ + +enum omalloc_mode { + OMALLOC_RW, /* Read & Write */ + OMALLOC_RO /* Read-Only */ +}; /** * Internal statistics. */ -static struct { - size_t pages; /**< Total amount of pages allocated */ - size_t objects; /**< Total amount of objects allocated */ - size_t memory; /**< Total amount of memory allocated */ - size_t chunks; /**< Total amount of chunks still present */ +static struct ostats { + size_t pages_rw; /**< Total amount of rw pages allocated */ + size_t objects_rw; /**< Total amount of rw objects allocated */ + size_t memory_rw; /**< Total amount of rw memory allocated */ + size_t chunks_rw; /**< Total amount of rw chunks still present */ + size_t align_rw; /**< Space wasted in rw chunks for alignment */ + size_t wasted_rw; /**< Space wasted at tail of rw chunks */ + size_t pages_ro; /**< Total amount of ro pages allocated */ + size_t objects_ro; /**< Total amount of ro objects allocated */ + size_t memory_ro; /**< Total amount of ro memory allocated */ + size_t chunks_ro; /**< Total amount of ro chunks still present */ + size_t align_ro; /**< Space wasted in ro chunks for alignment */ + size_t wasted_ro; /**< Space wasted at tail of ro chunks */ size_t zeroed; /**< Zeroed objects at allocation time */ - size_t wasted; /**< Wasted memory at the tail of chunks */ + size_t in_handler; /**< Allocations from signal handler */ } ostats; +static spinlock_t ostats_slk = SPINLOCK_INIT; + +#define OSTATS_LOCK spinlock_hidden(&ostats_slk) +#define OSTATS_UNLOCK spinunlock_hidden(&ostats_slk) + +/** + * First byte beyond a chunk page (following trailing chunk header). + */ +static inline const void * G_CONST +omalloc_chunk_end(const struct ochunk *ck) +{ + return const_ptr_add_offset(ck, OMALLOC_HEADER_SIZE); +} /** * Remaining free space in the chunk (including header). */ -static inline size_t +static inline size_t G_PURE omalloc_chunk_size(const struct ochunk *ck) { g_assert(ck != NULL); - return ptr_diff(ck->end, ck); + g_assert(ptr_cmp(ck->first, ck) <= 0); + + return ptr_diff(omalloc_chunk_end(ck), ck->first); +} + +/** + * Remaining free space in the chunk (including header) after starting + * pointer has been adjusted for specified alignment. + */ +static inline size_t G_PURE +omalloc_chunk_size_aligned(const struct ochunk *ck, size_t align) +{ + void *first; + size_t mask, size; + + g_assert(ck != NULL); + g_assert(ptr_cmp(ck->first, ck) <= 0); + g_assert(is_pow2(align)); + + /* + * The system's alignment constraints must be at most as large as the + * size of the chunk header we're putting at the end of the page. + * + * Otherwise, when computing the aligned address at which we need to + * allocate, we would run the risk of going beyond the page itself. + */ + + STATIC_ASSERT(OMALLOC_ALIGNBYTES <= OMALLOC_HEADER_SIZE); + + mask = MIN(align, OMALLOC_ALIGNBYTES) - 1; + first = ulong_to_pointer((pointer_to_ulong(ck->first) + mask) & ~mask); + + size = ptr_diff(omalloc_chunk_end(ck), first); + + g_assert_log(size_is_non_negative(size), + "%s(): size=%'zu, ck->first=%p, mask=0x%x, first=%p, end(ck)=%p", + G_STRFUNC, size, ck->first, (uint) mask, first, omalloc_chunk_end(ck)); + + return size; } /** * Compute index in chunks where a chunk of given size needs to be linked. */ -static size_t +static size_t G_CONST omalloc_size_index(size_t size) { size_t r = size; @@ -169,25 +242,95 @@ /** * Computes index in chunks where a given chunk needs to be linked. */ -static size_t +static size_t G_PURE omalloc_chunk_index(const struct ochunk *ck) { return omalloc_size_index(omalloc_chunk_size(ck)); } /** + * Ensure the chunk structure is completely held within the page and is + * consistent with the page boundaries. + */ +static void +assert_ochunk_valid(const struct ochunk *ck, const void *page, + const char *caller) +{ + const void *end = const_ptr_add_offset(page, omalloc_pagesize); + + g_assert_log(0 == ptr_cmp(&ck1, end), + "%s(): chunk at %p (%zu bytes) not at the tail of page %p, %p", + caller, ck, sizeof *ck, page, end); + g_assert_log(ptr_cmp(ck->first, page) >= 0 && ptr_cmp(ck->first, end) < 0, + "%s(): chunk at %p lists first free byte at %p, not on page %p, %p", + caller, ck, ck->first, page, end); +} + +/** + * Make read-only chunk read-write. + */ +static void +omalloc_chunk_unprotect(const struct ochunk *p, enum omalloc_mode mode) +{ + if (OMALLOC_RO == mode) { + void *start = deconstify_pointer(vmm_page_start(p)); + + assert_ochunk_valid(p, start, G_STRFUNC); + + if (-1 == mprotect(start, omalloc_pagesize, PROT_READ | PROT_WRITE)) { + s_error("mprotect(%p, %zu, PROT_READ | PROT_WRITE) failed: %m", + start, omalloc_pagesize); + } + } +} + +/** + * Make read-only chunk read-only. + */ +static void +omalloc_chunk_protect(const struct ochunk *p, enum omalloc_mode mode) +{ + if (OMALLOC_RO == mode) { + void *start = deconstify_pointer(vmm_page_start(p)); + + assert_ochunk_valid(p, start, G_STRFUNC); + + if (-1 == mprotect(start, omalloc_pagesize, PROT_READ)) { + s_error("mprotect(%p, %zu, PROT_READ) failed: %m", + start, omalloc_pagesize); + } + } +} + +/** + * Make read-only range read-only. + */ +static void +omalloc_range_protect(const void *p, enum omalloc_mode mode, size_t len) +{ + if (OMALLOC_RO == mode) { + size_t size = round_pagesize(len); + void *start = deconstify_pointer(vmm_page_start(p)); + + if (-1 == mprotect(start, size, PROT_READ)) { + s_error("mprotect(%p, %zu, PROT_READ) failed: %m", start, size); + } + } +} + +/** * Follow chunk list and stop as soon as we find a chunk capable of - * allocating ``size'' bytes. + * allocating ``size'' bytes aligned on ``align'' bytes boundary. * * @return chunk address if found, NULL if none. */ static struct ochunk * -omalloc_chunk_list_find(struct ochunk *head, size_t size) +omalloc_chunk_list_find(struct ochunk *head, size_t size, size_t align) { struct ochunk *ck; for (ck = head; ck != NULL; ck = ck->next) { - if (omalloc_chunk_size(ck) >= size) + if (omalloc_chunk_size_aligned(ck, align) >= size) return ck; } @@ -195,17 +338,77 @@ } /** + * Get chunk array of corresponding type. + */ +static inline struct ochunk ** G_CONST +omalloc_chunk_array(enum omalloc_mode mode) +{ + switch (mode) { + case OMALLOC_RW: + return chunks_rw; + case OMALLOC_RO: + return chunks_ro; + } + + g_assert_not_reached(); +} + +/** + * Adjust starting address to make sure we can satisfy the alignment + * requirements. + * + * @return the new chunk size. + */ +static size_t +omalloc_chunk_align(struct ochunk *ck, size_t align, enum omalloc_mode mode) +{ + void *first; + size_t mask; + + g_assert(ck != NULL); + g_assert(is_pow2(align)); + + mask = MIN(align, OMALLOC_ALIGNBYTES) - 1; + first = ulong_to_pointer((pointer_to_ulong(ck->first) + mask) & ~mask); + + if (first != ck->first) { + OSTATS_LOCK; + if (OMALLOC_RW == mode) + ostats.align_rw += ptr_diff(first, ck->first); + else + ostats.align_ro += ptr_diff(first, ck->first); + OSTATS_UNLOCK; + ck->first = first; + } + + /* + * Caller can no longer call omalloc_chunk_size() because ck->first + * could be gone past the value of `ck' due to the above possible + * adjustment. Hence we return the new chunk size as a convenience. + */ + + return ptr_diff(omalloc_chunk_end(ck), ck->first); +} + +/** * Find a chunk capable of allocating ``size'' bytes (rounded up to fit - * memory alignment concerns). + * memory alignment concerns), using ``mode'' type memory. * * @return chunk address if found, NULL if none. */ static struct ochunk * -omalloc_chunk_find(size_t size) +omalloc_chunk_find(size_t size, size_t align, enum omalloc_mode mode) { + struct ochunk **chunks; size_t i; - g_assert(size == omalloc_round(size)); /* Already rounded */ + /* + * Chunk fragments are, by design, smaller than a page size, hence + * we can't find anything larger in them. + */ + + if (size >= omalloc_pagesize) + return NULL; /* * Say we try to allocate 14 bytes, we'll get i = 3. @@ -221,10 +424,12 @@ * chunk listed will be a match. */ - for (i = omalloc_size_index(size); i < G_N_ELEMENTS(chunks); i++) { + chunks = omalloc_chunk_array(mode); + + for (i = omalloc_size_index(size); i < OMALLOC_CHUNK_COUNT; i++) { struct ochunk *ck; - if (NULL != (ck = omalloc_chunk_list_find(chunksi, size))) + if (NULL != (ck = omalloc_chunk_list_find(chunksi, size, align))) return ck; } @@ -235,19 +440,29 @@ * Link back chunk into the chunks array. */ static void -omalloc_chunk_link(struct ochunk *ck) +omalloc_chunk_link(struct ochunk *ck, enum omalloc_mode mode) { + struct ochunk **chunks; size_t i; g_assert(ck != NULL); + g_assert(ptr_cmp(ck->first, ck) <= 0); /* Or page would be exhausted */ + + /* + * Contrary to omalloc_chunk_unlink(), the chunk structure is up-to-date + * and ck->first really points to the next free location. As such, we + * can use omalloc_chunk_index() which will compute the size of the chunk + * by itself. + */ i = omalloc_chunk_index(ck); + chunks = omalloc_chunk_array(mode); /* * Insert as new head. */ - g_assert(i < G_N_ELEMENTS(chunks)); + g_assert(i < OMALLOC_CHUNK_COUNT); if (NULL == chunksi) { chunksi = ck; @@ -260,48 +475,71 @@ chunksi = ck; ck->prev = NULL; ck->next = oldhead; + omalloc_chunk_unprotect(oldhead, mode); oldhead->prev = ck; + omalloc_chunk_protect(oldhead, mode); } } /** - * Unlink chunk from the chunks array. + * Unlink chunk from the proper chunks array. */ static void -omalloc_chunk_unlink(struct ochunk *ck) +omalloc_chunk_unlink(struct ochunk *ck, enum omalloc_mode mode, size_t size) { + struct ochunk **chunks; + g_assert(ck != NULL); + chunks = omalloc_chunk_array(mode); + + /* + * The chunk size is given as argument and cannot be computed through + * omalloc_chunk_size() at this point because the allocation routine + * may have already adjusted ck->first for alignment purposes. + * --RAM, 2015-10-06 + */ + if (NULL == ck->prev) { /* Was head of list */ - size_t i = omalloc_chunk_index(ck); + size_t i = omalloc_size_index(size); - g_assert(i < G_N_ELEMENTS(chunks)); + g_assert(i < OMALLOC_CHUNK_COUNT); g_assert(chunksi == ck); chunksi = ck->next; } else { + omalloc_chunk_unprotect(ck->prev, mode); ck->prev->next = ck->next; - ck->prev = NULL; + omalloc_chunk_protect(ck->prev, mode); } if (ck->next != NULL) { + omalloc_chunk_unprotect(ck->next, mode); ck->next->prev = ck->prev; - ck->next = NULL; + omalloc_chunk_protect(ck->next, mode); } + + ck->prev = NULL; + ck->next = NULL; } /** * Allocate ``size'' bytes (already rounded up to fit memory alignment * constraints) from the specified chunk. * + * If chunk was read-only, it is made read-write upon return (so that any + * initialization of the allocated block can be made). + * * @return pointer to allocated memory. */ static void * -omalloc_chunk_allocate_from(struct ochunk *ck, size_t size) +omalloc_chunk_allocate_from(struct ochunk *ck, + size_t size, size_t align, enum omalloc_mode mode) { - size_t csize; - void *p = ck; + size_t used, osize, csize; + void *first = ck->first; + void *p; /* * Make sure that the size of the chunk header is a multiple of the @@ -314,9 +552,17 @@ g_assert(ck != NULL); g_assert(size_is_positive(size)); g_assert(omalloc_chunk_size(ck) >= size); - g_assert(size == omalloc_round(size)); /* Already rounded */ - csize = omalloc_chunk_size(ck); + osize = omalloc_chunk_size(ck); /* Before possible alignment */ + omalloc_chunk_unprotect(ck, mode); /* Chunk now read-write */ + csize = omalloc_chunk_align(ck, align, mode); + p = ck->first; + + /* + * This has to hold or we would not have selected that chunk for allocation. + */ + + g_assert(csize >= size); /* After possible alignment */ /* * See whether this is going to be the last block allocated from @@ -324,60 +570,50 @@ */ if (csize - size >= OMALLOC_HEADER_SIZE) { - struct ochunk *nck; - size_t i; - size_t j; + struct ochunk **chunks; + size_t i, j; /* * We have enough space in the chunk to allocate more memory. - * Move the chunk pointer ahead and relink with any next/prev. + * Move the chunk free pointer ahead and relink with any next/prev. */ - nck = ptr_add_offset(ck, size); + i = omalloc_size_index(osize); /* Old chunk index, before alignment */ + ck->first = ptr_add_offset(ck->first, size); + used = ptr_diff(ck->first, first); - g_assert(ptr_diff(ck->end, nck) >= OMALLOC_HEADER_SIZE); + g_assert(ptr_cmp(ck->first, ck) <= 0); + g_assert(omalloc_chunk_size(ck) >= OMALLOC_HEADER_SIZE); - i = omalloc_chunk_index(ck); /* Old chunk index */ - memmove(nck, ck, sizeof *ck); /* Move ahead */ - j = omalloc_chunk_index(nck); /* New chunk index */ + j = omalloc_chunk_index(ck); /* New chunk index */ - g_assert(i < G_N_ELEMENTS(chunks)); - g_assert(j < G_N_ELEMENTS(chunks)); + g_assert(i < OMALLOC_CHUNK_COUNT); + g_assert(j < OMALLOC_CHUNK_COUNT); g_assert(j <= i); + chunks = omalloc_chunk_array(mode); + if (i != j) { /* * Chunk moving lists, needs to be unlinked from previous list - * and inserted in its new one. - */ - - if (NULL == nck->prev) { - /* Was head of list */ - g_assert(chunksi == ck); /* ``ck'' is old chunk's start */ - chunksi = nck->next; - } else { - nck->prev->next = nck->next; - } - if (nck->next != NULL) { - nck->next->prev = nck->prev; - } - omalloc_chunk_link(nck); - } else { - /* - * Chunk stays in same list, update pointers from neighbours. + * and inserted into its new one. */ - if (NULL == nck->prev) { + if (NULL == ck->prev) { /* Was head of list */ g_assert(chunksi == ck); - chunksi = nck; /* Chunk's start was moved */ + chunksi = ck->next; } else { - nck->prev->next = nck; + omalloc_chunk_unprotect(ck->prev, mode); + ck->prev->next = ck->next; + omalloc_chunk_protect(ck->prev, mode); } - - if (nck->next != NULL) { - nck->next->prev = nck; + if (ck->next != NULL) { + omalloc_chunk_unprotect(ck->next, mode); + ck->next->prev = ck->prev; + omalloc_chunk_protect(ck->next, mode); } + omalloc_chunk_link(ck, mode); } } else { /* @@ -385,19 +621,41 @@ * Once we return, this chunk will no longer be listed in chunks. */ - omalloc_chunk_unlink(ck); - ostats.chunks--; + omalloc_chunk_unlink(ck, mode, osize); + used = ptr_diff(omalloc_chunk_end(ck), first); + + OSTATS_LOCK; + if (OMALLOC_RW == mode) { + ostats.chunks_rw--; + } else { + ostats.chunks_ro--; + } + OSTATS_UNLOCK; if (omalloc_debug > 2) { s_debug("OMALLOC dissolving chunk header on %zu-byte allocation", size); if (csize != size) { s_debug("OMALLOC %zu trailing bytes lost", csize - size); - ostats.wasted += csize - size; + OSTATS_LOCK; + if (OMALLOC_RW == mode) { + ostats.wasted_rw += csize - size; + } else { + ostats.wasted_ro += csize - size; + } + OSTATS_UNLOCK; } } } + OSTATS_LOCK; + if (OMALLOC_RW == mode) { + ostats.memory_rw += used; + } else { + ostats.memory_ro += used; + } + OSTATS_UNLOCK; + return p; } @@ -405,46 +663,111 @@ * Allocate ``size'' bytes of memory that will never be freed. * If memory cannot be allocated, it is a fatal error. * + * @param size amount of memory to allocate + * @param align alignment required for memory being allocated + * @param mode whether memory is read-only or read-write + * @param init if non-NULL, initialization data to copy (size bytes) + * * @return pointer to allocated memory. */ -void * -omalloc(size_t size) +static void * +omalloc_allocate(size_t size, size_t align, enum omalloc_mode mode, + const void *init) { - size_t rounded; struct ochunk *ck; - void *result; + void *p; size_t allocated; + static spinlock_t omalloc_slk = SPINLOCK_INIT; g_assert(size_is_positive(size)); - rounded = omalloc_round(size); /* Alignment requirements */ - ostats.memory += rounded; - ostats.objects++; - g_assert(rounded >= size); + if G_UNLIKELY(0 == omalloc_pagesize) { + omalloc_pagesize = compat_pagesize(); + g_assert(0 != omalloc_pagesize); + } + + /* + * Loudly warn if called from a signal handler. + */ + + if (signal_in_unsafe_handler()) { + ATOMIC_INC(&ostats.in_handler); + s_minicarp_once("%s(): %s allocating %zu bytes (%s) " + "from signal handler", + G_STRFUNC, thread_safe_name(), + size, OMALLOC_RW == mode ? "rw" : "ro"); + } + + /* + * This routine is fast and used infrequently enough to justify a + * coarse-grained multi-threading protection via a global spinlock. + * + * Since the memory is allocated once and never freed, it is also important + * to funnel all the core allocation decisions to avoid extra allocations. + * + * This is the sole entry point for all omalloc()-based operations since + * there is no reallocation nor freeing. + */ + + spinlock(&omalloc_slk); + + OSTATS_LOCK; + if (OMALLOC_RW == mode) { + ostats.objects_rw++; + } else { + ostats.objects_ro++; + } + OSTATS_UNLOCK; /* * First try to allocate memory from fragments held in chunks. */ - ck = omalloc_chunk_find(rounded); - if (ck != NULL) - return omalloc_chunk_allocate_from(ck, rounded); + ck = omalloc_chunk_find(size, align, mode); + if (ck != NULL) { + p = omalloc_chunk_allocate_from(ck, size, align, mode); + goto done; + } /* * Request new "core" memory. + * + * We need to relinquish the spinlock because the VMM layer can recurse + * to omalloc() through lock recording in the thread-private structures. + * It's OK since we're not in a critical section at this stage and do not + * need to hold the lock. */ - result = vmm_core_alloc(rounded); - allocated = round_pagesize(rounded); + spinunlock(&omalloc_slk); + + p = vmm_core_alloc(size); + allocated = round_pagesize(size); if (omalloc_debug > 2) { - size_t pages = allocated / compat_pagesize(); - s_debug("OMALLOC allocated %zu page%s (%zu total for %zu object%s)", - pages, 1 == pages ? "" : "s", - ostats.pages, ostats.objects, 1 == ostats.objects ? "" : "s"); + size_t pages = allocated / omalloc_pagesize; + size_t count = OMALLOC_RW == mode ? + ostats.objects_rw : ostats.objects_ro; + s_debug("OMALLOC allocated %zu page%s (%zu total for %zu %s object%s)", + pages, plural(pages), + OMALLOC_RW == mode ? ostats.pages_rw : ostats.pages_ro, + count, OMALLOC_RW == mode ? "read-write" : "read-only", + plural(count)); } - ostats.pages += allocated / compat_pagesize(); + OSTATS_LOCK; + if (OMALLOC_RW == mode) { + ostats.pages_rw += allocated / omalloc_pagesize; + } else { + ostats.pages_ro += allocated / omalloc_pagesize; + } + OSTATS_UNLOCK; + + /* + * Now that we need to possibly manipulate omalloc() internal chunk list, + * re-grab the lock. + */ + + spinlock(&omalloc_slk); /* * If we have enough memory at the tail to create a new chunk, do so. @@ -454,25 +777,98 @@ * space already. */ - if (allocated - rounded >= OMALLOC_HEADER_SIZE) { - ck = ptr_add_offset(result, rounded); - ck->end = ptr_add_offset(result, allocated); - omalloc_chunk_link(ck); - ostats.chunks++; + if (allocated - size >= OMALLOC_HEADER_SIZE) { + void *end = ptr_add_offset(p, allocated); + ck = ptr_add_offset(end, -OMALLOC_HEADER_SIZE); + ck->first = ptr_add_offset(p, size); + omalloc_chunk_link(ck, mode); + + OSTATS_LOCK; + if (OMALLOC_RW == mode) { + ostats.chunks_rw++; + ostats.memory_rw += size; + } else { + ostats.chunks_ro++; + ostats.memory_ro += size; + } + OSTATS_UNLOCK; if (omalloc_debug > 2) { - s_debug("OMALLOC adding %zu byte-long chunk (%zu chunk%s total)", + size_t count = OMALLOC_RW == mode ? + ostats.chunks_rw : ostats.chunks_ro; + s_debug("OMALLOC adding %zu byte-long chunk (%zu %s chunk%s total)", omalloc_chunk_size(ck), - ostats.chunks, 1 == ostats.chunks ? "" : "s"); + count, OMALLOC_RW == mode ? "read-write" : "read-only", + plural(count)); } - } else if (allocated != rounded) { - if (omalloc_debug > 2) { - s_debug("OMALLOC %zu trailing bytes lost on %zu-byte allocation", - allocated - rounded, rounded); + } else { + /* + * There is not enough room at the tail of the allocated memory + * to create a chunk. + */ + + OSTATS_LOCK; + if (OMALLOC_RW == mode) { + ostats.memory_rw += allocated; + } else { + ostats.memory_ro += allocated; + } + OSTATS_UNLOCK; + + if (allocated != size) { + if (omalloc_debug > 2) { + s_debug("OMALLOC %zu trailing bytes lost on " + "%zu-byte allocation", allocated - size, size); + } + OSTATS_LOCK; + if (OMALLOC_RW == mode) { + ostats.wasted_rw += allocated - size; + } else { + ostats.wasted_ro += allocated - size; + } + OSTATS_UNLOCK; } } - return result; +done: + /* + * Must initialize the object from a read-only chunk before releasing + * the spinlock, since we must make sure no other thread is going to + * change the protection of the chunk: we need it writable at this stage, + * and a concurrent allocation from another thread could have time to reset + * it read-only before the memcpy() below can be done, causing a fault. + */ + + if (OMALLOC_RW == mode) + spinunlock(&omalloc_slk); + + if (init != NULL) + memcpy(p, init, size); + + /* + * The following protects back to read-only the whole chunk in which the + * pointer was taken from, or the whole region allocated above if the + * requested size was larger than a page size. + */ + + omalloc_range_protect(p, mode, size); + + if (OMALLOC_RO == mode) + spinunlock(&omalloc_slk); + + return p; +} + +/** + * Allocate ``size'' bytes of memory that will never be freed. + * If memory cannot be allocated, it is a fatal error. + * + * @return pointer to allocated memory. + */ +void * +omalloc(size_t size) +{ + return omalloc_allocate(size, MEM_ALIGNBYTES, OMALLOC_RW, NULL); } /** @@ -487,9 +883,12 @@ { void *p; - p = omalloc(size); + p = omalloc_allocate(size, MEM_ALIGNBYTES, OMALLOC_RW, NULL); memset(p, 0, size); + + OSTATS_LOCK; ostats.zeroed++; + OSTATS_UNLOCK; return p; } @@ -502,17 +901,91 @@ char * ostrdup(const char *str) { + if (NULL == str) + return NULL; + + return omalloc_allocate(1 + strlen(str), 1, OMALLOC_RW, str); +} + +/** + * Allocate a permanent copy of supplied string (which may be NULL) or + * the first 'n' characters, whichever is smaller. + * + * @return a pointer to the new string, or NULL if argument was NULL. + */ +char * +ostrndup(const char *str, size_t n) +{ size_t len; - char *p; + char *res; if (NULL == str) return NULL; - len = strlen(str); - p = omalloc(len + 1); - memcpy(p, str, len + 1); /* Include trailing NUL in copy */ + len = clamp_strlen(str, n); + res = omalloc_allocate(1 + len, 1, OMALLOC_RW, str); + reslen = '\0'; - return p; + return res; +} + +/** + * Allocate a permanent read-only copy of the data pointed at. + * + * @return pointer to allocated copy. + */ +const void * +ocopy_readonly(const void *p, size_t size) +{ + g_assert(p != NULL); + g_assert(size_is_non_negative(size)); + + return omalloc_allocate(size, MEM_ALIGNBYTES, OMALLOC_RO, p); +} + +/** + * Allocate a permanent read-only copy of supplied string (which may be NULL). + * + * @return a pointer to the new string, or NULL if argument was NULL. + */ +const char * +ostrdup_readonly(const char *str) +{ + if (NULL == str) + return NULL; + + return omalloc_allocate(1 + strlen(str), 1, OMALLOC_RO, str); +} + +/** + * Allocate a permanent read-only copy of supplied string (which may be NULL) + * or the first 'n' characters, whichever is smaller. + * + * @return a pointer to the new string, or NULL if argument was NULL. + */ +const char * +ostrndup_readonly(const char *str, size_t n) +{ + size_t len; + + if (NULL == str) + return NULL; + + len = clamp_strlen(str, n); + + if ('\0' == strlen) { + return ostrdup_readonly(str); + } else { + char *tmp; + const char *res; + + tmp = xcopy(str, len + 1); + tmplen = '\0'; + res = omalloc_allocate(1 + len, 1, OMALLOC_RO, tmp); + xfree(tmp); + + return res; + } } /** @@ -522,14 +995,20 @@ size_t omalloc_page_count(void) { - return ostats.pages; + size_t n; + + OSTATS_LOCK; + n = ostats.pages_rw + ostats.pages_ro; + OSTATS_UNLOCK; + + return n; } /** * Set debug level. */ void -set_omalloc_debug(guint32 level) +set_omalloc_debug(uint32 level) { omalloc_debug = level; } @@ -537,7 +1016,7 @@ /** * Final shutdown. */ -G_GNUC_COLD void +void G_COLD omalloc_close(void) { /* @@ -546,34 +1025,80 @@ */ if (omalloc_debug) { - s_debug("omalloc() allocated %zu object%s spread on %zu page%s", - ostats.objects, 1 == ostats.objects ? "" : "s", - ostats.pages, 1 == ostats.pages ? "" : "s"); - s_debug("omalloc() allocated %s, %zu partial page%s remain%s", - short_size(ostats.memory, FALSE), - ostats.chunks, 1 == ostats.chunks ? "" : "s", - 1 == ostats.chunks ? "s" : ""); + s_debug("omalloc() allocated %zu read-write object%s " + "spread on %zu page%s", + ostats.objects_rw, plural(ostats.objects_rw), + ostats.pages_rw, plural(ostats.pages_rw)); + s_debug("omalloc() allocated %s read-write, " + "%zu partial page%s remain%s", + short_size(ostats.memory_rw, FALSE), + ostats.chunks_rw, plural(ostats.chunks_rw), + plural(ostats.chunks_rw)); + s_debug("omalloc() allocated %zu read-only object%s " + "spread on %zu page%s", + ostats.objects_ro, plural(ostats.objects_ro), + ostats.pages_ro, plural(ostats.pages_ro)); + s_debug("omalloc() allocated %s read-only, " + "%zu partial page%s remain%s", + short_size(ostats.memory_ro, FALSE), + ostats.chunks_ro, plural(ostats.chunks_ro), + plural(ostats.chunks_ro)); } } /** * Dump omalloc() statistics for run-time inspection. */ -G_GNUC_COLD void +void G_COLD omalloc_dump_stats_log(logagent_t *la, unsigned options) { -#define DUMP(x) log_info(la, "OMALLOC %s = %s", #x, \ - (options & DUMP_OPT_PRETTY) ? \ - size_t_to_gstring(ostats.x) : size_t_to_string(ostats.x)) + struct ostats stats; + size_t pages, objects, memory, chunks, align, wasted; + bool groupped = booleanize(options & DUMP_OPT_PRETTY); - DUMP(pages); - DUMP(objects); - DUMP(memory); - DUMP(chunks); +#define DUMP(x) log_info(la, "OMALLOC %s = %s", #x, \ + size_t_to_string_grp(stats.x, groupped)) + +#define DUMP_VAR(x) log_info(la, "OMALLOC %s = %s", #x, \ + size_t_to_string_grp(x, groupped)) + +#define CONSOLIDATE(x) x = stats.x##_rw + stats.x##_ro + + OSTATS_LOCK; + stats = ostats; /* struct copy under lock protection */ + OSTATS_UNLOCK; + + CONSOLIDATE(pages); + CONSOLIDATE(objects); + CONSOLIDATE(memory); + CONSOLIDATE(chunks); + CONSOLIDATE(align); + CONSOLIDATE(wasted); + + DUMP(pages_rw); + DUMP(objects_rw); + DUMP(memory_rw); + DUMP(chunks_rw); + DUMP(align_rw); + DUMP(wasted_rw); + DUMP(pages_ro); + DUMP(objects_ro); + DUMP(memory_ro); + DUMP(chunks_ro); + DUMP(align_ro); + DUMP(wasted_ro); + DUMP_VAR(pages); + DUMP_VAR(objects); + DUMP_VAR(memory); + DUMP_VAR(chunks); + DUMP_VAR(align); + DUMP_VAR(wasted); DUMP(zeroed); - DUMP(wasted); + DUMP(in_handler); #undef DUMP +#undef DUMP_VAR +#undef CONSOLIDATE } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/omalloc.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/omalloc.h
Changed
@@ -34,11 +34,15 @@ #ifndef _omalloc_h_ #define _omalloc_h_ -void *omalloc(size_t size) WARN_UNUSED_RESULT G_GNUC_MALLOC; -void *omalloc0(size_t size) WARN_UNUSED_RESULT G_GNUC_MALLOC; -char *ostrdup(const char *str) WARN_UNUSED_RESULT G_GNUC_MALLOC; +void *omalloc(size_t size) G_MALLOC; +void *omalloc0(size_t size) G_MALLOC; +char *ostrdup(const char *str) G_MALLOC; +char *ostrndup(const char *str, size_t n) G_MALLOC; +const char *ostrdup_readonly(const char *str) G_MALLOC; +const void *ocopy_readonly(const void *p, size_t size) G_MALLOC; +const char *ostrndup_readonly(const char *str, size_t n) G_MALLOC; -static inline void * WARN_UNUSED_RESULT G_GNUC_MALLOC +static inline void * G_MALLOC ocopy(const void *p, size_t size) { void *cp = omalloc(size); @@ -46,13 +50,35 @@ return cp; } +#define OCOPY(p) ocopy(p, sizeof *p) + struct logagent; size_t omalloc_page_count(void); -void set_omalloc_debug(guint32 level); +void set_omalloc_debug(uint32 level); void omalloc_close(void); void omalloc_dump_stats_log(struct logagent *la, unsigned options); +#define OMALLOC(p) \ +G_STMT_START { \ + p = omalloc(sizeof *p); \ +} G_STMT_END + +#define OMALLOC0(p) \ +G_STMT_START { \ + p = omalloc0(sizeof *p); \ +} G_STMT_END + +#define OMALLOC_ARRAY(p,n) \ +G_STMT_START { \ + p = omalloc((n) * sizeof p0); \ +} G_STMT_END + +#define OMALLOC0_ARRAY(p,n) \ +G_STMT_START { \ + p = omalloc0((n) * sizeof p0); \ +} G_STMT_END + #endif /* _omalloc_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/once.c
Added
@@ -0,0 +1,325 @@ +/* + * Copyright (c) 2012-2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Thread-safe once initialization support. + * + * @author Raphael Manfredi + * @date 2012-2013 + */ + +#include "common.h" + +#include "once.h" + +#include "atomic.h" +#include "compat_usleep.h" +#include "cond.h" +#include "hashtable.h" +#include "mutex.h" +#include "thread.h" + +#include "override.h" /* Must be the last header included */ + +#define ONCE_DELAY 200 /* Wait 200 us before looping again */ +#define ONCE_TIMEOUT 10000000 /* 10 seconds, in us */ +#define ONCE_LOOP_MAX (ONCE_TIMEOUT / ONCE_DELAY) + +/** + * Arena to be used for the hash table keeping track of the pending + * initializations. It is large enough to let the table hold 32 entries + * on a 64-bit machine, which is plenty enough. + */ +static char once_buffer1024; + +/** + * Hash table tracking the pending initializations. + * + * Keys are the init routine to be run, the value is the ID of the thread. + */ +static hash_table_t *once_running; + +/** + * Global mutex protecting access to the user-supplied variable and to the + * once_running table. + */ +static mutex_t once_flag_mtx = MUTEX_INIT; + +/** + * Execute supplied routine once, as tracked by the supplied flag. + * + * @param flag control flag, initially set to FALSE + * @param routine the routine to run if it has not been done already + * @param recursive if TRUE, return FALSE when recursive attempt is detected + * + * @return TRUE if initialization routine has been run upon return. + */ +static bool +once_flag_run_internal(once_flag_t *flag, once_fn_t routine, bool recursive) +{ + int id; + + if G_LIKELY(ONCE_F_DONE == *flag) + return TRUE; + + mutex_lock(&once_flag_mtx); + + if G_UNLIKELY(ONCE_F_DONE == *flag) { + mutex_unlock(&once_flag_mtx); + return TRUE; + } + + if G_UNLIKELY(NULL == once_running) + once_running = hash_table_new_fixed(once_buffer, sizeof once_buffer); + + id = thread_small_id(); + + if G_UNLIKELY(ONCE_F_PROGRESS == *flag) { + int stid = pointer_to_int(hash_table_lookup(once_running, routine)); + size_t n; + + /* + * If we detect a recursive initialization, terminate the process + * unless they said they want to special-case recursive attempts. + * + * Otherwise, if we are not in a recursive initialization pattern, + * we have to wait until the flag becomes ONCE_F_DONE. + */ + + if (stid == id) { + if (recursive) { + mutex_unlock(&once_flag_mtx); + return FALSE; + } + s_minierror("%s(): recursive attempt to initialize routine %s()", + G_STRFUNC, stacktrace_function_name(routine)); + } + + for (n = 0; n < ONCE_LOOP_MAX && ONCE_F_PROGRESS == *flag; n++) { + mutex_unlock(&once_flag_mtx); + compat_usleep_nocancel(200); + mutex_lock(&once_flag_mtx); + } + + if (ONCE_F_PROGRESS == *flag) { + s_warning("%s(): timeout waiting for completion of %s() by %s", + G_STRFUNC, stacktrace_function_name(routine), + thread_id_name(stid)); + thread_lock_dump_all(STDERR_FILENO); + s_minierror("%s(): %s timed out", G_STRFUNC, thread_name()); + } + + g_assert(ONCE_F_DONE == *flag); + mutex_unlock(&once_flag_mtx); + return TRUE; + } + + *flag = ONCE_F_PROGRESS; + hash_table_insert(once_running, routine, int_to_pointer(id)); + mutex_unlock(&once_flag_mtx); + + (*routine)(); + + mutex_lock(&once_flag_mtx); + *flag = ONCE_F_DONE; + hash_table_remove(once_running, routine); + mutex_unlock(&once_flag_mtx); + + return TRUE; +} +/** + * Execute supplied routine once, as tracked by the supplied flag. + * + * The flag should be a pointer to static data (no need to initialize in + * that case) or to a global variable (set to FALSE) and is used to record, + * in a thread-safe way, whether the routine has been run. + * + * @attention + * If the calling thread can block, and memory can be allocated, use the + * once_flag_runwait() routine instead, as it will avoid "busy" waits. + * + * @param flag control flag, initially set to FALSE + * @param routine the routine to run if it has not been done already + */ +void +once_flag_run(once_flag_t *flag, once_fn_t routine) +{ + once_flag_run_internal(flag, routine, FALSE); +} + +/** + * Same as once_flag_run() but returns FALSE when we detect a recursive + * initialization attempt. + * + * @param flag control flag, initially set to FALSE + * @param routine the routine to run if it has not been done already + * + * @return TRUE if the initialization has been completed (possibly previously), + * FALSE if a recursive initialization attempt was detected, and therefore + * the routine has not completed its execution yet. + */ +bool +once_flag_run_safe(once_flag_t *flag, once_fn_t routine) +{ + return once_flag_run_internal(flag, routine, TRUE); +} + +/** + * Execute supplied routine once, as tracked by the supplied flag. + * + * @param flag control flag, initially set to FALSE + * @param routine the routine to run if it has not been done already + * @param recursive if TRUE, return FALSE when recursive attempt is detected + * + * @return TRUE if initialization routine has been run upon return. + */ +static bool +once_flag_runwait_internal(once_flag_t *flag, once_fn_t routine, bool recursive) +{ + static cond_t once_cond = COND_INIT; + int id; + bool is_inserted; + + if G_LIKELY(ONCE_F_DONE == *flag) + return TRUE; + + mutex_lock(&once_flag_mtx); + + if G_UNLIKELY(ONCE_F_DONE == *flag) { + mutex_unlock(&once_flag_mtx); + return TRUE; + } + + if G_UNLIKELY(NULL == once_running) + once_running = hash_table_new_fixed(once_buffer, sizeof once_buffer); + + id = thread_small_id(); + + /* + * If another thread is in the process of running the initialization + * routine, wait until it is completed, at which point we can return. + */ + + if G_UNLIKELY(ONCE_F_PROGRESS == *flag) { + int stid = pointer_to_int(hash_table_lookup(once_running, routine)); + + /* + * If we detect a recursive initialization, terminate the process. + * Otherwise, we have to wait until the flag becomes ONCE_F_DONE. + */ + + if (stid == id) { + if (recursive) { + mutex_unlock(&once_flag_mtx); + return FALSE; + } + s_minierror("%s(): recursive attempt to initialize routine %s()", + G_STRFUNC, stacktrace_function_name(routine)); + } + + while (ONCE_F_PROGRESS == *flag) + cond_wait_clean(&once_cond, &once_flag_mtx); + + g_assert(ONCE_F_DONE == *flag); + cond_reset(&once_cond); + mutex_unlock(&once_flag_mtx); + return TRUE; + } + + /* + * Run the initialization routine, without holding any lock. + */ + + *flag = ONCE_F_PROGRESS; + is_inserted = hash_table_insert(once_running, routine, int_to_pointer(id)); + mutex_unlock(&once_flag_mtx); + + g_assert(is_inserted); /* Key was not already present in the hash table */ + + (*routine)(); + + /* + * Done, wakeup any thread waiting for the innitialization. + * + * Note that not all the waiting threads are monitoring the same + * flag, so this will cause spurious wakeups when there is a high + * level of initialization concurrency. + * + * We call cond_reset() to make sure the underlying condition variable + * object is freed (and its resources reclaimed) to avoid leaving it + * around since we cannot know whether it will be needed again. + */ + + mutex_lock(&once_flag_mtx); + *flag = ONCE_F_DONE; + hash_table_remove(once_running, routine); + cond_broadcast(&once_cond, &once_flag_mtx); + cond_reset(&once_cond); + mutex_unlock(&once_flag_mtx); + + return TRUE; +} + +/** + * Execute supplied routine once, as tracked by the supplied flag. + * + * The flag should be a pointer to static data (no need to initialize in + * that case) or to a global variable (set to FALSE) and is used to record, + * in a thread-safe way, whether the routine has been run. + * + * @attention + * The calling thread can block but it must not hold any lock prior to + * calling this routine. If this cannot be ensured, then use once_flag_run() + * which will perform a "busy" wait but does not prevent the calling thread + * from already holding a lock. + * + * @param flag control flag, initially set to FALSE + * @param routine the routine to run if it has not been done already + */ +void +once_flag_runwait(once_flag_t *flag, once_fn_t routine) +{ + once_flag_runwait_internal(flag, routine, FALSE); +} + +/** + * Same as once_flag_runwait() but returns FALSE when we detect a recursive + * initialization attempt. + * + * @param flag control flag, initially set to FALSE + * @param routine the routine to run if it has not been done already + * + * @return TRUE if the initialization has been completed (possibly previously), + * FALSE if a recursive initialization attempt was detected, and therefore + * the routine has not completed its execution yet. + */ +bool +once_flag_runwait_safe(once_flag_t *flag, once_fn_t routine) +{ + return once_flag_runwait_internal(flag, routine, TRUE); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/once.h
Added
@@ -0,0 +1,75 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Thread-safe once initialization support. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _once_h_ +#define _once_h_ + +/** + * Tri-state once initialization flag. + */ +typedef enum once_flag { + ONCE_F_UNDONE = 0, + ONCE_F_PROGRESS = 1, + ONCE_F_DONE = 2 +} once_flag_t; + +/** + * Once initialization routine. + */ +typedef void (*once_fn_t)(void); + +/* + * Public interface. + */ + +void once_flag_run(once_flag_t *flag, once_fn_t routine); +bool once_flag_run_safe(once_flag_t *flag, once_fn_t routine); + +void once_flag_runwait(once_flag_t *flag, once_fn_t routine); +bool once_flag_runwait_safe(once_flag_t *flag, once_fn_t routine); + +#define ONCE_DONE(f) (ONCE_F_DONE == (f)) + +#define ONCE_FLAG_RUN(f, r) G_STMT_START { \ + if G_UNLIKELY(!ONCE_DONE((f))) \ + once_flag_run(&(f), (r)); \ +} G_STMT_END + +#define ONCE_FLAG_RUNWAIT(f, r) G_STMT_START { \ + if G_UNLIKELY(!ONCE_DONE((f))) \ + once_flag_runwait(&(f), (r)); \ +} G_STMT_END + +#endif /* _once_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/op.h
Added
@@ -0,0 +1,45 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Definition to conduct direct operations within arrays, typically used by + * sorting routines. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _op_h_ +#define _op_h_ + +#define op_t unsigned long int +#define OPSIZ (sizeof(op_t)) + +#define op_aligned(x) (0 == ((op_t) (x) & (OPSIZ - 1))) + +#endif /* _op_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/options.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/options.c
Changed
@@ -34,8 +34,9 @@ #include "common.h" #include "options.h" -#include "glib-missing.h" #include "misc.h" +#include "str.h" + #include "override.h" /* Must be the last header included */ enum { @@ -85,7 +86,7 @@ * or be given by the next argument. * * Unrecognized options or missing arguments stop processing. - * + * * @param argv the initial argument vector * @param ovec the single-letter option description vector * @param osize the amount of entries in ovec @@ -95,7 +96,7 @@ int options_parse(const char *argv, const option_t *ovec, int osize) { - guchar options127; /* ASCII only */ + uchar options127; /* ASCII only */ const option_t *current; int i; @@ -112,11 +113,11 @@ for (i = 0; i < osize; i++) { const option_t *o = &oveci; - guchar idx; + uchar idx; g_assert(o->letter); idx = o->letter0; - if (UNSIGNED(idx) >= G_N_ELEMENTS(options)) { + if (UNSIGNED(idx) >= N_ITEMS(options)) { g_assert_not_reached(); return -1; /* ASCII only */ } @@ -138,14 +139,14 @@ current = NULL; for (i = 0; NULL != argvi; i++) { const char *arg = argvi; - guchar c; + uchar c; if (0 == i) continue; if (0 == strcmp(arg, "--")) { /* End of options */ if (current) { /* This option lacks its argument */ - gm_snprintf(error_string, sizeof error_string, + str_bprintf(error_string, sizeof error_string, "missing value for -%c", current->letter0); return -1; } @@ -157,7 +158,7 @@ * We're expecting the next argument to be the value of the switch * we parsed earlier. */ - + if (current->value) *current->value = arg; @@ -180,15 +181,15 @@ const option_t *opt; int flags; - if (UNSIGNED(c) >= G_N_ELEMENTS(options)) { - gm_snprintf(error_string, sizeof error_string, + if (UNSIGNED(c) >= N_ITEMS(options)) { + str_bprintf(error_string, sizeof error_string, "invalid non-ASCII switch"); return -1; } flags = optionsc; if (!(flags & OPTION_F_VALID)) { - gm_snprintf(error_string, sizeof error_string, + str_bprintf(error_string, sizeof error_string, "invalid -%c switch", c); return -1; } @@ -198,8 +199,10 @@ if (flags & OPTION_F_VALUE) { /* A value is expected */ if (*arg) { /* And it follows */ - if (opt->value) + if (opt->value) { *opt->value = arg; + } + break; /* Argument held option value */ } else current = opt; /* Expecting value as next arg */ } else {
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/ostream.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/ostream.c
Changed
@@ -44,7 +44,9 @@ #include "halloc.h" #include "pmsg.h" #include "slist.h" +#include "str.h" #include "walloc.h" + #include "override.h" /* Must be the last header included */ /** @@ -124,7 +126,7 @@ /** * Is stream opened to a file / file descriptor? */ -gboolean +bool ostream_is_file(const ostream_t *os) { ostream_check(os); @@ -135,7 +137,7 @@ /** * Is stream opened to memory? */ -gboolean +bool ostream_is_memory(const ostream_t *os) { ostream_check(os); @@ -237,7 +239,7 @@ /** * Was an I/O error reported? */ -gboolean +bool ostream_has_ioerr(const ostream_t *os) { ostream_check(os); @@ -280,10 +282,10 @@ * * @return TRUE if OK, FALSE if there was a writing problem */ -gboolean +bool ostream_close(ostream_t *os) { - gboolean ioerr; + bool ioerr; ostream_check(os); @@ -357,7 +359,7 @@ va_start(args, fmt); VA_COPY(args2, args); - len = gm_vsnprintf(buf, sizeof buf, fmt, args2); + len = str_vbprintf(buf, sizeof buf, fmt, args2); va_end(args2); if (len >= sizeof buf - 1) { @@ -386,9 +388,22 @@ char buf1; ostream_check(os); - + buf0 = c & 0xff; return ostream_write(os, buf, sizeof buf); } +/** + * Emit a NUL-terminated string to the stream. + * + * @return the amount of bytes written, -1 on error. + */ +ssize_t +ostream_puts(ostream_t *os, const char *s) +{ + ostream_check(os); + + return ostream_write(os, s, strlen(s)); +} + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/ostream.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/ostream.h
Changed
@@ -45,20 +45,21 @@ * Public interface. */ -gboolean ostream_is_file(const ostream_t *os); -gboolean ostream_is_memory(const ostream_t *os); +bool ostream_is_file(const ostream_t *os); +bool ostream_is_memory(const ostream_t *os); ostream_t *ostream_open_memory(void); slist_t *ostream_close_memory(ostream_t *os); ostream_t *ostream_open_fd(int fd); ostream_t *ostream_open_file(FILE *f); int ostream_close_file(ostream_t *os); -gboolean ostream_has_ioerr(const ostream_t *os); +bool ostream_has_ioerr(const ostream_t *os); ostream_t *ostream_open_pmsg(pmsg_t *mb); -gboolean ostream_close(ostream_t *os); +bool ostream_close(ostream_t *os); ssize_t ostream_write(ostream_t *os, const void *data, size_t len); -ssize_t ostream_printf(ostream_t *os, const char *fmt, ...) G_GNUC_PRINTF(2, 3); +ssize_t ostream_printf(ostream_t *os, const char *fmt, ...) G_PRINTF(2, 3); ssize_t ostream_putc(ostream_t *os, int c); +ssize_t ostream_puts(ostream_t *os, const char *s); #endif /* _ostream_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/owlist-gen.c
Added
@@ -0,0 +1,1029 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Common code for managing a one-way list (chaining within data structure). + * + * The general form of one-way list with the chaining data structure being + * embedded within the list items can be depicted as: + * + * +-----+ +-----+ +-----+ ^ + * |/////| |/////| |/////| | + * |/////| |/////| |/////| | offset + * |/////| |/////| |/////| | + * +=====+ +->+=====+ +->+=====+ x + * | | / | | / | | | link offset + * | ***-+/ | ***-+/ |(nil)| v + * +=====+ +=====+ +=====+ + * + * The 'next' pointer in the bottom area of the data structure (above part + * being user-data, opaque for us) is not pointing to another link but to the + * start of another structure containing the link to the next item. + * + * For instance, in a tree we could have the bottom part defined as: + * + * struct node { + * struct node *parent, *child, *sibling; + * } + * + * and the `next' pointer would be node->sibling, which is not pointing to + * another memory location containing a sibling pointer, but at the start of + * the node structure in another item. + * + * If the 'next' pointer were to point to another chaining pointer in the + * same direction, we would have the following picture: + * + * +-----+ +-----+ +-----+ ^ + * |/////| |/////| |/////| | + * |/////| |/////| |/////| | offset + * |/////| |/////| |/////| | + * +=====+ +=====+ +=====+ v + * | ***-+---->| ***-+---->|(nil)| link offset = 0 + * +=====+ +=====+ +=====+ + * + * That would be the case in the following situation: + * + * struct link { + * struct link *next; + * } + * + * where the 'next' pointer points to a memory location containing the pointer + * to the next item in the list. That is an embedded single list ("eslist"). + * + * When the "link offset" (offset within the chaining structure of the pointer + * of the 'next' item, which points to the root of the next chaining structure) + * is not 0, then we have an expanded single list ("xslist"). + * + * @author Raphael Manfredi + * @date 2015 + */ + +#include "random.h" +#include "shuffle.h" +#include "unsigned.h" +#include "xmalloc.h" + +#include "override.h" /* Must be the last header included */ + +/*** + *** This file is not meant to be compiled as a standalone version, but rather + *** included with the following macro definitions: + *** + *** safety_assert(x) either empty or g_assert(x) + *** CHECK(l) either eslist_check(l) or xslist_check(l) + *** INVARIANT(l) either eslist_invariant(l) or INVARIANT(l) + *** PREFIX routine prefix, usually eslist_ or xslist_ + *** OWLIST_T type of the list object (e.g. eslist_t) + *** OWLINK_T type of the chaining structure (e.g. slink_t) + *** NEXT(l,lk) get next item in list ``l'' after link ``lk'' + *** SET_NEXT(l,lk,v) set next item in list ``l'' after link ``lk'' to ``v'' + *** LENGTH(l,h) get list length for ``l'' whose head link is ``h'' + *** LINK_OFFSET(l) get the link offset of ``l'' (0 for eslist) + *** LIST_ARG(l) either "l," when the list is needed, or empty + ***/ + +#ifndef OWLIST_T +#error "this file is not meant to be compiled directly" +#endif + +/** + * Discard list, making the list object invalid. + * + * This does not free any of the items, it just discards the list descriptor. + * The underlying items remain chained though, so retaining a pointer to one + * of the OWLINK_T of one item still allows limited link-level traversal. + */ +#define OWLIST_discard CAT2(PREFIX,discard) +void +OWLIST_discard(OWLIST_T *list) +{ + CHECK(list); + + list->magic = 0; +} + +/** + * Clear list, forgetting about all the items + * + * This does not free or unlink any of the items, it just empties the list + * descriptor. + */ +#define OWLIST_clear CAT2(PREFIX,clear) +void +OWLIST_clear(OWLIST_T *list) +{ + CHECK(list); + + list->head = list->tail = NULL; + list->count = 0; +} + +#define OWLIST_link_append_internal CAT2(PREFIX,link_append_internal) +static inline void +OWLIST_link_append_internal(OWLIST_T *list, OWLINK_T *lk) +{ + if G_UNLIKELY(NULL == list->tail) { + g_assert(NULL == list->head); + g_assert(0 == list->count); + list->head = list->tail = lk; + SET_NEXT(list, lk, NULL); + } else { + g_assert(NULL == NEXT(list, list->tail)); + g_assert(NULL != list->head); /* Since list not empty */ + g_assert(size_is_positive(list->count)); + SET_NEXT(list, list->tail, lk); + SET_NEXT(list, lk, NULL); + list->tail = lk; + } + + list->count++; + + safety_assert(LENGTH(list, list->head) == list->count); +} + +/** + * Append new link to the list. + * + * This is efficient and does not require a full traversal of the list. + */ +#define OWLIST_link_append CAT2(PREFIX,link_append) +void +OWLIST_link_append(OWLIST_T *list, OWLINK_T *lk) +{ + CHECK(list); + g_assert(lk != NULL); + + OWLIST_link_append_internal(list, lk); +} + +/** + * Append new item with expanded link to the list. + * + * This is efficient and does not require a full traversal of the list. + */ +#define OWLIST_append CAT2(PREFIX,append) +void +OWLIST_append(OWLIST_T *list, void *data) +{ + OWLINK_T *lk; + + CHECK(list); + g_assert(data != NULL); + + lk = ptr_add_offset(data, list->offset); + OWLIST_link_append_internal(list, lk); +} + +#define OWLIST_link_prepend_internal CAT2(PREFIX,link_prepend_internal) +static inline void +OWLIST_link_prepend_internal(OWLIST_T *list, OWLINK_T *lk) +{ + if G_UNLIKELY(NULL == list->head) { + g_assert(NULL == list->tail); + g_assert(0 == list->count); + list->head = list->tail = lk; + SET_NEXT(list, lk, NULL); + } else { + g_assert(NULL != list->tail); /* Since list not empty */ + g_assert(size_is_positive(list->count)); + SET_NEXT(list, lk, list->head); + list->head = lk; + } + + list->count++; + + safety_assert(LENGTH(list, list->head) == list->count); +} + +/** + * Prepend link to the list. + */ +#define OWLIST_link_prepend CAT2(PREFIX,link_prepend) +void +OWLIST_link_prepend(OWLIST_T *list, OWLINK_T *lk) +{ + CHECK(list); + g_assert(lk != NULL); + + OWLIST_link_prepend_internal(list, lk); +} + +/** + * Prepend new item with expanded link to the list. + */ +#define OWLIST_prepend CAT2(PREFIX,prepend) +void +OWLIST_prepend(OWLIST_T *list, void *data) +{ + OWLINK_T *lk; + + CHECK(list); + g_assert(data != NULL); + + lk = ptr_add_offset(data, list->offset); + OWLIST_link_prepend_internal(list, lk); +} + +/** + * Prepend other list to the list. + * + * The other list descriptor is cleared, since its items are transferred + * to the first list. + * + * The two lists must be compatible, that is the offset to the link pointer + * must be identical. + * + * @param list the destination list + * @param other the other list to prepend (descriptor will be cleared) + */ +#define OWLIST_prepend_list CAT2(PREFIX,prepend_list) +void +OWLIST_prepend_list(OWLIST_T *list, OWLIST_T *other) +{ + CHECK(list); + CHECK(other); + g_assert(list->offset == other->offset); + + if G_UNLIKELY(0 == other->count) + return; + + if G_UNLIKELY(NULL == list->head) { + g_assert(NULL == list->tail); + g_assert(0 == list->count); + list->tail = other->tail; + list->count = other->count; + } else { + g_assert(NULL != other->tail); /* Since list not empty */ + g_assert(NULL == NEXT(other, other->tail)); + g_assert(size_is_positive(list->count)); + SET_NEXT(other, other->tail, list->head); + list->count += other->count; + } + + list->head = other->head; + OWLIST_clear(other); + + safety_assert(LENGTH(list, list->head) == list->count); +} + +/** + * Append other list to the list. + * + * The other list descriptor is cleared, since its items are transferred + * to the first list. + * + * The two lists must be compatible, that is the offset to the link pointer + * must be identical. + * + * @param list the destination list + * @param other the other list to append (descriptor will be cleared) + */ +#define OWLIST_append_list CAT2(PREFIX,append_list) +void +OWLIST_append_list(OWLIST_T *list, OWLIST_T *other) +{ + CHECK(list); + CHECK(other); + g_assert(list->offset == other->offset); + + if G_UNLIKELY(0 == other->count) + return; + + if G_UNLIKELY(NULL == list->tail) { + g_assert(NULL == list->head); + g_assert(0 == list->count); + list->head = other->head; + list->count = other->count; + } else { + g_assert(NULL == NEXT(list, list->tail)); + g_assert(size_is_positive(list->count)); + SET_NEXT(list, list->tail, other->head); + list->count += other->count; + } + + list->tail = other->tail; + OWLIST_clear(other); + + safety_assert(LENGTH(list, list->head) == list->count); +} + +#define OWLIST_link_remove_after_internal CAT2(PREFIX,link_remove_after_internal) +static inline void +OWLIST_link_remove_after_internal(OWLIST_T *list, OWLINK_T *prevlk, OWLINK_T *lk) +{ + g_assert(size_is_positive(list->count)); + INVARIANT(list); + + if G_UNLIKELY(list->tail == lk) + list->tail = prevlk; + + if (NULL == prevlk) { + /* Removing the head */ + g_assert(list->head == lk); + list->head = NEXT(list, lk); + } else { + SET_NEXT(list, prevlk, NEXT(list, lk)); + } + + SET_NEXT(list, lk, NULL); + list->count--; + + safety_assert(INVARIANT(list)); + safety_assert(LENGTH(list, list->head) == list->count); +} + +/** + * Remove head of list, return pointer to item, NULL if list was empty. + */ +#define OWLIST_shift CAT2(PREFIX,shift) +void * +OWLIST_shift(OWLIST_T *list) +{ + void *item; + + CHECK(list); + + if (NULL == list->head) { + item = NULL; + } else { + item = ptr_add_offset(list->head, -list->offset); + OWLIST_link_remove_after_internal(list, NULL, list->head); + } + + return item; +} + +/** + * Rotate list by one item to the left. + * + * The head is inserted back at the tail. + */ +#define OWLIST_rotate_left CAT2(PREFIX,rotate_left) +void +OWLIST_rotate_left(OWLIST_T *list) +{ + OWLINK_T *lk; + + CHECK(list); + + if G_UNLIKELY(list->count <= 1U) + return; + + lk = list->head; + OWLIST_link_remove_after_internal(list, NULL, lk); + OWLIST_link_append_internal(list, lk); + + safety_assert(INVARIANT(list)); +} + +#define OWLIST_link_insert_after_internal CAT2(PREFIX,link_insert_after_internal) +static void +OWLIST_link_insert_after_internal(OWLIST_T *list, OWLINK_T *siblk, OWLINK_T *lk) +{ + g_assert(size_is_positive(list->count)); + INVARIANT(list); + + if G_UNLIKELY(list->tail == siblk) + list->tail = lk; + + SET_NEXT(list, lk, NEXT(list, siblk)); + SET_NEXT(list, siblk, lk); + list->count++; + + safety_assert(INVARIANT(list)); + safety_assert(LENGTH(list, list->head) == list->count); +} + +/** + * Insert link after another one in list. + * + * The sibling must already be part of the list, the new link must not. + * If the sibling is NULL, insertion happens at the head of the list. + */ +#define OWLIST_link_insert_after CAT2(PREFIX,link_insert_after) +void +OWLIST_link_insert_after(OWLIST_T *list, OWLINK_T *sibling_lk, OWLINK_T *lk) +{ + CHECK(list); + g_assert(lk != NULL); + + if (NULL == sibling_lk) + OWLIST_link_prepend_internal(list, lk); + else + OWLIST_link_insert_after_internal(list, sibling_lk, lk); +} + +/** + * Insert item after another one in list. + * + * The sibling item must already be part of the list, the data item must not. + */ +#define OWLIST_insert_after CAT2(PREFIX,insert_after) +void +OWLIST_insert_after(OWLIST_T *list, void *sibling, void *data) +{ + OWLINK_T *lk; + + CHECK(list); + g_assert(data != NULL); + + lk = ptr_add_offset(data, list->offset); + if (NULL == sibling) { + OWLIST_link_prepend_internal(list, lk); + } else { + OWLINK_T *siblk = ptr_add_offset(sibling, list->offset); + OWLIST_link_insert_after_internal(list, siblk, lk); + } +} + +#undef remove /* On Windows, this is remapped */ + +/** + * Remove data item from list. + * + * This is usually very inefficient as the list needs to be traversed + * to find the previous item. + */ +#define OWLIST_remove CAT2(PREFIX,remove) +void +OWLIST_remove(OWLIST_T *list, void *data) +{ + OWLINK_T *lk, *prevlk, *datalk; + + CHECK(list); + g_assert(data != NULL); + safety_assert(CONTAINS(list, data)); + + datalk = ptr_add_offset(data, list->offset); + prevlk = NULL; + + for (lk = list->head; lk != NULL; prevlk = lk, lk = NEXT(list, lk)) { + if (datalk == lk) { + OWLIST_link_remove_after_internal(list, prevlk, lk); + return; + } + } + + g_assert_not_reached(); /* Item not found in list! */ +} + +/** + * Remove data item following sibling, if any. + * + * @return the item removed, NULL if there was nother after sibling. + */ +#define OWLIST_remove_after CAT2(PREFIX,remove_after) +void * +OWLIST_remove_after(OWLIST_T *list, void *sibling) +{ + OWLINK_T *lk, *next; + void *data; + + CHECK(list); + g_assert(sibling != NULL); + + lk = ptr_add_offset(sibling, list->offset); + next = NEXT(list, lk); + + if G_UNLIKELY(NULL == next) + return NULL; /* Nothing after, not an error */ + + data = ptr_add_offset(next, -list->offset); + OWLIST_link_remove_after_internal(list, lk, next); + + return data; +} + +/** + * Reverse list. + */ +#define OWLIST_reverse CAT2(PREFIX,reverse) +void +OWLIST_reverse(OWLIST_T *list) +{ + OWLINK_T *lk, *prev; + + CHECK(list); + INVARIANT(list); + + for (lk = list->head, prev = NULL; lk != NULL; /* empty */) { + OWLINK_T *next = NEXT(list, lk); + + SET_NEXT(list, lk, prev); + prev = lk; + lk = next; + } + + /* Swap head and tail */ + lk = list->head; + list->head = list->tail; + list->tail = lk; + + safety_assert(INVARIANT(list)); + safety_assert(LENGTH(list, list->head) == list->count); +} + +/** + * Find item in list, using supplied comparison callback to compare list + * items with the key we're looking for. + * + * The key is usually a "dummy" structure with enough fields set to allow + * comparisons to be made. + * + * @param list the list + * @param key key item to locate + * @param cmp comparison function to use + * + * @return the found item, or NULL if not found. + */ +#define OWLIST_find CAT2(PREFIX,find) +void * +OWLIST_find(const OWLIST_T *list, const void *key, cmp_fn_t cmp) +{ + OWLINK_T *lk; + + CHECK(list); + g_assert(key != NULL); + g_assert(cmp != NULL); + + for (lk = list->head; lk != NULL; lk = NEXT(list, lk)) { + void *data = ptr_add_offset(lk, -list->offset); + if (0 == (*cmp)(data, key)) + return data; + } + + return NULL; +} + +/** + * Iterate over the list, invoking the callback for every data item. + * + * It is safe for the callback to destroy the item, however this corrupts + * the list which must therefore be discarded upon return. + * + * @param list the list + * @param cb function to invoke on all items + * @param data opaque user-data to pass to callback + */ +#define OWLIST_foreach CAT2(PREFIX,foreach) +void +OWLIST_foreach(const OWLIST_T *list, data_fn_t cb, void *data) +{ + OWLINK_T *lk, *next; + + CHECK(list); + INVARIANT(list); + g_return_unless(cb != NULL); + safety_assert(LENGTH(list, list->head) == list->count); + + for (lk = list->head; lk != NULL; lk = next) { + void *item = ptr_add_offset(lk, -list->offset); + next = NEXT(list, lk); /* Allow callback to destroy item */ + (*cb)(item, data); + } + + safety_assert(INVARIANT(list)); + safety_assert(LENGTH(list, list->head) == list->count); +} + +/** + * Iterate over the list, invoking the callback for every data item + * and removing the current item if it returns TRUE. + * + * @param list the list + * @param cbr function to invoke to determine whether to remove item + * @param data opaque user-data to pass to callback + * + * @return amount of removed items from the list. + */ +#define OWLIST_foreach_remove CAT2(PREFIX,foreach_remove) +size_t +OWLIST_foreach_remove(OWLIST_T *list, data_rm_fn_t cbr, void *data) +{ + OWLINK_T *lk, *next, *prev; + size_t removed = 0; + + CHECK(list); + INVARIANT(list); + g_return_val_unless(cbr != NULL, 0); + safety_assert(LENGTH(list, list->head) == list->count); + + for (lk = list->head, prev = NULL; lk != NULL; lk = next) { + void *item = ptr_add_offset(lk, -list->offset); + + /* + * The callback can free the item, so we must copy the next + * pointer first. + */ + + next = NEXT(list, lk); + + if ((*cbr)(item, data)) { + if G_UNLIKELY(list->head == lk) + list->head = next; + if G_UNLIKELY(list->tail == lk) { + g_assert(NULL == next); + list->tail = prev; + } + if (prev != NULL) + SET_NEXT(list, prev, next); + list->count--; + removed++; + } else { + prev = lk; /* Item not removed, becomes new previous */ + } + } + + safety_assert(INVARIANT(list)); + safety_assert(LENGTH(list, list->head) == list->count); + + return removed; +} + +/** + * Run the merge sort algorithm of the sublist, merging back into list. + * + * @return the head of the list + */ +#define OWLIST_merge_sort CAT2(PREFIX,merge_sort) +static OWLINK_T * G_HOT +OWLIST_merge_sort(OWLIST_T *list, OWLINK_T *sublist, size_t count, + cmp_data_fn_t cmp, void *data) +{ + OWLINK_T *l1, *l2, *l; + size_t n1, i; + OWLINK_T *head; + void *ptr; + + if (count <= 1) { + g_assert(0 != count || NULL == sublist); + g_assert(0 == count || NULL == NEXT(list, sublist)); + + return sublist; /* Trivially sorted */ + } + + /* + * Divide and conquer: split the list into two, sort each part then + * merge the two sorted sublists. + */ + + n1 = count / 2; + + for (i = 1, l1 = sublist; i < n1; l1 = NEXT(list, l1), i++) + /* empty */; + + l2 = NEXT(list, l1); /* Start of 2nd list */ + SET_NEXT(list, l1, NULL); /* End of 1st list with ``n1'' items */ + + l1 = OWLIST_merge_sort(list, sublist, n1, cmp, data); + l2 = OWLIST_merge_sort(list, l2, count - n1, cmp, data); + + /* + * We're only going to change the pointer at "head + LINK_OFFSET(list)", + * which happens to be the ``ptr'' variable! + */ + + head = ptr_add_offset(&ptr, -LINK_OFFSET(list)); + l = head; + + /* + * We now have two sorted (one-way) lists: ``l1'' and ``l2''. + * Merge them into `list', taking care of updating its tail, since + * we return the head. + */ + + while (l1 != NULL && l2 != NULL) { + void *d1 = ptr_add_offset(l1, -list->offset); + void *d2 = ptr_add_offset(l2, -list->offset); + int c = (*cmp)(d1, d2, data); + + if (c <= 0) { + l = SET_NEXT(list, l, l1); + l1 = NEXT(list, l1); + } else { + l = SET_NEXT(list, l, l2); + l2 = NEXT(list, l2); + } + } + + SET_NEXT(list, l, (NULL == l1) ? l2 : l1); + + { + OWLINK_T *next; + + while (NULL != (next = NEXT(list, l))) + l = next; + } + + list->tail = l; + return NEXT(list, head); +} + +/** + * Sort list in place using a merge sort. + */ +#define OWLIST_sort_internal CAT2(PREFIX,sort_internal) +static void +OWLIST_sort_internal(OWLIST_T *list, cmp_data_fn_t cmp, void *data) +{ + CHECK(list); + INVARIANT(list); + g_return_unless(cmp != NULL); + + /* + * During merging, we use the list as a one-way list chained through + * its next pointers and identified by its head and by its amount of + * items (to make sub-splitting faster). + * + * When we come back from the recursion we merge the two sorted lists. + */ + + list->head = OWLIST_merge_sort(list, list->head, list->count, cmp, data); + + safety_assert(INVARIANT(list)); + safety_assert(LENGTH(list, list->head) == list->count); +} + +/** + * Sort list according to the comparison function, which takes two items + * plus an additional opaque argument, meant to be used as context to sort + * the two items. + * + * @param list the list to sort + * @param cmp comparison routine to use (for two items) + * @param data additional argument to supply to comparison routine + */ +#define OWLIST_sort_with_data CAT2(PREFIX,sort_with_data) +void +OWLIST_sort_with_data(OWLIST_T *list, cmp_data_fn_t cmp, void *data) +{ + OWLIST_sort_internal(list, cmp, data); +} + +/** + * Sort list according to the comparison function, which compares items. + * + * @param list the list to sort + * @param cmp comparison routine to use (for two items) + */ +#define OWLIST_sort CAT2(PREFIX,sort) +void +OWLIST_sort(OWLIST_T *list, cmp_fn_t cmp) +{ + OWLIST_sort_internal(list, (cmp_data_fn_t) cmp, NULL); +} + +/** + * Insert item in sorted list at the proper position. + * + * @param list the list into which we insert + * @param item the item to insert + * @param cmp comparison routine to use (for two items) with extra data + * @param data user-supplied data for the comparison routine + */ +#define OWLIST_insert_sorted_internal CAT2(PREFIX,insert_sorted_internal) +static void +OWLIST_insert_sorted_internal(OWLIST_T *list, void *item, + cmp_data_fn_t cmp, void *data) +{ + OWLINK_T *lk, *ln, *prev; + + CHECK(list); + INVARIANT(list); + g_assert(item != NULL); + g_assert(cmp != NULL); + + ln = ptr_add_offset(item, list->offset); + + for ( + lk = list->head, prev = NULL; + lk != NULL; + prev = lk, lk = NEXT(list, lk) + ) { + void *p = ptr_add_offset(lk, -list->offset); + if ((*cmp)(item, p, data) <= 0) + break; + } + + if (NULL == lk) { + OWLIST_link_append_internal(list, ln); + } else { + /* Insert ``ln'' before ``lk'' */ + if (prev != NULL) { + SET_NEXT(list, prev, ln); + } else { + list->head = ln; + } + SET_NEXT(list, ln, lk); + } + + safety_assert(LENGTH(list, list->head) == list->count); +} + +/** + * Insert item in sorted list at the proper position, as determined by + * the item comparison routine, in order to keep the whole list sorted + * after insertion, using the same comparison criteria. + * + * The comparison routine takes an extra user-defined context, to assist + * in the item comparison. + * + * @param list the list into which we insert + * @param item the item to insert + * @param cmp comparison routine to use (for two items) with extra data + * @param data user-supplied data for the comparison routine + */ +#define OWLIST_insert_sorted_with_data CAT2(PREFIX,insert_sorted_with_data) +void +OWLIST_insert_sorted_with_data(OWLIST_T *list, void *item, + cmp_data_fn_t cmp, void *data) +{ + OWLIST_insert_sorted_internal(list, item, cmp, data); +} + +/** + * Insert item in sorted list at the proper position, as determined by + * the item comparison routine, in order to keep the whole list sorted + * after insertion, using the same comparison criteria. + * + * @param list the list into which we insert + * @param item the item to insert + * @param cmp comparison routine to use (for two items) + */ +#define OWLIST_insert_sorted CAT2(PREFIX,insert_sorted) +void +OWLIST_insert_sorted(OWLIST_T *list, void *item, cmp_fn_t cmp) +{ + OWLIST_insert_sorted_internal(list, item, (cmp_data_fn_t) cmp, NULL); +} + +/** + * Get the n-th item in the list (0-based index). + * + * A negative index gets items from the tail of the list, i.e. -1 gets the + * last item, -2 the penultimate one, -3 the antepenultimate one, etc... + * + * @param list the list + * @param n the n-th item index to retrieve (0 = first item) + * + * @return the n-th item, NULL if the position is off the end of the list. + */ +#define OWLIST_nth CAT2(PREFIX,nth) +void * +OWLIST_nth(const OWLIST_T *list, long n) +{ + size_t i = n; + OWLINK_T *lk; + + CHECK(list); + + if (n < 0) + i = list->count + n; + + if (i >= list->count) + return NULL; + + for (lk = list->head; lk != NULL; lk = NEXT(list, lk)) { + if (0 == i--) + return ptr_add_offset(lk, -list->offset); + } + + g_assert_not_reached(); /* Item must have been selected above */ +} + +#define OWLIST_nth_next CAT2(PREFIX,nth_next) + +/** + * Given a link, return the item associated with the nth link that follows it, + * or NULL if there is nothing. The 0th item is the data associated with + * the given link. + * + * @param list the list + * @param lk the starting link, which must be part of the list + * @param n how mnay items to move forward starting from the link + * + * @return item at the nth position following the link, NULL if none. + */ +#define OWLIST_nth_next_data CAT2(PREFIX,nth_next_data) +void * +OWLIST_nth_next_data(const OWLIST_T *list, const OWLINK_T *lk, size_t n) +{ + OWLINK_T *l; + + CHECK(list); + g_assert(lk != NULL); + g_assert(size_is_non_negative(n)); + + l = OWLIST_nth_next(LIST_ARG(list) lk, n); + return NULL == l ? NULL : ptr_add_offset(l, -list->offset); +} + +/** + * Pick random item in list. + * + * @return pointer to the selected item, NULL if list is empty. + */ +#define OWLIST_random CAT2(PREFIX,random) +void * +OWLIST_random(const OWLIST_T *list) +{ + CHECK(list); + g_assert(list->count <= MAX_INT_VAL(long)); + + if G_UNLIKELY(0 == list->count) + return NULL; + + return OWLIST_nth(list, random_ulong_value(list->count - 1)); +} + +/** + * Randomly shuffle the items in the list using supplied random function. + * + * @param rf the random function to use (NULL means: use defaults) + * @param list the list to shuffle + */ +#define OWLIST_shuffle_with CAT2(PREFIX,shuffle_with) +void +OWLIST_shuffle_with(random_fn_t rf, OWLIST_T *list) +{ + OWLINK_T *lk; + OWLINK_T **array; + size_t i; + + CHECK(list); + INVARIANT(list); + + if G_UNLIKELY(list->count <= 1U) + return; + + /* + * To ensure O(n) shuffling, build an array containing all the items, + * shuffle that array then recreate the list according to the shuffled + * array. + */ + + XMALLOC_ARRAY(array, list->count); + + for (i = 0, lk = list->head; lk != NULL; i++, lk = NEXT(list, lk)) { + arrayi = lk; + } + + shuffle_with(rf, array, list->count, sizeof array0); + + /* + * Rebuild the list. + */ + + list->head = array0; + list->tail = arraylist->count - 1; + + lk = list->head; + + for (i = 1; i < list->count; i++) { + OWLINK_T *ln = arrayi; + + SET_NEXT(list, lk, ln); + lk = ln; + } + + SET_NEXT(list, lk, NULL); + xfree(array); + + safety_assert(INVARIANT(list)); + safety_assert(LENGTH(list, list->head) == list->count); +} + +/** + * Randomly shuffle the items in the list. + */ +#define OWLIST_shuffle CAT2(PREFIX,shuffle) +void +OWLIST_shuffle(OWLIST_T *list) +{ + OWLIST_shuffle_with(NULL, list); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/pagetable.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/pagetable.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyrigtab (c) 2006, Christian Biere + * Copyright (c) 2007, Christian Biere * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -31,11 +31,12 @@ #include "common.h" -#include "lib/pagetable.h" -#include "lib/misc.h" -#include "lib/vmm.h" +#include "pagetable.h" +#include "misc.h" +#include "vmm.h" +#include "xmalloc.h" -#include "lib/override.h" +#include "override.h" /** * NOTE: These values are meant for a typical 32-bit system with 4 KiB @@ -58,15 +59,12 @@ page_table_t * page_table_new(void) { - static const struct page_table zero_page_table; struct page_table *tab; - g_assert((size_t)-1 == (guint32)-1); + g_assert((size_t)-1 == (uint32)-1); g_assert(compat_pagesize() == (1 << PAGE_BITSHIFT)); - tab = malloc(sizeof *tab); - g_assert(tab); - *tab = zero_page_table; + XMALLOC0(tab); return tab; } @@ -76,17 +74,17 @@ if (tab) { size_t i; - for (i = 0; i < G_N_ELEMENTS(tab->slice); i++) { + for (i = 0; i < N_ITEMS(tab->slice); i++) { if (tab->slicei) { vmm_free(tab->slicei, sizeof tab->slicei0); } } - free(tab); + xfree(tab); } } size_t -page_table_lookup(page_table_t *tab, void *p) +page_table_lookup(page_table_t *tab, const void *p) { size_t k = (size_t) p; if (k && 0 == (k & ~PAGE_BITMASK)) { @@ -94,38 +92,60 @@ i = k >> SLICE_BITSHIFT; j = (k & ~SLICE_BITMASK) >> PAGE_BITSHIFT; - return tab->slicei ? tab->slicei->sizej : 0; - } else { - return 0; + if G_LIKELY(i < N_ITEMS(tab->slice)) + return tab->slicei ? tab->slicei->sizej : 0; + + /* FALLTHROUGH */ } + + return 0; +} + +static void +page_table_replace_intern(page_table_t *tab, const void *p, size_t size) +{ + size_t i, j; + size_t k = (size_t) p; + + i = k >> SLICE_BITSHIFT; + j = (k & ~SLICE_BITMASK) >> PAGE_BITSHIFT; + if (NULL == tab->slicei) { + tab->slicei = vmm_alloc0(sizeof tab->slicei0); + } + tab->slicei->sizej = size; +} + +void +page_table_replace(page_table_t *tab, const void *p, size_t size) +{ + size_t k = (size_t) p; + + g_assert(NULL != p); + g_assert(size > 0); + g_assert(0 == (k & ~PAGE_BITMASK)); + + page_table_replace_intern(tab, p, size); } int -page_table_insert(page_table_t *tab, void *p, size_t size) +page_table_insert(page_table_t *tab, const void *p, size_t size) { size_t k = (size_t) p; - RUNTIME_ASSERT(NULL != p); - RUNTIME_ASSERT(size > 0); - RUNTIME_ASSERT(0 == (k & ~PAGE_BITMASK)); + g_assert(NULL != p); + g_assert(size > 0); + g_assert(0 == (k & ~PAGE_BITMASK)); if (page_table_lookup(tab, p)) { return FALSE; } else { - size_t i, j; - - i = k >> SLICE_BITSHIFT; - j = (k & ~SLICE_BITMASK) >> PAGE_BITSHIFT; - if (NULL == tab->slicei) { - tab->slicei = vmm_alloc0(sizeof tab->slicei0); - } - tab->slicei->sizej = size; + page_table_replace_intern(tab, p, size); return TRUE; } } int -page_table_remove(page_table_t *tab, void *p) +page_table_remove(page_table_t *tab, const void *p) { if (page_table_lookup(tab, p)) { size_t k = (size_t) p; @@ -145,11 +165,11 @@ { size_t i; - for (i = 0; i < G_N_ELEMENTS(tab->slice); i++) { + for (i = 0; i < N_ITEMS(tab->slice); i++) { if (tab->slicei) { size_t j; - for (j = 0; j < G_N_ELEMENTS(tab->slicei->size); j++) { + for (j = 0; j < N_ITEMS(tab->slicei->size); j++) { if (tab->slicei->sizej) { size_t p = (i << SLICE_BITSHIFT) + (j << PAGE_BITSHIFT);
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/pagetable.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/pagetable.h
Changed
@@ -41,9 +41,10 @@ page_table_t *page_table_new(void); void page_table_destroy(page_table_t *ht); -int page_table_insert(page_table_t *ht, void *p, size_t size); -size_t page_table_lookup(page_table_t *ht, void *p); -int page_table_remove(page_table_t *ht, void *p); +int page_table_insert(page_table_t *ht, const void *p, size_t size); +void page_table_replace(page_table_t *tab, const void *p, size_t size); +size_t page_table_lookup(page_table_t *ht, const void *p); +int page_table_remove(page_table_t *ht, const void *p); void page_table_foreach(page_table_t *ht, page_table_foreach_func func, void *data);
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/palloc.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/palloc.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2009, Raphael Manfredi + * Copyright (c) 2005, 2009, 2013 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -25,7 +25,7 @@ * @ingroup lib * @file * - * Memory pool allocator, suitable for large fixed-size objects. + * Memory pool allocator, suitable for fix-sized objects. * * The pool is automatically sized to adjust the current needs, using several * EMA (Exponential Moving Average) and dynamically set thresholds. There are @@ -52,27 +52,52 @@ * rate of the pool. The deallocation routine is told whether something is * released because it was identified explicitly as a fragment. * + * The pool allocator depends on xmalloc() and on whatever allocator the user + * supplies for the pool. + * * @author Raphael Manfredi - * @date 2005 - * @date 2009 + * @date 2005, 2009, 2013 */ #include "common.h" +#include "palloc.h" + +#include "atomic.h" +#include "atoms.h" #include "cq.h" +#include "dump_options.h" +#include "elist.h" +#include "eslist.h" +#include "evq.h" #include "hashlist.h" -#include "glib-missing.h" -#include "unsigned.h" +#include "log.h" +#include "mutex.h" +#include "once.h" #include "palloc.h" +#include "pslist.h" +#include "sha1.h" +#include "spinlock.h" +#include "stringify.h" #include "tm.h" +#include "unsigned.h" #include "walloc.h" +#include "xmalloc.h" + #include "override.h" /* Must be the last header included */ #define POOL_OVERSIZED_THRESH 30 /**< Amount of seconds to wait */ #define POOL_EMA_SHIFT 5 /**< Avoid losing decimals */ +#define POOL_HEARTBEAT_PERIOD 1000 /**< ms: Scan every second */ -static guint32 palloc_debug; /**< Debug level */ +static uint32 palloc_debug; /**< Debug level */ static hash_list_t *pool_gc; /**< Pools needing garbage collection */ +static spinlock_t pool_gc_slk = SPINLOCK_INIT; + +static once_flag_t pool_gc_installed; + +#define POOL_GC_LOCK spinlock(&pool_gc_slk) +#define POOL_GC_UNLOCK spinunlock(&pool_gc_slk) enum pool_magic { POOL_MAGIC = 0x79b826eeU }; @@ -83,24 +108,52 @@ enum pool_magic magic; /**< Magic number */ char *name; /**< Pool name, for debugging */ size_t size; /**< Size of blocks held in the pool */ - GSList *buffers; /**< Allocated buffers in the pool */ - cevent_t *heartbeat_ev; /**< Monitoring of pool level */ + eslist_t buffers; /**< Allocated buffers in the pool */ + cperiodic_t *heart_ev; /**< Monitoring of pool level */ pool_alloc_t alloc; /**< Memory allocation routine */ pool_free_t dealloc; /**< Memory release routine */ - pool_frag_t is_frag; /**< Fragment checking routing */ - unsigned allocated; /**< Amount of allocated buffers */ - unsigned held; /**< Amount of available buffers */ - unsigned slow_ema; /**< Slow EMA of pool usage (n = 31) */ - unsigned fast_ema; /**< Fast EMA of pool usage (n = 3) */ - unsigned alloc_reqs; /**< Amount of palloc() requests until a pfree() */ - unsigned max_alloc; /**< Max amount of alloc_reqs */ - unsigned monotonic_ema; /**< Fast EMA of "max_alloc" */ - unsigned above; /**< Amount of times allocation >= used EMA */ - unsigned peak; /**< Peak usage, when we're above used EMA */ + pool_frag_t is_frag; /**< Fragment checking routine (optional) */ + size_t allocated; /**< Amount of allocated buffers */ + size_t slow_ema; /**< Slow EMA of pool usage (n = 31) */ + size_t fast_ema; /**< Fast EMA of pool usage (n = 3) */ + size_t alloc_reqs; /**< Amount of palloc() requests until a pfree() */ + size_t max_alloc; /**< Max amount of alloc_reqs */ + size_t monotonic_ema; /**< Fast EMA of "max_alloc" */ + size_t held_slow_ema; /**< Slow EMA of pool held items (n = 31) */ + size_t held_fast_ema; /**< Fast EMA of pool held items (n = 3) */ + size_t above; /**< Amount of times allocation >= used EMA */ + size_t peak; /**< Peak usage, when we're above used EMA */ + mutex_t lock; /**< Thread-safe lock */ + link_t pool_link; /**< Links all the created pools, for stats */ + + /* Statistics */ + + AU64(allocations); + AU64(freeings); + AU64(alloc_pool); + AU64(alloc_core); + AU64(free_fragments); + AU64(free_collected); }; #define pool_ema(p_, f_) ((p_)->f_ >> POOL_EMA_SHIFT) +#define POOL_STATS_INCX(p,v) AU64_INC(&(p)->v) +#define POOL_STATS_ADDX(p,v,n) AU64_ADD(&(p)->v, n) + +/* + * Pool locking needs to be re-entrant, because a pfree() can cause the + * current thread to recurse back to palloc(): xmalloc() uses a pool to + * store thread local chunks, and a pfree() could therefore allocate memory. + */ + +#define POOL_LOCK(p) mutex_lock(&(p)->lock) +#define POOL_LOCK_TRY(p) mutex_trylock(&(p)->lock) +#define POOL_UNLOCK(p) mutex_unlock(&(p)->lock) + +#define assert_pool_locked(p) \ + assert_mutex_is_owned(&(p)->lock) + static inline void pool_check(const pool_t * const p) { @@ -108,58 +161,118 @@ g_assert(POOL_MAGIC == p->magic); } -static void pool_install_heartbeat(pool_t *p); +/* + * All the pools are linked together so that we can collect statistics + * about them. + */ +static elist_t pool_vars = ELIST_INIT(offsetof(struct pool, pool_link)); +static spinlock_t pool_vars_slk = SPINLOCK_INIT; + +#define POOL_VARS_LOCK spinlock(&pool_vars_slk) +#define POOL_VARS_UNLOCK spinunlock(&pool_vars_slk) + +/** + * Add a new pool to the global list of pools. + */ +static void +pool_vars_add(pool_t *p) +{ + pool_check(p); + + POOL_VARS_LOCK; + elist_append(&pool_vars, p); + POOL_VARS_UNLOCK; +} + +/** + * Remove pool from the list of pools. + */ +static void +pool_vars_remove(pool_t *p) +{ + pool_check(p); + + POOL_VARS_LOCK; + elist_remove(&pool_vars, p); + POOL_VARS_UNLOCK; +} + +/** + * Called when the main callout queue is idle to attempt pool GC. + */ +static bool +pool_gc_idle(void *unused_data) +{ + (void) unused_data; + + pgc(); + return TRUE; /* Keep calling */ +} + +/** + * Install periodic idle callback to run the pool garbage collector. + */ +static void G_COLD +pool_gc_install(void) +{ + evq_raw_idle_add(pool_gc_idle, NULL); +} /** * Register or deregister a pool for garabage collection. */ static void -pool_needs_gc(const pool_t *p, gboolean need) +pool_needs_gc(const pool_t *p, bool need) { + bool change = FALSE; /* For logging, if needed */ + pool_check(p); + POOL_GC_LOCK; + if (!need) { if (pool_gc != NULL && hash_list_remove(pool_gc, p) != NULL) { - if (palloc_debug > 1) { - g_debug("PGC turning off GC for pool \"%s\" " - "(allocated=%u, held=%u, slow_ema=%u, fast_ema=%u)", - p->name, p->allocated, p->held, - pool_ema(p, slow_ema), pool_ema(p, fast_ema)); - } - if (0 == hash_list_length(pool_gc)) { + if (0 == hash_list_length(pool_gc)) hash_list_free(&pool_gc); - } + change = TRUE; } } else { if (NULL == pool_gc) pool_gc = hash_list_new(NULL, NULL); if (!hash_list_contains(pool_gc, p)) { hash_list_append(pool_gc, p); - if (palloc_debug > 1) { - g_debug("PGC turning GC on for pool \"%s\" " - "(allocated=%u, held=%u, slow_ema=%u, fast_ema=%u)", - p->name, p->allocated, p->held, - pool_ema(p, slow_ema), pool_ema(p, fast_ema)); - } + change = TRUE; } } + + POOL_GC_UNLOCK; + + if G_UNLIKELY(change && palloc_debug > 1) { + s_debug("PGC turning %s for pool \"%s\" " + "(allocated=%zu, held=%zu, slow_ema=%zu, " + "fast_ema=%zu, held_ema=%zu)", + need ? "GC on" : "off GC", + p->name, p->allocated, eslist_count(&p->buffers), + pool_ema(p, slow_ema), pool_ema(p, fast_ema), + pool_ema(p, held_slow_ema)); + } } /** * Pool heartbeat to monitor usage level. */ -static void -pool_heartbeat(cqueue_t *unused_cq, gpointer obj) +static bool +pool_heartbeat(void *obj) { pool_t *p = obj; - unsigned used; - unsigned ema; + size_t used, ema, held; + bool needs_gc, update = FALSE; pool_check(p); - g_assert(p->allocated >= p->held); - (void) unused_cq; - pool_install_heartbeat(p); + POOL_LOCK(p); + + g_assert(p->allocated >= eslist_count(&p->buffers)); /* * Update the usage EMA. @@ -175,7 +288,7 @@ * pool_ema() to perform the necessary correction. */ - used = p->allocated - p->held; + used = p->allocated - eslist_count(&p->buffers); used <<= POOL_EMA_SHIFT; p->slow_ema += (used >> 4) - (p->slow_ema >> 4); @@ -184,6 +297,14 @@ ema = MAX(pool_ema(p, slow_ema), pool_ema(p, fast_ema)); /* + * Keep track of the amount of held blocks via a slow EMA. + */ + + held = eslist_count(&p->buffers) << POOL_EMA_SHIFT; + p->held_slow_ema += (held >> 4) - (p->held_slow_ema >> 4); + p->held_fast_ema += (held >> 1) - (p->held_fast_ema >> 1); + + /* * Update average monotonic allocation count, if anything occurred * since the last heartbeat. */ @@ -202,35 +323,65 @@ */ if (p->allocated > ema + pool_ema(p, monotonic_ema)) { - unsigned peak = p->allocated - p->held; + size_t peak = p->allocated - eslist_count(&p->buffers); if (peak > p->peak) p->peak = peak; if (++p->above >= POOL_OVERSIZED_THRESH) - pool_needs_gc(p, TRUE); - } else { + update = needs_gc = TRUE; + } else if ( + p->held_fast_ema >= p->held_slow_ema || + eslist_count(&p->buffers) >= (p->allocated >> 4) + ) { + update = needs_gc = 0 != p->allocated; + } else if (p->peak != 0) { p->above = 0; p->peak = 0; - pool_needs_gc(p, FALSE); + update = TRUE; + needs_gc = FALSE; } + POOL_UNLOCK(p); + + if (update) + pool_needs_gc(p, needs_gc); + if (palloc_debug > 4) { - g_debug("PGC pool \"%s\": allocated=%u, held=%u, used=%u, above=%u, " - "slow_ema=%u, fast_ema=%u, monotonic_ema=%u, peak=%u", - p->name, p->allocated, p->held, p->allocated - p->held, p->above, + size_t n = eslist_count(&p->buffers); + s_debug("PGC pool \"%s\": allocated=%zu, held=%zu, used=%zu, " + "above=%zu, slow_ema=%zu, fast_ema=%zu, " + "monotonic_ema=%zu, peak=%zu, " + "held_slow_ema=%zu, held_fast_ema=%zu", + p->name, p->allocated, n, p->allocated - n, p->above, pool_ema(p, slow_ema), pool_ema(p, fast_ema), - pool_ema(p, monotonic_ema), p->peak); + pool_ema(p, monotonic_ema), p->peak, + pool_ema(p, held_slow_ema), pool_ema(p, held_fast_ema)); } + + return TRUE; /* Keep calling */ } /** - * Install periodic pool hearbeat (once per second). + * @return the amount of buffers held in the pool. */ -static void -pool_install_heartbeat(pool_t *p) +size_t +pool_count(const pool_t *p) { + pool_check(p); + + atomic_mb(); + return eslist_count(&p->buffers); /* No need to lock */ +} +/** + * @return the amount of buffers allocated by the pool. + */ +size_t +pool_capacity(const pool_t *p) +{ pool_check(p); - p->heartbeat_ev = cq_main_insert(1000, pool_heartbeat, p); + + atomic_mb(); + return p->allocated; /* No need to lock */ } /** @@ -240,7 +391,7 @@ * @param size size of blocks held in the pool * @param alloc allocation routine to get a new block * @param dealloc deallocation routine to free an unused block - * @param is_frag routine to check for memory fragments + * @param is_frag routine to check for memory fragments (optional) */ pool_t * pool_create(const char *name, @@ -248,15 +399,20 @@ { pool_t *p; - WALLOC0(p); + once_flag_run(&pool_gc_installed, pool_gc_install); + + XMALLOC0(p); p->magic = POOL_MAGIC; - p->name = g_strdup(name); - p->size = size; + p->name = xstrdup(name); + p->size = MAX(size, sizeof(slink_t)); /* Needs leading slink_t */ p->alloc = alloc; p->dealloc = dealloc; p->is_frag = is_frag; - - pool_install_heartbeat(p); + eslist_init(&p->buffers, 0); /* Use first pointer as slink_t */ + mutex_init(&p->lock); + p->heart_ev = + evq_raw_periodic_add(POOL_HEARTBEAT_PERIOD, pool_heartbeat, p); + pool_vars_add(p); return p; } @@ -268,20 +424,24 @@ pool_free(pool_t *p) { unsigned outstanding; - GSList *sl; + void *b; pool_check(p); - g_assert(p->allocated >= p->held); + + POOL_LOCK(p); + + g_assert(p->allocated >= eslist_count(&p->buffers)); /* * Make sure there's no outstanding object allocated from the pool. */ - outstanding = p->allocated - p->held; + outstanding = p->allocated - eslist_count(&p->buffers); - if (outstanding != 0) - g_warning("freeing pool \"%s\" of %u-byte objects with %u still used", - p->name, (guint) p->size, outstanding); + if (outstanding != 0) { + g_carp("freeing pool \"%s\" of %zu-byte objects with %u still used", + p->name, p->size, outstanding); + } pool_needs_gc(p, FALSE); @@ -289,61 +449,87 @@ * Free buffers still held in the pool. */ - for (sl = p->buffers; sl; sl = g_slist_next(sl)) { - p->dealloc(sl->data, FALSE); + while (NULL != (b = eslist_shift(&p->buffers))) { + p->dealloc(b, p->size, FALSE); } - gm_slist_free_null(&p->buffers); - G_FREE_NULL(p->name); - cq_cancel(&p->heartbeat_ev); + XFREE_NULL(p->name); + cq_periodic_remove(&p->heart_ev); + mutex_destroy(&p->lock); /* Unlocks pool */ + + /* + * Now that the pool is unlocked, we can call pool_vars_remove(). + * + * We must not call it with the pool locked since the normal locking + * order is to get the pool_vars_slk lock and only then the pool lock. + * Breaking that order could cause a deadlock. + * --RAM, 2015-03-05. + */ + + pool_vars_remove(p); + p->magic = 0; - WFREE(p); + xfree(p); } /** * Allocate buffer from the pool. */ -G_GNUC_HOT gpointer +void * G_HOT palloc(pool_t *p) { - pool_check(p); - - p->alloc_reqs++; + void *obj; - /* - * If we have a buffer available, we're done. - */ + pool_check(p); - if (p->buffers) { - gpointer obj; + POOL_STATS_INCX(p, allocations); + POOL_LOCK(p); - g_assert(uint_is_positive(p->held)); + p->alloc_reqs++; - obj = p->buffers->data; - p->buffers = g_slist_delete_link(p->buffers, p->buffers); - p->held--; + if (0 != eslist_count(&p->buffers)) { + /* + * We have a buffer available, we're done. + */ - return obj; + obj = eslist_shift(&p->buffers); + POOL_UNLOCK(p); + POOL_STATS_INCX(p, alloc_pool); + } else { + /* + * No such luck, allocate a new buffer. + */ + + p->allocated++; + POOL_UNLOCK(p); + POOL_STATS_INCX(p, alloc_core); + obj = p->alloc(p->size); } - /* - * No such luck, allocate a new buffer. - */ - - p->allocated++; - return p->alloc(p->size); + return obj; } /** * Return a buffer to the pool. */ void -pfree(pool_t *p, gpointer obj) +pfree(pool_t *p, void *obj) { + bool is_fragment; + pool_check(p); g_assert(obj != NULL); /* + * See whether buffer is a fragment before entering the critical section. + */ + + is_fragment = NULL != p->is_frag && p->is_frag(obj, p->size); + + POOL_STATS_INCX(p, freeings); + POOL_LOCK(p); + + /* * Determine the maximum amount of consecutive allocations we can have * until a free occurs. */ @@ -355,19 +541,29 @@ /* * Keep the buffer in the pool, unless it is a fragment. + * + * For xmalloc(), we allow a pool to be created AFTER objects have been + * allocated, therefore we must make sure p->allocated is not decreased + * below the amount of buffers held in the list. */ - if (p->is_frag(obj)) { - g_assert(uint_is_positive(p->allocated)); + if (is_fragment) { + g_assert(p->allocated >= eslist_count(&p->buffers)); + + if (p->allocated > eslist_count(&p->buffers)) + p->allocated--; + POOL_UNLOCK(p); if (palloc_debug > 1) - g_debug("PGC pool \"%s\": buffer %p is a fragment", p->name, obj); + s_debug("PGC pool \"%s\": buffer %p is a fragment", p->name, obj); - p->dealloc(obj, TRUE); - p->allocated--; + p->dealloc(obj, p->size, TRUE); + POOL_STATS_INCX(p, free_fragments); } else { - p->buffers = g_slist_prepend(p->buffers, obj); - p->held++; + eslist_prepend(&p->buffers, obj); + if G_UNLIKELY(p->allocated < eslist_count(&p->buffers)) + p->allocated = eslist_count(&p->buffers); + POOL_UNLOCK(p); } } @@ -375,48 +571,41 @@ * Set debug level. */ void -set_palloc_debug(guint32 level) +set_palloc_debug(uint32 level) { palloc_debug = level; } /** - * Reclaim buffer. - */ -static void -pool_reclaim(pool_t *p, gpointer obj) -{ - g_assert(uint_is_positive(p->allocated)); - g_assert(uint_is_positive(p->held)); - - p->buffers = g_slist_remove(p->buffers, obj); - p->dealloc(obj, FALSE); - p->allocated--; - p->held--; -} - -/** * Invoked by garbage collector to reclaim over-allocated blocks. + * + * The pool is locked upon entry. */ static void pool_reclaim_garbage(pool_t *p) { - unsigned ema; - unsigned threshold; - unsigned extra; + size_t ema, threshold, extra, spurious = 0, collecting = 0; + eslist_t to_remove; + void *b; pool_check(p); - g_assert(p->allocated >= p->held); + + eslist_init(&to_remove, 0); + POOL_LOCK(p); + + g_assert(p->allocated >= eslist_count(&p->buffers)); if (palloc_debug > 2) { - g_debug("PGC garbage collecting pool \"%s\": allocated=%u, held=%u " - "slow_ema=%u, fast_ema=%u, bg_ema=%u, peak=%u", - p->name, p->allocated, p->held, + s_debug("PGC garbage collecting pool \"%s\": allocated=%zu, held=%zu " + "slow_ema=%zu, fast_ema=%zu, bg_ema=%zu, peak=%zu, " + "held_slow_ema=%zu, held_fast_ema=%zu", + p->name, p->allocated, eslist_count(&p->buffers), pool_ema(p, slow_ema), pool_ema(p, fast_ema), - pool_ema(p, monotonic_ema), p->peak); + pool_ema(p, monotonic_ema), p->peak, + pool_ema(p, held_slow_ema), pool_ema(p, held_fast_ema)); } - if (0 == p->held) + if (0 == eslist_count(&p->buffers)) goto reset; /* No blocks */ /* @@ -426,9 +615,9 @@ if (p->fast_ema > p->slow_ema) { if (palloc_debug > 1) { - g_debug("PGC not collecting %u block%s from \"%s\": " - "recent allocation burst", - p->held, 1 == p->held ? "" : "s", p->name); + size_t n = eslist_count(&p->buffers); + s_debug("PGC not collecting %zu block%s from \"%s\": " + "recent allocation burst", n, plural(n), p->name); } goto reset; } @@ -442,16 +631,29 @@ * twice the current EMA value. */ - if (p->allocated - p->held > ema) { + if ((size_t) p->allocated - eslist_count(&p->buffers) > ema) { if (palloc_debug > 1) { - g_debug("PGC doubling current EMA max for \"%s\": " - "used block count %u currently above largest EMA %u", - p->name, p->allocated - p->held, ema); + s_debug("PGC doubling current EMA max for \"%s\": " + "used block count %zu currently above largest EMA %zu", + p->name, + p->allocated - eslist_count(&p->buffers), ema); } ema *= 2; } /* + * If we hold more blocks than the slow EMA, it's time to reclaim + * some of these spurious blocks. + */ + + if ( + p->held_fast_ema >= p->held_slow_ema || + eslist_count(&p->buffers) == pool_ema(p, held_slow_ema) + ) { + spurious = pool_ema(p, held_slow_ema) >> 1; + } + + /* * The threshold is normally the EMA of "grabbed" blocks plus the * requirements for monotonic allocations. However, we are also * monitoring the peak "grabbing" and use that as minimum boundary @@ -463,36 +665,30 @@ threshold = MAX(threshold, p->peak); threshold += ema; - if (p->allocated <= threshold) { + if (p->allocated <= threshold && 0 == spurious) { if (palloc_debug > 1) { - g_debug("PGC not collecting %u block%s from \"%s\": " - "allocation count %u currently below or at target of %u", - p->held, 1 == p->held ? "" : "s", p->name, p->allocated, - threshold); + size_t n = eslist_count(&p->buffers); + s_debug("PGC not collecting %zu block%s from \"%s\": " + "allocation count %zu currently below or at target of %zu", + n, plural(n), p->name, p->allocated, threshold); } goto reset; } extra = p->allocated - threshold; - extra = MIN(extra, p->held); - - if (palloc_debug > 1) { - g_debug("PGC collecting %u extra block%s from \"%s\"", - extra, 1 == extra ? "" : "s", p->name); - } + extra = MAX(extra, spurious); + collecting = extra = MIN(extra, eslist_count(&p->buffers)); /* * Here we go, reclaim extra buffers. */ while (extra-- > 0) { - GSList *sl = p->buffers; - gpointer obj; - - g_assert(sl != NULL); + b = eslist_shift(&p->buffers); - obj = sl->data; - pool_reclaim(p, obj); + g_assert(b != NULL); + p->allocated--; + eslist_append(&to_remove, b); } /* @@ -502,6 +698,40 @@ reset: p->above = 0; p->peak = 0; + + /* + * Unlock pool and then physically reclaim memory. + */ + + POOL_UNLOCK(p); + POOL_STATS_ADDX(p, free_collected, eslist_count(&to_remove)); + + if G_UNLIKELY(palloc_debug && 0 != eslist_count(&to_remove)) { + /* Reading p->allocated without the pool's lock, but we don't care */ + s_debug("PGC \"%s\": collecting %zu block%s " + "(%zu spurious, %zu allocated)", + p->name, collecting, plural(collecting), spurious, p->allocated); + } + + while (NULL != (b = eslist_shift(&to_remove))) { + p->dealloc(b, p->size, FALSE); + } +} + +/** + * Hash list iterator trampoline to reclaim garbage from pool. + */ +static bool +pool_gc_trampoline(void *obj, void *udata) +{ + pool_t *p = obj; + + (void) udata; + pool_check(p); + + pool_reclaim_garbage(p); + + return TRUE; /* Processed, can remove from list */ } /** @@ -513,32 +743,235 @@ void pgc(void) { - static time_t last_run; - time_t now; - hash_list_iter_t *iter; - - if (NULL == pool_gc) - return; - /* - * Limit iterations to one per second. + * Reclaim garbage from the pools that registered. */ - now = tm_time(); - if (last_run == now) - return; - last_run = now; + POOL_GC_LOCK; + + if (pool_gc != NULL) { + hash_list_foreach_remove(pool_gc, pool_gc_trampoline, NULL); + if (0 == hash_list_length(pool_gc)) + hash_list_free(&pool_gc); + } - iter = hash_list_iterator(pool_gc); + POOL_GC_UNLOCK; +} + +/** + * Add pool statistics into supplied pool_info_t. + */ +static void +pool_info_add(const pool_t *p, pool_info_t *pi) +{ +#define STATS_ADD(name) pi->name += AU64_VALUE(&p->name) + + pi->allocated += p->allocated; + pi->available += eslist_count(&p->buffers); + STATS_ADD(allocations); + STATS_ADD(freeings); + STATS_ADD(alloc_pool); + STATS_ADD(alloc_core); + STATS_ADD(free_fragments); + STATS_ADD(free_collected); + +#undef STATS_ADD +} - while (hash_list_iter_has_next(iter)) { - pool_t *p = hash_list_iter_next(iter); - pool_reclaim_garbage(p); +/** + * Retrieve pool list information. + * + * @return list of pool_info_t that must be freed by calling the + * pool_info_list_free_null() routine. + */ +pslist_t * +pool_info_list(void) +{ + pslist_t *sl = NULL; + pool_t *p; + + POOL_VARS_LOCK; + + ELIST_FOREACH_DATA(&pool_vars, p) { + pool_info_t *pi; + + pool_check(p); + + WALLOC0(pi); + pi->magic = POOL_INFO_MAGIC; + + POOL_LOCK(p); + + pi->name = atom_str_get(p->name); + pi->size = p->size; + pool_info_add(p, pi); + + POOL_UNLOCK(p); + + sl = pslist_prepend(sl, pi); } - hash_list_iter_release(&iter); - hash_list_free(&pool_gc); + POOL_VARS_UNLOCK; + + return pslist_reverse(sl); } -/* vi: set ts=4 sw=4 cindent: */ +static void +pool_info_free(void *data, void *udata) +{ + pool_info_t *pi = data; + + (void) udata; + + pool_info_check(pi); + + atom_str_free_null(&pi->name); + WFREE(pi); +} + +/** + * Free list created by pool_info_list() and nullify pointer. + */ +void +pool_info_list_free_null(pslist_t **sl_ptr) +{ + pslist_t *sl = *sl_ptr; + pslist_foreach(sl, pool_info_free, NULL); + pslist_free_null(sl_ptr); +} + +/** + * Build consolidated statistics across all the pools. + */ +static void +palloc_all_stats(pool_info_t *stats) +{ + pool_t *p; + + ZERO(stats); + + POOL_VARS_LOCK; + + ELIST_FOREACH_DATA(&pool_vars, p) { + pool_check(p); + + POOL_LOCK(p); + pool_info_add(p, stats); + POOL_UNLOCK(p); + } + + POOL_VARS_UNLOCK; +} + +/** + * Generate a SHA1 digest of the current tmalloc statistics. + * + * This is meant for dynamic entropy collection. + */ +void +palloc_stats_digest(sha1_t *digest) +{ + pool_info_t stats; + + palloc_all_stats(&stats); + SHA1_COMPUTE(stats, digest); +} + +/** + * Dump consolidated palloc statistics to specified log agent. + */ +void G_COLD +palloc_dump_stats_log(logagent_t *la, unsigned options) +{ + pool_info_t stats; + bool groupped = booleanize(options & DUMP_OPT_PRETTY); + + palloc_all_stats(&stats); + +#define DUMPS(x) log_info(la, "PALLOC %s = %s", #x, \ + size_t_to_string_grp(stats.x, groupped)) + +#define DUMPV(x) log_info(la, "PALLOC %s = %s", #x, \ + uint64_to_string_grp(stats.x, groupped)) + + DUMPS(allocated); + DUMPS(available); + DUMPV(allocations); + DUMPV(freeings); + DUMPV(alloc_pool); + DUMPV(alloc_core); + DUMPV(free_fragments); + DUMPV(free_collected); + +#undef DUMPS +#undef DUMPV +} + +/* + * Dump palloc stats information to specified log-agent. + */ +static void +palloc_info_dump(void *data, void *udata) +{ + pool_info_t *pi = data; + logagent_t *la = udata; + + pool_info_check(pi); + +#define DUMPS(x) \ + log_info(la, "PALLOC %14s = %'zu", #x, pi->x) + +#define DUMPL(x) \ + log_info(la, "PALLOC %14s = %s", #x, uint64_to_gstring(pi->x)) + + log_info(la, "PALLOC --- \"%s\" %zu-byte blocks ---", + pi->name, pi->size); + + DUMPS(allocated); + DUMPS(available); + DUMPL(allocations); + DUMPL(freeings); + DUMPL(alloc_pool); + DUMPL(alloc_core); + DUMPL(free_fragments); + DUMPL(free_collected); + +#undef DUMPS +#undef DUMPL +} + +static int +pool_info_size_cmp(const void *a, const void *b) +{ + const pool_info_t *ai = a, *bi = b; + + return CMP(ai->size, bi->size); +} + +/** + * Dump per-pool statistics to specified logagent. + */ +void G_COLD +palloc_dump_pool_log(logagent_t *la) +{ + pslist_t *sl = pool_info_list(); + + sl = pslist_sort(sl, pool_info_size_cmp); + pslist_foreach(sl, palloc_info_dump, la); + pool_info_list_free_null(&sl); +} + +/** + * Dump palloc statistics. + */ +void G_COLD +palloc_dump_stats(void) +{ + s_info("PALLOC running statistics:"); + palloc_dump_stats_log(log_agent_stderr_get(), 0); + s_info("PALLOC per-allocator statistics:"); + palloc_dump_pool_log(log_agent_stderr_get()); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/palloc.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/palloc.h
Changed
@@ -39,12 +39,38 @@ #include "common.h" -typedef gpointer (*pool_alloc_t)(size_t len); -typedef void (*pool_free_t)(gpointer addr, gboolean fragment); -typedef gboolean (*pool_frag_t)(gpointer addr); +typedef void *(*pool_alloc_t)(size_t len); +typedef void (*pool_free_t)(void *addr, size_t len, bool fragment); +typedef bool (*pool_frag_t)(void *addr, size_t len); typedef struct pool pool_t; +enum pool_info_magic { POOL_INFO_MAGIC = 0x467df483 }; + +/** + * Pool information that can be retrieved. + */ +typedef struct { + enum pool_info_magic magic; + const char *name; /**< Pool name (atom) */ + size_t size; /**< Object size */ + size_t allocated; /**< Amount of allocated objects */ + size_t available; /**< Amount of available objects */ + uint64 allocations; /**< Total amount of allocations */ + uint64 freeings; /**< Total amount of freeings */ + uint64 alloc_pool; /**< Allocations served from pool */ + uint64 alloc_core; /**< Allocations that needed new memory */ + uint64 free_fragments; /**< Objects freed as they were fragments */ + uint64 free_collected; /**< Objects collected by the GC */ +} pool_info_t; + +static inline void +pool_info_check(const pool_info_t * const pi) +{ + g_assert(pi != NULL); + g_assert(POOL_INFO_MAGIC == pi->magic); +} + /* * Public interface */ @@ -52,12 +78,23 @@ pool_t *pool_create(const char *name, size_t size, pool_alloc_t alloc, pool_free_t dealloc, pool_frag_t is_frag); void pool_free(pool_t *pool); +size_t pool_count(const pool_t *p); +size_t pool_capacity(const pool_t *p); -gpointer palloc(pool_t *pool); -void pfree(pool_t *pool, gpointer obj); +void *palloc(pool_t *pool); +void pfree(pool_t *pool, void *obj); void pgc(void); -void set_palloc_debug(guint32 level); +struct sha1; +void palloc_stats_digest(struct sha1 *digest); + +void set_palloc_debug(uint32 level); + +struct pslist *pool_info_list(void); +void pool_info_list_free_null(struct pslist **sl_ptr); +void palloc_dump_stats_log(logagent_t *la, unsigned options); +void palloc_dump_pool_log(logagent_t *la); +void palloc_dump_stats(void); #endif /* _palloc_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/parse.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/parse.c
Changed
@@ -74,8 +74,8 @@ \ STATIC_ASSERT((TYPE) -1 > 35); /* works for unsigned integers only */ \ \ - g_assert(src); \ - g_assert(errorptr); \ + g_assert(src != NULL); \ + g_assert(errorptr != NULL); \ g_assert(base >= 2 && base <= 36); \ \ p = src; \ @@ -100,7 +100,7 @@ error = EINVAL; \ \ finish: \ - if (endptr) \ + if (endptr != NULL) \ *endptr = p; \ \ *errorptr = error; \ @@ -108,7 +108,7 @@ } #define GENERATE_PARSE_UINTX(bits) \ - GENERATE_PARSE_UNSIGNED(CAT2(parse_uint,bits), CAT2(guint,bits)) + GENERATE_PARSE_UNSIGNED(CAT2(parse_uint,bits), CAT2(uint,bits)) GENERATE_PARSE_UINTX(64) GENERATE_PARSE_UINTX(32) GENERATE_PARSE_UINTX(16) @@ -119,7 +119,108 @@ GENERATE_PARSE_UNSIGNED(parse_size, size_t) /** - * Parse a pointer in hexadecimal notation, with optional leading "Ox" or "0X". + * Determine which base the number held in `src' is expressed in. + * + * If the number starts with "0x" or "0X", hexadecimal is assumed. + * If the number starts with "0b" or "0B", binary is assumed. + * If the number starts with "0", octal is assumed. + * Otherwise, decimal is assumed if it starts with 1-9. + * + * @param src the number to parse, with leading base indication + * @param endptr if non-NULL, set with the start of the number, past base + * + * @return the intuited number base, 0 if first character is not a number. + */ +uint +parse_base(const char *src, char const **endptr) +{ + uint base; + const char *p = src; + + g_assert(src != NULL); + + if ('0' == src0) { + if ('x' == ascii_tolower(src1)) { + base = 16; + p = &src2; + } else if ('b' == ascii_tolower(src1)) { + base = 2; + p = &src2; + } else if ('\0' == src1) { + base = 10; /* This is a plain "0" */ + } else { + base = 8; + p = &src1; + } + } else if (is_ascii_digit(src0)) { + base = 10; + } else { + base = 0; + } + + + if (endptr != NULL) + *endptr = p; + + return base; +} + +/** + * Parse 32-bit value which can be given as decimal, octal (prefix "0"), + * hexadecimal (prefix "0x" or "OX"), binary (prefix "0b" or "OB"). + * + * If an error occurs, *errorptr is set with EINVAL or ERANGE, otherwise + * *errorptr is written with 0. + * + * @return the parsed value, 0 meaning possible error (check *errorptr). + */ +uint32 +parse_v32(const char *src, char const **endptr, int *errorptr) +{ + uint base; + const char *start; + + base = parse_base(src, &start); + + if G_UNLIKELY(0 == base) { + if (endptr != NULL) + *endptr = src; + *errorptr = EINVAL; + return 0; + } + + return parse_uint32(start, endptr, base, errorptr); +} + +/** + * Parse 64-bit value which can be given as decimal, octal (prefix "0"), + * hexadecimal (prefix "0x" or "OX"), binary (prefix "0b" or "OB"). + * + * If an error occurs, *errorptr is set with EINVAL or ERANGE, otherwise + * *errorptr is written with 0. + * + * @return the parsed value, 0 meaning possible error (check *errorptr). + */ +uint64 +parse_v64(const char *src, char const **endptr, int *errorptr) +{ + uint base; + const char *start; + + base = parse_base(src, &start); + + if G_UNLIKELY(0 == base) { + if (endptr != NULL) + *endptr = src; + *errorptr = EINVAL; + return 0; + } + + return parse_uint64(start, endptr, base, errorptr); +} + +/** + * Parse a pointer in hexadecimal notation, with optional leading "0x" or "0X". */ const void * parse_pointer(const char *src, char const **endptr, int *errorptr) @@ -144,17 +245,17 @@ * character which caused the failure. * @returns FALSE if ``s'' is not a valid IPv6 address; TRUE on success. */ -gboolean -parse_ipv6_addr(const char *s, guint8 *dst, const char **endptr) +bool +parse_ipv6_addr(const char *s, uint8 *dst, const char **endptr) { const char *p = s; - guint8 buf16; + uint8 buf16; int i; - guchar c = 0, last; + uchar c = 0, last; int dc_start = -1; int error; - gboolean leading_bracket = FALSE; - gboolean ok = TRUE; + bool leading_bracket = FALSE; + bool ok = TRUE; g_assert(s != NULL); @@ -167,10 +268,10 @@ leading_bracket = TRUE; p++; } - + for (i = 0; i < 16; /* NOTHING */) { const char *ep; - guint32 v; + uint32 v; last = c; c = *p; @@ -196,7 +297,7 @@ break; /* parse_uint32() failed */ if (*ep == '.' && i <= 12) { - guint32 ip; + uint32 ip; if (string_to_ip_strict(p, &ip, &ep)) { p = ep; @@ -271,7 +372,7 @@ { const char *ep; int error; - guint32 maj, min; + uint32 maj, min; g_assert(src); @@ -300,10 +401,10 @@ * @returns 0 if ``s'' is not a valid IPv4 address. Otherwise, the parsed * IPv4 address in host byte order. */ -guint32 +uint32 string_to_ip(const char *s) { - guint32 ip; + uint32 ip; s = skip_ascii_spaces(s); return string_to_ip_strict(s, &ip, NULL) ? ip : 0; @@ -320,12 +421,12 @@ * byte order and ``*endptr'' will point to the character after the * IPv4 address. ``addr'' and ``endptr'' may be NULL. */ -gboolean -string_to_ip_strict(const char *s, guint32 *addr, const char **endptr) +bool +string_to_ip_strict(const char *s, uint32 *addr, const char **endptr) { const char *p = s; - guint32 a = 0; /* 'pid compiler */ - gboolean valid; + uint32 a = 0; /* 'pid compiler */ + bool valid; int i; g_assert(s != NULL); @@ -333,7 +434,7 @@ i = 0; for (;;) { int d, v; - + v = dec2int_inline(*p); if (-1 == v) break; @@ -341,7 +442,7 @@ d = dec2int_inline(*++p); if (-1 != d) { v = v * 10 + d; - + d = dec2int_inline(*++p); if (-1 != d) { v = v * 10 + d; @@ -350,7 +451,7 @@ } a = (a << 8) | v; - + if (3 == i++ || '.' != *p) break; p++; @@ -360,14 +461,14 @@ * The check for a dot takes care of addresses like 192.0.2.17.example.com. */ valid = 4 == i && '.' != *p; - + if (endptr) *endptr = p; if (addr) *addr = valid ? a : 0; - return valid; + return valid; } /** @@ -375,11 +476,11 @@ * * @return TRUE if it parsed correctly, FALSE otherwise. */ -gboolean -string_to_ip_port(const char *s, guint32 *ip_ptr, guint16 *port_ptr) +bool +string_to_ip_port(const char *s, uint32 *ip_ptr, uint16 *port_ptr) { const char *ep; - guint32 v; + uint32 v; int error; s = skip_ascii_spaces(s); @@ -409,8 +510,8 @@ * * If the IP address or the netmask is zero, the function will return FALSE. */ -gboolean -string_to_ip_and_mask(const char *str, guint32 *ip, guint32 *netmask) +bool +string_to_ip_and_mask(const char *str, uint32 *ip, uint32 *netmask) { const char *ep, *s = str; @@ -433,9 +534,9 @@ if (string_to_ip_strict(s, netmask, &ep)) { return 0 != *netmask; } else { - guint32 u; + uint32 u; int error; - + u = parse_uint32(s, &ep, 10, &error); if (error || u < 1 || u > 32 || *ep != '\0') return FALSE;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/parse.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/parse.h
Changed
@@ -37,13 +37,13 @@ #ifndef _parse_h_ #define _parse_h_ -guint8 parse_uint8(const char *, char const **, unsigned, int *) +uint8 parse_uint8(const char *, char const **, unsigned, int *) NON_NULL_PARAM((1)); -guint16 parse_uint16(const char *, char const **, unsigned, int *) +uint16 parse_uint16(const char *, char const **, unsigned, int *) NON_NULL_PARAM((1)); -guint32 parse_uint32(const char *, char const **, unsigned, int *) +uint32 parse_uint32(const char *, char const **, unsigned, int *) NON_NULL_PARAM((1)); -guint64 parse_uint64(const char *, char const **, unsigned, int *) +uint64 parse_uint64(const char *, char const **, unsigned, int *) NON_NULL_PARAM((1)); unsigned parse_uint(const char *, char const **, unsigned, int *) NON_NULL_PARAM((1)); @@ -53,19 +53,23 @@ NON_NULL_PARAM((1)); const void *parse_pointer(const char *, char const **, int *) NON_NULL_PARAM((1)); -gboolean parse_ipv6_addr(const char *s, uint8_t *dst, const char **endptr) +bool parse_ipv6_addr(const char *s, uint8_t *dst, const char **endptr) NON_NULL_PARAM((1)); int parse_major_minor(const char *src, char const **endptr, unsigned *major, unsigned *minor) NON_NULL_PARAM((1)); -guint32 string_to_ip(const char *); -gboolean string_to_ip_strict(const char *s, guint32 *addr, const char **ep); -gboolean string_to_ip_and_mask(const char *str, guint32 *ip, guint32 *netmask); -gboolean string_to_ip_port(const char *str, guint32 *ip, guint16 *port); -const char *ip_to_string(guint32); -size_t ipv4_to_string_buf(guint32 ip, char *buf, size_t size); -const char *hostname_port_to_string(const char *hostname, guint16 port); +uint parse_base(const char *src, char const **) NON_NULL_PARAM((1)); +uint32 parse_v32(const char *, char const **, int *) NON_NULL_PARAM((1)); +uint64 parse_v64(const char *, char const **, int *) NON_NULL_PARAM((1)); + +uint32 string_to_ip(const char *); +bool string_to_ip_strict(const char *s, uint32 *addr, const char **ep); +bool string_to_ip_and_mask(const char *str, uint32 *ip, uint32 *netmask); +bool string_to_ip_port(const char *str, uint32 *ip, uint16 *port); +const char *ip_to_string(uint32); +size_t ipv4_to_string_buf(uint32 ip, char *buf, size_t size); +const char *hostname_port_to_string(const char *hostname, uint16 port); #endif /* _parse_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/path.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/path.c
Changed
@@ -38,13 +38,16 @@ #include "ascii.h" #include "concat.h" -#include "path.h" -#include "misc.h" #include "halloc.h" +#include "log.h" /* For s_error() */ +#include "misc.h" #include "omalloc.h" +#include "path.h" +#include "spinlock.h" + #include "override.h" /* Must be the last header included */ -static const char *get_folder_basepath(enum special_folder which_folder); +static const char *get_folder_basepath(enum special_folder folder); static get_folder_basepath_func_t get_folder_basepath_func = get_folder_basepath; @@ -81,7 +84,7 @@ else sep = "/"; - return h_strconcat(dir, sep, file, (void *) 0); + return h_strconcat(dir, sep, file, NULL_PTR); } /** @@ -92,7 +95,7 @@ absolute_pathname(const char *file) { g_assert(file != NULL); - + if (is_absolute_path(file)) { return h_strdup(file); } else if ('\0' == file0) { @@ -108,7 +111,7 @@ /** * Check that given path does not exist. */ -gboolean +bool path_does_not_exist(const char *pathname) { filestat_t st; @@ -120,7 +123,7 @@ /** * Check whether path is an absolute path. */ -gboolean +bool is_absolute_path(const char *path) { g_assert(path != NULL); @@ -130,7 +133,7 @@ /* On Windows also check for something like C:\ and x:/ */ return is_running_on_mingw() && - is_ascii_alpha(path0) && + is_ascii_alpha(path0) && ':' == path1 && is_dir_separator(path2); } @@ -138,11 +141,11 @@ /** * Check whether file given by its dirname and its basename exists. */ -gboolean +bool filepath_exists(const char *dir, const char *file) { filestat_t buf; - gboolean exists; + bool exists; char *path; path = make_pathname(dir, file); @@ -166,19 +169,20 @@ const char * filepath_basename(const char *pathname) { - const char *p, *q; - + const char *p; + g_assert(pathname); - + p = strrchr(pathname, '/'); if (p) { p++; } else { p = pathname; } - q = strrchr(p, G_DIR_SEPARATOR); - if (q) { - p = &q1; + if (G_DIR_SEPARATOR != '/') { + const char *q = strrchr(p, G_DIR_SEPARATOR); + if (q) + p = &q1; } return p; } @@ -187,7 +191,7 @@ filepath_directory_end(const char *pathname, char separator) { const char *p; - + p = strrchr(pathname, separator); if (p) { while (p != pathname && is_dir_separator(p-1)) { @@ -237,37 +241,53 @@ /** * Get special folder path. * + * @note + * Our caller handles the caching so that it is guaranteed that we will be + * called just once per folder type. + * * @return pointer to static string, NULL if folder does not exist. */ static const char * -get_folder_basepath(enum special_folder which_folder) +get_folder_basepath(enum special_folder folder) { char *special_path = NULL; + char *pathname = NULL; - switch (which_folder) { + switch (folder) { case PRIVLIB_PATH: - { - static char *pathname; - - if (NULL == pathname) { - special_path = getenv("XDG_DATA_DIRS"); - if (special_path != NULL) { - pathname = omalloc(MAX_PATH_LEN); - concat_strings(pathname, MAX_PATH_LEN, - special_path, G_DIR_SEPARATOR_S, PACKAGE, (void *) 0); - } + special_path = getenv("XDG_DATA_DIRS"); + + if (special_path != NULL) { + if (is_absolute_path(special_path)) { + pathname = omalloc(MAX_PATH_LEN); + concat_strings(pathname, MAX_PATH_LEN, + special_path, G_DIR_SEPARATOR_S, PACKAGE, + NULL_PTR); + } else { + s_warning("ignoring environment variable XDG_DATA_DIRS: " + "holds non-absolute path \"%s\"", special_path); } - - special_path = pathname; } + special_path = pathname; break; case NLS_PATH: - special_path = getenv("NLSPATH"); - if (NULL == special_path) - special_path = LOCALE_EXP; + pathname = getenv("NLSPATH"); + + if (pathname != NULL && !is_absolute_path(pathname)) { + s_warning("ignoring environment variable NLSPATH: " + "holds non-absolute path \"%s\"", pathname); + pathname = NULL; + } + + if (NULL == pathname) + pathname = LOCALE_EXP; + + special_path = pathname; break; + case SPECIAL_FOLDER_COUNT: + g_assert_not_reached(); } - + return special_path; } @@ -278,36 +298,79 @@ } /** + * @return name of special folder. + */ +static char * +special_folder_name(enum special_folder folder) +{ + switch (folder) { + case PRIVLIB_PATH: return "PRIVLIB_PATH"; + case NLS_PATH: return "NLS_PATH"; + case SPECIAL_FOLDER_COUNT: break; + } + + g_assert_not_reached(); + return NULL; +} + +/** * Compute special folder path. * - * @param which_folder the special folder token - * @param path sub-path underneath the special folder + * @param folder the special folder token * - * @return halloc()'ed full path, NULL if special folder is unknown. + * @return constant string path, NULL if special folder is unknown. */ -char * -get_folder_path(enum special_folder which_folder, const char *path) +const char * +get_folder_path(enum special_folder folder) { - char *pathname; - size_t offset = 0; + const char *pathname; const char *special_path = NULL; + static struct { + const char *path; + bool computed; + } cachedSPECIAL_FOLDER_COUNT; + static spinlock_t cached_slk = SPINLOCK_INIT; - special_path = (*get_folder_basepath_func)(which_folder); - - if (NULL == special_path) - return NULL; - - pathname = halloc(MAX_PATH_LEN); - - offset = clamp_strcpy(pathname, MAX_PATH_LEN, special_path); - - if (path != NULL) { - /* Add directory separator if missing at the tail of the special path */ - if (offset > 0 && pathnameoffset - 1 != G_DIR_SEPARATOR) - pathnameoffset++ = G_DIR_SEPARATOR; - clamp_strcpy(&pathnameoffset, MAX_PATH_LEN - offset, path); + g_assert(UNSIGNED(folder) < SPECIAL_FOLDER_COUNT); + + /* + * Lookup in the cache first, so that we do not re-attempt to dynamically + * compute something that failed earlier (i.e. a NULL pointer is not + * sufficient to trigger computation). + */ + + if (cachedfolder.computed) + return cachedfolder.path; /* Can be NULL */ + + spinlock(&cached_slk); + + if G_UNLIKELY(cachedfolder.computed) { + spinunlock(&cached_slk); + return cachedfolder.path; /* Can be NULL */ } - + + special_path = (*get_folder_basepath_func)(folder); + + if (NULL == special_path) { + pathname = NULL; + } else { + pathname = ostrdup_readonly(special_path); + + /* + * A special folder MUST be an absolute path. + */ + + if (!is_absolute_path(pathname)) { + s_error("special folder %s is not an absolute path: %s", + special_folder_name(folder), pathname); + } + } + + cachedfolder.path = pathname; + cachedfolder.computed = TRUE; + + spinunlock(&cached_slk); + return pathname; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/path.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/path.h
Changed
@@ -39,18 +39,23 @@ char *make_pathname(const char *dir, const char *file); char *absolute_pathname(const char *file); -gboolean path_does_not_exist(const char *pathname); -gboolean is_absolute_path(const char *pathname); -gboolean filepath_exists(const char *dir, const char *file); +bool path_does_not_exist(const char *pathname); +bool is_absolute_path(const char *pathname); +bool filepath_exists(const char *dir, const char *file); const char *filepath_basename(const char *pathname); char *filepath_directory(const char *pathname); -enum special_folder { PRIVLIB_PATH, NLS_PATH }; +enum special_folder { + PRIVLIB_PATH = 0, + NLS_PATH, + + SPECIAL_FOLDER_COUNT +}; typedef const char *(*get_folder_basepath_func_t)( enum special_folder which_folder); void set_folder_basepath_func(get_folder_basepath_func_t func); -char *get_folder_path(enum special_folder which_folder, const char *path); +const char *get_folder_path(enum special_folder folder); #endif /* _path_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/patricia.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/patricia.c
Changed
@@ -31,30 +31,30 @@ * * The following example shows the growth of a PATRICIA tree under a * sequence of insertions (the alphabet here is {a,b} instead of {0,1}): - * + * * empty -- initial state - * + * * 12345 -- number character positions * insert ababb -- the key * * (differences are shown by upper-casing the alphabet letter) - * + * * ----> ababb - * + * * insert ababa; - * search ends at ababB~=ababA; - * 1st difference is at position 5, so... - * + * search ends at ababB~=ababA; + * 1st difference is at position 5, so... + * * ----> 5 -- i.e. test position #5 * . . * "a". ."b" -- left path taken bit #5 is "a", right if "b" * . . * ababa ababb - * + * * insert ba; - * has no position #5; - * can skip key positions but must test in order, so... - * + * has no position #5; + * can skip key positions but must test in order, so... + * * --------> 1 * . . * . . @@ -64,11 +64,11 @@ * . . * . . * ababa ababb - * + * * insert aaabba; - * search ends at aBabb~=aAabba; - * can skip key positions but must test in order, so... - * + * search ends at aBabb~=aAabba; + * can skip key positions but must test in order, so... + * * --------> 1 * . . * . . @@ -84,11 +84,11 @@ * ababa ababb * * (WARNING: below text differs from original text on the URL quoted above) - * + * * insert ab; - * ab is also a prefix of ababa and ababb; - * must have ability to terminate at an intermediate node, as with Tries. - * + * ab is also a prefix of ababa and ababb; + * must have ability to terminate at an intermediate node, as with Tries. + * * -------> 1 * . . * . . @@ -106,7 +106,7 @@ * . . * . . * ababa ababb - * + * * It is the position in the tree that defines the key, for lookups. No * comparison of keys are done other than testing individual bits. * @@ -118,7 +118,7 @@ * * When traversing the tree from the root with key "ab", the node flagged "2" * will bring us to node "3" and it is because the key length 2 is less than - * 3 AND because the node is flagged a containing embedded data that it + * 3 AND because the node is flagged as containing embedded data that it * indicates "ab" is a valid key with an attached value. This can happen only * when the keys stored in the tree are of variable length. * @@ -144,12 +144,15 @@ #include "common.h" #include "patricia.h" + #include "endian.h" -#include "glib-missing.h" #include "misc.h" -#include "random.h" #include "pow2.h" +#include "pslist.h" +#include "random.h" #include "walloc.h" +#include "xmalloc.h" + #include "override.h" /* Must be the last header included */ /** @@ -192,10 +195,10 @@ const void *value; /**< Data stored in this node */ } item; } u; - guint8 bit; /**< Bit to test for choosing "z" or "o" */ - guint8 last_kbit; /**< Last bit # in key (7 if 8-bit key) */ - guint8 leaf; /**< Is a leaf node */ - guint8 has_embedded_data; /**< Non-leaf node has data */ + uint8 bit; /**< Bit to test for choosing "z" or "o" */ + uint8 last_kbit; /**< Last bit # in key (7 if 8-bit key) */ + uint8 leaf; /**< Is a leaf node */ + uint8 has_embedded_data; /**< Non-leaf node has data */ }; /** @@ -302,7 +305,7 @@ size_t count; /**< Amount of keys stored */ size_t nodes; /**< Total amount of nodes used */ size_t embedded; /**< Nodes holding embedded data */ - guint stamp; /**< Stamp to protect iterators */ + uint stamp; /**< Stamp to protect iterators */ int refcnt; /**< Reference count */ }; @@ -428,12 +431,12 @@ * @return a pointer to a key stored in a sub node, so it has more bits * than the actual prefix and fills. */ -static gconstpointer -node_prefix(const struct patricia_node *pn) +static const void * +patricia_node_prefix(const struct patricia_node *pn) { const struct patricia_node *n; int i; - gconstpointer result = NULL; + const void *result = NULL; patricia_node_check(pn); @@ -500,7 +503,7 @@ /** * Number of bits for the node's prefix. */ -static inline G_GNUC_PURE size_t +static inline G_PURE size_t node_prefix_bits(const struct patricia_node *pn) { patricia_node_check(pn); @@ -511,7 +514,7 @@ /** * Whether node holds data. */ -static inline G_GNUC_PURE gboolean +static inline G_PURE bool node_has_data(const struct patricia_node *pn) { patricia_node_check(pn); @@ -522,7 +525,7 @@ /** * The key of the data held in the node. */ -static inline G_GNUC_PURE gconstpointer +static inline G_PURE const void * node_key(const struct patricia_node *pn) { patricia_node_check(pn); @@ -538,7 +541,7 @@ /** * The key size in bits of the data held in the node. */ -static inline G_GNUC_PURE size_t +static inline G_PURE size_t node_keybits(const struct patricia_node *pn) { patricia_node_check(pn); @@ -554,7 +557,7 @@ /** * The value of the data held in the node. */ -static inline G_GNUC_PURE gconstpointer +static inline G_PURE const void * node_value(const struct patricia_node *pn) { patricia_node_check(pn); @@ -570,10 +573,10 @@ /** * Is the current node test bit matched by the key? */ -static inline G_GNUC_PURE gboolean -node_matches(const struct patricia_node *pn, gconstpointer key, size_t keybits) +static inline G_PURE bool +node_matches(const struct patricia_node *pn, const void *key, size_t keybits) { - const guint8 *k = key; + const uint8 *k = key; patricia_node_check(pn); g_assert(key); @@ -591,8 +594,8 @@ * * @return TRUE if keys are identical. */ -static gboolean G_GNUC_PURE -key_eq(gconstpointer k1, gconstpointer k2, size_t keybits) +static bool G_PURE +key_eq(const void *k1, const void *k2, size_t keybits) { size_t bytes; /* Amount of bytes to compare */ size_t bits; /* Remaining bits in last byte */ @@ -609,10 +612,10 @@ if (bits != 0) { /* Compare trailing byte, but only meaningful bits */ - guint8 mask = ~((1 << (8 - bits)) - 1); - const guint8 *p1 = k1; - const guint8 *p2 = k2; - guint8 diff = (p1bytes & mask) ^ (p2bytes & mask); + uint8 mask = ~((1 << (8 - bits)) - 1); + const uint8 *p1 = k1; + const uint8 *p2 = k2; + uint8 diff = (p1bytes & mask) ^ (p2bytes & mask); return 0 == diff; } @@ -622,23 +625,23 @@ /** * Given a node and a key, determine how many leading bits in the key are - * matched by the node returned by match_best(). + * matched by the node returned by patricia_match_best(). * - * @param pn the PATRICIA node returned by match_best() + * @param pn the PATRICIA node returned by patricia_match_best() * @param key the key we looked up * @param keybits the size of the key in bits * @param pprefix where to write the prefix for the match, if not NULL */ static size_t -matched_bits( - const struct patricia_node *pn, gconstpointer key, size_t keybits, - gconstpointer *pprefix) +patricia_matched_bits( + const struct patricia_node *pn, const void *key, size_t keybits, + const void **pprefix) { - gconstpointer prefix; + const void *prefix; patricia_node_check(pn); - prefix = node_prefix(pn); + prefix = patricia_node_prefix(pn); if (pprefix) *pprefix = prefix; @@ -655,10 +658,10 @@ * * @return the node under which all entries share a common prefix (the amount * of matching leading bits within the key can be determined by calling - * matched_bits() on the resulting node). + * patricia_matched_bits() on the resulting node). */ -static G_GNUC_HOT struct patricia_node * -match_best(patricia_t *pt, gconstpointer key, size_t keybits) +static struct patricia_node * G_HOT +patricia_match_best(patricia_t *pt, const void *key, size_t keybits) { const struct patricia_node *pn; int i; @@ -685,11 +688,11 @@ */ if (keybits - 1 < pn->bit || pn->leaf) - return deconstify_gpointer(pn); + return deconstify_pointer(pn); child = node_matches(pn, key, keybits) ? child_one(pn) : child_zero(pn); if (child == NULL) - return deconstify_gpointer(pn); + return deconstify_pointer(pn); g_assert(child->leaf || child->bit > pn->bit); @@ -708,8 +711,8 @@ * * @return the node which is an exact match, or NULL if not found. */ -static G_GNUC_HOT const struct patricia_node * -match_exact(const patricia_t *pt, gconstpointer key, size_t keybits) +static const struct patricia_node * G_HOT +match_exact(const patricia_t *pt, const void *key, size_t keybits) { const struct patricia_node *pn; int i; @@ -812,7 +815,7 @@ * spanned by the given root. */ static const struct patricia_node * -find_deepest(const struct patricia_node *root, gboolean leftmost) +find_deepest(const struct patricia_node *root, bool leftmost) { const struct patricia_node *pn; int i; @@ -861,7 +864,7 @@ * @return the node which holds the best match, or NULL if not found. */ static const struct patricia_node * -lookup_best(const patricia_t *pt, gconstpointer key, size_t keybits) +lookup_best(const patricia_t *pt, const void *key, size_t keybits) { const struct patricia_node *stackPATRICIA_MAXBITS + 1; const struct patricia_node **sp = stack; @@ -966,7 +969,7 @@ */ static const struct patricia_node * find_closest(const patricia_t *pt, const struct patricia_node *root, - gconstpointer key, size_t keybits, gboolean closest) + const void *key, size_t keybits, bool closest) { const struct patricia_node *pn; int i; @@ -987,7 +990,7 @@ for (pn = root, i = 0; i <= PATRICIA_MAXBITS; i++) { const struct patricia_node *child; - gboolean matches; + bool matches; patricia_node_check(pn); @@ -1031,7 +1034,7 @@ */ static const struct patricia_node * match_closest( - const patricia_t *pt, gconstpointer key, size_t keybits, gboolean closest) + const patricia_t *pt, const void *key, size_t keybits, bool closest) { return find_closest(pt, pt->root, key, keybits, closest); } @@ -1041,7 +1044,7 @@ */ static void fill_leaf(struct patricia_node *pn, struct patricia_node *parent, - gconstpointer key, size_t keybits, gconstpointer value) + const void *key, size_t keybits, const void *value) { patricia_node_check(pn); @@ -1115,7 +1118,7 @@ } else { pt->root = child; } - + free_node(pt, pn); } @@ -1125,8 +1128,8 @@ static void unembed_data(patricia_t *pt, struct patricia_node *pn) { - gconstpointer old_key; - gconstpointer old_value; + const void *old_key; + const void *old_value; size_t old_keybits; struct patricia_node *parent; @@ -1174,9 +1177,9 @@ * @param value value to insert in the tree for this key. */ static void -insert_at( +patricia_insert_at( patricia_t *pt, struct patricia_node *pn, - gconstpointer key, size_t keybits, gconstpointer value) + const void *key, size_t keybits, const void *value) { patricia_check(pt); patricia_node_check(pn); @@ -1277,9 +1280,9 @@ * @param common amount of common bits between key and node's prefix */ static void -insert_below( +patricia_insert_below( patricia_t *pt, struct patricia_node *pn, - gconstpointer key, size_t keybits, gconstpointer value, size_t common) + const void *key, size_t keybits, const void *value, size_t common) { struct patricia_node *new = allocate_node(pt); @@ -1293,8 +1296,8 @@ if (pn->leaf) { size_t diffbit = common; - gconstpointer old_key = leaf_item_key(pn); - gconstpointer old_value = leaf_item_value(pn); + const void *old_key = leaf_item_key(pn); + const void *old_value = leaf_item_value(pn); size_t old_keybits = leaf_item_keybits(pn); struct patricia_node *old = NULL; @@ -1374,10 +1377,10 @@ * @param prefix the node's prefix at the original "pn" point */ static void -insert_above( +patricia_insert_above( patricia_t *pt, struct patricia_node *pn, - gconstpointer key, size_t keybits, gconstpointer value, size_t common, - gconstpointer prefix) + const void *key, size_t keybits, const void *value, size_t common, + const void *prefix) { struct patricia_node *new = allocate_node(pt); struct patricia_node *up; @@ -1454,9 +1457,9 @@ */ if (common == keybits) - insert_at(pt, new, key, keybits, value); + patricia_insert_at(pt, new, key, keybits, value); else - insert_below(pt, new, key, keybits, value, common); + patricia_insert_below(pt, new, key, keybits, value, common); } /** @@ -1472,7 +1475,7 @@ * @param value value to insert in the tree for this key. */ void -patricia_insert(patricia_t *pt, gconstpointer key, gconstpointer value) +patricia_insert(patricia_t *pt, const void *key, const void *value) { patricia_insert_k(pt, key, pt->maxbits, value); } @@ -1492,11 +1495,11 @@ */ void patricia_insert_k(patricia_t *pt, - gconstpointer key, size_t keybits, gconstpointer value) + const void *key, size_t keybits, const void *value) { struct patricia_node *pn; size_t common_bits; - gconstpointer prefix; + const void *prefix; patricia_check(pt); g_assert(key); @@ -1520,8 +1523,8 @@ * Find node in the tree which is the longest (partial) match for the key. */ - pn = match_best(pt, key, keybits); - common_bits = matched_bits(pn, key, keybits, &prefix); + pn = patricia_match_best(pt, key, keybits); + common_bits = patricia_matched_bits(pn, key, keybits, &prefix); /* * Insert at the right position, relative to the found node. @@ -1529,14 +1532,14 @@ if (common_bits == keybits && keybits >= node_prefix_bits(pn)) { /* All bits from key matched: found node where insertion can be done */ - insert_at(pt, pn, key, keybits, value); + patricia_insert_at(pt, pn, key, keybits, value); } else if (common_bits == node_prefix_bits(pn)) { /* The common bits are the node's prefix: insertion must occur below */ g_assert(common_bits < keybits); - insert_below(pt, pn, key, keybits, value, common_bits); + patricia_insert_below(pt, pn, key, keybits, value, common_bits); } else { g_assert(common_bits < node_prefix_bits(pn)); - insert_above(pt, pn, key, keybits, value, common_bits, prefix); + patricia_insert_above(pt, pn, key, keybits, value, common_bits, prefix); } } @@ -1545,9 +1548,11 @@ * * @param pt the PATRICIA tree * @param key pointer to the start of the key bits (configured length) + * + * @return whether key is held in the PATRICIA tree. */ -gboolean -patricia_contains(const patricia_t *pt, gconstpointer key) +bool +patricia_contains(const patricia_t *pt, const void *key) { return match_exact(pt, key, pt->maxbits) != NULL; } @@ -1558,9 +1563,11 @@ * @param pt the PATRICIA tree * @param key the key we're looking for * @param keybits size of key in bits + * + * @return whether key is held in the PATRICIA tree. */ -gboolean -patricia_contains_k(const patricia_t *pt, gconstpointer key, size_t keybits) +bool +patricia_contains_k(const patricia_t *pt, const void *key, size_t keybits) { return match_exact(pt, key, keybits) != NULL; } @@ -1578,8 +1585,8 @@ * * @return the value for the key, or NULL if not found. */ -gpointer -patricia_lookup(const patricia_t *pt, gconstpointer key) +void * +patricia_lookup(const patricia_t *pt, const void *key) { const struct patricia_node *pn = match_exact(pt, key, pt->maxbits); @@ -1588,7 +1595,7 @@ g_assert(node_has_data(pn)); - return deconstify_gpointer(node_value(pn)); + return deconstify_pointer(node_value(pn)); } /** @@ -1605,8 +1612,8 @@ * * @return the value for the key, or NULL if not found. */ -gpointer -patricia_lookup_k(const patricia_t *pt, gconstpointer key, size_t keybits) +void * +patricia_lookup_k(const patricia_t *pt, const void *key, size_t keybits) { const struct patricia_node *pn = match_exact(pt, key, keybits); @@ -1615,25 +1622,24 @@ g_assert(node_has_data(pn)); - return deconstify_gpointer(node_value(pn)); + return deconstify_pointer(node_value(pn)); } /** * Fetch key/value from the PATRICIA tree, returning whether the key * was found. If it was, the original key/value pointers are written - * back in keyptr and valueptr. + * back in keyptr and valptr. * * @param pt the PATRICIA tree * @param key pointer to the start of the key bits (configured length) * @param keyptr if non-NULL, where the original key pointer is written * @param valptr if non-NULL, where the original value pointer is written * - * @return whether the key was found and keyptr/valueptr written back. + * @return whether the key was found and keyptr/valptr written back. */ -gboolean +bool patricia_lookup_extended( - const patricia_t *pt, gconstpointer key, - gpointer *keyptr, gpointer *valptr) + const patricia_t *pt, const void *key, void **keyptr, void **valptr) { const struct patricia_node *pn = match_exact(pt, key, pt->maxbits); @@ -1643,9 +1649,9 @@ g_assert(node_has_data(pn)); if (keyptr) - *keyptr = deconstify_gpointer(node_key(pn)); + *keyptr = deconstify_pointer(node_key(pn)); if (valptr) - *valptr = deconstify_gpointer(node_value(pn)); + *valptr = deconstify_pointer(node_value(pn)); return TRUE; } @@ -1653,7 +1659,7 @@ /** * Fetch key/value from the PATRICIA tree, returning whether the key * was found. If it was, the original key/value pointers are written - * back in keyptr and valueptr. + * back in keyptr and valptr. * * @param pt the PATRICIA tree * @param key the key we're looking for @@ -1661,12 +1667,12 @@ * @param keyptr if non-NULL, where the original key pointer is written * @param valptr if non-NULL, where the original value pointer is written * - * @return whether the key was found and keyptr/valueptr written back. + * @return whether the key was found and keyptr/valptr written back. */ -gboolean +bool patricia_lookup_extended_k( - const patricia_t *pt, gconstpointer key, size_t keybits, - gpointer *keyptr, gpointer *valptr) + const patricia_t *pt, const void *key, size_t keybits, + void **keyptr, void **valptr) { const struct patricia_node *pn = match_exact(pt, key, keybits); @@ -1676,9 +1682,9 @@ g_assert(node_has_data(pn)); if (keyptr) - *keyptr = deconstify_gpointer(node_key(pn)); + *keyptr = deconstify_pointer(node_key(pn)); if (valptr) - *valptr = deconstify_gpointer(node_value(pn)); + *valptr = deconstify_pointer(node_value(pn)); return TRUE; } @@ -1704,12 +1710,12 @@ * @param lenptr if non-NULL, where the found key length in bit is written * @param valptr if non-NULL, where the associated value pointer is written * - * @return whether a key was found and keyptr/lenptr/valueptr written back. + * @return whether a key was found and keyptr/lenptr/valptr written back. */ -gboolean +bool patricia_lookup_best( - const patricia_t *pt, gconstpointer key, size_t keybits, - gpointer *keyptr, size_t *lenptr, gpointer *valptr) + const patricia_t *pt, const void *key, size_t keybits, + void **keyptr, size_t *lenptr, void **valptr) { const struct patricia_node *pn; @@ -1721,9 +1727,9 @@ g_assert(node_has_data(pn)); if (keyptr) - *keyptr = deconstify_gpointer(node_key(pn)); + *keyptr = deconstify_pointer(node_key(pn)); if (valptr) - *valptr = deconstify_gpointer(node_value(pn)); + *valptr = deconstify_pointer(node_value(pn)); if (lenptr) *lenptr = node_keybits(pn); @@ -1733,9 +1739,9 @@ /** * Common implementation for patricia_closest() and patricia_furthest(). */ -static gpointer +static void * lookup_closest( - const patricia_t *pt, gconstpointer key, size_t keybits, gboolean closest) + const patricia_t *pt, const void *key, size_t keybits, bool closest) { const struct patricia_node *pn = match_closest(pt, key, keybits, closest); @@ -1746,17 +1752,17 @@ g_assert(node_has_data(pn)); - return deconstify_gpointer(node_value(pn)); + return deconstify_pointer(node_value(pn)); } /** * Common implementation for patricia_closest_extended() and * patricia_furthest_extended(). */ -static gboolean +static bool lookup_closest_extended( - const patricia_t *pt, gconstpointer key, size_t keybits, - gpointer *keyptr, gpointer *valptr, gboolean closest) + const patricia_t *pt, const void *key, size_t keybits, + void **keyptr, void **valptr, bool closest) { const struct patricia_node *pn = match_closest(pt, key, keybits, closest); @@ -1769,9 +1775,9 @@ g_assert(node_keybits(pn) == pt->maxbits); if (keyptr) - *keyptr = deconstify_gpointer(node_key(pn)); + *keyptr = deconstify_pointer(node_key(pn)); if (valptr) - *valptr = deconstify_gpointer(node_value(pn)); + *valptr = deconstify_pointer(node_value(pn)); return TRUE; } @@ -1797,8 +1803,8 @@ * * @return the value for the key, or NULL if not found. */ -gpointer -patricia_closest(const patricia_t *pt, gconstpointer key) +void * +patricia_closest(const patricia_t *pt, const void *key) { return lookup_closest(pt, key, pt->maxbits, TRUE); } @@ -1819,12 +1825,12 @@ * @param keyptr if non-NULL, where the original key pointer is written * @param valptr if non-NULL, where the original value pointer is written * - * @return whether the key was found and keyptr/valueptr written back. + * @return whether the key was found and keyptr/valptr written back. */ -gboolean +bool patricia_closest_extended( - const patricia_t *pt, gconstpointer key, - gpointer *keyptr, gpointer *valptr) + const patricia_t *pt, const void *key, + void **keyptr, void **valptr) { return lookup_closest_extended(pt, key, pt->maxbits, keyptr, valptr, TRUE); } @@ -1850,8 +1856,8 @@ * * @return the value for the key, or NULL if not found. */ -gpointer -patricia_furthest(const patricia_t *pt, gconstpointer key) +void * +patricia_furthest(const patricia_t *pt, const void *key) { return lookup_closest(pt, key, pt->maxbits, FALSE); } @@ -1872,12 +1878,12 @@ * @param keyptr if non-NULL, where the original key pointer is written * @param valptr if non-NULL, where the original value pointer is written * - * @return whether the key was found and keyptr/valueptr written back. + * @return whether the key was found and keyptr/valptr written back. */ -gboolean +bool patricia_furthest_extended( - const patricia_t *pt, gconstpointer key, - gpointer *keyptr, gpointer *valptr) + const patricia_t *pt, const void *key, + void **keyptr, void **valptr) { return lookup_closest_extended(pt, key, pt->maxbits, keyptr, valptr, FALSE); } @@ -1923,8 +1929,8 @@ * * @return TRUE if the key was found and removed from the PATRICIA tree. */ -gboolean -patricia_remove(patricia_t *pt, gconstpointer key) +bool +patricia_remove(patricia_t *pt, const void *key) { return patricia_remove_k(pt, key, pt->maxbits); } @@ -1938,12 +1944,12 @@ * * @return TRUE if the key was found and removed from the PATRICIA tree. */ -gboolean -patricia_remove_k(patricia_t *pt, gconstpointer key, size_t keybits) +bool +patricia_remove_k(patricia_t *pt, const void *key, size_t keybits) { struct patricia_node *pn; - pn = deconstify_gpointer(match_exact(pt, key, keybits)); + pn = deconstify_pointer(match_exact(pt, key, keybits)); if (NULL == pn) return FALSE; @@ -1957,13 +1963,13 @@ * Common implementation for patricia_remove_closest() and * patricia_remove_furthest(). */ -static gboolean +static bool remove_closest( - patricia_t *pt, gconstpointer key, size_t keybits, gboolean closest) + patricia_t *pt, const void *key, size_t keybits, bool closest) { struct patricia_node *pn; - pn = deconstify_gpointer(match_closest(pt, key, keybits, closest)); + pn = deconstify_pointer(match_closest(pt, key, keybits, closest)); if (NULL == pn) return FALSE; @@ -1988,8 +1994,8 @@ * @return TRUE if the key was found and removed from the PATRICIA tree, * which is always the case unless the tree was empty. */ -gboolean -patricia_remove_closest(patricia_t *pt, gconstpointer key, size_t keybits) +bool +patricia_remove_closest(patricia_t *pt, const void *key, size_t keybits) { return remove_closest(pt, key, keybits, TRUE); } @@ -2009,16 +2015,16 @@ * @return TRUE if the key was found and removed from the PATRICIA tree, * which is always the case unless the tree was empty. */ -gboolean -patricia_remove_furthest(patricia_t *pt, gconstpointer key, size_t keybits) +bool +patricia_remove_furthest(patricia_t *pt, const void *key, size_t keybits) { return remove_closest(pt, key, keybits, FALSE); } /** - * Callback for nodes in traverse(). + * Callback for nodes in patricia_traverse(). */ -typedef void (*node_cb_t)(struct patricia_node *pn, gpointer un); +typedef void (*node_cb_t)(struct patricia_node *pn, void *un); /** * Iterate over all the key/value pairs, invoking the callback on each item. @@ -2028,12 +2034,11 @@ * @param un additional user argument for the ncb callback * @param cb the callback to invoke on each key/value pair if not NULL * @param u additional user argument for the cb callback - * + * */ static void -traverse(patricia_t *pt, - node_cb_t ncb, gpointer un, - patricia_cb_t cb, gpointer u) +patricia_traverse(patricia_t *pt, + node_cb_t ncb, void *un, patricia_cb_t cb, void *u) { patricia_check(pt); @@ -2059,12 +2064,12 @@ } if (cb && node_has_data(n)) - (*cb)(deconstify_gpointer(node_key(n)), node_keybits(n), - deconstify_gpointer(node_value(n)), u); + (*cb)(deconstify_pointer(node_key(n)), node_keybits(n), + deconstify_pointer(node_value(n)), u); /* Callback may free the node */ if (ncb) - (*ncb)(deconstify_gpointer(n), un); + (*ncb)(deconstify_pointer(n), un); if (z) { if (o) { @@ -2084,10 +2089,10 @@ } /** - * Node callback for traverse(). + * Node callback for patricia_traverse(). */ static void -traverse_remove_node(struct patricia_node *pn, gpointer u) +patricia_traverse_remove_node(struct patricia_node *pn, void *u) { patricia_t *pt = u; @@ -2105,7 +2110,7 @@ if (--pt->refcnt > 0) return; /* Still referenced by something internally */ - traverse(pt, traverse_remove_node, pt, NULL, NULL); + patricia_traverse(pt, patricia_traverse_remove_node, pt, NULL, NULL); g_assert(pt->nodes == 0); pt->magic = 0; @@ -2120,31 +2125,31 @@ * @param u additional opaque user data for the callback */ void -patricia_foreach(const patricia_t *pt, patricia_cb_t cb, gpointer u) +patricia_foreach(const patricia_t *pt, patricia_cb_t cb, void *u) { patricia_check(pt); g_assert(cb); - traverse(deconstify_gpointer(pt), NULL, NULL, cb, u); + patricia_traverse(deconstify_pointer(pt), NULL, NULL, cb, u); } /** * Context for patricia_foreach_remove(). */ struct remove_ctx { - GSList *sl; /* List of nodes to remove */ - gboolean last_was_removed; /* Last key/value traversed is removed */ + pslist_t *sl; /* List of nodes to remove */ + bool last_was_removed; /* Last key/value traversed is removed */ patricia_cbr_t cb; /* User callback to invoke */ - gpointer u; /* User data for callback */ + void *u; /* User data for callback */ size_t removed; /* Counts amount of items removed */ }; /** - * Node callback for traverse(). + * Node callback for patricia_traverse(). * Relies on the fact that it is invoked right after the user callback. */ static void -traverse_foreach_node(struct patricia_node *pn, gpointer u) +patricia_traverse_foreach_node(struct patricia_node *pn, void *u) { struct remove_ctx *ctx = u; @@ -2152,7 +2157,8 @@ /* * ctx->last_was_removed was set possibly by previous call to the - * user-supplied callback, through the traverse_foreach_item() trampoline. + * user-supplied callback, through the patricia_traverse_foreach_item() + * trampoline. */ if (ctx->last_was_removed) { @@ -2160,22 +2166,23 @@ * Prepend node to remove, so that we start removing nodes that are * the deepest in the tree. */ - ctx->sl = g_slist_prepend(ctx->sl, pn); + ctx->sl = pslist_prepend(ctx->sl, pn); ctx->last_was_removed = FALSE; } } /** - * Intercept user callback in traverse() during patricia_foreach_remove(). + * Intercept user callback in patricia_traverse() during + * patricia_foreach_remove(). */ static void -traverse_foreach_item(gpointer key, size_t keybits, gpointer value, gpointer u) +patricia_traverse_foreach_item(void *key, size_t keybits, void *value, void *u) { struct remove_ctx *ctx = u; /* * Warning: action at distance. - * Set ctx->last_was_removed for traverse_foreach_node(). + * Set ctx->last_was_removed for patricia_traverse_foreach_node(). */ if (ctx->cb(key, keybits, value, ctx->u)) { @@ -2195,10 +2202,10 @@ * @return the number of key/value pairs removed from the PATRICIA tree. */ size_t -patricia_foreach_remove(patricia_t *pt, patricia_cbr_t cb, gpointer u) +patricia_foreach_remove(patricia_t *pt, patricia_cbr_t cb, void *u) { struct remove_ctx ctx; - GSList *sl; + pslist_t *sl; patricia_check(pt); g_assert(cb); @@ -2209,18 +2216,18 @@ ctx.u = u; ctx.removed = 0; - traverse(pt, - traverse_foreach_node, &ctx, - traverse_foreach_item, &ctx); + patricia_traverse(pt, + patricia_traverse_foreach_node, &ctx, + patricia_traverse_foreach_item, &ctx); sl = ctx.sl; while (sl) { struct patricia_node *pn = sl->data; remove_node(pt, pn); - sl = g_slist_next(sl); + sl = pslist_next(sl); } - gm_slist_free_null(&ctx.sl); + pslist_free_null(&ctx.sl); return ctx.removed; } @@ -2246,11 +2253,11 @@ patricia_t *pt; /**< The PATRICIA tree */ const struct patricia_node *last; /**< Last visited node */ const struct patricia_node *next; /**< Cached next node to visit */ - gpointer key; /**< Target key, in metric iterators */ + void *key; /**< Target key, in metric iterators */ size_t keybits; /**< Size of key, in metric iterators */ - guint stamp; /**< Tree stamp at iterator creation */ - gboolean knows_next; /**< Whether we determined the next node */ - gboolean forward; /**< Whether iterator is moving forward */ + uint stamp; /**< Tree stamp at iterator creation */ + bool knows_next; /**< Whether we determined the next node */ + bool forward; /**< Whether iterator is moving forward */ }; static inline void @@ -2264,7 +2271,7 @@ * Common iterator field initialization. */ static patricia_iter_t * -common_iter_init(patricia_iter_t *iter, patricia_t *pt, gboolean forward) +patricia_common_iter_init(patricia_iter_t *iter, patricia_t *pt, bool forward) { iter->magic = PATRICIA_ITER_MAGIC; iter->pt = pt; @@ -2284,7 +2291,7 @@ * @param forward whether iteration should move forward or backwards */ patricia_iter_t * -patricia_tree_iterator(patricia_t *pt, gboolean forward) +patricia_tree_iterator(patricia_t *pt, bool forward) { struct patricia_iter *iter; @@ -2294,7 +2301,7 @@ iter->type = PATRICIA_ITER_TREE; iter->next = find_deepest(pt->root, forward); - return common_iter_init(iter, pt, forward); + return patricia_common_iter_init(iter, pt, forward); } /** @@ -2316,7 +2323,7 @@ * A copy of the key is made and is released in patricia_iterator_release(). */ patricia_iter_t * -patricia_metric_iterator(patricia_t *pt, gconstpointer key, gboolean forward) +patricia_metric_iterator(patricia_t *pt, const void *key, bool forward) { struct patricia_iter *iter; size_t keybytes = bits2bytes(pt->maxbits); @@ -2331,7 +2338,7 @@ memcpy(iter->key, key, keybytes); iter->keybits = pt->maxbits; - return common_iter_init(iter, pt, forward); + return patricia_common_iter_init(iter, pt, forward); } /** @@ -2341,7 +2348,7 @@ */ patricia_iter_t * patricia_metric_iterator_lazy( - patricia_t *pt, gconstpointer key, gboolean forward) + patricia_t *pt, const void *key, bool forward) { struct patricia_iter *iter; @@ -2351,10 +2358,10 @@ WALLOC(iter); iter->type = PATRICIA_ITER_XOR_LAZY; iter->next = find_closest(pt, pt->root, key, pt->maxbits, forward); - iter->key = deconstify_gpointer(key); + iter->key = deconstify_pointer(key); iter->keybits = pt->maxbits; - return common_iter_init(iter, pt, forward); + return patricia_common_iter_init(iter, pt, forward); } /** @@ -2362,7 +2369,7 @@ * backwards). */ static const struct patricia_node * -next_tree_node(const struct patricia_node *prev, gboolean forward) +patricia_next_tree_node(const struct patricia_node *prev, bool forward) { const struct patricia_node *pn; int i; @@ -2404,8 +2411,8 @@ * away from the original key, backwards meaning moving towards it). */ static const struct patricia_node * -next_metric_node(const patricia_t *pt, const struct patricia_node *prev, - gpointer key, size_t keybits, gboolean forward) +patricia_next_metric_node(const patricia_t *pt, + const struct patricia_node *prev, void *key, size_t keybits, bool forward) { const struct patricia_node *pn; int i; @@ -2420,7 +2427,7 @@ if (!parent) { return NULL; } else { - gboolean matches = node_matches(parent, key, keybits); + bool matches = node_matches(parent, key, keybits); const struct patricia_node *next = NULL; g_assert(!parent->has_embedded_data); @@ -2453,7 +2460,7 @@ * Compute next item for the iterator, given the previous one. */ static const struct patricia_node * -next_item(patricia_iter_t *iter, const struct patricia_node *prev) +patricia_next_item(patricia_iter_t *iter, const struct patricia_node *prev) { const struct patricia_node *next = NULL; @@ -2461,11 +2468,11 @@ switch (iter->type) { case PATRICIA_ITER_TREE: - next = next_tree_node(prev, iter->forward); + next = patricia_next_tree_node(prev, iter->forward); break; case PATRICIA_ITER_XOR: case PATRICIA_ITER_XOR_LAZY: - next = next_metric_node(iter->pt, prev, + next = patricia_next_metric_node(iter->pt, prev, iter->key, iter->keybits, iter->forward); break; } @@ -2482,7 +2489,7 @@ * done. It can be called several times with no further side effect, * until patricia_iter_next() is called to actually consume the next item. */ -gboolean +bool patricia_iter_has_next(patricia_iter_t *iter) { patricia_iter_check(iter); @@ -2490,7 +2497,7 @@ if (!iter->knows_next) { g_assert(iter->stamp == iter->pt->stamp); g_assert(iter->last != NULL); - iter->next = next_item(iter, iter->last); + iter->next = patricia_next_item(iter, iter->last); iter->knows_next = TRUE; } @@ -2507,10 +2514,10 @@ * value, instead of relying on patricia_iter_next() to return NULL to * signify the end of the iteration... */ -gpointer +void * patricia_iter_next_value(patricia_iter_t *iter) { - gboolean has_next; + bool has_next; patricia_iter_check(iter); @@ -2525,7 +2532,7 @@ iter->last = iter->next; iter->knows_next = FALSE; - return deconstify_gpointer(node_value(iter->last)); + return deconstify_pointer(node_value(iter->last)); } /** @@ -2535,11 +2542,11 @@ * @return TRUE if we advanced to the next item, FALSE if we reached the * end of the iteration. */ -gboolean +bool patricia_iter_next(patricia_iter_t *iter, - gpointer *key, size_t *keybits, gpointer *value) + void **key, size_t *keybits, void **value) { - gboolean has_next; + bool has_next; patricia_iter_check(iter); @@ -2552,9 +2559,9 @@ iter->last = iter->next; iter->knows_next = FALSE; - if (key) *key = deconstify_gpointer(node_key(iter->last)); + if (key) *key = deconstify_pointer(node_key(iter->last)); if (keybits) *keybits = node_keybits(iter->last); - if (value) *value = deconstify_gpointer(node_value(iter->last)); + if (value) *value = deconstify_pointer(node_value(iter->last)); return TRUE; } @@ -2595,10 +2602,10 @@ }; static void -count_items(gpointer key, size_t keybits, gpointer uv, gpointer u) +count_items(void *key, size_t keybits, void *uv, void *u) { struct counter *ctx = u; - guint8 *p = key; + uint8 *p = key; (void) uv; @@ -2610,10 +2617,10 @@ ctx->even_keys++; } -static gboolean -remove_odd_key(gpointer key, size_t keybits, gpointer uv, gpointer uu) +static bool +remove_odd_key(void *key, size_t keybits, void *uv, void *uu) { - guint8 *p = key; + uint8 *p = key; g_assert(keybits == 32); @@ -2622,15 +2629,18 @@ return (p3 & 0x1) ? TRUE : FALSE; } -static G_GNUC_COLD void -test_keys(guint32 keys, size_t nkeys) +static void G_COLD +test_keys(uint32 keys, size_t nkeys) { size_t i; - guint32 *data = g_malloc(nkeys * sizeof(guint32)); + uint32 *data; patricia_t *pt = patricia_create(32); - guint32 *p = data; + uint32 *p; size_t even; + XMALLOC_ARRAY(data, nkeys); + p = data; + /* count even keys... */ for (even = 0, i = 0; i < nkeys; i++) { @@ -2666,10 +2676,10 @@ /* lookup for closest entries to random keys, then remove them... */ for (i = 0; i < nkeys; i++) { - gpointer key; - gboolean found; + void *key; + bool found; char target4; - gboolean removed; + bool removed; random_bytes(target, sizeof target); found = patricia_closest_extended(pt, target, &key, NULL); @@ -2699,8 +2709,8 @@ /* lookup for closest entries that exist... */ for (i = 0; i < nkeys; i++) { - gpointer key; - gboolean found; + void *key; + bool found; found = patricia_closest_extended(pt, &datai, &key, NULL); g_assert(found); @@ -2725,11 +2735,11 @@ patricia_iter_t *iter; size_t count = 0; size_t even_keys = 0; - gpointer key; + void *key; iter = patricia_tree_iterator(pt, TRUE); while (patricia_iter_next(iter, &key, NULL, NULL)) { - guint8 *k = key; + uint8 *k = key; count++; if (!(k3 & 0x1)) even_keys++; @@ -2746,13 +2756,13 @@ patricia_iter_t *iter; size_t count = 0; size_t even_keys = 0; - gpointer key; - guint32 distance; - guint32 previous_distance = 0; - gboolean first = TRUE; + void *key; + uint32 distance; + uint32 previous_distance = 0; + bool first = TRUE; size_t idx = random_value(nkeys - 1); - gpointer furthest; - gboolean found; + void *furthest; + bool found; found = patricia_furthest_extended(pt, &dataidx, &furthest, NULL); @@ -2760,7 +2770,7 @@ iter = patricia_metric_iterator(pt, &dataidx, FALSE); while (patricia_iter_next(iter, &key, NULL, NULL)) { - guint8 *k = key; + uint8 *k = key; count++; if (!(k3 & 0x1)) even_keys++; @@ -2800,7 +2810,7 @@ for (i = 0; i < nkeys; i++) { if (patricia_contains(pt, &datai)) { - gboolean removed = patricia_remove(pt, &datai); + bool removed = patricia_remove(pt, &datai); g_assert(removed); g_assert(!patricia_contains(pt, &datai)); } @@ -2832,7 +2842,7 @@ /* removing keys of variable size... */ for (i = 0; i < nkeys; i++) { - gboolean removed; + bool removed; size_t bitsize = 1 + highest_bit_set(keysi); g_assert(patricia_contains_k(pt, &datai, bitsize)); @@ -2847,18 +2857,18 @@ g_assert(pt->nodes == 0); g_assert(pt->embedded == 0); - G_FREE_NULL(data); + XFREE_NULL(data); patricia_destroy(pt); } /** * Perform unit tests of PATRICIA trees. */ -G_GNUC_COLD void +void G_COLD patricia_test(void) { size_t i; - static guint32 keys = { + static uint32 keys = { 0x00800000U, 0x00800001U, 0x00810001U, @@ -2884,13 +2894,13 @@ }; patricia_t *pt = patricia_create(32); - test_keys(keys, G_N_ELEMENTS(keys)); + test_keys(keys, N_ITEMS(keys)); keys0 = 0x1U; /* Ensure 1 embedded data at least */ patricia_insert(pt, &keys0, NULL); - for (i = 1; i < G_N_ELEMENTS(keys); i++) { + for (i = 1; i < N_ITEMS(keys); i++) { int j; for (j = 0; j < 10; j++) { @@ -2905,7 +2915,7 @@ patricia_insert(pt, &keysi, NULL); } - test_keys(keys, G_N_ELEMENTS(keys)); + test_keys(keys, N_ITEMS(keys)); /* all tests passed */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/patricia.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/patricia.h
Changed
@@ -44,10 +44,8 @@ struct patricia_iter; typedef struct patricia_iter patricia_iter_t; -typedef void (*patricia_cb_t)( - gpointer key, size_t keybits, gpointer value, gpointer u); -typedef gboolean (*patricia_cbr_t)( - gpointer key, size_t keybits, gpointer value, gpointer u); +typedef void (*patricia_cb_t)(void *key, size_t keybits, void *value, void *u); +typedef bool (*patricia_cbr_t)(void *key, size_t keybits, void *value, void *u); /* * Public interface @@ -57,50 +55,48 @@ void patricia_destroy(patricia_t *pt); size_t patricia_count(const patricia_t *pt); size_t patricia_max_keybits(const patricia_t *pt); -void patricia_insert(patricia_t *pt, gconstpointer key, gconstpointer value); +void patricia_insert(patricia_t *pt, const void *key, const void *value); void patricia_insert_k( - patricia_t *pt, gconstpointer key, size_t keybits, gconstpointer value); -gboolean patricia_remove(patricia_t *pt, gconstpointer key); -gboolean patricia_remove_k(patricia_t *pt, gconstpointer key, size_t keybits); -gboolean patricia_remove_closest( - patricia_t *pt, gconstpointer key, size_t keybits); -gboolean patricia_remove_furthest( - patricia_t *pt, gconstpointer key, size_t keybits); -gboolean patricia_contains(const patricia_t *pt, gconstpointer key); -gboolean patricia_contains_k( - const patricia_t *pt, gconstpointer key, size_t keybits); -gpointer patricia_lookup(const patricia_t *pt, gconstpointer key); -gpointer patricia_lookup_k( - const patricia_t *pt, gconstpointer key, size_t keybits); -gboolean patricia_lookup_extended( - const patricia_t *pt, gconstpointer key, - gpointer *keyptr, gpointer *valptr); -gboolean patricia_lookup_extended_k( - const patricia_t *pt, gconstpointer key, size_t keybits, - gpointer *keyptr, gpointer *valptr); -void patricia_foreach(const patricia_t *pt, patricia_cb_t cb, gpointer u); -size_t patricia_foreach_remove(patricia_t *pt, patricia_cbr_t cb, gpointer u); -gboolean patricia_lookup_best( - const patricia_t *pt, gconstpointer key, size_t keybits, - gpointer *keyptr, size_t *lenptr, gpointer *valptr); -gpointer patricia_closest(const patricia_t *pt, gconstpointer key); -gboolean patricia_closest_extended( - const patricia_t *pt, gconstpointer key, - gpointer *keyptr, gpointer *valptr); -gpointer patricia_furthest(const patricia_t *pt, gconstpointer key); -gboolean patricia_furthest_extended( - const patricia_t *pt, gconstpointer key, - gpointer *keyptr, gpointer *valptr); + patricia_t *pt, const void *key, size_t keybits, const void *value); +bool patricia_remove(patricia_t *pt, const void *key); +bool patricia_remove_k(patricia_t *pt, const void *key, size_t keybits); +bool patricia_remove_closest( + patricia_t *pt, const void *key, size_t keybits); +bool patricia_remove_furthest( + patricia_t *pt, const void *key, size_t keybits); +bool patricia_contains(const patricia_t *pt, const void *key); +bool patricia_contains_k( + const patricia_t *pt, const void *key, size_t keybits); +void *patricia_lookup(const patricia_t *pt, const void *key); +void *patricia_lookup_k( + const patricia_t *pt, const void *key, size_t keybits); +bool patricia_lookup_extended( + const patricia_t *pt, const void *key, void **keyptr, void **valptr); +bool patricia_lookup_extended_k( + const patricia_t *pt, const void *key, size_t keybits, + void **keyptr, void **valptr); +void patricia_foreach(const patricia_t *pt, patricia_cb_t cb, void *u); +size_t patricia_foreach_remove(patricia_t *pt, patricia_cbr_t cb, void *u); +bool patricia_lookup_best( + const patricia_t *pt, const void *key, size_t keybits, + void **keyptr, size_t *lenptr, void **valptr); +void *patricia_closest(const patricia_t *pt, const void *key); +bool patricia_closest_extended( + const patricia_t *pt, const void *key, void **keyptr, void **valptr); +void *patricia_furthest(const patricia_t *pt, const void *key); +bool patricia_furthest_extended( + const patricia_t *pt, const void *key, + void **keyptr, void **valptr); -patricia_iter_t *patricia_tree_iterator(patricia_t *pt, gboolean forward); +patricia_iter_t *patricia_tree_iterator(patricia_t *pt, bool forward); patricia_iter_t *patricia_metric_iterator(patricia_t *pt, - gconstpointer key, gboolean forward); + const void *key, bool forward); patricia_iter_t *patricia_metric_iterator_lazy( - patricia_t *pt, gconstpointer key, gboolean forward); -gboolean patricia_iter_has_next(patricia_iter_t *iter); -gpointer patricia_iter_next_value(patricia_iter_t *iter); -gboolean patricia_iter_next(patricia_iter_t *iter, - gpointer *key, size_t *keybits, gpointer *value); + patricia_t *pt, const void *key, bool forward); +bool patricia_iter_has_next(patricia_iter_t *iter); +void *patricia_iter_next_value(patricia_iter_t *iter); +bool patricia_iter_next(patricia_iter_t *iter, + void **key, size_t *keybits, void **value); void patricia_iterator_release(patricia_iter_t **iter_ptr); void patricia_test(void);
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/pattern.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/pattern.c
Changed
@@ -33,12 +33,33 @@ #include "common.h" -#include "misc.h" #include "pattern.h" -#include "halloc.h" +#include "ascii.h" +#include "misc.h" #include "walloc.h" +#include "xmalloc.h" + #include "override.h" /* Must be the last header included */ +#define ALPHA_SIZE 256 /**< Alphabet size */ + +enum cpattern_magic { CPATTERN_MAGIC = 0x3e074c43 }; + +struct cpattern { /**< Compiled pattern */ + enum cpattern_magic magic; /**< Magic number */ + bool duped; /**< Was `pattern' strdup()'ed? */ + const char *pattern; /**< The pattern */ + size_t len; /**< Pattern length */ + size_t deltaALPHA_SIZE; /**< Shifting deltas */ +}; + +static inline void +pattern_check(const cpattern_t * const p) +{ + g_assert(p != NULL); + g_assert(CPATTERN_MAGIC == p->magic); +} + /** * Initialize pattern data structures. */ @@ -57,6 +78,17 @@ /* Nothing to do */ } +/** + * @return length of pattern text. + */ +size_t +pattern_len(const cpattern_t *p) +{ + pattern_check(p); + + return p->len; +} + /* * Pattern matching (substrings, not regular expressions) * @@ -67,24 +99,21 @@ */ /** - * Compile given string pattern by computing the delta shift table. - * The pattern string given is duplicated. + * Build the shifting deltas table for the pattern. * - * @return a compiled pattern structure. + * @param p the pattern to fill + * + * @return its argument */ -cpattern_t * -pattern_compile(const char *pattern) +static cpattern_t * +pattern_build_delta(cpattern_t *p) { - cpattern_t *p; size_t plen, i, *pd; - const guchar *c; + const uchar *c; - WALLOC(p); - p->pattern = h_strdup(pattern); - p->len = plen = strlen(p->pattern); - p->duped = TRUE; + pattern_check(p); - plen++; /* Avoid increasing within the loop */ + plen = p->len + 1; /* Avoid increasing within the loop */ pd = p->delta; for (i = 0; i < ALPHA_SIZE; i++) @@ -92,7 +121,8 @@ plen--; /* Restore original pattern length */ - c = cast_to_gconstpointer(pattern); + c = cast_to_constpointer(p->pattern); + for (pd = p->delta, i = 0; i < plen; c++, i++) pd*c = plen - i; @@ -100,50 +130,60 @@ } /** + * Compile given string pattern by computing the delta shift table. + * The pattern string given is duplicated. + * + * @return a compiled pattern structure. + */ +cpattern_t * +pattern_compile(const char *pattern) +{ + cpattern_t *p; + + WALLOC(p); + p->magic = CPATTERN_MAGIC; + p->pattern = xstrdup(pattern); + p->len = strlen(p->pattern); + p->duped = TRUE; + + return pattern_build_delta(p); +} + +/** * Same as pattern_compile(), but the pattern string is NOT duplicated, * and its length is known upon entry. * * @attention * NB: There is no pattern_free_fast(), just call pattern_free() on the result. */ -G_GNUC_HOT cpattern_t * +cpattern_t * G_HOT pattern_compile_fast(const char *pattern, size_t plen) { cpattern_t *p; - size_t i, *pd; - const guchar *c; WALLOC(p); + p->magic = CPATTERN_MAGIC; p->pattern = pattern; p->len = plen; p->duped = FALSE; - plen++; /* Avoid increasing within the memset() inlined macro */ - pd = p->delta; - - for (i = 0; i < ALPHA_SIZE; i++) - *pd++ = plen; - - plen--; /* Restore original pattern length */ - - c = cast_to_gconstpointer(pattern); - for (pd = p->delta, i = 0; i < plen; c++, i++) - pd*c = plen - i; - - return p; + return pattern_build_delta(p); } /** * Dispose of compiled pattern. */ void -pattern_free(cpattern_t *cpat) +pattern_free(cpattern_t *p) { - if (cpat->duped) { - hfree(deconstify_gchar(cpat->pattern)); - cpat->pattern = NULL; /* Don't use HFREE_NULL b/c of lvalue cast */ + pattern_check(p); + + if (p->duped) { + xfree(deconstify_gchar(p->pattern)); + p->pattern = NULL; /* Don't use XFREE_NULL b/c of lvalue cast */ } - WFREE(cpat); + p->magic = 0; + WFREE(p); } /** @@ -152,10 +192,10 @@ void pattern_free_null(cpattern_t **cpat_ptr) { - cpattern_t *cpat = *cpat_ptr; + cpattern_t *p = *cpat_ptr; - if (cpat != NULL) { - pattern_free(cpat); + if (p != NULL) { + pattern_free(p); *cpat_ptr = NULL; } } @@ -167,7 +207,7 @@ * * @return pointer to beginning of matching substring, NULL if not found. */ -G_GNUC_HOT const char * +const char * G_HOT pattern_qsearch( const cpattern_t *cpat, /**< Compiled pattern */ const char *text, /**< Text we're scanning */ @@ -183,6 +223,8 @@ size_t i; /* Position within pattern string */ size_t plen; + pattern_check(cpat); + if (!tlen) tlen = strlen(text); start = text + toffset; @@ -197,7 +239,7 @@ break; /* Mismatch, stop looking here */ if (i == plen) { /* OK, we got a pattern match */ - gboolean at_begin = FALSE; + bool at_begin = FALSE; if (word == qs_any) return tp; /* Start of substring */ @@ -213,7 +255,7 @@ if (tp == text) { /* At beginning of text */ if (word == qs_begin) return tp; else at_begin = TRUE; - } else if (0x20 == *(tp-1)) { /* At word boundary */ + } else if (is_ascii_space(*(tp-1))) { /* At word boundary */ if (word == qs_begin) return tp; else at_begin = TRUE; } @@ -221,14 +263,14 @@ if (at_begin && word == qs_whole) { if (&tpplen == end) /* At end of string */ return tp; - else if (0x20 == tpplen) + else if (is_ascii_space(tpplen)) return tp; /* At word boundary after */ } /* Fall through */ } - tp += cpat->delta(guchar) tpplen; /* Continue search there */ + tp += cpat->delta(uchar) tpplen; /* Continue search there */ } return NULL; /* Not found */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/pattern.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/pattern.h
Changed
@@ -36,14 +36,7 @@ #include "common.h" -#define ALPHA_SIZE 256 /**< Alphabet size */ - -typedef struct { /**< Compiled pattern */ - const char *pattern; /**< The pattern */ - size_t len; /**< Pattern length */ - size_t deltaALPHA_SIZE; /**< Shifting deltas */ - gboolean duped; /**< Was `pattern' strdup()'ed? */ -} cpattern_t; +typedef struct cpattern cpattern_t; typedef enum { qs_any = 0, /**< Match anywhere */ @@ -60,6 +53,7 @@ void pattern_free_null(cpattern_t **cpat_ptr); const char *pattern_qsearch(const cpattern_t *cpat, const char *text, size_t tlen, size_t toffset, qsearch_mode_t word); +size_t pattern_len(const cpattern_t *p); #endif /* _pattern_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/plist.c
Added
@@ -0,0 +1,1125 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Plain two-way list. + * + * This is a very low-level list, with no bookkeeping of meta information: + * the list is known by a pointer to the head cell, and all operations that + * can change the head of the list return a new head. + * + * An empty list is represented by a NULL pointer. + * + * List cells are allocated through walloc(). + * + * The API of plain lists mirrors that of glib's lists to make a smooth + * transition possible and maintain some consistency in the code. That + * said, the glib list API is quite good so mirroring it is not a problem. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#include "plist.h" + +#include "elist.h" +#include "log.h" +#include "pslist.h" +#include "random.h" +#include "walloc.h" + +#include "override.h" /* Must be the last header included */ + +/* + * Parts of the code below have been "copied" from Glib's implementation. + * Sometimes copying merely involved translation and adaptation to the local + * coding style, sometimes it involved more, with additional assertions. + * + * That original code was released under the LGPL, and was: + * + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * Modified by the GLib Team and others 1997-2000. + * + * Additional routines and initial adaptation are: + * + * Copyright (c) 2013 Raphael Manfredi + */ + +/** + * Allocate a list cell for storing one element. + * + * @return pointer to newly allocated element, pointing to NULL data. + */ +plist_t * +plist_alloc(void) +{ + plist_t *pl; + + WALLOC0(pl); + return pl; +} + +/** + * Free the cell element only, which must not be part of any list. + * + * @attention + * The held item is not freed. + * + * @param l the cell to be freed (can be NULL) + */ +void +plist_free_1(plist_t *l) +{ + g_assert(NULL == l || (NULL == l->next && NULL == l->prev)); + + if (l != NULL) + WFREE(l); +} + +/** + * Free the cell element and nullify its pointer. + */ +void +plist_free_1_null(plist_t **l_ptr) +{ + plist_t *l = *l_ptr; + + if (l != NULL) { + plist_free_1(l); + *l_ptr = NULL; + } +} + +/** + * Free all the cell elements in the list, but do not touch the held data. + * + * To be able to free the items in the list, use plist_free_full(). + * + * @param pl the head of the list + * + * @return NULL as a convenience. + */ +plist_t * +plist_free(plist_t *pl) +{ + if G_UNLIKELY(NULL == pl) + return NULL; + + /* + * To be extremely fast, use a specialized freeing routine that will + * limit the amount of overhead to process all the entries in the list. + * + * Note that we pass a pslist_t because the data field will not be + * used and only the next field will be followed, which is at the same + * place in a pslist_t. + */ + + STATIC_ASSERT(offsetof(pslist_t, next) == offsetof(plist_t, next)); + + wfree_pslist((pslist_t *) pl, sizeof *pl); + return NULL; +} + +/** + * Free plist and nullify pointer holding it. + */ +void +plist_free_null(plist_t **pl_ptr) +{ + plist_t *pl = *pl_ptr; + + if (pl != NULL) { + plist_free(pl); + *pl_ptr = NULL; + } +} + +/** + * Free all the cell elements in the list, applying the free callback on + * each item. + * + * @param pl the head of the list + * @param fn routine to call on each item of the list + * + * @return NULL as a convenience. + */ +plist_t * +plist_free_full(plist_t *pl, free_fn_t fn) +{ + plist_t *l; + + for (l = pl; l != NULL; l = l->next) { + (*fn)(l->data); + } + + plist_free(pl); + return NULL; +} + +/** + * Free plist, applying free callback each item, and then nullify pointer + * holding it. + */ +void +plist_free_full_null(plist_t **pl_ptr, free_fn_t fn) +{ + plist_t *pl = *pl_ptr; + + if (pl != NULL) { + plist_free_full(pl, fn); + *pl_ptr = NULL; + } +} + +/** + * @return the last cell of the list. + */ +plist_t * +plist_last(const plist_t *pl) +{ + if G_LIKELY(pl != NULL) { + plist_t *l = deconstify_pointer(pl); + + while (l->next != NULL) + l = l->next; + + return l; + } else { + return NULL; + } +} + +/** + * @return the first cell of the list. + */ +plist_t * +plist_first(const plist_t *pl) +{ + if G_LIKELY(pl != NULL) { + plist_t *l = deconstify_pointer(pl); + + while (l->prev != NULL) + l = l->prev; + + return l; + } else { + return NULL; + } +} + +/** + * Append new item at the end of the list. + * + * @attention + * This is inefficient and requires a full traversal of the list. + * + * @param pl the head of the list + * @param data the data item to append + * + * @return the new head of the list. + */ +plist_t * +plist_append(plist_t *pl, void *data) +{ + plist_t *nl; + + WALLOC(nl); + nl->next = NULL; + nl->data = data; + + if (pl != NULL) { + plist_t *last = plist_last(pl); + last->next = nl; + nl->prev = last; + return pl; + } else { + nl->prev = NULL; + return nl; + } +} + +/** + * Prepend new item at the head of the list. + * + * @param pl the head of the list + * @param data the data item to prepend + * + * @return the new head of the list. + */ +plist_t * +plist_prepend(plist_t *pl, void *data) +{ + plist_t *nl; + + WALLOC(nl); + nl->next = pl; + nl->data = data; + + if (pl != NULL) { + /* + * @note + * This is translated code from GLib's original sources, which + * allows ``pl'' to not be the real head of the list but any item + * in the list, hence we're really doing a plist_insert_before() here! + * Keeping code as it is, to allow easy transition from GList in the + * existing code, just in case. + * --RAM, 2013-12-14 + */ + nl->prev = pl->prev; + if G_UNLIKELY(pl->prev != NULL) + pl->prev->next = nl; + pl->prev = nl; + } else { + nl->prev = NULL; + } + + return nl; +} + +/** + * Insert a new cell with data before specified cell (which must belong + * to the list, or be NULL to indicate that data should be inserted at the + * end of the list). + * + * @param pl the head of the list + * @param sibling the cell before which we need to insert a new cell + * @param data the data item to prepend + * + * @return the new head of the list. + */ +plist_t * +plist_insert_before(plist_t *pl, plist_t *sibling, void *data) +{ + g_assert(NULL != pl || NULL == sibling); + + if G_UNLIKELY(NULL == pl) { + return plist_prepend(NULL, data); + } else if G_UNLIKELY(NULL == sibling) { + return plist_append(pl, data); + } else { + /* + * Since ``sibling'' must be part of the list, we do not have to + * traverse the structure, contrary to GLib's code which does the + * traversal to validate that the sibling is indeed part of the list. + */ + + if (NULL == sibling->prev) { + /* Sibling was head, hence we prepend */ + return plist_prepend(pl, data); + } else { + plist_t *l; + + /* Insert new cell before ``sibling'', which was not the head */ + WALLOC(l); + l->data = data; + l->next = sibling; + l->prev = sibling->prev; + sibling->prev->next = l; + sibling->prev = l; + + return pl; + } + } +} + +/** + * Insert a new cell with data after specified cell (which must belong + * to the list, or be NULL to indicate that data should be inserted at the + * head of the list). + * + * @param pl the head of the list + * @param sibling the cell after which we need to insert a new cell + * @param data the data item to append + * + * @return the new head of the list. + */ +plist_t * +plist_insert_after(plist_t *pl, plist_t *sibling, void *data) +{ + plist_t *nl; + + g_assert(NULL != pl || NULL == sibling); + + if G_UNLIKELY(NULL == sibling) + return plist_prepend(pl, data); + + WALLOC(nl); + nl->data = data; + nl->next = sibling->next; + nl->prev = sibling; + if (sibling->next != NULL) + sibling->next->prev = nl; + sibling->next = nl; + + return pl; +} + +/** + * Adds the second list at the end of the first. + * + * The second list becomes part of the first list, physically, i.e. the cells + * are not copied. + * + * @param l1 the first list, the one we append to + * @param l2 the second list to concatenate at the tail of the first + * + * @return the new head of the list. + */ +plist_t * +plist_concat(plist_t *l1, plist_t *l2) +{ + if (l2 != NULL) { + plist_t *last = plist_last(l1); + if (last != NULL) + last->next = l2; + else + l1 = l2; + l2->prev = last; + } + + return l1; +} + +/** + * Remove specified cell from the list, without freeing it. + * + * @param pl the head of the list + * @param cell the cell we wish to remove + * + * @return the new head of the list. + */ +static plist_t * +plist_remove_link_internal(plist_t *pl, plist_t *cell) +{ + if G_UNLIKELY(NULL == cell) + return pl; + + if (cell->prev != NULL) { + g_assert(cell->prev->next == cell); + cell->prev->next = cell->next; + } + if (cell->next != NULL) { + g_assert(cell->next->prev == cell); + cell->next->prev = cell->prev; + } + + if (cell == pl) + pl = pl->next; + + cell->next = cell->prev = NULL; + + return pl; +} + +/** + * Remove the first cell we find that contains the specified data, if any. + * + * @param pl the head of the list + * @param data the data item we wish to remove + * + * @return the new head of the list. + */ +plist_t * +plist_remove(plist_t *pl, const void *data) +{ + plist_t *l; + + for (l = pl; l != NULL; l = l->next) { + if G_UNLIKELY(l->data == data) { + pl = plist_remove_link_internal(pl, l); + WFREE(l); + break; + } + } + + return pl; +} + +/** + * Remove all the cells that contain the specified data, if any. + * + * @param pl the head of the list + * @param data the data item we wish to remove + * + * @return the new head of the list. + */ +plist_t * +plist_remove_all(plist_t *pl, const void *data) +{ + plist_t *l, *next; + + for (l = pl; l != NULL; l = next) { + next = l->next; + if G_UNLIKELY(l->data == data) { + pl = plist_remove_link_internal(pl, l); + WFREE(l); + } + } + + return pl; +} + +/** + * Remove specified cell from the list without freeing it. + * + * @param pl the head of the list + * @param cell the cell we wish to remove + * + * @return the new head of the list. + */ +plist_t * +plist_remove_link(plist_t *pl, plist_t *cell) +{ + return plist_remove_link_internal(pl, cell); +} + +/** + * Remove specified cell from the list, then free it. + * + * @note + * The data held in the cell is not freed. + * + * @param pl the head of the list + * @param cell the cell we wish to remove + * + * @return new head of the list + */ +plist_t * +plist_delete_link(plist_t *pl, plist_t *cell) +{ + plist_t *np; + + np = plist_remove_link_internal(pl, cell); + WFREE(cell); + + return np; +} + +/** + * Perform a deep copy of the list (cells + data). + * + * Each item is copied using the supplied copying callback, which can be + * passed an extra contextual argument. If the callback is NULL, no data + * copying happens, hence we fall back to shallow copying. + * + * @param pl the head of the list + * @param fn the data copying callback (can be NULL) + * @param udata opaque user-data passed to the copying callback + * + * @return the head of the new list. + */ +plist_t * +plist_copy_deep(plist_t *pl, copy_data_fn_t fn, void *udata) +{ + plist_t *nl = NULL; + + if (pl != NULL) { + plist_t *l, *last; + + WALLOC(nl); + if (fn != NULL) { + nl->data = (*fn)(pl->data, udata); + } else { + nl->data = pl->data; + } + nl->prev = NULL; + last = nl; + l = pl->next; + while (l != NULL) { + WALLOC(last->next); + last->next->prev = last; + last = last->next; + if (fn != NULL) { + last->data = (*fn)(l->data, udata); + } else { + last->data = l->data; + } + l = l->next; + } + last->next = NULL; + } + + return nl; +} + +/** + * Perform a shallow copy of the list (only the cells). + * + * @param pl the head of the list + * + * @return the head of the new list. + */ +plist_t * +plist_copy(plist_t *pl) +{ + return plist_copy_deep(pl, NULL, NULL); +} + +/** + * Reverse list. + * + * @param pl the head of the list + * + * @return the head of the new list. + */ +plist_t * +plist_reverse(plist_t *pl) +{ + plist_t *l = pl, *last = NULL; + + while (l != NULL) { + last = l; + l = last->next; + last->next = last->prev; + last->prev = l; + } + + return last; +} + +/** + * Get the n-th cell in the list. + * + * @param pl the head of the list + * @param n the n-th item to retrieve (0-based) + * + * @return the n-th cell, NULL if the position is off the end of the list. + */ +plist_t * +plist_nth(plist_t *pl, size_t n) +{ + while (n-- != 0 && pl != NULL) + pl = pl->next; + + return pl; +} + +/** + * Get the n-th item in the list. + * + * @param pl the head of the list + * @param n the n-th item to retrieve (0-based) + * + * @return the n-th item, NULL if the position is off the end of the list. + */ +void * +plist_nth_data(plist_t *pl, size_t n) +{ + while (n-- != 0 && pl != NULL) + pl = pl->next; + + return NULL == pl ? NULL : pl->data; +} + +/** + * Find the cell in the list containing the specified item. + * + * @param pl the head of the list + * + * @return the first matching cell in the list, NULL if not found. + */ +plist_t * +plist_find(plist_t *pl, const void *data) +{ + plist_t *l; + + for (l = pl; l != NULL; l = l->next) { + if (l->data == data) + break; + } + + return l; +} + +/** + * Find cell in the list using a specified comparison function to identify + * the matching element. + * + * @param pl the head of the list + * @param object the object to which we need to compare list data + * @param cmp comparison routine with object, returns 0 when equals. + * + * @return the first matching cell in the list, NULL if not found. + */ +plist_t * +plist_find_custom(plist_t *pl, const void *object, cmp_fn_t cmp) +{ + plist_t *l; + + if G_UNLIKELY(NULL == pl) + return NULL; + + for (l = pl; l != NULL; l = l->next) { + if (0 == (*cmp)(l->data, object)) + return l; + } + + return NULL; +} + +/** + * Gets the position of the given cell in the list (0-based indexing). + * + * @param pl the head of the list + * @param cell the cell we're looking for + * + * @return the position of the cell in the list, -1 if not found. + */ +long +plist_position(const plist_t *pl, const plist_t *cell) +{ + plist_t *l; + long i; + + for (i = 0, l = deconstify_pointer(pl); l != NULL; i++, l = l->next) { + if (l == cell) + return i; + } + + return -1L; +} + +/** + * Gets the position of the first cell containing the given data (0-based). + * + * @param pl the head of the list + * @param data the data we're looking for + * + * @return the position of the first cell containing the data in the list, + * -1 if not found. + */ +long +plist_index(const plist_t *pl, const void *data) +{ + plist_t *l; + long i; + + for (i = 0, l = deconstify_pointer(pl); l != NULL; i++, l = l->next) { + if (l->data == data) + return i; + } + + return -1L; +} + +/** + * Compute the length of the list. + * + * @attention + * This requires a complete traversal of the list. + * + * @param pl the head of the list + * + * @return the amount of items in the list. + */ +size_t +plist_length(const plist_t *pl) +{ + plist_t *l = deconstify_pointer(pl); + size_t n = 0; + + while (l != NULL) { + n++; + l = l->next; + } + + return n; +} + +/** + * Iterate over the list, invoking the callback for every item. + * + * @param pl the head of the list + * @param cb routine to invoke on all items + * @param data opaque user-data to pass to callback + */ +void +plist_foreach(const plist_t *pl, data_fn_t cb, void *data) +{ + plist_t *l; + + for (l = deconstify_pointer(pl); l != NULL; l = l->next) { + (*cb)(l->data, data); + } +} + +/** + * Iterate over the list, invoking the callback for every item and removing + * the entry if the callback returns TRUE. + * + * @param pl the head of the list + * @param cbr routine to invoke on item to see whether we remove it + * @param data opaque user-data to pass to callback + * + * @return the new list head. + */ +plist_t * +plist_foreach_remove(plist_t *pl, data_rm_fn_t cbr, void *data) +{ + plist_t *l, *next, *prev; + + for (l = pl, prev = NULL; l != NULL; l = next) { + next = l->next; + if ((*cbr)(l->data, data)) { + if G_UNLIKELY(l == pl) { + pl = next; + if (next != NULL) + next->prev = NULL; + } else if (prev != NULL) { + prev->next = next; + if (next != NULL) + next->prev = prev; + } + WFREE(l); + } else { + prev = l; + } + } + + return pl; +} + +/** + * Inserts element into the list, using the given comparison function to + * determine the proper position. + * + * @param pl the head of the list + * @param data data to insert + * @param cmp data comparison routine, with extra udata argument + * @param udata trailing comparison argument (user-supplied context) + * + * @return the new list head. + */ +static plist_t * +plist_insert_sorted_internal(plist_t *pl, void *data, + cmp_data_fn_t cmp, void *udata) +{ + plist_t *tl = pl, *nl; + int c; + + g_assert(cmp != NULL); + + if G_UNLIKELY(NULL == pl) { + WALLOC0(nl); + nl->data = data; + return nl; + } + + c = (*cmp)(data, tl->data, udata); + + while (tl->next != NULL && c > 0) { + tl = tl->next; + c = (*cmp)(data, tl->data, udata); + } + + WALLOC0(nl); + nl->data = data; + + if (tl->next != NULL && c > 0) { + tl->next = nl; + nl->prev = tl; + return pl; + } + + if (tl->prev != NULL) { + tl->prev->next = nl; + nl->prev = tl->prev; + } + nl->next = tl; + tl->prev = nl; + + return tl == pl ? nl : pl; +} + +/** + * Inserts element into the list, using the given comparison function to + * determine the proper position. + * + * @param pl the head of the list + * @param data data to insert + * @param cmp data comparison routine + * + * @return the new list head. + */ +plist_t * +plist_insert_sorted(plist_t *pl, void *data, cmp_fn_t cmp) +{ + return plist_insert_sorted_internal(pl, data, (cmp_data_fn_t) cmp, NULL); +} + +/** + * Inserts element into the list, using the given comparison function to + * determine the proper position. + * + * @param pl the head of the list + * @param data data to insert + * @param cmp data comparison routine, with extra udata argument + * @param udata trailing comparison argument (user-supplied context) + * + * @return the new list head. + */ +plist_t * +plist_insert_sorted_with_dta(plist_t *pl, void *data, + cmp_data_fn_t cmp, void *udata) +{ + return plist_insert_sorted_internal(pl, data, cmp, udata); +} + +/** + * Merge two sorted lists. + * + * @param l1 first sorted list + * @param l2 second sorted list + * @param cmp data comparison function + * @param udata extra parameter passed to comparison function + * + * @return the head of the merged list. + */ +static plist_t * +plist_sort_merge(plist_t *l1, plist_t *l2, cmp_data_fn_t cmp, void *udata) +{ + plist_t list, *l = &list, *lprev = NULL; + + while (l1 != NULL && l2 != NULL) { + int c = (*cmp)(l1->data, l2->data, udata); + + if (c <= 0) { + l = l->next = l1; + l1 = l1->next; + } else { + l = l->next = l2; + l2 = l2->next; + } + l->prev = lprev; + lprev = l; + } + + l->next = (NULL == l1) ? l2 : l1; + l->next->prev = l; + + return list.next; +} + +/** + * Sort list using supplied comparison function. + * + * @param pl the head of the list + * @param cmp data comparison function + * @param udata extra parameter passed to comparison function + * + * @return the head of the sorted list. + */ +static plist_t * +plist_sort_internal(plist_t *pl, cmp_data_fn_t cmp, void *udata) +{ + plist_t *l1, *l2; + + if G_UNLIKELY(NULL == pl) + return NULL; /* Empty list */ + + if G_UNLIKELY(NULL == pl->next) + return pl; /* Single-item list */ + + /* + * Split list in half, roughly, by advancing the pointer in l2 twice as + * fast as the one in l1. + */ + + l1 = pl; + l2 = pl->next; + + while (NULL != (l2 = l2->next)) { + if (NULL == (l2 = l2->next)) + break; + l1 = l1->next; + } + + l2 = l1->next; + l1->next = NULL; + + return plist_sort_merge( + plist_sort_internal(pl, cmp, udata), + plist_sort_internal(l2, cmp, udata), + cmp, udata + ); +} + +/** + * Sort list according to the comparison function, which takes two items + * plus an additional opaque argument, meant to be used as context to sort + * the two items. + * + * @param pl the head of the list + * @param cmp item comparison function + * @param udata extra parameter passed to comparison function + * + * @return the head of the sorted list. + */ +plist_t * +plist_sort_with_data(plist_t *pl, cmp_data_fn_t cmp, void *data) +{ + return plist_sort_internal(pl, cmp, data); +} + +/** + * Sort list according to the comparison function, which compares items. + * + * @param pl the head of the list + * @param cmp item comparison function + * + * @return the head of the sorted list. + */ +plist_t * +plist_sort(plist_t *pl, cmp_fn_t cmp) +{ + return plist_sort_internal(pl, (cmp_data_fn_t) cmp, NULL); +} + +/** + * Randomly shuffle the items in the list using supplied random function. + * + * @param rf the random function to use (NULL means: use defaults) + * @param pl the head of the list + * + * @return the head of the shuffled list. + */ +plist_t * +plist_shuffle_with(random_fn_t rf, plist_t *pl) +{ + elist_t list; + + /* + * These assertions ensure that we can treat the chain of a plist + * as if the cells were part of an elist, so that elist_shuffle() + * can perform invisibly. + */ + + STATIC_ASSERT(offsetof(link_t, next) == offsetof(plist_t, next)); + STATIC_ASSERT(offsetof(link_t, prev) == offsetof(plist_t, prev)); + + if G_UNLIKELY(NULL == pl) + return NULL; /* Empty list */ + + if G_UNLIKELY(NULL == pl->next) + return pl; /* Single-item list */ + + /* + * This code relies on the fact that the plain list can be viewed as + * a valid embedded list of cells, whose link is at the beginning of + * the structure. + * + * There is no need to set the list.tail field as this is not used by + * elist_shuffle(). + */ + + elist_init(&list, offsetof(plist_t, next)); + list.head = (link_t *) pl; + list.count = plist_length(pl); /* Have to count, unfortunately */ + elist_shuffle_with(rf, &list); /* Shuffle the cells */ + + return (plist_t *) list.head; +} + +/** + * Randomly shuffle the items in the list. + * + * @param pl the head of the list + * + * @return the head of the shuffled list. + */ +plist_t * +plist_shuffle(plist_t *pl) +{ + return plist_shuffle_with(NULL, pl); +} + +/** + * Pick a random cell from the list. + * + * @param pl the head of the list + * + * @return the randomly picked cell, NULL if the list is empty. + */ +plist_t * +plist_random(const plist_t *pl) +{ + const plist_t *l, *picked = NULL; + ulong n; + + /* + * Correctness of this algorithm is documented in pslist_random(). + * + * Note than in our code below, the first item is n = 0, hence item n + * has 1/(n+1) chances of being selected at each step, not 1/n. + */ + + for (l = pl, n = 0; l != NULL; l = l->next, n++) { + if (0 == random_ulong_value(n)) + picked = l; /* Item n has 1/(n+1) chances of being selected */ + } + + return deconstify_pointer(picked); +} + +/** + * Remove head of list. + * + * @param pl_ptr pointer to the head of the list + * + * @return the data item at the head of the list, NULL if the list was empty. + */ +void * +plist_shift(plist_t **pl_ptr) +{ + plist_t *pl = *pl_ptr, *nl; + void *data; + + if G_UNLIKELY(NULL == pl) + return NULL; + + data = pl->data; + + nl = pl->next; + if (nl != NULL) + nl->prev = NULL; + g_assert(NULL == pl->prev); /* Was at the head of the list */ + WFREE(pl); + + /* + * If the list contains NULL items, this is going to confuse the caller + * because NULL is also an indication that the list was empty. + */ + + if G_UNLIKELY(NULL == data) + s_carp_once("%s(): used on a list that contains NULL items", G_STRFUNC); + + *pl_ptr = nl; + return data; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/plist.h
Added
@@ -0,0 +1,180 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Plain two-way list. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#ifndef _plist_h_ +#define _plist_h_ + +/** + * A tw-way cell, pointing to a data item and to the next element. + * + * @attention + * It is imperative that the ``next'' pointer be kept as the first item + * of the structure, so that we can handle plain lists as embedded lists + * to be able to share some code with eslist. + */ +typedef struct plist { + struct plist *next; /**< Next item (must be first element) */ + struct plist *prev; /**< Previous item */ + void *data; /**< Cell data (item at this position) */ +} plist_t; + +/** + * @return next cell in list, NULL if none. + */ +static inline plist_t * +plist_next(const plist_t *pl) +{ + if G_UNLIKELY(NULL == pl) + return NULL; + + return deconstify_pointer(pl->next); +} + +/** + * @return previous cell in list, NULL if none. + */ +static inline plist_t * +plist_prev(const plist_t *pl) +{ + if G_UNLIKELY(NULL == pl) + return NULL; + + return deconstify_pointer(pl->prev); +} + +/** + * @return data held in given list cell. + */ +static inline void * +plist_data(const plist_t *pl) +{ + if G_UNLIKELY(NULL == pl) + return NULL; + + return deconstify_pointer(pl->data); +} + +/* + * Public interface. + */ + +plist_t *plist_alloc(void) G_MALLOC; +void plist_free_1(plist_t *l); +void plist_free_1_null(plist_t **l_ptr); +plist_t *plist_free(plist_t *pl); +void plist_free_null(plist_t **pl_ptr); +plist_t *plist_free_full(plist_t *pl, free_fn_t fn); +void plist_free_full_null(plist_t **pl_ptr, free_fn_t fn); +plist_t *plist_last(const plist_t *pl) WARN_UNUSED_RESULT; +plist_t *plist_first(const plist_t *pl) WARN_UNUSED_RESULT; +plist_t *plist_append(plist_t *pl, void *data); +plist_t *plist_prepend(plist_t *pl, void *data) WARN_UNUSED_RESULT; +plist_t *plist_insert_before(plist_t *pl, + plist_t *sibling, void *data) WARN_UNUSED_RESULT; +plist_t *plist_insert_after(plist_t *pl, + plist_t *sibling, void *data) WARN_UNUSED_RESULT; +plist_t *plist_concat(plist_t *l1, plist_t *l2) WARN_UNUSED_RESULT; +plist_t *plist_remove(plist_t *pl, const void *data) WARN_UNUSED_RESULT; +plist_t *plist_remove_all(plist_t *pl, const void *data) WARN_UNUSED_RESULT; +plist_t *plist_remove_link(plist_t *pl, plist_t *cell); +plist_t *plist_delete_link(plist_t *pl, plist_t *cell); +plist_t *plist_copy(plist_t *pl) WARN_UNUSED_RESULT; +plist_t *plist_copy_deep(plist_t *pl, + copy_data_fn_t fn, void *udata) WARN_UNUSED_RESULT; +plist_t *plist_reverse(plist_t *pl) WARN_UNUSED_RESULT; +plist_t *plist_nth(plist_t *pl, size_t n); +void *plist_nth_data(plist_t *pl, size_t n); +plist_t *plist_find(plist_t *pl, const void *data); +plist_t *plist_find_custom(plist_t *pl, const void *object, cmp_fn_t cmp); +long plist_position(const plist_t *pl, const plist_t *cell); +long plist_index(const plist_t *pl, const void *data); +size_t plist_length(const plist_t *pl); +void plist_foreach(const plist_t *pl, data_fn_t cb, void *data); +plist_t *plist_foreach_remove(plist_t *pl, + data_rm_fn_t cbr, void *data) WARN_UNUSED_RESULT; +plist_t *plist_insert_sorted(plist_t *pl, + void *data, cmp_fn_t cmp) WARN_UNUSED_RESULT; +plist_t *plist_insert_sorted_with_dta(plist_t *pl, void *data, + cmp_data_fn_t cmp, void *udata) WARN_UNUSED_RESULT; +plist_t *plist_sort(plist_t *pl, cmp_fn_t cmp) WARN_UNUSED_RESULT; +plist_t *plist_sort_with_data(plist_t *pl, + cmp_data_fn_t cmp, void *data) WARN_UNUSED_RESULT; +plist_t *plist_shuffle(plist_t *pl) WARN_UNUSED_RESULT; +plist_t *plist_shuffle_with(random_fn_t rf, plist_t *pl) WARN_UNUSED_RESULT; +plist_t *plist_random(const plist_t *pl); +void *plist_shift(plist_t **pl) NON_NULL_PARAM((1)); + +static inline plist_t * WARN_UNUSED_RESULT +plist_prepend_const(plist_t *pl, const void *data) +{ + return plist_prepend(pl, deconstify_pointer(data)); +} + +static inline plist_t * WARN_UNUSED_RESULT +plist_append_const(plist_t *pl, const void *data) +{ + return plist_append(pl, deconstify_pointer(data)); +} + +static inline void * +plist_random_data(const plist_t *pl) +{ + plist_t *r = plist_random(pl); + return NULL == r ? NULL : r->data; +} + +#define PLIST_FOREACH(list, l) \ + for (l = (list); NULL != (l); l = (l)->next) + +#define PLIST_FOREACH_CALL(list, func) \ +G_STMT_START { \ + plist_t *l_ = (list); \ + while (NULL != l_) { \ + func(l_->data); \ + l_ = l_->next; \ + } \ +} G_STMT_END + +#define PLIST_FOREACH_CALL_DATA(list, func, user_data) \ +G_STMT_START { \ + plist_t *l_ = (list); \ + void *user_data_ = (user_data); \ + while (NULL != l_) { \ + func(l_->data, user_data_); \ + l_ = l_->next; \ + } \ +} G_STMT_END + +#endif /* _plist_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/pmsg.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/pmsg.c
Changed
@@ -34,26 +34,29 @@ #include "common.h" #include "pmsg.h" + #include "halloc.h" +#include "mempcpy.h" +#include "unsigned.h" /* For size_is_non_negative() */ #include "walloc.h" + #include "override.h" /* Must be the last header included */ -#define implies(a,b) (!(a) || (b)) -#define valid_ptr(a) (((gulong) (a)) > 100L) +#define valid_ptr(a) (((ulong) (a)) > 100L) -#define EMBEDDED_OFFSET G_STRUCT_OFFSET(pdata_t, d_embedded) +#define EMBEDDED_OFFSET offsetof(pdata_t, d_embedded) /** * An extended message block. * - * An extended message block can be identified by its `m_prio' field + * An extended message block can be identified by its `m_flags' field * having the PMSG_PF_EXT flag set. */ typedef struct pmsg_ext { struct pmsg pmsg; /**< Must be the first member */ /* Additional fields */ pmsg_free_t m_free; /**< Free routine */ - gpointer m_arg; /**< Argument to pass to free routine */ + void *m_arg; /**< Argument to pass to free routine */ } pmsg_ext_t; static inline void @@ -61,11 +64,11 @@ { g_assert(emb); g_assert(PMSG_EXT_MAGIC == emb->pmsg.magic); - g_assert(PMSG_PF_EXT & emb->pmsg.m_prio); + g_assert(PMSG_PF_EXT & emb->pmsg.m_flags); } static inline ALWAYS_INLINE pmsg_ext_t * -cast_to_pmsg_ext(pmsg_t *mb) +cast_to_pmsg_ext(const pmsg_t *mb) { pmsg_ext_t *emb; @@ -110,8 +113,8 @@ pmsg_check_consistency(mb); mb->m_rptr = mb->m_wptr = mb->m_data->d_arena; /* Empty buffer */ - mb->m_prio &= ~PMSG_PF_SENT; /* Clear "sent" indication */ - mb->m_check = NULL; /* Clear "pre-send" checks */ + mb->m_flags = PMSG_EXT_MAGIC == mb->magic ? PMSG_PF_EXT : 0; + mb->m_u.m_check = NULL; /* Clear "pre-send" checks */ } /** @@ -120,12 +123,14 @@ * @return the message block given as argument. */ static pmsg_t * -pmsg_fill(pmsg_t *mb, pdata_t *db, int prio, gconstpointer buf, int len) +pmsg_fill(pmsg_t *mb, pdata_t *db, int prio, bool ext, const void *buf, int len) { - mb->magic = (PMSG_PF_EXT & prio) ? PMSG_EXT_MAGIC : PMSG_MAGIC; + mb->magic = ext ? PMSG_EXT_MAGIC : PMSG_MAGIC; mb->m_data = db; mb->m_prio = prio; - mb->m_check = NULL; + mb->m_flags = ext ? PMSG_PF_EXT : 0; + mb->m_u.m_check = NULL; + mb->m_refcnt = 1; db->d_refcnt++; if (buf) { @@ -149,34 +154,32 @@ * @return a message made of one message block referencing one new data block. */ pmsg_t * -pmsg_new(int prio, gconstpointer buf, int len) +pmsg_new(int prio, const void *buf, int len) { pmsg_t *mb; pdata_t *db; g_assert(len > 0); g_assert(implies(buf, valid_ptr(buf))); - g_assert(0 == (prio & ~PMSG_PRIO_MASK)); WALLOC(mb); db = pdata_new(len); - return pmsg_fill(mb, db, prio, buf, len); + return pmsg_fill(mb, db, prio, FALSE, buf, len); } /** * Like pmsg_new() but returns an extended form with a free routine callback. */ pmsg_t * -pmsg_new_extend(int prio, gconstpointer buf, int len, - pmsg_free_t free_cb, gpointer arg) +pmsg_new_extend(int prio, const void *buf, int len, + pmsg_free_t free_cb, void *arg) { pmsg_ext_t *emb; pdata_t *db; g_assert(len > 0); g_assert(implies(buf, valid_ptr(buf))); - g_assert(0 == (prio & ~PMSG_PRIO_MASK)); WALLOC(emb); db = pdata_new(len); @@ -184,7 +187,7 @@ emb->m_free = free_cb; emb->m_arg = arg; - (void) pmsg_fill(&emb->pmsg, db, prio | PMSG_PF_EXT, buf, len); + (void) pmsg_fill(&emb->pmsg, db, prio, TRUE, buf, len); return cast_to_pmsg(emb); } @@ -205,11 +208,10 @@ g_assert(roff >= 0 && (size_t) roff <= pdata_len(db)); g_assert(woff >= 0 && (size_t) woff <= pdata_len(db)); g_assert(woff >= roff); - g_assert(0 == (prio & ~PMSG_PRIO_MASK)); WALLOC(mb); - pmsg_fill(mb, db, prio, NULL, 0); + pmsg_fill(mb, db, prio, FALSE, NULL, 0); mb->m_rptr += roff; mb->m_wptr += woff; @@ -221,23 +223,20 @@ * Extended cloning of message, adds a free routine callback. */ pmsg_t * -pmsg_clone_extend(pmsg_t *mb, pmsg_free_t free_cb, gpointer arg) +pmsg_clone_extend(const pmsg_t *mb, pmsg_free_t free_cb, void *arg) { pmsg_ext_t *nmb; pmsg_check_consistency(mb); WALLOC(nmb); + nmb->pmsg = *mb; /* Struct copy */ nmb->pmsg.magic = PMSG_EXT_MAGIC; - nmb->pmsg.m_rptr = mb->m_rptr; - nmb->pmsg.m_wptr = mb->m_wptr; - nmb->pmsg.m_data = mb->m_data; - nmb->pmsg.m_prio = mb->m_prio; - nmb->pmsg.m_check = mb->m_check; pdata_addref(nmb->pmsg.m_data); - nmb->pmsg.m_prio |= PMSG_PF_EXT; + nmb->pmsg.m_flags |= PMSG_PF_EXT; + nmb->pmsg.m_refcnt = 1; nmb->m_free = free_cb; nmb->m_arg = arg; @@ -260,7 +259,7 @@ * @return the old free routine. */ pmsg_free_t -pmsg_replace_ext(pmsg_t *mb, pmsg_free_t nfree, gpointer narg, gpointer *oarg) +pmsg_replace_ext(pmsg_t *mb, pmsg_free_t nfree, void *narg, void **oarg) { pmsg_ext_t *nmb; pmsg_free_t fn; @@ -280,8 +279,8 @@ * Get the "meta data" from an extended message block (the argument passed * to the embedded free routine). */ -gpointer -pmsg_get_metadata(pmsg_t *mb) +void * +pmsg_get_metadata(const pmsg_t *mb) { return cast_to_pmsg_ext(mb)->m_arg; } @@ -295,20 +294,37 @@ * * The callback routine must not modify the message, as the buffer can * be shared among multiple messages, unless its refcount is 1. - * - * @return the previous pre-send checking routine. */ -pmsg_check_t +void pmsg_set_check(pmsg_t *mb, pmsg_check_t check) { - pmsg_check_t old; - pmsg_check_consistency(mb); - old = mb->m_check; - mb->m_check = check; + mb->m_u.m_check = check; + mb->m_flags &= ~PMSG_PF_HOOK; /* Is not a hook */ +} - return old; +/** + * Set the pre-send hook routine for the buffer. + * + * This routine, if it exists (non-NULL) is called just before sending + * the message at the lowest level. If it returns FALSE, the message is + * immediately dropped. + * + * The callback routine must not modify the message. + * + * The difference with a "check callback" is that a hook is only invoked + * on the standalone buffer, the layer perusing this information being + * able to gather all its context from the message, using its protocol header + * relevant to the layer. + */ +void +pmsg_set_hook(pmsg_t *mb, pmsg_hook_t hook) +{ + pmsg_check_consistency(mb); + + mb->m_u.m_hook = hook; + mb->m_flags |= PMSG_PF_HOOK; /* Is a hook */ } /** @@ -323,6 +339,7 @@ WALLOC(nmb); *nmb = *mb; /* Struct copy */ + nmb->pmsg.m_refcnt = 1; pdata_addref(nmb->pmsg.m_data); return cast_to_pmsg(nmb); @@ -330,9 +347,12 @@ /** * Shallow cloning of message, result is referencing the same data. + * + * This is not the same thing as pmsg_ref() because here a new message block + * is created (albeit the data are shared with the original message). */ pmsg_t * -pmsg_clone(pmsg_t *mb) +pmsg_clone(const pmsg_t *mb) { if (pmsg_is_extended(mb)) { return pmsg_clone_ext(cast_to_pmsg_ext(mb)); @@ -342,6 +362,7 @@ pmsg_check_consistency(mb); WALLOC(nmb); *nmb = *mb; /* Struct copy */ + nmb->m_refcnt = 1; pdata_addref(nmb->m_data); return nmb; @@ -349,7 +370,58 @@ } /** + * Shallow cloning of message, making sure we have a plain clone even if + * the original was extended. + */ +pmsg_t * +pmsg_clone_plain(const pmsg_t *mb) +{ + pmsg_t *nmb; + + pmsg_check_consistency(mb); + + WALLOC(nmb); + memcpy(nmb, mb, sizeof *nmb); + nmb->magic = PMSG_MAGIC; /* Force plain message */ + nmb->m_flags &= ~PMSG_PF_EXT; /* In case original was extended */ + nmb->m_refcnt = 1; + pdata_addref(nmb->m_data); + + return nmb; +} + +/** + * Increase the reference count on the message block. + * + * This must be used in TX stacks when there is a free routine installed + * on messages and we want to keep another reference to the message, yet + * allow upper layers to pmsg_free() the message block as if it had been + * sent from their point of view. + * + * It also allows correct pmsg_was_sent() checks in free routines, whereas + * a pmsg_clone() would create a new message. + * + * @return its argument, for convenience. + */ +pmsg_t * +pmsg_ref(pmsg_t *mb) +{ + pmsg_check_consistency(mb); + g_assert(mb->m_refcnt != 0); + + mb->m_refcnt++; + + g_assert(mb->m_refcnt != 0); /* Safeguard against overflows */ + + return mb; +} + +/** * Free all message blocks, and decrease ref count on all data buffers. + * + * If the message block is referenced by more than one place, simply + * decrease its reference count. No freeing occurs and the free routine + * is therefore not invoked. */ void pmsg_free(pmsg_t *mb) @@ -357,6 +429,16 @@ pdata_t *db = mb->m_data; pmsg_check_consistency(mb); + g_assert(mb->m_refcnt != 0); + + /* + * Don't free anything if refcnt != 1. + */ + + if (mb->m_refcnt > 1U) { + mb->m_refcnt--; + return; + } /* * Invoke free routine on extended message block. @@ -422,12 +504,13 @@ * @returns amount of written data. */ int -pmsg_write(pmsg_t *mb, gconstpointer data, int len) +pmsg_write(pmsg_t *mb, const void *data, int len) { pdata_t *arena; int available, written; pmsg_check_consistency(mb); + g_assert_log(len >= 0, "%s(): len=%d", G_STRFUNC, len); g_assert(pmsg_is_writable(mb)); /* Not shared, or would corrupt data */ arena = mb->m_data; @@ -435,10 +518,9 @@ g_assert(available >= 0); /* Data cannot go beyond end of arena */ written = len >= available ? available : len; - if (written != 0) { - memcpy(mb->m_wptr, data, written); - mb->m_wptr += written; - } + if (written != 0) + mb->m_wptr = mempcpy(mb->m_wptr, data, written); + return written; } @@ -446,11 +528,12 @@ * Read data from the message, returning the amount of bytes transferred. */ int -pmsg_read(pmsg_t *mb, gpointer data, int len) +pmsg_read(pmsg_t *mb, void *data, int len) { int available, readable; pmsg_check_consistency(mb); + g_assert_log(len >= 0, "%s(): len=%d", G_STRFUNC, len); available = mb->m_wptr - mb->m_rptr; g_assert(available >= 0); /* Data cannot go beyond end of arena */ @@ -472,6 +555,7 @@ int available, n; pmsg_check_consistency(mb); + g_assert_log(len >= 0, "%s(): len=%d", G_STRFUNC, len); available = mb->m_wptr - mb->m_rptr; g_assert(available >= 0); /* Data cannot go beyond end of arena */ @@ -495,6 +579,7 @@ int available, n; pmsg_check_consistency(mb); + g_assert_log(len >= 0, "%s(): len=%d", G_STRFUNC, len); available = mb->m_wptr - mb->m_rptr; g_assert(available >= 0); /* Data cannot go beyond end of arena */ @@ -523,6 +608,7 @@ pmsg_check_consistency(dest); pmsg_check_consistency(src); + g_assert_log(len >= 0, "%s(): len=%d", G_STRFUNC, len); g_assert(pmsg_is_writable(dest)); /* Not shared, or would corrupt data */ copied = src->m_wptr - src->m_rptr; /* Available data in source */ @@ -531,8 +617,7 @@ copied = MIN(copied, available); if (copied > 0) { - memcpy(dest->m_wptr, src->m_rptr, copied); - dest->m_wptr += copied; + dest->m_wptr = mempcpy(dest->m_wptr, src->m_rptr, copied); src->m_rptr += copied; } @@ -645,7 +730,7 @@ * arena will be freed with wfree(buf, len) when the data buffer is reclaimed. */ pdata_t * -pdata_allocb(void *buf, int len, pdata_free_t freecb, gpointer freearg) +pdata_allocb(void *buf, int len, pdata_free_t freecb, void *freearg) { pdata_t *db; @@ -655,6 +740,7 @@ db = buf; + db->magic = PDATA_MAGIC; db->d_arena = db->d_embedded; db->d_end = db->d_arena + (len - EMBEDDED_OFFSET); db->d_refcnt = 0; @@ -675,7 +761,7 @@ * the data buffer is reclaimed. */ pdata_t * -pdata_allocb_ext(void *buf, int len, pdata_free_t freecb, gpointer freearg) +pdata_allocb_ext(void *buf, int len, pdata_free_t freecb, void *freearg) { pdata_t *db; @@ -683,6 +769,7 @@ g_assert(implies(freecb, valid_ptr(freecb))); WALLOC(db); + db->magic = PDATA_MAGIC; db->d_arena = buf; db->d_end = (char *) buf + len; db->d_refcnt = 0; @@ -700,7 +787,7 @@ * the buffer, probably because it was made out of a static buffer. */ void -pdata_free_nop(gpointer unused_p, gpointer unused_arg) +pdata_free_nop(void *unused_p, void *unused_arg) { (void) unused_p; (void) unused_arg; @@ -712,25 +799,32 @@ static void pdata_free(pdata_t *db) { - gboolean is_embedded = (db->d_arena == db->d_embedded); + bool is_embedded; - g_assert(db->d_refcnt == 0); + pdata_check(db); + g_assert(0 == db->d_refcnt); + + is_embedded = (db->d_arena == db->d_embedded); /* * If user supplied a free routine for the buffer, invoke it. */ if (db->d_free) { - gpointer p = is_embedded ? (gpointer) db : (gpointer) db->d_arena; + void *p = is_embedded ? (void *) db : (void *) db->d_arena; (*db->d_free)(p, db->d_arg); - if (!is_embedded) + if (!is_embedded) { + db->magic = 0; WFREE(db); + } } else { + size_t len = pdata_len(db); /* Before resetting the magic number */ + db->magic = 0; if (!is_embedded) { - G_FREE_NULL(db->d_arena); + wfree(db->d_arena, len); WFREE(db); } else { - wfree(db, pdata_len(db) + EMBEDDED_OFFSET); + wfree(db, len + EMBEDDED_OFFSET); } } } @@ -773,7 +867,7 @@ int i; n = MIN(n, MAX_IOV_COUNT); - iov = halloc(n * sizeof *iov); + HALLOC_ARRAY(iov, n); iter = slist_iter_before_head(slist); for (i = 0; i < n; i++) { @@ -787,8 +881,7 @@ g_assert(size > 0); held += size; - iovec_set_base(&iovi, deconstify_gpointer(pmsg_read_base(mb))); - iovec_set_len(&iovi, size); + iovec_set(&iovi, deconstify_pointer(pmsg_read_base(mb)), size); } slist_iter_free(&iter); } else { @@ -850,6 +943,8 @@ pmsg_t *mb; g_assert(slist); + g_assert_log(size_is_non_negative(n_bytes), + "%s(): n_bytes=%zd", G_STRFUNC, n_bytes); if (0 == n_bytes) return; @@ -913,6 +1008,7 @@ void *p; g_assert(slist != NULL); + g_assert_log(size_is_non_negative(len), "%s(): len=%zd", G_STRFUNC, len); iter = slist_iter_removable_on_head(slist); p = buf; @@ -955,7 +1051,7 @@ void pmsg_slist_free_all(slist_t **slist_ptr) { - slist_free_all(slist_ptr, cast_to_slist_destroy(pmsg_free)); + slist_free_all(slist_ptr, cast_to_free_fn(pmsg_free)); } /** @@ -989,15 +1085,15 @@ * this is the last byte of the encoded value. */ void -pmsg_write_ule64(pmsg_t *mb, guint64 v) +pmsg_write_ule64(pmsg_t *mb, uint64 v) { - guint64 value = v; + uint64 value = v; g_assert(pmsg_is_writable(mb)); /* Not shared, or would corrupt data */ g_assert(pmsg_available(mb) >= 10); /* Will need 10 bytes at most */ do { - guint8 byt = (guint8) (value & 0x7f); /* Lowest 7 bits */ + uint8 byt = (uint8) (value & 0x7f); /* Lowest 7 bits */ value >>= 7; if (0 == value) { byt |= 0x80; /* Last byte emitted */ @@ -1019,10 +1115,11 @@ g_assert(pmsg_is_writable(mb)); /* Not shared, or would corrupt data */ g_assert(UNSIGNED(pmsg_available(mb)) >= n + 10); /* Need ule64 length */ + g_assert_log(size_is_non_negative(n), "%s(): n=%zd", G_STRFUNC, n); len = strlen(str); len = MIN(n, len); - pmsg_write_ule64(mb, (guint64) len); + pmsg_write_ule64(mb, (uint64) len); if (len != 0) { pmsg_write(mb, str, len); @@ -1044,12 +1141,14 @@ size_t len; g_assert(pmsg_is_writable(mb)); /* Not shared, or would corrupt data */ + g_assert_log(size_is_non_negative(length) || (size_t) -1 == length, + "%s(): length=%zd", G_STRFUNC, length); len = (size_t) -1 == length ? strlen(str) : length; g_assert(UNSIGNED(pmsg_available(mb)) >= len + 10); /* Need ule64 length */ - pmsg_write_ule64(mb, (guint64) len); + pmsg_write_ule64(mb, (uint64) len); if (len != 0) { pmsg_write(mb, str, len); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/pmsg.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/pmsg.h
Changed
@@ -60,29 +60,56 @@ * kind. */ -typedef void (*pdata_free_t)(gpointer p, gpointer arg); +typedef void (*pdata_free_t)(void *p, void *arg); + +enum pdata_magic { PDATA_MAGIC = 0x0ad505b9 }; typedef struct pdata { + enum pdata_magic magic; pdata_free_t d_free; /**< Free routine */ - gpointer d_arg; /**< Argument to free routine */ + void *d_arg; /**< Argument to free routine */ int d_refcnt; /**< Reference count */ char *d_arena; /**< First byte in buffer */ char *d_end; /**< First byte after buffer */ char d_embedded1; /**< Start of embedded arena */ } pdata_t; -#define pdata_start(x) ((x)->d_arena) -#define pdata_len(x) ((size_t) ((x)->d_end - (x)->d_arena)) -#define pdata_addref(x) do { (x)->d_refcnt++; } while (0) +static inline void +pdata_check(const pdata_t * const pd) +{ + g_assert(pd != NULL); + g_assert(PDATA_MAGIC == pd->magic); +} + +static inline char * +pdata_start(const pdata_t *pd) +{ + pdata_check(pd); + return pd->d_arena; +} + +static inline size_t +pdata_len(const pdata_t *pd) +{ + pdata_check(pd); + return ptr_diff(pd->d_end, pd->d_arena); +} + +static inline void +pdata_addref(pdata_t *pd) +{ + pdata_check(pd); + pd->d_refcnt++; +} /* * A message block */ -struct mqueue; - typedef struct pmsg pmsg_t; -typedef gboolean (*pmsg_check_t)(pmsg_t *mb, const struct mqueue *q); + +typedef bool (*pmsg_check_t)(const pmsg_t *mb, const void *arg); +typedef bool (*pmsg_hook_t)(const pmsg_t *mb); enum pmsg_magic { PMSG_MAGIC = 0x2fa50be3U, @@ -94,29 +121,19 @@ const char *m_rptr; /**< First unread byte in buffer */ char *m_wptr; /**< First unwritten byte in buffer */ pdata_t *m_data; /**< Data buffer */ - guint m_prio; /**< Message priority (0 = normal) */ - pmsg_check_t m_check; /**< Optional check before sending */ + uint8 m_flags; /**< Message flags */ + uint8 m_prio; /**< Message priority (0 = normal) */ + uint16 m_refcnt; /**< Refs to this message block */ + union { + pmsg_check_t m_check; /**< Optional check before sending */ + pmsg_hook_t m_hook; /**< Optional check before transmitting */ + } m_u; }; -typedef void (*pmsg_free_t)(pmsg_t *mb, gpointer arg); - -#define PMSG_PRIO_MASK 0x00ffffff /**< Only lower bits are relevant */ - -#define pmsg_start(x) ((x)->m_data->d_arena) -#define pmsg_phys_len(x) pdata_len((x)->m_data) -#define pmsg_is_writable(x) ((x)->m_data->d_refcnt == 1) -#define pmsg_prio(x) ((x)->m_prio & PMSG_PRIO_MASK) - -#define pmsg_is_unread(x) ((x)->m_rptr == (x)->m_data->d_arena) -#define pmsg_read_base(x) ((x)->m_rptr) - -#define pmsg_check(x,y) ((x)->m_check ? (x)->m_check((x), (y)) : TRUE) - -/* Available room for pmsg_write() calls */ -#define pmsg_available(x) ((x)->m_data->d_end - (x)->m_wptr) +typedef void (*pmsg_free_t)(pmsg_t *mb, void *arg); /* - * Message priorities. + * Message priorities (16-bit). */ #define PMSG_P_DATA 0 /**< Regular data, lowest priority */ @@ -124,51 +141,218 @@ #define PMSG_P_URGENT 2 /**< Urgent message */ #define PMSG_P_HIGHEST 3 /**< Highest priority */ -/* - * Flags defined in highest bits of `m_prio'. - */ - -#define PMSG_PF_EXT 0x80000000 /**< Message block uses extended form */ -#define PMSG_PF_SENT 0x40000000 /**< Message was successfully sent */ - -#define pmsg_is_extended(mb) ((mb)->m_prio & PMSG_PF_EXT) -#define pmsg_was_sent(mb) ((mb)->m_prio & PMSG_PF_SENT) -#define pmsg_mark_sent(mb) \ -G_STMT_START { \ - (mb)->m_prio |= PMSG_PF_SENT; \ -} G_STMT_END +#define PMSG_P_COUNT 4 /**< Amount of priorities defined */ /* - * Public interface + * Message flags. */ +#define PMSG_PF_EXT (1U << 7) /**< Message block uses extended form */ +#define PMSG_PF_SENT (1U << 6) /**< Message was successfully sent */ +#define PMSG_PF_ACKME (1U << 5) /**< Request remote acknowledgment */ +#define PMSG_PF_COMP (1U << 4) /**< Compression already attempted / done */ +#define PMSG_PF_HOOK (1U << 3) /**< Use ``m_check'' as standalone hook */ + static inline void pmsg_check_consistency(const pmsg_t * const mb) { g_assert(mb != NULL); g_assert((PMSG_MAGIC == mb->magic) ^ (PMSG_EXT_MAGIC == mb->magic)); - g_assert((PMSG_MAGIC == mb->magic) ^ (0 != (PMSG_PF_EXT & mb->m_prio))); + g_assert((PMSG_MAGIC == mb->magic) ^ (0 != (PMSG_PF_EXT & mb->m_flags))); +} + +static inline char * +pmsg_start(const pmsg_t *mb) +{ + pmsg_check_consistency(mb); + pdata_check(mb->m_data); + + return mb->m_data->d_arena; +} + +static inline size_t +pmsg_phys_len(const pmsg_t *mb) +{ + pmsg_check_consistency(mb); + return pdata_len(mb->m_data); +} + +static inline bool +pmsg_is_writable(const pmsg_t *mb) +{ + pmsg_check_consistency(mb); + pdata_check(mb->m_data); + return 1 == mb->m_data->d_refcnt; +} + +static inline unsigned +pmsg_prio(const pmsg_t *mb) +{ + pmsg_check_consistency(mb); + return mb->m_prio; +} + +static inline unsigned +pmsg_refcnt(const pmsg_t *mb) +{ + pmsg_check_consistency(mb); + return mb->m_refcnt; +} + +static inline bool +pmsg_is_unread(const pmsg_t *mb) +{ + pmsg_check_consistency(mb); + pdata_check(mb->m_data); + return mb->m_rptr == mb->m_data->d_arena; +} + +static inline const char * +pmsg_read_base(const pmsg_t *mb) +{ + pmsg_check_consistency(mb); + return mb->m_rptr; +} + +/** + * Pre-send checks. + */ +static inline bool +pmsg_check(const pmsg_t *mb, const void *arg) +{ + pmsg_check_consistency(mb); + return (NULL != mb->m_u.m_check && !(mb->m_flags & PMSG_PF_HOOK)) ? + mb->m_u.m_check(mb, arg) : TRUE; +} + +/** + * Pre-transmit hook. + */ +static inline bool +pmsg_hook_check(const pmsg_t *mb) +{ + pmsg_check_consistency(mb); + return (NULL != mb->m_u.m_hook && (mb->m_flags & PMSG_PF_HOOK)) ? + mb->m_u.m_hook(mb) : TRUE; +} + +/** + * Available room for pmsg_write() calls + */ +static inline size_t +pmsg_available(const pmsg_t *mb) +{ + pmsg_check_consistency(mb); + pdata_check(mb->m_data); + return ptr_diff(mb->m_data->d_end, mb->m_wptr); +} + +static inline bool +pmsg_is_extended(const pmsg_t *mb) +{ + pmsg_check_consistency(mb); + return 0 != (mb->m_flags & PMSG_PF_EXT); +} + +static inline bool +pmsg_was_sent(const pmsg_t *mb) +{ + pmsg_check_consistency(mb); + return 0 != (mb->m_flags & PMSG_PF_SENT); +} + + +static inline bool +pmsg_is_reliable(const pmsg_t *mb) +{ + pmsg_check_consistency(mb); + return 0 != (mb->m_flags & PMSG_PF_ACKME); +} + +static inline bool +pmsg_is_compressed(const pmsg_t *mb) +{ + pmsg_check_consistency(mb); + return 0 != (mb->m_flags & PMSG_PF_COMP); +} + +/** + * TX layer marks message as being sent when it was sent over the network. + */ +static inline void +pmsg_mark_sent(pmsg_t *mb) +{ + mb->m_flags |= PMSG_PF_SENT; +} + +/** + * Clear the "sent" marker on message. + */ +static inline void +pmsg_clear_sent(pmsg_t *mb) +{ + mb->m_flags &= ~PMSG_PF_SENT; +} + +/** + * On unreliable medium (e.g. UDP), flag message as requiring a reliable + * transmission, if possible. The message will be marked as "sent" only + * if it was acknowledged. + */ +static inline void +pmsg_mark_reliable(pmsg_t *mb) +{ + mb->m_flags |= PMSG_PF_ACKME; +} + +/** + * Clear the reliable marker. + */ +static inline void +pmsg_clear_reliable(pmsg_t *mb) +{ + mb->m_flags &= ~PMSG_PF_ACKME; +} + +/** + * Mark message as "compressed", whether or not it actually is. + * + * This signals the TX layers that the data has either already been compressed + * or that compression was already attempted and did not yield any significant + * gain. Hence it would be a waste of time to attempt a compression again. + */ +static inline void +pmsg_mark_compressed(pmsg_t *mb) +{ + mb->m_flags |= PMSG_PF_COMP; } +/* + * Public interface + */ + void pmsg_init(void); void pmsg_close(void); -pmsg_t *pmsg_new(int prio, gconstpointer buf, int len); +pmsg_t *pmsg_new(int prio, const void *buf, int len); pmsg_t * pmsg_new_extend( - int prio, gconstpointer buf, int len, - pmsg_free_t free_cb, gpointer arg); + int prio, const void *buf, int len, + pmsg_free_t free_cb, void *arg); pmsg_t *pmsg_alloc(int prio, pdata_t *db, int roff, int woff); -pmsg_t *pmsg_clone(pmsg_t *mb); -pmsg_t *pmsg_clone_extend(pmsg_t *mb, pmsg_free_t free_cb, gpointer arg); +pmsg_t *pmsg_ref(pmsg_t *mb); +pmsg_t *pmsg_clone(const pmsg_t *mb); +pmsg_t *pmsg_clone_plain(const pmsg_t *mb); +pmsg_t *pmsg_clone_extend(const pmsg_t *mb, pmsg_free_t free_cb, void *arg); pmsg_free_t pmsg_replace_ext( - pmsg_t *mb, pmsg_free_t nfree, gpointer narg, gpointer *oarg); -gpointer pmsg_get_metadata(pmsg_t *mb); -pmsg_check_t pmsg_set_check(pmsg_t *mb, pmsg_check_t check); + pmsg_t *mb, pmsg_free_t nfree, void *narg, void **oarg); +void *pmsg_get_metadata(const pmsg_t *mb); +void pmsg_set_check(pmsg_t *mb, pmsg_check_t check); +void pmsg_set_hook(pmsg_t *mb, pmsg_hook_t hook); void pmsg_free(pmsg_t *mb); void pmsg_free_null(pmsg_t **mb_ptr); -int pmsg_write(pmsg_t *mb, gconstpointer data, int len); +int pmsg_write(pmsg_t *mb, const void *data, int len); int pmsg_writable_length(const pmsg_t *mb); -int pmsg_read(pmsg_t *mb, gpointer data, int len); +int pmsg_read(pmsg_t *mb, void *data, int len); int pmsg_discard(pmsg_t *mb, int len); int pmsg_discard_trailing(pmsg_t *mb, int len); int pmsg_copy(pmsg_t *dest, pmsg_t *src, int len); @@ -179,10 +363,10 @@ pdata_t *pdata_new(int len); pdata_t *pdata_allocb(void *buf, int len, - pdata_free_t freecb, gpointer freearg); + pdata_free_t freecb, void *freearg); pdata_t *pdata_allocb_ext(void *buf, int len, - pdata_free_t freecb, gpointer freearg); -void pdata_free_nop(gpointer p, gpointer arg); + pdata_free_t freecb, void *freearg); +void pdata_free_nop(void *p, void *arg); void pdata_unref(pdata_t *db); iovec_t *pmsg_slist_to_iovec(slist_t *slist, @@ -197,7 +381,7 @@ static inline void pmsg_slist_free(slist_t **slist_ptr) { - slist_free_all(slist_ptr, (slist_destroy_cb) pmsg_free); + slist_free_all(slist_ptr, (free_fn_t) pmsg_free); } /** @@ -283,19 +467,19 @@ * Write a single byte. */ static inline void -pmsg_write_u8(pmsg_t *mb, guint8 val) +pmsg_write_u8(pmsg_t *mb, uint8 val) { g_assert(pmsg_is_writable(mb)); /* Not shared, or would corrupt data */ g_assert(pmsg_available(mb) >= 1); - *(guint8 *) mb->m_wptr++ = val; + *(uint8 *) mb->m_wptr++ = val; } /** * Write a 16-bit value in big-endian format. */ static inline void -pmsg_write_be16(pmsg_t *mb, guint16 val) +pmsg_write_be16(pmsg_t *mb, uint16 val) { g_assert(pmsg_is_writable(mb)); /* Not shared, or would corrupt data */ g_assert(pmsg_available(mb) >= 2); @@ -307,7 +491,7 @@ * Write a 16-bit value in little-endian format. */ static inline void -pmsg_write_le16(pmsg_t *mb, guint16 val) +pmsg_write_le16(pmsg_t *mb, uint16 val) { g_assert(pmsg_is_writable(mb)); /* Not shared, or would corrupt data */ g_assert(pmsg_available(mb) >= 2); @@ -319,7 +503,7 @@ * Write a 32-bit value in big-endian format. */ static inline void -pmsg_write_be32(pmsg_t *mb, guint32 val) +pmsg_write_be32(pmsg_t *mb, uint32 val) { g_assert(pmsg_is_writable(mb)); /* Not shared, or would corrupt data */ g_assert(pmsg_available(mb) >= 4); @@ -331,7 +515,7 @@ * Write a 32-bit value in little-endian format. */ static inline void -pmsg_write_le32(pmsg_t *mb, guint32 val) +pmsg_write_le32(pmsg_t *mb, uint32 val) { g_assert(pmsg_is_writable(mb)); /* Not shared, or would corrupt data */ g_assert(pmsg_available(mb) >= 4); @@ -343,7 +527,7 @@ * Write a 64-bit value in big-endian format. */ static inline void -pmsg_write_be64(pmsg_t *mb, guint64 val) +pmsg_write_be64(pmsg_t *mb, uint64 val) { g_assert(pmsg_is_writable(mb)); /* Not shared, or would corrupt data */ g_assert(pmsg_available(mb) >= 8); @@ -355,7 +539,7 @@ * Write a 64-bit value in little-endian format. */ static inline void -pmsg_write_le64(pmsg_t *mb, guint64 val) +pmsg_write_le64(pmsg_t *mb, uint64 val) { g_assert(pmsg_is_writable(mb)); /* Not shared, or would corrupt data */ g_assert(pmsg_available(mb) >= 8); @@ -372,19 +556,19 @@ g_assert(pmsg_is_writable(mb)); /* Not shared, or would corrupt data */ g_assert(pmsg_available(mb) >= 4); - mb->m_wptr = poke_be32(mb->m_wptr, (guint32) val); + mb->m_wptr = poke_be32(mb->m_wptr, (uint32) val); } /** - * Write gboolean. + * Write boolean. */ static inline void -pmsg_write_boolean(pmsg_t *mb, gboolean val) +pmsg_write_boolean(pmsg_t *mb, bool val) { g_assert(pmsg_is_writable(mb)); /* Not shared, or would corrupt data */ g_assert(pmsg_available(mb) >= 1); - *(guint8 *) mb->m_wptr++ = val ? 1 : 0; + *(uint8 *) mb->m_wptr++ = booleanize(val); } /** @@ -399,7 +583,7 @@ mb->m_wptr = poke_float_be32(mb->m_wptr, val); } -void pmsg_write_ule64(pmsg_t *mb, guint64 val); +void pmsg_write_ule64(pmsg_t *mb, uint64 val); void pmsg_write_fixed_string(pmsg_t *mb, const char *str, size_t n); void pmsg_write_ipv4_or_ipv6_addr(pmsg_t *mb, host_addr_t addr); void pmsg_write_string(pmsg_t *mb, const char *str, size_t length);
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/pow2.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/pow2.c
Changed
@@ -66,56 +66,64 @@ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, }; +#ifndef HAS_BUILTIN_POPCOUNT static const int bits_set_byte256 = { - 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, - 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, }; /** * @returns amount of bits set in a byte. */ int -bits_set(guint8 b) +bits_set(uint8 b) { return bits_set_byteb & 0xff; } +#endif /* !HAS_BUILTIN_POPCOUNT */ /** - * @returns amount of bits set in a 32-bit value. + * @returns the closest power of two greater or equal to `n'. + * next_pow2(0) and next_pow2(0x8.......) return 0. */ -int -bits_set32(guint32 v) +uint32 +next_pow2(uint32 n) { - return - bits_set_bytev & 0xff + - bits_set_byte(v >> 8) & 0xff + - bits_set_byte(v >> 16) & 0xff + - bits_set_byte(v >> 24) & 0xff; + n--; + + n |= n >> 16; + n |= n >> 8; + n |= n >> 4; + n |= n >> 2; + n |= n >> 1; + + return n + 1; } /** * @returns the closest power of two greater or equal to `n'. - * next_pow2(0) and next_pow2(0x8.......) return 0. + * next_pow2_64(0) and next_pow2_64(0x8...............) return 0. */ -guint32 -next_pow2(guint32 n) +uint64 +next_pow2_64(uint64 n) { n--; + n |= n >> 32; n |= n >> 16; n |= n >> 8; n |= n >> 4; @@ -129,13 +137,13 @@ * Determine the highest bit set in `n', -1 if value was 0. */ int -highest_bit_set(guint32 n) +highest_bit_set(uint32 n) { int i; - guint32 h; + uint32 h; for (i = 0, h = n; i < 32; i += 8, h >>= 8) { - guint32 byt = h & 0xffU; + uint32 byt = h & 0xffU; if (byt == h) return i + log2_byteh; } @@ -148,7 +156,7 @@ * Determine the highest bit set in `n', -1 if value was 0. */ int -highest_bit_set64(guint64 n) +highest_bit_set64(uint64 n) { if G_LIKELY(n <= 0xffffffffU) return highest_bit_set(n); @@ -156,4 +164,89 @@ return 32 + highest_bit_set(n >> 32); } +/** + * Count trailing zeroes in a 64-bit number, -1 for zero. + */ +int +ctz64(uint64 n) +{ + if G_LIKELY(n <= 0xffffffffU) + return ctz(n); + else { + int v = ctz(n & 0xffffffffU); + return (-1 == v) ? 32 + ctz(n >> 32) : v; + } +} + +/** + * Reverse the bits in a byte, i.e. 0b00100001 becomes 0b100000100. + */ +uint8 +reverse_byte(uint8 b) +{ + /* + * This code was derived from: + * http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious + */ + +#if LONGSIZE == 8 + +/* + Here is the explaination of what the algorithm does on 64-bit machines: + We need 80 columns to document this properly, hence the unusual formatting. + ----------------------------------------------------------------------------- + abcd efgh + * (0x80200802) 1000 0000 0010 0000 0000 1000 0000 0010 + ----------------------------------------------------------------------------- + 0abc defg h00a bcde fgh0 0abc defg h00a bcde fgh0 + & (0x0884422110) 0000 1000 1000 0100 0100 0010 0010 0001 0001 0000 + ----------------------------------------------------------------------------- + 0000 d000 h000 0c00 0g00 00b0 00f0 000a 000e 0000 + * (0x0101010101) 0000 0001 0000 0001 0000 0001 0000 0001 0000 0001 + ----------------------------------------------------------------------------- + 0000 d000 h000 0c00 0g00 00b0 00f0 000a 000e 0000 + 0000 d000 h000 0c00 0g00 00b0 00f0 000a 000e 0000 + 0000 d000 h000 0c00 0g00 00b0 00f0 000a 000e 0000 +.. h000 0c00 0g00 00b0 00f0 000a 000e 0000 +.. 0g00 00b0 00f0 000a 000e 0000 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +.. hg00 dcb0 hgf0 dcba hgfe dcba hgfe 0cba 0gfe 00ba 00fe 000a 000e 0000 + ----------------------------------------------------------------------------- + >> 32 0000 d000 h000 dc00 hg00 dcb0 hgf0 dcba hgfe dcba + & 1111 1111 + ----------------------------------------------------------------------------- + hgfe dcba + ----------------------------------------------------------------------------- + */ + { + uint8 v; + + /* + * The first multiply fans out the bit pattern to multiple copies, + * while the last multiply combines them in the fifth byte from the + * right. + * + * Devised by Sean Anderson, July 13th, 2001. + */ + + v = ((b * 0x80200802UL) & 0x0884422110UL) * 0x0101010101UL >> 32; + + return v; + } +#else + { + uint8 v; + + /* + * Devised by Sean Anderson, July 13th, 2001. + */ + + v = ((b * 0x0802UL & 0x22110UL) | (b * 0x8020UL & 0x88440UL)) * + 0x10101UL >> 16; + + return v; + } +#endif +} + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/pow2.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/pow2.h
Changed
@@ -36,11 +36,12 @@ #define IS_POWER_OF_2(x) ((x) && 0 == ((x) & ((x) - 1))) -guint32 next_pow2(guint32 n) G_GNUC_CONST; -int highest_bit_set(guint32 n) G_GNUC_PURE; -int highest_bit_set64(guint64 n) G_GNUC_PURE; -int bits_set(guint8 b) G_GNUC_PURE; -int bits_set32(guint32 v) G_GNUC_PURE; +uint32 next_pow2(uint32 n) G_CONST; +uint64 next_pow2_64(uint64 n) G_CONST; +int highest_bit_set(uint32 n) G_PURE; +int highest_bit_set64(uint64 n) G_PURE; +int ctz64(uint64 n) G_CONST; +uint8 reverse_byte(uint8 b) G_CONST; /** * Checks whether the given value is a power of 2. @@ -48,8 +49,8 @@ * @param value a 32-bit integer * @return TRUE if ``value'' is a power of 2. Otherwise FALSE. */ -static inline G_GNUC_CONST gboolean -is_pow2(guint32 value) +static inline ALWAYS_INLINE G_CONST bool +is_pow2(uint32 value) #ifdef HAS_BUILTIN_POPCOUNT { return 1 == __builtin_popcount(value); @@ -60,6 +61,124 @@ } #endif /* HAS_BUILTIN_POPCOUNT */ +/** + * Populuation count. + * + * @return number of 1 bits in a 32-bit integer. + */ +static inline ALWAYS_INLINE G_CONST int +popcount(uint32 x) +#ifdef HAS_BUILTIN_POPCOUNT +{ + return __builtin_popcount(x); +} +#else /* !HAS_BUILTIN_POPCOUNT */ +{ + /* + * Best popcount implementation, in only 12 operations. + * Source: http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious + */ + + x -= (x >> 1) & 0x55555555; + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + return ((x + (x >> 4) & 0xf0f0f0f) * 0x1010101) >> 24; +} +#endif /* HAS_BUILTIN_POPCOUNT */ + +/** + * Count trailing zeroes in a 32-bit integer, -1 for zero. + */ +static inline ALWAYS_INLINE G_CONST int +ctz(uint32 x) +#ifdef HAS_BUILTIN_CTZ +{ + return G_UNLIKELY(0 == x) ? -1 : __builtin_ctz(x); +} +#else /* !HAS_BUILTIN_CTZ */ +{ + uint32 c; + + if G_UNLIKELY(0 == x) + return -1; + + /* + * This code comes from + * http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious. + * + * It was designed by Matt Whitlock on January 25, 2006, and then + * further optimized by Andrew Shapira on September 5, 2007 (by setting + * c = 1 initially and then unconditionally subtracting at the end). + */ + + if (x & 1) { + c = 0; + } else { + c = 1; + if (0 == (x & 0xffff)) { + x >>= 16; + c += 16; + } + if (0 == (x & 0xff)) { + x >>= 8; + c += 8; + } + if (0 == (x & 0xf)) { + x >>= 4; + c += 4; + } + if (0 == (x & 0x3)) { + x >>= 2; + c += 2; + } + c -= x & 1; + } + + return c; +} +#endif /* HAS_BUILTIN_CTZ */ + +/** + * Count leading zeroes in a 32-bit integer, 32 for zero. + */ +static inline ALWAYS_INLINE G_CONST int +clz(uint32 x) +#ifdef HAS_BUILTIN_CLZ +{ + return G_UNLIKELY(0 == x) ? 32 : __builtin_clz(x); +} +#else /* !HAS_BUILTIN_CLZ */ +{ + x |= x >> 1; + x |= x >> 2; + x |= x >> 4; + x |= x >> 8; + x |= x >> 16; + return 32 - popcount(x); +} +#endif /* HAS_BUILTIN_CLZ */ + +#ifdef HAS_BUILTIN_POPCOUNT +/** + * @returns amount of bits set in a byte. + */ +static inline ALWAYS_INLINE G_CONST int +bits_set(uint8 b) +{ + return __builtin_popcount(b); +} +#else +int bits_set(uint8 b) G_PURE; +#endif /* HAS_BUILTIN_POPCOUNT */ + +/** + * @returns amount of bits set in a 32-bit value. + */ +static inline ALWAYS_INLINE G_CONST int +bits_set32(uint32 v) +{ + return popcount(v); +} + #endif /* _pow2_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/product.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/product.c
Changed
@@ -45,88 +45,114 @@ #include "override.h" /* Must be the last header included */ -static const char *product_name; -static const char *product_date; -static const char *product_version; -static const char *product_build; -static const char *product_revision; -static const char *product_interface; -static const char *product_website; -static guint8 product_major; -static guint8 product_minor; -static const char *product_revchar; -static guint8 product_patchlevel; +static struct product_info { + const char *p_name; + const char *p_nickname; + const char *p_date; + const char *p_version; + const char *p_build; + const char *p_revision; + const char *p_interface; + const char *p_website; + const char *p_revchar; + uint8 p_major; + uint8 p_minor; + uint8 p_patchlevel; +} product_info; /** * Get the product's name. */ const char * -product_get_name(void) +product_name(void) { - return product_name; + return product_info.p_name; +} + +/** + * Get the product's nickname. + * + * If no nickname was registered, use the product's name. + */ +const char * +product_nickname(void) +{ + if (product_info.p_nickname != NULL) + return product_info.p_nickname; + + return product_info.p_name; +} + +/** + * Set the product's nickname, hopefully a shorter name than the name itself. + */ +void +product_set_nickname(const char *name) +{ + product_info.p_nickname = name; } /** * Get version date string, as an ISO string. */ const char * -product_get_date(void) +product_date(void) { - return product_date; + return product_info.p_date; } /** * Get version string, a combination of major/minor/patchlevel and revchar. */ const char * -product_get_version(void) +product_version(void) { - return product_version; + return product_info.p_version; } /** * Get major version. */ -guint8 -product_get_major(void) +uint8 +product_major(void) { - return product_major; + return product_info.p_major; } /** * Get minor version. */ -guint8 -product_get_minor(void) +uint8 +product_minor(void) { - return product_minor; + return product_info.p_minor; } /** * Get revision character. */ -guint8 -product_get_revchar(void) +uint8 +product_revchar(void) { - return (guint8) product_revchar0; + return (uint8) product_info.p_revchar0; } /** * Get revision string. */ const char * -product_get_revision(void) +product_revision(void) { - return NULL == product_revision ? "" : product_revision; + return NULL == product_info.p_revision ? "" : product_info.p_revision; } /** * Get revision patchlevel. */ -guint8 -product_get_patchlevel(void) +uint8 +product_patchlevel(void) { - return product_patchlevel; + return product_info.p_patchlevel; } /** @@ -135,16 +161,16 @@ void product_set_interface(const char *iface) { - product_interface = iface; + product_info.p_interface = iface; } /** * Get the product's interface. */ const char * -product_get_interface(void) +product_interface(void) { - return NULL == product_interface ? "None" : product_interface; + return NULL == product_info.p_interface ? "None" : product_info.p_interface; } /** @@ -153,32 +179,32 @@ void product_set_website(const char *website) { - product_website = website; + product_info.p_website = website; } /** * Get the product's web site. */ const char * -product_get_website(void) +product_website(void) { - return NULL == product_website ? "" : product_website; + return NULL == product_info.p_website ? "" : product_info.p_website; } /** * Get build number. */ -guint32 -product_get_build(void) +uint32 +product_build(void) { - static guint32 build; - static gboolean initialized; + static uint32 build; + static bool initialized; if G_UNLIKELY(!initialized) { const char *p; initialized = TRUE; - p = is_strprefix(product_build, "$Revision: "); + p = is_strprefix(product_info.p_build, "$Revision: "); if (p) { int error; build = parse_uint32(p, NULL, 10, &error); @@ -191,13 +217,13 @@ * Get full build number string. */ const char * -product_get_build_full(void) +product_build_full(void) { - static char *result; + static const char *result; if G_UNLIKELY(NULL == result) { const char *p; - p = is_strprefix(product_build, "$Revision: "); + p = is_strprefix(product_info.p_build, "$Revision: "); if (p != NULL) { char *tmp; char *q; @@ -210,7 +236,7 @@ if (q != NULL) *q = '\0'; /* Truncate at first space */ - result = ostrdup(tmp); + result = ostrdup_readonly(tmp); HFREE_NULL(tmp); } else { result = ""; /* No change since last git tag */ @@ -223,21 +249,21 @@ /* * Initialize product information. */ -G_GNUC_COLD void +void G_COLD product_init(const char *name, - guint8 major, guint8 minor, guint8 patchlevel, const char *revchar, + uint8 major, uint8 minor, uint8 patchlevel, const char *revchar, const char *date, const char *version, const char *revision, const char *build) { - product_name = name; - product_major = major; - product_minor = minor; - product_patchlevel = patchlevel; - product_revchar = revchar; - product_date = date; - product_version = version; - product_revision = revision; - product_build = build; -} - + product_info.p_name = name; + product_info.p_major = major; + product_info.p_minor = minor; + product_info.p_patchlevel = patchlevel; + product_info.p_revchar = revchar; + product_info.p_date = date; + product_info.p_version = version; + product_info.p_revision = revision; + product_info.p_build = build; +} + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/product.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/product.h
Changed
@@ -39,24 +39,27 @@ */ void product_init(const char *name, - guint8 major, guint8 minor, guint8 patchlevel, const char *revchar, + uint8 major, uint8 minor, uint8 patchlevel, const char *revchar, const char *date, const char *version, const char *revision, const char *build); -const char *product_get_name(void) G_GNUC_PURE; -const char *product_get_date(void) G_GNUC_PURE; -const char *product_get_version(void) G_GNUC_PURE; -guint8 product_get_major(void) G_GNUC_PURE; -guint8 product_get_minor(void) G_GNUC_PURE; -guint8 product_get_revchar(void) G_GNUC_PURE; -const char *product_get_revision(void) G_GNUC_PURE; -guint8 product_get_patchlevel(void) G_GNUC_PURE; -guint32 product_get_build(void); -const char *product_get_build_full(void); +const char *product_name(void) G_PURE; +const char *product_nickname(void) G_PURE; +const char *product_date(void) G_PURE; +const char *product_version(void) G_PURE; +uint8 product_major(void) G_PURE; +uint8 product_minor(void) G_PURE; +uint8 product_revchar(void) G_PURE; +const char *product_revision(void) G_PURE; +uint8 product_patchlevel(void) G_PURE; +const char *product_build_full(void); +const char *product_interface(void); +const char *product_website(void); +uint32 product_build(void); + +void product_set_nickname(const char *nickname); void product_set_interface(const char *iface); -const char *product_get_interface(void); void product_set_website(const char *web); -const char *product_get_website(void); #endif /* _product_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/progname.c
Added
@@ -0,0 +1,515 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Program name management. + * + * This also adds getprogname() and setprogname() on systems that lack it. + * + * It also provides an important progstart() hook to capture the original + * main() arguments and perform manadatory low-level initializations on + * Windows platforms. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#include "common.h" + +#include "progname.h" + +#include "iovec.h" +#include "malloc.h" /* For real_malloc() */ +#include "mem.h" +#include "misc.h" /* For is_strcasesuffix() */ +#include "mutex.h" +#include "once.h" +#include "path.h" +#include "strvec.h" +#include "tm.h" +#include "vmm.h" +#include "xmalloc.h" + +#include "override.h" /* Must be the last header included */ + +static int progname_argc; +static char **progname_argv; + +extern char **environ; + +static struct { + const char *name; /* Current program name */ + bool allocated; /* Whether ``name'' was allocated */ + tm_t start; /* Time when progstart() was called */ +#ifndef HAS_SETPROCTITLE + char *argstart; /* Start of memory for setproctitle() */ + size_t arglen; /* Length of memory for setproctitle() */ +#endif + once_flag_t duplicated; /* Ensure duplication is done once */ + int argc; /* Amount of entries in duplicated argv */ + char **argv; /* Duplicated (read-only) argv */ + char **envp; /* Duplicated (read-only) envp */ +} progname_info; + +/** + * Save the original main() arguments and perform early initializations. + * + * @param argc the argument count, originally given to main() + * @param argv the argument vector, originally given to main() + */ +void +progstart(int argc, char * const *argv) +{ + g_assert(argc > 0); + g_assert(argv != NULL); + + g_return_unless(NULL == progname_argv); /* Should be called once only! */ + + progname_argc = argc; + progname_argv = deconstify_pointer(argv); + + progname_info.name = filepath_basename(argv0); + tm_current_time(&progname_info.start); + +#ifdef MINGW32 + mingw_early_init(); +#endif /* MINGW32 */ + + /* + * Because fd_preserve() can allocate memory and we are going to call + * this routine the first time we call mingw_backtrace(), via calls to + * mem_is_valid_ptr(), we need to ensure this table is already allocated. + * + * If is also useful on UNIX systems because the first time we're going + * to attempt to capture a backtrace, we'll call valid_ptr() through + * stacktrace_unwind() and we do not want memory allocation then either. + * + * Hence call mem_is_valid_ptr() now, which, as a side effect, will + * allocate the memory. + */ + + (void) mem_is_valid_ptr(NULL); + + /* + * On Windows, make sure there is no ugly trailing ".exe" at the end + * of the program name. + */ + + if (is_running_on_mingw()) { + const char *name = progname_info.name; + const char *exe = is_strcasesuffix(name, (size_t) -1, ".exe"); + + /* + * No need to take locks at this time, we're mono-threaded since + * progstart() needs to be one of the first application calls. + */ + + if (exe != NULL) { + progname_info.name = xstrndup(name, ptr_diff(exe, name)); + progname_info.allocated = TRUE; + } + } + +#ifdef HAS_SETPROGNAME + setprogname(progname_info.name); +#endif +} + +/** + * Ensure progstart() was called. + */ +static void +progstart_called(const char *routine) +{ + g_assert_log(progname_info.name != NULL, + "%s(): must not be called before progstart()", routine); +} + +/** + * When did the program start? + */ +tm_t +progstart_time(void) +{ + progstart_called(G_STRFUNC); + + return progname_info.start; +} + +/** + * Duplicate the original main() arguments + environment into read-only. + */ +static void +progstart_duplicate(void) +{ + size_t env_count, arg_count; + size_t env_size, arg_size; + size_t total_size, len; + void *p, *q; + char **argv; + char **envp; + + env_count = strvec_count(environ); + env_size = strvec_size(environ); + arg_count = progname_argc; + arg_size = strvec_size(progname_argv); + + len = total_size = (arg_count + env_count + 2) * sizeof(char *) + + env_size + arg_size; + + p = vmm_alloc_not_leaking(total_size); + argv = p; + envp = ptr_add_offset(argv, (arg_count + 1) * sizeof(char *)); + q = ptr_add_offset(envp, (env_count + 1) * sizeof(char *)); + + q = strvec_cpy(argv, progname_argv, arg_count, q, &len); + q = strvec_cpy(envp, environ, env_count, q, &len); + + g_assert(ptr_diff(q, p) == total_size); + + if (-1 == mprotect(p, total_size, PROT_READ)) + s_warning("%s(): cannot protect memory as read-only: %m", G_STRFUNC); + + progname_info.argc = arg_count; + progname_info.argv = argv; + progname_info.envp = envp; +} + +/** + * Duplicate the original main() arguments + environment into read-only + * memory, returning pointers to the argument vector, the environment and + * the size of the argument vector. + * + * The progstart() routine must be called first to record the original + * argument pointers and progstart_dup() must be called as soon as possible, + * before alteration of the argument list or the passed environment. + * + * @param argv_ptr where the allocated argment vector is returned + * @param envp_ptr where the allocated environment is returned + * + * @return the amount of entries in the returned argv + */ +int +progstart_dup(const char ***argv_ptr, const char ***envp_ptr) +{ + progstart_called(G_STRFUNC); + + ONCE_FLAG_RUN(progname_info.duplicated, progstart_duplicate); + + if (argv_ptr != NULL) + *argv_ptr = (const char **) progname_info.argv; + + if (envp_ptr != NULL) + *envp_ptr = (const char **) progname_info.envp; + + return progname_info.argc; +} + +/** + * Get original argument #n, NULL if out of boundaries. + */ +const char * +progstart_arg(int n) +{ + progstart_called(G_STRFUNC); + g_assert(n >= 0); + + ONCE_FLAG_RUN(progname_info.duplicated, progstart_duplicate); + + if (n >= progname_info.argc) + return NULL; + + return progname_info.argvn; +} + +#if !defined(HAS_GETPROGNAME) || !defined(HAS_SETPROGNAME) +static mutex_t progname_mtx = MUTEX_INIT; + +/* + * Use "fast" locks since these can be used very early in the process. + * + * We use mutexes and not simple locks in case there is some re-entrance + * due to the fact that setprogname() calls some other routines that could + * in turn need to call getprogname() for instance. + */ + +#define PROGNAME_LOCK mutex_lock_fast(&progname_mtx) +#define PROGNAME_UNLOCK mutex_unlock_fast(&progname_mtx) +#endif + +#ifndef HAS_GETPROGNAME +/** + * @return the program name (last path component if invoked with full path). + */ +const char * +getprogname(void) +{ + const char *name; + + progstart_called(G_STRFUNC); + + /* + * Need to take a lock since setprogname() is not atomic. + */ + + PROGNAME_LOCK; + name = progname_info.name; + PROGNAME_UNLOCK; + + return name; +} +#endif /* !HAS_GETPROGNAME */ + +#ifndef HAS_SETPROGNAME +/** + * Set program name. + * + * The given string is duplicated, hence it can be transient (held in a + * buffer on the stack). + * + * @param progname the program name we want to report via getprogname() + */ +void +setprogname(const char *name) +{ + char *oldname; + + progstart_called(G_STRFUNC); + g_assert(name != NULL); + + PROGNAME_LOCK; + + /* + * We protect ourselves against re-entrance from the same thread into + * the critical section in getprogname(): since we call an allocation + * routine, we do not know what could happen. + * + * Therefore we don't immediately free the old name, if it was allocated. + * We first install the new allocated name, then we free-up the old one, + * outside of the critical section. + */ + + if (progname_info.allocated) + oldname = deconstify_char(progname_info.name); + else + oldname = NULL; + + progname_info.allocated = TRUE; + + /* + * Avoid any trailing ".exe" at the end of the name on Windows. + */ + + if (is_running_on_mingw()) { + const char *exe = is_strcasesuffix(name, (size_t) -1, ".exe"); + if (exe != NULL) { + progname_info.name = xstrndup(name, ptr_diff(exe, name)); + goto done; + } + } + + progname_info.name = xstrdup(name); + +done: + PROGNAME_UNLOCK; + + if (oldname != NULL) + xfree(oldname); +} +#endif /* !HAS_SETPROGNAME */ + +/*** + *** Support routines for our setproctitle() implementation. + ***/ + +#ifndef HAS_SETPROCTITLE +static once_flag_t progname_args_saved; + +static void +progname_args_copy_strvec(char **strv) +{ + size_t i; + + for (i = 0; strvi != NULL; i++) + strvi = xstrdup(strvi); +} + +#ifdef HAS_SETENV +static void +progname_args_clearenv(void) +{ +#ifdef HAS_CLEARENV + clearenv(); +#else + char **env; + + env = real_malloc(sizeof *env); /* libc needs malloc() */ + env0 = NULL; + environ = env; +#endif +} + +static void +progname_args_copy_environ(void) +{ + char **env = environ; + size_t i; + + progname_args_clearenv(); + + for (i = 0; envi != NULL; i++) { + char *eq = strchr(envi, '='); + int r; + + if (eq != NULL) { + *eq = '\0'; + r = setenv(envi, eq + 1, TRUE); + *eq = '='; + if (-1 == r) { + s_warning("%s(): cannot insert \"%s\" into environment: %m", + G_STRFUNC, envi); + break; + } + } + } +} +#else /* !HAS_SETENV */ +static void +progname_args_copy_environ(void) +{ + progname_args_copy_strvec(environ); +} +#endif /* HAS_SETENV */ + +/** + * Save original program arguments and compute the contiguous space they + * were using, together with the original environment. + */ +static void +progname_args_save(void) +{ + size_t envc, n; + iovec_t *iov; + char *name; + + progstart_dup(NULL, NULL); /* Keep original! */ + + /* + * On platforms that have getprogname(), the string can point to the + * original argv0 which we're about to supersede. Duplicate it first. + */ + + name = xstrdup(getprogname()); + setprogname(name); + +#ifndef HAS_SETPROGNAME + xfree(name); /* Our implementation already duplicates */ +#endif + + /* + * The GNU libc keeps track of the program invocation name as well, + * which we must duplicate before superseding argv0. + */ + +#ifdef HAS_PROGRAM_INVOCATION_NAME + { + extern char *program_invocation_name; + extern char *program_invocation_short_name; + + name = xstrdup(program_invocation_name); + program_invocation_name = name; + program_invocation_short_name = + deconstify_char(filepath_basename(name)); + } +#endif /* HAS_PROGRAM_INVOCATION_NAME */ + + envc = strvec_count(environ); + n = progname_argc + envc; + + iov = iov_alloc_n(n); + iov_reset_n(iov, n); + + iov_init_from_string_vector(&iov0, n, + (char **) progname_argv, progname_argc); + + iov_init_from_string_vector(&iovprogname_argc, n - progname_argc, + environ, envc); + + progname_info.argstart = progname_argv0; + progname_info.arglen = iov_contiguous_size(iov, n); + + iov_free(iov); + + /* + * Since setproctitle() is going to write over the space used by the + * original arguments and the environment, we need to duplicate these + * value elsewhere in memory. + */ + + progname_args_copy_strvec((char **) progname_argv); + progname_args_copy_environ(); + + /* + * Scrap references to the original arguments, to make sure ps(1) + * cannot see them any more. + */ + + { + int i; + + for (i = 1; i < progname_argc; i++) + progname_argvi = NULL; + } +} + +/** + * @return the memory address where setproctitle() can start writing + */ +char * +progname_args_start(void) +{ + progstart_called(G_STRFUNC); + + ONCE_FLAG_RUN(progname_args_saved, progname_args_save); + + return progname_info.argstart; +} + +/** + * @return the length of the memory region where setproctitle() can write + */ +size_t +progname_args_size(void) +{ + progstart_called(G_STRFUNC); + + ONCE_FLAG_RUN(progname_args_saved, progname_args_save); + + return progname_info.arglen; +} +#endif /* !HAS_SETPROCTITLE */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/progname.h
Added
@@ -0,0 +1,67 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Program name management. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#ifndef _progname_h_ +#define _progname_h_ + +/* + * Protected interface. + */ + +#ifdef SETPROCTITLE_SOURCE +char *progname_args_start(void); +size_t progname_args_size(void); +#endif + +/* + * Public interface. + */ + +struct tmval; + +void progstart(int argc, char * const *argv); +struct tmval progstart_time(void); +int progstart_dup(const char ***argv_ptr, const char ***envp_ptr); +const char *progstart_arg(int n); + +#ifndef HAS_GETPROCNAME +const char *getprogname(void); +#endif + +#ifndef HAS_SETPROCNAME +void setprogname(const char *name); +#endif + +#endif /* _progname_h_ */ + +/* vi: set ts=4: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/prop.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/prop.c
Changed
@@ -1,5 +1,6 @@ /* * Copyright (c) 2001-2003, Richard Eckart + * Copyright (c) 2013, Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -23,23 +24,28 @@ #include "common.h" +#include "prop.h" + #include "ascii.h" #include "concat.h" -#include "getdate.h" -#include "prop.h" #include "debug.h" #include "file.h" -#include "glib-missing.h" +#include "getdate.h" #include "halloc.h" +#include "misc.h" +#include "mutex.h" #include "parse.h" #include "path.h" #include "product.h" +#include "pslist.h" #include "sha1.h" #include "str.h" #include "stringify.h" #include "timestamp.h" #include "tm.h" #include "walloc.h" +#include "xmalloc.h" + #include "override.h" /* Must be the last header included */ #define PROP_FILE_ID "_id" @@ -47,8 +53,14 @@ #define debug track_props static guint32 track_props = 0; /**< XXX need to init lib's props--RAM */ +#define PROP_SET_LOCK(s) spinlock_hidden(&s->lock) +#define PROP_SET_UNLOCK(s) spinunlock_hidden(&s->lock) + +#define PROP_DEF_LOCK(d) mutex_lock(&d->lock) +#define PROP_DEF_UNLOCK(d) mutex_unlock(&d->lock) + const struct { - const char *name; + const char *name; } prop_type_str = { { "boolean" }, { "guint32" }, @@ -65,12 +77,7 @@ ***/ #define prop_assert(ps, prop, x) \ -G_STMT_START { \ - if (!(x)) { \ - g_error("assertion failed for property \"%s\": %s", \ - PROP(ps, prop).name, #x); \ - } \ -} G_STMT_END + g_assert_log(x, "property \"%s\"", PROP(ps, prop).name) typedef int (* prop_parse_func_t)(const char *name, const char *str, const char **endptr, gpointer vec, size_t i); @@ -81,11 +88,10 @@ { int error; guint64 u; - + u = parse_uint64(str, endptr, 10, &error); if (error) { - g_warning("prop_parse_guint64: (prop=\"%s\") " - "str=\"%s\": \"%s\"", name, str, g_strerror(error)); + s_warning("%s(): (prop=\"%s\") str=\"%s\": %m", G_STRFUNC, name, str); } else if (vec) { ((guint64 *) vec)i = u; } @@ -104,8 +110,7 @@ u = parse_uint64(str, &ep, 10, &error); if (error) { - g_warning("prop_parse_timestamp: (prop=\"%s\") " - "str=\"%s\": \"%s\"", name, str, g_strerror(error)); + s_warning("%s(): (prop=\"%s\") str=\"%s\": %m", G_STRFUNC, name, str); } if (*ep != '-') { t = MIN(u + (time_t) 0, TIME_T_MAX + (guint64) 0); @@ -118,7 +123,7 @@ ep = strchr(str, ','); ep = ep ? ep : strchr(str, '\0'); } - + if (!error && vec) ((time_t *) vec)i = t; @@ -135,11 +140,10 @@ { int error; guint32 u; - + u = parse_uint32(str, endptr, 10, &error); if (error) { - g_warning("prop_parse_guint32: (prop=\"%s\") " - "str=\"%s\": \"%s\"", name, str, g_strerror(error)); + s_warning("%s(): (prop=\"%s\") str=\"%s\": %m", G_STRFUNC, name, str); } else if (vec) { ((guint32 *) vec)i = u; } @@ -154,14 +158,14 @@ host_addr_t addr; int error; const char *ep; - + g_assert(name); g_assert(str); ep = is_strprefix(str, "<none>"); if (ep) { error = 0; - addr = zero_host_addr; + addr = zero_host_addr; if (endptr) { *endptr = ep; } @@ -169,12 +173,11 @@ error = string_to_host_addr(str, endptr, &addr) ? 0 : EINVAL; } if (error) { - g_warning("prop_parse_ip: (prop=\"%s\") " - "str=\"%s\": \"%s\"", name, str, g_strerror(error)); + s_warning("%s(): (prop=\"%s\") str=\"%s\": %m", G_STRFUNC, name, str); } else if (vec) { ((host_addr_t *) vec)i = addr; } - + return error; } @@ -198,11 +201,11 @@ const char *p = NULL; guint j; int error = 0; - + g_assert(name); g_assert(str); - for (j = 0; j < G_N_ELEMENTS(tab); j++) { + for (j = 0; j < N_ITEMS(tab); j++) { if (NULL != (p = is_strcaseprefix(str, tabj.s))) { b = tabj.v; break; @@ -215,7 +218,8 @@ } if (error) { - g_warning("Not a boolean value (prop=\"%s\"): \"%s\"", name, str); + s_warning("%s(): (prop=\"%s\") " + "str=\"%s\": \"%s\"", G_STRFUNC, name, str, "Not a boolean value"); } else if (vec) { ((gboolean *) vec)i = b; } @@ -253,8 +257,7 @@ error = ('\0' != *endptr && ',' != *endptr) ? EINVAL : 0; if (error) - g_warning("prop_parse_vector: (prop=\"%s\") " - "str=\"%s\": \"%s\"", name, p, g_strerror(error)); + s_warning("%s(): (prop=\"%s\") str=\"%s\": %m", G_STRFUNC, name, p); p = strchr(endptr, ','); if (p) @@ -262,8 +265,8 @@ } if (i < size) - g_warning("prop_parse_vector: (prop=\"%s\") " - "target initialization incomplete!", name); + s_warning("%s(): (prop=\"%s\") " + "target initialization incomplete!", G_STRFUNC, name); } static void @@ -308,15 +311,16 @@ * * @return TRUE if the data was fully parsed. FALSE on failure. */ -static gboolean +static gboolean prop_parse_storage(const char *name, const char *str, size_t size, char *t) { size_t i; g_assert(size > 0); if (size * 2 != strlen(str)) { - g_warning("prop_parse_storage: (prop=\"%s\") " - "storage does not match requested size", name); + s_warning("%s(): (prop=\"%s\") %s (length=%zu, expected %zu): \"%s\"", + G_STRFUNC, name, "storage does not match requested size", + strlen(str), size * 2, str); return FALSE; } @@ -327,8 +331,8 @@ l = stri * 2 + 1; if (!is_ascii_xdigit(h) || !is_ascii_xdigit(l)) { ti = '\0'; - g_warning("prop_parse_storage: (prop=\"%s\") " - "storage is damaged: \"%s\"", name, str); + s_warning("%s(): (prop=\"%s\") " + "storage is damaged: \"%s\"", G_STRFUNC, name, str); return FALSE; } ti = (hex2int(h) << 4) + hex2int(l); @@ -343,6 +347,45 @@ ***/ /** + * Lock property. + */ +void +prop_lock(prop_set_t *ps, property_t p) +{ + prop_def_t *d; + + g_assert(ps != NULL); + + if (!prop_in_range(ps, p)) + g_error("%s(): unknown property %u", G_STRFUNC, p); + + d = &PROP(ps, p); + + mutex_lock(&d->lock); +} + +/** + * Unlock property. + */ +void +prop_unlock(prop_set_t *ps, property_t p) +{ + prop_def_t *d; + + g_assert(ps != NULL); + + if (!prop_in_range(ps, p)) + g_error("%s(): unknown property %u", G_STRFUNC, p); + + d = &PROP(ps, p); + + g_assert_log(mutex_is_owned(&d->lock), + "%s(): attempt to unlock property %u which is not owned", G_STRFUNC, p); + + mutex_unlock(&d->lock); +} + +/** * Copy the property definition from the property set and return it. * Use the prop_free_def call to free the memory again. A simple hfree * won't do, since there are lot's of pointers to allocated memory @@ -353,98 +396,93 @@ prop_def_t * prop_get_def(prop_set_t *ps, property_t p) { - prop_def_t *buf; + prop_def_t *d, *buf; g_assert(ps != NULL); if (!prop_in_range(ps, p)) - g_error("prop_get_def: unknown property %d", p); + g_error("%s(): unknown property %u", G_STRFUNC, p); - buf = wcopy(&PROP(ps, p), sizeof(prop_def_t)); - buf->name = h_strdup(PROP(ps, p).name); - buf->desc = h_strdup(PROP(ps, p).desc); + d = &PROP(ps, p); + + PROP_DEF_LOCK(d); + + buf = WCOPY(d); + buf->name = h_strdup(d->name); + buf->desc = h_strdup(d->desc); buf->ev_changed = NULL; + mutex_init(&buf->lock); switch (buf->type) { case PROP_TYPE_BOOLEAN: - buf->data.boolean.def = hcopy( - PROP(ps,p).data.boolean.def, - sizeof(gboolean) * PROP(ps,p).vector_size); - buf->data.boolean.value = hcopy( - PROP(ps,p).data.boolean.value, - sizeof(gboolean) * PROP(ps,p).vector_size); + buf->data.boolean.def = + HCOPY_ARRAY(d->data.boolean.def, d->vector_size); + buf->data.boolean.value = + HCOPY_ARRAY(d->data.boolean.value, d->vector_size); break; case PROP_TYPE_MULTICHOICE: { guint n = 0; - while (PROP(ps,p).data.guint32.choicesn.title != NULL) + while (d->data.guint32.choicesn.title != NULL) n++; n ++; /* Keep space for terminating {NULL, 0} field */ - buf->data.guint32.choices = hcopy( - PROP(ps,p).data.guint32.choices, - sizeof(prop_def_choice_t) * n); + buf->data.guint32.choices = HCOPY_ARRAY(d->data.guint32.choices, n); buf->data.guint32.choicesn-1.title = NULL; buf->data.guint32.choicesn-1.value = 0; n = 0; - while (PROP(ps,p).data.guint32.choicesn.title != NULL) { + while (d->data.guint32.choicesn.title != NULL) { buf->data.guint32.choicesn.title = - h_strdup(PROP(ps,p).data.guint32.choicesn.title); + h_strdup(d->data.guint32.choicesn.title); n++; } /* no break -> continue to PROP_TYPE_GUINT32 */ } case PROP_TYPE_GUINT32: - buf->data.guint32.def = hcopy( - PROP(ps,p).data.guint32.def, - sizeof(guint32) * PROP(ps,p).vector_size); - buf->data.guint32.value = hcopy( - PROP(ps,p).data.guint32.value, - sizeof(guint32) * PROP(ps,p).vector_size); + buf->data.guint32.def = + HCOPY_ARRAY(d->data.guint32.def, d->vector_size); + buf->data.guint32.value = + HCOPY_ARRAY(d->data.guint32.value, d->vector_size); break; case PROP_TYPE_GUINT64: - buf->data.guint64.def = hcopy( - PROP(ps,p).data.guint64.def, - sizeof(guint64) * PROP(ps,p).vector_size); - buf->data.guint64.value = hcopy( - PROP(ps,p).data.guint64.value, - sizeof(guint64) * PROP(ps,p).vector_size); + buf->data.guint64.def = + HCOPY_ARRAY(d->data.guint64.def, d->vector_size); + buf->data.guint64.value = + HCOPY_ARRAY(d->data.guint64.value, d->vector_size); break; case PROP_TYPE_TIMESTAMP: - buf->data.timestamp.def = hcopy( - PROP(ps,p).data.timestamp.def, - sizeof(time_t) * PROP(ps,p).vector_size); - buf->data.timestamp.value = hcopy( - PROP(ps,p).data.timestamp.value, - sizeof(time_t) * PROP(ps,p).vector_size); + buf->data.timestamp.def = + HCOPY_ARRAY(d->data.timestamp.def, d->vector_size); + buf->data.timestamp.value = + HCOPY_ARRAY(d->data.timestamp.value, d->vector_size); break; case PROP_TYPE_IP: - buf->data.ip.value = hcopy(PROP(ps,p).data.ip.value, - sizeof buf->data.ip.value * PROP(ps,p).vector_size); + buf->data.ip.value = HCOPY_ARRAY(d->data.ip.value, d->vector_size); break; case PROP_TYPE_STRING: buf->data.string.def = walloc(sizeof(char *)); - *buf->data.string.def = h_strdup(*PROP(ps,p).data.string.def); + *buf->data.string.def = h_strdup(*d->data.string.def); buf->data.string.value = walloc(sizeof(char *)); - *buf->data.string.value = h_strdup(*PROP(ps,p).data.string.value); + *buf->data.string.value = h_strdup(*d->data.string.value); break; case PROP_TYPE_STORAGE: - buf->data.storage.value = hcopy( - PROP(ps,p).data.storage.value, PROP(ps,p).vector_size); + buf->data.storage.value = hcopy(d->data.storage.value, d->vector_size); break; - + case NUM_PROP_TYPES: g_assert_not_reached(); } + PROP_DEF_UNLOCK(d); + return buf; } @@ -453,6 +491,8 @@ { g_assert(d != NULL); + mutex_destroy(&d->lock); + switch (d->type) { case PROP_TYPE_BOOLEAN: HFREE_NULL(d->data.boolean.value); @@ -521,120 +561,154 @@ prop_set_t *ps, property_t prop, prop_changed_listener_t l, gboolean init, enum frequency_type freq, guint32 interval) { - g_assert(ps != NULL); - g_assert(prop_in_range(ps, prop)); + prop_def_t *d; - event_add_subscriber( - PROP(ps,prop).ev_changed, (GCallback) l, freq, interval); + d = &PROP(ps, prop); + PROP_DEF_LOCK(d); + event_add_subscriber(d->ev_changed, (callback_fn_t) l, freq, interval); if (init) - (*l)(prop); + (*l)(prop); /* Listener always called with the property locked */ + + PROP_DEF_UNLOCK(d); } void prop_remove_prop_changed_listener( prop_set_t *ps, property_t prop, prop_changed_listener_t l) { - g_assert(ps != NULL); - g_assert(prop_in_range(ps, prop)); + prop_def_t *d; + + d = &PROP(ps, prop); - event_remove_subscriber(PROP(ps,prop).ev_changed, (GCallback) l); + PROP_DEF_LOCK(d); + event_remove_subscriber(d->ev_changed, (callback_fn_t) l); + PROP_DEF_UNLOCK(d); } +/* + * Invoke registered callbacks that trigger when the property is changed. + */ static void -prop_emit_prop_changed(prop_set_t *ps, property_t prop) +prop_emit_prop_changed(const prop_def_t *d, prop_set_t *ps, property_t prop) { - g_assert(ps != NULL); + assert_mutex_is_owned(&d->lock); + + /* + * Triggering of callbacks happen with the property definition locked + * by the thread. The callback does not need to bother with locking. + */ - event_trigger(PROP(ps,prop).ev_changed, - T_VETO(prop_changed_listener_t, (prop))); + event_trigger(d->ev_changed, T_VETO(prop_changed_listener_t, (prop))); - if (PROP(ps,prop).save) + if (d->save) { + PROP_SET_LOCK(ps); ps->dirty = TRUE; + PROP_SET_UNLOCK(ps); + } +} + +static void +prop_check_type(const prop_def_t *d, prop_type_t t, bool setting) +{ + /* + * For uint32 values, we can also have multi-choice (enum) properties. + */ + + if (PROP_TYPE_GUINT32 == t) { + if G_UNLIKELY(PROP_TYPE_MULTICHOICE == d->type) + return; + } + + if G_UNLIKELY(d->type != t) { + g_error("type mismatch %s value for property \"%s\": requesting " + " %s when actual property type is %s%s", + setting ? "setting" : "getting", + d->name, prop_type_strt.name, + PROP_TYPE_MULTICHOICE == d->type ? "(multichoice) " : "", + PROP_TYPE_MULTICHOICE == d->type ? + prop_type_strPROP_TYPE_GUINT32.name : + prop_type_strd->type.name); + } } void prop_set_boolean(prop_set_t *ps, property_t prop, const gboolean *src, size_t offset, size_t length) { - gboolean old; - gboolean new; - gboolean differ = FALSE; + prop_def_t *d; + gboolean old, new, differ = FALSE; size_t n; - g_assert(ps != NULL); g_assert(src != NULL); + d = &PROP(ps, prop); + + prop_check_type(d, PROP_TYPE_BOOLEAN, TRUE); - if (!prop_in_range(ps, prop)) - g_error("prop_set_boolean: unknown property %d", prop); - if (PROP(ps,prop).type != PROP_TYPE_BOOLEAN) - g_error("Type mismatch setting value for %s of type" - " %s when %s was expected", - PROP(ps,prop).name, - prop_type_strPROP(ps,prop).type.name, - prop_type_strPROP_TYPE_BOOLEAN.name); + if (0 == length) + length = d->vector_size; - if (length == 0) - length = PROP(ps,prop).vector_size; + prop_assert(ps, prop, offset + length <= d->vector_size); - prop_assert(ps, prop, offset + length <= PROP(ps,prop).vector_size); + PROP_DEF_LOCK(d); for (n = 0; (n < length) && !differ; n++) { - old = PROP(ps,prop).data.boolean.valuen + offset ? 1 : 0; + old = d->data.boolean.valuen + offset ? 1 : 0; new = srcn ? 1 : 0; if (old != new) differ = TRUE; } - if (!differ) + if (!differ) { + PROP_DEF_UNLOCK(d); return; + } - memcpy(&PROP(ps,prop).data.boolean.valueoffset, src, - length * sizeof *src); + memcpy(&d->data.boolean.valueoffset, src, length * sizeof *src); - if (debug >= 5) { + if G_UNLIKELY(debug >= 5) { size_t i; + str_t *s = str_new(120); - printf("updated property %s = ( ", PROP(ps,prop).name); + str_printf(s, "updated property %s = ( ", d->name); - for (i = 0; i < PROP(ps,prop).vector_size; i++) - printf("%s%s ", - PROP(ps,prop).data.boolean.valuei ? "TRUE" : "FALSE", - (i < (PROP(ps,prop).vector_size-1)) ? "," : ""); + for (i = 0; i < d->vector_size; i++) + str_catf(s, "%s%s ", + d->data.boolean.valuei ? "TRUE" : "FALSE", + i < d->vector_size - 1 ? "," : ""); - printf(")\n"); + str_putc(s, ')'); + s_debug("PROP %s", str_2c(s)); + str_destroy_null(&s); } - prop_emit_prop_changed(ps, prop); + prop_emit_prop_changed(d, ps, prop); + PROP_DEF_UNLOCK(d); } gboolean * prop_get_boolean(prop_set_t *ps, property_t prop, gboolean *t, size_t offset, size_t length) { + prop_def_t *d; gboolean *target; size_t n; - g_assert(ps != NULL); + d = &PROP(ps, prop); - if (!prop_in_range(ps, prop)) - g_error("prop_get_boolean: unknown property %d", prop); - if (PROP(ps,prop).type != PROP_TYPE_BOOLEAN) - g_error("Type mismatch setting value for %s of type" - " %s when %s was expected", - PROP(ps,prop).name, - prop_type_strPROP(ps,prop).type.name, - prop_type_strPROP_TYPE_BOOLEAN.name); + prop_check_type(d, PROP_TYPE_BOOLEAN, FALSE); - if (length == 0) - length = PROP(ps,prop).vector_size; + if (0 == length) + length = d->vector_size; - prop_assert(ps, prop, offset + length <= PROP(ps,prop).vector_size); + prop_assert(ps, prop, offset + length <= d->vector_size); n = length * sizeof *target; target = t != NULL ? (gpointer) t : g_malloc(n); - memcpy(target, &PROP(ps,prop).data.boolean.valueoffset, n); + PROP_DEF_LOCK(d); + memcpy(target, &d->data.boolean.valueoffset, n); + PROP_DEF_UNLOCK(d); return target; } @@ -643,112 +717,104 @@ prop_set_guint64(prop_set_t *ps, property_t prop, const guint64 *src, size_t offset, size_t length) { + prop_def_t *d; gboolean differ = FALSE; - g_assert(ps != NULL); - g_assert(src != NULL); + d = &PROP(ps, prop); - if (!prop_in_range(ps, prop)) - g_error("prop_set_guint64: unknown property %d", prop); - if ((PROP(ps,prop).type != PROP_TYPE_GUINT64) ) - g_error("Type mismatch setting value for %s of type" - " %s when %s was expected", - PROP(ps,prop).name, - prop_type_strPROP(ps,prop).type.name, - prop_type_strPROP_TYPE_GUINT64.name); + prop_check_type(d, PROP_TYPE_GUINT64, TRUE); - if (length == 0) - length = PROP(ps,prop).vector_size; + if (0 == length) + length = d->vector_size; - prop_assert(ps, prop, offset + length <= PROP(ps,prop).vector_size); + prop_assert(ps, prop, offset + length <= d->vector_size); - differ = 0 != memcmp(&PROP(ps,prop).data.guint64.valueoffset, src, + PROP_DEF_LOCK(d); + + differ = 0 != memcmp(&d->data.guint64.valueoffset, src, length * sizeof *src); - if (!differ) + if (!differ) { + PROP_DEF_UNLOCK(d); return; + } /* * Only do bounds-checking on non-vector properties. */ - if (PROP(ps,prop).vector_size == 1) { - /* - * Either check multiple choices or min/max. - */ - prop_assert(ps, prop, PROP(ps,prop).data.guint64.choices == NULL); - if ( - (PROP(ps,prop).data.guint64.min <= *src) && - (PROP(ps,prop).data.guint64.max >= *src) - ) { - *PROP(ps,prop).data.guint64.value = *src; - } else { - char buf64; - guint64 newval = *src; - - if (newval > PROP(ps,prop).data.guint64.max) - newval = PROP(ps,prop).data.guint64.max; - if (newval < PROP(ps,prop).data.guint64.min) - newval = PROP(ps,prop).data.guint64.min; - - concat_strings(buf, sizeof buf, - uint64_to_string(PROP(ps,prop).data.guint64.min), "/", - uint64_to_string2(PROP(ps,prop).data.guint64.max), - (void *) 0); - g_warning("prop_set_guint64: %s new value out of bounds " - "(%s): %s (adjusting to %s)", PROP(ps,prop).name, buf, - uint64_to_string(*src), uint64_to_string2(newval)); - - *PROP(ps,prop).data.guint64.value = newval; - } + if (1 == d->vector_size) { + prop_assert(ps, prop, d->data.guint64.choices == NULL); + + if (d->data.guint64.min <= *src && d->data.guint64.max >= *src) { + *d->data.guint64.value = *src; + } else { + char buf64; + guint64 newval = *src; + + if (newval > d->data.guint64.max) + newval = d->data.guint64.max; + if (newval < d->data.guint64.min) + newval = d->data.guint64.min; + + concat_strings(buf, sizeof buf, + uint64_to_string(d->data.guint64.min), "/", + uint64_to_string2(d->data.guint64.max), + NULL_PTR); + + g_carp("%s(): %s new value out of bounds " + "(%s): %s (adjusting to %s)", G_STRFUNC, d->name, buf, + uint64_to_string(*src), uint64_to_string2(newval)); + + *d->data.guint64.value = newval; + } } else { - memcpy(&PROP(ps,prop).data.guint64.valueoffset, src, - length * sizeof *src); + memcpy(&d->data.guint64.valueoffset, src, length * sizeof *src); } if (debug >= 5) { size_t n; + str_t *s = str_new(120); - printf("updated property %s = ( ", PROP(ps,prop).name); + str_printf(s, "updated property %s = ( ", d->name); - for (n = 0; n < PROP(ps,prop).vector_size; n++) { - printf("%s%s ", - uint64_to_string(PROP(ps,prop).data.guint64.valuen), - n < (PROP(ps,prop).vector_size-1) ? "," : ""); + for (n = 0; n < d->vector_size; n++) { + str_catf(s, "%s%s ", + uint64_to_string(d->data.guint64.valuen), + n < d->vector_size - 1 ? "," : ""); } - printf(")\n"); + str_putc(s, ')'); + s_debug("PROP %s", str_2c(s)); + str_destroy_null(&s); } - prop_emit_prop_changed(ps, prop); + prop_emit_prop_changed(d, ps, prop); + PROP_DEF_UNLOCK(d); } guint64 * prop_get_guint64(prop_set_t *ps, property_t prop, guint64 *t, size_t offset, size_t length) { + prop_def_t *d; guint64 *target; size_t n; - g_assert(ps != NULL); + d = &PROP(ps, prop); - if (!prop_in_range(ps, prop)) - g_error("prop_get_guint64: unknown property %d", prop); - if ((PROP(ps,prop).type != PROP_TYPE_GUINT64)) - g_error("Type mismatch setting value for %s of type" - " %s when %s was expected", - PROP(ps,prop).name, - prop_type_strPROP(ps,prop).type.name, - prop_type_strPROP_TYPE_GUINT64.name); + prop_check_type(d, PROP_TYPE_GUINT64, FALSE); - if (length == 0) - length = PROP(ps,prop).vector_size; + if (0 == length) + length = d->vector_size; - prop_assert(ps, prop, offset + length <= PROP(ps,prop).vector_size); + prop_assert(ps, prop, offset + length <= d->vector_size); n = length * sizeof *target; target = t != NULL ? (gpointer) t : g_malloc(n); - memcpy(target, &PROP(ps,prop).data.guint64.valueoffset, n); + PROP_DEF_LOCK(d); + memcpy(target, &d->data.guint64.valueoffset, n); + PROP_DEF_UNLOCK(d); return target; } @@ -757,108 +823,104 @@ prop_set_guint32(prop_set_t *ps, property_t prop, const guint32 *src, size_t offset, size_t length) { + prop_def_t *d; gboolean differ = FALSE; - g_assert(ps != NULL); g_assert(src != NULL); - if (!prop_in_range(ps, prop)) - g_error("prop_set_guint32: unknown property %d", prop); - if ((PROP(ps,prop).type != PROP_TYPE_GUINT32) && - (PROP(ps,prop).type != PROP_TYPE_MULTICHOICE) ) - g_error("Type mismatch setting value for %s of type" - " %s when %s or %s was expected", - PROP(ps,prop).name, - prop_type_strPROP(ps,prop).type.name, - prop_type_strPROP_TYPE_GUINT32.name, - prop_type_strPROP_TYPE_MULTICHOICE.name); + d = &PROP(ps, prop); + + prop_check_type(d, PROP_TYPE_GUINT32, TRUE); - if (length == 0) - length = PROP(ps,prop).vector_size; + if (0 == length) + length = d->vector_size; - prop_assert(ps, prop, offset + length <= PROP(ps,prop).vector_size); + prop_assert(ps, prop, offset + length <= d->vector_size); - differ = 0 != memcmp(&PROP(ps,prop).data.guint32.valueoffset, src, + PROP_DEF_LOCK(d); + + differ = 0 != memcmp(&d->data.guint32.valueoffset, src, length * sizeof *src); - if (!differ) + if (!differ) { + PROP_DEF_UNLOCK(d); return; + } /* * Only do bounds-checking on non-vector properties. */ - if (PROP(ps,prop).vector_size == 1) { + + if (1 == d->vector_size) { /* * Either check multiple choices or min/max. */ - if (PROP(ps,prop).type == PROP_TYPE_MULTICHOICE) { + + if (PROP_TYPE_MULTICHOICE == d->type) { guint n; gboolean invalid = TRUE; guint32 newval = *src; - prop_assert(ps, prop, PROP(ps,prop).data.guint32.choices != NULL); + prop_assert(ps, prop, d->data.guint32.choices != NULL); - for (n = 0; PROP(ps,prop).data.guint32.choicesn.title; n++) { - if (PROP(ps,prop).data.guint32.choicesn.value == newval) { + for (n = 0; d->data.guint32.choicesn.title; n++) { + if (d->data.guint32.choicesn.value == newval) { invalid = FALSE; break; } } if (invalid) { - g_warning("prop_set_guint32: %s new value is invalid choice " + s_warning("%s(): %s new value is invalid choice " "%u (leaving at %u)", - PROP(ps,prop).name, newval, - *PROP(ps,prop).data.guint32.value); + G_STRFUNC, d->name, newval, *d->data.guint32.value); } else { - *PROP(ps,prop).data.guint32.value = newval; + *d->data.guint32.value = newval; } } else { + prop_assert(ps, prop, d->data.guint32.choices == NULL); - prop_assert(ps, prop, PROP(ps,prop).data.guint32.choices == NULL); - - if ( - (PROP(ps,prop).data.guint32.min <= *src) && - (PROP(ps,prop).data.guint32.max >= *src) - ) { - *PROP(ps,prop).data.guint32.value = *src; + if (d->data.guint32.min <= *src && d->data.guint32.max >= *src) { + *d->data.guint32.value = *src; } else { guint32 newval = *src; - if (newval > PROP(ps,prop).data.guint32.max) - newval = PROP(ps,prop).data.guint32.max; - if (newval < PROP(ps,prop).data.guint32.min) - newval = PROP(ps,prop).data.guint32.min; + if (newval > d->data.guint32.max) + newval = d->data.guint32.max; + if (newval < d->data.guint32.min) + newval = d->data.guint32.min; - g_warning("prop_set_guint32: %s new value out of bounds " + g_carp("%s(): %s new value out of bounds " "(%u/%u): %u (adjusting to %u)", - PROP(ps,prop).name, - PROP(ps,prop).data.guint32.min, - PROP(ps,prop).data.guint32.max, - *src, newval ); + G_STRFUNC, d->name, + d->data.guint32.min, d->data.guint32.max, + *src, newval); - *PROP(ps,prop).data.guint32.value = newval; + *d->data.guint32.value = newval; } } } else { - memcpy(&PROP(ps,prop).data.guint32.valueoffset, src, - length * sizeof *src); + memcpy(&d->data.guint32.valueoffset, src, length * sizeof *src); } if (debug >= 5) { size_t n; + str_t *s = str_new(120); - printf("updated property %s = ( ", PROP(ps,prop).name); + str_printf(s, "updated property %s = ( ", d->name); - for (n = 0; n < PROP(ps,prop).vector_size; n++) { - printf("%u%s ", PROP(ps,prop).data.guint32.valuen, - (n < (PROP(ps,prop).vector_size-1)) ? "," : ""); + for (n = 0; n < d->vector_size; n++) { + str_catf(s, "%u%s ", d->data.guint32.valuen, + n < d->vector_size - 1 ? "," : ""); } - printf(")\n"); + str_putc(s, ')'); + s_debug("PROP %s", str_2c(s)); + str_destroy_null(&s); } - prop_emit_prop_changed(ps, prop); + prop_emit_prop_changed(d, ps, prop); + PROP_DEF_UNLOCK(d); } guint32 * @@ -867,28 +929,22 @@ { guint32 *target; size_t n; + prop_def_t *d; - g_assert(ps != NULL); + d = &PROP(ps, prop); - if (!prop_in_range(ps, prop)) - g_error("prop_get_guint32: unknown property %d", prop); - if ((PROP(ps,prop).type != PROP_TYPE_GUINT32) && - (PROP(ps,prop).type != PROP_TYPE_MULTICHOICE) ) - g_error("Type mismatch setting value for %s of type" - " %s when %s or %s was expected", - PROP(ps,prop).name, - prop_type_strPROP(ps,prop).type.name, - prop_type_strPROP_TYPE_GUINT32.name, - prop_type_strPROP_TYPE_MULTICHOICE.name); + prop_check_type(d, PROP_TYPE_GUINT32, FALSE); - if (length == 0) - length = PROP(ps,prop).vector_size; + if (0 == length) + length = d->vector_size; - prop_assert(ps, prop, offset + length <= PROP(ps,prop).vector_size); + prop_assert(ps, prop, offset + length <= d->vector_size); n = length * sizeof *target; target = t != NULL ? (gpointer) t : g_malloc(n); - memcpy(target, &PROP(ps,prop).data.guint32.valueoffset, n); + PROP_DEF_LOCK(d); + memcpy(target, &d->data.guint32.valueoffset, n); + PROP_DEF_UNLOCK(d); return target; } @@ -897,84 +953,82 @@ prop_set_timestamp(prop_set_t *ps, property_t prop, const time_t *src, size_t offset, size_t length) { + prop_def_t *d; gboolean differ = FALSE; - g_assert(ps != NULL); g_assert(src != NULL); - if (!prop_in_range(ps, prop)) - g_error("prop_set_timestamp: unknown property %d", prop); - if ((PROP(ps,prop).type != PROP_TYPE_TIMESTAMP) ) - g_error("Type mismatch setting value for %s of type" - " %s when %s was expected", - PROP(ps,prop).name, - prop_type_strPROP(ps,prop).type.name, - prop_type_strPROP_TYPE_TIMESTAMP.name); + d = &PROP(ps, prop); + + prop_check_type(d, PROP_TYPE_TIMESTAMP, TRUE); + + if (0 == length) + length = d->vector_size; - if (length == 0) - length = PROP(ps,prop).vector_size; + prop_assert(ps, prop, offset + length <= d->vector_size); - prop_assert(ps, prop, offset + length <= PROP(ps,prop).vector_size); + PROP_DEF_LOCK(d); - differ = 0 != memcmp(&PROP(ps,prop).data.timestamp.valueoffset, src, + differ = 0 != memcmp(&d->data.timestamp.valueoffset, src, length * sizeof *src); - if (!differ) + if (!differ) { + PROP_DEF_UNLOCK(d); return; + } /* * Only do bounds-checking on non-vector properties. */ - if (PROP(ps,prop).vector_size == 1) { - /* - * Either check multiple choices or min/max. - */ - prop_assert(ps, prop, PROP(ps,prop).data.timestamp.choices == NULL); - if ( - (PROP(ps,prop).data.timestamp.min <= *src) && - (PROP(ps,prop).data.timestamp.max >= *src) - ) { - *PROP(ps,prop).data.timestamp.value = *src; - } else { - char buf64; - time_t newval = *src; - - if (newval > PROP(ps,prop).data.timestamp.max) - newval = PROP(ps,prop).data.timestamp.max; - if (newval < PROP(ps,prop).data.timestamp.min) - newval = PROP(ps,prop).data.timestamp.min; - - concat_strings(buf, sizeof buf, - uint64_to_string(PROP(ps,prop).data.timestamp.min), "/", - uint64_to_string2(PROP(ps,prop).data.timestamp.max), - (void *) 0); - g_warning("prop_set_timestamp: %s new value out of bounds " - "(%s): %s (adjusting to %s)", PROP(ps,prop).name, buf, - uint64_to_string(*src), uint64_to_string2(newval)); - - *PROP(ps,prop).data.timestamp.value = newval; - } + if (1 == d->vector_size) { + prop_assert(ps, prop, d->data.timestamp.choices == NULL); + + if (d->data.timestamp.min <= *src && d->data.timestamp.max >= *src) { + *d->data.timestamp.value = *src; + } else { + char buf64; + time_t newval = *src; + + if (newval > d->data.timestamp.max) + newval = d->data.timestamp.max; + if (newval < d->data.timestamp.min) + newval = d->data.timestamp.min; + + concat_strings(buf, sizeof buf, + timestamp_to_string(d->data.timestamp.min), "/", + timestamp_to_string2(d->data.timestamp.max), + NULL_PTR); + + g_carp("%s(): %s new value out of bounds " + "(%s): %s (adjusting to %s)", G_STRFUNC, d->name, buf, + timestamp_to_string(*src), timestamp_to_string2(newval)); + + *d->data.timestamp.value = newval; + } } else { - memcpy(&PROP(ps,prop).data.timestamp.valueoffset, src, - length * sizeof *src); + memcpy(&d->data.timestamp.valueoffset, src, length * sizeof *src); } if (debug >= 5) { size_t n; + str_t *s = str_new(120); - printf("updated property %s = ( ", PROP(ps,prop).name); + str_printf(s, "updated property %s = ( ", d->name); - for (n = 0; n < PROP(ps,prop).vector_size; n++) { - printf("%s%s ", - uint64_to_string(PROP(ps,prop).data.timestamp.valuen), - n < (PROP(ps,prop).vector_size-1) ? "," : ""); + for (n = 0; n < d->vector_size; n++) { + str_catf(s, "%s%s ", + timestamp_to_string(d->data.timestamp.valuen), + n < d->vector_size - 1 ? "," : ""); } - printf(")\n"); + str_putc(s, ')'); + s_debug("PROP %s", str_2c(s)); + str_destroy_null(&s); } - prop_emit_prop_changed(ps, prop); + prop_emit_prop_changed(d, ps, prop); + PROP_DEF_UNLOCK(d); } time_t * @@ -983,26 +1037,22 @@ { time_t *target; size_t n; + prop_def_t *d; - g_assert(ps != NULL); + d = &PROP(ps, prop); - if (!prop_in_range(ps, prop)) - g_error("prop_get_timestamp: unknown property %d", prop); - if ((PROP(ps,prop).type != PROP_TYPE_TIMESTAMP)) - g_error("Type mismatch setting value for %s of type" - " %s when %s was expected", - PROP(ps,prop).name, - prop_type_strPROP(ps,prop).type.name, - prop_type_strPROP_TYPE_TIMESTAMP.name); + prop_check_type(d, PROP_TYPE_TIMESTAMP, FALSE); - if (length == 0) - length = PROP(ps,prop).vector_size; + if (0 == length) + length = d->vector_size; - prop_assert(ps, prop, offset + length <= PROP(ps,prop).vector_size); + prop_assert(ps, prop, offset + length <= d->vector_size); n = length * sizeof *target; target = t != NULL ? (gpointer) t : g_malloc(n); - memcpy(target, &PROP(ps,prop).data.timestamp.valueoffset, n); + PROP_DEF_LOCK(d); + memcpy(target, &d->data.timestamp.valueoffset, n); + PROP_DEF_UNLOCK(d); return target; } @@ -1012,50 +1062,49 @@ size_t offset, size_t length) { gboolean differ = FALSE; + prop_def_t *d; - g_assert(ps != NULL); g_assert(src != NULL); - if (!prop_in_range(ps, prop)) - g_error("prop_set_ip: unknown property %d", prop); - if ((PROP(ps,prop).type != PROP_TYPE_IP) ) - g_error("Type mismatch setting value for %s of type" - " %s when %s was expected", - PROP(ps,prop).name, - prop_type_strPROP(ps,prop).type.name, - prop_type_strPROP_TYPE_IP.name); + d = &PROP(ps, prop); - if (length == 0) - length = PROP(ps,prop).vector_size; + prop_check_type(d, PROP_TYPE_IP, TRUE); - prop_assert(ps, prop, offset + length <= PROP(ps,prop).vector_size); + if (0 == length) + length = d->vector_size; - differ = 0 != memcmp(&PROP(ps,prop).data.ip.valueoffset, src, - length * sizeof *src); + prop_assert(ps, prop, offset + length <= d->vector_size); - if (!differ) + PROP_DEF_LOCK(d); + + differ = 0 != memcmp(&d->data.ip.valueoffset, src, length * sizeof *src); + + if (!differ) { + PROP_DEF_UNLOCK(d); return; + } - /* - * Only do bounds-checking on non-vector properties. - */ - memcpy(&PROP(ps,prop).data.ip.valueoffset, src, length * sizeof *src); + memcpy(&d->data.ip.valueoffset, src, length * sizeof *src); if (debug >= 5) { size_t n; + str_t *s = str_new(120); - printf("updated property %s = ( ", PROP(ps,prop).name); + str_printf(s, "updated property %s = ( ", d->name); - for (n = 0; n < PROP(ps,prop).vector_size; n++) { - printf("%s%s ", - host_addr_to_string(PROP(ps,prop).data.ip.valuen), - n < (PROP(ps,prop).vector_size-1) ? "," : ""); + for (n = 0; n < d->vector_size; n++) { + str_catf(s, "%s%s ", + host_addr_to_string(d->data.ip.valuen), + n < d->vector_size - 1 ? "," : ""); } - printf(")\n"); + str_putc(s, ')'); + s_debug("PROP %s", str_2c(s)); + str_destroy_null(&s); } - prop_emit_prop_changed(ps, prop); + prop_emit_prop_changed(d, ps, prop); + PROP_DEF_UNLOCK(d); } @@ -1063,28 +1112,24 @@ prop_get_ip(prop_set_t *ps, property_t prop, host_addr_t *t, size_t offset, size_t length) { + prop_def_t *d; host_addr_t *target; size_t n; - g_assert(ps != NULL); + d = &PROP(ps, prop); - if (!prop_in_range(ps, prop)) - g_error("prop_get_ip: unknown property %d", prop); - if ((PROP(ps,prop).type != PROP_TYPE_IP)) - g_error("Type mismatch setting value for %s of type" - " %s when %s was expected", - PROP(ps,prop).name, - prop_type_strPROP(ps,prop).type.name, - prop_type_strPROP_TYPE_IP.name); + prop_check_type(d, PROP_TYPE_IP, FALSE); - if (length == 0) - length = PROP(ps,prop).vector_size; + if (0 == length) + length = d->vector_size; - prop_assert(ps, prop, offset + length <= PROP(ps,prop).vector_size); + prop_assert(ps, prop, offset + length <= d->vector_size); n = length * sizeof *target; target = t != NULL ? (gpointer) t : g_malloc(n); - memcpy(target, &PROP(ps,prop).data.ip.valueoffset, n); + PROP_DEF_LOCK(d); + memcpy(target, &d->data.ip.valueoffset, n); + PROP_DEF_UNLOCK(d); return target; } @@ -1094,59 +1139,54 @@ prop_set_storage(prop_set_t *ps, property_t prop, const char *src, size_t length) { + prop_def_t *d; gboolean differ = FALSE; - g_assert(ps != NULL); g_assert(src != NULL); - if (!prop_in_range(ps, prop)) - g_error("prop_set_storage: unknown property %d", prop); - if (PROP(ps,prop).type != PROP_TYPE_STORAGE) - g_error("Type mismatch setting value for %s of type" - " %s when %s was expected", - PROP(ps,prop).name, - prop_type_strPROP(ps,prop).type.name, - prop_type_strPROP_TYPE_STORAGE.name); + d = &PROP(ps, prop); - prop_assert(ps, prop, length == PROP(ps,prop).vector_size); + prop_check_type(d, PROP_TYPE_STORAGE, TRUE); - differ = 0 != memcmp(PROP(ps,prop).data.storage.value, src, length); + prop_assert(ps, prop, length == d->vector_size); - if (!differ) + PROP_DEF_LOCK(d); + + differ = 0 != memcmp(d->data.storage.value, src, length); + + if (!differ) { + PROP_DEF_UNLOCK(d); return; + } - memcpy(PROP(ps,prop).data.storage.value, src, length); + memcpy(d->data.storage.value, src, length); if (debug >= 5) { - printf("updated property %s (binary)\n", PROP(ps,prop).name); - dump_hex(stderr, PROP(ps,prop).name, - (const char *) PROP(ps,prop).data.storage.value, - PROP(ps,prop).vector_size); + s_debug("PROP updated property %s (binary):", d->name); + dump_hex(stderr, d->name, + (const char *) d->data.storage.value, d->vector_size); } - prop_emit_prop_changed(ps, prop); + prop_emit_prop_changed(d, ps, prop); + PROP_DEF_UNLOCK(d); } char * prop_get_storage(prop_set_t *ps, property_t prop, char *t, size_t length) { + prop_def_t *d; gpointer target; - g_assert(ps != NULL); + d = &PROP(ps, prop); - if (!prop_in_range(ps, prop)) - g_error("prop_get_storage: unknown property %d", prop); - if (PROP(ps,prop).type != PROP_TYPE_STORAGE) - g_error("Type mismatch getting value for %s of type" - " %s when %s was expected", - PROP(ps,prop).name, - prop_type_strPROP(ps,prop).type.name, - prop_type_strPROP_TYPE_STORAGE.name); + prop_check_type(d, PROP_TYPE_STORAGE, FALSE); - prop_assert(ps, prop, length == PROP(ps,prop).vector_size); + prop_assert(ps, prop, length == d->vector_size); target = t != NULL ? (gpointer) t : g_malloc(length); - memcpy(target, PROP(ps,prop).data.storage.value, length); + PROP_DEF_LOCK(d); + memcpy(target, d->data.storage.value, length); + PROP_DEF_UNLOCK(d); return target; } @@ -1154,55 +1194,51 @@ const char * prop_get_storage_const(prop_set_t *ps, property_t prop) { - g_assert(ps != NULL); + prop_def_t *d; + + d = &PROP(ps, prop); - if (!prop_in_range(ps, prop)) - g_error("prop_get_storage: unknown property %d", prop); - if (PROP(ps,prop).type != PROP_TYPE_STORAGE) - g_error("Type mismatch getting value for %s of type" - " %s when %s was expected", - PROP(ps,prop).name, - prop_type_strPROP(ps,prop).type.name, - prop_type_strPROP_TYPE_STORAGE.name); + prop_check_type(d, PROP_TYPE_STORAGE, FALSE); - return PROP(ps,prop).data.storage.value; + return d->data.storage.value; } void prop_set_string(prop_set_t *ps, property_t prop, const char *val) { + prop_def_t *d; char *old; gboolean differ = FALSE; - g_assert(ps != NULL); + d = &PROP(ps, prop); - if (!prop_in_range(ps, prop)) - g_error("prop_get_gchar: unknown property %d", prop); - if (PROP(ps,prop).type != PROP_TYPE_STRING) - g_error("Type mismatch getting value for %s of type" - " %s when %s was expected", - PROP(ps,prop).name, - prop_type_strPROP(ps,prop).type.name, - prop_type_strPROP_TYPE_STRING.name); + prop_check_type(d, PROP_TYPE_STRING, TRUE); - prop_assert(ps, prop, PROP(ps,prop).vector_size == 1); + prop_assert(ps, prop, d->vector_size == 1); - old = *PROP(ps,prop).data.string.value; + PROP_DEF_LOCK(d); + + old = *d->data.string.value; if (old && val) { differ = 0 != strcmp(old, val); } else { differ = old != val; } - *PROP(ps,prop).data.string.value = g_strdup(val); + + if (!differ) { + PROP_DEF_UNLOCK(d); + return; + } + + *d->data.string.value = g_strdup(val); G_FREE_NULL(old); - if (differ && debug >= 5) - printf("updated property %s = \"%s\"\n", - PROP(ps,prop).name, - NULL_STRING(*PROP(ps,prop).data.string.value)); + if (debug >= 5) + s_debug("PROP updated property %s = \"%s\"", + d->name, NULL_STRING(*d->data.string.value)); - if (differ) - prop_emit_prop_changed(ps, prop); + prop_emit_prop_changed(d, ps, prop); + PROP_DEF_UNLOCK(d); } /** @@ -1218,22 +1254,19 @@ char * prop_get_string(prop_set_t *ps, property_t prop, char *t, size_t size) { + prop_def_t *d; char *target; char *s; - g_assert(ps != NULL); g_assert(NULL == t || size > 0); - if (!prop_in_range(ps, prop)) - g_error("prop_get_gchar: unknown property %d", prop); - if (PROP(ps,prop).type != PROP_TYPE_STRING) - g_error("Type mismatch getting value for %s of type" - " %s when %s was expected", - PROP(ps,prop).name, - prop_type_strPROP(ps,prop).type.name, - prop_type_strPROP_TYPE_STRING.name); + d = &PROP(ps, prop); - s = *PROP(ps,prop).data.string.value; + prop_check_type(d, PROP_TYPE_STRING, FALSE); + + PROP_DEF_LOCK(d); + + s = *d->data.string.value; target = t; if (target == NULL) { @@ -1253,10 +1286,34 @@ } } + PROP_DEF_UNLOCK(d); return target; } /** + * Copy string property to supplied str_t. + */ +static void +prop_string_copy(prop_set_t *ps, property_t prop, str_t *s) +{ + prop_def_t *d; + char *v; + + str_check(s); + + d = &PROP(ps, prop); + + prop_check_type(d, PROP_TYPE_STRING, FALSE); + + PROP_DEF_LOCK(d); + + v = *d->data.string.value; + str_cpy(s, v != NULL ? v : ""); + + PROP_DEF_UNLOCK(d); +} + +/** * Fetch the property name in the config files. * * @return The human-readable name of the property. There is not need @@ -1270,6 +1327,17 @@ } /** + * Fetch the property type in the config files. + * + * @return property type code. + */ +prop_type_t +prop_type(prop_set_t *ps, property_t prop) +{ + return PROP(ps,prop).type; +} + +/** * Fetch the property description in the config files. * * @return The human-readable name of the property. There is not need @@ -1293,7 +1361,7 @@ prop_type_to_string(prop_set_t *ps, property_t prop) { g_assert(PROP(ps,prop).type < NUM_PROP_TYPES); - STATIC_ASSERT(NUM_PROP_TYPES == G_N_ELEMENTS(prop_type_str)); + STATIC_ASSERT(NUM_PROP_TYPES == N_ITEMS(prop_type_str)); return prop_type_strPROP(ps,prop).type.name; } @@ -1303,97 +1371,167 @@ return PROP(ps,prop).save; } +gboolean +prop_is_internal(prop_set_t *ps, property_t prop) +{ + return PROP(ps,prop).internal; +} + /** * Fetches the value of property as a string. */ const char * prop_to_string(prop_set_t *ps, property_t prop) { - static char s4096; - - g_assert(ps != NULL); + prop_def_t *d; + str_t *s = str_private(G_STRFUNC, 128); + size_t n; - if (!prop_in_range(ps, prop)) - g_error("prop_get_gchar: unknown property %u", prop); + d = &PROP(ps, prop); - switch (PROP(ps,prop).type) { + switch (d->type) { case PROP_TYPE_GUINT32: - { - guint32 val; + str_reset(s); + if (d->vector_size != 1) + str_putc(s, ''); + + for (n = 0; n < d->vector_size; n++) { + char bufUINT32_DEC_BUFLEN; + uint32 val; - prop_get_guint32(ps, prop, &val, 0, 1); - uint32_to_string_buf(val, s, sizeof s); + if (n != 0) + STR_CAT(s, ", "); + + prop_get_guint32(ps, prop, &val, n, 1); + uint32_to_string_buf(val, buf, sizeof buf); + str_cat(s, buf); } - break; + + if (d->vector_size != 1) + str_putc(s, ''); + goto done; case PROP_TYPE_GUINT64: - { - guint64 val; + str_reset(s); + if (d->vector_size != 1) + str_putc(s, ''); + + for (n = 0; n < d->vector_size; n++) { + char bufUINT64_DEC_BUFLEN; + uint64 val; - prop_get_guint64(ps, prop, &val, 0, 1); - uint64_to_string_buf(val, s, sizeof s); + if (n != 0) + STR_CAT(s, ", "); + + prop_get_guint64(ps, prop, &val, n, 1); + uint64_to_string_buf(val, buf, sizeof buf); + str_cat(s, buf); } - break; + + if (d->vector_size != 1) + str_putc(s, ''); + goto done; case PROP_TYPE_TIMESTAMP: - { + str_reset(s); + if (d->vector_size != 1) + str_putc(s, ''); + + for (n = 0; n < d->vector_size; n++) { + char bufTIMESTAMP_BUFLEN; time_t val; - prop_get_timestamp(ps, prop, &val, 0, 1); - timestamp_to_string_buf(val, s, sizeof s); + if (n != 0) + STR_CAT(s, ", "); + + prop_get_timestamp(ps, prop, &val, n, 1); + timestamp_to_string_buf(val, buf, sizeof buf); + str_cat(s, buf); } - break; + + if (d->vector_size != 1) + str_putc(s, ''); + goto done; case PROP_TYPE_STRING: - prop_get_string(ps, prop, s, sizeof s); - break; + prop_string_copy(ps, prop, s); + goto done; case PROP_TYPE_IP: - { + str_reset(s); + if (d->vector_size != 1) + str_putc(s, ''); + + for (n = 0; n < d->vector_size; n++) { + char bufIPV6_ADDR_BUFLEN; /* Assume the longest (IPv6) */ host_addr_t addr; - prop_get_ip(ps, prop, &addr, 0, 1); - host_addr_to_string_buf(addr, s, sizeof s); + if (n != 0) + STR_CAT(s, ", "); + + prop_get_ip(ps, prop, &addr, n, 1); + host_addr_to_string_buf(addr, buf, sizeof buf); + str_cat(s, buf); } - break; + + if (d->vector_size != 1) + str_putc(s, ''); + goto done; case PROP_TYPE_BOOLEAN: - { + str_reset(s); + if (d->vector_size != 1) + str_putc(s, ''); + + for (n = 0; n < d->vector_size; n++) { gboolean val; - prop_get_boolean(ps, prop, &val, 0, 1); - clamp_strcpy(s, sizeof s, val ? "TRUE" : "FALSE"); + if (n != 0) + STR_CAT(s, ", "); + + prop_get_boolean(ps, prop, &val, n, 1); + if (val) + STR_CAT(s, "TRUE"); + else + STR_CAT(s, "FALSE"); } - break; + + if (d->vector_size != 1) + str_putc(s, ''); + goto done; case PROP_TYPE_MULTICHOICE: { - guint n = 0; + uint i = 0; while ( - (PROP(ps, prop).data.guint32.choicesn.title != NULL) && - (PROP(ps, prop).data.guint32.choicesn.value != - *(PROP(ps, prop).data.guint32.value)) + d->data.guint32.choicesi.title != NULL && + d->data.guint32.choicesi.value != *d->data.guint32.value ) - n++; + i++; /* There is a { NULL, 0 } sentinel at the end */ - if (PROP(ps, prop).data.guint32.choicesn.title != NULL) - gm_snprintf(s, sizeof s, "%u: %s", - *(PROP(ps, prop).data.guint32.value), - PROP(ps,prop).data.guint32.choicesn.title); + if (d->data.guint32.choicesi.title != NULL) + str_printf(s, "%u: %s", + *d->data.guint32.value, + d->data.guint32.choicesi.title); else - gm_snprintf(s, sizeof s, - "%u: No descriptive string found for this value", - *(PROP(ps, prop).data.guint32.value)); + str_printf(s, "%u: No descriptive string found for this value", + *d->data.guint32.value); } - break; + goto done; case PROP_TYPE_STORAGE: { + size_t len = d->vector_size * 2 + 1; + char *buf = xmalloc(len); + bin_to_hex_buf(prop_get_storage_const(ps, prop), - PROP(ps,prop).vector_size, s, sizeof s); + d->vector_size, buf, len); + str_cpy(s, buf); + XFREE_NULL(buf); } + goto done; + case NUM_PROP_TYPES: break; - default: - s0 = '\0'; - g_error("update_entry_gnet: incompatible type %s", - prop_type_strPROP(ps,prop).type.name); } - return s; + s_error("%s(): unknown type %d", G_STRFUNC, d->type); + +done: + return str_2c(s); } /** @@ -1402,28 +1540,42 @@ const char * prop_default_to_string(prop_set_t *ps, property_t prop) { - static char s4096; + str_t *s = str_private(G_STRFUNC, 128); const prop_def_t *p = &PROP(ps, prop); - + + /* Default value is a constant, no need to lock */ + switch (p->type) { case PROP_TYPE_GUINT32: - gm_snprintf(s, sizeof s, "%u", (guint) p->data.guint32.def0); - break; + str_printf(s, "%u", (guint) p->data.guint32.def0); + goto done; case PROP_TYPE_GUINT64: - uint64_to_string_buf(p->data.guint64.def0, s, sizeof s); - break; + { + char bufUINT64_DEC_BUFLEN; + uint64_to_string_buf(p->data.guint64.def0, buf, sizeof buf); + str_cpy(s, buf); + } + goto done; case PROP_TYPE_TIMESTAMP: - uint64_to_string_buf(p->data.timestamp.def0, s, sizeof s); - break; + { + char bufUINT64_DEC_BUFLEN; + uint64_to_string_buf(p->data.timestamp.def0, buf, sizeof buf); + str_cpy(s, buf); + } + goto done; case PROP_TYPE_STRING: - clamp_strcpy(s, sizeof s, *p->data.string.def ? *p->data.string.def : ""); - break; + str_cpy(s, *p->data.string.def ? *p->data.string.def : ""); + goto done; case PROP_TYPE_IP: - clamp_strcpy(s, sizeof s, ""); - break; + case PROP_TYPE_STORAGE: + str_reset(s); /* No default value for these types */ + goto done; case PROP_TYPE_BOOLEAN: - clamp_strcpy(s, sizeof s, p->data.boolean.def0 ? "TRUE" : "FALSE"); - break; + if (p->data.boolean.def0) + STR_CPY(s, "TRUE"); + else + STR_CPY(s, "FALSE"); + goto done; case PROP_TYPE_MULTICHOICE: { guint n = 0; @@ -1435,34 +1587,27 @@ n++; if (p->data.guint32.choicesn.title != NULL) - gm_snprintf(s, sizeof s, "%u: %s", + str_printf(s, "%u: %s", *(p->data.guint32.def), p->data.guint32.choicesn.title); else - gm_snprintf(s, sizeof s, - "%u: No descriptive string found for this value", + str_printf(s, "%u: No descriptive string found for this value", *(p->data.guint32.def)); } + goto done; + case NUM_PROP_TYPES: break; - case PROP_TYPE_STORAGE: - { - bin_to_hex_buf(prop_get_storage_const(ps, prop), - PROP(ps,prop).vector_size, s, sizeof s); - } - break; - default: - s0 = '\0'; - g_error("update_entry_gnet: incompatible type %s", - prop_type_strPROP(ps,prop).type.name); } - return s; -} + s_error("%s(): unknown type %d", G_STRFUNC, p->type); +done: + return str_2c(s); +} /** * @return "TRUE" or "FALSE" depending on the given boolean value. */ -static const char * +static inline const char * config_boolean(gboolean b) { static const char b_true = "TRUE", b_false = "FALSE"; @@ -1524,19 +1669,33 @@ static const char * unique_file_token(const filestat_t *st) { - static char bufSHA1_BASE16_SIZE + 1; /* Hexadecimal format */ - SHA1Context ctx; + char bufSHA1_BASE16_SIZE + 1; /* Hexadecimal format */ + str_t *s = str_private(G_STRFUNC, sizeof buf); + SHA1_context ctx; struct sha1 digest; + const char *hostname; - SHA1Reset(&ctx); - SHA1Input(&ctx, &st->st_dev, sizeof st->st_dev); - SHA1Input(&ctx, &st->st_ino, sizeof st->st_ino); - SHA1Result(&ctx, &digest); + /* + * We now include the hostname into the unique file ID to make sure + * the internal ID changes even if the file is indirectly copied + * through virtual machine cloning for instance (where the device and + * inode number would stay the same). + * --RAM, 2015-12-04 + */ + + hostname = local_hostname(); + + SHA1_reset(&ctx); + SHA1_INPUT(&ctx, st->st_dev); + SHA1_INPUT(&ctx, st->st_ino); + SHA1_input(&ctx, hostname, strlen(hostname)); + SHA1_result(&ctx, &digest); bin_to_hex_buf(digest.data, sizeof digest.data, buf, sizeof buf); bufSHA1_BASE16_SIZE = '\0'; - return buf; + str_cpy(s, buf); + return str_2c(s); } /** @@ -1547,6 +1706,8 @@ prop_save_to_file_if_dirty(prop_set_t *ps, const char *dir, const char *filename) { + /* NB: we don't take the lock to read the `dirty' flag */ + if (!ps->dirty) return; @@ -1572,30 +1733,31 @@ g_assert(filename != NULL); g_assert(ps != NULL); - if (debug >= 2) - printf("saving %s to %s%s%s\n", ps->name, + if (debug >= 2) { + s_debug("PROP saving %s to %s%s%s", ps->name, dir, G_DIR_SEPARATOR_S, filename); + } if (!is_directory(dir)) return; pathname = make_pathname(dir, filename); if (-1 == stat(pathname, &sb)) { - g_warning("could not stat \"%s\": %s", pathname, g_strerror(errno)); + s_warning("%s(): could not stat \"%s\": %m", G_STRFUNC, pathname); } else { /* * Rename old config file if they changed it whilst we were running. */ if (ps->mtime && delta_time(sb.st_mtime, ps->mtime) > 0) { - char *old = h_strconcat(pathname, ".old", (void *) 0); - g_warning("config file \"%s\" changed whilst I was running", - pathname); + char *old = h_strconcat(pathname, ".old", NULL_PTR); + s_warning("%s(): config file \"%s\" changed whilst I was running", + G_STRFUNC, pathname); if (-1 == rename(pathname, old)) - g_warning("unable to rename as \"%s\": %s", - old, g_strerror(errno)); + s_warning("%s(): unable to rename \"%s\" as \"%s\": %m", + G_STRFUNC, pathname, old); else - g_warning("renamed old copy as \"%s\"", old); + s_warning("%s(): renamed old copy as \"%s\"", G_STRFUNC, old); HFREE_NULL(old); } } @@ -1605,20 +1767,20 @@ * clobber a good configuration file should we fail abruptly. */ - newfile = h_strconcat(pathname, ".new", (void *) 0); + newfile = h_strconcat(pathname, ".new", NULL_PTR); config = file_fopen(newfile, "w"); if (config == NULL) goto end; { - const char *revision = product_get_revision(); + const char *revision = product_revision(); fprintf(config, "#\n# gtk-gnutella %s%s%s (%s) by Olrick & Co.\n# %s\n#\n", - product_get_version(), + product_version(), *revision != '\0' ? " " : "", revision, - product_get_date(), product_get_website()); + product_date(), product_website()); } { char *comment = config_comment(ps->desc); @@ -1630,6 +1792,17 @@ HFREE_NULL(comment); } + /* + * We're about to save the properties. + * Because some properties could be changed during saving by other + * threads, we need to clear the dirty indication before starting to + * iterate on the properties. + */ + + PROP_SET_LOCK(ps); + ps->dirty = FALSE; + PROP_SET_UNLOCK(ps); + for (n = 0; n < ps->size; n++) { prop_def_t *p = &ps->propsn; char **vbuf; @@ -1642,7 +1815,9 @@ if (p->save == FALSE) continue; - vbuf = halloc((p->vector_size + 1) * sizeof(char *)); + PROP_DEF_LOCK(p); + + HALLOC_ARRAY(vbuf, p->vector_size + 1); vbuf0 = NULL; { @@ -1674,7 +1849,7 @@ v = p->data.guint32.valuei; if (v != p->data.guint32.defi) defaultvalue = FALSE; - gm_snprintf(sbuf, sizeof(sbuf), "%u", v); + str_bprintf(sbuf, sizeof(sbuf), "%u", v); vbufi = h_strdup(sbuf); } vbufp->vector_size = NULL; @@ -1757,6 +1932,8 @@ g_assert_not_reached(); } + PROP_DEF_UNLOCK(p); + g_assert(val != NULL); fprintf(config, "%s%s = %s%s%s\n\n", defaultvalue ? "#" : "", @@ -1781,16 +1958,32 @@ /* * Rename saved configuration file on success. + * + * We are extra careful and sync data blocks to disk before closing the + * file, to protect against crashes when running on a filesytem with + * delayed block allocation strategy. See alos file_config_close(). */ - if (0 == fclose(config)) { - ps->dirty = FALSE; - if (-1 == rename(newfile, pathname)) - g_warning("could not rename %s as %s: %s", - newfile, pathname, g_strerror(errno)); - ps->mtime = tm_time_exact(); - } else - g_warning("could not flush %s: %s", newfile, g_strerror(errno)); + if (0 == file_sync_fclose(config)) { + if (-1 == rename(newfile, pathname)) { + s_warning("%s(): could not rename \"%s\" as \"%s\": %m", + G_STRFUNC, newfile, pathname); + } else { + if (-1 == stat(pathname, &sb)) { + s_warning("%s(): could not stat \"%s\": %m", + G_STRFUNC, pathname); + PROP_SET_LOCK(ps); + ps->mtime = tm_time_exact(); + PROP_SET_UNLOCK(ps); + } else { + PROP_SET_LOCK(ps); + ps->mtime = sb.st_mtime; + PROP_SET_UNLOCK(ps); + } + } + } else { + s_warning("%s(): could not flush \"%s\": %m", G_STRFUNC, newfile); + } end: HFREE_NULL(newfile); @@ -1822,12 +2015,15 @@ g_return_if_fail(NULL != p); if (!p->save && saved_only) { - g_warning("Refusing to load run-time only property \"%s\"", p->name); + s_warning("%s(): refusing to load runtime-only property \"%s\"", + G_STRFUNC, p->name); return; } stub = ps->get_stub(); + PROP_DEF_LOCK(p); + switch (p->type) { case PROP_TYPE_BOOLEAN: prop_assert(ps, prop, @@ -1901,6 +2097,8 @@ case NUM_PROP_TYPES: g_assert_not_reached(); } + + PROP_DEF_UNLOCK(p); } /** @@ -1926,7 +2124,7 @@ gboolean prop_load_from_file(prop_set_t *ps, const char *dir, const char *filename) { - static const char fmt = "Bad line %u in config file, ignored"; + static const char fmt = "bad line %u in config file \"%s\", ignored"; static char prop_tmp4096; FILE *config; char *path; @@ -1935,6 +2133,7 @@ gboolean truncated = FALSE; gboolean good_id = FALSE; const char *file_id; + static spinlock_t prop_load_slk = SPINLOCK_INIT; g_assert(dir != NULL); g_assert(filename != NULL); @@ -1951,16 +2150,20 @@ } if (-1 == fstat(fileno(config), &buf)) { - g_warning("could open but not fstat \"%s\" (fd #%d): %s", - path, fileno(config), g_strerror(errno)); + s_warning("%s(): could open but not fstat \"%s\" (fd #%d): %m", + G_STRFUNC, path, fileno(config)); file_id = ""; } else { + PROP_SET_LOCK(ps); ps->mtime = buf.st_mtime; + PROP_SET_UNLOCK(ps); file_id = unique_file_token(&buf); } HFREE_NULL(path); + spinlock(&prop_load_slk); /* Using global prop_tmp */ + /* * Lines should match the following expression: * @@ -1983,8 +2186,8 @@ property_t prop; if (!file_line_chomp_tail(prop_tmp, sizeof prop_tmp, NULL)) { - g_warning("config file \"%s\", line %u: too long a line, ignored", - filename, n); + s_warning("%s(): config file \"%s\", line %u: " + "too long a line, ignored", G_STRFUNC, filename, n); truncated = TRUE; continue; } @@ -1998,7 +2201,7 @@ s = prop_tmp; /* Skip leading blanks */ s = skip_ascii_blanks(s); - c = (guchar) *s; + c = (uchar) *s; /* <keyword> starts with _ or letter */ if (!is_ascii_alpha(c) && c != '_') @@ -2006,17 +2209,17 @@ /* Here starts the <keyword> */ k = s; - while ((c = (guchar) *s) == '_' || is_ascii_alnum(c)) + while ((c = (uchar) *s) == '_' || is_ascii_alnum(c)) s++; *s = '\0'; /* Terminate <keyword>, original value is stored in c */ if (is_ascii_blank(c)) { s = skip_ascii_blanks(&s1); - c = (guchar) *s; + c = (uchar) *s; } if (c != '=') { /* <keyword> must be followed by a '=' and optional blanks */ - g_warning(fmt, n); + s_warning(fmt, n, path); continue; } @@ -2025,7 +2228,7 @@ /* Skip optional blanks */ s = skip_ascii_blanks(s); - c = (guchar) *s; + c = (uchar) *s; if (c == '"') { /* Here starts the <value> part (quoted) */ @@ -2036,7 +2239,7 @@ /* Check for proper quote termination */ if (!s) { /* Missing terminating double-quote '"' */ - g_warning(fmt, n); + s_warning(fmt, n, path); continue; } g_assert(*s == '"'); @@ -2046,13 +2249,13 @@ /* The first space terminates the value */ s = skip_ascii_non_spaces(s); } - c = (guchar) *s; + c = (uchar) *s; g_assert(*s == '\0' || *s == '"' || is_ascii_space(c)); *s = '\0'; /* Terminate value in case of trailing characters */ - if (common_dbg > 5) - g_debug("k=\"%s\", v=\"%s\"", k, v); + if (debug > 5) + s_debug("%s(): k=\"%s\", v=\"%s\"", G_STRFUNC, k, v); prop = prop_get_by_name(ps, k); if (NO_PROP != prop) { @@ -2061,11 +2264,12 @@ if (0 == strcmp(file_id, v)) good_id = TRUE; } else { - g_warning("\"%s%c%s\", line %u: unknown property '%s' -- ignored", + s_warning("\"%s%c%s\", line %u: unknown property '%s' -- ignored", dir, G_DIR_SEPARATOR, filename, n, k); } } + spinunlock(&prop_load_slk); fclose(config); return good_id; @@ -2082,13 +2286,13 @@ { g_assert(ps != NULL); - return GPOINTER_TO_UINT(g_hash_table_lookup(ps->byName, name)); + return pointer_to_uint(htable_lookup(ps->by_name, name)); } -GSList * +pslist_t * prop_get_by_regex(prop_set_t *ps, const char *pattern, int *error) { - GSList *sl = NULL; + pslist_t *sl = NULL; size_t i; regex_t re; int ret; @@ -2108,14 +2312,13 @@ for (i = 0; i < ps->size; i++) { if (0 == regexec(&re, ps->propsi.name, 0, NULL, 0)) { guint n = ps->offset + i; - sl = g_slist_prepend(sl, GUINT_TO_POINTER(n)); + sl = pslist_prepend(sl, uint_to_pointer(n)); } } done: regfree(&re); - return g_slist_reverse(sl); + return pslist_reverse(sl); } - /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/prop.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/prop.h
Changed
@@ -1,5 +1,6 @@ /* * Copyright (c) 2001-2003, Richard Eckart + * Copyright (c) 2013, Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -27,6 +28,9 @@ #include "common.h" #include "event.h" #include "host_addr.h" +#include "htable.h" +#include "mutex.h" +#include "spinlock.h" #define NO_PROP (0) @@ -63,7 +67,8 @@ typedef void (*prop_add_prop_changed_listener_t) (property_t, prop_changed_listener_t, gboolean); typedef void (*prop_add_prop_changed_listener_full_t) - (property_t, prop_changed_listener_t, gboolean, enum frequency_type, guint32); + (property_t, prop_changed_listener_t, gboolean, + enum frequency_type, guint32); typedef void (*prop_remove_prop_changed_listener_t) (property_t, prop_changed_listener_t); @@ -129,7 +134,7 @@ gpointer value; /**< current data */ } prop_def_storage_t; -typedef void (*prop_set_storage_t)(property_t, gconstpointer, size_t); +typedef void (*prop_set_storage_t)(property_t, const void *, size_t); typedef gpointer (*prop_get_storage_t)(property_t, gpointer, size_t); @@ -168,7 +173,9 @@ prop_def_timestamp_t timestamp; prop_def_ip_t ip; } data; - gboolean save; /* persist across sessions */ + mutex_t lock; /* thread-safe access */ + uint save:1; /* persist across sessions */ + uint internal:1; /* if set, users cannot modify the property */ size_t vector_size; /* number of items in array, 1 for non-vector */ struct event *ev_changed; } prop_def_t; @@ -226,14 +233,15 @@ * Property set definition. */ typedef struct prop_set { - char *name; /**< name of the property set */ - char *desc; /**< description of what the set contains */ + char *name; /**< name of the property set */ + char *desc; /**< description of what the set contains */ size_t size; /**< number of properties in the set */ size_t offset; /**< properties start numbering from here */ - prop_def_t *props; /**< Pointer to first item in array of prop_def_t */ - GHashTable *byName; /**< hashtable to quickly look up props by name */ + prop_def_t *props; /**< Array of prop_def_t, one entry per property */ + htable_t *by_name; /**< hashtable to quickly look up props by name */ time_t mtime; /**< modification time of the associated file */ gboolean dirty; /**< property set needs flushing to disk */ + spinlock_t lock; /**< thread-safe access to structure */ prop_set_get_stub_t get_stub; } prop_set_t; @@ -249,7 +257,12 @@ const char *prop_to_string(prop_set_t *ps, property_t prop); const char *prop_type_to_string(prop_set_t *ps, property_t prop); const char *prop_default_to_string(prop_set_t *ps, property_t prop); +prop_type_t prop_type(prop_set_t *ps, property_t prop); gboolean prop_is_saved(prop_set_t *ps, property_t prop); +gboolean prop_is_internal(prop_set_t *ps, property_t prop); + +void prop_lock(prop_set_t *ps, property_t p); +void prop_unlock(prop_set_t *ps, property_t p); void prop_add_prop_changed_listener( prop_set_t *, property_t, prop_changed_listener_t, gboolean); @@ -301,7 +314,8 @@ char *prop_get_storage(prop_set_t *, property_t, char *, size_t); property_t prop_get_by_name(prop_set_t *ps, const char *name); -GSList *prop_get_by_regex(prop_set_t *ps, const char *pattern, int *error); +struct pslist *prop_get_by_regex(prop_set_t *ps, + const char *pattern, int *error); void prop_set_from_string(prop_set_t *ps, property_t prop, const char *val, gboolean saved_only); @@ -331,5 +345,21 @@ */ #define PROP(ps, p) (* get_prop((ps), (p), G_STRLOC)) +/* + * Casts, since property_t is an opaque type, for using properties as keys. + */ + +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE void * +property_to_pointer(property_t value) +{ + return ulong_to_pointer(value); +} + +static inline G_CONST WARN_UNUSED_RESULT ALWAYS_INLINE property_t +pointer_to_property(const void *p) +{ + return pointer_to_ulong(p); +} + #endif /* _prop_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/pslist.c
Added
@@ -0,0 +1,1083 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Plain one-way list. + * + * This is a very low-level list, with no bookkeeping of meta information: + * the list is known by a pointer to the head cell, and all operations that + * can change the head of the list return a new head. + * + * An empty list is represented by a NULL pointer. + * + * List cells are allocated through walloc(). + * + * The API of plain lists mirrors that of glib's lists to make a smooth + * transition possible and maintain some consistency in the code. That + * said, the glib list API is quite good so mirroring it is not a problem. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#include "pslist.h" + +#include "eslist.h" +#include "log.h" +#include "random.h" +#include "walloc.h" + +#include "override.h" /* Must be the last header included */ + +/* + * Parts of the code below have been "copied" from Glib's implementation. + * Sometimes copying merely involved translation and adaptation to the local + * coding style, sometimes it involved more, with additional assertions. + * + * That original code was released under the LGPL, and was: + * + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * Modified by the GLib Team and others 1997-2000. + * + * Additional routines and initial adaptation are: + * + * Copyright (c) 2013 Raphael Manfredi + */ + +/** + * Allocate a list cell for storing one element. + * + * @return pointer to newly allocated element, pointing to NULL data. + */ +pslist_t * +pslist_alloc(void) +{ + pslist_t *pl; + + WALLOC0(pl); + return pl; +} + +/** + * Free the cell element only, which must not be part of any list. + * + * @attention + * The held item is not freed. + * + * @param l the cell to be freed (can be NULL) + */ +void +pslist_free_1(pslist_t *l) +{ + g_assert(NULL == l || NULL == l->next); /* Not part of any list */ + + if (l != NULL) + WFREE(l); +} + +/** + * Free the cell element and nullify its pointer. + */ +void +pslist_free_1_null(pslist_t **l_ptr) +{ + pslist_t *l = *l_ptr; + + if (l != NULL) { + pslist_free_1(l); + *l_ptr = NULL; + } +} + +/** + * Free all the cell elements in the list, but do not touch the held data. + * + * To be able to free the items in the list, use pslist_free_full(). + * + * @param pl the head of the list + * + * @return NULL as a convenience. + */ +pslist_t * +pslist_free(pslist_t *pl) +{ + if G_UNLIKELY(NULL == pl) + return NULL; + + /* + * To be extremely fast, use a specialized freeing routine that will + * limit the amount of overhead to process all the entries in the list. + */ + + wfree_pslist(pl, sizeof *pl); + return NULL; +} + +/** + * Free pslist and nullify pointer holding it. + */ +void +pslist_free_null(pslist_t **pl_ptr) +{ + pslist_t *pl = *pl_ptr; + + if (pl != NULL) { + pslist_free(pl); + *pl_ptr = NULL; + } +} + +/** + * Free all the cell elements in the list, applying the free callback on + * each item. + * + * @param pl the head of the list + * @param fn routine to call on each item of the list + * + * @return NULL as a convenience. + */ +pslist_t * +pslist_free_full(pslist_t *pl, free_fn_t fn) +{ + pslist_t *l; + + for (l = pl; l != NULL; l = l->next) { + (*fn)(l->data); + } + + pslist_free(pl); + return NULL; +} + +/** + * Free pslist, applying free callback each item, and then nullify pointer + * holding it. + */ +void +pslist_free_full_null(pslist_t **pl_ptr, free_fn_t fn) +{ + pslist_t *pl = *pl_ptr; + + if (pl != NULL) { + pslist_free_full(pl, fn); + *pl_ptr = NULL; + } +} + +/** + * @return the last cell of the list. + */ +pslist_t * +pslist_last(const pslist_t *pl) +{ + if G_LIKELY(pl != NULL) { + pslist_t *l = deconstify_pointer(pl); + + while (l->next != NULL) + l = l->next; + + return l; + } else { + return NULL; + } +} + +/** + * Append new item at the end of the list. + * + * @attention + * This is inefficient and requires a full traversal of the list. + * + * @param pl the head of the list + * @param data the data item to append + * + * @return the new head of the list. + */ +pslist_t * +pslist_append(pslist_t *pl, void *data) +{ + pslist_t *nl; + + WALLOC(nl); + nl->next = NULL; + nl->data = data; + + if (pl != NULL) { + pslist_t *last = pslist_last(pl); + last->next = nl; + return pl; + } else { + return nl; + } +} + +/** + * Prepend new item at the head of the list. + * + * @param pl the head of the list + * @param data the data item to prepend + * + * @return the new head of the list. + */ +pslist_t * +pslist_prepend(pslist_t *pl, void *data) +{ + pslist_t *nl; + + WALLOC(nl); + nl->next = pl; + nl->data = data; + + return nl; +} + +/** + * Insert a new cell with data before specified cell (which must belong + * to the list, or be NULL to indicate that data should be inserted at the + * end of the list). + * + * @attention + * This is inefficient and requires a traversal of the list. + * + * @param pl the head of the list + * @param sibling the cell before which we need to insert a new cell + * @param data the data item to prepend + * + * @return the new head of the list. + */ +pslist_t * +pslist_insert_before(pslist_t *pl, pslist_t *sibling, void *data) +{ + g_assert(NULL != pl || NULL == sibling); + + if G_UNLIKELY(NULL == sibling) { + return pslist_append(pl, data); + } else { + pslist_t *l, *last = NULL; + + for (l = pl; l != NULL; last = l, l = last->next) { + if (l == sibling) + goto found; + } + + g_assert_not_reached(); /* Sibling not found in list */ + + found: + if (NULL == last) { + /* Sibling was head, hence we prepend */ + return pslist_prepend(pl, data); + } else { + /* Insert new link after ``last'', which precedes ``sibling'' */ + WALLOC(l); + l->data = data; + l->next = last->next; + last->next = l; + + return pl; + } + } +} + +/** + * Insert a new cell with data after specified cell (which must belong + * to the list, but this is not checked to keep the routine efficient, + * or be NULL in which case insertion happens at the head of the list). + * + * @param pl the head of the list + * @param sibling the cell after which we need to insert a new cell + * @param data the data item to append + * + * @return the new head of the list. + */ +pslist_t * +pslist_insert_after(pslist_t *pl, pslist_t *sibling, void *data) +{ + pslist_t *nl; + + g_assert(NULL != pl || NULL == sibling); + + if G_UNLIKELY(NULL == sibling) + return pslist_prepend(pl, data); + + WALLOC(nl); + nl->data = data; + nl->next = sibling->next; + sibling->next = nl; + + return pl; +} + +/** + * Adds the second list at the end of the first. + * + * The second list becomes part of the first list, physically, i.e. the cells + * are not copied. + * + * @param l1 the first list, the one we append to + * @param l2 the second list to concatenate at the tail of the first + * + * @return the new head of the list. + */ +pslist_t * +pslist_concat(pslist_t *l1, pslist_t *l2) +{ + if (l2 != NULL) { + if (l1 != NULL) + pslist_last(l1)->next = l2; + else + l1 = l2; + } + + return l1; +} + +/** + * Remove the first cell we find that contains the specified data, if any. + * + * @param pl the head of the list + * @param data the data item we wish to remove + * + * @return the new head of the list. + */ +pslist_t * +pslist_remove(pslist_t *pl, const void *data) +{ + pslist_t *l, *prev = NULL; + + l = pl; + while (l != NULL) { + if G_UNLIKELY(l->data == data) { + if (prev != NULL) + prev->next = l->next; + else + pl = l->next; + WFREE(l); + break; + } + prev = l; + l = prev->next; + } + + return pl; +} + +/** + * Remove specified cell from the list, without freeing it. + * + * @attention + * This is inefficient and requires a traversal of the list. + * + * @param pl the head of the list + * @param cell the cell we wish to remove + * + * @return the new head of the list. + */ +static pslist_t * +pslist_remove_link_internal(pslist_t *pl, pslist_t *cell) +{ + pslist_t *l = pl, *prev = NULL; + + while (l != NULL) { + if (l == cell) { + if (prev != NULL) + prev->next = l->next; + if (pl == l) + pl = pl->next; + l->next = NULL; + break; + } + prev = l; + l = l->next; + } + + return pl; +} + +/** + * Remove specified cell from the list without freeing it. + * + * @attention + * This is inefficient and requires a traversal of the list. + * + * @param pl the head of the list + * @param cell the cell we wish to remove + * + * @return the new head of the list. + */ +pslist_t * +pslist_remove_link(pslist_t *pl, pslist_t *cell) +{ + return pslist_remove_link_internal(pl, cell); +} + +/** + * Remove specified cell from the list, then free it. + * + * @note + * The data held in the cell is not freed. + * + * @attention + * This is inefficient and requires a traversal of the list. + * + * @param pl the head of the list + * @param cell the cell we wish to remove + * + * @return new head of the list + */ +pslist_t * +pslist_delete_link(pslist_t *pl, pslist_t *cell) +{ + pslist_t *np; + + np = pslist_remove_link_internal(pl, cell); + WFREE(cell); + + return np; +} + +/** + * Perform a deep copy of the list (cells + data). + * + * Each item is copied using the supplied copying callback, which can be + * passed an extra contextual argument. If the callback is NULL, no data + * copying happens, hence we fall back to shallow copying. + * + * @param pl the head of the list + * @param fn the data copying callback (can be NULL) + * @param udata opaque user-data passed to the copying callback + * + * @return the head of the new list. + */ +pslist_t * +pslist_copy_deep(pslist_t *pl, copy_data_fn_t fn, void *udata) +{ + pslist_t *nl = NULL; + + if (pl != NULL) { + pslist_t *l, *last; + + WALLOC(nl); + if (fn != NULL) { + nl->data = (*fn)(pl->data, udata); + } else { + nl->data = pl->data; + } + last = nl; + l = pl->next; + while (l != NULL) { + WALLOC(last->next); + last = last->next; + if (fn != NULL) { + last->data = (*fn)(l->data, udata); + } else { + last->data = l->data; + } + l = l->next; + } + last->next = NULL; + } + + return nl; +} + +/** + * Perform a shallow copy of the list (only the cells). + * + * @param pl the head of the list + * + * @return the head of the new list. + */ +pslist_t * +pslist_copy(pslist_t *pl) +{ + return pslist_copy_deep(pl, NULL, NULL); +} + +/** + * Reverse list. + * + * @param pl the head of the list + * + * @return the head of the new list. + */ +pslist_t * +pslist_reverse(pslist_t *pl) +{ + pslist_t *l = pl, *prev = NULL; + + while (l != NULL) { + pslist_t *next = l->next; + + l->next = prev; + prev = l; + l = next; + } + + return prev; +} + +/** + * Get the n-th cell in the list. + * + * @param pl the head of the list + * @param n the n-th item to retrieve (0-based) + * + * @return the n-th cell, NULL if the position is off the end of the list. + */ +pslist_t * +pslist_nth(pslist_t *pl, size_t n) +{ + while (n-- != 0 && pl != NULL) + pl = pl->next; + + return pl; +} + +/** + * Get the n-th item in the list. + * + * @param pl the head of the list + * @param n the n-th item to retrieve (0-based) + * + * @return the n-th item, NULL if the position is off the end of the list. + */ +void * +pslist_nth_data(pslist_t *pl, size_t n) +{ + while (n-- != 0 && pl != NULL) + pl = pl->next; + + return NULL == pl ? NULL : pl->data; +} + +/** + * Find the cell in the list containing the specified item. + * + * @param pl the head of the list + * + * @return the first matching cell in the list, NULL if not found. + */ +pslist_t * +pslist_find(pslist_t *pl, const void *data) +{ + pslist_t *l; + + for (l = pl; l != NULL; l = l->next) { + if (l->data == data) + break; + } + + return l; +} + +/** + * Find cell in the list using a specified comparison function to identify + * the matching element. + * + * @param pl the head of the list + * @param object the object to which we need to compare list data + * @param cmp comparison routine with object, returns 0 when equals. + * + * @return the first matching cell in the list, NULL if not found. + */ +pslist_t * +pslist_find_custom(pslist_t *pl, const void *object, cmp_fn_t cmp) +{ + pslist_t *l; + + if G_UNLIKELY(NULL == pl) + return NULL; + + for (l = pl; l != NULL; l = l->next) { + if (0 == (*cmp)(l->data, object)) + return l; + } + + return NULL; +} + +/** + * Gets the position of the given cell in the list (0-based indexing). + * + * @param pl the head of the list + * @param cell the cell we're looking for + * + * @return the position of the cell in the list, -1 if not found. + */ +long +pslist_position(const pslist_t *pl, const pslist_t *cell) +{ + pslist_t *l; + long i; + + for (i = 0, l = deconstify_pointer(pl); l != NULL; i++, l = l->next) { + if (l == cell) + return i; + } + + return -1L; +} + +/** + * Gets the position of the first cell containing the given data (0-based). + * + * @param pl the head of the list + * @param data the data we're looking for + * + * @return the position of the first cell containing the data in the list, + * -1 if not found. + */ +long +pslist_index(const pslist_t *pl, const void *data) +{ + pslist_t *l; + long i; + + for (i = 0, l = deconstify_pointer(pl); l != NULL; i++, l = l->next) { + if (l->data == data) + return i; + } + + return -1L; +} + +/** + * Compute the length of the list. + * + * @attention + * This requires a complete traversal of the list. + * + * @param pl the head of the list + * + * @return the amount of items in the list. + */ +size_t +pslist_length(const pslist_t *pl) +{ + pslist_t *l = deconstify_pointer(pl); + size_t n = 0; + + while (l != NULL) { + n++; + l = l->next; + } + + return n; +} + +/** + * Iterate over the list, invoking the callback for every item. + * + * @param pl the head of the list + * @param cb routine to invoke on all items + * @param data opaque user-data to pass to callback + */ +void +pslist_foreach(const pslist_t *pl, data_fn_t cb, void *data) +{ + pslist_t *l; + + for (l = deconstify_pointer(pl); l != NULL; l = l->next) { + (*cb)(l->data, data); + } +} + +/** + * Iterate over the list, invoking the callback for every item and removing + * the entry if the callback returns TRUE. + * + * @param pl the head of the list + * @param cbr routine to invoke on item to see whether we remove it + * @param data opaque user-data to pass to callback + * + * @return the new list head. + */ +pslist_t * +pslist_foreach_remove(pslist_t *pl, data_rm_fn_t cbr, void *data) +{ + pslist_t *l, *next, *prev; + + for (l = pl, prev = NULL; l != NULL; l = next) { + next = l->next; + if ((*cbr)(l->data, data)) { + if G_UNLIKELY(l == pl) + pl = next; + else if (prev != NULL) + prev->next = next; + WFREE(l); + } else { + prev = l; + } + } + + return pl; +} + +/** + * Inserts element into the list, using the given comparison function to + * determine the proper position. + * + * @param pl the head of the list + * @param data data to insert + * @param cmp data comparison routine, with extra udata argument + * @param udata trailing comparison argument (user-supplied context) + * + * @return the new list head. + */ +static pslist_t * +pslist_insert_sorted_internal(pslist_t *pl, void *data, + cmp_data_fn_t cmp, void *udata) +{ + pslist_t *tl = pl, *prev = NULL, *nl; + int c; + + g_assert(cmp != NULL); + + if G_UNLIKELY(NULL == pl) { + WALLOC(nl); + nl->data = data; + nl->next = NULL; + return nl; + } + + c = (*cmp)(data, tl->data, udata); + + while (tl->next != NULL && c > 0) { + prev = tl; + tl = tl->next; + c = (*cmp)(data, tl->data, udata); + } + + WALLOC(nl); + nl->data = data; + + if (tl->next != NULL && c > 0) { + tl->next = nl; + nl->next = NULL; + return pl; + } + + if (prev != NULL) { + prev->next = nl; + nl->next = tl; + return pl; + } else { + nl->next = pl; + return nl; + } +} + +/** + * Inserts element into the list, using the given comparison function to + * determine the proper position. + * + * @param pl the head of the list + * @param data data to insert + * @param cmp data comparison routine + * + * @return the new list head. + */ +pslist_t * +pslist_insert_sorted(pslist_t *pl, void *data, cmp_fn_t cmp) +{ + return pslist_insert_sorted_internal(pl, data, (cmp_data_fn_t) cmp, NULL); +} + +/** + * Inserts element into the list, using the given comparison function to + * determine the proper position. + * + * @param pl the head of the list + * @param data data to insert + * @param cmp data comparison routine, with extra udata argument + * @param udata trailing comparison argument (user-supplied context) + * + * @return the new list head. + */ +pslist_t * +pslist_insert_sorted_with_dta(pslist_t *pl, void *data, + cmp_data_fn_t cmp, void *udata) +{ + return pslist_insert_sorted_internal(pl, data, cmp, udata); +} + +/** + * Merge two sorted lists. + * + * @param l1 first sorted list + * @param l2 second sorted list + * @param cmp data comparison function + * @param udata extra parameter passed to comparison function + * + * @return the head of the merged list. + */ +static pslist_t * +pslist_sort_merge(pslist_t *l1, pslist_t *l2, cmp_data_fn_t cmp, void *udata) +{ + pslist_t list, *l = &list; + + while (l1 != NULL && l2 != NULL) { + int c = (*cmp)(l1->data, l2->data, udata); + + if (c <= 0) { + l = l->next = l1; + l1 = l1->next; + } else { + l = l->next = l2; + l2 = l2->next; + } + } + + l->next = (NULL == l1) ? l2 : l1; + + return list.next; +} + +/** + * Sort list using supplied comparison function. + * + * @param pl the head of the list + * @param cmp data comparison function + * @param udata extra parameter passed to comparison function + * + * @return the head of the sorted list. + */ +static pslist_t * +pslist_sort_internal(pslist_t *pl, cmp_data_fn_t cmp, void *udata) +{ + pslist_t *l1, *l2; + + if G_UNLIKELY(NULL == pl) + return NULL; /* Empty list */ + + if G_UNLIKELY(NULL == pl->next) + return pl; /* Single-item list */ + + /* + * Split list in half, roughly, by advancing the pointer in l2 twice as + * fast as the one in l1. + */ + + l1 = pl; + l2 = pl->next; + + while (NULL != (l2 = l2->next)) { + if (NULL == (l2 = l2->next)) + break; + l1 = l1->next; + } + + l2 = l1->next; + l1->next = NULL; + + return pslist_sort_merge( + pslist_sort_internal(pl, cmp, udata), + pslist_sort_internal(l2, cmp, udata), + cmp, udata + ); +} + +/** + * Sort list according to the comparison function, which takes two items + * plus an additional opaque argument, meant to be used as context to sort + * the two items. + * + * @param pl the head of the list + * @param cmp item comparison function + * @param udata extra parameter passed to comparison function + * + * @return the head of the sorted list. + */ +pslist_t * +pslist_sort_with_data(pslist_t *pl, cmp_data_fn_t cmp, void *data) +{ + return pslist_sort_internal(pl, cmp, data); +} + +/** + * Sort list according to the comparison function, which compares items. + * + * @param pl the head of the list + * @param cmp item comparison function + * + * @return the head of the sorted list. + */ +pslist_t * +pslist_sort(pslist_t *pl, cmp_fn_t cmp) +{ + return pslist_sort_internal(pl, (cmp_data_fn_t) cmp, NULL); +} + +/** + * Randomly shuffle the items in the list using supplied random function. + * + * @param rf the random function to use (NULL means: use defaults) + * @param pl the head of the list + * + * @return the head of the shuffled list. + */ +pslist_t * +pslist_shuffle_with(random_fn_t rf, pslist_t *pl) +{ + eslist_t list; + + /* + * These assertions ensure that we can treat the chain of a pslist + * as if the cells were part of an eslist, so that eslist_shuffle() + * can perform invisibly. + */ + + STATIC_ASSERT(offsetof(slink_t, next) == offsetof(pslist_t, next)); + + if G_UNLIKELY(NULL == pl) + return NULL; /* Empty list */ + + if G_UNLIKELY(NULL == pl->next) + return pl; /* Single-item list */ + + /* + * This code relies on the fact that the plain list can be viewed as + * a valid embedded list of cells, whose link is at the beginning of + * the structure. + * + * There is no need to set the list.tail field as this is not used by + * eslist_shuffle_with(). + */ + + eslist_init(&list, offsetof(pslist_t, next)); + list.head = (slink_t *) pl; + list.count = pslist_length(pl); /* Have to count, unfortunately */ + eslist_shuffle_with(rf, &list); /* Shuffles the cells */ + + return (pslist_t *) list.head; +} + +/** + * Randomly shuffle the items in the list. + * + * @param pl the head of the list + * + * @return the head of the shuffled list. + */ +pslist_t * +pslist_shuffle(pslist_t *pl) +{ + return pslist_shuffle_with(NULL, pl); +} + +/** + * Pick a random cell from the list. + * + * @param pl the head of the list + * + * @return the randomly picked cell, NULL if the list is empty. + */ +pslist_t * +pslist_random(const pslist_t *pl) +{ + const pslist_t *l, *picked = NULL; + ulong n; + + /* + * This algorithm uniformly selects elements among the list (whose count + * is not known initially) by letting item #i be selected and supersede + * any previously chosen item with probability 1/i. If there are N items + * in the list, then each has a probabily 1/N of ending up being picked. + * + * Proof: + * + * Let our hypothesis Hn be: all n items have a uniform 1/n probability + * of being selected. + * + * H1 is trivially true (n = 1). + * + * Now suppose Hn is true and let's prove that Hn+1 is also true: + * + * The item #n+1 has clearly a probability of 1/(n+1) of being selected, + * since this is the way the algorithm picks new items as it progresses + * among the list. + * + * For the other n items, they all had a 1/n probability of being picked so + * far (our hypothesis). So let's pick one item E in this set of n items, + * and let's denote p(E) the probability that this item be picked in our + * set of n+1 items. + * + * The probability that the n+1 item be not picked is 1 - 1/(n+1). So the + * probability that E remains picked is p(E) = 1/n * (1 - 1/(n+1)). + * + * p(E) = 1/n * (n+1 - 1)/(n+1) = 1/n * (n / (n+1) = 1/(n+1) + * + * Therefore, among the set of n+1 items, each item has a probability of + * being picked of 1/(n+1). QED. + * + * Note than in our code below, the first item is n = 0, hence item n + * has 1/(n+1) chances of being selected at each step, not 1/n. + */ + + for (l = pl, n = 0; l != NULL; l = l->next, n++) { + if (0 == random_ulong_value(n)) + picked = l; /* Item n has 1/(n+1) chances of being selected */ + } + + return deconstify_pointer(picked); +} + +/** + * Remove head of list. + * + * @param pl_ptr pointer to the head of the list + * + * @return the data item at the head of the list, NULL if the list was empty. + */ +void * +pslist_shift(pslist_t **pl_ptr) +{ + pslist_t *pl = *pl_ptr, *nl; + void *data; + + if G_UNLIKELY(NULL == pl) + return NULL; + + data = pl->data; + + nl = pl->next; + WFREE(pl); + + /* + * If the list contains NULL items, this is going to confuse the caller + * because NULL is also an indication that the list was empty. + */ + + if G_UNLIKELY(NULL == data) + s_carp_once("%s(): used on a list that contains NULL items", G_STRFUNC); + + *pl_ptr = nl; + return data; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/pslist.h
Added
@@ -0,0 +1,165 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Plain one-way list. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#ifndef _pslist_h_ +#define _pslist_h_ + +/** + * A one-way cell, pointing to a data item and to the next element. + * + * @attention + * It is imperative that the ``next'' pointer be kept as the first item + * of the structure, so that we can handle plain lists as embedded lists + * to be able to share some code with eslist. + */ +typedef struct pslist { + struct pslist *next; /**< Next item (must be first element) */ + void *data; /**< Cell data (item at this position) */ +} pslist_t; + +/** + * @return next cell in list, NULL if none. + */ +static inline pslist_t * +pslist_next(const pslist_t *pl) +{ + if G_UNLIKELY(NULL == pl) + return NULL; + + return deconstify_pointer(pl->next); +} + +/** + * @return data held in given list cell. + */ +static inline void * +pslist_data(const pslist_t *pl) +{ + if G_UNLIKELY(NULL == pl) + return NULL; + + return deconstify_pointer(pl->data); +} + +/* + * Public interface. + */ + +pslist_t *pslist_alloc(void) G_MALLOC; +void pslist_free_1(pslist_t *l); +void pslist_free_1_null(pslist_t **l_ptr); +pslist_t *pslist_free(pslist_t *pl); +void pslist_free_null(pslist_t **pl_ptr); +pslist_t *pslist_free_full(pslist_t *pl, free_fn_t fn); +void pslist_free_full_null(pslist_t **pl_ptr, free_fn_t fn); +pslist_t *pslist_last(const pslist_t *pl) WARN_UNUSED_RESULT; +pslist_t *pslist_append(pslist_t *pl, void *data); +pslist_t *pslist_prepend(pslist_t *pl, void *data) WARN_UNUSED_RESULT; +pslist_t *pslist_insert_before(pslist_t *pl, + pslist_t *sibling, void *data) WARN_UNUSED_RESULT; +pslist_t *pslist_insert_after(pslist_t *pl, + pslist_t *sibling, void *data) WARN_UNUSED_RESULT; +pslist_t *pslist_concat(pslist_t *l1, pslist_t *l2) WARN_UNUSED_RESULT; +pslist_t *pslist_remove(pslist_t *pl, const void *data) WARN_UNUSED_RESULT; +pslist_t *pslist_remove_link(pslist_t *pl, pslist_t *cell); +pslist_t *pslist_delete_link(pslist_t *pl, pslist_t *cell); +pslist_t *pslist_copy(pslist_t *pl) WARN_UNUSED_RESULT; +pslist_t *pslist_copy_deep(pslist_t *pl, + copy_data_fn_t fn, void *udata) WARN_UNUSED_RESULT; +pslist_t *pslist_reverse(pslist_t *pl) WARN_UNUSED_RESULT; +pslist_t *pslist_nth(pslist_t *pl, size_t n); +void *pslist_nth_data(pslist_t *pl, size_t n); +pslist_t *pslist_find(pslist_t *pl, const void *data); +pslist_t *pslist_find_custom(pslist_t *pl, const void *object, cmp_fn_t cmp); +long pslist_position(const pslist_t *pl, const pslist_t *cell); +long pslist_index(const pslist_t *pl, const void *data); +size_t pslist_length(const pslist_t *pl); +void pslist_foreach(const pslist_t *pl, data_fn_t cb, void *data); +pslist_t *pslist_foreach_remove(pslist_t *pl, + data_rm_fn_t cbr, void *data) WARN_UNUSED_RESULT; +pslist_t *pslist_insert_sorted(pslist_t *pl, + void *data, cmp_fn_t cmp) WARN_UNUSED_RESULT; +pslist_t *pslist_insert_sorted_with_dta(pslist_t *pl, void *data, + cmp_data_fn_t cmp, void *udata) WARN_UNUSED_RESULT; +pslist_t *pslist_sort(pslist_t *pl, cmp_fn_t cmp) WARN_UNUSED_RESULT; +pslist_t *pslist_sort_with_data(pslist_t *pl, + cmp_data_fn_t cmp, void *data) WARN_UNUSED_RESULT; +pslist_t *pslist_shuffle(pslist_t *pl) WARN_UNUSED_RESULT; +pslist_t *pslist_shuffle_with(random_fn_t rf, pslist_t *pl) WARN_UNUSED_RESULT; +pslist_t *pslist_random(const pslist_t *pl); +void *pslist_shift(pslist_t **pl_ptr) NON_NULL_PARAM((1)); + +static inline pslist_t * WARN_UNUSED_RESULT +pslist_prepend_const(pslist_t *pl, const void *data) +{ + return pslist_prepend(pl, deconstify_pointer(data)); +} + +static inline pslist_t * WARN_UNUSED_RESULT +pslist_append_const(pslist_t *pl, const void *data) +{ + return pslist_append(pl, deconstify_pointer(data)); +} + +static inline void * +pslist_random_data(const pslist_t *pl) +{ + pslist_t *r = pslist_random(pl); + return NULL == r ? NULL : r->data; +} + +#define PSLIST_FOREACH(slist, l) \ + for (l = (slist); NULL != (l); l = (l)->next) + +#define PSLIST_FOREACH_CALL(slist, func) \ +G_STMT_START { \ + pslist_t *sl_ = (slist); \ + while (NULL != sl_) { \ + func(sl_->data); \ + sl_ = sl_->next; \ + } \ +} G_STMT_END + +#define PSLIST_FOREACH_CALL_DATA(slist, func, user_data) \ +G_STMT_START { \ + pslist_t *sl_ = (slist); \ + void *user_data_ = (user_data); \ + while (NULL != sl_) { \ + func(sl_->data, user_data_); \ + sl_ = sl_->next; \ + } \ +} G_STMT_END + +#endif /* _pslist_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/rand31.c
Added
@@ -0,0 +1,473 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Simple Pseudo-Random Number Generation (PRNG) engine. + * + * This engine should not be used when strong random numbers are necessary. + * It is only meant to produce a simple source of randomness for tests, or + * to bootstrap stronger engines. + * + * It generates 31-bit random numbers via an interface compatible with the + * rand() C library function, only we append "31" at the tail to distinguish + * rand31() from the standard routine, and also emphasize the limited range + * of the random numbers we produce. + * + * When a sequence of random numbers yields an interesting result, it is + * possible to replay it by querying the original random seed. The only catch + * is that the number 0 is not a valid seed for rand31_set_seed(), as it + * requests the computation of a new random seed. Given this PRNG is only + * meant for tests and not for serious random numbers, this is not deemed a + * problem, only bad luck. + * + * To (slowly) generate strong random numbers, use entropy_random(). + * For (faster) strong random numbers, use arc4random(). + * + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#include "rand31.h" +#include "atomic.h" +#include "endian.h" +#include "entropy.h" +#include "hashing.h" +#include "log.h" +#include "mempcpy.h" +#include "random.h" +#include "spinlock.h" +#include "stacktrace.h" +#include "tm.h" + +#include "override.h" /* Must be the last header included */ + +static int rand31_seeded; /**< Whether PRNG was seeded */ +static unsigned rand31_seed; /**< The current seed */ +static unsigned rand31_first_seed; /**< The initial seed */ + +static spinlock_t rand31_lck = SPINLOCK_INIT; + +#define RAND31_LOCK spinlock_hidden(&rand31_lck) +#define RAND31_UNLOCK spinunlock_hidden(&rand31_lck) + +/** + * @return whether seed is 0 modulo RAND31_MOD + */ +static inline bool +rand31_is_zero(unsigned seed) +{ + return 0 == seed % RAND31_MOD; +} + +/** + * @return next random number following given seed. + */ +static inline unsigned +rand31_prng_next(unsigned seed) +{ + uint32 hi, lo; + + /* + * The computation used to be the very weak: + * + * seed * 1103515245 + 12345 + * + * which is less than optimal and does not vary much with + * the original seed. On 2015-11-21, we've switched to a + * better algorithm: + * + * seed * 7^5 mod 2^31-1 + * + * Because p=2^31-1 is a prime number, Z/pZ is a field, so + * we're guaranteed to loop over all the numbers, once, as + * long as the initial seed is not zero! + * + * This algorithm was first described in: + * + * "Random number generators: good ones are hard to find", + * by Park and Miller, Communications of the ACM, vol. 31, + * no. 10, p. 1195, October 1988. + * + * To perform the computation witout overflowing the 31 bits, + * and to avoid performing any division to take the modulo, + * we are using Robin Whittle's implementation, which is derived + * from the following article: + * + * "Two Fast Implementations of the 'Minimal Standard' Random + * Number Generator", by David G. Carta, Communications of the + * ACM, vol. 33, no. 1, p. 87-88, January 1990. + * + * This rand31() remains a weak generator from a statistical + * perspective, but it makes our rand31_u32() a decent one. + * + * Note that the generated numbers fall between 1 and 2^31 - 2, + * since 0 is avoided and 2^31 - 1 is the modulo, hence attempting + * uniform distribution via random_upto() will yield biased results. + * --RAM, 2015-11-21 + */ + + lo = 16807 * (seed & 0xffff); + hi = 16807 * (seed >> 16); + lo += (hi & 0x7fff) << 16; + lo += hi >> 15; + + if (lo > RAND31_MOD) + lo -= RAND31_MOD; + + g_assert(lo < RAND31_MOD && lo != 0); + + return lo; +} + +/** + * Computes a random seed to initialize the PRNG engine. + * + * @return initial random seed, guaranteed to not be zero. + */ +static unsigned +rand31_random_seed(void) +{ + char garbage64; /* Left uninitialized on purpose */ + tm_nano_t now; + size_t nsecs; + double cpu; + jmp_buf env; + unsigned discard; + unsigned seed; + +#ifndef ALLOW_UNINIT_VALUES + ZERO(&garbage); +#endif + + /* + * Our simple PRNG has only 31 bits of internal state. + * + * It is seeded by hashing some environmental constants: the ID of + * the process, the current time and current CPU state. To further + * create a unique starting point in the series of generated numbers, + * a second different hashing is done and reduced to 12 bits. This + * is interpreted as the amount of initial random values to discard. + */ + + tm_precise_time(&now); /* NOT tm_now_exact(): it is too early */ + nsecs = now.tv_nsec; + seed = integer_hash_fast(now.tv_nsec) + integer_hash_fast(now.tv_sec); + cpu = tm_cputime(NULL, NULL); + tm_precise_time(&now); + nsecs += now.tv_nsec; + seed += integer_hash_fast(getpid()); + seed += integer_hash_fast(getppid()); + seed += integer_hash_fast(getuid()); + seed += integer_hash_fast(getgid()); + seed += binary_hash(&now, sizeof now); + seed += binary_hash(&cpu, sizeof cpu); + seed += pointer_hash_fast(&now); + entropy_delay(); + tm_precise_time(&now); + nsecs += now.tv_nsec; + seed += binary_hash(&now, sizeof now); + seed += integer_hash_fast(nsecs); + ZERO(&env); /* Avoid uninitialized memory reads */ + if (Setjmp(env)) { + g_assert_not_reached(); /* We never longjmp() */ + } + seed += binary_hash(env, sizeof env); + seed += binary_hash(garbage, sizeof garbage); + discard = binary_hash2(env, sizeof env); + discard ^= binary_hash2(&now, sizeof now); + discard += getpid(); + discard += time(NULL); + cpu = tm_cputime(NULL, NULL); + discard += binary_hash2(&cpu, sizeof cpu); + discard = hashing_fold(discard, 12); + tm_precise_time(&now); + seed += binary_hash2(&now, sizeof now); + nsecs += now.tv_nsec; + entropy_delay(); + tm_precise_time(&now); + seed += integer_hash2(now.tv_sec + now.tv_nsec); + nsecs += now.tv_nsec; + nsecs %= 31; + seed = UINT32_ROTL(seed, nsecs); + if (rand31_is_zero(seed)) + seed = now.tv_sec; /* cannot be zero (modulo RAND31_MOD) */ + while (0 != discard--) { + seed = rand31_prng_next(seed); + } + + g_assert(!rand31_is_zero(seed)); + g_assert(0 != seed % RAND31_MOD); + + return seed; +} + +/** + * Internal version of random seed initializer. + * + * Using a seed of 0 computes a new random seed. + * + * This routine can safely be called without any thread lock. + */ +static void +rand31_do_seed(unsigned seed) +{ + while (seed >= RAND31_MOD) + seed -= RAND31_MOD; + + rand31_first_seed = rand31_seed = + rand31_is_zero(seed) ? rand31_random_seed() : seed; + + atomic_mb(); + atomic_int_inc(&rand31_seeded); +} + +/** + * Seed the PRNG engine if not already done. + * + * This routine can safely be called without any thread lock. + */ +static inline void ALWAYS_INLINE +rand31_check_seeded(void) +{ + if G_UNLIKELY(0 == atomic_int_get(&rand31_seeded)) + rand31_do_seed(0); +} + +/** +* Linear congruential pseudo-random number generation (PRNG). +* +* This PRNG is not used directly but rather through rand31(). +* +* @return a 31-bit random number. +*/ +static inline unsigned +rand31_prng(void) +{ + return rand31_seed = rand31_prng_next(rand31_seed); +} + +/** + * Add randomness to the rand31 PRNG state. + * + * @param data the start of the random data buffer + * @param len the amount of random bytes to process in the buffer + */ +void +rand31_addrandom(const void *data, size_t len) +{ + int rn; + const void *p = data; + uint32 v; + + rand31_check_seeded(); + + RAND31_LOCK; + + rn = rand31_prng(); /* In case we end-up with a zero seed */ + + while (len >= 4) { + p = peek_be32_advance(p, &v); + len -= 4; + rand31_seed ^= v; + } + + if (len != 0) { + g_assert(len < 4); + + v = 0; + while (len-- != 0) { + v <<= 8; + v |= peek_u8(p); + p = const_ptr_add_offset(p, 1); + } + rand31_seed ^= v; + } + + while (rand31_seed >= RAND31_MOD) + rand31_seed -= RAND31_MOD; + + if G_UNLIKELY(rand31_is_zero(rand31_seed)) + rand31_seed = rn; + + RAND31_UNLOCK; +} + +/** + * Minimal pseudo-random number generation. + * + * @return a 31-bit (positive) random number. + */ +int +rand31(void) +{ + int rn; + + rand31_check_seeded(); + + RAND31_LOCK; + rn = rand31_prng(); + RAND31_UNLOCK; + + return rn; +} + +/** + * Initialize the random seed. + * + * Using a seed of 0 computes a new random seed. + */ +void +rand31_set_seed(unsigned seed) +{ + unsigned s; + + s = rand31_is_zero(seed) ? rand31_random_seed() : seed; + + RAND31_LOCK; + rand31_do_seed(s); + RAND31_UNLOCK; +} + +/** + * @return initial seed, to be able to reproduce a random sequence. + */ +unsigned +rand31_initial_seed(void) +{ + unsigned rs; + + rand31_check_seeded(); + + RAND31_LOCK; + rs = rand31_first_seed; + RAND31_UNLOCK; + + return rs; +} + +/** + * @return current seed, to be able to replay a forthcoming random sequence. + */ +unsigned +rand31_current_seed(void) +{ + unsigned rs; + + rand31_check_seeded(); + + RAND31_LOCK; + rs = rand31_seed; + RAND31_UNLOCK; + + return rs; +} + +/** + * Compute uniformly distributed random number in the 0, max range, + * avoiding any modulo bias. + * + * @return uniformly distributed 31-bit number from 0 to max, inclusive. + */ +int +rand31_value(unsigned max) +{ + g_assert(max <= RAND31_MAX); + + STATIC_ASSERT(sizeof(int) == sizeof(unsigned)); /* Hence safe cast below */ + + return random_upto((random_fn_t) rand31, max); +} + +/** + * Build a 32-bit random number using a 31-bit number generator. + */ +uint32 +rand31_u32(void) +{ + unsigned rn, rx; + + rand31_check_seeded(); + + /* + * Our algorithm below draws 3 consecutive numbers from the sequence. + * The resulting period of the generator is larger than 2**32. + * + * Its behaviour is much better than rand31(), in term of statistical + * dispersion of numbers, based on the results of dieharder tests: + * + * ./random-test -u -T | dieharder -g 200 -a + */ + + RAND31_LOCK; + rx = rand31_prng(); + rn = UINT32_ROTR(rx, 11); + rx = rand31_prng(); + rn += UINT32_ROTR(rx, 17); + rx = rand31_prng(); + rn += UINT32_ROTL(rx, 5); + RAND31_UNLOCK; + + return rn; +} + +/** + * Build a random floating point number between 0.0 and 1.0 (not included). + * + * The number is such that it has 53 random mantissa bits, so the granularity + * of the number is 1/2**53. All bits being uniformly random, the number is + * uniformly distributed within the range without bias. + */ +double +rand31_double(void) +{ + return random_double_generate(rand31_u32); +} + +/** + * Fills buffer 'dst' with 'size' bytes of random data. + * + * @note + * Randomness is generated using rand31_u32(). + */ +void +rand31_bytes(void *dst, size_t size) +{ + char *p = dst; + + while (size > 4) { + const uint32 value = rand31_u32(); + p = mempcpy(p, &value, 4); + size -= 4; + } + if (size > 0) { + const uint32 value = rand31_u32(); + memcpy(p, &value, size); + } +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/rand31.h
Added
@@ -0,0 +1,61 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Simple Pseudo-Random Number Generation (PRNG) engine. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _rand31_h_ +#define _rand31_h_ + +#define RAND31_MOD ((1U << 31) - 1) /**< 2^31 - 1, a prime number */ +#define RAND31_MAX (RAND31_MOD - 1) /**< Maximum random number */ + +/** + * Random number generating routine for use in rand31_upto(). + */ +typedef int (*rand31_fn_t)(void); + +/* + * Public interface. + */ + +int rand31(); +void rand31_set_seed(unsigned seed); +unsigned rand31_initial_seed(void); +unsigned rand31_current_seed(void); +int rand31_value(unsigned max); +uint32 rand31_u32(void); +double rand31_double(void); +void rand31_bytes(void *dst, size_t size); +void rand31_addrandom(const void *data, size_t len); + +#endif /* _rand31_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/random-test.c
Added
@@ -0,0 +1,803 @@ +/* + * random-test -- random tests and benchmarking. + * + * Copyright (c) 2012 Raphael Manfredi <Raphael_Manfredi@pobox.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the authors nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "common.h" + +#include "lib/aje.h" +#include "lib/arc4random.h" +#include "lib/chi2.h" +#include "lib/cmwc.h" +#include "lib/entropy.h" +#include "lib/misc.h" +#include "lib/mtwist.h" +#include "lib/parse.h" +#include "lib/pow2.h" +#include "lib/progname.h" +#include "lib/rand31.h" +#include "lib/random.h" +#include "lib/shuffle.h" +#include "lib/stats.h" +#include "lib/str.h" +#include "lib/stringify.h" +#include "lib/teq.h" +#include "lib/thread.h" +#include "lib/tm.h" +#include "lib/well.h" +#include "lib/xmalloc.h" + +#define VALUES_REMEMBERED 128 +#define MIN_PERIOD 4 + +static void G_PRINTF(1, 2) +warning(const char *msg, ...) +{ + va_list args; + char buf128; + + va_start(args, msg); + str_vbprintf(buf, sizeof buf, msg, args); + va_end(args); + + fprintf(stderr, "%s: WARNING: %s\n", getprogname(), buf); +} + +static void G_NORETURN +usage(void) +{ + fprintf(stderr, + "Usage: %s -24eghluxABGMPQSTW -b mask -c items -m min\n" + " -p period -s skip -t amount -C val -D count\n" + " -F upper -R seed -U upper -X upper\n" + " -2 : test entropy_minirand() instead of rand31()\n" + " -4 : test arc4random() instead of rand31()\n" + " -b : bit mask to apply on random values (focus on some bits)\n" + " -c : sets item count to remember, for period computation\n" + " -e : test entropy_random() instead of rand31()\n" + " -g : add entropy every second to AJE, ARC4 and WELL generators\n" + " -h : prints this help message\n" + " -l : use thread-local PRNG state context, if supported by routine\n" + " -m : sets minimum period to consider\n" + " -p : sets period for value and bit counting\n" + " -s : skip that amount of initial random values\n" + " -t : benchmark generation of specified amount of random values\n" + " -u : test rand31_u32() instead of rand31()\n" + " -x : disable caching (pre-computing) of AJE random numbers\n" + " -A : test aje_rand(), the Fortuna-like PRNG, instead of rand31()\n" + " -B : count '1' occurrences of each bit\n" + " -C : count how many times the random value occurs (after -b)\n" + " -D : dump specified amount of random numbers (after -b)\n" + " -F : uses random floats multiplied by supplied constant\n" + " -G : test cmwc_rand(), George Marsaglia's PRNG\n" + " -M : test mt_rand(), the Mersenne Twister, instead of rand31()\n" + " -P : compute period through brute-force search\n" + " -Q : test shuffle_thread_rand()\n" + " -R : seed for repeatable random key sequence\n" + " -S : test random_strong(), a XOR of WELL1024b and ARC4\n" + " -T : dieharder test mode, dumping raw random bytes to stdout\n" + " -U : use uniform random numbers to specified upper bound\n" + " -W : test well_rand(), the WELL 1024 PRNG, instead of rand31()\n" + " -X : perform chi-squared test of uniform random numbers\n" + "Values given as decimal, hexadecimal (0x), octal (0) or binary (0b)\n" + "Use -T as in: %s -4l -T | dieharder -g 200 -a\n" + , getprogname(), getprogname()); + exit(EXIT_FAILURE); +} + +static unsigned +small_period(const unsigned *values, size_t count, unsigned min_period) +{ + unsigned *copy; + unsigned n, period = 0; + + XMALLOC_ARRAY(copy, count); + + /* Check for a small period up to 1/2 the remembered buffer */ + + for (n = min_period; n <= count / 2; n++) { + unsigned i; + + for (i = 0; i < n; i++) { + copyi = valuesi ^ valuesn + i; + if (copyi != 0) + break; + } + g_assert(n + i <= count); + + if (i == n) { + period = n; + break; + } + } + + xfree(copy); + return period; +} + +static void +count_bits(random_fn_t fn, uint64 period, unsigned bits, unsigned bcnt) +{ + uint64 n; + + memset(bits, 0, bcnt * sizeof bits0); + + for (n = 0; n < period; n++) { + unsigned val = (*fn)(); + unsigned i; + + for (i = 0; i < bcnt; i++) { + if (val & (1U << i)) + bitsi++; + } + if (0 == (n & 0xfff)) { + printf("Counting bits %s\r", uint64_to_string(n)); + fflush(stdout); + } + } + + printf("%-40s\n", "Finished counting bits!"); +} + +static unsigned +count_values(random_fn_t fn, unsigned period, unsigned mask, unsigned value) +{ + unsigned v = value & mask; + unsigned n, cnt = 0; + + for (n = 0; n < period; n++) { + unsigned val = (*fn)() & mask; + if G_UNLIKELY(val == v) + cnt++; + if (0 == (n & 0xfff)) { + printf("Counting %u (found %u)\r", n, cnt); + fflush(stdout); + } + } + + printf("%-40s\n", "Finished counting!"); + + return cnt; +} + +static uint64 G_HOT +compute_period(size_t count, random_fn_t fn, unsigned mask, unsigned min_period) +{ + size_t n; + size_t idx; /* Filling index */ + size_t didx = 0; /* Duplicate index */ + unsigned *values, *window; + unsigned period; + + XMALLOC_ARRAY(values, count); + XMALLOC_ARRAY(window, count); + + if (min_period < MIN_PERIOD) { + warning("Raising minimum period from %u to %u", min_period, MIN_PERIOD); + min_period = MIN_PERIOD; + } + + if (min_period > count / 2) { + warning("Capping minimum period from %u to %u", min_period, + (unsigned) count / 2); + min_period = count / 2; + } + + for (n = 0, idx = 0; idx < count; n++, idx++) { + unsigned val = (*fn)() & mask; + valuesidx = val; + if (0 == (n & 0xfff)) { + printf("Fill %u\r", (unsigned) n); + fflush(stdout); + } + } + + if (0 != (period = small_period(values, count, min_period))) + goto done; + + for (; n != 0; n++) { + unsigned val = (*fn)() & mask; + if G_UNLIKELY(val == valuesdidx) { + windowdidx = val; + if G_UNLIKELY(++didx == count) + break; + } else if G_UNLIKELY(didx != 0) { + size_t i; + + /* + * Did not match window0..didx with values. + * Try with window1..didx, window2..didx, etc... to + * re-establish a matching start point in `didx'. + */ + + for (i = 1; i < didx; i++) { + size_t j = 0; + + for (j = 0; j < didx - i; j++) { + if (windowi + j != valuesj) + goto no_match; + } + + if G_UNLIKELY(val == valuesj) { + g_assert(didx - i == j); + + memmove(window, &windowi, (didx - i) * sizeof window0); + didx = j + 1; + + g_assert(didx < count); + windowdidx = val; + break; + } + + no_match: + continue; + } + } + if (0 == (n & 0xfff)) { + int bits = highest_bit_set64(n); + printf("Period %s (%d bit%s)\r", + uint64_to_string(n), bits, plural(bits)); + fflush(stdout); + } + } + + period = 0 == n ? (unsigned) -1 : n - count + 1; + +done: + printf("%-30s\n", 0 == n ? "Looped over!" : "Done!"); + + xfree(values); + xfree(window); + return period; +} + +static void +skip_values(random_fn_t fn, unsigned skip) +{ + unsigned n = 0; + + while (n++ < skip) { + (void) (*fn)(); + if (1 == (n & 0xff)) { + printf("Skipping %u...\r", n); + fflush(stdout); + } + } + printf("Skipped %u initial random values\n", skip); +} + +static void +dump_random(random_fn_t fn, unsigned mask, unsigned dumpcnt) +{ + unsigned n; + + for (n = dumpcnt; n != 0; n--) { + printf("%u\n", (*fn)() & mask); + } +} + +static void +dump_raw(random_fn_t fn, unsigned mask, unsigned dumpcnt) +{ + uint n = dumpcnt; + + while (0 == dumpcnt || n != 0) { + uint32 v1024; + size_t i; + size_t g = 0 == dumpcnt ? N_ITEMS(v) : MIN(N_ITEMS(v), n); + + for (i = 0; i < g; i++) { + vi = (*fn)() & mask; + } + if (-1 == write(STDOUT_FILENO, &v, g * sizeof v0)) + break; + if (0 != dumpcnt) + n -= g; + } +} + +static void +display_bits(unsigned bits, unsigned nbits, uint64 period) +{ + unsigned i; + statx_t *st = statx_make_nodata(); + double avg, sdev, tavg; + unsigned used = nbits; + + for (i = nbits; i != 0; i--) { + if (0 != bitsi - 1) { + used = i; + break; + } + } + + for (i = 0; i < used; i++) { + statx_add(st, (double) bitsi); + } + + avg = statx_avg(st); + sdev = statx_sdev(st); + tavg = period / 2.0; + + for (i = 0; i < used; i++) { + bool odd = bitsi < tavg - 2 *sdev || bitsi > tavg + 2 * sdev; + printf("Bit #%-2u was set %u times (%.8f%%)%s\n", + i, bitsi, bitsi * 100.0 / MAX(1, period), + odd ? "*" : ""); + } + printf("Period used was %s\n", uint64_to_string(period)); + printf("Average bit count is %.3f (%+.3f), sdev=%.3f, bits=%u\n", + avg, avg - tavg, sdev, used); + + statx_free(st); +} + +#define CHI_CLASS 1000 /* Wants about 1000 items per class */ +#define CHI_MIN 5 /* Min amount of values per class */ +#define CHI_MAX_CLASSES 20 +#define CHI_CONFIDENCE 0.97 +#define CHI_MAX_RETRY 3 + +static void +chi2_test(random_fn_t fn, unsigned max) +{ + unsigned classes; + unsigned *values; + unsigned n, i, expected; + double ratio, chi2, p; + int retried = 0; + + classes = MIN(CHI_MAX_CLASSES, max); + XMALLOC0_ARRAY(values, classes); + + printf("Chi-squared test with uniform %u random numbers over %u classes:\n", + max, classes); + + expected = CHI_CLASS; + n = classes * expected; + ratio = (double) max / classes; + +retry: + for (i = 0; i < n; i++) { + unsigned val = random_upto(fn, max - 1); + + if (max == classes) { + valuesval++; + } else { + unsigned idx = (unsigned) (val / ratio); + valuesidx++; + } + + if (1 == (i & 0xfff)) { + printf("Generating %u / %u\r", i, n); + fflush(stdout); + } + } + + for (i = 0; i < classes; i++) { + if (valuesi < CHI_MIN && retried < CHI_MAX_RETRY) { + n *= 2; + expected *= 2; + printf("Need to double count of random numbers, now %u " + "(class #%u has %u)\n", n, i, valuesi); + retried++; + goto retry; + } + } + + printf("Generation of %u numbers completed\n", n); + fflush(stdout); + + chi2 = 0.0; + + for (i = 0; i < classes; i++) { + str_t *s; + double o = valuesi / (double) n; + double e = expected / (double) n; + double d = o - e; + size_t middle = 32; + + chi2 += d * d / e; + + s = str_new(0); + str_printf(s, "%5u o=%.6f (%u/%u),", i, o, valuesi, n); + if (str_len(s) < middle) + str_catf(s, "%*s", (int) (middle - str_len(s)), " "); + str_catf(s, "e=%g (%u/%u)\n", e, expected, n); + printf("%s", str_2c(s)); + str_destroy_null(&s); + } + + p = chi2_upper_tail(classes - 1, chi2); + printf("Chi2=%g, p=%g (%s)\n", chi2, p, + p > CHI_CONFIDENCE ? "OK" : "SKEWED"); + + xfree(values); +} + +static void +timeit(random_fn_t fn, unsigned amount, const char *name) +{ + tm_t start, end; + double ustart, uend; + unsigned i; + unsigned generated = amount; + unsigned calls = amount; + + tm_now_exact(&start); + tm_cputime(&ustart, NULL); + (void) (*fn)(); + tm_cputime(&uend, NULL); + tm_now_exact(&end); + + printf("%s() initialization took %.3gs (CPU=%.3gs)\n", + name, tm_elapsed_f(&end, &start), uend - ustart); + + fflush(stdout); + + tm_now_exact(&start); + tm_cputime(&ustart, NULL); +again: + for (i = calls; i != 0; i--) { + (*fn)(); + } + tm_cputime(&uend, NULL); + if (uend - ustart < 0.05) { + calls *= 2; + generated += calls; + goto again; + } + tm_now_exact(&end); + + { + double elapsed = tm_elapsed_f(&end, &start); + double cpu = uend - ustart; + + printf("Calling %s() %u times took %.3gs (CPU=%.3gs), %g numbers/s\n", + name, generated, elapsed, cpu, generated / elapsed); + + } +} + +static unsigned +get_number(const char *arg, int opt) +{ + int error; + uint32 val; + + val = parse_v32(arg, NULL, &error); + if (0 == val && error != 0) { + fprintf(stderr, "%s: invalid -%c argument \"%s\": %s\n", + getprogname(), opt, arg, g_strerror(error)); + exit(EXIT_FAILURE); + } + + return val; +} + +struct uniform { + random_fn_t rf; + uint32 max; +} uniform; + +static uint32 +rand_uniform(void) +{ + return random_upto(uniform.rf, uniform.max); +} + +struct fp { + random_fn_t rf; + uint32 max; +} fp; + +static uint32 +rand_fp(void) +{ + return random_double_generate(fp.rf) * fp.max; +} + +static void * +add_entropy(void *p) +{ + (void) p; + + for (;;) { + uint32 v16; + size_t i; + + thread_sleep_ms(500); + + for (i = 0; i < N_ITEMS(v); i++) { + vi = rand31_u32(); + } + + random_add(v, sizeof v); + } + + return NULL; +} + +static void +start_generate_thread(bool verbose) +{ + teq_create_if_none(); + + thread_create(add_entropy, NULL, + THREAD_F_DETACH | THREAD_F_PANIC, THREAD_STACK_MIN); + + if (verbose) + printf("Started entropy generation thread for ARC4 and WELL\n"); +} + +int +main(int argc, char **argv) +{ + extern int optind; + extern char *optarg; + int optind_orig = optind; + size_t count = VALUES_REMEMBERED; + unsigned min_period = MIN_PERIOD; + int c; + uint64 period = (uint64) -1; + unsigned mask = (unsigned) -1; + unsigned rseed = 0, cval = 0, skip = 0, dumpcnt = 0, benchmark = 0, chi = 0; + bool cperiod = FALSE, countval = FALSE, countbits = FALSE, dumpraw = FALSE; + bool generate = FALSE, no_precompute = FALSE; + random_fn_t fn = (random_fn_t) rand31; + bool test_local = FALSE; + const char *fnname = "rand31"; + const char options = "24b:c:eghlm:p:s:t:uxABC:D:F:GMPQR:STU:WX:"; + +#define SET_RANDOM(x) \ +G_STMT_START { \ + fn = x; \ + fnname = #x; \ +} G_STMT_END + + progstart(argc, argv); + misc_init(); + + while ((c = getopt(argc, argv, options)) != EOF) { + if ('l' == c) { + test_local = TRUE; + } else if ('x' == c) { + no_precompute = TRUE; + } + } + + /* + * Despite what the manual says, the getopt() from the Linux libc6 2.17 + * does not work properly when resetting optind to 1 (it skips the first + * argument in the second parsing). + * --RAM, 2013-12-27 + */ + + optind = optind_orig; + + while ((c = getopt(argc, argv, options)) != EOF) { + switch (c) { + case '2': /* test entropy_minirand() */ + SET_RANDOM(entropy_minirand); + break; + case '4': /* test arc4random() */ + if (test_local) { + SET_RANDOM(arc4_thread_rand); + } else { + SET_RANDOM(arc4random); + } + break; + case 'b': /* bitmask to apply to random values */ + mask = get_number(optarg, c); + break; + case 'c': /* amount of items to remember */ + count = get_number(optarg, c); + break; + case 'e': + SET_RANDOM(entropy_random); + break; + case 'g': /* generate "entropy" in background thread */ + generate = TRUE; + break; + case 'l': /* test thread-local (already handled before) */ + break; + case 'm': /* supersede defaul mininum period */ + min_period = get_number(optarg, c); + break; + case 'p': /* supersede period */ + period = get_number(optarg, c); + break; + case 's': /* initial amount of random values to skip */ + skip = get_number(optarg, c); + break; + case 't': /* benchmark number generation */ + benchmark = get_number(optarg, c); + break; + case 'u': /* check rand31_u32() instead */ + SET_RANDOM(rand31_u32); + break; + case 'x': /* disable AJE caching (already handled before) */ + break; + case 'A': /* check aje_random() instead */ + if (test_local) { + if (no_precompute) + SET_RANDOM(aje_thread_rand_strong); + else + SET_RANDOM(aje_thread_rand); + } else { + if (no_precompute) + SET_RANDOM(aje_rand_strong); + else + SET_RANDOM(aje_rand); + } + break; + case 'B': /* count occurrences of each bit */ + countbits = TRUE; + break; + case 'C': /* count amount of times value is returned */ + countval = TRUE; + cval = get_number(optarg, c); + break; + case 'D': /* dump random number */ + dumpcnt = get_number(optarg, c); + break; + case 'F': /* floating-point-based random numbers */ + fp.max = get_number(optarg, c); + break; + case 'G': /* check cmwc_rand() */ + if (test_local) { + SET_RANDOM(cmwc_thread_rand); + } else { + SET_RANDOM(cmwc_rand); + } + break; + case 'M': /* check mt_rand() instead */ + if (test_local) { + SET_RANDOM(mt_thread_rand); + } else { + SET_RANDOM(mt_rand); + } + break; + case 'P': /* compute period */ + cperiod = TRUE; + break; + case 'Q': /* test shuffle_thread_rand() */ + SET_RANDOM(shuffle_thread_rand); + break; + case 'R': /* randomize in a repeatable way */ + rseed = get_number(optarg, c); + break; + case 'S': /* test random_strong() */ + SET_RANDOM(random_strong); + break; + case 'T': /* dump raw numbers to stdout */ + dumpraw = TRUE; + break; + case 'U': /* uniform random numbers */ + uniform.max = get_number(optarg, c); + break; + case 'W': /* check well_rand() instead */ + if (test_local) { + SET_RANDOM(well_thread_rand); + } else { + SET_RANDOM(well_rand); + } + break; + case 'X': /* perform chi-squared test */ + chi = get_number(optarg, c); + break; + case 'h': /* show help */ + default: + usage(); + break; + } + } + + if ((argc -= optind) != 0) + usage(); + + if (generate) + start_generate_thread(!dumpraw); + + if (dumpraw) { + dump_raw(fn, mask, dumpcnt); + return 0; + } + + printf("Testing %s()\n", fnname); + + if (fp.max != 0) { + fp.rf = fn; + fn = rand_fp; + printf("Using floating-point-based random numbers up to %u with %s\n", + fp.max, fnname); + fnname = "rand_fp"; + } + + if (uniform.max != 0) { + uniform.rf = fn; + fn = rand_uniform; + printf("Using uniform random numbers up to %u with %s\n", + uniform.max, fnname); + } + + if (benchmark != 0) + timeit(fn, benchmark, fnname); + + if (is_strprefix(fnname, "rand31")) { + rand31_set_seed(rseed); + printf("Initial random seed is %s\n", + uint32_to_gstring(rand31_initial_seed())); + } + + if (skip != 0) + skip_values(fn, skip); + + if (cperiod) { + int bits; + period = compute_period(count, fn, mask, min_period); + bits = highest_bit_set64(period); + printf("Period is %s " + "(%u remembered values, mask=0x%x, min=%u, bits=%d)\n", + uint64_to_string(period), (unsigned) count, mask, min_period, bits); + } + + if (countval) { + unsigned n = count_values(fn, period, mask, cval); + printf("Found %u occurence%s of %u (mask 0x%x) within period of %s\n", + n, plural(n), cval & mask, mask, uint64_to_string(period)); + } + + if (countbits) { + unsigned bits32; + unsigned nbits; + + nbits = N_ITEMS(bits); + + if ((random_fn_t) rand31 == fn) { + nbits = 31; + period &= ~(1U << 31); + } + + g_assert(nbits <= N_ITEMS(bits)); + + count_bits(fn, period, bits, nbits); + display_bits(bits, nbits, period); + } + + if (chi != 0) + chi2_test(fn, chi); + + if (dumpcnt != 0) + dump_random(fn, mask, dumpcnt); + + return 0; +} +
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/random.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/random.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2001-2010, Raphael Manfredi + * Copyright (c) 2001-2010, 2012-2013 Raphael Manfredi * Copyright (c) 2003-2008, Christian Biere * *---------------------------------------------------------------------- @@ -28,8 +28,43 @@ * * Random numbers. * + * This layer provides generic operations on random number generators, such + * as generating uniform random numbers over an interval, or producing random + * double value based on integer PRNG routines. + * + * It also hides to client code the choice of the underlying PRNG routines. + * + * Most of the random number generating functions here are based on the + * Mersenne Twister, which is faster than ARC4. When generating uniform + * random values, we use the WELL1024b algorithm. + * + * The only exception is the random_bytes() routine, which still relies on + * arc4random(). The reason is that we use random_pool_append() and + * random_add() to inject external sources of randomness to the ARC4 engine. + * This lets us perturb the output of the PRNG algorithm, which is not an + * operation supported by the Mersenne Twister. + * + * When we generate unique IDs that are shown to the world, we rely on + * random_strong() and random_strong_bytes() to generate unpredictable and + * optimally distributed random numbers. The random_strong() routine combines + * the output of WELL and ARC4, to be absolutely certain that the IDs are + * unpredictable even if enough consecutive IDs have been seen. + * + * The application has three ways to add more entropy to the random number + * generators: + * + * - it can call random_collect() on a regular basis, which will pool 1 byte. + * - it can call random_pool_append() to add "random" data to the pool. + * - it can call random_add() to immediately feed the entropy. + * + * When the pool is full, it is flushed by calling random_add(). + * + * The application can register listeners via random_added_listener_add(). + * They are invoked each time the collected pool has been flushed to + * random_add(). + * * @author Raphael Manfredi - * @date 2001-2010 + * @date 2001-2010, 2012-2013 * @author Christian Biere * @date 2003-2008 */ @@ -37,96 +72,704 @@ #include "common.h" #include "random.h" + +#include "aje.h" #include "arc4random.h" +#include "atomic.h" +#include "cmwc.h" +#include "dump_options.h" #include "endian.h" +#include "entropy.h" +#include "evq.h" +#include "float.h" +#include "listener.h" +#include "log.h" +#include "mempcpy.h" #include "misc.h" +#include "mtwist.h" +#include "once.h" +#include "pow2.h" +#include "pslist.h" +#include "sha1.h" +#include "spinlock.h" +#include "stringify.h" +#include "teq.h" +#include "thread.h" #include "tm.h" #include "unsigned.h" -#include "sha1.h" -#include "log.h" +#include "walloc.h" +#include "well.h" #include "override.h" /* Must be the last header included */ +#define RANDOM_ENTROPY_PERIOD (30 * 1000) /* ms: entropy propagation period */ + +/** + * Pseudo Random Number Generators managed by this library and for which + * we periodically spread new entropy. + */ +enum random_prng { + RANDOM_AJE = 0, + RANDOM_ARC4, + RANDOM_CMWC, + RANDOM_WELL, + + RANDOM_PRNG_COUNT +}; + +/** + * Statistics. + */ +static struct random_stats { + uint aje_threads; /* Amount of threads using AJE */ + uint arc4_threads; /* Amount of threads using ARC4 */ + uint cmwc_threads; /* Amount of threads using CMWC */ + uint well_threads; /* Amount of threads using WELL */ + uint aje_ignored_threads; /* Threads using AJE with no TEQ */ + uint arc4_ignored_threads; /* Threads using ARC4 with no TEQ */ + uint cmwc_ignored_threads; /* Threads using CMWC with no TEQ */ + uint well_ignored_threads; /* Threads using WELL with no TEQ */ + AU64(input_random_add); /* Bytes input to random_add() */ + AU64(input_random_add_pool); /* Bytes input to random_add_pool() */ + AU64(output_random_bytes); /* Bytes emitted via random_bytes() */ + AU64(output_random_bytes_with); /* ... via random_bytes_with() */ + AU64(output_random_strong_bytes); /* ... via random_strong_bytes() */ + AU64(output_random_key_bytes); /* ... via random_key_bytes() */ + AU64(random_entropy_distribution); /* Entropy distribution to PRNGs */ + AU64(aje_distributed); /* # of distributions to global AJE */ + AU64(aje_thread_distributed); /* # of distributions to thread AJE */ + AU64(arc4_distributed); /* # of distributions to global ARC4 */ + AU64(arc4_thread_distributed); /* # of distributions to thread ARC4 */ + AU64(cmwc_distributed); /* # of distributions to global CMWC */ + AU64(cmwc_thread_distributed); /* # of distributions to thread CMWC */ + AU64(well_distributed); /* # of distributions to global WELL */ + AU64(well_thread_distributed); /* # of distributions to thread WELL */ + AU64(random_cpu_noise); /* Calls to routine */ + AU64(random_collect); /* Calls to routine */ + AU64(random_entropy); /* Calls to routine */ + AU64(random_upto); /* Calls to routine */ + AU64(random_u32); /* Calls to routine */ + AU64(random_u64); /* Calls to routine */ + AU64(random_ulong); /* Calls to routine */ + AU64(random_value); /* Calls to routine */ + AU64(random_ulong_value); /* Calls to routine */ + AU64(random64_upto); /* Calls to routine */ + AU64(random64_value); /* Calls to routine */ + AU64(random_bytes); /* Calls to routine */ + AU64(random_bytes_with); /* Calls to routine */ + AU64(random_strong_bytes); /* Calls to routine */ + AU64(random_key_bytes); /* Calls to routine */ + AU64(random_double); /* Calls to routine */ + AU64(random_double_generate); /* Calls to routine */ + AU64(random_add); /* Calls to routine */ + AU64(random_add_pool); /* Calls to routine */ + AU64(random_added_fire); /* Calls to routine */ + AU64(random_stats_digest); /* Calls to routine */ +} random_stats; + +static spinlock_t random_stats_lock = SPINLOCK_INIT; + +#define RANDOM_STATS_LOCK spinlock(&random_stats_lock) +#define RANDOM_STATS_UNLOCK spinunlock(&random_stats_lock) + +#define RANDOM_STATS_INC(name) AU64_INC(&random_stats.name) +#define RANDOM_STATS_ADD(name, val) AU64_ADD(&random_stats.name, (val)) + +/** + * Randomness update listeners. + * + * These are invoked right after new randomness was added to the random + * number generators. + */ +static listeners_t random_added_listeners; + +void random_added_listener_add(random_added_listener_t l) +{ + LISTENER_ADD(random_added, l); +} + +void random_added_listener_remove(random_added_listener_t l) +{ + LISTENER_REMOVE(random_added, l); +} + +static void +random_added_fire(void) +{ + RANDOM_STATS_INC(random_added_fire); + + LISTENER_EMIT(random_added, ()); +} + +/** + * Generate uniformly distributed random numbers using supplied random + * function to generate random 32-bit quantities. + * + * @param rf random function generating 32-bit random numbers + * @param max maximum value allowed for number (inclusive) + * + * @return uniformly distributed random number in the 0, max range. + */ +uint32 +random_upto(random_fn_t rf, uint32 max) +{ + uint32 range, min, value; + + RANDOM_STATS_INC(random_upto); + + if G_UNLIKELY(0 == max) + return 0; + + if G_UNLIKELY((uint32) -1 == max) + return (*rf)(); + + /* + * We can't just use the modulo operator blindly because that would + * create a small bias: if the 2^32 interval cannot be evenly divided + * by the range of the random values, the fraction of the numbers that + * lie in the trailing partial fragment will be more likely to occur + * than others. The larger the range, the higher the bias. + * + * Imagine we throw a 10-sided dice, getting values from 0 to 9. + * If we want only a random number in the 0, 2 interval, then we + * cannot just return the value of d10 % 3: looking at the number of + * results that can produce the resulting random number, we see that: + * + * 0 is produced by 0, 3, 6, 9 + * 1 is produced by 1, 4, 7 + * 2 is produced by 2, 5, 8 + * + * So 0 has 40% chances of being returned, with 1 and 2 having 30%. + * A uniform distribution would require 33.33% chances for each number! + * + * If the range is a power of 2, then we know the 2^32 interval can be + * evenly divided and we can just mask the lower bits (all bits are + * expected to be random in the 32-bit value). + * + * Otherwise, we have to exclude values from the set of possible 2^32 + * values to restore a uniform probability for all outcomes. In our d10 + * example above, removing the 0 value (i.e. rethrowing the d10 when we + * get a 0) restores the 33.33% chances for each number to be produced). + * + * The amount of values to exclude is (2^32 % range). + */ + + range = max + 1; + + if (is_pow2(range)) + return (*rf)() & max; /* max = range - 1 */ + + /* + * Compute the minimum value we need in the 2^32 range to restore + * uniform probability for all outcomes. + * + * We want to exclude the first (2^32 % range) values. + */ + + if (range > (1U << 31)) { + min = ~range + 1; /* 2^32 - range */ + } else { + /* + * Can't represent 2^32 in 32 bits, so we use an alternate computation. + * + * Because range <= 2^31, we can compute (2^32 - range) % range, and + * it will yield the same result as 2^32 % range: (Z/nZ, +) is a group, + * and range % range = 0. + * + * To compute (2^32 - range) without using 2^32, we cheat, realizing + * that 2^32 = -1 + 1 (using unsigned arithmetic). + */ + + min = ((uint32) -1 - range + 1) % range; + } + + value = (*rf)(); + + if G_UNLIKELY(value < min) { + size_t i; + + for (i = 0; i < 100; i++) { + value = (*rf)(); + + if (value >= min) + goto done; + } + + /* Will occur once every 10^30 attempts */ + s_error("no luck with random number generator"); + } + +done: + return value % range; +} + +/** + * Generate uniformly distributed random numbers using supplied random + * function to generate random 64-bit quantities. + * + * @param rf random function generating 64-bit random numbers + * @param max maximum value allowed for number (inclusive) + * + * @return uniformly distributed random number in the 0, max range. + */ +uint64 +random64_upto(random64_fn_t rf, uint64 max) +{ + uint64 range, min, value; + + RANDOM_STATS_INC(random64_upto); + + if G_UNLIKELY(0 == max) + return 0; + + if G_UNLIKELY((uint64) -1 == max) + return (*rf)(); + + range = max + 1; + + if (IS_POWER_OF_2(range)) + return (*rf)() & max; /* max = range - 1 */ + + /* + * Same logic as random_upto() but in 64-bit arithmetic. + */ + + if (range > ((uint64) 1U << 63)) { + min = ~range + 1; /* 2^64 - range */ + } else { + min = ((uint64) -1 - range + 1) % range; + } + + value = (*rf)(); + + if G_UNLIKELY(value < min) { + size_t i; + + for (i = 0; i < 100; i++) { + value = (*rf)(); + + if (value >= min) + goto done; + } + + /* Will occur once every 10^30 attempts */ + s_error("no luck with random number generator"); + } + +done: + return value % range; +} + /** - * @return random value between 0 and (2**32)-1. All 32 bit are random. + * @return random value between 0 and (2**32)-1. All 32 bits are random. */ -guint32 +uint32 random_u32(void) { - return arc4random(); + RANDOM_STATS_INC(random_u32); + + return mt_thread_rand(); } /** - * @return random value between (0..max). + * @return random value between 0 and (2**64)-1. All 64 bits are random. */ -guint32 -random_value(guint32 max) +uint64 +random_u64(void) { - return (guint32) ((max + 1.0) * random_u32() / ((guint32) -1 + 1.0)); + RANDOM_STATS_INC(random_u64); + + return mt_thread_rand64(); } /** - * Fills buffer 'dst' with 'size' bytes of random data. + * @return random long value, all bits being random. + */ +ulong +random_ulong(void) +{ + RANDOM_STATS_INC(random_ulong); + +#if LONGSIZE == 8 + return mt_thread_rand64(); +#elif LONGSIZE == 4 + return mt_thread_rand(); +#else +#error "unhandled long size" +#endif +} + +/** + * @return 32-bit random value between 0, max, inclusive. + */ +uint32 +random_value(uint32 max) +{ + RANDOM_STATS_INC(random_value); + + /* + * This used to return: + * + * (uint32) ((max + 1.0) * arc4random() / ((uint32) -1 + 1.0)) + * + * but using floating point computation introduces a bias because not + * all the integers in the numerator can be fully represented. + * + * Hence we now prefer random_upto() which garanteees a uniform + * distribution of the random numbers, using integer-only arithmetic. + * + * We also switched to mt_rand() because it is faster than arc4random(). + * And mt_thread_rand() is a lock-free path, even faster than mt_rand(). + * + * Switching to well_thread_rand() since we now add entropy regularily + * to the WELL pools. ARC4 remains used for random_bytes() and MT is + * used for shuffling since that is the quickest routine still. + * --RAM, 2013-12-18 + */ + + return random_upto(well_thread_rand, max); +} + +/** + * @return 64-bit random value between 0, max, inclusive. + */ +uint64 +random64_value(uint64 max) +{ + RANDOM_STATS_INC(random64_value); + + return random64_upto(well_thread_rand64, max); +} + +/** + * @return random unsigned long value between 0, max, inclusive. + */ +ulong +random_ulong_value(ulong max) +{ + RANDOM_STATS_INC(random_ulong_value); + +#if LONGSIZE == 8 + return random64_upto(well_thread_rand64, max); +#elif LONGSIZE == 4 + return random_upto(well_thread_rand, max); +#else +#error "unhandled long size" +#endif +} + +/** + * Fills buffer 'dst' with 'size' bytes of random data generated by `rf'. */ void -random_bytes(void *dst, size_t size) +random_bytes_with(random_fn_t rf, void *dst, size_t size) { char *p = dst; + RANDOM_STATS_INC(random_bytes_with); + RANDOM_STATS_ADD(output_random_bytes_with, size); + while (size > 4) { - const guint32 value = random_u32(); - memcpy(p, &value, 4); - p += 4; + const uint32 value = (*rf)(); + p = mempcpy(p, &value, 4); size -= 4; } if (size > 0) { - const guint32 value = random_u32(); + const uint32 value = (*rf)(); memcpy(p, &value, size); } } /** + * Fills buffer 'dst' with 'size' bytes of random data. + * + * The random pool used by this routine can be perturbed by collecting + * randomness externally. It is therefore desirable that it be used + * when continuously generating random buffers, such as GUIDs or other + * global IDs that need to be as unique and unpredictable as possible + * during the lifetime of the program. + */ +void +random_bytes(void *dst, size_t size) +{ + RANDOM_STATS_INC(random_bytes); + RANDOM_STATS_ADD(output_random_bytes, size); + + /* + * This routine must continue to use arc4random(), even though it is + * slower than mt_rand(), because of random_add_pool(): periodic collection + * of external randomness can usefully perturb the random number generator + * and should yield better results than a pure PRNG delivering its sequence, + * even one as good as the one coming out of the Mersenne Twister. + * --RAM, 2012-12-15 + * + * Switching to arc4_thread_rand() to use the thread-local ARC4 stream, + * which avoids taking locks and is therefore faster than arc4random(). + */ + + random_bytes_with(arc4_thread_rand, dst, size); +} + +/** + * Strong random routine that must be used to generate random data streams + * made visible to the outside. + * + * @note + * This routine should not be used directly by applications, as it is only + * meant to be used via random_strong_bytes(). Prefer random_u32() if you + * need a 32-bit random value, for speed reasons mostly. However, using this + * routine will cause no harm. It is only exported to be exercised in the + * random-test program. + */ +uint32 +random_strong(void) +{ + /* + * Regardless of the statistical properties of WELL or the Mersenee Twister, + * it is always possible to determine the next numbers to come when one + * has seen enough consecutive output (basically an amount of random bits + * equal to the internal state of these generators). This is what makes + * them unsuitable for cryptography, for instance. + * + * In contrast, ARC4 is a cryptographically strong generator and even though + * it can be broken one day, the resources required are much larger. + * + * Therefore, when we need to generate random bytes that are seen outside + * of this program, it is important to make them as random and unpredictable + * as possible. For instance, GUID in messages. + * + * We achieve this strong randomness by combining ARC4 and WELL randomness. + * Both of these streams can also be constantly receiving new entropy via + * regular calls to random_add(). + */ + + return arc4_thread_rand() ^ well_thread_rand(); +} + +/** + * Fills buffer 'dst' with 'size' bytes of STRONG random data. + * + * This should be the preferred method when generating random data visible + * to the outside, and which must be unique and unpredictable even when enough + * random data has been seen. + */ +void +random_strong_bytes(void *dst, size_t size) +{ + RANDOM_STATS_INC(random_strong_bytes); + RANDOM_STATS_ADD(output_random_strong_bytes, size); + + random_bytes_with(random_strong, dst, size); +} + +/** + * Hyper-strong random routine to generate key-grade randomness. + */ +static uint32 +random_key(void) +{ + uint32 r1, r2; + + r1 = arc4random() ^ well_rand() ^ aje_rand() ^ cmwc_rand(); + r2 = UINT32_ROTR(r1, 13); + r1 = arc4random() ^ well_rand() ^ aje_rand() ^ cmwc_rand(); + r2 += UINT32_ROTL(r1, 7); + r1 = arc4random() ^ well_rand() ^ aje_rand() ^ cmwc_rand(); + + /* + * It is NOT a mistake: we're using entropy_minirand() in the + * UINT32_ROTR() macro, meaning it will be called twice. + */ + + return r1 + r2 + UINT32_ROTR(entropy_minirand(), 17); +} + +/** + * Fills buffer 'dst' with 'size' bytes of KEY-material random data. + * + * This should be the preferred method when generating a cryptographic key + * as it is slow and uses global random pools, which means taking and + * releasing about 14 locks for each 32-bit number we're generating. + */ +void +random_key_bytes(void *dst, size_t size) +{ + RANDOM_STATS_INC(random_key_bytes); + RANDOM_STATS_ADD(output_random_key_bytes, size); + + random_bytes_with(random_key, dst, size); +} + +/** * Return random noise, CPU intensive on purpose (to add random response delay). */ -guint32 +uint32 random_cpu_noise(void) { - static guchar data512; + static uchar data512; struct sha1 digest; - SHA1Context ctx; - guint32 r, i; - - r = random_u32(); - i = r % G_N_ELEMENTS(data); + SHA1_context ctx; + uint32 r, i; + + RANDOM_STATS_INC(random_cpu_noise); + + /* No need to make this routine thread-safe as we want noise anyway */ + + r = well_thread_rand() ^ mt_thread_rand() ^ arc4_thread_rand(); + i = r % N_ITEMS(data); datai = r; - SHA1Reset(&ctx); - SHA1Input(&ctx, data, i); - SHA1Result(&ctx, &digest); + SHA1_reset(&ctx); + SHA1_input(&ctx, data, i); + SHA1_result(&ctx, &digest); return peek_le32(digest.data); } +enum random_byte_data_magic { RANDOM_BYTE_DATA_MAGIC = 0x1feded57 }; + /** - * Add collected random byte(s) to the random pool, flushing to the random - * number generator when enough has been collected. + * Random bytes propagated to a thread. + */ +struct random_byte_data { + enum random_byte_data_magic magic; + void *data; /* Data buffer */ + size_t len; /* Amount of bytes in buffer */ + int refcnt; /* Reference count */ +}; + +static struct random_byte_data * +random_byte_data_alloc(const void *data, size_t len) +{ + struct random_byte_data *rbd; + + WALLOC(rbd); + rbd->magic = RANDOM_BYTE_DATA_MAGIC; + rbd->data = wcopy(data, len); + rbd->len = len; + rbd->refcnt = 1; + + return rbd; +} + +static inline void +random_byte_data_check(const struct random_byte_data * const rbd) +{ + g_assert(rbd != NULL); + g_assert(RANDOM_BYTE_DATA_MAGIC == rbd->magic); +} + +static void +random_byte_data_free(struct random_byte_data *rbd) +{ + random_byte_data_check(rbd); + + if (atomic_int_dec_is_zero(&rbd->refcnt)) { + WFREE_NULL(rbd->data, rbd->len); + rbd->magic = 0; + WFREE(rbd); + } +} + +/** + * TEQ event delivered to a thread to add random bytes to the local ARC4 stream. + */ +static void +random_byte_arc4_add(void *p) +{ + struct random_byte_data *rbd = p; + + random_byte_data_check(rbd); + + RANDOM_STATS_INC(arc4_thread_distributed); + + arc4_thread_addrandom(rbd->data, rbd->len); + random_byte_data_free(rbd); +} + +/** + * TEQ event delivered to a thread to add random bytes to the local WELL stream. + */ +static void +random_byte_well_add(void *p) +{ + struct random_byte_data *rbd = p; + + random_byte_data_check(rbd); + + RANDOM_STATS_INC(well_thread_distributed); + + well_thread_addrandom(rbd->data, rbd->len); + random_byte_data_free(rbd); +} + +/** + * TEQ event delivered to a thread to add random bytes to the local AJE stream. + */ +static void +random_byte_aje_add(void *p) +{ + struct random_byte_data *rbd = p; + + random_byte_data_check(rbd); + + RANDOM_STATS_INC(aje_thread_distributed); + + aje_thread_addrandom(rbd->data, rbd->len); + random_byte_data_free(rbd); +} + +/** + * TEQ event delivered to a thread to add random bytes to the local CMWC stream. + */ +static void +random_byte_cmwc_add(void *p) +{ + struct random_byte_data *rbd = p; + + random_byte_data_check(rbd); + + RANDOM_STATS_INC(cmwc_thread_distributed); + + cmwc_thread_addrandom(rbd->data, rbd->len); + random_byte_data_free(rbd); +} + +/** + * Add collected random byte(s) to the random pool used by random_bytes(), + * flushing to the random number generator when enough has been collected. * * @param buf buffer holding random data * @param len length of random data * * @return TRUE if pool was flushed. */ -static gboolean +static bool random_add_pool(void *buf, size_t len) { - static guchar data256; + static uint8 data256; static size_t idx; - guchar *p; + static spinlock_t pool_slk = SPINLOCK_INIT; + uchar *p; size_t n; - gboolean flushed = FALSE; + bool flushed = FALSE; + + RANDOM_STATS_INC(random_add_pool); + RANDOM_STATS_ADD(input_random_add_pool, len); + + /* + * If we cannot lock, it means we're recursing (and hence would deadlock) + * or another thread is busy adding random data. In that case, simply + * give the random bytes directly instead of buffering them. + */ + + if (!spinlock_try(&pool_slk)) { + random_add(buf, len); + return FALSE; + } g_assert(size_is_non_negative(idx)); - g_assert(idx < G_N_ELEMENTS(data)); + g_assert(idx < N_ITEMS(data)); for (p = buf, n = len; n != 0; p++, n--) { dataidx++ = *p; @@ -135,13 +778,16 @@ * Feed extra bytes when we have enough. */ - if (idx >= G_N_ELEMENTS(data)) { - arc4random_addrandom(data, sizeof data); + if G_UNLIKELY(idx >= N_ITEMS(data)) { + random_add(data, sizeof data); + ZERO(&data); /* Hide them now */ idx = 0; flushed = TRUE; } } + spinunlock(&pool_slk); + return flushed; } @@ -150,21 +796,26 @@ * bit of random information. Once in a while, when enough randomness has * been collected, it feeds it to the random number generator. * - * @param cb routine to invoke if non-NULL when randomness is fed + * This helps generating unique sequences via random_bytes(). */ void -random_collect(void (*cb)(void)) +random_collect(void) { static tm_t last; static time_delta_t prev; static time_delta_t running; - static unsigned sum; + static uint32 sum; + static spinlock_t collect_slk = SPINLOCK_INIT; tm_t now; time_delta_t d; unsigned r, m, a; - guchar rbyte; + uchar rbyte; tm_now_exact(&now); + RANDOM_STATS_INC(random_collect); + + spinlock(&collect_slk); + d = tm_elapsed_ms(&now, &last); m = tm2us(&now); @@ -208,50 +859,482 @@ sum += r; rbyte = sum & 0xff; + sum = UINT32_ROTL(sum, 7); - random_pool_append(&rbyte, sizeof rbyte, cb); + spinunlock(&collect_slk); + + random_pool_append(&rbyte, sizeof rbyte); } /** - * This routine is meant to be called periodically and generates a little + * This routine is meant to be called periodically and collects a little * bit of random information. Once in a while, when enough randomness has - * been collected, it feeds it to the random number generator. + * been collected, it feeds it to the AJE random number generator. + * + * When the collected random pool has been flushed to AJE, we invoke any user + * callback registered to be called after fresh randomness was added. * * @param buf buffer holding random data * @param len length of random data - * @param cb routine to invoke if non-NULL when randomness is fed */ void -random_pool_append(void *buf, size_t len, void (*cb)(void)) +random_pool_append(void *buf, size_t len) { g_assert(buf != NULL); g_assert(size_is_positive(len)); if (random_add_pool(buf, len)) { - if (cb != NULL) - (*cb)(); /* Let them know new randomness is available */ + /* + * The time at which the pool was flushed is in itself a random event. + * + * Calling entropy_harvest_time() will recurse back into this routine + * but the chance of us having to flush the pool again are low, unless + * much randomness was added by other threads. Therefore, we will not + * be stuck in an endless recursion. + */ + + entropy_harvest_time(); /* More randomness */ + random_added_fire(); /* Let them know new randomness is available */ + } +} + +/** + * Dispatch randomly collected bytes to all the threads using a given random + * number algorithm by sending them a TEQ message. + * + * The callback argument is generated the first time we need it, and it is + * stored in ``rbd_ptr''. Each routine will get a reference-counted structure + * and will need to call random_byte_data_free() to cleanup that structure. + * + * @param prng the random algorithm type + * @param data the random data we can give + * @param len the amount of bytes we can give + * @param rbd_ptr where the allocated callback argument is stored. + */ +static void +random_thread_dispatch(enum random_prng prng, + const void *data, size_t len, struct random_byte_data **rbd_ptr) +{ + struct random_byte_data *rbd = *rbd_ptr; + pslist_t *users = NULL, *sl; + notify_fn_t cb = NULL; + uint threads = 0, ignored = 0, *tcount = NULL, *icount = NULL; + + switch (prng) { + case RANDOM_AJE: + users = aje_users(); + cb = random_byte_aje_add; + tcount = &random_stats.aje_threads; + icount = &random_stats.aje_ignored_threads; + break; + case RANDOM_ARC4: + users = arc4_users(); + cb = random_byte_arc4_add; + tcount = &random_stats.arc4_threads; + icount = &random_stats.arc4_ignored_threads; + break; + case RANDOM_CMWC: + users = cmwc_users(); + cb = random_byte_cmwc_add; + tcount = &random_stats.cmwc_threads; + icount = &random_stats.cmwc_ignored_threads; + break; + case RANDOM_WELL: + users = well_users(); + cb = random_byte_well_add; + tcount = &random_stats.well_threads; + icount = &random_stats.well_ignored_threads; + break; + case RANDOM_PRNG_COUNT: + g_assert_not_reached(); + } + + g_assert(tcount != NULL); + g_assert(icount != NULL); + + PSLIST_FOREACH(users, sl) { + uint id = pointer_to_uint(sl->data); /* Thread ID */ + threads++; + if (teq_is_supported(id)) { + if (NULL == rbd) { + rbd = random_byte_data_alloc(data, len); + *rbd_ptr = rbd; + } + atomic_int_inc(&rbd->refcnt); + teq_post(id, cb, rbd); + } else { + ignored++; + } } + pslist_free(users); + + RANDOM_STATS_LOCK; + *tcount = threads; + *icount = ignored; + RANDOM_STATS_UNLOCK; } +static bool random_entropy_new; +static spinlock_t random_entropy_slk = SPINLOCK_INIT; + +#define RANDOM_ENTROPY_LOCK spinlock(&random_entropy_slk) +#define RANDOM_ENTROPY_UNLOCK spinunlock(&random_entropy_slk) + /** - * Add new randomness to the random number generator. + * Propagate entropy periodically to random number generators. + */ +static bool +random_entropy(void *unused) +{ + static enum random_prng prngs = + /* Priority to ARC4, then AJE -- see detailed comment below */ + { + RANDOM_ARC4, RANDOM_ARC4, RANDOM_ARC4, RANDOM_ARC4, RANDOM_ARC4, + RANDOM_ARC4, RANDOM_ARC4, RANDOM_ARC4, RANDOM_ARC4, RANDOM_ARC4, + RANDOM_ARC4, RANDOM_ARC4, RANDOM_ARC4, RANDOM_ARC4, RANDOM_ARC4, + RANDOM_ARC4, RANDOM_ARC4, RANDOM_ARC4, RANDOM_ARC4, RANDOM_ARC4, + RANDOM_AJE, RANDOM_AJE, RANDOM_AJE, RANDOM_AJE, RANDOM_AJE, + RANDOM_AJE, RANDOM_AJE, RANDOM_AJE, RANDOM_AJE, RANDOM_AJE, + RANDOM_CMWC, + RANDOM_WELL + }; + bool has_new; + struct random_byte_data *rbd = NULL; + uint8 entropy256; + size_t i; + + (void) unused; + RANDOM_STATS_INC(random_entropy); + + /* + * This routine is regularily scheduled. In case there is no other source + * of entropy in the process, collect one random byte into the pool, + * which eventually will get full, flushed, and will allow us to proceed + * further and dispatch our collected randomness. + */ + + random_collect(); + + RANDOM_ENTROPY_LOCK; + + has_new = random_entropy_new; + random_entropy_new = FALSE; + + RANDOM_ENTROPY_UNLOCK; + + if (!has_new) + return TRUE; + + RANDOM_STATS_INC(random_entropy_distribution); + +#define ELEN (sizeof entropy) + + /* + * Extract random bytes from the global AJE context. + */ + + aje_random_bytes(entropy, ELEN); + + /* + * Now feed the random entropy to one randomly selected generator. + * + * The items in the prngs array are not uniformly distributed: we give + * a higher chance to ARC4 because there are immediate effects on the + * output. Then to AJE because this spreads randomness in the AJE pools + * and safeguards the long-term unpredictability of AJE outputs. + * + * Both WELL and CMWC contexts are less likely to be given new randomness + * because they are not cryptographically strong algorithms and are more + * designed for the long-term statistical properties of their numbers. + * + * This preference is given by having a larger proportion of ARC4, then + * AJE, and only a marginal presence for WELL and CMWC. + */ + + i = random_value(N_ITEMS(prngs) - 1); + + switch (prngsi) { + case RANDOM_AJE: + RANDOM_STATS_INC(aje_distributed); + aje_addrandom(entropy, ELEN); + break; + case RANDOM_ARC4: + RANDOM_STATS_INC(arc4_distributed); + arc4random_addrandom(entropy, (int) ELEN); + break; + case RANDOM_CMWC: + RANDOM_STATS_INC(cmwc_distributed); + cmwc_addrandom(entropy, ELEN); + break; + case RANDOM_WELL: + RANDOM_STATS_INC(well_distributed); + well_addrandom(entropy, ELEN); + break; + case RANDOM_PRNG_COUNT: + g_assert_not_reached(); + } + + /* + * Propagate other random bytes to one randomly selected PNRG type in all + * the local thread streams, provided the targeted threads have created a + * Thread Event Queue (TEQ). + */ + + aje_random_bytes(entropy, ELEN); /* New random bytes */ + + i = random_value(N_ITEMS(prngs) - 1); + + random_thread_dispatch(prngsi, entropy, ELEN, &rbd); + + if (rbd != NULL) + random_byte_data_free(rbd); + +#undef ELEN + + return TRUE; +} + +/** + * Install the periodic entropy propagation call to random number generators. + */ +static void G_COLD +random_entropy_install(void) +{ + evq_raw_periodic_add(RANDOM_ENTROPY_PERIOD, random_entropy, NULL); +} + +/** + * Install the periodic entropy propagation, once. + */ +static void +random_entropy_install_once(void) +{ + static once_flag_t random_entropy_installed; + + once_flag_run(&random_entropy_installed, random_entropy_install); +} + +/** + * Add new randomness to the random number generators used by random_bytes() + * and random_strong_bytes(). */ void random_add(const void *data, size_t datalen) { g_assert(data != NULL); - g_assert(datalen < MAX_INT_VAL(int)); + g_assert(size_is_positive(datalen)); + + random_entropy_install_once(); + + RANDOM_STATS_INC(random_add); + RANDOM_STATS_ADD(input_random_add, datalen); + + /* + * The collected data is given to AJE (the global instance), and we then + * extract random data out of AJE to feed it to the other generators in + * the periodically scheduled random_entropy() call. + */ + + aje_addrandom(data, datalen); + + /* + * Signal to random_entropy() that we have fresh entropy to dispatch. + */ + + RANDOM_ENTROPY_LOCK; + random_entropy_new = TRUE; + RANDOM_ENTROPY_UNLOCK; +} + +/** + * Build a random floating point number between 0.0 and 1.0 (not included) + * using the supplied random number generator to supply 32-bit random values. + * + * The number is such that it has 53 random mantissa bits, so the granularity + * of the number is 1/2**53. All bits being uniformly random, the number is + * uniformly distributed within the range without bias. + * + * @param rf function generating 32-bit wide numbers + * + * @return uniformly distributed double between 0.0 and 1.0 (not included). + */ +double +random_double_generate(random_fn_t rf) +{ + union double_decomposition dc; + uint32 high, low; + int lzeroes, exponent; + + RANDOM_STATS_INC(random_double_generate); + + /* + * Floating points in IEEE754 double format have a mantissa of 52 bits, + * but there is a hidden "1" bit in the representation. + * + * To generate our random value we therefore generate 53 random bits and + * then compute the proper exponent, taking into account the hidden "1". + */ + + low = (*rf)(); /* 32 bits */ + high = random_upto(rf, (1U << 21) - 1); /* 21 bits */ + + if G_UNLIKELY(0 == high) + lzeroes = 21 + clz(low); + else + lzeroes = clz(high) - 11; + + if G_UNLIKELY(53 == lzeroes) + return 0.0; + + /* + * We have a 53-bit random number whose ``lzeroes'' leading bits are 0. + * The chosen exponent is such that the first bit will be "1", and that + * bit will not be part of the representation (it's the hidden bit). + */ + + exponent = 1022 - lzeroes; + + if G_UNLIKELY(lzeroes >= 21) { + size_t n = lzeroes - 21; + low <<= n; /* Bring first non-zero bit to the left */ + /* high was zero, move up the 21 highest bits from low */ + high = (low & ~((1U << 11) - 1)) >> 11; + low <<= 21; + } else if (lzeroes != 0) { + high <<= lzeroes; /* Bring first non-zero bit to the left */ + /* move up the ``lzeroes'' highest bits from low */ + high |= (low & ~((1U << (32 - lzeroes)) - 1)) >> (32 - lzeroes); + low <<= lzeroes; + } + + g_assert(high & (1U << 20)); /* Bit 20 is "1", will be hidden */ + + /* + * Generate the floating point value from its decomposition. + */ + + dc.d.s = 0; /* Positive number */ + dc.d.e = exponent; + dc.d.mh = (high & ((1U << 20) - 1)); /* Chops leading "1" in bit 20 */ + dc.d.ml = low; + + return dc.value; +} + +/** + * Build a random floating point number between 0.0 and 1.0 (not included). + * + * The granularity of the number is 1/2**53, about 1.1102230246251565e-16. + */ +double +random_double(void) +{ + RANDOM_STATS_INC(random_double); - arc4random_addrandom(deconstify_gpointer(data), (int) datalen); + return random_double_generate(mt_thread_rand); } /** - * Initialize random number generator. + * Initialize random number generators. */ void random_init(void) { - arc4random_stir(); + arc4random_stir_once(); + mt_init(); + random_entropy_install_once(); +} + +/** + * Generate a SHA1 digest of the current random statistics. + * + * This is meant for dynamic entropy collection. + */ +void +random_stats_digest(sha1_t *digest) +{ + RANDOM_STATS_INC(random_stats_digest); + + SHA1_COMPUTE(random_stats, digest); +} + +/** + * Dump random statistics to specified logagent. + */ +void G_COLD +random_dump_stats_log(logagent_t *la, unsigned options) +{ + struct random_stats r; + bool groupped = booleanize(options & DUMP_OPT_PRETTY); + + atomic_mb(); + r = random_stats; /* Struct copy */ + +#define DUMP(x) log_info(la, "RANDOM %s = %s", #x, \ + uint_to_string_grp(r.x, groupped)) + +#define DUMP64(x) G_STMT_START { \ + uint64 v = AU64_VALUE(&r.x); \ + log_info(la, "RANDOM %s = %s", #x, \ + uint64_to_string_grp(v, groupped)); \ +} G_STMT_END + + DUMP64(input_random_add); + DUMP64(input_random_add_pool); + DUMP64(output_random_bytes); + DUMP64(output_random_bytes_with); + DUMP64(output_random_strong_bytes); + DUMP64(output_random_key_bytes); + DUMP64(random_entropy_distribution); + DUMP64(aje_distributed); + DUMP64(aje_thread_distributed); + DUMP(aje_threads); + DUMP(aje_ignored_threads); + DUMP64(arc4_distributed); + DUMP64(arc4_thread_distributed); + DUMP(arc4_threads); + DUMP(arc4_ignored_threads); + DUMP64(cmwc_distributed); + DUMP64(cmwc_thread_distributed); + DUMP(cmwc_threads); + DUMP(cmwc_ignored_threads); + DUMP64(well_distributed); + DUMP64(well_thread_distributed); + DUMP(well_threads); + DUMP(well_ignored_threads); + DUMP64(random_cpu_noise); + DUMP64(random_collect); + DUMP64(random_entropy); + DUMP64(random_upto); + DUMP64(random_u32); + DUMP64(random_u64); + DUMP64(random_ulong); + DUMP64(random_value); + DUMP64(random_ulong_value); + DUMP64(random64_upto); + DUMP64(random64_value); + DUMP64(random_bytes); + DUMP64(random_bytes_with); + DUMP64(random_strong_bytes); + DUMP64(random_key_bytes); + DUMP64(random_double); + DUMP64(random_double_generate); + DUMP64(random_add); + DUMP64(random_add_pool); + DUMP64(random_added_fire); + DUMP64(random_stats_digest); + +#undef DUMP64 +} + +/** + * Dump random statistics to stderr. + */ +void G_COLD +random_dump_stats(void) +{ + s_info("RANDOM running statistics:"); + random_dump_stats_log(log_agent_stderr_get(), 0); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/random.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/random.h
Changed
@@ -41,13 +41,42 @@ */ void random_init(void); -guint32 random_value(guint32 max) WARN_UNUSED_RESULT; -guint32 random_u32(void) WARN_UNUSED_RESULT; +uint32 random_value(uint32 max) WARN_UNUSED_RESULT; +uint64 random64_value(uint64 max) WARN_UNUSED_RESULT; +ulong random_ulong_value(ulong max) WARN_UNUSED_RESULT; +uint32 random_u32(void) WARN_UNUSED_RESULT; +uint64 random_u64(void) WARN_UNUSED_RESULT; +ulong random_ulong(void) WARN_UNUSED_RESULT; void random_bytes(void *dst, size_t size); -guint32 random_cpu_noise(void); -void random_collect(void (*cb)(void)); -void random_pool_append(void *buf, size_t len, void (*cb)(void)); +void random_strong_bytes(void *dst, size_t size); +void random_key_bytes(void *dst, size_t size); +void random_bytes_with(random_fn_t rf, void *dst, size_t size); +uint32 random_cpu_noise(void); +void random_collect(void); +void random_pool_append(void *buf, size_t len); void random_add(const void *data, size_t datalen); +double random_double_generate(random_fn_t rf) WARN_UNUSED_RESULT; +double random_double(void) WARN_UNUSED_RESULT; +uint32 random_upto(random_fn_t rf, uint32 max) WARN_UNUSED_RESULT; +uint64 random64_upto(random64_fn_t rf, uint64 max) WARN_UNUSED_RESULT; + +uint32 random_strong(void); /* Exported for tests, mostly */ + +/* + * Notification of new randomness addtion. + */ + +typedef void (*random_added_listener_t)(void); + +void random_added_listener_add(random_added_listener_t l); +void random_added_listener_remove(random_added_listener_t l); + +struct logagent; +struct sha1; + +void random_dump_stats(void); +void random_dump_stats_log(struct logagent *la, unsigned options); +void random_stats_digest(struct sha1 *digest); #endif /* _random_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/rbtree.c
Added
@@ -0,0 +1,1001 @@ +/* + * Copyright (c) 2012-2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Red-Black Tree container. + * + * A red-black tree is a particular implementation of a sorted set which + * uses O(n) memory and O(log n) for insertion, lookups and removals. + * + * Contrary to a sorted array which has O(n) complexity for insertions and + * removals and only O(log n) for lookups, the red-black tree offers the + * same complexity for insertions and removals, at the price of more space + * used than with a sorted array. + * + * Each red-black tree object can be made thread-safe, optionally, so that + * concurrent access to it be possible. + * + * @author Raphael Manfredi + * @date 2012-2013 + */ + +#include "common.h" + +#include "rbtree.h" +#include "erbtree.h" +#include "mutex.h" +#include "unsigned.h" +#include "walloc.h" + +#include "override.h" /* Must be the last header included */ + +enum rbtree_magic { RBTREE_MAGIC = 0x4eb7308c }; + +/** + * A red-black tree descritor. + */ +struct rbtree { + enum rbtree_magic magic; /* Magic number */ + size_t refcnt; /* Iterator reference count */ + size_t stamp; /* Modification stamp */ + cmp_fn_t cmp; /* Item comparison routine */ + mutex_t *lock; /* Optional thread-safe lock */ + union { + /* + * Structural equivalence guarantees that we can access the "tree" + * part of the "etree" variable by using u.tree. We actually store + * an extended tree here in this union. + * + * This representation avoids breaking strict-aliasing rules which + * would occur if we were to cast a pointer to the "etree" field in + * the structure directly into an erbtree_t *. + */ + erbtree_t tree; /* The normal part of a tree, for reading */ + erbtree_ext_t etree; /* The (extended) tree, actual data stored */ + } u; +}; + +static inline void +rbtree_check(const struct rbtree * const rbt) +{ + g_assert(rbt != NULL); + g_assert(RBTREE_MAGIC == rbt->magic); +} + +/* + * A node in our red-black tree. + */ +struct rbdata { + rbnode_t node; /* Embedded tree structure */ + void *data; /* Data held */ +}; + +enum rbtree_iter_magic { RBTREE_ITER_MAGIC = 0x2be28d13 }; + +/** + * A red-black tree iterator. + */ +struct rbtree_iter { + enum rbtree_iter_magic magic; + const rbtree_t *tree; + struct rbdata *item; /* Current item being iterated over */ + rbnode_t *next; /* Next node to return */ + size_t stamp; /* Modification stamp (at iteration start) */ + size_t visited; /* Amount of visited nodes (for assertions) */ + size_t removed; /* Amount of removed nodes during traversal */ +}; + +static inline void +rbtree_iter_check(const struct rbtree_iter * const ri) +{ + g_assert(ri != NULL); + g_assert(RBTREE_ITER_MAGIC == ri->magic); + rbtree_check(ri->tree); +} + +#define ERBTREE(x) (&(x)->u.tree) + +/* + * Thread-safe synchronization support. + */ + +#define rbtree_synchronize(t) G_STMT_START { \ + if G_UNLIKELY((t)->lock != NULL) \ + mutex_lock((t)->lock); \ +} G_STMT_END + +#define rbtree_unsynchronize(t) G_STMT_START { \ + if G_UNLIKELY((t)->lock != NULL) \ + mutex_unlock((t)->lock); \ +} G_STMT_END + +#define rbtree_return(t, v) G_STMT_START { \ + if G_UNLIKELY((t)->lock != NULL) \ + mutex_unlock((t)->lock); \ + return v; \ +} G_STMT_END + +#define rbtree_return_void(t) G_STMT_START { \ + if G_UNLIKELY((t)->lock != NULL) \ + mutex_unlock((t)->lock); \ + return; \ +} G_STMT_END + +#define assert_rbtree_locked(t) G_STMT_START { \ + if G_UNLIKELY((t)->lock != NULL) \ + assert_mutex_is_owned((t)->lock); \ +} G_STMT_END + +/** + * Internal data comparison routine trampoline. + */ +static int +rbtree_cmp(const void *a, const void *b, void *data) +{ + rbtree_t *tree = data; + const struct rbdata *da = a, *db = b; + + rbtree_check(tree); + + return (*tree->cmp)(da->data, db->data); +} + +/** + * Creates a new red-black tree. + * + * @param cmp the item comparison routine + * + * @return a new red-back tree container. + */ +rbtree_t * +rbtree_create(cmp_fn_t cmp) +{ + rbtree_t *rbt; + + WALLOC0(rbt); + rbt->magic = RBTREE_MAGIC; + rbt->cmp = cmp; + erbtree_init_data(&rbt->u.etree, rbtree_cmp, rbt, + offsetof(struct rbdata, node)); + + return rbt; +} + +/** + * Mark red-black tree as thread-safe. + */ +void +rbtree_thread_safe(rbtree_t *rbt) +{ + rbtree_check(rbt); + g_assert(NULL == rbt->lock); + + WALLOC0(rbt->lock); + mutex_init(rbt->lock); +} + +/** + * Lock the red-black tree to allow a sequence of operations to be atomically + * conducted. + * + * It is possible to lock the tree several times as long as each locking + * is paired with a corresponding unlocking in the execution flow. + * + * The treee must have been marked thread-safe already. + */ +void +rbtree_lock(rbtree_t *rbt) +{ + rbtree_check(rbt); + g_assert_log(rbt->lock != NULL, + "%s(): red-black tree %p not marked thread-safe", G_STRFUNC, rbt); + + mutex_lock(rbt->lock); +} + +/* + * Release lock on red-black tree. + * + * The tree must have been marked thread-safe already and locked by the + * calling thread. + */ +void +rbtree_unlock(rbtree_t *rbt) +{ + rbtree_check(rbt); + g_assert_log(rbt->lock != NULL, + "%s(): red-black tree %p not marked thread-safe", G_STRFUNC, rbt); + + mutex_unlock(rbt->lock); +} + +/** + * @return amount of items held in tree. + */ +size_t +rbtree_count(const rbtree_t *rbt) +{ + size_t count; + + rbtree_check(rbt); + + rbtree_synchronize(rbt); + count = erbtree_count(ERBTREE(rbt)); + rbtree_return(rbt, count); +} + +/** + * Check whether tree contains the specified key. + * + * @param rbt the red-black tree + * @param key the item key to look up + * + * @return whether key exists in the tree. + */ +bool +rbtree_contains(const rbtree_t *rbt, const void *key) +{ + struct rbdata item; + bool contains; + + rbtree_check(rbt); + g_assert(key != NULL); + + rbtree_synchronize(rbt); + + item.data = deconstify_pointer(key); + contains = erbtree_contains(ERBTREE(rbt), &item); + + rbtree_return(rbt, contains); +} + +/** + * Lookup key in the tree. + * + * The item returned is the data stored in the tree, which contains a + * key that is identical to the supplied lookup key. This means the + * returned value cannot be NULL if the key is present. + * + * @param rbt the red-black tree + * @param key the item key to look up + * + * @return the data associated with the key (with key embedded in data), + * or NULL if the key is not present. + */ +void * +rbtree_lookup(const rbtree_t *rbt, const void *key) +{ + struct rbdata *rd; + struct rbdata item; + void *data; + + rbtree_check(rbt); + g_assert(key != NULL); + + rbtree_synchronize(rbt); + + item.data = deconstify_pointer(key); + rd = erbtree_lookup(ERBTREE(rbt), &item); + data = NULL == rd ? NULL : rd->data; + + rbtree_return(rbt, data); +} + +/** + * Extended lookup in the tree to fetch value and the node cursor. + * + * The node cursor can then be used to efficiently traverse the tree. + * + * @param rbt the red-black tree + * @param key the item key to look up + * @param node where the node cursor is written + * + * @return the data associated with the key, or NULL if the key is not present. + * When the key is found, `node' is updated to the internal cursor in the + * tree. Its lifespan is that of the tree or of the item (if removed). + */ +void * +rbtree_lookup_node(const rbtree_t *rbt, const void *key, rbnode_t **node) +{ + struct rbdata *rd; + struct rbdata item; + void *data; + + rbtree_check(rbt); + g_assert(key != NULL); + + rbtree_synchronize(rbt); + + item.data = deconstify_pointer(key); + rd = erbtree_lookup(ERBTREE(rbt), &item); + + if (NULL == rd) + rbtree_return(rbt, NULL); + + if (node != NULL) + *node = &rd->node; + + data = rd->data; + rbtree_return(rbt, data); +} + +/** + * Attempt to insert new item in tree. + * + * @param rbt the red-black tree + * @param item the item to insert + * + * @return TRUE if insertion was successful, FALSE if an item with the + * same key already exists. + */ +bool +rbtree_insert_try(rbtree_t *rbt, const void *item) +{ + struct rbdata *rd; + + rbtree_check(rbt); + g_assert(item != NULL); + + WALLOC0(rd); + rd->data = deconstify_pointer(item); + + rbtree_synchronize(rbt); + + if (NULL == erbtree_insert(ERBTREE(rbt), &rd->node)) { + rbt->stamp++; + rbtree_return(rbt, TRUE); + } + + rbtree_unsynchronize(rbt); + + WFREE(rd); + return FALSE; +} + +/** + * Insert new item in tree. + * + * An item with the same key must not already exist in the tree. If it + * could be existing, either perform a rbtree_contains() check first, + * or use rbtree_insert_try(). + * + * @param rbt the red-black tree + * @param item the item to insert + */ +void +rbtree_insert(rbtree_t *rbt, const void *item) +{ + struct rbdata *rd; + + rbtree_check(rbt); + g_assert(item != NULL); + + WALLOC0(rd); + rd->data = deconstify_pointer(item); + + rbtree_synchronize(rbt); + + if (NULL == erbtree_insert(ERBTREE(rbt), &rd->node)) { + rbt->stamp++; + rbtree_return_void(rbt); + } + + rbtree_unsynchronize(rbt); + + g_error("%s(): duplicate key already exists", G_STRFUNC); +} + +/** + * Replace item in the tree if it exists, otherwise insert. + * + * @param rbt the red-black tree + * @param item the item to insert + * @param old_item where the old item is written back, if not NULL + * + * @return TRUE if we replaced an existing item (with old_item set), FALSE + * if we only inserted. + */ +bool +rbtree_replace(rbtree_t *rbt, const void *item, void **old_item) +{ + struct rbdata *rd, *old; + + rbtree_check(rbt); + g_assert(item != NULL); + + WALLOC0(rd); + rd->data = deconstify_pointer(item); + + rbtree_synchronize(rbt); + + old = erbtree_lookup(ERBTREE(rbt), rd); + + if (NULL == old) { + void *ok = erbtree_insert(ERBTREE(rbt), &rd->node); + g_assert(NULL == ok); + rbt->stamp++; + rbtree_return(rbt, FALSE); /* Not a replacement */ + } + + /* + * A replacement does not change the tree, so do not update the stamp. + */ + + erbtree_replace(ERBTREE(rbt), &old->node, &rd->node); + + if (old_item != NULL) + *old_item = old->data; + + rbtree_unsynchronize(rbt); + WFREE(old); + + return TRUE; /* Replaced item */ +} + +/** + * Remove key from the tree. + * + * @param rbt the red-black tree + * @param item the item to insert + * @param old_item where the old item is written back, if not NULL + * + * @return TRUE if key was found and item removed, with old_item set, FALSE + * if the key was not present. + */ +bool +rbtree_remove(rbtree_t *rbt, const void *key, void **old_item) +{ + struct rbdata *rd; + struct rbdata item; + + rbtree_check(rbt); + g_assert(key != NULL); + + rbtree_synchronize(rbt); + + item.data = deconstify_pointer(key); + rd = erbtree_lookup(ERBTREE(rbt), &item); + + if (NULL == rd) + rbtree_return(rbt, FALSE); + + erbtree_remove(ERBTREE(rbt), &rd->node); + rbt->stamp++; + + if (old_item != NULL) + *old_item = rd->data; + + rbtree_unsynchronize(rbt); + WFREE(rd); + + return TRUE; +} + +/** + * Fetch next item in the tree. + * + * This is OK for infrequent traversals. Otherwise, better fetch a cursor + * via rbtree_lookup_node() and traverse with rbtree_next_node(). + * + * @param rbt the red-black tree + * @param key the item in the tree where we start + * + * @return NULL if there is no successor, the next item otherwise. + */ +void * +rbtree_next(const rbtree_t *rbt, const void *key) +{ + struct rbdata *rd; + struct rbdata item; + rbnode_t *rn; + void *data; + + rbtree_check(rbt); + g_assert(key != NULL); + + rbtree_synchronize(rbt); + + item.data = deconstify_pointer(key); + rd = erbtree_lookup(ERBTREE(rbt), &item); + + if G_UNLIKELY(NULL == rd) + rbtree_return(rbt, NULL); + + rn = erbtree_next(&rd->node); + if (NULL == rn) + rbtree_return(rbt, NULL); + + rd = erbtree_data(ERBTREE(rbt), rn); + data = rd->data; + + rbtree_return(rbt, data); +} + +/** + * Fetch item in the tree following supplied node. + * + * @param rbt the red-black tree + * @param key the node key to look up + * + * @return NULL if there is no successor, the next item otherwise. + * The key parameter is updated with the node of the following item. + */ +void * +rbtree_next_node(const rbtree_t *rbt, rbnode_t **key) +{ + struct rbdata *rd; + rbnode_t *rn; + void *data; + + rbtree_check(rbt); + g_assert(key != NULL); + + rbtree_synchronize(rbt); + + rn = erbtree_next(*key); + if (NULL == rn) + rbtree_return(rbt, NULL); + + rd = erbtree_data(ERBTREE(rbt), rn); + *key = rn; + data = rd->data; + + rbtree_return(rbt, data); +} + +/** + * Fetch previous item in the tree. + * + * This is OK for infrequent traversals. Otherwise, better fetch a cursor + * via rbtree_lookup_node() and traverse with rbtree_prev_node(). + * + * @param rbt the red-black tree + * @param key the item in the tree where we start + * + * @return NULL if there is no predecessor, the previous item otherwise. + */ +void * +rbtree_prev(const rbtree_t *rbt, const void *key) +{ + struct rbdata *rd; + struct rbdata item; + rbnode_t *rn; + void *data; + + rbtree_check(rbt); + g_assert(key != NULL); + + rbtree_synchronize(rbt); + + item.data = deconstify_pointer(key); + rd = erbtree_lookup(ERBTREE(rbt), &item); + + if G_UNLIKELY(NULL == rd) + rbtree_return(rbt, NULL); + + rn = erbtree_prev(&rd->node); + if (NULL == rn) + rbtree_return(rbt, NULL); + + rd = erbtree_data(ERBTREE(rbt), rn); + data = rd->data; + + rbtree_return(rbt, data); +} + +/** + * Fetch item in the tree preceding supplied node. + * + * @param rbt the red-black tree + * @param key the node key to look up + * + * @return NULL if there is no predecessor, the previous item otherwise. + * The key parameter is updated with the node of the preceding item. + */ +void * +rbtree_prev_node(const rbtree_t *rbt, rbnode_t **key) +{ + struct rbdata *rd; + rbnode_t *rn; + void *data; + + rbtree_check(rbt); + g_assert(key != NULL); + + rbtree_synchronize(rbt); + + rn = erbtree_prev(*key); + if (NULL == rn) + rbtree_return(rbt, NULL); + + rd = erbtree_data(ERBTREE(rbt), rn); + *key = rn; + data = rd->data; + + rbtree_return(rbt, data); +} + +struct rbtree_foreach_ctx { + data_fn_t cb; + void *data; +}; + +/** + * Traversal trampoline. + */ +static void +rbtree_foreach_trampoline(void *item, void *data) +{ + struct rbdata *rd = item; + struct rbtree_foreach_ctx *ctx = data; + + (*ctx->cb)(rd->data, ctx->data); +} + +/** + * Traverse all the items in the tree, invoking the callback on each item. + */ +void +rbtree_foreach(rbtree_t *rbt, data_fn_t cb, void *data) +{ + struct rbtree_foreach_ctx ctx; + + rbtree_check(rbt); + + ctx.cb = cb; + ctx.data = data; + + rbtree_synchronize(rbt); + erbtree_foreach(ERBTREE(rbt), rbtree_foreach_trampoline, &ctx); + rbtree_unsynchronize(rbt); +} + +struct rbtree_foreach_remove_ctx { + rbtree_t *rbt; + data_rm_fn_t cbr; + void *data; +}; + +/** + * Traversal with possible removal trampoline. + */ +static bool +rbtree_foreach_rm_trampoline(void *item, void *data) +{ + struct rbdata *rd = item; + struct rbtree_foreach_remove_ctx *ctx = data; + + if ((*ctx->cbr)(rd->data, ctx->data)) { + WFREE(rd); + ctx->rbt->stamp++; + return TRUE; + } + + return FALSE; +} + +/** + * Traverse all the items in the tree, invoking the callback on each item + * and removing items for which the callback returns TRUE. + * + * @return the amount of removed items. + */ +size_t +rbtree_foreach_remove(rbtree_t *rbt, data_rm_fn_t cbr, void *data) +{ + struct rbtree_foreach_remove_ctx ctx; + size_t removed; + + rbtree_check(rbt); + g_assert(0 == rbt->refcnt); /* No iteration pending */ + + ctx.cbr = cbr; + ctx.data = data; + ctx.rbt = rbt; + + rbtree_synchronize(rbt); + + removed = erbtree_foreach_remove(ERBTREE(rbt), + rbtree_foreach_rm_trampoline, &ctx); + + rbtree_return(rbt, removed); +} + +static void +rbtree_free_node(void *data) +{ + struct rbdata *rd = data; + + WFREE(rd); +} + +/** + * Clear the tree, discarding all its items without freeing them. + * + * @attention + * Use rbtree_discard() to clear the tree and free the items. + */ +void +rbtree_clear(rbtree_t *rbt) +{ + rbtree_check(rbt); + + /* + * We don't free the items but we have to free the nodes. + */ + + rbtree_synchronize(rbt); + + erbtree_discard(ERBTREE(rbt), rbtree_free_node); + rbt->stamp++; + + rbtree_unsynchronize(rbt); +} + +/** + * Destroy the tree, nullifying its pointer. + * + * @attention + * Note that this does not free up the items still held in the tree. + * Use rbtree_discard() first if there are remaining items. + */ +void +rbtree_free_null(rbtree_t **tree_ptr) +{ + rbtree_t *rbt = *tree_ptr; + + if (rbt != NULL) { + rbtree_check(rbt); + g_assert(0 == rbt->refcnt); /* No iteration pending */ + + rbtree_synchronize(rbt); + + rbtree_clear(rbt); + + if (rbt->lock != NULL) { + mutex_destroy(rbt->lock); + WFREE(rbt->lock); + } + + rbt->magic = 0; + WFREE(rbt); + *tree_ptr = NULL; + } +} + +struct rbtree_discard_ctx { + free_fn_t fcb; +}; + +static void +rbtree_discard_trampoline(void *p, void *data) +{ + struct rbdata *rd = p; + struct rbtree_discard_ctx *ctx = data; + + (*ctx->fcb)(rd->data); + WFREE(rd); +} + +/** + * Discard all the items in the tree, freeing them using the supplied routine. + * + * @attention + * The tree descriptor is not freed. Use rbtree_free_null() afterwards if + * it needs to be reclaimed as well. + */ +void +rbtree_discard(rbtree_t *rbt, free_fn_t fcb) +{ + struct rbtree_discard_ctx ctx; + rbtree_check(rbt); + + ctx.fcb = fcb; + + rbtree_synchronize(rbt); + + erbtree_discard_with_data(ERBTREE(rbt), rbtree_discard_trampoline, &ctx); + rbt->stamp++; + + rbtree_unsynchronize(rbt); +} + +struct rbtree_discard_data_ctx { + free_data_fn_t fcb; + void *data; +}; + +static void +rbtree_discard_data_trampoline(void *p, void *data) +{ + struct rbdata *rd = p; + struct rbtree_discard_data_ctx *ctx = data; + + (*ctx->fcb)(rd->data, ctx->data); + WFREE(rd); +} + +/** + * Discard all the items in the tree, freeing them using the supplied routine + * which takes an additional argument. + * + * @attention + * The tree descriptor is not freed. Use rbtree_free_null() afterwards if + * it needs to be reclaimed as well. + */ +void +rbtree_discard_with_data(rbtree_t *rbt, free_data_fn_t fcb, void *data) +{ + struct rbtree_discard_data_ctx ctx; + + rbtree_check(rbt); + + ctx.fcb = fcb; + ctx.data = data; + + rbtree_synchronize(rbt); + + erbtree_discard_with_data(ERBTREE(rbt), + rbtree_discard_data_trampoline, &ctx); + + rbt->stamp++; + + rbtree_unsynchronize(rbt); +} + +/** + * Create a new red-black tree iterator. + */ +rbtree_iter_t * +rbtree_iter_new(const rbtree_t *rbt) +{ + rbtree_iter_t *ri; + rbtree_t *wrbt = deconstify_pointer(rbt); + + rbtree_check(rbt); + + WALLOC0(ri); + ri->magic = RBTREE_ITER_MAGIC; + ri->tree = rbt; + + rbtree_synchronize(wrbt); + + ri->next = erbtree_first(ERBTREE(rbt)); + ri->stamp = rbt->stamp; + wrbt->refcnt++; /* Internal state, OK to change */ + + rbtree_unsynchronize(wrbt); + + return ri; +} + +/** + * Release iterator and nullify its pointer. + */ +void +rbtree_iter_release(rbtree_iter_t **iter_ptr) +{ + rbtree_iter_t *ri = *iter_ptr; + + if (ri != NULL) { + rbtree_t *rbt; + + rbtree_iter_check(ri); + + rbt = deconstify_pointer(ri->tree); + g_assert(size_is_positive(rbt->refcnt)); + + rbtree_synchronize(rbt); + rbt->refcnt--; + rbtree_unsynchronize(rbt); + + ri->magic = 0; + WFREE(ri); + *iter_ptr = NULL; + } +} + +/** + * Fetch next entry from iterator. + * + * @param ri the red-black tree iterator + * @param keyptr where the next key is returned + * + * @return TRUE if a new entry exists, FALSE if traversal is completed. + */ +bool +rbtree_iter_next(rbtree_iter_t *ri, const void **keyptr) +{ + rbtree_t *rbt; + + rbtree_iter_check(ri); + g_assert(keyptr != NULL); + + rbt = deconstify_pointer(ri->tree); + rbtree_synchronize(rbt); + + g_assert(ri->stamp == ri->tree->stamp); /* No modification done */ + + /* + * If traversal is completed, return FALSE. + */ + + if (NULL == ri->next) { + g_soft_assert_log(rbtree_count(ri->tree) + ri->removed == ri->visited, + "%s(): count=%zu, visited=%zu (removed=%zu)", + G_STRFUNC, rbtree_count(ri->tree), ri->visited, ri->removed); + rbtree_return(rbt, FALSE); + } + + ri->item = erbtree_data(ERBTREE(ri->tree), ri->next); + ri->next = erbtree_next(ri->next); + ri->visited++; + *keyptr = ri->item->data; + + rbtree_return(rbt, TRUE); +} + +/** + * Remove current item being iterated over. + * + * @return pointer to key removed, NULL if there is no item to remove. + */ +void * +rbtree_iter_remove(rbtree_iter_t *ri) +{ + rbtree_t *rbt; + void *key; + + rbtree_iter_check(ri); + + rbt = deconstify_pointer(ri->tree); + rbtree_synchronize(rbt); + + g_assert(ri->stamp == ri->tree->stamp); /* No modification done */ + + /* + * The current item being iterated over is cleared once we have removed it. + */ + + if (NULL == ri->item) + rbtree_return(rbt, NULL); + + /* + * We do not update the tree stamp here because this deletion is authorized + * during the tree traversal: it will not perturb the iteration order and + * we already pre-fetched the next item. + */ + + key = ri->item->data; + erbtree_remove(deconstify_pointer(ERBTREE(ri->tree)), &ri->item->node); + + WFREE_TYPE_NULL(ri->item); + ri->removed++; + + rbtree_return(rbt, key); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/rbtree.h
Added
@@ -0,0 +1,80 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Red-Black Tree, container of arbitrary sortable data items. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _rbtree_h_ +#define _rbtree_h_ + +#include "erbtree.h" /* For rbnode_t */ + +struct rbtree; +typedef struct rbtree rbtree_t; + +struct rbtree_iter; +typedef struct rbtree_iter rbtree_iter_t; + +/** + * Public interface. + */ + +rbtree_t *rbtree_create(cmp_fn_t cmp); +void rbtree_thread_safe(rbtree_t *rbt); +void rbtree_lock(rbtree_t *rbt); +void rbtree_unlock(rbtree_t *rbt); +size_t rbtree_count(const rbtree_t *tree); +bool rbtree_contains(const rbtree_t *tree, const void *key); +void *rbtree_lookup(const rbtree_t *tree, const void *key); +bool rbtree_insert_try(rbtree_t *tree, const void *item); +void rbtree_insert(rbtree_t *tree, const void *item); +bool rbtree_replace(rbtree_t *tree, const void *item, void **old_item); +bool rbtree_remove(rbtree_t *tree, const void *key, void **old_item); +void *rbtree_next(const rbtree_t *rbt, const void *key); +void *rbtree_prev(const rbtree_t *rbt, const void *key); +void rbtree_foreach(rbtree_t *tree, data_fn_t cb, void *data); +size_t rbtree_foreach_remove(rbtree_t *tree, data_rm_fn_t cbr, void *data); +void rbtree_clear(rbtree_t *tree); +void rbtree_free_null(rbtree_t **tree_ptr); +void rbtree_discard(rbtree_t *tree, free_fn_t fcb); +void rbtree_discard_with_data(rbtree_t *tree, free_data_fn_t fcb, void *data); + +void *rbtree_lookup_node(const rbtree_t *rbt, const void *key, rbnode_t **node); +void *rbtree_next_node(const rbtree_t *rbt, rbnode_t **key); +void *rbtree_prev_node(const rbtree_t *rbt, rbnode_t **key); + +rbtree_iter_t *rbtree_iter_new(const rbtree_t *tree); +bool rbtree_iter_next(rbtree_iter_t *iter, const void **keyptr); +void *rbtree_iter_remove(rbtree_iter_t *iter); +void rbtree_iter_release(rbtree_iter_t **iter_ptr); + +#endif /* _erbtree_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/regex.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/regex.c
Changed
@@ -63,28 +63,25 @@ #define _GNU_SOURCE -/* We used to test for `BSTRING' here, but only GCC and Emacs define - `BSTRING', as far as I know, and neither of them use this code. */ -#ifdef I_STRING -#include <string.h> +#ifdef MINGW32 +void bzero(void *s, size_t n); /* Avoid compilation warning */ +#endif + #ifndef HAS_BCMP #ifndef bcmp -#define bcmp(s1, s2, n) memcmp ((s1), (s2), (n)) +#define bcmp(s1, s2, n) memcmp((s1), (s2), (n)) #endif #endif /* HAS_BCMP */ #ifndef HAS_BCOPY #ifndef bcopy -#define bcopy(s, d, n) memcpy ((d), (s), (n)) +#define bcopy(s, d, n) memcpy((d), (s), (n)) #endif #endif /* HAS_BCOPY */ #ifndef HAS_BZERO #ifndef bzero -#define bzero(s, n) memset ((s), 0, (n)) +#define bzero(s, n) memset((s), 0, (n)) #endif #endif /* HAS_BZERO */ -#else -#include <strings.h> -#endif #include "regex.h" #include "override.h" /* Must be last file included */ @@ -93,7 +90,7 @@ /* This must be nonzero for the wordchar and notwordchar pattern commands in re_match_2. */ -#ifndef Sword +#ifndef Sword #define Sword 1 #endif @@ -182,8 +179,8 @@ use `alloca' instead of `malloc'. This is because using malloc in re_search* or re_match* could cause memory leaks when C-g is used in Emacs; also, malloc is slower and causes storage fragmentation. On - the other hand, malloc is more portable, and easier to debug. - + the other hand, malloc is more portable, and easier to debug. + Because we sometimes use alloca, some routines have to be macros, not functions -- `alloca'-allocated space disappears at the end of the function it is called in. */ @@ -208,7 +205,7 @@ #ifndef _AIX /* Already did AIX, up at the top. */ char *alloca (); #endif /* not _AIX */ -#endif /* not I_ALLOCA */ +#endif /* not I_ALLOCA */ #endif /* not __GNUC__ */ #endif /* not alloca */ @@ -313,9 +310,9 @@ /* Analogously, for end of buffer/string. */ endbuf, - + /* Followed by two byte relative address to which to jump. */ - jump, + jump, /* Same as jump, but marks the end of an alternative. */ jump_past_alt, @@ -323,11 +320,11 @@ /* Followed by two-byte relative address of place to resume at in case of failure. */ on_failure_jump, - + /* Like on_failure_jump, but pushes a placeholder instead of the current string position when executed. */ on_failure_keep_string_jump, - + /* Throw away latest failure point and then jump to following two-byte relative address. */ pop_failure_jump, @@ -410,7 +407,7 @@ int *dest; unsigned char *source; { - int temp = SIGN_EXTEND_CHAR (*(source + 1)); + int temp = SIGN_EXTEND_CHAR (*(source + 1)); *dest = *source & 0377; *dest += temp << 8; } @@ -436,7 +433,7 @@ extract_number_and_incr (destination, source) int *destination; unsigned char **source; -{ +{ extract_number (destination, *source); *source += 2; } @@ -484,8 +481,8 @@ char *fastmap; { unsigned was_a_range = 0; - unsigned i = 0; - + unsigned i = 0; + while (i < (1 << BYTEWIDTH)) { if (fastmapi++) @@ -504,7 +501,7 @@ } } } - putchar ('\n'); + putchar ('\n'); } @@ -525,7 +522,7 @@ printf ("(null)\n"); return; } - + /* Loop over pattern commands. */ while (p < pend) { @@ -571,14 +568,14 @@ printf ("/charset%s", (re_opcode_t) *(p - 1) == charset_not ? "_not" : ""); - + assert (p + *p < pend); for (c = 0; c < *p; c++) { unsigned bit; unsigned char map_byte = p1 + c; - + putchar ('/'); for (bit = 0; bit < BYTEWIDTH; bit++) @@ -615,7 +612,7 @@ case push_dummy_failure: printf ("/push_dummy_failure"); break; - + case maybe_pop_jump: extract_number_and_incr (&mcnt, &p); printf ("/maybe_pop_jump/0/%d", mcnt); @@ -624,36 +621,36 @@ case pop_failure_jump: extract_number_and_incr (&mcnt, &p); printf ("/pop_failure_jump/0/%d", mcnt); - break; - + break; + case jump_past_alt: extract_number_and_incr (&mcnt, &p); printf ("/jump_past_alt/0/%d", mcnt); - break; - + break; + case jump: extract_number_and_incr (&mcnt, &p); printf ("/jump/0/%d", mcnt); break; - case succeed_n: + case succeed_n: extract_number_and_incr (&mcnt, &p); extract_number_and_incr (&mcnt2, &p); printf ("/succeed_n/0/%d/0/%d", mcnt, mcnt2); break; - - case jump_n: + + case jump_n: extract_number_and_incr (&mcnt, &p); extract_number_and_incr (&mcnt2, &p); printf ("/jump_n/0/%d/0/%d", mcnt, mcnt2); break; - - case set_number_at: + + case set_number_at: extract_number_and_incr (&mcnt, &p); extract_number_and_incr (&mcnt2, &p); printf ("/set_number_at/0/%d/0/%d", mcnt, mcnt2); break; - + case wordbound: printf ("/wordbound"); break; @@ -665,14 +662,14 @@ case wordbeg: printf ("/wordbeg"); break; - + case wordend: printf ("/wordend"); - + case wordchar: printf ("/wordchar"); break; - + case notwordchar: printf ("/notwordchar"); break; @@ -729,7 +726,7 @@ int size2; { unsigned this_char; - + if (where == NULL) printf ("(null)"); else @@ -739,7 +736,7 @@ for (this_char = where - string1; this_char < size1; this_char++) printchar (string1this_char); - where = string2; + where = string2; } for (this_char = where - string2; this_char < size2; this_char++) @@ -780,7 +777,7 @@ reg_syntax_t syntax; { reg_syntax_t ret = re_syntax_options; - + re_syntax_options = syntax; return ret; } @@ -816,7 +813,7 @@ static boolean group_in_compile_stack (); static reg_errcode_t compile_range (); -/* Fetch the next character in the uncompiled pattern---translating it +/* Fetch the next character in the uncompiled pattern---translating it if necessary. Also cast from a signed character in the constant string passed to us by the user to an unsigned char that we can use as an array index (in, e.g., `translate'). */ @@ -956,7 +953,7 @@ pattern_offset_t begalt_offset; pattern_offset_t fixup_alt_jump; pattern_offset_t inner_group_offset; - pattern_offset_t laststart_offset; + pattern_offset_t laststart_offset; regnum_t regnum; } compile_stack_elt_t; @@ -999,7 +996,7 @@ PATFETCH (c); \ } \ } \ - } + } #define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */ @@ -1025,7 +1022,7 @@ `fastmap_accurate' is zero; `re_nsub' is the number of subexpressions in PATTERN; `not_bol' and `not_eol' are zero; - + The `fastmap' and `newline_anchor' fields are neither examined nor set. */ @@ -1040,20 +1037,20 @@ `char *' (i.e., signed), we declare these variables as unsigned, so they can be reliably used as array indices. */ register unsigned char c, c1; - + /* A random tempory spot in PATTERN. */ const char *p1; /* Points to the end of the buffer, where we should append. */ register unsigned char *b; - + /* Keeps track of unclosed groups. */ compile_stack_type compile_stack; /* Points to the current (ending) position in the pattern. */ const char *p = pattern; const char *pend = pattern + size; - + /* How to translate the characters in the pattern. */ char *translate = bufp->translate; @@ -1074,7 +1071,7 @@ /* Place in the uncompiled pattern (i.e., the {) to which to go back if the interval is invalid. */ const char *beg_interval; - + /* Address of the place where a forward jump should go to the end of the containing expression. Each alternative of an `or' -- except the last -- ends with a forward jump of this sort. */ @@ -1090,7 +1087,7 @@ if (debug) { unsigned debug_count; - + for (debug_count = 0; debug_count < size; debug_count++) printchar (patterndebug_count); putchar ('\n'); @@ -1114,9 +1111,9 @@ printer (for debugging) will think there's no pattern. We reset it at the end. */ bufp->used = 0; - + /* Always count groups, whether or not bufp->no_sub is set. */ - bufp->re_nsub = 0; + bufp->re_nsub = 0; /* Initialize the syntax table. */ init_syntax_once (); @@ -1165,7 +1162,7 @@ case '$': { if ( /* If at end of pattern, it's an operator. */ - p == pend + p == pend /* If context independent, it's an operator. */ || syntax & RE_CONTEXT_INDEP_ANCHORS /* Otherwise, depends on what's next. */ @@ -1196,7 +1193,7 @@ { /* Are we optimizing this jump? */ boolean keep_string_p = false; - + /* 1 means zero (many) matches is allowed. */ char zero_times_ok = 0, many_times_ok = 0; @@ -1244,7 +1241,7 @@ /* Star, etc. applied to an empty pattern is equivalent to an empty pattern. */ - if (!laststart) + if (!laststart) break; /* Now we know whether or not zero matches is allowed @@ -1253,7 +1250,7 @@ { /* More than one repetition is allowed, so put in at the end a backward relative jump from `b' to before the next jump we're going to put in below (which jumps from - laststart to after this jump). + laststart to after this jump). But if we are at the `*' in the exact sequence `.*\n', insert an unconditional jump backwards to the ., @@ -1330,7 +1327,7 @@ /* We test `*p == '^' twice, instead of using an if statement, so we only need one BUF_PUSH. */ - BUF_PUSH (*p == '^' ? charset_not : charset); + BUF_PUSH (*p == '^' ? charset_not : charset); if (*p == '^') p++; @@ -1380,8 +1377,8 @@ was a character: if this is a hyphen not at the beginning or the end of a list, then it's the range operator. */ - if (c == '-' - && !(p - 2 >= pattern && p-2 == '') + if (c == '-' + && !(p - 2 >= pattern && p-2 == '') && !(p - 3 >= pattern && p-3 == '' && p-2 == '^') && *p != '') { @@ -1396,7 +1393,7 @@ /* Move past the `-'. */ PATFETCH (c1); - + ret = compile_range (&p, pend, translate, syntax, b); if (ret != REG_NOERROR) return ret; } @@ -1425,7 +1422,7 @@ strc1 = '\0'; /* If isn't a word bracketed by `:' and:`': - undo the ending character, the letters, and leave + undo the ending character, the letters, and leave the leading `:' and `' (but set bits for them). */ if (c == ':' && *p == '') { @@ -1442,12 +1439,12 @@ boolean is_space = STREQ (str, "space"); boolean is_upper = STREQ (str, "upper"); boolean is_xdigit = STREQ (str, "xdigit"); - + if (!IS_CHAR_CLASS (str)) return REG_ECTYPE; /* Throw away the at the end of the character class. */ - PATFETCH (c); + PATFETCH (c); if (p == pend) return REG_EBRACK; @@ -1472,7 +1469,7 @@ else { c1++; - while (c1--) + while (c1--) PATUNFETCH; SET_LIST_BIT (''); SET_LIST_BIT (':'); @@ -1488,8 +1485,8 @@ /* Discard any (non)matching list bytes that are all 0 at the end of the map. Decrease the map-length byte too. */ - while ((int) b-1 > 0 && bb-1 - 1 == 0) - b-1--; + while ((int) b-1 > 0 && bb-1 - 1 == 0) + b-1--; b += b-1; } break; @@ -1549,7 +1546,7 @@ regnum++; if (COMPILE_STACK_FULL) - { + { RETALLOC (compile_stack.stack, compile_stack.size << 1, compile_stack_elt_t); if (compile_stack.stack == NULL) return REG_ESPACE; @@ -1562,7 +1559,7 @@ whole pattern moves because of realloc, they will still be valid. */ COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer; - COMPILE_STACK_TOP.fixup_alt_jump + COMPILE_STACK_TOP.fixup_alt_jump = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0; COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer; COMPILE_STACK_TOP.regnum = regnum; @@ -1576,7 +1573,7 @@ COMPILE_STACK_TOP.inner_group_offset = b - bufp->buffer + 2; BUF_PUSH_3 (start_memory, regnum, 0); } - + compile_stack.avail++; fixup_alt_jump = 0; @@ -1606,7 +1603,7 @@ `pop_failure_jump' to pop. See comments at `push_dummy_failure' in `re_match_2'. */ BUF_PUSH (push_dummy_failure); - + /* We allocated space for this jump when we assigned to `fixup_alt_jump', in the `handle_alt' case below. */ STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1); @@ -1629,11 +1626,11 @@ as in `(ab)c(de)' -- the second group is #2. */ regnum_t this_group_regnum; - compile_stack.avail--; + compile_stack.avail--; begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset; fixup_alt_jump = COMPILE_STACK_TOP.fixup_alt_jump - ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1 + ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1 : 0; laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset; this_group_regnum = COMPILE_STACK_TOP.regnum; @@ -1648,7 +1645,7 @@ { unsigned char *inner_group_loc = bufp->buffer + COMPILE_STACK_TOP.inner_group_offset; - + *inner_group_loc = regnum - this_group_regnum; BUF_PUSH_3 (stop_memory, this_group_regnum, regnum - this_group_regnum); @@ -1677,10 +1674,10 @@ jump (put in below, which in turn will jump to the next (if any) alternative's such jump, etc.). The last such jump jumps to the correct final destination. A picture: - _____ _____ - | | | | - | v | v - a | b | c + _____ _____ + | | | | + | v | v + a | b | c If we are at `b', then fixup_alt_jump right now points to a three-byte space after `a'. We'll put in the jump, set @@ -1702,10 +1699,10 @@ break; - case '{': + case '{': /* If \{ is a literal. */ if (!(syntax & RE_INTERVALS) - /* If we're at `\{' and it's not the open-interval + /* If we're at `\{' and it's not the open-interval operator. */ || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES)) || (p - 2 == pattern && p == pend)) @@ -1744,11 +1741,11 @@ { if (syntax & RE_NO_BK_BRACES) goto unfetch_interval; - else + else return REG_BADBR; } - if (!(syntax & RE_NO_BK_BRACES)) + if (!(syntax & RE_NO_BK_BRACES)) { if (c != '\\') return REG_EBRACE; @@ -1759,7 +1756,7 @@ { if (syntax & RE_NO_BK_BRACES) goto unfetch_interval; - else + else return REG_BADBR; } @@ -1795,7 +1792,7 @@ jump_n <succeed_n addr> <jump count> (The upper bound and `jump_n' are omitted if `upper_bound' is 1, though.) */ - else + else { /* If the upper bound is > 1, we need to insert more at the end of the loop. */ unsigned nbytes = 10 + (upper_bound > 1) * 10; @@ -1812,7 +1809,7 @@ lower_bound); b += 5; - /* Code to initialize the lower bound. Insert + /* Code to initialize the lower bound. Insert before the `succeed_n'. The `5' is the last two bytes of this `set_number_at', plus 3 bytes of the following `succeed_n'. */ @@ -1823,7 +1820,7 @@ { /* More than one repetition is allowed, so append a backward jump to the `succeed_n' that starts this interval. - + When we've reached this during matching, we'll have matched the interval once, so jump back only `upper_bound - 1' times. */ @@ -1841,7 +1838,7 @@ so everything is getting moved up by 5. Conclusion: (b - 2) - (laststart + 3) + 5, i.e., b - laststart. - + We insert this at the beginning of the loop so that if we fail during matching, we'll reinitialize the bounds. */ @@ -1862,7 +1859,7 @@ beg_interval = NULL; /* normal_char and normal_backslash need `c'. */ - PATFETCH (c); + PATFETCH (c); if (!(syntax & RE_NO_BK_BRACES)) { @@ -1948,11 +1945,11 @@ /* Expects the character in `c'. */ normal_char: /* If no exactn currently being built. */ - if (!pending_exact + if (!pending_exact /* If last exactn not at current position. */ || pending_exact + *pending_exact + 1 != b - + /* We have only one byte following the exactn for the count. */ || *pending_exact == (1 << BYTEWIDTH) - 1 @@ -1967,26 +1964,26 @@ : (p0 == '\\' && p1 == '{')))) { /* Start building a new exactn. */ - + laststart = b; BUF_PUSH_2 (exactn, 0); pending_exact = b - 1; } - + BUF_PUSH (c); (*pending_exact)++; break; } /* switch (c) */ } /* while p != pend */ - + /* Through the pattern now. */ - + if (fixup_alt_jump) STORE_JUMP (jump_past_alt, fixup_alt_jump, b); - if (!COMPILE_STACK_EMPTY) + if (!COMPILE_STACK_EMPTY) return REG_EPAREN; free (compile_stack.stack); @@ -2042,14 +2039,14 @@ re_opcode_t op; unsigned char *loc; int arg; - unsigned char *end; + unsigned char *end; { register unsigned char *pfrom = end; register unsigned char *pto = end + 3; while (pfrom != loc) *--pto = *--pfrom; - + store_op1 (op, loc, arg); } @@ -2061,14 +2058,14 @@ re_opcode_t op; unsigned char *loc; int arg1, arg2; - unsigned char *end; + unsigned char *end; { register unsigned char *pfrom = end; register unsigned char *pto = end + 5; while (pfrom != loc) *--pto = *--pfrom; - + store_op2 (op, loc, arg1, arg2); } @@ -2084,7 +2081,7 @@ { const char *prev = p - 2; boolean prev_prev_backslash = prev > pattern && prev-1 == '\\'; - + return /* After a subexpression? */ (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash)) @@ -2104,7 +2101,7 @@ const char *next = p; boolean next_backslash = *next == '\\'; const char *next_next = p + 1 < pend ? p + 1 : NULL; - + return /* Before a subexpression? */ (syntax & RE_NO_BK_PARENS ? *next == ')' @@ -2115,7 +2112,7 @@ } -/* Returns true if REGNUM is in one of COMPILE_STACK's elements and +/* Returns true if REGNUM is in one of COMPILE_STACK's elements and false if it's not. */ static boolean @@ -2125,8 +2122,8 @@ { int this_element; - for (this_element = compile_stack.avail - 1; - this_element >= 0; + for (this_element = compile_stack.avail - 1; + this_element >= 0; this_element--) if (compile_stack.stackthis_element.regnum == regnum) return true; @@ -2140,9 +2137,9 @@ starting character is in `P-2'. (`P-1' is the character `-'.) Then we set the translation of all bits between the starting and ending characters (inclusive) in the compiled pattern B. - + Return an error code. - + We use these short variable names so we can use the same macros as `regex_compile' itself. */ @@ -2157,7 +2154,7 @@ const char *p = *p_ptr; int range_start, range_end; - + if (p == pend) return REG_ERANGE; @@ -2166,7 +2163,7 @@ is set, the range endpoints will be negative if we fetch using a signed char *. - We also want to fetch the endpoints without translating them; the + We also want to fetch the endpoints without translating them; the appropriate translation is done in the bit-setting loop below. */ range_start = ((unsigned char *) p)-2; range_end = ((unsigned char *) p)0; @@ -2187,14 +2184,14 @@ { SET_LIST_BIT (TRANSLATE (this_char)); } - + return REG_NOERROR; }  /* Failure stack declarations and macros; both re_compile_fastmap and re_match_2 use a failure stack. These have to be macros because of REGEX_ALLOCATE. */ - + /* Number of failure points for which to initially allocate space when matching. If this number is exceeded, we allocate more @@ -2242,8 +2239,8 @@ /* Double the size of FAIL_STACK, up to approximately `re_max_failures' items. Return 1 if succeeds, and 0 if either ran out of memory - allocating space for it or it was already too large. - + allocating space for it or it was already too large. + REGEX_REALLOCATE requires `destination' be declared. */ #define DOUBLE_FAIL_STACK(fail_stack) \ @@ -2260,7 +2257,7 @@ 1))) -/* Push PATTERN_OP on FAIL_STACK. +/* Push PATTERN_OP on FAIL_STACK. Return 1 if was able to do so and 0 if ran out of memory allocating space to do so. */ @@ -2291,12 +2288,12 @@ /* Push the information about the state we will need - if we ever fail back to it. - + if we ever fail back to it. + Requires variables fail_stack, regstart, regend, reg_info, and num_regs be declared. DOUBLE_FAIL_STACK requires `destination' be declared. - + Does `return FAILURE_CODE' if runs out of memory. */ #define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code) \ @@ -2405,7 +2402,7 @@ LOW_REG, HIGH_REG -- the highest and lowest active registers. REGSTART, REGEND -- arrays of string positions. REG_INFO -- array of information about each subexpression. - + Also assumes the variables `fail_stack' and (if debugging), `bufp', `pend', `string1', `size1', `string2', and `size2'. */ @@ -2473,7 +2470,7 @@ The caller must supply the address of a (1 << BYTEWIDTH)-byte data area as BUFP->fastmap. - + We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in the pattern buffer. @@ -2490,7 +2487,7 @@ #endif /* We don't push any register information onto the failure stack. */ unsigned num_regs = 0; - + register char *fastmap = bufp->fastmap; unsigned char *pattern = bufp->buffer; unsigned long size = bufp->used; @@ -2507,27 +2504,27 @@ boolean succeed_n_p = false; assert (fastmap != NULL && p != NULL); - + INIT_FAIL_STACK (); bzero (fastmap, 1 << BYTEWIDTH); /* Assume nothing's valid. */ bufp->fastmap_accurate = 1; /* It will be when we're done. */ bufp->can_be_null = 0; - + while (p != pend || !FAIL_STACK_EMPTY ()) { if (p == pend) { bufp->can_be_null |= path_can_be_null; - + /* Reset for next path. */ path_can_be_null = true; - + p = fail_stack.stack--fail_stack.avail; } /* We should never be about to go beyond the end of the pattern. */ assert (p < pend); - + #ifdef SWITCH_ENUM_BUG switch ((int) ((re_opcode_t) *p++)) #else @@ -2621,10 +2618,10 @@ case jump_past_alt: case dummy_failure_jump: EXTRACT_NUMBER_AND_INCR (j, p); - p += j; + p += j; if (j > 0) continue; - + /* Jump backward implies we just went through the body of a loop and matched nothing. Opcode jumped to should be `on_failure_jump' or `succeed_n'. Just treat it like an @@ -2636,10 +2633,10 @@ p++; EXTRACT_NUMBER_AND_INCR (j, p); - p += j; - + p += j; + /* If what's on the stack is where we are now, pop it. */ - if (!FAIL_STACK_EMPTY () + if (!FAIL_STACK_EMPTY () && fail_stack.stackfail_stack.avail - 1 == p) fail_stack.avail--; @@ -2677,7 +2674,7 @@ case succeed_n: /* Get to the number of times to succeed. */ - p += 2; + p += 2; /* Increment p past the n for when k != 0. */ EXTRACT_NUMBER_AND_INCR (k, p); @@ -2768,7 +2765,7 @@ int size, startpos, range; struct re_registers *regs; { - return re_search_2 (bufp, NULL, 0, string, size, startpos, range, + return re_search_2 (bufp, NULL, 0, string, size, startpos, range, regs, size); } @@ -2776,17 +2773,17 @@ /* Using the compiled pattern in BUFP->buffer, first tries to match the virtual concatenation of STRING1 and STRING2, starting first at index STARTPOS, then at STARTPOS + 1, and so on. - + STRING1 and STRING2 have length SIZE1 and SIZE2, respectively. - + RANGE is how far to scan while trying to match. RANGE = 0 means try only at STARTPOS; in general, the last start tried is STARTPOS + RANGE. - + In REGS, return the indices of the virtual concatenation of STRING1 and STRING2 that matched the entire BUFP->buffer and its contained subexpressions. - + Do not consider matching one past the index STOP in the virtual concatenation of STRING1 and STRING2. @@ -2813,7 +2810,7 @@ /* Check for out-of-range STARTPOS. */ if (startpos < 0 || startpos > total_size) return -1; - + /* Fix up RANGE if it might eventually take us outside the virtual concatenation of STRING1 and STRING2. */ if (endpos < -1) @@ -2835,10 +2832,10 @@ if (fastmap && !bufp->fastmap_accurate) if (re_compile_fastmap (bufp) == -2) return -2; - + /* Loop through the string, looking for a place to start matching. */ for (;;) - { + { /* If a fastmap is supplied, skip quickly over characters that cannot be the start of a match. If the pattern can match the null string, however, we don't need to skip characters; we want @@ -2855,7 +2852,7 @@ lim = range - (size1 - startpos); d = (startpos >= size1 ? string2 - size1 : string1) + startpos; - + /* Written out as an if-else to avoid testing `translate' inside the loop. */ if (translate) @@ -2872,7 +2869,7 @@ else /* Searching backwards. */ { register char c = (size1 == 0 || startpos >= size1 - ? string2startpos - size1 + ? string2startpos - size1 : string1startpos); if (!fastmap(unsigned char) TRANSLATE (c)) @@ -2889,21 +2886,21 @@ startpos, regs, stop); if (val >= 0) return startpos; - + if (val == -2) return -2; advance: - if (!range) + if (!range) break; - else if (range > 0) + else if (range > 0) { - range--; + range--; startpos++; } else { - range++; + range++; startpos--; } } @@ -2922,8 +2919,8 @@ onto the failure stack. Other register information, such as the starting and ending positions (which are addresses), and the list of inner groups (which is a bits list) are maintained in separate - variables. - + variables. + We are making a (strictly speaking) nonportable assumption here: that the compiler will pack our bit fields into something that fits into the type of `word', i.e., is something that fits into one item on the @@ -2997,7 +2994,7 @@ /* Test if at very beginning or at very end of the virtual concatenation of `string1' and `string2'. If only one string, it's `string2'. */ #define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2) -#define AT_STRINGS_END(d) ((d) == end2) +#define AT_STRINGS_END(d) ((d) == end2) /* Test if D points to a character which is word-constituent. We have @@ -3059,7 +3056,7 @@ int size, pos; struct re_registers *regs; { - return re_match_2 (bufp, NULL, 0, string, size, pos, regs, size); + return re_match_2 (bufp, NULL, 0, string, size, pos, regs, size); } @@ -3067,7 +3064,7 @@ the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1 and SIZE2, respectively). We start matching at POS, and stop matching at STOP. - + If REGS is non-null and the `no_sub' field of BUFP is nonzero, we store offsets for the substring each group matched in REGS. See the documentation for exactly how many groups we fill. @@ -3098,7 +3095,7 @@ /* Where we are in the data, and the end of the current string. */ const char *d, *dend; - + /* Where we are in the pattern, and the end of the pattern. */ unsigned char *p = bufp->buffer; register unsigned char *pend = p + bufp->used; @@ -3125,7 +3122,7 @@ return, for use in backreferences. The number here includes an element for register zero. */ unsigned num_regs = bufp->re_nsub + 1; - + /* The currently active registers. */ unsigned lowest_active_reg = NO_LOWEST_ACTIVE_REG; unsigned highest_active_reg = NO_HIGHEST_ACTIVE_REG; @@ -3155,12 +3152,12 @@ register_info_type *reg_info = NULL; /* The following record the register info as found in the above - variables when we find a match better than any we've seen before. + variables when we find a match better than any we've seen before. This happens as we backtrack through the failure points, which in turn happens only if we have not yet matched the entire string. */ unsigned best_regs_set = false; const char **best_regstart = NULL, **best_regend = NULL; - + /* Logically, this is `best_regend0'. But we don't want to have to allocate space for that if we're not allocating space for anything else (see below). Also, we never need info about register 0 for @@ -3177,13 +3174,13 @@ #ifdef DEBUG /* Counts the total number of registers pushed. */ - unsigned num_regs_pushed = 0; + unsigned num_regs_pushed = 0; #endif DEBUG_PRINT1 ("\n\nEntering re_match_2.\n"); - + INIT_FAIL_STACK (); - + /* Do not bother to initialize all the register variables if there are no groups in the pattern, as it takes a fair amount of time. If there are groups, we include space for register 0 (the whole @@ -3201,8 +3198,8 @@ reg_dummy = REGEX_TALLOC (num_regs, const char *); reg_info_dummy = REGEX_TALLOC (num_regs, register_info_type); - if (!(regstart && regend && old_regstart && old_regend && reg_info - && best_regstart && best_regend && reg_dummy && reg_info_dummy)) + if (!(regstart && regend && old_regstart && old_regend && reg_info + && best_regstart && best_regend && reg_dummy && reg_info_dummy)) { FREE_VARIABLES (); return -2; @@ -3225,21 +3222,21 @@ FREE_VARIABLES (); return -1; } - + /* Initialize subexpression text positions to -1 to mark ones that no start_memory/stop_memory has been seen for. Also initialize the register information struct. */ for (mcnt = 1; UNSIGNED(mcnt) < num_regs; mcnt++) { - regstartmcnt = regendmcnt + regstartmcnt = regendmcnt = old_regstartmcnt = old_regendmcnt = REG_UNSET_VALUE; - + REG_MATCH_NULL_STRING_P (reg_infomcnt) = MATCH_NULL_UNSET_VALUE; IS_ACTIVE (reg_infomcnt) = 0; MATCHED_SOMETHING (reg_infomcnt) = 0; EVER_MATCHED_SOMETHING (reg_infomcnt) = 0; } - + /* We move `string1' into `string2' if the latter's empty -- but not if `string1' is null. */ if (size2 == 0 && string1 != NULL) @@ -3264,7 +3261,7 @@ end_match_2 = string2 + stop - size1; } - /* `p' scans through the pattern as `d' scans through the data. + /* `p' scans through the pattern as `d' scans through the data. `dend' is the end of the input string that `d' points within. `d' is advanced into the following input string whenever necessary, but this happens before fetching; therefore, at the beginning of the @@ -3286,7 +3283,7 @@ DEBUG_PRINT1 ("The string to match is: `"); DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2); DEBUG_PRINT1 ("'\n"); - + /* This loops over pattern commands. It exits by returning from the function if the match is complete, or it drops through if the match fails at this starting point in the input data. */ @@ -3297,16 +3294,16 @@ if (p == pend) { /* End of pattern means we might have succeeded. */ DEBUG_PRINT1 ("end of pattern ... "); - + /* If we haven't matched the entire string, and we want the longest match, try backtracking. */ if (d != end_match_2) { DEBUG_PRINT1 ("backtracking.\n"); - + if (!FAIL_STACK_EMPTY ()) { /* More failure points to try. */ - boolean same_str_p = (FIRST_STRING_P (match_end) + boolean same_str_p = (FIRST_STRING_P (match_end) == MATCHING_IN_FIRST_STRING); /* If exceeds best match so far, save it. */ @@ -3316,20 +3313,20 @@ { best_regs_set = true; match_end = d; - + DEBUG_PRINT1 ("\nSAVING match as best so far.\n"); - + for (mcnt = 1; UNSIGNED(mcnt) < num_regs; mcnt++) { best_regstartmcnt = regstartmcnt; best_regendmcnt = regendmcnt; } } - goto fail; + goto fail; } /* If no failure points, don't restore garbage. */ - else if (best_regs_set) + else if (best_regs_set) { restore_best_regs: /* Restore best match. It may happen that `dend == @@ -3338,7 +3335,7 @@ strings `x-' and `y-z-', if the two strings are not consecutive in memory. */ DEBUG_PRINT1 ("Restoring best registers.\n"); - + d = match_end; dend = ((d >= string1 && d <= end1) ? end_match_1 : end_match_2); @@ -3394,7 +3391,7 @@ regs->end0 = (MATCHING_IN_FIRST_STRING ? d - string1 : d - string2 + size1); } - + /* Go through the first `min (num_regs, regs->num_regs)' registers, since that is all we initialized. */ for (mcnt = 1; UNSIGNED(mcnt) < MIN (num_regs, regs->num_regs); mcnt++) @@ -3407,7 +3404,7 @@ regs->endmcnt = POINTER_TO_OFFSET (regendmcnt); } } - + /* If the regs structure we return has more elements than were in the pattern, set the extra elements to -1. If we (re)allocated the registers, this is the case, @@ -3423,8 +3420,8 @@ nfailure_points_pushed - nfailure_points_popped); DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed); - mcnt = d - pos - (MATCHING_IN_FIRST_STRING - ? string1 + mcnt = d - pos - (MATCHING_IN_FIRST_STRING + ? string1 : string2 - size1); DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt); @@ -3514,7 +3511,7 @@ p += 1 + *p; if (!not) goto fail; - + SET_REGS_MATCHED (); d++; break; @@ -3531,9 +3528,9 @@ /* Find out if this group can match the empty string. */ p1 = p; /* To send to group_match_null_string_p. */ - + if (REG_MATCH_NULL_STRING_P (reg_info*p) == MATCH_NULL_UNSET_VALUE) - REG_MATCH_NULL_STRING_P (reg_info*p) + REG_MATCH_NULL_STRING_P (reg_info*p) = group_match_null_string_p (&p1, pend, reg_info); /* Save the position in the string where we were the last time @@ -3544,7 +3541,7 @@ old_regstart*p = REG_MATCH_NULL_STRING_P (reg_info*p) ? REG_UNSET (regstart*p) ? d : regstart*p : regstart*p; - DEBUG_PRINT2 (" old_regstart: %d\n", + DEBUG_PRINT2 (" old_regstart: %d\n", POINTER_TO_OFFSET (old_regstart*p)); regstart*p = d; @@ -3552,10 +3549,10 @@ IS_ACTIVE (reg_info*p) = 1; MATCHED_SOMETHING (reg_info*p) = 0; - + /* This is the new highest active register. */ highest_active_reg = *p; - + /* If nothing was active before, this is the new lowest active register. */ if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) @@ -3571,7 +3568,7 @@ number, and the number of inner groups. */ case stop_memory: DEBUG_PRINT3 ("EXECUTING stop_memory %d (%d):\n", *p, p1); - + /* We need to save the string position the last time we were at this close-group operator in case the group is operated upon by a repetition operator, e.g., with `((a*)*(b*)*)*' @@ -3580,7 +3577,7 @@ old_regend*p = REG_MATCH_NULL_STRING_P (reg_info*p) ? REG_UNSET (regend*p) ? d : regend*p : regend*p; - DEBUG_PRINT2 (" old_regend: %d\n", + DEBUG_PRINT2 (" old_regend: %d\n", POINTER_TO_OFFSET (old_regend*p)); regend*p = d; @@ -3588,7 +3585,7 @@ /* This register isn't active anymore. */ IS_ACTIVE (reg_info*p) = 0; - + /* If this was the only register active, nothing is active anymore. */ if (lowest_active_reg == highest_active_reg) @@ -3604,7 +3601,7 @@ unsigned char r = *p - 1; while (r > 0 && !IS_ACTIVE (reg_infor)) r--; - + /* If we end up at register zero, that means that we saved the registers as the result of an `on_failure_jump', not a `start_memory', and we jumped to past the innermost @@ -3620,7 +3617,7 @@ else highest_active_reg = r; } - + /* If just failed to match something this time around with a group that's operated on by a repetition operator, try to force exit from the ``loop'', and restore the register @@ -3628,10 +3625,10 @@ last match. */ if ((!MATCHED_SOMETHING (reg_info*p) || (re_opcode_t) p-3 == start_memory) - && (p + 2) < pend) + && (p + 2) < pend) { boolean is_a_jump_n = false; - + p1 = p + 2; mcnt = 0; switch ((re_opcode_t) *p1++) @@ -3646,12 +3643,12 @@ if (is_a_jump_n) p1 += 2; break; - + default: /* do nothing */ ; } p1 += mcnt; - + /* If the next operation is a jump backwards in the pattern to an on_failure_jump right before the start_memory corresponding to this stop_memory, exit from the loop @@ -3665,17 +3662,17 @@ failed match, e.g., with `(a*)*b' against `ab' for regstart1, and, e.g., with `((a*)*(b*)*)*' against `aba' for regend3. - + Also restore the registers for inner groups for, e.g., `((a*)(b*))*' against `aba' (register 3 would otherwise get trashed). */ - + if (EVER_MATCHED_SOMETHING (reg_info*p)) { - unsigned r; - + unsigned r; + EVER_MATCHED_SOMETHING (reg_info*p) = 0; - + /* Restore this and inner groups' (if any) registers. */ for (r = *p; r < *p + *(p + 1); r++) { @@ -3684,7 +3681,7 @@ /* xx why this test? */ if ((int) old_regendr >= (int) regstartr) regendr = old_regendr; - } + } } p1++; EXTRACT_NUMBER_AND_INCR (mcnt, p1); @@ -3693,7 +3690,7 @@ goto fail; } } - + /* Move past the register number and the inner group count. */ p += 2; break; @@ -3710,16 +3707,16 @@ /* Can't back reference a group which we've never matched. */ if (REG_UNSET (regstartregno) || REG_UNSET (regendregno)) goto fail; - + /* Where in input to try to start matching. */ d2 = regstartregno; - + /* Where to stop matching; if both the place to start and the place to stop matching are in the same string, then set to the place to stop, otherwise, for now have to use the end of the first string. */ - dend2 = ((FIRST_STRING_P (regstartregno) + dend2 = ((FIRST_STRING_P (regstartregno) == FIRST_STRING_P (regendregno)) ? regendregno : end_match_1); for (;;) @@ -3743,16 +3740,16 @@ /* How many characters left in this segment to match. */ mcnt = dend - d; - + /* Want how many consecutive characters we can match in one shot, so, if necessary, adjust the count. */ if (mcnt > dend2 - d2) mcnt = dend2 - d2; - + /* Compare that many; failure if mismatch, else move past them. */ - if (translate - ? bcmp_translate (d, d2, mcnt, translate) + if (translate + ? bcmp_translate (d, d2, mcnt, translate) : bcmp (d, d2, mcnt)) goto fail; d += mcnt, d2 += mcnt; @@ -3766,7 +3763,7 @@ `newline_anchor' is set, after newlines. */ case begline: DEBUG_PRINT1 ("EXECUTING begline.\n"); - + if (AT_STRINGS_BEG (d)) { if (!bufp->not_bol) break; @@ -3787,7 +3784,7 @@ { if (!bufp->not_eol) break; } - + /* We have to ``prefetch'' the next character. */ else if ((d == end1 ? *string2 : *d) == '\n' && bufp->newline_anchor) @@ -3821,7 +3818,7 @@ then the . fails against the \n. But the next thing we want to do is match the \n against the \n; if we restored the string value, we would be back at the foo. - + Because this is used only in specific cases, we don't need to check all the things that `on_failure_jump' does, to make sure the right things get saved on the stack. Hence we don't @@ -3831,7 +3828,7 @@ case; that seems worse than this. */ case on_failure_keep_string_jump: DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump"); - + EXTRACT_NUMBER_AND_INCR (mcnt, p); DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt); @@ -3840,7 +3837,7 @@ /* Uses of on_failure_jump: - + Each alternative starts with an on_failure_jump that points to the beginning of the next alternative. Each alternative except the last ends with a jump that in effect jumps past @@ -3906,7 +3903,7 @@ would have to backtrack because of (as in, e.g., `a*a') then we can change to pop_failure_jump, because we'll never have to backtrack. - + This is not true in the case of alternatives: in `(a|ab)*' we do need to backtrack to the `ab' alternative (e.g., if the string was `ab'). But instead of trying to @@ -3938,7 +3935,7 @@ p1 = p + mcnt; /* p10 ... p12 are the `on_failure_jump' corresponding - to the `maybe_finalize_jump' of this case. Examine what + to the `maybe_finalize_jump' of this case. Examine what follows. */ if ((re_opcode_t) p13 == exactn && p15 != c) { @@ -3946,12 +3943,12 @@ DEBUG_PRINT3 (" %c != %c => pop_failure_jump.\n", c, p15); } - + else if ((re_opcode_t) p13 == charset || (re_opcode_t) p13 == charset_not) { int not = (re_opcode_t) p13 == charset_not; - + if (c < (unsigned char) (p14 * BYTEWIDTH) && p15 + c / BYTEWIDTH & (1 << (c % BYTEWIDTH))) not = !not; @@ -4002,7 +3999,7 @@ } /* Note fall through. */ - + /* Unconditionally jump (without popping any failure points). */ case jump: unconditional_jump: @@ -4012,7 +4009,7 @@ DEBUG_PRINT2 ("(to 0x%x).\n", p); break; - + /* We need this opcode so we can detect where alternatives end in `group_match_null_string_p' et al. */ case jump_past_alt: @@ -4047,7 +4044,7 @@ /* Have to succeed matching what follows at least n times. After that, handle like `on_failure_jump'. */ - case succeed_n: + case succeed_n: EXTRACT_NUMBER (mcnt, p + 2); DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt); @@ -4068,8 +4065,8 @@ goto on_failure; } break; - - case jump_n: + + case jump_n: EXTRACT_NUMBER (mcnt, p + 2); DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt); @@ -4078,13 +4075,13 @@ { mcnt--; STORE_NUMBER (p + 2, mcnt); - goto unconditional_jump; + goto unconditional_jump; } /* If don't have to jump any more, skip over the rest of command. */ - else - p += 4; + else + p += 4; break; - + case set_number_at: { DEBUG_PRINT1 ("EXECUTING set_number_at.\n"); @@ -4130,7 +4127,7 @@ SET_REGS_MATCHED (); d++; break; - + case notwordchar: DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n"); PREFETCH (); @@ -4139,7 +4136,7 @@ SET_REGS_MATCHED (); d++; break; - + default: abort (); } @@ -4164,7 +4161,7 @@ if (p < pend) { boolean is_a_jump_n = false; - + /* If failed to a backwards jump that's part of a repetition loop, need to pop this failure point and use the next one. */ switch ((re_opcode_t) *p) @@ -4176,7 +4173,7 @@ case jump: p1 = p + 1; EXTRACT_NUMBER_AND_INCR (mcnt, p1); - p1 += mcnt; + p1 += mcnt; if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n) || (!is_a_jump_n @@ -4207,10 +4204,10 @@ /* We are passed P pointing to a register number after a start_memory. - + Return true if the pattern up to the corresponding stop_memory can match the empty string, and false otherwise. - + If we find the matching stop_memory, sets P to point to one past its number. Otherwise, sets P to an undefined byte less than or equal to END. @@ -4224,20 +4221,20 @@ int mcnt; /* Point to after the args to the start_memory. */ unsigned char *p1 = *p + 2; - + while (p1 < end) { /* Skip over opcodes that can match nothing, and return true or false, as appropriate, when we get to one that can't, or to the matching stop_memory. */ - + switch ((re_opcode_t) *p1) { /* Could be either a loop or a series of alternatives. */ case on_failure_jump: p1++; EXTRACT_NUMBER_AND_INCR (mcnt, p1); - + /* If the next operation is not a jump backwards in the pattern. */ @@ -4251,7 +4248,7 @@ /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6 /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3 - /exactn/1/c + /exactn/1/c So, we have to first go through the first (n-1) alternatives and then deal with the last one separately. */ @@ -4267,19 +4264,19 @@ is, including the ending `jump_past_alt' and its number. */ - if (!alt_match_null_string_p (p1, p1 + mcnt - 3, + if (!alt_match_null_string_p (p1, p1 + mcnt - 3, reg_info)) return false; /* Move to right after this alternative, including the jump_past_alt. */ - p1 += mcnt; + p1 += mcnt; /* Break if it's the beginning of an n-th alternative that doesn't begin with an on_failure_jump. */ if ((re_opcode_t) *p1 != on_failure_jump) break; - + /* Still have to check that it's not an n-th alternative that starts with an on_failure_jump. */ p1++; @@ -4304,14 +4301,14 @@ } /* if mcnt > 0 */ break; - + case stop_memory: assert (p11 == **p); *p = p1 + 2; return true; - - default: + + default: if (!common_op_match_null_string_p (&p1, end, reg_info)) return false; } @@ -4324,7 +4321,7 @@ /* Similar to group_match_null_string_p, but doesn't deal with alternatives: It expects P to be the first byte of a single alternative and END one byte past the last. The alternative can contain groups. */ - + static boolean alt_match_null_string_p (p, end, reg_info) unsigned char *p, *end; @@ -4332,12 +4329,12 @@ { int mcnt; unsigned char *p1 = p; - + while (p1 < end) { - /* Skip over opcodes that can match nothing, and break when we get + /* Skip over opcodes that can match nothing, and break when we get to one that can't. */ - + switch ((re_opcode_t) *p1) { /* It's a loop. */ @@ -4346,8 +4343,8 @@ EXTRACT_NUMBER_AND_INCR (mcnt, p1); p1 += mcnt; break; - - default: + + default: if (!common_op_match_null_string_p (&p1, end, reg_info)) return false; } @@ -4358,8 +4355,8 @@ /* Deals with the ops common to group_match_null_string_p and - alt_match_null_string_p. - + alt_match_null_string_p. + Sets P to one after the op and its arguments, if any. */ static boolean @@ -4389,7 +4386,7 @@ reg_no = *p1; assert (reg_no > 0 && reg_no <= MAX_REGNUM); ret = group_match_null_string_p (&p1, end, reg_info); - + /* Have to set this here in case we're checking a group which contains a group and a back reference to it. */ @@ -4399,7 +4396,7 @@ if (!ret) return false; break; - + /* If this is an optimized succeed_n for zero times, make the jump. */ case jump: EXTRACT_NUMBER_AND_INCR (mcnt, p1); @@ -4411,7 +4408,7 @@ case succeed_n: /* Get to the number of times to succeed. */ - p1 += 2; + p1 += 2; EXTRACT_NUMBER_AND_INCR (mcnt, p1); if (mcnt == 0) @@ -4424,7 +4421,7 @@ return false; break; - case duplicate: + case duplicate: if (!REG_MATCH_NULL_STRING_P (reg_info*p1)) return false; break; @@ -4444,7 +4441,7 @@ /* Return zero if TRANSLATES1 and TRANSLATES2 are identical for LEN bytes; nonzero otherwise. */ - + static int bcmp_translate (s1, s2, len, translate) unsigned char *s1, *s2; @@ -4465,10 +4462,10 @@ /* re_compile_pattern is the GNU regular expression compiler: it compiles PATTERN (of length SIZE) and puts the result in BUFP. Returns 0 if the pattern was valid, otherwise an error string. - + Assumes the `allocated' (and perhaps `buffer') and `translate' fields are set in BUFP on entry. - + We call regex_compile to do the actual compilation. */ const char * @@ -4478,23 +4475,23 @@ struct re_pattern_buffer *bufp; { reg_errcode_t ret; - + /* GNU code is written to assume at least RE_NREGS registers will be set (and at least one extra will be -1). */ bufp->regs_allocated = REGS_UNALLOCATED; - + /* And GNU code determines whether or not to get register information by passing null for the REGS argument to re_match, etc., not by setting no_sub. */ bufp->no_sub = 0; - + /* Match anchors at newline. */ bufp->newline_anchor = 1; - + ret = regex_compile (pattern, length, re_syntax_options, bufp); return re_error_msg(int) ret; -} +}  /* Entry points compatible with 4.2 BSD regex library. We don't define them if this is an Emacs or POSIX compilation. */ @@ -4509,7 +4506,7 @@ const char *s; { reg_errcode_t ret; - + if (!s) { if (!re_comp_buf.buffer) @@ -4536,7 +4533,7 @@ re_comp_buf.newline_anchor = 1; ret = regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf); - + /* Yes, we're discarding `const' here. */ return (char *) re_error_msg(int) ret; } @@ -4591,7 +4588,7 @@ int regcomp (preg, pattern, cflags) regex_t *preg; - const char *pattern; + const char *pattern; int cflags; { reg_errcode_t ret; @@ -4602,17 +4599,17 @@ /* regex_compile will allocate the space for the compiled pattern. */ preg->buffer = 0; preg->allocated = 0; - + /* Don't bother to use a fastmap when searching. This simplifies the REG_NEWLINE case: if we used a fastmap, we'd have to put all the characters after newlines into the fastmap. This way, we just try every character. */ preg->fastmap = 0; - + if (cflags & REG_ICASE) { unsigned i; - + preg->translate = (char *) malloc (CHAR_SET_SIZE); if (preg->translate == NULL) return (int) REG_ESPACE; @@ -4637,38 +4634,38 @@ preg->no_sub = !!(cflags & REG_NOSUB); - /* POSIX says a null character in the pattern terminates it, so we + /* POSIX says a null character in the pattern terminates it, so we can use strlen here in compiling the pattern. */ ret = regex_compile (pattern, strlen (pattern), syntax, preg); - + /* POSIX doesn't distinguish between an unmatched open-group and an unmatched close-group: both are REG_EPAREN. */ if (ret == REG_ERPAREN) ret = REG_EPAREN; - + return (int) ret; } /* regexec searches for a given pattern, specified by PREG, in the string STRING. - + If NMATCH is zero or REG_NOSUB was set in the cflags argument to `regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at least NMATCH elements, and we set them to the offsets of the corresponding matched substrings. - + EFLAGS specifies `execution flags' which affect matching: if REG_NOTBOL is set, then ^ does not match at the beginning of the string; if REG_NOTEOL is set, then $ does not match at the end. - + We return 0 if we find a match and REG_NOMATCH if not. */ int regexec (preg, string, nmatch, pmatch, eflags) const regex_t *preg; - const char *string; - size_t nmatch; - regmatch_t pmatch; + const char *string; + size_t nmatch; + regmatch_t pmatch; int eflags; { int ret; @@ -4678,15 +4675,15 @@ boolean want_reg_info = !preg->no_sub && nmatch > 0; private_preg = *preg; - + private_preg.not_bol = !!(eflags & REG_NOTBOL); private_preg.not_eol = !!(eflags & REG_NOTEOL); - + /* The user has told us exactly how many registers to return information about, via `nmatch'. We have to pass that on to the matching routines. */ private_preg.regs_allocated = REGS_FIXED; - + if (want_reg_info) { regs.num_regs = nmatch; @@ -4700,7 +4697,7 @@ ret = re_search (&private_preg, string, len, /* start: */ 0, /* range: */ len, want_reg_info ? ®s : (struct re_registers *) 0); - + /* Copy the register information to the POSIX structure. */ if (want_reg_info) { @@ -4741,8 +4738,8 @@ (void) unused_preg; if (errcode < 0 - || UNSIGNED(errcode) >= G_N_ELEMENTS(re_error_msg)) - /* Only error codes returned by the rest of the code should be passed + || UNSIGNED(errcode) >= N_ITEMS(re_error_msg)) + /* Only error codes returned by the rest of the code should be passed to this routine. If we are given anything else, or if other regex code generates an invalid error code, then the program has a bug. Dump core so we can fix it. */ @@ -4756,7 +4753,7 @@ msg = "Success"; msg_size = strlen (msg) + 1; /* Includes the null. */ - + if (errbuf_size != 0) { if (msg_size > errbuf_size) @@ -4781,7 +4778,7 @@ if (preg->buffer != NULL) free (preg->buffer); preg->buffer = NULL; - + preg->allocated = 0; preg->used = 0;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/regex.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/regex.h
Changed
@@ -82,7 +82,7 @@ #define RE_BACKSLASH_ESCAPE_IN_LISTS (1) /* If this bit is not set, then + and ? are operators, and \+ and \? are - literals. + literals. If set, then \+ and \? are operators and + and ? are literals. */ #define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1) @@ -98,7 +98,7 @@ ^ is an anchor if it is at the beginning of a regular expression or after an open-group or an alternation operator; $ is an anchor if it is at the end of a regular expression, or - before a close-group or an alternation operator. + before a close-group or an alternation operator. This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because POSIX draft 11.2 says that * etc. in leading positions is undefined. @@ -109,7 +109,7 @@ /* If this bit is set, then special characters are always special regardless of where they are in the pattern. If this bit is not set, then special characters are special only in - some contexts; otherwise they are ordinary. Specifically, + some contexts; otherwise they are ordinary. Specifically, * + ? and intervals are only special when not after the beginning, open-group, or alternation operator. */ #define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1) @@ -131,7 +131,7 @@ #define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1) /* If this bit is set, either \{...\} or {...} defines an - interval, depending on RE_NO_BK_BRACES. + interval, depending on RE_NO_BK_BRACES. If not set, \{, \}, {, and } are literals. */ #define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1) @@ -156,7 +156,7 @@ If not set, then \<digit> is a back-reference. */ #define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1) -/* If this bit is set, then | is an alternation operator, and \| is literal. +/* If this bit is set, then | is an alternation operator, and \| is literal. If not set, then \| is an alternation operator, and | is literal. */ #define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1) @@ -178,7 +178,7 @@  /* Define combinations of the above bits for the standard possibilities. (The comments delimit what gets put into the Texinfo file, so - don't delete them!) */ + don't delete them!) */ /* begin syntaxes */ #define RE_SYNTAX_EMACS 0 @@ -245,7 +245,7 @@ #ifdef RE_DUP_MAX #undef RE_DUP_MAX #endif -#define RE_DUP_MAX ((1 << 15) - 1) +#define RE_DUP_MAX ((1 << 15) - 1) /* POSIX `cflags' bits (i.e., information for `regcomp'). */ @@ -257,7 +257,7 @@ /* If this bit is set, then ignore case when matching. If not set, then case is significant. */ #define REG_ICASE (REG_EXTENDED << 1) - + /* If this bit is set, then anchors do not match at newline characters in the string. If not set, then anchors do match at newlines. */ @@ -296,7 +296,7 @@ REG_EESCAPE, /* Trailing backslash. */ REG_ESUBREG, /* Invalid back reference. */ REG_EBRACK, /* Unmatched left bracket. */ - REG_EPAREN, /* Parenthesis imbalance. */ + REG_EPAREN, /* Parenthesis imbalance. */ REG_EBRACE, /* Unmatched \{. */ REG_BADBR, /* Invalid contents of \{\}. */ REG_ERANGE, /* Invalid range end. */ @@ -327,7 +327,7 @@ unsigned long allocated; /* Number of bytes actually used in `buffer'. */ - unsigned long used; + unsigned long used; /* Syntax setting with which the pattern was compiled. */ reg_syntax_t syntax; @@ -371,7 +371,7 @@ unsigned no_sub : 1; /* If set, a beginning-of-line anchor doesn't match at the - beginning of the string. */ + beginning of the string. */ unsigned not_bol : 1; /* Similarly for an end-of-line anchor. */ @@ -483,7 +483,7 @@ /* Relates to `re_match' as `re_search_2' relates to `re_search'. */ -extern int re_match_2 +extern int re_match_2 _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, int length1, const char *string2, int length2, int start, struct re_registers *regs, int stop));
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/registers.h
Added
@@ -0,0 +1,92 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Machine register access. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _registers_h_ +#define _registers_h_ + +#include "config.h" + +#ifdef I_UCONTEXT +#include <ucontext.h> +#endif +#ifdef I_SYS_UCONTEXT +#include <sys/ucontext.h> +#endif + +#if defined(HAS_UCONTEXT_MCONTEXT_GREGS) || defined(HAS_UCONTEXT_MCONTEXT) +#define USE_UC_MCONTEXT +#endif + +/* + * Accessing the machine registers is inherently non-portable. + * + * The REGISTER_COUNT macro defines the amount of registers we see. + * The REGISTER_BASE macro lets us access the registers as an array of ulongs. + * The REGISTER_VALUE macro lets us access a register by index. + * + * When the gregs array is present in the uc_mcontext field, the access + * is straightforward. + * + * When there is no gregs array, assume the uc_mcontext field is a structure + * containing registers whose size will be that of the "unsigned long" type. + * This is a reasonable assumption which should prove correct on many systems. + * + * The uc_mcontext field could also be a pointer as on OSX, which we'll detect + * when REGISTER_COUNT ends up being 1, in which case we're hosed. + */ + +#if defined(HAS_UCONTEXT_MCONTEXT_GREGS) + +#define REGISTER_COUNT(u) N_ITEMS((u)->uc_mcontext.gregs) +#define REGISTER_BASE(u) ((ulong *) (u)->uc_mcontext.gregs) +#define REGISTER_VALUE(u,x) ((ulong) (u)->uc_mcontext.gregsx) + +#elif defined(HAS_UCONTEXT_MCONTEXT) + +#define REGISTER_COUNT(u) (sizeof((u)->uc_mcontext) / sizeof(ulong)) +#define REGISTER_BASE(u) ((ulong *) &(u)->uc_mcontext) +#define REGISTER_VALUE(u,x) ((ulong *) &(u)->uc_mcontext)x + +#else /* !HAS_UCONTEXT_MCONTEXT_GREGS && !HAS_UCONTEXT_MCONTEXT */ + +#include "log.h" /* For s_error_expr() */ +#define REGISTER_COUNT(u) 0 +#define REGISTER_BASE(u) NULL +#define REGISTER_VALUE(u,x) \ + (s_error_expr("%s: cannot access machine registers", G_STRFUNC), (x)) + +#endif /* HAS_UCONTEXT_MCONTEXT_GREGS || HAS_UCONTEXT_MCONTEXT */ + +#endif /* _registers_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/ripening.c
Added
@@ -0,0 +1,735 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Hash table with ripening key/value pairs, each entry having a different + * maturation (expiration) time before being removed from the table. + * + * The global free routine configured in the table gives the application a + * hook to be able to process items when they fall off the table (either by + * reaching their maturation time, or by being explicitly removed). + * + * This global freeing hook can be superseded when an explicit removal is + * being done, to post-process the key/value pair differently than when the + * entry simply matures and falls off the table. + * + * @author Raphael Manfredi + * @date 2014 + */ + +#include "common.h" + +#include "ripening.h" +#include "cq.h" +#include "erbtree.h" +#include "hashing.h" +#include "hikset.h" +#include "misc.h" +#include "mutex.h" +#include "tm.h" +#include "walloc.h" + +#include "override.h" /* Must be the last header included */ + +enum ripening_magic { RIPENING_MAGIC = 0x0e42bcf9 }; + +/** + * A description of the free routine to apply to a removed value. + * + * The free routine is of course a way to free-up the dynamically allocated + * keys and values but it is also a hook for the application to know that the + * value is being removed from the table, to possibly tirgger processing. + * + * As such, it is possible to override the default free routine when an + * explicit removal occurs, or just the argument that is passed to the free + * routine, if any was configured at the table creation time. + * + * Only one of `kvfree' or `kvfree_d' must be set to non-NULL. The `arg' + * value is ignored if `kvfree_d' is NULL. + */ +struct ripening_hook { + free_keyval_fn_t kvfree; /**< Freeing callback for key/value pairs */ + free_keyval_data_fn_t kvfree_d; /**< Freeing callback for key/value pairs */ + void *arg; /**< Argument to pass to `kvfree_d' */ +}; + +/** + * The ripening container. + * + * The hash set is the central piece, but we also have a freeing callback, + * since the entries expire automatically after some time has elapsed and + * a red-black tree to sort out entries by expiration time. + */ +struct ripening { + enum ripening_magic magic; /**< Magic number */ + hikset_t *table; /**< The table holding values */ + cevent_t *expire_ev; /**< The installed expiration event */ + mutex_t *lock; /**< Optional thread-safe lock */ + struct ripening_hook *hook; /**< Global freeing hooks defined */ + erbtree_t tree; /**< Items in table, by increasing time */ +}; + +static void +ripening_check(const ripening_table_t * const rt) +{ + g_assert(rt != NULL); + g_assert(RIPENING_MAGIC == rt->magic); +} + +/** + * We wrap the values we insert in the table, since each value must keep + * track of its expiration time. + * + * Because the structure (inserted in the table) refers to the key, we can use + * a hikset instead of a hash table, which saves a pointer for each entry. + * + * All the items are also tracked in a red-back tree, sorted by increasing + * expiration time (the time by which the items "fall off" the structure). + */ +struct ripening_value { + void *value; /**< The value they inserted in the table */ + void *key; /**< The associated key object */ + time_t expire; /**< Maturation time */ + rbnode_t node; /**< Embedded node to sort items */ +}; + +/* + * Thread-safe synchronization support. + */ + +#define ripening_synchronize(a) G_STMT_START { \ + if G_UNLIKELY((a)->lock != NULL) { \ + ripening_table_t *wa = deconstify_pointer(a); \ + mutex_lock(wa->lock); \ + } \ +} G_STMT_END + +#define ripening_unsynchronize(a) G_STMT_START { \ + if G_UNLIKELY((a)->lock != NULL) { \ + ripening_table_t *wa = deconstify_pointer(a); \ + mutex_unlock(wa->lock); \ + } \ +} G_STMT_END + +#define ripening_return(a, v) G_STMT_START { \ + if G_UNLIKELY((a)->lock != NULL) \ + mutex_unlock((a)->lock); \ + return v; \ +} G_STMT_END + +#define ripening_return_void(a) G_STMT_START { \ + if G_UNLIKELY((a)->lock != NULL) \ + mutex_unlock((a)->lock); \ + return; \ +} G_STMT_END + +#define assert_ripening_locked(a) G_STMT_START { \ + if G_UNLIKELY((a)->lock != NULL) \ + assert_mutex_is_owned((a)->lock); \ +} G_STMT_END + +/** + * Free keys and values from the ripening table, using specified freeing hooks. + */ +static void +ripening_free_hook(void *value, void *data, const struct ripening_hook *hook) +{ + struct ripening_value *rval = value; + ripening_table_t *rt = data; + + ripening_check(rt); + assert_ripening_locked(rt); + + /* + * Remove the entry from the red-black tree before invoking the + * freeing hooks: the post-processing done in that routine could + * lead to re-entry into ripening_insert() hence we need to be in + * a clean state. + */ + + erbtree_remove(&rt->tree, &rval->node); + + if (NULL == hook) + hook = rt->hook; + + if (hook != NULL) { + if (hook->kvfree != NULL) + (*hook->kvfree)(rval->key, rval->value); + else if (hook->kvfree_d != NULL) + (*hook->kvfree_d)(rval->key, rval->value, hook->arg); + } + + WFREE(rval); +} + +/** + * Free keys and values from the ripening table, using default freeing hooks. + */ +static void +ripening_free(void *value, void *data) +{ + return ripening_free_hook(value, data, NULL); +} + +/** + * Garbage collecting event, collecting mature (expired) items. + */ +static void +ripening_gc(cqueue_t *cq, void *obj) +{ + ripening_table_t *rt = obj; + time_t now = tm_time(); + struct ripening_value *rval; + + ripening_check(rt); + + ripening_synchronize(rt); + + g_assert(erbtree_count(&rt->tree) == hikset_count(rt->table)); + + cq_zero(cq, &rt->expire_ev); + + while (NULL != (rval = erbtree_head(&rt->tree))) { + if (delta_time(now, rval->expire) < 0) + break; /* Tree is sorted, oldest items first */ + hikset_remove(rt->table, rval->key); + ripening_free(rval, rt); + } + + /* + * If at leat one item remains in the tree, compute the remaining time + * until that item expires and create a corresponding callout event. + */ + + if (rval != NULL) { + time_delta_t delta = delta_time(rval->expire, now); + g_assert(delta > 0); /* Checked in the above loop */ + + /* + * Because ripening_free() above may cause a recursion via the freeing + * hooks into ripening_insert(), we may have an expiration callback + * configured already. + */ + + if (NULL == rt->expire_ev) + rt->expire_ev = cq_main_insert(delta * 1000, ripening_gc, rt); + else + cq_resched(rt->expire_ev, delta * 1000); + } + + g_assert(erbtree_count(&rt->tree) == hikset_count(rt->table)); + + ripening_return_void(rt); +} + +/** + * Comparison routine for items in the red-black tree. + * + * This sorts items by increasing expiration time, and since we cannot have + * identical items in the red-black tree, compare key pointers if the expiration + * time matches. + */ +static int +ripening_cmp(const void *a, const void *b) +{ + const struct ripening_value *ra = a, *rb = b; + + if G_UNLIKELY(ra->expire == rb->expire) { + /* Artificial ordering of items: keys CANNOT be equal */ + return ptr_cmp(ra->key, rb->key); + } else { + return CMP(ra->expire, rb->expire); + } +} + +/** + * Create new ripening container, where keys/values expire and need to be freed + * automatically when they fall off the structure or are explicitly removed. + * + * @param hash the hashing function for the keys in the hash table + * @param eq the equality function for the keys in the hash table + * @param hook the freeing hooks to use by default + * + * @return opaque handle to the container. + */ +static ripening_table_t * +ripening_make_hook(hash_fn_t hash, eq_fn_t eq, struct ripening_hook *hook) +{ + ripening_table_t *rt; + + WALLOC0(rt); + rt->magic = RIPENING_MAGIC; + rt->hook = hook; /* Can be NULL */ + rt->table = hikset_create_any( + offsetof(struct ripening_value, key), + NULL == hash ? pointer_hash : hash, eq); + erbtree_init(&rt->tree, ripening_cmp, + offsetof(struct ripening_value, node)); + + ripening_check(rt); + return rt; +} + +/** + * Create new ripening container, where keys/values expire and need to be freed + * automatically when they fall off the structure or are explicitly removed. + * + * Values are either integers (cast to pointers) or refer to real objects, but + * the associated free routine is the same for all the inserted items. + * + * Contrary to an "aging table" which will remove objects after a fixed period + * of time, a ripening table has a per-item expiration time (the maturity). + * + * @param hash the hashing function for the keys in the hash table + * @param eq the equality function for the keys in the hash table + * @param kvfree the key/value pair freeing callback, NULL if none. + * + * @return opaque handle to the container. + */ +ripening_table_t * +ripening_make(hash_fn_t hash, eq_fn_t eq, free_keyval_fn_t kvfree) +{ + struct ripening_hook *hook = NULL; + + if (kvfree != NULL) { + WALLOC0(hook); + hook->kvfree = kvfree; + } + + return ripening_make_hook(hash, eq, hook); +} + +/** + * Create new ripening container, where keys/values expire and need to be freed + * automatically when they fall off the structure or are explicitly removed. + * + * Values are either integers (cast to pointers) or refer to real objects, but + * the associated free routine is the same for all the inserted items. + * + * Contrary to an "aging table" which will remove objects after a fixed period + * of time, a ripening table has a per-item expiration time (the maturity). + * + * The difference with ripening_make() is that the default freeing callback + * recorded takes an extra user-supplied argument. Because the freeing callback + * can be superseded at removal time, it is acceptable to have a NULL `kvfree' + * given here, to simply record the default argument, but this means that no + * callback will be invoked when items fall off the table. + * + * @param hash the hashing function for the keys in the hash table + * @param eq the equality function for the keys in the hash table + * @param kvfree the key/value pair freeing callback, NULL if none. + * @param data the default data argument to supply to the freeing routine + * + * @return opaque handle to the container. + */ +ripening_table_t * +ripening_make_data(hash_fn_t hash, eq_fn_t eq, + free_keyval_data_fn_t kvfree, void *data) +{ + struct ripening_hook *hook = NULL; + + if (kvfree != NULL) { + WALLOC0(hook); + hook->kvfree_d = kvfree; + hook->arg = data; + } + + return ripening_make_hook(hash, eq, hook); +} + +/** + * Destroy container, freeing all keys and values, and nullify pointer. + */ +void +ripening_destroy(ripening_table_t **tr_ptr) +{ + ripening_table_t *rt = *tr_ptr; + + if (rt) { + ripening_check(rt); + + ripening_synchronize(rt); + + cq_cancel(&rt->expire_ev); + hikset_foreach(rt->table, ripening_free, rt); + hikset_free_null(&rt->table); + WFREE_TYPE_NULL(rt->hook); + + if (rt->lock != NULL) { + mutex_destroy(rt->lock); + WFREE_TYPE_NULL(rt->lock); + } + + rt->magic = 0; + WFREE(rt); + *tr_ptr = NULL; + } +} + +/** + * Mark newly created ripening table as being thread-safe. + * + * This will make all external operations on the table thread-safe. + */ +void +ripening_thread_safe(ripening_table_t *rt) +{ + ripening_check(rt); + g_assert(NULL == rt->lock); + + WALLOC0(rt->lock); + mutex_init(rt->lock); +} + +/** + * Lock the ripening table to allow a sequence of operations to be atomically + * conducted. + * + * It is possible to lock the table several times as long as each locking + * is paired with a corresponding unlocking in the execution flow. + * + * The table must have been marked thread-safe already. + */ +void +ripening_lock(ripening_table_t *rt) +{ + ripening_check(rt); + g_assert_log(rt->lock != NULL, + "%s(): ripening table %p not marked thread-safe", G_STRFUNC, rt); + + mutex_lock(rt->lock); +} + +/* + * Release lock on ripening table. + * + * The table must have been marked thread-safe already and locked by the + * calling thread. + */ +void +ripening_unlock(ripening_table_t *rt) +{ + ripening_check(rt); + g_assert_log(rt->lock != NULL, + "%s(): ripening table %p not marked thread-safe", G_STRFUNC, rt); + + mutex_unlock(rt->lock); +} + +/** + * Lookup value in table. + */ +void * +ripening_lookup(const ripening_table_t *rt, const void *key) +{ + struct ripening_value *rval; + void *data; + + ripening_check(rt); + + ripening_synchronize(rt); + + rval = hikset_lookup(rt->table, key); + data = rval == NULL ? NULL : rval->value; + + ripening_return(rt, data); +} + +/** + * Return maturation timestamp, 0 if not found. + */ +time_t +ripening_time(const ripening_table_t *rt, const void *key) +{ + struct ripening_value *rval; + time_t when; + + ripening_check(rt); + + ripening_synchronize(rt); + + rval = hikset_lookup(rt->table, key); + when = NULL == rval ? 0 : rval->expire; + + ripening_return(rt, when); +} + +/** + * Remove key from the table, freeing it if we have a key free routine. + * + * @return whether key was found and subsequently removed. + */ +static bool +ripening_remove_hook(ripening_table_t *rt, const void *key, + const struct ripening_hook *hook) +{ + struct ripening_value *rval; + void *ovalue; + bool found; + + ripening_synchronize(rt); + + if (!hikset_lookup_extended(rt->table, key, &ovalue)) { + found = FALSE; + goto done; + } + + rval = ovalue; + + hikset_remove(rt->table, rval->key); + ripening_free_hook(rval, rt, hook); + + /* + * After removal, we cancel the timeout event if the set is empty, but + * we do not recompute the timeout if the set is not empty: if the value + * we removed was not the first one in the timeline, it is unnecessary, and + * if it was, we do not know whether another value will not be inserted + * before the event expires, which will recompute the proper timer. + * + * The cancellation of the timer when the set is empty is done to ensure + * the validity of the pre-condition in ripening_insert(). + */ + + if (0 == hikset_count(rt->table)) + cq_cancel(&rt->expire_ev); + + found = TRUE; + +done: + ripening_return(rt, found); +} + +/** + * Remove key from the table, freeing it if we have a key free routine. + * + * @return whether key was found and subsequently removed. + */ +bool +ripening_remove(ripening_table_t *rt, const void *key) +{ + ripening_check(rt); + + return ripening_remove_hook(rt, key, NULL); +} + +/** + * Remove key from the table, applying argument-less freeing hook to key/value. + * + * @param rt the ripening table + * @param key the key to the item that we want to remove + * @param kvfree freeing hook to inovke on the key/value pair + * + * @return whether key was found and subsequently removed. + */ +bool +ripening_remove_using(ripening_table_t *rt, + const void *key, free_keyval_fn_t kvfree) +{ + struct ripening_hook hook; + + ripening_check(rt); + + ZERO(&hook); + hook.kvfree = kvfree; + + return ripening_remove_hook(rt, key, &hook); +} + +/** + * Remove key from the table, applying specified freeing hook to key/value. + * + * @param rt the ripening table + * @param key the key to the item that we want to remove + * @param kvfree freeing hook to inovke on the key/value pair + * @param data argument to freeing hook + + * @return whether key was found and subsequently removed. + */ +bool +ripening_remove_using_data(ripening_table_t *rt, + const void *key, free_keyval_data_fn_t kvfree, void *data) +{ + struct ripening_hook hook; + + ripening_check(rt); + + ZERO(&hook); + hook.kvfree_d = kvfree; + hook.arg = data; + + return ripening_remove_hook(rt, key, &hook); +} + +/** + * Remove key from the table, applying specified freeing hook to key/value + * but using the default argument recorded at the table level, at creation time. + * If no data was recorded, use NULL as the extra freeing callback argument. + * + * @param rt the ripening table + * @param key the key to the item that we want to remove + * @param kvfree freeing hook to inovke on the key/value pair + + * @return whether key was found and subsequently removed. + */ +bool +ripening_remove_using_free(ripening_table_t *rt, + const void *key, free_keyval_data_fn_t kvfree) +{ + struct ripening_hook hook; + + ripening_check(rt); + + ZERO(&hook); + hook.kvfree_d = kvfree; + + if (rt->hook != NULL) + hook.arg = rt->hook->arg; + + return ripening_remove_hook(rt, key, &hook); +} + +/** + * Add value to the table. + * + * If it was already present, its maturation time is reset to the specified + * ripening delay. + * + * The key argument is freed immediately if there is a free routine for + * keys and the key was present in the table. + * + * The previous value is freed and replaced by the new one if there is + * an insertion conflict and the key pointers are different. + * + * @param rt the ripening table + * @param delay the ripening delay (seconds until maturation) + * @param key the key to insert + * @param value the value to insert + */ +void +ripening_insert(ripening_table_t *rt, uint delay, const void *key, void *value) +{ + bool found; + void *ovalue; + time_t now = tm_time(), old; + time_delta_t delta; + struct ripening_value *rval; + + ripening_check(rt); + + ripening_synchronize(rt); + + /* + * Compute the previous expiration time of the first value in the table. + */ + + if (rt->expire_ev != NULL) { + rval = erbtree_head(&rt->tree); + g_assert(rval != NULL); + old = rval->expire; + } else { + old = 0; + } + + found = hikset_lookup_extended(rt->table, key, &ovalue); + if (found) { + rval = ovalue; + + if (rval->key != key && rt->hook != NULL) { + const struct ripening_hook *hook = rt->hook; + + /* + * We discard the new and keep the old key instead. + * That way, we don't have to update the hash table. + */ + + if (hook->kvfree != NULL) { + (*hook->kvfree)(deconstify_pointer(key), rval->value); + } else if (hook->kvfree_d != NULL) { + (*hook->kvfree_d)( + deconstify_pointer(key), rval->value, hook->arg); + } + } + + /* + * Value existed for this key, reset its maturation time. + * + * We assume the maturation time will change, hence we blindly + * remove the node from the red-black tree to re-insert it later + * with the new time, hence at a different position. + */ + + erbtree_remove(&rt->tree, &rval->node); + rval->value = value; + } else { + WALLOC0(rval); + rval->value = value; + rval->key = deconstify_pointer(key); + hikset_insert(rt->table, rval); + } + + rval->expire = time_advance(now, delay); + erbtree_insert(&rt->tree, &rval->node); + + /* + * Set or update the timeout event. + */ + + if (0 == old || delta_time(rval->expire, old) < 0) + old = rval->expire; /* Earliest expiration time */ + + delta = delta_time(old, now); + delta = delta <= 0 ? 1 : delta * 1000; + + if (rt->expire_ev != NULL) { + if (cq_resched(rt->expire_ev, delta)) + goto done; + cq_cancel(&rt->expire_ev); /* Already expired, free event */ + } + + g_assert(NULL == rt->expire_ev); + + rt->expire_ev = cq_main_insert(delta, ripening_gc, rt); + +done: + ripening_return_void(rt); +} + +/** + * @return amount of entries held in the ripening table. + */ +size_t +ripening_count(const ripening_table_t *rt) +{ + size_t count; + + ripening_check(rt); + + ripening_synchronize(rt); + count = hikset_count(rt->table); + ripening_return(rt, count); +} + +/* vi: set ts=4: sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/ripening.h
Added
@@ -0,0 +1,74 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Hash table with ripening key/value pairs, removed automatically after + * some time has elapsed (defined for each entry, not globally for the table). + * + * @author Raphael Manfredi + * @date 2014 + */ + +#ifndef _ripening_h_ +#define _ripening_h_ + +#include "common.h" + +#include "tm.h" /* For time_delta_t */ + +typedef struct ripening ripening_table_t; + +/* + * Public interface. + */ + +ripening_table_t *ripening_make( + hash_fn_t hash, eq_fn_t eq, free_keyval_fn_t kfree); + +ripening_table_t *ripening_make_data(hash_fn_t hash, eq_fn_t eq, + free_keyval_data_fn_t kvfree, void *data); + +void ripening_destroy(ripening_table_t **); + +time_t ripening_time(const ripening_table_t *rt, const void *key); +void *ripening_lookup(const ripening_table_t *rt, const void *key); +void *ripening_lookup_revitalise(ripening_table_t *rt, const void *key); +void ripening_insert(ripening_table_t *rt, uint delay, + const void *key, void *value); +size_t ripening_count(const ripening_table_t *rt); + +bool ripening_remove(ripening_table_t *rt, const void *key); +bool ripening_remove_using(ripening_table_t *rt, + const void *key, free_keyval_fn_t kvfree); +bool ripening_remove_using_data(ripening_table_t *rt, + const void *key, free_keyval_data_fn_t kvfree, void *data); +bool ripening_remove_using_free(ripening_table_t *rt, + const void *key, free_keyval_data_fn_t kvfree); + +#endif /* _ripening_h_ */ + +/* vi: set ts=4: sw=4 cindent: */ +
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/rwlock.c
Added
@@ -0,0 +1,1481 @@ +/* + * Copyright (c) 2013, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Read-write locks. + * + * This implementation allows recursive read-write locks, and permits a reader + * to attempt the upgrade to a writer status. It is also possible to downgrade + * a write lock to a read one as well as only attempt locking (non-blocking if + * the lock cannot be acquired). + * + * No starvation is possible (either readers or writers) because as soon as + * the lock cannot be acquired, the thread is enqueued and then waiting threads + * get a chance to grab the lock in strict FIFO order: writers get exclusive + * access whilst all consecutive readers in the queue are served as soon as + * the scheduler runs them. + * + * We carefully and purposedly avoid condition variables in our implementation, + * preferring a semi busy-wait approach which gives us the necessary granularity + * for timeout notifications and deadlock prevention. This also allows the + * code to depend on less layers, leaving it at the same level as mutexes + * and therefore suitable in memory allocators or other comparable low-level + * layers. + * + * As with mutexes and spinlocks, an upper limit is set on the amount of time + * the application can wait on a lock acquisition before giving up and declaring + * that a deadlock occurred. This is of course dependent of the time a lock + * is usually kept by the application and the delay under which an application + * expects to be able to get a lock. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#include "rwlock.h" + +#include "compat_usleep.h" +#include "crash.h" +#include "gentime.h" +#include "getcpucount.h" +#include "log.h" +#include "spinlock.h" +#include "stringify.h" +#include "thread.h" + +#include "override.h" /* Must be the last header included */ + +#define RWLOCK_LOOP 100 /* Loop iterations before sleeping */ +#define RWLOCK_DELAY 200 /* Wait 200 us before looping again */ +#define RWLOCK_DEAD 32768 /* # of loops before flagging deadlock */ +#define RWLOCK_DEADMASK (RWLOCK_DEAD - 1) +#define RWLOCK_TIMEOUT 20 /* Crash after 20 seconds of inactivity */ + +enum rwlock_waiting_magic { RWLOCK_WAITING_MAGIC = 0x1d77c7ce }; + +/** + * A waiting record. + * + * This record is taken on each waiting thread's stack and links together + * all the threads in the order of arrival. + * + * To manipulate this record and its links, it is necessary to hold the lock + * on the rwlock structure. + */ +struct rwlock_waiting { + struct rwlock_waiting *next; /* Next in the queue */ + enum rwlock_waiting_magic magic;/* Magic number */ + uint8 reading; /* Set if waiting for reading */ + volatile uint8 ok; /* Set to TRUE when the lock is granted */ + uint8 stid; /* Thread small ID */ +}; + +static long rwlock_cpus; /* Amount of CPUs in the system */ +static bool rwlock_pass_through; /* Whether locks are disabled */ + +#define RWLOCK_LOCK(rw) spinlock_hidden(&(rw)->lock) +#define RWLOCK_UNLOCK(rw) spinunlock_hidden(&(rw)->lock) + +static inline void +rwlock_check(const struct rwlock * const rw) +{ + g_assert(rw != NULL); + g_assert(RWLOCK_MAGIC == rw->magic); +} + +#if defined(RWLOCK_READER_DEBUG) || defined(RWLOCK_READSPOT_DEBUG) +/** + * Record that the current thread is becoming a reader. + */ +static void +rwlock_readers_record(rwlock_t *rw, const char *file, unsigned line) +{ + rwlock_check(rw); + +#ifndef RWLOCK_READSPOT_DEBUG + (void) file; + (void) line; +#endif /* !RWLOCK_READSPOT_DEBUG */ + +#ifdef RWLOCK_READER_DEBUG + RWLOCK_LOCK(rw); + bit_array_set(rw->reading, thread_small_id()); + RWLOCK_UNLOCK(rw); +#endif /* RWLOCK_READER_DEBUG */ + +#ifdef RWLOCK_READSPOT_DEBUG + { + int stid = thread_small_id(); + + RWLOCK_LOCK(rw); + if (NULL == rw->readspotstid.file) { + rw->readspotstid.file = file; + rw->readspotstid.line = line; + } + RWLOCK_UNLOCK(rw); + } +#endif /* RWLOCK_READSPOT_DEBUG */ +} + +/** + * Clear readership of current thread when it no longer holds the read-lock. + */ +static void +rwlock_readers_clear(rwlock_t *rw) +{ + int stid = thread_small_id(); + bool held = thread_lock_holds_as(rw, THREAD_LOCK_RLOCK); + + rwlock_check(rw); + +#ifdef RWLOCK_READER_DEBUG + RWLOCK_LOCK(rw); + + if (!bit_array_get(rw->reading, stid)) { + RWLOCK_UNLOCK(rw); + s_minicarp("%s(): was expecting %s to be a reader (%s holds it) for %p", + G_STRFUNC, thread_id_name(stid), held ? "still" : "no longer", rw); + } else { + if (!held) + bit_array_clear(rw->reading, stid); + RWLOCK_UNLOCK(rw); + } +#endif /* RWLOCK_READER_DEBUG */ + +#ifdef RWLOCK_READSPOT_DEBUG + if (!held) { + RWLOCK_LOCK(rw); + rw->readspotstid.file = NULL; + rw->readspotstid.line = 0; + RWLOCK_UNLOCK(rw); + } +#endif /* RWLOCK_READSPOT_DEBUG */ +} + +/** + * Check whether thread ``n'' holds a read-lock. + */ +static bool +rwlock_readers_is_set(rwlock_t *rw, int n) +{ + bool is_set = FALSE; + + rwlock_check(rw); + + RWLOCK_LOCK(rw); + +#ifdef RWLOCK_READER_DEBUG + is_set = bit_array_get(rw->reading, n); +#endif /* RWLOCK_READER_DEBUG */ + +#ifdef RWLOCK_READSPOT_DEBUG + is_set |= rw->readspotn.file != NULL; +#endif /* RWLOCK_READSPOT_DEBUG */ + + RWLOCK_UNLOCK(rw); + return is_set; +} +#else /* !RWLOCK_READER_DEBUG && !RWLOCK_READSPOT_DEBUG */ +#define rwlock_readers_record(rw,f,l) +#define rwlock_readers_clear(rw) +#endif /* RWLOCK_READER_DEBUG || RWLOCK_READSPOT_DEBUG */ + +/** + * Enter crash mode: let all read-write locks be grabbed immediately. + */ +void G_COLD +rwlock_crash_mode(void) +{ + rwlock_pass_through = TRUE; +} + +static inline void +rwlock_read_account(const rwlock_t *rw, const char *file, unsigned line) +{ + thread_lock_got(rw, THREAD_LOCK_RLOCK, file, line, NULL); +} + +static inline void +rwlock_read_unaccount(const rwlock_t *rw) +{ + thread_lock_released(rw, THREAD_LOCK_RLOCK, NULL); +} + +static inline void +rwlock_write_account(const rwlock_t *rw, const char *file, unsigned line) +{ + thread_lock_got(rw, THREAD_LOCK_WLOCK, file, line, NULL); +} + +static inline void +rwlock_write_unaccount(const rwlock_t *rw) +{ + thread_lock_released(rw, THREAD_LOCK_WLOCK, NULL); +} + +static inline void +rwlock_upgrade_account(const rwlock_t *rw, const char *file, unsigned line) +{ + thread_lock_changed(rw, THREAD_LOCK_RLOCK, + THREAD_LOCK_WLOCK, file, line, NULL); +} + +static inline void +rwlock_downgrade_account(const rwlock_t *rw, const char *file, unsigned line) +{ + thread_lock_changed(rw, THREAD_LOCK_WLOCK, + THREAD_LOCK_RLOCK, file, line, NULL); +} + +static inline void +rwlock_waiting_init(struct rwlock_waiting *wc, uint8 reading, uint stid) +{ + wc->magic = RWLOCK_WAITING_MAGIC; + wc->next = NULL; + wc->reading = reading; + wc->ok = FALSE; + wc->stid = stid; +} + +/** + * Append waiting thread to the lock's waiting list. + */ +static inline void +rwlock_append_waiter(struct rwlock *rw, struct rwlock_waiting *wc) +{ + struct rwlock_waiting *tail = rw->wait_tail; + + /* + * When we wait for a rwlock, it is necessary to check whether we are + * running in a signal handler: indeed if we are enqueued for a write lock, + * say, and we were interrupted and the handler would need to grab the + * read lock, we would re-enqueue ourselves and deadlock. + * + * We are currently holding the lock on the rw, but it is a hidden lock, + * not preventing signals. + * + * If we are running in a signal handler (which will be happening only + * on rare occasions, hence it's OK to have more complex processing in + * that case), we will append ourselves to the waiting list only if the + * current thread is not waiting. Otherwise, we prepend ourselves right + * before any other waiting instance for this thread: indeed, if we are + * running in a signal handler, we pre-empted ourselves and we must run + * ahead of ourselves, so to speak. + * + * This will ensure we do not deadlock ourselves. + */ + + if G_UNLIKELY(NULL == tail) { + rw->wait_head = rw->wait_tail = wc; + } else { + g_assert(RWLOCK_WAITING_MAGIC == tail->magic); + + if G_LIKELY(0 == thread_sighandler_level()) { + tail->next = rw->wait_tail = wc; + } else { + uint id = thread_small_id(); + struct rwlock_waiting *w; + + /* Hah, running in a signal handler, be careful! */ + + w = rw->wait_head; + + g_assert(RWLOCK_WAITING_MAGIC == w->magic); + + if (id == w->stid) { + /* Prepend `wc' to the list */ + wc->next = w; + rw->wait_head = wc; + } else { + struct rwlock_waiting *wnext; + + for(;; w = wnext) { + wnext = w->next; + if (NULL == wnext) { + /* Append `wc' to the list */ + tail->next = rw->wait_tail = wc; + break; + } else { + g_assert(RWLOCK_WAITING_MAGIC == wnext->magic); + + if (id == wnext->stid) { + /* Insert `wc' between `w' and `wnext` */ + wc->next = wnext; + w->next = wc; + break; + } + } + } + } + } + } +} + +/** + * Add read-waiting record for the current thread to the lock. + * + * The rwlock MUST be locked when calling this routine. + */ +static inline void +rwlock_add_read_waiter(struct rwlock *rw, struct rwlock_waiting *wc, uint stid) +{ + G_PREFETCH_W(&rw->wait_tail); + rwlock_waiting_init(wc, TRUE, stid); + rwlock_append_waiter(rw, wc); + rw->waiters++; +} + +/** + * Add write-waiting record for the current thread to the lock. + * + * The rwlock MUST be locked when calling this routine. + */ +static inline void +rwlock_add_write_waiter(struct rwlock *rw, struct rwlock_waiting *wc, uint stid) +{ + G_PREFETCH_W(&rw->wait_tail); + rwlock_waiting_init(wc, FALSE, stid); + rwlock_append_waiter(rw, wc); + rw->waiters++; + rw->write_waiters++; +} + +/** + * Grant the lock to the next waiter. + * + * If the first waiter is for a read-lock, we dequeue all the consecutive + * read waiters. Otherwise we dequeue one writer. + * + * The rwlock MUST be locked when calling this routine. + */ +static inline void +rwlock_grant_waiter(struct rwlock *rw) +{ + struct rwlock_waiting *wc = rw->wait_head; + uint8 volatile *ok; + + g_assert(wc != NULL); + g_assert(RWLOCK_WAITING_MAGIC == wc->magic); + + /* + * The wc->ok field is read without the lock by the waiting threads, so + * it must be set to TRUE only when all the fields are consistent, in + * particular the reader/writer counts in the rwlock for assertions. + * + * Since the waiting context is on the stack, we cannot refer to it after + * setting wc->ok to TRUE. + */ + + G_PREFETCH_R(&wc->next); + G_PREFETCH_W(&rw->wait_head); + G_PREFETCH_W(&rw->wait_tail); + + ok = &wc->ok; /* Before we lose its address */ + rw->waiters--; + + if G_LIKELY(wc->reading) { + rw->readers++; + wc = wc->next; + g_assert(NULL == wc || RWLOCK_WAITING_MAGIC == wc->magic); + *ok = TRUE; /* Wakes up thread */ + while (wc != NULL && wc->reading) { + ok = &wc->ok; + wc = wc->next; + g_assert(NULL == wc || RWLOCK_WAITING_MAGIC == wc->magic); + G_PREFETCH_R(&wc->next); + rw->readers++; + rw->waiters--; + *ok = TRUE; /* Wakes up thread */ + } + } else { + rw->writers++; + rw->write_waiters--; + g_assert(RWLOCK_WFREE == rw->owner); + rw->owner = wc->stid; + wc = wc->next; + g_assert(NULL == wc || RWLOCK_WAITING_MAGIC == wc->magic); + *ok = TRUE; /* Wakes up thread */ + } + + rw->wait_head = wc; + if G_UNLIKELY(NULL == wc) + rw->wait_tail = NULL; +} + +/** + * Check whether there are reading waiters next. + * + * @return TRUE if there are waiters and the first to serve is for reading. + */ +static inline bool +rwlock_waiters_for_read(const rwlock_t *rw) +{ + struct rwlock_waiting *wc = rw->wait_head; + + return NULL == wc || wc->reading; +} + +/** + * Warn about possible deadlock condition. + * + * Don't inline to provide a suitable breakpoint. + */ +static NO_INLINE void G_COLD +rwlock_deadlock(const rwlock_t *rw, bool reading, unsigned count, + const char *file, unsigned line) +{ + rwlock_check(rw); + + s_minicarp("possible deadlock #%u on rwlock (%c) %p (r:%u w:%u q:%u+%u)" + " at %s:%u", + count, reading ? 'R' : 'W', rw, rw->readers, rw->writers, + rw->waiters - rw->write_waiters, rw->write_waiters, file, line); +} + +/* + * Dump the lock's waiting queue. + */ +static void +rwlock_wait_queue_dump(const rwlock_t *rw) +{ + const struct rwlock_waiting *wc = rw->wait_head; + + /* + * This routine can be called during crashes, use raw logging. + */ + + if (wc != NULL) { + s_rawinfo("waiting queue for rwlock %p (%u item%s):", + rw, rw->waiters, plural(rw->waiters)); + } else { + s_rawwarn("waiting queue for rwlock %p is empty?", rw); + } + + if (RWLOCK_WFREE != rw->owner) { + s_rawinfo("(rwlock %p write-locked by %s)", + rw, thread_safe_id_name(rw->owner)); + } + +#if defined(RWLOCK_READER_DEBUG) || defined(RWLOCK_READSPOT_DEBUG) + { + int i; + uint readers; + + for (i = 0, readers = 0; i < THREAD_MAX; i++) { + if (rwlock_readers_is_set(deconstify_pointer(rw), i)) { + readers++; +#ifdef RWLOCK_READSPOT_DEBUG + s_rawinfo("(rwlock %p read-locked by %s from %s:%u)", + rw, thread_safe_id_name(i), + rw->readspoti.file, rw->readspoti.line); +#else /* !RWLOCK_READSPOT_DEBUG */ + s_rawinfo("(rwlock %p read-locked by %s)", + rw, thread_safe_id_name(i)); +#endif /* RWLOCK_READSPOT_DEBUG */ + } + } + + if (readers != rw->readers) { + s_rawwarn("bad reader count for rwlock %p (has %u, expected %u)", + rw, rw->readers, readers); + } + } +#endif /* RWLOCK_READER_DEBUG || RWLOCK_READSPOT_DEBUG */ + + while (wc != NULL) { + if (RWLOCK_WAITING_MAGIC != wc->magic) { + s_rawwarn("corrupted waiting queue for rwlock %p", rw); + return; + } + s_rawinfo("%s %s %s-lock %p", + thread_safe_id_name(wc->stid), + wc->ok ? "was granted" : "waiting for", + wc->reading ? "read" : "write", rw); + wc = wc->next; + } +} + +/** + * Abort on deadlock condition. + * + * Don't inline to provide a suitable breakpoint. + */ +static NO_INLINE void G_COLD +rwlock_deadlocked(const rwlock_t *rw, bool reading, unsigned elapsed, + const char *file, unsigned line) +{ + s_rawwarn("deadlock on rwlock (%c) %p (r:%u w:%u q:%u+%u) at %s:%u", + reading ? 'R' : 'W', rw, + rw->readers, rw->writers, + rw->waiters - rw->write_waiters, rw->write_waiters, + file, line); + + atomic_mb(); + rwlock_check(rw); + + crash_deadlocked(file, line); /* Will not return if concurrent call */ + rwlock_wait_queue_dump(rw); + thread_lock_deadlock(rw); + + s_error("deadlocked on rwlock (%c) %p (after %u secs) at %s:%u", + reading ? 'R' : 'W', rw, elapsed, file, line); +} + +/** + * Perform a semi-busy wait until our waiting predicate becomes TRUE. + * + * A read-write lock should be held for a "small" period of time, hence + * the cost of having to do a rather busy wait has to be mitigated by the + * fact that contention should not last for very long and most of the time + * the lock will be released before we have to even go to sleep. + * + * @param rw the read-write lock we're trying to acquire + * @param reading whether we're read or write locking (for logging) + * @param predicate the predicate function to test + * @param arg the predicate argument to pass + * @param file file where lock is being grabbed from + * @param line line where lock is being grabbed from + */ +static void +rwlock_wait(const rwlock_t *rw, bool reading, + bool (*predicate)(void *), void *arg, const char *file, unsigned line) +{ + unsigned i; + gentime_t start = GENTIME_ZERO; + int loops = RWLOCK_LOOP; + const void *element = NULL; + const void *head; + + rwlock_check(rw); + + /* + * This routine is only called when there is a lock contention, and + * therefore it is not on the fast locking path. We can therefore + * afford to conduct more extended checks. + */ + + if G_UNLIKELY(0 == rwlock_cpus) + rwlock_cpus = getcpucount(); + + thread_lock_contention(reading ? THREAD_LOCK_RLOCK : THREAD_LOCK_WLOCK); + + /* + * When running mono-threaded, having to loop means we're deadlocked + * already, so immediately flag it. + */ + + if (thread_is_single()) + rwlock_deadlocked(rw, reading, 0, file, line); + +#ifdef HAS_SCHED_YIELD + if (1 == rwlock_cpus) + loops /= 10; +#endif + + /* + * We're using the head of the waiting queue on the lock to determine + * whether there is still application activity, for deadlock detection + * purposes. We don't want to flag a deadlock whilst there is movement + * on the waiting queue because it means some threads (ahead of us in + * the queue) are working and we just have to be patient. + * --RAM, 2016-01-28 + */ + + head = rw->wait_head; + + for (i = 1; /* empty */; i++) { + int j; + + for (j = 0; j < loops; j++) { + if G_UNLIKELY(RWLOCK_MAGIC != rw->magic) { + s_error("rwlock %p %s whilst waiting for %s with %s(), " + "at attempt #%u", rw, + RWLOCK_DESTROYED == rw->magic ? "destroyed" : "corrupted", + reading ? "read permission" : "write permission", + stacktrace_function_name(predicate), i); + } + + /* + * Test the predicate, exiting the wait loop when it becomes TRUE. + */ + + if G_UNLIKELY((*predicate)(arg)) { +#ifdef SPINLOCK_DEBUG + if (i >= RWLOCK_DEAD) { + s_miniinfo("predicate %s() became true for rwlock (%c) %p " + "after %u attempts", + stacktrace_function_name(predicate), + reading ? 'R' : 'W', rw, i); + } +#endif /* SPINLOCK_DEBUG */ + if G_UNLIKELY(element != NULL) + thread_lock_waiting_done(element, rw); + return; + } + if (1 == rwlock_cpus) + thread_yield(); + } + + /* + * We're about to sleep, hence we were not able to quickly grab the + * lock during our earlier spinning. We can therefore afford more + * expensive checks now, and in particular look at whether we should + * not suspend ourselves. + * + * We were not able to exit successfully after a few busy loops, we + * are now going to further delay the process by relinquishing the + * CPU for that thread and letting the kernel handle other threads. + * + * We must not wait too long, ever, because we need to continue quickly + * as soon as the predicate becomes TRUE: there may be others waiting + * in the line and the longer we take to exit after the conditions are + * there, the greater the chance of funnelling the application. + * + * Since there is no signal sent to indicate that we need to re- + * evaluate the predicate, polling is the only option. + * + * Note that tm_time_exact() will do a thread_check_suspended(). + */ + + if G_UNLIKELY(0 == (i & RWLOCK_DEADMASK)) + rwlock_deadlock(rw, reading, i / RWLOCK_DEAD, file, line); + + if G_UNLIKELY(gentime_is_zero(start)) { + g_assert(NULL == element); + start = gentime_now_exact(); + element = thread_lock_waiting_element(rw, + reading ? THREAD_LOCK_RLOCK : THREAD_LOCK_WLOCK, + file, line); + } else { + time_delta_t d; + + /* + * Reset the waiting start time whenever we witness movement on the + * waiting queue, meaning we're not completely deadlocked yet. + */ + + if (head != rw->wait_head) { + head = rw->wait_head; + start = gentime_now_exact(); + } + + d = gentime_diff(gentime_now_exact(), start); + + if G_UNLIKELY(d > RWLOCK_TIMEOUT) + rwlock_deadlocked(rw, reading, (unsigned) d, file, line); + } + + /* + * During the early loops, simply relinquish the CPU without imposing + * any particular delay. The thread will be rescheduled as soon as + * possible by the kernel. After a while, impose at least RWLOCK_DELAY + * milliseconds before rescheduling. + */ + + if (i < RWLOCK_LOOP) + thread_yield(); + else + compat_usleep_nocancel(RWLOCK_DELAY); + } +} + +static bool +rwlock_lock_granted(void *p) +{ + struct rwlock_waiting *wc = p; + + g_assert(RWLOCK_WAITING_MAGIC == wc->magic); + + /* + * Have we reached our turn in the wait queue? + * + * Because wc->ok is updated within a spinlock critical section, there + * is no need to issue a memory (read) barrier here, the data was already + * synchronized by the release of the lock. + */ + + if (wc->ok) { + wc->magic = 0; /* Structure is on the stack, will become invalid */ + return TRUE; + } + + /* + * In pass-through mode, we're crashing, so check whether we were suspended + * to halt concurrent threads as soon as possible since running without + * locks is unsafe. + */ + + if G_UNLIKELY(rwlock_pass_through) { + thread_check_suspended(); + wc->magic = 0; + return TRUE; + } + + return FALSE; +} + +/** + * Wait until the lock can serve our waiting ticket. + * + * @param rw the read-write lock we're trying to acquire + * @param wc the waiting context + * @param file file where lock is being grabbed from + * @param line line where lock is being grabbed from + */ +static inline void +rwlock_wait_grant(const rwlock_t *rw, struct rwlock_waiting *wc, + const char *file, unsigned line) +{ + rwlock_wait(rw, wc->reading, rwlock_lock_granted, wc, file, line); +} + +struct rwlock_readers_wait { + const rwlock_t *rw; + uint16 count; +}; + +/** + * Is the readers count down to the value we're expecting? + */ +static bool +rwlock_readers_downto(void *p) +{ + struct rwlock_readers_wait *arg = p; + + /* + * Note the equality test: this is not a comparison for a + * threshold, it is an absolute value we're waiting for. + * + * Since the thread stuck in the loop has acquired the write + * lock, no further readers can come in and therefore we shall + * eventually get out. + * + * Because rw->readers is updated within a spinlock critical + * section, there is no need to issue a memory (read) barrier + * here, the data was already synchronized by the release of + * the lock. + */ + + if (arg->count == arg->rw->readers) + return TRUE; + + if G_UNLIKELY(rwlock_pass_through) { + thread_check_suspended(); + return TRUE; + } + + return FALSE; +} + +/** + * Wait until the readers count reaches the specified amount. + */ +static void +rwlock_wait_readers(const rwlock_t *rw, uint16 count, + const char *file, unsigned line) +{ + struct rwlock_readers_wait args; + + args.rw = rw; + args.count = count; + + rwlock_wait(rw, FALSE, rwlock_readers_downto, &args, file, line); +} + +/** + * Initialize a non-static read-write lock. + */ +void +rwlock_init(rwlock_t *rw) +{ + g_assert(rw != NULL); + + /* Make sure the "owner" field is large enough for all our threads */ + STATIC_ASSERT(RWLOCK_WFREE >= THREAD_MAX); + STATIC_ASSERT(MAX_INT_VAL(uint8) >= THREAD_MAX); + + ZERO(rw); + rw->magic = RWLOCK_MAGIC; + rw->owner = RWLOCK_WFREE; + spinlock_init(&rw->lock); +} + +/** + * Destroy a read-write lock. + * + * It is not necessary to hold the write lock to do this, although one must be + * careful to not destroy a lock that could be used by another thread. + * + * When called with the write-lock owned, it is automatically unlocked. + * + * Any further attempt to use this lock will cause an assertion failure. + */ +void +rwlock_destroy(rwlock_t *rw) +{ + rwlock_check(rw); + + if (rw->waiters != 0 || rw->readers != 0 || rw->writers != 0) { + uint rwait = rw->writers - rw->write_waiters; + bool owned = rwlock_is_owned(rw); + bool need_carp = TRUE; + + if (owned) + need_carp = rw->waiters != 0 || rw->readers != 0 || rw->writers > 1; + + if (need_carp) { + s_carp("destroying %srwlock %p with %u reader%s, " + "%u writer%s, %u read-waiter%s and %u write-waiter%s", + owned ? "owned " : "", rw, rw->readers, plural(rw->readers), + rw->writers, plural(rw->writers), + rwait, plural(rwait), + rw->write_waiters, plural(rw->write_waiters)); + } + + if (owned) + rwlock_write_unaccount(rw); + } + + rw->magic = RWLOCK_DESTROYED; /* Now invalid */ + atomic_mb(); + spinlock_destroy(&rw->lock); +} + +/** + * Reset read-write lock. + * + * This is only intended to be used by the thread managmeent layer. + */ +void +rwlock_reset(rwlock_t *rw) +{ + rwlock_check(rw); + + ZERO(rw); + rw->magic = RWLOCK_MAGIC; + rw->owner = RWLOCK_WFREE; +} + +/** + * Is write lock owned? + */ +bool +rwlock_is_owned(const rwlock_t *rw) +{ + rwlock_check(rw); + + return thread_small_id() == rw->owner; +} + +/** + * Is lock taken by current thread (either read or write)? + */ +bool +rwlock_is_taken(const rwlock_t *rw) +{ + rwlock_check(rw); + + if (thread_lock_holds(rw)) + return TRUE; + + if G_UNLIKELY(rwlock_pass_through) { + thread_check_suspended(); + return TRUE; + } + + return FALSE; +} + +/** + * Check whether lock is used. + */ +bool +rwlock_is_used(const rwlock_t *rw) +{ + rwlock_check(rw); + + if (0 != rw->readers || 0 != rw->writers) + return TRUE; + + if G_UNLIKELY(rwlock_pass_through) { + thread_check_suspended(); + return TRUE; + } + + return FALSE; +} + +/** + * Check whether lock is free. + */ +bool +rwlock_is_free(const rwlock_t *rw) +{ + rwlock_check(rw); + + return 0 == rw->readers && 0 == rw->writers; +} + +/** + * Grab a read lock. + * + * @param rw the read-write lock + * @param file file where the lock is being grabbed from + * @param line line where the lock is being grabbed from + * @param account whether to account lock in thread + */ +void +rwlock_rgrab(rwlock_t *rw, const char *file, unsigned line, bool account) +{ + struct rwlock_waiting wc; + bool got; + unsigned stid = thread_small_id(); + + rwlock_check(rw); + + /* + * When nobody is waiting and the write lock is not used, we get our + * read lock immediately. + * + * Otherwise we enter the "wait queue". + */ + + RWLOCK_LOCK(rw); + if G_LIKELY(0 == rw->waiters && RWLOCK_WFREE == rw->owner) { + rw->readers++; + got = TRUE; + g_assert(0 == rw->writers || rwlock_pass_through); + } else if G_UNLIKELY(stid == rw->owner) { + rw->readers++; + got = TRUE; /* But we also got the write lock... */ + g_assert(rw->writers != 0); + } else if (thread_lock_holds(rw)) { + rw->readers++; /* This is a recursive read-lock */ + got = TRUE; + } else { + if G_UNLIKELY(rwlock_pass_through) { + thread_check_suspended(); + rw->readers++; + got = TRUE; + } else { + rwlock_add_read_waiter(rw, &wc, stid); + got = FALSE; + } + } + RWLOCK_UNLOCK(rw); + + if G_UNLIKELY(!got) { + rwlock_wait_grant(rw, &wc, file, line); + rwlock_readers_record(rw, file, line); + if (account) + rwlock_read_account(rw, file, line); + } else if (account) { + rwlock_readers_record(rw, file, line); + rwlock_read_account(rw, file, line); + } + + /* Ensure there are no overflows */ + + g_assert(rw->readers != 0 || rwlock_pass_through); +} + +/** + * Release a read lock. + * + * @param rw the read-write lock + */ +void +rwlock_rungrab(rwlock_t *rw) +{ + rwlock_check(rw); + + /* + * When the last read lock is gone and there are no more writers, + * grant the lock to the next waiter. + */ + + RWLOCK_LOCK(rw); + if G_UNLIKELY(1 == rw->readers-- && 0 == rw->writers && 0 != rw->waiters) + rwlock_grant_waiter(rw); + RWLOCK_UNLOCK(rw); +} + +/** + * Grab a write lock. + * + * @param rw the read-write lock + * @param file file where the lock is being grabbed from + * @param line line where the lock is being grabbed from + * @param account whether to account lock in thread + */ +void +rwlock_wgrab(rwlock_t *rw, const char *file, unsigned line, bool account) +{ + struct rwlock_waiting wc; + bool got; + unsigned stid = thread_small_id(); + + rwlock_check(rw); + + /* + * When nobody is owning the write lock we can wait for all the readers + * and then proceed. + * + * If writers and readers are already waiting, we have to wait in the line. + */ + + RWLOCK_LOCK(rw); + if G_LIKELY( + 0 == rw->waiters && 0 == rw->readers && RWLOCK_WFREE == rw->owner + ) { + rw->writers++; + rw->owner = stid; + got = TRUE; + g_assert(1 == rw->writers); + } else if G_UNLIKELY(stid == rw->owner) { + rw->writers++; + got = TRUE; + g_assert(0 != rw->writers); /* Check there are no overflows */ + } else { + if G_UNLIKELY(rwlock_pass_through) { + thread_check_suspended(); + rw->writers++; + got = TRUE; + } else { + rwlock_add_write_waiter(rw, &wc, stid); + got = FALSE; + } + } + RWLOCK_UNLOCK(rw); + + if G_UNLIKELY(!got) { + /* + * Check that we do not have the read lock at this stage or this will + * deadlock because if we are waiting we cannot free up the read lock: + * to acquire the write lock, we need all the readers to go since only + * the last one will wake us up. + * + * A thread owning the read lock and wishing to acquire a write lock + * should attempt to upgrade the lock, or release the read lock and + * reacquire a write lock. + */ + + g_assert_log(!thread_lock_holds(rw), + "attempting to get write-lock whilst still holding " + "read-lock %p (depth=%zu) at %s:%u", + rw, thread_lock_held_count(rw), file, line); + + /* + * Wait for the write lock. + */ + + rwlock_wait_grant(rw, &wc, file, line); + + if (account) + rwlock_write_account(rw, file, line); + + g_assert(1 == rw->writers || rwlock_pass_through); + } + else if (account) { + rwlock_write_account(rw, file, line); + } +} + +/** + * Release a write lock. + * + * @param rw the read-write lock + */ +void +rwlock_wungrab(rwlock_t *rw) +{ + rwlock_check(rw); + + RWLOCK_LOCK(rw); + if G_LIKELY(1 == rw->writers--) { + rw->owner = RWLOCK_WFREE; + + /* + * Now that we're releasing a write lock, wake up waiting threads. + * + * If there are no more readers, we can wake up anyone, otherwise + * we need to wake up only readers since no writer can be given the + * lock whilst there are readers. + */ + + if G_UNLIKELY(0 != rw->waiters) { + if (0 == rw->readers || rwlock_waiters_for_read(rw)) + rwlock_grant_waiter(rw); + } + } + RWLOCK_UNLOCK(rw); +} + +/** + * Grab a read lock. + * + * @param rw the read-write lock + * @param file file where we're attempting to get the lock + * @param line line where we're attempting to get the lock + */ +void +rwlock_rgrab_from(rwlock_t *rw, const char *file, unsigned line) +{ + rwlock_rgrab(rw, file, line, TRUE); +} + +/** + * Attempt to grab a read lock. + * + * @param rw the read-write lock + * @param file file where we're attempting to get the lock + * @param line line where we're attempting to get the lock + * + * @return TRUE if we obtained the lock. + */ +bool +rwlock_rgrab_try_from(rwlock_t *rw, const char *file, unsigned line) +{ + bool got; + + rwlock_check(rw); + + /* + * When nobody is waiting and owns the write lock, we get our read lock + * immediately. + */ + + RWLOCK_LOCK(rw); + if G_LIKELY(0 == rw->waiters && RWLOCK_WFREE == rw->owner) { + rw->readers++; + got = TRUE; + g_assert(0 == rw->writers || rwlock_pass_through); + g_assert(RWLOCK_WFREE == rw->owner); + } else if G_UNLIKELY(thread_small_id() == rw->owner) { + rw->readers++; + got = TRUE; /* We already got the write lock... */ + g_assert(rw->writers != 0); + } else if (thread_lock_holds(rw)) { + rw->readers++; /* This is a recursive read lock */ + got = TRUE; + } else { + if G_UNLIKELY(rwlock_pass_through) { + thread_check_suspended(); + rw->readers++; + got = TRUE; + } else { + got = FALSE; + } + } + RWLOCK_UNLOCK(rw); + + if G_LIKELY(got) { + /* Ensure there are no overflows */ + g_assert(rw->readers != 0 || rwlock_pass_through); + rwlock_readers_record(rw, file, line); + rwlock_read_account(rw, file, line); + } + + return got; +} + +/** + * Release reading lock. + * + * @param rw the read-write lock + * @param file file where we're releasing the lock + * @param line line where we're releasing the lock + */ +void +rwlock_rungrab_from(rwlock_t *rw, const char *file, unsigned line) +{ + rwlock_check(rw); + g_assert_log(thread_lock_holds_as(rw, THREAD_LOCK_RLOCK), + "attempting to release non-held read-lock %p at %s:%u", + rw, file, line); + g_assert_log(rw->readers != 0 || rwlock_pass_through, + "attempting to release read-lock %p with no readers at %s:%u", + rw, file, line); + + rwlock_rungrab(rw); + rwlock_read_unaccount(rw); + rwlock_readers_clear(rw); +} + +/** + * Get a write lock. + * + * @param rw the read-write lock + * @param file file where we're attempting to get the lock + * @param line line where we're attempting to get the lock + */ +void +rwlock_wgrab_from(rwlock_t *rw, const char *file, unsigned line) +{ + rwlock_wgrab(rw, file, line, TRUE); +} + +/** + * Attempt to grab a write lock. + * + * @param rw the read-write lock + * @param file file where we're attempting to get the lock + * @param line line where we're attempting to get the lock + * + * @return TRUE if we obtained the lock. + */ +bool +rwlock_wgrab_try_from(rwlock_t *rw, const char *file, unsigned line) +{ + bool got; + unsigned stid = thread_small_id(); + + rwlock_check(rw); + + /* + * When nobody is owning the write lock and there are no readers, + * we can get it immediately. + */ + + RWLOCK_LOCK(rw); + if G_UNLIKELY(stid == rw->owner) { + rw->writers++; + got = TRUE; + g_assert(0 != rw->writers); /* Check there are no overflows */ + } else if ( + 0 == rw->waiters && RWLOCK_WFREE == rw->owner && 0 == rw->readers + ) { + rw->writers++; + rw->owner = stid; + got = TRUE; + g_assert(1 == rw->writers); + } else { + if G_UNLIKELY(rwlock_pass_through) { + thread_check_suspended(); + rw->writers++; + rw->owner = stid; + got = TRUE; + } else { + got = FALSE; + } + } + RWLOCK_UNLOCK(rw); + + if (got) + rwlock_write_account(rw, file, line); + + return got; +} + +/** + * Release writing lock. + * + * @param rw the read-write lock + * @param file file where we're releasing the lock + * @param line line where we're releasing the lock + */ +void +rwlock_wungrab_from(rwlock_t *rw, const char *file, unsigned line) +{ + rwlock_check(rw); + g_assert_log(rw->writers != 0 || rwlock_pass_through, + "attempting to release read-lock %p with no writers at %s:%u", + rw, file, line); + g_assert_log(rwlock_is_owned(rw) || rwlock_pass_through, + "attempting to release unowned write-lock %p at %s:%u", + rw, file, line); + + rwlock_wungrab(rw); + rwlock_write_unaccount(rw); +} + +/** + * Try to upgrade a read lock into a write lock. + * + * @param rw the read-write lock + * @param file file where we're attempting to get the lock + * @param line line where we're attempting to get the lock + * + * @return TRUE if we upgraded correctly, FALSE if we cannot. + */ +bool +rwlock_upgrade_from(rwlock_t *rw, const char *file, unsigned line) +{ + bool got; + unsigned stid = thread_small_id(); + size_t count; + + rwlock_check(rw); + g_assert_log(rw->readers != 0, + "attempting to release read-lock %p with no readers at %s:%u", + rw, file, line); + + count = thread_lock_held_count(rw); + + g_assert_log(count != 0, + "attempting to upgrade non-held read-lock %p at %s:%u", + rw, file, line); + + g_assert(count <= rw->readers); + + /* + * When nobody is owning the write lock we can wait for all the readers + * but ourselves and then proceed. + * + * Note that we allow upgrading even if there are read waiters for the + * lock, because we already got the read lock: there is necessarily a + * write waiter in the queue before the readers (or the readers would not + * be queued) and we have the right of getting the write privilege due to + * our anteriority with the read lock. + */ + + count--; /* Going to remove one reader */ + + RWLOCK_LOCK(rw); + if G_LIKELY(RWLOCK_WFREE == rw->owner) { + rw->writers++; + rw->readers--; /* Upgrading last read lock */ + rw->owner = stid; + got = TRUE; + g_assert(1 == rw->writers); + } else if G_UNLIKELY(stid == rw->owner) { + rw->writers++; + rw->readers--; /* Upgrading last read lock */ + got = TRUE; + } else { + if G_UNLIKELY(rwlock_pass_through) { + thread_check_suspended(); + rw->writers++; + rw->readers--; /* Upgrading last read lock */ + rw->owner = stid; + got = TRUE; + } else { + got = FALSE; + } + } + RWLOCK_UNLOCK(rw); + + if G_UNLIKELY(!got) + return FALSE; + + /* + * We just ended a spinlock, acting as a memory barrier, so we can + * immediately check for readers. + */ + + if G_UNLIKELY(count != rw->readers) + rwlock_wait_readers(rw, count, file, line); + + /* + * Upgrading means the last instance of the lock on the stack now becomes + * a write lock, and the locking point is updated. + */ + + rwlock_upgrade_account(rw, file, line); + rwlock_readers_clear(rw); + + return TRUE; +} + +/** + * Downgrade a write lock into a read lock. + * + * This is atomically releasing the write lock and at the same time keeping + * the read lock, which is different than what would happen if the application + * were to release the write lock and get a read lock: if there is contention + * on the lock, it would get delayed between the two. + * + * @param rw the read-write lock + * @param file file where we're attempting to downgrade lock + * @param line line where we're attempting to downgrade lock + */ +void +rwlock_downgrade_from(rwlock_t *rw, const char *file, unsigned line) +{ + rwlock_check(rw); + g_assert(rw->writers != 0 || rwlock_pass_through); + g_assert_log(rwlock_is_owned(rw), + "attempting to release unowned write-lock %p at %s:%u", + rw, file, line); + + RWLOCK_LOCK(rw); + rw->readers++; /* We're now a reader */ + if G_LIKELY(1 == rw->writers--) { + rw->owner = RWLOCK_WFREE; + + /* + * Now that we're releasing a write lock, wake up waiting threads + * if they are readers since we're about to become a reader. + */ + + if G_UNLIKELY(0 != rw->waiters) { + if (rwlock_waiters_for_read(rw)) + rwlock_grant_waiter(rw); + } + } + RWLOCK_UNLOCK(rw); + + rwlock_readers_record(rw, file, line); + rwlock_downgrade_account(rw, file, line); +} + +/** + * Log write lock ownership error. + */ +static void G_NORETURN +rwlock_log_error(const rwlock_t *rw, const char *file, unsigned line) +{ + s_error("thread #%u expected to own write lock %p (%s) at %s:%u" + " (owner=%s, current=%s)", + thread_small_id(), rw, thread_lock_holds(rw) ? "read-locked" : "", + file, line, + RWLOCK_WFREE == rw->owner ? "nobody" : thread_id_name(rw->owner), + thread_name()); +} + +/** + * Complain when a write lock is not owned by the curent thread. + * + * This is a fatal error, there is no returning from this routine. + * It is invoked through the assert_rwlock_is_owned() macro. + */ +void +rwlock_not_owned(const rwlock_t *rw, const char *file, unsigned line) +{ + if G_UNLIKELY(rwlock_pass_through) { + thread_check_suspended(); + return; /* Ignore, since we can grab any lock now */ + } + + s_critical("write-lock %p not owned at %s:%u in %s", + rw, file, line, thread_name()); + + rwlock_log_error(rw, file, line); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/rwlock.h
Added
@@ -0,0 +1,201 @@ +/* + * Copyright (c) 2013, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Read-write locks. + * + * All read-write locks are tracked at the thread level to prevent deadlocks, + * allow recursive locking and become proper suspension points. + * + * Write locks are comparable to mutexes in that they are owned by one single + * thread at a time, excluding all others. The advantage of rwlocks is that + * they allow many concurrent readers, thereby minimizing the "funnel effect" + * for areas where the shared data is read often but only seldom updated. + * + * Compared to mutexes, locking and unlocking a rwlock bears more overhead but + * yields more concurrency for the critical sections that involve only reading + * of data structures. They are therefore suitable for protecting access to + * shared resources that are less frequently updated than they are being read. + * + * The locking API is made of these basic calls: + * + * rwlock_rlock() -- takes the lock for reading + * rwlock_rlock_try() -- try to take the lock for reading + * rwlock_runlock() -- release a read lock + * rwlock_wlock() -- takes the lock for writing + * rwlock_wlock_try() -- try to take the lock for writing + * rwlock_wunlock() -- release a write lock + * rwlock_upgrade() -- try to upgrade a read lock into a write one + * rwlock_downgrade() -- downgrade our write lock into a read one + * + * @author Raphael Manfredi + * @date 2013 + */ + +#ifndef _rwlock_h_ +#define _rwlock_h_ + +/** + * Set RWLOCK_READER_DEBUG to add 8 bytes per rwlock to track which thread + * holds at least one reader. + */ +#if 0 +#define RWLOCK_READER_DEBUG /* Tracks threads owning the read lock */ +#endif + +/** + * Set RWLOCK_READSPOT_DEBUG to add 1K per rwlock (on 64-bit machines) to + * track the first reading spot per thread. It can be used independently + * from RWLOCK_READER_DEBUG. + */ +#if 0 +#define RWLOCK_READSPOT_DEBUG /* Tracks first read lock point per thread */ +#endif + +#ifdef RWLOCK_READER_DEBUG +#include "bit_array.h" +#endif + +#include "spinlock.h" +#include "thread.h" /* For thread_small_id() in inlined routine */ + +enum rwlock_magic { + RWLOCK_MAGIC = 0x6b7f4524, + RWLOCK_DESTROYED = 0x4b4766cf +}; + +#define RWLOCK_WFREE 255 /* Write lock available */ + +/** + * A read-write lock. + * + * Since THREAD_MAX < 256, a single byte will be enough to track write + * lock owners and this allows the value 255 to be used to signify "nobody" + * is holding the write lock. + */ +typedef struct rwlock { + enum rwlock_magic magic; + uint8 owner; /* Small thread ID of the write lock owner */ + uint8 waiters; /* Amount of waiting readers + writers */ + uint8 write_waiters; /* Amount of waiting writers */ + uint16 readers; /* Amount of readers */ + uint16 writers; /* Write lock depth (allows recursive locks) */ + spinlock_t lock; /* The thread-safe lock for updating fields */ + void *wait_head; /* Head of the waiting list */ + void *wait_tail; /* Tail of the waiting list */ +#ifdef RWLOCK_READER_DEBUG + bit_array_t readingBIT_ARRAY_SIZE(THREAD_MAX); +#endif +#ifdef RWLOCK_READSPOT_DEBUG + struct { const char *file; unsigned line; } readspotTHREAD_MAX; +#endif +} rwlock_t; + +#ifdef RWLOCK_READER_DEBUG +#define RWLOCK_READING_INIT ,{ 0 } +#else +#define RWLOCK_READING_INIT +#endif + +#ifdef RWLOCK_READSPOT_DEBUG +#define RWLOCK_READSPOT_INIT ,{ { NULL, 0 } } +#else +#define RWLOCK_READSPOT_INIT +#endif + + +/** + * Static initialization value for a rwlock structure. + */ +#define RWLOCK_INIT \ + { RWLOCK_MAGIC, RWLOCK_WFREE, 0, 0, 0, 0, SPINLOCK_INIT, NULL, NULL \ + RWLOCK_READING_INIT \ + RWLOCK_READSPOT_INIT \ + } + +/* + * Internal. + */ + +#ifdef THREAD_SOURCE +void rwlock_rgrab(rwlock_t *rw, const char *file, unsigned line, bool account); +void rwlock_rungrab(rwlock_t *rw); +void rwlock_wgrab(rwlock_t *rw, const char *file, unsigned line, bool account); +void rwlock_wungrab(rwlock_t *rw); +void rwlock_reset(rwlock_t *rw); +#endif /* THREAD_SOURCE */ + +/* + * Protected, never call these directly. + */ + +void rwlock_rgrab_from(rwlock_t *rw, const char *file, unsigned line); +bool rwlock_rgrab_try_from(rwlock_t *rw, const char *file, unsigned line); +void rwlock_rungrab_from(rwlock_t *rw, const char *file, unsigned line); + +void rwlock_wgrab_from(rwlock_t *rw, const char *file, unsigned line); +bool rwlock_wgrab_try_from(rwlock_t *rw, const char *file, unsigned line); +void rwlock_wungrab_from(rwlock_t *rw, const char *file, unsigned line); + +bool rwlock_upgrade_from(rwlock_t *rw, const char *file, unsigned line); +void rwlock_downgrade_from(rwlock_t *rw, const char *file, unsigned line); + +/* + * Public interface. + */ + +void rwlock_init(rwlock_t *rw); +void rwlock_destroy(rwlock_t *rw); + +void rwlock_crash_mode(void); + +#define rwlock_rlock(x) rwlock_rgrab_from((x), _WHERE_, __LINE__) +#define rwlock_rlock_try(x) rwlock_rgrab_try_from((x), _WHERE_, __LINE__) +#define rwlock_runlock(x) rwlock_rungrab_from((x), _WHERE_, __LINE__) + +#define rwlock_wlock(x) rwlock_wgrab_from((x), _WHERE_, __LINE__) +#define rwlock_wlock_try(x) rwlock_wgrab_try_from((x), _WHERE_, __LINE__) +#define rwlock_wunlock(x) rwlock_wungrab_from((x), _WHERE_, __LINE__) + +#define rwlock_upgrade(x) rwlock_upgrade_from((x), _WHERE_, __LINE__) +#define rwlock_downgrade(x) rwlock_downgrade_from((x), _WHERE_, __LINE__) + +bool rwlock_is_owned(const rwlock_t *rw) NON_NULL_PARAM((1)); +bool rwlock_is_used(const rwlock_t *rw) NON_NULL_PARAM((1)); +bool rwlock_is_free(const rwlock_t *rw) NON_NULL_PARAM((1)); +bool rwlock_is_taken(const rwlock_t *rw) NON_NULL_PARAM((1)); + +NON_NULL_PARAM((1, 2)) +void rwlock_not_owned(const rwlock_t *rw, const char *file, unsigned line); + +#define assert_rwlock_is_owned(rw) G_STMT_START { \ + if G_UNLIKELY(!rwlock_is_owned(rw)) \ + rwlock_not_owned((rw), _WHERE_, __LINE__); \ +} G_STMT_END + +#endif /* _rwlock_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/sectoken.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/sectoken.c
Changed
@@ -34,14 +34,15 @@ #include "common.h" #include "sectoken.h" -#include "atoms.h" /* For binary_hash() */ #include "cq.h" #include "endian.h" +#include "hashing.h" /* For binary_hash() */ #include "host_addr.h" #include "random.h" #include "tea.h" #include "unsigned.h" #include "walloc.h" + #include "override.h" /* Must be the last header included */ enum sectoken_gen_magic { SECTOKEN_GEN_MAGIC = 0x2a7f3219 }; @@ -80,15 +81,22 @@ /** * Create a security token from host address and port using specified key. * + * Optionally, extra contextual data may be given (i.e. the token is not + * only based on the address and port) to make the token more unique to + * a specific context. + * * @param stg the security token generator * @param n key index to use * @param tok where security token is written * @param addr address of the host for which we're generating a token * @param port port of the host for which we're generating a token + * @param data optional contextual data + * @param len length of contextual data */ static void sectoken_generate_n(sectoken_gen_t *stg, size_t n, - sectoken_t *tok, host_addr_t addr, guint16 port) + sectoken_t *tok, host_addr_t addr, uint16 port, + const void *data, size_t len) { char block8; char enc8; @@ -98,6 +106,7 @@ g_assert(tok != NULL); g_assert(size_is_non_negative(n)); g_assert(n < stg->keycnt); + g_assert((NULL != data) == (len != 0)); switch (host_addr_net(addr)) { case NET_TYPE_IPV4: @@ -105,7 +114,7 @@ break; case NET_TYPE_IPV6: { - guint val; + uint val; val = binary_hash(host_addr_ipv6(&addr), 16); p = poke_be32(p, val); @@ -122,10 +131,47 @@ g_assert(p == &block8); - STATIC_ASSERT(sizeof(tok->v) == sizeof(guint32)); + STATIC_ASSERT(sizeof(tok->v) == sizeof(uint32)); STATIC_ASSERT(sizeof(block) == sizeof(enc)); tea_encrypt(&stg->keysn, enc, block, sizeof block); + + /* + * If they gave contextual data, encrypt them by block of TEA_BLOCK_SIZE + * bytes, filling the last partial block with zeroes if needed. + */ + + if (data != NULL) { + const void *q = data; + size_t remain = len; + char denc8; + + STATIC_ASSERT(sizeof(denc) == sizeof(enc)); + + while (remain != 0) { + size_t fill = MIN(remain, TEA_BLOCK_SIZE); + unsigned i; + + if (fill != TEA_BLOCK_SIZE) + ZERO(&block); + + memcpy(block, q, fill); + remain -= fill; + q = const_ptr_add_offset(q, fill); + + /* + * Encrypt block of contextual data (possibly filled with trailing + * zeroes) and merge back the result into the main encryption + * output with XOR. + */ + + tea_encrypt(&stg->keysn, denc, block, sizeof block); + + for (i = 0; i < sizeof denc; i++) + enci ^= denci; + } + } + poke_be32(tok->v, tea_squeeze(enc, sizeof enc)); } @@ -139,22 +185,45 @@ */ void sectoken_generate(sectoken_gen_t *stg, - sectoken_t *tok, host_addr_t addr, guint16 port) + sectoken_t *tok, host_addr_t addr, uint16 port) +{ + sectoken_generate_n(stg, 0, tok, addr, port, NULL, 0); +} + +/** + * Create a security token from host address, port and contextual data. + * + * @param stg the security token generator + * @param tok where security token is written + * @param addr address of the host for which we're generating a token + * @param port port of the host for which we're generating a token + * @param data contextual data + * @param len length of contextual data + */ +void +sectoken_generate_with_context(sectoken_gen_t *stg, + sectoken_t *tok, host_addr_t addr, uint16 port, + const void *data, size_t len) { - sectoken_generate_n(stg, 0, tok, addr, port); + g_assert(data != NULL); + g_assert(size_is_positive(len)); + + sectoken_generate_n(stg, 0, tok, addr, port, data, len); } /* * Is specified token still valid for this address/port tuple? */ -gboolean -sectoken_is_valid(sectoken_gen_t *stg, - const sectoken_t *tok, host_addr_t addr, guint16 port) +static bool +sectoken_is_valid_internal(sectoken_gen_t *stg, + const sectoken_t *tok, host_addr_t addr, uint16 port, + const void *data, size_t len) { size_t i; sectoken_gen_check(stg); g_assert(tok != NULL); + g_assert((NULL != data) == (len != 0)); /* * We can't decrypt, we just generate a new token with the set of @@ -167,7 +236,7 @@ for (i = 0; i < stg->keycnt; i++) { sectoken_t gen; - sectoken_generate_n(stg, i, &gen, addr, port); + sectoken_generate_n(stg, i, &gen, addr, port, data, len); if (0 == memcmp(gen.v, tok->v, sizeof(tok->v))) return TRUE; } @@ -175,33 +244,53 @@ return FALSE; } +/* + * Is specified token still valid for this address/port tuple? + */ +bool +sectoken_is_valid(sectoken_gen_t *stg, + const sectoken_t *tok, host_addr_t addr, uint16 port) +{ + return sectoken_is_valid_internal(stg, tok, addr, port, NULL, 0); +} + +/* + * Is specified token still valid for this address/port/data tuple? + */ +bool +sectoken_is_valid_with_context(sectoken_gen_t *stg, + const sectoken_t *tok, host_addr_t addr, uint16 port, + const void *data, size_t len) +{ + return sectoken_is_valid_internal(stg, tok, addr, port, data, len); +} + /** * Token key rotating event. */ static void -sectoken_rotate(cqueue_t *unused_cq, gpointer obj) +sectoken_rotate(cqueue_t *cq, void *obj) { size_t i; sectoken_gen_t *stg = obj; sectoken_gen_check(stg); - (void) unused_cq; - + cq_zero(cq, &stg->rotate_ev); stg->rotate_ev = cq_main_insert(stg->refresh * 1000, sectoken_rotate, stg); for (i = 0; i < stg->keycnt - 1; i++) stg->keysi + 1 = stg->keysi; /* 0 is most recent key */ - random_bytes(&stg->keys0, sizeof(stg->keys0)); + random_strong_bytes(&stg->keys0, sizeof(stg->keys0)); } /** * Allocate a remote security token. */ sectoken_remote_t * -sectoken_remote_alloc(guint8 length) +sectoken_remote_alloc(uint8 length) { sectoken_remote_t *token; @@ -216,7 +305,7 @@ * Free remote security token. */ void -sectoken_remote_free(sectoken_remote_t *token, gboolean freedata) +sectoken_remote_free(sectoken_remote_t *token, bool freedata) { if (token->v && freedata) wfree(token->v, token->length); @@ -237,12 +326,12 @@ WALLOC0(stg); stg->magic = SECTOKEN_GEN_MAGIC; - stg->keys = walloc(keys * sizeof stg->keys0); + WALLOC_ARRAY(stg->keys, keys); stg->keycnt = keys; stg->refresh = refresh; for (i = 0; i < stg->keycnt; i++) - random_bytes(&stg->keysi, sizeof(stg->keys0)); + random_strong_bytes(&stg->keysi, sizeof(stg->keys0)); stg->rotate_ev = cq_main_insert(refresh * 1000, sectoken_rotate, stg); @@ -261,7 +350,7 @@ sectoken_gen_check(stg); cq_cancel(&stg->rotate_ev); - WFREE_NULL(stg->keys, stg->keycnt * sizeof stg->keys0); + WFREE_ARRAY_NULL(stg->keys, stg->keycnt); stg->magic = 0; WFREE(stg); *stg_ptr = NULL;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/sectoken.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/sectoken.h
Changed
@@ -35,6 +35,7 @@ #define _sectoken_h_ #include "host_addr.h" +#include "timestamp.h" struct sectoken_gen; typedef struct sectoken_gen sectoken_gen_t; @@ -45,7 +46,7 @@ * The security tokens we generate. */ typedef struct { - guchar vSECTOKEN_RAW_SIZE; + uchar vSECTOKEN_RAW_SIZE; } sectoken_t; /* @@ -53,7 +54,7 @@ */ typedef struct { void *v; /**< Token value (NULL if none) */ - guint8 length; /**< Token length (0 if none) */ + uint8 length; /**< Token length (0 if none) */ } sectoken_remote_t; /* @@ -62,11 +63,17 @@ time_delta_t sectoken_lifetime(const sectoken_gen_t *stg); void sectoken_generate(sectoken_gen_t *stg, - sectoken_t *tok, host_addr_t addr, guint16 port); -gboolean sectoken_is_valid(sectoken_gen_t *stg, - const sectoken_t *tok, host_addr_t addr, guint16 port); -sectoken_remote_t *sectoken_remote_alloc(guint8 length); -void sectoken_remote_free(sectoken_remote_t *token, gboolean freedata); + sectoken_t *tok, host_addr_t addr, uint16 port); +void sectoken_generate_with_context(sectoken_gen_t *stg, + sectoken_t *tok, host_addr_t addr, uint16 port, + const void *data, size_t len); +bool sectoken_is_valid(sectoken_gen_t *stg, + const sectoken_t *tok, host_addr_t addr, uint16 port); +bool sectoken_is_valid_with_context(sectoken_gen_t *stg, + const sectoken_t *tok, host_addr_t addr, uint16 port, + const void *data, size_t len); +sectoken_remote_t *sectoken_remote_alloc(uint8 length); +void sectoken_remote_free(sectoken_remote_t *token, bool freedata); sectoken_gen_t *sectoken_gen_new(size_t keys, time_delta_t refresh); void sectoken_gen_free_null(sectoken_gen_t **stg_ptr);
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/semaphore.c
Added
@@ -0,0 +1,1022 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Semaphore management. + * + * When appropriate kernel support is available, including semtimedop(), then + * this layer creates arrays of kernel semaphores and then allocates individual + * semaphores from this array. The aim is to reduce the amount of kernel + * resources used by the process, and semaphore arrays are precious since they + * consume a system-wide ID. + * + * Some platforms (and notably OS X) have incomplete kernel semaphores because + * they lack semtimedop(). Note that Windows has native semaphore support and + * we can therefore emulate the UNIX semaphore API on top of it (for the part + * we need). + * + * When running on a platform without full kernel support, or when we fail to + * allocate a kernel semaphore (scarce resource), we emulate them in user-space. + * The emulation logic is straighforward and was made as efficient as possible. + * It does not involve busy waits but requires using more system resources than + * kernel semaphores: it needs two file descriptors for the blocking pipe(). + * + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#ifdef I_SYS_IPC +#include <sys/ipc.h> +#endif +#ifdef I_SYS_SEM +#include <sys/sem.h> +#endif + +#include "semaphore.h" + +#include "alloca.h" +#include "atomic.h" +#include "bit_array.h" +#include "elist.h" +#include "once.h" +#include "signal.h" +#include "spinlock.h" +#include "stringify.h" +#include "thread.h" +#include "unsigned.h" +#include "walloc.h" + +#include "override.h" /* Must be the last header included */ + +/* + * If they don't have semop() nor semtimedop(), we'll have to emulate them + * and implemenent a FIFO list of waiting threads, to be able to wake them up + * in the order of arrival. + */ + +#if \ + !defined(HAS_SEMOP) || \ + !defined(HAS_SEMTIMEDOP) || \ + !defined(HAS_SEMGET) || \ + !defined(HAS_SEMCTL) +#define EMULATE_SEM /* Only emulation is compiled in */ +#endif + +/* + * We don't allocate one individual kernel semaphore each time users request + * a new semaphore. Instead, we request semaphores by batch, which allows + * the kernel to allocate only one semaphore ID, and then we manage each + * individual semaphore in the batch. + */ + +#define SEMAPHORE_BATCH_AMOUNT 32 +#define SEM_BITSIZE BIT_ARRAY_SIZE(SEMAPHORE_BATCH_AMOUNT) + +struct sem_batch { + bit_array_t mapSEM_BITSIZE; /* Bitmap recording used semaphores */ + int id; /* ID of the kernel semaphore batch */ + unsigned used; /* Amount of IDs used */ + unsigned capacity; /* Amount of semaphores in the batch */ + link_t lk; /* Embedded list pointers */ + spinlock_t lock; /* Thread-safe lock */ +}; + +#define SEM_BATCH_LOCK(s) spinlock(&(s)->lock) +#define SEM_BATCH_UNLOCK(s) spinunlock(&(s)->lock) + +enum semaphore_magic { SEMAPHORE_MAGIC = 0x3e58b122 }; + +/** + * A semaphore. + * + * The "threads" field is there only for emulation purposes. + * However, even if the kernel supports semaphores, we'll fallback to the + * emulation status when we cannot get kernel semaphores or when testing + * emulated semaphores by explicitly asking for an emulated semaphore. + * Hence emulation support is always compiled in. + */ +struct semaphore { + enum semaphore_magic magic; /* Magic number */ +#ifndef EMULATE_SEM + struct sem_batch *batch; /* Semaphore batch */ + uint num; /* Semaphore number in the batch */ +#endif + int tokens; /* Tokens held in semaphore */ + int surplus; /* Available after last release (emulation) */ + uint waiting; /* Amount of threads waiting on semaphore */ + uint zerowait; /* Amount of threads waiting for depletion */ + ushort reserved_waiting; /* Awoken threads waiting (emulation only) */ + ushort reserved_zero; /* Awoken threads for depletion (idem) */ + spinlock_t lock; /* Thread-safe lock for updating information */ + elist_t threads; /* Waiting threads, when emulating only */ + elist_t zero; /* Waiting threads, for zero tokens */ +}; + +static inline void +semaphore_check(const struct semaphore * const s) +{ + g_assert(s != NULL); + g_assert(SEMAPHORE_MAGIC == s->magic); +} + +#define SEM_LOCK(s) spinlock_hidden(&(s)->lock) +#define SEM_UNLOCK(s) spinunlock_hidden(&(s)->lock) + +/*** + *** Emulated semaphores. + ***/ + +struct waiting_thread { + unsigned stid; /* Blocked thread small ID */ + link_t lk; /* Embedded list pointers */ + int amount; /* Amount of tokens requested */ + bool awoken; /* Thread was awoken */ +}; + +/** + * If there are waiting threads on the semaphore, unblock all the threads that + * can be served tokens or which were waiting on the token count reaching 0. + */ +static void +semaphore_unblock(semaphore_t *s) +{ + size_t count = 0; + elist_t *list; + int available, remain; + link_t *l; + ushort *reserved; + unsigned *uid; /* Thread IDs to unblock */ + unsigned *u; + + SEM_LOCK(s); + available = s->tokens; + list = 0 == available ? &s->zero : &s->threads; + reserved = 0 == available ? &s->reserved_zero : &s->reserved_waiting; + count = elist_count(list); + SEM_UNLOCK(s); + + if (0 == count) + return; + + remain = available; + G_PREFETCH_W(reserved); + + /* + * Identify the threads we can unblock among the waiting set. + * + * If the semaphore reached 0 tokens, we unblock all the threads + * waiting for that event. Otherwise, we unblock the threads whose + * requested token count is less than the running count of remaining + * tokens. + */ + + SEM_LOCK(s); + + count = elist_count(list); + u = uid = alloca(count * sizeof uid0); + *reserved = 0; + s->surplus = 0; + + ELIST_FOREACH(list, l) { + struct waiting_thread *wt = elist_data(list, l); + + if (0 == available || wt->amount <= remain) { + *u++ = wt->stid; /* Remember thread ID */ + (*reserved)++; /* Count threads we shall awake */ + wt->awoken = TRUE; /* Mark the threads we're waking up */ + remain -= wt->amount; + if (0 != available && 0 == remain) + break; + } + } + + s->surplus = remain; + SEM_UNLOCK(s); + + /* + * Now that we no longer hold the semaphore lock, unblock the threads. + */ + + while (uid < u) { + thread_unblock(*uid++); + } +} + +/** + * Attempt to grab the specified amount of tokens from semaphore. + * + * @return TRUE on success. + */ +static inline bool +semaphore_grab(semaphore_t *s, int amount) +{ + g_assert(spinlock_is_held(&s->lock)); /* The semaphore is locked */ + + if (0 == amount) { + if (0 == s->tokens) + return TRUE; + } else if (s->tokens >= amount) { + s->tokens -= amount; + return TRUE; + } + + return FALSE; +} + +struct semaphore_emulate_vars { + struct waiting_thread *wt; + elist_t *l; + semaphore_t *s; + ushort *reserved; + int amount; +}; + +/** + * Cleanup handler for semaphore_emulate(). + */ +static void +semaphore_emulate_cleanup(void *arg) +{ + struct semaphore_emulate_vars *v = arg; + + atomic_uint_dec(0 == v->amount ? &v->s->zerowait : &v->s->waiting); + + if (v->wt != NULL) { + SEM_LOCK(v->s); + elist_remove(v->l, v->wt); + if (v->wt->awoken) + (*v->reserved)--; + SEM_UNLOCK(v->s); + } +} + +/** + * Emulate a simplified semtimedop() operation. + * + * @param s the semaphore we want to acquire/release + * @param amount amount of tokens (0 = wait for zero) + * @param timeout timeout (NULL = infinite) + * @param block whether we can block if tokens are missing. + * + * @return 0 if OK, -1 if error with errno set. + */ +static int +semaphore_emulate(semaphore_t *s, int amount, const tm_t *timeout, bool block) +{ + bool success = FALSE; + struct waiting_thread waiting; + struct semaphore_emulate_vars v; + tm_t end; + + semaphore_check(s); + g_assert(amount >= 0); + + /* + * Since the thread can block, we need to install a cleanup handler + * in case the thread is cancelled during the time it waits. + */ + + v.wt = NULL; + v.l = 0 == amount ? &s->zero : &s->threads; + v.reserved = 0 == amount ? &s->reserved_zero : &s->reserved_waiting; + v.s = s; + v.amount = amount; + + thread_cleanup_push(semaphore_emulate_cleanup, &v); + + if (timeout != NULL) { + tm_now_exact(&end); + tm_add(&end, timeout); + } else { + ZERO(&end); + } + + /* + * Emulate possibly blocking semaphore operation. + * + * If amount is < 0, we attempt to grab tokens and will block if that + * amount is not available. + * + * If amount is 0, we are waiting until there are no tokens left. + */ + + for (;;) { + unsigned events; + + SEM_LOCK(s); + events = thread_block_prepare(); + + /* + * The first time we attempt to grab the semaphore, enqueue if + * there are already waiting parties registered, regardless of + * whether we could succeed. + * + * This is to attempt fairness in case a thread comes late after + * pending threads have been awoken but before they were given a + * chance to actually be rescheduled and process the condition. + */ + + if G_UNLIKELY(NULL == v.wt) { + if (0 != elist_count(v.l)) + goto skipped; + } + + success = semaphore_grab(s, amount); + + skipped: + SEM_UNLOCK(s); + if (success || !block) + break; + + /* + * We have to block on this semaphore. + * + * List ourselves as a thread waiting for the semaphore so that + * we can be properly woken up when the semaphore becomes available. + * + * We will then have to recheck whether we cannot grab the semaphore + * to close any race conidtion since we had to drop the semaphore + * lock in between and we were not listed as waiting, hence had no + * opportunity to be awakened. + * + * It is necessary to append ourselves once the "wt" object is created + * even if we end-up grabbing the semaphore immediately afterwards, + * because the cleanup code depends on the object being in the list. + */ + + if G_UNLIKELY(NULL == v.wt) { + ZERO(&waiting); + v.wt = &waiting; + v.wt->stid = thread_small_id(); + v.wt->amount = amount; + SEM_LOCK(s); + elist_append(v.l, v.wt); + + /* + * The "surplus" indicates how many tokens were released in excess + * compared to the desired total. Even if there are threads for + * which we reserved tokens (by awakening them) we need to attempt + * grabbing the semaphore if there enough surplus. Otherwise we + * could hang in there, waiting for a release that may no longer + * come. + */ + + if (amount <= s->surplus && amount != 0 && amount <= s->tokens) { + s->surplus -= amount; + s->tokens -= amount; + success = TRUE; + } else if (0 == *v.reserved) { + /* Don't steal semaphore if it was reserved to queued threads */ + success = semaphore_grab(s, amount); + } + SEM_UNLOCK(s); + if (success) + break; + } + + /* + * The "events" variable is the count of unblocking events that + * were sent to the current thread. It was grabbed whilst the + * semaphore was locked and we determined whether we had enough + * tokens to proceed. + * + * Since time has elapsed since we made that decision, it is possible + * that we could have been context-switched whilst another thread + * released semaphore tokens and saw we were listed as waiting for + * more tokens, thereby attempting to unblock us. + * + * This will be noticed by thread_time_block_self() if the event count + * passed does not match the current count, in which case no blocking + * will occur. + */ + + if (!thread_timed_block_self(events, timeout)) + break; /* Timed out */ + } + + /* + * Final cleanup. + */ + + thread_cleanup_pop(TRUE); /* Always execute the cleanup handler */ + + if (success) { + if (amount != 0 && 0 == s->tokens) + semaphore_unblock(s); /* In case someone waits for zero */ + return 0; /* Got the amount of tokens requested */ + } + + errno = EAGAIN; + return -1; /* Timeout, or non-blocking operation */ +} + +/*** + *** Kernel semaphores + ***/ + +static bool sem_cleaned_up; + +#ifndef EMULATE_SEM +static elist_t sem_list = ELIST_INIT(offsetof(struct sem_batch, lk)); +static spinlock_t sem_list_lock = SPINLOCK_INIT; + +/** + * Emergency cleanup routine to free semaphores. + */ +static void +semaphore_cleanup(void) +{ + link_t *l; + bool locked; + + /* + * This is an emergency cleanup. If we can grab the lock, that's + * an additional safety but if we can't, continue anyway. + */ + + locked = spinlock_hidden_try(&sem_list_lock); + atomic_bool_set(&sem_cleaned_up, TRUE); + + ELIST_FOREACH(&sem_list, l) { + struct sem_batch *sb = elist_data(&sem_list, l); + (void) semctl(sb->id, 0, IPC_RMID); + } + + if (locked) + spinunlock_hidden(&sem_list_lock); +} + +/** + * Install semaphore cleanup, once. + */ +static void +semaphore_cleanup_install_once(void) +{ + signal_cleanup_add(semaphore_cleanup); +} + +/** + * Make sure we cleanup allocated semaphore in case we receive a signal. + * + * The semaphores are allocated with IPC_PRIVATE but are NOT reclaimed by the + * kernel when the process exits, nor when it terminates abnormally via a + * signal. (On Windows this is not needed because we emulate the sem*() API + * and the kernel will cleanup the semaphores properly, however we don't make + * a difference here) + * + * Therefore, we install our emergency cleanup to avoid system resource leaks + * and call signal_perform_cleanup() at strategic points. + */ +static void +semaphore_cleanup_install(void) +{ + static once_flag_t done; + + once_flag_run(&done, semaphore_cleanup_install_once); +} + +#ifndef MINGW32 +/** + * On UNIX, trap blocking semtimedop() operations to be able to indicate that + * we are in a safe place should a kernel signal interrupt the system call. + */ +static int +unix_semtimedop(int id, struct sembuf *ops, unsigned nops, struct timespec *t) +{ + int r; + unsigned i; + bool can_block = FALSE; + struct sembuf *o; + + /* + * Look whether the operation can block. + */ + + for (i = 0, o = ops; i < nops && !can_block; i++, o++) { + if (o->sem_op < 0 && 0 == (o->sem_flg & IPC_NOWAIT)) + can_block = TRUE; + } + + if (can_block) + thread_in_syscall_set(TRUE); + + r = semtimedop(id, ops, nops, t); + + if (can_block) + thread_in_syscall_set(FALSE); + + return r; +} + +#define semtimedop unix_semtimedop +#endif /* !MINGW32 */ + +/** + * Free a kernel semaphore within a batch. + * + * @param sb the batch where semaphore is held + * @param num semaphore number in the batch + */ +static void +semaphore_free(struct sem_batch *sb, uint num) +{ + g_assert(sb != NULL); + g_assert(uint_is_non_negative(num)); + g_assert(num < sb->capacity); + g_assert(uint_is_positive(sb->used)); + + SEM_BATCH_LOCK(sb); + bit_array_clear(sb->map, num); + sb->used--; + SEM_BATCH_UNLOCK(sb); + + if (0 == sb->used) { + bool free_sb = FALSE; + + spinlock(&sem_list_lock); + SEM_BATCH_LOCK(sb); + if (0 == sb->used) { + if (-1 == semctl(sb->id, 0, IPC_RMID)) { + s_critical("%s(): cannot free semaphore array ID=%d: %m", + G_STRFUNC, sb->id); + } + elist_remove(&sem_list, sb); + free_sb = TRUE; + } + SEM_BATCH_UNLOCK(sb); + spinunlock(&sem_list_lock); + if (free_sb) + WFREE_TYPE_NULL(sb); + } +} + +/** + * Allocate a new kernel semaphore. + * + * We do not use semget() to allocate a new individual semaphore because + * that is a waste of kernel resources: rather allocate an array of semaphores + * and then pick one of the many we have in the array to use as an individual + * user-level semaphore. + * + * @param num where number of the semaphore within batch is returned + * + * @return the batch from which semaphore was allocated, NULL on error. + */ +static struct sem_batch * +semaphore_allocate(uint *num) +{ + struct sem_batch *sb; + unsigned capacity; + + g_assert(num != NULL); + + spinlock(&sem_list_lock); + + ELIST_FOREACH_DATA(&sem_list, sb) { + size_t n; + + SEM_BATCH_LOCK(sb); + + if G_UNLIKELY(sb->capacity == sb->used) { + SEM_BATCH_UNLOCK(sb); + continue; + } + + n = bit_array_first_clear(sb->map, 0, sb->capacity - 1); + if ((size_t) -1 != n) { + bit_array_set(sb->map, n); + sb->used++; + } + SEM_BATCH_UNLOCK(sb); + + if ((size_t) -1 != n) { + *num = n; + + /* + * Move batch with free semaphores to the head of the list if + * we had to move past the head to find a batch with a free item. + */ + + elist_moveto_head(&sem_list, sb); + + spinunlock(&sem_list_lock); + return sb; + } + } + + /* + * Found no free semaphores, need to allocate a new batch. + */ + + WALLOC0(sb); + + for (capacity = SEMAPHORE_BATCH_AMOUNT; capacity != 0; capacity /= 2) { + sb->id = semget(IPC_PRIVATE, capacity, IPC_CREAT | S_IRUSR | S_IWUSR); + if (-1 != sb->id || errno != EINVAL) + break; + } + + if (-1 == sb->id) { + s_carp("%s(): unable to get a new semaphore array via semget(): %m", + G_STRFUNC); + WFREE_TYPE_NULL(sb); + goto done; + } + + semaphore_cleanup_install(); /* Scarce permanent IPC allocated */ + + if (capacity != SEMAPHORE_BATCH_AMOUNT) { + s_message("%s(): was only able to allocate %u semaphore%s in array", + G_STRFUNC, capacity, plural(capacity)); + } + + sb->capacity = capacity; + spinlock_init(&sb->lock); + bit_array_set(sb->map, 0); /* Use first semaphore from batch */ + sb->used = 1; + + elist_prepend(&sem_list, sb); + +done: + spinunlock(&sem_list_lock); + *num = 0; + return sb; +} +#endif /* !EMULATE_SEM */ + +/** + * Allocate a new user-level semaphore to be used in this process only. + * + * The ability to force emulation is only useful for testing. + * Normal code should call semaphore_create() only. + * + * @param tokens initial amount of tokens in the semaphore (must be >= 0) + * @param emulated if TRUE, force emulated logic despite kernel support + * + * @return a new semaphore. + */ +semaphore_t * +semaphore_create_full(int tokens, bool emulated) +{ + semaphore_t *s; +#ifndef EMULATE_SEM + struct sem_batch *sb = NULL; + uint num = 0; +#endif + + g_assert(tokens >= 0); + + if G_UNLIKELY(atomic_bool_get(&sem_cleaned_up)) + emulated = TRUE; /* Force emulated semaphore if we cleaned up! */ + +#ifndef EMULATE_SEM + if G_UNLIKELY(emulated) { + num = 1; /* Prevents warning later, since we asked for emulation */ + } else { + sb = semaphore_allocate(&num); + + if (sb != NULL) { + if (-1 == semctl(sb->id, num, SETVAL, tokens)) { + s_carp("%s(): semctl(%d, %d, SETVAL, %d) failed: %m", + G_STRFUNC, sb->id, num, tokens); + semaphore_free(sb, num); + sb = NULL; + num = 0; + } + } + } +#else + (void) emulated; +#endif /* !EMULATE_SEM */ + + WALLOC0(s); + s->magic = SEMAPHORE_MAGIC; + s->tokens = tokens; + spinlock_init(&s->lock); + elist_init(&s->threads, offsetof(struct waiting_thread, lk)); + elist_init(&s->zero, offsetof(struct waiting_thread, lk)); +#ifndef EMULATE_SEM + s->batch = sb; + s->num = num; +#endif + + return s; +} + +/** + * Allocate a new user-level semaphore to be used in this process only. + * + * @param tokens initial amount of tokens in the semaphore (must be >= 0) + * + * @return a new semaphore. + */ +semaphore_t * +semaphore_create(int tokens) +{ + return semaphore_create_full(tokens, FALSE); +} + +/** + * Destroy semaphore and nullify its pointer. + */ +void +semaphore_destroy(semaphore_t **s_ptr) +{ + semaphore_t *s = *s_ptr; + + if (s != NULL) { + spinlock(&s->lock); +#ifndef EMULATE_SEM + if (s->batch != NULL) + semaphore_free(s->batch, s->num); +#endif + if (s->waiting != 0) { + s_carp("%s(): freeing semaphore with %u waiting thread%s", + G_STRFUNC, s->waiting, plural(s->waiting)); + } + spinlock_destroy(&s->lock); + s->magic = 0; + WFREE(s); + *s_ptr = NULL; + } +} + +/** + * Acquire tokens from the semaphore. + * + * @param s the semaphore + * @param amount amount of tokens to grab (0 = wait until all are grabbed) + * @param timeout time to spend waiting before timeouting (NULL for infinite) + * @param can_wait whether we can block if tokens are missing. + * + * @return TRUE if OK, FALSE on error with errno set. + */ +static bool +semaphore_acquire_internal(semaphore_t *s, int amount, const tm_t *timeout, + bool can_wait) +{ + semaphore_check(s); + g_assert(amount >= 0); + + /* + * No need to grab lock to update counter atomically. + */ + + atomic_uint_inc(0 == amount ? &s->zerowait : &s->waiting); + +#ifndef EMULATE_SEM + if (s->batch != NULL) { + struct sembuf sops1; + const struct sem_batch *sb = s->batch; + struct timespec t; + int r; + + sops0.sem_num = s->num; + sops0.sem_op = -amount; + sops0.sem_flg = can_wait ? 0 : IPC_NOWAIT; + + if (timeout != NULL) { + t.tv_sec = timeout->tv_sec; + t.tv_nsec = timeout->tv_usec * 1000; + } + + if (can_wait) + thread_assert_no_locks(G_STRFUNC); + + r = semtimedop(sb->id, sops, 1, timeout != NULL ? &t : NULL); + + atomic_uint_dec(0 == amount ? &s->zerowait : &s->waiting); + SEM_LOCK(s); + if (0 == r) + s->tokens -= amount; + g_assert(s->tokens >= 0); + SEM_UNLOCK(s); + + if ( + -1 == r && EINTR != errno && + ((NULL != timeout && EAGAIN != errno) || + (NULL == timeout && (can_wait || EAGAIN != errno))) + ) { + s_carp("%s(): semtimedop(%d, -%d, %s) failed: %m", + G_STRFUNC, sb->id, amount, NULL == timeout ? "NULL" : + ulong_to_string(tm2ms(timeout))); + } + + return booleanize(0 == r); + } else +#endif /* !EMULATE_SEM */ + { + /* + * Either we could not grab a semaphore from the kernel or semop() + * is not supported. + */ + +#ifndef EMULATE_SEM + /* + * When kernel support is available, we normally don't come here + * because s->batch is non-NULL: the kernel semaphore is one of + * the individual semaphores we request from the kernel as an array + * (a batch). + * + * However, sometimes we won't be able to allocate a kernel semaphore + * because the system ran out of available ones, or maybe they have + * explicitly requested an emulated semaphore. + * + * We want to warn when we start operating on an emulated semaphore + * unless they asked for it in the first place. This is achieved + * by checking whether s->num is still 0. It is forced to 1 when an + * emulated semaphore is requested. + */ + + if G_UNLIKELY(0 == s->num) { + /* Warn about our emulation, once per semaphore object */ + atomic_uint_inc(&s->num); + s_carp("%s(): emulating semop(-%d), %d token%s available in %p", + G_STRFUNC, amount, s->tokens, plural(s->tokens), s); + } +#endif /* !EMULATE_SEM */ + + return 0 == semaphore_emulate(s, amount, timeout, can_wait); + } +} + +/** + * Acquire tokens from the semaphore. + * + * If there are not enough tokens available, the calling thread is blocked + * until it can actually fetch the tokens (because another thread puts some + * back) or until a signal is received. + * + * @param s the semaphore + * @param amount amount of tokens to grab + * @param timeout time to spend waiting before timeouting (NULL for infinite) + * + * @return TRUE if OK, FALSE on error with errno set. + */ +bool +semaphore_acquire(semaphore_t *s, int amount, const tm_t *timeout) +{ + return semaphore_acquire_internal(s, amount, timeout, TRUE); +} + +/** + * Try to acquire tokens from the semaphore. + * + * This is a non-blocking operation so there is no timeout: the operation + * may have failed of course. + * + * @param s the semaphore + * @param amount amount of tokens to grab + * + * @return TRUE if OK, FALSE if there are not enough tokens available. + */ +bool +semaphore_acquire_try(semaphore_t *s, int amount) +{ + return semaphore_acquire_internal(s, amount, NULL, FALSE); +} + +/** + * Release tokens back to the semaphore. + * + * @param s the semaphore + * @param amount amount of tokens to put back + */ +void +semaphore_release(semaphore_t *s, int amount) +{ + int tokens; + + semaphore_check(s); + g_assert(amount > 0); + + SEM_LOCK(s); + g_assert(s->tokens >= 0); + tokens = s->tokens + amount; + if (tokens > 0) + s->tokens = tokens; + SEM_UNLOCK(s); + + if (tokens <= 0) { + s_error("%s(): token count overflow (adding %d to existing %d)", + G_STRFUNC, amount, s->tokens); + } + +#ifdef EMULATE_SEM + semaphore_unblock(s); /* Wakeup waiting threads, if any */ +#else + if (s->batch != NULL) { + struct sembuf sops1; + const struct sem_batch *sb = s->batch; + int r; + + sops0.sem_num = s->num; + sops0.sem_op = amount; + sops0.sem_flg = 0; + + r = semop(sb->id, sops, 1); + + if (-1 == r) { + s_carp("%s(): semop(%d, +%d) failed: %m", + G_STRFUNC, sb->id, amount); + } + } else { + /* This semaphore was emulated despite kernel-level support */ + semaphore_unblock(s); + } +#endif /* EMULATE_SEM */ +} + +/** + * @return the semaphore value. + */ +int +semaphore_value(const semaphore_t *s) +{ + semaphore_check(s); + +#ifdef EMULATE_SEM + return s->tokens; +#else + if (s->batch != NULL) { + const struct sem_batch *sb = s->batch; + int r; + + r = semctl(sb->id, s->num, GETVAL); + + if (-1 == r) { + s_carp("%s(): semctl(%d, %d, GETVAL) failed: %m", + G_STRFUNC, sb->id, s->num); + } + return r; + } else { + /* This semaphore was emulated despite kernel-level support */ + return s->tokens; + } +#endif /* EMULATE_SEM */ +} + +/** + * Get kernel semaphore usage statistics. + * + * @param inuse if non-NULL, written with amount of semaphores in use + * + * @return the amount of allocated semaphore arrays. + */ +size_t +semaphore_kernel_usage(size_t *inuse) +{ +#ifndef EMULATE_SEM + size_t arrays; + + spinlock(&sem_list_lock); + + arrays = elist_count(&sem_list); + + if (inuse != NULL) { + struct sem_batch *sb; + size_t used = 0; + + ELIST_FOREACH_DATA(&sem_list, sb) { + used += sb->used; + } + + *inuse = used; + } + + spinunlock(&sem_list_lock); + + return arrays; +#else + if (inuse != NULL) + *inuse = 0; + return 0; +#endif /* !EMULATE_SEM */ +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/semaphore.h
Added
@@ -0,0 +1,63 @@ +/* + * Copyright (c) 2012, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Semaphore management. + * + * A semaphore is a global token pool that anybody can attempt to grab from + * and release to. When attempting to grab more than the amount of tokens it + * has available, the process blocks until the corresponding amount of tokens + * is made available by somebody else. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _semaphore_h_ +#define _semaphore_h_ + +#include "tm.h" + +struct semaphore; +typedef struct semaphore semaphore_t; + +/* + * Public interface. + */ + +semaphore_t *semaphore_create(int tokens); +semaphore_t *semaphore_create_full(int tokens, bool emulated); +int semaphore_value(const semaphore_t *s); +bool semaphore_acquire(semaphore_t *s, int amount, const tm_t *timeout); +bool semaphore_acquire_try(semaphore_t *s, int amount); +void semaphore_release(semaphore_t *s, int amount); +void semaphore_destroy(semaphore_t **s_ptr); + +size_t semaphore_kernel_usage(size_t *inuse); + +#endif /* _semaphore_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/sequence.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/sequence.c
Changed
@@ -57,6 +57,8 @@ union { GSList *gsl; GList *gl; + plist_t *pl; + pslist_t *psl; list_iter_t *li; slist_iter_t *sli; hash_list_iter_t *hli; @@ -106,6 +108,32 @@ } /** + * Create a sequence out of an existing pslist_t. + * Use sequence_release() to discard the sequence encapsulation. + */ +sequence_t * +sequence_create_from_pslist(pslist_t *pl) +{ + sequence_t *s; + + WALLOC(s); + return sequence_fill_from_pslist(s, pl); +} + +/** + * Create a sequence out of an existing plist_t. + * Use sequence_release() to discard the sequence encapsulation. + */ +sequence_t * +sequence_create_from_plist(plist_t *pl) +{ + sequence_t *s; + + WALLOC(s); + return sequence_fill_from_plist(s, pl); +} + +/** * Create a sequence out of an existing list_t. * Use sequence_release() to discard the sequence encapsulation. */ @@ -190,6 +218,30 @@ } /** + * Fill sequence object with plist_t. + */ +sequence_t * +sequence_fill_from_plist(sequence_t *s, plist_t *pl) +{ + s->magic = SEQUENCE_MAGIC; + s->type = SEQUENCE_PLIST; + s->u.pl = pl; + return s; +} + +/** + * Fill sequence object with pslist_t. + */ +sequence_t * +sequence_fill_from_pslist(sequence_t *s, pslist_t *pl) +{ + s->magic = SEQUENCE_MAGIC; + s->type = SEQUENCE_PSLIST; + s->u.psl = pl; + return s; +} + +/** * Fill sequence object with list_. */ sequence_t * @@ -257,6 +309,8 @@ case SEQUENCE_GSLIST: return "GSList"; case SEQUENCE_GLIST: return "GList"; case SEQUENCE_LIST: return "list_t"; + case SEQUENCE_PSLIST: return "pslist_t"; + case SEQUENCE_PLIST: return "plist_t"; case SEQUENCE_SLIST: return "slist_t"; case SEQUENCE_HLIST: return "hash_list_t"; case SEQUENCE_VECTOR: return "vector_t"; @@ -285,6 +339,12 @@ case SEQUENCE_LIST: list_foreach(s->u.l, func, data); break; + case SEQUENCE_PSLIST: + pslist_foreach(s->u.psl, func, data); + break; + case SEQUENCE_PLIST: + plist_foreach(s->u.pl, func, data); + break; case SEQUENCE_SLIST: slist_foreach(s->u.sl, func, data); break; @@ -302,7 +362,7 @@ /** * Is the sequence empty? */ -gboolean +bool sequence_is_empty(const sequence_t *s) { sequence_check(s); @@ -314,6 +374,10 @@ return NULL == s->u.gl; case SEQUENCE_LIST: return 0 == list_length(s->u.l); + case SEQUENCE_PSLIST: + return NULL == s->u.psl; + case SEQUENCE_PLIST: + return NULL == s->u.pl; case SEQUENCE_SLIST: return 0 == slist_length(s->u.sl); case SEQUENCE_HLIST: @@ -342,6 +406,10 @@ return g_list_length(s->u.gl); case SEQUENCE_LIST: return list_length(s->u.l); + case SEQUENCE_PSLIST: + return pslist_length(s->u.psl); + case SEQUENCE_PLIST: + return plist_length(s->u.pl); case SEQUENCE_SLIST: return slist_length(s->u.sl); case SEQUENCE_HLIST: @@ -358,7 +426,7 @@ /** * Returns the underlying sequence implementation. */ -gpointer +void * sequence_implementation(const sequence_t *s) { sequence_check(s); @@ -370,6 +438,10 @@ return s->u.gl; case SEQUENCE_LIST: return s->u.l; + case SEQUENCE_PSLIST: + return s->u.psl; + case SEQUENCE_PLIST: + return s->u.pl; case SEQUENCE_SLIST: return s->u.sl; case SEQUENCE_HLIST: @@ -389,13 +461,13 @@ * * The supplied pointer to the sequence is nullified upon return. */ -gpointer +void * sequence_release(sequence_t **s_ptr) { sequence_t *s = *s_ptr; if (s != NULL) { - gpointer implementation; + void *implementation; sequence_check(s); @@ -430,6 +502,12 @@ case SEQUENCE_LIST: list_free(&s->u.l); break; + case SEQUENCE_PSLIST: + pslist_free_null(&s->u.psl); + break; + case SEQUENCE_PLIST: + plist_free_null(&s->u.pl); + break; case SEQUENCE_SLIST: slist_free(&s->u.sl); break; @@ -473,6 +551,12 @@ case SEQUENCE_LIST: si->u.li = list_iter_before_head(s->u.l); break; + case SEQUENCE_PSLIST: + si->u.psl = s->u.psl; + break; + case SEQUENCE_PLIST: + si->u.pl = s->u.pl; + break; case SEQUENCE_SLIST: si->u.sli = slist_iter_before_head(s->u.sl); break; @@ -492,7 +576,7 @@ /** * Check whether we have a next item to be iterated over. */ -gboolean +bool sequence_iter_has_next(const sequence_iter_t *si) { if (!si) @@ -508,6 +592,10 @@ return si->u.gl != NULL; case SEQUENCE_LIST: return list_iter_has_next(si->u.li); + case SEQUENCE_PSLIST: + return si->u.psl != NULL; + case SEQUENCE_PLIST: + return si->u.pl != NULL; case SEQUENCE_SLIST: return slist_iter_has_next(si->u.sli); case SEQUENCE_HLIST: @@ -524,10 +612,10 @@ /** * Get next item, moving iterator cursor by one position. */ -gpointer +void * sequence_iter_next(sequence_iter_t *si) { - gpointer next = NULL; + void *next = NULL; sequence_iter_check(si); g_assert(SEQ_ITER_FORWARD == si->direction); @@ -543,6 +631,14 @@ break; case SEQUENCE_LIST: return list_iter_next(si->u.li); + case SEQUENCE_PSLIST: + next = si->u.psl ? si->u.psl->data : NULL; + si->u.psl = pslist_next(si->u.psl); + break; + case SEQUENCE_PLIST: + next = si->u.pl ? si->u.pl->data : NULL; + si->u.pl = plist_next(si->u.pl); + break; case SEQUENCE_SLIST: return slist_iter_next(si->u.sli); case SEQUENCE_HLIST: @@ -562,7 +658,7 @@ * instead unless ``check'' is TRUE in which case we panic. */ sequence_iter_t * -sequence_backward_iterator(const sequence_t *s, gboolean check) +sequence_backward_iterator(const sequence_t *s, bool check) { sequence_iter_t *si; @@ -585,6 +681,12 @@ case SEQUENCE_LIST: si->u.li = list_iter_after_tail(s->u.l); break; + case SEQUENCE_PSLIST: + si->u.psl = pslist_last(s->u.psl); + break; + case SEQUENCE_PLIST: + si->u.pl = plist_last(s->u.pl); + break; case SEQUENCE_SLIST: if (check) goto panic; @@ -611,10 +713,10 @@ /** * Get previous item, moving iterator cursor by one position backwards. */ -gpointer +void * sequence_iter_previous(sequence_iter_t *si) { - gpointer prev = NULL; + void *prev = NULL; sequence_iter_check(si); g_assert(SEQ_ITER_BACKWARD == si->direction); @@ -631,6 +733,15 @@ break; case SEQUENCE_LIST: return list_iter_previous(si->u.li); + case SEQUENCE_PSLIST: + /* Forward iteration only */ + prev = si->u.psl ? si->u.psl->data : NULL; + si->u.psl = pslist_next(si->u.psl); + break; + case SEQUENCE_PLIST: + prev = si->u.pl ? si->u.pl->data : NULL; + si->u.pl = plist_prev(si->u.pl); + break; case SEQUENCE_SLIST: /* Forward iteration only */ return slist_iter_next(si->u.sli); @@ -648,7 +759,7 @@ /** * Check whether we have a previous item to be iterated over. */ -gboolean +bool sequence_iter_has_previous(const sequence_iter_t *si) { if (!si) @@ -665,6 +776,10 @@ return si->u.gl != NULL; case SEQUENCE_LIST: return list_iter_has_previous(si->u.li); + case SEQUENCE_PSLIST: + return si->u.psl != NULL; + case SEQUENCE_PLIST: + return si->u.pl != NULL; case SEQUENCE_SLIST: /* Forward iteration only */ return slist_iter_has_next(si->u.sli); @@ -693,6 +808,8 @@ switch (si->type) { case SEQUENCE_GSLIST: case SEQUENCE_GLIST: + case SEQUENCE_PSLIST: + case SEQUENCE_PLIST: break; case SEQUENCE_LIST: list_iter_free(&si->u.li);
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/sequence.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/sequence.h
Changed
@@ -36,9 +36,11 @@ #include "common.h" +#include "hashlist.h" #include "list.h" +#include "plist.h" +#include "pslist.h" #include "slist.h" -#include "hashlist.h" #include "vector.h" /** @@ -51,6 +53,8 @@ SEQUENCE_SLIST, /**< slist_t */ SEQUENCE_HLIST, /**< hash_list_t */ SEQUENCE_VECTOR, /**< vector_t */ + SEQUENCE_PLIST, /**< plist_t */ + SEQUENCE_PSLIST, /**< pslist_t */ SEQUENCE_MAXTYPE }; @@ -71,6 +75,8 @@ slist_t *sl; hash_list_t *hl; vector_t *vec; + plist_t *pl; + pslist_t *psl; } u; }; @@ -81,39 +87,43 @@ * Creation interface. */ -sequence_t *sequence_create_from_gslist(GSList *); sequence_t *sequence_create_from_glist(GList *); +sequence_t *sequence_create_from_gslist(GSList *); +sequence_t *sequence_create_from_hash_list(hash_list_t *); sequence_t *sequence_create_from_list(list_t *); +sequence_t *sequence_create_from_plist(plist_t *); +sequence_t *sequence_create_from_pslist(pslist_t *); sequence_t *sequence_create_from_slist(slist_t *); -sequence_t *sequence_create_from_hash_list(hash_list_t *); sequence_t *sequence_create_from_vector(vector_t *); -sequence_t *sequence_fill_from_gslist(sequence_t *, GSList *); sequence_t *sequence_fill_from_glist(sequence_t *, GList *); +sequence_t *sequence_fill_from_gslist(sequence_t *, GSList *); +sequence_t *sequence_fill_from_hash_list(sequence_t *, hash_list_t *); sequence_t *sequence_fill_from_list(sequence_t *, list_t *); +sequence_t *sequence_fill_from_plist(sequence_t *, plist_t *); +sequence_t *sequence_fill_from_pslist(sequence_t *, pslist_t *); sequence_t *sequence_fill_from_slist(sequence_t *, slist_t *); -sequence_t *sequence_fill_from_hash_list(sequence_t *, hash_list_t *); sequence_t *sequence_fill_from_vector(sequence_t *, vector_t *); /** * Public sequence interface. */ -gpointer sequence_implementation(const sequence_t *); -gpointer sequence_release(sequence_t **); +void *sequence_implementation(const sequence_t *); +void *sequence_release(sequence_t **); const char *sequence_type_to_string(const sequence_t *); void sequence_destroy(sequence_t *); -gboolean sequence_is_empty(const sequence_t *); +bool sequence_is_empty(const sequence_t *); size_t sequence_count(const sequence_t *s); void sequence_foreach(const sequence_t *s, GFunc func, void *data); sequence_iter_t *sequence_forward_iterator(const sequence_t *); -gboolean sequence_iter_has_next(const sequence_iter_t *); -gpointer sequence_iter_next(sequence_iter_t *); -sequence_iter_t *sequence_backward_iterator(const sequence_t *, gboolean); -gboolean sequence_iter_has_previous(const sequence_iter_t *); -gpointer sequence_iter_previous(sequence_iter_t *); +bool sequence_iter_has_next(const sequence_iter_t *); +void *sequence_iter_next(sequence_iter_t *); +sequence_iter_t *sequence_backward_iterator(const sequence_t *, bool); +bool sequence_iter_has_previous(const sequence_iter_t *); +void *sequence_iter_previous(sequence_iter_t *); void sequence_iterator_release(sequence_iter_t **); #endif /* _sequence_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/setproctitle.c
Added
@@ -0,0 +1,90 @@ +/* + * Copyright (c) 2003, 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Default setproctitle() for systems lacking it. + * + * @author Raphael Manfredi + * @date 2003, 2015 + */ + +#include "common.h" + +#ifndef HAS_SETPROCTITLE + +#include "setproctitle.h" + +#define SETPROCTITLE_SOURCE /* For progname_arg_*() to be visible */ + +#include "buf.h" +#include "progname.h" + +#include "override.h" /* Must be the last header included */ + +/** + * Set process title, for the ps(1) command to report an updated title. + * + * The title is set from the executable's name, followed by the result of a + * printf(3) style expansion of the arguments as specified by the fmt argument. + * + * If the fmt argument begins with a ``-'' character, the executable's name + * is skipped. + * + * If fmt is NULL, the original process title is restored. + */ +void +setproctitle(const char *fmt, ...) +{ + va_list args; + char *start; + size_t len; + buf_t *b, bs; + + start = progname_args_start(); + len = progname_args_size(); + + if (0 == len) + return; + + b = buf_init(&bs, start, len); + memset(start, 0, len); + + va_start(args, fmt); + + if (NULL == fmt) { + buf_printf(b, "%s", progstart_arg(0)); + } else if ('-' == *fmt) { + buf_vprintf(b, fmt + 1, args); + } else { + buf_printf(b, "%s ", getprogname()); + buf_vcatf(b, fmt, args); + } + + va_end(args); +} +#endif /* !HAS_SETPROCTITLE */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/setproctitle.h
Added
@@ -0,0 +1,47 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * String vector array utilities. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#ifndef _setproctitle_h_ +#define _setproctitle_h_ + +/* + * Public interface. + */ + +#ifndef HAS_SETPROCTITLE +void setproctitle(const char *fmt, ...) G_PRINTF(1, 2); +#endif + +#endif /* _setproctitle_h_ */ + +/* vi: set ts=4: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/sha1.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/sha1.c
Changed
@@ -1,7 +1,7 @@ /* * This file comes from RFC 3174. Inclusion in gtk-gnutella is: * - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2015 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -56,10 +56,12 @@ * a multiple of the size of an 8-bit character. * * @note - * This file comes from RFC 3174. Inclusion in gtk-gnutella is: + * This file comes from RFC 3174. Inclusion in gtk-gnutella with additional + * optimizations and adaptation to coding standards and specific library + * routines were made by Raphael Manfredi. * * @author Raphael Manfredi - * @date 2002-2003 + * @date 2002-2003, 2015 */ #include "common.h" @@ -68,21 +70,17 @@ #include "misc.h" /* For RCSID */ #include "override.h" /* Must be the last header included */ -/** - * Define the SHA1 circular left shift macro. - */ -#define SHA1CircularShift(bits,word) \ - (((word) << (bits)) | ((word) >> (32-(bits)))) +#define SHA1_BLEN 64 /**< Message block length */ /* Local Function Prototyptes */ -void SHA1PadMessage(SHA1Context *); -void SHA1ProcessMessageBlock(SHA1Context *); +static void SHA1_pad_message(SHA1_context *); +static void SHA1_process_message_block(SHA1_context *, const void *mblock); /** - * SHA1Reset + * SHA1_reset * * Description: - * This function will initialize the SHA1Context in preparation + * This function will initialize the SHA1_context in preparation * for computing a new SHA1 message digest. * * Parameters: @@ -93,84 +91,116 @@ * sha Error Code. * */ -int SHA1Reset(SHA1Context *context) +int +SHA1_reset(SHA1_context *context) { - if (!context) - { - return shaNull; - } + if (!context) + return SHA_NULL; - context->Length = 0; - context->Message_Block_Index = 0; + /* + * We rely on mblock being aligned on a 32-bit boundary, to be able + * to cast it to a uint32 * in SHA1_process_message_block(). + */ + STATIC_ASSERT(0 == offsetof(struct SHA1_context, mblock) % 4); - context->Intermediate_Hash0 = 0x67452301; - context->Intermediate_Hash1 = 0xEFCDAB89; - context->Intermediate_Hash2 = 0x98BADCFE; - context->Intermediate_Hash3 = 0x10325476; - context->Intermediate_Hash4 = 0xC3D2E1F0; + ZERO(context); - context->Computed = 0; - context->Corrupted = 0; + context->magic = SHA1_CONTEXT_MAGIC; - return shaSuccess; + context->ihash0 = 0x67452301; + context->ihash1 = 0xEFCDAB89; + context->ihash2 = 0x98BADCFE; + context->ihash3 = 0x10325476; + context->ihash4 = 0xC3D2E1F0; + + return SHA_SUCCESS; } /** - * SHA1Result + * SHA1_result * * Description: * This function will return the 160-bit message digest into the - * Message_Digest array provided by the caller. + * digest array provided by the caller. * NOTE: The first octet of hash is stored in the 0th element, * the last octet of hash in the 19th element. * * Parameters: * context: in/out * The context to use to calculate the SHA-1 hash. - * Message_Digest: out + * digest: out * Where the digest is returned. * * Returns: * sha Error Code. + */ +int +SHA1_result(SHA1_context *context, struct sha1 *digest) +{ + unsigned i; + + SHA1_check(context); + + if (!context || !digest) + return SHA_NULL; + + if (context->corrupted) + return context->corrupted; + + if (!context->computed) { + SHA1_pad_message(context); + /* message may be sensitive, clear it out */ + ZERO(&context->mblock); + context->length = 0; /* and clear length */ + context->computed = TRUE; + } + + for (i = 0; i < sizeof digest->data; ++i) { + digest->datai = context->ihashi>>2 >> 8 * (3 - (i & 0x03)); + } + + return SHA_SUCCESS; +} + +/** + * SHA1_intermediate + * + * Description: + * This function will return the 160-bit hash of the data seen so far. + * It may be called at any time during data feeding and does not + * disrupt the context, which may get new data. + * + * NOTE: This routine is not part of the original SHA1 API. + * + * Parameters: + * context: in/out + * The context to use to calculate the SHA-1 hash. + * digest: out + * Where the current digest is returned. * + * Returns: + * sha Error Code. */ -int SHA1Result( SHA1Context *context, struct sha1 *Message_Digest) +int +SHA1_intermediate(const SHA1_context *context, struct sha1 *digest) { - unsigned i; - - if (!context || !Message_Digest) - { - return shaNull; - } - - if (context->Corrupted) - { - return context->Corrupted; - } - - if (!context->Computed) - { - SHA1PadMessage(context); - for(i=0; i<64; ++i) - { - /* message may be sensitive, clear it out */ - context->Message_Blocki = 0; - } - context->Length = 0; /* and clear length */ - context->Computed = 1; - } - - for(i = 0; i < sizeof Message_Digest->data; ++i) - { - Message_Digest->datai = context->Intermediate_Hashi>>2 - >> 8 * ( 3 - ( i & 0x03 ) ); - } - - return shaSuccess; + SHA1_context tmp; + int ret; + + SHA1_check(context); + + if (!context || !digest) + return SHA_NULL; + + tmp = *context; /* struct copy */ + ret = SHA1_result(&tmp, digest); + ZERO(&tmp); /* clear values on the stack */ + + return ret; } /** - * SHA1Input + * SHA1_input * * Description: * This function accepts an array of octets as the next portion @@ -187,66 +217,90 @@ * * Returns: * sha Error Code. - * */ -int SHA1Input( SHA1Context *context, - const void *data, - size_t length) +int +SHA1_input(SHA1_context *context, const void *data, size_t length) { - const unsigned char *message_array = data; - - if (!length) - { - return shaSuccess; - } - - if (!context || !message_array) - { - return shaNull; - } - - if (context->Computed) - { - context->Corrupted = shaStateError; - return shaStateError; - } - - if (context->Corrupted) - { - return context->Corrupted; - } - while(length-- && !context->Corrupted) - { - context->Message_Blockcontext->Message_Block_Index++ = - (*message_array & 0xFF); - - context->Length += 8; - if (context->Length < 8) - { - /* Message is too long */ - context->Corrupted = 1; - } - - if (context->Message_Block_Index == 64) - { - SHA1ProcessMessageBlock(context); - } - - message_array++; - } - - return shaSuccess; + const uint8 *mp = data; /* Pointer into message, viewed as byte array */ + + SHA1_check(context); + + if G_UNLIKELY(0 == length) + return SHA_SUCCESS; + + if G_UNLIKELY(NULL == context || NULL == data) + return SHA_NULL; + + if G_UNLIKELY(context->computed) { + context->corrupted = SHA_STATE_ERROR; + return SHA_STATE_ERROR; + } + + if G_UNLIKELY(context->corrupted) + return SHA_STATE_ERROR; + + /* + * Optimization: if the data block is aligned on a 32-bit boundary and + * is at least 64-byte long, we can avoid moving data around and feed + * them directly to SHA1_process_message_block(), as long as there are + * no pending bytes in the context. This will likely be happening when + * large chunks of data are fed to the routine, e.g. when processing a file. + * --RAM, 2015-03-14 + */ + + if G_UNLIKELY(0 != context->midx || 0 != pointer_to_long(mp) % 4) + goto slowpath; + +fastpath: + for (/**/; length >= SHA1_BLEN; mp += SHA1_BLEN, length -= SHA1_BLEN) { + context->length += 8 * SHA1_BLEN; /* Counts bits, not bytes */ + + if G_UNLIKELY(context->length < 8 * SHA1_BLEN) { + /* Message is too long */ + context->corrupted = SHA_INPUT_TOO_LONG; + return SHA_INPUT_TOO_LONG; + } + + SHA1_process_message_block(context, mp); + } + + /* FALL THROUGH */ + + /* + * Normal slower processing (requires byte-copying to a message buffer). + */ + +slowpath: + while (length--) { + context->mblockcontext->midx++ = *mp++; + context->length += 8; /* This counts bits, not bytes */ + + if G_UNLIKELY(context->length < 8) { + /* Message is too long */ + context->corrupted = SHA_INPUT_TOO_LONG; + return SHA_INPUT_TOO_LONG; + } + + if G_UNLIKELY(SHA1_BLEN == context->midx) { + SHA1_process_message_block(context, context->mblock); + if (length >= SHA1_BLEN && 0 == pointer_to_long(mp) % 4) + goto fastpath; /* Can use faster processing now */ + } + } + + return SHA_SUCCESS; } /** - * SHA1ProcessMessageBlock + * SHA1_process_message_block * * Description: * This function will process the next 512 bits of the message - * stored in the Message_Block array. + * stored in the mblock parameter. * * Parameters: - * None. + * mblock: in + * Start of the next 64 message bytes to process * * Returns: * Nothing. @@ -255,32 +309,32 @@ * Many of the variable names in this code, especially the * single character names, were used because those were the * names used in the publication. - * - * */ -G_GNUC_HOT void SHA1ProcessMessageBlock(SHA1Context *context) +static void G_HOT +SHA1_process_message_block(SHA1_context *context, const void *mblock) { - const guint32 K = { /* Constants defined in SHA-1 */ - 0x5A827999, - 0x6ED9EBA1, - 0x8F1BBCDC, - 0xCA62C1D6 - }; - int t; /* Loop counter */ - guint32 temp; /* Temporary word value */ - guint32 W80; /* Word sequence */ - guint32 A, B, C, D, E; /* Word buffers */ - guint32 *wp; /* Pointer in word sequence */ - - /* - * Initialize the first 16 words in the array W - */ - -#define INIT(x) \ - Wx = (context->Message_Block(x) * 4 << 24) | \ - (context->Message_Block(x) * 4 + 1 << 16) | \ - (context->Message_Block(x) * 4 +2 << 8) | \ - (context->Message_Block(x) * 4 +3) + const uint32 K = { /* Constants defined in SHA-1 */ + 0x5A827999, + 0x6ED9EBA1, + 0x8F1BBCDC, + 0xCA62C1D6 + }; + int t; /* Loop counter */ + uint32 W80; /* Word sequence */ + uint32 a, b, c, d, e; /* Word buffers */ + uint32 *wp; /* Pointer in word sequence */ + + /* + * Initialize the first 16 words in the array W + */ + +#ifdef IS_LITTLE_ENDIAN +#define INIT(x) Wx = UINT32_SWAP(*wp); wp++ +#else +#define INIT(x) Wx = *wp++ +#endif + + wp = (uint32 *) mblock; /* Unrolling this loop saves time */ INIT(0); INIT(1); INIT(2); INIT(3); @@ -289,7 +343,7 @@ INIT(12); INIT(13); INIT(14); INIT(15); #define CRUNCH \ - *wp = SHA1CircularShift(1,wp-3 ^ wp-8 ^ wp-14 ^ wp-16) + *wp = UINT32_ROTL(wp-3 ^ wp-8 ^ wp-14 ^ wp-16, 1) wp = &W16; CRUNCH; wp++; /* 16 */ @@ -298,7 +352,7 @@ CRUNCH; wp++; /* 19 */ /* Fully unrolling this loop does NOT save time due to I-cache misses */ - for (t = 20; t < 80; t += 10) { + for (t = 20; t < 80; t += 10) { CRUNCH; wp++; /* t+0 */ CRUNCH; wp++; /* t+1 */ CRUNCH; wp++; /* t+2 */ @@ -309,127 +363,150 @@ CRUNCH; wp++; /* t+7 */ CRUNCH; wp++; /* t+8 */ CRUNCH; wp++; /* t+9 */ - } + } - A = context->Intermediate_Hash0; - B = context->Intermediate_Hash1; - C = context->Intermediate_Hash2; - D = context->Intermediate_Hash3; - E = context->Intermediate_Hash4; + a = context->ihash0; + b = context->ihash1; + c = context->ihash2; + d = context->ihash3; + e = context->ihash4; wp = &W0; -#define ROTATE(k, mix) \ - temp = SHA1CircularShift(5,A) + (mix) + E + *wp++ + Kk; \ - E = D; D = C; \ - C = SHA1CircularShift(30,B); \ - B = A; A = temp - - /* Optimizing "(B & C) | (~B & D)" into "D ^ (B & (C ^ D))" */ - ROTATE(0, D ^ (B & (C ^ D))); - ROTATE(0, D ^ (B & (C ^ D))); - ROTATE(0, D ^ (B & (C ^ D))); - ROTATE(0, D ^ (B & (C ^ D))); - ROTATE(0, D ^ (B & (C ^ D))); - ROTATE(0, D ^ (B & (C ^ D))); - ROTATE(0, D ^ (B & (C ^ D))); - ROTATE(0, D ^ (B & (C ^ D))); - ROTATE(0, D ^ (B & (C ^ D))); - ROTATE(0, D ^ (B & (C ^ D))); - ROTATE(0, D ^ (B & (C ^ D))); - ROTATE(0, D ^ (B & (C ^ D))); - ROTATE(0, D ^ (B & (C ^ D))); - ROTATE(0, D ^ (B & (C ^ D))); - ROTATE(0, D ^ (B & (C ^ D))); - ROTATE(0, D ^ (B & (C ^ D))); - ROTATE(0, D ^ (B & (C ^ D))); - ROTATE(0, D ^ (B & (C ^ D))); - ROTATE(0, D ^ (B & (C ^ D))); - ROTATE(0, D ^ (B & (C ^ D))); - - ROTATE(1, B ^ C ^ D); - ROTATE(1, B ^ C ^ D); - ROTATE(1, B ^ C ^ D); - ROTATE(1, B ^ C ^ D); - ROTATE(1, B ^ C ^ D); - ROTATE(1, B ^ C ^ D); - ROTATE(1, B ^ C ^ D); - ROTATE(1, B ^ C ^ D); - ROTATE(1, B ^ C ^ D); - ROTATE(1, B ^ C ^ D); - ROTATE(1, B ^ C ^ D); - ROTATE(1, B ^ C ^ D); - ROTATE(1, B ^ C ^ D); - ROTATE(1, B ^ C ^ D); - ROTATE(1, B ^ C ^ D); - ROTATE(1, B ^ C ^ D); - ROTATE(1, B ^ C ^ D); - ROTATE(1, B ^ C ^ D); - ROTATE(1, B ^ C ^ D); - ROTATE(1, B ^ C ^ D); - - /* Optimizing "(B & C) | (B & D)" into "B & (C | D)" */ - ROTATE(2, (B & (C | D)) | (C & D)); - ROTATE(2, (B & (C | D)) | (C & D)); - ROTATE(2, (B & (C | D)) | (C & D)); - ROTATE(2, (B & (C | D)) | (C & D)); - ROTATE(2, (B & (C | D)) | (C & D)); - ROTATE(2, (B & (C | D)) | (C & D)); - ROTATE(2, (B & (C | D)) | (C & D)); - ROTATE(2, (B & (C | D)) | (C & D)); - ROTATE(2, (B & (C | D)) | (C & D)); - ROTATE(2, (B & (C | D)) | (C & D)); - ROTATE(2, (B & (C | D)) | (C & D)); - ROTATE(2, (B & (C | D)) | (C & D)); - ROTATE(2, (B & (C | D)) | (C & D)); - ROTATE(2, (B & (C | D)) | (C & D)); - ROTATE(2, (B & (C | D)) | (C & D)); - ROTATE(2, (B & (C | D)) | (C & D)); - ROTATE(2, (B & (C | D)) | (C & D)); - ROTATE(2, (B & (C | D)) | (C & D)); - ROTATE(2, (B & (C | D)) | (C & D)); - ROTATE(2, (B & (C | D)) | (C & D)); - - ROTATE(3, B ^ C ^ D); - ROTATE(3, B ^ C ^ D); - ROTATE(3, B ^ C ^ D); - ROTATE(3, B ^ C ^ D); - ROTATE(3, B ^ C ^ D); - ROTATE(3, B ^ C ^ D); - ROTATE(3, B ^ C ^ D); - ROTATE(3, B ^ C ^ D); - ROTATE(3, B ^ C ^ D); - ROTATE(3, B ^ C ^ D); - ROTATE(3, B ^ C ^ D); - ROTATE(3, B ^ C ^ D); - ROTATE(3, B ^ C ^ D); - ROTATE(3, B ^ C ^ D); - ROTATE(3, B ^ C ^ D); - ROTATE(3, B ^ C ^ D); - ROTATE(3, B ^ C ^ D); - ROTATE(3, B ^ C ^ D); - ROTATE(3, B ^ C ^ D); - ROTATE(3, B ^ C ^ D); - - context->Intermediate_Hash0 += A; - context->Intermediate_Hash1 += B; - context->Intermediate_Hash2 += C; - context->Intermediate_Hash3 += D; - context->Intermediate_Hash4 += E; - - context->Message_Block_Index = 0; +#define ROTATE(k, A, B, C, D, E, mix) \ + E += UINT32_ROTL(A, 5) + mix(B, C, D) + *wp++ + Kk; \ + B = UINT32_ROTL(B, 30); + + /* + * Optimizing "(B & C) | (~B & D)" into "D ^ (B & (C ^ D))" in M0 + * Optimizing "(B & C) | (B & D)" into "B & (C | D)" in M2 + */ +#define M0(B, C, D) (D ^ (B & (C ^ D))) +#define M1(B, C, D) (B ^ C ^ D) +#define M2(B, C, D) ((B & (C | D)) | (C & D)) +#define M3(B, C, D) (B ^ C ^ D) + + /* + * Another optimization: get rid of the temporary variable to circulate + * the value. Instead, we rotate the macro arguments, saving one + * assignment per ROTATE() macro. + * --RAM, 2015-03-13 + */ + + ROTATE(0, a, b, c, d, e, M0); + ROTATE(0, e, a, b, c, d, M0); + ROTATE(0, d, e, a, b, c, M0); + ROTATE(0, c, d, e, a, b, M0); + ROTATE(0, b, c, d, e, a, M0); + + ROTATE(0, a, b, c, d, e, M0); + ROTATE(0, e, a, b, c, d, M0); + ROTATE(0, d, e, a, b, c, M0); + ROTATE(0, c, d, e, a, b, M0); + ROTATE(0, b, c, d, e, a, M0); + + ROTATE(0, a, b, c, d, e, M0); + ROTATE(0, e, a, b, c, d, M0); + ROTATE(0, d, e, a, b, c, M0); + ROTATE(0, c, d, e, a, b, M0); + ROTATE(0, b, c, d, e, a, M0); + + ROTATE(0, a, b, c, d, e, M0); + ROTATE(0, e, a, b, c, d, M0); + ROTATE(0, d, e, a, b, c, M0); + ROTATE(0, c, d, e, a, b, M0); + ROTATE(0, b, c, d, e, a, M0); + + ROTATE(1, a, b, c, d, e, M1); + ROTATE(1, e, a, b, c, d, M1); + ROTATE(1, d, e, a, b, c, M1); + ROTATE(1, c, d, e, a, b, M1); + ROTATE(1, b, c, d, e, a, M1); + + ROTATE(1, a, b, c, d, e, M1); + ROTATE(1, e, a, b, c, d, M1); + ROTATE(1, d, e, a, b, c, M1); + ROTATE(1, c, d, e, a, b, M1); + ROTATE(1, b, c, d, e, a, M1); + + ROTATE(1, a, b, c, d, e, M1); + ROTATE(1, e, a, b, c, d, M1); + ROTATE(1, d, e, a, b, c, M1); + ROTATE(1, c, d, e, a, b, M1); + ROTATE(1, b, c, d, e, a, M1); + + ROTATE(1, a, b, c, d, e, M1); + ROTATE(1, e, a, b, c, d, M1); + ROTATE(1, d, e, a, b, c, M1); + ROTATE(1, c, d, e, a, b, M1); + ROTATE(1, b, c, d, e, a, M1); + + ROTATE(2, a, b, c, d, e, M2); + ROTATE(2, e, a, b, c, d, M2); + ROTATE(2, d, e, a, b, c, M2); + ROTATE(2, c, d, e, a, b, M2); + ROTATE(2, b, c, d, e, a, M2); + + ROTATE(2, a, b, c, d, e, M2); + ROTATE(2, e, a, b, c, d, M2); + ROTATE(2, d, e, a, b, c, M2); + ROTATE(2, c, d, e, a, b, M2); + ROTATE(2, b, c, d, e, a, M2); + + ROTATE(2, a, b, c, d, e, M2); + ROTATE(2, e, a, b, c, d, M2); + ROTATE(2, d, e, a, b, c, M2); + ROTATE(2, c, d, e, a, b, M2); + ROTATE(2, b, c, d, e, a, M2); + + ROTATE(2, a, b, c, d, e, M2); + ROTATE(2, e, a, b, c, d, M2); + ROTATE(2, d, e, a, b, c, M2); + ROTATE(2, c, d, e, a, b, M2); + ROTATE(2, b, c, d, e, a, M2); + + ROTATE(3, a, b, c, d, e, M3); + ROTATE(3, e, a, b, c, d, M3); + ROTATE(3, d, e, a, b, c, M3); + ROTATE(3, c, d, e, a, b, M3); + ROTATE(3, b, c, d, e, a, M3); + + ROTATE(3, a, b, c, d, e, M3); + ROTATE(3, e, a, b, c, d, M3); + ROTATE(3, d, e, a, b, c, M3); + ROTATE(3, c, d, e, a, b, M3); + ROTATE(3, b, c, d, e, a, M3); + + ROTATE(3, a, b, c, d, e, M3); + ROTATE(3, e, a, b, c, d, M3); + ROTATE(3, d, e, a, b, c, M3); + ROTATE(3, c, d, e, a, b, M3); + ROTATE(3, b, c, d, e, a, M3); + + ROTATE(3, a, b, c, d, e, M3); + ROTATE(3, e, a, b, c, d, M3); + ROTATE(3, d, e, a, b, c, M3); + ROTATE(3, c, d, e, a, b, M3); + ROTATE(3, b, c, d, e, a, M3); + + context->ihash0 += a; + context->ihash1 += b; + context->ihash2 += c; + context->ihash3 += d; + context->ihash4 += e; + + context->midx = 0; } - /** - * SHA1PadMessage + * SHA1_pad_message * * Description: * According to the standard, the message must be padded to an even * 512 bits. The first padding bit must be a '1'. The last 64 * bits represent the length of the original message. All bits in * between should be 0. This function will pad the message - * according to those rules by filling the Message_Block array + * according to those rules by filling the mblock array * accordingly. It will also call the ProcessMessageBlock function * provided appropriately. When it returns, it can be assumed that * the message digest has been computed. @@ -437,49 +514,44 @@ * Parameters: * context: in/out * The context to pad - * ProcessMessageBlock: in - * The appropriate SHA*ProcessMessageBlock function * Returns: * Nothing. - * */ - -void SHA1PadMessage(SHA1Context *context) +static void +SHA1_pad_message(SHA1_context *context) { - /* - * Check to see if the current message block is too small to hold - * the initial padding bits and length. If so, we will pad the - * block, process it, and then continue padding into a second - * block. + /* + * Check to see if the current message block is too small to hold + * the initial padding bits and length. If so, we will pad the + * block, process it, and then continue padding into a second block. */ - if (context->Message_Block_Index > 55) - { - context->Message_Blockcontext->Message_Block_Index++ = 0x80; - while(context->Message_Block_Index < 64) - { - context->Message_Blockcontext->Message_Block_Index++ = 0; - } - - SHA1ProcessMessageBlock(context); - - while(context->Message_Block_Index < 56) - { - context->Message_Blockcontext->Message_Block_Index++ = 0; - } - } - else - { - context->Message_Blockcontext->Message_Block_Index++ = 0x80; - while(context->Message_Block_Index < 56) - { - context->Message_Blockcontext->Message_Block_Index++ = 0; - } - } - - /* - * Store the message length as the last 8 octets - */ - poke_be64(&context->Message_Block56, context->Length); - SHA1ProcessMessageBlock(context); +#define SHA1_BUP (SHA1_BLEN - 8) /* Upper boundary before 64-bit length */ + + if (context->midx >= SHA1_BUP) { + context->mblockcontext->midx++ = 0x80; + while (context->midx < SHA1_BLEN) { + context->mblockcontext->midx++ = 0; + } + + SHA1_process_message_block(context, context->mblock); + + while (context->midx < SHA1_BUP) { + context->mblockcontext->midx++ = 0; + } + } else { + context->mblockcontext->midx++ = 0x80; + while (context->midx < SHA1_BUP) { + context->mblockcontext->midx++ = 0; + } + } + + /* + * Store the message length as the last 8 octets + */ + + poke_be64(&context->mblockSHA1_BUP, context->length); + SHA1_process_message_block(context, context->mblock); } + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/sha1.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/sha1.h
Changed
@@ -32,52 +32,76 @@ * If you do not have the ISO standard stdint.h header file, then you * must typdef the following: * - * name meaning - * guint32 unsigned 32 bit integer - * guint8 unsigned 8 bit integer (i.e., unsigned char) - * int integer of >= 16 bits + * name meaning + * uint32 unsigned 32 bit integer + * uint8 unsigned 8 bit integer (i.e., unsigned char) + * int integer of >= 16 bits * */ #ifndef _SHA_enum_ #define _SHA_enum_ -enum +enum SHA_code { - shaSuccess = 0, - shaNull, /**< Null pointer parameter */ - shaInputTooLong, /**< input data too long */ - shaStateError /**< called Input after Result */ + SHA_SUCCESS = 0, /**< OK */ + SHA_NULL, /**< Null pointer parameter */ + SHA_INPUT_TOO_LONG, /**< input data too long */ + SHA_STATE_ERROR /**< called Input after Result */ }; #endif -struct sha1; +typedef struct sha1 { + char dataSHA1_RAW_SIZE; +} sha1_t; + +enum SHA1_context_magic { SHA1_CONTEXT_MAGIC = 0x73accbce }; /** * This structure will hold context information for the SHA-1 * hashing operation */ -typedef struct SHA1Context -{ - guint32 Intermediate_HashSHA1_RAW_SIZE / 4; /* Message Digest */ - - guint64 Length; /* Message length in bits */ +typedef struct SHA1_context { + enum SHA1_context_magic magic; /* Magic number */ + uint32 ihashSHA1_RAW_SIZE / 4; /* Intermediate Message Digest */ + uint64 length; /* Message length in bits */ + int midx; /* Index into message block array */ + uint8 mblock64; /* 512-bit message blocks */ + bool computed; /* Is the digest computed? */ + enum SHA_code corrupted; /* Is the message digest corrupted? */ +} SHA1_context; - /* Index into message block array */ - int Message_Block_Index; - guint8 Message_Block64; /* 512-bit message blocks */ - - int Computed; /* Is the digest computed? */ - int Corrupted; /* Is the message digest corrupted? */ -} SHA1Context; +static inline void +SHA1_check(const SHA1_context * const ctx) +{ + g_assert(NULL == ctx || SHA1_CONTEXT_MAGIC == ctx->magic); +} /* * Function Prototypes */ +int SHA1_reset(SHA1_context *); +int SHA1_input(SHA1_context *, const void *, size_t); +int SHA1_result(SHA1_context *, struct sha1 *digest); +int SHA1_intermediate(const SHA1_context *, struct sha1 *digest); -int SHA1Reset( SHA1Context *); -int SHA1Input( SHA1Context *, const void *, size_t); -int SHA1Result( SHA1Context *, struct sha1 *Message_Digest); +/** + * Feed the SHA1 context with the content of a variable. + */ +#define SHA1_INPUT(c,v) SHA1_input((c), &(v), sizeof(v)) + +/** + * Compute the SHA1 digest of (structure) ``x'' into ``d''. + * + * ``x'' is the data structure, and ``sizeof(x)'' gives the size to hash. + * ``d'' is the address of the output digest (sha1_t *). + */ +#define SHA1_COMPUTE(x,d) G_STMT_START { \ + SHA1_context c_; \ + SHA1_reset(&c_); \ + SHA1_input(&c_, &(x), sizeof(x)); \ + SHA1_result(&c_, (d)); \ +} G_STMT_END #endif /* _sha1_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/shuffle.c
Added
@@ -0,0 +1,215 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Random array shuffling. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#include <math.h> /* For log() */ + +#include "shuffle.h" + +#include "arc4random.h" +#include "cmwc.h" +#include "mtwist.h" +#include "random.h" +#include "unsigned.h" +#include "well.h" + +#include "override.h" /* Must be the last header included */ + +/** + * Randomly shuffle array in-place using supplied random function. + * + * @param rf the random function to use + * @param b the base of the array + * @param n amount of items in array + * @param s size of items in array + */ +static void +shuffle_internal(random_fn_t rf, void *b, size_t n, size_t s) +{ + size_t i; + + g_assert(rf != NULL); + g_assert(b != NULL); + g_assert(size_is_non_negative(n)); + g_assert(size_is_positive(s)); + + if G_UNLIKELY(n <= 1U) + return; + + /* + * Shuffle the array using Knuth's modern version of the + * Fisher and Yates algorithm. + */ + + for (i = n - 1; i > 0; i--) { + size_t j = random_upto(rf, i); + void *iptr, *jptr; + + /* Swap i-th and j-th items */ + + iptr = ptr_add_offset(b, i * s); + jptr = ptr_add_offset(b, j * s); + + SWAP(iptr, jptr, s); /* i-th item now selected */ + } +} + +/** + * Generate a random number in the range 0 to 2^32-1, inclusive. + * + * Random number generator combining sequences of the Mersenne Twister and of + * the CMWC4096 PRNGs randomly using WELL1094b to select the source. + */ +uint32 +shuffle_thread_rand(void) +{ + /* + * 1/4 of the numbers come from the Mersenne Twister, 3/4 from CMWC4096. + */ + + return (well_thread_rand() & 3) ? cmwc_thread_rand() : mt_thread_rand(); +} + +/** + * Randomly shuffle array in-place. + * + * @param b the base of the array + * @param n amount of items in array + * @param s size of items in array + */ +void +shuffle(void *b, size_t n, size_t s) +{ + /* + * After benchmarking, mt_rand() is faster than arc4random() hence + * we now use the former as the default random function. + * --RAM, 2012-12-15 + * + * For shuffling, we need many random numbers and it pays to use the + * mt_thread_rand() routine, which relies on a thread-private pool. + * --RAM, 2013-09-29 + * + * To make sure we can truly randomly shuffle the array, we need a random + * number generator whose period is greater than the amount of permutations + * of that array (otherwise some permutations will never come out). + * The period of the Mersenne Twister is 2**19937 - 1, so we can safely + * permute arrays of 2080 items or less (since 2081! is the first number + * greater than its period). + * + * Between 2081 and 10945 entries, we can use CMWC4096, which has a + * larger period of about 2**131086 - 1. For arrays even larger than + * that, we use a slower random function which randomly combines + * mt_thread_rand() and cmwc_thread_rand() using the WELL PRNG to select + * one of the two algorithms. + * --RAM, 2014-04-11 + */ + + if (n <= 2080) + shuffle_internal(mt_thread_rand, b, n, s); /* Perfect */ + else if (n <= 10945) + shuffle_internal(cmwc_thread_rand, b, n, s); /* Perfect */ + else { + shuffle_internal(shuffle_thread_rand, b, n, s); + + /* + * Combining CMWC4096 and the Mersenne Twister with WELL1024b gives + * us about 152047 bits of context. That allows us to be able to + * reach all the permutations of sets up to roughly 12450 items, + * since 12450! has an upper bound of 2**151415. + * + * After that, we use the technique of re-shuffling to increase the + * amount of reacheable permutations. + * + * Each re-shuffling with shuffle_thread_rand() is going to explore + * a new set of permutations, but we need to conditionally reshuffle, + * otherwise we're bound by the initial context of our PRNGs and do + * not improve on anything. Also, we need to draw randomness from + * another pool to benefit from extra bits of entropy, hence we use + * arc4random() to provide us the additional randomness. + * + * How many re-shuffling do we need to do? We know we will never be + * able to explore all the possible permutations when "n" (the amount + * of items in the array) becomes that large anyway, but we want to + * increase the reacheable set without being too expensive from a + * computation standpoint: as "n" grows, so does the shuffling time, + * which is in O(n). + * + * Since "n" starts to be large, we can approximate the computation of + * n! using Stirling's formula, retaining only the largest term: + * + * ln(n!) ~ n * ln(n) - n + * + * So we compute the total amount of bits of context we would need + * by computing the base-2 logarithm of n!, approximated by Stirling. + * And we linearily decrease the amount by 152047/2 for each additional + * re-shuffling we do, with a probability of 70%. We stop either when + * we have exhausted the amount of bits we needed or when we have no + * luck in our random check. + * + * The 0.7 probability is our safeguard to avoid a O(n**2) complexity: + * it will quickly drop to 0, and the probability of doing more than + * 20 re-shuffling is about 0.08%. The 151406 constant below is the + * approximation of ln2(12450!) given by Stirling (the exact value + * being 151415 here). + */ + + if (n > 12450) { + double bits = (n * log(n) - n) / log(2) - 151406.0; + + while (bits > 0.0 && random_upto(arc4random, 99) < 70) { + bits -= 152047.0 / 2.0; /* Pure conjecture */ + shuffle_internal(shuffle_thread_rand, b, n, s); + } + } + } +} + +/** + * Randomly shuffle array in-place using supplied random function. + * + * @param rf the random function to use (NULL to use defaults) + * @param b the base of the array + * @param n amount of items in array + * @param s size of items in array + */ +void +shuffle_with(random_fn_t rf, void *b, size_t n, size_t s) +{ + if (NULL == rf) + shuffle(b, n, s); + else + shuffle_internal(rf, b, n, s); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/shuffle.h
Added
@@ -0,0 +1,69 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Random array shuffling. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _shuffle_h_ +#define _shuffle_h_ + +/** + * Shuffle specified array ``a'' in-place. + */ +#define SHUFFLE_ARRAY(a) G_STMT_START { \ + shuffle((a), N_ITEMS(a), sizeof((a)0)); \ +} G_STMT_END + +/** + * Shuffle first ``n'' items of array ``a'' in-place. + */ +#define SHUFFLE_ARRAY_N(a,n) G_STMT_START { \ + shuffle((a), (n), sizeof((a)0)); \ +} G_STMT_END + +/** + * Shuffle specified array ``a'' in-place with random function ``f''. + */ +#define SHUFFLE_ARRAY_WITH(f,a) G_STMT_START { \ + shuffle_with((f), (a), N_ITEMS(a), sizeof((a)0)); \ +} G_STMT_END + +/* + * Public interface. + */ + +void shuffle(void *b, size_t n, size_t s); +void shuffle_with(random_fn_t rf, void *b, size_t n, size_t s); + +uint32 shuffle_thread_rand(void); + +#endif /* _shuffle_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/signal.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/signal.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Raphael Manfredi + * Copyright (c) 2011-2012 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -25,25 +25,38 @@ * @ingroup lib * @file * - * Signal dispatching support. + * Signal dispatching and logging support. * * @author Raphael Manfredi - * @date 2011 + * @date 2011-2012 */ #include "common.h" /* For RCSID */ #include "signal.h" + +#include "atomic.h" +#include "buf.h" #include "ckalloc.h" #include "crash.h" +#include "dl_util.h" #include "glib-missing.h" /* For g_strlcpy() */ #include "log.h" #include "misc.h" +#include "mutex.h" +#include "once.h" +#include "registers.h" #include "str.h" +#include "stringify.h" +#include "thread.h" #include "unsigned.h" #include "override.h" /* Must be the last header included */ +#if 0 +#define SIGNAL_HANDLER_TRACE /* Trace install of signal handlers */ +#endif + #ifndef SIG_ERR #define SIG_ERR ((signal_handler_t) -1) #endif @@ -52,6 +65,27 @@ #define SIGNAL_CHUNK_RESERVE 512 /**< Critical amount reserved */ /** + * A signal stack is configured for each thread to be able to process SIGSEGV + * in order to detect stack overflows. + * + * This only works if the kernel supports sigaction() with the SA_ONSTACK flag. + * + * We need to leave enough room to be able to process, on that stack, the + * execution of the crash handler, possibly with a stack backtrace (which needs + * to allocate the backtracing buffer on the stack itself). + * + * Therefore, we need more stack requirements than the typical stack size + * which is defined to SIGSTKSZ. Experiments on a 64-bit linux kernel shows + * that SIGSTKSZ is too small (i.e. the signal stack overflows during the + * stack dump process, which corrupts memory since we don't trap signal stack + * overflows). + * + * Adding two additional pages (8K) is enough to cover the current needs. + * --RAM, 2013-09-10 + */ +#define SIGNAL_STACK_SIZE (SIGSTKSZ + 8192) + +/** * Table mapping a signal number with a symbolic name. * * Contrary to the signal_names below, this is using compiled constants @@ -68,19 +102,78 @@ #ifdef SIGTRAP D(SIGTRAP), #endif +#ifdef SIGHUP + D(SIGHUP), +#endif +#ifdef SIGEMT + D(SIGEMT), +#endif +#ifdef SIGQUIT + D(SIGQUIT), +#endif +#ifdef SIGALRM + D(SIGALRM), +#endif +#ifdef SIGPOLL + D(SIGPOLL), +#endif +#ifdef SIGURG + D(SIGURG), +#endif +#ifdef SIGIO + D(SIGIO), +#endif +#ifdef SIGSYS + D(SIGSYS), +#endif +#ifdef SIGCHLD + D(SIGCHLD), +#endif +#ifdef SIGVTALRM + D(SIGVTALRM), +#endif +#ifdef SIGUSR1 + D(SIGUSR1), +#endif +#ifdef SIGUSR2 + D(SIGUSR2), +#endif +#ifdef SIGPWR + D(SIGPWR), +#endif +#ifdef SIGLOST + D(SIGLOST), +#endif +#ifdef SIGXCPU + D(SIGXCPU), +#endif +#ifdef SIGXFSZ + D(SIGXFSZ), +#endif +#ifdef SIGUNUSED + D(SIGUNUSED), +#endif D(SIGABRT), + D(SIGINT), + D(SIGTERM), D(SIGFPE), + D(SIGPIPE), D(SIGILL), D(SIGSEGV) #undef D }; /** + * Cached signal names, from the signals table above. + */ +static const char *signal_strSIGNAL_COUNT; + +/** * Array mapping a signal number to a signal name (leading "SIG" ommitted). * This is used in case the signal is not found in the signals table. * There are SIG_COUNT entries in that array (also computed by Configure). */ -static char *signal_names = { SIG_NAME }; /* Computed by Configure */ +static const char *signal_names = { SIG_NAME }; /* Computed by Configure */ /** * Array recording signal handlers for signals. @@ -95,8 +188,133 @@ */ static ckhunk_t *sig_chunk; -static const char SIGNAL_NUM = "signal #"; -static const char SIG_PREFIX = "SIG"; +/* + * Cleanup routines to invoke when we receive uncaught fatal signals. + */ + +#define SIGNAL_CLEANUP 32 +static signal_cleanup_t sig_cleanupSIGNAL_CLEANUP; +static unsigned sig_cleanup_count; +static spinlock_t sig_cleanup_slk = SPINLOCK_INIT; + +static mutex_t signal_lock = MUTEX_INIT; + +/** + * Various "undefined" values for the PC register number. + * + * All strictly negative values indicate that the PC cannot be read from the + * machine context, a zero or positive value indicates an offset in the + * array of machine registers, wherever that is within the machine context. + */ +#define SIG_PC_UNKNOWN (-1) /* Unknown register offset */ +#define SIG_PC_MULTIPLE (-2) /* Multiple registers could match */ +#define SIG_PC_IMPOSSIBLE (-3) /* Impossible condition */ +#define SIG_PC_UNAVAILABLE (-4) /* Unavailable, we can't access registers */ +#define SIG_PC_HIDDEN (-5) /* PC hidden in opaque machine context */ + +/** + * The index of the general register in the machine context that holds + * the Program Counter, the PC. + * + * If the value is negative, the PC register number is unknown. + */ +static volatile sig_atomic_t sig_pc_regnum = SIG_PC_UNKNOWN; + +static sig_atomic_t in_signal_handlerTHREAD_MAX; +static bool in_safe_handlerTHREAD_MAX; +static once_flag_t signal_inited; +static bool signal_catch_segv; + +static void signal_uncaught(int signo); + +/** + * Is signal fatal if not trapped, according to traditional UNIX semantics? + * + * Fatal means that the process will not survive, whether it is simply + * terminated (SIGINT for instance) or terminated with a core dump (SIGQUIT). + */ +static bool +signal_is_fatal(int signo) +{ + switch (signo) { +#ifdef SIGHUP + case SIGHUP: return TRUE; +#endif + case SIGINT: return TRUE; +#ifdef SIGQUIT + case SIGQUIT: return TRUE; +#endif + case SIGILL: return TRUE; + case SIGABRT: return TRUE; + case SIGFPE: return TRUE; +#ifdef SIGKILL + case SIGKILL: return TRUE; /* But non-trappable */ +#endif +#ifdef SIGBUS + case SIGBUS: return TRUE; +#endif + case SIGSEGV: return TRUE; +#ifdef SIGPIPE + case SIGPIPE: return TRUE; +#endif +#ifdef SIGALRM + case SIGALRM: return TRUE; +#endif + case SIGTERM: return TRUE; +#ifdef SIGUSR1 + case SIGUSR1: return TRUE; +#endif +#ifdef SIGUSR2 + case SIGUSR2: return TRUE; +#endif +#ifdef SIGIO + case SIGIO: return TRUE; +#endif +#ifdef SIGTRAP + case SIGTRAP: return TRUE; +#endif +#ifdef SIGSYS + case SIGSYS: return TRUE; +#endif +#ifdef SIGPROF + /* + * SIGPROF needs special care: it is a harmful signal, if received and + * untrapped, but its trapping is done by the C startup when profiling + * is enabled and if we mark it harmful, we will immediately abort in + * signal_uncaught() when getting the first SIGPROF signal... + * + * Let's not mark it harmful, but the consequences are that if the user + * explicitly sends a SIGPROF to the process, emergency signal cleanup + * will not be performed. Since a user could always send a SIGKILL + * anyway, this is not deemed as a problem. + */ + case SIGPROF: return FALSE; +#endif +#ifdef SIGVTALRM + case SIGVTALRM: return TRUE; +#endif +#ifdef SIGXCPU + case SIGXCPU: return TRUE; +#endif +#ifdef SIGXFSZ + case SIGXFSZ: return TRUE; +#endif +#ifdef SIGLOST + case SIGLOST: return TRUE; +#endif + } + + /* + * Real-time signals always terminate a process if unhandled. + */ + +#ifdef SIGRTMIN + if (signo >= SIGRTMIN && signo <= SIGRTMAX) + return TRUE; +#endif + + return FALSE; /* Unknown signal, or known to not be harmful if ignored */ +} /** * Converts signal number to a name. @@ -110,14 +328,32 @@ const char * signal_name(int signo) { - static char sig_buf32; + buf_t *b, bs; unsigned i; - char *start; - size_t offset; - for (i = 0; i < G_N_ELEMENTS(signals); i++) { - if (signalsi.signo == signo) + /* + * Look in the cache first. + */ + + if G_LIKELY(UNSIGNED(signo) < SIGNAL_COUNT && NULL != signal_strsigno) + return signal_strsigno; + + /* + * Linear lookup in the table of known common signals. + * + * The result of the linear lookup is cached so that subsequent requests + * for the same signal from the signals array is immediately answered. + */ + + for (i = 0; i < N_ITEMS(signals); i++) { + if (signalsi.signo == signo) { + if G_LIKELY( + UNSIGNED(signo) < SIGNAL_COUNT && + NULL == signal_strsigno + ) + signal_strsigno = signalsi.name; /* Cache result */ return signalsi.name; + } } /* @@ -125,60 +361,660 @@ * There is no "SIG" prefix in names from this array. */ + if (signal_in_unsafe_handler()) { + static char sig_buf32; /* Do not allocate memory in handler */ + b = buf_init(&bs, sig_buf, sizeof sig_buf); + } else { + b = buf_private(G_STRFUNC, 32); + } + if (signo < SIG_COUNT && !is_strprefix(signal_namessigno, "NUM")) { - g_strlcpy(sig_buf, SIG_PREFIX, sizeof sig_buf); + buf_printf(b, "SIG%s", signal_namessigno); + } else { + buf_printf(b, "signal #%d", signo); + } + + return buf_data(b); +} + +/** + * Add a cleanup handler in case we receive a harmful uncaught signal. + * + * This is meant to release precious system resources that the kernel + * would not normally return when the process exits (e.g. all System V + * IPC resources, even when grabbed with IPC_PRIVATE). + */ +void +signal_cleanup_add(signal_cleanup_t cleanup) +{ + unsigned i, idx; + + spinlock(&sig_cleanup_slk); + + /* + * Ignore duplicates, loudly. + */ + + for (i = 0; i < sig_cleanup_count; i++) { + if (cleanup == sig_cleanupi) { + spinunlock(&sig_cleanup_slk); + s_minicarp("%s(): ignoring attempt to add already registered %s()", + G_STRFUNC, stacktrace_function_name(cleanup)); + return; + } + } + + if G_UNLIKELY(sig_cleanup_count >= SIGNAL_CLEANUP) + s_minierror("%s(): too many cleanup routines defined", G_STRFUNC); + + idx = sig_cleanup_count++; + sig_cleanupidx = cleanup; + spinunlock(&sig_cleanup_slk); + + /* + * The first time we install a cleanup, we need to look at all the + * known signals and setup our signal_uncaught() handler if nothing + * was setup yet. + */ - start = &sig_bufCONST_STRLEN(SIG_PREFIX); - offset = start - sig_buf; + if G_UNLIKELY(0 == idx) { + signal_init(); + + /* Skip SIGZERO, this is not a real signal */ + + mutex_lock(&signal_lock); - g_assert(size_is_positive(offset)); - g_assert(CONST_STRLEN(SIG_PREFIX) == offset); + for (i = 1; i < SIGNAL_COUNT; i++) { + if (SIG_DFL == signal_handleri && signal_is_fatal(i)) + signal_set(i, signal_uncaught); + } - g_strlcpy(start, signal_namessigno, sizeof sig_buf - offset); - return sig_buf; + mutex_unlock(&signal_lock); } +} + +static sigjmp_buf sig_cleanup_env; + +static void +signal_cleanup_got_signal(int signo) +{ + s_rawwarn("%s(): %s received, continuing...", + G_STRFUNC, signal_name(signo)); + + siglongjmp(sig_cleanup_env, signo); +} + +/** + * Run installed cleanup handlers, in the reverse order they were installed. + */ +void +signal_perform_cleanup(void) +{ + static spinlock_t cleanup_slk = SPINLOCK_INIT; + bool locked; + signal_handler_t old_sigsegv; +#ifdef SIGBUS + signal_handler_t old_sigbus; +#endif + + /* + * Only one thread may run this safely. Warn if concurrent threads + * attempt to run this. + */ + + if (!spinlock_hidden_try(&cleanup_slk)) { + s_miniwarn("%s(): concurrent attempt ignored", G_STRFUNC); + return; + } + + signal_crashing(); /* Avoid memory allocations in some places */ + + old_sigsegv = signal_catch(SIGSEGV, signal_cleanup_got_signal); +#ifdef SIGBUS + old_sigbus = signal_catch(SIGBUS, signal_cleanup_got_signal); +#endif + + locked = spinlock_hidden_try(&sig_cleanup_slk); + + if (!locked) + s_miniwarn("%s(): running without lock protection", G_STRFUNC); + + while (sig_cleanup_count != 0) { + if (Sigsetjmp(sig_cleanup_env, TRUE)) { + s_rawwarn("%s(): handler #%u did not complete", + G_STRFUNC, sig_cleanup_count + 1); + continue; + } + (*sig_cleanup--sig_cleanup_count)(); + } + + if (locked) + spinunlock_hidden(&sig_cleanup_slk); + + signal_set(SIGSEGV, old_sigsegv); +#ifdef SIGBUS + signal_set(SIGBUS, old_sigbus); +#endif + + signal_uncrashing(); + spinunlock_hidden(&cleanup_slk); +} + +#if defined(USE_UC_MCONTEXT) && defined(SA_SIGINFO) +/* + * This section computes the register number in the ucontext_t general + * registers that contains the PC. + * + * In order to do that, we install a POSIX signal handler with SA_SIGINFO, + * then trigger a segmentation violation from a known routine and probe the + * saved registers in the supplied machine context to spot one whose value + * is close to the address of the routine. + */ + +static sigjmp_buf sig_pc_env; + +/** + * Compute the PC register index into ``sig_pc_regnum''. + */ +static NO_INLINE void +sig_compute_pc_index(void) +{ + int *p = (int *) 0x10; /* Align, avoids possible SIGBUS below */ + + /* + * The instruction causing the SIGSEGV should be near the top of the + * routine to make sure we can identify which register was holding + * the faulting PC. + */ + + *p = 1; /* We expect this to raise a SIGSEGV */ + g_assert_not_reached(); +} + +#define SIG_PC_OFFSET_MAX 100 /* Bytes after start of routine */ + +/** + * Signal handler for the segmentation violation we're creating. + */ +static void +sig_get_pc_handler(int signo, siginfo_t *si, void *u) +{ + const ucontext_t *uc = u; + unsigned i; + bool found = FALSE; + ulong caller; + + g_assert(SIGSEGV == signo +#ifdef SIGBUS + || SIGBUS == signo +#endif + ); + g_assert(si != NULL); + + if (1 == REGISTER_COUNT(uc)) { + /* + * The uc_mcontext field is a pointer, sorry. + * + * This is probably OSX, but the exact field name varies depending + * on the OSX version, so the checks are more complex for this + * platform. For now, OSX users will miss the PC in the crash logs. + */ + sig_pc_regnum = SIG_PC_HIDDEN; + goto done; + } + + sig_pc_regnum = SIG_PC_UNKNOWN; + caller = pointer_to_ulong(cast_func_to_pointer(sig_compute_pc_index)); + + for (i = 0; i < REGISTER_COUNT(uc); i++) { + size_t off = REGISTER_VALUE(uc, i) - caller; + if (off < SIG_PC_OFFSET_MAX) { + if (found) { + sig_pc_regnum = SIG_PC_MULTIPLE; + break; + } + found = TRUE; + sig_pc_regnum = i; + } + } + +done: + Siglongjmp(sig_pc_env, 1); +} + +/** + * Computes the PC register number in the user thread context. + * + * @return the index in the general register array, -1 if unknown. + */ +static int +sig_get_pc_index(void) +{ + struct sigaction sa, osa; + + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_SIGINFO; + sa.sa_sigaction = sig_get_pc_handler; + + if (-1 == sigaction(SIGSEGV, &sa, &osa)) { + s_warning("%s(): sigaction() setup failed: %m", G_STRFUNC); + return -1; + } + + if (Sigsetjmp(sig_pc_env, TRUE)) { + if (-1 == sigaction(SIGSEGV, &osa, &sa)) + s_critical("%s(): sigaction() restore failed: %m", G_STRFUNC); + return sig_pc_regnum; + } + + sig_compute_pc_index(); + + g_assert_not_reached(); + return SIG_PC_IMPOSSIBLE; +} + +/** + * Extract the value of the PC register from the user thread context. + * + * @return the PC value, NULL if unknown. + */ +static void * +sig_get_pc(const void *u) +{ + const ucontext_t *uc = u; + + if (sig_pc_regnum < 0) + return NULL; + + return ulong_to_pointer(REGISTER_VALUE(uc, sig_pc_regnum)); +} +#else /* !USE_UC_MCONTEXT || !SA_SIGINFO */ +static int +sig_get_pc_index(void) +{ + return SIG_PC_UNAVAILABLE; +} + +static inline void * +sig_get_pc(const void *u) +{ + (void) u; + return NULL; +} +#endif /* USE_UC_MCONTEXT && SA_SIGINFO */ + +static volatile sig_atomic_t in_signal_abort; + +/** + * Get the signal handler level, 0 meaning we are not in a signal handler. + * + * This is only meant to be used by compat_setjmp() and compat_sigsetjmp(). + * + * @param stid the small thread ID for which we want the handler level + * + * @return the signal handler level for the specified thread. + */ +sig_atomic_t +signal_thread_handler_level(uint stid) +{ + g_assert(stid < THREAD_MAX); + + return in_signal_handlerstid; +} + +/** + * Set the current signal handler level for the calling thread. + * + * This is only meant to be used by compat_longjmp() and compat_siglongjmp(). + * + * @param stid the thread ID for which we want to set the handler level + * @param level the new handler level we want to set + */ +void +signal_thread_handler_level_set(uint stid, sig_atomic_t level) +{ + sig_atomic_t old_level; + + g_assert(stid < THREAD_MAX); + g_assert(level >= 0); + + old_level = in_signal_handlerstid; + + g_assert_log(level <= old_level, + "%s(): level=%ld, old_level=%ld, attempt to use stale context?", + G_STRFUNC, (long) level, (long) old_level); + + in_signal_handlerstid = level; + in_safe_handlerstid = FALSE; /* Assume the worst */ +} + +/** + * Check whether thread ID is within an asychronous signal handler. + * + * @return TRUE if we are in an asynchronous signal handler or when the given + * thread ID is negative. + */ +static inline bool ALWAYS_INLINE +signal_thread_in_handler(const int id) +{ + if G_UNLIKELY(id < 0) + return TRUE; + + if G_UNLIKELY(in_signal_handlerid) { + /* + * Handle signal_abort() specially: it's a synchronous signal handler + * and it does not "interrupt" anything in the current thread. + */ + + if (ATOMIC_GET(&in_signal_abort)) + return FALSE; + + /* + * An exception is also a synchronous signal in the current thread. + */ + + return !signal_in_exception(); + } + + return FALSE; +} + +/** + * Check whether we are within an asynchronous signal handler and return + * the compute thread ID at the same time. + * + * The returned thread ID must NOT be used if the routine returns TRUE since + * it can potentially be a negative number in disguise, i.e. a very large value. + * + * This routine exists to optimize operations duing memory allocation when + * we need to compute the thread ID and at the same time ensure we are not + * within a signal handler. + * + * @param id locstion where thread ID is written to + * + * @return TRUE if we are in an asynchronous signal handler or when we cannot + * compute a proper thread ID. + */ +bool +signal_in_handler_stid(uint *id) +{ + return signal_thread_in_handler(*id = thread_safe_small_id()); +} + +/** + * Are we in an asynchronous signal handler? + */ +bool +signal_in_handler(void) +{ + return signal_thread_in_handler(thread_safe_small_id()); +} + +/** + * Check whether thread ID is within an unsafe asychronous signal handler. + * + * @return TRUE if we are in an unsafe asynchronous signal handler or when + * the given thread ID is negative (i.e. we assume the worst). + */ +static inline bool ALWAYS_INLINE +signal_thread_in_unsafe_handler(const int id) +{ + if G_UNLIKELY(id < 0) + return TRUE; + + if G_UNLIKELY(in_safe_handlerid) + return FALSE; + + return signal_thread_in_handler(id); +} + +/** + * Are we in an asynchronous unsafe signal handler? + * + * If this rerturn FALSE, we are either not in a signal handler, or this is + * a safe signal handler because it interrupted a system call and we know + * we were not allocating memory nor holding any locks at that time. + * + * @return TRUE if thread is in a signal handler that is deemed unsafe. + */ +bool +signal_in_unsafe_handler(void) +{ + return signal_thread_in_unsafe_handler(thread_safe_small_id()); +} + +/** + * Check whether we are within an unsafe asynchronous signal handler and return + * the compute thread ID at the same time. + * + * The returned thread ID must NOT be used if the routine returns TRUE since + * it can potentially be a negative number in disguise, i.e. a very large value. + * + * This routine exists to optimize operations duing memory allocation when + * we need to compute the thread ID and at the same time ensure we are not + * within a signal handler. + * + * @param id locstion where thread ID is written to + * + * @return TRUE if we are in an unsafe asynchronous signal handler or when + * we cannot compute a proper thread ID. + */ +bool +signal_in_unsafe_handler_stid(uint *id) +{ + return signal_thread_in_unsafe_handler(*id = thread_safe_small_id()); +} + +/** + * Reset the signal handler flags for a dead thread. + */ +void +signal_thread_reset(uint id) +{ + g_assert(id < THREAD_MAX); + + in_signal_handlerid = 0; + in_safe_handlerid = 0; +} + +/** + * Returns the pre-allocated safe chunk for allocating memory within + * a signal handler. + */ +ckhunk_t * +signal_chunk(void) +{ + return sig_chunk; +} + +/** + * Wrapper for delivery of an untrapped harmful signal. + * + * These are caught to be able to perform application-specific cleanup + * before the application is terminated. + */ +static void +signal_uncaught(int signo) +{ + g_assert(signo > 0 && signo < SIGNAL_COUNT); + + /* + * Be silent if there is nothing to do. + */ + + if (0 != atomic_uint_get(&sig_cleanup_count)) { + s_miniwarn("%s(%s): running %u cleanup handler%s", + G_STRFUNC, signal_name(signo), sig_cleanup_count, + plural(sig_cleanup_count)); + + signal_perform_cleanup(); + } + + /* + * Restore default signal handler, since it was originally uncaught, + * unblock it and raise it again to get the default behaviour. + * + * We must reset signal_catch_segv to FALSE otherwise signal_trap_with() + * will force signal_uncaught() as the handler for SIGSEGV. To avoid + * race conditions with a concurrent thread creation that would reset + * the signal_catch_segv variable to TRUE, we take the mutex. + */ + + if ( + SIGSEGV == signo +#ifdef SIGBUS + || SIGBUS == signo +#endif + ) { + mutex_lock(&signal_lock); + signal_catch_segv = FALSE; + } + + signal_catch(signo, SIG_DFL); + signal_unblock(signo); + + if ( + SIGSEGV == signo +#ifdef SIGBUS + || SIGBUS == signo +#endif + ) + mutex_unlock(&signal_lock); + + raise(signo); +} + +#ifdef HAS_SIGALTSTACK +/* + * Ensure the SIGSEGV signal is minimally trapped to catch up thread stack + * overflows and properly log them when they occur. + * + * Called the first time a new thread is created. + */ +static void +signal_thread_init(void) +{ + mutex_lock(&signal_lock); + + /* + * Going through signal_set() ensures we'll properly use sigaction() + * to setup the signal handler, and further make sure we are configuring + * an alternate stack to process SIGSEGV when they occur, provided the + * kernel supports these features. + * + * On OS/X, it seems that SIGBUS is delivered to the process instead of + * SIGSEGV when a stack boundary is reached, hense the additional code + * to handle SIGBUS in a similar way. + */ + + if (SIG_DFL == signal_handlerSIGSEGV) + signal_set(SIGSEGV, signal_uncaught); + +#ifdef SIGBUS + if (SIG_DFL == signal_handlerSIGBUS) + signal_set(SIGBUS, signal_uncaught); +#endif + + signal_catch_segv = TRUE; + mutex_unlock(&signal_lock); +} +#endif /* HAS_SIGALTSTACK */ - /* - * print_number() works backwards within the supplied buffer, so we - * need to construct the final string accordingly. - */ +/** + * Create the signal stack used for SIGSEGV handlers called by the thread, + * if supported. + * + * The allocated stack must be freed with signal_stack_free() when the thread + * is terminated. + * + * If the value in *base_ptr is not NULL, it is taken as the base of an + * already allocated memory region, suitable to be used as the stack base. + * This allows reuse of previously allocated stacks when signal_stack_free() + * cannot remove the signal stack for the thread. + * + * @param base_ptr written with base of allocated stack + * + * @return the length of the signal stack if OK, 0 otherwise. + * The base of the allocated stack is written to ``base'' when successful. + */ +size_t +signal_stack_allocate(void **base_ptr) +{ +#ifdef HAS_SIGALTSTACK + stack_t ss; + void *p = *base_ptr; + size_t size; - start = deconstify_char(print_number(sig_buf, sizeof sig_buf, signo)); - offset = start - sig_buf; + if (NULL == p) + p = vmm_alloc(SIGNAL_STACK_SIZE); - g_assert(size_is_positive(offset)); - g_assert(offset > CONST_STRLEN(SIGNAL_NUM)); + ss.ss_sp = p; + ss.ss_size = size = round_pagesize(SIGNAL_STACK_SIZE); + ss.ss_flags = 0; /* - * Prepend constant SIGNAL_NUM string right before the number, without - * the trailing NUL (hence the use of memcpy). + * It is the job of sigaltstack() to configure the stack properly + * depending on the growth direction of stacks on the system, using + * the supplied buffer. */ - memcpy(start - CONST_STRLEN(SIGNAL_NUM), - SIGNAL_NUM, CONST_STRLEN(SIGNAL_NUM)); + if (-1 == sigaltstack(&ss, NULL)) { + s_warning("%s(): unable to install signal stack of %zu bytes at %p: %m", + G_STRFUNC, size, p); + } - return start - CONST_STRLEN(SIGNAL_NUM); -} + signal_thread_init(); -static volatile sig_atomic_t in_signal_handler; + *base_ptr = p; -/** - * Are we in a signal handler? - */ -gboolean -signal_in_handler(void) -{ - return in_signal_handler != 0 && !mingw_in_exception(); + return size; +#else + *base_ptr = NULL; + return 0; +#endif } /** - * Returns the pre-allocated safe chunk for allocating memory within - * a signal handler. + * Free the allocated signal stack, nullifying the pointer if we can disable + * the signal stack. + * + * @param base_ptr pointer to the base address of the stack + * + * @return TRUE if we successfully disabled the stack and freed the stack. */ -ckhunk_t * -signal_chunk(void) +bool +signal_stack_free(void **base_ptr) { - return sig_chunk; +#ifdef HAS_SIGALTSTACK + void *p = *base_ptr; + stack_t ss; + bool success = TRUE; + + ss.ss_sp = NULL; + ss.ss_size = round_pagesize(SIGNAL_STACK_SIZE); + ss.ss_flags = SS_DISABLE; + + /* + * If we can't disable the signal stack, then leave it allocated: it will + * be kept in the thread element and reused the next time another thread + * is launched with the same thread ID (and by then hopefully the signal + * stack will have been released by the POSIX thread layer). + */ + + if (-1 == sigaltstack(&ss, NULL)) { + s_warning("%s(): unable to disable signal stack of %zu bytes at %p: %m", + G_STRFUNC, round_pagesize(SIGNAL_STACK_SIZE), p); + success = FALSE; + } else { + vmm_free(p, SIGNAL_STACK_SIZE); + *base_ptr = NULL; + } + + return success; +#else + (void) base_ptr; + g_assert_not_reached(); /* Can't be called! */ +#endif } /** @@ -188,21 +1024,44 @@ signal_trampoline(int signo) { signal_handler_t handler; + int id; + bool in_syscall, was_safe = FALSE; g_assert(signo > 0 && signo < SIGNAL_COUNT); + in_syscall = thread_was_in_syscall(&id); handler = signal_handlersigno; - g_assert(handler != SIG_DFL && handler != SIG_IGN); + g_soft_assert_log(handler != SIG_DFL && handler != SIG_IGN, + "%s(): signo=%d (%s), handler=%s", + G_STRFUNC, signo, signal_name(signo), + SIG_DFL == handler ? "SIG_DFL" : + SIG_IGN == handler ? "SIG_IGN" : "<BUG>"); + + if G_UNLIKELY(SIG_DFL == handler || SIG_IGN == handler) + goto done; /* * Wrapping the signal handler allows us to know whether we are in * a signal handler through signal_in_handler(). + * + * If this is the first handler and we were in a syscall, then it is + * a safe handler (we can allocate memory, we were not holding any + * locks when we got interrupted), otherwise flag the handler as unsafe. */ - in_signal_handler++; + if (id >= 0) { + was_safe = in_safe_handlerid; + + if (0 == in_signal_handlerid++) { + g_assert(!was_safe); + in_safe_handlerid = in_syscall; + } else { + in_safe_handlerid = FALSE; + } + } + (*handler)(signo); - in_signal_handler--; /* * When leaving the last signal handler, cleanup the emergency chunk. @@ -215,14 +1074,226 @@ sigset_t set; if (signal_enter_critical(&set)) { - if (0 == in_signal_handler) + if (0 == ATOMIC_GET(&in_signal_handlerid)) ck_free_all(sig_chunk); signal_leave_critical(&set); } } + + if (id >= 0) { + sig_atomic_t old = in_signal_handlerid--; + + if (2 == old) + in_safe_handlerid = was_safe; + else if (1 == old) + in_safe_handlerid = FALSE; + } + + /* FALL THROUGH */ + +done: + if (in_syscall) + thread_in_syscall_set(TRUE); +} + +#if defined(HAS_SIGACTION) && defined(SA_SIGINFO) +/** + * Decodes the si_code field depending on the signal received. + * + * @param signo the signal received + * @param code the si_code field of the siginfo_t structure + * + * @return textual description, NULL if unknown. + */ +static const char * +signal_decode(int signo, int code) +{ + switch (signo) { + case SIGFPE: + switch (code) { +#ifdef FPE_INTDIV + case FPE_INTDIV: return "integer divide by zero"; +#endif +#ifdef FPE_INTOVF + case FPE_INTOVF: return "integer overflow"; +#endif +#ifdef FPE_FLTDIV + case FPE_FLTDIV: return "floating-point divide by zero"; +#endif +#ifdef FPE_FLTOVF + case FPE_FLTOVF: return "floating-point overflow"; +#endif +#ifdef FPE_FLTUND + case FPE_FLTUND: return "floating-point underflow"; +#endif +#ifdef FPE_FLTRES + case FPE_FLTRES: return "floating-point inexact result"; +#endif +#ifdef FPE_FLTINV + case FPE_FLTINV: return "floating-point invalid operation"; +#endif +#ifdef FPE_FLTSUB + case FPE_FLTSUB: return "subscript out of range"; +#endif + } + break; + case SIGILL: + switch (code) { +#ifdef ILL_ILLOPC + case ILL_ILLOPC: return "illegal opcode"; +#endif +#ifdef ILL_ILLOPN + case ILL_ILLOPN: return "illegal operand"; +#endif +#ifdef ILL_ILLADR + case ILL_ILLADR: return "illegal addressing mode"; +#endif +#ifdef ILL_ILLTRP + case ILL_ILLTRP: return "illegal trap"; +#endif +#ifdef ILL_PRVOPC + case ILL_PRVOPC: return "privileged opcode"; +#endif +#ifdef ILL_PRVREG + case ILL_PRVREG: return "privileged register"; +#endif +#ifdef ILL_COPROC + case ILL_COPROC: return "coprocessor error"; +#endif +#ifdef ILL_BADSTK + case ILL_BADSTK: return "internal stack error"; +#endif + } + break; + case SIGSEGV: + switch (code) { +#ifdef SEGV_MAPERR + case SEGV_MAPERR: return "address not mapped to object"; +#endif +#ifdef SEGV_ACCERR + case SEGV_ACCERR: return "invalid permissions for mapped object"; +#endif + } + break; +#ifdef SIGBUS + case SIGBUS: + switch (code) { +#ifdef BUS_ADRALN + case BUS_ADRALN: return "invalid address alignment"; +#endif +#ifdef BUS_ADRERR + case BUS_ADRERR: return "nonexistent physical address"; +#endif +#ifdef BUS_OBJERR + case BUS_OBJERR: return "object-specific hardware error"; +#endif +#ifdef BUS_MCEERR_AR + case BUS_MCEERR_AR: return "h/w memory error consumed on machine check"; +#endif +#ifdef BUS_MCEERR_AO + case BUS_MCEERR_AO: return "h/w memory error not consumed"; +#endif + } + break; +#endif /* SIGBUS */ +#ifdef SIGTRAP + case SIGTRAP: + switch (code) { +#ifdef TRAP_BRKPT + case TRAP_BRKPT: return "process breakpoint"; +#endif +#ifdef TRAP_TRACE + case TRAP_TRACE: return "process trace trap"; +#endif +#ifdef TRAP_BRANCH + case TRAP_BRANCH: return "process taken branch trap"; +#endif +#ifdef TRAP_HWBKPT + case TRAP_HWBKPT: return "hardware breakpoint/watchpoint"; +#endif + } + break; +#endif /* SIGTRAP */ + default: + break; + } + + return NULL; +} + +/** + * Format exception into supplied buffer. + * + * @param dest destination buffer + * @param size size of buffer + * @param signo signal number + * @param si signal information + * @param u user context + * @param recursive whether signal was recursively received + */ +static void +sig_exception_format(char *dest, size_t size, + int signo, siginfo_t *si, void *u, bool recursive) +{ + const char *reason; + const void *pc; + str_t s; + + reason = signal_decode(signo, si->si_code); + str_new_buffer(&s, dest, 0, size); + + str_printf(&s, "got %s%s", + recursive ? "recursive " : "", signal_name(signo)); + + /* + * For SIGBUS and SIGSEGV, the si_addr field contains the faulting address. + * For SIGILL, SIGTRAP and SIGFPE signals, si_addr may be the address of the + * faulting instruction, i.e. the current PC. + */ + + switch (signo) { +#ifdef SIGBUS + case SIGBUS: +#endif + case SIGSEGV: + str_catf(&s, " for VA=%p", si->si_addr); + pc = sig_get_pc(u); + break; +#ifdef SIGTRAP + case SIGTRAP: +#endif + case SIGFPE: + case SIGILL: + pc = sig_get_pc(u); + if (NULL == pc) + pc = si->si_addr; /* Maybe, so prefer sig_get_pc() */ + break; + default: + pc = NULL; + break; + } + + if (reason != NULL) + str_catf(&s, " (%s)", reason); + + if (pc != NULL) { + str_catf(&s, " at PC=%p", pc); + + if (!recursive) { + const char *name = stacktrace_routine_name(pc, TRUE); + + if (!is_strprefix(name, "0x")) + str_catf(&s, " (%s)", name); + + if (!stacktrace_pc_within_our_text(pc)) { + const char *file = dl_util_get_path(pc); + if (file != NULL) + str_catf(&s, " from %s", file); + } + } + } } -#ifdef SA_SIGINFO /** * Extended trapping for harmful signals for which we can gather extra * information from the siginfo_t structure. @@ -230,33 +1301,101 @@ static void signal_trampoline_extended(int signo, siginfo_t *si, void *u) { - (void) u; + static sig_atomic_t extendedTHREAD_MAX; + int id = thread_safe_small_id(); + sigset_t set; + + /* + * First check whether we're getting a segmentation violation due to a + * stack overflow. If we do, we won't be able to go very far anyway hence + * it's best to abort as early as possible. + */ + + if (SIGSEGV == signo) + thread_stack_check_overflow(si->si_addr); + +#ifdef SIGBUS + /* On OS/X, the kernel sends a SIGBUS on stack overflows */ + if (SIGBUS == signo) + thread_stack_check_overflow(si->si_addr); +#endif + + if (id >= 0) { + in_signal_handlerid++; + extendedid++; + } + + /* + * Check whether signal is still pending. + * + * We assume that because sigaction() is available, sigpending() is + * also present. We know we have sigaction() because this routine + * is only called from a handler installed with SA_SIGINFO. + * + * If the same signal that is being delivered is still pending, then + * unblocking the signal will immediately recurse here. Hence it is + * useful to detect that and avoid calling the signal handler. + */ + + if (-1 == sigpending(&set)) { + s_miniwarn("%s: sigpending() failed: %m", G_STRFUNC); + } else if (id >= 0 && extendedid <= 2) { + int i; + + for (i = 1; i < SIG_COUNT; i++) { + if (sigismember(&set, i)) { + s_miniwarn("%s: signal %s still pending", + G_STRFUNC, signal_name(i)); + } + } + } /* * Log faulting address and propagate that information in the * crash log as an error message. */ - in_signal_handler++; { - char data80; + static char data512; + + /* + * This signal handler is handling highly harmful signals, which could + * recursively re-occur in our handling, so be extremely careful and + * gradually do less and less, until explicit immediate termination. + */ - str_bprintf(data, sizeof data, "got %s for VA=%p", - signal_name(signo), si->si_addr); - s_critical("%s", data); - crash_set_error(data); + if (id >= 0 && extendedid > 1) { + if (2 == extendedid) { + sig_exception_format(data, sizeof data, signo, si, u, TRUE); + s_rawwarn("%s", data); + crash_set_error(data); + crash_abort(); + } else if (3 == extendedid) { + abort(); + } else { + _exit(EXIT_FAILURE); + } + } else { + sig_exception_format(data, sizeof data, signo, si, u, FALSE); + s_rawwarn("%s", data); + crash_set_error(data); + } } - in_signal_handler--; signal_trampoline(signo); + + if (id >= 0) { + in_signal_handlerid--; + extendedid--; + } } -#endif /* SA_SIGINFO */ +#endif /* HAS_SIGACTION && SA_SIGINFO */ /** * Installs a signal handler. * * The signal handler is not reset to the default handler after delivery unless - * the signal is SIGSEGV or SIGBUS, in which case not only is the default + * the signal is SIGSEGV or SIGBUS, in which case not only is the default * handler reset but further occurrence of the signal will retrigger even * within signal delivery. * @@ -271,22 +1410,52 @@ * @return the previous signal handler or SIG_ERR on failure. */ static signal_handler_t -signal_trap_with(int signo, signal_handler_t handler, gboolean extra) +signal_trap_with(int signo, signal_handler_t handler, bool extra) { signal_handler_t ret, old_handler, trampoline; g_assert(handler != SIG_ERR); g_assert(signo > 0 && signo < SIGNAL_COUNT); - STATIC_ASSERT(SIGNAL_COUNT == G_N_ELEMENTS(signal_handler)); + STATIC_ASSERT(SIGNAL_COUNT == N_ITEMS(signal_handler)); - if (G_UNLIKELY(NULL == sig_chunk)) /* No signal_init() yet */ + if G_UNLIKELY(!ONCE_DONE(signal_inited)) signal_init(); + mutex_lock(&signal_lock); old_handler = signal_handlersigno; g_assert(old_handler != SIG_ERR); + /* + * If they restore the default handler for a signal and we have cleanup + * to perform, redirect them to signal_uncaught(). + */ + + atomic_mb(); /* Make sure we have an accurate sig_cleanup_count */ + + if (sig_cleanup_count != 0 && SIG_DFL == handler && signal_is_fatal(signo)) + handler = signal_uncaught; + + /* + * Likewise, if we created a thread, we need to catch SIGSEGV to never let + * the default handler run, so that we can trap stack overflows. + */ + + if (SIGSEGV == signo && SIG_DFL == handler && signal_catch_segv) + handler = signal_uncaught; + +#ifdef SIGBUS + if (SIGBUS == signo && SIG_DFL == handler && signal_catch_segv) + handler = signal_uncaught; +#endif + + /* + * When not using SIG_DFL or SIG_IGN, make sure we go through the + * signal trampoline to perform some checks before invoking the + * user handler. + */ + trampoline = (SIG_DFL == handler || SIG_IGN == handler) ? handler : signal_trampoline; @@ -294,7 +1463,7 @@ { static const struct sigaction zero_sa; struct sigaction sa, osa; - + sa = zero_sa; sigemptyset(&sa.sa_mask); sa.sa_flags = signo != SIGALRM ? SA_RESTART : 0; @@ -319,6 +1488,16 @@ #else sa.sa_handler = trampoline; #endif +#ifdef SA_ONSTACK + if ( + SIGSEGV == signo +#ifdef SIGBUS + || SIGBUS == signo +#endif + ) { + sa.sa_flags |= SA_ONSTACK; + } +#endif #ifdef SA_NODEFER sa.sa_flags |= SA_NODEFER; #endif @@ -331,23 +1510,75 @@ break; } +#ifdef SIGNAL_HANDLER_TRACE + { + buf_t *b = buf_private(G_STRFUNC, 1); + char *p = buf_data(b); + + /* + * Avoid trace recursions, which can happen through + * stacktrace_function_name() when dl_util_query() is + * called, since that will attempt to ignore SIGSEGV. + * + * We rely on the fact that buf_private() initially + * allocates a buffer that is zeroed to detect that we + * are actually entering this tracing code for the first + * time in a given thread. + * --RAM, 2015-02-05 + */ + + if ('\0' == *p) { + str_t *s; + + *p = '\01'; /* Flag that we're now tracing */ + + s = str_new(120); + str_printf(s, "%s(): installing %s() trampoline ", + G_STRFUNC, stacktrace_function_name( + (sa.sa_flags & SA_SIGINFO) ? + (signal_handler_t) sa.sa_sigaction : sa.sa_handler)); + str_catf(s, "going to %s() handler for %s", + stacktrace_function_name(handler), signal_name(signo)); + str_catf(s, ": old handler was %s()", + stacktrace_function_name(old_handler)); + s_debug("%s", str_2c(s)); + str_destroy_null(&s); + + *p = '\0'; /* Done with tracing */ + } + } +#endif /* SIGNAL_HANDLER_TRACE */ + ret = sigaction(signo, &sa, &osa) ? SIG_ERR : #ifdef SA_SIGINFO - (osa.sa_flags & SA_SIGINFO) ? signal_trampoline : osa.sa_handler + (osa.sa_flags & SA_SIGINFO) ? + (signal_handler_t) osa.sa_sigaction : osa.sa_handler #else osa.sa_handler #endif ; } -#else - /* FIXME WIN32, probably: We can't just ignore all signal logic */ - ret = signal(signo, trampoline); +#else /* !HAS_SIGACTION */ + (void) extra; + ret = signal(signo, trampoline); #endif /* HAS_SIGACTION */ - if (SIG_ERR == ret) + if (SIG_ERR == ret) { + mutex_unlock(&signal_lock); return ret; + } signal_handlersigno = handler; + mutex_unlock(&signal_lock); + + /* + * Hide our internal signal_uncaught() handler which is only installed + * to be able to trap otherwise harmful signals when we have cleanup + * to perform. + */ + + if (signal_uncaught == old_handler) + old_handler = SIG_DFL; return (SIG_DFL == ret || SIG_IGN == ret) ? ret : old_handler; } @@ -356,7 +1587,7 @@ * Installs a signal handler. * * The signal handler is not reset to the default handler after delivery unless - * the signal is SIGSEGV or SIGBUS, in which case not only is the default + * the signal is SIGSEGV or SIGBUS, in which case not only is the default * handler reset but further occurrence of the signal will retrigger even * within signal delivery. * @@ -404,28 +1635,56 @@ #endif /* HAS_SIGPROCMASK */ } -static volatile sig_atomic_t in_critical_section; +static volatile sig_atomic_t in_exception_handler; + +static sig_atomic_t in_critical_sectionTHREAD_MAX; + +/** + * Are we in an exception? + * + * @return amount of times signal_crashing() was called. + */ +int +signal_in_exception(void) +{ + return ATOMIC_GET(&in_exception_handler); +} + +/** + * Mark that we are entering a fatal exception. + */ +void +signal_crashing(void) +{ + ATOMIC_INC(&in_exception_handler); +} + +/** + * Mark that we are leaving a fatal exception handler. + */ +void +signal_uncrashing(void) +{ + sig_atomic_t old = ATOMIC_DEC(&in_exception_handler); + + g_assert_log(size_is_non_negative(old), + "%s(): old=%zu", G_STRFUNC, (size_t) old); +} /** * Block all signals, for entering a critical section. * + * @param id thread ID of current thread * @param oset the old signal set, to be passed to signal_leave_critical() * * @return TRUE if OK, FALSE on error with errno set. */ -gboolean -signal_enter_critical(sigset_t *oset) +bool +signal_thread_enter_critical(int id, sigset_t *oset) { + g_assert(id >= 0); g_assert(oset != NULL); - /* - * There are no signals on Windows, so there is no risk we can be - * interrupted by a signal on that platform. - */ - - if (is_running_on_mingw()) - goto ok; - #ifdef HAS_SIGPROCMASK { sigset_t set; @@ -437,40 +1696,56 @@ * leave the outermost one. */ - if (in_critical_section) + if (in_critical_sectionid++ != 0) goto ok; - sigfillset(&set); /* Block everything */ + sigfillset(&set); /* Block everything but SIGSEGV / SIGBUS */ + sigdelset(&set, SIGSEGV); +#ifdef SIGBUS + sigdelset(&set, SIGBUS); +#endif if (-1 == sigprocmask(SIG_SETMASK, &set, oset)) return FALSE; } +ok: #else (void) oset; - return FALSE; + in_critical_sectionid++; #endif -ok: - in_critical_section++; - return TRUE; } /** + * Block all signals, for entering a critical section. + * + * @param oset the old signal set, to be passed to signal_leave_critical() + * + * @return TRUE if OK, FALSE on error with errno set. + */ +bool +signal_enter_critical(sigset_t *oset) +{ + return signal_thread_enter_critical(thread_small_id(), oset); +} + +/** * Unblock signals that were blocked when we entered the critical section. + * + * @param id thread ID of current thread + * @param oset original signal set to restore */ void -signal_leave_critical(const sigset_t *oset) +signal_thread_leave_critical(int id, const sigset_t *oset) { - g_assert(in_critical_section > 0); + g_assert(id >= 0); + g_assert(in_critical_sectionid > 0); - in_critical_section--; - - if (is_running_on_mingw()) - return; + in_critical_sectionid--; #ifdef HAS_SIGPROCMASK - if (!in_critical_section) { + if (0 == in_critical_sectionid) { if (-1 == sigprocmask(SIG_SETMASK, oset, NULL)) s_error("cannot leave critical section: %m"); } @@ -480,29 +1755,94 @@ } /** - * Initialize the signal layer. + * Unblock signals that were blocked when we entered the critical section. */ void -signal_init(void) +signal_leave_critical(const sigset_t *oset) { - if (NULL == sig_chunk) { /* Allow multiple calls */ - size_t i; + signal_thread_leave_critical(thread_small_id(), oset); +} - for (i = 0; i < G_N_ELEMENTS(signal_handler); i++) { - signal_handleri = SIG_DFL; /* Can't assume it's NULL */ - } +/** + * Synchronously raise a fatal SIGBART signal. + * + * If we were not in a signal handler or in a critical section already, this + * call ensures that signal_in_handler() will return FALSE, since everything + * is happening synchronously and we cannot be interrupting a memory allocation + * routine or be in the presence of dangling data structures. + */ +void +signal_abort(void) +{ + int id = thread_safe_small_id(); - /* - * Chunk allocated as non-leaking because the signal chunk must - * remain active up to the very end, way past the point where we're - * supposed to have freed everything and leak detection kicks in. - */ + /* + * In case the error occurs within a critical section with all the + * signals blocked, make sure to unblock SIGABRT. In that case, we + * are asynchronous with respect to the program, as we are interrupting + * a section that is supposed to be signal-safe, so don't set the + * ``in_signal_abort'' flag. + */ + + if (id >= 0 && 0 != in_critical_sectionid) + signal_unblock(SIGABRT); + else + ATOMIC_SET(&in_signal_abort, TRUE); + + raise(SIGABRT); +} + +/** + * Initialize the signal layer. + */ +static void G_COLD +signal_init_once(void) +{ + int regnum; + size_t i; - sig_chunk = - ck_init_not_leaking(SIGNAL_CHUNK_SIZE, SIGNAL_CHUNK_RESERVE); + for (i = 0; i < N_ITEMS(signal_handler); i++) { + signal_handleri = SIG_DFL; /* Can't assume it's NULL */ } - g_assert(sig_chunk != NULL); /* We're initialized now */ + /* + * Chunk allocated as non-leaking because the signal chunk must + * remain active up to the very end, way past the point where we're + * supposed to have freed everything and leak detection kicks in. + */ + + sig_chunk = ck_init_not_leaking(SIGNAL_CHUNK_SIZE, SIGNAL_CHUNK_RESERVE); + + /* + * Compute the PC register index in the saved user machine context. + */ + + regnum = sig_get_pc_index(); + + switch (regnum) { + case SIG_PC_UNAVAILABLE: + case SIG_PC_HIDDEN: + break; + case SIG_PC_UNKNOWN: + s_warning("%s(): could not find PC in machine context", G_STRFUNC); + break; + case SIG_PC_MULTIPLE: + s_warning("%s(): many locations for PC in machine context", G_STRFUNC); + break; + case SIG_PC_IMPOSSIBLE: + g_assert_not_reached(); + default: + break; + } +} + +/** + * Initialize the signal layer. + */ +void +signal_init(void) +{ + once_flag_run(&signal_inited, signal_init_once); } /**
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/signal.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/signal.h
Changed
@@ -48,20 +48,52 @@ typedef void (*signal_handler_t)(int signo); +/** + * Cleanup routines that can be installed with signal_cleanup_add(). + */ +typedef void (*signal_cleanup_t)(void); + +/* + * Private calls, reserved to compat_setjmp() and compat_longjmp(). + */ + +#ifdef SETJMP_SOURCE +sig_atomic_t signal_thread_handler_level(uint stid); +void signal_thread_handler_level_set(uint stid, sig_atomic_t level); +#endif /* SETJMP_SOURCE */ + /* * Public interface. */ signal_handler_t signal_set(int signo, signal_handler_t handler); signal_handler_t signal_catch(int signo, signal_handler_t handler); +void signal_cleanup_add(signal_cleanup_t cleanup); +void signal_perform_cleanup(void); const char *signal_name(int signo); -gboolean signal_in_handler(void); + +bool signal_in_handler(void); +bool signal_in_unsafe_handler(void); +bool signal_in_handler_stid(uint *id); +bool signal_in_unsafe_handler_stid(uint *id); +void signal_thread_reset(uint id); + struct ckhunk *signal_chunk(void); void signal_unblock(int signo); +void signal_abort(void); +size_t signal_stack_allocate(void **base_ptr); +bool signal_stack_free(void **base_ptr); -gboolean signal_enter_critical(sigset_t *oset); +void signal_crashing(void); +void signal_uncrashing(void); +int signal_in_exception(void); + +bool signal_enter_critical(sigset_t *oset); void signal_leave_critical(const sigset_t *oset); +bool signal_thread_enter_critical(int id, sigset_t *oset); +void signal_thread_leave_critical(int id, const sigset_t *oset); + void signal_init(void); void signal_close(void);
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/slist.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/slist.c
Changed
@@ -1,5 +1,6 @@ /* - * Copyright (c) 2003, Christian Biere + * Copyright (c) 2003 Christian Biere + * Copyright (c) 2013 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -25,64 +26,109 @@ * @ingroup lib * @file * - * Handling of slists on a slightly higher level than GSList. + * Handling of slists on a slightly higher level than pslist_t. * * The purpose of this slist functions is providing efficient appending, * prepending of items to a slist structure, fast lookup of the slist * length, fast access to the slist head and tail. Additionally, some basic * checks prevent modification of the slist whilst traversing it. * + * Each linked list object can be made thread-safe, optionally, so that + * concurrent access to it be possible. + * * @author Christian Biere - * @date 2006 + * @date 2003 + * @author Raphael Manfredi + * @date 2013 */ #include "common.h" #include "slist.h" + +#include "log.h" #include "misc.h" -#include "glib-missing.h" +#include "mutex.h" +#include "pslist.h" #include "walloc.h" + #include "override.h" /* Must be the tail header included */ +#if 0 +#define USE_SLIST_REGRESSION +#endif + typedef enum { - LIST_MAGIC = 0x3d59b1fU + SLIST_MAGIC = 0x3d59b1fU } slist_magic_t; typedef enum { - LIST_ITER_MAGIC = 0x2f744ad1U + SLIST_ITER_MAGIC = 0x2f744ad1U } slist_iter_magic_t; struct slist { slist_magic_t magic; int refcount; - GSList *head; - GSList *tail; + pslist_t *head; + pslist_t *tail; + mutex_t *lock; int length; - guint stamp; + uint stamp; }; struct slist_iter { slist_iter_magic_t magic; const slist_t *slist; - GSList *prev, *cur, *next; - guint stamp; + pslist_t *prev, *cur, *next; + uint stamp; unsigned removable:1; }; -#if 0 -#define USE_SLIST_REGRESSION 1 -#endif +/* + * Thread-safe synchronization support. + */ -#define equiv(p,q) (!(p) == !(q)) +#define slist_synchronize(l) G_STMT_START { \ + if G_UNLIKELY((l)->lock != NULL) { \ + slist_t *wl = deconstify_pointer(l); \ + mutex_lock(wl->lock); \ + } \ +} G_STMT_END + +#define slist_unsynchronize(l) G_STMT_START { \ + if G_UNLIKELY((l)->lock != NULL) { \ + slist_t *wl = deconstify_pointer(l); \ + mutex_unlock(wl->lock); \ + } \ +} G_STMT_END + +#define slist_return(l, v) G_STMT_START { \ + if G_UNLIKELY((l)->lock != NULL) \ + mutex_unlock((l)->lock); \ + return v; \ +} G_STMT_END + +#define slist_return_void(l) G_STMT_START { \ + if G_UNLIKELY((l)->lock != NULL) \ + mutex_unlock((l)->lock); \ + return; \ +} G_STMT_END + +#define assert_slist_locked(l) G_STMT_START { \ + if G_UNLIKELY((l)->lock != NULL) \ + assert_mutex_is_owned((l)->lock); \ +} G_STMT_END #ifdef USE_SLIST_REGRESSION static inline void slist_regression(const slist_t *slist) { - g_assert(g_slist_first(slist->head) == slist->head); - g_assert(g_slist_first(slist->tail) == slist->head); - g_assert(g_slist_last(slist->head) == slist->tail); - g_assert(g_slist_length(slist->head) == (guint) slist->length); + slist_synchronize(slist); + g_assert(pslist_first(slist->head) == slist->head); + g_assert(pslist_first(slist->tail) == slist->head); + g_assert(pslist_last(slist->head) == slist->tail); + g_assert(pslist_length(slist->head) == (uint) slist->length); + slist_unsynchronize(slist); } #else #define slist_regression(slist) @@ -92,10 +138,12 @@ slist_check(const slist_t *slist) { g_assert(slist); - g_assert(LIST_MAGIC == slist->magic); + g_assert(SLIST_MAGIC == slist->magic); g_assert(slist->refcount > 0); g_assert(slist->length >= 0); - g_assert(equiv(slist->length == 0, !slist->head && !slist->tail)); + /* Only check the "equiv" when list is not configured for concurrency */ + g_assert(slist->lock != NULL || + equiv(slist->length == 0, !slist->head && !slist->tail)); slist_regression(slist); } @@ -130,7 +178,7 @@ slist_iter_check(const slist_iter_t *iter) { g_assert(iter); - g_assert(LIST_ITER_MAGIC == iter->magic); + g_assert(SLIST_ITER_MAGIC == iter->magic); g_assert(iter->slist); g_assert(iter->slist->refcount > 0); g_assert(iter->slist->stamp == iter->stamp); @@ -143,14 +191,11 @@ slist_new(void) { slist_t *slist; - - WALLOC(slist); - slist->head = NULL; - slist->tail = NULL; + + WALLOC0(slist); slist->refcount = 1; - slist->length = 0; - slist->stamp = LIST_MAGIC + 1; - slist->magic = LIST_MAGIC; + slist->stamp = SLIST_MAGIC + 1; + slist->magic = SLIST_MAGIC; slist_regression(slist); return slist; @@ -165,18 +210,26 @@ g_assert(slist_ptr); if (*slist_ptr) { slist_t *slist; - + slist = *slist_ptr; slist_check(slist); + slist_synchronize(slist); + if (--slist->refcount != 0) { - g_carp("slist_free: slist is still referenced! " - "(slist=%p, slist->refcount=%d)", - cast_to_gconstpointer(slist), slist->refcount); + s_critical("%s(): slist is still referenced! " + "(slist=%p, slist->refcount=%d)", + G_STRFUNC, cast_to_constpointer(slist), slist->refcount); } - gm_slist_free_null(&slist->head); + pslist_free_null(&slist->head); slist->tail = NULL; + + if (slist->lock != NULL) { + mutex_destroy(slist->lock); + WFREE(slist->lock); + } + slist->magic = 0; WFREE(slist); *slist_ptr = NULL; @@ -184,16 +237,69 @@ } /** + * Mark newly created list as being thread-safe. + * + * This will make all external operations on the list thread-safe. + */ +void +slist_thread_safe(slist_t *sl) +{ + slist_check(sl); + g_assert(NULL == sl->lock); + + WALLOC0(sl->lock); + mutex_init(sl->lock); +} + +/** + * Lock the list to allow a sequence of operations to be atomically + * conducted. + * + * It is possible to lock the list several times as long as each locking + * is paired with a corresponding unlocking in the execution flow. + * + * The list must have been marked thread-safe already. + */ +void +slist_lock(slist_t *sl) +{ + slist_check(sl); + g_assert_log(sl->lock != NULL, + "%s(): list %p not marked thread-safe", G_STRFUNC, sl); + + mutex_lock(sl->lock); +} + +/* + * Release lock on list. + * + * The list must have been marked thread-safe already and locked by the + * calling thread. + */ +void +slist_unlock(slist_t *sl) +{ + slist_check(sl); + g_assert_log(sl->lock != NULL, + "%s(): list %p not marked thread-safe", G_STRFUNC, sl); + + mutex_unlock(sl->lock); +} + +/** * Append `key' to the slist. */ void -slist_append(slist_t *slist, gpointer key) +slist_append(slist_t *slist, void *key) { slist_check(slist); + + slist_synchronize(slist); + g_assert(1 == slist->refcount); - slist->tail = g_slist_append(slist->tail, key); - slist->tail = g_slist_last(slist->tail); + slist->tail = pslist_append(slist->tail, key); + slist->tail = pslist_last(slist->tail); if (!slist->head) { slist->head = slist->tail; } @@ -202,18 +308,22 @@ slist->stamp++; slist_regression(slist); + slist_return_void(slist); } /** * Prepend `key' to the slist. */ void -slist_prepend(slist_t *slist, gpointer key) +slist_prepend(slist_t *slist, void *key) { slist_check(slist); + + slist_synchronize(slist); + g_assert(1 == slist->refcount); - slist->head = g_slist_prepend(slist->head, key); + slist->head = pslist_prepend(slist->head, key); if (!slist->tail) { slist->tail = slist->head; } @@ -222,21 +332,25 @@ slist->stamp++; slist_regression(slist); + slist_return_void(slist); } /** * Insert `key' into the slist. */ void -slist_insert_sorted(slist_t *slist, gpointer key, GCompareFunc func) +slist_insert_sorted(slist_t *slist, void *key, cmp_fn_t func) { slist_check(slist); + g_assert(func != NULL); + + slist_synchronize(slist); + g_assert(1 == slist->refcount); - g_assert(func); - slist->head = g_slist_insert_sorted(slist->head, key, func); + slist->head = pslist_insert_sorted(slist->head, key, func); if (slist->tail) { - slist->tail = g_slist_last(slist->tail); + slist->tail = pslist_last(slist->tail); } else { slist->tail = slist->head; } @@ -245,27 +359,24 @@ slist->stamp++; slist_regression(slist); + slist_return_void(slist); } static inline void -slist_remove_item(slist_t *slist, GSList *prev, GSList *item) +slist_remove_item(slist_t *slist, pslist_t *prev, pslist_t *item) { - g_assert(item); - - g_assert(!prev || g_slist_next(prev) == item); + assert_slist_locked(slist); + g_assert(item != NULL); + g_assert(prev == NULL || pslist_next(prev) == item); if (item == slist->head) { g_assert(NULL == prev); - slist->head = g_slist_next(slist->head); + slist->head = pslist_next(slist->head); } if (item == slist->tail) { slist->tail = prev; } - /* @note: Return value is only assigned to prev because - * g_slist_delete_link is incorrectly tagged to - * cause a GCC compiler warning otherwise. - */ - item = g_slist_delete_link(prev ? prev : item, item); + pslist_delete_link(prev ? prev : item, item); slist->length--; slist->stamp++; @@ -275,27 +386,30 @@ /** * Remove `key' from the slist. - * @return TRUE if the given key was found and remove, FALSE otherwise. + * @return TRUE if the given key was found and removed, FALSE otherwise. */ -gboolean -slist_remove(slist_t *slist, gpointer key) +bool +slist_remove(slist_t *slist, void *key) { - GSList *item, *prev; + pslist_t *item, *prev; slist_check(slist); + + slist_synchronize(slist); + g_assert(1 == slist->refcount); g_assert(slist->length > 0); prev = NULL; - for (item = slist->head; NULL != item; item = g_slist_next(item)) { + PSLIST_FOREACH(slist->head, item) { if (key == item->data) { slist_remove_item(slist, prev, item); - return TRUE; + slist_return(slist, TRUE); } prev = item; } - return FALSE; + slist_return(slist, FALSE); } /** @@ -303,104 +417,142 @@ * * @return the data pointer of the removed item, or NULL if there was no item. */ -gpointer +void * slist_shift(slist_t *slist) { - gpointer data = NULL; + void *data = NULL; slist_check(slist); + + slist_synchronize(slist); + g_assert(1 == slist->refcount); if (slist->head != NULL) { data = slist->head->data; slist_remove_item(slist, NULL, slist->head); } - - return data; + + slist_return(slist, data); } /** * @returns The data associated with the tail item, or NULL if none. */ -gpointer +void * slist_tail(const slist_t *slist) { + void *data; + slist_check(slist); - return slist->tail ? slist->tail->data : NULL; + slist_synchronize(slist); + data = slist->tail != NULL ? slist->tail->data : NULL; + slist_return(slist, data); } /** * @returns the first item of the slist, or NULL if none. */ -gpointer +void * slist_head(const slist_t *slist) { + void *data; + slist_check(slist); - return slist->head ? slist->head->data : NULL; + slist_synchronize(slist); + data = slist->head != NULL ? slist->head->data : NULL; + slist_return(slist, data); } /** * Move entry to the head of the slist. + * + * @return whether key was present in the list. */ -gboolean -slist_moveto_head(slist_t *slist, gpointer key) +bool +slist_moveto_head(slist_t *slist, void *key) { + bool found; + + slist_check(slist); + + slist_synchronize(slist); + if (slist_remove(slist, key)) { slist_prepend(slist, key); - return TRUE; + found = TRUE; + } else { + found = FALSE; } - return FALSE; + slist_return(slist, found); } /** * Move entry to the tail of the slist. + * + * @return whether key was present in the list. */ -gboolean -slist_moveto_tail(slist_t *slist, gpointer key) +bool +slist_moveto_tail(slist_t *slist, void *key) { + bool found; + + slist_check(slist); + + slist_synchronize(slist); + if (slist_remove(slist, key)) { slist_append(slist, key); - return TRUE; + found = TRUE; + } else { + found = FALSE; } - return FALSE; + slist_return(slist, found); } /** * @returns the length of the slist. */ -guint +uint slist_length(const slist_t *slist) { + uint length; + slist_check(slist); - return slist->length; + slist_synchronize(slist); + length = slist->length; + slist_return(slist, length); } /** * Get an iterator on the slist. */ static slist_iter_t * -slist_iter_new(const slist_t *slist, gboolean before, gboolean removable) +slist_iter_new(const slist_t *slist, bool before, bool removable) { slist_iter_t *iter; if (slist != NULL) { - slist_t *wslist; + slist_t *wslist = deconstify_pointer(slist); slist_check(slist); WALLOC(iter); - iter->magic = LIST_ITER_MAGIC; + iter->magic = SLIST_ITER_MAGIC; iter->slist = slist; iter->prev = NULL; iter->cur = NULL; + + slist_synchronize(wslist); + iter->next = slist->head; if (!before) { iter->cur = iter->next; - iter->next = g_slist_next(iter->cur); + iter->next = pslist_next(iter->cur); } iter->stamp = slist->stamp; @@ -411,8 +563,8 @@ * the "const" contract here (the abstract data type is not changed). */ - wslist = deconstify_gpointer(slist); wslist->refcount++; + slist_unsynchronize(wslist); } else { iter = NULL; } @@ -460,26 +612,34 @@ return slist_iter_new(slist, TRUE, TRUE); } - /** * Moves the iterator to the next element and returns its value. * If there is no next element, NULL is returned. */ -gpointer +void * slist_iter_next(slist_iter_t *iter) { + void *data; + slist_iter_check(iter); iter->prev = iter->cur; iter->cur = iter->next; - iter->next = g_slist_next(iter->cur); - return iter->cur ? iter->cur->data : NULL; + + slist_synchronize(iter->slist); + + iter->next = pslist_next(iter->cur); + data = iter->cur ? iter->cur->data : NULL; + + slist_unsynchronize(iter->slist); + + return data; } /** * Checks whether there is an item at the current position. */ -gboolean +bool slist_iter_has_item(const slist_iter_t *iter) { if (iter) { @@ -490,7 +650,7 @@ } } -gboolean +bool slist_iter_has_next(const slist_iter_t *iter) { if (iter) { @@ -501,7 +661,7 @@ } } -gpointer +void * slist_iter_current(const slist_iter_t *iter) { slist_iter_check(iter); @@ -517,7 +677,7 @@ void slist_iter_remove(slist_iter_t *iter) { - GSList *item, *prev; + pslist_t *item, *prev; slist_iter_check(iter); g_assert(2 == iter->slist->refcount); @@ -526,6 +686,9 @@ item = iter->cur; prev = iter->prev; + + slist_synchronize(iter->slist); + if (!slist_iter_next(iter)) { iter->cur = NULL; iter->next = NULL; @@ -537,7 +700,10 @@ * was not a "const". */ - slist_remove_item(deconstify_gpointer(iter->slist), prev, item); + slist_remove_item(deconstify_pointer(iter->slist), prev, item); + + slist_unsynchronize(iter->slist); + iter->prev = prev; iter->stamp++; } @@ -562,8 +728,12 @@ * the "const" contract here (the abstract data type is not changed). */ - wslist = deconstify_gpointer(iter->slist); + wslist = deconstify_pointer(iter->slist); + + slist_synchronize(wslist); wslist->refcount--; + slist_unsynchronize(wslist); + iter->magic = 0; WFREE(iter); @@ -575,55 +745,98 @@ * Check whether slist contains the `key' whereas equality is determined * using `func'. */ -gboolean -slist_contains(const slist_t *slist, gconstpointer key, GEqualFunc func, - gpointer *orig_key) +bool +slist_contains(const slist_t *slist, const void *key, eq_fn_t func, + void **orig_key) { - GSList *item; + pslist_t *item; + bool found = FALSE; slist_check(slist); g_assert(func); - for (item = slist->head; NULL != item; item = g_slist_next(item)) { + slist_synchronize(slist); + + PSLIST_FOREACH(slist->head, item) { if (func(key, item->data)) { if (orig_key) { *orig_key = item->data; } - return TRUE; + found = TRUE; + break; } } - return FALSE; + + slist_return(slist, found); } /** * Check whether slist contains the `key'. */ -gboolean -slist_contains_identical(const slist_t *slist, gconstpointer key) +bool +slist_contains_identical(const slist_t *slist, const void *key) { + bool contains; + slist_check(slist); - return NULL != g_slist_find(slist->head, deconstify_gpointer(key)); + slist_synchronize(slist); + contains = NULL != pslist_find(slist->head, deconstify_pointer(key)); + slist_return(slist, contains); } /** * Apply `func' to all the items in the structure. */ void -slist_foreach(const slist_t *slist, GFunc func, gpointer user_data) +slist_foreach(const slist_t *slist, GFunc func, void *user_data) { slist_check(slist); g_assert(func); - g_slist_foreach(slist->head, func, user_data); + slist_synchronize(slist); + + pslist_foreach(slist->head, func, user_data); slist_regression(slist); + slist_return_void(slist); +} + +/** + * Apply `func' to all the items in the structure, removing the entry + * if `func' returns TRUE. + * + * @return the amount of entries removed from the list. + */ +size_t +slist_foreach_remove(slist_t *slist, data_rm_fn_t func, void *user_data) +{ + size_t removed = 0; + pslist_t *item, *prev, *next; + + slist_check(slist); + g_assert(func); + + slist_synchronize(slist); + + for (prev = NULL, item = slist->head; NULL != item; item = next) { + next = pslist_next(item); + if ((*func)(item->data, user_data)) { + slist_remove_item(slist, prev, item); + removed++; + } else { + prev = item; + } + } + + slist_regression(slist); + slist_return(slist, removed); } static void -slist_freecb_wrapper(gpointer data, gpointer user_data) +slist_freecb_wrapper(void *data, void *user_data) { - slist_destroy_cb freecb = cast_pointer_to_func(user_data); + free_fn_t freecb = cast_pointer_to_func(user_data); (*freecb)(data); } @@ -632,7 +845,7 @@ * callback on all the items, then freeing the slist_t container. */ void -slist_free_all(slist_t **slist_ptr, slist_destroy_cb freecb) +slist_free_all(slist_t **slist_ptr, free_fn_t freecb) { g_assert(slist_ptr); g_assert(freecb); @@ -641,8 +854,12 @@ slist_t *slist = *slist_ptr; slist_check(slist); - G_SLIST_FOREACH_WITH_DATA(slist->head, slist_freecb_wrapper, + slist_synchronize(slist); + + PSLIST_FOREACH_CALL_DATA(slist->head, slist_freecb_wrapper, cast_func_to_pointer(freecb)); + + slist_unsynchronize(slist); slist_free(slist_ptr); } }
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/slist.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/slist.h
Changed
@@ -30,41 +30,37 @@ typedef struct slist_iter slist_iter_t; typedef struct slist slist_t; -typedef void (*slist_destroy_cb)(void *data); - slist_t *slist_new(void); void slist_free(slist_t **slist_ptr); -gboolean slist_remove(slist_t *slist, gpointer key); -gpointer slist_shift(slist_t *slist); -void slist_append(slist_t *slist, gpointer key); -void slist_prepend(slist_t *slist, gpointer key); -void slist_insert_sorted(slist_t *slist, gpointer key, GCompareFunc func); -gboolean slist_moveto_head(slist_t *slist, gpointer key); -gboolean slist_moveto_tail(slist_t *slist, gpointer key); -gpointer slist_head(const slist_t *slist); -gpointer slist_tail(const slist_t *slist); -guint slist_length(const slist_t *slist); -gboolean slist_contains(const slist_t *slist, gconstpointer key, - GEqualFunc func, gpointer *orig_key); -gboolean slist_contains_identical(const slist_t *slist, gconstpointer key); -void slist_foreach(const slist_t *slist, GFunc func, gpointer user_data); +void slist_thread_safe(slist_t *sl); +void slist_lock(slist_t *sl); +void slist_unlock(slist_t *sl); +bool slist_remove(slist_t *slist, void *key); +void *slist_shift(slist_t *slist); +void slist_append(slist_t *slist, void *key); +void slist_prepend(slist_t *slist, void *key); +void slist_insert_sorted(slist_t *slist, void *key, cmp_fn_t func); +bool slist_moveto_head(slist_t *slist, void *key); +bool slist_moveto_tail(slist_t *slist, void *key); +void *slist_head(const slist_t *slist); +void *slist_tail(const slist_t *slist); +uint slist_length(const slist_t *slist); +bool slist_contains(const slist_t *slist, const void *key, + eq_fn_t func, void **orig_key); +bool slist_contains_identical(const slist_t *slist, const void *key); +void slist_foreach(const slist_t *slist, GFunc func, void *user_data); +size_t slist_foreach_remove(slist_t *slist, data_rm_fn_t func, void *udata); slist_iter_t *slist_iter_on_head(const slist_t *slist); slist_iter_t *slist_iter_before_head(const slist_t *slist); slist_iter_t * slist_iter_removable_on_head(slist_t *slist); slist_iter_t * slist_iter_removable_before_head(slist_t *slist); void slist_iter_free(slist_iter_t **iter_ptr); -gboolean slist_iter_has_item(const slist_iter_t *iter); -gboolean slist_iter_has_next(const slist_iter_t *iter); -gpointer slist_iter_next(slist_iter_t *iter); -gpointer slist_iter_current(const slist_iter_t *iter); +bool slist_iter_has_item(const slist_iter_t *iter); +bool slist_iter_has_next(const slist_iter_t *iter); +void *slist_iter_next(slist_iter_t *iter); +void *slist_iter_current(const slist_iter_t *iter); void slist_iter_remove(slist_iter_t *iter); -void slist_free_all(slist_t **slist_ptr, slist_destroy_cb freecb); - -static inline slist_destroy_cb -cast_to_slist_destroy(const func_ptr_t fn) -{ - return (slist_destroy_cb) fn; -} +void slist_free_all(slist_t **slist_ptr, free_fn_t freecb); #endif /* _slist_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/smsort.c
Added
@@ -0,0 +1,430 @@ +/* + * Copyright (C) 2005 Nokia Corporation. + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Smoothsort is an in-situ sorting algorithm invented by E.D. Dijkstra to + * allow O(N) complexity when facing an already sorted array, and gradually + * incresing its complexity as the array is more randomly shuffled up to + * its maximal complexity of O(N.log N). Hence the "smooth" qualificative. + * + * This implementation is remarkable in that it is clean and almost litterally + * follows the original Dijkstra paper. Congratulations to Pekka for such a + * great work. + * + * Inclusion in this library and minor editings were made by Raphael Manfredi + * in order to adapt the code to the local coding style and benefit from + * the other services available in the library, such as assertions, and to + * make the interface more "qsort-like". + * + * This qsort()-like implementation is only optimized for aligned arrays of + * pointers or longs, because the offset computations done in swap_items() and + * cmp_items() are performance killers. + * + * To be able to efficiently sort other arrays, the original interface + * available as smsort_ext() may be preferred, but it requires two callback + * routines: + * + * bool less(void *m, size_t i, size_t j); + * void swap(void *m, size_t i, size_t j); + * + * The less() routine returns TRUE is mi < mj. + * The swap() routine swaps items mi and mj. + * + * Timing benchmarks show that smsort() is about twice slower as xsort() + * on randomly shuffled arrays of pointers but, of course, is always + * more efficient when the array of pointers is initially sorted. + * + * So smsort() should be used only when there is meta-knowledge that a + * significant portion of the array is already sorted. + * + * @author Pekka Pessi <Pekka.Pessi@nokia.com> + * @date 2005 + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#include "op.h" +#include "smsort.h" +#include "unsigned.h" + +#include "override.h" /* Must be the last header included */ + +/* + * This file is part of the Sofia-SIP package + * + * Copyright (C) 2005 Nokia Corporation. + * + * Contact: Pekka Pessi <pekka.pessi@nokia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +/** + * @file smoothsort.c + * @brief Smoothsort implementation + * + * Smoothsort is a in-place sorting algorithm with performance of O(N.log N) + * in worst case and O(N) in best case. + * + * @sa <a href="http://www.enterag.ch/hartwig/order/smoothsort.pdf"> + * "Smoothsort, an alternative for sorting in-situ", E.D. Dijkstra, EWD796a</a>, + * <http://www.enterag.ch/hartwig/order/smoothsort.pdf>. + * + * @author Pekka Pessi <Pekka.Pessi@nokia.com> + */ + +/** Description of current stretch */ +typedef struct { + size_t b, c; /** Leonardo numbers */ + uint64 p; /** Concatenation codification */ +} stretch; + +/** Description of sorted array */ +typedef struct { + char *m; + size_t s; + cmp_fn_t cmp; + smsort_less_t less; + smsort_swap_t swap; + uint8 aligned; +} array; + +/* + * Leonardo numbers are defined by the following recurrence. + * + * L0 = L1 = 1 + * Ln = Ln-1 + Ln-2 + 1 + * + * Hence stretch_up() and stretch_down() need to keep "b" and "c" to compute + * the next number or revert to the previous one. + */ + +static inline size_t +stretch_up(stretch s1) +{ + size_t next; + s->p >>= 1; + next = s->b + s->c + 1, s->c = s->b, s->b = next; + return next; +} + +static inline size_t +stretch_down(stretch s1, unsigned bit) +{ + size_t next; + s->p <<= 1, s->p |= bit; + next = s->c, s->c = s->b - s->c - 1, s->b = next; + return next; +} + +#if DEBUG_SMOOTHSORT +static char const * +binary(uint64 p) +{ + static char binary65; + int i; + if (p == 0) + return "0"; + binary64 = 0; + for (i = 64; p; p >>= 1) + binary--i = "01"p & 1; + return binary + i; +} +#else +#undef DEBUG +#define DEBUG(x) ((void)0) +#endif + +/** + * Swap two items from array. + */ +static void G_HOT +swap_items(array const *ary, size_t a, size_t b) +{ + if (ary->aligned) { + op_t tmp; + op_t *om = (op_t *) ary->m; + + tmp = omb; + omb = oma; + oma = tmp; + } else if (NULL == ary->swap) { + char *x = cast_to_char_ptr(&ary->ma * ary->s); + char *y = cast_to_char_ptr(&ary->mb * ary->s); + + /* + * Using SWAP() ends-up generating way faster code than 3 successive + * memcpy() calls, by a factor 2 at least. + * --RAM, 2012-02-28 + */ + + SWAP(x, y, ary->s); + } else { + ary->swap(ary->m, a, b); + } +} + +/** + * Compare two items in the array. + */ +static int G_HOT +cmp_items(array const *ary, size_t a, size_t b) +{ + if (ary->aligned) { + op_t *om = (op_t *) ary->m; + + return ary->cmp(&oma, &omb); + } else if (ary->cmp != NULL) { + size_t i = a * ary->s; + size_t j = b * ary->s; + + return ary->cmp(&ary->mi, &ary->mj); + } else { + return ary->less(ary->m, a, b) ? -1 : 0; + } +} + +/** + * Sift the root of the stretch. + * + * The low values are sifted up (towards index 0) from root. + * + * @param ary description of array to sort + * @param r root of the stretch + * @param s description of current stretch + */ +static void G_HOT +sift(array const *ary, size_t r, stretch s) +{ + while (s.b >= 3) { + size_t r2 = r - s.b + s.c; + if (cmp_items(ary, r - 1, r2) >= 0) { + r2 = r - 1; + stretch_down(&s, 0); + } + if (cmp_items(ary, r2, r) < 0) + break; + DEBUG(("\tswap(%p @%zu <=> @%zu)\n", ary, r, r2)); + swap_items(ary, r, r2); r = r2; + stretch_down(&s, 0); + } +} + +/** + * Trinkle the roots of the given stretches + * + * @param ary description of array to sort + * @param r root of the stretch + * @param s description of stretches to concatenate + */ +static void G_HOT +trinkle(array const *ary, size_t r, stretch s) +{ + DEBUG(("trinkle(%p, %zu, (%u, %s))\n", ary, r, s.b, binary(s.p))); + while (s.p != 0) { + size_t r2, r3; + while ((s.p & 1) == 0) + stretch_up(&s); + if (s.p == 1) + break; + r3 = r - s.b; + if (cmp_items(ary, r3, r) < 0) + break; + s.p--; + if (s.b < 3) { + DEBUG(("\tswap(%p @%zu <=> @%zu b=%u)\n", ary, r, r3, s.b)); + swap_items(ary, r, r3); r = r3; + continue; + } + r2 = r - s.b + s.c; + if (cmp_items(ary, r2, r - 1) < 0) { + r2 = r - 1; + stretch_down(&s, 0); + } + if (cmp_items(ary, r2, r3) < 0) { + DEBUG(("swap(%p %zu=%zu)\n", ary, r, r3)); + swap_items(ary, r, r3); r = r3; + continue; + } + DEBUG(("\tswap(%p @%zu <=> @%zu b=%u)\n", ary, r, r2, s.b)); + swap_items(ary, r, r2); r = r2; + stretch_down(&s, 0); + break; + } + sift(ary, r, s); +} + +/** + * Trinkles the stretches when the adjacent stretches are already trusty. + * + * @param ary description of array to sort + * @param r root of the stretch + * @param stretch description of stretches to trinkle + */ +static void G_HOT +semitrinkle(array const *ary, size_t r, stretch s) +{ + size_t r1 = r - s.c; + + DEBUG(("semitrinkle(%p, %zu, (%u, %s))\n", ary, r, s.b, binary(s.p))); + + if (cmp_items(ary, r, r1) < 0) { + DEBUG(("\tswap(%p @%zu <=> @%zu b=%u)\n", ary, r, r1, s.b)); + swap_items(ary, r, r1); + trinkle(ary, r1, s); + } +} + +/** + * Sort array using smoothsort. + * + * @param ary the array being sorted + * @param first first index to sort + * @param N amount ot items to sort + */ +static void +smoothsort(array const *ary, size_t first, size_t N) +{ + stretch s = { 1, 1, 1 }; + size_t r = first; + size_t q; + + if G_UNLIKELY(N <= 1) + return; + + DEBUG(("\nsmoothsort(%p, %zu)\n", ary, N)); + + for (q = 1; q != N; q++, r++, s.p++) { + DEBUG(("loop0 q=%zu, b=%u, p=%s \n", q, s.b, binary(s.p))); + if ((s.p & 7) == 3) { + sift(ary, r, s), stretch_up(&s), stretch_up(&s); + } + else /* if ((s.p & 3) == 1) */ { + if (q + s.c < N) + sift(ary, r, s); + else + trinkle(ary, r, s); + while (stretch_down(&s, 0) > 1) + /* noop */; + } + } + trinkle(ary, r, s); + for (; q > 1; q--) { + s.p--; + DEBUG(("loop1 q=%zu: b=%u p=%s\n", q, s.b, binary(s.p))); + if (s.b <= 1) { + while ((s.p & 1) == 0) + stretch_up(&s); + --r; + } + else /* if b >= 3 */ { + if (s.p) semitrinkle(ary, r - (s.b - s.c), s); + stretch_down(&s, 1); + semitrinkle(ary, --r, s); + stretch_down(&s, 1); + } + } +} + +/** + * Sort array using smoothsort, via a qsort()-like interface. + * + * Sort @a N elements from array @a base whose items are @a S byte long + * with smoothsort. + * + * The interface was made identical to that of qsort() by Raphael Manfredi, + * for easier drop-in replacement. + * + * @param base starting point of array to sort + * @param N number of elements to sort + * @param S size of each item in array + * @param cmp sort comparison returning -1, 0, +1 for ma <=> mb + */ +void +smsort(void *base, size_t N, size_t S, cmp_fn_t cmp) +{ + array const ary1 = { + { base, S, cmp, NULL, NULL, OPSIZ == S && op_aligned(base) } + }; + + g_assert(base != NULL); + g_assert(cmp != NULL); + g_assert(size_is_non_negative(N)); + g_assert(size_is_positive(S)); + + smoothsort(ary, 0, N); +} + +/** + * Sort array using smoothsort, via an extended interface. + * + * Sort @a N elements from array @a base starting with index @a r + * with smoothsort. + * + * The interface was made identical to that of qsort() by Raphael Manfredi, + * for easier drop-in replacement. + * + * @param base starting point of array to sort + * @param r lowest index to sort + * @param N number of elements to sort + * @param less comparison function returning TRUE if ma < mb + * @param swap swapper function exchanging elements ma and mb + */ +void +smsort_ext(void *base, size_t r, size_t N, + smsort_less_t less, smsort_swap_t swap) +{ + array const ary1 = { + { base, 0, NULL, less, swap, FALSE } + }; + + g_assert(base != NULL); + g_assert(size_is_non_negative(r)); + g_assert(size_is_non_negative(N)); + g_assert(less != NULL); + g_assert(swap != NULL); + + smoothsort(ary, r, N); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/smsort.h
Added
@@ -0,0 +1,50 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Smooth algorithm for in-situ sorting. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _smsort_h_ +#define _smsort_h_ + +typedef bool (*smsort_less_t)(void *, size_t, size_t); +typedef void (*smsort_swap_t)(void *, size_t, size_t); + +/* + * Public interface. + */ + +void smsort(void *b, size_t n, size_t s, cmp_fn_t cmp); +void smsort_ext(void *base, size_t r, size_t N, + smsort_less_t less, smsort_swap_t swap); + +#endif /* _smsort_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/sort-test.c
Added
@@ -0,0 +1,927 @@ +/* + * sort-test -- sort tests and benchmarking. + * + * Copyright (c) 2012 Raphael Manfredi <Raphael_Manfredi@pobox.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the authors nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "common.h" + +#include "lib/base16.h" +#include "lib/htable.h" +#include "lib/misc.h" +#include "lib/progname.h" +#include "lib/rand31.h" +#include "lib/sha1.h" +#include "lib/smsort.h" +#include "lib/str.h" +#include "lib/stringify.h" +#include "lib/tm.h" +#include "lib/tqsort.h" +#include "lib/xmalloc.h" +#include "lib/xsort.h" + +#define TEST_BITS 16 +#define TEST_WORDS 4 + +#define DUMP_BYTES 16 + +static size_t item_size; +static bool qsort_only; +static bool degenerative; +static bool silent_mode, verbose_mode; +static unsigned initial_seed; +static const char *current_test; +static const char *current_algorithm; + +typedef void (*xsort_routine)(void *b, size_t n, size_t s, cmp_fn_t cmp); + +static void G_NORETURN +usage(void) +{ + fprintf(stderr, + "Usage: %s -htDQSV -c items -n loops -s item_size\n" + " -N main-loops -R seed\n" + " -c : sets item count to test\n" + " -h : prints this help message\n" + " -n : sets amount of loops\n" + " -s : sets item size to test, in bytes\n" + " -t : time each test\n" + " -D : include degenerative data sets\n" + " -N : run the main test loop that many times (default = 1)\n" + " -Q : only test our xqsort() versus libc's qsort()\n" + " -R : seed for repeatable random key sequence\n" + " -S : silent mode -- do not print anything for successful tests\n" + " -V : verbose mode -- print status after each successful test\n" + , getprogname()); + exit(EXIT_FAILURE); +} + +static void G_NORETURN +test_abort() +{ + if (current_test != NULL) + printf("%7s - %s - FAILED\n", current_algorithm, current_test); + printf("use '-R %u' to reproduce problem.\n", initial_seed); + abort(); +} + +typedef int (*cmp_routine)(const void *a, const void *b); + +static int +long_cmp(const void *a, const void *b) +{ + const ulong *la = a, *lb = b; + const ulong va = *la, vb = *lb; + + return CMP(va, vb); +} + +static int +long_revcmp(const void *a, const void *b) +{ + const ulong *la = a, *lb = b; + const ulong va = *la, vb = *lb; + + return CMP(vb, va); +} + +static int +generic_cmp(const void *a, const void *b) +{ + return memcmp(a, b, item_size); /* Global variable */ +} + +static int +generic_revcmp(const void *a, const void *b) +{ + return memcmp(b, a, item_size); /* Global variable */ +} + +static cmp_routine +get_cmp_routine(size_t isize) +{ + switch (isize) { + case LONGSIZE: + return long_cmp; + default: + item_size = isize; /* Global variable */ + return generic_cmp; + } +} + +static cmp_routine +get_revcmp_routine(size_t isize) +{ + switch (isize) { + case LONGSIZE: + return long_revcmp; + default: + item_size = isize; /* Global variable */ + return generic_revcmp; + } +} + +struct plain { + char valLONGSIZE; +}; + +struct plain_1 { + char valLONGSIZE; + char bufINTSIZE; +}; + +struct plain_2 { + char valLONGSIZE; + char bufINTSIZE * 2; +}; + +struct plain_3 { + char valLONGSIZE; + char bufINTSIZE * 3; +}; + +struct plain_4 { + char valLONGSIZE; + char bufINTSIZE * 4; +}; + +static bool +plain_less(void *m, size_t i, size_t j) +{ + struct plain *x = m; + struct plain *a = ξ + struct plain *b = &xj; + + return long_cmp(&a->val, &b->val) < 0; +} + +static bool +plain_1_less(void *m, size_t i, size_t j) +{ + struct plain_1 *x = m; + struct plain_1 *a = ξ + struct plain_1 *b = &xj; + int c; + + c = memcmp(&a->val, &b->val, sizeof a->val); + if (0 == c) + return memcmp(&a->buf, &b->buf, sizeof a->buf) < 0; + return c < 0; +} + +static bool +plain_2_less(void *m, size_t i, size_t j) +{ + struct plain_2 *x = m; + struct plain_2 *a = ξ + struct plain_2 *b = &xj; + int c; + + c = memcmp(&a->val, &b->val, sizeof a->val); + if (0 == c) + return memcmp(&a->buf, &b->buf, sizeof a->buf) < 0; + return c < 0; +} + +static bool +plain_3_less(void *m, size_t i, size_t j) +{ + struct plain_3 *x = m; + struct plain_3 *a = ξ + struct plain_3 *b = &xj; + int c; + + c = memcmp(&a->val, &b->val, sizeof a->val); + if (0 == c) + return memcmp(&a->buf, &b->buf, sizeof a->buf) < 0; + return c < 0; +} + +static bool +plain_4_less(void *m, size_t i, size_t j) +{ + struct plain_4 *x = m; + struct plain_4 *a = ξ + struct plain_4 *b = &xj; + int c; + + c = memcmp(&a->val, &b->val, sizeof a->val); + if (0 == c) + return memcmp(&a->buf, &b->buf, sizeof a->buf) < 0; + return c < 0; +} + +static bool +generic_less(void *m, size_t i, size_t j) +{ + void *a = ptr_add_offset(m, i * item_size); /* Global variable */ + void *b = ptr_add_offset(m, j * item_size); /* Global variable */ + + return memcmp(a, b, item_size) < 0; /* Global variable */ +} + + +static smsort_less_t +get_less_routine(size_t isize) +{ + if (sizeof(struct plain) == isize) + return plain_less; + else if (sizeof(struct plain_1) == isize) + return plain_1_less; + else if (sizeof(struct plain_2) == isize) + return plain_2_less; + else if (sizeof(struct plain_3) == isize) + return plain_3_less; + else if (sizeof(struct plain_4) == isize) + return plain_4_less; + else { + item_size = isize; /* Global variable */ + return generic_less; + } +} + +static void +plain_swap(void *m, size_t i, size_t j) +{ + struct plain *x = m; + struct plain tmp; + + tmp = xj; + xj = xi; + xi = tmp; +} + +static void +plain_1_swap(void *m, size_t i, size_t j) +{ + struct plain_1 *x = m; + struct plain_1 tmp; + + tmp = xj; + xj = xi; + xi = tmp; +} + +static void +plain_2_swap(void *m, size_t i, size_t j) +{ + struct plain_2 *x = m; + struct plain_2 tmp; + + tmp = xj; + xj = xi; + xi = tmp; +} + +static void +plain_3_swap(void *m, size_t i, size_t j) +{ + struct plain_3 *x = m; + struct plain_3 tmp; + + tmp = xj; + xj = xi; + xi = tmp; +} + +static void +plain_4_swap(void *m, size_t i, size_t j) +{ + struct plain_4 *x = m; + struct plain_4 tmp; + + tmp = xj; + xj = xi; + xi = tmp; +} + +static void +generic_swap(void *m, size_t i, size_t j) +{ + void *a = ptr_add_offset(m, i * item_size); /* Global variable */ + void *b = ptr_add_offset(m, j * item_size); /* Global variable */ + + SWAP(a, b, item_size); /* Global variable */ +} + +static smsort_swap_t +get_swap_routine(size_t isize) +{ + if (sizeof(struct plain) == isize) + return plain_swap; + else if (sizeof(struct plain_1) == isize) + return plain_1_swap; + else if (sizeof(struct plain_2) == isize) + return plain_2_swap; + else if (sizeof(struct plain_3) == isize) + return plain_3_swap; + else if (sizeof(struct plain_4) == isize) + return plain_4_swap; + else + return generic_swap; +} + +static void +xtest(xsort_routine f, void *array, void *copy, + size_t cnt, size_t isize, size_t loops) +{ + cmp_routine cmp = get_cmp_routine(isize); + size_t len = cnt * isize; + + do { + memcpy(copy, array, len); + (*f)(copy, cnt, isize, cmp); + } while (--loops > 0); +} + +static void +xsort_test(void *array, void *copy, size_t cnt, size_t isize, size_t loops) +{ + xtest(xsort, array, copy, cnt, isize, loops); +} + +static void +xqsort_test(void *array, void *copy, size_t cnt, size_t isize, size_t loops) +{ + xtest(xqsort, array, copy, cnt, isize, loops); +} + + +static void +qsort_test(void *array, void *copy, size_t cnt, size_t isize, size_t loops) +{ + xtest(qsort, array, copy, cnt, isize, loops); +} + +static void +tqsort_test(void *array, void *copy, size_t cnt, size_t isize, size_t loops) +{ + xtest(tqsort, array, copy, cnt, isize, loops); +} + +static void +smsort_test(void *array, void *copy, size_t cnt, size_t isize, size_t loops) +{ + xtest(smsort, array, copy, cnt, isize, loops); +} + +static void +smsorte_test(void *array, void *copy, size_t cnt, size_t isize, size_t loops) +{ + smsort_less_t less = get_less_routine(isize); + smsort_swap_t swap = get_swap_routine(isize); + size_t len = cnt * isize; + + do { + memcpy(copy, array, len); + smsort_ext(copy, 0, cnt, less, swap); + } while (--loops > 0); +} + +static void +dump_unsorted(const void *copy, size_t cnt, size_t isize, size_t failed) +{ + size_t i; + + printf("unsorted array (at index %lu):\n", (ulong) failed); + + for (i = 0; i < cnt; i++) { + char bufDUMP_BYTES * 2 + 1; + size_t n; + const char *cur = const_ptr_add_offset(copy, i * isize); + + n = base16_encode(buf, sizeof buf - 1, cur, MIN(isize, DUMP_BYTES)); + bufn = '\0'; + printf("%6lu %s%s%s\n", (ulong) i, buf, + isize > DUMP_BYTES ? "..." : "", + i == failed ? " <-- FAILED" : ""); + } + test_abort(); +} + +static void +assert_is_sorted(const void *copy, size_t cnt, size_t isize) +{ + cmp_routine cmp = get_cmp_routine(isize); + size_t i; + + for (i = 1; i < cnt; i++) { + const char *prev = const_ptr_add_offset(copy, (i - 1) * isize); + const char *cur = const_ptr_add_offset(copy, i * isize); + + if ((*cmp)(prev, cur) > 0) + dump_unsorted(copy, cnt, isize, i); + } +} + +static void +count_items(htable_t *ht, const void *array, size_t cnt, size_t isize) +{ + size_t i; + + for (i = 0; i < cnt; i++) { + const char *cur = const_ptr_add_offset(array, i * isize); + size_t n; + + n = pointer_to_size(htable_lookup(ht, cur)); + htable_insert(ht, cur, size_to_pointer(n + 1)); + } +} + +static void +array_mismatch(const htable_t *ht, const void *key, const void *array, + const void *copy, size_t cnt, size_t isize) +{ + size_t i; + + printf("array mismatch:\n"); + printf("original array:\n"); + + for (i = 0; i < cnt; i++) { + char bufDUMP_BYTES * 2 + 1; + size_t n; + const char *cur = const_ptr_add_offset(array, i * isize); + + n = base16_encode(buf, sizeof buf - 1, cur, MIN(isize, DUMP_BYTES)); + bufn = '\0'; + printf("%6lu %s%s%s\n", (ulong) i, buf, + isize > DUMP_BYTES ? "..." : "", + 0 == memcmp(key, cur, isize) ? " <-- ERROR" : ""); + } + + printf("sorted array:\n"); + + for (i = 0; i < cnt; i++) { + char bufDUMP_BYTES * 2 + 1; + size_t n; + const char *cur = const_ptr_add_offset(copy, i * isize); + + n = base16_encode(buf, sizeof buf - 1, cur, MIN(isize, DUMP_BYTES)); + bufn = '\0'; + printf("%6lu %s%s%s\n", (ulong) i, buf, + isize > DUMP_BYTES ? "..." : "", + 0 == memcmp(key, cur, isize) ? " <-- (ERROR)" : + htable_contains(ht, cur) ? "" : " <-- UNKNOWN"); + } + + test_abort(); +} + +static void +assert_is_equivalent(const void *array, const void *copy, + size_t cnt, size_t isize) +{ + htable_t *aht, *cht; + htable_iter_t *iter; + const void *key; + void *value; + + aht = htable_create(HASH_KEY_FIXED, isize); + cht = htable_create(HASH_KEY_FIXED, isize); + + count_items(aht, array, cnt, isize); + count_items(cht, copy, cnt, isize); + + iter = htable_iter_new(aht); + while (htable_iter_next(iter, &key, &value)) { + size_t n = pointer_to_size(value); + size_t o = pointer_to_size(htable_lookup(cht, key)); + if (n != o) { + array_mismatch(aht, key, array, copy, cnt, isize); + } + htable_remove(cht, key); + } + htable_iter_release(&iter); + + g_assert(0 == htable_count(cht)); + + htable_free_null(&aht); + htable_free_null(&cht); +} + +static double +dry_run(void *array, void *copy, size_t cnt, size_t isize, size_t loops) +{ + tm_t start, end; + double ustart, uend; + + tm_now_exact(&start); + tm_cputime(&ustart, NULL); + qsort_test(array, copy, cnt, isize, loops); + tm_cputime(&uend, NULL); + tm_now_exact(&end); + + return ustart == uend ? tm_elapsed_f(&end, &start) : uend - ustart; +} + +static size_t +calibrate(void *array, size_t cnt, size_t isize) +{ + double elapsed; + size_t n = 1; + void *copy; + + copy = xmalloc(cnt * isize); + + do { + n *= 2; + elapsed = dry_run(array, copy, cnt, isize, n); + } while (elapsed < 0.1 && n < (1U << 31)); + + xfree(copy); + + return n; +} + +static void +compute_sha1(sha1_t *digest, const void *p, size_t len) +{ + SHA1_context ctx; + + SHA1_reset(&ctx); + SHA1_input(&ctx, p, len); + SHA1_result(&ctx, digest); +} + +static void +timeit(void (*f)(void *, void *, size_t, size_t, size_t), + size_t loops, void *array, size_t cnt, size_t isize, + bool chrono, const char *what, const char *algorithm) +{ + tm_t start, end; + double ustart, uend; + void *copy; + sha1_t before, after; + + copy = xmalloc(cnt * isize); + compute_sha1(&before, array, cnt * isize); + current_algorithm = algorithm; + + tm_now_exact(&start); + tm_cputime(&ustart, NULL); + (*f)(array, copy, cnt, isize, loops); + tm_cputime(&uend, NULL); + tm_now_exact(&end); + compute_sha1(&after, array, cnt * isize); + if (0 != memcmp(&before, &after, sizeof before)) + g_error("memory corruption on array during \"%s\" test", algorithm); + assert_is_sorted(copy, cnt, isize); + assert_is_equivalent(array, copy, cnt, isize); + xfree(copy); + + if (chrono) { + double elapsed = tm_elapsed_f(&end, &start); + double cpu = uend - ustart; + printf("%7s - %s - %lu time=%.3gs, CPU=%.3gs\n", algorithm, what, + (ulong) loops, elapsed, cpu); + } else if (verbose_mode) { + printf("%7s - %s - OK\n", algorithm, what); + } + fflush(stdout); +} + +static void * +generate_array(size_t cnt, size_t isize) +{ + size_t len; + void *array; + + len = cnt * isize; + array = xmalloc(len); + rand31_bytes(array, len); + + return array; +} + +enum degenerative { + IDENTICAL, + ALMOST_IDENTICAL, + SPARSLY_IDENTICAL, +}; + +static const char * +degenerative_to_string(enum degenerative how) +{ + switch (how) { + case IDENTICAL: return "identical"; + case ALMOST_IDENTICAL: return "almost identical"; + case SPARSLY_IDENTICAL: return "sparsly identical"; + } + + return NULL; +} + +static void * +generate_degenerative_array(size_t cnt, size_t isize, enum degenerative how) +{ + size_t len; + void *array; + + len = cnt * isize; + array = xmalloc(len); + + switch (how) { + case IDENTICAL: + memset(array, rand31() & 0xff, len); + break; + case SPARSLY_IDENTICAL: + case ALMOST_IDENTICAL: + memset(array, rand31() & 0xff, len); + { + size_t n; + size_t i; + + if (SPARSLY_IDENTICAL == degenerative) + n = cnt - cnt / 8; + else + n = 1 + rand31_value(cnt / 16); + + for (i = 0; i < n; i++) { + size_t j = rand31_value(cnt - 1); + void *x = ptr_add_offset(array, j * isize); + rand31_bytes(x, isize); + } + } + break; + } + + return array; +} + +static void +perturb_sorted_array(void *array, size_t cnt, size_t isize) +{ + size_t n; + size_t i; + + xsort(array, cnt, isize, get_cmp_routine(isize)); + + n = 1 + rand31_value(cnt / 16); + + for (i = 0; i < n; i++) { + size_t a = rand31_value(cnt - 1); + size_t b = rand31_value(cnt - 1); + void *x = ptr_add_offset(array, a * isize); + void *y = ptr_add_offset(array, b * isize); + + SWAP(x, y, isize); + } +} + +static void +run(void *array, size_t cnt, size_t isize, bool chrono, size_t loops, + const char *what) +{ + if (0 == loops) + loops = chrono ? calibrate(array, cnt, isize) : 1; + + current_test = what; + + if (!qsort_only) + timeit(xsort_test, loops, array, cnt, isize, chrono, what, "xsort"); + timeit(xqsort_test, loops, array, cnt, isize, chrono, what, "xqsort"); + timeit(qsort_test, loops, array, cnt, isize, chrono, what, "qsort"); + timeit(tqsort_test, loops, array, cnt, isize, chrono, what, "tqsort"); + if (!qsort_only) { + timeit(smsort_test, loops, array, cnt, isize, chrono, what, "smooth"); + timeit(smsorte_test, loops, array, cnt, isize, chrono, what, "smoothe"); + } + + current_test = NULL; +} + +static void +run_degenerative(enum degenerative how, size_t cnt, size_t isize, + bool chrono, size_t loops) +{ + char buf80; + void *array; + + str_bprintf(buf, sizeof buf, + "%zu %s item%s of %zu bytes", + cnt, degenerative_to_string(how), plural(cnt), isize); + + array = generate_degenerative_array(cnt, isize, how); + run(array, cnt, isize, chrono, loops, buf); + xfree(array); +} + +static void +test(size_t cnt, size_t isize, bool chrono, size_t loops) +{ + char buf80; + void *array; + void *copy; + + str_bprintf(buf, sizeof buf, "%zu item%s of %zu bytes", + cnt, plural(cnt), isize); + + array = generate_array(cnt, isize); + copy = xcopy(array, cnt * isize); + + run(array, cnt, isize, chrono, loops, buf); + + str_bprintf(buf, sizeof buf, "%zu sorted item%s of %zu bytes", + cnt, plural(cnt), isize); + + xsort(array, cnt, isize, get_cmp_routine(isize)); + run(array, cnt, isize, chrono, loops, buf); + + str_bprintf(buf, sizeof buf, + "%zu almost sorted item%s of %zu bytes", + cnt, plural(cnt), isize); + + perturb_sorted_array(array, cnt, isize); + run(array, cnt, isize, chrono, loops, buf); + + str_bprintf(buf, sizeof buf, + "%zu reverse-sorted item%s of %zu bytes", + cnt, plural(cnt), isize); + + xsort(array, cnt, isize, get_revcmp_routine(isize)); + run(array, cnt, isize, chrono, loops, buf); + + str_bprintf(buf, sizeof buf, + "%zu almost rev-sorted item%s of %zu bytes", + cnt, plural(cnt), isize); + + perturb_sorted_array(array, cnt, isize); + run(array, cnt, isize, chrono, loops, buf); + + str_bprintf(buf, sizeof buf, + "%zu sorted 3/4-1/4 item%s of %zu bytes", + cnt, plural(cnt), isize); + + memcpy(array, copy, cnt * isize); + + { + size_t thresh = cnt / 4; + size_t lower = cnt - thresh; + void *upper = ptr_add_offset(array, lower * isize); + + xsort(array, lower, isize, get_cmp_routine(isize)); + if (thresh > 0) + xsort(upper, thresh, isize, get_cmp_routine(isize)); + } + run(array, cnt, isize, chrono, loops, buf); + + str_bprintf(buf, sizeof buf, + "%zu sorted n-8 item%s of %zu bytes", + cnt, plural(cnt), isize); + + memcpy(array, copy, cnt * isize); + + { + size_t thresh = 8; + size_t lower = cnt - thresh; + void *upper = ptr_add_offset(array, lower * isize); + + if (cnt > thresh) { + xsort(array, lower, isize, get_cmp_routine(isize)); + xsort(upper, thresh, isize, get_cmp_routine(isize)); + } else { + xsort(array, cnt, isize, get_cmp_routine(isize)); + } + } + run(array, cnt, isize, chrono, loops, buf); + + xfree(array); + xfree(copy); + + if (degenerative) { + run_degenerative(IDENTICAL, cnt, isize, chrono, loops); + run_degenerative(ALMOST_IDENTICAL, cnt, isize, chrono, loops); + run_degenerative(SPARSLY_IDENTICAL, cnt, isize, chrono, loops); + } +} + +int +main(int argc, char **argv) +{ + extern int optind; + extern char *optarg; + bool tflag = FALSE; + size_t count = 0; + size_t isize = 0; + size_t loops = 0; + size_t main_loops = 1; + size_t main_count = 0; + bool multiple_loops = FALSE; + int c; + size_t i; + unsigned rseed = 0; + const char options = "c:hn:s:tDN:QR:SV"; + + progstart(argc, argv); + + while ((c = getopt(argc, argv, options)) != EOF) { + switch (c) { + case 'c': /* amount of items to use in array */ + count = atol(optarg); + break; + case 't': /* timing report */ + tflag++; + break; + case 'n': /* amount of loops */ + loops = atol(optarg); + break; + case 's': /* item size */ + isize = atol(optarg); + break; + case 'D': /* use degenerative data sets */ + degenerative = TRUE; + break; + case 'N': /* number of main loops */ + main_loops = atol(optarg); + break; + case 'Q': /* only test qsort() versus xqsort() */ + qsort_only = TRUE; + break; + case 'R': /* randomize in a repeatable way */ + rseed = atoi(optarg); + break; + case 'S': /* silent mode */ + silent_mode = TRUE; + break; + case 'V': /* verbose mode */ + verbose_mode = TRUE; + break; + case 'h': /* show help */ + default: + usage(); + break; + } + } + + if ((argc -= optind) != 0) + usage(); + + if (silent_mode && tflag) { + fprintf(stderr, "%s: -S has little effect when -t is present\n", + getprogname()); + } + + rand31_set_seed(rseed); + multiple_loops = main_loops > 1; + + while (main_loops--) { + initial_seed = rand31_current_seed(); + main_count++; + + if (multiple_loops) { + printf("test loop #%lu (%lu more) with seed %u\n", + (ulong) main_count, (ulong) main_loops, initial_seed); + } + + for (i = 1; i <= TEST_BITS; i++) { + bool is_last = count != 0; + size_t cnt = count != 0 ? count : 1U << i; + size_t j; + + if (!silent_mode && !verbose_mode) + printf("Testing with %zu items...\n", cnt); + + for (j = 0; j < TEST_WORDS; j++) { + bool is_last_size = isize != 0; + size_t size = isize != 0 ? isize : sizeof(void *) + INTSIZE * j; + + test(cnt, size, tflag, loops); + + if (is_last_size) + break; + } + + if (is_last) + break; + } + } + + return 0; +} +
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/sorted_array.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/sorted_array.c
Changed
@@ -33,44 +33,56 @@ #include "common.h" -#include "misc.h" +#include "sorted_array.h" + +#include "bsearch.h" #include "halloc.h" +#include "misc.h" +#include "vsort.h" #include "walloc.h" -#include "lib/sorted_array.h" #include "override.h" /* Must be the last header included */ +enum sorted_array_magic { SORTED_ARRAY_MAGIC = 0x054eca44 }; + struct sorted_array { + enum sorted_array_magic magic; void *items; /**< The actual array data */ - size_t num_items; /**< Number of valid items */ - size_t num_size; /**< Number of allocated items */ - size_t num_added; /**< Number of items added */ - size_t item_size; /**< The size of an array item (in bytes) */ - int (*cmp_func)(const void *a, const void *b); /**< Defines the order */ + size_t count; /**< Number of valid items (sorted so far) */ + size_t capacity; /**< Number of allocated items */ + size_t added; /**< Number of items added */ + size_t isize; /**< The size of an array item (in bytes) */ + int (*cmp)(const void *a, const void *b); /**< Defines the order */ }; +static inline void +sorted_array_check(const struct sorted_array * const sa) +{ + g_assert(sa != NULL); + g_assert(SORTED_ARRAY_MAGIC == sa->magic); +} + /** * Create new sorted array. * - * @param item_size size of each (expanded) item - * @param cmp_func item comparison function + * @param isize size of each (expanded) item + * @param cmp item comparison function * * @return created array. */ struct sorted_array * -sorted_array_new(size_t item_size, - int (*cmp_func)(const void *a, const void *b)) +sorted_array_new(size_t isize, + int (*cmp)(const void *a, const void *b)) { - static const struct sorted_array zero_tab; struct sorted_array *tab; - g_return_val_if_fail(item_size > 0, NULL); - g_return_val_if_fail(cmp_func, NULL); + g_return_val_if_fail(isize > 0, NULL); + g_return_val_if_fail(cmp, NULL); - WALLOC(tab); - *tab = zero_tab; - tab->item_size = item_size; - tab->cmp_func = cmp_func; + WALLOC0(tab); + tab->magic = SORTED_ARRAY_MAGIC; + tab->isize = isize; + tab->cmp = cmp; return tab; } @@ -81,10 +93,12 @@ sorted_array_free(struct sorted_array **tab_ptr) { struct sorted_array *tab; - + tab = *tab_ptr; if (tab) { + sorted_array_check(tab); HFREE_NULL(tab->items); + tab->magic = 0; WFREE(tab); *tab_ptr = NULL; } @@ -94,7 +108,7 @@ sorted_array_item_intern(const struct sorted_array *tab, size_t i) { char *base = tab->items; - return &basetab->item_size * i; + return &basetab->isize * i; } /** @@ -105,8 +119,8 @@ void * sorted_array_item(const struct sorted_array *tab, size_t i) { - g_assert(tab); - g_assert(i < tab->num_items); + sorted_array_check(tab); + g_assert(i < tab->count); return sorted_array_item_intern(tab, i); } @@ -116,23 +130,12 @@ * * @return pointer to the start of item if found, NULL otherwise. */ -G_GNUC_HOT void * +void * sorted_array_lookup(struct sorted_array *tab, const void *key) { - g_assert(tab); - -#define GET_ITEM(i) (sorted_array_item_intern(tab, (i))) -#define FOUND(i) G_STMT_START { \ - return sorted_array_item_intern(tab, (i)); \ - /* NOTREACHED */ \ -} G_STMT_END - - BINARY_SEARCH(const void *, key, - tab->num_items, tab->cmp_func, GET_ITEM, FOUND); - -#undef GET_ITEM -#undef FOUND - return NULL; + sorted_array_check(tab); + + return bsearch(key, tab->items, tab->count, tab->isize, tab->cmp); } /** @@ -146,17 +149,17 @@ sorted_array_add(struct sorted_array *tab, const void *item) { void *dst; - - g_assert(tab); - if (tab->num_added >= tab->num_size) { - tab->num_size = tab->num_size ? (tab->num_size * 2) : 8; - tab->items = hrealloc(tab->items, tab->num_size * tab->item_size); + sorted_array_check(tab); + + if (tab->added >= tab->capacity) { + tab->capacity = tab->capacity ? (tab->capacity * 2) : 8; + tab->items = hrealloc(tab->items, tab->capacity * tab->isize); } - dst = sorted_array_item_intern(tab, tab->num_added); - memmove(dst, item, tab->item_size); - tab->num_added++; + dst = sorted_array_item_intern(tab, tab->added); + memmove(dst, item, tab->isize); + tab->added++; } /** @@ -174,9 +177,9 @@ { size_t i; - g_assert(tab); + sorted_array_check(tab); - qsort(tab->items, tab->num_added, tab->item_size, tab->cmp_func); + vsort(tab->items, tab->added, tab->isize, tab->cmp); /* * Remove duplicates and overlapping ranges. Wider ranges override @@ -187,51 +190,52 @@ size_t removed; removed = 0; - for (i = 1; i < tab->num_added; i++) { + for (i = 1; i < tab->added; i++) { void *a, *b; a = sorted_array_item_intern(tab, i - 1); b = sorted_array_item_intern(tab, i); - if (0 == tab->cmp_func(a, b)) { + if (0 == tab->cmp(a, b)) { void *dst; int ret; ret = collision_func(a, b); if (0 != ret) { const void *last; - + removed++; /* Overwrite the current item with last listed item. */ - last = sorted_array_item_intern(tab, - tab->num_added - removed); + last = sorted_array_item_intern(tab, tab->added - removed); dst = ret < 0 ? a : b; - memcpy(dst, last, tab->item_size); + memcpy(dst, last, tab->isize); } - } } if (removed > 0) { /* Finally, correct order and item count. */ - tab->num_added -= removed; - qsort(tab->items, tab->num_added, tab->item_size, tab->cmp_func); + tab->added -= removed; + vsort_almost(tab->items, tab->added, tab->isize, tab->cmp); } } - tab->num_items = tab->num_added; - + tab->count = tab->added; + /* Compact the array if possible to save some memory. */ - if (tab->num_size > tab->num_items) { - tab->num_size = tab->num_items; - tab->items = hrealloc(tab->items, tab->num_size * tab->item_size); + if (tab->capacity > tab->count) { + tab->capacity = tab->count; + tab->items = hrealloc(tab->items, tab->capacity * tab->isize); } } +/** + * @return amount of items held in array. + */ size_t -sorted_array_size(const struct sorted_array *tab) +sorted_array_count(const struct sorted_array *tab) { - g_assert(tab); - return tab->num_items; + sorted_array_check(tab); + return tab->count; } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/sorted_array.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/sorted_array.h
Changed
@@ -43,6 +43,6 @@ void sorted_array_add(struct sorted_array *tab, const void *item); void sorted_array_sync(struct sorted_array *tab, int (*collision_func)(const void *a, const void *b)); -size_t sorted_array_size(const struct sorted_array *tab); +size_t sorted_array_count(const struct sorted_array *tab); /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/spinlock.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/spinlock.c
Changed
@@ -33,19 +33,78 @@ #include "common.h" +#define SPINLOCK_SOURCE + #include "spinlock.h" + #include "atomic.h" -#include "compat_sleep_ms.h" +#include "compat_usleep.h" +#include "crash.h" +#include "gentime.h" +#include "getcpucount.h" #include "log.h" -#include "tm.h" +#include "thread.h" #include "override.h" /* Must be the last header included */ #define SPINLOCK_LOOP 100 /* Loop iterations before sleeping */ -#define SPINLOCK_DELAY 1 /* Wait 1 ms before looping again */ -#define SPINLOCK_DEAD 5000 /* # of loops before flagging deadlock */ +#define SPINLOCK_DELAY 200 /* Wait 200 us before looping again */ +#define SPINLOCK_DEAD 8192 /* # of loops before flagging deadlock */ +#define SPINLOCK_DEADMASK (SPINLOCK_DEAD - 1) #define SPINLOCK_TIMEOUT 20 /* Crash after 20 seconds */ +int spinlock_pass_through; +static long spinlock_cpus; + +static inline void +spinlock_account(const spinlock_t *s, const char *file, unsigned line) +{ + thread_lock_got(s, THREAD_LOCK_SPINLOCK, file, line, NULL); +} + +static inline void +spinlock_account_swap(const spinlock_t *s, const char *file, unsigned line, + const void *plock) +{ + thread_lock_got_swap(s, THREAD_LOCK_SPINLOCK, file, line, plock, NULL); +} + +static inline void +spinunlock_account(const spinlock_t *s) +{ + thread_lock_released(s, THREAD_LOCK_SPINLOCK, NULL); +} + +static inline void ALWAYS_INLINE +spinlock_set_owner(volatile spinlock_t *s, const char *file, unsigned line) +{ + (void) s; + (void) file; + (void) line; +#ifdef SPINLOCK_OWNER_DEBUG + s->stid = thread_safe_small_id(); +#endif +#ifdef SPINLOCK_DEBUG + s->file = file; + s->line = line; +#endif +} + +static inline void ALWAYS_INLINE +spinlock_clear_owner(spinlock_t *s) +{ + (void) s; +#ifdef SPINLOCK_OWNER_DEBUG + s->stid = -1; +#endif +} + +void +spinlock_set_owner_external(spinlock_t *s, const char *file, unsigned line) +{ + spinlock_set_owner(s, file, line); +} + static inline void spinlock_check(const volatile struct spinlock * const slock) { @@ -54,74 +113,263 @@ } /** + * @return string for spinlock source. + */ +const char * +spinlock_source_string(enum spinlock_source src) +{ + switch (src) { + case SPINLOCK_SRC_SPINLOCK: return "spinlock"; + case SPINLOCK_SRC_MUTEX: return "mutex"; + } + g_assert_not_reached(); +} + +/** + * Enter crash mode: let all spinlocks be grabbed immediately. + */ +void G_COLD +spinlock_crash_mode(void) +{ + /* + * We must set ``spinlock_pass_through'' immediately since s_miniwarn() + * could call routines requiring mutexes... + */ + + if (0 == atomic_int_inc(&spinlock_pass_through)) { + unsigned count = thread_count(); + pid_t pid = getpid(); + + if (count != 1) { + s_rawwarn("disabling locks, " + "PID %lu now in thread-unsafe mode (%u threads)", + (ulong) pid, count); + } + } +} + +/** + * Enter exit mode: let all spinlocks be grabbed immediately. + * + * This is the same a crash_mode, only there is no warning emitted. + */ +void G_COLD +spinlock_exit_mode(void) +{ + atomic_int_inc(&spinlock_pass_through); +} + +/** * Warn about possible deadlock condition. * * Don't inline to provide a suitable breakpoint. */ -static NO_INLINE void -spinlock_deadlock(const volatile spinlock_t *s, unsigned count) +static NO_INLINE void G_COLD +spinlock_deadlock(const volatile void *obj, unsigned count, + const char *file, unsigned line) { + const volatile spinlock_t *s = obj; + + spinlock_check(s); + #ifdef SPINLOCK_DEBUG - s_minilog(G_LOG_LEVEL_WARNING, "spinlock %p already held by %s:%u", - (void *) s, s->file, s->line); +#ifdef SPINLOCK_OWNER_DEBUG + s_miniwarn("spinlock %p already %s by %s:%u (thread #%u)", + obj, s->lock ? "held" : "freed", s->file, s->line, s->stid); +#else + s_miniwarn("spinlock %p already %s by %s:%u", + obj, s->lock ? "held" : "freed", s->file, s->line); +#endif #endif - s_minicarp("possible spinlock deadlock #%u on %p", count, (void *) s); + atomic_mb(); + s_minicarp("%s spinlock deadlock #%u on %p at %s:%u", + s->lock ? "possible" : "improbable", count, obj, file, line); +} + +/** + * Abort on deadlock condition. + * + * Don't inline to provide a suitable breakpoint. + */ +static NO_INLINE void G_COLD +spinlock_deadlocked(const volatile void *obj, unsigned elapsed, + const char *file, unsigned line) +{ + const volatile spinlock_t *s = obj; + + s_rawwarn("deadlock on %sspinlock %p at %s:%u", + s->lock ? "" : "free ", obj, file, line); + + atomic_mb(); + spinlock_check(s); + +#ifdef SPINLOCK_DEBUG +#ifdef SPINLOCK_OWNER_DEBUG + s_rawwarn("spinlock %p %s by %s:%u (thread #%u) whilst we wait at %s:%u", + obj, s->lock ? "still held" : "already freed", + s->file, s->line, s->stid, file, line); +#else + s_rawwarn("spinlock %p %s by %s:%u whilst we wait at %s:%u", + obj, s->lock ? "still held" : "already freed", s->file, s->line, + file, line); +#endif +#endif + + crash_deadlocked(file, line); /* Will not return if concurrent call */ + thread_lock_deadlock(obj); + s_error("deadlocked on %sspinlock %p (after %u secs) at %s:%u", + s->lock ? "" : "free ", obj, elapsed, file, line); } /** * Obtain a lock, spinning first then spleeping. + * + * The routine does not return unless the lock is acquired. When waiting + * for too long, we first warn about possible deadlocks, then force a deadlock + * condition after more time. The supplied callbacks are there to perform + * the proper logging based on the source object being locked (and not on + * the spinlock itself which may be part of a more complex lock, like a mutex). + * + * No accounting of the lock is made, this must be handled by the caller + * upon return. + * + * @param s the spinlock we're trying to acquire + * @param src the type of object containing the spinlock + * @param src_object the lock object containing the spinlock + * @param deadlock callback to invoke when we detect a possible deadlock + * @param deadlocked callback to invoke when we decide we deadlocked + * @param file file where lock is being grabbed from + * @param line line where lock is being grabbed from */ -static void -spinlock_loop(volatile spinlock_t *s, int loops) +void +spinlock_loop(volatile spinlock_t *s, + enum spinlock_source src, const void *src_object, + spinlock_deadlock_cb_t deadlock, spinlock_deadlocked_cb_t deadlocked, + const char *file, unsigned line) { unsigned i; - time_t start = 0; + gentime_t start = GENTIME_ZERO; + int loops = SPINLOCK_LOOP; + const void *element = NULL; spinlock_check(s); - g_assert(loops >= 1); - for (i = 0; /* empty */; i++) { + /* + * This routine is only called when there is a lock contention, and + * therefore it is not on the fast locking path. We can therefore + * afford to conduct more extended checks. + */ + + if G_UNLIKELY(0 == spinlock_cpus) + spinlock_cpus = getcpucount(); + + thread_lock_contention(SPINLOCK_SRC_MUTEX == src ? + THREAD_LOCK_MUTEX : THREAD_LOCK_SPINLOCK); + + /* + * If in "pass-through" mode, we're crashing, so avoid deadlocks. + */ + + if G_UNLIKELY(spinlock_in_crash_mode()) { + spinlock_direct(s); + spinlock_set_owner(s, file, line); + return; + } + + /* + * When running mono-threaded, having to loop means we're deadlocked + * already, so immediately flag it. + */ + + if (thread_is_single()) + (*deadlocked)(src_object, 0, file, line); + + /* + * If the thread already holds the lock object, we're deadlocked. + * + * We don't need to check that for mutexes because we would not get here + * for a mutex already held by the thread: this is not a contention case. + */ + + if (SPINLOCK_SRC_SPINLOCK == src && thread_lock_holds(src_object)) + (*deadlocked)(src_object, 0, file, line); + +#ifdef HAS_SCHED_YIELD + if (1 == spinlock_cpus) + loops /= 10; +#endif + + for (i = 1; /* empty */; i++) { int j; for (j = 0; j < loops; j++) { if G_UNLIKELY(SPINLOCK_MAGIC != s->magic) { - s_error("spinlock %p %s whilst waiting, at attempt #%u", - (void *) s, + s_error("spinlock %s whilst waiting on %s %p, " + "attempt #%u at %s:%u", SPINLOCK_DESTROYED == s->magic ? "destroyed" : "corrupted", - i); + spinlock_source_string(src), src_object, i, file, line); } - if (atomic_acquire(&s->lock)) { + if G_LIKELY(s->lock) { + /* Lock is busy, do nothing as cheaply as possible */ + } else if (atomic_acquire(&s->lock)) { #ifdef SPINLOCK_DEBUG if (i >= SPINLOCK_DEAD) { - s_minilog(G_LOG_LEVEL_INFO, - "finally grabbed spinlock %p after %u attempts", - (void *) s, i); + s_miniinfo("finally grabbed %s %p after %u attempts" + " at %s:%u", + spinlock_source_string(src), src_object, i, file, line); } #endif /* SPINLOCK_DEBUG */ - return; + goto locked; } + if (1 == spinlock_cpus) + thread_yield(); } - if G_UNLIKELY(i != 0 && 0 == i % SPINLOCK_DEAD) { - spinlock_deadlock(s, i / SPINLOCK_DEAD); + /* + * We're about to sleep, hence we were not able to quickly grab the + * lock during our earlier spinning. We can therefore afford more + * expensive checks now. + * + * Note that gentime_now_exact() will do a thread_check_suspended(). + */ + + if G_UNLIKELY(0 == (i & SPINLOCK_DEADMASK)) + (*deadlock)(src_object, i / SPINLOCK_DEAD, file, line); + + if G_UNLIKELY(gentime_is_zero(start)) { + enum thread_lock_kind kind = THREAD_LOCK_SPINLOCK; + g_assert(NULL == element); + start = gentime_now_exact(); + if G_UNLIKELY(SPINLOCK_SRC_MUTEX == src) + kind = THREAD_LOCK_MUTEX; + element = thread_lock_waiting_element(src_object, kind, file, line); + } else { + time_delta_t d = gentime_diff(gentime_now_exact(), start); + if G_UNLIKELY(d > SPINLOCK_TIMEOUT) + (*deadlocked)(src_object, (unsigned) d, file, line); } - if G_UNLIKELY(0 == start) - start = tm_time(); + compat_usleep_nocancel(SPINLOCK_DELAY); - if (delta_time(tm_time_exact(), start) > SPINLOCK_TIMEOUT) { -#ifdef SPINLOCK_DEBUG - s_minilog(G_LOG_LEVEL_WARNING, "spinlock %p still held by %s:%u", - (void *) s, s->file, s->line); -#endif - s_error("deadlocked on spinlock %p (after %u secs)", - (void *) s, (unsigned) delta_time(tm_time(), start)); - } + /* + * If pass-through was activated whilst we were sleeping, return + * immediately, faking success. + */ - compat_sleep_ms(SPINLOCK_DELAY); + if G_UNLIKELY(spinlock_in_crash_mode()) { + spinlock_direct(s); + spinlock_set_owner(s, file, line); + goto locked; + } } + + g_assert_not_reached(); + +locked: + if G_UNLIKELY(element != NULL) + thread_lock_waiting_done(element, src_object); } /** @@ -134,6 +382,7 @@ s->magic = SPINLOCK_MAGIC; s->lock = 0; + spinlock_clear_owner(s); #ifdef SPINLOCK_DEBUG s->file = NULL; s->line = 0; @@ -142,6 +391,20 @@ } /** + * Reset a spinlock. + * + * This is intended to be used only by the thread management layer. + */ +void +spinlock_reset(spinlock_t *s) +{ + spinlock_check(s); + + s->lock = 0; + atomic_mb(); +} + +/** * Destroy a spinlock. * * It is not necessary to hold the lock on the spinlock to do this, although @@ -156,92 +419,159 @@ void spinlock_destroy(spinlock_t *s) { + bool was_locked; + spinlock_check(s); if (atomic_acquire(&s->lock)) { g_assert(SPINLOCK_MAGIC == s->magic); + was_locked = FALSE; + } else { + was_locked = TRUE; } s->magic = SPINLOCK_DESTROYED; /* Now invalid */ atomic_mb(); + + /* + * The normal protocol is to spinlock() before destroying. If the lock + * was held on entry, we have to assume it was locked by the thread. + * Otherwise, we have an error condition anyway (destroying a lock not + * taken by the thread). + */ + + if (was_locked) + spinunlock_account(s); } /** - * Grab a spinlock. + * Grab a spinlock from said location. */ void -spinlock_grab(spinlock_t *s) +spinlock_grab_from(spinlock_t *s, bool hidden, const char *file, unsigned line) { - spinlock_loop(s, SPINLOCK_LOOP); + spinlock_check(s); + + if G_UNLIKELY(!atomic_acquire(&s->lock)) { + spinlock_loop(s, SPINLOCK_SRC_SPINLOCK, s, + spinlock_deadlock, spinlock_deadlocked, file, line); + } + + spinlock_set_owner(s, file, line); + + if G_LIKELY(!hidden) + spinlock_account(s, file, line); } /** - * Grab spinlock only if available. + * Grab spinlock from said location, only if available. * * @return whether we obtained the lock. */ -gboolean -spinlock_grab_try(spinlock_t *s) +bool +spinlock_grab_try_from(spinlock_t *s, + bool hidden, const char *file, unsigned line) { spinlock_check(s); - return atomic_acquire(&s->lock); + if (atomic_acquire(&s->lock)) { + spinlock_set_owner(s, file, line); + if G_LIKELY(!hidden) + spinlock_account(s, file, line); + return TRUE; + } + + return FALSE; } -#ifdef SPINLOCK_DEBUG /** - * Grab a spinlock from said location. + * Grab regular spinlock, exchanging lock position with previous lock. */ void -spinlock_grab_from(spinlock_t *s, const char *file, unsigned line) +spinlock_grab_swap_from(spinlock_t *s, const void *plock, + const char *file, unsigned line) { - spinlock_loop(s, SPINLOCK_LOOP); - s->file = file; - s->line = line; + spinlock_check(s); + + if G_UNLIKELY(!atomic_acquire(&s->lock)) { + spinlock_loop(s, SPINLOCK_SRC_SPINLOCK, s, + spinlock_deadlock, spinlock_deadlocked, file, line); + } + + spinlock_set_owner(s, file, line); + spinlock_account_swap(s, file, line, plock); } /** - * Grab spinlock from said location, only if available. + * Attempt to grab regular spinlock, exchanging lock position with previous + * lock. * * @return whether we obtained the lock. */ -gboolean -spinlock_grab_try_from(spinlock_t *s, const char *file, unsigned line) +bool +spinlock_grab_swap_try_from(spinlock_t *s, const void *plock, + const char *file, unsigned line) { spinlock_check(s); if (atomic_acquire(&s->lock)) { - s->file = file; - s->line = line; + spinlock_set_owner(s, file, line); + spinlock_account_swap(s, file, line, plock); return TRUE; } return FALSE; } -#endif /* SPINLOCK_DEBUG */ /** - * Unlock a spinlock, which must be locked currently. + * Release spinlock, which must be locked currently. */ void -spinunlock(spinlock_t *s) +spinlock_release(spinlock_t *s, bool hidden) { spinlock_check(s); - g_assert(s->lock != 0); + g_assert(s->lock != 0 || spinlock_in_crash_mode()); - s->lock = 0; - atomic_mb(); + spinlock_clear_owner(s); + + /* + * The release acts as a "release barrier", ensuring that all previous + * stores have been made globally visible in memory. + */ + + atomic_release(&s->lock); + + if G_LIKELY(!hidden) + spinunlock_account(s); } /** - * Check that spinlock is held, for assertions. + * Grab a hidden spinlock from said location, using custom loop and no timeout. + * + * This is reserved to code that is called from spinlock_loop() and which still + * needs to get some lock to protect shared resources. */ -gboolean -spinlock_is_held(const spinlock_t *s) +void +spinlock_raw_from(spinlock_t *s, const char *file, unsigned line) { + int i = 0; spinlock_check(s); - return s->lock != 0; + while (!atomic_acquire(&s->lock)) { + if G_UNLIKELY(spinlock_in_crash_mode_raw()) { + spinlock_direct(s); + spinlock_set_owner(s, file, line); + break; + } + if G_UNLIKELY(0 == spinlock_cpus) + spinlock_cpus = getcpucount(); + if (1 == spinlock_cpus && i <= SPINLOCK_LOOP) + thread_yield(); + else if (i++ > SPINLOCK_LOOP) + compat_usleep_nocancel(SPINLOCK_DELAY); + } + + spinlock_set_owner(s, file, line); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/spinlock.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/spinlock.h
Changed
@@ -27,6 +27,61 @@ * * Spinning locks. * + * The API distinguishes between "regular" and "hidden" locks. If a lock is + * taken in "hidden" mode, it must be released in "hidden" mode as well. + * + * A "hidden" lock is not tracked at the thread level, and therefore does not + * cause any memory allocation and is very fast. A "regular" lock is tracked + * at the thread level in a stack, and allows sanity checks to prevent any + * out-of-order lock release, which can cause deadlocks later. + * + * In the advent a deadlock occurs, all the tracked locks owned by the thread + * are dumped. This means "hidden" locks never appear (hence the name). + * + * The locking API is made of three basic calls: + * + * spinlock() -- takes the lock, blocking if busy + * spinlock_try() -- try to take the lock, returns whether lock was taken + * spinunlock() -- releases the lock, which must be owned + * + * Each of these calls can be suffixed with _hidden to use "hidden" locks. + * A lock is not inherently "hidden": this adjective refers to the way the + * lock is taken. + * + * As a rule of thumb, "hidden" locks should be reserved to trivial low-level + * locking that does not require any nested locking and which has but one lock + * and one unlock statement, without much code in-between. The rationale is + * that we want outer critical section boundaries to be valid suspension points. + * + * For situations where critical sections must overlap (e.g. grab lock A, + * then lock B, release A and then release B), one must use one of the + * following routines: + * + * spinlock_swap() -- takes lock, then swap order of locks + * spinlock_try_swap() -- try to take lock, swapping order + * + * To achieve the critical section overlap, one would do this: + * + * spinlock(A); + * ... + * spinlock_swap(B, A); // the critical section overlap + * spinunlock(A); + * ... + * spinunlock(B); + * + * The swapping allows to release locks in the reverse order, something that + * the runtime normally forbids. + * + * When critical sections overlap, it is necessary to ensure that the locking + * order will always be the same. Otherwise, a deadlock could happen. + * + * The API also provided the following extra routine: + * + * spinlock_is_held() -- returns whether someone holds the lock + * + * When SPINLOCK_DEBUG is defined, each spinlock remembers the location that + * initially grabbed the lock, which can be useful when debugging deadlocks. + * * @author Raphael Manfredi * @date 2011 */ @@ -34,8 +89,15 @@ #ifndef _spinlock_h_ #define _spinlock_h_ +#include "atomic.h" /* For atomic_lock_t */ +#include "thread.h" /* For thread_check_suspended() */ + #if 1 -#define SPINLOCK_DEBUG +#define SPINLOCK_DEBUG /* Tracks where we take the lock */ +#endif +#if 0 +#define SPINLOCK_OWNER_DEBUG /* Tracks who takes the lock */ +#include "thread.h" /* For thread_small_id() */ #endif enum spinlock_magic { @@ -51,7 +113,10 @@ */ typedef struct spinlock { enum spinlock_magic magic; - int lock; + atomic_lock_t lock; +#ifdef SPINLOCK_OWNER_DEBUG + uint8 stid; /* Locking thread, for assertions & debug */ +#endif #ifdef SPINLOCK_DEBUG const char *file; unsigned line; @@ -62,7 +127,11 @@ * Static initialization value for a spinlock structure. */ #ifdef SPINLOCK_DEBUG +#ifdef SPINLOCK_OWNER_DEBUG +#define SPINLOCK_INIT { SPINLOCK_MAGIC, 0, -1, NULL, 0 } +#else #define SPINLOCK_INIT { SPINLOCK_MAGIC, 0, NULL, 0 } +#endif #else #define SPINLOCK_INIT { SPINLOCK_MAGIC, 0 } #endif @@ -71,28 +140,168 @@ * These should not be called directly by user code to allow debugging. */ -void spinlock_grab(spinlock_t *s); -gboolean spinlock_grab_try(spinlock_t *s); +void spinlock_release(spinlock_t *s, bool hidden); /* * Public interface. */ +void spinlock_grab_from(spinlock_t *s, + bool hidden, const char *file, unsigned line); +bool spinlock_grab_try_from(spinlock_t *s, bool hidden, + const char *file, unsigned line); +void spinlock_grab_swap_from(spinlock_t *s, const void *plock, + const char *file, unsigned line); +bool spinlock_grab_swap_try(spinlock_t *s, const void *plock, + const char *file, unsigned line); +void spinlock_raw_from(spinlock_t *s, const char *file, unsigned line); + +#define spinlock(x) spinlock_grab_from((x), FALSE, _WHERE_, __LINE__) +#define spinlock_try(x) spinlock_grab_try_from((x), FALSE, _WHERE_, __LINE__) + +#define spinlock_const(x) \ + spinlock_grab_from(deconstify_pointer(x), FALSE, _WHERE_, __LINE__) + +#define spinlock_try_const(x) \ + spinlock_grab_from(deconstify_pointer(x), FALSE, _WHERE_, __LINE__) + +#define spinlock_hidden(x) \ + spinlock_grab_from((x), TRUE, _WHERE_, __LINE__) + +#define spinlock_hidden_try(x) \ + spinlock_grab_try_from((x), TRUE, _WHERE_, __LINE__) + +#define spinlock_swap(x,y) \ + spinlock_grab_swap_from((x), (y), _WHERE_, __LINE__) + +#define spinlock_swap_try(x,y) \ + spinlock_grab_swap_try_from((x), (y), _WHERE_, __LINE__) + +#define spinlock_raw(x) spinlock_raw_from((x), _WHERE_, __LINE__) + +#define spinunlock(x) spinlock_release((x), FALSE) +#define spinunlock_hidden(x) spinlock_release((x), TRUE) +#define spinunlock_raw(x) spinlock_release((x), TRUE) + +#define spinunlock_const(x) spinlock_release(deconstify_pointer(x), FALSE) + #ifdef SPINLOCK_DEBUG -void spinlock_grab_from(spinlock_t *s, const char *file, unsigned line); -gboolean spinlock_grab_try_from(spinlock_t *s, const char *file, unsigned line); +/* + * Direct operations should only be used when locking and unlocking is + * always done from a single thread, thereby not requiring that atomic + * operations be used. + * + * These allow assertions like spinlock_is_held() without paying a huge + * cost to the locking / unlocking process. + */ + +#define spinlock_direct(x) G_STMT_START { \ + (x)->lock = 1; \ + (x)->file = _WHERE_; \ + (x)->line = __LINE__; \ +} G_STMT_END + +#define spinunlock_direct(x) G_STMT_START { \ + (x)->lock = 0; \ +} G_STMT_END + +#else /* !SPINLOCK_DEBUG */ + +#define spinlock_direct(x) G_STMT_START { \ + (x)->lock = 1; \ +} G_STMT_END + +#define spinunlock_direct(x) G_STMT_START { \ + (x)->lock = 0; \ +} G_STMT_END -#define spinlock(x) spinlock_grab_from((x), _WHERE_, __LINE__) -#define spinlock_try(x) spinlock_grab_try_from((x), _WHERE_, __LINE__) -#else -#define spinlock(x) spinlock_grab((x)) -#define spinlock_try(x) spinlock_grab_try((x)) #endif /* SPINLOCK_DEBUG */ void spinlock_init(spinlock_t *s); void spinlock_destroy(spinlock_t *s); -void spinunlock(spinlock_t *s); -gboolean spinlock_is_held(const spinlock_t *s); +void spinlock_crash_mode(void); +void spinlock_exit_mode(void); + +#if defined(SPINLOCK_SOURCE) || defined(MUTEX_SOURCE) + +enum spinlock_source { + SPINLOCK_SRC_SPINLOCK, + SPINLOCK_SRC_MUTEX +}; + +const char *spinlock_source_string(enum spinlock_source src); + +/** + * Callback to signal possible deadlocking condition. + */ +typedef void (spinlock_deadlock_cb_t)(const volatile void *, unsigned, + const char *file, unsigned line); + +/** + * Callback to abort on definitive deadlocking condition. + */ +typedef void (spinlock_deadlocked_cb_t)(const volatile void *, unsigned, + const char *file, unsigned line); + +void spinlock_loop(volatile spinlock_t *s, + enum spinlock_source src, const void *src_object, + spinlock_deadlock_cb_t deadlock, spinlock_deadlocked_cb_t deadlocked, + const char *file, unsigned line); + +void spinlock_set_owner_external(spinlock_t *, const char *, unsigned); + +#endif /* SPINLOCK_SOURCE || MUTEX_SOURCE */ + +#ifdef THREAD_SOURCE +void spinlock_reset(spinlock_t *s); +#endif /* THREAD_SOURCE */ + +extern int spinlock_pass_through; + +static inline bool +spinlock_in_crash_mode(void) +{ + if G_LIKELY(0 == atomic_int_get(&spinlock_pass_through)) + return FALSE; + thread_check_suspended(); + return TRUE; +} + +static inline bool +spinlock_in_crash_mode_raw(void) +{ + return 0 != atomic_int_get(&spinlock_pass_through); +} + +/** + * Check that spinlock is held, for assertions. + */ +static inline bool NON_NULL_PARAM((1)) +spinlock_is_held(const spinlock_t *s) +{ +#ifdef SPINLOCK_OWNER_DEBUG + if ( + (uint8) THREAD_UNKNOWN_ID != s->stid && + (uint8) thread_safe_small_id() != s->stid + ) { + return spinlock_in_crash_mode(); /* Assume OK in crash mode */ + } +#endif /* SPINLOCK_OWNER_DEBUG */ + + /* Make this fast, no assertion on the spinlock validity */ + return s->lock != 0 || spinlock_in_crash_mode(); +} + +/** + * Fast version of spinlock_is_held() to be used when we do not want to + * check the spinlock ownership, even with compiled with SPINLOCK_OWNER_DEBUG. + */ +static inline bool NON_NULL_PARAM((1)) +spinlock_is_held_fast(const spinlock_t *s) +{ + /* Make this fast, no assertion on the spinlock validity */ + return s->lock != 0 || spinlock_in_crash_mode(); +} #endif /* _spinlock_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/spopen-test.c
Added
@@ -0,0 +1,703 @@ +/* + * spopen-test -- unit tests for the spopen() function family. + * + * Copyright (c) 2015 Raphael Manfredi <Raphael_Manfredi@pobox.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the authors nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "common.h" + +#ifdef I_SYS_WAIT +#include <sys/wait.h> +#endif + +#include "concat.h" +#include "exit2str.h" +#include "fd.h" +#include "file.h" +#include "glib-missing.h" +#include "halloc.h" +#include "hset.h" +#include "htable.h" +#include "log.h" +#include "misc.h" +#include "progname.h" +#include "signal.h" +#include "spopen.h" +#include "stacktrace.h" +#include "str.h" +#include "strtok.h" +#include "thread.h" +#include "walloc.h" + +const char *progpath; +static bool verbose, sigpipe; +const char *redirect_child; + +static const mode_t TEST_MODE = S_IRUSR | S_IWUSR; /* 0600 */ + +/* Duplicated main() arguments, in read-only memory */ +static int main_argc; +static const char **main_argv; +static const char **main_env; + +static void G_NORETURN +usage(void) +{ + fprintf(stderr, + "Usage: %s -hpv\n" + " -r file\n" + " -z fn1,fn2...\n" + " -X k1=v1,k2=v2\n" + " -h : prints this help message\n" + " -p : test SIGPIPE / EPIPE\n" + " -r : redirect child's input/output to file\n" + " -v : ask for details about what is happening\n" + " -z : zap (suppress) messages from listed routines\n" + " -X : key/value tuples to execute tests (in children process)\n" + , getprogname()); + exit(EXIT_FAILURE); +} + +static hset_t *zap; + +static void +zap_record(const char *value) +{ + strtok_t *s; + const char *tok; + + zap = hset_create(HASH_KEY_STRING, 0); + s = strtok_make_strip(value); + + while ((tok = strtok_next(s, ","))) { + hset_insert(zap, h_strdup(tok)); + } + + strtok_free_null(&s); +} + +static void +emitv(bool nl, const char *fmt, va_list args) +{ + static pid_t pid; + str_t *s = str_new(512); + + if G_UNLIKELY(0 == pid) + pid = getpid(); + + str_vprintf(s, fmt, args); + fprintf(stderr, "%d ", (int) pid); + fputs(str_2c(s), stderr); + if (nl) + fputc('\n', stderr); + fflush(stderr); + + str_destroy_null(&s); +} + +static void G_PRINTF(1, 2) +emit(const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + emitv(TRUE, fmt, args); + va_end(args); +} + +static void G_PRINTF(2, 3) +emit_zap(const char *caller, const char *fmt, ...) +{ + va_list args; + + if (zap != NULL && hset_contains(zap, caller)) + return; /* Zap messages from this caller */ + + va_start(args, fmt); + emitv(TRUE, fmt, args); + va_end(args); +} + +#define emitz(fmt, ...) emit_zap(G_STRFUNC, (fmt), __VA_ARGS__) + +static int G_NULL_TERMINATED +verbose_spopen(char * const envp, + const char *path, const char *mode, int fd2, ...) +{ + int pfd; + va_list ap; + char *cmd; + size_t cnt = 0; + char **array, **q; + const char *s; + + if (!verbose) + goto launch; + + va_start(ap, fd); + while (NULL != va_arg(ap, const char *)) + cnt++; + va_end(ap); + + HALLOC_ARRAY(array, cnt + 1); + q = array; + + va_start(ap, fd); + while (NULL != ((s = va_arg(ap, const char *)))) + *q++ = deconstify_char(s); + va_end(ap); + + *q++ = NULL; + + g_assert(ptr_diff(q, array) == (cnt + 1) * sizeof array0); + + cmd = h_strjoinv(" ", array); + emitz("sopen \"%s\" %s %s", mode, path, cmd); + + HFREE_NULL(cmd); + HFREE_NULL(array); + +launch: + va_start(ap, fd); + pfd = spopenle_v(path, mode, fd, path, ap, envp); + va_end(ap); + + if (-1 == pfd) + s_error("cannot spopen(): %m"); + + return pfd; +} + +static void +test_child_expect_where(int pfd, bool success, const char *where) +{ + int status; + pid_t child; + + g_assert(is_valid_fd(pfd)); + + child = sppidof(pfd); + status = spclose(pfd); + + if (-1 == status) { + s_error("spclose() failed: %m"); + return; + } + + if (WIFEXITED(status)) { + if (success != (0 == WEXITSTATUS(status))) { + s_error("was expecting %s from PID %lu at %s, got %d", + success ? "success" : "failure", (ulong) child, where, + WEXITSTATUS(status)); + } + emitz("exit status for PID %lu is %d (PASSED) at %s", + (ulong) child, WEXITSTATUS(status), where); + } else { + s_error("abnormal exit for PID %lu at %s: %s", (ulong) child, where, + exit2str(status)); + } +} + +#define test_child_expect(p,s) test_child_expect_where((p), (s), G_STRLOC) + +const char MESSAGE = "This is the message exchanged"; +const char FILEMSG = "This is the message in the file"; +const char FILEMSG2 = "This is the 2nd message in the file"; + +static void +read_message(int fd, const char expect, size_t expectlen) +{ + char buf80; + int r = read(fd, buf, sizeof buf); + if (-1 == r) + s_error("%s(): cannot read from fd #%d: %m", G_STRFUNC, fd); + if (UNSIGNED(r) != expectlen) + s_error("%s(): was expecting %zu bytes, got %d", + G_STRFUNC, expectlen, r); + g_assert('\0' == bufr - 1); /* NUL terminated message string */ + if (0 != memcmp(buf, expect, expectlen)) + s_error("%s(): got wrong message \"%s\"", G_STRFUNC, buf); + if (STDIN_FILENO == fd) + emitz("got \"%s\" from parent PID %ld", buf, (ulong) getppid()); + else if (is_a_fifo(fd)) + emitz("got \"%s\" from child PID %ld", buf, (ulong) sppidof(fd)); + else + emitz("read \"%s\" from file via fd #%d", buf, fd); +} + +static void +write_message(int fd, const char msg, size_t msglen) +{ + int r = write(fd, msg, msglen); + if (-1 == r) + s_error("%s(): cannot write to fd #%d: %m", G_STRFUNC, fd); + if (UNSIGNED(r) != msglen) + s_error("%s(): was expecting to write %zu bytes, wrote only %d", + G_STRFUNC, msglen, r); + if (STDOUT_FILENO == fd) + emitz("sent \"%s\" to parent PID %ld", msg, (ulong) getppid()); + else if (is_a_fifo(fd)) + emitz("sent \"%s\" to child PID %ld", msg, (ulong) sppidof(fd)); + else + emitz("wrote \"%s\" to file via fd #%d", msg, fd); +} + +#define READ_MESSAGE(f) read_message(f, MESSAGE, sizeof MESSAGE) +#define WRITE_MESSAGE(f) write_message(f, MESSAGE, sizeof MESSAGE) + +#define READ_FILEMSG(f) read_message(f, FILEMSG, sizeof FILEMSG) +#define WRITE_FILEMSG(f) write_message(f, FILEMSG, sizeof FILEMSG) + +#define READ_FILEMSG2(f) read_message(f, FILEMSG2, sizeof FILEMSG2) +#define WRITE_FILEMSG2(f) write_message(f, FILEMSG2, sizeof FILEMSG2) + +static void +test_file_closed(int fd, const char *what) +{ + if (-1 != close(fd)) { + s_warning("%s(): %s=%d was not closed by spopenve()", + G_STRFUNC, what, fd); + } else { + emitz("good, cannot close %s=%d, was done by spopenve(): %s", + what, fd, symbolic_errno(errno)); + } +} + +static sigjmp_buf jmpbuf; +static bool got_sigpipe; + +static void +caught_sigpipe(int signo) +{ + s_info("got %s", signal_name(signo)); + if (SIGPIPE == signo) + ATOMIC_INC(&got_sigpipe); + siglongjmp(jmpbuf, signo); +} + +static void +test_spopenve(void) +{ + volatile sig_atomic_t pfd; + char buf128; + const char *test = "t=plain,"; + const char *verb = verbose ? ",verb" : ""; + char *envp = { + "var=got it", + NULL + }; + int fd2; + + fd0 = fd1 = SPOPEN_ASIS; + + concat_strings(buf, sizeof buf, test, "x.plain", verb, NULL_PTR); + pfd = verbose_spopen(NULL, progpath, "r", fd, "-X", buf, NULL_PTR); + READ_MESSAGE(pfd); + test_child_expect(pfd, TRUE); + + test = "t=env,"; + + concat_strings(buf, sizeof buf, test, verb, ",envp", NULL_PTR); + pfd = verbose_spopen(NULL, progpath, "w", fd, "-X", buf, NULL_PTR); + WRITE_MESSAGE(pfd); + test_child_expect(pfd, TRUE); + + concat_strings(buf, sizeof buf, test, "x.vars", verb, ",envp", NULL_PTR); + pfd = verbose_spopen(envp, progpath, "w", fd, "-X", buf, NULL_PTR); + WRITE_MESSAGE(pfd); + test_child_expect(pfd, TRUE); + + if (redirect_child != NULL) { + int f; + + emitz("testing redirections to / from file %s", redirect_child); + + f = file_open(redirect_child, O_WRONLY | O_CREAT, TEST_MODE); + g_assert(f != -1); + WRITE_FILEMSG(f); + close(f); + + fd0 = file_open(redirect_child, O_RDONLY, 0); + g_assert(fd0 != -1); + + test = "t=file,"; + + concat_strings(buf, sizeof buf, test, "x.read", verb, NULL_PTR); + pfd = verbose_spopen(NULL, progpath, "r", fd, "-X", buf, NULL_PTR); + READ_FILEMSG(pfd); + test_child_expect(pfd, TRUE); + + test_file_closed(fd0, "fd0"); + + fd0 = file_open(redirect_child, O_WRONLY | O_TRUNC | O_CREAT, 0); + g_assert(fd0 != -1); + + concat_strings(buf, sizeof buf, test, "x.write", verb, NULL_PTR); + pfd = verbose_spopen(NULL, progpath, "w", fd, "-X", buf, NULL_PTR); + WRITE_FILEMSG2(pfd); + test_child_expect(pfd, TRUE); + + test_file_closed(fd0, "fd0"); + + f = file_open(redirect_child, O_RDONLY, 0); + g_assert(f != -1); + READ_FILEMSG2(f); + close(f); + + if (-1 == unlink(redirect_child)) { + s_warning("%s(): could not unlink %s: %m", + G_STRFUNC, redirect_child); + } + } + + if (sigpipe) { + int i; + + emitz("testing SIGPIPE / EPIPE in parent PID %lu", (ulong) getpid()); + + test = "t=epipe,"; + + concat_strings(buf, sizeof buf, test, verb, NULL_PTR); + pfd = verbose_spopen(NULL, progpath, "w", NULL, "-X", buf, NULL_PTR); + + signal_catch(SIGPIPE, caught_sigpipe); + + for (i = 0; i < 20; i++) { + if (Sigsetjmp(jmpbuf, TRUE)) { + g_assert(got_sigpipe); + goto good; + } + if (-1 == write(pfd, &i, 1)) + goto failed; + emitz("write #%i to fd #%d was OK, sleeping 500 msecs", + i+1, (int) pfd); + thread_sleep_ms(500); + } + + s_fatal_exit(EXIT_FAILURE, "did not get any SIGPIPE signal"); + + failed: + s_error("BAD, write() to child %lu failed: %m", (ulong) sppidof(pfd)); + + good: + emitz("good, write() to child %lu caused a SIGPIPE", + (ulong) sppidof(pfd)); + spclose(pfd); + + concat_strings(buf, sizeof buf, test, verb, NULL_PTR); + pfd = verbose_spopen(NULL, progpath, "w", NULL, "-X", buf, NULL_PTR); + + signal_catch(SIGPIPE, SIG_IGN); + + for (i = 0; i < 20; i++) { + if (Sigsetjmp(jmpbuf, TRUE)) { + g_assert(got_sigpipe); + goto unexpected_signal; + } + if (-1 == write(pfd, &i, 1)) + goto cannot_write; + emitz("write #%i to fd #%d was OK, sleeping 500 msecs", + i+1, (int) pfd); + thread_sleep_ms(500); + } + + s_fatal_exit(EXIT_FAILURE, "did not get any EPIPE error"); + + unexpected_signal: + s_error("BAD, write() to child %lu caused a SIGPIPE", + (ulong) sppidof(pfd)); + + cannot_write: + emitz("good, write() to child %lu failed: %m", (ulong) sppidof(pfd)); + g_assert(EPIPE == errno); + spclose(pfd); + } +} + +static bool +x_wants(const htable_t *xv, const char *key) +{ + const char *val = htable_lookup(xv, key); + + if (NULL == val || !is_strcaseprefix(val, "y")) + return FALSE; + + return TRUE; +} + +static void +x_expr_check(bool expr, const char *estr, const char *fn, const char *wh) +{ + if (!expr) { + emit("FAILED: \"%s\" in %s() at %s", estr, fn, wh); + exit(EXIT_FAILURE); + } +} + +static void G_PRINTF(5,6) +x_expr_check_log(bool expr, const char *estr, const char *fn, const char *wh, + const char *fmt, ...) +{ + if (!expr) { + va_list ap; + + emit("FAILED: \"%s\" in %s() at %s", estr, fn, wh); + va_start(ap, fmt); + emitv(TRUE, fmt, ap); + va_end(ap); + exit(EXIT_FAILURE); + } +} + +#define x_check(expr) x_expr_check((expr), # expr, G_STRFUNC, G_STRLOC) + +#define x_check_log(expr, fmt, ...) \ + x_expr_check_log((expr), # expr, G_STRFUNC, G_STRLOC, (fmt), __VA_ARGS__) + +static void +x_dump_strvec(const char *name, const char **vec) +{ + size_t i = 0; + const char *s; + + while (NULL != ((s = veci))) { + emitz("%s%zu = \"%s\"", name, i, s); + i++; + } +} + +static void +x_spopenve_plain(const htable_t *xv) +{ + if (x_wants(xv, "x.plain")) { + x_check_log(3 == main_argc, "main_argc=%d", main_argc); + x_check(0 == strcmp(main_argv1, "-X")); + } + WRITE_MESSAGE(STDOUT_FILENO); +} + +static void +x_spopenve_env(const htable_t *xv) +{ + const char *var = getenv("var"); + const char *no = getenv("no"); + + if (x_wants(xv, "x.vars")) { + x_check(var != NULL); + x_check(NULL == no); + + if (x_wants(xv, "verb")) { + emitz("var=%s", var); + } + + x_check_log(0 == strcmp(var, "got it"), "var=\"%s\"", var); + } else { + x_check(NULL == var); + x_check(NULL == no); + } + + READ_MESSAGE(STDIN_FILENO); +} + +static void +x_spopenve_file(const htable_t *xv) +{ + char buf80; + int r; + + if (x_wants(xv, "x.read") || x_wants(xv, "x.write")) { + r = read(STDIN_FILENO, buf, sizeof buf); + x_check(r != -1); + write_message(STDOUT_FILENO, buf, r); + } +} + +static void +x_spopenve_epipe(const htable_t *xv) +{ + (void) xv; + + /* Do nothing, just return */ +} + +static htable_t *xv, *tv; + +static void +x_record(const char *value) +{ + strtok_t *s; + const char *tok; + + if (NULL == xv) + xv = htable_create(HASH_KEY_STRING, 0); + + s = strtok_make_strip(value); + + while ((tok = strtok_next(s, ","))) { + char *kv = h_strdup(tok); + char *eq = strstr(kv, "="); /* What follows is the value */ + + if (NULL == eq) { + htable_insert(xv, kv, "y"); /* No value, assume "y" (for yes) */ + } else { + *eq++ = '\0'; /* Breaks up key from value */ + htable_insert(xv, kv, eq); + } + } + + strtok_free_null(&s); +} + +typedef void (*spopenve_test_cb_t)(const htable_t *xv); + +static struct { + const char *name; + spopenve_test_cb_t cb; +} spopenve_tests = { + { "plain", x_spopenve_plain }, + { "env", x_spopenve_env }, + { "file", x_spopenve_file }, + { "epipe", x_spopenve_epipe }, +}; + +static void +spopenve_tests_install(void) +{ + size_t i; + + g_assert(NULL == tv); + + tv = htable_create(HASH_KEY_STRING, 0); + + for (i = 0; i < N_ITEMS(spopenve_tests); i++) { + htable_insert(tv, spopenve_testsi.name, spopenve_testsi.cb); + } +} + +static spopenve_test_cb_t +spopenve_tests_lookup(void) +{ + spopenve_test_cb_t cb; + const char *name; + + g_assert(tv != NULL); + g_assert(xv != NULL); + + name = htable_lookup(xv, "t"); + if (NULL == name) + s_fatal_exit(EXIT_FAILURE, "no \"t\" key in -X"); + + cb = htable_lookup(tv, name); + if (NULL == cb) + s_fatal_exit(EXIT_FAILURE, "no test \"%s\" found", name); + + return cb; +} + +static void +log_sigpipe(int signo) +{ + s_fatal_exit(EXIT_FAILURE, "trapped %s", signal_name(signo)); +} + +int +main(int argc, char **argv) +{ + extern int optind; + extern char *optarg; + extern char **environ; + const char options = "hvpr:z:X:"; + int c; + + progstart(argc, argv); + main_argc = progstart_dup(&main_argv, &main_env); + + progpath = argv0; + thread_set_main(TRUE); /* We're the main thread, we can block */ + stacktrace_init(argv0, FALSE); + log_show_pid(TRUE); + + misc_init(); + signal_catch(SIGPIPE, log_sigpipe); + + while ((c = getopt(argc, argv, options)) != EOF) { + switch (c) { + case 'p': /* test SIGPIPE / EPIPE */ + sigpipe++; + break; + case 'r': /* redirect */ + redirect_child = optarg; + break; + case 'v': /* verbose */ + verbose++; + break; + case 'z': /* zap message from routines using emitz() */ + zap_record(optarg); + break; + case 'X': /* parameters for the child process */ + x_record(optarg); + break; + case 'h': /* show help */ + default: + usage(); + break; + } + } + + /* Child can have as many arguments as we want */ + if (NULL == xv && (argc -= optind) != 0) + usage(); + + argv += optind; + + if (NULL == xv) { + /* Parent process, the driver */ + test_spopenve(); + } else { + spopenve_test_cb_t cb; + + if (x_wants(xv, "verb")) + verbose++; + + if (verbose) { + x_dump_strvec("argv", main_argv); + if (x_wants(xv, "envp")) + x_dump_strvec("env", main_env); + } + + spopenve_tests_install(); + cb = spopenve_tests_lookup(); + + (*cb)(xv); + } + + return 0; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/spopen.c
Added
@@ -0,0 +1,660 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Simple popen() using file descriptors and skipping the shell. + * + * This is a compatibility layer: UNIX systems have a full-blown popen() + * which launches "sh -c command" in a child process whilst Windows lacks + * both (the popen() call and the shell). + * + * The spopen() interface gives a common API to the two systems and allows + * simpler management of the link, as if a pipe() had been setup -- unlike + * popen() which uses stdio, spopen() returns a single file descriptor that + * must be closed via spclose(). + * + * Because the shell is bypassed, spopen() includes a mandatory fd argument + * which lets the parent process setup the child stdin/stdout and stderr. + * + * Because the shell is bypassed, spopen() is more secure because the + * command arguments are not interpreted and therefore do not require any + * escaping of possible shell meta-characters. + * + * As is traditional for this family of functions in the litterature, + * the radix "spopen" is supplemented with additional letter which give + * a hint towards the function signature... + * + * The first letter is either 'l' or 'v': + * + * 'l' when command line arguments are passed as arguments to the routine. + * 'v' when command line arguments are passed in a vector given to the routine. + * + * Then, either 'p', 'e', or both can be appended, in that order: + * + * 'p' is appended when the actual command needs to be located using the PATH + * 'e' is appended when the last argument provides an environment vector. + * + * The real core function is usually the 've' one, others being wrappers + * which transform their arguments into the ones expected by the 've' routine. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#include "common.h" + +#include "spopen.h" + +#include "argv.h" +#include "exit2str.h" +#include "fd.h" +#include "file.h" +#include "halloc.h" +#include "hashtable.h" +#include "once.h" + +#include "override.h" /* Must be the last header included */ + +static hash_table_t *spopen_fds; /* Maps an fd to a child PID */ +static once_flag_t spopen_inited; + +/** + * Initialize the spopen layer, once. + */ +static void +spopen_init_once(void) +{ + g_assert(NULL == spopen_fds); + + spopen_fds = hash_table_new_not_leaking(); + hash_table_thread_safe(spopen_fds); +} + +#ifdef MINGW32 +#define STATIC +#else +#define STATIC static +#endif + +/** + * Record the association between the pipe file descriptor and the child PID, + * so that spclose() can determine whom to wait for. + * + * This routine is only visible to the outside world on Windows, because we + * want to let mingw_spopenve() see it. + * + * @param fd the fd that spopen() will return to parent + * @param pid the process ID of the created child process + */ +STATIC void +spopen_fd_map(int fd, pid_t pid) +{ + pid_t cpid; + + g_assert_log(is_valid_fd(fd), "%s(): fd=%d", G_STRFUNC, fd); + g_assert(pid != 0); + + ONCE_FLAG_RUN(spopen_inited, spopen_init_once); + + hash_table_lock(spopen_fds); + + /* + * If we already know about `fd' in our table, it means they forgot to + * spclose() the descriptor but actually issued close() on it. + */ + + cpid = (ulong) hash_table_lookup(spopen_fds, int_to_pointer(fd)); + + if G_UNLIKELY(cpid != 0) { + int status; + + s_carp("%s(): fd #%d was already used by spopen() with child PID %lu", + G_STRFUNC, fd, (ulong) cpid); + + /* + * Wait for this child we have lost, to avoid zombies. + */ + + if (-1 == waitpid(cpid, &status, WNOHANG)) { + s_warning("%s(): cannot wait() for PID %lu: %m", + G_STRFUNC, (ulong) cpid); + } else { + s_info("%s(): PID %lu %s", + G_STRFUNC, (ulong) cpid, exit2str(status)); + } + } + + hash_table_replace(spopen_fds, + int_to_pointer(fd), + ulong_to_pointer((ulong) pid)); + + hash_table_unlock(spopen_fds); +} + +/** + * Caller wants to wait for the child and close fd directly. + * + * If this was called with forget=TRUE, an spclose() is no longer possible, + * and the pipe fd must be manually close()d. + * + * @param fd the pipe fd returned any of the spopen() function family + * @param forget if TRUE, caller will have to close() fd himself + * + * @return the PID of the child process associated with fd, 0 on error. + */ +pid_t +sppid(int fd, bool forget) +{ + pid_t pid; + + if (!is_valid_fd(fd)) { + s_carp("%s(): invalid fd #%d", G_STRFUNC, fd); + errno = EBADF; + return 0; + } + + if G_UNLIKELY(NULL == spopen_fds) + goto not_pipe; + + pid = (ulong) hash_table_lookup(spopen_fds, int_to_pointer(fd)); + + if (0 == pid) { + s_carp("%s(): fd #%d is not known to have been issued by spopen()", + G_STRFUNC, fd); + goto not_pipe; + } + + if (forget) + hash_table_remove(spopen_fds, int_to_pointer(fd)); + + return pid; + +not_pipe: + errno = ECHILD; + return 0; +} + +/** + * Close fd associated with a pipe, wait for child and return its exit status. + * + * @param fd the fd obtained from one of the spopen() function family + * + * @return the child exit status, -1 with errno set otherwise. + */ +int +spclose(int fd) +{ + pid_t pid; + int status; + + pid = sppid(fd, TRUE); + + if (0 == pid) + return -1; + + /* + * We can close the pipe fd now. + */ + + if (-1 == close(fd)) { + s_carp("%s(): unexpected error closing pipe fd #%d to PID %lu: %m", + G_STRFUNC, fd, (ulong) pid); + } + + /* + * And wait for the child... indefinitely. + */ + + if (-1 == waitpid(pid, &status, 0)) + return -1; + + return status; +} + +/* + * On Windows, we use mingw_spopenve() and spopenve() is remapped by cpp + * to point to that routine instead, so the version compiled here is for + * UNIX systems. + */ + +#ifndef MINGW32 + +/** + * Open a pipe with a new process. + * + * The mode string must contain either "r" or "w", depending on whether we + * are opening a pipe to read from the child or to write into it. Optionally, + * the "e" letter requests that the pipe be closed on future exec(). + * + * The fd array allows redirection of the child process stdin (when opening + * a pipe for reading) or stdout (when opening a pipe for writing) via fd0, + * and setting a different stderr via fd1. To avoid redirection, use -1. + * This is needed since we're not using a shell to parse the arguments and we + * need to allow some basic redirections. + * + * When fdi is -1, the child's descriptor simply inherits the corresponding + * parent descriptor (stdin in mode "r" for i=0, stdout in mode "w" for i=0, + * and stderr for i=1). For readability, -1 is actually symbolically defined + * as SPOPEN_ASIS. + * + * When fdi is -2, the parent opens "/dev/null" in the proper mode and gives + * that descriptor. For readability, -2 is actually known as SPOPEN_DEV_NULL. + * + * When fd1 (forbidden for fd0) is -3, stderr is a dup() of the parent's + * stdout, the equivalent of the commonly used shell redirection "2>&1 >other" + * (that is, stdout in the child can be pointing to another file, as defined + * by fd0). The -3 is symbolically known as SPOPEN_PARENT_STDOUT. + * + * When fd1 (forbidden for fd0) is -4, stderr is a dup() of the defined + * stdout, the equivalent of the commonly used shell redirection ">other 2>&1" + * (that is, stdout and stderr in the child point to the same file, as defined + * by fd0). The -4 is symbolically known as SPOPEN_CHILD_STDOUT. + * + * If fdi, for i = {0,1}, contains a valid descriptor, that descriptor is + * given to the child process and is closed in the parent process before + * returning. + * + * As a convenience, since this is the most likely scenario, a NULL fd + * array is understood as meaning fd0 = fd1 = SPOPEN_ASIS. + * + * The argv0 argument is the name the new process will see, but the actual + * process to launch is located in the file `path'. + * + * @param path the process to launch + * @param mode "r" for read, "w" for write, with "e" for close-on-exec + * @param fd fd0 is what stdin/stdout must be, fd1 is for stderr + * @param argv the argument vector for the new process + * @param envp the environment to supply to the new process + * + * @return -1 on failure, the fd to read from / write to the child process + * otherwise. + */ +int +spopenve(const char *path, const char *mode, int fd2, + char *const argv, char *const envp) +{ + bool p_read = FALSE, p_write = FALSE, p_cloexec = FALSE; + int pipefd2; + int pc2; /* pc0 = parent's fd, pc1 = child's fd */ + pid_t child; + const char *p = mode; + int c, r; + int dfd2; + static int has_pipe2; /* 0 = unknown, 1 = yes, -1 = no */ + + g_assert(path != NULL); + g_assert(mode != NULL); + g_assert(argv != NULL); + + if (NULL == fd) { + fd = dfd; + fd0 = fd1 = SPOPEN_ASIS; + } + + while ((c = *p++) != '\0') { + switch (c) { + case 'r': p_read = TRUE; break; + case 'w': p_write = TRUE; break; + case 'e': p_cloexec = TRUE; break; + default: goto bad_arg; + } + } + + if (0 == (p_read ^ p_write)) { + s_carp("%s(): cannot specify both \"r\" and \"w\", mode was \"%s\"", + G_STRFUNC, mode); + goto bad_arg; + } + + if (SPOPEN_PARENT_STDOUT == fd0 || SPOPEN_CHILD_STDOUT == fd0) { + s_carp("%s(): cannot specify %d in fd0, only meaningful for fd1", + G_STRFUNC, fd0); + goto bad_arg; + } + +#ifdef HAS_PIPE2 + if (p_cloexec && has_pipe2 >= 0) { + r = pipe2(pipefd, O_CLOEXEC); + if G_UNLIKELY(0 == has_pipe2) + has_pipe2 = (-1 == r && ENOSYS == errno) ? -1 : 1; + + if (has_pipe2 > 0 && r < 0) + goto pipe_failed; + } +#endif /* HAS_PIPE2 */ + + if (!p_cloexec || has_pipe2 < 0) { + if (-1 == pipe(pipefd)) + goto pipe_failed; + } + + if (p_read) { + pc0 = pipefd0; + pc1 = pipefd1; + } else { + pc0 = pipefd1; + pc1 = pipefd0; + } + + switch ((child = fork())) { + case -1: /* could not fork() */ + s_carp("%s(): cannot fork(): %m", G_STRFUNC); + close(pc0); + close(pc1); + goto fork_failed; + case 0: /* child process */ + break; + default: /* parent process */ + close(pc1); /* That's the child's end of the pipe */ + spopen_fd_map(pc0, child); + goto parent_done; + } + + /* + * We are now in the child process. + */ + + close(pc0); /* That's the parent's end of the pipe */ + + /* Handle stderr = parent's stdout before we change child's stdout */ + + if (SPOPEN_PARENT_STDOUT == fd1) { + if (-1 == dup2(STDOUT_FILENO, STDERR_FILENO)) + goto child_failed; + } + + /* Handle child's standard fd not contected to the pipe */ + + switch (fd0) { + case SPOPEN_ASIS: + r = p_read ? STDIN_FILENO : STDOUT_FILENO; + break; + case SPOPEN_DEV_NULL: + r = open("/dev/null", p_read ? O_RDONLY : O_WRONLY); + if (-1 == r) + goto child_failed; + break; + default: + r = fd0; + break; + } + + /* Redirect stdin / stdout */ + + { + int t = p_read ? STDIN_FILENO : STDOUT_FILENO; /* target */ + + if (t != r) { + if (-1 == dup2(r, t)) + goto child_failed; + close(r); + } + + t = p_read ? STDOUT_FILENO : STDIN_FILENO; + if (-1 == dup2(pc1, t)) + goto child_failed; + close(pc1); /* Child's end now mapped to stdout / stdin */ + } + + /* Handle stderr redirections */ + + switch (fd1) { + case SPOPEN_PARENT_STDOUT: + goto redir_done; /* Already handled above */ + case SPOPEN_ASIS: + goto redir_done; /* Nothing to do */ + case SPOPEN_DEV_NULL: + r = open("/dev/null", O_WRONLY); + if (-1 == r) + goto child_failed; + break; + case SPOPEN_CHILD_STDOUT: + r = STDOUT_FILENO; + break; + default: + r = fd1; + break; + } + + /* Redirect stderr */ + + if (r != STDERR_FILENO) { + if (-1 == dup2(r, STDERR_FILENO)) + goto child_failed; + close(r); + } + + /* FALL THROUGH */ + +redir_done: + + execve(path, argv, envp); + _exit(127); /* 127 is traditional for child exec() failure */ + + /* FALL THROUGH */ + +child_failed: + _exit(126); /* 126 is our indication that I/O setup failed */ + +parent_done: + /* + * Close descriptors given to child for redirection: the parent + * process no longer needs them. + */ + for (c = 0; c < 2; c++) { + if (is_valid_fd(fdc)) + close(fdc); + } + return pc0; + +bad_arg: + errno = EINVAL; + pc0 = -1; + goto parent_done; + +pipe_failed: + s_carp("%s(): pipe%s() failed: %m", G_STRFUNC, has_pipe2 > 0 ? "2" : ""); + + /* FALL THROUGH */ + +fork_failed: + pc0 = -1; + goto parent_done; +} + +#endif /* !MINGW32 */ + +/** + * Same as spopenve() but program is located in the PATH and errno is set + * to ENOENT if we cannot locate the program. + */ +int +spopenvpe(const char *prog, const char *mode, int fd2, + char *const argv, char *const envp) +{ + int pfd; + char *path; + + path = file_locate_from_path(prog); + + if (NULL == path) { + errno = ENOENT; + return -1; + } + + pfd = spopenve(path, mode, fd, argv, envp); + hfree(path); + + return pfd; +} + +/** + * Vectorized version of spopenl() or spopenle(). + * + * It is a wrapper over spopenve() to construct the argv array from + * an argument list. + * + * @return -1 on failure, the fd to read from / write to the child process + * otherwise. + */ +int +spopenle_v(const char *path, const char *mode, int fd2, + const char *arg, va_list ap, char *const envp) +{ + int pfd; + char **argv; + + argv = argv_create(arg, ap); + pfd = spopenve(path, mode, fd, argv, envp); + argv_free_null(&argv); + + return pfd; +} + +/** + * Vectorized version of spopenl(). + * + * It is a wrapper over spopenve() to construct the argv array from + * an argument list. + * + * @return -1 on failure, the fd to read from / write to the child process + * otherwise. + */ +int +spopenl_v(const char *path, const char *mode, int fd2, + const char *arg, va_list ap) +{ + return spopenle_v(path, mode, fd, arg, ap, NULL); +} + +/** + * Launch `path', supplying it with arguments starting with `arg' and + * followed by the listed additional argument strings, up to the trailing + * NULL sentinel, after opening a pipe with the current process. + * + * See spopenve() for the semantics of the fd array and of the mode string. + * + * @param path the executable to launch + * @param mode "r" for read, "w" for write, with "e" for close-on-exec + * @param fd fd0 is what stdin/stdout must be, fd1 is for stderr + * @param arg what will be given as argv0 to the new process + * + * @return -1 on failure, the fd to read from / write to the child process + * otherwise. + */ +int +spopenl(const char *path, const char *mode, int fd2, const char *arg, ...) +{ + int pfd; + va_list ap; + + va_start(ap, arg); + pfd = spopenl_v(path, mode, fd, arg, ap); + va_end(ap); + + return pfd; +} + +/** + * Launch `prog', supplying it with arguments starting with `arg' and + * followed by the listed additional argument strings, up to the trailing + * NULL sentinel, after opening a pipe with the current process. + * + * The actual program is located in the PATH, and errno is set to ENOENT if + * we cannot locate the program. + * + * See spopenve() for the semantics of the fd array and of the mode string. + * + * @param path the executable to launch + * @param mode "r" for read, "w" for write, with "e" for close-on-exec + * @param fd fd0 is what stdin/stdout must be, fd1 is for stderr + * @param arg what will be given as argv0 to the new process + * + * @return -1 on failure, the fd to read from / write to the child process + * otherwise. + */ +int +spopenlp(const char *prog, const char *mode, int fd2, const char *arg, ...) +{ + int pfd; + va_list ap; + char *path; + + path = file_locate_from_path(prog); + + if (NULL == path) { + errno = ENOENT; + return -1; + } + + va_start(ap, arg); + pfd = spopenl_v(path, mode, fd, arg, ap); + va_end(ap); + + hfree(path); + + return pfd; +} + +/** + * Launch `path', supplying it with arguments starting with `arg' and + * followed by the listed additional argument strings, up to the trailing + * NULL sentinel, followed by a last argument being the new environment, + * after opening a pipe with the current process. + * + * See spopenve() for the semantics of the fd array and of the mode string. + * + * @param path the executable to launch + * @param mode "r" for read, "w" for write, with "e" for close-on-exec + * @param fd fd0 is what stdin/stdout must be, fd1 is for stderr + * @param arg what will be given as argv0 to the new process + * @param ... argument list, NULL-terminated + * @param envp the environment strings to setup for the new process + * + * @return -1 on failure, the fd to read from / write to the child process + * otherwise. + */ +int +spopenle(const char *path, const char *mode, int fd2, const char *arg, ...) +{ + int pfd; + va_list ap; + char **envp; + + va_start(ap, arg); + while (NULL != va_arg(ap, char *)) + /* empty */; + envp = va_arg(ap, char **); + va_end(ap); + + va_start(ap, arg); + pfd = spopenle_v(path, mode, fd, arg, ap, envp); + va_end(ap); + + return pfd; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/spopen.h
Added
@@ -0,0 +1,92 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Simple popen() using file descriptors and skipping the shell. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#ifndef _spopen_h_ +#define _spopen_h_ + +/** + * File descriptor special dispositions in the fd array. + */ +#define SPOPEN_ASIS (-1) /**< Keep same fd from parent process */ +#define SPOPEN_DEV_NULL (-2) /**< Open /dev/null */ +#define SPOPEN_PARENT_STDOUT (-3) /**< Stderr mapped to parent's stdout */ +#define SPOPEN_CHILD_STDOUT (-4) /**< Stderr mapped to child's stdout */ + +/* + * Protected interface. + */ + +#ifdef MINGW32 +void spopen_fd_map(int fd, pid_t pid); +#endif + +/* + * Public interface. + */ + +int spopenve(const char *path, const char *mode, int fd2, + char *const argv, char *const envp); + +int spopenvpe(const char *path, const char *mode, int fd2, + char *const argv, char *const envp); + +int spopenl(const char *path, const char *mode, int fd2, + const char *arg, ...) G_NULL_TERMINATED; +int spopenlp(const char *path, const char *mode, int fd2, + const char *arg, ...) G_NULL_TERMINATED; +int spopenle(const char *path, const char *mode, int fd2, + const char *arg, ...); + +int spopenle_v(const char *path, const char *mode, int fd2, + const char *arg, va_list ap, char *const envp); +int spopenl_v(const char *path, const char *mode, int fd2, + const char *arg, va_list ap); + +pid_t sppid(int fd, bool forget); +int spclose(int fd); + +/** + * Convenience routine to get the PID of the child on the other end of the + * pipe without compromising the ability to later issue an spclose(). + * + * @param fd the pipe fd returned by any of the spopen() function family + */ +static inline pid_t +sppidof(int fd) +{ + return sppid(fd, FALSE); +} + +#endif /* _spopen_h_ */ + +/* vi: set ts=4: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/stacktrace.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/stacktrace.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2010, Raphael Manfredi + * Copyright (c) 2004, 2010-2012, 2016 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -25,42 +25,42 @@ * @ingroup lib * @file * - * Stack unwinding support. - * - * This file is using raw malloc(), free(), strdup(), etc... because it can - * be exercised by the debugging malloc layer, at a very low level and we - * must not interfere. Don't even think about using g_malloc() and friends or - * any other glib memory-allocating routine here. - * - * This means this file cannot be the target of leak detection by our - * debugging malloc layer. + * Stack unwinding and printing support. * * @author Raphael Manfredi - * @date 2004, 2010 + * @date 2004, 2010-2012, 2016 */ #include "common.h" /* For RCSID */ #include "stacktrace.h" -#include "atoms.h" /* For binary_hash() */ -#include "ascii.h" -#include "base16.h" + +#include "atio.h" +#include "atomic.h" +#include "bfd_util.h" #include "concat.h" +#include "constants.h" #include "crash.h" /* For print_str() and crash_signame() */ +#include "dl_util.h" +#include "eslist.h" #include "file.h" -#include "glib-missing.h" #include "halloc.h" -#include "misc.h" /* For is_strprefix() and is_strsuffix() */ +#include "hashing.h" /* For binary_hash() */ #include "log.h" -#include "offtime.h" +#include "mem.h" +#include "misc.h" /* For is_strprefix() and is_strsuffix() */ +#include "mutex.h" #include "omalloc.h" -#include "parse.h" +#include "once.h" #include "path.h" #include "signal.h" +#include "spinlock.h" +#include "str.h" #include "stringify.h" +#include "symbols.h" +#include "thread.h" #include "tm.h" #include "unsigned.h" -#include "vmm.h" /* We need hash_table_new_real() to avoid any call to g_malloc() */ #define MALLOC_SOURCE @@ -73,45 +73,50 @@ #include <execinfo.h> /* For backtrace() */ #endif -/** - * A routine entry in the symbol table. - */ -struct trace { - const void *start; /**< Start PC address */ - const char *name; /**< Routine name (omalloc() atom) */ -}; +#define STACKTRACE_DLFT_SYMBOLS 8192 /* Pre-sizing of symbol table */ +#define STACKTRACE_BUFFER_SIZE 8192 /* Amount reserved for stack tracing */ +#define STACKTRACE_BUFFER_COUNT 3 /* Amount of pre-allocated buffers */ /** - * The array of trace entries. + * Default stacktrace decoration flags we're using here. */ -static struct { - struct trace *base; /**< Array base */ - size_t size; /**< Amount of entries allocated */ - size_t count; /**< Amount of entries held */ - size_t offset; /**< Symbol offset to apply */ - unsigned fresh:1; /**< Symbols loaded via nm parsing */ - unsigned indirect:1; /**< Symbols loaded via nm pre-computed file */ - unsigned stale:1; /**< Pre-computed nm file was stale */ - unsigned mismatch:1; /**< Symbol mismatches were identified */ - unsigned garbage:1; /**< Symbols are probably pure garbage */ - unsigned sorted:1; /**< Symbols were sorted */ -} trace_array; +#define STACKTRACE_DECORATION \ + (STACKTRACE_F_ORIGIN | STACKTRACE_F_SOURCE | \ + STACKTRACE_F_MAIN_STOP | STACKTRACE_F_THREAD) /** * Deferred loading support. */ -static char *local_path; /**< Path before a chdir() */ -static char *program_path; /**< Absolute program path */ -static time_t program_mtime; /**< Last modification time of executable */ -static gboolean symbols_loaded; -static gboolean stacktrace_inited; +static const char *local_path; /**< Path before a chdir() (ro string) */ +static const char *program_path; /**< Absolute program path (ro string) */ +static time_t program_mtime; /**< Last modification time of executable */ +static bool stacktrace_crashing; /**< Use simple stack traces if set */ +static bool symbols_loaded; +static symbols_t *symbols; +static bool stacktrace_inited; -/** - * "nm" output parsing context. - */ -struct nm_parser { - hash_table_t *atoms; /**< To create string "atoms" */ -}; +static mutex_t stacktrace_sym_mtx = MUTEX_INIT; +static once_flag_t stacktrace_atom_inited; + +#define STACKTRACE_CIRCULAR_LEN THREAD_MAX + +static struct { + struct stacktrace circularSTACKTRACE_CIRCULAR_LEN; + unsigned idx; + bool dirty; +} stacktrace_atom_buffer; + +static hash_table_t *stack_atoms; + +#define STACKTRACE_ATOM_LOCK hash_table_lock(stack_atoms) +#define STACKTRACE_ATOM_UNLOCK hash_table_unlock(stack_atoms) +#define STACKTRACE_ATOM_IS_LOCKED hash_table_is_locked(stack_atoms) + +#define assert_stacktrace_atom_locked() g_assert(STACKTRACE_ATOM_IS_LOCKED) + +#define STACKTRACE_SYM_LOCK mutex_lock(&stacktrace_sym_mtx) +#define STACKTRACE_SYM_UNLOCK mutex_unlock(&stacktrace_sym_mtx) +#define STACKTRACE_SYM_TRYLOCK mutex_trylock(&stacktrace_sym_mtx) /** * Auto-tuning stack trace offset. @@ -122,25 +127,47 @@ */ static size_t stack_auto_offset; -static hash_table_t *stack_atoms; -static const char NM_FILE = "gtk-gnutella.nm"; - +#ifndef MINGW32 static void *getreturnaddr(size_t level); static void *getframeaddr(size_t level); +#endif + +/** + * Limit stacktraces to simple stacks, avoiding the BFD library or the + * dynamic linker to resolve symbols. + */ +void +stacktrace_crash_mode(void) +{ + stacktrace_crashing = TRUE; +} /** * Is PC a valid routine address? */ -static inline gboolean G_GNUC_CONST -stack_is_text(const void *pc) +static inline bool G_CONST +valid_ptr(const void *pc) +{ + ulong v = pointer_to_ulong(pc); + + return v >= 0x1000 && + v < MAX_INT_VAL(ulong) - 0x1000 && + mem_is_valid_ptr(pc); +} + +/** + * Is SP a valid stack address? + */ +static inline bool G_PURE +valid_stack_ptr(const void *sp) { - return pointer_to_ulong(pc) >= 0x1000; + return vmm_is_stack_pointer(sp, NULL); } /** * Is PC a routine address for something within our code? */ -static inline gboolean G_GNUC_CONST +static inline bool G_CONST stack_is_our_text(const void *pc) { #if defined(HAS_ETEXT_SYMBOL) @@ -161,6 +188,7 @@ #endif } +#ifndef MINGW32 /** * Unwind current stack into supplied stacktrace array. * @@ -180,8 +208,6 @@ { size_t i; void *frame; - size_t d; - gboolean increasing; /* * Adjust the offset according to the auto-tunings. @@ -195,23 +221,14 @@ */ frame = getframeaddr(0); - if (NULL == frame) + if (!valid_stack_ptr(frame)) return 0; - d = ptr_diff(getframeaddr(1), frame); - increasing = size_is_positive(d); - for (i = 0; i < offset; i++) { - void *nframe = getframeaddr(i + 1); + frame = getframeaddr(i + 1); - if (NULL == nframe) + if (!valid_stack_ptr(frame)) return 0; - - d = increasing ? ptr_diff(nframe, frame) : ptr_diff(frame, nframe); - if (d > 0x1000) /* Arbitrary, large enough to be uncommon */ - return 0; - - frame = nframe; } /* @@ -219,28 +236,18 @@ */ for (;; i++) { - void *nframe = getframeaddr(i + 1); - - if (NULL == nframe || i - offset >= count) - break; + frame = getframeaddr(i + 1); - if (!stack_is_text(stacki - offset = getreturnaddr(i))) + if (!valid_stack_ptr(frame) || i - offset >= count) break; - /* - * Safety precaution: if the distance between one frame and the - * next is too large, we're probably facing stack corruption and - * are beginning to hit random places in memory. Break out. - */ - - d = increasing ? ptr_diff(nframe, frame) : ptr_diff(frame, nframe); - if (d > 0x1000) /* Arbitrary, large enough to be uncommon */ + if (!valid_ptr(stacki - offset = getreturnaddr(i))) break; - frame = nframe; } return i - offset; } +#endif /* !MINGW32 */ /** * Unwind current stack into supplied stacktrace array. @@ -260,20 +267,38 @@ stacktrace_unwind(void *stack, size_t count, size_t offset) #ifdef HAS_BACKTRACE { - static gboolean in_unwind; + static uint8 in_unwindTHREAD_MAX; void *traceSTACKTRACE_DEPTH_MAX + 5; /* +5 to leave room for offsets */ int depth; size_t amount; /* Amount of entries we can copy in result */ size_t i, idx; + int id = thread_safe_small_id(); + static bool called; g_assert(size_is_non_negative(offset)); /* * backtrace() can call malloc(), which can cause fatal recursion here when - * compiled with xmalloc() trapping malloc()... + * compiled with xmalloc() trapping malloc()... This usually happens + * on i386 linux when dlopen() is used at init time, the first time the + * routine is called, to fetch symbols from libgcc_s.so.1. + * + * If we are in a signal handler, we cannot invoke backtrace if we are + * holding a lock from xmalloc.c, for fear of deadlocking or starting + * to corrupt data structures. This is not race-safe though as there is + * some time between grabbing a lock and registering it in the thread, + * time during which we can be interrupted by a signal. Fortunately, this + * check is only required when we never called backtrace() before, so the + * failing window is quite narrow. + * --RAM, 2016-01-29 */ - if (in_unwind) { + if ( + (id >= 0 && in_unwindid) || + (!called && + signal_in_unsafe_handler() && + thread_lock_holds_from("lib/xmalloc.c")) + ) { /* * Don't "return" here, to avoid tail recursion since we increase the * stack offsetting. @@ -297,16 +322,27 @@ * will have already filled some items in stack. */ - in_unwind = TRUE; + if (id >= 0) + in_unwindid = TRUE; - if (count >= G_N_ELEMENTS(trace)) { + if (count >= N_ITEMS(trace)) { depth = backtrace(stack, count); memcpy(trace, stack, depth * sizeof trace0); } else { - depth = backtrace(trace, G_N_ELEMENTS(trace)); + depth = backtrace(trace, N_ITEMS(trace)); } - in_unwind = FALSE; + /* + * Flag that backtrace() was called once, meaning it has performed its + * internal one-time initialization. Subsequent calls should not have + * to call malloc(). + */ + + called = TRUE; /* backtrace() should no longer invoke malloc() */ + + if (id >= 0) + in_unwindid = FALSE; + idx = size_saturate_add(offset, stack_auto_offset); g_assert(size_is_non_negative(idx)); @@ -321,13 +357,17 @@ * Only copy entries that are likely to be "text" addresses. */ - for (i = 0; i < amount && stack_is_text(traceidx); i++) { + for (i = 0; i < amount && valid_ptr(traceidx); i++) { stacki = traceidx++; } done: return i; /* Amount of copied entries */ } +#elif defined(MINGW32) +{ + return mingw_backtrace(stack, count, offset + stack_auto_offset); +} #else /* !HAS_BACKTRACE */ { /* @@ -338,15 +378,22 @@ } #endif /* HAS_BACKTRACE */ -static Sigjmp_buf stacktrace_safe_env; +static sigjmp_buf stacktrace_safe_envTHREAD_MAX; /** * Invoked when a fatal signal is received during stack unwinding. */ -static G_GNUC_COLD void +static void G_COLD stacktrace_safe_got_signal(int signo) { - Siglongjmp(stacktrace_safe_env, signo); + int stid = thread_small_id(); + + /* + * Big assumption here is that the harmful signal is delivered to the + * thread that caused it. + */ + + siglongjmp(stacktrace_safe_envstid, signo); } /** @@ -364,6 +411,7 @@ stacktrace_safe_unwind(void *stack, size_t count, size_t offset) { volatile size_t n; + int stid; signal_handler_t old_sigsegv; #ifdef SIGBUS signal_handler_t old_sigbus; @@ -383,9 +431,11 @@ old_sigbus = signal_catch(SIGBUS, stacktrace_safe_got_signal); #endif - if (Sigsetjmp(stacktrace_safe_env, TRUE)) { + stid = thread_small_id(); + + if (Sigsetjmp(stacktrace_safe_envstid, TRUE)) { /* - * Becasue we zeroed the stack array before attempting the + * Because we zeroed the stack array before attempting the * unwinding we can now go back and count the amount of items that * were put there in case we got interrupted by a signal, to be * able to save the part of the stack we were able to unwind @@ -421,14 +471,7 @@ enum stacktrace_sym_quality stacktrace_quality(void) { - if (trace_array.garbage) - return STACKTRACE_SYM_GARBAGE; - else if (trace_array.mismatch) - return STACKTRACE_SYM_MISMATCH; - else if (trace_array.stale) - return STACKTRACE_SYM_STALE; - else - return STACKTRACE_SYM_GOOD; + return NULL == symbols ? STACKTRACE_SYM_GOOD : symbols_quality(symbols); } /** @@ -449,989 +492,997 @@ } /** - * Compare two trace entries -- qsort() callback. - */ -static int -trace_cmp(const void *p, const void *q) -{ - struct trace const *a = p; - struct trace const *b = q; - - return a->start == b->start ? 0 : - pointer_to_ulong(a->start) < pointer_to_ulong(b->start) ? -1 : +1; -} - -/** - * Remove duplicate entry in trace array at the specified index. + * Tune the level of offsetting we have to do to get the current caller. */ -static void -trace_remove(size_t i) +static NO_INLINE void G_COLD +stacktrace_auto_tune(void) { - struct trace *t; - - g_assert(size_is_non_negative(i)); - g_assert(i < trace_array.count); + void *stackSTACKTRACE_DEPTH_MAX; + size_t count; + size_t i; - t = &trace_array.basei; - if (i < trace_array.count - 1) - memmove(t, t + 1, (trace_array.count - i - 1) * sizeof *t); - trace_array.count--; -} + count = stacktrace_safe_unwind(stack, N_ITEMS(stack), 0); -/** - * Sort trace array, remove duplicate entries. - */ -static G_GNUC_COLD void -trace_sort(void) -{ - size_t i = 0; - size_t old_count = trace_array.count; - const void *last = 0; + /* + * Look at the first item in the stack that is after ourselves. + * and within close range (the unwinding is close to the start of + * the routine so the PC of the caller should be close). + */ - qsort(trace_array.base, trace_array.count, - sizeof trace_array.base0, trace_cmp); + for (i = 0; i < count; i++) { + size_t d = ptr_diff(stacki, func_to_pointer(stacktrace_auto_tune)); - while (i < trace_array.count) { - struct trace *t = &trace_array.basei; - if (last && t->start == last) { - trace_remove(i); - } else { - last = t->start; - i++; - } + if (size_is_non_negative(d) && d < 72) /* close enough */ + break; } - if (old_count != trace_array.count) { - size_t delta = old_count - trace_array.count; - g_assert(size_is_non_negative(delta)); - s_warning("stripped %zu duplicate symbol%s", - delta, 1 == delta ? "" : "s"); - } + /* + * If we did not find a suitable candidate, warn but that's OK. + */ - trace_array.sorted = TRUE; + if (count == i) { + s_warning("could not auto-tune stacktrace offsets, using defaults"); + stack_auto_offset = 1; + } else { + stack_auto_offset = i; + } } /** - * Insert new trace symbol. + * Get symbols from the executable. */ -static void -trace_insert(const void *start, const char *name) +static void G_COLD +stacktrace_get_symbols(const char *path, const char *lpath, bool stale) { - struct trace *t; + static int done; - if (trace_array.count >= trace_array.size) { - size_t old_size, new_size; - void *old_base; + /* + * Make sure we're only doing this once. + * + * This cuts down recursion when there are stack traces to emit during + * symbol loading (e.g. an assertion failure, or a critical message + * requiring a trace). + */ - old_base = trace_array.base; - old_size = trace_array.size * sizeof *t; - trace_array.size += 1024; - new_size = trace_array.size * sizeof *t; + if (0 != atomic_int_inc(&done)) + return; - trace_array.base = vmm_alloc_not_leaking(new_size); - if (old_base != NULL) { - memcpy(trace_array.base, old_base, old_size); - vmm_free(old_base, old_size); - } - } + /* + * In case we're crashing so early that stacktrace_init() has not been + * called, initialize properly. + */ - t = &trace_array.basetrace_array.count++; - t->start = start; - t->name = name; -} + STACKTRACE_SYM_LOCK; -/** - * Lookup trace structure encompassing given program counter. - * - * @return trace structure if found, NULL otherwise. - */ -static struct trace * -trace_lookup(const void *pc) -{ - struct trace *low = trace_array.base, - *high = &trace_array.basetrace_array.count -1, - *mid; - const void *lpc; + if (NULL == symbols) + symbols = symbols_make(STACKTRACE_DLFT_SYMBOLS, TRUE); - lpc = const_ptr_add_offset(pc, trace_array.offset); + symbols_load_from(symbols, path, lpath != NULL ? lpath : path); - while (low <= high) { - mid = low + (high - low) / 2; - if (lpc >= mid->start && (mid == high || lpc < (mid+1)->start)) - return mid; /* Found it! */ - else if (lpc < mid->start) - high = mid - 1; - else - low = mid + 1; - } + if (stale) + symbols_mark_stale(symbols); - return NULL; /* Not found */ + STACKTRACE_SYM_UNLOCK; } /** - * Format pointer into specified buffer. - * - * This is equivalent to saying: + * Initialize stack tracing. * - * gm_snprintf(buf, buflen, "0x%lx", pointer_to_ulong(pc)); + * This should be called from the main thread only, before anything interesting + * is done. Hence there is no need to make the initialization thread-safe. * - * but is safe to use in a signal handler. + * @param argv0 the value of argv0, from main(): the program's filename + * @param deferred if TRUE, do not load symbols until it's needed */ -static void -trace_fmt_pointer(char *buf, size_t buflen, const void *p) +void G_COLD +stacktrace_init(const char *argv0, bool deferred) { - if (buflen < 4) { - buf0 = '\0'; - return; - } - - buf0 = '0'; - buf1 = 'x'; - pointer_to_string_buf(p, &buf2, buflen - 2); -} + char *path, *apath; + filestat_t buf; -/** - * Format "name+offset" into specified buffer. - * - * This is equivalent to saying: - * - * gm_snprintf(buf, buflen, "%s+%u", name, offset); - * - * but is safe to use in a signal handler. - */ -static void -trace_fmt_name(char *buf, size_t buflen, const char *name, size_t offset) -{ - size_t namelen; + g_assert(argv0 != NULL); - namelen = g_strlcpy(buf, name, buflen); - if (namelen >= buflen - 2) + if G_UNLIKELY(stacktrace_inited) return; - if (offset != 0) { - bufnamelen = '+'; - size_t_to_string_buf(offset, &bufnamelen+1, buflen - (namelen + 1)); + stacktrace_inited = TRUE; + path = file_program_path(argv0); + if (NULL == symbols) + symbols = symbols_make(STACKTRACE_DLFT_SYMBOLS, TRUE); + + if (NULL == path) { + s_warning("cannot find \"%s\" in PATH, not loading symbols", argv0); + goto done; } -} -/* - * Attempt to transform a PC (Program Counter) address into a symbolic name, - * showing the function name and the offset within that routine. - * - * When the symbols are probable garbage, the name has a leading '?', and - * the hexadecimal address follows the name between parenthesis. - * - * When the symbols may be inaccurate, the name has a leading '!'. - * - * When the symbols were loaded from a stale source, the name has a leading '~'. - * - * The way formatting is done allows this routine to be used from a - * signal handler. - * - * @param pc the PC to translate into symbolic form - * @param offset whether decimal offset should be added, in symbolic form. - * - * @return symbolic name for given pc offset, if found, otherwise - * the hexadecimal value. - */ -static G_GNUC_COLD const char * -trace_name(const void *pc, gboolean offset) -{ - static char buf256; + if (-1 == stat(path, &buf)) { + s_warning("%s(): cannot stat \"%s\": %m", G_STRFUNC, path); + s_warning("will not be loading symbols for %s", argv0); + goto done; + } - if (!trace_array.sorted || 0 == trace_array.count) { - trace_fmt_pointer(buf, sizeof buf, pc); - } else { - struct trace *t; + apath = absolute_pathname(path); + program_path = ostrdup_readonly(apath); + HFREE_NULL(apath); - t = trace_lookup(pc); + if (deferred) { + program_mtime = buf.st_mtime; + local_path = ostrdup_readonly(path); + goto tune; + } - if (NULL == t || &trace_array.basetrace_array.count - 1 == t) { - trace_fmt_pointer(buf, sizeof buf, pc); - } else { - size_t off = 0; - - if (trace_array.garbage) { - buf0 = '?'; - off = 1; - } else if (trace_array.mismatch) { - buf0 = '!'; - off = 1; - } else if (trace_array.stale) { - buf0 = '~'; - off = 1; - } + stacktrace_get_symbols(path, path, FALSE); - trace_fmt_name(&bufoff, sizeof buf - off, t->name, - offset ? ptr_diff(pc, t->start) : 0); + /* + * If running on Windows, call dl_util_get_base() to indirectly call + * dladdr(), which will trigger the mingw_dladdr() code and cause + * initialization of the Windows symbols: when crashing it may be hard + * to have symbols properly loaded. + * --RAM, 2015-11-26 + */ - /* - * If symbols are garbage, add the hexadecimal pointer to the - * name so that we have a little chance of figuring out what - * was the routine. - */ + if (is_running_on_mingw()) + (void) dl_util_get_base(stacktrace_init); - if (trace_array.garbage) { - char ptrPOINTER_BUFLEN + CONST_STRLEN(" (0x)"); + /* FALL THROUGH */ - g_strlcpy(ptr, " (0x", sizeof ptr); - pointer_to_string_buf(pc, &ptr4, sizeof ptr - 4); - clamp_strcat(ptr, sizeof ptr, ")"); - clamp_strcat(buf, sizeof buf, ptr); - } - } - } +done: + symbols_loaded = TRUE; /* Don't attempt again */ + + /* FALL THROUGH */ - return buf; +tune: + HFREE_NULL(path); + stacktrace_auto_tune(); } /** - * Return atom string for the trace name. - * This memory will never be freed. + * @return amount of large VMM memory used. */ -static const char * -trace_atom(struct nm_parser *ctx, const char *name) +size_t +stacktrace_memory_used(void) { - const char *result; - - /* - * On Windows and OS X, there is an obnoxious '_' prepended to all - * routine names. - */ - - if ('_' == name0) - name++; - - result = hash_table_lookup(ctx->atoms, name); + size_t res; - if (NULL == result) { - result = ostrdup(name); /* Never freed */ - hash_table_insert(ctx->atoms, result, result); + res = NULL == symbols ? 0 : symbols_memory_size(symbols); + if (stack_atoms != NULL) { + res += hash_table_arena_memory(stack_atoms); } - return result; + return res; } -#define FN(x) \ - { (func_ptr_t) x, STRINGIFY(x) } - -static void stack_print(FILE *f, void * const *stack, size_t count); -extern int main(int argc, char **argv); - /** - * Known symbols that we want to check. + * Close stack tracing. */ -static struct { - func_ptr_t fn; /**< Function address */ - const char *name; /**< Function name */ -} trace_known_symbols = { - FN(file_locate_from_path), - FN(halloc_init), - FN(hash_table_new_full_real), - FN(is_strprefix), - FN(main), - FN(make_pathname), - FN(omalloc0), - FN(pointer_to_string_buf), - FN(s_warning), - FN(s_info), - FN(signal_set), - FN(stack_print), - FN(trace_atom), - FN(trace_remove), - FN(vmm_init), -}; - -#undef FN +void G_COLD +stacktrace_close(void) +{ + symbols_free_null(&symbols); + if (stack_atoms != NULL) { + hash_table_destroy_real(stack_atoms); /* Does not free keys/values */ + stack_atoms = NULL; + } +} /** - * Check whether symbols that need to be defined in the program (either because - * they are well-known like main() or used within this file) are consistent - * with the symbols we loaded. - * - * Sets trace_array.mismatch if we find at least 1 mismatch. - * Sets trace_array.garbage if we find more than half mismatches. + * Load symbols if not done already. */ -static void -trace_check(void) +void G_COLD +stacktrace_load_symbols(void) { - size_t matching = 0; - size_t mismatches; - size_t i; - size_t offset = 0; - GHashTable *sym_pc; - const void *main_pc; - - if (0 == trace_array.count) - return; + static spinlock_t sym_load_slk = SPINLOCK_INIT; + bool stale = FALSE; /* - * On some systems, symbols are not mapped at absolute addresses but - * are relocated. - * - * To detect this: we locate the address of our probing routines and - * compare them with what we loaded from the symbols. Of course, - * offsetting will only be working when the offset is the same for all - * the symbols. + * Don't use the once_flag_run() mechanism here since this can be used + * on the assertion failure path, and maybe called recursively. */ - sym_pc = g_hash_table_new(g_str_hash, g_str_equal); - - for (i = 0; i < trace_array.count; i++) { - struct trace *t = &trace_array.basei; - - gm_hash_table_insert_const(sym_pc, t->name, t->start); + spinlock_hidden(&sym_load_slk); + if G_LIKELY(symbols_loaded) { + spinunlock_hidden(&sym_load_slk); + return; } + symbols_loaded = TRUE; /* Whatever happens, don't try again */ + spinunlock_hidden(&sym_load_slk); /* - * Compute the initial offset for main(). + * If we are being called before stacktrace_init(), then derive a proper + * path using the dynamic linker. In case we only get a relative path + * that cannot be found from our current location, attempt to locate the + * program in the user's PATH environment variable. */ - main_pc = g_hash_table_lookup(sym_pc, "main"); - - if (NULL == main_pc) { - s_warning("cannot find main() in the loaded symbols"); - trace_array.garbage = TRUE; - goto done; + if G_UNLIKELY(NULL == program_path) { + const char *path = dl_util_get_path(func_to_pointer(stacktrace_init)); + if (!file_exists(path)) { + char *fpath = file_locate_from_path(filepath_basename(path)); + program_path = ostrdup_readonly(fpath != NULL ? fpath : path); + HFREE_NULL(fpath); + } else { + program_path = ostrdup_readonly(path); + } } - offset = ptr_diff(main_pc, func_to_pointer(main)); - /* - * Make sure the offset is constant among all our probed symbols. + * Loading of symbols was deferred: make sure the executable is still + * there and has not been tampered with since we started. */ - for (i = 0; i < G_N_ELEMENTS(trace_known_symbols); i++) { - const char *name = trace_known_symbolsi.name; - const void *pc = cast_func_to_pointer(trace_known_symbolsi.fn); - const void *loaded_pc = g_hash_table_lookup(sym_pc, name); - size_t loaded_offset; - - if (NULL == loaded_pc) { - s_warning("cannot find %s() in the loaded symbols", name); - trace_array.garbage = TRUE; - goto done; - } - - loaded_offset = ptr_diff(loaded_pc, pc); + if (program_path != NULL) { + filestat_t buf; - if (loaded_offset != offset) { - s_warning("will not offset symbol addresses (loaded garbage?)"); - offset = 0; - break; + if (-1 == stat(program_path, &buf)) { + s_warning("%s(): cannot stat \"%s\": %m", G_STRFUNC, program_path); + goto error; } - } - - if (offset != 0) { - s_warning("will be offsetting symbol addresses by 0x%lx (%ld)", - (unsigned long) offset, (unsigned long) offset); - trace_array.offset = offset; - } - /* - * Now verify whether we can match symbols. - */ + /* + * Symbols are loaded if the program has been tampered with, but + * the symbols are marked as stale. + */ - for (i = 0; i < G_N_ELEMENTS(trace_known_symbols); i++) { - struct trace *t; - const void *pc = cast_func_to_pointer(trace_known_symbolsi.fn); + if (program_mtime != 0 && buf.st_mtime != program_mtime) { + s_warning("%s(): executable file \"%s\" has been tampered with", + G_STRFUNC, program_path); - t = trace_lookup(pc); + stale = TRUE; - if (t != NULL) { - const char *name = trace_known_symbolsi.name; - if (0 == strcmp(name, t->name)) - matching++; + /* FALL THROUGH */ } - } - g_assert(size_is_non_negative(matching)); - g_assert(matching <= G_N_ELEMENTS(trace_known_symbols)); + stacktrace_get_symbols(program_path, local_path, stale); + } - mismatches = G_N_ELEMENTS(trace_known_symbols) - matching; + return; - if (mismatches != 0) { - if (mismatches >= G_N_ELEMENTS(trace_known_symbols) / 2) { - trace_array.garbage = TRUE; - s_warning("loaded symbols are %s", - G_N_ELEMENTS(trace_known_symbols) == mismatches ? - "pure garbage" : "highly unreliable"); - } else { - trace_array.mismatch = TRUE; - s_warning("loaded symbols are partially inaccurate"); - } +error: + if (program_path != NULL) { + s_warning("%s(): cannot load symbols for %s", G_STRFUNC, program_path); } +} +/** + * Post-init operations. + */ +void +stacktrace_post_init(void) +{ +#ifdef MALLOC_FRAMES /* - * Note that our algorithm cannot find any mismatch if we successfully - * computed a valid offset above since by construction this means we were - * able to find a common offset between the loaded symbol addresses and - * the actual ones, meaning the lookup algorithm of trace_lookup() will - * find the proper symbols. + * When we keep around allocation frames (to be able to report memory + * leaks later), it is best to load symbols immediately in case the + * program is changed (moved around) during the execution and we find out + * we cannot load the symbols later at exit time, when we have leaks to + * report and cannot map the PC addresses to functions. */ - if (offset != 0 && mismatches != 0) - s_warning("BUG in trace_check()"); - -done: - gm_hash_table_destroy_null(&sym_pc); + stacktrace_load_symbols(); +#endif } /** - * Parse the nm output line, recording symbol mapping for function entries. - * - * We're looking for lines like: - * - * 082bec77 T zget - * 082be9d3 t zn_create + * Fill supplied stacktrace structure with the backtrace. + * Trace will start with our caller. */ -static void -parse_nm(struct nm_parser *ctx, char *line) +void NO_INLINE +stacktrace_get(struct stacktrace *st) { - int error; - const char *ep; - char *p = line; - const void *addr; - - addr = parse_pointer(p, &ep, &error); - if (error || NULL == addr) - return; - - p = skip_ascii_blanks(ep); - - if ('t' == ascii_tolower(*p)) { - p = skip_ascii_blanks(&p1); - strchomp(p, 0); - trace_insert(addr, trace_atom(ctx, p)); - } + st->len = stacktrace_unwind(st->stack, N_ITEMS(st->stack), 1); } -static size_t -str_hash(const void *p) +/** + * Fill supplied stacktrace structure with the backtrace, removing ``offset'' + * amount of immediate callers (0 will make our caller be the first item). + */ +void NO_INLINE +stacktrace_get_offset(struct stacktrace *st, size_t offset) { - return g_str_hash(p); + st->len = stacktrace_unwind(st->stack, N_ITEMS(st->stack), offset + 1); } /** - * Open specified file containing code symbols. + * Stop as soon as we reach main() before backtracing into libc. * - * @param exe the executable path, to assess freshness of nm file - * @param nm the path to the nm file, symbols from the executable + * @param where symbolic name of the current routine * - * @return opened file if successfull, NULL on error with the error already - * logged appropriately. + * @return TRUE if we reached main(). */ -static FILE * -stacktrace_open_symbols(const char *exe, const char *nm) +static bool +stack_reached_main(const char *where) { - filestat_t ebuf, nbuf; - FILE *f; - - trace_array.stale = FALSE; + /* + * Stop as soon as we reach main() before backtracing into libc + */ - if (-1 == stat(nm, &nbuf)) { - s_warning("can't stat \"%s\": %m", nm); - return NULL; - } + return is_strprefix(where, "main+") != NULL; /* HACK ALERT */ +} - if (-1 == stat(exe, &ebuf)) { - s_warning("can't stat \"%s\": %m", exe); - trace_array.stale = TRUE; - goto open_file; - } +/** + * Attempt to grab the symbol lock to dump a stack trace. + * + * If we cannot grab the lock and we are already holding locks, fail as this + * could create deadlocks. + * + * @param caller caller routine, for logging purposes + * + * @return TRUE if we got the lock, FALSE if we could not get it. + */ +static bool +stack_sym_trylock(const char *caller) +{ + if (!STACKTRACE_SYM_TRYLOCK) { + size_t cnt = thread_lock_count(); - if (delta_time(ebuf.st_mtime, nbuf.st_mtime) > 0) { - s_warning("executable \"%s\" more recent than symbol file \"%s\"", - exe, nm); - trace_array.stale = TRUE; - /* FALL THROUGH */ - } + /* + * Do not sleep if we are holding any locks, this could create + * deadlocks. + */ -open_file: - f = fopen(nm, is_running_on_mingw() ? "rb" : "r"); + if (0 != cnt) { + s_rawwarn("%s(): not waiting, %s holds %zu lock%s", + caller, thread_safe_name(), cnt, plural(cnt)); + return FALSE; + } - if (NULL == f) - s_warning("can't open \"%s\": %m", nm); + STACKTRACE_SYM_LOCK; + } - return f; + return TRUE; } /** - * Load symbols from the executable we're running. - * - * Symbols are loaded even if the executable is not "fresh" or if the - * "gtk-gnutella.nm" file is older than the executable. The rationale is - * that it is better to have some symbols than none, in the hope that the - * ones we list will be roughly correct. + * Print array of PCs, using symbolic names if possible. * - * In any case, stale or un-fresh symbols will be clearly marked in the - * stack traces we emit, so that there cannot be any doubt later one when - * we analyze stacks and they seem inconsistent or impossible. The only - * limitation is that we cannot know which symbols are correct, so all symbols - * will be flagged as doubtful when we detect the slightest inconsistency. + * @param f where to print the stack + * @param stack array of Program Counters making up the stack + * @param count number of items in stack to print, at most. */ -static G_GNUC_COLD void -load_symbols(const char *path, const char *lpath) +static void +stack_print(FILE *f, void * const *stack, size_t count) { - char tmpMAX_PATH_LEN + 80; - FILE *f; - struct nm_parser nm_ctx; - gboolean retried = FALSE; + size_t i; + int stid = -1; + bool locked = TRUE; + + stacktrace_load_symbols(); -#ifdef MINGW32 /* - * Open the "gtk-gnutella.nm" file nearby the executable. + * This attempts to avoid concurrent stack traces from being emitted, + * as long as the calling thread holds no lock. Otherwise make sure + * we display the thread STID. */ - { - const char *nm; + if (!stack_sym_trylock(G_STRFUNC)) { + stid = thread_safe_small_id(); + locked = FALSE; + } + + for (i = 0; i < count; i++) { + const char *where = symbols_name(symbols, stacki, TRUE); - nm = mingw_filename_nearby(NM_FILE); - f = stacktrace_open_symbols(path, nm); + if (!valid_ptr(stacki)) + break; - if (NULL == f) - goto done; + if (stid >= 0) + fprintf(f, "\t%d %s\n", stid, where); + else + fprintf(f, "\t%s\n", where); - trace_array.indirect = TRUE; + if (stack_reached_main(where)) + break; } -#else /* !MINGW32 */ - /* - * Launch "nm -p" on our executable to grab the symbols. - */ - { - size_t rw; + if (locked) + STACKTRACE_SYM_UNLOCK; +} - rw = gm_snprintf(tmp, sizeof tmp, "nm -p %s", path); - if (rw != strlen(path) + CONST_STRLEN("nm -p ")) { - s_warning("full path \"%s\" too long, cannot load symbols", path); - goto done; - } +/** + * Log array of PCs to logging agent, using symbolic names if possible. + * + * @param la where to print the stack + * @param stack array of Program Counters making up the stack + * @param count number of items in stack to print, at most. + */ +static void +stack_log(logagent_t *la, void * const *stack, size_t count) +{ + size_t i; + int stid = -1; + bool locked = TRUE; - f = popen(tmp, "r"); + stacktrace_load_symbols(); - if (NULL == f) { - s_warning("can't run \"%s\": %m", tmp); - goto done; - } + /* + * This attempts to avoid concurrent stack traces from being emitted, + * as long as the calling thread holds no lock. Otherwise make sure + * we display the thread STID. + */ - trace_array.fresh = !trace_array.stale; + if (!stack_sym_trylock(G_STRFUNC)) { + stid = thread_safe_small_id(); + locked = FALSE; } -#endif /* MINGW32 */ - nm_ctx.atoms = hash_table_new_full_real(str_hash, g_str_equal); + for (i = 0; i < count; i++) { + const char *where = symbols_name(symbols, stacki, TRUE); + + if (!valid_ptr(stacki)) + break; + + if (stid >= 0) + log_info(la, "\t%d %s", stid, where); + else + log_info(la, "\t%s", where); -retry: - while (fgets(tmp, sizeof tmp, f)) { - parse_nm(&nm_ctx, tmp); + if (stack_reached_main(where)) + break; } - if (retried || is_running_on_mingw()) - fclose(f); - else - pclose(f); + if (locked) + STACKTRACE_SYM_UNLOCK; +} + +/** + * Safely print array of PCs, using symbolic names if possible. + * + * @param fd where to print the stack + * @param stid thread ID to which stack belongs to + * @param stack array of Program Counters making up the stack + * @param count number of items in stack to print, at most. + */ +static void +stack_safe_print(int fd, int stid, void * const *stack, size_t count) +{ + size_t i; + bool locked = TRUE; /* - * If we did not load any symbol, maybe the executable was stripped? - * Try to open the symbols from the installed nm file. + * This attempts to avoid concurrent stack traces from being emitted, + * as long as the calling thread holds no lock. Otherwise make sure + * we display the thread STID. */ - if (!retried && 0 == trace_array.count) { - char *nm = make_pathname(ARCHLIB_EXP, NM_FILE); + if (!stack_sym_trylock(G_STRFUNC)) + locked = FALSE; - s_warning("no symbols loaded, trying with pre-computed \"%s\"", nm); - trace_array.fresh = FALSE; - f = stacktrace_open_symbols(path, nm); - retried = TRUE; - HFREE_NULL(nm); + for (i = 0; i < count; i++) { + const char *where = symbols_name(symbols, stacki, TRUE); + char sbufUINT_DEC_BUFLEN; + const char *snum; + DECLARE_STR(6); - if (f != NULL) { - trace_array.indirect = TRUE; - goto retry; + print_str("\t"); /* 0 */ + if (stid > 0 || !locked) { + snum = PRINT_NUMBER(sbuf, stid); + print_str(""); /* 1 */ + print_str(snum); /* 2 */ + print_str(" "); /* 3 */ } + print_str(where); /* 4 */ + print_str("\n"); /* 5 */ + flush_str(fd); - /* FALL THROUGH */ - } - - hash_table_destroy_real(nm_ctx.atoms); + if (!valid_ptr(stacki)) + break; -done: - s_info("loaded %u symbols for \"%s\"", (unsigned) trace_array.count, lpath); + if (stack_reached_main(where)) + break; + } - trace_sort(); - trace_check(); + if (locked) + STACKTRACE_SYM_UNLOCK; } /** - * Get the full program path. - * - * @return a newly allocated string (through halloc()) that points to the - * path of the program being run, NULL if we can't compute a suitable path. + * @return whether a PC is from our own executable. */ -static G_GNUC_COLD char * -program_path_allocate(const char *argv0) +bool +stacktrace_pc_within_our_text(const void *pc) { - filestat_t buf; - const char *file = argv0; - char filepathMAX_PATH_LEN + 1; + return stack_is_our_text(pc); +} - if (is_running_on_mingw() && !is_strsuffix(argv0, (size_t) -1, ".exe")) { - concat_strings(filepath, sizeof filepath, argv0, ".exe", NULL); - } else { - clamp_strcpy(filepath, sizeof filepath, argv0); - } +/* + * Return pretty path from source path by using the fact that our sources + * lie under the "src/" root. + */ +static const char * +stacktrace_pretty_filepath(const char *filepath) +{ + const char *p; + const char *q; + const char *start; - if (-1 == stat(filepath, &buf)) { - int saved_errno = errno; - file = file_locate_from_path(argv0); - if (NULL == file) { - errno = saved_errno; - s_warning("could not stat() \"%s\": %m", filepath); - s_warning("cannot find \"%s\" in PATH, not loading symbols", argv0); - goto error; - } - } + p = strrchr(filepath, G_DIR_SEPARATOR); + if (p != NULL) + p++; + else + p = filepath; /* - * Make sure there are no problematic shell meta-characters in the path. + * Under operating systems that don't use '/' as path separators, we can + * stop because we know our compilation process uses '/' as separators. + * + * For instance, on Windows, we could have "gtk-gnutella\src\lib/cq.c" + * as the initial filepath and we would return "lib/cq.c" at this point. */ - { - const char meta = "$&`;()<>|"; - const char *p = file; - int c; + if ('/' != G_DIR_SEPARATOR) + return p; - while ((c = *p++)) { - if (strchr(meta, c)) { - s_warning("found shell meta-character '%c' in path \"%s\", " - "not loading symbols", c, file); - goto error; - } + start = filepath; + + if (is_absolute_path(filepath)) { + const char *src = strstr(filepath, "/src/"); + start = (NULL == src) ? p : &srcCONST_STRLEN("/src/"); + } + + /* + * We're on an operating system using '/' in paths. + * + * We basically recognized the basename at this point. Move backwards + * until we find a "src/" component or the head of the string. + */ + + for (q = p - 1; q > start; q--) { + if ('/' == *q) { + if (is_strprefix(q, "/src/")) + return p; + p = q + 1; } } - if (file != NULL && file != argv0) - return deconstify_gpointer(file); + return is_strprefix(start, "src/") ? p : start; +} + +enum sxfiletype { + SXFILE_STDIO, + SXFILE_FD +}; - return h_strdup(filepath); +struct sxfile { + enum sxfiletype type; /* Union discriminant */ + int stid; /* Thread ID for which we're printing */ + union { + FILE *f; + int fd; + } u; +}; -error: - if (file != NULL && file != argv0) - hfree(deconstify_gpointer(file)); +/** + * Print a simple stack trace. + * + * @param xf where to print the stack + * @param stack array of Program Counters making up the stack + * @param count number of items in stack to print, at most. + */ +static void +stack_safe_print_to(struct sxfile *xf, void * const *stack, size_t count) +{ + static int stack_plain; - return NULL; + if (0 == atomic_int_inc(&stack_plain)) + s_rawwarn("disabled fancy symbolic stack traces"); + + switch (xf->type) { + case SXFILE_STDIO: + fflush(xf->u.f); + stack_safe_print(fileno(xf->u.f), xf->stid, stack, count); + return; + case SXFILE_FD: + stack_safe_print(xf->u.fd, xf->stid, stack, count); + return; + } + + g_assert_not_reached(); } /** - * Tune the level of offsetting we have to do to get the current caller. + * Print a decorated stack trace. + * + * @param xf where to print the stack + * @param stack array of Program Counters making up the stack + * @param count number of items in stack to print, at most. + * @param flags decoration flags + * + * The available decoration flags are: + * + * STACKTRACE_F_ORIGIN: + * Displays the shared object file name if known, at the far right. + * + * STACKTRACE_F_PATH: + * In combination with STACKTRACE_F_ORIGIN, display full object paths. + * + * STACKTRACE_F_SOURCE: + * Displays the source code location, if known, after the symbol name. + * + * STACKTRACE_F_ADDRESS: + * Always display the hexadecimal address, even if the symbolic name + * is known. + * + * STACKTRACE_F_NUMBER: + * Number the stack items from 0 (top) and downwards. + * + * STACKTRACE_F_NO_INDENT: + * Do not emit a leading tabulation when formatting. + * + * STACKTRACE_F_GDB: + * Use gdb-like words to link items, such as "from", "at", "in", put + * parenthesis after routine names, don't display offsets. + * + * STACKTRACE_F_MAIN_STOP: + * Stop printing as soon as we reach the main() symbol. + * + * STACKTRACE_F_THREAD: + * Print leading thread ID between brackets if it's not the main thread (#0). + * + * When no flags are specified, this is equivalent to a mere stack_print(). */ -static G_GNUC_COLD NO_INLINE void -stacktrace_auto_tune(void) +static void +stack_print_decorated_to(struct sxfile *xf, + void * const *stack, size_t count, int flags) { - void *stackSTACKTRACE_DEPTH_MAX; - size_t count; + static bfd_env_t *be; size_t i; - - count = stacktrace_unwind(stack, G_N_ELEMENTS(stack), 0); + static char buf512; + static char name256; + static char tid32; + str_t s; + bool gdb_like = booleanize(flags & STACKTRACE_F_GDB); + bool reached_main = FALSE, locked = TRUE; + int saved_errno = errno; /* - * Look at the first item in the stack that is after ourselves. - * and within close range (the unwinding is close to the start of - * the routine so the PC of the caller should be close). + * When crashing severely, either after a recursive crash or because + * we are out of memory, disable fancy symbolic stack traces, use the + * simplest form. + * --RAM, 2015-12-12 */ - for (i = 0; i < count; i++) { - size_t d = ptr_diff(stacki, func_to_pointer(stacktrace_auto_tune)); - - if (size_is_non_negative(d) && d < 72) /* close enough */ - break; + if G_UNLIKELY(stacktrace_crashing) { + stack_safe_print_to(xf, stack, count); + return; } /* - * If we did not find a suitable candidate, warn but that's OK. + * We're using global variables, and we need to avoid concurrent updates + * if we want to have something that makes sense in the output. + * + * If we are not crashing, locks are still enabled so we can create + * a critical section here to avoid garbling output. + * + * If we are crashing, and other threads reach this point, they are + * going to be suspended if not already done when they attempt to grab + * the lock: only the crashing thread will get a lock pass-through. + * + * This critical section alone also ensures that we never mix the outputs + * of two threads attempting to dump a stack at the same time. + * Otherwise, force the thread small ID to be output. */ - if (count == i) { - s_warning("could not auto-tune stacktrace offsets, using defaults"); - stack_auto_offset = 1; - } else { - stack_auto_offset = i; + if (!stack_sym_trylock(G_STRFUNC)) { + flags |= STACKTRACE_F_THREAD; + locked = FALSE; } -} -/** - * Initialize stack tracing. - * - * @param argv0 the value of argv0, from main(): the program's filename - * @param deferred if TRUE, do not load symbols until it's needed - */ -G_GNUC_COLD void -stacktrace_init(const char *argv0, gboolean deferred) -{ - char *path; + /* + * The BFD environment is only opened once. + * See rationale at the end of this routine. + */ - g_assert(argv0 != NULL); + if (NULL == be) + be = bfd_util_init(); - stacktrace_inited = TRUE; - path = program_path_allocate(argv0); + str_new_buffer(&s, buf, 0, sizeof buf); - if (NULL == path) - goto done; + /* + * Compute leading thread ID, shown only when not in the main thread. + */ - if (deferred) { - filestat_t buf; + if (flags & STACKTRACE_F_THREAD) { + unsigned stid = thread_safe_small_id(); + if (stid != 0) + str_bprintf(tid, sizeof tid, "%u ", stid); + else + tid0 = 0; + } else { + tid0 = 0; + } - if (-1 == stat(path, &buf)) { - s_warning("cannot stat \"%s\": %m", path); - s_warning("will not be loading symbols for %s", argv0); - goto done; + /* + * Iterate over the call stack and try to decipher each address: which + * file it comes from (the program itself, or a shared library object + * that has been mapped dynamically), what is the symbol name, and even + * which source file location it maps to if the information is available. + */ + + for (i = 0; i < count && !reached_main; i++) { + const void *pc = stacki; + const char *sopath = "??"; /* Shared object path */ + const void *base; /* Mapping base for the shared object */ + bfd_ctx_t *bc = NULL; + struct symbol_loc loc; + bool located = FALSE; + bool located_via_bfd = FALSE; + bool has_parens = FALSE; + + /* + * If we run out of memory during the stack tracing, switch to a + * lighter version. + */ + + if G_UNLIKELY(stacktrace_crashing) { + if (locked) + STACKTRACE_SYM_UNLOCK; + stack_safe_print_to(xf, &stacki, count - i); + return; } - program_mtime = buf.st_mtime; - local_path = path; - program_path = absolute_pathname(path); - goto tune; - } + /* + * Locate where the PC is located: in our own executable (statically + * linked) or within a dynamically mapped shared library. + */ - load_symbols(path, path); + base = dl_util_get_base(pc); + if (base != NULL) { + const char *pathname; - /* FALL THROUGH */ + pathname = dl_util_get_path(pc); -done: - HFREE_NULL(path); - symbols_loaded = TRUE; /* Don't attempt again */ + /* + * If we have a pathname, try to open the file with the BFD + * library to be able to get at debugging information. + */ - /* FALL THROUGH */ + if (pathname != NULL) { + if (!is_absolute_path(pathname) && stack_is_our_text(pc)) { + if (!file_exists(pathname)) + pathname = program_path; + } + } -tune: - stacktrace_auto_tune(); -} + if (pathname != NULL) { + bc = bfd_util_get_context(be, pathname); + bfd_util_compute_offset(bc, pointer_to_ulong(base)); + sopath = pathname; + } + } -/** - * @return amount of large VMM memory used. - */ -size_t -stacktrace_memory_used(void) -{ - size_t res; + /* + * If we have a BFD context, try to locate the symbol attached + * to the PC, along with its source file location. + */ - res = trace_array.size * sizeof trace_array.base0; - if (stack_atoms != NULL) { - res += hash_table_arena_memory(stack_atoms); - } + ZERO(&loc); - return res; -} + if (bc != NULL && bfd_util_has_symbols(bc)) { + const void *call; -/** - * Close stack tracing. - */ -G_GNUC_COLD void -stacktrace_close(void) -{ - HFREE_NULL(local_path); - HFREE_NULL(program_path); - if (trace_array.base != NULL) { - vmm_free(trace_array.base, - trace_array.size * sizeof trace_array.base0); - trace_array.base = NULL; - } - if (stack_atoms != NULL) { - hash_table_destroy_real(stack_atoms); /* Does not free keys/values */ - stack_atoms = NULL; - } -} + /* + * Always move back two bytes because the return address is + * what we have on the stack, and we want the place where + * the call was made from a source code location perspective. + * + * It is assumed that the instruction to call a routine takes + * at least 2 bytes (opcode + relative offset / register). + * On the x86 for instance, "CALL EAX", which is used for (*f)(), + * takes 2 bytes. + */ -/** - * Load symbols if not done already. - */ -G_GNUC_COLD void -stacktrace_load_symbols(void) -{ - if G_UNLIKELY(symbols_loaded || !stacktrace_inited) - return; + call = const_ptr_add_offset(pc, -2); + located = bfd_util_locate(bc, call, &loc); - symbols_loaded = TRUE; /* Whatever happens, don't try again */ + if (!located) { + /* A "CALL <address>" instruction is PTRSIZE+1 byte long */ + call = const_ptr_add_offset(pc, -(PTRSIZE + 1)); + located = bfd_util_locate(bc, call, &loc); + } - /* - * Loading of symbols was deferred: make sure the executable is still - * there and has not been tampered with since we started. - */ + located_via_bfd = located; + } - if (program_path != NULL) { - filestat_t buf; + /* + * If symbol was not located yet, try from our local symbol table, + * which will work if we are facing a symbol in our text segment + * and there are symbols present in the executable that we could load. + */ - if (-1 == stat(program_path, &buf)) { - s_warning("cannot stat \"%s\": %m", program_path); - goto error; + if (!located && symbols != NULL) { + const char *sym = symbols_name_only(symbols, pc, !gdb_like); + + if (sym != NULL) { + loc.function = sym; + located = TRUE; + } } /* - * Symbols are loaded if the program has been tampered with, but - * the symbols are marked as stale. + * If we were not able to open the shared library, or it had no + * symbol available, we can try with the dynamic loader. However, + * this can only provide us information about publicly available + * symbols, i.e. the symbols the dynamic loader must know about to + * be able to dynamically link the routines. */ - if (buf.st_mtime != program_mtime) { - s_warning("executable file \"%s\" has been tampered with", - program_path); + if (!located) { + const char *sym = dl_util_get_name(pc); + + if (sym != NULL) { + const void *start = dl_util_get_start(pc); + long disp; + + disp = (NULL == start) ? 0 : ptr_diff(pc, start); + + if (flags & STACKTRACE_F_MAIN_STOP) + reached_main = 0 == strcmp(sym, "main"); + + /* + * When not displaying a gdb-like trace, visually distinguish + * the names we resolve through the dynamic loader and the + * ones we resolve through symbols: all names between <> come + * from the dynamic loader's tables. + */ + + if (gdb_like) + str_bprintf(name, sizeof name, "%s", sym); + else if (0 == disp) + str_bprintf(name, sizeof name, "<%s>", sym); + else + str_bprintf(name, sizeof name, "<%s%+ld>", sym, disp); + sym = name; + } else { + if (symbols != NULL) { + sym = symbols_name(symbols, pc, !gdb_like); + if (flags & STACKTRACE_F_MAIN_STOP) { + reached_main = 0 == strcmp(sym, "main") || + (!gdb_like && is_strprefix(sym, "main+")); + } + } + } + loc.function = sym; + } else if (located_via_bfd) { + /* + * Flag the BFD-recognized symbols with trailing parentheses, since + * there will be no trailing offset in that case, ever. + */ - trace_array.stale = TRUE; + if (flags & STACKTRACE_F_MAIN_STOP) + reached_main = 0 == strcmp(loc.function, "main"); - /* FALL THROUGH */ + str_bprintf(name, sizeof name, "%s()", loc.function); + has_parens = TRUE; + loc.function = name; } - load_symbols(program_path, local_path); - } + /* + * Now foramt the information we gathered. + */ - goto done; + str_reset(&s); -error: - if (program_path != NULL) { - s_warning("cannot load symbols for %s", program_path); - } + if (NULL == loc.function) + loc.function = "??"; - /* FALL THROUGH */ + if (NULL == loc.file) + loc.file = "??"; -done: - HFREE_NULL(program_path); - HFREE_NULL(local_path); -} + if (0 == (flags & STACKTRACE_F_NO_INDENT)) + str_putc(&s, '\t'); -/** - * Post-init operations. - */ -void -stacktrace_post_init(void) -{ -#ifdef MALLOC_FRAMES - /* - * When we keep around allocation frames (to be able to report memory - * leaks later), it is best to load symbols immediately in case the - * program is changed (moved around) during the execution and we find out - * we cannot load the symbols later at exit time, when we have leaks to - * report and cannot map the PC addresses to functions. - */ + if (tid0 != '\0') + str_catf(&s, "%s", tid); - stacktrace_load_symbols(); -#endif -} + if (0 != (flags & STACKTRACE_F_NUMBER)) { + if (count < 10) + str_catf(&s, "#%-1zu ", i); + else if (count < 100) + str_catf(&s, "#%-2zu ", i); + else + str_catf(&s, "#%-3zu ", i); + } -/** - * Fill supplied stacktrace structure with the backtrace. - * Trace will start with our caller. - */ -void NO_INLINE -stacktrace_get(struct stacktrace *st) -{ - st->len = stacktrace_unwind(st->stack, G_N_ELEMENTS(st->stack), 1); -} + if (0 != (flags & STACKTRACE_F_ADDRESS)) { + str_catf(&s, "0x%0*lx ", PTRSIZE * 2, pointer_to_ulong(pc)); -/** - * Fill supplied stacktrace structure with the backtrace, removing ``offset'' - * amount of immediate callers (0 will make our caller be the first item). - */ -void NO_INLINE -stacktrace_get_offset(struct stacktrace *st, size_t offset) -{ - st->len = stacktrace_unwind(st->stack, G_N_ELEMENTS(st->stack), offset + 1); -} + if (gdb_like) + STR_CAT(&s, "in "); + } -/** - * Stop as soon as we reach main() before backtracing into libc. - * - * @param where symbolic name of the current routine - * - * @return TRUE if we reached main(). - */ -static gboolean -stack_reached_main(const char *where) -{ - /* - * Stop as soon as we reach main() before backtracing into libc - */ + str_cat(&s, loc.function); + if ('0' == loc.function0) /* No valid name starts with a digit */ + has_parens = TRUE; /* Avoid "()" after 0x.... names */ - return is_strprefix(where, "main+") != NULL; /* HACK ALERT */ -} + if ('?' != loc.function0 && gdb_like && !has_parens) + STR_CAT(&s, "()"); -/** - * Print array of PCs, using symbolic names if possible. - * - * @param f where to print the stack - * @param stack array of Program Counters making up the stack - * @param count number of items in stack to print, at most. - */ -static void -stack_print(FILE *f, void * const *stack, size_t count) -{ - size_t i; + if (0 != (flags & STACKTRACE_F_SOURCE) && '?' != loc.file0) { + str_cat(&s, gdb_like ? " at " : " \""); + str_cat(&s, stacktrace_pretty_filepath(loc.file)); + if (loc.line != 0) + str_catf(&s, ":%u", loc.line); + if (!gdb_like) + str_putc(&s, '"'); + } - stacktrace_load_symbols(); + if (0 != (flags & STACKTRACE_F_ORIGIN) && !stack_is_our_text(pc)) { + const char *filename = (flags & STACKTRACE_F_PATH) ? + sopath : filepath_basename(sopath); + if (gdb_like) + str_catf(&s, " from %s", filename); + else if ('?' != sopath0) { + str_catf(&s, " : %s", filename); + } + } - for (i = 0; i < count; i++) { - const char *where = trace_name(stacki, TRUE); + str_putc(&s, '\n'); - if (!stack_is_text(stacki)) + switch (xf->type) { + case SXFILE_STDIO: + atio_fwrite(str_2c(&s), str_len(&s), 1, xf->u.f); break; - - fprintf(f, "\t%s\n", where); - if (stack_reached_main(where)) + case SXFILE_FD: + atio_write(xf->u.fd, str_2c(&s), str_len(&s)); break; + } } + + /* + * Flush output if we were writing via stdio. + */ + + if (SXFILE_STDIO == xf->type) + fflush(xf->u.f); + + /* + * Don't call + * + * bfd_util_close_null(&be); + * + * because when we are called, we may be crashing and then we won't + * release any memory anyway. But if we start dumping a lot of stacks + * (for instance dumping memory leaks), we'll be using a lot of memory! + * + * Hence the strategy is to keep the BFD environment opened. + */ + + errno = saved_errno; + + if (locked) + STACKTRACE_SYM_UNLOCK; } /** - * Log array of PCs to logging agent, using symbolic names if possible. - * - * @param la where to print the stack - * @param stack array of Program Counters making up the stack - * @param count number of items in stack to print, at most. + * Convenience wrapper to print a decorated stack to a file descriptor. */ static void -stack_log(logagent_t *la, void * const *stack, size_t count) +stack_safe_print_decorated(int fd, int stid, + void * const *stack, size_t count, int flags) { - size_t i; + struct sxfile xf; - stacktrace_load_symbols(); + xf.type = SXFILE_FD; + xf.stid = stid; + xf.u.fd = fd; - for (i = 0; i < count; i++) { - const char *where = trace_name(stacki, TRUE); - - if (!stack_is_text(stacki)) - break; - - log_info(la, "\t%s", where); - if (stack_reached_main(where)) - break; - } + stack_print_decorated_to(&xf, stack, count, flags); } /** - * Safely print array of PCs, using symbolic names if possible. - * - * @param fd where to print the stack - * @param stack array of Program Counters making up the stack - * @param count number of items in stack to print, at most. + * Convenience wrapper to print a decorated stack to a FILE. */ static void -stack_safe_print(int fd, void * const *stack, size_t count) +stack_print_decorated(FILE *f, int stid, + void * const *stack, size_t count, int flags) { - size_t i; + struct sxfile xf; - for (i = 0; i < count; i++) { - const char *where = trace_name(stacki, TRUE); - DECLARE_STR(3); + xf.type = SXFILE_STDIO; + xf.stid = stid; + xf.u.f = f; - print_str("\t"); /* 0 */ - print_str(where); /* 1 */ - print_str("\n"); /* 2 */ - flush_str(fd); - - if (!stack_is_text(stacki)) - break; - - if (stack_reached_main(where)) - break; - } + stack_print_decorated_to(&xf, stack, count, flags); } /** @@ -1449,11 +1500,23 @@ * Print stack trace atom to specified file, using symbolic names if possible. */ void -stacktrace_atom_print(FILE *f, const struct stackatom *st) +stacktrace_atom_print(FILE *f, const struct stackatom *st) +{ + g_assert(st != NULL); + + stack_print(f, st->stack, st->len); +} + +/** + * Print decorated stack trace atom to specified file, using symbolic names + * if possible. + */ +void +stacktrace_atom_decorate(FILE *f, const struct stackatom *st, uint flags) { g_assert(st != NULL); - stack_print(f, st->stack, st->len); + stack_print_decorated(f, thread_small_id(), st->stack, st->len, flags); } /** @@ -1468,30 +1531,67 @@ } /** + * Get address of the n-th caller in the stack. + * + * With n = 0, this should be the address of the current routine. + * + * @return program counter of the n-th caller, NULL if it cannot be determined. + */ +const void * +stacktrace_caller(size_t n) +{ + void *stackSTACKTRACE_DEPTH_MAX; + size_t count; + + g_assert(size_is_non_negative(n)); + g_assert(n <= STACKTRACE_DEPTH_MAX); + + count = stacktrace_unwind(stack, N_ITEMS(stack), 1); + + return n < count ? stackn : NULL; +} + +/** * Return symbolic name of the n-th caller in the stack, if possible. * * With n = 0, this should be the current routine name. * * @return pointer to static data. An empty name means there are not enough - * items in the stack. + * items in the stack, "??" means that no symbols could be loaded so the + * symbolic name is not available. */ const char * stacktrace_caller_name(size_t n) { void *stackSTACKTRACE_DEPTH_MAX; size_t count; + bool in_sigh = signal_in_unsafe_handler(); + const char *name; g_assert(size_is_non_negative(n)); g_assert(n <= STACKTRACE_DEPTH_MAX); - count = stacktrace_unwind(stack, G_N_ELEMENTS(stack), 1); + count = stacktrace_unwind(stack, N_ITEMS(stack), 1); if (n >= count) return ""; - if (!signal_in_handler()) + if (!in_sigh) stacktrace_load_symbols(); - return trace_name(stackn, FALSE); + if (NULL == symbols) + return "??"; + + name = symbols_name(symbols, stackn, FALSE); + + /* + * Avoid all memory allocation if we are in a signal handler or + * crashing (where normally we are supposed to be running mono-threaded). + */ + + if (!in_sigh && !thread_in_crash_mode()) + name = constant_str(name); + + return name; } /** @@ -1505,9 +1605,67 @@ * a formatted hexadecimal value is returned. */ const char * -stacktrace_routine_name(const void *pc, gboolean offset) +stacktrace_routine_name(const void *pc, bool offset) +{ + const char *name; + bool in_sigh = signal_in_unsafe_handler(); + + if (!in_sigh) + stacktrace_load_symbols(); + + name = NULL == symbols ? NULL : symbols_name_only(symbols, pc, offset); + + /* + * This routine can be called from a signal handler. We assume it will + * be safe to call dladdr() because that routine should not allocate + * memory but rather inspect the dynamic loader's tables. + * + * However we forbid ourselves to call the BFD library to resolve the + * name because that would force us to request to enter "crash mode" and + * memory allocation may not be safe anyway. + */ + + if (NULL == name) { + static bool computingTHREAD_MAX; + int id = thread_safe_small_id(); + + /* + * Prevent recursion through dl_util_get_name() in case we're very + * early in the process and not all the routines that need to be + * initialized have been properly setup. + * --RAM, 2016-02-09 + */ + + if (id >= 0 && !computingid) { + computingid = TRUE; + name = dl_util_get_name(pc); + computingid = FALSE; + } + } + + if (NULL == name) { + static char bufPOINTER_BUFLEN; + str_bprintf(buf, sizeof buf, "%p", pc); + name = (in_sigh || thread_in_crash_mode()) ? buf : constant_str(buf); + } + + return name; +} + +/** + * Return start of routine. + * + * @param pc the PC within the routine + * + * @return start of the routine, NULL if we cannot find it. + */ +const void * +stacktrace_routine_start(const void *pc) { - return trace_name(pc, offset); + if (!signal_in_unsafe_handler()) + stacktrace_load_symbols(); + + return symbols_addr(symbols, pc); } /** @@ -1519,18 +1677,18 @@ void *stackSTACKTRACE_DEPTH_MAX; size_t count; - count = stacktrace_safe_unwind(stack, G_N_ELEMENTS(stack), 1); + count = stacktrace_safe_unwind(stack, N_ITEMS(stack), 1); stack_print(f, stack, count); } /** * @return whether we got any symbols. */ -static gboolean +static bool stacktrace_got_symbols(void) { stacktrace_load_symbols(); - return trace_array.sorted; + return symbols != NULL && 0 != symbols_count(symbols); } /** @@ -1541,48 +1699,123 @@ { void *stackSTACKTRACE_DEPTH_MAX; size_t count; + int stid; if (!stacktrace_got_symbols()) return; /* No symbols loaded */ - count = stacktrace_safe_unwind(stack, G_N_ELEMENTS(stack), 1); - stack_print(f, stack, count); + count = stacktrace_safe_unwind(stack, N_ITEMS(stack), 1); + stid = thread_small_id(); + stack_print_decorated(f, stid, stack, count, STACKTRACE_DECORATION); } /** - * Print current stack trace to specified file, with specified offset. + * Print current stack trace to specified file, with specified offset, + * provided symbols were loaded. * * @param f file where stack should be printed * @param offset amount of immediate callers to remove (ourselves excluded) */ void -stacktrace_where_print_offset(FILE *f, size_t offset) +stacktrace_where_sym_print_offset(FILE *f, size_t offset) { void *stackSTACKTRACE_DEPTH_MAX; size_t count; + int stid; - count = stacktrace_safe_unwind(stack, G_N_ELEMENTS(stack), offset + 1); - stack_print(f, stack, count); + if (!stacktrace_got_symbols()) + return; /* No symbols loaded */ + + count = stacktrace_safe_unwind(stack, N_ITEMS(stack), offset + 1); + stid = thread_small_id(); + stack_print_decorated(f, stid, stack, count, STACKTRACE_DECORATION); } /** * Print current stack trace to specified file, with specified offset, - * provided symbols were loaded. + * regardless of whether symbols were loaded. * - * @param f file where stack should be printed + * The stack trace is NOT decorated with line numbers. + * + * @param fd file descriptor where stack should be printed * @param offset amount of immediate callers to remove (ourselves excluded) */ void -stacktrace_where_sym_print_offset(FILE *f, size_t offset) +stacktrace_where_plain_print_offset(int fd, size_t offset) { void *stackSTACKTRACE_DEPTH_MAX; size_t count; - if (!stacktrace_got_symbols()) - return; /* No symbols loaded */ + count = stacktrace_safe_unwind(stack, N_ITEMS(stack), offset + 1); + stack_safe_print(fd, thread_small_id(), stack, count); +} - count = stacktrace_safe_unwind(stack, G_N_ELEMENTS(stack), offset + 1); - stack_print(f, stack, count); +/** + * Print supplied trace to specified file as a plain symbolic stack, + * if possible. + * + * @param fd file descriptor where stack should be printed + * @param stack the stack trace + * @param count amount of items in stack + */ +void +stacktrace_stack_plain_print(int fd, void * const *stack, size_t count) +{ + stack_safe_print(fd, thread_small_id(), stack, count); +} + +/** + * Print supplied trace to specified file in fully decorated mode + * if possible. + * + * @param fd file descriptor where stack should be printed + * @param stack the stack trace + * @param count amount of items in stack + */ +void +stacktrace_stack_fancy_print(int fd, void * const *stack, size_t count) +{ + int stid = thread_small_id(); + stack_safe_print_decorated(fd, stid, stack, count, STACKTRACE_DECORATION); +} + +/** + * Safely print supplied trace to specified file as a symbolic stack, + * if possible. + * + * Safety comes from the fact that this routine may be safely called from + * a signal handler. However, symbolic names will not be loaded from the + * executable if they haven't already and we're in a signal handler. + * + * @param fd file descriptor where stack should be printed + * @param stid the thread ID to which the thread stack belongs + * @param stack the stack trace + * @param count amount of items in stack + */ +void +stacktrace_stack_safe_print(int fd, int stid, void * const *stack, size_t count) +{ + if (!signal_in_unsafe_handler()) { + stacktrace_load_symbols(); + stack_safe_print_decorated(fd, stid, + stack, count, STACKTRACE_DECORATION); + } else if (signal_in_exception() && crash_is_supervised()) { + /* + * We're crashing in supervised mode, so even if we get a fatal error + * our parent will be able to relaunch us. We may not be able to + * get a core dumped correctly, so gather as much information as + * possible. + * + * There's no need to load the symbols because, since we're marked as + * supervised, it means we went through crash_init() and therefore + * the symbols were already loaded. + */ + + stack_safe_print_decorated(fd, stid, + stack, count, STACKTRACE_DECORATION); + } else { + stack_safe_print(fd, stid, stack, count); + } } /** @@ -1601,30 +1834,42 @@ void *stackSTACKTRACE_DEPTH_MAX; size_t count; - count = stacktrace_safe_unwind(stack, G_N_ELEMENTS(stack), offset + 1); - if (!signal_in_handler()) - stacktrace_load_symbols(); - stack_safe_print(fd, stack, count); + count = stacktrace_safe_unwind(stack, N_ITEMS(stack), offset + 1); + stacktrace_stack_safe_print(fd, thread_safe_small_id(), stack, count); } /** - * Safely print supplied trace to specified file as a symbolic stack, + * Print supplied trace to specified file as a symbolic decorated stack, * if possible. * - * Safety comes from the fact that this routine may be safely called from - * a signal handler. However, symbolic names will not be loaded from the - * executable if they haven't already and we're in a signal handler. + * This routine is NOT safe and could crash if called from a signal handler. * * @param fd file descriptor where stack should be printed - * @param offset amount of immediate callers to remove (ourselves excluded) + * @param stid the thread ID to which the stack belongs + * @param stack the stack trace + * @param count amount of items in stack + * @param flags decoration flags (STACKTRACE_F_* values) */ void -stacktrace_stack_safe_print(int fd, void * const *stack, size_t count) +stacktrace_stack_print_decorated(int fd, int stid, + void * const *stack, size_t count, uint flags) { - if (!signal_in_handler()) - stacktrace_load_symbols(); + stacktrace_load_symbols(); + stack_safe_print_decorated(fd, stid, stack, count, flags); +} + +/** + * Print decorated current stack trace to specified file. + */ +void +stacktrace_where_print_decorated(FILE *f, uint flags) +{ + void *stackSTACKTRACE_DEPTH_MAX; + size_t count; - stack_safe_print(fd, stack, count); + count = stacktrace_safe_unwind(stack, N_ITEMS(stack), 1); + stacktrace_load_symbols(); + stack_print_decorated(f, thread_small_id(), stack, count, flags); } /** @@ -1633,40 +1878,45 @@ */ static struct { int fd; - Sigjmp_buf env; + sigjmp_buf env; unsigned done:1; -} print_context; +} print_contextTHREAD_MAX; /* * Was a cautious stacktrace already logged? */ -gboolean +bool stacktrace_cautious_was_logged(void) { - return print_context.done; + int stid = thread_small_id(); + + return print_contextstid.done; } /** * Invoked when a fatal signal is received during stack unwinding. */ -static G_GNUC_COLD void +static void G_COLD stacktrace_got_signal(int signo) { - char time_buf18; + char time_bufCRASH_TIME_BUFLEN; + int stid; DECLARE_STR(4); + stid = thread_small_id(); + crash_time(time_buf, sizeof time_buf); print_str(time_buf); print_str(" WARNING: got "); print_str(signal_name(signo)); print_str(" during stack printing\n"); - flush_str(print_context.fd); + flush_str(print_contextstid.fd); - Siglongjmp(print_context.env, signo); + Siglongjmp(print_contextstid.env, signo); } /** - * Like stacktrace_where_safe_print_offset() but with extra caution. + * Print given stacktrace. * * Caution comes from the fact that we trap all SIGSEGV and other harmful * signals that could result from improper memory access during stack @@ -1674,37 +1924,40 @@ * in our symbol mapping logic). * * @param fd file descriptor where stack should be printed - * @param offset amount of immediate callers to remove (ourselves excluded) + * @param stid the thread ID to which stack belongs + * @param stack the stack to print + * @param count amount of valid stack entries in stack */ -G_GNUC_COLD void -stacktrace_where_cautious_print_offset(int fd, size_t offset) +void G_COLD +stacktrace_cautious_print(int fd, int stid, void *stack, size_t count) { - void *stackSTACKTRACE_DEPTH_MAX + 5; /* See stacktrace_unwind() */ - size_t count; - static volatile sig_atomic_t printing; + static volatile sig_atomic_t printingTHREAD_MAX; signal_handler_t old_sigsegv; #ifdef SIGBUS signal_handler_t old_sigbus; #endif - if (printing) { - char time_buf18; - DECLARE_STR(5); + if (printingstid) { + char time_bufCRASH_TIME_BUFLEN; + char sbufUINT_DEC_BUFLEN; + DECLARE_STR(7); crash_time(time_buf, sizeof time_buf); - print_str(time_buf); - print_str(" WARNING: ignoring "); - print_str("recursive "); - print_str(G_STRFUNC); - print_str("() call\n"); + print_str(time_buf); /* 0 */ + print_str(" (WARNING"); /* 1 */ + if (stid != 0) { + print_str("-"); /* 2 */ + print_str(PRINT_NUMBER(sbuf, stid)); /* 3 */ + } + print_str("): ignoring recursive"); /* 4 */ + print_str(G_STRFUNC); /* 5 */ + print_str("() call\n"); /* 6 */ flush_str(fd); return; } - printing = TRUE; - print_context.fd = fd; - - count = stacktrace_safe_unwind(stack, G_N_ELEMENTS(stack), offset + 1); + printingstid = TRUE; + print_contextstid.fd = fd; /* * Protect stack printing. @@ -1718,8 +1971,8 @@ old_sigbus = signal_catch(SIGBUS, stacktrace_got_signal); #endif - if (Sigsetjmp(print_context.env, TRUE)) { - char time_buf18; + if (Sigsetjmp(print_contextstid.env, TRUE)) { + char time_bufCRASH_TIME_BUFLEN; DECLARE_STR(2); crash_time(time_buf, sizeof time_buf); @@ -1730,7 +1983,7 @@ } if (0 == count) { - char time_buf18; + char time_bufCRASH_TIME_BUFLEN; DECLARE_STR(2); crash_time(time_buf, sizeof time_buf); @@ -1738,15 +1991,13 @@ print_str(" WARNING: corrupted stack\n"); flush_str(fd); } else { - if (!signal_in_handler()) - stacktrace_load_symbols(); - stack_safe_print(fd, stack, count); + stacktrace_stack_safe_print(fd, stid, stack, count); } - print_context.done = TRUE; + print_contextstid.done = TRUE; restore: - printing = FALSE; + printingstid = FALSE; signal_set(SIGSEGV, old_sigsegv); #ifdef SIGBUS @@ -1755,9 +2006,32 @@ } /** + * Like stacktrace_where_safe_print_offset() but with extra caution. + * + * Caution comes from the fact that we trap all SIGSEGV and other harmful + * signals that could result from improper memory access during stack + * unwinding (due to a corrupted stack) and printing (due to possible bugs + * in our symbol mapping logic). + * + * @param fd file descriptor where stack should be printed + * @param offset amount of immediate callers to remove (ourselves excluded) + */ +void G_COLD +stacktrace_where_cautious_print_offset(int fd, size_t offset) +{ + void *stackSTACKTRACE_DEPTH_MAX + 5; /* See stacktrace_unwind() */ + size_t count; + int stid = thread_small_id(); + + count = stacktrace_safe_unwind(stack, N_ITEMS(stack), offset + 1); + + stacktrace_cautious_print(fd, stid, stack, count); +} + +/** * Hashing routine for a "struct stacktrace". */ -size_t +unsigned stack_hash(const void *key) { const struct stackatom *sa = key; @@ -1796,23 +2070,110 @@ static size_t stacktrace_chop_length(const struct stacktrace *st) { - size_t len; + size_t i; - len = st->len; - while (len > 0) { - if (stack_is_our_text(st->stacklen - 1)) - break; - len--; + /* + * Until they called stacktrace_init(), we don't know whether we're + * running as part of a statically linked program or whether the whole + * program is held in shared libraries, the main() entry point being + * just there to load the initial shared libraray. + * + * This means stack_is_our_text() is unsafe. + * + * NB: This is only really needed when this library is used outside + * of gtk-gnutella. The whole gtk-gnutella code is statically linked, + * and we know it calls stacktrace_init(). + * --RAM, 2012-05-11 + */ + + if (!stacktrace_inited) + return st->len; + + for (i = st->len; i != 0; i--) { + if (stack_is_our_text(st->stacki - 1)) { + break; /* Last addres is our text, keep it */ + } + } + + return i; +} + +/** + * Initialize the stack atom table. + */ +static void +stacktrace_atom_init(void) +{ + g_assert(NULL == stack_atoms); + + stack_atoms = hash_table_new_full_real(stack_hash, stack_eq); + hash_table_thread_safe(stack_atoms); +} + +/** + * Lookup stacktrace in our circular buffer to see whether we already + * have it, and possibly store it there. + * + * @param st full stacktrace + * @param len amount of topmost items to consider from stack + * + * @return TRUE if we had a match. + */ +static bool +stacktrace_atom_lookup_and_store(const struct stacktrace *st, size_t len) +{ + uint i; + const struct stacktrace *ct = &stacktrace_atom_buffer.circular0; + + /* + * If the buffer is not marked dirty, then there is nothing to look for. + */ + + if (!stacktrace_atom_buffer.dirty) + goto insert; + + for (i = 0; i < N_ITEMS(stacktrace_atom_buffer.circular); i++, ct++) { + size_t n = MIN(ct->len, len); + + if (0 == n) + continue; + + if (0 == memcmp(&ct->stack0, &st->stack0, n * sizeof st->stack0)) + return TRUE; } - return len; +insert: + + /* + * No match found, need to record new entry, possibly superseding an + * older one (we do not maintain the buffer in an LRU way) for simplicity. + * + * Indeed, we're managing the circular buffer without locking, counting + * on the atomicity of the index increment and the size of the buffer + * to avoid two threads filling up the same entry. + */ + + i = atomic_uint_inc(&stacktrace_atom_buffer.idx); + i %= STACKTRACE_CIRCULAR_LEN; + + stacktrace_atom_buffer.dirty = TRUE; + stacktrace_atom_buffer.circulari.len = 0; /* Invalid */ + atomic_mb(); + + memcpy(&stacktrace_atom_buffer.circulari.stack, + &st->stack, len * sizeof st->stack0); + + stacktrace_atom_buffer.circulari.len = len; /* Now valid */ + atomic_mb(); + + return FALSE; } /** * Lookup stacktrace to see whether we already have an atom for it. * * @param st full stacktrace - * @param len amount of topmoar items to consider from stack + * @param len amount of topmost items to consider from stack * * @return stack atom if we have one, NULL if it is unknown. */ @@ -1824,11 +2185,9 @@ STATIC_ASSERT(sizeof st->stack0 == sizeof result->stack0); - if G_UNLIKELY(NULL == stack_atoms) { - stack_atoms = hash_table_new_full_real(stack_hash, stack_eq); - } + ONCE_FLAG_RUN(stacktrace_atom_inited, stacktrace_atom_init); - key.stack = deconstify_gpointer(st->stack); + key.stack = deconstify_pointer(st->stack); key.len = len; return hash_table_lookup(stack_atoms, &key); @@ -1836,20 +2195,27 @@ /** * Allocate and record a new stack trace atom from given stacktrace. + * + * @return read-only atom object. */ -static struct stackatom * +static const struct stackatom * stacktrace_atom_record(const struct stacktrace *st, size_t len) { - struct stackatom *result; + const struct stackatom *result; + struct stackatom local; + + assert_stacktrace_atom_locked(); /* These objects will be never freed */ - result = omalloc0(sizeof *result); if (len != 0) { - result->stack = ocopy(st->stack, len * sizeof st->stack0); + const void *p = ocopy_readonly(st->stack, len * sizeof st->stack0); + local.stack = deconstify_pointer(p); } else { - result->stack = NULL; + local.stack = NULL; } - result->len = len; + local.len = len; + + result = ocopy_readonly(&local, sizeof local); if (!hash_table_insert(stack_atoms, result, result)) g_error("cannot record stack trace atom"); @@ -1858,25 +2224,124 @@ } /** - * Get a stack trace atom (never freed). + * Insert given stack trace as an atom into the stack_atoms table if it does + * not already exist there. + * + * @return the stack atom. + */ +static const struct stackatom * +stacktrace_atom_insert(const struct stacktrace *t, size_t len) +{ + const struct stackatom *item; + + STACKTRACE_ATOM_LOCK; + item = stacktrace_atom_lookup(t, len); + if (NULL == item) + item = stacktrace_atom_record(t, len); + STACKTRACE_ATOM_UNLOCK; + + return item; +} + +/** + * Get a stack trace atom (read-only, never freed). */ -struct stackatom * +const struct stackatom * stacktrace_get_atom(const struct stacktrace *st) { - struct stackatom *result; + const struct stackatom *result; size_t len; len = stacktrace_chop_length(st); result = stacktrace_atom_lookup(st, len); - if G_UNLIKELY(NULL == result) { - result = stacktrace_atom_record(st, len); - } + if G_UNLIKELY(NULL == result) + result = stacktrace_atom_insert(st, len); return result; } /** + * Move stacktrace entries in the circular buffer back to the atom table. + * + * The circular buffer is filled when stacktrace atom lookups are performed + * whilst running in a signal handler (for asynchronous signals received). + * + * Once the signal handler processing is completed, this routine can be + * called to possibly record the items stored in the table, if any, since + * memory allocation is mostly forbidden during signal processing. + */ +void +stacktrace_atom_circular_flush(void) +{ + uint original_idx, i, j; + + if (signal_in_unsafe_handler()) + return; + + if (!stacktrace_atom_buffer.dirty) + return; + + ONCE_FLAG_RUN(stacktrace_atom_inited, stacktrace_atom_init); + + i = original_idx = atomic_uint_get(&stacktrace_atom_buffer.idx); + + for (j = 0; j < N_ITEMS(stacktrace_atom_buffer.circular); j++, i++) { + uint old_idx, new_idx; + struct stacktrace *st, cst; + + i %= STACKTRACE_CIRCULAR_LEN; + st = &stacktrace_atom_buffer.circulari; + if (0 == st->len) + continue; + + old_idx = atomic_uint_get(&stacktrace_atom_buffer.idx); + cst = *st; /* Struct copy */ + st->len = 0; /* Invalidate entry */ + new_idx = atomic_uint_get(&stacktrace_atom_buffer.idx); + + if (0 == cst.len) + continue; + + /* + * If the index changed, it means someone entered a new entry in + * the circular buffer. Hence we need to check whether the copy + * we made is valid. + */ + + if G_UNLIKELY(old_idx != new_idx) { + uint d = new_idx - old_idx; + uint oi, ni; + + if G_UNLIKELY(d >= N_ITEMS(stacktrace_atom_buffer.circular)) + continue; /* We wrapped around, copy is probably bad */ + + /* + * Does the change of index encompass the slot we copied above? + */ + + oi = old_idx % STACKTRACE_CIRCULAR_LEN; + ni = new_idx % STACKTRACE_CIRCULAR_LEN; + + if (ni < oi) + ni += STACKTRACE_CIRCULAR_LEN; + + if (oi <= i && i <= ni) + continue; /* Unfortunately, it does, so skip slot */ + } + + /* + * Good, we have a new entry. + */ + + stacktrace_atom_insert(&cst, cst.len); + } + + if (atomic_uint_get(&stacktrace_atom_buffer.idx) == original_idx) + stacktrace_atom_buffer.dirty = FALSE; /* Flushed everything */ +} + +/** * Check whether current stack is known, recording it as a side effect. * * This can be used to emit warnings once for a given calling stack. @@ -1887,7 +2352,7 @@ * * @return whether calling stack was known */ -gboolean +bool stacktrace_caller_known(size_t offset) { struct stacktrace t; @@ -1900,10 +2365,25 @@ if G_UNLIKELY(0 == len) return FALSE; - result = stacktrace_atom_lookup(&t, len); + if G_LIKELY(ONCE_DONE(stacktrace_atom_inited)) + result = stacktrace_atom_lookup(&t, len); + else + result = NULL; if G_UNLIKELY(NULL == result) { - (void) stacktrace_atom_record(&t, len); + + /* + * If we are running in a signal handler, we cannot allocate + * memory hence use a circular buffer to store the stacks until + * it is safe to re-insert them into the table. + */ + + if (signal_in_unsafe_handler()) + return stacktrace_atom_lookup_and_store(&t, len); + + ONCE_FLAG_RUN(stacktrace_atom_inited, stacktrace_atom_init); + + stacktrace_atom_insert(&t, len); return FALSE; } else { return TRUE; @@ -1973,6 +2453,8 @@ * at run-time. See stacktrace_auto_tune(). */ +#ifndef MINGW32 + #if HAS_GCC(3, 0) static void * getreturnaddr(size_t level) @@ -2271,4 +2753,6 @@ } #endif /* GCC >= 3.0 */ +#endif /* !MINGW32 */ + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/stacktrace.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/stacktrace.h
Changed
@@ -68,11 +68,24 @@ STACKTRACE_SYM_MAX }; +/* + * Decoration flags for stack traces. + */ +#define STACKTRACE_F_ORIGIN (1U << 0) /**< Show shared object names */ +#define STACKTRACE_F_SOURCE (1U << 1) /**< Display source location */ +#define STACKTRACE_F_NUMBER (1U << 2) /**< Number items */ +#define STACKTRACE_F_NO_INDENT (1U << 3) /**< Turn off indentation */ +#define STACKTRACE_F_GDB (1U << 4) /**< Show a gdb-like trace */ +#define STACKTRACE_F_ADDRESS (1U << 5) /**< Display addresses */ +#define STACKTRACE_F_MAIN_STOP (1U << 6) /**< Stop printing at main() */ +#define STACKTRACE_F_THREAD (1U << 7) /**< Print thread small ID */ +#define STACKTRACE_F_PATH (1U << 8) /**< Prints full path of objects */ + /** - * Hashing /equality functions for "struct stacktracea" atomic traces. + * Hashing /equality functions for "struct stacktrace" atomic traces. */ -size_t stack_hash(const void *key) G_GNUC_PURE; -int stack_eq(const void *a, const void *b) G_GNUC_PURE; +unsigned stack_hash(const void *key) G_PURE; +int stack_eq(const void *a, const void *b) G_PURE; struct logagent; @@ -80,33 +93,52 @@ void stacktrace_get_offset(struct stacktrace *st, size_t offset); void stacktrace_print(FILE *f, const struct stacktrace *st); void stacktrace_atom_print(FILE *f, const struct stackatom *st); +void stacktrace_atom_decorate(FILE *f, const struct stackatom *st, uint flags); void stacktrace_atom_log(struct logagent *la, const struct stackatom *st); const char *stacktrace_caller_name(size_t n); -const char *stacktrace_routine_name(const void *pc, gboolean offset); +const char *stacktrace_routine_name(const void *pc, bool offset); size_t stacktrace_unwind(void *stack, size_t count, size_t offset); size_t stacktrace_safe_unwind(void *stack, size_t count, size_t offset); void stacktrace_where_print(FILE *f); void stacktrace_where_sym_print(FILE *f); void stacktrace_where_sym_print_offset(FILE *f, size_t offset); -void stacktrace_where_print_offset(FILE *f, size_t offset); +void stacktrace_where_plain_print_offset(int fd, size_t offset); void stacktrace_where_safe_print_offset(int fd, size_t offset); void stacktrace_where_cautious_print_offset(int fd, size_t offset); -void stacktrace_stack_safe_print(int fd, void * const *stack, size_t count); -gboolean stacktrace_cautious_was_logged(void); - -struct stackatom *stacktrace_get_atom(const struct stacktrace *st); -gboolean stacktrace_caller_known(size_t offset); - -void stacktrace_init(const char *argv0, gboolean deferred); +void stacktrace_stack_safe_print(int fd, int stid, void * const *, size_t); +void stacktrace_stack_plain_print(int fd, void * const *stack, size_t count); +void stacktrace_stack_fancy_print(int fd, void * const *stack, size_t count); +void stacktrace_stack_print_decorated(int fd, int stid, + void * const *stack, size_t count, uint flags); +void stacktrace_where_print_decorated(FILE *f, uint flags); +bool stacktrace_cautious_was_logged(void); +void stacktrace_cautious_print(int fd, int stid, void *stack, size_t offset); + +const struct stackatom *stacktrace_get_atom(const struct stacktrace *st); +const void *stacktrace_caller(size_t n); +bool stacktrace_caller_known(size_t offset); +const void *stacktrace_routine_start(const void *pc); +bool stacktrace_pc_within_our_text(const void *pc); + +void stacktrace_atom_circular_flush(void); + +void stacktrace_init(const char *argv0, bool deferred); void stacktrace_load_symbols(void); void stacktrace_post_init(void); void stacktrace_close(void); size_t stacktrace_memory_used(void); +void stacktrace_crash_mode(void); enum stacktrace_sym_quality stacktrace_quality(void); const char *stacktrace_quality_string(const enum stacktrace_sym_quality sq); +/** + * @return function's name given a function pointer. + */ +#define stacktrace_function_name(fp) \ + stacktrace_routine_name(func_to_pointer(fp), FALSE) + #endif /* _stacktrace_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/stats.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/stats.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Raphael Manfredi + * Copyright (c) 2004, 2013 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,7 +28,7 @@ * Statistics routines. * * @author Raphael Manfredi - * @date 2004 + * @date 2004, 2013 */ #include "common.h" @@ -38,20 +38,40 @@ #endif /* I_MATH */ #include "stats.h" -#include "glib-missing.h" /* For g_slist_delete_link() */ + +#include "elist.h" #include "halloc.h" #include "walloc.h" + #include "override.h" /* Must be the last header included */ +enum statx_magic { STATX_MAGIC = 0x560044e5 }; + /** * A one-dimension container (x). */ struct statx { - GSList *data; /**< Data points (value = double *) */ - int n; /**< Amount of points */ + enum statx_magic magic; /**< Magic number */ + elist_t data; /**< Data points */ + long n; /**< Amount of data points */ double sx; /**< Sx: sum of all points */ double sx2; /**< Sx2: sum of the square of all points */ - gboolean no_data; /**< Do not keep data, it is managed externally */ + bool no_data; /**< Do not keep data, it is managed externally */ +}; + +static inline void +statx_check(const struct statx * const sx) +{ + g_assert(sx != NULL); + g_assert(STATX_MAGIC == sx->magic); +} + +/** + * Items stored in the data list. + */ +struct stat_datapoint { + link_t data_link; /**< Embedded link */ + double value; }; typedef enum op { @@ -68,6 +88,8 @@ statx_t *sx; WALLOC0(sx); + sx->magic = STATX_MAGIC; + elist_init(&sx->data, offsetof(struct stat_datapoint, data_link)); return sx; } @@ -79,7 +101,7 @@ { statx_t *sx; - WALLOC0(sx); + sx = statx_make(); sx->no_data = TRUE; return sx; } @@ -90,7 +112,10 @@ void statx_free(statx_t *sx) { + statx_check(sx); + statx_clear(sx); + sx->magic = 0; WFREE(sx); } @@ -100,13 +125,9 @@ void statx_clear(statx_t *sx) { - GSList *l; + statx_check(sx); - for (l = sx->data; l; l = g_slist_next(l)) { - double *vp = (double *) l->data; - WFREE(vp); - } - gm_slist_free_null(&sx->data); + elist_wfree(&sx->data, sizeof(struct stat_datapoint)); sx->n = 0; sx->sx = 0.0; @@ -124,34 +145,31 @@ statx_opx(statx_t *sx, double val, stats_op_t op) { g_assert(op == STATS_OP_ADD || sx->n > 0); - g_assert(op == STATS_OP_ADD || sx->data != NULL || sx->no_data); + g_assert(op == STATS_OP_ADD || 0 != elist_count(&sx->data) || sx->no_data); if (!sx->no_data) { - if (op == STATS_OP_REMOVE) { - GSList *l; + struct stat_datapoint *dp; + if (op == STATS_OP_REMOVE) { /* * If value is removed, it must belong to the data set. */ - for (l = sx->data; l; l = g_slist_next(l)) { - double *vp = (double *) l->data; - double delta = *vp - val; + ELIST_FOREACH_DATA(&sx->data, dp) { + double delta = dp->value - val; if (ABS(delta) < 1e-56) { - sx->data = g_slist_remove(sx->data, vp); - WFREE(vp); + elist_remove(&sx->data, dp); + WFREE(dp); break; } } - g_assert(l != NULL); /* Found it */ + g_assert(dp != NULL); /* Found it */ } else { - double *vp; - - WALLOC(vp); - *vp = val; - sx->data = g_slist_prepend(sx->data, vp); + WALLOC(dp); + dp->value = val; + elist_prepend(&sx->data, dp); } } @@ -166,6 +184,8 @@ void statx_add(statx_t *sx, double val) { + statx_check(sx); + statx_opx(sx, val, STATS_OP_ADD); } @@ -175,6 +195,8 @@ void statx_remove(statx_t *sx, double val) { + statx_check(sx); + statx_opx(sx, val, STATS_OP_REMOVE); } @@ -184,45 +206,32 @@ void statx_remove_oldest(statx_t *sx) { - GSList *l; + struct stat_datapoint *dp; double val = 0; + statx_check(sx); g_assert(!sx->no_data); g_assert(sx->n >= 0); - g_assert((sx->n > 0) ^ (NULL == sx->data)); + g_assert((sx->n > 0) ^ (0 == elist_count(&sx->data))); if (sx->n < 1) return; /* - * Since we prepend new items to the list (for speed), we need to find - * the next to last item to delete the final item. + * Since we prepend new items to the list, the oldest item is the last. */ - for (l = sx->data; l; l = g_slist_next(l)) { - GSList *next = g_slist_next(l); - if (next == NULL) { - /* Only one item in list, `l' points to it */ - double *vp = (double *) l->data; - val = *vp; - WFREE(vp); - gm_slist_free_null(&sx->data); - break; - } else if (NULL == g_slist_next(next)) { - /* The item after `l' is the last item of the list */ - double *vp = (double *) next->data; - val = *vp; - WFREE(vp); - next = g_slist_delete_link(l, next); - break; - } - } + dp = elist_tail(&sx->data); + g_assert(dp != NULL); /* We have at least one item */ + val = dp->value; + elist_remove(&sx->data, dp); + WFREE(dp); sx->n--; sx->sx -= val; sx->sx2 -= val * val; - g_assert((sx->n > 0) ^ (NULL == sx->data)); + g_assert((sx->n > 0) ^ (0 == elist_count(&sx->data))); } /** @@ -231,6 +240,8 @@ int statx_n(const statx_t *sx) { + statx_check(sx); + return sx->n; } @@ -240,6 +251,7 @@ double statx_avg(const statx_t *sx) { + statx_check(sx); g_assert(sx->n > 0); return sx->sx / sx->n; @@ -260,6 +272,7 @@ double statx_var(const statx_t *sx) { + statx_check(sx); g_assert(sx->n > 1); return (sx->sx2 - (sx->sx * sx->sx) / sx->n) / (sx->n - 1); @@ -282,16 +295,17 @@ { double *array; int i; - GSList *l; + struct stat_datapoint *dp; + statx_check(sx); g_assert(!sx->no_data); g_assert(sx->n > 0); - array = halloc(sizeof(double) * sx->n); + HALLOC_ARRAY(array, sx->n); - for (i = 0, l = sx->data; i < sx->n && l; l = g_slist_next(l), i++) { - double *vp = (double *) l->data; - arrayi = *vp; + i = 0; + ELIST_FOREACH_DATA(&sx->data, dp) { + arrayi++ = dp->value; } return array;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/stats.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/stats.h
Changed
@@ -45,7 +45,7 @@ typedef struct statx statx_t; statx_t *statx_make(void); -statx_t * statx_make_nodata(void); +statx_t *statx_make_nodata(void); void statx_free(statx_t *); void statx_clear(statx_t *); void statx_add(statx_t *, double);
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/str.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/str.c
Changed
@@ -1,11 +1,14 @@ /* - * Copyright (c) 1996-2000, 2007, 2010, 2011 Raphael Manfredi + * Copyright (c) 1996-2000, 2007, 2010-2015 Raphael Manfredi * * This code given by Raphael Manfredi, extracted from his fm2html package. * Also contains some code borrowed from Perl: routine str_vncatf(). * Code was slightly adapted to use standard features available in the * gtk-gnutella library. * + * After 2007, the original code was enriched with new features such as + * native floating point formatting or other string copyout operations. + * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. * @@ -36,23 +39,25 @@ * Memory must be released with hfree(). * * @author Raphael Manfredi - * @date 1996-2000, 2007, 2010, 2011 + * @date 1996-2000, 2007, 2010-2015 */ #include "common.h" #include <math.h> /* For frexp() and isfinite() */ -#include "str.h" #include "ascii.h" #include "ckalloc.h" #include "float.h" #include "glib-missing.h" #include "halloc.h" #include "log.h" +#include "mempcpy.h" #include "misc.h" /* For clamp_strcpy() and symbolic_errno() */ #include "omalloc.h" +#include "str.h" #include "stringify.h" /* For logging */ +#include "thread.h" #include "unsigned.h" #include "walloc.h" @@ -64,10 +69,9 @@ #define STR_CHUNK 4096 /* Size increase if above STR_MAXGROW */ #define FPREC 17 /* IEEE 64-bit double maximum digit precision */ -#define FPDIG 10 /* For free format, max # of digits before %e */ -static gboolean tests_completed; /* Controls truncation warnings */ -static gboolean format_verbose; /* Controls debugging of formatting */ +static bool tests_completed; /* Controls truncation warnings */ +static bool format_verbose; /* Controls debugging of formatting */ static unsigned format_recursion; /* Prevents recursive verbose debugging */ /** @@ -75,6 +79,7 @@ */ #define STR_FOREIGN_PTR (1 << 0) /**< We don't own the pointer */ #define STR_OBJECT (1 << 1) /**< Object created, not a structure */ +#define STR_THREAD (1 << 2) /**< String is thread-private */ /** * @return length of string. @@ -117,11 +122,11 @@ * Because the memory will never be freed, it's best to use omalloc(). */ - str = omalloc(sizeof *str); + OMALLOC(str); str_create(str, szhint); (void) NOT_LEAKING(str->s_data); - /* Note: STR_OBJECT not set because structure allocated via xpmalloc() */ + /* Note: STR_OBJECT not set because structure cannot be freed. */ return str; } @@ -189,6 +194,41 @@ } /** + * Cram a string at the start of the buffer, the remaining space being + * used to hold the string arena. + * + * @param buf buffer where we can allocate the string + * @param len length of buffer + * + * @return newly create string, NULL if buffer is too small + */ +str_t * +str_new_in_buffer(void *buf, size_t len) +{ + str_t *str; + + g_assert(buf != NULL); + g_assert(size_is_positive(len)); + + if (len <= sizeof *str) + return NULL; + + /* + * Don't set the STR_OBJECT because the object is non-freeable. + * Force STR_FOREIGN_PTR because the arena is non-freeable. + */ + + str = buf; + str->s_magic = STR_MAGIC; + str->s_flags = STR_FOREIGN_PTR; + str->s_data = ptr_add_offset(buf, sizeof *str); + str->s_len = 0; + str->s_size = len - sizeof *str; + + return str; +} + +/** * Allocate a new string structure, of the specified hint size. * * @param szhint initial length of the data buffer (0 for default) @@ -210,6 +250,9 @@ /** * Fill in an existing string structure, of the specified hint size. * + * @param str the string structure to fill with new data buffer + * @param szhint buffer hint size + * * @return its "str" argument. */ str_t * @@ -257,6 +300,11 @@ * * If `len' is (size_t) -1, an strlen() is ran on `ptr' to compute the length. * If `size' is 0, it is set to `len + 1' (after length computation, if any). + * + * @param str pointer to existing (and initialized) string object + * @param ptr start of fix-sized buffer where string data will be held + * @param len length of existing string, computed if (size_t) -1 + * @param size size of buffer starting at ptr (0 sets it to `len + 1') */ void str_foreign(str_t *str, char *ptr, size_t len, size_t size) @@ -294,7 +342,7 @@ * str_new_buffer(&str, data, 0, sizeof data); * * @param str pointer to uninitialized existing string object - * @param ptr start of fix sized buffer where string data will be held + * @param ptr start of fix-sized buffer where string data will be held * @param len length of existing string, computed if (size_t) -1 * @param size size (positive) of buffer starting at ptr */ @@ -316,6 +364,80 @@ } /** + * Reclaim a thread-private string when the thread is exiting. + */ +static void +str_private_reclaim(void *data, void *unused) +{ + str_t *s = data; + + (void) unused; + + str_check(s); + g_assert_log(s->s_flags & STR_THREAD, + "%s(): called on a regular string object", G_STRFUNC); + + s->s_flags &= ~STR_THREAD; + str_destroy(s); +} + +/** + * Get a thread-private string attached to the specified key. + * + * If the string already existed in the thread for this key, it is returned, + * and the szhint parameter is ignored. + * + * Otherwise, a new string is created and attached to the key. + * + * A typical usage of this routine is to make a routine returning static + * data thread-safe: + * + * const char * + * routine(int i) + * { + * str_t *s = str_private(G_STRFUNC, 10); + * + * str_printf(s, "%dB", i); + * return str_2c(s); // the private copy for this thread + * } + * + * @param key the key to use to identify this string + * @param szhint initial length of the data buffer (0 for default) + * + * @note + * The string will be reclaimed automatically when the thread exits and its + * pointer should not be given to foreign threads but used solely in the + * context of the thread. This applies to the string object and its buffer. + * + * @return a string object dedicated to the calling thread. + */ +str_t * +str_private(const void *key, size_t szhint) +{ + str_t *s; + + s = thread_private_get(key); + + if G_LIKELY(s != NULL) { + str_check(s); + return s; + } + + /* + * Allocate a new string and declare it as a thread-private variable + * with an associated free routine. The string cannot be destroyed but + * through that specialized free routine. + */ + + s = str_new(szhint); + s->s_flags |= STR_THREAD; /* Prevents plain str_free() on that string */ + + thread_private_add_extended(key, s, str_private_reclaim, NULL); + + return s; +} + +/** * Make an str_t object out of a specified C string, which is duplicated. * If specified length is (size_t) -1, it is computed using strlen(). */ @@ -365,6 +487,9 @@ { str_check(str); + g_assert_log(!(str->s_flags & STR_THREAD), + "%s(): called on thread-private string object", G_STRFUNC); + /* * If data arena is a foreign structure, don't free it: we are not the * owner of the pointer to it. @@ -381,6 +506,19 @@ } /** + * Discard the str_t structure, freeing string data and making object invalid. + * + * This is to be used on static str_t structures, when we want to free the + * allocated memory and prevent any further usage of the structure. + */ +void +str_discard(str_t *str) +{ + str_free(str); + str->s_magic = 0; +} + +/** * Destroy string held within the str_t structure, then the structure. */ void @@ -388,11 +526,10 @@ { str_check(str); - if G_UNLIKELY(!(str->s_flags & STR_OBJECT)) - s_error("str_destroy() called on \"static\" string object"); + g_assert_log(str->s_flags & STR_OBJECT, + "%s(): called on \"static\" string object", G_STRFUNC); - str_free(str); - str->s_magic = 0; + str_discard(str); WFREE(str); } @@ -428,7 +565,7 @@ if G_UNLIKELY(str->s_flags & STR_FOREIGN_PTR) { if (str->s_size >= newsize) return; - s_error("str_resize() would expand \"foreign\" string"); + s_error("%s() would expand \"foreign\" string", G_STRFUNC); } /* @@ -474,7 +611,25 @@ } /** - * Expand data space if necessary, returning the (new) data location. + * Pre-expand string data space to be able to hold at least `len' more bytes. + * + * @param str the string object + * @param len the extra room we want to have in the buffer + */ +void +str_reserve(str_t *str, size_t len) +{ + str_check(str); + g_assert(size_is_non_negative(len)); + + str_makeroom(str, size_saturate_add(len, 1)); +} + +/** + * Expand data space, if necessary. + * + * @param str the string object + * @param size the new buffer data size we want */ void str_grow(str_t *str, size_t size) @@ -486,7 +641,7 @@ return; /* Nothing to do */ if G_UNLIKELY(str->s_flags & STR_FOREIGN_PTR) - s_error("str_grow() called on \"foreign\" string"); + s_error("%s() would expand \"foreign\" string", G_STRFUNC); str->s_data = hrealloc(str->s_data, size); str->s_size = size; @@ -582,7 +737,7 @@ str_check(str); if G_UNLIKELY(!(str->s_flags & STR_OBJECT)) - s_error("str_s2c() called on \"static\" string object"); + s_error("%s() called on \"static\" string object", G_STRFUNC); len = str->s_len; @@ -632,14 +787,14 @@ str_dup(str_t *str) { size_t len; - char *sdup; + char *sdup, *p; str_check(str); len = str->s_len; sdup = halloc(len + 1); - memcpy(sdup, str->s_data, len); - sduplen = '\0'; + p = mempcpy(sdup, str->s_data, len); + *p = '\0'; return sdup; } @@ -681,6 +836,23 @@ } /** + * Copy string argument into the string structure, keeping trailing NUL as + * a hidden char (thereby making the arena a C string). + * + * Since the len is provided, the data need not have a trailing NUL. + * Although it may contain embedded NUL, it should not however because this + * will disrupt the perception of the resulting string as C string. + */ +void +str_cpy_len(str_t *str, const char *string, size_t len) +{ + str_check(str); + + str->s_len = 0; + str_cat_len(str, string, len); +} + +/** * Append C string argument (i.e. has a trailing NUL) into the string structure, * keeping this trailing NUL as a hidden char (not accounted for in s_len). */ @@ -734,7 +906,7 @@ return; str_makeroom(str, len + 1); /* Allow for trailing NUL */ - p = str->s_data + str->s_len; + p = str->s_data + str->s_len; q = string; while (len > 0 && '\0' != (c = *q++)) { @@ -757,13 +929,13 @@ * * @return TRUE if written normally, FALSE when clamping was done. */ -gboolean +bool str_ncat_safe(str_t *str, const char *string, size_t len) { char *p; const char *q; char c; - gboolean fits = TRUE; + bool fits = TRUE; str_check(str); g_assert(string != NULL); @@ -791,7 +963,7 @@ str_makeroom(str, len + 1); /* Allow for trailing NUL */ } - p = str->s_data + str->s_len; + p = str->s_data + str->s_len; q = string; while (len > 0 && '\0' != (c = *q++)) { @@ -835,7 +1007,7 @@ * * @return TRUE if insertion took place, FALSE if it was ignored. */ -gboolean +bool str_ichar(str_t *str, ssize_t idx, char c) { size_t len; @@ -865,7 +1037,7 @@ * * @return TRUE if insertion took place, FALSE if it was ignored. */ -gboolean +bool str_istr(str_t *str, ssize_t idx, const char *string) { str_check(str); @@ -879,7 +1051,7 @@ * * @return TRUE if insertion took place, FALSE if it was ignored. */ -gboolean +bool str_instr(str_t *str, ssize_t idx, const char *string, size_t n) { size_t len; @@ -952,7 +1124,7 @@ * * @return TRUE if we replaced, FALSE if we ignored due to out-of-bound index. */ -gboolean +bool str_replace(str_t *str, ssize_t idx, size_t amount, const char *string) { size_t length; @@ -1041,6 +1213,197 @@ } /** + * Remove penultimate character of string and return it. + */ +char +str_chop(str_t *s) +{ + size_t len; + char c; + + str_check(s); + + len = s->s_len; + + if G_UNLIKELY(0 == len) + return '\0'; + + c = s->s_datalen - 1; + s->s_len--; + + return c; +} + +/** + * Reverse string in-place: "noel" becomes "leon". + */ +void +str_reverse(str_t *s) +{ + char *p, *q; + size_t len; + + str_check(s); + + len = s->s_len; + + if G_UNLIKELY(0 == len) + return; + + p = &s->s_data0; + q = &s->s_datalen - 1; + + while (ptr_cmp(p, q) < 0) { + char t = *q; + *q-- = *p; + *p++ = t; + } +} + +/** + * Move string content starting at some offset to specified buffer, clamping + * copy at the last character of the buffer and finishing with a NUL. + * + * @return amount of copied bytes (trailing NUL does not count). + */ +size_t +str_copyout_offset(str_t *s, size_t offset, char *dest, size_t dest_size) +{ + size_t n; + size_t ds; + size_t len; + + str_check(s); + g_assert(size_is_positive(dest_size)); + + ds = dest_size - 1; + len = s->s_len; + + if (offset >= len) + return 0; + + len -= offset; + + n = MIN(ds, len); + memcpy(dest, &s->s_dataoffset, n); + destn = '\0'; + + return n; +} + +/** + * Move string content to specified buffer, clamping copy at the last character + * of the buffer and finishing with a NUL. + * + * @return amount of copied bytes (trailing NUL does not count). + */ +size_t +str_copyout(str_t *s, char *dest, size_t dest_size) +{ + return str_copyout_offset(s, 0, dest, dest_size); +} + +/** + * Move string content starting at some offset to specified buffer, clamping + * copy at the last character of the buffer, but without NUL-terminating the + * copied data. + * + * To copy a "string" (NUL-terminated), use str_copyout_offset(). + * + * @return amount of copied bytes. + */ +size_t +str_memout_offset(str_t *s, size_t offset, char *dest, size_t dest_size) +{ + size_t n; + size_t len; + + str_check(s); + g_assert(size_is_non_negative(dest_size)); + + len = s->s_len; + + if (offset >= len) + return 0; + + len -= offset; + + n = MIN(dest_size, len); + memcpy(dest, &s->s_dataoffset, n); + + return n; +} + +/** + * Move string content to specified buffer, clamping copy at the last + * character of the buffer, but without NUL-terminating the copied data. + * + * To copy a "string" (NUL-terminated), use str_copyout(). + * + * @return amount of copied bytes. + */ +size_t +str_memout(str_t *s, char *dest, size_t dest_size) +{ + return str_memout_offset(s, 0, dest, dest_size); +} + +/** + * Reverse copy string content to specified buffer, clamping copy at the last + * character of the buffer and finishing with a NUL. + * + * @return amount of copied bytes (trailing NUL does not count). + */ +size_t +str_reverse_copyout(str_t *s, char *dest, size_t dest_size) +{ + size_t n; + size_t ds; + char *q; + + str_check(s); + g_assert(size_is_positive(dest_size)); + + ds = dest_size - 1; + n = MIN(ds, s->s_len); + q = dest; + + if (n != 0) { + char *p = &s->s_datas->s_len; + + while (n-- != 0) + *q++ = *--p; + *q = '\0'; + } + + return q - dest; +} + +/** + * Fetch character at given offset. Read from the end of the string when + * the offset is negative, -1 being the last character, 0 being the first. + * + * @return NUL if offset is not within the string range, but NUL may be a + * valid string character when dealing with binary strings. + */ +char +str_at(str_t *s, ssize_t offset) +{ + size_t len; + + str_check(s); + + len = s->s_len; + + if (offset >= 0) { + return UNSIGNED(offset) >= len ? '\0' : s->s_dataoffset; + } else { + size_t pos = len + offset; + return pos >= len ? '\0' : s->s_datapos; + } +} + +/** * Escape (in-place) all 'c' characters in string by prepending an escape 'e' * char in front of them. */ @@ -1067,12 +1430,223 @@ } /** + * Translate algebric offset into physical offset, with specific off-limit + * indication. + * + * A negative offset is interpreted starting from the end of the string, + * with -1 being the last character. + * + * When the physical offset falls before the start of the string, -1 is + * returned. If it falls beyond the end of the string, length is returned + * (i.e. one character beyond the actual end). + */ +static ssize_t +str_offset(const str_t *s, ssize_t offset) +{ + ssize_t i; + + i = offset >= 0 ? offset : (ssize_t) s->s_len + offset; + if (i < 0) + i = -1; + else if (UNSIGNED(i) > s->s_len) + i = s->s_len; + + return i; +} + +/** + * Translate algebric offset into physical offset within string. + * + * A negative offset is interpreted starting from the end of the string, + * with -1 being the last character. + * + * The offset is always adjusted to fall within the string, rounding it up + * to 0 when it is negative and points before the start, or down to the last + * character in the string when it is positive and points beyond the end. + * + * @return a safe offset, between 0 (inclusive) and length (exclusive). + */ +static size_t +str_offset_safe(const str_t *s, ssize_t offset) +{ + size_t i; + + if (offset >= 0) { + size_t pos = offset; + i = pos >= s->s_len ? (0 == s->s_len ? 0 : s->s_len - 1) : pos; + } else { + size_t pos = s->s_len + offset; + i = pos >= s->s_len ? 0 : pos; + } + + return i; +} + +/** + * Look for character ``c'' in string, starting at given offset. + * + * A negative offset is interpreted starting from the end of the string, + * with -1 being the last character. + * + * @return the offset from the start of the string where character is found, + * or -1 if not found. + */ +ssize_t +str_chr_at(const str_t *s, int c, ssize_t offset) +{ + size_t len, i; + ssize_t pos; + const char *p; + + str_check(s); + + len = s->s_len; + i = pos = str_offset(s, offset); + if (pos < 0) + i = 0; + else if (UNSIGNED(pos) >= len) + return -1; + + for (p = s->s_data + i; i < len; i++) { + if G_UNLIKELY(*p++ == c) + return i; + } + + return -1; +} + +/** + * Look for character ``c'' in string, starting at position 0. + * + * @return the offset from the start of the string where character is found, + * or -1 if not found. + */ +ssize_t +str_chr(const str_t *s, int c) +{ + return str_chr_at(s, c, 0); +} + +/** + * Backward look for character ``c'' in string, starting at given offset. + * + * A negative offset is interpreted starting from the end of the string, + * with -1 being the last character. + * + * @return the offset from the start of the string where character is found, + * or -1 if not found. + */ +ssize_t +str_rchr_at(const str_t *s, int c, ssize_t offset) +{ + size_t len, i; + ssize_t pos; + const char *p; + + str_check(s); + + len = s->s_len; + i = pos = str_offset(s, offset); + if (pos < 0) + return -1; + else if (UNSIGNED(pos) >= len) + i = len - 1; + + for (p = s->s_data + i++; i != 0; i--) { + if G_UNLIKELY(*p-- == c) + return i - 1; + } + + return -1; +} + +/** + * Backward look for character ``c'' in string, starting at end of string. + * + * @return the offset from the start of the string where character is found, + * or -1 if not found. + */ +ssize_t +str_rchr(const str_t *s, int c) +{ + return str_rchr_at(s, c, -1); +} + +/** + * Generate a new string from the characters within the specified range + * in the given string. Range is inclusive on both sides. + * + * A negative offset is interpreted starting from the end of the string, + * with -1 being the last character. + * + * @return a new string object + */ +str_t * +str_slice(const str_t *s, ssize_t from, ssize_t to) +{ + str_t *n; + size_t len, start, end; + + str_check(s); + + start = str_offset_safe(s, from); + end = str_offset_safe(s, to); + + len = start <= end ? end - start + 1 : 0; + if (0 == s->s_len) + len = 0; + n = str_new(len + 1); /* Allow for trailing NUL in str_2c() */ + n->s_len = len; + memcpy(n->s_data, s->s_data + start, len); + + return n; +} + +/** + * Generate a new string that is a substring of characters from given + * string, starting at a given offset and of specified length. + * + * A negative offset is interpreted starting from the end of the string, + * with -1 being the last character. + * + * When the length specified would include characters beyond the end of + * the string, the length is truncated to the actual string length. + * + * @return a new string object + */ +str_t * +str_substr(const str_t *s, ssize_t from, size_t length) +{ + str_t *n; + size_t len, start; + + str_check(s); + g_assert(size_is_non_negative(length)); + + start = str_offset_safe(s, from); + if (0 == s->s_len) { + len = 0; + } else { + size_t end = start + length; /* One char beyond */ + if (end > s->s_len) + end = s->s_len; + len = start <= end ? end - start : 0; + } + + n = str_new(len + 1); /* Allow for trailing NUL in str_2c() */ + n->s_len = len; + memcpy(n->s_data, s->s_data + start, len); + + return n; +} + +/** * Round up floating-point mantissa, with leading extra carry digit. * * For instance, given "314159" with a rounding position of 2, the routine * returns "0314". However, given "9995", it would return "1000". * - * This routine is used internally by str_nvcatf() to format floats. + * This routine is used internally by str_fcat_safe() to format floats. * * @param mbuf the mantissa * @param mlen the length of the mantissa @@ -1150,13 +1724,14 @@ * str_vncatf(), which comes from Perl sources. */ -#define bool int #define BIT_DIGITS(n) (((n)*146)/485 + 1) /* log2(10) =~ 146/485 */ #define TYPE_DIGITS(t) BIT_DIGITS(sizeof(t) * 8) /** * Append formatted floating point value. * + * This routine does not come from Perl but was written by Raphael Manfredi. + * * @param str string to which fomatting occurs * @param maxlen maximum amount of bytes to print * @param nv floating point value @@ -1173,7 +1748,7 @@ */ static size_t str_fcat_safe(str_t *str, size_t maxlen, double nv, const char f, - gboolean has_precis, const size_t precision, const size_t width, + bool has_precis, const size_t precision, const size_t width, const char plus, const bool left, const bool alt, size_t *written) { size_t ezeros = 0; /* Trailing mantissa zeros in %e form */ @@ -1251,8 +1826,8 @@ int e; char m32, r33; size_t mlen, rlen, asked; - gboolean dragon_fmt = FALSE; - gboolean asked_dragon = FALSE; + bool dragon_fmt = FALSE; + bool asked_dragon = FALSE; if ('F' == c) { asked_dragon = TRUE; @@ -1332,9 +1907,9 @@ * * %F is our special "free format": * - If e = 0, we show the mantissa as-is. - * - If e > 0, we switch to scientific notation as soon - * as the digits in the mantissa + trailing zeros would - * lead to a number with more than FPDIG digits. + * - If e > 0, we switch to scientific notation as soon as + * the exponent is greater than the available significant + * digits and when e > 10. * - If e < 0, we switch to scientific notation when * the number of leading zeros + the mantissa would be * larger than FPREC digits (deemed harder to read at @@ -1348,7 +1923,7 @@ c = 'f'; /* For logging only */ if (e > 0) { size_t v = e; - if (MAX(v, mlen) > FPDIG) c = 'E'; + if (v > mlen && e > 10) c = 'E'; } else if (e < 0) { if (e < -5 || mlen - e > FPREC) c = 'E'; } @@ -1555,7 +2130,7 @@ /* Skip trailing zeros if %g or %G */ /* Trailing zeros kept with %#g (alt) */ if (digits && !alt && i >= d) { - if (ri != '0') { + if (ri != '0' || has_non_zero) { *--mptr = ri; has_non_zero = TRUE; } @@ -1630,7 +2205,7 @@ * more precisely. */ - if (remain <= need) /* Cannot fit entirely */ + if (remain < need) /* Cannot fit entirely */ goto careful; /* @@ -1645,20 +2220,17 @@ p += gap; } if (esignlen) { - memcpy(p, esignbuf, esignlen); - p += esignlen; + p = mempcpy(p, esignbuf, esignlen); } if (elen && 0 == azeros) { - memcpy(p, eptr, elen); - p += elen; + p = mempcpy(p, eptr, elen); } if (ezeros) { memset(p, '0', ezeros); p += ezeros; } if (explen) { - memcpy(p, expptr, explen); - p += explen; + p = mempcpy(p, expptr, explen); } if (dzeros) { memset(p, '0', dzeros); @@ -1674,8 +2246,7 @@ p += azeros; } if (elen && 0 != azeros) { - memcpy(p, eptr, elen); - p += elen; + p = mempcpy(p, eptr, elen); } if (fzeros) { memset(p, '0', fzeros); @@ -1865,8 +2436,8 @@ * h interpret integer as C type "short" or "unsigned short" * z interpret integer as C type "size_t" or "ssize_t" * - * Where a number would appear in the flags, an asterisk ("*") may be - * instead, in which case the routine uses the next item in the parameter + * Where a number would appear in the flags, an asterisk ("*") may be given + * instead, in which case the routine uses the next item (int) in the parameter * list as the given number (that is, as the field width or precision). * If a field width obtained through "*" is negative, it has the same effect * as the '-' flag: left-justification. @@ -2259,7 +2830,7 @@ case 'g': case 'G': { size_t written; - gboolean ok; + bool ok; nv = va_arg(args, double); processed++; @@ -2327,7 +2898,7 @@ * more precisely. */ - if (remain <= need) /* Cannot fit entirely */ + if (remain < need) /* Cannot fit entirely */ goto careful; /* @@ -2338,31 +2909,30 @@ str_makeroom(str, need); /* we do not NUL terminate it */ p = str->s_data + str->s_len; /* next "free" char in arena */ if (esignlen && fill == '0') { - memcpy(p, esignbuf, esignlen); - p += esignlen; + p = mempcpy(p, esignbuf, esignlen); } if (gap && !left) { memset(p, fill, gap); p += gap; } if (esignlen && fill != '0') { - memcpy(p, esignbuf, esignlen); - p += esignlen; + p = mempcpy(p, esignbuf, esignlen); } if (zeros) { memset(p, '0', zeros); p += zeros; } if (elen) { - memcpy(p, eptr, elen); - p += elen; + p = mempcpy(p, eptr, elen); } if (gap && left) { memset(p, ' ', gap); p += gap; } str->s_len = p - str->s_data; /* trailing NUL does not count */ - g_assert(str->s_len <= str->s_size); + g_assert_log(str->s_len <= str->s_size, + "%s(): s_len=%zu, s_size=%zu", + G_STRFUNC, str->s_len, str->s_size); remain -= need; continue; @@ -2429,30 +2999,42 @@ done: format_recursion--; + + g_assert_log(str->s_len <= str->s_size, + "%s(): s_len=%zu, s_size=%zu", + G_STRFUNC, str->s_len, str->s_size); + return str->s_len - origlen; clamped: { - static gboolean recursion; +#define TKEY func_to_pointer(str_vncatf) + + bool recursion = thread_private_get(TKEY) != NULL; /* * This routine MUST be recursion-safe since it is used indirectly * by s_minicarp() through the str_vprintf() call and we're about * to call the former now! + * + * Hence the use of a thread-private variable to record recursions + * before invoking s_minicarp(). */ if (!recursion && tests_completed) { - recursion = TRUE; + thread_private_add(TKEY, uint_to_pointer(1)); s_minicarp("truncated output within %zu-byte buffer " "(%zu max, %zu written, %zu available) with \"%s\" " "(%zu arg%s processed)", str->s_size, maxlen, str->s_len - origlen, str->s_size - str->s_len, - fmt, processed, 1 == processed ? "" : "s"); - recursion = FALSE; + fmt, processed, plural(processed)); + thread_private_remove(TKEY); } } +#undef TKEY + goto done; #undef STR_APPEND @@ -2590,15 +3172,16 @@ char * str_vcmsg(const char *fmt, va_list args) { - static str_t *str; - - if G_UNLIKELY(NULL == str) - str = str_new_not_leaking(0); + static str_t *strTHREAD_MAX; + int stid = thread_small_id(); - str->s_len = 0; - str_vncatf(str, INT_MAX, fmt, args); + if G_UNLIKELY(NULL == strstid) + strstid = str_new_not_leaking(0); - return str_dup(str); + strstid->s_len = 0; + str_vncatf(strstid, INT_MAX, fmt, args); + + return str_dup(strstid); } /** @@ -2608,18 +3191,19 @@ char * str_cmsg(const char *fmt, ...) { - static str_t *str; + static str_t *strTHREAD_MAX; va_list args; - - if G_UNLIKELY(NULL == str) - str = str_new_not_leaking(0); + int stid = thread_small_id(); - str->s_len = 0; + if G_UNLIKELY(NULL == strstid) + strstid = str_new_not_leaking(0); + + strstid->s_len = 0; va_start(args, fmt); - str_vncatf(str, INT_MAX, fmt, args); + str_vncatf(strstid, INT_MAX, fmt, args); va_end(args); - return str_dup(str); + return str_dup(strstid); } /** @@ -2632,18 +3216,19 @@ const char * str_smsg(const char *fmt, ...) { - static str_t *str; + static str_t *strTHREAD_MAX; va_list args; - - if G_UNLIKELY(NULL == str) - str = str_new_not_leaking(0); + int stid = thread_small_id(); - str->s_len = 0; + if G_UNLIKELY(NULL == strstid) + strstid = str_new_not_leaking(0); + + strstid->s_len = 0; va_start(args, fmt); - str_vncatf(str, INT_MAX, fmt, args); + str_vncatf(strstid, INT_MAX, fmt, args); va_end(args); - return str_2c(str); + return str_2c(strstid); } /** @@ -2652,18 +3237,19 @@ const char * str_smsg2(const char *fmt, ...) { - static str_t *str; + static str_t *strTHREAD_MAX; va_list args; - - if G_UNLIKELY(NULL == str) - str = str_new_not_leaking(0); + int stid = thread_small_id(); - str->s_len = 0; + if G_UNLIKELY(NULL == strstid) + strstid = str_new_not_leaking(0); + + strstid->s_len = 0; va_start(args, fmt); - str_vncatf(str, INT_MAX, fmt, args); + str_vncatf(strstid, INT_MAX, fmt, args); va_end(args); - return str_2c(str); + return str_2c(strstid); } /** @@ -2771,6 +3357,94 @@ } /** + * Fix the exponent part of a formatted double. + * + * On Windows, and maybe on other systems, snprintf() formats exponents with + * 3 digits, whereas our str_vncatf() routine uses 2 digits. + * + * This routine normalizes exponents to 2 digits, for the purpose of + * avoiding spurious discrepancies reports when issues a verbose str_test(). + */ +static void G_COLD +str_test_fix_exponent(char *std) +{ + char *p = std; + int c; + bool has_leading_space; + + has_leading_space = ' ' == *p; + + while ((c = *p++)) { + int a; + + if ('e' == c || 'E' == c) { + char *extra; + + c = *p++; + if ('-' != c && '+' != c) + goto error; /* Not in an exponent */ + + extra = p; /* Extra '0' spot, if any present */ + c = *p++; + if (c != '0') + break; /* Nothing to fix */ + + c = *p++; + if (!is_ascii_digit(c)) + goto error; /* Only one digit after exponent, that's bad */ + + c = *p++; + if (!is_ascii_digit(c)) + break; /* Out of number, in formatted space now */ + + /* + * Ah, reached a third digit with an expoenent starting with '0' + * at ``extra'' in the string. Move everything back by one char. + */ + + a = *p; /* Character after the number */ + + g_assert(a == '\0' || is_ascii_space(a)); + + p = extra; + while (1) { + *p = *(p + 1); + if (a != '\0' && a == *p) + break; /* Leave trailing spaces intact */ + if ('\0' == *p++) + break; + } + + /* + * We removed one digit in the format, so we need to restore + * an additional leading space to compensate for the missing + * character, to not mess-up with the right-justification that + * necessarily occurred during the formatting. + */ + + if (has_leading_space) { + a = ' '; + p = std; + while (1) { + int t = *p; + *p++ = a; + if ('\0' == a) + break; + a = t; + } + } + + break; /* Done, string fixed */ + } + } + + return; /* OK, nothing to fix */ + +error: + s_error("%s(): invalid exponent in \"%s\"", G_STRFUNC, std); +} + +/** * Non-regression tests for the str_vncatf() formatting routine. * * Aborts execution on failure. @@ -2779,8 +3453,8 @@ * * @return amount of discrepancies found with the system's snprintf(). */ -G_GNUC_COLD size_t -str_test(gboolean verbose) +size_t G_COLD +str_test(bool verbose) { #define MLEN 64 #define DEADBEEF ((void *) 0xdeadbeef) @@ -2800,7 +3474,7 @@ static const char INTHEX = "543A8"; static const struct tstring { const char *fmt; - gboolean std; + bool std; size_t buflen; const char *value; const char *result; @@ -2822,7 +3496,7 @@ }; static const struct tchar { const char *fmt; - gboolean std; + bool std; size_t buflen; const char value; const char *result; @@ -2833,7 +3507,7 @@ }; static const struct tpointer { const char *fmt; - gboolean std; + bool std; size_t buflen; void *value; const char *result; @@ -2843,7 +3517,7 @@ }; static const struct tint { const char *fmt; - gboolean std; + bool std; size_t buflen; int value; const char *result; @@ -2865,10 +3539,12 @@ { "%d", S, MLEN, -INTEGER, "-345000" }, { "%-8d.", S, MLEN, -INTEGER, "-345000 ." }, { "%.08d", S, MLEN, INTEGER, "00345000" }, + { "%+d", S, MLEN, INTEGER, "+345000" }, + { "%+d", S, MLEN, -INTEGER, "-345000" }, }; static const struct tlong { const char *fmt; - gboolean std; + bool std; size_t buflen; long value; const char *result; @@ -2890,10 +3566,12 @@ { "%ld", S, MLEN, -LONG, "-345000" }, { "%-8ld.", S, MLEN, -LONG, "-345000 ." }, { "%.08ld", S, MLEN, LONG, "00345000" }, + { "%+ld", S, MLEN, LONG, "+345000" }, + { "%+ld", S, MLEN, -LONG, "-345000" }, }; static const struct tdouble { const char *fmt; - gboolean std; + bool std; size_t buflen; double value; const char *result; @@ -3034,16 +3712,16 @@ /* #120 */ { "%F", X, MLEN, 50000000000, "50000000000" }, { "%F", X, MLEN, 500000000000, "5E+11" }, - { "%F", X, MLEN, 50000000000.25, "5.000000000025E+10" }, - { "%F", X, MLEN, 54321987654, "5.4321987654E+10" }, - { "%F", X, MLEN, 54321987654.999,"5.4321987654999E+10" }, + { "%F", X, MLEN, 50000000000.25, "50000000000.25" }, + { "%F", X, MLEN, 54321987654, "54321987654" }, + { "%F", X, MLEN, 54321987654.999,"54321987654.999" }, { "%.1F", X, MLEN, 4561056.99, "5E+6" }, { "%.1F", X, MLEN, 500000000000, "5E+11" }, { "%.12F", X, MLEN, 500000000000, "500000000000" }, { "%.8F", X, MLEN, 4561056.99, "4561057" }, { "%.9F", X, MLEN, 4561056.99, "4561056.99" }, /* #130 */ - { "%F", X, MLEN, 5.12345678901e4,"5.12345678901E+4" }, + { "%F", X, MLEN, 5.12345678901e4,"51234.5678901" }, { "%F", X, MLEN, 1.2342543e200, "1.2342543E+200" }, { "%#F", X, MLEN, 0, "0." }, { "%#F", X, MLEN, -1, "-1." }, @@ -3070,12 +3748,24 @@ { "%f", S, MLEN, 0.0000001, "0.000000" }, { "%#g", S, MLEN, 0.1, "0.100000" }, { "%#g", S, MLEN, 0.01, "0.0100000" }, + { "%F", X, MLEN, 13.005952380952381, "13.005952380952381" }, + { "%F", X, MLEN, 130.05952380952381, "130.0595238095238" }, + { "%F", X, MLEN, 1300.5952380952381, "1300.595238095238" }, + { "%F", X, MLEN, 13005.952380952381, "13005.952380952382" }, + { "%F", X, MLEN, 130059523.80952381, "130059523.8095238" }, + /* #160 */ + { "%F", X, MLEN, 1300595238.0952381, "1300595238.0952382" }, + { "%F", X, MLEN, 13005952380.952381, "13005952380.952381" }, + { "%.17F", X, MLEN, 1300595238.0952381, "1300595238.0952382" }, + { "%.17F", X, MLEN, 13005952380.952381, "13005952380.952381" }, + { "%.17g", S, MLEN, 1300595238.0952381, "1300595238.0952382" }, + { "%.17g", S, MLEN, 13005952380.952381, "13005952380.952381" }, }; #define TEST(what, vfmt) G_STMT_START { \ unsigned i; \ \ - for (i = 0; i < G_N_ELEMENTS(test_##what##s); i++) { \ + for (i = 0; i < N_ITEMS(test_##what##s); i++) { \ char bufMLEN; \ const struct t##what *t = &test_##what##si; \ \ @@ -3092,7 +3782,7 @@ g_assert_log(0 == strcmp(buf, t->result), \ "%s test #%u/%zu fmt=\"%s\", len=%zu, " \ "returned=\"%s\", expected=\"%s\"", \ - #what, i + 1, G_N_ELEMENTS(test_##what##s), \ + #what, i + 1, N_ITEMS(test_##what##s), \ t->fmt, t->buflen, buf, t->result); \ \ if (t->std) { \ @@ -3102,6 +3792,8 @@ gm_snprintf_unchecked(std, sizeof std, \ t->fmt, t->value); \ stdt->buflen - 1 = '\0'; /* Truncate here */ \ + if (0 == ptr_cmp(&test_##what##s, &test_doubles)) \ + str_test_fix_exponent(std); \ gm_snprintf(value, sizeof value, vfmt, t->value); \ if (0 != strcmp(std, buf)) { \ discrepancies++; \ @@ -3111,7 +3803,7 @@ "\"%s\" with snprintf() but " \ "\"%s\" with str_vncatf()", \ #what, value, \ - i + 1, G_N_ELEMENTS(test_##what##s), \ + i + 1, N_ITEMS(test_##what##s), \ t->fmt, std, buf); \ } \ } \
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/str.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/str.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 1996-2000, 2007, 2010 Raphael Manfredi + * Copyright (c) 1996-2000, 2007, 2010-2015 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,7 +28,7 @@ * Dynamic string handling. * * @author Raphael Manfredi - * @date 1996-2000, 2007, 2010 + * @date 1996-2000, 2007, 2010-2015 */ #ifndef _str_h_ @@ -49,7 +49,7 @@ */ typedef struct str { enum str_magic s_magic; - guint32 s_flags; /**< General flags */ + uint32 s_flags; /**< General flags */ char *s_data; /**< Where string data is held */ size_t s_len; /**< String length (amount of chars held) */ size_t s_size; /**< Size of the data arena */ @@ -79,16 +79,19 @@ * Public interface. */ -size_t str_len(const str_t *s) G_GNUC_PURE; +size_t str_len(const str_t *s) G_PURE; str_t *str_new(size_t szhint); str_t *str_new_from(const char *string); str_t *str_new_not_leaking(size_t szhint); str_t *str_new_in_chunk(struct ckhunk *ck, size_t size); +str_t *str_new_in_buffer(void *buf, size_t len); +str_t *str_private(const void *key, size_t szhint); str_t *str_create(str_t *str, size_t szhint); str_t *str_make(char *ptr, size_t len); void str_foreign(str_t *str, char *buffer, size_t len, size_t size); void str_new_buffer(str_t *str, char *ptr, size_t len, size_t size); void str_free(str_t *str); +void str_discard(str_t *str); void str_destroy(str_t *str); void str_destroy_null(str_t **s_ptr); char *str_2c(str_t *str); @@ -97,44 +100,81 @@ str_t *str_clone(str_t *str); void str_reset(str_t *str); void str_grow(str_t *str, size_t size); +void str_reserve(str_t *str, size_t len); void str_setlen(str_t *str, size_t len); void str_putc(str_t *str, char c); void str_cpy(str_t *str, const char *string); +void str_cpy_len(str_t *str, const char *string, size_t len); void str_cat(str_t *str, const char *string); void str_cat_len(str_t *str, const char *string, size_t len); void str_ncat(str_t *str, const char *string, size_t len); -gboolean str_ncat_safe(str_t *str, const char *string, size_t len); +bool str_ncat_safe(str_t *str, const char *string, size_t len); void str_shift(str_t *str, size_t len); -gboolean str_ichar(str_t *str, ssize_t idx, char c); -gboolean str_istr(str_t *str, ssize_t idx, const char *string); -gboolean str_instr(str_t *str, ssize_t idx, const char *string, size_t n); +bool str_ichar(str_t *str, ssize_t idx, char c); +bool str_istr(str_t *str, ssize_t idx, const char *string); +bool str_instr(str_t *str, ssize_t idx, const char *string, size_t n); void str_remove(str_t *str, ssize_t idx, size_t n); void str_chomp(str_t *s); -gboolean str_replace(str_t *str, ssize_t idx, size_t amt, const char *string); +char str_chop(str_t *s); +bool str_replace(str_t *str, ssize_t idx, size_t amt, const char *string); +void str_reverse(str_t *s); void str_escape(str_t *str, char c, char e); +size_t str_copyout(str_t *s, char *dest, size_t dest_size); +size_t str_copyout_offset(str_t *s, size_t off, char *dest, size_t dest_size); +size_t str_reverse_copyout(str_t *s, char *dest, size_t dest_size); +size_t str_memout(str_t *s, char *dest, size_t dest_size); +size_t str_memout_offset(str_t *s, size_t off, char *dest, size_t dest_size); +char str_at(str_t *s, ssize_t offset); +ssize_t str_chr(const str_t *s, int c); +ssize_t str_chr_at(const str_t *s, int c, ssize_t offset); +ssize_t str_rchr(const str_t *s, int c); +ssize_t str_rchr_at(const str_t *s, int c, ssize_t offset); +str_t *str_slice(const str_t *s, ssize_t from, ssize_t to); +str_t *str_substr(const str_t *s, ssize_t from, size_t length); size_t str_vncatf(str_t *str, size_t maxlen, const char *fmt, va_list args); size_t str_vcatf(str_t *str, const char *fmt, va_list args); size_t str_vprintf(str_t *str, const char *fmt, va_list args); -size_t str_catf(str_t *str, const char *fmt, ...) G_GNUC_PRINTF(2, 3); +size_t str_catf(str_t *str, const char *fmt, ...) G_PRINTF(2, 3); size_t str_ncatf(str_t *str, size_t n, const char *fmt, ...) - G_GNUC_PRINTF(3, 4); -size_t str_printf(str_t *str, const char *fmt, ...) G_GNUC_PRINTF(2, 3); + G_PRINTF(3, 4); +size_t str_printf(str_t *str, const char *fmt, ...) G_PRINTF(2, 3); size_t str_nprintf(str_t *str, size_t n, const char *fmt, ...) - G_GNUC_PRINTF(3, 4); -str_t *str_msg(const char *fmt, ...) G_GNUC_PRINTF(1, 2); -char *str_cmsg(const char *fmt, ...) G_GNUC_PRINTF(1, 2); + G_PRINTF(3, 4); +str_t *str_msg(const char *fmt, ...) G_PRINTF(1, 2); +char *str_cmsg(const char *fmt, ...) G_PRINTF(1, 2); char *str_vcmsg(const char *fmt, va_list args); -const char *str_smsg(const char *fmt, ...) G_GNUC_PRINTF(1, 2); -const char *str_smsg2(const char *fmt, ...) G_GNUC_PRINTF(1, 2); +const char *str_smsg(const char *fmt, ...) G_PRINTF(1, 2); +const char *str_smsg2(const char *fmt, ...) G_PRINTF(1, 2); size_t str_bprintf(char *dst, size_t size, const char *fmt, ...) - G_GNUC_PRINTF(3, 4); + G_PRINTF(3, 4); size_t str_vbprintf(char *dst, size_t size, const char *fmt, va_list args); size_t str_bcatf(char *dst, size_t size, const char *fmt, ...) - G_GNUC_PRINTF(3, 4); + G_PRINTF(3, 4); size_t str_vbcatf(char *dst, size_t size, const char *fmt, va_list args); -size_t str_test(gboolean verbose); +size_t str_test(bool verbose); + +/* + * Macros to use with constant string arguments. + * + * STR_CONST_LEN() must be used with a manifest string (or there will be + * a compile-time error) and it returns the length of the C string at + * compile time. + * + * The appended "" in the macro is NOT an error and allows catching some + * improper usage, relying on compile-time string concatenation when the + * argument is a manifest string. It will not catch improper usage like + * STR_CONST_LEN(v ? "a" : "bc") though. + * + * STR_CPY() and STR_CAT() are also intended to be used with manifest strings + * and issue the corresponding calls with the length of their string argument + * pre-computed at compile time. + */ + +#define STR_CONST_LEN(p) (sizeof(p "") - 1) +#define STR_CPY(s, p) str_cpy_len((s), (p), STR_CONST_LEN(p)) +#define STR_CAT(s, p) str_cat_len((s), (p), STR_CONST_LEN(p)) #endif /* _str_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/stringify.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/stringify.c
Changed
@@ -37,11 +37,16 @@ #include "common.h" #include "stringify.h" + #include "ascii.h" +#include "buf.h" #include "endian.h" -#include "misc.h" -#include "glib-missing.h" +#include "glib-missing.h" /* For g_strlcat() with glib 1.x */ #include "halloc.h" +#include "mempcpy.h" +#include "misc.h" +#include "str.h" + #include "override.h" /* Must be the last header included */ static const char hex_alphabet = "0123456789ABCDEF"; @@ -57,13 +62,13 @@ * @return the length of resulting string. */ static inline size_t -print_uint16_hex(char *dst, guint16 v) +print_uint16_hex(char *dst, uint16 v) { char *p = dst; int i; for (i = 0; i < 3; i++, v <<= 4) { - guint8 d; + uint8 d; d = v >> 12; if (0 != d || p != dst) @@ -87,16 +92,16 @@ * large. */ size_t -ipv4_to_string_buf(guint32 ipv4, char *dst, size_t size) +ipv4_to_string_buf(uint32 ipv4, char *dst, size_t size) { char bufIPV4_ADDR_BUFLEN; char * const p0 = size < sizeof buf ? buf : dst; char *p = p0; - guint i; + uint i; for (i = 0; i < 4; i++) { - guchar v; - + uchar v; + v = (ipv4 >> 24) & 0xff; ipv4 <<= 8; @@ -160,7 +165,7 @@ */ for (i = 0; i < 16; /* NOTHING */) { - guint16 v; + uint16 v; v = peek_be16(&ipv6i); @@ -181,7 +186,7 @@ for (i = 0; i < 16; /* NOTHING */) { - guint16 v = peek_be16(&ipv6i); + uint16 v = peek_be16(&ipv6i); if (i != zero_start) { p += print_uint16_hex(p, v); @@ -217,10 +222,11 @@ /* Now copy the result to ``dst'' if we used the temporary buffer. */ if (dst != q) { size_t n = size - 1; + char *end; n = MIN(n, (size_t) (p - q)); - memcpy(dst, q, n); - dstn = '\0'; + end = mempcpy(dst, q, n); + *end = '\0'; } *p = '\0'; @@ -235,43 +241,48 @@ * representing the given IPv6 address. */ const char * -ipv6_to_string(const guint8 *ipv6) +ipv6_to_string(const uint8 *ipv6) { - static char bufIPV6_ADDR_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, IPV6_ADDR_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - n = ipv6_to_string_buf(ipv6, buf, sizeof buf); - g_assert(n < sizeof buf); - return buf; + n = ipv6_to_string_buf(ipv6, p, sz); + g_assert(n < sz); + return p; } const char * -ipv6_to_string2(const guint8 *ipv6) +ipv6_to_string2(const uint8 *ipv6) { - static char bufIPV6_ADDR_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, IPV6_ADDR_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - n = ipv6_to_string_buf(ipv6, buf, sizeof buf); - g_assert(n < sizeof buf); - return buf; + n = ipv6_to_string_buf(ipv6, p, sz); + g_assert(n < sz); + return p; } const char * -ip_to_string(guint32 ip) +ip_to_string(uint32 ip) { - static char bufIPV4_ADDR_BUFLEN; + buf_t *b = buf_private(G_STRFUNC, IPV4_ADDR_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - ipv4_to_string_buf(ip, buf, sizeof buf); - return buf; + n = ipv4_to_string_buf(ip, p, sz); + g_assert(n < sz); + return p; } const char * -hostname_port_to_string(const char *hostname, guint16 port) +hostname_port_to_string(const char *hostname, uint16 port) { - static char a300; + str_t *s = str_private(G_STRFUNC, 255 + UINT16_DEC_BUFLEN + 2); - gm_snprintf(a, sizeof(a), "%.255s:%u", hostname, port); - return a; + str_printf(s, "%.255s:%u", hostname, port); + return str_2c(s); } size_t @@ -279,7 +290,7 @@ { char bufUINT32_DEC_BUFLEN + 1; char *p; - gboolean neg; + bool neg; g_assert(0 == size || NULL != dst); g_assert(size <= INT_MAX); @@ -301,7 +312,7 @@ } size_t -uint32_to_string_buf(guint32 v, char *dst, size_t size) +uint32_to_string_buf(uint32 v, char *dst, size_t size) { char bufUINT32_DEC_BUFLEN; char *p; @@ -319,12 +330,12 @@ } size_t -uint64_to_string_buf(guint64 v, char *dst, size_t size) +uint64_to_string_buf(uint64 v, char *dst, size_t size) { char bufUINT64_DEC_BUFLEN; char *p; - if ((guint32) -1 >= v) { + if ((uint32) -1 >= v) { /* 32-bit arithmetic is cheaper for most machines */ return uint32_to_string_buf(v, dst, size); } @@ -360,6 +371,24 @@ } size_t +ulong_to_string_buf(unsigned long v, char *dst, size_t size) +{ + char bufULONG_DEC_BUFLEN; + char *p; + + g_assert(0 == size || NULL != dst); + g_assert(size <= INT_MAX); + + for (p = buf; /* NOTHING */; v /= 10) { + *p++ = dec_digit(v % 10); + if (v < 10) + break; + } + + return reverse_strlcpy(dst, size, buf, p - buf); +} + +size_t size_t_to_string_buf(size_t v, char *dst, size_t size) { char bufSIZE_T_DEC_BUFLEN; @@ -393,6 +422,11 @@ break; } + /* Add the leading "0x" prefix, accounted for in POINTER_BUFLEN */ + + *p++ = 'x'; /* String will be reversed */ + *p++ = '0'; + return reverse_strlcpy(dst, size, buf, p - buf); } @@ -401,7 +435,7 @@ { char bufOFF_T_DEC_BUFLEN; char *p; - gboolean neg; + bool neg; g_assert(0 == size || NULL != dst); g_assert(size <= INT_MAX); @@ -422,113 +456,165 @@ } const char * -uint32_to_string(guint32 v) +uint32_to_string(uint32 v) { - static char bufUINT32_DEC_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, UINT32_DEC_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - n = uint32_to_string_buf(v, buf, sizeof buf); + n = uint32_to_string_buf(v, p, sz); g_assert(n > 0); - g_assert(n < sizeof buf); - return buf; + g_assert(n < sz); + return p; } const char * -uint64_to_string(guint64 v) +uint64_to_string(uint64 v) { - static char bufUINT64_DEC_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, UINT64_DEC_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - n = uint64_to_string_buf(v, buf, sizeof buf); + n = uint64_to_string_buf(v, p, sz); g_assert(n > 0); - g_assert(n < sizeof buf); - return buf; + g_assert(n < sz); + return p; } const char * -uint64_to_string2(guint64 v) +uint64_to_string2(uint64 v) { - static char bufUINT64_DEC_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, UINT64_DEC_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - n = uint64_to_string_buf(v, buf, sizeof buf); + n = uint64_to_string_buf(v, p, sz); g_assert(n > 0); - g_assert(n < sizeof buf); - return buf; + g_assert(n < sz); + return p; +} + +const char * +uint64_to_string3(uint64 v) +{ + buf_t *b = buf_private(G_STRFUNC, UINT64_DEC_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); + + n = uint64_to_string_buf(v, p, sz); + g_assert(n > 0); + g_assert(n < sz); + return p; +} + +const char * +ulong_to_string(ulong v) +{ + buf_t *b = buf_private(G_STRFUNC, ULONG_DEC_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); + + n = ulong_to_string_buf(v, p, sz); + g_assert(n > 0); + g_assert(n < sz); + return p; } const char * uint_to_string(unsigned v) { - static char bufUINT_DEC_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, UINT_DEC_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - n = uint_to_string_buf(v, buf, sizeof buf); + n = uint_to_string_buf(v, p, sz); g_assert(n > 0); - g_assert(n < sizeof buf); - return buf; + g_assert(n < sz); + return p; } const char * size_t_to_string(size_t v) { - static char bufSIZE_T_DEC_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, SIZE_T_DEC_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - n = size_t_to_string_buf(v, buf, sizeof buf); + n = size_t_to_string_buf(v, p, sz); g_assert(n > 0); - g_assert(n < sizeof buf); - return buf; + g_assert(n < sz); + return p; } const char * -pointer_to_string(const void *p) +pointer_to_string(const void *q) { - static char bufPOINTER_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, POINTER_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - n = pointer_to_string_buf(p, buf, sizeof buf); + n = pointer_to_string_buf(q, p, sz); g_assert(n > 0); - g_assert(n < sizeof buf); - return buf; + g_assert(n < sz); + return p; } const char * filesize_to_string(filesize_t v) { - static char bufUINT64_DEC_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, FILESIZE_DEC_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); + + STATIC_ASSERT((filesize_t)-1 <= (uint64)-1); - STATIC_ASSERT((filesize_t)-1 <= (guint64)-1); - n = uint64_to_string_buf(v, buf, sizeof buf); + n = uint64_to_string_buf(v, p, sz); g_assert(n > 0); - g_assert(n < sizeof buf); - return buf; + g_assert(n < sz); + return p; } const char * filesize_to_string2(filesize_t v) { - static char bufUINT64_DEC_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, FILESIZE_DEC_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); + + STATIC_ASSERT((filesize_t)-1 <= (uint64)-1); - STATIC_ASSERT((filesize_t)-1 <= (guint64)-1); - n = uint64_to_string_buf(v, buf, sizeof buf); + n = uint64_to_string_buf(v, p, sz); g_assert(n > 0); - g_assert(n < sizeof buf); - return buf; + g_assert(n < sz); + return p; +} + +const char * +filesize_to_string3(filesize_t v) +{ + buf_t *b = buf_private(G_STRFUNC, FILESIZE_DEC_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); + + STATIC_ASSERT((filesize_t)-1 <= (uint64)-1); + + n = uint64_to_string_buf(v, p, sz); + g_assert(n > 0); + g_assert(n < sz); + return p; } const char * fileoffset_t_to_string(fileoffset_t v) { - static char bufOFF_T_DEC_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, OFF_T_DEC_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - n = fileoffset_t_to_string_buf(v, buf, sizeof buf); + n = fileoffset_t_to_string_buf(v, p, sz); g_assert(n > 0); - g_assert(n < sizeof buf); - return buf; + g_assert(n < sz); + return p; } size_t @@ -536,7 +622,7 @@ { char bufUINT32_DEC_GRP_BUFLEN + 1; char *p; - gboolean neg; + bool neg; unsigned n; g_assert(0 == size || NULL != dst); @@ -562,7 +648,7 @@ } size_t -uint32_to_gstring_buf(guint32 v, char *dst, size_t size) +uint32_to_gstring_buf(uint32 v, char *dst, size_t size) { char bufUINT32_DEC_GRP_BUFLEN; char *p; @@ -583,13 +669,13 @@ } size_t -uint64_to_gstring_buf(guint64 v, char *dst, size_t size) +uint64_to_gstring_buf(uint64 v, char *dst, size_t size) { char bufUINT64_DEC_GRP_BUFLEN; char *p; unsigned n; - if ((guint32) -1 >= v) { + if ((uint32) -1 >= v) { /* 32-bit arithmetic is cheaper for most machines */ return uint32_to_gstring_buf(v, dst, size); } @@ -630,6 +716,27 @@ } size_t +ulong_to_gstring_buf(unsigned long v, char *dst, size_t size) +{ + char bufULONG_DEC_GRP_BUFLEN; + char *p; + unsigned n; + + g_assert(0 == size || NULL != dst); + g_assert(size <= INT_MAX); + + for (p = buf, n = 0; /* NOTHING */; v /= 10, n++) { + if (n != 0 && 0 == n % 3) + *p++ = ','; + *p++ = dec_digit(v % 10); + if (v < 10) + break; + } + + return reverse_strlcpy(dst, size, buf, p - buf); +} + +size_t size_t_to_gstring_buf(size_t v, char *dst, size_t size) { char bufSIZE_T_DEC_GRP_BUFLEN; @@ -651,51 +758,147 @@ } const char * -uint32_to_gstring(guint32 v) +uint32_to_gstring(uint32 v) { - static char bufUINT32_DEC_GRP_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, UINT32_DEC_GRP_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - n = uint32_to_gstring_buf(v, buf, sizeof buf); + n = uint32_to_gstring_buf(v, p, sz); g_assert(n > 0); - g_assert(n < sizeof buf); - return buf; + g_assert(n < sz); + return p; } const char * -uint64_to_gstring(guint64 v) +uint64_to_gstring(uint64 v) { - static char bufUINT64_DEC_GRP_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, UINT64_DEC_GRP_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - n = uint64_to_gstring_buf(v, buf, sizeof buf); + n = uint64_to_gstring_buf(v, p, sz); g_assert(n > 0); - g_assert(n < sizeof buf); - return buf; + g_assert(n < sz); + return p; } const char * uint_to_gstring(unsigned v) { - static char bufUINT_DEC_GRP_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, UINT_DEC_GRP_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - n = uint_to_gstring_buf(v, buf, sizeof buf); + n = uint_to_gstring_buf(v, p, sz); g_assert(n > 0); - g_assert(n < sizeof buf); - return buf; + g_assert(n < sz); + return p; } const char * size_t_to_gstring(size_t v) { - static char bufSIZE_T_DEC_GRP_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, SIZE_T_DEC_GRP_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - n = size_t_to_gstring_buf(v, buf, sizeof buf); + n = size_t_to_gstring_buf(v, p, sz); g_assert(n > 0); - g_assert(n < sizeof buf); - return buf; + g_assert(n < sz); + return p; +} + +const char * +filesize_to_gstring(filesize_t v) +{ + buf_t *b = buf_private(G_STRFUNC, FILESIZE_DEC_GRP_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); + + STATIC_ASSERT((filesize_t)-1 <= (uint64)-1); + + n = uint64_to_gstring_buf(v, p, sz); + g_assert(n > 0); + g_assert(n < sz); + return p; +} + +const char * +uint32_to_string_grp(uint32 v, bool groupped) +{ + buf_t *b = buf_private(G_STRFUNC, UINT32_DEC_GRP_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); + + n = groupped ? + uint32_to_gstring_buf(v, p, sz) : uint32_to_string_buf(v, p, sz); + + g_assert(n > 0); + g_assert(n < sz); + return p; +} + +const char * +uint64_to_string_grp(uint64 v, bool groupped) +{ + buf_t *b = buf_private(G_STRFUNC, UINT64_DEC_GRP_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); + + n = groupped ? + uint64_to_gstring_buf(v, p, sz) : uint64_to_string_buf(v, p, sz); + + g_assert(n > 0); + g_assert(n < sz); + return p; +} + +const char * +uint_to_string_grp(uint v, bool groupped) +{ + buf_t *b = buf_private(G_STRFUNC, UINT_DEC_GRP_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); + + n = groupped ? + uint_to_gstring_buf(v, p, sz) : uint_to_string_buf(v, p, sz); + + g_assert(n > 0); + g_assert(n < sz); + return p; +} + +const char * +size_t_to_string_grp(size_t v, bool groupped) +{ + buf_t *b = buf_private(G_STRFUNC, SIZE_T_DEC_GRP_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); + + n = groupped ? + size_t_to_gstring_buf(v, p, sz) : size_t_to_string_buf(v, p, sz); + + g_assert(n > 0); + g_assert(n < sz); + return p; +} + +const char * +filesize_to_string_grp(filesize_t v, bool groupped) +{ + buf_t *b = buf_private(G_STRFUNC, FILESIZE_DEC_GRP_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); + + STATIC_ASSERT((filesize_t)-1 <= (uint64)-1); + + n = groupped ? + uint64_to_gstring_buf(v, p, sz) : uint64_to_string_buf(v, p, sz); + + g_assert(n > 0); + g_assert(n < sz); + return p; } /** @@ -708,9 +911,10 @@ char * data_hex_str(const char *data, size_t len) { - static char buf84; - static const size_t maxlen = sizeof(buf) - 4; /* 3 chars for "more" + NUL */ - const guint8 *p = cast_to_gconstpointer(data); + static const size_t maxlen = 84 - 4; /* 3 chars for "more" + NUL */ + buf_t *b = buf_private(G_STRFUNC, maxlen); + char *buf = buf_data(b); + const uint8 *p = cast_to_constpointer(data); size_t hmax; size_t i; @@ -728,7 +932,7 @@ bufi++ = '.'; } - g_assert(i < sizeof(buf)); + g_assert(i < buf_size(b)); bufi = '\0'; return buf; @@ -739,8 +943,8 @@ /** * Allow spaces, tabs or new-lines as "spacing" chars. */ -static inline gboolean -char_is_space(guchar c) +static inline bool +char_is_space(uchar c) { return c == ' ' || c == '\t' || c == '\n'; } @@ -748,8 +952,8 @@ /** * Nearly the same as isprint() but allows additional safe chars if !strict. */ -static inline gboolean -char_is_safe(guchar c, gboolean strict) +static inline bool +char_is_safe(uchar c, bool strict) { return isprint(c) || (!strict && char_is_space(c)); } @@ -761,11 +965,11 @@ * The new string must be freed through hfree(). */ char * -hex_escape(const char *name, gboolean strict) +hex_escape(const char *name, bool strict) { const char *p; char *q; - guchar c; + uchar c; int need_escape = 0; char *new; @@ -799,8 +1003,8 @@ * * @return TRUE if "c" should be escaped, FALSE otherwise. */ -static inline gboolean -escape_control_char(guchar c) +static inline bool +escape_control_char(uchar c) { return is_ascii_cntrl(c) && !char_is_space(c); } @@ -817,7 +1021,7 @@ { size_t need_escape = 0; const char *p; - guchar c; + uchar c; for (p = s; '\0' != (c = *p); p++) if (escape_control_char(c)) @@ -846,12 +1050,12 @@ return escaped; } - + return deconstify_gchar(s); } -static guint -char_to_printf_escape(guchar c, char *esc, const char *safe_chars) +static uint +char_to_printf_escape(uchar c, char *esc, const char *safe_chars) { if (!safe_chars) { safe_chars = ""; @@ -859,7 +1063,7 @@ if (is_ascii_alnum(c) || (c < 0x80 && strchr(safe_chars, c))) { if (esc) *esc = c; - + return 1; } else { if (esc) { @@ -883,36 +1087,47 @@ * * @param src The string to escape. * @return The escaped string. MUST NOT be freed. - */ + */ const char * lazy_string_to_printf_escape(const char *src) { + char *prev; + buf_t *b = buf_private(G_STRFUNC, sizeof prev); + void *bd = buf_data(b); static const char safe_chars = ".-_"; - static char *prev; const char *s; char *p; - guchar c; + uchar c; size_t n; + /* + * The "prev" variable holds the address of the previous allocated string. + * Its value is stored in a thread-private buffer, so the lazy pointer is + * managed on a pre-thread basis. + */ + + memcpy(&prev, bd, sizeof prev); /* Previous value, NULL initially */ + g_assert(src); g_assert(src != prev); HFREE_NULL(prev); - + for (s = src, n = 0; '\0' != (c = *s); s++) n += char_to_printf_escape(c, NULL, safe_chars); if (n == (size_t) (s - src)) return src; - + prev = halloc(n + 1); for (s = src, p = prev; '\0' != (c = *s); s++) { - guint len = char_to_printf_escape(c, p, safe_chars); + uint len = char_to_printf_escape(c, p, safe_chars); p += len; } *p = '\0'; - - return NOT_LEAKING(prev); + + memcpy(bd, &prev, sizeof prev); + return NOT_LEAKING(prev); } /** @@ -922,43 +1137,48 @@ const char * short_time(time_delta_t t) { - static char buf4 * SIZE_FIELD_MAX; - guint s = MAX(t, 0); + str_t *p = str_private(G_STRFUNC, 4 * SIZE_FIELD_MAX); + uint s = MAX(t, 0); if (s > 86400) - gm_snprintf(buf, sizeof buf, _("%ud %uh"), - s / 86400, (s % 86400) / 3600); + str_printf(p, _("%ud %uh"), s / 86400, (s % 86400) / 3600); else if (s > 3600) - gm_snprintf(buf, sizeof buf, _("%uh %um"), s / 3600, (s % 3600) / 60); + str_printf(p, _("%uh %um"), s / 3600, (s % 3600) / 60); else if (s > 60) - gm_snprintf(buf, sizeof buf, _("%um %us"), s / 60, s % 60); + str_printf(p, _("%um %us"), s / 60, s % 60); else - gm_snprintf(buf, sizeof buf, _("%us"), s); + str_printf(p, _("%us"), s); - return buf; + return str_2c(p); } /** - * @return time spent in seconds in a consise short readable form. + * @return time spent in seconds in a concise short readable form. * @note The returned string is in English and ASCII encoded. */ const char * short_time_ascii(time_delta_t t) { - static char buf4 * SIZE_FIELD_MAX; - guint s = MAX(t, 0); + str_t *p = str_private(G_STRFUNC, 4 * SIZE_FIELD_MAX); + uint s; + const char *m; + + if (t >= 0) { + s = t; m = ""; + } else { + s = -t; m = "-"; + } if (s > 86400) - gm_snprintf(buf, sizeof buf, "%ud %uh", - s / 86400, (s % 86400) / 3600); + str_printf(p, "%s%ud %uh", m, s / 86400, (s % 86400) / 3600); else if (s > 3600) - gm_snprintf(buf, sizeof buf, "%uh %um", s / 3600, (s % 3600) / 60); + str_printf(p, "%s%uh %um", m, s / 3600, (s % 3600) / 60); else if (s > 60) - gm_snprintf(buf, sizeof buf, "%um %us", s / 60, s % 60); + str_printf(p, "%s%um %us", m, s / 60, s % 60); else - gm_snprintf(buf, sizeof buf, "%us", s); + str_printf(p, "%s%us", m, s); - return buf; + return str_2c(p); } /** @@ -978,14 +1198,14 @@ size_t r; if (s > 86400) - r = gm_snprintf(dst, size, "%s%ud%uh", + r = str_bprintf(dst, size, "%s%ud%uh", m, s / 86400, (s % 86400) / 3600); else if (s > 3600) - r = gm_snprintf(dst, size, "%s%uh%um", m, s / 3600, (s % 3600) / 60); + r = str_bprintf(dst, size, "%s%uh%um", m, s / 3600, (s % 3600) / 60); else if (s > 60) - r = gm_snprintf(dst, size, "%s%um%us", m, s / 60, s % 60); + r = str_bprintf(dst, size, "%s%um%us", m, s / 60, s % 60); else - r = gm_snprintf(dst, size, "%s%us", m, s); + r = str_bprintf(dst, size, "%s%us", m, s); return r; } @@ -1000,10 +1220,13 @@ const char * compact_time(time_delta_t t) { - static char buf4 * SIZE_FIELD_MAX + 1; + buf_t *b = buf_private(G_STRFUNC, SIZE_FIELD_MAX); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - compact_time_to_buf(t, buf, sizeof buf); - return buf; + n = compact_time_to_buf(t, p, sz); + g_assert(n < sz); + return p; } /** @@ -1016,10 +1239,69 @@ const char * compact_time2(time_delta_t t) { - static char buf4 * SIZE_FIELD_MAX + 1; + buf_t *b = buf_private(G_STRFUNC, SIZE_FIELD_MAX); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - compact_time_to_buf(t, buf, sizeof buf); - return buf; + n = compact_time_to_buf(t, p, sz); + g_assert(n < sz); + return p; +} + +/** + * A variant of compact_time(), formatting being done in the supplied buffer. + * + * The last figure is displayed in decimal (e.g "4d14.53h". + * + * @param t the elapsed time to format, in ms + * @param dst the destination buffer; may be NULL iff ``size'' is zero + * @param size the size of ``dst'', in bytes + * + * @return The length of the resulting string assuming ``size'' is sufficient. + */ +size_t +compact_time_ms_to_buf(long t, char *dst, size_t size) +{ + long ms = t < 0 ? -t : t; + long s = ms / 1000; + char *m = t < 0 ? "-" : ""; + size_t r; + + if (s > 86400) + r = str_bprintf(dst, size, "%s%lud%.2fh", + m, s / 86400, (s % 86400) / 3600.0); + else if (s > 3600) + r = str_bprintf(dst, size, "%s%luh%.2fm", + m, s / 3600, (s % 3600) / 60.0); + else if (s > 60) + r = str_bprintf(dst, size, "%s%lum%.2fs", + m, s / 60, (ms - 60000 * (s / 60)) / 1000.0); + else + r = str_bprintf(dst, size, "%s%.3fs", m, ms / 1000.0); + + return r; +} + +/** + * A variant of compact_time() with last figure being decimal, and up to + * the millisecond. + * + * @param t time, in ms + * + * @return time spent in seconds in a concise short readable form. + * @note The returned string is in English and ASCII encoded, and held in + * a static buffer. + */ +const char * +compact_time_ms(long t) +{ + buf_t *b = buf_private(G_STRFUNC, SIZE_FIELD_MAX); + char *p = buf_data(b); + size_t n, sz = buf_size(b); + + n = compact_time_ms_to_buf(t, p, sz); + g_assert(n < sz); + return p; } /** @@ -1028,19 +1310,19 @@ const char * short_uptime(time_delta_t uptime) { - static char bSIZE_FIELD_MAX; - guint s = MAX(uptime, 0); + str_t *p = str_private(G_STRFUNC, SIZE_FIELD_MAX); + uint s = MAX(uptime, 0); if (s > 86400) { - guint32 d = s % 86400; - gm_snprintf(b, sizeof(b), "%ud %02d%c%02d", + uint32 d = s % 86400; + str_printf(p, "%ud %02d%c%02d", s / 86400, d / 3600, (s & 0x1) ? '.' : ':', (d % 3600) / 60); } else { - guint32 h = s % 3600; - gm_snprintf(b, sizeof(b), "%02d:%02d:%02d", s / 3600, h / 60, h % 60); + uint32 h = s % 3600; + str_printf(p, "%02d:%02d:%02d", s / 3600, h / 60, h % 60); } - return b; + return str_2c(p); } size_t @@ -1048,7 +1330,7 @@ { char bufTIME_T_DEC_BUFLEN; char *p; - gboolean neg; + bool neg; g_assert(0 == size || NULL != dst); g_assert(size <= INT_MAX); @@ -1071,13 +1353,14 @@ const char * time_t_to_string(time_t v) { - static char bufTIME_T_DEC_BUFLEN; - size_t n; + buf_t *b = buf_private(G_STRFUNC, TIME_T_DEC_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - n = time_t_to_string_buf(v, buf, sizeof buf); + n = time_t_to_string_buf(v, p, sz); g_assert(n > 0); - g_assert(n < sizeof buf); - return buf; + g_assert(n < sz); + return p; } /** @@ -1096,7 +1379,7 @@ const struct tm *tm = localtime(&t); size_t len; - g_assert(size > 0); + g_assert(size > 0); len = strftime(dst, size, "%X", tm); dstlen = '\0';
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/stringify.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/stringify.h
Changed
@@ -46,7 +46,7 @@ #define IPV4_ADDR_BUFLEN (sizeof "255.255.255.255") #define IPV6_ADDR_BUFLEN \ (sizeof "0001:0203:0405:0607:0809:1011:255.255.255.255") -#define TIMESTAMP_BUF_LEN (sizeof "9999-12-31 23:59:61") +#define TIMESTAMP_BUFLEN (sizeof "9999-12-31 23:59:61") /* * How many bytes do we need to stringify an unsigned quantity in decimal @@ -71,58 +71,67 @@ /* * The following include space for NUL, too. */ -#define UINT8_DEC_BUFLEN TYPE_DEC_BUFLEN(guint8) -#define UINT16_DEC_BUFLEN TYPE_DEC_BUFLEN(guint16) -#define UINT32_DEC_BUFLEN TYPE_DEC_BUFLEN(guint32) -#define UINT64_DEC_BUFLEN TYPE_DEC_BUFLEN(guint64) +#define UINT8_DEC_BUFLEN TYPE_DEC_BUFLEN(uint8) +#define UINT16_DEC_BUFLEN TYPE_DEC_BUFLEN(uint16) +#define UINT32_DEC_BUFLEN TYPE_DEC_BUFLEN(uint32) +#define UINT64_DEC_BUFLEN TYPE_DEC_BUFLEN(uint64) #define OFF_T_DEC_BUFLEN TYPE_DEC_BUFLEN(fileoffset_t) #define TIME_T_DEC_BUFLEN TYPE_DEC_BUFLEN(time_t) #define SIZE_T_DEC_BUFLEN TYPE_DEC_BUFLEN(size_t) #define USHRT_DEC_BUFLEN TYPE_DEC_BUFLEN(unsigned short) #define UINT_DEC_BUFLEN TYPE_DEC_BUFLEN(unsigned int) #define ULONG_DEC_BUFLEN TYPE_DEC_BUFLEN(unsigned long) +#define FILESIZE_DEC_BUFLEN TYPE_DEC_BUFLEN(filesize_t) -#define UINT8_HEX_BUFLEN TYPE_HEX_BUFLEN(guint8) -#define UINT16_HEX_BUFLEN TYPE_HEX_BUFLEN(guint16) -#define UINT32_HEX_BUFLEN TYPE_HEX_BUFLEN(guint32) -#define UINT64_HEX_BUFLEN TYPE_HEX_BUFLEN(guint64) +#define INT_DEC_BUFLEN TYPE_DEC_BUFLEN(int) +#define LONG_DEC_BUFLEN TYPE_DEC_BUFLEN(long) + +#define UINT8_HEX_BUFLEN TYPE_HEX_BUFLEN(uint8) +#define UINT16_HEX_BUFLEN TYPE_HEX_BUFLEN(uint16) +#define UINT32_HEX_BUFLEN TYPE_HEX_BUFLEN(uint32) +#define UINT64_HEX_BUFLEN TYPE_HEX_BUFLEN(uint64) #define ULONG_HEX_BUFLEN TYPE_HEX_BUFLEN(unsigned long) -#define POINTER_BUFLEN TYPE_HEX_BUFLEN(unsigned long) +#define POINTER_BUFLEN (TYPE_HEX_BUFLEN(ulong) + sizeof "0x" - 1) #define HOST_ADDR_BUFLEN (MAX(IPV4_ADDR_BUFLEN, IPV6_ADDR_BUFLEN)) #define HOST_ADDR_PORT_BUFLEN (HOST_ADDR_BUFLEN + sizeof ":65535") -#define UINT16_DEC_GRP_BUFLEN GROUPPED_DEC_BUFLEN(guint16) -#define UINT32_DEC_GRP_BUFLEN GROUPPED_DEC_BUFLEN(guint32) -#define UINT64_DEC_GRP_BUFLEN GROUPPED_DEC_BUFLEN(guint64) +#define UINT16_DEC_GRP_BUFLEN GROUPPED_DEC_BUFLEN(uint16) +#define UINT32_DEC_GRP_BUFLEN GROUPPED_DEC_BUFLEN(uint32) +#define UINT64_DEC_GRP_BUFLEN GROUPPED_DEC_BUFLEN(uint64) #define OFF_T_DEC_GRP_BUFLEN GROUPPED_DEC_BUFLEN(fileoffset_t) #define TIME_T_DEC_GRP_BUFLEN GROUPPED_DEC_BUFLEN(time_t) #define SIZE_T_DEC_GRP_BUFLEN GROUPPED_DEC_BUFLEN(size_t) #define USHRT_DEC_GRP_BUFLEN GROUPPED_DEC_BUFLEN(unsigned short) #define UINT_DEC_GRP_BUFLEN GROUPPED_DEC_BUFLEN(unsigned int) #define ULONG_DEC_GRP_BUFLEN GROUPPED_DEC_BUFLEN(unsigned long) +#define FILESIZE_DEC_GRP_BUFLEN GROUPPED_DEC_BUFLEN(filesize_t) -size_t int32_to_string_buf(gint32 v, char *dst, size_t size); -size_t uint32_to_string_buf(guint32 v, char *dst, size_t size); -size_t uint64_to_string_buf(guint64 v, char *dst, size_t size); +size_t int32_to_string_buf(int32 v, char *dst, size_t size); +size_t uint32_to_string_buf(uint32 v, char *dst, size_t size); +size_t uint64_to_string_buf(uint64 v, char *dst, size_t size); size_t uint_to_string_buf(unsigned v, char *dst, size_t size); +size_t ulong_to_string_buf(unsigned long v, char *dst, size_t size); size_t fileoffset_t_to_string_buf(fileoffset_t v, char *dst, size_t size); size_t size_t_to_string_buf(size_t v, char *dst, size_t size); size_t pointer_to_string_buf(const void *ptr, char *dst, size_t size); -const char *uint32_to_string(guint32); -const char *uint64_to_string(guint64); -const char *uint64_to_string2(guint64); +const char *uint32_to_string(uint32); +const char *uint64_to_string(uint64); +const char *uint64_to_string2(uint64); +const char *uint64_to_string3(uint64); +const char *ulong_to_string(ulong v); const char *uint_to_string(unsigned v); const char *fileoffset_t_to_string(fileoffset_t); const char *size_t_to_string(size_t); const char *pointer_to_string(const void *); const char *filesize_to_string(filesize_t); const char *filesize_to_string2(filesize_t); -const char *ipv6_to_string(const guint8 *ipv6); -const char *ipv6_to_string2(const guint8 *ipv6); -size_t ipv6_to_string_buf(const guint8 *ipv6, char *dst, size_t size); +const char *filesize_to_string3(filesize_t); +const char *ipv6_to_string(const uint8 *ipv6); +const char *ipv6_to_string2(const uint8 *ipv6); +size_t ipv6_to_string_buf(const uint8 *ipv6, char *dst, size_t size); -char *hex_escape(const char *name, gboolean strict); +char *hex_escape(const char *name, bool strict); char *control_escape(const char *s); const char *lazy_string_to_printf_escape(const char *src); @@ -130,15 +139,27 @@ * Groupped by thousands integer values. */ -size_t int32_to_gstring_buf(gint32 v, char *dst, size_t size); -size_t uint32_to_gstring_buf(guint32 v, char *dst, size_t size); -size_t uint64_to_gstring_buf(guint64 v, char *dst, size_t size); +size_t int32_to_gstring_buf(int32 v, char *dst, size_t size); +size_t uint32_to_gstring_buf(uint32 v, char *dst, size_t size); +size_t uint64_to_gstring_buf(uint64 v, char *dst, size_t size); size_t uint_to_gstring_buf(unsigned v, char *dst, size_t size); +size_t ulong_to_gstring_buf(unsigned long v, char *dst, size_t size); size_t size_t_to_gstring_buf(size_t v, char *dst, size_t size); -const char *uint32_to_gstring(guint32); -const char *uint64_to_gstring(guint64); +const char *uint32_to_gstring(uint32); +const char *uint64_to_gstring(uint64); const char *uint_to_gstring(unsigned v); const char *size_t_to_gstring(size_t v); +const char *filesize_to_gstring(filesize_t v); + +/* + * Optionally groupped by thousands. + */ + +const char *uint32_to_string_grp(uint32, bool); +const char *uint64_to_string_grp(uint64, bool); +const char *uint_to_string_grp(unsigned, bool); +const char *size_t_to_string_grp(size_t, bool); +const char *filesize_to_string_grp(filesize_t, bool); /* * Time string conversions @@ -148,11 +169,51 @@ size_t compact_time_to_buf(time_delta_t t, char *dst, size_t size); const char *compact_time(time_delta_t t); const char *compact_time2(time_delta_t t); +size_t compact_time_ms_to_buf(long t, char *dst, size_t size); +const char *compact_time_ms(long t); const char *short_uptime(time_delta_t s); size_t time_locale_to_string_buf(time_t date, char *dst, size_t size); size_t time_t_to_string_buf(time_t v, char *dst, size_t size); const char *time_t_to_string(time_t); +/* + * Miscellaneous stringifications. + */ + +static inline const char * +bool_to_string(const bool v) +{ + return v ? "TRUE" : "FALSE"; +} + +/* Plural of most words */ +static inline const char * +plural(const unsigned long v) +{ + return 1 == v ? "" : "s"; +} + +/* Plural of words finishing in "y" like "entry" */ +static inline const char * +plural_y(const unsigned long v) +{ + return 1 == v ? "y" : "ies"; +} + +/* Plural of words finishing in "ch" like "match" */ +static inline const char * +plural_es(const unsigned long v) +{ + return 1 == v ? "" : "es"; +} + +/* Plural of words finishing in "f" like "leaf" */ +static inline const char * +plural_f(const unsigned long v) +{ + return 1 == v ? "f" : "ves"; +} + #endif /* _stringify_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/strtok.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/strtok.c
Changed
@@ -52,8 +52,8 @@ */ struct strtok { enum strtok_magic magic; - guint8 no_lead; /**< Whether leading spaces must be skipped */ - guint8 no_end; /**< Whether ending spaces must be skipped */ + uint8 no_lead; /**< Whether leading spaces must be skipped */ + uint8 no_end; /**< Whether ending spaces must be skipped */ const char *string; /**< Initial string to tokenize */ const char *p; /**< Parsing pointer within string */ char *token; /**< String token buffer */ @@ -78,10 +78,10 @@ * @return opaque object on which we can issue tokenizing calls. */ strtok_t * -strtok_make(const char *string, gboolean no_lead, gboolean no_end) +strtok_make(const char *string, bool no_lead, bool no_end) { strtok_t *s; - + WALLOC(s); s->magic = STRTOK_MAGIC; s->string = string; @@ -126,7 +126,7 @@ /** * Free string token parsing object. */ -void +static void strtok_free(strtok_t *s) { strtok_check(s); @@ -139,6 +139,20 @@ } /** + * Free string token parsing object and nullify its pointer. + */ +void +strtok_free_null(strtok_t **s_ptr) +{ + strtok_t *s = *s_ptr; + + if (s != NULL) { + strtok_free(s); + *s_ptr = NULL; + } +} + +/** * Reset parsing at the beginning of the string. */ void @@ -152,7 +166,7 @@ /** * Have we reached the end of the string? */ -gboolean +bool strtok_eos(const strtok_t *s) { strtok_check(s); @@ -291,14 +305,14 @@ */ static const char * strtok_next_internal(strtok_t *s, const char *delim, - gboolean no_lead, gboolean no_end, size_t *length, - const char *looked, gboolean caseless, gboolean *found) + bool no_lead, bool no_end, size_t *length, + const char *looked, bool caseless, bool *found) { size_t tlen; int c; int d_min, d_max; const char *l = NULL; - gboolean seen_non_blank = FALSE; + bool seen_non_blank = FALSE; int deferred_blank = 0; char *tstart; @@ -500,7 +514,7 @@ */ const char * strtok_next_extended(strtok_t *s, const char *delim, - gboolean no_lead, gboolean no_end) + bool no_lead, bool no_end) { return strtok_next_internal(s, delim, no_lead, no_end, NULL, NULL, FALSE, NULL); @@ -554,11 +568,11 @@ * @param delim the token delimitors * @param what the token to look for */ -gboolean +bool strtok_has(const char *string, const char *delim, const char *what) { strtok_t *st; - gboolean found = FALSE; + bool found = FALSE; st = strtok_make(string, TRUE, TRUE); @@ -583,11 +597,11 @@ * @param delim the token delimitors * @param what the token to look for, case-insensitively */ -gboolean +bool strtok_case_has(const char *string, const char *delim, const char *what) { strtok_t *st; - gboolean found = FALSE; + bool found = FALSE; st = strtok_make(string, TRUE, TRUE); @@ -606,7 +620,7 @@ /** * Tokenizer unit tests. */ -G_GNUC_COLD void +void G_COLD strtok_test(void) { const char *string = "a; b, c ; d/e"; @@ -653,7 +667,7 @@ g_assert(0 == strcmp(tk, string)); g_assert(strtok_eos(st)); - strtok_free(st); + strtok_free_null(&st); g_assert(strtok_has(string, ";,/", "d")); g_assert(strtok_has(string, ";", "b, c"));
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/strtok.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/strtok.h
Changed
@@ -40,23 +40,22 @@ typedef struct strtok strtok_t; -strtok_t *strtok_make(const char *string, - gboolean no_lead, gboolean no_end); +strtok_t *strtok_make(const char *string, bool no_lead, bool no_end); struct strtok *strtok_make_strip(const char *string); struct strtok *strtok_make_nostrip(const char *string); -void strtok_free(strtok_t *s); +void strtok_free_null(strtok_t **s); void strtok_restart(strtok_t *s); void strtok_skip(strtok_t *s, const char *delim, size_t n); const char *strtok_next(strtok_t *s, const char *delim); const char *strtok_next_extended(strtok_t *s, const char *delim, - gboolean no_lead, gboolean no_end); + bool no_lead, bool no_end); const char *strtok_next_length(strtok_t *s, const char *delim, size_t *length); -gboolean strtok_eos(const strtok_t *s); +bool strtok_eos(const strtok_t *s); const char *strtok_ptr(const strtok_t *s); char strtok_char(const strtok_t *s); char strtok_delim(const strtok_t *s); -gboolean strtok_has(const char *string, const char *delim, const char *what); -gboolean strtok_case_has(const char *str, const char *delim, const char *what); +bool strtok_has(const char *string, const char *delim, const char *what); +bool strtok_case_has(const char *str, const char *delim, const char *what); void strtok_test(void);
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/strvec.c
Added
@@ -0,0 +1,149 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Manages string vector arrays. + * + * A string vector array is an array like argv where each entry holds a + * string (NUL-terminated set of bytes) and whose last entry is identified + * by a NULL pointer. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#include "common.h" + +#include "strvec.h" + +#include "mempcpy.h" +#include "misc.h" /* For strsize() */ +#include "unsigned.h" /* For size_is_non_negative() */ + +#include "override.h" /* Must be the last header included */ + +/** + * Count amount of entries in the string vector array. + * + * @param strv the string vector array base + * + * @return the amount of entries, i.e. the number n such that NULL == strvn. + */ +size_t +strvec_count(char * const *strv) +{ + size_t i = 0; + + while (strvi != NULL) + i++; + + return i; +} + +/** + * Compute length in bytes of all the strings held in the string vector array. + * + * @param strv the string vector array base + * + * @return the total byte length of all the strings, including their NUL bytes. + */ +size_t +strvec_size(char * const *strv) +{ + size_t i = 0, bytes = 0; + + while (strvi != NULL) { + bytes += strsize(strvi); /* Include trailing NUL */ + i++; + } + + return bytes; +} + +/** + * Copy string vector array by allocating items from a supplied memory buffer + * and filling given destination vector with pointers. + * + * The dstv vector must be adequately size to be able to hold "cnt + 1" + * entries (to include the trailing NULL). + * + * Each string entry in strvi is duplicated at dstvi using memory that + * is linearily taken from the supplied memory buffer. All the strings are + * therefore contiguous in memory, separated by their trailing NUL byte. + * + * The "len" parameter initially holds the amount of space available in the + * memory buffer. Upon return, it is updated to reflect the amount of space + * remaining, to account for the allocated strings made during the duplication. + * + * @param dstv pre-allocated vector capable of holding cnt + 1 entries + * @param strv the base of the original string vector array to copy + * @param cnt the amount of entries to duplicate + * @param mem base of memory buffer where strings are to be duplicated + * @param len contains initial length of mem buffer, updated upon return + * + * @return the first free location in the memory buffer, with "len" updated, + * or NULL if we exhausted all the space without being able to fully duplicate + * the original array. + */ +void * +strvec_cpy(char **dstv, char *const *strv, size_t cnt, void *mem, size_t *len) +{ + size_t i, avail; + void *p = mem; /* Linearily increased allocation pointer */ + + g_assert(size_is_non_negative(cnt)); + g_assert(mem != NULL); + g_assert(len != NULL); + g_assert(size_is_non_negative(*len)); + + avail = *len; + + if G_UNLIKELY(0 == avail) + return NULL; + + if G_UNLIKELY(0 == cnt) + return mem; + + for (i = 0; i < cnt; i++) { + size_t n = strsize(strvi); + + if G_UNLIKELY(avail < n) { + *len -= ptr_diff(p, mem); /* Account for what we used so far */ + return NULL; /* Could not duplicate all of strv */ + } + + dstvi = p; + p = mempcpy(p, strvi, n); + avail -= n; + } + + dstvcnt = NULL; + *len -= ptr_diff(p, mem); /* Account for what we used so far */ + + return p; /* First byte in "mem" beyond last string we copied */ +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/strvec.h
Added
@@ -0,0 +1,48 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * String vector array utilities. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#ifndef _strvec_h_ +#define _strvec_h_ + +/* + * Public interface. + */ + +size_t strvec_count(char * const *strv); +size_t strvec_size(char * const *strv); +void *strvec_cpy(char **dstv, char * const *strv, size_t cnt, + void *mem, size_t *len); + +#endif /* _strvec_h_ */ + +/* vi: set ts=4: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/symbols.c
Added
@@ -0,0 +1,1518 @@ +/* + * Copyright (c) 2004, 2010, 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Symbol address / name mapping. + * + * This structure allows the construction of symbolic stack traces. + * It organizes symbols in a sorted array and allows quick mappings of + * an address to a symbol. + * + * @author Raphael Manfredi + * @date 2004, 2010, 2012 + */ + +#include "common.h" + +#include "symbols.h" + +#include "array_util.h" +#include "ascii.h" +#include "base16.h" +#include "bfd_util.h" +#include "constants.h" +#include "eslist.h" +#include "file.h" +#include "glib-missing.h" /* For g_strlcpy() */ +#include "halloc.h" +#include "htable.h" +#include "log.h" +#include "misc.h" +#include "parse.h" +#include "path.h" +#include "rwlock.h" +#include "sha1.h" +#include "spinlock.h" +#include "stacktrace.h" +#include "str.h" +#include "stringify.h" +#include "tm.h" +#include "unsigned.h" +#include "vmm.h" +#include "xmalloc.h" +#include "xsort.h" + +#include "override.h" /* Must be the last header included */ + +#define SYMBOLS_SIZE_INCREMENT 1024 /**< # of entries added on resize */ + +enum symbols_magic { SYMBOLS_MAGIC = 0x546dd788 }; + +/** + * The array of symbols. + */ +struct symbols { + enum symbols_magic magic; /**< Magic number */ + struct symbol *base; /**< Array base */ + size_t size; /**< Amount of entries allocated */ + size_t count; /**< Amount of entries held */ + size_t offset; /**< Symbol offset to apply */ + unsigned fresh:1; /**< Symbols loaded via nm parsing */ + unsigned indirect:1; /**< Symbols loaded via nm pre-computed file */ + unsigned stale:1; /**< Pre-computed nm file was stale */ + unsigned mismatch:1; /**< Symbol mismatches were identified */ + unsigned garbage:1; /**< Symbols are probably pure garbage */ + unsigned sorted:1; /**< Symbols were sorted */ + unsigned once:1; /**< Whether symbol names are "once" atoms */ + rwlock_t lock; /**< Thread-safe lock */ +}; + +static inline void +symbols_check(const struct symbols * const s) +{ + g_assert(s != NULL); + g_assert(SYMBOLS_MAGIC == s->magic); +} + +#define SYMBOLS_READ_LOCK(x) rwlock_rlock(deconstify_pointer(&(x)->lock)) +#define SYMBOLS_READ_TRYLOCK(x) rwlock_rlock_try(deconstify_pointer(&(x)->lock)) +#define SYMBOLS_READ_UNLOCK(x) rwlock_runlock(deconstify_pointer(&(x)->lock)) + +#define SYMBOLS_WRITE_LOCK(x) rwlock_wlock(&(x)->lock) +#define SYMBOLS_WRITE_UNLOCK(x) rwlock_wunlock(&(x)->lock) + +enum symbols_loadinfo_magic { SYMBOLS_LOADINFO_MAGIC = 0x4e1edc1d }; + +/** + * This structure captures the symbol loading information if it happens early + * and before symbols_set_verbose() is called. It allows us to log what + * happened after the fact. + * + * These structures are linked together to form a single list that will be + * flushed as soon as symbols_set_verbose() is called. + */ +struct symbols_loadinfo { + enum symbols_loadinfo_magic magic; + size_t count; + size_t stripped; + size_t offset; + char *path; + const char *method; + uint garbage:1; + uint mismatch:1; + double secs; + tm_t when; + slink_t list; /* Embedded list */ +}; + +static inline void +symbols_loadinfo_check(const struct symbols_loadinfo * const sli) +{ + g_assert(sli != NULL); + g_assert(SYMBOLS_LOADINFO_MAGIC == sli->magic); +} + +static const char NM_FILE = "gtk-gnutella.nm"; +static bool symbols_verbose, symbols_verbose_set; +static eslist_t symbols_loaded = + ESLIST_INIT(offsetof(struct symbols_loadinfo, list)); +static spinlock_t symbols_loaded_slk = SPINLOCK_INIT; + +#define SYMBOLS_LOADED_LOCK spinlock(&symbols_loaded_slk) +#define SYMBOLS_LOADED_UNLOCK spinunlock(&symbols_loaded_slk) + +/** + * Log symbol loading if requested. + */ +static void +symbols_log_loaded(const char *path, + const char *method, size_t count, size_t stripped, + size_t offset, bool garbage, bool mismatch, double secs, double ago) +{ + if (symbols_verbose) { + char buf20; + + buf0 = '\0'; + if (ago != 0.0) + str_bprintf(buf, sizeof buf, " %.3f secs ago", ago); + + s_info("loaded %zu symbol%s for \"%s\" via %s in %.3f secs%s", + count, plural(count), path, method, secs, buf); + + if (stripped != 0) { + s_message("stripped %zu duplicate symbol%s", + stripped, plural(stripped)); + } + if (offset != 0) { + s_message("will be offsetting symbol addresses by 0x%lx (%ld)", + (unsigned long) offset, (long) offset); + } + if (garbage) { + s_warning("loaded symbols are pure garbage"); + } else if (mismatch) { + s_warning("loaded symbols are partially inaccurate"); + } + } +} + +/** + * Record loading of symbols unless symbols_set_verbose() was called already, + * otherwise just log the information. + */ +static void +symbols_notify_loaded(const char *path, + const char *method, size_t count, size_t stripped, size_t offset, + bool garbage, bool mismatch, double secs) +{ + SYMBOLS_LOADED_LOCK; + + if (!symbols_verbose_set) { + struct symbols_loadinfo *sli; + + XMALLOC0(sli); + sli->magic = SYMBOLS_LOADINFO_MAGIC; + sli->path = xstrdup(path); + sli->method = method; + sli->count = count; + sli->stripped = stripped; + sli->offset = offset; + sli->garbage = booleanize(garbage); + sli->mismatch = booleanize(mismatch); + sli->secs = secs; + tm_now_exact(&sli->when); + + eslist_append(&symbols_loaded, sli); + + SYMBOLS_LOADED_UNLOCK; + return; + } + + SYMBOLS_LOADED_UNLOCK; + + symbols_log_loaded(path, method, count, stripped, + offset, garbage, mismatch, secs, 0.0); +} + +/** + * eslist foreach callback to log and dispose of structure. + */ +static void +symbols_loaded_process(void *data, void *udata) +{ + struct symbols_loadinfo *sli = data; + tm_t now; + + symbols_loadinfo_check(sli); + (void) udata; + + tm_now_exact(&now); + symbols_log_loaded(sli->path, sli->method, sli->count, + sli->stripped, sli->offset, sli->garbage, sli->mismatch, sli->secs, + tm_elapsed_f(&now, &sli->when)); + + XFREE_NULL(sli->path); + sli->magic = 0; + xfree(sli); +} + +/** + * Should symbol loading be verbosely notified? + */ +void +symbols_set_verbose(bool verbose) +{ + symbols_verbose = verbose; + + SYMBOLS_LOADED_LOCK; + + if (!symbols_verbose_set) { + eslist_foreach(&symbols_loaded, symbols_loaded_process, NULL); + eslist_clear(&symbols_loaded); + symbols_verbose_set = TRUE; + } + + SYMBOLS_LOADED_UNLOCK; +} + +/** + * @return amount of symbols + */ +size_t +symbols_count(const symbols_t *st) +{ + symbols_check(st); + + /* + * This routine must not take any locks, so read the symbol count after + * issuing a memory barrier: another thread could be in the process of + * loading symbols, in which case the write-lock is taken and we'd block + * getting the read lock, risking a deadlock if we already hold locks. + */ + + atomic_mb(); + return st->count; +} + +/** + * @return memory size used by symbols. + */ +size_t +symbols_memory_size(const symbols_t *st) +{ + size_t mem; + + symbols_check(st); + + SYMBOLS_READ_LOCK(st); + mem = st->size * sizeof st->base0; + SYMBOLS_READ_UNLOCK(st); + + return mem; +} + +/** + * Mark symbols as being stale. + */ +void +symbols_mark_stale(symbols_t *st) +{ + symbols_check(st); + + SYMBOLS_WRITE_LOCK(st); + st->stale = TRUE; + SYMBOLS_WRITE_UNLOCK(st); +} + +/** + * Allocate a new table capable of holding the specified amount of entries. + * + * @param capacity the projected size of the table (0 if unknown) + * @param once if TRUE, symbol names will be allocated via omalloc() + * + * @return new symbol table. + */ +symbols_t * +symbols_make(size_t capacity, bool once) +{ + symbols_t *s; + size_t len; + + g_assert(size_is_non_negative(capacity)); + + s = xmalloc0(sizeof *s); + s->magic = SYMBOLS_MAGIC; + s->once = booleanize(once); + s->size = capacity; + rwlock_init(&s->lock); + + len = capacity * sizeof s->base0; + + if (len != 0) + s->base = once ? vmm_alloc_not_leaking(len) : vmm_alloc(len); + + return s; +} + +/** + * Free symbol table. + */ +static void +symbols_free(symbols_t *st) +{ + symbols_check(st); + + vmm_free(st->base, st->size * sizeof st->base0); + rwlock_destroy(&st->lock); + st->magic = 0; + xfree(st); +} + +/** + * Free symbol table and nullify its pointer. + */ +void +symbols_free_null(symbols_t **st_ptr) +{ + symbols_t *st = *st_ptr; + + if (st != NULL) { + symbols_free(st); + *st_ptr = NULL; + } +} + +/** + * Normalize the symbol name. + * + * @param name the origin name as reported by "nm" or similar means + * @param atom whether to create an atom + * + * @return atom string for the trace name (never freed) or a plain copy which + * will need to be freed via xfree(). + */ +static const char * +symbols_normalize(const char *name, bool atom) +{ + const char *result; + const char *dot; + char *tmp = NULL; + + /* + * On Windows and OS X, there is an obnoxious '_' prepended to all + * routine names. + */ + + if ('_' == name0) + name++; + + /* + * gcc sometimes appends '.part' or other suffix to routine names. + */ + + dot = strchr(name, '.'); + tmp = NULL == dot ? deconstify_char(name) : xstrndup(name, dot - name); + + /* + * On Windows, since the C calling convention used does not allow + * variable-length argument lists, the linker appends '@n' to the name + * where 'n' is the number of parameters expected. This prevents a + * routine from being called with the wrong number of arguments, since + * the stack would be irremediably messed up if that happened. If some + * code attempts to call the routine with the wrong number of arguments, + * the linker will report a name mismatch, preventing havoc. + * + * For symbol tracing purposes, the '@n' is just noise, so we remove it. + * on the fly. + */ + + if (is_running_on_mingw() && tmp == name) { + dot = strchr(name, '@'); + tmp = NULL == dot ? deconstify_char(name) : xstrndup(name, dot - name); + } + + if (atom) { + result = constant_str(tmp); + if (tmp != name) + xfree(tmp); + } else { + result = tmp == name ? xstrdup(name) : tmp; + } + + return result; +} + +/** + * Append a new symbol to the table. + * + * @attention + * This routine MUST be called with the symbol table write-locked + * + * @param st the symbol table + * @param addr the address of the symbol + * @param name the name of the symbol + */ +void +symbols_append(symbols_t *st, const void *addr, const char *name) +{ + struct symbol *s; + + symbols_check(st); + g_assert(name != NULL); + g_assert(rwlock_is_owned(&st->lock)); + + if (st->count >= st->size) { + size_t osize, nsize; + + osize = st->size * sizeof st->base0; + st->size += SYMBOLS_SIZE_INCREMENT; + nsize = st->size * sizeof st->base0; + + if (0 == osize) { + st->base = st->once ? + vmm_alloc_not_leaking(nsize) : vmm_alloc(nsize); + } else { + st->base = st->once ? + vmm_resize_not_leaking(st->base, osize, nsize) : + vmm_resize(st->base, osize, nsize); + } + } + + s = &st->basest->count++; + s->addr = addr; + s->name = symbols_normalize(name, st->once); + st->sorted = FALSE; +} + +/** + * Compare two symbol entries -- qsort() callback. + */ +static int +symbol_cmp(const void *p, const void *q) +{ + struct symbol const *a = p; + struct symbol const *b = q; + + return ptr_cmp(a->addr, b->addr); +} + +/** + * Remove duplicate entry in trace array at the specified index. + */ +static void +symbols_remove(symbols_t *st, size_t i) +{ + symbols_check(st); + g_assert(size_is_non_negative(i)); + g_assert(rwlock_is_owned(&st->lock)); + + if (!st->once) + xfree(deconstify_pointer(st->basei.name)); + + ARRAY_REMOVE_DEC(st->base, i, st->count); +} + +/** + * Sort trace array, remove duplicate entries. + * + * @return amount of stripped duplicates. + */ +size_t +symbols_sort(symbols_t *st) +{ + size_t i = 0; + size_t ocount; + const void *last = NULL; + size_t osize, nsize; + + symbols_check(st); + + SYMBOLS_WRITE_LOCK(st); + + ocount = st->count; + + if G_UNLIKELY(st->sorted || 0 == st->count) + goto done; + + xqsort(st->base, st->count, sizeof st->base0, symbol_cmp); + + while (i < st->count) { + struct symbol *s = &st->basei; + if (last != NULL && s->addr == last) { + symbols_remove(st, i); + } else { + last = s->addr; + i++; + } + } + + /* + * Resize or free arena depending on how many symbols we have left. + */ + + osize = st->size * sizeof st->base0; + nsize = st->count * sizeof st->base0; + + if (nsize != 0) { + st->base = st->once ? + vmm_resize_not_leaking(st->base, osize, nsize) : + vmm_resize(st->base, osize, nsize); + } else { + vmm_free(st->base, osize); + st->base = NULL; + } + + st->size = st->count; + st->sorted = TRUE; + +done: + ocount -= st->count; + SYMBOLS_WRITE_UNLOCK(st); + + return ocount; +} + +/** + * Lookup symbol structure encompassing given address. + * + * @return symbol structure if found, NULL otherwise. + */ +static struct symbol * +symbols_lookup(const symbols_t *st, const void *addr) +{ + struct symbol *low, *high, *mid; + const void *laddr; + + symbols_check(st); + + if G_UNLIKELY(0 == st->count) + return NULL; + + low = st->base, + high = &st->basest->count - 1, + + laddr = const_ptr_add_offset(addr, st->offset); + + while (low <= high) { + mid = low + (high - low) / 2; + if (laddr >= mid->addr && (mid == high || laddr < (mid+1)->addr)) + return mid; + else if (laddr < mid->addr) + high = mid - 1; /* -1 OK, since pointers cannot reach page 0 */ + else + low = mid + 1; + } + + return NULL; /* Not found */ +} + +/** + * Find symbol, avoiding the last entry (supposed to be the end) and + * ignoring garbage / stale symbol tables. + * + * @attention + * This routine must be called with the symbols read-locked at least. + * + * @param st the symbol table + * @param pc the PC within the routine + * + * @return symbol structure if found, NULL otherwise. + */ +static struct symbol * +symbols_find(const symbols_t *st, const void *pc) +{ + struct symbol *s; + + symbols_check(st); + + if G_UNLIKELY(!st->sorted || 0 == st->count) + return NULL; + + if G_UNLIKELY(st->garbage || st->mismatch || st->stale) + return NULL; + + s = symbols_lookup(st, pc); + + if (NULL == s || &st->basest->count - 1 == s) + return NULL; + + return s; +} + +/** + * Format pointer into specified buffer. + * + * This is equivalent to saying: + * + * gm_snprintf(buf, buflen, "0x%lx", pointer_to_ulong(pc)); + * + * but is safe to use in a signal handler. + */ +static void +symbols_fmt_pointer(char *buf, size_t buflen, const void *p) +{ + if (buflen < 4) { + buf0 = '\0'; + return; + } + + pointer_to_string_buf(p, buf, buflen); +} + +/** + * Format "name+offset" into specified buffer. + * + * This is equivalent to saying: + * + * gm_snprintf(buf, buflen, "%s+%u", name, offset); + * + * but is safe to use in a signal handler. + */ +static void +symbols_fmt_name(char *buf, size_t buflen, const char *name, size_t offset) +{ + size_t namelen; + + namelen = g_strlcpy(buf, name, buflen); + if (namelen >= buflen - 2) + return; + + if (offset != 0) { + bufnamelen = '+'; + size_t_to_string_buf(offset, &bufnamelen+1, buflen - (namelen + 1)); + } +} + +/* + * Attempt to transform a PC (Program Counter) address into a symbolic name, + * showing the function name and the offset within that routine. + * + * When the symbols are probable garbage, the name has a leading '?', and + * the hexadecimal address follows the name between parenthesis. + * + * When the symbols may be inaccurate, the name has a leading '!'. + * + * When the symbols were loaded from a stale source, the name has a leading '~'. + * + * The way formatting is done allows this routine to be used from a + * signal handler. + * + * @param st the symbol table (may be NULL) + * @param pc the PC to translate into symbolic form + * @param offset whether decimal offset should be added, in symbolic form. + * + * @return symbolic name for given pc offset, if found, otherwise + * the hexadecimal value. + */ +const char * +symbols_name(const symbols_t *st, const void *pc, bool offset) +{ + static char bufTHREAD_MAX128; + static char emergency128; + unsigned stid = thread_safe_small_id(); + char *b; + + STATIC_ASSERT(sizeof buf0 == sizeof emergency); + + b = stid >= THREAD_MAX ? emergency : &bufstid0; + + if G_UNLIKELY(NULL == st) { + symbols_fmt_pointer(b, sizeof buf0, pc); + return b; + } + + symbols_check(st); + + if (!SYMBOLS_READ_TRYLOCK(st)) { + symbols_fmt_pointer(b, sizeof buf0, pc); + } else if G_UNLIKELY(!st->sorted || 0 == st->count) { + symbols_fmt_pointer(b, sizeof buf0, pc); + } else { + struct symbol *s; + + s = symbols_lookup(st, pc); + + if (NULL == s || &st->basest->count - 1 == s) { + symbols_fmt_pointer(b, sizeof buf0, pc); + } else { + size_t off = 0; + const void *addr = const_ptr_add_offset(pc, st->offset); + + if (st->garbage) { + b0 = '?'; + off = 1; + } else if (st->mismatch) { + b0 = '!'; + off = 1; + } else if (st->stale) { + b0 = '~'; + off = 1; + } + + symbols_fmt_name(&boff, sizeof buf0 - off, s->name, + offset ? ptr_diff(addr, s->addr) : 0); + + /* + * If symbols are garbage, add the hexadecimal pointer to the + * name so that we have a little chance of figuring out what + * the routine was. + */ + + if (st->garbage) { + char ptrPOINTER_BUFLEN + CONST_STRLEN(" ()"); + + g_strlcpy(ptr, " (", sizeof ptr); + pointer_to_string_buf(pc, &ptr2, sizeof ptr - 2); + clamp_strcat(ptr, sizeof ptr, ")"); + clamp_strcat(b, sizeof buf0, ptr); + } + } + } + + SYMBOLS_READ_UNLOCK(st); + + return b; +} + +/** + * Compute starting address of routine. + * + * @param st the symbol table (may be NULL) + * @param pc the PC within the routine + * + * @return start of the routine, NULL if we cannot find it. + */ +const void * +symbols_addr(const symbols_t *st, const void *pc) +{ + struct symbol *s; + const void *p; + + if G_UNLIKELY(NULL == st) + return NULL; + + symbols_check(st); + + if (!SYMBOLS_READ_TRYLOCK(st)) + return NULL; /* Avoid deadlocks if symbols still being loaded */ + + s = symbols_find(st, pc); + p = NULL == s ? NULL : const_ptr_add_offset(s->addr, st->offset); + + SYMBOLS_READ_UNLOCK(st); + + return p; +} + +/* + * Lookup name of routine. + * + * @param st the symbol table + * @param pc the PC to translate into symbolic form + * @param offset whether decimal offset should be added, if non-zero + * + * @return symbolic name for given pc offset, if found, NULL otherwise. + */ +const char * +symbols_name_only(const symbols_t *st, const void *pc, bool offset) +{ + static char bufTHREAD_MAX128; + static char emergency128; + unsigned stid = thread_safe_small_id(); + char *b; + struct symbol *s; + const void *addr; + const char *name = NULL; + + STATIC_ASSERT(sizeof buf0 == sizeof emergency); + + b = stid >= THREAD_MAX ? emergency : &bufstid0; + + symbols_check(st); + + if (!SYMBOLS_READ_TRYLOCK(st)) + return NULL; /* Avoid deadlocks if symbols still being loaded */ + + s = symbols_find(st, pc); + + if (NULL == s) + goto done; + + if (0 == offset) { + name = s->name; + } else { + name = b; + addr = const_ptr_add_offset(pc, st->offset); + symbols_fmt_name(b, sizeof buf0, s->name, ptr_diff(addr, s->addr)); + } + +done: + SYMBOLS_READ_UNLOCK(st); + + return name; +} + +/** + * Construct a hash table that maps back a symbol name to its address. + * + * The returned hash table can be freed up via htable_free_null(). + * + * @return new hash table mapping a symbol name to its address. + */ +static htable_t * +symbols_by_name(const symbols_t *st) +{ + htable_t *ht; + size_t i; + + symbols_check(st); + + ht = htable_create(HASH_KEY_STRING, 0); + + for (i = 0; i < st->count; i++) { + struct symbol *s = &st->basei; + htable_insert_const(ht, s->name, s->addr); + } + + return ht; +} + +#define FN(x) \ + { (func_ptr_t) x, STRINGIFY(x) } + +/** + * Known symbols that we want to check. + */ +static struct { + func_ptr_t fn; /**< Function address */ + const char *name; /**< Function name */ +} symbols_known = { + FN(constant_str), + FN(halloc_init), + FN(htable_create), + FN(is_strprefix), + FN(log_abort), + FN(make_pathname), + FN(parse_pointer), + FN(pointer_to_string_buf), + FN(s_info), + FN(short_size), + FN(str_bprintf), + FN(symbols_sort), + FN(vmm_init), + FN(xmalloc_is_malloc), + FN(xsort), + + /* Above line intentionally left black for vi sorting */ +}; + +#undef FN + +/** + * Check whether symbols that need to be defined in the program (either because + * they are well-known like main() or used within this file) are consistent + * with the symbols we loaded. + * + * Sets ``mismatch'' if we find at least 1 mismatch. + * Sets ``garbage'' if we find more than half mismatches. + */ +static void +symbols_check_consistency(symbols_t *st) +{ + size_t matching = 0; + size_t mismatches; + size_t i; + size_t offset = 0; + htable_t *sym_pc; + const void *main_pc; + const char routine = "symbols_load_from"; + + /* + * Reset the values we're computing since we can be called multiple + * times when we try to load symbols from multiple sources. + */ + + st->garbage = FALSE; + st->offset = 0; + st->mismatch = FALSE; + + if (0 == st->count) + return; + + /* + * On some systems, symbols are not mapped at absolute addresses but + * are relocated. + * + * To detect this: we locate the address of our probing routines and + * compare them with what we loaded from the symbols. Of course, + * offsetting will only be working when the offset is the same for all + * the symbols. + */ + + sym_pc = symbols_by_name(st); + + /* + * Compute the initial offset for symbols_load_from(). + */ + + main_pc = htable_lookup(sym_pc, routine); + + if (NULL == main_pc) { + s_warning("cannot find %s() in the loaded symbols", routine); + st->garbage = TRUE; + goto done; + } + + offset = ptr_diff(main_pc, func_to_pointer(symbols_load_from)); + + /* + * Make sure the offset is constant among all our probed symbols. + */ + + for (i = 0; i < N_ITEMS(symbols_known); i++) { + const char *name = symbols_knowni.name; + const void *pc = cast_func_to_pointer(symbols_knowni.fn); + const void *loaded_pc = htable_lookup(sym_pc, name); + size_t loaded_offset; + + if (NULL == loaded_pc) { + s_warning("cannot find %s() in the loaded symbols", name); + st->garbage = TRUE; + goto done; + } + + loaded_offset = ptr_diff(loaded_pc, pc); + + if (loaded_offset != offset) { + s_warning("will not offset symbol addresses (loaded garbage?)"); + offset = 0; + break; + } + } + + st->offset = offset; + + /* + * Now verify whether we can match symbols. + */ + + for (i = 0; i < N_ITEMS(symbols_known); i++) { + struct symbol *s; + const void *pc = cast_func_to_pointer(symbols_knowni.fn); + + s = symbols_lookup(st, pc); + + if (s != NULL) { + const char *name = symbols_knowni.name; + if (0 == strcmp(name, s->name)) + matching++; + } + } + + g_assert(size_is_non_negative(matching)); + g_assert(matching <= N_ITEMS(symbols_known)); + + mismatches = N_ITEMS(symbols_known) - matching; + + if (mismatches != 0) { + if (mismatches >= N_ITEMS(symbols_known) / 2) { + st->garbage = TRUE; + } else { + st->mismatch = TRUE; + } + } + + /* + * Note that our algorithm cannot find any mismatch if we successfully + * computed a valid offset above since by construction this means we were + * able to find a common offset between the loaded symbol addresses and + * the actual ones, meaning the lookup algorithm of trace_lookup() will + * find the proper symbols. + */ + + g_soft_assert_log(0 == offset || 0 == mismatches, + "offset=%zu, mismatches=%zu", offset, mismatches); + +done: + htable_free_null(&sym_pc); +} + +/** + * Parse the nm output line, recording symbol mapping for function entries. + * + * We're looking for lines like: + * + * 082bec77 T zget + * 082be9d3 t zn_create + * + * We skip symbols starting with a ".", since this is not a valid C identifier + * but rather an internal linker symbol (such as ".text"). + */ +static void +symbols_parse_nm(symbols_t *st, char *line) +{ + int error; + const char *ep; + char *p = line; + const void *addr; + + addr = parse_pointer(p, &ep, &error); + if (error || NULL == addr) + return; + + p = skip_ascii_blanks(ep); + + if ('t' == ascii_tolower(*p)) { + p = skip_ascii_blanks(&p1); + + /* + * Pseudo-symbols such as ".text" can have the same address as a + * real symbol and could be the ones actually being kept when we + * strip duplicates. Hence make sure these pseudo-symbols are skipped. + */ + + if ('.' != *p) { + strchomp(p, 0); + symbols_append(st, addr, p); + } + } +} + +/** + * Computes the SHA1 of the specified file. + * + * @param file the file for which we want to compute the SHA1 + * @param digest where the digest is written + * + * @return TRUE if we successfully compute the SHA1. + */ +static bool +symbols_sha1(const char *file, struct sha1 *digest) +{ + int fd; + SHA1_context ctx; + + fd = file_open(file, O_RDONLY, 0); + if (-1 == fd) + return FALSE; + + SHA1_reset(&ctx); + + for (;;) { + char buf512; + int r; + + r = read(fd, buf, sizeof buf); + + if (-1 == r) { + close(fd); + return FALSE; + } + + SHA1_input(&ctx, buf, r); + + if (r != sizeof buf) + break; + } + + close(fd); + SHA1_result(&ctx, digest); + + return TRUE; +} + +/** + * Read line (or up to "size - 1" characters) from the file into the buffer. + * + * The line is NUL-terminated. + * + * @param f the file we're reading from + * @param buf the buffer where we're storing the line + * @param size the size of the buffer + * + * @return TRUE if we read the whole line, FALSE if we did not reach the end + * of the line before reaching the end of the buffer. + */ +static bool +symbols_read_line(FILE *f, char *buf, size_t size) +{ + size_t len = 0; + + while (len < size) { + int c = getc(f); + if (EOF == c) + return FALSE; + if ('\n' == c) + break; + buflen++ = c; + } + + if (len < size) { + buflen = '\0'; + return TRUE; + } + + return FALSE; +} + +/** + * Parse NM header from file and fill in nm with the two SHA1 header lines + * we find (one for the executable's SHA1, one for the stripped version). + * + * @param f opened file where we expect to read the NM HTTP-like header + * @param nm array where read SHA1s are stored. + * + * @return TRUE if we successfully parsed the header and found the two SHA1, + * FALSE otherwise. + * If successful, the file's read pointer is left after the header. + */ +static bool +symbols_extract_sha1(FILE *f, struct sha1 nm2) +{ + char line512; + int i = 0; + + if (!symbols_read_line(f, line, sizeof line)) + return FALSE; + + /* + * Our NM header, if present, starts with "NM/1.0". + */ + + if (0 != strcmp(line, "NM/1.0")) + return FALSE; /* Not a valid NM header */ + + /* + * Minimal parsing of the header, looking for SHA1: lines only. + * + * We strive to use a little resources as possible, since this code + * can run during assertion failures. + * + * We expect exactly two SHA1 lines, each bearing an hexadecimal + * representataion of a SHA1. One of the SHA1 is for the executable, + * the other is for the stripped executable, the order being unspecified. + * + * Embedding the NM header at the top of the pre-computed nm output allows + * to safely detect whether the symbols match the executable, without + * having to compare timestamps. + * --RAM, 2013-10-03 + */ + + while (symbols_read_line(f, line, sizeof line)) { + char *p; + + if ('\0' == line0) /* Reached end of header */ + return 2 == i; /* OK if we read the two SHA1 */ + + if (!is_ascii_alnum(line0)) + return FALSE; /* HTTP header starts with letter/digit */ + + p = is_strcaseprefix(line, "SHA1"); + + if (NULL == p) { + if (NULL == strchr(line, ':')) + return FALSE; /* Not an HTTP header */ + continue; + } + + /* Found a SHA1: header line */ + + p = skip_ascii_spaces(p); + if (*p != ':') + return FALSE; + + p = skip_ascii_spaces(p + 1); + + /* Decode the hexadecimal representation of the SHA1 */ + + if (i >= 2) + return FALSE; + + if ( + SHA1_RAW_SIZE != + base16_decode(&nmi++, SHA1_RAW_SIZE, p, strlen(p)) + ) + return FALSE; + } + + return FALSE; +} + +/** + * Parse NM header of opened file to check whether it contains symbols for + * the specified executable. + * + * We exepect an "NM" HTTP-like header with "SHA1:" lines stating the + * hexadecimal SHA1 of the executable and that of its stripped version. + * + * @param f opened symbol file + * @param exe the executable path + * + * @return TRUE if the executable matches the advertised SHA1, FALSE otherwise. + * When we return TRUE, the file's read buffer is positionned right after the + * end of the header, in order to hide the header from the processing logic + * that will follow. + */ +static bool +symbols_header_check(FILE *f, const char *exe) +{ + struct sha1 digest; + struct sha1 nm2; + + if (!symbols_sha1(exe, &digest)) + return FALSE; + + if (!symbols_extract_sha1(f, nm)) + return FALSE; + + if (0 != sha1_cmp(&digest, &nm0) && 0 != sha1_cmp(&digest, &nm1)) + return FALSE; + + return TRUE; +} + +/** + * Open specified file containing code symbols. + * + * @param exe the executable path, to assess freshness of nm file + * @param nm the path to the nm file, symbols from the executable + * + * @return opened file if successful, NULL on error with the error already + * logged appropriately. + */ +static FILE * +symbols_open(symbols_t *st, const char *exe, const char *nm) +{ + FILE *f; + + st->stale = FALSE; + + f = fopen(nm, "r"); + + if (NULL == f) { + s_warning("can't open \"%s\": %m", nm); + } else { + if (!symbols_header_check(f, exe)) { + s_warning("file \"%s\" not holding symbols for \"%s\"", nm, exe); + fclose(f); + f = NULL; + } + } + + /* + * If the file is still opened, the first unread character is the + * one after the NM header. + */ + + return f; +} + +/** + * Load symbols from the executable we're running. + * + * Symbols are loaded even if the executable is not "fresh" or if the + * "gtk-gnutella.nm" file is older than the executable. The rationale is + * that it is better to have some symbols than none, in the hope that the + * ones we list will be roughly correct. + * + * In any case, stale or un-fresh symbols will be clearly marked in the + * stack traces we emit, so that there cannot be any doubt later one when + * we analyze stacks and they seem inconsistent or impossible. The only + * limitation is that we cannot know which symbols are correct, so all symbols + * will be flagged as doubtful when we detect the slightest inconsistency. + * + * @param st the symbol table into which symbols should be loaded + * @param exe the executable file + * @param lpath the executable name for logging purposes only + */ +void G_COLD +symbols_load_from(symbols_t *st, const char *exe, const char *lpath) +{ + char tmpMAX_PATH_LEN + 80; + FILE *f; + bool retried = FALSE; + bool has_bfd = FALSE; + size_t stripped; + const char *method = "nothing"; + tm_t start, end; + + symbols_check(st); + + /* + * We're going to need some of the parsing routines like alnum2int(), + * hence make sure they are initialized since these do not auto-init + * for performance reasons. + */ + + misc_init(); + tm_now_exact(&start); + + SYMBOLS_WRITE_LOCK(st); + + /* + * If we are compiled with the BFD library, try to load symbols directly + * from the executable. + */ + + has_bfd = bfd_util_load_text_symbols(st, exe); + + if (has_bfd && 0 != st->count) { + method = "the BFD library"; + goto done; + } + + /* + * Maybe we don't have the BFD library, or the executable was stripped. + * + * On Windows we'll try to open the companion file containing the computed + * "nm output" at build time. + * + * On UNIX we attempt to launch "nm -p" on the executable before falling + * back to the computed "nm output". + */ + +#ifdef MINGW32 + /* + * Open the "gtk-gnutella.nm" file nearby the executable. + */ + + { + const char *nm; + + nm = mingw_filename_nearby(NM_FILE); + f = symbols_open(st, exe, nm); + + if (NULL == f) + goto done; + + st->indirect = TRUE; + method = "pre-computed nm output"; + } +#else /* !MINGW32 */ + /* + * Launch "nm -p" on our executable to grab the symbols. + */ + + if (!has_bfd) { + size_t rw; + const char meta = "$&`;()<>|"; + const char *p = exe; + int c; + + /* + * Make sure there are no problematic shell meta-characters in the path. + */ + + while ((c = *p++)) { + if (strchr(meta, c)) { + s_warning("found shell meta-character '%c' in path \"%s\", " + "not loading symbols", c, exe); + goto use_pre_computed; + } + } + + rw = str_bprintf(tmp, sizeof tmp, "nm -p %s", exe); + if (rw != strlen(exe) + CONST_STRLEN("nm -p ")) { + s_warning("full path \"%s\" too long, cannot load symbols", exe); + goto use_pre_computed; + } + + f = popen(tmp, "r"); + + if (NULL == f) { + s_warning("can't run \"%s\": %m", tmp); + goto use_pre_computed; + } + + st->fresh = !st->stale; + method = "nm output parsing"; + } else { + goto use_pre_computed; + } +#endif /* MINGW32 */ + +retry: + while (fgets(tmp, sizeof tmp, f)) { + symbols_parse_nm(st, tmp); + } + + if (retried || is_running_on_mingw()) + fclose(f); + else + pclose(f); + + /* + * If we did not load any symbol, maybe the executable was stripped? + * Try to open the symbols from the installed nm file. + */ + +use_pre_computed: + + if (!retried && (0 == st->count || st->garbage)) { + char *nm = make_pathname(ARCHLIB_EXP, NM_FILE); + + s_warning("%s, trying with pre-computed \"%s\"", + 0 == st->count ? "no symbols loaded" : "garbage symbols", nm); + + st->fresh = FALSE; + f = symbols_open(st, exe, nm); + retried = TRUE; + HFREE_NULL(nm); + + if (f != NULL) { + st->indirect = TRUE; + method = "pre-computed nm output"; + goto retry; + } + + if (st->garbage) + return; /* Already went through the "done" part */ + + /* FALL THROUGH */ + } + +done: + stripped = symbols_sort(st); + tm_now_exact(&end); + + symbols_check_consistency(st); + + symbols_notify_loaded(lpath, method, st->count, stripped, + st->offset, st->garbage, st->mismatch, + tm_elapsed_f(&end, &start)); + + /* + * If symbols are garbage, retry with pre-computed symbol file. + * + * This usually happens when the executable has been stripped at + * installation time but the BFD library still manages to find a + * few symbols. + */ + + if (!retried && !st->indirect && st->garbage) + goto use_pre_computed; + + SYMBOLS_WRITE_UNLOCK(st); +} + +/** + * Return self-assessed symbol quality. + */ +enum stacktrace_sym_quality +symbols_quality(const symbols_t *st) +{ + symbols_check(st); + + if (st->garbage) + return STACKTRACE_SYM_GARBAGE; + else if (st->mismatch) + return STACKTRACE_SYM_MISMATCH; + else if (st->stale) + return STACKTRACE_SYM_STALE; + else + return STACKTRACE_SYM_GOOD; +} + +/** + * Write-lock symbols. + */ +void +symbols_lock(symbols_t *st) +{ + symbols_check(st); + SYMBOLS_WRITE_LOCK(st); +} + +/** + * Write-unlock symbols. + */ +void +symbols_unlock(symbols_t *st) +{ + symbols_check(st); + SYMBOLS_WRITE_UNLOCK(st); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/symbols.h
Added
@@ -0,0 +1,71 @@ +/* + * Copyright (c) 2004, 2010, 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Symbol address / name mapping. + * + * @author Raphael Manfredi + * @date 2004, 2010, 2012 + */ + +#ifndef _symbols_h_ +#define _symbols_h_ + +/** + * An entry in the symbol table. + */ +struct symbol { + const void *addr; /**< Symbol address */ + const char *name; /**< Symbol name */ +}; + +struct symbols; +typedef struct symbols symbols_t; + +/* + * Public interface. + */ + +void symbols_set_verbose(bool verbose); +symbols_t *symbols_make(size_t capacity, bool once); +void symbols_free_null(symbols_t **st_ptr); +const char *symbols_name(const symbols_t *st, const void *pc, bool offset); +const char *symbols_name_only(const symbols_t *st, const void *pc, bool offset); +const void *symbols_addr(const symbols_t *st, const void *pc); +void symbols_load_from(symbols_t *st, const char *path, const char *lpath); +enum stacktrace_sym_quality symbols_quality(const symbols_t *st); +size_t symbols_count(const symbols_t *st); +void symbols_mark_stale(symbols_t *st); +size_t symbols_memory_size(const symbols_t *st); +size_t symbols_sort(symbols_t *st); +void symbols_append(symbols_t *st, const void *addr, const char *name); + +void symbols_lock(symbols_t *st); +void symbols_unlock(symbols_t *st); + +#endif /* _symbols_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/symtab.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/symtab.c
Changed
@@ -47,10 +47,12 @@ #include "common.h" #include "symtab.h" -#include "glib-missing.h" + #include "nv.h" +#include "pslist.h" #include "unsigned.h" #include "walloc.h" + #include "override.h" /* Must be the last header included */ enum symtab_magic { SYMTAB_MAGIC = 0x3e264d27U }; @@ -80,7 +82,7 @@ */ struct symtab_value { enum symtab_value_magic magic; - GSList *symbols; /**< List of symbol_entry */ + pslist_t *symbols; /**< List of symbol_entry */ }; static inline void @@ -159,14 +161,14 @@ static void symtab_value_free(struct symtab_value *sv) { - GSList *sl; + pslist_t *sl; symtab_value_check(sv); - GM_SLIST_FOREACH(sv->symbols, sl) { + PSLIST_FOREACH(sv->symbols, sl) { symbol_entry_free(sl->data); } - gm_slist_free_null(&sv->symbols); + pslist_free_null(&sv->symbols); sv->magic = 0; WFREE(sv); } @@ -189,7 +191,7 @@ /** * nv_table_t iterator to free values from the symbol table. */ -static gboolean +static bool symtab_free_nv(nv_pair_t *nv, void *data) { struct symtab_value *sv; @@ -271,7 +273,7 @@ /** * nv_table_t iterator to remove out-of-scope symbols from the symbol table. */ -static gboolean +static bool symtab_leave_nv(nv_pair_t *nv, void *data) { struct symtab_value *sv; @@ -292,7 +294,7 @@ if (se->depth < ctx->depth) break; - sv->symbols = g_slist_remove(sv->symbols, se); + sv->symbols = pslist_remove(sv->symbols, se); symbol_entry_free(se); } @@ -332,13 +334,13 @@ * * @return whether symbol was inserted (FALSE indicating a duplicate). */ -gboolean +bool symtab_insert_pair(symtab_t *syt, nv_pair_t *symbol, unsigned depth) { nv_pair_t *nv; struct symbol_entry *se; struct symtab_value *sv; - gboolean existed = FALSE; + bool existed = FALSE; const char *name; symtab_check(syt); @@ -388,7 +390,7 @@ * Inner-depth symbol inserted at the head of the list. */ - sv->symbols = g_slist_prepend(sv->symbols, se); + sv->symbols = pslist_prepend(sv->symbols, se); if (!existed) nv_table_insert_pair(syt->table, nv); @@ -410,7 +412,7 @@ * * @return whether symbol was inserted (FALSE indicating a duplicate). */ -gboolean +bool symtab_insert(symtab_t *syt, const char *name, void *value, size_t len, unsigned depth) {
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/symtab.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/symtab.h
Changed
@@ -49,8 +49,8 @@ void symtab_free(symtab_t *syt); void symtab_free_null(symtab_t **syt_ptr); void *symtab_lookup(const symtab_t *syt, const char *name); -gboolean symtab_insert_pair(symtab_t *syt, nv_pair_t *symbol, unsigned depth); -gboolean symtab_insert(symtab_t *syt, +bool symtab_insert_pair(symtab_t *syt, nv_pair_t *symbol, unsigned depth); +bool symtab_insert(symtab_t *syt, const char *name, void *value, size_t len, unsigned depth); void symtab_leave(symtab_t *syt, unsigned depth);
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/tea.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/tea.c
Changed
@@ -45,30 +45,29 @@ #define TEA_ROUNDS 32 #define TEA_CONSTANT 0x9e3779b9 /* A key schedule constant */ -#define TEA_BLOCK_SIZE 8 /** * A TEA cipher block is 64-bit wide. */ typedef struct tea_block { - guchar vTEA_BLOCK_SIZE; + uchar vTEA_BLOCK_SIZE; } tea_block_t; /** * Squeeze buffer to a 32-bit value. * Buffer length must be a multiple of 4. */ -guint32 -tea_squeeze(gpointer buf, size_t len) +uint32 +tea_squeeze(void *buf, size_t len) { char *p; size_t remain; - guint32 result = 0; + uint32 result = 0; g_assert(0 == (len & 0x03)); /* multiple of 4 bytes */ for (remain = len, p = buf; remain >= 4; remain -= 4, p += 4) { - guint32 val; + uint32 val; val = peek_le32(p); result ^= val; @@ -86,13 +85,13 @@ * @param key the encryption key * @param value the value to encrypt */ -static G_GNUC_HOT void +static void G_HOT t_encrypt(tea_block_t *res, const tea_key_t *key, const tea_block_t *value) { - guint32 v0, v1, sum = 0; + uint32 v0, v1, sum = 0; int i; - guint32 delta = TEA_CONSTANT; - guint32 k0, k1, k2, k3; /* cache key */ + uint32 delta = TEA_CONSTANT; + uint32 k0, k1, k2, k3; /* cache key */ v0 = peek_le32(&value->v0); v1 = peek_le32(&value->v4); @@ -101,16 +100,22 @@ k2 = peek_le32(&key->v8); k3 = peek_le32(&key->v12); - for (i = 0; i < TEA_ROUNDS; i++) { - sum += delta; - v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1); - v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3); +#define TEA_ROUND_ESTEP \ + sum += delta; \ + v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1); \ + v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3); + + for (i = 0; i < TEA_ROUNDS / 4; i++) { + TEA_ROUND_ESTEP; + TEA_ROUND_ESTEP; + TEA_ROUND_ESTEP; + TEA_ROUND_ESTEP; } poke_le32(&res->v0, v0); poke_le32(&res->v4, v1); } - + /** * Decrypt a block with the supplied key. * @@ -119,13 +124,13 @@ * @param value the value to decrypt * */ -static G_GNUC_HOT void +static void G_HOT t_decrypt(tea_block_t *res, const tea_key_t *key, const tea_block_t *value) { - guint32 v0, v1, sum = 0xC6EF3720; + uint32 v0, v1, sum = 0xC6EF3720; int i; - guint32 delta = TEA_CONSTANT; - guint32 k0, k1, k2, k3; /* cache key */ + uint32 delta = TEA_CONSTANT; + uint32 k0, k1, k2, k3; /* cache key */ v0 = peek_le32(&value->v0); v1 = peek_le32(&value->v4); @@ -134,10 +139,16 @@ k2 = peek_le32(&key->v8); k3 = peek_le32(&key->v12); - for (i = 0; i < TEA_ROUNDS; i++) { - v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3); - v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1); - sum -= delta; +#define TEA_ROUND_DSTEP \ + v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3); \ + v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1); \ + sum -= delta; + + for (i = 0; i < TEA_ROUNDS / 4; i++) { + TEA_ROUND_DSTEP; + TEA_ROUND_DSTEP; + TEA_ROUND_DSTEP; + TEA_ROUND_DSTEP; } poke_le32(&res->v0, v0); @@ -151,7 +162,7 @@ perform( void (*op)(tea_block_t *, const tea_key_t *, const tea_block_t *), const tea_key_t *key, - gpointer dest, gconstpointer buf, size_t len) + void *dest, const void *buf, size_t len) { size_t remain; const char *in = buf; @@ -186,8 +197,8 @@ * * Length must be a multiple of 8 bytes. */ -void tea_encrypt(const tea_key_t *key, - gpointer dest, gconstpointer buf, size_t len) +void +tea_encrypt(const tea_key_t *key, void *dest, const void *buf, size_t len) { perform(t_encrypt, key, dest, buf, len); } @@ -202,8 +213,8 @@ * * Length must be a multiple of 8 bytes. */ -void tea_decrypt(const tea_key_t *key, - gpointer dest, gconstpointer buf, size_t len) +void +tea_decrypt(const tea_key_t *key, void *dest, const void *buf, size_t len) { perform(t_decrypt, key, dest, buf, len); } @@ -211,7 +222,7 @@ /** * Test implementation. */ -G_GNUC_COLD void +void G_COLD tea_test(void) { tea_key_t key; @@ -228,7 +239,7 @@ for (i = 0; i < 10; i++) { int j; - gboolean randomized = FALSE; + bool randomized = FALSE; for (j = 0; j < 10; j++) { random_bytes(key.v, TEA_KEY_SIZE);
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/tea.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/tea.h
Changed
@@ -34,7 +34,8 @@ #ifndef _tea_h_ #define _tea_h_ -#define TEA_KEY_SIZE 16 +#define TEA_KEY_SIZE 16 /* Size of the TEA key, in bytes */ +#define TEA_BLOCK_SIZE 8 /* Size of TEA blocks, in bytes */ /** * A TEA key is 128-bit wide. @@ -43,19 +44,17 @@ * it has only 126 bits of entropy. */ typedef struct tea_key { - guchar vTEA_KEY_SIZE; + uchar vTEA_KEY_SIZE; } tea_key_t; /* * Public interface. */ -guint32 tea_squeeze(gpointer buf, size_t len); +uint32 tea_squeeze(void *buf, size_t len); -void tea_encrypt(const tea_key_t *key, - gpointer dest, gconstpointer buf, size_t len); -void tea_decrypt(const tea_key_t *key, - gpointer dest, gconstpointer buf, size_t len); +void tea_encrypt(const tea_key_t *key, void *dest, const void *buf, size_t len); +void tea_decrypt(const tea_key_t *key, void *dest, const void *buf, size_t len); void tea_test(void);
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/teq.c
Added
@@ -0,0 +1,1688 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Thread Event Queue. + * + * This is an inter-thread communication channel allowing one thread to request + * the execution of some code in the context of another thread. + * + * Each thread can create its own Thread Event Queue (TEQ for short) and once + * created it can receive asynchronous events. These events are routines to + * invoke, with a single argument (usually carrying context). + * + * It is possible for the sender to request acknowledgment of the procesing + * through a separate callback that can be delivered either synchronously in + * the recipient thread, or asynchronously either via the main callout queue + * or via another event sent back to the sender's own TEQ. + * + * An inter-thread Remove Procedure Call (RPC) is possible through the TEQ. + * The signature of the RPC routine is limited to its more general form: it + * takes a pointer as unique argument and returns a pointer. The inter-thread + * RPC is useful to funnel some calls to a thread that is not ready to have + * all its data structures accessed concurrently. To avoid deadlocks, such + * RPCs should only be directed to a few threads, and the targeted threads + * should never issue such RPCs. + * + * Events are processed by the receiving thread in the order they were sent, + * as soon as the targeted thread is able to process the TSIG_TEQ signal. + * + * TEQs allows work dispatching to "slave threads" and the possibility + * for the "master thread" to be informed that a processing is finished. + * The advantage compared to asynchronous queues (AQ) is that with AQs the + * slave threads need to know the AQ to communicate with the master thread, + * whereas with TEQs the support to acknowledge the event is built-in. TEQs + * can be viewed as specialized AQs since clients of the TEQs do not need to + * bother with the message sent, only with higher-level semantics. + * + * Each thread can limit the processing it does out of its TEQ by requesting + * a time limit for processing (checked every so-many items processed, not + * after every item) and a delay for further processing should it end up + * being throttled. This is mostly intended for the main thread, which can + * be bombarded with events and could be spending all its time handling them. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#include "teq.h" + +#include "atomic.h" +#include "cq.h" +#include "eslist.h" +#include "evq.h" +#include "inputevt.h" +#include "log.h" +#include "once.h" +#include "pow2.h" +#include "spinlock.h" +#include "stacktrace.h" +#include "stringify.h" /* For plural() */ +#include "thread.h" +#include "tm.h" +#include "tsig.h" +#include "waiter.h" +#include "walloc.h" + +#include "override.h" /* Must be the last header included */ + +#define TEQ_MONITOR 5 /**< Monitor queues every 5 secs */ +#define TEQ_MONITOR_PERIOD (TEQ_MONITOR * 1000) + +#define TEQ_THROTTLE_DELAY_DFLT 951 /**< 951 ms */ +#define TEQ_THROTTLE_MASK 0x1f +#define TEQ_RPC_TIMEOUT 5000 /* ms: 5 seconds */ + +/** + * Magic numbers for thread event objects share the leading 24 bits. + */ +#define THREAD_EVENT_MAGIC_MASK 0xffffff00 +#define THREAD_EVENT_MAGIC_VAL 0x439f6800 + +enum tevent_magic { + THREAD_EVENT_MAGIC = THREAD_EVENT_MAGIC_VAL + 0x0b, + THREAD_EVENT_IO_MAGIC = THREAD_EVENT_MAGIC_VAL + 0x48, + THREAD_EVENT_ACK_MAGIC = THREAD_EVENT_MAGIC_VAL + 0x63, + THREAD_EVENT_RPC_MAGIC = THREAD_EVENT_MAGIC_VAL + 0x17, + THREAD_EVENT_ARPC_MAGIC = THREAD_EVENT_MAGIC_VAL + 0xc9, + THREAD_EVENT_IRPC_MAGIC = THREAD_EVENT_MAGIC_VAL + 0xa1 +}; + +#define TEVENT_COMMON \ + enum tevent_magic magic; /**< Magic number */ \ + slink_t lk; /**< Embedded link pointer */ + +/** + * Common part for all thread events. + */ +struct tevent { + TEVENT_COMMON +}; + +/** + * A plain thread event. + */ +struct tevent_plain { + TEVENT_COMMON + notify_fn_t event; /**< The event callback */ + void *data; /**< Associated data */ +}; + +/** + * An acknowledged thread event. + */ +struct tevent_acked { + TEVENT_COMMON + notify_fn_t event; /**< The event callback */ + notify_fn_t ack; /**< The acknowledgment callback */ + void *event_data; /**< Associated data for the event */ + void *ack_data; /**< Associated data for the acknowledgment */ + teq_ackmode_t mode; /**< Callback mode */ + unsigned id; /**< Calling thread, only for TEQ_AM_EVENT */ +}; + +/** + * An RPC thread event. + */ +struct tevent_rpc { + TEVENT_COMMON + teq_rpc_fn_t routine; /**< The routine to call */ + void *data; /**< Associated data */ + void *result; /**< Where result of routine should be stored */ + unsigned id; /**< Calling thread, to unblock it when done */ + bool done; /**< When set to TRUE, RPC is completed */ +}; + +static inline void +tevent_check(const struct tevent * const tev) +{ + g_assert(tev != NULL); + g_assert(THREAD_EVENT_MAGIC_VAL == (tev->magic & THREAD_EVENT_MAGIC_MASK)); +} + +/** + * Magic numbers for thread event queue objects share the leading 24 bits. + */ +#define THREAD_EQ_MAGIC_MASK 0xffffff00 +#define THREAD_EQ_MAGIC_VAL 0x1cbf1100 + +enum teq_magic { + THREAD_EVENT_QUEUE_MAGIC = THREAD_EQ_MAGIC_VAL + 0xd7, + THREAD_EVENT_QUEUE_IO_MAGIC = THREAD_EQ_MAGIC_VAL + 0x63 +}; + +/** + * A thread event queue. + */ +struct teq { + enum teq_magic magic; /**< Magic number */ + unsigned stid; /**< The current thread's ID */ + unsigned generation; /**< Generation number */ + int throttle_ms; /**< Max processing time (ms) */ + int throttle_delay; /**< If throttled, delay in ms */ + int refcnt; /**< Reference count */ + time_t last_handling; /**< When we last handled the TSIG_TEQ signal */ + eslist_t queue; /**< Queue receiving events */ + spinlock_t lock; /**< Thread-safe lock protecting the queue */ + cevent_t *throttle_ev; /**< Throttle event (no throttling if NULL) */ +}; + +/** + * A thread event queue equipped with an I/O event-loop. + * + * Such a queue can process "safe" RPC by triggering an I/O event instead + * of relying on the callout queue, which means less latency for the RPC. + */ +struct teq_io { + struct teq teq; /**< Common part, a regular TEQ */ + eslist_t ioq; /**< Events to handle from I/O callback */ + waiter_t *w; /**< Waiter object to signal for I/O */ + unsigned event_id; /**< ID of the event I/O callback */ + time_t last_handling; /**< When we last handled the I/O event */ + cevent_t *throttle_ev; /**< Throttle event (no throttling if NULL) */ +}; + +#define TEQ_LOCK(t) spinlock(&(t)->lock) +#define TEQ_UNLOCK(t) spinunlock(&(t)->lock) + +static inline void +teq_check(const struct teq * const teq) +{ + g_assert(teq != NULL); + g_assert(THREAD_EQ_MAGIC_VAL == (teq->magic & THREAD_EQ_MAGIC_MASK)); +} + +static inline bool +teq_is_io(const struct teq * const teq) +{ + return teq != NULL && THREAD_EVENT_QUEUE_IO_MAGIC == teq->magic; +} + +#define TEQ_IO(t) (teq_is_io(t) ? (struct teq_io *) (t) : NULL) + +/** + * Array of event queues, one per thread. + * + * Only created threads and the "main" thread can be given event queues. + */ +static struct teq *event_queueTHREAD_MAX; + +static unsigned teq_generation; +static spinlock_t event_queue_slk = SPINLOCK_INIT; + +#define EVENT_QUEUE_LOCK spinlock_hidden(&event_queue_slk) +#define EVENT_QUEUE_UNLOCK spinunlock_hidden(&event_queue_slk) + +/** + * Thread exit argument. + */ +struct teq_exited { + unsigned id; /**< Thread ID exiting */ + unsigned generation; /**< Generation number of the queue */ +}; + +/** + * @return string representation for event acknowledgment mode. + */ +static const char * +teq_ackmode_string(const teq_ackmode_t mode) +{ + switch (mode) { + case TEQ_AM_CALL: return "CALL"; + case TEQ_AM_EVENT: return "EVENT"; + case TEQ_AM_CALLOUT: return "CALLOUT"; + } + + return "UNKNOWN"; +} + +/** + * Destroy pending event. + */ +static void +teq_destroy_event(const struct teq *teq, void *ev) +{ + teq_check(teq); + tevent_check(ev); + + switch(((struct tevent *) ev)->magic) { + case THREAD_EVENT_MAGIC: + case THREAD_EVENT_IO_MAGIC: + { + struct tevent_plain *evp = ev; + + s_warning("%s(): discarding plain %s(%p) from " + "event queue for %s", + G_STRFUNC, stacktrace_function_name(evp->event), evp->data, + thread_id_name(teq->stid)); + + evp->magic = 0; + WFREE(evp); + } + return; + case THREAD_EVENT_ACK_MAGIC: + { + struct tevent_acked *eva = ev; + + s_warning("%s(): discarding ACK-ed %s(%p) from " + "event queue for %s", + G_STRFUNC, stacktrace_function_name(eva->event), + eva->event_data, thread_id_name(teq->stid)); + s_warning("%s(): event ACK mode was %s, with %s(%p) for ACK", + G_STRFUNC, teq_ackmode_string(eva->mode), + stacktrace_function_name(eva->ack), eva->ack_data); + + eva->magic = 0; + WFREE(eva); + } + return; + case THREAD_EVENT_RPC_MAGIC: + case THREAD_EVENT_ARPC_MAGIC: + case THREAD_EVENT_IRPC_MAGIC: + { + struct tevent_rpc *evr = ev; + + s_warning("%s(): discarding RPC %s(%p) from " + "event queue for %s", + G_STRFUNC, stacktrace_function_name(evr->routine), + evr->data, thread_id_name(teq->stid)); + s_warning("%s(): RPC was issued by %s", + G_STRFUNC, thread_id_name(evr->id)); + + /* No need to free, event structure is on the caller's stack */ + } + return; + } + + g_assert_not_reached(); +} + +/** + * Destroy a thread event queue. + */ +static void +teq_destroy(struct teq *teq) +{ + void *ev; + + teq_check(teq); + g_assert(0 == teq->refcnt); + + /* + * Discard and free any remaining item in the queue. + * + * All the events in the queue are lost, therefore they are logged as + * they are discarded, but they are not processed, even if an + * acknowledgment was requested. + * + * It is usually an application error to have a thread exit with pending + * events in its queue, but it is not necessarily critical. + */ + + while (NULL != (ev = eslist_shift(&teq->queue))) { + teq_destroy_event(teq, ev); + } + + if (teq_is_io(teq)) { + struct teq_io *teq_io = TEQ_IO(teq); + size_t count = eslist_count(&teq_io->ioq); + + if (0 != count) { + s_warning("%s(): I/O event queue still has %zu pending I/O event%s", + G_STRFUNC, count, plural(count)); + } + + while (NULL != (ev = eslist_shift(&teq_io->ioq))) { + teq_destroy_event(teq, ev); + } + } + + if (teq_is_io(teq)) { + struct teq_io *teq_io = TEQ_IO(teq); + teq->magic = 0; + WFREE(teq_io); + } else { + teq->magic = 0; + WFREE(teq); + } +} + +/** + * Does the specified thread ID have a valid event queue? + */ +bool +teq_is_supported(unsigned id) +{ + bool supported; + + g_assert(id < THREAD_MAX); + + EVENT_QUEUE_LOCK; + supported = event_queueid != NULL; + EVENT_QUEUE_UNLOCK; + + return supported; +} + +/** + * Get the event queue for a specific thread ID. + * + * The queue is reference counted and teq_release() must be called afterwards + * to possibly free the queue. + */ +static struct teq * +teq_get(unsigned id) +{ + struct teq *teq; + + g_assert(id < THREAD_MAX); + + EVENT_QUEUE_LOCK; + teq = event_queueid; + if (teq != NULL) { + teq_check(teq); + /* + * Ref-counting the queue prevents teq_release() from physically + * destroying the object as long as it is referenced by someone. + */ + atomic_int_inc(&teq->refcnt); + } + EVENT_QUEUE_UNLOCK; + + return teq; +} + +/** + * Get the event queue for specific thread ID, which must exist. + */ +static struct teq * +teq_get_mandatory(unsigned id, const char *caller) +{ + struct teq *teq = teq_get(id); + + if (NULL == teq) { + s_error("%s(): no thread event queue for %s", + caller, thread_id_name(id)); + } + + return teq; +} + +/** + * Release the queue, freeing it when its reference count reaches 0. + */ +static void +teq_release(struct teq *teq) +{ + teq_check(teq); + + if (atomic_int_dec_is_zero(&teq->refcnt)) + teq_destroy(teq); +} + +/** + * Callout context for event. + */ +struct teq_cq_info { + notify_fn_t event; + void *data; +}; + +/** + * Callout queue trampoline code. + */ +static void +teq_cq_trampoline(cqueue_t *unused_cq, void *udata) +{ + struct teq_cq_info *ci = udata; + + (void) unused_cq; + + (*ci->event)(ci->data); + WFREE(ci); +} + +/** + * Callout queue RPC dispatching code. + */ +static void +teq_async_rpc(cqueue_t *unused_cq, void *udata) +{ + struct tevent_rpc *evr = udata; + + (void) unused_cq; + + g_assert(THREAD_EVENT_ARPC_MAGIC == evr->magic); + + evr->result = (*evr->routine)(evr->data); + atomic_bool_set(&evr->done, TRUE); + thread_unblock(evr->id); +} + +/** + * Acknowledge processing of event. + */ +static void +teq_ack(const struct tevent_acked *eva) +{ + switch (eva->mode) { + case TEQ_AM_CALL: /* Direct call from thread */ + (*eva->ack)(eva->ack_data); + return; + case TEQ_AM_EVENT: /* Post event to sending thread */ + teq_post(eva->id, eva->ack, eva->ack_data); + return; + case TEQ_AM_CALLOUT: /* Invoke via main callout queue */ + { + struct teq_cq_info *ci; + + WALLOC(ci); + ci->event = eva->ack; + ci->data = eva->ack_data; + cq_main_insert(1, teq_cq_trampoline, ci); + } + return; + } + + g_assert_not_reached(); +} + +/** + * Add event to the queue, signaling targeted thread. + */ +static void +teq_put(struct teq *teq, void *ev) +{ + teq_check(teq); + tevent_check(ev); + + TEQ_LOCK(teq); + eslist_append(&teq->queue, ev); + TEQ_UNLOCK(teq); + + thread_kill(teq->stid, TSIG_TEQ); +} + +/** + * Add event to the I/O queue, signalling the I/O event loop. + */ +static void +teq_io_enqueue(struct teq *teq, void *ev) +{ + struct teq_io *teq_io = TEQ_IO(teq); + + g_assert(teq_io != NULL); /* If NULL, cast failed so wrong type */ + + TEQ_LOCK(teq); + eslist_append(&teq_io->ioq, ev); + TEQ_UNLOCK(teq); + + /* + * This will trigger an I/O event in the event loop, causing the + * teq_io_callback() to be invoked to process the events inserted + * in the I/O queue. + */ + + waiter_signal(teq_io->w); +} + +/** + * Remove next event from the queue, if any. + * + * @return the unqueued event, NULL if no more events are pending. + */ +static void * +teq_remove(struct teq *teq) +{ + void *ev; + + teq_check(teq); + + TEQ_LOCK(teq); + ev = eslist_shift(&teq->queue); + TEQ_UNLOCK(teq); + + return ev; +} + +/** + * Fetch next event from the I/O queue. + * + * @return the unqueued event, NULL if no more events are pending. + */ +static void * +teq_io_remove(struct teq_io *teq_io) +{ + void *ev; + + teq_check(&teq_io->teq); + + TEQ_LOCK(&teq_io->teq); + ev = eslist_shift(&teq_io->ioq); + TEQ_UNLOCK(&teq_io->teq); + + return ev; +} + +/** + * Callout queue event to un-throttle queue. + */ +static void +teq_unthrottle(cqueue_t *cq, void *data) +{ + struct teq *teq = data; + + teq_check(teq); + + cq_zero(cq, &teq->throttle_ev); + cq_cancel(&teq->throttle_ev); + thread_kill(teq->stid, TSIG_TEQ); +} + +/** + * Callout queue event to un-throttle I/O event queue. + */ +static void +teq_io_unthrottle(cqueue_t *cq, void *data) +{ + struct teq *teq = data; + struct teq_io *teq_io; + + teq_check(teq); + + teq_io = TEQ_IO(teq); + g_assert(teq_io != NULL); /* Is really a TEQ with an I/O queue */ + + cq_zero(cq, &teq_io->throttle_ev); + cq_cancel(&teq_io->throttle_ev); + waiter_signal(teq_io->w); +} + +/** + * Process enqueued events. + * + * @return the amount of events processed + */ +static size_t +teq_process(struct teq *teq) +{ + size_t n = 0; + void *ev; + tm_t start = TM_ZERO; + + STATIC_ASSERT(IS_POWER_OF_2(TEQ_THROTTLE_MASK + 1)); + + teq_check(teq); + + if (teq->throttle_ev != NULL) + return 0; /* Currently throttled */ + + if (teq->throttle_ms != 0) + tm_now_exact(&start); + + while (NULL != (ev = teq_remove(teq))) { + tevent_check(ev); + n++; + + switch (((struct tevent *) ev)->magic) { + case THREAD_EVENT_MAGIC: /* Invoke routine */ + { + struct tevent_plain *evp = ev; + (*evp->event)(evp->data); + evp->magic = 0; + WFREE(evp); + } + goto next; + case THREAD_EVENT_ACK_MAGIC: /* Invoke routine, acknowledge */ + { + struct tevent_acked *eva = ev; + (*eva->event)(eva->event_data); + teq_ack(eva); + eva->magic = 0; + WFREE(eva); + } + goto next; + case THREAD_EVENT_RPC_MAGIC: /* Plain inter-thread RPC */ + { + struct tevent_rpc *evr = ev; + + evr->result = (*evr->routine)(evr->data); + atomic_bool_set(&evr->done, TRUE); + thread_unblock(evr->id); + + /* Do not free, event structure lies on the caller's stack */ + } + goto next; + case THREAD_EVENT_ARPC_MAGIC: /* Asynchronous "safe" RPC */ + { + /* + * Request asynchronous processing via the callout queue. + */ + + cq_main_insert(1, teq_async_rpc, ev); + + /* Do not free, event structure lies on the caller's stack */ + } + goto next; + case THREAD_EVENT_IRPC_MAGIC: /* Asynchronous "safe" RPC */ + case THREAD_EVENT_IO_MAGIC: /* Asynchronous "safe" routine */ + { + /* + * Simply move the event to the I/O queue, which will be + * processed later from the main I/O event loop. + */ + + teq_io_enqueue(teq, ev); + } + goto next; + } + + g_assert_not_reached(); + + next: + /* + * If we have to throttle processing, create a callout queue trigger + * which will post back a signal to this thread. + */ + + if G_UNLIKELY(0 == (n & TEQ_THROTTLE_MASK) && teq->throttle_ms != 0) { + tm_t now; + + tm_now_exact(&now); + + if (tm_elapsed_ms(&now, &start) >= teq->throttle_ms) { + /* + * Upon return from evq_raw_insert(), the callback can have + * already triggered since dispatching can happen in another + * thread. Because we use a non-NULL event reference as a + * flag indicating the queue is throttled, we need to check + * via cq_zero_if_triggered() whether the event has already + * triggered. + */ + + teq->throttle_ev = evq_raw_insert(teq->throttle_delay, + teq_unthrottle, teq); + cq_zero_if_triggered(&teq->throttle_ev); + break; + } + } + } + + /* + * We remember the last time we processed the queue to detect threads + * that are "stuck" and are not handling the TSIG_TEQ signal in a timely + * manner, despite having pending events. + */ + + TEQ_LOCK(teq); + teq->last_handling = tm_time(); + TEQ_UNLOCK(teq); + + return n; +} + +/** + * Thread signal handler to process incoming events. + */ +static void +teq_handle(int signo) +{ + unsigned id; + struct teq *teq; + + g_assert(TSIG_TEQ == signo); + + id = thread_small_id(); + teq = teq_get(id); + + if G_UNLIKELY(NULL == teq) { + s_warning("%s(): thread event queue for %s is gone", + G_STRFUNC, thread_id_name(id)); + + thread_signal(TSIG_TEQ, TSIG_IGN); /* Ignore further occurrences */ + return; + } + + if G_LIKELY(NULL == teq->throttle_ev) + teq_process(teq); + + teq_release(teq); +} + +/** + * Insert item in the thread event queue of the targeted thread. + * + * The targeted thread must have a valid event queue. + * + * @param teq the targeted thread event queue + * @param routine the routine to invoke + * @param data the context to pass to the routine + * @param magic magic number to use for the event, for possible async call + */ +static void +teq_post_event(struct teq *teq, notify_fn_t routine, void *data, + enum tevent_magic magic) +{ + struct tevent_plain *evp; + + g_assert(routine != NULL); + + WALLOC0(evp); + evp->magic = magic; + evp->event = routine; + evp->data = data; + + teq_put(teq, evp); + teq_release(teq); +} + +/** + * Insert item in the thread event queue of the targeted thread. + * + * A protocol between the poster of the event and the targeted routine + * (which will run in the context of the targeted thread) must be defined + * in order to know how to process the data argument, whether to free it + * after processing, how it is structured, etc... + * + * The targeted thread must have a valid event queue. + * + * @param id ID of the thread to which we want to post the event + * @param routine the routine to invoke + * @param data the context to pass to the routine + */ +void +teq_post(unsigned id, notify_fn_t routine, void *data) +{ + struct teq *teq = teq_get_mandatory(id, G_STRFUNC); + + teq_post_event(teq, routine, data, THREAD_EVENT_MAGIC); +} + +/** + * Insert item in the thread event queue of the targeted thread, but request + * that the callback only happen asynchronously, dispatched from the I/O + * event loop to prevent any possible interruption that would be re-entrant, + * with code not prepared for that. + * + * The targeted thread must have a valid I/O event queue. + * + * @param id ID of the thread to which we want to post the event + * @param routine the routine to invoke + * @param data the context to pass to the routine + */ +void +teq_safe_post(unsigned id, notify_fn_t routine, void *data) +{ + struct teq *teq = teq_get_mandatory(id, G_STRFUNC); + + g_assert_log(teq_is_io(teq), + "%s(): attempt to post safe event to %s requires an I/O TEQ there", + G_STRFUNC, thread_id_name(id)); + + teq_post_event(teq, routine, data, THREAD_EVENT_IO_MAGIC); +} + +/** + * Insert item in the thread event queue of the targeted thread. + * + * The caller wants an acknowledgement after the targeted thread is done + * processing the event, and several modes are possible: + * + * TEQ_AM_CALL requests that the targeted thread invokes the specified + * callback synchronously, directly. + * + * TEQ_AM_EVENT requests that the targeted thread posts an event back + * to the calling thread. If the calling thread has no valid event queue, + * an error is logged and the action is not completed. + * + * TEQ_AM_CALLOUT requests that the targeted thread inserts a callout event + * in the main callout queue. + * + * The targeted thread must have a valid event queue. + * + * @param id ID of the thread to which we want to post the event + * @param routine the routine to invoke + * @param data the context to pass to the routine + * @param mode the acknowledgment mode + * @param ack the acknowledgment routine to invoke + * @param ack_data the context to pass to the acknowledgment routine + */ +void +teq_post_ack(unsigned id, notify_fn_t routine, void *data, + teq_ackmode_t mode, notify_fn_t ack, void *ack_data) +{ + struct teq *teq; + struct tevent_acked *eva; + + g_assert(routine != NULL); + g_assert(ack != NULL); + + teq = teq_get_mandatory(id, G_STRFUNC); + + WALLOC0(eva); + + if (TEQ_AM_EVENT == mode) { + unsigned cid = thread_small_id(); + + /* + * If they want an event back, they must have a valid event queue. + */ + + if (!teq_is_supported(cid)) { + s_error("%s(): no thread event queue for calling thread %s", + G_STRFUNC, thread_id_name(cid)); + } + + eva->id = cid; + } + + eva->magic = THREAD_EVENT_ACK_MAGIC; + eva->mode = mode; + eva->event = routine; + eva->event_data = data; + eva->ack = ack; + eva->ack_data = ack_data; + + teq_put(teq, eva); + teq_release(teq); +} + +/** + * Issue a remote procedure call (RPC) in the context of the other thread, + * waiting for the reply from that call to continue. + * + * @attention + * There is a potential for deadlock if any thread can issue RPCs to any other. + * + * @note + * This routine is a cancellation point. + * + * @param id the targeted thread to which RPC is issued + * @param teq the targeted thread event queue, NULL if unknown + * @param routine the routine to invoke in the context of the thread + * @param data the argument to the routine + * @param magic magic number to use for the RPC, for direct or async call + * + * @return the value replied by the routine. + */ +static void * +teq_post_rpc(unsigned id, struct teq *teq, teq_rpc_fn_t routine, void *data, + enum tevent_magic magic) +{ + struct tevent_rpc rpc; + unsigned events, n = 1; + + /* + * Detect when a thread attempts to issue a RPC to itself, since using + * the event queue would then be very inefficient. + */ + + if G_UNLIKELY(thread_small_id() == id) + return (*routine)(data); + + /* + * Regular case, we have to issue the call to another thread. + * + * We're going to block here since we'll wait for the reply of the + * enqueued routine. Hence make sure we do not hold any locks. + */ + + thread_assert_no_locks(G_STRFUNC); + + if (NULL == teq) + teq = teq_get_mandatory(id, G_STRFUNC); + + rpc.magic = magic; + rpc.routine = routine; + rpc.data = data; + rpc.id = thread_small_id(); + rpc.done = FALSE; + + /* + * The calling thread is going to block until the RPC is issued by the + * targeted thread. + * + * The thread_block_prepare() call is necessary to prevent a race condition + * with thread_block_self() later, since teq_put() can immediately cause + * processing in the other thread, making blocking unnecessary. + */ + + events = thread_block_prepare(); + + teq_put(teq, &rpc); + teq_release(teq); + + /* + * The `rpc.done' field is our (synchronized) signal that the RPC has been + * completed by the targeted thread. This allows spurious wakeups from + * thread_timed_block_self(). + */ + + while (!atomic_bool_get(&rpc.done)) { + tm_t tmout; + + /* + * To spot bugs in the RPC layer, or genuine problems with RPCs that + * do not complete in a timely manner, set a reasonable waiting time + * for the reply to come back, before warning. + * + * If the warning is issued and the RPC is completed, then it means + * there is a race condition somewhere in the waiting code that + * prevents proper signalling to the blocked thread. + */ + + tm_fill_ms(&tmout, n * TEQ_RPC_TIMEOUT); + + if (!thread_timed_block_self(events, &tmout)) { + s_carp("%s(): timeout #%u waiting (RPC %s(%p) to %s %s)", + G_STRFUNC, n, stacktrace_function_name(routine), data, + thread_id_name(id), + atomic_bool_get(&rpc.done) ? "completed" : "still pending"); + n++; /* One more timeout, increase waiting time */ + } + + events = thread_block_prepare(); + } + + return rpc.result; +} + +/** + * Issue a remote procedure call (RPC) in the context of the other thread, + * waiting for the reply from that call to continue. + * + * This is useful when attempting to access data or request processing from + * a "mono-threaded" thread (a thread dealing with data structures that are + * not always protected from concurrent accesses). + * + * @attention + * There is a potential for deadlock if any thread can issue RPCs to any other. + * + * @note + * This routine is a cancellation point. + * + * @param id the targeted thread to which RPC is issued + * @param routine the routine to invoke in the context of the thread + * @param data the argument to the routine + * + * @return the value replied by the routine. + */ +void * +teq_rpc(unsigned id, teq_rpc_fn_t routine, void *data) +{ + return teq_post_rpc(id, NULL, routine, data, THREAD_EVENT_RPC_MAGIC); +} + +/** + * Issue a remote procedure call (RPC) in the context of the other thread, + * waiting for the reply from that call to continue. + * + * The difference with teq_rpc() is that the processing is done asynchronously + * in the callout queue, ensuring safe processing in the target thread + * regardless of the state we are in when we are interrupting with our TSIG_TEQ + * signal. + * + * Why is it needed? Because in gtk-gnutella, the GTK layer is NOT using our + * locks, and therefore we could be interrupting processing when GTK tries to + * allocate memory. If the callback routine attempts to re-enter GTK, that + * could result in a deadlock. By having processing done from the callout + * queue, we know we are not within any GTK call and therefore it is safe to + * have the routine attempt to issue GTK calls. + * + * @note + * This routine is a cancellation point. + * + * @param id the targeted thread to which RPC is issued + * @param routine the routine to invoke in the context of the thread + * @param data the argument to the routine + * + * @return the value replied by the routine. + */ +void * +teq_safe_rpc(unsigned id, teq_rpc_fn_t routine, void *data) +{ + struct teq *teq = teq_get_mandatory(id, G_STRFUNC); + + /* + * If target thread has an I/O event queue, it is better to use that + * since the processing delay will be less than inserting something + * in the callout queue (which is not immediately processed given we + * have to wait for its heartbeat). + */ + + if (teq_is_io(teq)) + return teq_post_rpc(id, teq, routine, data, THREAD_EVENT_IRPC_MAGIC); + + /* + * No I/O event queue, needs to have a callout queue then! + */ + + g_assert_log(cq_main_thread_id() == id, + "%s(): issuing RPC to %s but callout queue runs in thread #%u", + G_STRFUNC, thread_id_name(id), cq_main_thread_id()); + + return teq_post_rpc(id, teq, routine, data, THREAD_EVENT_ARPC_MAGIC); +} + +/** + * Process enqueued I/O events. + * + * @return the amount of events processed + */ +static size_t +teq_io_process(struct teq *teq) +{ + struct teq_io *teq_io = TEQ_IO(teq); + size_t n = 0; + void *ev; + tm_t start = TM_ZERO; + + STATIC_ASSERT(IS_POWER_OF_2(TEQ_THROTTLE_MASK + 1)); + + teq_check(teq); + g_assert(teq_io != NULL); /* If NULL, cast failed so wrong type */ + + if (teq_io->throttle_ev != NULL) + return 0; /* Currently throttled */ + + if (teq->throttle_ms != 0) + tm_now_exact(&start); + + /* + * Consume all the events enqueued in our queue. + * + * We're only dealing with THREAD_EVENT_IRPC_MAGIC events here, since + * they are the only kind that gets redirected to that I/O queue. + */ + + while (NULL != (ev = teq_io_remove(teq_io))) { + tevent_check(ev); + n++; + + switch (((struct tevent *) ev)->magic) { + case THREAD_EVENT_MAGIC: + case THREAD_EVENT_ACK_MAGIC: + case THREAD_EVENT_RPC_MAGIC: + case THREAD_EVENT_ARPC_MAGIC: + s_error("%s(): unexpected event type in the I/O queue", G_STRFUNC); + case THREAD_EVENT_IO_MAGIC: + { + struct tevent_plain *evp = ev; + (*evp->event)(evp->data); + evp->magic = 0; + WFREE(evp); + } + goto next; + case THREAD_EVENT_IRPC_MAGIC: + { + struct tevent_rpc *evr = ev; + + evr->result = (*evr->routine)(evr->data); + atomic_bool_set(&evr->done, TRUE); + thread_unblock(evr->id); + } + goto next; + } + + g_assert_not_reached(); + + next: + /* + * If we have to throttle processing, create a callout queue trigger + * which will post back an event to the waiter object. + */ + + if G_UNLIKELY(0 == (n & TEQ_THROTTLE_MASK) && teq->throttle_ms != 0) { + tm_t now; + + tm_now_exact(&now); + + if (tm_elapsed_ms(&now, &start) >= teq->throttle_ms) { + /* + * Upon return from evq_raw_insert(), the callback can have + * already triggered since dispatching can happen in another + * thread. Because we use a non-NULL event reference as a + * flag indicating the queue is throttled, we need to check + * via cq_zero_if_triggered() whether the event has already + * triggered. + */ + + teq_io->throttle_ev = evq_raw_insert(teq->throttle_delay, + teq_io_unthrottle, teq); + cq_zero_if_triggered(&teq_io->throttle_ev); + break; + } + } + } + + /* + * For the benefits of teq_monitor(), to be able to detect stucked queues, + * record the last processing time for the I/O queue. + */ + + TEQ_LOCK(teq); + teq_io->last_handling = tm_time(); + TEQ_UNLOCK(teq); + + return n; +} + +/** + * Callback function for inputevt_add(). + * + * This indicates that someone (the TEQ associated with the thread running + * the I/O event loop) has posted a signal on our waiter to request processing. + */ +static void +teq_io_callback(void *data, int source, inputevt_cond_t condition) +{ + waiter_t *w = data; + struct teq *teq = waiter_data(data); + + g_assert(condition & INPUT_EVENT_RX); + teq_check(teq); + + (void) source; + waiter_ack(w); /* Acknowledge reception of event */ + + atomic_int_inc(&teq->refcnt); + teq_io_process(teq); + teq_release(teq); +} + +/** + * @return amount of pending events in the thread's event queue, 0 if no queue. + */ +size_t +teq_count(unsigned id) +{ + struct teq *teq; + size_t count; + + teq = teq_get(id); + if (NULL == teq) + return 0; + + TEQ_LOCK(teq); + count = eslist_count(&teq->queue); + if (teq_is_io(teq)) { + struct teq_io *teq_io = TEQ_IO(teq); + count += eslist_count(&teq_io->ioq); + } + TEQ_UNLOCK(teq); + + teq_release(teq); + return count; +} + +/** + * Initialize the thread event queue structure. + */ +static void +teq_initialize(struct teq *teq, unsigned id) +{ + teq->stid = id; + teq->generation = atomic_uint_inc(&teq_generation); + teq->refcnt = 1; + eslist_init(&teq->queue, offsetof(struct tevent, lk)); + spinlock_init(&teq->lock); +} + +/** + * Allocate a new thread event queue for given thread. + */ +static struct teq * +teq_allocate(unsigned id) +{ + struct teq *teq; + + WALLOC0(teq); + teq->magic = THREAD_EVENT_QUEUE_MAGIC; + teq_initialize(teq, id); + + return teq; +} + +/** + * Allocate a new thread event queue with I/O event loop plugging for the + * given thread. + */ +static struct teq * +teq_io_allocate(unsigned id) +{ + struct teq_io *teq_io; + waiter_t *w; + + g_assert_log(inputevt_thread_id() != THREAD_INVALID_ID, + "%s(): attempt to allocate I/O thread event queue in %s() " + "but main I/O event loop is not configured yet", + G_STRFUNC, thread_name()); + + g_assert_log(inputevt_thread_id() == id, + "%s(): attempt to allocate I/O thread event queue in %s() " + "but main I/O event loop runs in %s", + G_STRFUNC, thread_name(), thread_id_name(inputevt_thread_id())); + + WALLOC0(teq_io); + teq_io->teq.magic = THREAD_EVENT_QUEUE_IO_MAGIC; + teq_initialize(&teq_io->teq, id); + + /* + * Install the I/O event reception by plugging the waiter object into + * the main event loop. + */ + + teq_io->w = w = waiter_make(teq_io); + teq_io->event_id = + inputevt_add(waiter_fd(w), INPUT_EVENT_RX, teq_io_callback, w); + eslist_init(&teq_io->ioq, offsetof(struct tevent, lk)); + + g_assert(0 == ptr_cmp(teq_io, &teq_io->teq)); /* TEQ at the base */ + + return &teq_io->teq; +} + +/** + * Thread exit callback invoked when the current thread exits. + */ +static void +teq_reclaim(void *value, void *ctx) +{ + struct teq_exited *ex = ctx; + struct teq *teq; + + (void) value; /* Thread exit value is ignored */ + + g_assert(ex->id < THREAD_MAX); + + /* + * To avoid errors, we check that the current event queue for the + * thread is the one created at the proper generation. + * + * Indeed, there could be a race if this exit callback is called + * asynchronously from the callout queue thread, since a new thread + * could have started reusing the same ID and called teq_create(). + * + * If the thread invoking teq_create() was not created with the + * THREAD_F_ASYNC_EXIT flag however, the atexit callback will be called + * synchronously when the thread terminates, and there will be no + * room for race conditions, therefore no error should be reported. + */ + + EVENT_QUEUE_LOCK; + teq = event_queueex->id; + if (teq != NULL && ex->generation == teq->generation) { + event_queueex->id = NULL; + } else { + teq = NULL; + } + EVENT_QUEUE_UNLOCK; + + if (NULL == teq) { + s_carp("%s(): attempt to reclaim invalid event queue for %s", + G_STRFUNC, thread_id_name(ex->id)); + } else { + teq_release(teq); + } + + WFREE(ex); +} + +/** + * Callout queue periodic event to make sure thread event queues are handled + * in a timely manner when they have pending events. + */ +static bool +teq_monitor(void *unused_obj) +{ + size_t i; + time_t now = tm_time(); + struct { + size_t stuck; + size_t ioq; + uint throttled:1; + uint io_throttled:1; + } monTHREAD_MAX; + + (void) unused_obj; + STATIC_ASSERT(N_ITEMS(mon) == N_ITEMS(event_queue)); + + ZERO(&mon); + + EVENT_QUEUE_LOCK; + + for (i = 0; i < N_ITEMS(event_queue); i++) { + struct teq *teq = event_queuei; + + if (teq != NULL) { + size_t count; + time_t last; + bool throttled; + + teq_check(teq); + + TEQ_LOCK(teq); + count = eslist_count(&teq->queue); + last = teq->last_handling; + throttled = teq->throttle_ev != NULL; + TEQ_UNLOCK(teq); + + /* + * If queue has items but has not been processed since twice the + * period of the monitoring, then the queue is stuck in that thread. + */ + + if (count != 0 && delta_time(now, last) >= TEQ_MONITOR * 2) { + moni.stuck = count; + moni.throttled = throttled; + } + + /* + * If the TEQ has an I/O queue, monitor it as well. + */ + + if (teq_is_io(teq)) { + struct teq_io *teq_io = TEQ_IO(teq); + + TEQ_LOCK(teq); + count = eslist_count(&teq_io->ioq); + last = teq_io->last_handling; + throttled = teq_io->throttle_ev != NULL; + TEQ_UNLOCK(teq); + + if (count != 0 && delta_time(now, last) >= TEQ_MONITOR * 2) { + moni.stuck += count; + moni.ioq = count; + moni.io_throttled = throttled; + } + } + } + } + + EVENT_QUEUE_UNLOCK; + + /* + * Log outside of the critical section if we found stuck threads. + */ + + for (i = 0; i < N_ITEMS(mon); i++) { + if G_UNLIKELY(moni.stuck != 0) { + static const char THROTTLED = "throttled "; + if (0 == moni.ioq) { + s_warning("%s(): found %zu pending event%s " + "in %sevent queue for %s", + G_STRFUNC, moni.stuck, plural(moni.stuck), + moni.throttled ? THROTTLED : "", + thread_id_name(i)); + } else { + s_warning("%s(): found %zu pending event%s (with %zu %sI/O) " + "in %sevent queue for %s", + G_STRFUNC, moni.stuck, plural(moni.stuck), + moni.ioq, moni.io_throttled ? THROTTLED : "", + moni.throttled ? THROTTLED : "", thread_id_name(i)); + } + } + } + + return TRUE; /* Keep calling */ +} + +/** + * Install global thread event queue monitoring, once. + */ +static void +teq_monitor_install(void) +{ + evq_raw_periodic_add(TEQ_MONITOR_PERIOD, teq_monitor, NULL); +} + +/** + * Suspend calling thread until new events are received in its thread + * event queue that add work. + * + * The given predicate is used to atomically test whether there is new work + * to be processed before the thread suspends itself. + * + * The predicate is called with TSIG_TEQ blocked, so the data structures from + * the thread can be accessed without lock protection if the only other source + * of concurrency is the processing of events from the thread event queue. + * + * @note + * This routine is a cancellation point. + * + * @param predicate test for new work + * @param arg argument to supply to the predicate + */ +void +teq_wait(predicate_fn_t predicate, void *arg) +{ + tsigset_t nset, oset; + + g_assert_log(teq_is_supported(thread_small_id()), + "%s(): called with no event queue in %s", G_STRFUNC, thread_name()); + + tsig_emptyset(&nset); + tsig_addset(&nset, TSIG_TEQ); + + for (;;) { + thread_sigmask(TSIG_BLOCK, &nset, &oset); /* Critical section */ + + /* + * If there is already some work, then we can immediately return. + * Because TSIG_TEQ is blocked, no new work can be given to the + * thread via its event queue whilst we evaluate the predicate. + */ + + if ((*predicate)(arg)) { + thread_sigmask(TSIG_SETMASK, &oset, NULL); + return; + } + + /* + * Atomically restore the previous signal mask and wait for signals. + * Since we can receive other signals than TSIG_TEQ, we need to + * re-evaluate the predicate once we return. + * + * There is nothing to cleanup here: should the thread be cancelled, + * its signal mask will be irrelevant. + */ + + thread_sigsuspend(&oset); + } +} + +/** + * Create a thread event queue for the current thread, if none already exists. + */ +void +teq_create_if_none(void) +{ + struct teq *teq; + unsigned id = thread_small_id(); + + g_assert(id < THREAD_MAX); + + EVENT_QUEUE_LOCK; + teq = event_queueid; + EVENT_QUEUE_UNLOCK; + + if (NULL == teq) + teq_create(); +} + +/** + * Create a new thread event queue for the current thread. + * + * @param io whether to create a queue with I/O events + */ +static void +teq_create_internal(bool io) +{ + static once_flag_t done; + unsigned id = thread_small_id(); + struct teq *teq, *oteq; + struct teq_exited *ex; + + g_assert(id < THREAD_MAX); + + /* + * Make sure the time thread has started before we call evq_init() + * indirectly through here, as it would cause recursive initialization + * problems in that routine. + */ + + (void) tm_time_exact(); + + once_flag_run(&done, teq_monitor_install); + + teq = io ? teq_io_allocate(id) : teq_allocate(id); + + EVENT_QUEUE_LOCK; + oteq = event_queueid; + event_queueid = teq; + EVENT_QUEUE_UNLOCK; + + if (oteq != NULL) + teq_release(oteq); + + /* + * The TSIG_TEQ signal is used to signal to the thread that is has + * pending events to process in its queue. + */ + + thread_signal(TSIG_TEQ, teq_handle); + + /* + * Make sure we reclaim this thread event queue when the thread exits. + * + * To protect against errors, we pass to the thread exit callback the + * thread ID and the generation number, so that we can safely avoid + * processing an already freed object. + */ + + WALLOC0(ex); + ex->id = id; + ex->generation = teq->generation; + + thread_atexit(teq_reclaim, ex); +} + +/** + * Create a new thread event queue for the current thread. + */ +void +teq_create(void) +{ + teq_create_internal(FALSE); +} + +/** + * Create a new thread event queue with I/O events for the current thread. + */ +void +teq_io_create(void) +{ + teq_create_internal(TRUE); +} + +/** + * Manually dispatch all the events held in the thread's event queue. + * + * This routine can safely be invoked in a thread without an event queue, + * in which case it will just return 0. + * + * @return the amount of events dispatched. + */ +size_t +teq_dispatch(void) +{ + struct teq *teq; + size_t n; + + teq = teq_get(thread_small_id()); + if (NULL == teq) + return 0; + + n = teq_process(teq); + + if (teq_is_io(teq)) + n += teq_io_process(teq); + + teq_release(teq); + + return n; +} + +/** + * Configure throttling parameters. + * + * They apply to both regular and I/O-event queues. + * + * @param process max procesing time, in ms (0 = unlimited) + * @param delay processing delay when throttling, in ms (0 = default) + */ +void +teq_set_throttle(int process, int delay) +{ + struct teq *teq; + bool need_signal = FALSE; + + teq = teq_get(thread_small_id()); + if (NULL == teq) + return; + + teq->throttle_ms = process; + teq->throttle_delay = 0 == delay ? TEQ_THROTTLE_DELAY_DFLT : delay; + + /* + * Cancel any existing throttling event after a parameter change and + * signal that a re-processing is required (harmless if nothing is + * pending). + */ + + if (teq->throttle_ev != NULL) { + cq_cancel(&teq->throttle_ev); + need_signal = TRUE; + } + + if (teq_is_io(teq)) { + struct teq_io *teq_io = TEQ_IO(teq); + + if (teq_io->throttle_ev != NULL) { + cq_cancel(&teq_io->throttle_ev); + waiter_signal(teq_io->w); + } + } + + if (need_signal) + thread_kill(teq->stid, TSIG_TEQ); + + teq_release(teq); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/teq.h
Added
@@ -0,0 +1,72 @@ +/* + * Copyright (c) 2013, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Thread Event Queue. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#ifndef _teq_h_ +#define _teq_h_ + +/** + * Type of acknowledgments that can be requested for an event. + */ +typedef enum { + TEQ_AM_CALL, /**< Direct routine call from foreign thread */ + TEQ_AM_EVENT, /**< Send back an event to the posting thread */ + TEQ_AM_CALLOUT /**< Register event into the main callout queue */ +} teq_ackmode_t; + +/** + * An RPC routine for teq_rpc(). + */ +typedef void *(*teq_rpc_fn_t)(void *arg); + +/* + * Public interface. + */ + +bool teq_is_supported(unsigned id); +size_t teq_count(unsigned id); +void teq_create(void); +void teq_io_create(void); +void teq_create_if_none(void); +void teq_post(unsigned id, notify_fn_t routine, void *data); +void teq_safe_post(unsigned id, notify_fn_t routine, void *data); +void teq_post_ack(unsigned id, notify_fn_t routine, void *data, + teq_ackmode_t mode, notify_fn_t ack, void *ack_data); +void *teq_rpc(unsigned id, teq_rpc_fn_t routine, void *data); +void *teq_safe_rpc(unsigned id, teq_rpc_fn_t routine, void *data); +void teq_wait(predicate_fn_t predicate, void *arg); +size_t teq_dispatch(void); +void teq_set_throttle(int process, int delay); + +#endif /* _teq_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/thread-test.c
Added
@@ -0,0 +1,2634 @@ +/* + * thread-test -- thread and related synchronization tools unit tests. + * + * Copyright (c) 2012 Raphael Manfredi <Raphael_Manfredi@pobox.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the authors nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "common.h" + +#include "aq.h" +#include "atio.h" +#include "atomic.h" +#include "barrier.h" +#include "compat_poll.h" +#include "compat_sleep_ms.h" +#include "cond.h" +#include "cq.h" +#include "crash.h" +#include "dam.h" +#include "evq.h" +#include "getcpucount.h" +#include "halloc.h" +#include "hset.h" +#include "log.h" +#include "misc.h" +#include "mutex.h" +#include "once.h" +#include "parse.h" +#include "progname.h" +#include "random.h" +#include "rwlock.h" +#include "semaphore.h" +#include "shuffle.h" +#include "signal.h" +#include "spinlock.h" +#include "stacktrace.h" +#include "str.h" +#include "stringify.h" +#include "strtok.h" +#include "teq.h" +#include "thread.h" +#include "tm.h" +#include "tsig.h" +#include "vmea.h" +#include "waiter.h" +#include "walloc.h" +#include "xmalloc.h" +#include "zalloc.h" + +#define STACK_SIZE 16384 + +static char allocator = 'r'; /* For -X tests, random mix by default */ +static size_t allocator_bsize; /* Block size to use (0 = random) */ +static size_t allocator_fill; +static bool sleep_before_exit; +static bool async_exit, wait_threads; +static bool randomize_free; +static unsigned cond_timeout; +static long cpu_count; + +static void *sleeping_thread(void *unused_arg); + +static void G_NORETURN +usage(void) +{ + fprintf(stderr, + "Usage: %s -hejsvwxABCDEFHIKMNOPQRSVWX -a type -b size -c CPU\n" + " -f count -n count -r percent -t ms -T msecs\n" + " -z fn1,fn2...\n" + " -a : allocator to exlusively test via -X (see below for type)\n" + " -b : fixed block size to use for memory tests via -X\n" + " -c : override amount of CPUs, driving thread count for mem tests\n" + " -e : use emulated semaphores\n" + " -f : fill amount, for -X to know how many blocks to allocate\n" + " -h : prints this help message\n" + " -j : join created threads\n" + " -n : amount of times to repeat tests\n" + " -r : let remote threads free some objects during -X tests\n" + " -s : let each created thread sleep for 1 second before ending\n" + " -t : timeout value (ms) for condition waits\n" + " -v : dump thread statistics at the end of the tests\n" + " -w : wait for created threads\n" + " -x : free memory allocated by -X in random order\n" + " -z : zap (suppress) messages from listed routines.\n" + " -A : use asynchronous exit callbacks\n" + " -B : test synchronization barriers\n" + " -C : test thread creation\n" + " -D : test synchronization dams\n" + " -E : test thread signals\n" + " -F : test thread fork\n" + " -H : test thread interrupts\n" + " -I : test inter-thread waiter signaling\n" + " -K : test thread cancellation\n" + " -M : monitors tennis match via waiters\n" + " -N : add broadcast noise during tennis session\n" + " -O : test thread stack overflow\n" + " -P : add direct POSIX threads along with thread creation test\n" + " -Q : test asynchronous queue\n" + " -R : test the read-write lock layer\n" + " -S : test semaphore layer\n" + " -T : test condition layer via tennis session for specified msecs\n" + " -V : test thread event queue (TEQ)\n" + " -W : test local event queue (EVQ)\n" + " -X : exercise concurrent memory allocation\n" + "Values given as decimal, hexadecimal (0x), octal (0) or binary (0b)\n" + "Allocators: r=random mix, h=halloc, v=vmm_alloc, w=walloc, x=xmalloc\n" + , getprogname()); + exit(EXIT_FAILURE); +} + +static hset_t *zap; + +static void +zap_record(const char *value) +{ + strtok_t *s; + const char *tok; + + zap = hset_create(HASH_KEY_STRING, 0); + s = strtok_make_strip(value); + + while ((tok = strtok_next(s, ","))) { + hset_insert(zap, h_strdup(tok)); + } + + strtok_free_null(&s); +} + +static void +emitv(bool nl, const char *fmt, va_list args) +{ + str_t *s = str_new(512); + iovec_t iov2; + int cnt = 0; + + str_vprintf(s, fmt, args); + iovec_set(&iovcnt++, str_2c(s), str_len(s)); + if (nl) + iovec_set(&iovcnt++, "\n", 1); + + /* + * Emit every message to stderr, since this is the same channel used + * by s_debug() and friends. That way, all the output goes to the + * very same descriptor, atomically, avoiding garbled output. + */ + + atio_writev(STDERR_FILENO, iov, cnt); + + str_destroy_null(&s); +} + +static void G_PRINTF(1, 2) +emit(const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + emitv(TRUE, fmt, args); + va_end(args); +} + +static void G_PRINTF(2, 3) +emit_zap(const char *caller, const char *fmt, ...) +{ + va_list args; + + if (zap != NULL && hset_contains(zap, caller)) + return; /* Zap messages from this caller */ + + va_start(args, fmt); + emitv(TRUE, fmt, args); + va_end(args); +} + +#define emitz(fmt, ...) emit_zap(G_STRFUNC, (fmt), __VA_ARGS__) +#define TESTING(func) emit("----------- %s() -----------", (func)); + +static char *names = { "one", "two", "three", "four", "five" }; + +static void +exit_callback(void *result, void *arg) +{ + char *name = arg; + long length = pointer_to_long(result); + emit("thread \"%s\" finished, result length is %ld", name, length); +} + +static void * +compute_length(void *arg) +{ + unsigned stid = thread_small_id(); + const char *name = arg; + char *scratch = xstrdup(name); + + emit("%s given \"%s\"", thread_id_name(stid), scratch); + xfree(scratch); + thread_cancel_test(); + if (sleep_before_exit) + thread_sleep_ms(1000); + return ulong_to_pointer(strlen(name)); +} + +static void +test_create_one(bool repeat, bool join) +{ + unsigned i; + int launchedN_ITEMS(names); + + for (i = 0; i < N_ITEMS(names); i++) { + int r; + int flags = 0; + + if (!join) + flags |= THREAD_F_DETACH; + + if (async_exit) + flags |= THREAD_F_ASYNC_EXIT; + + r = thread_create_full(compute_length, namesi, flags, + STACK_SIZE, exit_callback, namesi); + + launchedi = r; + + if (-1 == r) { + if (errno != EAGAIN || !repeat) + s_warning("cannot create thread #%u: %m", i); + } else { + int j; + if (!repeat) + emit("thread i=%u created as %s", i, thread_id_name(r)); + if (!join) { + j = thread_join(r, NULL); + if (-1 != j) { + s_warning("thread_join() worked for %s?", + thread_id_name(r)); + } else if (errno != EINVAL) { + s_warning("thread_join() failure on %s: %m", + thread_id_name(r)); + } else { + if (!repeat) { + emit("%s cannot be joined, that's OK", + thread_id_name(r)); + } + if (wait_threads) { + bool ok; + tm_t tout; + int error; + + tout.tv_sec = 2; + tout.tv_usec = 0; + + ok = thread_timed_wait(r, &tout, &error); + + if (!ok) { + s_warning("thread_wait() timed-out for %s", + thread_id_name(r)); + } else if (error != 0) { + errno = error; + s_warning("thread_wait() failure on %s: %m", + thread_id_name(r)); + } + } + } + } + } + } + + if (!repeat && !join) + compat_sleep_ms(200); /* Let all the threads run */ + + if (join) { + emit("now joining the %u threads", (uint) N_ITEMS(launched)); + for (i = 0; i < N_ITEMS(launched); i++) { + int r = launchedi; + + if (-1 == r) { + if (!repeat) + emit("skipping unlaunched thread i=%u", i); + } else { + void *result; + int j; + + if (wait_threads && -1 == thread_wait(r)) { + s_warning("thread_wait() failed for %s: %m", + thread_id_name(r)); + } + + j = thread_join(r, &result); /* Block */ + if (-1 == j) { + s_warning("thread_join() failed for %s: %m", + thread_id_name(r)); + } else { + ulong length = pointer_to_ulong(result); + if (!repeat) { + emit("%s finished, result length is %lu", + thread_id_name(r), length); + } + } + } + } + } + + if (async_exit) + cq_main_dispatch(); +} + +static pthread_t +posix_thread_create(process_fn_t routine, void *arg, bool joinable) +{ + int error; + pthread_attr_t attr; + pthread_t t; + + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, + joinable ? PTHREAD_CREATE_JOINABLE : PTHREAD_CREATE_DETACHED); + pthread_attr_setstacksize(&attr, THREAD_STACK_MIN); + error = pthread_create(&t, &attr, routine, arg); + pthread_attr_destroy(&attr); + + if (error != 0) { + errno = error; + s_error("cannot create POSIX thread: %m"); + } + + return t; +} + +static void * +posix_worker(void *unused_arg) +{ + unsigned stid = thread_small_id(); + char name120; + thread_info_t info; + + (void) unused_arg; + + thread_current_info(&info); + thread_info_to_string_buf(&info, name, sizeof name); + + emit("POSIX thread worker starting..."); + emit("POSIX worker: %s", name); + + for (;;) { + void *p; + + thread_current_info(&info); + + g_assert_log(thread_small_id() == stid, + "current STID=%u, prev=%u %s", thread_small_id(), stid, + thread_info_to_string_buf(&info, name, sizeof name)); + + p = xmalloc(100); + compat_sleep_ms(100); + xfree(p); + + thread_current_info(&info); + + g_assert_log(thread_small_id() == stid, + "current STID=%u, prev=%u %s", thread_small_id(), stid, + thread_info_to_string_buf(&info, name, sizeof name)); + } + + return NULL; +} + +static void * +posix_threads(void *unused_arg) +{ + unsigned i; + + (void) unused_arg; + + emit("POSIX thread launcher starting..."); + + for (i = 0; i < 6; i++) { + (void) posix_thread_create(posix_worker, NULL, FALSE); + } + + emit("POSIX thread launch done, mutating to worker..."); + + return posix_worker(NULL); +} + +static void * +posix_exiting_thread(void *unused_arg) +{ + void *p; + (void) unused_arg; + + p = xmalloc(100); + compat_sleep_ms(100); + xfree(p); + + return NULL; +} + +static void +test_create(unsigned repeat, bool join, bool posix) +{ + unsigned i; + + TESTING(G_STRFUNC); + + if (posix) { + pthread_t foreign; + + foreign = posix_thread_create(posix_exiting_thread, NULL, TRUE); + (void) posix_thread_create(posix_threads, NULL, FALSE); + + emit("Waiting for single foreign POSIX thread..."); + if (0 != pthread_join(foreign, NULL)) + s_error("cannot wait for foreign POSIX thread"); + } + + for (i = 0; i < repeat; i++) { + test_create_one(repeat > 1, join); + } +} + +static void +test_cancel_one(bool repeat, bool join) +{ + unsigned i; + int launchedN_ITEMS(names); + + for (i = 0; i < N_ITEMS(names); i++) { + int r; + int flags = 0; + + if (!join) + flags |= THREAD_F_DETACH; + + if (async_exit) + flags |= THREAD_F_ASYNC_EXIT; + + r = thread_create_full(compute_length, namesi, flags, + STACK_SIZE, exit_callback, namesi); + + launchedi = r; + + if (-1 == r) { + if (errno != EAGAIN || !repeat) + s_warning("cannot create thread #%u: %m", i); + } else { + int j; + if (!repeat) + emit("thread i=%u created as %s", i, thread_id_name(r)); + if (-1 == thread_cancel(r)) + s_warning("thread_cancel(%u) failed: %m", r); + if (!join) { + j = thread_join(r, NULL); + if (-1 != j) { + s_warning("thread_join() worked for %s?", + thread_id_name(r)); + } else if (errno != EINVAL) { + s_warning("thread_join() failure on %s: %m", + thread_id_name(r)); + } else { + if (!repeat) { + emit("%s cannot be joined, that's OK", + thread_id_name(r)); + } + } + } + } + } + + if (!repeat && !join) + compat_sleep_ms(200); /* Let all the threads run */ + + if (join) { + emit("now joining the %u threads", (uint) N_ITEMS(launched)); + for (i = 0; i < N_ITEMS(launched); i++) { + int r = launchedi; + + if (-1 == r) { + if (!repeat) + emit("skipping unlaunched thread i=%u", i); + } else { + void *result; + int j = thread_join(r, &result); /* Block */ + if (-1 == j) { + s_warning("thread_join() failed for %s: %m", + thread_id_name(r)); + } else { + long length = pointer_to_long(result); + if (!repeat) { + emit("%s finished, result length is %ld", + thread_id_name(r), length); + } + } + } + } + } + + if (async_exit) + cq_main_dispatch(); + + i = thread_create(sleeping_thread, NULL, THREAD_F_PANIC, STACK_SIZE); + if (-1 == thread_cancel(i)) { + s_error("cannot cancel sleeping thread: %m"); + } else { + void *result; + + if (-1 == thread_join(i, &result)) + s_error("cannot join with sleeping thread: %m"); + g_assert(THREAD_CANCELLED == result); + } +} + +static void +test_cancel(unsigned repeat, bool join) +{ + unsigned i; + + TESTING(G_STRFUNC); + + for (i = 0; i < repeat; i++) { + test_cancel_one(repeat > 1, join); + } +} + +static void * +test_inter_main(void *arg) +{ + waiter_t *w = waiter_refcnt_inc(arg); + + sleep(1); + emit("signaling main thread"); + waiter_signal(w); + + compat_sleep_ms(5); + waiter_refcnt_dec(arg); + return NULL; +} + +static void +test_inter(void) +{ + waiter_t *mw, *w; + bool refed; + + TESTING(G_STRFUNC); + + mw = waiter_make(NULL); + w = waiter_spawn(mw, int_to_pointer(31416)); + + thread_create(test_inter_main, w, THREAD_F_DETACH | THREAD_F_PANIC, 0); + + emit("main thread waiting"); + if (!waiter_suspend(mw)) + s_error("could not suspend itself"); + emit("main thread awoken"); + + refed = waiter_refcnt_dec(w); + emit("child waiter %s referenced", refed ? "still" : "no longer"); + while (waiter_child_count(mw) != 1) { + emit("waiting for all children in waiter to go"); + compat_sleep_ms(5); + } + refed = waiter_refcnt_dec(mw); + emit("master waiter %s referenced", refed ? "still" : "no longer"); +} + +struct test_semaphore_arg { + int n; /* thread number */ + semaphore_t *s; /* semaphore to use */ +}; + +static void * +test_semaphore_main(void *arg) +{ + struct test_semaphore_arg *ta = arg; + int i; + int n = ta->n; + semaphore_t *s = ta->s; + + xfree(ta); + + for (i = 0; i < 6; i++) { + bool got = TRUE; + emit("thread #%d alive, waiting for event", n); + if (semaphore_acquire(s, 1, NULL)) { + emit("#%d got semaphore!", n); + } else { + s_warning("thread #%d cannot get semaphore: %m", n); + got = FALSE; + } + sleep(1); + if (got) { + emit("#%d releasing semaphore!", n); + semaphore_release(s, 1); + } + } + + emit("thread #%d exiting!", n); + return NULL; +} + +static int +test_semaphore_thread_launch(int n, semaphore_t *s) +{ + struct test_semaphore_arg *arg; + + XMALLOC(arg); + arg->n = n; + arg->s = s; + + return thread_create(test_semaphore_main, arg, THREAD_F_PANIC, 0); +} + +static void +test_semaphore(bool emulated) +{ + semaphore_t *s; + tm_t timeout; + int i; + int r3; + + TESTING(G_STRFUNC); + + s = semaphore_create_full(0, emulated); + if (semaphore_acquire_try(s, 1)) + s_error("could acquire empty semaphore!"); + semaphore_release(s, 2); + + tm_fill_ms(&timeout, 1000); + + if (!semaphore_acquire(s, 1, &timeout)) + s_error("could not acquire semaphore, first time!"); + if (!semaphore_acquire(s, 1, &timeout)) + s_error("could not acquire semaphore, second time!"); + + tm_fill_ms(&timeout, 500); + emit("will wait 1/2 second..."); + if (semaphore_acquire(s, 1, &timeout)) + s_error("could acquire empty semaphore!"); + g_assert_log(EAGAIN == errno, + "improper errno, expected EAGAIN (%d) but got %m", EAGAIN); + emit("good, failed to acquire empty semaphore."); + + r0 = test_semaphore_thread_launch(1, s); + r1 = test_semaphore_thread_launch(2, s); + r2 = test_semaphore_thread_launch(3, s); + + semaphore_release(s, 1); + + for (i = 0; i < 6; i++) { + emit("main alive"); + sleep(1); + } + + emit("main waiting for subthreads"); + + for (i = 0; UNSIGNED(i) < N_ITEMS(r); i++) { + if (-1 == thread_join(ri, NULL)) + s_error("failed to join with %s: %m", thread_id_name(ri)); + } + + emit("main is done, final semaphore value is %d", semaphore_value(s)); + + semaphore_destroy(&s); +} + +/* + * The tennis game is a C port of a C++ demo program posted to + * comp.programming.threads circa 2001 to test condition waiting + * implementations and outline bugs in them. + * + * When run normally without noise, no spurious wakeups should happen and + * of course no deadlocks. + * + * When broadcast noise is added, there will be spurious wakeups but there + * should be no deadlocks either. + */ + +enum game_state { + START_GAME, /* Game starting */ + PLAYER_A, /* Player A's turn */ + PLAYER_B, /* Player B's turn */ + GAME_OVER, /* Game over */ + ONE_PLAYER_GONE, + BOTH_PLAYER_GONE, +}; + +static enum game_state game_state; +static mutex_t game_state_lock = MUTEX_INIT; +static cond_t game_state_change = COND_INIT; +static struct game_stats { + int play; + int spurious; + int timeout; +} game_stats2; +const char *name = { "A", "B" }; +enum game_state other = { PLAYER_B, PLAYER_A }; + +static void +create_player(process_fn_t start, int n) +{ + g_assert(n >= 0 && n < (int) N_ITEMS(name)); + + if (-1 == thread_create(start, int_to_pointer(n), THREAD_F_DETACH, 8192)) + s_error("cannot launch player %s: %m", namen); +} + +static void * +player(void *num) +{ + int n; + enum game_state other_player; + const char *me; + struct game_stats *stats; + tm_t timeout; + + n = pointer_to_int(num); + me = namen; + other_player = othern; + stats = &game_statsn; + + if (cond_timeout != 0) + tm_fill_ms(&timeout, cond_timeout); + + mutex_lock(&game_state_lock); + + while (game_state < GAME_OVER) { + stats->play++; + emitz("%s plays", me); + + game_state = other_player; + cond_signal(&game_state_change, &game_state_lock); + + /* Wait until it's my turn to play again */ + + do { + if (cond_timeout != 0) { + bool success = cond_timed_wait_clean( + &game_state_change, &game_state_lock, &timeout); + + if (!success) { + stats->timeout++; + emitz("** TIMEOUT ** %s wakeup", me); + continue; + } + } else { + cond_wait_clean(&game_state_change, &game_state_lock); + } + + if (other_player == game_state) { + stats->spurious++; + emitz("** SPURIOUS ** %s wakeup", me); + } + } while (other_player == game_state); + } + + game_state++; + emit("%s leaving", me); + + cond_broadcast(&game_state_change, &game_state_lock); + mutex_unlock(&game_state_lock); + + return NULL; +} + +static void +player_stats(int n) +{ + struct game_stats *stats; + + g_assert(n >= 0 && n < (int) N_ITEMS(game_stats)); + + stats = &game_statsn; + + emit("%s played %d times (%d spurious event%s, %d timeout%s)", + namen, stats->play, stats->spurious, plural(stats->spurious), + stats->timeout, plural(stats->timeout)); +} + +static void +test_condition(unsigned play_time, bool emulated, bool monitor, bool noise) +{ + int i; + game_state = START_GAME; + waiter_t *w; + uint notifications = 0; + + TESTING(G_STRFUNC); + + g_assert(0 == cond_waiting_count(&game_state_change)); + + if (emulated) + cond_init_full(&game_state_change, &game_state_lock, emulated); + + g_assert(0 == cond_waiting_count(&game_state_change)); + g_assert(0 == cond_pending_count(&game_state_change)); + g_assert(0 == cond_signal_count(&game_state_change)); + + for (i = 0; i < (int) N_ITEMS(name); i++) { + create_player(player, i); + } + + if (monitor) { + struct pollfd wfd1; + tm_t end, play; + + tm_now_exact(&end); + tm_fill_ms(&play, play_time); + tm_add(&end, &play); + + w = waiter_make(NULL); + cond_waiter_add(&game_state_change, w); + g_assert(2 == waiter_refcnt(w)); + + if (!waiter_suspend(w)) + s_warning("cannot suspend myself"); + if (waiter_notified(w)) { + waiter_ack(w); + notifications++; + } else { + s_warning("waiter should have been notified"); + } + + wfd0.fd = waiter_fd(w); + wfd0.events = POLLIN; + + for (;;) { + tm_t now; + int ret; + + tm_now_exact(&now); + if (tm_elapsed_f(&end, &now) <= 0.0) + break; + + ret = compat_poll(wfd, N_ITEMS(wfd), 1000); + if (ret < 0) { + s_warning("poll() failed: %m"); + } else { + emit_zap("player", "match still on"); + notifications++; + waiter_ack(w); + } + } + + cond_waiter_remove(&game_state_change, w); + g_assert(1 == waiter_refcnt(w)); + waiter_refcnt_dec(w); + } else { + compat_sleep_ms(play_time); /* Let them play */ + } + + if (noise) { + emit("** Noise ON **"); + for (i = 0; i < 100000; i++) { + mutex_lock(&game_state_lock); + cond_broadcast(&game_state_change, &game_state_lock); + mutex_unlock(&game_state_lock); + } + emit("** Noise OFF **"); + } + + mutex_lock(&game_state_lock); + game_state = GAME_OVER; + + emit("Stopping the game..."); + + cond_broadcast(&game_state_change, &game_state_lock); + + do { + cond_wait_clean(&game_state_change, &game_state_lock); + } while (game_state < BOTH_PLAYER_GONE); + + g_assert(0 == cond_waiting_count(&game_state_change)); + + emit("Game over!"); + + mutex_unlock(&game_state_lock); + mutex_destroy(&game_state_lock); + if (!cond_reset(&game_state_change)) + s_warning("cannot reset condition?"); + cond_destroy(&game_state_change); + + /* Must work also after destruction */ + + g_assert(0 == cond_waiting_count(&game_state_change)); + g_assert(0 == cond_pending_count(&game_state_change)); + + for (i = 0; i < (int) N_ITEMS(name); i++) { + player_stats(i); + } + if (monitor) { + emit("main got %u notification%s", + notifications, plural(notifications)); + } +} + +static spinlock_t locks = { SPINLOCK_INIT, SPINLOCK_INIT }; +static mutex_t mutexes = { MUTEX_INIT, MUTEX_INIT }; +static rwlock_t rlocks = { RWLOCK_INIT, RWLOCK_INIT }; +static rwlock_t wlocks = { RWLOCK_INIT, RWLOCK_INIT }; +const char *fork_names = { "locker #1", "locker #2" }; + +static void * +fork_locker(void *arg) +{ + int n = pointer_to_int(arg); + + thread_set_name(fork_namesn); + + emit("%s locking...", thread_name()); + + spinlock(&locksn); + mutex_lock(&mutexesn); + rwlock_rlock(&rlocksn); + rwlock_wlock(&wlocksn); + + emit("%s locked, sleeping for 5 secs", thread_name()); + + sleep(5); + + emit("%s unlocking", thread_name()); + + rwlock_wunlock(&wlocksn); + rwlock_runlock(&rlocksn); + mutex_unlock(&mutexesn); + spinunlock(&locksn); + + return NULL; +} + +static void * +fork_forker(void *arg) +{ + pid_t pid; + unsigned running; + bool safe = booleanize(pointer_to_int(arg)); + + emit("%s() waiting 1 sec", G_STRFUNC); + sleep(1); + + running = thread_count(); + emit("%s() forking with %u running thread%s, STID=%u", G_STRFUNC, + running, plural(running), thread_small_id()); + + thread_lock_dump_all(STDOUT_FILENO); + + switch ((pid = thread_fork(safe))) { + case -1: + s_error("%s() cannot fork(): %m", G_STRFUNC); + case 0: + emit("%s() child process started as STID=%u", + G_STRFUNC, thread_small_id()); + emit("%s() child has %u thread", G_STRFUNC, thread_count()); + thread_lock_dump_all(STDOUT_FILENO); + exit(EXIT_SUCCESS); + default: + emit("%s() child forked, waiting...", G_STRFUNC); +#ifdef HAS_WAITPID + { + pid_t w = waitpid(pid, NULL, 0); + if (-1 == w) + s_error("%s() cannot wait(): %m", G_STRFUNC); + } +#endif + emit("%s() child terminated, exiting thread", G_STRFUNC); + } + + return NULL; +} + +static void +test_fork(bool safe) +{ + int l1, l2, fk, r; + unsigned running; + + TESTING(G_STRFUNC); + + emit("--- testing thread_fork(%s)", safe ? "TRUE" : "FALSE"); + + running = thread_count(); + emit("starting with %u running thread%s", running, plural(running)); + + l1 = thread_create(fork_locker, int_to_pointer(0), THREAD_F_PANIC, 8192); + l2 = thread_create(fork_locker, int_to_pointer(1), THREAD_F_PANIC, 8192); + fk = thread_create(fork_forker, int_to_pointer(safe), THREAD_F_PANIC, 8192); + + r = thread_join(l1, NULL); + if (-1 == r) + s_error("first thread_join() failed: %m"); + r = thread_join(l2, NULL); + if (-1 == r) + s_error("second thread_join() failed: %m"); + r = thread_join(fk, NULL); + if (-1 == r) + s_error("final thread_join() failed: %m"); + + running = thread_count(); + emit("ending with %u running thread%s", running, plural(running)); + + emit("--- test of thread_fork(%s) done!", safe ? "TRUE" : "FALSE"); +} + +static int +overflow_routine(void *arg) +{ + int x = pointer_to_int(arg); + int c128; + + ZERO(&c); + c0 = x; + c1 = overflow_routine(&c1); + + if (NULL == arg) + return c0 + c1; + + return overflow_routine(c) + c1; +} + +static void +overflow_handler(int unused_sig) +{ + (void) unused_sig; + + s_rawdebug("stack overflow signal properly caught!"); +} + +static void * +overflow_thread(void *arg) +{ + thread_signal(TSIG_OVFLOW, overflow_handler); + thread_set_name("overflow"); + + return int_to_pointer(overflow_routine(arg)); +} + +static void +test_overflow(void) +{ + int t, r; + + TESTING(G_STRFUNC); + + t = thread_create(overflow_thread, int_to_pointer(0), THREAD_F_PANIC, 8192); + r = thread_join(t, NULL); + if (-1 == r) + s_error("%s(): thread_join() failed: %m", G_STRFUNC); +} + +struct aqt_arg { + aqueue_t *r, *a; +}; + +static void * +aqt_processor(void *arg) +{ + struct aqt_arg *aa = arg; + aqueue_t *r = aq_refcnt_inc(aa->r); + aqueue_t *a = aq_refcnt_inc(aa->a); + + s_message("%s starting", thread_name()); + + for (;;) { + void *msg = aq_remove(r); + ulong len; + + if (NULL == msg) + break; /* NULL signals end of processing */ + + len = strlen(msg); + compat_sleep_ms(300 * len); /* Think hard */ + aq_put(a, ulong_to_pointer(len)); + } + + s_message("%s exiting", thread_name()); + + aq_refcnt_dec(a); + aq_refcnt_dec(r); + + return NULL; +} + +static void +test_aqueue(bool emulated) +{ + aqueue_t *r, *a; + struct aqt_arg arg; + int t; + uint i; + + TESTING(G_STRFUNC); + + emit("%s() starting...", G_STRFUNC); + + arg.r = r = aq_make_full(emulated); /* requests */ + arg.a = a = aq_make_full(emulated); /* answers */ + + t = thread_create(aqt_processor, &arg, THREAD_F_PANIC, 0); + + for (i = 0; i < N_ITEMS(names); i++) { + ulong res; + + emit("computing length of \"%s\"", namesi); + + aq_put(r, namesi); + res = pointer_to_ulong(aq_remove(a)); + + emit("\t=> %lu bytes", res); + } + + emit("sending EOF"); + + aq_put(r, NULL); /* Signals end to thread */ + if (-1 == thread_join(t, NULL)) + s_error("cannot join with processor thread: %m"); + + aq_refcnt_dec(a); + aq_refcnt_dec(r); + + emit("%s() all done.", G_STRFUNC); +} + +static rwlock_t rwsync = RWLOCK_INIT; + +static void * +test_rwthreads(void *unused_arg) +{ + const char *tname = thread_name(); + + (void) unused_arg; + + s_info("%s - starting concurrent read tests", tname); + rwlock_rlock(&rwsync); + + s_info("%s - has read lock", tname); + compat_sleep_ms(100); + s_info("%s - and now trying to upgrade it", tname); + + if (rwlock_upgrade(&rwsync)) { + s_info("%s - could upgrade to write lock, pausing 1 second", tname); + sleep(1); + s_info("%s - downgrading back to read lock, pausing 1 second", tname); + rwlock_downgrade(&rwsync); + sleep(1); + s_info("%s - releasing read lock, re-getting write lock", tname); + rwlock_runlock(&rwsync); + rwlock_wlock(&rwsync); + s_info("%s - ok, got write lock back", tname); + } else { + s_info("%s - could not upgrade, releasing read lock", tname); + rwlock_runlock(&rwsync); + s_info("%s - waiting for write lock", tname); + rwlock_wlock(&rwsync); + s_info("%s - ok, got write lock, sleeping 1 second", tname); + sleep(1); + } + + s_info("%s - releasing write lock", tname); + rwlock_wunlock(&rwsync); + s_info("%s - exiting", tname); + + return NULL; +} + +static void +test_rwlock(void) +{ + int t9; + rwlock_t rw = RWLOCK_INIT; + unsigned i; + + TESTING(G_STRFUNC); + + s_info("%s starting, will be launching %s()", thread_name(), + stacktrace_function_name(test_rwthreads)); + + /* The mono-threaded "cannot fail" sequence */ + + emit("%s(): mono-threaded tests...", G_STRFUNC); + + if (!rwlock_rlock_try(&rw)) + s_error("cannot read-lock"); + + if (!rwlock_rlock_try(&rw)) + s_error("cannot recursively read-lock"); + + rwlock_runlock(&rw); + + if (!rwlock_upgrade(&rw)) + s_error("cannot upgrade read-lock"); + + if (rwlock_is_free(&rw)) + s_error("lock should not be free"); + + rwlock_downgrade(&rw); + rwlock_runlock(&rw); + + if (!rwlock_is_free(&rw)) + s_error("lock should be free"); + + emit("%s(): mono-threaded tests succeded.", G_STRFUNC); + + /* Now for multi-threaded tests.... */ + + emit("%s(): multi-threaded tests...", G_STRFUNC); + + for (i = 0; i < N_ITEMS(t); i++) { + ti = thread_create(test_rwthreads, NULL, 0, 0); + if (-1 == ti) + s_error("%s() cannot create thread %u: %m", G_STRFUNC, i); + } + + for (i = 0; i < N_ITEMS(t); i++) { + thread_join(ti, NULL); + } + + emit("%s(): multi-threaded tests done.", G_STRFUNC); +} + +static bool test_signals_done; +static int test_signals_count; + +#define TEST_SIGNALS_COUNT 3 + +static void +test_sighandler(int sig) +{ + emit("%s received signal #%d", thread_name(), sig); +} + +static void +test_sigdone(int sig) +{ + emit("%s got signal #%d, will exit", thread_name(), sig); + + test_signals_done = TRUE; +} + +static void +test_sigcount(int sig) +{ + emit("%s got signal #%d (count = %u)", thread_name(), sig, + ++test_signals_count); +} + +static void +test_printsig(int sig) +{ + emit("%s got signal #%d", thread_name(), sig); +} + +static void * +signalled_thread(void *unused_arg) +{ + tsigset_t set, oset; + int count = 0; + + (void) unused_arg; + + thread_signal(TSIG_1, test_sighandler); + thread_signal(TSIG_2, test_sighandler); + thread_signal(TSIG_3, test_sigdone); + thread_signal(TSIG_4, test_sighandler); + + tsig_emptyset(&set); + tsig_addset(&set, TSIG_4); + thread_sigmask(TSIG_BLOCK, &set, &oset); + + while (!test_signals_done) { + if (!thread_pause()) + s_error("thread was not unblocked by signal"); + if (3 == count++) { + emit("%s() will now get signal #4", G_STRFUNC); + thread_sigmask(TSIG_SETMASK, &oset, NULL); + } + } + + emit("%s() exiting", G_STRFUNC); + + return NULL; +} + +static void * +sleeping_thread(void *arg) +{ + barrier_t *b = arg; + tm_t start, end; + + thread_signal(TSIG_1, test_sigcount); + if (b != NULL) + barrier_wait(b); + + tm_now_exact(&start); + thread_sleep_ms(2000); + tm_now_exact(&end); + + emit("%s() slept %u ms (expected 2000 ms)", G_STRFUNC, + (uint) tm_elapsed_ms(&end, &start)); + + while (test_signals_count < TEST_SIGNALS_COUNT) { + emit("%s() got %d/%d signals so far", G_STRFUNC, + test_signals_count, TEST_SIGNALS_COUNT); + thread_pause(); + } + + if (b != NULL) + barrier_wait(b); + + g_assert(TEST_SIGNALS_COUNT == test_signals_count); + + if (b != NULL) { + tsigset_t nset, oset; + tm_t timeout; + + tsig_emptyset(&nset); + tsig_addset(&nset, TSIG_2); + thread_sigmask(TSIG_BLOCK, &nset, &oset); + thread_signal(TSIG_2, test_printsig); + + tm_fill_ms(&timeout, 2000); + barrier_wait(b); + + tm_now_exact(&start); + if (thread_timed_sigsuspend(&oset, &timeout)) { + tm_now_exact(&end); + emit("%s() suspended %u ms before getting signal", G_STRFUNC, + (uint) tm_elapsed_ms(&end, &start)); + } else { + g_assert_not_reached(); + } + + tm_fill_ms(&timeout, 1000); + tm_now_exact(&start); + if (thread_timed_sigsuspend(&oset, &timeout)) { + g_assert_not_reached(); + } else { + tm_now_exact(&end); + emit("%s() suspended %u ms without getting signals", G_STRFUNC, + (uint) tm_elapsed_ms(&end, &start)); + } + + tm_fill_ms(&timeout, 2000); + + barrier_wait(b); + tm_now_exact(&start); + if (thread_timed_sigsuspend(&oset, &timeout)) { + tm_now_exact(&end); + emit("%s() suspended %u ms (about 1 sec) before getting signal", + G_STRFUNC, (uint) tm_elapsed_ms(&end, &start)); + } else { + g_assert_not_reached(); + } + + barrier_free_null(&b); + } + + return NULL; +} + +static void +test_signals(void) +{ + barrier_t *b; + int r, i; + + TESTING(G_STRFUNC); + + /* 60 is random constant, large enough to avoid it being already used */ + + if (-1 != thread_kill(60, TSIG_0)) + s_error("thread #60 already exists?"); + + r = thread_create(signalled_thread, NULL, THREAD_F_PANIC, 0); + + emit("%s() thread %s created", G_STRFUNC, thread_id_name(r)); + + for (i = 0; i < 10; i++) { + sleep(1); + if (-1 == thread_kill(r, TSIG_0)) + s_error("thread #%d cannot be signalled: %m", r); + if (-1 == thread_kill(r, TSIG_4)) + s_error("thread #%d cannot be signalled: %m", r); + if (-1 == thread_kill(r, (i & 0x1) ? TSIG_2 : TSIG_1)) + s_error("thread #%d cannot be signalled: %m", r); + } + + emit("%s() emitting each signal 100 times", G_STRFUNC); + + for (i = 0; i < 100; i++) { + emitz("%d", i); + if (-1 == thread_kill(r, TSIG_1)) + s_error("cannot send TSIG_1: %m"); + if (-1 == thread_kill(r, TSIG_2)) + s_error("cannot send TSIG_2: %m"); + if (-1 == thread_kill(r, TSIG_4)) + s_error("cannot send TSIG_4: %m"); + } + + emit("%s() done sending!", G_STRFUNC); + + if (-1 == thread_kill(r, TSIG_3)) + s_error("cannot send TSIG_3: %m"); + if (-1 == thread_join(r, NULL)) + s_error("cannot join: %m"); + + emit("%s() now checking thread_sleep_ms()", G_STRFUNC); + + b = barrier_new(2); + r = thread_create(sleeping_thread, + barrier_refcnt_inc(b), THREAD_F_PANIC, 0); + barrier_wait(b); /* Give it time to setup */ + for (i = 0; i < TEST_SIGNALS_COUNT; i++) { + if (-1 == thread_kill(r, TSIG_1)) + s_error("thread #%d cannot be signalled: %m", r); + thread_sleep_ms(500); /* Give it time to process signal */ + } + emit("%s() all signals sent", G_STRFUNC); + + barrier_wait(b); /* Let signalled thread process everything */ + + emit("%s() now checking thread_timed_sigsuspend()", G_STRFUNC); + + barrier_wait(b); + thread_kill(r, TSIG_2); + barrier_wait(b); + thread_sleep_ms(1000); + thread_kill(r, TSIG_2); + barrier_free_null(&b); + thread_join(r, NULL); +} + +static int counter; + +struct computer_arg { + int n; + barrier_t *b; +}; + +static void * +computer_thread(void *arg) +{ + struct computer_arg *ca = arg; + int n = ca->n; + barrier_t *cb = ca->b; + + barrier_refcnt_inc(cb); + g_assert(0 == counter); + + emit("%s(%d) started as %s", G_STRFUNC, n, thread_name()); + + thread_signal(TSIG_1, test_sighandler); + WFREE(ca); + barrier_wait(cb); + + emit("%s(%d) incrementing counter=%d", G_STRFUNC, n, + atomic_int_get(&counter)); + atomic_int_inc(&counter); + + barrier_wait(cb); + + emit("%s(%d) reincrementing counter=%d", G_STRFUNC, n, + atomic_int_get(&counter)); + atomic_int_inc(&counter); + + barrier_wait(cb); + barrier_free_null(&cb); + + emit("%s(%d) exiting", G_STRFUNC, n); + + return NULL; +} + +static void +test_barrier_one(bool emulated) +{ + int t2, i, n; + barrier_t *cb; + + n = (int) N_ITEMS(t); + cb = barrier_new_full(n + 1, emulated); + counter = 0; + + for (i = 0; i < n; i++) { + struct computer_arg *ca; + WALLOC(ca); + ca->n = i; + ca->b = cb; + ti = thread_create(computer_thread, ca, + THREAD_F_DETACH | THREAD_F_PANIC, 0); + } + + sleep(1); /* Wait until threads have started */ + g_assert(0 == counter); /* Nobody can change that before the barrier */ + + barrier_wait(cb); + emit("%s() reached barrier the first time: threads started", G_STRFUNC); + + barrier_master_wait(cb); + emit("%s() reached barrier the second time as master", G_STRFUNC); + + for (i = 0; i < n; i++) { + if (-1 == thread_kill(ti, TSIG_1)) + s_error("cannot signal processor thread %u: %m", i); + } + + g_assert(n == counter); /* We're the master thread */ + sleep(1); /* and we're the only thread running */ + atomic_int_inc(&counter); + g_assert(n + 1 == counter); /* We're the master thread */ + + emit("%s() releasing threads, counter=%d", G_STRFUNC, counter); + barrier_release(cb); + + barrier_wait(cb); + barrier_free_null(&cb); + emit("%s() computation done, counter=%d (expected is %d)", + G_STRFUNC, counter, 2 * n + 1); + g_assert(2 * n + 1 == counter); +} + +static void +test_barrier(unsigned repeat, bool emulated) +{ + unsigned i; + + TESTING(G_STRFUNC); + + for (i = 0; i < repeat; i++) { + test_barrier_one(emulated); + } +} + +static int dam_counter; + +struct dam_arg { + int n; + dam_t *d; + barrier_t *b; +}; + +static void * +dam_thread(void *arg) +{ + struct dam_arg *da = arg; + int n = da->n; + dam_t *d = da->d; + barrier_t *b= da->b; + + emit("%s(%d) started as %s", G_STRFUNC, n, thread_name()); + + dam_wait(d); + + emit("%s(%d) incrementing counter=%d", G_STRFUNC, n, + atomic_int_get(&dam_counter)); + atomic_int_inc(&dam_counter); + + dam_wait(d); + + emit("%s(%d) reincrementing counter=%d", G_STRFUNC, n, + atomic_int_get(&dam_counter)); + atomic_int_inc(&dam_counter); + + dam_wait(d); /* Dam disabled, will not wait */ + emit("%s(%d) last incrementing counter=%d", G_STRFUNC, n, + atomic_int_get(&dam_counter)); + atomic_int_inc(&dam_counter); + dam_free_null(&d); + + emit("%s(%d) waiting, counter=%d", G_STRFUNC, n, + atomic_int_get(&dam_counter)); + + barrier_wait(b); + barrier_free_null(&b); + + emit("%s(%d) exiting", G_STRFUNC, n); + + return NULL; +} + +static void +test_dam_one(bool emulated) +{ + int t2, i, n; + dam_t *d; + barrier_t *b; + uint key; + + n = (int) N_ITEMS(t); + d = dam_new_full(&key, emulated); + b = barrier_new_full(n + 1, emulated); + atomic_int_set(&dam_counter, 0); + + for (i = 0; i < n; i++) { + struct dam_arg *da; + WALLOC(da); + da->n = i; + da->d = dam_refcnt_inc(d); + da->b = barrier_refcnt_inc(b); + ti = thread_create(dam_thread, da, + THREAD_F_DETACH | THREAD_F_PANIC, 0); + } + + thread_sleep_ms(500); + dam_release(d, key); + thread_sleep_ms(500); + dam_disable(d, key); + barrier_wait(b); + g_assert(3 * n == atomic_int_get(&dam_counter)); + barrier_free_null(&b); + dam_free_null(&d); +} + +static void +test_dam(unsigned repeat, bool emulated) +{ + unsigned i; + + TESTING(G_STRFUNC); + + for (i = 0; i < repeat; i++) { + test_dam_one(emulated); + } +} + +enum memory_alloc { + MEMORY_XMALLOC = 0, + MEMORY_HALLOC = 1, + MEMORY_WALLOC = 2, + MEMORY_VMM = 3, + MEMORY_VMEA = 4 +}; + +struct memory { + enum memory_alloc type; + size_t size; + void *p; +}; + +#define MEMORY_VMM_MIN 4096 +#define MEMORY_VMM_MAX 16384 +#define MEMORY_VMM_PROPORTION 20 + +#define MEMORY_MIN 8 +#define MEMORY_MAX 8192 + +#define MEMORY_ALLOCATIONS 4096 + +struct exercise_results { + size_t amount; /* Amount of allocations / frees */ + time_delta_t alloc_us; /* Allocation time, in microseconds */ + time_delta_t free_us; /* Freeing time, in microseconds */ +}; + +struct exercise_param { + int percentage; /* Random percentage of blocks to free remotely */ +}; + +/* + * This list is filled with memory objects that must be freed by a remote + * thread, randomly. All accesses are protected by a spinlock. + */ +static pslist_t *exercise_list; +static spinlock_t exercise_list_slk = SPINLOCK_INIT; + +#define EXERCISE_LIST_LOCK spinlock(&exercise_list_slk) +#define EXERCISE_LIST_UNLOCK spinunlock(&exercise_list_slk) + +static void +exercise_list_add(const struct memory *m) +{ + EXERCISE_LIST_LOCK; + exercise_list = pslist_prepend_const(exercise_list, WCOPY(m)); + EXERCISE_LIST_UNLOCK; +} + +static void +exercise_list_shuffle_once(void) +{ + EXERCISE_LIST_LOCK; + exercise_list = pslist_shuffle(exercise_list); + EXERCISE_LIST_UNLOCK; +} + +static void +exercise_list_shuffle(void) +{ + static once_flag_t flag; + + once_flag_run(&flag, exercise_list_shuffle_once); +} + +static bool +exercise_list_remove(struct memory *m) +{ + struct memory *mi; + + EXERCISE_LIST_LOCK; + mi = pslist_shift(&exercise_list); + EXERCISE_LIST_UNLOCK; + + if (NULL == mi) + return FALSE; + + *m = *mi; /* Struct copy */ + WFREE(mi); + return TRUE; +} + +static inline void ALWAYS_INLINE +exercise_alloc_memory(struct memory *m) +{ + switch (m->type) { + case MEMORY_XMALLOC: + m->p = xmalloc(m->size); + break; + case MEMORY_HALLOC: + m->p = halloc(m->size); + break; + case MEMORY_WALLOC: + m->p = walloc(m->size); + break; + case MEMORY_VMM: + m->p = vmm_alloc(m->size); + break; + case MEMORY_VMEA: + m->p = vmea_alloc(m->size); + break; + default: + g_assert_not_reached(); + } +} + +static inline void ALWAYS_INLINE +exercise_free_memory(const struct memory *m) +{ + switch (m->type) { + case MEMORY_XMALLOC: + xfree(m->p); + break; + case MEMORY_HALLOC: + hfree(m->p); + break; + case MEMORY_WALLOC: + wfree(m->p, m->size); + break; + case MEMORY_VMM: + vmm_free(m->p, m->size); + break; + case MEMORY_VMEA: + if (!vmea_free(m->p, m->size)) { + s_error("%s(): cannot free %'zu-byte VMEA region at %p", + G_STRFUNC, m->size, m->p); + } + break; + default: + g_assert_not_reached(); + } +} + +static void * +exercise_memory(void *arg) +{ + struct memory *mem; + size_t i, fill, filled; + struct exercise_results *er; + struct exercise_param *ep; + tm_t start, end; + + ep = arg; + + WALLOC(er); + + fill = allocator_fill != 0 ? allocator_fill : MEMORY_ALLOCATIONS; + + XMALLOC_ARRAY(mem, fill); + + for (i = 0, filled = 0; i < fill; i++) { + struct memory *m = &memfilled; + + switch (allocator) { + case 'r': + if (random_value(99) < MEMORY_VMM_PROPORTION) { + m->type = MEMORY_VMM + random_value(1); + m->size = MEMORY_VMM_MIN + + random_value(MEMORY_VMM_MAX - MEMORY_VMM_MIN); + } else { + m->type = random_value(2); + m->size = MEMORY_MIN + random_value(MEMORY_MAX - MEMORY_MIN); + } + break; + case 'e': + m->type = MEMORY_VMEA; + break; + case 'h': + m->type = MEMORY_HALLOC; + break; + case 'v': + m->type = MEMORY_VMM; + break; + case 'w': + m->type = MEMORY_WALLOC; + break; + case 'x': + m->type = MEMORY_XMALLOC; + break; + default: + g_assert_not_reached(); + } + + m->size = 0 != allocator_bsize ? allocator_bsize : + m->type >= MEMORY_VMM ? + MEMORY_VMM_MIN + random_value(MEMORY_VMM_MAX - MEMORY_VMM_MIN) : + MEMORY_MIN + random_value(MEMORY_MAX - MEMORY_MIN); + + if (ep->percentage != 0 && (int) random_value(99) < ep->percentage) { + exercise_alloc_memory(m); + exercise_list_add(m); + } else { + filled++; + } + } + + er->amount = filled; + + tm_now_exact(&start); + for (i = 0; i < filled; i++) { + struct memory *m = &memi; + exercise_alloc_memory(m); + } + tm_now_exact(&end); + + er->alloc_us = tm_elapsed_us(&end, &start); + + if (randomize_free) + SHUFFLE_ARRAY_N(mem, filled); + + tm_now_exact(&start); + for (i = 0; i < filled; i++) { + struct memory *m = &memi; + exercise_free_memory(m); + } + tm_now_exact(&end); + + er->free_us = tm_elapsed_us(&end, &start); + + XFREE_NULL(mem); + + { + size_t remote = fill * ep->percentage / 100; + struct memory m; + + exercise_list_shuffle(); + + while (remote-- && exercise_list_remove(&m)) + exercise_free_memory(&m); + } + + return er; +} + +static void +test_memory_one(struct exercise_results *total, bool posix, int percentage) +{ + long cpus = 0 == cpu_count ? getcpucount() : cpu_count; + int *t, i, n; + pthread_t *p; + struct exercise_param ep; + + n = cpus; + ep.percentage = percentage; + + WALLOC_ARRAY(t, n); + WALLOC_ARRAY(p, n); + + if ('r' == allocator || 'e' == allocator) { + size_t fill = allocator_fill != 0 ? allocator_fill : MEMORY_ALLOCATIONS; + size_t max = fill * MEMORY_VMM_MAX * n; + vmea_reserve(max, FALSE); + } + + for (i = 0; i < n; i++) { + ti = thread_create(exercise_memory, &ep, + THREAD_F_PANIC, THREAD_STACK_MIN); + + if (posix) { + pthread_t pt = posix_thread_create(exercise_memory, &ep, TRUE); + pi = pt; + } + } + + for (i = 0; i < n; i++) { + int j; + + for (j = 0; j < 2; j++) { + int r; + void *e; + struct exercise_results *er; + + switch (j) { + case 0: + r = thread_join(ti, &e); + break; + case 1: + if (!posix) + goto next_thread; + r = pthread_join(pi, &e); + if (r != 0) { + errno = r; + r = -1; + } + break; + default: + g_assert_not_reached(); + } + + if (-1 == r) { + s_error("%s(): could not join with %s: %m", + G_STRFUNC, + 0 == j ? thread_id_name(ti) : "POSIX thread"); + } + + er = e; + total->amount += er->amount; + total->alloc_us += er->alloc_us; + total->free_us += er->free_us; + WFREE(er); + } + + next_thread: + continue; + } + + WFREE_ARRAY(t, n); + WFREE_ARRAY(p, n); + + { + struct memory m; + + while (exercise_list_remove(&m)) + exercise_free_memory(&m); + } + + vmea_close(); +} + +static void +test_memory(unsigned repeat, bool posix, int percentage) +{ + long cpus = 0 == cpu_count ? getcpucount() : cpu_count; + unsigned i; + + TESTING(G_STRFUNC); + + emit("%s() detected %ld CPU%s%s", G_STRFUNC, cpus, plural(cpus), + 0 == cpu_count ? "" : " (forced by -c)"); + + if (randomize_free) + emit("%s() will free blocks in random order", G_STRFUNC); + + for (i = 0; i < repeat; i++) { + tm_t start, end, elapsed; + struct exercise_results total; + + ZERO(&total); + + tm_now_exact(&start); + test_memory_one(&total, posix, percentage); + tm_now_exact(&end); + + tm_elapsed(&elapsed, &end, &start); + + emit("%s() #%d finished! (%f secs, %.3f us/alloc, %.3f us/free)", + G_STRFUNC, i, tm2f(&elapsed), + total.alloc_us / (double) total.amount, + total.free_us / (double) total.amount); + } + + emit("%s() done!", G_STRFUNC); +} + +static int teq_recv_cnt; +static int teq_sent_cnt; +static int teq_callout_cnt; +static bool teq_recv_completed; + +static void * +teq_recv_rpc(void *arg) +{ + s_message("%s(): arg=%p", G_STRFUNC, arg); + return arg; +} + +static void +teq_recv_plain(void *arg) +{ + s_message("%s(): arg=%p", G_STRFUNC, arg); + teq_recv_cnt++; +} + +static void +teq_recv_done(void *arg) +{ + barrier_t *b = arg; + s_message("%s(): arg=%p", G_STRFUNC, arg); + barrier_wait(b); + barrier_free_null(&b); + s_message("%s(): done!", G_STRFUNC); + teq_recv_completed = TRUE; +} + +static void +teq_sent_plain(void *arg) +{ + s_message("%s(): arg=%p", G_STRFUNC, arg); + atomic_int_inc(&teq_sent_cnt); +} + +static void +teq_sent_callout(void *arg) +{ + waiter_t *w = arg; + + s_message("%s(): arg=%p", G_STRFUNC, arg); + teq_callout_cnt++; + waiter_signal(w); + waiter_refcnt_dec(w); +} + +static void * +teq_receiver(void *arg) +{ + barrier_t *b = arg; + + teq_recv_completed = FALSE; + teq_create(); + s_message("%s(): thread event queue installed", G_STRFUNC); + barrier_wait(b); /* Receiver installed event queue */ + barrier_free_null(&b); + s_message("%s(): sender created its thread event queue", G_STRFUNC); + + while (!teq_recv_completed) + thread_sleep_ms(10); + + g_assert(4 == teq_recv_cnt); + + return NULL; +} + +struct teq_sender_arg { + int receiver; + barrier_t *b; +}; + +static void * +teq_sender(void *arg) +{ + struct teq_sender_arg *sa = arg; + waiter_t *w; + void *result; + + teq_create(); + s_message("%s(): thread event queue installed", G_STRFUNC); + barrier_wait(sa->b); /* Wait for receiver to install event queue */ + s_message("%s(): receiver created its thread event queue", G_STRFUNC); + + w = waiter_make(NULL); + + result = teq_rpc(sa->receiver, teq_recv_rpc, w); + g_assert(w == result); + + result = teq_rpc(sa->receiver, teq_recv_rpc, sa); + g_assert(sa == result); + + teq_post(sa->receiver, teq_recv_plain, NULL); + teq_post_ack(sa->receiver, teq_recv_plain, int_to_pointer(1), + TEQ_AM_CALL, teq_sent_plain, int_to_pointer(2)); + teq_post_ack(sa->receiver, teq_recv_plain, int_to_pointer(3), + TEQ_AM_EVENT, teq_sent_plain, int_to_pointer(4)); + teq_post_ack(sa->receiver, teq_recv_plain, int_to_pointer(5), + TEQ_AM_CALLOUT, teq_sent_callout, waiter_refcnt_inc(w)); + + /* Final event will unlock the barrier */ + teq_post(sa->receiver, teq_recv_done, barrier_refcnt_inc(sa->b)); + + barrier_wait(sa->b); /* Waiting for teq_recv_done() */ + s_message("%s(): receiver processed final event", G_STRFUNC); + barrier_free_null(&sa->b); + + g_assert(2 == atomic_int_get(&teq_sent_cnt)); + + waiter_suspend(w); /* Let callout queue event come */ + waiter_refcnt_dec(w); + g_assert(1 == teq_callout_cnt); + + return NULL; +} + +static void +test_teq(unsigned repeat) +{ + TESTING(G_STRFUNC); + + while (repeat--) { + int s, r; + barrier_t *b; + struct teq_sender_arg arg; + + teq_recv_cnt = teq_callout_cnt = 0; + atomic_int_set(&teq_sent_cnt, 0); + + b = barrier_new(2); + r = thread_create(teq_receiver, barrier_refcnt_inc(b), + THREAD_F_PANIC, THREAD_STACK_MIN); + arg.receiver = r; + arg.b = b; + s = thread_create(teq_sender, &arg, THREAD_F_PANIC, THREAD_STACK_MIN); + + thread_join(r, NULL); + thread_join(s, NULL); + } +} + +static void +evq_event(void *arg) +{ + tm_t now; + int id = pointer_to_int(arg); + + tm_now_exact(&now); /* Force accurate timestamp in logging message */ + s_message("%s(%d) called in %s", G_STRFUNC, id, thread_name()); +} + +static void * +evq_one(void *unused_arg) +{ + evq_event_t *eve; + + (void) unused_arg; + + s_message("%s() starting", G_STRFUNC); + + eve = evq_insert(1000, evq_event, NULL); + g_assert(eve != NULL); + evq_cancel(&eve); + g_assert(NULL == eve); + + eve = evq_insert(100, evq_event, int_to_pointer(2)); + g_assert(eve != NULL); + evq_schedule(50, evq_event, int_to_pointer(1)); + thread_sleep_ms(100); + evq_schedule(200, evq_event, int_to_pointer(3)); + evq_schedule(500, evq_event, int_to_pointer(4)); + + thread_sleep_ms(1000); + + evq_cancel(&eve); + + evq_schedule(100, evq_event, NULL); + s_message("%s() exiting -- expect discarding", G_STRFUNC); + return NULL; +} + +static void * +evq_two(void *unused_arg) +{ + (void) unused_arg; + + s_message("%s() starting", G_STRFUNC); + + evq_schedule(200, evq_event, int_to_pointer(2)); + evq_schedule(100, evq_event, int_to_pointer(1)); + evq_schedule(300, evq_event, int_to_pointer(3)); + + thread_sleep_ms(1000); + + s_message("%s() exiting", G_STRFUNC); + return NULL; +} + +static void +test_evq(unsigned repeat) +{ + TESTING(G_STRFUNC); + + while (repeat--) { + int s, r; + + r = thread_create(evq_one, NULL, THREAD_F_PANIC, THREAD_STACK_MIN); + s = thread_create(evq_two, NULL, THREAD_F_PANIC, THREAD_STACK_MIN); + + thread_join(r, NULL); + thread_join(s, NULL); + } +} + +#define INTERRUPTS 5 /* Amount of interrupts we're sending */ + +static int interrupt_count; +static int interrupt_acks; +static volatile bool interrupt_seen_2; + +static void * +intr_process(void *arg) +{ + int n = pointer_to_int(arg); + bool unsafe = signal_in_unsafe_handler(); + + s_info("%s(): got %sinterrupt n=%d", G_STRFUNC, unsafe ? "UNSAFE " : "", n); + + atomic_int_inc(&interrupt_count); + + switch (n) { + case 0: + case 1: + case 3: + if (unsafe) + s_carp("%s(): UNSAFE interrupt trace", G_STRFUNC); + break; + case 2: + s_carp("%s(): showing %strace", G_STRFUNC, unsafe ? "UNSAFE " : ""); + interrupt_seen_2 = TRUE; + atomic_mb(); + break; + case 4: + if (-1 == thread_cancel(thread_small_id())) + s_warning("thread_cancel(self) failed: %m"); + break; + } + + s_info("%s(): done with interrupt n=%d", G_STRFUNC, n); + + return arg; +} + +static void * +intr_thread(void *unused) +{ + int i; + + (void) unused; + + for (i = 0; i < 20; i++) { + s_message("%s(): sleeping for 1 sec", G_STRFUNC); + thread_sleep_ms(1000); + } + + s_error("%s(): something is wrong, missed an interrupt? (got %d)", + G_STRFUNC, interrupt_count); + + return NULL; +} + +static void +intr_acknowledge(void *arg, void *udata) +{ + g_assert(udata == (void *) intr_thread); + g_assert_log(arg == int_to_pointer(1), "arg=%d", pointer_to_int(arg)); + + s_message("%s(): got ack for interrupt n=%d", + G_STRFUNC, pointer_to_int(arg)); + + interrupt_acks++; +} + +static void +test_interrupts(void) +{ + int i, t, err; + + TESTING(G_STRFUNC); + + t = thread_create(intr_thread, NULL, + THREAD_F_PANIC | THREAD_F_WAIT, THREAD_STACK_DFLT); + + for (i = 0; i < INTERRUPTS; i++) { + void *arg = NULL; + notify_data_fn_t cb = NULL; + + /* Signalled thread needs to have seen interrupt #2 before continuing */ + if (i > 2 && !interrupt_seen_2) { + s_message("%s(): waiting for interrupt #2 to be seen", G_STRFUNC); + while (!interrupt_seen_2) { + thread_sleep_ms(100); + } + } + + s_message("%s(): sending interrupt #%d", G_STRFUNC, i); + + /* Interrupt #1 will be acknowledged */ + if (1 == i) { + arg = (void *) intr_thread; + cb = intr_acknowledge; + } + + err = thread_interrupt(t, intr_process, int_to_pointer(i), cb, arg); + if (0 != err) + break; + thread_sleep_ms(100); /* Space interrupts to allow races */ + } + if (err != 0) { + errno = err; + s_warning("%s(): thread_interrupt() failed: %m", G_STRFUNC); + if (-1 == thread_cancel(t)) + s_error("%s(): thread_cancel() failed: %m", G_STRFUNC); + } else { + tm_t start, end; + tm_now_exact(&start); + for ( + i = 0; + i < 300 && INTERRUPTS != atomic_int_get(&interrupt_count); + i++ + ) { + thread_sleep_ms(10); /* Give it time to process interrupts */ + } + tm_now_exact(&end); + s_message("%s(): waited %ld ms for completion", G_STRFUNC, + tm_elapsed_ms(&end, &start)); + } + if (-1 == thread_join(t, NULL)) + s_warning("%s(): thread_join() failed: %m", G_STRFUNC); + + g_assert_log(INTERRUPTS == atomic_int_get(&interrupt_count), + "interrupt_count=%d (expected %d)", interrupt_count, INTERRUPTS); + g_assert_log(1 == interrupt_acks, + "interrupt_acks=%d (expected 1)", interrupt_acks); +} + +static unsigned +get_number(const char *arg, int opt) +{ + int error; + uint32 val; + + val = parse_v32(arg, NULL, &error); + if (0 == val && error != 0) { + fprintf(stderr, "%s: invalid -%c argument \"%s\": %s\n", + getprogname(), opt, arg, g_strerror(error)); + exit(EXIT_FAILURE); + } + + return val; +} + +int +main(int argc, char **argv) +{ + extern int optind; + extern char *optarg; + int c, percentage = 0; + bool create = FALSE, join = FALSE, sem = FALSE, emulated = FALSE; + bool play_tennis = FALSE, monitor = FALSE, noise = FALSE, posix = FALSE; + bool inter = FALSE, forking = FALSE, aqueue = FALSE, rwlock = FALSE; + bool signals = FALSE, barrier = FALSE, overflow = FALSE, memory = FALSE; + bool stats = FALSE, teq = FALSE, cancel = FALSE, dam = FALSE, evq = FALSE; + bool interrupts = FALSE; + unsigned repeat = 1, play_time = 0; + const char options = "a:b:c:ef:hjn:r:st:vwxz:ABCDEFHIKMNOPQRST:VWX"; + + progstart(argc, argv); + thread_set_main(TRUE); /* We're the main thread, we can block */ + crash_init(argv0, getprogname(), 0, NULL); + + misc_init(); + + while ((c = getopt(argc, argv, options)) != EOF) { + switch (c) { + case 'A': /* use asynchronous exit callbacks */ + async_exit = TRUE; + break; + case 'B': /* test synchronization barriers */ + barrier = TRUE; + break; + case 'C': /* test thread creation */ + create = TRUE; + break; + case 'D': /* test synchronization dams */ + dam = TRUE; + break; + case 'E': /* test thread signals ("events") */ + signals = TRUE; + break; + case 'F': /* test thread_fork() */ + forking = TRUE; + break; + case 'H': /* test thread interrupts */ + interrupts = TRUE; + break; + case 'I': /* test inter-thread signaling */ + inter = TRUE; + break; + case 'K': /* test thread cancellation */ + cancel = TRUE; + break; + case 'M': /* monitor tennis match */ + monitor = TRUE; + break; + case 'N': /* add cond_broadcast() noise */ + noise = TRUE; + break; + case 'O': /* test stack overflow */ + overflow = TRUE; + break; + case 'P': /* add extra POSIX threads */ + posix = TRUE; + break; + case 'Q': /* test asynchronous queue */ + aqueue = TRUE; + break; + case 'R': /* test rwlock */ + rwlock = TRUE; + break; + case 'S': /* test semaphore layer */ + sem = TRUE; + break; + case 'T': /* test condition layer */ + play_time = get_number(optarg, c); + play_tennis = TRUE; + break; + case 'V': /* test thread event queue */ + teq = TRUE; + break; + case 'W': /* test event queue */ + evq = TRUE; + break; + case 'X': /* exercise memory allocation */ + memory = TRUE; + break; + case 'a': /* choose allocator for -X tests */ + allocator = *optarg; + break; + case 'b': /* set block size to use for -X tests */ + allocator_bsize = get_number(optarg, c); + break; + case 'c': /* override CPU count */ + cpu_count = get_number(optarg, c); + break; + case 'e': /* use emulated semaphores */ + emulated = TRUE; + break; + case 'f': /* allocator fill count */ + allocator_fill = get_number(optarg, c); + break; + case 'j': /* join threads */ + join = TRUE; + break; + case 'n': /* repeat tests */ + repeat = get_number(optarg, c); + break; + case 'r': /* ratio (percentage) of objects to free remotely */ + percentage = get_number(optarg, c); + break; + case 't': /* condition wait timeout (0 = none) */ + cond_timeout = get_number(optarg, c); + break; + case 's': /* threads sleep for 1 second before ending */ + sleep_before_exit = TRUE; + break; + case 'v': /* dump thread statistics at the end */ + stats = TRUE; + break; + case 'w': /* wait for created threads */ + wait_threads = TRUE; + break; + case 'x': /* free allocated memory by -X tests randomly */ + randomize_free = TRUE; + break; + case 'z': /* zap message from routines using emitz() */ + zap_record(optarg); + break; + case 'h': /* show help */ + default: + usage(); + break; + } + } + + if ((argc -= optind) != 0) + usage(); + + if (!atomic_ops_available()) + s_warning("Atomic memory operations not supported!"); + + if (percentage < 0) { + s_warning("Raising percentage (%d) to 0", percentage); + percentage = 0; + } + + if (percentage > 100) { + s_warning("Capping percentage (%d) to 100", percentage); + percentage = 100; + } + + g_assert(0 == thread_by_name("main")); + + if (interrupts) + test_interrupts(); + + if (aqueue) + test_aqueue(emulated); + + if (rwlock) + test_rwlock(); + + if (sem) + test_semaphore(emulated); + + if (play_tennis) + test_condition(play_time, emulated, monitor, noise); + + if (create) + test_create(repeat, join, posix); + + if (cancel) + test_cancel(repeat, join); + + if (inter) + test_inter(); + + if (forking) { + test_fork(TRUE); + test_fork(FALSE); + } + + if (overflow) + test_overflow(); + + if (signals) + test_signals(); + + if (barrier) + test_barrier(repeat, emulated); + + if (dam) + test_dam(repeat, emulated); + + if (memory) { + switch (allocator) { + case 'r': + break; + case 'e': + emit("Using vmea_alloc() for memory tests"); + break; + case 'h': + emit("Using halloc() for memory tests"); + break; + case 'v': + emit("Using vmm_alloc() for memory tests"); + break; + case 'w': + emit("Using walloc() for memory tests"); + break; + case 'x': + emit("Using xmalloc() for memory tests"); + break; + default: + s_warning("unknown allocator '%c', using random mix", allocator); + allocator = 'r'; + break; + } + if (allocator_bsize != 0) { + emit("Using blocks of %lu byte%s", (ulong) allocator_bsize, + plural(allocator_bsize)); + } + if (posix) + emit("Adding (discovered) POSIX threads"); + if (percentage) + emit("Randomly free %d%% blocks in remote threads", percentage); + test_memory(repeat, posix, percentage); + } + + if (teq) + test_teq(repeat); + + if (evq) + test_evq(repeat); + + /* + * Print final statistics. + */ + + if (stats) { + thread_dump_stats_log(log_agent_stdout_get(), 0); + if (memory) { + switch (allocator) { + case 'r': + halloc_dump_stats_log(log_agent_stdout_get(), 0); + xmalloc_dump_stats_log(log_agent_stdout_get(), 0); + vmm_dump_stats_log(log_agent_stdout_get(), 0); + zalloc_dump_stats_log(log_agent_stdout_get(), 0); + break; + case 'h': + halloc_dump_stats_log(log_agent_stdout_get(), 0); + break; + case 'v': + vmm_dump_stats_log(log_agent_stdout_get(), 0); + break; + case 'w': + zalloc_dump_stats_log(log_agent_stdout_get(), 0); + break; + case 'x': + xmalloc_dump_stats_log(log_agent_stdout_get(), 0); + break; + } + } + } + + exit(EXIT_SUCCESS); /* Required to cleanup semaphores if not destroyed */ +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/thread.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/thread.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Raphael Manfredi + * Copyright (c) 2011-2015 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -25,96 +25,5602 @@ * @ingroup lib * @file * - * Minimal thread support. + * Minimal runtime thread management. * - * This mainly provides support for thread-private data. + * This layer provides support for thread-private data, as well as thread + * tracking (on-the-fly discovery of running threads) and creation of new + * threads. + * + * Discovery works by cooperation with the spinlock/mutex code that we're using, + * providing hooks so that can detect the existence of new threads on the + * fly and track them. + * + * We are not interested by threads that could exist out there and which never + * enter our code somehow, either through a lock (possibly indirectly by + * calling a memory allocation routine) or through logging. + * + * The thread creation interface allows tracking of the threads we launch + * plus provides the necessary hooks to cleanup the malloc()ed objects, the + * thread-private data and makes sure no locks are held at strategic places. + * + * It is possible to use inter-thread signals via thread_kill() and process + * them via handlers installed via thread_signal(), with full thread signal + * mask support. These inter-thread signals are implemented without relying + * on the underlying kernel signal support, which makes them fully portable. + * They are "safe" in that signals are only dispatched to threads which are + * not in a critical section, as delimited by locks; hence we are certain to + * never interrupt another thread within a critical section. + * + * We support two APIs for thread-private data: + * + * - via thread_private_xxx() routines (unlimited amount, flexible, slower) + * - via thread_local_xxx() routines (limited amount, rigid, faster) + * + * The thread_private_xxx() flavour is implemented as a hash table and does + * not require pre-declaration of keys. Each value can also be given a + * dedicated free routine, with an additional contextual argument that can vary. + * + * The thread_local_xxx() flavour is implemented as a sparse array and requires + * pre-declaration of keys, All the values associated to a given key must share + * the same free routine and there is no provision for an additional contextual + * argument. * * @author Raphael Manfredi - * @date 2011 + * @date 2011-2015 */ #include "common.h" +#ifdef I_SCHED +#include <sched.h> /* For sched_yield() */ +#endif + #define THREAD_SOURCE /* We want hash_table_new_real() */ #include "thread.h" -#include "atoms.h" /* For binary_hash() */ + +#include "alloca.h" /* For alloca_stack_direction() */ +#include "atomic.h" +#include "atoms.h" +#include "barrier.h" +#include "buf.h" +#include "compat_gettid.h" +#include "compat_poll.h" +#include "compat_sleep_ms.h" +#include "compat_usleep.h" +#include "cond.h" +#include "constants.h" /* For constant_str() */ +#include "cq.h" +#include "crash.h" /* For crash_hook_add(), print_str() et al. */ +#include "dam.h" +#include "dump_options.h" +#include "entropy.h" +#include "eslist.h" +#include "evq.h" +#include "fd.h" /* For fd_close() */ +#include "gentime.h" +#include "glib-missing.h" /* For g_strlcpy() */ +#include "hashing.h" /* For binary_hash() */ #include "hashtable.h" +#include "log.h" +#include "mem.h" +#include "misc.h" /* For is_strprefix() et al. */ +#include "mutex.h" +#include "omalloc.h" +#include "once.h" +#include "pow2.h" +#include "pslist.h" +#include "rwlock.h" +#include "semaphore.h" /* For semaphore_kernel_usage() */ +#include "sha1.h" +#include "signal.h" /* For signal_stack_allocate() */ +#include "slist.h" #include "spinlock.h" +#include "stacktrace.h" +#include "str.h" +#include "stringify.h" +#include "tm.h" +#include "unsigned.h" +#include "vmm.h" #include "walloc.h" +#include "xmalloc.h" /* For xmalloc_thread_cleanup() */ +#include "zalloc.h" #include "override.h" /* Must be the last header included */ /** + * To quickly access thread-private data, we introduce the notion of Quasi + * Thread Ids, or QIDs: they are not unique for a given thread but no two + * threads can have the same QID at a given time. + */ +#define THREAD_QID_BITS 8 /**< QID bits used for hashing */ +#define THREAD_QID_CACHE (1U << THREAD_QID_BITS) /**< QID cache size */ + +#define THREAD_LOCK_MAX 320 /**< Max amount of locks held per thread */ +#define THREAD_LOCK_NESTED 8 /**< Max nested lock depth per thread */ +#define THREAD_FOREIGN 8 /**< Amount of "foreign" threads we allow */ +#define THREAD_CREATABLE (THREAD_MAX - THREAD_FOREIGN) + +/** + * This is the time we wait after a "detached" thread we created has exited + * before attempting to join with it in the callout queue thread and free + * its stack. + * + * It is also used for discovered threads which we are told are gone, to defer + * the reuse of their thread element a little bit. + */ +#define THREAD_HOLD_TIME 20 /**< in ms, keep dead thread before reuse */ + +/** + * Grace time for discovered threads, before allowing their thread element + * to be reused. + */ +#define THREAD_GRACE_TIME 1000 /**< in ms, grace time before reuse */ + +#define THREAD_SUSPEND_CHECK 4096 +#define THREAD_SUSPEND_CHECKMASK (THREAD_SUSPEND_CHECK - 1) +#define THREAD_SUSPEND_LOOP 100 +#define THREAD_SUSPEND_DELAY 2000 /* us */ +#define THREAD_SUSPEND_PAUSING 1000000 /* us, 1 sec */ +#define THREAD_SUSPEND_TIMEOUT 30 /* seconds */ + +/** + * Amount of stack frames we keep when we capture a backtrace on blocking + * points, to trace back the strategic spots later on. + */ +#define THREAD_DEPTH_MAX 32 /**< Stack frame depth on block points */ + +enum thread_backtrace_type { + THREAD_BT_NONE = 0, /**< None, structure was invalidated */ + THREAD_BT_ANY, /**< Generic stack request */ + THREAD_BT_LOCK, /**< Waiting for a lock */ +}; + +/** + * A thread backtrace. + */ +struct thread_backtrace { + void *framesTHREAD_DEPTH_MAX; /**< The captured frames */ + tm_t stamp; /**< When capture was made */ + size_t count; /**< Amount of valid frames */ + enum thread_backtrace_type type; /**< Type of capture made */ +}; + +#ifdef HAS_SOCKETPAIR +#define INVALID_FD INVALID_SOCKET +#else +#define INVALID_FD -1 +#endif + +/** + * This is the maximum amount of time we allow the main thread to block, even + * if it is configured as non-blocking. + */ +#define THREAD_MAIN_DELAY_MS 5000 /* ms */ + +/** + * A recorded lock. + */ +struct thread_lock { + const void *lock; /**< Lock object address */ + const char *file; /**< Place where lock was grabbed */ + unsigned line; /**< Place where lock was grabbed */ + enum thread_lock_kind kind; /**< Kind of lock recorded */ +}; + +/* + * A lock stack. + */ +struct thread_lock_stack { + struct thread_lock *arena; /**< The actual stack */ + size_t capacity; /**< Amount of entries available */ + size_t count; /**< Amount of entries held */ + uint8 overflow; /**< Set if stack overflow detected */ +}; + +/** * A thread-private value. */ struct thread_pvalue { void *value; /**< The actual value */ - thread_pvalue_free_t p_free; /**< Optional free routine */ + free_data_fn_t p_free; /**< Optional free routine */ void *p_arg; /**< Optional argument to free routine */ }; +enum thread_lkey_state { + THREAD_LKEY_UNUSED = 0, /**< Key is unused */ + THREAD_LKEY_USED = 1, /**< Key is used normally */ + THREAD_LKEY_DESTROYING = 2, /**< Key is being destroyed */ +}; + +/** + * A thread-local key slot. + */ +struct thread_lkey { + enum thread_lkey_state used; /**< Is key slot used? */ + free_fn_t freecb; /**< Optional free routine */ +}; + +/** + * Special free routine for thread-private value which indicates that the + * thread-private entry must not be reclaimed when the thread exists. + */ +#define THREAD_PRIVATE_KEEP ((free_data_fn_t) 1) + +/** + * Special free routine argument for thread_private_update_extended to + * indicate that the free routine must be removed. + */ +#define THREAD_PRIVATE_NOFREE ((free_data_fn_t) 3) + +/** + * Thread local storage is organized as a sparse array with 1 level of + * indirection, so as to not waste memory when only a fraction of the + * whole key space is used. + * + * For instance, if L1_SIZE=8 and L2_SIZE=8, we can store 8*8 = 64 values + * max per thread. Keys 0..7 are in the page referenced at slot=0 in the L1 + * page. Keys 8..15 are in the page referenced at slot=1, etc... + */ +#define THREAD_LOCAL_L2_SIZE 32 +#define THREAD_LOCAL_L1_SIZE \ + ((THREAD_LOCAL_MAX + THREAD_LOCAL_L2_SIZE - 1) / THREAD_LOCAL_L2_SIZE) + +#define THREAD_LOCAL_INVALID ((free_fn_t) 2) + +static struct thread_lkey thread_lkeysTHREAD_LOCAL_MAX; +static size_t thread_lkeys_used; +static spinlock_t thread_local_slk = SPINLOCK_INIT; + +/** + * Thread exit callback. + * + * These callbacks are invoked from thread_exit(), either synchronously in + * the reverse order they were registered, or asynchronously when a thread + * was created with the THREAD_F_ASYNC_EXIT flag (in which case the order is + * undefined). + */ +struct thread_exit_cb { + thread_exit_t exit_cb; /**< Optional exit callback */ + void *exit_arg; /**< Exit callback argument */ + slink_t lnk; /**< Forward embedded pointer */ +}; + +/** + * A thread diversion. + * + * A diversion is a processing callback that we can install through + * thread_divert() and which will be invoked by a suspended or blocked + * thread. + */ +struct thread_divert_cb { + process_fn_t divert; /**< Diversion routine */ + void *arg; /**< Argument to pass */ + int suspend; /**< Original suspend count in thread */ +}; + +enum thread_interrupt_magic { THREAD_INTR_MAGIC = 0x4be53278 }; + +/** + * A thread interrupt. + * + * An interrupt is a processing callback that we can install through + * thread_interrupt() and which will be invoked immediately by the thread + * before resuming its normal operations. + * + * Contrary to a diversion, this can really interrupt any processing, meaning + * the interrupt routine can run in a context where locks are already held. + * + * Optionally, a completion callback can be installed and it will be invoked + * as soon as the interrupted thread terminates the execution of intr(). + * The first argument of completed() will be the result of intr(), the second + * is the user argument passed when the interrupt was registered. + * + * The optional completion callback is invoked in the context of the thread + * that launched the interrupt request, through the reception of a TSIG_INTACK + * signal. It is imperative that the TSIG_INTACK signal be not blocked by the + * thread which attempts to use thread_interrupt(). + */ +struct thread_interrupt_cb { + enum thread_interrupt_magic magic; + process_fn_t intr; /**< Interrupt routine */ + void *arg; /**< Argument to pass to intr() */ + void *result; /**< Result of the intr() routine */ + notify_data_fn_t completed; /**< Optional completion callback */ + void *udata; /**< User argument to pass to completed() */ + slink_t lnk; /**< Forward embedded pointer */ + uint stid; /**< Interrupting thread */ +}; + +static inline void +thread_interrupt_cb_check(const struct thread_interrupt_cb * const ti) +{ + g_assert(ti != NULL); + g_assert(THREAD_INTR_MAGIC == ti->magic); +} + +#define THREAD_DIVERT_DELAY 5000 /* us */ + +/** + * Thread cleanup callbacks. + * + * They are invoked when thread exits explicitly or is cancelled, in the + * reverse order they were registered, in the context of the thread that + * registered them. + * + * Contrary to thread exit callbacks, these cleanup callbacks are meant to + * be pushed and poped in the same lexical context, because the argument may + * refer to a structure that lies on the stack. + */ +struct thread_cleanup_cb { + notify_fn_t cleanup_cb; /**< The cleanup callback */ + void *data; /**< Argument passed to the callback */ + slink_t lnk; /**< Forward embedded pointer */ + /* Information helping ensure correct usage */ + const void *sp; /**< Stack pointer at registration time */ + const char *routine; /**< Routine registering the callback */ + const char *file; /**< File where registration occurred */ + unsigned line; /**< Line number within file */ +}; + +enum thread_element_magic { THREAD_ELEMENT_MAGIC = 0x3240eacc }; + +/** + * A thread element, describing a thread. + */ +struct thread_element { + enum thread_element_magic magic; + systid_t system_thread_id; /**< System thread ID (for Windows) */ + pthread_t ptid; /**< Full thread info, for joining */ + thread_t tid; /**< The thread ID */ + thread_qid_t last_qid; /**< The last QID used to access record */ + thread_qid_t low_qid; /**< The lowest possible QID */ + thread_qid_t high_qid; /**< The highest possible QID */ + thread_qid_t top_qid; /**< The topmost QID seen on the stack */ + thread_qid_t low_sig_qid; /**< The lowest possible QID on sigstack */ + thread_qid_t high_sig_qid; /**< The highest possible QID on sigstack*/ + hash_table_t *pht; /**< Private hash table */ + unsigned stid; /**< Small thread ID */ + time_t last_seen; /**< Last seen time for discovered thread */ + const void *last_sp; /**< Last stack pointer seen */ + const void *top_sp; /**< Highest stack pointer seen */ + const char *name; /**< Thread name, explicitly set */ + size_t stack_size; /**< For created threads, 0 otherwise */ + void *stack; /**< Allocated stack (including guard) */ + void *stack_base; /**< Base of the stack (computed) */ + void *sig_stack; /**< Alternate signal stack */ + func_ptr_t entry; /**< Thread entry point (created threads) */ + const void *argument; /**< Initial thread argument, for logging */ + const char *entry_name; /**< Symbolic name of thread entry point */ + int suspend; /**< Suspension request(s) */ + int pending; /**< Pending messages to emit */ + socket_fd_t wfd2; /**< For the block/unblock interface */ + unsigned joining_id; /**< ID of the joining thread */ + unsigned unblock_events; /**< Counts unblock events received */ + void *exit_value; /**< Final thread exit value */ + tsigset_t sig_mask; /**< Signal mask */ + tsigset_t sig_pending; /**< Signals pending delivery */ + unsigned signalled; /**< Unblocking signal events sent */ + unsigned sig_generation; /**< Signal reception generation number */ + int in_signal_handler; /**< Counts signal handler nesting */ + bool sig_handling; /**< Are we in thread_sig_handle()? */ + int sleep_interruptible; /**< Shall a signal interrupt blocking? */ + uint termination_key; /**< For releasing the termination dam */ + uint created:1; /**< Whether thread created by ourselves */ + uint discovered:1; /**< Whether thread was discovered */ + uint running:1; /**< Whether thread is running */ + uint deadlocked:1; /**< Whether thread reported deadlock */ + uint valid:1; /**< Whether thread is valid */ + uint creating:1; /**< Whether thread is being created */ + uint exiting:1; /**< Whether thread is exiting */ + uint suspended:1; /**< Whether thread is suspended */ + uint blocked:1; /**< Whether thread is blocked */ + uint timed_blocked:1; /**< Whether thread blocking with timeout */ + uint unblocked:1; /**< Whether unblocking was requested */ + uint detached:1; /**< Whether thread is detached */ + uint join_requested:1; /**< Whether thread_join() was requested */ + uint join_pending:1; /**< Whether thread exited, pending join */ + uint reusable:1; /**< Whether element is reusable */ + uint async_exit:1; /**< Whether exit callback done in main */ + uint main_thread:1; /**< Whether this is the main thread */ + uint cancelled:1; /**< Whether thread has been cancelled */ + uint cancelable:1; /**< Whether thread is cancelable */ + uint sleeping:1; /**< Whether thread is sleeping */ + uint exit_started:1; /**< Started to process exiting */ + uint gone:1; /**< Discovered thread is gone */ + uint atomic_name:1; /**< Whether name is an atomic string */ + uint stack_overflow:1; /**< Stack overflow was detected */ + uint in_syscall:1; /**< Thread in a system call, no locks */ + uint recursive_lockwait:1; /**< Detected recursive lock waiting */ + bool add_monitoring; /**< Must reinstall thread monitoring */ + bool gone_seen; /**< Flagged activity from gone thread */ + enum thread_cancel_state cancl; /**< Thread cancellation state */ + struct thread_lock_stack locks; /**< Locks held by thread */ + struct thread_lock_stack waits; /**< Locks on which thread is waiting */ + cond_t *cond; /**< Condition on which thread waits */ + slist_t *cond_stack; /**< Stack of condition-waiting variables */ + dam_t *termination; /**< Waiters on thread termination */ + spinlock_t lock; /**< Protects concurrent updates */ + eslist_t exit_list; /**< List of exit callbacks to invoke */ + eslist_t cleanup_list; /**< List of cleanup callbacks to invoke */ + eslist_t interrupt_list; /**< List of interrupts to invoke */ + eslist_t interrupt_ack_list; /**< List of interrupts to invoke */ + mutex_t interrupt_lock; /**< Mutex protecting interrupt_list */ + mutex_t interrupt_ack_lock; /**< Mutex protecting interrupt_ack_list */ + struct thread_backtrace btrace; /**< Captured backtrace */ + tsighandler_t sighTSIG_COUNT - 1; /**< Signal handlers */ + void **localsTHREAD_LOCAL_L1_SIZE; /**< Thread-local variables */ + struct thread_divert_cb *div; /**< Diversion -- see thread_divert() */ +}; + +static inline void +thread_element_check(const struct thread_element * const te) +{ + g_assert(te != NULL); + g_assert(THREAD_ELEMENT_MAGIC == te->magic); +} + +#define THREAD_LOCK(te) spinlock_raw(&(te)->lock) +#define THREAD_TRY_LOCK(te) spinlock_hidden_try(&(te)->lock) +#define THREAD_UNLOCK(te) spinunlock_raw(&(te)->lock) + +/** + * Thread statistics. + * + * To minimize lock grabbing overhead, we update these using atomic memory + * operations only. For 32-bit counters that could overflow, we keep a low + * and a high counter. + */ +static struct thread_stats { + uint created; /* Amount of created threads */ + uint discovered; /* Amount of discovered threads */ + AU64(qid_cache_lookup); /* Amount of QID lookups in the cache */ + AU64(qid_cache_hit); /* Amount of QID hits */ + AU64(qid_cache_false_hit); /* False QID hits (discovered threads) */ + AU64(qid_cache_self_check); /* Check thread using thread_self() */ + AU64(qid_cache_clash); /* Amount of QID clashes */ + AU64(qid_cache_miss); /* Amount of QID lookup misses */ + AU64(lookup_by_qid); /* Amount of thread lookups by QID */ + AU64(lookup_by_tid); /* Amount of thread lookups by TID */ + AU64(locks_tracked); /* Amount of locks tracked */ + AU64(locks_tracked_discovered); /* Locks tracked on discovered threads */ + AU64(locks_released); /* Amount of locks released after grab */ + AU64(locks_spinlock_tracked); /* Amount of tracked spinlocks */ + AU64(locks_mutex_tracked); /* Amount of tacked mutexes */ + AU64(locks_rlock_tracked); /* Amount of tracked read-locks */ + AU64(locks_wlock_tracked); /* Amount of tracked write-locks */ + AU64(locks_spinlock_contention);/* Amount of contentions on spinlocks */ + AU64(locks_mutex_contention); /* Amount of contentions on mutex */ + AU64(locks_rlock_contention); /* Amount of contentions on read-locks */ + AU64(locks_wlock_contention); /* Amount of contentions on write-locks */ + AU64(locks_spinlock_sleep); /* Amount of sleeps done on spinlocks */ + AU64(locks_mutex_sleep); /* Amount of sleeps done on mutexes */ + AU64(locks_rlock_sleep); /* Amount of sleeps done on read-locks */ + AU64(locks_wlock_sleep); /* Amount of sleeps done on write-locks */ + AU64(locks_nested_sleeps); /* Amount of nested sleeps done on locks */ + AU64(cond_waitings); /* Amount of condition variable waitings */ + AU64(cond_nested_waitings); /* Nested condition variable waitings */ + AU64(signals_posted); /* Amount of signals posted to threads */ + AU64(signals_handled); /* Amount of signal handlers called */ + AU64(signals_ignored); /* Amount of signals got with no handler */ + AU64(sig_handled_count); /* Amount of calls to thread_sig_handle() */ + AU64(sig_handled_while_blocked);/* Signals handled whilst thread blocked */ + AU64(sig_handled_while_paused); /* Signals handled whilst paused */ + AU64(sig_handled_while_check); /* Signals handled via voluntary check */ + AU64(sig_handled_while_locking);/* Signals handled during locking */ + AU64(sig_handled_while_unlocking); /* Signals handled during unlocking */ + AU64(thread_self_blocks); /* Voluntary internal thread blocks */ + AU64(thread_self_pauses); /* Calls to thread_pause() */ + AU64(thread_self_suspends); /* Threads seeing they need to suspend */ + AU64(thread_self_block_races); /* Detected races in thread_self_block() */ + AU64(thread_self_pause_races); /* Detected races in thread_sigsuspend() */ + AU64(thread_self_calls); /* Amount of thread_self() calls made */ + AU64(thread_forks); /* Amount of thread_fork() calls made */ + AU64(thread_yields); /* Amount of thread_yield() calls made */ + AU64(thread_syscalls); /* Amount of syscalls declared */ + AU64(thread_syscalls_dups); /* Syscalls declared whilst in syscall! */ + AU64(thread_syscalls_with_locks); /* Amount of syscalls made with locks */ + AU64(thread_syscalls_recursions); /* Recursions avoided */ + AU64(thread_syscalls_locking); /* Locks taken whilst in syscall mode */ + AU64(thread_interrupts); /* Amount of interrupts (kernel signals) */ + AU64(thread_safe_interrupts); /* Amount of interrupts deemded safe */ + AU64(thread_stats_digest); /* Amount of calls to compute SHA1 digest */ +} thread_stats; + +#define THREAD_STATS_INCX(name) AU64_INC(&thread_stats.name) +#define THREAD_STATS_INC(name) atomic_uint_inc(&thread_stats.name) + +#define THREAD_STATS_DECX(name) AU64_DEC(&thread_stats.name) + +/** + * Private zones. + * + * We use raw zalloc() instead of walloc() to minimize the amount of layers + * upon which this low-level service depends. + * + * Furthermore, each zone is allocated as an embedded item to avoid any + * allocation via xmalloc(): it solely depends on the VMM layer, the zone + * descriptor being held at the head of the first zone arena. + */ +static zone_t *pvzone; /* For private values */ +static once_flag_t pvzone_inited; + +/** + * Array of threads, by small thread ID. + */ +static struct thread_element *threadsTHREAD_MAX; + +/** + * This array is updated during the creation of a new thread element. + * + * Its purpose is to be able to return a thread small ID whilst we are in + * the process of creating that thread element, for instance if we have to + * call a logging routine as part of the thread creation. + * + * It is also used to find the thread element without requiring any locking, + * by mere linear probing. + */ +static thread_t tstidTHREAD_MAX; /* Maps STID -> thread_t */ + +/** + * This variable allows us to manage the initial allocation of thread small IDs + * until we have allocated all the thread elements in the threads array. + * + * It records the next allocated ID, and is atomotically incremented each time + * we need a new thread small ID. + */ +static unsigned thread_allocated_stid; + +/** + * Small thread ID. + * + * We count threads as they are seen, starting with 0. + * + * This variable holds the index in threads of the next entry that we + * should use if we cannot reuse an earlier entry. It is the number of + * valid thread_element structures we have present. + */ +static unsigned thread_next_stid; +static spinlock_t thread_next_stid_slk = SPINLOCK_INIT; + +/** + * Pre-allocated next thread element. + * + * Because we cannot create the current thread element for a discovered thread + * on the fly (whilst holding the global thread mutex, we cannot attempt to + * allocate memory since memory allocators are going to acquire locks and the + * current thread does not have its thread element yet), each thread we create + * is responsible for pre-allocating the next thread element to be used. + * + * These two variables are only handled under the global "thread_insert_mtx" + * mutex protection. + */ +static unsigned thread_allocated_count; +static struct thread_element *thread_next_te; + +/** + * QID cache. + * + * This is an array indexed by a hashed QID and it enables fast access to a + * thread element, without locking. + * + * The method used is the following: the QID is computed for the thread and + * then the cache is accessed to see which thread element it refers to. If an + * entry is found, its last_qid field is compared to the current QID and if it + * matches, then we found the item we were looking for. + * + * Otherwise (no entry in the cache or the last_qid does not match), a full + * lookup is done based on the known QIDs seen so far, to locate the thread + * element using that QID range. + * + * Because a QID is unique only given a fixed set of threads, it is necessary + * to clear the cache when a new thread is created or discovered to remove + * potentially conflicting entries. + * + * To minimize the size of the cache in memory and make it more cache-friendly + * from the CPU side, we do not point to thread elements but to thread IDs, + * which can be stored with less bits. + */ +static uint8 thread_qid_cacheTHREAD_QID_CACHE; + +static bool thread_inited; +static int thread_pagesize = 4096; /* Safe default: 4K pages */ +static int thread_pageshift = 12; /* Safe default: 4K pages */ +static int thread_sp_direction; /* Stack growth direction */ +static bool thread_panic_mode; /* STID overflow, most probably */ +static size_t thread_reused; /* Counts reused thread elements */ +static uint thread_main_stid = -1U; /* STID of the main thread */ +static bool thread_main_can_block; /* Can the main thread block? */ +static bool thread_set_main_called; /* Was thread_set_main() called? */ +static uint thread_pending_reuse; /* Threads waiting to be reused */ +static uint thread_running; /* Created threads running */ +static uint thread_discovered; /* Amount of discovered threads */ +static bool thread_stack_noinit; /* Whether to skip stack allocation */ +static int thread_crash_mode_enabled; /* Whether we entered crash mode */ +static int thread_crash_mode_stid = -1; /* STID of the crashing thread */ +static int thread_locks_disabled; /* Whether locks were disabled */ +static uint thread_suspend_depth; /* Maintains suspension depth */ + +static mutex_t thread_insert_mtx = MUTEX_INIT; +static mutex_t thread_suspend_mtx = MUTEX_INIT; + +static void thread_lock_dump(const struct thread_element *te); +static void thread_exit_internal(void *value, const void *sp) G_NORETURN; +static void thread_will_exit(void *arg); +static void thread_crash_hook(void); +static void thread_stack_overflow(struct thread_element *te) G_NORETURN; +static void thread_divert_run(struct thread_element *te); +static void thread_divert_handle(int signo); +static void thread_interrupt_handle(int signo); +static void thread_interrupt_ack_handle(int signo); + +/** + * Low-level unique thread ID. + */ +thread_t +thread_self(void) +{ + union { + thread_t t; + pthread_t pt; + } u; + + STATIC_ASSERT(sizeof(thread_t) <= sizeof(pthread_t)); + + THREAD_STATS_INCX(thread_self_calls); + + /* + * We truncate the pthread_t to the first "unsigned long" bytes. + * + * On Linux, pthread_t is already an unsigned long. + * On FreeBSD, pthread_t is a pointer, which fits in unsigned long. + * + * On Windows, pthread_t is a structure, whose first member is a pointer. + * And we don't want to use the whole pthread_t structure there, because + * the second member is changing over time and we want a unique thread + * identifier. + */ + + u.pt = pthread_self(); + + return u.t; +} + +/** + * Yield CPU time for current thread. + */ +void +thread_yield(void) +{ + THREAD_STATS_INCX(thread_yields); + +#ifdef HAS_SCHED_YIELD + do_sched_yield(); /* See lib/mingw32.h */ +#else + compat_usleep_nocancel(0); +#endif /* HAS_SCHED_YIELD */ +} + +/** + * @return total amount of locks known for the thread. + */ +static inline size_t +thread_element_lock_count(const struct thread_element *te) +{ + return te->locks.count; +} + +/** + * Are there signals present for the thread? + */ +static inline bool +thread_sig_present(const struct thread_element *te) +{ + return 0 != (~te->sig_mask & te->sig_pending); +} + +/** + * Are there signals pending for the thread that can be delivered? + */ +static inline bool +thread_sig_pending(const struct thread_element *te) +{ + return 0 == thread_element_lock_count(te) && thread_sig_present(te); +} + +/** + * Compare two stack pointers according to the stack growth direction. + * A pointer is larger than another if it is further away from the base. + */ +static inline int +thread_stack_ptr_cmp(const void *a, const void *b) +{ + return thread_sp_direction > 0 ? ptr_cmp(a, b) : ptr_cmp(b, a); +} + +/** + * Compute the stack offset, for a pointer that is "above" the stack base. + */ +static inline size_t +thread_stack_ptr_offset(const void *base, const void *sp) +{ + return thread_sp_direction > 0 ? ptr_diff(sp, base) : ptr_diff(base, sp); +} + +/** + * Create the private value zone. + */ +static void +thread_pvzone_init_once(void) +{ + pvzone = zcreate(sizeof(struct thread_pvalue), 0, TRUE); +} + +/** + * Initialize pvzone if not already done. + */ +static inline void ALWAYS_INLINE +thread_pvzone_init(void) +{ + ONCE_FLAG_RUN(pvzone_inited, thread_pvzone_init_once); +} + +/** + * Free a thread-private value. + */ +static void +thread_pvalue_free(struct thread_pvalue *pv) +{ + g_assert(pv->p_free != THREAD_PRIVATE_KEEP); + + if (pv->p_free != NULL) + (*pv->p_free)(pv->value, pv->p_arg); + zfree(pvzone, pv); +} + +/** + * @return English description for backtrace types. + */ +static const char * +thread_backtrace_type_to_string(const enum thread_backtrace_type type) +{ + switch (type) { + case THREAD_BT_ANY: return "generic"; + case THREAD_BT_NONE: return "obsolete"; + case THREAD_BT_LOCK: return "lock"; + } + + return "UNKNOWN"; +} + +/** + * Capture a backtrace of given type for thread element (current thread). + * + * @param te the thread element of the current thread + * @param type the type of stacktrace to capture + */ +static void +thread_backtrace_capture( + struct thread_element *te, enum thread_backtrace_type type) +{ + struct thread_backtrace *bt = &te->btrace; + + g_assert(type != THREAD_BT_ANY); + + tm_now_exact(&bt->stamp); + bt->type = type; + bt->count = stacktrace_unwind(bt->frames, N_ITEMS(bt->frames), 2); +} + +/** + * Check whether we have a valid backtrace of given type for specified thread. + * + * @param te the thread element which we want to inspect + * @param type the type of stacktrace we would want (any if THREAD_BT_ANY) + */ +static bool +thread_backtrace_has( + const struct thread_element *te, enum thread_backtrace_type type) +{ + const struct thread_backtrace *bt = &te->btrace; + + return bt->count != 0 && (THREAD_BT_ANY == type || bt->type == type); +} + +/** + * Invalidate a backtrace of given type for thread element (current thread). + * + * @param te the thread element holding the backtrace + * @param type the type of stacktrace to invalidate + */ +static void +thread_backtrace_invalidate( + struct thread_element *te, enum thread_backtrace_type type) +{ + struct thread_backtrace *bt = &te->btrace; + + if (thread_backtrace_has(te, type)) + bt->type = THREAD_BT_NONE; +} + +/** + * Dump a symbolic backtrace of some specific type to file. + * + * @param fd the file descriptor on which we want to dump the stack + * @param te the thread element which we want to inspect + * @param type the type of stacktrace we would want + */ +static void +thread_backtrace_dump_type_fd(int fd, + const struct thread_element *te, enum thread_backtrace_type type) +{ + const struct thread_backtrace *bt = &te->btrace; + char deltaSIZE_FIELD_MAX; + char tbufUINT_DEC_BUFLEN; + time_delta_t elapsed; + tm_t now; + DECLARE_STR(11); + char attributes40; + str_t str, *s = &str; + const char *tnum; + + if (!thread_backtrace_has(te, type)) + return; + + tm_now_exact_raw(&now); + elapsed = tm_elapsed_ms(&now, &bt->stamp); + compact_time_ms_to_buf(elapsed, delta, sizeof delta); + + str_new_buffer(s, attributes, 0, sizeof attributes); + if (te->reusable) { + if (te->cancelled) STR_CAT(s, "cancelled"); + else STR_CAT(s, "terminated"); + } else { + if (te->discovered) { + if (0 != str_len(s)) STR_CAT(s, ", "); + STR_CAT(s, "discovered"); + } else { + if (0 != str_len(s)) STR_CAT(s, ", "); + if (te->running) STR_CAT(s, "running"); + else STR_CAT(s, "creating"); + } + if (te->exit_started) { + if (0 != str_len(s)) STR_CAT(s, ", "); + if (te->cancelled) STR_CAT(s, "cancelled"); + else if (te->join_pending) STR_CAT(s, "exited"); + else STR_CAT(s, "exiting"); + } + if (te->suspend || te->suspended) { + if (0 != str_len(s)) STR_CAT(s, ", "); + if (te->suspended) STR_CAT(s, "suspended"); + else STR_CAT(s, "suspending"); + } + } + + print_str("---- "); /* 0 */ + print_str(thread_backtrace_type_to_string(bt->type)); /* 1 */ + print_str(" stack captured for {"); /* 2 */ + if (te->name != NULL) { + print_str("thread \""); /* 3 */ + print_str(te->name); /* 4 */ + print_str("\""); /* 5 */ + } else { + tnum = PRINT_NUMBER(tbuf, te->stid); + print_str("thread #"); /* 3 */ + print_str(tnum); /* 4 */ + } + print_str(" ("); /* 6 */ + print_str(str_2c(s)); /* 7 */ + print_str(")} "); /* 8 */ + + print_str(delta); /* 9 */ + print_str(" ago:\n"); /* 10 */ + flush_str(fd); + + stacktrace_stack_safe_print(fd, te->stid, bt->frames, bt->count); + + rewind_str(0); + print_str("---- done with "); /* 0 */ + print_str(thread_backtrace_type_to_string(bt->type)); /* 1 */ + print_str(" stack captured for "); /* 2 */ + if (te->name != NULL) { + print_str("thread \""); /* 3 */ + print_str(te->name); /* 4 */ + print_str("\""); /* 5 */ + } else { + tnum = PRINT_NUMBER(tbuf, te->stid); + print_str("thread #"); /* 3 */ + print_str(tnum); /* 4 */ + } + print_str(".\n"); /* 6 */ + flush_str(fd); +} + +/** + * Prepare the global signal handler to process thread interrupts. + */ +static void G_COLD +thread_interrupt_setup(void) +{ + STATIC_ASSERT(THREAD_SIGINTR < SIGNAL_COUNT); + + signal_set(THREAD_SIGINTR, thread_interrupt_handle); +} + +/** + * Initialize global configuration. + */ +static void G_COLD +thread_init(void) +{ + static spinlock_t thread_init_slk = SPINLOCK_INIT; + + spinlock_hidden(&thread_init_slk); + + if G_LIKELY(!thread_inited) { + thread_pagesize = compat_pagesize(); + thread_pageshift = ctz(thread_pagesize); + thread_sp_direction = alloca_stack_direction(); + thread_inited = TRUE; + + thread_interrupt_setup(); + } + + spinunlock_hidden(&thread_init_slk); +} + +/** + * Allocate a thread lock stack at a specified capacity. + */ +static void +thread_lock_stack_allocate(struct thread_lock_stack *tls, size_t capacity) +{ + ZERO(tls); + OMALLOC_ARRAY(tls->arena, capacity); + tls->capacity = capacity; +} + +/** + * Initialize the lock stack for the thread element. + */ +static void +thread_lock_stack_init(struct thread_element *te) +{ + thread_lock_stack_allocate(&te->locks, THREAD_LOCK_MAX); + + /* + * Nested locks can occur when a thread is "sleeping", waiting on a lock + * and we wish to trace a possible deadlock, causing more locks to be + * grabbed and possibly leading to sleeping as well. + * + * However, this is not an usual case and the nesting depth that can + * occur through these nested sleep conditions is necessarily limited. + */ + + thread_lock_stack_allocate(&te->waits, THREAD_LOCK_NESTED); +} + +/** + * Fast computation of the Quasi Thread ID (QID) of a thread. + * + * @param sp a stack pointer belonging to the thread + * + * The concept of QID relies on the fact that a given stack page can only + * belong to one thread, by definition. + */ +static inline ALWAYS_INLINE thread_qid_t +thread_quasi_id_fast(const void *sp) +{ + return pointer_to_ulong(sp) >> thread_pageshift; +} + +/** + * Computes the Quasi Thread ID (QID) for current thread. + */ +thread_qid_t +thread_quasi_id(void) +{ + int sp; + + if G_UNLIKELY(!thread_inited) + thread_init(); + + return thread_quasi_id_fast(&sp); +} + +/** + * Hash a Quasi Thread ID (QID) into an index within the QID cache. + */ +static inline uint +thread_qid_hash(thread_qid_t qid) +{ + return integer_hash_fast(qid) >> (sizeof(unsigned) * 8 - THREAD_QID_BITS); +} + +/** + * Update last stack pointer and highest stack pointer for current thread. + */ +static inline ALWAYS_INLINE void +thread_stack_update(struct thread_element *te) +{ + te->last_sp = &te; + if (thread_sp_direction > 0) { + if G_UNLIKELY(ptr_cmp(&te, te->top_sp) > 0) + te->top_sp = &te; + } else { + if G_UNLIKELY(ptr_cmp(&te, te->top_sp) < 0) + te->top_sp = &te; + } +} + +/** + * Initialize the thread stack shape for the thread element. + */ +static void +thread_stack_init_shape(struct thread_element *te, const void *sp) +{ + thread_qid_t qid = thread_quasi_id_fast(sp); + + te->low_qid = te->high_qid = te->top_qid = qid; + te->top_sp = &te; + thread_stack_update(te); +} + +/** + * Get thread element stored at the specified QID cache index. + */ +static inline struct thread_element * +thread_qid_cache_get(unsigned idx) +{ + uint8 id; + + THREAD_STATS_INCX(qid_cache_lookup); + + /* + * We do not care whether this memory location is atomically read or not. + * On a given CPU, it will be consistent: a thread will run on the same + * CPU for some time, and what matters are that cached information on that + * CPU will be used for later cache hits. + */ + + id = thread_qid_cacheidx; + return threadsid; +} + +/** + * Cache thread element at specified index in the QID cache. + */ +static inline void +thread_qid_cache_set(unsigned idx, struct thread_element *te, thread_qid_t qid) +{ + g_assert_log( + (qid >= te->low_qid && qid <= te->high_qid) || + (qid >= te->low_sig_qid && qid <= te->high_sig_qid), + "qid=%zu, te->low_qid=%zu, te->high_qid=%zu, " + "te->low_sig_qid=%zu, te->high_sig_qid=%zu, te->stid=%u", + qid, te->low_qid, te->high_qid, te->low_sig_qid, te->high_sig_qid, + te->stid); + + te->last_qid = qid; /* This is thread-private data */ + thread_qid_cacheidx = te->stid; /* This is global data being updated */ + + /* + * We do not need any memory barrier here because we do not care whether + * this cached entry will be globally visible on other CPUs. Even if it + * gets superseded by another thread on another CPU, it means there is + * already a hashing clash anyway so why bother paying the price of a + * memory barrier? + */ + + /* + * Updated "highest" QID seen, to measure how much stack the thread is + * using, to be able to monitor stack overflow potential. This is + * in the direction of the stack growth, of course. + */ + + if (thread_sp_direction > 0) { + if G_UNLIKELY(qid > te->top_qid) + te->top_qid = qid; + if G_UNLIKELY(ptr_cmp(&te, te->top_sp) > 0) + te->top_sp = &te; + } else { + if G_UNLIKELY(qid < te->top_qid) + te->top_qid = qid; + if G_UNLIKELY(ptr_cmp(&te, te->top_sp) < 0) + te->top_sp = &te; + } + + /* + * Record last stack pointer seen to be able to approximate the stack usage + * of another thread, assuming it enters our thread runtime frequently. + */ + + te->last_sp = &te; +} + +/** + * Purge all QID cache entries whose thread element claims to own a QID + * falling in the specified stack range and which does not bear the proper + * small thread ID. + * + * Regardless of how the stack grows, the low and high QIDs given (which may + * be identical) are the known limits of the stack for the specified stid. + * + * @param stid the thread small ID owning the QID range + * @param low low QID (numerically) + * @param high high QID (numerically) + */ +static void +thread_qid_cache_force(unsigned stid, thread_qid_t low, thread_qid_t high) +{ + unsigned i; + + g_assert(stid < THREAD_MAX); + g_assert_log(low <= high, + "%s(): stid=%u, low=%'zu, high=%'zu", + G_STRFUNC, stid, low, high); + + for (i = 0; i < N_ITEMS(thread_qid_cache); i++) { + uint8 id = thread_qid_cachei; + struct thread_element *te = threadsid; + + if ( + te != NULL && id != stid && + te->last_qid >= low && te->last_qid <= high + ) { + thread_qid_cachei = stid; + atomic_mb(); /* Cached entry was stale, must purge it */ + } + } +} + +/** + * Monitor discovered thread so that we are warned when the thread is about + * to exit, in order to reclaim its thread element. + * + * @param te thread element for the current thread we wish to monitor + */ +static void +thread_monitor_exit(struct thread_element *te) +{ + static size_t counter; + static pthread_key_t monitor_key; + + g_assert_log(te->discovered, + "%s(): thread #%u not discovered (%s created)", + G_STRFUNC, te->stid, te->created ? "was" : "neither"); + + /* + * Create special key if not already done. That key is equipped with + * a destructor that will be called in each exiting thread when the + * key holds a non-NULL data. + * + * This gives us the advance notification that the thread will be + * exiting "soon" (either it called pthread_exit() or was cancelled). + * --RAM, 2015-02-24 + */ + + if G_UNLIKELY(0 == ATOMIC_INC(&counter)) { + int error = pthread_key_create(&monitor_key, thread_will_exit); + + if (error != 0) { + /* Don't use %m, not sure we can set errno properly in thread */ + s_minierror("%s(): cannot create monitoring key: %s (%s)", + G_STRFUNC, symbolic_errno(error), g_strerror(error)); + } + } + + /* + * We must set a non-NULL key to have the destroy callback invoked + * at thread exit time: use the thread element! + */ + + pthread_setspecific(monitor_key, te); +} + +/** + * A discovered thread was marked as "gone" and yet we are seeing some + * activity for it. + */ +static void +thread_element_mark_gone_seen(struct thread_element *te) +{ + /* + * We cannot lock the thread element because we are on the + * thread_small_id() execution path, which cannot take locks since + * we could be interrupted by an operating system signal and the + * first thing the signal handler will do is call thread_small_id()! + * + * On this execution path, speed is important so we cannot create a + * critical section to block signals. Hence we use atomic operations, + * which means the "gone_seen" and "add_monitoring" fields must be + * individual fields and not part of a bit field! + */ + + if G_UNLIKELY(te->gone && !te->gone_seen) { + te->gone_seen = TRUE; + te->add_monitoring = TRUE; /* Still active, must monitor exit again! */ + atomic_mb(); + } +} + +/** + * @return whether thread element is matching the QID. + */ +static bool +thread_element_matches(struct thread_element *te, const thread_qid_t qid) +{ + if G_UNLIKELY(NULL == te) { + THREAD_STATS_INCX(qid_cache_miss); + return FALSE; + } + + /* + * When the last_qid matched the qid, we know that the hit is correct + * as long as we are in the main thread or the thread was not discovered. + * Indeed, we control the created threads and the death of the main thread + * would mean the death of the whole process. + * + * For a discovered thread however, we need to check whether the associated + * recorded TID matches the current one. Otherwise, the thread we had + * discovered previously no longer exists. + * --RAM, 2015-02-11 + */ + + if G_LIKELY(te->last_qid == qid) { + if G_LIKELY(THREAD_MAIN == te->stid || te->created) + goto matched; + + /* + * A discovered thread could be gone and still have stale entries + * in the QID cache. + */ + + if G_UNLIKELY(!te->valid) + goto false_hit; + + /* + * We are in a discovered thread, and we take this opportunity to + * update the last time we see an activity for that thread. This + * allows thread tracing code to spot likely inactive discovered + * thread since we cannot know when they enter a blocking state due + * to thread synchronization (waiting for an event, sleeping, etc..). + * --RAM, 2015-02-23 + */ + + te->last_seen = tm_time_raw(); + + THREAD_STATS_INCX(qid_cache_self_check); + + if (thread_eq(te->tid, thread_self())) { + /* + * Loudly warn if the thread element is marked as gone. + * It means that thread_will_exit() was called, we marked the + * discovered thread as being gone and yet the same thread + * is still being active. + */ + + if G_UNLIKELY(te->gone) { + thread_element_mark_gone_seen(te); + } else if G_UNLIKELY(te->add_monitoring) { + /* No longer flagged as "gone", re-install monitoring */ + te->add_monitoring = FALSE; + thread_monitor_exit(te); + } + + goto matched; + } + + false_hit: + THREAD_STATS_INCX(qid_cache_false_hit); + return FALSE; + } + + THREAD_STATS_INCX(qid_cache_clash); + return FALSE; + +matched: + THREAD_STATS_INCX(qid_cache_hit); + thread_stack_update(te); + return TRUE; +} + +/** + * Format thread name into supplied buffer. + * + * @return pointer to the start of the buffer. + */ +static const char * +thread_element_name_to_buf(const struct thread_element *te, + char *buf, size_t len, bool symbolic_name) +{ + const char *qualify = ""; + + if G_UNLIKELY(te->exit_started) { + if (te->cancelled) + qualify = "cancelled "; + else if (te->join_pending) + qualify = "exited "; + else + qualify = "exiting "; + } + + if G_UNLIKELY(te->name != NULL) { + str_bprintf(buf, len, "%sthread \"%s\" (#%u)", + qualify, te->name, te->stid); + } else if (te->created) { + const char *symbolic = NULL; + char namePOINTER_BUFLEN; + + /* + * The te->entry_name field is computed at thread creation time + * to make sure we do not call stacktrace_function_name() from + * here: it would prevent logging in places where locks are taken + * and could lead to deadly recursion. + * + * However, it may not always be translated into a proper symbolic + * form, especially for threads auto-started at initialization, + * before we grabbed all the symbols. + * + * Therefore, check whether we have a known entry and update it + * otherwise. We avoid using stacktrace_function_name() if we have + * already started to compute the name, to prevent recursions. + * --RAM, 2015-12-28 + */ + + if G_UNLIKELY(NULL == te->entry_name && symbolic_name) { + static uint8 computingTHREAD_MAX; + int stid = thread_safe_small_id(); + + if (stid >= 0 && !computingstid) { + computingstid = TRUE; + symbolic = stacktrace_function_name(te->entry); + computingstid = FALSE; + if (is_strprefix(symbolic, "0x")) + symbolic = NULL; + if ( + symbolic != NULL && + !signal_in_exception() && + !signal_in_unsafe_handler() + ) { + struct thread_element *wte = deconstify_pointer(te); + + symbolic = constant_str(symbolic); + + /* + * We may not be in the thread identified by "te", hence + * we need to lock the element before updating. We do not + * need to check whether there is a non-NULL value though + * because the string is allocated once or is static. + */ + + THREAD_LOCK(wte); + wte->entry_name = symbolic; + THREAD_UNLOCK(wte); + } + } + } + + if (NULL == symbolic) + symbolic = te->entry_name; + + if (NULL == symbolic) { + pointer_to_string_buf(te->entry, name, sizeof name); + symbolic = name; + } + + if (pointer_to_uint(te->argument) < 1000) { + str_bprintf(buf, len, "%sthread #%u:%s(%u)", + qualify, te->stid, symbolic, + pointer_to_uint(te->argument)); + } else { + str_bprintf(buf, len, "%sthread #%u:%s(%p)", + qualify, te->stid, symbolic, te->argument); + } + } else if (te->main_thread) { + str_bprintf(buf, len, "thread #%u:main()", te->stid); + } else { + str_bprintf(buf, len, "%sthread #%u", qualify, te->stid); + } + + return buf; +} + +/** + * Format the name of the thread element. + * + * @return the thread name as "thread name" if name is known, or a default + * name which is "thread #n" followed by the entry point for a thread we + * created and ":main()" for the main thread (necessarily discovered). + */ +static const char * +thread_element_name(const struct thread_element *te) +{ + static char bufTHREAD_MAX128; + static char emergency128; + char *b; + + /* + * This routine may be called during crashes or dire conditions, so be + * careful and do not call thread_small_id() lightly. + */ + + if (signal_in_exception()) { + int stid = thread_safe_small_id(); + b = stid < 0 ? emergency : &bufstid0; + } else { + b = &bufthread_small_id()0; + } + + return thread_element_name_to_buf(te, b, sizeof buf0, TRUE); +} + +/** + * Format the name of the thread element. + * + * @return the thread name as "thread name" if name is known, or a default + * name which is "thread #n" followed by the entry point for a thread we + * created and ":main()" for the main thread (necessarily discovered). + */ +static const char * +thread_element_name2(const struct thread_element *te) +{ + static char bufTHREAD_MAX128; + static char emergency128; + char *b; + + /* + * This routine may be called during crashes or dire conditions, so be + * careful and do not call thread_small_id() lightly. + */ + + if (signal_in_exception()) { + int stid = thread_safe_small_id(); + b = stid < 0 ? emergency : &bufstid0; + } else { + b = &bufthread_small_id()0; + } + + return thread_element_name_to_buf(te, b, sizeof buf0, TRUE); +} + +/** + * Format the name of the thread element. + * + * This routine does not attempt to derive a symbolic name for the thread + * entry point, making it suitable to use for logging at places where it + * could otherwise create a deadlock (for instance within a lock acquiring + * path). + */ +static const char * +thread_element_name_raw(const struct thread_element *te) +{ + static char bufTHREAD_MAX128; + static char emergency128; + char *b = &bufte->stid0; + + /* + * This routine may be called during crashes or dire conditions, so be + * careful and do not call thread_small_id() lightly. + */ + + if (signal_in_exception()) { + int stid = thread_safe_small_id(); + b = stid < 0 ? emergency : &bufstid0; + } else { + b = &bufthread_small_id()0; + } + + return thread_element_name_to_buf(te, b, sizeof buf0, FALSE); +} + +/** + * On Windows, since the system allocates much more stack than we request + * usually, monitor the stack to ensure there is no logical overflow going on. + * + * This needs to be checked at strategic spots, but not at places where we + * can compute the current thread via a QID cache lookup: if the QID cache + * matches, then we already checked that there was not overflow in that stack + * page... + * + * Since in practice more than 99.5% of the QID cache lookups succeed for + * locating a thread, the additional checks we're doing here are not going + * to be impacting performance much! + */ +static inline void +thread_element_stack_check(struct thread_element *te) +{ +#ifdef MINGW32 + /* + * We know that the stack grows backwards there. + */ + + if G_UNLIKELY( + te->stack_size != 0 && + te->running && + !te->main_thread && + !te->stack_overflow && + ptr_diff(te->stack_base, &te) > te->stack_size && + 0 == signal_in_exception() + ) { + te->stack_overflow = TRUE; /* Prevent deadly recursions */ + + s_rawcrit("stack (%'zu bytes) overflowing for %s (used %'zu bytes)", + te->stack_size, thread_element_name_raw(te), + ptr_diff(te->stack_base, &te)); + + thread_stack_overflow(te); + } +#else + /* Unnecessary on UNIX platforms: pthreads correctly creates the stack */ + (void) te; +#endif /* MINGW32 */ +} + +/** + * Update QID range for thread element, if needed. + * + * This is only needed for discovered thread given that we know the stack + * shape for created threads. + */ +static void +thread_element_update_qid_range(struct thread_element *te, thread_qid_t qid) +{ + bool bad_qid; + thread_qid_t bad_lo, bad_hi; + + /* + * Need to lock the thread element since created threads can adjust the + * QID ranges of any discovered thread that would be overlapping with + * their own (definitely known) QID range. + */ + + THREAD_LOCK(te); + + if G_UNLIKELY((bad_qid = te->low_qid > te->high_qid)) { + bad_lo = te->low_qid; + bad_hi = te->high_qid; + } + + if (qid < te->low_qid) + te->low_qid = qid; + else if (qid > te->high_qid) + te->high_qid = qid; + + THREAD_UNLOCK(te); + + /* + * Emit warning outside the critical section. + * + * We used to soft-assert this condition, but it caused deadly recursions + * during crashes: when the assertion was failing, assertion_message() + * would call thread_check_suspended() and we would re-enter here with + * the same failing assertion! + */ + + if G_UNLIKELY(bad_qid) { + s_rawwarn("%s(): %s had bad QID ranges: bad_low=%'zu, bad_high=%'zu; " + "now set to: qid=%'zu, low_qid=%'zu, high_qid=%'zu", + G_STRFUNC, thread_element_name(te), + bad_lo, bad_hi, qid, te->low_qid, te->high_qid); + } + + if G_UNLIKELY(te->gone) + thread_element_mark_gone_seen(te); + + thread_stack_update(te); + + /* + * Purge QID cache to make sure no other thread is claiming + * that range in the cache, which would lead to improper lookups. + */ + + thread_qid_cache_force(te->stid, te->low_qid, te->high_qid); +} + +/** + * Create pipe or socketpair. + * + * @param fd the array to fill with the created read/write descriptors + * @param caller caller name, in case of error + */ +static void +thread_pipe_open(socket_fd_t fd2, const char *caller) +{ +#ifdef HAS_SOCKETPAIR + if (-1 == socketpair(AF_LOCAL, SOCK_STREAM, 0, fd)) + s_error("%s(): socketpair() failed: %m", caller); +#else + if (-1 == pipe(te->wfd)) + s_error("%s(): pipe() failed: %m", caller); +#endif +} + +/** + * Close pipe / socketpair created by thread_pipe_open(). + */ +static void +thread_pipe_close(socket_fd_t fd2) +{ +#ifdef HAS_SOCKETPAIR + if (INVALID_SOCKET != fd0) { + s_close(fd0); + s_close(fd1); + fd0 = fd1 = INVALID_SOCKET; + } +#else + fd_close(&fd0); + fd_close(&fd1); +#endif +} + +/** + * Create block/unblock synchronization socketpair or pipe if necessary. + */ +static void +thread_block_init(struct thread_element *te) +{ + /* + * This is called in the context of the thread attempting to block, + * hence there is no need to lock the thread element. + * + * It is a fatal error if we cannot get the pipe since it means we + * will not be able to correctly block or be unblocked, hence the whole + * thread synchronization logic is jeopardized. + * + * If socketpair() is available, we prefer it over pipe() because on + * Windows one can only select() on sockets... This means we need to + * use s_read() and s_write() on the file descriptors, since on Windows + * sockets are not plain file descriptors. + * + * FIXME: on linux, we can use eventfd() to save one file descriptor but + * this will require new metaconfig checks. + */ + + if G_UNLIKELY(INVALID_FD == te->wfd0) { + thread_pipe_open(te->wfd, G_STRFUNC); + } +} + +/** + * Destroy block/unblock synchronization socketpair or pipe if it exists. + */ +static void +thread_block_close(struct thread_element *te) +{ + thread_pipe_close(te->wfd); +} + +/** + * Hashtable iterator to remove non-permanent thread-private values. + */ +static bool +thread_private_drop_value(const void *u_key, void *value, void *u_data) +{ + struct thread_pvalue *pv = value; + + (void) u_key; + (void) u_data; + + if (THREAD_PRIVATE_KEEP == pv->p_free) + return FALSE; + + thread_pvalue_free(value); + return TRUE; +} + +/** + * Clear all the thread-private variables in the specified thread. + */ +static void +thread_private_clear(struct thread_element *te) +{ + if (te->pht != NULL) + hash_table_foreach_remove(te->pht, thread_private_drop_value, NULL); +} + +/** + * Clear all the thread-private variables in the specified thread, + * warning if we have any. + */ +static void +thread_private_clear_warn(struct thread_element *te) +{ + size_t cnt; + + if (NULL == te->pht) + return; + + cnt = hash_table_foreach_remove(te->pht, thread_private_drop_value, NULL); + + if G_UNLIKELY(cnt != 0) { + s_miniwarn("cleared %zu thread-private variable%s in %s thread #%u", + cnt, plural(cnt), + te->created ? "created" : te->discovered ? "discovered" : "bad", + te->stid); + } +} + +/** + * Clear all the thread-local variables in the specified thread. + * + * @return the amount of thread-local variables that were cleared. + */ +static size_t +thread_local_clear(struct thread_element *te) +{ + unsigned l1; + size_t cleared = 0; + + for (l1 = 0; l1 < N_ITEMS(te->locals); l1++) { + void **l2page = te->localsl1; + + if G_UNLIKELY(l2page != NULL) { + int l2; + + for (l2 = 0; l2 < THREAD_LOCAL_L2_SIZE; l2++) { + void *val = l2pagel2; + + if G_UNLIKELY(val != NULL) { + thread_key_t k = l1 * THREAD_LOCAL_L1_SIZE + l2; + free_fn_t freecb = NULL; + + /* + * Always get the ``thread_local_slk'' lock before + * reading the thread_lkeys array to prevent any + * race since two values must be atomically fetched. + * + * We reset the variable under the protection of the + * thread_local_slk lock to make sure thread_local_set() + * can also safely read the L2 page when it has that lock. + */ + + spinlock_hidden(&thread_local_slk); + + if G_LIKELY(THREAD_LKEY_USED == thread_lkeysk.used) + freecb = thread_lkeysk.freecb; + + if G_LIKELY(freecb != THREAD_LOCAL_KEEP) { + l2pagel2 = NULL; + cleared++; + } + + spinunlock_hidden(&thread_local_slk); + + if G_LIKELY(freecb != THREAD_LOCAL_KEEP && freecb != NULL) { + (*freecb)(val); + } + } + } + } + } + + return cleared; +} + +/** + * Count the thread-local variables in the specified thread. + * + * @return the amount of thread-local variables used by the thread. + */ static size_t -thread_hash(const void *key) +thread_local_count(struct thread_element *te) { - return binary_hash(key, sizeof(thread_t)); + unsigned l1; + size_t count = 0; + + for (l1 = 0; l1 < N_ITEMS(te->locals); l1++) { + void **l2page = te->localsl1; + + if G_UNLIKELY(l2page != NULL) { + int l2; + thread_key_t kbase = l1 * THREAD_LOCAL_L1_SIZE; + + for (l2 = 0; l2 < THREAD_LOCAL_L2_SIZE; l2++) { + void *val = l2pagel2; + + if G_UNLIKELY(val != NULL) { + /* + * No need to get the ``THREAD_local_slk'' lock here + * to read the global thread_lkeys since we're + * only accessing a single field and it's not critical + * if we're reading a stale value. + */ + + if G_LIKELY(thread_lkeyskbase+l2.used == THREAD_LKEY_USED) + count++; + } + } + } + } + + return count; } -static gboolean -thread_equal(const void *a, const void *b) +/** + * Clear all the thread-local variables in the specified thread, + * warning if we have any. + */ +static void +thread_local_clear_warn(struct thread_element *te) { - return thread_eq(a, b); + size_t cnt; + + cnt = thread_local_clear(te); + + if G_UNLIKELY(cnt != 0) { + s_miniwarn("cleared %zu thread-local variable%s in %s thread #%u", + cnt, plural(cnt), + te->created ? "created" : te->discovered ? "discovered" : "bad", + te->stid); + } } /** - * Get the main hash table. + * Allocate the stack for a created thread. + */ +static void +thread_stack_allocate(struct thread_element *te, size_t stacksize) +{ + size_t len; + int e; + + if G_UNLIKELY(!thread_inited) + thread_init(); + + /* + * To trap thread overflows, we add one extra page to the stack on which + * we will remove all access to make sure the process faults if it + * attempts to access that page. + */ + + len = stacksize + thread_pagesize; + te->stack = vmm_alloc(len); + + if (thread_sp_direction < 0) { + /* + * Normally when the stack grows in that direction, the stack pointer + * is pre-decremented (it points to the last pushed item). + */ + + te->stack_base = ptr_add_offset(te->stack, len); + e = mprotect(te->stack, thread_pagesize, PROT_NONE); /* Red zone */ + } else { + /* + * When the stack grows forward, the stack pointer is usually post- + * incremented (it points to the next usable item). + */ + + te->stack_base = te->stack; + e = mprotect(ptr_add_offset(te->stack, stacksize), + thread_pagesize, PROT_NONE); /* Red zone */ + } + + if G_UNLIKELY(-1 == e) { + s_critical("%s(): cannot set red-zone page at end of " + "%s %zu-byte stack %p (base=%p): %m", + G_STRFUNC, thread_sp_direction < 0 ? "decreasing" : "increasing", + len, te->stack, te->stack_base); + } +} + +/** + * Free up the allocated stack. + */ +static void +thread_stack_free(struct thread_element *te) +{ + size_t len; + + g_assert(te->stack != NULL); + + len = te->stack_size + thread_pagesize; + + /* + * Restore read-write protection on the red-zone guard page before + * freeing the whole memory region. + */ + + if (thread_sp_direction < 0) { + mprotect(te->stack, thread_pagesize, PROT_READ | PROT_WRITE); + } else { + mprotect(ptr_add_offset(te->stack, te->stack_size), + thread_pagesize, PROT_READ | PROT_WRITE); + } + + vmm_free(te->stack, len); + te->stack = NULL; +} + +/** + * Flag a locked thread element as reusable. + */ +static inline void +thread_element_mark_reusable_locked(struct thread_element *te) +{ + g_assert_log(0 == thread_element_lock_count(te), + "%s(): lock_count=%zu for %s", + G_STRFUNC, thread_element_lock_count(te), + thread_element_name_raw(te)); + + te->reusable = TRUE; /* Allow reuse */ + te->valid = FALSE; /* Holds stale values now */ +} + +/** + * Flag element as reusable. + */ +static void +thread_element_mark_reusable(struct thread_element *te) +{ + THREAD_LOCK(te); + thread_element_mark_reusable_locked(te); + THREAD_UNLOCK(te); +} + +/** + * A thread is gone (be it created or discovered). + */ +static void +thread_gone(struct thread_element *te) +{ + /* + * Need to signal xmalloc() that any thread-specific allocated chunk + * can now be forcefully dismissed if they are empty and pending + * cross-thread freeing for the dead chunk can be processed. + */ + + xmalloc_thread_ended(te->stid); + + thread_element_mark_reusable(te); +} + +/** + * Callout queue callback invoked when discovered thread is surely gone. + */ +static void +thread_surely_gone(cqueue_t *unused_cq, void *data) +{ + struct thread_element *te = data; + bool problem; + size_t locks; + + thread_element_check(te); + + (void) unused_cq; + + THREAD_LOCK(te); + + if (!te->valid || !te->exit_started || !te->discovered) { + THREAD_UNLOCK(te); + s_warning("%s(): ID #%u seems to be already re-assigned to new %s", + G_STRFUNC, te->stid, thread_element_name(te)); + return; + } + + problem = te->gone_seen; + locks = thread_element_lock_count(te); + if (problem || locks != 0) { + te->gone = FALSE; /* Will not reuse it after all */ + te->exit_started = FALSE; /* And definitely not exiting */ + } + THREAD_UNLOCK(te); + + if (locks != 0) { + s_warning("%s(): %s still holding %zu lock%s, not reusing its ID", + G_STRFUNC, thread_element_name(te), locks, plural(locks)); + } else if (problem) { + s_warning("%s(): seen some activity for %s, not reusing its ID", + G_STRFUNC, thread_element_name(te)); + } else { + thread_gone(te); + te->discovered = FALSE; + atomic_uint_dec(&thread_discovered); + } +} + +/** + * Callout queue callback invoked when discovered thread is probably gone. + */ +static void +thread_probably_gone(cqueue_t *unused_cq, void *data) +{ + struct thread_element *te = data; + + thread_element_check(te); + + (void) unused_cq; + + THREAD_LOCK(te); + + if (!te->valid || !te->exit_started || !te->discovered) { + THREAD_UNLOCK(te); + s_warning("%s(): ID #%u seems to be already re-assigned to new %s", + G_STRFUNC, te->stid, thread_element_name(te)); + return; + } + + /* + * We flag the discovered thread as gone, which will give us a loud + * warning if we see a QID cache hit for that thread again. + */ + + te->gone = TRUE; + te->gone_seen = FALSE; + + THREAD_UNLOCK(te); + + /* + * Now after some safety period has elapsed, mark the element as + * being truly gone. + */ + + evq_raw_insert(THREAD_GRACE_TIME, thread_surely_gone, te); +} + +/** + * A created thread has definitively ended and we can reuse its thread element. + */ +static void +thread_ended(struct thread_element *te) +{ + g_assert(te->created); + + if (te->stack != NULL) + thread_stack_free(te); + + thread_gone(te); + atomic_uint_dec(&thread_pending_reuse); +} + +/** + * Cleanup a terminated thread. + */ +static void +thread_cleanup(struct thread_element *te) +{ + /* + * Dispose of the dynamically allocated thread resources that could + * still be present. + */ + + thread_block_close(te); +} + +/* + * Join at the POSIX thread level with a known-to-be-terminated thread. + */ +static void +thread_pjoin(struct thread_element *te) +{ + int error; + + error = pthread_join(te->ptid, NULL); + if (error != 0) { + errno = error; + s_error("%s(): pthread_join() failed on %s: %m", + G_STRFUNC, thread_element_name(te)); + } + + if (is_running_on_mingw()) { + /* + * We don't allocate our stack on Windows, the kernel is and the + * pthread layer there does not support user stack allocation. + * Now that the thread has been joined with, its stack range is + * completely invalid. + */ + te->last_qid = te->low_qid = -1; + te->high_qid = te->top_qid = 0; + } +} + +/** + * Callout queue callback to reclaim thread element. + */ +static void +thread_element_reclaim(cqueue_t *unused_cq, void *data) +{ + struct thread_element *te = data; + + thread_element_check(te); + g_assert(te->detached); + + (void) unused_cq; + + /* + * Join with the thread, which should be completely terminated by now + * (hence we should not block) and then mark it ended. + */ + + thread_pjoin(te); + thread_ended(te); +} + +/** + * Emit mandatory warning about possible race condition for discovered threads. + */ +static inline void +thread_stack_race_warn(void) +{ + /* + * Symptoms of the race condition are multiple: typically, this will lead + * to complains about locks not being owned by the proper threads, but + * it can also cause silent memory corruption (lock believed to be + * wrongly owned), spurious deadlock conditions, etc... + * + * These will only occur when threads are created outside of our control + * and we discover them dynamically when they attempt to grab a lock in + * our code. For the race to happen, a thread we created must exit + * in an about 20 ms time window before we are discovering the thread, + * which would be using precisely the same stack range. + */ + + s_warning("race condition possible with discovered threads"); +} + +/** + * Thread is exiting. + */ +static void +thread_exiting(struct thread_element *te) +{ + g_assert(te->created); + + thread_cleanup(te); + + /* + * Updating bitfield atomically, just in case. + */ + + THREAD_LOCK(te); + te->exiting = TRUE; + THREAD_UNLOCK(te); + + /* + * If the thread is detached, we record the cleanup of its stack to some + * time in the future. Otherwise, it was just joined so we can reclaim + * it immediately. + */ + + if (te->detached) { + evq_raw_insert(THREAD_HOLD_TIME, thread_element_reclaim, te); + if (NULL == te->stack) { + if (is_running_on_mingw()) { + /* + * If we do not allocate the stack and we're running on Windows, + * we're safe because the stack is not created using malloc() + * so pthread_exit() will not need to compute the STID. + * + * However, now that we have the win32dlp code enabled, it is + * possible that the ExitThread() call will call LoadLibrary() + * for some reason, which we trap... + * + * So don't reset the QID range just yet, but don't warn about + * possible race conditions -- they do exist though. + * --RAM, 2015-12-31 + */ + } else { + static once_flag_t race_warning; + + /* + * A race condition is possible: the thread exits, but its + * stack space is allocated via malloc() or maybe pthread_exit() + * will use free(). Hence we cannot reset the QID space for + * the thread, which means any discovered thread that would + * happen to run in that space would be mistaken with the + * exiting thread, which we shall clean up later, causing + * havoc. + * + * There's nothing to do to close this race, so we warn when + * it can happen. + */ + + ONCE_FLAG_RUN(race_warning, thread_stack_race_warn); + } + } + } else { + thread_ended(te); + } +} + +/** + * Clear the atomic name in the thread element. + */ +static void +thread_element_clear_name(struct thread_element *te) +{ + if (te->atomic_name) { + atom_str_free_null(&te->name); + te->atomic_name = FALSE; + } +} + +/** + * Free a thread interrupt callback structure. + */ +static void +thread_interrupt_cb_free(struct thread_interrupt_cb *ti) +{ + thread_interrupt_cb_check(ti); + + ti->magic = 0; + WFREE(ti); +} + +/** + * List iterator to free an interrupt request. + */ +static void +thread_interrupt_free(void *data, void *udata) +{ + (void) udata; + thread_interrupt_cb_free(data); +} + +/** + * Free any present interrupt item (requests or acknowledgments). + */ +static void +thread_element_interrupt_clear(struct thread_element *te, const char *what, + const char *caller, mutex_t *lock, eslist_t *list) +{ + mutex_lock_fast(lock); + { + size_t cnt = eslist_count(list); + + if G_UNLIKELY(0 != cnt) { + s_rawwarn("%s(): thread #%u had %zu pending interrupt %s%s", + caller, te->stid, cnt, what, plural(cnt)); + + eslist_foreach(list, thread_interrupt_free, NULL); + eslist_clear(list); + } + } + mutex_unlock_fast(lock); +} + +/** + * Reset important fields from a reused thread element. + */ +static void +thread_element_reset(struct thread_element *te) +{ + /* + * Even though we do not have to take the thread element lock here, + * we do, in order to avoid numerous false positives from Coverity. + * (many of these fields are normally accessed with the lock taken) + * --RAM, 2015-03-06 + */ + + THREAD_LOCK(te); + + te->locks.count = 0; + te->waits.count = 0; + thread_element_clear_name(te); + +#ifdef MINGW32 + mingw_gettid_reset(te->stid); +#endif + + thread_set(te->tid, THREAD_INVALID); + te->last_qid = (thread_qid_t) -1; + te->low_qid = te->low_sig_qid = (thread_qid_t) -1; + te->high_qid = te->high_sig_qid = 0; + te->top_qid = 0; + te->last_sp = NULL; + te->top_sp = NULL; + te->valid = FALSE; /* Flags an incorrectly instantiated element */ + te->creating = FALSE; + te->exiting = FALSE; + te->stack = NULL; + te->stack_base = NULL; + te->name = NULL; + te->blocked = FALSE; + te->unblocked = FALSE; + te->join_requested = FALSE; + te->join_pending = FALSE; + te->reusable = FALSE; + te->detached = FALSE; + te->created = FALSE; + te->discovered = FALSE; + te->running = FALSE; + te->stack_size = 0; + te->entry = NULL; + te->entry_name = NULL; + te->argument = NULL; + te->cond = NULL; + te->main_thread = FALSE; + te->cancelled = FALSE; + te->cancelable = TRUE; + te->exit_started = FALSE; + te->gone = FALSE; + te->gone_seen = FALSE; + te->add_monitoring = FALSE; + te->stack_overflow = FALSE; + te->in_syscall = FALSE; + te->recursive_lockwait = FALSE; + te->cancl = THREAD_CANCEL_ENABLE; + tsig_emptyset(&te->sig_mask); + tsig_emptyset(&te->sig_pending); + te->sig_generation = 0; + te->div = NULL; + ZERO(&te->sigh); + eslist_clear(&te->exit_list); + eslist_clear(&te->cleanup_list); + slist_free(&te->cond_stack); + ZERO(&te->btrace); + + thread_element_interrupt_clear(te, "request", G_STRFUNC, + &te->interrupt_lock, &te->interrupt_list); + + thread_element_interrupt_clear(te, "acknowledgment", G_STRFUNC, + &te->interrupt_ack_lock, &te->interrupt_ack_list); + + /* + * These are mandatory signal handlers we're installing for each thread. + */ + + te->sighTSIG_DIVERT - 1 = thread_divert_handle; + te->sighTSIG_INTACK - 1 = thread_interrupt_ack_handle; + + THREAD_UNLOCK(te); + + signal_thread_reset(te->stid); +} + +/** + * Make sure we have only one item in the tstid array that maps to + * the thread_t. * - * This hash table is indexed by thread_t and holds another hash table which - * is therefore thread-private and can be used to store thread-private keys. + * This is necessary because thread_t values can be reused after some time + * when threads are created and disappear on a regular basis and since we + * do not control the threads we discover... + * + * Note that pthread_exit() can allocate memory, requiring small thread ID + * computation, so we cannot do this tstid cleanup at thread exit time, + * even for the threads we create. + * + * @param stid the stid that should be tied to the thread already + * @param t the thread_t item that must appear only for stid */ -static hash_table_t * -thread_get_global_hash(void) +static void +thread_stid_tie(unsigned stid, thread_t t) +{ + unsigned i; + + for (i = 0; i < N_ITEMS(tstid); i++) { + if G_UNLIKELY(i >= thread_next_stid) + break; + if G_UNLIKELY(i == stid) { + tstidi = t; + atomic_mb(); + continue; + } + if G_UNLIKELY(thread_eq(t, tstidi)) { + thread_set(tstidi, THREAD_INVALID); + atomic_mb(); + } + } +} + +/** + * Make sure no other thread element bears that thread_t. + */ +static void +thread_element_unique_thread(struct thread_element *te, thread_t t) +{ + unsigned i; + + assert_mutex_is_owned(&thread_insert_mtx); + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *xte = threadsi; + + if G_LIKELY(te != xte) { + if G_UNLIKELY(thread_eq(t, xte->tid)) { + /* + * When we have a TID match, the thread element is + * necessary defunct. Since we're holding a spinlock + * here, we do not collect the thread immediately. + */ + + THREAD_LOCK(xte); + if G_LIKELY(thread_eq(t, xte->tid)) { + thread_set(xte->tid, THREAD_INVALID); + thread_set(tstidi, THREAD_INVALID); + } + THREAD_UNLOCK(xte); + } + } + } +} + +/** + * Common initialization sequence between a created and a discovered thread. + */ +static void +thread_element_common_init(struct thread_element *te, thread_t t) +{ + assert_mutex_is_owned(&thread_insert_mtx); + + te->creating = FALSE; + te->valid = TRUE; + thread_stid_tie(te->stid, t); + thread_private_clear_warn(te); + thread_local_clear_warn(te); + thread_element_unique_thread(te, t); +} + +/** + * Tie a thread element to its created thread. + */ +static void +thread_element_tie(struct thread_element *te, thread_t t, const void *base) +{ + thread_qid_t qid; + unsigned i; + + THREAD_STATS_INC(created); + + if (thread_sp_direction < 0) + base = const_ptr_add_offset(base, thread_pagesize); + + qid = thread_quasi_id_fast(base); + + /* + * When we create our threads, we allocate the stack and therefore we + * know the range of QIDs that it is going to occupy. We can then purge + * the QID cache out of stale QID values. + */ + + te->low_qid = qid; + te->high_qid = thread_quasi_id_fast( + const_ptr_add_offset(base, te->stack_size - 1)); + te->top_qid = thread_sp_direction > 0 ? te->low_qid : te->high_qid; + + g_assert((te->high_qid - te->low_qid + 1) * thread_pagesize + == te->stack_size); + + te->top_sp = &te; + + /* + * On Windows unforturnately two things happpen: + * + * - the pthread layer does not honour the configured stack size + * - the system automatically grows the stack up to some unknown limit + * + * Fortunately, it appears the system also reserves the memory region + * and we can compute its allocation start, thereby we can patch-up + * the te->low_qid value to be the start of that region. + * + * We do not change the configured te->stack_size though, as it will + * allow us to detect "overflows" before the kernel can signal them, due + * to the bottom guard page being hit. + * + * --RAM, 2015-11-10 + */ + +#ifdef MINGW32 + { + void *bottom = mingw_memstart(&qid); + + if (NULL == bottom) { + s_rawwarn("%s(): cannot compute real stack bottom for thread #%u", + G_STRFUNC, te->stid); + } else { + te->low_qid = thread_quasi_id_fast(bottom); + } + } +#endif /* MINGW32 */ + + /* + * Once the TID and the QID ranges have been set for the thread we're + * creating, we can flag the record as valid so as to allow its finding. + */ + + thread_set(te->tid, t); + thread_qid_cache_force(te->stid, te->low_qid, te->high_qid); + te->valid = TRUE; + + /* + * Need to enter critical section now since we're updating global thread + * contextual information and this needs to happen atomically. + */ + + mutex_lock_fast(&thread_insert_mtx); + + thread_element_common_init(te, t); + + /* + * Make sure no other running threads can cover our QID range. + */ + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *xte = threadsi; + + if G_UNLIKELY(!xte->valid || xte == te) + continue; + + /* + * Skip items marked as THREAD_INVALID in tstid. + * This means the thread is under construction and therefore we + * won't find what we're looking for there. + */ + + if G_UNLIKELY(thread_eq(THREAD_INVALID, tstidxte->stid)) + continue; + + if G_UNLIKELY( + te->high_qid >= xte->low_qid && + te->low_qid <= xte->high_qid + ) { + /* + * This old thread is necessarily dead if it overlaps our QID range + * and it was a created thread. For discovered threads, we can + * never know what their QID range is for sure but we can exclude + * the overlapping ranges. + */ + + THREAD_LOCK(xte); + if (xte->discovered || xte->exiting || xte->exit_started) { + bool dead_thread = FALSE; + + if ( + xte->low_qid <= te->low_qid && + xte->high_qid >= te->high_qid + ) { + /* te fully embedded within xte range */ + if ( + xte->last_qid <= + xte->low_qid + (xte->high_qid - xte->low_qid) / 2 + ) { + /* We keep the lower part of the xte range */ + xte->high_qid = te->low_qid - 1; + if (thread_sp_direction > 0) + xte->top_qid = xte->high_qid; + } else { + /* We keep the upper part of the xte range */ + xte->low_qid = te->high_qid + 1; + if (thread_sp_direction < 0) + xte->top_qid = xte->low_qid; + } + if (xte->low_qid > xte->high_qid) + dead_thread = TRUE; + goto done; + } + + if ( + xte->low_qid <= te->low_qid && + xte->high_qid >= te->high_qid + ) { + /* xte fully embedded within te range */ + dead_thread = TRUE; + goto done; + } + + if (xte->low_qid <= te->low_qid) { + xte->high_qid = te->low_qid - 1; + if (thread_sp_direction > 0) + xte->top_qid = xte->high_qid; + } else if (xte->high_qid >= te->high_qid) { + xte->low_qid = te->high_qid + 1; + if (thread_sp_direction < 0) + xte->top_qid = xte->low_qid; + } + if (xte->low_qid > xte->high_qid) + dead_thread = TRUE; + + /* FALL THROUGH */ + + done: + if G_UNLIKELY(dead_thread) { + /* This thread is dead and will no longer run */ + thread_set(tstidxte->stid, THREAD_INVALID); + + /* + * If the thread was discovered and flagged as + * "exit_started", then we must not do anything yet + * as it is being monitored and handled. + */ + + if (xte->discovered && !xte->exit_started) { + s_miniwarn("%s(): discovered thread #%u is dead", + G_STRFUNC, xte->stid); + + thread_element_mark_reusable_locked(xte); + xte->discovered = FALSE; + atomic_uint_dec(&thread_discovered); + } + } + } else { + s_minierror("conflicting QID range between created thread #%u " + "%zu, %zu and %s thread #%u %zu, %zu", + te->stid, te->low_qid, te->high_qid, + xte->created ? "created" : + xte->discovered ? "discovered" : "unknown", + xte->stid, xte->low_qid, xte->high_qid); + } + THREAD_UNLOCK(xte); + } + } + + mutex_unlock_fast(&thread_insert_mtx); +} + +/** + * Callback invoked when the special monitoring key we set in each discovered + * thread is reclaimed by the pthread runtime, which will happen when the thread + * is exiting. + */ +static void +thread_will_exit(void *arg) +{ + struct thread_element *te = arg; + + thread_element_check(te); + g_assert_log(te->discovered, + "%s(): thread #%u not discovered (%s created)", + G_STRFUNC, te->stid, te->created ? "was" : "neither"); + + te->exit_started = TRUE; /* Signals we have begun exiting the thread */ + + /* + * Since the thread was discovered, we wait a little bit to reuse its + * thread element: we cannot know for sure that this is the last activity + * we will see for that dying thread (other cleanup could involve freeing + * allocated objects). + * + * We have to pray for the holding time to be large enough or we will mark + * the thread reusable too soon! The consequence is that we could + * re-discover the same thread on its exit path, but this time there will + * be no usable hook to let us know the thread has died, possibly leading + * to a thread element leak if we cannot determine for sure that the thread + * is dead. + */ + + evq_raw_insert(THREAD_HOLD_TIME, thread_probably_gone, te); +} + +/** + * Instantiate an already allocated thread element to be a descriptor for + * the current discovered thread. + */ +static void +thread_instantiate(struct thread_element *te, thread_t t) +{ + assert_mutex_is_owned(&thread_insert_mtx); + g_assert_log(0 == thread_element_lock_count(te), + "discovered thread #%u already holds %zu lock%s", + te->stid, thread_element_lock_count(te), + plural(thread_element_lock_count(te))); + + THREAD_STATS_INC(discovered); + thread_cleanup(te); + thread_element_reset(te); + te->discovered = TRUE; + te->running = TRUE; + te->last_seen = tm_time_raw(); + te->cancelable = FALSE; + te->cancl = THREAD_CANCEL_DISABLE; + thread_set(te->tid, t); + thread_stack_init_shape(te, &te); + thread_element_common_init(te, t); + te->system_thread_id = compat_gettid(); + thread_monitor_exit(te); +} + +/** + * Allocate a signal stack for the created thread. + */ +static void +thread_sigstack_allocate(struct thread_element *te) +{ + thread_qid_t qid; + size_t len; + + g_assert(te->created); + + len = signal_stack_allocate(&te->sig_stack); + + if (NULL == te->sig_stack) + return; + + qid = thread_quasi_id_fast(te->sig_stack); + + te->low_sig_qid = qid; + te->high_sig_qid = thread_quasi_id_fast( + const_ptr_add_offset(te->sig_stack, len - 1)); + + g_assert((te->high_sig_qid - te->low_sig_qid + 1) * thread_pagesize == len); +} + +/** + * Allocate a new thread element in advance, if we haven't yet allocated all + * our thread elements. + * + * @return TRUE if we were able to allocate an element (or we already have + * pre-allocated the next element), FALSE if we cannot create any more elements + * because we have reached the maximum amount. + */ +static bool +thread_preallocate_element(void) +{ + assert_mutex_is_owned(&thread_insert_mtx); + + if G_UNLIKELY(NULL != thread_next_te) + return TRUE; /* Already allocated */ + + if G_UNLIKELY(THREAD_MAX == thread_allocated_count) + return FALSE; /* Cannot allocate more elements */ + + thread_allocated_count++; + OMALLOC0(thread_next_te); /* Never freed */ + thread_lock_stack_init(thread_next_te); + + return TRUE; /* Next element properly allocated */ +} + +/** + * Initialize expanded data structures in thread element. + */ +static void +thread_init_element(struct thread_element *te) +{ + size_t interrupt_offset = offsetof(struct thread_interrupt_cb, lnk); + + spinlock_init(&te->lock); + eslist_init(&te->exit_list, offsetof(struct thread_exit_cb, lnk)); + eslist_init(&te->cleanup_list, offsetof(struct thread_cleanup_cb, lnk)); + eslist_init(&te->interrupt_list, interrupt_offset); + eslist_init(&te->interrupt_ack_list, interrupt_offset); + mutex_init(&te->interrupt_lock); + mutex_init(&te->interrupt_ack_lock); +} + +/** + * Allocate a new thread element, partially initialized. + * + * The ``tid'' field is left uninitialized and will have to be filled-in + * when the item is activated, as well as other thread-specific fields. + * + * @attention + * After each call to thread_new_element(), one needs to call + * thread_preallocate_element() before releasing the "thread_insert_mtx" + * mutex, to prepare for the next thread. + */ +static struct thread_element * +thread_new_element(unsigned stid) +{ + struct thread_element *te; + + assert_mutex_is_owned(&thread_insert_mtx); + + if G_UNLIKELY(threadsstid != NULL) { + /* Could happen in case of assertion failure in discovered thread */ + te = threadsstid; + if (THREAD_ELEMENT_MAGIC == te->magic) + goto allocated; + g_assert_not_reached(); + } + + /* + * Use pre-allocated element, since we cannot allocate memory yet in + * the context of this thread. + */ + + g_assert(thread_next_te != NULL); + + te = thread_next_te; + thread_next_te = NULL; + + te->magic = THREAD_ELEMENT_MAGIC; + thread_set(te->tid, THREAD_INVALID); + te->last_qid = (thread_qid_t) -1; + te->stid = stid; + te->wfd0 = te->wfd1 = INVALID_FD; + + thread_init_element(te); + + thread_stack_init_shape(te, &te); + te->valid = TRUE; /* Minimally ready */ + te->discovered = TRUE; /* Assume it was discovered */ + te->last_seen = tm_time_raw(); + + threadsstid = te; /* Record, but do not make visible yet */ + +allocated: + return te; +} + +/** + * Update the next STID that will be used, which is also the amount of valid + * entries in threads. + */ +static void +thread_update_next_stid(void) +{ + unsigned i; + + spinlock_raw(&thread_next_stid_slk); + + for (i = 0; i < N_ITEMS(threads); i++) { + if G_UNLIKELY(NULL == threadsi) + break; + } + + thread_next_stid = i; + + spinunlock_raw(&thread_next_stid_slk); +} + +/** + * Callback invoked when a time adjustment has been detected. + * + * @param unused_delta delta, in ms + */ +static void +thread_time_adjust(int unused_delta) +{ + uint i; + + (void) unused_delta; + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *te = threadsi; + bool unblock = FALSE; + + if (te->timed_blocked) { + THREAD_LOCK(te); + if (0 == te->signalled) { + /* Will send an unblocking byte */ + atomic_uint_inc(&te->signalled); + unblock = TRUE; + } + THREAD_UNLOCK(te); + } + + if G_UNLIKELY(unblock) { + char c = '\0'; + if (-1 == s_write(te->wfd1, &c, 1)) { + atomic_uint_dec(&te->signalled); + s_miniwarn("%s(): cannot unblock %s via write(%u): %m", + G_STRFUNC, thread_element_name(te), te->wfd1); + } + } + } +} + +/** + * Instantiate the main thread element using static memory. + * + * This is used to reserve STID=0 to the main thread, when possible. + * + * This routine MUST be called with the "thread_insert_mtx" held, in + * fast mode. It will be released upon return. + */ +static struct thread_element * +thread_main_element(thread_t t) +{ + static struct thread_element te_main; + static struct thread_lock locks_arena_mainTHREAD_LOCK_MAX; + static struct thread_lock waits_arena_mainTHREAD_LOCK_NESTED; + struct thread_element *te; + struct thread_lock_stack *tls; + thread_qid_t qid; + unsigned stid; + + assert_mutex_is_owned(&thread_insert_mtx); + g_assert(NULL == threads0); + + stid = atomic_uint_inc(&thread_allocated_stid); + g_assert(0 == stid); + + THREAD_STATS_INC(discovered); + atomic_uint_inc(&thread_discovered); + + /* + * Do not use any memory allocation at this stage. + * + * Indeed, if we call xmalloc() it will auto-initialize and install + * its periodic xgc() call through the callout queue. We do not want + * the callout queue created yet since that could put it in thread #0, + * if the main thread is recorded blockable via thread_set_main(). + */ + + qid = thread_quasi_id_fast(&t); + te = &te_main; + te->magic = THREAD_ELEMENT_MAGIC; + te->last_qid = qid; + te->wfd0 = te->wfd1 = INVALID_FD; + te->discovered = TRUE; + te->last_seen = tm_time_raw(); + te->valid = TRUE; + thread_set(te->tid, t); + te->main_thread = TRUE; + te->name = "main"; + te->cancelable = FALSE; + te->cancelled = FALSE; + te->cancl = THREAD_CANCEL_DISABLE; + + thread_init_element(te); + + te->sighTSIG_DIVERT - 1 = thread_divert_handle; + te->sighTSIG_INTACK - 1 = thread_interrupt_ack_handle; + + tls = &te->locks; + tls->arena = locks_arena_main; + tls->capacity = N_ITEMS(locks_arena_main); + tls->count = 0; + + tls = &te->waits; + tls->arena = waits_arena_main; + tls->capacity = N_ITEMS(waits_arena_main); + tls->count = 0; + + thread_stack_init_shape(te, &te); + + threads0 = te; + thread_set(tstid0, te->tid); + te->system_thread_id = compat_gettid(); + thread_update_next_stid(); + + /* + * Pre-allocate the next thread element. whilst we're holding the global + * "thread_insert_mtx" lock. + */ + + thread_allocated_count++; /* Main thread */ + thread_preallocate_element(); + + /* + * Now we can allocate memory because we have created enough context + * for the main thread to let any other thread created be thread #1. + * + * We need to release the spinlock before proceeding though, in case + * xmalloc() is called and we need to create a new thread for the + * callout queue. + */ + + mutex_unlock_fast(&thread_insert_mtx); + + /* + * We're now sufficienly far in the initialization to be able to + * install a crash hook for our thread runtime. + */ + + crash_hook_add(_WHERE_, thread_crash_hook); + + return te; +} + +/** + * Install time event listener to react in case the system clock is adjusted. + */ +static void +thread_install_tm_listener(void) +{ + tm_event_listener_add(thread_time_adjust); +} + + +/** + * Get the main thread element when we are likely to be the first thread. + * + * @return the main thread element if we are the main thread, NULL otherwise. + */ +static struct thread_element * +thread_get_main_if_first(void) +{ + mutex_lock_fast(&thread_insert_mtx); + if (NULL == threads0) { + return thread_main_element(thread_self()); /* Lock was released */ + } else { + mutex_unlock_fast(&thread_insert_mtx); + return NULL; + } +} + +/** + * Attempt to reuse a thread element, from a created thread that is now gone. + * + * @return reused thread element if one can be reused, NULL otherwise. + */ +static struct thread_element * +thread_reuse_element(void) +{ + struct thread_element *te = NULL; + unsigned i; + + assert_mutex_is_owned(&thread_insert_mtx); + + /* + * Because the amount of thread slots (small IDs) is limited, we reuse + * threads that we created and have been joined (which is set regardless + * of whether the thread was joinable or detached, to record the fact + * that the thread is gone). + */ + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *t = threadsi; + + if (t->reusable) { + THREAD_LOCK(t); + if (t->reusable) { + te = t; /* Thread elemeent to reuse */ + t->reusable = FALSE; /* Prevents further reuse */ + } + THREAD_UNLOCK(t); + if (te != NULL) + break; + } + } + + return te; +} + +/** + * Find a thread element we can use for a new thread. + * + * @return a thread element, NULL if we cannot create a new one. + */ +static struct thread_element * +thread_find_element(void) +{ + struct thread_element *te = NULL; + + /* + * We must synchronize with thread_get_element() to avoid concurrent + * access to the data structures recording the threads we know. + * + * Contrary to thread_get_element() which auto-discovers new threads, + * we are here about to create a new thread and we want to pre-allocate + * an element that will be instantiated in the context of the new thread + * once it has been launched. + */ + + mutex_lock_fast(&thread_insert_mtx); + + /* + * If we cannot find a reusable slot, allocate a new thread element. + * The thread does not exist at this stage, so we cannot associate it + * with its thread_t. + */ + + te = thread_reuse_element(); + + /* + * Before creating a new thread, check whether the amount of running + * threads (threads we create) does not exceed the maximum we can create + * if we want to allow at least THREAD_FOREIGN threads (which we discover). + */ + + if (NULL == te) { + if G_LIKELY( + (thread_running + thread_pending_reuse) < THREAD_CREATABLE && + atomic_uint_get(&thread_allocated_stid) < THREAD_MAX + ) { + unsigned stid = atomic_uint_inc(&thread_allocated_stid); + + if (stid >= THREAD_MAX) + goto done; /* No more slots available */ + + /* + * In case there is nothing pre-allocated yet (which could be + * the case for the main thread, when we create new threads as + * part of the automatic initialization), make sure there is + * a thread element available before calling thread_new_element(). + */ + + if (!thread_preallocate_element()) + goto done; /* No more thread elements */ + + te = thread_new_element(stid); + thread_update_next_stid(); + thread_preallocate_element(); + } + } + + /* + * Mark the slot as used, but put an invalid thread since we do not know + * which thread_t will be allocated by the thread creation logic yet. + * + * Do that whilst still holding the mutex to synchronize nicely with + * thread_get_element(). + */ + + if (te != NULL) { + atomic_uint_inc(&thread_running); /* Not yet, but soon */ + thread_set(tstidte->stid, THREAD_INVALID); + } + +done: + /* + * Reset the element whilst we hold the mutex. It's not really required, + * but discovered threads can also call thread_element_reset() from a + * path where the mutex is held, so this gives us more consistency. + * --RAM, 2015-03-06 + */ + + if (te != NULL) + thread_element_reset(te); + + mutex_unlock_fast(&thread_insert_mtx); + + return te; +} + +/** + * Called when thread has been suspended for too long. + */ +static void +thread_timeout(const struct thread_element *te) +{ + static spinlock_t thread_timeout_slk = SPINLOCK_INIT; + unsigned i; + unsigned ostid = (unsigned) -1; + bool multiple = FALSE; + struct thread_element *wte; + + /* + * If the process is pausing due to a crash. then of course we're going + * to timeout waiting... therefore explicitly test for that condition. + */ + + while (crash_is_pausing()) { + compat_usleep_nocancel(THREAD_SUSPEND_PAUSING); + } + + if (!te->suspend) + return; + + /* + * OK, no longer pausing and still suspended, this is a timeout. + */ + + spinlock_raw(&thread_timeout_slk); + + for (i = 0; i < thread_next_stid; i++) { + const struct thread_element *xte = threadsi; + + if (0 == xte->suspend) { + if ((unsigned) -1 == ostid) + ostid = xte->stid; + else { + multiple = TRUE; + break; /* Concurrency update detected */ + } + } + } + + wte = (struct thread_element *) te; + wte->suspend = 0; /* Make us running again */ + + spinunlock_raw(&thread_timeout_slk); + + s_rawwarn("%s suspended for too long", thread_element_name_raw(te)); + + if (ostid != (unsigned) -1 && (multiple || ostid != te->stid)) { + s_rawwarn("%ssuspending thread was %s", + multiple ? "first " : "", thread_element_name_raw(threadsostid)); + } + + s_error("thread suspension timeout detected"); +} + +/** + * Forcefully suspend current thread, known as the supplied thread element, + * until it is flagged as no longer being suspended, or until the suspsension + * times out, at which time we panic. + * + * @return TRUE if we suspended. + */ +static bool +thread_suspend_loop(struct thread_element *te) { - static hash_table_t *ht; + bool suspended = FALSE; + unsigned i; + time_t start = 0; - if G_UNLIKELY(NULL == ht) { - static spinlock_t private_slk = SPINLOCK_INIT; - spinlock(&private_slk); - if (NULL == ht) { - ht = hash_table_new_full_real(thread_hash, thread_equal); - hash_table_thread_safe(ht); + /* + * If we are running in the crashing thread, refuse to suspend and + * immediately suspend the other threads. + */ + + if (crash_is_crashing_thread(NULL)) { + s_rawwarn("%s(): %s is the crashing thread", + G_STRFUNC, thread_element_name_raw(te)); + + THREAD_LOCK(te); + te->suspend = 0; + te->suspended = FALSE; + THREAD_UNLOCK(te); + + thread_suspend_others(FALSE); + + return FALSE; /* Refuse to suspend */ + } + + THREAD_STATS_INCX(thread_self_suspends); + + /* + * To avoid race conditions, we need to re-check atomically that we + * indeed need to be suspended. The caller has checked that before + * but outside of a critical section, hence the most likely scenario + * is that we are indeed going to suspend ourselves for a while. + */ + +again: + + THREAD_LOCK(te); + if G_UNLIKELY(0 == te->suspend) { + THREAD_UNLOCK(te); + return suspended; + } + te->suspended = TRUE; + THREAD_UNLOCK(te); + + /* + * Suspension loop. + */ + + for (i = 1; /* empty */; i++) { + if G_UNLIKELY(0 == te->suspend) + break; + + if (i < THREAD_SUSPEND_LOOP) + thread_yield(); + else + compat_usleep_nocancel(THREAD_SUSPEND_DELAY); + + suspended = TRUE; + + /* + * Make sure we don't stay suspended indefinitely: funnelling from + * other threads should occur only for a short period of time. + * + * Do not call tm_time_exact() here since that routine will call + * thread_check_suspended() which will again call us since we're + * flagged as suspended now, causing endless recursion. + * + * FIXME: + * The above means we cannot use gentime_now() either, and therefore + * we are vulnerable to a sudden sytem clock change during suspension. + */ + + if G_UNLIKELY(0 == (i & THREAD_SUSPEND_CHECK)) { + if (0 == start) + start = time(NULL); + if (delta_time(time(NULL), start) > THREAD_SUSPEND_TIMEOUT) + thread_timeout(te); + } + } + + THREAD_LOCK(te); + te->suspended = FALSE; + + /* + * Check whether a diversion was installed and run it if there is one, + * before suspending again if necessary. + */ + + if (te->div != NULL) { + uint depth = atomic_uint_get(&thread_suspend_depth); + + THREAD_UNLOCK(te); + thread_divert_run(te); + THREAD_LOCK(te); + + /* + * We need to account for possible thread_unsuspend_others() + * calls that would have occured whilst we were busy running + * the diversion code: they would have affected us if we had + * not run the diversion. However, further calls to + * thread_suspend_others() will properly increment our suspend + * field, hence we need to account only for decreasing global + * suspension depth. + */ + + { + uint ndepth = atomic_uint_get(&thread_suspend_depth); + + if (ndepth < depth) { + int delta = depth - ndepth; + + if (te->suspend <= delta) + te->suspend = 0; + else + te->suspend -= delta; + } } - spinunlock(&private_slk); + + start = time(NULL); /* Reset suspension start after diversion */ + } + + THREAD_UNLOCK(te); + + goto again; +} + +/** + * Voluntarily suspend execution of the current thread, as described by the + * supplied thread element, if it is flagged as being suspended. + * + * @return TRUE if we suspended. + */ +static bool +thread_suspend_self(struct thread_element *te) +{ + /* + * We cannot let a thread holding spinlocks or mutexes to suspend itself + * since that could cause a deadlock with the concurrent thread that will + * be running. For instance, the VMM layer could be logging a message + * whilst it holds an internal mutex. + */ + + g_assert(0 == thread_element_lock_count(te)); + + return thread_suspend_loop(te); +} + +/** + * Find existing thread element whose stack encompasses the given QID. + */ +static struct thread_element * +thread_qid_match(thread_qid_t qid) +{ + unsigned i; + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *te = threadsi; + + if G_UNLIKELY(!te->valid) + continue; + + /* + * Skip items marked as THREAD_INVALID in tstid. + * This means the thread is under construction and therefore we + * won't find what we're looking for there. + */ + + if G_UNLIKELY(thread_eq(THREAD_INVALID, tstidte->stid)) + continue; + + if G_UNLIKELY(qid >= te->low_qid && qid <= te->high_qid) + return te; } - return ht; + return NULL; /* Not found */ +} + +/** + * Find existing thread element by matching thread_t values. + */ +static struct thread_element * +thread_find_tid(thread_t t) +{ + unsigned i; + struct thread_element *te = NULL; + + THREAD_STATS_INCX(lookup_by_tid); + + for (i = 0; i < N_ITEMS(tstid); i++) { + /* Allow look-ahead of to-be-created slot, hence the ">=" */ + if G_UNLIKELY(i >= atomic_uint_get(&thread_allocated_stid)) + break; + + /* + * Skip items marked as THREAD_INVALID in tstid. + * This means the thread is under construction and therefore we + * won't find what we're looking for there. + */ + + if G_UNLIKELY(thread_eq(THREAD_INVALID, tstidi)) + continue; + + if G_UNLIKELY(thread_eq(tstidi, t)) { + te = threadsi; + if (NULL == te) + continue; + if (te->reusable || !te->valid) { + te = NULL; + continue; + } + break; + } + } + + return te; +} + +/** + * Find existing thread based on the known QID of the thread. + * + * This routine is called on lock paths, with thread_element structures + * possibly locked, hence we need to be careful to not deadlock. + * + * @param qid known thread QID + * + * @return the likely thread element to which the QID could relate, NULL if we + * cannot determine the thread. + */ +static struct thread_element * +thread_find_qid(thread_qid_t qid) +{ + unsigned i; + struct thread_element *te = NULL; + uint smallest = -1U; + + THREAD_STATS_INCX(lookup_by_qid); + + /* + * Perform linear lookup, looking for a matching thread: + * + * - For created threads, we known the QID boundaries since we known the + * requested stack size, hence we can perform perfect matches. + * + * - For discovered threads, we can never be sure of the stack range, since + * we do not know beforehand where in the possible stack range for the + * thread we first learnt about it: the stack pointer could be higher or + * lower the next time we see it. Therefore, we look for the smallest + * distance to the QID segment, hoping that it will indeed correspond to + * that thread. + */ + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *xte = threadsi; + uint distance; + + /* + * Skip items marked as THREAD_INVALID in tstid. + * This means the thread is under construction and therefore we + * won't find what we're looking for there. + */ + + if G_UNLIKELY(THREAD_INVALID == tstidi) + continue; + + if G_UNLIKELY(!xte->valid || xte->reusable) + continue; + + /* + * If the thread was created and the QID falls within the known range, + * then we have an exact match. Don't attempt approximate matches + * with a created thread! + * + * For a discovered thread, if we fall within the range we have no + * reason to doubt it's the same thread as before here. + */ + + if G_UNLIKELY(qid >= xte->low_qid && qid <= xte->high_qid) + return xte; + + /* + * If there is a signal stack, check whether we're running on it. + */ + + if G_UNLIKELY(qid >= xte->low_sig_qid && qid <= xte->high_sig_qid) + return xte; + + if (xte->created || xte->creating) + continue; + + /* + * In a discovered thread, and no exact match so far. Compute the + * distance to the QID range (we know the QID does not fall within + * the range). + */ + + if (qid < xte->low_qid) + distance = xte->low_qid - qid; + else + distance = qid - xte->high_qid; /* qid > xte->high_qid */ + + if G_UNLIKELY(distance == smallest) { + /* Favor moves in the stack growth direction */ + if (thread_sp_direction > 0 && qid > xte->high_qid) + te = xte; + else if (thread_sp_direction < 0 && qid < xte->low_qid) + te = xte; + } else if (distance < smallest) { + smallest = distance; + te = xte; + } + } + + /* + * Refuse match if the distance is too large. + * + * We use our minimum stack size as a measure of what "too large" is: we + * retain half the stack size minus one page. Anything further than that + * will not be returned as a match. + */ + + if (smallest > (UNSIGNED(THREAD_STACK_MIN >> (1 + thread_pageshift))) - 1) + return NULL; + + return te; /* No exact match, returns closest match */ +} + +/** + * Find existing thread based on the known QID of the thread, updating + * the QID cache at the end. + * + * This routine is called on lock paths, with thread_element structures + * possibly locked, hence we need to be careful to not deadlock. + * + * @param qid known thread QID + * + * @return the likely thread element to which the QID could relate, NULL if we + * cannot determine the thread. + */ +static struct thread_element * +thread_find_via_qid(thread_qid_t qid) +{ + struct thread_element *te; + + /* + * Watch out when we are in the middle of the thread creation process: + * it is necessary to return the proper thread so that any lock acquired + * during the critical section be properly attributed to the new thread, + * or to none if we can't find the thread. + * + * We therefore mostly lookup threads by TID, the only time when we're + * not is when we have a stack pointer and we wish to determine to which + * thread it belongs. + */ + + te = thread_find_qid(qid); + + /* + * If we found a discovered thread (and it is not the main thread), we + * have to check the thread ID as well because the original thread + * could have disappeared and been replaced by another. + */ + + if G_UNLIKELY(te != NULL && te->discovered && !te->main_thread) { + thread_t t = thread_self(); + if (!thread_eq(te->tid, t)) { + te = thread_find_tid(t); /* Find proper TID instead */ + } + } + + /* + * Cache result. + */ + + if G_LIKELY(te != NULL) { + unsigned idx = thread_qid_hash(qid); + + /* + * Update the QID range if this is a discovered thread. + * + * If it is a created thread, we know the stack size so we know + * the QID range of our threads as soon as they are launched. + */ + + if G_UNLIKELY( + te->discovered && + (qid < te->low_qid || qid > te->high_qid) + ) { + thread_element_update_qid_range(te, qid); + } + + thread_qid_cache_set(idx, te, qid); + } + + return te; +} + +/** + * Find existing thread based on the supplied stack pointer. + * + * This routine is called on lock paths, with thread_element structures + * possibly locked, hence we need to be careful to not deadlock. + * + * @param sp a pointer to the thread's stack + * + * @return the likely thread element to which the stack pointer could relate, + * NULL if we cannot determine the thread. + */ +static inline struct thread_element * +thread_find(const void *sp) +{ + struct thread_element *te; + thread_qid_t qid; + unsigned idx; + + /* + * Since we have a stack pointer belonging to the thread we're looking, + * check whether we have it cached by its QID. + */ + + qid = thread_quasi_id_fast(sp); + idx = thread_qid_hash(qid); + + te = thread_qid_cache_get(idx); + if G_LIKELY(thread_element_matches(te, qid)) + return te; + + te = thread_find_via_qid(qid); + if G_LIKELY(te != NULL) + return te; + + /* + * We can only come here for discovered threads since created threads + * have a known QID range. + */ + + te = thread_find_tid(thread_self()); + if G_LIKELY(te != NULL) { + thread_element_update_qid_range(te, qid); + return te; + } + + /* + * Thread completely unknown, unless we're the main thread and we do + * not know it yet: assume we are the main thread if the main thread + * is unknown yet. + */ + + if G_UNLIKELY(NULL == threads0) + return thread_get_main_if_first(); + + return NULL; +} + +/** + * Get the thread-private element. + * + * If no element was already associated with the current thread, a new one + * is created and attached to the thread. + * + * @return the thread-private element associated with the current thread. + */ +static struct thread_element * +thread_get_element(void) +{ + unsigned stid, idx; + thread_qid_t qid; + thread_t t; + struct thread_element *te; + int retries; + + /* + * First look for thread via the QID cache + */ + + qid = thread_quasi_id_fast(&qid); + idx = thread_qid_hash(qid); + + te = thread_qid_cache_get(idx); + if G_LIKELY(thread_element_matches(te, qid)) + return te; + + /* + * Not in cache, look for a match by comparing known QID ranges. + */ + + te = thread_find_via_qid(qid); + if G_LIKELY(te != NULL) { + thread_element_stack_check(te); /* For Windows only */ + return te; + } + + /* + * Reserve STID=0 for the main thread if we can, since this is + * the implicit ID that logging routines know as the "main" thread. + */ + + t = thread_self(); + + if G_UNLIKELY(NULL == threads0) { + te = thread_get_main_if_first(); + if (te != NULL) + goto found; + } + + retries = 0; + + /* + * Enter critical section to make sure only one thread at a time + * can manipulate the threads and tstid arrays. + */ + +retry: + mutex_lock_fast(&thread_insert_mtx); /* Don't record */ + + /* + * Before allocating a new thread element, check whether the current + * stack pointer lies within the boundaries of a known thread. If it + * does, it means the thread terminated and a new one was allocated. + * Re-use the existing slot. + */ + + te = thread_qid_match(qid); + + if (te != NULL) { + thread_reused++; + } else { + /* + * For discovered threads, we need to be smarter and look at whether + * the thread ID is not being one of a known thread. If it is, then + * we can extend the QID range for next time. + */ + + te = thread_find_tid(t); + if (te != NULL) { + if (te->discovered) { + thread_set(te->tid, t); + thread_element_update_qid_range(te, qid); + goto created; + } + g_assert(!thread_eq(THREAD_INVALID, te->tid)); + } + + /* + * We found no thread bearing that ID, we've discovered a new thread. + */ + + te = thread_reuse_element(); + } + + if (te != NULL) { + if (!te->discovered) + atomic_uint_inc(&thread_discovered); + + /* + * We have a thread element for the discovered thread, and hence a + * thread ID. It is critical to let the xmalloc() layer know that this + * thread is now running so that it can make sure cross-thread freeing + * works correctly for the thread chunks used by the discovered thread. + */ + + xmalloc_thread_starting(te->stid); + + thread_set(tstidte->stid, t); + thread_instantiate(te, t); + goto created; + } + + /* + * OK, we have an additional thread. + */ + + stid = atomic_uint_inc(&thread_allocated_stid); + + if G_UNLIKELY(stid >= THREAD_MAX) { + /* + * When the amount of running threads is less than THREAD_MAX, it + * means we created a lot of threads which have now exited but which + * have not been joined yet. + * + * Try to wait if there are threads pending reuse. + */ + + mutex_unlock_fast(&thread_insert_mtx); + + if (thread_pending_reuse != 0 && retries++ < 200) { + compat_usleep_nocancel(5000); + goto retry; + } + + thread_panic_mode = TRUE; + s_minierror("discovered thread #%u but can only track %d threads", + stid, THREAD_MAX); + } + + /* + * Recording the current thread in the tstid array allows us to be + * able to return the new thread small ID from thread_small_id() before + * the allocation of the thread element is completed. + * + * It also allows us to translate a TID back to a thread small ID + * when inspecting mutexes, mostly during crashing dumps. + */ + + thread_set(tstidstid, t); + + /* + * We decouple the creation of thread elements and their instantiation + * for the current thread to be able to reuse thread elements (and + * their small ID) when we detect that a thread has exited or when + * we create our own threads. + * + * This strategy also allows us to pre-allocate thread elements so that + * we do not have to allocate memory in a discovered thread before it is + * properly instantiated, which could lead to problems should locks be + * taken by the memory allocator. + * --RAM, 2014-05-12 + */ + + atomic_uint_inc(&thread_discovered); + te = thread_new_element(stid); + thread_instantiate(te, t); + thread_update_next_stid(); + + /* + * Now that the discovered thread has been properly instantiated, we are + * able to allocate memory for this thread. Pre-allocate the next thread + * element in case we have another thread to discover later. + */ + + thread_preallocate_element(); + + /* FALL THROUGH */ + +created: + /* + * At this stage, the thread has been correctly initialized and it + * will be correctly located by thread_find(). Any spinlock or mutex + * we'll be tacking from now on will be correctly attributed to the + * new thread. + */ + + mutex_unlock_fast(&thread_insert_mtx); + +found: + /* + * Maintain lowest and highest stack addresses for thread. + */ + + thread_element_update_qid_range(te, qid); + thread_element_stack_check(te); /* For Windows only */ + + /* + * Cache result to speed-up things next time if we come back for the + * same thread with the same QID. + */ + + g_assert(thread_eq(t, te->tid)); + + thread_qid_cache_set(idx, te, qid); + + return te; +} + +/** + * Signal handler for TSIG_DIVERT. + */ +static void +thread_divert_handle(int signo) +{ + struct thread_element *te = thread_get_element(); + g_assert(TSIG_DIVERT == signo); + + if (te->div != NULL) + thread_divert_run(te); } /** * Get the thread-private hash table storing the per-thread keys. */ static hash_table_t * -thread_get_private_hash(void) +thread_get_private_hash(struct thread_element *te) { - thread_t t = thread_current(); - hash_table_t *ght; - hash_table_t *pht; + /* + * The private hash table is lazily created because not all the threads + * are going to require usage of thread-private data. Since this data + * structure is never freed, even when the thread dies, it pays to be + * lazy, especially if there are many "discovered" threads in the process. + */ + + if G_UNLIKELY(NULL == te->pht) + te->pht = hash_table_once_new_real(); /* Never freed! */ + + return te->pht; +} + +/** + * Conpute stack usage for given thread. + * + * @param stid the thread for which we want to compute usage + * @param sp a stack pointer that ought to belong to the thread stack + * + * @return thread stack usage given thread ID, 0 if stid is invalid. + */ +size_t +thread_id_stack_used(uint stid, const void *sp) +{ + struct thread_element *te; + static void *base; + + if (stid >= THREAD_MAX) + return 0; + + te = threadsstid; + if (NULL == te || !te->valid) + return 0; + + base = ulong_to_pointer(te->low_qid << thread_pageshift); + if (thread_sp_direction < 0) + base = ptr_add_offset(base, (1 << thread_pageshift)); + + return thread_stack_ptr_offset(base, sp); +} + +/** + * @return current thread stack usage. + */ +size_t +thread_stack_used(void) +{ + struct thread_element *te = thread_get_element(); + + return thread_id_stack_used(te->stid, &te); +} + +/** + * Invoke signal handler for a specified signal. + * + * @param te the thread element of the current thread + * @param sig the signal number + * @param handler the signal handler to invoke. + */ +static void +thread_signal_handle(struct thread_element *te, int sig, tsighandler_t handler) +{ + /* + * Deliver signal, masking it whilst we process it to prevent + * further occurrences. + * + * Since only the thread can manipulate its signal mask or the + * in_signal_handler field, there is no need to lock the element. + */ + + te->sig_mask |= tsig_mask(sig); + te->in_signal_handler++; + (*handler)(sig); + te->in_signal_handler--; + te->sig_mask &= ~tsig_mask(sig); + + g_assert(te->in_signal_handler >= 0); + + THREAD_STATS_INCX(signals_handled); +} + +/** + * Check whether current thread is overflowing its stack by hitting the + * red-zone guard page at the end of its allocated stack. + * When it does, we panic immediately. + * + * This routine is meant to be called when we receive a SEGV signal to do the + * actual stack overflowing check. + * + * @param va virtual address where the fault occured (NULL if unknown) + */ +void +thread_stack_check_overflow(const void *va) +{ + struct thread_element *te = thread_get_element(); + thread_qid_t qva; + bool extra_stack = FALSE; + size_t redzone = 1; + + /* + * If we do not have a signal stack we cannot really process a stack + * overflow anyway. + * + * This is not true on Windows, which lacks sigaltstack() support but + * has PROT_GUARD, so it allows stack overflow processing, and seems + * to leave 3 pages at the bottom of the stack. + */ + +#ifdef MINGW32 + redzone = 3; /* Windows faults within 3 pages of stack limit */ +#else /* !MINGW32 */ + if (NULL == te->sig_stack) + return; +#endif /* MINGW32 */ + + /* + * Moreover, without a known faulting virtual address, we will not be able + * to detect that the fault happened in the red-zone page. + */ + + if (NULL == va) + return; + + /* + * Check whether we're nearing the top of the stack: if the QID lies in the + * last page of the stack, assume we're overflowing or about to. + */ + + qva = thread_quasi_id_fast(va); + + if (thread_sp_direction < 0) { + /* Stack growing down, base is high_qid */ + if (qva > te->low_qid + redzone) + return; /* Not faulting in the red-zone page */ + } else { + /* Stack growing up, base is low_qid */ + if (qva < te->high_qid - redzone) + return; /* Not faulting in the red-zone page */ + } + + te->stack_overflow = TRUE; /* Prevent deadly recursions */ + + /* + * Check whether we're running on the signal stack. If we do, we have + * extra stack space because we know SIGSEGV will always be delivered + * on the signal stack. + */ + + if (te->sig_stack != NULL) { + thread_qid_t qid = thread_quasi_id(); + + if (qid >= te->low_sig_qid && qid <= te->high_sig_qid) + extra_stack = TRUE; + + } + + /* + * If we allocated the stack through thread_stack_allocate(), undo the + * red-zone protection to let us use the extra page as stack space. + * + * This is only necessary when we're detecting that we are not running + * on the signal stack. This is possible on systems with no support for + * alternate signal stacks and for which we managed to get this far after + * a fault in the red-zone page (highly unlikely, but one day we may enter + * this routine outside of SIGSEGV handling). + */ + + if (te->stack != NULL && !extra_stack) { + if (thread_sp_direction < 0) { + mprotect(te->stack, thread_pagesize, PROT_READ | PROT_WRITE); + } else { + mprotect(ptr_add_offset(te->stack, te->stack_size), + thread_pagesize, PROT_READ | PROT_WRITE); + } + } + + /* + * If we have extra stack space, emit a detailed message about what is + * happening, otherwise emit a minimal panic message. + */ + + if (extra_stack) { + s_rawcrit("stack (%zu bytes) overflowing for %s", + te->stack_size, thread_element_name_raw(te)); + } else { + /* Don't attempt to unwind the stack, that costs stack space! */ + s_rawwarn("stack (%zu bytes) overflowing for %s", + te->stack_size, thread_element_name_raw(te)); + } + + thread_stack_overflow(te); + g_assert_not_reached(); +} + +/** + * Lookup thread by its QID. + * + * @param sp stack pointer from caller frame + * + * @return the thread element, or NULL if we miss the thread in the cache. + */ +static struct thread_element * +thread_qid_lookup(const void *sp) +{ + thread_qid_t qid; + unsigned idx; + struct thread_element *te; + + qid = thread_quasi_id_fast(sp); + idx = thread_qid_hash(qid); + te = thread_qid_cache_get(idx); + + if (thread_element_matches(te, qid)) + return te; + + return NULL; +} + +/** + * Safely (but slowly) get the thread small ID from a stack pointer. + * + * This routine is only used during exception processing. + * + * This routine is intended to be used only by low-level debugging code + * since it can fail to locate a discovered thread. + * + * @param sp the stack pointer of the thread for which we want the ID + * + * @return found thread ID, -1 on error. + */ +unsigned +thread_safe_small_id_sp(const void *sp) +{ + struct thread_element *te; + thread_qid_t qid; + + if G_UNLIKELY(thread_eq(THREAD_NONE, tstid0)) + return 0; + + /* + * Look in the QID cache for a match. + */ + + te = thread_qid_lookup(sp); + if G_LIKELY(NULL != te) + return te->stid; + + /* + * A light version of thread_find_via_qid() which does not update the QID + * cache to avoid taking locks, since this code is invoked from spinlock(). + */ + + qid = thread_quasi_id_fast(sp); + te = thread_find_qid(qid); + + if G_UNLIKELY(te != NULL && te->discovered && !te->main_thread) { + thread_t t = thread_self(); + if (!thread_eq(te->tid, t)) { + te = thread_find_tid(t); /* Find proper TID instead */ + } + } + + if G_LIKELY(NULL != te) + return te->stid; + + /* + * Will return -1 on error, not -2 as in thread_safe_small_id(). + */ + + return thread_stid_from_thread(thread_self()); +} + +/** + * Safely (but slowly) get the thread small ID. + * + * This routine is intended to be used only by low-level debugging code + * since it can fail to locate a discovered thread. + * + * @return found thread ID, -2 on error (leaving -1 to mean "invalid"). + */ +unsigned +thread_safe_small_id(void) +{ + struct thread_element *te; + thread_qid_t qid; + int stid; + + /* + * Look in the QID cache for a match. + */ + + te = thread_qid_lookup(&te); + if G_LIKELY(NULL != te) + return te->stid; + + if G_UNLIKELY(thread_eq(THREAD_NONE, tstid0)) + return 0; + + /* + * A light version of thread_find_via_qid() which does not update the QID + * cache to avoid taking locks, since this code is invoked from spinlock(). + */ + + qid = thread_quasi_id_fast(&te); + te = thread_find_qid(qid); + + if G_UNLIKELY(te != NULL && te->discovered && !te->main_thread) { + thread_t t = thread_self(); + if (!thread_eq(te->tid, t)) { + te = thread_find_tid(t); /* Find proper TID instead */ + } + } + + if G_LIKELY(NULL != te) { + thread_element_stack_check(te); /* For Windows only */ + return te->stid; + } + + stid = thread_stid_from_thread(thread_self()); + if G_LIKELY(-1 != stid) + return stid; + + return THREAD_UNKNOWN_ID; /* Error, cannot determine small thread ID */ +} + +/** + * Get thread small ID. + */ +unsigned +thread_small_id(void) +{ + struct thread_element *te; + int stid; + + /* + * Look in the QID cache for a match. + */ + + te = thread_qid_lookup(&te); + if G_LIKELY(NULL != te) + return te->stid; + + /* + * First thread not even known yet, say we are the first thread. + */ + + if G_UNLIKELY(thread_eq(THREAD_NONE, tstid0)) { + /* + * Reserve STID=0 for the main thread if we can. + */ + + mutex_lock_fast(&thread_insert_mtx); + + if (NULL == threads0) { + (void) thread_main_element(thread_self()); + /* Lock was released */ + } else { + mutex_unlock_fast(&thread_insert_mtx); + } + return 0; + } + + /* + * This call is used by logging routines, so we must be very careful + * about not deadlocking ourselves, yet we must use this opportunity + * to register the current calling thread if not already done, so try + * to call thread_get_element() when it is safe. + */ + + if G_LIKELY(!mutex_is_owned(&thread_insert_mtx)) + return thread_get_element()->stid; + + /* + * Since we're in the middle of thread instantiation, maybe we have + * recorded the thread ID but not yet configured the thread element? + */ + + stid = thread_stid_from_thread(thread_self()); + if G_LIKELY(stid >= 0) + return stid; + + /* + * If we have no room for the creation of a new thread, we're hosed. + */ + + if G_UNLIKELY(thread_next_stid >= THREAD_MAX || thread_panic_mode) { + thread_panic_mode = TRUE; + /* Force main thread */ + return -1U == thread_main_stid ? 0 : thread_main_stid; + } + + thread_panic_mode = TRUE; + s_error("cannot compute thread small ID"); +} + +/** + * Translate a thread ID into a small thread ID. + * + * @return small thread ID if thread is known, -1 otherwise. + */ +int +thread_stid_from_thread(const thread_t t) +{ + unsigned i; + int selected = -1; + + if G_UNLIKELY(thread_eq(THREAD_INVALID, t)) + return -1; + + for (i = 0; i < N_ITEMS(tstid); i++) { + /* Allow look-ahead of to-be-created slot, hence the ">" */ + if G_UNLIKELY(i > thread_next_stid) + break; + if G_UNLIKELY(thread_eq(t, tstidi)) { + struct thread_element *te = threadsi; + if (te != NULL && te->reusable) + continue; + selected = i; + break; + } + } + + return selected; +} + +/** + * Set the name of the current thread. + * + * @param name the name of the current thread (copied as-is) + */ +void +thread_set_name(const char *name) +{ + struct thread_element *te = thread_get_element(); + + thread_element_clear_name(te); + te->name = name; +} + +/** + * Set the name of the current thread, allocating an atomic string for it. + * + * @param name the name of the current thread (atomized) + */ +void +thread_set_name_atom(const char *name) +{ + struct thread_element *te = thread_get_element(); + + if (!te->atomic_name) { + te->name = NULL; + te->atomic_name = TRUE; + } + + atom_str_change(&te->name, name); +} + +/** + * Get the current thread name. + * + * The returned name starts with the word "thread", hence message formatting + * must take that into account. + * + * @return the name of the current thread, as pointer to static data. + */ +const char * +thread_name(void) +{ + static char bufTHREAD_MAX128; + const struct thread_element *te = thread_get_element(); + char *b = &bufte->stid0; + + return thread_element_name_to_buf(te, b, sizeof buf0, TRUE); +} + +/** + * Format thread name of specified thread ID into supplied buffer. + * + * @return pointer to the start of the buffer. + */ +static const char * +thread_id_name_to_buf(unsigned id, + char *b, size_t len, bool symbolic_name) +{ + const struct thread_element *te; + + if (id >= THREAD_MAX) { + str_bprintf(b, len, "<invalid thread ID %u>", id); + return b; + } + + te = threadsid; + if G_UNLIKELY(NULL == te) { + str_bprintf(b, len, "<unknown thread ID %u>", id); + return b; + } else if G_UNLIKELY(te->reusable) { + str_bprintf(b, len, "<%s thread ID %u>", + te->cancelled ? "cancelled" : "terminated", id); + return b; + } else if G_UNLIKELY(!te->valid && !te->creating) { + str_bprintf(b, len, "<invalid thread ID %u>", id); + return b; + } + + return thread_element_name_to_buf(te, b, len, symbolic_name); +} + +/** + * Get the current thread name, safely, without taking any locks. + * + * The returned name starts with the word "thread", hence message formatting + * must take that into account. + * + * @return the name of the current thread, as pointer to static data. + */ +const char * +thread_safe_name(void) +{ + static char bufTHREAD_MAX128; + unsigned stid = thread_safe_small_id(); + char *b; + + if (stid >= THREAD_MAX) + return "unknown thread"; + + b = &bufstid0; + + return thread_id_name_to_buf(stid, b, sizeof buf0, FALSE); +} + +/** + * Safely compute the name of the specified thread ID. + * + * This routine, by definition, is usually called during crashes or dire + * conditions, hence it carefully avoids calling thread_small_id() and + * does not request symbolic name computation. + * + * @return the name of the thread id, as pointer to static data. + */ +const char * +thread_safe_id_name(unsigned id) +{ + static char bufTHREAD_MAX128; + static char emergency128; + int stid = thread_safe_small_id(); + char *b; + + STATIC_ASSERT(sizeof emergency == sizeof buf0); + + b = stid < 0 ? emergency : &bufstid0; + + return thread_id_name_to_buf(id, b, sizeof emergency, FALSE); +} + +/** + * @return the name of the thread id, as pointer to static data. + */ +const char * +thread_id_name(unsigned id) +{ + static char bufTHREAD_MAX128; + static char emergency128; + char *b; + + STATIC_ASSERT(sizeof emergency == sizeof buf0); + + /* + * This routine may be called during crashes or dire conditions, so be + * careful and do not call thread_small_id() lightly. + */ + + if (signal_in_exception()) { + int stid = thread_safe_small_id(); + b = stid < 0 ? emergency : &bufstid0; + } else { + b = &bufthread_small_id()0; + } + + return thread_id_name_to_buf(id, b, sizeof emergency, TRUE); +} + +/** + * Find thread by name. + * + * There is no caching of the results, hence the caller should cache the + * result if it knows that the looked-up thread is a permanent thread. + * + * The name is the one set by thread_set_name(), and "main" is guaranteed to + * find the main thread. + * + * @param name the thread name + * + * @return the thread ID, -1 if not found. + */ +unsigned +thread_by_name(const char *name) +{ + unsigned i; + + g_assert(name != NULL); + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *te = threadsi; + bool found; + + THREAD_LOCK(te); + found = te->valid && te->name != NULL && 0 == strcmp(name, te->name); + THREAD_UNLOCK(te); + + if (found) + return i; + } + + return -1U; +} + +/** + * Wait until all the suspended threads are indeed suspended or no longer + * hold any locks (meaning they will get suspended as soon as they try + * to acquire one). + */ +static void +thread_wait_others(const struct thread_element *te) +{ + time_t start = 0; + unsigned i; + + for (i = 1; /* empty */; i++) { + unsigned j, busy = 0; + + thread_yield(); + + for (j = 0; j < thread_next_stid; j++) { + struct thread_element *xte = threadsj; + + if G_UNLIKELY(xte == te) + continue; + + if (xte->suspended || 0 == thread_element_lock_count(xte)) + continue; + + busy++; + } + + if (0 == busy) + return; + + /* + * Make sure we don't wait indefinitely. + * + * Avoid tm_time_exact() and use raw time(NULL) since the former + * will now call thread_check_suspended() and we want to avoid any + * possible endless recursion problem. + */ + + if G_UNLIKELY(0 == (i & THREAD_SUSPEND_CHECK)) { + if (0 == start) + start = time(NULL); + if (delta_time(time(NULL), start) > THREAD_SUSPEND_TIMEOUT) + thread_timeout(te); + } + } +} + +/** + * Handle pending signals. + * + * @return TRUE if we handled something. + */ +static bool +thread_sig_handle(struct thread_element *te) +{ + bool handled = FALSE; + tsigset_t pending; + int s; + + g_assert(0 == thread_element_lock_count(te) || thread_crash_mode_enabled); + + THREAD_STATS_INCX(sig_handled_count); + + /* + * Prevent recusion: since thread_check_suspended() will call + * thread_sig_handle(), we must avoid endless checks when a signal + * is present. + */ + + if G_UNLIKELY(te->sig_handling) + return FALSE; + + /* + * If the thread is supposed to be blocked, we're running code that is + * preceding the blocking and we must not handle signals now. + * --RAM, 2016-01-31 + */ + + if G_UNLIKELY(te->blocked) + return FALSE; + + te->sig_handling = TRUE; + +recheck: + + /* + * If the thread was cancelled, and cancelling is enabled, do not + * process signals. + */ + + if G_UNLIKELY(te->cancelled && THREAD_CANCEL_ENABLE == te->cancl) { + tsigset_t set; + + tsig_fillset(&set); + te->sig_mask = set; /* Block all signals from now on */ + + goto done; + } + + /* + * Load unblocked signals we have to process and clear the pending set. + * + * We need the lock here because the te->sig_pending field can be + * concurrently updated by other threads when posting signals. + */ + + THREAD_LOCK(te); + pending = ~te->sig_mask & te->sig_pending; + te->sig_pending &= te->sig_mask; /* Only clears unblocked signals */ + THREAD_UNLOCK(te); + + if G_UNLIKELY(0 == pending) + goto done; + + /* + * Do not process thread signals if we are already running in an + * interrupt handler, i.e. a signal handler (for kernel signals). + */ + + if G_UNLIKELY(signal_in_handler()) + goto done; + + /* + * We count reception of signals to let thread_sleep_interruptible() + * determine whether the thread sleeping got signals when it wakes up. + */ + + te->sig_generation++; + + /* + * Signal 0 is not a signal and is used to verify whether a thread ID + * is valid via thread_kill(). + */ + + for (s = 1; s < TSIG_COUNT; s++) { + tsighandler_t handler; + + if G_LIKELY(0 == (tsig_mask(s) & pending)) + continue; + + handler = te->sighs - 1; + + if G_UNLIKELY(TSIG_IGN == handler || TSIG_DFL == handler) { + THREAD_STATS_INCX(signals_ignored); + continue; + } + + thread_signal_handle(te, s, handler); + + g_assert_log(0 == thread_element_lock_count(te), + "%s(): handler %s() for signal #%d left %zu lock%s in %s%s%s", + G_STRFUNC, stacktrace_function_name(handler), s, + thread_element_lock_count(te), + plural(thread_element_lock_count(te)), + thread_element_name(te), + thread_get_element() == te ? "" : " -- BUG: running in %s", + thread_get_element() == te ? "" : thread_name()); + + handled = TRUE; + } + + if (thread_sig_present(te)) + goto recheck; /* More signals have arrived */ + + /* FALL THROUGH */ + +done: + te->sig_handling = FALSE; + return handled; +} + +/** + * Check for pending signals and process them if any are present. + * + * @param te the current thread element + * + * @return TRUE if we processed any signals. + */ +static inline bool +thread_signal_check(struct thread_element *te) +{ + bool processed = FALSE; + + if (thread_sig_pending(te)) { + THREAD_STATS_INCX(sig_handled_while_check); + processed = thread_sig_handle(te); + } + +#ifdef MINGW32 + /* + * On Windows, due to an unavoidable race condition in + * mingw_sig_trampoline(), we need to check for pending "OS" + * signals, i.e. those sent by thread_os_kill(). + */ + + processed |= mingw_signal_check(te->stid); +#endif /* MINGW32*/ + + return processed; +} + +/** + * Check whether the current thread is within a signal handler. + * + * @return the signal handler nesting level, 0 meaning the current thread is + * not currently processing a signal. + */ +int +thread_sighandler_level(void) +{ + struct thread_element *te = thread_get_element(); + + return te->in_signal_handler; +} + +/** + * Get the signal generation number for the current thread. + * + * Each time a thread processes signals, this count is incremented and it + * can be checked by routines wishing to monitor whether a signal occurred + * to interrupt processing. + * + * Of course, this number can wrap-up, but one only wants to see if the + * number changed, and it is highly unlikely that it will wrap-up between + * two consecutive checks in a routine. + * + * @return the thread signal generation number. + */ +unsigned +thread_sig_generation(void) +{ + struct thread_element *te = thread_get_element(); + + return te->sig_generation; +} + +/** + * Check whether current thread, whose thread element is known, has been + * cancelled. + * + * This routine does not return if the thread is cancelable and has a pending + * cancel recorded. + * + * @note + * This routine is (obviously!) a cancellation point. + */ +static inline void +thread_cancel_test_element(struct thread_element *te) +{ + /* + * To cancel the thread, it must be cancelable, in a state where cancelling + * is enabled, be cancelled (i.e. having received a cancel request), not + * already exiting and not holding any registered lock. + * + * This last property is interesting because it creates an implicit cancel + * protection within critical sections, avoiding the need to change the + * cancel state and writing complex cleanup routines when dealing with + * critical sections that contain cancellation points. + */ + + if ( + te->cancelable && + THREAD_CANCEL_ENABLE == te->cancl && + 0 == thread_element_lock_count(te) && + te->cancelled && !te->exit_started + ) + thread_exit(THREAD_CANCELLED); +} + +/** + * Check whether thread is suspended and can be suspended right now, or + * whether there are pending signals to deliver. + * + * @param te the computed thread element for the current thread + * @param sigs whether to check for signals + * + * @return TRUE if we suspended or handled signals. + */ +static inline bool +thread_check_suspended_element(struct thread_element *te, bool sigs) +{ + bool delayed = FALSE; + + if G_UNLIKELY(NULL == te) + return FALSE; + + /* + * Suspension is critical, especially in crash mode, so check this first. + * + * We normally only suspend threads that do not hold any locks, but we + * iimediately suspend a thread marked as such in crash mode, since then + * locks become pass-through and we want to freeze execution as soon as + * possible. + */ + + if G_UNLIKELY(te->suspend != 0) { + size_t cnt = thread_element_lock_count(te); + + if (0 == cnt) + delayed |= thread_suspend_self(te); + else if (thread_in_crash_mode()) { + s_rawwarn("suspending %s which holds %zu lock%s", + thread_element_name_raw(te), cnt, plural(cnt)); + + delayed |= thread_suspend_loop(te); /* Unconditional */ + } + } + + if (sigs) + delayed |= thread_signal_check(te); + + return delayed; +} + +/** + * Check whether thread is suspended and can be suspended right now, or + * whether there are pending signals to deliver. + * + * @return TRUE if we suspended or handled signals. + */ +bool +thread_check_suspended(void) +{ + struct thread_element *te; + + te = thread_find(&te); + + if G_UNLIKELY(NULL == te) + return FALSE; + + return thread_check_suspended_element(te, TRUE); +} + +/** + * Report stack overflow for thread identified by its thread element. + * + * If there is a TSIG_OVFLOW signal handler registered, invoke it before + * exiting from the thread. + * + * Otherwise, this is an application crash. + */ +static void +thread_stack_overflow(struct thread_element *te) +{ + tsighandler_t handler; + + /* + * Suspend yourself if this happens during a crash and the thread is + * flagged for suspension. + */ + + (void) thread_check_suspended_element(te, FALSE); + + /* + * If there is a signal handler installed for TSIG_OVFLOW, run it and + * then exit when the handler returns. If there is none (or if the + * signal is ignored or defaulted), then the whole application will crash + * because there is no way to recover from that overflow. + * --RAM, 2015-02-13 + */ + + handler = te->sighTSIG_OVFLOW - 1; + + if (TSIG_IGN != handler && TSIG_DFL != handler) { + /* + * Signal is delivered synchronously to the thread, but we need + * to protect against another instance of the signal being generated. + */ + + thread_signal_handle(te, TSIG_OVFLOW, handler); + thread_exit(THREAD_OVERFLOW); + /* NOTREACHED */ + } + + s_rawwarn("no TSIG_OVFLOW handler installed for %s, crashing...", + thread_element_name(te)); + + crash_abort(); +} + +/** + * Safety precaution to check that we are not exhausting our stack space. + */ +void +thread_stack_check(void) +{ + struct thread_element *te = thread_get_element(); + +#ifdef MINGW32 + /* + * This is only necessary on Windows because the pthread layer is not + * able to correctly create the stack and we lack support for a signal + * stack to be able to properly catch stack overflows. + */ + + thread_element_stack_check(te); +#endif /* MINGW32 */ + + /* + * Since we have the thread element, this is a cheap test. + */ + + thread_check_suspended_element(te, TRUE); +} + +/** + * Disable all locks: they will be granted immediately, preventing + * further deadlocks at the cost of a possible crash. + * + * However, this allows us to maybe collect information that we + * couldn't otherwise get at, so it's worth the risk. + * + * @param silent whether to silently move to crash mode for spinlocks + */ +void G_COLD +thread_lock_disable(bool silent) +{ + if (0 == atomic_int_inc(&thread_locks_disabled)) { + if (silent) + spinlock_exit_mode(); /* Silent crash mode for spinlocks */ + else + spinlock_crash_mode(); /* Can now grab any spinlock or mutex */ + mutex_crash_mode(); /* Allow release of all mutexes */ + rwlock_crash_mode(); + } +} + +/** + * Suspend other threads (advisory, not kernel-enforced). + * + * This is voluntary suspension, which will only occur when threads actively + * check for supension by calling thread_check_suspended() or when they + * attempt to acquire their first registered lock or release their last one. + * + * It is possible to call this routine multiple times, provided each call is + * matched with a corresponding thread_unsuspend_others(). + * + * Optionally the routine can wait for other threads to be no longer holding + * any locks before returning. + * + * @param lockwait if set, wait until all other threads released their locks + * + * @return the amount of threads suspended. + */ +size_t +thread_suspend_others(bool lockwait) +{ + static bool suspendingTHREAD_MAX; + struct thread_element *te; + size_t i, n = 0; + unsigned busy = 0; + + /* + * Must use thread_find() and not thread_get_element() to avoid taking + * any internal locks which could be already held from earlier (deadlock + * assurred) or by other threads (dealock threat if we end up needing + * these locks). + */ + + te = thread_find(&te); /* Ourselves */ + if (NULL == te) { + (void) thread_current(); /* Register ourselves then */ + te = thread_find(&te); + } + + g_assert_log(te != NULL, "%s() called from unknown thread", G_STRFUNC); + g_assert_log(THREAD_ELEMENT_MAGIC == te->magic, + "%s() called with corrupted thread element", G_STRFUNC); + + /* + * This global counter is used to automatically suspend any new thread + * that would be created after this call. + */ + + atomic_uint_inc(&thread_suspend_depth); + + /* + * Avoid recursion from the same thread, which means something is going + * wrong during the suspension. + */ + + if G_UNLIKELY(suspendingte->stid) { + s_rawwarn("%s(): recursive call detected from thread #%u", + G_STRFUNC, te->stid); + + /* + * Minimal suspension, to guarantee proper semantics from the caller. + * We most likely hold the mutex, unless there was a problem grabbing + * that mutex, at which point correctness no longer matters. + */ + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *xte = threadsi; + + if G_UNLIKELY(xte == te) + continue; + + if G_UNLIKELY(NULL == xte) { + s_rawwarn("%s(): NULL thread element #%zu", G_STRFUNC, i); + continue; + } + + if G_UNLIKELY(THREAD_ELEMENT_MAGIC != xte->magic) { + s_rawwarn("%s(): corrupted thread element #%zu", G_STRFUNC, i); + continue; + } + + /* Note: done without a lock on "xte" using an atomic operation */ + atomic_int_inc(&xte->suspend); + n++; + } + + return n; + } + + /* + * Set the recursion flag before taking the mutex, just in case there is + * a problem with getting the mutex which would trigger recursion here. + */ + + suspendingte->stid = TRUE; + + mutex_lock(&thread_suspend_mtx); + + /* + * If we were concurrently asked to suspend ourselves, get on with it! + */ + + if G_UNLIKELY(te->suspend != 0) { + s_rawwarn("%s(): concurrently suspended!", G_STRFUNC); + mutex_unlock(&thread_suspend_mtx); + thread_suspend_loop(te); + goto done; + } + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *xte = threadsi; + + if G_UNLIKELY(xte == te) + continue; + + if G_UNLIKELY(NULL == xte) { + s_rawwarn("%s(): NULL thread element #%zu", G_STRFUNC, i); + continue; + } + + if G_UNLIKELY(THREAD_ELEMENT_MAGIC != xte->magic) { + s_rawwarn("%s(): corrupted thread element #%zu", G_STRFUNC, i); + continue; + } + + atomic_int_inc(&xte->suspend); + + if (lockwait) { + THREAD_LOCK(xte); + if (0 != thread_element_lock_count(xte)) + busy++; + THREAD_UNLOCK(xte); + } + + n++; + } + + /* + * Make sure that we remain the sole thread running. + */ + + THREAD_LOCK(te); + te->suspend = 0; + THREAD_UNLOCK(te); + mutex_unlock(&thread_suspend_mtx); + + /* + * Now wait for other threads to be suspended, if we identified busy + * threads (the ones holding locks). Threads not holding anything will + * be suspended as soon as they successfully acquire their first lock. + * + * If the calling thread is holding any lock at this point, this creates + * a potential deadlocking condition, should any of the busy threads + * need to acquire an additional lock that we're holding. Loudly warn + * about this situation. + */ + + if (lockwait && busy != 0) { + size_t cnt = thread_element_lock_count(te); + if (0 != cnt) { + s_carp("%s() waiting on %u busy thread%s whilst holding %zu lock%s", + G_STRFUNC, busy, plural(busy), cnt, plural(cnt)); + thread_lock_dump(te); + } + thread_wait_others(te); + } + + /* FALL THROUGH */ + +done: + suspendingte->stid = FALSE; + + return n; +} + +/** + * Un-suspend all threads. + * + * This should only be called by a thread after it used thread_suspend_others() + * to resume concurrent execution. + * + * @attention + * If thread_suspend_others() was called multiple times, then this routine + * must be called an identical amount of times before other threads can resume + * their execution. This means each call to the former must be paired with + * a call to the latter, usually surrounding a critical section that should be + * executed by one single thread at a time. + * + * @return the amount of threads unsuspended. + */ +size_t +thread_unsuspend_others(void) +{ + bool locked; + size_t i, n = 0; + struct thread_element *te; + + atomic_uint_dec(&thread_suspend_depth); + + te = thread_find(&te); /* Ourselves */ + if (NULL == te) + return 0; + + locked = mutex_trylock(&thread_suspend_mtx); + + g_soft_assert(locked); /* All other threads should be sleeping */ + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *xte = threadsi; + + THREAD_LOCK(xte); + if G_LIKELY(xte->suspend != 0) { + atomic_int_dec(&xte->suspend); + n++; + } + THREAD_UNLOCK(xte); + } + + if (locked) + mutex_unlock(&thread_suspend_mtx); + + return n; +} + +/** + * Wrapping of thread diversions when a reply is expected. + * + * This is given as an argument to thread_divert_rpc(), which will wrap-up + * the diversion callback, store the reply and signal that the RPC is complete. + */ +struct thread_divert_rpc { + struct thread_divert_cb *div; /**< Original diversion parameters */ + void *reply; /**< Reply from diversion callback */ + int done; /**< Set to 1 when RPC is done */ +}; + +/** + * Wrapper for diversion RPCs. + */ +static void * +thread_divert_rpc(void *arg) +{ + struct thread_divert_rpc *rpcinfo = arg; + struct thread_divert_cb *d = rpcinfo->div; + + rpcinfo->reply = (*d->divert)(d->arg); + atomic_int_inc(&rpcinfo->done); + + return NULL; /* Don't care about returned value, caller ignores it */ +} + +/** + * Process a diversion request, then suspend again. + * + * @param te the suspended thread that is being diverted + */ +static void +thread_divert_run(struct thread_element *te) +{ + struct thread_divert_cb *d; + + THREAD_LOCK(te); + d = te->div; + te->div = NULL; + THREAD_UNLOCK(te); + + /* + * Protect against race conditions whereby caller would remove the + * divesion between the time we decided to run it and the time we + * get here. + */ + + if (NULL == d) + return; + + (void) (d->divert)(d->arg); + + THREAD_LOCK(te); + te->suspend += d->suspend; /* Resuspend thread */ + THREAD_UNLOCK(te); + + /* Upon return, thread will be suspended again */ +} + +/** + * Install a diversion into a suspended thread. + * + * This is intended to be used during crashes when all the other threads are + * suspended and the only thread in control can use diversions to perform + * limited queries on the suspended threads, to gather information. + * + * Once the thread is unsuspended, it will execute the diversion and then + * go back to the suspended state. + * + * From the purpose of the calling thread, this acts as a low-level RPC call, + * which however is only possible when the target is already suspended. The + * calling thread is blocked for the duration of the call if a reply is + * expected. If no reply is expected, the calling thread suspends itself + * after diverting the other thread. + * + * @param id the targeted thread ID + * @param cb the diversion callback to install + * @param arg the argument to pass + * @param reply where reply will be stored (NULL if no reply is expected) + * + * @return 0 if the diversion was successful, an error code otherwise which + * can be: + * + * EBUSY if the thread is running and not suspended currently + * ECANCELED if the thread did not execute in the allocated time slot + * EINVAL if the given thread ID is invalid + * ESRCH if the targeted thread does not exist + * EAGAIN if there is already a diversion installed + * EINPROGRESS if execution did not finish in the allocated waiting time. + */ +int +thread_divert(uint id, process_fn_t cb, void *arg, void **reply) +{ + struct thread_element *te; + struct thread_divert_cb d, r, *divert; + struct thread_divert_rpc rpcinfo; + bool sig = FALSE, started; + + if (id >= THREAD_MAX) + return EINVAL; + + te = threadsid; + if (NULL == te || !te->valid) + return ESRCH; + + d.divert = cb; + d.arg = arg; + + /* + * If a reply is expected, we need to wrap the request. + */ + + if (NULL != reply) { + ZERO(&rpcinfo); + rpcinfo.div = &d; + r.divert = thread_divert_rpc; + r.arg = &rpcinfo; + divert = &r; + } else { + divert = &d; + } + + THREAD_LOCK(te); + if (te->div != NULL) { + THREAD_UNLOCK(te); + return EAGAIN; + } + if (!te->suspended && !te->blocked && NULL == te->cond) { + THREAD_UNLOCK(te); + return EBUSY; + } + if (!te->suspended) + sig = TRUE; /* Will send thread a TSIG_DIVERT */ + te->div = divert; + divert->suspend = te->suspend; /* Save old suspension count */ + te->suspend = 0; /* Force unsuspend */ + THREAD_UNLOCK(te); + + /* + * If the targeted thread is blocked, send it the TSIG_DIVERT signal. + */ - ght = thread_get_global_hash(); - pht = hash_table_lookup(ght, &t); + if (sig && -1 == thread_kill(id, TSIG_DIVERT)) + goto timeout; /* Not really, but will do */ /* - * There's no need to lock the hash table as this call can be made only - * once at a time per thread (the hash table is already protected against - * concurrent accesses). + * If no reply is expected, suspend indefintely. */ - if G_UNLIKELY(NULL == pht) { - pht = hash_table_new_real(); - hash_table_insert(ght, WCOPY(&t), pht); + if (NULL == reply) { + te = thread_get_element(); + te->suspend++; + thread_suspend_loop(te); + } else { + size_t i; + + /* We give roughly 2.5 secs to the thread to reply */ + + for (i = 0; i < 500; i++) { + if (0 != atomic_int_get(&rpcinfo.done)) + goto finished; + compat_usleep_nocancel(THREAD_DIVERT_DELAY); + } + + goto timeout; /* Really */ + + finished: + *reply = rpcinfo.reply; } - return pht; + return 0; /* Diversion was successfully completed */ + +timeout: + + THREAD_LOCK(te); + started = NULL == te->div; /* Went into thread_divert_run()? */ + te->div = NULL; /* Prevent execution start anyway */ + te->suspend += divert->suspend; /* Resuspend thread */ + THREAD_UNLOCK(te); + + return started ? EINPROGRESS : ECANCELED; +} + +/** + * Record the small thread ID of the main thread. + * + * This routine must only be called by the main thread of course, which is + * the thread that handles the callout queue, the I/O dispatching, etc... + * + * It needs to be called after all the early initializations were done, and + * is the signal for walloc() to start using thread magazines. + * + * @param can_block TRUE if the main thread can block without concern + */ +void +thread_set_main(bool can_block) +{ + struct thread_element *te; + + thread_set_main_called = TRUE; + + /* + * Must set the blocking status of the main thread immediately because + * this will determine where the calling queue gets created: as an I/O + * timeout callback from the main event loop or as a dedicated thread. + */ + + thread_main_can_block = can_block; + te = thread_get_element(); + thread_main_stid = te->stid; +} + +/** + * Get the small thread ID of the main thread. + * + * If thread_set_main() has not been called yet, returns -1 which is an + * invalid thread ID. + * + * @return the thread small ID of the main thread, -1 if unknown. + */ +unsigned +thread_get_main(void) +{ + return thread_main_stid; +} + +/** + * Check whether main thread can block. + */ +bool +thread_main_is_blockable(void) +{ + return thread_main_can_block; +} + +/** + * Check whether thread_set_main() was called. + * + * This indicates whether the main thread has finished its initializations + * and is good to go. + */ +bool +thread_set_main_was_called(void) +{ + return thread_set_main_called; +} + +/** + * Get current thread. + * + * This allows us to count the running threads as long as each thread uses + * mutexes at some point or calls thread_current(). + * + * @return the current thread + */ +thread_t +thread_current(void) +{ + return thread_current_element(NULL); +} + +static inline thread_t +thread_element_set(struct thread_element *te, const void **element) +{ + if (element != NULL) + *element = te; + + return te->tid; +} + +/** + * Get current thread plus a pointer to the thread element (opaque). + * + * This allows us to count the running threads as long as each thread uses + * mutexes at some point or calls thread_current(). + * + * The opaque thread element pointer can then speed-up the recording of + * mutexes in the thread since we won't have to lookup the thread element + * again. + * + * @param element if not-NULL, gets back a pointer to the thread element + * + * @return the current thread + */ +thread_t +thread_current_element(const void **element) +{ + struct thread_element *te; + thread_qid_t qid; + unsigned idx; + + if G_UNLIKELY(!thread_inited) + thread_init(); + + /* + * Since we have a stack pointer belonging to the thread we're looking, + * check whether we have it cached by its QID. + */ + + qid = thread_quasi_id_fast(&te); + idx = thread_qid_hash(qid); + + te = thread_qid_cache_get(idx); + if G_LIKELY(thread_element_matches(te, qid)) + return thread_element_set(te, element); + + /* + * We must be careful because thread_current() is what is used by mutexes + * to record the current thread: we can't rely on thread_get_element(), + * especially when the VMM layer is not up yet. + */ + + te = thread_find_via_qid(qid); + + if G_LIKELY(te != NULL) + return thread_element_set(te, element); + + /* + * There is no current thread record. + * + * Special care must be taken when the VMM layer is not fully inited yet + * since it uses mutexes and therefore will call thread_current() as well. + */ + + if G_UNLIKELY(!vmm_is_inited()) { + if (element != NULL) + *element = NULL; + + return thread_self(); + } + + /* + * Calling thread_get_element() will redo part of the work we've been + * doing but will also allocate and insert in the cache a new thread + * element for the current thread, if needed. + */ + + te = thread_get_element(); + + g_assert(!thread_eq(THREAD_INVALID, te->tid)); + + return thread_element_set(te, element); +} + +/** + * Total amount of running threads (including discovered ones). + */ +unsigned +thread_count(void) +{ + unsigned count; + + /* + * Our ability to discover threads relies on the fact that all running + * threads will, at some point, use malloc() or another call requiring + * a spinlock, hence calling this layer. + * + * We have no way to know whether a discovered thread is still running + * though, so the count is only approximate. + */ + + atomic_mb(); /* Since thread_running is atomically updated */ + count = thread_running + thread_discovered; + + return MAX(count, 1); /* At least one thread */ +} + +/** + * Amount of known discovered threads. + */ +unsigned +thread_discovered_count(void) +{ + atomic_mb(); /* Since thread_discovered is atomically updated */ + return thread_discovered; +} + +/** + * Determine whether we're a mono-threaded application. + */ +bool +thread_is_single(void) +{ + if G_UNLIKELY(thread_eq(THREAD_NONE, tstid0)) { + return TRUE; /* First thread not created yet */ + } else { + unsigned count = thread_count(); + if (count > 1) { + return FALSE; + } else { + struct thread_element *te = thread_find(&te); + + if (NULL == te || te->stid != 0) + return FALSE; + + return 0 == thread_pending_reuse; + } + } +} + +/** + * Is pointer a valid stack pointer? + * + * When top is NULL, we must be querying for the current thread or the routine + * will likely return FALSE unless the pointer is in the same page as the + * stack bottom. + * + * @param p pointer to check + * @param top pointer to stack's top + * @param stid if non-NULL, filled with the small ID of the thread + * + * @return whether the pointer is within the bottom and the top of the stack. + */ +bool +thread_is_stack_pointer(const void *p, const void *top, unsigned *stid) +{ + struct thread_element *te; + thread_qid_t qid, pqid; + unsigned idx; + + if G_UNLIKELY(NULL == p) + return FALSE; + + qid = thread_quasi_id_fast(p); + idx = thread_qid_hash(qid); + + te = thread_qid_cache_get(idx); + if G_UNLIKELY(!thread_element_matches(te, qid)) { + te = thread_find_qid(qid); + if G_UNLIKELY(NULL == te) + return FALSE; + } + + if (NULL == top) { + if (!thread_eq(te->tid, thread_self())) + return FALSE; /* Not in the current thread */ + top = &te; + } + + if (stid != NULL) + *stid = te->stid; + + qid = thread_quasi_id_fast(top); + pqid = thread_quasi_id_fast(p); + + if (thread_sp_direction < 0) { + /* Stack growing down, base is high_qid */ + if (te->high_qid < qid) + return FALSE; /* top is invalid for this thread */ + return pqid >= qid && pqid <= te->high_qid; + } else { + /* Stack growing up, base is low_qid */ + if (te->low_qid > qid) + return FALSE; /* top is invalid for this thread */ + return pqid <= qid && pqid >= te->low_qid; + } } /** @@ -123,41 +5629,46 @@ void * thread_private_get(const void *key) { + struct thread_element *te = thread_get_element(); hash_table_t *pht; struct thread_pvalue *pv; - pht = thread_get_private_hash(); + pht = thread_get_private_hash(te); pv = hash_table_lookup(pht, key); return NULL == pv ? NULL : pv->value; } /** + * Remove thread-private data from supplied hash table, invoking its free + * routine if any present. + */ +static void +thread_private_remove_value(hash_table_t *pht, + const void *key, struct thread_pvalue *pv) +{ + hash_table_remove(pht, key); + thread_pvalue_free(pv); +} + +/** * Remove thread-private data indexed by key. * * If any free-routine was registered for the value, it is invoked before * returning. * - * @return TRUE if key existed already. + * @return TRUE if key existed. */ -gboolean +bool thread_private_remove(const void *key) { + struct thread_element *te = thread_get_element(); hash_table_t *pht; - const void *k; void *v; - pht = thread_get_private_hash(); - if (hash_table_lookup_extended(pht, key, &k, &v)) { - thread_t *tk = deconstify_gpointer(k); - struct thread_pvalue *pv = v; - - hash_table_remove(pht, key); - WFREE(tk); - if (pv->p_free != NULL) - (*pv->p_free)(pv->value, pv->p_arg); - WFREE0(pv); - + pht = thread_get_private_hash(te); + if (hash_table_lookup_extended(pht, key, NULL, &v)) { + thread_private_remove_value(pht, key, v); return TRUE; } else { return FALSE; @@ -165,39 +5676,6390 @@ } /** - * Add thread-private data with a free routine. + * Update possibly existing thread-private data. + * + * If "existing" is TRUE, then any existing key has its value updated. + * Moreover, if "p_free" is not NULL, it is used along with "p_arg" to + * update the value's free routine (if the value remains otherwise unchanged). + * + * When replacing an existing key and the value is changed, the old value + * is removed first, possibly invoking its free routine if defined. * * @param key the key for the private data * @param value private value to store * @param p_free free-routine to invoke when key is removed * @param p_arg additional opaque argument for the freeing callback + * @param existing whether key can be already existing */ void -thread_private_add_extended(const void *key, const void *value, - thread_pvalue_free_t p_free, void *p_arg) +thread_private_update_extended(const void *key, const void *value, + free_data_fn_t p_free, void *p_arg, bool existing) { + struct thread_element *te = thread_get_element(); hash_table_t *pht; struct thread_pvalue *pv; - gboolean ok; + free_data_fn_t data_free = p_free; + void *v; + bool ok; + + thread_pvzone_init(); + + /* + * The THREAD_PRIVATE_NOFREE special value means we need to set a NULL + * free routine -- the object does not need to be collected specially + * and removing it from the hash is sufficient to make it go. + * + * This special argument value is required because a NULL p_free argument + * means "no change" to the existing free routine when the value exists + * already for that key and matches the argument given. + */ - WALLOC0(pv); - pv->value = deconstify_gpointer(value); - pv->p_free = p_free; + if G_UNLIKELY(THREAD_PRIVATE_NOFREE == p_free) + data_free = NULL; + + pht = thread_get_private_hash(te); + if (hash_table_lookup_extended(pht, key, NULL, &v)) { + struct thread_pvalue *opv = v; + + if (!existing) + s_error("attempt to add already existing thread-private key"); + + if (opv->value != value) { + thread_private_remove_value(pht, key, opv); + } else { + /* Free routine and argument could have changed, if non-NULL */ + if (p_free != NULL) { + opv->p_free = data_free; + opv->p_arg = p_arg; + } + return; /* Key was already present with same value */ + } + } + + /* + * When setting the private value to NULL, simply delete the entry. + * + * If any (necessarily non-NULL) value was present, it was already removed + * above since opv->value cannot be NULL. + */ + + if G_UNLIKELY(NULL == value) + return; + + /* + * Loudly warn when attempting to add a private value for an exiting + * thread, and it is not of the THREAD_PRIVATE_KEEP kind: the memory + * associated with that value will not be cleared until the thread + * element is reused, which may never happen. + * --RAM, 2013-11-15 + * + * Actually, since the thread is exiting, it's best to not even add the + * value to the hash table: we could be in thread_private_clear() and + * modifying a table on which one iterates is a no-no. Better let the + * value leak. + * --RAM, 2014-02-25 + */ + + if G_UNLIKELY( + te->exit_started && + data_free != NULL && + data_free != THREAD_PRIVATE_KEEP + ) { + s_carp("%s(): not adding value freed by %s() in %s -- %p will leak", + G_STRFUNC, + stacktrace_function_name(data_free), thread_name(), value); + return; + } + + pv = zalloc(pvzone); + ZERO(pv); + pv->value = deconstify_pointer(value); + pv->p_free = data_free; pv->p_arg = p_arg; - pht = thread_get_private_hash(); ok = hash_table_insert(pht, key, pv); g_assert(ok); /* No duplicate insertions */ } /** + * Add thread-private data with a free routine. + * + * The key must not already exist in the thread-private area. + * + * @param key the key for the private data + * @param value private value to store + * @param p_free free-routine to invoke when key is removed + * @param p_arg additional opaque argument for the freeing callback + */ +void +thread_private_add_extended(const void *key, const void *value, + free_data_fn_t p_free, void *p_arg) +{ + thread_private_update_extended(key, value, p_free, p_arg, FALSE); +} + +/** + * Add permanent thread-private data. + * + * The key must not already exist in the thread-private area. + * + * This data will be kept when the thread exits and will be reused when + * another thread reuses the same thread small ID. This is meant for + * global thread-agnostic objects, such as a per-thread logging object, + * which can be reused freely and need only be created once per thread. + * + * @param key the key for the private data + * @param value private value to store + */ +void +thread_private_add_permanent(const void *key, const void *value) +{ + thread_private_update_extended(key, value, + THREAD_PRIVATE_KEEP, NULL, FALSE); +} + +/** + * Set thread-private data with a free routine. + * + * Any previously existing data for this key is replaced provided the value + * is different. Otherwise, the free routine and its argument are updated. + * A NULL free routine simply cancels any other free routine that was installed. + * + * @param key the key for the private data + * @param value private value to store + * @param p_free free-routine to invoke when key is removed + * @param p_arg additional opaque argument for the freeing callback + */ +void +thread_private_set_extended(const void *key, const void *value, + free_data_fn_t p_free, void *p_arg) +{ + free_data_fn_t p_freev = p_free; + + /* + * A NULL free routine argument means "no change", so we need to transform + * it into THREAD_PRIVATE_NOFREE to ask for a removal of the free routine. + */ + + if (NULL == p_free) + p_freev = THREAD_PRIVATE_NOFREE; + + thread_private_update_extended(key, value, p_freev, p_arg, TRUE); +} + +/** * Add thread-private data indexed by key. + * + * The key must not already exist in the thread-private area. */ void thread_private_add(const void *key, const void *value) { - thread_private_add_extended(key, value, NULL, NULL); + thread_private_update_extended(key, value, NULL, NULL, FALSE); +} + +/** + * Set thread-private data indexed by key. + * + * The key is created if it did not already exist. + */ +void +thread_private_set(const void *key, const void *value) +{ + thread_private_update_extended(key, value, NULL, NULL, TRUE); +} + +/** + * Create a new key for thread-local storage. + * + * If the free-routine is THREAD_LOCAL_KEEP, then the value will not be + * reclaimed when the thread exits and the value not reset to NULL, until + * the key is destroyed (at which time the value will leak since it does not + * have a valid free-routine).. + * + * @param key the key to initialize + * @param freecb the free-routine to invoke for values stored under key + * + * @return 0 if OK, -1 on error with errno set. + */ +int +thread_local_key_create(thread_key_t *key, free_fn_t freecb) +{ + unsigned i; + + STATIC_ASSERT(THREAD_LOCAL_KEEP != NULL); + STATIC_ASSERT(THREAD_LOCAL_KEEP != THREAD_LOCAL_INVALID); + + spinlock(&thread_local_slk); + + for (i = 0; i < THREAD_LOCAL_MAX; i++) { + if (THREAD_LKEY_UNUSED == thread_lkeysi.used) { + thread_lkeysi.used = THREAD_LKEY_USED; + thread_lkeysi.freecb = freecb; + thread_lkeys_used++; + spinunlock(&thread_local_slk); + *key = i; + return 0; + } + } + + spinunlock(&thread_local_slk); + errno = EAGAIN; + return -1; +} + +/** + * Delete a key used for thread-local storage. + * + * @param key the key to delete + */ +void +thread_local_key_delete(thread_key_t key) +{ + int l1, l2; + unsigned i; + free_fn_t freecb; + + g_assert(key < THREAD_LOCAL_MAX); + + spinlock_hidden(&thread_local_slk); + + if G_UNLIKELY(THREAD_LKEY_USED != thread_lkeyskey.used) { + spinunlock_hidden(&thread_local_slk); + return; + } + + freecb = thread_lkeyskey.freecb; + + /* + * Mark the key as being in the process of being deleted, then release + * the thread_local_slk lock: no other thread will be able to request + * deletion of that key and the key usage flag not being THREAD_LKEY_UNUSED + * yet, that slot will not be usable until the variables have been fully + * cleared in all the threads using the local key. + */ + + thread_lkeyskey.used = THREAD_LKEY_DESTROYING; + spinunlock_hidden(&thread_local_slk); + + /* + * Compute the index of the key on the L1 and L2 pages. + */ + + l1 = key / THREAD_LOCAL_L2_SIZE; + l2 = key % THREAD_LOCAL_L2_SIZE; + + /* + * Go through all the known running threads and delete the key in the + * thread if present, then reset the slot to NULL. + * + * This procedure is necessary because should the key be reassigned, all + * the running threads will now have a default NULL value. + */ + + mutex_lock(&thread_insert_mtx); + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *te = threadsi; + void **l2page; + + THREAD_LOCK(te); + + if G_UNLIKELY(!te->valid || te->reusable) { + THREAD_UNLOCK(te); + continue; + } + + l2page = te->localsl1; + THREAD_UNLOCK(te); + + if G_LIKELY(l2page != NULL) { + void *val; + + val = l2pagel2; + + /* + * Because we set the key to THREAD_LKEY_DESTROYING, it is not + * possible to have threads use thread_local_set() for that key, + * hence there is no need to lock anything. + */ + + if G_LIKELY(val != NULL) { + l2pagel2 = NULL; + if (freecb != NULL && freecb != THREAD_LOCAL_KEEP) + (*freecb)(val); + } + } + } + + mutex_unlock(&thread_insert_mtx); + + /* + * Reset the key. + */ + + spinlock_hidden(&thread_local_slk); + + thread_lkeyskey.used = THREAD_LKEY_UNUSED; + thread_lkeyskey.freecb = NULL; + thread_lkeys_used--; + + spinunlock_hidden(&thread_local_slk); +} + +/** + * Set the value for a key. + * + * If the new value is different than the old and there is a free routine + * registered for the key, it is invoked on the old value before setting + * the new value. + */ +void +thread_local_set(thread_key_t key, const void *value) +{ + struct thread_element *te = thread_get_element(); + int l1, l2; + void **l2page; + void *val; + free_fn_t freecb; + + g_assert(key < THREAD_LOCAL_MAX); + g_assert_log(thread_lkeyskey.used != THREAD_LKEY_UNUSED, + "%s() called with unused key %u", G_STRFUNC, key); + + /* + * Compute the index of the key on the L1 and L2 pages. + */ + + l1 = key / THREAD_LOCAL_L2_SIZE; + l2 = key % THREAD_LOCAL_L2_SIZE; + + /* + * Allocate the L2 page if needed (never freed). + */ + + l2page = te->localsl1; + + if G_UNLIKELY(NULL == l2page) { + OMALLOC0_ARRAY(l2page, THREAD_LOCAL_L2_SIZE); + te->localsl1 = l2page; + } + + /* + * Make sure nobody is concurrently deleting the key, now that we checked + * it existed when we entered. + * + * There is no need to protect the access to the L2 pages because these + * are allocated once per thread element and never freed. Only the current + * thread can access these pages, unless the key is deleted, but we hold + * the thread_local_slk lock when we do the access and therefore no + * concurrent access is possible. + */ + + spinlock_hidden(&thread_local_slk); + + if G_LIKELY(THREAD_LKEY_USED == thread_lkeyskey.used) { + val = l2pagel2; + l2pagel2 = deconstify_pointer(value); + freecb = thread_lkeyskey.freecb; + } else { + freecb = THREAD_LOCAL_INVALID; + } + + spinunlock_hidden(&thread_local_slk); + + if G_UNLIKELY(THREAD_LOCAL_INVALID == freecb) + s_error("%s(): key %u was concurrently deleted", G_STRFUNC, key); + + if G_UNLIKELY( + val != NULL && val != value && + freecb != NULL && freecb != THREAD_LOCAL_KEEP + ) + (*freecb)(val); + + /* + * Loudly warn when attempting to add a local value for an exiting + * thread, and it is not of the THREAD_LOCAL_KEEP kind: the memory + * associated with that value will not be cleared until the thread + * element is reused, which may never happen. + * --RAM, 2013-11-15 + */ + + if G_UNLIKELY( + te->exit_started && + value != NULL && + freecb != NULL && + freecb != THREAD_LOCAL_KEEP + ) { + s_carp("%s(): adding value freed by %s() in %s", + G_STRFUNC, stacktrace_function_name(freecb), thread_name()); + } +} + +/** + * @return amount of thread-local keys used. + */ +size_t +thread_local_key_count(void) +{ + size_t n; + + spinlock(&thread_local_slk); + n = thread_lkeys_used; + spinunlock(&thread_local_slk); + + return n; +} + +/** + * Get thread-local value for key. + * + * @return the key value or NULL if the key does not exist. + */ +static inline void * ALWAYS_INLINE +thread_element_local_get(struct thread_element *te, thread_key_t key) +{ + int l1, l2; + void **l2page; + + g_assert(key < THREAD_LOCAL_MAX); + + /* + * Fetch the L2 page in the sparse array. + */ + + l1 = key / THREAD_LOCAL_L2_SIZE; + l2 = key % THREAD_LOCAL_L2_SIZE; + l2page = te->localsl1; + + if G_UNLIKELY( + NULL == l2page || THREAD_LKEY_USED != thread_lkeyskey.used + ) + return NULL; + + return l2pagel2; +} + +/** + * Get thread-local value for key. + * + * @return the key value or NULL if the key does not exist. + */ +void * +thread_local_get(thread_key_t key) +{ + struct thread_element *te = thread_get_element(); + + /* + * To make thread_foreach_local() with THREAD_LOCAL_SUSPENDED + * a little bit safer, we check for thread suspension during each + * local variable access. This is cheap since we already got + * the thread element. + * + * As a bonus, we can also handle pending signals. + */ + + thread_check_suspended_element(te, TRUE); + + return thread_element_local_get(te, key); +} + +/** + * Find out which threads are using a given thread-local variable. + * + * @return a list of thread STID, which must be freed with pslist_free(). + */ +pslist_t * +thread_local_users(thread_key_t key) +{ + uint i; + pslist_t *sl = NULL; + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *te = threadsi; + void *v; + + if (!te->valid) + continue; + + v = thread_element_local_get(te, key); + if (v != NULL) + sl = pslist_prepend(sl, uint_to_pointer(i)); + } + + return sl; +} + +/** + * Iterate over all the threads and invoke the supplied callback on + * each non-NULL instance of the key within the thread. + * + * When the THREAD_LOCAL_SKIP_SELF flag is specified, the iterator does not + * invoke the callback for the local variable held in the current thread. + * + * When the THREAD_LOCAL_SUSPENDED flag is specified, the callback is only + * invoked on local variables if the thread is suspended. This makes the + * call a little bit safer, because we know the thread owning the variable + * will not be changing it at the same time we read it. + * + * @attention + * This is violating thread privacy by exposing to another thread the + * content of a thread-local variable. + * + * @note + * This routine is only supplied to applications to let them do thorough + * memory cleanup during application exit time. It is giving enough rope + * to do bad things, but at least the value is passed "read-only" so any + * change cannot be accidental. + * + * @param key the thread-local variable key + * @param flags operating flags + * @param fn routine to invoked on non-NULL values + * @param data opaque additional argument, passed to callback routine + */ +void +thread_foreach_local(thread_key_t key, uint flags, cdata_fn_t fn, void *data) +{ + uint id = THREAD_MAIN; + uint i; + + if (flags & THREAD_LOCAL_SKIP_SELF) + id = thread_small_id(); + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *te = threadsi; + void *v; + + if (!te->valid) + continue; + + if G_UNLIKELY((flags & THREAD_LOCAL_SKIP_SELF) && i == id) + continue; + + /* + * For suspended threads, te->suspend signals that the thread has + * been told to suspend itself, but it may not be suspended yet. + * However, if it is sleeping or blocked, it will suspend itself + * as soon as the sleep is over or it is unblocked, so we can act as + * if it was suspended for our purpose here. + */ + + if (flags & THREAD_LOCAL_SUSPENDED) { + bool suspended; + + THREAD_LOCK(te); + suspended = te->suspend && + (te->suspended || te->sleeping || te->blocked); + THREAD_UNLOCK(te); + + if (!suspended) + continue; + } + + v = thread_element_local_get(te, key); + if (v != NULL) + (*fn)(v, data); + } +} + +/** + * Stringify the given thread ID. + * + * @return pointer to static string + */ +const char * +thread_to_string(const thread_t t) +{ + buf_t *b = buf_private(G_STRFUNC, ULONG_DEC_BUFLEN); + char *p = buf_data(b); + + ulong_to_string_buf(t, p, buf_size(b)); + return p; +} + +/** + * Account or clear pending message to be emitted by some thread before + * final exit. + */ +void +thread_pending_add(int increment) +{ + struct thread_element *te; + + te = thread_find(&te); + if G_UNLIKELY(NULL == te) + return; + + if (increment > 0) { + te->pending += increment; + } else { + /* We may not always account when thread_find() returns NULL */ + if G_LIKELY(te->pending >= -increment) + te->pending += increment; + else + te->pending = 0; + } +} + +/** + * Report amount of pending messages registered by threads. + * + * This is not taking locks, so it may be slightly off. + * + * @return amount of pending messages. + */ +size_t +thread_pending_count(void) +{ + unsigned i; + size_t count = 0; + + for (i = 0; i < thread_next_stid; i++) { + count += threadsi->pending; + } + + return count; +} + +/** + * @return English description for lock kind. + */ +static const char * +thread_lock_kind_to_string(const enum thread_lock_kind kind) +{ + switch (kind) { + case THREAD_LOCK_ANY: return "lock"; + case THREAD_LOCK_SPINLOCK: return "spinlock"; + case THREAD_LOCK_RLOCK: return "rwlock (R)"; + case THREAD_LOCK_WLOCK: return "rwlock (W)"; + case THREAD_LOCK_MUTEX: return "mutex"; + } + + return "UNKNOWN"; +} + +/* + * Slowly look for the owner of a lock. + * + * @return the thread element if lock is owned by any of the running threads, + * NULL when nobody owns the lock. + */ +static const struct thread_element * +thread_lock_find_owner(const void *lock) +{ + unsigned i; + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *te = threadsi; + struct thread_lock_stack *tls; + unsigned j; + + if G_UNLIKELY(!te->valid || te->reusable) + continue; + + tls = &te->locks; + + if G_LIKELY(0 == tls->count) + continue; + + for (j = 0; j < tls->count; j++) { + const struct thread_lock *l = &tls->arenaj; + + if G_UNLIKELY(l->lock == lock) + return te; + } + } + + return NULL; +} + +/** + * Show the lock that the thread is actively waiting on, if any, by logging + * it to the specified file descriptor. + * + * Nothing is printed if the thread waits for nothing. + * + * This routine is called during critical conditions and therefore it must + * use as little resources as possible and be as safe as possible. + */ +static void +thread_lock_waiting_dump_fd(int fd, const struct thread_element *te) +{ + char bufPOINTER_BUFLEN; + char lbufUINT_DEC_BUFLEN; + DECLARE_STR(14); + const char *type, *lnum; + const struct thread_lock_stack *w = &te->waits; + size_t i; + + if G_UNLIKELY(0 == w->count) + return; + + for (i = 0; i < w->count; i++) { + const struct thread_lock *l = &w->arenai; + const struct thread_element *owner; + + rewind_str(0); + + print_str(thread_element_name_raw(te)); /* 0 */ + print_str(" waiting for "); /* 1 */ + + pointer_to_string_buf(l->lock, buf, sizeof buf); + type = thread_lock_kind_to_string(l->kind); + + print_str(type); /* 2 */ + print_str(" "); /* 3 */ + print_str(buf); /* 4 */ + + lnum = PRINT_NUMBER(lbuf, l->line); + print_str(" at "); /* 5 */ + print_str(l->file); /* 6 */ + print_str(":"); /* 7 */ + print_str(lnum); /* 8 */ + + owner = thread_lock_find_owner(l->lock); + + if (owner != NULL) { + print_str(" (owned by "); /* 9 */ + print_str(thread_element_name2(owner)); /* 10 */ + print_str(")"); /* 11 */ + } + + if (0 == i && thread_backtrace_has(te, THREAD_BT_LOCK)) + print_str(" from:"); /* 12 */ + + print_str("\n"); /* 13 */ + flush_str(fd); + + if (0 == i) + thread_backtrace_dump_type_fd(fd, te, THREAD_BT_ANY); + } +} + +/* + * Slowly check whether a lock is waited for by a thread. + * + * @return TRUE if lock is wanted by any of the running threads. + */ +static bool +thread_lock_waited_for(const void *lock) +{ + unsigned i; + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *te = threadsi; + + if G_UNLIKELY(!te->valid || te->reusable) + continue; + + if G_UNLIKELY(te->waits.count != 0) { + size_t j; + + for (j = 0; j < te->waits.count; j++) { + if G_UNLIKELY(lock == te->waits.arenaj.lock) + return TRUE; + } + } + } + + return FALSE; +} + +/* + * Dump list of locks held by thread to specified file descriptor. + * + * This routine is called during critical conditions and therefore it must + * use as little resources as possible and be as safe as possible. + */ +static void +thread_lock_dump_fd(int fd, const struct thread_element *te) +{ + const struct thread_lock_stack *tls = &te->locks; + unsigned i; + DECLARE_STR(22); + + if G_UNLIKELY(0 == tls->count) { + print_str(thread_element_name_raw(te)); /* 0 */ + print_str(" currently holds no recorded locks.\n"); /* 1 */ + flush_str(fd); + return; + } + + /* + * We display the amount of locks we are going to dump so that we can + * see when the dumping loop aborts before reaching the end. + */ + + { + char cntSIZE_T_DEC_BUFLEN; + const char *lcnt; + + lcnt = PRINT_NUMBER(cnt, tls->count); + + print_str("Dumping the "); /* 0 */ + print_str(lcnt); /* 1 */ + + if (1 == tls->count) + print_str(" lock "); /* 2 */ + else + print_str(" locks "); /* 2 */ + + print_str("owned by "); /* 3 */ + print_str(thread_element_name_raw(te)); /* 4 */ + print_str(", most recent first:\n"); /* 5 */ + flush_str(fd); + } + + for (i = tls->count; i != 0; i--) { + const struct thread_lock *l = &tls->arenai - 1; + const char *type; + char bufPOINTER_BUFLEN; + char lineUINT_DEC_BUFLEN; + char posUINT_DEC_BUFLEN; + const char *lnum, *lpos; + bool waited_for; + + type = thread_lock_kind_to_string(l->kind); + pointer_to_string_buf(l->lock, buf, sizeof buf); + + rewind_str(0); + + print_str("\t"); /* 0 */ + lpos = PRINT_NUMBER(pos, i - 1); + + /* + * Let locks that are waited for by another thread stand out. + * This is an O(n^2) lookup, but we may be crashing due to a deadlock, + * and it is important to let those locks that are the source of + * the deadlock be immediately spotted. + */ + + waited_for = thread_lock_waited_for(l->lock); + + if (i <= 10) + print_str(waited_for ? " >" : " #"); /* 1 */ + else if (i <= 100) + print_str(waited_for ? " >" : " #"); /* 1 */ + else + print_str(waited_for ? ">" : "#"); /* 1 */ + + print_str(lpos); /* 2 */ + print_str(" "); /* 3 */ + print_str(buf); /* 4 */ + print_str(" "); /* 5 */ + print_str(type); /* 6 */ + switch (l->kind) { + case THREAD_LOCK_ANY: + g_assert_not_reached(); + case THREAD_LOCK_SPINLOCK: + { + const spinlock_t *s = l->lock; + if (!mem_is_valid_range(s, sizeof *s)) { + print_str(" FREED"); /* 7 */ + } else if (SPINLOCK_MAGIC != s->magic) { + if (SPINLOCK_DESTROYED == s->magic) + print_str(" DESTROYED"); /* 7 */ + else + print_str(" BAD_MAGIC"); /* 7 */ + } else { + if (0 == s->lock) + print_str(" UNLOCKED"); /* 7 */ + else if (1 != s->lock) + print_str(" BAD_LOCK"); /* 7 */ + } + } + break; + case THREAD_LOCK_RLOCK: + case THREAD_LOCK_WLOCK: + { + const rwlock_t *rw = l->lock; + char rdbufUINT_DEC_BUFLEN; + char wrbufUINT_DEC_BUFLEN; + char qrbufUINT_DEC_BUFLEN; + char qwbufUINT_DEC_BUFLEN; + const char *r, *w, *qr, *qw; + + if (!mem_is_valid_range(rw, sizeof *rw)) { + print_str(" FREED"); /* 7 */ + } else if (RWLOCK_MAGIC != rw->magic) { + if (RWLOCK_DESTROYED == rw->magic) + print_str(" DESTROYED"); /* 7 */ + else + print_str(" BAD_MAGIC"); /* 7 */ + } else { + if (RWLOCK_WFREE == rw->owner) + print_str(" rdonly"); /* 7 */ + else if (te->stid != rw->owner) + print_str(" read"); /* 7 */ + else + print_str(" write"); /* 7 */ + + r = PRINT_NUMBER(rdbuf, rw->readers); + w = PRINT_NUMBER(wrbuf, rw->writers); + qr = PRINT_NUMBER(qrbuf, rw->waiters - rw->write_waiters); + qw = PRINT_NUMBER(qwbuf, rw->write_waiters); + + print_str(" (r:"); /* 8 */ + print_str(r); /* 9 */ + print_str(" w:"); /* 10 */ + print_str(w); /* 11 */ + print_str(" q:"); /* 12 */ + print_str(qr); /* 13 */ + print_str("+"); /* 14 */ + print_str(qw); /* 15 */ + print_str(")"); /* 16 */ + } + } + break; + case THREAD_LOCK_MUTEX: + { + const mutex_t *m = l->lock; + if (!mem_is_valid_range(m, sizeof *m)) { + print_str(" FREED"); /* 7 */ + } else if (MUTEX_MAGIC != m->magic) { + if (MUTEX_DESTROYED == m->magic) + print_str(" DESTROYED"); /* 7 */ + else + print_str(" BAD_MAGIC"); /* 7 */ + } else { + const spinlock_t *s = &m->lock; + + if (SPINLOCK_MAGIC != s->magic) { + print_str(" BAD_SPINLOCK"); /* 7 */ + } else { + if (0 == s->lock) + print_str(" UNLOCKED"); /* 7 */ + else if (s->lock != 1) + print_str(" BAD_LOCK"); /* 7 */ + if (!thread_eq(m->owner, te->tid)) + print_str(" BAD_TID"); /* 8 */ + + if (0 == m->depth) { + print_str(" BAD_DEPTH"); /* 9 */ + } else { + char depthULONG_DEC_BUFLEN; + const char *dnum; + + dnum = PRINT_NUMBER(depth, m->depth); + print_str(" (depth="); /* 10 */ + print_str(dnum); /* 11 */ + print_str(")"); /* 12 */ + } + } + } + } + break; + } + + print_str(" from "); /* 17 */ + lnum = PRINT_NUMBER(line, l->line); + print_str(l->file); /* 18 */ + print_str(":"); /* 19 */ + print_str(lnum); /* 20 */ + + print_str("\n"); /* 21 */ + flush_str(fd); + } +} + +/* + * Dump list of locks waited-for and held by thread to stderr. + */ +static void +thread_lock_dump(const struct thread_element *te) +{ + if (0 != te->waits.count) + thread_lock_waiting_dump_fd(STDERR_FILENO, te); + + thread_lock_dump_fd(STDERR_FILENO, te); +} + +/** + * Dump locks held by all known threads to specified file descriptor. + */ +void +thread_lock_dump_all(int fd) +{ + unsigned i; + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *te = threadsi; + bool locked; + + if (!te->valid) + continue; + + locked = THREAD_TRY_LOCK(te); + if (te->reusable) + goto next; + + if (0 != te->waits.count) + thread_lock_waiting_dump_fd(fd, te); + + if (0 != thread_element_lock_count(te)) + thread_lock_dump_fd(fd, te); + + next: + if (locked) + THREAD_UNLOCK(te); + } +} + +/** + * Dump locks held or waited for by given thread to specified file descriptor. + * + * If the thread holds no locks or is not waiting, nothing is printed. + * + * @param fd file descriptor to which to print + * @param id the thread ID + */ +void +thread_lock_dump_if_any(int fd, uint id) +{ + struct thread_element *te; + + if (id >= THREAD_MAX) + return; + + /* + * We don't call thread_get_element() because this routine can be used on + * the assertion failure path and we must be as robust as possible. + */ + + te = threadsid; + + if (te != NULL && te->valid) { + if (0 != te->waits.count) + thread_lock_waiting_dump_fd(fd, te); + + if (0 != thread_element_lock_count(te)) + thread_lock_dump_fd(fd, te); + } +} + +/** + * Attempt to release a single lock. + * + * Threads which have just grabbed a single lock (either a spinlock or a + * mutex at depth 1) can be immediately suspended before they enter the + * critical section protected by the lock as long as the lock is released + * first and re-grabbed later on when the thread can resume its activities. + * + * @return TRUE if we were able to release the lock. + */ +static bool +thread_lock_release(const void *lock, enum thread_lock_kind kind) +{ + THREAD_STATS_INCX(locks_released); + + switch (kind) { + case THREAD_LOCK_ANY: + g_assert_not_reached(); + case THREAD_LOCK_SPINLOCK: + { + spinlock_t *s = deconstify_pointer(lock); + spinunlock_hidden(s); + } + return TRUE; + case THREAD_LOCK_RLOCK: + { + rwlock_t *r = deconstify_pointer(lock); + rwlock_rungrab(r); + } + return TRUE; + case THREAD_LOCK_WLOCK: + { + rwlock_t *w = deconstify_pointer(lock); + rwlock_wungrab(w); + } + return TRUE; + case THREAD_LOCK_MUTEX: + { + mutex_t *m = deconstify_pointer(lock); + + if (1 != m->depth) + return FALSE; + + mutex_unlock_hidden(m); + } + return TRUE; + } + + g_assert_not_reached(); +} + +/** + * Do we have a problem with thread locks? + */ +static bool +thread_lock_is_problematic(void) +{ + return thread_in_crash_mode() || crash_is_deadlocked(); +} + +/** + * Record a waiting condition on the current thread for the specified lock. + * + * This is used in case of deadlocks to be able to figure out where the + * cycle was and who is the culprit. + * + * @return the thread element as an opaque pointer that can be given back + * to thread_lock_waiting_done() to skip the thread lookup. + */ +const void * +thread_lock_waiting_element(const void *lock, enum thread_lock_kind kind, + const char *file, unsigned line) +{ + struct thread_element *te; + struct thread_lock *l; + + te = thread_find(&te); + + if G_LIKELY(te != NULL) { + bool problematic = thread_lock_is_problematic(); + struct thread_lock_stack *tls = &te->waits; + + /* + * Do not perturb the waiting state we had in the crashing thread, + * in case we are deadlocking. + */ + + if G_UNLIKELY(problematic) { + if (0 != tls->count) { + l = &tls->arenatls->count - 1; + + s_rawcrit("%s(): ignoring new %s %p at %s:%u, " + "still waiting for %s %p at %s:%u", + G_STRFUNC, thread_lock_kind_to_string(kind), + lock, file, line, + thread_lock_kind_to_string(l->kind), + l->lock, l->file, l->line); + } + } else if G_UNLIKELY(0 != tls->count) { + THREAD_STATS_INCX(locks_nested_sleeps); + + if G_UNLIKELY(tls->capacity == tls->count) { + if (!tls->overflow) { + tls->overflow = TRUE; + s_rawwarn("%s overflowing its waiting stack at %s:%u", + thread_element_name_raw(te), file, line); + thread_lock_dump(te); + s_minierror("too many nested lock waiting"); + } + return te; /* Already signaled, we're crashing */ + } + } + + /* + * Detect recursion if we are registered to wait for a lock and + * we come back here stating that we are going to wait for the same + * exact lock! + */ + + if (0 == tls->count) { + thread_backtrace_capture(te, THREAD_BT_LOCK); + } else if (!te->recursive_lockwait) { + size_t i; + + for (i = 0; i < tls->count; i++) { + if (lock == tls->arenai.lock) { + te->recursive_lockwait = TRUE; + s_miniwarn("recursive waiting on %s %p at %s:%u", + thread_lock_kind_to_string(kind), lock, file, line); + thread_lock_waiting_dump_fd(STDERR_FILENO, te); + s_stacktrace(TRUE, 1); + break; + } + } + } + + l = &tls->arenatls->count++; + l->lock = lock; + l->file = file; + l->line = line; + l->kind = kind; + + /* + * Record contention leading to sleeping: if the locking code calls + * us, it means it has been unable to get the lock after a few busy + * loops, so there is real contention that requires sleeping for a + * while. + */ + + switch (kind) { + case THREAD_LOCK_ANY: + g_assert_not_reached(); + case THREAD_LOCK_SPINLOCK: + THREAD_STATS_INCX(locks_spinlock_sleep); + break; + case THREAD_LOCK_MUTEX: + THREAD_STATS_INCX(locks_mutex_sleep); + break; + case THREAD_LOCK_RLOCK: + THREAD_STATS_INCX(locks_rlock_sleep); + break; + case THREAD_LOCK_WLOCK: + THREAD_STATS_INCX(locks_wlock_sleep); + break; + } + } + + return te; +} + +/** + * Record contention on a lock, which happens when we begin the busy loops + * but before we sleep. + */ +void +thread_lock_contention(enum thread_lock_kind kind) +{ + switch (kind) { + case THREAD_LOCK_ANY: + g_assert_not_reached(); + case THREAD_LOCK_SPINLOCK: + THREAD_STATS_INCX(locks_spinlock_contention); + break; + case THREAD_LOCK_MUTEX: + THREAD_STATS_INCX(locks_mutex_contention); + break; + case THREAD_LOCK_RLOCK: + THREAD_STATS_INCX(locks_rlock_contention); + break; + case THREAD_LOCK_WLOCK: + THREAD_STATS_INCX(locks_wlock_contention); + break; + } +} + +/** + * Clear waiting condition on the thread identified by its thread element, + * as returned previously by thread_lock_waiting_element(). + */ +void +thread_lock_waiting_done(const void *element, const void *lock) +{ + struct thread_element *te = deconstify_pointer(element); + struct thread_lock_stack *tls; + + thread_element_check(te); + + if G_UNLIKELY(thread_lock_is_problematic()) + goto done; + + tls = &te->waits; + + /* + * Clear waiting condition only if we were able to record the waited-for + * lock on the waiting stack. + * + * However, do not perturb the waiting state we had in the crashing thread + * if we identified a deadlock condition. + */ + + if G_LIKELY(0 != tls->count) { + const struct thread_lock *l = &tls->arenatls->count - 1; + if G_LIKELY(lock == l->lock) { + tls->count--; + if (0 == tls->count) { + te->recursive_lockwait = FALSE; + thread_backtrace_invalidate(te, THREAD_BT_LOCK); + } + } else { + size_t i; + + s_rawcrit("%s(): was waiting for %s %p at %s:%u but given lock %p", + G_STRFUNC, thread_lock_kind_to_string(l->kind), l->lock, + l->file, l->line, lock); + + /* + * Make sure the lock is not present in the waiting stack, or + * we have a mismatch in the thread_lock_waiting_element() / + * thread_lock_waiting_done() sequence. + */ + + for (i = 0; i < tls->count - 1; i++) { + if G_UNLIKELY(lock == tls->arenai.lock) + s_error("%s(): out-of-order waiting sequence", G_STRFUNC); + } + } + } else { + s_rawcrit("%s(): %s was not waiting for lock %p", + G_STRFUNC, thread_element_name_raw(te), lock); + } + + /* + * We just got a lock of some kind, and we have the thread element so + * we can quickly check for suspension. However, we do not want to check + * for signals here since the lock we just got is not yet recorded. + * + * Suspending will be OK in case of a crash since then the locks become + * pass-through, which is why it is important to check for suspension + * as soon as we got a lock in case we're not in the crashing thread: + * we need to stop concurrent processing as soon as possible to allow + * easier post-mortem analysis. + */ + +done: + thread_check_suspended_element(te, FALSE); +} + +/** + * Record that current thread is waiting on the specified condition variable. + * + * This is used to allow signals to be delivered to threads whilst they + * are aslept, waiting in the condition variable. + * + * @return the thread element as an opaque pointer that can be given back + * to thread_cond_waiting_done() to skip the thread lookup. + */ +const void * +thread_cond_waiting_element(cond_t *c) +{ + struct thread_element *te = thread_get_element(); + + g_assert(c != NULL); + + te = thread_find(&te); + + if G_LIKELY(te != NULL) { + if G_UNLIKELY(te->cond != NULL) { + /* + * Allow nested condition waitings, which may happen during signal + * handling on machines with emulated semaphores (at the exit of + * thread_element_block_until(), where we may process signals). + */ + + if G_UNLIKELY(NULL == te->cond_stack) + te->cond_stack = slist_new(); + + slist_prepend(te->cond_stack, te->cond); + THREAD_STATS_INCX(cond_nested_waitings); + } + + /* + * Because the te->cond field can be accessed by other threads (in the + * thread_kill() routine), we need to lock the thread element to modify + * it, even though we can only be called here in the context of the + * current thread: this ensures we always read a consistent value. + */ + + THREAD_LOCK(te); + te->cond = c; + THREAD_UNLOCK(te); + + THREAD_STATS_INCX(cond_waitings); + } + + return te; +} + +/** + * Clear waiting condition on the thread identified by its thread element, + * as returned previously by thread_cond_waiting_element(). + */ +void +thread_cond_waiting_done(const void *element) +{ + struct thread_element *te = deconstify_pointer(element); + cond_t *c; + + thread_element_check(te); + g_assert_log(te->cond != NULL, + "%s(): had no prior knowledge of any condition waiting", G_STRFUNC); + + if G_UNLIKELY(te->cond_stack != NULL) + c = slist_shift(te->cond_stack); /* Previous condition, or NULL */ + else + c = NULL; + + /* + * Need locking to modify the cond field, see thread_cond_waiting_element() + * and thread_kill(). + */ + + THREAD_LOCK(te); + te->cond = c; + THREAD_UNLOCK(te); +} + +/** + * Re-acquire a lock after suspension. + */ +static void +thread_lock_reacquire( + struct thread_element *te, + const void *lock, enum thread_lock_kind kind, + const char *file, unsigned line) +{ + bool in_sig_handler = te->sig_handling; + /* + * During re-acquisition of rwlocks, locks will be taken and we do not + * want any pending signal delivery whilst we grab a lock that we were + * supposed to already have. + * + * Therefore, we artifically set te->sig_handling and clear it before + * before returning, to cheaply disable all signal delivery given that + * thread_sig_handle() will explicitly avoid processing when that flag + * is set. + */ + + if G_LIKELY(!in_sig_handler) + te->sig_handling = TRUE; /* Prevents any signal delivery */ + + switch (kind) { + case THREAD_LOCK_ANY: + g_assert_not_reached(); + case THREAD_LOCK_SPINLOCK: + { + spinlock_t *s = deconstify_pointer(lock); + + spinlock_grab_from(s, TRUE, file, line); + } + goto done; + case THREAD_LOCK_RLOCK: + { + rwlock_t *r = deconstify_pointer(lock); + rwlock_rgrab(r, file, line, FALSE); + } + goto done; + case THREAD_LOCK_WLOCK: + { + rwlock_t *w = deconstify_pointer(lock); + rwlock_wgrab(w, file, line, FALSE); + } + goto done; + case THREAD_LOCK_MUTEX: + { + mutex_t *m = deconstify_pointer(lock); + + mutex_grab_from(m, MUTEX_MODE_HIDDEN, file, line); + g_assert(1 == m->depth); + } + goto done; + } + + g_assert_not_reached(); + +done: + if G_LIKELY(!in_sig_handler) + te->sig_handling = FALSE; /* Undo forced setting at entry */ +} + +/** + * Account for spinlock / mutex acquisition by current thread, whose + * thread element is already known (as an opaque pointer). + */ +void G_HOT +thread_lock_got(const void *lock, enum thread_lock_kind kind, + const char *file, unsigned line, const void *element) +{ + struct thread_element *te = deconstify_pointer(element); + struct thread_lock_stack *tls; + struct thread_lock *l; + + if (NULL == te) { + te = thread_get_element(); + } else { + thread_element_check(te); + } + + /* + * Update statistics. + */ + + THREAD_STATS_INCX(locks_tracked); + + if G_UNLIKELY(!te->created && !te->main_thread) + THREAD_STATS_INCX(locks_tracked_discovered); + + switch (kind) { + case THREAD_LOCK_ANY: + g_assert_not_reached(); + case THREAD_LOCK_SPINLOCK: + THREAD_STATS_INCX(locks_spinlock_tracked); + break; + case THREAD_LOCK_MUTEX: + THREAD_STATS_INCX(locks_mutex_tracked); + break; + case THREAD_LOCK_RLOCK: + THREAD_STATS_INCX(locks_rlock_tracked); + break; + case THREAD_LOCK_WLOCK: + THREAD_STATS_INCX(locks_wlock_tracked); + break; + } + + /* + * We cannot be grabbing a lock if the current thread declared it was + * in a system call: it means we forgot to clear that state, and this + * will lead a signal handler into thinking it is running in a safe + * environment. + */ + + if G_UNLIKELY(te->in_syscall) { + /* + * Obviously we need to turn off "syscall mode": since we're grabbing + * locks it is not true that we are stuck in a system call, and we + * want to avoid further warnings down the warning path, which would + * cause further recursions. + */ + + THREAD_STATS_INCX(thread_syscalls_locking); + + THREAD_LOCK(te); + te->in_syscall = FALSE; + THREAD_UNLOCK(te); + + s_minicarp_once("%s(): %s attempting to grab %s at %s:%u " + "whilst in syscall mode", + G_STRFUNC, thread_element_name_raw(te), + thread_lock_kind_to_string(kind), file, line); + } + + /* + * Make sure we have room to record the lock in our tracking stack. + */ + + tls = &te->locks; + thread_element_stack_check(te); + + if G_UNLIKELY(tls->capacity == tls->count) { + if (tls->overflow) + return; /* Already signaled, we're crashing */ + tls->overflow = TRUE; + s_rawwarn("%s overflowing its lock stack at %s:%u", + thread_element_name_raw(te), file, line); + thread_lock_dump(te); + if (atomic_int_get(&thread_locks_disabled)) + return; /* Crashing or exiting already */ + s_minierror("too many locks grabbed simultaneously"); + } + + /* + * If there are pending signals for the thread, handle them. + */ + + if G_UNLIKELY(thread_sig_pending(te) && thread_lock_release(lock, kind)) { + THREAD_STATS_INCX(sig_handled_while_locking); + thread_sig_handle(te); + thread_lock_reacquire(te, lock, kind, file, line); + } + + /* + * If the thread was not holding any locks and it has to be suspended, + * now is a good (and safe) time to do it provided the lock is single + * (i.e. either a spinlock or a mutex at depth one). + * + * Indeed, if the thread must be suspended, it is safer to do it before + * it enters the critical section, rather than when it leaves it. + */ + + if G_UNLIKELY(te->suspend) { + /* + * If we can release the lock, it was a single one, at which point + * the thread holds no lock and can suspend itself. When it can + * resume, it needs to reacquire the lock and record it. + * + * Suspension will be totally transparent to the user code. + */ + + if (0 == thread_element_lock_count(te)) { + if (thread_lock_release(lock, kind)) { + thread_suspend_self(te); + thread_lock_reacquire(te, lock, kind, file, line); + } + } else if (thread_in_crash_mode()) { + thread_suspend_loop(te); + } + } + + l = &tls->arenatls->count++; + l->lock = lock; + l->file = file; + l->line = line; + l->kind = kind; +} + +/** + * Account for spinlock / mutex acquisition by current thread, whose + * thread element is already known (as an opaque pointer), then swap the + * locks at the top of the lock stack. + * + * This is used when critical sections overlap and lock A is taken, then B + * followed by a release of A. Note that to avoid deadlocks, lock B must + * always be taken after A, never before under any circumstances. + * + * Because we monitor unlock ordering and enforce strict unlocking order, + * critical section overlaping is not possible without swapping support. + * For assertion checking, the lock which needs to be swapped is also supplied + * and needs to be in the lock stack already. + * + * @param lock the lock we've just taken + * @param kind the type of lock + * @param file file where the lock was taken + * @param line line where the lock was taken + * @param plock the previous lock we took and we want to swap order with + * @param element the thread element (NULL if unknown yet) + */ +void +thread_lock_got_swap(const void *lock, enum thread_lock_kind kind, + const char *file, unsigned line, const void *plock, const void *element) +{ + struct thread_element *te = deconstify_pointer(element); + struct thread_lock_stack *tls; + struct thread_lock *l, *pl; + + /* + * This starts as thread_lock_got() would... + */ + + if (NULL == te) { + te = thread_get_element(); + } else { + thread_element_check(te); + } + + THREAD_STATS_INCX(locks_tracked); + + if G_UNLIKELY(!te->created && !te->main_thread) + THREAD_STATS_INCX(locks_tracked_discovered); + + tls = &te->locks; + thread_element_stack_check(te); + + if G_UNLIKELY(tls->capacity == tls->count) { + if (tls->overflow) + return; /* Already signaled, we're crashing */ + tls->overflow = TRUE; + s_rawwarn("%s overflowing its lock stack", thread_element_name_raw(te)); + thread_lock_dump(te); + if (atomic_int_get(&thread_locks_disabled)) + return; /* Crashing or exiting already */ + s_minierror("too many locks grabbed simultaneously"); + } + + /* + * No thread suspension is possible here contrary to thread_lock_got() + * since we are already holding another lock. + */ + + g_assert_log(tls->count != 0, + "%s(): expected at least 1 lock to be already held", G_STRFUNC); + + pl = &tls->arenatls->count - 1; + + g_assert_log(plock == pl->lock, + "%s(): expected topmost lock to be %p, found %s %p", + G_STRFUNC, plock, thread_lock_kind_to_string(pl->kind), pl->lock); + + /* + * Record new lock before the previous lock so that the previous lock + * can now be released without triggering any assertion failure. + */ + + l = &tls->arenatls->count++; + l->lock = pl->lock; /* Previous lock becomes topmost lock */ + l->file = pl->file; + l->line = pl->line; + l->kind = pl->kind; + pl->lock = lock; /* New lock registered in place of previous */ + pl->file = file; + pl->line = line; + pl->kind = kind; +} + +/** + * Account for lock type change (e.g. promotion of a read lock to a write one). + * + * No swapping of lock order occurs, however the locking origin is updated. + * + * @param lock the lock we've just updated + * @param okind the old type of lock + * @param nkind the new type of lock + * @param file file where the lock was updated + * @param line line where the lock was updated + * @param element the thread element (NULL if unknown yet) + */ +void +thread_lock_changed(const void *lock, enum thread_lock_kind okind, + enum thread_lock_kind nkind, const char *file, unsigned line, + const void *element) +{ + struct thread_element *te = deconstify_pointer(element); + struct thread_lock_stack *tls; + unsigned i; + + /* + * This starts as thread_lock_got() would... + */ + + if (NULL == te) { + te = thread_get_element(); + } else { + thread_element_check(te); + } + + tls = &te->locks; + + g_assert_log(tls->count != 0, + "%s(): expected at least 1 lock to be already held", G_STRFUNC); + + for (i = tls->count; i != 0; i--) { + struct thread_lock *l = &tls->arenai - 1; + + if G_LIKELY(l->lock == lock && l->kind == okind) { + l->kind = nkind; + l->file = file; + l->line = line; + return; + } + } + + if G_UNLIKELY(atomic_int_get(&thread_locks_disabled)) + return; /* We may not be recording locks in pass-through mode */ + + s_minicarp("%s(): %s %p was not registered in thread #%u", + G_STRFUNC, thread_lock_kind_to_string(okind), lock, te->stid); +} + +/** + * Account for spinlock / mutex release by current thread whose thread + * element is known (as an opaque pointer). + */ +void G_HOT +thread_lock_released(const void *lock, enum thread_lock_kind kind, + const void *element) +{ + struct thread_element *te = deconstify_pointer(element); + struct thread_lock_stack *tls; + const struct thread_lock *l; + unsigned i; + + if (NULL == te) { + te = thread_get_element(); + } else { + thread_element_check(te); + } + + tls = &te->locks; + + if G_UNLIKELY(0 == tls->count) { + /* Locks may be missing in pass-through mode */ + if (!atomic_int_get(&thread_locks_disabled)) { + s_minicarp("%s(): %s %p was not registered in thread #%u", + G_STRFUNC, thread_lock_kind_to_string(kind), + lock, te->stid); + } + return; + } + + /* + * If lock is the top of the stack, we're done. + */ + + l = &tls->arenatls->count - 1; + + if G_LIKELY(l->lock == lock) { + g_assert_log(l->kind == kind, + "%s(): %s %p is actually registered as %s in thread #%u", + G_STRFUNC, thread_lock_kind_to_string(kind), lock, + thread_lock_kind_to_string(l->kind), te->stid); + + tls->count--; + + /* + * Handle signals if any are pending and can be delivered. + */ + + if G_UNLIKELY(thread_sig_pending(te)) { + THREAD_STATS_INCX(sig_handled_while_unlocking); + thread_sig_handle(te); + } + + /* + * If the thread no longer holds any locks and it has to be suspended, + * now is a good (and safe) time to do it. + */ + + if G_UNLIKELY(te->suspend && 0 == thread_element_lock_count(te)) + thread_suspend_self(te); + + return; + } + + /* + * Since the lock was not the one at the top of the stack, then it must be + * absent in the whole stack, or we have an out-of-order lock release. + */ + + if (tls->overflow) + return; /* Stack overflowed, we're crashing */ + + for (i = 0; i < tls->count; i++) { + const struct thread_lock *ol = &tls->arenai; + + if (ol->lock == lock) { + tls->overflow = TRUE; /* Avoid any overflow problems now */ + s_rawwarn("%s releases %s %p at inner position %u/%zu", + thread_element_name_raw(te), thread_lock_kind_to_string(kind), + lock, i + 1, tls->count); + thread_lock_dump(te); + + /* + * If crashing, it's interesting to learn about possible + * out-of-order unlocking, because it may point to a true + * bug in the crash handling, but let processing continue + * to be able to dump useful information anyway. + */ + + if ( + !thread_is_crashing() && + 0 == atomic_int_get(&thread_locks_disabled) + ) { + s_error("out-of-order %s release", + thread_lock_kind_to_string(kind)); + } + + return; + } + } +} + +/** + * Check whether current thread holds any lock taken in a given file. + * + * This is used during crashes to determine whether we got a lock from a + * memory allocator, for instance, to be able to disable that allocator + * or put it into a minimal safe state (where it would allocate but no longer + * be able to free memory, for instance). + * + * @param file the source file to check + */ +bool +thread_lock_holds_from(const char *file) +{ + struct thread_element *te = thread_get_element(); + struct thread_lock_stack *tls; + unsigned i; + + tls = &te->locks; + + if (0 == tls->count) + return FALSE; + + for (i = tls->count; i != 0; /**/) { + const struct thread_lock *l = &tls->arena--i; + + if (0 == strcmp(l->file, file)) + return TRUE; + } + + return FALSE; +} + +/** + * Check whether current thread already holds a lock of a given kind. + * + * When the kind of lock is THREAD_LOCK_ANY, we do not care about the lock + * kind: we simply look whether the lock address is registered. + * + * @param lock the address of a lock we record (mutex, spinlock, etc...) + * @param kind kind of lock (useful for multiform locks like rwlocks) + * + * @return TRUE if lock was registered in the current thread. + */ +bool +thread_lock_holds_as(const volatile void *lock, enum thread_lock_kind kind) +{ + struct thread_element *te = thread_get_element(); + struct thread_lock_stack *tls; + unsigned i; + + tls = &te->locks; + + /* + * When there are no locks recorded, check whether we had the opportunity + * to record any lock: + * if we are at some point in the execution stack below the point where + * we first recorded a lock, the we probably could not record the lock + * at the time hence we also return the default value. + */ + + if G_UNLIKELY(0 == tls->count) + return FALSE; + + /* + * Most likely, when checking for locks, we are running assertions. + * And then we are probably most interested by locks acquired lastly + * in the calling chain. + * + * Therefore, since we are doing a linear scan, it pays to start from + * the end of the lock stack. + */ + + for (i = tls->count; i != 0; /**/) { + const struct thread_lock *l = &tls->arena--i; + + if G_UNLIKELY(l->lock == lock) { + if (THREAD_LOCK_ANY == kind) + return TRUE; + return l->kind == kind; + } + } + + return FALSE; +} + +/** + * Check whether current thread already holds a lock. + * + * @param lock the address of a lock we record (mutex, spinlock, etc...) + * + * @return TRUE if lock was registered in the current thread. + */ +bool +thread_lock_holds(const volatile void *lock) +{ + return thread_lock_holds_as(lock, THREAD_LOCK_ANY); +} + +/** + * @return amount of times a lock is held by the current thread. + */ +size_t +thread_lock_held_count(const void *lock) +{ + struct thread_element *te = thread_get_element(); + struct thread_lock_stack *tls; + unsigned i; + size_t count = 0; + + tls = &te->locks; + + if G_UNLIKELY(0 == tls->count) + return FALSE; + + for (i = 0; i < tls->count; i++) { + const struct thread_lock *l = &tls->arenai; + + if G_UNLIKELY(l->lock == lock) + count++; + } + + return count; +} + +/** + * @return amount of locks held by the current thread. + */ +size_t +thread_lock_count(void) +{ + struct thread_element *te = thread_get_element(); + + return thread_element_lock_count(te); +} + +/** + * Count locks held by other threads. + * + * Since by definition threads are concurrently running, this routine is + * not returning a reliable defined value unless thread_suspend_others(TRUE) + * was already called, since then we know any further attempt to grab a lock + * will suspend the other threads. + * + * When thread_suspend_others(FALSE) was called before, the only reliable + * result from this routine is 0. Any other value is not reliable since a + * thread will not suspend itself until it has released all its locks. Hence + * the amount of locks held by other threads could still change unless none + * of the other threads were holding any lock. + * + * @return amount of locks held by all the other threads but the current one. + */ +static size_t +thread_others_lock_count(void) +{ + struct thread_element *te = thread_get_element(); + size_t count = 0, i; + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *xte = threadsi; + + if G_UNLIKELY(xte == te) + continue; + + count += thread_element_lock_count(xte); + } + + return count; +} + +/** + * @return amount of locks held by specified thread ID. + */ +size_t +thread_id_lock_count(unsigned id) +{ + struct thread_element *te; + + if G_UNLIKELY(id >= THREAD_MAX) + return 0; + + te = threadsid; + if G_UNLIKELY(NULL == te || te->reusable) + return 0; + + return thread_element_lock_count(te); +} + +/** + * Assert that thread holds no locks. + * + * This can be used before issuing a potentially blocking operation to + * make sure that no deadlocks are possible. + * + * If the function returns, it means that the thread did not hold any + * registered locks (hidden locks are, by construction, invisible). + * + * @param routine name of the routine making the assertion + */ +void +thread_assert_no_locks(const char *routine) +{ + struct thread_element *te = thread_get_element(); + size_t cnt = thread_element_lock_count(te); + + if G_UNLIKELY(0 != cnt) { + s_warning("%s(): %s currently holds %zu lock%s", + routine, thread_element_name(te), cnt, plural(cnt)); + thread_lock_dump(te); + s_error("%s() expected no locks, found %zu held", routine, cnt); + } +} + +/** + * Find who owns a lock, and what kind of lock it is. + * + * @param lock the lock address + * @param kind where type of lock is written, if owner found + * + * @return thread owning a lock, NULL if we can't find it. + */ +static struct thread_element * +thread_lock_owner(const volatile void *lock, enum thread_lock_kind *kind) +{ + unsigned i; + + /* + * We don't stop other threads because we're called in a deadlock + * situation so it's highly unlikely that the thread owning the lock + * will suddenly choose to release it. + */ + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *te = threadsi; + struct thread_lock_stack *tls = &te->locks; + unsigned j; + + for (j = 0; j < tls->count; j++) { + const struct thread_lock *l = &tls->arenaj; + + if (l->lock == lock) { + *kind = l->kind; + return te; + } + } + } + + return NULL; +} + +/** + * Was crash mode activated? + */ +bool +thread_in_crash_mode(void) +{ + return 0 != atomic_int_get(&thread_crash_mode_enabled); +} + +/** + * Is current thread the crashing thread (the one that entered crash mode)? + */ +bool +thread_is_crashing(void) +{ + return (int) thread_small_id() == atomic_int_get(&thread_crash_mode_stid); +} + +/** + * Enter thread crashing mode. + */ +void +thread_crash_mode(void) +{ + if (0 == atomic_int_inc(&thread_crash_mode_enabled)) { + /* + * First thread to crash, record its ID so that we allow stacktrace + * dumping for this crashing thread (other threads should be suspended). + * Given we do not know where we are called from, it's safer to + * use the thread_safe_small_id() which will not take any locks. + */ + + atomic_int_set(&thread_crash_mode_stid, thread_safe_small_id()); + + /* + * Suspend the other threads: we are going to run with all locks + * disabled, hence it is best to prevent concurrency errors whilst + * we are collecting debugging information. + */ + + thread_suspend_others(FALSE); /* Advisory, do not wait for others */ + } + + /* + * Now that other threads are disabled, check whether any of them have + * any locks held. If none of them have, there is no need to disable + * locking, unless we have been called already, which means we're crashing + * again during our crash handling. + */ + + if (0 != thread_others_lock_count() || thread_crash_mode_enabled > 1) + thread_lock_disable(FALSE); +} + +/** + * Exiting mode -- one thread is doing exit and possibly running final cleanup. + */ +void G_COLD +thread_exit_mode(void) +{ + /* + * We're going to suspend all the other threads, which is necessary since + * final cleanup is going to run with minimal resources and we do not + * want other threads to suddenly fail because of an assertion failure. + * + * Because we're suspending threads, we need to also disable locking: + * a thread waiting in the rwlock queue does not hold any lock yet and + * therefore can get suspended, but will cause a deadlock if the exiting + * thread needs that same rwlock. + */ + + thread_suspend_others(FALSE); /* Advisory, do not wait for others */ + thread_lock_disable(TRUE); /* Silently disable all locks */ +} + +/** + * Report a deadlock condition whilst attempting to get a lock. + * + * This is only executed once per thread, since a deadlock is an issue that + * will only be resolved through process termination. + */ +void +thread_lock_deadlock(const volatile void *lock) +{ + static int deadlocked; + struct thread_element *te; + struct thread_element *towner; + struct thread_lock *l; + enum thread_lock_kind kind = THREAD_LOCK_ANY; + bool known_kind = TRUE; + unsigned i; + int depth = atomic_int_inc(&deadlocked); + + te = thread_find(&te); + if G_UNLIKELY(NULL == te) { + s_miniinfo("no thread to list owned locks"); + return; + } + + if (te->deadlocked) + return; /* Do it once per thread since there is no way out */ + + te->deadlocked = TRUE; + towner = thread_lock_owner(lock, &kind); + + if (0 == te->waits.count) { + l = NULL; + } else { + l = &te->waits.arenate->waits.count - 1; + } + + if (NULL == towner) { + if (l != NULL && lock == l->lock) { + kind = l->kind; /* Normal case: lock is last waited-for */ + } else { + known_kind = FALSE; /* Not yet known as being waited-for */ + } + } + + if (NULL == l || lock != l->lock) { + s_rawwarn("%s(): %s %p was not recorded as last being waited-for in %s", + G_STRFUNC, + known_kind ? thread_lock_kind_to_string(kind) : "lock", + lock, thread_element_name_raw(te)); + } + + if (NULL == towner || towner == te) { + s_rawwarn("%s deadlocked whilst waiting on %s%s%p, owned by %s", + thread_element_name_raw(te), + known_kind ? thread_lock_kind_to_string(kind) : "", + known_kind ? " " : "", + lock, NULL == towner ? "nobody" : "itself"); + } else { + char buf128; + const char *name = thread_element_name_raw(towner); + + g_strlcpy(buf, name, sizeof buf); + + s_rawwarn("%s deadlocked whilst waiting on %s %p, owned by %s", + thread_element_name_raw(te), + thread_lock_kind_to_string(kind), lock, buf); + } + + thread_lock_dump(te); + if (towner != NULL && towner != te) + thread_lock_dump(towner); + + /* + * Mark all the threads as overflowing their lock stack. + * + * That way we'll silently ignore lock recording overflows and will + * become totally permissive about out-of-order releases. + */ + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *xte = threadsi; + struct thread_lock_stack *tls = &xte->locks; + + atomic_mb(); + tls->overflow = TRUE; + atomic_mb(); + } + + if (depth != 0) + return; /* Concurrent call or recursion, avoid problems */ + + s_miniinfo("attempting to unwind current stack:"); + stacktrace_where_safe_print_offset(STDERR_FILENO, 1); +} + +/** + * Forcefully clear all the locks registered by the thread. + */ +static void +thread_element_clear_locks(struct thread_element *te) +{ + struct thread_lock_stack *tls = &te->locks; + unsigned i; + + for (i = 0; i < tls->count; i++) { + const struct thread_lock *l = &tls->arenai; + const char *type; + bool unlocked = FALSE; + + type = thread_lock_kind_to_string(l->kind); + + switch(l->kind) { + case THREAD_LOCK_ANY: + g_assert_not_reached(); + case THREAD_LOCK_SPINLOCK: + { + spinlock_t *s = deconstify_pointer(l->lock); + + if ( + mem_is_valid_range(s, sizeof *s) && + SPINLOCK_MAGIC == s->magic && + 1 == s->lock + ) { + unlocked = TRUE; + spinlock_reset(s); + } + } + break; + case THREAD_LOCK_RLOCK: + case THREAD_LOCK_WLOCK: + { + rwlock_t *rw = deconstify_pointer(l->lock); + + if ( + mem_is_valid_range(rw, sizeof *rw) && + RWLOCK_MAGIC == rw->magic && + (0 != rw->readers || 0 != rw->writers || 0 != rw->waiters) + ) { + unlocked = TRUE; + rwlock_reset(rw); + } + } + break; + case THREAD_LOCK_MUTEX: + { + mutex_t *m = deconstify_pointer(l->lock); + + if ( + mem_is_valid_range(m, sizeof *m) && + MUTEX_MAGIC == m->magic && + 1 == m->lock.lock + ) { + unlocked = TRUE; + mutex_reset(m); + } + } + break; + } + + if (unlocked) { + char time_bufCRASH_TIME_BUFLEN; + char bufPOINTER_BUFLEN; + DECLARE_STR(10); + + pointer_to_string_buf(l->lock, buf, sizeof buf); + + crash_time(time_buf, sizeof time_buf); + print_str(time_buf); /* 0 */ + print_str(" WARNING: unlocked "); /* 1 */ + print_str(type); /* 2 */ + print_str(" "); /* 3 */ + print_str(buf); /* 4 */ + { + const char *lnum; + char lbufUINT_DEC_BUFLEN; + + lnum = PRINT_NUMBER(lbuf, l->line); + print_str(" from "); /* 5 */ + print_str(l->file); /* 6 */ + print_str(":"); /* 7 */ + print_str(lnum); /* 8 */ + } + print_str("\n"); /* 9 */ + flush_err_str(); + } + } +} + +/** + * Wrapper over fork() to be as thread-safe as possible when forking. + * + * A forking thread must be out of all its critical sections, i.e. it must + * not hold any locks. + * + * If "safe" is TRUE (recommended setting), the fork() only occurs when all + * the other threads have been suspended and are out of their (advertised) + * critical sections. + * + * Otherwise, the fork() happens immediately but depending where the other + * threads were in their critical sections, this may have adverse effects. + * For instance, if a thread was updating malloc() data structures, the + * new process may be facing inconstencies that could lead to failure or + * memory corruption. + * + * @note + * The safety offered here is only partial since many low-level routines take + * "hidden" or "fast" locks, either because the penalty of recording the lock + * would be too great or because the current thread may be hard to assess and + * therefore a "fast" lock is the only option. + * + * Taking a "fast" or "hidden" lock to be able to consistently read data is OK + * because no inconsistency can be created, but taking such a lock for modifying + * data means that there is a potential for failure when thread_fork() is + * called. + * + * @param safe if FALSE, immediately fork, otherwise wait for others + */ +pid_t +thread_fork(bool safe) +{ + /* + * A forking thread must be out of all its critical sections. + */ + + thread_assert_no_locks(G_STRFUNC); + +#ifdef HAS_FORK + { + pid_t child; + + /* + * If "safe" is TRUE, wait for all the other threads to no longer hold + * any locks, thereby ensuring all their critical sections have been + * completed. + */ + + thread_suspend_others(safe); + + switch ((child = fork())) { + case 0: + thread_forked(); + return 0; + default: + THREAD_STATS_INCX(thread_forks); + thread_unsuspend_others(); + return child; + } + g_assert_not_reached(); + } +#else + (void) safe; + errno = ENOSYS; + return -1; +#endif +} + +/** + * Signals that current thread has forked and is now running in the child. + * + * When a thread has called fork(), its child should invoke this routine. + * + * Alternatively, threads willing to fork() can call thread_fork() to handle + * the necessary cleanup appropriately. + */ +void +thread_forked(void) +{ + struct thread_element *te; + unsigned i; + + te = thread_find(&te); + if (NULL == te) { + char time_bufCRASH_TIME_BUFLEN; + DECLARE_STR(4); + + crash_time(time_buf, sizeof time_buf); + print_str(time_buf); /* 0 */ + print_str(" WARNING: "); /* 1 */ + print_str(G_STRFUNC); /* 2 */ + print_str("(): cannot determine current thread\n"); /* 3 */ + flush_err_str(); + return; + } + + /* + * After fork() we are the main thread and the only one running. + */ + + thread_main_stid = te->stid; + thread_running = 0; + thread_discovered = 1; /* We're discovering ourselves */ + te->created = FALSE; + te->discovered = TRUE; + te->last_seen = tm_time_raw(); + + /* + * FIXME: + * If thread_forked() is really used through thread_fork() then we'll + * need to complete the support: + * + * - need to add semaphore_forget() to forget about the parent's semaphores. + * - need cond_reset_all() to reset all known condition variables, which + * means we'll have to track them somehow. + * + * For now, we: + * - reset all the other threads' locks to prevent any deadlock. + * - close all the inter-thread wfd descriptors. + * + * When we come from thread_fork(TRUE), no thread should hold any lock + * since we waited, but when coming from the crash handler or + * thread_fork(FALSE), we cannot be sure. + * + * All the reset locks will be traced. By construction "hidden" locks are + * invisible and "fast" locks are not recorded, so this can only affect + * registered (normal) locks. + * --RAM, 2013-01-05 + */ + + for (i = 0; i < thread_next_stid; i++) { + struct thread_element *xte = threadsi; + + thread_block_close(xte); + + if (te == xte) + continue; + + if (0 != xte->locks.count) + thread_element_clear_locks(xte); + + xmalloc_thread_ended(xte->stid); + thread_element_reset(xte); + xte->reusable = TRUE; + xte->valid = FALSE; + xte->main_thread = FALSE; + } + + thread_set(te->tid, thread_self()); /* May have changed after fork() */ + te->main_thread = TRUE; + + /* + * Reset statistics. + */ + + ZERO(&thread_stats); + THREAD_STATS_INC(discovered); +} + +/** + * Get amount of unblock events received by the thread so far. + * + * This is then passed to thread_block_self() and if there is a change + * between the amount passed and the amount returned by this routine, it + * means the thread received an unblock event whilst it was preparing to + * block. + */ +unsigned +thread_block_prepare(void) +{ + struct thread_element *te = thread_get_element(); + unsigned events; + + g_assert(!te->blocked); + + /* + * Since te->unblock_events can be updated by another thread, on another + * CPU, taking a lock to read the field is necessary to ensure we're + * reading the current value (locks provide the necessary memory barriers + * and cache synchronization). + */ + + THREAD_LOCK(te); + events = te->unblock_events; + THREAD_UNLOCK(te); + + return events; +} + +/** + * Panic routine invoked when the "non-blockable" main thread is blocking + * for too long. + */ +static void +thread_block_timeout(void *arg) +{ + const char *routine = arg; + struct thread_element *te = thread_get_element(); + + /* + * If we're already set to non-blocking, it means there has been a delay + * in the thread scheduling that caused it to sleep for too long, way past + * the initial safeguard we had set. But it is unblocked now, so no need + * to panic. Just emit a message. + * --RAM, 2015-02-25 + */ + + if (!te->blocked) { + s_warning("%s(): ignored as main thread no longer blocked in %s()", + G_STRFUNC, routine); + return; + } + + s_error("%s() called from non-blockable main thread, and blocking!", + routine); +} + +/** + * Set or clear the "in syscall" state. + */ +static void +thread_element_in_syscall_set(struct thread_element *te, bool value) +{ + static bool insetTHREAD_MAX; + sigset_t set; + bool isdup; + + /* + * Since spinlock_raw() can sleep and call thread_in_syscall_set(), + * we need to protect against recursions. + */ + + if G_UNLIKELY(insette->stid) { + THREAD_STATS_INCX(thread_syscalls_recursions); + return; + } + + insette->stid = TRUE; + + if (value) + THREAD_STATS_INCX(thread_syscalls); + + /* + * We can only set the flag to TRUE if we are not holding any locks. + */ + + if G_UNLIKELY(value && 0 != thread_element_lock_count(te)) { + THREAD_STATS_INCX(thread_syscalls_with_locks); + goto done; + } + + /* + * The signal critical section ensures nothing can interrupt us whilst + * we are setting the "in syscall" status. This lets us know that when + * a signal arrives, and the te->in_syscall status is set, the thread + * was in a "safe" state and the signal handler will be able to call + * malloc() and friends. + * --RAM, 2016-01-31 + */ + + if (!signal_thread_enter_critical(te->stid, &set)) + s_error("%s(): unable to establish critical section", G_STRFUNC); + + THREAD_LOCK(te); + isdup = value && te->in_syscall; + te->in_syscall = booleanize(value); + THREAD_UNLOCK(te); + + signal_thread_leave_critical(te->stid, &set); + + if G_UNLIKELY(isdup) { + THREAD_STATS_INCX(thread_syscalls_dups); + s_minicarp_once("%s(): duplicate system call accounting", G_STRFUNC); + } + +done: + insette->stid = FALSE; +} + +/** + * State whether thread is issuing a blocking system call. + */ +void +thread_in_syscall_set(bool value) +{ + int stid = thread_safe_small_id(); + + /* + * Since spinlock_raw() can sleep and call thread_in_syscall_set(), + * we need to protect against recursions. Hence we cannot use + * thread_get_element() here, since it can take hidden locks. + */ + + if G_UNLIKELY(stid < 0) + return; + + thread_element_in_syscall_set(threadsstid, value); +} + +/** + * Reset the "in syscall" state, undoing the accounting made earlier if we + * are really in that state. + * + * This routine is necessary when emulating a system call, for instance on + * Windows for the nanosleep() routine. Being a system call on UNIX, the + * caller can optionally flag the thread as going to enter a system call. + * But in the emulation, we need to reset the state, especially if we can + * call allocation routines, take locks, log, etc... Until we are ready to + * actually block in a safe state. + */ +void +thread_in_syscall_reset(void) +{ + struct thread_element *te = thread_get_element(); + sigset_t set; + bool was_in_syscall; + + /* + * Quick shortcut: if not already flagged as being in a system call, there + * is nothing to do. + */ + + if (!te->in_syscall) + return; + + /* + * The signal critical section ensures nothing can interrupt us whilst + * we are setting the "in syscall" status. This lets us know that when + * a signal arrives, and the te->in_syscall status is set, the thread + * was in a "safe" state and the signal handler will be able to call + * malloc() and friends. + * --RAM, 2016-01-31 + */ + + if (!signal_thread_enter_critical(te->stid, &set)) + s_error("%s(): unable to establish critical section", G_STRFUNC); + + THREAD_LOCK(te); + was_in_syscall = te->in_syscall; + te->in_syscall = FALSE; + THREAD_UNLOCK(te); + + signal_thread_leave_critical(te->stid, &set); + + if G_LIKELY(was_in_syscall) { + THREAD_STATS_DECX(thread_syscalls); + + if G_UNLIKELY(0 != thread_element_lock_count(te)) + THREAD_STATS_DECX(thread_syscalls_with_locks); + } +} + +/** + * Upon reception of a kernel signal, check whether we were in a system call. + * + * If the thread was in a system call, the flag is reset (in case another + * signal triggers and interrupts the thread again, we will no longer be in + * a system call), and it will need to be reset before leaving the signal + * handler, by calling thread_in_syscall_set() again. + * + * As a side effect, also returns the thread ID of the interrupted thread, + * assuming we can determine it, or THREAD_UNKNOWN_ID if we can't figure it out. + * + * @param stid where the small thread ID is returned + * + * @return TRUE if we were in a system call. + */ +bool +thread_was_in_syscall(int *stid) +{ + struct thread_element *te; + bool in_syscall = FALSE; + + g_assert(stid != NULL); + + THREAD_STATS_INCX(thread_interrupts); + + if (0 > (*stid = thread_safe_small_id())) + return FALSE; + + te = threads*stid; + + if (te->in_syscall) { + THREAD_LOCK(te); + if (te->in_syscall) { + in_syscall = TRUE; + te->in_syscall = FALSE; + } + THREAD_UNLOCK(te); + + /* + * If there is a lock held, someone lied. + */ + + if G_UNLIKELY(in_syscall && 0 != thread_element_lock_count(te)) + in_syscall = FALSE; + + if (in_syscall) + THREAD_STATS_INCX(thread_safe_interrupts); + } + + return in_syscall; +} + +/** + * Block execution of current thread until a thread_unblock() is posted to it + * or until the timeout expires. + * + * The thread must not be holding any locks since it could cause deadlocks. + * The main thread cannot block itself either since it runs the callout queue. + * + * When this routine returns, the thread has been either successfully unblocked + * and is resuming its execution normally or the timeout expired. + * + * @note + * This routine is a cancellation point. + * + * @param te the thread element for the current thread + * @param events the amount of events returned by thread_block_prepare() + * @param end absolute time when we must stop waiting (NULL = no limit) + * + * @return TRUE if we were properly unblocked, FALSE if we timed out. + */ +static bool +thread_element_block_until(struct thread_element *te, + unsigned events, const tm_t *end) +{ + evq_event_t *eve = NULL; + gentime_t gstart = GENTIME_ZERO; + long requested = 0; + char c; + static once_flag_t done; + + g_assert(!te->blocked); + + ONCE_FLAG_RUN(done, thread_install_tm_listener); + + /* + * If there is a timeout, compute the amount of time that we have to + * spend blocked, in seconds, in order to protect against sudden clock + * adjustments. + */ + + if (end != NULL) { + long remaining = tm_remaining_ms(end); + + if (remaining <= 0) + return FALSE; /* Timed out already */ + + requested = (remaining + 999) / 1000; /* In seconds, rounded up */ + gstart = gentime_now(); + } + + thread_check_suspended_element(te, TRUE); + + /* + * Make sure the main thread never attempts to block itself if it + * has not explicitly told us it can block. + * + * Actually we need to make an exception to this rule, to allow barriers + * to be used when creating new threads from the main thread, but the + * expectation is that the main thread will not block for "too long", + * which is defined by the THREAD_MAIN_DELAY_MS constant. + * + * To detect long blockings, we use the "event queue", not the main + * callout queue since it will run in the main thread when it is configured + * to never block -- precisely the condition under which we need a callout + * event in the near future. + */ + + if (thread_main_stid == te->stid && !thread_main_can_block) + eve = evq_insert(THREAD_MAIN_DELAY_MS, thread_block_timeout, G_STRFUNC); + + /* + * Blocking works thusly: the thread attempts to read one byte out of its + * pipe and that will block it until someone uses thread_unblock() to + * write a single byte to that same pipe. + */ + + thread_block_init(te); + + /* + * Make sure the thread has not been unblocked concurrently whilst it + * was setting up for blocking. When that happens, there is nothing + * to read on the pipe since the unblocking thread did not send us + * anything as we were not flagged as "blocked" yet. + */ + + THREAD_LOCK(te); + if (te->unblock_events != events) { + THREAD_UNLOCK(te); + THREAD_STATS_INCX(thread_self_block_races); + goto done; /* Was sent an "unblock" event already */ + } + + /* + * Lock is required for the te->unblocked update, since this can be + * concurrently updated by the unblocking thread. Whilst we hold the + * lock we also update the te->blocked field, since it lies in the same + * bitfield in memory, and therefore it cannot be written atomically. + */ + + te->timed_blocked = booleanize(end != NULL); + te->blocked = TRUE; + te->unblocked = FALSE; + THREAD_UNLOCK(te); + + /* + * If we have a time limit, poll the file descriptor first before reading. + */ + + THREAD_STATS_INCX(thread_self_blocks); + +retry: + thread_cancel_test_element(te); + + /* + * Handle pending signals, unless the `te->signalled' flag is set, + * in which case someone sent us an "unblocking byte" and the poll() + * below will immediately trigger and we'll handle signals afterwards. + */ + + while (thread_sig_pending(te) && 0 == te->signalled) { + THREAD_LOCK(te); + te->blocked = FALSE; + THREAD_UNLOCK(te); + + (void) thread_signal_check(te); + + THREAD_LOCK(te); + te->blocked = TRUE; + THREAD_UNLOCK(te); + } + + if (end != NULL) { + long upper, remain = tm_remaining_ms(end); + gentime_t gnow; + time_delta_t gelapsed; + struct pollfd fds; + int r; + + if G_UNLIKELY(remain <= 0) + goto timed_out; /* Waiting time expired */ + + gnow = gentime_now(); + gelapsed = gentime_diff(gnow, gstart); + if (gelapsed > requested) + goto timed_out; /* Waiting time expired */ + + /* + * We use the minimum between the remaining time until the absolute + * timestamp given on entry, and the amount of time we have to wait + * based on gentime_diff(), which will account for possible clock + * adjustements (in the past, neutralizing them hopefully). + */ + + upper = 1000 + (requested - gelapsed) * 1000; + remain = MIN(remain, upper); + remain = MIN(remain, MAX_INT_VAL(int)); /* poll() takes an int */ + + if G_UNLIKELY(remain <= 0) + goto timed_out; /* Waiting time expired */ + + fds.fd = te->wfd0; + fds.events = POLLIN; + + /* + * Note that compat_poll() is flagging itself as being in a system call + * which will let us know that an interrupting signal runs in a safe + * environment where it can call malloc() freely since we are not + * interrupting any memory allocation and are not holding any lock. + */ + + r = compat_poll(&fds, 1, remain); + + if (-1 == r) { + if (EINTR == errno) + goto retry; + s_error("%s(): %s could not block itself on poll() for fd #%u: %m", + G_STRFUNC, thread_element_name(te), te->wfd0); + } + + if (0 == r) + goto timed_out; /* The poll() timed out */ + + /* FALL THROUGH -- we can now safely read from the file descriptor */ + } + + if (-1 == s_read(te->wfd0, &c, 1)) { + if (EINTR == errno) + goto retry; + s_error("%s(): %s could not block itself on read(%u): %m", + G_STRFUNC, thread_element_name(te), te->wfd0); + } + + thread_cancel_test_element(te); + + /* + * Check whether we've been signalled. + * + * When a blocked thread is receiving a signal, the signal dispatching + * code sets te->signalled before unblocking us. However, this is not + * a true unblocking and we need to go back waiting after processing + * the signal. + */ + + THREAD_LOCK(te); + if G_UNLIKELY(te->signalled != 0) { + bool limited_blocking = FALSE; + + atomic_uint_dec(&te->signalled); /* Consumed one signaling byte */ + te->timed_blocked = FALSE; + te->blocked = FALSE; + te->unblocked = FALSE; + THREAD_UNLOCK(te); + + /* + * Avoid any race condition with the signal handler, which could take + * a long processing time. + */ + + if G_UNLIKELY(eve != NULL) { + limited_blocking = TRUE; + evq_cancel(&eve); + } + + THREAD_STATS_INCX(sig_handled_while_blocked); + thread_sig_handle(te); + + /* + * If a signal is supposed to interrupt blocking, then act as if + * we had timed-out already. + */ + + if (te->sleep_interruptible > 0) + goto timed_out; + + /* + * If we were blocking the "non-blockable" main thread, restart the + * timeout condition since we just invoked a signal handler and + * therefore we were not really blocked. + */ + + if (limited_blocking) { + eve = evq_insert(THREAD_MAIN_DELAY_MS, + thread_block_timeout, G_STRFUNC); + } + + THREAD_LOCK(te); + /* + * Since we reset te->blocked to FALSE earlier before dispatching + * the signals, we need to recheck for the event count now to see + * whether we've been unblocked already, since a concurrent unblock + * would not have sent any byte on the pipe / socketpair. + * + * This time we do not count blocking race, as there was none: we + * were blocked earlier and got awoken by a signal. + */ + + if (te->unblock_events != events) { + THREAD_UNLOCK(te); + goto done; /* Was sent an "unblock" event already */ + } + + te->timed_blocked = booleanize(end != NULL); + te->blocked = TRUE; + te->unblocked = FALSE; + THREAD_UNLOCK(te); + goto retry; + } + + te->timed_blocked = FALSE; + te->blocked = FALSE; + te->unblocked = FALSE; + THREAD_UNLOCK(te); + +done: + + /* + * If we were blocking the "non-blockable" main thread, remove the + * timeout condition. + */ + + if G_UNLIKELY(eve != NULL) + evq_cancel(&eve); + + /* + * Before returning to user code, check for suspension request. + */ + + thread_check_suspended_element(te, TRUE); + + return TRUE; + +timed_out: + THREAD_LOCK(te); + te->timed_blocked = FALSE; + te->blocked = FALSE; + te->unblocked = FALSE; + THREAD_UNLOCK(te); + + if G_UNLIKELY(eve != NULL) + evq_cancel(&eve); + + thread_check_suspended_element(te, TRUE); + thread_cancel_test_element(te); + + return FALSE; +} + +/** + * Block execution of current thread until a thread_unblock() is posted to it. + * + * The thread must not be holding any locks since it could cause deadlocks. + * The main thread cannot block itself either since it runs the callout queue. + * + * When this routine returns, the thread has been successfully unblocked and + * is resuming its execution normally. + * + * The proper way to use this routine is illustrated by the following + * pseudo code: + * + * block = FALSE; + * + * <enter critical section> + * events = thread_block_prepare(); + * ... + * evaluate whether we need to block, set ``block'' to TRUE when we do + * ... + * <leave critical section> + * + * if (block) + * thread_block_self(events); + * + * That will avoid any race condition between the time the critical section + * is left and the call to thread_block_self() because if thread_unblock() + * is called in-between, the event count will be incremented and there will + * be no blocking done. + * + * @note + * This routine is a cancellation point. + * + * @param events the amount of events returned by thread_block_prepare() + */ +void +thread_block_self(unsigned events) +{ + struct thread_element *te = thread_get_element(); + + thread_assert_no_locks(G_STRFUNC); + + thread_element_block_until(te, events, NULL); +} + +/** + * Block execution of current thread until a thread_unblock() is posted to it + * or until the timeout expires. + * + * The thread must not be holding any locks since it could cause deadlocks. + * The main thread cannot block itself either since it runs the callout queue. + * + * When this routine returns, the thread has either been successfully unblocked + * and is resuming its execution normally or the timeout expired. + * + * @note + * This routine is a cancellation point. + * + * @param events the amount of events returned by thread_block_prepare() + * @param tmout timeout (NULL = infinite) + * + * @return TRUE if we were properly unblocked, FALSE if we timed out. + */ +bool +thread_timed_block_self(unsigned events, const tm_t *tmout) +{ + struct thread_element *te = thread_get_element(); + tm_t end; + + thread_assert_no_locks(G_STRFUNC); + + if (tmout != NULL) { + tm_now_exact(&end); + tm_add(&end, tmout); + } + + return thread_element_block_until(te, events, NULL == tmout ? NULL : &end); +} + +/** + * Unblock thread blocked via thread_block_self(). + * + * @return 0 if OK, -1 on error with errno set. + */ +static int +thread_element_unblock(struct thread_element *te) +{ + bool need_unblock = TRUE; + + /* + * If the targeted thread is not blocked yet, count the event nonetheless. + * This will prevent any race condition between the preparation for + * blocking and the blocking itself. + * + * We also need to record when the thread is unblocked to avoid writing + * more than one character to the pipe. That way, once the unblocked + * thread has read that character, it will be able to block again by + * reusing the same pipe. + */ + + THREAD_LOCK(te); + te->unblock_events++; + if (te->unblocked || !te->blocked) + need_unblock = FALSE; + te->unblocked = TRUE; + THREAD_UNLOCK(te); + + if (need_unblock) { + char c = '\0'; + + if (-1 == s_write(te->wfd1, &c, 1)) { + s_minicarp("%s(): cannot unblock %s via write(%u): %m", + G_STRFUNC, thread_element_name(te), te->wfd1); + return -1; + } + } + + return 0; +} + +/** + * Get thread element by thread (small) ID. + * + * @return the thread element if found, NULL otherwise with errno set. + */ +static struct thread_element * +thread_get_element_by_id(unsigned id) +{ + struct thread_element *te; + + if (id >= thread_next_stid) { + errno = ESRCH; + return NULL; + } + te = threadsid; + if (!te->valid && !te->creating) { + errno = ESRCH; + return NULL; + } + + return te; +} + +/** + * Unblock thread blocked via thread_block_self(). + * + * @return 0 if OK, -1 on error with errno set. + */ +int +thread_unblock(unsigned id) +{ + struct thread_element *te; + + te = thread_get_element_by_id(id); + if (NULL == te) { + s_minicarp("%s(): cannot unblock thread #%u: %m", G_STRFUNC, id); + return -1; + } + + return thread_element_unblock(te); +} + +struct thread_launch_context { + struct thread_element *te; + process_fn_t routine; + void *arg; + barrier_t *b; + uint flags; + tsigset_t sig_mask; +}; + +/** + * Register the new thread that we just created. + * + * @param te the thread element for the new stack + * @param sp the current stack pointer at the entry point + */ +static void +thread_launch_register(struct thread_element *te) +{ + thread_t t; + thread_qid_t qid; + unsigned idx; + const void *stack; + size_t stack_len; + bool free_old_stack = FALSE; + + qid = thread_quasi_id_fast(&t); + idx = thread_qid_hash(qid); + + /* + * Check whether stack allocation works. + * + * When it does not, we set the global ``thread_stack_noinit'' to + * prevent further attempts. + */ + + stack = te->stack; + stack_len = te->stack_size + thread_pagesize; /* Include red-zone page */ + + if (stack != NULL) { + const void *end = const_ptr_add_offset(stack, stack_len); + + if G_UNLIKELY(ptr_cmp(&t, stack) < 0 || ptr_cmp(&t, end) >= 0) { + thread_stack_noinit = TRUE; + atomic_mb(); + stack = NULL; + + /* + * We must free the allocated stack if we initialized it but it + * is not supported (ignored!) by the POSIX thread layer. + * + * This will be done later when we have setup the thread context + * properly so that vmm_free() can safely find the thread when + * running thread_small_id(). + */ + + free_old_stack = TRUE; + } + } + + /* + * Initialize stack shape. + */ + + if (NULL == stack) { + void *red; + + stack = vmm_page_start(&t); + + /* + * The stack was not allocated by thread_launch(), or the allocation + * was ignored by the system (typical of Windows). + * + * Adjust stack base if stack is decreasing. Because ``stack'' + * is the base of the page, we need to substract te->stack_size, + * to reach the base of the red-zone page. The correct base will + * be computed in thread_element_tie() by adding one page to account + * for that red-zone page when the stack grows by decreasing addresses. + * + * At the same time, we need to update te->stack_base as well, since + * the current value was determined following our allocated range, and + * it was not used. + */ + + if (thread_sp_direction < 0) { + /* Top address */ + te->stack_base = deconstify_pointer(vmm_page_next(stack)); + stack = const_ptr_add_offset(stack, -te->stack_size); + red = deconstify_pointer(stack); + } else { + /* Bottom address */ + te->stack_base = deconstify_pointer(stack); + red = ptr_add_offset_const(stack, te->stack_size); + } + + /* + * Finally, protect the red page we're adding at the "top" of the stack + * to detect stack overflows. The PROT_GUARD constant is special: + * it maps to PROT_NONE on UNIX systems, but requests the creation of + * a guard page on Windows, which is convenient since Windows lacks + * support for a signal alternate stack! + * --RAM, 2015-11-09 + */ + + if (-1 == mprotect(red, thread_pagesize, PROT_GUARD)) { + s_rawwarn("%s(): mprotect() red-zone page at %p for thread #%u: %m", + G_STRFUNC, red, te->stid); + } + } + + /* + * Immediately position tstid so that we can run thread_small_id() + * in the context of this new thread. + * + * If we need to call thread_get_element() for this thread during + * allocation, we better load the QID cache as well and immediately + * tie the thread element to its thread_t. + */ + + t = thread_self(); + + thread_set(tstidte->stid, t); + te->ptid = pthread_self(); + thread_element_tie(te, t, stack); + thread_qid_cache_set(idx, te, qid); + te->system_thread_id = compat_gettid(); + + g_assert(0 == thread_element_lock_count(te)); + g_assert(qid >= te->low_qid && qid <= te->high_qid); + + /* + * If needed, we can now free the old stack since the thread element + * is properly initialized. + */ + + if G_UNLIKELY(free_old_stack) + thread_stack_free(te); + + te->running = TRUE; /* Thread is now running on its own */ +} + +/** + * @return current thread stack pointer. + */ +void * NO_INLINE +thread_sp(void) +{ + volatile ulong sp; /* "volatile" prevents compiler optimizations */ + + /* + * Writing the address of the variable serves two purposes: + * 1. it forces a possible stack growth by the kernel if we are right + * at a page boundary, making further addressing there fully legitimate. + * 2. it helps preventing aggressive compilers from optimizing the + * routine to return NULL, thanks to the use of a volatile value. + */ + + sp = (ulong) &sp; /* Not pointer_to_ulong() since sp is "volatile" */ + + return ulong_to_pointer(sp); +} + +/** + * Thread creation trampoline. + */ +static void * +thread_launch_trampoline(void *arg) +{ + union { + struct thread_launch_context *ctx; + void *result; + void *argument; + } u; + process_fn_t routine; + + /* + * This routine is run in the context of the new thread. + * + * Start by registering the thread in our data structures and + * initializing its thread element. + */ + + u.ctx = arg; + thread_launch_register(u.ctx->te); + u.ctx->te->sig_mask = u.ctx->sig_mask; /* Inherit parent's signal mask */ + + /* + * Make sure we can correctly process SIGSEGV happening because stack + * growth reaches the red zone page, so that we can report a stack + * overflow. + * + * This works by creating an alternate signal stack for the thread and + * making sure we minimally trap the signal. + */ + + thread_sigstack_allocate(u.ctx->te); + + /* + * If thread_create() is waiting for the thread to start, then signal + * we have started. Note that this also delays the actual execution + * of the new thread until the launching thread is about to return, when + * the launching thread was context-switched after calling pthread_create() + * for instance. + */ + + if (u.ctx->flags & THREAD_F_WAIT) { + barrier_wait(u.ctx->b); + barrier_free_null(&u.ctx->b); + } + + /* + * If there was a global suspension, then also suspend this newly + * created thread unless they explicitly gave the THREAD_F_UNSUSPEND + * at creation time to bypass this. + */ + + if (0 == (u.ctx->flags & THREAD_F_UNSUSPEND)) { + atomic_int_inc(&u.ctx->te->suspend); + + if (0 != atomic_uint_get(&thread_suspend_depth)) { + thread_suspend_self(u.ctx->te); + } else { + atomic_int_dec(&u.ctx->te->suspend); + } + } + + /* + * Save away the values we need from the context before releasing it. + */ + + routine = u.ctx->routine; + u.argument = u.ctx->arg; /* Limits amount of stack variables */ + wfree(arg, sizeof *u.ctx); + + /* + * Launch the thread. + */ + + u.result = (*routine)(u.argument); + thread_exit_internal(u.result, NULL); +} + +/* + * In case PTHREAD_STACK_MIN is not defined by <pthread.h>. + */ +#ifndef PTHREAD_STACK_MIN +#define PTHREAD_STACK_MIN 0 +#endif + +/** + * Internal routine to launch new thread. + * + * If not 0, the given stack size is rounded up to the nearest multiple of the + * system page size. + * + * @param te the allocated thread element + * @param routine the main entry point for the thread + * @param arg the entry point argument + * @param flags thread creation flags + * @param stack the stack size, in bytes (0 = default system value) + * + * @return the new thread small ID, -1 on error with errno set. + */ +static int +thread_launch(struct thread_element *te, + process_fn_t routine, void *arg, uint flags, size_t stack) +{ + int error; + pthread_attr_t attr; + pthread_t t; + struct thread_launch_context *ctx; + const struct thread_element *tself; + size_t stacksize; + barrier_t *b; + + pthread_attr_init(&attr); + + if (stack != 0) { + /* Avoid compiler warning when PTHREAD_STACK_MIN == 0 */ +#if PTHREAD_STACK_MIN != 0 + stacksize = MAX(PTHREAD_STACK_MIN, stack); +#else + stacksize = stack; +#endif + stacksize = MAX(stacksize, THREAD_STACK_MIN); + } else { + stacksize = MAX(THREAD_STACK_DFLT, PTHREAD_STACK_MIN); + } + + stacksize = round_pagesize(stacksize); /* In case they supply odd values */ + + te->detached = booleanize(flags & THREAD_F_DETACH); + te->async_exit = booleanize(flags & THREAD_F_ASYNC_EXIT); + te->cancelable = !booleanize(flags & THREAD_F_NO_CANCEL); + + te->created = TRUE; /* This is a thread we created */ + te->creating = TRUE; /* Still in the process of being created */ + te->stack_size = stacksize; + te->argument = arg; + te->entry = (func_ptr_t) routine; + te->suspend = 0; /* New thread cannot be suspended already */ + + /* + * Pre-compute the entry name for thread_element_name(). + * + * If we cannot get a symbolic name, then reset it to NULL and it will + * be recomputed by thread_element_name_to_buf() until we can get a + * symbolic value. + */ + + te->entry_name = stacktrace_function_name(te->entry); + + if (is_strprefix(te->entry_name, "0x")) + te->entry_name = NULL; + + /* + * On Windows, stack allocation does not work with the current + * pthread implementation, but things may change in the future. + * + * Note that this is only a deficiency of the Windows system, which + * does not provide any interface to hand an already allocated stack. + * As the system API may evolve with time, we dynamically figure out + * that we cannot allocate the stack. + */ + + if (!thread_stack_noinit) { + thread_stack_allocate(te, stacksize); + +#ifdef HAS_PTHREAD_ATTR_SETSTACK + /* + * Modern POSIX threads include this call which knows about the + * stack growth direction. Therefore, callers need to specify + * the start of the allocated memory region and the length of that + * memory region. + */ + + error = pthread_attr_setstack(&attr, te->stack, + stacksize + thread_pagesize); +#else + /* + * Older POSIX threads: need to manually set the stack length we + * want to allocate, without including the guard page. The default + * guard size defined by POSIX is one system page size. + * + * POSIX requires that the guard page be allocated additionally, not + * stolen from the supplied stack size. However, since we're + * allocating our own stack here and protecting the red-zone page + * ourseleves, we need to include that additional page in the call + * to pthread_attr_setstacksize(). + * + * The pthread_attr_setstackaddr() must take the actual stack base, + * taking into account the direction of the stack growth (i.e. on + * systems where the stack grows down, this needs to be the first + * address above the allocated region). + */ + + pthread_attr_setstacksize(&attr, stacksize + thread_pagesize); + error = pthread_attr_setstackaddr(&attr, te->stack_base); +#endif /* HAS_PTHREAD_ATTR_SETSTACK */ + + if G_UNLIKELY(error != 0) { + if (ENOSYS == error) { + /* Routine not implemented, disable thread stack creation */ + thread_stack_noinit = TRUE; + atomic_mb(); + thread_stack_free(te); + } else { + errno = error; + s_error("%s(): cannot configure stack: %m", G_STRFUNC); + } + } + } + + if (thread_stack_noinit) { + error = pthread_attr_setstacksize(&attr, stacksize + thread_pagesize); + if (error != 0) { + static bool warned; + + if (ENOSYS == (errno = error) && !warned) { + warned = TRUE; + s_rawwarn("%s(): pthread_attr_setstacksize(): %m", G_STRFUNC); + } else { + s_error("%s(): cannot set thread stack to %'zu bytes: %m", + G_STRFUNC, stacksize + thread_pagesize); + } + } + } + + /* + * We always create joinable threads to be able to cleanup the allocated + * stack, hence we will always need to call pthread_join() at some point + * to make sure the thread is terminated before destroying its stack. + */ + + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); + + tself = thread_get_element(); + + WALLOC0(ctx); + ctx->te = te; + ctx->routine = routine; + ctx->arg = arg; + ctx->flags = flags; + + /* + * By default, the current thread signal mask is inehrited by the new + * thread. The THREAD_F_CLEARSIG creation flag supersedes that by + * clearing the signal mask, allowing all signals in the new thread. + */ + + if (flags & THREAD_F_CLEARSIG) + ctx->sig_mask = 0; + else + ctx->sig_mask = tself->sig_mask; /* Inherit signal mask */ + + xmalloc_thread_starting(te->stid); + xmalloc_thread_disable_local_pool(te->stid, + booleanize(flags & THREAD_F_NO_POOL)); + + /* + * If they used THREAD_F_WAIT, then we must wait until the thread + * has started before returning a success. Use a barrier to perform + * the required synchronization. + */ + + if (flags & THREAD_F_WAIT) { + b = barrier_new(2); + ctx->b = barrier_refcnt_inc(b); + } else { + b = NULL; + } + + error = pthread_create(&t, &attr, thread_launch_trampoline, ctx); + + pthread_attr_destroy(&attr); + + if (error != 0) { + atomic_uint_dec(&thread_running); /* Could not launch it */ + xmalloc_thread_ended(te->stid); + if (te->stack != NULL) + thread_stack_free(te); + thread_element_mark_reusable(te); + barrier_free_null(&b); + if (ctx->b != NULL) { + ctx->b = barrier_refcnt_dec(ctx->b); + g_assert(NULL == ctx->b); /* Was last reference */ + } + WFREE(ctx); + errno = error; + return -1; + } + + /* + * Wait for the thread to be physically launched and running before + * returning when THREAD_F_WAIT was used. + */ + + if (b != NULL) { + barrier_wait(b); + barrier_free_null(&b); + } + + return te->stid; +} + +/** + * Create a new thread. + * + * The new thread starts execution by invoking "routine(arg)". + * It will end by either calling thread_exit() or returning from routine(). + * + * When the thread exits, all its thread-private values are reclaimed. + * + * @param routine the main entry point for the thread + * @param arg the entry point argument + * @param flags thread creation flags + * @param stack the stack size, in bytes (0 = default system value) + * + * @return the new thread small ID, -1 on error with errno set. + */ +int +thread_create(process_fn_t routine, void *arg, uint flags, size_t stack) +{ + return thread_create_full(routine, arg, flags, stack, NULL, NULL); +} + +/** + * Create a new thread, full version with exit callback. + * + * The new thread starts execution by invoking "routine(arg)". It will + * terminate by either calling thread_exit() or returning from routine(). + * + * When the thread exits, all its thread-private values are reclaimed. + * + * The thread exit value will be passed to the "exited()" callback along + * with the supplied "earg" -- the exited() argument. That callback normally + * happens synchronously in the exiting thread, but if the THREAD_F_ASYNC_EXIT + * flag is given, it will instead happen asynchronously in the context of the + * main thread -- not necessarily the thread currently calling thread_create(). + * + * @param routine the main entry point for the thread + * @param arg the entry point argument + * @param flags thread creation flags + * @param stack the stack size, in bytes (0 = default system value) + * @param exited the callback invoked when thread exits + * @param earg the additional argument to pass to exited() + * + * @return the new thread small ID, -1 on error with errno set. + */ +int +thread_create_full(process_fn_t routine, void *arg, uint flags, size_t stack, + thread_exit_t exited, void *earg) +{ + struct thread_element *te; + int ret; + + g_assert(routine != NULL); + g_assert(size_is_non_negative(stack)); + + /* + * Ensure the main thread gets the small ID of 0: create the main element + * if we did not get a chance yet, so that the new thread we're about to + * create is not stealing that ID. + * + * This assumes that the caller is the main thread. + */ + + if G_UNLIKELY(NULL == threads0) + (void) thread_get_main_if_first(); + + /* + * Reuse or allocate a new thread element. + */ + + te = thread_find_element(); + + if (NULL == te) { + errno = EAGAIN; /* Not enough resources to create new thread */ + goto error; + } + + /* + * These will be used only when the thread is successfully created. + */ + + if (exited != NULL) { + struct thread_exit_cb *e; + + XMALLOC0(e); + e->exit_cb = exited; + e->exit_arg = earg; + + g_assert(0 == eslist_count(&te->exit_list)); + + eslist_prepend(&te->exit_list, e); + } + + ret = thread_launch(te, routine, arg, flags, stack); + + if G_LIKELY(ret >= 0) + return ret; + + /* FALL THROUGH */ + +error: + if (THREAD_F_WARN & flags) { + s_carp("%s(): cannot create thread for %s(%p): %m", + G_STRFUNC, stacktrace_function_name(routine), arg); + } else if (THREAD_F_PANIC & flags) { + s_error("%s(): cannot create thread for %s(%p): %m", + G_STRFUNC, stacktrace_function_name(routine), arg); + } + + return -1; +} + +struct thread_exit_context { + thread_exit_t cb; + void *arg; + void *value; +}; + +/** + * Invoked from the main thread to notify that a thread exited. + */ +static void +thread_exit_notify(cqueue_t *unused_cq, void *obj) +{ + struct thread_exit_context *ctx = obj; + + (void) unused_cq; + + (*ctx->cb)(ctx->value, ctx->arg); + WFREE(ctx); +} + +/** + * Asynchronously invoke thread exit callback. + */ +static bool +thread_exit_async_cb(void *data, void *value) +{ + struct thread_exit_cb *e = data; + struct thread_exit_context *ctx; + + WALLOC(ctx); + ctx->value = value; + ctx->cb = e->exit_cb; + ctx->arg = e->exit_arg; + xfree(e); + cq_main_insert(1, thread_exit_notify, ctx); + + return TRUE; +} + +/** + * Synchronously invoke thread exit callback. + */ +static bool +thread_exit_sync_cb(void *data, void *value) +{ + struct thread_exit_cb *e = data; + + (*e->exit_cb)(value, e->exit_arg); + xfree(e); + + return TRUE; +} + +/** + * Warn about remaining cleanup callback. + */ +static bool +thread_cleanup_warn(void *data, void *value) +{ + struct thread_cleanup_cb *c = data; + struct thread_element *te = value; + + thread_element_check(te); + + s_warning("%s exiting with pending cleanup callback %s(%p) " + "registered by %s() at %s:%u", + thread_element_name(te), stacktrace_function_name(c->cleanup_cb), + c->data, c->routine, c->file, c->line); + + xfree(c); + return TRUE; /* Remove it from list */ +} + +/** + * Execute cleanup callback. + */ +static bool +thread_cleanup_handle(void *data, void *value) +{ + struct thread_cleanup_cb *c = data; + const void *sp = value; + + if (thread_stack_ptr_cmp(sp, c->sp) < 0) { + s_critical("ignoring obsolete cleanup callback %s(%p) for %s, " + "registered by %s() at %s:%u: " + "registration SP=%p, exit SP=%p, current SP=%p", + stacktrace_function_name(c->cleanup_cb), c->data, thread_name(), + c->routine, c->file, c->line, c->sp, sp, &sp); + } else { + (*c->cleanup_cb)(c->data); + } + + xfree(c); + return TRUE; /* Remove it from list */ +} + +/** + * Exit from current thread. + * + * The exit value is recorded in the thread structure where it will be made + * available through thread_join() and through the optional exit callback. + * + * When the exit is explicit, all the remaining cleanup handlers that have + * been registered for the thread are run. + * + * Control does not come back to the calling thread. + * + * @param value the exit value + * @param sp stack pointer when existing (NULL if implicit) + */ +static void +thread_exit_internal(void *value, const void *sp) +{ + struct thread_element *te = thread_get_element(); + tsigset_t set; + size_t lock_count; + + g_assert(pthread_equal(te->ptid, pthread_self())); + g_assert(thread_eq(te->tid, thread_self())); + g_assert_log(!te->exit_started, + "%s() called recursively in %s", G_STRFUNC, thread_element_name(te)); + g_assert(!te->discovered); + + /* + * Mark that we are exiting to prevent recursive calls, and disable + * futher cancel requests. + */ + + te->exit_started = TRUE; /* Signals we have begun exiting the thread */ + te->cancl = THREAD_CANCEL_DISABLE; + + /* + * Thread is exiting, block all signals now. + */ + + tsig_fillset(&set); + te->sig_mask = set; + + /* + * Sanity checks. + */ + + if (thread_main_stid == te->stid) + s_error("%s() called by the main thread", G_STRFUNC); + + if (!te->created) { + s_error("%s() called by foreigner %s", + G_STRFUNC, thread_element_name(te)); + } + + /* + * When exiting explicitly, via thread_exit() or through a cancellation + * request, we run the registered cleanup callbacks, otherwise they + * are discarded with a warning (it is an error to return from the main + * entry point with pending cleanup callbacks). + * + * Running of the cleanup routine must be done before clearing all + * the thread-private and thread-local variables registered by the thread + * since the callbacks may use such values. + */ + + lock_count = thread_element_lock_count(te); /* Can be non-zero here */ + + if (NULL == sp) { + /* Implicit exit, returning from main entry point */ + eslist_foreach_remove(&te->cleanup_list, thread_cleanup_warn, te); + } else { + /* Explicit exit or cancellation */ + eslist_foreach_remove(&te->cleanup_list, thread_cleanup_handle, + deconstify_pointer(sp)); + } + + /* + * Now that all the cleanup handlers have been run, there must not + * be any lock remaining. + */ + + if (0 != thread_element_lock_count(te)) { + size_t cnt = thread_element_lock_count(te); + s_warning("%s() called by %s with %zu lock%s still held (%zu on entry)", + G_STRFUNC, thread_element_name(te), cnt, plural(cnt), lock_count); + thread_lock_dump(te); + s_error("thread exiting without clearing its locks"); + } + + /* + * Invoke any registered exit notification callback, before thread + * variables are cleared (since callbacks may use still want to use them). + */ + + eslist_foreach_remove(&te->exit_list, + te->async_exit ? thread_exit_async_cb : thread_exit_sync_cb, value); + + /* + * When a thread exits, all its thread-private and thread-local variables + * are reclaimed. + * + * The keys are constants (static strings, pointers to static objects for + * thread-private, opaque constants for thread-local) but values are + * dynamically allocated and can have a free routine attached. + */ + + thread_private_clear(te); + thread_local_clear(te); + + /* + * If there are waiters (via thread_wait() and friends) looking after + * our termination, unblock them now. + */ + + { + dam_t *d; + + THREAD_LOCK(te); + d = te->termination; + te->termination = NULL; + THREAD_UNLOCK(te); + + /* + * We use dam_disable() to make sure we're releasing all the currently + * waiting threads and at the same time make sure no other thread will + * block on that dam, even if they got a reference on it. + */ + + if (d != NULL) { + g_assert(!dam_is_disabled(d)); + dam_disable(d, te->termination_key); + dam_free_null(&d); + } + } + + /* + * The alternate signal stack, if allocated, can now be freed since we + * are no longer expecting a stack overflow. + */ + + if (te->sig_stack != NULL) { + thread_qid_t qid; + + /* + * We can run thread_exit() whilst running on the signal stack when + * a thread is catching the TSIG_OVFLOW stack overflow signal to + * attempt to cleanup and avoid a global application crash. + * + * Therefore, we need to detect whether we're currently running on + * the signal stack and not call signal_stack_free() in that case. + * When the thread exits, the signal stack memory will not be reclaimed + * but will remain in the thread element, ready to be re-used by another + * thread allocated for this small thread ID. + * --RAM, 2015-02-13 + */ + + qid = thread_quasi_id_fast(&te); + + if (qid < te->low_sig_qid || qid > te->high_sig_qid) { + /* + * We're not running on the alternate signal stack. + * + * Reset the signal stack range before freeing it so that + * thread_find_qid() can no longer return this thread should + * another thread be created with a stack lying where the old + * signal stack was. + */ + + te->low_sig_qid = (thread_qid_t) -1; + te->high_sig_qid = 0; + + signal_stack_free(&te->sig_stack); + } + } + + /* + * If the thread is not detached, record its exit status, then + * see whether we have someone waiting for it. + */ + + if (!te->detached) { + bool join_requested = FALSE; + + te->exit_value = value; + + /* + * The critical section must both set te->join_pending and then + * check whether a join has been requested. See the pending + * critical section in thread_join(). + */ + + THREAD_LOCK(te); + te->join_pending = TRUE; /* Thread is terminated */ + if (te->join_requested) + join_requested = TRUE; + THREAD_UNLOCK(te); + + if (join_requested) + thread_unblock(te->joining_id); + } else { + /* + * Since pthread_exit() can malloc, we need to let thread_small_id() + * still work for a while after the thread is gone. + */ + + thread_exiting(te); /* Thread element reusable later */ + } + + /* Finished */ + + atomic_uint_inc(&thread_pending_reuse); + atomic_uint_dec(&thread_running); + pthread_exit(value); + s_error("back from pthread_exit()"); +} + +/** + * Exit from current thread. + * + * The exit value is recorded in the thread structure where it will be made + * available through thread_join() and through the optional exit callback. + * + * Control does not come back to the calling thread. + * + * @param value the exit value + */ +void +thread_exit(void *value) +{ + thread_exit_internal(value, thread_sp()); +} + +/** + * Check whether thread has begun to exit. + * + * This may be useful to check for in low-level routines, to avoid creating + * new thread-private or thread-local values that may not end-up being + * cleared if we are past the clearing point in thread_exit_internal(). + * + * Of course, the thread-local or thread-private variables would be reclaimed + * automatically when the thread element is reused, but we do not know when + * this will occur and a large amount of (unused) memory may be kept around. + * + * @return whether current thread is on its exit path. + */ +bool +thread_is_exiting(void) +{ + struct thread_element *te = thread_get_element(); + + return te->exit_started; +} + +/** + * Cleanup routine invoked when a thread stuck in dam_wait() is cancelled. + */ +static void +thread_dam_wait_cleanup(void *arg) +{ + dam_t *d = arg; + + dam_free_null(&d); +} + +/** + * Wait until the specified thread terminates or absolute time is reached. + * + * The thread can be detached. Waiting does not allow grabbing the exit status + * of the thread: a join is required for that. + * + * If the specified thread has already terminated when this routine is called, + * no waiting occurs. + * + * @attention + * When dealing with detached threads, there is a possible race condition + * since the ID of the deceased thread could be reused by another thread. + * If the targeted thread is detached, one must be sure that no other detached + * thread can be created in the application or behaviour will be undefined. + * + * @note + * This routine is a cancellation point. + * + * @param id the ID of the thread we're waiting for + * @param end absolute time when we must stop waiting (NULL = no limit) + * @param error set to 0 if OK, the ernno code of the error otherwise + * + * @return FALSE if the wait expired, TRUE if the thread has terminated or if + * the ID does not point to a valid thread. The error parameter is filled + * with the error code if non-NULL. + */ +bool +thread_wait_until(unsigned id, const tm_t *end, int *error) +{ + struct thread_element *te; + dam_t *d = NULL, *term; + int ecode; + uint key; + bool terminated; + + /* + * It does not make sense to call thread_wait() and friends on the + * main thread because when the main thread dies, there will be nobody + * left in the process to witness it! + * + * We could relax that when there is a timeout specified, but then how + * long should we wait for nothing? It is most likely a programming + * error to call this routine with the ID of the main thread. + */ + + if (thread_main_stid == id) + s_error("%s() called on main thread", G_STRFUNC); + + /* + * Waiting for ourselves to terminate is an error as we would deadlock. + */ + + if (thread_small_id() == id) { + ecode = EDEADLK; + goto cleanup; + } + + te = thread_get_element_by_id(id); + + if (NULL == te) { + ecode = errno; /* errno set by thread_get_element_by_id() */ + goto cleanup; + } + + /* + * We create the dam before locking the thread element because we cannot + * perform any memory allocation whilst holding that (hidden) lock! + * We probe the thread element without locking to see whether we need + * to allocate a new dam. + */ + + atomic_mb(); + if (NULL == te->termination) + d = dam_new(&key); + + /* + * Check the thread element, taking locks to avoid race conditions with + * the thread_exit_internal() routine. + */ + + THREAD_LOCK(te); + + if (te->reusable) { + THREAD_UNLOCK(te); + ecode = ESRCH; + goto cleanup; + } + + if (te->exit_started) { + THREAD_UNLOCK(te); + ecode = 0; + goto cleanup; + } + + /* + * If there is no termination dam yet, install one (which we have created + * above before taking the lock). Otherwise, we'll be using the one + * present in the thread element. + */ + + if (NULL == te->termination) { + if (NULL == d) { + /* + * te->termination was not NULL before, it is now: it means the + * thread element has changed and has been re-assigned to a new + * and different thread. + */ + + THREAD_UNLOCK(te); + ecode = ESRCH; + goto cleanup; + } + term = te->termination = d; + te->termination_key = key; + d = NULL; + } else { + term = te->termination; + } + + term = dam_refcnt_inc(term); + + THREAD_UNLOCK(te); + + dam_free_null(&d); /* Thread had another one added meanwhile */ + + /* + * We can now perform the waiting on the selected dam. + * + * No race condition can happen at this stage: we have a reference on the + * dam, and it will get disabled when the thread exists, meaning we cannot + * block forever should the thread already be gone when we reach this point. + */ + + thread_cleanup_push(thread_dam_wait_cleanup, term); + terminated = dam_wait_until(term, end); + thread_cleanup_pop(TRUE); /* Frees the dam */ + + if (error != NULL) + *error = 0; /* Returning normally, no error */ + + return terminated; + +cleanup: + dam_free_null(&d); + if (error != NULL) + *error = ecode; + + return TRUE; +} + +/** + * Wait until the specified thread terminates or timeout expires. + * + * The thread can be detached. Waiting does not allow grabbing the exit status + * of the thread: a join is required for that. + * + * If the specified thread has already terminated when this routine is called, + * no waiting occurs. + * + * @attention + * When dealing with detached threads, there is a possible race condition + * since the ID of the deceased thread could be reused by another thread. + * If the targeted thread is detached, one must be sure that no other detached + * thread can be created in the application or behaviour will be undefined. + * + * @note + * This routine is a cancellation point. + * + * @param id the ID of the thread we're waiting for + * @param timeout how long to wait for (NULL means no limit) + * @param error set to 0 if OK, the ernno code of the error otherwise + * + * @return FALSE if the wait expired, TRUE if the thread has terminated or if + * the ID does not point to a valid thread. The error parameter is filled + * with the error code if non-NULL. + */ +bool +thread_timed_wait(unsigned id, const tm_t *timeout, int *error) +{ + tm_t end; + + if (timeout != NULL) { + tm_now_exact(&end); + tm_add(&end, timeout); + } + + return thread_wait_until(id, NULL == timeout ? NULL : &end, error); +} + +/** + * Wait until the specified thread terminates. + * + * The thread can be detached. Waiting does not allow grabbing the exit status + * of the thread: a join is required for that. + * + * If the specified thread has already terminated when this routine is called, + * no waiting occurs. + * + * @attention + * When dealing with detached threads, there is a possible race condition + * since the ID of the deceased thread could be reused by another thread. + * If the targeted thread is detached, one must be sure that no other detached + * thread can be created in the application or behaviour will be undefined. + * + * @note + * This routine is a cancellation point. + * + * @param id the ID of the thread we're waiting for + * + * @return 0 if OK, -1 on error with errno set.. + */ +int +thread_wait(unsigned id) +{ + int error; + + thread_wait_until(id, NULL, &error); + + if (0 != error) { + errno = error; + return -1; + } + + return 0; +} + +/** + * Register a new thread exit callback for the current thread. + * + * When delivered synchronously, callbacks are invoked in reverse registration + * order. If the thread was created with THREAD_F_ASYNC_EXIT, the invocation + * order is undefined. + * + * @param exit_cb the exit callback to invoke + * @param exit_arg additional callback argument to supply + */ +void +thread_atexit(thread_exit_t exit_cb, void *exit_arg) +{ + struct thread_element *te = thread_get_element(); + struct thread_exit_cb *e; + + /* + * These objects are created and freed by the same thread, so it pays + * to use xmalloc() instead of walloc() because we're going to allocate + * from a thread-private pool, without locks. + */ + + XMALLOC0(e); + e->exit_cb = exit_cb; + e->exit_arg = exit_arg; + + eslist_prepend(&te->exit_list, e); +} + +/** + * Register a new thread cleanup callback for the current thread. + * + * @param cleanup the cleanup callback to invoke + * @param arg the additional callback argument to supply + * @param routine routine where registration is made + * @param file file where registration is made + * @param line line where registration is made + * @param sp stack pointer of routine pushing the cleanup callback + */ +void +thread_cleanup_push_from(notify_fn_t cleanup, void *arg, + const char *routine, const char *file, unsigned line, const void *sp) +{ + struct thread_element *te = thread_get_element(); + struct thread_cleanup_cb *c, *ch; + + g_assert(cleanup != NULL); + g_assert(routine != NULL); + g_assert(file != NULL); + + /* + * These objects are created and freed by the same thread, so it pays + * to use xmalloc() instead of walloc() because we're going to allocate + * from a thread-private pool, without locks. + */ + + XMALLOC0(c); + c->cleanup_cb = cleanup; + c->data = arg; + c->routine = routine; + c->file = file; + c->line = line; + c->sp = sp; + + /* + * Make sure that we're stacking cleanup handlers without forgetting to + * remove obsolete entries. + */ + + ch = eslist_head(&te->cleanup_list); + + g_assert_log(NULL == ch || thread_stack_ptr_cmp(c->sp, ch->sp) > 0, + "%s(): previous entry from %s() at %s:%u is obsolete, " + "old SP=%p, current SP=%p", + G_STRFUNC, ch->routine, ch->file, ch->line, ch->sp, c->sp); + + eslist_prepend(&te->cleanup_list, c); +} + +/** + * Pop thread cleanup callback for the current thread and optionally run it. + * + * @param run whether to run the callback + * @param routine routine where pop is made + * @param file file where pop is made + * @param line line where pop is made + */ +void +thread_cleanup_pop_from(bool run, + const char *routine, const char *file, unsigned line) +{ + struct thread_element *te = thread_get_element(); + struct thread_cleanup_cb *c; + + g_assert(routine != NULL); + g_assert(file != NULL); + + c = eslist_shift(&te->cleanup_list); + + g_assert_log(c != NULL, + "%s attempting to remove non-existent cleanup in %s() at %s:%u", + thread_element_name(te), routine, file, line); + + g_assert_log(thread_stack_ptr_cmp(thread_sp(), c->sp) >= 0, + "%s attempting to remove obsolete cleanup in %s() at %s:%u, " + "cleanup %s(%p) registered in %s() at %s:%u", + thread_element_name(te), routine, file, line, + stacktrace_function_name(c->cleanup_cb), c->data, + c->routine, c->file, c->line); + + g_assert_log(0 == strcmp(routine, c->routine), + "%s attempting to remove out-of-scope cleanup in %s() at %s:%u, " + "cleanup %s(%p) registered in %s() at %s:%u", + thread_element_name(te), routine, file, line, + stacktrace_function_name(c->cleanup_cb), c->data, + c->routine, c->file, c->line); + + /* + * If the cleanup handler needs to run, make sure the thread cannot + * be cancelled so that the cleanup is performed atomically with respect + * to cancellation, even if it hits a cancellation point. + */ + + if (run) { + enum thread_cancel_state oldstate; + + oldstate = te->cancl; + te->cancl = THREAD_CANCEL_DISABLE; + + (*c->cleanup_cb)(c->data); + + te->cancl = oldstate; + } + + xfree(c); +} + +/** + * Check whether current thread has a cleanup handler installed in the + * named routine, at the top of the stack. + * + * @param routine name of routine that could have pushed a handler + * + * @return TRUE if there is a cleanup handler installed at the top of the + * LIFO stack for the given routine name. + */ +bool +thread_cleanup_has_from(const char *routine) +{ + struct thread_element *te = thread_get_element(); + struct thread_cleanup_cb *c; + + g_assert(routine != NULL); + + c = eslist_head(&te->cleanup_list); + + if (NULL == c) + return FALSE; + + if (thread_stack_ptr_cmp(thread_sp(), c->sp) < 0) + return FALSE; /* Obsolete handler */ + + return 0 == strcmp(routine, c->routine); +} + +/** + * Set thread cancellation state. + * + * @param state new desired cancellation state + * @param oldstate where old state is returned if not NULL + * + * @return 0 if OK, -1 on error with errno set. + */ +int +thread_cancel_set_state(enum thread_cancel_state state, + enum thread_cancel_state *oldstate) +{ + struct thread_element *te = thread_get_element(); + + if (oldstate != NULL) + *oldstate = te->cancl; + + switch (state) { + case THREAD_CANCEL_ENABLE: + if (!te->cancelable) { + s_carp("%s(): cannot enable cancel on non-cancelable %s", + G_STRFUNC, thread_element_name(te)); + errno = EPERM; /* Main thread, or other discovered thread */ + return -1; + } + /* FALL THROUGH */ + case THREAD_CANCEL_DISABLE: + te->cancl = state; + return 0; + } + + errno = EINVAL; /* Invalid state */ + return -1; +} + +/** + * @return whether current thread can be cancelled. + */ +bool +thread_is_cancelable(void) +{ + struct thread_element *te = thread_get_element(); + + return THREAD_CANCEL_ENABLE == te->cancl && te->cancelable; +} + +/** + * Cancel specified thread ID. + * + * @return 0 if OK, -1 on error with errno set. + */ +int +thread_cancel(unsigned id) +{ + struct thread_element *te; + + te = thread_get_element_by_id(id); + if (NULL == te) + return -1; /* errno set by thread_get_element_by_id() */ + + /* + * If called on a non-cancelable thread, we are facing a non-critical + * program error (the thread ID is probably incorrect). + */ + + if (!te->cancelable) { + s_carp("%s(): called on non-cancelable %s", + G_STRFUNC, thread_element_name(te)); + errno = EPERM; /* Main thread, or other discovered thread */ + return -1; + } + + THREAD_LOCK(te); + te->cancelled = TRUE; + THREAD_UNLOCK(te); + + /* + * If the targeted thread is in a state where it can be cancelled, check + * for common cases: we're cancelling ourselves or the targeted thread is + * waiting on a condition variable. + */ + + if (THREAD_CANCEL_ENABLE == te->cancl) { + bool unblock = FALSE; + cond_t cv = NULL; + + /* + * If the targeted thread is ourselves then exit immediately. + */ + + if (thread_small_id() == id) + thread_exit(THREAD_CANCELLED); + + /* + * If the thread was blocked, unblock it. + * If the thread is waiting on a condition variable, wake it up. + * + * It is then up to the user-waiting code to possibly check for + * cancellation explicitly. + */ + + THREAD_LOCK(te); + if G_UNLIKELY(te->blocked) { + unblock = TRUE; + } else if G_UNLIKELY(te->cond != NULL) { + cv = cond_refcnt_inc(te->cond); + } + THREAD_UNLOCK(te); + + if G_UNLIKELY(unblock) { + thread_element_unblock(te); + } else if G_UNLIKELY(cv != NULL) { + cond_wakeup_all(cv); + cond_refcnt_dec(cv); + } + } + + return 0; /* OK */ +} + +/** + * Check whether current thread has been cancelled. + * + * This routine does not return if the thread is cancelable and has a pending + * cancel recorded. + * + * @note + * This routine is (obviously!) a cancellation point. + * + * @return TRUE if we were suspended or handled signals. + */ +bool +thread_cancel_test(void) +{ + struct thread_element *te = thread_get_element(); + bool delayed; + + delayed = thread_check_suspended_element(te, TRUE); + thread_cancel_test_element(te); + + return delayed; +} + +/** + * Invoked when a thread issuing a thread_join() operation is cancelled. + */ +static void +thread_join_cancelled(void *arg) +{ + unsigned id = pointer_to_uint(arg); + + s_carp("thread %s cancelled whilst joining with %s", + thread_name(), thread_id_name(id)); +} + +/** + * Join with specified thread ID. + * + * If the thread has not terminated yet, this will block the calling thread + * until the targeted thread finishes its execution path, unless "nowait" + * is set to TRUE. + * + * @param id the STID of the thread we want to join with + * @param result where thread's result is stored, if non NULL + * @param nowait whether to conduct non-blocking joining + * + * @return 0 if OK and we successfully joined, -1 otherwise with errno set. + */ +static int +thread_join_internal(unsigned id, void **result, bool nowait) +{ + struct thread_element *te, *tself; + unsigned events; + + g_assert(thread_main_stid != id); /* Can't join with main thread */ + g_assert(id != thread_small_id()); /* Can't join with oneself */ + + /* + * Thread-joining is a thread cancellation point, and we honour that but + * with a caveat: if we cannot join with a non-detached thread, we will + * never reclaim its thread ID and the dead-thread stack, which is a + * problem. + * + * Therefore, we install a cleanup handler to be able to log when we are + * cancelled in the middle of a thread_join(). + */ + + thread_cleanup_push(thread_join_cancelled, uint_to_pointer(id)); + + te = thread_get_element_by_id(id); + if (NULL == te) + goto error; + + if ( + !te->created || /* Not a thread we created */ + te->join_requested || /* Another thread already wants joining */ + te->detached /* Cannot join with a detached thread */ + ) { + errno = EINVAL; + goto error; + } + + if (te->reusable) { + errno = ESRCH; /* Was already joined, is a zombie */ + goto error; + } + + tself = thread_get_element(); + + THREAD_LOCK(tself); + if (tself->join_requested && tself->joining_id == id) { + THREAD_UNLOCK(tself); + errno = EDEADLK; /* Trying to join with each other! */ + goto error; + } + THREAD_UNLOCK(tself); + + /* + * Note that the critical section below contains both a check for + * te->join_pending and the setting of te->join_requested. See the + * pending critical section in thread_exit() which does the opposite: + * it sets te->join_pending and checks te->join_requested in its + * critical section. Hence, no matter which critical section is done + * first, there will be no race condition and no permanent blocking. + */ + + THREAD_LOCK(te); +retry: + events = tself->unblock_events; /* a.k.a. thread_block_prepare() */ + if (te->join_pending) + goto joinable; + + /* + * Thread is still running. + */ + + if (nowait) { + THREAD_UNLOCK(te); + errno = EAGAIN; /* Thread still running, call later */ + goto error; + } + + /* + * We're going to block, waiting for the thread to exit. + * + * Our thread ID is recorded so that the exiting thread can unblock + * us when it completes its processing. + */ + + te->joining_id = tself->stid; + te->join_requested = TRUE; + THREAD_UNLOCK(te); + + /* + * The "events" variable prevents any race condition here between the + * time we set te->join_requested, unlock and attempt to block: there is + * room for the thread to actually terminate during this small period of + * time and post us an unblock event, which we would then lose since + * we're not blocked yet. + */ + + thread_block_self(events); /* Wait for thread termination */ + + /* + * This could be a spurious wakeup if the waiting thread is cancelled + * for instance, or receives a signal. + */ + + THREAD_LOCK(te); + if (!te->join_pending) { + goto retry; + } + + g_assert(tself->stid == te->joining_id); + + /* FALL THROUGH */ + +joinable: + THREAD_UNLOCK(te); + + if (result != NULL) + *result = te->exit_value; + + thread_cleanup_pop(FALSE); + + /* + * We can now join with the thread at the POSIX layer: we know it has + * terminated hence we cannot block. + */ + + thread_pjoin(te); + thread_exiting(te); + return 0; /* OK, successfuly joined */ + +error: + thread_cleanup_pop(FALSE); + return -1; +} + +/** + * A blocking join with the specified thread ID. + * + * @note + * This routine is a cancellation point. + * + * @param id the STID of the thread we want to join with + * @param result where thread's result is stored, if non NULL + * + * @return 0 if OK and we successfully joined, -1 otherwise with errno set. + */ +int +thread_join(unsigned id, void **result) +{ + return thread_join_internal(id, result, FALSE); +} + +/** + * A non-blocking join with the specified thread ID. + * + * When the thread cannot be joined yet (it is still running), errno is + * set to EAGAIN. + * + * @note + * This routine is a cancellation point. + * + * @param id the STID of the thread we want to join with + * @param result where thread's result is stored, if non NULL + * + * @return 0 if OK and we successfully joined, -1 otherwise with errno set. + */ +int +thread_join_try(unsigned id, void **result) +{ + return thread_join_internal(id, result, TRUE); +} + +/** + * Install thread-specific signal handler for our signals. + * + * If the handler is TSIG_IGN, then the signal will be ignored. + * If the handler is TSIG_DFL, then the default behaviour is used. + * + * Currently, no signal has any architected meaning, so TSIG_DFL will simply + * cause the signal to be ignored. + * + * Signals are not delivered immediately but only when the thread is calling + * thread_check_suspended(), is taking/releasing locks, is blocked -- either + * in thread_pause() or other routines that call thread_block_self(). + * + * @param signum one of the TSIG_xxx signals + * @param handler new signal handler to install + * + * @return previous signal handler, or TSIG_ERR with errno set. + */ +tsighandler_t +thread_signal(int signum, tsighandler_t handler) +{ + struct thread_element *te = thread_get_element(); + tsighandler_t old; + + if G_UNLIKELY(signum <= 0 || signum >= TSIG_COUNT) { + errno = EINVAL; + return TSIG_ERR; + } + + /* + * The TSIG_DIVERT signal disposition cannot be changed. + */ + + if G_UNLIKELY(TSIG_DIVERT == signum) { + errno = EPERM; + return TSIG_ERR; + } + + /* + * Signal 0 is not a real signal and is not present in sigh. + */ + + old = te->sighsignum - 1; + te->sighsignum - 1 = handler; + + thread_signal_check(te); + + return old; +} + +/** + * Atomically record signal as pending in the thread element. + * + * @note + * This routine does not require the thread element to be locked. + * + * @param te the thread element + * @param signum the signal to record as pending + */ +static void +thread_element_add_pending_sig(struct thread_element *te, int signum) +{ + STATIC_ASSERT(sizeof(tsigset_t) == sizeof(uint)); + + /* + * Because signal delivery is a rare event, we are going to attempt + * to atomically merge the signal into the sig_pending field. This + * is necessarily going to succeed very quickly. + */ + + for (;;) { + tsigset_t pending, merged; + + atomic_mb(); + merged = pending = te->sig_pending; + merged |= tsig_mask(signum); + + if (atomic_uint_xchg_if_eq(&te->sig_pending, pending, merged)) + break; + } +} + +/** + * Deliver signal to specified thread. + * + * @param te targeted thread to signal + * @param signo signal to send + * @param stid calling thread ID + * @param safe whether we are running in an interrupt handler + */ +static void +thread_element_signal_deliver(struct thread_element *te, int signum, + uint stid, bool safe) +{ + bool unblock = FALSE, process; + cond_t cv = NULL; + + g_assert(TSIG_0 != signum); + + thread_element_add_pending_sig(te, signum); + process = thread_sig_present(te); /* Unblocked signals present? */ + + if (!process) + return; /* Signal blocked or already handled concurrently */ + + /* + * This routine can be called within an interrupt handler (kernel signal + * handler as opposed to our internal thread signals) and it is possible + * that we were interrupted whilst being the holder of the lock on the + * thread element. + * + * Since this is a spinlock, it is difficult to know for sure who holds + * it currently, so we loop for a while trying to get it and if we cannot + * lock the thread element, we'll use another strategy. + */ + + if G_UNLIKELY(safe) { + size_t i; + bool locked = FALSE; + + for (i = 0; i < 10000; i++) { + if (THREAD_TRY_LOCK(te)) { + locked = TRUE; + break; + } + } + + if (!locked) + goto alternate; + } else { + THREAD_LOCK(te); + } + + /* + * We got the lock on the thread element. + */ + + process = thread_sig_present(te); /* Unblocked signals present? */ + + /* + * If posting a signal to the current thread, handle pending signals. + */ + + if G_UNLIKELY(stid == te->stid) { + THREAD_UNLOCK(te); + if (process && 0 == thread_element_lock_count(te)) { + THREAD_STATS_INCX(sig_handled_while_check); + thread_sig_handle(te); + } + return; + } + + /* + * If the thread is blocked and has pending signals, then unblock it. + * If the thread is waiting on a condition variable, wake it up. + */ + + if G_UNLIKELY(te->blocked && process) { + /* + * Only send one "signal pending" unblocking byte. + */ + + if (0 == te->signalled) { + /* About to send an unblocking byte */ + atomic_uint_inc(&te->signalled); + unblock = TRUE; + } + } else if G_UNLIKELY(te->cond != NULL && process) { + /* + * Avoid any race condition: whilst we hold the thread lock, nobody + * can change the te->cond value, but as soon as we release it, + * the thread could be awoken concurrently and reset the te->cond + * field, then possibly destroy the condition variable. + * + * By taking a reference, we get the underlying condition variable + * value and ensure nobody can free up that object. + */ + + cv = cond_refcnt_inc(te->cond); + } + THREAD_UNLOCK(te); + + THREAD_STATS_INCX(signals_posted); + + /* + * The unblocking byte is sent outside the critical section, but + * we already incremented the te->signalled field. Therefore, regardless + * of whether somebody already unblocked the thread since we checked, + * the unblocked thread will go back to sleep, until we resend an + * unblocking byte, and no event will be lost. + * + * See the critical section in thread_block_self() after calling read(). + * + * For condition variables, we systematically wakeup all parties + * waiting on the variable, even if the thread to which the signal + * is targeted is not yet blocked on the condition variable (since + * there is a time window between the registration of the waiting + * and the actual blocking on the condition variable). + */ + + if G_UNLIKELY(unblock) { + char c = '\0'; + if (-1 == s_write(te->wfd1, &c, 1)) { + atomic_uint_dec(&te->signalled); + s_minicarp("%s(): " + "cannot unblock %s via write(%u) to send signal #%d: %m", + G_STRFUNC, thread_element_name(te), te->wfd1, signum); + } + } else if G_UNLIKELY(cv != NULL) { + cond_wakeup_all(cv); + cond_refcnt_dec(cv); + } + + return; + +alternate: + + g_assert(stid != te->stid); /* Necessarily in a foreign thread */ + + /* + * We did not get the lock on the thread element, hence we need an + * alternate, more complex but still thread-safe strategy. + * + * We re-check for unblocked signals since we spent some time waiting + * for the lock, and the signal could have been already handled by + * the other thread. + */ + + atomic_mb(); + process = thread_sig_present(te); /* Unblocked signals present? */ + + if (!process) + return; /* Signal blocked or already handled concurrently */ + + if G_UNLIKELY(te->blocked) { + char c = '\0'; + atomic_uint_inc(&te->signalled); + if (-1 == s_write(te->wfd1, &c, 1)) { + atomic_uint_dec(&te->signalled); + s_rawwarn("%s(): " + "cannot unblock %s via write(%u) to send signal #%d: %m", + G_STRFUNC, thread_element_name(te), te->wfd1, signum); + } + } else if (NULL != (cv = cond_refcnt_inc(te->cond))) { + cond_wakeup_all(cv); + cond_refcnt_dec(cv); + } +} + +/** + * Send signal to specified thread. + * + * The signal will be processed when the target thread does not hold any lock, + * hence the signal handler cannot deadlock. + * + * @param id the small thread ID of the target (can be self) + * @param signum the signal to send + * + * @return 0 if OK, -1 with errno set otherwise. + */ +int +thread_kill(unsigned id, int signum) +{ + struct thread_element *te; + + if G_UNLIKELY(signum < 0 || signum >= TSIG_COUNT) { + errno = EINVAL; + return -1; + } + + te = thread_get_element_by_id(id); + if (NULL == te) + return -1; /* errno set by thread_get_element_by_id() */ + + /* + * Deliver signal if needed. + */ + + if G_LIKELY(TSIG_0 != signum) + thread_element_signal_deliver(te, signum, thread_small_id(), FALSE); + + return 0; +} + +/** + * Manipulate the current thread's signal mask. + * + * There are four operations defined, as specified by ``how'': + * + * TSIG_GETMASK returns current mask in ``os'', ``s'' is ignored. + * TSIG_SETMASK sets mask to ``s'' + * TSIG_BLOCK block signals specified in ``s'' + * TSIG_UNBLOCK unblock signals specified in ``s'' + * + * @param how the operation to perform + * @param s the set operand + * @param os if non-NULL, always positionned with the previous mask + */ +void +thread_sigmask(enum thread_sighow how, const tsigset_t *s, tsigset_t *os) +{ + struct thread_element *te = thread_get_element(); + + if (os != NULL) + *os = te->sig_mask; + + switch (how) { + case TSIG_GETMASK: + goto done; + case TSIG_SETMASK: + g_assert(s != NULL); + te->sig_mask = *s; + goto done; + case TSIG_BLOCK: + g_assert(s != NULL); + te->sig_mask |= *s & (tsig_mask(TSIG_COUNT) - 1); + goto done; + case TSIG_UNBLOCK: + g_assert(s != NULL); + te->sig_mask &= ~(*s & (tsig_mask(TSIG_COUNT) - 1)); + goto done; + } + + g_assert_not_reached(); + +done: + thread_signal_check(te); +} + +/** + * Block thread until a signal is received or until we are explicitly unblocked. + * + * @note + * This routine is a cancellation point. + * + * @param te the current thread element + * @param mask the signal mask to set before blocking + * @param eve for main thread, the event installed if it cannot block + * + * @return TRUE if we were unblocked by a signal. + */ +static bool +thread_sigblock_element(struct thread_element *te, + tsigset_t mask, evq_event_t *eve) +{ + bool signalled, has_signals; + char c; + int r; + + g_assert(!te->blocked); + + /* + * This is mostly the same logic as thread_block_self() although we + * do not care about the unblock event count. + * + * Additionnaly, we check for signals in the critical section, to avoid + * blocking if there are already signals to process. + */ + + thread_block_init(te); + te->sig_mask = mask; + + THREAD_LOCK(te); + has_signals = thread_sig_present(te); + if (!has_signals) { + te->blocked = TRUE; + te->unblocked = FALSE; + } + THREAD_UNLOCK(te); + + THREAD_STATS_INCX(thread_self_pauses); + + /* + * Wait for an unblocking byte, unless we were already signalled but could + * not process the pending signal due to it being masked by the thread. + */ + + if (has_signals) { + signalled = TRUE; + THREAD_STATS_INCX(thread_self_pause_races); + goto process_signals; + } + + thread_cancel_test_element(te); + thread_element_in_syscall_set(te, TRUE); + + r = s_read(te->wfd0, &c, 1); + + thread_element_in_syscall_set(te, FALSE); + + if (-1 == r) { + s_error("%s(): %s could not block itself on read(%u): %m", + G_STRFUNC, thread_element_name(te), te->wfd0); + } + + thread_cancel_test_element(te); + + /* + * Check whether we've been signalled. + * + * When a blocked thread is receiving a signal, the signal dispatching + * code sets te->signalled before unblocking us. + */ + + THREAD_LOCK(te); + if G_UNLIKELY(te->signalled != 0) { + atomic_uint_dec(&te->signalled); /* Consumed one signaling byte */ + signalled = TRUE; + } else { + signalled = FALSE; + } + + te->blocked = FALSE; + te->unblocked = FALSE; + THREAD_UNLOCK(te); + +process_signals: + + /* + * If the main thread was blocking, it is resuming processing now. + */ + + if G_UNLIKELY(eve != NULL) + evq_cancel(&eve); + + if (signalled) { + thread_cancel_test_element(te); + THREAD_STATS_INCX(sig_handled_while_paused); + thread_sig_handle(te); + } + + /* + * Before returning to user code, check for cancelling & suspension request. + */ + + thread_check_suspended_element(te, TRUE); + thread_cancel_test_element(te); + + return signalled; +} + +/** + * Block thread until a signal is received or until we are explicitly unblocked. + * + * @note + * This routine is a cancellation point. + * + * @param mask the signal mask to set before blocking + * + * @return TRUE if we were unblocked by a signal. + */ +static bool +thread_sigblock(tsigset_t mask) +{ + struct thread_element *te = thread_get_element(); + evq_event_t *eve = NULL; + + g_assert(!te->blocked); + g_assert_log(0 == thread_element_lock_count(te), + "%s(): %s has %zu lock%s", + G_STRFUNC, thread_element_name(te), + thread_element_lock_count(te), plural(thread_element_lock_count(te))); + + /* + * Make sure the main thread never attempts to block itself if it + * has not explicitly told us it can block. + * + * Actually, we use the same logic as in thread_block_self() and allow + * it to block for a limited amount of time. + */ + + if (thread_main_stid == te->stid && !thread_main_can_block) + eve = evq_insert(THREAD_MAIN_DELAY_MS, thread_block_timeout, G_STRFUNC); + + return thread_sigblock_element(te, mask, eve); +} + +/** + * Block thread until a signal is received or until we are explicitly unblocked. + * + * @note + * This routine is a cancellation point. + * + * @return TRUE if we were unblocked by a signal. + */ +bool +thread_pause(void) +{ + tsigset_t set; + + thread_assert_no_locks(G_STRFUNC); + + thread_sigmask(TSIG_GETMASK, NULL, &set); + return thread_sigblock(set); +} + +/** + * Halt current thread. + * + * This is meant to be used during crashes, when we do not wish another + * thread from concurrently executing before we are able to suspend all + * the threads. + * + * There is no coming back from this routine, but the halted thread will be + * able to execute diversions if needed. + */ +void +thread_halt(void) +{ + struct thread_element *te = thread_get_element(); + tsigset_t set = te->sig_mask; + + tsig_delset(&set, TSIG_DIVERT); /* Must process diversions */ + + if (thread_is_main()) + thread_main_can_block = TRUE; /* Obviously! */ + + for (;;) { + thread_sigblock_element(te, set, NULL); + } + + g_assert_not_reached(); +} + +/** + * Restore signal mask and then block thread until a signal is received or + * until the thread is explicitly unblocked. + * + * The signal mask is atomically restored before blocking, to prevent any + * race condition with the signal already being pending but blocked under + * the current thread signal mask. + * + * This is usually used in conjunction with thread_sigmask(TSIG_BLOCK) to + * close a critical section opened when a set of signals were masked. + * + * @note + * This routine is a cancellation point. + * + * @param mask signal mask to restore before blocking thread. + * + * @return TRUE if we were unblocked by a signal. + */ +bool +thread_sigsuspend(const tsigset_t *mask) +{ + g_assert(mask != NULL); + thread_assert_no_locks(G_STRFUNC); + + return thread_sigblock(*mask); +} + +/** + * Record whether current thread is sleeping, for correct status report + * through thread_get_info(). + */ +void +thread_sleeping(bool sleeping) +{ + struct thread_element *te = thread_get_element(); + + THREAD_LOCK(te); + /* Boolean field, must be atomically updated */ + te->sleeping = booleanize(sleeping); + THREAD_UNLOCK(te); + + /* + * A sleeping thread is going to call select(), usleep(), nanosleep(), + * and is therefore in a system call, in a safe place should a signal + * interrupt it. + */ + + thread_element_in_syscall_set(te, sleeping); +} + +/** + * Suspend thread execution for a specified amount of milliseconds. + * + * During the suspension, the thread is able to process signals that would + * be directed to it and for which a handler has been configured. Any signal + * received will interrupt the sleep unless ``interrupt'' is FALSE. + * + * If a non-NULL signal mask is supplied, it is atomically restored after + * checking for pending (blocked) signals. + * + * @note + * This routine is a cancellation point. + * + * @param ms amount of milliseconds to sleep + * @param mask if non-NULL, signal mask to restore + * @param interrupt whether a signal will interrupt sleep + * + * @return TRUE if a signal interrupted the sleep. + */ +static bool +thread_sleep_interruptible(unsigned int ms, + const tsigset_t *mask, bool interrupt) +{ + struct thread_element *te = thread_get_element(); + tm_t start, end, tmout; + unsigned generation = te->sig_generation; + + /* + * The initial tm_now_exact() call is done to allow for pending signal + * handling from within tm_now_exact(), given that we do not hold any + * lock presently. + */ + + tm_now_exact(&start); /* Will also check for suspension */ + + /* + * If we have to restore the signal mask, grab a lock and then + * check whether we have pending signals to process. If we do, unlock + * the mutex which will dispatch the signals, and then return if we + * are interruptible. + */ + + if (mask != NULL) { + static spinlock_t sleep_slk = SPINLOCK_INIT; + bool has_signals; + + spinlock(&sleep_slk); + + g_assert(1 == te->locks.count); /* The lock we got above */ + + te->sig_mask = *mask; + THREAD_LOCK(te); + has_signals = thread_sig_present(te); + THREAD_UNLOCK(te); + + spinunlock(&sleep_slk); /* Will dispatch signals */ + + if (has_signals && interrupt) + return TRUE; + } else { + /* + * No signal mask provided but before blocking, regardless of whether + * we are interruptible, handle pending signals which are already + * present. + */ + + if (thread_signal_check(te) && interrupt) + return TRUE; + } + + if (interrupt) + te->sleep_interruptible++; + + tm_fill_ms(&tmout, ms); + end = start; + tm_add(&end, &tmout); + + thread_element_block_until(te, te->unblock_events, &end); + + if (interrupt) { + g_assert(te->sleep_interruptible > 0); + te->sleep_interruptible--; + } + + return generation != te->sig_generation; /* Did we get a signal? */ +} + +/** + * Suspend thread execution for a specified amount of milliseconds. + * + * This is also a thread signal handling point and therefore it should be + * used instead of compat_sleep_ms() when a thread wishes to suspend its + * execution for some time and yet be able to receive signals as well. + * + * A thread suspending its execution voluntarily must not be holding any + * locks, as this is a high-level sleep routine: the calling thread must + * really be done with its processing and simply wishes to be unscheduled + * for some time. + * + * During the suspension, the thread is able to process signals that would + * be directed to it and for which a handler has been configured. + * + * @note + * This routine is a cancellation point. + * + * @param ms amount of milliseconds to sleep + */ +void +thread_sleep_ms(unsigned int ms) +{ + thread_assert_no_locks(G_STRFUNC); + + thread_sleep_interruptible(ms, NULL, FALSE); +} + +/** + * Restore signal mask and then block thread until a signal is received or + * until the specified timeout expires. + * + * The signal mask is atomically restored before blocking, to prevent any + * race condition with the signal already being pending but blocked under + * the current thread signal mask. + * + * This is usually used in conjunction with thread_sigmask(TSIG_BLOCK) to + * close a critical section opened when a set of signals were masked. + * + * @note + * This routine is a cancellation point. + * + * @param mask signal mask to restore before blocking thread. + * @param timeout how long to wait for (NULL means no limit) + * + * @return TRUE if we were unblocked by a signal. + */ +bool +thread_timed_sigsuspend(const tsigset_t *mask, const tm_t *timeout) +{ + g_assert(mask != NULL); + thread_assert_no_locks(G_STRFUNC); + + /* + * If the timeout is NULL, act as if thread_sigsuspend() had been called. + */ + + if G_UNLIKELY(NULL == timeout) + return thread_sigblock(*mask); + + return thread_sleep_interruptible(tm2ms(timeout), mask, TRUE); +} + +/** + * Block all signals, for entering a critical section. + * + * @param set the old set, to be passed to thread_leave_critical(). + */ +void +thread_enter_critical(thread_sigsets_t *set) +{ + struct thread_element *te = thread_get_element(); + tsigset_t all; + + tsig_fillset(&all); + + /* inlined version of thread_sigmask(TSIG_SETMASK) */ + set->tset = te->sig_mask; + te->sig_mask = all; + + signal_thread_enter_critical(te->stid, &set->kset); +} + +/** + * Restore original signal mask at the start of the critical section. + * + * @param set the set to restore, as captured by thread_enter_critical() + */ +void +thread_leave_critical(const thread_sigsets_t *set) +{ + struct thread_element *te = thread_get_element(); + + /* inlined version of thread_sigmask(TSIG_SETMASK) */ + te->sig_mask = set->tset; + + signal_thread_leave_critical(te->stid, &set->kset); + thread_signal_check(te); +} + +/** + * Send an operating system signal (delivered by the kernel) to a thread. + * + * This will act as an interrupt for the thread, as opposed to internal signals + * sent by thread_kill() which are only delivered outside of critical sections, + * as defined by registered locks. + * + * Note that the signal handler attached to the processing of the signal is + * defined at the process-level, not the thread-level. + * + * Use with caution, if at all. + * + * @param id the thread ID we wish to signal + * @param signo the OS signal to send to the thread + * + * @return 0 if OK, -1 on error with errno set. + */ +int +thread_os_kill(uint id, int signo) +{ + struct thread_element *te; + + if G_UNLIKELY(signo < 0 || signo >= SIGNAL_COUNT) { + errno = EINVAL; + return -1; + } + + te = thread_get_element_by_id(id); + if (NULL == te) + return -1; /* errno set by thread_get_element_by_id() */ + +#ifdef MINGW32 + return mingw_thread_kill(id, te->system_thread_id, signo); +#else /* !MINGW32 */ + { + int err; + + err = pthread_kill(te->ptid, signo); + if (0 != err) { + errno = err; + return -1; + } + + return 0; + } +#endif /* MINGW32 */ +} + +/** + * This is the main process-wide signal handler for thread interrupts. + */ +static void +thread_interrupt_handle(int signo) +{ + struct thread_element *te, *cte; + struct thread_interrupt_cb *ti; + + g_assert(THREAD_SIGINTR == signo); + + /* + * We do not call thread_get_element() because we do not want to create + * a new thread if none exists and we do not want to take any locks + * nor allocate any memory. + */ + + te = thread_find(&te); + + if G_UNLIKELY(NULL == te) { + s_rawwarn("%s(): no thread to handle %s", + G_STRFUNC, signal_name(signo)); + return; + } + + /* + * Detach the interrupt requests in FIFO order. + * + * The lock is necessary because this structure is filled by remote + * threads. We cannot just use the thread element lock because this + * thread can be interrupted anywhere and it could already have the + * lock. Hence we need a mutex, which guarantees that the same thread + * will be able to at least recursively grab the same lock. + * + * We rely on the fact that no further interrupt can occur since we are + * in the middle of handling one -- the kernel must block the signal that + * got us here until we return from the signal handler. + * + * Fear no deadlock here as the eslist_xxx() routines take no lock and + * they cannot be interrupted whilst running since we are already within + * an interrupt. + */ + + for (;;) { + mutex_lock_fast(&te->interrupt_lock); + ti = eslist_shift(&te->interrupt_list); + mutex_unlock_fast(&te->interrupt_lock); + + if G_UNLIKELY(NULL == ti) + return; + + /* + * Proceed with the requested interruption -- invoke the registered + * routine in the context of the interrupted thread. + */ + + thread_interrupt_cb_check(ti); + g_assert(ti->stid != te->stid); /* Interrupting thread is foreign */ + + ti->result = (*ti->intr)(ti->arg); + + /* + * Now that the interrupt is completed and we have a result, let the + * interrupting thread clean this up and optionally invoke a completion + * callback. + * + * We call back the interrupting thread by sending it a TSIG_INTACK + * signal. This is our own inter-thread signal, and it will be + * processed by the thread when it is safe to do so. + * + * Before sending the signal back, we link the result into the calling + * thread interrupt-ack list. If that thread is dead already, loudly + * warn as this will result in a memory leak. + */ + + g_assert(ti->stid < THREAD_MAX); + + cte = threadsti->stid; /* Calling thread, which interrupted us */ + + /* + * We rely on the fact that no further interrupt can occur since we are + * in the middle of handling one -- the kernel must block the signal + * that got us here until we return from the signal handler. + * + * Therefore, we cannot be interrupted whilst holding the mutex of the + * foreign thread, which means we cannot create any deadlock. + */ + + mutex_lock_fast(&cte->interrupt_ack_lock); + eslist_append(&cte->interrupt_ack_list, ti); + mutex_unlock_fast(&cte->interrupt_ack_lock); + + /* + * We do not use thread_kill() here to send the signal because we are + * within an interrupt and we need to inform the delivery layer that + * the targeted thread element could be already locked (by ourselves + * unfortunately). + */ + + thread_element_signal_deliver(cte, TSIG_INTACK, te->stid, TRUE); + } +} + +/** + * Signal handler for TSIG_INTACK. + */ +static void +thread_interrupt_ack_handle(int signo) +{ + struct thread_element *te = thread_get_element(); + struct thread_interrupt_cb *ti; + + g_assert(TSIG_INTACK == signo); + + mutex_lock(&te->interrupt_ack_lock); + ti = eslist_shift(&te->interrupt_ack_list); + mutex_unlock(&te->interrupt_ack_lock); + + if G_UNLIKELY(NULL == ti) { + s_rawwarn("%s(): spurious signal in %s", + G_STRFUNC, thread_element_name(te)); + return; + } + + thread_interrupt_cb_check(ti); + g_assert(ti->stid == te->stid); /* We were the interrupting thread */ + + /* + * If there is a completion callback, invoke it with the result of + * the interrupt processing. + */ + + if (NULL != ti->completed) + (*ti->completed)(ti->result, ti->udata); + + thread_interrupt_cb_free(ti); + + /* + * If we collected stacktraces during warnings when running the interrupt, + * make sure these stacks are flushed back to the main atom table. + */ + + stacktrace_atom_circular_flush(); +} + +/** + * Request a thread interrupt. + * + * The targeted thread will immediately handle the requested processing. + * + * If a result is expected, there must be a completion callback specified which + * will be invoked in this thread (the one requesting the interrupt, not the + * one being interrupted, unless they are identical). + * + * The completion callback is invoked with two arguments: the first is the + * result of the interrupt routine, the second is the user-supplied "udata" + * argument. + * + * @param id the thread we want to interrupt + * @param cb the interrupt routine called by the thread + * @param arg the argument to pass to the interrupt routine + * @param completed (optional) completion callback to invoke + * @param udata (optional) additional argument passed on completion + * + * @return 0 if OK, an error code otherwise. + */ +int +thread_interrupt(uint id, process_fn_t cb, void *arg, + notify_data_fn_t completed, void *udata) +{ + struct thread_element *te; + struct thread_interrupt_cb *ti; + + if (id >= THREAD_MAX) + return EINVAL; + + te = threadsid; + if (NULL == te || !te->valid) + return ESRCH; + + /* + * This data structure represents the interrupt and can hold the result + * of the processing. + * + * It is going to be enqueued to the targeted thread, and then we'll notify + * the thread via a kernel signal. Upon reception of the kernel signal, + * processing will begin and the structure will be dequeued, then requeued + * in our acknowledgment queue for us to propagate completion notification, + * if any, and reclaim of the structure. + * + * Therefore, no memory allocation is done by the interrupted thread. + */ + + WALLOC0(ti); + ti->magic = THREAD_INTR_MAGIC; + ti->stid = thread_small_id(); + ti->intr = cb; + ti->arg = arg; + ti->completed = completed; + ti->udata = udata; + + /* + * To enqueue in the targeted thread, we need to lock the structure. + * We do not lock the thread element, and therefore risk a reset of + * the thread whilst we enqueue the item. + * + * That's OK though, because thread_element_reset() will carefully + * cleanup the data structure when the thread is re-created. + */ + + mutex_lock(&te->interrupt_lock); + eslist_append(&te->interrupt_list, ti); + mutex_unlock(&te->interrupt_lock); + + if (-1 == thread_os_kill(id, THREAD_SIGINTR)) { + int error = errno; + s_minicarp("%s(): cannot signal %s with %s (chosen THREAD_SIGINTR): %m", + G_STRFUNC, thread_element_name(te), signal_name(THREAD_SIGINTR)); + return error; + } + + return 0; +} + +/** + * Copy information from the internal thread_element to the public thread_info. + */ +static void +thread_info_copy(thread_info_t *info, struct thread_element *te) +{ + g_assert(info != NULL); + g_assert(te != NULL); + + thread_set(info->tid, te->tid); + info->system_thread_id = te->system_thread_id; + info->last_qid = te->last_qid; + info->low_qid = te->low_qid; + info->high_qid = te->high_qid; + info->top_qid = te->top_qid; + info->stid = te->stid; + info->join_id = te->join_requested ? te->joining_id : THREAD_INVALID_ID; + info->name = te->name; + info->last_sp = te->last_sp; + info->bottom_sp = te->stack_base != NULL ? + te->stack_base : thread_sp_direction > 0 ? + ulong_to_pointer(te->low_qid << thread_pageshift) : + ulong_to_pointer((te->high_qid + 1) << thread_pageshift); + info->top_sp = te->top_sp; + info->stack_base = te->stack_base; + info->stack_size = te->stack_size; + info->locks = thread_element_lock_count(te); + info->private_vars = NULL == te->pht ? 0 : hash_table_size(te->pht); + info->local_vars = thread_local_count(te); + info->entry = te->entry; + info->exit_value = te->join_pending ? te->exit_value : NULL; + info->discovered = te->discovered; + info->last_seen = te->discovered ? te->last_seen : 0; + info->exited = te->join_pending || te->reusable || te->exiting; + info->exiting = te->exit_started; + info->suspended = te->suspended; + info->blocked = te->blocked || te->cond != NULL; + info->sleeping = te->sleeping || te->in_syscall; + info->cancelled = te->cancelled; + info->main_thread = te->main_thread; + info->sig_mask = te->sig_mask; + info->sig_pending = te->sig_pending; + info->stack_addr_growing = booleanize(thread_sp_direction > 0); +} + +/** + * Get information about the current thread. + * + * @param info where information is returned if non-NULL + */ +void +thread_current_info(thread_info_t *info) +{ + struct thread_element *te = thread_get_element(); + + if (info != NULL) + thread_info_copy(info, te); +} + +/** + * Get information about specified thread. + * + * @param stid the STID of the thread we want information about + * @param info where information is returned if non-NULL + * + * @return 0 if OK, -1 otherwise with errno set. + */ +int +thread_get_info(unsigned stid, thread_info_t *info) +{ + struct thread_element *te; + + if (stid >= THREAD_MAX) { + errno = EINVAL; + return -1; + } + + te = threadsstid; + + if (NULL == te || !te->valid || te->reusable) { + errno = ESRCH; + return -1; + } + + if (info != NULL) { + THREAD_LOCK(te); + thread_info_copy(info, te); + THREAD_UNLOCK(te); + } + + return 0; +} + +/** + * Pretty-printing of thread information into supplied buffer. + * + * @param info the thread information to format + * @param buf buffer where printing is done + * @param len size of buffer + * + * @return pointer to the start of the generated string + */ +const char * +thread_info_to_string_buf(const thread_info_t *info, char buf, size_t len) +{ + if G_UNLIKELY(NULL == info) { + str_bprintf(buf, len, "<null thread info>"); + } else { + char entry128; + if (info->main_thread) { + str_bprintf(entry, sizeof entry, " main()"); + } else if (info->entry != NULL) { + str_bprintf(entry, sizeof entry, " %s()", + stacktrace_function_name(info->entry)); + } else { + entry0 = '\0'; + } + str_bprintf(buf, len, "<%s%s%s%s%s thread #%u \"%s\"%s " + "QID=%zu %zu, %zu, TID=%lu, lock=%zu>", + info->exited ? "exited " : "", + info->cancelled ? "cancelled " : "", + info->suspended ? "suspended " : "", + info->blocked ? "blocked " : "", + info->discovered ? "discovered" : "created", + info->stid, + NULL == info->name ? "" : info->name, entry, + info->last_qid, info->low_qid, info->high_qid, + (unsigned long) info->tid, info->locks); + } + + return buf; +} + +/** + * Generate a SHA1 digest of the current thread statistics. + * + * This is meant for dynamic entropy collection. + */ +void +thread_stats_digest(sha1_t *digest) +{ + struct thread_stats t; + + THREAD_STATS_INCX(thread_stats_digest); + + atomic_mb(); + t = thread_stats; /* Struct copy */ + + SHA1_COMPUTE(t, digest); +} + +/** + * Dump thread statistics to stderr. + */ +void G_COLD +thread_dump_stats(void) +{ + s_info("THREAD running statistics:"); + thread_dump_stats_log(log_agent_stderr_get(), 0); +} + +/** + * Dump thread statistics to specified logging agent. + */ +void G_COLD +thread_dump_stats_log(logagent_t *la, unsigned options) +{ + struct thread_stats t; + bool groupped = booleanize(options & DUMP_OPT_PRETTY); + + atomic_mb(); + t = thread_stats; /* Struct copy */ + +#define DUMP(x) log_info(la, "THREAD %s = %s", #x, \ + uint_to_string_grp(t.x, groupped)) + +#define DUMP64(x) G_STMT_START { \ + uint64 v = AU64_VALUE(&t.x); \ + log_info(la, "THREAD %s = %s", #x, \ + uint64_to_string_grp(v, groupped)); \ +} G_STMT_END + +#define DUMPV(x) log_info(la, "THREAD %s = %s", #x, \ + size_t_to_string_grp(x, groupped)) + + DUMP(created); + DUMP(discovered); + DUMP64(qid_cache_lookup); + DUMP64(qid_cache_hit); + DUMP64(qid_cache_false_hit); + DUMP64(qid_cache_self_check); + DUMP64(qid_cache_clash); + DUMP64(qid_cache_miss); + DUMP64(lookup_by_qid); + DUMP64(lookup_by_tid); + DUMP64(locks_tracked); + DUMP64(locks_tracked_discovered); + DUMP64(locks_released); + DUMP64(locks_spinlock_tracked); + DUMP64(locks_mutex_tracked); + DUMP64(locks_rlock_tracked); + DUMP64(locks_wlock_tracked); + DUMP64(locks_spinlock_contention); + DUMP64(locks_mutex_contention); + DUMP64(locks_rlock_contention); + DUMP64(locks_wlock_contention); + DUMP64(locks_spinlock_sleep); + DUMP64(locks_mutex_sleep); + DUMP64(locks_rlock_sleep); + DUMP64(locks_wlock_sleep); + DUMP64(locks_nested_sleeps); + DUMP64(cond_waitings); + DUMP64(cond_nested_waitings); + DUMP64(signals_posted); + DUMP64(signals_handled); + DUMP64(signals_ignored); + DUMP64(sig_handled_count); + DUMP64(sig_handled_while_blocked); + DUMP64(sig_handled_while_paused); + DUMP64(sig_handled_while_check); + DUMP64(sig_handled_while_locking); + DUMP64(sig_handled_while_unlocking); + DUMP64(thread_self_blocks); + DUMP64(thread_self_pauses); + DUMP64(thread_self_suspends); + DUMP64(thread_self_block_races); + DUMP64(thread_self_pause_races); + DUMP64(thread_self_calls); + DUMP64(thread_forks); + DUMP64(thread_yields); + DUMP64(thread_syscalls); + DUMP64(thread_syscalls_dups); + DUMP64(thread_syscalls_with_locks); + DUMP64(thread_syscalls_recursions); + DUMP64(thread_syscalls_locking); + DUMP64(thread_interrupts); + DUMP64(thread_safe_interrupts); + DUMP64(thread_stats_digest); + + { + size_t rsc_semaphore_used; + size_t rsc_semaphore_arrays; + size_t rsc_cond_variables; + size_t rsc_local_keys; + + DUMPV(thread_running); + DUMPV(thread_discovered); + DUMPV(thread_pending_reuse); + + rsc_semaphore_arrays = semaphore_kernel_usage(&rsc_semaphore_used); + rsc_cond_variables = cond_vars_count(); + rsc_local_keys = thread_local_key_count(); + + DUMPV(rsc_semaphore_used); + DUMPV(rsc_semaphore_arrays); + DUMPV(rsc_cond_variables); + DUMPV(rsc_local_keys); + } + +#undef DUMP +#undef DUMP64 +#undef DUMPV +} + +/** + * Dump thread elements to stderr. + */ +void G_COLD +thread_dump_thread_elements(void) +{ + s_info("THREAD known %u elements:", thread_next_stid); + + thread_dump_thread_elements_log(log_agent_stderr_get(), 0); +} + +/** + * Dump thread element to specified logging agent. + */ +static void +thread_dump_thread_element_log(logagent_t *la, unsigned options, unsigned stid) +{ + struct thread_element *te = threadsstid; + uint i; + bool locked; + + if (NULL == te) { + log_warning(la, "THREAD NULL element #%u", stid); + return; + } + + if (te->magic != THREAD_ELEMENT_MAGIC) { + log_warning(la, "THREAD bad magic for element #%u", stid); + return; + } + + locked = THREAD_TRY_LOCK(te); + + if ((options & DUMP_OPT_SHORT) && (!te->valid || te->reusable)) + goto done; /* Skip obsolete element when short output requested */ + + log_info(la, "THREAD --- begin element #%u%s ---", + stid, locked ? "" : " (UNLOCKED)"); + +#define DUMPF(fmt, field) \ + log_info(la, "THREAD %19s = " fmt, #field, te->field) + +#define DUMPV(fmt, field, value) \ + log_info(la, "THREAD %19s = " fmt, #field, value) + +#define DUMPL(fmt, name, ...) \ + log_info(la, "THREAD %19s = " fmt, name, __VA_ARGS__) + + DUMPF("%d", valid); + DUMPF("%d", reusable); + DUMPF("%lu", tid); + DUMPF("%zu", last_qid); + DUMPF("%zu", low_qid); + DUMPF("%zu", high_qid); + DUMPF("%zu", top_qid); + DUMPF("%zu", low_sig_qid); + DUMPF("%zu", high_sig_qid); + DUMPF("%p", last_sp); + DUMPF("%p", top_sp); + DUMPF("\"%s\"", name); + DUMPF("%zu", stack_size); + DUMPF("%p", stack); + DUMPF("%p", stack_base); + DUMPF("%p", sig_stack); + DUMPV("%s", entry, stacktrace_function_name(te->entry)); + DUMPF("%p", argument); + DUMPF("%s", entry_name); + DUMPF("%d", suspend); + DUMPF("%d", pending); + DUMPL("{ %d, %d }", "wfd", te->wfd0, te->wfd1); + DUMPF("%d", join_requested); + DUMPF("%d", join_pending); + DUMPF("%u", joining_id); + DUMPF("%u", unblock_events); + DUMPF("%p", exit_value); + DUMPF("0x%x", sig_mask); + DUMPF("0x%x", sig_pending); + DUMPF("%u", signalled); + DUMPF("%u", sig_generation); + DUMPF("%d", in_signal_handler); + DUMPF("%d", sig_handling); + DUMPF("%d", sleep_interruptible); + DUMPF("%d", created); + DUMPF("%d", discovered); + DUMPF("%d", running); + DUMPF("%d", deadlocked); + DUMPF("%d", creating); + DUMPF("%d", exiting); + DUMPF("%d", suspended); + DUMPF("%d", blocked); + DUMPF("%d", timed_blocked); + DUMPF("%d", unblocked); + DUMPF("%d", detached); + DUMPF("%d", async_exit); + DUMPF("%d", main_thread); + DUMPF("%d", cancelled); + DUMPF("%d", cancelable); + DUMPF("%d", sleeping); + DUMPF("%d", exit_started); + DUMPF("%d", in_syscall); + DUMPF("%d", gone); + DUMPF("%d", gone_seen); + DUMPF("%d", add_monitoring); + DUMPF("%d", cancl); + DUMPF("%zu", locks.count); + for (i = te->locks.count; i != 0; i--) { + const struct thread_lock *l = &te->locks.arenai - 1; + char buf10; + + str_bprintf(buf, sizeof buf, "lock%03u", i); + DUMPL("%s %p at %s:%u", buf, + thread_lock_kind_to_string(l->kind), l->lock, l->file, l->line); + } + DUMPF("%zu", waits.count); + for (i = te->waits.count; i != 0; i--) { + const struct thread_lock *l = &te->waits.arenai - 1; + char buf10; + + str_bprintf(buf, sizeof buf, "wait%03u", i); + DUMPL("%s %p at %s:%u", buf, + thread_lock_kind_to_string(l->kind), l->lock, l->file, l->line); + } + DUMPF("%p", cond); + DUMPL("%p, count=%u", "cond_stack", + te->cond_stack, + NULL == te->cond_stack ? 0 : slist_length(te->cond_stack)); + DUMPL("%zu", "exit_list count", eslist_count(&te->exit_list)); + DUMPL("%zu", "cleanup_list count", eslist_count(&te->cleanup_list)); + DUMPL("%s", "btrace.type", + thread_backtrace_type_to_string(te->btrace.type)); + DUMPF("%zu", btrace.count); + + if (NULL == te->div) { + DUMPF("%p", div); + } else { + DUMPL("%s(%p)", "div", + stacktrace_function_name(te->div->divert), te->div->arg); + } + + for (i = 0; i < N_ITEMS(te->sigh); i++) { + if (NULL != te->sighi) { + char buf10; + + str_bprintf(buf, sizeof buf, "sigh%02u", i); + if (TSIG_IGN == te->sighi) { + DUMPL("%s", buf, "IGN"); + } else { + DUMPL("%s", buf, stacktrace_function_name(te->sighi)); + } + } + } + +#undef DUMPL +#undef DUMPV +#undef DUMPF + +done: + if (locked) + THREAD_UNLOCK(te); +} + +/** + * Dump thread elements to specified logging agent. + */ +void G_COLD +thread_dump_thread_elements_log(logagent_t *la, unsigned options) +{ + uint i; + + for (i = 0; i < N_ITEMS(threads); i++) { + if G_UNLIKELY(i >= thread_next_stid) + break; + if G_UNLIKELY(i == thread_next_stid) + log_warning(la, "THREAD element #%u may be partially setup", i); + thread_dump_thread_element_log(la, options, i); + } +} + +/** + * In case an assertion failure occurs in this file, dump statistics + * about the known thread environment. + */ +static void G_COLD +thread_crash_hook(void) +{ + int sp; + + s_minidbg("THREAD current sp=%p", &sp); + + thread_dump_stats(); + thread_dump_thread_elements(); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/thread.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/thread.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Raphael Manfredi + * Copyright (c) 2011-2013, Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -25,77 +25,439 @@ * @ingroup lib * @file * - * Minimal thread support. + * Minimal thread runtime support. * * @author Raphael Manfredi - * @date 2011 + * @date 2011-2013 */ #ifndef _thread_h_ #define _thread_h_ +#include "tsig.h" /* For tsigset_t */ +#include "compat_gettid.h" /* For systid_t */ + +/** + * Thread exiting callback, which will be invoked asynchronously in the + * context of the main thread, NOT the thread which created that exiting thread. + */ +typedef void (*thread_exit_t)(void *result, void *earg); + +typedef unsigned long thread_t; +typedef size_t thread_qid_t; /* Quasi Thread ID */ +typedef unsigned int thread_key_t; /* Local thread storage key */ + +#define THREAD_MAX 64 /**< Max amount of threads we can track */ +#define THREAD_STACK_DFLT (65536 * PTRSIZE) /**< Default stack requested */ +#define THREAD_LOCAL_MAX 1024 /**< Max amount of thread-local keys */ + /** - * Free routine for thread-private values. + * Minimum thread stack requested: 24K on 32-bit systems, 32K on 64-bit ones. */ -typedef void (*thread_pvalue_free_t)(void *value, void *arg); +#define THREAD_STACK_MIN MAX(4096 * PTRSIZE, 24576) + +/** + * Thread creation flags. + */ +#define THREAD_F_DETACH (1U << 0) /**< Create a detached thread */ +#define THREAD_F_ASYNC_EXIT (1U << 1) /**< Exit callback delivered by main */ +#define THREAD_F_NO_CANCEL (1U << 2) /**< Thread cannot be cancelled */ +#define THREAD_F_NO_POOL (1U << 3) /**< Disable xmalloc thread pool */ +#define THREAD_F_WARN (1U << 4) /**< Warn if cannot create thread */ +#define THREAD_F_PANIC (1U << 5) /**< Panic if we cannot create thread */ +#define THREAD_F_CLEARSIG (1U << 6) /**< Clear signal mask of new thread */ +#define THREAD_F_UNSUSPEND (1U << 7) /**< Launch even if global suspension */ +#define THREAD_F_WAIT (1U << 8) /**< Wait for thread to start */ + +/** + * Special free routine for thread-local value which indicates that the + * thread-local entry must not be reclaimed when the thread exists. + */ +#define THREAD_LOCAL_KEEP ((free_fn_t) 1) + +/** + * Invalid key, for static initialization. + */ +#define THREAD_KEY_INIT ((thread_key_t) -1) #ifdef I_PTHREAD #include <pthread.h> -typedef unsigned long thread_t; - #if 0 /* General macros, optimized by GCC usually */ #define thread_eq(a, b) (0 == memcmp(&(a), &(b), sizeof(thread_t))) #define thread_set(t,v) memcpy(&(t), &(v), sizeof(thread_t)) + +#define THREAD_NONE ((thread_t) 0) +#define THREAD_INVALID ((thread_t) -1U) #else /* Specific macros, suitable when we know thread_t is an unsigned long */ #define thread_eq(a, b) ((a) == (b)) #define thread_set(t,v) ((t) = (v)) + +#define THREAD_NONE 0 +#define THREAD_INVALID -1U #endif -static inline thread_t -thread_current(void) -{ - union { - thread_t t; - pthread_t pt; - } u; - - STATIC_ASSERT(sizeof(thread_t) <= sizeof(pthread_t)); - - /* - * We truncate the pthread_t to the first "unsigned long" bytes. - * - * On Linux, pthread_t is already an unsigned long. - * On FreeBSD, pthread_t is a pointer, which fits in unsigned long. - * - * On Windows, pthread_t is a structure, whose first member is a pointer. - * And we don't want to use the whole pthread_t structure there, because - * the second member is changing over time and we want a unique thread - * identifier. - */ - - u.pt = pthread_self(); - return u.t; -} +#else /* !I_PTHREAD */ -#else -typedef unsigned thread_t; -#define thread_current() 0xc5db8dd3U /* Random, odd number */ #define thread_eq(a, b) ((a) == (b)) #define thread_set(t,v) ((t) = (v)) + +#define THREAD_NONE 0 +#define THREAD_INVALID -1U + +#endif /* I_PTHREAD */ + +/** + * Type of locks we track. + */ +enum thread_lock_kind { + THREAD_LOCK_ANY, + THREAD_LOCK_SPINLOCK, + THREAD_LOCK_RLOCK, + THREAD_LOCK_WLOCK, + THREAD_LOCK_MUTEX +}; + +/** + * Thread information that can be collected. + */ +typedef struct thread_info { + thread_t tid; /**< The internal thread ID */ + thread_qid_t last_qid; /**< Last QID used by thread */ + thread_qid_t low_qid; /**< Lowest QID */ + thread_qid_t high_qid; /**< Highest QID */ + thread_qid_t top_qid; /**< Topmost QID seen on the stack */ + unsigned stid; /**< Small thread ID */ + systid_t system_thread_id; /**< System thread ID */ + unsigned join_id; /**< ID of joining thread, or THREAD_INVALID */ + time_t last_seen; /**< Last seen activity of discovered thread */ + const char *name; /**< Thread name, NULL if none set */ + const void *last_sp; /**< Last known stack pointer */ + const void *bottom_sp; /**< Computed bottom stack pointer */ + const void *top_sp; /**< Topmost stack pointer seen on this stack */ + const void *stack_base; /**< Base of allocated stack (NULL otherwise) */ + size_t stack_size; /**< Size of stack, 0 for discovered threads */ + size_t locks; /**< Amount of locks registered */ + size_t private_vars; /**< Amount of thread-private variables */ + size_t local_vars; /**< Amount of thread-local variables */ + func_ptr_t entry; /**< Thread entry point, NULL if discovered */ + void *exit_value; /**< Exit value, if exited, NULL otherwise */ + tsigset_t sig_mask; /**< Signal mask */ + tsigset_t sig_pending; /**< Signals pending delivery */ + uint stack_addr_growing:1; /**< Whether stack growing upwards */ + uint discovered:1; /**< Was thread discovered or created? */ + uint exiting:1; /**< Whether thread is exiting */ + uint exited:1; /**< Whether thread has exited */ + uint suspended:1; /**< Whether thread is suspended */ + uint blocked:1; /**< Whether thread is (voluntarily) blocked */ + uint cancelled:1; /**< Whether thread was cancelled */ + uint sleeping:1; /**< Whether thread is sleeping */ + uint main_thread:1; /**< Whether this is the main thread */ +} thread_info_t; + +/** + * Thread signal mask handling. + */ +enum thread_sighow { + TSIG_GETMASK, /**< Get current signal mask */ + TSIG_BLOCK, /**< Add signals to the thread's signal mask */ + TSIG_UNBLOCK, /**< Remove signals from the thread's mask */ + TSIG_SETMASK /**< Set thread's signal mask explicitly */ +}; + +/** + * Thread signal sets (OS and thread-layer). + * + * This is used by thread_enter_critical() and thread_leave_critical() to + * capture both the kernel and our own internal signal masks, and restore + * them when we leave. + */ +typedef struct thread_sigsets { + sigset_t kset; /**< Kernel set */ + tsigset_t tset; /**< Thread-layer set */ +} thread_sigsets_t; + +/* + * Define the signal we are going to use for thread interrupts. + * + * The SIGEMT (EMulated instruction Trap) signal is used because + * it is highly unlikely to be triggered and visible from the + * application under normal circumstances. It is not even a POSIX + * signal but is commonly defined, which makes it even more likely + * to be unsed -- a perfect candidate for our purpose here! + * + * The SIGUNUSED (unused!) signal is a very good choice since, by + * construction, that signal is not used on the platform, but can + * still be a valid argument for sending signals. + * + * The next good signals to use are SIGLOST (file lock lost) which is + * rather unused under normal circumstances, and SIGIO (I/O is possible). + * + * The SIGPWR (power lost) and SIGXFSZ (file size limit exceeded) are + * our last fallback signals if we have no other choice. We select them + * as a last resort because it is conceivable that these signals could be + * useful. + */ +#if defined(SIGEMT) +#define THREAD_SIGINTR SIGEMT +#elif defined(SIGUNUSED) +#define THREAD_SIGINTR SIGUNUSED +#elif defined(SIGLOST) +#define THREAD_SIGINTR SIGLOST +#elif defined(SIGIO) +#define THREAD_SIGINTR SIGIO +#elif defined(SIGPWR) +#define THREAD_SIGINTR SIGPWR +#elif defined(SIGXFSZ) +#define THREAD_SIGINTR SIGXFSZ +#else +#define THREAD_SIGINTR (SIGRTMAX - 1) #endif /* * Public interface. */ +struct cond; + +void thread_yield(void); +void thread_sleeping(bool sleeping); + +thread_t thread_current(void); +thread_t thread_current_element(const void **element); +thread_qid_t thread_quasi_id(void); +unsigned thread_small_id(void); +unsigned thread_safe_small_id(void); +unsigned thread_safe_small_id_sp(const void *sp); +int thread_stid_from_thread(const thread_t t); +const char *thread_to_string(const thread_t t); +void thread_set_name(const char *name); +void thread_set_name_atom(const char *name); +const char *thread_name(void); +const char *thread_safe_name(void); +const char *thread_safe_id_name(unsigned id); +const char *thread_id_name(unsigned id); +unsigned thread_by_name(const char *name); + +unsigned thread_count(); +unsigned thread_discovered_count(void); +bool thread_is_single(void); +bool thread_is_stack_pointer(const void *p, const void *top, unsigned *stid); +void thread_exit_mode(void); +void thread_crash_mode(void); +bool thread_is_crashing(void); +bool thread_in_crash_mode(void); +void thread_lock_disable(bool silent); +size_t thread_stack_used(void); +size_t thread_id_stack_used(uint stid, const void *sp); +void thread_stack_check_overflow(const void *va); +void thread_stack_check(void); + +size_t thread_suspend_others(bool lockwait); +size_t thread_unsuspend_others(void); +bool thread_check_suspended(void); +int thread_divert(uint id, process_fn_t cb, void *arg, void **reply); + void *thread_private_get(const void *key); -gboolean thread_private_remove(const void *key); +bool thread_private_remove(const void *key); void thread_private_add(const void *key, const void *value); +void thread_private_add_permanent(const void *key, const void *value); void thread_private_add_extended(const void *key, const void *value, - thread_pvalue_free_t p_free, void *p_arg); + free_data_fn_t p_free, void *p_arg); +void thread_private_update_extended(const void *key, const void *value, + free_data_fn_t p_free, void *p_arg, bool existing); +void thread_private_set(const void *key, const void *value); +void thread_private_set_extended(const void *key, const void *value, + free_data_fn_t p_free, void *p_arg); + +int thread_local_key_create(thread_key_t *key, free_fn_t freecb); +void thread_local_key_delete(thread_key_t key); +void thread_local_set(thread_key_t key, const void *value); +void *thread_local_get(thread_key_t key); +size_t thread_local_key_count(void); +struct pslist *thread_local_users(thread_key_t key); + +void thread_lock_got(const void *lock, enum thread_lock_kind kind, + const char *file, unsigned line, const void *element); +void thread_lock_got_swap(const void *lock, enum thread_lock_kind kind, + const char *file, unsigned line, const void *plock, const void *element); +void thread_lock_changed(const void *lock, enum thread_lock_kind okind, + enum thread_lock_kind nkind, const char *file, unsigned line, + const void *element); +void thread_lock_released(const void *lock, enum thread_lock_kind kind, + const void *element); +size_t thread_lock_count(void); +size_t thread_id_lock_count(unsigned id); +bool thread_lock_holds(const volatile void *lock); +bool thread_lock_holds_as(const volatile void *, enum thread_lock_kind); +size_t thread_lock_held_count(const void *lock); +bool thread_lock_holds_from(const char *file); +void thread_lock_deadlock(const volatile void *lock); +void thread_lock_dump_all(int fd); +void thread_lock_dump_if_any(int fd, uint id); +void thread_assert_no_locks(const char *routine); +void thread_lock_contention(enum thread_lock_kind kind); +const void *thread_lock_waiting_element(const void *lock, + enum thread_lock_kind kind, const char *file, unsigned line); +void thread_lock_waiting_done(const void *element, const void *lock); + +const void *thread_cond_waiting_element(struct cond **c); +void thread_cond_waiting_done(const void *element); + +void thread_pending_add(int increment); +size_t thread_pending_count(void); + +struct tmval; + +unsigned thread_block_prepare(void); +void thread_block_self(unsigned events); +bool thread_timed_block_self(unsigned events, const struct tmval *timeout); +int thread_unblock(unsigned id); + +void thread_set_main(bool can_block); +bool thread_set_main_was_called(void); +unsigned thread_get_main(void); +bool thread_main_is_blockable(void); + +int thread_create(process_fn_t routine, void *arg, uint flags, size_t stack); +int thread_create_full(process_fn_t routine, void *arg, uint flags, + size_t stack, thread_exit_t exited, void *earg); +void thread_exit(void *value) G_NORETURN; +void thread_atexit(thread_exit_t exit_cb, void *exit_arg); +bool thread_is_exiting(void); +int thread_join(unsigned id, void **result); +int thread_join_try(unsigned id, void **result); + +int thread_wait(unsigned id); +bool thread_timed_wait(unsigned id, const struct tmval *timeout, int *error); +bool thread_wait_until(unsigned id, const struct tmval *end, int *error); + +pid_t thread_fork(bool safe); +void thread_forked(void); + +int thread_get_info(unsigned stid, thread_info_t *info); +void thread_current_info(thread_info_t *info); +const char *thread_info_to_string_buf( + const thread_info_t *info, char buf, size_t len); + +void thread_sigmask(enum thread_sighow how, const tsigset_t *s, tsigset_t *os); +int thread_kill(unsigned id, int signum); +tsighandler_t thread_signal(int signum, tsighandler_t handler); +int thread_sighandler_level(void); +unsigned thread_sig_generation(void); +bool thread_pause(void); +void thread_halt(void) G_NORETURN; +bool thread_sigsuspend(const tsigset_t *mask); +void thread_sleep_ms(unsigned int ms); +bool thread_timed_sigsuspend(const tsigset_t *mask, const struct tmval *tout); + +void thread_enter_critical(thread_sigsets_t *set); +void thread_leave_critical(const thread_sigsets_t *set); +void thread_in_syscall_set(bool value); +void thread_in_syscall_reset(void); +bool thread_was_in_syscall(int *stid); + +int thread_os_kill(unsigned id, int signo); +int thread_interrupt(uint id, process_fn_t cb, void *arg, + notify_data_fn_t completed, void *udata); + +void *thread_sp(void); + +void thread_cleanup_push_from(notify_fn_t cleanup, void *arg, + const char *routine, const char *file, unsigned line, const void *sp); +void thread_cleanup_pop_from(bool run, + const char *routine, const char *file, unsigned line); +bool thread_cleanup_has_from(const char *routine); + +/** + * Possible thread cancellation states. + */ +enum thread_cancel_state { + THREAD_CANCEL_ENABLE, + THREAD_CANCEL_DISABLE +}; + +bool thread_is_cancelable(void); +bool thread_cancel_test(void); +int thread_cancel(unsigned id); +int thread_cancel_set_state(enum thread_cancel_state state, + enum thread_cancel_state *oldstate); + +static inline int +thread_cancel_enable(void) +{ + return thread_cancel_set_state(THREAD_CANCEL_ENABLE, NULL); +} + +static inline int +thread_cancel_disable(void) +{ + return thread_cancel_set_state(THREAD_CANCEL_DISABLE, NULL); +} + +/** + * Exit value for a cancelled thread. + */ +#define THREAD_CANCELLED ((void *) -1) + +/** + * Exit value for a forcefully terminated thread on stack overflow. + */ +#define THREAD_OVERFLOW ((void *) -3) + +/** + * Push thread cleanup handler. + * + * @param c the routine to invoke + * @param a the argument to pass to that routine + */ +#define thread_cleanup_push(c,a) \ + thread_cleanup_push_from((c), (a), \ + G_STRFUNC, _WHERE_, __LINE__, thread_sp()) + +/** + * Pop thread cleanup handler, which must have been pushed in the same routine. + * + * @param r whether to run the handler being poped + */ +#define thread_cleanup_pop(r) \ + thread_cleanup_pop_from((r), G_STRFUNC, _WHERE_, __LINE__) + +struct logagent; +void thread_dump_stats_log(struct logagent *la, unsigned options); +void thread_dump_stats(void); +void thread_dump_thread_elements_log(struct logagent *la, unsigned options); +void thread_dump_thread_elements(void); + +struct sha1; +void thread_stats_digest(struct sha1 *digest); + +#define THREAD_INVALID_ID -1U /**< Invalid ID */ +#define THREAD_UNKNOWN_ID -2U /**< Unknown ID */ +#define THREAD_MAIN 0 /**< ID of the main thread */ + +static inline bool +thread_is_main(void) +{ + return THREAD_MAIN == thread_small_id(); +} + +/** + * Flags for thread_foreach_local(). + */ + +#define THREAD_LOCAL_SUSPENDED (1U << 0) +#define THREAD_LOCAL_SKIP_SELF (1U << 1) + +void thread_foreach_local(thread_key_t key, uint flags, cdata_fn_t, void *); + +#if defined(THREAD_SOURCE) || defined(MUTEX_SOURCE) + +thread_t thread_self(void); + +#endif /* THREAD_SOURCE || MUTEX_SOURCE */ #endif /* _thread_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/tiger.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/tiger.c
Changed
@@ -22,7 +22,7 @@ */ /* (PD) 2001 The Bitzi Corporation - * Please see file COPYING or http://bitzi.com/publicdomain + * Please see file COPYING or http://bitzi.com/publicdomain * for more info. * * Created and released into the public domain by Eli Biham @@ -65,7 +65,7 @@ #include "tiger_sboxes.h" -#define U64_FROM_2xU32(hi, lo) (((guint64) (hi) << 32) | (lo)) +#define U64_FROM_2xU32(hi, lo) (((uint64) (hi) << 32) | (lo)) #define t1 (tiger_sboxes) #define t2 (&tiger_sboxes256) @@ -135,9 +135,9 @@ #define tiger_compress_macro(str, state) \ { \ - guint64 a, b, c, tmpa; \ - guint64 aa, bb, cc; \ - guint64 x8; \ + uint64 a, b, c, tmpa; \ + uint64 aa, bb, cc; \ + uint64 x8; \ int pass_no, i; \ \ a = state0; \ @@ -154,27 +154,27 @@ } /* The compress function is a function. Requires smaller cache? */ -static G_GNUC_HOT void -tiger_compress(const guint64 *data, guint64 state3) +static void G_HOT +tiger_compress(const uint64 *data, uint64 state3) { tiger_compress_macro(data, state); } void -tiger(gconstpointer data, guint64 length, char hash24) +tiger(const void *data, uint64 length, char hash24) { - guint64 i, j, res3; - const guint8 *data_u8 = data; + uint64 i, j, res3; + const uint8 *data_u8 = data; union { - guint64 u648; - guint8 u864; + uint64 u648; + uint8 u864; } temp; res0 = U64_FROM_2xU32(0x01234567UL, 0x89ABCDEFUL); res1 = U64_FROM_2xU32(0xFEDCBA98UL, 0x76543210UL); res2 = U64_FROM_2xU32(0xF096A5B4UL, 0xC3B2E187UL); -#if G_BYTE_ORDER == G_BIG_ENDIAN +#if IS_BIG_ENDIAN for (i = length; i >= 64; i -= 64) { for (j = 0; j < 64; j++) { temp.u8j ^ 7 = data_u8j; @@ -182,8 +182,8 @@ tiger_compress(temp.u64, res); data_u8 += 64; } -#else /* !BIG ENDIAN */ - if ((gulong) data & 7) { +#else /* !IS_BIG_ENDIAN */ + if ((ulong) data & 7) { for (i = length; i >= 64; i -= 64) { memcpy(temp.u64, data_u8, 64); tiger_compress(temp.u64, res); @@ -191,13 +191,13 @@ } } else { for (i = length; i >= 64; i -= 64) { - tiger_compress((gconstpointer) data_u8, res); + tiger_compress((void *) data_u8, res); data_u8 += 64; } } -#endif /* BIG ENDIAN */ +#endif /* IS_BIG_ENDIAN */ -#if G_BYTE_ORDER == G_BIG_ENDIAN +#if IS_BIG_ENDIAN for (j = 0; j < i; j++) { temp.u8j ^ 7 = data_u8j; } @@ -216,7 +216,7 @@ for (; j & 7; j++) { temp.u8j = 0; } -#endif +#endif /* IS_BIG_ENDIAN */ if (j > 56) { for (; j < 64; j++) { @@ -242,7 +242,7 @@ * Runs some test cases to check whether the implementation of the tiger * hash algorithm is alright. */ -G_GNUC_COLD void +void G_COLD tiger_check(void) { static const char zeros1025; @@ -259,17 +259,17 @@ { "D6UXHPOSAGHITCD4VVRHJQ4PCKIWY2WEHPJOUWY", zeros, 1024 }, { "CMKDYROZKSC6VTM4I7LSMMHPAE4UG3FXPXZGGKY", zeros, sizeof zeros }, }; - guint i; + uint i; - for (i = 0; i < G_N_ELEMENTS(tests); i++) { + for (i = 0; i < N_ITEMS(tests); i++) { char hash24; char buf40; - gboolean ok; + bool ok; ZERO(&buf); tiger(testsi.s, testsi.len, hash); base32_encode(buf, sizeof buf, hash, sizeof hash); - bufG_N_ELEMENTS(buf) - 1 = '\0'; + bufN_ITEMS(buf) - 1 = '\0'; ok = 0 == strcmp(testsi.r, buf); if (!ok) {
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/tiger.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/tiger.h
Changed
@@ -37,7 +37,7 @@ #include "common.h" void tiger_check(void); -void tiger(gconstpointer data, guint64 length, char hash24); +void tiger(const void *data, uint64 length, char hash24); #endif /* _tiger_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/tiger_sboxes.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/tiger_sboxes.h
Changed
@@ -33,9 +33,9 @@ #include "common.h" -#define D(x, y) ((guint64) (x) << 32 | (y)) +#define D(x, y) ((uint64) (x) << 32 | (y)) -static const guint64 tiger_sboxes4 * 256 = { +static const uint64 tiger_sboxes4 * 256 = { D(0x02AAB17CUL, 0xF7E90C5EUL) /* 0 */, D(0xAC424B03UL, 0xE243A8ECUL) /* 1 */, D(0x72CD5BE3UL, 0x0DD5FCD3UL) /* 2 */,
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/tigertree.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/tigertree.c
Changed
@@ -54,7 +54,7 @@ */ /* (PD) 2001 The Bitzi Corporation - * Please see file COPYING or http://bitzi.com/publicdomain + * Please see file COPYING or http://bitzi.com/publicdomain * for more info. * * tigertree.c - Implementation of the TigerTree algorithm @@ -109,7 +109,7 @@ unsigned good_depth; /* the desired depth of the final leaves */ unsigned flags; union { - guint64 u64; /* Better alignment */ + uint64 u64; /* Better alignment */ char bytesTTH_BLOCKSIZE + 1; } block; struct tth stack56; @@ -145,7 +145,7 @@ filesize_t n_blocks; unsigned depth; - n_blocks = tt_block_count(filesize); + n_blocks = tt_block_count(filesize); depth = 0; while (n_blocks > 1) { n_blocks = (n_blocks + 1) / 2; @@ -172,7 +172,7 @@ }; unsigned i; - for (i = 0; i < G_N_ELEMENTS(thresholds); i++) { + for (i = 0; i < N_ITEMS(thresholds); i++) { if (filesize < thresholdsi) break; } @@ -184,19 +184,19 @@ { filesize_t n_blocks; size_t n_nodes; - + n_blocks = tt_block_count(filesize); n_nodes = (1 << tt_good_depth(filesize)); return (n_blocks / n_nodes) * TTH_BLOCKSIZE; } -filesize_t +filesize_t tt_node_count_at_depth(filesize_t filesize, unsigned depth) { filesize_t n, m; - m = 1 << depth; - n = tt_block_count(filesize); + m = (filesize_t) 1 << depth; + n = tt_block_count(filesize); while (n > m) { n = (n + 1) / 2; } @@ -209,7 +209,7 @@ return tt_node_count_at_depth(filesize, tt_good_depth(filesize)); } -static filesize_t +static filesize_t tt_blocks_per_leaf(filesize_t filesize) { unsigned full_depth, good_depth; @@ -222,14 +222,14 @@ } else { n_bpl = 1; } - return n_bpl; + return n_bpl; } static void tt_internal_hash(const struct tth *a, const struct tth *b, struct tth *dst) { union { - guint64 u64; /* Better alignment */ + uint64 u64; /* Better alignment */ char bytesTIGERSIZE * 2 + 1; } buf; @@ -263,7 +263,7 @@ tt_compose(ctx); n /= 2; if (ctx->bpl > 1 && 0 == (ctx->n % ctx->bpl) && 2 == x) { - g_assert(ctx->li < G_N_ELEMENTS(ctx->leaves)); + g_assert(ctx->li < N_ITEMS(ctx->leaves)); ctx->leavesctx->li = ctx->stackctx->si - 1; ctx->li++; } @@ -318,7 +318,7 @@ depth--; n_blocks = (n_blocks + 1) / 2; if (depth == ctx->good_depth) { - g_assert(ctx->li < G_N_ELEMENTS(ctx->leaves)); + g_assert(ctx->li < N_ITEMS(ctx->leaves)); ctx->leavesctx->li = ctx->stackctx->si - 1; ctx->li++; } @@ -452,7 +452,7 @@ return ctx->li; } -static G_GNUC_COLD void +static void G_COLD tt_check_digest(const char * const expected, const void *data, size_t size) { char digestTTH_BASE32_SIZE + 1; @@ -465,7 +465,7 @@ ZERO(&digest); base32_encode(digest, sizeof digest, hash.data, sizeof hash.data); - digestG_N_ELEMENTS(digest) - 1 = '\0'; + digestN_ITEMS(digest) - 1 = '\0'; if (0 != strcmp(expected, digest)) { g_warning("tt_check_digest:\nExpected: \"%s\"\nGot: \"%s\"", @@ -474,7 +474,7 @@ } } -G_GNUC_COLD void +void G_COLD tt_check(void) { /* test case: empty file (zero bytes) */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/tigertree.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/tigertree.h
Changed
@@ -45,7 +45,7 @@ * */ /* (PD) 2001 The Bitzi Corporation - * Please see file COPYING or http://bitzi.com/publicdomain + * Please see file COPYING or http://bitzi.com/publicdomain * for more info. * * $Bitzi: tigertree.h,v 1.3 2003/02/24 10:59:29 gojomo Exp $ @@ -80,7 +80,7 @@ void tt_check(void); void tt_init(TTH_CONTEXT *ctx, filesize_t filesize); -void tt_update(TTH_CONTEXT *ctx, gconstpointer data, size_t len); +void tt_update(TTH_CONTEXT *ctx, const void *data, size_t len); void tt_digest(TTH_CONTEXT *ctx, struct tth *tth); const struct tth *tt_leaves(TTH_CONTEXT *ctx);
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/timestamp.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/timestamp.c
Changed
@@ -37,11 +37,14 @@ #include "common.h" #include "timestamp.h" + #include "ascii.h" +#include "buf.h" #include "offtime.h" #include "parse.h" +#include "str.h" #include "stringify.h" -#include "glib-missing.h" + #include "override.h" /* Must be the last header included */ /** @@ -108,9 +111,13 @@ const char * timestamp_utc_to_string(time_t date) { - static char buf32; - timestamp_utc_to_string_buf(date, buf, sizeof buf); - return buf; + buf_t *b = buf_private(G_STRFUNC, 32); + char *p = buf_data(b); + size_t n, sz = buf_size(b); + + n = timestamp_utc_to_string_buf(date, p, sz); + g_assert(n < sz); + return p; } /** @@ -121,9 +128,13 @@ const char * timestamp_utc_to_string2(time_t date) { - static char buf32; - timestamp_utc_to_string_buf(date, buf, sizeof buf); - return buf; + buf_t *b = buf_private(G_STRFUNC, 32); + char *p = buf_data(b); + size_t n, sz = buf_size(b); + + n = timestamp_utc_to_string_buf(date, p, sz); + g_assert(n < sz); + return p; } /** @@ -161,10 +172,30 @@ const char * timestamp_to_string(time_t date) { - static char bufTIMESTAMP_BUF_LEN; + buf_t *b = buf_private(G_STRFUNC, TIMESTAMP_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - timestamp_to_string_buf(date, buf, sizeof buf); - return buf; + n = timestamp_to_string_buf(date, p, sz); + g_assert(n < sz); + return p; +} + +/** + * Convert time to ISO 8601 date plus time, e.g. "2005-11-10 20:21:57". + * + * @return pointer to static data. + */ +const char * +timestamp_to_string2(time_t date) +{ + buf_t *b = buf_private(G_STRFUNC, TIMESTAMP_BUFLEN); + char *p = buf_data(b); + size_t n, sz = buf_size(b); + + n = timestamp_to_string_buf(date, p, sz); + g_assert(n < sz); + return p; } /** @@ -178,7 +209,7 @@ { struct tm *tm; struct tm gmt_tm; - + tm = gmtime(&date); gmt_tm = *tm; /* struct copy */ tm = localtime(&date); @@ -198,7 +229,7 @@ * @param size The size of of "buf". * @return The length of the created string. */ -static size_t +static size_t timestamp_rfc822_to_string_buf(time_t date, char *buf, size_t size) { struct tm *tm; @@ -232,7 +263,7 @@ } else sign = '+'; - return gm_snprintf(buf, size, "%s, %02d %s %04d %02d:%02d:%02d %c%04d", + return str_bprintf(buf, size, "%s, %02d %s %04d %02d:%02d:%02d %c%04d", daystm->tm_wday, tm->tm_mday, monthstm->tm_mon, tm->tm_year + 1900, tm->tm_hour, tm->tm_min, tm->tm_sec, sign, gmt_off / 60 * 100 + gmt_off % 60); @@ -246,10 +277,13 @@ const char * timestamp_rfc822_to_string(time_t date) { - static char buf80; + buf_t *b = buf_private(G_STRFUNC, 80); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - timestamp_rfc822_to_string_buf(date, buf, sizeof buf); - return buf; + n = timestamp_rfc822_to_string_buf(date, p, sz); + g_assert(n < sz); + return p; } /** @@ -259,10 +293,13 @@ const char * timestamp_rfc822_to_string2(time_t date) { - static char buf80; + buf_t *b = buf_private(G_STRFUNC, 80); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - timestamp_rfc822_to_string_buf(date, buf, sizeof buf); - return buf; + n = timestamp_rfc822_to_string_buf(date, p, sz); + g_assert(n < sz); + return p; } /** @@ -274,14 +311,14 @@ * @param size The size of of "buf". * @return The length of the created string. */ -static size_t +static size_t timestamp_rfc1123_to_string_buf(time_t date, char *buf, size_t size) { const struct tm *tm; g_assert(size > 0); tm = gmtime(&date); - return gm_snprintf(buf, size, "%s, %02d %s %04d %02d:%02d:%02d GMT", + return str_bprintf(buf, size, "%s, %02d %s %04d %02d:%02d:%02d GMT", daystm->tm_wday, tm->tm_mday, monthstm->tm_mon, tm->tm_year + 1900, tm->tm_hour, tm->tm_min, tm->tm_sec); } @@ -294,10 +331,13 @@ const char * timestamp_rfc1123_to_string(time_t date) { - static char buf80; + buf_t *b = buf_private(G_STRFUNC, 80); + char *p = buf_data(b); + size_t n, sz = buf_size(b); - timestamp_rfc1123_to_string_buf(date, buf, sizeof buf); - return buf; + n = timestamp_rfc1123_to_string_buf(date, p, sz); + g_assert(n < sz); + return p; } /** @@ -311,7 +351,7 @@ * @attention * The date is returned in ``stamp'' as local time, not UTC time. */ -gboolean +bool string_to_timestamp_utc(const char *str, const char **endptr, time_t *stamp) { const char *ep;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/timestamp.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/timestamp.h
Changed
@@ -40,6 +40,32 @@ #include "misc.h" /* For short_string_t */ /* + * We try to use the direct difference of time_t values instead of difftime() + * for performance. Just in case there is any system which requires difftime() + * e.g. if time_t is BCD-encoded, define USE_DIFFTIME. + */ + +#ifdef USE_DIFFTIME +typedef int64 time_delta_t; + +static inline time_delta_t +delta_time(time_t t1, time_t t0) +{ + return difftime(t1, t0); +} +#else /* !USE_DIFFTIME */ +typedef time_t time_delta_t; + +static inline ALWAYS_INLINE time_delta_t +delta_time(time_t t1, time_t t0) +{ + return t1 - t0; +} +#endif /* USE_DIFFTIME*/ + +#define TIME_DELTA_T_MAX MAX_INT_VAL(time_delta_t) + +/* * Utilities based on "struct tm". */ @@ -51,6 +77,7 @@ */ const char *timestamp_to_string(time_t date); +const char *timestamp_to_string2(time_t date); const char *timestamp_utc_to_string(time_t date); const char *timestamp_utc_to_string2(time_t date); const char *timestamp_rfc822_to_string(time_t date); @@ -61,9 +88,64 @@ size_t timestamp_utc_to_string_buf(time_t date, char *dst, size_t size); short_string_t timestamp_get_string(time_t date); -gboolean string_to_timestamp_utc( +bool string_to_timestamp_utc( const char *str, const char **endptr, time_t *stamp); +/* + * time_t utilities. + */ + +/** + * Advances the given timestamp by delta using saturation arithmetic. + * @param t the timestamp to advance. + * @param delta the amount of seconds to advance. + * @return the advanced timestamp or TIME_T_MAX. + */ +static inline time_t G_CONST +time_advance(time_t t, ulong delta) +{ + /* Using time_t for delta and TIME_T_MAX instead of INT_MAX + * would be cleaner but give a confusing interface. Jumping 136 + * years in time should be enough for everyone. Most systems + * don't allow us to advance a time_t beyond 2038 anyway. + */ + + do { + long d; + + d = MIN(delta, (ulong) LONG_MAX); + if (d >= TIME_T_MAX - t) { + t = TIME_T_MAX; + break; + } + t += d; + delta -= d; + } while (delta > 0); + + return t; +} + +/** + * Add delta to a time_delta_t, saturating towards TIME_DELTA_T_MAX. + */ +static inline time_delta_t G_CONST +time_delta_add(time_delta_t td, ulong delta) +{ + do { + long d; + + d = MIN(delta, (ulong) LONG_MAX); + if (d >= TIME_DELTA_T_MAX - td) { + td = TIME_DELTA_T_MAX; + break; + } + td += d; + delta -= d; + } while (delta > 0); + + return td; +} + #endif /* _timestamp_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/tm.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/tm.c
Changed
@@ -36,12 +36,452 @@ #ifdef I_SYS_TIMES #include <sys/times.h> #endif +#ifdef I_SYS_SELECT +#include <sys/select.h> /* For "struct timeval" on some systems */ +#endif #include "tm.h" +#include "atomic.h" +#include "compat_sleep_ms.h" +#include "gentime.h" +#include "listener.h" +#include "progname.h" /* For progstart_time() */ +#include "offtime.h" +#include "once.h" +#include "spinlock.h" +#include "thread.h" +#include "timestamp.h" /* For timestamp_to_string() */ + #include "override.h" /* Must be the last header included */ +#define TM_GMT_PERIOD (30*60) /* Recompute GMT offset every half hour */ +#define TM_THREAD_STACK THREAD_STACK_MIN +#define TM_THREAD_PERIOD 1000 /* ms, 1 second */ + +#define TM_MILLION 1000000L +#define TM_BILLION 1000000000L + tm_t tm_cached_now; /* Currently cached time */ +static spinlock_t tm_slk = SPINLOCK_INIT; + +static struct { + time_delta_t offset; /* Current GMT offset, as computed */ + time_t computed; /* Last computed time for the GMT offset */ + gentime_t updated; /* Last computed GMT offset */ + int dst; /* < 0 means unknown */ + once_flag_t inited; /* First GMT offset computed */ +} tm_gmt; + +static uint32 tm_debug; + +#define TM_LOCK spinlock_raw(&tm_slk) +#define TM_UNLOCK spinunlock_raw(&tm_slk) + +#define tm_debugging(lvl) G_UNLIKELY(tm_debug > (lvl)) + +/** + * Set time debug level. + */ +void +set_tm_debug(uint32 level) +{ + tm_debug = level; +} + +/** + * Get the configured time debug level. + */ +uint32 +tm_debug_level(void) +{ + return tm_debug; +} + +/** + * Clock update listerners. + */ + +static listeners_t tm_event_listeners; + +void tm_event_listener_add(tm_event_listener_t l) +{ + LISTENER_ADD(tm_event, l); +} + +void tm_event_listener_remove(tm_event_listener_t l) +{ + LISTENER_REMOVE(tm_event, l); +} + +static void +tm_event_fire(int delta) +{ + LISTENER_EMIT(tm_event, (delta)); +} + +/** + * Get current time for the system, filling the supplied tm_t structure. + * + * @note + * This is a simple wrapper over gettimeofday() which, contrary to + * tm_now_exact(), does not cache the result. + */ +void +tm_current_time(tm_t *tm) +{ + struct timeval tv; + + gettimeofday(&tv, NULL); + timeval_to_tm(tm, &tv); +} + +/** + * Fallback routine for tm_precise_time() when clock_gettime() is not working + * or not available. + */ +static void +tm_precise_fallback(tm_nano_t *tn) +{ + struct timeval tv; + + gettimeofday(&tv, NULL); + tn->tv_sec = tv.tv_sec; + tn->tv_nsec = tv.tv_usec * 1000; +} + +/** + * Get current time at the nanosecond precision if possible, filling the + * supplied tm_nano_t structure. + * + * @note + * The returned value is not cached. + */ +void +tm_precise_time(tm_nano_t *tn) +{ +#ifdef HAS_CLOCK_GETTIME + struct timespec tp; + + if (-1 == clock_gettime(CLOCK_REALTIME, &tp)) + tm_precise_fallback(tn); + else + timespec_to_tm_nano(tn, &tp); +#else + tm_precise_fallback(tn); +#endif /* HAS_CLOCK_GETTIME */ +} + +/** + * Fallback routine for tm_precise_granularity() when clock_getres() is + * not working or not available. + * + * @return FALSE, to indicate the value is computed and not given by system. + */ +static bool +tm_precise_granularity_fallback(tm_nano_t *tn) +{ + static spinlock_t tm_granularity_slk = SPINLOCK_INIT; + static long granularity = TM_MILLION; /* microseconds, 1 second */ + tm_t now; + long i; + + /* + * Computation of the granularity is done by fetching the current time + * and then looking at the precision we can gather from the tv_usec + * field, remembering the highest precision we see. + */ + + tm_current_time(&now); + + spinlock_hidden(&tm_granularity_slk); + + for (i = 1; i < granularity; i *= 10) { + long factor = i * 10; + if (factor * (now.tv_usec / factor) != now.tv_usec) + break; + } + granularity = i; + + spinunlock_hidden(&tm_granularity_slk); + + tn->tv_sec = i / TM_MILLION; + tn->tv_nsec = (i % TM_MILLION) * 1000; /* Convert to nanoseconds */ + + return FALSE; +} + +/** + * Get the clock precision, filling the supplied tm_nano_t structure with the + * value in nanoseconds. + * + * @return whether the value is supplied by the system (FALSE if computed). + */ +bool +tm_precise_granularity(tm_nano_t *tn) +{ +#ifdef HAS_CLOCK_GETRES + struct timespec tp; + if (-1 == clock_getres(CLOCK_REALTIME, &tp)) { + return tm_precise_granularity_fallback(tn); + } else { + timespec_to_tm_nano(tn, &tp); + return TRUE; + } +#else + return tm_precise_granularity_fallback(tn); +#endif /* HAS_CLOCK_GETRES */ +} + +/** + * Once routine used to initialize the GMT offset the first time we need it, + * before the time thread is launched. + */ +static void +tm_init_gmt_offset(void) +{ + tm_gmt.offset = timestamp_gmt_offset(time(NULL), NULL); +} + +/* + * Recompute the GMT offset. + */ +static void +tm_update_gmt_offset(const time_t now) +{ + time_delta_t gmtoff; + struct tm tp; + bool dst_check; + + /* + * The ``tm_gmt'' variable is only updated from the time thread, hence + * there is no need to lock it. Changes are "published" via atomic_mb(). + */ + + gmtoff = timestamp_gmt_offset(now, NULL); + tm_gmt.updated = gentime_from(now); + + if (tm_debugging(0)) { + s_info("TM computed GMT offset is %ld (was %ld)", + (long) gmtoff, (long) tm_gmt.offset); + } + + /* + * When the GMT offset changes, we no longer know whether we're in DST + * mode or not, and we'll let mktime() decide. + */ + + if G_UNLIKELY(gmtoff != tm_gmt.offset) + tm_gmt.dst = -1; + + tm_gmt.offset = gmtoff; + atomic_mb(); /* Make all threads aware of the change */ + + /* + * Recompute the time at which we'll need to check for a DST change. + * Daylight Saving Time changes only occur at the hour or half hour, + * local time. Hence we force the date at which we computed the GMT + * offset to the beginning of the hour or of the half-hour. + */ + + dst_check = -1 == tm_gmt.dst; + + off_time(now, gmtoff, &tp); + tp.tm_min = (tp.tm_min >= 30) ? 30 : 0; /* Last start or half hour */ + tp.tm_sec = 0; /* Changes happen at minutes */ + tp.tm_isdst = tm_gmt.dst; /* Figure out DST */ + tm_gmt.computed = mktime(&tp); + + if G_UNLIKELY(dst_check) { + tm_gmt.dst = tp.tm_isdst; + atomic_mb(); /* Make all threads aware of the change */ + + if (tm_debugging(0)) { + s_info("TM determined that DST is %s", + 0 == tm_gmt.dst ? "OFF" : tm_gmt.dst > 0 ? "ON" : "unknown"); + } + } + + if (tm_debugging(4)) { + s_info("TM GMT computation time set to %s (%02d:%02d:%02d) " + "computed=%d, now=%d, gmtoff=%ld, dst=%d", + timestamp_to_string(tm_gmt.computed), + tp.tm_hour, tp.tm_min, tp.tm_sec, + (int) tm_gmt.computed, (int) now, (long) gmtoff, tm_gmt.dst); + } +} + +/** + * Called when time has been updated by the time thread, normally every second. + * + * @return whether time variation occurred. + */ +static bool +tm_updated(const tm_t *prev, const tm_t *now) +{ + time_delta_t delta; + bool need_update; + gentime_t gnow; + + /* + * Periodically update the GMT offset. + * + * To fight against incorrect time being computed by mktime() on some + * systems which do not have a proper DST database, we need to check + * against the tm_gmt.updated field as well or we may end-up with too + * frequent checks (if DST was on and went off with a GMT offset > 0) + * or no check at all (if DST was off and went on with a GMT offset > 0). + */ + + gnow = gentime_from(now->tv_sec); + + /* Protection against the "no check at all" case */ + need_update = delta_time(now->tv_sec, tm_gmt.computed) > TM_GMT_PERIOD + || gentime_diff(gnow, tm_gmt.updated) > TM_GMT_PERIOD; + + /* Protection against the "too frequent checks" case */ + need_update = gentime_diff(gnow, tm_gmt.updated) > TM_GMT_PERIOD / 10 + && need_update; + + if G_UNLIKELY(need_update) + tm_update_gmt_offset((time_t) now->tv_sec); + + /* + * When time is shifting suddenly (system-wide time adjustment, either + * from the super-user or from NTP), and especially when it is moving + * backwards, we need to react to avoid problems: + * + * - Code waiting on condition variables with a timeout need to recompute + * the proper time to avoid being stuck for longer than necessary if + * time is moving backwards. + * + * - Code monitoring the time spent, such as spinlocks, need to be warned + * so that they do not trigger the timeout condition when time jumps + * forward. These should use gentime_difftime() to make sure the delta + * remains accurate in that case and gentime_now() to get the current + * time. + * + * Code is responsible for registering the appropriate listeners to react + * when we detect a variation in the system's clock. + */ + + if G_UNLIKELY(0 == prev->tv_sec) + return FALSE; + + delta = tm_elapsed_ms(now, prev) - TM_THREAD_PERIOD; + + if G_LIKELY(delta >= -TM_THREAD_PERIOD/4 && delta <= TM_THREAD_PERIOD/4) + return FALSE; + + if (tm_debugging(1)) { + s_message("TM system clock changed, delta=%+ld ms", (long) delta); + } + + tm_update_gmt_offset((time_t) now->tv_sec); + tm_event_fire(delta); + + if (tm_debugging(2)) { + s_message("TM clock change notifications done (delta=%+ld ms)", + (long) delta); + } + + return TRUE; +} + +/** + * Time thread. + * + * This is launched to update the time every second, check whether the + * system clock is moving ahead/backwards and update our GMT offset + * regularily. + */ +static void * +tm_thread_main(void *unused_arg) +{ + tm_t prev; + + (void) unused_arg; + ZERO(&prev); + + thread_set_name("time"); + + tm_gmt.dst = -1; /* Unknown DST (Daylight Saving Time) */ + + /* + * Let generation time stamp initialize. + * + * We used to have gentime_diff() do that the first time it was called, + * in order to decouple the two layers, but that does not work as + * gentime_diff() can be called with memory locks already taken, and + * installing the event listener is going to allocate memory, causing + * deadlocks. + * + * Therefore, it is best to initialize the generation timestamp from here: + * when this thread starts, it does not hold any locks. And without this + * thread, generation timestamps do not work anyway, so the two functions + * are dependent upon each other. + * --RAM, 2013-09-29 + */ + + gentime_init(); + + for (;;) { + tm_t now; + + G_PREFETCH_HI_R(&tm_gmt.computed); + + TM_LOCK; + tm_current_time(&tm_cached_now); + now = tm_cached_now; + TM_UNLOCK; + + if G_UNLIKELY(tm_updated(&prev, &now)) { + /* + * Updating could take some time, so we need to refresh the + * previous time. If the system clock is updated whilst + * being in tm_updated() and we detected a time shift already, + * then we won't be able to see this second update but the + * chances of that happening are slim. + */ + tm_current_time(&prev); + } else { + prev = now; + } + + /* + * Do NOT use thread_sleep_ms() here since we do not expect any + * signal in this thread. It could also be dangerous because the + * thread_sleep_ms() routine uses condition variables, and we would + * not be protected against a sudden system clock adjustment, making + * us wait for a long time... + */ + + compat_sleep_ms(TM_THREAD_PERIOD); + } + + g_assert_not_reached(); + return NULL; +} + +/** + * Start time thread, once. + */ +static void +tm_thread_start(void) +{ + /* + * Before launching the time thread, initialize the first GMT offset. + * Indeed, when that thread runs, it will gain exclusive write access + * to the `tm_gmt' variable. + */ + + ONCE_FLAG_RUN(tm_gmt.inited, tm_init_gmt_offset); + + thread_create(tm_thread_main, NULL, + THREAD_F_DETACH | THREAD_F_CLEARSIG | + THREAD_F_NO_POOL | THREAD_F_PANIC, + TM_THREAD_STACK); +} /** * Convert floating point time description into a struct timeval by filling @@ -51,7 +491,7 @@ f2tm(double t, tm_t *tm) { tm->tv_sec = (unsigned long) t; - tm->tv_usec = (long) ((t - (double) tm->tv_sec) * 1000000.0); + tm->tv_usec = (long) ((t - (double) tm->tv_sec) * (double) TM_MILLION); } /** @@ -63,7 +503,7 @@ elapsed->tv_sec = t1->tv_sec - t0->tv_sec; elapsed->tv_usec = t1->tv_usec - t0->tv_usec; if (elapsed->tv_usec < 0) { - elapsed->tv_usec += 1000000; + elapsed->tv_usec += TM_MILLION; elapsed->tv_sec--; } } @@ -77,7 +517,7 @@ tm->tv_sec -= dec->tv_sec; tm->tv_usec -= dec->tv_usec; if (tm->tv_usec < 0) { - tm->tv_usec += 1000000; + tm->tv_usec += TM_MILLION; tm->tv_sec--; } } @@ -90,8 +530,8 @@ { tm->tv_sec += inc->tv_sec; tm->tv_usec += inc->tv_usec; - if (tm->tv_usec >= 1000000) { - tm->tv_usec -= 1000000; + if (tm->tv_usec >= TM_MILLION) { + tm->tv_usec -= TM_MILLION; tm->tv_sec++; } } @@ -103,10 +543,82 @@ tm_cmp(const tm_t *a, const tm_t *b) { if (a->tv_sec != b->tv_sec) - return (a->tv_sec > b->tv_sec) ? +1 : -1; - if (a->tv_usec == b->tv_usec) - return 0; - return (a->tv_usec > b->tv_usec) ? +1 : -1; + return CMP(a->tv_sec, b->tv_sec); + return CMP(a->tv_usec, b->tv_usec); +} + +/** + * Computes the elapsed time (t1 - t0) in the supplied structure. + */ +void +tm_precise_elapsed(tm_nano_t *elapsed, const tm_nano_t *t1, const tm_nano_t *t0) +{ + elapsed->tv_sec = t1->tv_sec - t0->tv_sec; + elapsed->tv_nsec = t1->tv_nsec - t0->tv_nsec; + if (elapsed->tv_nsec < 0) { + elapsed->tv_nsec += TM_BILLION; + elapsed->tv_sec--; + } +} + +/** + * In-place add inc to tn. + */ +void +tm_precise_add(tm_nano_t *tn, const tm_nano_t *inc) +{ + tn->tv_sec += inc->tv_sec; + tn->tv_nsec += inc->tv_nsec; + if (tn->tv_nsec >= TM_BILLION) { + tn->tv_nsec -= TM_BILLION; + tn->tv_sec++; + } +} + +/** + * Computes the remaining time to absolute end time and return duration + * in milliseconds. + * + * This routine is more accurate than tm_elapsed_ms() because it goes down + * to the microsecond in case there are no visible difference at the + * millisecond level. + * + * @param end absolute ending time + * + * @return amount of milliseconds remaining to reach time. + */ +long +tm_remaining_ms(const tm_t *end) +{ + tm_t now, elapsed; + long remain; + + /* + * This routine is usually called from low-level code and we do not + * want to dispatch signals or suspend the calling thread at this stage + * since this will usually be done afterwards in the same low-level + * calling routine. + * --RAM, 2015-02-25 + */ + + tm_now_exact_raw(&now); /* Raw version, no signals nor suspension */ + tm_elapsed(&elapsed, end, &now); + remain = tm2ms(&elapsed); + + /* + * We want the full precision, so if remain is 0, go down to the + * micro-second level to check whether waiting really expired. + */ + + if G_UNLIKELY(0 == remain) { + long us = tm2us(&elapsed); + if (us < 0) + remain = -1; /* Signal that we're past the time */ + else if (us > 0) + remain = 1; /* Signal that we're before the time */ + } + + return remain; } /** @@ -115,28 +627,59 @@ void tm_now(tm_t *tm) { - *tm = tm_cached_now; /* Struct copy */ + if G_UNLIKELY(thread_check_suspended()) { + tm_now_exact(tm); + } else { + TM_LOCK; + *tm = tm_cached_now; /* Struct copy */ + TM_UNLOCK; + } } /** * Fill supplied structure with current time (recomputed). - * If the time jumps backward the previously recorded timestamp - * is used instead to enforce a monotonic flow of time. + * + * @attention + * This raw version does not check for thread suspension. It is meant + * to be used in dire circumstances to limit resource consumption or + * avoid any suspension or signal delivery. */ void -tm_now_exact(tm_t *tm) +tm_now_exact_raw(tm_t *tm) { - const tm_t past = tm_cached_now; - - g_get_current_time(&tm_cached_now); - if (tm_cached_now.tv_sec < past.tv_sec) { - tm_cached_now = past; - } else if (tm_cached_now.tv_sec == past.tv_sec) { - if (tm_cached_now.tv_usec < past.tv_usec) - tm_cached_now.tv_usec = past.tv_usec; - } - if (tm) + TM_LOCK; + tm_current_time(&tm_cached_now); + if G_LIKELY(tm != NULL) *tm = tm_cached_now; + TM_UNLOCK; +} + +/** + * Fill supplied structure with current time (recomputed). + */ +void +tm_now_exact(tm_t *tm) +{ + G_PREFETCH_HI_W(&tm_slk); + G_PREFETCH_HI_W(&tm_cached_now); + + thread_check_suspended(); + tm_now_exact_raw(tm); +} + +/** + * Fill supplied structure with current time (cached). + * + * @attention + * This raw version does not check for thread suspension. It is meant + * to be used in dire circumstances to limit resource consumption and + * may return incorrect information. + */ +void +tm_now_raw(tm_t *tm) +{ + atomic_mb(); + *tm = tm_cached_now; /* Struct copy, without locks */ } /** @@ -150,10 +693,74 @@ } /** + * Get current local time, at the second granularity (cached). + */ +time_t +tm_localtime(void) +{ + ONCE_FLAG_RUN(tm_gmt.inited, tm_init_gmt_offset); + + G_PREFETCH_HI_R(&tm_cached_now); + G_PREFETCH_HI_R(&tm_gmt.offset); + + if G_UNLIKELY(thread_check_suspended()) { + return tm_localtime_exact(); + } else { + return (time_t) tm_cached_now.tv_sec + tm_gmt.offset; + } +} + +/** + * Get current local time, at the second granularity (recomputed). + */ +time_t +tm_localtime_exact(void) +{ + ONCE_FLAG_RUN(tm_gmt.inited, tm_init_gmt_offset); + + tm_now_exact(NULL); + return (time_t) tm_cached_now.tv_sec + tm_gmt.offset; +} + +/* + * Get current local time, at the second granularity (raw). + * + * @attention + * This raw version does not check for thread suspension. It is meant + * to be used in dire circumstances to limit resource consumption. + */ +time_t +tm_localtime_raw(void) +{ + static time_delta_t gmt_offset; + static bool done; + time_delta_t offset = tm_gmt.offset; + tm_t now; + + /* + * In case this routine is called very early, perform some local + * initializations to be able to return meaningful information. + * --RAM, 2015-11-15 + */ + + if G_UNLIKELY(0 == tm_cached_now.tv_sec) { + if (!done) { + gmt_offset = timestamp_gmt_offset(time(NULL), NULL); + done = TRUE; + } + offset = gmt_offset; + } + + tm_current_time(&now); + + return (time_t) now.tv_sec + offset; +} + +/** * Hash a tm_t time structure. */ -guint -tm_hash(gconstpointer key) +uint +tm_hash(const void *key) { const tm_t *tm = key; @@ -164,7 +771,7 @@ * Test two tm_t for equality. */ int -tm_equal(gconstpointer a, gconstpointer b) +tm_equal(const void *a, const void *b) { const tm_t *ta = a, *tb = b; @@ -175,16 +782,16 @@ *** CPU time computation. ***/ -#if defined(HAS_TIMES) +#ifdef HAS_TIMES /** * Return amount of clock ticks per second. */ -static long +static long clock_hz(void) { static long freq = 0; /* Cached amount of clock ticks per second */ - if (freq <= 0) { + if G_UNLIKELY(freq <= 0) { #ifdef _SC_CLK_TCK errno = ENOTSUP; freq = sysconf(_SC_CLK_TCK); @@ -193,7 +800,7 @@ #endif } - if (freq <= 0) { + if G_UNLIKELY(freq <= 0) { #if defined(CLK_TCK) freq = CLK_TCK; /* From <time.h> */ #elif defined(HZ) @@ -219,7 +826,7 @@ double tm_cputime(double *user, double *sys) { - static gboolean getrusage_failed; + static bool getrusage_failed; double u; double s; @@ -233,8 +840,13 @@ s = 0; g_warning("getrusage(RUSAGE_SELF, ...) failed: %m"); } else { - u = tm2f(&usage.ru_utime); - s = tm2f(&usage.ru_stime); + tm_t tu, ts; + + timeval_to_tm(&tu, &usage.ru_utime); + timeval_to_tm(&ts, &usage.ru_stime); + + u = tm2f(&tu); + s = tm2f(&ts); } #else getrusage_failed = TRUE; @@ -245,7 +857,7 @@ s = 0; } - if (getrusage_failed) { + if (getrusage_failed) { #if defined(HAS_TIMES) struct tms t; @@ -254,7 +866,7 @@ u = (double) t.tms_utime / (double) clock_hz(); s = (double) t.tms_stime / (double) clock_hz(); #else - static gboolean warned = FALSE; + static bool warned = FALSE; if (!warned) { g_warning("getrusage() is unusable and times() is missing"); @@ -273,18 +885,32 @@ return u + s; } -static tm_t start_time; - -void -tm_init(void) +/** + * Returns the current time relative to the startup time (cached). + * + * @note For convenience unsigned long is used, so that we can + * always cast them to pointers and back again. The guaranteed + * width of 32-bit should be sufficient for session duration. + * Where this is unsufficient, stick to time_t. + */ +time_t +tm_relative_time(void) { - tm_now_exact(&start_time); + return delta_time(tm_time(), progstart_time().tv_sec); } -tm_t -tm_start_time(void) +/** + * Initialize the cached time, and optionally start the time thread. + */ +void +tm_init(bool time_thread) { - return start_time; + tm_t now; + + if (time_thread) + tm_thread_start(); + + tm_now_exact(&now); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/tm.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/tm.h
Changed
@@ -35,135 +35,168 @@ #define _tm_h_ #include "common.h" +#include "thread.h" /* For thread_check_suspended() */ +#include "timestamp.h" /* For time_delta_t */ /** - * tm_zero - * - * Returns true if time is zero. + * Portable representation of the "struct timeval" values, which is used + * internally by all time handling routines. All time information are + * relative to the UNIX Epoch. */ -#define tm_zero(t) ((t)->tv_sec == 0 && (t)->tv_usec == 0) +typedef struct tmval { + long tv_sec; + long tv_usec; +} tm_t; + +#define TM_ZERO { 0L, 0L } /** - * tm2f + * Copies the timeval fields into our internal tmval structure. * - * Convert timeval description into floating point representation. + * @param tm the structure to fill + * @param tv the system's timeval structure */ -#define tm2f(t) ((double) (t)->tv_sec + (t)->tv_usec / 1000000.0) +static inline ALWAYS_INLINE void +timeval_to_tm(tm_t *tm, const struct timeval * const tv) +{ + /* + * We cannot assume that the structures are equivalent (they are not on + * OS/X for instance), hence we perform a field-by-field copy. + */ + + tm->tv_sec = tv->tv_sec; + tm->tv_usec = tv->tv_usec; +} /** - * tm2ms - * - * Convert timeval description into milliseconds. + * Portable representation of the "struct timespec" values, which are used + * internally by high-precision time handling routines. All time information + * are relative to the UNIX Epoch. */ -#define tm2ms(t) ((t)->tv_sec * 1000 + (t)->tv_usec / 1000) +typedef struct tmspec { + long tv_sec; /* seconds */ + long tv_nsec; /* and nanoseconds */ +} tm_nano_t; + +#define TM_NANO_ZERO { 0L, 0L } /** - * tm2us + * Copies the timespec fields into our internal tmspec structure. * - * Convert timeval description into microseconds. + * @param tm the structure to fill + * @param tp the system's timespec structure */ -#define tm2us(t) ((t)->tv_sec * 1000000 + (t)->tv_usec) - -typedef GTimeVal tm_t; - -void tm_init(void); -void f2tm(double t, tm_t *tm); -void tm_elapsed(tm_t *elapsed, const tm_t *t1, const tm_t *t0); -void tm_sub(tm_t *tm, const tm_t *dec); -void tm_add(tm_t *tm, const tm_t *inc); -int tm_cmp(const tm_t *a, const tm_t *b) G_GNUC_PURE; - -void tm_now(tm_t *tm); -void tm_now_exact(tm_t *tm); -time_t tm_time_exact(void); -double tm_cputime(double *user, double *sys); +static inline ALWAYS_INLINE void +timespec_to_tm_nano(tm_nano_t *tm, const struct timespec * const tp) +{ + /* + * We cannot assume that the structures are equivalent, hence we perform + * a field-by-field copy. + */ -guint tm_hash(gconstpointer key) G_GNUC_PURE; -int tm_equal(gconstpointer a, gconstpointer b) G_GNUC_PURE; + tm->tv_sec = tp->tv_sec; + tm->tv_nsec = tp->tv_nsec; +} -/* - * We use the direct difference of time_t values instead of difftime() - * for performance. Just in case there is any system which requires difftime() - * e.g. if time_t is BCD-encoded, define USE_DIFFTIME. +/** + * Converts our internal tmspec structure back to POSIX timespec. */ -#if defined(USE_DIFFTIME) -typedef gint64 time_delta_t; - -static inline time_delta_t -delta_time(time_t t1, time_t t0) +static inline ALWAYS_INLINE void +tm_nano_to_timespec(struct timespec *tp, const tm_nano_t * const tn) { - return difftime(t1, t0); + tp->tv_sec = tn->tv_sec; + tp->tv_nsec = tn->tv_nsec; } -#else /* !USE_DIFFTIME */ -typedef time_t time_delta_t; -static inline ALWAYS_INLINE time_delta_t -delta_time(time_t t1, time_t t0) +/** + * @return whether time is zero. + */ +static inline bool +tm_is_zero(const tm_t * const t) { - return t1 - t0; + return 0 == t->tv_sec && 0 == t->tv_usec; } -static inline void -time_t_check(void) +/** + * @return whether time is zero or less. + */ +static inline bool +tm_is_negative(const tm_t * const t) { - /* If time_t is not a signed integer type, we cannot calculate properly - * with the raw values. Define USE_DIFFTIME, if this check fails.*/ - STATIC_ASSERT((time_t) -1 < 0); + return t->tv_sec < 0 || (0 == t->tv_sec && t->tv_usec <= 0); } -#endif /* USE_DIFFTIME*/ - -#define TIME_DELTA_T_MAX MAX_INT_VAL(time_delta_t) /** - * Advances the given timestamp by delta using saturation arithmetic. - * @param t the timestamp to advance. - * @param delta the amount of seconds to advance. - * @return the advanced timestamp or TIME_T_MAX. + * Convert timeval description into floating point representation. */ -static inline time_t G_GNUC_CONST -time_advance(time_t t, gulong delta) +static inline double +tm2f(const tm_t * const t) { - /* Using time_t for delta and TIME_T_MAX instead of INT_MAX - * would be cleaner but give a confusing interface. Jumping 136 - * years in time should be enough for everyone. Most systems - * don't allow us to advance a time_t beyond 2038 anyway. - */ + return (double) t->tv_sec + t->tv_usec / 1000000.0; +} - do { - long d; +/** + * Convert timeval description into milliseconds. + */ +static inline ulong +tm2ms(const tm_t * const t) +{ + return (ulong) t->tv_sec * 1000UL + (ulong) t->tv_usec / 1000U; +} - d = MIN(delta, (gulong) LONG_MAX); - if (d >= TIME_T_MAX - t) { - t = TIME_T_MAX; - break; - } - t += d; - delta -= d; - } while (delta > 0); +/** + * Convert timeval description into microseconds. + */ +static inline ulong +tm2us(const tm_t * const t) +{ + return (ulong) t->tv_sec * 1000000UL + (ulong) t->tv_usec; +} - return t; +/** + * Convert timespec description into nanoseconds. + */ +static inline ulong +tmn2ns(const tm_nano_t * const t) +{ + return (ulong) t->tv_sec * 1000000000UL + (ulong) t->tv_nsec; } /** - * Add delta to a time_delta_t, saturating towards TIME_DELTA_T_MAX. + * Convert timespec description into floating point representation. */ -static inline time_delta_t G_GNUC_CONST -time_delta_add(time_delta_t td, gulong delta) +static inline double +tmn2f(const tm_nano_t * const t) { - do { - long d; + return (double) t->tv_sec + t->tv_nsec / 1000000000.0; +} - d = MIN(delta, (gulong) LONG_MAX); - if (d >= TIME_DELTA_T_MAX - td) { - td = TIME_DELTA_T_MAX; - break; - } - td += d; - delta -= d; - } while (delta > 0); +void tm_init(bool time_thread); +void f2tm(double t, tm_t *tm); +void tm_elapsed(tm_t *elapsed, const tm_t *t1, const tm_t *t0); +void tm_sub(tm_t *tm, const tm_t *dec); +void tm_add(tm_t *tm, const tm_t *inc); +int tm_cmp(const tm_t *a, const tm_t *b) G_PURE; +long tm_remaining_ms(const tm_t *end); - return td; -} +void tm_precise_elapsed(tm_nano_t *e, const tm_nano_t *t1, const tm_nano_t *t0); +void tm_precise_add(tm_nano_t *tn, const tm_nano_t *inc); + +void tm_now(tm_t *tm); +void tm_now_exact(tm_t *tm); +void tm_now_raw(tm_t *tm); +void tm_now_exact_raw(tm_t *tm); +time_t tm_time_exact(void); +void tm_current_time(tm_t *tm); +void tm_precise_time(tm_nano_t *tn); +bool tm_precise_granularity(tm_nano_t *tn); +double tm_cputime(double *user, double *sys); + +uint tm_hash(const void *key) G_PURE; +int tm_equal(const void *a, const void *b) G_PURE; + +void set_tm_debug(uint32 level); +uint32 tm_debug_level(void) G_PURE; /* * Convenience routines. @@ -206,32 +239,73 @@ return tm2us(&elapsed); } +/** + * Computes the elapsed time (t1 - t0) and return duration in seconds, as + * a floating point quantity to represent sub-seconds. + */ +static inline double +tm_precise_elapsed_f(const tm_nano_t *t1, const tm_nano_t *t0) +{ + tm_nano_t elapsed; + + tm_precise_elapsed(&elapsed, t1, t0); + return tmn2f(&elapsed); +} + extern tm_t tm_cached_now; /* Currently cached time */ /** * Get current time, at the second granularity (cached). */ -static inline time_t G_GNUC_PURE +static inline time_t tm_time(void) { + if G_UNLIKELY(thread_check_suspended()) { + return tm_time_exact(); + } else { + return (time_t) tm_cached_now.tv_sec; + } +} + +/** + * Get current time, at the second granularity (cached). + * + * @attention + * This routine does not check for thread suspension and is reserved + * to low-level routines that cannot be interrupted or for which we + * want the minimal amount of overhead. + */ +static inline time_t +tm_time_raw(void) +{ return (time_t) tm_cached_now.tv_sec; } -tm_t tm_start_time(void) G_GNUC_PURE; +time_t tm_localtime(void); +time_t tm_localtime_exact(void); +time_t tm_localtime_raw(void); + +time_t tm_relative_time(void); /** - * Returns the current time relative to the startup time (cached). - * - * @note For convenience unsigned long is used, so that we can - * always cast them to pointers and back again. The guaranteed - * width of 32-bit should be sufficient for session duration. - * Where this is unsufficient, stick to time_t. + * Fill supplied tm_t structure with specified amount of milliseconds. */ -static inline unsigned long -tm_relative_time(void) +static inline void +tm_fill_ms(tm_t *tm, ulong ms) { - return delta_time(tm_time(), tm_start_time().tv_sec); + tm->tv_sec = ms / 1000; + tm->tv_usec = (ms - 1000 * tm->tv_sec) * 1000; } + +/** + * Notifications for clock changes. + */ + +typedef void (*tm_event_listener_t)(int delta); + +void tm_event_listener_add(tm_event_listener_t); +void tm_event_listener_remove(tm_event_listener_t); + #endif /* _tm_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/tmalloc.c
Added
@@ -0,0 +1,2528 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Thread Magazine allocator (TM). + * + * This allocating layer is derived from the following article by Jeff Bonwick + * and Jonathan Adams: "Magazines and Vmem: Extending the Slab Allocator to + * Many CPUs and Arbitrary Resources", from the 2001 USENIX proceedings. + * + * It is meant to plug itself on top of a general memory allocator, and it + * intercepts calls to that underlying allocator to return memory from a + * thread-local region (so-called "magazines"). Therefore, it is not a memory + * allocator per se, but rather a memory distributor. + * + * Here, a magazine is a fix-sized array of M items, handled as a stack of + * objects. All the objects in the magazine are also fix-sized objects, the + * size that the TM allocator can distribute and collect. + * + * A magazine is full when all its M slots contain valid object pointers to + * be handled to the application. A magazine is empty when it is depleted. + * + * The high-level TM allocator is, by definition, tied to a thread, and it can + * therefore perform all its operations without locks. This is called the + * Thread Layer. + * + * The thread layer has two magazines per thread, so-called "loaded" and + * "previous". A shared magazine depot is used to store empty and full + * magazines, which are allocated and filled using an underlying memory + * allocator. + * + * There are therefore 3 layers to consider: + * + * --------------------------------------------------------------- + * + * Thread Layer: Thread #1 | Thread #2 | Thread #3 + * loadedM | loadedM | loadedM + * previousM | previousM | previousM + * | | + * ^ ^ ^ + * --------------------|-------------|-------------|-------------- + * v v v + * + * Depot Layer: Full Magazines: list of filled magazines + * Empty Magazines: list of empty magazines + * + * ^ + * ---------------------------------|----------------------------- + * v + * + * Memory Layer: Allocation for magazines / objects. + * + * --------------------------------------------------------------- + * + * The TM allocator is made-up of the first two layers and relies on the + * third one to actually perform its operations. + * + * Allocation works thusly: + * + * - if the loadedM array is not empty, return loaded--rounds, where + * the "rounds" variable is the current amount of items in the magazine. + * + * - exchange loadedM (empty) with previousM and if the new loadedM + * is not empty, then return loaded--rounds. + * + * - if the shared depot has any full magazines, then return previousM (which + * is empty) to the depot, move loadedM to previousM, and install the + * full magazine we get from the depot as loadedM, then, as usual, return + * loaded--rounds. + * + * - otherwise access the memory layer directly to allocate a new object. + * + * Freeing an object "p" (for pointer) works thusly: + * + * - if the loadedM array is not full, put the object on top of it, that + * is, execute: loadedrounds++ = p. + * + * - exchange loadedM (full) with previousM and if the new loadedM is + * not full, then execute loadedrounds++ = p. + * + * - if the depot has any empty magazine, return previousM (which is full at + * this stage), move loadedM to previousM, load the empty magazine, + * install it as loadedM then execute loadedrounds++ = p. + * + * - additionally, if there is no empty magazine in the depot, a new one is + * allocated from the memory layer and stored in the depot. + * + * - otherwise access the memory layer to return the object "p" directly. + * + * Quoting the paper, and replacing "CPU" with "thread": + * + * "The key observation is that the only reason to load a new magazine is to + * replace a full with an empty or vice-versa, so we know that after each + * reload, the thread has a full loaded magazine and an empty previous magazine + * or vice-versa. The thread can therefore satisfy at least M allocations AND + * at least M frees entirely with the thread-local magazines before it must + * access the depot again, so the thread's layer's worst-case miss rate is + * bounded by 1/M, regardless of workload." + * + * The magazine layer is populated naturally by having new (empty) magazines + * created on the free path. It is not necessary to allocate full magazines, + * since empty magazines eventually end-up being filled by free operations. + * Therefore, it is the natural memory traffic that will create full magazines. + * + * The magazine size M can be dynamically resized, within boundaries (say with + * a minimum of 4 and a max of 256 items) by looking at how much contention + * happens in the shared depot layer. When the contention/sec exceeds a given + * threshold, the size M is increased: new magazines are sized with that new + * value and older magazines are freed whenever convenient. + * + * The size of the depot is monitored regularily, via a periodic callout event + * to compute the minimum amount of items in the full magazine list, and the + * minimum amount of items in the empty magazine list. Items in excess can + * then be put to the trash and freed, whenever convenient. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#include "tmalloc.h" + +#include "atomic.h" +#include "dump_options.h" +#include "eslist.h" +#include "evq.h" +#include "glib-missing.h" /* For pslist_free_null() */ +#include "log.h" +#include "omalloc.h" +#include "once.h" +#include "pslist.h" +#include "sha1.h" +#include "spinlock.h" +#include "stringify.h" +#include "thread.h" +#include "tm.h" +#include "unsigned.h" +#include "walloc.h" +#include "xmalloc.h" + +#include "override.h" /* Must be the last header included */ + +#define TMALLOC_PERIODIC 5003 /* ms: hearbeat period (prime) */ +#define TMALLOC_GC_PERIOD 997 /* ms: gc period (prime) */ +#define TMALLOC_TGC_PERIOD 10007 /* ms: thread gc period (prime) */ +#define TMALLOC_TGC_IDLE 30 /* s: idle time before clearing */ +#define TMALLOC_BEAT_THRESHOLD 20 /* s: reaction period */ +#define TMALLOC_CONTENTIONS 1.0 /* target is 1/sec max */ +#define TMALLOC_MINMAX_PERIODS 6 /* consecutive min/max periods needed */ +#define TMALLOC_GC_MAG_COUNT 256 /* Magazines freed each GC run */ +#define TMALLOC_GC_OBJ_COUNT 256 /* Objects freed each GC run */ + +#define TMALLOC_MAG_LOADED 0 /* Index of the "loaded" magazine */ +#define TMALLOC_MAG_PREVIOUS 1 /* Index of the "previous" magazine */ +#define TMALLOC_MAG_EXTRA 2 /* Extra magazine we have around */ + +#define TMALLOC_MAG_MIN 4 /* Minimum magazine capacity */ +#define TMALLOC_MAG_MAX 256 /* Maximum magazine capacity */ +#define TMALLOC_MAG_MEMORY 8192 /* Ideal memory "used" by magazine */ +#define TMALLOC_MAG_MEMORY_MAX 65536 /* Max memory "used" by magazine */ + +#define TMALLOC_MAG_TRASH_MAX 4 /* Max trash */ + +static thread_key_t tmalloc_magazines_key; +static thread_key_t tmalloc_periodic_key; +static once_flag_t tmalloc_keys_inited; + +static uint32 tmalloc_debug = 0; /* Debugging level */ + +#define tmalloc_debugging(lvl) G_UNLIKELY(tmalloc_debug > (lvl)) + +/** + * Allocation statistics (per allocator). + */ +struct tmalloc_stats { + AU64(tmas_allocations); /* Total amount of object allocations */ + AU64(tmas_allocations_zeroed); /* Total amount of zeroed allocations */ + AU64(tmas_depot_allocations); /* Allocations via the depot layer */ + AU64(tmas_depot_trashings); /* Objects trashed to depot by tmfree() */ + AU64(tmas_freeings); /* Total amount of object freeings */ + AU64(tmas_freeings_list); /* Total amount of list freeings */ + AU64(tmas_freeings_list_count); /* Amount of blocks freed via list */ + AU64(tmas_threads); /* Total amount of threads attached */ + AU64(tmas_contentions); /* Total amount of lock contentions */ + AU64(tmas_preemptions); /* Counts "concurrent" signal processing */ + AU64(tmas_capacity_increased); /* Increased magazine capacity */ + AU64(tmas_object_trash_reused); /* Amount of trahsed object reused */ + AU64(tmas_empty_trash_reused); /* Empty trahsed magazines reused */ + AU64(tmas_mag_allocated); /* Total amount of magazines allocated */ + AU64(tmas_mag_freed); /* Total amount of magazines freed */ + AU64(tmas_mag_trashed); /* Total amount of magazines trashed */ + AU64(tmas_mag_unloaded); /* Total amount of magazines unloaded */ + AU64(tmas_mag_empty_trashed); /* Empty magazines trashed */ + AU64(tmas_mag_empty_freed); /* Empty magazines freed */ + AU64(tmas_mag_empty_loaded); /* Total amount of empty magazines loaded */ + AU64(tmas_mag_full_rebuilt); /* Full magazines rebuilt from trash */ + AU64(tmas_mag_full_trashed); /* Full magazines trashed */ + AU64(tmas_mag_full_freed); /* Full magazines freed */ + AU64(tmas_mag_full_loaded); /* Total amount of full magazines loaded */ + AU64(tmas_mag_used_freed); /* Neither empty nor full magazines freed */ + AU64(tmas_mag_bad_capacity); /* Magazines freed due to bad capacity */ +}; + +/** + * Magazine list (either empty or full). + */ +struct tma_list { + eslist_t tml_list; /* The magazine list itself */ + eslist_t tml_trash; /* The magazine trash list */ + size_t tml_min; /* Minimum list count */ + size_t tml_max; /* Maximum list count */ +}; + +enum tmalloc_magic { TMALLOC_MAGIC = 0x4aeecb45 }; + +/** + * A TM allocator (magazine depot). + */ +struct tmalloc_depot { + enum tmalloc_magic tma_magic; + const char *tma_name; /* Name of the allocator (read-only copy) */ + size_t tma_size; /* Size of objects being allocated */ + slink_t tma_slk; /* Links all TM depots */ + + /* thread layer */ + thread_key_t tma_key; /* Local thread key for the thread layer */ + + /* depot layer */ + int tma_mag_capacity; /* The ideal magazine capacity "M" */ + int tma_threads; /* Amount of threads using this allocator */ + int tma_magazines; /* Magazines currently used by threads */ + size_t tma_contentions; /* Contentions registered */ + size_t tmp_minmax_count; /* Periods used to monitor min/max values */ + struct tma_list tma_full; /* List of full magazines */ + struct tma_list tma_empty; /* List of empty magazines */ + void **tma_obj_trash; /* Trashed objects, when thread exits */ + size_t tma_obj_trash_count; /* Amount of trashed objects */ + time_t tma_last_contention; /* When we last reset the contention counter */ + cperiodic_t *tma_ev; /* Periodic heartbeat event */ + cperiodic_t *tma_gc_ev; /* Periodic garbage collector event */ + spinlock_t tma_lock; /* Thread-safe lock */ + + /* memory layer */ + alloc_fn_t tma_alloc; /* Memory allocation routine */ + free_size_fn_t tma_free; /* Memory free routine */ + + /* statistics */ + struct tmalloc_stats tma_stats; +}; + +static inline void +tmalloc_check(const tmalloc_t * const tma) +{ + g_assert(tma != NULL); + g_assert(TMALLOC_MAGIC == tma->tma_magic); +} + +/* + * These locks are used without contention monitoring. + * + * To account for contention at the depot level, use + * tmalloc_depot_lock_hidden() and tmalloc_depot_unlock_hidden(). + */ + +#define TMALLOC_LOCK(d) spinlock(&(d)->tma_lock) +#define TMALLOC_UNLOCK(d) spinunlock(&(d)->tma_lock) + +#define TMALLOC_LOCK_HIDDEN(d) spinlock_hidden(&(d)->tma_lock) +#define TMALLOC_UNLOCK_HIDDEN(d) spinunlock_hidden(&(d)->tma_lock) + +#define TMALLOC_STATS_INCX(t,v) AU64_INC(&(t)->tma_stats.tmas_##v) +#define TMALLOC_STATS_ADDX(t,v,n) AU64_ADD(&(t)->tma_stats.tmas_##v, n) + +enum tmalloc_magazine_magic { TMALLOC_MAGAZINE_MAGIC = 0x418b93ee }; + +/** + * A thread magazine. + */ +typedef struct tmalloc_magazine { + enum tmalloc_magazine_magic tmag_magic; + int tmag_capacity; /* Magazine capacity */ + int tmag_count; /* Amount of rounds in magazine */ + slink_t slk; /* Embedded list pointer */ + void *tmag_objects1; /* The object rounds (embedded in object) */ +} tmalloc_magazine_t; + +#define TMALLOC_OBJECT_OFFSET offsetof(tmalloc_magazine_t, tmag_objects) + +static inline void +tmalloc_magazine_check(const struct tmalloc_magazine * const tmag) +{ + g_assert(tmag != NULL); + g_assert(TMALLOC_MAGAZINE_MAGIC == tmag->tmag_magic); +} + +static inline void +tmalloc_magazine_check_magic(const struct tmalloc_magazine * const tmag) +{ + g_assert(TMALLOC_MAGAZINE_MAGIC == tmag->tmag_magic); +} + +enum tmalloc_thread_magic { TMALLOC_THREAD_MAGIC = 0x2fe3612d }; + +/** + * The thread layer part of the TM allocator (magazine round distribution). + */ +struct tmalloc_thread { + enum tmalloc_thread_magic tmt_magic; + uint tmt_stid; /* STID of thread, for cleanup only */ + time_t tmt_last_op; /* Last allocation / deallocation */ + tmalloc_t *tmt_depot; /* Our TM allocator */ + tmalloc_magazine_t *tmt_mag2; /* "loaded" and "previous" magazines */ + slink_t tmt_link; /* Links all thread layers in thread */ +}; + +static inline void +tmalloc_thread_check(const struct tmalloc_thread * const tmt) +{ + g_assert(tmt != NULL); + g_assert(TMALLOC_THREAD_MAGIC == tmt->tmt_magic); +} + +/** + * All the magazine depot are linked together so that we can collect statistics + * about them. + */ +static eslist_t tmalloc_vars = ESLIST_INIT(offsetof(tmalloc_t, tma_slk)); +static spinlock_t tmalloc_vars_slk = SPINLOCK_INIT; + +#define TMALLOC_VARS_LOCK spinlock(&tmalloc_vars_slk) +#define TMALLOC_VARS_UNLOCK spinunlock(&tmalloc_vars_slk) + +/** + * Set debug level. + */ +void +set_tmalloc_debug(uint32 level) +{ + tmalloc_debug = level; +} + +/** + * Add a new TM allocator to the global list. + */ +static void +tmalloc_vars_add(tmalloc_t *tm) +{ + tmalloc_check(tm); + + TMALLOC_VARS_LOCK; + eslist_append(&tmalloc_vars, tm); + TMALLOC_VARS_UNLOCK; +} + +/** + * @return whether magazine is empty (a NULL magazine is empty). + */ +static inline bool +tmalloc_magazine_is_empty(const tmalloc_magazine_t * const m) +{ + if G_UNLIKELY(NULL == m) + return TRUE; + + tmalloc_magazine_check_magic(m); + + return 0 == m->tmag_count; +} + +/** + * @return whether magazine is full (a NULL magazine is full). + */ +static inline bool +tmalloc_magazine_is_full(const tmalloc_magazine_t * const m) +{ + if G_UNLIKELY(NULL == m) + return TRUE; + + tmalloc_magazine_check_magic(m); + + return m->tmag_capacity == m->tmag_count; +} + +/** + * Compute the capacity of magazines given targeted amount of memory to be + * held and the individual object size. + * + * The capacity is always bounded by TMALLOC_MAG_MIN and TMALLOC_MAG_MAX. + * + * @param amount memory target for full magazine (object memory) + * @param size size of each object + */ +static int G_PURE +tmalloc_magazine_compute_capacity(size_t amount, size_t size) +{ + int capacity; + + capacity = amount / size; + capacity = MIN(capacity, TMALLOC_MAG_MAX); + + return MAX(capacity, TMALLOC_MAG_MIN); +} + +/** + * Computes the default (initial) capacity of magazines. + * + * @param size size of the objects being allocated + * + * @return suitable magazine capacity + */ +static int G_PURE +tmalloc_magazine_default_capacity(size_t size) +{ + /* + * Try to aim to a TMALLOC_MAG_MEMORY memory usage for the magazine when + * counting the amount of memory used by all the objects held at full + * capacity. + */ + + return tmalloc_magazine_compute_capacity(TMALLOC_MAG_MEMORY, size); +} + +/** + * Computes the maximum capacity of magazines. + * + * We wish to limit the amount of memory used by the objects held in the + * magazines to TMALLOC_MAG_MEMORY_MAX bytes. Since each thread can have + * at most two magazines full, this is memory that is not returned to the + * operating system if it remains unused, therefore we need to be careful. + * + * @param size size of the objects being allocated + * + * @return suitable magazine capacity + */ +static int G_PURE +tmalloc_magazine_max_capacity(size_t size) +{ + return tmalloc_magazine_compute_capacity(TMALLOC_MAG_MEMORY_MAX, size); +} + +/** + * Feee a magazine and the held objects, if any. + */ +static void +tmalloc_magazine_free(tmalloc_t *d, tmalloc_magazine_t *m) +{ + int i; + void **tail = NULL, **head = NULL; + + tmalloc_check(d); + tmalloc_magazine_check(m); + + TMALLOC_STATS_INCX(d, mag_freed); + if G_UNLIKELY(m->tmag_count == m->tmag_capacity) + TMALLOC_STATS_INCX(d, mag_full_freed); + else if G_LIKELY(0 == m->tmag_count) + TMALLOC_STATS_INCX(d, mag_empty_freed); + else + TMALLOC_STATS_INCX(d, mag_used_freed); + + m->tmag_magic = 0; /* Magazine no longer valid */ + + /* + * If there are objects in the magazine, they are not blindly freed. + * Rather we put them in a trash can where we will be able to either + * reuse them or asynchronously garbage collect them (hopefully from a + * concurrent thread so that we do not lose time here in the application + * thread). + */ + + for (i = 0; i < m->tmag_count; i++) { + void **p = m->tmag_objectsi; + g_assert(p != NULL); + + /* + * Chain the objects to free using their first pointer. + */ + + if G_UNLIKELY(NULL == tail) { + head = tail = p; + } else { + *p = head; + head = p; + } + } + + /* + * If there were objets in the magazine, insert them at at head of the + * object trash list. + */ + + if G_UNLIKELY(head != NULL) { + g_assert(tail != NULL); + TMALLOC_LOCK_HIDDEN(d); + d->tma_obj_trash_count += m->tmag_count; + *tail = d->tma_obj_trash; + d->tma_obj_trash = head; + TMALLOC_UNLOCK_HIDDEN(d); + } + + d->tma_free(m, + TMALLOC_OBJECT_OFFSET + m->tmag_capacity * sizeof m->tmag_objects0); +} + +/** + * Allocate a new (empty) magazine. + */ +static tmalloc_magazine_t * +tmalloc_magazine_alloc(tmalloc_t *d) +{ + tmalloc_magazine_t *m; + int cap; + + tmalloc_check(d); + + /* + * If there are trashed empty magazines, reuse one. + */ + + if G_UNLIKELY(0 != eslist_count(&d->tma_empty.tml_trash)) { + TMALLOC_LOCK_HIDDEN(d); + m = eslist_shift(&d->tma_empty.tml_trash); + TMALLOC_UNLOCK_HIDDEN(d); + + if G_LIKELY(m != NULL) { + tmalloc_magazine_check_magic(m); + g_assert(0 == m->tmag_count); + TMALLOC_STATS_INCX(d, empty_trash_reused); + return m; + } + + /* FALL THROUGH */ + } + + TMALLOC_STATS_INCX(d, mag_allocated); + + /* + * The m->tmag_objects array is embedded at the tail of the object hence + * we only need to allocate one block for the magazine. + */ + + cap = d->tma_mag_capacity; /* Current optimal capacity */ + + m = d->tma_alloc(TMALLOC_OBJECT_OFFSET + cap * sizeof m->tmag_objects0); + m->tmag_magic = TMALLOC_MAGAZINE_MAGIC; + m->tmag_capacity = cap; + m->tmag_count = 0; /* Allocates empty magazines */ + + return m; +} + +/** + * Lock depot (hidden lock), accounting contention. + * + * @note + * This is a macro to get accurate locking point in the file. + */ +#define tmalloc_depot_lock_hidden(d) G_STMT_START { \ + if G_UNLIKELY(!spinlock_hidden_try(&(d)->tma_lock)) { \ + TMALLOC_STATS_INCX(d, contentions); \ + spinlock_hidden(&(d)->tma_lock); \ + (d)->tma_contentions++; \ + } \ +} G_STMT_END + +/** + * Unlock depot. + */ +static inline void +tmalloc_depot_unlock_hidden(tmalloc_t *d) +{ + spinunlock_hidden(&d->tma_lock); +} + +/** + * Give empty magazine back to the depot and get a new full magazine. + * + * @param d the depot to which we're returning the magazine + * @param m the empty magazine (may be NULL) + * + * @return new full magazine, or NULL if none were found. + */ +static tmalloc_magazine_t * +tmalloc_depot_return_empty(tmalloc_t *d, tmalloc_magazine_t *m) +{ + tmalloc_magazine_t *fm; + bool free_magazine = FALSE; + + tmalloc_check(d); + + tmalloc_depot_lock_hidden(d); + + fm = eslist_shift(&d->tma_full.tml_list); /* Full magazine (or NULL) */ + + if G_LIKELY(m != NULL) { + tmalloc_magazine_check_magic(m); + g_assert(0 == m->tmag_count); + + /* + * If the magazine no longer has the ideal capacity, free it. + */ + + if G_UNLIKELY(m->tmag_capacity != d->tma_mag_capacity) + free_magazine = TRUE; + else + eslist_prepend(&d->tma_empty.tml_list, m); + + d->tma_magazines--; /* Thread returned a magazine */ + } + + /* + * If there are no full magazines in stock but we have empty magazines + * and there are enough trashed objects to fill the empty magazine, + * create a full magazine out of it. + */ + + if G_UNLIKELY( + NULL == fm && + d->tma_obj_trash_count >= UNSIGNED(d->tma_mag_capacity) + ) { + fm = eslist_shift(&d->tma_empty.tml_list); + + if G_LIKELY(fm != NULL) { + int n = fm->tmag_capacity; + + TMALLOC_STATS_ADDX(d, object_trash_reused, n); + + while (n-- > 0) { + void **p = d->tma_obj_trash; + d->tma_obj_trash = *p; /* Next in the chain */ + d->tma_obj_trash_count--; + fm->tmag_objectsfm->tmag_count++ = p; + } + + g_assert(size_is_non_negative(d->tma_obj_trash_count)); + g_assert(fm->tmag_count == fm->tmag_capacity); /* Full magazine */ + + TMALLOC_STATS_INCX(d, mag_full_rebuilt); + } + } + + if G_LIKELY(fm != NULL) { + TMALLOC_STATS_INCX(d, mag_full_loaded); + d->tma_magazines++; /* Returning magazine to thread */ + } + + tmalloc_depot_unlock_hidden(d); + + if G_UNLIKELY(free_magazine) { + TMALLOC_STATS_INCX(d, mag_bad_capacity); + tmalloc_magazine_free(d, m); + } + + return fm; +} + +/** + * Give full magazine back to the depot and get a new empty magazine. + * + * When this routine is called, we're on the "free path" so it is OK to + * allocate a new (empty) magazine if there are none in the depot. + * + * @param d the depot to which we're returning the magazine + * @param m the full magazine (may be NULL) + * + * @return new empty magazine, allocated if needed. + */ +static tmalloc_magazine_t * +tmalloc_depot_return_full(tmalloc_t *d, tmalloc_magazine_t *m) +{ + tmalloc_magazine_t *em; + bool free_magazine = FALSE; + + tmalloc_check(d); + + tmalloc_depot_lock_hidden(d); + + em = eslist_shift(&d->tma_empty.tml_list); /* Empty magazine (or NULL) */ + + if G_LIKELY(m != NULL) { + tmalloc_magazine_check_magic(m); + g_assert(m->tmag_capacity == m->tmag_count); + + /* + * If the magazine mo longer has the ideal capacity, dispose of it. + */ + + if G_UNLIKELY(m->tmag_capacity != d->tma_mag_capacity) + free_magazine = TRUE; + else + eslist_prepend(&d->tma_full.tml_list, m); + } else { + d->tma_magazines++; /* We always return a new magazine */ + } + + tmalloc_depot_unlock_hidden(d); + + /* + * Dispose of empty magazine, if needed. + * + * Since the magazine is full, we do not dispose of the objects + * blindly, we put them into the trash so that they may be reused + * if needed, before they can be collected. + */ + + if G_UNLIKELY(free_magazine) { + TMALLOC_STATS_INCX(d, mag_bad_capacity); + tmalloc_magazine_free(d, m); + } + + /* + * If there was no empty magazine in the depot, allocate a new one. + */ + + if G_UNLIKELY(NULL == em) + em = tmalloc_magazine_alloc(d); + + TMALLOC_STATS_INCX(d, mag_empty_loaded); + + return em; +} + +/** + * Return a magazine to the depot, when a thread is exiting. + */ +static void +tmalloc_depot_return(tmalloc_t *d, tmalloc_magazine_t *m) +{ + bool free_magazine = TRUE; + + tmalloc_check(d); + tmalloc_magazine_check(m); + + /* + * If the magazine is empty or full, place it in the appropriate list. + * + * Note that we lock the depot here without monitoring for contention + * since this is an exceptional event (the thread is exiting). + */ + + TMALLOC_LOCK(d); + + g_assert(d->tma_magazines > 0); + d->tma_magazines--; + + if (0 == m->tmag_count) { + if G_LIKELY(m->tmag_capacity == d->tma_mag_capacity) { + eslist_prepend(&d->tma_empty.tml_list, m); + free_magazine = FALSE; + } + } else if (m->tmag_count == m->tmag_capacity) { + if G_LIKELY(m->tmag_capacity == d->tma_mag_capacity) { + eslist_prepend(&d->tma_full.tml_list, m); + free_magazine = FALSE; + } + } + + TMALLOC_UNLOCK(d); + + if (free_magazine) { + if G_UNLIKELY(m->tmag_capacity != d->tma_mag_capacity) + TMALLOC_STATS_INCX(d, mag_bad_capacity); + tmalloc_magazine_free(d, m); + } +} + +/** + * Unload magazine to the depot. + */ +static void +tmalloc_depot_unload(tmalloc_t *d, tmalloc_magazine_t *m, size_t i) +{ + bool free_magazine = FALSE; + + tmalloc_check(d); + tmalloc_magazine_check(m); + + if (tmalloc_debugging(1)) { + s_debug("%s(\"%s\"): unloading local thread magazine #%zu " + "in %s: %d/%d rounds", + G_STRFUNC, d->tma_name, i + 1, + thread_name(), m->tmag_count, m->tmag_capacity); + } + + TMALLOC_LOCK_HIDDEN(d); + + g_assert(d->tma_magazines > 0); + + d->tma_magazines--; + + /* + * The magazine may not be empty or full, and any objects held are put + * to the trash, hence we get one more empty magazine in the depot at + * the end. + */ + + while (m->tmag_count != 0) { + void **p = m->tmag_objects--m->tmag_count; + *p = d->tma_obj_trash; + d->tma_obj_trash = p; + d->tma_obj_trash_count++; + } + + /* + * If the magazine no longer has the ideal capacity, free it. + */ + + if G_UNLIKELY(m->tmag_capacity != d->tma_mag_capacity) + free_magazine = TRUE; + else + eslist_prepend(&d->tma_empty.tml_list, m); + + TMALLOC_UNLOCK_HIDDEN(d); + + TMALLOC_STATS_INCX(d, mag_unloaded); + + if (free_magazine) { + TMALLOC_STATS_INCX(d, mag_bad_capacity); + tmalloc_magazine_free(d, m); + } +} + +/** + * Allocate object directly from the depot's memory allocator. + * + * @param d the depot from which we're allocating memory. + */ +static void * +tmalloc_depot_alloc(tmalloc_t *d) +{ + tmalloc_check(d); + + TMALLOC_STATS_INCX(d, depot_allocations); + + /* + * If there are objects in the trash can, reuse them first. + */ + + if G_UNLIKELY(d->tma_obj_trash != NULL) { + void **p = NULL; + + TMALLOC_LOCK_HIDDEN(d); + if (d->tma_obj_trash != NULL) { + p = d->tma_obj_trash; + d->tma_obj_trash = *p; /* Next in the chain */ + d->tma_obj_trash_count--; + } + TMALLOC_UNLOCK_HIDDEN(d); + + if G_LIKELY(p != NULL) { + TMALLOC_STATS_INCX(d, object_trash_reused); + return p; + } + } + + return d->tma_alloc(d->tma_size); +} + +/** + * Put the object into the trash bin. + * + * @param d the thread magazine depot + * @param p the object to trash + */ +static void +tmalloc_depot_trash(tmalloc_t *d, void *p) +{ + TMALLOC_STATS_INCX(d, depot_trashings); + + TMALLOC_LOCK_HIDDEN(d); + *(void **) p = d->tma_obj_trash; + d->tma_obj_trash = p; + d->tma_obj_trash_count++; + TMALLOC_UNLOCK_HIDDEN(d); +} + +/** + * Put the object lisst into the trash bin. + * + * @param d the thread magazine depot + * @param pl the head of the list + */ +static void +tmalloc_depot_trash_pslist(tmalloc_t *d, pslist_t *pl) +{ + pslist_t *last; + size_t n; + + TMALLOC_STATS_INCX(d, depot_trashings); + + /* + * Because the plain one-way list places its ``next'' pointer at the + * head of the object, the list is naturally linked and there is little + * work to do: we just need to count the objects being inserted and + * update the last link pointer. + * + * Note that the pslist_t can be a plist_t, but thanks to structural + * equivalence, this does not matter at all, provided the objects are + * returned to the proper depot. + */ + + last = pslist_last(pl); + n = pslist_length(pl); + + TMALLOC_LOCK_HIDDEN(d); + last->next = (pslist_t *) d->tma_obj_trash; + d->tma_obj_trash = (void **) pl; + d->tma_obj_trash_count += n; + TMALLOC_UNLOCK_HIDDEN(d); +} + +/** + * Dispose of the thread layer structure. + * + * Invoked by the thread runtime when the thread exits to clear the value + * of the thread-local variable. + * + * @param data the thread-local value being cleared + */ +static void +tmalloc_thread_layer_free(void *data) +{ + struct tmalloc_thread *tmt = data; + tmalloc_t *d; + uint i; + + tmalloc_thread_check(tmt); + + d = tmt->tmt_depot; + tmalloc_check(d); + + if (tmalloc_debugging(10)) { + /* + * Use s_rawdebug() to avoid memory allocation on the thread exit path. + */ + + s_rawdebug("%s(\"%s\"): %s is exiting", + G_STRFUNC, d->tma_name, thread_name()); + } + + atomic_int_dec(&d->tma_threads); /* Thread is exiting */ + + for (i = 0; i < N_ITEMS(tmt->tmt_mag); i++) { + tmalloc_magazine_t *m = tmt->tmt_magi; + if (m != NULL) { + tmt->tmt_magi = NULL; + tmalloc_depot_return(d, m); + } + } + + tmt->tmt_magic = 0; + d->tma_free(tmt, sizeof *tmt); + + /* + * There is no need to remove the now destroyed "tmt" variable from + * the "tmagazines" list: that list is only maintained to quickly + * access all the "struct tmalloc_thread" objects created for a thread + * when garbage-collecting the unused magazines. + * + * The embedded list descriptor itself is held in a thread-local variable + * and will be cleared by tmalloc_thread_free_magazines(). + * + * Al the "struct tmalloc_thread" objects pertaining to the dying thread + * are therefore reclaimed not because they are part of the "tmagazines" + * list, but because they are indexed via a specific thread-local variable: + * the tma_key in the tmalloc_t object (the magazine depot). + */ +} + +static void +tmalloc_thread_free_periodic(void *data) +{ + evq_event_t *ev = data; + + evq_cancel(&ev); +} + +static void +tmalloc_thread_free_magazines(void *data) +{ + eslist_t *es = data; + + eslist_check(es); + XFREE_NULL(es); +} + +/** + * When a thread is exiting, make sure we cancel the periodic event before + * the thread runtime attempts to call the free routines on the local variables. + * + * This also prevents warnings about "future" events being reclaimed when a + * thread exits since threads have many thread magazine allocators, each + * registering an event in the event queue. + */ +static void +tmalloc_thread_exiting(void *unused_value, void *unused_ctx) +{ + (void) unused_value; + (void) unused_ctx; + + /* + * Setting the local variable to NULL will invoke the free routine + * registered on the key, which is tmalloc_thread_free_periodic(). + */ + + thread_local_set(tmalloc_periodic_key, NULL); +} + +/** + * Exchange magazines in thread layer and return the new loaded magazine. + */ +static inline tmalloc_magazine_t * +tmalloc_thread_magazine_exchange(struct tmalloc_thread *t) +{ + tmalloc_magazine_t *tmp = t->tmt_magTMALLOC_MAG_PREVIOUS; + + t->tmt_magTMALLOC_MAG_PREVIOUS = t->tmt_magTMALLOC_MAG_LOADED; + return t->tmt_magTMALLOC_MAG_LOADED = tmp; +} + +/** + * Allocate a new object in the thread layer. + * + * @param t the thread layer + * + * @return new object. + */ +static void * G_HOT +tmalloc_thread_alloc(struct tmalloc_thread *t) +{ + tmalloc_magazine_t *m; + + tmalloc_thread_check(t); + + /* + * We are in the thread owning these data structures, we do not need + * to take any locks here. However we must make sure we're safe in + * case we're receiving a signal. + */ + + t->tmt_last_op = tm_time(); + m = t->tmt_magTMALLOC_MAG_LOADED; + + if G_UNLIKELY(tmalloc_magazine_is_empty(m)) { + /* + * Loaded magazine is empty, try with "previous" then. + */ + + m = tmalloc_thread_magazine_exchange(t); /* "previous" */ + + if G_UNLIKELY(tmalloc_magazine_is_empty(m)) { + tmalloc_magazine_t *om; + + /* + * Both magazines are empty, return empty magazine to the + * depot and get a new full magazine. + */ + + t->tmt_magTMALLOC_MAG_LOADED = NULL; + m = tmalloc_depot_return_empty(t->tmt_depot, m); + om = t->tmt_magTMALLOC_MAG_LOADED; + t->tmt_magTMALLOC_MAG_LOADED = m; + + /* + * Check for "concurrent" allocation done in a signal handler + * whilst in tmalloc_depot_return_empty(). + */ + + if G_UNLIKELY(om != NULL) { + tmalloc_magazine_check_magic(om); + TMALLOC_STATS_INCX(t->tmt_depot, preemptions); + + if (NULL == m && !tmalloc_magazine_is_empty(om)) + m = t->tmt_magTMALLOC_MAG_LOADED = om; + else + tmalloc_depot_unload(t->tmt_depot, om, TMALLOC_MAG_EXTRA); + } + + /* + * If no magazine was available in the depot, then allocate + * directly from the depot's memory allocator. + */ + + if G_UNLIKELY(NULL == m) + return tmalloc_depot_alloc(t->tmt_depot); + + /* + * Will allocate new object from the loaded magazine (full). + */ + + tmalloc_magazine_check_magic(m); + g_assert(m->tmag_capacity == m->tmag_count); + } + } + + g_assert(m->tmag_count > 0); + + return m->tmag_objects--m->tmag_count; +} + +/** + * Return object (i.e. free it) to the thread layer. + * + * @param t the thread layer + * @param p the object being returned + */ +static void G_HOT +tmalloc_thread_free(struct tmalloc_thread *t, void *p) +{ + tmalloc_magazine_t *m; + + tmalloc_thread_check(t); + g_assert(p != NULL); + + /* + * We are in the thread owning these data structures, we do not need + * to take any locks here. However we must make sure we're safe in + * case we're receiving a signal. + */ + + t->tmt_last_op = tm_time(); + m = t->tmt_magTMALLOC_MAG_LOADED; + + if G_UNLIKELY(tmalloc_magazine_is_full(m)) { + /* + * Loaded magazine is full, try with "previous" then. + */ + + m = tmalloc_thread_magazine_exchange(t); /* "previous" */ + + if G_UNLIKELY(tmalloc_magazine_is_full(m)) { + tmalloc_magazine_t *om; + + /* + * Both magazines are full, return full magazine to the + * depot and get a new empty magazine. + */ + + t->tmt_magTMALLOC_MAG_LOADED = NULL; + m = tmalloc_depot_return_full(t->tmt_depot, m); + om = t->tmt_magTMALLOC_MAG_LOADED; + t->tmt_magTMALLOC_MAG_LOADED = m; + + /* + * Check for "concurrent" allocation done in a signal handler + * whilst in tmalloc_depot_return_empty(). + */ + + if G_UNLIKELY(om != NULL) { + tmalloc_magazine_check_magic(om); + TMALLOC_STATS_INCX(t->tmt_depot, preemptions); + tmalloc_depot_unload(t->tmt_depot, om, TMALLOC_MAG_EXTRA); + } + + /* + * Will free object to the loaded magazine (empty). + */ + + tmalloc_magazine_check(m); /* Empty magazine allocated */ + g_assert(0 == m->tmag_count); + } + } + + g_assert(m->tmag_count < m->tmag_capacity); + + m->tmag_objectsm->tmag_count++ = p; +} + +/** + * Clear thread magazines when no operations happened for some time. + * + * @note + * This is invoked within the context of the thread, so this is perfectly + * safe and no race condition can happen with operations on the same thread. + */ +static void +tmalloc_thread_clear(struct tmalloc_thread *tmt) +{ + tmalloc_t *d; + size_t i; + + tmalloc_thread_check(tmt); + + d = tmt->tmt_depot; + tmalloc_check(d); + + if (tmalloc_debugging(3)) { + s_debug("%s(\"%s\"): last operation was %u secs ago in %s", + G_STRFUNC, d->tma_name, + (uint) delta_time(tm_time(), tmt->tmt_last_op), thread_name()); + } + + for (i = 0; i < N_ITEMS(tmt->tmt_mag); i++) { + tmalloc_magazine_t *m = tmt->tmt_magi; + if (m != NULL) { + tmt->tmt_magi = NULL; + tmalloc_depot_unload(d, m, i); + } + } +} + +/** + * Trash the active list. + */ +static inline void +tmalloc_trash_list(struct tma_list *tl) +{ + eslist_prepend_list(&tl->tml_trash, &tl->tml_list); +} + +/** + * Update the min/max values of the list. + * + * @return the current active list count. + */ +static inline size_t +tmalloc_list_update_minmax(struct tma_list *tl) +{ + size_t count; + + count = eslist_count(&tl->tml_list); + + if G_UNLIKELY(count > tl->tml_max) + tl->tml_max = count; + + if G_UNLIKELY(count < tl->tml_min) + tl->tml_min = count; + + return count; +} + +/** + * Purge list if we have more items than the derived working set. + * + * @return the amount of purged items. + */ +static inline size_t +tmalloc_list_purge(struct tma_list *tl) +{ + size_t working_set = tl->tml_max - tl->tml_min; + size_t count, purged = 0; + + if (working_set < (count = eslist_count(&tl->tml_list))) { + size_t n = count - working_set; + + purged = n; + + while (n-- != 0) { + tmalloc_magazine_t *m = eslist_shift(&tl->tml_list); + eslist_prepend(&tl->tml_trash, m); + } + } + + tl->tml_max = tl->tml_min = eslist_count(&tl->tml_list); + + return purged; +} + +/** + * @return whether magazine depot has garbage to collect. + */ +static bool +tmalloc_has_garbage(const tmalloc_t *d) +{ + return + 0 != d->tma_obj_trash_count || + 0 != eslist_count(&d->tma_full.tml_trash) || + 0 != eslist_count(&d->tma_empty.tml_trash); +} + +/** + * Extract magazines from the trash list and put them in the supplied list. + * + * @param tl the allocation depot list + * @param dl destination list + * @param n max amount of items to extract + */ +static void +tmalloc_list_extract_trash(struct tma_list *tl, eslist_t *dl, size_t n) +{ + g_assert(0 == eslist_count(dl)); + g_assert(size_is_non_negative(n)); + + while (n-- != 0) { + tmalloc_magazine_t *m = eslist_shift(&tl->tml_trash); + + if G_UNLIKELY(NULL == m) + break; + + eslist_append(dl, m); + } +} + +/** + * List callback to free a magazine. + */ +static void +tmalloc_free_magazine(void *data, void *udata) +{ + tmalloc_magazine_t *m = data; + tmalloc_t *d = udata; + + tmalloc_magazine_free(d, m); +} + +/** + * Periodic event to incrementally collect garbage. + */ +static bool +tmalloc_gc(void *data) +{ + tmalloc_t *d = data; + void **objects = NULL; + size_t objcount = 0; + eslist_t full, empty; + bool again; + + tmalloc_check(d); + + if (tmalloc_debugging(4)) { + s_debug("%s(\"%s\"): trash={full=%zu, empty=%zu, objects=%zu}", + G_STRFUNC, d->tma_name, + eslist_count(&d->tma_full.tml_trash), + eslist_count(&d->tma_empty.tml_trash), + d->tma_obj_trash_count); + } + + eslist_init(&full, offsetof(tmalloc_magazine_t, slk)); + eslist_init(&empty, offsetof(tmalloc_magazine_t, slk)); + + TMALLOC_LOCK(d); + + /* + * Extract trashed magazines. + */ + + tmalloc_list_extract_trash(&d->tma_full, &full, TMALLOC_GC_MAG_COUNT); + tmalloc_list_extract_trash(&d->tma_empty, &empty, TMALLOC_GC_MAG_COUNT); + + /* + * Extract trashed objects. + */ + + while (d->tma_obj_trash != NULL && objcount < TMALLOC_GC_OBJ_COUNT) { + void **p = d->tma_obj_trash; + d->tma_obj_trash = *p; /* Next in chain */ + d->tma_obj_trash_count--; + *p = objects; /* Insert `p' at head of objects list */ + objects = p; /* Head of list */ + objcount++; + } + + g_assert(size_is_non_negative(d->tma_obj_trash_count)); + g_assert((NULL == d->tma_obj_trash) == (0 == d->tma_obj_trash_count)); + + TMALLOC_UNLOCK(d); + + /* + * Now that we have released the lock, free all these objects. + */ + + if (tmalloc_debugging(4)) { + s_debug("%s(\"%s\"): freeing={full=%zu, empty=%zu, objects=%zu}", + G_STRFUNC, d->tma_name, + eslist_count(&full), eslist_count(&empty), objcount); + } + + eslist_foreach(&full, tmalloc_free_magazine, d); + eslist_foreach(&empty, tmalloc_free_magazine, d); + + while (objects != NULL) { + void **p = objects; + objects = *p; + d->tma_free(p, d->tma_size); + objcount--; + } + + g_assert_log(0 == objcount, + "%s(\"%s\"): invalid trash object count, residual is %zd (expected 0)", + G_STRFUNC, d->tma_name, objcount); + + again = tmalloc_has_garbage(d); /* Keep calling whilst there is garbage */ + + if G_UNLIKELY(!again) { + if (tmalloc_debugging(4)) + s_debug("%s(\"%s\"): stopping GC", G_STRFUNC, d->tma_name); + d->tma_gc_ev = NULL; + } + + return again; +} + +static void tmalloc_thread_gc(void *); + +static void +tmalloc_thread_gc_install(void) +{ + evq_event_t *ev; + + ev = evq_insert(TMALLOC_TGC_PERIOD, tmalloc_thread_gc, NULL); + thread_local_set(tmalloc_periodic_key, ev); +} + +/** + * Regular per-thread event invoked by the event queue. + */ +static void +tmalloc_thread_gc(void *unused_data) +{ + tm_t start, end; + eslist_t *tmagazines; + struct tmalloc_thread *tmt; + time_t now; + + (void) unused_data; + + if (tmalloc_debugging(4)) { + tm_now_exact(&start); + s_debug("%s() in %s starting", G_STRFUNC, thread_name()); + } + + tmagazines = thread_local_get(tmalloc_magazines_key); + thread_local_set(tmalloc_periodic_key, NULL); /* Will cancel event */ + now = tm_time(); + + if G_UNLIKELY(NULL == tmagazines) { + s_warning_once_per(LOG_PERIOD_HOUR, + "%s(): missing thread magazine list in %s", + G_STRFUNC, thread_name()); + goto done; + } + + /* + * If any thread layer has not been performing any operation for the + * last TMALLOC_TGC_IDLE seconds, then clear its magazines to avoid + * keeping objects allocated in the magazines that never get used. This + * is especially important for the larger objects, or for large magazines. + */ + + ESLIST_FOREACH_DATA(tmagazines, tmt) { + tmalloc_thread_check(tmt); + + if G_UNLIKELY(delta_time(now, tmt->tmt_last_op) > TMALLOC_TGC_IDLE) + tmalloc_thread_clear(tmt); + } + + /* + * Schedule next event. + */ + +done: + tmalloc_thread_gc_install(); + + if (tmalloc_debugging(4)) { + tm_now_exact(&end); + s_debug("%s() in %s ending, took %u usecs", + G_STRFUNC, thread_name(), (unsigned) tm_elapsed_us(&end, &start)); + } +} + +/** + * Periodic beat invoked on the thread magazine layer. + */ +static bool +tmalloc_beat(void *data) +{ + tmalloc_t *d = data; + time_t now = tm_time(); + time_delta_t elapsed; + + tmalloc_check(d); + + if (tmalloc_debugging(3)) { + /* Don't lock, we can have dirty reads but we don't care */ + s_debug("%s(\"%s\"): M=%d, C=%zu, T=%d, full=%zu, empty=%zu, " + "trash={full=%zu, empty=%zu, objects=%zu}", + G_STRFUNC, d->tma_name, d->tma_mag_capacity, d->tma_contentions, + d->tma_threads, + eslist_count(&d->tma_full.tml_list), + eslist_count(&d->tma_empty.tml_list), + eslist_count(&d->tma_full.tml_trash), + eslist_count(&d->tma_empty.tml_trash), + d->tma_obj_trash_count); + } + + /* + * Recompute the average contention per seconds after some time. + */ + + elapsed = delta_time(now, d->tma_last_contention); + + if ( + elapsed >= TMALLOC_BEAT_THRESHOLD || + (elapsed > 0 && + d->tma_contentions / elapsed > (int) (5 * TMALLOC_CONTENTIONS)) + ) { + size_t contentions; + double rate; + + TMALLOC_LOCK_HIDDEN(d); + contentions = d->tma_contentions; + d->tma_contentions = 0; + d->tma_last_contention = now; + TMALLOC_UNLOCK_HIDDEN(d); + + rate = contentions / (double) elapsed; + + if (tmalloc_debugging(2)) { + s_debug("%s(\"%s\"): contentions=%zu in %u secs (%.2f/sec)", + G_STRFUNC, d->tma_name, contentions, (uint) elapsed, rate); + } + + /* + * If we have more lock contentions on the depot than our target, + * adjust the magazine capacity, then trash all the existing + * magazines in the depot (since they are of the wrong size now). + */ + + if ( + rate > TMALLOC_CONTENTIONS && + d->tma_mag_capacity < tmalloc_magazine_max_capacity(d->tma_size) + ) { + TMALLOC_LOCK_HIDDEN(d); + d->tma_mag_capacity++; + tmalloc_trash_list(&d->tma_full); + tmalloc_trash_list(&d->tma_empty); + TMALLOC_UNLOCK_HIDDEN(d); + + TMALLOC_STATS_INCX(d, capacity_increased); + + if (tmalloc_debugging(1)) { + s_debug("%s(\"%s\"): M increased to %d", + G_STRFUNC, d->tma_name, d->tma_mag_capacity); + } + } + } + + /* + * Monitor min-max for the full and empty magazine lists. + */ + + { + size_t full_purged = 0, empty_purged = 0; + + TMALLOC_LOCK_HIDDEN(d); + + full_purged = tmalloc_list_update_minmax(&d->tma_full); + empty_purged = tmalloc_list_update_minmax(&d->tma_empty); + d->tmp_minmax_count++; + + if G_UNLIKELY(d->tmp_minmax_count >= TMALLOC_MINMAX_PERIODS) { + full_purged = tmalloc_list_purge(&d->tma_full); + empty_purged = tmalloc_list_purge(&d->tma_empty); + } + + TMALLOC_UNLOCK_HIDDEN(d); + + if (tmalloc_debugging(0) && full_purged != 0) { + s_debug("%s(\"%s\"): purged %zu full magazine%s, %zu remaining", + G_STRFUNC, d->tma_name, full_purged, plural(full_purged), + eslist_count(&d->tma_full.tml_list)); + } + + if (tmalloc_debugging(0) && empty_purged != 0) { + s_debug("%s(\"%s\"): purged %zu empty magazine%s, %zu remaining", + G_STRFUNC, d->tma_name, empty_purged, plural(empty_purged), + eslist_count(&d->tma_empty.tml_list)); + } + } + + /* + * If we have trash, make sure we have a GC event. + */ + + if (tmalloc_has_garbage(d)) { + cperiodic_t *gc_ev = NULL; + bool installed = FALSE; + + if (NULL == d->tma_gc_ev) + gc_ev = evq_raw_periodic_add(TMALLOC_GC_PERIOD, tmalloc_gc, d); + + TMALLOC_LOCK_HIDDEN(d); + if (tmalloc_has_garbage(d) && NULL == d->tma_gc_ev) { + d->tma_gc_ev = gc_ev; + gc_ev = NULL; + installed = TRUE; + } + TMALLOC_UNLOCK_HIDDEN(d); + + cq_periodic_remove(&gc_ev); + + if (tmalloc_debugging(4) && installed) + s_debug("%s(\"%s\"): installed GC", G_STRFUNC, d->tma_name); + } + + return TRUE; /* Keep calling */ +} + +/** + * Initialize the magazine list. + */ +static inline void +tmalloc_list_init(struct tma_list *tl) +{ + eslist_init(&tl->tml_list, offsetof(tmalloc_magazine_t, slk)); + eslist_init(&tl->tml_trash, offsetof(tmalloc_magazine_t, slk)); +} + +/** + * Allocate a new thread magazine depot. + * + * @param name the name of the thread magazine allocator (copied) + * @param size size in bytes of objects created + * @param allocate memory allocator + * @param deallocate memory deallocator + * + * @return a new thread magazine layer suitable for allocating objects of + * the given size. + */ +tmalloc_t * +tmalloc_create(const char *name, size_t size, + alloc_fn_t allocate, free_size_fn_t deallocate) +{ + tmalloc_t *tma; + + g_assert(size_is_positive(size)); + g_assert(size >= sizeof(void *)); /* Need to chain objects */ + g_assert(allocate != NULL); + g_assert(deallocate != NULL); + + /* + * Once created, a thread magazine depot is never reclaimed, hence we + * use omalloc() to allocate its object. + */ + + OMALLOC0(tma); + tma->tma_magic = TMALLOC_MAGIC; + + /* + * All the threads attaching to this magazine depot will use this new + * thread-local key to store and retrieve their thread layer allocator. + * + * The thread-local key is never reclaimed since the depot is never freed. + * However, when a thread dies, the tmalloc_thread_exiting() cleanup + * callback will be invoked to reclaim the memory used by the thread-local + * variable stored in the thread under that key. + * + * There is only a fixed, limited, supply of thread-local keys available. + */ + + if (-1 == thread_local_key_create( + &tma->tma_key, tmalloc_thread_layer_free) + ) { + s_error("%s(): cannot create thread local key for \"%s\": %m", + G_STRFUNC, name); + } + + tma->tma_name = ostrdup_readonly(name); + tma->tma_size = size; + tma->tma_mag_capacity = tmalloc_magazine_default_capacity(size); + spinlock_init(&tma->tma_lock); + tma->tma_alloc = allocate; + tma->tma_free = deallocate; + tma->tma_ev = evq_raw_periodic_add(TMALLOC_PERIODIC, tmalloc_beat, tma); + tma->tma_last_contention = tm_time(); + tmalloc_list_init(&tma->tma_full); + tmalloc_list_init(&tma->tma_empty); + + tmalloc_vars_add(tma); + + /* + * Must log with s_rawdebug() here to avoid any memory allocation + * and use minimal resources, in order to avoid deadly recursions. + */ + + if (tmalloc_debugging(0)) { + s_rawdebug("%s(\"%s\"): handling %zu-byte objects, M=%d", + G_STRFUNC, tma->tma_name, tma->tma_size, tma->tma_mag_capacity); + } + + return tma; +} + +/** + * Free the magazine lists. + */ +static inline void +tmalloc_list_free(struct tma_list *tl, tmalloc_t *tma) +{ + eslist_foreach(&tl->tml_list, tmalloc_free_magazine, tma); + eslist_foreach(&tl->tml_trash, tmalloc_free_magazine, tma); +} + +/** + * Clear whole magazine lists, including the trash. + */ +static inline void +tmalloc_list_clear(struct tma_list *tl) +{ + eslist_clear(&tl->tml_list); + eslist_clear(&tl->tml_trash); + tl->tml_min = tl->tml_max = 0; +} + +/** + * Callback from thread_foreach_local() to reset the thread magazines. + */ +static void +tmalloc_reset_thread(const void *data, void *udata) +{ + struct tmalloc_thread *tmt = deconstify_pointer(data); /* Ouch! */ + tmalloc_t *tma = udata; + uint i; + + tmalloc_check(tma); + tmalloc_thread_check(tmt); + g_assert(tmt->tmt_depot == tma); + + /* + * We're accessing a data structure belonging to another thread, so + * we need to be careful because the other thread rightfully assumes + * total control over these data. + * + * What we want here is reset the magazines to NULL values and then + * free them. Because the thread is suspended, it's safe to reset + * its magazines: NULL is a valid value that is handled properly. + */ + + for (i = 0; i < N_ITEMS(tmt->tmt_mag); i++) { + tmalloc_magazine_t *m = tmt->tmt_magi; + + tmt->tmt_magi = NULL; /* Thread is suspended */ + atomic_int_dec(&tma->tma_magazines); + + if (m != NULL) { + if (tmalloc_debugging(1)) { + s_debug("%s(\"%s\"): reset thread magazine #%u in %s: " + "%d/%d rounds", + G_STRFUNC, tma->tma_name, i + 1, + thread_id_name(tmt->tmt_stid), + m->tmag_count, m->tmag_capacity); + } + tmalloc_magazine_free(tma, m); + } + } +} + +/** + * @return the size of blocks managed by this thread magazine depot. + */ +size_t +tmalloc_size(const tmalloc_t *tma) +{ + tmalloc_check(tma); + + return tma->tma_size; +} + +/** + * Reset the thread magazine layer by reclaiming all the pending magazines + * and their embedded objects, plus the remaining trash. + */ +void +tmalloc_reset(tmalloc_t *tma) +{ + struct tma_list full, empty; + void **obj_trash; + size_t n; + struct tmalloc_thread *tmt; + + tmalloc_check(tma); + + /* + * Atomically reset the layer. + */ + + TMALLOC_LOCK(tma); + full = tma->tma_full; /* struct copy */ + empty = tma->tma_empty; /* struct copy */ + tmalloc_list_clear(&tma->tma_full); + tmalloc_list_clear(&tma->tma_empty); + if (evq_is_inited()) /* Not at shutdown time */ + cq_periodic_remove(&tma->tma_gc_ev); /* Trash is being collected */ + else + tma->tma_gc_ev = NULL; /* Queue is gone */ + TMALLOC_UNLOCK(tma); + + /* + * Now dispose of the trash... + */ + + if (tmalloc_debugging(0)) { + s_debug("%s(\"%s\"): %d thread%s, " + "full=%zu+%zu, empty=%zu+%zu, objects=%zu", + G_STRFUNC, tma->tma_name, + tma->tma_threads, plural(tma->tma_threads), + eslist_count(&full.tml_list), eslist_count(&full.tml_trash), + eslist_count(&empty.tml_list), eslist_count(&empty.tml_trash), + tma->tma_obj_trash_count); + } + + tmalloc_list_free(&full, tma); + tmalloc_list_free(&empty, tma); + + /* + * We cannot safely access the two magazines from other threads, but we + * can at least clear the two ones in the current thread. + */ + + tmt = thread_local_get(tma->tma_key); + if (tmt != NULL) { + size_t i; + + for (i = 0; i < N_ITEMS(tmt->tmt_mag); i++) { + tmalloc_magazine_t *m = tmt->tmt_magi; + if (m != NULL) { + if (tmalloc_debugging(1)) { + s_debug("%s(\"%s\"): clearing local thread magazine #%zu " + "in %s: %d/%d rounds", + G_STRFUNC, tma->tma_name, i + 1, + thread_id_name(tmt->tmt_stid), + m->tmag_count, m->tmag_capacity); + } + tmt->tmt_magi = NULL; + tmalloc_magazine_free(tma, m); + } + } + } + + /* + * For the other threads, we're going to iterate over suspended threads + * to reset their magazines atomically. Chances are they will no longer + * wake up anyway, because we're shutting down. + * + * Without thread_foreach_local(), it would be much harder to do that + * safely because we would not know whether the thread using the structure + * is active or not, and it would force us to link from the depot all the + * thread structures. It's cleaner that way. + */ + + thread_foreach_local(tma->tma_key, + THREAD_LOCAL_SKIP_SELF | THREAD_LOCAL_SUSPENDED, + tmalloc_reset_thread, tma); + + /* + * The above filled in the object trash when processing full magazines. + */ + + TMALLOC_LOCK(tma); + obj_trash = tma->tma_obj_trash; + tma->tma_obj_trash = NULL; + n = tma->tma_obj_trash_count; + tma->tma_obj_trash_count = 0; + TMALLOC_UNLOCK(tma); + + if (tmalloc_debugging(0) && n != 0) { + s_debug("%s(\"%s\"): clearing objects=%zu", + G_STRFUNC, tma->tma_name, n); + } + + /* + * Finally dispose of the trashed objects. + */ + + while (obj_trash != NULL) { + void **p = obj_trash; + obj_trash = *p; + tma->tma_free(p, tma->tma_size); + n--; + } + + g_assert_log(0 == n, + "%s(\"%s\"): invalid trash object count, residual is %zd (expected 0)", + G_STRFUNC, tma->tma_name, n); +} + +/** + * Initialize the thread-local keys used to store the magazine list and the + * registered thread gc event. + */ +static void +tmalloc_keys_init_once(void) +{ + if (-1 == thread_local_key_create( + &tmalloc_magazines_key, tmalloc_thread_free_magazines) + ) { + s_error("%s(): cannot create thread local key: %m", G_STRFUNC); + } + + if (-1 == thread_local_key_create( + &tmalloc_periodic_key, tmalloc_thread_free_periodic) + ) { + s_error("%s(): cannot create thread local key: %m", G_STRFUNC); + } +} + +/* + * Allocate a new thread-magazine allocator for the thread. + * + * @param tma the magazine depot + * + * @return new thread-local magazine allocator, NULL if thread is exiting. + */ +static struct tmalloc_thread * +tmalloc_thread_create(tmalloc_t *tma) +{ + struct tmalloc_thread *tmt; + eslist_t *tmagazines; + + /* + * Refuse to create a new thread-local layer if we're in an exiting thread. + * If we do not reuse this thread ID for long time, we could miss the + * reclaim of memory, which will remain unused (contents of the magazines). + * + * On a thread exit path, nobody should be creating new objects anyway, + * and frees should go back to the trash in the magazine depot where it + * can be collected later or reused to fill empty magazines. + * + * This check is cheap since we're called once per thread and per allocator. + */ + + if G_UNLIKELY(thread_is_exiting()) + return NULL; + + /* + * If the event queue is not ready, no need to create a new thread-local + * layer, we won't be able to schedule garbage collecting. + */ + + if G_UNLIKELY(!evq_is_inited()) + return NULL; + + /* + * This thread-local value is set once for each thread, for a given + * thread magazine layer. + * + * @note + * The tmt_stid field is not required for normal operations but is just + * used during tmalloc_reset() to log the thread name when resetting + * its private magazines. + */ + + tmt = tma->tma_alloc(sizeof *tmt); + ZERO(tmt); + tmt->tmt_magic = TMALLOC_THREAD_MAGIC; + tmt->tmt_stid = thread_small_id(); + tmt->tmt_depot = tma; + atomic_int_inc(&tma->tma_threads); + + TMALLOC_STATS_INCX(tma, threads); + + thread_local_set(tma->tma_key, tmt); + + if (tmalloc_debugging(2)) { + s_debug("%s(\"%s\"): new local layer for %s", + G_STRFUNC, tma->tma_name, thread_name()); + } + + /* + * Each thread using the thread magazine allocators is also equipped with + * two local variables: + * + * tmalloc_magazines_key points to the eslist_t allocated for the + * thread to list all the known thread magazines. + * + * tmalloc_periodic_key is the cperiodic_t event which monitors all + * the thread magazines of the thread to release magazines when the + * thread is not allocating nor freeing any objects for a while. + */ + + ONCE_FLAG_RUN(tmalloc_keys_inited, tmalloc_keys_init_once); + + tmagazines = thread_local_get(tmalloc_magazines_key); + + if G_UNLIKELY(NULL == tmagazines) { + XMALLOC(tmagazines); + eslist_init(tmagazines, offsetof(struct tmalloc_thread, tmt_link)); + thread_local_set(tmalloc_magazines_key, tmagazines); + tmalloc_thread_gc_install(); + + /* + * We need to cleanup our internal events at exit time, before the + * thread runtime decides to free the local variables. + * + * Note that this is done only once per thread, regardless of how many + * thread magazine allocators are used by the thread since only the + * first attempt at using any thread magazine alllocator will create + * the magazine list, entering this "if" statement. + * + * Because we register that callback after tmalloc_thread_gc_install(), + * we know that it will be run before any exiting callback used by + * the event queue (execution order is LIFO). + */ + + thread_atexit(tmalloc_thread_exiting, NULL); + } + + eslist_append(tmagazines, tmt); + + return tmt; +} + +/** + * @return the thread-local magazine allocator to use. + */ +static struct tmalloc_thread * +tmalloc_thread_get(tmalloc_t *tma) +{ + struct tmalloc_thread *tmt = thread_local_get(tma->tma_key); + + if G_UNLIKELY(NULL == tmt) + tmt = tmalloc_thread_create(tma); + + return tmt; +} + +/** + * Allocate a new object. + * + * @param tma the thread magazine allocator + * + * @return pointer to new object. + */ +void * +tmalloc(tmalloc_t *tma) +{ + struct tmalloc_thread *tmt; + + tmalloc_check(tma); + + tmt = tmalloc_thread_get(tma); + TMALLOC_STATS_INCX(tma, allocations); + + /* + * If for some reasone we cannot create the local thread layer, probably + * because the thread is exiting, then allocate from the depot's allocator. + */ + + if G_UNLIKELY(NULL == tmt) + return tmalloc_depot_alloc(tma); + + return tmalloc_thread_alloc(tmt); +} + +/** + * Allocate a new object, zeroed. + * + * @param tma the thread magazine allocator + * + * @return pointer to new object. + */ +void * +tmalloc0(tmalloc_t *tma) +{ + void *p; + + p = tmalloc(tma); + memset(p, 0, tma->tma_size); + + TMALLOC_STATS_INCX(tma, allocations_zeroed); + + return p; +} + +/** + * Free an object. + * + * @param tma the thread magazine allocator + * @param p the object being freed + */ +void +tmfree(tmalloc_t *tma, void *p) +{ + struct tmalloc_thread *tmt; + + tmalloc_check(tma); + + tmt = tmalloc_thread_get(tma); + TMALLOC_STATS_INCX(tma, freeings); + + /* + * If for some reason we cannot create the local thread layer, probably + * because the thread is exiting, then put the object in the depot's trash. + */ + + if G_UNLIKELY(NULL == tmt) { + tmalloc_depot_trash(tma, p); + return; + } + + tmalloc_thread_free(tmt, p); +} + +/** + * Free a plain list of objects. + * + * @param tma the thread magazine allocator + * @param pl the head of the list + */ +void +tmfree_pslist(tmalloc_t *tma, pslist_t *pl) +{ + struct tmalloc_thread *tmt; + pslist_t *l, *next; + size_t n; + + tmalloc_check(tma); + + tmt = tmalloc_thread_get(tma); + TMALLOC_STATS_INCX(tma, freeings); + TMALLOC_STATS_INCX(tma, freeings_list); + + /* + * If for some reason we cannot create the local thread layer, probably + * because the thread is exiting, then put the objects in the depot's trash. + */ + + if G_UNLIKELY(NULL == tmt) { + tmalloc_depot_trash_pslist(tma, pl); + return; + } + + /* + * Note that the pslist_t could actually be a plist_t, but this does + * not matter because the l->next field is at the same memory location + * in both structures, thanks to structural equivalence. + */ + + for (l = pl, n = 0; l != NULL; l = next, n++) { + next = l->next; + tmalloc_thread_free(tmt, l); + } + + TMALLOC_STATS_ADDX(tma, freeings_list_count, n); +} + +/** + * Free an embedded list of objects. + * + * @param tma the thread magazine allocator + * @param el the list descriptor + */ +void +tmfree_eslist(tmalloc_t *tma, eslist_t *el) +{ + struct tmalloc_thread *tmt; + void *p, *next; + size_t n; + + tmalloc_check(tma); + + tmt = tmalloc_thread_get(tma); + TMALLOC_STATS_INCX(tma, freeings); + TMALLOC_STATS_INCX(tma, freeings_list); + + /* + * If for some reason we cannot create the local thread layer, probably + * because the thread is exiting, then put the objects in the depot's trash. + */ + + if G_UNLIKELY(NULL == tmt) { + for (p = eslist_head(el); p != NULL; p = next) { + next = eslist_next_data(el, p); + tmalloc_depot_trash(tma, p); + } + return; + } + + for (p = eslist_head(el), n = 0; p != NULL; p = next, n++) { + next = eslist_next_data(el, p); + tmalloc_thread_free(tmt, p); + } + + g_assert(n == eslist_count(el)); + + TMALLOC_STATS_ADDX(tma, freeings_list_count, n); +} + +/** + * Retrieve thread magazine depot information. + * + * @return list of tmalloc_info_t that must be freed by calling the + * tmalloc_info_list_free_null() routine. + */ +pslist_t * +tmalloc_info_list(void) +{ + pslist_t *sl = NULL; + tmalloc_t *d; + + TMALLOC_VARS_LOCK; + + ESLIST_FOREACH_DATA(&tmalloc_vars, d) { + tmalloc_info_t *tmi; + + tmalloc_check(d); + + WALLOC0(tmi); + tmi->magic = TMALLOC_INFO_MAGIC; + + TMALLOC_LOCK(d); + + tmi->name = d->tma_name; + tmi->size = d->tma_size; + tmi->attached = d->tma_threads; + tmi->magazines = d->tma_magazines; + tmi->mag_capacity = d->tma_mag_capacity; + tmi->mag_full = eslist_count(&d->tma_full.tml_list); + tmi->mag_empty = eslist_count(&d->tma_empty.tml_list); + tmi->mag_full_trash = eslist_count(&d->tma_full.tml_trash); + tmi->mag_empty_trash = eslist_count(&d->tma_empty.tml_trash); + tmi->mag_object_trash = d->tma_obj_trash_count; + +#define STATS_COPY(name) tmi->name = AU64_VALUE(&d->tma_stats.tmas_ ## name) + + STATS_COPY(allocations); + STATS_COPY(allocations_zeroed); + STATS_COPY(depot_allocations); + STATS_COPY(depot_trashings); + STATS_COPY(freeings); + STATS_COPY(freeings_list); + STATS_COPY(freeings_list_count); + STATS_COPY(threads); + STATS_COPY(contentions); + STATS_COPY(object_trash_reused); + STATS_COPY(empty_trash_reused); + STATS_COPY(mag_allocated); + STATS_COPY(mag_freed); + STATS_COPY(mag_trashed); + STATS_COPY(mag_unloaded); + STATS_COPY(mag_empty_trashed); + STATS_COPY(mag_empty_freed); + STATS_COPY(mag_empty_loaded); + STATS_COPY(mag_full_rebuilt); + STATS_COPY(mag_full_trashed); + STATS_COPY(mag_full_freed); + STATS_COPY(mag_full_loaded); + STATS_COPY(mag_used_freed); + STATS_COPY(mag_bad_capacity); + +#undef STATS_COPY + + TMALLOC_UNLOCK(d); + + sl = pslist_prepend(sl, tmi); + } + + TMALLOC_VARS_UNLOCK; + + return pslist_reverse(sl); +} + +static void +tmalloc_info_free(void *data, void *udata) +{ + tmalloc_info_t *tmi = data; + + (void) udata; + + tmalloc_info_check(tmi); + WFREE(tmi); +} + +/** + * Free list created by tmalloc_info_list() and nullify pointer. + */ +void +tmalloc_info_list_free_null(pslist_t **sl_ptr) +{ + pslist_t *sl = *sl_ptr; + + pslist_foreach(sl, tmalloc_info_free, NULL); + pslist_free_null(sl_ptr); +} + +/** + * Build consolidated statistics across all the depots. + * + * @param stats the stats structure to fill + * + * @return the amount of depots. + */ +static size_t +tmalloc_all_stats(tmalloc_info_t *stats) +{ + tmalloc_t *d; + size_t depot_count; + + ZERO(stats); + + TMALLOC_VARS_LOCK; + + depot_count = eslist_count(&tmalloc_vars); + + ESLIST_FOREACH_DATA(&tmalloc_vars, d) { + tmalloc_check(d); + + TMALLOC_LOCK(d); + + stats->magazines += d->tma_magazines; + stats->mag_full += eslist_count(&d->tma_full.tml_list); + stats->mag_empty += eslist_count(&d->tma_empty.tml_list); + stats->mag_full_trash += eslist_count(&d->tma_full.tml_trash); + stats->mag_empty_trash += eslist_count(&d->tma_empty.tml_trash); + stats->mag_object_trash += d->tma_obj_trash_count; + +#define STATS_COPY(name) stats->name += AU64_VALUE(&d->tma_stats.tmas_ ## name) + + STATS_COPY(allocations); + STATS_COPY(allocations_zeroed); + STATS_COPY(depot_allocations); + STATS_COPY(depot_trashings); + STATS_COPY(freeings); + STATS_COPY(freeings_list); + STATS_COPY(freeings_list_count); + STATS_COPY(contentions); + STATS_COPY(preemptions); + STATS_COPY(object_trash_reused); + STATS_COPY(empty_trash_reused); + STATS_COPY(capacity_increased); + STATS_COPY(mag_allocated); + STATS_COPY(mag_freed); + STATS_COPY(mag_trashed); + STATS_COPY(mag_unloaded); + STATS_COPY(mag_empty_trashed); + STATS_COPY(mag_empty_freed); + STATS_COPY(mag_empty_loaded); + STATS_COPY(mag_full_rebuilt); + STATS_COPY(mag_full_trashed); + STATS_COPY(mag_full_freed); + STATS_COPY(mag_full_loaded); + STATS_COPY(mag_used_freed); + STATS_COPY(mag_bad_capacity); + +#undef STATS_COPY + + TMALLOC_UNLOCK(d); + } + + TMALLOC_VARS_UNLOCK; + + return depot_count; +} + +/** + * Generate a SHA1 digest of the current tmalloc statistics. + * + * This is meant for dynamic entropy collection. + */ +void +tmalloc_stats_digest(sha1_t *digest) +{ + tmalloc_info_t stats; + + tmalloc_all_stats(&stats); + SHA1_COMPUTE(stats, digest); +} + +/** + * Dump tmalloc statistics to specified log agent. + */ +void G_COLD +tmalloc_dump_stats_log(logagent_t *la, unsigned options) +{ + tmalloc_info_t stats; + size_t depot_count; + bool groupped = booleanize(options & DUMP_OPT_PRETTY); + +#define DUMPV(x) log_info(la, "TMALLOC %s = %s", #x, \ + size_t_to_string_grp(x, groupped)) + +#define DUMP(x) log_info(la, "TMALLOC %s = %s", #x, \ + uint64_to_string_grp(stats.x, groupped)) + + depot_count = tmalloc_all_stats(&stats); + + DUMP(allocations); + DUMP(allocations_zeroed); + DUMP(depot_allocations); + DUMP(depot_trashings); + DUMP(freeings); + DUMP(freeings_list); + DUMP(freeings_list_count); + DUMP(contentions); + DUMP(preemptions); + DUMPV(depot_count); + DUMP(magazines); + DUMP(object_trash_reused); + DUMP(empty_trash_reused); + DUMP(capacity_increased); + DUMP(mag_full); + DUMP(mag_empty); + DUMP(mag_full_trash); + DUMP(mag_empty_trash); + DUMP(mag_object_trash); + DUMP(mag_allocated); + DUMP(mag_freed); + DUMP(mag_trashed); + DUMP(mag_unloaded); + DUMP(mag_empty_trashed); + DUMP(mag_empty_freed); + DUMP(mag_empty_loaded); + DUMP(mag_full_rebuilt); + DUMP(mag_full_trashed); + DUMP(mag_full_freed); + DUMP(mag_full_loaded); + DUMP(mag_used_freed); + DUMP(mag_bad_capacity); + +#undef DUMP +#undef DUMPV +} + +/* + * Dump thread magazine allocator information to specified log-agent. + */ +static void +tmalloc_info_dump(void *data, void *udata) +{ + tmalloc_info_t *tmi = data; + logagent_t *la = udata; + + tmalloc_info_check(tmi); + +#define DUMPS(x) \ + log_info(la, "TMALLOC %19s = %'zu", #x, tmi->x) + +#define DUMPL(x) \ + log_info(la, "TMALLOC %19s = %s", #x, uint64_to_gstring(tmi->x)) + + log_info(la, "TMALLOC --- \"%s\" %zu-byte blocks M=%zu ---", + tmi->name, tmi->size, tmi->mag_capacity); + + DUMPS(attached); + DUMPS(magazines); + DUMPL(contentions); + DUMPL(preemptions); + DUMPL(allocations); + DUMPL(allocations_zeroed); + DUMPL(depot_allocations); + DUMPL(depot_trashings); + DUMPL(freeings); + DUMPL(freeings_list); + DUMPL(freeings_list_count); + DUMPL(threads); + DUMPL(object_trash_reused); + DUMPL(empty_trash_reused); + DUMPL(capacity_increased); + DUMPL(mag_full); + DUMPL(mag_empty); + DUMPL(mag_full_trash); + DUMPL(mag_empty_trash); + DUMPL(mag_object_trash); + DUMPL(mag_allocated); + DUMPL(mag_freed); + DUMPL(mag_trashed); + DUMPL(mag_unloaded); + DUMPL(mag_empty_trashed); + DUMPL(mag_empty_freed); + DUMPL(mag_empty_loaded); + DUMPL(mag_full_rebuilt); + DUMPL(mag_full_trashed); + DUMPL(mag_full_freed); + DUMPL(mag_full_loaded); + DUMPL(mag_used_freed); + DUMPL(mag_bad_capacity); + +#undef DUMPS +#undef DUMPL +} + +static int +tmalloc_info_size_cmp(const void *a, const void *b) +{ + const tmalloc_info_t *ai = a, *bi = b; + + return CMP(ai->size, bi->size); +} + +/** + * Dump per-depot magazine statistics to specified logagent. + */ +void G_COLD +tmalloc_dump_magazines_log(logagent_t *la) +{ + pslist_t *sl = tmalloc_info_list(); + + sl = pslist_sort(sl, tmalloc_info_size_cmp); + pslist_foreach(sl, tmalloc_info_dump, la); + tmalloc_info_list_free_null(&sl); +} + +/** + * Dump tmalloc statistics. + */ +void G_COLD +tmalloc_dump_stats(void) +{ + s_info("TMALLOC running statistics:"); + tmalloc_dump_stats_log(log_agent_stderr_get(), 0); + s_info("TMALLOC per-allocator statistics:"); + tmalloc_dump_magazines_log(log_agent_stderr_get()); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/tmalloc.h
Added
@@ -0,0 +1,124 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Thread Magazine allocator. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#ifndef _tmalloc_h_ +#define _tmalloc_h_ + +typedef struct tmalloc_depot tmalloc_t; + +enum tmalloc_info_magic { TMALLOC_INFO_MAGIC = 0x7e60619b }; + +/** + * Allocator information that can be retrieved. + */ +typedef struct { + enum tmalloc_info_magic magic; + const char *name; /**< Allocator's name (read-only) */ + size_t size; /**< Object size */ + size_t attached; /**< Threads currently using allocator */ + size_t magazines; /**< Magazines handed out to threads */ + size_t mag_capacity; /**< Current magazine capacity */ + size_t mag_full; /**< Amount of full magazines in depot */ + size_t mag_empty; /**< Amount of empty magazines in depot */ + size_t mag_full_trash; /**< Full magazines, trashed */ + size_t mag_empty_trash; /**< Empty magazines, trashed */ + size_t mag_object_trash; /**< Objects in the trash */ + uint64 allocations; /**< Total amount of object allocations */ + uint64 allocations_zeroed; /**< Allocations zeroed */ + uint64 depot_allocations; /**< Allocations made via the depot layer */ + uint64 depot_trashings; /**< Objects trashed to depot by tmfree() */ + uint64 freeings; /**< Amount of object freeings */ + uint64 freeings_list; /**< Amount of object freeings via list */ + uint64 freeings_list_count; /**< Total objects freed via list */ + uint64 threads; /**< Total amount of threads attached */ + uint64 contentions; /**< Total amount of lock contentions */ + uint64 preemptions; /**< Signal handler preemptions seen */ + uint64 object_trash_reused; /**< Amount of trashed objects reused */ + uint64 empty_trash_reused; /**< Empty trashed magazines reused */ + uint64 capacity_increased; /**< Magazine capacity increases */ + uint64 mag_allocated; /**< Total amount of magazines allocated */ + uint64 mag_freed; /**< Total amount of magazines freed */ + uint64 mag_trashed; /**< Total amount of magazines trashed */ + uint64 mag_unloaded; /**< Total amount of magazines unloaded */ + uint64 mag_empty_trashed; /**< Empty magazines trashed */ + uint64 mag_empty_freed; /**< Empty magazines freed */ + uint64 mag_empty_loaded; /**< Empty magazines loaded */ + uint64 mag_full_rebuilt; /**< Full magazines rebuilt from trash */ + uint64 mag_full_trashed; /**< Full magazines trashed */ + uint64 mag_full_freed; /**< Full magazines freed */ + uint64 mag_full_loaded; /**< Full magazines loaded */ + uint64 mag_used_freed; /**< Partially filled magazines freed */ + uint64 mag_bad_capacity; /**< Magazines freed due to bad capacity */ +} tmalloc_info_t; + +static inline void +tmalloc_info_check(const tmalloc_info_t * const tmi) +{ + g_assert(tmi != NULL); + g_assert(TMALLOC_INFO_MAGIC == tmi->magic); +} + +/* + * Public interface. + */ + +void set_tmalloc_debug(uint32 level); + +tmalloc_t *tmalloc_create(const char *name, size_t size, + alloc_fn_t allocate, free_size_fn_t deallocate); +void tmalloc_reset(tmalloc_t *tma); +size_t tmalloc_size(const tmalloc_t *tma); + +struct pslist; +struct eslist; + +void *tmalloc(tmalloc_t *tma) G_MALLOC; +void *tmalloc0(tmalloc_t *tma) G_MALLOC; +void tmfree(tmalloc_t *tma, void *p); +void tmfree_pslist(tmalloc_t *tma, struct pslist *pl); +void tmfree_eslist(tmalloc_t *tma, struct eslist *el); + +struct logagent; +struct sha1; + +void tmalloc_stats_digest(struct sha1 *digest); + +struct pslist *tmalloc_info_list(void); +void tmalloc_info_list_free_null(struct pslist **sl_ptr); +void tmalloc_dump_stats_log(struct logagent *la, unsigned options); +void tmalloc_dump_magazines_log(struct logagent *la); +void tmalloc_dump_stats(void); + +#endif /* _tmalloc_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/tokenizer.c
Added
@@ -0,0 +1,124 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * String tokenizer, using a binary search to lookup tokens in a sorted array. + * + * @author Raphael Manfredi + * @date 2014 + */ + +#include "common.h" + +#include "tokenizer.h" + +#include "misc.h" + +#include "override.h" /* Must be the last header included */ + +/** + * Lookup token in a sorted array of tokens. + * + * The string comparison function is supplied by the caller. + * + * @param s the input string + * @param cmp the string comparison function to use + * @param tvec the vector of tokenizer_t items, defining the tokens + * @param tcnt the amount of items in the token vector + * + * @return the token value if found, 0 if not found. + */ +unsigned +tokenizer_lookup_with(const char *s, strcmp_fn_t cmp, + const tokenizer_t *tvec, size_t tcnt) +{ +#define GET_KEY(i) (tvec(i).token) +#define FOUND(i) return tvec(i).value + + /* Perform a binary search to find ``s'' in tvec */ + BINARY_SEARCH(const char *, s, tcnt, (*cmp), GET_KEY, FOUND); + +#undef FOUND +#undef GET_KEY + + return 0; /* Not found */ +} + +/** + * Lookup token in a sorted array of tokens. + * + * @param s the input string + * @param tvec the vector of tokenizer_t items, defining the tokens + * @param tcnt the amount of items in the token vector + * + * @return the token value if found, 0 if not found. + */ +unsigned +tokenizer_lookup(const char *s, const tokenizer_t *tvec, size_t tcnt) +{ + return tokenizer_lookup_with(s, strcmp, tvec, tcnt); +} + +/** + * Check that token array is indeed sorted lexicographically (with supplied + * comparison routine). + * + * @param name the name of the array, in case we have to report error + * @param tvec the vector of tokenizer_t items + * @param tcnt the amount of items in the token vector + * @param cmp the string comparison routine to use + */ +void G_COLD +tokenizer_check_sorted_with(const char *name, + const tokenizer_t *tvec, size_t tcnt, strcmp_fn_t cmp) +{ + size_t i; + + for (i = 1; i < tcnt; i++) { + const tokenizer_t *prev = &tveci - 1, *e = &tveci; + + if G_UNLIKELY((*cmp)(prev->token, e->token) >= 0) { + g_error("tokenizer array \"%s\" unsorted " + "(item #%zu \"%s\" follows \"%s\")", + name, i + 1, e->token, prev->token); + } + } +} + +/** + * Check that token array is indeed sorted lexicographically (with strcmp). + * + * @param name the name of the array, in case we have to report error + * @param tvec the vector of tokenizer_t items + * @param tcnt the amount of items in the token vector + */ +void G_COLD +tokenizer_check_sorted(const char *name, const tokenizer_t *tvec, size_t tcnt) +{ + tokenizer_check_sorted_with(name, tvec, tcnt, strcmp); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/tokenizer.h
Added
@@ -0,0 +1,77 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * String tokenizer. + * + * From a static array of lexicographically-sorted strings, determine + * the numerical token value of a string, if it matches a known token string. + * + * The convention is that token 0 is RESERVED to mean "not found", i.e. the + * input string does not correspond to any token. + * + * @author Raphael Manfredi + * @date 2014 + */ + +#ifndef _tokenizer_h_ +#define _tokenizer_h_ + +/** + * A tokenizer item is a mapping between a string and a number (non-zero). + */ +typedef struct tokenizer { + const char *token; /**< The token string */ + unsigned value; /**< The token value associated with string */ +} tokenizer_t; + +/* + * Public interface. + */ + +unsigned tokenizer_lookup(const char *s, const tokenizer_t *tvec, size_t tcnt); +unsigned tokenizer_lookup_with(const char *s, strcmp_fn_t cmp, + const tokenizer_t *tvec, size_t tcnt); + +void tokenizer_check_sorted(const char *name, + const tokenizer_t *tvec, size_t tcnt); +void tokenizer_check_sorted_with(const char *name, + const tokenizer_t *tvec, size_t tcnt, strcmp_fn_t cmp); + +#define TOKENIZE(s, vec) tokenizer_lookup((s), (vec), N_ITEMS((vec))) + +#define TOKENIZE_WITH(s, c, vec) \ + tokenizer_lookup_with((s), (c), (vec), N_ITEMS((vec))) + +#define TOKENIZE_CHECK_SORTED(vec) \ + tokenizer_check_sorted(STRINGIFY(vec), (vec), N_ITEMS((vec))) + +#define TOKENIZE_CHECK_SORTED_WITH(vec, c) \ + tokenizer_check_sorted_with(STRINGIFY(vec), (vec), N_ITEMS((vec)), (c)) + +#endif /* _tokenizer_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/tqsort.c
Added
@@ -0,0 +1,479 @@ +/* + * Copyright (C) 1995 Sun Microsystems, Inc. + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Multi-threaded quicksort algorithm to speed-up sorting of large arrays. + * + * @author Richard Pettit <Richard.Pettit@West.Sun.COM> + * @date 1995 + * @author Raphael Manfredi + * @date 2013 + */ + +/* + * Multithreaded Demo Source + * + * Copyright (C) 1995 by Sun Microsystems, Inc. + * All rights reserved. + * + * This file is a product of SunSoft, Inc. and is provided for + * unrestricted use provided that this legend is included on all + * media and as a part of the software program in whole or part. + * Users may copy, modify or distribute this file at will. + * + * THIS FILE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING + * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * This file is provided with no support and without any obligation on the + * part of SunSoft, Inc. to assist in its use, correction, modification or + * enhancement. + * + * SUNSOFT AND SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT + * TO THE INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS + * FILE OR ANY PART THEREOF. + * + * IN NO EVENT WILL SUNSOFT OR SUN MICROSYSTEMS, INC. BE LIABLE FOR ANY + * LOST REVENUE OR PROFITS OR OTHER SPECIAL, INDIRECT AND CONSEQUENTIAL + * DAMAGES, EVEN IF THEY HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGES. + * + * SunSoft, Inc. + * 2550 Garcia Avenue + * Mountain View, California 94043 + * + * Adaptation to gtk-gnutella made by Raphael Manfredi, to adjust the thread + * creation interface to our thread run-time, to fix a bug (a 'i' was used + * in place of 'j') and to re-route to xqsort() when we're recursing too deeply + * or when there is not enough items to sort. + */ + +/* + * multiple-thread quick-sort. See man page for qsort(3c) for info. + * Works fine on uniprocessor machines as well. + * + * Written by: Richard Pettit (Richard.Pettit@West.Sun.COM) + */ + +#include "common.h" + +#include "tqsort.h" + +#include "atomic.h" +#include "getcpucount.h" +#include "log.h" +#include "once.h" +#include "thread.h" +#include "xsort.h" + +/* don't create more threads for less than this */ +#define TQSORT_THRESH 4096 + +/* how many threads per CPU */ +#define TQSORT_THR_PER_CPU 4 + +/* stack size requested for each thread */ +#define TQSORT_STACK THREAD_STACK_MIN + +/* + * Maximum stack depth we allow before switching to xqsort(). + * + * This multi-threaded algorithm is going to be efficient if the threads are + * created early in the sorting processing, when we're not too deep in the + * recursion already, + * --RAM + */ +#define TQSORT_DEPTH 24 /* Keep it small */ + +static bool tqsort_trace = FALSE; + +typedef struct { + void *sa_base; + int sa_nel; + size_t sa_width; + cmp_fn_t sa_compar; + int sa_depth; +} sort_args_t; + +/* for all instances of quicksort (hence using atomic ops on it -- RAM) */ +static int threads_avail; + +/* cast the void to a one byte quanitity and compute the offset */ +#define TSUB(a, n) ((void *) (((uint8 *) (a)) + ((n) * width))) + +#define TSWAP(a, i, j, width) \ +{ \ + register void *p = TSUB(a, i), *q; \ + if (p == pivot) \ + pivot = TSUB(a, j); \ + else if (TSUB(a, j) == pivot) \ + pivot = p; \ + \ + /* one of the more convoluted swaps I've done */ \ + switch(width) { \ + case 1: {\ + register uint8 x = *((uint8 *) p); \ + *((uint8 *) p) = *((uint8 *) (q = TSUB(a, j))); \ + *((uint8 *) q) = x; \ + } break; \ + case 2: {\ + register uint16 x = *((uint16 *) p); \ + *((uint16 *) p) = *((uint16 *) (q = TSUB(a, j))); \ + *((uint16 *) q) = x; \ + } break; \ + case 4: {\ + register uint32 x = *((uint32 *) p); \ + *((uint32 *) p) = *((uint32 *) (q = TSUB(a, j))); \ + *((uint32 *) q) = x; \ + } break; \ + case 8: {\ + register uint64 x = *((uint64 *) p); \ + *((uint64 *) p) = *((uint64 *) (q = TSUB(a,j))); \ + *((uint64 *) q) = x; \ + } break; \ + default: \ + q = TSUB(a, j); \ + SWAP(p, q, width); \ + break; \ + } \ +} + +enum tqstate { + TQ_STATE_XQSORT, /* Handle first partition with xqsort() */ + TQ_STATE_THREAD, /* Handle first partition with a thread */ + TQ_STATE_RECURSE, /* Handle first partition via recursion */ + TQ_STATE_DONE /* First partition fully sorted */ +}; + +/** + * Threaded quicksort(). + * + * This is only called when sorting at least TQSORT_THRESH items. + */ +static void * G_HOT +tquicksort(void *arg) +{ + sort_args_t *sargs = (sort_args_t *) arg; + register void *a = sargs->sa_base; + int n = sargs->sa_nel; + int width = sargs->sa_width; + int depth = sargs->sa_depth + 1; + cmp_fn_t compar = sargs->sa_compar; + register int i; + register int j; + void *t; + void *b3; + void *pivot = NULL; + sort_args_t sort_args2; + uint tid = THREAD_INVALID_ID; + enum tqstate first = TQ_STATE_DONE; + + /* + * Modifications by Raphael Manfredi. + * + * If we're too deep in the stack, reroute to our mono-threaded xqsort(). + * This allows us to use a small stack in sorting threads, and also avoids + * problems when this simple quicksort algorithm does not manage to find + * a good pivot, resulting in many recursions. + */ + + if G_UNLIKELY(depth > TQSORT_DEPTH) { + xqsort(a, n, width, compar); + return NULL; + } + + /* find the pivot */ + b0 = TSUB(a, 0); + b1 = TSUB(a, n / 2); + b2 = TSUB(a, n - 1); + /* three sort */ + if ((*compar) (b0, b1) > 0) { + t = b0; + b0 = b1; + b1 = t; + } + /* the first two are now ordered, now order the second two */ + if ((*compar) (b2, b1) < 0) { + t = b1; + b1 = b2; + b2 = t; + } + /* should the second be moved to the first? */ + if ((*compar) (b1, b0) < 0) { + t = b0; + b0 = b1; + b1 = t; + } + if ((*compar) (b0, b2) != 0) { + if ((*compar) (b0, b1) < 0) + pivot = b1; + else + pivot = b2; + } + + if G_UNLIKELY(pivot == NULL) { + for (i = 1; i < n; i++) { + void *p = TSUB(a, i); + int z; + if ((z = (*compar) (a, p))) { + pivot = (z > 0) ? a : p; + break; + } + } + if (pivot == NULL) + return NULL; /* All elements are equal, hence sorted */ + } + + /* sort */ + i = 0; + j = n - 1; + while (i <= j) { + while ((*compar) (TSUB(a, i), pivot) < 0) + ++i; + while ((*compar) (TSUB(a, j), pivot) >= 0) + --j; + if (i < j) { + TSWAP(a, i, j, width); + ++i; + --j; + } + } + + /* + * Handle the first partition. + * + * Improvement from Raphael Manfredi: + * + * If we end up not spawning a thread for the first partition, we'll + * handle the second partition (which may in turn spawn a thread) and + * then we'll come back to the first partition, in order to maximize + * concurrency. + * --RAM + */ + + /* sort the sides judiciously */ + switch (i) { + case 0: + case 1: + break; + case 2: + if ((*compar) (TSUB(a, 0), TSUB(a, 1)) > 0) { + TSWAP(a, 0, 1, width); + } + break; + case 3: + /* three sort */ + if ((*compar) (TSUB(a, 0), TSUB(a, 1)) > 0) { + TSWAP(a, 0, 1, width); + } + /* the first two are now ordered, now order the second two */ + if ((*compar) (TSUB(a, 2), TSUB(a, 1)) < 0) { + TSWAP(a, 2, 1, width); + } + /* should the second be moved to the first? */ + if ((*compar) (TSUB(a, 1), TSUB(a, 0)) < 0) { + TSWAP(a, 1, 0, width); + } + break; + default: + sort_args0.sa_base = a; + sort_args0.sa_nel = i; + sort_args0.sa_width = width; + sort_args0.sa_compar = compar; + sort_args0.sa_depth = depth; + + /* + * Do not create a thread if the pivot was chosen poorly and we + * did not create a first partition of at least 1/8th of the items. + */ + + if (i < (n >> 3) || i <= TQSORT_THRESH) { + first = TQ_STATE_XQSORT; + } else if (atomic_int_dec(&threads_avail) > 0) { + tid = thread_create(tquicksort, &sort_args0, 0, TQSORT_STACK); + if G_UNLIKELY(THREAD_INVALID_ID == tid) { + s_warning_once_per(LOG_PERIOD_SECOND, + "%s(): cannot create new thread: %m", G_STRFUNC); + atomic_int_inc(&threads_avail); + first = TQ_STATE_XQSORT; + } else { + if G_UNLIKELY(tqsort_trace) { + s_debug("%s(): created thread #%d, i=%d, depth=%d", + G_STRFUNC, tid, i, depth); + } + first = TQ_STATE_THREAD; + } + } else { + atomic_int_inc(&threads_avail); + first = TQ_STATE_RECURSE; + } + break; + } + + /* + * Handle the second partition. + */ + + j = n - i; + switch (j) { + case 1: + break; + case 2: + if ((*compar) (TSUB(a, i), TSUB(a, i + 1)) > 0) { + TSWAP(a, i, i + 1, width); + } + break; + case 3: + /* three sort */ + if ((*compar) (TSUB(a, i), TSUB(a, i + 1)) > 0) { + TSWAP(a, i, i + 1, width); + } + /* the first two are now ordered, now order the second two */ + if ((*compar) (TSUB(a, i + 2), TSUB(a, i + 1)) < 0) { + TSWAP(a, i + 2, i + 1, width); + } + /* should the second be moved to the first? */ + if ((*compar) (TSUB(a, i + 1), TSUB(a, i)) < 0) { + TSWAP(a, i + 1, i, width); + } + break; + default: + sort_args1.sa_base = TSUB(a, i); + sort_args1.sa_nel = j; + sort_args1.sa_width = width; + sort_args1.sa_compar = compar; + sort_args1.sa_depth = depth; + + if (j < (n >> 3) || j <= TQSORT_THRESH) { + xqsort(sort_args1.sa_base, j, width, compar); + } else if ( + THREAD_INVALID_ID == tid && /* No thread for other partition */ + atomic_int_dec(&threads_avail) > 0 + ) { + tid = thread_create(tquicksort, &sort_args1, 0, TQSORT_STACK); + if G_UNLIKELY(THREAD_INVALID_ID == tid) { + s_warning_once_per(LOG_PERIOD_SECOND, + "%s(): cannot create new thread: %m", G_STRFUNC); + atomic_int_inc(&threads_avail); + xqsort(sort_args1.sa_base, j, width, compar); + } else { + if G_UNLIKELY(tqsort_trace) { + s_debug("%s(): created thread #%d, j=%d, depth=%d", + G_STRFUNC, tid, j, depth); + } + } + } else { + if G_LIKELY(THREAD_INVALID_ID == tid) + atomic_int_inc(&threads_avail); + tquicksort(&sort_args1); + } + break; + } + + /* + * Process the first partition now. + */ + + switch (first) { + case TQ_STATE_XQSORT: + xqsort(a, i, width, compar); + goto done; + case TQ_STATE_RECURSE: + tquicksort(&sort_args0); + goto done; + case TQ_STATE_THREAD: + case TQ_STATE_DONE: + goto done; + } + + g_assert_not_reached(); + +done: + + if (THREAD_INVALID_ID != tid) { + if (-1 == thread_join(tid, NULL)) { + s_critical("%s(): cannot join with %s: %m", + G_STRFUNC, thread_id_name(tid)); + } + atomic_int_inc(&threads_avail); + } + + return NULL; +} + +/** + * Initialize the maximum amount of threads we can dedicate to tqsort(). + */ +static void +tqsort_threads_init(void) +{ + long ncpus = getcpucount(); + + /* thread count not to exceed TQSORT_THR_PER_CPU per CPU */ + threads_avail = (ncpus == 1) ? 0 : (ncpus * TQSORT_THR_PER_CPU); + threads_avail = MIN(threads_avail, THREAD_MAX - 16); + + if G_UNLIKELY(tqsort_trace) + s_debug("%s(): available threads: %d", G_STRFUNC, threads_avail); +} + +/** + * Sort array with ``n'' elements of size ``s''. The base ``b'' points to + * the start of the array. + * + * When there are more than TQSORT_ITEMS items to sort, this routine will + * create threads to accelerate the sorting process. + */ +void +tqsort(void *b, size_t n, size_t s, cmp_fn_t cmp) +{ + static once_flag_t inited; + sort_args_t sort_args; + + /* + * If we have less than TQSORT_ITEMS to sort, chances are that the + * overhead of setting up and launching threads will be large enough + * to completely offset the gains we'll achieve through concurrency. + * --RAM, 2013-11-16 + */ + + if (n < TQSORT_ITEMS) { + xqsort(b, n, s, cmp); + } else { + ONCE_FLAG_RUN(inited, tqsort_threads_init); + + sort_args.sa_base = b; + sort_args.sa_nel = n; + sort_args.sa_width = s; + sort_args.sa_compar = cmp; + sort_args.sa_depth = 0; + + (void) tquicksort(&sort_args); + } +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/tqsort.h
Added
@@ -0,0 +1,51 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Parallel quick sort. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#ifndef _tqsort_h_ +#define _tqsort_h_ + +/* + * Don't use tqsort() with less than this amount of items. + * It will be re-routing to xqsort() because it is not efficient enough. + */ +#define TQSORT_ITEMS 32768 + +/* + * Public interface. + */ + +void tqsort(void *b, size_t n, size_t s, cmp_fn_t cmp); + +#endif /* _tqsort_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/tsig.c
Added
@@ -0,0 +1,91 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Thread signal set operations. + */ + +#include "common.h" + +#include "tsig.h" + +#include "override.h" /* Must be the last header included */ + +/** + * Add signal to set. + * + * @return 0 if OK, -1 on error with errno set. + */ +int +tsig_addset(tsigset_t *set, int signum) +{ + g_assert(set != NULL); + + if G_UNLIKELY(signum <= 0 || signum >= TSIG_COUNT) { + errno = EINVAL; + return -1; + } + + *set |= tsig_mask(signum); + return 0; +} + +/** + * Remove signal from set. + * + * @return 0 if OK, -1 on error with errno set. + */ +int +tsig_delset(tsigset_t *set, int signum) +{ + g_assert(set != NULL); + + if G_UNLIKELY(signum <= 0 || signum >= TSIG_COUNT) { + errno = EINVAL; + return -1; + } + + *set &= ~tsig_mask(signum); + return 0; +} + +/** + * Is signal part of the set? + * + * @return TRUE if signal is in the set. + */ +bool +tsig_ismember(const tsigset_t *set, int signum) +{ + g_assert(set != NULL); + + if G_UNLIKELY(signum <= 0 || signum >= TSIG_COUNT) + return FALSE; + + return booleanize(*set & tsig_mask(signum)); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/tsig.h
Added
@@ -0,0 +1,180 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Thread signal set operations. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#ifndef _tsig_h_ +#define _tsig_h_ + +/** + * Thread signals. + * + * These are not kernel signals, they are only known and handled by the + * thread layer at specific moments. The signal is delivered to the thread + * when it enters the locking code or when it checks for suspension, and then + * only when the thread does not hold any locks currently. + */ +#define TSIG_0 0 /**< Not a real signal, only checks */ +#define TSIG_1 1 +#define TSIG_2 2 +#define TSIG_3 3 +#define TSIG_4 4 +#define TSIG_5 5 +#define TSIG_6 6 +#define TSIG_7 7 +#define TSIG_8 8 +#define TSIG_9 9 + +/** + * Signals with a specific meaning, reserved for the library. + * + * The TSIG_OVFLOW signal is synchronously delivered to the thread for which + * a stack overflow occurs, to give it a last chance to cleanup, display + * a message, etc... Upon return of the signal handler, the thread is + * terminated. Note that if there is no user-defined signal handler installed + * for TSIG_OVFLOW and the thread incurs a stack overflow, the whole process + * will crash. + * --RAM, 2015-02-13 + * + * The TSIG_DIVERT signal is asynchronously delivered to a thread which we + * want to execute some diversion code. See thread_divert(). + * --RAM, 2015-12-30 + * + * The TSIG_INTACK signal is asynchronously delivered to a thread when an + * interrupt it sent has been fully processed. See thread_interrupt(). + * --RAM, 2016-01-23 + */ + +#define TSIG_TEQ 10 /**< Something is in the Thread Event Queue */ +#define TSIG_TERM 11 /**< Requesting thread termination */ +#define TSIG_EVQ 12 /**< Dispatching a thread event */ +#define TSIG_OVFLOW 13 /**< Thread stack overflow detected */ +#define TSIG_DIVERT 14 /**< Thread diversion requested */ +#define TSIG_INTACK 15 /**< Thread interrupt acknowledgement */ + +#define TSIG_COUNT 16 + +#define tsig_mask(sig) (1U << ((sig) - 1)) /* 0 is not a signal */ + +typedef unsigned int tsigset_t; +typedef void (*tsighandler_t)(int); + +/** + * Special signal handlers. + */ +#define TSIG_DFL ((tsighandler_t) 0) +#define TSIG_IGN ((tsighandler_t) 1) +#define TSIG_ERR ((tsighandler_t) -1) + +/* + * Public interface. + */ + +int tsig_addset(tsigset_t *set, int signum); +int tsig_delset(tsigset_t *set, int signum); +bool tsig_ismember(const tsigset_t *set, int signum); + +/** + * Empty the signal set. + */ +static inline void +tsig_emptyset(tsigset_t *set) +{ + g_assert(set != NULL); + + ZERO(set); +} + +/** + * Fill the signal set with ones. + */ +static inline void +tsig_fillset(tsigset_t *set) +{ + g_assert(set != NULL); + + memset(set, 0xff, sizeof *set); +} + +/** + * Is set empty? + * + * @return TRUE if set contains no signals. + */ +static inline bool +tsig_isemptyset(const tsigset_t *set) +{ + g_assert(set != NULL); + + return 0 == *set; +} + +/** + * Put result of NOT ``set'' into ``dest''. + */ +static inline void +tsig_notset(tsigset_t *dest, const tsigset_t *set) +{ + g_assert(dest != NULL); + g_assert(set != NULL); + + *dest = ~*set; +} + +/** + * Put result of ``left'' OR ``right'' into ``dest''. + */ +static inline void +tsig_orset(tsigset_t *dest, const tsigset_t *left, const tsigset_t *right) +{ + g_assert(dest != NULL); + g_assert(left != NULL); + g_assert(right != NULL); + + *dest = *left | *right; +} + +/** + * Put result of ``left'' AND ``right'' into ``dest''. + */ +static inline void +tsig_andset(tsigset_t *dest, const tsigset_t *left, const tsigset_t *right) +{ + g_assert(dest != NULL); + g_assert(left != NULL); + g_assert(right != NULL); + + *dest = *left & *right; +} + +#endif /* _tsig_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/unsigned.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/unsigned.h
Changed
@@ -51,17 +51,27 @@ * @return TRUE if size is equal to zero or larger and smaller than * SIZE_MAX / 2. */ -static inline G_GNUC_CONST ALWAYS_INLINE gboolean +static inline G_CONST ALWAYS_INLINE bool size_is_non_negative(size_t size) { return size <= SIZE_MAX / 2; } +/* + * Check whether a signed representation of size would be negative. + * @return TRUE if size is larger than SIZE_MAX / 2. + */ +static inline G_CONST ALWAYS_INLINE bool +size_is_negative(size_t size) +{ + return size > SIZE_MAX / 2; +} + /** * Check whether a signed representation of size would be strictly positive. * @return TRUE if size is larger than zero and smaller than SIZE_MAX / 2. */ -static inline G_GNUC_CONST ALWAYS_INLINE gboolean +static inline G_CONST ALWAYS_INLINE bool size_is_positive(size_t size) { return size_is_non_negative(size - 1); @@ -71,7 +81,7 @@ * Calculate the sum of a and b but saturate towards SIZE_MAX. * @return SIZE_MAX if a + b > SIZE_MAX, otherwise a + b. */ -static inline G_GNUC_CONST size_t +static inline G_CONST size_t size_saturate_add(size_t a, size_t b) { size_t ret = a + b; @@ -84,7 +94,7 @@ * Calculate the product of a and b but saturate towards SIZE_MAX. * @return SIZE_MAX if a * b > SIZE_MAX, otherwise a * b. */ -static inline G_GNUC_CONST size_t +static inline G_CONST size_t size_saturate_mult(size_t a, size_t b) { if (0 == a) @@ -98,7 +108,7 @@ * Calculate the difference between a and b but saturate towards zero. * @return zero if a < b, otherwise a - b. */ -static inline G_GNUC_CONST size_t +static inline G_CONST size_t size_saturate_sub(size_t a, size_t b) { if (G_UNLIKELY(a < b)) @@ -111,7 +121,7 @@ * @return TRUE if size is greater than or equal to zero, yet smaller than the * maximum positive quantity that can be represented. */ -static inline G_GNUC_CONST ALWAYS_INLINE gboolean +static inline G_CONST ALWAYS_INLINE bool uint_is_non_negative(unsigned v) { return v <= MAX_INT_VAL(unsigned) / 2; @@ -122,7 +132,7 @@ * @return TRUE if size is stricly larger than zero, yet smaller than the * maximum positive quantity that can be represented. */ -static inline G_GNUC_CONST ALWAYS_INLINE gboolean +static inline G_CONST ALWAYS_INLINE bool uint_is_positive(unsigned v) { return uint_is_non_negative(v - 1); @@ -132,7 +142,7 @@ * Calculate the sum of a and b but saturate towards the maximum value. * @return maximum if a + b > maximum, otherwise a + b. */ -static inline G_GNUC_CONST unsigned +static inline G_CONST unsigned uint_saturate_add(unsigned a, unsigned b) { unsigned ret = a + b; @@ -142,10 +152,22 @@ } /* + * Calculate the difference between a and b but saturate towards zero. + * @return zero if a < b, otherwise a - b. + */ +static inline G_CONST unsigned +uint_saturate_sub(unsigned a, unsigned b) +{ + if (G_UNLIKELY(a < b)) + return 0; + return a - b; +} + +/* * Calculate the product of a and b but saturate towards UINT_MAX. * @return UINT_MAX if a * b > UINT_MAX, otherwise a * b. */ -static inline G_GNUC_CONST unsigned +static inline G_CONST unsigned uint_saturate_mult(unsigned a, unsigned b) { if (0 == a) @@ -159,12 +181,12 @@ * Calculate the sum of a and b but saturate towards the maximum value. * @return maximum if a + b > maximum, otherwise a + b. */ -static inline G_GNUC_CONST guint64 -guint64_saturate_add(guint64 a, guint64 b) +static inline G_CONST uint64 +uint64_saturate_add(uint64 a, uint64 b) { - guint64 ret = a + b; + uint64 ret = a + b; if (G_UNLIKELY(ret < a)) - return MAX_INT_VAL(guint64); + return MAX_INT_VAL(uint64); return ret; } @@ -172,13 +194,13 @@ * Calculate the product of a and b but saturate towards MAX_UINT64. * @return MAX_UINT64 if a * b > MAX_UINT64, otherwise a * b. */ -static inline G_GNUC_CONST guint64 -guint64_saturate_mult(guint64 a, guint64 b) +static inline G_CONST uint64 +uint64_saturate_mult(uint64 a, uint64 b) { if (0 == a) return 0; - if (G_UNLIKELY(MAX_INT_VAL(guint64) / a < b)) - return MAX_INT_VAL(guint64); + if (G_UNLIKELY(MAX_INT_VAL(uint64) / a < b)) + return MAX_INT_VAL(uint64); return a * b; } @@ -186,12 +208,12 @@ * Calculate the sum of a and b but saturate towards the maximum value. * @return maximum if a + b > maximum, otherwise a + b. */ -static inline G_GNUC_CONST guint32 -guint32_saturate_add(guint32 a, guint32 b) +static inline G_CONST uint32 +uint32_saturate_add(uint32 a, uint32 b) { - guint32 ret = a + b; + uint32 ret = a + b; if (G_UNLIKELY(ret < a)) - return MAX_INT_VAL(guint32); + return MAX_INT_VAL(uint32); return ret; } @@ -199,13 +221,13 @@ * Calculate the product of a and b but saturate towards MAX_UINT32. * @return MAX_UINT32 if a * b > MAX_UINT32, otherwise a * b. */ -static inline G_GNUC_CONST guint32 -guint32_saturate_mult(guint32 a, guint32 b) +static inline G_CONST uint32 +uint32_saturate_mult(uint32 a, uint32 b) { if (0 == a) return 0; - if (G_UNLIKELY(MAX_INT_VAL(guint32) / a < b)) - return MAX_INT_VAL(guint32); + if (G_UNLIKELY(MAX_INT_VAL(uint32) / a < b)) + return MAX_INT_VAL(uint32); return a * b; } @@ -214,10 +236,10 @@ * @return TRUE if size is greater than or equal to zero, yet smaller than the * maximum positive quantity that can be represented. */ -static inline G_GNUC_CONST ALWAYS_INLINE gboolean -guint32_is_non_negative(guint32 v) +static inline G_CONST ALWAYS_INLINE bool +uint32_is_non_negative(uint32 v) { - return v <= MAX_INT_VAL(guint32) / 2; + return v <= MAX_INT_VAL(uint32) / 2; } /** @@ -225,22 +247,22 @@ * @return TRUE if size is stricly larger than zero, yet smaller than the * maximum positive quantity that can be represented. */ -static inline G_GNUC_CONST ALWAYS_INLINE gboolean -guint32_is_positive(guint32 v) +static inline G_CONST ALWAYS_INLINE bool +uint32_is_positive(uint32 v) { - return guint32_is_non_negative(v - 1); + return uint32_is_non_negative(v - 1); } /* * Calculate the sum of a and b but saturate towards the maximum value. * @return maximum if a + b > maximum, otherwise a + b. */ -static inline G_GNUC_CONST guint8 -guint8_saturate_add(guint8 a, guint8 b) +static inline G_CONST uint8 +uint8_saturate_add(uint8 a, uint8 b) { - guint8 ret = a + b; + uint8 ret = a + b; if (G_UNLIKELY(ret < a)) - return MAX_INT_VAL(guint8); + return MAX_INT_VAL(uint8); return ret; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/url.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/url.c
Changed
@@ -33,16 +33,18 @@ #include "common.h" +#include "url.h" #include "ascii.h" #include "debug.h" #include "glib-missing.h" #include "halloc.h" #include "host_addr.h" +#include "htable.h" +#include "mempcpy.h" #include "misc.h" /* For is_strprefix() */ #include "parse.h" #include "path.h" #include "str.h" -#include "url.h" #include "walloc.h" #include "override.h" /* Must be the last header included */ @@ -59,7 +61,7 @@ * - Bit 2 encodes the set for fixing an incomplete escaping. * - Bit 3 encodes the set for use in a shell. */ -static const guint8 is_transparent96 = { +static const uint8 is_transparent96 = { /* 0 1 2 3 4 5 6 7 */ /* 01234567 - */ 0x0,0x0,0x0,0x0,0x7,0x0,0x4,0x0, /* !"#$%&' - 32..39 */ 0x7,0x7,0x7,0x0,0xf,0xf,0xf,0xf, /* ()*+,-./ - 40..47 */ @@ -82,10 +84,10 @@ SHELL_MASK = (1 << 3) }; -static inline gboolean +static inline bool is_transparent_char(const int c, const enum escape_mask m) { - return c >= 32 && c < 128 && (is_transparentc - 32 & (guint8) m); + return c >= 32 && c < 128 && (is_transparentc - 32 & (uint8) m); } static const char hex_alphabet = "0123456789ABCDEF"; @@ -95,7 +97,7 @@ * Parsed URL parameters (from query string). */ struct url_params { - GHashTable *params; /**< parameter => value (halloc'ed) */ + htable_t *params; /**< parameter => value (halloc'ed) */ size_t count; /**< Amount of parameters */ }; @@ -109,12 +111,12 @@ * which must be freed via hfree(). */ static char * -url_escape_mask(const char *url, guint8 mask) +url_escape_mask(const char *url, uint8 mask) { const char *p; char *q; int need_escape = 0; - guchar c; + uchar c; char *new; for (p = url, c = *p++; c; c = *p++) @@ -149,11 +151,11 @@ * NUL), or -1 if the buffer was too small. */ static int -url_escape_mask_into(const char *url, char *target, int len, guint8 mask) +url_escape_mask_into(const char *url, char *target, int len, uint8 mask) { const char *p = url; char *q; - guchar c; + uchar c; char *end = target + len; for (q = target, c = *p++; c && q < end; c = *p++) { @@ -221,10 +223,10 @@ url_from_absolute_path(const char *path) { char *escaped, *url; - + g_return_val_if_fail(is_absolute_path(path), NULL); escaped = url_escape_mask(path, SHELL_MASK); - url = g_strconcat("file://", escaped, (void *) 0); + url = g_strconcat("file://", escaped, NULL_PTR); if (escaped != path) { HFREE_NULL(escaped); } @@ -254,7 +256,7 @@ { const char *p; str_t *s; - guchar c; + uchar c; s = str_new(0); @@ -296,7 +298,7 @@ if (need_escape > 0) { char *escaped, *q; size_t size; - guchar c; + uchar c; size = p - url + 1 + need_escape * 2; escaped = halloc(size); @@ -327,19 +329,19 @@ * @return NULL if the argument isn't valid encoded. */ char * -url_unescape(char *url, gboolean inplace) +url_unescape(char *url, bool inplace) { char *p; char *q; int need_unescape = 0; - guint unescaped_memory = 0; - guchar c; + uint unescaped_memory = 0; + uchar c; char *new; for (p = url; (c = *p) != '\0'; c = *p++) if (c == ESCAPE_CHAR) { - guchar h = *(++p); - guchar l = *(++p); + uchar h = *(++p); + uchar l = *(++p); if ( (h == '0' && l == '0') || /* Forbid %00 */ @@ -408,10 +410,10 @@ char *start; char *name = NULL; char *value = NULL; - gboolean in_value = FALSE; + bool in_value = FALSE; WALLOC(up); - up->params = g_hash_table_new(g_str_hash, g_str_equal); + up->params = htable_create(HASH_KEY_STRING, 0); up->count = 0; for (q = start = query; /* empty */; q++) { @@ -429,7 +431,7 @@ if (value == start) /* No unescaping took place */ value = h_strdup(start); *q = c; - g_hash_table_insert(up->params, name, value); + htable_insert(up->params, name, value); up->count++; in_value = FALSE; name = NULL; @@ -466,14 +468,17 @@ g_assert(up != NULL); g_assert(up->params != NULL); - return g_hash_table_lookup(up->params, name); + return htable_lookup(up->params, name); } static void -free_params_kv(gpointer key, gpointer value, gpointer unused_udata) +free_params_kv(const void *key, void *value, void *unused_udata) { + void *k = deconstify_pointer(key); + (void) unused_udata; - HFREE_NULL(key); + + HFREE_NULL(k); HFREE_NULL(value); } @@ -485,8 +490,8 @@ { g_assert(up != NULL); - g_hash_table_foreach(up->params, free_params_kv, NULL); - gm_hash_table_destroy_null(&up->params); + htable_foreach(up->params, free_params_kv, NULL); + htable_free_null(&up->params); WFREE(up); } @@ -500,7 +505,7 @@ return up->count; } -static gboolean +static bool url_safe_char(char c, url_policy_t p) { if (!isascii(c) || is_ascii_cntrl(c)) @@ -672,7 +677,7 @@ p = q; if (':' == *q) { - guint32 port; + uint32 port; int error; q++; /* Skip ':' */ @@ -750,9 +755,9 @@ D(".txt"), #undef D }; - guint i; + uint i; - for (i = 0; i < G_N_ELEMENTS(static_types); i++) + for (i = 0; i < N_ITEMS(static_types); i++) if ( 0 == ascii_strcasecmp(q - static_typesi.len, static_typesi.ext) @@ -765,13 +770,13 @@ /* Add a trailing slash; if the URI is empty (to prevent dupes) */ if ('\0' == uri0) { ssize_t len = q - url; - char *s; + char *s, *w; g_assert(len > 0); s = halloc(len + sizeof "/"); - memcpy(s, url, len); - slen = '/'; - slen + 1 = '\0'; + w = mempcpy(s, url, len); + *w++ = '/'; + *w = '\0'; url = s; } @@ -787,7 +792,7 @@ /** * Is URL absolute? */ -gboolean +bool url_is_absolute(const char *url) { return is_strprefix(url, http_prefix) != NULL; @@ -816,13 +821,13 @@ if (is_strprefix(relative, "//")) /* Was missing the scheme */ - return h_strconcat("http:", relative, NULL); + return h_strconcat("http:", relative, NULL_PTR); if (is_strprefix(relative, "#")) { char *p; if (NULL == (p = strchr(base, '#'))) { - return h_strconcat(base, relative, NULL); + return h_strconcat(base, relative, NULL_PTR); } else { /* Replace the fragment */ dbase = h_strdup(base); @@ -835,7 +840,7 @@ if (is_strprefix(relative, "/")) { char *p; - + dbase = h_strdup(base); p = is_strprefix(dbase, http_prefix); g_assert(p != NULL); /* base was absolute */ @@ -844,7 +849,7 @@ if (NULL == p) { /* base was "http://host" with no trailing path */ hfree(dbase); - return h_strconcat(base, relative, NULL); + return h_strconcat(base, relative, NULL_PTR); } else { /* replace relative path in the base */ *p = '\0'; @@ -871,7 +876,7 @@ g_assert(dbase != NULL); - result = h_strconcat(dbase, relative, NULL); + result = h_strconcat(dbase, relative, NULL_PTR); hfree(dbase); return result; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/url.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/url.h
Changed
@@ -46,7 +46,7 @@ URL_POLICY_ALLOW_STATIC_FILES = (1 << 3), URL_POLICY_ALLOW_ANY_CHAR = (1 << 4), - URL_POLICY_GWC_RULES = 0 + URL_POLICY_GWC_RULES = 0 } url_policy_t; /* @@ -59,7 +59,7 @@ char *url_fix_escape(const char *url); int url_escape_into(const char *url, char *target, int len); char *url_escape_cntrl(const char *url); -char *url_unescape(char *url, gboolean inplace); +char *url_unescape(char *url, bool inplace); char *url_from_absolute_path(const char *path); url_params_t *url_params_parse(char *query); @@ -68,7 +68,7 @@ void url_params_free(url_params_t *up); char *url_normalize(char *url, url_policy_t pol); -gboolean url_is_absolute(const char *url); +bool url_is_absolute(const char *url); char *url_absolute_within(const char *base, const char *relative); int url_canonize_path(char *path);
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/urn.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/urn.c
Changed
@@ -47,7 +47,7 @@ * * @return TRUE if the SHA1 was valid and properly decoded, FALSE on error. */ -gboolean +bool parse_base32_sha1(const char *buf, size_t size, struct sha1 *sha1) { struct sha1 raw; @@ -59,8 +59,8 @@ if (size < SHA1_BASE32_SIZE) return FALSE; - - len = base32_decode(sha1->data, SHA1_RAW_SIZE, buf, SHA1_BASE32_SIZE); + + len = base32_decode(sha1, sizeof *sha1, buf, SHA1_BASE32_SIZE); if (SHA1_RAW_SIZE != len) return FALSE; @@ -76,7 +76,7 @@ * * @return TRUE if the SHA1 was valid and properly decoded, FALSE on error. */ -gboolean +bool parse_base16_sha1(const char *buf, size_t size, struct sha1 *sha1) { struct sha1 raw; @@ -88,7 +88,7 @@ if (size < SHA1_BASE16_SIZE) return FALSE; - + len = base16_decode(sha1->data, SHA1_RAW_SIZE, buf, SHA1_BASE16_SIZE); if (SHA1_RAW_SIZE != len) return FALSE; @@ -102,7 +102,7 @@ * * @return whether we successfully extracted the SHA1. */ -gboolean +bool urn_get_sha1(const char *buf, struct sha1 *sha1) { const char *p; @@ -143,14 +143,14 @@ * @return whether we successfully extracted the bitprint, i.e. the two * hashes. */ -gboolean +bool urn_get_bitprint(const char *buf, size_t size, struct sha1 *sha1, struct tth *tth) { static const char prefix = "urn:bitprint:"; size_t len; const char *p; - gboolean base16_tth = FALSE; + bool base16_tth = FALSE; g_assert(0 == size || NULL != buf); g_assert(sha1); @@ -185,9 +185,9 @@ return FALSE; } if (base16_tth) { - len = base16_decode(tth->data, TTH_RAW_SIZE, p, TTH_BASE16_SIZE); + len = base16_decode(tth, sizeof *tth, p, TTH_BASE16_SIZE); } else { - len = base32_decode(tth->data, TTH_RAW_SIZE, p, TTH_BASE32_SIZE); + len = base32_decode(tth, sizeof *tth, p, TTH_BASE32_SIZE); } if (len != TTH_RAW_SIZE) { return FALSE; @@ -201,7 +201,7 @@ * * @return whether TTH was successfully extracted. */ -gboolean +bool urn_get_tth(const char *buf, size_t size, struct tth *tth) { static const char prefix = "urn:tree:tiger"; @@ -246,7 +246,7 @@ * * @return whether we successfully extracted the SHA1. */ -gboolean +bool urn_get_sha1_no_prefix(const char *buf, struct sha1 *sha1) { const char *p;
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/urn.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/urn.h
Changed
@@ -34,19 +34,19 @@ #ifndef _urn_h_ #define _urn_h_ -#include "common.h" +#include "common.h" /* * Public interface. */ -gboolean parse_base32_sha1(const char *buf, size_t size, struct sha1 *sha1); +bool parse_base32_sha1(const char *buf, size_t size, struct sha1 *sha1); -gboolean urn_get_sha1(const char *buf, struct sha1 *sha1); -gboolean urn_get_sha1_no_prefix(const char *buf, struct sha1 *sha1); -gboolean urn_get_bitprint(const char *buf, size_t size, +bool urn_get_sha1(const char *buf, struct sha1 *sha1); +bool urn_get_sha1_no_prefix(const char *buf, struct sha1 *sha1); +bool urn_get_bitprint(const char *buf, size_t size, struct sha1 *sha1, struct tth *tth); -gboolean urn_get_tth(const char *buf, size_t size, struct tth *tth); +bool urn_get_tth(const char *buf, size_t size, struct tth *tth); #endif /* _urn_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/utf8.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/utf8.c
Changed
@@ -62,35 +62,41 @@ #include "utf8_tables.h" #include "utf8.h" -#include "atoms.h" + #include "ascii.h" +#include "atoms.h" #include "concat.h" +#include "debug.h" #include "endian.h" #include "halloc.h" +#include "hikset.h" +#include "htable.h" +#include "mempcpy.h" #include "misc.h" #include "path.h" +#include "pslist.h" #include "random.h" -#include "debug.h" -#include "glib-missing.h" +#include "str.h" #include "stringify.h" #include "unsigned.h" #include "walloc.h" + #include "override.h" /* Must be the last header included */ /** * If ui_uses_utf8_encoding() returns TRUE, it is assumed that the * user-interface passes only valid UTF-8 strings. It affects only those * functions that are explicitely defined to handle UI strings as input or - * output. This allows to reduce the number of conversions. For example, if a - * function specification permits that the original string may be returned, we + * output. This allows us to reduce the number of conversions. For example, if + * a function specification permits that the original string may be returned, we * will do that instead of creating a copy. If ui_uses_utf8_encoding() returns * FALSE, it is assumed that the user-interface uses the locale's encoding for * its strings. */ -static inline gboolean +static inline bool ui_uses_utf8_encoding(void) { -#ifdef USE_GTK2 +#ifdef USE_GTK2 return TRUE; #else /* !USE_GTK2 */ return FALSE; @@ -99,23 +105,23 @@ static void unicode_compose_init(void); -static gboolean unicode_compose_init_passed; -static gboolean locale_init_passed; +static bool unicode_compose_init_passed; +static bool locale_init_passed; void utf8_regression_checks(void); size_t utf8_decompose_nfd(const char *in, char *out, size_t size); size_t utf8_decompose_nfkd(const char *in, char *out, size_t size); -size_t utf32_strmaxlen(const guint32 *s, size_t maxlen); -size_t utf32_strlen(const guint32 *s); +size_t utf32_strmaxlen(const uint32 *s, size_t maxlen); +size_t utf32_strlen(const uint32 *s); /** * use_icu is set to TRUE if the initialization of ICU succeeded. * If it fails, we'll fall back to the non-ICU behaviour. */ -static gboolean use_icu = FALSE; +static bool use_icu = FALSE; /** Used by is_latin_locale(). It is initialized by locale_init(). */ -static gboolean latin_locale = FALSE; +static bool latin_locale = FALSE; #if 0 /* xxxUSE_ICU */ static UConverter *conv_icu_locale = NULL; @@ -125,29 +131,40 @@ /** * This table records mappings "charset name" -> struct conv_to_utf8. */ -static GHashTable *charset2conv_to_utf8; +static hikset_t *charset2conv_to_utf8; + +enum conv_to_utf8_magic { CONV_TO_UTF8_MAGIC = 0x0a829276 }; struct conv_to_utf8 { + enum conv_to_utf8_magic magic; const char *name; /**< Name of the source charset (atom) */ iconv_t cd; /**< iconv() conversion descriptor; -1 or iconv_open()ed */ - gboolean is_ascii; /**< Set to TRUE if name is "ASCII" */ - gboolean is_utf8; /**< Set to TRUE if name is "UTF-8" */ - gboolean is_iso8859; /**< Set to TRUE if name matches "ISO-8859-*" */ + bool is_ascii; /**< Set to TRUE if name is "ASCII" */ + bool is_utf8; /**< Set to TRUE if name is "UTF-8" */ + bool is_iso8859; /**< Set to TRUE if name matches "ISO-8859-*" */ }; +static inline void +conv_to_utf8_check(const struct conv_to_utf8 * const cu) +{ + g_assert(cu != NULL); + g_assert(CONV_TO_UTF8_MAGIC == cu->magic); +} + static char *charset = NULL; /** Name of the locale charset */ -static GHashTable *utf32_compose_roots; +static htable_t *utf32_compose_roots; /** A single-linked list of conv_to_utf8 structs. The first one is used ** for converting from the primary charset. Additional charsets are optional. **/ -static GSList *sl_filename_charsets = NULL; +static pslist_t *sl_filename_charsets = NULL; static iconv_t cd_locale_to_utf8 = (iconv_t) -1; /** Mainly used for Gtk+ 1.2 */ static iconv_t cd_utf8_to_locale = (iconv_t) -1; /** Mainly used for Gtk+ 1.2 */ static iconv_t cd_utf8_to_filename = (iconv_t) -1; static iconv_t cd_utf8_to_iso8859_1 = (iconv_t) -1; +#define UTF8_CPU_CACHELINE 32 /* Length of cache in bytes, for prefetch */ enum utf8_cd { UTF8_CD_ISO8859_1, @@ -166,7 +183,7 @@ iconv_t cd; /**< iconv() conversion descriptor; may be -1 */ const char *name; /**< Name of the source charset */ const enum utf8_cd id; /**< Enumerated ID of the converter */ - gboolean initialized; /**< Whether initialization of "cd" was attempted */ + bool initialized; /**< Whether initialization of "cd" was attempted */ } utf8_cd_tab = { #define D(name, id) (iconv_t) -1, (name), (id), FALSE { D("ISO-8859-1", UTF8_CD_ISO8859_1) }, @@ -185,10 +202,10 @@ static enum utf8_cd utf8_name_to_cd(const char *name) { - guint i; + uint i; - STATIC_ASSERT(G_N_ELEMENTS(utf8_cd_tab) == NUM_UTF8_CDS); - for (i = 0; i < G_N_ELEMENTS(utf8_cd_tab); i++) + STATIC_ASSERT(N_ITEMS(utf8_cd_tab) == NUM_UTF8_CDS); + for (i = 0; i < N_ITEMS(utf8_cd_tab); i++) if (0 == strcmp(name, utf8_cd_tabi.name)) return utf8_cd_tabi.id; @@ -201,10 +218,10 @@ static const char * utf8_cd_to_name(enum utf8_cd id) { - guint i = (guint) id; + uint i = (uint) id; - g_assert(i < G_N_ELEMENTS(utf8_cd_tab)); - STATIC_ASSERT(G_N_ELEMENTS(utf8_cd_tab) == NUM_UTF8_CDS); + g_assert(i < N_ITEMS(utf8_cd_tab)); + STATIC_ASSERT(N_ITEMS(utf8_cd_tab) == NUM_UTF8_CDS); g_assert(utf8_cd_tabi.id == id); return utf8_cd_tabi.name; @@ -216,9 +233,9 @@ static iconv_t utf8_cd_get(enum utf8_cd id) { - guint i = (guint) id; + uint i = (uint) id; - g_assert(i < G_N_ELEMENTS(utf8_cd_tab)); + g_assert(i < N_ITEMS(utf8_cd_tab)); if (!utf8_cd_tabi.initialized) { const char *cs; @@ -234,10 +251,10 @@ return utf8_cd_tabi.cd; } -gboolean +bool locale_is_utf8(void) { - static gboolean initialized, is_utf8; + static bool initialized, is_utf8; if (!initialized) { initialized = TRUE; @@ -255,33 +272,33 @@ g_assert(sl_filename_charsets); t = sl_filename_charsets->data; - g_assert(t); + conv_to_utf8_check(t); g_assert(t->name); return t->name; } -static inline gboolean +static inline bool primary_filename_charset_is_utf8(void) { const struct conv_to_utf8 *t; g_assert(sl_filename_charsets); t = sl_filename_charsets->data; - g_assert(t); + conv_to_utf8_check(t); return t->is_utf8; } -static inline G_GNUC_PURE guint -utf8_skip(guchar c) +static inline G_PURE uint +utf8_skip(uchar c) { /* * How wide is an UTF-8 encoded char, depending on its first byte? * * See Unicode 4.1.0, Chapter 3.10, Table 3-6 */ - static const guint8 utf8len(size_t) (guchar) -1 + 1 = { + static const uint8 utf8len(size_t) (uchar) -1 + 1 = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0x00-0x0F */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0x10-0x1F */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0x20-0x2F */ @@ -309,7 +326,7 @@ return utf8lenc; } -static const guint8 utf8len_mark = { +static const uint8 utf8len_mark = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; @@ -329,7 +346,7 @@ * U+100000..U+10FFFF F4 80..8F 80..BF 80..BF */ -#define CHAR(x) ((guchar) (x)) +#define CHAR(x) ((uchar) (x)) #define UTF8_BYTE_MARK 0x80 #define UTF8_BYTE_MASK 0xbf #define UTF8_IS_ASCII(x) (CHAR(x) < UTF8_BYTE_MARK) @@ -371,8 +388,8 @@ * @return The exact amount of bytes necessary to store this codepoint in * UTF-8 encoding. */ -static inline G_GNUC_CONST guint -uniskip(guint32 uc) +static inline G_CONST uint +uniskip(uint32 uc) { return uc < 0x80U ? 1 : uc < 0x800 ? 2 : uc < 0x10000 ? 3 : 4; } @@ -382,8 +399,8 @@ * @returns 0 if the unicode codepoint is invalid. Otherwise the * length of the UTF-8 character is returned. */ -static inline guint -utf8_encoded_char_len(guint32 uc) +static inline uint +utf8_encoded_char_len(uint32 uc) { return utf32_bad_codepoint(uc) ? 0 : uniskip(uc); } @@ -398,10 +415,15 @@ * @returns 0 if the Unicode character could not be encoded. * Otherwise the length of the generated UTF-8 character. */ -guint NON_NULL_PARAM((2)) -utf8_encode_char(guint32 uc, char *buf, size_t size) +uint NON_NULL_PARAM((2)) +utf8_encode_char(uint32 uc, char *buf, size_t size) { - guint len, i; + uint len, i; + + if (UNICODE_IS_ASCII(uc)) { + *buf = uc; + return 1; + } len = utf8_encoded_char_len(uc); if (G_LIKELY(len <= size)) { @@ -419,29 +441,27 @@ return len; } -static inline guint -utf32_combining_class(guint32 uc) +static inline uint +utf32_combining_class(uint32 uc) { if (UNICODE_IS_ASCII(uc)) return 0; -#define GET_ITEM(i) (utf32_comb_class_lut(i).uc) -#define FOUND(i) G_STMT_START { \ - return utf32_comb_class_lut(i).cc; \ - /* NOTREACHED */ \ -} G_STMT_END +#define GET_ITEM(i) (utf32_comb_class_lut(i).uc) +#define FOUND(i) return utf32_comb_class_lut(i).cc /* Perform a binary search to find ``uc'' */ - BINARY_SEARCH(guint32, uc, G_N_ELEMENTS(utf32_comb_class_lut), CMP, + BINARY_SEARCH(uint32, uc, N_ITEMS(utf32_comb_class_lut), CMP, GET_ITEM, FOUND); #undef FOUND #undef GET_ITEM + return 0; } static inline int -block_id_cmp(size_t i, guint32 uc) +block_id_cmp(size_t i, uint32 uc) { if (uc < utf32_block_id_luti.start) return 1; @@ -451,46 +471,42 @@ return 0; } -static inline guint -utf32_block_id(guint32 uc) +static inline uint +utf32_block_id(uint32 uc) { -#define GET_ITEM(i) (i) -#define FOUND(i) G_STMT_START { \ - return 1 + (i); \ - /* NOTREACHED */ \ -} G_STMT_END +#define GET_ITEM(i) (i) +#define FOUND(i) return 1 + (i) /* Perform a binary search to find ``uc'' */ - BINARY_SEARCH(guint32, uc, G_N_ELEMENTS(utf32_block_id_lut), block_id_cmp, + BINARY_SEARCH(uint32, uc, N_ITEMS(utf32_block_id_lut), block_id_cmp, GET_ITEM, FOUND); #undef FOUND #undef GET_ITEM + return 0; } -static inline gboolean -utf32_composition_exclude(guint32 uc) +static inline bool +utf32_composition_exclude(uint32 uc) { -#define GET_ITEM(i) (utf32_composition_exclusions(i)) -#define FOUND(i) G_STMT_START { \ - return TRUE; \ - /* NOTREACHED */ \ -} G_STMT_END +#define GET_ITEM(i) (utf32_composition_exclusions(i)) +#define FOUND(i) return TRUE /* Perform a binary search to find ``uc'' */ - BINARY_SEARCH(guint32, uc, G_N_ELEMENTS(utf32_composition_exclusions), CMP, + BINARY_SEARCH(uint32, uc, N_ITEMS(utf32_composition_exclusions), CMP, GET_ITEM, FOUND); #undef FOUND #undef GET_ITEM + return FALSE; } static inline int -general_category_cmp(size_t i, guint32 uc) +general_category_cmp(size_t i, uint32 uc) { - guint32 uc2, uc3; + uint32 uc2, uc3; uc2 = utf32_general_category_luti.uc; if (uc == uc2) @@ -503,27 +519,25 @@ } static inline uni_gc_t -utf32_general_category(guint32 uc) +utf32_general_category(uint32 uc) { -#define GET_ITEM(i) (i) -#define FOUND(i) G_STMT_START { \ - return utf32_general_category_lut(i).gc; \ - /* NOTREACHED */ \ -} G_STMT_END +#define GET_ITEM(i) (i) +#define FOUND(i) return utf32_general_category_lut(i).gc /* Perform a binary search to find ``uc'' */ - BINARY_SEARCH(size_t, uc, G_N_ELEMENTS(utf32_general_category_lut), + BINARY_SEARCH(size_t, uc, N_ITEMS(utf32_general_category_lut), general_category_cmp, GET_ITEM, FOUND); #undef FOUND #undef GET_ITEM + return UNI_GC_OTHER_NOT_ASSIGNED; } static inline int -normalization_special_cmp(size_t i, guint32 uc) +normalization_special_cmp(size_t i, uint32 uc) { - guint32 uc2, uc3; + uint32 uc2, uc3; uc2 = utf32_normalization_specialsi.uc; if (uc == uc2) @@ -535,21 +549,19 @@ return uc < uc3 ? 0 : -1; } -static inline gboolean -utf32_is_normalization_special(guint32 uc) +static inline bool +utf32_is_normalization_special(uint32 uc) { -#define GET_ITEM(i) (i) -#define FOUND(i) G_STMT_START { \ - return TRUE; \ - /* NOTREACHED */ \ -} G_STMT_END +#define GET_ITEM(i) (i) +#define FOUND(i) return TRUE /* Perform a binary search to find ``uc'' */ - BINARY_SEARCH(size_t, uc, G_N_ELEMENTS(utf32_normalization_specials), + BINARY_SEARCH(size_t, uc, N_ITEMS(utf32_normalization_specials), normalization_special_cmp, GET_ITEM, FOUND); #undef FOUND #undef GET_ITEM + return FALSE; } @@ -564,11 +576,11 @@ * the caller will raise a warning, and this function will silently just * set `retlen' to 0 and return zero. */ -static guint32 -utf8_decode_char(const char *s, int len, guint *retlen, gboolean warn) +static uint32 +utf8_decode_char(const char *s, int len, uint *retlen, bool warn) { - guint32 v = *s; - guint32 ov = 0; + uint32 v = *s; + uint32 ov = 0; int clen = 1; int expectlen = 0; int warning = -1; @@ -653,7 +665,7 @@ } else if (UNICODE_IS_BYTE_ORDER_MARK(v)) { warning = UTF8_WARN_BOM; goto malformed; - } else if ((guint) expectlen > uniskip(v)) { + } else if ((uint) expectlen > uniskip(v)) { warning = UTF8_WARN_LONG; goto malformed; } else if (UNICODE_IS_ILLEGAL(v)) { @@ -673,43 +685,43 @@ switch (warning) { case UTF8_WARN_EMPTY: - gm_snprintf(msg, sizeof(msg), "empty string"); + str_bprintf(msg, sizeof(msg), "empty string"); break; case UTF8_WARN_CONTINUATION: - gm_snprintf(msg, sizeof(msg), - "unexpected continuation byte 0x%02lx", (gulong) v); + str_bprintf(msg, sizeof(msg), + "unexpected continuation byte 0x%02lx", (ulong) v); break; case UTF8_WARN_NON_CONTINUATION: - gm_snprintf(msg, sizeof(msg), + str_bprintf(msg, sizeof(msg), "unexpected non-continuation byte 0x%02lx " - "after start byte 0x%02lx", (gulong) s1, (gulong) v); + "after start byte 0x%02lx", (ulong) s1, (ulong) v); break; case UTF8_WARN_FE_FF: - gm_snprintf(msg, sizeof(msg), "byte 0x%02lx", (gulong) v); + str_bprintf(msg, sizeof(msg), "byte 0x%02lx", (ulong) v); break; case UTF8_WARN_SHORT: - gm_snprintf(msg, sizeof(msg), "%d byte%s, need %d", - len, len == 1 ? "" : "s", expectlen); + str_bprintf(msg, sizeof(msg), "%d byte%s, need %d", + len, plural(len), expectlen); break; case UTF8_WARN_OVERFLOW: - gm_snprintf(msg, sizeof(msg), "overflow at 0x%02lx, byte 0x%02lx", - (gulong) ov, (gulong) *s); + str_bprintf(msg, sizeof(msg), "overflow at 0x%02lx, byte 0x%02lx", + (ulong) ov, (ulong) *s); break; case UTF8_WARN_SURROGATE: - gm_snprintf(msg, sizeof(msg), "UTF-16 surrogate 0x04%lx", (gulong) v); + str_bprintf(msg, sizeof(msg), "UTF-16 surrogate 0x04%lx", (ulong) v); break; case UTF8_WARN_BOM: - gm_snprintf(msg, sizeof(msg), "byte order mark 0x%04lx", (gulong) v); + str_bprintf(msg, sizeof(msg), "byte order mark 0x%04lx", (ulong) v); break; case UTF8_WARN_LONG: - gm_snprintf(msg, sizeof(msg), "%d byte%s, need %d", - expectlen, expectlen == 1 ? "" : "s", uniskip(v)); + str_bprintf(msg, sizeof(msg), "%d byte%s, need %d", + expectlen, plural(expectlen), uniskip(v)); break; case UTF8_WARN_ILLEGAL: - gm_snprintf(msg, sizeof(msg), "character 0x%04lx", (gulong) v); + str_bprintf(msg, sizeof(msg), "character 0x%04lx", (ulong) v); break; default: - gm_snprintf(msg, sizeof(msg), "unknown reason"); + str_bprintf(msg, sizeof(msg), "unknown reason"); break; } @@ -722,12 +734,12 @@ } /* Slower but correct, keep it around for consistency checks. */ -static guint32 -utf8_decode_char_less_fast(const char *s, guint *retlen) +static uint32 +utf8_decode_char_less_fast(const char *s, uint *retlen) { - guint32 v = *s; - guint32 nv; - guint32 ov = 0; + uint32 v = *s; + uint32 nv; + uint32 ov = 0; int clen = 1; int expectlen = 0; @@ -776,7 +788,7 @@ if (UNICODE_IS_SURROGATE(v)) goto malformed; if (UNICODE_IS_BYTE_ORDER_MARK(v)) goto malformed; - if ((guint) expectlen > uniskip(v)) goto malformed; + if ((uint) expectlen > uniskip(v)) goto malformed; if (UNICODE_IS_ILLEGAL(v)) goto malformed; return v; @@ -790,6 +802,55 @@ #endif /* TEST_UTF8_DECODER */ /** + * Decode a long-character (more than one byte). + * + * @param s the second byte of the character + * @param uc the first byte we read + * @param retlen initial amount of chars to expect, updated if char invalid + * + * @returns the decoded character value. + * + * If `s' does not point to the second byte of a well-formed UTF-8 character, + * `retlen' is set to 0 and the function returns 0. + */ +static uint32 G_HOT +utf8_decode_large_char_fast(const char *s, uint32 uc, uint *retlen) +{ + uchar c = *s; + uint i = uc & 0x3F; + uint n = *retlen; + + /* The second byte needs special handling */ + + if (c > utf8_2nd_byte_tabi.end || c < utf8_2nd_byte_tabi.start) + goto failure; + + n--; + uc &= 0x3F >> n; + + for (;;) { + uc = UTF8_ACCUMULATE(uc, c); + if (--n == 0) + break; + c = *++s; + + /* Any further bytes must be in the range 0x80...0xBF. */ + if (0x80 != (0xC0 & c)) + goto failure; + } + + /* Check for BOMs (*FFFE) and invalid codepoints (*FFFF) */ + if (0xFFFE == (0xFFFE & uc)) + goto failure; + + return uc; + +failure: + *retlen = 0; + return 0; +} + +/** * This routine is the same as utf8_decode_char() but it is more specialized * and is aimed at being fast. Use it when you don't need warnings and you * don't know the length of the string you're reading from. @@ -801,11 +862,11 @@ * If `s' does not point to a well-formed UTF-8 character, `retlen' is * set to 0 and the function returns 0. */ -G_GNUC_HOT guint32 -utf8_decode_char_fast(const char *s, guint *retlen) +uint32 G_HOT +utf8_decode_char_fast(const char *s, uint *retlen) { - guint32 uc = (guchar) *s; - guint n = utf8_skip(uc); + uint32 uc = (uchar) *s; + uint n = utf8_skip(uc); /* * utf8_skip() returns zero for an invalid initial byte. @@ -814,44 +875,12 @@ *retlen = n; - if (1 != n) { - guchar c; - guint i; - - if (0 == n) - goto failure; - - /* The second byte needs special handling */ - - c = *++s; - i = uc & 0x3F; - if (c > utf8_2nd_byte_tabi.end || c < utf8_2nd_byte_tabi.start) - goto failure; - - n--; - uc &= 0x3F >> n; - - for (;;) { - uc = UTF8_ACCUMULATE(uc, c); - if (--n == 0) - break; - c = *++s; - - /* Any further bytes must be in the range 0x80...0xBF. */ - if (0x80 != (0xC0 & c)) - goto failure; - } - - /* Check for BOMs (*FFFE) and invalid codepoints (*FFFF) */ - if (0xFFFE == (0xFFFE & uc)) - goto failure; - } - - return uc; - -failure: - *retlen = 0; - return 0; + if G_UNLIKELY(0 == n) + return 0; + else if (1 == n) + return uc; + else + return utf8_decode_large_char_fast(s + 1, uc, retlen); } /** @@ -868,11 +897,11 @@ * is too short to hold the character entirely, `retlen' is set to 0 and the * function returns 0. */ -guint32 -utf8_decode_char_buffer(const char *s, size_t len, guint *retlen) +uint32 +utf8_decode_char_buffer(const char *s, size_t len, uint *retlen) { - guint32 uc; - guint n; + uint32 uc; + uint n; if (0 == len) goto failure; @@ -882,44 +911,18 @@ * It also rejects surrogates (U+D800..U+DFFF) implicitely. */ - uc = (guchar) *s; + uc = (uchar) *s; n = utf8_skip(uc); *retlen = n; - if (1 != n) { - guchar c; - guint i; - - if (0 == n || len < n) - goto failure; - - /* The second byte needs special handling */ - - c = *++s; - i = uc & 0x3F; - if (c > utf8_2nd_byte_tabi.end || c < utf8_2nd_byte_tabi.start) - goto failure; - - n--; - uc &= 0x3F >> n; - - for (;;) { - uc = UTF8_ACCUMULATE(uc, c); - if (--n == 0) - break; - c = *++s; - - /* Any further bytes must be in the range 0x80...0xBF. */ - if (0x80 != (0xC0 & c)) - goto failure; - } - - /* Check for BOMs (*FFFE) and invalid codepoints (*FFFF) */ - if (0xFFFE == (0xFFFE & uc)) - goto failure; - } - - return uc; + if G_UNLIKELY(0 == n) + return 0; + else if (1 == n) + return uc; + else if G_UNLIKELY(len < n) + goto failure; + else + return utf8_decode_large_char_fast(s + 1, uc, retlen); failure: *retlen = 0; @@ -932,16 +935,41 @@ * @param s a NUL-terminated string or at minimum a buffer with 4 bytes. * @return amount of bytes used to encode that character, or 0 if invalid. */ -guint +uint utf8_char_len(const char *s) { - guint clen; - if (UTF8_IS_ASCII(*s)) + uint32 uc = (uchar) *s; + + if (UTF8_IS_ASCII(uc)) return 1; - (void) utf8_decode_char_fast(s, &clen); - return clen; + else { + uint clen = utf8_skip(uc); + + (void) utf8_decode_large_char_fast(s + 1, uc, &clen); + return clen; + } } +/** + * Computes the length of the UTF-8 character, ignoring invalid encodings. + * + * This is suitable in operations where we're not going to alter the encoding, + * for instance during copy. + */ +static inline uint G_PURE +utf8_char_len_probe(const char *s) +{ + uint32 uc = (uchar) *s; + + if (UTF8_IS_ASCII(uc)) + return 1; + + uc &= 0xF0; + if (uc < 0xE0) + return 2; + + return 0xE0 == uc ? 3 : 4; +} /** * Determine whether a string is UTF-8 encoded. @@ -950,15 +978,16 @@ * @return FALSE if there are any non-UTF-8 characters before the * terminating NUL, otherwise TRUE. */ -gboolean +bool utf8_is_valid_string(const char *src) { const char *s; - guint clen; + uint clen; - for (s = src; '\0' != *s; s += clen) + for (s = src; '\0' != *s; s += clen) { if (0 == (clen = utf8_char_len(s))) - return FALSE; + return FALSE; + } return TRUE; } @@ -967,7 +996,7 @@ * @return TRUE if the first `len' bytes of the given string * `s' form valid a UTF-8 string, FALSE otherwise. */ -gboolean +bool utf8_is_valid_data(const char *src, size_t len) { g_assert(src); @@ -984,11 +1013,20 @@ return 0 == len; } +/** + * Slowly count the amount of UTF-8 codepoints in the string, validating + * each codepoint for valid encoding. + * + * @param src a NUL-terminated string buffer + * + * @return the amount of Unicode characters, -1 if we found an invalid UTF-8 + * encoding. + */ size_t utf8_char_count(const char *src) { const char *s; - guint clen; + uint clen; size_t n; for (s = src, n = 0; '\0' != *s; s += clen, n++) @@ -998,20 +1036,112 @@ return n; } +/** + * Slowly count the amount of UTF-8 codepoints in the string, validating + * each codepoint for valid encoding. + * + * @param src a string buffer (not necessarily NUL-terminated) + * @param len length of buffer + * + * @return the amount of Unicode characters, -1 if we found an invalid UTF-8 + * encoding. + */ size_t utf8_data_char_count(const char *src, size_t len) { const char *s; - guint clen; + size_t rlen; + uint clen; size_t n; - for (s = src, n = 0; (clen = utf8_skip(*s)) >= len; s += clen, n++) + for ( + s = src, n = 0, rlen = len; + size_is_positive(rlen) && (clen = utf8_skip(*s)) <= rlen; + s += clen, n++, rlen -= clen + ) if (0 == (utf8_char_len(s))) return (size_t) -1; return n; } +#define ONEMASK ((size_t) (-1) / 0xff) /* 0x01010101 on 32-bit machine */ + +/** + * Quickly compute the amount of UTF-8 codepoints in the string, without + * validating that the string is a valid UTF-8 one. + * + * @param src a NUL-terminated string buffer, assumed valid UTF-8 + * + * @return the amount of Unicode characters in the string. + * + * This code was designed by Colin Percival for speed. + * See http://www.daemonology.net/blog/2008-06-05-faster-utf8-strlen.html + */ +size_t +utf8_strlen(const char *str) +{ + const char * s; + size_t count = 0; /* Bytes which are NOT the first byte of a character */ + size_t u; + unsigned char b; + + /* + * Handle any initial misaligned bytes. + */ + + for (s = str; pointer_to_ulong(s) & (sizeof(size_t) - 1); s++) { + b = *s; + + if (b == '\0') + goto done; /* Exit if we hit a zero byte. */ + + /* Is this byte NOT the first byte of a character? */ + count += (b >> 7) & ((~b) >> 6); + } + + /* + * Handle complete blocks. + * + * This may read more byte than are present in the string, should the + * trailing NUL byte be in the middle of a block. + * + * However, this is safe because we cannot cross any page boundary + * by doing so, hence we cannot incur a memory fault. This relies + * on the fact that the initial string is NUL-terminated, of course. + */ + + for (; ; s += sizeof(size_t)) { + G_PREFETCH_R(&sUTF8_CPU_CACHELINE); /* Prefetch a cacheline ahead */ + + u = *(size_t *) s; /* Grab 4 or 8 bytes of UTF-8 data */ + + if ((u - ONEMASK) & (~u) & (ONEMASK * 0x80)) + break; /* Exit loop if there are any zero bytes */ + + /* Count bytes which are NOT the first byte of a character. */ + u = ((u & (ONEMASK * 0x80)) >> 7) & ((~u) >> 6); + count += (u * ONEMASK) >> ((sizeof(size_t) - 1) * 8); + } + + /* + * Take care of any left-over bytes. + */ + + for (; ; s++) { + b = *s; + + if (b == '\0') + break; /* Exit if we hit a zero byte */ + + /* Is this byte NOT the first byte of a character? */ + count += (b >> 7) & ((~b) >> 6); + } + +done: + return (s - str) - count; +} + /** * Works exactly like strlcpy() but preserves a valid UTF-8 encoding, if * the string has to be truncated. @@ -1033,19 +1163,17 @@ while ('\0' != *s) { size_t clen; - clen = utf8_char_len(s); - clen = MAX(1, clen); - if (clen > dst_size) + clen = utf8_char_len_probe(s); + if G_UNLIKELY(clen > dst_size) break; if (clen == 1) { *d++ = *s++; dst_size--; } else { - memmove(d, s, clen); - d += clen; - s += clen; dst_size -= clen; + while (clen--) + *d++ = *s++; } } *d = '\0'; @@ -1079,9 +1207,8 @@ while ('\0' != *s && max_chars > 0) { size_t clen; - clen = utf8_char_len(s); - clen = MAX(1, clen); - if (clen > dst_size) + clen = utf8_char_len_probe(s); + if G_UNLIKELY(clen > dst_size) break; max_chars--; @@ -1089,10 +1216,9 @@ *d++ = *s++; dst_size--; } else { - memmove(d, s, clen); - d += clen; - s += clen; dst_size -= clen; + while (clen--) + *d++ = *s++; } } *d = '\0'; @@ -1111,8 +1237,8 @@ * @returns 0 if the unicode character is invalid. Otherwise, the * amount of UTF-16 characters is returned i.e., 1 or 2. */ -static unsigned NON_NULL_PARAM((2)) -utf16_encode_char(guint32 uc, guint16 *dst) +static unsigned NON_NULL_PARAM((2)) +utf16_encode_char(uint32 uc, uint16 *dst) { if (uc < 0xFFFF) { dst0 = uc; @@ -1134,7 +1260,7 @@ * length of the UTF-8 character is returned. */ unsigned -utf16_encoded_char_len(guint32 uc) +utf16_encoded_char_len(uint32 uc) { if (uc < 0xFFFF) { return 1; @@ -1159,11 +1285,11 @@ * to contain the whole character, `retlen' is set to 0 and the function * returns 0. */ -guint32 -utf16_be_decode_char_buffer(const char *s, size_t len, guint *retlen) +uint32 +utf16_be_decode_char_buffer(const char *s, size_t len, uint *retlen) { - guchar c; - guint16 first; + uchar c; + uint16 first; if (len < 2) goto malformed; @@ -1173,17 +1299,17 @@ if (0 == c) goto malformed; - first = (guint16) c << 8; + first = (uint16) c << 8; c = *s++; if (0 == c) goto malformed; - first |= (guint16) c; + first |= (uint16) c; len -= 2; if ((first & 0xfc00) == UNI_SURROGATE_FIRST) { - guint16 second; - guint32 uc; + uint16 second; + uint32 uc; if (len < 2) goto single_char; @@ -1191,16 +1317,16 @@ c = *s++; if (0 == c) goto single_char; - second = (guint16) c << 8; + second = (uint16) c << 8; c = *s++; if (0 == c) goto single_char; - second |= (guint16) c; + second |= (uint16) c; if ((second & 0xfc00) != UNI_SURROGATE_SECOND) goto single_char; - uc = ((guint32) (first & 0x3ff) << 10) | (guint32) (second & 0x3ff); + uc = ((uint32) (first & 0x3ff) << 10) | (uint32) (second & 0x3ff); *retlen = 4; return uc + 0x10000; @@ -1229,11 +1355,11 @@ * to contain the whole character, `retlen' is set to 0 and the function * returns 0. */ -guint32 -utf16_le_decode_char_buffer(const char *s, size_t len, guint *retlen) +uint32 +utf16_le_decode_char_buffer(const char *s, size_t len, uint *retlen) { - guchar c; - guint16 first; + uchar c; + uint16 first; if (len < 2) goto malformed; @@ -1243,17 +1369,17 @@ if (0 == c) goto malformed; - first = (guint16) c; + first = (uint16) c; c = *s++; if (0 == c) goto malformed; - first |= (guint16) c << 8; + first |= (uint16) c << 8; len -= 2; if ((first & 0xFC00) == UNI_SURROGATE_FIRST) { - guint16 second; - guint32 uc; + uint16 second; + uint32 uc; if (len < 2) goto single_char; @@ -1261,16 +1387,16 @@ c = *s++; if (0 == c) goto single_char; - second = (guint16) c; + second = (uint16) c; c = *s++; if (0 == c) goto single_char; - second |= (guint16) c << 8; + second |= (uint16) c << 8; if ((second & 0xFC00) != UNI_SURROGATE_SECOND) goto single_char; - uc = ((guint32) (first & 0x3ff) << 10) | (guint32) (second & 0x3ff); + uc = ((uint32) (first & 0x3ff) << 10) | (uint32) (second & 0x3ff); *retlen = 4; return uc + 0x10000; @@ -1299,10 +1425,10 @@ * to contain the whole character, `retlen' is set to 0 and the function * returns 0. */ -guint32 -utf32_be_decode_char_buffer(const char *s, size_t len, guint *retlen) +uint32 +utf32_be_decode_char_buffer(const char *s, size_t len, uint *retlen) { - guint32 uc; + uint32 uc; if (len < 4) goto malformed; @@ -1333,10 +1459,10 @@ * to contain the whole character, `retlen' is set to 0 and the function * returns 0. */ -guint32 -utf32_le_decode_char_buffer(const char *s, size_t len, guint *retlen) +uint32 +utf32_le_decode_char_buffer(const char *s, size_t len, uint *retlen) { - guint32 uc; + uint32 uc; if (len < 4) goto malformed; @@ -1482,14 +1608,14 @@ const char * locale_get_charset(void) { - static gboolean initialized; + static bool initialized; static const char *cs; if (!initialized) { #if defined(USE_GLIB2) g_get_charset(&cs); #else /* !USE_GLIB2 */ -#if defined(HAS_LOCALE_CHARSET) +#if defined(HAS_LOCALE_CHARSET) cs = locale_charset(); #else /* !I_LIBCHARSET */ cs = get_iconv_charset_alias(nl_langinfo(CODESET)); @@ -1499,7 +1625,8 @@ if (cs == NULL) { /* Default locale codeset */ cs = "ISO-8859-1"; - g_warning("locale_init: using default codeset %s as fallback", cs); + g_warning("%s(): using default codeset %s as fallback", + G_STRFUNC, cs); } cs = h_strdup(cs); @@ -1530,13 +1657,14 @@ struct conv_to_utf8 *t; WALLOC(t); + t->magic = CONV_TO_UTF8_MAGIC; t->cd = (iconv_t) -1; t->name = atom_str_get(cs); t->is_utf8 = 0 == strcmp(cs, "UTF-8"); t->is_ascii = 0 == strcmp(cs, "ASCII"); t->is_iso8859 = NULL != is_strprefix(cs, "ISO-8859-"); - gm_hash_table_insert_const(charset2conv_to_utf8, t->name, t); + hikset_insert_key(charset2conv_to_utf8, &t->name); return t; } @@ -1544,11 +1672,14 @@ static void conv_to_utf8_free(struct conv_to_utf8 *cu) { + conv_to_utf8_check(cu); + atom_str_free_null(&cu->name); if (cu->cd != (iconv_t) -1) { iconv_close(cu->cd); cu->cd = (iconv_t) -1; } + cu->magic = 0; WFREE(cu); } @@ -1558,7 +1689,7 @@ static void conv_to_utf8_init(struct conv_to_utf8 *cu) { - g_assert(cu != NULL); + conv_to_utf8_check(cu); if (0 == strcmp("@locale", cu->name) || 0 == strcmp(charset, cu->name)) cu->cd = cd_locale_to_utf8; @@ -1580,10 +1711,12 @@ { struct conv_to_utf8 *cu; - cu = g_hash_table_lookup(charset2conv_to_utf8, cs); + cu = hikset_lookup(charset2conv_to_utf8, cs); if (NULL == cu) cu = conv_to_utf8_new(cs); + conv_to_utf8_check(cu); + if ((iconv_t) -1 == cu->cd) conv_to_utf8_init(cu); @@ -1599,12 +1732,12 @@ * used character sets. The first is the one that should be * used when creating files. */ -static G_GNUC_COLD GSList * +static pslist_t * G_COLD get_filename_charsets(const char *locale) { const char *s, *next; - gboolean has_locale = FALSE, has_utf8 = FALSE; - GSList *sl = NULL; + bool has_locale = FALSE, has_utf8 = FALSE; + pslist_t *sl = NULL; g_assert(locale); @@ -1651,7 +1784,7 @@ } if (cs) - sl = g_slist_prepend(sl, conv_to_utf8_new(cs)); + sl = pslist_prepend(sl, conv_to_utf8_new(cs)); } } @@ -1659,13 +1792,13 @@ /* If UTF-8 wasn't in the list, add it as penultimate (or actually first) * option. */ if (!has_utf8) - sl = g_slist_prepend(sl, conv_to_utf8_new("UTF-8")); - + sl = pslist_prepend(sl, conv_to_utf8_new("UTF-8")); + /* Always add the locale charset as last resort if not already listed. */ if (!has_locale && 0 != strcmp("UTF-8", locale)) - sl = g_slist_prepend(sl, conv_to_utf8_new(locale)); - - return g_slist_reverse(sl); + sl = pslist_prepend(sl, conv_to_utf8_new(locale)); + + return pslist_reverse(sl); } static void @@ -1673,11 +1806,8 @@ { #ifdef ENABLE_NLS { - char *nlspath; - - nlspath = get_folder_path(NLS_PATH, NULL); + const char *nlspath = get_folder_path(NLS_PATH); bindtextdomain(PACKAGE, nlspath); - HFREE_NULL(nlspath); } #ifdef HAS_BIND_TEXTDOMAIN_CODESET @@ -1700,26 +1830,26 @@ static void locale_init_show_results(void) { - const GSList *sl = sl_filename_charsets; + const pslist_t *sl = sl_filename_charsets; g_info("language code: \"%s\"", locale_get_language()); g_info("using locale character set \"%s\"", charset); g_info("primary filename character set \"%s\"", primary_filename_charset()); - while (NULL != (sl = g_slist_next(sl))) { - const struct conv_to_utf8 *t = sl->data; + while (NULL != (sl = pslist_next(sl))) { + const struct conv_to_utf8 *t = pslist_data(sl); + conv_to_utf8_check(t); g_info("additional filename character set \"%s\"", t->name); } } -static G_GNUC_COLD void +static void G_COLD conversion_init(void) { const char *pfcs = primary_filename_charset(); iconv_t cd_from_utf8; - GSList *sl; g_assert(charset); g_assert(pfcs); @@ -1747,7 +1877,7 @@ } /* Initialize UTF-8 -> primary filename charset conversion */ - + /* * We don't need cd_utf8_to_filename if the filename character set * is ASCII or UTF-8. In the former case we fall back to ascii_enforce() @@ -1773,16 +1903,13 @@ } /* Initialize filename charsets -> UTF-8 conversion */ - - for (sl = sl_filename_charsets; sl != NULL; sl = g_slist_next(sl)) { - conv_to_utf8_init(sl->data); - } + + PSLIST_FOREACH_CALL(sl_filename_charsets, conv_to_utf8_init); } static void -conversion_free_kv(gpointer u_key, gpointer value, gpointer u_data) +conversion_free_kv(void *value, void *u_data) { - (void) u_key; (void) u_data; conv_to_utf8_free(value); @@ -1791,11 +1918,11 @@ static void conversion_close(void) { - g_hash_table_foreach(charset2conv_to_utf8, conversion_free_kv, NULL); - gm_hash_table_destroy_null(&charset2conv_to_utf8); + hikset_foreach(charset2conv_to_utf8, conversion_free_kv, NULL); + hikset_free_null(&charset2conv_to_utf8); } -G_GNUC_COLD void +void G_COLD locale_init(void) { static const char * const latin_sets = { @@ -1814,7 +1941,7 @@ "ISO-8859-4", "ISO-8859-14", }; - guint i; + uint i; /* Must not be called multiple times */ g_return_if_fail(!locale_init_passed); @@ -1831,7 +1958,7 @@ #else setlocale(LC_ALL, ""); #endif - charset = deconstify_gpointer(locale_get_charset()); + charset = deconstify_pointer(locale_get_charset()); /* * If the character set could not be properly detected, use ASCII as @@ -1844,14 +1971,15 @@ * peruse the list we build here in sl_filename_charsets. */ - charset2conv_to_utf8 = g_hash_table_new(g_str_hash, g_str_equal); + charset2conv_to_utf8 = hikset_create( + offsetof(struct conv_to_utf8, name), HASH_KEY_STRING, 0); sl_filename_charsets = get_filename_charsets(charset ? charset : "ASCII"); g_assert(sl_filename_charsets); g_assert(sl_filename_charsets->data); textdomain_init(charset); - for (i = 0; i < G_N_ELEMENTS(latin_sets); i++) { + for (i = 0; i < N_ITEMS(latin_sets); i++) { if (0 == ascii_strcasecmp(charset, latin_setsi)) { latin_locale = TRUE; break; @@ -1894,22 +2022,21 @@ /** * Hashtable iteration callback to free lists from utf32_compose_roots. */ -static gboolean -compose_free_slist(gpointer unused_key, gpointer value, gpointer unused_udata) +static void +compose_free_slist(const void *unused_key, void *value, void *unused_udata) { - GSList *sl = value; + pslist_t *sl = value; (void) unused_key; (void) unused_udata; - g_slist_free(sl); - return TRUE; + pslist_free(sl); } /** * Called at shutdown time. */ -G_GNUC_COLD void +void G_COLD locale_close(void) { #if 0 /* xxxUSE_ICU */ @@ -1933,11 +2060,11 @@ * Hence we only need to free the list itself now. */ - gm_slist_free_null(&sl_filename_charsets); + pslist_free_null(&sl_filename_charsets); HFREE_NULL(charset); - g_hash_table_foreach_remove(utf32_compose_roots, compose_free_slist, NULL); - gm_hash_table_destroy_null(&utf32_compose_roots); + htable_foreach(utf32_compose_roots, compose_free_slist, NULL); + htable_free_null(&utf32_compose_roots); } /** @@ -1965,7 +2092,7 @@ */ static size_t complete_iconv(iconv_t cd, char *dst, const size_t dst_size, const char *src, - size_t src_len, gboolean abort_on_error) + size_t src_len, bool abort_on_error) { size_t src_left, size = 0; @@ -1974,7 +2101,7 @@ if ((iconv_t) -1 == cd) { if (common_dbg > 1) - g_carp("complete_iconv: bad cd"); + g_critical("%s(): bad cd", G_STRFUNC); errno = EBADF; goto error; } @@ -1982,13 +2109,13 @@ /* reset state */ if ((size_t) -1 == iconv(cd, NULL, NULL, NULL, NULL)) { if (common_dbg > 1) - g_warning("complete_iconv: iconv() reset failed"); + g_warning("%s(): iconv() reset failed", G_STRFUNC); goto error; } src_left = (size_t) -1 == src_len ? strlen(src) : src_len; - while (src_left > 0) { + while (size_is_positive(src_left)) { char buf4096; size_t ret, n_read, n_written; @@ -2000,24 +2127,34 @@ left0 = MIN(sizeof buf / 32, src_left); left = left0; - ret = iconv(cd, cast_to_gpointer(&src), &left, &buf_ptr, &buf_size); + ret = iconv(cd, cast_to_pointer(&src), &left, &buf_ptr, &buf_size); n_read = left0 - left; n_written = buf_ptr - buf; + + g_assert_log(size_is_non_negative(n_read), + "n_read=%s", size_t_to_string(n_read)); + + if (!size_is_non_negative(n_written)) { + n_written = 0; + g_assert((size_t) -1 == ret); /* Only possible on errors */ + } + + g_assert(src_left >= n_read); + src_left -= n_read; } size += n_written; if (dst_size > size) { - memcpy(dst, buf, n_written); - dst += n_written; + dst = mempcpy(dst, buf, n_written); } if ((size_t) -1 == ret) { int e = errno; if (common_dbg > 1) - g_warning("complete_iconv: iconv() failed: %m"); + g_warning("%s(): iconv() failed: %m", G_STRFUNC); g_assert(E2BIG != e); g_assert(EINVAL == e || EILSEQ == e); @@ -2042,10 +2179,13 @@ goto error; n_written = buf_ptr - buf; + + g_assert_log(size_is_non_negative(n_written), + "n_written=%s", size_t_to_string(n_written)); + size += n_written; if (dst_size > size) { - memcpy(dst, buf, n_written); - dst += n_written; + dst = mempcpy(dst, buf, n_written); } size += 1; if (dst_size > size) { @@ -2094,7 +2234,7 @@ */ static char * hyper_iconv(iconv_t cd, char *dst, size_t dst_size, const char *src, - size_t src_len, gboolean abort_on_error) + size_t src_len, bool abort_on_error) { size_t size; @@ -2112,7 +2252,7 @@ n = complete_iconv(cd, dst, size, src, src_len, abort_on_error); if (n != size) { g_error("size=%ld, n=%ld, src=\"%s\" dst=\"%s\"", - (gulong) size, (gulong) n, src, dst); + (ulong) size, (ulong) n, src, dst); } g_assert(n == size); } @@ -2145,38 +2285,56 @@ g_assert(size <= INT_MAX); /** TODO: Add overlap check */ +#define LOOP_BODY \ + if (src_len != (size_t) -1) { \ + uint len = utf8_skip(*s); \ + /* Break if whole character does not fit */ \ + if (len > remain) \ + break; \ + clen = utf8_char_len(s); \ + g_assert(clen <= len); \ + remain -= clen; \ + } else { \ + clen = utf8_char_len(s); \ + } \ + \ + if (MAX(1, clen) > size) \ + break; \ + \ + if (clen < 2) { \ + *d++ = 0 == clen ? '_' : *s; \ + s++; \ + size--; \ + } else { \ + size -= clen; \ + while (clen--) \ + *d++ = *s++; \ + } + if (size-- > 0) { - while (size_is_positive(remain) && '\0' != *s) { - size_t clen; + if (size > UTF8_CPU_CACHELINE) { + /* Worth pre-fetching data */ + while (size_is_positive(remain) && '\0' != *s) { + size_t clen; - if (src_len != (size_t) -1) { - guint len = utf8_skip(*s); - if (len > remain) - break; /* Whole character does not fit */ - clen = utf8_char_len(s); - g_assert(clen <= len); - remain -= clen; - } else { - clen = utf8_char_len(s); - } + G_PREFETCH_R(&sUTF8_CPU_CACHELINE); + G_PREFETCH_W(&dUTF8_CPU_CACHELINE); - if (MAX(1, clen) > size) - break; + LOOP_BODY + } + } else { + /* Not worth pre-fetching data */ + while (size_is_positive(remain) && '\0' != *s) { + size_t clen; - if (clen < 2) { - *d++ = 0 == clen ? '_' : *s; - s++; - size--; - } else { - memmove(d, s, clen); - d += clen; - s += clen; - size -= clen; + LOOP_BODY } } *d = '\0'; } +#undef LOOP_BODY + while ('\0' != *s++) d++; @@ -2227,9 +2385,9 @@ /** TODO: Add overlap check */ if (size > 0) { - guchar c; + uchar c; - for (/* NOTHING */; --size > 0 && '\0' != (c = *s); s++, size) + for (/* NOTHING */; --size > 0 && '\0' != (c = *s); s++) *d++ = isascii(c) ? c : '_'; *d = '\0'; @@ -2281,7 +2439,7 @@ * @param src a NUL-terminated string. * @return If dst_size was sufficient dst is returned, otherwise * a newly allocated buffer. - * + * */ static char * hyper_ascii_enforce(char *dst, size_t dst_size, const char *src) @@ -2494,12 +2652,12 @@ } #if CHAR_BIT == 8 -#define IS_NON_NUL_ASCII(p) (*(const gint8 *) (p) > 0) +#define IS_NON_NUL_ASCII(p) (*(const int8 *) (p) > 0) #else #define IS_NON_NUL_ASCII(p) (!(*(p) & ~0x7f) && (*(p) > 0)) #endif -gboolean +bool is_ascii_string(const char *s) { while (IS_NON_NUL_ASCII(s)) @@ -2511,23 +2669,23 @@ static inline const char * ascii_rewind(const char * const s0, const char *p) { - while (s0 != p && (guchar) *p < 0x80) + while (s0 != p && (uchar) *p < 0x80) p--; return p; } -static inline gboolean -koi8_is_cyrillic_char(guchar c) +static inline bool +koi8_is_cyrillic_char(uchar c) { return c >= 0xC0; } -static gboolean +static bool looks_like_koi8(const char *src) { const char *s = src; size_t n = 0; - guchar c; + uchar c; for (s = src; (c = *s) >= 0x20; s++) n += koi8_is_cyrillic_char(c); @@ -2537,22 +2695,22 @@ } /* Checks for the common codepoint range of ISO8859-x encodings */ -static inline gboolean -iso8859_is_valid_char(guchar c) +static inline bool +iso8859_is_valid_char(uchar c) { /* 0x20..0x7E and 0xA0..0xFF are valid */ return 0 != (0x60 & c) && (0x7f != c); } -static inline gboolean -iso8859_6_is_arabic_char(guchar c) +static inline bool +iso8859_6_is_arabic_char(uchar c) { return c >= 0xC1; /* Ignore 0xF3..0xFF here */ } -static inline gboolean -iso8859_6_is_valid_char(guchar c) +static inline bool +iso8859_6_is_valid_char(uchar c) { return iso8859_is_valid_char(c) && ( c < 0x80 || @@ -2567,12 +2725,12 @@ ); } -static gboolean +static bool looks_like_iso8859_6(const char *src) { const char *s; size_t n = 0; - guchar c; + uchar c; for (s = src; iso8859_6_is_valid_char(c = *s); s++) n += iso8859_6_is_arabic_char(c); @@ -2584,18 +2742,18 @@ } -static inline gboolean -iso8859_7_is_greek_char(guchar c) +static inline bool +iso8859_7_is_greek_char(uchar c) { return c >= 0xB0; /* Ignore 0xFF here */ } -static gboolean +static bool looks_like_iso8859_7(const char *src) { const char *s; size_t n = 0; - guchar c; + uchar c; for (s = src; iso8859_is_valid_char(c = *s) && 0xD2 != c; s++) n += iso8859_7_is_greek_char(c); @@ -2606,14 +2764,14 @@ return '\0' == c && n > 0 && (s - src) > 8 && (s - src) / n < 2; } -static inline gboolean -iso8859_8_is_hebrew_char(guchar c) +static inline bool +iso8859_8_is_hebrew_char(uchar c) { return c >= 0xE0; /* Ignore 0xFB..0xFF here */ } -static inline gboolean -iso8859_8_is_valid_char(guchar c) +static inline bool +iso8859_8_is_valid_char(uchar c) { return iso8859_is_valid_char(c) && ( c < 0x80 || @@ -2625,12 +2783,12 @@ ); } -static gboolean +static bool looks_like_iso8859_8(const char *src) { const char *s; size_t n = 0; - guchar c; + uchar c; for (s = src; iso8859_8_is_valid_char(c = *s); s++) n += iso8859_8_is_hebrew_char(c); @@ -2651,13 +2809,13 @@ * - ASCII/JIS Roman "\x00-\x7F" * - JIS X 0208:1997 "\x81-\x9F\xE0-\xFC\x40-\x7E\x80-\xFC" * - Half width Katakana "\xA0-\xDF" - */ -static gboolean + */ +static bool looks_like_sjis(const char *src) { const char *s; size_t n = 0; - guchar c; + uchar c; for (s = src; '\0' != (c = *s); s++) n += (c >= 0xA0 && c <= 0xDF) || @@ -2670,7 +2828,7 @@ return '\0' == c && n > 0 && (s - src) / n < 2; } -static gboolean +static bool iso8859_is_valid_string(const char *src) { while (iso8859_is_valid_char(*src)) @@ -2704,7 +2862,7 @@ if (utf8_is_valid_string(src)) { if (charset_ptr) *charset_ptr = "UTF-8"; - return deconstify_gchar(src); + return deconstify_char(src); } if (looks_like_sjis(src)) @@ -2763,7 +2921,7 @@ unknown_to_ui_string(const char *src) { char *utf8_str, *ui_str; - + utf8_str = unknown_to_utf8(src, NULL); ui_str = utf8_to_ui_string(utf8_str); if (utf8_str != ui_str && utf8_str != src) { @@ -2828,14 +2986,16 @@ char * filename_to_utf8_normalized(const char *src, uni_norm_t norm) { - const GSList *sl; + const pslist_t *sl; const char *s = NULL; char *dbuf = NULL, *dst; g_assert(src); - for (sl = sl_filename_charsets; sl != NULL; sl = g_slist_next(sl)) { - const struct conv_to_utf8 *t = sl->data; + PSLIST_FOREACH(sl_filename_charsets, sl) { + const struct conv_to_utf8 *t = pslist_data(sl); + + conv_to_utf8_check(t); if (t->is_utf8) { if (utf8_is_valid_string(src)) { @@ -2847,7 +3007,7 @@ s = src; break; } - } else if (t->is_iso8859 && !iso8859_is_valid_string(src)) { + } else if (t->is_iso8859) { /* * iconv() may not care about characters in the range * 0x00..0x1F,0x7E and 0x80..BF which causes UTF-8 strings being @@ -2857,19 +3017,25 @@ * G_FILENAME_ENCODING=ISO-8859-* when some filenames are UTF-8 * encoded. */ - continue; - } else { - dbuf = hyper_iconv(t->cd, NULL, 0, src, (size_t) -1, TRUE); - if (dbuf) { - s = dbuf; + if (!iso8859_is_valid_string(src)) + continue; + if (is_ascii_string(src)) { + s = src; break; } } + + dbuf = hyper_iconv(t->cd, NULL, 0, src, (size_t) -1, TRUE); + if (dbuf) { + s = dbuf; + break; + } } if (!s) { if (!utf8_is_valid_string(src)) { - g_warning("Could not properly convert to UTF-8: \"%s\"", src); + g_warning("%s(): could not properly convert to UTF-8: \"%s\"", + G_STRFUNC, src); } g_assert(NULL == dbuf); dbuf = hyper_utf8_enforce(NULL, 0, src, (size_t) -1); @@ -2935,7 +3101,7 @@ g_assert(utf8_is_valid_string(src)); if (ui_uses_utf8_encoding() || locale_is_utf8()) { - return deconstify_gchar(src); + return deconstify_char(src); } else { return utf8_to_locale(src); } @@ -2951,7 +3117,7 @@ * UTF-8 codepoints the assertion below might actually fail. */ g_assert(utf8_is_valid_string(src)); - return deconstify_gchar(src); + return deconstify_char(src); } else { return locale_to_utf8(src); } @@ -2965,7 +3131,7 @@ if (ui_uses_utf8_encoding()) { return locale_to_utf8_normalized(src, UNI_NORM_GUI); } else { - return deconstify_gchar(src); + return deconstify_char(src); } } @@ -3106,9 +3272,12 @@ /** * Converts a UTF-8 encoded string to a UTF-16 encoded string. * - * The target string ``out'' is always be zero-terminated unless + * The target string ``out'' will always be zero-terminated unless * ``size'' is zero. * + * When called with a NULL destination, it computes the size of the + * resulting converted string. + * * @param in the UTF-8 input string. * @param out the target buffer for converted UTF-16 string. * @param size the length of the outbuf buffer - characters not @@ -3120,10 +3289,10 @@ * string. */ size_t -utf8_to_utf16(const char *in, guint16 *out, size_t size) +utf8_to_utf16(const char *in, uint16 *out, size_t size) { const char *s = in; - guint16 *p = out; + uint16 *p = out; g_assert(in != NULL); g_assert(size == 0 || out != NULL); @@ -3133,8 +3302,8 @@ size--; /* Reserve one for NUL-termination */ while (size > 0) { - guint32 uc; - guint16 buf2; + uint32 uc; + uint16 buf2; unsigned int in_len, out_len; uc = utf8_decode_char_fast(s, &in_len); @@ -3156,7 +3325,7 @@ } if (*s != '\0') { - guint32 uc; + uint32 uc; unsigned in_len; while (0x0000 != (uc = utf8_decode_char_fast(s, &in_len))) { @@ -3173,14 +3342,14 @@ * * @return newly halloc()ed string. */ -guint16 * +uint16 * utf8_to_utf16_string(const char *in) { size_t n; - guint16 *out; + uint16 *out; n = 1 + utf8_to_utf16(in, NULL, 0); - out = halloc(n * sizeof *out); + HALLOC_ARRAY(out, n); utf8_to_utf16(in, out, n); return out; } @@ -3189,31 +3358,31 @@ * @note If decoding was successful and the resulting codepoint is * greater than 0xFFFF, "next" has been used and should be skipped * when decoding successively. - * @return (guint32) -1 on failure, + * @return (uint32) -1 on failure, */ -static inline guint32 -utf16_decode_pair(guint16 c, guint16 next) +static inline uint32 +utf16_decode_pair(uint16 c, uint16 next) { - guint32 w1, w2; + uint32 w1, w2; if (c < UNI_SURROGATE_FIRST) return c; if (UNI_ILLEGAL == c) - return (guint32) -1; + return (uint32) -1; if (c > UNI_SURROGATE_LAST) return c; if (next < UNI_SURROGATE_SECOND || next > UNI_SURROGATE_LAST) - return (guint32) -1; + return (uint32) -1; w1 = c & ~UNI_SURROGATE_FIRST; w2 = next & ~UNI_SURROGATE_SECOND; return 0x10000UL | (w1 << 10) | w2; } -static inline guint32 -utf16_decode_char(const guint16 *s, guint *retlen) +static inline uint32 +utf16_decode_char(const uint16 *s, uint *retlen) { - guint32 uc; + uint32 uc; uc = utf16_decode_pair(s0, 0x0000 != s0 ? s1 : 0x0000); *retlen = utf16_encoded_char_len(uc); @@ -3223,9 +3392,12 @@ /** * Converts a UTF-16 encoded string to a UTF-8 encoded string. * - * The target string ``out'' is always be zero-terminated unless + * The target string ``out'' will always be zero-terminated unless * ``size'' is zero. * + * When called with a NULL destination, it computes the size of the + * resulting converted string. + * * @param src the UTF-16 input string. * @param dst the target buffer for converted UTF-8 string. * @param size the length of the outbuf buffer in bytes. @@ -3236,10 +3408,10 @@ * @returns the length in bytes of completely converted string. */ size_t -utf16_to_utf8(const guint16 *src, char *dst, size_t size) +utf16_to_utf8(const uint16 *src, char *dst, size_t size) { char *p = dst; - guint32 uc; + uint32 uc; g_assert(src != NULL); g_assert(size == 0 || dst != NULL); @@ -3248,7 +3420,7 @@ if (size > 0) { size--; while (0x0000 != *src && size > 0) { - guint in_len, out_len; + uint in_len, out_len; uc = utf16_decode_char(src, &in_len); if (0x0000 == uc || 0 == in_len) @@ -3266,7 +3438,7 @@ } while (0x0000 != *src) { - guint in_len, out_len; + uint in_len, out_len; uc = utf16_decode_char(src, &in_len); if (0 == in_len) @@ -3289,13 +3461,13 @@ * @return newly halloc()ed string. */ char * -utf16_to_utf8_string(const guint16 *in) +utf16_to_utf8_string(const uint16 *in) { size_t n; char *out; n = 1 + utf16_to_utf8(in, NULL, 0); - out = halloc(n * sizeof *out); + HALLOC_ARRAY(out, n); utf16_to_utf8(in, out, n); return out; } @@ -3317,18 +3489,18 @@ * string. */ static size_t -utf8_to_utf32(const char *in, guint32 *out, size_t size) +utf8_to_utf32(const char *in, uint32 *out, size_t size) { const char *s = in; - guint32 *p = out; - guint retlen; + uint32 *p = out; + uint retlen; g_assert(in != NULL); g_assert(size == 0 || out != NULL); g_assert(size <= INT_MAX); if (size > 0) { - guint32 uc; + uint32 uc; while (--size > 0) { uc = utf8_decode_char_fast(s, &retlen); @@ -3366,10 +3538,10 @@ * @returns the length in bytes of completely converted string. */ size_t -utf32_to_utf8(const guint32 *src, char *dst, size_t size) +utf32_to_utf8(const uint32 *src, char *dst, size_t size) { char *p = dst; - guint32 uc; + uint32 uc; g_assert(src != NULL); g_assert(size == 0 || dst != NULL); @@ -3413,12 +3585,12 @@ * @returns the length in bytes of completely converted string. */ static size_t -utf32_to_utf8_inplace(guint32 *buf) +utf32_to_utf8_inplace(uint32 *buf) { - const guint32 *src = buf; - char *dst = cast_to_gchar_ptr(buf); - guint32 uc; - guint len; + const uint32 *src = buf; + char *dst = cast_to_char_ptr(buf); + uint32 uc; + uint len; g_assert(buf != NULL); @@ -3429,16 +3601,16 @@ } *dst = '\0'; - return dst - cast_to_gchar_ptr(buf); + return dst - cast_to_char_ptr(buf); } /** * The equivalent of g_strdup() for UTF-32 strings. */ -static guint32 * -utf32_strdup(const guint32 *s) +static uint32 * +utf32_strdup(const uint32 *s) { - guint32 *p; + uint32 *p; size_t n; if (!s) @@ -3451,9 +3623,9 @@ } static gint64 -utf32_strcmp(const guint32 *s1, const guint32 *s2) +utf32_strcmp(const uint32 *s1, const uint32 *s2) { - guint32 uc; + uint32 uc; g_assert(NULL != s1); g_assert(NULL != s2); @@ -3476,8 +3648,8 @@ * string of maximum UTF32_NFD_REPLACE_MAXLEN characters. The result * is constant. */ -static const guint32 * -utf32_decompose_lookup(guint32 uc, gboolean nfkd) +static const uint32 * +utf32_decompose_lookup(uint32 uc, bool nfkd) { /* utf32_nfkd_lut contains UTF-32 strings, so we return a pointer * to the respective entry instead of copying the string */ @@ -3491,7 +3663,7 @@ } G_STMT_END /* Perform a binary search to find ``uc'' */ - BINARY_SEARCH(guint32, uc, G_N_ELEMENTS(utf32_nfkd_lut), CMP, + BINARY_SEARCH(uint32, uc, N_ITEMS(utf32_nfkd_lut), CMP, GET_ITEM, FOUND); #undef FOUND @@ -3505,20 +3677,17 @@ * @return the uppercase variant of ``uc'' or ``uc'' itself. */ -static guint32 -utf32_uppercase(guint32 uc) +static uint32 +utf32_uppercase(uint32 uc) { - if (uc < 0x80) - return is_ascii_lower(uc) ? (guint32) ascii_toupper(uc) : uc; + if (UNICODE_IS_ASCII(uc)) + return is_ascii_lower(uc) ? (uint32) ascii_toupper(uc) : uc; -#define GET_ITEM(i) (utf32_uppercase_lut(i).lower) -#define FOUND(i) G_STMT_START { \ - return utf32_uppercase_lut(i).upper; \ - /* NOTREACHED */ \ -} G_STMT_END +#define GET_ITEM(i) (utf32_uppercase_lut(i).lower) +#define FOUND(i) return utf32_uppercase_lut(i).upper /* Perform a binary search to find ``uc'' */ - BINARY_SEARCH(guint32, uc, G_N_ELEMENTS(utf32_uppercase_lut), CMP, + BINARY_SEARCH(uint32, uc, N_ITEMS(utf32_uppercase_lut), CMP, GET_ITEM, FOUND); #undef FOUND @@ -3536,20 +3705,17 @@ * * @return the lowercase variant of ``uc'' or ``uc'' itself. */ -G_GNUC_HOT guint32 -utf32_lowercase(guint32 uc) +uint32 G_HOT +utf32_lowercase(uint32 uc) { - if (uc < 0x80) - return is_ascii_upper(uc) ? (guint32) ascii_tolower(uc) : uc; + if (UNICODE_IS_ASCII(uc)) + return is_ascii_upper(uc) ? (uint32) ascii_tolower(uc) : uc; -#define GET_ITEM(i) (utf32_lowercase_lut(i).upper) -#define FOUND(i) G_STMT_START { \ - return utf32_lowercase_lut(i).lower; \ - /* NOTREACHED */ \ -} G_STMT_END +#define GET_ITEM(i) (utf32_lowercase_lut(i).upper) +#define FOUND(i) return utf32_lowercase_lut(i).lower /* Perform a binary search to find ``uc'' */ - BINARY_SEARCH(guint32, uc, G_N_ELEMENTS(utf32_lowercase_lut), CMP, + BINARY_SEARCH(uint32, uc, N_ITEMS(utf32_lowercase_lut), CMP, GET_ITEM, FOUND); #undef FOUND @@ -3567,17 +3733,14 @@ * * @return the lowercase variant of ``uc'' or ``uc'' itself. */ -static const guint32 * -utf32_special_folding(guint32 uc) +static const uint32 * +utf32_special_folding(uint32 uc) { -#define GET_ITEM(i) (utf32_special_folding_lut(i).uc) -#define FOUND(i) G_STMT_START { \ - return utf32_special_folding_lut(i).folded; \ - /* NOTREACHED */ \ -} G_STMT_END +#define GET_ITEM(i) (utf32_special_folding_lut(i).uc) +#define FOUND(i) return utf32_special_folding_lut(i).folded /* Perform a binary search to find ``uc'' */ - BINARY_SEARCH(guint32, uc, G_N_ELEMENTS(utf32_special_folding_lut), CMP, + BINARY_SEARCH(uint32, uc, N_ITEMS(utf32_special_folding_lut), CMP, GET_ITEM, FOUND); #undef FOUND @@ -3595,17 +3758,17 @@ * @return zero if there's no composition for the characters. Otherwise, * the composed character is returned. */ -static guint32 -utf32_compose_char(guint32 a, guint32 b) +static uint32 +utf32_compose_char(uint32 a, uint32 b) { - GSList *sl; - gpointer key; + pslist_t *sl; + void *key; key = GUINT_TO_POINTER(a); - sl = g_hash_table_lookup(utf32_compose_roots, key); - for (/* NOTHING */; sl; sl = g_slist_next(sl)) { - guint i; - guint32 c; + sl = htable_lookup(utf32_compose_roots, key); + for (/* NOTHING */; sl; sl = pslist_next(sl)) { + uint i; + uint32 c; i = GPOINTER_TO_UINT(sl->data); c = utf32_nfkd_luti.d1; @@ -3627,23 +3790,23 @@ * @param s a NUL-terminated UTF-32 string. * @return a pointer to the next ``starter'' character in ``s''. */ -static inline guint32 * -utf32_next_starter(const guint32 *s) +static inline uint32 * +utf32_next_starter(const uint32 *s) { while (0 != utf32_combining_class(*s)) s++; - return deconstify_guint32(s); + return deconstify_uint32(s); } /** * Checks whether an UTF-32 string is in canonical order. */ -gboolean -utf32_canonical_sorted(const guint32 *src) +bool +utf32_canonical_sorted(const uint32 *src) { - guint32 uc; - guint prev, cc; + uint32 uc; + uint prev, cc; for (prev = 0; 0 != (uc = *src++); prev = cc) { cc = utf32_combining_class(uc); @@ -3654,8 +3817,8 @@ return TRUE; } -static inline gboolean -utf32_is_decomposed_char(guint32 uc, gboolean nfkd) +static inline bool +utf32_is_decomposed_char(uint32 uc, bool nfkd) { if (UNICODE_IS_ASCII(uc)) { return TRUE; @@ -3669,11 +3832,11 @@ /** * Checks whether an UTF-32 string is decomposed. */ -gboolean -utf32_is_decomposed(const guint32 *src, gboolean nfkd) +bool +utf32_is_decomposed(const uint32 *src, bool nfkd) { - guint32 uc; - guint prev, cc; + uint32 uc; + uint prev, cc; for (prev = 0; 0 != (uc = *src++); prev = cc) { cc = utf32_combining_class(uc); @@ -3689,11 +3852,11 @@ /** * Puts an UTF-32 string into canonical order. */ -static guint32 * -utf32_sort_canonical(guint32 *src) +static uint32 * +utf32_sort_canonical(uint32 *src) { - guint32 *s = src, *stable = src, uc; - guint prev, cc; + uint32 *s = src, *stable = src, uc; + uint prev, cc; for (prev = 0; 0 != (uc = *s); prev = cc) { cc = utf32_combining_class(uc); @@ -3702,20 +3865,20 @@ } else if (prev <= cc) { s++; } else { - guint32 *p; + uint32 *p; while (0 != utf32_combining_class(*++s)) ; /* Use insertion sort because we need a stable sort algorithm */ for (p = &stable1; p != s; p++) { - guint32 *q; + uint32 *q; uc = *p; cc = utf32_combining_class(uc); for (q = p; q != stable; q--) { - guint32 uc2; + uint32 uc2; uc2 = *(q - 1); if (cc >= utf32_combining_class(uc2)) @@ -3740,10 +3903,10 @@ /** * Checks whether an UTF-8 encoded string is decomposed. */ -gboolean -utf8_is_decomposed(const char *src, gboolean nfkd) +bool +utf8_is_decomposed(const char *src, bool nfkd) { - guint prev, cc; + uint prev, cc; char c; for (prev = 0; '\0' != (c = *src); prev = cc) { @@ -3751,8 +3914,8 @@ src++; cc = 0; } else { - guint32 uc; - guint retlen; + uint32 uc; + uint retlen; uc = utf8_decode_char_fast(src, &retlen); if (uc == 0x0000) @@ -3775,10 +3938,10 @@ /** * Checks whether an UTF-8 encoded string is in canonical order. */ -static gboolean +static bool utf8_canonical_sorted(const char *src) { - guint prev, cc; + uint prev, cc; char c; for (prev = 0; '\0' != (c = *src); prev = cc) { @@ -3786,8 +3949,8 @@ src++; cc = 0; } else { - guint32 uc; - guint retlen; + uint32 uc; + uint retlen; uc = utf8_decode_char_fast(src, &retlen); if (uc == 0x0000) @@ -3810,7 +3973,7 @@ static char * utf8_sort_canonical(char *src) { - guint32 *buf32, *d, a1024; + uint32 *buf32, *d, a1024; size_t size8, size32, n; /* XXX: Sorting combine characters is rather heavy with UTF-8 encoding @@ -3825,7 +3988,7 @@ size32 = 1 + utf8_to_utf32(src, NULL, 0); /* Use an auto buffer for reasonably small strings */ - if (size32 > G_N_ELEMENTS(a)) { + if (size32 > N_ITEMS(a)) { d = g_malloc(size32 * sizeof *buf32); buf32 = d; } else { @@ -3851,8 +4014,8 @@ * @param buf must be at least three elements large * @return the length of the decomposed character. */ -static inline guint -utf32_decompose_hangul_char(guint32 uc, guint32 *buf) +static inline uint +utf32_decompose_hangul_char(uint32 uc, uint32 *buf) { /* * Take advantage of algorithmic Hangul decomposition to reduce @@ -3863,11 +4026,11 @@ #define T_COUNT 28 #define V_COUNT 21 #define N_COUNT (T_COUNT * V_COUNT) - static const guint32 l_base = 0x1100; - static const guint32 v_base = 0x1161; - static const guint32 t_base = 0x11A7; - const guint32 i = uc - UNI_HANGUL_FIRST; - guint32 t_mod = i % T_COUNT; + static const uint32 l_base = 0x1100; + static const uint32 v_base = 0x1161; + static const uint32 t_base = 0x11A7; + const uint32 i = uc - UNI_HANGUL_FIRST; + uint32 t_mod = i % T_COUNT; buf0 = l_base + i / N_COUNT; buf1 = v_base + (i % N_COUNT) / T_COUNT; @@ -3886,18 +4049,18 @@ * Composes all Hangul characters in a string. */ static inline size_t -utf32_compose_hangul(guint32 *src) +utf32_compose_hangul(uint32 *src) { #define L_COUNT 19 #define T_COUNT 28 #define V_COUNT 21 #define N_COUNT (T_COUNT * V_COUNT) #define S_COUNT (L_COUNT * N_COUNT) - static const guint32 l_base = 0x1100; - static const guint32 v_base = 0x1161; - static const guint32 t_base = 0x11A7; - static const guint32 s_base = 0xAC00; - guint32 uc, prev, *p, *s = src; + static const uint32 l_base = 0x1100; + static const uint32 v_base = 0x1161; + static const uint32 t_base = 0x11A7; + static const uint32 s_base = 0xAC00; + uint32 uc, prev, *p, *s = src; if (0 == (prev = *s)) return 0; @@ -3940,7 +4103,6 @@ return p - src; } - /** * Decomposes a single UTF-32 character. This must be used iteratively * to gain the complete decomposition. @@ -3958,12 +4120,12 @@ * to a static buffer which might get overwritten by subsequent * calls to this function. */ -static inline const guint32 * -utf32_decompose_single_char(guint32 uc, size_t *len, gboolean nfkd) +static inline const uint32 * +utf32_decompose_single_char(uint32 uc, size_t *len, bool nfkd) { - static guint32 buf3; - guint32 *p = buf; - const guint32 *q; + static uint32 buf3; + uint32 *p = buf; + const uint32 *q; if (UNICODE_IS_ASCII(uc)) { *p++ = uc; @@ -3976,7 +4138,7 @@ *p++ = uc; } - g_assert(p > buf && p < &bufsizeof buf); + g_assert(p > buf && p <= &bufN_ITEMS(buf)); *len = p - buf; return buf; } @@ -3997,12 +4159,12 @@ * to a static buffer which might get overwritten by subsequent * calls to this function. */ -static inline const guint32 * -utf32_decompose_char(guint32 uc, size_t *len, gboolean nfkd) +static inline const uint32 * +utf32_decompose_char(uint32 uc, size_t *len, bool nfkd) { - static guint32 buf2256; - const guint32 *old; - guint32 *p, *cur; + static uint32 buf2256; + const uint32 *old; + uint32 *p, *cur; size_t size, start; old = utf32_decompose_single_char(uc, &size, nfkd); @@ -4022,14 +4184,14 @@ for (;;) { size_t avail, i; - const guint32 *mod; + const uint32 *mod; mod = NULL; p = &curstart; - avail = G_N_ELEMENTS(buf0) - start; + avail = N_ITEMS(buf0) - start; for (i = start; i < size; i++) { - const guint32 *q; + const uint32 *q; size_t n; q = utf32_decompose_single_char(oldi, &n, nfkd); @@ -4065,9 +4227,9 @@ * @returns the length in characters (not bytes!) of the string ``s''. */ size_t -utf32_strlen(const guint32 *s) +utf32_strlen(const uint32 *s) { - const guint32 *p = s; + const uint32 *p = s; g_assert(s != NULL); @@ -4093,9 +4255,9 @@ * @returns the length in characters (not bytes!) of the string ``s''. */ size_t -utf32_strmaxlen(const guint32 *s, size_t maxlen) +utf32_strmaxlen(const uint32 *s, size_t maxlen) { - const guint32 *p = s; + const uint32 *p = s; size_t i = 0; g_assert(s != NULL); @@ -4126,11 +4288,11 @@ * string. */ static inline size_t -utf8_decompose(const char *src, char *out, size_t size, gboolean nfkd) +utf8_decompose(const char *src, char *out, size_t size, bool nfkd) { - const guint32 *d; - guint32 uc; - guint retlen; + const uint32 *d; + uint32 uc; + uint retlen; size_t d_len, new_len = 0; g_assert(src != NULL); @@ -4155,7 +4317,7 @@ char *p = utf8_buf; utf8_len = utf8_encode_char(*d++, utf8_buf, sizeof utf8_buf); - g_assert((size_t) (&bufsizeof buf - q) >= utf8_len); + g_assert((size_t) (&bufN_ITEMS(buf) - q) >= utf8_len); while (utf8_len-- > 0) *q++ = *p++; } @@ -4239,11 +4401,11 @@ * */ static inline size_t -utf32_decompose(const guint32 *in, guint32 *out, size_t size, gboolean nfkd) +utf32_decompose(const uint32 *in, uint32 *out, size_t size, bool nfkd) { - const guint32 *d, *s = in; - guint32 *p = out; - guint32 uc; + const uint32 *s = in; + uint32 *p = out; + uint32 uc; size_t d_len; g_assert(in != NULL); @@ -4252,7 +4414,7 @@ if (size-- > 0) { for (/* NOTHING */; 0x0000 != (uc = *s); s++) { - d = utf32_decompose_char(uc, &d_len, nfkd); + const uint32 *d = utf32_decompose_char(uc, &d_len, nfkd); if (d_len > size) break; size -= d_len; @@ -4265,7 +4427,7 @@ } while (0x0000 != (uc = *s++)) { - d = utf32_decompose_char(uc, &d_len, nfkd); + (void) utf32_decompose_char(uc, &d_len, nfkd); p += d_len; } @@ -4277,7 +4439,7 @@ * */ size_t -utf32_decompose_nfd(const guint32 *in, guint32 *out, size_t size) +utf32_decompose_nfd(const uint32 *in, uint32 *out, size_t size) { return utf32_decompose(in, out, size, FALSE); } @@ -4287,12 +4449,12 @@ * */ size_t -utf32_decompose_nfkd(const guint32 *in, guint32 *out, size_t size) +utf32_decompose_nfkd(const uint32 *in, uint32 *out, size_t size) { return utf32_decompose(in, out, size, TRUE); } -typedef guint32 (* utf32_remap_func)(guint32 uc); +typedef uint32 (* utf32_remap_func)(uint32 uc); /** * Copies the UTF-8 string ``src'' to ``dst'' remapping all characters @@ -4314,9 +4476,9 @@ static size_t utf8_remap(char *dst, const char *src, size_t size, utf32_remap_func remap) { - guint32 uc; - guint32 nuc; - guint retlen; + uint32 uc; + uint32 nuc; + uint retlen; size_t new_len; g_assert(size == 0 || dst != NULL); @@ -4324,50 +4486,67 @@ g_assert(remap != NULL); g_assert(size <= INT_MAX); + /* + * This function is a hot spot. Don't bother re-encoding + * the character if it's been remapped to itself: we already + * have the encoded form in the source! + * --RAM, 2005-08-28 + */ +#define LOOP_BODY \ + uc = utf8_decode_char_fast(src, &retlen); \ + if (uc == 0x0000) \ + break; \ + \ + nuc = remap(uc); \ + if (nuc == uc) { \ + if (retlen > size) \ + break; \ + \ + size -= retlen; \ + while (retlen-- > 0) \ + *dst++ = *src++; \ + } else { \ + uint utf8_len; \ + \ + utf8_len = utf8_encode_char(nuc, dst, size); \ + if (utf8_len == 0 || utf8_len > size) \ + break; \ + \ + src += retlen; \ + dst += utf8_len; \ + size -= utf8_len; \ + } + if (size <= 0) { new_len = 0; } else { const char *dst0 = dst; size--; /* Reserve one byte for the NUL */ - while (*src != '\0') { - - uc = utf8_decode_char_fast(src, &retlen); - if (uc == 0x0000) - break; - - /* - * This function is a hot spot. Don't bother re-encoding - * the character if it's been remapped to itself: we already - * have the encoded form in the source! - * --RAM, 2005-08-28 - */ - - nuc = remap(uc); - if (nuc == uc) { - if (retlen > size) - break; - size -= retlen; - while (retlen-- > 0) - *dst++ = *src++; - } else { - guint utf8_len; - - utf8_len = utf8_encode_char(nuc, dst, size); - if (utf8_len == 0 || utf8_len > size) - break; + if (size > UTF8_CPU_CACHELINE) { + /* Worth pre-fetching data */ + while (*src != '\0') { + G_PREFETCH_R(&srcUTF8_CPU_CACHELINE); + G_PREFETCH_W(&dstUTF8_CPU_CACHELINE); - src += retlen; - dst += utf8_len; - size -= utf8_len; + LOOP_BODY + } + } else { + /* Not worth pre-fetching data */ + while (*src != '\0') { + LOOP_BODY } } new_len = dst - dst0; *dst = '\0'; } +#undef LOOP_BODY + while (*src != '\0') { + G_PREFETCH_R(&srcUTF8_CPU_CACHELINE); + uc = utf8_decode_char_fast(src, &retlen); if (uc == 0x0000) break; @@ -4398,11 +4577,11 @@ * @return the length in bytes of the converted string ``src''. */ static size_t -utf32_remap(guint32 *dst, const guint32 *src, size_t size, +utf32_remap(uint32 *dst, const uint32 *src, size_t size, utf32_remap_func remap) { - const guint32 *s = src; - guint32 *p = dst; + const uint32 *s = src; + uint32 *p = dst; g_assert(dst != NULL); g_assert(src != NULL); @@ -4410,11 +4589,20 @@ g_assert(size <= INT_MAX); if (size > 0) { - guint32 *end, uc; + uint32 *end, uc; end = &dstsize - 1; - for (p = dst; p != end && 0x0000 != (uc = *s); p++, s++) { - *p = remap(uc); + + if (size > UTF8_CPU_CACHELINE) { + for (p = dst; p != end && 0x0000 != (uc = *s); p++, s++) { + G_PREFETCH_R(&sUTF8_CPU_CACHELINE / sizeof *s); + G_PREFETCH_W(&pUTF8_CPU_CACHELINE / sizeof *p); + *p = remap(uc); + } + } else { + for (p = dst; p != end && 0x0000 != (uc = *s); p++, s++) { + *p = remap(uc); + } } *p = 0x0000; } @@ -4438,7 +4626,7 @@ * @return the length in characters of the converted string ``src''. */ size_t -utf32_strlower(guint32 *dst, const guint32 *src, size_t size) +utf32_strlower(uint32 *dst, const uint32 *src, size_t size) { g_assert(dst != NULL); g_assert(src != NULL); @@ -4459,7 +4647,7 @@ * @return the length in characters of the converted string ``src''. */ size_t -utf32_strupper(guint32 *dst, const guint32 *src, size_t size) +utf32_strupper(uint32 *dst, const uint32 *src, size_t size) { g_assert(size == 0 || dst != NULL); g_assert(src != NULL); @@ -4566,11 +4754,11 @@ } static size_t -utf32_case_fold_char(guint32 uc, guint32 *dst, size_t size) +utf32_case_fold_char(uint32 uc, uint32 *dst, size_t size) { - const guint32 *folded; + const uint32 *folded; size_t length; - + uc = utf32_lowercase(uc); folded = utf32_special_folding(uc); if (folded) { @@ -4586,11 +4774,11 @@ } static size_t -utf32_case_fold(const guint32 * const src0, guint32 * const dst0, +utf32_case_fold(const uint32 * const src0, uint32 * const dst0, const size_t size) { - const guint32 *src = src0; - guint32 *dst = dst0, uc; + const uint32 *src = src0; + uint32 *dst = dst0, uc; size_t left = size; while (0x0000 != (uc = *src++)) { @@ -4603,7 +4791,7 @@ if (size > 0) { *dst = 0x0000; } - return dst - dst0; + return dst - dst0; } /** @@ -4613,13 +4801,13 @@ * a space should not be followed by a space. * * @param uc an UTF-32 character - * @param space pointer to a gboolean holding the current space state + * @param space pointer to a boolean holding the current space state * @param last should be TRUE if ``uc'' is the last character of the string. * @return zero if the character should be skipped, otherwise the * character itself or a replacement character. */ -static inline guint32 -utf32_filter_char(guint32 uc, gboolean *space, gboolean last) +static inline uint32 +utf32_filter_char(uint32 uc, bool *space, bool last) { uni_gc_t gc; @@ -4759,7 +4947,7 @@ case UNI_GC_SYMBOL_MODIFIER: case UNI_GC_SYMBOL_OTHER: { - gboolean prev = *space; + bool prev = *space; *space = TRUE; return prev || last ? 0 : 0x0020; @@ -4781,11 +4969,11 @@ * @return The length of the output string. */ static size_t -utf32_filter(const guint32 *src, guint32 *dst, size_t size) +utf32_filter(const uint32 *src, uint32 *dst, size_t size) { - const guint32 *s; - guint32 uc, *p; - gboolean space = TRUE; /* prevent adding leading space */ + const uint32 *s; + uint32 uc, *p; + bool space = TRUE; /* prevent adding leading space */ g_assert(src != NULL); g_assert(size == 0 || dst != NULL); @@ -4795,7 +4983,7 @@ p = dst; if (size > 0) { - guint32 *end; + uint32 *end; for (end = &dstsize - 1; p != end && 0x0000 != (uc = *s); s++) { if (0 != (uc = utf32_filter_char(uc, &space, 0x0000 == s1))) @@ -4824,11 +5012,11 @@ * @return The length of the output string. */ static size_t -utf32_split_blocks(const guint32 *src, guint32 *dst, size_t size) +utf32_split_blocks(const uint32 *src, uint32 *dst, size_t size) { - const guint32 *s; - guint32 uc, last_uc, *p; - guint last_id; + const uint32 *s; + uint32 uc, last_uc, *p; + uint last_id; g_assert(src != NULL); g_assert(size == 0 || dst != NULL); @@ -4840,11 +5028,11 @@ last_id = utf32_block_id(s0); if (size > 0) { - guint32 *end; + uint32 *end; for (end = &dstsize - 1; p != end && 0x0000 != (uc = *s); s++) { - gboolean change; - guint id = utf32_block_id(uc); + bool change; + uint id = utf32_block_id(uc); change = last_id != id && uc != 0x0020 && last_uc != 0x0020; last_uc = uc; @@ -4863,7 +5051,7 @@ } while (0x0000 != (uc = *s++)) { - guint id = utf32_block_id(uc); + uint id = utf32_block_id(uc); p += (last_id != id && uc != 0x0020 && last_uc != 0x0020) ? 2 : 1; last_uc = uc; @@ -5211,7 +5399,7 @@ * @return TRUE if ICU was successfully initialized. If FALSE is returned * none of the ICU-related functions must be used. */ -gboolean +bool icu_enabled(void) { return use_icu; @@ -5220,7 +5408,7 @@ /* * Is the locale using the latin alphabet? */ -gboolean +bool locale_is_latin(void) { return latin_locale; @@ -5238,9 +5426,9 @@ * modified string. */ static size_t -utf32_compose(guint32 *src) +utf32_compose(uint32 *src) { - guint32 *s, *p, *end, uc; + uint32 *s, *p, *end, uc; g_assert(src != NULL); @@ -5257,11 +5445,11 @@ while (0 != (uc = *s)) { int last_cc; - guint32 *q; + uint32 *q; retry: for (last_cc = -1, q = s; ++q != end; /* NOTHING */) { - guint32 uc2, composite; + uint32 uc2, composite; int cc; if (0 == (uc2 = *q)) /* Skip already used characters */ @@ -5299,13 +5487,13 @@ /** */ -static guint32 * -utf32_normalize(const guint32 *src, uni_norm_t norm) +static uint32 * +utf32_normalize(const uint32 *src, uni_norm_t norm) { - guint32 buf1024, *dst; + uint32 buf1024, *dst; size_t size, n; - gboolean compat = FALSE; - gboolean ok = FALSE; + bool compat = FALSE; + bool ok = FALSE; g_assert(UNSIGNED(norm) < NUM_UNI_NORM); @@ -5328,9 +5516,9 @@ } /* Decompose string to NFD or NFKD */ - n = utf32_decompose(src, buf, G_N_ELEMENTS(buf), compat); + n = utf32_decompose(src, buf, N_ITEMS(buf), compat); size = n + 1; - if (n < G_N_ELEMENTS(buf)) { + if (n < N_ITEMS(buf)) { dst = buf; } else { dst = g_malloc(size * sizeof *dst); @@ -5342,7 +5530,7 @@ case UNI_NORM_NFC: case UNI_NORM_NFKC: { - guint32 *ret; + uint32 *ret; /* Compose string */ n = utf32_compose(dst); @@ -5379,7 +5567,7 @@ char * utf8_normalize(const char *src, uni_norm_t norm) { - guint32 *dst32; + uint32 *dst32; g_assert(src); g_assert(utf8_is_valid_string(src)); @@ -5392,11 +5580,11 @@ return g_strdup(src); } else { size_t n; - guint32 buf1024; - guint32 *s; + uint32 buf1024; + uint32 *s; - n = utf8_to_utf32(src, buf, G_N_ELEMENTS(buf)); - if (n < G_N_ELEMENTS(buf)) { + n = utf8_to_utf32(src, buf, N_ITEMS(buf)); + if (n < N_ITEMS(buf)) { s = buf; } else { size_t size = n + 1; @@ -5415,27 +5603,27 @@ } (void) utf32_to_utf8_inplace(dst32); - return cast_to_gchar_ptr(dst32); + return cast_to_char_ptr(dst32); } /** * Apply the NFKD/NFC algo to have nomalized keywords (string is halloc()-ed) */ -static guint32 * -utf32_canonize(const guint32 *src0) +static uint32 * +utf32_canonize(const uint32 *src0) { - guint32 *dst, *src; + uint32 *dst, *src; size_t size, n; /* Convert to NFC */ size = utf32_strlen(src0) + 1; - src = hcopy(src0, size * sizeof *src); + src = HCOPY_ARRAY(src0, size); (void) utf32_compose(src); /* Apply simple and special folding */ n = utf32_case_fold(src, NULL, 0); size = n + 1; - dst = halloc(size * sizeof *dst); + HALLOC_ARRAY(dst, size); n = utf32_case_fold(src, dst, size); HFREE_NULL(src); src = dst; @@ -5443,7 +5631,7 @@ /* Convert to NFKD */ n = utf32_decompose(src, NULL, 0, TRUE); size = n + 1; - dst = halloc(size * sizeof *dst); + HALLOC_ARRAY(dst, size); n = utf32_decompose(src, dst, size, TRUE); g_assert(size - 1 == n); HFREE_NULL(src); @@ -5457,7 +5645,7 @@ * operations did not destroy the NFKD */ n = utf32_decompose(src, NULL, 0, FALSE); size = n + 1; - dst = halloc(size * sizeof *dst); + HALLOC_ARRAY(dst, size); n = utf32_decompose(src, dst, size, FALSE); g_assert(size - 1 == n); HFREE_NULL(src); @@ -5470,7 +5658,7 @@ /* Insert an ASCII space at block changes, this keeps NFC */ n = utf32_split_blocks(src, NULL, 0); size = n + 1; - dst = halloc(size * sizeof *dst); + HALLOC_ARRAY(dst, size); n = utf32_split_blocks(src, dst, size); g_assert(size - 1 == n); HFREE_NULL(src); @@ -5484,22 +5672,22 @@ char * utf8_canonize(const char *src) { - guint32 *dst32; + uint32 *dst32; g_assert(utf8_is_valid_string(src)); { size_t n; - guint32 buf1024; - guint32 *s; + uint32 buf1024; + uint32 *s; - n = utf8_to_utf32(src, buf, G_N_ELEMENTS(buf)); - if (n < G_N_ELEMENTS(buf)) { + n = utf8_to_utf32(src, buf, N_ITEMS(buf)); + if (n < N_ITEMS(buf)) { s = buf; } else { size_t size = n + 1; - s = halloc(size * sizeof *s); + HALLOC_ARRAY(s, size); n = utf8_to_utf32(src, s, size); g_assert(size - 1 == n); } @@ -5512,19 +5700,19 @@ } (void) utf32_to_utf8_inplace(dst32); - return cast_to_gchar_ptr(dst32); + return cast_to_char_ptr(dst32); } /** * Helper function to sort the lists of ``utf32_compose_roots''. */ static int -compose_root_cmp(gconstpointer a, gconstpointer b) +compose_root_cmp(const void *a, const void *b) { - guint i = GPOINTER_TO_UINT(a), j = GPOINTER_TO_UINT(b); + uint i = GPOINTER_TO_UINT(a), j = GPOINTER_TO_UINT(b); - g_assert(i < G_N_ELEMENTS(utf32_nfkd_lut)); - g_assert(j < G_N_ELEMENTS(utf32_nfkd_lut)); + g_assert(i < N_ITEMS(utf32_nfkd_lut)); + g_assert(j < N_ITEMS(utf32_nfkd_lut)); return CMP(utf32_nfkd_luti.d1, utf32_nfkd_lutj.d1); } @@ -5535,27 +5723,27 @@ * ``utf32_nfkd_lut'' is used as value. */ static void -unicode_compose_add(guint idx) +unicode_compose_add(uint idx) { - GSList *sl, *new_sl; - gpointer key; + pslist_t *sl, *new_sl; + void *key; key = GUINT_TO_POINTER(utf32_nfkd_lutidx.d0); - sl = g_hash_table_lookup(utf32_compose_roots, key); - new_sl = g_slist_insert_sorted(sl, GUINT_TO_POINTER(idx), compose_root_cmp); + sl = htable_lookup(utf32_compose_roots, key); + new_sl = pslist_insert_sorted(sl, uint_to_pointer(idx), compose_root_cmp); if (sl != new_sl) - g_hash_table_insert(utf32_compose_roots, key, new_sl); + htable_insert(utf32_compose_roots, key, new_sl); } -static G_GNUC_COLD void +static void G_COLD unicode_compose_init(void) { size_t i; /* Check order and consistency of the general category lookup table */ - for (i = 0; i < G_N_ELEMENTS(utf32_general_category_lut); i++) { + for (i = 0; i < N_ITEMS(utf32_general_category_lut); i++) { size_t len; - guint32 uc; + uint32 uc; uni_gc_t gc; uc = utf32_general_category_luti.uc; @@ -5566,7 +5754,7 @@ if (i > 0) { size_t prev_len; - guint32 prev_uc; + uint32 prev_uc; uni_gc_t prev_gc; prev_uc = utf32_general_category_luti - 1.uc; @@ -5587,8 +5775,8 @@ } /* Check order and consistency of the composition exclusions table */ - for (i = 0; i < G_N_ELEMENTS(utf32_composition_exclusions); i++) { - guint32 uc; + for (i = 0; i < N_ITEMS(utf32_composition_exclusions); i++) { + uint32 uc; uc = utf32_composition_exclusionsi; g_assert(i == 0 || uc > utf32_composition_exclusionsi - 1); @@ -5596,8 +5784,8 @@ } /* Check order and consistency of the block ID lookup table */ - for (i = 0; i < G_N_ELEMENTS(utf32_block_id_lut); i++) { - guint32 start, end; + for (i = 0; i < N_ITEMS(utf32_block_id_lut); i++) { + uint32 start, end; start = utf32_block_id_luti.start; end = utf32_block_id_luti.end; @@ -5608,10 +5796,10 @@ } /* Create the composition lookup table */ - utf32_compose_roots = g_hash_table_new(NULL, NULL); + utf32_compose_roots = htable_create(HASH_KEY_SELF, 0); - for (i = 0; i < G_N_ELEMENTS(utf32_nfkd_lut); i++) { - guint32 uc; + for (i = 0; i < N_ITEMS(utf32_nfkd_lut); i++) { + uint32 uc; uc = utf32_nfkd_luti.c; @@ -5619,7 +5807,7 @@ (uc & ~UTF32_F_MASK) > (utf32_nfkd_luti - 1.c & ~UTF32_F_MASK)); if (!(uc & UTF32_F_NFKD)) { - const guint32 *s; + const uint32 *s; uc &= ~UTF32_F_MASK; s = utf32_decompose_lookup(uc, FALSE); @@ -5652,16 +5840,12 @@ } static const char * -utf8_latinize_char(const guint32 uc) +utf8_latinize_char(const uint32 uc) { -#define GET_ITEM(i) (jap_tab(i).uc) -#define FOUND(i) G_STMT_START { \ - return jap_tab(i).s; \ - /* NOTREACHED */ \ -} G_STMT_END +#define GET_ITEM(i) (jap_tab(i).uc) +#define FOUND(i) return jap_tab(i).s - BINARY_SEARCH(guint32, uc, G_N_ELEMENTS(jap_tab), CMP, - GET_ITEM, FOUND); + BINARY_SEARCH(uint32, uc, N_ITEMS(jap_tab), CMP, GET_ITEM, FOUND); #undef FOUND #undef GET_ITEM @@ -5670,7 +5854,7 @@ } static const char * -utf8_latinize_chars(const guint32 uc, const guint32 next, gboolean *used_next) +utf8_latinize_chars(const uint32 uc, const uint32 next, bool *used_next) { switch (next) { /* Hiragana combines */ @@ -5737,11 +5921,11 @@ * @return TRUE if utf8_latinize() would convert any characters; * otherwise FALSE. */ -gboolean +bool utf8_can_latinize(const char *src) { - guint retlen; - guint32 uc; + uint retlen; + uint32 uc; g_assert(NULL != src); @@ -5777,11 +5961,11 @@ left = dst_size; while ('\0' != *s) { - guint retlen, next_len; + uint retlen, next_len; const char *r; size_t r_len; - guint32 uc, next; - gboolean used_next; + uint32 uc, next; + bool used_next; uc = utf8_decode_char_fast(s, &retlen); if (!uc) @@ -5815,13 +5999,13 @@ * Checks all cases listed in NormalizationTest.txt. This does not take * very long but the table is pretty huge. */ -static G_GNUC_COLD void +static void G_COLD regression_normalization_test_txt(void) { size_t i; - for (i = 0; i < G_N_ELEMENTS(normalization_test_txt); i++) { - const guint32 *c6; + for (i = 0; i < N_ITEMS(normalization_test_txt); i++) { + const uint32 *c6; size_t j; /* @@ -5829,17 +6013,17 @@ * refers to the columns as c1..c5. */ c0 = NULL; - for (j = 1; j < G_N_ELEMENTS(c); j++) { - const guint32 *src; - guint32 buf256; - guchar chars256; + for (j = 1; j < N_ITEMS(c); j++) { + const uint32 *src; + uint32 buf256; + uchar chars256; size_t len, n; src = normalization_test_txti.cj - 1; len = utf32_to_utf8(src, chars, sizeof chars); g_assert(len > 0); g_assert(len < sizeof chars); - n = utf8_to_utf32(chars, buf, G_N_ELEMENTS(buf)); + n = utf8_to_utf32(chars, buf, N_ITEMS(buf)); g_assert(n == utf32_strlen(src)); g_assert(0 == utf32_strcmp(src, buf)); @@ -5847,7 +6031,7 @@ } { - guint32 *nfc; + uint32 *nfc; /* c2 == NFC(c1) */ nfc = utf32_normalize(c1, UNI_NORM_NFC); @@ -5876,7 +6060,7 @@ } { - guint32 *nfd; + uint32 *nfd; /* c3 == NFD(c1) */ nfd = utf32_normalize(c1, UNI_NORM_NFD); @@ -5905,7 +6089,7 @@ } { - guint32 *nfkc; + uint32 *nfkc; /* c4 == NFKC(c1) */ nfkc = utf32_normalize(c1, UNI_NORM_NFKC); @@ -5934,7 +6118,7 @@ } { - guint32 *nfkd; + uint32 *nfkd; /* c5 == NFKD(c1) */ nfkd = utf32_normalize(c1, UNI_NORM_NFKD); @@ -5971,14 +6155,14 @@ * * X == NFC(X) == NFD(X) == NFKC(X) == NFKD(X) */ -static G_GNUC_COLD void +static void G_COLD regression_normalization_character_identity(void) { size_t i; for (i = 0; i < 0x10FFFF; i++) { - static guint32 s2; - guint32 *nfc, *nfd, *nfkc, *nfkd; + static uint32 s2; + uint32 *nfc, *nfd, *nfkc, *nfkd; if (utf32_bad_codepoint(i) || utf32_is_normalization_special(i)) continue; @@ -6002,21 +6186,21 @@ /** * See: http://www.unicode.org/review/pr-29.html */ -static G_GNUC_COLD void +static void G_COLD regression_normalization_issue(void) { static const struct { - guint32 s8; + uint32 s8; } tests = { { { 0x0b47, 0x0300, 0x0b3e, 0 } }, { { 0x1100, 0x0300, 0x1161, 0 } }, { { 0x1100, 0x0300, 0x1161, 0x0323, 0 } }, }; - guint i; + uint i; - for (i = 0; i < G_N_ELEMENTS(tests); i++) { - guint32 *s, *t; - gboolean eq; + for (i = 0; i < N_ITEMS(tests); i++) { + uint32 *s, *t; + bool eq; s = utf32_normalize(testsi.s, UNI_NORM_NFC); eq = 0 == utf32_strcmp(s, testsi.s); @@ -6031,7 +6215,7 @@ } } -static G_GNUC_COLD void +static void G_COLD regression_utf8_strlower(void) { { @@ -6042,21 +6226,26 @@ len = utf8_strlower(buf, blah, sizeof buf); g_assert(len == CONST_STRLEN(blah)); g_assert(0 == strcmp(blah, buf)); + g_assert(len == utf8_char_count(blah)); + g_assert(len == utf8_strlen(blah)); } - + { - const guchar s = { + const uchar s = { 0xc3, 0xb6, 0xc3, 0xa4, 0xc3, 0xb6, 0xc3, 0xa4, 0xc3, 0xb6, 0xc3, 0xb6, 0xc3, 0xb6, 0xc3, 0xb6, 0xc3, 0xbc, 0x0, }; size_t len, size; char *dst; - - len = utf8_strlower(NULL, cast_to_gconstpointer(s), 0); + const char *src = cast_to_constpointer(s); + + len = utf8_strlower(NULL, src, 0); size = len + 1; dst = g_malloc(size); - len = utf8_strlower(dst, cast_to_gconstpointer(s), size); + len = utf8_strlower(dst, src, size); g_assert(len == size - 1); + g_assert(utf8_strlen(dst) == utf8_strlen(src)); + g_assert(utf8_strlen(dst) == utf8_char_count(dst)); G_FREE_NULL(dst); } } @@ -6073,7 +6262,7 @@ "18\215\xce\201@\202d\203J\203b\203v.mpg"; const char *s; size_t len, chars; - guint32 *u; + uint32 *u; s = lazy_locale_to_utf8_normalized(bad, UNI_NORM_NFC); len = strlen(s); @@ -6095,13 +6284,13 @@ static void regression_iconv_utf8_to_utf8(void) { - const guchar s = { + const uchar s = { 0xa1, 0xbe, 0xb4, 0xba, 0xc7, 0xef, 0xd3, 0xe9, 0xc0, 0xd6, 0xd6, 0xc6, 0xd7, 0xf7, 0xa1, 0xbf, 0xb3, 0xfe, 0xc3, 0xc5, 0xb5, 0xc4, 0xca, 0xc0, 0xbd, 0xe7, 0x0 }; - (void) lazy_locale_to_utf8_normalized(cast_to_gconstpointer(s), + (void) lazy_locale_to_utf8_normalized(cast_to_constpointer(s), UNI_NORM_NFC); } @@ -6109,15 +6298,15 @@ * Verify that each UTF-8 encoded codepoint is decoded to the same * codepoint. */ -static G_GNUC_COLD void +static void G_COLD regression_utf8_bijection(void) { - guint32 uc; + uint32 uc; for (uc = 0; uc <= 0x10FFFF; uc++) { static char utf8_char4; - guint len, len1; - guint32 uc1; + uint len, len1; + uint32 uc1; len = utf8_encode_char(uc, utf8_char, sizeof utf8_char); if (!len) @@ -6125,15 +6314,13 @@ g_assert(len > 0 && len <= 4); uc1 = utf8_decode_char_fast(utf8_char, &len1); - if (uc != uc1 || len != len1) - g_debug("uc=%x uc1=%x, len=%d, len1=%d\n", uc, uc1, len, len1); - g_assert(uc == uc1); - g_assert(len == len1); + g_assert_log(uc == uc1 && len == len1, + "uc=%x uc1=%x, len=%d, len1=%d", uc, uc1, len, len1); #if defined(TEST_UTF8_DECODER) { - guint32 uc2; - guint len2; + uint32 uc2; + uint len2; uc2 = utf8_decode_char_less_fast(utf8_char, &len2); g_assert(uc1 == uc2); @@ -6164,21 +6351,21 @@ * Check utf8_decode_char_fast() for all 4-byte combinations. This * takes about 3 minutes of CPU time on an Athlon Duron 1.4GHz. */ -static G_GNUC_COLD void +static void G_COLD regression_utf8_decoder(void) { - guint32 uc = 0; + uint32 uc = 0; do { - guint len1, len2; - guint32 uc1, uc2; + uint len1, len2; + uint32 uc1, uc2; - uc1 = utf8_decode_char_fast(cast_to_gconstpointer(&uc), &len1); - uc2 = utf8_decode_char_less_fast(cast_to_gconstpointer(&uc), &len2); + uc1 = utf8_decode_char_fast(cast_to_constpointer(&uc), &len1); + uc2 = utf8_decode_char_less_fast(cast_to_constpointer(&uc), &len2); #if 0 - printf("uc=%08X uc1=%x, uc2=%x, len1=%u, len2=%u\n", - uc, uc1, uc2, len1, len2); + g_debug("uc=%08X uc1=%x, uc2=%x, len1=%u, len2=%u", + uc, uc1, uc2, len1, len2); #endif g_assert(!UNICODE_IS_ILLEGAL(uc1)); @@ -6187,12 +6374,12 @@ if (0 != len1) { static char utf8_char4; - guint len; - gboolean eq; + uint len; + bool eq; len = utf8_encode_char(uc1, utf8_char, sizeof utf8_char); g_assert(len1 == len); - eq = 0 == memcmp(cast_to_gconstpointer(&uc), utf8_char, len); + eq = 0 == memcmp(cast_to_constpointer(&uc), utf8_char, len); g_assert(eq); } } while (0 != ++uc); /* while (!0xc0ffee) */ @@ -6204,19 +6391,19 @@ * The following checks are broken as GLib does not implement Unicode 4.1.0 * at the moment. --cbiere, 2005-08-02 */ -static G_GNUC_COLD void +static void G_COLD regression_utf8_vs_glib2(void) { #if defined(USE_GLIB2) size_t i; for (i = 0; i <= 0x10FFFD; i++) { - guint32 uc; + uint32 uc; GUnicodeType gt; uc = i; gt = g_unichar_type(uc); - g_debug("uc=U+%04X", (guint) uc); + g_debug("uc=U+%04X", (uint) uc); switch (utf32_general_category(uc)) { case UNI_GC_LETTER_UPPERCASE: g_assert(G_UNICODE_UPPERCASE_LETTER == gt); @@ -6312,13 +6499,13 @@ } for (;;) { - guint32 test32; - guint32 q1024, *x, *y; + uint32 test32; + uint32 q1024, *x, *y; char s1024, t1024, *s_nfc; size_t size; - for (i = 0; i < G_N_ELEMENTS(test) - 1; i++) { - guint32 uc; + for (i = 0; i < N_ITEMS(test) - 1; i++) { + uint32 uc; do { uc = random_value(0x10FFFF); @@ -6415,7 +6602,7 @@ #endif g_assert(s_nfc != NULL); - utf8_to_utf32(s_nfc, q, G_N_ELEMENTS(q)); + utf8_to_utf32(s_nfc, q, N_ITEMS(q)); if (0 != strcmp(s_nfc, t)) G_BREAKPOINT(); @@ -6428,7 +6615,7 @@ /* Check all single Unicode characters */ for (i = 0; i <= 0x10FFFF; i++) { - guint size; + uint size; char buf256; char utf8_char6; /* GLib wants 6 bytes, also 4 should be enough */ char *s; @@ -6444,7 +6631,7 @@ size = g_unichar_to_utf8(i, utf8_char); g_assert(size < sizeof utf8_char); utf8_charsize = '\0'; - utf8_decompose_nfd(utf8_char, buf, G_N_ELEMENTS(buf)); + utf8_decompose_nfd(utf8_char, buf, N_ITEMS(buf)); #if 1 /* !defined(xxxUSE_ICU) */ s = g_utf8_normalize(utf8_char, -1, G_NORMALIZE_NFD); #else @@ -6470,11 +6657,11 @@ if (0 != strcmp(s, buf)) { const char *p; - guint retlen; + uint retlen; g_debug("\n0x%04X\nbuf=\"%s\"\ns=\"%s\"", i, buf, s); for (p = buf; '\0' != *p; p += retlen) { - guint32 uc; + uint32 uc; uc = utf8_decode_char_fast(p, &retlen); if (!uc) @@ -6482,7 +6669,7 @@ g_debug("buf: U+%04X", uc); } for (p = s; '\0' != *p; p += retlen) { - guint32 uc; + uint32 uc; uc = utf8_decode_char_fast(p, &retlen); if (!uc) @@ -6502,20 +6689,20 @@ G_FREE_NULL(s); } - g_debug("random value: %u", (guint) random_value(~0)); + g_debug("random value: %u", (uint) random_value(~0)); /* Check random Unicode strings */ for (i = 0; i < 10000000; i++) { char buf256 * 7; - guint32 test32, out256; + uint32 test32, out256; char *s, *t; size_t j, utf8_len, utf32_len, m, n; /* Check random strings */ - utf32_len = random_value(G_N_ELEMENTS(test) - 2) + 1; - g_assert(utf32_len < G_N_ELEMENTS(test)); + utf32_len = random_value(N_ITEMS(test) - 2) + 1; + g_assert(utf32_len < N_ITEMS(test)); for (j = 0; j < utf32_len; j++) { - guint32 uc; + uint32 uc; do { uc = random_value(0x10FFFF); @@ -6590,7 +6777,7 @@ #endif - utf8_len = utf32_to_utf8(test, buf, G_N_ELEMENTS(buf)); + utf8_len = utf32_to_utf8(test, buf, N_ITEMS(buf)); g_assert(utf8_len < sizeof buf); g_assert(utf32_len <= utf8_len); @@ -6600,7 +6787,7 @@ g_assert(utf8_is_valid_data(buf, utf8_len)); g_assert(n == utf8_data_char_count(buf, utf8_len)); - n = utf8_to_utf32(buf, out, G_N_ELEMENTS(out)); + n = utf8_to_utf32(buf, out, N_ITEMS(out)); g_assert(n == utf32_len); g_assert(0 == memcmp(test, out, n * sizeof test0)); @@ -6632,8 +6819,8 @@ if (0 != strcmp(s, t)) { const char *x, *y; - guint32 *zx, *zy, uc1, uc2; - guint retlen; + uint32 *zx, *zy, uc1, uc2; + uint retlen; /* Convert to UTF-32 so that the characters can be easily * checked from a debugger */ @@ -6642,7 +6829,7 @@ zy = g_malloc0(1024 * sizeof *zy); utf8_to_utf32(t, zy, 1024); - printf("s=\"%s\"\nt=\"%s\"\n", s, t); + g_debug("s=\"%s\"\nt=\"%s\"", s, t); for (x = s, y = t; *x != '\0'; x++, y++) if (*x != *y) @@ -6650,7 +6837,7 @@ uc1 = utf8_decode_char_fast(x, &retlen); uc2 = utf8_decode_char(x, strlen(x), &retlen, TRUE); - g_debug("x=\"%s\"\ny=\"%s\"\n, *x=%x, *y=%x\n", x, y, uc1, uc2); + g_debug("x=\"%s\"\ny=\"%s\"\n, *x=%x, *y=%x", x, y, uc1, uc2); #if GLIB_CHECK_VERSION(2, 4, 0) /* Glib >= 2.4.0 */ /* @@ -6674,13 +6861,11 @@ #define REGRESSION(func) \ G_STMT_START { \ - printf("REGRESSION: regression_%s", #func); \ - fflush(stdout); \ + g_debug("REGRESSION regression_%s()...", #func); \ CAT2(regression_,func)(); \ - printf(" PASSED\n"); \ } G_STMT_END -G_GNUC_COLD void +void G_COLD utf8_regression_checks(void) { /* unicode_compose_init() must be called before this */ @@ -6708,7 +6893,7 @@ } -#if 1 /* For testing mingw_open() with Unicode support */ +#if 0 /* For testing mingw_open() with Unicode support */ #undef open int my_open(const char *pathname, int flags, ...) @@ -6725,7 +6910,7 @@ } if (utf8_is_valid_string(pathname)) { - guint16 *pathname_utf16; + uint16 *pathname_utf16; char *pathname_utf8; pathname_utf16 = utf8_to_utf16_string(pathname); @@ -6742,5 +6927,4 @@ } #endif /* 0 */ - /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/utf8.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/utf8.h
Changed
@@ -68,48 +68,50 @@ void locale_close(void); const char *locale_get_charset(void); const char *locale_get_language(void); -guint utf8_char_len(const char *s); -gboolean is_ascii_string(const char *str); -gboolean utf8_is_valid_string(const char *s); -gboolean utf8_is_valid_data(const char *s, size_t n); +uint utf8_char_len(const char *s); +bool is_ascii_string(const char *str); +bool utf8_is_valid_string(const char *s); +bool utf8_is_valid_data(const char *s, size_t n); size_t utf8_char_count(const char *s); size_t utf8_data_char_count(const char *src, size_t len); +size_t utf8_strlen(const char *s); size_t utf8_strlcpy(char *dst, const char *src, size_t dst_size); size_t utf8_strcpy_max(char *dst, size_t dst_size, const char *src, size_t max_chars); -guint32 utf8_decode_char_fast(const char *s, guint *retlen) +uint32 utf8_decode_char_fast(const char *s, uint *retlen) NON_NULL_PARAM((1,2)); -int utf8_to_iso8859(char *s, int len, gboolean space); +int utf8_to_iso8859(char *s, int len, bool space); size_t utf8_strlower(char *dst, const char *src, size_t size); char *utf8_strlower_copy(const char *src); size_t utf8_strupper(char *dst, const char *src, size_t size); char *utf8_strupper_copy(const char *src); char *utf8_canonize(const char *src); char *utf8_normalize(const char *src, uni_norm_t norm); -gboolean utf8_is_decomposed(const char *src, gboolean nfkd); -guint NON_NULL_PARAM((2)) utf8_encode_char(guint32 uc, char *buf, size_t size); -guint32 utf8_decode_char_buffer(const char *s, size_t len, guint *retlen) +bool utf8_is_decomposed(const char *src, bool nfkd); +uint NON_NULL_PARAM((2)) utf8_encode_char(uint32 uc, char *buf, size_t size); +uint32 utf8_decode_char_buffer(const char *s, size_t len, uint *retlen) NON_NULL_PARAM((1,3)); -guint32 utf16_le_decode_char_buffer(const char *s, size_t len, guint *retlen) +uint32 utf16_le_decode_char_buffer(const char *s, size_t len, uint *retlen) NON_NULL_PARAM((1,3)); -guint32 utf16_be_decode_char_buffer(const char *s, size_t len, guint *retlen) +uint32 utf16_be_decode_char_buffer(const char *s, size_t len, uint *retlen) NON_NULL_PARAM((1,3)); -size_t utf8_to_utf16(const char *in, guint16 *out, size_t size); -guint16 *utf8_to_utf16_string(const char *in); -char *utf16_to_utf8_string(const guint16 *in); - -size_t utf32_to_utf8(const guint32 *in, char *out, size_t size); -guint32 utf32_lowercase(guint32 uc) G_GNUC_PURE; -gboolean utf32_canonical_sorted(const guint32 *src); -gboolean utf32_is_decomposed(const guint32 *src, gboolean nfkd); -size_t utf32_decompose_nfd(const guint32 *in, guint32 *out, size_t size); -size_t utf32_decompose_nfkd(const guint32 *in, guint32 *out, size_t size); -size_t utf32_strlower(guint32 *dst, const guint32 *src, size_t size); -size_t utf32_strupper(guint32 *dst, const guint32 *src, size_t size); -guint32 utf32_be_decode_char_buffer(const char *s, size_t len, guint *retlen) +size_t utf8_to_utf16(const char *in, uint16 *out, size_t size); +uint16 *utf8_to_utf16_string(const char *in); +size_t utf16_to_utf8(const uint16 *src, char *dst, size_t size); +char *utf16_to_utf8_string(const uint16 *in); + +size_t utf32_to_utf8(const uint32 *in, char *out, size_t size); +uint32 utf32_lowercase(uint32 uc) G_PURE; +bool utf32_canonical_sorted(const uint32 *src); +bool utf32_is_decomposed(const uint32 *src, bool nfkd); +size_t utf32_decompose_nfd(const uint32 *in, uint32 *out, size_t size); +size_t utf32_decompose_nfkd(const uint32 *in, uint32 *out, size_t size); +size_t utf32_strlower(uint32 *dst, const uint32 *src, size_t size); +size_t utf32_strupper(uint32 *dst, const uint32 *src, size_t size); +uint32 utf32_be_decode_char_buffer(const char *s, size_t len, uint *retlen) NON_NULL_PARAM((1,3)); -guint32 utf32_le_decode_char_buffer(const char *s, size_t len, guint *retlen) +uint32 utf32_le_decode_char_buffer(const char *s, size_t len, uint *retlen) NON_NULL_PARAM((1,3)); /** @@ -138,30 +140,30 @@ * See also RFC 2781. * * @param uc the unicode character to encode. - * @returns (guint32) -1 if the unicode character is invalid. Otherwise the + * @returns (uint32) -1 if the unicode character is invalid. Otherwise the * UTF-16 encoded character is returned in a compact form: * The lower 16 bits are the first UTF-16 character, the * upper 16 bits are the second one. If the upper bits are * all zero, the unicode character fit into 16 bits. */ -static inline guint32 -utf16_encode_char_compact(guint32 uc) +static inline uint32 +utf16_encode_char_compact(uint32 uc) { if (uc <= 0xFFFF) { return uc; } else if (uc <= 0x10FFFF) { - guint16 w1, w2; + uint16 w1, w2; uc -= 0x10000; w1 = (uc >> 10) | 0xd800; w2 = (uc & 0x3ff) | 0xdc00; return (w2 << 16) | w1; } - return (guint32) -1; + return (uint32) -1; } -static inline gboolean -utf8_byte_is_allowed(guchar c) +static inline bool +utf8_byte_is_allowed(uchar c) { switch (c) { case 0xC0: @@ -188,20 +190,20 @@ * @param uc an UTF-32 character * @return TRUE if the the character is a non-character, FALSE otherwise. */ -static inline gboolean -utf32_is_non_character(guint32 uc) +static inline bool +utf32_is_non_character(uint32 uc) { return 0xfffeU == (uc & 0xfffeU) || (uc >= 0xfdd0U && uc <= 0xfdefU); } -static inline gboolean -utf32_is_surrogate(guint32 cp) +static inline bool +utf32_is_surrogate(uint32 cp) { return cp >= 0xd800 && cp < 0xe000; } -static inline gboolean -utf32_is_valid(guint32 cp) +static inline bool +utf32_is_valid(uint32 cp) { return cp < 0x10ffffU && !utf32_is_non_character(cp); } @@ -213,16 +215,16 @@ * @return If the given codepoint is a surrogate, a BOM, out of range * or an invalid codepoint FALSE is returned; otherwise TRUE. */ -static inline G_GNUC_CONST gboolean -utf32_bad_codepoint(guint32 uc) +static inline G_CONST bool +utf32_bad_codepoint(uint32 uc) { return uc > 0x10FFFF || 0xFFFE == (uc & 0xFFFE) || /* BOM or illegal xxFFFF */ utf32_is_surrogate(uc); } -static inline G_GNUC_CONST unsigned -utf8_encoded_len(guint32 cp) +static inline G_CONST unsigned +utf8_encoded_len(uint32 cp) { if (cp < 0x80U) { return 1; @@ -237,13 +239,13 @@ } } -static inline G_GNUC_CONST gboolean -utf32_is_ascii(guint32 cp) +static inline G_CONST bool +utf32_is_ascii(uint32 cp) { return cp < 0x80U; } -static inline G_GNUC_CONST unsigned +static inline G_CONST unsigned utf8_first_byte_length_hint(unsigned char ch) { switch (ch & ~0x0fU) { @@ -263,13 +265,13 @@ } } -static inline G_GNUC_CONST gboolean +static inline G_CONST bool utf8_first_byte_valid(unsigned char ch) { return 0 != utf8_first_byte_length_hint(ch); } -static inline G_GNUC_CONST gboolean +static inline G_CONST bool utf8_first_bytes_valid(unsigned char ch1, unsigned char ch2) { if (ch1 < 0x80) { @@ -288,13 +290,13 @@ } /** - * @return (guint32)-1 on failure. On success the decoded Unicode codepoint + * @return (uint32)-1 on failure. On success the decoded Unicode codepoint * is returned. */ -static inline guint32 +static inline uint32 utf8_decode(const char *src, size_t size) { - guint32 cp; + uint32 cp; unsigned n; if (0 == size) @@ -307,7 +309,7 @@ if (0 == n || n > size) goto failure; - + x = *++src; if (!utf8_first_bytes_valid(cp, x)) goto failure; @@ -329,11 +331,11 @@ return cp; failure: - return (guint32) -1; + return (uint32) -1; } static inline unsigned -utf8_encode(guint32 cp, char *buf) +utf8_encode(uint32 cp, char *buf) { unsigned n = utf8_encoded_len(cp); @@ -401,11 +403,11 @@ size_t ascii_enforce(char *dst, size_t size, const char *src); size_t utf8_enforce(char *dst, size_t size, const char *src); -gboolean icu_enabled(void); -gboolean locale_is_latin(void); -gboolean locale_is_utf8(void); +bool icu_enabled(void); +bool locale_is_latin(void); +bool locale_is_utf8(void); -gboolean utf8_can_latinize(const char *src); +bool utf8_can_latinize(const char *src); size_t utf8_latinize(char *dst, size_t dst_size, const char *src); #define UNICODE_CANONIZE(x) utf8_canonize(x)
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/utf8_tables.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/utf8_tables.h
Changed
@@ -70,7 +70,7 @@ #define UNI_GC_LM UNI_GC_LETTER_MODIFIER #define UNI_GC_LO UNI_GC_LETTER_OTHER -#define UNI_GC_MN UNI_GC_MARK_NONSPACING +#define UNI_GC_MN UNI_GC_MARK_NONSPACING #define UNI_GC_MC UNI_GC_MARK_SPACING_COMBINE #define UNI_GC_ME UNI_GC_MARK_ENCLOSING @@ -147,8 +147,8 @@ * ASCII characters and the lowest 64 invalid bytes 0x80..0xBF are excluded. */ static const struct { - const guchar start; - const guchar end; + const uchar start; + const uchar end; } utf8_2nd_byte_tab64 = { { 0x00, 0x00 }, /* 0xC0 Invalid */ { 0x00, 0x00 }, /* 0xC1 Invalid */ @@ -239,8 +239,8 @@ * only the lower 24 bits. */ static const struct utf32_nfkd { - const guint32 c; - const guint32 dUTF32_NFKD_REPLACE_MAXLEN; + const uint32 c; + const uint32 dUTF32_NFKD_REPLACE_MAXLEN; } utf32_nfkd_lut = { { UTF32_NFKD(0x00A0), { 0x0020 } }, { UTF32_NFKD(0x00A8), { 0x0020, 0x0308 } }, @@ -5652,8 +5652,8 @@ * explicitely in utf32_uppercase(). */ static const struct { - guint16 lower; - guint16 upper; + uint16 lower; + uint16 upper; } utf32_uppercase_lut = { { 0x00B5, 0x039C }, { 0x00E0, 0x00C0 }, @@ -6507,8 +6507,8 @@ * explicitely in utf32_lowercase(). */ static const struct { - guint16 upper; - guint16 lower; + uint16 upper; + uint16 lower; } utf32_lowercase_lut = { { 0x00C0, 0x00E0 }, { 0x00C1, 0x00E1 }, @@ -7352,8 +7352,8 @@ * default class is 0, which means the character is a ``starter''. */ static const struct utf32_comb_class { - guint32 uc; - guint8 cc; + uint32 uc; + uint8 cc; } utf32_comb_class_lut = { { 0x0300, 230 }, { 0x0301, 230 }, @@ -7746,7 +7746,7 @@ * UnicodeData.txt but are listed in CompositionExclusions.txt. * Note that the entries in that file are not completely sorted. */ -static const guint32 utf32_composition_exclusions = { +static const uint32 utf32_composition_exclusions = { 0x0958, 0x0959, 0x095A, @@ -7860,9 +7860,9 @@ * table is UNI_GC_CN ("Cn", "Other, Not Assigned"). */ static const struct utf32_general_category { - guint32 uc; /**< The first unicode character in the array */ - guint16 len; /**< The array length */ - guint8 gc; /**< general category */ + uint32 uc; /**< The first unicode character in the array */ + uint16 len; /**< The array length */ + uint8 gc; /**< general category */ } utf32_general_category_lut = { { 0x0000, 32, UNI_GC_CC }, { 0x0020, 1, UNI_GC_ZS }, @@ -9879,8 +9879,8 @@ * */ static const struct { - guint32 start; - guint32 end; + uint32 start; + uint32 end; } utf32_block_id_lut = { { 0x0000, 0x007F }, { 0x0080, 0x00FF }, @@ -10042,12 +10042,12 @@ printf("{ 0x%s }%s", $i, i < 5 ? ", " : " } },\n" ); } } - ' NormalizationTest.txt + ' NormalizationTest.txt */ #if defined(TEST_NORMALIZATION_TEST_TXT) static const struct { - guint32 c520; + uint32 c520; } normalization_test_txt = { #include "NormalizationTest.inc" }; @@ -10066,7 +10066,7 @@ gsub(" ", "\n", $1); print $1 } ' NormalizationTest.txt | \ - gawk '{ + gawk '{ uc = strtonum("0x" $1); printf("0x%06X\n", uc); }' | sort | uniq | \ @@ -10081,7 +10081,7 @@ n++; } last = uc; - + } END { if (n) @@ -10090,8 +10090,8 @@ */ static const struct { - guint32 uc; /**< The first unicode character in the array */ - guint16 len; /**< The array length */ + uint32 uc; /**< The first unicode character in the array */ + uint16 len; /**< The array length */ } utf32_normalization_specials = { { 0x00A0, 1 }, { 0x00A8, 1 }, @@ -10429,7 +10429,7 @@ /(HIRAGANA|KATAKANA)/ { p = "(HALFWIDTH|KATAKANA|HIRAGANA|CIRCLED|LETTER|SMALL|.*MARK.*| )"; gsub(p, "", $2); - + c = $1; if (c == 3057 || c == "30B7") s = "shi"; @@ -10448,10 +10448,10 @@ printf("\t{ 0x%s, \042%s\042 },\n", c, s); }' UnicodeData.txt - * + * */ static const struct { - guint16 uc; + uint16 uc; const char s4; } jap_tab = { { 0x3041, "a" }, @@ -10773,8 +10773,8 @@ */ static const struct utf32_special_folding { - const guint16 uc; - const guint32 folded4; + const uint16 uc; + const uint32 folded4; } utf32_special_folding_lut = { { 0x00DF, { 0x0073, 0x0073 } }, { 0x0130, { 0x0069, 0x0307 } },
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/vector.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/vector.h
Changed
@@ -73,28 +73,28 @@ return vec; } -static inline gboolean +static inline bool vector_iter_has_next(const vector_iter_t *iter) { g_assert(iter); return iter->i < vector_length(iter->vec); } -static inline void * +static inline void * vector_iter_next(vector_iter_t *iter) { g_assert(vector_iter_has_next(iter)); return &iter->vec->baseiter->i++ * iter->vec->element_size; } -static inline gboolean +static inline bool vector_iter_has_previous(const vector_iter_t *iter) { g_assert(iter); return size_is_non_negative(iter->i); } -static inline void * +static inline void * vector_iter_previous(vector_iter_t *iter) { g_assert(vector_iter_has_previous(iter));
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/vendors.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/vendors.c
Changed
@@ -34,14 +34,16 @@ #include "common.h" #include "vendors.h" + #include "ascii.h" +#include "buf.h" #include "endian.h" #include "glib-missing.h" /* For g_strlcpy() */ #include "misc.h" #include "override.h" /* Must be the last header included */ static const struct vendor { - guint32 code; + uint32 code; const char *name; } vendor_map = { /* This array MUST be sorted, because it is searched dichotomically */ @@ -64,6 +66,7 @@ { T_FIRE, "FireFly" }, { T_FISH, "PEERanha" }, { T_FOXY, "Foxy" }, + { T_FSCP, "FileScope" }, { T_FZZN, "Fuzzon" }, { T_GDNA, "Gnucleus DNA" }, { T_GIFT, "giFT" }, @@ -79,6 +82,7 @@ { T_GTKG, "gtk-gnutella" }, { T_HSLG, "Hagelslag" }, { T_HUIT, "Huitella" }, + { T_HYDR, "Hydranode" }, { T_JHOP, "J-Hop" }, { T_JOEY, "Jotella" }, { T_KIKI, "KikiTella" }, @@ -91,8 +95,10 @@ { T_MLDK, "MLDonkey" }, { T_MMMM, "Morpheus-v2" }, { T_MNAP, "MyNapster" }, + { T_MOOD, "MoodAmp" }, { T_MRPH, "Morpheus" }, { T_MUTE, "Mutella" }, + { T_MXIE, "mxie" }, { T_NAPS, "NapShare" }, { T_NGET, "Gnuget" }, { T_NOOG, "Noogtella" }, @@ -101,8 +107,11 @@ { T_OPRA, "Opera" }, { T_OXID, "Oxide" }, { T_PCST, "Peercast" }, + { T_PEER, "PeerProject" }, { T_PHEX, "Phex" }, { T_PWRT, "PowerTella" }, + { T_QAZA, "Quazaa" }, + { T_QAZB, "Quazaa Beta" }, { T_QTEL, "Qtella" }, { T_RASP, "Rasputin" }, { T_RAZA, "Shareaza" }, @@ -111,6 +120,7 @@ { T_RZCA, "ShareazaPlus Alpha" }, { T_RZCB, "ShareazaPlus Beta" }, { T_RZCC, "ShareazaPlus" }, + { T_SHLN, "Sharelin" }, { T_SHNB, "Shinobu" }, { T_SNOW, "FrostWire" }, { T_SNUT, "SwapNut" }, @@ -135,27 +145,25 @@ * * @returns vendor string if found, NULL otherwise. */ -static G_GNUC_HOT const char * -find_vendor(guint32 code) +static const char * G_HOT +find_vendor(uint32 code) { -#define GET_KEY(i) (vendor_map(i).code) -#define FOUND(i) G_STMT_START { \ - return vendor_map(i).name; \ - /* NOTREACHED */ \ -} G_STMT_END +#define GET_KEY(i) (vendor_map(i).code) +#define FOUND(i) return vendor_map(i).name - BINARY_SEARCH(guint32, code, G_N_ELEMENTS(vendor_map), VENDOR_CODE_CMP, + BINARY_SEARCH(uint32, code, N_ITEMS(vendor_map), VENDOR_CODE_CMP, GET_KEY, FOUND); #undef FOUND #undef GET_KEY + return NULL; /* not found */ } /** * @return true is gtk-gnutella knows the given 4-byte vendor code. */ -gboolean +bool is_vendor_known(vendor_code_t code) { if (code.u32 == T_0000) @@ -167,7 +175,7 @@ /** * @return TRUE If the 4-byte vendor code is acceptable. */ -gboolean +bool is_vendor_acceptable(vendor_code_t code) { char temp4; @@ -190,7 +198,7 @@ * @return Length of the resulting string before potential truncation. */ size_t -vendor_code_to_string_buf(guint32 code, char *buf, size_t size) +vendor_code_to_string_buf(uint32 code, char *buf, size_t size) { if (code == 0) { return g_strlcpy(buf, "null", size); @@ -200,7 +208,7 @@ poke_be32(&temp0, code); - for (i = 0; i < G_N_ELEMENTS(temp) - 1; i++) { + for (i = 0; i < N_ITEMS(temp) - 1; i++) { if (!is_ascii_print(tempi)) tempi = '.'; } @@ -218,12 +226,13 @@ * @return pointer to static data. */ const char * -vendor_code_to_string(guint32 code) +vendor_code_to_string(uint32 code) { - static char buf5; + buf_t *b = buf_private(G_STRFUNC, 5); + char *p = buf_data(b); - vendor_code_to_string_buf(code, buf, sizeof buf); - return buf; + vendor_code_to_string_buf(code, p, buf_size(b)); + return p; } /** @@ -232,7 +241,7 @@ * consists only of printable characters, return the code as a string. */ const char * -vendor_code_get_name(guint32 code) +vendor_code_get_name(uint32 code) { const char *name; @@ -241,19 +250,20 @@ } else if (NULL != (name = find_vendor(code))) { return name; } else { - static char bytes5; + buf_t *b = buf_private(G_STRFUNC, 5); + char *p = buf_data(b); unsigned i; - STATIC_ASSERT(sizeof code == G_N_ELEMENTS(bytes) - 1); - poke_be32(&bytes, code); + g_assert(sizeof code == buf_size(b) - 1); + poke_be32(p, code); /* Unknown type, look whether we have all printable ASCII */ - for (i = 0; i < G_N_ELEMENTS(bytes) - 1; i++) { - if (!is_ascii_alnum(bytesi)) + for (i = buf_size(b); i != 0; i--) { + if (!is_ascii_alnum(pi - 1)) return NULL; } - bytesi = '\0'; - return bytes; + buf_setc(b, 4, '\0'); + return p; } } @@ -267,10 +277,11 @@ const char * vendor_to_string(const vendor_code_t vendor) { - static char buf5; + buf_t *b = buf_private(G_STRFUNC, 5); + char *p = buf_data(b); - vendor_code_to_string_buf(vendor.u32, buf, sizeof buf); - return buf; + vendor_code_to_string_buf(vendor.u32, p, buf_size(b)); + return p; } /** @@ -302,7 +313,7 @@ /** * Initialize the vendor lookup. */ -G_GNUC_COLD void +void G_COLD vendor_init(void) { BINARY_ARRAY_SORTED(vendor_map, struct vendor, code,
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/vendors.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/vendors.h
Changed
@@ -58,6 +58,7 @@ #define T_FIRE FOURCC_NATIVE('F','I','R','E') #define T_FISH FOURCC_NATIVE('F','I','S','H') #define T_FOXY FOURCC_NATIVE('F','O','X','Y') +#define T_FSCP FOURCC_NATIVE('F','S','C','P') #define T_FZZN FOURCC_NATIVE('F','Z','Z','N') #define T_GDNA FOURCC_NATIVE('G','D','N','A') #define T_GIFT FOURCC_NATIVE('G','I','F','T') @@ -73,6 +74,7 @@ #define T_GTKG FOURCC_NATIVE('G','T','K','G') #define T_HSLG FOURCC_NATIVE('H','S','L','G') #define T_HUIT FOURCC_NATIVE('H','U','I','T') +#define T_HYDR FOURCC_NATIVE('H','Y','D','R') #define T_JHOP FOURCC_NATIVE('J','H','O','P') #define T_JOEY FOURCC_NATIVE('J','O','E','Y') #define T_KIKI FOURCC_NATIVE('K','I','K','I') @@ -85,8 +87,10 @@ #define T_MLDK FOURCC_NATIVE('M','L','D','K') #define T_MMMM FOURCC_NATIVE('M','M','M','M') #define T_MNAP FOURCC_NATIVE('M','N','A','P') +#define T_MOOD FOURCC_NATIVE('M','O','O','D') #define T_MRPH FOURCC_NATIVE('M','R','P','H') #define T_MUTE FOURCC_NATIVE('M','U','T','E') +#define T_MXIE FOURCC_NATIVE('M','X','I','E') #define T_NAPS FOURCC_NATIVE('N','A','P','S') #define T_NGET FOURCC_NATIVE('N','G','E','T') #define T_NOOG FOURCC_NATIVE('N','O','O','G') @@ -95,8 +99,11 @@ #define T_OPRA FOURCC_NATIVE('O','P','R','A') #define T_OXID FOURCC_NATIVE('O','X','I','D') #define T_PCST FOURCC_NATIVE('P','C','S','T') +#define T_PEER FOURCC_NATIVE('P','E','E','R') #define T_PHEX FOURCC_NATIVE('P','H','E','X') #define T_PWRT FOURCC_NATIVE('P','W','R','T') +#define T_QAZA FOURCC_NATIVE('Q','A','Z','A') +#define T_QAZB FOURCC_NATIVE('Q','A','Z','B') #define T_QTEL FOURCC_NATIVE('Q','T','E','L') #define T_RASP FOURCC_NATIVE('R','A','S','P') #define T_RAZA FOURCC_NATIVE('R','A','Z','A') @@ -136,21 +143,21 @@ #define VENDOR_CODE_BUFLEN 5 typedef struct vendor_code { - guint32 u32; /**< Always host-endian order */ + uint32 u32; /**< Always host-endian order */ } vendor_code_t; /* Old stringification API */ -const char *vendor_code_to_string(guint32); -size_t vendor_code_to_string_buf(guint32, char *, size_t); -const char *vendor_code_get_name(guint32); +const char *vendor_code_to_string(uint32); +size_t vendor_code_to_string_buf(uint32, char *, size_t); +const char *vendor_code_get_name(uint32); /* New stringification API */ const char *vendor_to_string(const vendor_code_t); size_t vendor_to_string_buf(const vendor_code_t, char *, size_t); const char *vendor_get_name(const vendor_code_t); -gboolean is_vendor_known(vendor_code_t); -gboolean is_vendor_acceptable(vendor_code_t); +bool is_vendor_known(vendor_code_t); +bool is_vendor_acceptable(vendor_code_t); void vendor_init(void);
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/vmea.c
Added
@@ -0,0 +1,461 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Virtual Memory Emergency Allocator (VMEA). + * + * The VMEA layer is the last resort allocator for the VMM layer when it + * reaches an out-of-memory condition and has no way to allocate the + * requested amount of memory. + * + * It works by pre-allocating, at startup time, a memory region that can then + * be used to serve memory requests that are necessary during shutdown or + * to be able to decompile stack traces into symbolic forms at crash time. + * + * To limit the need for dynamic structures here, all the required memory + * is pre-allocated. The memory region is handled via a bitmap, each set bit + * in the bitmap representing an allocated page in the reserved memory region. + * + * To be able to determine the places that required emergency allocations, + * a page is allocated to hold up raw stack traces that led to the need for + * memory. These stack traces are then formatted at shutdown time. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#include "common.h" + +#include "vmea.h" + +#include "bit_array.h" +#include "log.h" +#include "spinlock.h" +#include "stacktrace.h" +#include "stringify.h" +#include "unsigned.h" +#include "vmm.h" +#include "xmalloc.h" + +#include "override.h" /* Must be the last header included */ + +#define VMEA_STACKTRACE_DEPTH 16 + +/** + * The stacktrace we capture during emergency allocations. + */ +struct vmea_stacktrace { + void *stackVMEA_STACKTRACE_DEPTH; /* PC of callers */ + size_t count; /* Number of valid entries */ + size_t requested; /* Requested memory size */ + int stid; /* Thread where trace was taken */ + bool success; /* Whether allocation succeeded */ +}; + +/** + * Data structure which keeps track of emergency stack traces. + */ +static struct vmea_stack { + struct vmea_stacktrace *page; /* Base page */ + size_t count; /* Amount of entries */ + size_t capacity; /* Max amount of entries on page */ + bool enabled; /* Set when we can get a stacktrace */ + spinlock_t lock; /* Multi-thread protection */ +} vmea_stacks; + +/** + * Data structure containing emergency memory. + */ +static struct vmea_region { + bit_array_t *bitmap; /* Bitmap flagging allocated pages */ + void *memory; /* Allocated emergency region */ + size_t capacity; /* Total size of the region */ + size_t allocated; /* Total allocated amount */ + size_t pages; /* Amount of pages in region */ + size_t pagesize; /* System page size */ + size_t allocations; /* Amount of allocations made */ + size_t freeings; /* Amount of freeings made */ + spinlock_t lock; /* Multi-thread protection */ +} vmea_region; + +/** + * Reserve the initial amount of emergency memory. + * + * Once reserved, calls to vmea_alloc() and vmea_free() are possible. + * + * This must be done only once: further attempts to reserve memory will lead + * to an assertion failure. The intended use is that the process needing an + * emergency reserve will allocate the memory shortly after having started. + * + * @param size amount of bytes in the emergency region + * @param capture whether to capture allocation stacks + */ +void +vmea_reserve(size_t size, bool capture) +{ + struct vmea_region *vr = &vmea_region; + struct vmea_stack *vs = &vmea_stacks; + + g_assert_log(NULL == vr->memory, + "%s(): already has a reserved region of %'zu bytes", + G_STRFUNC, vr->capacity); + + vr->capacity = round_pagesize(size); + vr->memory = vmm_core_alloc(vr->capacity); + vr->pages = vmm_page_count(vr->capacity); + vr->bitmap = xmalloc0(BIT_ARRAY_BYTE_SIZE(vr->pages)); + vr->pagesize = compat_pagesize(); + + spinlock_init(&vr->lock); + + if (capture) { + vs->page = vmm_core_alloc(vr->pagesize); + vs->capacity = vr->pagesize / sizeof vs->page0; + vs->enabled = TRUE; + + memset(vs->page, 0, vr->pagesize); + spinlock_init(&vs->lock); + } +} + +/** + * Close the emergency layer. + */ +void +vmea_close(void) +{ + struct vmea_region *vr = &vmea_region; + struct vmea_stack *vs = &vmea_stacks; + size_t count = vs->count; + struct vmea_stacktrace *st = vs->page; + + vs->enabled = FALSE; /* Disable further stacktrace collection */ + + /* + * If there were collected stacktraces, dump them. + */ + + while (count-- != 0) { + s_message("%s(): emergency allocation stack for %'zu bytes (%s):", + G_STRFUNC, st->requested, st->success ? "OK" : "FAILED"); + stacktrace_stack_print_decorated(STDERR_FILENO, st->stid, + st->stack, st->count, STACKTRACE_F_ORIGIN | STACKTRACE_F_SOURCE); + st++; + } + + if (vs->page != NULL) + vmm_core_free(vs->page, vr->pagesize); + + XFREE_NULL(vr->bitmap); + + if (0 == vr->allocated && vr->memory != NULL) { + vmm_core_free(vr->memory, vr->capacity); + } else if (vr->memory != NULL) { + s_message("%s(): %'zu-byte emergency region still uses %'zu bytes", + G_STRFUNC, vr->capacity, vr->allocated); + } +} + +/** + * Capture a stacktrace of the allocation attempt if possible. + * + * @param size the amount of requested bytes + * @param success whether allocation was successful + */ +static void +vmea_stacktrace(size_t size, bool success) +{ + struct vmea_stack *vs = &vmea_stacks; + struct vmea_stacktrace *st = NULL; + + if G_UNLIKELY(!vs->enabled) + return; + + spinlock(&vs->lock); + + if (vs->enabled && vs->count < vs->capacity) { + st = &vs->pagevs->count++; + vs->enabled = FALSE; + } + + spinunlock(&vs->lock); + + if (NULL == st) + return; + + st->count = stacktrace_unwind(st->stack, N_ITEMS(st->stack), 2); + st->stid = thread_safe_small_id(); + st->requested = size; + st->success = success; + + spinlock_hidden(&vs->lock); + vs->enabled = TRUE; + spinunlock_hidden(&vs->lock); +} + +/** + * Attempt to allocate emergency memory. + * + * The allocated memory is not zeroed, this must be handled by the caller + * when necessary. + * + * @param size the size of the region we want, in bytes + * + * @return pointer to allocated memory on success, NULL on failure. + */ +void * +vmea_alloc(size_t size) +{ + struct vmea_region *vr = &vmea_region; + size_t rounded, n, first, last; + void *p = NULL; + + if G_UNLIKELY(NULL == vr->bitmap) + return NULL; + + spinlock(&vr->lock); + + /* + * If we know the requested size exceeds the remaining space we have, + * it is certain that we will not be able to allocate. + */ + + rounded = round_pagesize(size); + n = vmm_page_count(rounded); + + if (rounded > vr->capacity - vr->allocated) + goto failed; + + /* + * Use the page bitmap to locate a location where we have ``n'' + * consecutive pages available. + */ + + for (first = 0; first < vr->pages; first = last + 1) { + first = bit_array_first_clear(vr->bitmap, first, vr->pages - 1); + if ((size_t) -1 == first) + goto failed; + + if (first + n > vr->pages) + goto failed; /* No room within region */ + + if (first + n != vr->pages) { + g_assert(first + n < vr->pages); + last = bit_array_first_set(vr->bitmap, first + 1, first + n); + if ((size_t) -1 == last) + last = vr->pages; /* First bit beyond the bitmap */ + } else { + last = vr->pages; /* First bit beyond the bitmap */ + } + + if (n <= last - first) { + bit_array_set_range(vr->bitmap, first, first + n - 1); + p = ptr_add_offset(vr->memory, first * vr->pagesize); + goto allocated; + } + } + + /* FALL THROUGH */ + +failed: + spinunlock(&vr->lock); + vmea_stacktrace(size, FALSE); + /* We don't want a stacktrace, use s_minilog() directly */ + s_minilog(G_LOG_LEVEL_CRITICAL, + "%s(): cannot allocate %'zu bytes (used %'zu bytes out of %'zu reserved" + " with %zu allocation%s and %zu freeing%s)", + G_STRFUNC, size, vr->allocated, vr->capacity, + vr->allocations, plural(vr->allocations), + vr->freeings, plural(vr->freeings)); + return NULL; + +allocated: + vr->allocated += rounded; + vr->allocations++; + spinunlock(&vr->lock); + vmea_stacktrace(size, TRUE); + return p; +} + +/** + * Free memory if it falls within the emergency region. + * + * @param p start of the allocated region + * @param size the size of the allocated region + * + * @return TRUE if memory was emergency memory and it was freed. + */ +bool +vmea_free(void *p, size_t size) +{ + struct vmea_region *vr = &vmea_region; + + g_assert(0 == size || p != NULL); + g_assert_log(vmm_page_start(p) == p, "%s(): p=%p", G_STRFUNC, p); + + if G_UNLIKELY(NULL == vr->bitmap) + return FALSE; + + if G_LIKELY(p != NULL) { + void *end = ptr_add_offset(vr->memory, vr->capacity); + size_t first, n; + + /* + * Check whether region to free falls within the emergency region. + */ + + if (ptr_cmp(p, vr->memory) < 0) { + g_assert_log(ptr_cmp(ptr_add_offset(p, size), vr->memory) <= 0, + "%s(): p=%p, size=%'zu, vr->memory=%p", + G_STRFUNC, p, size, vr->memory); + return FALSE; + } + + if (ptr_cmp(p, end) >= 0) + return FALSE; + + /* + * Ensure the whole region to free falls within the emergency region. + */ + + g_assert_log(ptr_cmp(ptr_add_offset(p, size), end) <= 0, + "%s(): p=%p, size=%'zu, end=%p", + G_STRFUNC, p, size, end); + + /* + * We found memory that falls within the emergency region. Free it! + */ + + n = vmm_page_count(size); + first = vmm_page_count(ptr_diff(p, vr->memory)); + + g_assert(first < vr->pages); + g_assert(bit_array_get(vr->bitmap, first)); + + spinlock(&vr->lock); + + bit_array_clear_range(vr->bitmap, first, first + n - 1); + vr->allocated -= round_pagesize(size); + vr->freeings++; + + spinunlock(&vr->lock); + } + + return TRUE; /* Emergency memory released */ +} + +/** + * @return amount of memory currently reserved + */ +size_t +vmea_capacity(void) +{ + struct vmea_region *vr = &vmea_region; + + if G_UNLIKELY(NULL == vr->bitmap) + return 0; + + return vr->capacity; +} + +/** + * @return amount of memory currently allocated + */ +size_t +vmea_allocated(void) +{ + struct vmea_region *vr = &vmea_region; + + return vr->allocated; +} + +/** + * @return amount of allocations we made from the emergency region. + */ +size_t +vmea_allocations(void) +{ + struct vmea_region *vr = &vmea_region; + + return vr->allocations; +} + +/** + * @return amount of freeings we made from the emergency region. + */ +size_t +vmea_freeings(void) +{ + struct vmea_region *vr = &vmea_region; + + return vr->freeings; +} + + +/** + * Compute the largest amount of memory that we can allocate from the + * emergency reserve. + * + * @return largest allocation request we can fulfill + */ +size_t +vmea_maxsize(void) +{ + struct vmea_region *vr = &vmea_region; + size_t max, first, last; + + if G_UNLIKELY(NULL == vr->bitmap) + return 0; + + spinlock(&vr->lock); + + for (max = first = 0; first < vr->pages; first = last + 1) { + size_t n; + + first = bit_array_first_clear(vr->bitmap, first, vr->pages - 1); + if ((size_t) -1 == first) + break; + + if (first + 1 < vr->pages) { + last = bit_array_first_set(vr->bitmap, first + 1, vr->pages - 1); + if ((size_t) -1 == last) + last = vr->pages; /* First bit beyond the bitmap */ + } else { + last = vr->pages; /* First bit beyond the bitmap */ + } + + n = last - first; + max = MAX(n, max); + } + + max *= vr->pagesize; + + spinunlock(&vr->lock); + + return max; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/vmea.h
Added
@@ -0,0 +1,55 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Virtual Memory Emergency Allocator (VMEA). + * + * @author Raphael Manfredi + * @date 2015 + */ + +#ifndef _vmea_h_ +#define _vmea_h_ + +/* + * Public interface. + */ + +void vmea_reserve(size_t size, bool capture); +void vmea_close(void); + +void *vmea_alloc(size_t size) G_MALLOC; +bool vmea_free(void *p, size_t size); + +size_t vmea_capacity(void); +size_t vmea_allocated(void); +size_t vmea_allocations(void); +size_t vmea_freeings(void); +size_t vmea_maxsize(void); + +#endif /* _vmea_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/vmm.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/vmm.c
Changed
@@ -1,6 +1,6 @@ /* * Copyright (c) 2006, Christian Biere - * Copyright (c) 2006, 2011, Raphael Manfredi + * Copyright (c) 2006, 2011, 2013-2015, Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -99,7 +99,7 @@ * @author Christian Biere * @date 2006 * @author Raphael Manfredi - * @date 2006, 2009, 2011 + * @date 2006, 2009, 2011, 2013-2015 */ #include "common.h" @@ -107,28 +107,39 @@ #define VMM_SOURCE #include "vmm.h" +#include "alloca.h" /* For alloca_stack_direction() */ +#include "array_util.h" #include "ascii.h" +#include "atomic.h" #include "cq.h" -#include "crash.h" /* For crash_hook_add() */ +#include "crash.h" /* For crash_hook_add(), crash_oom() */ #include "dump_options.h" +#include "evq.h" #include "fd.h" -#include "glib-missing.h" #include "log.h" #include "memusage.h" #include "mutex.h" #include "omalloc.h" +#include "once.h" #include "parse.h" #include "pow2.h" +#include "rwlock.h" +#include "sha1.h" +#include "signal.h" /* For signal_in_handler() */ #include "spinlock.h" +#include "stacktrace.h" #include "str.h" /* For str_bprintf() */ #include "stringify.h" +#include "thread.h" /* For thread_small_id() */ #include "tm.h" +#include "tmalloc.h" #include "unsigned.h" +#include "vmea.h" #include "xmalloc.h" +#include "zalloc.h" #ifdef TRACK_VMM #include "hashtable.h" -#include "stacktrace.h" #endif #ifdef MINGW32 @@ -165,15 +176,21 @@ static size_t kernel_pagesize = 0; static size_t kernel_pagemask = 0; static unsigned kernel_pageshift = 0; -static gboolean kernel_mapaddr_increasing; +static bool kernel_mapaddr_increasing; +static once_flag_t vmm_early_inited; +static once_flag_t vmm_inited; +static bool vmm_fully_inited; +static bool vmm_crashing; +static int vmm_oom_detected; #define VMM_CACHE_SIZE 256 /**< Amount of entries per cache line */ #define VMM_CACHE_LINES 32 /**< Amount of cache lines */ -#define VMM_CACHE_LIFE 60 /**< At most 1 minute if not fragmenting */ -#define VMM_CACHE_MAXLIFE 180 /**< At most 3 minutes if fragmenting */ +#define VMM_CACHE_LIFE 60 /**< At most 1 minute on short-term strategy */ +#define VMM_CACHE_MAXLIFE 900 /**< At most 15 minutes on long-term strategy */ #define VMM_STACK_MINSIZE (64 * 1024) /**< Minimum stack size */ #define VMM_FOREIGN_LIFE (60 * 60) /**< 60 minutes */ #define VMM_FOREIGN_MAXLEN (512 * 1024) /**< 512 KiB */ +#define VMM_WARN_THRESH 512 /**< Pages, 2 MiB with 4K pages */ struct page_info { void *base; /**< base address */ @@ -186,6 +203,13 @@ size_t current; /**< amount of items in info */ size_t pages; /**< amount of consecutive pages for entries */ size_t chunksize; /**< size of each entry */ + /* Statistics */ + uint64 targeted; /**< allocations targeting this cache line */ + uint64 allocated; /**< allocations done from this cache line */ + uint64 denied; /**< allocations denied despite line being non-empty */ + uint64 split; /**< splits done from this cache line */ + uint64 evicted; /**< amount of pages evicted */ + uint64 expired; /**< amount of pages expired */ }; /** @@ -195,6 +219,7 @@ * Ad index n, we have areas made of n+1 consecutive pages. */ static struct page_cache page_cacheVMM_CACHE_LINES; +static size_t page_cache_line; /**< Next cache line to expire */ /** * Fragment types @@ -222,47 +247,69 @@ */ struct pmap { struct vm_fragment *array; /**< Sorted array of vm_fragment structs */ - mutex_t lock; /**< Thread-safe locking */ + rwlock_t lock; /**< Thread-safe locking */ size_t count; /**< Amount of entries in array */ size_t size; /**< Total amount of slots in array */ size_t pages; /**< Amount of pages for the array */ - size_t generation; /**< Reloading generation number */ - unsigned loading:1; /**< Pmap being loaded */ - unsigned resized:1; /**< Pmap has been resized */ unsigned extending:1; /**< Pmap being extended */ }; /** * Internal statistics collected. + * + * The AU64() fields are atomically updated (without taking the VMM stats lock). */ -static struct { - guint64 allocations; /**< Total number of allocations */ - guint64 allocations_zeroed; /**< Total number of zeroing in allocs */ - guint64 freeings; /**< Total number of freeings */ - guint64 shrinkings; /**< Total number of shrinks */ - guint64 mmaps; /**< Total number of mmap() calls */ - guint64 munmaps; /**< Total number of munmap() calls */ - guint64 hints_followed; /**< Allocations following hints */ - guint64 hints_ignored; /**< Allocations ignoring non-NULL hints */ - guint64 alloc_from_cache; /**< Allocation from cache */ - guint64 alloc_from_cache_pages; /**< Pages allocated from cache */ - guint64 alloc_direct_core; /**< Allocation done through core */ - guint64 alloc_direct_core_pages;/**< Pages allocated from core */ - guint64 free_to_cache; /**< Freeings directed to cache */ - guint64 free_to_cache_pages; /**< Amount of pages directed to cache */ - guint64 free_to_system; /**< Freeings returned to kernel */ - guint64 free_to_system_pages; /**< Amount of pages returned to kernel */ - guint64 forced_freed; /**< Amount of forceful freeings */ - guint64 forced_freed_pages; /**< Amount of pages forcefully freed */ - guint64 cache_evictions; /**< Evictions due to cache being full */ - guint64 cache_coalescing; /**< Amount of coalescing from cache */ - guint64 cache_line_coalescing; /**< Amount of coalescing in cache line */ - guint64 cache_expired; /**< Amount of entries expired from cache */ - guint64 cache_expired_pages; /**< Expired pages from cache */ - guint64 high_order_coalescing; /**< Large regions successfully coalesced */ - guint64 pmap_foreign_discards; /**< Foreign regions discarded */ - guint64 pmap_foreign_discarded_pages; /**< Foreign pages discarded */ - guint64 pmap_overruled; /**< Regions overruled by kernel */ +static struct vmm_stats { + uint64 allocations; /**< Total number of allocations */ + uint64 allocations_zeroed; /**< Total number of zeroing in allocs */ + uint64 allocations_core; /**< Core memory allocations */ + uint64 allocations_user; /**< User memory allocations */ + AU64(allocations_in_handler); /**< Allocations done from signal handler */ + uint64 freeings; /**< Total number of freeings */ + uint64 freeings_core; /**< Core memory freeings */ + uint64 freeings_user; /**< User memory freeings */ + AU64(freeings_in_handler); /**< Freeings done from signal handler */ + uint64 shrinkings; /**< Total number of shrinks */ + uint64 shrinkings_core; /**< Core memory shrinkings */ + uint64 shrinkings_user; /**< User memory shrinkings */ + AU64(resizings); /**< Total amount of vmm_resize() calls */ + AU64(mmaps); /**< Total number of mmap() calls */ + AU64(munmaps); /**< Total number of munmap() calls */ + uint64 magazine_allocations; /**< Allocations through thread magazine */ + uint64 magazine_freeings; /**< Freeings through thread magazine */ + uint64 magazine_freeings_frag; /**< Magazine regions that were fragments */ + uint64 hints_followed; /**< Allocations following hints */ + uint64 hints_ignored; /**< Allocations ignoring non-NULL hints */ + uint64 alloc_from_cache; /**< Allocation from cache */ + uint64 alloc_from_cache_pages; /**< Pages allocated from cache */ + uint64 alloc_direct_core; /**< Allocation done through core */ + uint64 alloc_direct_core_pages;/**< Pages allocated from core */ + uint64 free_to_cache; /**< Freeings directed to cache */ + uint64 free_to_cache_pages; /**< Amount of pages directed to cache */ + uint64 free_to_system; /**< Freeings returned to kernel */ + uint64 free_to_system_pages; /**< Amount of pages returned to kernel */ + uint64 free_to_system_extra_pages; /**< Cached paged coalesced in free */ + uint64 forced_freed; /**< Amount of forceful freeings */ + uint64 forced_freed_pages; /**< Amount of pages forcefully freed */ + AU64(cache_evictions); /**< Evictions due to cache being full */ + AU64(cache_coalescing); /**< Amount of coalescing from cache */ + AU64(cache_line_coalescing); /**< Amount of coalescing in cache line */ + uint64 cache_expired; /**< Amount of entries expired from cache */ + uint64 cache_expired_pages; /**< Expired pages from cache */ + uint64 cache_kept; /**< Cached entries that we do not expire */ + AU64(cache_ignored); /**< Ignored cache lines during lookups */ + AU64(cache_exact_match); /**< Found entry in the right cache line */ + AU64(cache_splits); /**< Split cached entries in allocations */ + AU64(cache_high_coalescing); /**< Large regions successfully coalesced */ + AU64(cache_too_large); /**< Allocation too large for cache */ + uint64 pmap_foreign_discards; /**< Foreign regions discarded */ + uint64 pmap_foreign_discarded_pages; /**< Foreign pages discarded */ + AU64(pmap_overruled); /**< Regions overruled by kernel */ + AU64(pmap_dropped); /**< Dropped regions while extending pmap */ + uint64 hole_reused; /**< Amount of times we use cached hole */ + uint64 hole_invalidated; /**< Times we invalidate cached hole */ + uint64 hole_updated; /**< Times we updated the cached hole */ + uint64 hole_unchanged; /**< Times we left the cached hole as-is */ size_t user_memory; /**< Amount of "user" memory allocated */ size_t user_pages; /**< Amount of "user" memory pages used */ size_t user_blocks; /**< Amount of "user" memory blocks */ @@ -271,20 +318,99 @@ /* Tracking core blocks doesn't make sense: "core" can be fragmented */ memusage_t *user_mem; /**< User memory usage statistics */ memusage_t *core_mem; /**< Core usage statistics */ + /* Counter to prevent digest from being the same twice in a row */ + AU64(vmm_stats_digest); } vmm_stats; +static spinlock_t vmm_stats_slk = SPINLOCK_INIT; + +#define VMM_STATS_LOCK spinlock_hidden(&vmm_stats_slk) +#define VMM_STATS_UNLOCK spinunlock_hidden(&vmm_stats_slk) + +#define VMM_STATS_INCX(x) AU64_INC(&vmm_stats.x) /** - * The kernel version of the pmap and our own version. + * The local version of the process memory map. */ -static struct pmap kernel_pmap; static struct pmap local_pmap; -static gboolean safe_to_log; /**< True when we can log */ -static gboolean stop_freeing; /**< No longer release memory */ -static guint32 vmm_debug; /**< Debug level */ -static const void *initial_sp; /**< Initial "bottom" of the stack */ -static gboolean sp_increasing; /**< Growing direction of the stack */ +/** + * The maintained value of the "first hole" in the VM space. + * + * This is the lowest hole in the VM space, which lies at the bottom of + * the memory space if the VM grows upwards or near the end when the VM grows + * downwards. + * + * Caching this value and maintaining it through allocations and frees lets + * us improve performance during concurrent allocations because vmm_first_hole() + * does not need to take the pmap's read-lock if the hole is valid. + */ +static struct vmm_hole { + const void *start; /**< Start address */ + const void *end; /**< First byte beyond end of region */ +} vmm_hole; +static spinlock_t vmm_hole_slk = SPINLOCK_INIT; + +#define VMM_HOLE_LOCK spinlock_hidden(&vmm_hole_slk) +#define VMM_HOLE_UNLOCK spinunlock_hidden(&vmm_hole_slk) + +/** + * The "upper hole" in the VM space is an estimated upper bound of the + * address where the next allocation could take place for regions smaller + * than the estimated free space. + * + * The "upper hole" is a conservative estimate of the first free region + * further away from the last allocation point. + */ +static struct vm_upper_hole { + const void *p; /**< Start address of region */ + size_t len; /**< Length of the identified hole there */ +} vmm_upper_hole; +static spinlock_t vmm_upper_hole_slk = SPINLOCK_INIT; + +#define VMM_UPPER_HOLE_LOCK spinlock_hidden(&vmm_upper_hole_slk) +#define VMM_UPPER_HOLE_UNLOCK spinunlock_hidden(&vmm_upper_hole_slk) + +/** + * The memory allocation strategy. + */ +static enum vmm_strategy vmm_strategy = VMM_STRATEGY_SHORT_TERM; +static spinlock_t vmm_strategy_slk = SPINLOCK_INIT; +static cperiodic_t *vmm_periodic; + +#define VMM_STRATEGY_LOCK spinlock_hidden(&vmm_strategy_slk) +#define VMM_STRATEGY_UNLOCK spinunlock_hidden(&vmm_strategy_slk) + +/* + * The VMM allocation layer is used by other memory allocators to get more + * core, but can also be used by the application to allocate known-to-be-large + * areas or memory (e.g. hash table arenas, or RX buffers). + * + * Unfortunately, as a user-level memory allocator, the VMM layer is very + * slow, and more so on freeing because it attempts to coalesce pages. + * + * It is fair to say it is about 10 times slower than walloc() for 4K blocks, + * when single-threaded. If we add concurrency, the VMM layer does not scale + * well, and throughput with 8 threads allocating 4K blocks concurrently is + * about 100 times worse than the throughput obtained with 1 thread, which is + * not already spectacular... + * + * To increase throughput of VMM as a user-level allocator, we add support + * for distribution through thread magazines, for blocks up to 5 system pages. + * These are small enough to not waste too much memory in the unused magazines. + * This is ONLY for user memory, not core allocations. + * + * Thread magazines will not be created until the event queue is up. + */ + +#define VMM_MAGAZINE_PAGEMAX 5 /**< Up to 5 pages */ +static tmalloc_t *vmm_magazineVMM_MAGAZINE_PAGEMAX; + +static bool safe_to_log; /**< True when we can log */ +static bool stop_freeing; /**< No longer release memory */ +static uint32 vmm_debug; /**< Debug level */ +static int sp_direction; /**< Growing direction of the stack */ static const void *vmm_base; /**< Where we'll start allocating */ +static const void *stack_base; /**< Where stack starts (its "bottom") */ #ifdef HAS_SBRK static const void *initial_brk; /**< Startup position of the heap */ #endif @@ -298,30 +424,87 @@ #define vmm_debugging(lvl) G_UNLIKELY(vmm_debug > (lvl) && safe_to_log) -gboolean vmm_is_debugging(guint32 level) -{ +bool +vmm_is_debugging(uint32 level) +{ return vmm_debugging(level); } +bool +vmm_is_inited(void) +{ + return vmm_fully_inited; +} + static inline struct pmap * vmm_pmap(void) { - return kernel_pmap.count ? &kernel_pmap : &local_pmap; + return &local_pmap; } -static gboolean page_cache_insert_pages(void *base, size_t n); +static bool page_cache_insert_pages(void *base, size_t n); static void pmap_remove(struct pmap *pm, const void *p, size_t size); -static void pmap_load(struct pmap *pm); -static void pmap_insert_region(struct pmap *pm, +static size_t pmap_insert_region(struct pmap *pm, const void *start, size_t size, vmf_type_t type); static void pmap_overrule(struct pmap *pm, const void *p, size_t size, vmf_type_t type); +static struct vm_fragment *pmap_lookup(const struct pmap *pm, + const void *p, size_t *low_ptr); static void vmm_reserve_stack(size_t amount); +static void *page_cache_find_pages(size_t n, bool user_mem, bool emergency); +static void page_cache_free_all(bool locked); + +/** + * @return whether VMM is in crash mode. + */ +bool +vmm_is_crashing(void) +{ + return vmm_crashing; +} + +/** + * @return whether VMM is extending its pmap. + */ +bool +vmm_is_extending(void) +{ + return vmm_pmap()->extending; +} + +/** + * Put the VMM layer in crashing mode. + * + * This is activated on assertion failures and other fatal conditions, and + * is an irreversible operation. Its purpose is to prevent any usage of + * internal data structures that could be corrupted, yet allow basic memory + * allocation during crashing. + * + * In crashing mode, allocations are done without any pmap updating and + * no shrinking nor freeing occurs. + */ +void G_COLD +vmm_crash_mode(void) +{ + vmm_crashing = TRUE; + ZERO(&vmm_magazine); + atomic_mb(); +} + +/** + * Signal out-of-memory condition. + */ +static void G_COLD +vmm_oom_condition(void) +{ + if (0 == atomic_int_inc(&vmm_oom_detected)) + crash_oom_condition(); +} /** * Initialize constants for the computation of kernel page roundings. */ -static void +static void G_COLD init_kernel_pagesize(void) { kernel_pagesize = compat_pagesize(); @@ -333,7 +516,7 @@ /** * Fast version of pagesize rounding (without the slow % operator). */ -static inline ALWAYS_INLINE size_t G_GNUC_PURE +static inline ALWAYS_INLINE size_t G_PURE round_pagesize_fast(size_t n) { return (n + kernel_pagemask) & ~kernel_pagemask; @@ -342,13 +525,22 @@ /** * Fast version of page counting: how many pages does it take to store `n'? */ -static inline ALWAYS_INLINE size_t G_GNUC_PURE +static inline ALWAYS_INLINE size_t G_PURE pagecount_fast(size_t n) { return round_pagesize_fast(n) >> kernel_pageshift; } /** + * Fast version for converting amount of pages into a size. + */ +static inline ALWAYS_INLINE size_t G_PURE +nsize_fast(size_t n) +{ + return n << kernel_pageshift; +} + +/** * Rounds `n' up to so that it is aligned to the pagesize. */ size_t @@ -360,7 +552,7 @@ /** * Rounds pointer down so that it is aligned to the start of the page. */ -static inline G_GNUC_PURE ALWAYS_INLINE const void * +static inline G_PURE ALWAYS_INLINE const void * page_start(const void *p) { unsigned long addr = pointer_to_ulong(p); @@ -371,6 +563,8 @@ /** * Rounds pointer down so that it is aligned to the start of its page. + * + * @return the base address of the page where ``p'' lies. */ const void * vmm_page_start(const void *p) @@ -379,6 +573,15 @@ } /** + * @return the base address of the page following the one where ``p'' lies. + */ +const void * +vmm_page_next(const void *p) +{ + return page_start(const_ptr_add_offset(p, kernel_pagesize)); +} + +/** * Count amount of pages required to hold given size. */ size_t @@ -387,6 +590,38 @@ return pagecount_fast(size); } +/** + * Loudly warn with a possible stack trace. + */ +static void G_PRINTF(1, 2) +vmm_warn_once(const char *format, ...) +{ + va_list args; + + va_start(args, format); + s_minilogv(G_LOG_LEVEL_WARNING, TRUE, format, args); + va_end(args); + + if (!stacktrace_caller_known(2)) /* Caller of our caller */ + s_stacktrace(TRUE, 2); +} + +/** + * Initialize the stack shape: direction, bottom (base) address. + */ +static void G_COLD +init_stack_shape(void) +{ + int sp; + + sp_direction = alloca_stack_direction(); + stack_base = page_start(&sp); + if (sp_direction < 0) + stack_base = const_ptr_add_offset(stack_base, kernel_pagesize); +} + +#define VMM_PAGESIZE_DFLT 4096 /* If we don't know better */ + static long compat_pagesize_intern(void) #if defined (_SC_PAGESIZE) || defined(_SC_PAGE_SIZE) @@ -399,8 +634,9 @@ #else ret = sysconf(_SC_PAGE_SIZE); #endif - if (-1L == ret) { - return_value_unless(0 == errno, 0); + if (ret < 0) { + return_value_unless(0 == errno, VMM_PAGESIZE_DFLT); + return VMM_PAGESIZE_DFLT; } return ret; } @@ -413,13 +649,13 @@ size_t compat_pagesize(void) { - static int initialized; + static bool initialized; static size_t psize; - if (!initialized) { + if G_UNLIKELY(!initialized) { long n; - - initialized = 1; + + initialized = TRUE; n = compat_pagesize_intern(); g_assert(n > 0); g_assert(n < INT_MAX); @@ -434,7 +670,7 @@ /** * @return whether fragment is identified as foreign. */ -static inline ALWAYS_INLINE gboolean +static inline ALWAYS_INLINE bool vmf_is_foreign(const struct vm_fragment *vmf) { return VMF_FOREIGN == vmf->type; @@ -443,7 +679,7 @@ /** * @return whether fragment is identified as being memory-mapped. */ -static inline ALWAYS_INLINE gboolean +static inline ALWAYS_INLINE bool vmf_is_mapped(const struct vm_fragment *vmf) { return VMF_MAPPED == vmf->type; @@ -452,7 +688,7 @@ /** * @return whether fragment is identified as being native. */ -static inline ALWAYS_INLINE gboolean +static inline ALWAYS_INLINE bool vmf_is_native(const struct vm_fragment *vmf) { return VMF_NATIVE == vmf->type; @@ -471,7 +707,7 @@ * @return whether memory fragment is an "old" foreign region thatwe may * discard. */ -static inline ALWAYS_INLINE gboolean +static inline ALWAYS_INLINE bool vmf_is_old_foreign(const struct vm_fragment *vmf) { /* @@ -507,59 +743,92 @@ static const char * vmf_to_string(const struct vm_fragment *vmf) { - static char buf80; + static char bufTHREAD_MAX80; + char *b = &bufthread_small_id()0; size_t n = pagecount_fast(vmf_size(vmf)); - str_bprintf(buf, sizeof buf, "%s %p, %p (%zu page%s)", - vmf_type_str(vmf->type), vmf->start, vmf->end, - n, 1 == n ? "" : "s"); + str_bprintf(b, sizeof buf0, "%s %p, %p (%'zu page%s)", + vmf_type_str(vmf->type), vmf->start, vmf->end, n, plural(n)); - return buf; + return b; } /** * Dump current pmap to specified logagent. */ -G_GNUC_COLD void +void G_COLD vmm_dump_pmap_log(logagent_t *la) { struct pmap *pm = vmm_pmap(); - size_t i; + size_t i, count, size, length; time_t now = tm_time(); + struct vm_fragment *array; + + /* + * We use a write-lock and not a read-lock here, which can seem surprising + * at first since we're in essence reading the pmap. However, we are + * allocating memory and re-enter the VMM layer, attempting to then grab + * the write-lock. It is not allowed to request a write-lock when the + * read-lock is already owned (one needs to upgrade it or release the read + * lock and request the write lock). + * + * Therefore we need to take the write-lock to be fully protected, since + * we can then take it again or request read-locks whilst we own the + * write-lock. + */ - mutex_get(&pm->lock); + rwlock_wlock(&pm->lock); - log_debug(la, "VMM current %s pmap (%zu region%s):", - pm == &kernel_pmap ? "kernel" : - pm == &local_pmap ? "local" : "unknown", - pm->count, 1 == pm->count ? "" : "s"); + count = pm->count; + size = pm->size; + length = count * sizeof array0; + array = vmm_alloc(length); /* Why we need a write-lock on pmap */ + memcpy(array, pm->array, length); - for (i = 0; i < pm->count; i++) { - struct vm_fragment *vmf = &pm->arrayi; + rwlock_wunlock(&pm->lock); + + /* + * Remaining code running without any lock, using the data we just copied. + */ + + log_debug(la, "VMM local pmap (%'zu/%'zu region%s):", + count, size, plural(count)); + + for (i = 0; i < count; i++) { + struct vm_fragment *vmf = &arrayi; size_t hole = 0; - if (i < pm->count - 1) { - const void *next = pm->arrayi+1.start; + if (i < count - 1) { + const void *next = arrayi+1.start; hole = ptr_diff(next, vmf->end); } - log_debug(la, "VMM %p, %p %zuKiB %s%s%s%s (%s)%s", + /* + * Because log_debug() can allocate memory, which could then recurse + * and update the pmap, we MUST NOT access ``vmf'' afterwards. + * + * Since all the arguments will be evaluated and pushed on the stack + * before we can recurse, there is no need to copy the content of + * ``vmf'' before making the call though. + */ + + log_debug(la, "VMM %p, %p %'zuKiB %s%s%s%s (%s)%s", vmf->start, const_ptr_add_offset(vmf->end, -1), vmf_size(vmf) / 1024, vmf_type_str(vmf->type), hole ? " + " : "", - hole ? size_t_to_string(hole / 1024) : "", + hole ? size_t_to_gstring(hole / 1024) : "", hole ? "KiB hole" : "", compact_time(delta_time(now, vmf->mtime)), size_is_non_negative(hole) ? "" : " *UNSORTED*"); } - mutex_release(&pm->lock); + vmm_free(array, length); } /** * Dump current pmap. */ -G_GNUC_COLD void +void G_COLD vmm_dump_pmap(void) { vmm_dump_pmap_log(log_agent_stderr_get()); @@ -568,6 +837,8 @@ #if defined(HAS_MMAP) || defined(MINGW32) /** * Find a hole in the virtual memory map where we could allocate "size" bytes. + * + * This routine must be called with the pmap write-locked. */ static const void * vmm_find_hole(size_t size) @@ -575,12 +846,13 @@ struct pmap *pm = vmm_pmap(); size_t i; - mutex_get(&pm->lock); + assert_rwlock_is_owned(&pm->lock); - if G_UNLIKELY(0 == pm->count || pm->loading) { - mutex_release(&pm->lock); + if G_UNLIKELY(!vmm_fully_inited) + return NULL; + + if G_UNLIKELY(0 == pm->count) return NULL; - } if (kernel_mapaddr_increasing) { for (i = 0; i < pm->count; i++) { @@ -591,15 +863,12 @@ continue; if G_UNLIKELY(i == pm->count - 1) { - mutex_release(&pm->lock); return end; } else { struct vm_fragment *next = &pm->arrayi + 1; - if (ptr_diff(next->start, end) >= size) { - mutex_release(&pm->lock); + if (ptr_diff(next->start, end) >= size) return end; - } } } } else { @@ -611,59 +880,60 @@ continue; if G_UNLIKELY(1 == i) { - mutex_release(&pm->lock); return page_start(const_ptr_add_offset(start, -size)); } else { struct vm_fragment *prev = &pm->arrayi - 2; - if (ptr_diff(start, prev->end) >= size) { - mutex_release(&pm->lock); + if (ptr_diff(start, prev->end) >= size) return page_start(const_ptr_add_offset(start, -size)); - } } } } if (vmm_debugging(0)) { - s_warning("VMM no %zuKiB hole found in pmap", size / 1024); + s_miniwarn("VMM no %'zuKiB hole found in pmap", size / 1024); } - mutex_release(&pm->lock); return NULL; } /** + * Discard region at specified index within the pmap. + */ +static inline void +pmap_drop(struct pmap *pm, size_t idx) +{ + ARRAY_REMOVE_DEC(pm->array, idx, pm->count); +} + +/** * Discard foreign region at specified index within the pmap. */ static void pmap_discard_index(struct pmap *pm, size_t idx) { + struct vm_fragment *vmf; + g_assert(pm != NULL); g_assert(size_is_non_negative(idx) && idx < pm->count); + assert_rwlock_is_owned(&pm->lock); - mutex_get(&pm->lock); - - if (vmm_debugging(0)) { - struct vm_fragment *vmf = &pm->arrayidx; + vmf = &pm->arrayidx; - g_assert_log(vmf_is_foreign(vmf), "vmf={%s}", vmf_to_string(vmf)); + g_assert_log(vmf_is_foreign(vmf), "vmf={%s}", vmf_to_string(vmf)); - s_debug("VMM discarding %s region at %p (%zuKiB) updated %us ago", + if (vmm_debugging(0)) { + s_minidbg("VMM discarding %s region at %p (%'zuKiB) updated %us ago", vmf_type_str(vmf->type), vmf->start, vmf_size(vmf) / 1024, (unsigned) delta_time(tm_time(), vmf->mtime)); - - vmm_stats.pmap_foreign_discards++; - vmm_stats.pmap_foreign_discarded_pages += pagecount_fast(vmf_size(vmf)); - } - - if G_LIKELY(idx != pm->count - 1) { - memmove(&pm->arrayidx, &pm->arrayidx + 1, - (pm->count - idx - 1) * sizeof pm->array0); } - pm->count--; + VMM_STATS_LOCK; + vmm_stats.pmap_foreign_discards++; + vmm_stats.pmap_foreign_discarded_pages += pagecount_fast(vmf_size(vmf)); + VMM_STATS_UNLOCK; - mutex_release(&pm->lock); + pmap_drop(pm, idx); } /** @@ -681,32 +951,68 @@ * memory pointer that would get allocated to cover the hole), one has to * substract the size of the region from the returned pointer. */ -static G_GNUC_HOT size_t -vmm_first_hole(const void **hole_ptr, gboolean discard) +static size_t G_HOT +vmm_first_hole(const void **hole_ptr, bool discard) { struct pmap *pm = vmm_pmap(); - size_t i; + size_t i, result = 0; + bool wlock = FALSE; + + /* + * Check with the cached version of the hole first. + * + * Each time we can return the cached hole, we improve concurrency because + * we do not need to request the pmap's read-lock at all. + * + * When we are allocating from the page cache, we can achieve efficient + * allocations because we do not need to lock the pmap at all. + */ + + VMM_HOLE_LOCK; - mutex_get(&pm->lock); + if (NULL != vmm_hole.start) { + result = ptr_diff(vmm_hole.end, vmm_hole.start); + *hole_ptr = kernel_mapaddr_increasing ? vmm_hole.start : vmm_hole.end; + + /* + * Normally we should have the VMM stats lock to update the stats, + * but here we always update this counter when we have the hole lock, + * and this is sufficient to prevent concurrent updates. + */ + + vmm_stats.hole_reused++; + VMM_HOLE_UNLOCK; + + return result; + } + + VMM_HOLE_UNLOCK; + + /* + * Hole has been invalidated, recompute it. + */ + + rwlock_rlock(&pm->lock); if G_UNLIKELY(0 == pm->count) { - mutex_release(&pm->lock); + rwlock_runlock(&pm->lock); return 0; } +retry: + if (kernel_mapaddr_increasing) { for (i = 0; i < pm->count; i++) { struct vm_fragment *vmf = &pm->arrayi; const void *end = vmf->end; - size_t len; if G_UNLIKELY(ptr_cmp(end, vmm_base) < 0) continue; if G_UNLIKELY(i == pm->count - 1) { *hole_ptr = end; - mutex_release(&pm->lock); - return SIZE_MAX; + result = SIZE_MAX; + goto done; } else { struct vm_fragment *next = &pm->arrayi + 1; @@ -717,34 +1023,45 @@ if G_UNLIKELY(discard && vmf_is_old_foreign(vmf)) { const void *start = vmf->start; + + /* Upgrade from read to write lock if needed */ + + if G_UNLIKELY(!wlock) { + if (rwlock_upgrade(&pm->lock)) { + wlock = TRUE; + } else { + rwlock_runlock(&pm->lock); + rwlock_wlock(&pm->lock); + wlock = TRUE; + goto retry; + } + } + pmap_discard_index(pm, i); *hole_ptr = start; - len = ptr_diff(next->start, start); - mutex_release(&pm->lock); - return len; + result = ptr_diff(next->start, start); + goto done; } if (next->start == end) continue; /* Different types do not coalesce */ *hole_ptr = end; - len = ptr_diff(next->start, end); - mutex_release(&pm->lock); - return len; + result = ptr_diff(next->start, end); + goto done; } } } else { for (i = pm->count; i > 0; i--) { struct vm_fragment *vmf = &pm->arrayi - 1; const void *start = vmf->start; - size_t len; if G_UNLIKELY(ptr_cmp(start, vmm_base) > 0) continue; if G_UNLIKELY(1 == i) { - *hole_ptr = ulong_to_pointer(kernel_pagesize); /* Not NULL */ - mutex_release(&pm->lock); - return SIZE_MAX; + *hole_ptr = start; + result = SIZE_MAX; + goto done; } else { struct vm_fragment *prev = &pm->arrayi - 2; @@ -755,25 +1072,59 @@ if G_UNLIKELY(discard && vmf_is_old_foreign(vmf)) { const void *end = vmf->end; + + /* Upgrade from read to write lock if needed */ + + if G_UNLIKELY(!wlock) { + if (rwlock_upgrade(&pm->lock)) { + wlock = TRUE; + } else { + rwlock_runlock(&pm->lock); + rwlock_wlock(&pm->lock); + wlock = TRUE; + goto retry; + } + } + pmap_discard_index(pm, i - 1); *hole_ptr = end; - len = ptr_diff(end, prev->end); - mutex_release(&pm->lock); - return len; + result = ptr_diff(end, prev->end); + goto done; } if (start == prev->end) continue; /* Foreign and native do not coalesce */ *hole_ptr = start; - len = ptr_diff(start, prev->end); - mutex_release(&pm->lock); - return len; + result = ptr_diff(start, prev->end); + goto done; } } } - mutex_release(&pm->lock); - return 0; +done: + if (wlock) + rwlock_wunlock(&pm->lock); + else + rwlock_runlock(&pm->lock); + + /* + * This is just a hint, it's OK if, by the time we fill it in, it's been + * obsoleted by concurrent allocation in the VM space. + */ + + if (result != 0) { + VMM_HOLE_LOCK; + if (kernel_mapaddr_increasing) { + vmm_hole.start = *hole_ptr; + vmm_hole.end = const_ptr_add_offset(vmm_hole.start, result); + } else { + vmm_hole.end = *hole_ptr; + vmm_hole.start = const_ptr_add_offset(vmm_hole.end, -result); + } + VMM_HOLE_UNLOCK; + } + + return result; } /** @@ -811,9 +1162,9 @@ #else flags = MAP_PRIVATE; if (-1 == fd) { - fd = get_non_stdio_fd(open("/dev/zero", O_RDWR, 0)); + fd = fd_get_non_stdio(open("/dev/zero", O_RDWR, 0)); return_value_unless(fd >= 0, NULL); - set_close_on_exec(fd); + fd_set_close_on_exec(fd); } #endif /* MAP_ANON */ @@ -835,7 +1186,7 @@ #else /* !HAS_MMAP && !MINGW32 */ static inline size_t -vmm_first_hole(const void **unused, gboolean discard) +vmm_first_hole(const void **unused, bool discard) { (void) unused; (void) discard; @@ -843,23 +1194,223 @@ } #endif /* HAS_MMAP || MINGW32 */ +static inline void +vmm_set_stop_freeing(bool val) +{ + stop_freeing = val; +#ifdef MINGW32 + mingw_set_stop_vfree(val); +#endif +} + /** - * Insert foreign region in the pmap. + * Dump current VMM hole to specified logagent. + */ +void G_COLD +vmm_dump_hole_log(logagent_t *la) +{ + struct vmm_hole h; + struct vm_upper_hole u; + const void *hole; + size_t len; + + VMM_HOLE_LOCK; + h = vmm_hole; /* struct copy */ + VMM_HOLE_UNLOCK; + VMM_UPPER_HOLE_LOCK; + u = vmm_upper_hole; /* struct copy */ + VMM_UPPER_HOLE_UNLOCK; + + if (!kernel_mapaddr_increasing) + u.p = const_ptr_add_offset(u.p, -u.len); + + log_debug(la, "VMM upper hole %p, %p %'zuKiB", + u.p, const_ptr_add_offset(u.p, u.len), u.len / 1024); + + if (h.start != NULL) { + log_debug(la, "VMM cached first hole %p, %p %'zuKiB", + h.start, h.end, ptr_diff(h.end, h.start) / 1024); + } else { + log_debug(la, "VMM cached first hole was stale"); + } + + VMM_HOLE_LOCK; + vmm_hole.start = NULL; /* Invalidate cached hole */ + VMM_HOLE_UNLOCK; + + len = vmm_first_hole(&hole, FALSE); + if (0 == len) { + log_debug(la, "VMM no hole found"); + } else { + if (!kernel_mapaddr_increasing) + hole = const_ptr_add_offset(hole, -len); + + log_debug(la, "VMM newest first hole %p, %p %'zuKiB", + hole, const_ptr_add_offset(hole, len), len / 1024); + } +} + +/** + * Update cached hole if the region falls within or encompasses it. + * + * @param p start of the region (allocated, marked foreign, memory-mapped) + * @param size length of the region + * @param alloc whether region was allocated + */ +static void +vmm_hole_update(const void *p, size_t size, bool alloc) +{ + /* + * NOTE: we update the hole statistics with the hole lock held: we do + * not grab the VMM stats lock instead, since this is sufficient to + * guarantee atomic updates: thes counters are only updated whilst + * holding that hole lock. + */ + + VMM_HOLE_LOCK; + if (vmm_hole.start != NULL) { + const void *end = const_ptr_add_offset(p, size); + + if ( + alloc && kernel_mapaddr_increasing && + ptr_cmp(end, vmm_hole.start) <= 0 + ) { + /* Allocated before hole, hole was stale */ + vmm_hole.start = NULL; /* Invalidate hole */ + vmm_stats.hole_invalidated++; + } + else if (alloc && !kernel_mapaddr_increasing && + ptr_cmp(p, vmm_hole.end) >= 0 + ) { + /* Allocated after hole, hole was stale */ + vmm_hole.start = NULL; /* Invalidate hole */ + vmm_stats.hole_invalidated++; + } + else if ( + ptr_cmp(p, vmm_hole.start) <= 0 && + ptr_cmp(end, vmm_hole.end) >= 0 + ) { + /* Hole in the middle of the region */ + vmm_hole.start = NULL; /* Invalidate hole */ + vmm_stats.hole_invalidated++; + } + else if ( + ptr_cmp(p, vmm_hole.start) >= 0 && + ptr_cmp(end, vmm_hole.end) <= 0 + ) { + /* Region falls within hole but does not cover it all */ + if (0 == ptr_cmp(p, vmm_hole.start)) { + vmm_hole.start = end; + vmm_stats.hole_updated++; + } else if (0 == ptr_cmp(end, vmm_hole.end)) { + vmm_hole.end = p; + vmm_stats.hole_updated++; + } else if (kernel_mapaddr_increasing) { + vmm_hole.end = p; + vmm_stats.hole_updated++; + } else { + vmm_hole.start = end; + vmm_stats.hole_updated++; + } + } + else if ( + ptr_cmp(end, vmm_hole.start) >= 0 && + ptr_cmp(end, vmm_hole.end) < 0 + ) { + vmm_hole.start = end; + vmm_stats.hole_updated++; + } + else if ( + ptr_cmp(p, vmm_hole.start) >= 0 && + ptr_cmp(p, vmm_hole.end) < 0 + ) { + vmm_hole.end = p; + vmm_stats.hole_updated++; + } else { + vmm_stats.hole_unchanged++; + } + + if (0 == ptr_cmp(vmm_hole.start, vmm_hole.end)) { + vmm_hole.start = NULL; /* Invalidate "empty" hole */ + vmm_stats.hole_invalidated++; + } + } + VMM_HOLE_UNLOCK; +} + +/** + * Update the "upper hole" address for VMM allocation tuning. + * + * @param pm the pmap updated after the allocation + * @param idx the region in the pmap where allocation was done. */ static void +vmm_upper_hole_update(struct pmap *pm, size_t idx) +{ + struct vm_fragment *vmf; + struct vm_upper_hole upper; + + assert_rwlock_is_owned(&pm->lock); + g_assert(idx < pm->count); + + vmf = &pm->arrayidx; + g_assert(vmf_is_native(vmf)); /* Was just allocated */ + + /* + * Look at how much room we have with the next region, when moving + * away from the VM base. If the region where the allocation took + * place is the last, then the upper bound is known and the available + * length is unbound. + * + * If the next region is adjacent (e.g. we're bumping into a foreign + * region) then we could move further up in the pmap to find a hole, + * but we want a quick estimate, not a true hole. + */ + + if (kernel_mapaddr_increasing) { + if G_UNLIKELY(pm->count - 1 == idx) { + upper.p = vmf->end; + upper.len = SIZE_MAX; + } else { + struct vm_fragment *next = &pm->arrayidx + 1; + upper.p = next->start; + upper.len = ptr_diff(next->start, vmf->end); /* Can be 0 */ + } + } else { + if G_UNLIKELY(0 == idx) { + upper.p = vmf->start; + upper.len = SIZE_MAX; + } else { + struct vm_fragment *prev = &pm->arrayidx - 1; + upper.p = prev->end; + upper.len = ptr_diff(vmf->start, prev->end); /* Can be 0 */ + } + } + + VMM_UPPER_HOLE_LOCK; + vmm_upper_hole = upper; /* struct copy */ + VMM_UPPER_HOLE_UNLOCK; +} + +/** + * Insert foreign region in the pmap. + */ +static inline void pmap_insert_foreign(struct pmap *pm, const void *start, size_t size) { pmap_insert_region(pm, start, size, VMF_FOREIGN); + vmm_hole_update(start, size, FALSE); } #ifdef HAS_MMAP /** * Insert memory-mapped region in the pmap. */ -static void +static inline void pmap_insert_mapped(struct pmap *pm, const void *start, size_t size) { pmap_insert_region(pm, start, size, VMF_MAPPED); + vmm_hole_update(start, size, FALSE); } #endif /* HAS_MMAP */ @@ -874,22 +1425,17 @@ #if defined(HAS_MMAP) || defined(MINGW32) { static int failed; - void *hint, *p; - static guint64 hint_followed; + void *p; + void *hint = deconstify_pointer(hole); + static uint64 hint_followed; if G_UNLIKELY(failed) return NULL; - if (G_UNLIKELY(stop_freeing)) { - hint = NULL; - } else { - hint = deconstify_gpointer(NULL == hole ? vmm_find_hole(size) : hole); - } - if G_UNLIKELY(hint != NULL) { if (vmm_debugging(8)) { - s_debug("VMM hinting %s%p for new %zuKiB region", - NULL == hole ? "" : "supplied ", hint, size / 1024); + s_minidbg("VMM hinting %p for new %'zuKiB region", + hint, size / 1024); } } @@ -902,14 +1448,23 @@ } p = NULL; } else if G_UNLIKELY(p != hint) { + struct pmap *pm = vmm_pmap(); + + /* + * Allocation hint was not followed. + */ + if G_UNLIKELY(hint != NULL) { if (vmm_debugging(0)) { - s_warning("VMM kernel did not follow hint %p for %zuKiB " - "region, picked %p (after %zu followed hint%s)", + s_miniwarn("VMM kernel did not follow hint %p for %'zuKiB " + "region, picked %p (after %'zu followed hint%s)", hint, size / 1024, p, (size_t) hint_followed, - hint_followed == 1 ? "" : "s"); + plural(hint_followed)); } + VMM_STATS_LOCK; vmm_stats.hints_ignored++; + hint_followed = 0; /* Always updated with stats lock taken */ + VMM_STATS_UNLOCK; } /* @@ -923,35 +1478,36 @@ * reason the memory was released and we could not notice it. */ - pmap_overrule(vmm_pmap(), p, size, VMF_NATIVE); + rwlock_wlock(&pm->lock); /* Begin critical section */ - if (NULL == hint) + pmap_overrule(pm, p, size, VMF_NATIVE); + + if (NULL == hint) { + rwlock_wunlock(&pm->lock); goto done; + } /* * Kernel did not use our hint, maybe it was wrong because something * got mapped at the place where we thought there was nothing... * - * Reload the current kernel pmap if we're able to do so, otherwise - * see whether we can mark something as "foreign" in the VM space so + * See whether we can mark something as "foreign" in the VM space so * that we avoid further attempts at the same location for blocks * of similar sizes. + * + * On Windows, we reserve a large chunk of VM space at startup and + * allocate from there, until it is exhausted, at which time we use + * emergency allocations with NULL hints. When that happens, we near + * a process restart so it is useless to start identifying regions in + * the VM space where things have been mapped by the kernel. + * --RAM, 2015-04-07 */ - hint_followed = 0; - - if (vmm_pmap() == &kernel_pmap) { - if (vmm_debugging(0)) { - s_debug("VMM current kernel pmap before reloading attempt:"); - vmm_dump_pmap(); - } - pmap_load(&kernel_pmap); - vmm_reserve_stack(0); - } else if (!local_pmap.extending) { + if (!pm->extending && !is_running_on_mingw()) { if (size <= kernel_pagesize) { - pmap_insert_foreign(&local_pmap, hint, kernel_pagesize); + pmap_insert_foreign(pm, hint, kernel_pagesize); if (vmm_debugging(0)) { - s_debug("VMM marked hint %p as foreign", hint); + s_minidbg("VMM marked hint %p as foreign", hint); } } else if ( ptr_cmp(hint, ptr_add_offset(p, size)) >= 0 || @@ -972,58 +1528,64 @@ if G_LIKELY(try != MAP_FAILED) { if (try != hint) { - pmap_insert_foreign(&local_pmap, hint, kernel_pagesize); + pmap_insert_foreign(pm, hint, kernel_pagesize); if (vmm_debugging(0)) { - s_debug("VMM marked hint %p as foreign", hint); + s_minidbg("VMM marked hint %p as foreign", hint); } } else if (2 == pagecount_fast(size)) { void *next = ptr_add_offset(hint, kernel_pagesize); if (next != p) { - pmap_insert_foreign(&local_pmap, next, - kernel_pagesize); + pmap_insert_foreign(pm, next, kernel_pagesize); if (vmm_debugging(0)) { - s_debug("VMM marked %p (page after %p) " + s_minidbg("VMM marked %p (page after %p) " "as foreign", next, hint); } } else { if (vmm_debugging(0)) { - s_debug("VMM funny kernel ignored hint %p " + s_minidbg("VMM funny kernel ignored hint %p " "and allocated 8 KiB at %p whereas hint " "was free", hint, p); } } } else { if (vmm_debugging(1)) { - s_debug("VMM hinted %p is not a foreign page", + s_minidbg("VMM hinted %p is not a foreign page", hint); } } if (0 != vmm_vfree(try, kernel_pagesize)) { - s_warning("VMM cannot free single page at %p: %m", try); + s_miniwarn("VMM cannot free one page at %p: %m", try); } } else { if (vmm_debugging(0)) { - s_warning("VMM cannot allocate one page at %p: %m", + s_miniwarn("VMM cannot allocate one page at %p: %m", hint); } } } else { if (vmm_debugging(0)) { - s_debug("VMM hint %p fell within allocated %p, %p", + s_minidbg("VMM hint %p fell within allocated %p, %p", hint, p, ptr_add_offset(p, size - 1)); } } } + rwlock_wunlock(&pm->lock); /* End critical section */ } else if (hint != NULL) { + /* + * Allocation took place at the hinted address. + */ + if G_UNLIKELY(0 == (hint_followed & 0xff)) { if (vmm_debugging(0)) { - s_debug("VMM hint %p followed for %zuKiB (%zu consecutive)", + s_minidbg("VMM hint %p followed for %'zuKiB (%'zu consecutive)", hint, size / 1024, (size_t) hint_followed); } } + VMM_STATS_LOCK; hint_followed++; vmm_stats.hints_followed++; + VMM_STATS_UNLOCK; } done: return p; @@ -1046,20 +1608,76 @@ g_assert_not_reached(); #error "Neither mmap(), posix_memalign() nor memalign() available" #endif /* HAS_POSIX_MEMALIGN */ - if (p) { + if (p != NULL) { memset(p, 0, size); } return p; } #endif /* HAS_MMAP */ +static void +vmm_validate_pages(void *p, size_t size) +{ + g_assert(p); + g_assert(size_is_positive(size)); +#ifdef VMM_PROTECT_FREE_PAGES + mprotect(p, size, PROT_READ | PROT_WRITE); +#endif /* VMM_PROTECT_FREE_PAGES */ +#ifdef VMM_INVALIDATE_FREE_PAGES + /* This should be unnecessary */ + /* vmm_madvise_normal(p, size); */ +#endif /* VMM_INVALIDATE_FREE_PAGES */ +} + +static void +vmm_invalidate_pages(void *p, size_t size) +{ + g_assert(p); + g_assert(size_is_positive(size)); + + if (G_UNLIKELY(stop_freeing)) + return; + +#ifdef VMM_PROTECT_FREE_PAGES + mprotect(p, size, PROT_NONE); +#endif /* VMM_PROTECT_FREE_PAGES */ +#ifdef VMM_INVALIDATE_FREE_PAGES + vmm_madvise_free(p, size); +#endif /* VMM_INVALIDATE_FREE_PAGES */ +} + /** * Insert region in the pmap, known to be native. */ -static void +static size_t pmap_insert(struct pmap *pm, const void *start, size_t size) { - pmap_insert_region(pm, start, size, VMF_NATIVE); + return pmap_insert_region(pm, start, size, VMF_NATIVE); +} + +/** + * Allocate pages from the page cache at all cost. + * + * @return allocated region, NULL if no memory is available. + */ +static void * +alloc_pages_emergency(size_t size) +{ + size_t n = pagecount_fast(size); + void *p; + + /* + * We request "user memory" from the page cache to ensure we're going + * to be served if there is memory available there. + */ + + p = page_cache_find_pages(n, TRUE, TRUE); + if (p != NULL) { + vmm_validate_pages(p, size); + memset(p, 0, size); /* Kernel memory always zeroed */ + } + + return p; } /** @@ -1067,38 +1685,126 @@ * * @param size the amount of bytes to allocate. * @param update_pmap whether our VMM pmap should be updated - * @param hole if non-NULL, identified VM hole of size bytes at least * * @return On success a pointer to the allocated chunk is returned. On * failure NULL is returned. */ static void * -alloc_pages(size_t size, gboolean update_pmap, const void *hole) +alloc_pages(size_t size, bool update_pmap) { void *p; - size_t generation = kernel_pmap.generation; + const void *hole = NULL; + struct pmap *pm = vmm_pmap(); g_assert(kernel_pagesize > 0); + if (update_pmap) { + /* + * We only compute a hole when we're going to update the pmap. + * Because we hold the pmap's write lock, only one thread at a time + * will be able to perform the allocation with that selected hole. + */ + + rwlock_wlock(&pm->lock); + if (G_UNLIKELY(stop_freeing)) { + hole = NULL; + } else { + hole = vmm_find_hole(size); + } + } + p = vmm_mmap_anonymous(size, hole); - return_value_unless(NULL != p, NULL); - - g_assert_log(page_start(p) == p, "Aligned memory required: %p", p); + + if G_UNLIKELY(NULL == p) { + /* + * Emergency situation: we're out of memory, we're going to request + * that this process be restarted. If we return NULL from here, this + * is going to be a burtal restart, and we can maybe perform a clean + * one: all we have to do is be able to allocate from the page cache, + * even though this would not be an optimal allocation. + * --RAM, 2015-04-02 + */ + + vmm_oom_condition(); + + p = alloc_pages_emergency(size); + if (p != NULL) { + /* We're going to crash and restart, don't update statistics */ + + crash_restart("%s(): emergency allocation of %'zu bytes from " + "the page cache", G_STRFUNC, size); + + /* Allocation from page cache: region is already in the pmap */ + goto done; + } + + /* + * Critical situation: free all the pages from the page cache and + * retry allocation. + */ + + page_cache_free_all(TRUE); + + if (update_pmap) { + if (G_UNLIKELY(stop_freeing)) { + hole = NULL; + } else { + hole = vmm_find_hole(size); + } + } + + p = vmm_mmap_anonymous(size, hole); + + if (p != NULL) { + /* We're going to crash and restart, don't update statistics */ + + crash_restart("%s(): emergency allocation of %'zu bytes after " + "clearing the page cache", G_STRFUNC, size); + + goto allocated; + } + + /* + * Last resort: use the VM emergency region if we have one. + */ + + p = vmea_alloc(size); + if (p != NULL) { + /* We're going to crash and restart, don't update statistics */ + + crash_restart("%s(): allocation of %'zu bytes via emergency region", + G_STRFUNC, size); + + memset(p, 0, size); /* Kernel memory always zeroed */ + + /* Allocation from emergency region, already present in the pmap */ + } + + /* FALL THROUGH */ + + done: + if (update_pmap) + rwlock_wunlock(&pm->lock); + + return p; + } + +allocated: + g_assert_log(page_start(p) == p, "aligned memory required: %p", p); if (vmm_debugging(5)) { - s_debug("VMM allocated %zuKiB region at %p", size / 1024, p); + s_minidbg("VMM allocated %'zuKiB region at %p", size / 1024, p); } - /* - * Since the kernel pmap can be reloaded by vmm_mmap_anonymous(), we - * need to be careful and not insert something that will be listed there. - * - * NB: we check the kernel_pmap object only but we use vmm_pmap() for - * inserting in case we do not use the kernel pmap. - */ + vmm_hole_update(p, size, TRUE); + + if (update_pmap) { + size_t idx; - if (update_pmap && kernel_pmap.generation == generation) - pmap_insert(vmm_pmap(), p, size); + idx = pmap_insert(pm, p, size); + vmm_upper_hole_update(pm, idx); + rwlock_wunlock(&pm->lock); + } return p; } @@ -1108,9 +1814,20 @@ * Must not be called directly other than through free_pages*() routines. */ static void -free_pages_intern(void *p, size_t size, gboolean update_pmap) +free_pages_intern(void *p, size_t size, bool update_pmap) { /* + * The critical region is required when we're going to update the + * pmap since another thread could concurrently allocate memory that + * was already freed at the kernel level but which could be still + * accounted for as "busy" in the pmap -- a situation likely to break + * assertions. + */ + + if (update_pmap) + rwlock_wlock(&vmm_pmap()->lock); + + /* * If ``stop_freeing'' was set, well be only updating the pmap so that * we can spot "leaks" at vmm_close() time. */ @@ -1123,7 +1840,11 @@ int ret = 0; ret = vmm_vfree_fragment(p, size); - return_unless(0 == ret); + + if G_UNLIKELY(ret != 0) { + s_minierror("%s(): release of %'zu bytes at %p failed: %s", + G_STRFUNC, size, p, symbolic_errno(errno)); + } } #elif defined(HAS_POSIX_MEMALIGN) || defined(HAS_MEMALIGN) (void) size; @@ -1135,21 +1856,99 @@ #error "Neither mmap(), posix_memalign() nor memalign() available" #endif /* HAS_POSIX_MEMALIGN || HAS_MEMALIGN */ + /* + * Update the cached first hole if freed region touches it. + * + * NOTE: we update the hole statistics with the hole lock held: we do + * not grab the VMM stats lock instead, since this is sufficient to + * guarantee atomic updates: thes counters are only updated whilst + * holding that hole lock. + */ + + VMM_HOLE_LOCK; + if (vmm_hole.start != NULL) { + const void *end = ptr_add_offset(p, size); + + if (kernel_mapaddr_increasing && ptr_cmp(end, vmm_hole.start) <= 0) { + if (0 == ptr_cmp(end, vmm_hole.start)) { + vmm_hole.start = p; + vmm_stats.hole_updated++; + } else { + vmm_hole.start = NULL; /* Invalidate, our hole was stale */ + vmm_stats.hole_invalidated++; + } + } + else if (!kernel_mapaddr_increasing && ptr_cmp(p, vmm_hole.end) >= 0) { + if (0 == ptr_cmp(p, vmm_hole.end)) { + vmm_hole.end = end; + vmm_stats.hole_updated++; + } else { + vmm_hole.start = NULL; /* Invalidate, our hole was stale */ + vmm_stats.hole_invalidated++; + } + } + else if ( + ptr_cmp(p, vmm_hole.start) <= 0 && + ptr_cmp(end, vmm_hole.end) >= 0 + ) { + /* Hole in the middle of the freed region */ + vmm_hole.start = p; + vmm_hole.end = end; + vmm_stats.hole_updated++; + } + else if ( + ptr_cmp(p, vmm_hole.start) >= 0 && + ptr_cmp(end, vmm_hole.end) <= 0 + ) { + /* Freed region falls within hole but does not cover it all */ + vmm_hole.start = NULL; /* Invalidate, our hole was stale */ + vmm_stats.hole_invalidated++; + } + else if ( + ptr_cmp(p, vmm_hole.start) <= 0 && + ptr_cmp(end, vmm_hole.start) >= 0 + ) { + vmm_hole.start = p; + if (ptr_cmp(end, vmm_hole.end) > 0) + vmm_hole.end = end; + vmm_stats.hole_updated++; + } + else if ( + ptr_cmp(p, vmm_hole.end) <= 0 && + ptr_cmp(end, vmm_hole.end) >= 0 + ) { + vmm_hole.end = end; + if (ptr_cmp(p, vmm_hole.start) < 0) + vmm_hole.start = p; + vmm_stats.hole_updated++; + } else { + vmm_stats.hole_unchanged++; + } + } + VMM_HOLE_UNLOCK; + pmap_update: - if (update_pmap) - pmap_remove(vmm_pmap(), p, size); + if (update_pmap) { + struct pmap *pm = vmm_pmap(); + + pmap_remove(pm, p, size); + rwlock_wunlock(&pm->lock); + } } /** * Free memory allocated by alloc_pages(). */ static void -free_pages(void *p, size_t size, gboolean update_pmap) +free_pages(void *p, size_t size, bool update_pmap) { if (vmm_debugging(5)) { - s_debug("VMM freeing %zuKiB region at %p", size / 1024, p); + s_minidbg("VMM freeing %'zuKiB region at %p", size / 1024, p); } + if G_UNLIKELY(vmm_oom_detected && vmea_free(p, size)) + return; + free_pages_intern(p, size, update_pmap); } @@ -1163,38 +1962,42 @@ * @return found fragment if address lies within the fragment, NULL if * no fragment containing the address was found. */ -static G_GNUC_HOT struct vm_fragment * +static struct vm_fragment * G_HOT pmap_lookup(const struct pmap *pm, const void *p, size_t *low_ptr) { - size_t low = 0, high = pm->count - 1; - struct vm_fragment *item; - size_t mid = 0; + const struct vm_fragment + *low = &pm->array0, + *high = &pm->arraypm->count - 1, + *mid; + + if G_UNLIKELY(0 == pm->count) { + if (low_ptr != NULL) + *low_ptr = 0; + return NULL; + } /* Binary search */ for (;;) { - if (low > high || high > SIZE_MAX / 2) { - item = NULL; /* Not found */ + if G_UNLIKELY(low > high) { + mid = NULL; /* Not found */ break; } mid = low + (high - low) / 2; - g_assert(mid < pm->count); - - item = &pm->arraymid; - if (ptr_cmp(p, item->end) >= 0) + if (ptr_cmp(p, mid->end) >= 0) low = mid + 1; - else if (ptr_cmp(p, item->start) < 0) - high = mid - 1; + else if (ptr_cmp(p, mid->start) < 0) + high = mid - 1; /* -1 OK since pointers cannot reach page 0 */ else break; /* Found */ } if (low_ptr != NULL) - *low_ptr = (item == NULL) ? low : mid; + *low_ptr = (NULL == mid ? low : mid) - &pm->array0; - return item; + return deconstify_pointer(mid); } /** @@ -1206,16 +2009,18 @@ g_assert(NULL == pm->array); g_assert(0 == pm->pages); - mutex_init(&pm->lock); - pm->array = alloc_pages(kernel_pagesize, FALSE, NULL); + rwlock_init(&pm->lock); + pm->array = alloc_pages(kernel_pagesize, FALSE); pm->pages = 1; pm->count = 0; pm->size = kernel_pagesize / sizeof pm->array0; if (NULL == pm->array) - s_error("cannot initialize the VMM layer: out of memory already?"); + s_minierror("cannot initialize the VMM layer: out of memory already?"); + rwlock_wlock(&vmm_pmap()->lock); pmap_insert(vmm_pmap(), pm->array, kernel_pagesize); + rwlock_wunlock(&vmm_pmap()->lock); } /** @@ -1228,22 +2033,18 @@ size_t nsize; size_t osize; void *oarray; - size_t old_generation; - gboolean was_extending = pm->extending; + bool was_extending = pm->extending; - g_assert(mutex_is_owned(&pm->lock)); + assert_rwlock_is_owned(&pm->lock); retry: osize = kernel_pagesize * pm->pages; nsize = osize + kernel_pagesize; - old_generation = vmm_pmap()->generation; if (vmm_debugging(0)) { - s_debug("VMM extending %s%s%s pmap from %zu KiB to %zu KiB", + s_minidbg("VMM extending %spmap from %'zu KiB to %'zu KiB", pm->extending ? "(recursively) " : "", - pm->loading ? "loading " : "", - pm == &kernel_pmap ? "kernel" : "local", osize / 1024, nsize / 1024); } @@ -1251,8 +2052,8 @@ /* * It is possible to recursively enter here through alloc_pages() when - * mmap() is used to allocate virtual memory, in case we reload the - * kernel map or insert a foreign region. + * mmap() is used to allocate virtual memory, in case we insert a foreign + * region. * * To protect against that, we start by allocating the new pages and * remember the amount of pages in the map. If upon return from the @@ -1264,13 +2065,17 @@ { size_t old_pages = pm->pages; - narray = alloc_pages(nsize, FALSE, NULL); /* May recurse here */ + narray = alloc_pages(nsize, FALSE); /* May recurse here */ + + if (NULL == narray) { + crash_oom("%s(): cannot extend pmap to %'zu bytes: " + "out of virtual memory", G_STRFUNC, nsize); + } if (pm->pages != old_pages) { if (vmm_debugging(0)) { - s_warning("VMM already recursed to pmap_extend(), " - "pmap is now %zu KiB", - (kernel_pagesize * pm->pages) / 1024); + s_miniwarn("VMM already recursed to %s(), pmap is now %'zu KiB", + G_STRFUNC, (kernel_pagesize * pm->pages) / 1024); } g_assert(kernel_pagesize * pm->pages >= nsize); if (narray != NULL) @@ -1285,13 +2090,15 @@ return; if (vmm_debugging(0)) - s_warning("VMM however pmap is still full, extending again..."); - + s_miniwarn("VMM however pmap is still full, extending again!"); + goto retry; + } else { + if (vmm_debugging(0)) { + s_minidbg("VMM allocated new %'zu KiB pmap at %p", + nsize / 1024, narray); + } } - - if (NULL == narray) - s_error("cannot extend pmap: out of virtual memory"); } oarray = pm->array; @@ -1310,153 +2117,44 @@ * array can be freed, so this must come last. */ + pmap_insert(pm, narray, nsize); free_pages(oarray, osize, TRUE); - - /* - * Watch out for extending the kernel pmap whilst we're reloading it. - * This means our data structures were too small, and we'll need to - * reload it again. - */ - - { - struct pmap *vpm = vmm_pmap(); - - if (!vpm->loading) { - if (vpm->generation == old_generation) { - pmap_insert(vpm, narray, nsize); - } else { - if (vmm_debugging(0)) { - s_debug("VMM kernel pmap reloaded during extension"); - } - /* New pages must be there! */ - g_assert(NULL != pmap_lookup(vpm, narray, NULL)); - } - } else { - vpm->resized = TRUE; - } - } -} - -/** - * Add a new fragment at the tail of pmap (must be added in order), coalescing - * fragments of the same foreign type. - */ -static void -pmap_add(struct pmap *pm, const void *start, const void *end, vmf_type_t type) -{ - struct vm_fragment *vmf; - - g_assert(pm->array != NULL); - g_assert(pm->count <= pm->size); - g_assert(ptr_cmp(start, end) < 0); - - mutex_get(&pm->lock); - - while (pm->count == pm->size) - pmap_extend(pm); - - g_assert(pm->count < pm->size); - - /* - * Ensure that entries are inserted in order. - */ - - if (pm->count > 0) { - vmf = &pm->arraypm->count - 1; - g_assert(ptr_cmp(start, vmf->end) >= 0); - } - - /* - * Attempt coalescing. - */ - - if (pm->count > 0) { - vmf = &pm->arraypm->count - 1; - if (vmf->type == type && vmf->end == start) { - vmf->end = end; - vmf->mtime = tm_time(); - goto done; - } - } - - vmf = &pm->arraypm->count++; - vmf->start = start; - vmf->end = end; - vmf->mtime = tm_time(); - -done: - mutex_release(&pm->lock); } /** * Insert region in the pmap. + * + * @return index where region was inserted / coalesced to. */ -static void +static size_t pmap_insert_region(struct pmap *pm, const void *start, size_t size, vmf_type_t type) { const void *end = const_ptr_add_offset(start, size); struct vm_fragment *vmf; size_t idx; - gboolean reloaded = FALSE; + + assert_rwlock_is_owned(&pm->lock); g_assert(pm->array != NULL); - g_assert(pm->count <= pm->size); - g_assert(ptr_cmp(start, end) < 0); + g_assert(pm->count < pm->size); g_assert(round_pagesize_fast(size) == size); - mutex_get(&pm->lock); - - /* - * Watch out for the kernel pmap being reloaded because the kernel did not - * follow our hint when the pmap pages were allocated. - */ - - if G_UNLIKELY(pm->count == pm->size) { - size_t generation = kernel_pmap.generation; - - pmap_extend(pm); - - if G_UNLIKELY(kernel_pmap.generation != generation) { - if (vmm_debugging(1)) { - s_debug("VMM kernel pmap reloaded before inserting %s %p, %p", - vmf_type_str(type), start, const_ptr_add_offset(end, -1)); - } - reloaded = TRUE; - } - - g_assert(pm->count < pm->size); - } - vmf = pmap_lookup(pm, start, &idx); if G_UNLIKELY(vmf != NULL) { - if (reloaded) { - if (vmm_debugging(2)) { - s_debug("VMM good, reloaded kernel pmap contains %s region", - vmf_type_str(vmf->type)); - } - } else { - if (vmm_debugging(0)) { - s_warning("pmap already contains new %s region %p, %p", - vmf_type_str(vmf->type), - start, const_ptr_add_offset(start, size - 1)); - vmm_dump_pmap(); - } - g_assert(VMF_FOREIGN == type); - g_assert_log(vmf_is_foreign(vmf), - "vmf={%s}, start=%p, size=%zu", - vmf_to_string(vmf), start, size); - g_assert(ptr_cmp(end, vmf->end) <= 0); - } - goto done; - } else if G_UNLIKELY(reloaded) { if (vmm_debugging(0)) { - s_warning("VMM reloaded kernel pmap does not contain " - "%s %p, %p, will add now", - vmf_type_str(type), start, const_ptr_add_offset(end, -1)); + s_miniwarn("pmap already contains new %s region %p, %p", + vmf_type_str(vmf->type), + start, const_ptr_add_offset(start, size - 1)); + vmm_dump_pmap(); } - /* FALL THROUGH */ + g_assert(VMF_FOREIGN == type); + g_assert_log(vmf_is_foreign(vmf), + "vmf={%s}, start=%p, size=%'zu", + vmf_to_string(vmf), start, size); + g_assert(ptr_cmp(end, vmf->end) <= 0); + goto done; } g_assert(idx <= pm->count); @@ -1471,7 +2169,7 @@ g_assert_log( ptr_cmp(prev->end, start) <= 0, /* No overlap with prev */ - "idx=%zu, start=%p, size=%zu, prev={%s}", + "idx=%zu, start=%p, size=%'zu, prev={%s}", idx, start, size, vmf_to_string(prev)); if (prev->type == type && prev->end == start) { @@ -1482,12 +2180,12 @@ * If we're now bumping into the next chunk, we need to coalesce * it with the previous one and get rid of that "next" entry. */ - + if G_LIKELY(idx < pm->count) { struct vm_fragment *next = &pm->arrayidx; g_assert_log(ptr_cmp(next->start, end) >= 0, /* No overlap */ - "idx=%zu, end=%p, size=%zu, next={%s}", + "idx=%zu, end=%p, size=%'zu, next={%s}", idx, end, size, vmf_to_string(next)); if (next->type == type && next->start == end) { @@ -1495,17 +2193,12 @@ /* * Get rid of the entry at ``idx'' in the array. - * We need to shift data back by one slot unless we remove - * the last entry. */ - pm->count--; - if G_LIKELY(idx < pm->count) { - memmove(&pm->arrayidx, &pm->arrayidx+1, - sizeof(pm->array0) * (pm->count - idx)); - } + pmap_drop(pm, idx); } } + idx--; goto done; } } @@ -1514,7 +2207,7 @@ struct vm_fragment *next = &pm->arrayidx; g_assert_log(ptr_cmp(end, next->start) <= 0, /* No overlap with next */ - "idx=%zu, end=%p, size=%zu, next={%s}", + "idx=%zu, end=%p, size=%'zu, next={%s}", idx, end, size, vmf_to_string(next)); if (next->type == type && next->start == end) { @@ -1524,11 +2217,10 @@ } /* - * Make room before ``idx'', the insertion point. + * Make room at ``idx'', the insertion point. */ - memmove(&pm->arrayidx+1, &pm->arrayidx, - sizeof(pm->array0) * (pm->count - idx)); + ARRAY_MAKEROOM(pm->array, idx, pm->count, pm->size); } pm->count++; @@ -1539,361 +2231,48 @@ vmf->mtime = tm_time(); done: - mutex_release(&pm->lock); -} - -/** - * Parse a line read from /proc/self/maps and add it to the map. - * @return TRUE if we managed to parse the line correctly - */ -static gboolean -pmap_parse_and_add(struct pmap *pm, const char *line) -{ - int error; - const char *ep; - const char *p = line; - const void *start, *end; - gboolean foreign = FALSE; - - if (vmm_debugging(9)) - s_debug("VMM parsing \"%s\"", line); - - /* - * Typical format of lines on linux: - * - * device - * start - end perm offset mj:mn - * - * 08048000-0804f000 r-xp 00000000 09:00 1585 /bin/cat - * 08050000-08071000 rw-p 08050000 00:00 0 heap - * b7f9a000-b7f9d000 rw-p b7f9a000 00:00 0 - * bfdba000-bfdcf000 rw-p bffeb000 00:00 0 stack - */ - - start = parse_pointer(p, &ep, &error); - if (error || NULL == start) { - if (vmm_debugging(0)) - s_warning("VMM cannot parse start address"); - return FALSE; - } - - if (*ep != '-') - return FALSE; - - p = ++ep; - end = parse_pointer(p, &ep, &error); - if (error || NULL == end) { - if (vmm_debugging(0)) - s_warning("VMM cannot parse end address"); - return FALSE; - } - - if (ptr_cmp(end, start) <= 0) { - if (vmm_debugging(0)) - s_warning("VMM invalid start/end address pair"); - return FALSE; - } - - p = skip_ascii_blanks(ep); - - { - char perms4; - int i; - int c; - - for (i = 0; i < 4; i++) { - c = *p++; - if ('0' == c) { - if (vmm_debugging(0)) - s_warning("VMM short permission string"); - return FALSE; - } - permsi = c; - } - - if ('x' == perms2 || 'w' != perms1 || 'p' != perms3) - foreign = TRUE; /* This region was not allocated by VMM */ - } - - /* - * FIXME: now that we have 3 types of memory region, we must recognize - * memory mapped regions we know about when reloading a pmap, by looking - * at the current map we have. -- RAM, 2011-10-01. - */ - - pmap_add(pm, start, end, foreign ? VMF_FOREIGN : VMF_NATIVE); - - return TRUE; -} - -struct iobuffer { - char *buf; - size_t size; - char *rptr; - size_t fill; - unsigned int eof:1; - unsigned int error:1; - unsigned int toobig:1; -}; - -static void -iobuffer_init(struct iobuffer *iob, char *dst, size_t size) -{ - iob->buf = dst; - iob->size = size; - iob->rptr = dst; - iob->fill = 0; - iob->eof = 0; - iob->error = 0; - iob->toobig = 0; -} - -/** - * Reads a line from an open file descriptor whereas each successive call - * clears the previous line. Lines are separated by '\n' which is replaced - * by a NUL when returned. The maximum acceptable line length is bound to - * the buffer size. iob->error is set on I/O errors, iob->toobig is set - * once the buffer is full without any newline character. - * - * @param iob An initialized, valid 'struct iobuffer'. - * @param fd An open file descriptor. - * - * @return NULL on failure or EOF, pointer to the current line on success. - */ -static const char * -iobuffer_readline(struct iobuffer *iob, int fd) -{ - g_assert(iob); - g_assert(iob->buf); - g_assert(iob->rptr); - g_assert(iob->fill <= iob->size); - - /* Clear previous line and shift following chars */ - if (iob->rptr != iob->buf) { - size_t n = iob->rptr - iob->buf; - - g_assert(iob->fill >= n); - iob->fill -= n; - memmove(iob->buf, iob->rptr, iob->fill); - iob->rptr = iob->buf; - } - - do { - /* Refill buffer if not EOF and not full */ - if (!iob->eof && iob->fill < iob->size) { - size_t n = iob->size - iob->fill; - ssize_t ret; - - ret = read(fd, &iob->bufiob->fill, n); - if ((ssize_t) -1 == ret) { - iob->error = TRUE; - iob->eof = TRUE; - break; - } else if (0 == ret) { - iob->eof = TRUE; - } else { - iob->fill += ret; - } - } - if (iob->fill > 0) { - char *p = memchr(iob->buf, '\n', iob->fill); - if (p) { - *p = '\0'; - iob->rptr = &p1; - return iob->buf; - } - } - if (iob->fill >= iob->size) { - iob->toobig = TRUE; - break; - } - } while (!iob->eof); - - return NULL; -} - -/** - * @return A negative value on failure. If zero is returned, check pm->resize - * and try again. - */ -static inline int -pmap_load_data(struct pmap *pm) -{ - struct iobuffer iob; - char buf4096; - int fd, ret = -1; - /* - * This is a low-level routine, do not use stdio at all as it could - * allocate memory and re-enter the VMM layer. Likewise, do not - * allocate any memory, excepted for the pmap where entries are stored. - */ - - fd = open("/proc/self/maps", O_RDONLY); - if (fd < 0) { - if (vmm_debugging(0)) { - s_warning("VMM cannot open /proc/self/maps: %m"); - } - goto failure; - } - - /* - * Dirty the pages associated with buf to avoid that the kernel has to - * extend the stack, which may modify mappings while reading from /proc. - */ - - ZERO(&buf); - - pm->count = 0; - iobuffer_init(&iob, buf, sizeof buf); - - while (!pm->resized) { - const char *line; - - line = iobuffer_readline(&iob, fd); - if (NULL == line) { - if (iob.error) { - if (vmm_debugging(0)) { - s_warning("VMM error reading /proc/self/maps: %m"); - } - goto failure; - } - if (iob.toobig) { - if (vmm_debugging(0)) { - s_warning("VMM too long a line in /proc/self/maps output"); - } - goto failure; - } - break; - } - if (!pmap_parse_and_add(pm, line)) { - if (vmm_debugging(0)) { - s_warning("VMM error parsing \"%s\"", buf); - } - goto failure; - } - } - ret = 0; - -failure: - fd_close(&fd); - return ret; -} - -/** - * Load the process's memory map from /proc/self/maps into the supplied map. - */ -static void -pmap_load(struct pmap *pm) -{ - /* - * FIXME - * - * Before the 0.96.7 release, I'm disabling kernel pmap loading. + * After each insertion we need to monitor whether the pmap is full and + * extend it before the next insertion happens. If we were to extend + * the pmap upon entry in this routine, we could allocate a new pmap + * overlapping with the region we are going to insert, resulting in + * corrupted structures leading to crashes. * - * This is because upon kernel map loading, we do not know currently - * how to propagate the regions we have allocated already to prevent - * them from being coalesced by the loading into a "foreign" area (despite - * them being truly owned by us already). - * - * This would then trigger undue assertion failures because suddenly - * we would think we're releasing memory allocated via vmm_mmap() (as - * it would be wrongly be part of a fragment tagged foreign) when in - * reality we're releasing memory allocated through vmm_alloc(). - * - * --RAM, 2010-03-05 + * Therefore, always ensure we have room for at least one more slot. */ - (void) pm; - -#if 0 - static int failed; - unsigned attempt = 0; - if (failed) - return; - - g_assert(&kernel_pmap == pm); - - if (vmm_debugging(8)) { - s_debug("VMM loading kernel memory map (for generation #%zu)", - pm->generation + 1); - } - - for (;;) { - int ret; - - pm->loading = TRUE; - pm->resized = FALSE; - - ret = pmap_load_data(pm); - if (ret < 0) { - failed = TRUE; - break; - } - if (!pm->resized) - break; + if G_UNLIKELY(pm->count == pm->size) { + pmap_extend(pm); - if (++attempt > 10) { - /* Unconditional warning -- something may break afterwards */ - s_warning("VMM unable to reload kernel pmap after %u attempts", - attempt); - break; - } + /* + * After an extension of the pmap, we need to recompute the index in + * the array where the region we had to insert initially has been + * placed. Indeed, the pages holding the pmap are also inserted in + * the pmap array, and therefore the previous insertion index may now + * be invalid (if e.g. we inserted the new pmap before, or the old pmap + * which has now been freed was a fragment before the insertion point). + * --RAM, 2015-03-02 + */ - if (vmm_debugging(0)) { - s_warning("VMM kernel pmap resized during loading attempt #%u" - ", retrying", attempt); - } + vmf = pmap_lookup(pm, start, &idx); + g_assert(vmf != NULL); /* Must be found, we just inserted it */ } - pm->loading = FALSE; - - if (!failed) - pm->generation++; - - if (vmm_debugging(1)) { - s_debug("VMM kernel memory map (generation #%zu) holds %zu region%s", - pm->generation, pm->count, 1 == pm->count ? "" : "s"); - } -#endif + return idx; } /** * Log missing region. */ -static void +static inline void pmap_log_missing(const struct pmap *pm, const void *p, size_t size) { - if (vmm_debugging(0)) { - s_warning("VMM %zuKiB region at %p missing from %s pmap", - size / 1024, p, - pm == &kernel_pmap ? "kernel" : - pm == &local_pmap ? "local" : "unknown"); - } -} - -/** - * Is block within an identified region, and not at the beginning or tail? - */ -static gboolean -pmap_is_within_region(const struct pmap *pm, const void *p, size_t size) -{ - struct vm_fragment *vmf; - gboolean within; - - mutex_get_const(&pm->lock); - - vmf = pmap_lookup(pm, p, NULL); + (void) pm; - if (NULL == vmf) { - pmap_log_missing(pm, p, size); - return FALSE; + if (vmm_debugging(0)) { + s_miniwarn("VMM %'zuKiB region at %p missing from pmap", + size / 1024, p); } - - within = p != vmf->start && vmf->end != const_ptr_add_offset(p, size); - - mutex_release_const(&pm->lock); - return within; } /** @@ -1911,14 +2290,15 @@ const void *middle; size_t distance_to_start; size_t distance_to_end; + struct pmap *wpm = deconstify_pointer(pm); - mutex_get_const(&pm->lock); + rwlock_rlock(&wpm->lock); vmf = pmap_lookup(pm, p, NULL); if (NULL == vmf) { pmap_log_missing(pm, p, size); - mutex_release_const(&pm->lock); + rwlock_runlock(&wpm->lock); return 0; } @@ -1926,63 +2306,122 @@ distance_to_start = ptr_diff(middle, vmf->start); distance_to_end = ptr_diff(vmf->end, middle); - mutex_release_const(&pm->lock); + rwlock_runlock(&wpm->lock); return MIN(distance_to_start, distance_to_end); } /** + * Is block at a region extremity? + */ +static bool +pmap_is_extremity(const struct pmap *pm, const void *p, size_t npages) +{ + struct vm_fragment *vmf; + size_t idx; + + g_assert(rwlock_is_taken(&pm->lock)); /* needs at least the read lock */ + + vmf = pmap_lookup(pm, p, &idx); + + if (NULL == vmf) { + pmap_log_missing(pm, p, nsize_fast(npages)); + return FALSE; + } + + /* + * The ``npages'' pages starting at ``p'' are an extremity if they lie + * at the beginning or end of the region. + * + * Since regions are not adjacent in the pmap (or they would have been + * merged), identifying an extremity is useful at free time: it increases + * the amount of consecutive free space in the VM space. + * + * Note that a whole region is considered an extremity, and it's a memory + * fragment in the sense of pmap_is_fragment(). + */ + + if (0 == ptr_cmp(p, vmf->start)) + return TRUE; /* Extremity at the beginning of region */ + + if (0 == ptr_cmp(const_ptr_add_offset(p, nsize_fast(npages)), vmf->end)) + return TRUE; /* Extremity at the end of region */ + + return FALSE; /* Region is held within the memory fragment */ +} + +/** * Is block an identified fragment? */ -static gboolean +static bool pmap_is_fragment(const struct pmap *pm, const void *p, size_t npages) { struct vm_fragment *vmf; - gboolean fragment; + size_t idx; - mutex_get_const(&pm->lock); + g_assert(rwlock_is_taken(&pm->lock)); /* needs at least the read lock */ - vmf = pmap_lookup(pm, p, NULL); + vmf = pmap_lookup(pm, p, &idx); if (NULL == vmf) { - pmap_log_missing(pm, p, npages * kernel_pagesize); + pmap_log_missing(pm, p, nsize_fast(npages)); return FALSE; } - fragment = p == vmf->start && npages == pagecount_fast(vmf_size(vmf)); + /* + * If block lies within a VM fragment, it's not a fragment. + */ + + if (p != vmf->start || npages != pagecount_fast(vmf_size(vmf))) + return FALSE; + + /* + * If the block is next to a foreign/mapped region, then it's not a + * fragment, regardless of whether the other region is in the direction + * of the VM growing range or not. + */ - mutex_release_const(&pm->lock); - return fragment; + if (idx != 0) { + struct vm_fragment *prev = &pm->arrayidx - 1; + if (prev->end == vmf->start) + return FALSE; + } + + if (idx != pm->count - 1) { + struct vm_fragment *next = &pm->arrayidx + 1; + if (next->start == vmf->end) + return FALSE; + } + + return TRUE; } /** * Is range available (hole) within the VM space? */ -static gboolean +static bool pmap_is_available(const struct pmap *pm, const void *p, size_t size) { size_t idx; + struct pmap *wpm = deconstify_pointer(pm); + bool result = FALSE; - mutex_get_const(&pm->lock); + rwlock_rlock(&wpm->lock); - if (pmap_lookup(pm, p, &idx)) { - mutex_release_const(&pm->lock); - return FALSE; - } + if (pmap_lookup(pm, p, &idx)) + goto done; g_assert(size_is_non_negative(idx)); if (idx < pm->count) { struct vm_fragment *vmf = &pm->arrayidx; const void *end = const_ptr_add_offset(p, size); - gboolean ret; - ret = ptr_cmp(end, vmf->start) <= 0; - mutex_release_const(&pm->lock); - return ret; + result = ptr_cmp(end, vmf->start) <= 0; } - mutex_release_const(&pm->lock); - return TRUE; +done: + rwlock_runlock(&wpm->lock); + return result; } /** @@ -1990,7 +2429,8 @@ * of the specified type. */ static void -assert_vmm_is_allocated(const void *base, size_t size, vmf_type_t type) +assert_vmm_is_allocated(const void *base, size_t size, vmf_type_t type, + bool locked) { struct vm_fragment *vmf; const void *end; @@ -2000,7 +2440,18 @@ g_assert(base != NULL); g_assert(size_is_positive(size)); - mutex_get(&pm->lock); + if (locked) { + /* + * Must prevent deadlocks if we are called with a spinlock held. + * Since this is only used for assertions, it's OK to not always + * be able to run it. + */ + + if (!rwlock_rlock_try(&pm->lock)) + return; + } else { + rwlock_rlock(&pm->lock); + } vmf = pmap_lookup(vmm_pmap(), base, NULL); @@ -2019,47 +2470,110 @@ g_assert(vmf->type == type); - mutex_release(&pm->lock); + rwlock_runlock(&pm->lock); +} + +/** + * Is pointer within the stack? + * + * If the ``top'' parameter is NULL, then the current stack pointer will be + * used as the "upper" bound. + * + * @param p the pointer we wish to check + * @param top "top" stack pointer, or NULL if unknown + * + * @return whether the pointer is within the bottom and the top of the stack. + */ +bool +vmm_is_stack_pointer(const void *p, const void *top) +{ + int sp; + + if G_UNLIKELY(0 == sp_direction) + init_stack_shape(); + + if (!thread_is_single()) + return thread_is_stack_pointer(p, top, NULL); + + if (NULL == top) + top = &sp; + + if (sp_direction < 0) { + /* Stack growing down, stack_base is its highest address */ + g_assert(ptr_cmp(stack_base, &sp) > 0); + return ptr_cmp(p, top) >= 0 && ptr_cmp(p, stack_base) < 0; + } else { + /* Stack growing up, stack_base is its lowest address */ + g_assert(ptr_cmp(stack_base, &sp) < 0); + return ptr_cmp(p, top) <= 0 && ptr_cmp(p, stack_base) >= 0; + } } /** * Is pointer a valid native VMM one? */ -gboolean +bool vmm_is_native_pointer(const void *p) { struct vm_fragment *vmf; - gboolean native; + bool native; struct pmap *pm = vmm_pmap(); - mutex_get(&pm->lock); + rwlock_rlock(&pm->lock); vmf = pmap_lookup(pm, page_start(p), NULL); native = vmf != NULL && VMF_NATIVE == vmf->type; - mutex_release(&pm->lock); + rwlock_runlock(&pm->lock); return native; } /** + * Is region starting at ``p'' and of ``n'' pages a virtual memory + * extremity, i.e. at the beginning or end of an allocated region? + */ +static bool +vmm_is_extremity(const void *p, size_t n) +{ + struct pmap *pm = vmm_pmap(); + bool is_extremity; + + g_assert(p != NULL); + g_assert(size_is_positive(n)); + + rwlock_rlock(&pm->lock); + is_extremity = pmap_is_extremity(pm, p, n); + rwlock_runlock(&pm->lock); + + return is_extremity; +} + +/** * Is region starting at ``base'' and of ``size'' bytes a virtual memory * fragment, i.e. a standalone mapping in the middle of the VM space? */ -gboolean +bool vmm_is_fragment(const void *base, size_t size) { + struct pmap *pm = vmm_pmap(); + bool is_fragment; + g_assert(base != NULL); g_assert(size_is_positive(size)); - return pmap_is_fragment(vmm_pmap(), base, pagecount_fast(size)); + rwlock_rlock(&pm->lock); + is_fragment = pmap_is_fragment(pm, base, pagecount_fast(size)); + rwlock_runlock(&pm->lock); + + return is_fragment; } /** * Is region starting at ``base'' and of ``size'' bytes a relocatable memory * region moveable at a better VM address? */ -gboolean +bool vmm_is_relocatable(const void *base, size_t size) { const void *hole; @@ -2071,7 +2585,7 @@ /* * Look for a hole better placed in the VM space. */ - + hole = NULL; len = vmm_first_hole(&hole, FALSE); @@ -2103,10 +2617,9 @@ struct vm_fragment *vmf; size_t idx; + assert_rwlock_is_owned(&pm->lock); g_assert(round_pagesize_fast(size) == size); - mutex_get(&pm->lock); - vmf = pmap_lookup(pm, p, NULL); g_assert(vmf != NULL); /* Must be found */ @@ -2115,14 +2628,7 @@ idx = vmf - pm->array; g_assert(size_is_non_negative(idx) && idx < pm->count); - pm->count--; - - if (idx != pm->count) { - memmove(&pm->arrayidx, &pm->arrayidx + 1, - (pm->count - idx) * sizeof pm->array0); - } - - mutex_release(&pm->lock); + pmap_drop(pm, idx); } /** @@ -2133,9 +2639,9 @@ { struct vm_fragment *vmf; - g_assert(round_pagesize_fast(size) == size); + assert_rwlock_is_owned(&pm->lock); - mutex_get(&pm->lock); + g_assert(round_pagesize_fast(size) == size); vmf = pmap_lookup(pm, p, NULL); @@ -2143,12 +2649,14 @@ const void *end = const_ptr_add_offset(p, size); const void *vend = vmf->end; - g_assert(vmf_size(vmf) >= size); + g_assert_log(vmf_size(vmf) >= size, + "vmf={%s} vmf_size=%'zu size=%'zu", + vmf_to_string(vmf), vmf_size(vmf), size); if (p == vmf->start) { if (vmm_debugging(2)) { - s_debug("VMM %s %zuKiB region at %p was %s fragment", + s_minidbg("VMM %s %'zuKiB region at %p was %s fragment", vmf_type_str(vmf->type), size / 1024, p, end == vend ? "a whole" : "start of a"); } @@ -2169,7 +2677,7 @@ if (end != vend) { if (vmm_debugging(1)) { - s_debug("VMM freeing %s %zuKiB region at %p " + s_minidbg("VMM freeing %s %'zuKiB region at %p " "fragments VM space", vmf_type_str(vmf->type), size / 1024, p); } @@ -2178,12 +2686,10 @@ } } else { if (vmm_debugging(0)) { - s_warning("VMM %zuKiB region at %p missing from pmap", + s_minicarp("VMM %'zuKiB region at %p missing from pmap", size / 1024, p); } } - - mutex_release(&pm->lock); } /** @@ -2197,6 +2703,8 @@ const void *end = const_ptr_add_offset(p, size); const void *vend; + assert_rwlock_is_owned(&pm->lock); + g_assert(vmf != NULL); g_assert(size_is_positive(size)); g_assert(round_pagesize_fast(size) == size); @@ -2209,7 +2717,7 @@ g_assert(ptr_cmp(end, vend) <= 0); if (vmm_debugging(0)) { - s_warning("VMM forgetting %s %zuKiB region at %p in pmap", + s_miniwarn("VMM forgetting %s %'zuKiB region at %p in pmap", vmf_type_str(vmf->type), size / 1024, p); } @@ -2225,8 +2733,41 @@ vmf->mtime = tm_time(); if (end != vend) { - /* Insert trailing part back as a region of the same type */ - pmap_insert_region(pm, end, ptr_diff(vend, end), vmf->type); + /* + * Insert trailing part back as a region of the same type. + * + * CAUTION: + * We may be in a situation where we are extending the pmap + * from pmap_extend() and, while allocating the new pages for + * the new pmap, we have to call pmap_overrule(), and here we + * come, attempting to remove a foreign maping, partially. + * + * If the pmap is being extended, it means it is full and we + * do not want to insert a new region: we can't anyway. + * When that region is a foreign mapping, we can simply drop it, + * as this information is intuited and could be stale. + * --RAM, 2015-09-27 + */ + + if G_LIKELY(!pm->extending) { + /* Normal case */ + pmap_insert_region(pm, end, ptr_diff(vend, end), vmf->type); + } else if (vmf_is_foreign(vmf)) { + /* Exceptional: pamp is full, dropping foreign region */ + if (vmm_debugging(0)) { + s_message("VMM forgetting %s: pmap is full and extending", + vmf_to_string(vmf)); + } + VMM_STATS_INCX(pmap_dropped); + } else { + /* Error case, MUST NOT happen, but if it does... */ + s_warning("cannot remove from %s VM fragment while " + "pmap is extending (count=%'zu, size=%'zu)", + vmf_type_str(vmf->type), pm->count, pm->size); + s_error_from(_WHERE_, "extending pmap and attempting to " + "remove %'zu bytes at %p from %s", + size, p, vmf_to_string(vmf)); + } } } } @@ -2242,7 +2783,7 @@ const void *base = p; size_t remain = size; - mutex_get(&pm->lock); + assert_rwlock_is_owned(&pm->lock); while (size_is_positive(remain)) { size_t idx; @@ -2262,15 +2803,13 @@ vmf = &pm->arrayidx; - if (ptr_cmp(end, vmf->start) <= 0) { - mutex_release(&pm->lock); + if (ptr_cmp(end, vmf->start) <= 0) return; /* Next region starts after our target */ - } /* We have an overlap with region in ``vmf'' */ g_assert_log(vmf_is_foreign(vmf), - "vmf={%s}, base=%p, remain=%zu", + "vmf={%s}, base=%p, remain=%'zu", vmf_to_string(vmf), base, remain); gap = ptr_diff(vmf->start, base); @@ -2287,10 +2826,10 @@ * We have to remove ``remain'' bytes starting at ``base''. */ - vmm_stats.pmap_overruled++; + VMM_STATS_INCX(pmap_overruled); len = ptr_diff(vmf->end, base); /* From base to end of region */ - g_assert_log(size_is_positive(len), "len = %zu", len); + g_assert_log(size_is_positive(len), "len = %'zu", len); /* * When attempting an mmap() operation, we can safely overlap @@ -2299,7 +2838,7 @@ */ g_assert_log(VMF_MAPPED == type || vmf_is_foreign(vmf), - "vmf={%s}, base=%p, len=%zu, remain=%zu", + "vmf={%s}, base=%p, len=%'zu, remain=%'zu", vmf_to_string(vmf), base, len, remain); g_assert(!vmf_is_native(vmf)); /* Never overrule allocated memory */ @@ -2313,8 +2852,6 @@ break; } } - - mutex_release(&pm->lock); } /** @@ -2322,30 +2859,69 @@ * update our pmap. */ static void -free_pages_forced(void *p, size_t size, gboolean fragment) +free_pages_forced(void *p, size_t size) { - if (vmm_debugging(fragment ? 2 : 5)) { - s_debug("VMM freeing %zuKiB region at %p%s", - size / 1024, p, fragment ? " (fragment)" : ""); + struct pmap *pm = vmm_pmap(); + + if (vmm_debugging(5)) { + s_minidbg("VMM freeing %'zuKiB region at %p", size / 1024, p); } + rwlock_wlock(&pm->lock); + pmap_remove(pm, p, size); + rwlock_wunlock(&pm->lock); + /* - * Do not let free_pages_intern() update our pmap, as we are about to - * do it ourselves. + * Because the pmap has already been updated, we can release the page + * without holding any lock. */ free_pages_intern(p, size, FALSE); +} + +/** + * Free array of pages, each entry being a region of the given size, + * updating our pmap as we go. + * + * @param vec the vector of pages to free + * @param vnct the amount of pages in the vector + * @param size size of regions in the vector (same size for all entries) + */ +static void +free_pages_vector(void *vec, size_t vcnt, size_t size) +{ + struct pmap *pm = vmm_pmap(); + size_t i; + + if (vmm_debugging(5)) { + for (i = 0; i < vcnt; i++) { + s_minidbg("VMM freeing %'zuKiB region at %p", size / 1024, veci); + } + } + + rwlock_wlock(&pm->lock); + + for (i = 0; i < vcnt; i++) { + pmap_remove(pm, veci, size); + } /* - * If we're freeing a fragment, we can remove it from the list of known - * regions, since we already know it is a standalone region. + * Because the pmap has already been updated, we can release all the + * pages without holding the write lock. + * + * We downgrade to a read lock though to prevent another allocator for + * trying to allocate from the regions we removed in the pmap, when the + * corresponding pages are still held in the process. + * --RAM, 2015-04-06 */ - if (fragment) { - pmap_remove_whole_region(vmm_pmap(), p, size); - } else { - pmap_remove(vmm_pmap(), p, size); + rwlock_downgrade(&pm->lock); + + for (i = 0; i < vcnt; i++) { + free_pages_intern(veci, size, FALSE); } + + rwlock_runlock(&pm->lock); } /** @@ -2360,36 +2936,64 @@ static size_t vpc_lookup(const struct page_cache *pc, const char *p, size_t *low_ptr) { - size_t low = 0, high = pc->current - 1; - size_t mid; + const struct page_info + *low = &pc->info0, + *high = &pc->infopc->current - 1, + *mid; + + if G_UNLIKELY(0 == pc->current) { + if (low_ptr != NULL) + *low_ptr = 0; + return -1; + } + + /* Optimize if have more than 4 items */ + + if G_LIKELY(pc->current > 4) { + const char *q = low->base; + + if G_UNLIKELY(q == p) + return 0; + if (p < q) { + if (low_ptr != NULL) + *low_ptr = 0; + return -1; + } + low++; /* We already checked item 0 */ + + q = high->base; + if G_UNLIKELY(q == p) + return pc->current - 1; + if (p > q) { + if (low_ptr != NULL) + *low_ptr = pc->current; + return -1; + } + high--; /* We already checked last item */ + } /* Binary search */ for (;;) { - const char *item; - - if (low > high || high > SIZE_MAX / 2) { - mid = -1; /* Not found */ + if G_UNLIKELY(low > high) { + mid = NULL; /* Not found */ break; } mid = low + (high - low) / 2; - g_assert(mid < pc->current); - - item = pc->infomid.base; - if (p > item) + if (p > (char *) mid->base) low = mid + 1; - else if (p < item) - high = mid - 1; + else if (p < (char *) mid->base) + high = mid - 1; /* -1 OK since pointers cannot reach page 0 */ else break; /* Found */ } if (low_ptr != NULL) - *low_ptr = low; + *low_ptr = low - &pc->info0; - return mid; + return NULL == mid ? (size_t) -1 : (size_t) (mid - &pc->info0); } /** @@ -2401,7 +3005,7 @@ { g_assert(size_is_non_negative(idx) && idx < pc->current); g_assert(p == pc->infoidx.base); - assert_vmm_is_allocated(p, pc->chunksize, VMF_NATIVE); + assert_vmm_is_allocated(p, pc->chunksize, VMF_NATIVE, TRUE); g_assert(size_is_positive(pc->current)); g_assert(spinlock_is_held(&pc->lock)); @@ -2410,11 +3014,7 @@ * last item was removed. */ - pc->current--; - if (idx < pc->current) { - memmove(&pc->infoidx, &pc->infoidx + 1, - (pc->current - idx) * sizeof(pc->info0)); - } + ARRAY_REMOVE_DEC(pc->info, idx, pc->current); } /** @@ -2433,22 +3033,6 @@ } /** - * Free page cached at given index in cache line. - */ -static void -vpc_free(struct page_cache *pc, size_t idx) -{ - void *p; - - g_assert(size_is_non_negative(idx) && idx < pc->current); - g_assert(spinlock_is_held(&pc->lock)); - - p = pc->infoidx.base; - vpc_remove_at(pc, p, idx); - free_pages_forced(p, pc->chunksize, FALSE); -} - -/** * Insert entry within a cache line, coalescing consecutive entries in * higher-order cache lines, recursively. * @@ -2464,18 +3048,21 @@ size_t idx; void *base = p; size_t pages = pc->pages; + void *evicted = NULL; g_assert(size_is_non_negative(pc->current) && pc->current <= VMM_CACHE_SIZE); + assert_vmm_is_allocated(p, pc->chunksize, VMF_NATIVE, FALSE); spinlock(&pc->lock); if G_UNLIKELY((size_t ) -1 != vpc_lookup(pc, p, &idx)) { - s_error_from(_WHERE_, "memory chunk at %p already present in cache", p); + s_error_from(_WHERE_, + "memory chunk at %p already present in %'zu page-long VMM cache", + p, pc->pages); } g_assert(size_is_non_negative(idx) && idx <= pc->current); - assert_vmm_is_allocated(p, pc->chunksize, VMF_NATIVE); /* * If we're inserting in the highest-order cache, there's no need @@ -2496,7 +3083,7 @@ if G_UNLIKELY(bend == p) { if (vmm_debugging(6)) { - s_debug("VMM page cache #%zu: " + s_minidbg("VMM page cache #%zu: " "coalescing previous %p, %p with %p, %p", pc->pages - 1, before, ptr_add_offset(bend, -1), p, ptr_add_offset(p, pc->chunksize - 1)); @@ -2519,7 +3106,7 @@ if G_UNLIKELY(next == end) { if (vmm_debugging(6)) { - s_debug("VMM page cache #%zu: " + s_minidbg("VMM page cache #%zu: " "coalescing %p, %p with next %p, %p", pc->pages - 1, base, ptr_add_offset(end, -1), next, ptr_add_offset(next, pc->chunksize - 1)); @@ -2536,8 +3123,8 @@ if G_UNLIKELY(pages != pc->pages) { if (vmm_debugging(2)) { - s_debug("VMM coalesced %zuKiB region %p, %p into " - "%zuKiB region %p, %p (recursing)", + s_minidbg("VMM coalesced %'zuKiB region %p, %p into " + "%'zuKiB region %p, %p (recursing)", pc->chunksize / 1024, p, ptr_add_offset(p, pc->chunksize - 1), pages * kernel_pagesize / 1024, @@ -2545,7 +3132,7 @@ } spinunlock(&pc->lock); page_cache_insert_pages(base, pages); - vmm_stats.cache_line_coalescing++; + VMM_STATS_INCX(cache_line_coalescing); return; } @@ -2557,16 +3144,32 @@ if G_UNLIKELY(VMM_CACHE_SIZE == pc->current) { size_t kidx = kernel_mapaddr_increasing ? VMM_CACHE_SIZE - 1 : 0; + + evicted = pc->infokidx.base; + if (vmm_debugging(4)) { - void *lbase = pc->infokidx.base; - s_debug("VMM page cache #%zu: kicking out %p, %p %zuKiB", - pc->pages - 1, lbase, ptr_add_offset(lbase, pc->chunksize - 1), + s_minidbg("VMM page cache #%zu: kicking out %p, %p %'zuKiB", + pc->pages - 1, evicted, + ptr_add_offset(evicted, pc->chunksize - 1), pc->chunksize / 1024); } - vpc_free(pc, kidx); + + /* + * Can't call vpc_free() here because we already hold the spinlock + * and vpc_free() will need to call free_pages_forced() which will + * then grab a mutex. This is a recipe for deadlocks. + * + * Hence we memorize the address to free and will do that at the + * end when we have released the spinlock. + */ + + vpc_remove_at(pc, evicted, kidx); + if (idx > kidx) idx--; - vmm_stats.cache_evictions++; + + VMM_STATS_INCX(cache_evictions); + pc->evicted++; } g_assert(size_is_non_negative(pc->current) && pc->current < VMM_CACHE_SIZE); @@ -2576,23 +3179,28 @@ * Shift items up if we're not inserting at the last position in the array. */ - if G_LIKELY(idx < pc->current) { - memmove(&pc->infoidx + 1, &pc->infoidx, - (pc->current - idx) * sizeof(pc->info0)); - } + ARRAY_FIXED_MAKEROOM(pc->info, idx, pc->current); pc->current++; pc->infoidx.base = base; pc->infoidx.stamp = tm_time(); if (vmm_debugging(4)) { - s_debug("VMM page cache #%zu: inserted %p, %p %zuKiB, " - "now holds %zu item%s", + s_minidbg("VMM page cache #%zu: inserted %p, %p %'zuKiB, " + "now holds %'zu item%s", pc->pages - 1, base, ptr_add_offset(base, pc->chunksize - 1), - pc->chunksize / 1024, pc->current, 1 == pc->current ? "" : "s"); + pc->chunksize / 1024, pc->current, plural(pc->current)); } spinunlock(&pc->lock); + + /* + * Free the page we evicted now that we have released the spinlock. + */ + + if G_UNLIKELY(evicted != NULL) { + free_pages_forced(evicted, pc->chunksize); + } } /** @@ -2602,10 +3210,10 @@ static inline int vmm_ptr_cmp(const void *a, const void *b) { - if (a == b) + if G_UNLIKELY(a == b) return 0; - return (kernel_mapaddr_increasing ? +1 : -1) * ptr_cmp(a, b); + return kernel_mapaddr_increasing ? ptr_cmp(a, b) : ptr_cmp(b, a); } /** @@ -2625,12 +3233,10 @@ spinlock(&pc->lock); - if (0 == pc->current) + if G_UNLIKELY(0 == pc->current) /* Tested by caller (without the lock) */ goto not_found; if (n > pc->pages) { - size_t i; - /* * Since we're looking for more pages than what this cache line stores, * we'll have to coalesce the page with neighbouring chunks, which @@ -2638,38 +3244,24 @@ * cache. */ - for (i = 0; i < pc->current; i++) { - base = kernel_mapaddr_increasing ? - pc->infoi.base : pc->infopc->current - 1 - i.base; + g_assert(VMM_CACHE_LINES == pc->pages); /* Highest-order line */ - /* - * We stop considering pages that are further away than the - * identified hole. Since we traverse the cache line in the - * proper order, from "lower" addresses to "upper" ones, we can - * abort as soon as we've gone beyond the hole. - */ + base = kernel_mapaddr_increasing ? + pc->info0.base : pc->infopc->current - 1.base; - if (hole != NULL && vmm_ptr_cmp(base, hole) > 0) { - if (vmm_debugging(7)) { - s_debug("VMM page cache #%zu: stopping lookup attempt " - "for %zu page%s at %p (upper than hole %p)", - pc->pages - 1, n, 1 == n ? "" : "s", base, hole); - } - break; - } - - goto selected; - } - - goto not_found; /* Cache line was empty */ + goto selected; } else { size_t i; size_t max_distance = 0; + base = NULL; + if (n == pc->pages) + pc->targeted++; + /* - * We're looking for less consecutive pages than what this cache - * line holds, which will require splitting of the entry. + * When we're looking for less consecutive pages than what this cache + * line holds, it will require splitting of the entry. * * Allocate the innermost pages within the region, so that pages at * the beginning or end of the region remain unused and can be @@ -2684,30 +3276,42 @@ pc->infoi.base : pc->infopc->current - 1 - i.base; /* - * Stop considering pages that are further away from the - * identified hole. + * We stop considering pages that are further away than the + * identified hole. Since we traverse the cache line in the + * proper order, from "lower" addresses to "upper" ones, we can + * abort as soon as we've gone beyond the hole. */ if (hole != NULL && vmm_ptr_cmp(p, hole) > 0) { if (vmm_debugging(7)) { - s_debug("VMM page cache #%zu: " - "stopping lookup for %zu page%s at %p " - "(upper than hole %p)", - pc->pages - 1, n, 1 == n ? "" : "s", p, hole); + s_minidbg("VMM page cache #%zu: " + "%s lookup for %'zu page%s at %p " + "(upper than hole %p, ignoring %'zu cached entr%s)", + pc->pages - 1, i == 0 ? "ignoring" : "stopping", + n, plural(n), p, hole, + pc->current - i, plural(pc->current - i)); + } + if (0 == i) { + /* Did not consider any of the pages in that line */ + VMM_STATS_INCX(cache_ignored); + pc->denied++; } break; } - d = pmap_nesting_within_region(vmm_pmap(), p, pc->chunksize); + d = 1 + pmap_nesting_within_region(vmm_pmap(), p, pc->chunksize); if (d > max_distance) { max_distance = d; - base = deconstify_gpointer(p); + base = deconstify_pointer(p); } } if (NULL == base) goto not_found; /* Cache line was empty */ + if (n == pc->pages) + VMM_STATS_INCX(cache_exact_match); + /* FALL THROUGH */ } @@ -2731,6 +3335,15 @@ if (1 == pc->current) goto not_found; /* No other entries to coalesce with */ + /* + * Coalescing in the highest-order cache line does not take into + * account the first VM hole: we give priority to coalescing these + * large ranges, since it is more useful than attempting to allocate + * from the hole: the pages are already allocated, the range is large, + * we avoid letting the kernel re-install all these mappings for us if + * we can satisfy the allocation via coalescing. + */ + if (kernel_mapaddr_increasing) { for (i = 1; i < pc->current; i++) { void *start = pc->infoi.base; @@ -2741,17 +3354,6 @@ if (total >= n) goto found; } else { - if (hole != NULL && vmm_ptr_cmp(start, hole) > 0) { - if (vmm_debugging(7)) { - s_debug("VMM cache #%zu: stopping merge for " - "%zu page%s (had %zu already) at %p " - "(upper than hole %p)", - pc->pages - 1, n, 1 == n ? "" : "s", - total, start, hole); - } - break; - } - /* * No luck coalescing what we had so far with the next * entry. Restart the coalescing process from this @@ -2774,17 +3376,6 @@ if (total >= n) goto found; } else { - if (hole != NULL && vmm_ptr_cmp(prev_base, hole) > 0) { - if (vmm_debugging(7)) { - s_debug("VMM cache #%zu: stopping merge for " - "%zu page%s (had %zu already) at %p " - "(upper than hole %p)", - pc->pages - 1, n, 1 == n ? "" : "s", - total, prev_base, hole); - } - break; - } - /* * No luck coalescing what we had so far with the next * entry. Restart the coalescing process from this @@ -2829,10 +3420,10 @@ if (total > n) { if (kernel_mapaddr_increasing) { - void *start = ptr_add_offset(base, n * kernel_pagesize); + void *start = ptr_add_offset(base, nsize_fast(n)); page_cache_insert_pages(start, total - n); /* Strip trailing */ } else { - void *start = ptr_add_offset(end, -n * kernel_pagesize); + void *start = ptr_add_offset(end, nsize_fast(-n)); page_cache_insert_pages(base, total - n); /* Strip leading */ base = start; } @@ -2849,37 +3440,79 @@ * Find "n" consecutive pages in the page cache, and remove them if found. * * @param n number of pages we want - * @param hole_ptr variable where first hole we found is written to + * @param user_mem whether we're allocating user memory (as opposed to core) + * @param emergency whether we need to find pages from the cache at all costs * * @return a pointer to the start of the memory region, NULL if we were - * unable to find that amount of contiguous memory. In any case, ``hole_ptr'' - * is written with the first suitable hole we identified in the VM space. + * unable to find that amount of contiguous memory. */ static void * -page_cache_find_pages(size_t n, const void **hole_ptr) +page_cache_find_pages(size_t n, bool user_mem, bool emergency) { void *p; size_t len; - const void *hole; + const void *hole = NULL; + struct vm_upper_hole upper; struct page_cache *pc = NULL; + enum vmm_strategy strategy = vmm_strategy; g_assert(size_is_positive(n)); - g_assert(hole_ptr != NULL); /* + * In emergency situations, we're going to act as if we were allocating + * under a short-term strategy, to be able to locate a region from the + * cache, knowing that we're going to end this process soon anyway due + * to memory shortage. + */ + + if G_UNLIKELY(emergency) + strategy = VMM_STRATEGY_SHORT_TERM; + + /* + * When allocating with a short-term strategy, we attempt to reuse the + * cached memory as much as possible. + * + * Likewise for user memory: as opposed to core memory which will likely + * be further fragmented into smaller pieces and therefore less prone to + * ever beeing freed soon, user memory is typically allocated, used and + * freed as a whole. So it's more important to be careful when allocating + * core memory under a long-term strategy: it will most probably be a + * memory region we will not free before a long time, if ever. + */ + + if (user_mem || VMM_STRATEGY_SHORT_TERM == strategy) + goto short_term_strategy; + + /* + * Long-term strategy: + * * Before using pages from the cache, look where the first hole is * at the start of the virtual memory space. If we find one that can * suit this allocation, then do not use cached pages that would * lie after the hole. */ - hole = NULL; len = vmm_first_hole(&hole, TRUE); + /* + * If we know an "upper hole", adjust the first hole address to be that + * one, as it will be more representative of where we are more likely + * to be able to allocate new core. + */ + + VMM_UPPER_HOLE_LOCK; + upper = vmm_upper_hole; /* struct copy */ + VMM_UPPER_HOLE_UNLOCK; + + if (pagecount_fast(upper.len) >= n) { + hole = upper.p; + len = upper.len; + } + if (pagecount_fast(len) < n) { hole = NULL; } else if (!kernel_mapaddr_increasing) { - size_t length = size_saturate_mult(n, kernel_pagesize); + size_t length = nsize_fast(n); g_assert((size_t) -1 != length); g_assert(ptr_diff(hole, NULL) > length); @@ -2890,12 +3523,15 @@ if G_UNLIKELY(hole != NULL) { if (vmm_debugging(8)) { size_t np = pagecount_fast(len); - s_debug("VMM lowest hole of %zu page%s at %p (%zu page%s)", - n, 1 == n ? "" : "s", hole, np, 1 == np ? "" : "s"); + s_minidbg("VMM %s hole of %'zu page%s at %p (%'zu page%s)", + hole == upper.p ? "upper" : "lowest", + n, plural(n), hole, np, plural(np)); } } - *hole_ptr = hole; + /* FALL THROUGH */ + +short_term_strategy: if (n >= VMM_CACHE_LINES) { /* @@ -2904,55 +3540,106 @@ */ pc = &page_cacheVMM_CACHE_LINES - 1; - p = vpc_find_pages(pc, n, hole); - - /* - * Count when we coalesce large blocks from the higher cache line. - */ + p = pc->current != 0 ? vpc_find_pages(pc, n, hole) : NULL; - if (p != NULL && n > VMM_CACHE_LINES) - vmm_stats.high_order_coalescing++; + if (n > VMM_CACHE_LINES) { + if (p != NULL) { + /* Coalesced large blocks from the higher cache line */ + VMM_STATS_INCX(cache_high_coalescing); + } else { + /* Request was too large for the cache */ + VMM_STATS_INCX(cache_too_large); + } + } if (vmm_debugging(3)) { - s_debug("VMM lookup for large area (%zu pages) returned %p", n, p); + s_minidbg("VMM lookup for large area (%'zu pages) returned %p", + n, p); } } else { + bool single_page = user_mem || VMM_STRATEGY_SHORT_TERM == strategy; + /* * Start looking for a suitable page in the page cache matching * the size we want. */ pc = &page_cachen - 1; - p = vpc_find_pages(pc, n, hole); + p = pc->current != 0 ? vpc_find_pages(pc, n, hole) : NULL; /* * Visit higher-order cache lines if we found nothing in the cache. * + * Short-term strategy or user memory: + * If we have data in our cache, reuse it, even for a single page. + * + * Long-term strategy: * To avoid VM space fragmentation, we never split a larger region * to allocate just one page. This policy allows us to fill the holes - * that can be created and avoid undoing the coalescing we may have + * that can be created and avoids undoing the coalescing we may have * achieved so far in higher-order caches. */ - if (NULL == p && n > 1) { + if (NULL == p && (single_page || n > 1)) { size_t i; + bool aggressive = FALSE; + try_harder: for (i = n; i < VMM_CACHE_LINES && NULL == p; i++) { pc = &page_cachei; + + if (0 == pc->current) + continue; + + /* + * If splitting the page would put the remaining pages into + * a full cache line, then avoid allocation from the current + * cache line unless we're being aggressive. + */ + + { + size_t r = i - n + 1; /* pc->pages == i + 1 */ + struct page_cache *rpc = &page_cacher - 1; + + if G_UNLIKELY(VMM_CACHE_SIZE == rpc->current && !aggressive) + continue; /* Remaining pages going to full cache */ + } + p = vpc_find_pages(pc, n, hole); } + + if G_LIKELY(p != NULL) { + VMM_STATS_INCX(cache_splits); + } else { + /* + * In emergency situations, we need to retry the above lookups, + * accepting to split regions even if they end-up falling into + * a full cache line. + */ + + if (emergency && !aggressive) { + aggressive = TRUE; + goto try_harder; + } + } } - } - if (p != NULL) { - if (vmm_debugging(5)) { - s_debug("VMM found %zuKiB region at %p in cache #%zu%s", - n * kernel_pagesize / 1024, p, pc->pages - 1, - pc->pages == n ? "" : - n > VMM_CACHE_LINES ? " (merged)" : " (split)"); + if (p != NULL) { + spinlock_hidden(&pc->lock); + pc->allocated++; + if (n != pc->pages) + pc->split++; + spinunlock_hidden(&pc->lock); } } + if (vmm_debugging(5) && p != NULL) { + s_minidbg("VMM found %'zuKiB region at %p in cache #%zu%s", + n * kernel_pagesize / 1024, p, pc->pages - 1, + pc->pages == n ? "" : + n > VMM_CACHE_LINES ? " (merged)" : " (split)"); + } + return p; } @@ -2964,27 +3651,97 @@ * * @return TRUE if pages were cached, FALSE if they were forcefully freed. */ -static gboolean +static bool page_cache_insert_pages(void *base, size_t n) { size_t pages = n; void *p = base; + struct pmap *pm = vmm_pmap(); + bool wlock = FALSE; + + assert_vmm_is_allocated(base, nsize_fast(n), VMF_NATIVE, FALSE); + + if G_UNLIKELY(stop_freeing) + return FALSE; - assert_vmm_is_allocated(base, n * kernel_pagesize, VMF_NATIVE); + /* + * With a short-term allocation strategy, keep allocated memory around + * by always caching the pages, as long as we have room in our cache. + */ + + if (VMM_STRATEGY_SHORT_TERM == vmm_strategy) + goto short_term_strategy; /* - * Identified memory fragments are immediately freed and not put - * back into the cache, in order to reduce fragmentation of the - * memory space. + * Identified region extremities (which includes standalone fragments) + * are immediately freed and not put back into the cache, in order to + * reduce fragmentation of the memory space and maximize the size of + * free space. + * + * Start with a read lock on the pmap, which only needs to be upgraded + * to a write lock if the area ends up being an extremity. */ - if (pmap_is_fragment(vmm_pmap(), base, n)) { - free_pages_forced(base, n * kernel_pagesize, TRUE); + rwlock_rlock(&pm->lock); + +retry: + if G_UNLIKELY(pmap_is_extremity(pm, base, n)) { + /* + * Upgrade to write lock. + * + * If we cannot atomically upgrade, we need to release the read lock + * and re-acquire the write lock, after which we need to retry the + * evaluation to see whether the pages are still an extremity. + */ + + if (!wlock) { + if (rwlock_upgrade(&pm->lock)) { + wlock = TRUE; + } else { + rwlock_runlock(&pm->lock); + rwlock_wlock(&pm->lock); + wlock = TRUE; + goto retry; + } + } + + /* + * We have the write lock. + */ + + pmap_remove(pm, base, nsize_fast(n)); + + /* + * We do not need a write lock to free the pages, and it's best to + * not keep it since we're about to issue a system call, most likely. + */ + + rwlock_wunlock(&pm->lock); + + if (vmm_debugging(2)) { + s_minidbg("VMM freeing %'zuKiB fragment at %p", + n << (kernel_pageshift - 10), base); + } + + free_pages_intern(base, nsize_fast(n), FALSE); + + VMM_STATS_LOCK; vmm_stats.forced_freed++; vmm_stats.forced_freed_pages += n; + VMM_STATS_UNLOCK; + return FALSE; } + if G_UNLIKELY(wlock) + rwlock_wunlock(&pm->lock); + else + rwlock_runlock(&pm->lock); + + /* FALL THROUGH */ + +short_term_strategy: + /* * If releasing more than what we can store in the largest cache line, * break up the region into smaller chunks. @@ -3014,7 +3771,7 @@ * * @return TRUE if coalescing occurred, with updated base and amount of pages. */ -static gboolean +static bool G_HOT page_cache_coalesce_pages(void **base_ptr, size_t *pages_ptr) { size_t i, j; @@ -3023,19 +3780,19 @@ const size_t old_pages = pages; void *end; - assert_vmm_is_allocated(base, pages * kernel_pagesize, VMF_NATIVE); + assert_vmm_is_allocated(base, nsize_fast(pages), VMF_NATIVE, FALSE); - if (pages >= VMM_CACHE_LINES) + if G_UNLIKELY(stop_freeing) return FALSE; - end = ptr_add_offset(base, pages * kernel_pagesize); + end = ptr_add_offset(base, nsize_fast(pages)); /* * Look in low-order caches whether we can find chunks before. */ for (i = 0; /* empty */; i++) { - gboolean coalesced = FALSE; + bool coalesced = FALSE; j = MIN(old_pages, VMM_CACHE_LINES) - 1; while (j-- > 0) { @@ -3043,9 +3800,12 @@ void *before; size_t loidx; + if (0 == lopc->current) + continue; + spinlock(&lopc->lock); - if (0 == lopc->current) { + if G_UNLIKELY(0 == lopc->current) { spinunlock(&lopc->lock); continue; } @@ -3055,21 +3815,21 @@ if G_UNLIKELY(loidx != (size_t) -1) { if (vmm_debugging(6)) { - s_debug("VMM iter #%zu, coalescing previous " + s_minidbg("VMM iter #%zu, coalescing previous " "%p, %p from lower cache #%zu with %p, %p", i, before, ptr_add_offset(base, -1), lopc->pages - 1, base, ptr_add_offset(base, pages * kernel_pagesize - 1)); } - assert_vmm_is_allocated(before, - (pages + lopc->pages) * kernel_pagesize, VMF_NATIVE); + vpc_remove_at(lopc, before, loidx); + spinunlock(&lopc->lock); base = before; pages += lopc->pages; - vpc_remove_at(lopc, before, loidx); + + assert_vmm_is_allocated(before, + nsize_fast(pages), VMF_NATIVE, FALSE); + coalesced = TRUE; - spinunlock(&lopc->lock); - if (pages >= VMM_CACHE_LINES) - goto done; } else { spinunlock(&lopc->lock); } @@ -3091,9 +3851,12 @@ void *before; size_t hoidx; + if (0 == hopc->current) + continue; + spinlock(&hopc->lock); - if (0 == hopc->current) { + if G_UNLIKELY(0 == hopc->current) { spinunlock(&hopc->lock); continue; } @@ -3103,19 +3866,18 @@ if G_UNLIKELY(hoidx != (size_t) -1) { if (vmm_debugging(6)) { - s_debug("VMM coalescing previous %p, %p " + s_minidbg("VMM coalescing previous %p, %p " "from higher cache #%zu with %p, %p", before, ptr_add_offset(base, -1), hopc->pages - 1, base, ptr_add_offset(base, pages * kernel_pagesize - 1)); } - assert_vmm_is_allocated(before, - (pages + hopc->pages) * kernel_pagesize, VMF_NATIVE); - base = before; - pages += hopc->pages; vpc_remove_at(hopc, before, hoidx); spinunlock(&hopc->lock); - if (pages >= VMM_CACHE_LINES) - goto done; + base = before; + pages += hopc->pages; + + assert_vmm_is_allocated(before, + nsize_fast(pages), VMF_NATIVE, FALSE); } else { spinunlock(&hopc->lock); } @@ -3125,19 +3887,22 @@ * Look in low-order caches whether we can find chunks after. */ - g_assert(ptr_add_offset(base, pages * kernel_pagesize) == end); + g_assert(ptr_add_offset(base, nsize_fast(pages)) == end); for (i = 0; /* empty */; i++) { - gboolean coalesced = FALSE; + bool coalesced = FALSE; j = MIN(old_pages, VMM_CACHE_LINES) - 1; while (j-- > 0) { struct page_cache *lopc = &page_cachej; size_t loidx; + if (0 == lopc->current) + continue; + spinlock(&lopc->lock); - if (0 == lopc->current) { + if G_UNLIKELY(0 == lopc->current) { spinunlock(&lopc->lock); continue; } @@ -3146,20 +3911,20 @@ if G_UNLIKELY(loidx != (size_t) -1) { if (vmm_debugging(6)) { - s_debug("VMM iter #%zu, coalescing next %p, %p " + s_minidbg("VMM iter #%zu, coalescing next %p, %p " "from lower cache #%zu with %p, %p", i, end, ptr_add_offset(end, lopc->chunksize - 1), lopc->pages - 1, base, ptr_add_offset(end, -1)); } - assert_vmm_is_allocated(base, - (pages + lopc->pages) * kernel_pagesize, VMF_NATIVE); - pages += lopc->pages; vpc_remove_at(lopc, end, loidx); - end = ptr_add_offset(end, lopc->chunksize); spinunlock(&lopc->lock); + pages += lopc->pages; + end = ptr_add_offset(end, lopc->chunksize); + + assert_vmm_is_allocated(base, + nsize_fast(pages), VMF_NATIVE, FALSE); + coalesced = TRUE; - if (pages >= VMM_CACHE_LINES) - goto done; } else { spinunlock(&lopc->lock); } @@ -3180,9 +3945,12 @@ struct page_cache *hopc = &page_cachej; size_t hoidx; + if (0 == hopc->current) + continue; + spinlock(&hopc->lock); - if (0 == hopc->current) { + if G_UNLIKELY(0 == hopc->current) { spinunlock(&hopc->lock); continue; } @@ -3191,32 +3959,30 @@ if G_UNLIKELY(hoidx != (size_t) -1) { if (vmm_debugging(6)) { - s_debug("VMM coalescing next %p, %p " + s_minidbg("VMM coalescing next %p, %p " "from higher cache #%zu with %p, %p", end, ptr_add_offset(end, hopc->chunksize - 1), hopc->pages - 1, base, ptr_add_offset(end, -1)); } - assert_vmm_is_allocated(base, - (pages + hopc->pages) * kernel_pagesize, VMF_NATIVE); - pages += hopc->pages; vpc_remove_at(hopc, end, hoidx); - end = ptr_add_offset(end, hopc->chunksize); spinunlock(&hopc->lock); - if (pages >= VMM_CACHE_LINES) - goto done; + pages += hopc->pages; + end = ptr_add_offset(end, hopc->chunksize); + + assert_vmm_is_allocated(base, + nsize_fast(pages), VMF_NATIVE, FALSE); } else { spinunlock(&hopc->lock); } } -done: - assert_vmm_is_allocated(base, pages * kernel_pagesize, VMF_NATIVE); - g_assert(ptr_add_offset(base, pages * kernel_pagesize) == end); + assert_vmm_is_allocated(base, nsize_fast(pages), VMF_NATIVE, FALSE); + g_assert(ptr_add_offset(base, nsize_fast(pages)) == end); if G_UNLIKELY(pages != old_pages) { if (vmm_debugging(2)) { - s_debug("VMM coalesced %zuKiB region %p, %p into " - "%zuKiB region %p, %p", + s_minidbg("VMM coalesced %'zuKiB region %p, %p into " + "%'zuKiB region %p, %p", old_pages * kernel_pagesize / 1024, *base_ptr, ptr_add_offset(*base_ptr, old_pages * compat_pagesize() - 1), pages * kernel_pagesize / 1024, @@ -3225,7 +3991,7 @@ *base_ptr = base; *pages_ptr = pages; - vmm_stats.cache_coalescing++; + VMM_STATS_INCX(cache_coalescing); return TRUE; } @@ -3275,35 +4041,40 @@ #endif /* MADV_WILLNEED */ } -static void -vmm_validate_pages(void *p, size_t size) +/** + * Perform memory allocation during crashes. + * + * @param size the size of the region we want to allocate + * @param zero_mem whether to zero the allocated memory + * + * @return the allocated region, NULL on error + */ +static void * +vmm_crashing_alloc(size_t size, bool zero_mem) { - g_assert(p); - g_assert(size_is_positive(size)); -#ifdef VMM_PROTECT_FREE_PAGES - mprotect(p, size, PROT_READ | PROT_WRITE); -#endif /* VMM_PROTECT_FREE_PAGES */ -#ifdef VMM_INVALIDATE_FREE_PAGES - /* This should be unnecessary */ - /* vmm_madvise_normal(p, size); */ -#endif /* VMM_INVALIDATE_FREE_PAGES */ -} + void *p; -static void -vmm_invalidate_pages(void *p, size_t size) -{ - g_assert(p); - g_assert(size_is_positive(size)); + p = vmm_valloc(NULL, size); /* Memory always zeroed by kernel */ - if (G_UNLIKELY(stop_freeing)) - return; + if G_UNLIKELY(MAP_FAILED == p) { + /* + * It's going to be fatal if we return NULL, probably causing + * an immediate termination, so attempt the cache, then the + * emergency VM region if we have one. + */ -#ifdef VMM_PROTECT_FREE_PAGES - mprotect(p, size, PROT_NONE); -#endif /* VMM_PROTECT_FREE_PAGES */ -#ifdef VMM_INVALIDATE_FREE_PAGES - vmm_madvise_free(p, size); -#endif /* VMM_INVALIDATE_FREE_PAGES */ + vmm_oom_condition(); + p = alloc_pages_emergency(size); + if (NULL == p) + p = vmea_alloc(size); + if (NULL == p) + return NULL; + + if G_UNLIKELY(zero_mem) + memset(p, 0, size); + } + + return p; } /** @@ -3317,153 +4088,168 @@ * * @param size size in bytes to allocate; will be rounded to the pagesize. * @param user_mem whether this memory is meant for "user" consumption + * @param zero_mem whether memory needs to be zeroed * * @return pointer to allocated memory region */ static void * -vmm_alloc_internal(size_t size, gboolean user_mem) +vmm_alloc_internal(size_t size, bool user_mem, bool zero_mem) { size_t n; void *p; - const void *hole; - - if G_UNLIKELY(0 == kernel_pagesize) - vmm_init(&n); g_assert(size_is_positive(size)); + if G_UNLIKELY(0 == kernel_pagesize) + vmm_init(); + size = round_pagesize_fast(size); + + if G_UNLIKELY(vmm_crashing) + return vmm_crashing_alloc(size, zero_mem); + + /* + * Loudly warn if attempting to allocate memory from a signal handler. + */ + + if (signal_in_unsafe_handler()) { + VMM_STATS_INCX(allocations_in_handler); + s_minicarp_once("%s(): %s allocating %'zu bytes of %s memory" + " from signal handler", + G_STRFUNC, thread_safe_name(), size, user_mem ? "user" : "core"); + } + n = pagecount_fast(size); - vmm_stats.allocations++; /* * First look in the page cache to avoid requesting a new memory * mapping from the kernel. */ - p = page_cache_find_pages(n, &hole); + p = page_cache_find_pages(n, user_mem, FALSE); if (p != NULL) { vmm_validate_pages(p, size); - assert_vmm_is_allocated(p, size, VMF_NATIVE); + if G_UNLIKELY(zero_mem) + memset(p, 0, size); + assert_vmm_is_allocated(p, size, VMF_NATIVE, FALSE); + + VMM_STATS_LOCK; vmm_stats.alloc_from_cache++; vmm_stats.alloc_from_cache_pages += n; goto update_stats; } - p = alloc_pages(size, TRUE, hole); + /* + * When debugging, spot areas of the code that perform large allocations. + * Each spot is only traced once, the first time we go over the allocation + * threshold. + */ + + if (n > VMM_WARN_THRESH && vmm_debugging(1)) { + vmm_warn_once("%s(): large allocation of %'zu bytes", + G_STRFUNC, size); + } + + /* + * Could not find suitable page in cache, need to allocate more memory. + */ + + p = alloc_pages(size, TRUE); + if (NULL == p) - s_error("cannot allocate %zu bytes: out of virtual memory", size); + goto failed; + + /* Memory allocated by the kernel is already zero-ed */ - assert_vmm_is_allocated(p, size, VMF_NATIVE); + assert_vmm_is_allocated(p, size, VMF_NATIVE, FALSE); + VMM_STATS_LOCK; vmm_stats.alloc_direct_core++; vmm_stats.alloc_direct_core_pages += n; /* FALL THROUGH */ update_stats: + vmm_stats.allocations++; + if G_UNLIKELY(zero_mem) + vmm_stats.allocations_zeroed++; + if (user_mem) { + vmm_stats.allocations_user++; vmm_stats.user_memory += size; vmm_stats.user_pages += n; vmm_stats.user_blocks++; memusage_add(vmm_stats.user_mem, size); } else { + vmm_stats.allocations_core++; vmm_stats.core_memory += size; vmm_stats.core_pages += n; memusage_add(vmm_stats.core_mem, size); } + VMM_STATS_UNLOCK; return p; -} -/** - * Allocates a page-aligned memory chunk, possibly returning a cached region - * and only allocating a new region when necessary. - * - * @param size The size in bytes to allocate; will be rounded to the pagesize. - */ -void * -vmm_alloc(size_t size) -{ - return vmm_alloc_internal(size, TRUE); -} - -/** - * Allocates a page-aligned memory chunk, meant to be use as core for other - * memory allocator built on top of this layer. - * - * This means memory allocated here will NOT be accounted for as "user memory" - * and it MUST be freed with vmm_core_free() for sound accounting. - * - * @param size The size in bytes to allocate; will be rounded to the pagesize. - */ -void * -vmm_core_alloc(size_t size) -{ - return vmm_alloc_internal(size, FALSE); +failed: + crash_oom("%s(): cannot allocate %'zu bytes: out of virtual memory", + G_STRFUNC, size); } /** - * Same a vmm_alloc() but zeroes the allocated region. + * Should we cache ``n'' pages starting at ``p''? */ -void * -vmm_alloc0(size_t size) +static inline bool +vmm_should_cache(const void *p, size_t n) { - size_t n; - void *p; - const void *hole; - - if G_UNLIKELY(0 == kernel_pagesize) - vmm_init(&n); - - g_assert(size_is_positive(size)); - - size = round_pagesize_fast(size); - n = pagecount_fast(size); - vmm_stats.allocations++; - vmm_stats.allocations_zeroed++; - /* - * First look in the page cache to avoid requesting a new memory - * mapping from the kernel. + * Long-term strategy: + * + * Memory regions that are larger than our highest-order cache are + * allocated and freed as-is, and almost never broken into smaller + * pages. The purpose is to avoid excessive virtual memory space + * fragmentation, leading at some point to the unability for the + * kernel to find a large consecutive virtual memory region. + * + * Short-term strategy: + * + * Cache everything, breaking up larger regions. When the largest + * line is full, we'll start evicting memory of course. */ - p = page_cache_find_pages(n, &hole); - if (p != NULL) { - vmm_validate_pages(p, size); - memset(p, 0, size); - assert_vmm_is_allocated(p, size, VMF_NATIVE); - - vmm_stats.alloc_from_cache++; - vmm_stats.alloc_from_cache_pages += n; - goto update_stats; - } - - p = alloc_pages(size, TRUE, hole); - if (NULL == p) - s_error("cannot allocate %zu bytes: out of virtual memory", size); + if (VMM_STRATEGY_SHORT_TERM == vmm_strategy) { + return TRUE; + } else { + size_t len; + const void *hole; - /* Memory allocated by the kernel is already zero-ed */ + /* + * In OOM condition, we attempt to cache every page. + */ - assert_vmm_is_allocated(p, size, VMF_NATIVE); - vmm_stats.alloc_direct_core++; - vmm_stats.alloc_direct_core_pages += n; + if G_UNLIKELY(vmm_oom_detected) + return TRUE; - /* FALL THROUGH */ + /* + * In long-term strategy, attempt to cache memory that lies before + * the first hole, because this is where we want to keep memory + * allocated. + */ -update_stats: + len = vmm_first_hole(&hole, FALSE); + if (len != 0 && vmm_ptr_cmp(p, hole) < 0) + return TRUE; - /* - * Always allocating "user" memory: since "core" memory does not need - * to be zeroed, which is why there is no vmm_core_alloc0(). - */ + /* + * If region is small-enough to fit our cache, check whether it is + * an extremity: we want to release extremities as soon as possible + * to maximize free space. + */ - vmm_stats.user_memory += size; - vmm_stats.user_pages += n; - vmm_stats.user_blocks++; - memusage_add(vmm_stats.user_mem, size); + if (n <= VMM_CACHE_LINES && !vmm_is_extremity(p, n)) + return TRUE; + } - return p; + return FALSE; } /** @@ -3476,69 +4262,360 @@ * i.e. resource for other memory allocators. */ static void -vmm_free_internal(void *p, size_t size, gboolean user_mem) +vmm_free_internal(void *p, size_t size, bool user_mem) { g_assert(0 == size || p); g_assert(size_is_non_negative(size)); - if (p) { + /* + * If we're crashing and we detected an OOM conditions, the likelyhood + * that we are crashing due to that OOM condition is very high. Since + * we're lacking memory, if we can cache the memory we're freeing and + * that allows us to allocate later, then it's a win! + * + * Under an OOM condition, we make sure vmm_should_cache() always returns + * TRUE, which also means we're going to avoid pmap updates as a side + * effect since caching a region does not cause a pmap change: the memory + * remains allocated to the process. + * + * --RAM, 2015-11-28 + */ + + if G_UNLIKELY(vmm_crashing) { + if (!vmm_oom_detected) + return; + } + + /* + * If we are under an OOM condition, it is possible that the memory + * was actually allocated via the emergency region. In that case, + * return it to the emergency allocator instead of the page cache to + * maximize our ability to use that emergency region if we get a large + * allocation request. + * --RAM, 2015-12-03 + */ + + if G_UNLIKELY(vmm_oom_detected) { + if (vmea_free(p, size)) + return; /* Returned to emergency region */ + } + + /* + * Loudly warn if attempting to allocate memory from a signal handler. + */ + + if (signal_in_unsafe_handler()) { + VMM_STATS_INCX(freeings_in_handler); + s_minicarp_once("%s(): %s freeing %'zu bytes of %s memory at %p" + " from signal handler", + G_STRFUNC, thread_safe_name(), size, user_mem ? "user" : "core", p); + } + + if (p != NULL) { size_t n; g_assert(page_start(p) == p); size = round_pagesize_fast(size); n = pagecount_fast(size); - vmm_stats.freeings++; g_assert(n >= 1); /* Asserts that size != 0 */ - assert_vmm_is_allocated(p, size, VMF_NATIVE); - - /* - * Memory regions that are larger than our highest-order cache - * are allocated and freed as-is, and never broken into smaller - * pages. The purpose is to avoid excessive virtual memory space - * fragmentation, leading at some point to the unability for the - * kernel to find a large consecutive virtual memory region. - */ + assert_vmm_is_allocated(p, size, VMF_NATIVE, FALSE); - if (n <= VMM_CACHE_LINES) { + if (vmm_should_cache(p, n)) { size_t m = n; vmm_invalidate_pages(p, size); page_cache_coalesce_pages(&p, &m); if (page_cache_insert_pages(p, m)) { + VMM_STATS_LOCK; vmm_stats.free_to_cache++; vmm_stats.free_to_cache_pages += n; + } else { + VMM_STATS_LOCK; /* For later below */ } } else { - free_pages(p, size, TRUE); + size_t m = n; + page_cache_coalesce_pages(&p, &m); + free_pages(p, nsize_fast(m), TRUE); + VMM_STATS_LOCK; vmm_stats.free_to_system++; - vmm_stats.free_to_system_pages += n; + vmm_stats.free_to_system_pages += m; + vmm_stats.free_to_system_extra_pages += m - n; } + /* Stats are already locked */ + + vmm_stats.freeings++; + if (user_mem) { + vmm_stats.freeings_user++; vmm_stats.user_memory -= size; vmm_stats.user_pages -= n; g_assert(size_is_non_negative(vmm_stats.user_pages)); g_assert(size_is_non_negative(vmm_stats.user_memory)); vmm_stats.user_blocks--; + VMM_STATS_UNLOCK; memusage_remove(vmm_stats.user_mem, size); } else { + vmm_stats.freeings_core++; vmm_stats.core_memory -= size; vmm_stats.core_pages -= n; g_assert(size_is_non_negative(vmm_stats.core_pages)); g_assert(size_is_non_negative(vmm_stats.core_memory)); + VMM_STATS_UNLOCK; memusage_remove(vmm_stats.core_mem, size); } } } /** - * Free memory allocated via vmm_alloc(), possibly returning it to the cache. + * Internal general-purpose memory allocator given to the thread magazine + * depot in order to either allocate objects or the magazines themselves. + * + * If the amount requested is not exactly an even amount of pages, then + * the memory allocation is actually performed by xmalloc(), because we + * know the allocation cannot be for a magazine round. + * + * Note that if the memory allocated is a magazine round, it will be freed + * via vmm_free() first, which will put it back to the appropriate magazine, + * and only when the magazine depot needs to release the allocated rounds + * will it invoke vmm_free_raw(). + * + * @param size The size in bytes to allocate; will be rounded to the pagesize. + * + * @return a memory region that can be freed via vmm_free_raw(). + */ +static void * +vmm_alloc_raw(size_t size) +{ + if G_LIKELY(round_pagesize_fast(size) == size) + return vmm_alloc_internal(size, TRUE, FALSE); + + return xmalloc(size); +} + +/** + * Free memory allocated via vmm_alloc_raw(). + */ +static void +vmm_free_raw(void *p, size_t size) +{ + if G_LIKELY(round_pagesize_fast(size) == size) + vmm_free_internal(p, size, TRUE); + else + xfree(p); +} + +/** + * Get a magazine depot for the given amount of pages. + * + * @param npages amount of pages we want to allocate / free + * @param alloc if TRUE, this is for an allocation, otherwise we are freeing + * + * @return the magazine depot corresponding to the requested size, NULL if + * we cannot get any suitable depot at this time. + */ +static tmalloc_t * +vmm_get_magazine(size_t npages, bool alloc) +{ + tmalloc_t *depot; + + g_assert(npages <= N_ITEMS(vmm_magazine)); + g_assert(npages != 0); + + if G_UNLIKELY(NULL == (depot = vmm_magazinenpages - 1)) { + static mutex_t vmm_magazine_mtx = MUTEX_INIT; + static uint8 maginitVMM_MAGAZINE_PAGEMAX; + size_t idx = npages - 1; + + /* + * If the virtual memory layer is not fully initalized, don't use + * magazines to prevent deadlocks during auto-initialization. + */ + + if G_UNLIKELY(!atomic_bool_get(&vmm_fully_inited)) + return NULL; + + /* + * The thread-magazine allocator needs the event queue, so if we're + * called too soon in the initialization process, we cannot enable + * VMM page distribution through magazines. + */ + + if (!evq_is_inited()) + return NULL; /* Too soon */ + + if G_UNLIKELY(vmm_crashing && !vmm_oom_detected) + return NULL; /* In crash mode, don't use magazines */ + + /* + * The mutex and the maginit protection help us prevent any possible + * recursion during auto-initialization. + */ + + mutex_lock(&vmm_magazine_mtx); + + if (NULL == (depot = vmm_magazineidx) && !maginitidx) { + char nameSTR_CONST_LEN("vmm-") + SIZE_T_DEC_BUFLEN + 1; + + maginitidx = TRUE; + str_bprintf(name, sizeof name, "vmm-%zu", nsize_fast(npages)); + depot = vmm_magazineidx = + tmalloc_create(name, nsize_fast(npages), + vmm_alloc_raw, vmm_free_raw); + } + + mutex_unlock(&vmm_magazine_mtx); + } + + /* + * Loudly warn if attempting to use a depot from a signal handler. + */ + + if G_UNLIKELY(depot != NULL && signal_in_unsafe_handler()) { + if (alloc) + VMM_STATS_INCX(allocations_in_handler); + else + VMM_STATS_INCX(freeings_in_handler); + + s_minicarp_once("%s(): %s attempting to %s %'zu page%s" + " from signal handler", + G_STRFUNC, thread_safe_name(), alloc ? "allocate" : "free", + npages, plural(npages)); + } + + return depot; +} + +/** + * Allocate pages through magazine, if possible. + * + * @param npages amount of pages to allocate + * @param zero whether to zero the allocated region + * + * @return pointer to start of allocated region, NULL if we did not allocate. + */ +static void * +vmm_magazine_alloc(size_t npages, bool zero) +{ + tmalloc_t *depot = vmm_get_magazine(npages, TRUE); + + if G_UNLIKELY(NULL == depot) + return NULL; + + VMM_STATS_LOCK; + vmm_stats.allocations++; + vmm_stats.allocations_user++; + vmm_stats.magazine_allocations++; + if (zero) + vmm_stats.allocations_zeroed++; + VMM_STATS_UNLOCK; + + return zero ? tmalloc0(depot) : tmalloc(depot); +} + +/** + * Allocates a page-aligned memory chunk, possibly returning a cached region + * and only allocating a new region when necessary. + * + * @param size The size in bytes to allocate; will be rounded to the pagesize. + */ +void * +vmm_alloc(size_t size) +{ + size_t npages = pagecount_fast(size); + + if G_LIKELY(npages <= VMM_MAGAZINE_PAGEMAX) { + void *p = vmm_magazine_alloc(npages, FALSE); + + if G_LIKELY(p != NULL) + return p; + } + + return vmm_alloc_internal(size, TRUE, FALSE); +} + +/** + * Same a vmm_alloc() but zeroes the allocated region. + */ +void * +vmm_alloc0(size_t size) +{ + size_t npages = pagecount_fast(size); + + if G_LIKELY(npages <= VMM_MAGAZINE_PAGEMAX) { + void *p = vmm_magazine_alloc(npages, TRUE); + + if G_LIKELY(p != NULL) + return p; + } + + return vmm_alloc_internal(size, TRUE, TRUE); +} + +/** + * Allocates a page-aligned memory chunk, meant to be use as core for other + * memory allocator built on top of this layer. + * + * This means memory allocated here will NOT be accounted for as "user memory" + * and it MUST be freed with vmm_core_free() for sound accounting. + * + * @param size The size in bytes to allocate; will be rounded to the pagesize. + */ +void * +vmm_core_alloc(size_t size) +{ + return vmm_alloc_internal(size, FALSE, FALSE); +} + +/** + * Free memory allocated via vmm_alloc(), possibly returning it to the cache + * or to the thread magazine if the amount of pages is less than largest amount + * we serve through magazines. */ void vmm_free(void *p, size_t size) { + size_t npages = pagecount_fast(size); + + if G_LIKELY(npages <= VMM_MAGAZINE_PAGEMAX) { + tmalloc_t *depot; + + /* + * If we're running under a long-term VMM allocation strategy, + * check whether the region we're releasing is a VMM extremity. + * If it is, it should be released. + */ + + if G_UNLIKELY( + VMM_STRATEGY_LONG_TERM == vmm_strategy && + vmm_is_extremity(p, npages) + ) { + VMM_STATS_LOCK; + vmm_stats.magazine_freeings++; + vmm_stats.magazine_freeings_frag++; + VMM_STATS_UNLOCK; + goto user_free; + } + + depot = vmm_get_magazine(npages, FALSE); + + if G_LIKELY(depot != NULL) { + VMM_STATS_LOCK; + vmm_stats.freeings++; + vmm_stats.freeings_user++; + vmm_stats.magazine_freeings++; + VMM_STATS_UNLOCK; + + tmfree(depot, p); + return; + } + + /* FALL THROUGH -- if no depot yet for that amount of pages */ + } + +user_free: vmm_free_internal(p, size, TRUE); } @@ -3564,18 +4641,21 @@ * Otherwise calling with a new_size of 0 actually frees the memory region. */ static void -vmm_shrink_internal(void *p, size_t size, size_t new_size, gboolean user_mem) +vmm_shrink_internal(void *p, size_t size, size_t new_size, bool user_mem) { g_assert(0 == size || p != NULL); g_assert(new_size <= size); g_assert(page_start(p) == p); + if G_UNLIKELY(vmm_crashing && !vmm_oom_detected) + return; + if (0 == new_size) { vmm_free_internal(p, size, user_mem); } else if (p != NULL) { size_t osize, nsize; - assert_vmm_is_allocated(p, size, VMF_NATIVE); + assert_vmm_is_allocated(p, size, VMF_NATIVE, FALSE); osize = round_pagesize_fast(size); nsize = round_pagesize_fast(new_size); @@ -3589,41 +4669,46 @@ g_assert(n >= 1); - /* - * Memory regions that are larger than our highest-order cache - * are allocated and freed as-is, and never broken into smaller - * pages. The purpose is to avoid excessive virtual memory space - * fragmentation, leading at some point to the unability for the - * kernel to find a large consecutive virtual memory region. - */ - - vmm_stats.shrinkings++; - - if (n <= VMM_CACHE_LINES) { + if (vmm_should_cache(q, n)) { size_t m = n; vmm_invalidate_pages(q, delta); page_cache_coalesce_pages(&q, &m); if (page_cache_insert_pages(q, m)) { + VMM_STATS_LOCK; vmm_stats.free_to_cache++; vmm_stats.free_to_cache_pages += n; + } else { + VMM_STATS_LOCK; /* For later below */ } } else { - free_pages(q, delta, TRUE); + size_t m = n; + page_cache_coalesce_pages(&q, &m); + free_pages(q, nsize_fast(m), TRUE); + VMM_STATS_LOCK; vmm_stats.free_to_system++; vmm_stats.free_to_system_pages += n; + vmm_stats.free_to_system_extra_pages += m - n; } + /* Stats are already locked */ + + vmm_stats.shrinkings++; + if (user_mem) { + vmm_stats.shrinkings_user++; vmm_stats.user_memory -= delta; vmm_stats.user_pages -= n; g_assert(size_is_non_negative(vmm_stats.user_pages)); g_assert(size_is_non_negative(vmm_stats.user_memory)); + VMM_STATS_UNLOCK; memusage_remove(vmm_stats.user_mem, delta); } else { + vmm_stats.shrinkings_core++; vmm_stats.core_memory -= delta; vmm_stats.core_pages -= n; g_assert(size_is_non_negative(vmm_stats.core_pages)); g_assert(size_is_non_negative(vmm_stats.core_memory)); + VMM_STATS_UNLOCK; memusage_remove(vmm_stats.core_mem, delta); } } @@ -3655,6 +4740,62 @@ } /** + * Resize VMM region to be able to hold the specified amount of bytes. + * + * When the size is reduced, the region is shrinked. Otherwise, a new region + * is allocated and the data are moved, then the old region is freed. + * + * @return pointer to the new start of the region. + */ +void * +vmm_resize(void *p, size_t size, size_t new_size) +{ + size_t asize, anew; + void *np; + + VMM_STATS_INCX(resizings); + + asize = round_pagesize(size); /* Allocated size */ + anew = round_pagesize(new_size); + + if (asize == anew) + return p; + + if G_UNLIKELY(vmm_crashing) { + if (anew < asize) + return p; + np = vmm_crashing_alloc(anew, FALSE); + memcpy(np, p, size); + return np; + } + + if (anew < asize) { + vmm_shrink_internal(p, size, new_size, TRUE); + return p; + } + + /* + * Have to allocate a new region and move data around. + */ + + np = vmm_alloc_internal(new_size, TRUE, FALSE); + memcpy(np, p, size); + vmm_free_internal(p, size, TRUE); + + return np; +} + +/* + * Is ``i'' the highest (in the VM growing direction) entry of the cache line? + */ +static inline bool +vpc_is_highest(const struct page_cache *pc, size_t i, bool looped) +{ + return kernel_mapaddr_increasing ? + pc->current - 1 == i : (0 == i && !looped); +} + +/** * Scans the page cache for old pages and releases them if they have a certain * minimum age. We don't want to cache pages forever because they might never * be reused. Further, the OS would page them out anyway because they are @@ -3662,64 +4803,159 @@ * recycled such old pages, the penalty from paging them in is unlikely lower * than the mmap()/munmap() overhead. */ -static gboolean -page_cache_timer(gpointer unused_udata) +static bool +page_cache_timer(void *unused_udata) { - static size_t line; time_t now = tm_time(); struct page_cache *pc; - size_t i; - size_t expired = 0; - size_t old_regions = vmm_pmap()->count; + size_t i, expired = 0, kept = 0, old_regions = vmm_pmap()->count; + const void *hole; + struct vm_upper_hole upper; + size_t len; + void *freedVMM_CACHE_SIZE; + bool looped, populated; (void) unused_udata; - if G_UNLIKELY(VMM_CACHE_LINES == line) - line = 0; + if G_UNLIKELY(vmm_oom_detected) + return FALSE; /* Stop expire if we are in OOM condition already */ + + pc = &page_cachepage_cache_line; + + /* + * Compute the first hole capable of holding a region of the same size as + * the one used by this cache line. This allows us to avoid freeing + * pages that lie "before" that hole in the VM space, since we always + * want to allocate memory in the "lowest" addresses. + */ + + len = vmm_first_hole(&hole, FALSE); + + /* + * If we know an "upper hole", adjust the first hole address to be that + * one, as it will be more representative of where we are more likely + * to be able to allocate new core. + */ + + VMM_UPPER_HOLE_LOCK; + upper = vmm_upper_hole; /* struct copy */ + VMM_UPPER_HOLE_UNLOCK; + + if (upper.len >= pc->chunksize) { + len = upper.len; + hole = upper.p; + } - pc = &page_cacheline; + if (len >= pc->chunksize) { + if (!kernel_mapaddr_increasing) + hole = const_ptr_add_offset(hole, -len); + } else { + hole = NULL; + } spinlock(&pc->lock); if (vmm_debugging(pc->current > 0 ? 4 : 8)) { - s_debug("VMM scanning page cache #%zu (%zu item%s)", - line, pc->current, 1 == pc->current ? "" : "s"); + s_minidbg("VMM scanning page cache #%zu (%'zu item%s)", + page_cache_line, pc->current, plural(pc->current)); } + /* + * Because the array storing the cache line is updated in-place, we need + * to compute whether it has more than one item before starting our loops. + * + * Likewise, we need to remember whether we looped at all to be able to + * determine that we are at the "highest position" in the array: when + * the VM space is decreasing, that position is at index 0, but only + * the first time we go through the loop. + */ + + populated = pc->current > 1; + looped = FALSE; /* Needed by vpc_is_highest() */ + for (i = 0; i < pc->current; /* empty */) { time_delta_t d = delta_time(now, pc->infoi.stamp); + void *base = pc->infoi.base; + + /* + * Cached regions falling before the identified hole are always kept. + * + * The rationale is that this is a good place to allocate from, so we + * want to reuse the space. And releasing that space would invalidate + * the computed hole, making it likely that we would then again request + * allocation at that freed spot later on. + * + * The only exception is the last (or first when the VM grows down) + * entry of a cache line when there is more than one item, to make + * sure we never keep a region forever needlessly. + */ + + if ( + hole != NULL && vmm_ptr_cmp(base, hole) <= 0 && + !(populated && vpc_is_highest(pc ,i, looped)) + ) { + if (d >= VMM_CACHE_MAXLIFE) + kept++; + i++; /* i > 0 now, no need to set "looped" here */ + continue; + } /* * To avoid undue fragmentation of the memory space, do not free * a block that lies within an already identified region too soon. * Wait longer, for it to be further coalesced hopefully. + * + * Under a long-term strategy, extremities above the hole are always + * freed, regardless of their age in the cache. */ if ( d >= VMM_CACHE_MAXLIFE || - ( - d >= VMM_CACHE_LIFE && !pmap_is_within_region(vmm_pmap(), - pc->infoi.base, pc->chunksize) + (vmm_is_extremity(base, pc->chunksize) && + (VMM_STRATEGY_LONG_TERM == vmm_strategy || d >= VMM_CACHE_LIFE) ) ) { - vpc_free(pc, i); - expired++; - vmm_stats.cache_expired++; - vmm_stats.cache_expired_pages += pagecount_fast(pc->chunksize); + + /* + * Do not call vpc_free() here, as it will issue a system call + * and we are still holding the lock on the page cache line + * Stack the address, delaying freeing after we released the lock. + */ + + vpc_remove_at(pc, base, i); + freedexpired++ = base; + looped = TRUE; } else { - i++; + i++; /* i > 0 now, no need to set "looped" here */ } } + pc->expired += expired; + spinunlock(&pc->lock); + + g_assert(expired <= N_ITEMS(freed)); + if G_UNLIKELY(expired > 0) { + /* + * Free the pages we removed from the cache. + */ + + free_pages_vector(freed, expired, pc->chunksize); + + VMM_STATS_LOCK; + vmm_stats.cache_expired += expired; + vmm_stats.cache_expired_pages += + expired * pagecount_fast(pc->chunksize); + VMM_STATS_UNLOCK; + if (vmm_debugging(1)) { size_t regions = vmm_pmap()->count; - s_debug("VMM expired %zu item%s (%zuKiB total) from " - "page cache #%zu (%zu item%s remaining), " - "process has %zu VM regions%s", - expired, 1 == expired ? "" : "s", - expired * pc->chunksize / 1024, line, - pc->current, 1 == pc->current ? "" : "s", regions, + s_minidbg("VMM expired %'zu item%s (%'zuKiB total) from " + "page cache #%zu (%'zu item%s remaining), " + "process has %'zu VM regions%s", + expired, plural(expired), + expired * pc->chunksize / 1024, page_cache_line, + pc->current, plural(pc->current), regions, old_regions < regions ? " (fragmented further)" : ""); } if (vmm_debugging(5)) { @@ -3727,13 +4963,70 @@ } } - spinunlock(&pc->lock); + if G_UNLIKELY(kept > 0) { + VMM_STATS_LOCK; + vmm_stats.cache_kept += kept; + VMM_STATS_UNLOCK; + } + + /* + * For next time, compute cache line number to scan. + */ + + if G_UNLIKELY(VMM_CACHE_LINES -1 == page_cache_line) + page_cache_line = 0; + else + page_cache_line++; - line++; /* For next time */ return TRUE; /* Keep scheduling */ } /** + * Free all the pages in the page cache. + * + * @param locked whether the pmap is already write-locked + */ +static void +page_cache_free_all(bool locked) +{ + size_t i; + + for (i = 0; i < N_ITEMS(page_cache); i++) { + struct page_cache *pc = &page_cachei; + size_t j; + void *freedVMM_CACHE_SIZE; + + /* + * When the pmap is already write-locked, we cannot lock the page + * cache or we risk a deadlock with page_cache_timer() which first + * locks the cache lines and then attempts to write-lock the pmap. + */ + + if (locked) { + if (!spinlock_try(&pc->lock)) { + size_t pages = pc->current; + s_miniwarn("%s(): skipping locked cache line #%zu " + "(%'zu bytes) with %'zu page%s", + G_STRFUNC, i, pc->chunksize, pages, plural(pages)); + continue; + } + } else { + spinlock(&pc->lock); + } + + for (j = 0; j < pc->current; j++) { + freedj = pc->infoj.base; + } + + free_pages_vector(freed, pc->current, pc->chunksize); + pc->expired += pc->current; + pc->current = 0; + + spinunlock(&pc->lock); + } +} + +/** * Get a protected region bearing a non-NULL address. * * This is used as the address of sentinel objects for which we can do @@ -3747,26 +5040,42 @@ vmm_trap_page(void) { static const void *trap_page; + static spinlock_t trap_slk = SPINLOCK_INIT; + + if G_LIKELY(trap_page != NULL) + return trap_page; + + spinlock(&trap_slk); if (NULL == trap_page) { - void *p = alloc_pages(kernel_pagesize, FALSE, NULL); + void *p; + + if G_UNLIKELY(0 == kernel_pagesize) + vmm_init(); + + p = alloc_pages(kernel_pagesize, FALSE); g_assert(p); mprotect(p, kernel_pagesize, PROT_NONE); trap_page = p; /* The trap page is accounted as user memory */ + VMM_STATS_LOCK; vmm_stats.user_memory += kernel_pagesize; vmm_stats.user_pages++; vmm_stats.user_blocks++; + VMM_STATS_UNLOCK; memusage_add(vmm_stats.user_mem, kernel_pagesize); } + + spinunlock(&trap_slk); + return trap_page; } /** * @return whether the virtual memory segment grows with increasing addresses. */ -gboolean +bool vmm_grows_upwards(void) { return kernel_mapaddr_increasing; @@ -3776,12 +5085,50 @@ * Set VMM debug level. */ void -set_vmm_debug(guint32 level) +set_vmm_debug(uint32 level) { vmm_debug = level; } /** + * Set the VMM allocation strategy. + * + * The default strategy is VMM_STRATEGY_SHORT_TERM, which is suitable for + * short-lived programs: memory is allocated and is not released to the system + * until we can no longer cache the pages. + * + * For long-lived programs, it is best to use VMM_STRATEGY_LONG_TERM which + * will periodically release unused memeory and which will, over time and + * gradually, compact memory and limit the amount of VM regions that the + * kernel needs to manage. + * + * @param strategy desired VM allocation strategy + */ +void +vmm_set_strategy(enum vmm_strategy strategy) +{ + VMM_STRATEGY_LOCK; + + vmm_init(); /* For the improbable case where it would not be done! */ + + switch (strategy) { + case VMM_STRATEGY_SHORT_TERM: + cq_periodic_remove(&vmm_periodic); + break; + case VMM_STRATEGY_LONG_TERM: + if (NULL == vmm_periodic) + vmm_periodic = evq_raw_periodic_add(1000, page_cache_timer, NULL); + xmalloc_long_term(); + zalloc_long_term(); + break; + } + + vmm_strategy = strategy; + + VMM_STRATEGY_UNLOCK; +} + +/** * Called when memory allocator has been initialized and it is possible to * call routines that will allocate core memory and perform logging calls. */ @@ -3795,25 +5142,98 @@ } /** + * Generate a SHA1 digest of the current VMM statistics. + * + * This is meant for dynamic entropy collection. + */ +void +vmm_stats_digest(sha1_t *digest) +{ + /* + * Don't take locks to read the statistics, to enhance unpredictability. + */ + + VMM_STATS_INCX(vmm_stats_digest); + SHA1_COMPUTE(vmm_stats, digest); +} + +/** + * Dump page cache statistics to specified logging agent. + */ +void G_COLD +vmm_dump_pcache_log(logagent_t *la) +{ + size_t i; + + for (i = 0; i < VMM_CACHE_LINES; i++) { + struct page_cache *pc = &page_cachei; + size_t count; + uint64 targeted, allocated, denied, split, evicted, expired; + +#define COPY(x) x = pc->x + + spinlock(&pc->lock); + count = pc->current; + COPY(targeted); + COPY(allocated); + COPY(denied); + COPY(split); + COPY(evicted); + COPY(expired); + spinunlock(&pc->lock); + +#undef COPY + log_info(la, "VMM cache #%zu: cnt=%zu, req=%s, ok=%s, deny=%s, " + "split=%zu, evict=%zu, exp=%zu", + i, count, uint64_to_string(targeted), uint64_to_string2(allocated), + uint64_to_string3(denied), (size_t) split, (size_t) evicted, + (size_t) expired); + } +} + +/** * Dump VMM statistics to specified logging agent. */ -G_GNUC_COLD void +void G_COLD vmm_dump_stats_log(logagent_t *la, unsigned options) { struct pmap *pm = vmm_pmap(); size_t cached_pages = 0, mapped_pages = 0, native_pages = 0; size_t i; + struct vmm_stats stats; + bool groupped = booleanize(options & DUMP_OPT_PRETTY); + + VMM_STATS_LOCK; + stats = vmm_stats; /* struct copy under lock protection */ + VMM_STATS_UNLOCK; #define DUMP(x) log_info(la, "VMM %s = %s", #x, \ - (options & DUMP_OPT_PRETTY) ? \ - uint64_to_gstring(vmm_stats.x) : uint64_to_string(vmm_stats.x)) + uint64_to_string_grp(stats.x, groupped)) + +#define DUMP64(x) G_STMT_START { \ + uint64 v = AU64_VALUE(&vmm_stats.x); \ + log_info(la, "VMM %s = %s", #x, \ + uint64_to_string_grp(v, groupped)); \ +} G_STMT_END DUMP(allocations); DUMP(allocations_zeroed); + DUMP64(allocations_in_handler); DUMP(freeings); + DUMP64(freeings_in_handler); DUMP(shrinkings); - DUMP(mmaps); - DUMP(munmaps); + DUMP64(resizings); + DUMP(allocations_core); + DUMP(freeings_core); + DUMP(shrinkings_core); + DUMP(allocations_user); + DUMP(freeings_user); + DUMP(shrinkings_user); + DUMP64(mmaps); + DUMP64(munmaps); + DUMP(magazine_allocations); + DUMP(magazine_freeings); + DUMP(magazine_freeings_frag); DUMP(hints_followed); DUMP(hints_ignored); DUMP(alloc_from_cache); @@ -3824,32 +5244,82 @@ DUMP(free_to_cache_pages); DUMP(free_to_system); DUMP(free_to_system_pages); + DUMP(free_to_system_extra_pages); DUMP(forced_freed); DUMP(forced_freed_pages); - DUMP(cache_evictions); - DUMP(cache_coalescing); - DUMP(cache_line_coalescing); + DUMP64(cache_evictions); + DUMP64(cache_coalescing); + DUMP64(cache_line_coalescing); DUMP(cache_expired); DUMP(cache_expired_pages); - DUMP(high_order_coalescing); + DUMP(cache_kept); + DUMP64(cache_ignored); + DUMP64(cache_exact_match); + DUMP64(cache_splits); + DUMP64(cache_high_coalescing); + DUMP64(cache_too_large); + + /* + * Count cached entries -- this is a transient value, so no need to + * lock each cache line anyway, we do not care about the exact figures. + */ + + for (i = 0; i < VMM_CACHE_LINES; i++) { + struct page_cache *pc = &page_cachei; + + log_info(la, "VMM cache_entries_%zu = %zu", i, pc->current); + } + + log_info(la, "VMM cache_entries_next_expire = %zu", page_cache_line); + DUMP(pmap_foreign_discards); DUMP(pmap_foreign_discarded_pages); - DUMP(pmap_overruled); + DUMP64(pmap_overruled); + DUMP64(pmap_dropped); + + /* + * These variables are not updated with the VMM stats lock but whith + * the VMM hole lock. This means we did not take a full consistent + * view since we copied the statistics with the stats lock held only. + */ + +#define HOLE_COPY(x) stats.x = vmm_stats.x + + VMM_HOLE_LOCK; + HOLE_COPY(hole_reused); + HOLE_COPY(hole_invalidated); + HOLE_COPY(hole_updated); + HOLE_COPY(hole_unchanged); + VMM_HOLE_UNLOCK; + +#undef HOLE_COPY + + DUMP(hole_reused); + DUMP(hole_invalidated); + DUMP(hole_updated); + DUMP(hole_unchanged); #undef DUMP #define DUMP(x) log_info(la, "VMM pmap_%s = %s", #x, \ - (options & DUMP_OPT_PRETTY) ? \ - size_t_to_gstring(pm->x) : size_t_to_string(pm->x)) + size_t_to_string_grp(x, groupped)) + + { + size_t count, size, pages; - DUMP(count); - DUMP(size); - DUMP(pages); - DUMP(generation); + rwlock_rlock(&pm->lock); + count = pm->count; + size = pm->size; + pages = pm->pages; + rwlock_runlock(&pm->lock); + + DUMP(count); + DUMP(size); + DUMP(pages); + } #undef DUMP #define DUMP(x) log_info(la, "VMM %s = %s", #x, \ - (options & DUMP_OPT_PRETTY) ? \ - size_t_to_gstring(vmm_stats.x) : size_t_to_string(vmm_stats.x)) + size_t_to_string_grp(stats.x, groupped)) DUMP(user_memory); DUMP(user_pages); @@ -3875,7 +5345,7 @@ * Compute the amount of known native / mapped pages. */ - mutex_get(&pm->lock); + rwlock_rlock(&pm->lock); for (i = 0; i < pm->count; i++) { struct vm_fragment *vmf = &pm->arrayi; @@ -3887,11 +5357,10 @@ } } - mutex_release(&pm->lock); + rwlock_runlock(&pm->lock); #define DUMP(v,x) log_info(la, "VMM %s = %s", (v), \ - (options & DUMP_OPT_PRETTY) ? \ - size_t_to_gstring(x) : size_t_to_string(x)) + size_t_to_string_grp(x, groupped)) DUMP("cached_pages", cached_pages); DUMP("mapped_pages", mapped_pages); @@ -3904,16 +5373,18 @@ */ DUMP("computed_native_pages", - cached_pages + vmm_stats.user_pages + vmm_stats.core_pages + - local_pmap.pages + kernel_pmap.pages); + cached_pages + stats.user_pages + stats.core_pages + local_pmap.pages); + + DUMP64(vmm_stats_digest); +#undef DUMP64 #undef DUMP } /** * Dump VMM statistics at exit time, along with the current pmap. */ -G_GNUC_COLD void +void G_COLD vmm_dump_stats(void) { s_info("VMM running statistics:"); @@ -3924,7 +5395,7 @@ /** * Dump VMM usage statistics to specified logging agent. */ -G_GNUC_COLD void +void G_COLD vmm_dump_usage_log(logagent_t *la, unsigned options) { if (NULL == vmm_stats.user_mem) { @@ -3943,18 +5414,18 @@ * In case an assertion failure occurs in this file, dump statistics * and the pmap. */ -static G_GNUC_COLD void +static void G_COLD vmm_crash_hook(void) { - int dummy; + int sp; - s_debug("VMM pagesize=%zu bytes, virtual addresses are %s", + s_minidbg("VMM pagesize=%'zu bytes, virtual addresses are %s", kernel_pagesize, kernel_mapaddr_increasing ? "increasing" : "decreasing"); - s_debug("VMM base=%p, initial_sp=%p, current_sp=%p (stack growing %s)", - vmm_base, initial_sp, (void *) &dummy, - ptr_cmp(initial_sp, &dummy) < 0 ? "up" : "down"); + s_minidbg("VMM base=%p, base_sp=%p, current_sp=%p (stack growing %s)", + vmm_base, stack_base, (void *) &sp, + ptr_cmp(stack_base, &sp) < 0 ? "up" : "down"); vmm_dump_stats(); } @@ -3966,69 +5437,12 @@ * region and reserve an extra VMM_STACK_MINSIZE bytes for it to grow * further. */ -static G_GNUC_COLD void +static void G_COLD vmm_reserve_stack(size_t amount) { - const void *stack_base, *stack_end, *stack_low; - - /* - * If we could read the kernel pmap, reserve an extra VMM_STACK_MINSIZE - * after the stack, as a precaution. - */ - - if (vmm_pmap() == &kernel_pmap) { - struct vm_fragment *vmf = pmap_lookup(&kernel_pmap, initial_sp, NULL); - gboolean first_time = NULL == vmm_base; - - if (NULL == vmf) { - if (vmm_debugging(0)) { - s_warning("VMM no stack region found in the kernel pmap"); - } - if (NULL == vmm_base) - vmm_base = vmm_trap_page(); - } else { - const void *reserve_start; - - if (vmm_debugging(1)) { - s_debug("VMM stack region found in the kernel pmap (%zu KiB)", - vmf_size(vmf) / 1024); - } - - stack_end = deconstify_gpointer( - sp_increasing ? vmf->end : vmf->start); - reserve_start = const_ptr_add_offset(stack_end, - (kernel_mapaddr_increasing ? +1 : -1) * VMM_STACK_MINSIZE); - - if ( - !pmap_is_available(&kernel_pmap, - reserve_start, VMM_STACK_MINSIZE) - ) { - if (vmm_debugging(0)) { - s_warning("VMM cannot reserve extra %uKiB %s stack", - VMM_STACK_MINSIZE / 1024, - sp_increasing ? "after" : "before"); - } - } else { - pmap_insert_foreign(&kernel_pmap, - reserve_start, VMM_STACK_MINSIZE); - if (vmm_debugging(1)) { - s_debug("VMM reserved %p, %p " - "%s stack for possible growing", - reserve_start, - const_ptr_add_offset(reserve_start, - VMM_STACK_MINSIZE - 1), - sp_increasing ? "after" : "before"); - vmm_dump_pmap(); - } - } - - if (NULL == vmm_base) - vmm_base = reserve_start; - } - if (first_time) - goto vm_setup; - return; - } + const void *stack_end, *stack_low; + bool sp_increasing = sp_direction > 0; + struct pmap *pm = vmm_pmap(); g_assert(amount != 0); @@ -4042,18 +5456,16 @@ goto vm_setup; } - stack_base = page_start(initial_sp); - if (!sp_increasing) - stack_base = const_ptr_add_offset(stack_base, kernel_pagesize); - stack_end = const_ptr_add_offset(stack_base, (sp_increasing ? +1 : -1) * amount); stack_low = sp_increasing ? stack_base : stack_end; - if (pmap_is_available(&local_pmap, stack_low, amount)) { - pmap_insert_foreign(&local_pmap, stack_low, amount); + rwlock_wlock(&pm->lock); + + if (pmap_is_available(pm, stack_low, amount)) { + pmap_insert_foreign(pm, stack_low, amount); if (vmm_debugging(1)) { - s_debug("VMM reserved %zuKiB %p, %p for the stack", + s_minidbg("VMM reserved %'zuKiB %p, %p for the stack", amount / 1024, stack_low, const_ptr_add_offset(stack_low, amount - 1)); } @@ -4069,7 +5481,7 @@ } } else { if (vmm_debugging(0)) { - s_warning("VMM cannot reserve %zuKiB %p, %p for the stack", + s_warning("VMM cannot reserve %'zuKiB %p, %p for the stack", amount / 1024, stack_low, const_ptr_add_offset(stack_low, amount - 1)); vmm_dump_pmap(); @@ -4077,18 +5489,20 @@ vmm_base = vmm_trap_page(); } + rwlock_wunlock(&pm->lock); + vm_setup: if (vmm_debugging(0)) { - s_debug("VMM will allocate pages from %p %swards", + s_minidbg("VMM will allocate pages from %p %swards", vmm_base, kernel_mapaddr_increasing ? "up" : "down"); } } /** - * Enable memory usage statistics collection. + * Turn on memory usage statistics. */ -G_GNUC_COLD void -vmm_memusage_init(void) +static void G_COLD +vmm_memusage_init_once(void) { g_assert(NULL == vmm_stats.user_mem); g_assert(NULL == vmm_stats.core_mem); @@ -4098,10 +5512,21 @@ } /** + * Enable memory usage statistics collection. + */ +void G_COLD +vmm_memusage_init(void) +{ + static once_flag_t memusage_inited; + + ONCE_FLAG_RUN(memusage_inited, vmm_memusage_init_once); +} + +/** * Called later in the initialization chain once the callout queue has been * initialized and the properties loaded. */ -G_GNUC_COLD void +void G_COLD vmm_post_init(void) { struct { @@ -4134,23 +5559,22 @@ } if (vmm_debugging(0)) { - s_debug("VMM using %zu bytes for the page cache", sizeof page_cache); - s_debug("VMM kernel grows virtual memory by %s addresses", + s_minidbg("VMM using %'zu bytes for the page cache", sizeof page_cache); + s_minidbg("VMM kernel grows virtual memory by %s addresses", kernel_mapaddr_increasing ? "increasing" : "decreasing"); - s_debug("VMM stack grows by %s addresses", - sp_increasing ? "increasing" : "decreasing"); + s_minidbg("VMM stack grows by %s addresses", + sp_direction > 0 ? "increasing" : "decreasing"); + s_minidbg("VMM running in thread #%u", thread_small_id()); } if (vmm_debugging(1)) { #ifdef HAS_SBRK - s_debug("VMM initial break at %p", initial_brk); + s_minidbg("VMM initial break at %p", initial_brk); #endif - s_debug("VMM stack bottom at %p", initial_sp); + s_minidbg("VMM %screasing stack bottom at %p", + sp_direction > 0 ? "in" : "de", stack_base); } - pmap_load(&kernel_pmap); - cq_periodic_main_add(1000, page_cache_timer, NULL); - /* * Check whether we have enough room for the stack to grow. */ @@ -4160,14 +5584,14 @@ const void *end = const_ptr_add_offset(vmbase, kernel_pagesize); size_t room; - if (ptr_cmp(initial_sp, vmbase) > 0) { - if (!sp_increasing) { + if (ptr_cmp(stack_base, vmbase) > 0) { + if (sp_direction < 0) { /* * Stack is after the VM region and is decreasing, it can * grow at most to the end of the allocated region. */ - room = round_pagesize(ptr_diff(initial_sp, end)); + room = round_pagesize(ptr_diff(stack_base, end)); } else { /* * Stack is after the VM region and is increasing. @@ -4177,14 +5601,14 @@ room = (size_t) -1; } } else { - if (sp_increasing) { + if (sp_direction > 0) { /* * Stack is before the VM region and is increasing, it can * grow at most to the start of the allocated region. */ - room = round_pagesize(ptr_diff(vmbase, initial_sp)); + room = round_pagesize(ptr_diff(vmbase, stack_base)); } else { /* * Stack is before the VM region and is decreasing. @@ -4197,12 +5621,12 @@ if ((size_t) -1 == room) { if (vmm_debugging(0)) { - s_debug("VMM kernel can grow the stack as needed"); + s_minidbg("VMM kernel can grow the stack as needed"); } } else if (room < VMM_STACK_MINSIZE) { - s_warning("VMM stack has only %zuKiB to grow!", room / 1024); + s_warning("VMM stack has only %'zuKiB to grow!", room / 1024); } else if (vmm_debugging(0)) { - s_debug("VMM stack has at most %zuKiB to grow", room / 1024); + s_minidbg("VMM stack has at most %'zuKiB to grow", room / 1024); } /* @@ -4213,53 +5637,32 @@ vmm_reserve_stack(room); } + mingw_vmm_post_init(); + #ifdef TRACK_VMM vmm_track_post_init(); #endif } /** - * Early initialization of the vitual memory manager. - * - * @attention - * No external memory allocation (malloc() and friends) can be done in this - * routine, which is called very early at startup. + * Initialize the VMM layer, once. */ -G_GNUC_COLD void -vmm_init(const void *sp) +static void G_COLD +vmm_early_init_once(void) { - static spinlock_t init_lck = SPINLOCK_INIT; int i; - g_assert(sp != &i); - - /* - * Detect whether vmm_init() was already run due to an earlier vmm_alloc() - * call, which indicates that something went wrong already in the startup - * and the process had to allocate memory earlier than expected, probably - * due to error logging. - */ - - spinlock(&init_lck); - - if G_UNLIKELY(0 != kernel_pagesize) { - spinunlock(&init_lck); - return; - } - #ifdef HAS_SBRK initial_brk = sbrk(0); #endif - initial_sp = sp; - sp_increasing = ptr_cmp(&i, sp) > 0; - init_kernel_pagesize(); + init_stack_shape(); for (i = 0; i < VMM_CACHE_LINES; i++) { struct page_cache *pc = &page_cachei; size_t pages = i + 1; pc->pages = pages; - pc->chunksize = pages * kernel_pagesize; + pc->chunksize = nsize_fast(pages); spinlock_init(&pc->lock); } @@ -4268,17 +5671,16 @@ */ pmap_allocate(&local_pmap); - pmap_allocate(&kernel_pmap); - g_assert_log(2 == local_pmap.pages + kernel_pmap.pages, - "local_pmap.pages = %zu, kernel_pmap.pages = %zu", - local_pmap.pages, kernel_pmap.pages); + g_assert_log(1 == local_pmap.pages, + "local_pmap.pages = %zu", local_pmap.pages); /* * Allocate the trap page early so that it is at the bottom of the * memory space, hopefully (not really true on Linux, but close enough). */ - (void) vmm_trap_page(); + + vmm_base = vmm_trap_page(); /* * The VMM trap page was allocated earlier, before we have the pmap @@ -4287,7 +5689,9 @@ * Insert it now, as a native region since we have allocated it. */ - pmap_insert(vmm_pmap(), vmm_trap_page(), kernel_pagesize); + rwlock_wlock(&local_pmap.lock); + pmap_insert(&local_pmap, vmm_trap_page(), kernel_pagesize); + rwlock_wunlock(&local_pmap.lock); /* * Determine how the kernel is growing the virtual memory region. @@ -4296,8 +5700,8 @@ kernel_mapaddr_increasing = 1; #else { - void *p = alloc_pages(kernel_pagesize, FALSE, NULL); - void *q = alloc_pages(kernel_pagesize, FALSE, NULL); + void *p = alloc_pages(kernel_pagesize, FALSE); + void *q = alloc_pages(kernel_pagesize, FALSE); kernel_mapaddr_increasing = ptr_cmp(q, p) > 0; @@ -4308,13 +5712,64 @@ #ifdef TRACK_VMM vmm_track_init(); #endif +} +/** + * Mark the VMM layer as initialized, once. + */ +static void G_COLD +vmm_init_once(void) +{ /* * We can now use the VMM layer to allocate memory via xmalloc(). */ - spinunlock(&init_lck); xmalloc_vmm_inited(); + + atomic_bool_set(&vmm_fully_inited, TRUE); +} + +/** + * Emergency initialization of the VMM layer very early in the process, when + * it's too soon to be able to call xmalloc_vmm_inited(). + * + * This is only visible from the xmalloc() layer to be able to perform + * posix_memalign() calls very early in the process startup. + */ +void G_COLD +vmm_early_init(void) +{ + once_flag_run(&vmm_early_inited, vmm_early_init_once); +} + +/** + * Early initialization of the vitual memory manager. + * + * @attention + * No external memory allocation (malloc() and friends) can be done in this + * routine, which is called very early at startup. + */ +void G_COLD +vmm_init(void) +{ + vmm_early_init(); + once_flag_run(&vmm_inited, vmm_init_once); +} + +/** + * Reset all VMM magazines. + */ +static void +vmm_magazine_reset(void) +{ + int i; + + for (i = 0; i < VMM_MAGAZINE_PAGEMAX; i++) { + tmalloc_t *d = vmm_magazinei; + if (d != NULL) { + tmalloc_reset(d); + } + } } /** @@ -4328,7 +5783,9 @@ * the memory freeing activity. Better avoid such clutter. */ + vmm_magazine_reset(); safe_to_log = FALSE; /* Turn logging off */ + cq_periodic_remove(&vmm_periodic); } /** @@ -4345,16 +5802,16 @@ memusage_free_null(&vmm_stats.user_mem); memusage_free_null(&vmm_stats.core_mem); - stop_freeing = TRUE; + vmm_set_stop_freeing(TRUE); if (vmm_debugging(0)) - s_debug("VMM will no longer release freed pages"); + s_minidbg("VMM will no longer release freed pages"); } /** * Final shutdown. */ -G_GNUC_COLD void +void G_COLD vmm_close(void) { struct pmap *pm = vmm_pmap(); @@ -4365,22 +5822,13 @@ size_t memory = 0; size_t i; + vmm_magazine_reset(); + /* * Clear all cached pages. */ - for (i = 0; i < VMM_CACHE_LINES; i++) { - struct page_cache *pc = &page_cachei; - size_t j; - - spinlock(&pc->lock); - - for (j = 0; j < pc->current; j++) { - vpc_free(pc, j); - } - - spinunlock(&pc->lock); - } + page_cache_free_all(FALSE); #ifdef TRACK_VMM vmm_track_close(); @@ -4425,24 +5873,24 @@ size_t mpages = pagecount_fast(mmem); if (opages > pages) { - s_warning("VMM omalloc() claims using %zu page%s, have %zu left", - opages, 1 == opages ? "" : "s", pages); + s_warning("VMM omalloc() claims using %'zu page%s, have %'zu left", + opages, plural(opages), pages); } else { pages -= opages; memory -= opages * (compat_pagesize() / 1024); } if (mpages > pages) { - s_warning("VMM malloc() claims using %zu page%s, have %zu left", - mpages, 1 == mpages ? "" : "s", pages); + s_warning("VMM malloc() claims using %'zu page%s, have %'zu left", + mpages, plural(mpages), pages); } else { pages -= mpages; memory -= mpages * (compat_pagesize() / 1024); } if (spages > pages) { - s_warning("VMM stacktrace claims using %zu page%s, have %zu left", - spages, 1 == spages ? "" : "s", pages); + s_warning("VMM stacktrace claims using %'zu page%s, have %'zu left", + spages, plural(spages), pages); } else { pages -= spages; memory -= spages * (compat_pagesize() / 1024); @@ -4450,29 +5898,31 @@ } if (pages != 0) { - s_warning("VMM still holds %zu non-attributed page%s totaling %s KiB", - pages, 1 == pages ? "" : "s", size_t_to_string(memory)); + s_warning("VMM still holds %'zu non-attributed page%s totaling %s KiB", + pages, plural(pages), size_t_to_gstring(memory)); if (vmm_stats.user_pages != 0) { - s_warning("VMM holds %zu user page%s (%zu block%s) totaling %s KiB", - vmm_stats.user_pages, 1 == vmm_stats.user_pages ? "" : "s", - vmm_stats.user_blocks, 1 == vmm_stats.user_blocks ? "" : "s", - size_t_to_string(vmm_stats.user_memory / 1024)); + s_warning("VMM holds %'zu user page%s (%'zu block%s) " + "totaling %s KiB", + vmm_stats.user_pages, plural(vmm_stats.user_pages), + vmm_stats.user_blocks, plural(vmm_stats.user_blocks), + size_t_to_gstring(vmm_stats.user_memory / 1024)); } if (vmm_stats.core_pages != 0) { - s_message("VMM holds %zu core page%s totaling %s KiB", - vmm_stats.core_pages, 1 == vmm_stats.core_pages ? "" : "s", - size_t_to_string(vmm_stats.core_memory / 1024)); + s_message("VMM holds %'zu core page%s totaling %s KiB", + vmm_stats.core_pages, plural(vmm_stats.core_pages), + size_t_to_gstring(vmm_stats.core_memory / 1024)); } } if (native_pages != vmm_stats.user_pages + vmm_stats.core_pages) { - s_warning("VMM holds %zu native pages, but %zu user + %zu core = %zu", + s_warning("VMM holds %'zu native pages, " + "but %'zu user + %'zu core = %'zu", native_pages, vmm_stats.user_pages, vmm_stats.core_pages, vmm_stats.user_pages + vmm_stats.core_pages); } if (mapped_pages != 0) { - s_warning("VMM still holds %zu memory-mapped page%s totaling %s KiB", - mapped_pages, 1 == mapped_pages ? "" : "s", - size_t_to_string(mapped_memory)); + s_warning("VMM still holds %'zu memory-mapped page%s totaling %s KiB", + mapped_pages, plural(mapped_pages), + size_t_to_gstring(mapped_memory)); } } @@ -4482,6 +5932,31 @@ *** can keep an accurate view of the process's virtual memory map. ***/ +#ifdef HAS_MMAP +/** + * Record memory-mapped region in the pmap. + */ +static void +pmap_mmap(struct pmap *pm, void *p, size_t size) +{ + /* + * The mapped memory region is "foreign" memory as far as we are + * concerned and may overlap with previously allocated "foreign" + * chunks in whole or in part. + * + * Invoke pmap_overrule() before pmap_insert_mapped() to make + * sure we clean up our memory map before attempting to insert + * a new chunk since the insertion code is not prepared to handle + * all the overlapping cases we can encounter. + */ + + rwlock_wlock(&pm->lock); + pmap_overrule(pm, p, size, VMF_MAPPED); + pmap_insert_mapped(pm, p, size); + rwlock_wunlock(&pm->lock); +} +#endif /* HAS_MMAP */ + /** * Wrapper of the mmap() system call. */ @@ -4493,31 +5968,17 @@ void *p = mmap(addr, length, prot, flags, fd, offset); if G_LIKELY(p != MAP_FAILED) { - size_t size = round_pagesize_fast(length); + VMM_STATS_INCX(mmaps); + pmap_mmap(vmm_pmap(), p, round_pagesize_fast(length)); - vmm_stats.mmaps++; - - /* - * The mapped memory region is "foreign" memory as far as we are - * concerned and may overlap with previously allocated "foreign" - * chunks in whole or in part. - * - * Invoke pmap_overrule() before pmap_insert_mapped() to make - * sure we clean up our memory map before attempting to insert - * a new chunk since the insertion code is not prepared to handle - * all the overlapping cases we can encounter. - */ - - pmap_overrule(vmm_pmap(), p, size, VMF_MAPPED); - pmap_insert_mapped(vmm_pmap(), p, size); - assert_vmm_is_allocated(p, length, VMF_MAPPED); + assert_vmm_is_allocated(p, length, VMF_MAPPED, FALSE); if (vmm_debugging(5)) { - s_debug("VMM mapped %zuKiB region at %p (fd #%d, offset 0x%lx)", + s_minidbg("VMM mapped %'zuKiB region at %p (fd #%d, offset 0x%lx)", length / 1024, p, fd, (unsigned long) offset); } } else if (vmm_debugging(0)) { - s_warning("VMM FAILED maping of %zuKiB region (fd #%d, offset 0x%lx)", + s_warning("VMM FAILED maping of %'zuKiB region (fd #%d, offset 0x%lx)", length / 1024, fd, (unsigned long) offset); } @@ -4543,20 +6004,48 @@ { #if defined(HAS_MMAP) int ret; + struct pmap *pm = vmm_pmap(); + + assert_vmm_is_allocated(addr, length, VMF_MAPPED, FALSE); + + /* + * We need to clear the region in the pmap BEFORE attempting to + * unmap the region. Failure to do that would mean we can have + * another thread map to the cleared region whilst our pmap says + * the region is already busy, leading to pmap_overrule() assertion + * failures later, possibly. + * + * Of course, this means re-establishing the mapping later on if + * the munmap() call fails. But given the assert above, we know + * our pmap correctly accounts that region as mapped, so the system + * call should not fail! + * + * --RAM, 2015-10-03 + */ - assert_vmm_is_allocated(addr, length, VMF_MAPPED); + rwlock_wlock(&pm->lock); + pmap_remove(pm, addr, round_pagesize_fast(length)); + rwlock_wunlock(&pm->lock); + + VMM_STATS_INCX(munmaps); ret = munmap(addr, length); if G_LIKELY(0 == ret) { - pmap_remove(vmm_pmap(), addr, round_pagesize_fast(length)); - vmm_stats.munmaps++; - if (vmm_debugging(5)) { - s_debug("VMM unmapped %zuKiB region at %p", length / 1024, addr); + s_minidbg("VMM unmapped %'zuKiB region at %p", length / 1024, addr); } } else { - s_warning("munmap() failed: %m"); + /* + * This is so unexpected that it deserves a loud warning with a full + * stacktrace so that we can later assess the damage if we get a + * weird behaviour. + */ + + s_carp("munmap(%p, %'zu) failed: %m", addr, length); + + /* Re-establish mapping in pmap since we could not unmap the region */ + pmap_mmap(pm, addr, round_pagesize_fast(length)); } return ret; @@ -4606,7 +6095,7 @@ * This flag keeps track of recursions so that we avoid exercising any * tracking when recursion is detected. */ -static gboolean vmm_recursed; +static bool vmm_recursed; /** * This buffer allows us to queue allocations or deletions whenever a @@ -4659,14 +6148,14 @@ } static void unbuffer_operations(void); -static void vmm_free_record(const void *p, size_t size, gboolean user_mem, +static void vmm_free_record(const void *p, size_t size, bool user_mem, const char *file, int line); /** * User or core memory? */ static const char * -track_mem(gboolean user_mem) +track_mem(bool user_mem) { return user_mem ? "user" : "core"; } @@ -4678,13 +6167,13 @@ */ static void buffer_operation(enum track_operation op, - const void *p, size_t size, gboolean user_mem, const char *file, int line) + const void *p, size_t size, bool user_mem, const char *file, int line) { - if (vmm_buffer.idx >= G_N_ELEMENTS(vmm_buffered)) { + if (vmm_buffer.idx >= N_ITEMS(vmm_buffered)) { vmm_buffer.missed++; if (vmm_debugging(0)) { s_warning("VMM unable to defer tracking of " - "%s (%zu %s bytes starting %p) at \"%s:%d\" (issue #%zu)", + "%s (%'zu %s bytes starting %p) at \"%s:%d\" (issue #%zu)", track_operation_to_string(op), track_mem(user_mem), p, file, line, vmm_buffer.missed); stacktrace_where_print(stderr); @@ -4699,7 +6188,7 @@ if (vmm_debugging(5)) { s_warning("VMM deferring tracking of " - "%s (%zu %s bytes starting %p) at \"%s:%d\" (item #%zu)", + "%s (%'zu %s bytes starting %p) at \"%s:%d\" (item #%zu)", track_operation_to_string(op), size, track_mem(user_mem), p, file, line, vmm_buffer.idx); } @@ -4720,12 +6209,12 @@ } /* - * In case TRACK_MALLOC is activated, we want the raw xpmalloc() and xfree() + * In case TRACK_MALLOC is activated, we want the raw xhmalloc() and xfree() * from here on... * * For that reason, the following code should stay at the bottom of the file. */ -#undef xpmalloc +#undef xhmalloc #undef xfree /** @@ -4774,26 +6263,29 @@ if (pt->user && xpt->size != pt->size) { if (vmm_debugging(0)) { - s_carp("VMM (%s:%d) freeing %s page at %p (%zu bytes) " - "from \"%s:%d\" with wrong size %zu %zu missed event%s", + s_carp("VMM (%s:%d) freeing %s page at %p (%'zu bytes) " + "from \"%s:%d\" with wrong size %'zu %'zu missed event%s", pt->file, pt->line, track_mem(xpt->user), p, xpt->size, xpt->file, xpt->line, pt->size, - vmm_buffer.missed, 1 == vmm_buffer.missed ? "" : "s"); + vmm_buffer.missed, plural(vmm_buffer.missed)); } } if (xpt->user != pt->user) { if (vmm_debugging(0)) { - s_carp("VMM (%s:%d) freeing %s page at %p (%zu bytes) " - "from \"%s:%d\" as wrong type \"%s\" %zu missed event%s", + s_carp("VMM (%s:%d) freeing %s page at %p (%'zu bytes) " + "from \"%s:%d\" as wrong type \"%s\" %'zu missed event%s", pt->file, pt->line, track_mem(xpt->user), p, xpt->size, xpt->file, xpt->line, track_mem(pt->user), - vmm_buffer.missed, 1 == vmm_buffer.missed ? "" : "s"); + vmm_buffer.missed, plural(vmm_buffer.missed)); } } hash_table_remove(tracked, p); xfree(xpt); /* raw free() */ + + if (not_leaking != NULL) + hash_table_remove(not_leaking, p); } /** @@ -4807,7 +6299,7 @@ g_assert(pt != NULL); if (NULL != (xpt = hash_table_lookup(tracked, p))) { - s_warning("VMM (%s:%d) reusing page start %p (%zu %s bytes) " + s_warning("VMM (%s:%d) reusing page start %p (%'zu %s bytes) " "from %s:%d, missed its freeing", pt->file, pt->line, p, xpt->size, track_mem(xpt->user), xpt->file, xpt->line); @@ -4822,7 +6314,7 @@ vmm_free_record_desc(p, pt); } - xpt = xpmalloc(sizeof *xpt); /* raw malloc() */ + xpt = xhmalloc(sizeof *xpt); /* raw malloc() */ *xpt = *pt; /* struct copy */ if (!hash_table_insert(tracked, p, xpt)) @@ -4835,7 +6327,7 @@ * @return its argument ``p'' */ static void * -vmm_alloc_record(void *p, size_t size, gboolean user_mem, +vmm_alloc_record(void *p, size_t size, bool user_mem, const char *file, int line) { struct page_track pt; @@ -4882,10 +6374,10 @@ } /** - * Record that ``p'' (pointing to ``size'' bytes is now free. + * Record that ``p'' (pointing to ``size'') bytes is now free. */ static void -vmm_free_record(const void *p, size_t size, gboolean user_mem, +vmm_free_record(const void *p, size_t size, bool user_mem, const char *file, int line) { struct page_track pt; @@ -4923,15 +6415,11 @@ { g_assert(dest != NULL); g_assert(size_is_positive(vmm_buffer.idx)); - g_assert(vmm_buffer.idx <= G_N_ELEMENTS(vmm_buffered)); + g_assert(vmm_buffer.idx <= N_ITEMS(vmm_buffered)); *dest = vmm_buffered0; /* Struct copy */ - /* Shift everything down one position */ - memmove(&vmm_buffered0, &vmm_buffered1, - (vmm_buffer.idx - 1) * sizeof vmm_buffered0); - - vmm_buffer.idx--; /* One more slot available */ + ARRAY_REMOVE_DEC(vmm_buffered, 0, vmm_buffer.idx); } /** @@ -4960,11 +6448,11 @@ if (vmm_debugging(2)) { s_warning("VMM processing deferred " - "%s (%zu %s bytes starting %p) at \"%s:%d\" " - "(%zu other record%s pending)", + "%s (%'zu %s bytes starting %p) at \"%s:%d\" " + "(%'zu other record%s pending)", track_operation_to_string(tb.op), tb.pt.size, track_mem(tb.pt.user), tb.addr, tb.pt.file, tb.pt.line, - vmm_buffer.idx, 1 == vmm_buffer.idx ? "" : "s"); + vmm_buffer.idx, plural(vmm_buffer.idx)); } switch (tb.op) { @@ -4999,7 +6487,7 @@ * Buffer the event until we're initialized. */ - if (vmm_nl_buffer.idx >= G_N_ELEMENTS(vmm_nl_buffered)) { + if (vmm_nl_buffer.idx >= N_ITEMS(vmm_nl_buffered)) { vmm_nl_buffer.missed++; } else { size_t i = vmm_nl_buffer.idx++; @@ -5011,18 +6499,18 @@ } } - return deconstify_gpointer(o); + return deconstify_pointer(o); } /** * Tracking version of vmm_alloc(). */ void * -vmm_alloc_track(size_t size, gboolean user_mem, const char *file, int line) +vmm_alloc_track(size_t size, bool user_mem, const char *file, int line) { void *p; - p = vmm_alloc_internal(size, user_mem); + p = vmm_alloc_internal(size, user_mem, FALSE); return vmm_alloc_record(p, size, user_mem, file, line); } @@ -5039,6 +6527,18 @@ } /** + * Tracking version of vmm_core_alloc() for memory flagged as non-leaking. + */ +void * +vmm_core_alloc_track_not_leaking(size_t size, const char *file, int line) +{ + void *p; + + p = vmm_alloc_track(size, FALSE, file, line); + return vmm_not_leaking(p); +} + +/** * Tracking version of vmm_alloc0(). */ void * @@ -5054,7 +6554,7 @@ * Tracking version of vmm_free(). */ void -vmm_free_track(void *p, size_t size, gboolean user_mem, +vmm_free_track(void *p, size_t size, bool user_mem, const char *file, int line) { if (not_leaking != NULL) { @@ -5069,7 +6569,7 @@ * Tracking version of vmm_shrink(). */ void -vmm_shrink_track(void *p, size_t size, size_t new_size, gboolean user_mem, +vmm_shrink_track(void *p, size_t size, size_t new_size, bool user_mem, const char *file, int line) { /* The shrinking point becomes the new allocation point (file, line) */ @@ -5079,6 +6579,37 @@ } /** + * Tracking version of vmm_resize(). + */ +void * +vmm_resize_track(void *p, size_t osize, size_t nsize, + const char *file, int line) +{ + void *np; + + /* The resize point becomes the new allocation point (file, line) */ + vmm_free_record(p, osize, TRUE, file, line); + + np = vmm_resize(p, osize, nsize); + vmm_alloc_record(np, nsize, TRUE, file, line); + + return np; +} + +/** + * Tracking version of vmm_resize() for memory flagged as non-leaking. + */ +void * +vmm_resize_track_not_leaking(void *p, size_t osize, size_t nsize, + const char *file, int line) +{ + void *np; + + np = vmm_resize_track(p, osize, nsize, file, line); + return vmm_not_leaking(np); +} + +/** * Initialization of the VMM tracking. */ static void @@ -5107,8 +6638,8 @@ vmm_track_malloc_inited(void) { if (vmm_buffer.missed != 0) { - s_warning("VMM missed %zu initial tracking event%s", - vmm_buffer.missed, 1 == vmm_buffer.missed ? "" : "s"); + s_warning("VMM missed %'zu initial tracking event%s", + vmm_buffer.missed, plural(vmm_buffer.missed)); } } @@ -5119,12 +6650,12 @@ vmm_track_post_init(void) { if (vmm_buffer.max > 0 && vmm_debugging(0)) { - s_debug("VMM required %zu bufferred event%s", - vmm_buffer.max, 1 == vmm_buffer.max ? "" : "s"); + s_minidbg("VMM required %'zu bufferred event%s", + vmm_buffer.max, plural(vmm_buffer.max)); } if (vmm_nl_buffer.max > 0 && vmm_debugging(0)) { - s_debug("VMM required %zu bufferred non-leaking event%s", - vmm_nl_buffer.max, 1 == vmm_nl_buffer.max ? "" : "s"); + s_minidbg("VMM required %'zu bufferred non-leaking event%s", + vmm_nl_buffer.max, plural(vmm_nl_buffer.max)); } } @@ -5134,7 +6665,7 @@ * Log used pages, and record them among the `leaksort' set for future summary. */ static void -vmm_log_pages(const void *k, void *v, gpointer leaksort) +vmm_log_pages(const void *k, void *v, void *leaksort) { const struct page_track *pt = v; char ago32; @@ -5153,13 +6684,13 @@ return; #ifdef MALLOC_TIME - gm_snprintf(ago, sizeof ago, " %s", - short_time(delta_time(tm_time(), pt->atime))); + str_bprintf(ago, sizeof ago, " %s", + short_time_ascii(delta_time(tm_time(), pt->atime))); #else ago0 = '\0'; #endif /* MALLOC_TIME */ - s_warning("leaked %s page%s %p (%zu bytes) from \"%s:%d\"%s", + s_warning("leaked %s page%s %p (%'zu bytes) from \"%s:%d\"%s", track_mem(pt->user), pt->size > kernel_pagesize ? "s" : "", k, pt->size, pt->file, pt->line, ago);
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/vmm.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/vmm.h
Changed
@@ -1,6 +1,6 @@ /* - * Copyright (c) 2006, Christian Biere - * Copyright (c) 2006, 2009-2010 Raphael Manfredi + * Copyright (c) 2006 Christian Biere + * Copyright (c) 2006, 2009-2010, 2013 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -31,7 +31,7 @@ * @author Christian Biere * @date 2006 * @author Raphael Manfredi - * @date 2006, 2009-2010 + * @date 2006, 2009-2010, 2013 */ #ifndef _vmm_h_ @@ -49,6 +49,7 @@ #define vmm_alloc0(s) vmm_alloc0_track((s), _WHERE_, __LINE__) #define vmm_free(p,s) vmm_free_track((p), (s), TRUE, _WHERE_, __LINE__) #define vmm_core_free(p,s) vmm_free_track((p), (s), FALSE, _WHERE_, __LINE__) +#define vmm_resize(p,o,n) vmm_resize_track((p),(o),(n), _WHERE_, __LINE__) #define vmm_shrink(p,s,n) \ vmm_shrink_track((p), (s), (n), TRUE, _WHERE_, __LINE__) @@ -59,52 +60,87 @@ #define vmm_alloc_not_leaking(s) \ vmm_alloc_track_not_leaking((s), _WHERE_, __LINE__) +#define vmm_core_alloc_not_leaking(s) \ + vmm_core_alloc_track_not_leaking((s), _WHERE_, __LINE__) + +#define vmm_resize_not_leaking(p,o,n) \ + vmm_resize_track_not_leaking((p), (o), (n), _WHERE_, __LINE__) + #endif /* TRACK_VMM && !VMM_SOURCE */ #ifdef TRACK_VMM -void *vmm_alloc_track(size_t size, gboolean user_mem, - const char *file, int line) WARN_UNUSED_RESULT G_GNUC_MALLOC; +void *vmm_alloc_track(size_t size, bool user_mem, + const char *file, int line) G_MALLOC; void *vmm_alloc_track_not_leaking(size_t size, - const char *file, int line) WARN_UNUSED_RESULT G_GNUC_MALLOC; + const char *file, int line) G_MALLOC; +void *vmm_core_alloc_track_not_leaking(size_t size, + const char *file, int line) G_MALLOC; void *vmm_alloc0_track(size_t size, - const char *file, int line) WARN_UNUSED_RESULT G_GNUC_MALLOC; -void vmm_free_track(void *p, size_t size, gboolean user_mem, + const char *file, int line) G_MALLOC; +void *vmm_resize_track_not_leaking(void *p, size_t osize, size_t nsize, + const char *file, int line) WARN_UNUSED_RESULT; +void vmm_free_track(void *p, size_t size, bool user_mem, const char *file, int line); -void vmm_shrink_track(void *p, size_t o, size_t n, gboolean user_mem, +void vmm_shrink_track(void *p, size_t o, size_t n, bool user_mem, const char *file, int line); +void *vmm_resize_track(void *p, size_t o, size_t n, + const char *file, int line) WARN_UNUSED_RESULT; -void *vmm_alloc_notrack(size_t size) WARN_UNUSED_RESULT G_GNUC_MALLOC; +void *vmm_alloc_notrack(size_t size) G_MALLOC; void vmm_free_notrack(void *p, size_t size); #else /* !TRACK_VMM */ -#define vmm_alloc_not_leaking(s) vmm_alloc(s) +#define vmm_alloc_not_leaking(s) vmm_alloc(s) +#define vmm_core_alloc_not_leaking(s) vmm_core_alloc(s) +#define vmm_resize_not_leaking(p,o,n) vmm_resize((p),(o),(n)) #endif /* TRACK_VMM */ #if defined(VMM_SOURCE) || !defined(TRACK_VMM) -void *vmm_alloc(size_t size) WARN_UNUSED_RESULT G_GNUC_MALLOC; -void *vmm_core_alloc(size_t size) WARN_UNUSED_RESULT G_GNUC_MALLOC; -void *vmm_alloc0(size_t size) WARN_UNUSED_RESULT G_GNUC_MALLOC; +void *vmm_alloc(size_t size) G_MALLOC; +void *vmm_core_alloc(size_t size) G_MALLOC; +void *vmm_alloc0(size_t size) G_MALLOC; void vmm_free(void *p, size_t size); void vmm_core_free(void *p, size_t size); void vmm_shrink(void *p, size_t size, size_t new_size); void vmm_core_shrink(void *p, size_t size, size_t new_size); +void *vmm_resize(void *p, size_t size, size_t new_size) WARN_UNUSED_RESULT; #endif /* VMM_SOURCE || !TRACK_VMM */ +#ifdef XMALLOC_SOURCE +void vmm_early_init(void); +#endif /* XMALLOC_SOURCE */ + +/** + * VMM allocation strategies. + */ +enum vmm_strategy { + VMM_STRATEGY_SHORT_TERM, /**< For short-lived processes */ + VMM_STRATEGY_LONG_TERM /**< For long-lived processes */ +}; + +void vmm_set_strategy(enum vmm_strategy strategy); + struct logagent; -size_t round_pagesize(size_t n) G_GNUC_PURE; -size_t compat_pagesize(void) G_GNUC_PURE; -const void *vmm_page_start(const void *p) G_GNUC_PURE; +size_t round_pagesize(size_t n) G_PURE; +size_t compat_pagesize(void) G_PURE; +const void *vmm_page_start(const void *p) G_PURE; +const void *vmm_page_next(const void *p) G_PURE; const void *vmm_trap_page(void); -size_t vmm_page_count(size_t size) G_GNUC_PURE; -gboolean vmm_is_fragment(const void *base, size_t size); -gboolean vmm_is_relocatable(const void *base, size_t size); -gboolean vmm_is_native_pointer(const void *p); -gboolean vmm_grows_upwards(void) G_GNUC_PURE; - -void set_vmm_debug(guint32 level); -gboolean vmm_is_debugging(guint32 level) G_GNUC_PURE; -void vmm_init(const void *sp); +size_t vmm_page_count(size_t size) G_PURE; +bool vmm_is_fragment(const void *base, size_t size); +bool vmm_is_relocatable(const void *base, size_t size); +bool vmm_is_native_pointer(const void *p); +bool vmm_is_stack_pointer(const void *p, const void *top) G_PURE; +bool vmm_grows_upwards(void) G_PURE; + +void set_vmm_debug(uint32 level); +bool vmm_is_debugging(uint32 level) G_PURE; +void vmm_crash_mode(void); +bool vmm_is_crashing(void); +bool vmm_is_extending(void); +void vmm_init(void); +bool vmm_is_inited(void); void vmm_memusage_init(void); void vmm_malloc_inited(void); void vmm_post_init(void); @@ -116,6 +152,12 @@ void vmm_dump_stats(void); void vmm_dump_stats_log(struct logagent *la, unsigned options); void vmm_dump_usage_log(struct logagent *la, unsigned options); +void vmm_dump_hole_log(struct logagent *la); +void vmm_dump_pcache_log(struct logagent *la); + +struct sha1; + +void vmm_stats_digest(struct sha1 *digest); void vmm_madvise_free(void *p, size_t size); void vmm_madvise_normal(void *p, size_t size);
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/vsort.c
Added
@@ -0,0 +1,542 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Virtual sorting entry points to dynamically select the best sorting routine + * based on local benchmarking. + * + * We measure several algorithms with four different scenarios: large and small + * arrays on one dimension, random or almost-sorted arrays on another dimension. + * The drawback is that to get meaningful results we need to do enough + * iterations, which is of course slowing down the process for a few seconds. + * + * The vsort() entry point can then be used to sort arrays for which we cannot + * have a priori knowledge that they are almost sorted. + * + * The vsort_almost() entry point should be used when the array is almost + * sorted, since the algorithm used in that case could be different than the + * one selected for vsort(). + * + * These routines work even when vsort_init() was not called: the hardwired + * default sorting routine is set to our xqsort(), which is a reasonably fast + * quicksort implementation with no memory allocation. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#include "common.h" + +#ifdef I_MATH +#include <math.h> /* For log() */ +#endif + +#include "vsort.h" + +#include "log.h" +#include "op.h" +#include "random.h" +#include "smsort.h" +#include "tm.h" +#include "tqsort.h" +#include "unsigned.h" +#include "vmm.h" +#include "xsort.h" + +#include "override.h" /* Must be the last header included */ + +#define VSORT_LOOPS 16 /* Targeted amount of benchmarking loops */ +#define VSORT_ATTEMPTS 5 /* Max retry attempts made when doubling */ +#define VSORT_ITEMS 8192 /* A rather large amount of items */ +#define VSORT_SMALL_ITEMS 128 /* Upper limit for small arrays */ +#define VSORT_HUGE_ITEMS TQSORT_ITEMS /* Huge item amount */ +#define VSORT_MIN_SECS 0.01 /* Lowest CPU time we want to spend */ + +struct vsort_timing { + void *data; /* The data to sort */ + void *copy; /* The arena where we sort copied data */ + size_t items; /* Amount of items to sort */ + size_t isize; /* Item size */ + size_t len; /* Bytes used by `data' and `copy' VMM chunks */ +}; + +typedef void (*vsort_timer_t)(struct vsort_timing *vt, size_t loops); +typedef void (*vsort_t)(void *b, size_t n, size_t s, cmp_fn_t cmp); + +#define VSORT_SMALL 0U /* Index in vsort_table for small arrays */ +#define VSORT_LARGE 1U /* Index in vsort_table for large arrays */ +#define VSORT_HUGE 2U /* Index in vsort_table for huge arrays */ + +static struct { + vsort_t v_sort; /* Sort routine to use for general arrays */ + vsort_t v_sort_almost; /* Sort routine to use for almost-sorted arrays */ +} vsort_table = { + { xqsort, xqsort }, /* Default if they do not call vsort_init() */ + { xqsort, xqsort }, /* Default if they do not call vsort_init() */ + { tqsort, xqsort }, /* Default if they do not call vsort_init() */ +}; + +static int +vsort_long_cmp(const void *a, const void *b) +{ + const long * const la = a, * const lb = b; + + return CMP(*la, *lb); +} + +static void +vsort_qsort(struct vsort_timing *vt, size_t loops) +{ + size_t n = loops; + + while (n-- > 0) { + memcpy(vt->copy, vt->data, vt->len); + qsort(vt->copy, vt->items, vt->isize, vsort_long_cmp); + } +} + +static void +vsort_xsort(struct vsort_timing *vt, size_t loops) +{ + size_t n = loops; + + while (n-- > 0) { + memcpy(vt->copy, vt->data, vt->len); + xsort(vt->copy, vt->items, vt->isize, vsort_long_cmp); + } +} + +static void +vsort_xqsort(struct vsort_timing *vt, size_t loops) +{ + size_t n = loops; + + while (n-- > 0) { + memcpy(vt->copy, vt->data, vt->len); + xqsort(vt->copy, vt->items, vt->isize, vsort_long_cmp); + } +} + +static void +vsort_tqsort(struct vsort_timing *vt, size_t loops) +{ + size_t n = loops; + + while (n-- > 0) { + memcpy(vt->copy, vt->data, vt->len); + tqsort(vt->copy, vt->items, vt->isize, vsort_long_cmp); + } +} + +static void +vsort_smsort(struct vsort_timing *vt, size_t loops) +{ + size_t n = loops; + + while (n-- > 0) { + memcpy(vt->copy, vt->data, vt->len); + smsort(vt->copy, vt->items, vt->isize, vsort_long_cmp); + } +} + +/** + * Computes amount of timing loops to run depending on the amount of items + * to sort, to keep the time reasonable. + */ +static size_t +vsort_loops(size_t items) +{ + double target, used; + + /* + * Assume VSORT_LOOPS loops for VSORT_HUGE_ITEMS items will take about the + * time we want to spend for a single test. If we have less items, we + * can do more loops. + * + * We know the running time is O(n * log n) where n is the amount of items. + */ + + target = VSORT_HUGE_ITEMS * log(VSORT_HUGE_ITEMS); + used = items * log(items); + + return MAX(target / used * VSORT_LOOPS, 1); +} + +/** + * Time sorting routine. + * + * @param f the function we call and compute the average execution time for + * @param vt describes the data we're sorting, given as input to ``f'' + * @param loops amount of loops to perform, possibly updated (increased) + * + * @return real clock-time in seconds for one single iteration. + */ +static double +vsort_timeit(vsort_timer_t f, struct vsort_timing *vt, size_t *loops) +{ + double start, end; + size_t n = *loops; + double elapsed = 0.0, telapsed = 0.0; + uint attempts = 0; + tm_t tstart, tend; + +retry: + /* + * Safety against broken clocks which would stall the process forever if + * we were to continue. + */ + + if (attempts++ >= VSORT_ATTEMPTS) { + s_critical("%s(): " + "either CPU is too fast or kernel clock resultion too low: " + "elapsed time is %F secs after %zu loops", + G_STRFUNC, elapsed, n); + goto done; + } + + /* + * This is a pure CPU grinding algorithm, hence we monitor the amount of + * CPU used and not the wall clock: if the process gets suspended in the + * middle of the test, that would completely taint the results. + * + * However, in multi-threaded processes, the accounted CPU time is for + * the whole process, and this is not fair for tqsort() which uses multiple + * threads in order to minimize the overall elapsed time. + * + * Hence we measure both the CPU time and the wall-clock time and pick + * the lowest figure. + */ + + (*f)(vt, 1); /* Blank run to offset effect of memory caching */ + + tm_now_exact(&tstart); + tm_cputime(&start, NULL); + (*f)(vt, n); + tm_cputime(&end, NULL); + tm_now_exact(&tend); + + elapsed = end - start; + telapsed = tm_elapsed_f(&tend, &tstart); + + /* + * If the machine is too powerful (or the clock granularity too low), + * double the amount of items and retry. + */ + + if (elapsed < VSORT_MIN_SECS) { + *loops = n = n * 2; + goto retry; + } + + elapsed = MIN(elapsed, telapsed); + +done: + return elapsed / n; +} + +/** + * Sort array in-place with ``n'' elements of size ``s'' using fastest routine. + * The base ``b'' points to the start of the array. + * + * The contents are sorted in ascending order, as defined by the comparison + * function ``cmp''. + */ +void +vsort(void *b, size_t n, size_t s, cmp_fn_t cmp) +{ + uint idx = n <= VSORT_SMALL_ITEMS ? VSORT_SMALL : + n >= VSORT_HUGE_ITEMS ? VSORT_HUGE : VSORT_LARGE; + vsort_t f = vsort_tableidx.v_sort; + + (*f)(b, n, s, cmp); +} + +/** + * Sort almost-sorted array in-place with ``n'' elements of size ``s'' using + * the fastest routine. + * The base ``b'' points to the start of the array. + * + * The contents are sorted in ascending order, as defined by the comparison + * function ``cmp''. + */ +void +vsort_almost(void *b, size_t n, size_t s, cmp_fn_t cmp) +{ + uint idx = n <= VSORT_SMALL_ITEMS ? VSORT_SMALL : + n >= VSORT_HUGE_ITEMS ? VSORT_HUGE : VSORT_LARGE; + vsort_t f = vsort_tableidx.v_sort_almost; + + (*f)(b, n, s, cmp); +} + +/** + * Randomly swap 1/128 of the array items. + */ +static void +vsort_perturb_sorted_array(void *array, size_t cnt, size_t isize) +{ + size_t n; + size_t i; + + n = cnt / 128; + + for (i = 0; i < n; i++) { + size_t a = random_value(cnt - 1); + size_t b = random_value(cnt - 1); + void *x = ptr_add_offset(array, a * isize); + void *y = ptr_add_offset(array, b * isize); + + SWAP(x, y, isize); + } +} + +struct vsort_testing { + vsort_timer_t v_timer; + vsort_t v_routine; + double v_elapsed; + int v_weight; + char *v_name; +}; + +static int +vsort_testing_cmp(const void *a, const void *b) +{ + int c; + const struct vsort_testing * const va = a, * const vb = b; + + /* + * If the two items being compared have the same execution time, + * prefer the one with the highest weight. + */ + + c = CMP(va->v_elapsed, vb->v_elapsed); + return 0 == c ? CMP(vb->v_weight, va->v_weight) : c; +} + +/* + * Always substitute xqsort() for tqsort() if handling less than + * TQSORT_ITEMS at a time since tqsort() will always remap to xqsort() + * in that case. + */ +static vsort_t +vsort_routine(const vsort_t routine, size_t items) +{ + if (items < TQSORT_ITEMS && routine == tqsort) + return xqsort; + + return routine; +} + +static const char * +vsort_routine_name(const char *name, size_t items) +{ + if (items < TQSORT_ITEMS && 0 == strcmp(name, "tqsort")) + return "xqsort"; + + return name; +} + +/** + * Check which of qsort(), xqsort(), xsort() or smsort() is best for sorting + * aligned arrays with a native item size of OPSIZ. At identical performance + * level, we prefer our own sorting algorithms instead of libc's qsort() for + * memory allocation purposes. + * + * @param items amount of items to use in the sorted array + * @param idx index of the virtual routine to update + * @param verbose whether to be verbose + * @param which either "large" or "small", for logging + */ +static void +vsort_init_items(size_t items, unsigned idx, int verbose, const char *which) +{ + struct vsort_testing tests = { + { vsort_qsort, qsort, 0.0, 0, "qsort" }, + { vsort_xqsort, xqsort, 0.0, 2, "xqsort" }, + { vsort_xsort, xsort, 0.0, 1, "xsort" }, + { vsort_tqsort, tqsort, 0.0, 1, "tqsort" }, + { vsort_smsort, smsort, 0.0, 1, "smsort" }, /* Only for almost sorted */ + }; + size_t len = items * OPSIZ; + struct vsort_timing vt; + size_t loops, highest_loops; + unsigned i; + + g_assert(uint_is_non_negative(idx)); + g_assert(idx < N_ITEMS(vsort_table)); + + vt.data = vmm_alloc(len); + vt.copy = vmm_alloc(len); + vt.items = items; + vt.isize = OPSIZ; + vt.len = len; + random_bytes(vt.data, len); + + highest_loops = loops = vsort_loops(items); + + /* The -1 below is to avoid benchmarking smsort() for the general case */ + +retry_random: + for (i = 0; i < N_ITEMS(tests) - 1; i++) { + testsi.v_elapsed = vsort_timeit(testsi.v_timer, &vt, &loops); + + if (verbose > 1) { + s_debug("%s() took %.4f secs for %s array (%zu loops)", + testsi.v_name, testsi.v_elapsed * loops, which, loops); + } + + if (loops != highest_loops) { + highest_loops = loops; + /* Redo all the tests if the number of timing loops changes */ + if (i != 0) + goto retry_random; + } + } + + /* + * When dealing with a large amount of items, redo the tests twice with + * another set of random bytes to make sure we're not hitting a special + * ordering case. + */ + + if (items >= VSORT_ITEMS) { + unsigned j; + + for (j = 0; j < 2; j++) { + random_bytes(vt.data, len); + + for (i = 0; i < N_ITEMS(tests) - 1; i++) { + testsi.v_elapsed += + vsort_timeit(testsi.v_timer, &vt, &loops); + + if (verbose > 1) { + s_debug("%s() spent %.6f secs total for %s array", + testsi.v_name, testsi.v_elapsed, which); + } + + if (loops != highest_loops) { + highest_loops = loops; + /* Redo all the tests if the number of loops changes */ + s_info("%s(): restarting %s array tests with %zu loops", + G_STRFUNC, which, loops); + goto retry_random; + } + } + } + } + + xqsort(tests, N_ITEMS(tests) - 1, sizeof tests0, vsort_testing_cmp); + + vsort_tableidx.v_sort = vsort_routine(tests0.v_routine, items); + + if (verbose) { + s_info("vsort() will use %s() for %s arrays", + vsort_routine_name(tests0.v_name, items), which); + } + + /* + * Now sort the data, then randomly perturb them by swapping a few items + * so that the array is almost sorted. + */ + + xqsort(vt.data, vt.items, vt.isize, vsort_long_cmp); + vsort_perturb_sorted_array(vt.data, vt.items, vt.isize); + +retry_sorted: + for (i = 0; i < N_ITEMS(tests); i++) { + testsi.v_elapsed = vsort_timeit(testsi.v_timer, &vt, &loops); + + if (verbose > 1) { + s_debug("%s() on almost-sorted took %.4f secs " + "for %s array (%zu loops)", + testsi.v_name, testsi.v_elapsed * loops, which, loops); + } + + if (loops != highest_loops) { + highest_loops = loops; + /* Redo all the tests if the number of timing loops changes */ + if (i != 0) + goto retry_sorted; + } + } + + xqsort(tests, N_ITEMS(tests), sizeof tests0, vsort_testing_cmp); + + vsort_tableidx.v_sort_almost = vsort_routine(tests0.v_routine, items); + + if (verbose) { + s_info("vsort_almost() will use %s() for %s arrays", + vsort_routine_name(tests0.v_name, items), which); + } + + vmm_free(vt.data, len); + vmm_free(vt.copy, len); +} + +/** + * Check which of qsort() or xqsort() is best for sorting aligned arrays with + * a native item size of OPSIZ. + */ +void +vsort_init(int verbose) +{ + tm_t start, end; + bool blockable = TRUE; + + STATIC_ASSERT(VSORT_HUGE_ITEMS > VSORT_ITEMS); + STATIC_ASSERT(VSORT_ITEMS > VSORT_SMALL_ITEMS); + + if (verbose) + s_info("benchmarking sort routines to select the best one..."); + + /* + * Allow main thread to block during the duration of our tests. + * This is needed since tqsort() can create threads and block. + */ + + if (thread_is_main() && !thread_main_is_blockable()) { + thread_set_main(TRUE); + blockable = FALSE; + } + + tm_now_exact(&start); + vsort_init_items(VSORT_HUGE_ITEMS, VSORT_HUGE, verbose, "huge"); + vsort_init_items(VSORT_ITEMS, VSORT_LARGE, verbose, "large"); + vsort_init_items(VSORT_SMALL_ITEMS, VSORT_SMALL, verbose, "small"); + tm_now_exact(&end); + + if (verbose) + s_info("vsort() benchmarking took %F secs", tm_elapsed_f(&end, &start)); + + /* + * Restore non-blockable main thread if needed. + */ + + if (!blockable) + thread_set_main(FALSE); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/vsort.h
Added
@@ -0,0 +1,48 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Virtual sorting entry point to dynamically select the best sorting routine. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _vsort_h_ +#define _vsort_h_ + +/* + * Public interface. + */ + +void vsort_init(int verbose); + +void vsort(void *b, size_t n, size_t s, cmp_fn_t cmp); +void vsort_almost(void *b, size_t n, size_t s, cmp_fn_t cmp); + +#endif /* _vsort_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/waiter.c
Added
@@ -0,0 +1,866 @@ +/* + * Copyright (c) 2013, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Asynchronous waiter. + * + * This is used to receive (asynchronous) events from another thread whilst + * waiting in a I/O loop: the waiter is select()able via a dedicated file + * descriptor and can therefore trigger a processing callback. + * + * A waiter can be added to any condition variable to be informed when the + * predicate protected by the condition variable may have changed. This is + * not the same as waiting directly on the condition variable because that is + * a blocking operation, whereas the notification happens asynchronously. + * + * A waiter can be used to block a thread until a proper notification occurs. + * If the waiter has been inserted into several condition variables, this + * allows the thread to wait for multiple events, although it will have to + * determine for itself which one occurred since there is no data sent to + * indicate the source of the event. + * + * A waiter can spawn children objects which will share the same waiting + * I/O handle. When different children waiter objects are inserted into + * different condition variables, then the waiter can determine precisely + * which conditions have triggered by inspecting each child in turn. + * + * The waiter can also be used as an inter-thread event signalling mechanism + * if its address is known by another thread, to pop out the waiting thread + * out of its select() and process the event as it would process any other + * pending I/O condition. + * + * One proper usage of a waiter is for the I/O-driven thread to create it, + * insert the waiter's file descriptor into its set of monitored files and + * install the appropriate callback to its main waiting loop. + * + * When an event is received, it must be acknowledged with waiter_ack() or + * the waiter will keep its I/O readiness status. + * + * Each waiter is reference-counted and will be disposed of when its last + * reference is gone. At that point, its file descriptor is closed and must + * no longer be used as it could be re-assigned for some other purpose. + * This means the waiter object must be removed from the I/O event loop before + * it gets destroyed. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#include "waiter.h" +#include "elist.h" +#include "fd.h" +#include "spinlock.h" +#include "thread.h" /* For thread_assert_no_locks() */ +#include "walloc.h" + +#include "override.h" /* Must be the last header included */ + +enum waiter_magic { + WAITER_MAGIC = 0x61b5de89, + WAITER_MASTER_MAGIC = 0x6337f7f1 +}; + +struct mwaiter; + +/** + * An asynchronous waiter (child). + */ +struct waiter { + enum waiter_magic magic; /* Magic number */ + int refcnt; /* Reference count */ + bool notified; /* Whether we received a notification */ + struct mwaiter *parent; /* Parent master waiter */ + void *data; /* Opaque data attached to waiter */ + link_t lk; /* List of siblings */ +}; + +/** + * A master waiter. + */ +struct mwaiter { + struct waiter waiter; + /* Extra fields for the master */ + socket_fd_t wfd2; /* Socket-pair used for waiting / signalling */ + uint m_notified:1; /* Notification sent on the pipe */ + uint m_blocking:1; /* One thread is blocked reading the pipe */ + size_t children; /* Amount of children, for assertions */ + elist_t idle; /* List of idle children */ + elist_t active; /* List of active children */ + spinlock_t lock; /* Thread-safe lock */ +}; + +static inline void +waiter_check(const struct waiter * const w) +{ + g_assert(w != NULL); + g_assert(WAITER_MAGIC == w->magic || WAITER_MASTER_MAGIC == w->magic); +} + +static inline void +waiter_master_check(const struct mwaiter * const mw) +{ + g_assert(mw != NULL); + g_assert(WAITER_MASTER_MAGIC == mw->waiter.magic); +} + +static inline bool +waiter_is_child(const struct waiter * const w) +{ + return WAITER_MAGIC == w->magic; +} + +static struct mwaiter * +cast_to_mwaiter(const struct waiter *w) +{ + g_assert(WAITER_MASTER_MAGIC == w->magic); + + return (struct mwaiter *) w; +} + +#define MWAITER_LOCK(m) spinlock(&(m)->lock) +#define MWAITER_UNLOCK(m) spinunlock(&(m)->lock) + +#define MWAITER_LOCK_QUICK(m) spinlock_hidden(&(m)->lock) +#define MWAITER_UNLOCK_QUICK(m) spinunlock_hidden(&(m)->lock) + +#define MWAITER_LOCK_IS_HELD(m) spinlock_is_held(&(m)->lock) + +#ifdef HAS_SOCKETPAIR +#define INVALID_FD INVALID_SOCKET +#else +#define INVALID_FD -1 +#endif + +/** + * Create a new asynchronous master waiter. + * + * @param data opaque data attached to waiter + * + * @return new master waiter object. + */ +waiter_t * +waiter_make(void *data) +{ + struct mwaiter *mw; + waiter_t *w; + + WALLOC0(mw); + w = &mw->waiter; + w->magic = WAITER_MASTER_MAGIC; + w->refcnt = 1; + elist_init(&mw->idle, offsetof(struct waiter, lk)); + elist_init(&mw->active, offsetof(struct waiter, lk)); + spinlock_init(&mw->lock); + w->parent = mw; + w->data = data; + + elist_append(&mw->idle, w); /* Inserts itself in the idle list */ + mw->children = 1; /* And count itself as its child */ + mw->wfd0 = INVALID_FD; + mw->wfd1 = INVALID_FD; + + return w; +} + +/** + * Spawn a new child, associated with supplied opaque data. + * + * If the given parent is a child waiter, then we spawn a sibling instead. + * + * @param wp the parent waiter out of which we need to spawn a new child + * @param data the data to associate to the new waiter object + */ +waiter_t * +waiter_spawn(const waiter_t *wp, void *data) +{ + waiter_t *w; + struct mwaiter *mw; + + waiter_check(wp); + + mw = wp->parent; + waiter_master_check(mw); + + WALLOC0(w); + w->magic = WAITER_MAGIC; + w->refcnt = 1; + w->data = data; + w->parent = mw; + + MWAITER_LOCK(mw); + elist_append(&mw->idle, w); /* New waiter is idle by default */ + mw->children++; /* One new child */ + MWAITER_UNLOCK(mw); + + return w; +} + +/** + * Called to close master file descriptors. + * + * The master waiter must be locked upon entry. + */ +static void +waiter_close_master_fd(struct mwaiter *mw) +{ + g_assert(MWAITER_LOCK_IS_HELD(mw)); + +#ifdef HAS_SOCKETPAIR + if (INVALID_SOCKET != mw->wfd0) { + s_close(mw->wfd0); + s_close(mw->wfd1); + mw->wfd0 = INVALID_SOCKET; + mw->wfd1 = INVALID_SOCKET; + } +#else /* !HAS_SOCKETPAIR */ + if (-1 != mw->wfd0) { + fd_close(&mw->wfd0); + fd_close(&mw->wfd1); + } +#endif /* HAS_SOCKETPAIR */ +} + +/** + * Close the waiter's file descriptors when we no longer need I/O waiting. + */ +void +waiter_close_fd(waiter_t *w) +{ + struct mwaiter *mw; + + waiter_check(w); + + mw = w->parent; + waiter_master_check(mw); + + MWAITER_LOCK(mw); + waiter_close_master_fd(mw); + MWAITER_UNLOCK(mw); +} + +/** + * Destroy a waiter. + * + * This routine must be called with the master waiter locked to avoid race + * conditions with a thread waiting (to release the master) for all its children + * to be gone by monitoring its child count. + * + * Upon return the master waiter is unlocked only if it was given as argument. + */ +static void +waiter_free(waiter_t *w) +{ + waiter_check(w); + g_assert(0 == w->refcnt); + + if (WAITER_MASTER_MAGIC == w->magic) { + struct mwaiter *mw = cast_to_mwaiter(w); + + g_assert(0 == ptr_cmp(w->parent, mw)); /* Proper master */ + g_assert(MWAITER_LOCK_IS_HELD(mw)); + + /* + * One should not free a master with children waiters. + * + * If this becomes a problem (difficult ordered destruction) + * then we can always promote one of the children to the master + * status by re-parenting all the children but one. + * + * But until then, fatal error... + */ + + g_assert_log(1 == mw->children, + "%s(): attempting to free master waiter with %zu children", + G_STRFUNC, mw->children); + + /* The master must be the only one left in the lists */ + g_assert(1 == elist_count(&mw->idle) + elist_count(&mw->active)); + + waiter_close_master_fd(mw); + spinlock_destroy(&mw->lock); /* Unlocks the waiter */ + + w->magic = 0; + WFREE(mw); + } else { + struct mwaiter *mw = w->parent; + elist_t *list; + + g_assert(0 != ptr_cmp(mw, w)); /* Or it would be a master! */ + g_assert(MWAITER_LOCK_IS_HELD(mw)); + + /* + * Remove the child from the master's list. + * The one where it belongs to is given by its status. + */ + + list = w->notified ? &mw->active : &mw->idle; + elist_remove(list, w); + mw->children--; + + g_assert(mw->children >= 1); /* The master remains, at least */ + + /* Master waiter remains locked */ + + w->magic = 0; + WFREE(w); + } +} + +/** + * Signal the waiter held in the specified master waiter. + * + * @param mw the master waiter + * @param w the waiter to notify (can be mw itself) + */ +static void +waiter_signal_internal(struct mwaiter *mw, waiter_t *w) +{ + g_assert(MWAITER_LOCK_IS_HELD(mw)); + + if (!w->notified) { + w->notified = TRUE; + elist_remove(&mw->idle, w); + elist_append(&mw->active, w); + } + if (!mw->m_notified) { + char c = '\0'; + if G_UNLIKELY(INVALID_FD == mw->wfd0) { + mw->m_notified = TRUE; + } else if G_UNLIKELY(-1 == s_write(mw->wfd1, &c, 1)) { + s_minicarp("%s(): cannot notify about event: %m", G_STRFUNC); + } else { + mw->m_notified = TRUE; + } + } +} + +/** + * Add one reference to an asynchronous waiter. + * + * @return the referenced waiter. + */ +waiter_t * +waiter_refcnt_inc(waiter_t *w) +{ + waiter_check(w); + + atomic_int_inc(&w->refcnt); + return w; +} + +/** + * Remove one reference to an asynchronous waiter. + * + * If the reference count drops to 0, the waiter is freed. + * + * @return whether the waiter is still referenced. + */ +bool +waiter_refcnt_dec(waiter_t *w) +{ + bool ref; + struct mwaiter *mw; + + waiter_check(w); + + mw = w->parent; + waiter_master_check(mw); + + MWAITER_LOCK(mw); + + if (1 == atomic_int_dec(&w->refcnt)) { + bool is_master = !waiter_is_child(w); + if (is_master && mw->m_blocking) { + s_error("%s(): removing last reference on blocking master waiter", + G_STRFUNC); + } + waiter_free(w); /* Unlocks the master waiter if is_master */ + if (is_master) + return FALSE; + ref = FALSE; + + /* Master still valid and locked */ + + waiter_master_check(mw); + g_assert(MWAITER_LOCK_IS_HELD(mw)); + } else { + ref = TRUE; + } + + /* + * If the master is suspended and it has no more children and just one + * reference, we need to unblock it or it will stay blocked forever. + */ + + if (mw->m_blocking && 1 == mw->children && 1 == mw->waiter.refcnt) + waiter_signal_internal(mw, &mw->waiter); + + MWAITER_UNLOCK(mw); + + return ref; +} + +/** + * Destroy reference to waiter and nullify its pointer. + */ +void +waiter_destroy_null(waiter_t **w_ptr) +{ + waiter_t *w = *w_ptr; + + if (w != NULL) { + waiter_refcnt_dec(w); + *w_ptr = NULL; + } +} + +/** + * Signal the waiter. + */ +void +waiter_signal(waiter_t *w) +{ + struct mwaiter *mw; + + waiter_check(w); + + /* + * It does not matter whether this is the master waiter or one of its + * children since the master references itself. + */ + + mw = w->parent; + waiter_master_check(mw); + + MWAITER_LOCK(mw); + waiter_signal_internal(mw, w); + MWAITER_UNLOCK(mw); +} + +/** + * Clear the notification on the master waiter. + */ +static void +waiter_master_clear(struct mwaiter *mw) +{ + g_assert(spinlock_is_held(&mw->lock)); + + if (mw->m_notified) { + char c; + if G_UNLIKELY(-1 == s_read(mw->wfd0, &c, 1)) { + s_minicarp("%s(): cannot acknowledge event: %m", G_STRFUNC); + } else { + mw->m_notified = FALSE; + } + } +} + +/** + * Acknowledge reception of signal. + */ +void +waiter_ack(waiter_t *w) +{ + struct mwaiter *mw; + + waiter_check(w); + + /* + * It does not matter whether this is the master waiter or one of its + * children since the master references itself. + */ + + mw = w->parent; + waiter_master_check(mw); + + MWAITER_LOCK(mw); /* Could block if a bug, let's record this */ + + /* + * This routine is normally called when a signal has been received on + * the waiting object. However, if for some reason there is a race + * condition in other layers and no notification has been registered + * on this particular waiter object, we gracefully ignore it and loudly + * complain. + * --RAM, 2015-03-24 + * + * This assertion (which is soft, so no harm done) seems to only fail + * on Windows, with an empty active list whilst the master is not being + * flagged as notified either (the waiter being the master). Caller is + * the teq_io_callback() routine and the log typically says: + * + * (notified=n, blocking=n) with 1 child: idle=1, active=0 + * + * which is consistent with a spurious triggering of the I/O callback. + * --RAM, 2015-04-15 + */ + + g_soft_assert_log(w->notified, + "%s(): waiter %p, master %p (notified=%c, blocking=%c) " + "with %zu child%s: idle=%zu, active=%zu", + G_STRFUNC, w, mw, + mw->m_notified ? 'y' : 'n', + mw->m_blocking ? 'y' : 'n', + mw->children, 1 == mw->children ? "" : "ren", + elist_count(&mw->idle), elist_count(&mw->active)); + + if (w->notified) { + w->notified = FALSE; + elist_remove(&mw->active, w); + elist_append(&mw->idle, w); + } + + /* + * Regardless, clear notification information on the master waiter if + * a signal was sent on the notification channel (pipe or socketpair). + */ + + waiter_master_clear(mw); + + MWAITER_UNLOCK(mw); +} + +/** + * Check whether waiter has been notified. + */ +bool +waiter_notified(const waiter_t *w) +{ + waiter_check(w); + + /* + * The notification field is normally written with the spinlock taken + * on the master. We need to issue a manual (read) barrier now to make + * sure we have the proper value in the CPU cache (update could have been + * done on another CPU). This avoids having to take any lock. + */ + + atomic_mb(); + return w->notified; +} + +/** + * Get the waiter's reading file descriptor, for I/O waiting. + * + * This always returns the master file descriptor, when called on a child + * waiter object. + * + * @return the fd that can be inserted in poll() or select() to wait for events + */ +int +waiter_fd(const waiter_t *w) +{ + struct mwaiter *mw; + socket_fd_t fd; + bool need_event = FALSE; + + waiter_check(w); + + mw = w->parent; + waiter_master_check(mw); + + MWAITER_LOCK(mw); + + fd = mw->wfd0; + + if (INVALID_FD != fd) + goto done; + + /* + * We don't use a pipe() because Windows can only select() on sockets. + * So we use a socketpair() instead and we'll emulate that on Windows. + * Of course, since we use sockets we need to use s_read() and s_write() + * as well, again for our friend Windows. + * + * FIXME: + * On Linux, we could use eventfd() to save one file descriptor? Will + * need a new metaconfig unit. Only the master waiter needs a file + * descriptor, and we won't have many, so it's not a big win. + */ + +#ifdef HAS_SOCKETPAIR + if (-1 == socketpair(AF_LOCAL, SOCK_STREAM, 0, mw->wfd)) + s_error("%s(): socketpair() failed: %m", G_STRFUNC); +#else + if (-1 == pipe(mw->wfd)) + s_error("%s(): pipe() failed: %m", G_STRFUNC); +#endif + + fd = mw->wfd0; + + /* + * If we are already in the "notified" state, we will need to send us + * the event we could not receive before since we had not opened the + * communication channel. + */ + + need_event = mw->m_notified; + +done: + MWAITER_UNLOCK(mw); + + /* + * Portability note: we use s_write() here, even though we could be using + * a pipe if there is no socketpair()... However, s_write() only exists + * for Windows, and on UNIX s_write() is transparently remapped to write(). + * Given that on Windows we have socketpair(), because we emulate it, it is + * completely safe to use s_write(). + */ + + if (need_event) { + char c = '\0'; + if G_UNLIKELY(-1 == s_write(mw->wfd1, &c, 1)) { + s_minicarp("%s(): cannot notify ourselves about pending event: %m", + G_STRFUNC); + } + } + + return fd; +} + +/** + * How many times is the waiter object referenced? + * + * @return the current reference count of the waiter. + */ +int +waiter_refcnt(const waiter_t *w) +{ + waiter_check(w); + + atomic_mb(); + return w->refcnt; +} + +/** + * How many children does the waiter have? + * + * @return the amount of children, 0 meaning a child waiter. + */ +int +waiter_child_count(const waiter_t *w) +{ + waiter_check(w); + + if (waiter_is_child(w)) + return 0; + + atomic_mb(); + return cast_to_mwaiter(w)->children; +} + +/** + * @return the waiter's opaque data registered at creation time. + */ +void * +waiter_data(const waiter_t *w) +{ + waiter_check(w); + + atomic_mb(); + return w->data; +} + +/** + * Set the waiter's opaque data. + * + * @param w the waiter object + * @param data the new opaque data to set in the object + * + * @return the previous opaque data. + */ +void * +waiter_set_data(waiter_t *w, void *data) +{ + void *odata; + + waiter_check(w); + + /* + * Since we take no locks, we need the memory barriers to ensure the + * update is atomically seen on all CPUs. + */ + + atomic_mb(); + odata = w->data; + w->data = data; + atomic_mb(); + + return odata; +} + +/** + * Wait for one of our waiter to be signaled. + * + * This can be called on the master or on any of its children, but when the + * call returns, the object may not appear notified (spurious wakeup), + * especially if called on a child and another sibling gets notified. + * + * Only one thread is allowed to block at a time, others will not be blocked. + * + * The thread will be unblocked when the master waiter ends up with 1 reference + * count and 1 child (itself). + * + * @return TRUE if we blocked, FALSE if we were denied blocking because + * another thread is already waiting. + */ +bool +waiter_suspend(const waiter_t *w) +{ + struct mwaiter *mw; + char c; + bool allowed = TRUE; + + waiter_check(w); + + mw = w->parent; + waiter_master_check(mw); + + /* + * To block we'll need to open a communication channel... + */ + + if G_UNLIKELY(INVALID_FD == mw->wfd0) + (void) waiter_fd(w); + + /* + * Don't allow blocking if another thread is blocking on the waiter or + * when we just have one reference and no children: nobody will be able + * to signal us (a global memory reference does not count -- if a separate + * thread wants to signal us, it needs to reference count us). + * + * This is a safety precaution against programming errors, but it is by + * no means a guarantee against deadlocks or foreever blocks: we don't + * know we'll be signaled even if we blocked. + */ + + MWAITER_LOCK_QUICK(mw); + if (mw->m_blocking || (1 == mw->waiter.refcnt && 1 == mw->children)) + allowed = FALSE; + else + mw->m_blocking = TRUE; + MWAITER_UNLOCK_QUICK(mw); + + if (!allowed) + return FALSE; + + /* + * We're about to block, we must not hold any lock. + */ + + thread_assert_no_locks(G_STRFUNC); + + if G_UNLIKELY(-1 == s_read(mw->wfd0, &c, 1)) { + s_minicarp("%s(): could not receive event: %m", G_STRFUNC); + MWAITER_LOCK_QUICK(mw); + mw->m_blocking = FALSE; + MWAITER_UNLOCK_QUICK(mw); + } else { + MWAITER_LOCK_QUICK(mw); + mw->m_notified = FALSE; + mw->m_blocking = FALSE; + MWAITER_UNLOCK_QUICK(mw); + } + + return TRUE; +} + +/** + * Invoke callback on each notified waiter in the master waiter. + * + * The callback is passed each notified waiter object. The status is + * atomically reset to un-notified before invoking the callback, so + * there is no need to call waiter_ack(). + * + * @param w a waiter (can be a child waiter) + * @param cb the callback to invoke on each notified waiter + * @param data opaque callback data to propagate + * + * @return the amount of notified waiters we had. + */ +size_t +waiter_foreach_notified(const waiter_t *w, data_fn_t cb, void *data) +{ + struct mwaiter *mw; + waiter_t **notified = NULL, **p; + size_t i, count; + + waiter_check(w); + + mw = w->parent; + waiter_master_check(mw); + + /* + * Construct the list of notified waiter objects in "notified" and + * move all the notified objects back to the idle list after clearing + * their notified status. + */ + + MWAITER_LOCK(mw); + count = elist_count(&mw->active); + if (count != 0) { + link_t *lk; + + WALLOC_ARRAY(notified, count); + p = notified; + + ELIST_FOREACH(&mw->active, lk) { + waiter_t *wi = elist_data(&mw->active, lk); + + waiter_check(wi); + g_assert(wi->notified); + + *p++ = wi; + } + + for (i = 0, p = notified; i < count; i++) { + waiter_t *wi = *p++; + + elist_remove(&mw->active, wi); + elist_append(&mw->idle, wi); + wi->notified = FALSE; + } + } + waiter_master_clear(mw); + MWAITER_UNLOCK(mw); + + /* + * Now that we no longer hold the lock on the master waiter object, + * invoke the callbacks. This allows re-entrance in the code, if needed. + */ + + for (i = 0, p = notified; i < count; i++) { + waiter_t *wi = *p++; + (*cb)(wi, data); + } + + WFREE_ARRAY_NULL(notified, count); + + return count; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/waiter.h
Added
@@ -0,0 +1,64 @@ +/* + * Copyright (c) 2013, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Asynchronous waiter. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#ifndef _waiter_h_ +#define _waiter_h_ + +struct waiter; +typedef struct waiter waiter_t; + +/* + * Public interface. + */ + +waiter_t *waiter_make(void *data); +waiter_t *waiter_spawn(const waiter_t *wp, void *data); +waiter_t *waiter_refcnt_inc(waiter_t *w); +bool waiter_refcnt_dec(waiter_t *w); +void waiter_destroy_null(waiter_t **w_ptr) NON_NULL_PARAM((1)); + +void waiter_signal(waiter_t *w); +void waiter_ack(waiter_t *w); +bool waiter_notified(const waiter_t *w); +bool waiter_suspend(const waiter_t *w); + +int waiter_fd(const waiter_t *w); +void waiter_close_fd(waiter_t *w); +int waiter_refcnt(const waiter_t *w); +int waiter_child_count(const waiter_t *w); +void *waiter_data(const waiter_t *w); +void *waiter_set_data(waiter_t *w, void *data); + +#endif /* _waiter_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/walloc.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/walloc.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2013 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -25,21 +25,39 @@ * @ingroup lib * @file * - * Explicit-width block allocator, based on zalloc(). + * Explicit-width block allocator, based on zalloc() and tmalloc(). + * + * The zalloc() layer is the zone-allocator used by walloc_raw(). + * + * The tmalloc() layer is the thread-magazine allocator used by walloc() + * and which relies on walloc_raw() to allocate memory. + * + * The walloc_raw() / wfree_raw() routines are only visible from this + * file and cannot be used by the application. * * @author Raphael Manfredi - * @date 2002-2003 + * @date 2002-2003, 2013 */ #include "common.h" #include "walloc.h" -#include "halloc.h" + +#include "atomic.h" +#include "eslist.h" +#include "evq.h" /* For evq_is_inited() */ #include "log.h" +#include "mutex.h" +#include "once.h" #include "pow2.h" +#include "pslist.h" #include "spinlock.h" +#include "str.h" +#include "stringify.h" /* For SIZE_T_DEC_BUFLEN */ +#include "thread.h" /* For thread_small_id() */ +#include "tm.h" +#include "tmalloc.h" #include "unsigned.h" -#include "vmm.h" #include "xmalloc.h" #include "zalloc.h" @@ -51,12 +69,76 @@ #undef wrealloc #endif -#define WALLOC_MINCOUNT 8 /**< Minimum amount of structs in a chunk */ +#define WALLOC_MINCOUNT 8 /* Minimum amount of structs in a chunk */ +#define WZONE_SIZE (WALLOC_MAX / ZALLOC_ALIGNBYTES + 1) -#define WZONE_SIZE (WALLOC_MAX / ZALLOC_ALIGNBYTES + 1) +/** + * We use a thread magazine allocator for walloc() to be able to scale + * nicely when allocating concurrently, the magazine being backed by + * walloc_raw() to actually allocate memory. + */ +static tmalloc_t *wmagazineWZONE_SIZE; static struct zone *wzoneWZONE_SIZE; -static size_t halloc_threshold = -1; +static once_flag_t walloc_inited; +static bool walloc_stopped; +static size_t walloc_max = WALLOC_MAX; + +/** + * Lock protecting wzone updates. + */ +static spinlock_t walloc_slk = SPINLOCK_INIT; + +#define WALLOC_LOCK spinlock(&walloc_slk) +#define WALLOC_UNLOCK spinunlock(&walloc_slk) + +/** + * @return maximum user block size for walloc(). + */ +size_t +walloc_maxsize(void) +{ + return walloc_max - zalloc_overhead(); +} + +/** + * Initialize the width-based allocator, once. + */ +static void G_COLD +walloc_init_once(void) +{ + /* + * The zalloc() layer is not auto-initializing but the VMM layer is + * so there's no need to call vmm_init(). + */ + + zinit(); +} + +/** + * Enter crash mode: redirect all allocations to xmalloc() and avoid freeings. + */ +void G_COLD +walloc_crash_mode(void) +{ + /* + * This will stop all thread-magazine allocation, which is important + * since we no longer have locks during crashes. + */ + + walloc_stopped = TRUE; + ZERO(&wmagazine); + atomic_mb(); +} + +/** + * Initialize the width-based allocator. + */ +static inline void ALWAYS_INLINE +walloc_init_if_needed(void) +{ + ONCE_FLAG_RUN(walloc_inited, walloc_init_once); +} /* * Under REMAP_ZALLOC, do not define walloc(), wfree() and wrealloc(). @@ -93,16 +175,55 @@ g_assert(rounded == zalloc_round(rounded)); - if G_UNLIKELY((size_t) -1 == halloc_threshold) - walloc_init(); + walloc_init_if_needed(); /* * We're paying this computation/allocation cost once per size! * Create chunks capable of holding at least WALLOC_MINCOUNT structures. + * + * We don't create private zones because walloc() must be usable by + * any thread, hence we must use global (locked) zones. Using private + * zone would force tagging of allocated blocks with the thread that + * got them. And we would have to handle foreign thread returning, since + * it is very hard for a thread to guarantee that it will be freeing only + * the blocks it allocated. + * --RAM, 2012-12-22 */ - if (!(zone = zget(rounded, WALLOC_MINCOUNT))) - s_error("zget() failed?"); + if (!(zone = zget(rounded, WALLOC_MINCOUNT, FALSE))) + s_error("zget(%zu) failed?", rounded); + + return zone; +} + +/** + * Get zone for given rounded allocation size. + * + * @param rounded rounded allocation size + * @param allocate whether we should allocate a missing zone + * + * @return the zone corresponding to the requested size. + */ +static zone_t * +walloc_get_zone(size_t rounded, bool allocate) +{ + size_t idx; + zone_t *zone; + + idx = wzone_index(rounded); + + if G_UNLIKELY(NULL == (zone = wzoneidx)) { + WALLOC_LOCK; + + if (NULL == (zone = wzoneidx)) { + if (!allocate) + s_error("missing %zu-byte zone", rounded); + + zone = wzoneidx = wzone_get(rounded); + } + + WALLOC_UNLOCK; + } return zone; } @@ -112,52 +233,193 @@ * * The basics for this algorithm is to allocate from fixed-sized zones, which * are multiples of ZALLOC_ALIGNBYTES until WALLOC_MAX (e.g. 8, 16, 24, 40, ...) - * and to halloc()/xpmalloc() if size is greater than WALLOC_MAX. + * and to xmalloc() if size is greater than WALLOC_MAX. * Naturally, zones are allocated on demand only. * * @return a pointer to the start of the allocated block. */ -G_GNUC_HOT gpointer -walloc(size_t size) +static void * +walloc_raw(size_t size) { - static spinlock_t walloc_slk = SPINLOCK_INIT; zone_t *zone; size_t rounded = zalloc_round(size); - size_t idx; g_assert(size_is_positive(size)); - if (rounded > WALLOC_MAX) { + if G_UNLIKELY(walloc_stopped) + return xmalloc(size); + + if G_UNLIKELY(rounded > walloc_max) { /* Too big for efficient zalloc() */ - return size >= halloc_threshold ? halloc(size) : xpmalloc(size); + return xmalloc(size); } + zone = walloc_get_zone(rounded, TRUE); + + return zalloc(zone); +} + +/** + * Free a block allocated via walloc_raw(). + * + * The size is used to find the zone from which the block was allocated, or + * to determine that we actually xmalloc()'ed it so it gets xfree()'ed. + */ +static void +wfree_raw(void *ptr, size_t size) +{ + zone_t *zone; + size_t rounded = zalloc_round(size); + + g_assert(ptr != NULL); + g_assert(size_is_positive(size)); + + if G_UNLIKELY(walloc_stopped) + return; + + if G_UNLIKELY(rounded > walloc_max) { + xfree(ptr); + return; + } + + zone = walloc_get_zone(rounded, FALSE); + + zfree(zone, ptr); +} + +/** + * Get magazine depot for given rounded allocation size. + * + * @param rounded rounded allocation size + * + * @return the magazine depot corresponding to the requested size. + */ +static tmalloc_t * +walloc_get_magazine(size_t rounded) +{ + size_t idx; + tmalloc_t *depot; + idx = wzone_index(rounded); /* - * Must be made thread-safe because xmalloc() uses walloc() and when - * xmalloc() replaces the system malloc(), we can be in a multi-threaded - * environment due to GTK. - * --RAM, 2011-12-28 + * At runtime, after sufficient allocations have been done, all the + * necessary depots will have been created and we will no longer enter + * the if() block below. */ - if (NULL == (zone = wzoneidx)) { - spinlock(&walloc_slk); - if (NULL == (zone = wzoneidx)) - zone = wzoneidx = wzone_get(rounded); - spinunlock(&walloc_slk); + if G_UNLIKELY(NULL == (depot = wmagazineidx)) { + static mutex_t walloc_mtx = MUTEX_INIT; + static uint8 maginitWZONE_SIZE; + + /* + * The thread-magazine allocator needs the event queue, so if we're + * called too soon in the initialization process, we cannot enable + * object distribution through magazines. + */ + + if (!evq_is_inited()) + return NULL; /* Too soon */ + + if G_UNLIKELY(walloc_stopped) + return NULL; /* In crash mode or exiting */ + + /* + * Until thread_set_main() has been called, do not create magazines. + * If they call walloc_limit() to limit walloc() to a small subset + * of already created zones, we do not want a large magazine depot + * container to have already been created (these can be around 2 KiB). + */ + + if (!thread_set_main_was_called()) + return NULL; /* Too soon */ + + /* + * We need a mutex and the maginit protection to cut down + * on recursion during auto-initialization. + * + * Returning a NULL depot means that walloc() will reroute to + * walloc_raw(), which works because zalloc() is lighter to initialize. + */ + + mutex_lock(&walloc_mtx); + + if (NULL == (depot = wmagazineidx) && !maginitidx) { + char nameSTR_CONST_LEN("walloc-") + SIZE_T_DEC_BUFLEN + 1; + size_t zsize, zidx; + zone_t *zone; + + maginitidx = TRUE; + + /* + * Since zalloc() can round allocated blocks to avoid creating + * too many zones, we need to compute the actual size that will + * be used by zalloc(). + * + * Because the depot will need to allocate objects of that size, + * we can directly request the zone and then see which size this + * corresponds to. + */ + + zone = walloc_get_zone(rounded, TRUE); + zsize = zone_size(zone); + zidx = wzone_index(zsize); + + if (zsize != rounded) { + depot = wmagazinezidx; + + if (depot != NULL) { + wmagazineidx = depot; /* Shared zone size */ + goto done; + } + } + + str_bprintf(name, sizeof name, "walloc-%zu", zsize); + depot = wmagazineidx = wmagazinezidx = + tmalloc_create(name, zsize, walloc_raw, wfree_raw); + } + + done: + mutex_unlock(&walloc_mtx); } - return zalloc(zone); + return depot; +} + +/** + * Allocate memory from a magazine depot suitable for the given size, or + * via xmalloc() if the requested size is too large. + * + * @return a pointer to the start of the allocated block. + */ +void * G_HOT +walloc(size_t size) +{ + tmalloc_t *depot; + size_t rounded = zalloc_round(size); + + g_assert(size_is_positive(size)); + + if G_UNLIKELY(rounded > walloc_max) { + /* Too big for efficient zalloc() */ + return xmalloc(size); + } + + depot = walloc_get_magazine(rounded); + + if G_UNLIKELY(NULL == depot) + return walloc_raw(size); + + return tmalloc(depot); } /** * Same as walloc(), but zeroes the allocated memory before returning. */ -gpointer +void * walloc0(size_t size) { - gpointer p = walloc(size); + void *p = walloc(size); if (p != NULL) memset(p, 0, size); @@ -169,53 +431,151 @@ * Free a block allocated via walloc(). * * The size is used to find the zone from which the block was allocated, or - * to determine that we actually xpmalloc()'ed it so it gets xfree()'ed. + * to determine that we actually xmalloc()'ed it so it gets xfree()'ed. */ void -wfree(gpointer ptr, size_t size) +wfree(void *ptr, size_t size) { - zone_t *zone; size_t rounded = zalloc_round(size); - size_t idx; g_assert(ptr != NULL); g_assert(size_is_positive(size)); - if (rounded > WALLOC_MAX) { -#ifdef TRACK_ZALLOC - /* halloc_track() is going to walloc_track() which uses malloc() */ + if G_UNLIKELY(rounded > walloc_max) { xfree(ptr); + return; + } + +#ifdef TRACK_ZALLOC + wfree_raw(ptr, size); #else - if (rounded >= halloc_threshold) { - hfree(ptr); + { + tmalloc_t *depot = walloc_get_magazine(rounded); + + if G_UNLIKELY(NULL == depot) { + wfree_raw(ptr, size); } else { - xfree(ptr); + tmfree(depot, ptr); + } + } +#endif /* TRACK_ZALLOC */ +} + +/** + * Zero content and free a block allocated via walloc(). + */ +void +wfree0(void *ptr, size_t size) +{ + g_assert(ptr != NULL); + g_assert(size_is_positive(size)); + + memset(ptr, 0, size); + wfree(ptr, size); +} + +/** + * Free a list of memory blocks that can be viewed as a plain one-way list, + * items being linked by their first pointer. + */ +void +wfree_pslist(pslist_t *pl, size_t size) +{ + tmalloc_t *depot; + size_t rounded = zalloc_round(size); + + g_assert(pl != NULL); + g_assert(size_is_positive(size)); + + /* + * This is a highly specialized routine, used by pslist_t and plist_t. + * It quickly releases the list cells when the corresponding list is + * freed: to avoid calling wfree() on each cell, we group processing + * in order to leverage on the routine setup: we fetch the proper + * magazines or zones once, and we apply the same setting to the whole + * list of object. + * + * Because pslist_t and plist_t both share the same memory layout for + * the ``next'' field (it is the first pointer in the memory block), + * we can handle plist_t as if they were pslist_t without problem: the + * only difference is the passed object size, which will redirect the + * free objects to possibly different zones or magazines. + */ + + if G_UNLIKELY(rounded > walloc_max) { + pslist_t *next, *l; + + for (l = pl; l != NULL; l = next) { + next = l->next; + xfree(l); } -#endif return; } - idx = rounded / ZALLOC_ALIGNBYTES; +#ifdef TRACK_ZALLOC + depot = NULL; +#else + depot = walloc_get_magazine(rounded); +#endif - g_assert(idx < WZONE_SIZE); + if G_UNLIKELY(NULL == depot) { + zone_t *zone; - zone = wzoneidx; - g_assert(zone != NULL); + if G_UNLIKELY(walloc_stopped) + return; - zfree(zone, ptr); + zone = walloc_get_zone(rounded, FALSE); + zfree_pslist(zone, pl); + } else { + tmfree_pslist(depot, pl); + } } /** - * Zero content and free a block allocated via walloc(). + * Free a list of memory blocks being linked through an embedded pointer. */ void -wfree0(gpointer ptr, size_t size) +wfree_eslist(eslist_t *el, size_t size) { - g_assert(ptr != NULL); + tmalloc_t *depot; + size_t rounded = zalloc_round(size); + + g_assert(el != NULL); g_assert(size_is_positive(size)); - memset(ptr, 0, size); - wfree(ptr, size); + /* + * This is a highly specialized routine, used by eslist_t and elist_t. + * Same principle as wfree_pslist(): we want to dispose of objects + * quickly. + */ + + if G_UNLIKELY(rounded > walloc_max) { + void *next, *p; + + for (p = eslist_head(el); p != NULL; p = next) { + next = eslist_next_data(el, p); + xfree(p); + } + return; + } + +#ifdef TRACK_ZALLOC + depot = NULL; +#else + depot = walloc_get_magazine(rounded); +#endif + + if G_UNLIKELY(NULL == depot) { + zone_t *zone; + + if G_UNLIKELY(walloc_stopped) + return; + + zone = walloc_get_zone(rounded, FALSE); + zfree_eslist(zone, el); + } else { + tmfree_eslist(depot, el); + } } /** @@ -225,8 +585,10 @@ void * wmove(void *ptr, size_t size) { - size_t idx = wzone_index(zalloc_round(size)); - zone_t *zone = wzoneidx; + zone_t *zone = walloc_get_zone(zalloc_round(size), FALSE); + + if G_UNLIKELY(walloc_stopped) + return ptr; g_assert(zone != NULL); @@ -242,13 +604,13 @@ * * @return new block address. */ -gpointer -wrealloc(gpointer old, size_t old_size, size_t new_size) +void * +wrealloc(void *old, size_t old_size, size_t new_size) { - gpointer new; + void *new; size_t new_rounded = zalloc_round(new_size); size_t old_rounded = zalloc_round(old_size); - size_t idx_old, idx_new; + zone_t *old_zone, *new_zone; if (NULL == old) return walloc(new_size); @@ -256,7 +618,10 @@ if (old_rounded == new_rounded) return old; - if (new_rounded > WALLOC_MAX || old_rounded > WALLOC_MAX) + if G_UNLIKELY(new_rounded > walloc_max || old_rounded > walloc_max) + goto resize_block; + + if G_UNLIKELY(walloc_stopped) goto resize_block; /* @@ -265,16 +630,11 @@ * zone, in which case there is nothing to do. */ - idx_old = wzone_index(old_rounded); - idx_new = wzone_index(new_rounded); + old_zone = walloc_get_zone(old_rounded, FALSE); + new_zone = walloc_get_zone(new_rounded, TRUE); - g_assert(wzoneidx_old != NULL); - - if (NULL == wzoneidx_new) - wzoneidx_new = wzone_get(new_rounded); - - if (wzoneidx_old == wzoneidx_new) - return zmove(wzoneidx_old, old); /* Move around if interesting */ + if (old_zone == new_zone) + return zmove(old_zone, old); /* Move around if interesting */ resize_block: @@ -284,6 +644,12 @@ return new; } +#else /* REMAP_ZALLOC */ +size_t +walloc_blocksize(size_t size) +{ + return size; +} #endif /* !REMAP_ZALLOC */ /*** @@ -296,41 +662,26 @@ * * @returns a pointer to the start of the allocated block. */ -gpointer +void * walloc_track(size_t size, const char *file, int line) { zone_t *zone; size_t rounded = zalloc_round(size); - size_t idx; g_assert(size_is_positive(size)); - if (rounded > WALLOC_MAX) { + if G_UNLIKELY(rounded > walloc_max) { /* Too big for efficient zalloc() */ - void *p = + void *p = #ifdef TRACK_MALLOC malloc_track(size, file, line); #else - /* Can't reroute to halloc() since it may come back here */ - xpmalloc(size); + xmalloc(size); #endif return p; } - idx = rounded / ZALLOC_ALIGNBYTES; - - g_assert(WALLOC_MAX / ZALLOC_ALIGNBYTES + 1 == WZONE_SIZE); - g_assert(idx < WZONE_SIZE); - - if (!(zone = wzoneidx)) { - /* - * We're paying this computation/allocation cost once per size! - * Create chunks capable of holding at least WALLOC_MINCOUNT structures. - */ - - if (!(zone = wzoneidx = zget(rounded, WALLOC_MINCOUNT))) - s_error("zget() failed?"); - } + zone = walloc_get_zone(rounded, TRUE); return zalloc_track(zone, file, line); } @@ -338,10 +689,10 @@ /** * Same as walloc_track(), but zeroes the allocated memory before returning. */ -gpointer +void * walloc0_track(size_t size, const char *file, int line) { - gpointer p = walloc_track(size, file, line); + void *p = walloc_track(size, file, line); if (p != NULL) memset(p, 0, size); @@ -353,10 +704,10 @@ * Same as walloc_track(), but copies ``size'' bytes from ``ptr'' * to the allocated memory before returning. */ -gpointer -wcopy_track(gconstpointer ptr, size_t size, const char *file, int line) +void * +wcopy_track(const void *ptr, size_t size, const char *file, int line) { - gpointer p = walloc_track(size, file, line); + void *p = walloc_track(size, file, line); if (p != NULL) memcpy(p, ptr, size); @@ -369,11 +720,11 @@ * * @return new block address. */ -gpointer -wrealloc_track(gpointer old, size_t old_size, size_t new_size, +void * +wrealloc_track(void *old, size_t old_size, size_t new_size, const char *file, int line) { - gpointer new; + void *new; size_t rounded = zalloc_round(new_size); if (NULL == old) @@ -398,7 +749,25 @@ { size_t i; - xmalloc_stop_wfree(); + /* + * Reset all the thread magazines. + */ + + for (i = 0; i < WZONE_SIZE; i++) { + tmalloc_t *d = wmagazinei; + if (d != NULL) { + size_t size = tmalloc_size(d); + + if (i == wzone_index(size)) + tmalloc_reset(d); + } + } + + walloc_stopped = TRUE; + + /* + * Physically destroy the zones. + */ for (i = 0; i < WZONE_SIZE; i++) { if (wzonei != NULL) { @@ -411,28 +780,58 @@ /** * Initialize the width-based allocator. */ -G_GNUC_COLD void +void G_COLD walloc_init(void) { - int sp; + walloc_init_if_needed(); +} - if G_UNLIKELY((size_t) -1 != halloc_threshold) - return; /* Already done */ +/** + * Limit walloc() usage at runtime. + * + * This restricts further walloc() usage to that of the currently highest + * used zone: requests larger than that will be re-routed to xmalloc(). + * + * @return the new size of the walloc() threshold. + */ +size_t +walloc_active_limit(void) +{ + size_t i, largest = 0; - /* - * We know that halloc() will redirect to walloc() if the size of the - * block is slightly smaller than the halloc_threshold computed below. - * It is safe to call halloc() on blocks larger than this threshold. - */ + thread_suspend_others(TRUE); - halloc_threshold = MAX(WALLOC_MAX, compat_pagesize()); + WALLOC_LOCK; - /* - * Make sure the layers on top of which we are built are initialized. - */ + for (i = 0; i < N_ITEMS(wzone); i++) { + zone_t *z = wzonei; - vmm_init(&sp); - zinit(); + if (z != NULL) { + if (zdestroy_if_empty(z)) { + wzonei = NULL; + } else { + largest = zone_size(z); + } + } + } + + g_assert(largest <= walloc_max); /* Cannot grow! */ + + walloc_max = largest; + WALLOC_UNLOCK; + + thread_unsuspend_others(); + + return largest; +} + +/** + * @return current walloc() size threshold. + */ +size_t +walloc_size_threshold(void) +{ + return walloc_max; } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/walloc.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/walloc.h
Changed
@@ -35,7 +35,10 @@ #define _walloc_h_ #include "common.h" + +#include "eslist.h" #include "malloc.h" +#include "pslist.h" /** * Maximum size for a walloc(). Anything larger is allocated by using @@ -59,54 +62,57 @@ #error "TRACK_ZALLOC and REMAP_ZALLOC are mutually exclusive" #endif -#if 0 && GLIB_CHECK_VERSION(2, 10, 0) -static inline gpointer walloc(size_t size) { return g_slice_alloc(size); } -static inline gpointer walloc0(size_t size) { return g_slice_alloc0(size); } -static inline void wfree(gpointer p, size_t size) { g_slice_free1(size, p); } +#define walloc(s) g_malloc(s) +#define walloc0(s) g_malloc0(s) -static inline gpointer -wcopy(gconstpointer p, size_t size) +static inline void * +wcopy(const void *p, size_t size) { - gpointer x = g_slice_alloc(size); - memcpy(x, p, size); - return x; + return g_memdup(p, size); } -static inline gpointer -wrealloc(gpointer p, size_t old_size, size_t new_size) +static inline void +wfree(void *p, size_t size) { - gpointer x = g_slice_alloc(new_size); - memcpy(x, p, MIN(new_size, old_size)); - g_slice_free1(old_size, p); - return x; + (void) size; + g_free(p); } -#else /* GLib < 2.10 */ -#define walloc(s) g_malloc(s) -#define walloc0(s) g_malloc0(s) - -static inline gpointer -wcopy(gconstpointer p, size_t size) +static inline void +wfree_pslist(pslist_t *pl, size_t size) { - return g_memdup(p, size); + pslist_t *next, *l; + + (void) size; + + for (l = pl; l != NULL; l = next) { + next = l->next; + g_free(l); + } } static inline void -wfree(gpointer p, size_t size) +wfree_eslist(eslist_t *el, size_t size) { + void *next, *p; + (void) size; - g_free(p); + + for (p = eslist_head(el); p != NULL; p = next) { + next = eslist_next_data(el, p); + g_free(p); + } } static inline void -wfree0(gpointer p, size_t size) +wfree0(void *p, size_t size) { memset(p, 0, size); g_free(p); } -static inline gpointer -wrealloc(gpointer p, size_t o, size_t n) +static inline void * +wrealloc(void *p, size_t o, size_t n) { (void) o; return g_realloc(p, n); @@ -118,27 +124,26 @@ (void) n; return p; } -#endif /* GLib >= 2.10 */ #else /* !REMAP_ZALLOC */ -gpointer walloc(size_t size) WARN_UNUSED_RESULT G_GNUC_MALLOC; -gpointer walloc0(size_t size) WARN_UNUSED_RESULT G_GNUC_MALLOC; -void wfree(gpointer ptr, size_t size); -void wfree0(gpointer ptr, size_t size); -gpointer wrealloc(gpointer old, size_t old_size, size_t new_size) - WARN_UNUSED_RESULT G_GNUC_MALLOC; +void *walloc(size_t size) G_MALLOC; +void *walloc0(size_t size) G_MALLOC; +void wfree(void *ptr, size_t size); +void wfree0(void *ptr, size_t size); +void *wrealloc(void *old, size_t old_size, size_t new_size) G_MALLOC; void *wmove(void *ptr, size_t size) WARN_UNUSED_RESULT; +void wfree_pslist(pslist_t *pl, size_t size); +void wfree_eslist(eslist_t *el, size_t size); /* Don't define both an inline routine and a macro... */ #ifndef TRACK_ZALLOC -static inline gpointer wcopy(gconstpointer ptr, size_t size) - WARN_UNUSED_RESULT G_GNUC_MALLOC; +static inline void *wcopy(const void *ptr, size_t size) G_MALLOC; -static inline gpointer -wcopy(gconstpointer ptr, size_t size) +static inline void * +wcopy(const void *ptr, size_t size) { - gpointer cp = walloc(size); + void *cp = walloc(size); memcpy(cp, ptr, size); return cp; } @@ -153,17 +158,22 @@ #define walloc0(s) walloc0_track(s, _WHERE_, __LINE__) #define wrealloc(p,o,n) wrealloc_track(p, o, n, _WHERE_, __LINE__) -gpointer walloc_track(size_t size, const char *file, int line); -gpointer walloc0_track(size_t size, const char *file, int line); -gpointer wcopy_track(gconstpointer, size_t size, const char *file, int line); -gpointer wrealloc_track(gpointer old, size_t old_size, size_t new_size, +void *walloc_track(size_t size, const char *file, int line); +void *walloc0_track(size_t size, const char *file, int line); +void *wcopy_track(const void *, size_t size, const char *file, int line); +void *wrealloc_track(void *old, size_t old_size, size_t new_size, const char *file, int line); #endif /* TRACK_ZALLOC */ void walloc_init(void); +void walloc_crash_mode(void); +size_t walloc_active_limit(void); +size_t walloc_size_threshold(void); void wdestroy(void); +size_t walloc_maxsize(void) G_CONST; + #define WALLOC(p) \ G_STMT_START { \ p = walloc(sizeof *p); \ @@ -187,13 +197,52 @@ wfree0(p, sizeof *p); \ } G_STMT_END +#define WFREE_TYPE_NULL(p) \ +G_STMT_START { \ + if (p) { \ + wfree(p, sizeof *p);\ + p = NULL; \ + } \ +} G_STMT_END + #define WFREE_NULL(p,size) \ G_STMT_START { \ if (p) { \ - wfree(p,size); \ + wfree(p, size); \ p = NULL; \ } \ } G_STMT_END +#define WALLOC_ARRAY(p,n) \ +G_STMT_START { \ + p = walloc((n) * sizeof p0); \ +} G_STMT_END + +#define WALLOC0_ARRAY(p,n) \ +G_STMT_START { \ + p = walloc0((n) * sizeof p0); \ +} G_STMT_END + +#define WFREE_ARRAY(p,n) \ +G_STMT_START { \ + wfree(p, (n) * sizeof p0); \ +} G_STMT_END + +#define WFREE_ARRAY_NULL(p,n) \ +G_STMT_START { \ + if (p) { \ + wfree(p, (n) * sizeof p0); \ + p = NULL; \ + } \ +} G_STMT_END + +#define WREALLOC_ARRAY(p,n,m) \ +G_STMT_START { \ + p = wrealloc(p, (n) * sizeof p0, (m) * sizeof p0); \ +} G_STMT_END + +#define WCOPY_ARRAY(p,n) wcopy(p, (n) * sizeof p0) + #endif /* _walloc_h_ */ + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/watcher.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/watcher.c
Changed
@@ -39,10 +39,11 @@ #include "watcher.h" #include "atoms.h" #include "cq.h" -#include "glib-missing.h" #include "halloc.h" +#include "hikset.h" #include "path.h" #include "walloc.h" + #include "override.h" /* Must be the last header included */ #define MONITOR_PERIOD_MS (30*1000) /**< 30 seconds */ @@ -54,10 +55,10 @@ const char *filename; /**< Filename to monitor */ time_t mtime; /**< Last known modified time */ watcher_cb_t cb; /**< Callback to invoke on change */ - gpointer udata; /**< User supplied data to hand-out to callback */ + void *udata; /**< User supplied data to hand-out to callback */ }; -static GHashTable *monitored; /**< filename -> struct monitored */ +static hikset_t *monitored; /**< filename -> struct monitored */ /** * Compute the modified time of the file on disk. @@ -77,12 +78,11 @@ * Check each registered file for change -- hash table iterator callback. */ static void -watcher_check_mtime(gpointer unused_key, gpointer value, gpointer unused_udata) +watcher_check_mtime(void *value, void *unused_udata) { struct monitored *m = value; time_t new_mtime; - (void) unused_key; (void) unused_udata; new_mtime = watcher_mtime(m->filename); @@ -97,12 +97,12 @@ * Callout queue periodic event to perform periodic monitoring of the * registered files. */ -static gboolean -watcher_timer(gpointer unused_udata) +static bool +watcher_timer(void *unused_udata) { (void) unused_udata; - g_hash_table_foreach(monitored, watcher_check_mtime, NULL); + hikset_foreach(monitored, watcher_check_mtime, NULL); return TRUE; /* Keep calling */ } @@ -118,7 +118,7 @@ * @param udata extra data to pass to the callback, along with filename */ void -watcher_register(const char *filename, watcher_cb_t cb, gpointer udata) +watcher_register(const char *filename, watcher_cb_t cb, void *udata) { struct monitored *m; @@ -128,10 +128,10 @@ m->udata = udata; m->mtime = watcher_mtime(filename); - if (g_hash_table_lookup(monitored, filename) != NULL) + if (hikset_contains(monitored, filename)) watcher_unregister(filename); - gm_hash_table_insert_const(monitored, m->filename, m); + hikset_insert_key(monitored, &m->filename); } /** @@ -139,7 +139,7 @@ * given instead of a complete filename. */ void -watcher_register_path(const file_path_t *fp, watcher_cb_t cb, gpointer udata) +watcher_register_path(const file_path_t *fp, watcher_cb_t cb, void *udata) { char *path; @@ -166,11 +166,11 @@ { struct monitored *m; - m = g_hash_table_lookup(monitored, filename); + m = hikset_lookup(monitored, filename); g_assert(m != NULL); - g_hash_table_remove(monitored, m->filename); + hikset_remove(monitored, m->filename); watcher_free(m); } @@ -194,7 +194,8 @@ void watcher_init(void) { - monitored = g_hash_table_new(g_str_hash, g_str_equal); + monitored = hikset_create( + offsetof(struct monitored, filename), HASH_KEY_STRING, 0); cq_periodic_main_add(MONITOR_PERIOD_MS, watcher_timer, NULL); } @@ -202,11 +203,10 @@ * Free monitored structure -- hash table iterator callback. */ static void -free_monitored_kv(gpointer unused_key, gpointer value, gpointer unused_udata) +free_monitored_kv(void *value, void *unused_udata) { struct monitored *m = value; - (void) unused_key; (void) unused_udata; watcher_free(m); } @@ -217,8 +217,8 @@ void watcher_close(void) { - g_hash_table_foreach(monitored, free_monitored_kv, NULL); - gm_hash_table_destroy_null(&monitored); + hikset_foreach(monitored, free_monitored_kv, NULL); + hikset_free_null(&monitored); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/watcher.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/watcher.h
Changed
@@ -41,7 +41,7 @@ /** * The callback invoked when a monitored file changes. */ -typedef void (*watcher_cb_t)(const char *filename, gpointer udata); +typedef void (*watcher_cb_t)(const char *filename, void *udata); /* * Public interface. @@ -49,10 +49,10 @@ void watcher_init(void); void watcher_close(void); -void watcher_register(const char *filename, watcher_cb_t cb, gpointer udata); +void watcher_register(const char *filename, watcher_cb_t cb, void *udata); void watcher_unregister(const char *filename); void watcher_register_path( - const file_path_t *fp, watcher_cb_t cb, gpointer udata); + const file_path_t *fp, watcher_cb_t cb, void *udata); void watcher_unregister_path(const file_path_t *fp); #endif /* _watcher_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/wd.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/wd.c
Changed
@@ -34,8 +34,11 @@ #include "common.h" #include "wd.h" + #include "atoms.h" #include "cq.h" +#include "log.h" +#include "spinlock.h" #include "stacktrace.h" #include "tm.h" #include "walloc.h" @@ -51,10 +54,12 @@ enum watchdog_magic magic; /**< Magic number */ const char *name; /**< Name, for logging (atom) */ wd_trigger_t trigger; /**< Callback to trigger */ - gpointer arg; /**< Additionnal callback argument */ + void *arg; /**< Additionnal callback argument */ int period; /**< Maximum period between kicks */ cevent_t *ev; /**< Watchdog event in callout queue */ time_t last_kick; /**< When last kick occurred */ + spinlock_t *lock; /**< Thread-safe lock */ + uint triggering:1; /**< Signals that trigger is running */ }; static inline void @@ -64,6 +69,16 @@ g_assert(WATCHDOG_MAGIC == wd->magic); } +#define WD_LOCK(w) G_STMT_START { \ + if G_UNLIKELY((w)->lock != NULL) \ + spinlock((w)->lock); \ +} G_STMT_END + +#define WD_UNLOCK(w) G_STMT_START { \ + if G_UNLIKELY((w)->lock != NULL) \ + spinunlock((w)->lock); \ +} G_STMT_END + static void wd_start(watchdog_t *wd); /** @@ -75,21 +90,41 @@ static void wd_trigger(watchdog_t *wd) { + bool run = TRUE; + + WD_LOCK(wd); + if (wd->triggering) + run = FALSE; + else + wd->triggering = TRUE; + WD_UNLOCK(wd); + + if (!run) { + s_critical("%s(): watchdog \"%s\" was already running trigger, skipped", + G_STRFUNC, wd_name(wd)); + return; + } + if ((*wd->trigger)(wd, wd->arg)) wd_start(wd); + + WD_LOCK(wd); + wd->triggering = FALSE; + WD_UNLOCK(wd); } /** * Watchdog timer has expired. */ static void -wd_expired(cqueue_t *cq, gpointer arg) +wd_expired(cqueue_t *cq, void *arg) { watchdog_t *wd = arg; watchdog_check(wd); - wd->ev = NULL; + WD_LOCK(wd); + cq_zero(cq, &wd->ev); /* * If no kicks have happened, fire the registered callback. Otherwise, @@ -98,6 +133,7 @@ */ if (0 == wd->last_kick) { + WD_UNLOCK(wd); wd_trigger(wd); } else { time_t now = tm_time(); @@ -112,10 +148,12 @@ */ if (elapsed >= wd->period) { + WD_UNLOCK(wd); wd_trigger(wd); } else { time_delta_t delay = wd->period - elapsed; wd->ev = cq_insert(cq, delay * 1000, wd_expired, wd); + WD_UNLOCK(wd); } } } @@ -128,9 +166,16 @@ { watchdog_check(wd); - /* watchdog period given in seconds */ + WD_LOCK(wd); + wd->last_kick = 0; - wd->ev = cq_main_insert(wd->period * 1000, wd_expired, wd); + + if (NULL == wd->ev) { + /* watchdog period given in seconds */ + wd->ev = cq_main_insert(wd->period * 1000, wd_expired, wd); + } + + WD_UNLOCK(wd); } /** @@ -144,7 +189,36 @@ { watchdog_check(wd); + WD_LOCK(wd); wd->last_kick = tm_time(); + WD_UNLOCK(wd); +} + +/** + * Kick the watchdog, waking it up if sleeping. + * + * After kicking, it's guaranteed that the callback will not be triggering + * before the configured period. + * + * @return TRUE if we woken up the watchdog, FALSE if it was already awake. + */ +bool +wd_wakeup_kick(watchdog_t *wd) +{ + bool awoken = FALSE; + + watchdog_check(wd); + + if G_UNLIKELY(NULL == wd->ev) { + wd_start(wd); + awoken = TRUE; + } + + WD_LOCK(wd); + wd->last_kick = tm_time(); + WD_UNLOCK(wd); + + return awoken; } /** @@ -154,12 +228,12 @@ * * @return TRUE if we woken up the watchdog, FALSE if it was already awake. */ -gboolean +bool wd_wakeup(watchdog_t *wd) { watchdog_check(wd); - if (wd->ev) + if (wd->ev != NULL) return FALSE; wd_start(wd); @@ -172,7 +246,7 @@ * * @return TRUE if we stopped the watchdog, FALSE if it was already aslept. */ -gboolean +bool wd_sleep(watchdog_t *wd) { watchdog_check(wd); @@ -180,7 +254,9 @@ if (NULL == wd->ev) return FALSE; + WD_LOCK(wd); cq_cancel(&wd->ev); + WD_UNLOCK(wd); return TRUE; } @@ -190,27 +266,45 @@ * from the callback to re-arm the watchdog. * * @return TRUE if we stopped the watchdog, FALSE if it was already aslept, - * in which case the trigger was not invoked. + * or trigger was concurrently run, in which case the trigger was not invoked. */ -gboolean +bool wd_expire(watchdog_t *wd) { + bool run = TRUE; watchdog_check(wd); if (NULL == wd->ev) return FALSE; - cq_cancel(&wd->ev); - (*wd->trigger)(wd, wd->arg); + WD_LOCK(wd); + if (wd->triggering) { + run = FALSE; + } else { + cq_cancel(&wd->ev); + wd->triggering = TRUE; + } + WD_UNLOCK(wd); + + if (run) { + (*wd->trigger)(wd, wd->arg); + + WD_LOCK(wd); + wd->triggering = FALSE; - if (wd->ev != NULL) { - g_carp("wd_expire(): " - "watchdog \"%s\" re-armed within %s() callback, turning it off", - wd_name(wd), - stacktrace_routine_name(func_to_pointer(wd->trigger), FALSE)); + if (wd->ev != NULL) { + s_critical("%s(): " + "watchdog \"%s\" re-armed within %s() callback, turning it off", + G_STRFUNC, wd_name(wd), stacktrace_function_name(wd->trigger)); + cq_cancel(&wd->ev); + } + WD_UNLOCK(wd); + } else { + s_critical("%s(): watchdog \"%s\" was already running trigger, skipped", + G_STRFUNC, wd_name(wd)); } - return TRUE; + return run; } /** @@ -226,7 +320,7 @@ */ watchdog_t * wd_make(const char *name, int period, - wd_trigger_t trigger, gpointer arg, gboolean start) + wd_trigger_t trigger, void *arg, bool start) { watchdog_t *wd; @@ -245,6 +339,19 @@ } /** + * Make watchdog thread-safe. + */ +void +wd_thread_safe(watchdog_t *wd) +{ + watchdog_check(wd); + g_assert(NULL == wd->lock); + + WALLOC0(wd->lock); + spinlock_init(wd->lock); +} + +/** * @return the name of the watchdog */ const char * @@ -256,7 +363,7 @@ /** * @return TRUE if watchdog has been woken up. */ -gboolean +bool wd_is_awake(const watchdog_t *wd) { return wd->ev != NULL; @@ -269,9 +376,15 @@ wd_free(watchdog_t *wd) { watchdog_check(wd); - + wd_sleep(wd); + + WD_LOCK(wd); atom_str_free_null(&wd->name); + if (wd->lock != NULL) { + spinlock_destroy(wd->lock); /* Will unlock */ + WFREE(wd->lock); + } WFREE(wd); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/wd.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/wd.h
Changed
@@ -48,23 +48,25 @@ * @return whether watchdog should continue monitoring and trigger in another * period or whether it should be put in a dormant state until woken up. */ -typedef gboolean (*wd_trigger_t)(watchdog_t *wd, gpointer udata); +typedef bool (*wd_trigger_t)(watchdog_t *wd, void *udata); /* * Public interface. */ watchdog_t *wd_make(const char *name, int period, - wd_trigger_t trigger, gpointer arg, gboolean start); + wd_trigger_t trigger, void *arg, bool start); void wd_free_null(watchdog_t **wd); +void wd_thread_safe(watchdog_t *wd); const char *wd_name(const watchdog_t *wd); -gboolean wd_is_awake(const watchdog_t *wd); +bool wd_is_awake(const watchdog_t *wd); -gboolean wd_sleep(watchdog_t *wd); -gboolean wd_wakeup(watchdog_t *wd); -gboolean wd_expire(watchdog_t *wd); +bool wd_sleep(watchdog_t *wd); +bool wd_wakeup(watchdog_t *wd); +bool wd_expire(watchdog_t *wd); void wd_kick(watchdog_t *wd); +bool wd_wakeup_kick(watchdog_t *wd); #endif /* _wd_h_ */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/well.c
Added
@@ -0,0 +1,685 @@ +/* + * Copyright (c) 2006 Francois Panneton and Pierre L'Ecuyer + * University of Montreal + * Copyright (c) 2006 Makoto Matsumoto, Hiroshima University + * + * Adaptated and enhanced for inclusion in gtk-gnutella by Raphael Manfredi. + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Well-Equidistributed Long-period Linear (WELL) random number generator. + * + * This is adapted from the WELL1024a.c source code published by the + * authors, with small code reformating according to our library coding style, + * and to change the API to be consistent with the other PRNG in the library. + * + * Original source code written by Geoff was obtained at: + * http://www.iro.umontreal.ca/~panneton/well/WELL1024a.c + * + * Translation of WELL1024a into WELL1024b is based on the article: + * "Improved Long-Period Generators Based on Linear Recurrences Modulo 2", + * by Francois Panneton and Pierre L'Ecuyer, published in 2006. + * + * @author Francois Panneton, Pierre L'Ecuyer and Makoto Matsumoto + * @date 2006 + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#include "well.h" + +#include "arc4random.h" +#include "endian.h" +#include "entropy.h" +#include "omalloc.h" +#include "once.h" +#include "random.h" +#include "spinlock.h" +#include "thread.h" +#include "walloc.h" + +/** + * The internal state of WELL1024b is 1024 bits, i.e. 32 32-bit words. + */ +#define WELL_STATE_SIZE 32 + +/** + * How many steps are required to escape a bad initialization of the state? + * + * The value chosen for WELL_STATE_DISCARD is NOT arbitrary. It is based on + * the study made by the WELL designers in their article, section 7, "Escaping + * Zeroland", and was estimated for the WELL1024b algorithm based on the + * comparisons between WELL800a and WELL19937a. + */ +#define WELL_STATE_DISCARD 128 + +/* + * Internal state for the WELL PRNG. The user can keep multiple state + * structures around as a way of generating multiple streams of random + * numbers. + */ + +enum well_state_magic { WELL_STATE_MAGIC = 0x1e257513 }; + +struct well_state { + enum well_state_magic magic; + uint32 stateWELL_STATE_SIZE; /* Vector holding current state */ + uint n; /* Index in state */ + spinlock_t lock; /* Lock for thread-safe accesses */ +}; + +static void +well_state_check(const struct well_state * const ws) +{ + g_assert(ws != NULL); + g_assert(WELL_STATE_MAGIC == ws->magic); +} + +#define STATE_LOCK(w) spinlock_hidden(&w->lock) +#define STATE_UNLOCK(w) spinunlock_hidden(&w->lock) + +/* -- section from WELL1024a.c, slightly adapted to handle a well_state_t -- */ + +/* ************************************************************************* */ +/* Copyright: Francois Panneton and Pierre L'Ecuyer, University of Montreal */ +/* Makoto Matsumoto, Hiroshima University */ +/* Notice: This code can be used freely for personal, academic, */ +/* or non-commercial purposes. For commercial purposes, */ +/* please contact P. L'Ecuyer at: lecuyer@iro.UMontreal.ca */ +/* ************************************************************************* */ + +/* + * NOTES from RAM: + * + * We implement WELL1024b, not WELL1024a. + * + * The three m1, m2 and m3 constants (3, 24, 10) in WELL1024a are now set + * to (22, 25, 26) for WELL1024b. + * + * For the matrix multiplications, WELL1024a uses the following Ti: + * + * M1 M3(8) M3(-19) M3(-14) + * M3(-11) M3(-7) M3(-13) M0 + * + * Whereas for the WELL1024b algorithm, the Ti are the following: + * + * M3(-21) M3(17) M4(a3) M3(15) + * M3(-14) M3(-21) M1 M0 + * + * Note the use of the more complex M4 matrix, but there is very little + * impact on the performance due to a simple optimization, as done in + * the optimized Mersenne Twister implementation. + * + * The reason we're using WELL1024b is due to the greater N1 value for that + * algorithm (N1=475, whereas it is only 407 for WELL1024a). See the paper! + * Since delta is 0 for the two WELL1024 algorithms, no tempering is needed. + * --RAM, 2013-12-18 + */ + +#define R WELL_STATE_SIZE +#define M1 22 /* m1 */ +#define M2 25 /* m2 */ +#define M3 26 /* m3 */ +#define a3 0x8bdcb91e + +/* + * The Mi matrices are defined in table 1 of Panneton et al (2006): + * "Improved Long-Period Generators Based on Linear Recurrences Modulo 2". + * + * y = Mi x, where Mi is the matrix we're defining. + * + * The following definitions were grabbed out of other WELL implementations + * (from the WELL44497a.c file by the same authors) for completeness, although + * we do not need all the definitions. + * + * I kept the strange MATn numbering that is not in sync with the Mi indices + * for the corresponding matrices, so that readers can still compare the code + * with the original published sources. I do not know why we do not have i == n + * in all these definitions. Probably because they were implemented in the + * order of increasing n, not increasing i... + * --RAM, 2013-12-18 + */ + +/* matrix M3(t) */ +#define MAT0POS(t,v) (v^(v>>t)) +#define MAT0NEG(t,v) (v^(v<<(-(t)))) + +/* matrix M1 -- y = x -- Identity */ +#define MAT1(v) (v) + +/* matrix M4(a) -- y = (x >> 1 ^ a) if x is odd, x >> 1 otherwise */ +#define MAT2(a,v) ((v & 1U)?((v>>1)^a):(v>>1)) + +/* Optimized M4(a) for a = a3 (after optimized Mersenne Twister code) -- RAM */ +static const uint32 a3m = { 0, a3 }; +#define MAT2_A3(v) ((v >> 1) ^ a3m(v) & 1U) + +/* matrix M2(t) -- y = x >> t if t >= 0, x << -t otherwise */ +#define MAT3POS(t,v) (v>>t) +#define MAT3NEG(t,v) (v<<(-(t))) + +/* matrix M5(t,b) -- unused here */ +#define MAT4POS(t,b,v) (v ^ ((v>> t ) & b)) +#define MAT4NEG(t,b,v) (v ^ ((v<<(-(t))) & b)) + +/* matrix M6(q,s,t,a) -- unused here */ +#define MAT5(r,a,ds,dt,v) \ + ((v & dt)?((((v<<r)^(v>>(W-r)))&ds)^a):(((v<<r)^(v>>(W-r)))&ds)) + +/* matrix M0 -- y = 0 -- not explicitly used since "x XOR 0 == x" */ +#define MAT6(v) 0 + +#define MASK ((uint) R - 1) +#define m1 (R - 1) /* -1 modulo R, NOT the "m1" parameter */ + +#define V0 ws->state ws->n +#define VM1 ws->state(ws->n+M1) & MASK +#define VM2 ws->state(ws->n+M2) & MASK +#define VM3 ws->state(ws->n+M3) & MASK +#define VRm1 ws->state(ws->n+m1) & MASK +#define newV0 ws->state(ws->n+m1) & MASK +#define newV1 ws->state ws->n + +/** + * Generate a new 32-bit random number using the supplied WELL state. + * + * This generator has a period of 2**1024 - 1 and implements WELL 1024a. + */ +static inline uint32 G_UNUSED +well_1024a(well_state_t *ws) /* UNUSED, for reference only */ +{ + uint32 z0, z1, z2; + + z0 = VRm1; + z1 = MAT1(V0) ^ MAT0POS(8, VM1); + z2 = MAT0NEG(-19, VM2) ^ MAT0NEG(-14, VM3); + newV1 = z1 ^ z2; + newV0 = MAT0NEG(-11, z0) ^ MAT0NEG(-7, z1) ^ MAT0NEG(-13, z2); + ws->n = (ws->n + m1) & MASK; + + return V0; +} + +/* -- end section from WELL1024a.c -- */ + +/** + * Generate a new 32-bit random number using the supplied WELL state. + * + * This generator has a period of 2**1024 - 1 and implements WELL 1024b. + * + * This routine was written by Raphael Manfredi based on the paper and the + * above matrix definitions, heavily (!) inspired by the above well_1024a() + * code. + */ +static inline uint32 +well_rand_internal(well_state_t *ws) +{ + uint32 z0, z1, z2; + + z0 = VRm1; + z1 = MAT0NEG(-21, V0) ^ MAT0POS(17, VM1); + z2 = MAT2_A3(VM2) ^ MAT0POS(15, VM3); + newV1 = z1 ^ z2; + newV0 = MAT0NEG(-14, z0) ^ MAT0NEG(-21, z1) ^ MAT1(z2); + ws->n = (ws->n + m1) & MASK; + + return V0; +} + +/* + * Discard the first WELL_STATE_DISCARD values to make sure the internal + * state does not have too many zeroed bits. + */ +static void +well_state_discard(well_state_t *ws) +{ + unsigned i; + + /* + * Guard argainst a zeroed state, since then the generator would only + * end up producing zeros... + */ + + for (i = 0; i < N_ITEMS(ws->state); i++) { + if G_LIKELY(ws->statei != 0) + goto good; + } + + ws->state0 = entropy_random(); /* Will never be 0, in practice */ + + if (0 == ws->state0) + s_error("%s(): bad luck with random number generator", G_STRFUNC); + +good: + /* + * Discarding a "few" values is enough to ensure that the algorithm will + * not end-up being biased towards 0. + */ + + for (i = 0; i < WELL_STATE_DISCARD; i++) { + (void) well_rand_internal(ws); + } +} + +/** + * Initialize the state with random values drawn from specified PRNG function. + * + * @param rf random function to initialize the state + * @param ws the WELL state we want to initialize + */ +static void +well_seed_with(random_fn_t rf, well_state_t *ws) +{ + if (NULL == rf) + rf = entropy_random; + + random_bytes_with(rf, &ws->state, sizeof ws->state); + well_state_discard(ws); + spinlock_init(&ws->lock); +} + +/** + * Allocate a new state, initialized randomly using supplied random function. + * + * If the random function is NULL, the state is initialized with the strong + * but slow entropy_random(). + * + * @param rf random function to initialize the state + * + * @return a new state that can be freed with well_state_free_null(). + */ +well_state_t * +well_state_new(random_fn_t rf) +{ + well_state_t *ws; + + WALLOC0(ws); + ws->magic = WELL_STATE_MAGIC; + + well_seed_with(rf, ws); + return ws; +} + +/** + * Clone WELL state, allowing replay of a random number generation sequence. + * + * @param ws the WELL state to clone + * + * @return a copy of the state which can be freed with well_state_free_null(). + */ +well_state_t * +well_state_clone(const well_state_t *ws) +{ + well_state_t *cws, *wws; + + well_state_check(ws); + + wws = deconstify_pointer(ws); /* Only hidden state is changed */ + + STATE_LOCK(wws); + cws = WCOPY(wws); + STATE_UNLOCK(wws); + + spinlock_init(&cws->lock); /* Was locked when cloned */ + + return cws; +} + +/** + * Free WELL state and nullify its pointer. + */ +void +well_state_free_null(well_state_t **ws_ptr) +{ + well_state_t *ws = *ws_ptr; + + if (ws != NULL) { + well_state_check(ws); + spinlock_destroy(&ws->lock); + WFREE(ws); + *ws_ptr = NULL; + } +} + +/** + * Distribute random 32-bit words over the state context. + */ +static void +well_state_patch(well_state_t *ws, const void *data, size_t len) +{ + size_t n; + + g_assert(len <= sizeof ws->state); + g_assert(0 == (len & 0x3)); /* Multiple of 4 */ + + for (n = 0; n < N_ITEMS(ws->state) && len != 0; n++, len -= 4) { + ws->staten ^= peek_be32(data); + data = const_ptr_add_offset(data, 4); + } +} + +/** + * Merge randomness to the WELL state. + */ +static void +well_state_merge_random(well_state_t *ws, const void *data, size_t len) +{ + STATIC_ASSERT(0 == (0x3 & sizeof ws->state)); + + while (len >= 4) { + size_t n = (MIN(len, sizeof ws->state) >> 2) << 2; /* Multiple of 4 */ + well_state_patch(ws, data, n); + data = const_ptr_add_offset(data, n); + len -= n; + } + + if (len < 4) { + char buf4; + size_t i; + + ZERO(&buf); + for (i = 0; i < len; i++) { + bufi = ((char *) data)i; + } + + well_state_patch(ws, buf, sizeof buf); + } + + /* + * After changing the state, perform iterations whose aim it is to spread + * the bits and limit the impact of having too many bits set to 0 or 1 in + * the state. It is imperative to check that we do not have ALL the + * entries in the state set to 0, or we would only end up producing zeroes. + */ + + well_state_discard(ws); +} + +/** + * Generate a new 64-bit random number using the supplied WELL state. + */ +static uint64 +well_rand64_internal(well_state_t *ws) +{ + return ((uint64) well_rand_internal(ws) << 32) | well_rand_internal(ws); +} + +/** + * Generate a random number in the range 0 to 2^32-1, inclusive, working + * from a given state vector. + * + * @param ws state for the PRNG + * + * @return a 32-bit random number + */ +uint32 +well_state_rand(well_state_t *ws) +{ + well_state_check(ws); + + return well_rand_internal(ws); +} + +/** + * Generate a random number in the range 0 to 2^64-1, inclusive, working + * from a given state vector. + * + * @param ws state for the PRNG + * + * @return a 64-bit random number + */ +uint64 +well_state_rand64(well_state_t *ws) +{ + well_state_check(ws); + + return well_rand64_internal(ws); +} + +/** + * Add randomness to the WELL state. + * + * @param ws the WELL state to which we add randomness + * @param data the start of the random data buffer + * @param len the amount of random bytes to process in the buffer + */ +void +well_state_addrandom(well_state_t *ws, const void *data, size_t len) +{ + well_state_check(ws); + + well_state_merge_random(ws, data, len); +} + +/** + * Generate a random number in the range 0 to 2^32-1, inclusive, working + * from a given state vector. + * + * @param ws state for the PRNG, locked before access + * + * @return a 32-bit random number + */ +uint32 +well_state_lock_rand(well_state_t *ws) +{ + uint32 rn; + + well_state_check(ws); + + STATE_LOCK(ws); + rn = well_rand_internal(ws); + STATE_UNLOCK(ws); + + return rn; +} + +/** + * Generate a random number in the range 0 to 2^64-1, inclusive, working + * from a given state vector. + * + * @param ws state for the PRNG, locked before access + * + * @return a 64-bit random number + */ +uint64 +well_state_lock_rand64(well_state_t *ws) +{ + uint64 rn; + + well_state_check(ws); + + STATE_LOCK(ws); + rn = well_rand64_internal(ws); + STATE_UNLOCK(ws); + + return rn; +} + +/** + * Add randomness to the WELL state, locked. + * + * @param ws the WELL state to which we add randomness + * @param data the start of the random data buffer + * @param len the amount of random bytes to process in the buffer + */ +void +well_state_lock_addrandom(well_state_t *ws, const void *data, size_t len) +{ + well_state_check(ws); + + STATE_LOCK(ws); + well_state_merge_random(ws, data, len); + STATE_UNLOCK(ws); +} + +static well_state_t well_default; +static once_flag_t well_seeded; + +/** + * Seed the default state, once. + */ +static void +well_default_seed(void) +{ + well_default.magic = WELL_STATE_MAGIC; + well_seed_with(NULL, &well_default); +} + +/** + * Generate a random number in the range 0 to 2^32-1, inclusive. + * + * @return a 32-bit random number + */ +uint32 +well_rand(void) +{ + ONCE_FLAG_RUN(well_seeded, well_default_seed); + + return well_state_lock_rand(&well_default); +} + +/** + * Generate a random number in the range 0 to 2^64-1, inclusive. + * + * @return a 64-bit random number + */ +uint64 +well_rand64(void) +{ + ONCE_FLAG_RUN(well_seeded, well_default_seed); + + return well_state_lock_rand64(&well_default); +} + +/** + * Add randomness to the default (shared) WELL state. + * + * @param data the start of the random data buffer + * @param len the amount of random bytes to process in the buffer + */ +void +well_addrandom(const void *data, size_t len) +{ + ONCE_FLAG_RUN(well_seeded, well_default_seed); + + well_state_lock_addrandom(&well_default, data, len); +} + +static once_flag_t well_key_inited; +static thread_key_t well_key = THREAD_KEY_INIT; + +/** + * Create the thread-local random pool key, once. + */ +static void +well_key_init(void) +{ + if (-1 == thread_local_key_create(&well_key, THREAD_LOCAL_KEEP)) + s_error("cannot initialize WELL random pool key: %m"); +} + +/** + * Get suitable thread-local random pool. + */ +static well_state_t * +well_pool(void) +{ + well_state_t *ws; + + ONCE_FLAG_RUN(well_key_inited, well_key_init); + + ws = thread_local_get(well_key); + + if G_UNLIKELY(NULL == ws) { + /* + * The random pool is kept for each created thread, never freed. + */ + + OMALLOC0(ws); + ws->magic = WELL_STATE_MAGIC; + well_seed_with(arc4random, ws); + thread_local_set(well_key, ws); + } + + return ws; +} + +/** + * Generate a random number in the range 0 to 2^32-1, inclusive. + * + * This routine uses a thread-private random pool and is mostly a + * lock-free execution path (about 25% faster than well_rand() with locks) + * + * @return a 32-bit random number + */ +uint32 +well_thread_rand(void) +{ + return well_rand_internal(well_pool()); +} + +/** + * Generate a random number in the range 0 to 2^64-1, inclusive. + * + * This routine uses a thread-private random pool and is mostly a + * lock-free execution path. + * + * @return a 64-bit random number + */ +uint64 +well_thread_rand64(void) +{ + return well_rand64_internal(well_pool()); +} + +/** + * Add randomness to the local WELL state. + * + * @param ws the WELL state to which we add randomness + * @param data the start of the random data buffer + * @param len the amount of random bytes to process in the buffer + */ +void +well_thread_addrandom(const void *data, size_t len) +{ + well_state_merge_random(well_pool(), data, len); +} + +/** + * @return a list of thread IDs using a thread-local WELL pool, which must + * be freed with pslist_free(). + */ +pslist_t * +well_users(void) +{ + ONCE_FLAG_RUN(well_key_inited, well_key_init); + + return thread_local_users(well_key); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/well.h
Added
@@ -0,0 +1,68 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Well Equidistributed Long-period Linear (WELL) random number generator. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#ifndef _well_h_ +#define _well_h_ + +struct well_state; +typedef struct well_state well_state_t; + +/* + * Public interface. + */ + +well_state_t *well_state_new(random_fn_t rf); +well_state_t *well_state_clone(const well_state_t *ws); +void well_state_free_null(well_state_t **ws_ptr); + +uint32 well_state_rand(well_state_t *ws); +uint64 well_state_rand64(well_state_t *ws); +void well_state_addrandom(well_state_t *ws, const void *data, size_t len); + +uint32 well_state_lock_rand(well_state_t *ws); +uint64 well_state_lock_rand64(well_state_t *ws); +void well_state_lock_addrandom(well_state_t *ws, const void *data, size_t len); + +uint32 well_rand(void); +uint64 well_rand64(void); +void well_addrandom(const void *data, size_t len); + +uint32 well_thread_rand(void); +uint64 well_thread_rand64(void); +void well_thread_addrandom(const void *data, size_t len); + +struct pslist *well_users(void); + +#endif /* _well_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/win32dlp.c
Added
@@ -0,0 +1,1375 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Win32 dynamic library patcher. + * + * The aim here is to make sure that each DLL using malloc() and friends + * is dynamically patched to redirect the calls to xmalloc(). + * + * We also supersede the LoadLibrary() calls to make sure each new DLL that + * is brought in the process gets properly patched. + * + * The logic here was heavily inspired by the winpatcher code from nedmalloc() + * which can be found at: + * + * git://github.com/ned14/nedmalloc.git + * + * However, the code was reverse-engineered and completely rewritten for the + * following reasons: + * + * 1- the code did not compile neatly within gtk-gnutella. + * 2- we already have some low-level routines that we can peruse. + * 3- we do not want a separate DLL, which would complicate our build process. + * 4- we do not need all the #ifdef complexity in the original code + * + * And what matters is not the destination but the journey. Rewriting this + * logic helped me understand what was going on. I hope the code is also + * easier to understand the way I have rewritten it, and more readable for + * people who, like me, are uncomfortable with mixed-case identifiers. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#include "common.h" + +/* + * This whole file is only compiled under Windows. + */ + +#ifdef MINGW32 + +#include <stdlib.h> +#include <windows.h> +#include <winnt.h> +#include <imagehlp.h> +#include <psapi.h> + +#include "win32dlp.h" + +#include "ascii.h" +#include "dump_options.h" +#include "atomic.h" +#include "bsearch.h" +#include "hashtable.h" +#include "log.h" +#include "omalloc.h" +#include "path.h" +#include "stringify.h" +#include "thread.h" +#include "tm.h" +#include "unsigned.h" +#include "utf8.h" +#include "vmm.h" +#include "xmalloc.h" +#include "xsort.h" + +#include "override.h" /* Must be the last header included */ + +#if 0 +#define WIN32DLP_DEBUG /**< Trace patching activities */ +#endif + +/** + * A module entry we wish to patch. + */ +typedef struct win32dlp_module { + const char *name; /* Module name */ + HMODULE addr; /* Module address */ + uint32 flags; /* Operating flags */ +} win32dlp_module_t; + +/** + * Module flags. + */ +#define WIN32DLP_MODF_PATCHED (1U << 0) /* Module was patched already */ +#define WIN32DLP_MODF_PROBED (1U << 1) /* Module was probed */ +#define WIN32DLP_MODF_NO_IAT (1U << 1) /* Module has no IAT */ + +/** + * A description of what to patch. + */ +typedef struct win32dlp_patch { + struct win32dlp_replace { + const char *name; /* Replace this symbol */ + HMODULE base; /* In this DLL */ + PROC addr; /* Symbol address (NULL means: compute it) */ + } replace; + win32dlp_module_t *modules; /* List of modules where symbol is */ + struct win32dlp_with { + const char *name; /* Name of the routine */ + PROC addr; /* Symbol address */ + bool careful; /* Whether to dynamically validate "addr" */ + } with; +} win32dlp_patch_t; + +/** + * The VMM reserved region where we allocate memory from. + */ +static struct win32dlp_vmm { + void *start; + void *end; +} win32dlp_vmm; + +typedef void (*win32dlp_free_t)(void *); +typedef size_t (*win32dlp_msize_t)(void *); + +static win32dlp_free_t win32dlp_sys_free; +static win32dlp_msize_t win32dlp_sys_msize; + +static const char win32dlp_unknown_name = "?"; + +static hash_table_t *win32dlp_loaded; /* Loaded modules by handle (base) */ +static hash_table_t *win32dlp_ignored; /* Modules to ignore by handle */ + +static bool win32dlp_stop_freeing; +static bool win32dlp_in_place_only_used; + +/** + * Internal statistics collected. + * + * The AU64() fields are atomically updated and do not require a lock. + */ +static struct win32dlp_stats { + AU64(trapped_malloc); + AU64(trapped_calloc); + AU64(trapped_realloc); + AU64(trapped_free); + AU64(trapped_msize); + AU64(trapped_LoadLibraryA); + AU64(trapped_LoadLibraryW); + AU64(trapped_HeapAlloc); + AU64(trapped_HeapReAlloc); + AU64(trapped_HeapFree); + AU64(trapped_HeapSize); + AU64(passed_HeapAlloc); + AU64(passed_HeapReAlloc); + AU64(passed_HeapFree); + AU64(passed_HeapSize); + AU64(failed_HeapReAlloc); + AU64(foreign_realloc); + AU64(foreign_free); + AU64(foreign_msize); + AU64(foreign_HeapReAlloc); + AU64(foreign_HeapFree); + AU64(foreign_HeapSize); + AU64(modules_initial); + AU64(modules_loaded); + AU64(modules_patched); + AU64(entries_patched); +} win32dlp_stats; + +#define WIN32DLP_STATS_INCX(x) AU64_INC(&win32dlp_stats.x) +#define WIN32DLP_STATS_ADDX(x,n) AU64_ADD(&win32dlp_stats.x, (n)) + +static void win32dlp_patch_loaded_modules(void); +static const struct win32dlp_with *win32dlp_with_compute( + const win32dlp_module_t *m, const win32dlp_patch_t *how); + +#ifdef WIN32DLP_DEBUG +#define win32dlp_debug(str) \ + s_rawdebug("%s(): " str " (%s)", G_STRFUNC, G_STRLOC) +#define win32dlp_debugf(fmt, ...) \ + s_rawdebug("%s(): " fmt " (%s)", G_STRFUNC, __VA_ARGS__, G_STRLOC) +#else +#define win32dlp_debug(str) {} +#define win32dlp_debugf(...) {} +#endif /* WIN32DLP_DEBUG */ + +/** + * Compute the module base address given a pointer within that module. + * + * The important assumption made here is that the whole DLL is going to + * be memory-mapped by the kernel using a single memory region. + * + * @param p a pointer within the DLL + * + * @return the base address of the DLL, or NULL if we cannot figure it out. + */ +static inline HMODULE +win32dlp_module_base(const void *p) +{ + return mingw_memstart(p); +} + +/** + * Is the pointer something we allocated through our VMM layer, and therefore + * something that is likely to have been allocated via our xmalloc()? + * + * Note that, just because the pointer is susceptible of having been returned + * by xmalloc(), it does not mean the pointer is valid. For instance, if one + * uses xmalloc(100) and then attempts to free the returned pointer + 10 bytes. + * For sure, the pointer is valid and could have been returned by xmalloc(), + * but it is not a valid pointer to hand-off to the xmalloc() layer. However, + * the layer has means to detect that a pointer is indeed a valid user one. + * + * @return whether the pointer falls in the VM space xmalloc() can use. + */ +static bool +win32dlp_via_xmalloc(const void *p) +{ + /* + * Quick win: if the pointer is within the reserved region, it was + * necessarily allocated via the VMM layer. This is most likely to + * be the case. + */ + + if G_LIKELY( + ptr_cmp(win32dlp_vmm.start, p) <= 0 && + ptr_cmp(win32dlp_vmm.end, p) > 0 + ) + return TRUE; + + /* + * It's not in our reserved region, but it can be allocated via the VMM + * layer from the "unreserved" VM space. In any case, this will be + * memory known to the VMM layer (i.e. identified as being mapped). + */ + + return vmm_is_native_pointer(p); +} + +/** + * Ignore specified module. + */ +static inline void +win32dlp_ignore(HMODULE base) +{ + hash_table_insert(win32dlp_ignored, base, NULL); +} + +/** + * @return whether module is ignored. + */ +static inline bool +win32dlp_is_ignored(HMODULE base) +{ + return hash_table_contains(win32dlp_ignored, base); +} + +/** + * Register a new loaded module. + * + * @param file the file path + * @param addr the loade module address + */ +static void +win32dlp_add_module(const char *file, HMODULE addr) +{ + /* The win32dlp_loaded hash table was locked by caller */ + + if (hash_table_contains(win32dlp_loaded, addr)) { + win32dlp_debugf("already had module \"%s\" at %p", file, addr); + } else if (win32dlp_is_ignored(addr)) { + win32dlp_debugf("module \"%s\" at %p is to be ignored", file, addr); + } else { + struct win32dlp_module *m; + bool ok; + + OMALLOC0(m); + m->name = ostrdup_readonly(filepath_basename(file)); + m->addr = addr; + + ok = hash_table_insert(win32dlp_loaded, addr, m); + g_assert(ok); + + win32dlp_debugf("dynamically loaded module \"%s\" at %p", file, addr); + + WIN32DLP_STATS_INCX(modules_loaded); + } +} + +/** + * Scan loaded modules and insert them into the table of loaded modules. + * + * This is done at the beginning to see which modules are present initially. + * After that, we're trapping the module loading routines so we will know + * that a new module has been loaded. + */ +static void +win32dlp_scan_modules(void) +{ + HMODULE *p, *last, modules1024; + HANDLE proc = GetCurrentProcess(); + bool ok; + DWORD needed; + + /* + * There are two modules we want to ignore: + * + * - ourselves, the program, so that we do not supersede the routines + * we call after trapping them (e.g. LoadLibraryW(), which we call + * and whose symbol must keep pointing to the original) + * + * - the pthread DLL, which uses malloc() and will cause problems since + * our locks always attempt to compute the thread small ID, which will + * re-enter the pthread DLL if we have to call pthread_self() for + * instance during our allocations, causing a deadly recursion. + */ + + win32dlp_ignore(GetModuleHandle(NULL)); + win32dlp_ignore(win32dlp_module_base(pthread_self)); + + ok = EnumProcessModules(proc, modules, sizeof modules, &needed); + + if (!ok) { + s_error("%s(): EnumProcessModules() failed: %lu", + G_STRFUNC, GetLastError()); + } + + g_assert(needed <= sizeof modules); /* Can't store more anyway */ + + last = &modulesneeded / sizeof modules0; + + for (p = modules; ptr_cmp(p, last) < 0; p++) { + struct win32dlp_module *m; + const char *name = win32dlp_unknown_name; + + if (win32dlp_is_ignored(*p)) + continue; + +#ifdef WIN32DLP_DEBUG + { + wchar_t wnameMAX_PATH + 1; + char utf8_nameMAX_PATH; + + GetModuleBaseNameW(proc, *p, wname, sizeof wname - 2); + (void) utf16_to_utf8(wname, utf8_name, sizeof utf8_name); + utf8_nameMAX_PATH - 1 = '\0'; + name = ostrdup_readonly(utf8_name); + } +#endif /* WIN32DLP_DEBUG */ + + OMALLOC0(m); + m->name = name; + m->addr = *p; + + ok = hash_table_insert(win32dlp_loaded, m->addr, m); + g_assert(ok); + } + + win32dlp_debugf("registered %zu initially loaded module%s", + hash_table_size(win32dlp_loaded), + plural(hash_table_size(win32dlp_loaded))); +} + +/** + * This is a specialized implementation of ImageDirectoryEntryToData() to + * fetch the base and size of the Import Address Table (IAT) of the DLL. + * + * Since the DbgHelp module uses malloc() and we're trying to remap malloc() + * by patching entries and avoid all usage of the C runtime malloc() if + * possible, we cannot rely on the library function to do this job. + * + * @param base this is the module base address (aka the module handle) + * @param size where size of the Import Address Table (IAT) is written. + * + * @return a pointer to the IAT, NULL on error. + */ +static void * +win32dlp_get_iat(const void *base, size_t *size) +{ + const IMAGE_DOS_HEADER *dos = base; + const IMAGE_NT_HEADERS *pe = NULL; + void *iat = NULL; + size_t offset; + const int dn = IMAGE_DIRECTORY_ENTRY_IMPORT; + + if (size != NULL) + *size = 0; + + if (*(uint16 *) "MZ" == dos->e_magic) + pe = const_ptr_add_offset(dos, dos->e_lfanew); + else + pe = (IMAGE_NT_HEADERS *) dos; + + if (IMAGE_NT_SIGNATURE != pe->Signature) + return NULL; + + offset = pe->OptionalHeader.DataDirectorydn.VirtualAddress; + + if (offset != 0) { + iat = ptr_add_offset_const(base, offset); + if (size != NULL) + *size = pe->OptionalHeader.DataDirectorydn.Size; + } + + return iat; +} + +/** + * Change the IAT entry, superseding it with a new function address. + * + * @param fn the location within the IAT of the entry we want to supersede + * @param addr the superseding function address + * + * @return TRUE if OK, FALSE on error. + */ +static bool +win32dlp_iat_change(PROC *fn, PROC addr) +{ + MEMORY_BASIC_INFORMATION mbi; + bool ok, changed = FALSE; + + ZERO(&mbi); + + if (0 == VirtualQuery(fn, &mbi, sizeof mbi)) { + errno = mingw_last_error(); + s_warning("%s(): cannot probe targeted address %p: %m", G_STRFUNC, fn); + return FALSE; + } + + if (0 == (mbi.Protect & PAGE_EXECUTE_READWRITE)) { + ok = VirtualProtect(mbi.BaseAddress, mbi.RegionSize, + PAGE_EXECUTE_WRITECOPY, &mbi.Protect); + + if (!ok) { + errno = mingw_last_error(); + s_warning("%s(): cannot set write-copy for %'zu bytes at %p: %m", + + G_STRFUNC, (size_t) mbi.RegionSize, mbi.BaseAddress); + return FALSE; + } + + changed = TRUE; /* Permission changed on region */ + } + + *fn = addr; /* Update the IAT */ + atomic_mb(); /* Make sure new value is seen on all processors */ + + /* + * According to MSDN, a FlushInstructionCache() is not necessary on x86 + * and x64 CPU architectures. It does not hurt to do it though. + */ + + FlushInstructionCache(GetCurrentProcess(), mbi.BaseAddress, mbi.RegionSize); + + if (changed) { + ulong x; + + ok = VirtualProtect(mbi.BaseAddress, mbi.RegionSize, mbi.Protect, &x); + + if (!ok) { + s_message("%s(): cannot restore memory permissions for " + "%'zu bytes at %p: %m", + G_STRFUNC, (size_t) mbi.RegionSize, mbi.BaseAddress); + } + } + + return TRUE; +} + +/** + * Patch the Import Address Table (IAT) of the module. + * + * @param module the module to patch + * @param name the name of the module providing the symbol to patch + * @param how the patch entry describing the symbol to replace + * + * @return amount of entries patched. + */ +static size_t +win32dlp_patch_iat( + win32dlp_module_t *module, const char *name, + const win32dlp_patch_t *how) +{ + IMAGE_IMPORT_DESCRIPTOR *di; + size_t size, patched = 0; + bool found = FALSE; + + if (module->flags & WIN32DLP_MODF_NO_IAT) + return 0; /* Known to have no IAT */ + + /* + * Find the Import Address Table (IAT) of the module, if any present. + */ + + di = win32dlp_get_iat(module->addr, &size); + + if (NULL == di) { + module->flags |= WIN32DLP_MODF_NO_IAT; + win32dlp_debugf("no IAT in module %p (%s)", module->addr, module->name); + return 0; + } + + /* + * Find all the import descriptors containing references to the module + * we want. + */ + + for (/* empty */; di->Name != 0; di++) { + const char *modname = const_ptr_add_offset(module->addr, di->Name); + + if (0 == ascii_strcasecmp(modname, name)) { + IMAGE_THUNK_DATA *t; + + /* + * Found the module, now get the IAT for the functions imported + * from our wanted module. + */ + + win32dlp_debugf("found IAT for DLL %s within module %p (%s)", + name, module->addr, module->name); + + found = TRUE; + t = ptr_add_offset(module->addr, di->FirstThunk); + + /* + * Now look for the thunk matching the function we want. + */ + + for (/* empty */; t->u1.Function != 0; t++) { + PROC *fn = (PROC *) &t->u1.Function; + + if G_UNLIKELY(*fn == how->replace.addr) { + const struct win32dlp_with *with = &how->with; + + /* + * If they set the careful flag, see whether we have + * to specialize the replacement routine based on the + * module we're patching. + */ + + if (with->careful) { + with = win32dlp_with_compute(module, how); + + if G_UNLIKELY(with != &how->with) { + win32dlp_debugf("superseded default replacement of " + "%s() with %s(): using %s() for module %p (%s)", + how->replace.name, how->with.name, + with->name, module->addr, module->name); + } + } + + /* + * Update matching thunk. + */ + + win32dlp_debugf("replacing %p for %s() with %p for %s() " + "at %p within IAT of module %p (%s)", + how->replace.addr, how->replace.name, + how->with.addr, how->with.name, fn, + module->addr, module->name); + + if (!win32dlp_iat_change(fn, with->addr)) { + s_warning("%s(): cannot patch %p for %s() within " + "IAT %p of module %p (%s): %m", + G_STRFUNC, how->replace.addr, how->replace.name, + fn, module->addr, module->name); + } else { + patched++; /* Successfully patched */ + } + } + } + } + } + + if (!found) { + win32dlp_debugf("no IAT for DLL %s within module %p (%s)", + name, module->addr, module->name); + } + + return patched; /* Amount of entries patched */ +} + +/** + * Apply replacement list to a loaded module. + * + * This is a hashtable iterator callback. + */ +static void +win32dlp_apply(const void *unused_key, void *value, void *data) +{ + struct win32dlp_module *m = value; /* A loaded module */ + win32dlp_patch_t *p; + size_t patched = 0; + + (void) unused_key; + + /* + * We're iterating over the hash table containing loaded modules, and + * this table is thread-safe. Hence, we are the only thread that can + * access the patch table, and it is not necessary to lock it. + */ + + g_assert(data != NULL); /* There must be a patch table */ + + /* + * If the module has already been fully patched, there's nothing to do. + */ + + if G_LIKELY(m->flags & WIN32DLP_MODF_PATCHED) + return; + + /* + * Loop over the patch, where each entry there describes a symbol to + * be replaced among a list of modules. + */ + + for (p = data; p->replace.name != NULL; p++) { + win32dlp_module_t *mp; + g_assert(p->modules != NULL); + + /* + * The list of modules here describes the DLLs where the symbol + * to be replaced is located. + */ + + for (mp = p->modules; mp->name != NULL; mp++) { + /* + * Check whether module has been loaded, only done once per module. + */ + + if (0 == (mp->flags & WIN32DLP_MODF_PROBED)) { + mp->flags |= WIN32DLP_MODF_PROBED; + mp->addr = GetModuleHandle(mp->name); + } + + if (NULL == mp->addr) + continue; /* Module not loaded */ + + if (NULL == p->replace.addr) { + /* + * This module has been loaded, look whether it holds + * the routine we're trying to patch. If it does, then + * we'll definitely bind the replacing of that symbol + * to the DLL we just discovered was loaded. + */ + + p->replace.addr = GetProcAddress(mp->addr, p->replace.name); + + if (p->replace.addr != NULL) { + p->replace.base = mp->addr; + win32dlp_debugf("found %s() at %p in DLL %s", + p->replace.name, p->replace.addr, mp->name); + } + } + + if (p->replace.addr != NULL) + patched += win32dlp_patch_iat(m, mp->name, p); + } + } + + if (patched != 0) { + WIN32DLP_STATS_INCX(modules_patched); + WIN32DLP_STATS_ADDX(entries_patched, patched); + } + + m->flags |= WIN32DLP_MODF_PATCHED; + + win32dlp_debugf("module at %p \"%s\" patched for %zu entr%s", + m->addr, m->name, patched, plural_y(patched)); +} + +/*** + *** Trapped malloc()-related routines. + ***/ + +static void * +win32dlp_malloc(size_t n) +{ + WIN32DLP_STATS_INCX(trapped_malloc); + return xmalloc(n); +} + +static void * +win32dlp_calloc(size_t n, size_t l) +{ + WIN32DLP_STATS_INCX(trapped_calloc); + return xmalloc0(size_saturate_mult(n, l)); +} + +static void * +win32dlp_realloc(void *p, size_t n) +{ + size_t old_size; + void *np; + + WIN32DLP_STATS_INCX(trapped_realloc); + + if (NULL == p || win32dlp_via_xmalloc(p)) + return xrealloc(p, n); + + WIN32DLP_STATS_INCX(foreign_realloc); + win32dlp_debugf("foreign %p", p); + + /* + * This block was not allocated by xmalloc() and must have been + * allocated before we patched the DLL that is now calling this routine. + * + * We're allocating a new block via xmalloc() and copy the data over, + * then free-up the block. However, it is imperative that we use the + * free() routine that the DLL which is calling us would normally have + * used before our patching. + * + * If we patched-up their realloc() to lead us here, we have to assume + * we also patched-up their malloc() and can patch-up their free() to + * lead us back to our remapped routines! + * + * To know how much data there is to copy from the old block, we rely + * on the _msize() call to return the size of the allocated block by + * the malloc() layer used by the DLL, which must come from one of the + * Microsoft C runtime DLL. + */ + + old_size = win32dlp_sys_msize(p); + np = xmalloc(n); + + win32dlp_debugf("moving %'zu-byte old block at %p to %'zu-byte block at %p", + old_size, p, n, np); + + g_assert(size_is_positive(old_size)); + + memcpy(np, p, MIN(n, old_size)); + + if G_LIKELY(!win32dlp_stop_freeing) + win32dlp_sys_free(p); + + return np; +} + +static void +win32dlp_free(void *p) +{ + WIN32DLP_STATS_INCX(trapped_free); + + if (NULL == p) + return; /* Seems OK for the MS C runtime to pass NULL to free() */ + + if G_UNLIKELY(win32dlp_stop_freeing) + return; + + if (win32dlp_via_xmalloc(p)) { + xfree(p); + return; + } + + WIN32DLP_STATS_INCX(foreign_free); + win32dlp_debugf("foreign %p", p); + + win32dlp_sys_free(p); +} + +static size_t +win32dlp_msize(void *p) +{ + WIN32DLP_STATS_INCX(trapped_msize); + + if G_UNLIKELY(NULL == p) + return 0; + + if (win32dlp_via_xmalloc(p)) + return xallocated(p); + + WIN32DLP_STATS_INCX(foreign_msize); + win32dlp_debugf("foreign %p", p); + + return win32dlp_sys_msize(p); +} + +/*** + *** Trapped DLL loading routines so that we can patch them as well. + *** + *** During loading of the new library, we must prevent any other thread + *** from running or they could accidentally start using routines from + *** that library before we have a chance to apply our patches. + *** + *** Unfortunately, this cannot be done without any loophole because we + *** are not the kernel and cannot suspend all the threads from this process + *** whilst we are loading the new module and patching up its IAT. + *** + *** Both LoadLibrary() interception routines use the same strategy: + *** + *** - they lock the table recording loaded modules, to funnel all the calls + *** to LoadLibrary(). + *** + *** - they call thread_suspend_others() to ensure other threads will suspend + *** as soon as they can check for it. For discovered threads, this is + *** only possible when they attempt to use malloc() and we already patched + *** up the IAT of the modules they are using. + *** + *** - they clear the "in system call" state for simplicity. Sure we could + *** save the state and restore it, but the LoadLibrary() will only occur + *** once to get the DLL for a certain call and for that one intercepted + *** call, we will be in an unsafe state when we get an interrupt. + *** + *** This strategy assumes that we will always intercept the LoadLibrary() + *** calls a module can make (most likely to happen) and that no code from + *** the loaded library will be run until the intercepted LoadLibrary() calls + *** returns (reasonable since this is necessarily synchronous wrt. the + *** calling thread). + ***/ + +static HMODULE WINAPI +win32dlp_LoadLibraryA(const char *file) +{ + HMODULE ret; + + WIN32DLP_STATS_INCX(trapped_LoadLibraryA); + + thread_in_syscall_reset(); /* About to take locks and allocate memory */ + + hash_table_lock(win32dlp_loaded); + thread_suspend_others(FALSE); + + ret = LoadLibraryA(file); + + if (ret != NULL) { + win32dlp_add_module(file, ret); + win32dlp_patch_loaded_modules(); + } + + thread_unsuspend_others(); + hash_table_unlock(win32dlp_loaded); + + return ret; +} + +static HMODULE WINAPI +win32dlp_LoadLibraryW(const uint16 *file) +{ + HMODULE ret; + + WIN32DLP_STATS_INCX(trapped_LoadLibraryW); + + thread_in_syscall_reset(); /* About to take locks and allocate memory */ + + hash_table_lock(win32dlp_loaded); + thread_suspend_others(FALSE); + + ret = LoadLibraryW(file); + + if (ret != NULL) { + char pathMAX_PATH; + size_t conv; + + conv = utf16_to_utf8(file, path, sizeof path); + if (conv > sizeof path) { + s_warning("%s(): cannot convert path from UTF-16 to UTF-8", + G_STRFUNC); + win32dlp_add_module(win32dlp_unknown_name, ret); + } else { + win32dlp_add_module(path, ret); + } + + win32dlp_patch_loaded_modules(); + } + + thread_unsuspend_others(); + hash_table_unlock(win32dlp_loaded); + + return ret; +} + +/*** + *** Trapped HeapAlloc() and HeapFree() which target the default process heap. + *** + *** The same logic as malloc() trapping above is used. The only difference + *** here is that we are only trapping calls that target the default process + *** heap and let the others pass-through to the real routines. + ***/ + +static HANDLE win32dlp_process_heap; + +static LPVOID WINAPI +win32dlp_HeapAlloc(HANDLE h, DWORD flags, SIZE_T len) +{ + if G_UNLIKELY(NULL == win32dlp_process_heap) + win32dlp_process_heap = GetProcessHeap(); + + WIN32DLP_STATS_INCX(trapped_HeapAlloc); + + if G_UNLIKELY(h != win32dlp_process_heap) { + WIN32DLP_STATS_INCX(passed_HeapAlloc); + return HeapAlloc(h, flags, len); + } + + if (HEAP_ZERO_MEMORY & flags) + return xmalloc0(len); + + return xmalloc(len); +} + +static LPVOID WINAPI +win32dlp_HeapReAlloc(HANDLE h, DWORD flags, LPVOID p, SIZE_T len) +{ + size_t old_size; + void *np; + + if G_UNLIKELY(NULL == win32dlp_process_heap) + win32dlp_process_heap = GetProcessHeap(); + + WIN32DLP_STATS_INCX(trapped_HeapReAlloc); + + if G_UNLIKELY(h != win32dlp_process_heap) { + WIN32DLP_STATS_INCX(passed_HeapReAlloc); + return HeapReAlloc(h, flags, p, len); + } + + /* + * Because xrealloc() does not have any support for + * HEAP_REALLOC_IN_PLACE_ONLY, we flag when it is being used + * in allocations performed on the default process heap. + */ + + if G_UNLIKELY(HEAP_REALLOC_IN_PLACE_ONLY & flags) + win32dlp_in_place_only_used = TRUE; + + if G_UNLIKELY(NULL == p) { + if (HEAP_REALLOC_IN_PLACE_ONLY & flags) + return NULL; + if (HEAP_ZERO_MEMORY & flags) + return xmalloc0(len); + return xmalloc(len); + } + + /* + * Note that since we do not support the HEAP_REALLOC_IN_PLACE_ONLY flag, + * we need to let the operation fail if the block was xmalloc()ed. + * The caller needs to be prepared for that situation since no heap can + * guarantee that the operation will always be able to succeed in-place. + */ + + if (win32dlp_via_xmalloc(p)) { + if G_UNLIKELY(HEAP_REALLOC_IN_PLACE_ONLY & flags) { + WIN32DLP_STATS_INCX(failed_HeapReAlloc); + return NULL; + } + + old_size = (HEAP_ZERO_MEMORY & flags) ? xallocated(p) : 0; + np = xrealloc(p, len); + + if ((HEAP_ZERO_MEMORY & flags) && len > old_size) + memset(ptr_add_offset(np, old_size), 0, len - old_size); + + return np; + } + + /* + * Handling a block previously allocated via HeapAlloc() on the heap. + * + * If HEAP_REALLOC_IN_PLACE_ONLY is used or if we cannot compute the + * proper size of the block, pass it to HeapReAlloc() to let it handle + * the situation it created. + */ + + if G_UNLIKELY(HEAP_REALLOC_IN_PLACE_ONLY & flags) { + WIN32DLP_STATS_INCX(passed_HeapReAlloc); + return HeapReAlloc(h, flags, p, len); + } + + old_size = HeapSize(h, 0, p); + + if G_UNLIKELY((size_t) -1 == old_size) { + WIN32DLP_STATS_INCX(passed_HeapReAlloc); + return HeapReAlloc(h, flags, p, len); + } + + WIN32DLP_STATS_INCX(foreign_HeapReAlloc); + + np = xmalloc(len); + memcpy(np, p, MIN(len, old_size)); + + if ((HEAP_ZERO_MEMORY & flags) && len > old_size) + memset(ptr_add_offset(np, old_size), 0, len - old_size); + + HeapFree(h, 0, p); /* Old block, we now manage this memory */ + + return np; +} + +static BOOL WINAPI +win32dlp_HeapFree(HANDLE h, DWORD flags, LPVOID p) +{ + if G_UNLIKELY(NULL == win32dlp_process_heap) + win32dlp_process_heap = GetProcessHeap(); + + WIN32DLP_STATS_INCX(trapped_HeapFree); + + if G_UNLIKELY(h != win32dlp_process_heap) { + WIN32DLP_STATS_INCX(passed_HeapFree); + return HeapFree(h, flags, p); + } + + if (win32dlp_via_xmalloc(p)) { + xfree(p); + return TRUE; + } + + WIN32DLP_STATS_INCX(foreign_HeapFree); + + return HeapFree(h, flags, p); +} + +static SIZE_T WINAPI +win32dlp_HeapSize(HANDLE h, DWORD flags, LPCVOID p) +{ + if G_UNLIKELY(NULL == win32dlp_process_heap) + win32dlp_process_heap = GetProcessHeap(); + + WIN32DLP_STATS_INCX(trapped_HeapSize); + + if G_UNLIKELY(h != win32dlp_process_heap) { + WIN32DLP_STATS_INCX(passed_HeapSize); + return HeapSize(h, flags, p); + } + + if G_UNLIKELY(NULL == p) + return 0; + + if (win32dlp_via_xmalloc(p)) + return xallocated(p); + + WIN32DLP_STATS_INCX(foreign_HeapSize); + + return HeapSize(h, flags, p); +} + +/*** + *** Patch table definition. + ***/ + +/* Avoid warnings if already defined in some global header */ +#undef MODULE +#undef REPLACE +#undef WITH +#undef CARE +#undef IN + +#define MODULE(x) { x, NULL, 0 } +#define REPLACE(x) { # x, NULL, NULL } +#define WITH(x) { # x, (PROC) x, FALSE } /* Plain, static mapping */ +#define CARE(x) { # x, (PROC) x, TRUE } /* Uses "careful" trap */ +#define IN(x) win32dlp_ ## x + +#define REPLACE_NULL { NULL, NULL, NULL } +#define WITH_NULL { NULL, NULL, FALSE } +#define IN_NULL NULL + +/** + * Microsoft's C runtime DLLs (names are case-insensitive). + */ +static win32dlp_module_t win32dlp_msvcr = { + MODULE("msvcr20.dll"), + MODULE("msvcr40.dll"), + MODULE("msvcr70.dll"), + MODULE("msvcr71.dll"), + MODULE("msvcr80.dll"), + MODULE("msvcr90.dll"), + MODULE("msvcr100.dll"), + MODULE("msvcrt.dll"), + MODULE(NULL), /* Trailing sentinel */ +}; + +/** + * Kernel access DLL. + */ +static win32dlp_module_t win32dlp_kernel = { + MODULE("kernel32.dll"), + MODULE(NULL), /* Trailing sentinel */ +}; + +/** + * What we are patching here. + */ +static win32dlp_patch_t win32dlp_patch = { + { REPLACE(malloc), IN(msvcr), WITH(win32dlp_malloc) }, + { REPLACE(calloc), IN(msvcr), WITH(win32dlp_calloc) }, + { REPLACE(realloc), IN(msvcr), WITH(win32dlp_realloc) }, + { REPLACE(free), IN(msvcr), WITH(win32dlp_free) }, + { REPLACE(_msize), IN(msvcr), WITH(win32dlp_msize) }, + { REPLACE(LoadLibraryA), IN(kernel), WITH(win32dlp_LoadLibraryA) }, + { REPLACE(LoadLibraryW), IN(kernel), WITH(win32dlp_LoadLibraryW) }, + { REPLACE(HeapAlloc), IN(kernel), WITH(win32dlp_HeapAlloc) }, + { REPLACE(HeapReAlloc), IN(kernel), WITH(win32dlp_HeapReAlloc) }, + { REPLACE(HeapFree), IN(kernel), WITH(win32dlp_HeapFree) }, + { REPLACE(HeapSize), IN(kernel), WITH(win32dlp_HeapSize) }, + { REPLACE_NULL, IN_NULL, WITH_NULL }, +}; + +/** + * This is an apply callback that is used to supersede the hardwired patch + * mapping in some particular cases. + * + * @param m the module which we are patching + * @param how the description of the default patching we want to do + * + * @return the target for patching. + */ +static const struct win32dlp_with * +win32dlp_with_compute(const win32dlp_module_t *m, const win32dlp_patch_t *how) +{ + g_assert(m != NULL); + g_assert(how != NULL); + + /* + * Can use m->addr and how->with.add to test for superseding a given + * routine for a special module. For instance, to change the mapping + * of "fn" in a given module whose handle is "modulehandle" and replace + * the normal "fn" mapping to "special_fn", say something like: + * + * static struct win32dlp_with superseded = WITH(special_fn); + * + * if (m->addr == modulehandle && 0 == ptr_cmp(fn, how->with.addr)) + * return &superseded; + */ + + /* EMPTY */ + + /* + * Keep original patching request if none of the above tests match. + */ + + return &how->with; /* Use original patching */ +} + +/** + * Patch all loaded modules. + */ +static void +win32dlp_patch_loaded_modules(void) +{ + hash_table_foreach(win32dlp_loaded, win32dlp_apply, win32dlp_patch); +} + +/** + * Find the original routine in the patch table (the replace.addr field). + * + * @param patch the patch holding the routines to replace + * @param name the routine we're looking for + * + * @return the address we figured out for the routine name. + */ +static void * +win32dlp_patch_find(const win32dlp_patch_t *patch, const char *name) +{ + const win32dlp_patch_t *p; + + /* + * This is done a limited amount of time at startup, a linear lookup + * will be sufficient! + */ + + for (p = patch; p->replace.name != NULL; p++) { + if (0 == strcmp(p->replace.name, name)) + return p->replace.addr; + } + + s_error("%s(): routine %s() not found in supplied patch", G_STRFUNC, name); +} + +/** + * Enable malloc by recording the original address of free() and _msize(). + */ +static void +win32dlp_malloc_enable(const win32dlp_patch_t *patch) +{ + /* + * To enable foreign malloc() block (i.e. blocks allocated by a DLL + * before we patched its IAT and which would then be handed to our + * redefined realloc() and free() routines), we need to be able to + * do two things: + * + * - we need to be able to compute the size of the allocated block by + * the foreign C runtime. Fortunately, the C runtime has _msize() to + * allow us to do just that. + * + * - we need to be able to call the original C runtime free() routine to + * dispose these allocate blocks. + * + * Therefore we capture their original address, which we computed in the + * patch structure to be able to precisely recognize the entries in the + * IAT to supersede them with our version! + */ + + win32dlp_sys_free = win32dlp_patch_find(patch, "free"); + win32dlp_sys_msize = win32dlp_patch_find(patch, "_msize"); + + /* + * The routine must be found since we already patched all the DLLs loaded + * so far. Otherwise, we would not be able to go very far. + */ + + g_assert(win32dlp_sys_free != NULL); + g_assert(win32dlp_sys_msize != NULL); +} + +/** + * Notified that the process is exiting, therefore you can stop freeing memory. + */ +void +win32dlp_exiting(void) +{ + win32dlp_stop_freeing = TRUE; +} + +/** + * Plug in the Win32 patching code. + * + * @param reserved start of the VMM reserved region + * @param size length of the VMM reserved region + */ +void +win32dlp_init(void *reserved, size_t size) +{ + tm_t start, end; + + g_assert_log(NULL == win32dlp_loaded, + "%s(): can only be called once", G_STRFUNC); + + win32dlp_debug("Win32 dynamic library patching enabled"); + + /* + * Warning: this is called very early during the process startup, and as + * such we need to make sure the auto-initialization of the various layers + * does not create a deadlock. + * + * This call ensures the thread layer is properly initialized, which must + * happen before we invoke omalloc(), otherwise we're going to deadlock + * as omalloc() takes a spinlock, tries to register it in the thread + * element which then attempts to omalloc() the main lock stack in the + * main thread element! + * + * Note that we are using an experimental omalloc_ext() routine now, + * which uses hidden spinlocks in omalloc() to precisely avoid the above + * pitfall. This is me being paranoid. + */ + + tm_now_exact(&start); /* Side effect: initializes thread layer */ + + win32dlp_debug("discovered main thread"); + + /* + * This is the region in the VM space that we have reserved for our VMM + * layer to allocate memory from. Most of the core memory is going to + * be allocted from that region. If we're given a pointer falling outside + * that range, we'll still need to use vmm_is_native_pointer() since there + * can be non-hinted memory allocations -- see mingw_valloc(). + */ + + win32dlp_vmm.start = reserved; + win32dlp_vmm.end = ptr_add_offset(reserved, size); + + win32dlp_debugf("VMM allocated segment is %p, %p", + win32dlp_vmm.start, win32dlp_vmm.end); + + /* + * This table is used to track the modules we have already loaded + * successfully, so that we may quickly skip them later when we + * re-attempt to patch modules after we have loaded new ones. + */ + + win32dlp_loaded = hash_table_new(); + hash_table_thread_safe(win32dlp_loaded); + + /* + * This hash table is used to track the modules for which we do not + * want to do any patching. + */ + + win32dlp_ignored = hash_table_new(); + + win32dlp_debug("scanning and patching loaded modules..."); + + win32dlp_scan_modules(); + WIN32DLP_STATS_ADDX(modules_initial, hash_table_size(win32dlp_loaded)); + win32dlp_patch_loaded_modules(); + + win32dlp_debug("enabling foreign malloc() blocks..."); + + win32dlp_malloc_enable(win32dlp_patch); + + tm_now_exact(&end); + + win32dlp_debugf("all done in %.03f secs.", tm_elapsed_f(&end, &start)); +} + +/** + * Dump win32 patcher statistics to specified log agent as xmalloc() stats. + * + * These are appended to xmalloc() stats on Windows so that we can monitor + * how successful the remapping strategy is. + */ +void +win32dlp_dump_stats_log(logagent_t *la, unsigned options) +{ + bool groupped = booleanize(options & DUMP_OPT_PRETTY); + +#define DUMP(x) G_STMT_START { \ + uint64 v = AU64_VALUE(&win32dlp_stats.x); \ + log_info(la, "XM win32dlp_%s = %s", #x, \ + uint64_to_string_grp(v, groupped)); \ +} G_STMT_END + + DUMP(trapped_malloc); + DUMP(trapped_calloc); + DUMP(trapped_realloc); + DUMP(trapped_free); + DUMP(trapped_msize); + DUMP(trapped_LoadLibraryA); + DUMP(trapped_LoadLibraryW); + DUMP(trapped_HeapAlloc); + DUMP(trapped_HeapReAlloc); + DUMP(trapped_HeapFree); + DUMP(trapped_HeapSize); + DUMP(passed_HeapAlloc); + DUMP(passed_HeapReAlloc); + DUMP(passed_HeapFree); + DUMP(passed_HeapSize); + DUMP(foreign_realloc); + DUMP(foreign_free); + DUMP(foreign_msize); + DUMP(foreign_HeapReAlloc); + DUMP(foreign_HeapFree); + DUMP(foreign_HeapSize); + DUMP(failed_HeapReAlloc); + DUMP(modules_initial); + DUMP(modules_loaded); + DUMP(modules_patched); + DUMP(entries_patched); +} + +/** + * Called to log win32dlp status on the specified log agent. + */ +void +win32dlp_show_settings_log(logagent_t *la) +{ + size_t patched = AU64_VALUE(&win32dlp_stats.modules_patched); + size_t loaded = AU64_VALUE(&win32dlp_stats.modules_loaded); + size_t initial = AU64_VALUE(&win32dlp_stats.modules_initial); + + log_info(la, "win32 dynamic linker patched %zu module%s out of %zu+%zu=%zu", + patched, plural(patched), initial, loaded, initial + loaded); + + if (win32dlp_in_place_only_used) + log_warning(la, "HeapReAlloc() is using HEAP_REALLOC_IN_PLACE_ONLY"); + } + +#endif /* MINGW32 */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/win32dlp.h
Added
@@ -0,0 +1,51 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Win32 dynamic library patcher. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#ifndef _win32dlp_h_ +#define _win32dlp_h_ + +/* + * Public interface. + */ + +void win32dlp_init(void *reserved, size_t size); +void win32dlp_exiting(void); + +struct logagent; + +void win32dlp_show_settings_log(struct logagent *la); +void win32dlp_dump_stats_log(struct logagent *la, unsigned options); + +#endif /* _win32dlp_h_ */ + +/* vi: set ts=4: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/wordvec.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/wordvec.c
Changed
@@ -36,6 +36,7 @@ #include "wordvec.h" #include "utf8.h" #include "halloc.h" +#include "htable.h" #include "misc.h" #include "walloc.h" #include "zalloc.h" @@ -60,7 +61,7 @@ * If we need to expand that, it will be done through regular malloc(). */ - wovec_zone = zget(WOVEC_DFLT * sizeof(word_vec_t), 2); + wovec_zone = zget(WOVEC_DFLT * sizeof(word_vec_t), 2, TRUE); } /** @@ -90,10 +91,11 @@ static word_vec_t * word_vec_zrealloc(word_vec_t *wv, int ncount) { - word_vec_t *nwv = halloc(ncount * sizeof(word_vec_t)); + word_vec_t *nwv; g_assert(ncount > WOVEC_DFLT); + HALLOC_ARRAY(nwv, ncount); memcpy(nwv, wv, WOVEC_DFLT * sizeof(word_vec_t)); zfree(wovec_zone, wv); @@ -109,25 +111,25 @@ * with the pointer to the allocated vector. If there are no items, there * is no vector returned. */ -guint +uint word_vec_make(const char *query_str, word_vec_t **wovec) { - guint n = 0; - GHashTable *seen_word = NULL; - guint nv = WOVEC_DFLT; + uint n = 0; + htable_t *seen_word = NULL; + uint nv = WOVEC_DFLT; word_vec_t *wv = zalloc(wovec_zone); const char *start = NULL; char * const query_dup = h_strdup(query_str); char *query; char first = TRUE; - guchar c; + uchar c; g_assert(wovec != NULL); for (query = query_dup; /* empty */; query++) { - gboolean is_separator; + bool is_separator; - c = *(guchar *) query; + c = *(uchar *) query; /* * We can't meet other separators than space, because the * string is normalised. @@ -138,7 +140,7 @@ if (!is_separator) start = query; } else { - guint np1; + uint np1; if (!is_separator) continue; @@ -149,10 +151,9 @@ if (first) np1 = 0; else { - if (seen_word == NULL) { - seen_word = g_hash_table_new(g_str_hash, g_str_equal); - g_hash_table_insert(seen_word, wv0.word, - GUINT_TO_POINTER(1)); + if G_UNLIKELY(NULL == seen_word) { + seen_word = htable_create(HASH_KEY_STRING, 0); + htable_insert(seen_word, wv0.word, uint_to_pointer(1)); } /* @@ -160,7 +161,7 @@ * The associated value is the index in the vector plus 1. */ - np1 = GPOINTER_TO_UINT(g_hash_table_lookup(seen_word, start)); + np1 = pointer_to_uint(htable_lookup(seen_word, start)); } if (np1--) { @@ -171,7 +172,7 @@ if (n == nv) { /* Filled all the slots */ nv *= 2; if (n > WOVEC_DFLT) - wv = hrealloc(wv, nv * sizeof(word_vec_t)); + HREALLOC_ARRAY(wv, nv); else wv = word_vec_zrealloc(wv, nv); } @@ -192,8 +193,7 @@ if (first) first = FALSE; else { - g_hash_table_insert(seen_word, entry->word, - GUINT_TO_POINTER(n)); + htable_insert(seen_word, entry->word, uint_to_pointer(n)); } } start = NULL; @@ -202,8 +202,7 @@ if (c == '\0') break; } - if (NULL != seen_word) - g_hash_table_destroy(seen_word); /* Key pointers belong to vector */ + htable_free_null(&seen_word); /* Key pointers belong to vector */ if (n) *wovec = wv; else @@ -216,9 +215,9 @@ * Release a word vector, containing `n' items. */ void -word_vec_free(word_vec_t *wovec, guint n) +word_vec_free(word_vec_t *wovec, uint n) { - guint i; + uint i; for (i = 0; i < n; i++) wfree(woveci.word, woveci.len + 1);
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/wordvec.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/wordvec.h
Changed
@@ -41,16 +41,16 @@ */ typedef struct { /**< Query word vector */ - char *word; /**< The word to search */ + char *word; /**< The word to search */ int len; /**< The word's length */ - guint amount; /**< Amount of expected occurrences */ + uint amount; /**< Amount of expected occurrences */ } word_vec_t; void word_vec_init(void); void word_vec_close(void); -guint word_vec_make(const char *query, word_vec_t **wovec); -void word_vec_free(word_vec_t *wovec, guint n); +uint word_vec_make(const char *query, word_vec_t **wovec); +void word_vec_free(word_vec_t *wovec, uint n); #endif /* _wordvec_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/wq.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/wq.c
Changed
@@ -70,10 +70,12 @@ #include "wq.h" #include "cq.h" -#include "glib-missing.h" +#include "hashing.h" #include "hashlist.h" -#include "misc.h" +#include "htable.h" +#include "log.h" #include "stacktrace.h" +#include "stringify.h" #include "walloc.h" #include "override.h" /* Must be the last header included */ @@ -115,7 +117,7 @@ /** * The wait queue associates waiting keys to the hashlist of waiters. */ -static GHashTable *waitqueue; +static htable_t *waitqueue; /** * Allocate waiting event. @@ -174,10 +176,10 @@ hash_list_t *hl; we = wq_event_alloc(key, cb, arg); - hl = g_hash_table_lookup(waitqueue, key); + hl = htable_lookup(waitqueue, key); if (NULL == hl) { - hl = hash_list_new(pointer_hash_func, NULL); - gm_hash_table_insert_const(waitqueue, key, hl); + hl = hash_list_new(pointer_hash, NULL); + htable_insert(waitqueue, key, hl); } hash_list_append(hl, we); /* FIFO layout */ @@ -188,7 +190,7 @@ * Callout queue callback fired when waiting event times out. */ static void -wq_timed_out(cqueue_t *unused_cq, void *arg) +wq_timed_out(cqueue_t *cq, void *arg) { wq_event_t *we = arg; hash_list_t *hl; @@ -197,10 +199,8 @@ wq_event_check(we); g_assert(we->tm != NULL); - (void) unused_cq; - - we->tm->timeout_ev = NULL; - hl = g_hash_table_lookup(waitqueue, we->key); + cq_zero(cq, &we->tm->timeout_ev); + hl = htable_lookup(waitqueue, we->key); g_assert(hl != NULL); @@ -223,8 +223,8 @@ we->tm->timeout_ev = cq_main_insert(we->tm->delay, wq_timed_out, we); return; case WQ_EXCLUSIVE: - g_carp("weird status WQ_EXCLUSIVE on timeout invocation of %s()", - stacktrace_routine_name(func_to_pointer(we->cb), FALSE)); + s_critical("weird status WQ_EXCLUSIVE on timeout invocation of %s()", + stacktrace_function_name(we->cb)); /* FALL THROUGH */ case WQ_REMOVE: hash_list_remove(hl, we); @@ -235,7 +235,7 @@ if (0 == hash_list_length(hl)) { hash_list_free(&hl); - g_hash_table_remove(waitqueue, we->key); + htable_remove(waitqueue, we->key); } wq_event_free(we); @@ -284,18 +284,16 @@ wq_event_check(we); - hl = g_hash_table_lookup(waitqueue, we->key); + hl = htable_lookup(waitqueue, we->key); if (NULL == hl) { - g_carp("attempt to remove event %s() on unknown key %p", - stacktrace_routine_name(func_to_pointer(we->cb), FALSE), - we->key); + s_critical("attempt to remove event %s() on unknown key %p", + stacktrace_function_name(we->cb), we->key); } if (NULL == hash_list_remove(hl, we)) { - g_carp("attempt to remove unknown event %s() on %p", - stacktrace_routine_name(func_to_pointer(we->cb), FALSE), - we->key); + s_critical("attempt to remove unknown event %s() on %p", + stacktrace_function_name(we->cb), we->key); } else if (0 == hash_list_length(hl)) { hash_list_free(&hl); - g_hash_table_remove(waitqueue, we->key); + htable_remove(waitqueue, we->key); } wq_event_free(we); @@ -347,8 +345,8 @@ if (i++ >= count) { /* Something is odd, let them know about the calling stack */ - g_carp("stopping after processing %zu item%s (list now has %zu)", - count, 1 == count ? "" : "s", hash_list_length(hl)); + s_critical("stopping after processing %zu item%s (list now has %u)", + count, plural(count), hash_list_length(hl)); } status = (*we->cb)(we->arg, data); @@ -361,8 +359,8 @@ goto remove; } - g_error("invalid status %d returned by %s()", - status, stacktrace_routine_name(func_to_pointer(we->cb), FALSE)); + s_error("invalid status %d returned by %s()", + status, stacktrace_function_name(we->cb)); remove: hash_list_iter_remove(iter); @@ -393,7 +391,7 @@ { hash_list_t *hl; - hl = g_hash_table_lookup(waitqueue, key); + hl = htable_lookup(waitqueue, key); if (hl != NULL) { wq_notify(hl, data); @@ -404,7 +402,7 @@ if (0 == hash_list_length(hl)) { hash_list_free(&hl); - g_hash_table_remove(waitqueue, key); + htable_remove(waitqueue, key); } } } @@ -418,10 +416,10 @@ * * @return TRUE if someone is waiting on the key. */ -gboolean +bool wq_waiting(const void *key) { - return gm_hash_table_contains(waitqueue, key); + return htable_contains(waitqueue, key); } /** @@ -432,13 +430,13 @@ { g_assert(NULL == waitqueue); - waitqueue = g_hash_table_new(pointer_hash_func, NULL); + waitqueue = htable_create(HASH_KEY_SELF, 0); } /** * Hash list iterator callback to free and remove waiting events. */ -static gboolean +static bool wq_free_waiting(void *key, void *unused_data) { wq_event_t *we = key; @@ -446,9 +444,8 @@ wq_event_check(we); (void) unused_data; - g_warning("leaked waiting event %s() on %p", - stacktrace_routine_name(func_to_pointer(we->cb), FALSE), - we->key); + s_warning("leaked waiting event %s() on %p", + stacktrace_function_name(we->cb), we->key); wq_event_free(we); return TRUE; @@ -458,7 +455,7 @@ * Hash table iterator to free registered waiting events. */ static void -wq_free_kv(void *unused_key, void *value, void *unused_data) +wq_free_kv(const void *unused_key, void *value, void *unused_data) { hash_list_t *hl = value; @@ -482,8 +479,8 @@ * the queue: any remaining entry is leaking and will be flagged as such. */ - g_hash_table_foreach(waitqueue, wq_free_kv, NULL); - gm_hash_table_destroy_null(&waitqueue); + htable_foreach(waitqueue, wq_free_kv, NULL); + htable_free_null(&waitqueue); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/wq.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/wq.h
Changed
@@ -73,7 +73,7 @@ wq_timeout_data(void) { static void *data; - return data != NULL ? data : (data = deconstify_gpointer(vmm_trap_page())); + return data != NULL ? data : (data = deconstify_pointer(vmm_trap_page())); } /* @@ -88,7 +88,7 @@ int delay, wq_callback_t cb, void *arg); void wq_wakeup(const void *key, void *data); void wq_cancel(wq_event_t **we_ptr); -gboolean wq_waiting(const void *key); +bool wq_waiting(const void *key); #endif /* _wq_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/xmalloc.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/xmalloc.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Raphael Manfredi + * Copyright (c) 2011-2013, Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -38,40 +38,73 @@ * Routines here are called xmalloc(), xfree(), xrealloc() and xcalloc() * to make it possible to unplug the malloc replacement easily. * - * Although xmalloc() is not tailored for multi-threading allocation, it has - * been made thread-safe because the GTK library can create multiple threads - * on some platforms, unbeknown to us! + * xmalloc() is thread-safe and will attempt to allocate small-enough blocks + * from thread-private chunks, resulting in less lock contentions in the main + * free list and faster operations since thread-private chunks do not need + * to bother with block coalescing, each chunk handling blocks of the same size. + * + * It is completely safe to have a block allocated by a thread freed by another + * thread, even if the block belongs to a thread-private chunk. In that case, + * the freeing is deferred until the owning thread gets a chance to process it + * to return it to its pool -- there are really no locks on thread-private + * chunks. * * @author Raphael Manfredi - * @date 2011 + * @date 2011-2013 */ #include "common.h" +#define XMALLOC_SOURCE + #include "xmalloc.h" + +#include "array_util.h" +#include "atomic.h" #include "bit_array.h" -#include "crash.h" /* For crash_hook_add() */ +#include "crash.h" /* For crash_hook_add(), crash_oom() */ #include "dump_options.h" -#include "glib-missing.h" +#include "elist.h" +#include "erbtree.h" +#include "evq.h" #include "log.h" +#include "mem.h" /* For mem_is_valid_ptr() */ +#include "mempcpy.h" #include "memusage.h" -#include "misc.h" /* For short_size() */ +#include "misc.h" /* For short_size() and clamp_strlen() */ #include "mutex.h" +#include "omalloc.h" +#include "once.h" +#include "palloc.h" #include "pow2.h" -#include "random.h" +#include "sha1.h" +#include "signal.h" #include "spinlock.h" +#include "str.h" /* For str_vbprintf() */ #include "stringify.h" +#include "thread.h" #include "tm.h" #include "unsigned.h" #include "vmm.h" -#include "walloc.h" +#include "win32dlp.h" +#include "xsort.h" #include "override.h" /* Must be the last header included */ -#if 1 +#ifdef USE_MY_MALLOC /* metaconfig symbol */ #define XMALLOC_IS_MALLOC /* xmalloc() becomes malloc() */ #endif +#if 0 +#define XMALLOC_SORT_SAFETY /* Adds expensive sort checking assertions */ +#endif +#if 0 +#define XMALLOC_PTR_SAFETY /* Adds costly pointer validation */ +#endif +#if 0 +#define XMALLOC_CHUNK_SAFETY /* Adds expensive thread chunk checking */ +#endif + /* * The VMM layer is based on mmap() and falls back to posix_memalign() * or memalign(). @@ -105,6 +138,18 @@ #define xmalloc_round(s) \ ((size_t) (((unsigned long) (s) + XMALLOC_MASK) & ~XMALLOC_MASK)) +#if 8 == XMALLOC_ALIGNBYTES +#define XMALLOC_ALIGNSHIFT 3 +#elif 16 == XMALLOC_ALIGNBYTES +#define XMALLOC_ALIGNSHIFT 4 +#elif 32 == XMALLOC_ALIGNBYTES +#define XMALLOC_ALIGNSHIFT 5 +#elif 64 == XMALLOC_ALIGNBYTES +#define XMALLOC_ALIGNSHIFT 6 +#else +#error "unexpected XMALLOC_ALIGNBYTES value" +#endif + /** * Header prepended to all allocated objects. */ @@ -112,7 +157,28 @@ size_t length; /**< Length of the allocated block */ }; -#define XHEADER_SIZE xmalloc_round(sizeof(struct xheader)) +/* + * In order to be able to let the C pre-processor compute the XHEADER_SIZE + * value, we need to assume that the size of the xheader structure is going + * to be that of its only field, and that the length of size_t is that of + * a pointer. These assumptions are reasonable and are verified by some of + * the STATIC_ASSERT() lines in xmalloc_vmm_inited(). + */ + +#define XMALLOC_RND(x) (((x) + XMALLOC_MASK) & ~XMALLOC_MASK) +#define XHEADER_SIZE XMALLOC_RND(PTRSIZE) /* PTRSIZE == sizeof(size_t) */ + +#if 8 == XHEADER_SIZE +#define XHEADER_SHIFT 3 +#elif 16 == XHEADER_SIZE +#define XHEADER_SHIFT 4 +#elif 32 == XHEADER_SIZE +#define XHEADER_SHIFT 5 +#elif 64 == XHEADER_SIZE +#define XHEADER_SHIFT 6 +#else +#error "unexpected XHEADER_SIZE value" +#endif /** * Allocated block size controls. @@ -143,8 +209,9 @@ */ #define XMALLOC_FACTOR_MAXSIZE 1024 #define XMALLOC_BUCKET_FACTOR MAX(XMALLOC_ALIGNBYTES, XHEADER_SIZE) +#define XMALLOC_BUCKET_SHIFT MAX(XMALLOC_ALIGNSHIFT, XHEADER_SHIFT) #define XMALLOC_BLOCK_SIZE 256 -#define XMALLOC_MAXSIZE 32768 /**< Largest block size in free list */ +#define XMALLOC_BLOCK_SHIFT 8 /** * Minimum size for a block split: the size of blocks in bucket #0. @@ -192,15 +259,18 @@ #define XMALLOC_BLOCK_MASK (XMALLOC_BLOCK_SIZE - 1) /** - * Magic size indication. - * - * Blocks allocated via walloc() have a size of WALLOC_MAX bytes at most. - * The leading 16 bits of the 32-bit size quantity are used to flag walloc() - * allocation to make sure the odd size is not a mistake. - */ -#define XMALLOC_MAGIC_FLAG 0x1U -#define XMALLOC_WALLOC_MAGIC (0xa10c0000U | XMALLOC_MAGIC_FLAG) -#define XMALLOC_WALLOC_SIZE (0x0000ffffU & ~XMALLOC_MAGIC_FLAG) + * Thread-specific buckets. + */ +#define XM_THREAD_COUNT THREAD_MAX +#define XM_THREAD_MAXSIZE 512 /* Maximum block length */ +#define XM_THREAD_ALLOC_THRESH 4 /* Wait for that many allocations */ + +/** + * This contant defines the total number of buckets in the thread-specific + * free lists. There is no block overhead in thread-specific blocks, hence + * there is no offset correction. + */ +#define XMALLOC_CHUNKHEAD_COUNT (XM_THREAD_MAXSIZE / XMALLOC_ALIGNBYTES) /** * Block coalescing options. @@ -219,6 +289,120 @@ #define XM_BUCKET_INCREMENT 64 /**< Capacity increments */ /** + * Freelist insertion burst threshold. + */ +#define XM_FREELIST_THRESH 1000 /**< Insertions per second */ + +/** + * Amount of unsorted items we can keep at the tail of a freelist bucket. + * We try to have all the pointers fit the same CPU L1/L2 cache line. + * Unfortunately we have to guess its value here, but it's OK to be wrong. + * + * We don't know if the start of the unsorted zone will be aligned on a + * cache line boundary anyway, but it helps keeping a reasonable amount of + * unsorted items whilst not decreasing performance too much. + */ +#define XM_CPU_CACHELINE 64 /**< Bytes in cache line */ +#define XM_BUCKET_UNSORTED (XM_CPU_CACHELINE / PTRSIZE) + +/** + * Free list data structure for thread-specific allocations. + * + * Normally these chunks are handled without locks, that is the idea of having + * thread-specific data structures. However, sometimes we have cross-thread + * freeing and in that case we turn on locking for the chunk. + */ +static struct xchunkhead { + size_t blocksize; /**< Block size handled by this list */ + size_t allocations; /**< Number of allocations done */ + uint shared:1; /**< A chunk was used during cross-thread frees */ + elist_t list; /**< Chunks with free blocks (struct xchunk) */ + elist_t full; /**< Chunks without free blocks (struct xchunk) */ +} xchunkheadXMALLOC_CHUNKHEAD_COUNTXM_THREAD_COUNT; + +/** + * Per-thread indication of whether thread pool allocation is disabled. + * + * A thread known to allocate only a limited amount of memory during its + * operation can give a hint to the malloc layer that no new chunk should + * be added to the thread pool and that allocation should therefore be done + * from the main free list. + */ +static uint8 xpool_disabledXM_THREAD_COUNT; + +enum xchunk_magic { XCHUNK_MAGIC = 0x45488613 }; + +/** + * Per-thread structure linking blocks belonging to a thread but released + * by other threads. + * + * Because chunks are thread-specific and use no locking, they serve memory + * quickly and we want to preserve this ability. However, there are legitimate + * cases where we cannot avoid cross-thread freeing, for instance when building + * an IPC queue between threads, messages being allocated by the sender and + * possibly freed by the receiver. + * + * To preserve the no-locking condition on thread-specific chunks, we put + * aside blocks freed by a foreign thread, linking them using the first word + * of each block. As soon as the owning thread starts allocating memory, it + * will check whether there are pending blocks in this list and it will take + * care of freeing each of them. + * + * Because this list is updated by foreign threads, it needs locking though, + * but the penalty is only paid when freeing blocks out of a foreign thread. + * Allocation remains a lock-free path. + */ +static struct xcross { + spinlock_t lock; /**< Thread-safe lock */ + size_t count; /**< Amount of blocks chained */ + void *head; /**< Head of block list to return to chunks */ + uint8 dead; /**< Thread known to be dead */ +} xcrossXM_THREAD_COUNT; + +/** + * Header for thread-specific chunks (pages). + * + * These chunks are organized like a zone, the header keeping track of the + * necessary information about the objects in the chunk and linking chunks + * handling the same object size. + * + * Objects allocated from thread-specific chunks bear no malloc header so it + * is important to be able to check that the chunk is valid. Hence the + * field redundancy, plus additional consistency checks that create highly + * unlikely conditions of mis-indentifying the chunk. + * + * This allows space-efficient memory usage since the cost of the header is + * amortized among all the objects in the page. + */ +struct xchunk { + enum xchunk_magic magic; /* Magic number for consistency check */ + unsigned xc_size; /* Object size */ + unsigned xc_stid; /* Thread STID owning this page */ + unsigned xc_capacity; /* Amount of items we can allocate */ + unsigned xc_count; /* Free items held */ + unsigned xc_free_offset; /* Offset of first free item in page */ + struct xchunkhead *xc_head; /* Chunk header */ + link_t xc_lnk; /* Links chunks of identical size */ +}; + +static inline void +xchunk_check(const struct xchunk * const xck) +{ + g_assert(xck != NULL); + g_assert(XCHUNK_MAGIC == xck->magic); +} + +/** + * Per-bucket temporary list of blocks whose insertion to the bucket was + * deferred due to the bucket being already locked by another thread. + */ +struct xdefer { + spinlock_t lock; /**< Thread-safe lock */ + size_t count; /**< Amount of blocks chained */ + void *head; /**< Head of block list to return to bucket */ +}; + +/** * Free list data structure. * * This is an array of structures pointing to allocated sorted arrays @@ -235,135 +419,346 @@ * The above function is linear by chunk and continuous. */ static struct xfreelist { + struct xdefer deferred; /**< Deferred blocks */ void **pointers; /**< Sorted array of pointers */ size_t count; /**< Amount of pointers held */ size_t capacity; /**< Maximum amount of pointers that can be held */ size_t blocksize; /**< Block size handled by this list */ + size_t sorted; /**< Amount of leading sorted pointers */ time_t last_shrink; /**< Last shrinking attempt */ mutex_t lock; /**< Bucket locking */ + uint extending:1; /**< Is being extended */ + uint shrinking:1; /**< Is being shrinked */ + uint retrofiting:1; /**< Are we retrofiting deferred blocks? */ + uint expand:1; /**< Asked to expand by xgc() */ } xfreelistXMALLOC_FREELIST_COUNT; /** * Each bit set in this bit array indicates a freelist with blocks in it. + * + * The `xfreebits_slk' lock protects access to xfreebits and xfreelist_maxidx. */ +static spinlock_t xfreebits_slk = SPINLOCK_INIT; static bit_array_t xfreebitsBIT_ARRAY_SIZE(XMALLOC_FREELIST_COUNT); +static size_t xfreelist_maxidx; /**< Highest bucket with blocks */ -#define XMALLOC_SHRINK_PERIOD 5 /**< Seconds between shrinking attempts */ +#define XMALLOC_SHRINK_PERIOD 5 /**< Secs between shrinking attempts */ +#define XMALLOC_XGC_SHRINK_PERIOD 60 /**< Idem, but from xgc() */ + +/** + * Table containing the split lengths to use for blocks that do not fit + * one of our discrete bucket sizes. + * + * For each possible size up to XMALLOC_MAXSIZE, by multiples of the + * XMALLOC_ALIGNBYTES constraint, we have the two sizes to use to split + * the block correctly. If the second size is zero, it means an exact fit. + * If the two sizes are zero, it means there is no possible 2-block split. + */ +static struct xsplit { + unsigned short larger; + unsigned short smaller; +} xsplitXMALLOC_MAXSIZE / XMALLOC_ALIGNBYTES; + +/** + * Thread-local pools used for allocations are single pages allocated by + * the VMM layer. In order to keep a reasonable amount of pages pre-allocated, + * and avoid costly freeing operations (especially when coalescing is done), + * we use a pool allocator to keep some pages around. + */ +static pool_t *xpages_pool; +static once_flag_t xpages_pool_inited; /** * Internal statistics collected. + * + * The AU64() fields are atomically updated (without taking the stats lock). */ -/* FIXME -- need to make stats updates thread-safe --RAM, 2011-12-28 */ -static struct { - guint64 allocations; /**< Total # of allocations */ - guint64 allocations_zeroed; /**< Total # of zeroing allocations */ - guint64 allocations_aligned; /**< Total # of aligned allocations */ - guint64 allocations_plain; /**< Total # of xpmalloc() calls */ - guint64 alloc_via_freelist; /**< Allocations from freelist */ - guint64 alloc_via_walloc; /**< Allocations from walloc() */ - guint64 alloc_via_vmm; /**< Allocations from VMM */ - guint64 alloc_via_sbrk; /**< Allocations from sbrk() */ - guint64 freeings; /**< Total # of freeings */ - guint64 free_sbrk_core; /**< Freeing sbrk()-allocated core */ - guint64 free_sbrk_core_released; /**< Released sbrk()-allocated core */ - guint64 free_vmm_core; /**< Freeing VMM-allocated core */ - guint64 free_coalesced_vmm; /**< VMM-freeing of coalesced block */ - guint64 free_walloc; /**< Freeing a walloc()'ed block */ - guint64 sbrk_alloc_bytes; /**< Bytes allocated from sbrk() */ - guint64 sbrk_freed_bytes; /**< Bytes released via sbrk() */ - guint64 vmm_alloc_pages; /**< Pages allocated via VMM */ - guint64 vmm_split_pages; /**< VMM pages that were split */ - guint64 vmm_freed_pages; /**< Pages released via VMM */ - guint64 aligned_via_freelist; /**< Aligned memory from freelist */ - guint64 aligned_via_freelist_then_vmm; /**< Aligned memory from VMM */ - guint64 aligned_via_vmm; /**< Idem, no freelist tried */ - guint64 aligned_via_zone; /**< Aligned memory from zone */ - guint64 aligned_via_xmalloc; /**< Aligned memory from xmalloc */ - guint64 aligned_freed; /**< Freed aligned memory */ - guint64 aligned_free_false_positives; /**< Aligned pointers not aligned */ - guint64 aligned_zones_created; /**< Zones created for alignment */ - guint64 aligned_zones_destroyed; /**< Alignment zones destroyed */ - guint64 aligned_overhead_bytes; /**< Structural overhead */ - guint64 reallocs; /**< Total # of reallocations */ - guint64 realloc_noop; /**< Reallocs not doing anything */ - guint64 realloc_inplace_vmm_shrinking; /**< Reallocs with inplace shrink */ - guint64 realloc_inplace_shrinking; /**< Idem but from freelist */ - guint64 realloc_inplace_extension; /**< Reallocs not moving data */ - guint64 realloc_coalescing_extension; /**< Reallocs through coalescing */ - guint64 realloc_relocate_vmm_fragment; /**< Reallocs of moved fragments */ - guint64 realloc_relocate_vmm_shrinked; /**< Reallocs of moved fragments */ - guint64 realloc_relocate_smart_attempts; /**< Attempts to move pointer */ - guint64 realloc_relocate_smart_success; /**< Smart placement was OK */ - guint64 realloc_regular_strategy; /**< Regular resizing strategy */ - guint64 realloc_wrealloc; /**< Used wrealloc() */ - guint64 realloc_converted_from_walloc; /**< Converted from walloc() */ - guint64 realloc_promoted_to_walloc; /**< Promoted to walloc() */ - guint64 freelist_insertions; /**< Insertions in freelist */ - guint64 freelist_insertions_no_coalescing; /**< Coalescing forbidden */ - guint64 freelist_further_breakups; /**< Breakups due to extra size */ - guint64 freelist_coalescing_ignore_vmm; /**< Ignored due to VMM block */ - guint64 freelist_coalescing_ignored; /**< Smart algo chose to ignore */ - guint64 freelist_coalescing_done; /**< Successful coalescings */ - guint64 freelist_coalescing_failed; /**< Failed coalescings */ - guint64 freelist_split; /**< Block splitted on allocation */ - guint64 freelist_nosplit; /**< Block not splitted on allocation */ +static struct xstats { + uint64 allocations; /**< Total # of allocations */ + AU64(allocations_zeroed); /**< Total # of zeroing allocations */ + uint64 allocations_aligned; /**< Total # of aligned allocations */ + AU64(allocations_heap); /**< Total # of xhmalloc() calls */ + AU64(allocations_physical); /**< Total # of xpmalloc() calls */ + AU64(allocations_in_handler); /**< Allocations from sig handler */ + uint64 alloc_via_freelist; /**< Allocations from freelist */ + uint64 alloc_via_vmm; /**< Allocations from VMM */ + uint64 alloc_via_sbrk; /**< Allocations from sbrk() */ + uint64 alloc_via_thread_pool; /**< Allocations from thread chunks */ + uint64 freeings; /**< Total # of freeings */ + AU64(freeings_in_handler); /**< Freeings from sig handler */ + AU64(free_sbrk_core); /**< Freeing sbrk()-allocated core */ + uint64 free_sbrk_core_released; /**< Released sbrk()-allocated core */ + uint64 free_vmm_core; /**< Freeing VMM-allocated core */ + AU64(free_coalesced_vmm); /**< VMM-freeing of coalesced block */ + uint64 free_thread_pool; /**< Freeing a thread-specific block */ + AU64(free_foreign_thread_pool); /**< Freeing accross threads */ + uint64 sbrk_alloc_bytes; /**< Bytes allocated from sbrk() */ + uint64 sbrk_freed_bytes; /**< Bytes released via sbrk() */ + uint64 sbrk_wasted_bytes; /**< Bytes wasted to align sbrk() */ + uint64 vmm_alloc_pages; /**< Pages allocated via VMM */ + uint64 vmm_split_pages; /**< VMM pages that were split */ + AU64(vmm_thread_pages); /**< VMM pages for thread chunks */ + uint64 vmm_freed_pages; /**< Pages released via VMM */ + uint64 aligned_via_freelist; /**< Aligned memory from freelist */ + uint64 aligned_via_freelist_then_vmm; /**< Aligned memory from VMM */ + uint64 aligned_via_vmm; /**< Idem, no freelist tried */ + uint64 aligned_via_vmm_subpage; /**< Idem, no freelist tried */ + uint64 aligned_via_zone; /**< Aligned memory from zone */ + uint64 aligned_via_xmalloc; /**< Aligned memory from xmalloc */ + AU64(aligned_lookups); /**< Lookups for aligned memory info */ + uint64 aligned_freed; /**< Freed aligned memory */ + AU64(aligned_free_false_positives); /**< Aligned pointers not aligned */ + size_t aligned_zones_capacity; /**< Max # of possible align zones */ + size_t aligned_zones_count; /**< Actually created align zones */ + uint64 aligned_arenas_created; /**< Arenas created for alignment */ + uint64 aligned_arenas_destroyed; /**< Alignment arenas destroyed */ + uint64 aligned_overhead_bytes; /**< Structural overhead */ + uint64 aligned_zone_blocks; /**< Individual blocks in zone */ + uint64 aligned_zone_memory; /**< Total memory used by zone blocks */ + uint64 aligned_vmm_blocks; /**< Individual blocks as VMM pages */ + uint64 aligned_vmm_memory; /**< Total memory used by aligned VMM */ + AU64(reallocs); /**< Total # of reallocations */ + AU64(realloc_noop); /**< Reallocs not doing anything */ + uint64 realloc_inplace_vmm_shrinking; /**< Reallocs with inplace shrink */ + uint64 realloc_inplace_shrinking; /**< Idem but from freelist */ + uint64 realloc_inplace_extension; /**< Reallocs not moving data */ + uint64 realloc_coalescing_extension; /**< Reallocs through coalescing */ + AU64(realloc_relocate_vmm_fragment); /**< Reallocs of moved fragments */ + AU64(realloc_relocate_vmm_shrinked); /**< Reallocs of moved fragments */ + AU64(realloc_relocate_smart_attempts); /**< Attempts to move pointer */ + AU64(realloc_relocate_smart_success); /**< Smart placement was OK */ + AU64(realloc_regular_strategy); /**< Regular resizing strategy */ + AU64(realloc_from_thread_pool); /**< Original was in thread pool */ + AU64(freelist_insertions); /**< Insertions in freelist */ + AU64(freelist_insertions_no_coalescing);/**< Coalescing forbidden */ + uint64 freelist_insertions_deferred; /**< Deferred insertions */ + uint64 freelist_deferred_processed; /**< Deferred blocks processed */ + AU64(freelist_bursts); /**< Burst detection events */ + AU64(freelist_burst_insertions); /**< Burst insertions in freelist */ + AU64(freelist_plain_insertions); /**< Plain appending in freelist */ + AU64(freelist_unsorted_insertions); /**< Insertions in unsorted list */ + AU64(freelist_coalescing_ignore_burst); /**< Ignored due to free burst */ + AU64(freelist_coalescing_ignore_vmm); /**< Ignored due to VMM block */ + AU64(freelist_coalescing_ignored); /**< Smart algo chose to ignore */ + AU64(freelist_coalescing_done); /**< Successful coalescings */ + AU64(freelist_coalescing_failed); /**< Failed coalescings */ + AU64(freelist_linear_lookups); /**< Linear lookups in unsorted list */ + AU64(freelist_binary_lookups); /**< Binary lookups in sorted list */ + AU64(freelist_short_yes_lookups); /**< Quick find in sorted list */ + AU64(freelist_short_no_lookups); /**< Quick miss in sorted list */ + AU64(freelist_partial_sorting); /**< Freelist tail sorting */ + AU64(freelist_full_sorting); /**< Freelist sorting of whole bucket */ + AU64(freelist_avoided_sorting); /**< Avoided full sorting of bucket */ + AU64(freelist_sorted_superseding); /**< Last sorted replaced last item */ + AU64(freelist_split); /**< Block splitted on allocation */ + AU64(freelist_nosplit); /**< Block not splitted on allocation */ + uint64 freelist_blocks; /**< Amount of blocks in free list */ + uint64 freelist_memory; /**< Memory held in freelist */ + AU64(xgc_runs); /**< Amount of xgc() runs */ + AU64(xgc_time_throttled); /**< Throttled due to running time */ + uint64 xgc_collected; /**< Amount of xgc() calls collecting */ + uint64 xgc_avoided; /**< Avoided xgc() due to no change */ + AU64(xgc_blocks_collected); /**< Amount of blocks collected */ + uint64 xgc_pages_collected; /**< Amount of pages collected */ + uint64 xgc_coalesced_blocks; /**< Amount of blocks coalesced */ + uint64 xgc_coalesced_memory; /**< Amount of memory we coalesced */ + AU64(xgc_coalescing_useless); /**< Useless coalescings of 2 blocks */ + AU64(xgc_coalescing_failed); /**< Failed block coalescing */ + AU64(xgc_page_freeing_failed); /**< Cannot free embedded pages */ + AU64(xgc_bucket_expansions); /**< How often do we expand buckets */ + AU64(xgc_bucket_shrinkings); /**< How often do we shrink buckets */ size_t user_memory; /**< Current user memory allocated */ size_t user_blocks; /**< Current amount of user blocks */ memusage_t *user_mem; /**< EMA tracker */ + /* Counter to prevent digest from being the same twice in a row */ + AU64(xmalloc_stats_digest); } xstats; +static spinlock_t xstats_slk = SPINLOCK_INIT; -static size_t xfreelist_maxidx; /**< Highest bucket with blocks */ -static guint32 xmalloc_debug; /**< Debug level */ -static gboolean safe_to_log; /**< True when we can log */ -static gboolean xmalloc_vmm_is_up; /**< True when the VMM layer is up */ -static gboolean xmalloc_random_up; /**< True when we can use random numbers */ +#define XSTATS_LOCK spinlock_hidden(&xstats_slk) +#define XSTATS_UNLOCK spinunlock_hidden(&xstats_slk) + +#define XSTATS_INCX(x) AU64_INC(&xstats.x) +#define XSTATS_DECX(x) AU64_DEC(&xstats.x) + +static uint32 xmalloc_debug; /**< Debug level */ +static bool safe_to_log; /**< True when we can log */ +static bool xmalloc_vmm_is_up; /**< True when the VMM layer is up */ static size_t sbrk_allocated; /**< Bytes allocated with sbrk() */ -static gboolean xmalloc_grows_up = TRUE; /**< Is the VM space growing up? */ -static gboolean xmalloc_no_freeing; /**< No longer release memory */ -static gboolean xmalloc_no_wfree; /**< No longer release memory via wfree() */ +static size_t sbrk_alignment; /**< Adjustments for sbrk() alignment */ +static bool xmalloc_grows_up = TRUE; /**< Is the VM space growing up? */ +static bool xmalloc_no_freeing; /**< No longer release memory */ +static bool xmalloc_crashing; /**< Crashing mode, minimal servicing */ +static long xmalloc_freelist_stamp; /**< Updated each time we add to freelist */ -static void *initial_break; /**< Initial heap break */ +static void *lowest_break; /**< Lowest heap address we know */ static void *current_break; /**< Current known heap break */ +static size_t xmalloc_pagesize; /**< Cached page size */ +static once_flag_t xmalloc_freelist_inited; +static once_flag_t xmalloc_xgc_installed; +static once_flag_t xmalloc_vmm_setup_done; +static once_flag_t xmalloc_early_inited; static spinlock_t xmalloc_sbrk_slk = SPINLOCK_INIT; -static void xmalloc_freelist_add(void *p, size_t len, guint32 coalesce); +static void xmalloc_freelist_add(void *p, size_t len, uint32 coalesce); static void *xmalloc_freelist_alloc(size_t len, size_t *allocated); static void xmalloc_freelist_setup(void); +static void xmalloc_split_setup(void); static void *xmalloc_freelist_lookup(size_t len, const struct xfreelist *exclude, struct xfreelist **flp); -static void xmalloc_freelist_insert(void *p, size_t len, guint32 coalesce); +static void xmalloc_freelist_insert(void *p, size_t len, + bool burst, uint32 coalesce); static void *xfl_bucket_alloc(const struct xfreelist *flb, - size_t size, gboolean core, size_t *allocated); + size_t size, bool core, size_t *allocated); static void xmalloc_crash_hook(void); +static void xfl_process_deferred(struct xfreelist *fl); + +/* + * Do we have deferred blocks that we can process right now? + */ +static inline bool +xfl_has_deferred(const struct xfreelist * const fl) +{ + return 0 != fl->deferred.count && !fl->extending && !fl->retrofiting; +} #define xmalloc_debugging(lvl) G_UNLIKELY(xmalloc_debug > (lvl) && safe_to_log) +#define XM_INVALID_PTR ((void *) 0xdeadbeef) + /** * Set debug level. */ void -set_xmalloc_debug(guint32 level) +set_xmalloc_debug(uint32 level) { xmalloc_debug = level; } /** + * Put the xmalloc layer in crashing mode. + * + * This is activated on assertion failures and other fatal conditions, and + * is an irreversible operation. Its purpose is to prevent any usage of + * internal data structures that could be corrupted, yet allow basic memory + * allocation during crashing. + * + * In crashing mode, allocations are done without any freelist updating, + * and no freeing will occur. The simplest algorithms are always chosen. + */ +void G_COLD +xmalloc_crash_mode(void) +{ + xmalloc_crashing = TRUE; + xmalloc_no_freeing = TRUE; +} + +/** + * Comparison function for pointers. + * + * This is tailored to put at the tail of each freelist bucket the addresses + * that are closer to the base of the virtual memory, in order to force + * reusing of these addresses first (in the hope that the other unused entries + * will end-up being coalesced and ultimately released). + */ +static inline int +xm_ptr_cmp(const void *a, const void *b) +{ + /* Larger addresses at the end of the array when addresses grow down */ + + return xmalloc_grows_up ? ptr_cmp(b, a) : ptr_cmp(a, b); +} + +/** + * Called when the main callout queue is idle to attempt background compaction. + */ +static bool +xmalloc_idle_collect(void *unused_data) +{ + (void) unused_data; + + xgc(); + return TRUE; /* Keep calling */ +} + +/** + * Pool allocation routine. + */ +static void * +xpages_pool_alloc(size_t len) +{ + return vmm_core_alloc(len); +} + +/** + * Pool freeing routine. + */ +static void +xpages_pool_free(void *p, size_t len, bool fragment) +{ + (void) fragment; + + vmm_core_free(p, len); +} + +/** + * Initialize the memory pool, used to allocate thread memory chunks. + */ +static void +xpages_pool_init(void) +{ + xpages_pool = pool_create("xmalloc thread chunks", + xmalloc_pagesize, xpages_pool_alloc, xpages_pool_free, NULL); +} + +/** + * Install periodic idle callback to run the freelist compactor. + */ +static void G_COLD +xmalloc_xgc_install(void) +{ + evq_raw_idle_add(xmalloc_idle_collect, NULL); +} + +/** + * Minimal setup once the VMM layer is started. + */ +static void G_COLD +xmalloc_vmm_setup_once(void) +{ + xmalloc_grows_up = vmm_grows_upwards(); + xmalloc_pagesize = compat_pagesize(); + xmalloc_freelist_setup(); +} + +static void G_COLD +xmalloc_vmm_setup(void) +{ + once_flag_run(&xmalloc_vmm_setup_done, xmalloc_vmm_setup_once); +} + +/** * Called when the VMM layer has been initialized. */ -G_GNUC_COLD void +void G_COLD xmalloc_vmm_inited(void) { + STATIC_ASSERT(sizeof(struct xheader) == sizeof(size_t)); + STATIC_ASSERT(XHEADER_SIZE == xmalloc_round(sizeof(struct xheader))); + STATIC_ASSERT(PTRSIZE == sizeof(size_t)); + STATIC_ASSERT(IS_POWER_OF_2(XMALLOC_ALIGNBYTES)); STATIC_ASSERT(IS_POWER_OF_2(XMALLOC_BUCKET_FACTOR)); STATIC_ASSERT(IS_POWER_OF_2(XMALLOC_BLOCK_SIZE)); STATIC_ASSERT(0 == (XMALLOC_FACTOR_MASK & XMALLOC_SPLIT_MIN)); STATIC_ASSERT(XMALLOC_SPLIT_MIN / 2 == XMALLOC_BUCKET_FACTOR); - STATIC_ASSERT(1 == (((1 << WALLOC_MAX_SHIFT) - 1) & XMALLOC_WALLOC_MAGIC)); + STATIC_ASSERT(XMALLOC_ALIGNBYTES == (1 << XMALLOC_ALIGNSHIFT)); + STATIC_ASSERT(XHEADER_SIZE == (1 << XHEADER_SHIFT)); + STATIC_ASSERT(XMALLOC_BLOCK_SIZE == (1 << XMALLOC_BLOCK_SHIFT)); xmalloc_vmm_is_up = TRUE; safe_to_log = TRUE; - xmalloc_grows_up = vmm_grows_upwards(); - xmalloc_freelist_setup(); + xmalloc_vmm_setup(); #ifdef XMALLOC_IS_MALLOC vmm_malloc_inited(); @@ -371,13 +766,57 @@ } /** + * Tells the xmalloc() layer that it runs in long-term process. + * + * A short-term process is not going to require aggressive strategies to + * compact unused memory, hence it will not require that we install xgc(). + */ +void G_COLD +xmalloc_long_term(void) +{ + /* + * We wait for the VMM layer to be up before we install the xgc() idle + * thread in an attempt to tweak the self-bootstrapping path of this + * library and avoid creating some objects too early: we wish to avoid + * sbrk() allocation if possible. + * + * The GC is now only installed then vmm_set_strategy() is called to + * install a long-term allocation strategy. Hence we know that the VMM + * layer is up. + * --RAM, 2015-12-02 + */ + + once_flag_run(&xmalloc_xgc_installed, xmalloc_xgc_install); +} + +/** + * Initialize the VMM layer minimally if not already done, and setup the + * thread allocation pools. + */ +static void G_COLD +xmalloc_early_init(void) +{ + vmm_early_init(); + xmalloc_vmm_setup(); +} + +/** * Called to log which malloc() is used on the specified log agent. */ -G_GNUC_COLD void +void G_COLD xmalloc_show_settings_log(logagent_t *la) { log_info(la, "using %s", xmalloc_is_malloc() ? "our own malloc() replacement" : "native malloc()"); + + /* + * On Windows, we're performing dynamic patching of loaded libraries + * to redirect them to our malloc(). + */ + +#ifdef MINGW32 + win32dlp_show_settings_log(la); +#endif } /** @@ -387,12 +826,21 @@ * This is called very early, and is used to record crash hooks for the * file as a side effect. */ -G_GNUC_COLD void +void G_COLD xmalloc_show_settings(void) { xmalloc_show_settings_log(log_agent_stderr_get()); crash_hook_add(_WHERE_, xmalloc_crash_hook); - xstats.user_mem = memusage_alloc("xmalloc", 0); + if (NULL == xstats.user_mem) { + memusage_t *mu = memusage_alloc("xmalloc", 0); + XSTATS_LOCK; + if (NULL == xstats.user_mem) { + xstats.user_mem = mu; + mu = NULL; + } + XSTATS_UNLOCK; + memusage_free_null(&mu); + } } /** @@ -435,7 +883,7 @@ * @param current the current physical block size * @param wanted the final physical block size after splitting */ -static gboolean +static bool xmalloc_should_split(size_t current, size_t wanted) { size_t waste; @@ -449,24 +897,6 @@ } /** - * Is block length tagged as being that of a walloc()ed block? - */ -static inline ALWAYS_INLINE gboolean -xmalloc_is_walloc(size_t len) -{ - return XMALLOC_WALLOC_MAGIC == (len & XMALLOC_WALLOC_MAGIC); -} - -/** - * Return size of walloc()ed block given a tagged length. - */ -static inline ALWAYS_INLINE size_t -xmalloc_walloc_size(size_t len) -{ - return len & XMALLOC_WALLOC_SIZE; -} - -/** * Allocate more core, when the VMM layer is still uninitialized. * * Allocation is done in a system-dependent way: sbrk() on UNIX, @@ -480,13 +910,15 @@ * with a negative increment. See xmalloc_freecore(). * * @param len amount of bytes requested + * @param can_log whether we're allowed to issue a log message * * @return pointer to more memory of at least ``len'' bytes. */ static void * -xmalloc_addcore_from_heap(size_t len) +xmalloc_addcore_from_heap(size_t len, bool can_log) { void *p; + bool locked; g_assert(size_is_positive(len)); g_assert(xmalloc_round(len) == len); @@ -495,7 +927,7 @@ * Initialize the heap break point if not done so already. */ - if G_UNLIKELY(NULL == initial_break) { + if G_UNLIKELY(NULL == lowest_break) { #ifdef HAS_SBRK current_break = sbrk(0); @@ -503,11 +935,10 @@ current_break = (void *) -1; #endif /* HAS_SBRK */ - initial_break = current_break; + lowest_break = current_break; if ((void *) -1 == current_break) { - t_error(NULL, "cannot get initial heap break address: %m"); + s_error("cannot get initial heap break address: %m"); } - xmalloc_freelist_setup(); } /* @@ -515,30 +946,104 @@ */ #ifdef HAS_SBRK - spinlock(&xmalloc_sbrk_slk); + /* + * On FreeBSD, pthread_self() calls malloc() initially, hence we have + * a bootstrapping problem... Resolve it by checking whether we already + * have the spinlock, and if we do, check whether we're running as a + * single thread. In which case we allow the call to continue, unlocked. + * --RAM, 2012-05-19 + */ + + if G_UNLIKELY(spinlock_is_held(&xmalloc_sbrk_slk)) { + if (thread_is_single()) { + locked = FALSE; + goto bypass; + } + } + + locked = TRUE; + spinlock_hidden(&xmalloc_sbrk_slk); /* Hidden for FreeBSD */ +bypass: p = sbrk(len); + + /* + * When running under valgrind, we want to avoid false reports of + * uninitialized memory reads. Since xmalloc_thread_get_chunk() can + * probe memory that has been allocated on the head, we need to make + * sure everything we get from sbrk() is indeed initialized to 0. + */ + +#ifndef ALLOW_UNINIT_VALUES + if G_LIKELY((void *) -1 != p) + memset(p, 0, len); +#endif + + /* + * Ensure pointer is aligned. + */ + + if G_UNLIKELY(xmalloc_round(p) != (size_t) p && (void *) -1 != p) { + size_t missing = xmalloc_round(p) - (size_t) p; + char *q; + g_assert(size_is_positive(missing)); + q = sbrk(missing); + +#ifndef ALLOW_UNINIT_VALUES + if G_LIKELY((void *) -1 != q) + memset(q, 0, len); +#endif + + if G_UNLIKELY((void *) -1 == q) { + p = (void *) -1; + } else { + g_assert(ptr_add_offset(p, len) == q); /* Contiguous zone */ + p = ptr_add_offset(p, missing); + XSTATS_LOCK; + xstats.sbrk_wasted_bytes += missing; + XSTATS_UNLOCK; + sbrk_alignment += missing; + } + } #else - t_error(NULL, "cannot allocate core on this platform (%zu bytes)", len); + (void) locked; + s_error("cannot allocate core on this platform (%zu bytes)", len); return p = NULL; #endif if ((void *) -1 == p) { - t_error(NULL, "cannot allocate more core (%zu bytes): %m", len); + if (locked) + spinunlock_hidden(&xmalloc_sbrk_slk); + crash_oom("cannot allocate more core (%zu bytes): %m", len); } /* * Don't assume we're the only caller of sbrk(): move the current * break pointer relatively to the allocated space rather than * simply increasing our old break pointer by ``len''. + * + * On Windows we have no idea how heap addresses will be allocated so + * explicitly maintain both the lower and upper heap ranges. */ - current_break = ptr_add_offset(p, len); + if (is_running_on_mingw()) { + void *end = ptr_add_offset(p, len); + if (ptr_cmp(p, lowest_break) < 0) + lowest_break = p; + if (ptr_cmp(end, current_break) > 0) + current_break = end; + } else { + current_break = ptr_add_offset(p, len); + } + XSTATS_LOCK; sbrk_allocated += len; + xstats.alloc_via_sbrk++; xstats.sbrk_alloc_bytes += len; - spinunlock(&xmalloc_sbrk_slk); + XSTATS_UNLOCK; + if (locked) + spinunlock_hidden(&xmalloc_sbrk_slk); - if (xmalloc_debugging(1)) { - t_debug(NULL, "XM added %zu bytes of heap core at %p", len, p); + if (xmalloc_debugging(1) && can_log) { + s_debug("XM added %zu bytes of heap core at %p", len, p); } return p; @@ -550,16 +1055,16 @@ * On UNIX we know that heap memory is allocated contiguously starting from * the initial break and moving forward. * - * On Windows we emulate the behaviour of sbrk() and therefore can use the same - * logic as on UNIX. + * on Windows we maintain the lowest and upper break ranges since we cannot + * foresee how heap addresses will be allocated. */ -static inline gboolean +static inline bool xmalloc_isheap(const void *ptr, size_t len) { if G_UNLIKELY(ptr_cmp(ptr, current_break) < 0) { /* Make sure whole region is under the break */ g_assert(ptr_cmp(const_ptr_add_offset(ptr, len), current_break) <= 0); - return ptr_cmp(ptr, initial_break) >= 0; + return ptr_cmp(ptr, lowest_break) >= 0; } else { return FALSE; } @@ -579,7 +1084,7 @@ * * @return TRUE if memory was freed, FALSE otherwise. */ -static gboolean +static bool xmalloc_freecore(void *ptr, size_t len) { g_assert(ptr != NULL); @@ -587,17 +1092,24 @@ g_assert(xmalloc_round(len) == len); /* + * In order to solve the bootstrapping problem on FreeBSD, where the + * thread layer calls malloc(), we need to grab this lock hidden so + * that we do not attempt to enter the thread layer and call thread_self(). + * --RAM, 2013-12-01 + */ + + spinlock_hidden(&xmalloc_sbrk_slk); + + /* * If the address lies within the break, there's nothing to do, unless * the freed segment is at the end of the break. The memory is not lost * forever: it should be put back into the free list by the caller. */ - spinlock(&xmalloc_sbrk_slk); - if G_UNLIKELY(ptr_cmp(ptr, current_break) < 0) { const void *end = const_ptr_add_offset(ptr, len); - xstats.free_sbrk_core++; + XSTATS_INCX(free_sbrk_core); /* * Don't assume we're the only ones using sbrk(), check the actual @@ -606,46 +1118,51 @@ if G_UNLIKELY(end == sbrk(0)) { void *old_break; - gboolean success = FALSE; + bool success = FALSE; if (xmalloc_debugging(0)) { - t_debug(NULL, "XM releasing %zu bytes of trailing heap", len); + s_debug("XM releasing %zu bytes of trailing heap at %p", + len, ptr); } #ifdef HAS_SBRK old_break = sbrk(-len); if ((void *) -1 == old_break) { - t_warning(NULL, - "XM cannot decrease break by %zu bytes: %m", len); + s_warning("XM cannot decrease break by %zu bytes: %m", len); } else { current_break = ptr_add_offset(old_break, -len); success = !is_running_on_mingw(); /* no sbrk(-x) on Windows */ } #endif /* HAS_SBRK */ - g_assert(ptr_cmp(current_break, initial_break) >= 0); + g_assert(ptr_cmp(current_break, lowest_break) >= 0); if (success) { + XSTATS_LOCK; xstats.free_sbrk_core_released++; xstats.sbrk_freed_bytes += len; + XSTATS_UNLOCK; } - spinunlock(&xmalloc_sbrk_slk); + spinunlock_hidden(&xmalloc_sbrk_slk); return success; } else { if (xmalloc_debugging(0)) { - t_debug(NULL, "XM releasing %zu bytes in middle of heap", len); + s_debug("XM releasing %zu bytes in middle of heap at %p", + len, ptr); } - spinunlock(&xmalloc_sbrk_slk); + spinunlock_hidden(&xmalloc_sbrk_slk); return FALSE; /* Memory not freed */ } } if (xmalloc_debugging(1)) - t_debug(NULL, "XM releasing %zu bytes of core", len); + s_debug("XM releasing %zu bytes of core", len); - spinunlock(&xmalloc_sbrk_slk); + spinunlock_hidden(&xmalloc_sbrk_slk); vmm_core_free(ptr, len); + XSTATS_LOCK; xstats.free_vmm_core++; xstats.vmm_freed_pages += vmm_page_count(len); + XSTATS_UNLOCK; return TRUE; } @@ -653,8 +1170,8 @@ /** * Check whether pointer is valid. */ -static gboolean -xmalloc_is_valid_pointer(const void *p) +static bool +xmalloc_is_valid_pointer(const void *p, bool locked) { if (xmalloc_round(p) != pointer_to_ulong(p)) return FALSE; @@ -663,7 +1180,12 @@ return TRUE; /* Don't validate if we're shutdowning */ if G_LIKELY(xmalloc_vmm_is_up) { - return vmm_is_native_pointer(p) || xmalloc_isheap(p, sizeof p); + /* + * Can't call vmm_is_native_pointer() if we hold a lock for fear + * of creating a deadlock. + */ + return locked || + vmm_is_native_pointer(p) || xmalloc_isheap(p, sizeof p); } else { return xmalloc_isheap(p, sizeof p); } @@ -703,7 +1225,7 @@ /** * Check that malloc header size is valid. */ -static inline gboolean +static inline bool xmalloc_is_valid_length(const void *p, size_t len) { size_t rounded; @@ -728,6 +1250,17 @@ return TRUE; /* + * Allow simplified posix_memalign() implementation: the rounded block + * can be up to XMALLOC_BLOCK_SIZE bytes longer when the size is larger + * than XMALLOC_FACTOR_MAXSIZE. This is due to the fact that rounding + * to an alignment is not always compatible with the discrete malloc + * block sizes. + */ + + if (len > XMALLOC_FACTOR_MAXSIZE && len <= XMALLOC_MAXSIZE) + return TRUE; + + /* * Have to cope with early heap allocations which are done by the libc * before we enter our main(), making it impossible to initialize * proper page size rounding. @@ -737,6 +1270,29 @@ } /** + * Computes physical size of blocks in a chunk list given the chunk index. + */ +static inline G_PURE size_t +xch_block_size_idx(size_t idx) +{ + return (idx + 1) << XMALLOC_ALIGNSHIFT; +} + +/** + * Find chunk index for a given block size. + */ +static inline G_PURE size_t +xch_find_chunkhead_index(size_t len) +{ + g_assert(size_is_positive(len)); + g_assert(xmalloc_round(len) == len); + g_assert(len <= XM_THREAD_MAXSIZE); + g_assert(len >= XMALLOC_ALIGNBYTES); + + return (len >> XMALLOC_ALIGNSHIFT) - 1; +} + +/** * Computes index of free list in the array. */ static inline size_t @@ -745,7 +1301,7 @@ size_t idx; idx = fl - &xfreelist0; - g_assert(size_is_non_negative(idx) && idx < G_N_ELEMENTS(xfreelist)); + g_assert(size_is_non_negative(idx) && idx < N_ITEMS(xfreelist)); return idx; } @@ -753,7 +1309,7 @@ /** * Computes physical size of blocks in a given free list index. */ -static inline G_GNUC_PURE size_t +static inline G_PURE size_t xfl_block_size_idx(size_t idx) { return (idx <= XMALLOC_BUCKET_CUTOVER) ? @@ -763,29 +1319,20 @@ } /** - * Computes physical size of blocks in a free list. - */ -static inline size_t -xfl_block_size(const struct xfreelist *fl) -{ - return xfl_block_size_idx(xfl_index(fl)); -} - -/** * Find freelist index for a given block size. */ -static inline size_t +static inline G_PURE size_t xfl_find_freelist_index(size_t len) { - g_assert(size_is_positive(len)); + g_assert_log(size_is_positive(len), "len=%zd", len); g_assert(xmalloc_round_blocksize(len) == len); g_assert(len <= XMALLOC_MAXSIZE); g_assert(len >= XMALLOC_SPLIT_MIN); - return (len <= XMALLOC_FACTOR_MAXSIZE) ? - len / XMALLOC_BUCKET_FACTOR - 1 - XMALLOC_BUCKET_OFFSET : + return (len <= XMALLOC_FACTOR_MAXSIZE) ? + (len >> XMALLOC_BUCKET_SHIFT) - 1 - XMALLOC_BUCKET_OFFSET : XMALLOC_BUCKET_CUTOVER + - (len - XMALLOC_FACTOR_MAXSIZE) / XMALLOC_BLOCK_SIZE; + ((len - XMALLOC_FACTOR_MAXSIZE) >> XMALLOC_BLOCK_SHIFT); } /** @@ -801,18 +1348,95 @@ } /** - * Remove trailing excess memory in pointers, accounting for hysteresis. + * Replace the buckets's array of pointers. + * + * @param fl the freelist bucket + * @param array new array to use + * @param len length of array */ static void +xfl_replace_pointer_array(struct xfreelist *fl, void **array, size_t len) +{ + size_t used, size, capacity, i; + void *ptr; + + assert_mutex_is_owned(&fl->lock); + + g_assert(array != NULL); + g_assert_log(size_is_positive(len), "len=%zu", len); + g_assert(size_is_non_negative(fl->count)); + + ptr = fl->pointers; /* Can be NULL */ + used = sizeof(void *) * fl->count; + size = sizeof(void *) * fl->capacity; + capacity = len / sizeof(void *); + + g_assert(ptr != NULL || 0 == used); + g_assert((size == 0) == (NULL == ptr)); + g_assert(len >= used); + g_assert(capacity * sizeof(void *) == len); /* Even split */ + g_assert(array != ptr); + + for (i = fl->count; i < capacity; i++) { + arrayi = XM_INVALID_PTR; /* Clear trailing (unused) entries */ + } + + memcpy(array, ptr, used); + fl->pointers = array; + fl->capacity = capacity; + + g_assert(fl->capacity >= fl->count); /* Still has room for all items */ + + /* + * Freelist bucket is now in a coherent state, we can unconditionally + * release the old bucket even if it ends up being put in the same bucket + * we just extended / shrunk. + * + * Make sure there is no deadlock possible. Inserting in the bucket + * will require grabing its mutex, and if another thread has it whilst + * it is waiting for the mutex we're holding for this bucket we're + * presently extending or shrinking, boom!. Deadlock... + * We'll need to defer insertion in the freelist until after we released + * our fl->lock mutex. + * --RAM, 2012-11-04 + * + * Added xfl_insert_careful() to make sure there are no deadlocks, which + * can occur anytime we attempt to lock two freelist buckets in the same + * execution thread. + * --RAM, 2013-09-27 + */ + + /* + * HACK ALERT: using "size != 0" instead of original "ptr != NULL" because + * the latter causes assertions failures under gcc 4.9 with optimizations: + * the "ptr != NULL" test wrongly succeeds but size is 0 (and ptr is + * actually NULL hence the test should never have succeeded). Could be a + * wrong pointer aliasing computation by the optimizer, hence using "size" + * is safe because it's an integer value? + * --RAM, 2014-08-26 + */ + + if (size != 0) /* i.e. ptr != NULL as well, see assertions above */ + xmalloc_freelist_add(ptr, size, XM_COALESCE_ALL); +} + +/** + * Remove trailing excess memory in pointers, accounting for hysteresis. + * + * @return TRUE if we actually shrank the bucket. + */ +static bool xfl_shrink(struct xfreelist *fl) { void *new_ptr; void *old_ptr; size_t old_size, old_used, new_size, allocated_size; + assert_mutex_is_owned(&fl->lock); + g_assert(fl->count < fl->capacity); g_assert(size_is_non_negative(fl->count)); - g_assert(mutex_is_owned(&fl->lock)); + g_assert(fl->shrinking); old_ptr = fl->pointers; old_size = sizeof(void *) * fl->capacity; @@ -831,7 +1455,7 @@ new_size = xmalloc_round_blocksize(new_size); if (new_size >= old_size) - return; + return FALSE; new_ptr = xfl_bucket_alloc(fl, new_size, FALSE, &allocated_size); @@ -841,18 +1465,17 @@ */ if G_UNLIKELY(NULL == new_ptr) - return; + return FALSE; /* * Detect possible recursion. */ - mutex_get(&fl->lock); + /* freelist bucket is already locked */ if G_UNLIKELY(fl->pointers != old_ptr) { - mutex_release(&fl->lock); if (xmalloc_debugging(0)) { - t_debug(NULL, "XM recursion during shrinking of freelist #%zu " + s_debug("XM recursion during shrinking of freelist #%zu " "(%zu-byte block): already has new bucket at %p " "(count = %zu, capacity = %zu)", xfl_index(fl), fl->blocksize, (void *) fl->pointers, @@ -868,16 +1491,18 @@ */ if (xmalloc_debugging(1)) { - t_debug(NULL, "XM discarding allocated bucket %p (%zu bytes) for " + s_debug("XM discarding allocated bucket %p (%zu bytes) for " "freelist #%zu", new_ptr, allocated_size, xfl_index(fl)); } xmalloc_freelist_add(new_ptr, allocated_size, XM_COALESCE_ALL); - return; + + return FALSE; } g_assert(allocated_size >= new_size); g_assert(new_ptr != old_ptr); + g_assert(new_size >= old_used); fl->last_shrink = tm_time(); @@ -887,39 +1512,27 @@ */ if G_UNLIKELY(old_size == allocated_size) { - mutex_release(&fl->lock); if (xmalloc_debugging(1)) { - t_debug(NULL, "XM discarding allocated bucket %p (%zu bytes) for " + s_debug("XM discarding allocated bucket %p (%zu bytes) for " "freelist #%zu: same size as old bucket", new_ptr, allocated_size, xfl_index(fl)); } xmalloc_freelist_add(new_ptr, allocated_size, XM_COALESCE_ALL); - return; - } - memcpy(new_ptr, old_ptr, old_used); + return FALSE; + } - fl->pointers = new_ptr; - fl->capacity = allocated_size / sizeof(void *); - mutex_release(&fl->lock); - - g_assert(fl->capacity >= fl->count); /* Still has room for all items */ + xfl_replace_pointer_array(fl, new_ptr, allocated_size); if (xmalloc_debugging(1)) { - t_debug(NULL, "XM shrunk freelist #%zu (%zu-byte block) to %zu items" + s_debug("XM shrunk freelist #%zu (%zu-byte block) to %zu items" " (holds %zu): old size was %zu bytes, new is %zu, requested %zu," " bucket at %p", xfl_index(fl), fl->blocksize, fl->capacity, fl->count, old_size, allocated_size, new_size, new_ptr); } - /* - * Freelist bucket is now in a coherent state, we can unconditionally - * release the old bucket even if it ends up being put in the same bucket - * we just shrank. - */ - - xmalloc_freelist_add(old_ptr, old_size, XM_COALESCE_ALL); + return TRUE; } /* @@ -929,9 +1542,9 @@ * after an item was removed from the freelist. */ static void -xfl_count_decreased(struct xfreelist *fl, gboolean may_shrink) +xfl_count_decreased(struct xfreelist *fl, bool may_shrink) { - g_assert(mutex_is_owned(&fl->lock)); + assert_mutex_is_owned(&fl->lock); /* * Update maximum bucket index and clear freelist bit if we removed @@ -941,6 +1554,7 @@ if G_UNLIKELY(0 == fl->count) { size_t idx = xfl_index(fl); + spinlock(&xfreebits_slk); bit_array_clear(xfreebits, idx); if G_UNLIKELY(idx == xfreelist_maxidx) { @@ -950,13 +1564,14 @@ xfreelist_maxidx = (size_t) -1 == i ? 0 : i; g_assert(size_is_non_negative(xfreelist_maxidx)); - g_assert(xfreelist_maxidx < G_N_ELEMENTS(xfreelist)); + g_assert(xfreelist_maxidx < N_ITEMS(xfreelist)); if (xmalloc_debugging(2)) { - t_debug(NULL, "XM max frelist index decreased to %zu", + s_debug("XM max frelist index decreased to %zu", xfreelist_maxidx); } } + spinunlock(&xfreebits_slk); } /* @@ -964,11 +1579,22 @@ */ if ( - may_shrink && + may_shrink && !fl->shrinking && fl->capacity - fl->count >= XM_BUCKET_INCREMENT && + fl->capacity > (fl->count + fl->deferred.count) && + fl->capacity - (fl->count + fl->deferred.count) >= + XM_BUCKET_INCREMENT && delta_time(tm_time(), fl->last_shrink) > XMALLOC_SHRINK_PERIOD ) { + /* + * Paranoid: prevent further shrinking attempts on same bucket. + * The bucket is locked by the current thread, so this is thread-safe + * and costs almost nothing. + */ + + fl->shrinking = TRUE; xfl_shrink(fl); + fl->shrinking = FALSE; } } @@ -976,7 +1602,7 @@ * Would split block length end up being redistributed to the specified * freelist bucket? */ -static gboolean +static bool xfl_block_falls_in(const struct xfreelist *flb, size_t len) { /* @@ -1017,14 +1643,15 @@ return xfl_find_freelist(len) == flb; } +#ifdef XMALLOC_PTR_SAFETY /** * Make sure pointer within freelist is valid. */ static void assert_valid_freelist_pointer(const struct xfreelist *fl, const void *p) { - if (!xmalloc_is_valid_pointer(p)) { - t_error_from(_WHERE_, NULL, + if (!xmalloc_is_valid_pointer(p, TRUE)) { + s_error_from(_WHERE_, "invalid pointer %p in %zu-byte malloc freelist: %s", p, fl->blocksize, xmalloc_invalid_ptrstr(p)); } @@ -1032,45 +1659,62 @@ if (*(size_t *) p != fl->blocksize) { size_t len = *(size_t *) p; if (!size_is_positive(len)) { - t_error_from(_WHERE_, NULL, - "detected free block corruption at %p: " + s_error_from(_WHERE_, "detected free block corruption at %p: " "block in a bucket handling %zu bytes has corrupted length %zd", p, fl->blocksize, len); } else { - t_error_from(_WHERE_, NULL, - "detected free block corruption at %p: " + s_error_from(_WHERE_, "detected free block corruption at %p: " "%zu-byte long block in a bucket handling %zu bytes", p, len, fl->blocksize); } } } +#else +static void +assert_valid_freelist_pointer(const struct xfreelist *fl, const void *p) +{ + (void) fl; + (void) p; + /* Disabled */ +} +#endif /* XMALLOC_PTR_SAFETY */ /** * Remove from the free list the block selected by xmalloc_freelist_lookup(). + * + * @param fl the freelist bucket where allocation was done + * @param p the allocated pointer (for assertions only) */ static void -xfl_remove_selected(struct xfreelist *fl) +xfl_remove_selected(struct xfreelist *fl, void *p) { - g_assert(size_is_positive(fl->count)); - g_assert(mutex_is_owned(&fl->lock)); + size_t i; - fl->count--; + assert_mutex_is_owned(&fl->lock); + + g_assert(size_is_positive(fl->count)); + g_assert(fl->count >= fl->sorted); + g_assert_log(fl->count <= fl->capacity, + "count=%zu, capacity=%zu", fl->count, fl->capacity); + + XSTATS_LOCK; + xstats.freelist_blocks--; + xstats.freelist_memory -= fl->blocksize; + XSTATS_UNLOCK; /* * See xmalloc_freelist_lookup() for the selection algorithm. * - * If we selected the last item of the array (the typical setup on - * UNIX machines where the VM space grows downwards from the end - * of the VM space), then we have nothing to do. - * - * Otherwise, we have to switch the remaining items downwards by - * one position (first item of the pointers array was selected). + * Because we selected the last item of the array we have nothing + * to do but decrease the count. */ - if (xmalloc_grows_up && fl->count != 0) { - memmove(&fl->pointers0, &fl->pointers1, - fl->count * sizeof fl->pointers0); - } + g_assert(p == fl->pointersfl->count - 1); /* Removing last item */ + + i = --fl->count; /* Index of removed item */ + fl->pointersi = XM_INVALID_PTR; /* Prevent accidental reuse */ + if (i < fl->sorted) + fl->sorted--; /* * Forbid any bucket shrinking as we could be in the middle of a bucket @@ -1078,7 +1722,7 @@ */ xfl_count_decreased(fl, FALSE); - mutex_release(&fl->lock); + mutex_unlock(&fl->lock); } /** @@ -1105,7 +1749,7 @@ g_assert(blksize >= len); - xfl_remove_selected(fl); + xfl_remove_selected(fl, p); /* * If the block is larger than the size we requested, the remainder @@ -1120,12 +1764,12 @@ split_len = blksize - len; if G_UNLIKELY(!xmalloc_should_split(blksize, len)) { - xstats.freelist_nosplit++; + XSTATS_INCX(freelist_nosplit); goto no_split; } if G_LIKELY(!xfl_block_falls_in(flb, split_len)) { - xstats.freelist_split++; + XSTATS_INCX(freelist_split); if (xmalloc_grows_up) { /* Split the end of the block */ split = ptr_add_offset(p, len); @@ -1136,19 +1780,20 @@ } if (xmalloc_debugging(3)) { - t_debug(NULL, "XM splitting large %zu-byte block at %p" + s_debug("XM splitting large %zu-byte block at %p" " (need only %zu bytes: returning %zu bytes at %p)", blksize, p, len, split_len, split); } g_assert(split_len <= XMALLOC_MAXSIZE); - xmalloc_freelist_insert(split, split_len, XM_COALESCE_NONE); + xmalloc_freelist_insert(split, split_len, + FALSE, XM_COALESCE_NONE); blksize = len; /* We shrank the allocted block */ } else { - xstats.freelist_nosplit++; + XSTATS_INCX(freelist_nosplit); if (xmalloc_debugging(3)) { - t_debug(NULL, "XM not splitting large %zu-byte block at %p" + s_debug("XM not splitting large %zu-byte block at %p" " (need only %zu bytes but split %zu bytes would fall" " in freelist #%zu)", blksize, p, len, split_len, xfl_index(flb)); @@ -1177,7 +1822,7 @@ */ static void * xfl_bucket_alloc(const struct xfreelist *flb, - size_t size, gboolean core, size_t *allocated) + size_t size, bool core, size_t *allocated) { size_t len; void *p; @@ -1196,9 +1841,11 @@ if G_LIKELY(xmalloc_vmm_is_up) { len = round_pagesize(size); p = vmm_core_alloc(len); + XSTATS_LOCK; xstats.vmm_alloc_pages += vmm_page_count(len); + XSTATS_UNLOCK; } else { - p = xmalloc_addcore_from_heap(len); + p = xmalloc_addcore_from_heap(len, TRUE); } *allocated = len; @@ -1215,7 +1862,12 @@ void *old_ptr; size_t old_size, old_used, new_size = 0, allocated_size; - g_assert(fl->count >= fl->capacity); + assert_mutex_is_owned(&fl->lock); + + g_assert(fl->extending); + g_assert_log(fl->count == fl->capacity || fl->expand, + "count=%zu, capacity=%zu, expand=%s", + fl->count, fl->capacity, bool_to_string(fl->expand)); old_ptr = fl->pointers; old_size = sizeof(void *) * fl->capacity; @@ -1233,7 +1885,7 @@ g_assert(new_size > old_size); if (xmalloc_debugging(1)) { - t_debug(NULL, "XM extending freelist #%zu (%zu-byte block) " + s_debug("XM extending freelist #%zu (%zu-byte block) " "to %zu items, count = %zu, current bucket at %p -- " "requesting %zu bytes", xfl_index(fl), fl->blocksize, new_size / sizeof(void *), @@ -1261,12 +1913,9 @@ * Detect possible recursion. */ - mutex_get(&fl->lock); - if G_UNLIKELY(fl->pointers != old_ptr) { - mutex_release(&fl->lock); if (xmalloc_debugging(0)) { - t_debug(NULL, "XM recursion during extension of freelist #%zu " + s_debug("XM recursion during extension of freelist #%zu " "(%zu-byte block): already has new bucket at %p " "(count = %zu, capacity = %zu)", xfl_index(fl), fl->blocksize, (void *) fl->pointers, @@ -1279,15 +1928,16 @@ /* * The freelist structure is coherent, we can release the bucket * we had allocated and if it causes it to be put back in this - * freelist, we may still safely recurse here since. + * freelist, we may still safely recurse here. */ if (xmalloc_debugging(1)) { - t_debug(NULL, "XM discarding allocated bucket %p (%zu bytes) for " + s_debug("XM discarding allocated bucket %p (%zu bytes) for " "freelist #%zu", new_ptr, allocated_size, xfl_index(fl)); } xmalloc_freelist_add(new_ptr, allocated_size, XM_COALESCE_ALL); + return; } @@ -1300,7 +1950,7 @@ */ if (old_used < fl->count * sizeof(void *)) { - t_error_from(_WHERE_, NULL, + s_error_from(_WHERE_, "XM self-increase during extension of freelist #%zu " "(%zu-byte block): has more items than initial %zu " "(count = %zu, capacity = %zu)", @@ -1308,106 +1958,203 @@ fl->count, fl->capacity); } - g_assert(new_ptr != old_ptr); - - memcpy(new_ptr, old_ptr, old_used); - fl->pointers = new_ptr; - fl->capacity = allocated_size / sizeof(void *); - mutex_release(&fl->lock); - - g_assert(fl->capacity > fl->count); /* Extending was OK */ + xfl_replace_pointer_array(fl, new_ptr, allocated_size); + fl->expand = FALSE; if (xmalloc_debugging(1)) { - t_debug(NULL, "XM extended freelist #%zu (%zu-byte block) to %zu items" + s_debug("XM extended freelist #%zu (%zu-byte block) to %zu items" " (holds %zu): new size is %zu bytes, requested %zu, bucket at %p", xfl_index(fl), fl->blocksize, fl->capacity, fl->count, allocated_size, new_size, new_ptr); } +} - /* - * Freelist bucket is now in a coherent state, we can unconditionally - * release the old bucket even if it ends up being put in the same bucket - * we just extended. - */ +/** + * Sorting callback for items in the pointers array from a freelist bucket. + */ +static int +xfl_ptr_cmp(const void *a, const void *b) +{ + const void * const *ap = a, * const *bp = b; + return xm_ptr_cmp(*ap, *bp); +} + +#ifdef XMALLOC_SORT_SAFETY +/** + * Verify that the freelist bucket is sorted. + * + * @param fl the freelist bucket + * @param low first index expected to be sorted + * @param count amount of items to check + * @param fmt explaination message, printf()-like + * @param ... variable printf arguments for message + */ +static void G_PRINTF(4, 5) +assert_xfl_sorted(const struct xfreelist *fl, size_t low, size_t count, + const char *fmt, ...) +{ + size_t i; + size_t high = size_saturate_add(low, count); + const char *prev = fl->pointerslow; + + for (i = low + 1; i < high; i++) { + const char *cur = fl->pointersi; - if (old_ptr != NULL) { - xmalloc_freelist_add(old_ptr, old_size, XM_COALESCE_ALL); + if (xm_ptr_cmp(prev, cur) > 0) { + va_list args; + char buf80; + + va_start(args, fmt); + str_vbprintf(buf, sizeof buf, fmt, args); + va_end(args); + + s_warning("XM freelist #%zu (%zu/%zu sorted) " + "items %zu-%zu unsorted %s: " + "breaks at item %zu", + xfl_index(fl), fl->sorted, fl->count, low, high - 1, buf, i); + + s_error_from(_WHERE_, "freelist #%zu corrupted", xfl_index(fl)); + } + + prev = cur; } } +#else +#define assert_xfl_sorted(...) +#endif /* XMALLOC_SORT_SAFETY */ /** - * Lookup for a block within a free list chunk. - * - * If ``low_ptr'' is non-NULL, it is written with the index where insertion - * of a new item should happen (in which case the returned value must be -1). - * - * @return index within the ``pointers'' sorted array where ``p'' is stored, - * -1 if not found. + * Sort freelist bucket. */ -static G_GNUC_HOT size_t -xfl_lookup(struct xfreelist *fl, const void *p, size_t *low_ptr) +static void +xfl_sort(struct xfreelist *fl) { - size_t low, mid, high; - void **pointers; - size_t count = fl->count; + size_t unsorted; + void **ary = fl->pointers; + size_t x = fl->sorted; /* Index of first unsorted item */ - g_assert(mutex_is_owned(&fl->lock)); + assert_mutex_is_owned(&fl->lock); - if G_UNLIKELY(0 == count) { - if (low_ptr != NULL) - *low_ptr = 0; - return -1; + /* + * Items from 0 to fl->sorted are already fully sorted, so we only need + * to sort the tail and see whether it makes the whole thing sorted. + */ + + unsorted = fl->count - x; + + if G_UNLIKELY(0 == unsorted) + return; + + g_assert(size_is_positive(unsorted)); + + /* + * Start by sorting the trailing unsorted items. + * + * Use xqsort() to ensure that no memory will be allocated. + */ + + if G_LIKELY(unsorted > 1) { + XSTATS_INCX(freelist_partial_sorting); + xqsort(&aryx, unsorted, sizeof ary0, xfl_ptr_cmp); + assert_xfl_sorted(fl, x, unsorted, "after xqsort"); + } + + /* + * If the unsorted items are all greater than the last sorted item, + * then the whole array is now sorted. + */ + + if (0 != x && 0 < xm_ptr_cmp(aryx - 1, aryx)) { + /* + * Here we're merging two sorted sub-parts of the array, so it could + * be faster to use smsort(). However, our quicksort() is heavily + * optimized to perform very well on almost-sorted arrays, and it has + * a much lower overhead than smsort(), so we prefer xqsort(). + * --RAM, 2012-03-03 + */ + + XSTATS_INCX(freelist_full_sorting); + xqsort(ary, fl->count, sizeof ary0, xfl_ptr_cmp); + assert_xfl_sorted(fl, 0, fl->count, "after full qsort"); + } else { + XSTATS_INCX(freelist_avoided_sorting); + assert_xfl_sorted(fl, 0, fl->count, "after nosort"); } + fl->sorted = fl->count; /* Fully sorted now */ + + if (xmalloc_debugging(1)) { + s_debug("XM sorted %zu items from freelist #%zu (%zu bytes)", + fl->count, xfl_index(fl), fl->blocksize); + } +} + +/** + * Binary lookup for a matching block within free list array, and computation + * of its insertion point. + * + * @return index within the sorted array where ``p'' is stored, -1 if not found. + */ +static inline size_t G_HOT +xfl_binary_lookup(void **array, const void *p, + size_t low, size_t high, size_t *low_ptr) +{ + size_t mid; + /* * Optimize if we have more than 4 items by looking whether the * pointer falls within the min/max ranges. */ - pointers = fl->pointers; - high = count - 1; - low = 0; - - if G_LIKELY(count > 4) { - if G_UNLIKELY(pointers0 == p) + if G_LIKELY(high - low >= 4) { + if G_UNLIKELY(arraylow == p) { + XSTATS_INCX(freelist_short_yes_lookups); return 0; - if (ptr_cmp(p, pointers0) < 0) { - if (low_ptr != NULL) { - *low_ptr = 0; - return -1; - } + } + if (xm_ptr_cmp(p, arraylow) < 0) { + if (low_ptr != NULL) + *low_ptr = low; + XSTATS_INCX(freelist_short_no_lookups); + return -1; } low++; - if G_UNLIKELY(pointershigh == p) + if G_UNLIKELY(arrayhigh == p) { + XSTATS_INCX(freelist_short_yes_lookups); return high; - if (ptr_cmp(p, pointershigh) > 0) { - if (low_ptr != NULL) { - *low_ptr = count; - return -1; - } + } + if (xm_ptr_cmp(p, arrayhigh) > 0) { + if (low_ptr != NULL) + *low_ptr = high + 1; + XSTATS_INCX(freelist_short_no_lookups); + return -1; } high--; } /* Binary search */ + XSTATS_INCX(freelist_binary_lookups); + + high++; /* Refers to first off-bound item */ + for (;;) { - const void *item; + int c; - if G_UNLIKELY(low > high || high > SIZE_MAX / 2) { - mid = -1; /* Not found */ + if G_UNLIKELY(low >= high) { + mid = (size_t) -1; /* Not found */ break; } - mid = low + (high - low) / 2; - item = pointersmid; + mid = (low + high) / 2; + c = xm_ptr_cmp(p, arraymid); - if (p > item) + if G_UNLIKELY(0 == c) + break; /* Found */ + else if (c > 0) low = mid + 1; - else if (p < item) - high = mid - 1; else - break; /* Found */ + high = mid; /* Not -1 since high is unsigned */ + } if (low_ptr != NULL) @@ -1417,35 +2164,139 @@ } /** + * Lookup for a block within a free list chunk. + * + * If ``low_ptr'' is non-NULL, it is written with the index where insertion + * of a new item should happen (in which case the returned value must be -1). + * + * @return index within the ``pointers'' sorted array where ``p'' is stored, + * -1 if not found. + */ +static size_t G_HOT +xfl_lookup(struct xfreelist *fl, const void *p, size_t *low_ptr) +{ + size_t unsorted; + + assert_mutex_is_owned(&fl->lock); + + /* + * We only process deferred blocks (reintegrating them in the bucket) + * when we're not trying to insert into the bucket. We know we're + * about to insert when the caller is supplying a non-NULL low_ptr. + */ + + if G_UNLIKELY(NULL == low_ptr && xfl_has_deferred(fl)) + xfl_process_deferred(fl); + + if G_UNLIKELY(0 == fl->count) { + if (low_ptr != NULL) + *low_ptr = 0; + return -1; + } + + assert_xfl_sorted(fl, 0, fl->sorted, "on entry in xfl_lookup"); + + unsorted = fl->count - fl->sorted; + + if G_UNLIKELY(unsorted != 0) { + size_t i; + + /* Binary search the leading sorted part, if any */ + + if G_LIKELY(fl->sorted != 0) { + i = xfl_binary_lookup(fl->pointers, p, 0, fl->sorted - 1, NULL); + + if ((size_t) -1 != i) + return i; + } + + /* + * Use a linear lookup when there are at most XM_BUCKET_UNSORTED + * unsorted items at the tail: this is expected to be held within + * a single CPU cacheline (provided its beginning is aligned). + * At worst it will cause 2 cache line loadings, but this should + * remain efficient. + */ + + if G_LIKELY(unsorted <= XM_BUCKET_UNSORTED) { + size_t total = fl->count; + void **pointers = &fl->pointersfl->sorted; + + XSTATS_INCX(freelist_linear_lookups); + + for (i = fl->sorted; i < total; i++) { + if (*pointers++ == p) + return i; + } + + if (low_ptr != NULL) + *low_ptr = fl->count; /* Array is unsorted, insert at end */ + + return -1; + } + + /* Sort it on the fly then before searching */ + + xfl_sort(fl); + } + + /* Binary search the entire (sorted) array */ + + return xfl_binary_lookup(fl->pointers, p, 0, fl->count - 1, low_ptr); +} + +/** * Delete slot ``idx'' within the free list. */ static void xfl_delete_slot(struct xfreelist *fl, size_t idx) { + assert_mutex_is_owned(&fl->lock); + g_assert(size_is_positive(fl->count)); g_assert(size_is_non_negative(idx) && idx < fl->count); - g_assert(mutex_is_owned(&fl->lock)); + g_assert(fl->count >= fl->sorted); + g_assert_log(fl->count <= fl->capacity, + "count=%zu, capacity=%zu", fl->count, fl->capacity); - fl->count--; - if (idx < fl->count) { - memmove(&fl->pointersidx, &fl->pointersidx + 1, - (fl->count - idx) * sizeof(fl->pointers0)); - } + if (idx < fl->sorted) + fl->sorted--; + + XSTATS_LOCK; + xstats.freelist_blocks--; + xstats.freelist_memory -= fl->blocksize; + XSTATS_UNLOCK; + + ARRAY_REMOVE_DEC(fl->pointers, idx, fl->count); + /* + * Regardless of whether we removed the last item or whether we + * shifted down the pointers because we removed a middle index, + * the previous last slot is now unused. + */ + + fl->pointersfl->count = XM_INVALID_PTR; /* Prevent accidental reuse */ xfl_count_decreased(fl, TRUE); - mutex_release(&fl->lock); } /** * Insert address in the free list. + * + * @param fl the freelist bucket + * @param p address of the block to insert + * @param burst whether we're in a burst insertion mode */ static void -xfl_insert(struct xfreelist *fl, void *p) +xfl_insert(struct xfreelist *fl, void *p, bool burst) { size_t idx; + bool sorted; + + assert_mutex_is_owned(&fl->lock); g_assert(size_is_non_negative(fl->count)); - g_assert(fl->count <= fl->capacity); + g_assert_log(fl->count <= fl->capacity, + "count=%zu, capacity=%zu", fl->count, fl->capacity); /* * Since the extension can use the freelist's own blocks, it could @@ -1454,29 +2305,58 @@ * index for the block. */ - while (fl->count >= fl->capacity) + while (fl->count >= fl->capacity) { + g_assert(!fl->extending); + fl->extending = TRUE; xfl_extend(fl); + fl->extending = FALSE; + } - /* - * We use a mutex and not a plain spinlock because we can recurse here - * through freelist bucket allocations. A mutex allows us to relock - * an object we already locked in the same thread. - */ + sorted = fl->count == fl->sorted; - mutex_get(&fl->lock); + assert_xfl_sorted(fl, 0, fl->sorted, "before %ssorted %s xfl_insert", + sorted ? "" : "un", burst ? "bursty" : "normal"); /* - * Compute insertion index in the sorted array. + * If we're in a burst condition, simply append to the bucket, without + * sorting the block. * - * At the same time, this allows us to make sure we're not dealing with - * a duplicate insertion. + * Note that we may insert in an unsorted list even outside a burst + * insertion condition, meaning the list was not used since the last + * time it became unsorted. */ - if G_UNLIKELY((size_t ) -1 != xfl_lookup(fl, p, &idx)) { - mutex_release(&fl->lock); - t_error_from(_WHERE_, NULL, - "block %p already in free list #%zu (%zu bytes)", - p, xfl_index(fl), fl->blocksize); + if G_UNLIKELY(burst) { + if (sorted) { + idx = fl->count; /* Append at the tail */ + + /* List still sorted, see if trivial appending keeps it sorted */ + + if (0 == idx || 0 < xm_ptr_cmp(p, fl->pointersidx - 1)) { + XSTATS_INCX(freelist_plain_insertions); + goto plain_insert; + } + } + + sorted = FALSE; /* Appending will unsort the list */ + } + + if G_LIKELY(sorted) { + /* + * Compute insertion index in the sorted array. + * + * At the same time, this allows us to make sure we're not dealing with + * a duplicate insertion. + */ + + if G_UNLIKELY((size_t ) -1 != xfl_lookup(fl, p, &idx)) { + s_error_from(_WHERE_, + "block %p already in free list #%zu (%zu bytes)", + p, xfl_index(fl), fl->blocksize); + } + } else { + idx = fl->count; /* Append at the tail */ + XSTATS_INCX(freelist_unsorted_insertions); } g_assert(size_is_non_negative(idx) && idx <= fl->count); @@ -1486,15 +2366,29 @@ */ g_assert(fl->pointers != NULL); - g_assert(idx <= fl->count); - if G_LIKELY(idx < fl->count) { - memmove(&fl->pointersidx + 1, &fl->pointersidx, - (fl->count - idx) * sizeof(fl->pointers0)); - } + ARRAY_MAKEROOM(fl->pointers, idx, fl->count, fl->capacity); + +plain_insert: + + g_assert_log(fl->count < fl->capacity, + "count=%zu, capacity=%zu", fl->count, fl->capacity); + + G_PREFETCH_W(p); + G_PREFETCH_W(&fl->lock); fl->count++; + if G_LIKELY(sorted) + fl->sorted++; fl->pointersidx = p; + XSTATS_LOCK; + xstats.freelist_blocks++; + xstats.freelist_memory += fl->blocksize; + xmalloc_freelist_stamp++; /* Let GC know it can run */ + XSTATS_UNLOCK; + + assert_xfl_sorted(fl, 0, fl->sorted, "after %ssorted %s xfl_insert @ %zu", + sorted ? "" : "un", burst ? "bursty" : "normal", idx); /* * Set corresponding bit if this is the first block inserted in the list. @@ -1503,6 +2397,7 @@ if G_UNLIKELY(1 == fl->count) { size_t fidx = xfl_index(fl); + spinlock(&xfreebits_slk); bit_array_set(xfreebits, fidx); /* @@ -1511,13 +2406,14 @@ if (xfreelist_maxidx < fidx) { xfreelist_maxidx = fidx; - g_assert(xfreelist_maxidx < G_N_ELEMENTS(xfreelist)); + g_assert(xfreelist_maxidx < N_ITEMS(xfreelist)); if (xmalloc_debugging(1)) { - t_debug(NULL, "XM max frelist index increased to %zu", + s_debug("XM max frelist index increased to %zu", xfreelist_maxidx); } } + spinunlock(&xfreebits_slk); } /* @@ -1525,39 +2421,401 @@ * beginning of the block itself. */ - /* FIXME: may need atomicity or memory barrier --RAM, 2011-12-28 */ *(size_t *) p = fl->blocksize; if (xmalloc_debugging(2)) { - t_debug(NULL, "XM inserted block %p in free list #%zu (%zu bytes)", - p, xfl_index(fl), fl->blocksize); + s_debug("XM inserted block %p in %sfree list #%zu (%zu bytes)", + p, fl->sorted != fl->count ? "unsorted " : "", + xfl_index(fl), fl->blocksize); } +} + +/** + * Process deferred blocks in freelist. + */ +static void +xfl_process_deferred(struct xfreelist *fl) +{ + struct xdefer *xdf = &fl->deferred; + size_t n = 0; + + assert_mutex_is_owned(&fl->lock); + + /* + * By flagging that we are processing deferred blocks, we prevent any + * other routine from calling us again because we have more than one + * pending block: that would needlessly cause recursion and consume + * stack space, without control. + */ - mutex_release(&fl->lock); + g_assert(!fl->retrofiting); + + fl->retrofiting = TRUE; + + for (;;) { + spinlock(&xdf->lock); + if (0 != xdf->count) { + void *p; + + p = xdf->head; + xdf->head = *(void **) p; /* Next block in list, or NULL */ + xdf->count--; + spinunlock(&xdf->lock); + + if (xmalloc_debugging(5)) { + s_minidbg("XM %s() handling deferred block %p " + "in free list #%zu (%zu bytes), with %zu more", + G_STRFUNC, p, xfl_index(fl), fl->blocksize, xdf->count); + } + + g_assert(p != NULL); + + xfl_insert(fl, p, TRUE); + n++; + } else { + spinunlock(&xdf->lock); + break; + } + } + + fl->retrofiting = FALSE; + + XSTATS_LOCK; + xstats.freelist_deferred_processed += n; + XSTATS_UNLOCK; + + if (n != 0 && xmalloc_debugging(0)) { + s_minidbg("XM %s() handled %zu deferred block%s " + "in free list #%zu (%zu bytes)", + G_STRFUNC, n, plural(n), xfl_index(fl), fl->blocksize); + } } /** - * Initial setup of the free list that cannot be conveniently initialized - * by static declaration. + * Defer insertion of the block in the specified freelist. + * + * This is called when we were unable to lock the freelist bucket prior to + * calling xlf_insert() and we need to put the block in a temporary list + * which will be processed when it is safe to do so. + * + * @param fl the freelist bucket + * @param p address of the block to insert */ -static G_GNUC_COLD void -xmalloc_freelist_setup(void) +static void +xfl_defer(struct xfreelist *fl, void *p) +{ + struct xdefer *xdf = &fl->deferred; + + if (xmalloc_debugging(5)) { + s_minidbg("XM %s() enqueuing deferred block %p " + "in free list #%zu (%zu bytes), with %zu already present", + G_STRFUNC, p, xfl_index(fl), fl->blocksize, xdf->count); + } + + /* + * We cannot deadlock because we're only grabbing the lock on the + * deferred list, which is kept for a short period of time, without + * calling any other routine. + * + * The list structure is kept using the first pointer of the block, + * since we cannot allocate any memory here. + */ + + spinlock(&xdf->lock); + g_assert(xdf->count != 0 || NULL == xdf->head); + *(void **) p = xdf->head; + xdf->head = p; + xdf->count++; + spinunlock(&xdf->lock); + + XSTATS_LOCK; + xstats.freelist_insertions_deferred++; + xmalloc_freelist_stamp++; /* Let GC know it can run */ + XSTATS_UNLOCK; +} + +/** + * Carefully insert address in the free list. + * + * We're careful to prevent deadlocks here: we attempt to lock the bucket and + * if we can't, we put the block in a temporary list where it will be picked + * later. + * + * @param fl the freelist bucket + * @param p address of the block to insert + * @param burst whether we're in a burst insertion mode + */ +static void +xfl_insert_careful(struct xfreelist *fl, void *p, bool burst) +{ + bool locked; + + /* + * We use a mutex and not a plain spinlock because we can recurse here + * through freelist bucket allocations. A mutex allows us to relock + * an object we already locked in the same thread. + */ + + locked = mutex_trylock(&fl->lock); + + /* + * If we could lock the bucket, then we can safely insert the block. + * + * If we cannot lock the bucket, the block is inserted into the + * deferred list. + */ + + if (locked) { + /* + * If the bucket is already in the process of being extended, do not + * attempt to re-insert anything inside, as we may not have any room + * in it. Better to defer the block in that case. + */ + + if G_UNLIKELY(fl->extending) { + mutex_unlock(&fl->lock); /* Do not hold the bucket's lock */ + xfl_defer(fl, p); + } else { + xfl_insert(fl, p, burst); + + /* + * Since we have the lock on the bucket, we can safely process + * deferred blocks. + */ + + if (xfl_has_deferred(fl)) + xfl_process_deferred(fl); + + mutex_unlock(&fl->lock); /* Issues final memory barrier */ + } + } else { + xfl_defer(fl, p); + } +} + +/** + * Initialize freelist buckets once. + */ +static void G_COLD +xmalloc_freelist_init_once(void) { size_t i; - for (i = 0; i < G_N_ELEMENTS(xfreelist); i++) { + for (i = 0; i < N_ITEMS(xfreelist); i++) { struct xfreelist *fl = &xfreelisti; fl->blocksize = xfl_block_size_idx(i); mutex_init(&fl->lock); + spinlock_init(&fl->deferred.lock); g_assert_log(xfl_find_freelist_index(fl->blocksize) == i, "i=%zu, blocksize=%zu, inverted_index=%zu", i, fl->blocksize, xfl_find_freelist_index(fl->blocksize)); + + g_assert(0 == fl->count); /* Cannot be used already */ + } + + for (i = 0; i < XMALLOC_CHUNKHEAD_COUNT; i++) { + size_t j; + + for (j = 0; j < XM_THREAD_COUNT; j++) { + struct xchunkhead *ch = &xchunkheadij; + + ch->blocksize = xch_block_size_idx(i); + elist_init(&ch->list, offsetof(struct xchunk, xc_lnk)); + elist_init(&ch->full, offsetof(struct xchunk, xc_lnk)); + } + } + + for (i = 0; i < N_ITEMS(xcross); i++) { + struct xcross *xcr = &xcrossi; + spinlock_init(&xcr->lock); + } + + /* + * Split information is computed once and is required information as soon + * as the freelist is in use, to be able to handle freelist insertions. + */ + + xmalloc_split_setup(); +} + +/** + * Initial setup of the free list that cannot be conveniently initialized + * by static declaration. + */ +static void G_COLD +xmalloc_freelist_setup(void) +{ + once_flag_run(&xmalloc_freelist_inited, xmalloc_freelist_init_once); + + /* + * If the address space is not growing in the same direction as the + * initial default, we have to resort all the buckets. + */ + + if (!xmalloc_grows_up) { + size_t i; + + for (i = 0; i < N_ITEMS(xfreelist); i++) { + struct xfreelist *fl = &xfreelisti; + + mutex_lock_hidden(&fl->lock); + + /* Sort with xqsort() to guarantee no memory allocation */ + + if (0 != fl->count) { + void **ary = fl->pointers; + xqsort(ary, fl->count, sizeof ary0, xfl_ptr_cmp); + fl->sorted = fl->count; + } + + mutex_unlock_hidden(&fl->lock); + } } } /** + * Solve split of block into two that exactly fit the freelist discrete + * bucket sizes. + * + * @param len length of block + * @param larger where larger block size is written + * @param smaller where smaller block size is written + * + * @return TRUE if we managed to find a solution, FALSE if block cannot + * be split into two blocks. + */ +static bool +xmalloc_split_solve(size_t len, ushort *larger, ushort *smaller) +{ + size_t mid = len / 2; + size_t l; + + for (l = len - XMALLOC_ALIGNBYTES; l >= mid; l -= XMALLOC_ALIGNBYTES) { + size_t s = len - l; + if (s < XMALLOC_SPLIT_MIN) + continue; + if ( + xmalloc_round_blocksize(l) == l && + xmalloc_round_blocksize(s) == s) + { + *larger = l; + *smaller = s; + return TRUE; + } + } + + return FALSE; +} + +/** + * Initialize the xsplit array giving the block split sizes. + */ +static void +xmalloc_split_setup(void) +{ + size_t i; + + for (i = 0; i < N_ITEMS(xsplit); i++) { + struct xsplit *xs = &xspliti; + size_t len = (i + 1) * XMALLOC_ALIGNBYTES; + + if (len < XMALLOC_SPLIT_MIN) + continue; + + /* + * We need to be able to split all blocks greater than + * XMALLOC_SPLIT_MIN bytes into two smaller blocks that + * fit our discrete bucket sizes. + */ + + if (xmalloc_round_blocksize(len) == len) { + xs->larger = len; + } else { + if (!xmalloc_split_solve(len, &xs->larger, &xs->smaller)) + s_error("xmalloc() cannot split %zu-byte blocks into 2 blocks", + len); + } + } +} + +/** + * Fetch block splitting information for a given length. + */ +static struct xsplit * +xmalloc_split_info(const size_t len) +{ + g_assert(size_is_positive(len)); + g_assert(len >= XMALLOC_SPLIT_MIN); + + return &xsplit(len - XMALLOC_ALIGNBYTES) >> XMALLOC_ALIGNSHIFT; +} + +/** + * Select block to allocate from freelist. + */ +static void * +xfl_select(struct xfreelist *fl) +{ + void *p; + + assert_mutex_is_owned(&fl->lock); + + g_assert(fl->count != 0); + g_assert_log(fl->count <= fl->capacity, + "count=%zu, capacity=%zu", fl->count, fl->capacity); + + /* + * Depending on the way the virtual memory grows, we pick the largest + * or the smallest address to try to aggregate all the objects at + * the "base" of the memory space. + * + * Until the VMM layer is up, xmalloc_grows_up will be TRUE. This is + * consistent with the fact that the heap always grows upwards on + * UNIX machines. + * + * The xm_ptr_cmp() routine makes sure the addresses we want to serve + * first are at the end of the array. + * + * When the array is unsorted, we can pick an address released recently + * and which was not sorted. It's not a problem as far as allocation goes, + * but we're always better off in the long term to allocate addresses + * at the beginning of the VM space, so we're checking to see whether + * we could be better off by selecting another address. + */ + + p = fl->pointersfl->count - 1; + + if G_UNLIKELY(fl->count != fl->sorted) { + void **ary = fl->pointers; + size_t i = fl->count - 1, j = (fl->sorted != 0) ? fl->sorted - 1 : 0; + void *q = aryj; + + g_assert(fl->sorted < fl->count); + + /* + * If the last sorted address makes up a better choice, select + * it instead, swapping the items and updating the sorted index + * if needed. + */ + + if (xm_ptr_cmp(p, q) < 0) { + aryj = p; + aryi = q; + + if (j != 0 && xm_ptr_cmp(aryj - 1, p) > 0) + fl->sorted = j; + + p = q; /* Will use this pointer instead */ + XSTATS_INCX(freelist_sorted_superseding); + } + } + + return p; +} + +/** * Look for a free block in the freelist for holding ``len'' bytes. * * @param len the desired block length (including our overhead) @@ -1569,7 +2827,7 @@ * @attention * The block is not removed from the freelist and the address returned is not * the user address but the physical start of the block. - * If the block is found, the corresponding bucket is spin-locked. + * If the block is found, the corresponding bucket is mutex-locked. */ static void * xmalloc_freelist_lookup(size_t len, const struct xfreelist *exclude, @@ -1588,31 +2846,29 @@ g_assert(size_is_non_negative(fl->count)); - if (exclude == fl) + if G_UNLIKELY(exclude == fl) continue; - mutex_get(&fl->lock); + /* + * To avoid possible deadlocks, skip bucket if we cannot lock it. + */ + + if (0 == fl->count || !mutex_trylock(&fl->lock)) + continue; + + if G_UNLIKELY(xfl_has_deferred(fl)) + xfl_process_deferred(fl); if (0 == fl->count) { - mutex_release(&fl->lock); + mutex_unlock(&fl->lock); continue; } - /* - * Depending on the way the virtual memory grows, we pick the largest - * or the smallest address to try to aggregate all the objects at - * the "base" of the memory space. - * - * Until the VMM layer is up, xmalloc_grows_up will be TRUE. This is - * consistent with the fact that the heap always grows upwards on - * UNIX machines. - */ - - p = xmalloc_grows_up ? fl->pointers0 : fl->pointersfl->count - 1; *flp = fl; + p = xfl_select(fl); if (xmalloc_debugging(8)) { - t_debug(NULL, "XM selected block %p in bucket %p " + s_debug("XM selected block %p in bucket %p " "(#%zu, %zu bytes) for %zu bytes", p, (void *) fl, i, fl->blocksize, len); } @@ -1630,7 +2886,7 @@ } /** - * Coalesce block initially given by the values pointed at by ``base'' and + * Coalesce block initially given by the values pointed at by ``base'' and * ``len'' with contiguous blocks that are present in the freelists. * * The resulting block is not part of any freelist, just as the initial block @@ -1642,19 +2898,18 @@ * @return TRUE if coalescing did occur, updating ``base_ptr'' and ``len_ptr'' * to reflect the coalesced block.. */ -static G_GNUC_HOT gboolean -xmalloc_freelist_coalesce(void **base_ptr, size_t *len_ptr, guint32 flags) +static bool G_HOT +xmalloc_freelist_coalesce(void **base_ptr, size_t *len_ptr, + bool burst, uint32 flags) { - static size_t smallsize; + size_t smallsize; size_t i, j; void *base = *base_ptr; size_t len = *len_ptr; void *end; - gboolean coalesced = FALSE; + bool coalesced = FALSE; - if G_UNLIKELY(0 == smallsize) { - smallsize = compat_pagesize() / 2; - } + smallsize = xmalloc_pagesize / 2; /* * When "smart" coalescing is requested and we're facing a block which @@ -1664,8 +2919,36 @@ */ if ((flags & XM_COALESCE_SMART) && xmalloc_round_blocksize(len) == len) { - size_t idx = xfl_find_freelist_index(len); - struct xfreelist *fl = &xfreelistidx; + size_t idx; + struct xfreelist *fl; + + /* + * Within a burst freeing, don't attempt coalescing if size is small. + */ + + if G_UNLIKELY(burst) { + if (len < smallsize) { + XSTATS_INCX(freelist_coalescing_ignore_burst); + return FALSE; + } + } + + /* + * If block is larger than the maximum size of blocks we handle from + * the freelist, don't attempt any coalescing. + */ + + if G_UNLIKELY(len >= XMALLOC_MAXSIZE) { + if (xmalloc_debugging(6)) { + s_debug("XM ignoring coalescing request for %zu-byte %p:" + " would be larger than maxsize", len, base); + } + XSTATS_INCX(freelist_coalescing_ignored); + return FALSE; + } + + idx = xfl_find_freelist_index(len); + fl = &xfreelistidx; /* * If there are little blocks in the list, there's no need to coalesce. @@ -1680,11 +2963,11 @@ if (fl->count < XMALLOC_BUCKET_MINCOUNT && len < smallsize) { if (xmalloc_debugging(6)) { - t_debug(NULL, "XM ignoring coalescing request for %zu-byte %p:" + s_debug("XM ignoring coalescing request for %zu-byte %p:" " target free list #%zu has only %zu item%s", - len, base, idx, fl->count, 1 == fl->count ? "" : "s"); + len, base, idx, fl->count, plural(fl->count)); } - xstats.freelist_coalescing_ignored++; + XSTATS_INCX(freelist_coalescing_ignored); return FALSE; } } @@ -1703,7 +2986,7 @@ */ for (i = 0; flags & XM_COALESCE_BEFORE; i++) { - gboolean found_match = FALSE; + bool found_match = FALSE; for (j = 0; j <= xfreelist_maxidx; j++) { struct xfreelist *fl = &xfreelistj; @@ -1711,21 +2994,17 @@ void *before; size_t idx; - if (0 == fl->count || !mutex_get_try(&fl->lock)) + if (0 == fl->count || !mutex_trylock(&fl->lock)) continue; blksize = fl->blocksize; before = ptr_add_offset(base, -blksize); - /* - * Avoid costly lookup if the pointer cannot be found. - */ - idx = xfl_lookup(fl, before, NULL); if G_UNLIKELY((size_t) -1 != idx) { if (xmalloc_debugging(6)) { - t_debug(NULL, "XM iter #%zu, " + s_debug("XM iter #%zu, " "coalescing previous %zu-byte %p, %p " "from list #%zu with %zu-byte %p, %p", i, blksize, before, ptr_add_offset(before, blksize), @@ -1735,9 +3014,9 @@ xfl_delete_slot(fl, idx); base = before; found_match = coalesced = TRUE; - } else { - mutex_release(&fl->lock); } + + mutex_unlock(&fl->lock); } if (!found_match) @@ -1749,13 +3028,13 @@ */ for (i = 0; flags & XM_COALESCE_AFTER; i++) { - gboolean found_match = FALSE; + bool found_match = FALSE; for (j = 0; j <= xfreelist_maxidx ; j++) { struct xfreelist *fl = &xfreelistj; size_t idx; - if (0 == fl->count || !mutex_get_try(&fl->lock)) + if (0 == fl->count || !mutex_trylock(&fl->lock)) continue; idx = xfl_lookup(fl, end, NULL); @@ -1764,7 +3043,7 @@ size_t blksize = fl->blocksize; if (xmalloc_debugging(6)) { - t_debug(NULL, "XM iter #%zu, " + s_debug("XM iter #%zu, " "coalescing next %zu-byte %p, %p " "from list #%zu with %zu-byte %p, %p", i, blksize, end, ptr_add_offset(end, blksize), @@ -1774,9 +3053,9 @@ xfl_delete_slot(fl, idx); end = ptr_add_offset(end, blksize); found_match = coalesced = TRUE; - } else { - mutex_release(&fl->lock); } + + mutex_unlock(&fl->lock); } if (!found_match) @@ -1790,9 +3069,9 @@ if G_UNLIKELY(coalesced) { *base_ptr = base; *len_ptr = ptr_diff(end, base); - xstats.freelist_coalescing_done++; + XSTATS_INCX(freelist_coalescing_done); } else { - xstats.freelist_coalescing_failed++; + XSTATS_INCX(freelist_coalescing_failed); } return coalesced; @@ -1811,22 +3090,21 @@ * * @return TRUE if pages were freed and output parameters updated. */ -static gboolean +static bool xmalloc_free_pages(void *p, size_t len, void **head, size_t *head_len, void **tail, size_t *tail_len) { - size_t pagesize = compat_pagesize(); void *page; const void *end; const void *vend; size_t plen, hlen, tlen; - page = deconstify_gpointer(vmm_page_start(p)); + page = deconstify_pointer(vmm_page_start(p)); end = ptr_add_offset(p, len); if (ptr_cmp(page, p) < 0) { - page = ptr_add_offset(page, pagesize); + page = ptr_add_offset(page, xmalloc_pagesize); if (ptr_cmp(page, end) >= 0) return FALSE; /* Block is fully held in one VMM page */ } @@ -1856,9 +3134,9 @@ if (tlen != 0 && tlen < XMALLOC_SPLIT_MIN) return FALSE; - *head = deconstify_gpointer(p); + *head = deconstify_pointer(p); *head_len = hlen; - *tail = deconstify_gpointer(vend); + *tail = deconstify_pointer(vend); *tail_len = tlen; /* @@ -1866,7 +3144,7 @@ */ if (xmalloc_debugging(1)) { - t_debug(NULL, + s_debug( "XM releasing VMM %p, %p (%zu bytes) within %p, %p (%zu bytes)", page, vend, ptr_diff(vend, page), p, end, len); } @@ -1874,17 +3152,24 @@ plen = ptr_diff(vend, page); vmm_core_free(page, plen); + XSTATS_LOCK; xstats.free_vmm_core++; xstats.vmm_freed_pages += vmm_page_count(plen); + XSTATS_UNLOCK; return TRUE; } /** * Insert block in free list, with optional block coalescing. + * + * @param p the address of the block + * @param len the physical length of the block + * @param burst if TRUE, we're within a burst of freelist insertions + * @param coalesce block coalescing flags */ static void -xmalloc_freelist_insert(void *p, size_t len, guint32 coalesce) +xmalloc_freelist_insert(void *p, size_t len, bool burst, uint32 coalesce) { struct xfreelist *fl; @@ -1892,24 +3177,24 @@ * First attempt to coalesce memory as much as possible if requested. */ - xstats.freelist_insertions++; + XSTATS_INCX(freelist_insertions); - if (coalesce) { - xmalloc_freelist_coalesce(&p, &len, coalesce); + if (coalesce & XM_COALESCE_ALL) { + xmalloc_freelist_coalesce(&p, &len, burst, coalesce); } else { - xstats.freelist_insertions_no_coalescing++; + XSTATS_INCX(freelist_insertions_no_coalescing); } /* * Chunks of memory larger than XMALLOC_MAXSIZE need to be broken up * into smaller blocks. This can happen when we're putting heap memory * back into the free list, or when a block larger than a page size is - * actually spread over two distinct VM pages.. + * actually spread over two distinct VM pages. */ if G_UNLIKELY(len > XMALLOC_MAXSIZE) { if (xmalloc_debugging(3)) { - t_debug(NULL, "XM breaking up %s block %p (%zu bytes)", + s_debug("XM breaking up %s block %p (%zu bytes)", xmalloc_isheap(p, len) ? "heap" : "VMM", p, len); } @@ -1925,7 +3210,7 @@ fl = &xfreelistXMALLOC_FREELIST_COUNT - 2; } - xfl_insert(fl, p); + xfl_insert_careful(fl, p, burst); p = ptr_add_offset(p, fl->blocksize); len -= fl->blocksize; } @@ -1939,119 +3224,102 @@ */ if (len > XMALLOC_FACTOR_MAXSIZE) { - size_t multiple; + struct xsplit *xs = xmalloc_split_info(len); - multiple = len & ~XMALLOC_BLOCK_MASK; + /* Every size can be split as long as it is properly aligned */ - /* - * Watch out for blocks having a trailing unsplit part and which - * will therefore not end up with a completely valid blocksize if - * they are blindly put in the largest freelist first. - */ + g_assert(xmalloc_round(len) == len); + g_assert_log(0 != xs->larger, "len=%zu => smaller=%u, larger=%u", + len, xs->smaller, xs->larger); - if G_UNLIKELY(len - multiple == XMALLOC_SPLIT_MIN / 2) { - if (len < 2 * XMALLOC_FACTOR_MAXSIZE) { - multiple = XMALLOC_FACTOR_MAXSIZE / 2; - } else { - multiple = (len - XMALLOC_FACTOR_MAXSIZE) & ~XMALLOC_BLOCK_MASK; - } - if (xmalloc_debugging(3)) { - t_debug(NULL, "XM specially adjusting length of %zu: " - "breaking into %zu and %zu bytes", - len, multiple, len - multiple); - } + if (0 != xs->smaller && xmalloc_debugging(3)) { + s_debug("XM breaking up %s block %p (%zu bytes) into (%u, %u)", + xmalloc_isheap(p, len) ? "heap" : "VMM", p, len, + xs->larger, xs->smaller); } - split_again: - if (multiple != len) { - if (xmalloc_debugging(3)) { - t_debug(NULL, "XM breaking up %s block %p (%zu bytes)", - xmalloc_isheap(p, len) ? "heap" : "VMM", p, len); - } - - fl = xfl_find_freelist(multiple); - xfl_insert(fl, p); - p = ptr_add_offset(p, multiple); - len -= multiple; - } - - /* - * Again, when facing an initial length of 2048+4 = 2052 bytes, - * we would end up with 1028 bytes here, which is still not good - * enough. As soon as we break under the XMALLOC_FACTOR_MAXSIZE - * limit, we'll hit buckets with multiple of the alignbytes constant, - * so we will always be able to find a matching bucket. - */ - - if (len > XMALLOC_FACTOR_MAXSIZE) { - /* - * The split bucket is chosen randomly so as to not artificially - * raise the amount of blocks held in a given freelist. We can - * only use the random values after initialization. - */ - - if G_LIKELY(xmalloc_random_up) { - size_t bucket = random_value( - XMALLOC_BUCKET_CUTOVER - XMALLOC_BUCKET_OFFSET); - multiple = xfl_block_size_idx(bucket); - } else { - multiple = XMALLOC_FACTOR_MAXSIZE / 2; - } - - if G_UNLIKELY(len - multiple < XMALLOC_SPLIT_MIN) { - multiple -= XMALLOC_BUCKET_FACTOR; - g_assert(size_is_positive(multiple)); - g_assert(multiple >= XMALLOC_SPLIT_MIN); - } - - if (xmalloc_debugging(3)) { - t_debug(NULL, "XM further adjusting remaining length of %zu: " - "breaking into %zu and %zu bytes", - len, multiple, len - multiple); - } - - xstats.freelist_further_breakups++; - goto split_again; + if (0 != xs->smaller) { + fl = xfl_find_freelist(xs->smaller); + xfl_insert_careful(fl, p, burst); + p = ptr_add_offset(p, xs->smaller); + len -= xs->smaller; } /* FALL THROUGH */ } fl = xfl_find_freelist(len); - xfl_insert(fl, p); + xfl_insert_careful(fl, p, burst); } /** * Add memory chunk to free list, possibly releasing core. */ static void -xmalloc_freelist_add(void *p, size_t len, guint32 coalesce) +xmalloc_freelist_add(void *p, size_t len, uint32 coalesce) { - gboolean coalesced = FALSE; + static time_t last; + static size_t calls; + time_t now; + bool coalesced = FALSE; + bool is_heap, in_burst = FALSE; + + /* + * Detect bursts of xfree() calls because coalescing plus insertion + * in the sorted buckets can quickly raise the time spent since the + * algorithmic complexity becomes O(n^2). + * + * When we're dealing with less than XM_FREELIST_THRESH additions + * per second, we don't consider we're in a xfree() burst. + * + * Within a burst condition, we're allowing coalescing but insertions + * in the freelist are mere appending (no sorting). + * Sorting will be deferred up to the moment where we need to lookup + * an item in the freelist. + */ + + now = tm_time(); + + if G_UNLIKELY(now != last) { + calls = 1; + last = now; + } else { + calls++; + if G_UNLIKELY(calls > XM_FREELIST_THRESH) { + in_burst = TRUE; + XSTATS_INCX(freelist_burst_insertions); + if G_UNLIKELY(calls == XM_FREELIST_THRESH + 1) + XSTATS_INCX(freelist_bursts); + } + } /* * First attempt to coalesce memory as much as possible if requested. * * When dealing with blocks that are page-aligned, whose size is - * exactly a multiple of system pages and where allocated from the + * exactly a multiple of system pages and were allocated from the * VMM layer, it would be harmful to attempt coalescing: we want to * free those VMM pages right away. */ - if (coalesce) { + is_heap = xmalloc_isheap(p, len); + if G_UNLIKELY(is_heap) + coalesce &= ~XM_COALESCE_SMART; /* Force coalescing within heap */ + + if (coalesce & XM_COALESCE_ALL) { if ( vmm_page_start(p) != p || round_pagesize(len) != len || - xmalloc_isheap(p, len) + is_heap ) { - coalesced = xmalloc_freelist_coalesce(&p, &len, coalesce); + coalesced = xmalloc_freelist_coalesce(&p, &len, in_burst, coalesce); } else { if (xmalloc_debugging(4)) { - t_debug(NULL, + s_debug( "XM not attempting coalescing of %zu-byte VMM region at %p", len, p); } - xstats.freelist_coalescing_ignore_vmm++; + XSTATS_INCX(freelist_coalescing_ignore_vmm); } } @@ -2063,11 +3331,11 @@ * back the leading and trailing fragments to the free list. */ - if G_UNLIKELY(xmalloc_isheap(p, len)) { + if G_UNLIKELY(is_heap) { /* Heap memory */ if (xmalloc_freecore(p, len)) { if (xmalloc_debugging(1)) { - t_debug(NULL, "XM %zu bytes of heap released at %p, " + s_debug("XM %zu bytes of heap released at %p, " "not adding to free list", len, p); } return; @@ -2082,22 +3350,22 @@ if (xmalloc_free_pages(p, len, &head, &head_len, &tail, &tail_len)) { if (xmalloc_debugging(3)) { if (head_len != 0 || tail_len != 0) { - size_t npages = len / compat_pagesize(); + size_t npages = vmm_page_count(len); - t_debug(NULL, "XM freed %sembedded %zu page%s, " + s_debug("XM freed %sembedded %zu page%s, " "%s head, %s tail", coalesced ? "coalesced " : "", - npages, 1 == npages ? "" : "s", + npages, plural(npages), head_len != 0 ? "has" : "no", tail_len != 0 ? "has" : "no"); } else { - t_debug(NULL, "XM freed %swhole %zu-byte region at %p", + s_debug("XM freed %swhole %zu-byte region at %p", coalesced ? "coalesced " : "", len, p); } } if (coalesced) - xstats.free_coalesced_vmm++; + XSTATS_INCX(free_coalesced_vmm); /* * Head and tail are smaller than a page size but could still be @@ -2107,30 +3375,36 @@ if (head_len != 0) { g_assert(head == p); if (xmalloc_debugging(4)) { - t_debug(NULL, "XM freeing head of %p at %p (%zu bytes)", + s_debug("XM freeing head of %p at %p (%zu bytes)", p, head, head_len); } if (coalesce & XM_COALESCE_BEFORE) { /* Already coalesced */ - xmalloc_freelist_insert(head, head_len, XM_COALESCE_NONE); + uint32 flags = coalesced & ~XM_COALESCE_ALL; + xmalloc_freelist_insert(head, head_len, in_burst, flags); } else { /* Maybe there is enough before to free core again? */ - xmalloc_freelist_add(head, head_len, XM_COALESCE_BEFORE); + calls--; /* Self-recursion, does not count */ + xmalloc_freelist_add(head, head_len, + (coalesce & ~XM_COALESCE_AFTER) | XM_COALESCE_BEFORE); } } if (tail_len != 0) { g_assert( ptr_add_offset(tail, tail_len) == ptr_add_offset(p, len)); if (xmalloc_debugging(4)) { - t_debug(NULL, "XM freeing tail of %p at %p (%zu bytes)", + s_debug("XM freeing tail of %p at %p (%zu bytes)", p, tail, tail_len); } if (coalesce & XM_COALESCE_AFTER) { /* Already coalesced */ - xmalloc_freelist_insert(tail, tail_len, XM_COALESCE_NONE); + uint32 flags = coalesced & ~XM_COALESCE_ALL; + xmalloc_freelist_insert(tail, tail_len, in_burst, flags); } else { /* Maybe there is enough after to free core again? */ - xmalloc_freelist_add(head, head_len, XM_COALESCE_AFTER); + calls--; /* Self-recursion, does not count */ + xmalloc_freelist_add(tail, tail_len, + (coalesce & ~XM_COALESCE_BEFORE) | XM_COALESCE_AFTER); } } return; @@ -2145,7 +3419,80 @@ * as much as possible. */ - xmalloc_freelist_insert(p, len, XM_COALESCE_NONE); + xmalloc_freelist_insert(p, len, in_burst, coalesce & ~XM_COALESCE_ALL); +} + +/** + * Grab block from selected freelist, known to hold available ones of at + * least the required length. + * + * The block is possibly split, if needed, and the final allocated size is + * returned in ``allocated''. + * + * @param fl the freelist with free blocks of at least ``len'' bytes + * @param block the selected block from the freelist + * @param length the desired block length + * @param allocated where we return the allocated block size (after split). + * + * @return adjusted pointer + */ +static void * +xmalloc_freelist_grab(struct xfreelist *fl, + void *block, size_t length, size_t *allocated) +{ + size_t blksize = fl->blocksize; + size_t len = length; + void *p = block; + + g_assert(blksize >= len); + + xfl_remove_selected(fl, block); + + /* + * If the block is larger than the size we requested, the remainder + * is put back into the free list. + */ + + if (len != blksize) { + void *sp; /* Split pointer */ + size_t split_len; + + split_len = blksize - len; + + if (xmalloc_should_split(blksize, len)) { + XSTATS_INCX(freelist_split); + if (xmalloc_grows_up) { + /* Split the end of the block */ + sp = ptr_add_offset(p, len); + } else { + /* Split the head of the block */ + sp = p; + p = ptr_add_offset(p, split_len); + } + + if (xmalloc_debugging(3)) { + s_debug("XM splitting large %zu-byte block at %p" + " (need only %zu bytes: returning %zu bytes at %p)", + blksize, p, len, split_len, sp); + } + + g_assert(split_len <= XMALLOC_MAXSIZE); + + xmalloc_freelist_insert(sp, split_len, FALSE, XM_COALESCE_NONE); + } else { + if (xmalloc_debugging(3)) { + s_debug("XM NOT splitting (as requested) %zu-byte block at %p" + " (need only %zu bytes, split of %zu bytes too small)", + blksize, p, len, split_len); + } + XSTATS_INCX(freelist_nosplit); + len = blksize; /* Wasting some trailing bytes */ + } + } + + *allocated = len; + + return p; } /** @@ -2166,117 +3513,1008 @@ p = xmalloc_freelist_lookup(len, NULL, &fl); - if (p != NULL) { - size_t blksize = fl->blocksize; + if G_UNLIKELY(p != NULL) + p = xmalloc_freelist_grab(fl, p, len, allocated); - g_assert(blksize >= len); + return p; +} - xfl_remove_selected(fl); +/** + * Setup allocated block. + * + * @return the user pointer within the physical block. + */ +static void * +xmalloc_block_setup(void *p, size_t len) +{ + struct xheader *xh = p; - /* - * If the block is larger than the size we requested, the remainder - * is put back into the free list. - */ + if (xmalloc_debugging(9)) { + s_debug("XM setup allocated %zu-byte block at %p (user %p)", + len, p, ptr_add_offset(p, XHEADER_SIZE)); + } - if (len != blksize) { - void *split; - size_t split_len; + xh->length = len; + return ptr_add_offset(p, XHEADER_SIZE); +} - split_len = blksize - len; +/** + * Is xmalloc() remapped to malloc()? + */ +bool +xmalloc_is_malloc(void) +{ +#ifdef XMALLOC_IS_MALLOC + return TRUE; +#else + return FALSE; +#endif +} - if (xmalloc_should_split(blksize, len)) { - xstats.freelist_split++; - if (xmalloc_grows_up) { - /* Split the end of the block */ - split = ptr_add_offset(p, len); - } else { - /* Split the head of the block */ - split = p; - p = ptr_add_offset(p, split_len); - } +/** + * Validate that pointer is the start of what appears to be a valid chunk. + */ +static bool +xmalloc_chunk_is_valid(const struct xchunk *xck) +{ + const struct xchunkhead *ch; - if (xmalloc_debugging(3)) { - t_debug(NULL, "XM splitting large %zu-byte block at %p" - " (need only %zu bytes: returning %zu bytes at %p)", - blksize, p, len, split_len, split); - } + if (XCHUNK_MAGIC != xck->magic) + return FALSE; - g_assert(split_len <= XMALLOC_MAXSIZE); + if (0 == xck->xc_size || xck->xc_size > XM_THREAD_MAXSIZE) + return FALSE; - xmalloc_freelist_insert(split, split_len, XM_COALESCE_NONE); - } else { - if (xmalloc_debugging(3)) { - t_debug(NULL, "XM NOT splitting large %zu-byte block at %p" - " (need only %zu bytes, split of %zu bytes too small)", - blksize, p, len, split_len); - } - xstats.freelist_nosplit++; - len = blksize; /* Wasting some trailing bytes */ + if (xmalloc_round(xck->xc_size) != xck->xc_size) + return FALSE; + + if (xck->xc_stid >= XM_THREAD_COUNT) + return FALSE; + + if (xck->xc_count > xck->xc_capacity) + return FALSE; + + ch = &xchunkheadxch_find_chunkhead_index(xck->xc_size)xck->xc_stid; + if (xck->xc_head != ch) + return FALSE; + + if (xck->xc_capacity != (xmalloc_pagesize - sizeof *xck) / xck->xc_size) + return FALSE; + + if (xck->xc_free_offset != 0 && xck->xc_free_offset < sizeof *xck) + return FALSE; + + if (xck->xc_free_offset > xmalloc_pagesize - xck->xc_size) + return FALSE; + + return TRUE; +} + +#ifdef XMALLOC_CHUNK_SAFETY +/** + * Is pointer that of a valid block in the chunk? + */ +static bool +xmalloc_chunk_valid_ptr(const struct xchunk *xck, const void *p) +{ + unsigned blocksize = xck->xc_head->blocksize; + unsigned capacity, offset; + const void *start, *end = const_ptr_add_offset(xck, xmalloc_pagesize); + + /* + * See diagram in xmalloc_chunk_allocate() to understand the logic here. + */ + + capacity = (xmalloc_pagesize - sizeof *xck) / blocksize; + offset = xmalloc_pagesize - capacity * blocksize; + start = const_ptr_add_offset(xck, offset); + + /* Block must be within the allocatable range within the chunk */ + if G_UNLIKELY(ptr_cmp(p, start) < 0 || ptr_cmp(p, end) >= 0) + return FALSE; + + /* Block must be properly aligned within the chunk */ + if G_UNLIKELY(0 != ptr_diff(end, p) % blocksize) + return FALSE; + + return TRUE; +} + +/** + * Make sure the pointer is that of an allocatable block in the chunk. + * + * @param xck the chunk where block is supposed to be allocated from + * @param p the memory block start address (user pointer) + */ +static void +assert_chunk_upointer_valid(const struct xchunk *xck, const void *p) +{ + if G_LIKELY(xmalloc_chunk_valid_ptr(xck, p)) + return; + + s_error_from(_WHERE_, + "invalid chunk user pointer %p in %zu-byte chunk %p for %s #%u", + p, xck->xc_head->blocksize, xck, thread_id_name(xck->xc_stid), + xck->xc_stid); +} + +/** + * Make sure the chunk freelist is consistent. + * + * @param xck the thread chunk to check + * @param stid the thread ID to which chunk belongs + * @param local TRUE if we're running in the context of the thread + */ +static void +assert_chunk_freelist_valid(const struct xchunk *xck, unsigned stid, bool local) +{ + unsigned free_items, free_count; + const void *p; + + g_assert(xmalloc_chunk_is_valid(xck)); + g_assert_log(!local || xck->xc_stid == stid, + "%s(): xck->xc_stid=%u, stid=%u", G_STRFUNC, xck->xc_stid, stid); + + free_count = xck->xc_count; /* Expected amount of free items */ + free_items = 0; + p = const_ptr_add_offset(xck, xck->xc_free_offset); + + while (xmalloc_chunk_valid_ptr(xck, p)) { + free_items++; + p = *(void **) p; /* Next free block */ + } + + if G_UNLIKELY(free_count != xck->xc_count) { + s_error_from(_WHERE_, + "race condition whilst checking %zu-byte chunk %p for %s #%u", + xck->xc_head->blocksize, xck, thread_id_name(xck->xc_stid), + xck->xc_stid); + } + + if G_LIKELY(free_items == free_count) + return; + + s_error_from(_WHERE_, + "corrupted freelist in %zu-byte chunk %p for %s #%u: " + "expected %u free block%s, found %u", + xck->xc_head->blocksize, xck, thread_id_name(xck->xc_stid), + xck->xc_stid, free_count, plural(free_count), free_items); +} +#else +#define assert_chunk_freelist_valid(x,s,l) +#define assert_chunk_upointer_valid(x,p) +#endif /* XMALLOC_CHUNK_SAFETY */ + +/** + * Cram a new chunk, linking each free block and making sure the first block + * is the head of that list. + */ +static void +xmalloc_chunk_cram(struct xchunk *xck) +{ + void *start = ptr_add_offset(xck, xck->xc_free_offset); + size_t size = xck->xc_size; + void *last = ptr_add_offset(xck, xmalloc_pagesize - size); + char *p = start, **next; + + g_assert(size < xmalloc_pagesize); + + while (ptr_cmp(&psize, last) <= 0) { + next = cast_to_void_ptr(p); + p = *next = &psize; + } + next = cast_to_void_ptr(p); + *next = NULL; +} + +/** + * Allocate a new thread-specific chunk. + */ +static struct xchunk * +xmalloc_chunk_allocate(const struct xchunkhead *ch, unsigned stid) +{ + struct xchunk *xck; + unsigned capacity, offset; + + /* + * Each allocated thread-specific chunk looks like this: + * + * +------------------+ + * | Chunk header | <---- struct xchunk + * +------------------+ + * | Padding | + * +------------------+ ^ + * | Aligned block #1 | | + * +------------------+ | + * | Aligned block #2 | | + * +------------------+ | Evenly split range + * |..................| | + * |..................| | + * |..................| | + * +------------------+ | + * | Aligned block #n | | + * +------------------+ v + * + * Compute the offset within the page of the first aligned block, + * on its natural alignment boundary (not necessarily a power of 2). + */ + + capacity = (xmalloc_pagesize - sizeof *xck) / ch->blocksize; + offset = xmalloc_pagesize - capacity * ch->blocksize; + + /* + * Try to allocate from the page pool if available. + */ + + if G_LIKELY(xpages_pool != NULL) + xck = palloc(xpages_pool); + else + xck = vmm_core_alloc(xmalloc_pagesize); + + xck->magic = XCHUNK_MAGIC; + xck->xc_head = deconstify_pointer(ch); + xck->xc_size = ch->blocksize; + xck->xc_stid = stid; + xck->xc_capacity = xck->xc_count = capacity; + xck->xc_free_offset = offset; + + xmalloc_chunk_cram(xck); + XSTATS_INCX(vmm_thread_pages); + + assert_chunk_freelist_valid(xck, stid, TRUE); + + return xck; +} + +/** + * Find chunk from which we can allocate a block. + * + * @param ch the chunk head (determining the block size implicitly) + * @param stid thread ID for which we are allocating + * + * @return the address of a chunk with at least one free block, NULL if we + * want to prevent allocation from the thread-specific pool. + */ +static struct xchunk * +xmalloc_chunk_find(struct xchunkhead *ch, unsigned stid) +{ + struct xchunk *xck; + + /* + * When they disable the use of the thread pool, we no longer grow the + * existing thread pool, but we use it whilst there is room (a thread may + * start with a non-empty pool when the previous thread using this stid + * had allocated blocks that have been passed to other threads and not + * freed, or which leaked). + * + * Hence look whether there is already a chunk that could be used to + * allocate memory regardless of the setting, and only if we cannot find + * any free chunk will we bail out when thread pools have been disabled. + */ + + xck = elist_head(&ch->list); /* Only contains chunks with free space */ + if G_LIKELY(xck != NULL) + return xck; + + if G_UNLIKELY(xpool_disabledstid) + return NULL; /* Pool usage disabled, refuse to grow pool */ + + /* + * No free chunk, allocate a new one. + * + * If the thread-pool is shared, it is not worth continuing to expand + * the thread-specific pool for sizes where we lose more from the memory + * alignment constraints in the chunk than the typical overhead we stuff + * at the front of each block: prefer regular allocations. + */ + + if G_UNLIKELY(ch->shared) { + unsigned capacity, overhead; + + /* + * If we no longer have any chunks, redirect to the main freelist. + * Regardless of the possible per-block overhead saving that this + * thread-specific pool could provide, we can nonetheless fragment + * the space with some sub-optimal allocation patterns. Avoid it. + */ + + if (0 == elist_count(&ch->list) + elist_count(&ch->full)) + return NULL; + + /* + * The overhead of each chunk is the largest between the size of + * the chunk overhead structure and the block size, due to alignment + * of the first available block. + */ + + capacity = (xmalloc_pagesize - sizeof *xck) / ch->blocksize; + overhead = MAX(sizeof *xck, ch->blocksize); + + if (overhead / capacity >= XHEADER_SIZE) { + if (xmalloc_debugging(1)) { + s_debug("XM not creating new %zu-byte blocks for thread #%u: " + "shared blocks have %F bytes overhead (%u per page), " + "currently has %zu chunk%s", + ch->blocksize, stid, (double) overhead / capacity, + capacity, elist_count(&ch->list), + plural(elist_count(&ch->list))); } + return NULL; + } + + if (xmalloc_debugging(1)) { + s_debug("XM still creating new %zu-byte blocks for thread #%u: " + "shared blocks have only %F bytes overhead (%u per page)", + ch->blocksize, stid, (double) overhead / capacity, + capacity); } - *allocated = len; } - return p; + /* + * Allocate a new chunk in the thread pool, inserted in the list of chunks + * to be used for the block size defined by the chunk head. + */ + + xck = xmalloc_chunk_allocate(ch, stid); + elist_prepend(&ch->list, xck); + + if (xmalloc_debugging(1)) { + s_debug("XM new chunk #%zu of %zu-byte blocks for thread #%u at %p", + elist_count(&ch->list) - 1, ch->blocksize, stid, xck); + } + + return xck; } /** - * Setup allocated block. + * Allocate a block from given chunk pool. * - * @return the user pointer within the physical block. + * The pool is thread-specific and determines the block size. + * + * @return allocated block address, NULL if we cannot allocate from the + * thread-specific pool. */ static void * -xmalloc_block_setup(void *p, size_t len) +xmalloc_chunkhead_alloc(struct xchunkhead *ch, unsigned stid) { - struct xheader *xh = p; + struct xchunk *xck; + void *p; + void *next; - if (xmalloc_debugging(9)) { - t_debug(NULL, "XM setup allocated %zu-byte block at %p (user %p)", - len, p, ptr_add_offset(p, XHEADER_SIZE)); + xck = xmalloc_chunk_find(ch, stid); + + if G_UNLIKELY(NULL == xck) + return NULL; + + xchunk_check(xck); + g_assert(uint_is_positive(xck->xc_count)); + g_assert(xck->xc_count <= xck->xc_capacity); + g_assert(xck->xc_free_offset < xmalloc_pagesize); + g_assert(xck->xc_stid == stid); + + assert_chunk_freelist_valid(xck, stid, TRUE); + + p = ptr_add_offset(xck, xck->xc_free_offset); + xck->xc_count--; + next = *(void **) p; /* Next free block */ + if (next != NULL) { + size_t offset = ptr_diff(next, xck); + + g_assert(0 != xck->xc_count); + g_assert(size_is_positive(offset)); + g_assert(offset < xmalloc_pagesize); + + xck->xc_free_offset = offset; + } else { + g_assert(0 == xck->xc_count); + + xck->xc_free_offset = 0; + + /* + * Chunk is full, remove it from the list of chunks and put it + * in the full list. + */ + + elist_remove(&ch->list, xck); + elist_append(&ch->full, xck); } - xh->length = len; - return ptr_add_offset(p, XHEADER_SIZE); + assert_chunk_freelist_valid(xck, stid, TRUE); + + return p; } /** - * Setup walloc()ed block. + * Return block to thread-private chunk. * - * @return the user pointer within the physical block. + * @param xck the chunk to which we want to return the block + * @param p start of allocated block in chunk + * @param local whether we're running in thread owning the chunk + */ +static void +xmalloc_chunk_return(struct xchunk *xck, void *p, bool local) +{ + (void) local; /* Only used when safety chunk assertion are enabled */ + + assert_chunk_upointer_valid(xck, p); + assert_chunk_freelist_valid(xck, thread_small_id(), local); + + /* + * If returning the block makes the whole chunk free, free that chunk. + */ + + if G_UNLIKELY(xck->xc_capacity == xck->xc_count + 1) { + struct xchunkhead *ch = xck->xc_head; + + elist_remove(&ch->list, xck); + + XSTATS_LOCK; + xstats.freeings++; /* Not counted in xfree() */ + xstats.free_thread_pool++; + xstats.user_memory -= xck->xc_size; + xstats.user_blocks--; + XSTATS_UNLOCK; + XSTATS_DECX(vmm_thread_pages); + + /* + * Before freeing the chunk, zero the header part so as to make + * sure we will not mistake this for a valid header again. Simply + * zeroing the magic number is not enough here, we want to prevent + * mistakes: freeing blocks on a page with an apparently valid header + * but which is not a thread-private chunk would corrupt memory. + */ + + ZERO(xck); + + /* + * If the memory pool allocator is configured, return the page + * to that pool so as to maybe reuse it soon for another thread or + * for another chunk in the current thread.. + * + * We need to allocate the pool on the free path. not on the allocation + * path to avoid auto-initialization problems leading to a deadlock. + * The pool is useless until we need to free a thread chunk anyway. + */ + + if G_LIKELY(xpages_pool != NULL) + pfree(xpages_pool, xck); + else if (once_flag_run_safe(&xpages_pool_inited, xpages_pool_init)) + pfree(xpages_pool, xck); + else + vmm_core_free(xck, xmalloc_pagesize); + + if (xmalloc_debugging(1)) { + s_debug("XM freed chunk %p of %zu-byte blocks for thread #%u", + xck, ch->blocksize, thread_small_id()); + } + + /* + * As soon as the thread clears all the chunks for a given size, + * turn off the "shared" status, giving thread another chance to + * grow its pool again in the absence of cross-thread freeing. + */ + + if (0 == elist_count(&ch->list) + elist_count(&ch->full)) + ch->shared = FALSE; + + } else { + void *head = 0 == xck->xc_free_offset ? NULL : + ptr_add_offset(xck, xck->xc_free_offset); + + XSTATS_LOCK; + xstats.freeings++; /* Not counted in xfree() */ + xstats.free_thread_pool++; + xstats.user_memory -= xck->xc_size; + xstats.user_blocks--; + XSTATS_UNLOCK; + + g_assert(uint_is_non_negative(xck->xc_free_offset)); + g_assert(xck->xc_free_offset < xmalloc_pagesize); + + *(void **) p = head; + xck->xc_free_offset = ptr_diff(p, xck); + + /* + * If the chunk was empty and now has one free block, remove + * it from the full list and put it back in the list of chunks + * with free space. + */ + + if G_UNLIKELY(0 == xck->xc_count++) { + struct xchunkhead *ch = xck->xc_head; + elist_remove(&ch->full, xck); + elist_append(&ch->list, xck); + } + + assert_chunk_freelist_valid(xck, thread_small_id(), local); + } +} + +/** + * Handle freeing of deferred blocks. + * + * These blocks are enqueued by other threads to let the thread owning the + * thread-specific chunk release them to the appropriate chunks using a + * lock-free path. + */ +static void +xmalloc_thread_free_deferred(unsigned stid, bool local) +{ + struct xchunk *xck; + struct xcross *xcr; + void *p, *next = NULL; + size_t n, size = 0; + + g_assert(size_is_non_negative(stid)); + g_assert(stid < N_ITEMS(xcross)); + + xcr = &xcrossstid; + + /* + * We need to prevent recursive calls to that routine, which can happen + * in some auto-initialization configurations, due to the need to allocate + * pools on the free path (but we can be on the allocation path presently). + * + * Since we can delay the freeing of the deferred blocks for some time, + * we do nothing if we cannot grab the spinlock: given it's a lock used by + * one thread, not being able to grab it means we're already freeing + * deferred blocks (and implies we're on the allocation path, initializing + * the memory pool to cache the freed thread chunks). + * --RAM, 2015-09-27 + */ + + if (!spinlock_try(&xcr->lock)) + return; + + if G_LIKELY(0 == xcr->count) { + spinunlock(&xcr->lock); + return; + } + + if (xmalloc_debugging(0)) { + s_minidbg("XM starting handling deferred %zu block%s for %s", + xcr->count, plural(xcr->count), thread_id_name(stid)); + } + + for (n = 0, p = xcr->head; p != NULL; p = next) { + next = *(void **) p; + n++; + + /* + * Validation of the chunk was done when block was enqueued, i.e. + * we know the pointer belongs to a thread-specific chunk belonging + * to this thread. + * + * Simply do a magic number validation to double-check the list, + * and a thread small ID comparison. We know the chunk cannot have + * been freed since we were holding some of its blocks in this list! + */ + + xck = deconstify_pointer(vmm_page_start(p)); + + g_assert_log(XCHUNK_MAGIC == xck->magic, + "p=%p, xck=%p, xck->magic=%d", p, xck, xck->magic); + g_assert_log(xck->xc_stid == stid, + "xck->xc_stid=%u, stid=%u", xck->xc_stid, stid); + + if (xmalloc_debugging(5)) { + s_minidbg("XM handling #%zu deferred %p to chunk %p (count=%u/%u)", + n, p, xck, xck->xc_count, xck->xc_capacity); + } + + size += xck->xc_size; + xmalloc_chunk_return(xck, p, local); + } + + g_assert(n == xcr->count); + + xcr->count = 0; + xcr->head = NULL; + + spinunlock(&xcr->lock); + + if (xmalloc_debugging(0)) { + s_debug("XM handled delayed free of %zu block%s (%zu bytes) in %s", + n, plural(n), size, thread_id_name(stid)); + } +} + +/** + * Count chunks used by thread. + */ +static size_t +xmalloc_thread_chunk_count(unsigned stid) +{ + unsigned i; + size_t count = 0; + + g_assert(uint_is_non_negative(stid)); + g_assert(stid < XM_THREAD_COUNT); + + for (i = 0; i < XMALLOC_CHUNKHEAD_COUNT; i++) { + count += elist_count(&xchunkheadistid.list); + } + + return count; +} + +/** + * Set or disable usage of the thread-specific pool for the current thread. + * + * By default, each thread starts with the thread-specific pool enabled. + * At thread creation time, one may specify THREAD_F_NO_POOL to turn the pool + * off before the thread starts running. + * + * @param on if TRUE, enable using / growing a local thread pool. + * + * @return previous setting for the thread regarding pool usage. + */ +bool +xmalloc_thread_set_local_pool(bool on) +{ + unsigned stid = thread_small_id(); + bool old; + + old = !xpool_disabledstid; /* TRUE means pool was allowed */ + xpool_disabledstid = booleanize(!on); + + return old; +} + +/** + * @return whether given thread uses a local thread pool. + */ +bool +xmalloc_thread_uses_local_pool(unsigned stid) +{ + g_assert(stid < XM_THREAD_COUNT); + + return !xpool_disabledstid; +} + +/** + * Called by the thread management layer when a thread is about to start + * to configure usage of the thread pool. + * + * @param stid thread ID of starting thread + * @param disable whether to disable the thread pool + */ +void +xmalloc_thread_disable_local_pool(unsigned stid, bool disable) +{ + g_assert(stid < XM_THREAD_COUNT); + + xpool_disabledstid = booleanize(disable); +} + +/** + * Called by the thread management layer when a thread is about to start. + */ +void +xmalloc_thread_starting(unsigned stid) +{ + struct xcross *xcr; + + g_assert(uint_is_non_negative(stid)); + g_assert(stid < XM_THREAD_COUNT); + + /* + * Mark the thread as "alive" so that freeing of any block belonging to + * the thread made by another thread will again be deferred. + */ + + xcr = &xcrossstid; + spinlock_hidden(&xcr->lock); + xcr->dead = FALSE; + spinunlock_hidden(&xcr->lock); +} + +/** + * Called by the thread management layer when a thread exits. + */ +void +xmalloc_thread_ended(unsigned stid) +{ + struct xcross *xcr; + size_t i; + + g_assert(uint_is_non_negative(stid)); + g_assert(stid < XM_THREAD_COUNT); + + /* + * Mark the thread as "dead". Until it is marked alive again, all + * the blocks allocated by this thread which could be freed by other + * threads will be returned directly. + */ + + xcr = &xcrossstid; + spinlock_hidden(&xcr->lock); + xcr->dead = TRUE; + spinunlock_hidden(&xcr->lock); + + /* + * Since the thread is gone, there are no risks it can run now so we + * may safely process its cross-freed blocks to return them to the + * thread chunks, therefore freeing them if they no longer hold data. + * + * This is important since we have no guarantee the thread will be + * reused any time soon. + */ + + xmalloc_thread_free_deferred(stid, FALSE); + + /* + * Reset thread allocation counts per chunk, which is only useful + * when there is an empty chunk list: if we have unfreed chunks, + * then a new thread re-using this ID will be able to immediately + * use these chunks to allocate thread-private memory for the given size. + */ + + for (i = 0; i < XMALLOC_CHUNKHEAD_COUNT; i++) { + struct xchunkhead *ch = &xchunkheadistid; + + if (0 == elist_count(&ch->list) + elist_count(&ch->full)) + ch->allocations = 0; + } + + /* + * When debugging, see how may thread-private chunks we still have + * and emit an informative note if we have any. + * + * This does not necessarily indicate a memory leak since it is possible + * that the blocks allocated have been passed to another thread and will + * be freed later by that thread. + */ + + if (xmalloc_debugging(0)) { + size_t n = xmalloc_thread_chunk_count(stid); + + if (n != 0) { + s_info("XM dead thread #%u still holds %zu thread-private chunk%s", + stid, n , plural(n)); + } + } +} + +/** + * Allocate a block from the thread-specific pool. + * + * @param stid thread small ID + * @param len size of block to allocate + * + * @return allocated block of requested size, or NULL if no allocation was + * possible. */ static void * -xmalloc_wsetup(void *p, size_t len) +xmalloc_thread_alloc(unsigned stid, const size_t len) { - struct xheader *xh = p; + struct xchunkhead *ch; + size_t idx; - if (xmalloc_debugging(9)) { - t_debug(NULL, "XM setup walloc()ed %zu-byte block at %p (user %p)", - len, p, ptr_add_offset(p, XHEADER_SIZE)); + g_assert(size_is_non_negative(len)); + g_assert(len <= XM_THREAD_MAXSIZE); + + /* + * Before allocating from a thread-specific pool, we wait for a minimal + * amount of allocations done for the given size. That way, if the thread + * only allocates a few blocks, we'll avoid dedicating a whole page to it + * for that block size. + */ + + if G_UNLIKELY(stid >= XM_THREAD_COUNT) + return NULL; + + idx = (0 == len) ? 0 : xch_find_chunkhead_index(len); + ch = &xchunkheadidxstid; + + g_assert(MAX(len, XMALLOC_ALIGNBYTES) == ch->blocksize); + + if G_UNLIKELY(ch->allocations < XM_THREAD_ALLOC_THRESH) { + ch->allocations++; + return NULL; } /* - * Flag length specially so that we know this is a block allocated - * via walloc(), to be able to handle freeing and reallocations. + * Handle pending blocks in the cross-thread free list before allocating, + * in case there is a block that we can reuse immediately, preventing the + * creation of a new chunk. */ - g_assert(len <= WALLOC_MAX); - g_assert(0 == (len & XMALLOC_MAGIC_FLAG)); + if G_UNLIKELY(xcrossstid.count != 0) + xmalloc_thread_free_deferred(stid, TRUE); - xh->length = (unsigned) len | XMALLOC_WALLOC_MAGIC; - return ptr_add_offset(p, XHEADER_SIZE); + return xmalloc_chunkhead_alloc(ch, stid); } /** - * Is xmalloc() remapped to malloc()? + * Check whether block belongs to a thread-specific pool. + * + * @param p the user block pointer + * @param stid the thread's small ID + * @param freeing whether we may be freeing block + * + * @return the chunk to which block belongs, or NULL. */ -gboolean -xmalloc_is_malloc(void) +static struct xchunk * +xmalloc_thread_get_chunk(const void *p, unsigned stid, bool freeing) { -#ifdef XMALLOC_IS_MALLOC + struct xchunk *xck; + unsigned offset; + + /* + * There is no malloc header for blocks allocated from the thread-specific + * pools, so we must see whether the page where the block lies is the + * start of a valid chunk. + */ + + xck = deconstify_pointer(vmm_page_start(p)); + if (!xmalloc_chunk_is_valid(xck)) + return NULL; + + /* + * Make sure the block is correctly aligned within the chunk. + */ + + offset = ptr_diff(ptr_add_offset(xck, xmalloc_pagesize), p); + if G_UNLIKELY(0 != offset % xck->xc_size) { + s_error("thread #%u %s mis-aligned %u-byte %sblock %p", + stid, freeing ? "freeing" : "accessing", + xck->xc_size, xck->xc_stid == stid ? "" : "foreign ", p); + } + + return xck; +} + +/** + * Computes length of block allocated from a thread-specific pool. + * + * @return length of block, 0 if it was not allocated through a pool. + */ +static size_t +xmalloc_thread_allocated(const void *p) +{ + struct xchunk *xck; + unsigned stid; + + stid = thread_small_id(); + + if G_UNLIKELY(stid >= XM_THREAD_COUNT) + return FALSE; + + /* + * Check whether the block lies on a thread-private chunk page. + */ + + xck = xmalloc_thread_get_chunk(p, stid, FALSE); + + if (NULL == xck) + return 0; + + return xck->xc_size; +} + +/** + * Attempt to free block if it belongs to a thread-specific pool. + * + * @return TRUE if we freed the block. + */ +static bool +xmalloc_thread_free(void *p) +{ + struct xchunk *xck; + unsigned stid; + struct xchunkhead *ch; + + /* + * We need to compute the thread small ID, but we use this opportunity to + * also check whether we are being called from a signal handler. + * + * Note that the signal_in_unsafe_handler_stid() routine will return TRUE + * if it cannot compute a proper thread ID, meaning we're probably + * discovering a new thread: we thus need to call thread_small_id() in + * that case. + */ + + if (signal_in_unsafe_handler_stid(&stid)) { + if (THREAD_UNKNOWN_ID == stid) { + stid = thread_small_id(); + } else { + XSTATS_INCX(freeings_in_handler); + s_minicarp_once("%s(): %s freeing %p from signal handler", + G_STRFUNC, thread_safe_id_name(stid), p); + } + } + + if G_UNLIKELY(stid >= XM_THREAD_COUNT) + return FALSE; + + /* + * Handle any other pending blocks in the cross-thread free list. + */ + + if G_UNLIKELY(xcrossstid.count != 0) + xmalloc_thread_free_deferred(stid, TRUE); + + /* + * Check whether the block lies on a thread-private chunk page. + */ + + xck = xmalloc_thread_get_chunk(p, stid, TRUE); + + if (NULL == xck) + return FALSE; + + /* + * If a thread allocates a block, it usually is the one freeing it or + * reallocating it. By construction we cannot put back a block in + * the thread-specific pool of another thread in a thread-safe way. + * + * Since there are legitimate use cases, we need to support cross-thread + * freeing efficiently: we flag the chunk as shared to avoid growing it + * too much from now on if it's not worth the waste (preferring allocation + * from the main freelists), and put the block into a thread-specific + * queue, processed by the owning thread to free the blocks. + */ + + ch = xck->xc_head; + + if G_UNLIKELY(xck->xc_stid != stid) { + struct xcross *xcr = &xcrossxck->xc_stid; + + /* + * We can't free the block here because it belongs to another thread's + * private pool for which there is no lock protection. + */ + + if (!ch->shared) { + ch->shared = TRUE; + atomic_mb(); + + if (xmalloc_debugging(2)) { + s_debug("thread #%u freeing %u-byte block %p " + "allocated by thread #%u", + stid, xck->xc_size, p, xck->xc_stid); + } + } + + XSTATS_INCX(free_foreign_thread_pool); + + /* + * Queue it for the owning thread to free later on by pre-pending it + * to the thread-specific chained list of deferred blocks. + * + * If the thread is flagged as "dead" however, then we're returning + * a block allocated by a thread that is no longer there, hence we + * can do it safely as long as we hold the lock. + */ + + spinlock(&xcr->lock); + if G_UNLIKELY(xcr->dead) { + xmalloc_chunk_return(xck, p, FALSE); + } else { + *(void **) p = xcr->head; + xcr->head = p; + xcr->count++; + } + spinunlock(&xcr->lock); + + if (xmalloc_debugging(5)) { + /* Count may be wrong since we log outside the critical region */ + s_debug("XM deferred freeing of %u-byte block %p " + "owned by thread #%u (%zu held)", + xck->xc_size, p, xck->xc_stid, xcr->count); + } + + return TRUE; /* We handled the block, freeing is just delayed */ + } + + /* + * OK, block belongs to this thread, we can free safely. + */ + + xmalloc_chunk_return(xck, p, TRUE); + return TRUE; -#else - return FALSE; -#endif } #ifdef XMALLOC_IS_MALLOC @@ -2292,18 +4530,20 @@ #define is_trapping_malloc() 1 -#define XALIGN_MINSIZE 128 /**< Minimum alignment for xzalloc() */ #define XALIGN_SHIFT 7 /* 2**7 */ #define XALIGN_MASK ((1 << XALIGN_SHIFT) - 1) +#define XALIGN_MINSIZE (1U << XALIGN_SHIFT) /**< Min alignment for xzalloc() */ -#define xaligned(p) (0 == (pointer_to_ulong(p) & XALIGN_MASK)) +#define is_xaligned(p) (0 == (pointer_to_ulong(p) & XALIGN_MASK)) -static gboolean xalign_free(const void *p); +static bool xalign_free(const void *p); +static size_t xalign_allocated(const void *p); #else /* !XMALLOC_IS_MALLOC */ #define is_trapping_malloc() 0 +#define xalign_allocated(p) 0 #define xalign_free(p) FALSE -#define xaligned(p) FALSE +#define is_xaligned(p) FALSE #endif /* XMALLOC_IS_MALLOC */ /** @@ -2312,15 +4552,17 @@ * If no memory is available, crash with a fatal error message. * * @param size minimal size of block to allocate (user space) - * @param can_walloc whether small blocks can be allocated via walloc() + * @param can_vmm whether we can allocate core via the VMM layer + * @param can_thread whether we can allocate from a thread-private pool * * @return allocated pointer (never NULL). */ static void * -xallocate(size_t size, gboolean can_walloc) +xallocate(size_t size, bool can_vmm, bool can_thread) { size_t len; void *p; + uint stid; g_assert(size_is_non_negative(size)); @@ -2335,21 +4577,113 @@ * the block. */ - len = xmalloc_round_blocksize(xmalloc_round(size) + XHEADER_SIZE); - xstats.allocations++; + if G_UNLIKELY(xmalloc_no_freeing ) { + /* + * In crashing mode activate a simple direct path: anything smaller + * than a page size is allocated via omalloc(), the rest is allocated + * via the VMM layer. Things will never get freed at this stage. + */ + + if (xmalloc_crashing) { + len = xmalloc_round_blocksize(xmalloc_round(size) + XHEADER_SIZE); + if (len < xmalloc_pagesize) { + p = omalloc(len); + } else { + p = vmm_core_alloc(round_pagesize(len)); + } + return xmalloc_block_setup(p, len); + } + } + + /* + * If we are in a signal handler, do NOT use a thread-specific allocation + * path since it is done without locks and is therefore totally unsafe + * when running within an asynchronous signal handler! + * + * Not that the other common path is much safer, but at least we have locks + * and we can see whether the lock is taken from the outside (albeit with + * a race condition window between the time the lock is taken and the time + * it gets registered in the thread element). + */ + + if (signal_in_unsafe_handler_stid(&stid) && THREAD_UNKNOWN_ID != stid) { + can_thread = FALSE; + XSTATS_INCX(allocations_in_handler); + s_minicarp_once("%s(): %s trying to allocate %zu bytes " + "from signal handler", + G_STRFUNC, thread_safe_id_name(stid), size); + } + + + /* + * If we can allocate a block from a thread-specific pool, we'll + * avoid any locking and also limit the block overhead. + */ + + if (size <= XM_THREAD_MAXSIZE && can_thread) { + size_t allocated; + + /* + * This contorsion is necessary for FreeBSD, because its threading + * layer calls malloc() and we do not want to enter once_flag_run() + * before we're sufficiently advanced in the C runtime initialization: + * we must avoid mutexes, which would call thread_self() and risk + * recursing to our malloc(). + * + * When the VMM is up, it will mean the C runtime initialization is + * fully done and therefore we should be able to call thread_self() + * without causing another allocation. + * --RAM, 2013-12-01 + */ + + if G_UNLIKELY(!ONCE_DONE(xmalloc_early_inited)) { + if (!xmalloc_vmm_is_up) + goto skip_pool; + + once_flag_run(&xmalloc_early_inited, xmalloc_early_init); + } + + allocated = xmalloc_round(size); /* No malloc header */ + + if (THREAD_UNKNOWN_ID == stid) + stid = thread_small_id(); /* Discovering a new thread */ + + p = xmalloc_thread_alloc(stid, allocated); + + if G_LIKELY(p != NULL) { + XSTATS_LOCK; + xstats.allocations++; + xstats.alloc_via_thread_pool++; + xstats.user_blocks++; + xstats.user_memory += allocated; + XSTATS_UNLOCK; + memusage_add(xstats.user_mem, allocated); + return p; + } + } + +skip_pool: /* * First try to allocate from the freelist when the length is less than * the maximum we handle there. */ + len = xmalloc_round_blocksize(xmalloc_round(size) + XHEADER_SIZE); + if (len <= XMALLOC_MAXSIZE) { size_t allocated; + p = xmalloc_freelist_alloc(len, &allocated); + if (p != NULL) { + G_PREFETCH_HI_W(p); /* User is going to write in block */ + XSTATS_LOCK; + xstats.allocations++; xstats.alloc_via_freelist++; xstats.user_blocks++; xstats.user_memory += allocated; + XSTATS_UNLOCK; memusage_add(xstats.user_mem, allocated); return xmalloc_block_setup(p, allocated); } @@ -2359,94 +4693,66 @@ * Need to allocate more core. */ - if G_LIKELY(xmalloc_vmm_is_up) { - static size_t pagesize; - - if G_UNLIKELY(0 == pagesize) { - pagesize = compat_pagesize(); - } + if G_LIKELY(xmalloc_vmm_is_up && can_vmm) { + size_t vlen; /* Length of virual memory allocated */ /* - * If we're allowed to use walloc() and the size is small-enough, - * prefer this method of allocation to minimize freelist fragmentation. + * The VMM layer is up, use it for all core allocations. */ - if (can_walloc) { - size_t wlen = xmalloc_round(size + XHEADER_SIZE); - - /* - * As soon as ``xmalloc_no_wfree'' is set, it means we're deep in - * shutdown time with wdestroy() being called. Therefore, we can - * no longer allow any walloc(). - * - * Note that walloc()ed blocks are not accounted for in user - * block / memory statistics: instead, they are accounted for - * by the zalloc() layer. - */ + vlen = round_pagesize(len); + p = vmm_core_alloc(vlen); - if (wlen <= WALLOC_MAX && !xmalloc_no_wfree) { - p = walloc(wlen); - xstats.alloc_via_walloc++; - return xmalloc_wsetup(p, wlen); - } + if (xmalloc_debugging(1)) { + s_debug("XM added %zu bytes of VMM core at %p", vlen, p); } - /* - * The VMM layer is up, use it for all core allocations. - */ - - xstats.alloc_via_vmm++; - xstats.user_blocks++; + G_PREFETCH_HI_W(p); /* User is going to write in block */ - if (len >= pagesize) { - size_t vlen = round_pagesize(len); - p = vmm_core_alloc(vlen); + if (xmalloc_should_split(vlen, len)) { + void *split = ptr_add_offset(p, len); + xmalloc_freelist_insert(split, vlen-len, FALSE, XM_COALESCE_AFTER); + XSTATS_LOCK; + xstats.allocations++; + xstats.vmm_alloc_pages += vmm_page_count(vlen); + xstats.alloc_via_vmm++; + xstats.user_blocks++; + xstats.vmm_split_pages++; + xstats.user_memory += len; + XSTATS_UNLOCK; + memusage_add(xstats.user_mem, len); + return xmalloc_block_setup(p, len); + } else { + XSTATS_LOCK; + xstats.allocations++; xstats.vmm_alloc_pages += vmm_page_count(vlen); + xstats.alloc_via_vmm++; + xstats.user_blocks++; xstats.user_memory += vlen; + XSTATS_UNLOCK; memusage_add(xstats.user_mem, vlen); - - if (xmalloc_debugging(1)) { - t_debug(NULL, "XM added %zu bytes of VMM core at %p", vlen, p); - } - return xmalloc_block_setup(p, vlen); - } else { - p = vmm_core_alloc(pagesize); - xstats.vmm_alloc_pages++; - xstats.user_memory += pagesize; - memusage_add(xstats.user_mem, pagesize); - - if (xmalloc_debugging(1)) { - t_debug(NULL, "XM added %zu bytes of VMM core at %p", - pagesize, p); - } - - if (xmalloc_should_split(pagesize, len)) { - void *split = ptr_add_offset(p, len); - xmalloc_freelist_insert(split, - pagesize - len, XM_COALESCE_AFTER); - xstats.vmm_split_pages++; - return xmalloc_block_setup(p, len); - } else { - return xmalloc_block_setup(p, pagesize); - } } } else { /* * VMM layer not up yet, this must be very early memory allocation * from the libc startup. Allocate memory from the heap. + * + * When ``can_vmm'' is FALSE, we do not want to log anything since + * we are probably allocating memory from a logging routine and + * do not want any recursion to happen. */ - p = xmalloc_addcore_from_heap(len); - xstats.alloc_via_sbrk++; + p = xmalloc_addcore_from_heap(len, can_vmm); + G_PREFETCH_HI_W(p); /* User is going to write in block */ + + XSTATS_LOCK; + xstats.allocations++; xstats.user_blocks++; xstats.user_memory += len; + XSTATS_UNLOCK; memusage_add(xstats.user_mem, len); - if (xmalloc_debugging(0)) { - t_debug(NULL, "XM added %zu bytes of heap core at %p", len, p); - } - return xmalloc_block_setup(p, len); } @@ -2463,7 +4769,7 @@ void * xmalloc(size_t size) { - return xallocate(size, TRUE); + return xallocate(size, TRUE, TRUE); } /** @@ -2471,53 +4777,58 @@ * * If no memory is available, crash with a fatal error message. * - * This is a "plain" malloc, not redirecting to walloc() for small-sized - * objects, and therefore it can be used by low-level allocators for their - * own data structures without fear of recursion. + * This is a "physical" allocation that skips thread pools. Such a block + * should be reallocated using xprealloc() to ensure it stays out of thread + * pools. + * + * One reason to use this call is to be able to ensure that there will be + * a header before the allocated block to provide the block size. * * @return allocated pointer (never NULL). */ void * xpmalloc(size_t size) { - xstats.allocations_plain++; - return xallocate(size, FALSE); + XSTATS_INCX(allocations_physical); + return xallocate(size, TRUE, FALSE); } /** - * Allocate a memory chunk capable of holding ``size'' bytes and zero it. + * Allocate a heap memory chunk capable of holding ``size'' bytes. * - * @return pointer to allocated zeroed memory. + * If no memory is available, crash with a fatal error message. + * + * This is a "heap" malloc, explicitly using the heap to grab more memory. + * Its use should be reserved to situations where we might be within a + * memory allocation routine and we need to allocate more memory. + * + * @return allocated pointer (never NULL). */ void * -xmalloc0(size_t size) +xhmalloc(size_t size) { - void *p; - - p = xmalloc(size); - memset(p, 0, size); - xstats.allocations_zeroed++; + /* + * This routine MUST NOT log anything, either here nor in one of the + * routines being called. + */ - return p; + XSTATS_INCX(allocations_heap); + return xallocate(size, FALSE, FALSE); } /** * Allocate a memory chunk capable of holding ``size'' bytes and zero it. * - * This is a "plain" malloc, not redirecting to walloc() for small-sized - * objects, and therefore it can be used by low-level allocators for their - * own data structures without fear of recursion. - * * @return pointer to allocated zeroed memory. */ void * -xpmalloc0(size_t size) +xmalloc0(size_t size) { void *p; - p = xpmalloc(size); + p = xmalloc(size); memset(p, 0, size); - xstats.allocations_zeroed++; + XSTATS_INCX(allocations_zeroed); return p; } @@ -2556,21 +4867,116 @@ } /** - * A clone of strdup() using xpmalloc(). + * A clone of strndup() using xmalloc(). * The resulting string must be freed via xfree(). * - * This is using a "plain" malloc, not redirecting to walloc() for small-sized - * objects, and therefore it can be used by low-level allocators for their - * own data structures without fear of recursion. - * * @param str the string to duplicate (can be NULL) + * @param n the maximum amount of characters to duplicate * * @return a pointer to the new string. */ char * -xpstrdup(const char *str) +xstrndup(const char *str, size_t n) { - return str ? xpcopy(str, 1 + strlen(str)) : NULL; + size_t len; + char *res, *p; + + g_assert(size_is_non_negative(n)); + + if G_UNLIKELY(NULL == str) + return NULL; + + len = clamp_strlen(str, n); + res = xmalloc(len + 1); + p = mempcpy(res, str, len); + *p = '\0'; + + return res; +} + +/** + * Free NULL-terminated array of strings, including the array itself. + */ +void +xstrfreev(char **str) +{ + char *p; + char **vec = str; + + while (NULL != (p = *vec++)) + xfree(p); + + xfree(str); +} + +/** + * Computes user size of allocated block. + */ +size_t +xallocated(const void *p) +{ + size_t len; + const struct xheader *xh; + + if G_UNLIKELY(NULL == p) + return 0; + +#ifdef XMALLOC_PTR_SAFETY + if (!xmalloc_is_valid_pointer(p, FALSE)) { + s_error_from(_WHERE_, "%s() given an invalid pointer %p: %s", + G_STRFUNC, p, xmalloc_invalid_ptrstr(p)); + } +#endif + + xh = const_ptr_add_offset(p, -XHEADER_SIZE); + G_PREFETCH_R(&xh->length); + + if (is_trapping_malloc() && is_xaligned(p)) { + len = xalign_allocated(p); + if G_LIKELY(len != 0) + return len; + } + + len = xmalloc_thread_allocated(p); + if (len != 0) + return len; + + if (!xmalloc_is_valid_length(xh, xh->length)) { + s_error_from(_WHERE_, + "corrupted malloc header for pointer %p: bad lengh %zu", + p, xh->length); + } + + return xh->length - XHEADER_SIZE; /* User size, substract overhead */ +} + +/** + * Computes user size of allocated block via xpmalloc(). + */ +size_t +xpallocated(const void *p) +{ + const struct xheader *xh; + + if G_UNLIKELY(NULL == p) + return 0; + +#ifdef XMALLOC_PTR_SAFETY + if (!xmalloc_is_valid_pointer(p, FALSE)) { + s_error_from(_WHERE_, "%s() given an invalid pointer %p: %s", + G_STRFUNC, p, xmalloc_invalid_ptrstr(p)); + } +#endif + + xh = const_ptr_add_offset(p, -XHEADER_SIZE); + + if (!xmalloc_is_valid_length(xh, xh->length)) { + s_error_from(_WHERE_, + "corrupted malloc header for pointer %p: bad lengh %zu", + p, xh->length); + } + + return xh->length - XHEADER_SIZE; /* User size, substract overhead */ } /** @@ -2589,47 +4995,35 @@ if G_UNLIKELY(NULL == p) return; + xh = ptr_add_offset(p, -XHEADER_SIZE); + /* - * As soon as wdestroy() has been called, we're deep into shutdowning - * so don't bother freeing anything. + * Handle thread-specific blocks early in the process since they do not + * have any malloc header. */ - if G_UNLIKELY(xmalloc_no_wfree) + if (xmalloc_thread_free(p)) return; - xh = ptr_add_offset(p, -XHEADER_SIZE); - xstats.freeings++; - /* * Handle pointers returned by posix_memalign() and friends that * would be aligned and therefore directly allocated by VMM or through * zones. * - * The xaligned() test checks whether the pointer is at least aligned + * The is_xaligned() test checks whether the pointer is at least aligned * to the minimum size we're aligning through special allocations, so * that we don't invoke the costly xalign_free() if we can avoid it. */ - if (is_trapping_malloc() && xaligned(p) && xalign_free(p)) + if (is_trapping_malloc() && is_xaligned(p) && xalign_free(p)) return; - if (!xmalloc_is_valid_pointer(xh)) { - t_error_from(_WHERE_, NULL, "attempt to free invalid pointer %p: %s", +#ifdef XMALLOC_PTR_SAFETY + if (!xmalloc_is_valid_pointer(p, FALSE)) { + s_error_from(_WHERE_, "attempt to free invalid pointer %p: %s", p, xmalloc_invalid_ptrstr(p)); } - - /* - * Handle walloc()ed blocks specially. - * - * These are not accounted in xmalloc() blocks / memory stats since they - * are already accounted for by zalloc() stats. - */ - - if (xmalloc_is_walloc(xh->length)) { - xstats.free_walloc++; - wfree(xh, xmalloc_walloc_size(xh->length)); - return; - } +#endif /* * Freeings to freelist are disabled at shutdown time. @@ -2639,15 +5033,28 @@ return; if (!xmalloc_is_valid_length(xh, xh->length)) { - t_error_from(_WHERE_, NULL, + s_error_from(_WHERE_, "corrupted malloc header for pointer %p: bad lengh %zu", p, xh->length); } + XSTATS_LOCK; + xstats.freeings++; xstats.user_memory -= xh->length; xstats.user_blocks--; + XSTATS_UNLOCK; memusage_remove(xstats.user_mem, xh->length); + /* + * Because of FreeBSD, we do not run xmalloc_early_init() on the early + * allocation path, when we handle sbrk() allocations. However, when + * the first free() starts to come around, it's safe to perform the early + * freelist setup. We need it anyway to return the block there! + * --RAM. 2013-12-01 + */ + + ONCE_FLAG_RUN(xmalloc_early_inited, xmalloc_early_init); + xmalloc_freelist_add(xh, xh->length, XM_COALESCE_ALL | XM_COALESCE_SMART); } @@ -2656,50 +5063,104 @@ * * @param p original user pointer * @param size new user-size - * @param can_walloc whether plain block can be reallocated with walloc() + * @param can_thread whether thread memory pools can be used * * @return * If a NULL pointer is given, act as if xmalloc() had been called and * return a new pointer. * If the new size is 0, act as if xfree() had been called and return NULL. * Otherwise return a pointer to the reallocated block, which may be different - * than the original pointer. + * from the original pointer. */ static void * -xreallocate(void *p, size_t size, gboolean can_walloc) +xreallocate(void *p, size_t size, bool can_thread) { struct xheader *xh = ptr_add_offset(p, -XHEADER_SIZE); size_t newlen; void *np; + unsigned stid; + struct xchunk *xck; if (NULL == p) - return xallocate(size, can_walloc); + return xallocate(size, TRUE, can_thread); if (0 == size) { xfree(p); return NULL; } - if G_UNLIKELY(!xmalloc_is_valid_pointer(xh)) { - t_error_from(_WHERE_, NULL, "attempt to realloc invalid pointer %p: %s", - p, xmalloc_invalid_ptrstr(p)); + /* + * We need to compute the thread small ID, but we use this opportunity to + * also check whether we are being called from a signal handler. + * + * Note that the signal_in_unsafe_handler_stid() routine will return TRUE + * if it cannot compute a proper thread ID, meaning we're probably + * discovering a new thread: we thus need to call thread_small_id() in + * that case. + */ + + if (signal_in_unsafe_handler_stid(&stid)) { + if (THREAD_UNKNOWN_ID == stid) { + stid = thread_small_id(); + } else { + XSTATS_INCX(allocations_in_handler); + s_minicarp_once("%s(): %s reallocating to %zu bytes " + "from signal handler", + G_STRFUNC, thread_safe_id_name(stid), size); + } + } + + /* + * Handle blocks from a thread-specific pool specially, since they have + * no malloc header and cannot be coalesced because they are allocated + * from zones with fix-sized blocks. + */ + + xck = xmalloc_thread_get_chunk(p, stid, TRUE); + + if (xck != NULL) { + if G_UNLIKELY(xmalloc_no_freeing || !can_thread) + goto realloc_from_thread; + + XSTATS_INCX(reallocs); + + if (xmalloc_round(size) == xck->xc_size) { + XSTATS_INCX(realloc_noop); + + if (xmalloc_debugging(2)) { + s_debug("XM realloc of %p to %zu bytes can be a noop " + "(already in a %u-byte chunk for thread #%u)", + p, size, xck->xc_size, stid); + } + + return p; + } + + goto realloc_from_thread; /* Move block around */ } - if (xmalloc_is_walloc(xh->length)) - goto realloc_from_walloc; +#ifdef XMALLOC_PTR_SAFETY + if G_UNLIKELY(!xmalloc_is_valid_pointer(xh, FALSE)) { + s_error_from(_WHERE_, "attempt to realloc invalid pointer %p: %s", + p, xmalloc_invalid_ptrstr(p)); + } +#endif if G_UNLIKELY(!xmalloc_is_valid_length(xh, xh->length)) { - t_error_from(_WHERE_, NULL, + s_error_from(_WHERE_, "corrupted malloc header for pointer %p: bad length %ld", p, (long) xh->length); } + if G_UNLIKELY(xmalloc_no_freeing) + goto skip_coalescing; + /* * Compute the size of the physical block we need, including overhead. */ newlen = xmalloc_round_blocksize(xmalloc_round(size) + XHEADER_SIZE); - xstats.reallocs++; + XSTATS_INCX(reallocs); /* * Identify blocks allocated from the VMM layer: they are page-aligned @@ -2720,7 +5181,7 @@ */ if (newlen == xh->length && vmm_is_relocatable(xh, xh->length)) { - xstats.realloc_relocate_vmm_fragment++; + XSTATS_INCX(realloc_relocate_vmm_fragment); goto relocate_vmm; } @@ -2732,19 +5193,21 @@ if (newlen < xh->length) { if (vmm_is_relocatable(xh, newlen)) { - xstats.realloc_relocate_vmm_shrinked++; + XSTATS_INCX(realloc_relocate_vmm_shrinked); goto relocate_vmm; } if (xmalloc_debugging(1)) { - t_debug(NULL, "XM using vmm_core_shrink() on " + s_debug("XM using vmm_core_shrink() on " "%zu-byte block at %p (new size is %zu bytes)", xh->length, (void *) xh, newlen); } vmm_core_shrink(xh, xh->length, newlen); + XSTATS_LOCK; xstats.realloc_inplace_vmm_shrinking++; xstats.user_memory -= xh->length - newlen; + XSTATS_UNLOCK; memusage_remove(xstats.user_mem, xh->length - newlen); goto inplace; } @@ -2758,12 +5221,11 @@ goto skip_coalescing; if (xmalloc_debugging(2)) { - t_debug(NULL, "XM realloc of %p to %zu bytes can be a noop " + s_debug("XM realloc of %p to %zu bytes can be a noop " "(already %zu-byte long VMM region)", p, size, xh->length); } - xstats.realloc_noop++; - + XSTATS_INCX(realloc_noop); return p; } @@ -2787,19 +5249,18 @@ */ q = xmalloc_freelist_lookup(newlen, NULL, &fl); - xstats.realloc_relocate_smart_attempts++; + + XSTATS_INCX(realloc_relocate_smart_attempts); if (q != NULL) { - if ( - newlen == fl->blocksize && - (xmalloc_grows_up ? +1 : -1) * ptr_cmp(q, xh) < 0 - ) { - xfl_remove_selected(fl); + if (newlen == fl->blocksize && xm_ptr_cmp(xh, q) < 0) { + xfl_remove_selected(fl, q); np = xmalloc_block_setup(q, newlen); - xstats.realloc_relocate_smart_success++; + + XSTATS_INCX(realloc_relocate_smart_success); if (xmalloc_debugging(1)) { - t_debug(NULL, "XM relocated %zu-byte block at %p to %p" + s_debug("XM relocated %zu-byte block at %p to %p" " (pysical size is still %zu bytes," " user size is %zu)", xh->length, (void *) xh, q, newlen, size); @@ -2811,23 +5272,23 @@ * Release lock grabbed by xmalloc_freelist_lookup(). */ - mutex_release(&fl->lock); + mutex_unlock(&fl->lock); } } } if (xmalloc_debugging(2)) { - t_debug(NULL, "XM realloc of %p to %zu bytes can be a noop " + s_debug("XM realloc of %p to %zu bytes can be a noop " "(already %zu-byte long from %s)", p, size, xh->length, xmalloc_isheap(p, size) ? "heap" : "VMM"); } - xstats.realloc_noop++; + XSTATS_INCX(realloc_noop); return p; } /* - * If the block is shrinked and its old size is less than XMALLOC_MAXSIZE, + * If the block is shrunk and its old size is less than XMALLOC_MAXSIZE, * put the remainder back in the freelist. */ @@ -2836,26 +5297,31 @@ if G_UNLIKELY(!xmalloc_should_split(xh->length, newlen)) { if (xmalloc_debugging(2)) { - t_debug(NULL, "XM realloc of %p to %zu bytes can be a noop " + s_debug("XM realloc of %p to %zu bytes can be a noop " "(already %zu-byte long from %s, not shrinking %zu bytes)", p, size, xh->length, xmalloc_isheap(p, size) ? "heap" : "VMM", extra); } - xstats.realloc_noop++; + + XSTATS_INCX(realloc_noop); return p; } else { void *end = ptr_add_offset(xh, newlen); if (xmalloc_debugging(1)) { - t_debug(NULL, "XM using inplace shrink on %zu-byte block at %p" + s_debug("XM using inplace shrink on %zu-byte block at %p" " (new size is %zu bytes, splitting at %p)", xh->length, (void *) xh, newlen, end); } xmalloc_freelist_add(end, extra, XM_COALESCE_AFTER); + + XSTATS_LOCK; xstats.realloc_inplace_shrinking++; xstats.user_memory -= extra; + XSTATS_UNLOCK; memusage_remove(xstats.user_mem, extra); + goto inplace; } } @@ -2872,9 +5338,9 @@ */ if (newlen <= XMALLOC_MAXSIZE && xh->length <= XMALLOC_MAXSIZE) { - size_t i, needed, old_len, freelist_idx; + size_t i, needed, old_len = 0, freelist_idx; void *end; - gboolean coalesced = FALSE; + bool coalesced = FALSE; g_assert(newlen > xh->length); /* Or would have been handled before */ @@ -2891,11 +5357,11 @@ * Look for a match after the allocated block. */ - for (i = freelist_idx; i <= xfreelist_maxidx; i++) { + for (i = freelist_idx; i <= xfreelist_maxidx && !coalesced; i++) { struct xfreelist *fl = &xfreelisti; size_t idx; - if (0 == fl->count || !mutex_get_try(&fl->lock)) + if (0 == fl->count || !mutex_trylock(&fl->lock)) continue; idx = xfl_lookup(fl, end, NULL); @@ -2910,19 +5376,19 @@ */ if (xmalloc_round_blocksize(csize) != csize) { - mutex_release(&fl->lock); if (xmalloc_debugging(6)) { - t_debug(NULL, "XM realloc NOT coalescing next %zu-byte " + s_debug("XM realloc NOT coalescing next %zu-byte " "%p, %p from list #%zu with %p, %p: invalid " "resulting size of %zu bytes", blksize, end, ptr_add_offset(end, blksize), i, (void *) xh, end, csize); } + mutex_unlock(&fl->lock); break; } if (xmalloc_debugging(6)) { - t_debug(NULL, "XM realloc coalescing next %zu-byte " + s_debug("XM realloc coalescing next %zu-byte " "%p, %p from list #%zu with %p, %p yielding " "%zu-byte block", blksize, end, ptr_add_offset(end, blksize), i, @@ -2931,10 +5397,8 @@ xfl_delete_slot(fl, idx); end = ptr_add_offset(end, blksize); coalesced = TRUE; - break; - } else { - mutex_release(&fl->lock); } + mutex_unlock(&fl->lock); } /* @@ -2958,8 +5422,7 @@ xmalloc_round_blocksize(split_len) == split_len ) { if (xmalloc_debugging(6)) { - t_debug(NULL, - "XM realloc splitting large %zu-byte block at %p" + s_debug("XM realloc splitting large %zu-byte block at %p" " (need only %zu bytes: returning %zu bytes at %p)", ptr_diff(end, xh), (void *) xh, newlen, split_len, split); @@ -2974,14 +5437,17 @@ } if (xmalloc_debugging(1)) { - t_debug(NULL, "XM realloc used inplace coalescing on " + s_debug("XM realloc used inplace coalescing on " "%zu-byte block at %p (new size is %zu bytes)", xh->length, (void *) xh, newlen); } + XSTATS_LOCK; xstats.realloc_inplace_extension++; xstats.user_memory += newlen - xh->length; + XSTATS_UNLOCK; memusage_add(xstats.user_mem, newlen - xh->length); + goto inplace; } @@ -2989,13 +5455,13 @@ * Look for a match before. */ - for (i = freelist_idx; i <= xfreelist_maxidx; i++) { + for (i = freelist_idx; i <= xfreelist_maxidx && !coalesced; i++) { struct xfreelist *fl = &xfreelisti; size_t blksize; void *before; size_t idx; - if (0 == fl->count || !mutex_get_try(&fl->lock)) + if (0 == fl->count || !mutex_trylock(&fl->lock)) continue; blksize = fl->blocksize; @@ -3012,19 +5478,19 @@ */ if (xmalloc_round_blocksize(csize) != csize) { - mutex_release(&fl->lock); if (xmalloc_debugging(6)) { - t_debug(NULL, "XM realloc not coalescing previous " + s_debug("XM realloc not coalescing previous " "%zu-byte %p, %p from list #%zu with %p, %p: " "invalid resulting size of %zu bytes", blksize, before, ptr_add_offset(before, blksize), i, (void *) xh, end, csize); } + mutex_unlock(&fl->lock); break; } if (xmalloc_debugging(6)) { - t_debug(NULL, "XM realloc coalescing previous %zu-byte " + s_debug("XM realloc coalescing previous %zu-byte " "%p, %p from list #%zu with %p, %p", blksize, before, ptr_add_offset(before, blksize), i, (void *) xh, end); @@ -3033,10 +5499,9 @@ old_len = xh->length - XHEADER_SIZE; /* Old user size */ xh = before; coalesced = TRUE; - break; - } else { - mutex_release(&fl->lock); } + + mutex_unlock(&fl->lock); } /* @@ -3063,8 +5528,7 @@ xmalloc_round_blocksize(split_len) == split_len ) { if (xmalloc_debugging(6)) { - t_debug(NULL, - "XM realloc splitting large %zu-byte block at %p" + s_debug("XM realloc splitting large %zu-byte block at %p" " (need only %zu bytes: returning %zu bytes at %p)", ptr_diff(end, xh), (void *) xh, newlen, split_len, split); @@ -3079,16 +5543,19 @@ } if (xmalloc_debugging(1)) { - t_debug(NULL, "XM realloc used coalescing with block preceding " + s_debug("XM realloc used coalescing with block preceding " "%zu-byte block at %p " "(new size is %zu bytes, new address is %p)", old_len + XHEADER_SIZE, ptr_add_offset(p, -XHEADER_SIZE), newlen, (void *) xh); } + XSTATS_LOCK; xstats.realloc_coalescing_extension++; xstats.user_memory += newlen - old_len; + XSTATS_UNLOCK; memusage_add(xstats.user_mem, newlen - old_len); + return xmalloc_block_setup(xh, newlen); } @@ -3101,32 +5568,15 @@ * Regular case: allocate a new block, move data around, free old block. */ - { - struct xheader *nxh; - gboolean converted; + np = xallocate(size, TRUE, can_thread); - np = xallocate(size, can_walloc); - xstats.realloc_regular_strategy++; + XSTATS_INCX(realloc_regular_strategy); - /* - * See whether plain block was converted to a walloc()ed one. - */ - - nxh = ptr_add_offset(np, -XHEADER_SIZE); - converted = xmalloc_is_walloc(nxh->length); - - if (converted) { - g_assert(can_walloc); - xstats.realloc_promoted_to_walloc++; - } - - if (xmalloc_debugging(1)) { - t_debug(NULL, "XM realloc used regular strategy: " - "%zu-byte block at %p %s %zu-byte block at %p", - xh->length, (void *) xh, - converted ? "converted to walloc()ed" : "moved to", - size + XHEADER_SIZE, ptr_add_offset(np, -XHEADER_SIZE)); - } + if (xmalloc_debugging(1)) { + s_debug("XM realloc used regular strategy: " + "%zu-byte block at %p moved to %zu-byte block at %p", + xh->length, (void *) xh, + size + XHEADER_SIZE, ptr_add_offset(np, -XHEADER_SIZE)); } /* FALL THROUGH */ @@ -3152,12 +5602,14 @@ q = vmm_core_alloc(newlen); np = xmalloc_block_setup(q, newlen); + XSTATS_LOCK; xstats.vmm_alloc_pages += vmm_page_count(newlen); xstats.user_memory -= xh->length - newlen; + XSTATS_UNLOCK; memusage_remove(xstats.user_mem, xh->length - newlen); if (xmalloc_debugging(1)) { - t_debug(NULL, "XM relocated %zu-byte VMM region at %p to %p" + s_debug("XM relocated %zu-byte VMM region at %p to %p" " (new pysical size is %zu bytes, user size is %zu)", xh->length, (void *) xh, q, newlen, size); } @@ -3169,54 +5621,20 @@ xh->length = newlen; return p; -realloc_from_walloc: +realloc_from_thread: { - size_t old_len = xmalloc_walloc_size(xh->length); - size_t new_len = xmalloc_round(size + XHEADER_SIZE); - size_t old_size; - - if (new_len <= WALLOC_MAX) { - void *wp = wrealloc(xh, old_len, new_len); - xstats.realloc_wrealloc++; + size_t old_size = xck->xc_size; - if (xmalloc_debugging(1)) { - t_debug(NULL, "XM realloc used wrealloc(): " - "%zu-byte block at %p %s %zu-byte block at %p", - old_len, (void *) xh, - old_len == new_len && 0 == ptr_cmp(xh, wp) ? - "stays" : "moved to", - new_len, wp); - } - - return xmalloc_wsetup(wp, new_len); - } - - /* - * Have to convert walloc() block to real malloc. - * - * Since walloc()ed blocks are not accounted in xmalloc() statistics, - * there's nothing to update during the conversion. - */ + np = xallocate(size, TRUE, can_thread); - np = xmalloc(size); - xstats.realloc_converted_from_walloc++; - - if (xmalloc_debugging(1)) { - t_debug(NULL, "XM realloc converted from walloc(): " - "%zu-byte block at %p moved to %zu-byte block at %p", - old_len, (void *) xh, - size + XHEADER_SIZE, ptr_add_offset(np, -XHEADER_SIZE)); - } - - old_size = old_len - XHEADER_SIZE; - - g_assert(size_is_non_negative(old_size)); + XSTATS_INCX(realloc_from_thread_pool); + XSTATS_INCX(realloc_regular_strategy); memcpy(np, p, MIN(size, old_size)); - wfree(xh, old_len); - - return np; + xfree(p); } + + return np; } /** @@ -3230,7 +5648,7 @@ * return a new pointer. * If the new size is 0, act as if xfree() had been called and return NULL. * Otherwise return a pointer to the reallocated block, which may be different - * than the original pointer. + * from the original pointer. */ void * xrealloc(void *p, size_t size) @@ -3239,8 +5657,7 @@ } /** - * Reallocate a block allocated via xmalloc(), forcing xpmalloc() if needed - * to ensure walloc() is not used. + * Reallocate a block allocated via xmalloc(), forcing xpmalloc() if needed. * * @param p original user pointer * @param size new user-size @@ -3250,7 +5667,7 @@ * return a new pointer. * If the new size is 0, act as if xfree() had been called and return NULL. * Otherwise return a pointer to the reallocated block, which may be different - * than the original pointer. + * from the original pointer. */ void * xprealloc(void *p, size_t size) @@ -3259,9 +5676,952 @@ } /** + * Marks the head of the current page used by xgc_alloc(). + */ +struct xgc_page { + void *next; /**< Next page in the list */ +}; + +/** + * Records pages allocated by the simple xgc_alloc() routines. + */ +struct xgc_allocator { + struct xgc_page *head; /**< Head of page list */ + struct xgc_page *tail; /**< Tail of page list */ + struct xgc_page *top; /**< Top of current page */ + void *avail; /**< First available memory on current page */ + size_t remain; /**< Remaining size available on current page */ +}; + +/** + * A fragment spanning over several pages. + */ +struct xgc_fragment { + const void *p; + size_t len; +}; + +#define XGA_MASK (MEM_ALIGNBYTES - 1) +#define xga_round(s) ((size_t) (((ulong) (s) + XGA_MASK) & ~XGA_MASK)) +#define XGA_MAXLEN 64 + +/** + * Allocate memory during garbage collection. + * + * @return pointer to memory of ``len'' bytes. + */ +static void * +xgc_alloc(struct xgc_allocator *xga, size_t len) +{ + size_t requested = xga_round(len); + void *p; + + g_assert(requested <= XGA_MAXLEN); /* Safety since we're so simple! */ + + if (xga->remain < requested) { + struct xgc_page *page; + + /* Waste remaining (at most XGA_MAXLEN), allocate a new page */ + + page = vmm_core_alloc(xmalloc_pagesize); + + if (NULL == xga->head) { + xga->head = xga->tail = page; + } else { + g_assert(xga->tail != NULL); + g_assert(NULL == xga->tail->next); + xga->tail->next = page; + xga->tail = page; + } + + page->next = NULL; + xga->top = page; + xga->remain = xmalloc_pagesize - sizeof(*xga->top); + xga->avail = &page1; + } + + p = xga->avail; + xga->avail = ptr_add_offset(p, requested); + xga->remain -= requested; + + g_assert(size_is_non_negative(xga->remain)); + + return p; +} + +/** + * Reclaim all the memory allocated during garbage collection through + * the xgc_alloc() routine. + */ +static void +xgc_free_all(struct xgc_allocator *xga) +{ + struct xgc_page *p, *next; + + for (p = xga->head; p != NULL; p = next) { + next = p->next; + vmm_core_free(p, xmalloc_pagesize); + } +} + +/** + * Coalescing / freeing bucket context. + */ +struct xgc_context { + uint8 lockedXMALLOC_FREELIST_COUNT; + size_t availableXMALLOC_FREELIST_COUNT; + size_t countXMALLOC_FREELIST_COUNT; + size_t largest; /**< Largest bucket count */ +}; + +/** + * Items that are organized in a red-black tree to record all block ranges. + */ +struct xgc_range { + const void *start; /**< First address in range */ + const void *end; /**< First address beyond range */ + rbnode_t node; /**< Embedded red-black tree structure */ + unsigned blocks; /**< Amount of blocks making up this range */ + /* These fields updated during strategy planning and execution */ + unsigned head; /**< Head part to keep, until first page */ + unsigned tail; /**< Tail part, after last full page */ + uint8 strategy; /**< Strategy code */ +}; + +/** + * Strategy codes. + */ +#define XGC_ST_COALESCE 1 /**< Coalesce block */ +#define XGC_ST_FREE_PAGES 2 /**< Free embedded pages, release head/tail */ + +/** + * Comparison function for (disjoint) ranges -- red-black tree callback. + */ +static int +xgc_range_cmp(const void *a, const void *b) +{ + const struct xgc_range *p = a, *q = b; + + if (ptr_cmp(p->end, q->start) <= 0) + return -1; + + if (ptr_cmp(q->end, p->start) <= 0) + return +1; + + return 0; /* Overlapping ranges are equal */ +} + +/** + * Add block to red-black tree, coalescing if needed. + * + * @param rbt the red-black tree + * @param start starting address of block + * @param len length of block + * @param xga memory allocator used during xgc() run + */ +static void +xgc_block_add(erbtree_t *rbt, const void *start, size_t len, + struct xgc_allocator *xga) +{ + const void *end = const_ptr_add_offset(start, len); + struct xgc_range key; + struct xgc_range *merged = NULL, *xr; + + /* + * Look whether we can coalesce with a block before it. + */ + + key.start = const_ptr_add_offset(start, -1); + key.end = start; + merged = erbtree_lookup(rbt, &key); + + if (merged != NULL) { + g_assert_log(merged->end == start, + "merged=%p, %p, start=%p", merged->start, merged->end, start); + merged->end = end; + merged->blocks++; + } + + /* + * Look whether we can coalesce with a block after it. + */ + + key.start = end; + key.end = const_ptr_add_offset(end, +1); + xr = erbtree_lookup(rbt, &key); + + if (xr != NULL) { + if (merged != NULL) { + g_assert_log(merged->end == xr->start, + "merged=%p, %p, xr=%p, %p", + merged->start, merged->end, xr->start, xr->end); + merged->end = xr->end; + merged->blocks += xr->blocks; + erbtree_remove(rbt, &xr->node); + } else { + g_assert_log(xr->start == end, + "xr=%p, %p, end=%p", xr->start, xr->end, end); + xr->start = start; + merged = xr; + merged->blocks++; + } + } + + /* + * Create a new node if we were not able to coalesce. + */ + + if (NULL == merged) { + const struct xgc_range *old; + + xr = xgc_alloc(xga, sizeof *xr); + ZERO(xr); + xr->start = start; + xr->end = end; + xr->blocks = 1; + + /* + * Save length of first block to help the strategy should end-up with + * two blocks being coalesced, with a length that does not fit the + * freelist. + */ + + xr->head = ptr_diff(end, start); /* Necessarily fits */ + old = erbtree_insert(rbt, &xr->node); + + g_assert_log(NULL == old, /* Was not already present in tree */ + "xr=%p, %p, old=%p, %p (%u block%s)", + start, end, old->start, old->end, + old->blocks, plural(old->blocks)); + } +} + +static inline bool +xgc_freelist_has_room(size_t idx, struct xgc_context *xgctx) +{ + if G_UNLIKELY(!xgctx->lockedidx) + return FALSE; + + if G_UNLIKELY(0 == xgctx->availableidx) { + struct xfreelist *fl = &xfreelistidx; + fl->expand = TRUE; /* For next time */ + return FALSE; + } + + return TRUE; +} + +static inline void +xgc_freelist_inc(size_t idx, struct xgc_context *xgctx) +{ + xgctx->availableidx--; + xgctx->countidx++; + if G_UNLIKELY(xgctx->largest < xgctx->countidx) + xgctx->largest = xgctx->countidx; +} + +/** + * Check whether a given block is freeable. i.e. that there is room in the + * bucket(s) where it would fall, ignoring any freeing that could occur + * from these buckets due to coalescing. + * + * @param len the length of the block + * @param xgctx the xgc() context + * @param commit if TRUE, commit the freeing by updating the context. + * + * @return TRUE if block is freeable, FALSE otherwise. + */ +static bool +xgc_block_is_freeable(size_t len, struct xgc_context *xgctx, bool commit) +{ + struct xsplit *xs; + size_t i1, i2 = 0; + + if G_UNLIKELY(0 == len) + return TRUE; + + g_assert(len >= XMALLOC_SPLIT_MIN); + + if (len > XMALLOC_MAXSIZE) + return FALSE; + + /* + * Compute the freelists into which the block would end-up being freed. + */ + + xs = xmalloc_split_info(len); + i1 = xfl_find_freelist_index(xs->larger); + + if G_UNLIKELY(!xgc_freelist_has_room(i1, xgctx)) + return FALSE; + + if G_UNLIKELY(xs->smaller != 0) { + i2 = xfl_find_freelist_index(xs->smaller); + + if G_UNLIKELY(!xgc_freelist_has_room(i2, xgctx)) + return FALSE; + } + + /* + * OK, we can free the block. + */ + + if (commit) { + xgc_freelist_inc(i1, xgctx); + if G_UNLIKELY(xs->smaller != 0) + xgc_freelist_inc(i2, xgctx); + } + + return TRUE; +} + +/** + * Decide on the fate of all the identified ranges. + * + * @return TRUE if range must be deleted. + */ +static bool +xgc_range_strategy(void *key, void *data) +{ + struct xgc_range *xr = key; + struct xgc_context *xgctx = data; + size_t len; + + /* + * If we have a range larger than a page size, coalesced or not, + * see whether we can chop its head and tail and free the amount + * of consecutive pages in-between: + * + * <------------ range ------------> + * +------+-----------------+------+ + * | head | ... n pages ... | tail | + * +------+-----------------+------+ + * ^ + * page boundary + * + * The "n pages" can be freed provided the head and tail are larger + * than the minimum block length and there is room in the targeted + * free lists (one if the block length fits one of our discrete sizes, + * two if it needs to be further split among two lists). + * + * It can also happen that the range spans two pages but never a whole + * page: + * + * <--- range ---> + * +-------------+----------+ + * | | | + * +------^------+----------^ + * ^ page boundaries ^ + * + * In which case we cannot release any page of course but that does + * not mean we cannot coalesce several smaller blocks that were + * merged into that range. + */ + + if (ptr_diff(xr->end, xr->start) >= xmalloc_pagesize) { + const void *pstart, *pend; + + pstart = vmm_page_next(xr->start); + if G_UNLIKELY(ptr_diff(pstart, xr->start) == xmalloc_pagesize) + pstart = xr->start; + pend = vmm_page_start(xr->end); + + if (pstart == pend) + goto no_page_freeable; + + /* + * We have at least one page that could be freed, but we need to + * make sure that the head and the tail are large enough to be + * put back into the freelist, if non-zero. + */ + + xr->head = ptr_diff(pstart, xr->start); + xr->tail = ptr_diff(xr->end, pend); + + if (xr->head != 0 && xr->head < XMALLOC_SPLIT_MIN) { + pstart = const_ptr_add_offset(pstart, xmalloc_pagesize); + xr->head += xmalloc_pagesize; + } + + if (xr->tail != 0 && xr->tail < XMALLOC_SPLIT_MIN) { + pend = const_ptr_add_offset(pend, -xmalloc_pagesize); + xr->tail += xmalloc_pagesize; + } + + if (ptr_cmp(pstart, pend) <= 0) + goto no_page_freeable; + + if (!xgc_block_is_freeable(xr->head, xgctx, FALSE)) + goto cannot_free_page; + + if (!xgc_block_is_freeable(xr->tail, xgctx, FALSE)) + goto cannot_free_page; + + /* + * If the pages are heap memory, they cannot be VMM-released. + */ + + if G_UNLIKELY(xmalloc_isheap(pstart, ptr_diff(pend, pstart))) + goto cannot_free_page; + + /* + * Good, we can free the head, the tail and the middle pages. + */ + + xgc_block_is_freeable(xr->head, xgctx, TRUE); + xgc_block_is_freeable(xr->tail, xgctx, TRUE); + xr->strategy = XGC_ST_FREE_PAGES; + + if (xmalloc_debugging(3)) { + s_debug("XM GC %p, %p (%zu bytes, %u blocks) handled as: " + "%u-byte head, %u-byte tail, VMM range %p, %p released", + xr->start, xr->end, ptr_diff(xr->end, xr->start), xr->blocks, + xr->head, xr->tail, pstart, pend); + } + + return FALSE; /* Keep range */ + + cannot_free_page: + XSTATS_INCX(xgc_page_freeing_failed); + + /* FALL THROUGH */ + } + +no_page_freeable: + + /* + * Range was not coalesced when it only contains a single block. + */ + + if (1 == xr->blocks) + return TRUE; /* Delete it */ + + /* + * A range can be coalesced with two blocks whose resulting size + * is not that of a freelist, in which case the block would need to + * be split again. Maybe we could find a better split, i.e. create + * a block that would end up being larger than the largest of the two + * blocks we have? + * + * Note that three blocks or more can always be coalesced to create + * a larger block at least. + */ + + len = ptr_diff(xr->end, xr->start); + + if G_UNLIKELY(2 == xr->blocks && len <= XMALLOC_MAXSIZE) { + if (xmalloc_round_blocksize(len) != len) { + unsigned b1 = xr->head; /* First block we added to range */ + unsigned b2 = len - b1; /* Second block */ + unsigned largest; + struct xsplit *xs; + + largest = MAX(b1, b2); + xs = xmalloc_split_info(largest); + + if (xs->larger <= largest) { + /* Coalescing will not do better than current situation */ + XSTATS_INCX(xgc_coalescing_useless); + return TRUE; /* Will not attempt any coalescing */ + } + } + } + + /* + * Blocks can be coalesced, make sure there is room in the targeted + * bucket(s). + */ + + if G_UNLIKELY(!xgc_block_is_freeable(len, xgctx, TRUE)) { + XSTATS_INCX(xgc_coalescing_failed); + return TRUE; /* Will not attempt any coalescing */ + } + + xr->strategy = XGC_ST_COALESCE; + + if (xmalloc_debugging(3)) { + s_debug("XM GC %p, %p (%zu bytes, %u blocks) will be coalesced", + xr->start, xr->end, ptr_diff(xr->end, xr->start), xr->blocks); + } + + return FALSE; /* Keep range */ +} + +struct xgc_processed { + size_t coalesced; /* Amount of blocks coalesced */ + size_t pages; /* Amount of pages freed */ +}; + +/** + * Execute the strategy we came up with for the range. + */ +static void +xgc_range_process(void *key, void *data) +{ + struct xgc_range *xr = key; + struct xgc_processed *xp = data; + size_t len; + void *p; + + p = deconstify_pointer(xr->start); + len = ptr_diff(xr->end, xr->start); + + switch (xr->strategy) { + case XGC_ST_COALESCE: + xmalloc_freelist_insert(p, len, TRUE, XM_COALESCE_NONE); + XSTATS_LOCK; + xstats.xgc_coalesced_blocks += xr->blocks; + xstats.xgc_coalesced_memory += len; + XSTATS_UNLOCK; + XSTATS_DECX(xgc_blocks_collected); /* One block is put back */ + xp->coalesced += xr->blocks; + break; + case XGC_ST_FREE_PAGES: + { + void *end = ptr_add_offset(p, len); + void *q; + size_t pages; + + if (xr->head != 0) { + xmalloc_freelist_insert(p, xr->head, TRUE, XM_COALESCE_NONE); + XSTATS_DECX(xgc_blocks_collected); /* One block is put back */ + } + + p = ptr_add_offset(p, xr->head); + q = ptr_add_offset(end, -xr->tail); + + if (!xmalloc_freecore(p, ptr_diff(q, p))) { + /* + * Can only happen for sbrk()-allocated core and we made + * sure this was VMM memory during strategy elaboration. + */ + s_error_from(_WHERE_, "unxepected core release error"); + } + + if (xr->tail != 0) { + xmalloc_freelist_insert(q, xr->tail, TRUE, XM_COALESCE_NONE); + if (0 == xr->head || xr->blocks > 1) + XSTATS_DECX(xgc_blocks_collected); /* Block is put back */ + } + + pages = vmm_page_count(ptr_diff(q, p)); + XSTATS_LOCK; + xstats.xgc_pages_collected += pages; + XSTATS_UNLOCK; + xp->pages += pages; + } + break; + default: + g_assert_not_reached(); + } +} + +/** + * Freelist fragment collector. + * + * Long-running programs can call this routine on a regular basis to reassemble + * and free-up pages which are completely held in the freelist, althrough they + * may be split as many individual free blocks. + * + * On-the-fly block coalescing is also performed to fight memory fragmentation + * and avoid a high number of (unused) small blocks unable to satisfy demand + * for larger blocks. + * + * Short-running programs do not need to bother at all. + */ +void +xgc(void) +{ + static time_t next_run; + static spinlock_t xgc_slk = SPINLOCK_INIT; + static long last_freelist_stamp; + time_t now; + unsigned i; + size_t blocks; + tm_t start; + double start_cpu = 0.0; + struct xgc_allocator xga; + struct xgc_context xgctx; + struct xgc_processed processed; + void const **tmp; + erbtree_t rbt; + size_t deferred_buckets = 0, deferred_blocks = 0; + + if (!xmalloc_vmm_is_up) + return; + + /* + * If there has been no changes in the freelist (no insertions nor any + * deferred block pending), we do not need to spend time here. + */ + + XSTATS_LOCK; + + if (last_freelist_stamp == xmalloc_freelist_stamp) + goto avoided; + + XSTATS_UNLOCK; + + if (!spinlock_try(&xgc_slk)) + return; + + /* + * Limit calls to 1% of the execution time, as computed at the end + * (by setting the ``next_run'' variable). + */ + + now = tm_time(); + + if (now < next_run) { + XSTATS_INCX(xgc_time_throttled); + goto done; + } + + tm_now_exact(&start); + start_cpu = tm_cputime(NULL, NULL); + + XSTATS_INCX(xgc_runs); + + /* + * From now on we cannot use any other memory allocator but VMM, since + * any memory allocation by this thread that would hit the freelist would + * trigger havoc: messing with our identified pages by using pointers that + * belong to them. + * + * We therefore use xgc_alloc() when we need to allocate dynamic memory, + * and this memory does not need to be individually freed but will be + * reclaimed as a whole through xgc_free_all() at the end of the garbage + * collection. + */ + + blocks = 0; + ZERO(&xgctx); + ZERO(&xga); + ZERO(&processed); + + /* + * Pass 1a: expand buckets that were flagged too small for coalescing, + * shrink buckets that are too large, return deferred blocks if any. + */ + + for (i = 0; i < N_ITEMS(xfreelist); i++) { + struct xfreelist *fl = &xfreelisti; + + G_PREFETCH_R(&xfreelisti + 1); + G_PREFETCH_R(&xfreelisti + 1.lock); + G_PREFETCH_W(&xgctx.lockedi + 1); + + /* + * We do not keep buckets locked during this phase since extension + * or shrinking will cause further locks to be taken. Given other + * threads could be holding these locks and attempt to also grab one + * of the buckets we locked earlier in the sequence, that could lead + * to a deadlock. + */ + + if G_UNLIKELY(0 != fl->deferred.count) { + mutex_lock(&fl->lock); + if (xfl_has_deferred(fl)) { + deferred_buckets++; + deferred_blocks += fl->deferred.count; + xfl_process_deferred(fl); + } + mutex_unlock(&fl->lock); + } + + if G_UNLIKELY(fl->expand) { + mutex_lock(&fl->lock); + + if G_UNLIKELY(!fl->expand) { + mutex_unlock(&fl->lock); + continue; + } + if (xmalloc_debugging(1)) { + s_debug("XM GC resizing freelist #%zu (cap=%zu, cnt=%zu)", + xfl_index(fl), fl->capacity, fl->count); + } + + g_assert(!fl->extending); + fl->extending = TRUE; + xfl_extend(fl); + fl->extending = FALSE; + + XSTATS_INCX(xgc_bucket_expansions); + mutex_unlock(&fl->lock); + } else if ( + fl->capacity > XM_BUCKET_MINSIZE && + delta_time(now, fl->last_shrink) > XMALLOC_XGC_SHRINK_PERIOD && + ( + 0 == fl->count || + fl->capacity - fl->count >= XM_BUCKET_INCREMENT || + fl->capacity / fl->count >= 2 + ) + ) { + mutex_lock(&fl->lock); + + if G_UNLIKELY( + fl->count != 0 && + fl->capacity - fl->count < XM_BUCKET_INCREMENT && + fl->capacity / fl->count < 2 + ) { + mutex_unlock(&fl->lock); + continue; + } + + g_assert(!fl->shrinking); + fl->shrinking = TRUE; + if (xfl_shrink(fl)) + XSTATS_INCX(xgc_bucket_shrinkings); + fl->shrinking = FALSE; + + mutex_unlock(&fl->lock); + } + } + + if (xmalloc_debugging(0) && 0 != deferred_buckets) { + s_debug("XM GC processed %zu bucket%s with %zu deferred block%s", + deferred_buckets, plural(deferred_buckets), + deferred_blocks, plural(deferred_blocks)); + } + + /* + * Pass 1b: lock all buckets, compute largest bucket usage and record + * the available room in each bucket. + */ + + for (i = 0; i < N_ITEMS(xfreelist); i++) { + struct xfreelist *fl = &xfreelisti; + + G_PREFETCH_R(&xfreelisti + 1.count); + G_PREFETCH_R(&xgctx.lockedi + 1); + G_PREFETCH_W(&xgctx.availablei + 1); + G_PREFETCH_W(&xgctx.counti + 1); + + if (!mutex_trylock(&fl->lock)) + continue; + + xgctx.lockedi = TRUE; /* Will keep bucket locked */ + + if G_UNLIKELY(fl->count > xgctx.largest) + xgctx.largest = fl->count; + + xgctx.availablei = fl->capacity - fl->count; + xgctx.counti = fl->count; + + g_assert_log(fl->count <= fl->capacity, + "count=%zu, capacity=%zu in freelist #%zu (%zu-byte block)", + fl->count, fl->capacity, xfl_index(fl), fl->blocksize); + } + + /* + * Pass 2: computes coalesced ranges for all the blocks. + */ + + erbtree_init(&rbt, xgc_range_cmp, offsetof(struct xgc_range, node)); + + for (i = 0; i < N_ITEMS(xfreelist); i++) { + struct xfreelist *fl = &xfreelisti; + size_t j, blksize; + + if (!xgctx.lockedi) + continue; + + g_assert(size_is_non_negative(fl->count)); + g_assert(size_is_non_negative(fl->sorted)); + g_assert(fl->count >= fl->sorted); + + blksize = fl->blocksize; /* Actual physical block size */ + + for (j = 0; j < fl->count; j++) { + const void *p = fl->pointersj; + + g_assert(p != NULL); /* Or freelist corrupted */ + + blocks++; + xgc_block_add(&rbt, p, blksize, &xga); + } + } + + if (xmalloc_debugging(0)) { + size_t ranges = erbtree_count(&rbt); + s_debug("XM GC freelist holds %zu block%s defining %zu range%s", + blocks, plural(blocks), ranges, plural(ranges)); + } + + /* + * Pass 3: decide on the fate of all the identified ranges. + */ + + erbtree_foreach_remove(&rbt, xgc_range_strategy, &xgctx); + + if (xmalloc_debugging(0)) { + size_t ranges = erbtree_count(&rbt); + s_debug("XM GC left with %zu range%s to process", + ranges, plural(ranges)); + } + + if (0 == erbtree_count(&rbt)) + goto unlock; + + /* + * Pass 4: strip blocks falling in ranges for which we have a strategy. + */ + + xstats.xgc_collected++; + + /* + * Even though this is technically a "user" block, we perform a "core" + * allocation because we must not enter the thread-magazine allocators + * from the xmalloc garbage collector! + */ + + tmp = vmm_core_alloc(xgctx.largest * sizeof(void *)); + + for (i = 0; i < N_ITEMS(xfreelist); i++) { + struct xfreelist *fl = &xfreelisti; + size_t j, blksize, old_count, sorted_stripped; + void const **q = tmp; + + if (!xgctx.lockedi) + continue; + + blksize = fl->blocksize; /* Actual physical block size */ + old_count = fl->count; + sorted_stripped = 0; + + /* + * Avoid O(n^2) operations by copying pointers we keep to a temporary + * buffer and then back to the bucket, requiring at most 2*n copies, + * regardless of the amount of stripped pointers and their location. + */ + + g_assert(old_count <= xgctx.largest); + + for (j = 0; j < old_count; j++) { + const void *p = fl->pointersj; + struct xgc_range key, *xr; + + G_PREFETCH_R(&fl->pointersj + 1); + + key.start = p; + key.end = const_ptr_add_offset(p, +1); + xr = erbtree_lookup(&rbt, &key); + + if (NULL == xr) { + *q++ = p; + continue; + } + + XSTATS_INCX(xgc_blocks_collected); + + fl->count--; + if (j < fl->sorted) + sorted_stripped++; /* fl->pointers not updated yet */ + + XSTATS_LOCK; + xstats.freelist_blocks--; + xstats.freelist_memory -= blksize; + XSTATS_UNLOCK; + } + + /* + * Copy back the kept items, if we removed anything. + */ + + g_assert(UNSIGNED(q - tmp) == fl->count); /* Accurate count */ + + if (old_count != fl->count) { + fl->sorted -= sorted_stripped; + + g_assert(size_is_non_negative(fl->count)); + g_assert(size_is_non_negative(fl->sorted)); + g_assert(fl->count >= fl->sorted); + g_assert(fl->count < xgctx.largest); + g_assert_log(fl->count <= fl->capacity, + "count=%zu, capacity=%zu in freelist #%zu (%zu-byte block)", + fl->count, fl->capacity, xfl_index(fl), fl->blocksize); + + memcpy(fl->pointers, tmp, fl->count * sizeof fl->pointers0); + } + } + + vmm_core_free(tmp, xgctx.largest * sizeof(void *)); + + /* + * Pass 5: execute the strategy. + */ + + erbtree_foreach(&rbt, xgc_range_process, &processed); + + /* + * Pass 6: unlock buckets (in reverse order, for assertions). + */ + +unlock: + for (i = N_ITEMS(xfreelist); i != 0; i--) { + G_PREFETCH_W(&xfreelisti - 2); + G_PREFETCH_W(&xfreelisti - 2.lock); + if (xgctx.lockedi - 1) { + struct xfreelist *fl = &xfreelisti - 1; + mutex_unlock(&fl->lock); + } + } + + xgc_free_all(&xga); + + /* + * Make sure we're not spending more than 1% of our running time in + * the GC, on average. Since we're running once per second, this means + * we cannot allow a running time of more than 10 ms. + */ + + { + tm_t end; + double end_cpu, real_elapsed, cpu_elapsed, elapsed; + int increment; + + end_cpu = tm_cputime(NULL, NULL); + tm_now_exact(&end); + + real_elapsed = tm_elapsed_us(&end, &start); + cpu_elapsed = (end_cpu - start_cpu) * 1e6; /* In usecs */ + if (end_cpu != 0.0 && real_elapsed > 2.0 * cpu_elapsed) + elapsed = cpu_elapsed; + else + elapsed = (cpu_elapsed + real_elapsed) / 2.0; + increment = elapsed <= 10000 ? 1 : (elapsed / 10000); + next_run = now + increment; + + if (xmalloc_debugging(0)) { + s_debug("XM GC took %'u usecs (CPU=%'u usecs) " + "coalesced-blocks=%zu, freed-pages=%zu, next in %d sec%s", + (uint) real_elapsed, (uint) cpu_elapsed, + processed.coalesced, processed.pages, + increment, plural(increment)); + } + } + +done: + XSTATS_LOCK; + last_freelist_stamp = xmalloc_freelist_stamp; + XSTATS_UNLOCK; + + spinunlock(&xgc_slk); + return; + +avoided: + if (xmalloc_debugging(0)) { + s_debug("XM GC call avoided (no freelist change)"); + } + + xstats.xgc_avoided++; + XSTATS_UNLOCK; +} + +/** * Signal that we're about to close down all activity. */ -G_GNUC_COLD void +void G_COLD xmalloc_pre_close(void) { /* @@ -3276,7 +6636,7 @@ * Called later in the initialization chain once the properties have * been loaded. */ -G_GNUC_COLD void +void G_COLD xmalloc_post_init(void) { /* @@ -3288,21 +6648,23 @@ * it really depends on platforms and conditions found during the early * initializations. * - * We have to use t_info() to prevent any memory allocation during logging. + * We have to use s_info() to prevent any memory allocation during logging. * It is OK at this point since the VMM layer is now up. */ if (sbrk_allocated != 0) { - t_info(NULL, "malloc() allocated %zu bytes of heap (%zu remain)", - sbrk_allocated, ptr_diff(current_break, initial_break)); + s_info("malloc() allocated %zu bytes of heap (%zu remain)", + sbrk_allocated, + ptr_diff(current_break, lowest_break) - sbrk_alignment); + + if (sbrk_alignment != 0) + s_info("addded %zu byte%s to heap base for %zu-byte alignment", + sbrk_alignment, plural(sbrk_alignment), xmalloc_round(1)); } if (xmalloc_debugging(0)) { - t_info(NULL, "XM using %ld freelist buckets", - (long) XMALLOC_FREELIST_COUNT); + s_info("XM using %ld freelist buckets", (long) XMALLOC_FREELIST_COUNT); } - - xmalloc_random_up = TRUE; /* Can use random numbers now */ } /** @@ -3310,7 +6672,7 @@ * * This is mostly useful during final cleanup when xmalloc() replaces malloc(). */ -G_GNUC_COLD void +void G_COLD xmalloc_stop_freeing(void) { memusage_free_null(&xstats.user_mem); @@ -3318,20 +6680,25 @@ } /** - * Signal that we should stop freeing memory via wfree(). + * Generate a SHA1 digest of the current xmalloc statistics. * - * This is mostly useful during final cleanup once wdestroy() has been called. + * This is meant for dynamic entropy collection. */ -G_GNUC_COLD void -xmalloc_stop_wfree(void) +void +xmalloc_stats_digest(sha1_t *digest) { - xmalloc_no_wfree = TRUE; + /* + * Don't take locks to read the statistics, to enhance unpredictability. + */ + + XSTATS_INCX(xmalloc_stats_digest); + SHA1_COMPUTE(xstats, digest); } /** * Dump xmalloc usage statistics to specified logging agent. */ -G_GNUC_COLD void +void G_COLD xmalloc_dump_usage_log(struct logagent *la, unsigned options) { if (NULL == xstats.user_mem) { @@ -3344,88 +6711,174 @@ /** * Dump xmalloc statistics to specified log agent. */ -G_GNUC_COLD void +void G_COLD xmalloc_dump_stats_log(logagent_t *la, unsigned options) { + struct xstats stats; + + XSTATS_LOCK; + stats = xstats; /* struct copy under lock protection */ + XSTATS_UNLOCK; + bool groupped = booleanize(options & DUMP_OPT_PRETTY); + #define DUMP(x) log_info(la, "XM %s = %s", #x, \ - (options & DUMP_OPT_PRETTY) ? \ - uint64_to_gstring(xstats.x) : uint64_to_string(xstats.x)) + uint64_to_string_grp(stats.x, groupped)) + +#define DUMP64(x) G_STMT_START { \ + uint64 v = AU64_VALUE(&xstats.x); \ + log_info(la, "XM %s = %s", #x, \ + uint64_to_string_grp(v, groupped)); \ +} G_STMT_END + +#define DUMPV(x) log_info(la, "XM %s = %s", #x, \ + size_t_to_string_grp(x, groupped)) + + /* + * On Windows, we're performing dynamic patching of loaded libraries + * to redirect them to our malloc(), hence we need to include the + * status of our patching activity as part of the malloc() stats. + */ + +#ifdef MINGW32 + win32dlp_dump_stats_log(la, options); +#endif DUMP(allocations); - DUMP(allocations_zeroed); + DUMP64(allocations_zeroed); DUMP(allocations_aligned); - DUMP(allocations_plain); + DUMP64(allocations_heap); + DUMP64(allocations_physical); + DUMP64(allocations_in_handler); DUMP(alloc_via_freelist); - DUMP(alloc_via_walloc); DUMP(alloc_via_vmm); DUMP(alloc_via_sbrk); + DUMP(alloc_via_thread_pool); DUMP(freeings); - DUMP(free_sbrk_core); + DUMP64(freeings_in_handler); + DUMP64(free_sbrk_core); DUMP(free_sbrk_core_released); DUMP(free_vmm_core); - DUMP(free_coalesced_vmm); - DUMP(free_walloc); + DUMP64(free_coalesced_vmm); + DUMP(free_thread_pool); + DUMP64(free_foreign_thread_pool); DUMP(sbrk_alloc_bytes); DUMP(sbrk_freed_bytes); + DUMP(sbrk_wasted_bytes); DUMP(vmm_alloc_pages); DUMP(vmm_split_pages); + DUMP64(vmm_thread_pages); DUMP(vmm_freed_pages); DUMP(aligned_via_freelist); DUMP(aligned_via_freelist_then_vmm); DUMP(aligned_via_vmm); + DUMP(aligned_via_vmm_subpage); DUMP(aligned_via_zone); DUMP(aligned_via_xmalloc); + DUMP64(aligned_lookups); DUMP(aligned_freed); - DUMP(aligned_free_false_positives); - DUMP(aligned_zones_created); - DUMP(aligned_zones_destroyed); + DUMP64(aligned_free_false_positives); + DUMP(aligned_zones_capacity); + DUMP(aligned_zones_count); + DUMP(aligned_arenas_created); + DUMP(aligned_arenas_destroyed); DUMP(aligned_overhead_bytes); - DUMP(reallocs); - DUMP(realloc_noop); + DUMP(aligned_zone_blocks); + DUMP(aligned_zone_memory); + DUMP(aligned_vmm_blocks); + DUMP(aligned_vmm_memory); + DUMP64(reallocs); + DUMP64(realloc_noop); DUMP(realloc_inplace_vmm_shrinking); DUMP(realloc_inplace_shrinking); DUMP(realloc_inplace_extension); DUMP(realloc_coalescing_extension); - DUMP(realloc_relocate_vmm_fragment); - DUMP(realloc_relocate_vmm_shrinked); - DUMP(realloc_relocate_smart_attempts); - DUMP(realloc_relocate_smart_success); - DUMP(realloc_regular_strategy); - DUMP(realloc_wrealloc); - DUMP(realloc_converted_from_walloc); - DUMP(realloc_promoted_to_walloc); - DUMP(freelist_insertions); - DUMP(freelist_insertions_no_coalescing); - DUMP(freelist_further_breakups); - DUMP(freelist_coalescing_ignore_vmm); - DUMP(freelist_coalescing_ignored); - DUMP(freelist_coalescing_done); - DUMP(freelist_coalescing_failed); - DUMP(freelist_split); - DUMP(freelist_nosplit); + DUMP64(realloc_relocate_vmm_fragment); + DUMP64(realloc_relocate_vmm_shrinked); + DUMP64(realloc_relocate_smart_attempts); + DUMP64(realloc_relocate_smart_success); + DUMP64(realloc_regular_strategy); + DUMP64(realloc_from_thread_pool); + DUMP64(freelist_insertions); + DUMP64(freelist_insertions_no_coalescing); + DUMP(freelist_insertions_deferred); + DUMP(freelist_deferred_processed); + DUMP64(freelist_bursts); + DUMP64(freelist_burst_insertions); + DUMP64(freelist_plain_insertions); + DUMP64(freelist_unsorted_insertions); + DUMP64(freelist_coalescing_ignore_burst); + DUMP64(freelist_coalescing_ignore_vmm); + DUMP64(freelist_coalescing_ignored); + DUMP64(freelist_coalescing_done); + DUMP64(freelist_coalescing_failed); + DUMP64(freelist_linear_lookups); + DUMP64(freelist_binary_lookups); + DUMP64(freelist_short_yes_lookups); + DUMP64(freelist_short_no_lookups); + DUMP64(freelist_partial_sorting); + DUMP64(freelist_full_sorting); + DUMP64(freelist_avoided_sorting); + DUMP64(freelist_sorted_superseding); + DUMP64(freelist_split); + DUMP64(freelist_nosplit); + DUMP(freelist_blocks); + DUMP(freelist_memory); -#undef DUMP -#define DUMP(x) log_info(la, "XM %s = %s", #x, \ - (options & DUMP_OPT_PRETTY) ? \ - uint64_to_gstring(xstats.x) : uint64_to_string(xstats.x)) + { + size_t chunk_pool_count, chunk_pool_capacity; + if G_LIKELY(xpages_pool != NULL) { + chunk_pool_count = pool_count(xpages_pool); + chunk_pool_capacity = pool_capacity(xpages_pool); + } else { + chunk_pool_count = chunk_pool_capacity = 0; + } + + DUMPV(chunk_pool_count); + DUMPV(chunk_pool_capacity); + } + + DUMP64(xgc_runs); + DUMP64(xgc_time_throttled); + DUMP(xgc_collected); + DUMP(xgc_avoided); + DUMP64(xgc_blocks_collected); + DUMP(xgc_pages_collected); + DUMP(xgc_coalesced_blocks); + DUMP(xgc_coalesced_memory); + DUMP64(xgc_coalescing_useless); + DUMP64(xgc_coalescing_failed); + DUMP64(xgc_page_freeing_failed); + DUMP64(xgc_bucket_expansions); + DUMP64(xgc_bucket_shrinkings); DUMP(user_memory); DUMP(user_blocks); + DUMP64(xmalloc_stats_digest); + #undef DUMP +#undef DUMP64 +#undef DUMPV } /** * Dump freelist status to specified log agent. */ -G_GNUC_COLD void +void G_COLD xmalloc_dump_freelist_log(logagent_t *la) { - size_t i; - guint64 bytes = 0; + size_t i, j; + uint64 bytes = 0; size_t blocks = 0; + size_t largest = 0; + struct { + size_t chunks; + uint64 freebytes; + size_t freeblocks; + size_t shared; + } tstatsXM_THREAD_COUNT; - for (i = 0; i < G_N_ELEMENTS(xfreelist); i++) { + for (i = 0; i < N_ITEMS(xfreelist); i++) { struct xfreelist *fl = &xfreelisti; if (0 == fl->capacity) @@ -3434,21 +6887,98 @@ bytes += fl->blocksize * fl->count; blocks = size_saturate_add(blocks, fl->count); - log_info(la, "XM freelist #%zu (%zu bytes): capacity=%zu, count=%zu, " - "lock=%zu", - i, fl->blocksize, fl->capacity, fl->count, - mutex_held_depth(&fl->lock)); + if (0 != fl->count) + largest = fl->blocksize; + + if (fl->sorted == fl->count) { + log_info(la, "XM freelist #%zu (%zu bytes): cap=%zu, " + "cnt=%zu, def=%zu, lck=%zu", + i, fl->blocksize, fl->capacity, fl->count, + fl->deferred.count, mutex_held_depth(&fl->lock)); + } else { + log_info(la, "XM freelist #%zu (%zu bytes): cap=%zu, " + "sort=%zu/%zu, def=%zu, lck=%zu", + i, fl->blocksize, fl->capacity, fl->sorted, fl->count, + fl->deferred.count, mutex_held_depth(&fl->lock)); + } + } + + ZERO(&tstats); + + for (j = 0; j < XM_THREAD_COUNT; j++) { + for (i = 0; i < XMALLOC_CHUNKHEAD_COUNT; i++) { + struct xchunkhead *ch = &xchunkheadij; + size_t tchunks = 0, tcap = 0, tcnt = 0; + struct xchunk *xck; + + if (ch->shared) + tstatsj.shared++; + + if (0 == elist_count(&ch->list) + elist_count(&ch->full)) + continue; + + ELIST_FOREACH_DATA(&ch->list, xck) { + xchunk_check(xck); + tstatsj.chunks++; + tstatsj.freebytes += xck->xc_count * xck->xc_size; + tstatsj.freeblocks += xck->xc_count; + tchunks++; + tcap += xck->xc_capacity; + tcnt += xck->xc_count; + } + + ELIST_FOREACH_DATA(&ch->full, xck) { + xchunk_check(xck); + tstatsj.chunks++; + tstatsj.freebytes += xck->xc_count * xck->xc_size; + tstatsj.freeblocks += xck->xc_count; + tchunks++; + tcap += xck->xc_capacity; + tcnt += xck->xc_count; + } + + log_info(la, "XM chunklist #%zu (%zu bytes, stid=%zu): cap=%zu, " + "cnt=%zu, chk=%zu, shr=%c", + i, ch->blocksize, j, tcap, tcnt, tchunks, + ch->shared ? 'y' : 'n'); + } } log_info(la, "XM freelist holds %s bytes (%s) spread among %zu block%s", uint64_to_string(bytes), short_size(bytes, FALSE), - blocks, 1 == blocks ? "" : "s"); + blocks, plural(blocks)); + + log_info(la, "XM freelist largest block is %zu bytes", largest); + + for (j = 0; j < XM_THREAD_COUNT; j++) { + size_t pool; + + if (0 == tstatsj.chunks) + continue; + + log_info(la, "XM thread #%zu holds %s bytes (%s) spread " + "among %zu block%s", j, + uint64_to_string(tstatsj.freebytes), + short_size(tstatsj.freebytes, FALSE), + tstatsj.freeblocks, plural(tstatsj.freeblocks)); + + pool = size_saturate_mult(tstatsj.chunks, xmalloc_pagesize); + + log_info(la, "XM thread #%zu uses a pool of %zu bytes (%s, %zu page%s)", + j, pool, short_size(pool, FALSE), + tstatsj.chunks, plural(tstatsj.chunks)); + + if (0 != tstatsj.shared) { + log_warning(la, "XM thread #%zu has %zu size%s requiring locking", + j, tstatsj.shared, plural(tstatsj.shared)); + } + } } /** * Dump xmalloc statistics. */ -G_GNUC_COLD void +void G_COLD xmalloc_dump_stats(void) { s_info("XM running statistics:"); @@ -3488,7 +7018,7 @@ * excess part at the tail of the last allocated page. * * 2. For alignments larger than or equal to XALIGN_MINSIZE and a size such - * the size <= alignment and size > alignment/2, use sub-blocks of + * as size <= alignment and size > alignment/2, use sub-blocks of * alignment bytes crammed from a system page, as handled by xzalloc(). * * 3. For all other cases, allocate through the freelist a larger zone and then @@ -3508,14 +7038,23 @@ static size_t aligned_capacity; static spinlock_t xmalloc_zone_slk = SPINLOCK_INIT; -static spinlock_t xmalloc_xa_slk = SPINLOCK_INIT; +static mutex_t xmalloc_xa_lk = MUTEX_INIT; + +#define XMALLOC_XA_LOCK mutex_lock(&xmalloc_xa_lk) +#define XMALLOC_XA_UNLOCK mutex_unlock(&xmalloc_xa_lk) + +#define XMALLOC_XA_LOCK_HIDDEN mutex_lock_hidden(&xmalloc_xa_lk) +#define XMALLOC_XA_UNLOCK_HIDDEN mutex_unlock_hidden(&xmalloc_xa_lk) + +#define assert_xmalloc_xa_is_locked() \ + assert_mutex_is_owned(&xmalloc_xa_lk) /** * Type of pages that we can describe. */ enum xpage_type { - XPAGE_SET, - XPAGE_ZONE + XPAGE_SET, /* Set of pages allocated contiguously */ + XPAGE_ZONE /* An arena used by the zone allocator */ }; /** @@ -3533,23 +7072,46 @@ size_t len; /**< Length in bytes of the page set */ }; +enum xzone_magic { XZONE_MAGIC = 0x26ac7d9b }; + +/** + * A zone allocator descriptor. + */ +struct xzone { + enum xzone_magic magic; /**< Magic number */ + elist_t arenas; /**< List of arenas in the zone */ + spinlock_t lock; /**< Zone lock */ + size_t alignment; /**< Zone alignment (also the block size) */ + int ashift; /**< Alignment bit shift */ +}; + +static inline void +xzone_check(const struct xzone * const z) +{ + g_assert(z != NULL); + g_assert(XZONE_MAGIC == z->magic); +} + +#define XZONE_LOCK(z) spinlock(&(z)->lock) +#define XZONE_UNLOCK(z) spinunlock(&(z)->lock) +#define XZONE_IS_LOCKED(z) spinlock_is_held(&(z)->lock) + /** - * Descriptor for an allocation zone. + * Descriptor for an allocation arena within a zone allocator. * - * Zones are linked together to make sure we can quickly find a page with + * Arenas are linked together to make sure we can quickly find a page with * free blocks. */ struct xdesc_zone { enum xpage_type type; /* MUST be first for structural equivalence */ - struct xdesc_zone *next; /**< Next zone with same alignment */ - struct xdesc_zone *prev; /**< Previous zone with same alignment */ + struct xzone *zone; /**< Zone to which this arena belongs to */ + link_t zone_link; /**< Links zones with same alignment */ void *arena; /**< Allocated zone arena */ bit_array_t *bitmap; /**< Allocation bitmap in page */ - size_t alignment; /**< Zone alignment (also the block size) */ size_t nblocks; /**< Amount of blocks in the zone */ }; -struct xdesc_zone **xzones; /**< Array of known zones */ +struct xzone **xzones; /**< Array of known zones */ size_t xzones_capacity; /**< Amount of zones in array */ /** @@ -3588,22 +7150,29 @@ } break; case XPAGE_ZONE: - len = compat_pagesize(); + len = xmalloc_pagesize; break; } - t_debug(NULL, "XM forgot aligned %s %p (%zu bytes)", + s_debug("XM forgot aligned %s %p (%zu bytes)", xdesc_type_str(xt->type), p, len); } switch (xt->type) { case XPAGE_SET: + XSTATS_LOCK; xstats.aligned_overhead_bytes -= sizeof(struct xdesc_set); - break; + XSTATS_UNLOCK; + goto done; case XPAGE_ZONE: + XSTATS_LOCK; xstats.aligned_overhead_bytes -= sizeof(struct xdesc_zone); - break; + XSTATS_UNLOCK; + goto done; } + g_assert_not_reached(); + +done: xfree(pdesc); } @@ -3630,37 +7199,44 @@ * * @return index within the array where ``p'' is stored, * -1 if not found. */ -static G_GNUC_HOT size_t +static size_t G_HOT xa_lookup(const void *p, size_t *low_ptr) { - size_t low = 0, high = aligned_count - 1; - size_t mid; + const struct xaligned + *low = &aligned0, + *high = &alignedaligned_count - 1, + *mid; + + XSTATS_INCX(aligned_lookups); + + if G_UNLIKELY(0 == aligned_count) { + if (low_ptr != NULL) + *low_ptr = 0; + return (size_t) -1; + } /* Binary search */ for (;;) { - const struct xaligned *item; - - if G_UNLIKELY(low > high || high > SIZE_MAX / 2) { - mid = -1; /* Not found */ + if G_UNLIKELY(low > high) { + mid = NULL; /* Not found */ break; } mid = low + (high - low) / 2; - item = &alignedmid; - if (p > item->start) + if (p > mid->start) low = mid + 1; - else if (p < item->start) - high = mid - 1; + else if (p < mid->start) + high = mid - 1; /* -1 OK since pointers cannot reach page 0 */ else break; /* Found */ } if (low_ptr != NULL) - *low_ptr = low; + *low_ptr = low - &aligned0; - return mid; + return NULL == mid ? (size_t) -1 : (size_t) (mid - &aligned0); } /** @@ -3672,14 +7248,11 @@ g_assert(size_is_positive(aligned_count)); g_assert(size_is_non_negative(idx) && idx < aligned_count); g_assert(alignedidx.pdesc != NULL); + assert_xmalloc_xa_is_locked(); xdesc_free(alignedidx.pdesc, alignedidx.start); - aligned_count--; - if (idx < aligned_count) { - memmove(&alignedidx, &alignedidx + 1, - (aligned_count - idx) * sizeof(aligned0)); - } + ARRAY_REMOVE_DEC(aligned, idx, aligned_count); } /** @@ -3690,19 +7263,24 @@ { size_t new_capacity; + assert_xmalloc_xa_is_locked(); + new_capacity = size_saturate_mult(aligned_capacity, 2); if (0 == new_capacity) new_capacity = 2; - aligned = xrealloc(aligned, new_capacity * sizeof aligned0); + XREALLOC_ARRAY(aligned, new_capacity); + + XSTATS_LOCK; xstats.aligned_overhead_bytes += (new_capacity - aligned_capacity) * sizeof aligned0; + XSTATS_UNLOCK; + aligned_capacity = new_capacity; if (xmalloc_debugging(1)) { - t_debug(NULL, - "XM aligned array capacity now %zu, starts at %p (%zu bytes)", + s_debug("XM aligned array capacity now %zu, starts at %p (%zu bytes)", aligned_capacity, (void *) aligned, new_capacity * sizeof aligned0); } @@ -3720,7 +7298,7 @@ g_assert(aligned_count <= aligned_capacity); g_assert(vmm_page_start(p) == p); - spinlock(&xmalloc_xa_slk); + XMALLOC_XA_LOCK; if G_UNLIKELY(aligned_count >= aligned_capacity) xa_align_extend(); @@ -3733,8 +7311,7 @@ */ if G_UNLIKELY((size_t ) -1 != xa_lookup(p, &idx)) { - t_error_from(_WHERE_, NULL, - "page %p already in aligned list (as page %s)", + s_error_from(_WHERE_, "page %p already in aligned list (as page %s)", p, xalign_type_str(&alignedidx)); } @@ -3745,18 +7322,14 @@ */ g_assert(aligned != NULL); - g_assert(idx <= aligned_count); - if G_LIKELY(idx < aligned_count) { - memmove(&alignedidx + 1, &alignedidx, - (aligned_count - idx) * sizeof aligned0); - } + ARRAY_MAKEROOM(aligned, idx, aligned_count, aligned_capacity); aligned_count++; alignedidx.start = p; alignedidx.pdesc = pdesc; - spinunlock(&xmalloc_xa_slk); + XMALLOC_XA_UNLOCK; } /** @@ -3769,120 +7342,168 @@ g_assert(size_is_positive(size)); - xs = xmalloc(sizeof *xs); + XMALLOC(xs); xs->type = XPAGE_SET; xs->len = size; xa_insert(p, xs); + XSTATS_LOCK; xstats.aligned_overhead_bytes += sizeof *xs; xstats.vmm_alloc_pages += vmm_page_count(size); xstats.user_blocks++; xstats.user_memory += size; + xstats.aligned_vmm_blocks++; + xstats.aligned_vmm_memory += size; + XSTATS_UNLOCK; memusage_add(xstats.user_mem, size); if (xmalloc_debugging(2)) { - t_debug(NULL, "XM recorded aligned %p (%zu bytes)", p, size); + s_debug("XM recorded aligned %p (%zu bytes)", p, size); } } /** * Initialize the array of zones. */ -static G_GNUC_COLD void +static void G_COLD xzones_init(void) { + g_assert(spinlock_is_held(&xmalloc_zone_slk)); g_assert(NULL == xzones); - xzones_capacity = highest_bit_set(compat_pagesize()) - XALIGN_SHIFT; + xzones_capacity = highest_bit_set(xmalloc_pagesize) - XALIGN_SHIFT; g_assert(size_is_positive(xzones_capacity)); - xzones = xmalloc(xzones_capacity * sizeof xzones0); + OMALLOC0_ARRAY(xzones, xzones_capacity); /* Never freed! */ + + XSTATS_LOCK; xstats.aligned_overhead_bytes += xzones_capacity * sizeof xzones0; + xstats.aligned_zones_capacity = xzones_capacity; + XSTATS_UNLOCK; } /** - * Allocate a zone with blocks of ``alignment'' bytes each. + * Allocate a new zone capable of allocating aligned objects. + * + * @param alignment alignment constraint, which is also the block size + * + * @return a new zone allocator, to get aligned objects of ``alignment'' bytes. + */ +static struct xzone * +xzget(size_t alignment) +{ + struct xzone *z; + + g_assert(size_is_positive(alignment)); + g_assert(alignment < xmalloc_pagesize); + g_assert(is_pow2(alignment)); + + OMALLOC0(z); /* Never freed! */ + z->magic = XZONE_MAGIC; + z->alignment = alignment; + z->ashift = highest_bit_set(alignment); + elist_init(&z->arenas, offsetof(struct xdesc_zone, zone_link)); + spinlock_init(&z->lock); + + XSTATS_LOCK; + xstats.aligned_overhead_bytes += sizeof *z; + xstats.aligned_zones_count++; + XSTATS_UNLOCK; + + return z; +} + +/** + * Allocate a zone arena with blocks of ``alignment'' bytes each. + * + * @param z the zone to which the arena belongs to * * @return new page descriptor for the zone. */ static struct xdesc_zone * -xzget(size_t alignment) +xzarena(struct xzone *z) { struct xdesc_zone *xz; void *arena; size_t nblocks; - size_t pagesize = compat_pagesize(); - g_assert(size_is_positive(alignment)); - g_assert(alignment < pagesize); + xzone_check(z); - arena = vmm_core_alloc(pagesize); - nblocks = pagesize / alignment; + arena = vmm_core_alloc(xmalloc_pagesize); + nblocks = xmalloc_pagesize / z->alignment; g_assert(nblocks >= 2); /* Because alignment < pagesize */ - xz = xmalloc0(sizeof *xz); + XMALLOC0(xz); xz->type = XPAGE_ZONE; - xz->alignment = alignment; xz->arena = arena; xz->bitmap = xmalloc0(BIT_ARRAY_BYTE_SIZE(nblocks)); xz->nblocks = nblocks; + xz->zone = z; xa_insert(arena, xz); + XSTATS_LOCK; xstats.vmm_alloc_pages++; - xstats.aligned_zones_created++; + xstats.aligned_arenas_created++; xstats.aligned_overhead_bytes += sizeof *xz + BIT_ARRAY_BYTE_SIZE(nblocks); + XSTATS_UNLOCK; if (xmalloc_debugging(2)) { - t_debug(NULL, "XM recorded aligned %p (%zu bytes) as %zu-byte zone", - arena, pagesize, alignment); + s_debug("XM recorded aligned %p (%zu bytes) as %zu-byte zone", + arena, xmalloc_pagesize, z->alignment); } return xz; } +/** + * Free arena belonging to zone. + * + * Upon entry, the zone must be locked and it will be unlocked. + * + * @param z the zone allocator to which arena belong + * @param xz the allocation arena to free + */ static void -xzdestroy(struct xdesc_zone *xz) +xzdestroy(struct xzone *z, struct xdesc_zone *xz) { + g_assert(XZONE_IS_LOCKED(z)); + + elist_remove(&z->arenas, xz); + xz->zone = NULL; + XZONE_UNLOCK(z); + /* - * Unlink structure from the zone list. + * The zone arena is now detached from the zone allocator and cannot + * be found when allocating. The descriptor is not freed yet. */ - if (xz->prev != NULL) - xz->prev->next = xz->next; - if (xz->next != NULL) - xz->next->prev = xz->prev; - if (xmalloc_debugging(2)) { - t_debug(NULL, "XM discarding %szone for %zu-byte blocks at %p", - (NULL == xz->next && NULL == xz->prev) ? "last " : "", - xz->alignment, xz->arena); - } + size_t cnt; - if G_UNLIKELY(NULL == xz->prev) { - size_t zn; + XZONE_LOCK(z); + cnt = elist_count(&z->arenas); + XZONE_UNLOCK(z); - /* - * Was head of list, need to update the zone's head. - */ - - zn = highest_bit_set(xz->alignment >> XALIGN_SHIFT); - - g_assert(xzones != NULL); - g_assert(zn < xzones_capacity); - g_assert(xzoneszn == xz); - - xzoneszn = xz->next; + s_debug("XM discarding %szone arena for %zu-byte blocks at %p", + 0 == cnt ? "last " : "", z->alignment, xz->arena); } xfree(xz->bitmap); - vmm_core_free(xz->arena, compat_pagesize()); + vmm_core_free(xz->arena, xmalloc_pagesize); + XSTATS_LOCK; xstats.vmm_freed_pages++; - xstats.aligned_zones_destroyed++; + xstats.aligned_arenas_destroyed++; xstats.aligned_overhead_bytes -= BIT_ARRAY_BYTE_SIZE(xz->nblocks); + XSTATS_UNLOCK; + + /* + * The zone descriptor ``xz'' will be freed when xa_delete_slot() + * is called. + */ } /** @@ -3894,28 +7515,39 @@ xzalloc(size_t alignment) { size_t zn; - struct xdesc_zone *xz, *xzf; + struct xzone *z; + struct xdesc_zone *xz; size_t bn; void *p; g_assert(size_is_positive(alignment)); g_assert(alignment >= XALIGN_MINSIZE); g_assert(is_pow2(alignment)); - g_assert(alignment < compat_pagesize()); + g_assert(alignment < xmalloc_pagesize); - spinlock(&xmalloc_zone_slk); + zn = highest_bit_set(alignment >> XALIGN_SHIFT); - if G_UNLIKELY(NULL == xzones) - xzones_init(); + /* + * Find proper zone allocator for this alignment, and allocate a new + * one if none existed already. + */ - zn = highest_bit_set(alignment >> XALIGN_SHIFT); + g_assert(NULL == xzones || zn < xzones_capacity); - g_assert(zn < xzones_capacity); + if G_UNLIKELY(NULL == xzones || NULL == (z = xzoneszn)) { + spinlock(&xmalloc_zone_slk); - xz = xzoneszn; + if (NULL == xzones) + xzones_init(); - if G_UNLIKELY(NULL == xz) - xz = xzoneszn = xzget(alignment); + if (NULL == (z = xzoneszn)) + z = xzoneszn = xzget(alignment); + + spinunlock(&xmalloc_zone_slk); + } + + xzone_check(z); + XZONE_LOCK(z); /* * Find which zone in the list has any free block available and compute @@ -3924,69 +7556,61 @@ bn = (size_t) -1; - for (xzf = xz; xzf != NULL; xzf = xzf->next) { - bn = bit_array_first_clear(xzf->bitmap, 0, xzf->nblocks - 1); + ELIST_FOREACH_DATA(&z->arenas, xz) { + g_assert(xz->zone == z); + bn = bit_array_first_clear(xz->bitmap, 0, xz->nblocks - 1); if G_LIKELY((size_t) -1 != bn) break; } /* - * If we haven't found any zone with a free block, allocate a new one. + * If we haven't found any arena with a free block, allocate a new one. */ if G_UNLIKELY((size_t) -1 == bn) { - xzf = xzget(alignment); - bn = 0; /* Grab first block */ - g_assert(NULL == xz->prev); - xzoneszn = xzf; /* New head of list */ - xzf->next = xz; - xz->prev = xzf; - xz = xzf; /* Update head */ + xz = xzarena(z); + elist_prepend(&z->arenas, xz); + bn = 0; /* Grab first block of new arena */ } /* * Mark selected block as used and compute the block's address. */ - bit_array_set(xzf->bitmap, bn); - p = ptr_add_offset(xzf->arena, bn * xzf->alignment); + bit_array_set(xz->bitmap, bn); + p = ptr_add_offset(xz->arena, bn << z->ashift); if (xmalloc_debugging(3)) { - t_debug(NULL, "XM allocated %zu-byte aligned block #%zu at %p from %p", - xzf->alignment, bn, p, xzf->arena); + s_debug("XM allocated %zu-byte aligned block #%zu at %p from %p", + z->alignment, bn, p, xz->arena); } /* * Place the zone where we allocated a block from at the top of the - * list unless there are no more free blocks in the zone or the block - * is already at the head. + * list unless there are no more free blocks in the zone. * * Because we attempt to keep zones with free blocks at the start of * the list, it is unlikely we have to move around the block in the list. */ - if G_UNLIKELY(bn != xzf->nblocks - 1 && xzf != xz) { - if (xmalloc_debugging(2)) { - t_debug(NULL, "XM moving %zu-byte zone %p to head of zone list", - xzf->alignment, xzf->arena); + if (bn != xz->nblocks - 1) { + if (xmalloc_debugging(2) && xz != elist_head(&z->arenas)) { + s_debug("XM moving %zu-byte zone %p to head of zone list", + z->alignment, xz->arena); } - g_assert(xzf->prev != NULL); /* Not at start of list */ - g_assert(NULL == xz->prev); /* Old head of list */ - xzf->prev->next = xzf->next; - if (xzf->next != NULL) - xzf->next->prev = xzf->prev; - xzf->next = xz; - xzf->prev = NULL; - xz->prev = xzf; - xzoneszn = xzf; /* New head of list */ + elist_moveto_head(&z->arenas, xz); } + XZONE_UNLOCK(z); + + XSTATS_LOCK; xstats.user_blocks++; xstats.user_memory += alignment; + xstats.aligned_zone_blocks++; + xstats.aligned_zone_memory += alignment; + XSTATS_UNLOCK; memusage_add(xstats.user_mem, alignment); - spinunlock(&xmalloc_zone_slk); - return p; } @@ -3995,34 +7619,100 @@ * * @return TRUE if zone was all clear and freed. */ -static gboolean +static bool xzfree(struct xdesc_zone *xz, const void *p) { + struct xzone *z; size_t bn; + bool cleared; g_assert(vmm_page_start(p) == xz->arena); - spinlock(&xmalloc_zone_slk); + z = xz->zone; + xzone_check(z); + XZONE_LOCK(z); - bn = ptr_diff(p, xz->arena) / xz->alignment; + bn = ptr_diff(p, xz->arena) >> z->ashift; g_assert(bn < xz->nblocks); g_assert(bit_array_get(xz->bitmap, bn)); bit_array_clear(xz->bitmap, bn); - xstats.user_blocks--; - xstats.user_memory -= xz->alignment; - memusage_remove(xstats.user_mem, xz->alignment); - if ((size_t) -1 == bit_array_last_set(xz->bitmap, 0, xz->nblocks - 1)) { - xzdestroy(xz); - spinunlock(&xmalloc_zone_slk); - return TRUE; + xzdestroy(z, xz); + cleared = TRUE; /* Releases zone's lock */ } else { - spinunlock(&xmalloc_zone_slk); - return FALSE; + XZONE_UNLOCK(z); + cleared = FALSE; } + + XSTATS_LOCK; + xstats.freeings++; /* Not counted in xfree() */ + xstats.aligned_freed++; + xstats.user_blocks--; + xstats.user_memory -= z->alignment; + xstats.aligned_zone_blocks--; + xstats.aligned_zone_memory -= z->alignment; + XSTATS_UNLOCK; + memusage_remove(xstats.user_mem, z->alignment); + + return cleared; +} + +/** + * Compute size of block allocated on an aligned boundary, supposedly. + * + * @return length of physical block, 0 if block was not allocated by the + * aligning layer. + */ +static size_t +xalign_allocated(const void *p) +{ + size_t idx; + const void *start; + struct xdesc_type *xt; + size_t len = 0; + + start = vmm_page_start(p); + + XMALLOC_XA_LOCK_HIDDEN; + + idx = xa_lookup(start, NULL); + + if G_LIKELY((size_t) -1 == idx) { + XMALLOC_XA_UNLOCK_HIDDEN; + return 0; + } + + xt = alignedidx.pdesc; + + switch (xt->type) { + case XPAGE_SET: + { + struct xdesc_set *xs = (struct xdesc_set *) xt; + + len = xs->len; + g_assert(0 != len); + } + goto done; + case XPAGE_ZONE: + { + struct xdesc_zone *xz = (struct xdesc_zone *) xt; + struct xzone *z = xz->zone; + + xzone_check(z); + len = z->alignment; + g_assert(0 != len); + } + goto done; + } + + g_assert_not_reached(); + +done: + XMALLOC_XA_UNLOCK_HIDDEN; + return len; } /** @@ -4031,13 +7721,12 @@ * * @return TRUE if aligned block was found and freed, FALSE otherwise. */ -static gboolean +static bool xalign_free(const void *p) { size_t idx; const void *start; struct xdesc_type *xt; - gboolean lookup_was_safe; /* * We do not only consider page-aligned pointers because we can allocate @@ -4046,32 +7735,22 @@ */ start = vmm_page_start(p); - - lookup_was_safe = spinlock_try(&xmalloc_xa_slk); + XMALLOC_XA_LOCK; idx = xa_lookup(start, NULL); if G_LIKELY((size_t) -1 == idx) { - xstats.aligned_free_false_positives++; - if (lookup_was_safe) - spinunlock(&xmalloc_xa_slk); + XMALLOC_XA_UNLOCK; + XSTATS_INCX(aligned_free_false_positives); return FALSE; } if G_UNLIKELY(xmalloc_no_freeing) { - if (lookup_was_safe) - spinunlock(&xmalloc_xa_slk); + XMALLOC_XA_UNLOCK; return TRUE; } - if (!lookup_was_safe) { - spinlock(&xmalloc_xa_slk); - idx = xa_lookup(start, NULL); - g_assert((size_t) -1 != idx); - } - xt = alignedidx.pdesc; - xstats.aligned_freed++; switch (xt->type) { case XPAGE_SET: @@ -4081,28 +7760,38 @@ g_assert(0 != len); xa_delete_slot(idx); - vmm_core_free(deconstify_gpointer(p), len); + XMALLOC_XA_UNLOCK; + vmm_core_free(deconstify_pointer(p), len); + + XSTATS_LOCK; + xstats.freeings++; /* Not counted in xfree() */ + xstats.aligned_freed++; xstats.vmm_freed_pages += vmm_page_count(len); xstats.user_memory -= len; xstats.user_blocks--; + xstats.aligned_vmm_blocks--; + xstats.aligned_vmm_memory -= len; + XSTATS_UNLOCK; memusage_remove(xstats.user_mem, len); } - goto done; + return TRUE; case XPAGE_ZONE: { struct xdesc_zone *xz = (struct xdesc_zone *) xt; - if (xzfree(xz, p)) - xa_delete_slot(idx); /* Last block from zone freed */ + XMALLOC_XA_UNLOCK; + + if G_UNLIKELY(xzfree(xz, p)) { + XMALLOC_XA_LOCK; + xa_delete_slot(idx); /* Last block from zone arena freed */ + XMALLOC_XA_UNLOCK; + } } - goto done; + return TRUE; } g_assert_not_reached(); - -done: - spinunlock(&xmalloc_xa_slk); - return TRUE; + return FALSE; } /** @@ -4110,7 +7799,7 @@ */ enum truncation { TRUNCATION_NONE = 0, - TRUNCATION_BEFORE = (1 << 0), + TRUNCATION_BEFORE = (1 << 0), TRUNCATION_AFTER = (1 << 1), TRUNCATION_BOTH = (TRUNCATION_BEFORE | TRUNCATION_AFTER) }; @@ -4142,7 +7831,6 @@ posix_memalign(void **memptr, size_t alignment, size_t size) { void *p; - size_t pagesize; const char *method = "xmalloc"; enum truncation truncation = TRUNCATION_NONE; @@ -4152,16 +7840,23 @@ if (0 != alignment % sizeof(void *)) return EINVAL; - xstats.allocations_aligned++; - if G_UNLIKELY(alignment <= XMALLOC_ALIGNBYTES) { p = xmalloc(size); + XSTATS_LOCK; + xstats.allocations_aligned++; xstats.aligned_via_xmalloc++; + XSTATS_UNLOCK; goto done; } - if G_UNLIKELY(!xmalloc_vmm_is_up) - return ENOMEM; /* Cannot allocate without the VMM layer */ + /* + * To be able to perform posix_memalign() calls before the VMM is fully up, + * use vmm_early_init() to launch the VM layer without notifying xmalloc() + * that the VMM is up, so that we do not start to register the garbage + * collector yet. + */ + + ONCE_FLAG_RUN(xmalloc_early_inited, xmalloc_early_init); /* * If they want to align on some boundary, they better be allocating @@ -4171,7 +7866,7 @@ if G_UNLIKELY(size <= alignment / 2) { if (xmalloc_debugging(0)) { - t_carp(NULL, "XM requested to allocate only %zu bytes " + s_carp("XM requested to allocate only %zu bytes " "with %zu-byte alignment", size, alignment); } } @@ -4181,13 +7876,14 @@ * allocate enough pages to get a proper alignment and free the rest. */ - pagesize = compat_pagesize(); - - if G_UNLIKELY(alignment == pagesize) { + if G_UNLIKELY(alignment == xmalloc_pagesize) { p = vmm_core_alloc(size); /* More than we need */ method = "VMM"; + XSTATS_LOCK; + xstats.allocations_aligned++; xstats.aligned_via_vmm++; + XSTATS_UNLOCK; /* * There is no xmalloc() header for this block, hence we need to @@ -4196,7 +7892,7 @@ xa_insert_set(p, round_pagesize(size)); goto done; - } if (alignment > pagesize) { + } if (alignment > xmalloc_pagesize) { size_t rsize = round_pagesize(size); size_t nalloc = size_saturate_add(alignment, rsize); size_t mask = alignment - 1; @@ -4206,7 +7902,10 @@ p = vmm_core_alloc(nalloc); /* More than we need */ method = "VMM"; + XSTATS_LOCK; + xstats.allocations_aligned++; xstats.aligned_via_vmm++; + XSTATS_UNLOCK; /* * Is the address already properly aligned? @@ -4216,7 +7915,7 @@ addr = pointer_to_ulong(p); if (xmalloc_debugging(2)) { - t_debug(NULL, "XM alignement requirement %zu, " + s_debug("XM alignement requirement %zu, " "allocated %zu at %p (%s aligned)", alignment, nalloc, p, (addr & ~mask) == addr ? "is" : "not"); } @@ -4227,7 +7926,7 @@ truncation = TRUNCATION_AFTER; if (xmalloc_debugging(2)) { - t_debug(NULL, "XM freed trailing %zu bytes at %p", + s_debug("XM freed trailing %zu bytes at %p", size_saturate_sub(nalloc, rsize), end); } } else { @@ -4242,7 +7941,7 @@ end = ptr_add_offset(p, nalloc); if (xmalloc_debugging(2)) { - t_debug(NULL, "XM aligned %p to 0x%x yields %p", + s_debug("XM aligned %p to 0x%zx yields %p", p, alignment, q); } @@ -4259,7 +7958,7 @@ qend = ptr_add_offset(q, rsize); if (xmalloc_debugging(2)) { - t_debug(NULL, "XM freed leading %zu bytes at %p", + s_debug("XM freed leading %zu bytes at %p", ptr_diff(q, p), p); } @@ -4268,7 +7967,7 @@ truncation = TRUNCATION_BOTH; if (xmalloc_debugging(2)) { - t_debug(NULL, "XM freed trailing %zu bytes at %p", + s_debug("XM freed trailing %zu bytes at %p", ptr_diff(end, qend), qend); } } else { @@ -4292,7 +7991,7 @@ * a large block and trimming the unneeded parts. */ - if (size >= pagesize) { + if (size >= xmalloc_pagesize) { size_t rsize = round_pagesize(size); p = vmm_core_alloc(rsize); /* Necessarily aligned */ @@ -4307,7 +8006,11 @@ xa_insert_set(p, rsize); method = "plain VMM"; + XSTATS_LOCK; + xstats.allocations_aligned++; xstats.aligned_via_vmm++; + XSTATS_UNLOCK; + goto done; } else if (size > alignment / 2 && size <= alignment) { /* @@ -4317,7 +8020,101 @@ p = xzalloc(alignment); method = "zone"; + + XSTATS_LOCK; + xstats.allocations_aligned++; xstats.aligned_via_zone++; + XSTATS_UNLOCK; + + goto done; + } else if ( + size >= xmalloc_pagesize / 2 && + xmalloc_round_blocksize(size + alignment + XHEADER_SIZE) <= + xmalloc_pagesize - XMALLOC_SPLIT_MIN + ) { + size_t len; + void *start, *u, *end, *uend; + unsigned long addr; + size_t mask = alignment - 1; + + g_assert(size < xmalloc_pagesize); + + /* + * Allocate at the tail of the page, on the proper alignment boundary. + */ + + start = vmm_core_alloc(xmalloc_pagesize); + len = xmalloc_round_blocksize(size + alignment) + XHEADER_SIZE; + + g_assert(len <= xmalloc_pagesize); + + p = ptr_add_offset(start, xmalloc_pagesize - len); + u = ptr_add_offset(p, XHEADER_SIZE); /* User pointer */ + addr = pointer_to_ulong(u); + + /* + * Align starting user address. + */ + + if ((addr & ~mask) != addr) { + addr = size_saturate_add(pointer_to_ulong(u), mask) & ~mask; + u = ulong_to_pointer(addr); + p = ptr_add_offset(u, -XHEADER_SIZE); + } + + /* + * Put beginning of page back to freelist. + */ + + if (p != start) { + size_t before = ptr_diff(p, start); + + g_assert(size_is_positive(before)); + g_assert(before >= XMALLOC_SPLIT_MIN); + + /* Beginning of block, in excess */ + xmalloc_freelist_insert(start, before, FALSE, XM_COALESCE_BEFORE); + truncation |= TRUNCATION_BEFORE; + } + + /* + * Set up remainder as a malloc block. + */ + + len = xmalloc_pagesize - ptr_diff(p, start); + end = ptr_add_offset(start, xmalloc_pagesize); + uend = ptr_add_offset(p, len); + + g_assert(ptr_diff(uend, end) <= 0); + + /* + * If there is excess, put back to freelist. + */ + + if (uend != end) { + size_t after = ptr_diff(end, uend); + + g_assert_log(size_is_non_negative(after), + "p=%p, uend=%p, len=%zu, end=%p", p, uend, len, end); + + if (after >= XMALLOC_SPLIT_MIN) { + /* End of block, in excess */ + xmalloc_freelist_insert(uend, after, + FALSE, XM_COALESCE_AFTER); + truncation |= TRUNCATION_AFTER; + } else { + len += after; /* Not truncated */ + } + } + + p = xmalloc_block_setup(p, len); /* User pointer */ + method = "VMM trailing sub-page"; + + XSTATS_LOCK; + xstats.allocations_aligned++; + xstats.aligned_via_vmm_subpage++; + XSTATS_UNLOCK; + goto done; } else { size_t nalloc, len, blen; @@ -4327,9 +8124,13 @@ /* * We add XHEADER_SIZE to account for the xmalloc() header. + * + * We add twice the alignment in case the first aligned address is + * too close to the start of the block (less than XMALLOC_SPLIT_MIN), + * so that we can move to the next aligned address safely. */ - nalloc = size_saturate_add(alignment, size); + nalloc = size_saturate_add(alignment + alignment, size); len = xmalloc_round_blocksize(xmalloc_round(nalloc) + XHEADER_SIZE); /* @@ -4344,32 +8145,44 @@ if (p != NULL) { end = ptr_add_offset(p, nalloc); method = "freelist"; + + XSTATS_LOCK; + xstats.allocations_aligned++; xstats.aligned_via_freelist++; + XSTATS_UNLOCK; } else { - if (len >= pagesize) { + if (len >= xmalloc_pagesize) { size_t vlen = round_pagesize(len); p = vmm_core_alloc(vlen); end = ptr_add_offset(p, vlen); method = "freelist, then large VMM"; + + XSTATS_LOCK; + xstats.allocations_aligned++; + xstats.aligned_via_freelist_then_vmm++; xstats.vmm_alloc_pages += vmm_page_count(vlen); + XSTATS_UNLOCK; if (xmalloc_debugging(1)) { - t_debug(NULL, "XM added %zu bytes of VMM core at %p", - vlen, p); + s_debug("XM added %zu bytes of VMM core at %p", vlen, p); } } else { - p = vmm_core_alloc(pagesize); - end = ptr_add_offset(p, pagesize); + p = vmm_core_alloc(xmalloc_pagesize); + end = ptr_add_offset(p, xmalloc_pagesize); method = "freelist, then plain VMM"; + + XSTATS_LOCK; + xstats.aligned_via_freelist_then_vmm++; + xstats.allocations_aligned++; xstats.vmm_alloc_pages++; + XSTATS_UNLOCK; if (xmalloc_debugging(1)) { - t_debug(NULL, "XM added %zu bytes of VMM core at %p", - pagesize, p); + s_debug("XM added %zu bytes of VMM core at %p", + xmalloc_pagesize, p); } } - xstats.aligned_via_freelist_then_vmm++; } g_assert(p != NULL); @@ -4377,9 +8190,11 @@ /* * This is the physical block size we want to return in the block * header to flag it as a valid xmalloc()ed one. + * + * This may not be a valid xmalloc() block size, but that's OK. */ - blen = xmalloc_round_blocksize(xmalloc_round(size) + XHEADER_SIZE); + blen = xmalloc_round(size) + XHEADER_SIZE; /* * Is the address already properly aligned? @@ -4403,7 +8218,8 @@ g_assert(size_is_non_negative(split_len)); if (split_len >= XMALLOC_SPLIT_MIN) { - xmalloc_freelist_insert(split, split_len, XM_COALESCE_AFTER); + xmalloc_freelist_insert(split, split_len, + FALSE, XM_COALESCE_AFTER); truncation = TRUNCATION_AFTER; } else { blen = ptr_diff(end, p); @@ -4418,13 +8234,14 @@ */ addr = size_saturate_add(pointer_to_ulong(u), mask) & ~mask; + adjusted: u = ulong_to_pointer(addr); /* Aligned user pointer */ g_assert(ptr_cmp(u, end) <= 0); g_assert(ptr_cmp(ptr_add_offset(u, size), end) <= 0); /* - * Remove excess pages at the beginning and the end. + * Remove excess memory at the beginning and the end. */ g_assert(ptr_diff(u, p) >= XHEADER_SIZE); @@ -4434,11 +8251,21 @@ if (q != p) { size_t before = ptr_diff(q, p); - /* Because alignment is large enough, this must hold */ - g_assert(before >= XMALLOC_SPLIT_MIN); + g_assert(size_is_positive(before)); + + /* + * If too close from the starting address, move to the next + * aligned one, which is safe because we allocated at least + * twice the alignment bytes. + */ + + if G_UNLIKELY(before < XMALLOC_SPLIT_MIN) { + addr += alignment; + goto adjusted; + } /* Beginning of block, in excess */ - xmalloc_freelist_insert(p, before, XM_COALESCE_BEFORE); + xmalloc_freelist_insert(p, before, FALSE, XM_COALESCE_BEFORE); truncation |= TRUNCATION_BEFORE; } @@ -4447,9 +8274,14 @@ if (uend != end) { size_t after = ptr_diff(end, uend); + g_assert_log(size_is_non_negative(after), + "p=%p, q=%p, blen=%zu, end=%p, uend=%p", + p, q, blen, end, uend); + if (after >= XMALLOC_SPLIT_MIN) { /* End of block, in excess */ - xmalloc_freelist_insert(uend, after, XM_COALESCE_AFTER); + xmalloc_freelist_insert(uend, after, + FALSE, XM_COALESCE_AFTER); truncation |= TRUNCATION_AFTER; } else { blen += after; /* Not truncated */ @@ -4459,8 +8291,10 @@ p = xmalloc_block_setup(q, blen); /* User pointer */ } + XSTATS_LOCK; xstats.user_memory += blen; xstats.user_blocks++; + XSTATS_UNLOCK; memusage_add(xstats.user_mem, blen); } @@ -4468,7 +8302,7 @@ *memptr = p; if (xmalloc_debugging(1)) { - t_debug(NULL, "XM aligned %p (%zu bytes) on 0x%lx / %zu via %s%s", + s_debug("XM aligned %p (%zu bytes) on 0x%lx / %zu via %s%s", p, size, (unsigned long) alignment, alignment, method, xa_truncation_str(truncation)); } @@ -4520,101 +8354,206 @@ void * valloc(size_t size) { - return memalign(compat_pagesize(), size); + return memalign(xmalloc_pagesize, size); } #endif /* XMALLOC_IS_MALLOC */ /** - * In case of crash, dump statistics and make some sanity checks. + * Ensure freelist if correctly sorted, spot inconsistencies when it isn't. + * + * @return number of freelists with problems (0 meaning everything is OK). */ -static G_GNUC_COLD void -xmalloc_crash_hook(void) +size_t +xmalloc_freelist_check(logagent_t *la, unsigned flags) { + size_t errors = 0; unsigned i; /* - * When crashing log handlers will not use stdio nor allocate memory. - * Therefore it's OK to be using s_xxx() logging routines here. - */ - - s_debug("XM heap is %p, %p", initial_break, current_break); - s_debug("XM xfreelist_maxidx = %zu", xfreelist_maxidx); -#ifdef XMALLOC_IS_MALLOC - s_debug("XM xzones_capacity = %zu", xzones_capacity); -#endif - s_debug("XM dumping virtual memory page map:"); - vmm_dump_pmap(); - xmalloc_dump_stats(); - - /* - * Now verify that all freelist buckets are not part of the freelist - * and that addresses in the freelist are correctly sorted and valid! + * Suspend the other threads to avoid concurrent memory allocation + * whilst we scan the freelist. */ - s_debug("XM verifying freelist..."); + thread_suspend_others(FALSE); - for (i = 0; i < G_N_ELEMENTS(xfreelist); i++) { + for (i = 0; i < N_ITEMS(xfreelist); i++) { struct xfreelist *fl = &xfreelisti; unsigned j; - const void *prev; - gboolean bad = FALSE; + const void *prev = NULL; + bool bad = FALSE; + bool unsorted = FALSE; + bool locked = FALSE; if (NULL == fl->pointers) continue; + /* + * Before possibly taking the bucket's lock, attempt to reserve + * some amount in the logging agent, in case we're emitting to a + * string: we do not want to be called to expand the internal string + * and have a bucket locked. + * + * Note that we do reserve even if XMALLOC_FLCF_LOCK is not set to + * avoid altering the bucket whilst we scan it, through string + * extension. + */ + + log_agent_reserve(la, 4096); /* Arbitrary, large amount */ + + /* + * Only lock buckets when it was explicitly requested. + * + * If XMALLOC_FLCF_UNLOCKED is specified, we still allow checking of + * unlocked buckets, albeit we warn if checking happens without the + * lock because we may encounter an inconsistency which does not exist. + */ + + if (flags & XMALLOC_FLCF_LOCK) { + if (mutex_trylock_hidden(&fl->lock)) { + locked = TRUE; + } else { + if (0 == (flags & XMALLOC_FLCF_UNLOCKED)) { + if (flags & (XMALLOC_FLCF_VERBOSE | XMALLOC_FLCF_LOGLOCK)) { + log_warning(la, + "XM freelist #%u skipped (already locked)", i); + } + continue; + } else { + log_warning(la, + "XM freelist #%u will be checked without lock", i); + } + } + } + if (fl->capacity < fl->count) { - s_warning("XM freelist #%zu has corrupted count %zu (capacity %zu)", - i, fl->count, fl->capacity); + if (flags & XMALLOC_FLCF_VERBOSE) { + log_warning(la, + "XM freelist #%u has corrupted count %zu (capacity %zu)", + i, fl->count, fl->capacity); + } bad = TRUE; } - for (j = 0; j < G_N_ELEMENTS(xfreelist); j++) { - if ((size_t) -1 != xfl_lookup(&xfreelistj, fl->pointers, NULL)) { - s_warning("XM freelist #%zu bucket %p listed in freelist #%zu!", - i, (void *) fl->pointers, j); - goto next; + if (!mem_is_valid_range(fl->pointers, fl->capacity * sizeof(void *))) { + if (flags & XMALLOC_FLCF_VERBOSE) { + log_warning(la, + "XM freelist #%u has corrupted pointer %p or capacity %zu", + i, fl->pointers, fl->capacity); } + bad = TRUE; } for (j = 0, prev = NULL; j < fl->count; j++) { const void *p = fl->pointersj; size_t len; - if (ptr_cmp(p, prev) <= 0) { - s_warning("XM item #%zu p=%p in freelist #%zu <= prev %p", - j, p, i, prev); + if (j > 0 && j < fl->sorted && xm_ptr_cmp(p, prev) <= 0) { + if (!unsorted) { + unsorted = TRUE; /* Emit this info once per list */ + if (flags & XMALLOC_FLCF_VERBOSE) { + if (fl->count == fl->sorted) { + log_info(la, + "XM freelist #%u has %zu item%s fully sorted", + i, fl->count, plural(fl->count)); + } else { + log_info(la, + "XM freelist #%u has %zu/%zu item%s sorted", + i, fl->sorted, fl->count, + plural(fl->sorted)); + } + } + } + if (flags & XMALLOC_FLCF_VERBOSE) { + log_warning(la, + "XM item #%u p=%p in freelist #%u <= prev %p", + j, p, i, prev); + } bad = TRUE; } prev = p; - if (!xmalloc_is_valid_pointer(p)) { - s_warning("XM item #%zu p=%p in freelist #%zu is invalid", - j, p, i); + if (!xmalloc_is_valid_pointer(p, locked)) { + if (flags & XMALLOC_FLCF_VERBOSE) { + log_warning(la, + "XM item #%u p=%p in freelist #%u is invalid: %s", + j, p, i, xmalloc_invalid_ptrstr(p)); + } bad = TRUE; - continue; + continue; /* Prudent */ + } + + if (!mem_is_valid_ptr(p)) { + if (flags & XMALLOC_FLCF_VERBOSE) { + log_warning(la, + "XM item #%u p=%p in freelist #%u is unreadable", + j, p, i); + } + bad = TRUE; + continue; /* Prudent */ } len = *(size_t *) p; if (len != fl->blocksize) { - s_warning("XM item #%zu p=%p in freelist #%zu (%zu bytes) " - "has improper length %zu", j, p, i, fl->blocksize, len); + if (flags & XMALLOC_FLCF_VERBOSE) { + log_warning(la, + "XM item #%u p=%p in freelist #%u (%zu bytes) " + "has improper length %zu", j, p, i, fl->blocksize, len); + } bad = TRUE; } } if (i > xfreelist_maxidx && fl->count != 0) { - s_warning("XM freelist #%zu has %zu items and is above maxidx=%zu", - i, fl->count, xfreelist_maxidx); + if (flags & XMALLOC_FLCF_VERBOSE) { + log_warning(la, + "XM freelist #%u has %zu items and is above maxidx=%zu", + i, fl->count, xfreelist_maxidx); + } bad = TRUE; } - s_debug("XM freelist #%zu %s", i, bad ? "** CORRUPTED **" : "OK"); + if (flags & XMALLOC_FLCF_STATUS) { + log_debug(la, + "XM freelist #%u %s", i, bad ? "** CORRUPTED **" : "OK"); + } - next: - continue; + if (bad) + errors++; + + if (locked) + mutex_unlock_hidden(&fl->lock); } + + thread_unsuspend_others(); + + return errors; +} + +/** + * In case of crash, dump statistics and make some sanity checks. + */ +static void G_COLD +xmalloc_crash_hook(void) +{ + /* + * When crashing log handlers will not use stdio nor allocate memory. + * Therefore it's OK to be using s_xxx() logging routines here. + */ + + s_debug("XM heap is %p, %p", lowest_break, current_break); + s_debug("XM xfreelist_maxidx = %zu", xfreelist_maxidx); +#ifdef XMALLOC_IS_MALLOC + s_debug("XM xzones_capacity = %zu", xzones_capacity); +#endif + s_debug("XM dumping virtual memory page map:"); + vmm_dump_pmap(); + xmalloc_dump_stats(); + + s_debug("XM verifying freelist..."); + xmalloc_freelist_check(log_agent_stderr_get(), + XMALLOC_FLCF_VERBOSE | XMALLOC_FLCF_LOCK | XMALLOC_FLCF_UNLOCKED); } /* @@ -4650,6 +8589,29 @@ { return realloc(p, size); } + +/* + * For recent MinGW startup, we need to remap strdup() as well to make sure + * it calls our malloc(). If we let it resolve by Microsoft's C runtime, it + * will call their malloc(), and we don't want that anyway. + * + * This fixed the problem encountered with recent MinGW startup which performed + * strdup() calls, then called free() on the result. Because our malloc() was + * not called by strdup(), free() was raising a panic, letting the application + * crash before entering main(). + * + * In any case, on Windows it is better to remap strdup() as well when we supply + * our own malloc() otherwise memory allocation will be done by Microsoft's + * routines. + */ +#ifdef MINGW32 +char * +strdup(const char *s) +{ + return xstrdup(s); +} +#endif /* MINGW32 */ + #endif /* XMALLOC_IS_MALLOC */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/xmalloc.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/xmalloc.h
Changed
@@ -35,37 +35,76 @@ #define _xmalloc_h_ /** + * The largest block size in the free list represents the maximum block length + * we agree to fragment. Blocks larger than that are allocated via the VMM + * layer and are therefore multiples of the system's page size. + */ +#define XMALLOC_MAXSIZE 32768 /**< Largest block size in free list */ + +/* + * Flags for xmalloc_freelist_check() + */ + +#define XMALLOC_FLCF_STATUS (1U << 0) /**< Log freelist status (OK/BAD) */ +#define XMALLOC_FLCF_VERBOSE (1U << 1) /**< Log inconsitencies */ +#define XMALLOC_FLCF_LOCK (1U << 2) /**< Lock buckets before checking */ +#define XMALLOC_FLCF_UNLOCKED (1U << 3) /**< Check unlocked buckets */ +#define XMALLOC_FLCF_LOGLOCK (1U << 4) /**< Log skipped locked buckets */ + +/* + * Used by the thread management layer only. + */ + +#ifdef THREAD_SOURCE +void xmalloc_thread_starting(unsigned stid); +void xmalloc_thread_ended(unsigned stid); +void xmalloc_thread_disable_local_pool(unsigned stid, bool disable); +#endif + +/* * Public interface. */ struct logagent; +struct sha1; -void set_xmalloc_debug(guint32 level); +void set_xmalloc_debug(uint32 level); +bool xmalloc_thread_set_local_pool(bool on); +bool xmalloc_thread_uses_local_pool(unsigned stid); +void xmalloc_crash_mode(void); void xmalloc_vmm_inited(void); void xmalloc_pre_close(void); void xmalloc_post_init(void); -gboolean xmalloc_is_malloc(void) G_GNUC_CONST; +bool xmalloc_is_malloc(void) G_CONST; void xmalloc_show_settings(void); void xmalloc_show_settings_log(struct logagent *la); void xmalloc_stop_freeing(void); -void xmalloc_stop_wfree(void); void xmalloc_dump_stats(void); void xmalloc_dump_stats_log(struct logagent *la, unsigned options); void xmalloc_dump_usage_log(struct logagent *la, unsigned options); void xmalloc_dump_freelist_log(struct logagent *la); +size_t xmalloc_freelist_check(struct logagent *la, unsigned flags); -void *xmalloc(size_t size) WARN_UNUSED_RESULT G_GNUC_MALLOC; -void *xmalloc0(size_t size) WARN_UNUSED_RESULT G_GNUC_MALLOC; -void *xpmalloc(size_t size) WARN_UNUSED_RESULT G_GNUC_MALLOC; -void *xpmalloc0(size_t size) WARN_UNUSED_RESULT G_GNUC_MALLOC; -void *xcalloc(size_t nmemb, size_t size) WARN_UNUSED_RESULT G_GNUC_MALLOC; +void xmalloc_stats_digest(struct sha1 *digest); + +void xgc(void); +void xmalloc_long_term(void); + +void *xmalloc(size_t size) G_MALLOC; +void *xmalloc0(size_t size) G_MALLOC; +void *xhmalloc(size_t size) G_MALLOC; +void *xpmalloc(size_t size) G_MALLOC; +void *xcalloc(size_t nmemb, size_t size) G_MALLOC; void *xrealloc(void *ptr, size_t size) WARN_UNUSED_RESULT; void *xprealloc(void *ptr, size_t size) WARN_UNUSED_RESULT; void xfree(void *ptr); -char *xstrdup(const char *str) WARN_UNUSED_RESULT G_GNUC_MALLOC; -char *xpstrdup(const char *str) WARN_UNUSED_RESULT G_GNUC_MALLOC; +char *xstrdup(const char *str) G_MALLOC; +char *xstrndup(const char *str, size_t n) G_MALLOC; +void xstrfreev(char **str); +size_t xallocated(const void *p); +size_t xpallocated(const void *p); -static inline void * WARN_UNUSED_RESULT G_GNUC_MALLOC +static inline void * G_MALLOC xcopy(const void *p, size_t size) { void *cp = xmalloc(size); @@ -73,13 +112,17 @@ return cp; } -static inline void * WARN_UNUSED_RESULT G_GNUC_MALLOC -xpcopy(const void *p, size_t size) -{ - void *cp = xpmalloc(size); - memcpy(cp, p, size); - return cp; -} +#define XCOPY(p) xcopy(p, sizeof *p) + +#define XMALLOC(p) \ +G_STMT_START { \ + p = xmalloc(sizeof *p); \ +} G_STMT_END + +#define XMALLOC0(p) \ +G_STMT_START { \ + p = xmalloc0(sizeof *p); \ +} G_STMT_END #define XFREE_NULL(p) \ G_STMT_START { \ @@ -89,6 +132,21 @@ } \ } G_STMT_END +#define XMALLOC_ARRAY(p,n) \ +G_STMT_START { \ + p = xmalloc((n) * sizeof p0); \ +} G_STMT_END + +#define XMALLOC0_ARRAY(p,n) \ +G_STMT_START { \ + p = xmalloc0((n) * sizeof p0); \ +} G_STMT_END + +#define XREALLOC_ARRAY(p,n) \ +G_STMT_START { \ + p = xrealloc(p, (n) * sizeof p0); \ +} G_STMT_END + #endif /* _xmalloc_h_ */ /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/xslist.c
Added
@@ -0,0 +1,209 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Expanded one-way list (within another data structure). + * + * +-----+ +-----+ +-----+ ^ + * |/////| |/////| |/////| | + * |/////| |/////| |/////| | offset + * |/////| |/////| |/////| | + * +=====+ +->+=====+ +->+=====+ x + * | | / | | / | | | link offset + * | ***-+/ | ***-+/ |(nil)| v + * +=====+ +=====+ +=====+ + * + * These are a form of embedded lists when the link offset is not zero, i.e. + * the chaining pointer does not immediately refer to the chaining pointer of + * the next item in the list. + * + * @author Raphael Manfredi + * @date 2015 + */ + +#include "common.h" + +#include "xslist.h" + +#include "unsigned.h" + +#if 0 +#define XSLIST_SAFETY_ASSERT /**< Turn on costly integrity assertions */ +#endif + +#ifdef XSLIST_SAFETY_ASSERT +#define safety_assert(x) g_assert(x) +#else +#define safety_assert(x) +#endif + +/* + * Configure owlist-gen.c for an "xslist". + */ + +#define CHECK(l) xslist_check(l) +#define INVARIANT(l) xslist_invariant(l) +#define CONTAINS(l,v) xslist_contains(l,v) +#define PREFIX xslist_ +#define OWLIST_T xslist_t +#define OWLINK_T xslink_t +#define NEXT(l,lk) xslist_next((l), (lk)) +#define SET_NEXT(l,lk,v) xslist_set_next((l), (lk), (v)) +#define LENGTH(l,h) xslist_length((l), (h)) +#define LINK_OFFSET(l) ((l)->link_offset) +#define LIST_ARG(l) (l), + +/** + * Initialize expanded list. + * + * Assuming items in the list are defined as: + * + * struct item { + * <data fields> + * struct chaining { + * <some chaining links> + * struct chaining *next; // our "next" pointer, linking field + * } chain; + * }; + * + * then the offset argument can be given as: + * + * offsetof(struct item, chain) + * + * and the link_offset argument can be given as: + * + * offsetof(struct chaining, next) + * + * to indicate the place of the field chaining items together. + * + * @param list the list structure to initialize + * @param offset the offset of the expanded link field within items + * @param link_offset the offset of the linking field in the chaining struct + */ +void +xslist_init(xslist_t *list, size_t offset, size_t link_offset) +{ + g_assert(list != NULL); + g_assert(size_is_non_negative(offset)); + g_assert(size_is_non_negative(link_offset)); + + list->magic = XSLIST_MAGIC; + list->head = NULL; + list->tail = NULL; + list->count = 0; + list->offset = offset; + list->link_offset = link_offset; +} + +/** + * Initialize and load linked items into a list. + * + * This routine is meant to allow the creation of an expanded list from + * homogeneous items that happen to be linked into another data structure + * through a single pointer. + * + * It is useful to allow reuse of code that can process such lists, such + * as xslist_sort(), xslist_shuffle(), etc... It is naturally up to the + * caller to then refetch the proper head pointer. + * + * @param list the list into which we are loading items + * @param head first data item part of the linked list (NULL possible) + * @param offset the offset of the expanded link field within items + * @param link_offset the offset of the linking field in the chaining struct + * + * @return the amount of loaded items, as a convenience. + */ +size_t +xslist_load(xslist_t *list, void *head, size_t offset, size_t link_offset) +{ + xslink_t *lk, *next; + size_t n; + + g_assert(list != NULL); + g_assert(size_is_non_negative(offset)); + + xslist_init(list, offset, link_offset); + + if G_UNLIKELY(NULL == head) + return 0; + + lk = ptr_add_offset(head, offset); + list->head = lk; + + for (n = 1; NULL != (next = xslist_next(list, lk)); n++, lk = next) + /* empty */; + + list->tail = lk; + list->count = n; + + safety_assert(xslist_length(list, list->head) == list->count); + + return n; +} + +#include "owlist-gen.c" + +/* + * These defines are there only for tags + * Routines are defined in owlist-gen.c, as included above + */ + +#define xslist_discard OWLIST_discard +#define xslist_clear OWLIST_clear +#define xslist_link_append_internal OWLIST_link_append_internal +#define xslist_link_append OWLIST_link_append +#define xslist_append OWLIST_append +#define xslist_link_prepend_internal OWLIST_link_prepend_internal +#define xslist_link_prepend OWLIST_link_prepend +#define xslist_prepend OWLIST_prepend +#define xslist_prepend_list OWLIST_prepend_list +#define xslist_append_list OWLIST_append_list +#define xslist_link_remove_after_internal OWLIST_link_remove_after_internal +#define xslist_shift OWLIST_shift +#define xslist_rotate_left OWLIST_rotate_left +#define xslist_link_insert_after_internal OWLIST_link_insert_after_internal +#define xslist_link_insert_after OWLIST_link_insert_after +#define xslist_insert_after OWLIST_insert_after +#define xslist_remove OWLIST_remove +#define xslist_remove_after OWLIST_remove_after +#define xslist_reverse OWLIST_reverse +#define xslist_find OWLIST_find +#define xslist_foreach OWLIST_foreach +#define xslist_foreach_remove OWLIST_foreach_remove +#define xslist_merge_sort OWLIST_merge_sort +#define xslist_sort_internal OWLIST_sort_internal +#define xslist_sort_with_data OWLIST_sort_with_data +#define xslist_sort OWLIST_sort +#define xslist_insert_sorted_internal OWLIST_insert_sorted_internal +#define xslist_insert_sorted_with_data OWLIST_insert_sorted_with_data +#define xslist_insert_sorted OWLIST_insert_sorted +#define xslist_nth OWLIST_nth +#define xslist_nth_next_data OWLIST_nth_next_data +#define xslist_random OWLIST_random +#define xslist_shuffle_with OWLIST_shuffle_with +#define xslist_shuffle OWLIST_shuffle + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/xslist.h
Added
@@ -0,0 +1,322 @@ +/* + * Copyright (c) 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Expanded one-way list (within another data structure). + * + * @author Raphael Manfredi + * @date 2015 + */ + +#ifndef _xslist_h_ +#define _xslist_h_ + +/** + * Get the enclosing data item from an expanded link. + */ +#ifdef __GNUC__ +#define xslist_item(lnk, type, field) G_EXTENSION({ \ + const struct slink *__mptr = (lnk); \ + (type *)((char *) __mptr - offsetof(type, field));}) +#else +#define xslist_item(lnk, type, field) \ + ((type *)((char *) (node) - offsetof(type, field))) +#endif + +enum xslist_magic { XSLIST_MAGIC = 0x20c76ebb }; + +typedef void xslink_t; /* Expanded link start, at ``offset'' bytes in item */ + +/** + * An expanded one-way list is represented by this structure. + */ +typedef struct xslist { + enum xslist_magic magic; + xslink_t *head, *tail; /* These refer to the expanded link, not items */ + size_t offset; /* Offset of expanded link in the item structure */ + size_t link_offset; /* Offset of "next" in the expanded link */ + size_t count; /* Amount of items held */ +} xslist_t; + +static inline void +xslist_check(const xslist_t * const xs) +{ + g_assert(xs != NULL); + g_assert(XSLIST_MAGIC == xs->magic); +} + +#define XSLIST_INIT(off, lkoff) { XSLIST_MAGIC, NULL, NULL, off, lkoff, 0 } + +/** + * @return next link, NULL if none. + */ +static inline xslink_t * +xslist_next(const xslist_t * const xs, const xslink_t * const lk) +{ + xslist_check(xs); + + if G_UNLIKELY(NULL == lk) + return NULL; + + return *(void **) const_ptr_add_offset(lk, xs->link_offset); +} + +/** + * set next link to specified value + * + * @return the set value, as a convenience. + */ +static inline xslink_t * +xslist_set_next(const xslist_t * const xs, xslink_t * const lk, xslink_t *value) +{ + xslist_check(xs); + g_assert(lk != NULL); + + return *(void **) const_ptr_add_offset(lk, xs->link_offset) = value; +} + +static inline bool +xslist_invariant(const xslist_t * const list) +{ + g_assert(list->count != 0 || (NULL == list->head && NULL == list->tail)); + g_assert((list->head != list->tail) == (list->count > 1U)); + g_assert(NULL == list->tail || NULL == xslist_next(list, list->tail)); + return TRUE; /* So that we can safety_assert() this routine */ +} + +/** + * Public interface. + */ + +/** + * @return whether the expanded list descriptor is non-zero. + */ +static inline bool +xslist_is_initialized(const xslist_t * const xs) +{ + return 0 != xs->magic; /* Initialized, not necessarily valid! */ +} + +/** + * @return length of expanded list. + */ +static inline size_t +xslist_count(const xslist_t * const xs) +{ + xslist_check(xs); + return xs->count; +} + +/** + * @return length of expanded list by traversing the list from the + * specified link, following forward pointers. + */ +static inline size_t +xslist_length(const xslist_t * const xs, const xslink_t *lk) +{ + size_t n = 0; + + while (lk != NULL) { + n++; + lk = xslist_next(xs, lk); + } + + return n; +} + +/** + * @return pointer to first item of list, NULL if empty. + */ +static inline void * +xslist_head(const xslist_t * const xs) +{ + xslist_check(xs); + return NULL == xs->head ? NULL : ptr_add_offset(xs->head, -xs->offset); +} + +/** + * @return pointer to last item of list, NULL if empty. + */ +static inline void * +xslist_tail(const xslist_t * const xs) +{ + xslist_check(xs); + return NULL == xs->tail ? NULL : ptr_add_offset(xs->tail, -xs->offset); +} + +/** + * @return pointer to first link of list, NULL if empty. + */ +static inline xslink_t * +xslist_first(const xslist_t * const xs) +{ + xslist_check(xs); + return xs->head; +} + +/** + * @return pointer to last link of list, NULL if empty. + */ +static inline xslink_t * +xslist_last(const xslist_t * const xs) +{ + xslist_check(xs); + return xs->tail; +} + +/** + * @return last link in forward chain. + */ +static inline xslink_t * +xslist_last_link(const xslist_t * const xs, const xslink_t *lk) +{ + xslink_t *next; + + xslist_check(xs); + + if (NULL == lk) + return NULL; + + while (NULL != (next = xslist_next(xs, lk))) + lk = next; + + return deconstify_pointer(lk); +} + +/** + * @return nth next link, NULL if none. + */ +static inline xslink_t * +xslist_nth_next(const xslist_t * const xs, const xslink_t * const lk, size_t n) +{ + const xslink_t *l = lk; + + while (n-- > 0 && l != NULL) + l = xslist_next(xs, l); + + return deconstify_pointer(l); +} + +/** + * @return the data associated with the curernt link, NULL if none. + */ +static inline void * +xslist_data(const xslist_t *list, const xslink_t * const lk) +{ + xslist_check(list); + + return NULL == lk ? NULL : + deconstify_pointer(const_ptr_add_offset(lk, -list->offset)); +} + +/** + * @return the data associated with the next item, NULL if none. + */ +static inline void * +xslist_next_data(const xslist_t *list, const void *p) +{ + const xslink_t *lk; + + xslist_check(list); + g_assert(p != NULL); + + lk = const_ptr_add_offset(p, list->offset); + lk = xslist_next(list, lk); + return NULL == lk ? NULL : + deconstify_pointer(const_ptr_add_offset(lk, -list->offset)); +} + +/** + * For assertions, check whether item is a member of the list. + * + * @attention + * This is very inefficient, as it needs to traverse the whole list, possibly. + * It only needs to be called when debugging. + */ +static inline bool +xslist_contains(const xslist_t *list, const void *p) +{ + const xslink_t *l, *lk; + + xslist_check(list); + g_assert(p != NULL); + + lk = const_ptr_add_offset(p, list->offset); + l = list->head; + + while (l != NULL) { + if G_UNLIKELY(l == lk) + return TRUE; + l = xslist_next(list, l); + } + + return FALSE; +} + +void xslist_init(xslist_t *list, size_t offset, size_t link_offset); +void xslist_discard(xslist_t *list); +void xslist_clear(xslist_t *list); +size_t xslist_load(xslist_t *list, + void *head, size_t offset, size_t link_offset); + +void xslist_foreach(const xslist_t *list, data_fn_t cb, void *data); +size_t xslist_foreach_remove(xslist_t *list, data_rm_fn_t cbr, void *data); + +void xslist_link_append(xslist_t *list, xslink_t *lk); +void xslist_append(xslist_t *list, void *data); +void xslist_link_prepend(xslist_t *list, xslink_t *lk); +void xslist_prepend(xslist_t *list, void *data); +void *xslist_shift(xslist_t *list); +void xslist_rotate_left(xslist_t *list); +void xslist_link_insert_after(xslist_t *list, xslink_t *sibling_lk, xslink_t *lk); +void xslist_insert_after(xslist_t *list, void *sibling, void *data); +void xslist_reverse(xslist_t *list); +void xslist_remove(xslist_t *list, void *data); +void *xslist_remove_after(xslist_t *list, void *sibling); +void *xslist_find(const xslist_t *list, const void *key, cmp_fn_t cmp); +void xslist_sort_with_data(xslist_t *list, cmp_data_fn_t cmp, void *data); +void xslist_sort(xslist_t *list, cmp_fn_t cmp); +void xslist_insert_sorted_with_data(xslist_t *list, void *item, + cmp_data_fn_t cmp, void *data); +void xslist_insert_sorted(xslist_t *list, void *item, cmp_fn_t cmp); +void *xslist_nth(const xslist_t *list, long n); +void *xslist_nth_next_data(const xslist_t *list, const xslink_t *lk, size_t n); +void *xslist_random(const xslist_t *list); +void xslist_shuffle(xslist_t *list); +void xslist_shuffle_with(random_fn_t rf, xslist_t *list); + +void xslist_append_list(xslist_t *list, xslist_t *other); +void xslist_prepend_list(xslist_t *list, xslist_t *other); + +#define XSLIST_FOREACH(ls, l) \ + for ((l) = xslist_first(ls); NULL != (l); (l) = xslist_next((ls), (l))) + +#define XSLIST_FOREACH_DATA(ls, d) \ + for ((d) = xslist_head(ls); NULL != (d); (d) = xslist_next_data((ls), (d))) + +#endif /* _xslist_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/xsort-gen.c
Added
@@ -0,0 +1,644 @@ +/* + * Copyright (c) 1988 Mike Haertel + * Copyright (c) 1991 Douglas C. Schmidt + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Sorting routines that do not call zalloc() or xmalloc(). + * + * Most of this code comes from the GNU C library and was adapted by Raphael + * Manfredi for inclusion into this library, mostly to remove all malloc() + * dependency, strip libc internal dependencies, and reformat to our coding + * standards. + * + * The excellent quicksort() implementation from Douglas C. Schmidt was further + * optimized: maximize the chances of picking a good pivot when the partition + * is large, optimize insertsort() when dealing with aligned items that are + * multiples of words, detect an already sorted partition or one that is + * almost-sorted to discontinue quicksort() and switch to insertsort() instead, + * and better handle pathological inputs (all items equal). + * + * @author Mike Haertel + * @date 1988 + * @author Douglas C. Schmidt + * @date 1991 + * @author Raphael Manfredi + * @date 2012 + */ + +/*** + *** This file is not meant to be compiled as a standalone version, but rather + *** included with the following macro definitions: + *** + *** UDATA optional user data: empty, or ", udata" + *** UDATA_DECL optional user data: empty, or ", void *udata" + *** CMP_FN_T type for the comparison: cmp_fn_t or cmp_data_fn_t + *** XSORT name of the xsort() routine + *** XQSORT name of the xqsort() routine + *** TAG postfix for internal routines, to have separate names + *** + *** The aim is to factorize the code required to perform sorting with a + *** regular comparison routine (cmp_fn_t) or with a comparison routine that + *** takes an additional contextual argument (cmp_data_fn_t). + *** --RAM, 2014-01-08 + ***/ + +#ifndef UDATA_DECL +#error "this file is not meant to be compiled directly" +#endif + +/* + * Quicksort algorithm. + * Written by Douglas C. Schmidt (schmidt@ics.uci.edu). + */ + +/* + * If you consider tuning this algorithm, you should consult first: + * Engineering a sort function; Jon Bentley and M. Douglas McIlroy; + * Software - Practice and Experience; Vol. 23 (11), 1249-1265, 1993. + */ + +/* Conditional item swap */ +#define CSWAP(a, b, s) G_STMT_START { \ + if G_LIKELY((a) != (b)) \ + SWAP((a), (b), (s)); \ +} G_STMT_END + + +/* + * Discontinue quicksort algorithm when partition gets below this size. + * 4 was a particular magic number chosen to work best on a Sun 4/260. + * 7 seems to be working well on Intel CPUs. + */ +#define MAX_THRESH 7 + +/* + * Use carefully-chosen median insted of median-of-3 when there are more + * items in the partition than this minimum. + */ +#define MIN_MEDIAN 64 + +/* + * Threshold on the amount of items we swap in a partition to guide us in + * deciding whether it is almost sorted and insersort would be more efficient + * than quicksort to complete the sorting. + */ +#define SWAP_THRESH 1 + +/** + * Threshold for insertsort() to bail out when it is about to move more than + * that many times the amount of bytes in the partition being sorted, for + * ones larger than MAX_THRESH items. + */ +#define INSERT_THRESH 2 /* Experiments showed 2 is a good compromise */ + +/* Stack node declarations used to store unfulfilled partition obligations. */ +typedef struct { + char *lo; + char *hi; +} stack_node; + +/* + * The next 4 #defines implement a very fast in-line stack abstraction. + * + * The stack needs log (total_elements) entries (we could even subtract + * log(MAX_THRESH)). Since total_elements has type size_t, we get as + * upper bound for log (total_elements): + * bits per byte (CHAR_BIT) * sizeof(size_t). + */ +#define STACK_SIZE (CHAR_BIT * sizeof(size_t)) +#define PUSH(low, high) ((void) ((top->lo = (low)), (top->hi = (high)), ++top)) +#define POP(low, high) ((void) (--top, (low = top->lo), (high = top->hi))) +#define STACK_NOT_EMPTY (stack < top) + +/** + * Insertion sort for small partions or ones that are believed already sorted. + * + * When called with ``can_bail_out'' set, detect that we are facing + * pathological input and bail out in the middle if needed. + * + * @return TRUE if OK, FALSE when we decide to bail-out. + */ +#define insertsort CAT2(insertsort,TAG) +static bool G_HOT +insertsort(void *const pbase, size_t lastoff, size_t size, + CMP_FN_T cmp, bool can_bail_out UDATA_DECL) +{ + char *base = pbase; + char *const end = &baselastoff; /* Last item */ + char *tmp = base; + char *thresh; + register char *run; + size_t n; + size_t moved = 0; + + /* + * We're called with a supposedly almost-sorted array. + * + * Find smallest element in the first few locations and place it at the + * array's beginning. This is likely the smallest array element, and the + * operation speeds up insertion sort's inner loop. + * + * However, when we do not scan the whole array, we have no guarantee + * that we're placing the absolute lower item, which means we have + * to guard the main insertion loop with a pointer comparison at each + * step to make sure we do not go before the bottom of the array. + */ + + thresh = ptr_add_offset(pbase, MAX_THRESH * size); + thresh = MIN(thresh, end); + + for (run = tmp + size; run <= thresh; run += size) { + if ((*cmp)(run, tmp UDATA) < 0) + tmp = run; + } + + if G_LIKELY(tmp != base) { + SWAP(tmp, base, size); + moved = size; + } + + /* + * When we scanned the whole array, we have the lowest item at index 0 + * and we can start iterating at the next item. Otherwise, we have to + * start at the base. + */ + + run = base + (thresh == end ? size : 0); + n = (op_aligned(size) && op_aligned(base)) ? size / OPSIZ : 0; + + /* Insertion sort, running from left-hand-side up to right-hand-side */ + + while ((run += size) <= end) { + tmp = run - size; + while (tmp >= base && (*cmp)(run, tmp UDATA) < 0) { + tmp -= size; + } + + tmp += size; + if (tmp != run) { + /* + * If they allow us to bail out, then attempt to detect when we're + * not facing sorted input and run the risk of approaching O(n^2) + * complexity. + * + * In that case, bail out and quicksort() will pick up where + * we left. + * + * The criteria is that we must not move around more than about + * INSERT_THRESH time the size of the arena. + * + * Exception when we reach the last two items: regardless of where + * they will land, the cost now should be less than bailing out and + * resuming quicksort() on the partition, so finish off the sort. + */ + + if G_UNLIKELY(can_bail_out) { + if ( + run > thresh && run < end - size && + moved > INSERT_THRESH * lastoff + ) + return FALSE; /* We bailed out */ + + moved += ptr_diff(run, tmp) + size; + } + + if G_LIKELY(n != 0) { + /* Operates on words */ + op_t *trav = (op_t *) (run + size); + op_t *r = (op_t *) run; + op_t *t = (op_t *) tmp; + + while (--trav >= r) { + op_t c = *trav; + register op_t *hi, *lo; + + for (hi = lo = trav; (lo -= n) >= t; hi = lo) { + *hi = *lo; + } + *hi = c; + } + } else { + /* Operates on bytes */ + char *trav = run + size; + + while (--trav >= run) { + char c = *trav; + register char *hi, *lo; + + for (hi = lo = trav; (lo -= size) >= tmp; hi = lo) { + *hi = *lo; + } + *hi = c; + } + } + } + } + + return TRUE; /* OK, fully sorted */ +} + +/** + * Return position of median among 3 items without re-arranging items. + */ +static inline void * +median_three(void *a, void *b, void *c, CMP_FN_T cmp UDATA_DECL) +{ + return (*cmp)(a, b UDATA) < 0 ? + ((*cmp)(b, c UDATA) < 0 ? b : ((*cmp)(a, c UDATA) < 0 ? c : a )) : + ((*cmp)(b, c UDATA) > 0 ? b : ((*cmp)(a, c UDATA) < 0 ? a : c )); +} + +/* + * Order size using quicksort. This implementation incorporates + * four optimizations discussed in Sedgewick: + * + * 1. Non-recursive, using an explicit stack of pointer that store the + * next array partition to sort. To save time, this maximum amount + * of space required to store an array of SIZE_MAX is allocated on the + * stack. Assuming a 32-bit (64 bit) integer for size_t, this needs + * only 32 * sizeof(stack_node) == 256 bytes (for 64 bit: 1024 bytes). + * Pretty cheap, actually. + * + * 2. Chose the pivot element using a median-of-three decision tree. + * This reduces the probability of selecting a bad pivot value and + * eliminates certain extraneous comparisons. + * + * 3. Only quicksorts TOTAL_ELEMS / MAX_THRESH partitions, leaving + * insertion sort to order the MAX_THRESH items within each partition. + * This is a big win, since insertion sort is faster for small, mostly + * sorted array segments. + * + * 4. The larger of the two sub-partitions is always pushed onto the + * stack first, with the algorithm then concentrating on the + * smaller partition. This *guarantees* no more than log (total_elems) + * stack size is needed (actually O(1) in this case)! + */ + +#define quicksort CAT2(quicksort,TAG) +static void G_HOT +quicksort(void *const pbase, size_t total_elems, size_t size, + CMP_FN_T cmp UDATA_DECL) +{ + char *base = pbase; + const size_t max_thresh = MAX_THRESH * size; + bool careful = FALSE; + + if G_UNLIKELY(total_elems == 0) + return; /* Avoid lossage with unsigned arithmetic below. */ + + if (total_elems > MAX_THRESH) { + char *lo = base; + char *hi = &losize * (total_elems - 1); + stack_node stackSTACK_SIZE; + stack_node *top = stack + 1; + + while (STACK_NOT_EMPTY) { + register char *left; + register char *right; + size_t items = (hi - lo) / size; + char *mid = lo + size * (items >> 1); + size_t swapped; + char *xlo; + size_t lsize, rsize; + + /* + * If there are more than MIN_MEDIAN items, it pays to spend + * more time selecting a good pivot by doing a median over + * several items. + * --RAM, 2012-03-02 + */ + + if (careful && items > MIN_MEDIAN) { + size_t d = size * (items >> 3); + char *plo, *phi; + + plo = median_three(lo, lo + d, lo + 2*d, cmp UDATA); + mid = median_three(mid - d, mid, mid + d, cmp UDATA); + phi = median_three(hi - 2*d, hi - d, hi, cmp UDATA); + mid = median_three(plo, mid, phi, cmp UDATA); + } else { + mid = median_three(lo, mid, hi, cmp UDATA); + } + + CSWAP(mid, lo, size); /* Put pivot at the base */ + left = xlo = lo + size; /* Since pivot is at the base now */ + right = hi; + + swapped = 0; /* Detect almost-sorted partition --RAM */ + + /* + * Here's the famous ``collapse the walls'' section of quicksort. + * Gotta like those tight inner loops! They are the main reason + * that this algorithm runs much faster than others. + */ + + while (left < right) { + int c; + + /* + * Changes by Raphael Manfredi to avoid O(n^2) behaviour + * when all items are identical. + */ + + while ((c = (*cmp)(left, lo UDATA)) <= 0) { + if G_UNLIKELY(0 == c) { + CSWAP(left, xlo, size); + xlo += size; + } + left += size; + if G_UNLIKELY(left >= right) + goto partitioned; + } + + /* + * No need to check for "left < right" in this loop since we + * shall stop when we reach the pivot, at the far left. + */ + + while ((*cmp)(lo, right UDATA) < 0) + right -= size; + + if G_LIKELY(left < right) { + SWAP(left, right, size); + swapped++; + left += size; + right -= size; + } + } + + partitioned: + /* + * If all the items where equal to the pivot, we're done. + */ + + if G_UNLIKELY(xlo == hi) { + POP(lo, hi); /* Done with partition */ + careful = FALSE; + continue; + }; + + /* + * Move back items equal to the pivot at the middle of the + * partition. + */ + + lsize = ptr_diff(left, xlo); + rsize = ptr_diff(hi, right); + + if (!careful && ((lsize >> 2) > rsize || (rsize >> 2) > lsize)) + careful = TRUE; + + { + size_t equal = ptr_diff(xlo, lo); /* Equal to pivot */ + size_t n = MIN(equal, lsize); + if (n != 0) + SWAP(lo, left - n, n); + } + + /* + * Optimization by Raphael Manfredi: if we only swapped a few + * items in the partition, use insertsort() on it and do not + * recurse. This greatly accelerates quicksort() on already + * sorted arrays. + * + * However, because we may have guessed wrong, insertsort() monitors + * pathological cases and can bail out (when we hand out more than + * MAX_THRESH items). Hence we must monitor the result and continue + * as if we hadn't called insertsort() when it returns a non-NULL + * pointer. + * + * This works because insertsort() processes its input from left + * to right and therefore will not disrupt the "left/right" + * partitionning with respect to the pivot value and the already + * computed left and right boundaries. + */ + + if G_UNLIKELY(swapped <= SWAP_THRESH) { + bool ok; + + /* + * Switch to insertsort() to completely sort this partition. + * + * Although we could call insertsort() on the whole partition, + * we want to limit the size in case it has to bail out. + * This also limits the amount of data to move around, at + * the cost of extra setup. + */ + + ok = lsize - size > max_thresh ? + insertsort(lo, lsize - size, size, cmp, TRUE UDATA) : TRUE; + + if (ok) { + ok = rsize > max_thresh ? + insertsort(hi - rsize, rsize, size, cmp, TRUE UDATA) : + TRUE; + if (ok) { + POP(lo, hi); /* Done with partition */ + continue; + } + lsize = size; /* Mark left as fully sorted */ + } + + /* Continue as if we hadn't called insertsort() */ + } + + /* + * Set up pointers for next iteration. First determine whether + * left and right partitions are below the threshold size. If so, + * insertsort one or both. Otherwise, push the larger partition's + * bounds on the stack and continue quicksorting the smaller one. + * + * Change by Raphael Manfredi: immediately do the insertsort of + * the small partitions instead of waiting for the end of quicksort + * to benefit from the locality of reference, at the expense of + * more setup costs. + */ + + if G_UNLIKELY(lsize - size <= max_thresh) { + if G_UNLIKELY(rsize <= max_thresh) { + POP(lo, hi); /* Ignore both small partitions. */ + } else + lo = hi - rsize; /* Ignore small left partition. */ + } else if G_UNLIKELY(rsize <= max_thresh) { + hi = &lolsize - size; /* Ignore small right partition. */ + } else if (lsize > rsize) { + /* Push larger left partition indices. */ + PUSH(lo, &lolsize - size); + lo = hi - rsize; + } else { + /* Push larger right partition indices. */ + PUSH (hi - rsize, hi); + hi = &lolsize - size; + } + } + } + + /* + * Always run insertsort() to finish sorting the whole array since we + * leave small partitions of less than MAX_THRESH items unsorted. + */ + + insertsort(pbase, (total_elems - 1) * size, size, cmp, FALSE UDATA); +} + +/* + * An alternative to qsort(), with an identical interface. + * Written by Mike Haertel, September 1988. + */ + +#define msort_with_tmp CAT2(msort_with_tmp,TAG) +static void +msort_with_tmp(void *b, size_t n, size_t s, + CMP_FN_T cmp, char *t UDATA_DECL) +{ + char *tmp; + char *b1, *b2; + size_t n1, n2; + + if (n <= 1) + return; + + n1 = n / 2; + n2 = n - n1; + b1 = b; + b2 = ptr_add_offset(b, n1 * s); + + msort_with_tmp(b1, n1, s, cmp, t UDATA); + msort_with_tmp(b2, n2, s, cmp, t UDATA); + + tmp = t; + + if (s == OPSIZ && op_aligned(b1)) { + op_t *otmp = (op_t *) tmp; + op_t *ob1 = (op_t *) b1; + op_t *ob2 = (op_t *) b2; + + /* We are operating on aligned words. Use direct word stores. */ + + while (n1 > 0 && n2 > 0) { + if ((*cmp)(ob1, ob2 UDATA) <= 0) { + --n1; + *otmp++ = *ob1++; + } else { + --n2; + *otmp++ = *ob2++; + } + } + + tmp = (char *) otmp; + b1 = (char *) ob1; + b2 = (char *) ob2; + } else { + while (n1 > 0 && n2 > 0) { + if ((*cmp) (b1, b2 UDATA) <= 0) { + tmp = mempcpy(tmp, b1, s); + b1 += s; + --n1; + } else { + tmp = mempcpy(tmp, b2, s); + b2 += s; + --n2; + } + } + } + + if (n1 > 0) + memcpy(tmp, b1, n1 * s); + + memcpy(b, t, (n - n2) * s); +} + +/** + * Sort array with ``n'' elements of size ``s''. The base ``b'' points to + * the start of the array. + * + * This routine allocates memory on the stack or through the VMM layer and + * prefers to use mergesort, reserving quicksort to cases where there would + * be too much memory required for the mergesort. + * + * The contents are sorted in ascending order, as defined by the comparison + * function ``cmp''. + */ +void +XSORT(void *b, size_t n, size_t s, CMP_FN_T cmp UDATA_DECL) +{ + const size_t size = size_saturate_mult(n, s); + + g_assert(b != NULL); + g_assert(cmp != NULL); + g_assert(size_is_non_negative(n)); + g_assert(size_is_positive(s)); + + + if (size < 1024) { + /* The temporary array is small, so put it on the stack */ + void *buf = alloca(size); + + msort_with_tmp(b, n, s, cmp, buf UDATA); + } else { + static uint64 memsize; + + /* + * We should avoid allocating too much memory since this might + * have to be backed up by swap space. + */ + + if G_UNLIKELY(0 == memsize) { + memsize = getphysmemsize(); + if (0 == memsize) + memsize = (uint64) -1; /* Assume plenty! */ + } + + /* If the memory requirements are too high don't allocate memory */ + if ((uint64) size > memsize / 4) { + quicksort(b, n, s, cmp UDATA); + } else { + char *tmp; + + /* It's somewhat large, so alloc it through VMM */ + + tmp = vmm_alloc(size); + msort_with_tmp(b, n, s, cmp, tmp UDATA); + vmm_free(tmp, size); + } + } +} + +/** + * Sort array in-place (no memory allocated) with ``n'' elements of size ``s''. + * The base ``b'' points to the start of the array. + * + * The contents are sorted in ascending order, as defined by the comparison + * function ``cmp''. + */ +void +XQSORT(void *b, size_t n, size_t s, CMP_FN_T cmp UDATA_DECL) +{ + quicksort(b, n, s, cmp UDATA); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/xsort.c
Added
@@ -0,0 +1,66 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Sorting routines that do not call zalloc() or xmalloc(). + * + * @author Raphael Manfredi + * @date 2014 + */ + +#include "common.h" + +#include "xsort.h" +#include "getphysmemsize.h" +#include "mempcpy.h" +#include "op.h" +#include "unsigned.h" +#include "vmm.h" + +#include "override.h" /* Must be the last header included */ + +/* + * Configure xsort-gen.c for traditional sorting (cmp_fn_t sorting callback). + */ + +#define UDATA +#define UDATA_DECL +#define CMP_FN_T cmp_fn_t +#define XSORT xsort +#define XQSORT xqsort +#define TAG _plain + +#include "xsort-gen.c" + +/* + * These defines are there only for tags. + * Routines are defined in xsort-gen.c, as included above. + */ + +#define xsort XSORT +#define xqsort XQSORT + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/xsort.h
Added
@@ -0,0 +1,46 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Sort routine that does not rely on xmalloc() nor zalloc(), only on VMM. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _xsort_h_ +#define _xsort_h_ + +/* + * Public interface. + */ + +void xsort(void *b, size_t n, size_t s, cmp_fn_t cmp); +void xqsort(void *b, size_t n, size_t s, cmp_fn_t cmp); + +#endif /* _xsort_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/xsort_data.c
Added
@@ -0,0 +1,67 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Sorting routines that do not call zalloc() or xmalloc() but whose sorting + * callback takes an additional parameter. + * + * @author Raphael Manfredi + * @date 2014 + */ + +#include "common.h" + +#include "xsort_data.h" +#include "getphysmemsize.h" +#include "mempcpy.h" +#include "op.h" +#include "unsigned.h" +#include "vmm.h" + +#include "override.h" /* Must be the last header included */ + +/* + * Configure xsort-gen.c for extended sorting (cmp_data_fn_t sorting callback). + */ + +#define UDATA , udata +#define UDATA_DECL , void *udata +#define CMP_FN_T cmp_data_fn_t +#define XSORT xsort_with_data +#define XQSORT xqsort_with_data +#define TAG _with_data + +#include "xsort-gen.c" + +/* + * These defines are there only for tags. + * Routines are defined in xsort-gen.c, as included above. + */ + +#define xsort_with_data XSORT +#define xqsort_with_data XQSORT + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/xsort_data.h
Added
@@ -0,0 +1,46 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Sort routine that does not rely on xmalloc() nor zalloc(), only on VMM. + * + * @author Raphael Manfredi + * @date 2014 + */ + +#ifndef _xsort_data_h_ +#define _xsort_data_h_ + +/* + * Public interface. + */ + +void xsort_with_data(void *b, size_t n, size_t s, cmp_data_fn_t cmp, void *d); +void xqsort_with_data(void *b, size_t n, size_t s, cmp_data_fn_t cmp, void *d); + +#endif /* _xsort_data_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/xxtea.c
Added
@@ -0,0 +1,176 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Corrected Block TEA (Tiny Encryption Algorithm), also known as XXTEA. + * + * @author Raphael Manfredi + * @date 2013 + * + * Based on public domain code by David Wheeler and Roger Needham. + * See: http://en.wikipedia.org/wiki/XXTEA + */ + +#include "common.h" + +#include "xxtea.h" + +#include "random.h" /* For tests only */ +#include "unsigned.h" + +#include "override.h" /* Must be the last header included */ + +#define XXTEA_CONSTANT 0x9e3779b9 /* A key schedule constant */ + +#define XXTEA_MX \ + (((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4)) ^ \ + ((sum ^ y) + (key->v(p & 3) ^ e ^ z))) + +/** + * Encrypt a block with the supplied key. + * + * @param key the encryption key + * @param out where encrypted data go + * @param in start of data to be encrypted (at least 8 bytes) + * @param len length in bytes of data to be encrypted (multiple of 4 bytes) + */ +void G_HOT +xxtea_encrypt(const xxtea_key_t *key, uint32 *out, const void *in, size_t len) +{ + uint32 y, z, sum, *v = out; + unsigned p, rounds, e, n; + + g_assert(size_is_positive(len)); + g_assert(0 == (len & 3)); /* Multiple of 4 bytes */ + g_assert(len >= 8); /* And at least 8 bytes */ + + memmove(out, in, len); /* Input and output may overlap */ + n = len >> 2; + + rounds = 6 + 52 / n; + sum = 0; + z = vn - 1; + do { + sum += XXTEA_CONSTANT; + e = (sum >> 2) & 3; + for (p = 0; p < n - 1; p++) { + y = vp + 1; + z = vp += XXTEA_MX; + } + y = v0; + z = vn - 1 += XXTEA_MX; + } while (--rounds); +} + +/** + * Decrypt a block with the supplied key. + * + * @param key the decryption key + * @param out where decrypted data go + * @param in start of data to be decrypted (at least 8 bytes) + * @param len length in bytes of data to be decrypted (multiple of 4 bytes) + * + */ +void G_HOT +xxtea_decrypt(const xxtea_key_t *key, uint32 *out, const void *in, size_t len) +{ + uint32 y, z, sum, *v = out; + unsigned p, rounds, e, n; + + g_assert(size_is_positive(len)); + g_assert(0 == (len & 3)); /* Multiple of 4 bytes */ + g_assert(len >= 8); /* And at least 8 bytes */ + + memmove(out, in, len); /* Input and output may overlap */ + n = len >> 2; + + rounds = 6 + 52 / n; + sum = rounds * XXTEA_CONSTANT; + y = v0; + do { + e = (sum >> 2) & 3; + for (p = n - 1; p > 0; p--) { + z = vp - 1; + y = vp -= XXTEA_MX; + } + z = vn - 1; + y = v0 -= XXTEA_MX; + } while (0 != (sum -= XXTEA_CONSTANT)); +} + +/** + * Test implementation. + */ +void G_COLD +xxtea_test(void) +{ + xxtea_key_t key; + uint32 value2; + uint32 encrypted2; + uint32 decrypted2; + int i; + uint32 in8; + uint32 out8; + uint32 recovered8; + + STATIC_ASSERT(sizeof(key.v) == XXTEA_KEY_SIZE); + + for (i = 0; i < 10; i++) { + int j; + bool randomized = FALSE; + + for (j = 0; j < 10; j++) { + random_bytes(key.v, XXTEA_KEY_SIZE); + random_bytes(&value, sizeof value); + + xxtea_encrypt(&key, encrypted, value, sizeof value); + if (0 != memcmp(value, encrypted, sizeof value)) { + randomized = TRUE; + break; + } + } + + if (!randomized) + g_error("no luck with random numbers in %s()", G_STRFUNC); + + xxtea_decrypt(&key, decrypted, encrypted, sizeof encrypted); + if (0 != memcmp(value, decrypted, sizeof value)) + g_error("XXTEA implementation tests FAILED"); + } + + STATIC_ASSERT(sizeof in == sizeof out); + STATIC_ASSERT(sizeof in == sizeof recovered); + + random_bytes(key.v, XXTEA_KEY_SIZE); + random_bytes(in, sizeof in); + xxtea_encrypt(&key, out, in, sizeof in); + xxtea_decrypt(&key, recovered, out, sizeof out); + + if (0 != memcmp(in, recovered, sizeof in)) + g_error("XXTEA implementation tests FAILED"); +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/lib/xxtea.h
Added
@@ -0,0 +1,58 @@ +/* + * Copyright (c) 2013, 2015 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup lib + * @file + * + * Corrected Block TEA (Tiny Encryption Algorithm), also known as XXTEA. + * + * @author Raphael Manfredi + * @date 2013, 2015 + */ + +#ifndef _xxtea_h_ +#define _xxtea_h_ + +#define XXTEA_KEY_SIZE 16 /* Size of the XXTEA key, in bytes */ +#define XXTEA_BLOCK_SIZE 8 /* Minimal size of XXTEA blocks, in bytes */ + +/** + * A Corrected Block TEA key is 128-bit wide. + */ +typedef struct xxtea_key { + uint32 vXXTEA_KEY_SIZE / sizeof(uint32); +} xxtea_key_t; + +/* + * Public interface. + */ + +void xxtea_encrypt(const xxtea_key_t *, uint32 *, const void *, size_t); +void xxtea_decrypt(const xxtea_key_t *, uint32 *, const void *, size_t); + +void xxtea_test(void); + +#endif /* _xxtea_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/zalloc.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/zalloc.c
Changed
@@ -49,9 +49,6 @@ * Moreover, periodic calls to the zone gc are needed to collect unused chunks * when peak allocations are infrequent or occur at random. * - * Because xmalloc() uses zalloc() indirectly through walloc(), we must make - * the code thread-safe. - * * @author Raphael Manfredi * @date 2002-2003 * @date 2009-2011 @@ -76,30 +73,55 @@ #define ZALLOC_SAFETY_ASSERT /**< Enables costly assertions */ #endif +/** + * Turning ZONE_SAFE allows to tag each allocated block to detect duplicate + * freeing of blocks and verify that we always return blocks to proper zones. + * + * There is very little performance impact, however this requires two extra + * pointers per allocated block. + */ +#if 0 +#define ZONE_SAFE +#endif + +/** + * Turning ZONE_FRAMES allows to tag each allocated and freed block with + * the corresponding allocation and freeing stack frame. + */ +#if 0 +#define ZONE_FRAMES +#endif + #include "zalloc.h" + +#include "array_util.h" #include "atomic.h" #include "dump_options.h" +#include "eslist.h" +#include "evq.h" +#include "hashing.h" /* For integer_hash() and friends */ #include "hashtable.h" +#include "leak.h" #include "log.h" /* For statistics logging */ #include "malloc.h" /* For MALLOC_FRAMES */ #include "memusage.h" #include "misc.h" /* For short_filename() */ +#include "once.h" +#include "pslist.h" +#include "sha1.h" #include "spinlock.h" #include "stacktrace.h" +#include "str.h" #include "stringify.h" +#include "thread.h" /* For thread_small_id() */ #include "tm.h" #include "unsigned.h" #include "vmm.h" #include "xmalloc.h" - -#ifdef MALLOC_TIME -#include "glib-missing.h" /* For gm_snprintf() */ -#endif +#include "xsort.h" #include "override.h" /* Must be the last header included */ -#define equiv(p,q) (!(p) == !(q)) - #define zalloc_debugging(lvl) G_UNLIKELY(zalloc_debug > (lvl)) #ifdef ZALLOC_SAFETY_ASSERT @@ -136,14 +158,13 @@ * contains sorted "struct subzinfo" entries, sorted by arena base address. */ struct zone_gc { - spinlock_t lock; /**< Thread-safe lock */ struct subzinfo *zg_subzinfo; /**< Big chunk containing subzinfos */ time_t zg_start; /**< Time at which GC was started */ unsigned zg_zone_freed; /**< Total amount of zones freed by GC */ unsigned zg_zone_defragmented; /**< Total amount of zones defragmented */ unsigned zg_zones; /**< Amount of zones in zg_subzinfo */ unsigned zg_free; /**< First subzinfo with free blocks */ - guint32 zg_flags; /**< GC flags */ + uint32 zg_flags; /**< GC flags */ }; /** @@ -187,6 +208,9 @@ unsigned zn_blocks; /**< Total amount of blocks in zone */ unsigned zn_subzones; /**< Amount of subzones */ unsigned zn_oversized; /**< For GC: amount of times we see oversizing */ + unsigned zn_stid; /**< Small thread-ID for private zones */ + uint embedded:1; /**< Zone descriptor is head of first arena */ + uint private:1; /**< Is thread-private: no locking needed */ }; static inline void @@ -196,12 +220,12 @@ g_assert(ZONE_MAGIC == zn->zn_magic); } -static hash_table_t *zt; /**< Keeps size (rounded up) -> zone */ -static guint32 zalloc_debug; /**< Debug level */ -static gboolean zalloc_always_gc; /**< Whether zones should stay in GC mode */ -static gboolean addr_grows_upwards; /**< Whether newer VM addresses increase */ -static gboolean zalloc_closing; /**< Whether zclose() was called */ -static gboolean zalloc_memusage_ok; /**< Whether we can enable memusage stats */ +static hash_table_t *zt; /**< Keeps size (rounded up) -> zone */ +static uint32 zalloc_debug; /**< Debug level */ +static bool zalloc_always_gc; /**< Whether zones should stay in GC mode */ +static bool addr_grows_upwards; /**< Whether newer VM addresses increase */ +static bool zalloc_closing; /**< Whether zclose() was called */ +static bool zalloc_memusage_ok; /**< Whether we can enable memusage stats */ #ifdef MALLOC_FRAMES static hash_table_t *zalloc_frames; /**< Tracks allocation frame atoms */ @@ -210,9 +234,12 @@ static hash_table_t *not_leaking; static hash_table_t *alloc_used_to_real; static hash_table_t *alloc_real_to_used; +static spinlock_t zleak_lock = SPINLOCK_INIT; +#define ZLEAK_LOCK spinlock(&zleak_lock) +#define ZLEAK_UNLOCK spinunlock(&zleak_lock) #endif #ifdef TRACK_ZALLOC -static void *z_leakset; +static leak_set_t *z_leakset; #endif /* @@ -227,7 +254,9 @@ * +---------------------+ <---- OVH_TIME_OFFSET ^ * | time_t atime | MALLOC_TIME v OVH_TIME_LEN * +---------------------+ <---- OVH_FRAME_OFFSET ^ - * | struct frame *alloc | MALLOC_FRAMES v OVH_FRAME_LEN + * | struct frame *alloc | MALLOC_FRAMES | + * | or | or | OVH_FRAME_LEN + * | struct stackatom *a | ZONE_FRAMES v * +---------------------+ <---- returned alocation pointer * | ........ | User data * : ........ : @@ -275,10 +304,17 @@ #define OVH_TIME_LEN 0 #endif +#if defined(MALLOC_FRAMES) && defined(ZONE_FRAMES) +#error "MALLOC_FRAMES and ZONE_FRAMES are mutually exclusive" +#endif + #define OVH_FRAME_OFFSET (OVH_TIME_OFFSET + OVH_TIME_LEN) -#ifdef MALLOC_FRAMES +#if defined(MALLOC_FRAMES) #define OVH_FRAME_LEN sizeof(struct frame *) #define INVALID_FRAME_PTR ((struct frame *) 0xdeadbeef) +#elif defined(ZONE_FRAMES) +#define OVH_FRAME_LEN sizeof(struct stackatom *) +#define INVALID_FRAME_PTR ((struct stackatom *) 0xdeadbeef) #else #define OVH_FRAME_LEN 0 #endif @@ -296,34 +332,75 @@ /** * Internal statistics collected. - */ -/* FIXME -- need to make stats updates thread-safe --RAM, 2011-12-28 */ -static struct { - guint64 allocations; /**< Total amount of allocations */ - guint64 freeings; /**< Total amount of freeings */ - guint64 allocations_gc; /**< Subset of allocations in GC mode */ - guint64 freeings_gc; /**< Subset of freeings in GC mode */ - guint64 subzones_allocated; /**< Total amount of subzone creations */ - guint64 subzones_allocated_pages; /**< Total pages used by subzones */ - guint64 subzones_freed; /**< Total amount of subzone freeings */ - guint64 subzones_freed_pages; /**< Total pages freed in subzones */ - guint64 zmove_attempts; /**< Total attempts to move blocks */ - guint64 zmove_attempts_gc; /**< Subset of moves attempted in GC mode */ - guint64 zmove_successful_gc; /**< Subset of successful moves */ - guint64 zgc_zones_freed; /**< Total amount of zones freed by GC */ - guint64 zgc_zones_defragmented; /**< Total amount of zones defragmented */ - guint64 zgc_fragments_freed; /**< Total fragment zones freed */ - guint64 zgc_free_quota_reached; /**< Subzone freeing quota reached */ - guint64 zgc_last_zone_kept; /**< First zone kept to avoid depletion */ - guint64 zgc_throttled; /**< Throttled zgc() runs */ - guint64 zgc_runs; /**< Allowed zgc() runs */ - guint64 zgc_zone_scans; /**< Calls to zgc_scan() */ - guint64 zgc_scan_freed; /**< Zones freed during zgc_scan() */ - guint64 zgc_excess_zones_freed; /**< Zones freed during zn_shrink() */ - guint64 zgc_shrinked; /**< Amount of zn_shrink() calls */ + * + * The AU64() fields are atomically updated (without taking the stats lock). + */ +static struct zstats { + uint64 allocations; /**< Total amount of allocations */ + uint64 freeings; /**< Total amount of freeings */ + uint64 freeings_list; /**< Total amount of freeings via list */ + uint64 freeings_list_blocks; /**< Amount of blocks freed via list */ + AU64(allocations_gc); /**< Subset of allocations in GC mode */ + AU64(freeings_gc); /**< Subset of freeings in GC mode */ + uint64 subzones_allocated; /**< Total amount of subzone creations */ + uint64 subzones_allocated_pages; /**< Total pages used by subzones */ + uint64 subzones_freed; /**< Total amount of subzone freeings */ + uint64 subzones_freed_pages; /**< Total pages freed in subzones */ + AU64(zmove_attempts); /**< Total attempts to move blocks */ + AU64(zmove_attempts_gc); /**< Subset of moves attempted in GC mode */ + AU64(zmove_successful_gc); /**< Subset of successful moves */ + AU64(zgc_zones_freed); /**< Total amount of zones freed by GC */ + AU64(zgc_zones_defragmented); /**< Total amount of zones defragmented */ + AU64(zgc_fragments_freed); /**< Total fragment zones freed */ + AU64(zgc_free_quota_reached); /**< Subzone freeing quota reached */ + AU64(zgc_last_zone_kept); /**< First zone kept to avoid depletion */ + AU64(zgc_runs); /**< Allowed zgc() runs */ + AU64(zgc_zone_scans); /**< Calls to zgc_scan() */ + AU64(zgc_scan_freed); /**< Zones freed during zgc_scan() */ + uint64 zgc_excess_zones_freed; /**< Zones freed during zn_shrink() */ + uint64 zgc_shrinked; /**< Amount of zn_shrink() calls */ size_t user_memory; /**< Current user memory allocated */ size_t user_blocks; /**< Current amount of user blocks */ + /* Counter to prevent digest from being the same twice in a row */ + AU64(zalloc_stats_digest); } zstats; +static spinlock_t zstats_slk = SPINLOCK_INIT; + +#define ZSTATS_LOCK spinlock_hidden(&zstats_slk) +#define ZSTATS_UNLOCK spinunlock_hidden(&zstats_slk) + +#define ZSTATS_INCX(x) AU64_INC(&zstats.x) + +/** + * @return (physical) block size for a given zone. + */ +size_t +zone_blocksize(const zone_t *zone) +{ + zone_check(zone); + + return zone->zn_size; +} + +/** + * @return (logical, user-level) block size for a given zone. + */ +size_t +zone_size(const zone_t *zone) +{ + zone_check(zone); + + return zone->zn_size - OVH_LENGTH; +} + +/** + * @return the block overhead size, in bytes (normally 0, unless debugging). + */ +size_t +zalloc_overhead(void) +{ + return OVH_LENGTH; +} /* Under REMAP_ZALLOC, map zalloc() and zfree() to g_malloc() and g_free() */ @@ -342,7 +419,7 @@ } void -zgc(gboolean overloaded) +zgc(bool overloaded) { (void) overloaded; } @@ -390,7 +467,7 @@ g_assert(NULL == zn->zn_rang); - zn->zn_rang = xpmalloc(zn->zn_subzones * sizeof zn->zn_rang0); + XMALLOC_ARRAY(zn->zn_rang, zn->zn_subzones); for (sz = &zn->zn_arena; sz; sz = sz->sz_next) { g_assert(i < zn->zn_subzones); @@ -400,14 +477,14 @@ g_assert(i == zn->zn_subzones); - qsort(zn->zn_rang, zn->zn_subzones, sizeof zn->zn_rang0, zrange_cmp); + xqsort(zn->zn_rang, zn->zn_subzones, sizeof zn->zn_rang0, zrange_cmp); } /** * Validates the block address within a zone, to make sure it lies at an * exact multiple of the zone's block size within its subzone.. */ -static gboolean +static bool zvalid(const zone_t *zone, const zrange_t *range, const void *blk) { size_t boff = ptr_diff(blk, range->start); @@ -421,6 +498,33 @@ } /** + * Validates that a GC subzinfo has proper szi_free and szi_free_cnt. + */ +static bool +zgc_subzinfo_valid(const zone_t *zone, const struct subzinfo *szi) +{ + size_t n; + char **p; + + g_assert((0 == szi->szi_free_cnt) == (NULL == szi->szi_free)); + + n = szi->szi_free_cnt; + p = szi->szi_free; + + g_assert(n <= zone->zn_hint); + + while (n-- != 0) { + g_assert(ptr_cmp(p, szi->szi_base) >= 0 && + ptr_cmp(p, szi->szi_end) < 0); + p = (char **) *p; + } + + g_assert(NULL == p); + + return TRUE; +} + +/** * Check that block address falls within the set of addresses belonging to * the zone. * @@ -432,11 +536,11 @@ * @attention due to the naive alogorithm used here, the runtime penalty is * astonishing. Almost 60% of the CPU time ends up being spent there! */ -static G_GNUC_HOT gboolean +static bool G_HOT zbelongs(const zone_t *zone, const void *blk) { if G_UNLIKELY(NULL == zone->zn_rang) - zrange_init(deconstify_gpointer(zone)); + zrange_init(deconstify_pointer(zone)); #define GET_ITEM(i) (&zone->zn_rangi) #define FOUND(i) return zvalid(zone, &zone->zn_rangi, blk) @@ -444,9 +548,18 @@ BINARY_SEARCH(const zrange_t *, blk, zone->zn_subzones, zrange_falls_in, GET_ITEM, FOUND); + s_rawwarn("%s(): block %p (%zu user bytes) not belonging to %zu-byte zone", + G_STRFUNC, blk, zone->zn_size - OVH_LENGTH, zone->zn_size); + return FALSE; } +static inline bool +zbelongs_uptr(const zone_t *zone, const void *p) +{ + return zbelongs(zone, const_ptr_add_offset(p, -OVH_LENGTH)); +} + /** * Clear sorted range array each time there is a subzone update. * @@ -457,7 +570,7 @@ zrange_clear(const zone_t *zone) { if (zone->zn_rang != NULL) { - zone_t *zw = deconstify_gpointer(zone); + zone_t *zw = deconstify_pointer(zone); xfree(zw->zn_rang); zw->zn_rang = NULL; } @@ -468,10 +581,86 @@ #endif /* ZALLOC_SAFETY_ASSERT */ +#if defined(ZONE_SAFE) && defined(ZONE_FRAMES) + +#define ZFREE_FRAME 0x1 /* Trailing stackatom pointer marking */ + +static inline struct stackatom * +zframe_get_pointer(const struct stackatom *a) +{ + return ulong_to_pointer(pointer_to_ulong(a) & ~ZFREE_FRAME); +} + +static inline bool +zframe_is_free_frame(const struct stackatom *a) +{ + return ZFREE_FRAME == (pointer_to_ulong(a) & ZFREE_FRAME); +} + +static inline struct stackatom * +zframe_mark_pointer(const struct stackatom *a) +{ + return ulong_to_pointer(pointer_to_ulong(a) | ZFREE_FRAME); +} + +/** + * Dump stackframe held in the block. + */ +static void +zframe_dump(const void *ptr, const char *msg) +{ + struct stackatom const * const *p = + const_ptr_add_offset(ptr, -OVH_LENGTH + OVH_FRAME_OFFSET); + + s_warning("ZALLOC %p %s; %s frame is:", ptr, msg, + zframe_is_free_frame(*p) ? "free" : "alloc"); + + if (INVALID_FRAME_PTR == *p) { + s_warning("%s(): invalid frame pointer, cannot dump stack frame", + G_STRFUNC); + } else { + const struct stackatom *a = zframe_get_pointer(*p); + stacktrace_atom_decorate(stderr, a, + STACKTRACE_F_ORIGIN | STACKTRACE_F_SOURCE); + } +} +#else /* !ZONE_SAFE || !ZONE_FRAMES */ + +#define zframe_dump(p, msg) + +#endif /* ZONE_SAFE && ZONE_FRAMES */ + +/** + * Hash a zone structure on size and small thread ID. + */ +static unsigned +zone_hash(const void *key) +{ + const zone_t *z = key; + uint32 h; + + h = integer_hash_fast(z->zn_size) + u16_hash(z->zn_stid) - + z->private * GOLDEN_RATIO_32; + + return hashing_mix32(h); +} + +/** + * Compare two zone structures on size and small thread ID. + */ +static bool +zone_eq(const void *a, const void *b) +{ + const zone_t *za = a, *zb = b; + + return za->zn_size == zb->zn_size && za->zn_stid == zb->zn_stid && + za->private == zb->private; +} + /** * Should we always put the zone in GC mode? */ -static inline ALWAYS_INLINE gboolean +static inline ALWAYS_INLINE bool zgc_always(const zone_t *zone) { return zalloc_always_gc || zone->zn_size >= WALLOC_GC_THRESH; @@ -509,27 +698,88 @@ } blk = ptr_add_offset(blk, OVH_FRAME_LEN); #endif +#ifdef ZONE_FRAMES + { + struct stackatom const **p = (struct stackatom const **) blk; + struct stacktrace t; + + stacktrace_get_offset(&t, 1); /* Remove ourselves from trace */ + *p = stacktrace_get_atom(&t); + g_assert(!zframe_is_free_frame(*p)); + } + blk = ptr_add_offset(blk, OVH_FRAME_LEN); +#endif return blk; } /** + * Lock zone. + * + * All locking of public zones is done with normal spinlocks, which are + * not hidden and therefore need to be accounted for in the thread. + * + * Although this increases the lock cost, it also provides a safer zalloc() + * implementation and makes the routines taking these locks proper "suspension" + * points. In case there is a crash or a fork() call, this is an important + * property that greatly outweighs the additional cost, which then becomes + * a necessary cost and not just overhead. + * + * Don't inline to get proper lock location with SPINLOCK_DEBUG + */ +#define zlock(zone) G_STMT_START { \ + if G_UNLIKELY(zone->private) \ + spinlock_direct(&zone->lock); \ + else \ + spinlock(&zone->lock); \ +} G_STMT_END + +/** + * Try to lock zone. + */ +static bool +zlock_try(zone_t *zone) +{ + if G_UNLIKELY(zone->private) { + if (thread_small_id() == zone->zn_stid) { + spinlock_direct(&zone->lock); + return TRUE; + } + return FALSE; + } else { + return spinlock_try(&zone->lock); + } +} + +/** + * Unlock zone. + */ +static inline void ALWAYS_INLINE +zunlock(zone_t *zone) +{ + if G_UNLIKELY(zone->private) + spinunlock_direct(&zone->lock); + else + spinunlock(&zone->lock); +} + +/** * Allcate memory with fixed size blocks (zone allocation). * * @return a pointer to a block containing at least 'size' bytes of * memory. It is a fatal error if memory cannot be allocated. */ -G_GNUC_HOT void * +void * G_HOT zalloc(zone_t *zone) { char **blk; /**< Allocated block */ /* NB: this routine must be as fast as possible. No assertions */ - spinlock(&zone->lock); - + ZSTATS_LOCK; zstats.allocations++; zstats.user_blocks++; zstats.user_memory += zone->zn_size; + ZSTATS_UNLOCK; memusage_add_one(zone->zn_mem); /* @@ -537,13 +787,15 @@ * succeed in getting a block, we are done so return immediately. */ + zlock(zone); + blk = zone->zn_free; if G_LIKELY(blk != NULL) { zone->zn_free = (char **) *blk; zone->zn_cnt++; safety_assert(zone->zn_free != NULL || zone->zn_blocks == zone->zn_cnt); safety_assert(NULL == zone->zn_free || zbelongs(zone, zone->zn_free)); - spinunlock(&zone->lock); + zunlock(zone); return zprepare(zone, blk); } @@ -574,7 +826,7 @@ zone->zn_cnt++; safety_assert(NULL == zone->zn_free || zbelongs(zone, zone->zn_free)); - spinunlock(&zone->lock); + zunlock(zone); return zprepare(zone, blk); } @@ -630,32 +882,32 @@ #ifdef MALLOC_TIME { const time_t *t = const_ptr_add_offset(p, OVH_TIME_OFFSET); - gm_snprintf(ago, sizeof ago, " %s", - short_time(delta_time(tm_time(), *t))); + str_bprintf(ago, sizeof ago, " %s", + short_time_ascii(delta_time(tm_time(), *t))); } #else ago0 = '\0'; #endif - s_warning("leaked block %p from \"%s:%u\"%s", uptr, file, line, ago); + s_warning("leaked %zu-byte block %p from \"%s:%u\"%s", + size, uptr, file, line, ago); #ifdef MALLOC_FRAMES { - const char *q = const_ptr_add_offset(p, OVH_FRAME_OFFSET); + const void *q = const_ptr_add_offset(p, OVH_FRAME_OFFSET); const struct frame *f = *(struct frame **) q; if (f != INVALID_FRAME_PTR) { - stacktrace_atom_print(stderr, f->ast); + leak_stack_add(leakset, size, f->ast); } else { - s_warning("however frame pointer suggests block %p was freed?", - uptr); + s_warning("%s(): frame pointer suggests " + "%zu-byte block %p was freed?", + G_STRFUNC, size, uptr); } } #endif - if (leakset != NULL) { - leak_add(leakset, size, file, line); - } + leak_add(leakset, size, file, line); } /** @@ -688,7 +940,7 @@ if (used != zone->zn_cnt) { s_warning("BUG: " "found %u used block%s, but %zu-byte zone said it was holding %u", - used, 1 == used ? "" : "s", zone->zn_size, zone->zn_cnt); + used, plural(used), zone->zn_size, zone->zn_cnt); } } #endif /* TRACK_ZALLOC */ @@ -710,6 +962,8 @@ * in memory and look for some header. */ + ZLEAK_LOCK; + if (NULL == not_leaking) not_leaking = hash_table_new(); @@ -726,7 +980,9 @@ hash_table_insert(not_leaking, u != NULL ? u : o, GINT_TO_POINTER(1)); - return deconstify_gpointer(o); + ZLEAK_UNLOCK; + + return deconstify_pointer(o); } /** @@ -739,6 +995,8 @@ { g_assert(ptr_cmp(allocated, used) < 0); + ZLEAK_LOCK; + if (alloc_used_to_real == NULL) { alloc_used_to_real = hash_table_new(); alloc_real_to_used = hash_table_new(); @@ -746,34 +1004,19 @@ hash_table_insert(alloc_used_to_real, used, allocated); hash_table_insert(alloc_real_to_used, allocated, used); + + ZLEAK_UNLOCK; } #endif /* TRACK_ZALLOC || MALLOC_FRAMES */ /** - * Return block to its zone, hence freeing it. Previous content of the - * block is lost. - * - * Since a zone consists of blocks with a fixed size, memory fragmentation - * is not an issue. Therefore, the block is returned to the zone by being - * inserted at the head of the free list. - * - * Warning: returning a block to the wrong zone may lead to disasters. + * Return user pointer to (already locked) zone. */ -void -zfree(zone_t *zone, void *ptr) +static inline void +zreturn(zone_t *zone, void *ptr) { char **head; - g_assert(ptr); - zone_check(zone); - - spinlock(&zone->lock); - - safety_assert(zbelongs(zone, ptr)); - - zstats.freeings++; - memusage_remove_one(zone->zn_mem); - #ifdef ZONE_SAFE { char **tmp; @@ -781,21 +1024,51 @@ /* Go back at leading magic, also the start of the block */ tmp = ptr_add_offset(ptr, -OVH_LENGTH + OVH_ZONE_SAFE_OFFSET); - if G_UNLIKELY(tmp0 != BLOCK_USED) - s_error("trying to free block %p twice", ptr); - if G_UNLIKELY(tmp1 != (char *) zone) - s_error("trying to free block %p to wrong zone", ptr); + if G_UNLIKELY(tmp0 != BLOCK_USED) { + const zone_t *ozone = (zone_t *) tmp1; + zframe_dump(ptr, "block already freed"); + s_error("trying to free block %p twice (in %s %zu-byte zone)", + ptr, ozone == zone ? "proper" : + ZONE_MAGIC == ozone->zn_magic ? "wrong" : "invalid", + ZONE_MAGIC == ozone->zn_magic ? zone_size(ozone) : 0); + } + if G_UNLIKELY(tmp1 != (char *) zone) { + const zone_t *ozone = (zone_t *) tmp1; + zframe_dump(ptr, "block allocated"); + s_error("trying to free block %p to wrong %zu-byte zone %p, " + "allocated in %zu-byte zone %p", + ptr, zone_size(zone), zone, + ZONE_MAGIC == ozone->zn_magic ? zone_size(ozone) : 0, ozone); + } } -#endif +#endif /* ZONE_SAFE */ #ifdef MALLOC_FRAMES { struct frame **p = ptr_add_offset(ptr, -OVH_LENGTH + OVH_FRAME_OFFSET); *p = INVALID_FRAME_PTR; } #endif +#ifdef ZONE_FRAMES + { + struct stackatom const **p = + ptr_add_offset(ptr, -OVH_LENGTH + OVH_FRAME_OFFSET); +#ifdef ZONE_SAFE + struct stacktrace t; + const struct stackatom *a; + + stacktrace_get_offset(&t, 1); /* Remove ourselves from trace */ + a = zframe_mark_pointer(stacktrace_get_atom(&t)); + *p = a; /* This is the freeing stack frame */ +#else + *p = INVALID_FRAME_PTR; +#endif /* ZONE_SAFE */ + } +#endif /* ZONE_FRAMES */ #if defined(TRACK_ZALLOC) || defined(MALLOC_FRAMES) if (not_leaking != NULL) { void *a = NULL; + + ZLEAK_LOCK; if (alloc_real_to_used != NULL) { a = hash_table_lookup(alloc_real_to_used, ptr); } @@ -804,10 +1077,16 @@ hash_table_remove(alloc_real_to_used, ptr); hash_table_remove(alloc_used_to_real, a); } + ZLEAK_UNLOCK; } #endif + safety_assert(zbelongs_uptr(zone, ptr)); + ptr = ptr_add_offset(ptr, -OVH_LENGTH); + G_PREFETCH_W(ptr); + G_PREFETCH_W(&zone->zn_free); + G_PREFETCH_W(&zone->zn_cnt); g_assert(uint_is_positive(zone->zn_cnt)); /* Has something to free! */ @@ -823,11 +1102,100 @@ zone->zn_free = ptr; /* New free list head */ zone->zn_cnt--; /* To make zone gc easier */ } +} + +/** + * Return block to its zone, hence freeing it. Previous content of the + * block is lost. + * + * Since a zone consists of blocks with a fixed size, memory fragmentation + * is not an issue. Therefore, the block is returned to the zone by being + * inserted at the head of the free list. + * + * Warning: returning a block to the wrong zone may lead to disasters. + */ +void +zfree(zone_t *zone, void *ptr) +{ + g_assert(ptr); + zone_check(zone); + + zlock(zone); + zreturn(zone, ptr); + zunlock(zone); + ZSTATS_LOCK; + zstats.freeings++; zstats.user_blocks--; zstats.user_memory -= zone->zn_size; + ZSTATS_UNLOCK; + memusage_remove_one(zone->zn_mem); +} + +/** + * Return list of blocks to its zone, hence freeing it. Previous content of the + * block is lost. + */ +void +zfree_pslist(zone_t *zone, pslist_t *pl) +{ + size_t n = 0; + pslist_t *l, *next; + + zone_check(zone); + + zlock(zone); + + for (l = pl; l != NULL; l = next, n++) { + next = l->next; + zreturn(zone, l); + } + + zunlock(zone); - spinunlock(&zone->lock); + ZSTATS_LOCK; + zstats.freeings +=n; + zstats.freeings_list++; + zstats.freeings_list_blocks +=n; + zstats.user_blocks -= n; + zstats.user_memory -= zone->zn_size * n; + ZSTATS_UNLOCK; + + memusage_remove_multiple(zone->zn_mem, n); +} + +/** + * Return list of blocks to its zone, hence freeing it. Previous content of the + * block is lost. + */ +void +zfree_eslist(zone_t *zone, eslist_t *el) +{ + size_t n; + void *p, *next; + + zone_check(zone); + + zlock(zone); + + for (n = 0, p = eslist_head(el); p != NULL; p = next, n++) { + next = eslist_next_data(el, p); + zreturn(zone, p); + } + + zunlock(zone); + + g_assert(n == eslist_count(el)); + + ZSTATS_LOCK; + zstats.freeings +=n; + zstats.freeings_list++; + zstats.freeings_list_blocks +=n; + zstats.user_blocks -= n; + zstats.user_memory -= zone->zn_size * n; + ZSTATS_UNLOCK; + + memusage_remove_multiple(zone->zn_mem, n); } #endif /* !REMAP_ZALLOC */ @@ -840,14 +1208,15 @@ * The first block in the arena will be the first free block. */ static void -zn_cram(const zone_t *zone, void *arena) +zn_cram(const zone_t *zone, void *arena, size_t len) { - unsigned i; char **next = arena, *p = arena; size_t size = zone->zn_size; - unsigned hint = zone->zn_hint; + void *last = ptr_add_offset(arena, len - size); + + g_assert(len >= size); - for (i = 1; i < hint; i++) { + while (ptr_cmp(&psize, last) <= 0) { next = cast_to_void_ptr(p); p = *next = &psize; } @@ -862,28 +1231,70 @@ sz->sz_base = vmm_core_alloc(sz->sz_size); sz->sz_ctime = tm_time(); + ZSTATS_LOCK; zstats.subzones_allocated++; zstats.subzones_allocated_pages += vmm_page_count(sz->sz_size); + ZSTATS_UNLOCK; } static void subzone_free_arena(struct subzone *sz) { + ZSTATS_LOCK; zstats.subzones_freed++; zstats.subzones_freed_pages += vmm_page_count(sz->sz_size); + ZSTATS_UNLOCK; vmm_core_free(sz->sz_base, sz->sz_size); sz->sz_base = NULL; sz->sz_size = 0; } +static zone_t * +subzone_alloc_embedded(size_t size) +{ + struct subzone sz; + zone_t *zone; + + ZERO(&sz); + subzone_alloc_arena(&sz, size); + + zone = cast_to_void_ptr(sz.sz_base); /* Zone at the head of subzone */ + ZERO(zone); + zone->embedded = TRUE; + + sz.sz_base = ptr_add_offset(sz.sz_base, sizeof *zone); + sz.sz_size -= sizeof *zone; + + zone->zn_arena = sz; /* Struct copy */ + + return zone; +} + +static void +subzone_free_embedded(struct subzone *sz) +{ + zone_t *zone; + + sz->sz_base = ptr_add_offset(sz->sz_base, -(sizeof *zone)); + sz->sz_size += sizeof *zone; + zone = cast_to_void_ptr(sz->sz_base); + + g_assert(zone->embedded); + + subzone_free_arena(sz); +} + /* * Is subzone held in a virtual memory region that could be relocated or * is a standalone fragment? */ -static inline gboolean +static inline bool subzone_is_fragment(const struct subzone *sz) { + if (sz->sz_size < compat_pagesize()) + return FALSE; + return vmm_is_relocatable(sz->sz_base, sz->sz_size) || vmm_is_fragment(sz->sz_base, sz->sz_size); } @@ -912,10 +1323,14 @@ * memory per subzone chunk and get blocks large enough to store possible * extra information when debugging. * + * @param requested the initially requested size + * @param hint_ptr points to suggested amount of blocks per zone + * @param verbose if TRUE, possibly log debugging information + * * @return adjusted block size and updated hint value */ static size_t -adjust_size(size_t requested, unsigned *hint_ptr) +zalloc_adjust_size(size_t requested, unsigned *hint_ptr, bool verbose) { size_t rounded; size_t wasted; @@ -981,21 +1396,21 @@ if (wasted > 0) { size_t bsize = rounded / hint; size_t adjusted = (bsize / ZALLOC_ALIGNBYTES) * ZALLOC_ALIGNBYTES; - + g_assert(adjusted >= size); if (adjusted != size) { - if (zalloc_debugging(0)) { + if (zalloc_debugging(0) && verbose) { s_debug("ZALLOC adjusting block size from %zu to %zu " - "(%zu blocks will waste %zu bytes at end of " + "(%u blocks will waste %zu bytes at end of " "%zu-byte subzone)", requested, adjusted, hint, rounded - hint * adjusted, rounded); } } else { - if (zalloc_debugging(0)) { + if (zalloc_debugging(0) && verbose) { s_debug("ZALLOC cannot adjust block size of %zu " - "(%zu blocks will waste %zu bytes at end of " + "(%u blocks will waste %zu bytes at end of " "%zu-byte subzone)", requested, hint, rounded - hint * adjusted, rounded); } @@ -1010,6 +1425,8 @@ /** * Create a new zone able to hold `hint' items of 'size' bytes. + * + * If the ``zone'' parameter is NULL, create an embedded zone. */ static zone_t * zn_create(zone_t *zone, size_t size, unsigned hint) @@ -1017,13 +1434,14 @@ g_assert(size > 0); g_assert(uint_is_non_negative(hint)); - ZERO(zone); - /* * Allocate the arena. */ - subzone_alloc_arena(&zone->zn_arena, size * hint); + if (NULL == zone) + zone = subzone_alloc_embedded(size * hint); + else + subzone_alloc_arena(&zone->zn_arena, size * hint); /* * Initialize zone descriptor. @@ -1039,15 +1457,10 @@ zone->zn_subzones = 1; /* One subzone to start with */ zone->zn_blocks = zone->zn_hint; zone->zn_gc = NULL; + zone->zn_stid = 0; spinlock_init(&zone->lock); - if (zalloc_memusage_ok) { - zone->zn_mem = memusage_alloc("zone", size); - } else { - zone->zn_mem = NULL; - } - - zn_cram(zone, zone->zn_arena.sz_base); + zn_cram(zone, zone->zn_arena.sz_base, zone->zn_arena.sz_size); safety_assert(zbelongs(zone, zone->zn_free)); return zone; @@ -1067,7 +1480,7 @@ g_assert(spinlock_is_held(&zone->lock)); - sz = xpmalloc(sizeof *sz); /* Plain malloc */ + XMALLOC(sz); subzone_alloc_arena(sz, zone->zn_size * zone->zn_hint); zrange_clear(zone); @@ -1081,7 +1494,7 @@ zone->zn_oversized = 0; /* Just extended, cannot be oversized */ zone->zn_blocks += zone->zn_hint; - zn_cram(zone, sz->sz_base); + zn_cram(zone, sz->sz_base, sz->sz_size); safety_assert(zbelongs(zone, zone->zn_free)); return zone->zn_free; @@ -1109,16 +1522,20 @@ old_subzones = zone->zn_subzones; zn_free_additional_subzones(zone); + + ZSTATS_LOCK; zstats.zgc_excess_zones_freed += old_subzones - zone->zn_subzones; + zstats.zgc_shrinked++; + ZSTATS_UNLOCK; + zone->zn_subzones = 1; /* One subzone remains */ zone->zn_blocks = zone->zn_hint; zone->zn_free = cast_to_void_ptr(zone->zn_arena.sz_base); zone->zn_oversized = 0; - zn_cram(zone, zone->zn_arena.sz_base); /* Recreate free list */ + /* Recreate free list */ + zn_cram(zone, zone->zn_arena.sz_base, zone->zn_arena.sz_size); safety_assert(zbelongs(zone, zone->zn_free)); - - zstats.zgc_shrinked++; } #endif /* !REMAP_ZALLOC */ @@ -1130,21 +1547,26 @@ * that are to be created per zone chunks. That is not the total amount of * expected objects of a given type. Leaving it a 0 selects the default hint * value. + * + * @param size the (already adjusted) block size + * @param hint the expected amount of blocks per chunk. + * + * @return a new zone. */ -zone_t * -zcreate(size_t size, unsigned hint) +static zone_t * +zcreate_internal(size_t size, unsigned hint, bool embedded) { zone_t *zone; /* Zone descriptor */ - zone = xpmalloc(sizeof *zone); - zn_create(zone, size, hint); + zone = embedded ? NULL : xmalloc0(sizeof *zone); + zone = zn_create(zone, size, 0 == hint ? DEFAULT_HINT : hint); #ifndef REMAP_ZALLOC if (zgc_always(zone)) { - spinlock(&zone->lock); + zlock(zone); if (NULL == zone->zn_gc) zgc_allocate(zone); - spinunlock(&zone->lock); + zunlock(zone); } #endif @@ -1152,50 +1574,121 @@ } /** + * Create a new zone able to hold items of 'size' bytes. Returns + * NULL if no new zone can be created. + * + * The hint argument is to be construed as the average amount of objects + * that are to be created per zone chunks. That is not the total amount of + * expected objects of a given type. Leaving it a 0 selects the default hint + * value. + */ +zone_t * +zcreate(size_t size, unsigned hint, bool embedded) +{ + size = zalloc_adjust_size(size, &hint, TRUE); + + return zcreate_internal(size, hint, embedded); +} + +/** + * Destroy a (locked) zone chunk. + */ +static void +zdestroy_physical(zone_t *zone) +{ + if (zone->zn_cnt) { + s_warning("destroyed zone (%zu-byte blocks) still holds %u entr%s", + zone->zn_size, zone->zn_cnt, plural_y(zone->zn_cnt)); +#ifdef TRACK_ZALLOC + zdump_used(zone, z_leakset); +#endif + } + +#ifndef REMAP_ZALLOC + if (zone->zn_gc) + zgc_dispose(zone); +#endif + + zn_free_additional_subzones(zone); + + /* + * An embedded zone has no separate zone descriptor: it is embedded at + * the start of the first subzone. + * + * Such zones are never used by zget(), so they cannot be held in the + * hash table by zone size. + */ + + if (!zone->embedded) { + subzone_free_arena(&zone->zn_arena); + + if (!zalloc_closing) + hash_table_remove(zt, zone); + } + + /* + * If the zone is private, unlock it to avoid spinlock_destroy() + * complaining about the lock being not registered (since a private + * zone is not really locked). + */ + + if (zone->private) + zunlock(zone); + + spinlock_destroy(&zone->lock); + + if (zone->embedded) { + subzone_free_embedded(&zone->zn_arena); + } else { + xfree(zone); + } +} + +/** * Destroy a zone chunk by releasing its memory to the system if possible. */ void zdestroy(zone_t *zone) { + zone_check(zone); + g_assert(uint_is_positive(zone->zn_refcnt)); + /* * A zone can be used by many different parts of the code, through * calls to zget(). Therefore, only destroy the zone when all references * are gone. */ - g_assert(zone != NULL); - g_assert(uint_is_positive(zone->zn_refcnt)); - - spinlock(&zone->lock); + zlock(zone); if (!atomic_uint_dec_is_zero(&zone->zn_refcnt)) { - spinunlock(&zone->lock); + zunlock(zone); return; } - if (zone->zn_cnt) { - s_warning("destroyed zone (%zu-byte blocks) still holds %u entr%s", - zone->zn_size, zone->zn_cnt, zone->zn_cnt == 1 ? "y" : "ies"); -#ifdef TRACK_ZALLOC - zdump_used(zone, z_leakset); -#endif - } + zdestroy_physical(zone); +} -#ifndef REMAP_ZALLOC - if (zone->zn_gc) { - spinlock(&zone->zn_gc->lock); - zgc_dispose(zone); - } -#endif +/** + * Destroy a zone if it is referenced once and holds no items. + * + * @return TRUE if zone was physically destroyed. + */ +bool +zdestroy_if_empty(zone_t *zone) +{ + zone_check(zone); + g_assert(uint_is_positive(zone->zn_refcnt)); - zn_free_additional_subzones(zone); - subzone_free_arena(&zone->zn_arena); + zlock(zone); - if (!zalloc_closing) - hash_table_remove(zt, ulong_to_pointer(zone->zn_size)); + if (1 != atomic_uint_get(&zone->zn_refcnt) || zone->zn_cnt != 0) { + zunlock(zone); + return FALSE; + } - spinlock_destroy(&zone->lock); - xfree(zone); + zdestroy_physical(zone); + return TRUE; } /** @@ -1208,10 +1701,11 @@ * zget() to get the zone, instead of zcreate() to maximize sharing. */ zone_t * -zget(size_t size, unsigned hint) +zget(size_t size, unsigned hint, bool private) { static spinlock_t zget_slk = SPINLOCK_INIT; zone_t *zone; + zone_t key; /* * Allocate hash table if not already done! @@ -1220,7 +1714,7 @@ spinlock(&zget_slk); if G_UNLIKELY(zt == NULL) { - zt = hash_table_new(); + zt = hash_table_new_full(zone_hash, zone_eq); hash_table_thread_safe(zt); } @@ -1229,8 +1723,13 @@ * memory blocks and minimize the amount of wasted space in subzones. */ - size = adjust_size(size, &hint); - zone = hash_table_lookup(zt, ulong_to_pointer(size)); + size = zalloc_adjust_size(size, &hint, TRUE); + + key.zn_size = size; + key.private = booleanize(private); + key.zn_stid = private ? thread_small_id() : 0; + + zone = hash_table_lookup(zt, &key); /* * Supplied hint value is ignored if a zone already exists for that size @@ -1245,7 +1744,12 @@ * No zone of the corresponding size already, create a new one! */ - zone = zcreate(size, hint); + zone = zcreate_internal(size, hint, FALSE); + + if (private) { + zone->private = TRUE; + zone->zn_stid = key.zn_stid; + } /* * Insert new zone in the hash table so that we can return it to other @@ -1254,10 +1758,21 @@ * time! */ - hash_table_insert(zt, ulong_to_pointer(size), zone); + hash_table_insert(zt, zone, zone); found: spinunlock(&zget_slk); + + if (zalloc_debugging(1)) { + size_t count = hash_table_size(zt); + size_t buckets = hash_table_buckets(zt); + double clustering = hash_table_clustering(zt); + s_info("clustering in zalloc()'s zone table is %F for %zu/%zu items " + "(%zu buckets, optimal spread = %F items/bucket)", + clustering, count, hash_table_capacity(zt), buckets, + (double) count / buckets); + } + return zone; } @@ -1272,7 +1787,33 @@ * If there is no garbage collection turned on for the zone, keep it as-is. */ - zstats.zmove_attempts++; + ZSTATS_INCX(zmove_attempts); + +#ifdef ZONE_SAFE + { + char **tmp; + + /* Go back at leading magic, also the start of the block */ + tmp = ptr_add_offset(p, -OVH_LENGTH + OVH_ZONE_SAFE_OFFSET); + + if G_UNLIKELY(tmp0 != BLOCK_USED) { + const zone_t *ozone = (zone_t *) tmp1; + zframe_dump(p, "block already freed"); + s_error("trying to move freed block %p twice (to %s %zu-byte zone)", + p, ozone == zone ? "proper" : + ZONE_MAGIC == ozone->zn_magic ? "wrong" : "invalid", + ZONE_MAGIC == ozone->zn_magic ? zone_size(ozone) : 0); + } + if G_UNLIKELY(tmp1 != (char *) zone) { + const zone_t *ozone = (zone_t *) tmp1; + zframe_dump(p, "block allocated"); + s_error("trying to move block %p to wrong %zu-byte zone %p, " + "allocated in %zu-byte zone %p", + p, zone_size(zone), zone, + ZONE_MAGIC == ozone->zn_magic ? zone_size(ozone) : 0, ozone); + } + } +#endif /* ZONE_SAFE */ if G_LIKELY(NULL == zone->zn_gc) return p; @@ -1310,7 +1851,7 @@ * Close the zone allocator, destroying all the remaining zones regardless * of their reference count. */ -G_GNUC_COLD void +void G_COLD zclose(void) { if (NULL == zt) @@ -1323,7 +1864,7 @@ #ifdef TRACK_ZALLOC leak_dump(z_leakset); - leak_close(z_leakset); + leak_close_null(&z_leakset); #endif #ifdef MALLOC_FRAMES @@ -1331,7 +1872,7 @@ extern void hash_table_destroy_real(hash_table_t *ht); size_t frames = hash_table_size(zalloc_frames); s_message("zalloc() tracked %zu distinct stack frame%s", - frames, 1 == frames ? "" : "s"); + frames, plural(frames)); hash_table_destroy_real(zalloc_frames); zalloc_frames = NULL; } @@ -1340,14 +1881,14 @@ if (not_leaking != NULL) { size_t blocks = hash_table_size(not_leaking); s_message("zalloc() had %zu block%s registered as not-leaking", - blocks, 1 == blocks ? "" : "s"); + blocks, plural(blocks)); hash_table_destroy(not_leaking); not_leaking = NULL; } if (alloc_used_to_real != NULL) { size_t blocks = hash_table_size(alloc_used_to_real); s_message("zalloc() had %zu block%s registered for address shifting", - blocks, 1 == blocks ? "" : "s"); + blocks, plural(blocks)); hash_table_destroy(alloc_used_to_real); if (hash_table_size(alloc_real_to_used) != blocks) { s_warning("zalloc() had count mismatch in address shifting tables"); @@ -1362,7 +1903,7 @@ * Set debug level. */ void -set_zalloc_debug(guint32 level) +set_zalloc_debug(uint32 level) { zalloc_debug = level; } @@ -1387,7 +1928,7 @@ * processes, this is a good property. */ void -set_zalloc_always_gc(gboolean val) +set_zalloc_always_gc(bool val) { zalloc_always_gc = val; } @@ -1405,7 +1946,7 @@ */ static struct { unsigned subzone_freed; /**< Amount of subzones freed this run */ - gboolean running; /**< Garbage collector is running */ + bool running; /**< Garbage collector is running */ } zgc_context; #define ZGC_SUBZONE_MINLIFE 5 /**< Do not free too recent subzone */ @@ -1415,7 +1956,7 @@ static unsigned zgc_zone_cnt; /**< Zones in garbage collecting mode */ /** - * Compare two subzinfo based on base address -- qsort() callback. + * Compare two subzinfo based on base address -- xsort() callback. */ static int subzinfo_cmp(const void *a, const void *b) @@ -1423,9 +1964,7 @@ const struct subzinfo *sa = a; const struct subzinfo *sb = b; - g_assert(sa->szi_base != sb->szi_base); - - return sa->szi_base < sb->szi_base ? -1 : +1; + return ptr_cmp(sa->szi_base, sb->szi_base); } /** @@ -1436,43 +1975,50 @@ * * @return a pointer to the found subzone information, NULL if not found. */ -static G_GNUC_HOT struct subzinfo * +static struct subzinfo * G_HOT zgc_find_subzone(struct zone_gc *zg, void *blk, unsigned *low_ptr) { - struct subzinfo *item, *array = zg->zg_subzinfo; - unsigned low = 0, high = zg->zg_zones - 1; + const struct subzinfo + *array = zg->zg_subzinfo, + *low = &array0, + *high = &arrayzg->zg_zones - 1, + *mid; const char * const key = blk; + if G_UNLIKELY(0 == zg->zg_zones) { + if (low_ptr != NULL) + *low_ptr = 0; + return NULL; + } + /* Binary search */ for (;;) { - unsigned mid; - - if G_UNLIKELY(low > high || high > INT_MAX) { - item = NULL; /* Not found */ + if G_UNLIKELY(low > high) { + mid = NULL; /* Not found */ break; } + mid = low + (high - low) / 2; - item = &arraymid; - if (key >= item->szi_end) + if (key >= mid->szi_end) low = mid + 1; - else if (key < item->szi_base) - high = mid - 1; + else if (key < mid->szi_base) + high = mid - 1; /* -1 OK since pointers cannot reach page 0 */ else break; /* Found */ } if (low_ptr != NULL) - *low_ptr = low; + *low_ptr = low - &array0; - return item; + return deconstify_pointer(mid); } /** * Check whether address falls within the subzone boundaries. */ -static inline G_GNUC_HOT gboolean +static inline bool G_HOT zgc_within_subzone(const struct subzinfo *szi, const void *p) { struct subzone *sz; @@ -1500,7 +2046,6 @@ struct zone_gc *zg = zone->zn_gc; unsigned low; struct subzinfo *szi; - struct subzinfo *array; /* * Find index at which we must insert the new zone in the sorted array. @@ -1514,19 +2059,13 @@ */ zg->zg_zones++; - array = xprealloc(zg->zg_subzinfo, - zg->zg_zones * sizeof(zg->zg_subzinfo0)); + XREALLOC_ARRAY(zg->zg_subzinfo, zg->zg_zones); - zg->zg_subzinfo = array; + g_assert(uint_is_non_negative(low)); - g_assert(uint_is_non_negative(low) && low < zg->zg_zones); + ARRAY_MAKEROOM(zg->zg_subzinfo, low, zg->zg_zones - 1, zg->zg_zones); - if (low < zg->zg_zones - 1) { - memmove(&arraylow+1, &arraylow, - sizeof(zg->zg_subzinfo0) * (zg->zg_zones - 1 - low)); - } - - szi = &arraylow; + szi = &zg->zg_subzinfolow; szi->szi_base = sz->sz_base; szi->szi_end = &sz->sz_basesz->sz_size; szi->szi_free_cnt = zone->zn_hint; @@ -1534,6 +2073,7 @@ szi->szi_sz = sz; g_assert(zgc_within_subzone(szi, blk)); + safety_assert(zgc_subzinfo_valid(zone, szi)); if (addr_grows_upwards) { if (zg->zg_free > low) @@ -1572,8 +2112,7 @@ g_assert(uint_is_non_negative(i)); g_assert(i < zg->zg_zones); - memmove(&zg->zg_subzinfoi, &zg->zg_subzinfoi+1, - (zg->zg_zones - i) * sizeof(zg->zg_subzinfo0)); + ARRAY_REMOVE(zg->zg_subzinfo, i, zg->zg_zones + 1); if (zg->zg_free > i) zg->zg_free--; @@ -1601,7 +2140,7 @@ s_error("cannot recreate %zu-byte zone arena", zone->zn_size); } - zn_cram(zone, sz->sz_base); + zn_cram(zone, sz->sz_base, sz->sz_size); return cast_to_void_ptr(sz->sz_base); } @@ -1643,7 +2182,9 @@ subzone_free_arena(sz); zrange_clear(zone); zg->zg_zone_defragmented++; - zstats.zgc_zones_defragmented++; + + ZSTATS_INCX(zgc_zones_defragmented); + zgc_remove_subzone(zone, szi); blk = zgc_subzone_new_arena(zone, sz); nszi = zgc_insert_subzone(zone, sz, blk); @@ -1660,7 +2201,7 @@ * * @return TRUE if OK, FALSE if we did not free it. */ -static gboolean +static bool zgc_subzone_free(zone_t *zone, struct subzinfo *szi) { struct zone_gc *zg = zone->zn_gc; @@ -1682,7 +2223,8 @@ if G_UNLIKELY(1 == zone->zn_subzones) { g_assert(zone->zn_blocks == zone->zn_hint); zgc_subzone_defragment(zone, szi); - zstats.zgc_last_zone_kept++; + + ZSTATS_INCX(zgc_last_zone_kept); return FALSE; } @@ -1703,7 +2245,7 @@ zone->zn_hint, compact_time(life)); } - zstats.zgc_fragments_freed++; + ZSTATS_INCX(zgc_fragments_freed); goto release_zone; } @@ -1748,7 +2290,8 @@ zone->zn_size, (void *) zone); } zg->zg_flags |= ZGC_SCAN_ALL; - zstats.zgc_free_quota_reached++; + + ZSTATS_INCX(zgc_free_quota_reached); return FALSE; } @@ -1756,6 +2299,9 @@ g_assert(sz != NULL); /* We know there are more than 1 subzone */ + if G_UNLIKELY(zone->embedded) + return FALSE; /* Can't free first subzone, holds the zone */ + if (zalloc_debugging(1)) { unsigned free_blocks = zone->zn_blocks - zone->zn_cnt - zone->zn_hint; @@ -1767,7 +2313,7 @@ szi->szi_base, szi->szi_end - 1, ptr_diff(szi->szi_end, szi->szi_base) / 1024, zone->zn_hint, compact_time(life), - free_blocks, 1 == free_blocks ? "" : "s"); + free_blocks, plural(free_blocks)); } subzone_free_arena(&zone->zn_arena); @@ -1804,7 +2350,7 @@ szi->szi_base, szi->szi_end - 1, ptr_diff(szi->szi_end, szi->szi_base) / 1024, zone->zn_hint, compact_time(life), - free_blocks, 1 == free_blocks ? "" : "s"); + free_blocks, plural(free_blocks)); } subzone_free_arena(sz); zrange_clear(zone); @@ -1826,7 +2372,8 @@ zone->zn_blocks -= zone->zn_hint; zone->zn_subzones--; zgc_context.subzone_freed++; - zstats.zgc_zones_freed++; + + ZSTATS_INCX(zgc_zones_freed); /* * Remove subzone info from sorted array. @@ -1844,16 +2391,23 @@ * * @return TRUE if block was inserted, FALSE if subzone was freed. */ -static gboolean +static bool zgc_insert_freelist(zone_t *zone, char **blk) { struct zone_gc *zg = zone->zn_gc; struct subzinfo *szi; unsigned idx; + G_PREFETCH_W(blk); + G_PREFETCH_W(&zg->zg_free); + szi = zgc_find_subzone(zg, blk, NULL); + + G_PREFETCH_W(&szi->szi_free_cnt); + g_assert(szi != NULL); g_assert(zgc_within_subzone(szi, blk)); + safety_assert(zgc_subzinfo_valid(zone, szi)); /* * Whether we are going to free up the subzone or not, we put the block @@ -1918,20 +2472,18 @@ s_debug("ZGC %zu-byte zone %p: " "setting up garbage collection for %u subzone%s, %u free block%s", zone->zn_size, (void *) zone, - zone->zn_subzones, 1 == zone->zn_subzones ? "" : "s", - free_blocks, 1 == free_blocks ? "" : "s"); + zone->zn_subzones, plural(zone->zn_subzones), + free_blocks, plural(free_blocks)); } - zg = xpmalloc(sizeof *zg); - + XMALLOC(zg); zg->zg_zones = zone->zn_subzones; - zg->zg_subzinfo = xpmalloc(zg->zg_zones * sizeof(zg->zg_subzinfo0)); + XMALLOC_ARRAY(zg->zg_subzinfo, zg->zg_zones); zg->zg_zone_freed = 0; zg->zg_zone_defragmented = 0; zg->zg_start = tm_time(); zg->zg_free = addr_grows_upwards ? 0 : zg->zg_zones - 1; zg->zg_flags = 0; - spinlock_init(&zg->lock); zone->zn_gc = zg; @@ -1962,9 +2514,13 @@ /* * Sort the array by increasing subzone base addresses. + * + * Do not use qsort(), since it can malloc(), which could cause a + * deadlock when xmalloc() replaces the system's malloc(), should + * we re-enter the zone allocator on the already locked zone. */ - qsort(zg->zg_subzinfo, zg->zg_zones, sizeof *szi, subzinfo_cmp); + xqsort(zg->zg_subzinfo, zg->zg_zones, sizeof *szi, subzinfo_cmp); /* * Dispatch each free block to the proper subzone free list. @@ -1979,7 +2535,7 @@ } } - zgc_zone_cnt++; + atomic_uint_inc(&zgc_zone_cnt); g_assert(dispatched == zone->zn_blocks - zone->zn_cnt); g_assert(NULL == zone->zn_free); @@ -2015,6 +2571,11 @@ szi->szi_free = (char **) *blk; /* Use first block */ szi->szi_free_cnt--; + /* Added more than 1 block */ + g_assert(zgc_within_subzone(szi, blk)); + g_assert(szi->szi_free_cnt != 0 && zgc_within_subzone(szi, szi->szi_free)); + safety_assert(zgc_subzinfo_valid(zone, szi)); + if (zalloc_debugging(4)) { s_debug("ZGC %zu-byte zone %p extended by %u blocks in %p, %p", zone->zn_size, (void *) zone, @@ -2034,15 +2595,13 @@ { struct zone_gc *zg = zone->zn_gc; unsigned i; - gboolean must_continue = FALSE; + bool must_continue = FALSE; g_assert(zg != NULL); g_assert(zone->zn_blocks >= zone->zn_cnt); g_assert(uint_is_non_negative(zg->zg_free)); g_assert(spinlock_is_held(&zone->lock)); - spinlock(&zg->lock); - if (zalloc_debugging(4)) { s_debug("ZGC %zu-byte zone %p scanned for free subzones: " "%u blocks, %u free (hint=%u, %u subzones)", @@ -2052,7 +2611,7 @@ } i = zg->zg_free; - zstats.zgc_zone_scans++; + ZSTATS_INCX(zgc_zone_scans); while (i < zg->zg_zones) { struct subzinfo *szi = &zg->zg_subzinfoi; @@ -2083,7 +2642,7 @@ goto next; if (zgc_subzone_free(zone, szi)) { - zstats.zgc_scan_freed++; + ZSTATS_INCX(zgc_scan_freed); continue; } @@ -2098,7 +2657,6 @@ if (!must_continue) goto finished; - spinunlock(&zg->lock); return; finished: @@ -2111,8 +2669,6 @@ zone->zn_blocks, zone->zn_blocks - zone->zn_cnt, zone->zn_hint, zone->zn_subzones); } - - spinunlock(&zg->lock); } /** @@ -2128,7 +2684,6 @@ g_assert(zone->zn_gc != NULL); g_assert(zone->zn_free == NULL); g_assert(spinlock_is_held(&zone->lock)); - g_assert(spinlock_is_held(&zone->zn_gc->lock)); free_blocks = zone->zn_blocks - zone->zn_cnt; zg = zone->zn_gc; @@ -2139,8 +2694,8 @@ "(%u free block%s, %u subzone%s, freed %u and defragmented %u " "in %s)", zone->zn_size, (void *) zone, - free_blocks, 1 == free_blocks ? "" : "s", - zone->zn_subzones, 1 == zone->zn_subzones ? "" : "s", + free_blocks, plural(free_blocks), + zone->zn_subzones, plural(zone->zn_subzones), zg->zg_zone_freed, zg->zg_zone_defragmented, compact_time(elapsed)); } @@ -2177,18 +2732,17 @@ */ xfree(zg->zg_subzinfo); - spinlock_destroy(&zg->lock); xfree(zg); zone->zn_gc = NULL; /* Back to regular zalloc() */ - zgc_zone_cnt--; + atomic_uint_dec(&zgc_zone_cnt); - g_assert(uint_is_non_negative(zgc_zone_cnt)); + g_assert(uint_is_non_negative(atomic_uint_get(&zgc_zone_cnt))); } /** * Allocate a block from the first subzone with free items. */ -static G_GNUC_HOT void * +static void * G_HOT zgc_zalloc(zone_t *zone) { struct zone_gc *zg = zone->zn_gc; @@ -2196,9 +2750,9 @@ struct subzinfo *szi; char **blk; - zstats.allocations_gc++; + g_assert(spinlock_is_held(&zone->lock)); - spinlock(&zg->lock); + ZSTATS_INCX(allocations_gc); /* * Lookup for free blocks in each subzone, scanning them from the first @@ -2260,13 +2814,13 @@ szi->szi_free_cnt--; g_assert(0 == szi->szi_free_cnt || zgc_within_subzone(szi, szi->szi_free)); + g_assert((0 == szi->szi_free_cnt) == (NULL == szi->szi_free)); + safety_assert(zgc_subzinfo_valid(zone, szi)); /* FALL THROUGH */ extended: zone->zn_cnt++; - if (zg != NULL) - spinunlock(&zg->lock); - spinunlock(&zone->lock); + zunlock(zone); return zprepare(zone, blk); } @@ -2276,14 +2830,11 @@ static void zgc_zfree(zone_t *zone, void *ptr) { - struct zone_gc *zg = zone->zn_gc; - - zstats.freeings_gc++; + g_assert(spinlock_is_held(&zone->lock)); - spinlock(&zg->lock); + ZSTATS_INCX(freeings_gc); zone->zn_cnt--; zgc_insert_freelist(zone, ptr); - spinunlock(&zg->lock); } /** @@ -2300,22 +2851,21 @@ void *np; void *start; - zstats.zmove_attempts_gc++; - - spinlock(&zone->lock); + ZSTATS_INCX(zmove_attempts_gc); + zlock(zone); zg = zone->zn_gc; if (NULL == zg || zone->zn_blocks == zone->zn_cnt) { - spinunlock(&zone->lock); + zunlock(zone); return p; /* No free blocks */ } - spinlock(&zg->lock); - szi = zgc_find_subzone(zg, p, NULL); g_assert(szi != NULL); - g_assert(ptr_cmp(p, szi->szi_base) >= 0 && ptr_cmp(p, szi->szi_end) < 0); + g_assert(zgc_within_subzone(szi, p)); + g_assert((0 == szi->szi_free_cnt) == (NULL == szi->szi_free)); + safety_assert(zgc_subzinfo_valid(zone, szi)); if (zone->zn_blocks - zone->zn_cnt == szi->szi_free_cnt) goto no_change; /* No free blocks in any other subzone */ @@ -2353,7 +2903,7 @@ found: - zstats.zmove_successful_gc++; + ZSTATS_INCX(zmove_successful_gc); /* * Remove block from the subzone's free list. @@ -2366,6 +2916,8 @@ nszi->szi_free_cnt--; g_assert(!nszi->szi_free_cnt || zgc_within_subzone(nszi, nszi->szi_free)); + g_assert((0 == nszi->szi_free_cnt) == (NULL == nszi->szi_free)); + safety_assert(zgc_subzinfo_valid(zone, nszi)); /* * Also copy possible overhead (which is already included in the zone's @@ -2373,9 +2925,8 @@ */ start = ptr_add_offset(p, -OVH_LENGTH); - memcpy(blk, start, zone->zn_size); - - np = zprepare(zone, blk); /* Allow for block overhead */ + np = zprepare(zone, blk); /* Allow for block overhead */ + memcpy(blk, start, zone->zn_size); /* Keep original meta info */ if (zalloc_debugging(1)) { size_t used = zone->zn_hint - szi->szi_free_cnt - 1; @@ -2384,8 +2935,8 @@ "subzone has %zu block%s", zone->zn_size, (void *) zone, p, np, zone->zn_blocks, zone->zn_cnt, zone->zn_hint, - zone->zn_subzones, 1 == zone->zn_subzones ? "" : "s", - used, 1 == used ? "" : "s"); + zone->zn_subzones, plural(zone->zn_subzones), + used, plural(used)); } #if defined(TRACK_ZALLOC) || defined(MALLOC_FRAMES) @@ -2400,6 +2951,9 @@ void *a = NULL; void *b; size_t offset; + + ZLEAK_LOCK; + if (alloc_real_to_used != NULL) { a = hash_table_lookup(alloc_real_to_used, p); } @@ -2416,6 +2970,8 @@ hash_table_remove(alloc_used_to_real, a); zalloc_shift_pointer(np, ptr_add_offset(np, offset)); } + + ZLEAK_UNLOCK; } #endif /* TRACK_MALLOC || MALLOC_FRAMES */ @@ -2426,29 +2982,66 @@ zgc_insert_freelist(zone, start); - spinunlock(&zg->lock); - spinunlock(&zone->lock); + zunlock(zone); return np; no_change: - spinunlock(&zg->lock); - spinunlock(&zone->lock); + zunlock(zone); return p; } /** + * Add memory usage monitoring to zone. + */ +static void +zn_memusage_init(zone_t *zone) +{ + memusage_t *mu; + + /* + * Allocate the memusage object before locking the zone in case + * the creation of the object re-enters zalloc() for that same zone. + */ + + mu = memusage_alloc("zone", zone->zn_size); + + zlock(zone); + if (NULL == zone->zn_mem) { + zone->zn_mem = mu; + memusage_add_batch(mu, zone->zn_cnt); + zunlock(zone); + } else { + zunlock(zone); + memusage_free_null(&mu); + g_assert(memusage_is_valid(zone->zn_mem)); + } +} + +/** * Identify oversized zones. */ static void spot_oversized_zone(zone_t *zone) { + if (!zlock_try(zone)) + return; + g_assert(uint_is_positive(zone->zn_refcnt)); g_assert(zone->zn_cnt <= zone->zn_blocks); - if (!spinlock_try(&zone->lock)) - return; + /* + * It's not possible to create this object at zn_create() time because + * there is a danger of deadlocking from walloc() when the size of + * the objects to create matches the zone we're attempting to allocate. + */ + + if G_UNLIKELY(NULL == zone->zn_mem && zalloc_memusage_ok) { + zunlock(zone); + zn_memusage_init(zone); + zlock(zone); + } /* * A zone is oversized if it contains more than 1 subzone and if it has @@ -2492,12 +3085,8 @@ zn_shrink(zone); } else { zgc_allocate(zone); - spinlock(&zone->zn_gc->lock); - if (1 == zone->zn_subzones && !zgc_always(zone)) { + if (1 == zone->zn_subzones && !zgc_always(zone)) zgc_dispose(zone); - } else { - spinunlock(&zone->zn_gc->lock); - } } if (zalloc_debugging(4)) { @@ -2506,7 +3095,7 @@ zone->zn_size, (void *) zone, NULL == zone->zn_gc ? "after shrinking" : "has GC on", zone->zn_blocks, zone->zn_cnt, zone->zn_hint, - zone->zn_subzones, 1 == zone->zn_subzones ? "" : "s"); + zone->zn_subzones, plural(zone->zn_subzones)); } } } else if (zgc_always(zone)) { @@ -2529,7 +3118,7 @@ zone->zn_oversized = 0; } - spinunlock(&zone->lock); + zunlock(zone); } /** @@ -2540,10 +3129,8 @@ * Typically, this routine is invoked from an idle callout queue timer. */ void -zgc(gboolean overloaded) +zgc(bool overloaded) { - static time_t last_run; - time_t now; tm_t start; size_t i, count; zone_t **zones; @@ -2551,24 +3138,14 @@ if (NULL == zt) return; - /* - * Limit iterations to one per second. - */ + ZSTATS_INCX(zgc_runs); - now = tm_time(); - if (last_run == now) { - zstats.zgc_throttled++; - return; - } - last_run = now; - zstats.zgc_runs++; - - if (zalloc_debugging(2)) + if (zalloc_debugging(0)) tm_now_exact(&start); if (zalloc_debugging(3)) { s_debug("ZGC iterating over %u zones (%u in GC mode)", - (unsigned) hash_table_size(zt), zgc_zone_cnt); + (unsigned) hash_table_size(zt), atomic_uint_get(&zgc_zone_cnt)); } zgc_context.subzone_freed = overloaded ? ZGC_SUBZONE_OVERBASE : 0; @@ -2590,28 +3167,64 @@ zgc_context.running = FALSE; - if (zalloc_debugging(2)) { + if (zalloc_debugging(0)) { tm_t end; tm_now_exact(&end); s_debug("ZGC iterated over %u zones (%u in GC mode) in %u usecs", - (unsigned) hash_table_size(zt), zgc_zone_cnt, + (unsigned) hash_table_size(zt), atomic_uint_get(&zgc_zone_cnt), (unsigned) tm_elapsed_us(&end, &start)); } } #endif /* !REMAP_ZALLOC */ /** - * Initialize zone allocator. + * Called when the main callout queue is idle to run zgc(). */ -G_GNUC_COLD void -zinit(void) +static bool +zalloc_idle_collect(void *unused_data) { - static int initialized; + (void) unused_data; - if G_UNLIKELY(initialized) - return; + zgc(FALSE); + return TRUE; /* Keep calling */ +} + +/** + * Install the periodic idle zgc() call. + */ +static void G_COLD +zalloc_zgc_install(void) +{ + evq_raw_idle_add(zalloc_idle_collect, NULL); +} + +/** + * Called when the VMM layer has been initialized. + */ +void G_COLD +zalloc_long_term(void) +{ + static once_flag_t zalloc_zgc_installed; - initialized = TRUE; + /* + * We wait for the VMM layer to be up before we install the zgc() idle + * callback in an attempt to tweak the self-bootstrapping path. + * + * The GC is now only installed then vmm_set_strategy() is called to + * install a long-term allocation strategy. Hence we know that the VMM + * layer is up. + * --RAM, 2015-12-02 + */ + + once_flag_run(&zalloc_zgc_installed, zalloc_zgc_install); +} + +/** + * Initialize the zone allocator, once. + */ +static void G_COLD +zinit_once(void) +{ addr_grows_upwards = vmm_grows_upwards(); #ifdef TRACK_ZALLOC z_leakset = leak_init(); @@ -2619,9 +3232,20 @@ } /** + * Initialize zone allocator. + */ +void G_COLD +zinit(void) +{ + static once_flag_t initialized; + + ONCE_FLAG_RUN(initialized, zinit_once); +} + +/** * Turn on dynamic memory usage stats collection. */ -G_GNUC_COLD void +void G_COLD zalloc_memusage_init(void) { zone_t **zones; @@ -2649,22 +3273,8 @@ zone_check(zn); - /* - * Allocate the memusage object before locking the zone in case - * the creation of the object re-enters zalloc() for the zone we - * just locked! - */ - if (NULL == zn->zn_mem) { - memusage_t *mu = memusage_alloc("zone", zn->zn_size); - spinlock(&zn->lock); - if (NULL == zn->zn_mem) { - zn->zn_mem = mu; - } else { - memusage_free_null(&mu); - g_assert(memusage_is_valid(zn->zn_mem)); - } - spinunlock(&zn->lock); + zn_memusage_init(zn); } else { g_assert(memusage_is_valid(zn->zn_mem)); } @@ -2676,7 +3286,7 @@ /** * Turn off dynamic memory usage stats collection. */ -G_GNUC_COLD void +void G_COLD zalloc_memusage_close(void) { zone_t **zones; @@ -2702,10 +3312,10 @@ */ if (mu != NULL) { - spinlock(&zn->lock); + zlock(zn); g_assert(zn->zn_mem == mu); zn->zn_mem = NULL; - spinunlock(&zn->lock); + zunlock(zn); memusage_free_null(&mu); } } @@ -2720,20 +3330,25 @@ * * @return TRUE if OK, FALSE if we found no zone with specified size. */ -gboolean +bool zalloc_stack_accounting_ctrl(size_t size, enum zalloc_stack_ctrl op, ...) { zone_t *zone; unsigned hint = 0; - gboolean ok = TRUE; + bool ok = TRUE; va_list args; + zone_t key; if (NULL == zt) return FALSE; - size = adjust_size(size, &hint); + size = zalloc_adjust_size(size, &hint, FALSE); - zone = hash_table_lookup(zt, ulong_to_pointer(size)); + key.zn_size = size; + key.private = FALSE; + key.zn_stid = 0; + + zone = hash_table_lookup(zt, &key); if (NULL == zone) return FALSE; @@ -2748,7 +3363,7 @@ switch (op) { case ZALLOC_SA_SET: { - gboolean on = va_arg(args, gboolean); + bool on = va_arg(args, bool); memusage_set_stack_accounting(zone->zn_mem, on); goto done; } @@ -2776,7 +3391,7 @@ }; /** - * qsort() callback for sorting zonesize items by increasing size. + * xsort() callback for sorting zonesize items by increasing size. */ static int zonesize_cmp(const void *p1, const void *p2) @@ -2796,14 +3411,15 @@ * Hash table iterator -- fill all known zones in an array for sorting. */ static void -zalloc_filler_add(const void *key, void *value, void *data) +zalloc_filler_add(const void *u_key, void *value, void *data) { struct zonesize_filler *filler = data; zone_t *zone = value; struct zonesize *zs; + (void) u_key; + zone_check(zone); - g_assert(pointer_to_ulong(key) == zone->zn_size); g_assert(filler->count < filler->capacity); zs = &filler->arrayfiller->count++; @@ -2832,10 +3448,10 @@ hash_table_lock(zt); zcount = hash_table_size(zt); - fill->array = xmalloc(zcount * sizeof fill->array0); + XMALLOC_ARRAY(fill->array, zcount); while (hash_table_size(zt) != zcount) { zcount = hash_table_size(zt); - fill->array = xrealloc(fill->array, zcount * sizeof fill->array0); + XREALLOC_ARRAY(fill->array, zcount); } fill->capacity = zcount; fill->count = 0; @@ -2850,13 +3466,29 @@ g_assert(fill->count == fill->capacity); - qsort(fill->array, fill->count, sizeof fill->array0, zonesize_cmp); + xqsort(fill->array, fill->count, sizeof fill->array0, zonesize_cmp); +} + +/** + * Generate a SHA1 digest of the current zalloc statistics. + * + * This is meant for dynamic entropy collection. + */ +void +zalloc_stats_digest(sha1_t *digest) +{ + /* + * Don't take locks to read the statistics, to enhance unpredictability. + */ + + ZSTATS_INCX(zalloc_stats_digest); + SHA1_COMPUTE(zstats, digest); } /** * Dump zone status to specified log agent. */ -G_GNUC_COLD void +void G_COLD zalloc_dump_zones_log(logagent_t *la) { struct zonesize_filler filler; @@ -2875,6 +3507,7 @@ zone_t *zone = filler.arrayi.zone; unsigned bcnt, over; size_t remain; + char buf16; bcnt = zone->zn_blocks - zone->zn_cnt; g_assert(uint_is_non_negative(bcnt)); @@ -2894,23 +3527,29 @@ } overhead += over; - log_info(la, "ZALLOC zone(%zu bytes): " - "blocks=%zu, free=%u, %u %zuK-subzone%s, over=%u, %s mode", - zone->zn_size, zone->zn_blocks, bcnt, zone->zn_subzones, + if (zone->private) { + str_bprintf(buf, sizeof buf, ", stid=%u", zone->zn_stid); + } else { + buf0 = 0; + } + + log_info(la, "ZALLOC zone(%zu bytes%s): " + "blocks=%u, free=%u, %u %zuK-subzone%s, over=%u, %s mode", + zone->zn_size, buf, zone->zn_blocks, bcnt, zone->zn_subzones, zone->zn_arena.sz_size / 1024, - 1 == zone->zn_subzones ? "" : "s", over, + plural(zone->zn_subzones), over, zone->zn_gc != NULL ? "GC" : "normal"); } overhead += hash_table_memory(zt); log_info(la, "ZALLOC zones have %zu bytes (%s) free among %zu block%s", - bytes, short_size(bytes, FALSE), blocks, 1 == blocks ? "" : "s"); + bytes, short_size(bytes, FALSE), blocks, plural(blocks)); log_info(la, "ZALLOC zones wasting %zu bytes (%s) among %zu subzone%s " "(%zu page%s)", wasted, short_size(wasted, FALSE), - subzones, 1 == subzones ? "" : "s", zpages, 1 == zpages ? "" : "s"); + subzones, plural(subzones), zpages, plural(zpages)); log_info(la, "ZALLOC zones structural overhead totals %zu bytes (%s)", overhead, short_size(overhead, FALSE)); @@ -2921,7 +3560,7 @@ /** * Dump zalloc() usage stats about zones to specified log agent. */ -G_GNUC_COLD void +void G_COLD zalloc_dump_usage_log(logagent_t *la, unsigned options) { struct zonesize_filler filler; @@ -2950,58 +3589,74 @@ /** * Dump zalloc() statistics to specified log agent. */ -G_GNUC_COLD void +void G_COLD zalloc_dump_stats_log(logagent_t *la, unsigned options) { + struct zstats stats; + bool groupped = booleanize(options & DUMP_OPT_PRETTY); + /* Will be always less than a thousand, ignore pretty-priting */ log_info(la, "ZALLOC zone_count = %s", size_t_to_string(NULL == zt ? 0 : hash_table_size(zt))); + ZSTATS_LOCK; + stats = zstats; /* struct copy under lock protection */ + ZSTATS_UNLOCK; + #define DUMP(x) log_info(la, "ZALLOC %s = %s", #x, \ - (options & DUMP_OPT_PRETTY) ? \ - uint64_to_gstring(zstats.x) : uint64_to_string(zstats.x)) + uint64_to_string_grp(stats.x, groupped)) + +#define DUMP64(x) G_STMT_START { \ + uint64 v = AU64_VALUE(&zstats.x); \ + log_info(la, "ZALLOC %s = %s", #x, \ + uint64_to_string_grp(v, groupped)); \ +} G_STMT_END DUMP(allocations); DUMP(freeings); - DUMP(allocations_gc); - DUMP(freeings_gc); + DUMP(freeings_list); + DUMP(freeings_list_blocks); + DUMP64(allocations_gc); + DUMP64(freeings_gc); DUMP(subzones_allocated); DUMP(subzones_allocated_pages); DUMP(subzones_freed); DUMP(subzones_freed_pages); - DUMP(zmove_attempts); - DUMP(zmove_attempts_gc); - DUMP(zmove_successful_gc); - DUMP(zgc_zones_freed); - DUMP(zgc_zones_defragmented); - DUMP(zgc_fragments_freed); - DUMP(zgc_free_quota_reached); - DUMP(zgc_last_zone_kept); - DUMP(zgc_throttled); - DUMP(zgc_runs); - DUMP(zgc_zone_scans); - DUMP(zgc_scan_freed); + DUMP64(zmove_attempts); + DUMP64(zmove_attempts_gc); + DUMP64(zmove_successful_gc); + DUMP64(zgc_zones_freed); + DUMP64(zgc_zones_defragmented); + DUMP64(zgc_fragments_freed); + DUMP64(zgc_free_quota_reached); + DUMP64(zgc_last_zone_kept); + DUMP64(zgc_runs); + DUMP64(zgc_zone_scans); + DUMP64(zgc_scan_freed); DUMP(zgc_excess_zones_freed); DUMP(zgc_shrinked); /* Will be always less than a thousand, ignore pretty-priting */ - log_info(la, "ZALLOC zgc_zone_count = %u", zgc_zone_cnt); + log_info(la, "ZALLOC zgc_zone_count = %u", atomic_uint_get(&zgc_zone_cnt)); #undef DUMP #define DUMP(x) log_info(la, "ZALLOC %s = %s", #x, \ (options & DUMP_OPT_PRETTY) ? \ - size_t_to_gstring(zstats.x) : size_t_to_string(zstats.x)) + size_t_to_gstring(stats.x) : size_t_to_string(stats.x)) DUMP(user_memory); DUMP(user_blocks); + DUMP64(zalloc_stats_digest); + #undef DUMP +#undef DUMP64 } /** * Dump zalloc() statistics. */ -G_GNUC_COLD void +void G_COLD zalloc_dump_stats(void) { s_info("ZALLOC running statistics:");
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/zalloc.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/zalloc.h
Changed
@@ -34,22 +34,16 @@ #ifndef _zalloc_h_ #define _zalloc_h_ -#include "common.h" +#include "common.h" -/* - * Glib-2.30.2 assumes that all allocated blocks will be aligned on 8 bytes, - * regardless of the memory alignment constraints. Because xmalloc() can - * use walloc() to allocate small blocks, we have to force 8-byte alignment - * for zalloc() as well now. - */ -#define ZALLOC_ALIGNBYTES MAX(8, MEM_ALIGNBYTES) /* 8 at least for glib */ +#define ZALLOC_ALIGNBYTES MEM_ALIGNBYTES /* * Object size rounding. */ #define ZALLOC_MASK (ZALLOC_ALIGNBYTES - 1) #define zalloc_round(s) \ - ((gulong) (((gulong) (s) + ZALLOC_MASK) & ~ZALLOC_MASK)) + ((ulong) (((ulong) (s) + ZALLOC_MASK) & ~ZALLOC_MASK)) struct zone; typedef struct zone zone_t; @@ -58,9 +52,14 @@ * Memory allocation routines. */ -zone_t *zcreate(size_t, unsigned); -zone_t *zget(size_t, unsigned); +zone_t *zcreate(size_t, unsigned, bool); +zone_t *zget(size_t, unsigned, bool); void zdestroy(zone_t *zone); +bool zdestroy_if_empty(zone_t *zone); + +size_t zone_blocksize(const zone_t *zone) G_PURE; +size_t zone_size(const zone_t *zone) G_PURE; +size_t zalloc_overhead(void) G_CONST; /* * Under REMAP_ZALLOC control, those routines are remapped to malloc/free. @@ -76,16 +75,25 @@ #endif /* REMAP_ZALLOC && TRACK_ZALLOC */ struct logagent; +struct pslist; +struct eslist; +struct sha1; -void *zalloc(zone_t *) WARN_UNUSED_RESULT G_GNUC_MALLOC; +void *zalloc(zone_t *) G_MALLOC; void zfree(zone_t *, void *); void *zmove(zone_t *zone, void *p) WARN_UNUSED_RESULT; -void zgc(gboolean overloaded); +void zfree_pslist(zone_t *, struct pslist *); +void zfree_eslist(zone_t *zone, struct eslist *el); +void zgc(bool overloaded); +void zalloc_long_term(void); + +void zalloc_stats_digest(struct sha1 *digest); void zinit(void); void zclose(void); -void set_zalloc_debug(guint32 level); -void set_zalloc_always_gc(gboolean val); +void zalloc_vmm_inited(void); +void set_zalloc_debug(uint32 level); +void set_zalloc_always_gc(bool val); void zalloc_memusage_init(void); void zalloc_memusage_close(void); void zalloc_dump_stats(void); @@ -100,8 +108,7 @@ ZALLOC_SA_MAX }; -gboolean zalloc_stack_accounting_ctrl(size_t size, - enum zalloc_stack_ctrl op, ...); +bool zalloc_stack_accounting_ctrl(size_t size, enum zalloc_stack_ctrl op, ...); #ifdef TRACK_ZALLOC
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/zlib_util.c -> gtk-gnutella-1.1.9.tar.bz2/src/lib/zlib_util.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2003, Raphael Manfredi + * Copyright (c) 2002-2003, 2012 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -25,10 +25,10 @@ * @ingroup lib * @file * - * Zlib wrapper functions. + * Zlib wrapper functions and utilities. * * @author Raphael Manfredi - * @date 2002-2003 + * @date 2002-2003, 2012 */ #include "common.h" @@ -39,11 +39,133 @@ #include "glib-missing.h" #include "misc.h" #include "halloc.h" +#include "unsigned.h" #include "walloc.h" #include "override.h" /* Must be the last header included */ #define OUT_GROW 1024 /**< To grow output buffer if it's to short */ +enum zlib_stream_magic { + ZLIB_DEFLATER_MAGIC = 0x22a22f45, + ZLIB_INFLATER_MAGIC = 0x49ad00b4 +}; + +/** + * The zlib stream wrapper. + */ +typedef struct zlib_stream { + enum zlib_stream_magic magic; + const void *in; /**< Buffer being compressed */ + size_t inlen; /**< Length of input buffer */ + void *out; /**< Compressed data */ + size_t outlen; /**< Length of ouput buffer */ + size_t inlen_total; /**< Total input length seen */ + z_streamp z; /**< The underlying zlib stream */ + uint allocated:1; /**< Was output buffer allocated or static? */ + uint closed:1; /**< Whether the stream was closed */ +} zlib_stream_t; + +/** + * Incremental deflater stream. + */ +struct zlib_deflater { + struct zlib_stream zs; +}; + +static inline void +zlib_deflater_check(const struct zlib_deflater * const zd) +{ + g_assert(zd != NULL); + g_assert(ZLIB_DEFLATER_MAGIC == zd->zs.magic); +} + +/** + * Re-usable inflater stream (across messages). + */ +struct zlib_inflater { + struct zlib_stream zs; + size_t maxoutlen; /**< Upper limit for inflation (0 = unlimited) */ +}; + +static inline void +zlib_inflater_check(const struct zlib_inflater * const zi) +{ + g_assert(zi != NULL); + g_assert(ZLIB_INFLATER_MAGIC == zi->zs.magic); +} + +void * +zlib_deflater_out(const struct zlib_deflater *zd) +{ + zlib_deflater_check(zd); + return zd->zs.out; +} + +int +zlib_deflater_outlen(const struct zlib_deflater *zd) +{ + zlib_deflater_check(zd); + g_assert(zd->zs.closed); + return zd->zs.outlen; +} + +int +zlib_deflater_inlen(const struct zlib_deflater *zd) +{ + zlib_deflater_check(zd); + return zd->zs.inlen_total; +} + +bool +zlib_deflater_closed(const struct zlib_deflater *zd) +{ + zlib_deflater_check(zd); + return zd->zs.closed; +} + +void * +zlib_inflater_out(const struct zlib_inflater *zi) +{ + zlib_inflater_check(zi); + return zi->zs.out; +} + +int +zlib_inflater_outlen(const struct zlib_inflater *zi) +{ + zlib_inflater_check(zi); + g_assert(zi->zs.closed); + return zi->zs.outlen; +} + +int +zlib_inflater_inlen(const struct zlib_inflater *zi) +{ + zlib_inflater_check(zi); + return zi->zs.inlen_total; +} + +size_t +zlib_inflater_maxoutlen(const struct zlib_inflater *zi) +{ + zlib_inflater_check(zi); + return zi->maxoutlen; +} + +void +zlib_inflater_set_maxoutlen(struct zlib_inflater *zi, size_t len) +{ + zlib_inflater_check(zi); + zi->maxoutlen = len; +} + +bool +zlib_inflater_closed(const struct zlib_inflater *zi) +{ + zlib_inflater_check(zi); + return zi->zs.closed; +} + /** * Maps the given error code to an error message. * @@ -68,8 +190,8 @@ return "Invalid error code"; } -gpointer -zlib_alloc_func(gpointer unused_opaque, guint n, guint m) +void * +zlib_alloc_func(void *unused_opaque, uint n, uint m) { (void) unused_opaque; @@ -81,13 +203,81 @@ } void -zlib_free_func(gpointer unused_opaque, gpointer p) +zlib_free_func(void *unused_opaque, void *p) { (void) unused_opaque; hfree(p); } /** + * Initialize internal state for our incremental zlib stream. + * + * @param zs the zlib stream structure to initialize + * @param data input data to process; if NULL, will be incrementally given + * @param len length of data to process (if data not NULL) or estimation + * @param dest where processed data should go, or NULL if allocated + * @param destlen length of supplied output buffer, if dest != NULL + */ +static void +zlib_stream_init(zlib_stream_t *zs, + const void *data, size_t len, void *dest, size_t destlen) +{ + z_streamp z; + + g_assert(size_is_non_negative(len)); + g_assert(size_is_non_negative(destlen)); + + zs->in = data; + zs->inlen = data ? len : 0; + zs->inlen_total = zs->inlen; + + /* + * When deflating zlib requires normally 0.1% more + 12 bytes, we use + * 0.5% to be safe. + * + * When inflating, assume we'll double the input at least. + */ + + if (NULL == dest) { + /* Processed data go to a dynamically allocated buffer */ + if (!zs->allocated) { + if (data == NULL && len == 0) + len = 512; + + if (ZLIB_DEFLATER_MAGIC == zs->magic) { + zs->outlen = (len * 1.005 + 12.0); + g_assert(zs->outlen > len); + g_assert(zs->outlen - len >= 12); + } else { + zs->outlen = UNSIGNED(len) * 2; + } + + zs->out = halloc(zs->outlen); + zs->allocated = TRUE; + } + } else { + /* Processed data go to a supplied buffer, not-resizable */ + if (zs->allocated) + hfree(zs->out); + zs->out = dest; + zs->outlen = destlen; + zs->allocated = FALSE; + } + + /* + * Initialize Z stream. + */ + + z = zs->z; + g_assert(z != NULL); /* Stream not closed yet */ + + z->next_out = zs->out; + z->avail_out = zs->outlen; + z->next_in = deconstify_pointer(zs->in); + z->avail_in = 0; /* Will be set by zlib_xxx_step() */ +} + +/** * Creates an incremental zlib deflater for `len' bytes starting at `data', * with specified compression `level'. * @@ -101,14 +291,14 @@ */ static zlib_deflater_t * zlib_deflater_alloc( - gconstpointer data, int len, gpointer dest, int destlen, int level) + const void *data, size_t len, void *dest, size_t destlen, int level) { zlib_deflater_t *zd; z_streamp outz; int ret; - g_assert(len >= 0); - g_assert(destlen >= 0); + g_assert(size_is_non_negative(len)); + g_assert(size_is_non_negative(destlen)); g_assert(level == Z_DEFAULT_COMPRESSION || (level >= 0 && level <= 9)); WALLOC(outz); @@ -120,184 +310,390 @@ if (ret != Z_OK) { WFREE(outz); - g_carp("unable to initialize compressor: %s", zlib_strerror(ret)); + g_carp("%s(): unable to initialize compressor: %s", + G_STRFUNC, zlib_strerror(ret)); return NULL; } - WALLOC(zd); - zd->opaque = outz; - zd->closed = FALSE; - - zd->in = data; - zd->inlen = data ? len : 0; - zd->inlen_total = zd->inlen; - - /* - * zlib requires normally 0.1% more + 12 bytes, we use 0.5% to be safe. - * - * NB: strictly speaking, we shouldn't need to store this information - * here, we could rely on the information in the Z stream. However, to - * be able to inspect what's going on and add assertions, let's be - * redundant. - */ + WALLOC0(zd); + zd->zs.magic = ZLIB_DEFLATER_MAGIC; + zd->zs.z = outz; + zd->zs.closed = FALSE; - if (dest == NULL) { - /* Compressed data go to a dynamically allocated buffer */ - if (data == NULL && len == 0) - len = 512; - - zd->outlen = (unsigned) (UNSIGNED(len) * 1.005 + 12.0); - g_assert(zd->outlen > len); - g_assert(zd->outlen - len >= 12); - - zd->out = halloc(zd->outlen); - zd->allocated = TRUE; - } else { - /* Compressed data go to a supplied buffer, not-resizable */ - zd->out = dest; - zd->outlen = destlen; - zd->allocated = FALSE; - } - - /* - * Initialize Z stream. - */ - - outz->next_out = zd->out; - outz->avail_out = zd->outlen; - outz->next_in = deconstify_gpointer(zd->in); - outz->avail_in = 0; /* Will be set by zlib_deflate_step() */ + zlib_stream_init(&zd->zs, data, len, dest, destlen); return zd; } /** - * Creates an incremental zlib deflater for `len' bytes starting at `data', - * with specified compression `level'. Data will be compressed into a - * dynamically allocated buffer, resized as needed. + * Reset an incremental zlib stream. * - * If `data' is NULL, data to compress will have to be fed to the deflater - * via zlib_deflate_data() calls. Otherwise, calls to zlib_deflate() will - * incrementally compress the initial buffer. + * The compression parameters remain the same as the ones used when the + * deflater was initially created. Only the input/output settings change. * - * @return new deflater, or NULL if error. + * @param zd the zlib deflater to reset + * @param data data to compress; if NULL, will be incrementally given + * @param len length of data to compress (if data not NULL) or estimation + * @param dest where compressed data should go, or NULL if allocated + * @param destlen length of supplied output buffer, if dest != NULL */ -zlib_deflater_t * -zlib_deflater_make(gconstpointer data, int len, int level) +static void +zlib_stream_reset_into(zlib_stream_t *zs, + const void *data, size_t len, void *dest, size_t destlen) { - return zlib_deflater_alloc(data, len, NULL, 0, level); + g_assert(zs->z != NULL); /* Stream not closed yet */ + + zs->closed = FALSE; + switch (zs->magic) { + case ZLIB_INFLATER_MAGIC: + inflateReset(zs->z); + break; + case ZLIB_DEFLATER_MAGIC: + deflateReset(zs->z); + break; + } + zlib_stream_init(zs, data, len, dest, destlen); } /** - * Creates an incremental zlib deflater for `len' bytes starting at `data', - * with specified compression `level'. Data will be compressed into the - * supplied buffer starting at `dest'. + * Attempt to grow the output buffer. * - * If `data' is NULL, data to compress will have to be fed to the deflater - * via zlib_deflate_data() calls. Otherwise, calls to zlib_deflate() will - * incrementally compress the initial buffer. + * @param zs the zlib stream object + * @param maxout maximum length of dynamically-allocated buffer (0 = none) * - * @return new deflater, or NULL if error. + * @return TRUE if we can resume processing after the output buffer was + * expanded, FALSE if the buffer cannot be expanded (not dynamically allocated + * or reached the maximum size). */ -zlib_deflater_t * -zlib_deflater_make_into( - gconstpointer data, int len, gpointer dest, int destlen, int level) +static bool +zlib_stream_grow_output(zlib_stream_t *zs, size_t maxout) { - return zlib_deflater_alloc(data, len, dest, destlen, level); + if (zs->allocated) { + z_streamp z = zs->z; + + /* + * Limit growth if asked to do so. + * + * This is used when inflating, usually, to avoid being given a small + * amount of data that will expand into megabytes... + */ + + if (maxout != 0 && zs->outlen >= maxout) { + g_warning("%s(): reached maximum buffer size (%zu bytes): " + "input=%zu, output=%zu", + G_STRFUNC, maxout, zs->inlen, zs->outlen); + return FALSE; /* Cannot continue */ + } + + zs->outlen += OUT_GROW; + zs->out = hrealloc(zs->out, zs->outlen); + z->next_out = ptr_add_offset(zs->out, zs->outlen - OUT_GROW); + z->avail_out = OUT_GROW; + return TRUE; /* Can process remaining input */ + } + + g_warning("%s(): under-estimated output buffer size: " + "input=%zu, output=%zu", G_STRFUNC, zs->inlen, zs->outlen); + + return FALSE; /* Cannot continue */ } /** - * Incrementally deflate more data. + * Incrementally process more data. * - * @param zd the deflator object - * @param amount amount of data to deflate + * @param zs the zlib stream object + * @param amount amount of data to process + * @param maxout maximum length of dynamically-allocated buffer (0 = none) * @param may_close whether to allow closing when all data was consumed + * @param finish whether this is the last data to process * * @return -1 on error, 1 if work remains, 0 when done. */ static int -zlib_deflate_step(zlib_deflater_t *zd, int amount, gboolean may_close) +zlib_stream_process_step(zlib_stream_t *zs, int amount, size_t maxout, + bool may_close, bool finish) { - z_streamp outz = zd->opaque; + z_streamp z; int remaining; int process; - gboolean finishing; - int ret; + bool finishing; + int ret = 0; g_assert(amount > 0); - g_assert(!zd->closed); - g_assert(outz != NULL); /* Stream not closed yet */ + g_assert(!zs->closed); + + z = zs->z; + g_assert(z != NULL); /* Stream not closed yet */ /* * Compute amount of input data to process. */ - remaining = zd->inlen - ((char *) outz->next_in - (char *) zd->in); + remaining = zs->inlen - ptr_diff(z->next_in, zs->in); g_assert(remaining >= 0); process = MIN(remaining, amount); - finishing = process == remaining && may_close; + finishing = process == remaining; /* * Process data. */ - outz->avail_in = process; + z->avail_in = process; - ret = deflate(outz, finishing ? Z_FINISH : 0); +resume: + switch (zs->magic) { + case ZLIB_DEFLATER_MAGIC: + ret = deflate(z, finishing && finish ? Z_FINISH : 0); + break; + case ZLIB_INFLATER_MAGIC: + ret = inflate(z, Z_SYNC_FLUSH); + break; + } switch (ret) { case Z_OK: - if (outz->avail_out == 0) { - g_carp("under-estimated output buffer size: input=%d, output=%d", - zd->inlen, zd->outlen); - - if (zd->allocated) { - zd->outlen += OUT_GROW; - zd->out = hrealloc(zd->out, zd->outlen); - outz->next_out = (guchar *) zd->out + (zd->outlen - OUT_GROW); - outz->avail_out = OUT_GROW; - } else - goto error; /* Cannot continue */ + if (0 == z->avail_out) { + if (zlib_stream_grow_output(zs, maxout)) + goto resume; /* Process remaining input */ + goto error; /* Cannot continue */ } - return 1; /* Need to call us again */ /* NOTREACHED */ - case Z_STREAM_END: - g_assert(finishing); - - zd->outlen = (char *) outz->next_out - (char *) zd->out; - g_assert(zd->outlen > 0); + case Z_BUF_ERROR: /* Output full or need more input to continue */ + if (0 == z->avail_out) { + if (zlib_stream_grow_output(zs, maxout)) + goto resume; /* Process remaining input */ + goto error; /* Cannot continue */ + } + if (0 == z->avail_in) + return 1; /* Need to call us again */ + goto error; /* Cannot continue */ + /* NOTREACHED */ - ret = deflateEnd(outz); - if (ret != Z_OK) - g_carp("while freeing compressor: %s", zlib_strerror(ret)); + case Z_STREAM_END: /* Reached end of input stream */ + g_assert(finishing); - WFREE(outz); - zd->opaque = NULL; - zd->closed = TRUE; + /* + * Supersede the output length to let them probe how much data + * was processed once the stream is closed, through calls to + * zlib_deflater_outlen() or zlib_inflater_outlen(). + */ + + zs->outlen = ptr_diff(z->next_out, zs->out); + g_assert(zs->outlen > 0); + + if (may_close) { + switch (zs->magic) { + case ZLIB_DEFLATER_MAGIC: + ret = deflateEnd(z); + break; + case ZLIB_INFLATER_MAGIC: + ret = inflateEnd(z); + break; + } + + if (ret != Z_OK) { + g_carp("%s(): while freeing zstream: %s", + G_STRFUNC, zlib_strerror(ret)); + } + WFREE(z); + zs->z = NULL; + } + zs->closed = TRUE; /* Signals processing stream done */ return 0; /* Done */ /* NOTREACHED */ default: - g_carp("error during compression: %s", zlib_strerror(ret)); + break; } /* FALL THROUGH */ error: - ret = deflateEnd(outz); - if (ret != Z_OK && ret != Z_DATA_ERROR) - g_carp("while freeing compressor: %s", zlib_strerror(ret)); - WFREE(outz); - zd->opaque = NULL; + g_carp("%s(): error during %scompression: %s " + "(avail_in=%u, avail_out=%u, total_in=%lu, total_out=%lu)", + G_STRFUNC, ZLIB_DEFLATER_MAGIC == zs->magic ? "" : "de", + zlib_strerror(ret), + z->avail_in, z->avail_out, z->total_in, z->total_out); + + if (may_close) { + switch (zs->magic) { + case ZLIB_DEFLATER_MAGIC: + ret = deflateEnd(z); + break; + case ZLIB_INFLATER_MAGIC: + ret = inflateEnd(z); + break; + } + if (ret != Z_OK && ret != Z_DATA_ERROR) { + g_carp("%s(): while freeing stream: %s", + G_STRFUNC, zlib_strerror(ret)); + } + WFREE(z); + zs->z = NULL; + } return -1; /* Error! */ } /** + * Process the data supplied, but do not close the stream when all the + * data have been handled. Needs to call zlib_deflate_close() for that + * when deflating. + * + * @return -1 on error, 1 if work remains, 0 when done. + */ +static int +zlib_stream_process_data(zlib_stream_t *zs, const void *data, int len, + size_t maxout, bool final) +{ + z_streamp z; + + g_assert(len >= 0); + + z = zs->z; + g_assert(z != NULL); /* Stream not closed yet */ + + if G_UNLIKELY(0 == len) + return zs->closed ? 0 : 1; + + zs->in = data; + zs->inlen = len; + zs->inlen_total += len; + + z->next_in = deconstify_pointer(zs->in); + z->avail_in = 0; /* Will be set by zlib_stream_process_step() */ + + return zlib_stream_process_step(zs, len, maxout, FALSE, final); +} + +/** + * Dispose of the incremental stream processor. + * If `output' is true, also free the output buffer. + */ +static void +zlib_stream_free(zlib_stream_t *zs, bool output) +{ + z_streamp z; + + z = zs->z; + + if (z != NULL) { + int ret = 0; + + switch (zs->magic) { + case ZLIB_DEFLATER_MAGIC: + ret = deflateEnd(z); + break; + case ZLIB_INFLATER_MAGIC: + ret = inflateEnd(z); + break; + } + + if (ret != Z_OK && ret != Z_DATA_ERROR) { + g_carp("%s(): while freeing stream: %s", + G_STRFUNC, zlib_strerror(ret)); + } + WFREE(z); + } + + if (output && zs->allocated) + HFREE_NULL(zs->out); +} + +/** + * Reset an incremental zlib deflater. + * + * The compression parameters remain the same as the ones used when the + * deflater was initially created. Only the input/output settings change. + * + * @param zd the zlib deflater to reset + * @param data data to compress; if NULL, will be incrementally given + * @param len length of data to compress (if data not NULL) or estimation + * @param dest where compressed data should go, or NULL if allocated + * @param destlen length of supplied output buffer, if dest != NULL + */ +void +zlib_deflater_reset_into(zlib_deflater_t *zd, + const void *data, int len, void *dest, int destlen) +{ + zlib_deflater_check(zd); + zlib_stream_reset_into(&zd->zs, data, len, dest, destlen); +} + +/** + * Reset an incremental zlib deflater whose output goes to a dynamically + * allocated message. + * + * The compression parameters remain the same as the ones used when the + * deflater was initially created. Only the input/output settings change. + * + * @param zd the zlib deflater to reset + * @param data data to compress; if NULL, will be incrementally given + * @param len length of data to compress (if data not NULL) or estimation + */ +void +zlib_deflater_reset(zlib_deflater_t *zd, const void *data, int len) +{ + zlib_deflater_check(zd); + zlib_stream_reset_into(&zd->zs, data, len, NULL, 0); +} + +/** + * Creates an incremental zlib deflater for `len' bytes starting at `data', + * with specified compression `level'. Data will be compressed into a + * dynamically allocated buffer, resized as needed. + * + * If `data' is NULL, data to compress will have to be fed to the deflater + * via zlib_deflate_data() calls. Otherwise, calls to zlib_deflate() will + * incrementally compress the initial buffer. + * + * @return new deflater, or NULL if error. + */ +zlib_deflater_t * +zlib_deflater_make(const void *data, int len, int level) +{ + return zlib_deflater_alloc(data, len, NULL, 0, level); +} + +/** + * Creates an incremental zlib deflater for `len' bytes starting at `data', + * with specified compression `level'. Data will be compressed into the + * supplied buffer starting at `dest'. + * + * If `data' is NULL, data to compress will have to be fed to the deflater + * via zlib_deflate_data() calls. Otherwise, calls to zlib_deflate() will + * incrementally compress the initial buffer. + * + * @return new deflater, or NULL if error. + */ +zlib_deflater_t * +zlib_deflater_make_into( + const void *data, int len, void *dest, int destlen, int level) +{ + return zlib_deflater_alloc(data, len, dest, destlen, level); +} + +/** + * Incrementally deflate more data. + * + * @param zd the deflator object + * @param amount amount of data to deflate + * @param may_close whether to allow closing when all data was consumed + * + * @return -1 on error, 1 if work remains, 0 when done. + */ +int +zlib_deflate_step(zlib_deflater_t *zd, int amount, bool may_close) +{ + zlib_deflater_check(zd); + return zlib_stream_process_step(&zd->zs, amount, 0, may_close, TRUE); +} + +/** * Incrementally deflate more data, the `amount' specified. * When all the data have been compressed, the stream is closed. * @@ -310,55 +706,75 @@ } /** - * Deflate the data supplied, but do not close the stream when all the - * data have been compressed. Needs to call zlib_deflate_close() for that. + * Deflate all the data supplied during zlib_deflater_reset(). * - * @returns TRUE if OK, FALSE on error. + * @return -1 on error, 0 when done. */ -gboolean -zlib_deflate_data(zlib_deflater_t *zd, gconstpointer data, int len) +int +zlib_deflate_all(zlib_deflater_t *zd) { - z_streamp outz = zd->opaque; + int ret; - g_assert(outz != NULL); /* Stream not closed yet */ - g_assert(len >= 0); + zlib_deflater_check(zd); + g_assert(zd->zs.in != NULL); /* Data to deflate supplied */ - if G_UNLIKELY(0 == len) - return TRUE; + ret = zlib_stream_process_step(&zd->zs, zd->zs.inlen, 0, FALSE, TRUE); - zd->in = data; - zd->inlen = len; - zd->inlen_total += len; + g_assert(ret != 1); /* Must have processed the whole input */ - outz->next_in = deconstify_gpointer(zd->in); - outz->avail_in = 0; /* Will be set by zlib_deflate_step() */ + return ret; +} - return zlib_deflate_step(zd, len, FALSE) > 0 ? TRUE : FALSE; +/** + * Deflate the data supplied, but do not close the stream when all the + * data have been compressed. Needs to call zlib_deflate_close() for that. + * + * When ``final'' is set, this is going to be the last data in the stream, + * so we must flush the whole compression state. + * + * @returns TRUE if OK, FALSE on error. + */ +bool +zlib_deflate_data(zlib_deflater_t *zd, const void *data, int len, bool final) +{ + zlib_deflater_check(zd); + return booleanize( + zlib_stream_process_data(&zd->zs, data, len, 0, final) > 0); } /** - * Marks the end of the data: flush the stream and close. + * Marks the end of the data: flush the stream and close (no further data can + * be given until a reset). + * + * This does NOT free the underlying zstream, which can be reset to restart + * another deflation. To free everything, call zlib_deflater_free(). * * @returns TRUE if OK, FALSE on error. */ -gboolean +bool zlib_deflate_close(zlib_deflater_t *zd) { - z_streamp outz = zd->opaque; + z_streamp outz; + zlib_stream_t *zs; + int ret; - g_assert(!zd->closed); + zlib_deflater_check(zd); + + zs = &zd->zs; + g_assert(!zs->closed); + + outz = zs->z; g_assert(outz != NULL); /* Stream not closed yet */ - zd->in = NULL; - zd->inlen = 0; + zs->in = NULL; + zs->inlen = 0; - outz->next_in = deconstify_gpointer(zd->in); + outz->next_in = deconstify_pointer(zs->in); outz->avail_in = 0; - ret = zlib_deflate_step(zd, 1, TRUE) == 0 ? TRUE : FALSE; - - zd->closed = TRUE; /* Even if there was an error */ + ret = booleanize(0 == zlib_stream_process_step(zs, 1, 0, FALSE, TRUE)); + zs->closed = TRUE; /* Even if there was an error */ return ret; } @@ -368,22 +784,12 @@ * If `output' is true, also free the output buffer. */ void -zlib_deflater_free(zlib_deflater_t *zd, gboolean output) +zlib_deflater_free(zlib_deflater_t *zd, bool output) { - z_streamp outz = zd->opaque; + zlib_deflater_check(zd); - if (outz) { - int ret = deflateEnd(outz); - - if (ret != Z_OK && ret != Z_DATA_ERROR) - g_carp("while freeing compressor: %s", zlib_strerror(ret)); - - WFREE(outz); - } - - if (output && zd->allocated) { - HFREE_NULL(zd->out); - } + zlib_stream_free(&zd->zs, output); + zd->zs.magic = 0; WFREE(zd); } @@ -393,12 +799,12 @@ * @return allocated uncompressed data via halloc() if OK, NULL on error. * Use hfree() to free the data. */ -gpointer -zlib_uncompress(gconstpointer data, int len, gulong uncompressed_len) +void * +zlib_uncompress(const void *data, int len, ulong uncompressed_len) { int ret; - guchar *out = halloc(uncompressed_len); - gulong retlen = uncompressed_len; + uchar *out = halloc(uncompressed_len); + ulong retlen = uncompressed_len; g_return_val_if_fail(uncompressed_len != 0, NULL); @@ -406,12 +812,12 @@ if (ret == Z_OK) { if (retlen != uncompressed_len) - g_carp("expected %lu bytes of decompressed data, got %ld", - uncompressed_len, retlen); + g_carp("%s(): expected %lu bytes of decompressed data, got %ld", + G_STRFUNC, uncompressed_len, retlen); return out; } - g_carp("while decompressing data: %s", zlib_strerror(ret)); + g_carp("%s(): while decompressing data: %s", G_STRFUNC, zlib_strerror(ret)); HFREE_NULL(out); return NULL; @@ -429,7 +835,7 @@ * @return zlib's status: Z_OK on OK, error code otherwise. */ int -zlib_inflate_into(gconstpointer data, int len, gpointer out, int *outlen) +zlib_inflate_into(const void *data, int len, void *out, int *outlen) { z_streamp inz; int ret; @@ -453,7 +859,8 @@ ret = inflateInit(inz); if (ret != Z_OK) { - g_carp("unable to setup decompressor: %s", zlib_strerror(ret)); + g_carp("%s(): unable to setup decompressor: %s", + G_STRFUNC, zlib_strerror(ret)); goto done; } @@ -461,7 +868,7 @@ * Prepare call to inflate(). */ - inz->next_in = deconstify_gpointer(data); + inz->next_in = deconstify_pointer(data); inz->avail_in = len; inz->next_out = out; @@ -493,13 +900,168 @@ } /** + * Reset an incremental zlib inflater. + * + * @param zi the zlib inflater to reset + * @param data data to inflate; if NULL, will be incrementally given + * @param len length of data to inflate (if data not NULL) or estimation + * @param dest where inflated data should go, or NULL if allocated + * @param destlen length of supplied output buffer, if dest != NULL + */ +void +zlib_inflater_reset_into(zlib_inflater_t *zi, + const void *data, int len, void *dest, int destlen) +{ + zlib_inflater_check(zi); + zlib_stream_reset_into(&zi->zs, data, len, dest, destlen); +} + +/** + * Reset an incremental zlib inflater whose output goes to a dynamically + * allocated message. + * + * @param zi the zlib inflater to reset + * @param data data to inflate; if NULL, will be incrementally given + * @param len length of data to inflate (if data not NULL) or estimation + */ +void +zlib_inflater_reset(zlib_inflater_t *zi, const void *data, int len) +{ + zlib_inflater_check(zi); + zlib_stream_reset_into(&zi->zs, data, len, NULL, 0); +} + +/** + * Creates an incremental zlib inflater for `len' bytes starting at `data'. + * + * @param data data to inflate; if NULL, will be incrementally given + * @param len length of data to infalte (if data not NULL) or estimation + * @param dest where inflated data should go, or NULL if allocated + * @param destlen length of supplied output buffer, if dest != NULL + * + * @return new infalter, or NULL if error. + */ +static zlib_inflater_t * +zlib_inflater_alloc( + const void *data, int len, void *dest, int destlen) +{ + zlib_inflater_t *zi; + z_streamp inz; + int ret; + + g_assert(len >= 0); + g_assert(destlen >= 0); + + WALLOC(inz); + inz->zalloc = zlib_alloc_func; + inz->zfree = zlib_free_func; + inz->opaque = NULL; + + ret = inflateInit(inz); + + if (ret != Z_OK) { + WFREE(inz); + g_carp("%s(): unable to initialize decompressor: %s", + G_STRFUNC, zlib_strerror(ret)); + return NULL; + } + + WALLOC0(zi); + zi->zs.magic = ZLIB_INFLATER_MAGIC; + zi->zs.z = inz; + zi->zs.closed = FALSE; + + zlib_stream_init(&zi->zs, data, len, dest, destlen); + + return zi; +} + +/** + * Creates an incremental zlib inflater for `len' bytes starting at `data'. + * Data will be inflated into a dynamically allocated buffer, resized as needed. + * + * If `data' is NULL, data to inflate will have to be fed to the inflater + * via zlib_inflate_data() calls. Otherwise, calls to zlib_inflate() will + * incrementally inflate the initial buffer. + * + * @return new inflater, or NULL if error. + */ +zlib_inflater_t * +zlib_inflater_make(const void *data, int len) +{ + return zlib_inflater_alloc(data, len, NULL, 0); +} + +/** + * Creates an incremental zlib inflater for `len' bytes starting at `data', + * Data will be inflated into the supplied buffer starting at `dest'. + * + * If `data' is NULL, data to inflate will have to be fed to the inflater + * via zlib_inflate_data() calls. Otherwise, calls to zlib_inflate() will + * incrementally inflate the initial buffer. + * + * @return new inflater, or NULL if error. + */ +zlib_inflater_t * +zlib_inflater_make_into( + const void *data, int len, void *dest, int destlen) +{ + return zlib_inflater_alloc(data, len, dest, destlen); +} + +/** + * Incrementally inflate more data. + * + * @param zi the inflator object + * @param amount amount of data to inflate + * @param may_close whether to allow closing when all data was consumed + * + * @return -1 on error, 1 if work remains, 0 when done. + */ +int +zlib_inflate_step(zlib_inflater_t *zi, int amount, bool may_close) +{ + zlib_inflater_check(zi); + return zlib_stream_process_step(&zi->zs, amount, zi->maxoutlen, + may_close, FALSE /* Does not matter when inflating */); +} + +/** + * Inflate the data supplied, but do not close the stream when all the + * data have been inflated. + * + * @return -1 on error, 1 if work remains, 0 when done. + */ +int +zlib_inflate_data(zlib_inflater_t *zi, const void *data, int len) +{ + zlib_inflater_check(zi); + return zlib_stream_process_data(&zi->zs, data, len, zi->maxoutlen, + FALSE /* Does not matter when inflating*/); +} + +/** + * Dispose of the incremental inflater. + * If `output' is true, also free the output buffer. + */ +void +zlib_inflater_free(zlib_inflater_t *zi, bool output) +{ + zlib_inflater_check(zi); + + zlib_stream_free(&zi->zs, output); + zi->zs.magic = 0; + WFREE(zi); +} + +/** * Check whether first bytes of data make up a valid zlib marker. */ -gboolean -zlib_is_valid_header(gconstpointer data, int len) +bool +zlib_is_valid_header(const void *data, int len) { - const guchar *p = data; - guint16 check; + const uchar *p = data; + uint16 check; if (len < 2) return FALSE; @@ -538,7 +1100,7 @@ check = (p0 << 8) | p1; - return (0 == check % 31) ? TRUE : FALSE; + return booleanize(0 == check % 31); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/lib/zlib_util.h -> gtk-gnutella-1.1.9.tar.bz2/src/lib/zlib_util.h
Changed
@@ -36,24 +36,11 @@ #include "common.h" -/** - * Incremental deflater stream. - */ -typedef struct { - gconstpointer in; /**< Buffer being compressed */ - int inlen; /**< Length of input buffer */ - gpointer out; /**< Compressed data */ - int outlen; /**< Length of ouput buffer */ - int inlen_total; /**< Total input length seen */ - gpointer opaque; /**< Internal data structures */ - gboolean allocated; /**< Whether output buffer was allocated or static */ - gboolean closed; /**< Whether the stream was closed */ -} zlib_deflater_t; - -#define zlib_deflater_out(z) ((z)->out) -#define zlib_deflater_outlen(z) ((z)->outlen) -#define zlib_deflater_inlen(z) ((z)->inlen_total) -#define zlib_deflater_closed(z) ((z)->closed) +struct zlib_deflater; +typedef struct zlib_deflater zlib_deflater_t; + +struct zlib_inflater; +typedef struct zlib_inflater zlib_inflater_t; /* * Public interface. @@ -61,20 +48,50 @@ const char *zlib_strerror(int errnum); -zlib_deflater_t *zlib_deflater_make(gconstpointer data, int len, int level); +zlib_deflater_t *zlib_deflater_make(const void *data, int len, int level); zlib_deflater_t *zlib_deflater_make_into( - gconstpointer data, int len, gpointer dest, int destlen, int level); + const void *data, int len, void *dest, int destlen, int level); int zlib_deflate(zlib_deflater_t *zd, int amount); -gboolean zlib_deflate_data(zlib_deflater_t *zd, gconstpointer data, int len); -gboolean zlib_deflate_close(zlib_deflater_t *zd); -void zlib_deflater_free(zlib_deflater_t *zd, gboolean output); +int zlib_deflate_all(zlib_deflater_t *zd); +int zlib_deflate_step(zlib_deflater_t *zd, int amount, bool may_close); +bool zlib_deflate_data(zlib_deflater_t *zd, + const void *data, int len, bool final); +bool zlib_deflate_close(zlib_deflater_t *zd); +void zlib_deflater_free(zlib_deflater_t *zd, bool output); +void zlib_deflater_reset(zlib_deflater_t *zd, const void *data, int len); +void zlib_deflater_reset_into(zlib_deflater_t *zd, + const void *data, int len, void *dest, int destlen); + +bool zlib_deflater_closed(const struct zlib_deflater *zd); +int zlib_deflater_inlen(const struct zlib_deflater *zd); +int zlib_deflater_outlen(const struct zlib_deflater *zd); +void *zlib_deflater_out(const struct zlib_deflater *zd); + +zlib_inflater_t *zlib_inflater_make(const void *data, int len); +zlib_inflater_t *zlib_inflater_make_into( + const void *data, int len, void *dest, int destlen); +int zlib_inflate(zlib_inflater_t *zi, int amount); +int zlib_inflate_step(zlib_inflater_t *zi, int amount, bool may_close); +int zlib_inflate_data(zlib_inflater_t *zi, const void *data, int len); +bool zlib_inflate_close(zlib_inflater_t *zi); +void zlib_inflater_free(zlib_inflater_t *zi, bool output); +void zlib_inflater_reset(zlib_inflater_t *zi, const void *data, int len); +void zlib_inflater_reset_into(zlib_inflater_t *zi, + const void *data, int len, void *dest, int destlen); + +bool zlib_inflater_closed(const struct zlib_inflater *zi); +int zlib_inflater_inlen(const struct zlib_inflater *zi); +int zlib_inflater_outlen(const struct zlib_inflater *zi); +void *zlib_inflater_out(const struct zlib_inflater *zi); +size_t zlib_inflater_maxoutlen(const struct zlib_inflater *zi); +void zlib_inflater_set_maxoutlen(struct zlib_inflater *zi, size_t len); -gpointer zlib_uncompress(gconstpointer data, int len, gulong uncompressed_len); -int zlib_inflate_into(gconstpointer data, int len, gpointer out, int *outlen); -gboolean zlib_is_valid_header(gconstpointer data, int len); +void *zlib_uncompress(const void *data, int len, ulong uncompressed_len); +int zlib_inflate_into(const void *data, int len, void *out, int *outlen); +bool zlib_is_valid_header(const void *data, int len); -void zlib_free_func(gpointer unused_opaque, gpointer p); -gpointer zlib_alloc_func(gpointer unused_opaque, guint n, guint m); +void zlib_free_func(void *unused_opaque, void *p); +void *zlib_alloc_func(void *unused_opaque, uint n, uint m); #endif /* _zlib_util_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/main.c -> gtk-gnutella-1.1.9.tar.bz2/src/main.c
Changed
@@ -1,6 +1,6 @@ /* - * Copyright (c) 2001-2011, Raphael Manfredi - * Copyright (c) 2005-2011, Christian Biere + * Copyright (c) 2001-2015 Raphael Manfredi + * Copyright (c) 2005-2011 Christian Biere * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -29,7 +29,7 @@ * Main functions for gtk-gnutella. * * @author Raphael Manfredi - * @date 2001-2011 + * @date 2001-2015 * @author Christian Biere * @date 2005-2011 */ @@ -41,11 +41,10 @@ #define CORE_SOURCES #include "core/ban.h" -#include "core/bitzi.h" #include "core/bogons.h" #include "core/bsched.h" -#include "core/ctl.h" #include "core/clock.h" +#include "core/ctl.h" #include "core/dh.h" #include "core/dmesh.h" #include "core/downloads.h" @@ -54,9 +53,12 @@ #include "core/extensions.h" #include "core/features.h" #include "core/fileinfo.h" -#include "core/file_object.h" +#include "core/g2/build.h" +#include "core/g2/gwc.h" +#include "core/g2/node.h" +#include "core/g2/rpc.h" +#include "core/g2/tree.h" #include "core/gdht.h" -#include "core/pdht.h" #include "core/geo_ip.h" #include "core/ghc.h" #include "core/gmsg.h" @@ -79,6 +81,7 @@ #include "core/oob.h" #include "core/parq.h" #include "core/pcache.h" +#include "core/pdht.h" #include "core/pproxy.h" #include "core/publisher.h" #include "core/routing.h" @@ -95,8 +98,8 @@ #include "core/tx.h" #include "core/udp.h" #include "core/uhc.h" -#include "core/urpc.h" #include "core/upload_stats.h" +#include "core/urpc.h" #include "core/verify_sha1.h" #include "core/verify_tth.h" #include "core/version.h" @@ -104,25 +107,34 @@ #include "core/whitelist.h" #include "if/dht/dht.h" #include "lib/adns.h" +#include "lib/aging.h" #include "lib/atoms.h" #include "lib/bg.h" +#include "lib/bsearch.h" #include "lib/compat_misc.h" -#include "lib/compat_sleep_ms.h" #include "lib/cpufreq.h" #include "lib/cq.h" #include "lib/crash.h" #include "lib/crc.h" -#include "lib/debug.h" #include "lib/dbus_util.h" +#include "lib/debug.h" +#include "lib/entropy.h" #include "lib/eval.h" +#include "lib/evq.h" +#include "lib/exit.h" +#include "lib/exit2str.h" #include "lib/fd.h" +#include "lib/file_object.h" +#include "lib/gentime.h" #include "lib/glib-missing.h" #include "lib/halloc.h" +#include "lib/htable.h" #include "lib/inputevt.h" #include "lib/iso3166.h" -#include "lib/exit.h" +#include "lib/launch.h" #include "lib/log.h" #include "lib/map.h" +#include "lib/mem.h" #include "lib/mime_type.h" #include "lib/misc.h" #include "lib/offtime.h" @@ -133,24 +145,35 @@ #include "lib/pattern.h" #include "lib/pow2.h" #include "lib/product.h" +#include "lib/progname.h" #include "lib/random.h" +#include "lib/setproctitle.h" +#include "lib/sha1.h" #include "lib/signal.h" #include "lib/stacktrace.h" #include "lib/str.h" #include "lib/stringify.h" #include "lib/strtok.h" +#include "lib/symbols.h" #include "lib/tea.h" +#include "lib/teq.h" +#include "lib/thread.h" #include "lib/tiger.h" #include "lib/tigertree.h" #include "lib/tm.h" +#include "lib/tmalloc.h" #include "lib/utf8.h" #include "lib/vendors.h" +#include "lib/vmea.h" #include "lib/vmm.h" +#include "lib/vsort.h" #include "lib/walloc.h" #include "lib/watcher.h" #include "lib/wordvec.h" #include "lib/wq.h" #include "lib/xmalloc.h" +#include "lib/xsort.h" +#include "lib/xxtea.h" #include "lib/zalloc.h" #include "shell/shell.h" #include "upnp/upnp.h" @@ -178,19 +201,32 @@ #define LOAD_HIGH_WATERMARK 95 /**< % amount over which we're overloaded */ #define LOAD_LOW_WATERMARK 80 /**< lower threshold to clear condition */ +/** + * The emergency memory region is allocated at the beginning and not otherwise + * used by the process until it runs out of memory. We don't want to waste + * too much from the virtual address space, but this memory will be swapped + * out by the kernel as it remains totally unused. + * + * A size of 8 MiB does not waste too much of the total virtual memory a modern + * system has (swap + RAM) given that we now reason in gigabytes. This should + * be less than 0.1% of the total virtual memory and therefore is reasonable. + * --RAM, 2015-12-12 + */ +#define VMEA_SIZE (8 * 1024 * 1024) /**< Emergency region size: 8 MiB */ + static unsigned main_slow_update; static volatile sig_atomic_t exiting; static volatile sig_atomic_t from_atexit; static volatile sig_atomic_t signal_received; static volatile sig_atomic_t shutdown_requested; static volatile sig_atomic_t sig_hup_received; -static gboolean asynchronous_exit; +static bool asynchronous_exit; static enum shutdown_mode shutdown_user_mode = GTKG_SHUTDOWN_NORMAL; static unsigned shutdown_user_flags; static jmp_buf atexit_env; static volatile const char *exit_step = "gtk_gnutella_exit"; -static gboolean main_timer(void *); +static bool main_timer(void *); #ifdef SIGALRM /** @@ -220,11 +256,7 @@ static void sig_chld(int n) { - int saved_errno = errno; (void) n; - while (waitpid(-1, NULL, WNOHANG) > 0) - continue; - errno = saved_errno; } #endif @@ -252,12 +284,11 @@ /** * Are we debugging anything at a level greater than some threshold "t"? */ -gboolean +bool debugging(guint t) { return GNET_PROPERTY(ban_debug) > t || - GNET_PROPERTY(bitzi_debug) > t || GNET_PROPERTY(bootstrap_debug) > t || GNET_PROPERTY(dbg) > t || GNET_PROPERTY(dh_debug) > t || @@ -296,12 +327,49 @@ } /** + * @reeturn GTK version string, or NULL if not compiled with GTK. + */ +const char * +gtk_version_string(void) +{ +#if defined(GTK_MAJOR_VERSION) && defined(GTK_MINOR_VERSION) + static char buf80; + + if ('\0' == buf0) { + str_bprintf(buf, sizeof buf, "Gtk+ %u.%u.%u", + gtk_major_version, gtk_minor_version, gtk_micro_version); + if ( + GTK_MAJOR_VERSION != gtk_major_version || + GTK_MINOR_VERSION != gtk_minor_version || + GTK_MICRO_VERSION != gtk_micro_version + ) { + str_bcatf(buf, sizeof buf, " (compiled against %u.%u.%u)", + GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); + } + } + + return buf; +#else + return NULL; +#endif /* Gtk+ */ +} + +/** * Invoked as an atexit() callback when someone does an exit(). */ static void gtk_gnutella_atexit(void) { /* + * If we're in an exception, it means we're already crashing and + * we are now exiting, probably because we have a supervising parent + * process and do not need to re-exec() ourselves. + */ + + if (signal_in_exception()) + return; + + /* * There's no way the gtk_gnutella_exit() routine can have its signature * changed, so we use the `from_atexit' global to indicate that we're * coming from the atexit() callback, mainly to suppress the final @@ -309,16 +377,16 @@ */ if (!exiting) { - g_warning("trapped foreign exit(), cleaning up..."); + g_critical("trapped foreign exit(), cleaning up..."); from_atexit = TRUE; #ifndef USE_TOPLESS running_topless = TRUE; /* X connection may be broken, avoid GUI */ #endif - + #ifdef SIGALRM signal_set(SIGALRM, sig_alarm); #endif - if (setjmp(atexit_env)) { + if (Setjmp(atexit_env)) { g_warning("cleanup aborted while in %s().", exit_step); return; } @@ -382,6 +450,18 @@ } /** + * Crash restart callback to trigger a graceful asynchronous restart. + */ +static int +gtk_gnutella_request_restart(void) +{ + gtk_gnutella_request_shutdown(GTKG_SHUTDOWN_NORMAL, + GTKG_SHUTDOWN_OFAST | GTKG_SHUTDOWN_ORESTART | GTKG_SHUTDOWN_OCRASH); + + return 1; /* Any non-zero return signifies: async restart in progress */ +} + +/** * Manually dispatch events that are normally done from glib's main loop. */ static void @@ -395,7 +475,7 @@ */ inputevt_dispatch(); - cq_dispatch(); + cq_main_dispatch(); /* * If gtk_gnutella_exit() was called from main_timer(), the callout @@ -417,7 +497,7 @@ /* * If they requested abnormal termination after shutdown, comply now. */ -static G_GNUC_COLD void +static void G_COLD handle_user_shutdown_request(enum shutdown_mode mode) { const char *msg = "crashing at your request"; @@ -430,9 +510,12 @@ case GTKG_SHUTDOWN_ASSERT: s_message("%s assertion failure", trigger); g_assert_log(FALSE, "%s", msg); + /* NOTREACHED */ + break; case GTKG_SHUTDOWN_ERROR: s_message("%s error", trigger); s_error("%s", msg); + /* NOTREACHED */ break; case GTKG_SHUTDOWN_MEMORY: s_message("%s memory access error", trigger); @@ -441,6 +524,7 @@ case GTKG_SHUTDOWN_SIGNAL: s_message("%s SIGILL", trigger); raise(SIGILL); + /* NOTREACHED */ break; } } @@ -451,13 +535,24 @@ * Shutdown systems, so we can track memory leaks, and wait for EXIT_GRACE * seconds so that BYE messages can be sent to other nodes. */ -G_GNUC_COLD void +void G_COLD gtk_gnutella_exit(int exit_code) { static volatile sig_atomic_t safe_to_exit; time_t exit_time = time(NULL); time_delta_t exit_grace = EXIT_GRACE; - gboolean byeall = TRUE; + bool byeall = + !(shutdown_requested && (shutdown_user_flags & GTKG_SHUTDOWN_OFAST)); + bool crashing = + shutdown_requested && (shutdown_user_flags & GTKG_SHUTDOWN_OCRASH); + + /* + * In case this routine is part of an automatic restarting sequence, + * signal to the crashing layer that we are starting in order to cancel + * the automatic restart after some time. + */ + + crash_restarting(); if (exiting) { if (safe_to_exit) { @@ -469,9 +564,6 @@ return; } - if (shutdown_requested && (shutdown_user_flags & GTKG_SHUTDOWN_OFAST)) - byeall = FALSE; - exiting = TRUE; #define DO(fn) do { \ @@ -490,6 +582,7 @@ fn(arg); \ } while (0) + DO(socket_shutdowning); /* We're about to shutdown for good */ DO(shell_close); DO(file_info_store_if_dirty); /* For safety, will run again below */ DO(file_info_close_pre); @@ -498,7 +591,7 @@ DO(upload_stats_close); DO(parq_close_pre); DO(verify_sha1_close); - DO(verify_tth_close); + DO(verify_tth_shutdown); DO(download_close); DO(file_info_store_if_dirty); /* In case downloads had buffered data */ DO(parq_close); @@ -506,6 +599,7 @@ DO(http_close); DO(uhc_close); DO(ghc_close); + DO(gwc_close); DO(move_close); DO(publisher_close); DO(pdht_close); @@ -537,6 +631,9 @@ */ if (debugging(0)) { + DO(random_dump_stats); + DO(palloc_dump_stats); + DO(tmalloc_dump_stats); DO(vmm_dump_stats); DO(xmalloc_dump_stats); DO(zalloc_dump_stats); @@ -579,26 +676,47 @@ } DO(hcache_shutdown); /* Save host caches to disk */ - DO(settings_shutdown); DO(oob_shutdown); /* No longer deliver outstanding OOB hits */ DO(socket_shutdown); DO(bsched_shutdown); - if (!running_topless) { - DO(settings_gui_shutdown); + /* + * If auto-restart was requested, flag that in the properties so that + * we'll know about that request when we restart. + */ + + if (shutdown_user_flags & GTKG_SHUTDOWN_ORESTART) { + gnet_prop_set_boolean_val(PROP_USER_AUTO_RESTART, TRUE); } + if (!running_topless) + DO(settings_gui_shutdown); + DO(settings_shutdown); + /* * Show total CPU used, and the amount spent in user / kernel, before * we start the grace period... */ if (debugging(0)) { - tm_t since = tm_start_time(); + tm_t since = progstart_time(); log_cpu_usage(&since, NULL, NULL); } /* + * Skip gracetime for BYE message to go through when crashing, as well + * as most the final exit sequence whose aim is to properly clean memory + * to be able to trace leaks when debugging. + */ + + if (crashing) { + /* Accelerated shutdown */ + DO(settings_close); + DO(cq_close); + goto quick_restart; + } + + /* * Wait at most EXIT_GRACE seconds, so that BYE messages can go through. * This amount of time is doubled when running in Ultra mode since we * have more connections to flush. @@ -609,7 +727,7 @@ if (debugging(0) || signal_received || shutdown_requested) { g_info("waiting at most %s for BYE messages", - short_time(exit_grace)); + short_time_ascii(exit_grace)); } /* @@ -632,19 +750,26 @@ if (!running_topless) { main_gui_shutdown_tick(exit_grace - d); } - compat_sleep_ms(50); + thread_sleep_ms(50); main_dispatch(); } if (debugging(0) || signal_received || shutdown_requested) g_info("running final shutdown sequence..."); + /* + * The main thread may now have to perform thread_join(), so we + * tell the management layer that it is OK to block. + */ + + thread_set_main(TRUE); /* Main thread can now block */ + DO(settings_terminate); /* Entering the final sequence */ DO(cq_halt); /* No more callbacks, with everything shutdown */ DO(search_shutdown); /* Disable now, since we can get queries above */ + DO(socket_closedown); DO(upnp_close); - DO(bitzi_close); DO(ntp_close); DO(gdht_close); DO(sq_close); @@ -653,10 +778,12 @@ DO(hsep_close); DO(file_info_close); DO(ext_close); - DO(share_close); DO(node_close); + DO(g2_node_close); + DO(share_close); /* After node_close() */ DO(udp_close); DO(urpc_close); + DO(g2_rpc_close); DO(routing_close); /* After node_close() */ DO(bsched_close); DO(dmesh_close); @@ -680,9 +807,10 @@ DO(word_vec_close); DO(pattern_close); DO(pmsg_close); + DO(gmsg_close); + DO(g2_build_close); DO(version_close); DO(ignore_close); - DO(eval_close); DO(iso3166_close); atom_str_free_null(&start_rfc822_date); DO(adns_close); @@ -690,22 +818,105 @@ DO(ipp_cache_close); DO(dump_close); DO(tls_global_close); - DO(file_object_close); - DO(settings_close); /* Must come after hcache_close() */ DO(misc_close); DO(mingw_close); + DO(verify_tth_close); DO(inputevt_close); DO(locale_close); - DO(cq_close); DO(wq_close); DO(log_close); /* Does not disable logging */ + DO(gentime_close); + + /* + * Wait for pending messages from other threads. + */ + + if (debugging(0)) + g_info("waiting for pending messages from other threads"); + + exit_time = time(NULL); + exit_grace = 10; + + while (0 != thread_pending_count()) { + time_t now = time(NULL); + time_delta_t d; + + if (signal_received) + break; + + if ((d = delta_time(now, exit_time)) >= exit_grace) + break; + + thread_yield(); + } + + /* + * While there are events to be processed in the TEQ, handle them + * and wait a little to see if more events are coming. + */ + + if (debugging(0)) + g_info("waiting for TEQ events from closing threads"); + + teq_set_throttle(0, 0); /* No throttling */ + + while (0 != teq_dispatch()) { + int i; + + for (i = 0; i < 100; i++) { + int n = teq_count(THREAD_MAIN); + if (n != 0) + break; + thread_sleep_ms(1); + } + } + + /* + * Prepare memory shutdown. + * + * Note that evq_close() must be called AFTER vmm_pre_close() to let the + * periodic callbacks from the VMM layer be cleared and BEFORE we suspend + * the other threads, to be able to wait for the complete EVQ shutdown. + */ + + DO(vmm_pre_close); + DO(evq_close); /* Can now dispose of the event queue */ + + /* + * About to shutdown memory, suspend all the other running threads to + * avoid problems if they wake up suddenly and attempt to allocate memory. + */ + + if (debugging(0)) { + unsigned n = thread_count() - 1; + if (n != 0) + g_info("suspending other %u thread%s", n, plural(n)); + } + + thread_suspend_others(FALSE); + + if (debugging(0)) + DO(thread_dump_stats); + + /* + * Now we won't be dispatching any more TEQ events, which happen mostly + * when the TTH and SHA-1 threads are ended with a non-empty work queue. + * + * We can therefore close the property system completely, and the + * callout queue (required when exiting from detached threads to hold + * off the thread element for a while). + */ + + DO(file_object_close); + DO(settings_close); /* Must come after hcache_close() */ + DO(cq_close); /* * Memory shutdown must come last. */ gm_mem_set_safe_vtable(); - DO(vmm_pre_close); + DO(vmea_close); DO(atoms_close); DO(wdestroy); DO(zclose); @@ -716,13 +927,13 @@ DO(vmm_close); DO(signal_close); - if (debugging(0) || signal_received || shutdown_requested) - g_info("gtk-gnutella shut down cleanly."); +quick_restart: + g_info("gtk-gnutella shut down %s.", crashing ? "quickly" : "cleanly"); if (shutdown_requested) { handle_user_shutdown_request(shutdown_user_mode); if (shutdown_user_flags & GTKG_SHUTDOWN_ORESTART) { - g_info("gtk-gnutella will now restart itself."); + g_info("gtk-gnutella will now restart itself..."); crash_reexec(); } } @@ -749,6 +960,7 @@ extern char **environ; enum main_arg { + main_arg_child, main_arg_compile_info, main_arg_daemonize, main_arg_exec_on_crash, @@ -757,9 +969,12 @@ main_arg_help, main_arg_log_stderr, main_arg_log_stdout, + main_arg_log_supervise, main_arg_minimized, + main_arg_no_dbus, main_arg_no_halloc, main_arg_no_restart, + main_arg_no_supervise, main_arg_no_xshm, main_arg_pause_on_crash, main_arg_ping, @@ -788,17 +1003,18 @@ ARG_TYPE_PATH }; -static struct { +static struct option { const enum main_arg id; const char * const name; const char * const summary; const enum arg_type type; const char *arg; /* memory will be allocated via halloc() */ - gboolean used; + bool used; } options = { #define OPTION(name, type, summary) \ { main_arg_ ## name , #name, summary, ARG_TYPE_ ## type, NULL, FALSE } + OPTION(child, NONE, NULL), /* hidden option */ OPTION(compile_info, NONE, "Display compile-time information."), OPTION(daemonize, NONE, "Daemonize the process."), #ifdef HAS_FORK @@ -812,17 +1028,20 @@ OPTION(help, NONE, "Print this message."), OPTION(log_stderr, PATH, "Log standard output to a file."), OPTION(log_stdout, PATH, "Log standard error output to a file."), + OPTION(log_supervise, PATH, "Log for the supervisor process."), #ifdef USE_TOPLESS OPTION(minimized, NONE, NULL), /* accept but hide */ #else OPTION(minimized, NONE, "Start with minimized main window."), #endif /* USE_TOPLESS */ + OPTION(no_dbus, NONE, "Disable D-BUS notifications."), #ifdef USE_HALLOC OPTION(no_halloc, NONE, "Disable malloc() replacement."), #else OPTION(no_halloc, NONE, NULL), /* ignore silently */ #endif /* USE_HALLOC */ OPTION(no_restart, NONE, "Disable auto-restarts on crash."), + OPTION(no_supervise, NONE, "Disable supervision by a parent process."), OPTION(no_xshm, NONE, "Disable MIT shared memory extension."), OPTION(pause_on_crash, NONE, "Pause the process on crash."), OPTION(ping, NONE, "Check whether gtk-gnutella is running."), @@ -855,26 +1074,49 @@ } /** - * Checks whether two strings qualify as equivalent, the ASCII underscore - * character and the ASCII hyphen character are considered equivalent. + * Compare two strings, the ASCII underscore character and the ASCII hyphen + * character being considered equivalent. * - * @return whether the two strings qualify as equivalent or not. + * @return 0 if strings are equal, the sign of the comparison otherwise. */ -static gboolean -option_match(const char *a, const char *b) +static int +option_strcmp(const char *a, const char *b) { g_assert(a); g_assert(b); - for (;;) { + for (;;) { if (underscore_to_hyphen(*a) != underscore_to_hyphen(*b)) - return FALSE; - if ('\0' == *a) - break; + return CMP(*a, *b); + if ('\0' == *a) { + if ('\0' == *b) + return 0; + return -1; + } else if ('\0' == *b) { + return +1; + } a++; b++; } + g_assert_not_reached(); +} + +/** + * Check whether ``prefix'' is a prefix of ``str'', considering "-" and "_" + * as identical characters. + */ +static bool +option_strprefix(const char *str, const char *prefix) +{ + const char *s, *p; + int c; + + for (s = str, p = prefix; '\0' != (c = *p); p++) { + if (underscore_to_hyphen(c) != underscore_to_hyphen(*s++)) + return FALSE; + } + return TRUE; } @@ -883,7 +1125,7 @@ * with hyphens. * * @return a pointer to a static buffer holding the pretty version of the - * option name. + * option name. */ static const char * option_pretty_name(const char *name) @@ -891,7 +1133,7 @@ static char buf128; size_t i; - for (i = 0; i < G_N_ELEMENTS(buf) - 1; i++) { + for (i = 0; i < N_ITEMS(buf) - 1; i++) { if ('\0' == namei) break; bufi = underscore_to_hyphen(namei); @@ -900,60 +1142,190 @@ return buf; } +/** + * Pretty print option. + * + * @param f where to print the formatted option name + * @param o the option to print + */ static void +option_pretty_print(FILE *f, const struct option *o) +{ + const char *arg, *name; + size_t pad; + + arg = ""; + name = option_pretty_name(o->name); + switch (o->type) { + case ARG_TYPE_NONE: + break; + case ARG_TYPE_TEXT: + arg = " <argument>"; + break; + case ARG_TYPE_PATH: + arg = " <path>"; + break; + } + + pad = strlen(name) + strlen(arg); + if (pad < 24) { + pad = 24 - pad; + } else { + pad = 0; + } + + if (o->summary != NULL) { + fprintf(f, " --%s%s%-*s%s\n", + name, arg, (int) MIN(pad, INT_MAX), "", o->summary); + } else { + fprintf(f, " --%s%s\n", name, arg); + } +} + +static int +option_id_cmp(const void *a, const void *b) +{ + const struct option *oa = a, *ob = b; + + return CMP(oa->id, ob->id); +} + +static int +option_name_cmp(const void *a, const void *b) +{ + const struct option *oa = a, *ob = b; + + return option_strcmp(oa->name, ob->name); +} + +static int +option_name_prefix(const void *key, const void *item) +{ + const char *name = key; + const struct option *oi = item; + + if (option_strprefix(oi->name, name)) + return 0; + + return option_strcmp(name, oi->name); +} + +static void G_NORETURN +option_ambiguous(const char *name, struct option *item) +{ + struct option *min = item, *max = item, *o; + struct option *end = &optionsN_ITEMS(options); + + fprintf(stderr, "%s: ambiguous option --%s\n", getprogname(), name); + fprintf(stderr, "Could mean either of:\n"); + + for (o = item - 1; ptr_cmp(o, options) >= 0; o--) { + if (option_strprefix(o->name, name)) + min = o; + else + break; + } + + for (o = item + 1; ptr_cmp(o, end) < 0; o++) { + if (option_strprefix(o->name, name)) + max = o; + else + break; + } + + for (o = min; ptr_cmp(o, max) <= 0; o++) { + option_pretty_print(stderr, o); + } + + exit(EXIT_FAILURE); +} + +/** + * Lookup for option whose name starts with supplied name and which is + * non-ambiguous + * + * @attention + * The options array must be sorted by name, not by ID, at the time + * this call is made. + * + * @param name the option we're looking for + * @param fatal whether an ambiguous option means fatal error + * + * @return pointer within the options array if found and unique, or NULL. + */ +static struct option * +option_find(const char *name, bool fatal) +{ + struct option *item; + + item = bsearch(name, + options, N_ITEMS(options), sizeof options0, option_name_prefix); + + if (NULL == item) + return NULL; + + if (ptr_cmp(item, options) > 0) { + if (option_strprefix((item - 1)->name, name)) + goto ambiguous; + } + + if (ptr_cmp(item, options + N_ITEMS(options) - 1) < 0) { + if (option_strprefix((item + 1)->name, name)) + goto ambiguous; + } + + return item; /* Must be unique match since array is sorted */ + +ambiguous: + if (!fatal) + return NULL; + + option_ambiguous(name, item); +} + +static void G_NORETURN usage(int exit_code) { FILE *f; unsigned i; f = EXIT_SUCCESS == exit_code ? stdout : stderr; - fprintf(f, "Usage: gtk-gnutella options ... \n"); - - STATIC_ASSERT(G_N_ELEMENTS(options) == num_main_args); - for (i = 0; i < G_N_ELEMENTS(options); i++) { - g_assert(optionsi.id == i); + fprintf(f, "Usage: %s options ... \n", getprogname()); - if (optionsi.summary) { - const char *arg, *name; - size_t pad; + xqsort(options, N_ITEMS(options), sizeof options0, option_id_cmp); - arg = ""; - name = option_pretty_name(optionsi.name); - switch (optionsi.type) { - case ARG_TYPE_NONE: - break; - case ARG_TYPE_TEXT: - arg = " <argument>"; - break; - case ARG_TYPE_PATH: - arg = " <path>"; - break; - } - - pad = strlen(name) + strlen(arg); - if (pad < 24) { - pad = 24 - pad; - } else { - pad = 0; - } + STATIC_ASSERT(N_ITEMS(options) == num_main_args); + for (i = 0; i < N_ITEMS(options); i++) { + g_assert(optionsi.id == i); - fprintf(f, " --%s%s%-*s%s\n", - name, arg, (int) MIN(pad, INT_MAX), "", optionsi.summary); + if (optionsi.summary) { + option_pretty_print(f, &optionsi); } } - + exit(exit_code); } +#define OPT(x) optionsmain_arg_ ## x.used +#define OPTARG(x) optionsmain_arg_ ## x.arg + /* NOTE: This function must not allocate any memory. */ static void prehandle_arguments(char **argv) { + unsigned i; + argv++; +#ifdef USE_TOPLESS + OPT(topless) = TRUE; +#endif /* USE_TOPLESS */ + + xqsort(options, N_ITEMS(options), sizeof options0, option_name_cmp); + while (argv0) { const char *s; - unsigned i; + struct option *o; s = is_strprefix(argv0, "--"); if (NULL == s || '\0' == s0) @@ -961,29 +1333,57 @@ argv++; - for (i = 0; i < G_N_ELEMENTS(options); i++) { - if (option_match(optionsi.name, s)) - break; - } - if (G_N_ELEMENTS(options) == i) - return; + o = option_find(s, FALSE); + if (NULL == o) + goto done; - if (main_arg_no_halloc == i) { - optionsi.used = TRUE; + switch (o->id) { + case main_arg_no_halloc: + case main_arg_child: + case main_arg_no_supervise: + case main_arg_topless: + o->used = TRUE; + break; + default: + break; } - switch (optionsi.type) { + switch (o->type) { case ARG_TYPE_NONE: break; case ARG_TYPE_TEXT: case ARG_TYPE_PATH: if (NULL == argv0 || '-' == argv00) - return; + goto done; argv++; break; } } + +done: + xqsort(options, N_ITEMS(options), sizeof options0, option_id_cmp); + + for (i = 0; i < N_ITEMS(options); i++) { + g_assert(optionsi.id == i); + } +} + +/** + * Log error, prefixing string with program name, then show usage and exit. + */ +static void G_PRINTF(1, 2) G_NORETURN +main_error(const char *fmt, ...) +{ + va_list args; + + fprintf(stderr, "%s: ", getprogname()); + + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); + + usage(EXIT_FAILURE); } /** @@ -994,59 +1394,51 @@ { unsigned i; - STATIC_ASSERT(G_N_ELEMENTS(options) == num_main_args); - for (i = 0; i < G_N_ELEMENTS(options); i++) { + STATIC_ASSERT(N_ITEMS(options) == num_main_args); + for (i = 0; i < N_ITEMS(options); i++) { g_assert(optionsi.id == i); } -#ifdef USE_TOPLESS - optionsmain_arg_topless.used = TRUE; -#endif /* USE_TOPLESS */ + xqsort(options, N_ITEMS(options), sizeof options0, option_name_cmp); argv++; /* Skip argv0 */ argc--; while (argc > 0) { const char *s; + struct option *o; s = is_strprefix(argv0, "--"); - if (!s) - usage(EXIT_FAILURE); + if (NULL == s) + main_error("unexpected argument \"%s\"\n", argv0); if ('\0' == s0) break; argv++; argc--; - for (i = 0; i < G_N_ELEMENTS(options); i++) { - if (option_match(optionsi.name, s)) - break; - } - if (G_N_ELEMENTS(options) == i) { - fprintf(stderr, "Unknown option \"--%s\"\n", s); - usage(EXIT_FAILURE); - } + o = option_find(s, TRUE); + if (NULL == o) + main_error("unknown option \"--%s\"\n", s); - optionsi.used = TRUE; - switch (optionsi.type) { + o->used = TRUE; + switch (o->type) { case ARG_TYPE_NONE: break; case ARG_TYPE_TEXT: case ARG_TYPE_PATH: - if (argc < 0 || NULL == argv0 || '-' == argv00) { - fprintf(stderr, "Missing argument for \"--%s\"\n", s); - usage(EXIT_FAILURE); - } - switch (optionsi.type) { + if (argc < 0 || NULL == argv0 || '-' == argv00) + main_error("missing argument for \"--%s\"\n", s); + + switch (o->type) { case ARG_TYPE_TEXT: - optionsi.arg = NOT_LEAKING(h_strdup(argv0)); + o->arg = NOT_LEAKING(h_strdup(argv0)); break; case ARG_TYPE_PATH: - optionsi.arg = NOT_LEAKING(absolute_pathname(argv0)); - if (NULL == optionsi.arg) { - fprintf(stderr, - "Could not determine absolute path for \"--%s\"\n", s); - usage(EXIT_FAILURE); + o->arg = NOT_LEAKING(absolute_pathname(argv0)); + if (NULL == o->arg) { + main_error( + "could not determine absolute path for \"--%s\"\n", s); } break; case ARG_TYPE_NONE: @@ -1057,6 +1449,12 @@ break; } } + + xqsort(options, N_ITEMS(options), sizeof options0, option_id_cmp); + + for (i = 0; i < N_ITEMS(options); i++) { + g_assert(optionsi.id == i); + } } /** @@ -1065,37 +1463,22 @@ static void validate_arguments(void) { - if ( - optionsmain_arg_no_restart.used && - optionsmain_arg_restart_on_crash.used) - { - fputs("Say either --restart-on-crash or --no-restart\n", stderr); + if (OPT(no_restart) && OPT(restart_on_crash)) { + fprintf(stderr, "%s: say either --restart-on-crash or --no-restart\n", + getprogname()); exit(EXIT_FAILURE); } #ifndef HAS_FORK - if ( - optionsmain_arg_restart_on_crash.used && !crash_coredumps_disabled() - ) { + if (OPT(restart_on_crash) && !crash_coredumps_disabled()) { fputs("--restart-on-crash has no effect on this platform\n", stderr); } #endif /* !HAS_FORK */ } -/** - * Collect more randomness, periodically. - */ -static void -more_randomness(void) -{ - guint32 crc = gnet_stats_crc_reset(); - random_pool_append(&crc, sizeof crc, settings_add_randomness); - random_collect(settings_add_randomness); -} - static void slow_main_timer(time_t now) { - static unsigned i = 0, j = 0; + static unsigned i = 0; if (GNET_PROPERTY(cpu_debug)) { static tm_t since = { 0, 0 }; @@ -1103,7 +1486,7 @@ static double sys = 0.0; if (since.tv_sec == 0) - since = tm_start_time(); + since = progstart_time(); log_cpu_usage(&since, &user, &sys); } @@ -1115,6 +1498,7 @@ break; case 1: dmesh_ban_store(); + gwc_store_if_dirty(); break; case 2: upload_stats_flush_if_dirty(); @@ -1129,6 +1513,7 @@ case 5: dht_route_store_if_dirty(); gnet_prop_set_timestamp_val(PROP_SHUTDOWN_TIME, tm_time()); + settings_random_save(FALSE); break; default: g_assert_not_reached(); @@ -1148,16 +1533,17 @@ ignore_timer(now); /* - * Our "idle" tasks need to be scheduled at least once in a while. + * Unfortunately, Linux is not always correctly handling SO_REUSEADDR: + * a bind() can fail with errno set to EADDRINUSE despite the flag being + * requested on the socket descriptor prior to calling bind(). * - * We don't know how busy the callout queue is going to get, so forcing - * its "idle" tasks to run may be the only option to ensure these - * background but important operations get a chance to be run at all. + * So we have no other choice but to periodically re-attempt the creation + * when we end-up with no TCP listening socket. + * --RAM, 2015-05-17 */ - if (0 == j++ % 2) { - cq_idle(callout_queue); - } + if (GNET_PROPERTY(tcp_no_listening)) + settings_create_listening_sockets(); } /** @@ -1179,6 +1565,7 @@ double elapsed; double cpu_percent; double coverage; + cqueue_t *cqm = cq_main(); /* * Compute CPU time used this period. @@ -1192,13 +1579,13 @@ cpu_percent = 100.0 * (cpu - last_cpu) / elapsed; cpu_percent = MIN(cpu_percent, 100.0); - coverage = callout_queue_coverage(ticks); + coverage = cq_main_coverage(ticks); coverage = MAX(coverage, 0.001); /* Prevent division by zero */ if (GNET_PROPERTY(cq_debug) > 2) { g_debug("CQ: callout queue \"%s\" items=%d ticks=%d coverage=%d%%", - cq_name(callout_queue), cq_count(callout_queue), - cq_ticks(callout_queue), (int) (coverage * 100.0 + 0.5)); + cq_name(cqm), cq_count(cqm), + cq_ticks(cqm), (int) (coverage * 100.0 + 0.5)); } /* @@ -1260,7 +1647,7 @@ last_cpu = cpu; last_tm = cur_tm; /* Struct copy */ - ticks = cq_ticks(callout_queue); + ticks = cq_ticks(cqm); /* * Check whether we're overloaded, or if we were, whether we decreased @@ -1284,7 +1671,7 @@ /** * Main timer routine, called once per second. */ -static gboolean +static bool main_timer(void *unused_data) { time_t now; @@ -1296,7 +1683,7 @@ g_warning("caught %s, exiting...", signal_name(signal_received)); } asynchronous_exit = TRUE; - gtk_gnutella_exit(EXIT_FAILURE); + gtk_gnutella_exit(EXIT_SUCCESS); } now = check_cpu_usage(); @@ -1311,7 +1698,7 @@ if (sig_hup_received) { sig_hup_received = 0; - log_reopen_all(optionsmain_arg_daemonize.used); + log_reopen_all(OPT(daemonize)); } bsched_timer(); /* Scheduling update */ @@ -1350,27 +1737,62 @@ return TRUE; } +typedef void (*digest_collector_cb_t)(sha1_t *digest); + +static digest_collector_cb_t random_source = { + random_stats_digest, + halloc_stats_digest, + palloc_stats_digest, + gnet_stats_tcp_digest, + thread_stats_digest, + gnet_stats_udp_digest, + vmm_stats_digest, + gnet_stats_general_digest, + tmalloc_stats_digest, + xmalloc_stats_digest, + zalloc_stats_digest, + entropy_minimal_collect, +}; + /** * Called when the main callout queue is idle. */ -static gboolean +static bool callout_queue_idle(void *unused_data) { - gboolean overloaded = GNET_PROPERTY(overloaded_cpu); + sha1_t digest; + static uint ridx = 0; + static size_t counter = 0; (void) unused_data; - if (GNET_PROPERTY(cq_debug) > 1) + if (GNET_PROPERTY(cq_debug) > 1) { + bool overloaded = GNET_PROPERTY(overloaded_cpu); g_debug("CQ: callout queue is idle (CPU %s)", overloaded ? "OVERLOADED" : "available"); + } /* Idle tasks always scheduled */ - zgc(overloaded); - more_randomness(); + random_collect(); + + /* Idle tasks only scheduled once every over run */ + if (0 == (counter++ & 1)) { + size_t n; + + /* + * Be un-predictable: use round-robin 50% of the time, or a random + * routine to call among the ones we have at our disposal. + */ + + if (0 == random_value(1)) { + n = ridx; + ridx = (ridx + 1) % N_ITEMS(random_source); + } else { + n = random_value(N_ITEMS(random_source) - 1); + } - if (!overloaded) { - /* Idle tasks scheduled only when CPU is not overloaded */ - pgc(); + (*random_sourcen)(&digest); + random_pool_append(&digest, sizeof digest); } return TRUE; /* Keep scheduling this */ @@ -1394,13 +1816,13 @@ static void initialize_logfiles(void) { - if (optionsmain_arg_log_stdout.used) - log_set(LOG_STDOUT, optionsmain_arg_log_stdout.arg); + if (OPT(log_stdout)) + log_set(LOG_STDOUT, OPTARG(log_stdout)); - if (optionsmain_arg_log_stderr.used) - log_set(LOG_STDERR, optionsmain_arg_log_stderr.arg); + if (OPT(log_stderr)) + log_set(LOG_STDERR, OPTARG(log_stderr)); - if (!log_reopen_all(optionsmain_arg_daemonize.used)) { + if (!log_reopen_all(OPT(daemonize))) { exit(EXIT_FAILURE); } } @@ -1408,41 +1830,7 @@ static void handle_version_argument(void) { - printf("%s\n", version_build_string()); - -#ifndef OFFICIAL_BUILD - printf("(unofficial build, accessing \"%s\")\n", PACKAGE_SOURCE_DIR); -#endif - - printf("GLib %u.%u.%u", - glib_major_version, glib_minor_version, glib_micro_version); - if ( - GLIB_MAJOR_VERSION != glib_major_version || - GLIB_MINOR_VERSION != glib_minor_version || - GLIB_MICRO_VERSION != glib_micro_version - ) { - printf(" (compiled against %u.%u.%u)", - GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION); - } - printf("\n"); - -#if defined(GTK_MAJOR_VERSION) && defined(GTK_MINOR_VERSION) - printf("Gtk+ %u.%u.%u", - gtk_major_version, gtk_minor_version, gtk_micro_version); - if ( - GTK_MAJOR_VERSION != gtk_major_version || - GTK_MINOR_VERSION != gtk_minor_version || - GTK_MICRO_VERSION != gtk_micro_version - ) { - printf(" (compiled against %u.%u.%u)", - GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); - } - printf("\n"); -#endif /* Gtk+ */ - - if (tls_version_string()) { - printf("%s\n", tls_version_string()); - } + version_string_dump(); exit(EXIT_SUCCESS); } @@ -1512,23 +1900,21 @@ static void handle_arguments_asap(void) { - if (optionsmain_arg_help.used) { + if (OPT(help)) usage(EXIT_SUCCESS); - } #ifndef USE_TOPLESS - if (optionsmain_arg_topless.used) { + if (OPT(topless)) running_topless = TRUE; - } #endif /* USE_TOPLESS */ - if (optionsmain_arg_version.used) { + if (OPT(version)) handle_version_argument(); - } - if (optionsmain_arg_compile_info.used) { + + if (OPT(compile_info)) handle_compile_info_argument(); - } - if (optionsmain_arg_daemonize.used) { + + if (OPT(daemonize)) { if (0 != compat_daemonize(NULL)) { exit(EXIT_FAILURE); } @@ -1537,6 +1923,16 @@ exit(EXIT_FAILURE); } } + + /* + * Don't launch GDB, pause the process, nor restart it when we are going + * to be running only for a short period of time. + */ + + if (OPT(shell) || OPT(ping)) { + crash_ctl(CRASH_FLAG_CLEAR, + CRASH_F_RESTART | CRASH_F_PAUSE | CRASH_F_GDB); + } } /** @@ -1545,11 +1941,11 @@ static void handle_arguments(void) { - if (optionsmain_arg_shell.used) { + if (OPT(shell)) { local_shell(settings_local_socket_path()); exit(EXIT_SUCCESS); } - if (optionsmain_arg_ping.used) { + if (OPT(ping)) { if (settings_is_unique_instance()) { /* gtk-gnutella was running. */ exit(EXIT_SUCCESS); @@ -1568,28 +1964,167 @@ static const char **main_argv; static const char **main_env; +#define MAIN_SUPERVISE_DELAY 3600 /* Monitor children launched per hour */ +#define MAIN_SUPERVISE_CHILDREN 5 /* At most 5 launches per hour */ + /** - * Allocate new string containing the original command line that launched us. + * Run as a supervisor. + * + * We're going to launch a child and monitor its exit status. + * Each time the child exits abnormally, restart it with the same arguments + * until we get more crashes per hour than we can withstand. * - * @return command line string, which must be freed with hfree(). */ -char * -main_command_line(void) +static void G_NORETURN +main_supervise(void) { - str_t *s; + uint32 dbg = 0; /* Debugging level for callout queue */ + aging_table_t *ag; /* Used to monitor how often children die */ + ulong children = 0; /* Amount of children launched */ + size_t child_argc; + const char **child_argv; + char *cmd, *path; int i; - g_assert(main_argv != NULL); /* gm_dupmain() called */ + g_assert(!OPT(child)); + + setproctitle("supervisor"); - s = str_new(1024); + thread_set_main(TRUE); /* Main thread will block! */ + settings_unique_instance(TRUE); /* Supervisor process */ - for (i = 0; i < main_argc; i++) { - if (i != 0) - str_putc(s, ' '); - str_cat(s, main_argvi); + /* + * On Windows, when they launch us via the GUI (99% of the use cases) + * there is no opportunity to give a --log-supervise option unless + * they create a shortcut and add them on the command line. + * + * Therefore, if there is no --log-supervise set, force it for them + * so that supervisor logs get separated from regular logs used by the + * children. + */ + +#ifdef MINGW32 + if (!OPT(log_supervise)) { + OPT(log_supervise) = TRUE; + OPTARG(log_supervise) = mingw_get_supervisor_log_path(); + mingw_file_rotate(OPTARG(log_supervise), MINGW_TRACEFILE_KEEP); } +#endif /* MINGW32 */ - return str_s2c_null(&s); + if (OPT(log_supervise)) { + log_set(LOG_STDOUT, OPTARG(log_supervise)); + log_set(LOG_STDERR, OPTARG(log_supervise)); + log_reopen_all(OPT(daemonize)); + } else { + if (OPT(log_stdout)) + log_set(LOG_STDERR, OPTARG(log_stdout)); + else if (OPT(log_stderr)) + log_set(LOG_STDOUT, OPTARG(log_stderr)); + + log_reopen_all(OPT(daemonize)); + log_show_pid(TRUE); + s_warning("turning PID logging for supervisor process"); + s_message("use --log-supervise to redirect supervisor logs"); + } + + s_info("supervisor starting as PID %lu", (ulong) getpid()); + + s_message("walloc() size limit set to %zu", walloc_size_threshold()); + if (!halloc_is_disabled()) + s_warning("halloc() could not be disabled"); + + cq_init(NULL, &dbg); + ag = aging_make(MAIN_SUPERVISE_DELAY, NULL, NULL, NULL); + + path = file_program_path(main_argv0); + + if (NULL == path) { + s_warning("cannot locate \"%s\" in PATH", main_argv0); + goto done; + } + + s_info("program path is %s", path); + + /* + * Add --child as the first argument to make sure the child process + * is not going to recurse into being a supervisor, which would eat up + * all the system resources very quickly -- the infamous fork() bomb! + */ + + child_argc = main_argc + 1; + XMALLOC_ARRAY(child_argv, child_argc + 1); /* +1 for trailing NULL */ + + child_argv0 = main_argv0; + child_argv1 = "--child"; + for (i = 1; i <= main_argc; i++) + child_argvi+1 = main_argvi; + + cmd = h_strjoinv(" ", (char **) child_argv); + s_info("will be launching: %s", cmd); + HFREE_NULL(cmd); + + while (aging_count(ag) < MAIN_SUPERVISE_CHILDREN) { + pid_t pid; + int status; + time_t start, end; + + pid = launchve(path, (char **) child_argv, NULL); + start = tm_time_exact(); + + if ((pid_t) -1 == pid) { + s_warning("cannot launch child #%lu: %m", children + 1); + goto done; + } + + children++; + aging_insert(ag, ulong_to_pointer(children), NULL); + setproctitle("supervisor, %lu child%s launched", + children, 1 == children ? "" : "ren"); + + s_info("launched child #%lu as PID %lu", children, (ulong) pid); + + if ((pid_t) -1 == waitpid(pid, &status, 0)) { + s_warning("cannot wait for child PID %lu: %m", (ulong) pid); + goto done; + } + + end = tm_time_exact(); + + s_message("child #%lu (PID %lu) %s after %s", + children, (ulong) pid, exit2str(status), + short_time_ascii(delta_time(end, start))); + + if (0 == status) { + s_info("supervisor exiting, launched %lu child%s over %s", + children, 1 == children ? "" : "ren", + short_time_ascii(delta_time(end, progstart_time().tv_sec))); + exit(EXIT_SUCCESS); + } + } + + s_warning("%zu children were launched during last hour", aging_count(ag)); + + /* FALL THROUGH */ + +done: + s_info("supervisor exiting on failure, launched %lu child%s over %s", + children, 1 == children ? "" : "ren", + short_time_ascii(delta_time(tm_time_exact(), progstart_time().tv_sec))); + + exit(EXIT_FAILURE); +} + +/** + * Allocate new string containing the original command line that launched us. + * + * @return command line string, which must be freed with hfree(). + */ +char * +main_command_line(void) +{ + g_assert(main_argv != NULL); /* progstart_dup() called */ + + return h_strjoinv(" ", (char **) main_argv); } #ifndef GTA_PATCHLEVEL @@ -1602,49 +2137,91 @@ int main(int argc, char **argv) { - int sp; size_t str_discrepancies; product_init(GTA_PRODUCT_NAME, GTA_VERSION, GTA_SUBVERSION, GTA_PATCHLEVEL, GTA_REVCHAR, GTA_RELEASE, GTA_VERSION_NUMBER, GTA_REVISION, GTA_BUILD); + product_set_nickname(GTA_PRODUCT_NICK); product_set_website(GTA_WEBSITE); - product_set_interface(GTA_INTERFACE); - mingw_early_init(); - gm_savemain(argc, argv, environ); /* For gm_setproctitle() */ - tm_init(); + /* + * On Windows, the code path used for a GUI-launched application requires + * that the product information be filled, to be able to derive proper + * destination for log paths, since there is no console attached. + */ + + progstart(argc, argv); + prehandle_arguments(argv); + product_set_interface(OPT(topless) ? "Topless" : GTA_INTERFACE); if (compat_is_superuser()) { - fprintf(stderr, "Never ever run this as root! You may use:\n\n"); - fprintf(stderr, " su - username -c 'gtk-gnutella --daemonize'\n\n"); + fprintf(stderr, + "Never ever run %s as root! You may use:\n\n", getprogname()); + fprintf(stderr, + " su - username -c '%s --daemonize'\n\n", getprogname()); fprintf(stderr, "where 'username' stands for a regular user name.\n"); exit(EXIT_FAILURE); } + /* Disable walloc() and halloc() if we're going to supervise */ + + if (!OPT(no_supervise) && !OPT(child)) { + (void) walloc_active_limit(); + (void) halloc_disable(); + } + + /* + * We can no longer do this: as soon as threads are created, they can + * use pipe() or socketpair() to create blocking resources and we cannot + * close the descriptors blindly because we have no way to know from here + * whether a descriptor was already created in the parent process and + * inherited or whether it was opened by the thread layer. + * + * Note that even moving this code up in main() is not good as our malloc() + * routine can be called during the C startup, and that will immediately + * create threads. + * + * --RAM, 2014-01-02 + */ + +#if 0 /* * This must be run before we allocate memory because we might * use mmap() with /dev/zero and then accidently close this * file descriptor. + * + * We rely on fd_first_available() to tell us the next file descriptor + * that will be used by open(). We used to hardwire the value 3 here, + * but this is wrong as we cannot assume that a low-level library will + * not request a file descriptor before we reach this point. + * --RAM, 2012-06-03 */ - close_file_descriptors(3); /* Just in case */ - + { + int first_fd; + + first_fd = fd_first_available(); + first_fd = MAX(first_fd, 3); /* Paranoid: always keep 0,1,2 */ + fd_close_from(first_fd); /* Just in case */ + } +#endif + if (reserve_standard_file_descriptors()) { - fprintf(stderr, "unable to reserve standard file descriptors\n"); + fprintf(stderr, "%s: unable to reserve standard file descriptors\n", + getprogname()); exit(EXIT_FAILURE); } /* First inits -- no memory allocated */ misc_init(); - prehandle_arguments(argv); /* Initialize memory allocators -- order is important */ - vmm_init(&sp); + vmm_init(); signal_init(); - halloc_init(!optionsmain_arg_no_halloc.used); + halloc_init(!OPT(no_halloc)); malloc_init_vtable(); vmm_malloc_inited(); zinit(); @@ -1652,6 +2229,8 @@ /* At this point, vmm_alloc(), halloc() and zalloc() are up */ + tm_init(TRUE); + signal_set(SIGINT, SIG_IGN); /* ignore SIGINT in adns (e.g. for gdb) */ #ifdef SIGHUP signal_set(SIGHUP, sig_hup); @@ -1675,7 +2254,7 @@ /* Early inits */ log_init(); - main_argc = gm_dupmain(&main_argv, &main_env); + main_argc = progstart_dup(&main_argv, &main_env); str_discrepancies = str_test(FALSE); parse_arguments(argc, argv); validate_arguments(); @@ -1683,8 +2262,8 @@ { int flags = 0; - flags |= optionsmain_arg_pause_on_crash.used ? CRASH_F_PAUSE : 0; - flags |= optionsmain_arg_gdb_on_crash.used ? CRASH_F_GDB : 0; + flags |= OPT(pause_on_crash) ? CRASH_F_PAUSE : 0; + flags |= OPT(gdb_on_crash) ? CRASH_F_GDB : 0; /* * With no core dumps, we want to auto-restart by default, unless @@ -1699,10 +2278,9 @@ */ if (crash_coredumps_disabled()) { - flags |= optionsmain_arg_no_restart.used ? 0 : CRASH_F_RESTART; + flags |= OPT(no_restart) ? 0 : CRASH_F_RESTART; } else { - flags |= - optionsmain_arg_restart_on_crash.used ? CRASH_F_RESTART : 0; + flags |= OPT(restart_on_crash) ? CRASH_F_RESTART : 0; } /* @@ -1713,19 +2291,23 @@ flags |= crash_coredumps_disabled() ? CRASH_F_GDB : 0; - crash_init(argv0, product_get_name(), - flags, optionsmain_arg_exec_on_crash.arg); - crash_setbuild(product_get_build()); - crash_setmain(main_argc, main_argv, main_env); - } - stacktrace_init(argv0, TRUE); /* Defer loading until needed */ - handle_arguments_asap(); + /* + * If we're not running with --no-supervise, then we do supervise. + * However, only the child process (the one running with --child) + * is really supervised. + */ - mingw_init(); - atoms_init(); - log_atoms_inited(); /* Atom layer is up */ - eval_init(); - settings_early_init(); + flags |= (!OPT(no_supervise) && OPT(child)) ? CRASH_F_SUPERVISED : 0; + + crash_init(argv0, product_name(), flags, OPTARG(exec_on_crash)); + crash_setnumbers( + product_major(), product_minor(), product_patchlevel()); + crash_setbuild(product_build()); + crash_setmain(); + crash_set_restart(gtk_gnutella_request_restart); + } + + handle_arguments_asap(); /* * This MUST be called after handle_arguments_asap() in case the @@ -1734,12 +2316,39 @@ * It can only be called after settings_early_init() since this * is where the crash directory is initialized. */ - crash_setdir(settings_crash_dir()); + settings_early_init(); + crash_setdir(settings_crash_dir()); handle_arguments(); /* Returning from here means we're good to go */ stacktrace_post_init(); /* And for possibly (hopefully) a long time */ - product_set_interface(running_topless ? "Topless" : GTA_INTERFACE); + /* + * If we are the supervisor process, go supervise and never return here. + */ + + if (!OPT(no_supervise) && !OPT(child)) { + main_supervise(); + g_assert_not_reached(); + } + + /* + * Before using glib-1.2 routines, we absolutely need to tell the library + * that we are going to run multi-threaded. + */ + +#ifdef USE_GLIB1 + if (!g_thread_supported()) + g_thread_init(NULL); +#endif + + /* + * Continue with initializations. + */ + + thread_set_main(FALSE); /* Main thread cannot block! */ + + mingw_init(); + atoms_init(); cq_init(callout_queue_idle, GNET_PROPERTY_PTR(cq_debug)); vmm_memusage_init(); /* After callouut queue is up */ zalloc_memusage_init(); @@ -1750,7 +2359,7 @@ crash_post_init(); /* Done with crash initialization */ /* Our regular inits */ - + #ifndef OFFICIAL_BUILD g_warning("%s \"%s\"", _("unofficial build, accessing files from"), @@ -1764,6 +2373,9 @@ HFREE_NULL(cmd); } + symbols_set_verbose(TRUE); + vmea_reserve(VMEA_SIZE, TRUE); + /* * If one of the two below fails, the GLib installation is broken. * Gtk+ 1.2 and GLib 1.2 are not 64-bit clean, thus must not be @@ -1777,12 +2389,18 @@ STATIC_ASSERT(UNSIGNED(-1) > 0); STATIC_ASSERT(IS_POWER_OF_2(MEM_ALIGNBYTES)); + mem_test(); random_init(); + vsort_init(1); + htable_test(); wq_init(); - inputevt_init(optionsmain_arg_use_poll.used); + inputevt_init(OPT(use_poll)); + teq_io_create(); + teq_set_throttle(70, 50); /* 70 ms max for TEQ events, every 50 ms */ tiger_check(); tt_check(); tea_test(); + xxtea_test(); patricia_test(); strtok_test(); locale_init(); @@ -1791,18 +2409,19 @@ socket_init(); gnet_stats_init(); iso3166_init(); - dbus_util_init(); + dbus_util_init(OPT(no_dbus)); vendor_init(); mime_type_init(); if (!running_topless) { - main_gui_early_init(argc, argv, optionsmain_arg_no_xshm.used); + main_gui_early_init(argc, argv, OPT(no_xshm)); } bg_init(); upnp_init(); udp_init(); urpc_init(); + g2_rpc_init(); vmsg_init(); tsync_init(); watcher_init(); @@ -1840,6 +2459,7 @@ guid_init(); uhc_init(); ghc_init(); + gwc_init(); verify_sha1_init(); verify_tth_init(); move_init(); @@ -1853,6 +2473,7 @@ bsched_init(); dump_init(); node_init(); + g2_node_init(); hcache_retrieve_all(); /* after settings_init() and node_init() */ routing_init(); search_init(); @@ -1871,7 +2492,6 @@ clock_init(); dq_init(); dh_init(); - bitzi_init(); sq_init(); gdht_init(); pdht_init(); @@ -1888,6 +2508,7 @@ file_info_init_post(); download_restore_state(); ntp_init(); + random_added_listener_add(settings_add_randomness); /* Some signal handlers */ @@ -1908,6 +2529,8 @@ /* Okay, here we go */ + vmm_set_strategy(VMM_STRATEGY_LONG_TERM); + (void) tm_time_exact(); cq_main_insert(1000, scan_files_once, NULL); bsched_enable_all(); @@ -1915,12 +2538,12 @@ dht_attempt_bootstrap(); http_test(); vxml_test(); + g2_tree_test(); if (running_topless) { topless_main_run(); } else { - main_gui_run(optionsmain_arg_geometry.arg, - optionsmain_arg_minimized.used); + main_gui_run(OPTARG(geometry), OPT(minimized)); } return 0;
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-104 -: $X-Id: Jmake.tmpl 69 2011-01-09 13:57:07Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -40,9 +40,9 @@ CC = $cc CTAGS = ctags _EXE = $_exe -JCFLAGS = \$(CFLAGS) $optimize $ccflags $large +JCFLAGS = \$(CFLAGS) $optimize $pthread $ccflags $large JCPPFLAGS = $cppflags -JLDFLAGS = \$(LDFLAGS) $optimize $ldflags +JLDFLAGS = \$(LDFLAGS) $optimize $pthread $ldflags LIBS = $libs MKDEP = $mkdep \$(DPFLAGS) \$(JCPPFLAGS) -- MV = $mv @@ -71,7 +71,7 @@ $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 99 2011-11-05 13:27:37Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Force 'make depend' to be performed first -- do not edit @@ -245,6 +245,11 @@ $(RM) Makefile config.sh install:: local_install + @exit 0 + +install-strip:: local_install-strip + @exit 0 + install.man:: maybe_install.man deinstall:: local_deinstall deinstall.man:: maybe_deinstall.man @@ -283,6 +288,9 @@ local_install:: @echo "install in $(CURRENT) done." +local_install-strip:: + @echo "install (strip) in $(CURRENT) done." + local_deinstall:: @echo "deinstall in $(CURRENT) done."
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/README.too -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/README.too
Changed
@@ -140,6 +140,7 @@ * Added sdbm_shrink() to truncate files if trailing parts are empty. * Added the "truncate" (aka "shrink") command to dbu and made "insert" work. + Thu Oct 14 00:21:01 CEST 2010 Changes from Raphael Manfredi <Raphael_Manfredi@pobox.com>: @@ -155,6 +156,7 @@ making sure all the keys belong to their page (i.e. that the .dir and .pag files are consistent), deleting all non-belonging keys. + Wed Jun 1 18:49:58 CEST 2011 Changes from Raphael Manfredi <Raphael_Manfredi@pobox.com>: @@ -164,6 +166,7 @@ and that no allocated block is leaking (i.e. is indeed referred by a key or value) nor is shared (i.e. referred by several big keys or values). + Mon Nov 21 22:54:22 CET 2011 Changes from Raphael Manfredi <Raphael_Manfredi@pobox.com>: @@ -180,3 +183,53 @@ * Fixed page splits to make them work with large keys. * Added detection of regular API usage to store/fetch/delete entries from within an iteration loop. + + +Sun Oct 21 14:52:42 CEST 2012 + +Changes from Raphael Manfredi <Raphael_Manfredi@pobox.com>: + +* Fixed SDBM iteration in the presence of unflushed dirty LRU pages. + + +Thu Nov 22 20:30:18 CET 2012 + +Changes from Raphael Manfredi <Raphael_Manfredi@pobox.com>: + +* Made sdbm_close() unlink files if database was marked volatile. +* Added sdbm_unlink() to close and unlink database files. +* Added sdbm_get_wdelay(), sdbm_get_cache() and sdbm_is_volatile(). +* Added sdbm_endkey() to abort key iteration early. +* Added sdbm_rebuild() to reconstruct the whole database, hopefully compacting + its disk representation by filling low-order pages. +* Added -f switch to "dba" to only print filled pages. + + +Sat Nov 24 19:51:38 CET 2012 + +Changes from Raphael Manfredi <Raphael_Manfredi@pobox.com>: + +* Loudly warn when sdbm_deletekey() or sdbm_value() are called outside an + iteration loop. +* Made sdbm_rebuild() more fault-tolerant for things we cannot fix, such + as unreadable big keys/values or duplicate keys. +* Made sdbm_nextkey() fail with errno = ENOENT if called outside an iteration. +* Inconsistencies in big keys / values are flagged with errno = EFAULT but + do not trigger an I/O error condition unless we actually get an error reading + or writing data to the disk. + +Tue Sep 24 21:41:05 CEST 2013 + +Changes from Raphael Manfredi <Raphael_Manfredi@pobox.com>: + +* Made the external API thread-safe, when sdbm_thread_safe() is called. +* Added support for critical sections with sdbm_lock() and sdbm_unlock(). +* Explicitly forbid concurrent iterators to run on a thread-safe handle since + the database does not remain locked between iterator calls. + +Thu Sep 11 22:00:38 CEST 2014 + +Changes from Raphael Manfredi <Raphael_Manfredi@pobox.com>: + +* Made SDBM API locks be queueing locks instead of mutexes. +* Added sdbm_foreach() and sdbm_foreach_remove() convenience routines.
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/big.c -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/big.c
Changed
@@ -1,7 +1,7 @@ /* * sdbm - ndbm work-alike hashed database library * - * Big key/value storage management. + * Big key/value storage management. * author: Raphael Manfredi <Raphael_Manfredi@pobox.com> * status: public domain. * @@ -19,13 +19,16 @@ #include "private.h" #include "lib/bit_field.h" +#include "lib/compat_misc.h" #include "lib/compat_pio.h" #include "lib/debug.h" #include "lib/fd.h" #include "lib/file.h" #include "lib/glib-missing.h" #include "lib/halloc.h" +#include "lib/log.h" #include "lib/pow2.h" +#include "lib/stringify.h" #include "lib/unsigned.h" #include "lib/walloc.h" @@ -45,15 +48,7 @@ */ #define BIG_BITCOUNT (BIG_BLKSIZE * 8) -/** - * In order to allocate the ".dat" file only when needed, we need to - * save the filename, flags and mode until open() time. - */ -struct datfile { - char *datname; /* name of the .dat file (before it is opened) */ - int flags; /* open() flags */ - int mode; /* file mode in case it is created */ -}; +enum sdbm_big_magic { SDBM_BIG_MAGIC = 0x230af3e2 }; /** * Whenever big data (large key or value that would not fit in a single @@ -78,7 +73,7 @@ * The DBMBIG descriptor allows access to these data. */ struct DBMBIG { - struct datfile *file; /* file information, kept until file is opened */ + enum sdbm_big_magic magic; bit_field_t *bitbuf; /* current bitmap page (size: BIG_BLKSIZE) */ bit_field_t *bitcheck; /* array of ``bitmaps'' entries, for checks */ char *scratch; /* scratch buffer where key/values are read */ @@ -86,21 +81,28 @@ size_t scratch_len; /* length of the scratch buffer */ int fd; /* data file descriptor */ long bitmaps; /* amount of bitmaps allocated */ - unsigned long bitfetch; /* stats: amount of bitmap fetch calls */ - unsigned long bitread; /* stats: amount of bitmap read requests */ - unsigned long bitbno_hit; /* stats: amount of reads avoided on bitbno */ - unsigned long bitwrite; /* stats: amount of bitmap write requests */ - unsigned long bitwdelayed; /* stats: amount of deferred bitmap writes */ - unsigned long key_matching; /* stats: amount of keys matching attempts */ - unsigned long key_short_match; /* stats: keys matching size, head & tail */ - unsigned long key_full_match; /* stats: fully matched keys */ - unsigned long bigread; /* stats: amount of big data read syscalls */ - unsigned long bigwrite; /* stats: amount of big data write syscalls */ - unsigned long bigread_blk; /* stats: amount of big data blocks read */ - unsigned long bigwrite_blk; /* stats: amount of big data blocks written */ - guint8 bitbuf_dirty; /* whether bitbuf needs flushing to disk */ + ulong bitfetch; /* stats: amount of bitmap fetch calls */ + ulong bitread; /* stats: amount of bitmap read requests */ + ulong bitbno_hit; /* stats: amount of reads avoided on bitbno */ + ulong bitwrite; /* stats: amount of bitmap write requests */ + ulong bitwdelayed; /* stats: amount of deferred bitmap writes */ + ulong key_matching; /* stats: amount of keys matching attempts */ + ulong key_short_match; /* stats: keys matching size, head & tail */ + ulong key_full_match; /* stats: fully matched keys */ + ulong bigread; /* stats: amount of big data read syscalls */ + ulong bigwrite; /* stats: amount of big data write syscalls */ + ulong bigread_blk; /* stats: amount of big data blocks read */ + ulong bigwrite_blk; /* stats: amount of big data blocks written */ + uint8 bitbuf_dirty; /* whether bitbuf needs flushing to disk */ }; +static inline void +sdbm_big_check(const struct DBMBIG * const dbg) +{ + g_assert(dbg != NULL); + g_assert(SDBM_BIG_MAGIC == dbg->magic); +} + static inline long OFF_DAT(unsigned long off) { @@ -149,68 +151,78 @@ sdbm_name(db), dbg->bitread, dbg->bitwrite, dbg->bitwdelayed); g_info("sdbm: \"%s\" bitmap blocknum hits = %.2f%% on %lu request%s", sdbm_name(db), dbg->bitbno_hit * 100.0 / MAX(dbg->bitfetch, 1), - dbg->bitfetch, 1 == dbg->bitfetch ? "" : "s"); + dbg->bitfetch, plural(dbg->bitfetch)); g_info("sdbm: \"%s\" large key short matches = %.2f%% on %lu attempt%s", sdbm_name(db), dbg->key_short_match * 100.0 / MAX(dbg->key_matching, 1), - dbg->key_matching, 1 == dbg->key_matching ? "" : "s"); + dbg->key_matching, plural(dbg->key_matching)); g_info("sdbm: \"%s\" large key full matches = %.2f%% on %lu attempt%s", sdbm_name(db), dbg->key_full_match * 100.0 / MAX(dbg->key_short_match, 1), - dbg->key_short_match, 1 == dbg->key_short_match ? "" : "s"); + dbg->key_short_match, plural(dbg->key_short_match)); g_info("sdbm: \"%s\" big blocks read = %lu (%lu system call%s)", sdbm_name(db), - dbg->bigread_blk, dbg->bigread, 1 == dbg->bigread ? "" : "s"); + dbg->bigread_blk, dbg->bigread, plural(dbg->bigread)); g_info("sdbm: \"%s\" big blocks written = %lu (%lu system call%s)", sdbm_name(db), - dbg->bigwrite_blk, dbg->bigwrite, 1 == dbg->bigwrite ? "" : "s"); + dbg->bigwrite_blk, dbg->bigwrite, plural(dbg->bigwrite)); } /** * Allocate a new descriptor for managing large keys and values. */ DBMBIG * -big_alloc(const char *datname, int flags, int mode) +big_alloc(void) { DBMBIG *dbg; - struct datfile *file; WALLOC0(dbg); + dbg->magic = SDBM_BIG_MAGIC; dbg->fd = -1; dbg->bitbno = -1; - WALLOC(file); - file->datname = h_strdup(datname); - file->flags = flags; - file->mode = mode; - dbg->file = file; + return dbg; +} - /* - * If the .dat file exists and O_TRUNC was given in the flags and the - * database is opened for writing, then the database is re-initialized: - * unlink the .dat file, which will be re-created on-demand. - */ +/** + * Close file descriptor used for the .dat file. + * + * @return TRUE if file descriptor was opened. + */ +bool +big_close(DBM *db) +{ + DBMBIG *dbg = db->big; - if ((flags & (O_RDWR | O_WRONLY)) && (flags & O_TRUNC)) { - unlink(datname); - } + if (NULL == dbg) + return FALSE; - return dbg; + sdbm_big_check(dbg); + + if (-1 == dbg->fd) + return FALSE; + + fd_forget_and_close(&dbg->fd); + return TRUE; } /** - * Free the file information. + * Re-open the .dat file. + * + * @return 0 if OK, -1 on error with errno set. */ -static void -big_datfile_free_null(struct datfile **file_ptr) +int +big_reopen(DBM *db) { - struct datfile *file = *file_ptr; + DBMBIG *dbg = db->big; - if (file != NULL) { - HFREE_NULL(file->datname); - WFREE(file); - *file_ptr = NULL; - } + sdbm_big_check(dbg); + g_assert(-1 == dbg->fd); + + dbg->fd = file_open(db->datname, + db->openflags & ~(O_CREAT | O_TRUNC | O_EXCL), 0); + + return -1 == dbg->fd ? -1 : 0; } /** @@ -224,14 +236,16 @@ if (NULL == dbg) return; + sdbm_big_check(dbg); + if (common_stats) log_bigstats(db); - big_datfile_free_null(&dbg->file); WFREE_NULL(dbg->bitbuf, BIG_BLKSIZE); HFREE_NULL(dbg->bitcheck); HFREE_NULL(dbg->scratch); fd_forget_and_close(&dbg->fd); + dbg->magic = 0; WFREE(dbg); } @@ -241,22 +255,21 @@ * @return -1 on error with errno set, 0 if OK with cleared errno. */ static int -big_open(DBMBIG *dbg) +big_open(DBM *db) { - struct datfile *file; + DBMBIG *dbg = db->big; filestat_t buf; g_assert(-1 == dbg->fd); - g_assert(dbg->file != NULL); + g_assert(db->datname != NULL); - file = dbg->file; - dbg->fd = file_open(file->datname, file->flags | O_CREAT, file->mode); + dbg->fd = file_open(db->datname, db->openflags | O_CREAT, db->openmode); if (-1 == dbg->fd) return -1; - big_datfile_free_null(&dbg->file); dbg->bitbuf = walloc(BIG_BLKSIZE); + compat_fadvise_random(dbg->fd, 0, 0); if (-1 == fstat(dbg->fd, &buf)) { buf.st_size = 0; @@ -292,13 +305,15 @@ * * @return TRUE if OK. */ -gboolean +bool big_check_start(DBM *db) { DBMBIG *dbg = db->big; long i; - if (-1 == dbg->fd && -1 == big_open(dbg)) + sdbm_big_check(dbg); + + if (-1 == dbg->fd && -1 == big_open(db)) return FALSE; if (dbg->bitcheck != NULL) @@ -317,7 +332,7 @@ for (i = 0; i < dbg->bitmaps; i++) { bit_field_t *map = ptr_add_offset(dbg->bitcheck, i * BIG_BLKSIZE); - + bit_field_set(map, 0); /* Bit 0 is for the bitmap itself */ } @@ -338,7 +353,7 @@ * Flush bitmap to disk. * @return TRUE on sucess */ -static gboolean +static bool flush_bitbuf(DBM *db) { DBMBIG *dbg = db->big; @@ -347,12 +362,18 @@ dbg->bitwrite++; w = compat_pwrite(dbg->fd, dbg->bitbuf, BIG_BLKSIZE, OFF_DAT(dbg->bitbno)); + /* + * The bitmap is a critical part hence request immediate flushing of the + * data to the disk, in case a system crash occurs. + */ + if (BIG_BLKSIZE == w) { dbg->bitbuf_dirty = FALSE; + fd_fdatasync(dbg->fd); return TRUE; } - g_critical("sdbm: \"%s\": cannot flush bitmap #%ld: %s", + s_critical("sdbm: \"%s\": cannot flush bitmap #%ld: %s", sdbm_name(db), dbg->bitbno / BIG_BITCOUNT, -1 == w ? g_strerror(errno) : "partial write"); @@ -365,7 +386,7 @@ * * @return TRUE on success. */ -static gboolean +static bool fetch_bitbuf(DBM *db, long num) { DBMBIG *dbg = db->big; @@ -382,7 +403,7 @@ dbg->bitread++; got = compat_pread(dbg->fd, dbg->bitbuf, BIG_BLKSIZE, OFF_DAT(bno)); if (got < 0) { - g_critical("sdbm: \"%s\": could not read bitmap block #%ld: %m", + s_critical("sdbm: \"%s\": could not read bitmap block #%ld: %m", sdbm_name(db), num); ioerr(db, FALSE); return FALSE; @@ -404,30 +425,45 @@ * End bitmap allocation checks that have been started by the usage of one * of the bigkey_mark_used() and bigval_mark_used() routines. * + * @param db the database on which we iterated to check keys + * @param completed whether we completed the iteration + * * @return the amount of corrections brought to the bitmap, 0 meaning * everything was consistent. */ size_t -big_check_end(DBM *db) +big_check_end(DBM *db, bool completed) { DBMBIG *dbg = db->big; long i; size_t adjustments = 0; + sdbm_check(db); + sdbm_big_check(dbg); + if (NULL == dbg->bitcheck) return 0; + /* + * If we did not traverse the whole database, we cannot adjust the bitmap + * because we did not get an opportunity to see all the blocks potentially + * referred-to by keys or values. + */ + + if (!completed) + goto incomplete; /* Avoid extra indentation of loop below */ + for (i = 0; i < dbg->bitmaps; i++) { if (!fetch_bitbuf(db, i)) { adjustments += BIG_BITCOUNT; /* Say, everything was wrong */ } else { - guint8 *p = ptr_add_offset(dbg->bitcheck, i * BIG_BLKSIZE); - guint8 *q = dbg->bitbuf; + uint8 *p = ptr_add_offset(dbg->bitcheck, i * BIG_BLKSIZE); + uint8 *q = dbg->bitbuf; size_t j; size_t old_adjustments = adjustments; for (j = 0; j < BIG_BLKSIZE; j++, p++, q++) { - guint8 mismatch = *p ^ *q; + uint8 mismatch = *p ^ *q; if (mismatch) { adjustments += bits_set(mismatch); *q = *p; @@ -437,14 +473,15 @@ if (old_adjustments != adjustments) { size_t adj = adjustments - old_adjustments; - flush_bitbuf(db); - - g_warning("sdbm: \"%s\": adjusted %zu bit%s in bitmap #%ld", - sdbm_name(db), adj, 1 == adj ? "" : "s", i); + if (flush_bitbuf(db)) { + s_warning("sdbm: \"%s\": adjusted %zu bit%s in bitmap #%ld", + sdbm_name(db), adj, plural(adj), i); + } } } } +incomplete: HFREE_NULL(dbg->bitcheck); return adjustments; @@ -481,7 +518,7 @@ if (!fetch_bitbuf(db, i)) return 0; - + bno = bit_field_first_clear(dbg->bitbuf, first_bit, BIG_BITCOUNT - 1); if ((size_t) -1 == bno) continue; @@ -501,7 +538,7 @@ bno = size_saturate_add(bno, size_saturate_mult(BIG_BITCOUNT, i)); /* Make sure we can represent the block number in 32 bits */ - g_assert(bno <= MAX_INT_VAL(guint32)); + g_assert(bno <= MAX_INT_VAL(uint32)); return bno; /* Allocated block number */ } @@ -517,7 +554,7 @@ * * @return TRUE if the block is allocated. */ -static gboolean +static bool big_block_is_allocated(DBM *db, size_t bno) { DBMBIG *dbg = db->big; @@ -559,8 +596,8 @@ STATIC_ASSERT(IS_POWER_OF_2(BIG_BITCOUNT)); - if (-1 == dbg->fd && -1 == big_open(dbg)) { - g_warning("sdbm: \"%s\": cannot free block #%ld", + if (-1 == dbg->fd && -1 == big_open(db)) { + s_warning("sdbm: \"%s\": cannot free block #%ld", sdbm_name(db), (long) bno); return; } @@ -572,7 +609,7 @@ */ if (!size_is_positive(bno) || 0 == (bno & (BIG_BITCOUNT - 1))) { - g_warning("sdbm: \"%s\": attempt to free invalid block #%ld", + s_warning("sdbm: \"%s\": attempt to free invalid block #%ld", sdbm_name(db), (long) bno); return; } @@ -589,7 +626,7 @@ */ if (bmap >= dbg->bitmaps) { - g_warning("sdbm: \"%s\": " + s_warning("sdbm: \"%s\": " "freed block #%ld falls within invalid bitmap #%ld (max %ld)", sdbm_name(db), (long) bno, bmap, dbg->bitmaps - 1); return; @@ -605,7 +642,7 @@ */ if (!bit_field_get(dbg->bitbuf, i)) { - g_warning("sdbm: \"%s\": freed block #%ld was already marked as free", + s_warning("sdbm: \"%s\": freed block #%ld was already marked as free", sdbm_name(db), (long) bno); return; } @@ -654,7 +691,7 @@ * Bit #0 should always be set but in case the file is corrupted, * we don't want to start allocating data in the bitmap itself!. */ - + first = bit_field_first_clear(dbg->bitbuf, 1, BIG_BITCOUNT - 1); if ((size_t) -1 == first) continue; @@ -688,7 +725,7 @@ size_saturate_mult(BIG_BITCOUNT, i)); /* Make sure we can represent all block numbers in 32 bits */ - g_assert(size_saturate_add(first, n - 1) <= MAX_INT_VAL(guint32)); + g_assert(size_saturate_add(first, n - 1) <= MAX_INT_VAL(uint32)); return first; /* "n" consecutive free blocks found */ } @@ -716,11 +753,13 @@ const void *p; char *q; size_t remain; - guint32 prev_bno; + uint32 prev_bno; - if (-1 == dbg->fd && -1 == big_open(dbg)) + if (-1 == dbg->fd && -1 == big_open(db)) return -1; + g_assert(is_valid_fd(dbg->fd)); + if (dbg->scratch_len < len) big_scratch_grow(dbg, len); @@ -735,17 +774,17 @@ while (n > 0) { size_t toread = MIN(remain, BIG_BLKSIZE); - guint32 bno = peek_be32(p); - + uint32 bno = peek_be32(p); + prev_bno = bno; if (!big_block_is_allocated(db, prev_bno)) goto corrupted_database; - p = const_ptr_add_offset(p, sizeof(guint32)); + p = const_ptr_add_offset(p, sizeof(uint32)); n--; remain = size_saturate_sub(remain, toread); while (n > 0) { - guint32 next_bno = peek_be32(p); + uint32 next_bno = peek_be32(p); size_t amount; if (next_bno <= prev_bno) /* Block numbers are sorted */ @@ -757,7 +796,7 @@ prev_bno = next_bno; if (!big_block_is_allocated(db, prev_bno)) goto corrupted_database; - p = const_ptr_add_offset(p, sizeof(guint32)); + p = const_ptr_add_offset(p, sizeof(uint32)); amount = MIN(remain, BIG_BLKSIZE); toread += amount; n--; @@ -766,7 +805,7 @@ dbg->bigread++; if (-1 == compat_pread(dbg->fd, q, toread, OFF_DAT(bno))) { - g_critical("sdbm: \"%s\": " + s_critical("sdbm: \"%s\": " "could not read %zu bytes starting at data block #%u: %m", sdbm_name(db), toread, bno); @@ -784,18 +823,17 @@ return 0; corrupted_database: - g_critical("sdbm: \"%s\": cannot read unallocated data block #%u", + s_critical("sdbm: \"%s\": cannot read unallocated data block #%u", sdbm_name(db), prev_bno); goto fault; corrupted_page: - g_critical("sdbm: \"%s\": corrupted page: %d big data block%s not sorted", - sdbm_name(db), bcnt, 1 == bcnt ? "" : "s"); + s_critical("sdbm: \"%s\": corrupted page: %d big data block%s not sorted", + sdbm_name(db), bcnt, plural(bcnt)); /* FALL THROUGH */ fault: - ioerr(db, FALSE); errno = EFAULT; /* Data corrupted somehow (.pag or .dat file) */ return -1; } @@ -841,16 +879,18 @@ * * @return TRUE if the key matches. */ -gboolean +bool bigkey_eq(DBM *db, const char *bkey, size_t blen, const char *key, size_t siz) { size_t len = big_length(bkey); DBMBIG *dbg = db->big; + sdbm_big_check(dbg); + if G_UNLIKELY(bigkey_length(len) != blen) { - g_carp("sdbm: \"%s\": found %zu-byte corrupted key " + s_carp("sdbm: \"%s\": found %zu-byte corrupted key " "(%zu byte%s on page instead of %zu)", - sdbm_name(db), len, blen, 1 == blen ? "" : "s", bigkey_length(len)); + sdbm_name(db), len, blen, plural(blen), bigkey_length(len)); return FALSE; } @@ -910,7 +950,7 @@ 0 != memcmp(db->big->scratch + (siz-BIG_KEYSAVED), bigkey_tail(bkey), BIG_KEYSAVED) ) { - g_critical("sdbm: \"%s\": found %zu-byte key page/data inconsistency", + s_critical("sdbm: \"%s\": found %zu-byte key page/data inconsistency", sdbm_name(db), siz); return FALSE; } @@ -929,30 +969,61 @@ * @param db the sdbm database * @param bkey start of big key in the page * @param blen length of big key in the page + * @param failed set to TRUE on failure * - * @return hashed value. + * @return hashed value, 0 on failure with `failed' set to TRUE. */ long -bigkey_hash(DBM *db, const char *bkey, size_t blen) +bigkey_hash(DBM *db, const char *bkey, size_t blen, bool *failed) { size_t len = big_length(bkey); if G_UNLIKELY(bigkey_length(len) != blen) { - g_carp("sdbm: \"%s\": found %zu-byte corrupted key " - "(%zu byte%s on page instead of %zu)", - sdbm_name(db), len, blen, 1 == blen ? "" : "s", bigkey_length(len)); - ioerr(db, FALSE); - return 0; + s_critical("sdbm: \"%s\": found %zu-byte corrupted key " + "(%zu byte%s on page instead of %zu) on page #%lu", + sdbm_name(db), len, blen, plural(blen), + bigkey_length(len), db->pagbno); + goto corrupted; } - if (-1 == big_fetch(db, bigkey_blocks(bkey), len)) { - g_warning("sdbm: \"%s\": returning hash of 0, corrupting database", - sdbm_name(db)); - ioerr(db, FALSE); - return 0; + /* + * This may not necessarily be a big key: we could be facing a corrupted + * page and think it could be a big key whereas big key support is + * not enabled. + */ + + if G_UNLIKELY(NULL == db->datname) { + s_critical("sdbm: \"%s\": found a big key on page #%lu, " + "but support is disabled", + sdbm_name(db), db->pagbno); + goto plain; } + if (-1 == big_fetch(db, bigkey_blocks(bkey), len)) + goto corrupted; + + *failed = FALSE; return sdbm_hash(db->big->scratch, len); + +corrupted: + s_critical("sdbm: \"%s\": unreadable %zu-byte big key, " + "hashing its %zu-byte data on page #%lu", + sdbm_name(db), len, blen, db->pagbno); + + /* FALL THROUGH */ + +plain: + db->bad_bigkeys++; + + /* + * This is wrong of course, but the only time we need to hash the key + * again is during a page split. Since we can't access the key data, + * better return a deterministic value, which is not the key hash, + * and signal the error. + */ + + *failed = TRUE; + return 0; } /** @@ -977,9 +1048,11 @@ g_return_val_if_fail(NULL == dbg->bitcheck, -1); - if (-1 == dbg->fd && -1 == big_open(dbg)) + if (-1 == dbg->fd && -1 == big_open(db)) return -1; + g_assert(is_valid_fd(dbg->fd)); + /* * Look at the amount of consecutive block numbers we have to be able * to write into them via a single system call. @@ -992,15 +1065,15 @@ while (n > 0) { size_t towrite = MIN(remain, BIG_BLKSIZE); - guint32 bno = peek_be32(p); - guint32 prev_bno = bno; + uint32 bno = peek_be32(p); + uint32 prev_bno = bno; - p = const_ptr_add_offset(p, sizeof(guint32)); + p = const_ptr_add_offset(p, sizeof(uint32)); n--; remain = size_saturate_sub(remain, towrite); while (n > 0) { - guint32 next_bno = peek_be32(p); + uint32 next_bno = peek_be32(p); size_t amount; if (next_bno <= prev_bno) /* Block numbers are sorted */ @@ -1010,7 +1083,7 @@ break; /* Not consecutive */ prev_bno = next_bno; - p = const_ptr_add_offset(p, sizeof(guint32)); + p = const_ptr_add_offset(p, sizeof(uint32)); amount = MIN(remain, BIG_BLKSIZE); towrite += amount; n--; @@ -1019,7 +1092,7 @@ dbg->bigwrite++; if (-1 == compat_pwrite(dbg->fd, q, towrite, OFF_DAT(bno))) { - g_critical("sdbm: \"%s\": " + s_critical("sdbm: \"%s\": " "could not write %zu bytes starting at data block #%u: %m", sdbm_name(db), towrite, bno); @@ -1037,10 +1110,9 @@ return 0; corrupted_page: - g_critical("sdbm: \"%s\": corrupted page: %d big data block%s not sorted", - sdbm_name(db), bcnt, 1 == bcnt ? "" : "s"); + s_critical("sdbm: \"%s\": corrupted page: %d big data block%s not sorted", + sdbm_name(db), bcnt, plural(bcnt)); - ioerr(db, FALSE); errno = EFAULT; /* Data corrupted somehow (.pag file) */ return -1; } @@ -1062,13 +1134,13 @@ g_assert(size_is_non_negative(len)); g_assert(bigblocks(old_len) == bigblocks(len)); - g_assert(len <= MAX_INT_VAL(guint32)); + g_assert(len <= MAX_INT_VAL(uint32)); /* * Write data on the same blocks as before, since we know it will fit. */ - poke_be32(bval, (guint32) len); /* First 4 bytes: real data length */ + poke_be32(bval, (uint32) len); /* First 4 bytes: real data length */ return big_store(db, bigval_blocks(bval), data, len); } @@ -1090,7 +1162,7 @@ for (q = bvec, n = bcnt; n > 0; n--) { bno = peek_be32(q); big_ffree(db, bno); - q = const_ptr_add_offset(q, sizeof(guint32)); + q = const_ptr_add_offset(q, sizeof(uint32)); } /* @@ -1120,7 +1192,7 @@ * * @return TRUE if we were able to allocate all the requested blocks. */ -static gboolean +static bool big_file_alloc(DBM *db, void *bvec, int bcnt) { DBMBIG *dbg = db->big; @@ -1132,7 +1204,7 @@ g_assert(bcnt > 0); g_return_val_if_fail(NULL == dbg->bitcheck, FALSE); - if (-1 == dbg->fd && -1 == big_open(dbg)) + if (-1 == dbg->fd && -1 == big_open(db)) return FALSE; /* @@ -1175,7 +1247,7 @@ for (q = bvec, n = bcnt - n; n > 0; n--) { first = peek_be32(q); big_ffree(db, first); - q = ptr_add_offset(q, sizeof(guint32)); + q = ptr_add_offset(q, sizeof(uint32)); } /* @@ -1215,7 +1287,7 @@ for (q = bvec, n = bcnt; n > 0; n--) { first = peek_be32(q); big_ffree(db, first); - q = ptr_add_offset(q, sizeof(guint32)); + q = ptr_add_offset(q, sizeof(uint32)); } return FALSE; } @@ -1238,10 +1310,11 @@ size_t len = big_length(bkey); DBMBIG *dbg = db->big; + sdbm_big_check(dbg); + if (bigkey_length(len) != blen) { - g_critical("sdbm: \"%s\": " - "bigkey_get: inconsistent key length %zu in .pag", - sdbm_name(db), len); + s_critical("sdbm: \"%s\": %s(): inconsistent key length %zu in .pag", + sdbm_name(db), G_STRFUNC, len); return NULL; } @@ -1266,10 +1339,11 @@ size_t len = big_length(bval); DBMBIG *dbg = db->big; + sdbm_big_check(dbg); + if (bigval_length(len) != blen) { - g_critical("sdbm: \"%s\": " - "bigval_get: inconsistent value length %zu in .pag", - sdbm_name(db), len); + s_critical("sdbm: \"%s\": %s(): inconsistent value length %zu in .pag", + sdbm_name(db), G_STRFUNC, len); return NULL; } @@ -1288,15 +1362,14 @@ * * @return TRUE on success. */ -gboolean +bool bigkey_free(DBM *db, const char *bkey, size_t blen) { size_t len = big_length(bkey); if (bigkey_length(len) != blen) { - g_critical("sdbm: \"%s\": " - "bigkey_free: inconsistent key length %zu in .pag", - sdbm_name(db), len); + s_critical("sdbm: \"%s\": %s(): inconsistent key length %zu in .pag", + sdbm_name(db), G_STRFUNC, len); return FALSE; } @@ -1313,15 +1386,14 @@ * * @return TRUE on success. */ -gboolean +bool bigval_free(DBM *db, const char *bval, size_t blen) { size_t len = big_length(bval); if (bigval_length(len) != blen) { - g_critical("sdbm: \"%s\": " - "bigval_free: inconsistent key length %zu in .pag", - sdbm_name(db), len); + s_critical("sdbm: \"%s\": %s(): inconsistent key length %zu in .pag", + sdbm_name(db), G_STRFUNC, len); return FALSE; } @@ -1340,7 +1412,7 @@ * * @return TRUE on success. */ -static gboolean +static bool big_file_check(const char *what, DBM *db, const void *bvec, int bcnt) { size_t prev_bno = 0; /* 0 is invalid: it's the first bitmap */ @@ -1357,18 +1429,18 @@ size_t bit; if (!big_block_is_allocated(db, bno)) { - g_warning("sdbm: \"%s\": " + s_warning("sdbm: \"%s\": " "%s from .pag refers to unallocated block %zu in .dat", sdbm_name(db), what, bno); return FALSE; } if (prev_bno != 0 && bno <= prev_bno) { - g_warning("sdbm: \"%s\": " + s_warning("sdbm: \"%s\": " "%s from .pag lists unordered block list (corrupted file?)", sdbm_name(db), what); return FALSE; } - q = const_ptr_add_offset(q, sizeof(guint32)); + q = const_ptr_add_offset(q, sizeof(uint32)); prev_bno = bno; /* @@ -1386,7 +1458,7 @@ map = ptr_add_offset(db->big->bitcheck, bmap * BIG_BLKSIZE); if (bit_field_get(map, bit)) { - g_warning("sdbm: \"%s\": " + s_warning("sdbm: \"%s\": " "%s from .pag refers to already seen block %zu in .dat", sdbm_name(db), what, bno); return FALSE; @@ -1405,13 +1477,13 @@ * * @return TRUE on success. */ -gboolean +bool bigkey_check(DBM *db, const char *bkey, size_t blen) { size_t len = big_length(bkey); if (bigkey_length(len) != blen) { - g_warning("sdbm: \"%s\": found inconsistent key length %zu, " + s_warning("sdbm: \"%s\": found inconsistent key length %zu, " "would span %zu bytes in .pag instead of the %zu present", sdbm_name(db), len, bigkey_length(len), blen); return FALSE; @@ -1429,13 +1501,13 @@ * * @return TRUE on success. */ -gboolean +bool bigval_check(DBM *db, const char *bval, size_t blen) { size_t len = big_length(bval); if (bigval_length(len) != blen) { - g_warning("sdbm: \"%s\": found inconsistent value length %zu, " + s_warning("sdbm: \"%s\": found inconsistent value length %zu, " "would span %zu bytes in .pag instead of the %zu present", sdbm_name(db), len, bigkey_length(len), blen); return FALSE; @@ -1469,7 +1541,7 @@ bmap = bno / BIG_BITCOUNT; /* Bitmap handling this block */ bit = bno & (BIG_BITCOUNT - 1); /* Index within bitmap */ - q = const_ptr_add_offset(q, sizeof(guint32)); + q = const_ptr_add_offset(q, sizeof(uint32)); /* * It's because of this sanity check that we don't want to consider @@ -1500,7 +1572,7 @@ size_t len = big_length(bkey); if (bigkey_length(len) != blen) { - g_carp("sdbm: \"%s\": %s: inconsistent key length %zu in .pag", + s_carp("sdbm: \"%s\": %s(): inconsistent key length %zu in .pag", sdbm_name(db), G_STRFUNC, len); return; } @@ -1522,7 +1594,7 @@ size_t len = big_length(bval); if (bigval_length(len) != blen) { - g_carp("sdbm: \"%s\": %s: inconsistent value length %zu in .pag", + s_carp("sdbm: \"%s\": %s(): inconsistent value length %zu in .pag", sdbm_name(db), G_STRFUNC, len); return; } @@ -1542,7 +1614,7 @@ * * @return TRUE if key was written successfully in the .dat file. */ -gboolean +bool bigkey_put(DBM *db, char *bkey, size_t blen, const char *key, size_t klen) { g_assert(bigkey_length(klen) == blen); @@ -1558,7 +1630,7 @@ * last BIG_KEYSAVED bytes of key */ - poke_be32(bkey, (guint32) klen); + poke_be32(bkey, (uint32) klen); memcpy(bigkey_head(bkey), key, BIG_KEYSAVED); memcpy(bigkey_tail(bkey), key + (klen - BIG_KEYSAVED), BIG_KEYSAVED); @@ -1586,7 +1658,7 @@ * * @return TRUE if value was written successfully in the .dat file. */ -gboolean +bool bigval_put(DBM *db, char *bval, size_t blen, const char *val, size_t vlen) { g_assert(bigval_length(vlen) == blen); @@ -1600,7 +1672,7 @@ * value size */ - poke_be32(bval, (guint32) vlen); + poke_be32(bval, (uint32) vlen); /* * And now the indirection block numbers of the value, pointing in .dat. @@ -1622,6 +1694,8 @@ { STATIC_ASSERT(BIG_BLKSIZE == DBM_BBLKSIZ); + sdbm_big_check(db->big); + return db->big->fd; } @@ -1630,11 +1704,16 @@ * * @return TRUE if OK, FALSE on error */ -gboolean +bool big_sync(DBM *db) { DBMBIG *dbg = db->big; + if (NULL == dbg) + return TRUE; /* No .dat file to sync */ + + sdbm_big_check(dbg); + if (-1 == dbg->fd) return TRUE; @@ -1647,25 +1726,26 @@ /** * Open the .dat file only if it already exists, which justifies the "lazy" * qualification. If the file exists but is empty, it will be deleted. - * + * * @param dbg the big DBM descriptor * @param force if TRUE, call big_open() to actually open (create) the file * * @return -1 on error with errno set, 0 if OK (file opened). */ static int -big_open_lazy(DBMBIG *dbg, gboolean force) +big_open_lazy(DBM *db, bool force) { + DBMBIG *dbg = db->big; filestat_t buf; g_assert(-1 == dbg->fd); - if (NULL == dbg->file) { + if (NULL == db->datname) { errno = EINVAL; return -1; } - if (-1 == stat(dbg->file->datname, &buf)) { + if (-1 == stat(db->datname, &buf)) { if (ENOENT == errno) { errno = 0; /* OK if .dat file is missing */ } @@ -1673,14 +1753,14 @@ } if (0 == buf.st_size) { - if (-1 != unlink(dbg->file->datname)) { + if (-1 != unlink(db->datname)) { errno = 0; } return -1; } if (force) - return big_open(dbg); + return big_open(db); errno = EEXIST; return -1; /* File not opened, but file already exists */ @@ -1691,20 +1771,22 @@ * * @return TRUE if we were able to successfully shrink the file. */ -gboolean +bool big_shrink(DBM *db) { DBMBIG *dbg = db->big; long i; filesize_t offset = 0; + sdbm_big_check(dbg); + if (-1 == dbg->fd) { /* * We do not want to call big_open() unless the .dat file already * exists because that would create it and it was not needed so far. */ - if (-1 == big_open_lazy(dbg, TRUE)) + if (-1 == big_open_lazy(db, TRUE)) return 0 == errno; } @@ -1724,7 +1806,7 @@ bno = bit_field_last_set(dbg->bitbuf, 0, BIG_BITCOUNT - 1); if ((size_t) -1 == bno) { - g_critical("sdbm: \"%s\": corrupted bitmap #%ld, considered empty", + s_critical("sdbm: \"%s\": corrupted bitmap #%ld, considered empty", sdbm_name(db), i); } else if (bno != 0) { bno = size_saturate_add(bno, size_saturate_mult(BIG_BITCOUNT, i)); @@ -1746,20 +1828,22 @@ * * @return TRUE if we were able to successfully unlink the file. */ -gboolean +bool big_clear(DBM *db) { DBMBIG *dbg = db->big; + sdbm_big_check(dbg); + if (-1 == dbg->fd) { /* * We do not want to call big_open() unless the .dat file already * exists because that would create it and it was not needed so far. */ - if (-1 == big_open_lazy(dbg, FALSE)) { + if (-1 == big_open_lazy(db, FALSE)) { if (EEXIST == errno) { - if (-1 != unlink(dbg->file->datname)) { + if (-1 != unlink(db->datname)) { errno = 0; } } @@ -1777,7 +1861,7 @@ HFREE_NULL(dbg->scratch); dbg->scratch_len = 0; - if (-1 == unlink(dbg->file->datname)) + if (-1 == unlink(db->datname)) return FALSE; return TRUE;
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/big.h -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/big.h
Changed
@@ -16,6 +16,8 @@ #define bigkey_put sdbm__bigkey_put #define bigval_put sdbm__bigval_put #define big_sync sdbm__big_sync +#define big_close sdbm__big_close +#define big_reopen sdbm__big_reopen #define bigkey_free sdbm__bigkey_free #define bigval_free sdbm__bigval_free #define bigkey_check sdbm__bigkey_check @@ -28,24 +30,26 @@ size_t bigkey_length(size_t); size_t bigval_length(size_t); -gboolean bigkey_eq(DBM *, const char *, size_t, const char *, size_t); -long bigkey_hash(DBM *, const char *, size_t); +bool bigkey_eq(DBM *, const char *, size_t, const char *, size_t); +long bigkey_hash(DBM *, const char *, size_t, bool *); char *bigkey_get(DBM *, const char *, size_t); char *bigval_get(DBM *, const char *, size_t); -struct DBMBIG *big_alloc(const char *, int, int); +struct DBMBIG *big_alloc(void); int big_replace(DBM *, char *, const char *, size_t); void big_free(DBM *); int big_datfno(DBM *); -gboolean big_sync(DBM *); -gboolean big_shrink(DBM *); -gboolean big_clear(DBM *); -size_t big_check_end(DBM *); -gboolean bigkey_put(DBM *, char *, size_t, const char *, size_t); -gboolean bigval_put(DBM *, char *, size_t, const char *, size_t); -gboolean bigkey_free(DBM *, const char *, size_t); -gboolean bigval_free(DBM *, const char *, size_t); -gboolean bigkey_check(DBM *, const char *, size_t); -gboolean bigval_check(DBM *, const char *, size_t); +bool big_sync(DBM *); +bool big_shrink(DBM *); +bool big_clear(DBM *); +bool big_close(DBM *); +int big_reopen(DBM *); +size_t big_check_end(DBM *, bool); +bool bigkey_put(DBM *, char *, size_t, const char *, size_t); +bool bigval_put(DBM *, char *, size_t, const char *, size_t); +bool bigkey_free(DBM *, const char *, size_t); +bool bigval_free(DBM *, const char *, size_t); +bool bigkey_check(DBM *, const char *, size_t); +bool bigval_check(DBM *, const char *, size_t); void bigkey_mark_used(DBM *, const char *, size_t); void bigval_mark_used(DBM *, const char *, size_t); @@ -71,7 +75,7 @@ static inline char * bigkey_head(const char *p) { - return deconstify_gchar(p) + sizeof(guint32); /* Skip key length */ + return deconstify_char(p) + sizeof(uint32); /* Skip key length */ } /** @@ -98,6 +102,6 @@ static inline char * bigval_blocks(const char *p) { - return deconstify_gchar(p) + sizeof(guint32); /* Skip value length */ + return deconstify_char(p) + sizeof(uint32); /* Skip value length */ }
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/dba.c -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/dba.c
Changed
@@ -5,27 +5,28 @@ #include "common.h" #include "casts.h" +#include "lib/progname.h" #include "lib/pow2.h" /* For bits_set() */ +#include "lib/stringify.h" /* For plural() */ #include "sdbm.h" -char *progname; -extern G_GNUC_PRINTF(1, 2) void oops(char *fmt, ...); +extern void oops(char *fmt, ...) G_PRINTF(1, 2); void sdump(int, long); void bdump(int); -#define bool int - static bool summary_only; +static bool filled_only; static bool on_tty; -static void G_GNUC_NORETURN +static void G_NORETURN usage(void) { fprintf(stderr, - "Usage: %s -s dbname\n" + "Usage: %s -fs dbname\n" + " -f : only print filled pages, skip empty ones\n" " -s : display summary info only\n" - , progname + , getprogname() ); exit(EXIT_FAILURE); } @@ -45,17 +46,18 @@ main(int argc, char **argv) { extern int optind; - extern char *optarg; char *p; int c; - progname = argv0; - (void) argc; + progstart(argc, argv); on_tty = isatty(STDOUT_FILENO); - while ((c = getopt(argc, argv, "s")) != EOF) { + while ((c = getopt(argc, argv, "fs")) != EOF) { switch (c) { + case 'f': /* show filled pages only */ + filled_only++; + break; case 's': /* summary info only */ summary_only++; break; @@ -114,7 +116,7 @@ return off & 0x7fff; } -static inline gboolean +static inline bool is_big(unsigned short off) { return booleanize(off & 0x8000); @@ -131,7 +133,7 @@ int keysize = 0, valsize = 0; if (!(n = ino0)) { - if (!summary_only) + if (!summary_only && !filled_only) printf("no entries.\n"); } else { unsigned i; @@ -169,6 +171,13 @@ return n / 2; } +static inline bool +page_is_empty(const char *pag) +{ + register unsigned short *ino = (unsigned short *) pag; + return 0 == ino0; +} + void sdump(int pagf, long npag) { @@ -186,13 +195,20 @@ while ((b = read(pagf, pag, DBM_PBLKSIZ)) > 0) { int lk, lv; unsigned ks, vs; + bool is_bad = !sdbm_internal_chkpage(pag); + bool is_empty = page_is_empty(pag); + if (summary_only && 0 == n % 1000) show_progress(n, npag); - if (!summary_only) printf("#%d: ", n); - if (!sdbm_internal_chkpage(pag)) { + if ( + !summary_only && + (is_bad || !filled_only || (filled_only && !is_empty)) + ) + printf("#%d: ", n); + if (is_bad) { + /* Bad pages are displayed when -f is given */ bad++; if (!summary_only) printf("bad\n"); } else { - if (!summary_only) printf("ok. "); if (!(e = pagestat(pag, &ks, &vs, &lk, &lv))) { o++; } else { @@ -212,8 +228,7 @@ printf("keys: %u bytes, values: %u bytes\n", ksize, vsize); if (tlk || tlv) printf("%d large key%s, %d large value%s\n", - tlk, 1 == tlk ? "" : "s", - tlv, 1 == tlv ? "" : "s"); + tlk, plural(tlk), tlv, plural(tlv)); } else oops("read failed: block %d", n); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/dbd.c -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/dbd.c
Changed
@@ -4,11 +4,14 @@ #include <stdio.h> #include <sys/file.h> + +#include "common.h" + #include "sdbm.h" -char *progname; -extern void oops(); +#include "lib/progname.h" +extern void oops(); #define empty(page) (((short *) page)0 == 0) @@ -20,7 +23,7 @@ char *name; int pagf; - progname = argv0; + progstart(argc, argv); if (p = argv1) { name = (char *) malloc((n = strlen(p)) + 5); @@ -36,7 +39,7 @@ sdump(pagf); } else - oops("usage: %s dbname", progname); + oops("usage: %s dbname", getprogname()); return 0; } @@ -46,9 +49,9 @@ register r; register n = 0; register o = 0; - char pagPBLKSIZ; + char pagDBM_PBLKSIZ; - while ((r = read(pagf, pag, PBLKSIZ)) > 0) { + while ((r = read(pagf, pag, DBM_PBLKSIZ)) > 0) { if (!sdbm_internal_chkpage(pag)) fprintf(stderr, "%d: bad page.\n", n); else if (empty(pag)) @@ -95,7 +98,7 @@ register off; register short *ino = (short *) pag; - off = PBLKSIZ; + off = DBM_PBLKSIZ; for (i = 1; i < ino0; i += 2) { for (n = inoi; n < off; n++) if (pagn != 0)
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/dbe.c -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/dbe.c
Changed
@@ -1,8 +1,9 @@ #include "common.h" #include "sdbm.h" #include "lib/base16.h" +#include "lib/progname.h" -extern G_GNUC_PRINTF(1, 2) void oops(char *fmt, ...); +extern void oops(char *fmt, ...) G_PRINTF(1, 2); /***************************************************************************\ ** ** @@ -295,14 +296,12 @@ fprintf(stderr, ": %s\n", g_strerror(saved)); } -char *progname; - -static void G_GNUC_NORETURN +static void G_NORETURN usage(void) { fprintf(stderr, "Usage: %s -a|-c|-d|-f|-F|-s database " - "-m r|w|rw -bikortxXy key content\n", progname); + "-m r|w|rw -bikortxXy key content\n", getprogname()); fprintf(stderr, " -a : list all entries (as \"key: value\") in the database.\n" " -b : content given / output as binary.\n" @@ -352,7 +351,7 @@ char *mode = NULL; FILE *f = stdout; - progname = argv0; + progstart(argc, argv); flags = O_RDWR; argn = 0;
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/dbt.c -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/dbt.c
Changed
@@ -32,20 +32,21 @@ #include "common.h" +#include "lib/progname.h" +#include "lib/rand31.h" +#include "lib/str.h" +#include "lib/stringify.h" /* For plural() */ #include "lib/tm.h" -#include "lib/glib-missing.h" #include "sdbm.h" -#define bool int +extern void oops(char *fmt, ...) G_PRINTF(1, 2); -extern G_GNUC_PRINTF(1, 2) void oops(char *fmt, ...); - -char *progname; static bool progress; -static bool shrink; +static bool shrink, rebuild, thread_safe; static bool randomize; static unsigned rseed; +static bool unlink_db; static bool large_keys, large_values, common_head_tail; #define WR_DELAY (1 << 0) @@ -53,28 +54,12 @@ #define WR_EMPTY (1 << 2) #define WR_DELETING (1 << 3) -#define MY_RANDMAX 32767 - -static unsigned long next = 1; - -static int -my_rand(void) -{ - next = next * 1103515245 + 12345; - return (unsigned) (next/65536) % (1 + MY_RANDMAX); -} - -static void -my_srand(unsigned seed) -{ - next = seed; -} - -static void G_GNUC_NORETURN +static void G_NORETURN usage(void) { fprintf(stderr, - "Usage: %s -deiikprstvwDEKSV -R seed -c pages dbname count\n" + "Usage: %s -bdeiikprstvwBDEKSTUV -R seed -c pages dbname count\n" + " -b : rebuild the database\n" " -c : set LRU cache size\n" " -d : perform delete test\n" " -e : perform existence test\n" @@ -86,13 +71,16 @@ " -t : show timing results for each test\n" " -v : use large values\n" " -w : perform a write test\n" + " -B : rebuild the database before testing\n" " -D : enable LRU cache write delay\n" " -E : empty existing database on write test\n" " -K : use large keys with common head/tail parts\n" " -R : seed for repeatable random key sequence\n" " -S : shrink database before testing\n" + " -T : make database handle thread-safe\n" + " -U : unlink database at the end\n" " -V : consider database as volatile\n", - progname); + getprogname()); exit(EXIT_FAILURE); } @@ -102,7 +90,7 @@ DBM *db; int flags = writeable ? (O_CREAT|O_RDWR) : O_RDONLY; - if (shrink && !writeable) + if ((shrink || rebuild) && !writeable) flags = O_RDWR; if (WR_EMPTY == (wflags & (WR_EMPTY|WR_DELETING))) @@ -113,6 +101,8 @@ oops("error opening database \"%s\" in %s mode", name, writeable ? "writing" : "reading"); } + if (thread_safe) + sdbm_thread_safe(db); if (cache != 0) { if (-1 == sdbm_set_cache(db, cache)) { oops("error configuring LRU cache for \"%s\"", name); @@ -130,10 +120,29 @@ } if (shrink) sdbm_shrink(db); + if (rebuild) { + tm_t start, end; + printf("Rebuilding database...\n"); + tm_now_exact(&start); + if (-1 == sdbm_rebuild(db)) { + oops("error rebuilding \"%s\"", name); + } + tm_now_exact(&end); + printf("Done in %.3f secs.\n", tm_elapsed_f(&end, &start)); + } return db; } static void +unlink_database(const char *name) +{ + DBM *db; + + db = open_db(name, TRUE, 0, 0); + sdbm_unlink(db); +} + +static void show_progress(long n, long count) { static int c = 0; @@ -168,10 +177,10 @@ } if (randomize) { - int v = my_rand(); - w = gm_snprintf(&bufoffset, avail, "%06d%010ld", v, i); + int v = rand31_u32(); + w = str_bprintf(&bufoffset, avail, "%06d%010ld", v, i); } else { - w = gm_snprintf(&bufoffset, avail, "%016ld", i); + w = str_bprintf(&bufoffset, avail, "%016ld", i); } if (large_keys) { size_t off = len - LARGE_KEY_TAIL; @@ -179,8 +188,31 @@ g_assert(avail > LARGE_KEY_TAIL + COMMON_HEAD_TAIL); if (common_head_tail) off -= COMMON_HEAD_TAIL; - gm_snprintf(&bufoff, LARGE_KEY_TAIL, "%016ld", i); + str_bprintf(&bufoff, LARGE_KEY_TAIL, "%016ld", i); + } +} + +static void +rebuild_db(const char *name, long count, long cache, int wflags, tm_t *done) +{ + DBM *db = open_db(name, TRUE, cache, wflags); + long i; + long cpage = 0 == cache ? 64 : cache; + + printf("Starting rebuild test (%ld time%s), cache=%ld page%s...\n", + count, plural(count), cpage, plural(cpage)); + + for (i = 0; i < count; i++) { + if (progress && 0 == i % 50) + show_progress(i, count); + + if (0 != sdbm_rebuild(db)) + oops("rebuild #%ld failed", i); } + + show_done(done); + + sdbm_close(db); } static void @@ -191,9 +223,9 @@ char buf1024; datum key; long cpage = 0 == cache ? 64 : cache; - + printf("Starting read test (%ld item%s), cache=%ld page%s...\n", - count, 1 == count ? "" : "s", cpage, 1 == cpage ? "" : "s"); + count, plural(count), cpage, plural(cpage)); key.dsize = large_keys ? sizeof buf : NORMAL_KEY_LEN; key.dptr = buf; @@ -216,8 +248,6 @@ show_done(done); sdbm_close(db); - if (sdbm_error(db)) - oops("error closing database \"%s\"", name); } static void @@ -228,9 +258,9 @@ char buf1024; datum key; long cpage = 0 == cache ? 64 : cache; - + printf("Starting existence test (%ld item%s), cache=%ld page%s...\n", - count, 1 == count ? "" : "s", cpage, 1 == cpage ? "" : "s"); + count, plural(count), cpage, plural(cpage)); key.dsize = large_keys ? sizeof buf : NORMAL_KEY_LEN; key.dptr = buf; @@ -253,8 +283,6 @@ show_done(done); sdbm_close(db); - if (sdbm_error(db)) - oops("error closing database \"%s\"", name); } static void @@ -269,7 +297,7 @@ printf("Starting %swrite test (%ld item%s), " "cache=%ld page%s, %s write...\n", (wflags & WR_VOLATILE) ? "volatile " : "", - count, 1 == count ? "" : "s", cpage, 1 == cpage ? "" : "s", + count, plural(count), cpage, plural(cpage), (wflags & WR_DELAY) ? "delayed" : "immediate"); key.dsize = large_keys ? sizeof buf : NORMAL_KEY_LEN; @@ -305,8 +333,6 @@ show_done(done); sdbm_close(db); - if (sdbm_error(db)) - oops("error closing database \"%s\"", name); } static void @@ -321,7 +347,7 @@ printf("Starting %sdelete test (%ld item%s), " "cache=%ld page%s, %s write...\n", (wflags & WR_VOLATILE) ? "volatile " : "", - count, 1 == count ? "" : "s", cpage, 1 == cpage ? "" : "s", + count, plural(count), cpage, plural(cpage), (wflags & WR_DELAY) ? "delayed" : "immediate"); key.dsize = large_keys ? sizeof buf : NORMAL_KEY_LEN; @@ -339,12 +365,10 @@ show_done(done); sdbm_close(db); - if (sdbm_error(db)) - oops("error closing database \"%s\"", name); } static void -iter_db(const char *name, long count, long cache, bool safe, tm_t *done) +iter_db(const char *name, long count, long cache, int safe, tm_t *done) { DBM *db = open_db(name, (shrink || safe) ? TRUE : FALSE, cache, 0); long i; @@ -352,8 +376,7 @@ datum key; printf("Starting %siteration test (%ld item%s), cache=%ld page%s...\n", - safe ? "safe " : "", count, 1 == count ? "" : "s", - cpage, 1 == cpage ? "" : "s"); + safe ? "safe " : "", count, plural(count), cpage, plural(cpage)); key = safe ? sdbm_firstkey_safe(db) : sdbm_firstkey(db); @@ -370,14 +393,11 @@ } if (i != count) - oops("iterated over %ld item%s but requested %ld", - i, 1 == i ? "s" : "", count); + oops("iterated over %ld item%s but requested %ld", i, plural(i), count); show_done(done); sdbm_close(db); - if (sdbm_error(db)) - oops("error closing database \"%s\"", name); } static void @@ -388,7 +408,7 @@ tm_t start, end, done; if (randomize) - my_srand(rseed); /* Repeatable sequence for all tests */ + rand31_set_seed(rseed); /* Repeatable sequence for all tests */ tm_now_exact(&start); (*f)(name, count, cache, wflags, &done); @@ -408,17 +428,23 @@ extern int optind; extern char *optarg; bool wflag = 0, rflag = 0, iflag = 0, tflag = 0, sflag = 0; - bool eflag = 0, dflag = 0; + bool eflag = 0, dflag = 0, bflag = 0; int wflags = 0; int c; const char *name; long count; long cache = 0; - progname = argv0; + progstart(argc, argv); - while ((c = getopt(argc, argv, "c:dDeEikKprR:sStvVw")) != EOF) { + while ((c = getopt(argc, argv, "bBc:dDeEikKprR:sStTUvVw")) != EOF) { switch (c) { + case 'B': /* rebuild before testing */ + rebuild++; + break; + case 'b': /* rebuild database test */ + bflag++; + break; case 'c': /* cache pages */ cache = atol(optarg); break; @@ -464,6 +490,12 @@ case 't': /* timing report */ tflag++; break; + case 'T': /* thread safe */ + thread_safe++; + break; + case 'U': /* unlink database */ + unlink_db++; + break; case 'v': /* large values */ large_values++; break; @@ -497,6 +529,9 @@ if (shrink) printf("Database will shrunk before each test.\n"); + if (thread_safe) + printf("Database handle will be opened in thread-safe mode.\n"); + if (large_keys) printf("Will be using large keys%s.\n", common_head_tail ? " with zeroed first and last 4 bytes" : ""); @@ -510,6 +545,9 @@ if (count < 0) oops("count must be positive (is %ld)", count); + if (bflag) + timeit(rebuild_db, name, count, cache, tflag, wflags, "rebuild test"); + if (wflag) timeit(write_db, name, count, cache, tflag, wflags, "write test"); @@ -525,6 +563,11 @@ if (dflag) timeit(delete_db, name, count, cache, tflag, wflags, "delete test"); + if (unlink_db) { + printf("Unlinking database\n"); + unlink_database(name); + } + return 0; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/dbu.c -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/dbu.c
Changed
@@ -5,12 +5,11 @@ #include "common.h" #include "sdbm.h" +#include "lib/progname.h" #include "lib/vmm.h" #include "lib/halloc.h" -extern G_GNUC_PRINTF(1, 2) void oops(char *fmt, ...); - -char *progname; +extern void oops(char *fmt, ...) G_PRINTF(1, 2); static int rflag; static char *usage = "%s -R cat | look |... dbmname"; @@ -70,7 +69,7 @@ fprintf(stream, "M-"); c &= 0177; } - if (c == 0177 || c < ' ') + if (c == 0177 || c < ' ') fprintf(stream, "^%c", (c == 0177) ? '?' : c + '@'); else putc(c, stream); @@ -128,7 +127,7 @@ } break; case DCAT: - for (key = sdbm_firstkey(db); key.dptr != 0; + for (key = sdbm_firstkey(db); key.dptr != 0; key = sdbm_nextkey(db)) { prdatum(stdout, key); putchar('\t'); @@ -156,7 +155,7 @@ val = nullitem; /* shut compiler warnings */ key.dsize = 0; } - + if (sdbm_store(db, key, val, DBM_REPLACE) < 0) { prdatum(stderr, key); fprintf(stderr, ": "); @@ -183,8 +182,7 @@ { register int i; - if (progname) - fprintf(stderr, "%s: ", progname); + fprintf(stderr, "%s: ", getprogname()); fprintf(stderr, "bad keywd %s. use one of\n", word); for (i = 0; i < (int)CTABSIZ; i++) fprintf(stderr, "%-8s%c", cmdsi.sname, @@ -199,7 +197,7 @@ { register int i = CTABSIZ; register cmd *p; - + for (p = cmds; i--; p++) if (strcmp(p->sname, str) == 0) return p; @@ -212,14 +210,13 @@ int c; register cmd *act; extern int optind; - extern char *optarg; + + progstart(argc, argv); /* Initialize memory allocation routines used by the sdbm library */ - vmm_init(&c); + vmm_init(); halloc_init(FALSE); - progname = argv0; - while ((c = getopt(argc, argv, "R")) != EOF) switch (c) { case 'R': /* raw processing */
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/hash.c -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/hash.c
Changed
@@ -16,14 +16,33 @@ * this seems to work remarkably well, in fact better * then the ndbm hash function. Replace at your own risk * use: 65599 nice. - * 65587 even better. + * 65587 even better. */ -G_GNUC_HOT long +long G_HOT sdbm_hash(const char *s, size_t len) { unsigned long n = 0; -#define HASHC n = (unsigned char) *s++ + 65599UL * n + /* + * Noting that 65599 = 2^16 + 2^6 - 1, we could rewrite: + * + * n = (uint8) *s++ + 65599UL * n + * + * as: + * + * n = (uint8) *s++ + (n << 16) + (n << 6) - n; + * + * which is a much faster choice of operations since multiplication + * takes more CPU cycles than bit shifts and additions. + * + * However gcc is already smart enough to perform this optimization + * by itself, even when compiling with -O0, so we keep the multiplicative + * expression, as in the original code, leaving this low-level rewrite + * business to the compiler. + * --RAM, 2015-04-30 + */ + +#define HASHC n = (uint8) *s++ + 65599UL * n if (len > 0) { #ifdef DUFF
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/lru.c -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/lru.c
Changed
@@ -20,53 +20,65 @@ #include "lib/compat_pio.h" #include "lib/debug.h" -#include "lib/glib-missing.h" +#include "lib/fd.h" #include "lib/hashlist.h" +#include "lib/htable.h" +#include "lib/log.h" #include "lib/slist.h" #include "lib/stacktrace.h" +#include "lib/stringify.h" /* For plural() */ #include "lib/vmm.h" #include "lib/walloc.h" #include "lib/override.h" /* Must be the last header included */ #ifdef LRU +enum sdbm_lru_magic { SDBM_LRU_MAGIC = 0x6a6daa37 }; /** * The LRU page cache. */ struct lru_cache { - GHashTable *pagnum; /* Associates page number to cached index */ + enum sdbm_lru_magic magic; /* Magic number */ + htable_t *pagnum; /* Associates page number to cached index */ hash_list_t *used; /* Ordered list of used cache indices */ slist_t *available; /* Available indices */ char *arena; /* Cache arena */ long *numpag; /* Associates a cache index to a page number */ - guint8 *dirty; /* Flags dirty pages (write cache enabled) */ + uint8 *dirty; /* Flags dirty pages (write cache enabled) */ long pages; /* Amount of pages in arena */ long next; /* Next allocated page index */ - guint8 write_deferred; /* Whether writes should be deferred */ + uint8 write_deferred; /* Whether writes should be deferred */ unsigned long rhits; /* Stats: amount of cache hits on reads */ unsigned long rmisses; /* Stats: amount of cache misses on reads */ unsigned long whits; /* Stats: amount of cache hits on writes */ unsigned long wmisses; /* Stats: amount of cache misses on writes */ }; +static inline void +sdbm_lru_check(const struct lru_cache * const c) +{ + g_assert(c != NULL); + g_assert(SDBM_LRU_MAGIC == c->magic); +} + /** * Setup allocated LRU page cache. */ static int -setup_cache(struct lru_cache *cache, long pages, gboolean wdelay) +setup_cache(struct lru_cache *cache, long pages, bool wdelay) { cache->arena = vmm_alloc(pages * DBM_PBLKSIZ); if (NULL == cache->arena) return -1; - cache->pagnum = g_hash_table_new(NULL, NULL); + cache->pagnum = htable_create(HASH_KEY_SELF, 0); cache->used = hash_list_new(NULL, NULL); cache->available = slist_new(); cache->pages = pages; cache->next = 0; cache->write_deferred = wdelay; cache->dirty = walloc(cache->pages); - cache->numpag = walloc(cache->pages * sizeof(long)); + WALLOC_ARRAY(cache->numpag, cache->pages); return 0; } @@ -79,9 +91,9 @@ { hash_list_free(&cache->used); slist_free(&cache->available); - gm_hash_table_destroy_null(&cache->pagnum); + htable_free_null(&cache->pagnum); VMM_FREE_NULL(cache->arena, cache->pages * DBM_PBLKSIZ); - WFREE_NULL(cache->numpag, cache->pages * sizeof(long)); + WFREE_ARRAY_NULL(cache->numpag, cache->pages); WFREE_NULL(cache->dirty, cache->pages); cache->pages = cache->next = 0; } @@ -91,13 +103,14 @@ * @return -1 with errno set on error, 0 if OK. */ static int -init_cache(DBM *db, long pages, gboolean wdelay) +init_cache(DBM *db, long pages, bool wdelay) { struct lru_cache *cache; g_assert(NULL == db->cache); WALLOC0(cache); + cache->magic = SDBM_LRU_MAGIC; if (-1 == setup_cache(cache, pages, wdelay)) { WFREE(cache); return -1; @@ -111,15 +124,11 @@ */ void lru_init(DBM *db) { - struct lru_cache *cache; - g_assert(NULL == db->cache); g_assert(-1 == db->pagbno); /* We must be called before first access */ - WALLOC0(cache); - if (-1 == setup_cache(cache, LRU_PAGES, FALSE)) - g_error("out of virtual memory"); - db->cache = cache; + if (-1 == init_cache(db, LRU_PAGES, FALSE)) + s_error("out of virtual memory"); } static void @@ -129,23 +138,25 @@ unsigned long raccesses = cache->rhits + cache->rmisses; unsigned long waccesses = cache->whits + cache->wmisses; - g_info("sdbm: \"%s\" LRU cache size = %ld page%s, %s writes, %s DB", - sdbm_name(db), cache->pages, 1 == cache->pages ? "" : "s", + sdbm_lru_check(cache); + + s_info("sdbm: \"%s\" LRU cache size = %ld page%s, %s writes, %s DB", + sdbm_name(db), cache->pages, plural(cache->pages), cache->write_deferred ? "deferred" : "synchronous", db->is_volatile ? "volatile" : "persistent"); - g_info("sdbm: \"%s\" LRU read cache hits = %.2f%% on %lu request%s", + s_info("sdbm: \"%s\" LRU read cache hits = %.2f%% on %lu request%s", sdbm_name(db), cache->rhits * 100.0 / MAX(raccesses, 1), raccesses, - 1 == raccesses ? "" : "s"); - g_info("sdbm: \"%s\" LRU write cache hits = %.2f%% on %lu request%s", + plural(raccesses)); + s_info("sdbm: \"%s\" LRU write cache hits = %.2f%% on %lu request%s", sdbm_name(db), cache->whits * 100.0 / MAX(waccesses, 1), waccesses, - 1 == waccesses ? "" : "s"); + plural(waccesses)); } /** * Write back cached page to disk. * @return TRUE on success. */ -static gboolean +static bool writebuf(DBM *db, long oldnum, long idx) { struct lru_cache *cache = db->cache; @@ -174,7 +185,11 @@ int n; ssize_t amount = 0; int saved_errno = 0; - long pages = MIN(cache->pages, cache->next); + long pages; + + sdbm_lru_check(cache); + + pages = MIN(cache->pages, cache->next); for (n = 0; n < pages; n++) { if (cache->dirtyn) { @@ -195,6 +210,20 @@ return amount; } +/* + * @return the page cache size, 0 for no cache. + */ +long +getcache(const DBM *db) +{ + const struct lru_cache *cache = db->cache; + + if (NULL == cache) + return 0; + + return cache->pages; +} + /** * Set the page cache size. * @return 0 if OK, -1 on failure with errno set. @@ -203,7 +232,9 @@ setcache(DBM *db, long pages) { struct lru_cache *cache = db->cache; - gboolean wdelay; + bool wdelay; + + sdbm_lru_check(cache); if (pages <= 0) { errno = EINVAL; @@ -238,9 +269,9 @@ db->pagbuf = NULL; if (common_stats) { - g_info("sdbm: \"%s\" LRU cache size %s from %ld page%s to %ld", + s_info("sdbm: \"%s\" LRU cache size %s from %ld page%s to %ld", sdbm_name(db), pages > cache->pages ? "increased" : "decreased", - cache->pages, 1 == cache->pages ? "" : "s", pages); + cache->pages, plural(cache->pages), pages); log_lrustats(db); } @@ -289,13 +320,15 @@ * @return -1 on error with errno set, 0 if OK. */ int -setwdelay(DBM *db, gboolean on) +setwdelay(DBM *db, bool on) { struct lru_cache *cache = db->cache; if (NULL == cache) return init_cache(db, LRU_PAGES, on); + sdbm_lru_check(cache); + if (on == cache->write_deferred) return 0; @@ -314,20 +347,35 @@ } /** - * Close the LRU page cache. + * @return whether LRU deferred writes are enabled. + */ +bool +getwdelay(const DBM *db) +{ + const struct lru_cache *cache = db->cache; + + return cache != NULL && cache->write_deferred; +} + +/** + * Close (i.e. free) the LRU page cache. + * + * @attention + * This does not attempt to flush any remaining dirty pages. */ -void lru_close(DBM *db) +void +lru_close(DBM *db) { struct lru_cache *cache = db->cache; if (cache) { - if (!db->is_volatile) - flush_dirtypag(db); + sdbm_lru_check(cache); if (common_stats) log_lrustats(db); free_cache(cache); + cache->magic = 0; WFREE(cache); } @@ -340,11 +388,15 @@ * If ``force'' is TRUE, we also ignore deferred writes and flush the page. * @return TRUE on success. */ -gboolean -dirtypag(DBM *db, gboolean force) +bool +dirtypag(DBM *db, bool force) { struct lru_cache *cache = db->cache; - long n = (db->pagbuf - cache->arena) / DBM_PBLKSIZ; + long n; + + sdbm_lru_check(cache); + + n = (db->pagbuf - cache->arena) / DBM_PBLKSIZ; g_assert(n >= 0 && n < cache->pages); g_assert(db->pagbno == cache->numpagn); @@ -358,8 +410,15 @@ return TRUE; } + /* + * Flush current page to the kernel. If they are forcing the flush, + * make sure we ask the kernel to synchronize the data as well. + */ + if (flushpag(db, db->pagbuf, db->pagbno)) { cache->dirtyn = FALSE; + if G_UNLIKELY(force) + fd_fdatasync(db->pagf); return TRUE; } @@ -401,7 +460,7 @@ } else { void *last = hash_list_tail(cache->used); long oldnum; - gboolean had_ioerr = booleanize(db->flags & DBM_IOERR_W); + bool had_ioerr = booleanize(db->flags & DBM_IOERR_W); hash_list_moveto_head(cache->used, last); n = pointer_to_int(last); @@ -418,7 +477,7 @@ if (cache->dirtyn && !writebuf(db, oldnum, n)) { hash_list_iter_t *iter; void *item; - gboolean found = FALSE; + bool found = FALSE; /* * Cannot flush dirty page now, probably because we ran out of @@ -457,17 +516,17 @@ if (!had_ioerr) db->flags &= ~DBM_IOERR_W; - g_warning("sdbm: \"%s\": " + s_warning("sdbm: \"%s\": " "reusing cache slot used by clean page #%ld instead", sdbm_name(db), oldnum); } else { - g_warning("sdbm: \"%s\": cannot discard dirty page #%ld", + s_warning("sdbm: \"%s\": cannot discard dirty page #%ld", sdbm_name(db), oldnum); return -1; } } - g_hash_table_remove(cache->pagnum, ulong_to_pointer(oldnum)); + htable_remove(cache->pagnum, ulong_to_pointer(oldnum)); cache->dirtyn = FALSE; } @@ -478,8 +537,7 @@ g_assert(n >= 0 && n < cache->pages); cache->numpagn = num; - g_hash_table_insert(cache->pagnum, - ulong_to_pointer(num), int_to_pointer(n)); + htable_insert(cache->pagnum, ulong_to_pointer(num), int_to_pointer(n)); return n; } @@ -498,11 +556,12 @@ struct lru_cache *cache = db->cache; void *value; + sdbm_lru_check(cache); g_assert(num >= 0); if ( cache != NULL && - g_hash_table_lookup_extended(cache->pagnum, + htable_lookup_extended(cache->pagnum, ulong_to_pointer(num), NULL, &value) ) { long idx = pointer_to_int(value); @@ -525,7 +584,11 @@ { struct lru_cache *cache = db->cache; int n; - long pages = MIN(cache->pages, cache->next); + long pages; + + sdbm_lru_check(cache); + + pages = MIN(cache->pages, cache->next); for (n = 0; n < pages; n++) { long num = cache->numpagn; @@ -551,8 +614,10 @@ struct lru_cache *cache = db->cache; void *value; + sdbm_lru_check(cache); + if ( - g_hash_table_lookup_extended(cache->pagnum, + htable_lookup_extended(cache->pagnum, ulong_to_pointer(bno), NULL, &value) ) { long idx = pointer_to_int(value); @@ -567,12 +632,12 @@ */ if (cache->dirtyidx) { - g_critical("sdbm: \"%s\": %s() invalidating dirty page #%ld", + s_critical("sdbm: \"%s\": %s() invalidating dirty page #%ld", db->name, stacktrace_caller_name(1), bno); } hash_list_remove(cache->used, value); - g_hash_table_remove(cache->pagnum, ulong_to_pointer(bno)); + htable_remove(cache->pagnum, ulong_to_pointer(bno)); cache->numpagidx = -1; cache->dirtyidx = FALSE; slist_append(cache->available, value); /* Make index available */ @@ -580,6 +645,34 @@ } /** + * Compute the file offset right after the last dirty page of the cache. + * + * @return 0 if no dirty page, the offset after the last dirty one otherwise. + */ +fileoffset_t +lru_tail_offset(const DBM *db) +{ + const struct lru_cache *cache = db->cache; + long pages, n, bno; + + sdbm_lru_check(cache); + + pages = MIN(cache->pages, cache->next); + + for (bno = -1, n = 0; n < pages; n++) { + long num; + + if (!cache->dirtyn) + continue; + + num = cache->numpagn; + bno = MAX(bno, num); + } + + return OFF_PAG(bno + 1); +} + +/** * Get a suitable buffer in the cache to read a page and set db->pagbuf * accordingly. * @@ -589,18 +682,19 @@ * @return TRUE if OK, FALSE if we could not allocate a suitable buffer, leaving * the old db->pagbuf intact. */ -gboolean -readbuf(DBM *db, long num, gboolean *loaded) +bool +readbuf(DBM *db, long num, bool *loaded) { struct lru_cache *cache = db->cache; void *value; long idx; - gboolean good_page; + bool good_page; + sdbm_lru_check(cache); g_assert(num >= 0); if ( - g_hash_table_lookup_extended(cache->pagnum, + htable_lookup_extended(cache->pagnum, ulong_to_pointer(num), NULL, &value) ) { hash_list_moveto_head(cache->used, value); @@ -631,12 +725,13 @@ * Cache new page held in memory if there are deferred writes configured. * @return TRUE on success. */ -gboolean +bool cachepag(DBM *db, char *pag, long num) { struct lru_cache *cache = db->cache; void *value; + sdbm_lru_check(cache); g_assert(num >= 0); /* @@ -652,7 +747,7 @@ */ if ( - g_hash_table_lookup_extended(cache->pagnum, + htable_lookup_extended(cache->pagnum, ulong_to_pointer(num), NULL, &value) ) { long idx; @@ -680,18 +775,18 @@ if (ino0 != 0) { weird++; - g_warning("sdbm: \"%s\": new page #%ld was cached but not empty", + s_warning("sdbm: \"%s\": new page #%ld was cached but not empty", db->name, num); } if (cache->dirtyidx) { weird++; - g_warning("sdbm: \"%s\": new page #%ld was cached and not clean", + s_warning("sdbm: \"%s\": new page #%ld was cached and not clean", db->name, num); } if (weird > 0) { - g_critical("sdbm: \"%s\": previous warning%s indicate possible " + s_critical("sdbm: \"%s\": previous warning%s indicate possible " "corruption in the bitmap forest", - db->name, 1 == weird ? "" : "s"); + db->name, plural(weird)); } /* @@ -729,7 +824,7 @@ * Flush page to disk. * @return TRUE on success */ -gboolean +bool flushpag(DBM *db, char *pag, long num) { ssize_t w; @@ -743,10 +838,10 @@ if (w < 0) { if G_UNLIKELY(db->flags & DBM_RDONLY) errno = EPERM; /* Instead of EBADF on linux */ - g_warning("sdbm: \"%s\": cannot flush page #%ld: %m", + s_warning("sdbm: \"%s\": cannot flush page #%ld: %m", sdbm_name(db), num); } else { - g_critical("sdbm: \"%s\": could only flush %u bytes from page #%ld", + s_critical("sdbm: \"%s\": could only flush %u bytes from page #%ld", sdbm_name(db), (unsigned) w, num); } ioerr(db, TRUE);
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/lru.h -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/lru.h
Changed
@@ -4,23 +4,29 @@ #define lru_cached_page sdbm__lru_cached_page #define lru_discard sdbm__lru_discard #define lru_invalidate sdbm__lru_invalidate +#define lru_tail_offset sdbm__lru_tail_offset #define readbuf sdbm__readbuf #define flushpag sdbm__flushpag #define dirtypag sdbm__dirtypag #define flush_dirtypag sdbm__flush_dirtypag #define setcache sdbm__setcache +#define getcache sdbm__getcache #define setwdelay sdbm__setwdelay +#define getwdelay sdbm__getwdelay #define cachepag sdbm__cachepag void lru_init(DBM *); void lru_close(DBM *); -gboolean readbuf(DBM *, long, gboolean *); -gboolean dirtypag(DBM *, gboolean); -gboolean flushpag(DBM *, char *, long); +bool readbuf(DBM *, long, bool *); +bool dirtypag(DBM *, bool); +bool flushpag(DBM *, char *, long); ssize_t flush_dirtypag(DBM *); int setcache(DBM *, long); -int setwdelay(DBM *, gboolean); -gboolean cachepag(DBM *, char *, long); +long getcache(const DBM *); +int setwdelay(DBM *, bool); +bool getwdelay(const DBM *); +bool cachepag(DBM *, char *, long); char *lru_cached_page(DBM *, long); void lru_discard(DBM *, long); void lru_invalidate(DBM *, long); +fileoffset_t lru_tail_offset(const DBM *);
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/pair.c -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/pair.c
Changed
@@ -11,10 +11,13 @@ #include "casts.h" #include "sdbm.h" +#include "private.h" /* We access DBM * for logging */ #include "tune.h" #include "pair.h" #include "big.h" +#include "lib/stringify.h" /* For plural() */ + /* * To accommodate larger key/values (that would otherwise not * fit within a page), the leading bit of each offset is set @@ -38,16 +41,18 @@ return off & BIG_MASK; } -static inline ALWAYS_INLINE gboolean +static inline ALWAYS_INLINE bool is_big(unsigned short off) { return booleanize(off & BIG_FLAG); } static inline ALWAYS_INLINE long -exhash_big(DBM *db, const datum item, gboolean big) +exhash_big(DBM *db, const datum item, bool big, bool *failed) { - return big ? bigkey_hash(db, item.dptr, item.dsize) : - sdbm_hash(item.dptr, item.dsize); + if (big) + return bigkey_hash(db, item.dptr, item.dsize, failed); + + return sdbm_hash(item.dptr, item.dsize); } #else /* !BIGDATA */ static inline ALWAYS_INLINE unsigned short @@ -56,23 +61,24 @@ return off; } -static inline ALWAYS_INLINE gboolean +static inline ALWAYS_INLINE bool is_big(unsigned short off) { (void) off; return FALSE; } static inline ALWAYS_INLINE long -exhash_big(DBM *db, const datum item, gboolean big) +exhash_big(DBM *db, const datum item, bool big, bool *failed) { (void) db; (void) big; + (void) failed; return sdbm_hash(item.dptr, item.dsize); } #endif /* BIGDATA */ -/* - * forward +/* + * forward */ static int seepair(DBM *db, const char *, unsigned, const char *, size_t); @@ -96,7 +102,7 @@ * nth (inoino0) entry's offset. */ -gboolean +bool fitpair(const char *pag, size_t need) { unsigned n; @@ -117,8 +123,8 @@ /** * Is value data of a given old size replaceable in situ with new data? */ -gboolean -replaceable(size_t old_size, size_t new_size, gboolean big) +bool +replaceable(size_t old_size, size_t new_size, bool big) { #ifdef BIGDATA size_t ol = big ? bigval_length(old_size) : old_size; @@ -163,7 +169,7 @@ } static void -putpair_ext(char *pag, datum key, gboolean bigkey, datum val, gboolean bigval) +putpair_ext(char *pag, datum key, bool bigkey, datum val, bool bigval) { unsigned n; unsigned off; @@ -194,7 +200,7 @@ ino0 += 2; } -gboolean +bool putpair(DBM *db, char *pag, datum key, datum val) { #ifdef BIGDATA @@ -226,7 +232,7 @@ unsigned off; unsigned short *ino = (unsigned short *) pag; size_t vl; - gboolean largeval; + bool largeval; off = ((n = ino0) > 0) ? offset(inon) : DBM_PBLKSIZ; @@ -290,8 +296,8 @@ * @return TRUE if key was found, value length via *length, index via *idx, * and whether value is stored in a .dat file via *big. */ -gboolean -infopair(DBM *db, char *pag, datum key, size_t *length, int *idx, gboolean *big) +bool +infopair(DBM *db, char *pag, datum key, size_t *length, int *idx, bool *big) { int i; unsigned n; @@ -308,7 +314,7 @@ #ifdef BIGDATA if (is_big(inoi + 1)) { - g_assert(dsize >= sizeof(guint32)); + g_assert(dsize >= sizeof(uint32)); dsize = big_length(pag + offset(inoi + 1)); } #endif @@ -385,7 +391,7 @@ return val; } -gboolean +bool exipair(DBM *db, const char *pag, datum key) { const unsigned short *ino = (const unsigned short *) pag; @@ -397,7 +403,7 @@ } #ifdef SEEDUPS -gboolean +bool duppair(DBM *db, const char *pag, datum key) { const unsigned short *ino = (const unsigned short *) pag; @@ -437,16 +443,45 @@ return key; } +#ifdef BIGDATA +/** + * Reclaim the blocks used by big key/values at position i on the page. + * + * @return TRUE if OK. + */ +static bool +delipair_big(DBM *db, char *pag, int i) +{ + unsigned short *ino = (unsigned short *) pag; + unsigned end = (i > 1) ? offset(inoi - 1) : DBM_PBLKSIZ; + unsigned koff = offset(inoi); + unsigned voff = offset(inoi+1); + bool status = TRUE; + + g_assert(0x1 == (i & 0x1)); /* Odd position in page */ + + /* Free space used by large keys and values */ + + if (is_big(inoi) && !bigkey_free(db, pag + koff, end - koff)) + status = FALSE; + if (is_big(inoi+1) && !bigval_free(db, pag + voff, koff - voff)) + status = FALSE; + + return status; +} +#endif /* BIGDATA */ + /** * Delete pair from the page whose key starts at position i. * * @return TRUE if OK. */ -gboolean -delipair(DBM *db, char *pag, int i, gboolean free_bigdata) +bool +delipair(DBM *db, char *pag, int i, bool free_bigdata) { int n; unsigned short *ino = (unsigned short *) pag; + bool status = TRUE; n = ino0; @@ -455,6 +490,13 @@ if G_UNLIKELY(0 == n || i >= n || !(i & 0x1)) return FALSE; +#ifdef BIGDATA + if (free_bigdata) + status = delipair_big(db, pag, i); +#else + (void) db; /* Unused parameter unless BIGDATA */ +#endif + /* * found the key. if it is the last entry * i.e. i == n - 1 we just adjust the entry count. @@ -463,23 +505,6 @@ * note: 0 < i < n */ -#ifdef BIGDATA - if (free_bigdata) { - unsigned end = (i > 1) ? offset(inoi - 1) : DBM_PBLKSIZ; - unsigned koff = offset(inoi); - unsigned voff = offset(inoi+1); - - /* Free space used by large keys and values */ - - if (is_big(inoi) && !bigkey_free(db, pag + koff, end - koff)) - return FALSE; - if (is_big(inoi+1) && !bigval_free(db, pag + voff, koff - voff)) - return FALSE; - } -#else - (void) db; /* Unused parameter unless BIGDATA */ -#endif - if (i < n - 1) { int m; char *dst = pag + (i == 1 ? DBM_PBLKSIZ : offset(inoi - 1)); @@ -530,7 +555,7 @@ } ino0 -= 2; - return TRUE; + return status; } /** @@ -538,7 +563,7 @@ * * @return TRUE if OK. */ -gboolean +bool delnpair(DBM *db, char *pag, int num) { int i; @@ -552,7 +577,7 @@ return delipair(db, pag, i, TRUE); } -gboolean +bool delpair(DBM *db, char *pag, datum key) { int n; @@ -649,7 +674,7 @@ * * @return TRUE if we can't spot anything wrong, FALSE on definitive corruption. */ -gboolean +bool chkipair(DBM *db, char *pag, int i) { int n; @@ -694,12 +719,11 @@ void splpage(DBM *db, char *pag, char *pagzero, char *pagone, long int sbit) { - datum key; - datum val; - + datum key, val; int n; int off = DBM_PBLKSIZ; const unsigned short *ino = (const unsigned short *) pag; + int removed = 0; memset(pagzero, 0, DBM_PBLKSIZ); memset(pagone, 0, DBM_PBLKSIZ); @@ -708,11 +732,24 @@ for (ino++; n > 0; ino += 2) { unsigned short koff = offset(ino0); unsigned short voff = offset(ino1); - key.dptr = (char *) pag + koff; + key.dptr = (char *) pag + koff; key.dsize = off - koff; val.dptr = (char *) pag + voff; val.dsize = koff - voff; - gboolean bk = is_big(ino0); + bool bk = is_big(ino0); + bool failed; + long hash = exhash_big(db, key, bk, &failed); + + /* + * If we cannot hash a big key, then remove it from the page since + * we cannot split it correctly. + */ + + if (bk && failed) { + delipair_big(db, pag, ino - (unsigned short *) pag); + removed++; + goto next; + } /* * With big data, we're moving around the indirection blocks only, @@ -722,16 +759,24 @@ * Select the page pointer (by looking at sbit) and insert */ - putpair_ext((exhash_big(db, key, bk) & sbit) ? pagone : pagzero, + putpair_ext((hash & sbit) ? pagone : pagzero, key, bk, val, is_big(ino1)); + next: off = voff; n -= 2; } - g_assert(pagcount(pag) == pagcount(pagzero) + pagcount(pagone)); + g_assert(pagcount(pag) == pagcount(pagzero) + pagcount(pagone) + removed); + + if G_UNLIKELY(removed != 0) { + db->removed_keys += removed; + s_warning("sdbm: \"%s\": removed %d/%d key%s (unreadable, big) " + "on page #%ld", sdbm_name(db), + removed, pagcount(pag) / 2, plural(removed), db->pagbno); + } - debug(("%d split %d/%d\n", ((unsigned short *) pag)0 / 2, + debug(("%d split %d/%d\n", ((unsigned short *) pag)0 / 2, ((unsigned short *) pagone)0 / 2, ((unsigned short *) pagzero)0 / 2)); } @@ -739,7 +784,7 @@ /** * Check page sanity. */ -gboolean +bool sdbm_internal_chkpage(const char *pag) { unsigned n;
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/pair.h -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/pair.h
Changed
@@ -15,20 +15,20 @@ #define replpair sdbm__replpair #define replaceable sdbm__replaceable -extern gboolean fitpair(const char *, size_t); -extern gboolean putpair(DBM *, char *, datum, datum); +extern bool fitpair(const char *, size_t); +extern bool putpair(DBM *, char *, datum, datum); extern datum getpair(DBM *, char *, datum); -extern gboolean exipair(DBM *, const char *, datum); -extern gboolean delpair(DBM *, char *, datum); -extern gboolean delnpair(DBM *, char *, int); -extern gboolean delipair(DBM *, char *, int, gboolean); -extern gboolean chkipair(DBM *, char *, int); -extern gboolean infopair(DBM *, char *, datum, size_t *, int *, gboolean *); +extern bool exipair(DBM *, const char *, datum); +extern bool delpair(DBM *, char *, datum); +extern bool delnpair(DBM *, char *, int); +extern bool delipair(DBM *, char *, int, bool); +extern bool chkipair(DBM *, char *, int); +extern bool infopair(DBM *, char *, datum, size_t *, int *, bool *); extern datum getnkey(DBM *, char *, int); extern datum getnval(DBM *, char *, int); extern void splpage(DBM *, char *, char *, char *, long); -extern gboolean replaceable(size_t, size_t, gboolean); +extern bool replaceable(size_t, size_t, bool); extern int replpair(DBM *, char *, int, datum); #ifdef SEEDUPS -extern gboolean duppair(DBM *, const char *, datum); +extern bool duppair(DBM *, const char *, datum); #endif
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/private.h -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/private.h
Changed
@@ -5,55 +5,86 @@ */ struct DBMBIG; +struct lmutex; /* Avoid including "mutex.h" here */ + +enum sdbm_magic { SDBM_MAGIC = 0x1dac340e }; + +struct dbm_returns { + size_t len; /* physical block length */ + datum value; /* the value returned */ +}; struct DBM { - char *name; /* database name, for logging */ - char *pagbuf; /* page file block buffer (size: DBM_PBLKSIZ) */ - char *dirbuf; /* directory file block buffer (size: DBM_DBLKSIZ) */ + enum sdbm_magic magic; /* magic number */ + char *name; /* database name, for logging */ + char *dirname; /* file name for .dir */ + char *pagname; /* file name for .pag */ +#ifdef BIGDATA + struct DBMBIG *big; /* big key/value data management */ + char *datname; /* file name for .dat (created only when needed) */ +#endif + char *pagbuf; /* page file block buffer (size: DBM_PBLKSIZ) */ + char *dirbuf; /* directory file block buffer (size: DBM_DBLKSIZ) */ #ifdef LRU - void *cache; /* LRU page cache */ + void *cache; /* LRU page cache */ +#endif +#ifdef THREADS + struct lmutex *lock; /* thread-safe lock at the API level */ #endif fileoffset_t pagtail; /* end of page file descriptor, for iterating */ - long maxbno; /* size of dirfile in bits */ - long curbit; /* current bit number */ - long hmask; /* current hash mask */ - long blkptr; /* current block for nextkey */ - long pagbno; /* current page in pagbuf */ - long dirbno; /* current block in dirbuf */ - int dirf; /* directory file descriptor */ - int pagf; /* page file descriptor */ - int flags; /* status/error flags, see below */ - int keyptr; /* current key in page for nextkey */ - unsigned long pagfetch; /* stats: amount of page fetch calls */ - unsigned long pagread; /* stats: amount of page read requests */ - unsigned long pagbno_hit; /* stats: amount of read avoided on pagbno */ - unsigned long pagwrite; /* stats: amount of page write requests */ - unsigned long pagwforced; /* stats: amount of forced page writes */ - unsigned long dirfetch; /* stats: amount of dir fetch calls */ - unsigned long dirread; /* stats: amount of dir read requests */ - unsigned long dirbno_hit; /* stats: amount of read avoided on dirbno */ - unsigned long dirwrite; /* stats: amount of dir write requests */ - unsigned long dirwdelayed; /* stats: amount of deferred dir writes */ - unsigned long repl_stores; /* stats: amount of DBM_REPLACE stores */ - unsigned long repl_inplace; /* stats: amount of DBM_REPLACE done inplace */ - unsigned long read_errors; /* stats: number of read() errors */ - unsigned long write_errors; /* stats: number of write() errors */ - unsigned long flush_errors; /* stats: number of page flush errors */ - unsigned long spl_errors; /* stats: number of split errors */ - unsigned long spl_corrupt; /* stats: number of split unfixed corruptions */ - unsigned long bad_pages; /* stats: number of corrupted pages zero-ed */ - unsigned long removed_keys; /* stats: number of keys removed forcefully */ + long maxbno; /* size of dirfile in bits */ + long curbit; /* current bit number */ + long hmask; /* current hash mask */ + long blkptr; /* current block for nextkey */ + long pagbno; /* current page in pagbuf */ + long dirbno; /* current block in dirbuf */ + int dirf; /* directory file descriptor */ + int pagf; /* page file descriptor */ + int flags; /* status/error flags, see below */ + int keyptr; /* current key in page for nextkey */ + int openflags; /* open() flags used for sdbm_open() */ + int openmode; /* open() mode used for sdbm_open() */ + ulong pagfetch; /* stats: amount of page fetch calls */ + ulong pagread; /* stats: amount of page read requests */ + ulong pagbno_hit; /* stats: amount of read avoided on pagbno */ + ulong pagwrite; /* stats: amount of page write requests */ + ulong pagwforced; /* stats: amount of forced page writes */ + ulong dirfetch; /* stats: amount of dir fetch calls */ + ulong dirread; /* stats: amount of dir read requests */ + ulong dirbno_hit; /* stats: amount of read avoided on dirbno */ + ulong dirwrite; /* stats: amount of dir write requests */ + ulong dirwdelayed; /* stats: amount of deferred dir writes */ + ulong repl_stores; /* stats: amount of DBM_REPLACE stores */ + ulong repl_inplace; /* stats: amount of DBM_REPLACE done inplace */ + ulong read_errors; /* stats: number of read() errors */ + ulong write_errors; /* stats: number of write() errors */ + ulong flush_errors; /* stats: number of page flush errors */ + ulong spl_errors; /* stats: number of split errors */ + ulong spl_corrupt; /* stats: number of split unfixed corruptions */ + ulong bad_pages; /* stats: number of corrupted pages zero-ed */ + ulong removed_keys; /* stats: number of keys removed forcefully */ +#ifdef BIGDATA + ulong bad_bigkeys; /* stats: number of bad big keys we could not hash */ +#endif #if defined(LRU) || defined(BIGDATA) - guint8 is_volatile; /* whether consistency of database matters */ + uint8 is_volatile; /* whether consistency of database matters */ #endif #ifdef LRU - guint8 dirbuf_dirty; /* whether dirbuf needs flushing to disk */ + uint8 dirbuf_dirty; /* whether dirbuf needs flushing to disk */ #endif -#ifdef BIGDATA - struct DBMBIG *big; +#ifdef THREADS + struct dbm_returns *returned; /* per-thread returned values */ + uint iterid; /* thread small ID for iterating */ #endif }; +static inline void +sdbm_check(const DBM * const db) +{ + g_assert(db != NULL); + g_assert(SDBM_MAGIC == db->magic); +} + static inline long OFF_PAG(unsigned long off) { @@ -67,7 +98,7 @@ } static inline void -ioerr(DBM *db, gboolean on_write) +ioerr(DBM *db, bool on_write) { db->flags |= DBM_IOERR; if (on_write) {
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/sdbm.3 -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/sdbm.3
Changed
@@ -1,7 +1,7 @@ .\" $Id: sdbm.3,v 1.2 90/12/13 13:00:57 oz Exp $ .TH SDBM 3 "1 March 1990" .SH NAME -sdbm, sdbm_open, sdbm_prep, sdbm_close, sdbm_fetch, sdbm_store, sdbm_replace, sdbm_delete, sdbm_exists, sdbm_firstkey, sdbm_nextkey, sdbm_hash, sdbm_rdonly, sdbm_error, sdbm_clearerr, sdbm_dirfno, sdbm_pagfno, sdbm_datfno \- data base subroutines +sdbm, sdbm_open, sdbm_prep, sdbm_close, sdbm_unlink, sdbm_fetch, sdbm_store, sdbm_replace, sdbm_delete, sdbm_exists, sdbm_firstkey, sdbm_nextkey, sdbm_hash, sdbm_rdonly, sdbm_error, sdbm_clearerr, sdbm_dirfno, sdbm_pagfno, sdbm_datfno \- data base subroutines .SH SYNOPSIS .nf .ft B @@ -18,10 +18,12 @@ \s-1DBM\s0 *sdbm_prep(char *dirname, char *pagname, char *datname, int flags, int mode) void sdbm_close(\s-1DBM\s0 *db) +void sdbm_unlink(\s-1DBM\s0 *db) +int sdbm_rebuild(\s-1DBM\s0 *db) .sp datum sdbm_fetch(\s-1DBM\s0 *db, key) int sdbm_store(\s-1DBM\s0 *db, datum key, datum val, int flags) -int sdbm_replace(\s-1DBM\s0 *db, datum key, datum val, gboolean *existed) +int sdbm_replace(\s-1DBM\s0 *db, datum key, datum val, bool *existed) int sdbm_delete(\s-1DBM\s0 *db, datum key) int sdbm_exists(\s-1DBM\s0 *db, datum key) .sp @@ -30,28 +32,44 @@ datum sdbm_nextkey(\s-1DBM\s0 *db) datum sdbm_value(\s-1DBM\s0 *db) int sdbm_deletekey(\s-1DBM\s0 *db) +void sdbm_endkey(\s-1DBM\s0 *db) .sp long sdbm_hash(char *string, size_t len) .sp ssize_t sdbm_sync(\s-1DBM\s0 *db) .sp int sdbm_set_cache(\s-1DBM\s0 *db, long pages) -int sdbm_set_wdelay(\s-1DBM\s0 *db, gboolean on) -int sdbm_set_volatile(\s-1DBM\s0 *db, gboolean yes) +int sdbm_set_wdelay(\s-1DBM\s0 *db, bool on) +int sdbm_set_volatile(\s-1DBM\s0 *db, bool yes) +.sp +long sdbm_get_cache(const \s-1DBM\s0 *db) +bool sdbm_get_wdelay(const \s-1DBM\s0 *db) +bool sdbm_is_volatile(const \s-1DBM\s0 *db) .sp void sdbm_set_name(\s-1DBM\s0 *db, const char *string) -const char *sdbm_name(\s-1DBM\s0 *db) +const char *sdbm_name(const \s-1DBM\s0 *db) +.sp +int sdbm_rename(\s-1DBM\s0 *db, char *base) +int sdbm_rename_files(\s-1DBM\s0 *db, + char *dirname, char *pagname, char *datname) .sp -gboolean sdbm_rdonly(\s-1DBM\s0 *db) -gboolean sdbm_error(\s-1DBM\s0 *db) -gboolean sdbm_shrink(\s-1DBM\s0 *db) -gboolean sdbm_clear(\s-1DBM\s0 *db) -sdbm_clearerr(\s-1DBM\s0 *db) +bool sdbm_rdonly(const \s-1DBM\s0 *db) +bool sdbm_error(const \s-1DBM\s0 *db) +bool sdbm_shrink(\s-1DBM\s0 *db) +bool sdbm_clear(\s-1DBM\s0 *db) +void sdbm_clearerr(\s-1DBM\s0 *db) int sdbm_dirfno(\s-1DBM\s0 *db) int sdbm_pagfno(\s-1DBM\s0 *db) int sdbm_datfno(\s-1DBM\s0 *db) .sp -gboolean sdbm_is_storable(size_t key, size_t value) +bool sdbm_is_storable(size_t key, size_t value) +.sp +void sdbm_thread_safe(\s-1DBM\s0 *db) +void sdbm_lock(\s-1DBM\s0 *db) +void sdbm_unlock(\s-1DBM\s0 *db) +.sp +size_t sdbm_foreach(\s-1DBM\s0 *db, int flags, sdbm_cb_t cb, void *arg); +size_t sdbm_foreach_remove(\s-1DBM\s0 *db, int flags, sdbm_cbr_t cb, void *arg); .ft R .fi .SH DESCRIPTION @@ -59,6 +77,7 @@ .IX sdbm_open "" "\fLsdbm_open\fR \(em open \fLsdbm\fR database" .IX sdbm_prep "" "\fLsdbm_prep\fR \(em prepare \fLsdbm\fR database" .IX sdbm_close "" "\fLsdbm_close\fR \(em close \fLsdbm\fR routine" +.IX sdbm_unlink "" "\fLsdbm_unlink\fR \(em close and unlink \fLsdbm\fR files" .IX sdbm_fetch "" "\fLsdbm_fetch\fR \(em fetch \fLsdbm\fR database data" .IX sdbm_store "" "\fLsdbm_store\fR \(em add data to \fLsdbm\fR database" .IX sdbm_replace "" "\fLsdbm_replace\fR \(em replace data in \fLsdbm\fR database" @@ -81,6 +100,7 @@ .IX "database functions \(em \fLsdbm\fR" sdbm_open "" \fLsdbm_open\fP .IX "database functions \(em \fLsdbm\fR" sdbm_prep "" \fLsdbm_prep\fP .IX "database functions \(em \fLsdbm\fR" sdbm_close "" \fLsdbm_close\fP +.IX "database functions \(em \fLsdbm\fR" sdbm_unlink "" \fLsdbm_unlink\fP .IX "database functions \(em \fLsdbm\fR" sdbm_fetch "" \fLsdbm_fetch\fP .IX "database functions \(em \fLsdbm\fR" sdbm_store "" \fLsdbm_store\fP .IX "database functions \(em \fLsdbm\fR" sdbm_delete "" \fLsdbm_delete\fP @@ -159,7 +179,7 @@ databases, the applications interface always requires a .IR handle , a -.BR "DBM *" , +.BR "DBM\ *" , to identify the database to be manipulated. Such a handle can be obtained from the only routines that do not require it, namely .BR sdbm_open (\|) @@ -187,6 +207,11 @@ .LP To free the resources occupied while a database handle is active, call .BR sdbm_close (\|). +The +.BR sdbm_unlink (\|) +call is similar to +.BR sdbm_close (\|) +but will additionally force the deletion of the database files. .LP Given a handle, one can retrieve data associated with a key by using the .BR sdbm_fetch (\|) @@ -235,7 +260,17 @@ .BR sdbm_deletekey (\|) routine. Usage of .BR sdbm_value (\|) -outside of the outlined iterator loop is forbidden. +or +.BR sdbm_deletekey (\|) +outside of the outlined iterator loop is forbidden. Should that happen, an +error is returned (either +.B nullitem +or +.BR -1 ) +and +.B errno +is set to +.BR \s-1ENOENT\s0 . .LP The iteration may begin with .BR sdbm_firstkey_safe (\|) @@ -247,6 +282,17 @@ .B \.pag files are not consistent with eachother. .LP +If for some reason the iteration must be aborted before +.BR sdbm_nextkey (\|) +or +.BR sdbm_firstkey (\|) +return +.BR nullitem , +then the +.BR sdbm_endkey (\|) +routine must be called to clear the iteration context and mark the end +of the iteration loop. +.LP If you determine that the performance of the database is inadequate or you notice clustering or other effects that may be due to the hashing algorithm used by this package, you can override it by supplying your @@ -282,9 +328,11 @@ values), or -1 if the file was not opened yet because it was not needed so far. .IP .BR sdbm_name (\|) -returns the database name previous set using +returns the database name previously set using .BR sdbm_set_name (\|) -or the empty string if none was set. +or a string starting with "file " and followed by the pathname of the +.B .pag +file if no name was set yet. .IP .BR sdbm_is_storable (\|) indicates whether a combination of key and value sizes can fit within the size @@ -299,6 +347,126 @@ .BR sdbm_clear (\|) erases all the data held in the database but keeps it opened. Returns -1 on errors. +.IP +.BR sdbm_rename (\|) +renames the database files using the specified name base (without a +.BR .pag +or other +.BR .dir +extension) and transparently re-opens the database using the new files. +Returns -1 on error. +.IP +.BR sdbm_rename_files (\|) +works like +.BR sdbm_rename (\|) +but with the new filenames explicitly given. +.IP +.BR sdbm_rebuild (\|) +rebuilds the database, hopefully leading to a more compact on-disk +representation. It returns -1 on failure. +.SH ITERATING +It is possible to use high-level iterators on the database to process all the +items (key / value pairs) via a common routine. That processing callback +of type +.B sdbm_cb_t +has the following signature: +.sp +.nf +.ft B +void callback(const datum key, const datum value, void *arg); +.ft R +.fi +.LP +The +.B key +and +.B value +arguments are the current item key and value, and +.B arg +is an opaque argument given as context to the routine. To invoke the callback +on all the items, one uses: +.sp +.nf +.ft B +sdbm_foreach(db, flags, callback, arg); +.ft R +.fi +.LP +The +.B arg +here will be passed as-is to the callback routine for every item. The +.B flags +govern the way the traversal is made. It can be a combination of the following +flags, or 0 to use the default processing: +.B \s-1DBM_F_SAFE\s0 +will activate key checking during the iteration whilst +.B \s-1DBM_F_SKIP\s0 +will skip unreadable values, especially for big values that cannot be correctly +fetched from the data file. +.LP +The +.BR sdbm_foreach (\|) +routine returns the number of items that were successfully iterated over, +in other words, the amount of entries in the databse. It is possible to +use a +.B NULL +argument for the callback parameter to have +.BR sdbm_foreach (\|) +simply iterate over the database to count the items. +.LP +Using +.BR sdbm_foreach_remove (\|), +one can also iterate over all the items and use a callback of type +.B sdbm_cbr_t +whose signature is: +.sp +.nf +.ft B +bool callback(const datum key, const datum value, void *arg); +.ft R +.fi +.LP +It returns a boolean value, with +.B \s-1TRUE\s0 +indicating that the item being iterated over should be removed and +.B \s-1FALSE\s0 +indicating that the item is to be kept. +.LP +The +.BR sdbm_foreach_remove (\|) +routine returns the number of items that were successfully iterated over, and +for which the callback returned +.BR \s-1FALSE\s0 , +in other words, it returns the amount of remaining entries in the database. +.SH THREAD SAFETY +By default, the database handles can only be used by the thread that created +them. However, invoking +.BR sdbm_thread_safe (\|) +on a newly created database will allow safe concurrent accesses to the +database: this locks the database handle for the duration of the call and +routines which return a +.B datum +will make sure that the data returned are thread-private, making the necessary +copy to allow concurrent updates to the database after the value was returned. +.LP +For multiple operations that need to be performed consistently over the +database without interruptions by other threads, one may call +.BR sdbm_lock (\|) +to begin the critical section and +.BR sdbm_unlock (\|) +to end the critical section. Calls can nest as long as they are paired +correctly. It is forbidden to use these routines on a database that was +not marked as being concurrent via +.BR sdbm_thread_safe (\|) +beforehand. +.LP +Concurrent iterations on the database are forbidden, and this is enforced by +having the iterators return +.B nullitem +and set +.B errno +to +.BR \s-1EPERM\s0 . .SH PAGE CACHING This .B sdbm @@ -338,29 +506,44 @@ .BR sdbm_set_volatile (\|) with a .B \s-1TRUE\s0 -argument. In which case it also automatically enables delayed writes. +argument. In which case it also automatically enables delayed writes and +the database files will be deleted when +.BR sdbm_close (\|) +is called. +.LP +To know how a database descriptor has been configured, one can call +.BR sdbm_get_cache (\|) +to get the amount of pages configured for LRU caching, use +.BR sdbm_get_wdelay (\|) +to know whether deferred writes have been enabled, and check volatility by +calling +.BR sdbm_is_volatile (\|). .SH SEE ALSO .IR open (2). .SH DIAGNOSTICS Functions that return a -.B "DBM *" +.B "DBM\ *" handle will use .SM NULL to indicate an error. Functions that return an .B int -will use \-1 to indicate an error. The normal return value in that case is 0. +will use \-1 to indicate an error. The normal returned value in that case is 0. Functions that return a .B datum will return .B nullitem to indicate an error. .LP -As a special case of +As a special case, .BR sdbm_store (\|), -if it is called with the +when called with the .B \s-1DBM_INSERT\s0 -flag and the key already exists in the database, the return value will be 1. +flag and the key happens to already exist in the database, will return 1 +and +.B errno +is set to +.BR \s-1EEXIST\s0 . .LP In general, if a function parameter is invalid, .B errno @@ -383,6 +566,45 @@ .IR write (2), or .IR lseek (2). +.LP +When a +.BR sdbm_rename (\|) +or +.BR sdbm_rebuild (\|) +operation fails, the database handle may be left in a broken state, causing +any further access to the database to fail with +.B errno +set to +.BR \s-1ESTALE\s0 . +At this point, the database handle should be closed. +.LP +If the +.BR sdbm_rebuild (\|) +routine is called from within an iteration loop, it will fail and set +.B errno +to +.BR \s-1EBUSY\s0 . +.LP +Conversely, if +.BR sdbm_nextkey (\|) , +.BR sdbm_value (\|) +or +.BR sdbm_deletekey (\|) +are called outside an iteration loop, they will fail with +.B errno +set to +.B \s-1ENOENT\s0 +and they will loudly complain to indicate misuse. +.LP +When dealing with large keys or values, an inconsistency in the +.B .pag +or +.B .dat +files (such as bad block number list, requesting access of unallocated data +blocks, etc...) is reported by setting +.B errno +to +.BR \s-1EFAULT\s0 . .SH AUTHORS "Ozan S. Yigit" <oz@nexus.yorku.ca> .sp @@ -434,29 +656,69 @@ data item, and the .BR sdbm_prep (\|), .BR sdbm_hash (\|), +.BR sdbm_thread_safe (\|), +.BR sdbm_lock (\|), +.BR sdbm_unlock (\|), .BR sdbm_rdonly (\|), .BR sdbm_dirfno (\|), and .BR sdbm_pagfno (\|) functions are unique to this package. .LP -The +The following functions: +.sp +.in +5 .BR sdbm_datfno (\|) -.BR sdbm_replace (\|), -.BR sdbm_firstkey_safe (\|), -.BR sdbm_deletekey (\|), -.BR sdbm_value (\|), -.BR sdbm_is_storable (\|), -.BR sdbm_sync (\|), -.BR sdbm_srink (\|), -.BR sdbm_clear (\|), -.BR sdbm_set_cache (\|), -.BR sdbm_set_wdelay (\|), -.BR sdbm_set_volatile (\|), -.BR sdbm_set_name (\|), -and +.br +.BR sdbm_replace (\|) +.br +.BR sdbm_firstkey_safe (\|) +.br +.BR sdbm_deletekey (\|) +.br +.BR sdbm_endkey (\|) +.br +.BR sdbm_value (\|) +.br +.BR sdbm_is_storable (\|) +.br +.BR sdbm_sync (\|) +.br +.BR sdbm_shrink (\|) +.br +.BR sdbm_clear (\|) +.br +.BR sdbm_unlink (\|) +.br +.BR sdbm_rename (\|) +.br +.BR sdbm_rename_files (\|) +.br +.BR sdbm_rebuild (\|) +.br +.BR sdbm_get_cache (\|) +.br +.BR sdbm_get_wdelay (\|) +.br +.BR sdbm_is_volatile (\|) +.br +.BR sdbm_set_cache (\|) +.br +.BR sdbm_set_wdelay (\|) +.br +.BR sdbm_set_volatile (\|) +.br +.BR sdbm_set_name (\|) +.br .BR sdbm_name (\|) -functions are additions made by Raphael Manfredi for +.br +.BR sdbm_foreach (\|) +.br +.BR sdbm_foreach_remove (\|) +.br +.sp +.in -5 +are additions made by Raphael Manfredi for .B gtk-gnutella but anyone is welcome reusing these extensions. .LP @@ -465,3 +727,5 @@ should see no difference). When activated (as needed), a third file is created to store the larger keys and values, ending with the extension .BR \.dat . +.LP +The API was also made thread-safe by Raphael Manfredi.
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/sdbm.c -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/sdbm.c
Changed
@@ -16,15 +16,23 @@ #include "big.h" #include "private.h" +#include "lib/compat_misc.h" #include "lib/compat_pio.h" #include "lib/debug.h" #include "lib/fd.h" #include "lib/file.h" -#include "lib/log.h" #include "lib/halloc.h" +#include "lib/log.h" #include "lib/misc.h" +#include "lib/mutex.h" #include "lib/pow2.h" +#include "lib/random.h" +#include "lib/str.h" +#include "lib/stringify.h" +#include "lib/thread.h" +#include "lib/vmm.h" #include "lib/walloc.h" +#include "lib/xmalloc.h" #include "lib/override.h" /* Must be the last header included */ @@ -33,13 +41,70 @@ /* * forward */ -static gboolean getdbit(DBM *, long); -static gboolean setdbit(DBM *, long); -static gboolean getpage(DBM *, long); +static bool getdbit(DBM *, long); +static bool setdbit(DBM *, long); +static bool getpage(DBM *, long); static datum getnext(DBM *); -static gboolean makroom(DBM *, long, size_t); +static bool makroom(DBM *, long, size_t); static void validpage(DBM *, long); +/* + * Thread-safety macros. + */ + +#ifdef THREADS + +#define sdbm_synchronize(s) G_STMT_START { \ + if G_UNLIKELY((s)->lock != NULL) { \ + DBM *ws = deconstify_pointer(s); \ + mutex_lock(ws->lock); \ + } \ +} G_STMT_END + +#define sdbm_unsynchronize(s) G_STMT_START { \ + if G_UNLIKELY((s)->lock != NULL) { \ + DBM *ws = deconstify_pointer(s); \ + mutex_unlock(ws->lock); \ + } \ +} G_STMT_END + +#define sdbm_return(s, v) G_STMT_START { \ + if G_UNLIKELY((s)->lock != NULL) \ + mutex_unlock((s)->lock); \ + return v; \ +} G_STMT_END + +#define sdbm_return_datum(s, v) G_STMT_START { \ + datum *rv = &(v); \ + if G_UNLIKELY((s)->lock != NULL) { \ + rv = sdbm_thread_datum((s), &(v)); \ + mutex_unlock((s)->lock); \ + } \ + return *rv; \ +} G_STMT_END + +#define sdbm_return_void(s) G_STMT_START { \ + if G_UNLIKELY((s)->lock != NULL) \ + mutex_unlock((s)->lock); \ + return; \ +} G_STMT_END + +#define assert_sdbm_locked(s) G_STMT_START { \ + if G_UNLIKELY((s)->lock != NULL) \ + assert_mutex_is_owned((s)->lock); \ +} G_STMT_END + +#else /* !THREADS */ + +#define sdbm_synchronize(s) +#define sdbm_unsynchronize(s) +#define sdbm_return(s, v) return v +#define sdbm_return_datum(s, v) return v +#define sdbm_return_void(s) return +#define assert_sdbm_locked(s) + +#endif /* THREADS */ + static inline int bad(const datum item) { @@ -75,7 +140,7 @@ * @return FALSE if it will not fit, TRUE if it fits with the required * page size filled in ``needed'', if not NULL. */ -static gboolean +static bool sdbm_storage_needs(size_t key_size, size_t value_size, size_t *needed) { #ifdef BIGDATA @@ -87,7 +152,7 @@ * key_size <= DBM_PAIRMAX && DBM_PAIRMAX - key_size >= value_size * * which would only indicate whether the expanded key and value can - * fit in the page we loook at whether the sum of key + value sizes is + * fit in the page we look at whether the sum of key + value sizes is * big enough to warrant offloading of the value in a .dat file, thereby * reducing the memory constraints in the .pag file. However we don't * offload the value to the .dat if its ends up wasting more than half @@ -149,12 +214,21 @@ /** * Will a key/value pair of given size fit in the database? */ -gboolean +bool sdbm_is_storable(size_t key_size, size_t value_size) { return sdbm_storage_needs(key_size, value_size, NULL); } +/** + * Open database with specified flags and mode (like open() arguments). + * + * @param file the basename to use for deriving .pag, .dir and .dat names + * @param flags open() flags + * @param mode open() mode + * + * @return the created database, or NULL on error with errno set. + */ DBM * sdbm_open(const char *file, int flags, int mode) { @@ -165,33 +239,36 @@ if (file == NULL || '\0' == file0) { errno = EINVAL; - goto finish; + goto error; } - dirname = h_strconcat(file, DBM_DIRFEXT, (void *) 0); + dirname = h_strconcat(file, DBM_DIRFEXT, NULL_PTR); if (NULL == dirname) { errno = ENOMEM; - goto finish; + goto error; } - pagname = h_strconcat(file, DBM_PAGFEXT, (void *) 0); + pagname = h_strconcat(file, DBM_PAGFEXT, NULL_PTR); if (NULL == pagname) { errno = ENOMEM; - goto finish; + goto error; } #ifdef BIGDATA - datname = h_strconcat(file, DBM_DATFEXT, (void *) 0); - if (NULL == pagname) { + datname = h_strconcat(file, DBM_DATFEXT, NULL_PTR); + if (NULL == datname) { errno = ENOMEM; - goto finish; + goto error; } #endif db = sdbm_prep(dirname, pagname, datname, flags, mode); -finish: + /* FALL THROUGH */ + +error: HFREE_NULL(pagname); HFREE_NULL(dirname); HFREE_NULL(datname); + return db; } @@ -201,33 +278,101 @@ DBM *db; WALLOC0(db); - if (db) { - db->pagf = -1; - db->dirf = -1; - } + db->magic = SDBM_MAGIC; + db->pagf = -1; + db->dirf = -1; + +#ifdef THREADS + db->iterid = THREAD_INVALID_ID; +#endif + return db; } +static void +sdbm_free(DBM *db) +{ + sdbm_check(db); + +#ifdef THREADS + if (db->returned != NULL) { + int i; + + for (i = 0; i < THREAD_MAX; i++) { + struct dbm_returns *r = &db->returnedi; + + if (r->len != 0) + XFREE_NULL(r->value.dptr); /* Free thread-private data copy */ + } + + XFREE_NULL(db->returned); + } +#endif + + db->magic = 0; + WFREE(db); +} + +static void +sdbm_free_null(DBM **db_ptr) +{ + DBM *db = *db_ptr; + + if (db != NULL) { + sdbm_free(db); + *db_ptr = NULL; + } +} + /** * Set the database name (copied). */ void sdbm_set_name(DBM *db, const char *name) { + sdbm_check(db); + HFREE_NULL(db->name); db->name = h_strdup(name); } /** * Get the database name - * @return an empty string if not set. + * + * @return recorded name, or the path to the .pag file if no name was set. */ const char * -sdbm_name(DBM *db) +sdbm_name(const DBM *db) { - return db->name ? db->name : ""; + sdbm_check(db); + + if G_LIKELY(db->name != NULL) + return db->name; + + sdbm_synchronize(db); + if (NULL == db->name) { + DBM *wdb = deconstify_pointer(db); + wdb->name = h_strconcat("file ", db->pagname, NULL_PTR); + } + sdbm_unsynchronize(db); + + return db->name; } +/** + * Open database with specified files, flags and mode (like open() arguments). + * + * If the `datname' argument is NULL, large keys/values are disabled for + * this database. + * + * @param dirname the file to use for .dir + * @param pagname the file to use for .pag + * @param datname if not-NULL, the file to use for .dat (big keys/values) + * @param flags open() flags + * @param mode open() mode + * + * @return the created database, or NULL on error with errno set. + */ DBM * sdbm_prep(const char *dirname, const char *pagname, const char *datname, int flags, int mode) @@ -256,7 +401,7 @@ #endif /* - * adjust user flags so that WRONLY becomes RDWR, + * adjust user flags so that WRONLY becomes RDWR, * as required by this package. Also set our internal * flag for RDONLY if needed. */ @@ -271,9 +416,6 @@ * If we fail anywhere, undo everything, return NULL. */ -#if defined(O_BINARY) - flags |= O_BINARY; -#endif if ((db->pagf = file_open(pagname, flags, mode)) > -1) { if ((db->dirf = file_open(dirname, flags, mode)) > -1) { @@ -292,7 +434,7 @@ * unsplit data page: dirpage is all zeros. */ - db->dirbno = (!dstat.st_size) ? 0 : -1; + db->dirbno = (0 == dstat.st_size) ? 0 : -1; db->pagbno = -1; db->maxbno = dstat.st_size * BYTESIZ; @@ -309,55 +451,217 @@ success: #ifdef BIGDATA - if (datname != NULL) - db->big = big_alloc(datname, flags, mode); + if (datname != NULL) { + db->datname = h_strdup(datname); + db->big = big_alloc(); + + /* + * If the .dat file exists and O_TRUNC was given in the flags and the + * database is opened for writing, then the database is re-initialized: + * unlink the .dat file, which will be re-created on-demand. + */ + + if ((flags & (O_RDWR | O_WRONLY) && (flags & O_TRUNC))) { + if (-1 == unlink(datname) && ENOENT != errno) + s_warning("%s(): cannot delete \"%s\": %m", G_STRFUNC, datname); + } + } #else (void) datname; #endif + db->dirname = h_strdup(dirname); + db->pagname = h_strdup(pagname); + db->openflags = flags; + db->openmode = mode; + + /* + * We expect a random access pattern on the files. + */ + + compat_fadvise_random(db->pagf, 0, 0); + compat_fadvise_random(db->dirf, 0, 0); + return db; } +#ifdef THREADS +/** + * Mark newly created database as being thread-safe. + * + * This will make all external operations on the database thread-safe. + */ +void +sdbm_thread_safe(DBM *db) +{ + sdbm_check(db); + g_assert(NULL == db->lock); + + WALLOC0(db->lock); + mutex_init(db->lock); + XMALLOC0_ARRAY(db->returned, THREAD_MAX); +} + +/** + * Lock the database to allow a sequence of operations to be atomically + * conducted. + * + * It is possible to lock the database several times as long as each locking + * is paired with a corresponding unlocking in the execution flow. + * + * The database must have been marked thread-safe already. + */ +void +sdbm_lock(DBM *db) +{ + sdbm_check(db); + g_assert_log(db->lock != NULL, + "%s(): SDBM \"%s\" not marked thread-safe", G_STRFUNC, sdbm_name(db)); + + mutex_lock(db->lock); +} + +/* + * Release lock on database. + * + * The database must have been marked thread-safe already and locked by the + * calling thread. + */ +void +sdbm_unlock(DBM *db) +{ + sdbm_check(db); + g_assert_log(db->lock != NULL, + "%s(): SDBM \"%s\" not marked thread-safe", G_STRFUNC, sdbm_name(db)); + + mutex_unlock(db->lock); +} + +/** + * Allocate a thread-private datum to be returned to the thread. + * + * Although the value returned is thread-private, its lifespan is limited to + * the next call made to the SDBM API by the thread. + * + * A thread-private datum contains a copy of the data returned to the thread, + * since we cannot point into the internal SDBM data structures like the LRU + * page cache: any concurrent access could make the data stale. + * + * @param v a pointer to the datum returned by the function + * + * @return a pointer to the thread-private datum with data from ``d'' copied. + */ +static datum * +sdbm_thread_datum(DBM *db, datum *v) +{ + datum *d; + static datum zerosized; + + sdbm_check(db); + g_assert(db->returned != NULL); + + if (v->dsize != 0) { + uint stid = thread_small_id(); + struct dbm_returns *r = &db->returnedstid; + + g_assert(stid < THREAD_MAX); + + /* + * Until we reach XMALLOC_MAXSIZE, we keep growing the data buffer, + * never shrinking it to limit the overhead. Since most values are + * going to fit in a DBM page and therefore be less than 1K, this + * strategy is not going to waste much memory and remains efficient. + */ + + d = &r->value; + + if (r->len < v->dsize || r->len > XMALLOC_MAXSIZE) { + /* + * We use xrealloc() amd a memcpy() instead of just xcopy() because + * in general the values returned will be roughly similar in size, + * and therefore we expect that xrealloc() ends-up being a no-op! + */ + + d->dptr = xrealloc(d->dptr, v->dsize); + r->len = v->dsize; /* Physical length of allocated buffer */ + } + g_assert(r->len >= v->dsize); + memcpy(d->dptr, v->dptr, v->dsize); + d->dsize = v->dsize; + } else if (NULL == v->dptr) { + d = deconstify_pointer(&nullitem); + } else { + /* + * It's possible to have a zero-sized value stored, and if we come + * here then v->dsize = 0 and v->dptr != NULL. + * + * To prevent any dereference of the pointer, we use the VMM trap page. + */ + + if G_UNLIKELY(NULL == zerosized.dptr) + zerosized.dptr = deconstify_pointer(vmm_trap_page()); + + d = &zerosized; + } + + return d; +} +#endif /* THREADS */ + static void log_sdbmstats(DBM *db) { - g_info("sdbm: \"%s\" page reads = %lu, page writes = %lu (forced %lu)", + sdbm_check(db); + + s_info("sdbm: \"%s\" page reads = %lu, page writes = %lu (forced %lu)", sdbm_name(db), db->pagread, db->pagwrite, db->pagwforced); - g_info("sdbm: \"%s\" dir reads = %lu, dir writes = %lu (deferred %lu)", + s_info("sdbm: \"%s\" dir reads = %lu, dir writes = %lu (deferred %lu)", sdbm_name(db), db->dirread, db->dirwrite, db->dirwdelayed); - g_info("sdbm: \"%s\" page blocknum hits = %.2f%% on %lu request%s", + s_info("sdbm: \"%s\" page blocknum hits = %.2f%% on %lu request%s", sdbm_name(db), db->pagbno_hit * 100.0 / MAX(db->pagfetch, 1), - db->pagfetch, 1 == db->pagfetch ? "" : "s"); - g_info("sdbm: \"%s\" dir blocknum hits = %.2f%% on %lu request%s", + db->pagfetch, plural(db->pagfetch)); + s_info("sdbm: \"%s\" dir blocknum hits = %.2f%% on %lu request%s", sdbm_name(db), db->dirbno_hit * 100.0 / MAX(db->dirfetch, 1), - db->dirfetch, 1 == db->dirfetch ? "" : "s"); - g_info("sdbm: \"%s\" inplace value writes = %.2f%% on %lu occurence%s", + db->dirfetch, plural(db->dirfetch)); + s_info("sdbm: \"%s\" inplace value writes = %.2f%% on %lu occurence%s", sdbm_name(db), db->repl_inplace * 100.0 / MAX(db->repl_stores, 1), - db->repl_stores, 1 == db->repl_stores ? "" : "s"); + db->repl_stores, plural(db->repl_stores)); } static void log_sdbm_warnings(DBM *db) { + sdbm_check(db); + + if (db->flags & DBM_BROKEN) { + s_warning("sdbm: \"%s\" descriptor was broken by failed renaming", + sdbm_name(db)); + } if (db->bad_pages) { - g_warning("sdbm: \"%s\" read %lu corrupted page%s (zero-ed on the fly)", - sdbm_name(db), db->bad_pages, 1 == db->bad_pages ? "" : "s"); + s_warning("sdbm: \"%s\" read %lu corrupted page%s (zero-ed on the fly)", + sdbm_name(db), db->bad_pages, plural(db->bad_pages)); } if (db->removed_keys) { - g_warning("sdbm: \"%s\" removed %lu key%s not belonging to their page", - sdbm_name(db), db->removed_keys, 1 == db->removed_keys ? "" : "s"); + s_warning("sdbm: \"%s\" removed %lu key%s not belonging to their page", + sdbm_name(db), db->removed_keys, plural(db->removed_keys)); } if (db->read_errors || db->write_errors) { - g_warning("sdbm: \"%s\" " + s_warning("sdbm: \"%s\" " "ERRORS: read = %lu, write = %lu (%lu in flushes, %lu in splits)", sdbm_name(db), db->read_errors, db->write_errors, db->flush_errors, db->spl_errors); } if (db->spl_corrupt) { - g_warning("sdbm: \"%s\" %lu failed page split%s could not be undone", - sdbm_name(db), db->spl_corrupt, 1 == db->spl_corrupt ? "" : "s"); + s_warning("sdbm: \"%s\" %lu failed page split%s could not be undone", + sdbm_name(db), db->spl_corrupt, plural(db->spl_corrupt)); + } +#ifdef BIGDATA + if (db->bad_bigkeys) { + s_warning("sdbm: \"%s\" encountered %lu bad big key%s", + sdbm_name(db), db->bad_bigkeys, plural(db->bad_bigkeys)); } +#endif } /** @@ -366,9 +670,11 @@ * * @return TRUE on success */ -static gboolean +static bool fetch_pagbuf(DBM *db, long pagnum) { + assert_sdbm_locked(db); + db->pagfetch++; #ifdef LRU @@ -387,7 +693,7 @@ #ifdef LRU { - gboolean loaded; + bool loaded; if G_UNLIKELY(!readbuf(db, pagnum, &loaded)) { db->pagbno = -1; @@ -412,7 +718,7 @@ db->pagread++; got = compat_pread(db->pagf, db->pagbuf, DBM_PBLKSIZ, OFF_PAG(pagnum)); if G_UNLIKELY(got < 0) { - g_critical("sdbm: \"%s\": cannot read page #%ld: %m", + s_critical("sdbm: \"%s\": cannot read page #%ld: %m", sdbm_name(db), pagnum); ioerr(db, FALSE); db->pagbno = -1; @@ -420,12 +726,12 @@ } if G_UNLIKELY(got < DBM_PBLKSIZ) { if (got > 0) - g_critical("sdbm: \"%s\": partial read (%u bytes) of page #%ld", + s_critical("sdbm: \"%s\": partial read (%u bytes) of page #%ld", sdbm_name(db), (unsigned) got, pagnum); memset(db->pagbuf + got, 0, DBM_PBLKSIZ - got); } if G_UNLIKELY(!sdbm_internal_chkpage(db->pagbuf)) { - g_critical("sdbm: \"%s\": corrupted page #%ld, clearing", + s_critical("sdbm: \"%s\": corrupted page #%ld, clearing", sdbm_name(db), pagnum); memset(db->pagbuf, 0, DBM_PBLKSIZ); db->bad_pages++; @@ -444,9 +750,11 @@ * Flush db->pagbuf to disk. * @return TRUE on success */ -static gboolean +static bool flush_pagbuf(DBM *db) { + assert_sdbm_locked(db); + #ifdef LRU return dirtypag(db, FALSE); /* Current (cached) page buffer is dirty */ #else @@ -459,9 +767,11 @@ * Possibly force flush of db->pagbuf to disk, even on deferred writes. * @return TRUE on success */ -static gboolean -force_flush_pagbuf(DBM *db, gboolean force) +static bool +force_flush_pagbuf(DBM *db, bool force) { + assert_sdbm_locked(db); + if (force) db->pagwforced++; return dirtypag(db, force); /* Current (cached) page buffer is dirty */ @@ -472,23 +782,31 @@ * Flush dirbuf to disk. * @return TRUE on success. */ -static gboolean +static bool flush_dirbuf(DBM *db) { ssize_t w; + assert_sdbm_locked(db); + db->dirwrite++; w = compat_pwrite(db->dirf, db->dirbuf, DBM_DBLKSIZ, OFF_DIR(db->dirbno)); + /* + * The bitmap forest is a critical part, make sure the kernel flushes + * it immediately to disk. + */ + #ifdef LRU if (DBM_DBLKSIZ == w) { db->dirbuf_dirty = FALSE; + fd_fdatasync(db->dirf); return TRUE; } #endif if G_UNLIKELY(w != DBM_DBLKSIZ) { - g_critical("sdbm: \"%s\": cannot flush dir block #%ld: %s", + s_critical("sdbm: \"%s\": cannot flush dir block #%ld: %s", sdbm_name(db), db->dirbno, -1 == w ? g_strerror(errno) : "partial write"); @@ -499,32 +817,117 @@ return TRUE; } -void -sdbm_close(DBM *db) +static void +sdbm_unlink_file(const char *name, const char *path) { - if G_UNLIKELY(db == NULL) - errno = EINVAL; - else { + g_assert(path != NULL); + + if (-1 == unlink(path)) + s_critical("sdbm: \"%s\": cannot unlink \"%s\": %m", name, path); +} + +/** + * Internal dabtase close. + * + * @param db the database to close + * @param clearfiles whether to unlink files after close + * @param destroy whether to destroy the object + */ +static void +sdbm_close_internal(DBM *db, bool clearfiles, bool destroy) +{ + sdbm_check(db); + assert_sdbm_locked(db); + #ifdef LRU - if (!db->is_volatile && db->dirbuf_dirty) - flush_dirbuf(db); + if (is_valid_fd(db->pagf)) lru_close(db); #else - WFREE_NULL(db->pagbuf, DBM_PBLKSIZ); + WFREE_NULL(db->pagbuf, DBM_PBLKSIZ); +#endif + WFREE_NULL(db->dirbuf, DBM_DBLKSIZ); + fd_forget_and_close(&db->dirf); + fd_forget_and_close(&db->pagf); +#ifdef BIGDATA + big_free(db); +#endif + if (common_stats) { + log_sdbmstats(db); + } + log_sdbm_warnings(db); + + if (clearfiles) { + sdbm_unlink_file(sdbm_name(db), db->dirname); + sdbm_unlink_file(sdbm_name(db), db->pagname); +#ifdef BIGDATA + if (db->datname != NULL && file_exists(db->datname)) + sdbm_unlink_file(sdbm_name(db), db->datname); #endif - WFREE_NULL(db->dirbuf, DBM_DBLKSIZ); - fd_forget_and_close(&db->dirf); - fd_forget_and_close(&db->pagf); + } + + HFREE_NULL(db->name); + HFREE_NULL(db->pagname); + HFREE_NULL(db->dirname); #ifdef BIGDATA - big_free(db); + HFREE_NULL(db->datname); #endif - if (common_stats) { - log_sdbmstats(db); + + if (destroy) { + if (db->lock != NULL) { + mutex_destroy(db->lock); + WFREE(db->lock); } - log_sdbm_warnings(db); - HFREE_NULL(db->name); - WFREE(db); + sdbm_free(db); + } +} + +/** + * Close the database and unlink its files. + */ +void +sdbm_unlink(DBM *db) +{ + if G_UNLIKELY(db == NULL) + return; + + sdbm_synchronize(db); + sdbm_close_internal(db, TRUE, TRUE); +} + +/** + * Close the database. + * + * If it was marked volatile, then its files are unlinked as well. + */ +void +sdbm_close(DBM *db) +{ + bool clearfiles; + + if G_UNLIKELY(db == NULL) + return; + + sdbm_check(db); + + sdbm_synchronize(db); + +#ifdef LRU + clearfiles = db->is_volatile; +#else + clearfiles = FALSE; +#endif + + /* + * If we keep the files around, flush the database to ensure there + * are no dirty pending data in the caches (with deferred writes). + */ + + if (!clearfiles && (ssize_t) -1 == sdbm_sync(db)) { + s_warning("%s(): could not sync SDBM \"%s\": %m", + G_STRFUNC, sdbm_name(db)); } + + sdbm_close_internal(db, clearfiles, TRUE); } #define SDBM_WARN_ITERATING(db) G_STMT_START { \ @@ -542,14 +945,32 @@ errno = EINVAL; return nullitem; } + sdbm_check(db); + + sdbm_synchronize(db); + + if G_UNLIKELY(db->flags & DBM_BROKEN) { + errno = ESTALE; + goto null; + } + SDBM_WARN_ITERATING(db); - if (getpage(db, exhash(key))) - return getpair(db, db->pagbuf, key); + + if (getpage(db, exhash(key))) { + datum value = getpair(db, db->pagbuf, key); + sdbm_return_datum(db, value); + } ioerr(db, FALSE); - return nullitem; +null: + sdbm_return(db, nullitem); } +/** + * Does key exist in the database? + * + * @return -1 on error, 0 (FALSE) if the key is missing, 1 (TRUE) if it exists. + */ int sdbm_exists(DBM *db, datum key) { @@ -557,37 +978,63 @@ errno = EINVAL; return -1; } + sdbm_check(db); + + sdbm_synchronize(db); + + if G_UNLIKELY(db->flags & DBM_BROKEN) { + errno = ESTALE; + goto error; + } SDBM_WARN_ITERATING(db); - if (getpage(db, exhash(key))) - return exipair(db, db->pagbuf, key); + if (getpage(db, exhash(key))) { + int exists = exipair(db, db->pagbuf, key); + sdbm_return(db, exists); + } ioerr(db, FALSE); - return -1; +error: + sdbm_return(db, -1); } +/** + * Delete key from the database. + * + * @return -1 on error with errno set, 0 if OK. + */ int sdbm_delete(DBM *db, datum key) { + int status = -1; + if G_UNLIKELY(db == NULL || bad(key)) { errno = EINVAL; return -1; } + sdbm_check(db); + + sdbm_synchronize(db); + if G_UNLIKELY(db->flags & DBM_RDONLY) { errno = EPERM; - return -1; + goto done; } if G_UNLIKELY(db->flags & DBM_IOERR_W) { errno = EIO; - return -1; + goto done; + } + if G_UNLIKELY(db->flags & DBM_BROKEN) { + errno = ESTALE; + goto done; } SDBM_WARN_ITERATING(db); if G_UNLIKELY(!getpage(db, exhash(key))) { ioerr(db, FALSE); - return -1; + goto done; } if (!delpair(db, db->pagbuf, key)) { errno = 0; - return -1; + goto done; } /* @@ -595,19 +1042,36 @@ */ if G_UNLIKELY(!flush_pagbuf(db)) - return -1; + goto done; - return 0; + status = 0; + +done: + sdbm_return(db, status); } +/** + * Store the (``key'', ``val'') pair in the database. + * + * The ``flags'' can be either DBM_INSERT (existing key left untouched) or + * DBM_REPLACE (replace entry if key exists). + * + * @return -1 on error, 0 if OK, 1 if the key existed and DBM_INSERT was given. + * + * When DBM_REPLACE is specified and the ``existed'' variable is not NULL, + * it is written with a boolean telling whether the key existed already in + * the database or whether a new key was created, provided 0 is returned. + */ static int -storepair(DBM *db, datum key, datum val, int flags, gboolean *existed) +storepair(DBM *db, datum key, datum val, int flags, bool *existed) { size_t need; long hash; - gboolean need_split = FALSE; + bool need_split = FALSE; int result = 0; + assert_sdbm_locked(db); + if G_UNLIKELY(0 == val.dsize) { val.dptr = ""; } @@ -623,6 +1087,10 @@ errno = EIO; return -1; } + if G_UNLIKELY(db->flags & DBM_BROKEN) { + errno = ESTALE; + return -1; + } /* * is the pair too big (or too small) for this database ? @@ -647,8 +1115,8 @@ if (flags == DBM_REPLACE) { size_t valsize; int idx; - gboolean big; - gboolean found; + bool big; + bool found; /* * If key exists and the data is replaceable in situ, do it. @@ -675,8 +1143,10 @@ } } #ifdef SEEDUPS - else if G_UNLIKELY(duppair(db, db->pagbuf, key)) + else if G_UNLIKELY(duppair(db, db->pagbuf, key)) { + errno = EEXIST; return 1; + } #endif /* @@ -718,18 +1188,51 @@ return result; /* 0 means success */ } +/** + * Store the (``key'', ``val'') pair in the database. + * + * The ``flags'' can be either DBM_INSERT (existing key left untouched) or + * DBM_REPLACE (replace entry if key exists). + * + * @return -1 on error, 0 if OK, 1 if the key existed and DBM_INSERT was given. + */ int sdbm_store(DBM *db, datum key, datum val, int flags) { + int r; + + sdbm_check(db); + + sdbm_synchronize(db); + SDBM_WARN_ITERATING(db); - return storepair(db, key, val, flags, NULL); + r = storepair(db, key, val, flags, NULL); + + sdbm_return(db, r); } +/** + * Store the (``key'', ``val'') pair in the database, replacing existing entry. + * + * @return -1 on error, 0 if OK. + * + * When 0 is returned and the ``existed'' variable is not NULL, it is written + * with a boolean telling whether the key existed already in the database or + * whether a new key was created. + */ int -sdbm_replace(DBM *db, datum key, datum val, gboolean *existed) +sdbm_replace(DBM *db, datum key, datum val, bool *existed) { + int r; + + sdbm_check(db); + + sdbm_synchronize(db); + SDBM_WARN_ITERATING(db); - return storepair(db, key, val, DBM_REPLACE, existed); + r = storepair(db, key, val, DBM_REPLACE, existed); + + sdbm_return(db, r); } /* @@ -737,7 +1240,7 @@ * this routine will attempt to make room for DBM_SPLTMAX times before * giving up. */ -static gboolean +static bool makroom(DBM *db, long int hash, size_t need) { long newp; @@ -748,8 +1251,10 @@ char *New = (char *) twin; int smax = DBM_SPLTMAX; + assert_sdbm_locked(db); + do { - gboolean fits; /* Can we fit new pair in the split page? */ + bool fits; /* Can we fit new pair in the split page? */ /* * Copy the page we're about to split. In case there is an error @@ -886,7 +1391,7 @@ db->pagwrite++, compat_pwrite(db->pagf, New, DBM_PBLKSIZ, OFF_PAG(newp)) < 0) ) { - g_warning("sdbm: \"%s\": cannot flush new page #%ld: %m", + s_warning("sdbm: \"%s\": cannot flush new page #%ld: %m", sdbm_name(db), newp); ioerr(db, TRUE); memcpy(pag, cur, DBM_PBLKSIZ); /* Undo split */ @@ -943,7 +1448,7 @@ */ if G_UNLIKELY(!setdbit(db, db->curbit)) { - g_critical("sdbm: \"%s\": " + s_critical("sdbm: \"%s\": " "cannot set bit in forest bitmap for 0x%lx", sdbm_name(db), db->curbit); db->spl_errors++; @@ -969,7 +1474,7 @@ * we still cannot fit the key. say goodnight. */ - g_critical("sdbm: \"%s\": cannot insert after DBM_SPLTMAX (%d) attempts", + s_critical("sdbm: \"%s\": cannot insert after DBM_SPLTMAX (%d) attempts", sdbm_name(db), DBM_SPLTMAX); return FALSE; @@ -982,7 +1487,7 @@ db->spl_errors++; if (db->pagbno != curbno) { - gboolean failed = FALSE; + bool failed = FALSE; /* * We have already written the old split page to disk, so we need to @@ -1018,7 +1523,7 @@ if (failed) { db->spl_errors++; db->spl_corrupt++; - g_critical("sdbm: \"%s\": cannot undo split of page #%lu: %m", + s_critical("sdbm: \"%s\": cannot undo split of page #%lu: %m", sdbm_name(db), curbno); } } else { @@ -1035,7 +1540,7 @@ #endif memset(New, 0, DBM_PBLKSIZ); if (compat_pwrite(db->pagf, New, DBM_PBLKSIZ, OFF_PAG(newp)) < 0) { - g_critical("sdbm: \"%s\": cannot zero-back new split page #%ld: %m", + s_critical("sdbm: \"%s\": cannot zero-back new split page #%ld: %m", sdbm_name(db), newp); ioerr(db, TRUE); db->spl_errors++; @@ -1048,49 +1553,121 @@ /* FALL THROUGH */ aborted: - g_warning("sdbm: \"%s\": aborted page split operation", sdbm_name(db)); + s_warning("sdbm: \"%s\": aborted page split operation", sdbm_name(db)); return FALSE; } static datum -iteration_done(DBM *db) +iteration_done(DBM *db, bool completed) { g_assert(db != NULL); + assert_sdbm_locked(db); #ifdef BIGDATA if (db->flags & DBM_KEYCHECK) { - size_t adj = big_check_end(db); + size_t adj = big_check_end(db, completed); if (adj != 0) { - g_warning("sdbm: \"%s\": database may have lost entries", + s_warning("sdbm: \"%s\": database may have lost entries", sdbm_name(db)); } } #endif +#ifdef THREADS + db->iterid = THREAD_INVALID_ID; +#endif + db->flags &= ~(DBM_KEYCHECK | DBM_ITERATING); /* Iteration done */ + + /* + * Restore "random" access mode on the .pag file now that the iteration + * has been completed. + */ + + compat_fadvise_random(db->pagf, 0, 0); + return nullitem; } /* - * the following two routines will break if + * the sdbm_firstkey() and sdbm_nextkey() routines will break if * deletions aren't taken into account. (ndbm bug) */ + datum sdbm_firstkey(DBM *db) { + datum value; + if G_UNLIKELY(db == NULL) { errno = EINVAL; - return iteration_done(db); + return nullitem; + } + sdbm_check(db); + + sdbm_synchronize(db); + + if G_UNLIKELY(db->flags & DBM_BROKEN) { + errno = ESTALE; + value = nullitem; + goto done; + } + + if G_UNLIKELY(db->flags & DBM_ITERATING) { + s_critical("recursive iteration on SDBM database \"%s\"", + sdbm_name(db)); } - if G_UNLIKELY(db->flags & DBM_ITERATING) - g_carp("recursive iteration on SDBM database \"%s\"", sdbm_name(db)); +#ifdef THREADS + if G_UNLIKELY(db->lock != NULL) { + uint stid = thread_small_id(); + + if G_UNLIKELY(db->iterid != THREAD_INVALID_ID && db->iterid != stid) { + s_critical("%s(): concurrent iteration on SDBM database \"%s\" " + "with %s from %s", + G_STRFUNC, sdbm_name(db), + thread_id_name(db->iterid), thread_name()); + errno = EPERM; + value = nullitem; + goto done; + } + + db->iterid = stid; + } +#endif /* THREADS */ db->flags |= DBM_ITERATING; db->pagtail = lseek(db->pagf, 0L, SEEK_END); - if G_UNLIKELY(db->pagtail < 0) - return iteration_done(db); + +#ifdef LRU + if (db->cache != NULL) { + fileoffset_t lrutail; + + /* + * Ask the LRU for the highest dirty page it has in stock, to possibly + * amend the db->pagtail value: we need to iterate over the data held + * in the LRU cache! + * --RAM, 2012-10-21 + */ + + lrutail = lru_tail_offset(db); + if (lrutail > db->pagtail) + db->pagtail = lrutail - 1; /* This is the real database end */ + } +#endif /* LRU */ + + if G_UNLIKELY(db->pagtail < 0) { + value = iteration_done(db, FALSE); + goto done; + } + + /* + * During the iteration we're going to traverse the .pag file sequentially. + * The normal "random" access mode will be restored in iteration_done(). + */ + + compat_fadvise_sequential(db->pagf, 0, 0); /* * Start at page 0, skipping any page we can't read. @@ -1106,7 +1683,10 @@ /* Skip faulty page */ } - return getnext(db); + value = getnext(db); + +done: + sdbm_return_datum(db, value); } /** @@ -1116,6 +1696,9 @@ sdbm_firstkey_safe(DBM *db) { if (db != NULL) { + sdbm_check(db); + + sdbm_synchronize(db); db->flags |= DBM_KEYCHECK; /* @@ -1124,9 +1707,10 @@ */ if G_UNLIKELY(db->flags & DBM_RDONLY) { - g_carp("%s() called on read-only SDBM database \"%s\"", + s_critical("%s() called on read-only SDBM database \"%s\"", G_STRFUNC, sdbm_name(db)); } + sdbm_unsynchronize(db); } return sdbm_firstkey(db); } @@ -1134,11 +1718,102 @@ datum sdbm_nextkey(DBM *db) { + datum value; + if G_UNLIKELY(db == NULL) { errno = EINVAL; - return iteration_done(db); + return nullitem; + } + + sdbm_check(db); + + sdbm_synchronize(db); + + if G_UNLIKELY(db->flags & DBM_BROKEN) { + errno = ESTALE; + value = nullitem; + goto done; + } + + if G_UNLIKELY(!(db->flags & DBM_ITERATING)) { + s_critical("%s() called outside of any key iteration over SDBM \"%s\"", + G_STRFUNC, sdbm_name(db)); + errno = ENOENT; + value = nullitem; + goto done; + } + +#ifdef THREADS + if G_UNLIKELY(db->lock != NULL) { + uint stid = thread_small_id(); + + /* Since DBM_ITERATING is set... */ + g_soft_assert(db->iterid != THREAD_INVALID_ID); + + if G_UNLIKELY(db->iterid != stid) { + s_critical("%s(): concurrent iteration on SDBM database \"%s\" " + "with %s from %s", + G_STRFUNC, sdbm_name(db), + thread_id_name(db->iterid), thread_name()); + errno = EPERM; + value = nullitem; + goto done; + } + } +#endif /* THREADS */ + + value = getnext(db); + +done: + sdbm_return_datum(db, value); +} + +/** + * Flag iteration as completed. + */ +void +sdbm_endkey(DBM *db) +{ + sdbm_check(db); + + sdbm_synchronize(db); + + /* + * Loudly warn if this is called outside of an iteration. + */ + + if G_UNLIKELY(!(db->flags & DBM_ITERATING)) { + s_critical("%s() called outside of any key iteration over SDBM \"%s\"", + G_STRFUNC, sdbm_name(db)); + } + +#ifdef THREADS + if G_UNLIKELY(db->lock != NULL) { + uint stid = thread_small_id(); + + /* Since DBM_ITERATING is set... */ + g_soft_assert(db->iterid != THREAD_INVALID_ID); + + if G_UNLIKELY(db->iterid != stid) { + s_critical("%s(): concurrent iteration on SDBM database \"%s\" " + "with %s from %s", + G_STRFUNC, sdbm_name(db), + thread_id_name(db->iterid), thread_name()); + goto done; + } } - return getnext(db); +#endif /* THREADS */ + + /* + * When starting an iteration with sdbm_firstkey_safe() and encountering + * big keys or values, a checking context is allocated and it is only freed + * from within iteration_done(). + */ + + (void) iteration_done(db, FALSE); /* Iteration was interrupted */ + +done: + sdbm_return_void(db); } /** @@ -1149,7 +1824,7 @@ * @return the page number */ static long -getpageb(DBM *db, long int hash, gboolean update) +getpageb(DBM *db, long int hash, bool update) { int hbit; long dbit; @@ -1182,7 +1857,7 @@ * * @return TRUE if OK. */ -static gboolean +static bool getpage(DBM *db, long int hash) { long pagb; @@ -1209,6 +1884,8 @@ int removed = 0; int corrupted = 0; + assert_sdbm_locked(db); + n = ino0; for (i = n - 1; i > 0; i -= 2) { @@ -1226,7 +1903,7 @@ removed++; } else { /* Can happen on I/O error with big keys */ - g_warning("sdbm: \"%s\": cannot remove key #%d/%d " + s_warning("sdbm: \"%s\": cannot remove key #%d/%d " "not belonging to page #%ld", sdbm_name(db), k, n / 2, pagb); } @@ -1235,7 +1912,7 @@ if (delipair(db, pag, i, FALSE)) { corrupted++; } else { - g_warning("sdbm: \"%s\": cannot remove corrupted entry #%d/%d " + s_warning("sdbm: \"%s\": cannot remove corrupted entry #%d/%d " "in page #%ld", sdbm_name(db), k, n / 2, pagb); } @@ -1245,15 +1922,15 @@ if G_UNLIKELY(removed > 0 || corrupted > 0) { if (removed > 0) { db->removed_keys += removed; - g_warning("sdbm: \"%s\": removed %d/%d key%s " + s_warning("sdbm: \"%s\": removed %d/%d key%s " "not belonging to page #%ld", sdbm_name(db), - removed, n / 2, 1 == removed ? "" : "s", pagb); + removed, n / 2, plural(removed), pagb); } if (corrupted > 0) { db->removed_keys += corrupted; - g_warning("sdbm: \"%s\": removed %d/%d corrupted entr%s " + s_warning("sdbm: \"%s\": removed %d/%d corrupted entr%s " "on page #%ld", sdbm_name(db), - corrupted, n / 2, 1 == corrupted ? "y" : "ies", pagb); + corrupted, n / 2, plural_y(corrupted), pagb); } #ifdef LRU (void) force_flush_pagbuf(db, !db->is_volatile); @@ -1263,9 +1940,11 @@ } } -static gboolean +static bool fetch_dirbuf(DBM *db, long dirb) { + assert_sdbm_locked(db); + db->dirfetch++; if (dirb != db->dirbno) { @@ -1279,7 +1958,7 @@ db->dirread++; got = compat_pread(db->dirf, db->dirbuf, DBM_DBLKSIZ, OFF_DIR(dirb)); if G_UNLIKELY(got < 0) { - g_critical("sdbm: \"%s\": could not read dir page #%ld: %m", + s_critical("sdbm: \"%s\": could not read dir page #%ld: %m", sdbm_name(db), dirb); ioerr(db, FALSE); return FALSE; @@ -1297,7 +1976,7 @@ return TRUE; } -static gboolean +static bool getdbit(DBM *db, long int dbit) { long c; @@ -1312,12 +1991,14 @@ return 0 != (db->dirbufc % DBM_DBLKSIZ & (1 << dbit % BYTESIZ)); } -static gboolean +static bool setdbit(DBM *db, long int dbit) { long c; long dirb; + assert_sdbm_locked(db); + c = dbit / BYTESIZ; dirb = c / DBM_DBLKSIZ; @@ -1330,7 +2011,7 @@ if (dbit >= db->maxbno) db->maxbno += DBM_DBLKSIZ * BYTESIZ; #else - if G_UNLIKELY(OFF_DIR((dirb+1)) * BYTESIZ > db->maxbno) + if G_UNLIKELY(OFF_DIR((dirb+1)) * BYTESIZ > db->maxbno) db->maxbno = OFF_DIR((dirb+1)) * BYTESIZ; #endif @@ -1355,6 +2036,8 @@ { datum key; + assert_sdbm_locked(db); + /* * During a traversal, no modification should be done on the database, * so the current page number must be the same as before. The only @@ -1389,7 +2072,7 @@ validpage(db, db->blkptr); } - return iteration_done(db); + return iteration_done(db, TRUE); /* Iteration completely performed */ } /** @@ -1397,32 +2080,69 @@ * subsequent sdbm_nextkey() calls. * * This is a safe operation during key traversal. + * Must not be called outside of a key iteration loop. */ int sdbm_deletekey(DBM *db) { + int status = -1; + if G_UNLIKELY(db == NULL) { errno = EINVAL; return -1; } + sdbm_check(db); + + sdbm_synchronize(db); + if G_UNLIKELY(db->flags & DBM_RDONLY) { errno = EPERM; - return -1; + goto done; } if G_UNLIKELY(db->flags & DBM_IOERR_W) { errno = EIO; - return -1; + goto done; + } + if G_UNLIKELY(db->flags & DBM_BROKEN) { + errno = ESTALE; + goto done; } - g_assert(db->pagbno == db->blkptr); /* No page change since last time */ + /* + * Loudly warn if this is called outside of an iteration. + */ - if G_UNLIKELY(0 == db->keyptr) { - errno = ENOENT; - return -1; + if G_UNLIKELY(!(db->flags & DBM_ITERATING)) { + s_critical("%s() called outside of any key iteration over SDBM \"%s\"", + G_STRFUNC, sdbm_name(db)); + goto no_entry; } +#ifdef THREADS + if G_UNLIKELY(db->lock != NULL) { + uint stid = thread_small_id(); + + /* Since DBM_ITERATING is set... */ + g_soft_assert(db->iterid != THREAD_INVALID_ID); + + if G_UNLIKELY(db->iterid != stid) { + s_critical("%s(): concurrent iteration on SDBM database \"%s\" " + "with %s from %s", + G_STRFUNC, sdbm_name(db), + thread_id_name(db->iterid), thread_name()); + errno = EPERM; + goto done; + } + } +#endif /* THREADS */ + + g_assert(db->pagbno == db->blkptr); /* No page change since last time */ + + if G_UNLIKELY(0 == db->keyptr) + goto no_entry; + if G_UNLIKELY(!delnpair(db, db->pagbuf, db->keyptr)) - return -1; + goto done; db->keyptr--; @@ -1431,9 +2151,16 @@ */ if G_UNLIKELY(!flush_pagbuf(db)) - return -1; + goto done; + + status = 0; + +done: + sdbm_return(db, status); - return 0; +no_entry: + errno = ENOENT; + goto done; } /** @@ -1450,20 +2177,155 @@ return nullitem; } - g_assert(db->pagbno == db->blkptr); /* No page change since last time */ + sdbm_check(db); - if G_UNLIKELY(0 == db->keyptr) { - errno = ENOENT; - return nullitem; + sdbm_synchronize(db); + + /* + * Loudly warn if this is called outside of an iteration. + */ + + if G_UNLIKELY(!(db->flags & DBM_ITERATING)) { + s_critical("%s() called outside of any key iteration over SDBM \"%s\"", + G_STRFUNC, sdbm_name(db)); + goto no_entry; + } + +#ifdef THREADS + if G_UNLIKELY(db->lock != NULL) { + uint stid = thread_small_id(); + + /* Since DBM_ITERATING is set... */ + g_soft_assert(db->iterid != THREAD_INVALID_ID); + + if G_UNLIKELY(db->iterid != stid) { + s_critical("%s(): concurrent iteration on SDBM database \"%s\" " + "with %s from %s", + G_STRFUNC, sdbm_name(db), + thread_id_name(db->iterid), thread_name()); + errno = EPERM; + val = nullitem; + goto done; + } } +#endif /* THREADS */ + + g_assert(db->pagbno == db->blkptr); /* No page change since last time */ + + if G_UNLIKELY(0 == db->keyptr) + goto no_entry; val = getnval(db, db->pagbuf, db->keyptr); - if G_UNLIKELY(NULL == val.dptr) { - errno = ENOENT; - return nullitem; + if G_UNLIKELY(NULL == val.dptr) + goto no_entry; + +done: + sdbm_return_datum(db, val); + +no_entry: + errno = ENOENT; + val = nullitem; + goto done; +} + +/** + * Iterate on the whole database, applying supplied callback on each item. + * + * If the callback is NULL, traversal is still done to count entries. + * + * Flags can be any combination of: + * + * DBM_F_SAFE activate keycheck during iteration + * DBM_F_SKIP skip unreadable keys/values (could happen on big entries) + * + * @param db the database on which we're iterating + * @param flags operating flags, see above + * @param cb the callback to invoke on each DB entry + * @param arg additional opaque argument passed to the callback + * + * @return the amount of callback invocations made, which can be viewed as the + * current count of the database. + */ +size_t +sdbm_foreach(DBM *db, int flags, sdbm_cb_t cb, void *arg) +{ + datum key; + size_t count = 0; + + sdbm_check(db); + + sdbm_synchronize(db); + + for ( + key = (flags & DBM_F_SAFE) ? sdbm_firstkey_safe(db) : sdbm_firstkey(db); + key.dptr != NULL; + key = sdbm_nextkey(db) + ) { + const datum value = sdbm_value(db); + + if (value.dptr != NULL || 0 == (flags & DBM_F_SKIP)) { + if (cb != NULL) + (*cb)(key, value, arg); + count++; + } + } + + sdbm_unsynchronize(db); + + return count; +} + +/** + * Iterate on the whole database, applying supplied callback on each item and + * removing each entry where the callback returns TRUE. + * + * Flags can be any combination of: + * + * DBM_F_SAFE activate keycheck during iteration + * DBM_F_SKIP skip unreadable keys/values (could happen on big entries) + * + * @param db the database on which we're iterating + * @param flags operating flags, see above + * @param cb the callback to invoke on each DB entry + * @param arg additional opaque argument passed to the callback + * + * @return the amount of callback invocations made where the callback did not + * return TRUE, which can be viewed as the remaining count of the database. + */ +size_t +sdbm_foreach_remove(DBM *db, int flags, sdbm_cbr_t cb, void *arg) +{ + datum key; + size_t count = 0; + + sdbm_check(db); + g_assert(cb != NULL); + + sdbm_synchronize(db); + + for ( + key = (flags & DBM_F_SAFE) ? sdbm_firstkey_safe(db) : sdbm_firstkey(db); + key.dptr != NULL; + key = sdbm_nextkey(db) + ) { + const datum value = sdbm_value(db); + + if (value.dptr != NULL || 0 == (flags & DBM_F_SKIP)) { + if ((*cb)(key, value, arg)) { + if (0 != sdbm_deletekey(db)) { + s_critical_once_per(LOG_PERIOD_SECOND, + "%s(): sdbm \"%s\": key deletion error: %m", + G_STRFUNC, sdbm_name(db)); + } + } else { + count++; + } + } } - return val; + sdbm_unsynchronize(db); + + return count; } /** @@ -1478,14 +2340,28 @@ { ssize_t npag = 0; + sdbm_check(db); + + sdbm_synchronize(db); + + if G_UNLIKELY(db->flags & DBM_BROKEN) { + errno = ESTALE; + npag = (ssize_t) -1; + goto done; + } + #ifdef LRU npag = flush_dirtypag(db); - if G_UNLIKELY(-1 == npag) - return -1; + if G_UNLIKELY(-1 == npag) { + npag = (ssize_t) -1; + goto done; + } if (db->dirbuf_dirty) { - if G_UNLIKELY(!flush_dirbuf(db)) - return -1; + if G_UNLIKELY(!flush_dirbuf(db)) { + npag = (ssize_t) -1; + goto done; + } npag++; } #else @@ -1497,7 +2373,8 @@ npag++; #endif - return npag; +done: + sdbm_return(db, npag); } /** @@ -1505,7 +2382,7 @@ * * @return TRUE if we were able to successfully shrink the files. */ -gboolean +bool sdbm_shrink(DBM *db) { unsigned truncate_bno = 0; @@ -1513,12 +2390,22 @@ filesize_t paglen; filestat_t buf; filesize_t offset; + bool status; + + sdbm_check(db); + + sdbm_synchronize(db); + + if G_UNLIKELY(db->flags & DBM_BROKEN) { + errno = ESTALE; + goto error; + } if G_UNLIKELY(-1 == fstat(db->pagf, &buf)) - return FALSE; + goto error; if G_UNLIKELY(db->flags & DBM_RDONLY) { - g_carp("%s() called on read-only SDBM database \"%s\"", + s_critical("%s() called on read-only SDBM database \"%s\"", G_STRFUNC, sdbm_name(db)); } @@ -1572,7 +2459,7 @@ if (offset < paglen) { if (-1 == ftruncate(db->pagf, offset)) - return FALSE; + goto error; #ifdef LRU lru_discard(db, truncate_bno); #endif @@ -1583,11 +2470,11 @@ * Resize the .dir file accordingly. */ - g_assert(truncate_bno < MAX_INT_VAL(guint32)); + g_assert(truncate_bno < MAX_INT_VAL(uint32)); STATIC_ASSERT(IS_POWER_OF_2(DBM_DBLKSIZ)); { - guint32 maxdbit = truncate_bno ? next_pow2(truncate_bno) - 1 : 0; + uint32 maxdbit = truncate_bno ? next_pow2(truncate_bno) - 1 : 0; long maxsize = 1 + maxdbit / BYTESIZ; long mask = DBM_DBLKSIZ - 1; /* Rounding mask */ long filesize; @@ -1600,7 +2487,7 @@ filesize = MAX(filesize, DBM_DBLKSIZ); /* Ensure 1 block at least */ if G_UNLIKELY(-1 == fstat(db->dirf, &buf)) - return FALSE; + goto error; /* * Try to not change the mtime of the index if we don't have to. @@ -1611,7 +2498,7 @@ if (filesize < buf.st_size) { if G_UNLIKELY(-1 == ftruncate(db->dirf, filesize)) - return FALSE; + goto error; db->maxbno = filesize * BYTESIZ; } @@ -1625,7 +2512,7 @@ db->dirbno = -1; /* Discard since after our truncation point */ if G_UNLIKELY(!fetch_dirbuf(db, dirb)) - return FALSE; + goto error; g_assert(filesize - maxsize < DBM_DBLKSIZ); @@ -1638,7 +2525,7 @@ char *start = ptr_add_offset(db->dirbuf, off); char *end = ptr_add_offset(db->dirbuf, DBM_DBLKSIZ); char *p; - gboolean need_clearing = FALSE; + bool need_clearing = FALSE; g_assert(ptr_diff(end, start) == UNSIGNED(filesize - maxsize)); @@ -1663,16 +2550,442 @@ } else #endif if G_UNLIKELY(!flush_dirbuf(db)) - return FALSE; + goto error; no_idx_change: #ifdef BIGDATA if G_UNLIKELY(!big_shrink(db)) - return FALSE; + goto error; #endif - return TRUE; + status = TRUE; + +done: + sdbm_return(db, status); + +error: + status = FALSE; + goto done; +} + +/** + * Rename database files. + * + * It is an error to specified a NULL `datname' if the database was opened + * with big key/values support. + * + * Upon success, the database is transparently reopened with the new files. + * + * @param db the opened database to rename + * @param dirname new name of the .dir file + * @param pagname new name of the .pag file + * @param datname new name of the .dat file + * + * @return 0 on success, -1 on failure with errno set. + */ +int +sdbm_rename_files(DBM *db, + const char *dirname, const char *pagname, const char *datname) +{ + int openflags, error = 0, status; + bool dat_opened, dat_reopened; + + if G_UNLIKELY(db == NULL) { + errno = EINVAL; + return -1; + } + sdbm_check(db); + + sdbm_synchronize(db); + + if G_UNLIKELY(db->flags & DBM_BROKEN) { + errno = ESTALE; + goto error; + } + +#ifdef BIGDATA + if (NULL == datname && NULL != db->datname) { + errno = EINVAL; + goto error; + } +#endif + + /* + * Clear the O_TRUNC, O_EXCL and O_CREAT flags. + */ + + openflags = db->openflags & ~(O_TRUNC | O_EXCL | O_CREAT); + + /* + * We're not going to flush the LRU cache or the buffers but simply + * close the files, rename them and reopen them immediately afterwards. + * + * If any of the rename fails or we cannot re-open the new file, then + * we undo the renaming and try to reopen the original files. + */ + + fd_forget_and_close(&db->dirf); + fd_forget_and_close(&db->pagf); + +#ifdef BIGDATA + dat_opened = big_close(db); +#else + dat_opened = FALSE; +#endif + + if (-1 == rename(db->dirname, dirname)) { + error = errno; + s_critical("sdbm: \"%s\": cannot rename \"%s\" as \"%s\": %m", + sdbm_name(db), db->dirname, dirname); + goto emergency_restore; + } + + if (-1 == rename(db->pagname, pagname)) { + error = errno; + s_critical("sdbm: \"%s\": cannot rename \"%s\" as \"%s\": %m", + sdbm_name(db), db->pagname, pagname); + if (-1 == rename(dirname, db->dirname)) { + s_warning("sdbm: \"%s\": cannot rename \"%s\" back to \"%s\": %m", + sdbm_name(db), dirname, db->dirname); + db->flags |= DBM_BROKEN; + } + goto emergency_restore; + } + + if (NULL == datname || !dat_opened) + goto rename_ok; + + if (-1 == rename(db->datname, datname)) { + error = errno; + s_critical("sdbm: \"%s\": cannot rename \"%s\" as \"%s\": %m", + sdbm_name(db), db->datname, datname); + if (-1 == rename(dirname, db->dirname)) { + s_warning("sdbm: \"%s\": cannot rename \"%s\" back to \"%s\": %m", + sdbm_name(db), dirname, db->dirname); + db->flags |= DBM_BROKEN; + } + if (-1 == rename(pagname, db->pagname)) { + s_warning("sdbm: \"%s\": cannot rename \"%s\" back to \"%s\": %m", + sdbm_name(db), pagname, db->pagname); + db->flags |= DBM_BROKEN; + } + goto emergency_restore; + } + +rename_ok: + + /* + * Renaming of files was OK. + */ + + HFREE_NULL(db->dirname); + HFREE_NULL(db->pagname); + HFREE_NULL(db->datname); + + db->dirname = h_strdup(dirname); + db->pagname = h_strdup(pagname); + db->datname = h_strdup(datname); + + /* FALL THROUGH */ + +emergency_restore: + if (db->flags & DBM_BROKEN) + goto done; + + db->pagf = file_open(db->pagname, openflags, 0); + if (-1 == db->pagf) { + error = errno; + db->flags |= DBM_BROKEN; + goto done; + } + db->dirf = file_open(db->dirname, openflags, 0); + if (-1 == db->dirf) { + error = errno; + db->flags |= DBM_BROKEN; + goto done; + } +#ifdef BIGDATA + dat_reopened = !dat_opened || -1 != big_reopen(db); +#else + dat_reopened = TRUE; +#endif + + if (!dat_reopened) { + error = errno; + db->flags |= DBM_BROKEN; + } + + /* FALL THROUGH */ + +done: + if (error != 0) { + errno = error; + s_carp("sdbm: \"%s\": renaming operation %s: %m", + sdbm_name(db), + (db->flags & DBM_BROKEN) ? "broke database" : "failed"); + status = -1; + } else { + status = 0; + } + +finished: + sdbm_return(db, status); + +error: + status = -1; + goto finished; +} + +/** + * Rename database files. + * + * Upon success, the database is transparently reopened with the new files. + * + * @param db the opened database to rename + * @param base the base path for the .dir, .pag and .dat files. + * + * @return 0 on success, -1 on failure with errno set. + */ +int +sdbm_rename(DBM *db, const char *base) +{ + int result = -1; + char *dirname = NULL; + char *pagname = NULL; + char *datname = NULL; + bool warned = FALSE; + + if G_UNLIKELY(db == NULL) { + errno = EINVAL; + return -1; + } + + if (base == NULL || '\0' == base0) { + errno = EINVAL; + return -1; + } + + sdbm_check(db); + + sdbm_synchronize(db); + + if G_UNLIKELY(db->flags & DBM_BROKEN) { + errno = ESTALE; + goto error; + } + +#ifdef BIGDATA + if (db->datname != NULL) { + datname = h_strconcat(base, DBM_DATFEXT, NULL_PTR); + if (NULL == pagname) { + errno = ENOMEM; + goto error; + } + } +#endif + + dirname = h_strconcat(base, DBM_DIRFEXT, NULL_PTR); + if (NULL == dirname) { + errno = ENOMEM; + goto error; + } + pagname = h_strconcat(base, DBM_PAGFEXT, NULL_PTR); + if (NULL == pagname) { + errno = ENOMEM; + goto error; + } + + if (-1 == sdbm_rename_files(db, dirname, pagname, datname)) { + warned = TRUE; + goto error; + } + + result = 0; /* Operation successful! */ + + /* FALL THROUGH */ + +error: + HFREE_NULL(dirname); + HFREE_NULL(pagname); + HFREE_NULL(datname); + + if (result != 0 && !warned) { + s_critical("sdbm: \"%s\": renaming operation failed: %m", + sdbm_name(db)); + } + + sdbm_return(db, result); +} + +/** + * Rebuild database from scratch, thereby compacting it on disk since only + * the required pages will be allocated. + * + * @return 0 if OK, -1 on failure. + */ +int +sdbm_rebuild(DBM *db) +{ + DBM *ndb; + char ext10; + char *dirname, *pagname, *datname; + int error = 0, result; + long cache; + datum key; + unsigned items = 0, skipped = 0, duplicate = 0; + + sdbm_check(db); + + sdbm_synchronize(db); + + if (sdbm_rdonly(db)) { + errno = EPERM; + goto failed; + } + if (sdbm_error(db)) { + errno = EIO; /* Already got an error reported */ + goto failed; + } + if (db->flags & DBM_ITERATING) { + errno = EBUSY; /* Already iterating */ + goto failed; + } + if G_UNLIKELY(db->flags & DBM_BROKEN) { + errno = ESTALE; /* Already broken handle */ + goto failed; + } + + str_bprintf(ext, sizeof ext, ".%08x", random_u32()); + dirname = h_strconcat(db->dirname, ext, (void *) 0); + pagname = h_strconcat(db->pagname, ext, (void *) 0); + datname = NULL == db->datname ? NULL : + h_strconcat(db->datname, ext, (void *) 0); + + ndb = sdbm_prep(dirname, pagname, datname, + db->openflags | O_CREAT | O_EXCL, db->openmode); + + if (NULL == ndb) { + error = errno; + goto error; + } + + /* + * Propagates attributes to the new database: cache size, write delay, + * volatile status. + */ + + sdbm_set_name(ndb, db->name); + cache = sdbm_get_cache(db); + + if (sdbm_is_volatile(db)) sdbm_set_volatile(ndb, TRUE); + if (sdbm_get_wdelay(db)) sdbm_set_wdelay(ndb, TRUE); + if (cache != 0) sdbm_set_cache(ndb, cache); + + /* + * Copy all the keys/values from the database to the new database. + */ + + for (key = sdbm_firstkey_safe(db); key.dptr; key = sdbm_nextkey(db)) { + datum value = sdbm_value(db); + + items++; + + if (NULL == value.dptr) { + if (sdbm_error(db)) + sdbm_clearerr(db); + skipped++; /* Unreadable value skipped */ + continue; + } + + if (0 != sdbm_store(ndb, key, value, DBM_INSERT)) { + if (sdbm_error(db)) + sdbm_clearerr(db); + if (EEXIST == errno) { + /* Duplicate key, that's bad, but we can survive */ + duplicate++; + skipped++; + continue; + } + /* Other errors are fatal */ + error = errno; + sdbm_endkey(db); /* Finish iteration */ + break; + } + } + + if (error != 0) + goto error; + + /* + * At this point, the database was successfully copied over. + */ + + HFREE_NULL(dirname); + HFREE_NULL(pagname); + HFREE_NULL(datname); + + dirname = h_strdup(db->dirname); + pagname = h_strdup(db->pagname); + datname = h_strdup(db->datname); + +#ifdef THREADS + ndb->lock = db->lock; +#endif + sdbm_close_internal(db, TRUE, FALSE); /* Keep object around */ + *db = *ndb; /* struct copy */ +#ifdef THREADS + ndb->lock = NULL; /* was copied over */ +#endif + sdbm_free_null(&ndb); + + /* + * The original object is now the new database, we only need to rename + * the files to let the rebuilt database be fully operational. + */ + + if (-1 == sdbm_rename_files(db, dirname, pagname, datname)) + error = errno; + + /* FALL THROUGH */ + +error: + HFREE_NULL(dirname); + HFREE_NULL(pagname); + HFREE_NULL(datname); + + if (ndb != NULL) { + sdbm_unlink(ndb); + } + + if (0 != error) { + errno = error; + goto failed; + } + + /* + * Loudly warn if we skipped some values during the rebuilding process. + * + * The values we skipped were unreadable, corrupted, or otherwise not + * something we could repair, so there was no point in refusing to + * rebuild the database. + */ + + if (skipped != 0) { + s_critical("sdbm: \"%s\": had to skip %u/%u item%s (%u duplicate%s)" + " during rebuild", + sdbm_name(db), skipped, items, 1 == skipped ? "" : "s", + duplicate, 1 == duplicate ? "" : "s"); + } + + result = 0; /* OK, we rebuilt the database */ + +done: + sdbm_return(db, result); + +failed: + result = -1; + goto done; } /** @@ -1683,20 +2996,30 @@ int sdbm_clear(DBM *db) { + int result; + if G_UNLIKELY(db == NULL) { errno = EINVAL; return -1; } + sdbm_check(db); + + sdbm_synchronize(db); + if G_UNLIKELY(db->flags & DBM_RDONLY) { errno = EPERM; - return -1; + goto error; + } + if G_UNLIKELY(db->flags & DBM_BROKEN) { + errno = ESTALE; + goto error; } if G_UNLIKELY(-1 == ftruncate(db->pagf, 0)) - return -1; + goto error; db->pagbno = -1; db->pagtail = 0L; if G_UNLIKELY(-1 == ftruncate(db->dirf, 0)) - return -1; + goto error; db->dirbno = -1; db->maxbno = 0; db->curbit = 0; @@ -1709,9 +3032,37 @@ sdbm_clearerr(db); #ifdef BIGDATA if G_UNLIKELY(!big_clear(db)) - return -1; + goto error; +#endif + result = 0; + +done: + sdbm_return(db, result); + +error: + result = -1; + goto done; +} + +/** + * @return the amount of pages configured for the LRU cache. + */ +long +sdbm_get_cache(const DBM *db) +{ + long pages; + + sdbm_check(db); + + sdbm_synchronize(db); + +#ifdef LRU + pages = getcache(db); +#else + pages = 0; #endif - return 0; + + sdbm_return(db, pages); } /** @@ -1720,30 +3071,88 @@ int sdbm_set_cache(DBM *db, long pages) { + int result; + + sdbm_check(db); + + sdbm_synchronize(db); + #ifdef LRU - return setcache(db, pages); + if G_UNLIKELY(NULL == db->cache) + lru_init(db); + result = setcache(db, pages); #else - (void) db; (void) pages; errno = ENOTSUP; - return -1; + result = -1; +#endif + + sdbm_return(db, result); +} + +/** + * @return whether LRU write delay is enabled. + */ +bool +sdbm_get_wdelay(const DBM *db) +{ + bool delayed; + + sdbm_check(db); + + sdbm_synchronize(db); + +#ifdef LRU + delayed = getwdelay(db); +#else + delayed = FALSE; #endif + + sdbm_return(db, delayed); } /** * Turn LRU write delays on or off. */ int -sdbm_set_wdelay(DBM *db, gboolean on) +sdbm_set_wdelay(DBM *db, bool on) { + int result; + + sdbm_check(db); + + sdbm_synchronize(db); + #ifdef LRU - return setwdelay(db, on); + result = setwdelay(db, on); #else - (void) db; (void) on; errno = ENOTSUP; - return -1; + result = -1; #endif + + sdbm_return(db, result); +} + +/** + * @return whether database was flagged as "volatile". + */ +bool +sdbm_is_volatile(const DBM *db) +{ + bool result; + + sdbm_check(db); + + sdbm_synchronize(db); + +#ifdef LRU + result = db->is_volatile; +#else + result = FALSE; +#endif + + sdbm_return(db, result); } /** @@ -1752,58 +3161,113 @@ * As a convenience, also turns delayed writes on if the argument is TRUE. */ int -sdbm_set_volatile(DBM *db, gboolean yes) +sdbm_set_volatile(DBM *db, bool yes) { + int result; + + sdbm_check(db); + + sdbm_synchronize(db); + #ifdef LRU db->is_volatile = yes; - if (yes) - return setwdelay(db, TRUE); + result = yes ? setwdelay(db, TRUE) : 0; #else - (void) db; (void) yes; + result = 0; #endif - return 0; + + sdbm_return(db, result); } -gboolean -sdbm_rdonly(DBM *db) +bool +sdbm_rdonly(const DBM *db) { - return 0 != (db->flags & DBM_RDONLY); + bool rdonly; + + sdbm_check(db); + + sdbm_synchronize(db); + rdonly = 0 != (db->flags & DBM_RDONLY); + sdbm_return(db, rdonly); } -gboolean -sdbm_error(DBM *db) +bool +sdbm_error(const DBM *db) { - return 0 != (db->flags & (DBM_IOERR | DBM_IOERR_W)); + bool error; + + sdbm_check(db); + + sdbm_synchronize(db); + error = 0 != (db->flags & (DBM_IOERR | DBM_IOERR_W)); + sdbm_return(db, error); } void sdbm_clearerr(DBM *db) { + sdbm_check(db); + + sdbm_synchronize(db); db->flags &= ~(DBM_IOERR | DBM_IOERR_W); + sdbm_unsynchronize(db); } int sdbm_dirfno(DBM *db) { - return db->dirf; + int fno; + + sdbm_check(db); + + sdbm_synchronize(db); + + if G_UNLIKELY(db->flags & DBM_BROKEN) + fno = -1; + else + fno = db->dirf; + + sdbm_return(db, fno); } int sdbm_pagfno(DBM *db) { - return db->pagf; + int fno; + + sdbm_check(db); + + sdbm_synchronize(db); + + if G_UNLIKELY(db->flags & DBM_BROKEN) + fno = -1; + else + fno = db->pagf; + + sdbm_return(db, fno); } int sdbm_datfno(DBM *db) { + int fno; + + sdbm_check(db); + + sdbm_synchronize(db); + #ifdef BIGDATA - return big_datfno(db); + if G_UNLIKELY(db->flags & DBM_BROKEN) { + fno = -1; + } else { + fno = big_datfno(db); + } #else - (void) db; - return -1; + fno = -1; #endif + + sdbm_return(db, fno); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/sdbm.h -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/sdbm.h
Changed
@@ -2,7 +2,7 @@ * sdbm - ndbm work-alike hashed database library * based on Per-Ake Larson's Dynamic Hashing algorithms. BIT 18 (1978). * author: oz@nexus.yorku.ca - * status: public domain. + * status: public domain. */ #ifndef _sdbm_h_ @@ -24,6 +24,7 @@ #define DBM_IOERR_W (1 << 2) /* data base write I/O error */ #define DBM_KEYCHECK (1 << 3) /* safe mode during iteration */ #define DBM_ITERATING (1 << 4) /* within an iteration */ +#define DBM_BROKEN (1 << 5) /* broken database, do not use */ typedef struct { char *dptr; @@ -39,6 +40,15 @@ #define DBM_REPLACE 1 /* + * flags to sdbm_*foreach() and sdbm_*foreach_remove(). + */ +#define DBM_F_SAFE (1 << 1) /* activate keycheck during iteration */ +#define DBM_F_SKIP (1 << 2) /* skip unreadable keys/values */ + +typedef void (*sdbm_cb_t)(const datum key, const datum value, void *arg); +typedef bool (*sdbm_cbr_t)(const datum key, const datum value, void *arg); + +/* * ndbm interface */ DBM *sdbm_open(const char *, int, int); @@ -46,10 +56,11 @@ datum sdbm_fetch(DBM *, datum); int sdbm_delete(DBM *, datum); int sdbm_store(DBM *, datum, datum, int); -int sdbm_replace(DBM *, datum, datum, gboolean *); +int sdbm_replace(DBM *, datum, datum, bool *); datum sdbm_firstkey(DBM *); datum sdbm_firstkey_safe(DBM *); datum sdbm_nextkey(DBM *); +void sdbm_endkey(DBM *); datum sdbm_value(DBM *); int sdbm_deletekey(DBM *); int sdbm_exists(DBM *, datum); @@ -58,28 +69,44 @@ * other */ DBM *sdbm_prep(const char *, const char *, const char *, int, int); -long sdbm_hash(const char *, size_t) G_GNUC_PURE; -gboolean sdbm_rdonly(DBM *); -gboolean sdbm_error(DBM *); +long sdbm_hash(const char *, size_t) G_PURE; +bool sdbm_rdonly(const DBM *); +bool sdbm_error(const DBM *); void sdbm_clearerr(DBM *); int sdbm_dirfno(DBM *); int sdbm_pagfno(DBM *); int sdbm_datfno(DBM *); -gboolean sdbm_is_storable(size_t, size_t); +bool sdbm_is_storable(size_t, size_t); void sdbm_set_name(DBM *, const char *); -const char *sdbm_name(DBM *); +const char *sdbm_name(const DBM *); ssize_t sdbm_sync(DBM *); int sdbm_set_cache(DBM *db, long pages); -int sdbm_set_wdelay(DBM *db, gboolean on); -int sdbm_set_volatile(DBM *db, gboolean yes); -gboolean sdbm_shrink(DBM *db); +long sdbm_get_cache(const DBM *) G_PURE; +int sdbm_set_wdelay(DBM *db, bool on); +bool sdbm_get_wdelay(const DBM *) G_PURE; +int sdbm_set_volatile(DBM *db, bool yes); +bool sdbm_is_volatile(const DBM *) G_PURE; +bool sdbm_shrink(DBM *db); int sdbm_clear(DBM *db); +void sdbm_unlink(DBM *); +int sdbm_rename(DBM *, const char *); +int sdbm_rename_files(DBM *, const char *, const char *, const char *); +int sdbm_rebuild(DBM *); +size_t sdbm_foreach(DBM *db, int flags, sdbm_cb_t cb, void *arg); +size_t sdbm_foreach_remove(DBM *db, int flags, sdbm_cbr_t cb, void *arg); + +/* + * only defined if compiled with THREADS set in "tune.h". + */ +void sdbm_thread_safe(DBM *db); +void sdbm_lock(DBM *db); +void sdbm_unlock(DBM *db); /* * Internal routines with clean semantics that can be used by user code. * These are not documented. */ -gboolean sdbm_internal_chkpage(const char *); +bool sdbm_internal_chkpage(const char *); #endif /* _sdbm_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/tune.h -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/tune.h
Changed
@@ -14,6 +14,7 @@ #define LRU /* use LRU cache for pages */ #define LRU_PAGES 64 /* default amount of pages in LRU cache */ #define BIGDATA /* can store large keys/values */ +#define THREADS /* thread-safe */ /* * misc
View file
gtk-gnutella-0.98.2.tar.bz2/src/sdbm/util.c -> gtk-gnutella-1.1.9.tar.bz2/src/sdbm/util.c
Changed
@@ -1,17 +1,18 @@ #include "common.h" -G_GNUC_PRINTF(1, 2) void +#include "lib/progname.h" + +void G_PRINTF(1, 2) oops(char *fmt, ...) { va_list args; - extern char *progname; - if (progname) - fprintf(stderr, "%s: ", progname); + fprintf(stderr, "%s: ", getprogname()); va_start(args, fmt); vfprintf(stderr, fmt, args); - fprintf(stderr, " (%s)", strerror(errno)); + if (errno != 0) + fprintf(stderr, " (%s)", strerror(errno)); fprintf(stderr, "\n"); exit(1); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/Jmakefile -> gtk-gnutella-1.1.9.tar.bz2/src/shell/Jmakefile
Changed
@@ -36,6 +36,7 @@ help.c \ horizon.c \ intr.c \ + lib.c \ log.c \ memory.c \ node.c \ @@ -46,6 +47,7 @@ print.c \ props.c \ quit.c \ + random.c \ rescan.c \ search.c \ set.c \ @@ -53,6 +55,8 @@ shutdown.c \ stats.c \ status.c \ + task.c \ + thread.c \ uploads.c \ version.c \ whatis.c
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/src/shell/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-104 -: $X-Id: Jmake.tmpl 69 2011-01-09 13:57:07Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -39,7 +39,7 @@ AR = ar rc CC = $cc CTAGS = ctags -JCFLAGS = \$(CFLAGS) $optimize $ccflags $large +JCFLAGS = \$(CFLAGS) $optimize $pthread $ccflags $large JCPPFLAGS = $cppflags MKDEP = $mkdep \$(DPFLAGS) \$(JCPPFLAGS) -- MV = $mv @@ -66,7 +66,7 @@ $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 99 2011-11-05 13:27:37Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Force 'make depend' to be performed first -- do not edit @@ -89,6 +89,7 @@ help.c \ horizon.c \ intr.c \ + lib.c \ log.c \ memory.c \ node.c \ @@ -99,6 +100,7 @@ print.c \ props.c \ quit.c \ + random.c \ rescan.c \ search.c \ set.c \ @@ -106,6 +108,8 @@ shutdown.c \ stats.c \ status.c \ + task.c \ + thread.c \ uploads.c \ version.c \ whatis.c @@ -119,6 +123,7 @@ help.o \ horizon.o \ intr.o \ + lib.o \ log.o \ memory.o \ node.o \ @@ -129,6 +134,7 @@ print.o \ props.o \ quit.o \ + random.o \ rescan.o \ search.o \ set.o \ @@ -136,6 +142,8 @@ shutdown.o \ stats.o \ status.o \ + task.o \ + thread.o \ uploads.o \ version.o \ whatis.o @@ -202,6 +210,11 @@ $(RM) Makefile config.sh install:: local_install + @exit 0 + +install-strip:: local_install-strip + @exit 0 + install.man:: maybe_install.man deinstall:: local_deinstall deinstall.man:: maybe_deinstall.man @@ -240,6 +253,9 @@ local_install:: @echo "install in $(CURRENT) done." +local_install-strip:: + @echo "install (strip) in $(CURRENT) done." + local_deinstall:: @echo "deinstall in $(CURRENT) done."
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/cmd.h -> gtk-gnutella-1.1.9.tar.bz2/src/shell/cmd.h
Changed
@@ -29,11 +29,13 @@ #include "shell.h" #include "lib/options.h" +#include "lib/prop.h" /* The interface */ enum shell_reply { REPLY_NONE = 0, + REPLY_ASYNC = 1, REPLY_READY = 100, REPLY_ERROR = 400, REPLY_BYE = 900 @@ -47,19 +49,22 @@ void shell_check(const struct gnutella_shell *); void shell_set_msg(struct gnutella_shell *, const char *); void shell_set_formatted(struct gnutella_shell *, const char *, ...) - G_GNUC_PRINTF(2, 3); + G_PRINTF(2, 3); void shell_write(struct gnutella_shell *, const char *); void shell_write_line(struct gnutella_shell *, int code, const char *); +void shell_write_lines(struct gnutella_shell *, int code, const char *); void shell_write_linef(struct gnutella_shell *, int code, const char *, ...) - G_GNUC_PRINTF(3, 4); -void shell_shutdown(struct gnutella_shell *); -gboolean shell_toggle_interactive(struct gnutella_shell *); -guint64 shell_line_count(struct gnutella_shell *); -gboolean shell_request_library_rescan(void); + G_PRINTF(3, 4); +void shell_exit(struct gnutella_shell *); +bool shell_toggle_interactive(struct gnutella_shell *); +uint64 shell_line_count(struct gnutella_shell *); +bool shell_request_library_rescan(void); int shell_options_parse(struct gnutella_shell *, const char *argv, const option_t *ovec, int ovcnt); +const char *shell_property_to_string(property_t prop); + /* Implemented commands */ #define SHELL_EXEC_PROTO(name) \ @@ -72,7 +77,7 @@ #define SHELL_SUMMARY_PROTO(name) \ const char *shell_summary_ ## name (void) -#define SHELL_CMD(name) \ +#define SHELL_CMD(name,t) \ SHELL_EXEC_PROTO(name); \ SHELL_HELP_PROTO(name); \ SHELL_SUMMARY_PROTO(name);
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/cmd.inc -> gtk-gnutella-1.1.9.tar.bz2/src/shell/cmd.inc
Changed
@@ -6,30 +6,36 @@ * ls *.c | grep -v shell.c | sed 's,^\(.*\).c,SHELL_CMD(\1),' */ -SHELL_CMD(command) -SHELL_CMD(date) -SHELL_CMD(download) -SHELL_CMD(downloads) -SHELL_CMD(echo) -SHELL_CMD(help) -SHELL_CMD(horizon) -SHELL_CMD(intr) -SHELL_CMD(log) -SHELL_CMD(memory) -SHELL_CMD(node) -SHELL_CMD(nodes) -SHELL_CMD(offline) -SHELL_CMD(online) -SHELL_CMD(pid) -SHELL_CMD(print) -SHELL_CMD(props) -SHELL_CMD(quit) -SHELL_CMD(rescan) -SHELL_CMD(search) -SHELL_CMD(set) -SHELL_CMD(shutdown) -SHELL_CMD(stats) -SHELL_CMD(status) -SHELL_CMD(uploads) -SHELL_CMD(version) -SHELL_CMD(whatis) +/* Name Multi-threaded? */ + +SHELL_CMD(command, FALSE) +SHELL_CMD(date, FALSE) +SHELL_CMD(download, FALSE) +SHELL_CMD(downloads, FALSE) +SHELL_CMD(echo, FALSE) +SHELL_CMD(help, FALSE) +SHELL_CMD(horizon, FALSE) +SHELL_CMD(intr, FALSE) +SHELL_CMD(lib, TRUE) +SHELL_CMD(log, FALSE) +SHELL_CMD(memory, TRUE) +SHELL_CMD(node, FALSE) +SHELL_CMD(nodes, FALSE) +SHELL_CMD(offline, FALSE) +SHELL_CMD(online, FALSE) +SHELL_CMD(pid, FALSE) +SHELL_CMD(print, TRUE) +SHELL_CMD(props, TRUE) +SHELL_CMD(quit, FALSE) +SHELL_CMD(random, TRUE) +SHELL_CMD(rescan, FALSE) +SHELL_CMD(search, FALSE) +SHELL_CMD(set, FALSE) +SHELL_CMD(shutdown, FALSE) +SHELL_CMD(stats, TRUE) +SHELL_CMD(status, FALSE) +SHELL_CMD(task, TRUE) +SHELL_CMD(thread, TRUE) +SHELL_CMD(uploads, FALSE) +SHELL_CMD(version, FALSE) +SHELL_CMD(whatis, TRUE)
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/download.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/download.c
Changed
@@ -37,7 +37,7 @@ #include "core/downloads.h" -#include "if/bridge/ui2c.h" +#include "if/core/fileinfo.h" #include "lib/ascii.h" #include "lib/glib-missing.h" @@ -52,7 +52,7 @@ int argc, const char *argv) { const char *url; - gboolean success; + bool success; shell_check(sh); g_assert(argv); @@ -291,8 +291,8 @@ goto error; } - info = guc_fi_get_info(fi->fi_handle); - guc_fi_get_status(fi->fi_handle, &status); + info = fi_get_info(fi->fi_handle); + fi_get_status(fi->fi_handle, &status); for (i = 3; i < argc; i++) { property = argvi; @@ -341,7 +341,7 @@ HFREE_NULL(magnet); } } - guc_fi_free_info(info); + fi_free_info(info); return REPLY_READY; error: @@ -356,11 +356,13 @@ shell_check(sh); - info = guc_fi_get_info(handle); + info = fi_get_info(handle); g_return_if_fail(info); shell_write(sh, guid_to_string(info->guid)); shell_write(sh, "\n"); /* Terminate line */ + + fi_free_info(info); } static enum shell_reply @@ -401,7 +403,7 @@ CMD(rename); CMD(show); #undef CMD - + shell_set_msg(sh, _("Unknown operation")); goto error;
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/downloads.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/downloads.c
Changed
@@ -38,6 +38,7 @@ #include "core/downloads.h" #include "lib/parse.h" +#include "lib/str.h" #include "lib/stringify.h" #include "if/bridge/ui2c.h" @@ -61,30 +62,30 @@ g_return_if_fail(info); guc_fi_get_status(handle, &status); - gm_snprintf(buf, sizeof buf, "ID: %s", guid_to_string(info->guid)); + str_bprintf(buf, sizeof buf, "ID: %s", guid_to_string(info->guid)); shell_write(sh, buf); shell_write(sh, "\n"); /* Terminate line */ - gm_snprintf(buf, sizeof buf, "Filename: \"%s\"", info->filename); + str_bprintf(buf, sizeof buf, "Filename: \"%s\"", info->filename); shell_write(sh, buf); shell_write(sh, "\n"); /* Terminate line */ - gm_snprintf(buf, sizeof buf, "Hash: %s", + str_bprintf(buf, sizeof buf, "Hash: %s", info->sha1 ? sha1_to_urn_string(info->sha1) : "<none>"); shell_write(sh, buf); shell_write(sh, "\n"); /* Terminate line */ - gm_snprintf(buf, sizeof buf, "Status: %s", + str_bprintf(buf, sizeof buf, "Status: %s", file_info_status_to_string(&status)); shell_write(sh, buf); shell_write(sh, "\n"); /* Terminate line */ - gm_snprintf(buf, sizeof buf, "Size: %s", + str_bprintf(buf, sizeof buf, "Size: %s", compact_size(status.size, GNET_PROPERTY(display_metric_units))); shell_write(sh, buf); shell_write(sh, "\n"); /* Terminate line */ - gm_snprintf(buf, sizeof buf, "Done: %u%% (%s)", + str_bprintf(buf, sizeof buf, "Done: %u%% (%s)", filesize_per_100(status.size, status.done), compact_size(status.done, GNET_PROPERTY(display_metric_units))); shell_write(sh, buf);
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/help.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/help.c
Changed
@@ -48,19 +48,19 @@ }; static const struct shell_cmd_help commands = { -#define SHELL_CMD(x) { #x, &shell_summary_ ## x, &shell_help_ ## x }, +#define SHELL_CMD(x,t) { #x, &shell_summary_ ## x, &shell_help_ ## x }, #include "cmd.inc" #undef SHELL_CMD }; -static const struct shell_cmd_help * +static const struct shell_cmd_help * shell_cmd_lookup(const char *argv0) { size_t i; g_return_val_if_fail(argv0, NULL); - for (i = 0; i < G_N_ELEMENTS(commands); i++) { + for (i = 0; i < N_ITEMS(commands); i++) { if (0 == ascii_strcasecmp(commandsi.name, argv0)) return &commandsi; } @@ -107,7 +107,7 @@ "Use \"help <cmd>\" for additional help about a command.\n"); shell_write(sh, "The following commands are available:\n"); - for (i = 0; i < G_N_ELEMENTS(commands); i++) { + for (i = 0; i < N_ITEMS(commands); i++) { const char *name = commandsi.name; if (NULL == name || '\0' == name0)
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/horizon.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/horizon.c
Changed
@@ -40,7 +40,8 @@ #include "if/gnet_property_priv.h" -#include "lib/glib-missing.h" +#include "lib/pslist.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/tm.h" #include "lib/utf8.h" @@ -111,7 +112,7 @@ maxlenm = n; } - gm_snprintf(buf, sizeof buf, "%*s %*s %*s %*s\n", + str_bprintf(buf, sizeof buf, "%*s %*s %*s %*s\n", (int) maxlen0, hops_str, (int) maxlen1, nodes_str, (int) maxlen2, files_str, @@ -134,7 +135,7 @@ s3 = short_kb_size(tiHSEP_IDX_KIB + non_hsepHSEP_IDX_KIB, GNET_PROPERTY(display_metric_units)); - gm_snprintf(buf, sizeof buf, "%*u %*s %*s %*s\n", + str_bprintf(buf, sizeof buf, "%*u %*s %*s %*s\n", (int) maxlen0, (unsigned) (i + 1), (int) maxlen1, s1, (int) maxlen2, s2, @@ -165,18 +166,18 @@ g_assert(argv); g_assert(argc > 0); - parsed = shell_options_parse(sh, argv, options, G_N_ELEMENTS(options)); + parsed = shell_options_parse(sh, argv, options, N_ITEMS(options)); if (parsed < 0) return REPLY_ERROR; shell_write(sh, "100~\n"); - hsep_get_global_table(globaltable, G_N_ELEMENTS(globaltable)); + hsep_get_global_table(globaltable, N_ITEMS(globaltable)); hsep_get_non_hsep_triple(non_hsep); num_hsep = globaltable1HSEP_IDX_NODES; num_total = globaltable1HSEP_IDX_NODES + non_hsep0HSEP_IDX_NODES; - gm_snprintf(buf, sizeof buf, + str_bprintf(buf, sizeof buf, _("Total horizon size (%u/%u nodes support HSEP):"), num_hsep, num_total); @@ -186,18 +187,18 @@ print_hsep_table(sh, globaltable, HSEP_N_MAX, non_hsep); if (all) { - const GSList *sl; + const pslist_t *sl; hsep_triple tableHSEP_N_MAX + 1; - for (sl = node_all_nodes(); sl; sl = g_slist_next(sl)) { - const struct gnutella_node *n = sl->data; + PSLIST_FOREACH(node_all_gnet_nodes(), sl) { + const gnutella_node_t *n = sl->data; if ((!NODE_IS_ESTABLISHED(n)) || !(n->attrs & NODE_A_CAN_HSEP)) continue; shell_write(sh, "\n"); - gm_snprintf(buf, sizeof buf, + str_bprintf(buf, sizeof buf, _("Horizon size via HSEP node %s (%s):"), node_addr(n), node_peermode_to_string(n->peermode)); @@ -205,7 +206,7 @@ shell_write(sh, buf); shell_write(sh, "\n\n"); - hsep_get_connection_table(n, table, G_N_ELEMENTS(table)); + hsep_get_connection_table(n, table, N_ITEMS(table)); print_hsep_table(sh, table, NODE_IS_LEAF(n) ? 1 : HSEP_N_MAX, NULL); } }
View file
gtk-gnutella-1.1.9.tar.bz2/src/shell/lib.c
Added
@@ -0,0 +1,322 @@ +/* + * Copyright (c) 2013 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup shell + * @file + * + * The "lib" command. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#include "cmd.h" + +#include "lib/ascii.h" +#include "lib/cq.h" +#include "lib/file_object.h" +#include "lib/hset.h" +#include "lib/misc.h" +#include "lib/pow2.h" +#include "lib/pslist.h" +#include "lib/str.h" +#include "lib/stringify.h" +#include "lib/tm.h" + +#include "lib/override.h" /* Must be the last header included */ + +static enum shell_reply +shell_exec_lib_show_callout(struct gnutella_shell *sh, + int argc, const char *argv) +{ + pslist_t *info, *sl; + str_t *s; + size_t maxlen = 0; + + shell_check(sh); + g_assert(argv); + g_assert(argc > 0); + + shell_write(sh, "100~\n"); + shell_write(sh, + "T Events Per. Idle Last Period Heartbeat Triggered Name (Parent)" + "\n"); + + info = cq_info_list(); + s = str_new(80); + + PSLIST_FOREACH(info, sl) { + cq_info_t *cqi = sl->data; + size_t len; + + cq_info_check(cqi); + + len = strlen(cqi->name); + maxlen = MAX(len, maxlen); + } + + PSLIST_FOREACH(info, sl) { + cq_info_t *cqi = sl->data; + + cq_info_check(cqi); + + if (THREAD_INVALID_ID == cqi->stid) + str_printf(s, "%-2s ", "-"); + else + str_printf(s, "%-2d ", cqi->stid); + str_catf(s, "%-6zu ", cqi->event_count); + str_catf(s, "%-4zu ", cqi->periodic_count); + str_catf(s, "%-4zu ", cqi->idle_count); + str_catf(s, "%-5s ", + 0 == cqi->last_idle ? + "-" : compact_time(delta_time(tm_time(), cqi->last_idle))); + str_catf(s, "%'6d ", cqi->period); + str_catf(s, "%10zu ", cqi->heartbeat_count); + str_catf(s, "%10zu ", cqi->triggered_count); + str_catf(s, "\"%s\"%*s", cqi->name, + (int) (maxlen - strlen(cqi->name)), ""); + if (cqi->parent != NULL) + str_catf(s, " (%s)", cqi->parent); + str_putc(s, '\n'); + shell_write(sh, str_2c(s)); + } + + str_destroy_null(&s); + cq_info_list_free_null(&info); + shell_write(sh, ".\n"); + + return REPLY_READY; +} + +static enum shell_reply +shell_exec_lib_show_files(struct gnutella_shell *sh, + int argc, const char *argv) +{ + const char *opt_w, *opt_u; + const option_t options = { + { "u", &opt_u }, + { "w", &opt_w }, + }; + int parsed; + pslist_t *info, *sl; + str_t *s, *f; + size_t maxlen = 0; + hset_t *seen = NULL; + + shell_check(sh); + g_assert(argv); + g_assert(argc > 0); + + parsed = shell_options_parse(sh, argv, options, N_ITEMS(options)); + if (parsed < 0) + return REPLY_ERROR; + + info = file_object_info_list(); + s = str_new(80); + + /* + * When they supply -u, we remove the display of the file mode (since + * we could have several entries for the same file) and the location, + * to only print the reference count and the pathname. + */ + + if (opt_u != NULL) { + opt_w = NULL; /* -u disables -w */ + seen = hset_create(HASH_KEY_STRING, 0); + } + + /* + * Compute how much room we need to display the opening locations. + */ + + if (opt_w != NULL) { + PSLIST_FOREACH(info, sl) { + file_object_info_t *foi = sl->data; + size_t len; + const char *p; + + file_object_info_check(foi); + + p = is_strprefix(foi->file, "src/"); + if (NULL == p) + p = foi->file; + + /* + * We want to estimate how many characters will be used to display + * the "file:line" number when they use -w. + * + * The amount of digits needed to print the number can roughly be + * estimated by BIT_DEC_BUFLEN(), excepted it accounts for 1 more + * character (the trailing NUL byte) which is actually the ':' we + * add between the file name and the line number. Hence there is + * no need to adjust that amount. + */ + + len = strlen(p) + BIT_DEC_BUFLEN(1 + highest_bit_set(foi->line)); + maxlen = MAX(len, maxlen); + } + + maxlen = MAX(maxlen, CONST_STRLEN("Where")); + + str_printf(s, "Refs How %*s Path\n", (int) -maxlen, "Where"); + } else if (NULL == opt_u) { + STR_CPY(s, "Refs How Path\n"); + } else { + STR_CPY(s, "Refs Path\n"); + } + + shell_write(sh, "100~\n"); + shell_write(sh, str_2c(s)); + + f = str_new(80); + + PSLIST_FOREACH(info, sl) { + file_object_info_t *foi = sl->data; + + file_object_info_check(foi); + + str_printf(s, "%4d ", foi->refcnt); + if (NULL == opt_u) { + str_catf(s, "%3s ", O_RDONLY == foi->mode ? "RO" : + O_WRONLY == foi->mode ? "WO" : + O_RDWR == foi->mode ? "RW" : "??"); + } else { + if (hset_contains(seen, foi->path)) + continue; + hset_insert(seen, foi->path); + } + if (opt_w != NULL) { + const char *p; + p = is_strprefix(foi->file, "src/"); + if (NULL == p) + p = foi->file; + str_printf(f, "%s:%d", p, foi->line); + str_catf(s, "%*s ", (int) -maxlen, str_2c(f)); + } + str_cat(s, foi->path); + str_putc(s, '\n'); + shell_write(sh, str_2c(s)); + } + + hset_free_null(&seen); + str_destroy_null(&f); + str_destroy_null(&s); + file_object_info_list_free_nulll(&info); + shell_write(sh, ".\n"); + + return REPLY_READY; +} + +static enum shell_reply +shell_exec_lib_show(struct gnutella_shell *sh, + int argc, const char *argv) +{ + shell_check(sh); + g_assert(argv); + g_assert(argc > 0); + + if (argc < 2) + return REPLY_ERROR; + +#define CMD(name) G_STMT_START { \ + if (0 == ascii_strcasecmp(argv1, #name)) \ + return shell_exec_lib_show_ ## name(sh, argc - 1, argv + 1); \ +} G_STMT_END + + CMD(callout); + CMD(files); + +#undef CMD + + shell_set_formatted(sh, _("Unknown operation \"show %s\""), argv1); + return REPLY_ERROR; +} + +/** + * Handles the lib command. + */ +enum shell_reply +shell_exec_lib(struct gnutella_shell *sh, int argc, const char *argv) +{ + shell_check(sh); + g_assert(argv); + g_assert(argc > 0); + + if (argc < 2) + return REPLY_ERROR; + +#define CMD(name) G_STMT_START { \ + if (0 == ascii_strcasecmp(argv1, #name)) \ + return shell_exec_lib_ ## name(sh, argc - 1, argv + 1); \ +} G_STMT_END + + CMD(show); + +#undef CMD + + shell_set_formatted(sh, _("Unknown operation \"%s\""), argv1); + return REPLY_ERROR; +} + +const char * +shell_summary_lib(void) +{ + return "Library monitoring interface"; +} + +const char * +shell_help_lib(int argc, const char *argv) +{ + g_assert(argv); + g_assert(argc > 0); + + if (argc > 1) { + if (0 == ascii_strcasecmp(argv1, "show")) { + if (2 == argc) { + return + "lib show callout # display callout queues\n" + "lib show files -uw # display open files\n"; + } else { + if (0 == ascii_strcasecmp(argv2, "callout")) { + return "lib show callout\n" + "display information about all the callout queues\n"; + } else + if (0 == ascii_strcasecmp(argv2, "files")) { + return "lib show files -uw\n" + "display open files\n" + "-u: show one entry per file path " + "(ignoring -w if supplied)\n" + "-w: show where files were opened\n"; + } + } + } + } else { + return "lib show callout|files\n"; + } + return NULL; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/log.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/log.c
Changed
@@ -120,7 +120,7 @@ int argc, const char *argv) { enum shell_logtoken which = SHELL_LOG_ALL; - gboolean ok = FALSE; + bool ok = FALSE; shell_check(sh); g_assert(argv);
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/memory.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/memory.c
Changed
@@ -43,12 +43,15 @@ #include "lib/fd.h" #include "lib/file.h" #include "lib/glib-missing.h" +#include "lib/halloc.h" #include "lib/log.h" #include "lib/misc.h" #include "lib/omalloc.h" +#include "lib/palloc.h" #include "lib/parse.h" #include "lib/str.h" #include "lib/stringify.h" +#include "lib/tmalloc.h" #include "lib/vmm.h" #include "lib/xmalloc.h" #include "lib/zalloc.h" @@ -94,7 +97,7 @@ } } -static inline enum shell_reply /* "inline" to avoid warning if unused */ +static enum shell_reply G_UNUSED /* May be unused */ shell_exec_memory_dump(struct gnutella_shell *sh, int argc, const char *argv) { @@ -138,9 +141,9 @@ read_memory(fd, addr, length, data, sizeof data, valid); str_cpy(s, pointer_to_string(addr)); - str_cat(s, " "); + STR_CAT(s, " "); - for (i = 0; i < G_N_ELEMENTS(data); i++) { + for (i = 0; i < N_ITEMS(data); i++) { if (length > i) { unsigned char c = datai; @@ -149,15 +152,15 @@ str_putc(s, hex_digit(c & 0x0f)); str_putc(s, ' '); } else { - str_cat(s, "XX "); + STR_CAT(s, "XX "); } } else { - str_cat(s, " "); + STR_CAT(s, " "); } } - str_cat(s, " |"); + STR_CAT(s, " |"); - for (i = 0; i < G_N_ELEMENTS(data); i++) { + for (i = 0; i < N_ITEMS(data); i++) { if (length > i) { unsigned char c = datai; c = is_ascii_print(c) ? c : '.'; @@ -166,14 +169,14 @@ str_putc(s, ' '); } } - str_cat(s, "|\n"); + STR_CAT(s, "|\n"); shell_write(sh, str_2c(s)); - if (length < G_N_ELEMENTS(data)) + if (length < N_ITEMS(data)) break; - length -= G_N_ELEMENTS(data); - addr += G_N_ELEMENTS(data); + length -= N_ITEMS(data); + addr += N_ITEMS(data); } str_destroy(s); fd_close(&fd0); @@ -187,8 +190,18 @@ static void shell_vtable_settings_log(logagent_t *la) { + /* + * Since g_mem_is_system_malloc() is deprecated, use pragmas to shut down + * the warning for now. + * --RAM, 2016-02-22 + */ + + G_IGNORE_PUSH(-Wdeprecated-declarations); + log_info(la, "glib's g_malloc() is %s the system's malloc()", g_mem_is_system_malloc() ? "using" : "distinct from"); + + G_IGNORE_POP; } typedef void (*shower_cb_t)(logagent_t *la); @@ -266,7 +279,7 @@ static enum shell_reply memory_run_opt_shower(struct gnutella_shell *sh, - shower_opt_cb_t cb, const char *prefix, gboolean options) + shower_opt_cb_t cb, const char *prefix, bool options) { show_opt_vec_t v; @@ -275,7 +288,7 @@ v.cb = cb; v.prefix = prefix; v.options = options; - + return memory_run_opt_showerv(sh, &v, 1); } @@ -296,7 +309,40 @@ v2.cb = shell_vtable_settings_log; v2.prefix = NULL; - return memory_run_showerv(sh, v, G_N_ELEMENTS(v)); + return memory_run_showerv(sh, v, N_ITEMS(v)); +} + +static enum shell_reply +shell_exec_memory_show_hole(struct gnutella_shell *sh, + int argc, const char *argv) +{ + shell_check(sh); + g_assert(argv); + g_assert(argc > 0); + + return memory_run_shower(sh, vmm_dump_hole_log, "VMM "); +} + +static enum shell_reply +shell_exec_memory_show_magazines(struct gnutella_shell *sh, + int argc, const char *argv) +{ + shell_check(sh); + g_assert(argv); + g_assert(argc > 0); + + return memory_run_shower(sh, tmalloc_dump_magazines_log, "TMALLOC "); +} + +static enum shell_reply +shell_exec_memory_show_pcache(struct gnutella_shell *sh, + int argc, const char *argv) +{ + shell_check(sh); + g_assert(argv); + g_assert(argc > 0); + + return memory_run_shower(sh, vmm_dump_pcache_log, "VMM "); } static enum shell_reply @@ -311,6 +357,17 @@ } static enum shell_reply +shell_exec_memory_show_pools(struct gnutella_shell *sh, + int argc, const char *argv) +{ + shell_check(sh); + g_assert(argv); + g_assert(argc > 0); + + return memory_run_shower(sh, palloc_dump_pool_log, "PALLOC "); +} + +static enum shell_reply shell_exec_memory_show_xmalloc(struct gnutella_shell *sh, int argc, const char *argv) { @@ -348,8 +405,12 @@ return shell_exec_memory_show_## name(sh, argc - 1, argv + 1); \ } G_STMT_END + CMD(hole); + CMD(magazines); CMD(options); + CMD(pcache); CMD(pmap); + CMD(pools); CMD(xmalloc); CMD(zones); @@ -373,6 +434,26 @@ } static enum shell_reply +shell_exec_memory_stats_halloc(struct gnutella_shell *sh, + unsigned opt, unsigned which) +{ + if (which & STATS_USAGE) + return memory_stats_unsupported(sh, "halloc", STATS_USAGE_STR); + + return memory_run_opt_shower(sh, halloc_dump_stats_log, "HALLOC ", opt); +} + +static enum shell_reply +shell_exec_memory_stats_palloc(struct gnutella_shell *sh, + unsigned opt, unsigned which) +{ + if (which & STATS_USAGE) + return memory_stats_unsupported(sh, "palloc", STATS_USAGE_STR); + + return memory_run_opt_shower(sh, palloc_dump_stats_log, "PALLOC ", opt); +} + +static enum shell_reply shell_exec_memory_stats_vmm(struct gnutella_shell *sh, unsigned opt, unsigned which) { @@ -383,6 +464,16 @@ } static enum shell_reply +shell_exec_memory_stats_tmalloc(struct gnutella_shell *sh, + unsigned opt, unsigned which) +{ + if (which & STATS_USAGE) + return memory_stats_unsupported(sh, "tmalloc", STATS_USAGE_STR); + + return memory_run_opt_shower(sh, tmalloc_dump_stats_log, "TMALLOC ", opt); +} + +static enum shell_reply shell_exec_memory_stats_xmalloc(struct gnutella_shell *sh, unsigned opt, unsigned which) { @@ -427,7 +518,7 @@ shell_check(sh); - parsed = shell_options_parse(sh, argv, options, G_N_ELEMENTS(options)); + parsed = shell_options_parse(sh, argv, options, N_ITEMS(options)); if (parsed < 0) return REPLY_ERROR; @@ -447,6 +538,9 @@ return shell_exec_memory_stats_## name(sh, opt, which); \ } G_STMT_END + CMD(halloc); + CMD(palloc); + CMD(tmalloc); CMD(vmm); CMD(xmalloc); CMD(zalloc); @@ -459,13 +553,77 @@ } static enum shell_reply +shell_exec_memory_check_xmalloc(struct gnutella_shell *sh, + bool verbose, bool summary) +{ + size_t errors; + logagent_t *la = log_agent_string_make(0, "XM "); + unsigned vflags = XMALLOC_FLCF_LOCK; + + vflags |= verbose ? XMALLOC_FLCF_STATUS : 0; + vflags |= summary ? 0 : XMALLOC_FLCF_VERBOSE; + + if (vflags != XMALLOC_FLCF_LOCK) + shell_write(sh, "100~\n"); + + errors = xmalloc_freelist_check(la, vflags); + shell_write(sh, log_agent_string_get(la)); + log_agent_free_null(&la); + + if (vflags != XMALLOC_FLCF_LOCK) + shell_write(sh, ".\n"); + + shell_write_linef(sh, REPLY_READY, "Found %zu freelist%s in error", + errors, plural(errors)); + + return REPLY_READY; +} + +static enum shell_reply +shell_exec_memory_check(struct gnutella_shell *sh, + int argc, const char *argv) +{ + const char *verbose, *summary; + const option_t options = { + { "v", &verbose }, /* verbosely report */ + { "s", &summary }, /* silent report, only show summary status */ + }; + int parsed; + + shell_check(sh); + + parsed = shell_options_parse(sh, argv, options, N_ITEMS(options)); + if (parsed < 0) + return REPLY_ERROR; + + argv += parsed; /* args0 is first command argument */ + argc -= parsed; /* counts only command arguments now */ + + if (argc < 1) + return REPLY_ERROR; + +#define CMD(name) G_STMT_START { \ + if (0 == ascii_strcasecmp(argv0, #name)) \ + return shell_exec_memory_check_## name(sh, \ + verbose != NULL, summary != NULL); \ +} G_STMT_END + + CMD(xmalloc); + +#undef CMD + + shell_set_formatted(sh, _("Unknown operation \"check %s\""), argv0); + return REPLY_ERROR; +} + +static enum shell_reply shell_exec_memory_usage_zone(struct gnutella_shell *sh, int argc, const char *argv) { size_t size; const char *endptr; int error; - gboolean ok; + bool ok; shell_check(sh); g_assert(argv); @@ -560,12 +718,13 @@ #ifdef ALLOW_DUMP CMD(dump); #endif + CMD(check); CMD(show); CMD(stats); CMD(usage); #undef CMD - + shell_set_formatted(sh, _("Unknown operation \"%s\""), argv1); return REPLY_ERROR; } @@ -589,14 +748,25 @@ "dumps LENGTH bytes of memory starting at ADDRESS\n"; } else #endif - if (0 == ascii_strcasecmp(argv1, "show")) { + if (0 == ascii_strcasecmp(argv1, "check")) { + return "memory check -sv xmalloc\n" + "run consistency checks on freelists\n" + "-s : silent mode, only display summary at the end\n" + "-v : verbosely report for each freelist\n"; + } + else if (0 == ascii_strcasecmp(argv1, "show")) { return + "memory show hole # display VMM first known hole\n" + "memory show magazines # display thread magazine information\n" "memory show options # display memory options\n" + "memory show pcache # display VMM page cache\n" "memory show pmap # display VMM pmap\n" + "memory show pools # display allocation pools\n" "memory show xmalloc # display xmalloc() freelist info\n" "memory show zones # display zone usage\n"; } else if (0 == ascii_strcasecmp(argv1, "stats")) { - return "memory stats -pu omalloc|vmm|xmalloc|zalloc\n" + return "memory stats -pu " + "halloc|omalloc|palloc|tmalloc|vmm|xmalloc|zalloc\n" "show statistics about specified memory sub-system\n" "-p : pretty-print numbers with thousands separators\n" "-u : show allocation usage statistics, if available\n"; @@ -609,8 +779,9 @@ #ifdef ALLOW_DUMP "memory dump ADDRESS LENGTH\n" #endif - "memory show options|pmap|xmalloc|zones\n" - "memory stats -pu omalloc|vmm|xmalloc|zalloc\n" + "memory check xmalloc\n" + "memory show hole|magazines|options|pmap|pools|xmalloc|zones\n" + "memory stats -pu omalloc|palloc|tmalloc|vmm|xmalloc|zalloc\n" "memory usage zone <size> on|off|show\n" ; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/node.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/node.c
Changed
@@ -52,7 +52,7 @@ const char *host, *endptr, *port_str; char host_bufMAX_HOSTLEN + 1; int flags = SOCK_F_FORCE; - guint16 port; + uint16 port; shell_check(sh); g_assert(argv); @@ -69,13 +69,13 @@ } if (!string_to_host_or_addr(host, &endptr, NULL)) goto error; - + switch (endptr0) { case ':': { size_t n; - - endptr++; + + endptr++; n = endptr - host; n = MIN(n, sizeof host_buf); g_strlcpy(host_buf, host, n); @@ -116,7 +116,7 @@ { const char *endptr, *port_str; host_addr_t addr; - guint16 port; + uint16 port; shell_check(sh); g_assert(argv); @@ -152,7 +152,7 @@ } else { port = 0; } - + { unsigned n = node_remove_by_addr(addr, port); shell_write_linef(sh, REPLY_READY,
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/nodes.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/nodes.c
Changed
@@ -38,17 +38,18 @@ #include "core/nodes.h" #include "lib/ascii.h" -#include "lib/glib-missing.h" -#include "lib/iso3166.h" #include "lib/halloc.h" -#include "lib/stringify.h" +#include "lib/iso3166.h" #include "lib/options.h" +#include "lib/pslist.h" +#include "lib/str.h" +#include "lib/stringify.h" #include "lib/tm.h" #include "lib/override.h" /* Must be the last header included */ static void -print_node_info(struct gnutella_shell *sh, const struct gnutella_node *n) +print_node_info(struct gnutella_shell *sh, const gnutella_node_t *n) { gnet_node_flags_t flags; time_delta_t up, con; @@ -59,7 +60,7 @@ g_return_if_fail(sh); g_return_if_fail(n); - + if (!node_fill_flags(NODE_ID(n), &flags)) return; @@ -69,7 +70,7 @@ { const char *vendor; char *escaped; - + vendor = node_vendor(n); escaped = hex_escape(vendor, TRUE); clamp_strcpy(vendor_escaped, sizeof vendor_escaped, escaped); @@ -83,10 +84,9 @@ clamp_strcpy(contime_buf, sizeof contime_buf, con > 0 ? compact_time(con) : "?"); - gm_snprintf(buf, sizeof buf, - "%-21.45s %5.1u %s %2.2s %6.6s %6.6s %.50s", - node_addr(n), - (unsigned) n->gnet_port, + str_bprintf(buf, sizeof buf, + "%-21.45s %s %2.2s %6.6s %6.6s %.56s", + node_gnet_addr(n), node_flags_to_string(&flags), iso3166_country_cc(n->country), contime_buf, @@ -103,7 +103,7 @@ enum shell_reply shell_exec_nodes(struct gnutella_shell *sh, int argc, const char *argv) { - const GSList *sl; + const pslist_t *sl; shell_check(sh); g_assert(argv); @@ -113,10 +113,10 @@ shell_write(sh, "100~ \n" - "Node Port Flags CC Since Uptime User-Agent\n"); + "Node Flags CC Since Uptime User-Agent\n"); - for (sl = node_all_nodes(); sl; sl = g_slist_next(sl)) { - const struct gnutella_node *n = sl->data; + PSLIST_FOREACH(node_all_nodes(), sl) { + const gnutella_node_t *n = sl->data; print_node_info(sh, n); } shell_write(sh, ".\n"); /* Terminate message body */
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/print.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/print.c
Changed
@@ -36,6 +36,7 @@ #include "cmd.h" #include "if/gnet_property.h" +#include "lib/str.h" #include "lib/override.h" /* Must be the last header included */ @@ -56,13 +57,13 @@ prop = gnet_prop_get_by_name(argv1); if (prop == NO_PROP) { char buf120; - gm_snprintf(buf, sizeof buf, _("Unknown property \"%s\""), argv1); + str_bprintf(buf, sizeof buf, _("Unknown property \"%s\""), argv1); shell_set_msg(sh, buf); goto error; } shell_write(sh, _("Value: ")); - shell_write(sh, gnet_prop_to_string(prop)); + shell_write(sh, shell_property_to_string(prop)); shell_write(sh, "\n"); shell_set_msg(sh, _("Value found and displayed"));
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/props.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/props.c
Changed
@@ -37,11 +37,45 @@ #include "if/gnet_property.h" -#include "lib/glib-missing.h" +#include "lib/pslist.h" +#include "lib/str.h" #include "lib/override.h" /* Must be the last header included */ /** + * @return string value of property enclosed within specific type markers. + */ +const char * +shell_property_to_string(property_t prop) +{ + const char *before = "", *after = ""; + + switch (gnet_prop_type(prop)) { + case PROP_TYPE_BOOLEAN: + case PROP_TYPE_GUINT32: + case PROP_TYPE_GUINT64: + break; + case PROP_TYPE_STORAGE: + before = "'"; after = "'"; + break; + case PROP_TYPE_IP: + before = "< "; after = " >"; + break; + case PROP_TYPE_TIMESTAMP: + case PROP_TYPE_STRING: + before = after = "\""; + break; + case PROP_TYPE_MULTICHOICE: + before = "{ "; after = " }"; + break; + case NUM_PROP_TYPES: + g_assert_not_reached(); + } + + return str_smsg("%s%s%s", before, gnet_prop_to_string(prop), after); +} + +/** * Display all properties */ enum shell_reply @@ -52,13 +86,13 @@ { "v", &values }, }; int parsed; - GSList *props, *sl; + pslist_t *props, *sl; shell_check(sh); g_assert(argv); g_assert(argc > 0); - parsed = shell_options_parse(sh, argv, options, G_N_ELEMENTS(options)); + parsed = shell_options_parse(sh, argv, options, N_ITEMS(options)); if (parsed < 0) return REPLY_ERROR; @@ -73,18 +107,18 @@ shell_write(sh, "100~\n"); - for (sl = props; NULL != sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(props, sl) { property_t prop; - - prop = GPOINTER_TO_UINT(sl->data); + + prop = pointer_to_uint(sl->data); shell_write(sh, gnet_prop_name(prop)); if (values) { shell_write(sh, " = "); - shell_write(sh, gnet_prop_to_string(prop)); + shell_write(sh, shell_property_to_string(prop)); } shell_write(sh, "\n"); } - gm_slist_free_null(&props); + pslist_free_null(&props); shell_write(sh, ".\n"); return REPLY_READY;
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/quit.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/quit.c
Changed
@@ -43,9 +43,9 @@ shell_check(sh); g_assert(argv); g_assert(argc > 0); - + shell_set_msg(sh, _("Good bye")); - shell_shutdown(sh); + shell_exit(sh); return REPLY_BYE; }
View file
gtk-gnutella-1.1.9.tar.bz2/src/shell/random.c
Added
@@ -0,0 +1,287 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup shell + * @file + * + * The "random" command. + * + * This cheaply turns gtk-gnutella into a random number server. + * + * The random numbers generated come from the AJE layer, i.e. are perfectly + * random and the sequence is totally unpredictable. The AJE layer is fed + * some entropy on a regular basis and the output is cryptographically strong, + * meaning these random numbers can be used to generate certificates or keys. + * + * @author Raphael Manfredi + * @date 2014 + */ + +#include "common.h" + +#include "cmd.h" + +#include "lib/aje.h" +#include "lib/ascii.h" +#include "lib/base16.h" +#include "lib/dump_options.h" +#include "lib/log.h" +#include "lib/options.h" +#include "lib/parse.h" +#include "lib/random.h" +#include "lib/str.h" +#include "lib/xmalloc.h" + +#include "lib/override.h" /* Must be the last header included */ + +#define RANDOM_BYTES_MAX 4096 /* Max amount of random bytes we generate */ +#define RANDOM_NUM_MAX 1024 /* Max amount of entries we generate */ + +/** + * Parse value as an unsigned 32-bit integer. + * + * @param sh the shell for which we're processing the command + * @param what the item being parsed + * @param value the option value + * @param result where the parsed value is returned + * + * @return TRUE if OK, FALSE on error with an error message emitted. + */ +static bool +shell_parse_uint32(struct gnutella_shell *sh, + const char *what, const char *value, uint32 *result) +{ + int error; + uint base; + const char *start; + + base = parse_base(value, &start); + if (0 == base) { + error = EINVAL; + goto failed; + } + + *result = parse_uint32(start, NULL, base, &error); + if (error != 0) + goto failed; + + return TRUE; + +failed: + shell_write_linef(sh, REPLY_ERROR, "cannot parse %s: %s", + what, g_strerror(error)); + + return FALSE; +} + +/** + * Show random number stats. + */ +static enum shell_reply +shell_exec_random_stats(struct gnutella_shell *sh, int argc, const char *argv) +{ + const char *pretty; + const option_t options = { + { "p", &pretty }, /* pretty-print */ + }; + int parsed; + unsigned opt = 0; + logagent_t *la = log_agent_string_make(0, "RANDOM "); + + shell_check(sh); + + parsed = shell_options_parse(sh, argv, options, N_ITEMS(options)); + if (parsed < 0) + return REPLY_ERROR; + + argv += parsed; /* args0 is first command argument */ + argc -= parsed; /* counts only command arguments now */ + + if (pretty != NULL) + opt |= DUMP_OPT_PRETTY; + + random_dump_stats_log(la, opt); + + shell_write(sh, "100~\n"); + shell_write(sh, log_agent_string_get(la)); + shell_write(sh, ".\n"); + + log_agent_free_null(&la); + + return REPLY_READY; +} + +/** + * Generate random numbers. + */ +static enum shell_reply +shell_exec_random_val(struct gnutella_shell *sh, int argc, const char *argv) +{ + const char *opt_x, *opt_b, *opt_n, *opt_s; + const option_t options = { + { "b:", &opt_b }, /* how many bytes to generate */ + { "n:", &opt_n }, /* how many numbers to generate */ + { "s", &opt_s }, /* use "random_strong" instead of AJE */ + { "x", &opt_x }, /* display in hexadecimal */ + }; + uint32 upper = 255, lower = 0; + uint32 bytes = 1, amount = 1; + int parsed; + char *buf = NULL, *hexbuf = NULL; + enum shell_reply result = REPLY_ERROR; + + shell_check(sh); + g_assert(argv); + g_assert(argc > 0); + + parsed = shell_options_parse(sh, argv, options, N_ITEMS(options)); + if (parsed < 0) + return REPLY_ERROR; + + argv += parsed; /* argv0 is now the first command argument */ + argc -= parsed; /* Only counts remaining arguments */ + + if (argc >= 1) { + if (!shell_parse_uint32(sh, "upper", argv0, &upper)) + goto failed; + } + + if (argc >= 2) { + if (!shell_parse_uint32(sh, "lower", argv1, &lower)) + goto failed; + } + + if (upper < lower) { + shell_write_line(sh, REPLY_ERROR, + "upper boundary smaller than the lower one"); + goto failed; + } + + if (opt_b != NULL) { + if (argc >= 1) { + shell_write_line(sh, REPLY_ERROR, + "cannot specify upper or lower boundaries with -b"); + goto failed; + } + + if (!shell_parse_uint32(sh, "-b", opt_b, &bytes)) + goto failed; + + bytes = MIN(bytes, RANDOM_BYTES_MAX); + buf = xmalloc(bytes); + hexbuf = xmalloc(2 * bytes + 1); /* Hexa format + trailing NUL */ + hexbuf2 * bytes = '\0'; + } + + if (opt_n != NULL) { + if (!shell_parse_uint32(sh, "-n", opt_n, &amount)) + goto failed; + + amount = MIN(amount, RANDOM_NUM_MAX); + } + + while (amount-- != 0) { + if (buf != NULL) { + if (opt_s != NULL) { + random_strong_bytes(buf, bytes); + } else { + aje_random_bytes(buf, bytes); + } + base16_encode(hexbuf, 2 * bytes, buf, bytes); + shell_write_line(sh, REPLY_READY, hexbuf); + } else { + int32 r; + random_fn_t rf = opt_s != NULL ? random_strong : aje_rand_strong; + + r = lower + random_upto(rf, upper - lower); + shell_write_line(sh, REPLY_READY, + str_smsg(opt_x != NULL ? "%x" : "%d", r)); + } + } + + result = REPLY_READY; + goto done; + +failed: + shell_set_msg(sh, _("Invalid command syntax")); + + /* FALL THROUGH */ + +done: + XFREE_NULL(buf); + XFREE_NULL(hexbuf); + return result; +} + +enum shell_reply +shell_exec_random(struct gnutella_shell *sh, int argc, const char *argv) +{ + shell_check(sh); + g_assert(argv); + g_assert(argc > 0); + +#define CMD(name) G_STMT_START { \ + if (0 == ascii_strcasecmp(argv1, #name)) \ + return shell_exec_random_ ## name(sh, argc - 1, argv + 1); \ +} G_STMT_END + + CMD(stats); + +#undef CMD + + return shell_exec_random_val(sh, argc, argv); + +} + +const char * +shell_summary_random(void) +{ + return "Generate random numbers"; +} + +const char * +shell_help_random(int argc, const char *argv) +{ + g_assert(argv); + g_assert(argc > 0); + + if (argc > 1) { + if (0 == ascii_strcasecmp(argv1, "stats")) { + return "random stats -p\n" + "show statistics about random numbers\n" + "-p: pretty-print numbers with thousands separators\n"; + } + } + + return "random -b bytes -n amount -sx upper lower\n" + "Generate uniformly distributed random numbers.\n" + "By default: upper=255, lower=0\n" + "Values given as decimal, hexadecimal (0x), octal (0) or binary (0b)\n" + "-b : amount of random bytes to generate (implies -x), max 4096.\n" + "-n : amount of numbers or sequences of random bytes (1024 max).\n" + "-s : use RC4-encrypted WELL instead of AJE randomness.\n" + "-x : display numbers in hexadecimal.\n"; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/search.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/search.c
Changed
@@ -89,7 +89,7 @@ g_assert(argv); g_assert(argc > 0); - if (argc > 1) { + if (argc > 1) { /* FIXME */ return NULL; } else {
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/set.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/set.c
Changed
@@ -53,7 +53,7 @@ g_assert(argv); g_assert(argc > 0); - parsed = shell_options_parse(sh, argv, options, G_N_ELEMENTS(options)); + parsed = shell_options_parse(sh, argv, options, N_ITEMS(options)); if (parsed < 0) return REPLY_ERROR; @@ -76,16 +76,21 @@ goto error; } + if (gnet_prop_is_internal(prop)) { + shell_set_msg(sh, _("Property cannot be changed")); + goto error; + } + if (verbose) { shell_write_linef(sh, REPLY_READY, _("Previous value was %s"), - gnet_prop_to_string(prop)); + shell_property_to_string(prop)); } gnet_prop_set_from_string(prop, argv1); if (verbose) { shell_write_linef(sh, REPLY_READY, _("New value is %s"), - gnet_prop_to_string(prop)); + shell_property_to_string(prop)); } shell_set_msg(sh, _("Value found and set"));
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/shell.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/shell.c
Changed
@@ -1,5 +1,6 @@ /* - * Copyright (c) 2002-2003, Richard Eckart + * Copyright (c) 2002-2003 Richard Eckart + * Copyright (c) 2009,2013 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -30,7 +31,7 @@ * @author Richard Eckart * @date 2002-2003 * @author Raphael Manfredi - * @date 2009 + * @date 2009, 2013 */ #include "common.h" @@ -45,26 +46,36 @@ #include "if/gnet_property_priv.h" #include "lib/ascii.h" +#include "lib/atomic.h" +#include "lib/constants.h" +#include "lib/elist.h" +#include "lib/entropy.h" #include "lib/file.h" #include "lib/getline.h" #include "lib/glib-missing.h" #include "lib/halloc.h" +#include "lib/hashing.h" +#include "lib/htable.h" #include "lib/inputevt.h" #include "lib/pmsg.h" +#include "lib/pslist.h" #include "lib/random.h" #include "lib/sha1.h" #include "lib/slist.h" +#include "lib/spinlock.h" #include "lib/str.h" #include "lib/stringify.h" +#include "lib/teq.h" +#include "lib/thread.h" #include "lib/tm.h" #include "lib/utf8.h" #include "lib/walloc.h" +#include "lib/xmalloc.h" #include "lib/override.h" /* Must be the last header included */ -#define SHELL_MAX_ARGS 1024 /**< Maximum number of arguments in command */ - -static GSList *sl_shells; +#define SHELL_MAX_ARGS 1024 /**< Max number of arguments in command */ +#define SHELL_STACK_SIZE THREAD_STACK_MIN enum shell_magic { SHELL_MAGIC = 0x33f3e711U @@ -82,9 +93,14 @@ slist_t *output; char *msg; /**< Additional information to reply code */ time_t last_update; /**< Last update (needed for timeout) */ - guint64 line_count; /**< Number of input lines after HELO */ - gboolean shutdown; /**< In shutdown mode? */ - gboolean interactive; /**< Interactive mode? */ + uint64 line_count; /**< Number of input lines after HELO */ + link_t lnk; /**< Embedded list pointer */ + spinlock_t lock; /**< Thread-safe lock */ + uint shutdown:1; /**< In shutdown mode? */ + uint exiting:1; /**< Should shell exit? */ + uint interactive:1; /**< Interactive mode? */ + uint async:1; /**< In the middle of asynchronous processing */ + uint eof:1; /**< Got EOF on the input side */ }; void @@ -95,11 +111,21 @@ socket_check(sh->socket); } -static inline gboolean +#define SHELL_LOCK(sh) spinlock(&sh->lock) +#define SHELL_UNLOCK(sh) spinunlock(&sh->lock) + +static elist_t shells = ELIST_INIT(offsetof(struct gnutella_shell, lnk)); +static htable_t *shell_cmds; + +static bool shell_interpret_line(struct gnutella_shell *sh, const char *line); +static void shell_interpret_data(struct gnutella_shell *sh); +static void shell_handle_event(struct gnutella_shell *, inputevt_cond_t); + +static inline bool shell_has_pending_output(struct gnutella_shell *sh) { shell_check(sh); - return sh->output && slist_length(sh->output) > 0; + return sh->output != NULL && slist_length(sh->output) > 0; } /** @@ -116,8 +142,10 @@ sh->magic = SHELL_MAGIC; sh->socket = s; sh->output = slist_new(); + slist_thread_safe(sh->output); + spinlock_init(&sh->lock); - sl_shells = g_slist_prepend(sl_shells, sh); + elist_append(&shells, sh); return sh; } @@ -128,10 +156,11 @@ static void shell_free(struct gnutella_shell *sh) { - g_assert(sh); - g_assert(SHELL_MAGIC == sh->magic); + g_assert(sh != NULL); g_assert(NULL == sh->socket); /* must have called shell_destroy before */ g_assert(NULL == sh->output); /* must have called shell_destroy before */ + + spinlock_destroy(&sh->lock); HFREE_NULL(sh->msg); HFREE_NULL(sh->pending.msg); @@ -139,6 +168,16 @@ WFREE(sh); } +/** + * Called whenever some event occurs on a shell socket. + */ +static void +shell_handle_data(void *data, int unused_source, inputevt_cond_t cond) +{ + (void) unused_source; + shell_handle_event(data, cond); +} + static void shell_discard_output(struct gnutella_shell *sh) { @@ -156,9 +195,10 @@ shell_check(sh); if (GNET_PROPERTY(shell_debug)) { - g_debug("shell_destroy"); + s_debug("%s(%p)", G_STRFUNC, sh); } - sl_shells = g_slist_remove(sl_shells, sh); + + elist_remove(&shells, sh); socket_evt_clear(sh->socket); shell_discard_output(sh); socket_free_null(&sh->socket); @@ -203,20 +243,20 @@ shell_write_welcome(struct gnutella_shell *sh) { shell_check(sh); - + shell_write(sh, "100 Welcome to "); shell_write(sh, version_short_string); shell_write(sh, "\n"); } -guint64 +uint64 shell_line_count(struct gnutella_shell *sh) { shell_check(sh); return sh->line_count; } -gboolean +bool shell_toggle_interactive(struct gnutella_shell *sh) { shell_check(sh); @@ -227,6 +267,55 @@ return sh->interactive; } +static void +shell_shutdown(struct gnutella_shell *sh) +{ + shell_check(sh); + + sh->shutdown = TRUE; + atomic_mb(); + socket_evt_clear(sh->socket); +} + +static void +shell_eof(struct gnutella_shell *sh) +{ + shell_check(sh); + + sh->eof = TRUE; + atomic_mb(); + + SHELL_LOCK(sh); + + socket_evt_clear(sh->socket); + + if (shell_has_pending_output(sh)) { + if (GNET_PROPERTY(shell_debug) > 1) { + s_debug("%s(%p): keeping INPUT_EVENT_WX", G_STRFUNC, sh); + } + + socket_evt_set(sh->socket, INPUT_EVENT_WX, shell_handle_data, sh); + } else { + if (GNET_PROPERTY(shell_debug) > 1) { + s_debug("%s(%p): cleared all events", G_STRFUNC, sh); + } + } + + SHELL_UNLOCK(sh); +} + +/** + * Request that shell exits once all pending output has been flushed. + */ +void +shell_exit(struct gnutella_shell *sh) +{ + shell_check(sh); + + sh->exiting = TRUE; + atomic_mb(); +} + /** * Grabs next token, dynamically allocated, which must be gfree()'ed by caller. * @@ -248,9 +337,9 @@ const char *start, const char **endptr) { str_t *token; - gboolean escape = FALSE; - gboolean quote = FALSE; - gboolean squote = FALSE; + bool escape = FALSE; + bool quote = FALSE; + bool squote = FALSE; const char *s = start; char c; @@ -343,7 +432,7 @@ * @return TRUE if OK, FALSE on error with an error message recorded * in the shell structure (in which case no token was allocated). */ -static gboolean +static bool shell_get_token(struct gnutella_shell *sh, const char *line, const char **endptr, const char **token_ptr) { @@ -377,7 +466,7 @@ shell_free_argv(const char ***argv_ptr) { if (*argv_ptr) { - char **argv = deconstify_gpointer(*argv_ptr); + char **argv = deconstify_pointer(*argv_ptr); while (NULL != argv0) { HFREE_NULL(argv0); @@ -402,7 +491,7 @@ * @return TRUE if OK, FALSE on error with an error message recorded in the * shell structure. */ -static gboolean +static bool shell_parse_command(struct gnutella_shell *sh, const char *line, const char **endptr, int *argc_ptr, const char ***argv_ptr) @@ -410,7 +499,7 @@ const char **argv = NULL; unsigned argc = 0; size_t n = 0; - gboolean ok = TRUE; + bool ok = TRUE; const char *start; shell_check(sh); @@ -424,19 +513,18 @@ for (start = line; /* empty */; /* empty */) { if (argc >= n) { n = 2 * MAX(16, n); - argv = hrealloc(argv, n * sizeof argv0); + HREALLOC_ARRAY(argv, n); } if (argc > SHELL_MAX_ARGS) { argvSHELL_MAX_ARGS = NULL; - shell_free_argv(&argv); shell_set_msg(sh, _("too many arguments in command")); - argc = 0; - ok = FALSE; - break; + goto error; } if (!shell_get_token(sh, start, endptr, &argvargc)) { - ok = FALSE; - break; + argvargc = NULL; + shell_set_msg(sh, + str_smsg(_("un-parseable argument #%u in command"), argc)); + goto error; } if (NULL == argvargc) break; @@ -444,7 +532,7 @@ argc++; if (';' == *start) { if (argc >= n) - argv = hrealloc(argv, (argc + 1) * sizeof argv0); + HREALLOC_ARRAY(argv, argc + 1); argvargc = NULL; *endptr = ++start; break; @@ -456,30 +544,62 @@ *argv_ptr = argv; *argc_ptr = argc; return ok; + +error: + shell_free_argv(&argv); + argc = 0; + return FALSE; } /** + * Fetch handler for the command. + * + * @param cmd command name (lower-cased) + * @param threaded if non-NULL, set with whether processing can be threaded + * * @return command handler based on command name (case-insensitive). */ static shell_cmd_handler_t -shell_cmd_get_handler(const char *cmd) +shell_cmd_get_handler(const char *cmd, bool *threaded) { - static const struct { + static const struct shellcmd { const char * const cmd; shell_cmd_handler_t handler; + bool threadable; } commands = { -#define SHELL_CMD(x) { #x, shell_exec_ ## x }, +#define SHELL_CMD(x,t) { #x, shell_exec_ ## x, booleanize(t) }, #include "cmd.inc" -#undef SHELL_CMD +#undef SHELL_CMD }; + struct shellcmd *scd; size_t i; g_return_val_if_fail(cmd, NULL); - for (i = 0; i < G_N_ELEMENTS(commands); i++) { - if (ascii_strcasecmp(commandsi.cmd, cmd) == 0) - return commandsi.handler; + /* + * Build table for quick lookups. + */ + + if G_UNLIKELY(NULL == shell_cmds) { + shell_cmds = htable_create(HASH_KEY_STRING, 0); + + for (i = 0; i < N_ITEMS(commands); i++) { + char *name = xstrdup(commandsi.cmd); + + ascii_strlower(name, name); /* In-place conversion */ + htable_insert(shell_cmds, constant_str(name), + deconstify_pointer(&commandsi)); + xfree(name); + } + } + + scd = htable_lookup(shell_cmds, cmd); + if (scd != NULL) { + if (threaded != NULL) + *threaded = scd->threadable; + return scd->handler; } + return NULL; } @@ -487,7 +607,7 @@ * Flush any pending line. */ static void -shell_pending_flush(struct gnutella_shell *sh, gboolean last) +shell_pending_flush(struct gnutella_shell *sh, bool last) { shell_check(sh); g_return_if_fail(sh->output); @@ -495,7 +615,7 @@ if (sh->pending.msg != NULL) { char buf5; - gm_snprintf(buf, sizeof buf, "%03d%c", + str_bprintf(buf, sizeof buf, "%03d%c", sh->pending.code, last ? ' ' : '-'); shell_write(sh, buf); shell_write(sh, sh->pending.msg); @@ -504,6 +624,149 @@ } } +static void +shell_post_handle(struct gnutella_shell *sh, enum shell_reply reply_code) +{ + shell_check(sh); + + shell_pending_flush(sh, !sh->interactive); + if (NULL == sh->msg) { + switch (reply_code) { + case REPLY_ERROR: + shell_set_msg(sh, _("Malformed command")); + break; + case REPLY_READY: + shell_set_msg(sh, _("OK")); + break; + case REPLY_NONE: + case REPLY_BYE: + break; + case REPLY_ASYNC: + g_assert_not_reached(); + } + } +} + +static void +shell_handler_done(struct gnutella_shell *sh, enum shell_reply reply_code) +{ + if ( + REPLY_NONE != reply_code && + !(!sh->interactive && REPLY_READY == reply_code) + ) { + /* + * On error, when running non-interactively, remind them + * about the command that failed first. + */ + + if (REPLY_ERROR == reply_code && !sh->interactive) { + shell_write(sh, uint32_to_string(reply_code)); + shell_write(sh, "-Error for: \""); + shell_write(sh, getline_str(sh->socket->getline)); + shell_write(sh, "\"\n"); + } + + shell_write(sh, uint32_to_string(reply_code)); + shell_write_msg(sh); + shell_write(sh, "\n"); + } +} + +/** + * Context for asynchronous shell command execution. + */ +struct shell_async_args { + struct gnutella_shell *sh; + shell_cmd_handler_t handler; + const char *next; /* First character unparsed in line */ + const char **argv; + int argc; + enum shell_reply reply_code; +}; + +/** + * Resume execution of the shell command line after asynchronous processing. + */ +static void +shell_resume_processing(void *p) +{ + struct shell_async_args *args = p; + struct gnutella_shell *sh = args->sh; + const char *line = args->next; + + if (GNET_PROPERTY(shell_debug) > 1) { + s_debug("%s(%p): resuming in main after %s()", + G_STRFUNC, sh, stacktrace_function_name(args->handler)); + } + + WFREE(args); + sh->last_update = tm_time(); + sh->async = FALSE; + shell_handle_event(sh, INPUT_EVENT_NONE); /* Ensure we can read/write */ + + /* + * Once the line is fully interpreted and we're no longer running any + * asynchronous command, return to shell_interpret_data() to parse any + * remaining (already read) data in the socket buffer. + */ + + if (!shell_interpret_line(sh, line)) + shell_interpret_data(sh); +} + +/** + * Asynchronous shell command handler. + * + * @note + * This is the thread entry point for asynchronous shell command processing. + */ +static void * +shell_async_handler(void *p) +{ + struct shell_async_args *args = p; + struct gnutella_shell *sh = args->sh; + + shell_check(sh); + + thread_set_name("async shell handler"); + + if (GNET_PROPERTY(shell_debug) > 1) { + s_debug("%s(%p): invoking %s() asynchronously for \"%s\"", + G_STRFUNC, sh, stacktrace_function_name(args->handler), + args->argv0); + } + + args->reply_code = args->handler(sh, args->argc, args->argv); + + shell_post_handle(sh, args->reply_code); + shell_handler_done(sh, args->reply_code); + + if (GNET_PROPERTY(shell_debug) > 1) { + s_debug("%s(%p): done with %s() for \"%s\"", + G_STRFUNC, sh, stacktrace_function_name(args->handler), + args->argv0); + } + + shell_free_argv(&args->argv); + shell_post_handle(sh, args->reply_code); + + /* + * Transfer control back to the main thread to resume processing of + * the shell command line. + * + * Use a "safe" event to avoid interrupting processing in the main + * thread that could be re-entered by the processing we're about to resume. + */ + + if (!sh->shutdown) { + teq_safe_post(THREAD_MAIN, shell_resume_processing, args); + } else { + sh->async = FALSE; /* Signal that async processing is done */ + } + + return NULL; +} + /** * Takes a command string and tries to parse and execute it. */ @@ -516,6 +779,16 @@ const char *start = line; shell_check(sh); + g_assert(thread_is_main()); + g_assert(!sh->async); /* One async request at a time */ + g_assert(endptr != NULL); + + /* + * Collect randomness each time a command is executed, regardless + * of whether we end-up actually running it. + */ + + entropy_harvest_time(); if (!shell_parse_command(sh, start, endptr, &argc, &argv)) { shell_write(sh, "400-Syntax error:"); @@ -531,28 +804,69 @@ reply_code = REPLY_NONE; } else { shell_cmd_handler_t handler; + char *cmd = deconstify_char(argv0); + bool threadable; + + ascii_strlower(cmd, cmd); /* In-place conversion */ + handler = shell_cmd_get_handler(cmd, &threadable); - handler = shell_cmd_get_handler(argv0); - if (handler) { + if (handler != NULL) { HFREE_NULL(sh->pending.msg); - reply_code = (*handler)(sh, argc, argv); - shell_pending_flush(sh, !sh->interactive); - if (NULL == sh->msg) { - switch (reply_code) { - case REPLY_ERROR: - shell_set_msg(sh, _("Malformed command")); - break; - case REPLY_READY: - shell_set_msg(sh, _("OK")); - break; - case REPLY_NONE: - case REPLY_BYE: - break; + + if (threadable) { + struct shell_async_args *args; + + /* + * When the shell command is threadable, it will be run + * asynchronously. We simply return REPLY_ASYNC to the + * caller to let it know that continuation following this + * shell command will happen in the shell_resume_processing() + * routine. + */ + + WALLOC(args); + args->sh = sh; + args->next = *endptr; + args->argc = argc; + args->argv = argv; + args->handler = handler; + + if (GNET_PROPERTY(shell_debug) > 1) { + s_debug("%s(%p): can call %s() asynchronously for \"%s\"", + G_STRFUNC, sh, stacktrace_function_name(handler), + argv0); + } + + /* + * Forbid any more reading on the socket until we're done + * processing the previous command asynchronously. + */ + + sh->async = TRUE; + socket_evt_clear(sh->socket); + + if ( + -1 == thread_create(shell_async_handler, args, + THREAD_F_NO_POOL | THREAD_F_DETACH | + THREAD_F_NO_CANCEL | THREAD_F_WARN, + SHELL_STACK_SIZE) + ) { + WFREE(args); + sh->async = FALSE; + shell_handle_event(sh, INPUT_EVENT_NONE); + goto synchronous; } + + return REPLY_ASYNC; } + + synchronous: + + reply_code = (*handler)(sh, argc, argv); + shell_post_handle(sh, reply_code); } else { char buf80; - gm_snprintf(buf, sizeof buf, _("Unknown command: \"%s\""), argv0); + str_bprintf(buf, sizeof buf, _("Unknown command: \"%s\""), argv0); shell_set_msg(sh, buf); reply_code = REPLY_ERROR; } @@ -584,24 +898,37 @@ sh->last_update = tm_time(); + slist_lock(sh->output); iov = pmsg_slist_to_iovec(sh->output, &iov_cnt, NULL); + slist_unlock(sh->output); + + g_assert(iov != NULL); + written = s->wio.writev(&s->wio, iov, iov_cnt); + if (GNET_PROPERTY(shell_debug) > 2) { + s_debug("%s(%p): wrote %zd byte%s", + G_STRFUNC, sh, written, plural(written)); + } + switch (written) { case (ssize_t) -1: if (is_temporary_error(errno)) goto done; - /* FALL THRU */ + s_warning("%s(%p): writev() failed: %m", G_STRFUNC, sh); + shell_shutdown(sh); + break; + case 0: shell_discard_output(sh); - if (!sh->shutdown) { - shell_shutdown(sh); - } + shell_shutdown(sh); break; default: + slist_lock(sh->output); pmsg_slist_discard(sh->output, written); + slist_unlock(sh->output); } done: @@ -610,45 +937,69 @@ } /** - * Called when data is available on a shell connection. Uses getline to - * read the available data line by line. + * Interpret commands on the line (separated by ';'). + * + * @return TRUE if we are executing an asynchronous command and need to pause + * processing until the command is finished. + */ +static bool +shell_interpret_line(struct gnutella_shell *sh, const char *line) +{ + shell_check(sh); + g_assert(line != NULL); + g_assert(!sh->async); /* Done with possible previous async command */ + + shell_set_msg(sh, NULL); + + while (line != NULL && *line != '\0') { + enum shell_reply reply_code; + const char *endptr = NULL; + + reply_code = shell_exec(sh, line, &endptr); + + /* + * If the shell command runs asynchronously, then we need to wait for + * the remainder of the command. The shell_resume_processing() routine + * will be called when it is completed. + */ + + if (REPLY_ASYNC == reply_code) + return TRUE; + + shell_handler_done(sh, reply_code); + + line = endptr; + shell_set_msg(sh, NULL); + + if (sh->exiting) + break; + } + + getline_reset(sh->socket->getline); + + return FALSE; +} + +/** + * Interpret all the data held in the shell's socket read buffer, which + * may contain several lines of text. */ static void -shell_read_data(struct gnutella_shell *sh) +shell_interpret_data(struct gnutella_shell *sh) { struct gnutella_socket *s; shell_check(sh); g_assert(sh->socket->getline); g_assert(!sh->shutdown); + g_assert(!sh->async); - sh->last_update = tm_time(); + sh->last_update = tm_time(); /* Continuing to process */ s = sh->socket; - if (s->buf_size - s->pos < 1) { - g_warning("SHELL read more than buffer size (%zu bytes)", s->buf_size); - } else { - size_t size = s->buf_size - s->pos - 1; - ssize_t ret; - - ret = s->wio.read(&s->wio, &s->bufs->pos, size); - if (0 == ret) { - if (0 == s->pos) { - if (GNET_PROPERTY(shell_debug)) { - g_debug("shell connection closed: EOF"); - } - shell_shutdown(sh); - goto finish; - } - } else if ((ssize_t) -1 == ret) { - if (!is_temporary_error(errno)) { - g_warning("receiving data failed: %m"); - shell_shutdown(sh); - goto finish; - } - } else { - s->pos += ret; - } + if (GNET_PROPERTY(shell_debug) > 1) { + s_debug("%s(%p): %zu byte%s in socket buffer", + G_STRFUNC, sh, s->pos, plural(s->pos)); } while (s->pos > 0) { @@ -657,11 +1008,11 @@ switch (getline_read(s->getline, s->buf, s->pos, &parsed)) { case READ_OVERFLOW: - g_warning("Line is too long (from shell at %s)\n", - host_addr_port_to_string(s->addr, s->port)); + s_warning("%s(%p): line is too long (from shell at %s)\n", + G_STRFUNC, sh, host_addr_port_to_string(s->addr, s->port)); shell_write(sh, "400 Line is too long.\n"); shell_shutdown(sh); - goto finish; + return; case READ_DONE: if (s->pos != parsed) memmove(s->buf, &s->bufparsed, s->pos - parsed); @@ -670,7 +1021,7 @@ case READ_MORE: g_assert(parsed == s->pos); s->pos = 0; - goto finish; + goto done; } /* @@ -684,55 +1035,76 @@ sh->line_count++; line = getline_str(s->getline); - while (line != NULL && *line != '\0') { - enum shell_reply reply_code; - const char *endptr = NULL; - - reply_code = shell_exec(sh, line, &endptr); - if ( - REPLY_NONE != reply_code && - !(!sh->interactive && REPLY_READY == reply_code) - ) { - /* - * On error, when running non-interactively, remind them - * about the command that failed first. - */ - - if (REPLY_ERROR == reply_code && !sh->interactive) { - shell_write(sh, uint32_to_string(reply_code)); - shell_write(sh, "-Error for: \""); - shell_write(sh, getline_str(s->getline)); - shell_write(sh, "\"\n"); - } - - shell_write(sh, uint32_to_string(reply_code)); - shell_write_msg(sh); - shell_write(sh, "\n"); - } + if (shell_interpret_line(sh, line)) + return; - line = endptr; - shell_set_msg(sh, NULL); - } + if (sh->shutdown || sh->exiting || sh->eof) + return; + } - getline_reset(s->getline); - if (sh->shutdown) - goto finish; +done: + if (GNET_PROPERTY(shell_debug) > 1) { + s_debug("%s(%p): finished normally (setting INPUT_EVENT_RW)", + G_STRFUNC, sh); } -finish: - return; -} + /* + * The lock is not necessary here, as we are supposed to be running the + * shell in a single thread at this point, with no concurrent shell thread. + */ -static void shell_handle_event(struct gnutella_shell *, inputevt_cond_t); + socket_evt_clear(sh->socket); + socket_evt_set(sh->socket, INPUT_EVENT_RW, shell_handle_data, sh); +} /** - * Called whenever some event occurs on a shell socket. + * Called when data is available on a shell connection. Uses getline to + * read the available data line by line. */ static void -shell_handle_data(void *data, int unused_source, inputevt_cond_t cond) +shell_read_data(struct gnutella_shell *sh) { - (void) unused_source; - shell_handle_event(data, cond); + struct gnutella_socket *s; + + shell_check(sh); + g_assert(sh->socket->getline); + g_assert(!sh->shutdown); + + if G_UNLIKELY(sh->async) + return; /* In the middle of an async command */ + + sh->last_update = tm_time(); + s = sh->socket; + + if (s->buf_size - s->pos < 1) { + s_critical("%s(%p) read more than buffer size (%zu bytes)", + G_STRFUNC, sh, s->buf_size); + } else { + size_t size = s->buf_size - s->pos - 1; + ssize_t ret; + + ret = s->wio.read(&s->wio, &s->bufs->pos, size); + if (0 == ret) { + if (0 == s->pos) { + if (GNET_PROPERTY(shell_debug)) { + s_debug("%s(%p): shell connection closed: EOF", + G_STRFUNC, sh); + } + shell_eof(sh); + return; + } + } else if ((ssize_t) -1 == ret) { + if (!is_temporary_error(errno)) { + s_warning("%s(%p): receiving data failed: %m", G_STRFUNC, sh); + shell_shutdown(sh); + return; + } + } else { + s->pos += ret; + } + } + + shell_interpret_data(sh); } static void @@ -741,29 +1113,76 @@ shell_check(sh); if (cond & INPUT_EVENT_EXCEPTION) { - g_warning ("shell connection closed: exception"); + s_warning ("%s(%p): got input exception", G_STRFUNC, sh); goto destroy; } - if ((cond & INPUT_EVENT_W) && shell_has_pending_output(sh)) { + if ( + (cond & INPUT_EVENT_W) && + !sh->shutdown && shell_has_pending_output(sh) + ) { shell_write_data(sh); } - if ((cond & INPUT_EVENT_R) && !sh->shutdown) { + if ((cond & INPUT_EVENT_R) && !(sh->shutdown || sh->eof)) { + g_assert(!sh->async); shell_read_data(sh); } + SHELL_LOCK(sh); + if (!shell_has_pending_output(sh)) { - if (sh->shutdown) + if (sh->shutdown || sh->exiting) { + SHELL_UNLOCK(sh); goto destroy; + } + + if (GNET_PROPERTY(shell_debug) > 1) { + s_debug("%s(%p): clearing INPUT_EVENT_WX", G_STRFUNC, sh); + } socket_evt_clear(sh->socket); - socket_evt_set(sh->socket, INPUT_EVENT_RX, shell_handle_data, sh); + + if (!sh->async) { + if (sh->eof) { + SHELL_UNLOCK(sh); + goto destroy; + } + if (GNET_PROPERTY(shell_debug) > 1) { + s_debug("%s(%p): setting INPUT_EVENT_RX", G_STRFUNC, sh); + } + socket_evt_set(sh->socket, INPUT_EVENT_RX, shell_handle_data, sh); + } } + + SHELL_UNLOCK(sh); return; destroy: - shell_destroy(sh); + if (sh->async) + shell_shutdown(sh); + else + shell_destroy(sh); +} + +static void +shell_evt_writable(struct gnutella_shell *sh) +{ + shell_check(sh); + + if G_UNLIKELY(sh->shutdown) + return; + + SHELL_LOCK(sh); + + if (GNET_PROPERTY(shell_debug) > 1) { + s_debug("%s(%p): setting INPUT_EVENT_WX", G_STRFUNC, sh); + } + + socket_evt_clear(sh->socket); + socket_evt_set(sh->socket, INPUT_EVENT_WX, shell_handle_data, sh); + + SHELL_UNLOCK(sh); } void @@ -775,18 +1194,39 @@ g_return_if_fail(sh->output); g_return_if_fail(text); + /* + * If running asynchronously, the main thread could have decided to + * shutdown the shell. In which case we must no longer issue any + * output. + */ + + if (sh->shutdown) + return; + len = strlen(text); g_return_if_fail(len < (size_t) -1); if (len > 0) { - if (!shell_has_pending_output(sh)) { - socket_evt_clear(sh->socket); - socket_evt_set(sh->socket, INPUT_EVENT_WX, shell_handle_data, sh); - } + bool install_write_event; + + slist_lock(sh->output); + install_write_event = !shell_has_pending_output(sh); pmsg_slist_append(sh->output, text, len); + slist_unlock(sh->output); + + if (install_write_event) + shell_evt_writable(sh); } } +static void +shell_pending_add(struct gnutella_shell *sh, int code, const char *text) +{ + shell_pending_flush(sh, FALSE); + sh->pending.msg = h_strdup(text); + sh->pending.code = code; +} + /** * Writes single line of text, appending final trailing "\n". */ @@ -796,9 +1236,37 @@ shell_check(sh); g_return_if_fail(text); - shell_pending_flush(sh, FALSE); - sh->pending.msg = h_strdup(text); - sh->pending.code = code; + shell_pending_add(sh, code, text); +} + +/** + * Writes multiple lines of text, appending final trailing "\n" if needed. + */ +void +shell_write_lines(struct gnutella_shell *sh, int code, const char *text) +{ + str_t *str; + int c; + const char *p = text; + + shell_check(sh); + g_return_if_fail(text); + + str = str_new(0); + + while ((c = *p++)) { + if ('\n' == c) { + shell_pending_add(sh, code, str_2c(str)); + str_reset(str); + } else { + str_putc(str, c); + } + } + + if (0 != str_len(str)) + shell_pending_add(sh, code, str_2c(str)); + + str_destroy_null(&str); } /** @@ -823,15 +1291,6 @@ sh->pending.code = code; } -void -shell_shutdown(struct gnutella_shell *sh) -{ - shell_check(sh); - g_assert(!sh->shutdown); - - sh->shutdown = TRUE; -} - #ifdef USE_REMOTE_CTRL static void @@ -852,20 +1311,17 @@ } } -static const struct sha1 * +static const struct sha1 * shell_auth_cookie(void) { static struct sha1 cookie; - static gboolean initialized; + static bool initialized; if (!initialized) { - SHA1Context ctx; - guint32 noise64; + uint32 noise64; - random_bytes(noise, sizeof noise); - SHA1Reset(&ctx); - SHA1Input(&ctx, &noise, sizeof noise); - SHA1Result(&ctx, &cookie); + random_strong_bytes(noise, sizeof noise); + SHA1_COMPUTE(noise, &cookie); shell_dump_cookie(&cookie); initialized = TRUE; } @@ -878,12 +1334,12 @@ * * @return TRUE if the connection is allowed. */ -static gboolean +static bool shell_auth(struct gnutella_shell *sh, const char *str) { const struct sha1 *cookie; const char *tok_helo = NULL, *tok_cookie = NULL; - gboolean ok = FALSE; + bool ok = FALSE; const char *endptr; if (!shell_get_token(sh, str, &endptr, &tok_helo)) @@ -892,7 +1348,7 @@ goto done; if (GNET_PROPERTY(shell_debug)) { - g_debug("auth: %s <cookie not displayed>", tok_helo); + s_debug("%s: %s <cookie not displayed>", G_STRFUNC, tok_helo); } cookie = shell_auth_cookie(); @@ -908,17 +1364,17 @@ done: if (tok_helo != NULL) - g_free(deconstify_gpointer(tok_helo)); + g_free(deconstify_pointer(tok_helo)); if (tok_cookie != NULL) - g_free(deconstify_gpointer(tok_cookie)); + g_free(deconstify_pointer(tok_cookie)); return ok; } -static gboolean +static bool shell_grant_remote_shell(struct gnutella_shell *sh) { - gboolean granted = FALSE; + bool granted = FALSE; shell_check(sh); @@ -928,12 +1384,12 @@ sh->interactive = TRUE; shell_write_welcome(sh); } else { - g_warning("invalid credentials"); + s_warning("invalid credentials"); shell_write(sh, "400 Invalid credentials\n"); } getline_reset(sh->socket->getline); /* clear AUTH command from buffer */ } else { - g_warning("remote shell control interface disabled"); + s_warning("remote shell control interface disabled"); shell_write(sh, "401 Disabled\n"); } return granted; @@ -941,22 +1397,22 @@ #else /* !USE_REMOTE_CTRL */ -static const struct sha1 * +static const struct sha1 * shell_auth_cookie(void) { return NULL; } -static gboolean +static bool shell_grant_remote_shell(const struct gnutella_shell *sh) { shell_check(sh); - g_warning("remote shell control interface disabled"); + s_warning("remote shell control interface disabled"); return FALSE; } #endif /* USE_REMOTE_CTRL */ -static gboolean +static bool shell_grant_local_shell(struct gnutella_shell *sh) { shell_check(sh); @@ -965,7 +1421,7 @@ getline_reset(sh->socket->getline); /* remove HELO command */ return TRUE; } else { - g_warning("local shell control interface disabled"); + s_warning("local shell control interface disabled"); shell_write(sh, "401 Disabled\n"); return FALSE; } @@ -978,15 +1434,15 @@ shell_add(struct gnutella_socket *s) { struct gnutella_shell *sh; - gboolean granted = FALSE; + bool granted = FALSE; socket_check(s); g_assert(0 == s->gdk_tag); g_assert(s->getline); if (GNET_PROPERTY(shell_debug)) { - g_debug("incoming shell connection from %s", - host_addr_port_to_string(s->addr, s->port)); + s_debug("%s: incoming shell connection from %s", + G_STRFUNC, host_addr_port_to_string(s->addr, s->port)); } s->type = SOCK_TYPE_SHELL; @@ -1012,26 +1468,28 @@ shell_timer(time_t now) { time_delta_t timeout = GNET_PROPERTY(remote_shell_timeout); + struct gnutella_shell *sh; if (timeout > 0) { - GSList *sl, *to_remove = NULL; - - for (sl = sl_shells; sl != NULL; sl = g_slist_next(sl)) { - struct gnutella_shell *sh = sl->data; + pslist_t *to_remove = NULL, *sl; + ELIST_FOREACH_DATA(&shells, sh) { shell_check(sh); if ( 0 == (SOCK_F_LOCAL & sh->socket->flags) && - delta_time(now, sh->last_update) > timeout + delta_time(now, sh->last_update) > timeout && + !sh->async /* No timeout if command done by other thread */ ) { - to_remove = g_slist_prepend(to_remove, sh); + to_remove = pslist_prepend(to_remove, sh); + } else if (sh->shutdown && !sh->async) { + to_remove = pslist_prepend(to_remove, sh); } } - for (sl = to_remove; sl != NULL; sl = g_slist_next(sl)) { - struct gnutella_shell *sh = sl->data; + PSLIST_FOREACH(to_remove, sl) { + sh = sl->data; shell_destroy(sh); } - g_slist_free(to_remove); + pslist_free_null(&to_remove); } } @@ -1044,10 +1502,12 @@ void shell_close(void) { - while (sl_shells) { - struct gnutella_shell *sh = sl_shells->data; + struct gnutella_shell *sh; + + while (NULL != (sh = elist_head(&shells))) { shell_destroy(sh); } + htable_free_null(&shell_cmds); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/shutdown.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/shutdown.c
Changed
@@ -37,6 +37,7 @@ #include "if/core/main.h" +#include "lib/crash.h" #include "lib/str.h" #include "lib/product.h" @@ -59,9 +60,10 @@ enum shell_reply shell_exec_shutdown(struct gnutella_shell *sh, int argc, const char *argv) { - const char *opt_a, *opt_e, *opt_f, *opt_m, *opt_r, *opt_s; + const char *opt_a, *opt_c, *opt_e, *opt_f, *opt_m, *opt_r, *opt_s; const option_t options = { { "a", &opt_a }, + { "c", &opt_c }, { "e", &opt_e }, { "f", &opt_f }, { "m", &opt_m }, @@ -76,7 +78,7 @@ g_assert(argv); g_assert(argc > 0); - parsed = shell_options_parse(sh, argv, options, G_N_ELEMENTS(options)); + parsed = shell_options_parse(sh, argv, options, N_ITEMS(options)); if (parsed < 0) return REPLY_ERROR; @@ -92,6 +94,8 @@ mode = GTKG_SHUTDOWN_NORMAL; } + if (opt_c != NULL) + flags |= GTKG_SHUTDOWN_OCRASH; if (opt_f != NULL) flags |= GTKG_SHUTDOWN_OFAST; if (opt_r != NULL) @@ -103,21 +107,29 @@ return REPLY_ERROR; } + /* + * Turn auto-restart on or off in case we crash from now on. + */ + + crash_ctl(NULL == opt_r ? CRASH_FLAG_CLEAR : CRASH_FLAG_SET, + CRASH_F_RESTART); + gtk_gnutella_request_shutdown(mode, flags); - shell_write_linef(sh, REPLY_READY, "%s %ssequence initiated%s.", + shell_write_linef(sh, REPLY_READY, "%s %s%ssequence initiated%s.", (flags & GTKG_SHUTDOWN_ORESTART) ? "Restart" : "Shutdown", (flags & GTKG_SHUTDOWN_OFAST) ? "fast " : "", + (flags & GTKG_SHUTDOWN_OCRASH) ? "(as if crashing) " : "", shutdown_mode_string(mode)); - shell_shutdown(sh); + shell_exit(sh); return REPLY_NONE; } const char * shell_summary_shutdown(void) { - return str_smsg("Terminate %s", product_get_name()); + return str_smsg("Terminate %s", product_name()); } const char * @@ -125,7 +137,7 @@ { (void) argc; (void) argv; - return str_smsg("shutdown -fr -aems\n" + return str_smsg("shutdown -fr -acems\n" "Initiates a shutdown/restart of %s.\n" "As a side effect the shell connection is closed as well.\n" "-f: request fast shutdown, sending BYE only to nodes supporting it\n" @@ -133,10 +145,11 @@ "The following help trigger a crash after shutdown has completed\n" "to exercise the crash handler and make sure everything works:\n" "-a: finish with assertion failure\n" + "-c: simulate a crashing condition\n" "-e: finish with forced error\n" "-m: finish with memory error\n" "-s: finish with harmful signal\n", - product_get_name()); + product_name()); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/stats.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/stats.c
Changed
@@ -36,35 +36,194 @@ #include "cmd.h" #include "core/gnet_stats.h" +#include "lib/ascii.h" +#include "lib/options.h" #include "lib/stringify.h" +#include "lib/teq.h" +#include "lib/xmalloc.h" + #include "lib/override.h" /* Must be the last header included */ -enum shell_reply -shell_exec_stats(struct gnutella_shell *sh, int argc, const char *argv) +static enum shell_reply +shell_exec_stats_general(struct gnutella_shell *sh, + int argc, const char *argv) { + const char *pretty; + const option_t options = { + { "p", &pretty }, /* pretty-print values */ + }; + int parsed; int i; - gnet_stats_t stats; + gnet_stats_t *stats; shell_check(sh); g_assert(argv); g_assert(argc > 0); - gnet_stats_get(&stats); + parsed = shell_options_parse(sh, argv, options, N_ITEMS(options)); + if (parsed < 0) + return REPLY_ERROR; + + /* + * Since this command now runs in a separated thread with a rather small + * stack, we allocate the gnet_stats_t variable on the heap because it + * is large enough to cause an overflow. + * --RAM, 2013-11-30 + */ + + XMALLOC(stats); + gnet_stats_get(stats); for (i = 0; i < GNR_TYPE_COUNT; i++) { shell_write(sh, gnet_stats_general_to_string(i)); shell_write(sh, " "); - shell_write(sh, uint64_to_string(stats.generali)); + shell_write(sh, pretty ? + uint64_to_gstring(stats->generali) : + uint64_to_string(stats->generali)); + shell_write(sh, "\n"); + } + + XFREE_NULL(stats); + return REPLY_READY; +} + +static void +stats_merge_drop(const gnet_stats_t *s, uint64 *drops) +{ + int i; + + for (i = 0; i < MSG_DROP_REASON_COUNT; i++) { + dropsi += s->drop_reasoniMSG_TOTAL; + } +} + +typedef void (*stats_getter_t)(gnet_stats_t *); + +struct stats_get_args { + stats_getter_t get; + gnet_stats_t *s; +}; + +static void * +stats_get_trampoline(void *a) +{ + struct stats_get_args *arg = a; + + (*arg->get)(arg->s); + return NULL; +} + +static void +stats_get(stats_getter_t get, gnet_stats_t *s) +{ + struct stats_get_args arg; + + /* + * Need to invoke TCP/UDP stats gathering from the main thread only + * because there are no locks protecting these stats. + */ + + arg.get = get; + arg.s = s; + + (void) teq_rpc(THREAD_MAIN, stats_get_trampoline, &arg); +} + +static enum shell_reply +shell_exec_stats_drop(struct gnutella_shell *sh, + int argc, const char *argv) +{ + const char *pretty, *tcp, *udp; + const option_t options = { + { "p", &pretty }, /* pretty-print values */ + { "t", &tcp }, /* TCP-only stats */ + { "u", &udp }, /* UDP-only stats */ + }; + int parsed; + int i; + gnet_stats_t *stats; + uint64 *drops; + + shell_check(sh); + g_assert(argv); + g_assert(argc > 0); + + parsed = shell_options_parse(sh, argv, options, N_ITEMS(options)); + if (parsed < 0) + return REPLY_ERROR; + + /* + * If they specified neither -t nor -u, then it means both. + */ + + if (NULL == tcp && NULL == udp) { + tcp = udp = "t"; /* Value does not matter here */ + } + + /* + * Since this command now runs in a separated thread with a rather small + * stack, we allocate the large variables on the heap. + */ + + XMALLOC(stats); + XMALLOC0_ARRAY(drops, MSG_DROP_REASON_COUNT); + + if (tcp != NULL) { + stats_get(gnet_stats_tcp_get, stats); + stats_merge_drop(stats, drops); + } + + if (udp != NULL) { + stats_get(gnet_stats_udp_get, stats); + stats_merge_drop(stats, drops); + } + + for (i = 0; i < MSG_DROP_REASON_COUNT; i++) { + shell_write(sh, gnet_stats_drop_reason_name(i)); + shell_write(sh, " "); + shell_write(sh, pretty ? + uint64_to_gstring(dropsi) : uint64_to_string(dropsi)); shell_write(sh, "\n"); } + XFREE_NULL(stats); + XFREE_NULL(drops); return REPLY_READY; } +/** + * Handle the stats command. + */ +enum shell_reply +shell_exec_stats(struct gnutella_shell *sh, int argc, const char *argv) +{ + shell_check(sh); + + /* + * The "general" string is optional. + */ + + if (argc < 2 || '-' == *argv1) + return shell_exec_stats_general(sh, argc, argv); + +#define CMD(name) G_STMT_START { \ + if (0 == ascii_strcasecmp(argv1, #name)) \ + return shell_exec_stats_ ## name(sh, argc - 1, argv + 1); \ +} G_STMT_END + + CMD(general); + CMD(drop); + +#undef CMD + + shell_set_formatted(sh, _("Unknown operation \"%s\""), argv1); + return REPLY_ERROR; +} + const char * shell_summary_stats(void) { - return "Print the general counters"; + return "Print statistics counters"; } const char * @@ -73,7 +232,26 @@ g_assert(argv); g_assert(argc > 0); - return NULL; + if (argc > 1) { + if (0 == ascii_strcasecmp(argv1, "general")) { + return "stats general -p\n" + "prints the general statistics counters.\n" + "-p : pretty-print with thousands separators.\n"; + } + else if (0 == ascii_strcasecmp(argv1, "drop")) { + return "stats drop -ptu\n" + "prints the message drop cumulative counters.\n" + "-p : pretty-print with thousands separators.\n" + "-t : only show TCP messages.\n" + "-u : only show UDP messages.\n"; + } + } else { + return + "stats general -p\n" + "stats drop -ptu\n" + ; + } + return NULL; } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/status.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/status.c
Changed
@@ -50,7 +50,7 @@ #include "lib/concat.h" #include "lib/host_addr.h" -#include "lib/glib-missing.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/timestamp.h" #include "lib/tm.h" @@ -82,7 +82,7 @@ g_assert(argv); g_assert(argc > 0); - parsed = shell_options_parse(sh, argv, options, G_N_ELEMENTS(options)); + parsed = shell_options_parse(sh, argv, options, N_ITEMS(options)); if (parsed < 0) return REPLY_ERROR; @@ -93,45 +93,46 @@ /* Leading flags */ { - char flags47; + char flags52; const char *fw; const char *fd; const char *pmp; const char *dht; /* - * The flags are displayed as followed: + * The reported flags are defined as follows (listed in display + * order from left to right): * - * PMP port mapping configured via UPnP or NAT-PMP + * UMP port mapping configured via UPnP + * NMP port mapping configured via NAT-PMP * pmp port mapping available (UPnP or NAT-PMP), un-configured - * CLK clock, GTKG expired - * !FD or FD red or yellow bombs for fd shortage - * STL upload stalls + * CLK clock, GTKG expired + * !TL no TCP listening socket + * !IP kernel network buffer shortage + * !FD or FD red or yellow bombs for fd shortage + * STL upload stalls * gUL/yUL/rUL green, yellow or red upload early stalling levels - * CPU cpu overloaded - * MOV file moving - * SHA SHA-1 rebuilding or verifying - * TTH TTH rebuilding or verifying - * LIB library rescan - * :FW or FW indicates whether hole punching is possible - * udp or UDP indicates UDP firewalling (lowercased for hole punching) - * TCP indicates TCP-firewalled - * - the happy face: no firewall + * CPU cpu overloaded + * MOV file moving + * SHA SHA-1 rebuilding or verifying + * TTH TTH rebuilding or verifying + * LIB library rescan + * :FW or FW indicates whether hole punching is possible + * udp or UDP indicates UDP firewalling (lowercased for hole punching) + * TCP indicates TCP-firewalled + * - the happy face: no firewall * sDH/lDH/bDH seeded, own KUID looking or bootstrapping DHT * A or P active or passive DHT mode - * UP or LF ultrapeer or leaf mode + * UP or LF ultrapeer or leaf mode */ - if (GNET_PROPERTY(enable_upnp) || GNET_PROPERTY(enable_natpmp)) { - if (GNET_PROPERTY(port_mapping_successful)) { - pmp = "PMP "; - } else if (GNET_PROPERTY(port_mapping_possible)) { - pmp = "pmp "; - } else { - pmp = empty; - } - } else { - pmp = empty; + pmp = (GNET_PROPERTY(upnp_possible) || GNET_PROPERTY(natpmp_possible)) + ? "pmp " : empty; + if ( + (GNET_PROPERTY(enable_upnp) || GNET_PROPERTY(enable_natpmp)) && + GNET_PROPERTY(port_mapping_successful) + ) { + pmp = GNET_PROPERTY(enable_natpmp) ? "NMP " : "UMP "; } if (dht_enabled()) { @@ -177,11 +178,13 @@ fd = empty; } - gm_snprintf(flags, sizeof flags, - "<%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s>", + str_bprintf(flags, sizeof flags, + "<%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s>", pmp, GNET_PROPERTY(download_queue_frozen) ? "DFZ " : empty, GNET_PROPERTY(ancient_version) ? "CLK " : empty, + GNET_PROPERTY(tcp_no_listening) ? "!TL " : empty, + GNET_PROPERTY(net_buffer_shortage) ? "!IP " : empty, fd, GNET_PROPERTY(uploads_stalling) ? "STL " : empty, GNET_PROPERTY(uploads_bw_ignore_stolen) ? "gUL " : empty, @@ -197,7 +200,7 @@ fw, dht, settings_is_ultra() ? "UP" : "LF"); - gm_snprintf(buf, sizeof buf, + str_bprintf(buf, sizeof buf, "+%s+\n" "| %-18s%51s |\n" "|%s|\n", @@ -205,12 +208,12 @@ shell_write(sh, buf); } - /* General status */ + /* General status */ { const char *blackout; short_string_t leaf_switch; short_string_t ultra_check; - + leaf_switch = timestamp_get_string( GNET_PROPERTY(node_last_ultra_leaf_switch)); ultra_check = timestamp_get_string( @@ -227,7 +230,7 @@ blackout = "None"; } - gm_snprintf(buf, sizeof buf, + str_bprintf(buf, sizeof buf, "| Mode: %-9s Last Switch: %-19s%2s|\n" "| Uptime: %-9s Last Check: %-19s%2s|\n" "| Port: %-9u Blackout: %-7s%14s|\n" @@ -237,7 +240,7 @@ : "offline", GNET_PROPERTY(node_last_ultra_leaf_switch) ? leaf_switch.str : "never", space, - short_time(delta_time(now, GNET_PROPERTY(start_stamp))), + short_time_ascii(delta_time(now, GNET_PROPERTY(start_stamp))), GNET_PROPERTY(node_last_ultra_check) ? ultra_check.str : "never", space, socket_listen_port(), blackout, space, @@ -245,35 +248,36 @@ shell_write(sh, buf); } - /* IPv4 info */ + /* IPv4 info */ switch (GNET_PROPERTY(network_protocol)) { case NET_USE_BOTH: case NET_USE_IPV4: - gm_snprintf(buf, sizeof buf, + str_bprintf(buf, sizeof buf, "| IPv4: %-44s Since: %-12s|\n", host_addr_to_string(listen_addr()), - short_time(delta_time(now, GNET_PROPERTY(current_ip_stamp)))); + short_time_ascii(delta_time(now, GNET_PROPERTY(current_ip_stamp)))); shell_write(sh, buf); } - /* IPv6 info */ + /* IPv6 info */ switch (GNET_PROPERTY(network_protocol)) { case NET_USE_BOTH: - gm_snprintf(buf, sizeof buf, "|%s|\n", dashes); + str_bprintf(buf, sizeof buf, "|%s|\n", dashes); shell_write(sh, buf); /* FALL THROUGH */ case NET_USE_IPV6: - gm_snprintf(buf, sizeof buf, + str_bprintf(buf, sizeof buf, "| IPv6: %-44s Since: %-12s|\n", host_addr_to_string(listen_addr6()), - short_time(delta_time(now, GNET_PROPERTY(current_ip6_stamp)))); + short_time_ascii( + delta_time(now, GNET_PROPERTY(current_ip6_stamp)))); shell_write(sh, buf); } /* Node counts */ - gm_snprintf(buf, sizeof buf, + str_bprintf(buf, sizeof buf, "|%s|\n" - "| Peers: %-7u Ultra %4u/%-7u Leaf %4u/%-6u Legacy %4u/%-4u |\n" + "| Peers: %-7u Ultra %4u/%-7u Leaf %4u/%-6u G2 hub %4u/%-4u |\n" "| Downloads %4u/%-4u Uploads %4u/%-7u Browse %4u/%-4u |\n" "|%s|\n", equals, @@ -285,8 +289,8 @@ GNET_PROPERTY(max_connections) : GNET_PROPERTY(max_ultrapeers), GNET_PROPERTY(node_leaf_count), GNET_PROPERTY(max_leaves), - GNET_PROPERTY(node_normal_count), - GNET_PROPERTY(normal_connections), + GNET_PROPERTY(node_g2_count), + GNET_PROPERTY(max_g2_hubs), GNET_PROPERTY(dl_active_count), GNET_PROPERTY(dl_running_count), GNET_PROPERTY(ul_running), GNET_PROPERTY(ul_registered), GNET_PROPERTY(html_browse_served) + GNET_PROPERTY(qhits_browse_served), @@ -295,8 +299,8 @@ shell_write(sh, buf); /* Bandwidths */ - { - const gboolean metric = GNET_PROPERTY(display_metric_units); + { + const bool metric = GNET_PROPERTY(display_metric_units); short_string_t gnet_in, http_in, leaf_in, gnet_out, http_out, leaf_out; short_string_t dht_in, dht_out; gnet_bw_stats_t bw_stats, bw2_stats; @@ -313,15 +317,15 @@ gnet_out = short_rate_get_string( cur ? bw_stats.current + bw2_stats.current : bw_stats.average + bw2_stats.average, metric); - + gnet_get_bw_stats(BW_HTTP_IN, &bw_stats); http_in = short_rate_get_string( cur ? bw_stats.current : bw_stats.average, metric); - + gnet_get_bw_stats(BW_HTTP_OUT, &bw_stats); http_out = short_rate_get_string( cur ? bw_stats.current : bw_stats.average, metric); - + gnet_get_bw_stats(BW_LEAF_IN, &bw_stats); leaf_in = short_rate_get_string( cur ? bw_stats.current : bw_stats.average, metric); @@ -338,7 +342,7 @@ dht_out = short_rate_get_string( cur ? bw_stats.current : bw_stats.average, metric); - gm_snprintf(buf, sizeof buf, + str_bprintf(buf, sizeof buf, "| %-70s|\n" "|%71s|\n" "| %5s In: %13s %13s %13s %13s |\n" @@ -350,29 +354,29 @@ bwtype, gnet_out.str, leaf_out.str, http_out.str, dht_out.str); shell_write(sh, buf); } - + { char line128; - gboolean metric = GNET_PROPERTY(display_metric_units); + bool metric = GNET_PROPERTY(display_metric_units); - gm_snprintf(buf, sizeof buf, "|%s|\n", equals); + str_bprintf(buf, sizeof buf, "|%s|\n", equals); shell_write(sh, buf); concat_strings(line, sizeof line, "Shares ", uint64_to_string(shared_files_scanned()), " file", - shared_files_scanned() == 1 ? "" : "s", + plural(shared_files_scanned()), " ", short_kb_size(shared_kbytes_scanned(), metric), " total", - (void *) 0); - gm_snprintf(buf, sizeof buf, + NULL_PTR); + str_bprintf(buf, sizeof buf, "| %-35s Up: %-11s Down: %-11s |\n", line, short_byte_size(GNET_PROPERTY(ul_byte_count), metric), short_byte_size2(GNET_PROPERTY(dl_byte_count), metric)); shell_write(sh, buf); - gm_snprintf(buf, sizeof buf, "+%s+\n", dashes); + str_bprintf(buf, sizeof buf, "+%s+\n", dashes); shell_write(sh, buf); } @@ -390,13 +394,14 @@ { g_assert(argv); g_assert(argc > 0); - + return "status -i\n" "Display status pane summary\n" "-i : display instantaneous bandwidth instead of average\n" "Upper-right corner flags mimic status icons in the GUI:\n" "(from left to right in lightening order)\n" - " PMP port mapping configured via UPnP or NAT-PMP\n" + " UMP port mapping configured via UPnP\n" + " NMP port mapping configured via NAT-PMP\n" " pmp port mapping available (UPnP or NAT-PMP)\n" " DFZ download queue is frozen\n" " CLK clock, GTKG expired\n"
View file
gtk-gnutella-1.1.9.tar.bz2/src/shell/task.c
Added
@@ -0,0 +1,212 @@ +/* + * Copyright (c) 2013, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup shell + * @file + * + * The "task" command. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#include "cmd.h" + +#include "lib/ascii.h" +#include "lib/bg.h" +#include "lib/pslist.h" +#include "lib/str.h" +#include "lib/stringify.h" /* For compact_time_ms() */ +#include "lib/thread.h" + +#include "lib/override.h" /* Must be the last header included */ + +static enum shell_reply +shell_exec_task_list(struct gnutella_shell *sh, + int argc, const char *argv) +{ + const char *opt_s; + const option_t options = { + { "s", &opt_s }, + }; + int parsed; + str_t *s; + pslist_t *info, *sl; + size_t maxlen = 0; + + shell_check(sh); + g_assert(argv); + g_assert(argc > 0); + + parsed = shell_options_parse(sh, argv, options, N_ITEMS(options)); + if (parsed < 0) + return REPLY_ERROR; + + shell_write(sh, "100~\n"); + if (opt_s != NULL) { + shell_write(sh, + "T Tasks Run-Q Sleep-Q Ended Slice Period Run-time Name\n"); + } else { + shell_write(sh, + "T Flag S Work-Q Handled St Progress Run-time Name (Sched)\n"); + } + + info = opt_s != NULL ? bg_sched_info_list() : bg_info_list(); + s = str_new(80); + + if (NULL == opt_s) { + PSLIST_FOREACH(info, sl) { + bgtask_info_t *bi = sl->data; + size_t len; + + bgtask_info_check(bi); + len = strlen(bi->tname); + maxlen = MAX(len, maxlen); + } + + maxlen++; + } + + PSLIST_FOREACH(info, sl) { + if (opt_s != NULL) { + bgsched_info_t *bsi = sl->data; + + bgsched_info_check(bsi); + + if (THREAD_INVALID_ID == bsi->stid) + str_printf(s, "%-2s ", "-"); + else + str_printf(s, "%-2d ", bsi->stid); + str_catf(s, "%-5d ", bsi->runcount); + str_catf(s, "%-5d ", bsi->runq_count); + str_catf(s, "%-7d ", bsi->sleepq_count); + str_catf(s, "%-5zu ", bsi->completed); + str_catf(s, "%'5d ", bsi->max_life / 1000); + if (bsi->period != 0) + str_catf(s, "%'6d ", bsi->period); + else + str_catf(s, "%6s ", "-"); + str_catf(s, "%9s ", compact_time_ms(bsi->wtime)); + str_catf(s, "\"%s\"", bsi->name); + } else { + bgtask_info_t *bi = sl->data; + + bgtask_info_check(bi); + + if (THREAD_INVALID_ID == bi->stid) + str_printf(s, "%-2s ", "-"); + else + str_printf(s, "%-2d ", bi->stid); + str_putc(s, bi->locked ? ' ' : '!'); + if (bi->cancelling) + str_putc(s, 'C'); + else if (bi->cancelled) + str_putc(s, 'c'); + else + str_putc(s, '-'); + str_putc(s, bi->daemon ? 'd' : '-'); + str_putc(s, bi->running ? 'R' : 'S'); + str_putc(s, ' '); + str_catf(s, "%-1zu ", bi->signals); + if (bi->daemon) { + str_catf(s, "%-6zu ", bi->wq_count); + str_catf(s, "%-7zu ", bi->wq_done); + } else { + str_catf(s, "%-6s ", "-"); + str_catf(s, "%-7s ", "-"); + } + str_catf(s, "%-2d ", bi->stepcnt); + str_catf(s, "%2d:%-5d ", bi->step, bi->seqno); + str_catf(s, "%9s ", compact_time_ms(bi->wtime)); + str_catf(s, "\"%s\"%*s(%s)", bi->tname, + (int) (maxlen - strlen(bi->tname)), "", bi->sname); + } + str_putc(s, '\n'); + shell_write(sh, str_2c(s)); + } + + str_destroy_null(&s); + if (opt_s) { + bg_sched_info_list_free_null(&info); + } else { + bg_info_list_free_null(&info); + } + shell_write(sh, ".\n"); + + return REPLY_READY; +} + +/** + * Handles the task command. + */ +enum shell_reply +shell_exec_task(struct gnutella_shell *sh, int argc, const char *argv) +{ + shell_check(sh); + g_assert(argv); + g_assert(argc > 0); + + if (argc < 2) + return REPLY_ERROR; + +#define CMD(name) G_STMT_START { \ + if (0 == ascii_strcasecmp(argv1, #name)) \ + return shell_exec_task_ ## name(sh, argc - 1, argv + 1); \ +} G_STMT_END + + CMD(list); + +#undef CMD + + shell_set_formatted(sh, _("Unknown operation \"%s\""), argv1); + return REPLY_ERROR; +} + +const char * +shell_summary_task(void) +{ + return "Background task monitoring interface"; +} + +const char * +shell_help_task(int argc, const char *argv) +{ + g_assert(argv); + g_assert(argc > 0); + + if (argc > 1) { + if (0 == ascii_strcasecmp(argv1, "list")) { + return "task list -s\n" + "list all running background tasks\n" + "-s: show schedulers instead of tasks\n"; + } + } else { + return "task list -s\n"; + } + return NULL; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/shell/thread.c
Added
@@ -0,0 +1,291 @@ +/* + * Copyright (c) 2013, Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup shell + * @file + * + * The "thread" command. + * + * @author Raphael Manfredi + * @date 2013 + */ + +#include "common.h" + +#include "cmd.h" + +#include "lib/ascii.h" +#include "lib/dump_options.h" +#include "lib/log.h" +#include "lib/options.h" +#include "lib/pow2.h" /* For popcount() */ +#include "lib/stacktrace.h" /* For stacktrace_function_name() */ +#include "lib/str.h" +#include "lib/teq.h" +#include "lib/thread.h" +#include "lib/vmm.h" /* For compat_pagesize() */ +#include "lib/xmalloc.h" /* For xmalloc_thread_uses_local_pool() */ + +#include "lib/override.h" /* Must be the last header included */ + +#define ACTIVE_THRESH 10 /**< (s) thread inactivity threshold */ + +static enum shell_reply +shell_exec_thread_list(struct gnutella_shell *sh, + int argc, const char *argv) +{ + int i; + str_t *s; + time_t now; + + shell_check(sh); + g_assert(argv); + g_assert(argc > 0); + + if (1 != argc) { + shell_set_formatted(sh, "Invalid parameter count (%d)", argc); + goto failure; + } + + shell_write(sh, "100~\n"); + shell_write(sh, + "# Flags LCK Sigs Evts STK Usage High Local Priv Name\n"); + + s = str_new(80); + now = tm_time(); + + for (i = 0; i < THREAD_MAX; i++) { + thread_info_t info; + size_t stack, used, top; + + if (-1 == thread_get_info(i, &info)) + continue; + + if (0 == (stack = info.stack_size)) + stack = (info.high_qid - info.low_qid + 1) * compat_pagesize(); + if (info.stack_addr_growing) { + used = ptr_diff(info.last_sp, info.bottom_sp); + top = ptr_diff(info.top_sp, info.bottom_sp); + } else { + used = ptr_diff(info.bottom_sp, info.last_sp); + top = ptr_diff(info.bottom_sp, info.top_sp); + } + + str_reset(s); + str_catf(s, "%-2d ", i); + str_putc(s, info.suspended ? 'H' : /* Halted */ + info.cancelled ? 'c' : '-'); + str_putc(s, xmalloc_thread_uses_local_pool(i) ? 'p' : '-'); + str_putc(s, info.main_thread ? 'M' : '-'); + str_putc(s, info.discovered ? 'D' : 'C'); + str_putc(s, info.exited ? 'E' : + info.exiting ? 'X' : + (info.blocked || info.sleeping) ? 'S' : + (info.discovered && !info.main_thread && + delta_time(now, info.last_seen) > ACTIVE_THRESH) ? 'I' : 'R'); + str_putc(s, ' '); + str_catf(s, "%-3zd ", info.locks); + str_catf(s, "%-4d ", popcount(info.sig_pending)); + if (teq_is_supported(i)) { + str_catf(s, "%-4zu ", teq_count(i)); + } else { + str_catf(s, "%-4s ", "-"); + } + str_catf(s, "%-3zu ", stack / 1024); + if (used < 100 * 1024) { + str_catf(s, "%5.2f ", used / 1024.0); + } else { + str_catf(s, "%5zu ", (used + 512) / 1024); + } + if (top < 100 * 1024) { + str_catf(s, "%5.2f ", top / 1024.0); + } else { + str_catf(s, "%5zu ", (top + 512) / 1024); + } + str_catf(s, "%-5zu ", info.local_vars); + str_catf(s, "%-5zu ", info.private_vars); + if (info.name != NULL) + str_catf(s, "\"%s\"", info.name); + else if (info.entry != NULL) + str_catf(s, "%s()", stacktrace_function_name(info.entry)); + else if (info.main_thread) + STR_CAT(s, "main()"); + else + str_putc(s, '-'); + + str_putc(s, '\n'); + shell_write(sh, str_2c(s)); + } + + str_destroy_null(&s); + shell_write(sh, ".\n"); + + return REPLY_READY; + +failure: + return REPLY_ERROR; +} + +static enum shell_reply +shell_exec_thread_stats(struct gnutella_shell *sh, + int argc, const char *argv) +{ + const char *pretty; + const option_t options = { + { "p", &pretty }, /* pretty-print */ + }; + int parsed; + unsigned opt = 0; + logagent_t *la = log_agent_string_make(0, "THREAD "); + + shell_check(sh); + + parsed = shell_options_parse(sh, argv, options, N_ITEMS(options)); + if (parsed < 0) + return REPLY_ERROR; + + argv += parsed; /* args0 is first command argument */ + argc -= parsed; /* counts only command arguments now */ + + if (0 != argc) + return REPLY_ERROR; + + if (pretty != NULL) + opt |= DUMP_OPT_PRETTY; + + thread_dump_stats_log(la, opt); + + shell_write(sh, "100~\n"); + shell_write(sh, log_agent_string_get(la)); + shell_write(sh, ".\n"); + + log_agent_free_null(&la); + + return REPLY_READY; +} + +static enum shell_reply +shell_exec_thread_elements(struct gnutella_shell *sh, + int argc, const char *argv) +{ + const char *all; + const option_t options = { + { "a", &all }, /* include all items */ + }; + int parsed; + unsigned opt = 0; + logagent_t *la = log_agent_string_make(0, "THREAD "); + + shell_check(sh); + + parsed = shell_options_parse(sh, argv, options, N_ITEMS(options)); + if (parsed < 0) + return REPLY_ERROR; + + argv += parsed; /* args0 is first command argument */ + argc -= parsed; /* counts only command arguments now */ + + if (0 != argc) + return REPLY_ERROR; + + if (NULL == all) + opt |= DUMP_OPT_SHORT; /* -a not given: skip reusable elements */ + + thread_dump_thread_elements_log(la, opt); + + shell_write(sh, "100~\n"); + shell_write(sh, log_agent_string_get(la)); + shell_write(sh, ".\n"); + + log_agent_free_null(&la); + + return REPLY_READY; +} + +/** + * Handles the thread command. + */ +enum shell_reply +shell_exec_thread(struct gnutella_shell *sh, int argc, const char *argv) +{ + shell_check(sh); + g_assert(argv); + g_assert(argc > 0); + + if (argc < 2) + return REPLY_ERROR; + +#define CMD(name) G_STMT_START { \ + if (0 == ascii_strcasecmp(argv1, #name)) \ + return shell_exec_thread_ ## name(sh, argc - 1, argv + 1); \ +} G_STMT_END + + CMD(list); + CMD(stats); + CMD(elements); + +#undef CMD + + shell_set_formatted(sh, _("Unknown operation \"%s\""), argv1); + return REPLY_ERROR; +} + +const char * +shell_summary_thread(void) +{ + return "Thread monitoring interface"; +} + +const char * +shell_help_thread(int argc, const char *argv) +{ + g_assert(argv); + g_assert(argc > 0); + + if (argc > 1) { + if (0 == ascii_strcasecmp(argv1, "list")) { + return "thread list\n" + "list all running threads\n"; + } + else if (0 == ascii_strcasecmp(argv1, "elements")) { + return "thread elements\n" + "list all initialized thread elements\n" + "-a : include all elements, even the reusable ones\n"; + } + else if (0 == ascii_strcasecmp(argv1, "stats")) { + return "thread stats -p\n" + "show thread global statistics\n" + "-p : pretty-print numbers with thousands separators\n"; + } + } else { + return + "thread list\n" + "thread elements -a\n" + "thread stats -p\n" + ; + } + return NULL; +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/uploads.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/uploads.c
Changed
@@ -39,9 +39,10 @@ #include "if/gnet_property_priv.h" -#include "lib/glib-missing.h" #include "lib/iso3166.h" #include "lib/misc.h" +#include "lib/pslist.h" +#include "lib/str.h" #include "lib/override.h" /* Must be the last header included */ @@ -54,7 +55,7 @@ g_return_if_fail(sh); g_return_if_fail(info); - gm_snprintf(buf, sizeof buf, "%-3.3s %-16.40s %s %s@%s %s%s%s", + str_bprintf(buf, sizeof buf, "%-3.3s %-16.40s %s %s@%s %s%s%s", info->encrypted ? "(E)" : "", host_addr_to_string(info->addr), iso3166_country_cc(info->country), @@ -76,8 +77,8 @@ enum shell_reply shell_exec_uploads(struct gnutella_shell *sh, int argc, const char *argv) { - const GSList *sl; - GSList *sl_info; + const pslist_t *sl; + pslist_t *sl_info; shell_check(sh); g_assert(argv); @@ -88,7 +89,7 @@ shell_write(sh, "100~ \n"); sl_info = upload_get_info_list(); - for (sl = sl_info; sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(sl_info, sl) { print_upload_info(sh, sl->data); } upload_free_info_list(&sl_info); @@ -109,7 +110,7 @@ { g_assert(argv); g_assert(argc > 0); - + return NULL; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/version.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/version.c
Changed
@@ -37,6 +37,9 @@ #include "core/version.h" +#include "lib/log.h" +#include "lib/options.h" + #include "lib/override.h" /* Must be the last header included */ /** @@ -45,11 +48,28 @@ enum shell_reply shell_exec_version(struct gnutella_shell *sh, int argc, const char *argv) { + const char *all; + const option_t options = { + { "a", &all }, /* show all versions */ + }; + int parsed; + shell_check(sh); g_assert(argv); g_assert(argc > 0); - shell_write_line(sh, REPLY_READY, version_string); + parsed = shell_options_parse(sh, argv, options, N_ITEMS(options)); + if (parsed < 0) + return REPLY_ERROR; + + if (all) { + logagent_t *la = log_agent_string_make(0, NULL); + version_string_dump_log(la, TRUE); + shell_write_lines(sh, REPLY_READY, log_agent_string_get(la)); + log_agent_free_null(&la); + } else { + shell_write_line(sh, REPLY_READY, version_string); + } return REPLY_READY; } @@ -65,7 +85,8 @@ g_assert(argv); g_assert(argc > 0); - return "Prints the full version string of the server.\n"; + return "Prints the full version string of the server.\n" + "-a : also display glib/GTK/TLS versions, as appropriate.\n"; } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/shell/whatis.c -> gtk-gnutella-1.1.9.tar.bz2/src/shell/whatis.c
Changed
@@ -85,7 +85,7 @@ { g_assert(argv); g_assert(argc > 0); - + return "whatis <property>\n" "show description of property\n"; }
View file
gtk-gnutella-1.1.9.tar.bz2/src/types.h
Added
@@ -0,0 +1,193 @@ +/* + * Copyright (c) 2012 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @file + * + * Portable type definitions and other conveniences. + * + * @author Raphael Manfredi + * @date 2012 + */ + +#ifndef _types_h_ +#define _types_h_ + +/* @note This file is only for inclusion by common.h. */ + +/*** + *** Native types. + ***/ + +#ifndef __cplusplus +/* In C++, "bool" is a builtin type, cannot redefine it */ +#if 0 /* Not yet */ +typedef enum bool { + BOOL_FALSE=0, + BOOL_TRUE = 1 +} bool; +#else +typedef int bool; +#endif +#endif /* !C++ */ + +#if CHARSIZE == 1 +typedef signed char int8; +typedef unsigned char uint8; +#else +#error "no known 8-bit type." +#endif + +#if SHORTSIZE == 2 +typedef short int16; +typedef unsigned short uint16; +#else +#error "no known 16-bit type." +#endif + +#if INTSIZE == 4 +typedef int int32; +typedef unsigned int uint32; +#else +#error "no known 32-bit type." +#endif + +#if LONGSIZE == 8 +typedef long int64; +typedef unsigned long uint64; +#define INT64_CONST(x) (x##L) +#define UINT64_CONST(x) (x##UL) +#elif defined(CAN_HANDLE_64BITS) +typedef long long int64; +typedef unsigned long long uint64; +#define INT64_CONST(x) (G_EXTENSION(x##LL)) +#define UINT64_CONST(x) (G_EXTENSION(x##ULL)) +#else +#error "no known 64-bit type." +#endif + +typedef unsigned char uchar; +typedef unsigned short ushort; +typedef unsigned int uint; +typedef unsigned long ulong; + +/*** + *** Generic callback types for data structures. + ***/ + +/* Data comparison, with and without context: returns values <0, 0, >0 */ + +typedef int (*cmp_fn_t)(const void *a, const void *b); +typedef int (*cmp_data_fn_t)(const void *a, const void *b, void *data); + +/* String comparison, with and without context: returns values <0, 0, >0 */ + +typedef int (*strcmp_fn_t)(const char *a, const char *b); +typedef int (*strcmp_data_fn_t)(const char *a, const char *b, void *data); + +/* Data equality */ + +typedef bool (*eq_fn_t)(const void *a, const void *b); +typedef bool (*eq_data_fn_t)(const void *a, const void *b, void *data); + +/* Hashing functions */ + +typedef uint (*hash_fn_t)(const void *key); +typedef uint (*hash_data_fn_t)(const void *key, void *data); + +/* Iterator callbacks for data containers, optionally with constant data */ + +typedef void (*data_fn_t)(void *data, void *udata); +typedef void (*cdata_fn_t)(const void *data, void *udata); +typedef bool (*data_rm_fn_t)(void *data, void *udata); +typedef bool (*cdata_rm_fn_t)(const void *data, void *udata); + +/* Data structure callback for selection & matching */ + +typedef bool (*match_fn_t)(const void *data, void *udata); + +/* Iterator callbacks for associative arrays, optionally with constant key */ + +typedef void (*keyval_fn_t)(void *key, void *value, void *data); +typedef void (*ckeyval_fn_t)(const void *key, void *value, void *data); +typedef bool (*keyval_rm_fn_t)(void *key, void *value, void *data); +typedef bool (*ckeyval_rm_fn_t)(const void *key, void *value, void *data); + +/* Allocator routine signatures, with or without allocating context */ + +typedef void *(*alloc_fn_t)(size_t n); +typedef void *(*alloc_data_fn_t)(void *data, size_t n); + +/* Data freeing callbacks signatures, with or without allocating context */ + +typedef void (*free_fn_t)(void *data); +typedef void (*free_keyval_fn_t)(void *key, void *value); +typedef void (*free_keyval_data_fn_t)(void *key, void *value, void *user_data); +typedef void (*free_size_fn_t)(void *data, size_t len); +typedef void (*free_data_fn_t)(void *data, void *user_data); + +/* Object copying */ + +typedef void *(*copy_fn_t)(const void *src); +typedef void *(*copy_data_fn_t)(const void *src, void *data); + +/* Generic event notification, with or without context */ + +typedef void (*notify_fn_t)(void *data); +typedef void (*notify_data_fn_t)(void *data, void *user_data); + +/* Generic callbacks */ + +typedef void (*callback_fn_t)(void); +typedef int (*action_fn_t)(void); + +/* Generic object field extraction routine */ + +typedef void *(*get_fn_t)(const void *obj); + +/* Generic processing routine */ + +typedef void *(*process_fn_t)(void *); + +/* Generic stringifiers */ + +typedef const char *(*stringify_fn_t)(const void *data); +typedef const char *(*stringify_len_fn_t)(const void *data, size_t len); + +/* Random number generators (32-bit and 64-bit routines) */ + +typedef uint32 (*random_fn_t)(void); +typedef uint64 (*random64_fn_t)(void); +typedef void (*randfill_fn_t)(void *data, size_t len); + +/* Generic predicate, testing a condition on some data */ + +typedef bool (*predicate_fn_t)(void *data); + +/* Generic data feed */ + +typedef void (*feed_fn_t)(const void *data, size_t len); + +#endif /* _types_h_ */ + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/src/ui/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-30 -: $X-Id: Jmake.tmpl 30 2009-10-28 07:45:28Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -50,16 +50,18 @@ $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 18 2006-12-27 10:35:09Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Start of Jmakefile -# $X-Id: Jmakefile 6494 2004-08-25 05:40:41Z rmanfredi $ +# $X-Id$ all:: -depend:: +depend:: sub_depend + +sub_depend:: @case '${MFLAGS}' in *ik*) set +e;; esac; \ for i in $(SUBDIRS) ;\ do \ @@ -86,6 +88,11 @@ $(RM) Makefile config.sh install:: local_install sub_install + @exit 0 + +install-strip:: local_install-strip sub_install-strip + @exit 0 + install.man:: maybe_install.man sub_install.man deinstall:: sub_deinstall local_deinstall deinstall.man:: sub_deinstall.man maybe_deinstall.man @@ -116,6 +123,8 @@ local_clobber:: $(RM) tags +depend:: + ######################################################################## # Rules for building in sub-directories -- do not edit @@ -123,13 +132,16 @@ @case '${MFLAGS}' in *ik*) set +e;; esac; \ for i in $(SUBDIRS) ;\ do \ - (cd $$i ; echo $(VERB) "in $(DIR)$$i..."; \ + (cd $$i ; echo "$(VERB) in $(DIR)$$i..."; \ $(MAKE) $(MFLAGS) $(FLAGS) $(TARGET)) || exit 1; \ done sub_install:: @$(MAKE) subdirs TARGET=install VERB="Installing" FLAGS= +sub_install-strip:: + @$(MAKE) subdirs TARGET=install-strip VERB="Installing (strip)" FLAGS= + sub_deinstall:: @$(MAKE) subdirs TARGET=deinstall VERB="Deinstalling" FLAGS= @echo "Back to $(CURRENT) for "deinstall... @@ -198,6 +210,7 @@ @$(MAKE) subdirs TARGET=all VERB="Making all" FLAGS= local_install:: +local_install-strip:: local_deinstall:: local_install.man:: local_deinstall.man::
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/Jmakefile -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/Jmakefile
Changed
@@ -28,9 +28,8 @@ ;# $Id$ LSRC = \ - bitzi.c \ - downloads_common.c \ clipboard.c \ + downloads_common.c \ drag.c \ drop.c \ filter.c \
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-95 -: $X-Id: Jmake.tmpl 69 2011-01-09 13:57:07Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -39,7 +39,7 @@ AR = ar rc CC = $cc CTAGS = ctags -JCFLAGS = \$(CFLAGS) $optimize $ccflags $large +JCFLAGS = \$(CFLAGS) $optimize $pthread $ccflags $large JCPPFLAGS = $cppflags LN = $ln MKDEP = $mkdep \$(DPFLAGS) \$(JCPPFLAGS) -- @@ -69,7 +69,7 @@ $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 94 2011-02-10 14:06:58Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Force 'make depend' to be performed first -- do not edit @@ -81,12 +81,11 @@ ######################################################################## # Start of Jmakefile -# $X-Id: Jmakefile 19197 2011-05-31 20:55:41Z rmanfredi $ +# $X-Id$ LSRC = \ - bitzi.c \ - downloads_common.c \ clipboard.c \ + downloads_common.c \ drag.c \ drop.c \ filter.c \ @@ -114,9 +113,8 @@ visual_progress.c LOBJ = \ - bitzi.o \ - downloads_common.o \ clipboard.o \ + downloads_common.o \ drag.o \ drop.o \ filter.o \ @@ -280,6 +278,11 @@ $(RM) Makefile config.sh install:: local_install sub_install + @exit 0 + +install-strip:: local_install-strip sub_install-strip + @exit 0 + install.man:: maybe_install.man sub_install.man deinstall:: sub_deinstall local_deinstall deinstall.man:: sub_deinstall.man maybe_deinstall.man @@ -319,13 +322,16 @@ @case '${MFLAGS}' in *ik*) set +e;; esac; \ for i in $(SUBDIRS) ;\ do \ - (cd $$i ; echo $(VERB) "in $(DIR)$$i..."; \ + (cd $$i ; echo "$(VERB) in $(DIR)$$i..."; \ $(MAKE) $(MFLAGS) $(FLAGS) $(TARGET)) || exit 1; \ done sub_install:: @$(MAKE) subdirs TARGET=install VERB="Installing" FLAGS= +sub_install-strip:: + @$(MAKE) subdirs TARGET=install-strip VERB="Installing (strip)" FLAGS= + sub_deinstall:: @$(MAKE) subdirs TARGET=deinstall VERB="Deinstalling" FLAGS= @echo "Back to $(CURRENT) for "deinstall... @@ -394,6 +400,7 @@ @$(MAKE) subdirs TARGET=all VERB="Making all" FLAGS= local_install:: +local_install-strip:: local_deinstall:: local_install.man:: local_deinstall.man::
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/clipboard.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/clipboard.c
Changed
@@ -43,7 +43,7 @@ clipboard_set_text(GtkWidget *unused_owner, const char *text) { (void) unused_owner; - + gtk_clipboard_clear(gtk_clipboard_get(GDK_SELECTION_PRIMARY)); gtk_clipboard_clear(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)); @@ -59,7 +59,7 @@ } } } - + #else /* Gtk+ 1.2 */ #define CLIPBOARD_FETCH_TEXT ((const void *) -1)
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/columns.h -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/columns.h
Changed
@@ -139,7 +139,6 @@ c_sr_mime, c_sr_count, c_sr_loc, - c_sr_meta, /**< meta-data info column */ c_sr_vendor, c_sr_info, c_sr_route,
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/downloads_common.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/downloads_common.c
Changed
@@ -36,8 +36,6 @@ #include "if/bridge/ui2c.h" #include "if/core/bsched.h" -#include "if/core/http.h" -#include "if/core/http.h" #include "if/core/pproxy.h" #include "if/core/sockets.h" #include "if/gui_property_priv.h" @@ -45,13 +43,16 @@ #include "lib/atoms.h" #include "lib/concat.h" #include "lib/glib-missing.h" -#include "lib/hashlist.h" #include "lib/halloc.h" +#include "lib/hashlist.h" +#include "lib/hset.h" +#include "lib/htable.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/timestamp.h" -#include "lib/url_factory.h" #include "lib/utf8.h" #include "lib/walloc.h" +#include "lib/xmalloc.h" #include "lib/override.h" /* Must be the last header included */ @@ -96,9 +97,9 @@ static gnet_fi_t last_shown; static gboolean last_shown_valid; -static GHashTable *fi_handles; /* gnet_fi_t -> row */ -static GHashTable *fi_updates; /* gnet_fi_t */ -static GHashTable *src_updates; /* gnet_src_t */ +static htable_t *fi_handles; /* gnet_fi_t -> row */ +static hset_t *fi_updates; /* gnet_fi_t */ +static hset_t *src_updates; /* gnet_src_t */ static enum nb_downloads_page current_page; @@ -175,7 +176,7 @@ switch (d->status) { case GTA_DL_RECEIVING: case GTA_DL_IGNORING: - gm_snprintf(buf, sizeof buf, "%5.2f%%", + str_bprintf(buf, sizeof buf, "%5.2f%%", 100.0 * guc_download_source_progress(d)); break; default: @@ -215,7 +216,7 @@ if (info->tth_num_leaves > 0) { char buf1024; - gm_snprintf(buf, sizeof buf, + str_bprintf(buf, sizeof buf, _("leaf hashes: %lu, depth: %u, granularity: %s"), (unsigned long) info->tth_num_leaves, info->tth_depth, @@ -226,13 +227,6 @@ _("Not available")); } - if (info->sha1) { - fi_gui_append_detail(FI_GUI_DETAIL_UNSPECIFIED, _("External metadata"), - NULL); /* Separator */ - fi_gui_append_detail(FI_GUI_DETAIL_BITZI, _("Bitzi URL"), - url_for_bitzi_lookup(info->sha1)); - } - guc_fi_free_info(info); } @@ -263,7 +257,51 @@ concat_strings(buf, sizeof buf, compact_size(length, metric), range_start0 ? " @ " : "", range_start, - (void *)0); + NULL_PTR); + + return buf; +} + +/** + * Generates status for the queued download showing the core message and + * appending the rescheduling information. + * + * @param buf where formatting is done + * @param buflen length of formatting buffer + * @param d the download for which we're generating a status + * + * @return the address of buf + */ +static const char * +download_gui_rescheduling(char *buf, size_t buflen, const struct download *d) +{ + char resched80; + time_t rescheduled; + + /* + * Rescheduling time is the largest of `retry_after' (absolute) and + * `timeout_delay' secs after `last_update'. + * See download_pickup_queued() for details on how this is handled. + * --RAM, 2007-05-06 + */ + + rescheduled = d->last_update + d->timeout_delay; + rescheduled = MAX(rescheduled, d->retry_after); + + time_locale_to_string_buf(rescheduled, resched, sizeof resched); + + if (NULL == d->remove_msg) { + str_bprintf(buf, buflen, "%s %s #%u", + delta_time(rescheduled, tm_time()) > 0 ? + _("Rescheduled for") : _("Restartable since"), + lazy_locale_to_ui_string(resched), d->retries); + } else { + str_bprintf(buf, buflen, "%s - %s %s #%u", + d->remove_msg, + delta_time(rescheduled, tm_time()) > 0 ? + _("rescheduled for") : _("restartable since"), + lazy_locale_to_ui_string(resched), d->retries); + } return buf; } @@ -280,7 +318,7 @@ download_check(d); fi = d->file_info; file_info_check(fi); - + switch (d->status) { case GTA_DL_ACTIVE_QUEUED: /* JA, 31 jan 2003 Active queueing */ { @@ -290,34 +328,34 @@ elapsed = delta_time(now, d->last_update); elapsed = MAX(0, elapsed); elapsed = MIN(elapsed, INT_MAX); - - rw = gm_snprintf(tmpstr, sizeof(tmpstr), "%s", _("Queued")); + + rw = str_bprintf(tmpstr, sizeof(tmpstr), "%s", _("Queued")); if (guc_get_parq_dl_position(d) > 0) { - rw += gm_snprintf(&tmpstrrw, sizeof(tmpstr)-rw, + rw += str_bprintf(&tmpstrrw, sizeof(tmpstr)-rw, _(" (slot %u"), /* ) */ guc_get_parq_dl_position(d)); if (guc_get_parq_dl_queue_length(d) > 0) { - rw += gm_snprintf(&tmpstrrw, sizeof(tmpstr)-rw, + rw += str_bprintf(&tmpstrrw, sizeof(tmpstr)-rw, "/%u", (unsigned) guc_get_parq_dl_queue_length(d)); } if (guc_get_parq_dl_eta(d) > 0) { - rw += gm_snprintf(&tmpstrrw, sizeof(tmpstr)-rw, + rw += str_bprintf(&tmpstrrw, sizeof(tmpstr)-rw, _(", ETA: %s"), short_time((guc_get_parq_dl_eta(d) - elapsed))); } - rw += gm_snprintf(&tmpstrrw, sizeof(tmpstr)-rw, /* ( */ ")"); + rw += str_bprintf(&tmpstrrw, sizeof(tmpstr)-rw, /* ( */ ")"); } delay = guc_get_parq_dl_retry_delay(d) - elapsed; delay = MAX(0, delay); - rw += gm_snprintf(&tmpstrrw, sizeof(tmpstr)-rw, + rw += str_bprintf(&tmpstrrw, sizeof(tmpstr)-rw, _(" retry in %us"), (unsigned) delay); } @@ -325,8 +363,8 @@ * If source is a partial source, show it. */ - if (d->ranges != NULL) { - rw += gm_snprintf(&tmpstrrw, sizeof(tmpstr)-rw, + if (download_is_partial(d)) { + rw += str_bprintf(&tmpstrrw, sizeof(tmpstr)-rw, " <PFS %4.02f%%>", d->ranges_size * 100.0 / fi->size); } @@ -336,10 +374,15 @@ case GTA_DL_PASSIVE_QUEUED: /* RAM, 2007-08-19 Passive queueing */ case GTA_DL_QUEUED: if (FILE_INFO_COMPLETE(d->file_info)) { - rw = gm_snprintf(tmpstr, sizeof tmpstr, _("Complete")); - status = tmpstr; + if (d->remove_msg != NULL) { + /* Show message if present */ + status = download_gui_rescheduling(tmpstr, sizeof tmpstr, d); + } else { + str_bprintf(tmpstr, sizeof tmpstr, _("Complete")); + status = tmpstr; + } } else { - status = d->remove_msg ? d->remove_msg : ""; + status = download_gui_rescheduling(tmpstr, sizeof tmpstr, d); } break; @@ -359,18 +402,18 @@ if (cp->done) { if (cp->sent) - rw = gm_snprintf(tmpstr, sizeof(tmpstr), + rw = str_bprintf(tmpstr, sizeof(tmpstr), cp->directly ? _("Push sent directly") : _("Push sent")); else - rw = gm_snprintf(tmpstr, sizeof(tmpstr), + rw = str_bprintf(tmpstr, sizeof(tmpstr), _("Failed to send push")); } else - rw = gm_snprintf(tmpstr, sizeof(tmpstr), + rw = str_bprintf(tmpstr, sizeof(tmpstr), _("Sending push")); - rw += gm_snprintf(&tmpstrrw, sizeof(tmpstr)-rw, _(" via %s"), + rw += str_bprintf(&tmpstrrw, sizeof(tmpstr)-rw, _(" via %s"), host_addr_port_to_string(cproxy_addr(cp), cproxy_port(cp))); @@ -393,7 +436,7 @@ break; } - rw += gm_snprintf(&tmpstrrw, sizeof(tmpstr)-rw, + rw += str_bprintf(&tmpstrrw, sizeof(tmpstr)-rw, ": %s", status); } @@ -417,7 +460,7 @@ case GTA_DL_REQ_SENDING: if (d->req != NULL) { - rw = gm_snprintf(tmpstr, sizeof(tmpstr), + rw = str_bprintf(tmpstr, sizeof(tmpstr), _("Sending request (%u%%)"), (unsigned) guc_download_get_http_req_percent(d)); status = tmpstr; @@ -443,15 +486,15 @@ } else { if (d->last_update != d->start_date) { time_delta_t t = delta_time(d->last_update, d->start_date); - - rw = gm_snprintf(tmpstr, sizeof(tmpstr), "%s (%s) %s", + + rw = str_bprintf(tmpstr, sizeof(tmpstr), "%s (%s) %s", FILE_INFO_COMPLETE(fi) ? _("Completed") : _("Chunk done"), short_rate( (d->chunk.end - d->chunk.start + d->chunk.overlap) / t, show_metric_units()), short_time(t)); } else { - rw = gm_snprintf(tmpstr, sizeof(tmpstr), "%s (< 1s)", + rw = str_bprintf(tmpstr, sizeof(tmpstr), "%s (< 1s)", FILE_INFO_COMPLETE(fi) ? _("Completed") : _("Chunk done")); } status = tmpstr; @@ -470,7 +513,7 @@ case GTA_DL_VERIFYING: g_assert(FILE_INFO_COMPLETE(fi)); - gm_snprintf(tmpstr, sizeof(tmpstr), + str_bprintf(tmpstr, sizeof(tmpstr), _("Computing %s (%.02f%%)"), fi->tth_check ? "TTH" : "SHA1", fi->vrfy_hashed * 100.0 / fi->size); @@ -485,7 +528,7 @@ g_assert(fi->vrfy_hashed <= fi->size); { const char *sha1_status; - + if (fi->cha1) { if (fi->sha1) { sha1_status = sha1_eq(fi->sha1, fi->cha1) @@ -497,12 +540,12 @@ } else { sha1_status = _("SHA-1 VERIFICATION FAILED"); } - rw = gm_snprintf(tmpstr, sizeof tmpstr, "%s", sha1_status); + rw = str_bprintf(tmpstr, sizeof tmpstr, "%s", sha1_status); if (fi->cha1 && fi->vrfy_hashed) { unsigned elapsed = fi->vrfy_elapsed; - - rw += gm_snprintf(&tmpstrrw, sizeof(tmpstr)-rw, + + rw += str_bprintf(&tmpstrrw, sizeof(tmpstr)-rw, " (%s) %s", short_rate(fi->vrfy_hashed / (elapsed ? elapsed : 1), show_metric_units()), @@ -511,17 +554,17 @@ switch (d->status) { case GTA_DL_MOVE_WAIT: - rw += gm_snprintf(&tmpstrrw, sizeof(tmpstr)-rw, + rw += str_bprintf(&tmpstrrw, sizeof(tmpstr)-rw, "%s", _("; Waiting for moving...")); break; case GTA_DL_MOVING: - rw += gm_snprintf(&tmpstrrw, sizeof(tmpstr)-rw, + rw += str_bprintf(&tmpstrrw, sizeof(tmpstr)-rw, _("; Moving (%.02f%%)"), ((gdouble) fi->copied / fi->size) * 100.0); break; case GTA_DL_DONE: if (fi->copy_elapsed) { - rw += gm_snprintf(&tmpstrrw, sizeof(tmpstr)-rw, + rw += str_bprintf(&tmpstrrw, sizeof(tmpstr)-rw, _("; Moved (%s) %s"), short_rate(fi->copied / fi->copy_elapsed, show_metric_units()), @@ -572,12 +615,12 @@ remain = 0; } s = remain / bps; - rw += gm_snprintf(&tmpstrrw, sizeof tmpstr - rw, + rw += str_bprintf(&tmpstrrw, sizeof tmpstr - rw, "(%s) TR: %s", short_rate(bps, show_metric_units()), short_time(s)); } else { - rw += gm_snprintf(tmpstr, sizeof tmpstr - rw, "%s", + rw += str_bprintf(tmpstr, sizeof tmpstr - rw, "%s", stalled ? _("(stalled)") : _("Receiving data")); } @@ -585,9 +628,10 @@ * If source is a partial source, show it. */ - if (d->ranges != NULL) - rw += gm_snprintf(&tmpstrrw, sizeof(tmpstr)-rw, + if (download_is_partial(d)) { + rw += str_bprintf(&tmpstrrw, sizeof(tmpstr)-rw, " <PFS %4.02f%%>", d->ranges_size * 100.0 / fi->size); + } /* * If more than one request served with the same connection, @@ -595,11 +639,11 @@ */ if (d->served_reqs) - rw += gm_snprintf(&tmpstrrw, sizeof(tmpstr)-rw, + rw += str_bprintf(&tmpstrrw, sizeof(tmpstr)-rw, " #%u", d->served_reqs + 1); if (GTA_DL_IGNORING == d->status) - rw += gm_snprintf(&tmpstrrw, sizeof(tmpstr)-rw, + rw += str_bprintf(&tmpstrrw, sizeof(tmpstr)-rw, " (%s)", _("ignoring")); status = tmpstr; @@ -615,12 +659,12 @@ dl_pipeline_check(dp); switch (dp->status) { - case GTA_DL_PIPE_SELECTED: state = _("selected next"); - case GTA_DL_PIPE_SENDING: state = _("requesting next"); - case GTA_DL_PIPE_SENT: state = _("requested next"); + case GTA_DL_PIPE_SELECTED: state = _("selected next"); break; + case GTA_DL_PIPE_SENDING: state = _("requesting next"); break; + case GTA_DL_PIPE_SENT: state = _("requested next"); break; } - rw += gm_snprintf(&tmpstrrw, sizeof(tmpstr)-rw, + rw += str_bprintf(&tmpstrrw, sizeof(tmpstr)-rw, " {%s: %s}", state, downloads_gui_pipeline_range_string(d)); } } else { @@ -636,7 +680,7 @@ { time_delta_t elapsed; unsigned when; - + elapsed = delta_time(now, d->last_update); if (elapsed < (time_delta_t) d->timeout_delay) { elapsed = MAX(0, elapsed); @@ -644,16 +688,16 @@ } else { when = 0; } - rw = gm_snprintf(tmpstr, sizeof tmpstr, _("Retry in %us"), when); + rw = str_bprintf(tmpstr, sizeof tmpstr, _("Retry in %us"), when); } status = tmpstr; break; case GTA_DL_SINKING: { char bufUINT64_DEC_BUFLEN; - + uint64_to_string_buf(d->sinkleft, buf, sizeof buf); - rw = gm_snprintf(tmpstr, sizeof tmpstr, + rw = str_bprintf(tmpstr, sizeof tmpstr, _("Sinking (%s bytes left)"), buf); } status = tmpstr; @@ -701,7 +745,7 @@ concat_strings(buf, sizeof buf, compact_size(length, metric), and_more, range_start0 ? " @ " : "", range_start, - (void *)0); + NULL_PTR); return buf; } @@ -920,7 +964,7 @@ (void) unused_menuitem; (void) unused_udata; - selected_files_foreach_source(guc_download_start); + selected_files_foreach_source(guc_download_start); } static void @@ -1048,7 +1092,7 @@ { (void) unused_menuitem; (void) unused_udata; - + SELECTED_SOURCES_FOREACH_START(d) { guc_download_start(d); } SELECTED_SOURCES_FOREACH_END @@ -1062,7 +1106,7 @@ (void) unused_menuitem; (void) unused_udata; - + gnet_prop_get_boolean_val(PROP_SEND_PUSHES, &send_pushes); gnet_prop_get_boolean_val(PROP_IS_FIREWALLED, &firewalled); @@ -1082,7 +1126,8 @@ SELECTED_SOURCES_FOREACH_START(d) { search_gui_new_browse_host(download_hostname(d), - download_addr(d), download_port(d), download_guid(d), NULL, 0); + download_addr(d), download_port(d), download_guid(d), NULL, + download_is_g2(d) ? SOCK_F_G2 : 0); } SELECTED_SOURCES_FOREACH_END } @@ -1252,7 +1297,7 @@ gnet_fi_info_t *info; g_return_if_fail(file); - + info = guc_fi_get_info(file->handle); g_return_if_fail(info); @@ -1292,7 +1337,7 @@ file->dht_lookup_pending = status.dht_lookup_pending; file->dht_lookup_successful = 0 != status.dht_values; - HFREE_NULL(file->status); + HFREE_NULL(file->status); file->status = h_strdup(guc_file_info_status_to_string(&status)); } @@ -1352,7 +1397,7 @@ fi_gui_file_get_file_url_at_cursor(GtkWidget *unused_widget) { struct fileinfo_data *file; - + (void) unused_widget; file = fi_gui_get_file_at_cursor(); return file ? fi_gui_file_get_file_url(file) : NULL; @@ -1363,7 +1408,7 @@ { struct fileinfo_data *file; - file = g_hash_table_lookup(fi_handles, uint_to_pointer(handle)); + file = htable_lookup(fi_handles, uint_to_pointer(handle)); g_return_val_if_fail(file, NULL); g_assert(handle == file->handle); return file; @@ -1374,14 +1419,14 @@ { static const struct fileinfo_data zero_data; struct fileinfo_data *file; - - g_return_if_fail(!g_hash_table_lookup(fi_handles, uint_to_pointer(handle))); + + g_return_if_fail(!htable_contains(fi_handles, uint_to_pointer(handle))); WALLOC(file); *file = zero_data; file->handle = handle; fi_gui_file_invalidate(file); - g_hash_table_insert(fi_handles, uint_to_pointer(handle), file); + htable_insert(fi_handles, uint_to_pointer(handle), file); fi_gui_file_set_filename(file); fi_gui_file_fill_status(file); fi_gui_file_update_visibility(file); @@ -1419,8 +1464,8 @@ fi_gui_clear_info(); } key = uint_to_pointer(handle); - g_hash_table_remove(fi_handles, key); - g_hash_table_remove(fi_updates, key); + htable_remove(fi_handles, key); + hset_remove(fi_updates, key); g_assert(NULL == file->sources); fi_gui_file_hide(file); @@ -1433,13 +1478,13 @@ char **aliases; g_return_if_fail(file); - + fi_gui_clear_aliases(); aliases = guc_fi_get_aliases(file->handle); g_return_if_fail(aliases); - + fi_gui_show_aliases((const char **) aliases); - g_strfreev(aliases); + xstrfreev(aliases); } static struct fileinfo_data * @@ -1514,14 +1559,14 @@ fi_gui_src_removed(gnet_src_t handle) { fi_gui_source_remove(guc_src_get_download(handle)); - g_hash_table_remove(src_updates, uint_to_pointer(handle)); + hset_remove(src_updates, uint_to_pointer(handle)); } static void fi_gui_src_status_changed(gnet_src_t handle) { void *key = uint_to_pointer(handle); - g_hash_table_insert(src_updates, key, key); + hset_insert(src_updates, key); } static void @@ -1539,11 +1584,15 @@ if (file->sources) { hash_list_iter_t *iter; + fi_gui_source_massive_update(TRUE); + iter = hash_list_iterator(file->sources); while (hash_list_iter_has_next(iter)) { fi_gui_source_show(hash_list_iter_next(iter)); } hash_list_iter_release(&iter); + + fi_gui_source_massive_update(FALSE); } downloads_gui_update_popup_sources(); } @@ -1625,11 +1674,11 @@ } } -static void +void fi_gui_fi_status_changed(gnet_fi_t handle) { void *key = uint_to_pointer(handle); - g_hash_table_insert(fi_updates, key, key); + hset_insert(fi_updates, key); } static void @@ -1640,36 +1689,34 @@ } } -static gboolean -fi_gui_file_update_queued(void *key, void *unused_value, void *unused_udata) +static bool +fi_gui_file_update_queued(const void *key, void *unused_udata) { gnet_fi_t handle = pointer_to_uint(key); - (void) unused_value; (void) unused_udata; fi_gui_file_update(handle); - return TRUE; /* Remove the handle from the hashtable */ + return TRUE; /* Remove the handle from the set */ } -static gboolean -fi_gui_source_update_queued(void *key, void *unused_value, void *unused_udata) +static bool +fi_gui_source_update_queued(const void *key, void *unused_udata) { gnet_src_t src = pointer_to_uint(key); - (void) unused_value; (void) unused_udata; fi_gui_source_update(guc_src_get_download(src)); - return TRUE; /* Remove the handle from the hashtable */ + return TRUE; /* Remove the handle from the set */ } static void fi_gui_update_display(void) { fi_gui_files_freeze(); - g_hash_table_foreach_remove(fi_updates, fi_gui_file_update_queued, NULL); - g_hash_table_foreach_remove(src_updates, fi_gui_source_update_queued, NULL); + hset_foreach_remove(fi_updates, fi_gui_file_update_queued, NULL); + hset_foreach_remove(src_updates, fi_gui_source_update_queued, NULL); fi_gui_files_thaw(); } @@ -1879,7 +1926,7 @@ { static char buf256; - gm_snprintf(buf, sizeof buf, "%u/%u/%u", + str_bprintf(buf, sizeof buf, "%u/%u/%u", file->recv_count, file->actively_queued + file->passively_queued, file->life_count); @@ -1903,7 +1950,7 @@ if (file->done && file->size) { static char buf16; - gm_snprintf(buf, sizeof buf, "%u.%02u%%", + str_bprintf(buf, sizeof buf, "%u.%02u%%", file->progress / 100, file->progress % 100); text = buf; } @@ -1921,16 +1968,13 @@ } static void -fi_handles_visualize(void *key, void *value, void *unused_udata) +fi_handles_visualize(const void *key, void *value, void *unused_udata) { - struct fileinfo_data *file; - gnet_fi_t handle; - + struct fileinfo_data *file = value; + gnet_fi_t handle = pointer_to_uint(key); + g_assert(value); (void) unused_udata; - - handle = pointer_to_uint(key); - file = value; g_assert(handle == file->handle); fi_gui_file_invalidate(file); @@ -1941,7 +1985,7 @@ fi_gui_files_visualize(void) { fi_gui_files_freeze(); - g_hash_table_foreach(fi_handles, fi_handles_visualize, NULL); + htable_foreach(fi_handles, fi_handles_visualize, NULL); fi_gui_files_thaw(); } @@ -2023,7 +2067,7 @@ } static void -on_visibility_change(gboolean visible) +on_download_visibility_change(gboolean visible) { g_return_if_fail(visible != download_gui_visible); @@ -2228,16 +2272,13 @@ } static void -fi_handles_filter(void *key, void *value, void *unused_udata) +fi_handles_filter(const void *key, void *value, void *unused_udata) { - struct fileinfo_data *file; - gnet_fi_t handle; - + struct fileinfo_data *file = value; + gnet_fi_t handle = pointer_to_uint(key); + g_assert(value); (void) unused_udata; - - handle = pointer_to_uint(key); - file = value; g_assert(handle == file->handle); fi_gui_file_update_matched(file); @@ -2267,7 +2308,7 @@ filter_regex_clear(); if (expr && 0 != strcmp(expr, "")) { int ret, flags; - + flags = REG_EXTENDED | REG_NOSUB; flags |= filter_regex_case_sensitive ? 0 : REG_ICASE; filter_regex = g_malloc(sizeof *filter_regex); @@ -2279,7 +2320,7 @@ } fi_gui_files_freeze(); fi_gui_files_filter_changed(); - g_hash_table_foreach(fi_handles, fi_handles_filter, NULL); + htable_foreach(fi_handles, fi_handles_filter, NULL); fi_gui_files_thaw(); } @@ -2327,9 +2368,9 @@ void fi_gui_common_init(void) { - fi_handles = g_hash_table_new(NULL, NULL); - fi_updates = g_hash_table_new(NULL, NULL); - src_updates = g_hash_table_new(NULL, NULL); + fi_handles = htable_create(HASH_KEY_SELF, 0); + fi_updates = hset_create(HASH_KEY_SELF, 0); + src_updates = hset_create(HASH_KEY_SELF, 0); notebook_downloads_init(); @@ -2348,31 +2389,27 @@ FREQ_SECS, 0); guc_src_add_listener(fi_gui_src_info_changed, EV_SRC_INFO_CHANGED, FREQ_SECS, 0); - + gtk_widget_set_sensitive( gui_main_window_lookup("button_downloads_clear_stopped"), TRUE); - main_gui_add_page_visibility_listener(on_visibility_change, + main_gui_add_page_visibility_listener(on_download_visibility_change, nb_main_page_downloads); main_gui_add_timer(fi_gui_timer); } -static gboolean -fi_handles_shutdown(void *key, void *value, void *unused_data) +static void +fi_handles_shutdown(const void *key, void *value, void *unused_data) { - struct fileinfo_data *file; - gnet_fi_t handle; - + struct fileinfo_data *file = value; + gnet_fi_t handle = pointer_to_uint(key); + (void) unused_data; g_assert(value); - - handle = pointer_to_uint(key); - file = value; + g_assert(handle == file->handle); fi_gui_file_free(file); - - return TRUE; /* Remove the handle from the hashtable */ } void @@ -2390,16 +2427,16 @@ guc_src_remove_listener(fi_gui_src_status_changed, EV_SRC_STATUS_CHANGED); guc_src_remove_listener(fi_gui_src_info_changed, EV_SRC_INFO_CHANGED); - main_gui_remove_page_visibility_listener(on_visibility_change, + main_gui_remove_page_visibility_listener(on_download_visibility_change, nb_main_page_downloads); filter_regex_clear(); fi_gui_clear_info(); - g_hash_table_foreach_remove(fi_handles, fi_handles_shutdown, NULL); + htable_foreach(fi_handles, fi_handles_shutdown, NULL); - gm_hash_table_destroy_null(&fi_handles); - gm_hash_table_destroy_null(&fi_updates); - gm_hash_table_destroy_null(&src_updates); + htable_free_null(&fi_handles); + hset_free_null(&fi_updates); + hset_free_null(&src_updates); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/downloads_common.h -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/downloads_common.h
Changed
@@ -110,6 +110,7 @@ const char *fi_gui_file_column_text(const struct fileinfo_data *, int column); const char *fi_gui_source_column_text(const struct download *, int column); +void fi_gui_fi_status_changed(gnet_fi_t handle); void fi_gui_files_cursor_update(void); gboolean fi_gui_filter_active(void); @@ -151,6 +152,7 @@ void fi_gui_clear_sources(void); void fi_gui_clear_details(void); +void fi_gui_source_massive_update(bool starting); void fi_gui_source_show(struct download *); void fi_gui_source_update(struct download *); void fi_gui_source_hide(struct download *); @@ -177,7 +179,6 @@ FI_GUI_DETAIL_SHA1, FI_GUI_DETAIL_BITPRINT, FI_GUI_DETAIL_TIGERTREE, - FI_GUI_DETAIL_BITZI }; void fi_gui_append_detail(enum fi_gui_detail, const char *title, const char *value);
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/drag.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/drag.c
Changed
@@ -77,7 +77,7 @@ } #if GTK_CHECK_VERSION(2,0,0) -gboolean +gboolean drag_get_iter(GtkTreeView *tv, GtkTreeModel **model, GtkTreeIter *iter) { gboolean ret = FALSE; @@ -85,14 +85,14 @@ g_return_val_if_fail(model, FALSE); g_return_val_if_fail(iter, FALSE); - + gtk_tree_view_get_cursor(tv, &path, NULL); if (path) { *model = gtk_tree_view_get_model(tv); ret = gtk_tree_model_get_iter(*model, iter, path); gtk_tree_path_free(path); } - return ret; + return ret; } #define object_ref(obj) g_object_ref((obj)) @@ -207,7 +207,7 @@ * Attaches a drag context to a widget, so that user can drag data from * the widget as text. The context can be attached to multiple widgets. */ -static void +static void drag_attach(GtkWidget *widget, drag_get_data_cb callback, gboolean uri_list) { static const GtkTargetEntry text_targets = { @@ -235,10 +235,10 @@ if (uri_list) { targets = uri_targets; - num_targets = G_N_ELEMENTS(uri_targets); + num_targets = N_ITEMS(uri_targets); } else { targets = text_targets; - num_targets = G_N_ELEMENTS(text_targets); + num_targets = N_ITEMS(text_targets); } /* Initialize drag support */ @@ -252,13 +252,13 @@ gui_signal_connect(widget, "destroy", destroy, ctx); } -void +void drag_attach_text(GtkWidget *widget, drag_get_data_cb callback) { drag_attach(widget, callback, FALSE); } -void +void drag_attach_uri(GtkWidget *widget, drag_get_data_cb callback) { drag_attach(widget, callback, TRUE);
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/drop.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/drop.c
Changed
@@ -57,25 +57,25 @@ g_return_if_fail(callback); gtk_drag_dest_set(widget, GTK_DEST_DEFAULT_ALL, targets, - G_N_ELEMENTS(targets), GDK_ACTION_COPY | GDK_ACTION_MOVE); + N_ITEMS(targets), GDK_ACTION_COPY | GDK_ACTION_MOVE); #if GTK_CHECK_VERSION(2,0,0) { static GtkClipboard *clipboard; - + if (!clipboard) { clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY); } } - + gtk_drag_dest_set_target_list(widget, gtk_target_list_new(targets, - G_N_ELEMENTS(targets))); + N_ITEMS(targets))); #endif /* USE_GTK2 */ #if !GTK_CHECK_VERSION(2,0,0) gtk_selection_add_targets(widget, GDK_SELECTION_TYPE_STRING, - targets, G_N_ELEMENTS(targets)); + targets, N_ITEMS(targets)); #endif /* USE_GTK1 */ gui_signal_connect(GTK_OBJECT(widget), "drag-data-received",
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/filter.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/filter.c
Changed
@@ -43,7 +43,6 @@ #include "if/gui_property_priv.h" #include "lib/ascii.h" -#include "lib/glib-missing.h" #include "lib/halloc.h" #include "lib/parse.h" #include "lib/str.h" @@ -99,16 +98,16 @@ { GtkTreeViewColumn *column; GtkCellRenderer *renderer; - + renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "mode", GTK_CELL_RENDERER_MODE_INERT, "xalign", 0.0, "ypad", (guint) GUI_CELL_RENDERER_YPAD, - (void *) 0); + NULL_PTR); column = gtk_tree_view_column_new_with_attributes(name, renderer, "text", id, - (void *) 0); + NULL_PTR); g_object_set(G_OBJECT(column), "fixed-width", 200, @@ -116,8 +115,8 @@ "reorderable", FALSE, "resizable", TRUE, "sizing", GTK_TREE_VIEW_COLUMN_AUTOSIZE, - (void *) 0); - + NULL_PTR); + gtk_tree_view_append_column(tv, column); return column; @@ -245,9 +244,9 @@ fl_nodesFILTER_NODE_BUILTIN); - for (i = 0; i < G_N_ELEMENTS(nodes); i++) { + for (i = 0; i < N_ITEMS(nodes); i++) { const gchar *titles3; - + titles0 = deconstify_gchar(_(nodesi.title)); titles1 = ""; titles2 = ""; @@ -287,7 +286,7 @@ tv = GTK_TREE_VIEW(gui_filter_dialog_lookup("treeview_filter_filters")); model = gtk_tree_view_get_model(tv); - for (i = 0; i < G_N_ELEMENTS(nodes); i++) { + for (i = 0; i < N_ITEMS(nodes); i++) { GtkTreeIter iter; gtk_tree_store_append(GTK_TREE_STORE(model), &iter, NULL); @@ -318,7 +317,7 @@ GtkCTreeNode *parent; guint count; GtkCTree *ctree_filter_filters; - gchar bufG_N_ELEMENTS(titles)256; + gchar bufN_ITEMS(titles)256; g_assert(f != NULL); @@ -332,14 +331,14 @@ ruleset = f->ruleset; titles0 = lazy_utf8_to_ui_string(f->name); - gm_snprintf(buf1, sizeof buf1, "%d", g_list_length(ruleset)); + str_bprintf(buf1, sizeof buf1, "%d", g_list_length(ruleset)); titles1 = buf1; count = f->match_count + f->fail_count; if (count != 0) { if (filter_is_builtin(f)) { - gm_snprintf(buf2, sizeof buf2, "%d", f->match_count); + str_bprintf(buf2, sizeof buf2, "%d", f->match_count); } else { - gm_snprintf(buf2, sizeof buf2, "%d/%d (%d%%)", + str_bprintf(buf2, sizeof buf2, "%d/%d (%d%%)", f->match_count, count, f->match_count * 100 / count); } @@ -394,9 +393,9 @@ count = f->match_count + f->fail_count; if (count != 0) { if (filter_is_builtin(f)) { - gm_snprintf(buf, sizeof buf, "%d", f->match_count); + str_bprintf(buf, sizeof buf, "%d", f->match_count); } else { - gm_snprintf(buf, sizeof buf, "%d/%d (%d%%)", + str_bprintf(buf, sizeof buf, "%d/%d (%d%%)", f->match_count, count, f->match_count * 100 / count); } @@ -440,8 +439,8 @@ if (node != NULL) { gchar buf32; - - gm_snprintf(buf, sizeof buf, "%d", g_list_length(ruleset)); + + str_bprintf(buf, sizeof buf, "%d", g_list_length(ruleset)); gtk_ctree_node_set_text(GTK_CTREE(ctree_filter_filters), node, 1, buf); } @@ -470,8 +469,8 @@ if (tree_find_iter_by_data(model, 0, f, &iter)) { gchar buf32; - - gm_snprintf(buf, sizeof buf, "%d", g_list_length(ruleset)); + + str_bprintf(buf, sizeof buf, "%d", g_list_length(ruleset)); gtk_tree_store_set(GTK_TREE_STORE(model), &iter, 2, buf, (-1)); } } @@ -582,7 +581,7 @@ if (f != NULL) { gtk_mass_widget_set_sensitive(gui_filter_dialog(), - widgets, G_N_ELEMENTS(widgets), filter_is_modifiable(f)); + widgets, N_ITEMS(widgets), filter_is_modifiable(f)); gtk_widget_set_sensitive (gui_filter_dialog_lookup("button_filter_remove"), removable); @@ -626,10 +625,10 @@ path = gtk_tree_model_get_path(model, &iter); gtk_tree_view_get_cursor(tv, &cursor_path, NULL); - + update = !cursor_path || 0 != gtk_tree_path_compare(path, cursor_path); - + if (update) { GtkTreePath *p; @@ -637,7 +636,7 @@ while (gtk_tree_path_up(p)) gtk_tree_view_expand_row(tv, p, FALSE); gtk_tree_path_free(p); - + gtk_tree_view_set_cursor(tv, path, NULL, FALSE); } @@ -660,7 +659,7 @@ gtk_widget_set_sensitive (gui_filter_dialog_lookup("button_filter_remove"), FALSE); gtk_mass_widget_set_sensitive(gui_filter_dialog(), - widgets, G_N_ELEMENTS(widgets), FALSE); + widgets, N_ITEMS(widgets), FALSE); } } @@ -697,7 +696,7 @@ #ifdef USE_GTK2 widget = gui_filter_dialog_lookup("treeview_filter_filters"); #endif /* USE_GTK2 */ - + fg_color = &(gtk_widget_get_style(widget) ->fgactive ? GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE); bg_color = &(gtk_widget_get_style(widget) @@ -746,9 +745,9 @@ n = filter->match_count + filter->fail_count; if (n != 0) { if (filter_is_builtin(filter)) { - gm_snprintf(buf, sizeof buf, "%d", filter->match_count); + str_bprintf(buf, sizeof buf, "%d", filter->match_count); } else { - gm_snprintf(buf, sizeof buf, "%d/%d (%d%%)", + str_bprintf(buf, sizeof buf, "%d/%d (%d%%)", filter->match_count, n, filter->match_count * 100 / n); } @@ -806,7 +805,7 @@ (void) unused_path; (void) unused_udata; - + gtk_tree_model_get(model, iter, 0, &p, (-1)); filter = p; @@ -848,7 +847,7 @@ n = rule->match_count + rule->fail_count; if (n != 0) { - gm_snprintf(buf, sizeof buf, "%d/%d (%d%%)", + str_bprintf(buf, sizeof buf, "%d/%d (%d%%)", rule->match_count, n, rule->match_count * 100 / n); title = buf; @@ -902,7 +901,7 @@ (void) unused_path; (void) unused_udata; - + gtk_tree_model_get(model, iter, 0, &p, (-1)); rule = p; if (rule == NULL) @@ -968,7 +967,7 @@ if (gui_filter_dialog() != NULL) { guint i; - for (i = 0; i < G_N_ELEMENTS(opt_menus); i++) { + for (i = 0; i < N_ITEMS(opt_menus); i++) { m = GTK_MENU(gtk_menu_new()); for (l_iter = buf; l_iter != NULL; l_iter = g_list_next(l_iter)) { @@ -1854,7 +1853,7 @@ error = EINVAL; - for (i = 0; i < G_N_ELEMENTS(suffixes); i++) { + for (i = 0; i < N_ITEMS(suffixes); i++) { gboolean base2 = 0 != (i & 1); const gchar *q; @@ -2218,7 +2217,7 @@ const gchar *name; const guint id; } radio_buttons = { -#define D(x) "radiobutton_filter_" x +#define D(x) "radiobutton_filter_" x { D("flag_stable_set"), RULE_FLAG_SET }, { D("flag_stable_unset"), RULE_FLAG_UNSET }, @@ -2289,7 +2288,7 @@ "treeview_filter_filters")); model = create_filters_model(); - gtk_tree_view_set_model(tv_filters, model); + gtk_tree_view_set_model(tv_filters, model); add_column(tv_filters, _("Filter"), 1); add_column(tv_filters, _("Rule"), 2); add_column(tv_filters, _("Match"), 3); @@ -2302,7 +2301,7 @@ add_column(tv_rules, _("Condition"), 2); add_column(tv_rules, _("Target"), 3); add_column(tv_rules, _("Match"), 4); - gtk_tree_view_set_model(tv_rules, model); + gtk_tree_view_set_model(tv_rules, model); gtk_tree_view_set_rules_hint(tv_rules, TRUE); gui_signal_connect(tv_rules, "cursor-changed", on_treeview_filter_rules_select_row, NULL); @@ -2319,7 +2318,7 @@ FALSE); m = GTK_MENU(gtk_menu_new()); - for (i = 0; i < G_N_ELEMENTS(menu_items); i++) { + for (i = 0; i < N_ITEMS(menu_items); i++) { guint id = menu_itemsi.id; menu_new_item_with_data(m, _(rule_text_type_labelsid), GUINT_TO_POINTER(id)); @@ -2333,7 +2332,7 @@ * The user_data set here is later relevant for filter_gui_get_flag_rule() */ - for (i = 0; i < G_N_ELEMENTS(radio_buttons); i++) { + for (i = 0; i < N_ITEMS(radio_buttons); i++) { gtk_object_set_user_data( GTK_OBJECT(gui_filter_dialog_lookup(radio_buttonsi.name)), GUINT_TO_POINTER(radio_buttonsi.id));
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/filter_cb.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/filter_cb.c
Changed
@@ -658,7 +658,7 @@ GdkEventButton *event, gpointer unused_udata) { gboolean sensitive; - + (void) unused_udata; if (event->button != 3) @@ -675,10 +675,10 @@ clear_clipboard(); return TRUE; } - + { GtkTreePath *path; - + gtk_tree_view_get_cursor(GTK_TREE_VIEW(widget), &path, NULL); sensitive = path != NULL && work_filter != NULL; gtk_tree_path_free(path); @@ -730,16 +730,16 @@ GtkTreeIter *iter, gpointer unused_udata) { gpointer p; - + (void) unused_path; (void) unused_udata; - + gtk_tree_model_get(model, iter, 0, &p, (-1)); if (p) { filter_t *filter = p; filter_reset_stats(filter); } - + return FALSE; /* continue traversal */ } @@ -859,7 +859,7 @@ gtk_tree_selection_unselect_all(gtk_tree_view_get_selection( GTK_TREE_VIEW(gui_filter_dialog_lookup("treeview_filter_rules")))); - + filter_gui_edit_state_rule(NULL); } @@ -936,7 +936,7 @@ { GSList **sl_ptr = slist_ptr; gpointer p; - + (void) unused_path; gtk_tree_model_get(model, iter, 0, &p, (-1)); @@ -944,12 +944,12 @@ return FALSE; /* continue traversal */ } - + void on_button_filter_clear_clicked(GtkButton *unused_button, gpointer unused_udata) { GSList *sl, *sl_rules = NULL; - + (void) unused_button; (void) unused_udata; @@ -959,7 +959,7 @@ filter_clear_helper, &sl_rules); - for (sl = sl_rules; sl != NULL; sl = g_slist_next(sl)) + for (sl = sl_rules; sl != NULL; sl = g_slist_next(sl)) filter_remove_rule_from_session(work_filter, sl->data); gm_slist_free_null(&sl_rules); @@ -1011,7 +1011,7 @@ (void) unused_button; (void) unused_udata; - + tv = GTK_TREE_VIEW(gui_filter_dialog_lookup("treeview_filter_rules")); gtk_tree_view_get_cursor(tv, &path, NULL); if (path) { @@ -1037,16 +1037,16 @@ GtkTreeIter *iter, gpointer unused_udata) { gpointer p; - + (void) unused_path; (void) unused_udata; - + gtk_tree_model_get(model, iter, 0, &p, (-1)); if (p) { rule_t *rule = p; filter_rule_reset_stats(rule); } - + return FALSE; /* continue traversal */ }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/filter_core.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/filter_core.c
Changed
@@ -49,6 +49,7 @@ #include "lib/glib-missing.h" #include "lib/halloc.h" #include "lib/parse.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/utf8.h" #include "lib/walloc.h" @@ -83,7 +84,7 @@ */ struct filter_context { const struct record *rec; /* From the GUI */ - + /* * Cache for filtering: avoids recomputation at each filtering rule. * Those variables are initialized as needed. @@ -951,7 +952,7 @@ static gchar *prev; gchar *dst; - g_assert(src); + g_assert(src); g_assert(prev != src); dst = utf8_to_ui_string(src); @@ -975,35 +976,35 @@ case RULE_TEXT: { const gchar *match, *cs; - + match = filter_lazy_utf8_to_ui_string(r->u.text.match); cs = r->u.text.case_sensitive ? _("(case-sensitive)") : ""; - + switch (r->u.text.type) { case RULE_TEXT_PREFIX: - gm_snprintf(tmp, sizeof tmp, + str_bprintf(tmp, sizeof tmp, _("If filename begins with \"%s\" %s"), match, cs); break; case RULE_TEXT_WORDS: - gm_snprintf(tmp, sizeof tmp, + str_bprintf(tmp, sizeof tmp, _("If filename contains the words \"%s\" %s"), match, cs); break; case RULE_TEXT_SUFFIX: - gm_snprintf(tmp, sizeof tmp, + str_bprintf(tmp, sizeof tmp, _("If filename ends with \"%s\" %s"), match, cs); break; case RULE_TEXT_SUBSTR: - gm_snprintf(tmp, sizeof tmp, + str_bprintf(tmp, sizeof tmp, _("If filename contains the substring \"%s\" %s"), match, cs); break; case RULE_TEXT_REGEXP: - gm_snprintf(tmp, sizeof tmp, + str_bprintf(tmp, sizeof tmp, _("If filename matches the regex pattern \"%s\" %s"), match, cs); break; case RULE_TEXT_EXACT: - gm_snprintf(tmp, sizeof tmp, _("If filename is \"%s\" %s"), + str_bprintf(tmp, sizeof tmp, _("If filename is \"%s\" %s"), match, cs); break; default: @@ -1013,7 +1014,7 @@ } break; case RULE_IP: - gm_snprintf(tmp, sizeof tmp, _("If IP address matches %s/%u"), + str_bprintf(tmp, sizeof tmp, _("If IP address matches %s/%u"), host_addr_to_string(r->u.ip.addr), r->u.ip.cidr); break; case RULE_SIZE: @@ -1021,14 +1022,14 @@ gchar smax_64UINT64_DEC_BUFLEN; uint64_to_string_buf(r->u.size.upper, smax_64, sizeof smax_64); - gm_snprintf(tmp, sizeof tmp , _("If filesize is exactly %s (%s)"), + str_bprintf(tmp, sizeof tmp , _("If filesize is exactly %s (%s)"), smax_64, short_size(r->u.size.upper, show_metric_units())); } else if (r->u.size.lower == 0) { gchar smax_64UINT64_DEC_BUFLEN; uint64_to_string_buf(r->u.size.upper + 1, smax_64, sizeof smax_64); - gm_snprintf(tmp, sizeof tmp, + str_bprintf(tmp, sizeof tmp, _("If filesize is smaller than %s (%s)"), smax_64, short_size(r->u.size.upper + 1, show_metric_units())); @@ -1045,23 +1046,23 @@ uint64_to_string_buf(r->u.size.lower, smin_64, sizeof smin_64); uint64_to_string_buf(r->u.size.upper, smax_64, sizeof smax_64); - gm_snprintf(tmp, sizeof tmp, + str_bprintf(tmp, sizeof tmp, _("If filesize is between %s and %s (%s - %s)"), smin_64, smax_64, smin, smax); } break; case RULE_SHA1: if (r->u.sha1.hash != NULL) { - gm_snprintf(tmp, sizeof tmp, + str_bprintf(tmp, sizeof tmp, _("If urn:sha1 is same as for \"%s\""), filter_lazy_utf8_to_ui_string(r->u.sha1.filename)); } else { - gm_snprintf(tmp, sizeof tmp, "%s", + str_bprintf(tmp, sizeof tmp, "%s", _("If urn:sha1 is not available")); } break; case RULE_JUMP: - gm_snprintf(tmp, sizeof tmp, "%s", _("Always")); + str_bprintf(tmp, sizeof tmp, "%s", _("Always")); break; case RULE_FLAG: { @@ -1116,10 +1117,10 @@ } if (b) { - gm_snprintf(tmp, sizeof tmp, _("If flag %s%s%s%s%s"), + str_bprintf(tmp, sizeof tmp, _("If flag %s%s%s%s%s"), busy_str, s1, push_str, s2, stable_str); } else { - gm_snprintf(tmp, sizeof tmp, "%s", + str_bprintf(tmp, sizeof tmp, "%s", _("Always (all flags ignored)")); } } @@ -1173,10 +1174,10 @@ } if (b) { - gm_snprintf(tmp, sizeof tmp , _("If flag %s%s%s"), + str_bprintf(tmp, sizeof tmp , _("If flag %s%s%s"), display_str, s1, download_str); } else { - gm_snprintf(tmp, sizeof tmp, "%s", + str_bprintf(tmp, sizeof tmp, "%s", _("Always (all states ignored)")); } } @@ -1202,7 +1203,7 @@ g_assert(r != NULL); - gm_snprintf(tmp, sizeof tmp, _("%s%s %s jump to \"%s\""), + str_bprintf(tmp, sizeof tmp, _("%s%s %s jump to \"%s\""), RULE_IS_NEGATED(r) ? _("(Negated) ") : "", RULE_IS_ACTIVE(r) ? "" : _("(deactivated)"), filter_rule_condition_to_string(r), @@ -1957,13 +1958,13 @@ { GList **list = list_ptr; gpointer p; - + (void) unused_path; - + gtk_tree_model_get(model, iter, 0, &p, (-1)); if (p) *list = g_list_prepend(*list, p); - + return FALSE; /* continue traversal */ } #endif /* USE_GTK2 */ @@ -2202,10 +2203,11 @@ ) match = TRUE; if (i == REG_ESPACE) - g_warning("regexp memory overflow"); + g_warning("%s(): regexp memory overflow", G_STRFUNC); break; default: - g_error("Unknown text rule type: %d", r->u.text.type); + g_error("%s(): unknown text rule type: %d", + G_STRFUNC, r->u.text.type); } break; } @@ -2438,7 +2440,7 @@ /** * Free global filters and save state. */ -G_GNUC_COLD void +void G_COLD filter_shutdown(void) { GList *f; @@ -2486,7 +2488,7 @@ filter_free(f->data); } -static G_GNUC_COLD void +static void G_COLD filter_preset_init(const char *name, const char *regexp, filesize_t minsize) { filter_t *filter; @@ -2496,7 +2498,7 @@ /* Remove all rules, we want to keep this filters up-to-date */ while (NULL != filter->ruleset) { rule_t *rule; - + rule = g_list_nth_data(filter->ruleset, 0); g_assert(rule->target); g_assert(rule->target->refcount > 0); @@ -2537,7 +2539,7 @@ /** * Adds simple filter rules, for use by novice users. */ -G_GNUC_COLD void +void G_COLD filter_init_presets(void) { static const struct { @@ -2546,14 +2548,14 @@ filesize_t minsize; } tab = { { N_("<Archive>"), ".(bz2|gz|zip|rar|iso|7z)$", 0 }, - { N_("<Audio>"), ".(mp3|m4a|ogg|oga|flac)$", 1000000 }, + { N_("<Audio>"), ".(mp3|m4a|ogg|oga|opus|flac)$", 1000000 }, { N_("<Image>"), ".(bmp|gif|jpg|jpeg|png|psd|tif|tiff)$", 0 }, { N_("<Literature>"), ".(pdf|doc|lit|djvu|ps|txt)$", 10000 }, - { N_("<Video>"), ".(avi|mpg|mp4|mpeg|mkv|ogm|ogv)$", 10000000 }, + { N_("<Video>"), ".(avi|mpg|mp4|mpeg|mkv|ogm|ogv|webm)$", 10000000 }, }; unsigned i; - for (i = 0; i < G_N_ELEMENTS(tab); i++) { + for (i = 0; i < N_ITEMS(tab); i++) { filter_preset_init(_(tabi.name), tabi.regex, tabi.minsize); } filter_apply_changes(); @@ -2570,7 +2572,7 @@ return filter; } -static G_GNUC_COLD void +static void G_COLD filter_init_globals(void) { const unsigned flags = FILTER_FLAG_GLOBAL; @@ -2579,7 +2581,7 @@ filter_global_post = filters_add(_("Global (post)"), flags); } -static G_GNUC_COLD void +static void G_COLD filter_init_builtins(void) { const unsigned flags = FILTER_FLAG_BUILTIN; @@ -2594,7 +2596,7 @@ /** * Initialize global filters. */ -G_GNUC_COLD void +void G_COLD filter_init(void) { filter_init_globals();
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gnet_stats_common.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gnet_stats_common.c
Changed
@@ -31,8 +31,9 @@ #include "if/core/net_stats.h" #include "if/bridge/ui2c.h" -#include "lib/glib-missing.h" +#include "lib/str.h" #include "lib/stringify.h" + #include "lib/override.h" /* Must be the last header included */ /** @@ -41,39 +42,8 @@ const gchar * msg_type_str(gint value) { - static const char * const strs = { - N_("Unknown"), - N_("Ping"), - N_("Pong"), - N_("Bye"), - N_("QRP"), - N_("HSEP"), - N_("RUDP"), - N_("Vendor spec."), - N_("Vendor std."), - N_("Push"), - N_("Query"), - N_("Query hit"), - N_("DHT (truncated)"), - N_("DHT Ping"), - N_("DHT Pong"), - N_("DHT Store"), - N_("DHT Store Ack"), - N_("DHT Find Node"), - N_("DHT Found Node"), - N_("DHT Find Value"), - N_("DHT Value"), - N_("Total"), - }; - - STATIC_ASSERT(G_N_ELEMENTS(strs) == MSG_TYPE_COUNT); - - if ((guint) value >= G_N_ELEMENTS(strs)) { - g_warning("Requested general_type_str %d is invalid", value); - return ""; - } - - return _(strsvalue); + g_return_val_if_fail(UNSIGNED(value) < MSG_TYPE_COUNT, ""); + return _(guc_gnet_msg_type_description(value)); } gint @@ -93,226 +63,13 @@ } /** - * Gets the string associated with the general message. + * Gets the string associated with the general statistic. */ const gchar * general_type_str(gint value) { - static const char * const strs = { - N_("Routing errors"), - N_("Routing table chunks"), - N_("Routing table message capacity"), - N_("Routing table message count"), - N_("Routing through transient node avoided"), - N_("Duplicates with higher TTL"), - N_("SPAM SHA1 database hits"), - N_("SPAM filename and size hits"), - N_("SPAM fake hits"), - N_("SPAM duplicate hits"), - N_("SPAM dynamically caught hostile IP addresses"), - N_("SPAM dynamically caught hostile IP held"), - N_("SPAM spotted spamming IP addresses held"), - N_("Searches to local DB"), - N_("Hits on local DB"), - N_("Hits on local partial files"), - N_("Hits on \"what's new?\" queries"), - N_("Query hits received for local queries"), - N_("Query hits received for OOB-proxied queries"), - N_("Queries requesting OOB hit delivery"), - N_("Stripped OOB flag on queries"), - N_("Duplicate OOB-proxied queries"), - N_("OOB hits received for OOB-proxied queries"), - N_("OOB hits bearing alien IP address"), - N_("OOB hits ignored due to identified spamming address"), - N_("Unclaimed locally-generated OOB hits"), - N_("Partially claimed locally-generated OOB hits"), - N_("Spurious OOB hit claiming received"), - N_("Unrequested OOB hits received"), - N_("Received query hits for untracked queries"), - N_("Tracked query MUIDs"), - N_("Compacted queries"), - N_("Bytes saved by compacting"), - N_("UTF8 queries"), - N_("SHA1 queries"), - N_("\"What's New?\" queries"), - N_("GUESS queries"), - N_("GUESS queries (0.2)"), - N_("GUESS cached query keys held"), - N_("GUESS cached 0.2 hosts held"), - N_("GUESS locally generated queries"), - N_("GUESS currently running queries"), - N_("GUESS hits received for locally generated queries"), - N_("GUESS hosts queried"), - N_("GUESS hosts sending back an acknowledgment"), - N_("Broadcasted push messages"), - N_("Push-proxy UDP relayed messages"), - N_("Push-proxy TCP relayed messages"), - N_("Push-proxy broadcasted messages"), - N_("Push-proxy found un-proxied local route"), - N_("Push-proxy lookup failures"), - N_("Push relayed via local route"), - N_("Push relayed via routing table"), - N_("Locally generated dynamic queries"), - N_("Leaf-generated dynamic queries"), - N_("OOB-proxied leaf queries"), - N_("Fully completed dynamic queries"), - N_("Partially completed dynamic queries"), - N_("Dynamic queries ended with no results"), - N_("Fully completed dynamic queries getting late results"), - N_("Dynamic queries with partial late results"), - N_("Dynamic queries completed by late results"), - N_("Queries seen from GTKG"), - N_("Queries seen from GTKG that were re-queries"), - N_("Queries advertising support of GGEP \"H\""), - N_("GIV callbacks received"), - N_("GIV discarded due to no suitable download"), - N_("QUEUE callbacks received"), - N_("QUEUE discarded due to no suitable download"), - N_("UDP messages with bogus source IP"), - N_("Alien UDP messages (non-Gnutella)"), - N_("Unprocessed UDP Gnutella messages"), - N_("Compressed UDP messages enqueued"), - N_("Compressed UDP messages received"), - N_("Uncompressed UDP messages due to no gain"), - N_("Consolidated servers (after GUID and IP address linking)"), - N_("Duplicate downloads found during server consolidation"), - N_("Discovered server GUIDs"), - N_("Changed server GUIDs"), - N_("Detected GUID collisions"), - N_("Detected collisions with our own GUID"), - N_("GUID dynamically banned"), - N_("Firewalled node info for known hosts received in upload requests"), - N_("Revitalized PUSH routes"), - N_("Collected new PUSH proxies from other query hits"), - N_("Attempted download resource switching on completion"), - N_("Attempted download resource switching after error"), - N_("Successful download resource switching (all kind)"), - N_("Successful download resource switching between plain files"), - N_("Successful download resource switching after error"), - N_("Actively queued after resource switching attempt"), - N_("Sunk HTTP reply data on error codes"), - N_("Ignored downloaded data"), - N_("Ignoring requested after data mismatch"), - N_("Ignoring requested to preserve connection"), - N_("Ignoring requested due to aggressive swarming"), - N_("Ignoring refused (data too large or server too slow)"), - N_("Client resource switching (all detected)"), - N_("Client resource switching between plain files"), - N_("Client follow-up request after HTTP error was returned"), - N_("PARQ client resource switching in slots (SHA-1 based)"), - N_("PARQ client retry-after violation"), - N_("PARQ client kicked out after too many retry-after violations"), - N_("PARQ upload slot limit overrides"), - N_("PARQ quick upload slots granted"), - N_("PARQ QUEUE sending attempts"), - N_("PARQ QUEUE messages sent"), - N_("PARQ QUEUE follow-up requests received"), - N_("Launched SHA-1 file verifications"), - N_("Launched TTH file verifications"), - N_("Bitzi tickets held"), - N_("Re-seeding of orphan downloads through query hits"), - N_("Re-seeding of orphan downloads through upload requests"), - N_("DHT estimated amount of nodes"), - N_("DHT k-ball theoretical frontier (bits)"), - N_("DHT k-ball furthest frontier (bits)"), - N_("DHT k-ball closeest frontier (bits)"), - N_("DHT routing table buckets"), - N_("DHT routing table leaves"), - N_("DHT routing table maximum depth"), - N_("DHT routing table good nodes"), - N_("DHT routing table stale nodes"), - N_("DHT routing table pending nodes"), - N_("DHT routing table evicted nodes"), - N_("DHT routing table evicted firewalled nodes"), - N_("DHT routing table evicted nodes due to quota"), - N_("DHT routing table promoted pending nodes"), - N_("DHT routing table pinged promoted nodes"), - N_("DHT routing table rejected node due to bucket network quota"), - N_("DHT routing table rejected node due to global network quota"), - N_("DHT completed bucket refreshes"), - N_("DHT forced bucket refreshes"), - N_("DHT forced bucket merges"), - N_("DHT denied non-splitable bucket refresh"), - N_("DHT initiated bucket alive checks"), - N_("DHT alive pings sent to good nodes"), - N_("DHT alive pings sent to stale nodes"), - N_("DHT alive pings sent to shutdowning nodes"), - N_("DHT alive pings avoided"), - N_("DHT alive pings skipped"), - N_("DHT revitalized stale nodes on RPC reply"), - N_("DHT value store rejected on IP/network quota grounds"), - N_("DHT value store rejected on creator validation grounds"), - N_("DHT nodes rejected during lookup based on network quota"), - N_("DHT nodes rejected during lookup based on suspicious proximity"), - N_("DHT nodes rejected during lookup based on frequency divergence"), - N_("DHT keys held"), - N_("DHT cached keys held"), - N_("DHT values held"), - N_("DHT cached KUID targets held"), - N_("DHT cached closest root nodes"), - N_("DHT cached roots exact hits"), - N_("DHT cached roots approximate hits"), - N_("DHT cached roots misses"), - N_("DHT cached roots lookups within k-ball"), - N_("DHT cached roots contact address refreshed"), - N_("DHT cached security tokens held"), - N_("DHT cached security tokens hits"), - N_("DHT stable node information held"), - N_("DHT local hits on value lookups"), - N_("DHT local hits returning values from cached keys"), - N_("DHT returned expanded values"), - N_("DHT returned values as secondary keys"), - N_("DHT claimed values via secondary keys"), - N_("DHT returned cached expanded values"), - N_("DHT returned cached values as secondary-keys"), - N_("DHT claimed cached values via secondary keys"), - N_("DHT successfully received value publications"), - N_("DHT successfully received value removals"), - N_("DHT replication of stale value avoided"), - N_("DHT replication of held values"), - N_("DHT republishing of held values"), - N_("DHT secondary-key value fetch issued"), - N_("DHT duplicate values returned in lookups"), - N_("DHT detected KUID collisions"), - N_("DHT detected collisions with our own KUID"), - N_("DHT detected KUID mismatches on RPC reply"), - N_("DHT caching attempts"), - N_("DHT caching ended successfully"), - N_("DHT caching partially completed"), - N_("DHT key-offloading checks after discovering new closest node"), - N_("DHT keys selected for offloading"), - N_("DHT key-offloading attempts"), - N_("DHT key-offloading ended successfully"), - N_("DHT key-offloading partially completed"), - N_("DHT values successfully offloaded"), - N_("DHT publishing attempts"), - N_("DHT publishing ended successfully (all roots)"), - N_("DHT publishing partially completed (root subset only)"), - N_("DHT publishing ending with proper value presence"), - N_("DHT value republishing occurring too late (after expiry)"), - N_("DHT publishing to self"), - N_("DHT background publishing completion attempts"), - N_("DHT background publishing completion showing improvements"), - N_("DHT background publishing completion successful (all roots)"), - N_("DHT SHA1 data type collisions"), - N_("DHT lookup path passively protected against attack"), - N_("DHT lookup path actively protected against attack"), - N_("DHT alt-loc lookups issued"), - N_("DHT push-proxy lookups issued"), - N_("DHT successful alt-loc lookups"), - N_("DHT successful push-proxy lookups"), - N_("DHT successful node push-entry lookups"), - N_("DHT re-seeding of orphan downloads"), - }; - - STATIC_ASSERT(G_N_ELEMENTS(strs) == GNR_TYPE_COUNT); - - if ((guint) value >= G_N_ELEMENTS(strs)) { - g_warning("Requested general_type_str %d is invalid", value); - return ""; - } - - return _(strsvalue); + g_return_val_if_fail(UNSIGNED(value) < GNR_TYPE_COUNT, ""); + return _(guc_gnet_stats_general_description(value)); } /** @@ -329,7 +86,7 @@ { static gchar bufUINT64_DEC_BUFLEN; - gm_snprintf(buf, sizeof(buf), "%d", row); + str_bprintf(buf, sizeof(buf), "%d", row); return buf; } case c_horizon_nodes: @@ -393,6 +150,42 @@ "%s", short_kb_size(val, show_metric_units())); } +/** + * Stringify value of the general stats to buffer. + * + * @param dst destination buffer + * @param size length of destination buffer + * @param stats the statistics array + * @param idx the index within the general statistics of value to format + */ +void +gnet_stats_gui_general_to_string_buf(char *dst, size_t size, + const gnet_stats_t *stats, int idx) +{ + const uint64 value = stats->generalidx; + + if (0 == value) + g_strlcpy(dst, "-", size); + else { + switch (idx) { + case GNR_QUERY_COMPACT_SIZE: + case GNR_IGNORED_DATA: + case GNR_SUNK_DATA: + case GNR_UDP_READ_AHEAD_BYTES_SUM: + case GNR_UDP_READ_AHEAD_BYTES_MAX: + case GNR_RUDP_TX_BYTES: + case GNR_RUDP_RX_BYTES: + g_strlcpy(dst, compact_size(value, show_metric_units()), size); + break; + case GNR_UDP_READ_AHEAD_DELAY_MAX: + g_strlcpy(dst, compact_time(value), size); + break; + default: + uint64_to_string_buf(value, dst, size); + } + } +} + static gboolean gnet_stats_gui_is_visible(void) {
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gnet_stats_common.h -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gnet_stats_common.h
Changed
@@ -26,7 +26,9 @@ #include "gui.h" #include "columns.h" + #include "if/core/hsep.h" +#include "if/core/net_stats.h" #include "if/ui/gtk/gnet_stats.h" const gchar *msg_type_str(gint msg_type); @@ -37,6 +39,9 @@ gint msg_type_str_size(void); void gnet_stats_gui_horizon_update(hsep_triple *table, guint32 triples); +void gnet_stats_gui_general_to_string_buf(char *dst, size_t size, + const gnet_stats_t *stats, int idx); + void gnet_stats_gui_timer(time_t now); void gnet_stats_gui_update_display(time_t now);
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk-missing.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk-missing.c
Changed
@@ -48,7 +48,9 @@ #include "lib/glib-missing.h" #include "lib/misc.h" +#include "lib/str.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ /** @@ -98,7 +100,7 @@ g_return_if_fail(clist); g_return_if_fail(func); - + i = 0; for (iter = clist->row_list; NULL != iter; iter = g_list_next(iter), i++) { GtkCListRow *row; @@ -114,7 +116,7 @@ char *text; g_return_val_if_fail(clist, NULL); - + if ( row < 0 || column < 0 || @@ -161,7 +163,7 @@ int row; g_return_val_if_fail(clist, -1); - + row = clist_get_focus_row(clist); return row >= 0 && clist_row_is_selected(clist, row) ? row : -1; } @@ -190,7 +192,7 @@ if (i > GTK_ITERATION_MAX && !val) { if (GUI_PROPERTY(gui_debug)) { - g_warning("gtk_main_flush: too much work"); + g_warning("%s(): too much work", G_STRFUNC); } } @@ -217,7 +219,7 @@ } } - g_warning("option_menu_select_item_by_data: no item with data %p", data); + g_warning("%s(): no item with data %p", G_STRFUNC, data); } @@ -295,7 +297,7 @@ va_start(args, format); if (format != NULL) - gm_vsnprintf(buf, sizeof(buf), format, args); + str_vbprintf(buf, sizeof(buf), format, args); else buf0 = '\0'; @@ -317,7 +319,7 @@ va_start(args, format); if (format != NULL) - gm_vsnprintf(buf, sizeof(buf), format, args); + str_vbprintf(buf, sizeof(buf), format, args); else buf0 = '\0'; @@ -472,7 +474,7 @@ GSList *results; GSList *to_unselect; GCompareFunc cfn; - tree_selection_get_data_func gdf; + tree_selection_get_data_func gdf; GtkTreeView *tv; const gchar *name; /* name of the treeview widget (for debugging) */ guint column; @@ -608,10 +610,10 @@ g_assert(tvm != NULL); g_assert(tvm->cb != NULL); -#if 0 +#if 0 { gchar type32; -#define EVENT_TYPE(x) case x: gm_snprintf(type, sizeof type, "%s", #x); break; +#define EVENT_TYPE(x) case x: str_bprintf(type, sizeof type, "%s", #x); break; switch (event->type) { EVENT_TYPE(GDK_NOTHING) EVENT_TYPE(GDK_DESTROY) @@ -648,7 +650,7 @@ EVENT_TYPE(GDK_WINDOW_STATE) EVENT_TYPE(GDK_SETTING) default: - gm_snprintf(type, sizeof type, "%ld", (gulong) event->type); + str_bprintf(type, sizeof type, "%ld", (ulong) event->type); } #undef EVENT_TYPE @@ -737,9 +739,9 @@ tree_view_set_fixed_height_mode(GtkTreeView *tv, gboolean fixed) { g_return_if_fail(tv); - + #if GTK_CHECK_VERSION(2, 4, 0) - g_object_set(GTK_TREE_VIEW(tv), "fixed_height_mode", fixed, (void *) 0); + g_object_set(GTK_TREE_VIEW(tv), "fixed_height_mode", fixed, NULL_PTR); #endif /* GTK+ >= 2.4.0 */ } @@ -835,7 +837,7 @@ GtkCombo *combo = GTK_COMBO(widget); const gchar *title; guint i; - + for (i = 0; (title = def->data.guint32.choicesi.title) != NULL; i++) { GtkWidget *list_item; GList *l;
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk-missing.h -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk-missing.h
Changed
@@ -93,7 +93,7 @@ #define GTK_CTREE_NODE_PARENT(n) \ ((n) ? (GTK_CTREE_ROW(n)->parent) : NULL) #endif /* USE_GTK1 */ - + /** * GtkPaned */ @@ -112,7 +112,7 @@ /** * GtkLabel */ -void gtk_label_printf(GtkLabel *, const gchar *fmt, ...) G_GNUC_PRINTF(2, 3); +void gtk_label_printf(GtkLabel *, const gchar *fmt, ...) G_PRINTF(2, 3); #ifdef USE_GTK1 /* USE_GTK1 */ const char *gtk_label_get_text(GtkLabel *); #endif /* USE_GTK1 */ @@ -120,7 +120,7 @@ /** * GtkEntry */ -void gtk_entry_printf(GtkEntry *, const gchar *fmt, ...) G_GNUC_PRINTF(2, 3); +void gtk_entry_printf(GtkEntry *, const gchar *fmt, ...) G_PRINTF(2, 3); /** * GtkEditable
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk-shared/callbacks.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk-shared/callbacks.c
Changed
@@ -320,7 +320,7 @@ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, - (void *) 0); + NULL_PTR); g_return_if_fail(NULL != widget); directory_chooser = widget; @@ -552,7 +552,7 @@ if (is_directory(name)) { guc_shared_dir_add(name); } else { - g_warning("%s: Ignoring non-directory \"%s\"", G_STRFUNC, name); + g_warning("%s(): ignoring non-directory \"%s\"", G_STRFUNC, name); } }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk-shared/callbacks.h -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk-shared/callbacks.h
Changed
@@ -112,4 +112,7 @@ void on_menu_faq_activate(GtkMenuItem *, gpointer user_data); gboolean on_dlg_faq_delete_event(GtkWidget *, GdkEvent *, gpointer user_data); +void on_menu_glossary_activate(GtkMenuItem *, gpointer user_data); +gboolean on_dlg_glossary_delete_event(GtkWidget *, GdkEvent *, gpointer udata); + #endif /* _callbacks_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk1/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk1/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-95 -: $X-Id: Jmake.tmpl 69 2011-01-09 13:57:07Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -40,7 +40,7 @@ CC = $cc CP = $cp CTAGS = ctags -JCFLAGS = \$(CFLAGS) $optimize $ccflags $large +JCFLAGS = \$(CFLAGS) $optimize $pthread $ccflags $large JCPPFLAGS = $cppflags MKDEP = $mkdep \$(DPFLAGS) \$(JCPPFLAGS) -- MV = $mv @@ -69,7 +69,7 @@ $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 94 2011-02-10 14:06:58Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Force 'make depend' to be performed first -- do not edit @@ -81,7 +81,7 @@ ######################################################################## # Start of Jmakefile -# $X-Id: Jmakefile 19361 2011-07-20 08:34:38Z rmanfredi $ +# $X-Id$ # Those files lie in the ../gtk-shared directory REMOTE_GLADE_C = callbacks.c @@ -235,6 +235,11 @@ $(RM) Makefile config.sh install:: local_install + @exit 0 + +install-strip:: local_install-strip + @exit 0 + install.man:: maybe_install.man deinstall:: local_deinstall deinstall.man:: maybe_deinstall.man @@ -273,6 +278,9 @@ local_install:: @echo "install in $(CURRENT) done." +local_install-strip:: + @echo "install (strip) in $(CURRENT) done." + local_deinstall:: @echo "deinstall in $(CURRENT) done."
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk1/fileinfo.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk1/fileinfo.c
Changed
@@ -41,6 +41,7 @@ #include "if/gui_property.h" #include "lib/cq.h" +#include "lib/htable.h" #include "lib/utf8.h" #include "lib/override.h" /* Must be the last header included */ @@ -56,9 +57,9 @@ static GtkCList *clist_download_aliases; static GtkCList *clist_download_details; -static GHashTable *file_rows; /* row -> struct fileinfo_data */ -static GHashTable *source_rows; /* row -> struct download */ -static GHashTable *fi_sources; /* struct download -> row */ +static htable_t *file_rows; /* row -> struct fileinfo_data */ +static htable_t *source_rows; /* row -> struct download */ +static htable_t *fi_sources; /* struct download -> row */ static cevent_t *cursor_ev; @@ -81,7 +82,7 @@ { struct fileinfo_data *file; - file = g_hash_table_lookup(file_rows, int_to_pointer(row)); + file = htable_lookup(file_rows, int_to_pointer(row)); g_assert(file); g_assert(row == fileinfo_data_get_row(file)); @@ -108,12 +109,11 @@ } static void -cursor_expire(cqueue_t *unused_cq, gpointer unused_udata) +cursor_expire(cqueue_t *cq, gpointer unused_udata) { - (void) unused_cq; (void) unused_udata; - cursor_ev = NULL; + cq_zero(cq, &cursor_ev); fi_gui_files_cursor_update(); } @@ -161,7 +161,7 @@ if (src != dst) { fileinfo_data_set_row(file, dst); - g_hash_table_insert(file_rows, int_to_pointer(dst), file); + htable_insert(file_rows, int_to_pointer(dst), file); } } @@ -170,7 +170,7 @@ { GtkCList *clist; int row; - + clist = GTK_CLIST(widget); row = clist_get_cursor_row(clist); return clist_copy_text(clist, row, 1); @@ -181,7 +181,7 @@ { GtkCList *clist; int row; - + clist = GTK_CLIST(widget); row = clist_get_cursor_row(clist); return clist_copy_text(clist, row, 0); @@ -199,7 +199,7 @@ struct fileinfo_data *file = data; int row = fileinfo_data_get_row(file); - g_hash_table_remove(file_rows, int_to_pointer(row)); + htable_remove(file_rows, int_to_pointer(row)); fi_gui_file_invalidate(file); clist_sync_rows(clist_download_files, on_clist_download_files_row_moved); } @@ -218,12 +218,12 @@ if (row < 0) { const char *titlesc_fi_num; - for (i = 0; i < G_N_ELEMENTS(titles); i++) { + for (i = 0; i < N_ITEMS(titles); i++) { titlesi = ""; } row = gtk_clist_append(clist_download_files, (char **) &titles); fileinfo_data_set_row(file, row); - g_hash_table_insert(file_rows, int_to_pointer(row), file); + htable_insert(file_rows, int_to_pointer(row), file); } gtk_clist_set_row_data_full(clist, row, file, on_clist_download_files_row_removed); @@ -251,8 +251,8 @@ { struct download *d; - d = g_hash_table_lookup(source_rows, int_to_pointer(row)); - g_assert(pointer_to_int(g_hash_table_lookup(fi_sources, d)) == row); + d = htable_lookup(source_rows, int_to_pointer(row)); + g_assert(pointer_to_int(htable_lookup(fi_sources, d)) == row); #ifdef FILEINFO_C_ROW_CACHE_REGRESSION { @@ -290,6 +290,8 @@ fi_gui_clear_sources(void) { gtk_clist_clear(clist_download_sources); + htable_clear(fi_sources); + htable_clear(source_rows); } @@ -323,47 +325,96 @@ int src; download_check(d); - src = pointer_to_int(g_hash_table_lookup(fi_sources, d)); + src = pointer_to_int(htable_lookup(fi_sources, d)); if (src != dst) { - g_hash_table_insert(fi_sources, d, int_to_pointer(dst)); - g_hash_table_insert(source_rows, int_to_pointer(dst), d); + htable_insert(fi_sources, d, int_to_pointer(dst)); + htable_insert(source_rows, int_to_pointer(dst), d); } } static void on_clist_download_sources_row_removed(void *data) { + int count; + download_check(data); - g_hash_table_remove(fi_sources, data); + g_return_unless(htable_contains(fi_sources, data)); + g_soft_assert_log(htable_count(fi_sources) == htable_count(source_rows), + "fi_sources count: %zu, source_rows count: %zu", + htable_count(fi_sources), htable_count(source_rows)); + + count = htable_count(fi_sources); /* Old row count */ + htable_remove(fi_sources, data); + clist_sync_rows(clist_download_sources, on_clist_download_sources_row_moved); + + htable_remove(source_rows, int_to_pointer(count - 1)); /* Last row gone */ + + g_soft_assert_log(htable_count(fi_sources) == htable_count(source_rows), + "fi_sources count: %zu, source_rows count: %zu", + htable_count(fi_sources), htable_count(source_rows)); +} + +/** + * Called before invoking fi_gui_source_show() repeatedly. + * + * This allows freezing the download clist to avoid a costly redrawing of + * the list after each addition, preventing O(n^2) GUI updates. + */ +void +fi_gui_source_massive_update(bool starting) +{ + GtkCList *clist = clist_download_sources; + + g_return_if_fail(clist); + + /* + * Freeze / thaw operations are counted by the clist, so it is perfectly + * fine to freeze here even though fi_gui_source_show() will also perform + * some freeze/thaw operations. + */ + + if (starting) { + gtk_clist_freeze(clist); + } else { + gtk_clist_thaw(clist); + } } void fi_gui_source_show(struct download *key) { - const char *titlesc_fi_sources; + const char *titlesc_src_num; GtkCList *clist; unsigned i; int row; clist = clist_download_sources; g_return_if_fail(clist); - g_return_if_fail(!gm_hash_table_contains(fi_sources, key)); + g_return_if_fail(!htable_contains(fi_sources, key)); - for (i = 0; i < G_N_ELEMENTS(titles); i++) { + for (i = 0; i < N_ITEMS(titles); i++) { titlesi = ""; } + + gtk_clist_freeze(clist); row = gtk_clist_append(clist, (char **) titles); g_return_if_fail(row >= 0); - g_hash_table_insert(fi_sources, key, int_to_pointer(row)); - g_hash_table_insert(source_rows, int_to_pointer(row), key); + htable_insert(fi_sources, key, int_to_pointer(row)); + htable_insert(source_rows, int_to_pointer(row), key); + + g_soft_assert_log(htable_count(fi_sources) == htable_count(source_rows), + "fi_sources count: %zu, source_rows count: %zu", + htable_count(fi_sources), htable_count(source_rows)); + gtk_clist_set_row_data_full(clist, row, key, on_clist_download_sources_row_removed); - for (i = 0; i < c_fi_sources; i++) { + for (i = 0; i < N_ITEMS(titles); i++) { render_sources(key, row, i); } + gtk_clist_thaw(clist); } void @@ -373,7 +424,7 @@ g_return_if_fail(clist_download_sources); - if (g_hash_table_lookup_extended(fi_sources, key, NULL, &value)) { + if (htable_lookup_extended(fi_sources, key, NULL, &value)) { int row = pointer_to_int(value); gtk_clist_remove(clist_download_sources, row); @@ -451,10 +502,10 @@ download_check(d); - if (g_hash_table_lookup_extended(fi_sources, d, NULL, &value)) { + if (htable_lookup_extended(fi_sources, d, NULL, &value)) { int i, row = pointer_to_int(value); - for (i = 0; i < c_fi_sources; i++) { + for (i = 0; i < c_src_num; i++) { render_sources(d, row, i); } } @@ -593,9 +644,9 @@ void fi_gui_init(void) { - file_rows = g_hash_table_new(NULL, NULL); - source_rows = g_hash_table_new(NULL, NULL); - fi_sources = g_hash_table_new(NULL, NULL); + file_rows = htable_create(HASH_KEY_SELF, 0); + source_rows = htable_create(HASH_KEY_SELF, 0); + fi_sources = htable_create(HASH_KEY_SELF, 0); clist_download_aliases = GTK_CLIST( gui_main_window_lookup("clist_download_aliases")); @@ -636,7 +687,7 @@ title = gtk_label_get_text(label); gtk_clist_set_column_name(clist, i, EMPTY_STRING(title)); } - widget_add_popup_menu(GTK_WIDGET(clist), fi_gui_sources_get_popup_menu); + widget_add_popup_menu(GTK_WIDGET(clist), fi_gui_sources_get_popup_menu); } fi_gui_common_init(); } @@ -665,9 +716,9 @@ clist_download_sources = NULL; } - gm_hash_table_destroy_null(&fi_sources); - gm_hash_table_destroy_null(&file_rows); - gm_hash_table_destroy_null(&source_rows); + htable_free_null(&fi_sources); + htable_free_null(&file_rows); + htable_free_null(&source_rows); } void @@ -687,7 +738,7 @@ g_return_if_fail(file); g_return_if_fail(clist); - + row = fileinfo_data_get_row(file); g_return_if_fail(row >= 0); @@ -702,7 +753,7 @@ g_return_if_fail(func); g_return_if_fail(clist); - + gtk_clist_freeze(clist); for (row = 0; row < clist->rows; row++) { (*func)(get_fileinfo_data(row), user_data);
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk1/gnet_stats.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk1/gnet_stats.c
Changed
@@ -47,9 +47,10 @@ #include "if/gui_property_priv.h" #include "if/bridge/ui2c.h" -#include "lib/glib-missing.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/tm.h" + #include "lib/override.h" /* Must be the last header included */ enum gnet_stats_nb_page { @@ -78,7 +79,7 @@ return GUI_PROPERTY(gnet_stats_perc) ? "- " : "-"; if (GUI_PROPERTY(gnet_stats_perc)) - gm_snprintf(strbuf, sizeof strbuf, "%.2f%%", + str_bprintf(strbuf, sizeof strbuf, "%.2f%%", (gfloat) val_tbltype / val_tblMSG_TOTAL * 100.0); else uint64_to_string_buf(val_tbltype, strbuf, sizeof strbuf); @@ -103,51 +104,33 @@ guint64 total_size = val_tblMSG_TOTAL; if (!GUI_PROPERTY(gnet_stats_with_headers)) size -= nb_packetsMSG_TOTAL * GTA_HEADER_SIZE; - gm_snprintf(strbuf, sizeof strbuf, "%.2f%%", + str_bprintf(strbuf, sizeof strbuf, "%.2f%%", (gfloat) size / total_size * 100.0); return strbuf; } else return compact_size(size, show_metric_units()); } -const gchar * -drop_stat_str(const gnet_stats_t *stats, gint reason) +static const gchar * +drop_stat_str(const gnet_stats_t *stats, gint reason, gint selected_type) { static gchar strbufUINT64_DEC_BUFLEN; - guint32 total = stats->pkg.droppedMSG_TOTAL; - guint i = GUI_PROPERTY(gnet_stats_drop_reasons_type); - if (stats->drop_reasonreasoni == 0) - return GUI_PROPERTY(gnet_stats_perc) ? "- " : "-"; + if (stats->drop_reasonreasonselected_type == 0) + return "-"; - if (GUI_PROPERTY(gnet_stats_perc)) - gm_snprintf(strbuf, sizeof strbuf, "%.2f%%", - (gfloat) stats->drop_reasonreasoni / total * 100); - else - uint64_to_string_buf(stats->drop_reasonreasoni, - strbuf, sizeof strbuf); + uint64_to_string_buf(stats->drop_reasonreasonselected_type, + strbuf, sizeof strbuf); return strbuf; } -const gchar * +static const gchar * general_stat_str(const gnet_stats_t *stats, gint type) { static gchar strbufUINT64_DEC_BUFLEN; - if (stats->generaltype == 0) - return "-"; - - switch (type) { - case GNR_QUERY_COMPACT_SIZE: - case GNR_IGNORED_DATA: - case GNR_SUNK_DATA: - return compact_size(stats->generaltype, show_metric_units()); - default: - break; - } - - uint64_to_string_buf(stats->generaltype, strbuf, sizeof strbuf); + gnet_stats_gui_general_to_string_buf(strbuf, sizeof strbuf, stats, type); return strbuf; } @@ -160,7 +143,7 @@ return GUI_PROPERTY(gnet_stats_perc) ? "- " : "-"; if (GUI_PROPERTY(gnet_stats_perc)) { - gm_snprintf(strbuf, sizeof strbuf, "%.2f%%", + str_bprintf(strbuf, sizeof strbuf, "%.2f%%", (gfloat) val_tbltype / val_tblMSG_TOTAL * 100.0); } else { uint64_to_string_buf(val_tbltype, strbuf, sizeof strbuf); @@ -178,7 +161,7 @@ return GUI_PROPERTY(gnet_stats_perc) ? "- " : "-"; if (GUI_PROPERTY(gnet_stats_perc)) { - gm_snprintf(strbuf, sizeof strbuf, "%.2f%%", + str_bprintf(strbuf, sizeof strbuf, "%.2f%%", (gfloat) val_tbltype / val_tblMSG_TOTAL * 100.0); } else { return compact_size(val_tbltype, show_metric_units()); @@ -203,7 +186,7 @@ gchar *titles10; guint n; - for (n = 0; n < G_N_ELEMENTS(titles); n ++) + for (n = 0; n < N_ITEMS(titles); n ++) titlesn = "-"; clist_stats_msg = GTK_CLIST( @@ -301,7 +284,7 @@ } guc_hsep_add_global_table_listener( - (GCallback) gnet_stats_gui_horizon_update, FREQ_UPDATES, 0); + (callback_fn_t) gnet_stats_gui_horizon_update, FREQ_UPDATES, 0); notebook_gnet_stats = GTK_NOTEBOOK(gui_main_window_lookup("gnet_stats_notebook")); @@ -313,8 +296,8 @@ gnet_stats_gui_shutdown(void) { guc_hsep_remove_global_table_listener( - (GCallback) gnet_stats_gui_horizon_update); - + (callback_fn_t) gnet_stats_gui_horizon_update); + clist_save_widths( GTK_CLIST(gui_main_window_lookup("clist_gnet_stats_msg")), PROP_GNET_STATS_MSG_COL_WIDTHS); @@ -339,17 +322,22 @@ gnet_stats_update_general(const gnet_stats_t *stats) { static GtkCList *clist_general; + static uint64 generalGNR_TYPE_COUNT; gint n; - if (NULL == clist_general) { + if G_UNLIKELY(NULL == clist_general) { clist_general = GTK_CLIST(gui_main_window_lookup("clist_gnet_stats_general")); + memset(general, 255, sizeof general); } gtk_clist_freeze(clist_general); for (n = 0; n < GNR_TYPE_COUNT; n ++) { - gtk_clist_set_text(clist_general, n, 1, general_stat_str(stats, n)); + if (stats->generaln != generaln) { + generaln = stats->generaln; + gtk_clist_set_text(clist_general, n, 1, general_stat_str(stats, n)); + } } gtk_clist_thaw(clist_general); @@ -359,17 +347,23 @@ gnet_stats_update_drop_reasons(const gnet_stats_t *stats) { static GtkCList *clist_reason; + static uint64 drop_reasonMSG_DROP_REASON_COUNTMSG_TYPE_COUNT; gint n; + guint i = GUI_PROPERTY(gnet_stats_drop_reasons_type); - if (NULL == clist_reason) { + if G_UNLIKELY(NULL == clist_reason) { clist_reason = GTK_CLIST(gui_main_window_lookup("clist_gnet_stats_drop_reasons")); + memset(drop_reason, 255, sizeof drop_reason); } gtk_clist_freeze(clist_reason); for (n = 0; n < MSG_DROP_REASON_COUNT; n ++) { - gtk_clist_set_text(clist_reason, n, 1, drop_stat_str(stats, n)); + if (stats->drop_reasonni != drop_reasonni) { + drop_reasonni = stats->drop_reasonni; + gtk_clist_set_text(clist_reason, n, 1, drop_stat_str(stats, n, i)); + } } gtk_clist_thaw(clist_reason);
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk1/gtk-gnutella.glade -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk1/gtk-gnutella.glade
Changed
@@ -1877,7 +1877,7 @@ <widget> <class>GtkTable</class> <name>table91</name> - <rows>1</rows> + <rows>2</rows> <columns>2</columns> <homogeneous>False</homogeneous> <row_spacing>2</row_spacing> @@ -1945,6 +1945,64 @@ <yfill>False</yfill> </child> </widget> + + <widget> + <class>GtkSpinButton</class> + <name>spinbutton_max_g2_hubs</name> + <can_focus>True</can_focus> + <climb_rate>1</climb_rate> + <digits>0</digits> + <numeric>False</numeric> + <update_policy>GTK_UPDATE_ALWAYS</update_policy> + <snap>False</snap> + <wrap>False</wrap> + <value>1</value> + <lower>0</lower> + <upper>100</upper> + <step>1</step> + <page>10</page> + <page_size>10</page_size> + <child> + <left_attach>1</left_attach> + <right_attach>2</right_attach> + <top_attach>1</top_attach> + <bottom_attach>2</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label8035</name> + <label>G2 hubs</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>1</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + <child> + <left_attach>0</left_attach> + <right_attach>1</right_attach> + <top_attach>1</top_attach> + <bottom_attach>2</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + </widget> </widget> </widget> </widget> @@ -2427,36 +2485,6 @@ </widget> <widget> - <class>GtkScrolledWindow</class> - <name>scrolledwindow4972</name> - <hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy> - <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy> - <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy> - <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy> - - <widget> - <class>GtkText</class> - <name>text_result_info_bitzi</name> - <can_focus>True</can_focus> - <editable>False</editable> - <text></text> - </widget> - </widget> - - <widget> - <class>GtkLabel</class> - <child_name>Notebook:tab</child_name> - <name>label8010</name> - <label>Bitzi Metadata</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - </widget> - - <widget> <class>GtkTable</class> <name>table68</name> <border_width>2</border_width> @@ -2965,6 +2993,29 @@ <yfill>False</yfill> </child> </widget> + + <widget> + <class>GtkCheckButton</class> + <name>checkbutton_search_display_guess_stats</name> + <can_focus>True</can_focus> + <label>Display GUESS statistics</label> + <active>False</active> + <draw_indicator>True</draw_indicator> + <child> + <left_attach>0</left_attach> + <right_attach>1</right_attach> + <top_attach>6</top_attach> + <bottom_attach>7</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + </widget> </widget> <widget> @@ -2986,6 +3037,67 @@ <widget> <class>GtkHBox</class> + <name>guess_stats_line</name> + <homogeneous>False</homogeneous> + <spacing>0</spacing> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>True</fill> + </child> + + <widget> + <class>GtkViewport</class> + <name>viewport_fix_flashing_3</name> + <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + + <widget> + <class>GtkHBox</class> + <name>hbox2114</name> + <homogeneous>False</homogeneous> + <spacing>0</spacing> + + <widget> + <class>GtkLabel</class> + <name>label_guess_stats</name> + <label></label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>5</xpad> + <ypad>0</ypad> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + </widget> + </widget> + </widget> + + <widget> + <class>GtkCheckButton</class> + <name>checkbutton_guess_stats_show_total</name> + <can_focus>True</can_focus> + <label>Total</label> + <active>False</active> + <draw_indicator>True</draw_indicator> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + </widget> + </widget> + + <widget> + <class>GtkHBox</class> <name>hbox147</name> <homogeneous>False</homogeneous> <spacing>4</spacing> @@ -6809,8 +6921,25 @@ <widget> <class>GtkLabel</class> - <name>label_html_browse_served</name> - <label>BH HTML served</label> + <name>label8005</name> + <label></label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>4</xpad> + <ypad>0</ypad> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label_g2_browse_served</name> + <label>G2 served</label> <justify>GTK_JUSTIFY_CENTER</justify> <wrap>False</wrap> <xalign>0.5</xalign> @@ -6826,7 +6955,7 @@ <widget> <class>GtkLabel</class> - <name>label781</name> + <name>label8037</name> <label> / </label> <justify>GTK_JUSTIFY_CENTER</justify> <wrap>False</wrap> @@ -6843,8 +6972,8 @@ <widget> <class>GtkLabel</class> - <name>label_html_browse_count</name> - <label>BH HTML</label> + <name>label_g2_browse_count</name> + <label>G2</label> <justify>GTK_JUSTIFY_CENTER</justify> <wrap>False</wrap> <xalign>0.5</xalign> @@ -6860,8 +6989,8 @@ <widget> <class>GtkLabel</class> - <name>label747</name> - <label> HTML and </label> + <name>label8039</name> + <label> G2, </label> <justify>GTK_JUSTIFY_CENTER</justify> <wrap>False</wrap> <xalign>0.5</xalign> @@ -6877,8 +7006,8 @@ <widget> <class>GtkLabel</class> - <name>label_qhits_browse_served</name> - <label>BH qhits served</label> + <name>label_html_browse_served</name> + <label>BH HTML served</label> <justify>GTK_JUSTIFY_CENTER</justify> <wrap>False</wrap> <xalign>0.5</xalign> @@ -6894,7 +7023,7 @@ <widget> <class>GtkLabel</class> - <name>label779</name> + <name>label781</name> <label> / </label> <justify>GTK_JUSTIFY_CENTER</justify> <wrap>False</wrap> @@ -6911,8 +7040,8 @@ <widget> <class>GtkLabel</class> - <name>label_qhits_browse_count</name> - <label>BH qhits</label> + <name>label_html_browse_count</name> + <label>BH HTML</label> <justify>GTK_JUSTIFY_CENTER</justify> <wrap>False</wrap> <xalign>0.5</xalign> @@ -6928,8 +7057,8 @@ <widget> <class>GtkLabel</class> - <name>label749</name> - <label> Gnutella browse requests</label> + <name>label747</name> + <label> HTML and </label> <justify>GTK_JUSTIFY_CENTER</justify> <wrap>False</wrap> <xalign>0.5</xalign> @@ -6945,13 +7074,64 @@ <widget> <class>GtkLabel</class> - <name>label8005</name> - <label></label> + <name>label_qhits_browse_served</name> + <label>BH qhits served</label> <justify>GTK_JUSTIFY_CENTER</justify> <wrap>False</wrap> <xalign>0.5</xalign> <yalign>0.5</yalign> - <xpad>4</xpad> + <xpad>0</xpad> + <ypad>0</ypad> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label779</name> + <label> / </label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label_qhits_browse_count</name> + <label>BH qhits</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label749</name> + <label> Gnutella browse requests</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> <ypad>0</ypad> <child> <padding>0</padding> @@ -7384,6 +7564,108 @@ </widget> </widget> </widget> + + <widget> + <class>GtkVBox</class> + <name>vbox148</name> + <homogeneous>False</homogeneous> + <spacing>2</spacing> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + + <widget> + <class>GtkProgressBar</class> + <name>progressbar_hosts_in_g2hub_catcher</name> + <value>0</value> + <lower>0</lower> + <upper>100</upper> + <bar_style>GTK_PROGRESS_CONTINUOUS</bar_style> + <orientation>GTK_PROGRESS_LEFT_TO_RIGHT</orientation> + <activity_mode>False</activity_mode> + <show_text>True</show_text> + <format>%v/%u (%P%%)</format> + <text_xalign>0.5</text_xalign> + <text_yalign>0.5</text_yalign> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + </widget> + + <widget> + <class>GtkHBox</class> + <name>hbox2115</name> + <homogeneous>False</homogeneous> + <spacing>4</spacing> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + + <widget> + <class>GtkLabel</class> + <name>label_g2_hosts</name> + <label>G2 hubs</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + </widget> + + <widget> + <class>GtkSpinButton</class> + <name>spinbutton_max_g2hub_hosts_cached</name> + <can_focus>True</can_focus> + <climb_rate>1</climb_rate> + <digits>0</digits> + <numeric>True</numeric> + <update_policy>GTK_UPDATE_ALWAYS</update_policy> + <snap>False</snap> + <wrap>False</wrap> + <value>100</value> + <lower>100</lower> + <upper>500000</upper> + <step>1</step> + <page>100</page> + <page_size>100</page_size> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + </widget> + + <widget> + <class>GtkButton</class> + <name>button_g2hub_catcher_clear</name> + <can_focus>True</can_focus> + <signal> + <name>clicked</name> + <handler>on_button_hostcache_clear_bad_clicked</handler> + <last_modification_time>Mon, 07 Jun 2004 18:41:21 GMT</last_modification_time> + </signal> + <label>Clear</label> + <relief>GTK_RELIEF_NORMAL</relief> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + </widget> + </widget> + </widget> </widget> </widget> </widget> @@ -7773,8 +8055,8 @@ <widget> <class>GtkEventBox</class> - <name>eventbox_port_mapping_successful</name> - <tooltip>Port mapping configured through UPnP or NAT-PMP.</tooltip> + <name>eventbox_upnp_port_mapping_successful</name> + <tooltip>Port mapping configured through UPnP.</tooltip> <child> <padding>0</padding> <expand>True</expand> @@ -7783,7 +8065,7 @@ <widget> <class>GtkPixmap</class> - <name>image_port_mapping_successful</name> + <name>image_upnp_successful</name> <filename>upnp.xpm</filename> <xalign>0.5</xalign> <yalign>0.5</yalign> @@ -7792,6 +8074,28 @@ <build_insensitive>False</build_insensitive> </widget> </widget> + + <widget> + <class>GtkEventBox</class> + <name>eventbox_natpmp_port_mapping_successful</name> + <tooltip>Port mapping configured through NAT-PMP.</tooltip> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + + <widget> + <class>GtkPixmap</class> + <name>image_natpmp_successful</name> + <filename>natpmp.xpm</filename> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + <build_insensitive>False</build_insensitive> + </widget> + </widget> </widget> <widget> @@ -7932,7 +8236,7 @@ <widget> <class>GtkEventBox</class> <name>eventbox_early_stall_2</name> - <tooltip>Splitting ougoing HTTP bandwidth evenly.</tooltip> + <tooltip>Splitting outgoing HTTP bandwidth evenly.</tooltip> <child> <padding>0</padding> <expand>True</expand> @@ -8636,13 +8940,6 @@ <widget> <class>GtkMenuItem</class> - <name>popup_search_metadata</name> - <label>Bitzi metadata</label> - <right_justify>False</right_justify> - </widget> - - <widget> - <class>GtkMenuItem</class> <name>popup_search_browse_host</name> <label>Browse host</label> <right_justify>False</right_justify> @@ -12820,7 +13117,7 @@ <widget> <class>GtkPixmap</class> <name>pixmap4</name> - <filename>icon.xpm</filename> + <filename>icon.48x48.xpm</filename> <xalign>0.5</xalign> <yalign>0.5</yalign> <xpad>0</xpad> @@ -14321,11 +14618,12 @@ <widget> <class>GtkTable</class> <name>table102</name> - <rows>1</rows> + <border_width>2</border_width> + <rows>2</rows> <columns>2</columns> <homogeneous>False</homogeneous> <row_spacing>0</row_spacing> - <column_spacing>0</column_spacing> + <column_spacing>4</column_spacing> <widget> <class>GtkCheckButton</class> @@ -14372,6 +14670,65 @@ <yfill>False</yfill> </child> </widget> + + <widget> + <class>GtkLabel</class> + <name>label8034</name> + <label>Mapping lease time</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + <child> + <left_attach>0</left_attach> + <right_attach>1</right_attach> + <top_attach>1</top_attach> + <bottom_attach>2</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + </widget> + + <widget> + <class>GtkSpinButton</class> + <name>spinbutton_config_upnp_mapping_lease_time</name> + <width>64</width> + <can_focus>True</can_focus> + <climb_rate>1</climb_rate> + <digits>0</digits> + <numeric>True</numeric> + <update_policy>GTK_UPDATE_ALWAYS</update_policy> + <snap>False</snap> + <wrap>False</wrap> + <value>1</value> + <lower>0</lower> + <upper>100</upper> + <step>1</step> + <page>10</page> + <page_size>10</page_size> + <child> + <left_attach>1</left_attach> + <right_attach>2</right_attach> + <top_attach>1</top_attach> + <bottom_attach>2</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>False</xfill> + <yfill>False</yfill> + </child> + </widget> </widget> </widget> @@ -16580,7 +16937,7 @@ <widget> <class>GtkTable</class> <name>table83</name> - <rows>4</rows> + <rows>5</rows> <columns>3</columns> <homogeneous>False</homogeneous> <row_spacing>2</row_spacing> @@ -16803,6 +17160,29 @@ <yfill>False</yfill> </child> </widget> + + <widget> + <class>GtkCheckButton</class> + <name>checkbutton_enable_g2</name> + <can_focus>True</can_focus> + <label>Enable the G2 network</label> + <active>False</active> + <draw_indicator>True</draw_indicator> + <child> + <left_attach>0</left_attach> + <right_attach>2</right_attach> + <top_attach>4</top_attach> + <bottom_attach>5</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + </widget> </widget> </widget> @@ -20642,7 +21022,7 @@ <widget> <class>GtkTable</class> <name>table103</name> - <rows>1</rows> + <rows>2</rows> <columns>3</columns> <homogeneous>False</homogeneous> <row_spacing>2</row_spacing> @@ -20732,6 +21112,29 @@ <yfill>False</yfill> </child> </widget> + + <widget> + <class>GtkCheckButton</class> + <name>checkbutton_guess_maximize_bw</name> + <can_focus>True</can_focus> + <label>Allow unused Gnutella outgoing bandwidth to supersede hint</label> + <active>False</active> + <draw_indicator>True</draw_indicator> + <child> + <left_attach>0</left_attach> + <right_attach>3</right_attach> + <top_attach>1</top_attach> + <bottom_attach>2</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + </widget> </widget> </widget> </widget> @@ -23168,7 +23571,7 @@ <class>GtkCheckButton</class> <name>checkbutton_pfsp_rare_server</name> <can_focus>True</can_focus> - <label>Enable upload of patial files deemed rare</label> + <label>Enable upload of partial files deemed rare</label> <active>False</active> <draw_indicator>True</draw_indicator> <child>
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk1/hcache.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk1/hcache.c
Changed
@@ -32,8 +32,9 @@ #include "if/gui_property.h" #include "if/bridge/ui2c.h" -#include "lib/glib-missing.h" +#include "lib/str.h" #include "lib/stringify.h" + #include "lib/override.h" /* Must be the last header included */ /*** @@ -44,7 +45,7 @@ { static gchar strbufUINT32_DEC_BUFLEN; - gm_snprintf(strbuf, sizeof(strbuf), "%u", i); + str_bprintf(strbuf, sizeof(strbuf), "%u", i); return strbuf; } @@ -88,7 +89,7 @@ const gchar *titles5; guint i; - for (i = 0; i < G_N_ELEMENTS(titles); i++) { + for (i = 0; i < N_ITEMS(titles); i++) { titlesi = "-"; } clist = GTK_CLIST(gui_main_window_lookup("clist_hcache"));
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk1/interface-glade.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk1/interface-glade.c
Changed
@@ -175,6 +175,9 @@ GtkObject *spinbutton_quick_connect_pool_size_adj; GtkWidget *spinbutton_quick_connect_pool_size; GtkWidget *label680; + GtkObject *spinbutton_max_g2_hubs_adj; + GtkWidget *spinbutton_max_g2_hubs; + GtkWidget *label8035; GtkWidget *vbox83; GtkWidget *frame_expert_node_info; GtkWidget *vbox34; @@ -211,9 +214,6 @@ GtkWidget *scrolledwindow491; GtkWidget *text_result_info_xml; GtkWidget *label793; - GtkWidget *scrolledwindow4972; - GtkWidget *text_result_info_bitzi; - GtkWidget *label8010; GtkWidget *table68; guint checkbutton_search_hide_downloaded_key; GtkWidget *checkbutton_search_hide_downloaded; @@ -244,7 +244,13 @@ GtkWidget *spinbutton_whats_new_search_max_results; GtkWidget *checkbutton_search_discard_alien_ip; GtkWidget *checkbutton_search_discard_banned_guid; + GtkWidget *checkbutton_search_display_guess_stats; GtkWidget *label789; + GtkWidget *guess_stats_line; + GtkWidget *viewport_fix_flashing_3; + GtkWidget *hbox2114; + GtkWidget *label_guess_stats; + GtkWidget *checkbutton_guess_stats_show_total; GtkWidget *hbox147; GtkWidget *viewport_fix_flashing_1; GtkWidget *hbox167; @@ -512,6 +518,11 @@ GtkWidget *viewport50; GtkWidget *hbox2101; GtkWidget *label745; + GtkWidget *label8005; + GtkWidget *label_g2_browse_served; + GtkWidget *label8037; + GtkWidget *label_g2_browse_count; + GtkWidget *label8039; GtkWidget *label_html_browse_served; GtkWidget *label781; GtkWidget *label_html_browse_count; @@ -520,7 +531,6 @@ GtkWidget *label779; GtkWidget *label_qhits_browse_count; GtkWidget *label749; - GtkWidget *label8005; GtkWidget *label7980; GtkWidget *vbox127; GtkWidget *scrolledwindow46; @@ -552,6 +562,13 @@ GtkObject *spinbutton_max_bad_hosts_cached_adj; GtkWidget *spinbutton_max_bad_hosts_cached; GtkWidget *button_hostcache_clear_bad; + GtkWidget *vbox148; + GtkWidget *progressbar_hosts_in_g2hub_catcher; + GtkWidget *hbox2115; + GtkWidget *label_g2_hosts; + GtkObject *spinbutton_max_g2hub_hosts_cached_adj; + GtkWidget *spinbutton_max_g2hub_hosts_cached; + GtkWidget *button_g2hub_catcher_clear; GtkWidget *label7987; GtkWidget *vbox12a; GtkWidget *hbox67; @@ -587,8 +604,10 @@ GtkWidget *hbox_port_mapping; GtkWidget *eventbox_port_mapping_possible; GtkWidget *image_port_mapping_possible; - GtkWidget *eventbox_port_mapping_successful; - GtkWidget *image_port_mapping_successful; + GtkWidget *eventbox_upnp_port_mapping_successful; + GtkWidget *image_upnp_successful; + GtkWidget *eventbox_natpmp_port_mapping_successful; + GtkWidget *image_natpmp_successful; GtkWidget *alignment25; GtkWidget *statusbar; GtkWidget *frame_status_images; @@ -2027,7 +2046,7 @@ (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); - table91 = gtk_table_new (1, 2, FALSE); + table91 = gtk_table_new (2, 2, FALSE); gtk_widget_set_name (table91, "table91"); gtk_widget_ref (table91); gtk_object_set_data_full (GTK_OBJECT (main_window), "table91", table91, @@ -2059,6 +2078,28 @@ (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label680), 1, 0.5); + spinbutton_max_g2_hubs_adj = gtk_adjustment_new (1, 0, 100, 1, 10, 10); + spinbutton_max_g2_hubs = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_max_g2_hubs_adj), 1, 0); + gtk_widget_set_name (spinbutton_max_g2_hubs, "spinbutton_max_g2_hubs"); + gtk_widget_ref (spinbutton_max_g2_hubs); + gtk_object_set_data_full (GTK_OBJECT (main_window), "spinbutton_max_g2_hubs", spinbutton_max_g2_hubs, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (spinbutton_max_g2_hubs); + gtk_table_attach (GTK_TABLE (table91), spinbutton_max_g2_hubs, 1, 2, 1, 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + + label8035 = gtk_label_new (_("G2 hubs")); + gtk_widget_set_name (label8035, "label8035"); + gtk_widget_ref (label8035); + gtk_object_set_data_full (GTK_OBJECT (main_window), "label8035", label8035, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (label8035); + gtk_table_attach (GTK_TABLE (table91), label8035, 0, 1, 1, 2, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_misc_set_alignment (GTK_MISC (label8035), 1, 0.5); + vbox83 = gtk_vbox_new (FALSE, 0); gtk_widget_set_name (vbox83, "vbox83"); gtk_widget_ref (vbox83); @@ -2371,31 +2412,6 @@ gtk_widget_show (label793); gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook4), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook4), 1), label793); - scrolledwindow4972 = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_set_name (scrolledwindow4972, "scrolledwindow4972"); - gtk_widget_ref (scrolledwindow4972); - gtk_object_set_data_full (GTK_OBJECT (main_window), "scrolledwindow4972", scrolledwindow4972, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (scrolledwindow4972); - gtk_container_add (GTK_CONTAINER (notebook4), scrolledwindow4972); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow4972), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); - - text_result_info_bitzi = gtk_text_new (NULL, NULL); - gtk_widget_set_name (text_result_info_bitzi, "text_result_info_bitzi"); - gtk_widget_ref (text_result_info_bitzi); - gtk_object_set_data_full (GTK_OBJECT (main_window), "text_result_info_bitzi", text_result_info_bitzi, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (text_result_info_bitzi); - gtk_container_add (GTK_CONTAINER (scrolledwindow4972), text_result_info_bitzi); - - label8010 = gtk_label_new (_("Bitzi Metadata")); - gtk_widget_set_name (label8010, "label8010"); - gtk_widget_ref (label8010); - gtk_object_set_data_full (GTK_OBJECT (main_window), "label8010", label8010, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (label8010); - gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook4), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook4), 2), label8010); - table68 = gtk_table_new (7, 4, FALSE); gtk_widget_set_name (table68, "table68"); gtk_widget_ref (table68); @@ -2646,13 +2662,66 @@ (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + checkbutton_search_display_guess_stats = gtk_check_button_new_with_label (_("Display GUESS statistics")); + gtk_widget_set_name (checkbutton_search_display_guess_stats, "checkbutton_search_display_guess_stats"); + gtk_widget_ref (checkbutton_search_display_guess_stats); + gtk_object_set_data_full (GTK_OBJECT (main_window), "checkbutton_search_display_guess_stats", checkbutton_search_display_guess_stats, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (checkbutton_search_display_guess_stats); + gtk_table_attach (GTK_TABLE (table68), checkbutton_search_display_guess_stats, 0, 1, 6, 7, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + label789 = gtk_label_new (_("General search settings (affect all searches)")); gtk_widget_set_name (label789, "label789"); gtk_widget_ref (label789); gtk_object_set_data_full (GTK_OBJECT (main_window), "label789", label789, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label789); - gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook4), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook4), 3), label789); + gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook4), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook4), 2), label789); + + guess_stats_line = gtk_hbox_new (FALSE, 0); + gtk_widget_set_name (guess_stats_line, "guess_stats_line"); + gtk_widget_ref (guess_stats_line); + gtk_object_set_data_full (GTK_OBJECT (main_window), "guess_stats_line", guess_stats_line, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (guess_stats_line); + gtk_box_pack_start (GTK_BOX (vbox76), guess_stats_line, FALSE, TRUE, 0); + + viewport_fix_flashing_3 = gtk_viewport_new (NULL, NULL); + gtk_widget_set_name (viewport_fix_flashing_3, "viewport_fix_flashing_3"); + gtk_widget_ref (viewport_fix_flashing_3); + gtk_object_set_data_full (GTK_OBJECT (main_window), "viewport_fix_flashing_3", viewport_fix_flashing_3, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (viewport_fix_flashing_3); + gtk_box_pack_start (GTK_BOX (guess_stats_line), viewport_fix_flashing_3, TRUE, TRUE, 0); + gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport_fix_flashing_3), GTK_SHADOW_ETCHED_IN); + + hbox2114 = gtk_hbox_new (FALSE, 0); + gtk_widget_set_name (hbox2114, "hbox2114"); + gtk_widget_ref (hbox2114); + gtk_object_set_data_full (GTK_OBJECT (main_window), "hbox2114", hbox2114, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (hbox2114); + gtk_container_add (GTK_CONTAINER (viewport_fix_flashing_3), hbox2114); + + label_guess_stats = gtk_label_new (""); + gtk_widget_set_name (label_guess_stats, "label_guess_stats"); + gtk_widget_ref (label_guess_stats); + gtk_object_set_data_full (GTK_OBJECT (main_window), "label_guess_stats", label_guess_stats, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (label_guess_stats); + gtk_box_pack_start (GTK_BOX (hbox2114), label_guess_stats, TRUE, TRUE, 0); + gtk_misc_set_alignment (GTK_MISC (label_guess_stats), 0, 0.5); + gtk_misc_set_padding (GTK_MISC (label_guess_stats), 5, 0); + + checkbutton_guess_stats_show_total = gtk_check_button_new_with_label (_("Total")); + gtk_widget_set_name (checkbutton_guess_stats_show_total, "checkbutton_guess_stats_show_total"); + gtk_widget_ref (checkbutton_guess_stats_show_total); + gtk_object_set_data_full (GTK_OBJECT (main_window), "checkbutton_guess_stats_show_total", checkbutton_guess_stats_show_total, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (checkbutton_guess_stats_show_total); + gtk_box_pack_start (GTK_BOX (guess_stats_line), checkbutton_guess_stats_show_total, FALSE, FALSE, 0); hbox147 = gtk_hbox_new (FALSE, 4); gtk_widget_set_name (hbox147, "hbox147"); @@ -4987,6 +5056,47 @@ gtk_box_pack_start (GTK_BOX (hbox2101), label745, TRUE, TRUE, 0); gtk_misc_set_alignment (GTK_MISC (label745), 1, 0.5); + label8005 = gtk_label_new (""); + gtk_widget_set_name (label8005, "label8005"); + gtk_widget_ref (label8005); + gtk_object_set_data_full (GTK_OBJECT (main_window), "label8005", label8005, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (label8005); + gtk_box_pack_start (GTK_BOX (hbox2101), label8005, FALSE, FALSE, 0); + gtk_misc_set_padding (GTK_MISC (label8005), 4, 0); + + label_g2_browse_served = gtk_label_new (_("G2 served")); + gtk_widget_set_name (label_g2_browse_served, "label_g2_browse_served"); + gtk_widget_ref (label_g2_browse_served); + gtk_object_set_data_full (GTK_OBJECT (main_window), "label_g2_browse_served", label_g2_browse_served, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (label_g2_browse_served); + gtk_box_pack_start (GTK_BOX (hbox2101), label_g2_browse_served, FALSE, FALSE, 0); + + label8037 = gtk_label_new (_(" / ")); + gtk_widget_set_name (label8037, "label8037"); + gtk_widget_ref (label8037); + gtk_object_set_data_full (GTK_OBJECT (main_window), "label8037", label8037, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (label8037); + gtk_box_pack_start (GTK_BOX (hbox2101), label8037, FALSE, FALSE, 0); + + label_g2_browse_count = gtk_label_new (_("G2")); + gtk_widget_set_name (label_g2_browse_count, "label_g2_browse_count"); + gtk_widget_ref (label_g2_browse_count); + gtk_object_set_data_full (GTK_OBJECT (main_window), "label_g2_browse_count", label_g2_browse_count, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (label_g2_browse_count); + gtk_box_pack_start (GTK_BOX (hbox2101), label_g2_browse_count, FALSE, FALSE, 0); + + label8039 = gtk_label_new (_(" G2, ")); + gtk_widget_set_name (label8039, "label8039"); + gtk_widget_ref (label8039); + gtk_object_set_data_full (GTK_OBJECT (main_window), "label8039", label8039, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (label8039); + gtk_box_pack_start (GTK_BOX (hbox2101), label8039, FALSE, FALSE, 0); + label_html_browse_served = gtk_label_new (_("BH HTML served")); gtk_widget_set_name (label_html_browse_served, "label_html_browse_served"); gtk_widget_ref (label_html_browse_served); @@ -5051,15 +5161,6 @@ gtk_widget_show (label749); gtk_box_pack_start (GTK_BOX (hbox2101), label749, FALSE, FALSE, 0); - label8005 = gtk_label_new (""); - gtk_widget_set_name (label8005, "label8005"); - gtk_widget_ref (label8005); - gtk_object_set_data_full (GTK_OBJECT (main_window), "label8005", label8005, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (label8005); - gtk_box_pack_start (GTK_BOX (hbox2101), label8005, FALSE, FALSE, 0); - gtk_misc_set_padding (GTK_MISC (label8005), 4, 0); - label7980 = gtk_label_new (_("Upload History")); gtk_widget_set_name (label7980, "label7980"); gtk_widget_ref (label7980); @@ -5305,6 +5406,59 @@ gtk_widget_show (button_hostcache_clear_bad); gtk_box_pack_start (GTK_BOX (hbox204), button_hostcache_clear_bad, FALSE, FALSE, 0); + vbox148 = gtk_vbox_new (FALSE, 2); + gtk_widget_set_name (vbox148, "vbox148"); + gtk_widget_ref (vbox148); + gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox148", vbox148, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (vbox148); + gtk_box_pack_start (GTK_BOX (hbox201), vbox148, TRUE, TRUE, 0); + + progressbar_hosts_in_g2hub_catcher = gtk_progress_bar_new (); + gtk_widget_set_name (progressbar_hosts_in_g2hub_catcher, "progressbar_hosts_in_g2hub_catcher"); + gtk_widget_ref (progressbar_hosts_in_g2hub_catcher); + gtk_object_set_data_full (GTK_OBJECT (main_window), "progressbar_hosts_in_g2hub_catcher", progressbar_hosts_in_g2hub_catcher, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (progressbar_hosts_in_g2hub_catcher); + gtk_box_pack_start (GTK_BOX (vbox148), progressbar_hosts_in_g2hub_catcher, FALSE, FALSE, 0); + gtk_progress_set_show_text (GTK_PROGRESS (progressbar_hosts_in_g2hub_catcher), TRUE); + gtk_progress_set_format_string (GTK_PROGRESS (progressbar_hosts_in_g2hub_catcher), _("%v/%u (%P%%)")); + + hbox2115 = gtk_hbox_new (FALSE, 4); + gtk_widget_set_name (hbox2115, "hbox2115"); + gtk_widget_ref (hbox2115); + gtk_object_set_data_full (GTK_OBJECT (main_window), "hbox2115", hbox2115, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (hbox2115); + gtk_box_pack_start (GTK_BOX (vbox148), hbox2115, TRUE, TRUE, 0); + + label_g2_hosts = gtk_label_new (_("G2 hubs")); + gtk_widget_set_name (label_g2_hosts, "label_g2_hosts"); + gtk_widget_ref (label_g2_hosts); + gtk_object_set_data_full (GTK_OBJECT (main_window), "label_g2_hosts", label_g2_hosts, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (label_g2_hosts); + gtk_box_pack_start (GTK_BOX (hbox2115), label_g2_hosts, FALSE, FALSE, 0); + gtk_misc_set_alignment (GTK_MISC (label_g2_hosts), 0, 0.5); + + spinbutton_max_g2hub_hosts_cached_adj = gtk_adjustment_new (100, 100, 500000, 1, 100, 100); + spinbutton_max_g2hub_hosts_cached = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_max_g2hub_hosts_cached_adj), 1, 0); + gtk_widget_set_name (spinbutton_max_g2hub_hosts_cached, "spinbutton_max_g2hub_hosts_cached"); + gtk_widget_ref (spinbutton_max_g2hub_hosts_cached); + gtk_object_set_data_full (GTK_OBJECT (main_window), "spinbutton_max_g2hub_hosts_cached", spinbutton_max_g2hub_hosts_cached, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (spinbutton_max_g2hub_hosts_cached); + gtk_box_pack_start (GTK_BOX (hbox2115), spinbutton_max_g2hub_hosts_cached, TRUE, TRUE, 0); + gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton_max_g2hub_hosts_cached), TRUE); + + button_g2hub_catcher_clear = gtk_button_new_with_label (_("Clear")); + gtk_widget_set_name (button_g2hub_catcher_clear, "button_g2hub_catcher_clear"); + gtk_widget_ref (button_g2hub_catcher_clear); + gtk_object_set_data_full (GTK_OBJECT (main_window), "button_g2hub_catcher_clear", button_g2hub_catcher_clear, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (button_g2hub_catcher_clear); + gtk_box_pack_start (GTK_BOX (hbox2115), button_g2hub_catcher_clear, FALSE, FALSE, 0); + label7987 = gtk_label_new (_("Hostcache")); gtk_widget_set_name (label7987, "label7987"); gtk_widget_ref (label7987); @@ -5566,23 +5720,41 @@ gtk_container_add (GTK_CONTAINER (eventbox_port_mapping_possible), image_port_mapping_possible); gtk_pixmap_set_build_insensitive (GTK_PIXMAP (image_port_mapping_possible), FALSE); - eventbox_port_mapping_successful = gtk_event_box_new (); - gtk_widget_set_name (eventbox_port_mapping_successful, "eventbox_port_mapping_successful"); - gtk_widget_ref (eventbox_port_mapping_successful); - gtk_object_set_data_full (GTK_OBJECT (main_window), "eventbox_port_mapping_successful", eventbox_port_mapping_successful, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (eventbox_port_mapping_successful); - gtk_box_pack_start (GTK_BOX (hbox_port_mapping), eventbox_port_mapping_successful, TRUE, TRUE, 0); - gtk_tooltips_set_tip (tooltips, eventbox_port_mapping_successful, _("Port mapping configured through UPnP or NAT-PMP."), NULL); - - image_port_mapping_successful = create_pixmap (main_window, "upnp.xpm"); - gtk_widget_set_name (image_port_mapping_successful, "image_port_mapping_successful"); - gtk_widget_ref (image_port_mapping_successful); - gtk_object_set_data_full (GTK_OBJECT (main_window), "image_port_mapping_successful", image_port_mapping_successful, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (image_port_mapping_successful); - gtk_container_add (GTK_CONTAINER (eventbox_port_mapping_successful), image_port_mapping_successful); - gtk_pixmap_set_build_insensitive (GTK_PIXMAP (image_port_mapping_successful), FALSE); + eventbox_upnp_port_mapping_successful = gtk_event_box_new (); + gtk_widget_set_name (eventbox_upnp_port_mapping_successful, "eventbox_upnp_port_mapping_successful"); + gtk_widget_ref (eventbox_upnp_port_mapping_successful); + gtk_object_set_data_full (GTK_OBJECT (main_window), "eventbox_upnp_port_mapping_successful", eventbox_upnp_port_mapping_successful, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (eventbox_upnp_port_mapping_successful); + gtk_box_pack_start (GTK_BOX (hbox_port_mapping), eventbox_upnp_port_mapping_successful, TRUE, TRUE, 0); + gtk_tooltips_set_tip (tooltips, eventbox_upnp_port_mapping_successful, _("Port mapping configured through UPnP."), NULL); + + image_upnp_successful = create_pixmap (main_window, "upnp.xpm"); + gtk_widget_set_name (image_upnp_successful, "image_upnp_successful"); + gtk_widget_ref (image_upnp_successful); + gtk_object_set_data_full (GTK_OBJECT (main_window), "image_upnp_successful", image_upnp_successful, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (image_upnp_successful); + gtk_container_add (GTK_CONTAINER (eventbox_upnp_port_mapping_successful), image_upnp_successful); + gtk_pixmap_set_build_insensitive (GTK_PIXMAP (image_upnp_successful), FALSE); + + eventbox_natpmp_port_mapping_successful = gtk_event_box_new (); + gtk_widget_set_name (eventbox_natpmp_port_mapping_successful, "eventbox_natpmp_port_mapping_successful"); + gtk_widget_ref (eventbox_natpmp_port_mapping_successful); + gtk_object_set_data_full (GTK_OBJECT (main_window), "eventbox_natpmp_port_mapping_successful", eventbox_natpmp_port_mapping_successful, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (eventbox_natpmp_port_mapping_successful); + gtk_box_pack_start (GTK_BOX (hbox_port_mapping), eventbox_natpmp_port_mapping_successful, TRUE, TRUE, 0); + gtk_tooltips_set_tip (tooltips, eventbox_natpmp_port_mapping_successful, _("Port mapping configured through NAT-PMP."), NULL); + + image_natpmp_successful = create_pixmap (main_window, "natpmp.xpm"); + gtk_widget_set_name (image_natpmp_successful, "image_natpmp_successful"); + gtk_widget_ref (image_natpmp_successful); + gtk_object_set_data_full (GTK_OBJECT (main_window), "image_natpmp_successful", image_natpmp_successful, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (image_natpmp_successful); + gtk_container_add (GTK_CONTAINER (eventbox_natpmp_port_mapping_successful), image_natpmp_successful); + gtk_pixmap_set_build_insensitive (GTK_PIXMAP (image_natpmp_successful), FALSE); alignment25 = gtk_alignment_new (0.5, 0.5, 1, 1); gtk_widget_set_name (alignment25, "alignment25"); @@ -5705,7 +5877,7 @@ (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eventbox_early_stall_2); gtk_box_pack_start (GTK_BOX (hbox2110), eventbox_early_stall_2, TRUE, TRUE, 0); - gtk_tooltips_set_tip (tooltips, eventbox_early_stall_2, _("Splitting ougoing HTTP bandwidth evenly."), NULL); + gtk_tooltips_set_tip (tooltips, eventbox_early_stall_2, _("Splitting outgoing HTTP bandwidth evenly."), NULL); image_early_stall_2 = create_pixmap (main_window, "upload-yellow.xpm"); gtk_widget_set_name (image_early_stall_2, "image_early_stall_2"); @@ -6352,6 +6524,9 @@ gtk_signal_connect (GTK_OBJECT (button_hostcache_clear_bad), "clicked", GTK_SIGNAL_FUNC (on_button_hostcache_clear_bad_clicked), NULL); + gtk_signal_connect (GTK_OBJECT (button_g2hub_catcher_clear), "clicked", + GTK_SIGNAL_FUNC (on_button_hostcache_clear_bad_clicked), + NULL); gtk_signal_connect (GTK_OBJECT (button_search_stats_reset), "clicked", GTK_SIGNAL_FUNC (on_button_search_stats_reset_clicked), NULL); @@ -6501,7 +6676,6 @@ GtkWidget *popup_search; GtkAccelGroup *popup_search_accels; GtkWidget *popup_search_download; - GtkWidget *popup_search_metadata; GtkWidget *popup_search_browse_host; GtkWidget *popup_search_copy_magnet; GtkWidget *separator14; @@ -6532,14 +6706,6 @@ gtk_widget_show (popup_search_download); gtk_container_add (GTK_CONTAINER (popup_search), popup_search_download); - popup_search_metadata = gtk_menu_item_new_with_label (_("Bitzi metadata")); - gtk_widget_set_name (popup_search_metadata, "popup_search_metadata"); - gtk_widget_ref (popup_search_metadata); - gtk_object_set_data_full (GTK_OBJECT (popup_search), "popup_search_metadata", popup_search_metadata, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (popup_search_metadata); - gtk_container_add (GTK_CONTAINER (popup_search), popup_search_metadata); - popup_search_browse_host = gtk_menu_item_new_with_label (_("Browse host")); gtk_widget_set_name (popup_search_browse_host, "popup_search_browse_host"); gtk_widget_ref (popup_search_browse_host); @@ -9760,7 +9926,7 @@ gtk_widget_show (hbox170); gtk_box_pack_start (GTK_BOX (vbox98), hbox170, TRUE, TRUE, 0); - pixmap4 = create_pixmap (dlg_about, "icon.xpm"); + pixmap4 = create_pixmap (dlg_about, "icon.48x48.xpm"); gtk_widget_set_name (pixmap4, "pixmap4"); gtk_widget_ref (pixmap4); gtk_object_set_data_full (GTK_OBJECT (dlg_about), "pixmap4", pixmap4, @@ -10286,6 +10452,9 @@ GtkWidget *table102; GtkWidget *checkbutton_enable_natpmp; GtkWidget *checkbutton_enable_upnp; + GtkWidget *label8034; + GtkObject *spinbutton_config_upnp_mapping_lease_time_adj; + GtkWidget *spinbutton_config_upnp_mapping_lease_time; GtkWidget *frame_proxy_settings; GtkWidget *vbox100; GtkWidget *table53; @@ -10437,6 +10606,7 @@ GtkWidget *label568; GtkWidget *checkbutton_enable_guess; GtkWidget *checkbutton_enable_guess_client; + GtkWidget *checkbutton_enable_g2; GtkWidget *frame_expert_oob_queries; GtkWidget *vbox131; GtkWidget *checkbutton_send_oob_queries; @@ -10673,6 +10843,7 @@ GtkWidget *label8029; GtkObject *spinbutton_config_bw_guess_out_adj; GtkWidget *spinbutton_config_bw_guess_out; + GtkWidget *checkbutton_guess_maximize_bw; GtkWidget *label684; GtkWidget *scrolledwindow34; GtkWidget *viewport6; @@ -11374,13 +11545,15 @@ gtk_widget_show (frame_expert_nw_port_mapping); gtk_box_pack_start (GTK_BOX (vbox24), frame_expert_nw_port_mapping, TRUE, TRUE, 0); - table102 = gtk_table_new (1, 2, FALSE); + table102 = gtk_table_new (2, 2, FALSE); gtk_widget_set_name (table102, "table102"); gtk_widget_ref (table102); gtk_object_set_data_full (GTK_OBJECT (dlg_prefs), "table102", table102, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (table102); gtk_container_add (GTK_CONTAINER (frame_expert_nw_port_mapping), table102); + gtk_container_set_border_width (GTK_CONTAINER (table102), 2); + gtk_table_set_col_spacings (GTK_TABLE (table102), 4); checkbutton_enable_natpmp = gtk_check_button_new_with_label (_("Enable NAT-PMP")); gtk_widget_set_name (checkbutton_enable_natpmp, "checkbutton_enable_natpmp"); @@ -11402,6 +11575,30 @@ (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + label8034 = gtk_label_new (_("Mapping lease time")); + gtk_widget_set_name (label8034, "label8034"); + gtk_widget_ref (label8034); + gtk_object_set_data_full (GTK_OBJECT (dlg_prefs), "label8034", label8034, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (label8034); + gtk_table_attach (GTK_TABLE (table102), label8034, 0, 1, 1, 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_misc_set_alignment (GTK_MISC (label8034), 0, 0.5); + + spinbutton_config_upnp_mapping_lease_time_adj = gtk_adjustment_new (1, 0, 100, 1, 10, 10); + spinbutton_config_upnp_mapping_lease_time = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_config_upnp_mapping_lease_time_adj), 1, 0); + gtk_widget_set_name (spinbutton_config_upnp_mapping_lease_time, "spinbutton_config_upnp_mapping_lease_time"); + gtk_widget_ref (spinbutton_config_upnp_mapping_lease_time); + gtk_object_set_data_full (GTK_OBJECT (dlg_prefs), "spinbutton_config_upnp_mapping_lease_time", spinbutton_config_upnp_mapping_lease_time, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (spinbutton_config_upnp_mapping_lease_time); + gtk_table_attach (GTK_TABLE (table102), spinbutton_config_upnp_mapping_lease_time, 1, 2, 1, 2, + (GtkAttachOptions) (0), + (GtkAttachOptions) (0), 0, 0); + gtk_widget_set_usize (spinbutton_config_upnp_mapping_lease_time, 64, -2); + gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton_config_upnp_mapping_lease_time), TRUE); + frame_proxy_settings = gtk_frame_new (_("Proxy settings")); gtk_widget_set_name (frame_proxy_settings, "frame_proxy_settings"); gtk_widget_ref (frame_proxy_settings); @@ -12598,7 +12795,7 @@ gtk_widget_show (alignment31); gtk_box_pack_start (GTK_BOX (hbox188), alignment31, FALSE, TRUE, 0); - table83 = gtk_table_new (4, 3, FALSE); + table83 = gtk_table_new (5, 3, FALSE); gtk_widget_set_name (table83, "table83"); gtk_widget_ref (table83); gtk_object_set_data_full (GTK_OBJECT (dlg_prefs), "table83", table83, @@ -12702,6 +12899,16 @@ (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + checkbutton_enable_g2 = gtk_check_button_new_with_label (_("Enable the G2 network")); + gtk_widget_set_name (checkbutton_enable_g2, "checkbutton_enable_g2"); + gtk_widget_ref (checkbutton_enable_g2); + gtk_object_set_data_full (GTK_OBJECT (dlg_prefs), "checkbutton_enable_g2", checkbutton_enable_g2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (checkbutton_enable_g2); + gtk_table_attach (GTK_TABLE (table83), checkbutton_enable_g2, 0, 2, 4, 5, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + frame_expert_oob_queries = gtk_frame_new (_("Out of Band Querying")); gtk_widget_set_name (frame_expert_oob_queries, "frame_expert_oob_queries"); gtk_widget_ref (frame_expert_oob_queries); @@ -14574,7 +14781,7 @@ gtk_widget_show (frame155); gtk_box_pack_start (GTK_BOX (vbox29), frame155, TRUE, TRUE, 0); - table103 = gtk_table_new (1, 3, FALSE); + table103 = gtk_table_new (2, 3, FALSE); gtk_widget_set_name (table103, "table103"); gtk_widget_ref (table103); gtk_object_set_data_full (GTK_OBJECT (dlg_prefs), "table103", table103, @@ -14620,6 +14827,16 @@ gtk_widget_set_usize (spinbutton_config_bw_guess_out, 64, -2); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton_config_bw_guess_out), TRUE); + checkbutton_guess_maximize_bw = gtk_check_button_new_with_label (_("Allow unused Gnutella outgoing bandwidth to supersede hint")); + gtk_widget_set_name (checkbutton_guess_maximize_bw, "checkbutton_guess_maximize_bw"); + gtk_widget_ref (checkbutton_guess_maximize_bw); + gtk_object_set_data_full (GTK_OBJECT (dlg_prefs), "checkbutton_guess_maximize_bw", checkbutton_guess_maximize_bw, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (checkbutton_guess_maximize_bw); + gtk_table_attach (GTK_TABLE (table103), checkbutton_guess_maximize_bw, 0, 3, 1, 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + label684 = gtk_label_new (_("Bandwidth")); gtk_widget_set_name (label684, "label684"); gtk_widget_ref (label684); @@ -15900,7 +16117,7 @@ (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); - checkbutton_pfsp_rare_server = gtk_check_button_new_with_label (_("Enable upload of patial files deemed rare")); + checkbutton_pfsp_rare_server = gtk_check_button_new_with_label (_("Enable upload of partial files deemed rare")); gtk_widget_set_name (checkbutton_pfsp_rare_server, "checkbutton_pfsp_rare_server"); gtk_widget_ref (checkbutton_pfsp_rare_server); gtk_object_set_data_full (GTK_OBJECT (dlg_prefs), "checkbutton_pfsp_rare_server", checkbutton_pfsp_rare_server,
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk1/interface-glade.t -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk1/interface-glade.t
Changed
@@ -73,8 +73,6 @@ N_("Banning"); N_("Beautify filenames by removing needless underscores"); N_("Bind to this address"); -N_("Bitzi Metadata"); -N_("Bitzi metadata"); N_("Browse Host"); N_("Browse host"); N_("Busy"); @@ -621,15 +619,16 @@ N_("DHT seeded."); N_("DHT inactive."); N_("Disabled stealing of outgoing HTTP bandwidth."); -N_("Splitting ougoing HTTP bandwidth evenly."); +N_("Splitting outgoing HTTP bandwidth evenly."); N_("Capping HTTP outgoing bandwidth."); N_("Port mapping possible through UPnP or NAT-PMP."); -N_("Port mapping configured through UPnP or NAT-PMP."); +N_("Port mapping configured through NAT-PMP."); +N_("Port mapping configured through UPnP."); N_("Enable UPnP"); N_("Enable NAT-PMP"); N_("Enable HTTP request pipelining"); N_("Pipelining max chunk size"); -N_("Enable upload of patial files deemed rare"); +N_("Enable upload of partial files deemed rare"); N_("Enable GUESS (additional querying)"); N_("Issue GUESS queries as well"); N_("Bandwidth limits for GUESS queries"); @@ -658,3 +657,9 @@ N_("Store DHT keys/values in memory"); N_("Store SPAM SHA1 table in memory"); N_("Relayed queries remembered"); +N_("Allow unused Gnutella outgoing bandwidth to supersede hint"); +N_("Display GUESS statistics"); +N_("Mapping lease time"); +N_("G2 hubs"); +N_("Enable the G2 network"); +N_(" G2, ");
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk1/monitor.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk1/monitor.c
Changed
@@ -41,7 +41,8 @@ #include "if/gui_property_priv.h" #include "if/bridge/ui2c.h" -#include "lib/glib-missing.h" +#include "lib/str.h" + #include "lib/override.h" /* Must be the last header included */ /*** @@ -87,7 +88,7 @@ if (type == QUERY_SHA1) { /* If the query is empty and we have a SHA1 extension, * we print a urn:sha1-query instead. */ - gm_snprintf(tmpstr, sizeof(tmpstr), "urn:sha1:%s", item); + str_bprintf(tmpstr, sizeof(tmpstr), "urn:sha1:%s", item); } else { g_strlcpy(tmpstr, item, sizeof(tmpstr)); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk1/nodes.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk1/nodes.c
Changed
@@ -36,9 +36,10 @@ #include "if/gui_property.h" #include "if/bridge/ui2c.h" -#include "lib/glib-missing.h" +#include "lib/hset.h" #include "lib/iso3166.h" #include "lib/nid.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/tm.h" #include "lib/utf8.h" @@ -50,24 +51,23 @@ * changed. By using this the number of updates to the gui can be * significantly reduced. */ -static GHashTable *ht_node_info_changed; -static GHashTable *ht_node_flags_changed; +static hset_t *hs_node_info_changed; +static hset_t *hs_node_flags_changed; static void nodes_gui_update_node_info(gnet_node_info_t *n, gint row); static void nodes_gui_update_node_flags(const struct nid *node_id, gnet_node_flags_t *flags, gint row); -static gboolean -remove_item(GHashTable *ht, const struct nid *node_id) +static bool +remove_item(hset_t *hs, const struct nid *node_id) { - gpointer orig_key; + const void *orig_key; - g_return_val_if_fail(ht, FALSE); + g_return_val_if_fail(hs, FALSE); g_return_val_if_fail(node_id, FALSE); - - orig_key = g_hash_table_lookup(ht, node_id); - if (orig_key) { - g_hash_table_remove(ht, orig_key); + + if (hset_contains_extended(hs, node_id, &orig_key)) { + hset_remove(hs, orig_key); nid_unref(orig_key); return TRUE; } else { @@ -88,7 +88,7 @@ nodes_gui_node_removed(const struct nid *node_id) { if (GUI_PROPERTY(gui_debug) >= 5) - g_debug("nodes_gui_node_removed(%s)", nid_to_string(node_id)); + g_debug("%s(%s)", G_STRFUNC, nid_to_string(node_id)); nodes_gui_remove_node(node_id); } @@ -104,7 +104,7 @@ gnet_node_info_t info; if (GUI_PROPERTY(gui_debug) >= 5) - g_debug("nodes_gui_node_added(%s)", nid_to_string(node_id)); + g_debug("%s(%s)", G_STRFUNC, nid_to_string(node_id)); guc_node_fill_info(node_id, &info); nodes_gui_add_node(&info); @@ -120,9 +120,9 @@ static void nodes_gui_node_info_changed(const struct nid *node_id) { - if (!g_hash_table_lookup(ht_node_info_changed, node_id)) { + if (!hset_contains(hs_node_info_changed, node_id)) { const struct nid *key = nid_ref(node_id); - gm_hash_table_insert_const(ht_node_info_changed, key, key); + hset_insert(hs_node_info_changed, key); } } @@ -135,9 +135,9 @@ static void nodes_gui_node_flags_changed(const struct nid *node_id) { - if (!g_hash_table_lookup(ht_node_flags_changed, node_id)) { + if (!hset_contains(hs_node_flags_changed, node_id)) { const struct nid *key = nid_ref(node_id); - gm_hash_table_insert_const(ht_node_flags_changed, key, key); + hset_insert(hs_node_flags_changed, key); } } @@ -174,7 +174,7 @@ gtk_clist_set_text(clist, row, c_gnet_loc, deconstify_gchar(iso3166_country_cc(n->country))); - gm_snprintf(ver_buf, sizeof ver_buf, "%d.%d", + str_bprintf(ver_buf, sizeof ver_buf, "%d.%d", n->proto_major, n->proto_minor); gtk_clist_set_text(clist, row, c_gnet_version, ver_buf); @@ -191,7 +191,7 @@ nodes_gui_common_status_str(&status)); } } else { - g_warning("%s: no matching row found", G_GNUC_PRETTY_FUNCTION); + g_warning("%s(): no matching row found", G_STRFUNC); } } @@ -217,7 +217,7 @@ } } else { - g_warning("%s: no matching row found", G_GNUC_PRETTY_FUNCTION); + g_warning("%s(): no matching row found", G_STRFUNC); } } @@ -238,8 +238,8 @@ { "popup_nodes_browse_host" }, }; guint i; - - for (i = 0; i < G_N_ELEMENTS(items); i++) { + + for (i = 0; i < N_ITEMS(items); i++) { gtk_widget_set_sensitive(gui_popup_nodes_lookup(itemsi.name), FALSE); } @@ -267,7 +267,7 @@ /** * Initialize the nodes controller. Register callbacks in the backend. */ -G_GNUC_COLD void +void G_COLD nodes_gui_init(void) { unsigned i; @@ -284,8 +284,8 @@ widget_add_popup_menu(GTK_WIDGET(clist), nodes_gui_get_popup_menu); - ht_node_info_changed = g_hash_table_new(nid_hash, nid_equal); - ht_node_flags_changed = g_hash_table_new(nid_hash, nid_equal); + hs_node_info_changed = hset_create_any(nid_hash, nid_hash2, nid_equal); + hs_node_flags_changed = hset_create_any(nid_hash, nid_hash2, nid_equal); guc_node_add_node_added_listener(nodes_gui_node_added); guc_node_add_node_removed_listener(nodes_gui_node_removed); @@ -295,16 +295,15 @@ main_gui_add_timer(nodes_gui_timer); } -static gboolean -free_node_id(gpointer key, gpointer value, gpointer unused_udata) +static bool +free_node_id(const void *key, void *unused_udata) { - g_assert(key == value); (void) unused_udata; nid_unref(key); return TRUE; } -static G_GNUC_COLD void +static void G_COLD nodes_gui_remove_all_nodes(void) { GtkCList *clist; @@ -325,7 +324,7 @@ /** * Unregister callbacks in the backend and clean up. */ -G_GNUC_COLD void +void G_COLD nodes_gui_shutdown(void) { GtkCList *clist; @@ -339,11 +338,11 @@ guc_node_remove_node_info_changed_listener(nodes_gui_node_info_changed); guc_node_remove_node_flags_changed_listener(nodes_gui_node_flags_changed); - g_hash_table_foreach_remove(ht_node_info_changed, free_node_id, NULL); - gm_hash_table_destroy_null(&ht_node_info_changed); + hset_foreach_remove(hs_node_info_changed, free_node_id, NULL); + hset_free_null(&hs_node_info_changed); - g_hash_table_foreach_remove(ht_node_flags_changed, free_node_id, NULL); - gm_hash_table_destroy_null(&ht_node_flags_changed); + hset_foreach_remove(hs_node_flags_changed, free_node_id, NULL); + hset_free_null(&hs_node_flags_changed); nodes_gui_remove_all_nodes(); } @@ -363,11 +362,11 @@ * Make sure node is remove from the "changed" hash table so * we don't try an update. */ - g_assert(NULL != ht_node_info_changed); - g_assert(NULL != ht_node_flags_changed); + g_assert(NULL != hs_node_info_changed); + g_assert(NULL != hs_node_flags_changed); - remove_item(ht_node_info_changed, node_id); - remove_item(ht_node_flags_changed, node_id); + remove_item(hs_node_info_changed, node_id); + remove_item(hs_node_flags_changed, node_id); row = gtk_clist_find_row_from_data(GTK_CLIST(clist_nodes), deconstify_gpointer(node_id)); @@ -375,7 +374,7 @@ gtk_clist_remove(GTK_CLIST(clist_nodes), row); nid_unref(node_id); } else { - g_warning("nodes_gui_remove_node: no matching row found"); + g_warning("%s(): no matching row found", G_STRFUNC); } } @@ -392,7 +391,7 @@ g_assert(n != NULL); - gm_snprintf(proto_tmp, sizeof proto_tmp, "%d.%d", + str_bprintf(proto_tmp, sizeof proto_tmp, "%d.%d", n->proto_major, n->proto_minor); titlesc_gnet_host = host_addr_port_to_string(n->addr, n->port); @@ -442,7 +441,7 @@ /* * Update additional info too if it has recorded changes. */ - if (remove_item(ht_node_info_changed, node_id)) { + if (remove_item(hs_node_info_changed, node_id)) { gnet_node_info_t info; guc_node_fill_info(node_id, &info); @@ -450,7 +449,7 @@ guc_node_clear_info(&info); } - if (remove_item(ht_node_flags_changed, node_id)) { + if (remove_item(hs_node_flags_changed, node_id)) { gnet_node_flags_t flags; guc_node_fill_flags(node_id, &flags);
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk1/nodes_cb.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk1/nodes_cb.c
Changed
@@ -35,6 +35,7 @@ #include "if/gui_property_priv.h" #include "if/bridge/ui2c.h" +#include "if/core/sockets.h" /* For SOCK_F_G2 */ #include "lib/override.h" /* Must be the last header included */ @@ -51,7 +52,7 @@ }; guint i; - for (i = 0; i < G_N_ELEMENTS(items); i++) { + for (i = 0; i < N_ITEMS(items); i++) { gtk_widget_set_sensitive(gui_popup_nodes_lookup(itemsi.name), sensitive); } @@ -224,7 +225,7 @@ if (!info->is_pseudo) { search_gui_new_browse_host(NULL, info->gnet_addr, info->gnet_port, - &info->gnet_guid, NULL, 0); + &info->gnet_guid, NULL, info->is_g2 ? SOCK_F_G2 : 0); } guc_node_free_info(info); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk1/search.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk1/search.c
Changed
@@ -37,7 +37,6 @@ #include "search_cb.h" -#include "gtk/bitzi.h" #include "gtk/columns.h" #include "gtk/drag.h" #include "gtk/misc.h" @@ -55,6 +54,9 @@ #include "lib/base32.h" #include "lib/glib-missing.h" #include "lib/halloc.h" +#include "lib/hashing.h" +#include "lib/hset.h" +#include "lib/htable.h" #include "lib/iso3166.h" #include "lib/mime_type.h" #include "lib/stringify.h" @@ -102,12 +104,11 @@ * Emile 02/15/2004 */ static inline void -add_parent_with_sha1(search_t *search, const gchar *sha1, GtkCTreeNode *data) +add_parent_with_sha1(search_t *search, const char *sha1, GtkCTreeNode *data) { - gm_hash_table_insert_const(search->parents, sha1, data); + htable_insert(search->parents, sha1, data); } - /** * Removes the tree node matching the given sha1 from the hash table. * The atom used for the key is then freed @@ -115,19 +116,19 @@ static inline void remove_parent_with_sha1(search_t *search, const struct sha1 *sha1) { - gconstpointer key; - gpointer orig_key; + const void *key; + const void *orig_key; key = atom_sha1_get(sha1); - if (g_hash_table_lookup_extended(search->parents, key, &orig_key, NULL)) { + if (htable_lookup_extended(search->parents, key, &orig_key, NULL)) { /* Must first free memory used by the original key */ atom_sha1_free(orig_key); /* Then remove the key */ - g_hash_table_remove(search->parents, key); + htable_remove(search->parents, key); } else - g_warning("remove_parent_with_sha1: can't find sha1 in hash table!"); + g_warning("%s(): can't find sha1 in hash table!", G_STRFUNC); atom_sha1_free(key); } @@ -140,11 +141,11 @@ GtkCTreeNode * find_parent_with_sha1(search_t *search, gconstpointer key) { - return g_hash_table_lookup(search->parents, key); + return htable_lookup(search->parents, key); } -gboolean -search_gui_free_parent(gpointer key, gpointer unused_value, gpointer unused_x) +static bool +search_gui_free_parent(const void *key, void *unused_value, void *unused_x) { (void) unused_value; (void) unused_x; @@ -162,11 +163,10 @@ * Decrement refcount of hash table key entry. */ static gboolean -dec_records_refcount(gpointer key, gpointer unused_value, gpointer unused_x) +dec_records_refcount(const void *key, void *unused_x) { - (void) unused_value; (void) unused_x; - search_gui_unref_record(key); + search_gui_unref_record(deconstify_pointer(key)); return TRUE; } @@ -208,8 +208,8 @@ g_assert(sch->dups); search_gui_clear_ctree(GTK_CTREE(sch->tree)); - g_hash_table_foreach_remove(sch->dups, dec_records_refcount, NULL); - g_hash_table_foreach_remove(sch->parents, search_gui_free_parent, NULL); + hset_foreach_remove(sch->dups, dec_records_refcount, NULL); + htable_foreach_remove(sch->parents, search_gui_free_parent, NULL); } static gint search_gui_cursor_x, search_gui_cursor_y; @@ -228,7 +228,7 @@ } -char * +char * search_gui_get_local_file_url(GtkWidget *widget) { GtkCTreeNode *node; @@ -245,7 +245,7 @@ if (row < 0) return NULL; - + node = gtk_ctree_node_nth(GTK_CTREE(widget), row); grc = gtk_ctree_node_get_row_data(GTK_CTREE(widget), node); record = grc->shared_record; @@ -254,7 +254,7 @@ if (!record->tag) return NULL; - + return url_from_absolute_path(record->tag); } @@ -265,7 +265,7 @@ int row; g_assert(NULL == search->parents); - search->parents = g_hash_table_new(pointer_hash_func, NULL); + search->parents = htable_create(HASH_KEY_SELF, 0); titlesc_sl_name = lazy_utf8_to_ui_string(search_gui_query(search)); titlesc_sl_hit = "0"; @@ -273,7 +273,7 @@ row = gtk_clist_append(GTK_CLIST(clist_search()), (gchar **) titles); gtk_clist_set_row_data(GTK_CLIST(clist_search()), row, search); - search_gui_sort_column(search, search->sort_col); + search_gui_sort_column(search, search->sorting.s_column); } @@ -320,7 +320,7 @@ result = strcmp(EMPTY_STRING(r1->ext), EMPTY_STRING(r2->ext)); break; - + case c_sr_mime: { enum mime_type mt1, mt2; @@ -343,7 +343,7 @@ if (r1->size == r2->size) result = search_gui_cmp_sha1s(r1->sha1, r2->sha1); else - result = (r1->size > r2->size) ? +1 : -1; + result = CMP(r1->size, r2->size); break; case c_sr_vendor: @@ -368,9 +368,6 @@ result = CMP(rs1->country, rs2->country); break; - case c_sr_meta: - break; /* XXX Can't sort, metadata not in record! */ - case c_sr_route: result = host_addr_cmp(rs1->last_hop, rs2->last_hop); break; @@ -418,7 +415,7 @@ case c_sr_sha1: result = search_gui_cmp_sha1s(r1->sha1, r2->sha1); break; - + case c_sr_ctime: result = delta_time(r1->create_time, r2->create_time); break; @@ -947,7 +944,7 @@ } /* create new arrow */ - switch (search->sort_order) { + switch (search->sorting.s_order) { case SORT_ASC: search->arrow = create_pixmap(gui_main_window(), "arrow_down.xpm"); ascending = TRUE; @@ -963,7 +960,7 @@ } /* display arrow if necessary and set sorting parameters*/ - if (search->sort_order != SORT_NONE) { + if (search->sorting.s_order != SORT_NONE) { cw = gtk_clist_get_column_widget(GTK_CLIST(search->tree), column); if (cw != NULL) { gtk_box_pack_start(GTK_BOX(cw), search->arrow, @@ -980,27 +977,6 @@ } /** - * Add available Bitzi metadata to a parent node. - */ -static void -search_parent_add_metadata(GtkCTree *ctree, GtkCTreeNode *parent, record_t *rc) -{ - if (guc_bitzi_has_cached_ticket(rc->sha1)) { - bitzi_data_t data; - - if (guc_bitzi_data_by_sha1(&data, rc->sha1, rc->size)) { - char *text = bitzi_gui_get_metadata(&data); - gtk_ctree_node_set_text(ctree, parent, c_sr_meta, - text != NULL ? text : _("Not in database")); - HFREE_NULL(text); - } else { - gtk_ctree_node_set_text(ctree, parent, c_sr_meta, - _("Not in database")); - } - } -} - -/** * Adds the record to gth GtkCTree for this search. * This is where the search grouping (parenting) is done */ @@ -1061,7 +1037,9 @@ break; case c_sr_protocol: if (!((ST_LOCAL | ST_BROWSE) & rs->status)) - text = ST_UDP & rs->status ? "UDP" : "TCP"; + text = ST_UDP & rs->status ? + (ST_SR_UDP & rs->status ? "UDP (semi-reliable)" : "UDP") + : "TCP"; break; case c_sr_hops: if (!((ST_LOCAL | ST_BROWSE) & rs->status)) { @@ -1108,7 +1086,6 @@ text = timestamp_to_string(rc->create_time); } break; - case c_sr_meta: case c_sr_size: case c_sr_count: break; @@ -1134,7 +1111,8 @@ if (NULL != rc->sha1) { - /* We use the sch->parents hash table to store pointers to all the + /* + * We use the sch->parents hash table to store pointers to all the * parent tree nodes referenced by their atomized sha1. */ parent = find_parent_with_sha1(sch, rc->sha1); @@ -1145,7 +1123,7 @@ /* A parent exists with that sha1, add as child to that parent */ node = gtk_ctree_insert_node(ctree, parent, NULL, (gchar **) titles, /* override const */ - G_N_ELEMENTS(titles), NULL, NULL, NULL, NULL, 0, 0); + N_ITEMS(titles), NULL, NULL, NULL, NULL, 0, 0); /* Update the "#" column of the parent, +1 for parent */ count = gtk_ctree_count_node_children(ctree, parent); @@ -1168,7 +1146,7 @@ /* Add node as a parent */ node = gtk_ctree_insert_node(ctree, parent = NULL, NULL, (gchar **) titles, /* override const */ - G_N_ELEMENTS(titles), NULL, NULL, NULL, NULL, 0, 0); + N_ITEMS(titles), NULL, NULL, NULL, NULL, 0, 0); add_parent_with_sha1(sch, key, node); /* Update count in the records (use for column sorting) */ @@ -1181,7 +1159,7 @@ node = gtk_ctree_insert_node(ctree, parent = NULL, NULL, (gchar **) titles, /* override */ - G_N_ELEMENTS(titles), NULL, NULL, NULL, NULL, 0, 0); + N_ITEMS(titles), NULL, NULL, NULL, NULL, 0, 0); /* Update count in the records (use for column sorting) */ gui_rc->num_children = 0; is_parent = TRUE; @@ -1206,7 +1184,7 @@ * moving the parent will move the children too so we just pretend that * the parent node was actually the node that was added, not the child. */ - if (!is_parent && (c_sr_count == sch->sort_col)) { + if (!is_parent && (c_sr_count == sch->sorting.s_column)) { is_parent = TRUE; parent_row = GTK_CTREE_ROW(node); auto_node = parent_row->parent; @@ -1238,13 +1216,19 @@ if (grc1 == grc2) continue; - if (SORT_ASC == sch->sort_order) { - if (search_gui_compare_records(sch->sort_col, grc1, grc2) < 0){ + if (SORT_ASC == sch->sorting.s_order) { + if ( + search_gui_compare_records( + sch->sorting.s_column, grc1, grc2) < 0 + ) { sibling = cur_node; break; } } else { /* SORT_DESC */ - if (search_gui_compare_records(sch->sort_col, grc1, grc2) > 0){ + if ( + search_gui_compare_records( + sch->sorting.s_column, grc1, grc2) > 0 + ){ sibling = cur_node; break; } @@ -1265,13 +1249,19 @@ grc2 = gtk_ctree_node_get_row_data(ctree, cur_node); - if (SORT_ASC == sch->sort_order) { - if (search_gui_compare_records(sch->sort_col, grc1, grc2) < 0){ + if (SORT_ASC == sch->sorting.s_order) { + if ( + search_gui_compare_records( + sch->sorting.s_column, grc1, grc2) < 0 + ){ sibling = cur_node; break; } } else { /* SORT_DESC */ - if (search_gui_compare_records(sch->sort_col, grc1, grc2) > 0){ + if ( + search_gui_compare_records( + sch->sorting.s_column, grc1, grc2) > 0 + ){ sibling = cur_node; break; } @@ -1285,15 +1275,6 @@ gtk_ctree_node_set_foreground(ctree, node, gui_color_get(color)); gtk_ctree_node_set_background(ctree, node, gui_color_get(GUI_COLOR_BACKGROUND)); - - /* - * If we inserted a parent node and we have Bitzi metadata available, - * display it as well. - */ - - if (is_parent && rc->sha1 != NULL) { - search_parent_add_metadata(ctree, node, rc); - } } /** @@ -1374,11 +1355,6 @@ *tmpstr = '\0'; } - /* Display Bitzi metadata again if available */ - if (rc->sha1 != NULL) { - search_parent_add_metadata(ctree, child_node, rc); - } - /* Update record count, child_rc will become the rc for the parent*/ child_grc->num_children = n; @@ -1430,8 +1406,8 @@ * One is a gui reference, the other is the dups hash table reference * (Note that GTK2 hashtables allow us to define an auto remove function, * not so with GTK1, so we have to do it ourselves) - */ - g_hash_table_remove(search->dups, rc); + */ + hset_remove(search->dups, rc); search_gui_unref_record(rc); search_gui_unref_record(rc); } @@ -1460,7 +1436,7 @@ * -- Richard, 17/04/2004 */ - if (c_sr_count != search->sort_col) + if (c_sr_count != search->sorting.s_column) return FALSE; row = GTK_CTREE_ROW(node); @@ -1498,7 +1474,7 @@ { GSList *nodes = NULL; GList *iter; - + iter = GTK_CLIST(ctree)->selection; for (/* NOTHING */; NULL != iter; iter = g_list_next(iter)) { GtkCTreeNode *node; @@ -1542,7 +1518,7 @@ ctree = GTK_CTREE(search->tree); gtk_clist_freeze(GTK_CLIST(ctree)); - + gtk_signal_handler_block_by_func(GTK_OBJECT(ctree), GTK_SIGNAL_FUNC(on_ctree_search_results_select_row), NULL); @@ -1576,7 +1552,7 @@ } if (resort) { - search_gui_sort_column(search, search->sort_col); + search_gui_sort_column(search, search->sorting.s_column); } gtk_signal_handler_unblock_by_func(GTK_OBJECT(ctree), @@ -1715,12 +1691,12 @@ *** Public functions ***/ -G_GNUC_COLD void +void G_COLD search_gui_init(void) { { GtkCList *clist = clist_search(); - + gtk_clist_set_reorderable(clist, TRUE); gtk_clist_set_selection_mode(clist, GTK_SELECTION_EXTENDED); widget_add_popup_menu(GTK_WIDGET(clist), @@ -1736,7 +1712,7 @@ { GtkCList *clist; - + clist = GTK_CLIST(gui_main_window_lookup("clist_search_details")); gtk_clist_set_selection_mode(clist, GTK_SELECTION_SINGLE); gui_signal_connect(clist, "key-press-event", @@ -1748,11 +1724,11 @@ search_gui_common_init(); } -G_GNUC_COLD void +void G_COLD search_gui_shutdown(void) { GtkCList *clist = clist_search(); - + clist_save_widths(clist, PROP_SEARCH_LIST_COL_WIDTHS); search_gui_common_shutdown(); } @@ -1848,7 +1824,7 @@ for (i = 0; i < c_sr_num; i++) { GtkWidget *label, *hbox; const gchar *title; - + title = search_gui_column_title(i); label = gtk_label_new(title); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); @@ -1861,7 +1837,7 @@ clist_restore_visibility(ctree, PROP_SEARCH_RESULTS_COL_VISIBLE); clist_restore_widths(ctree, PROP_SEARCH_RESULTS_COL_WIDTHS); - + gui_signal_connect(ctree, "tree_select_row", on_ctree_search_results_select_row, NULL); gui_signal_connect(ctree, @@ -1934,93 +1910,27 @@ } } -void +bool search_gui_start_massive_update(struct search *search) { - g_return_if_fail(search); + g_return_val_if_fail(search, FALSE); + + if (search->frozen) + return FALSE; + gtk_clist_freeze(GTK_CLIST(search->tree)); + search->frozen = TRUE; + return TRUE; } void search_gui_end_massive_update(struct search *search) { g_return_if_fail(search); - gtk_clist_thaw(GTK_CLIST(search->tree)); -} - -/** - * Update the search displays with the correct meta-data - * - */ -void -search_gui_metadata_update(const bitzi_data_t *data) -{ - const GList *iter; - gchar *text; - - text = bitzi_gui_get_metadata(data); - - /* - * Fill in the columns in each search that contains a reference - */ - - iter = search_gui_get_searches(); - for (/* NOTHING */; NULL != iter; iter = g_list_next(iter)) { - search_t *search = iter->data; - GtkCTree *ctree = GTK_CTREE(search->tree); - GtkCTreeNode *parent; - - parent = find_parent_with_sha1(search, data->sha1); - if (parent) { - gui_record_t *grc; - record_t *record; - - gtk_ctree_node_set_text(ctree, parent, - c_sr_meta, text ? text : _("Not in database")); - grc = gtk_ctree_node_get_row_data(ctree, parent); - record = grc->shared_record; - if (search_gui_item_is_inspected(record)) { - search_gui_set_bitzi_metadata(record); - search_gui_set_details(record); - } - } - } - - HFREE_NULL(text); -} + g_return_if_fail(search->frozen); -/** - * Update the search displays with the correct meta-data. - * (called from search_cb.c) - */ -void -search_gui_queue_bitzi_by_sha1(const record_t *rec) -{ - const GList *iter; - GtkCTreeNode *parent; - - g_assert(rec != NULL); - - if (!rec->sha1) - return; - - /* - * Add some feedback that a search has been kicked off. - */ - - iter = search_gui_get_searches(); - for (/* NOTHING */; NULL != iter; iter = g_list_next(iter)) { - search_t *search = iter->data; - GtkCTree *ctree = GTK_CTREE(search->tree); - - parent = find_parent_with_sha1(search, rec->sha1); - if (parent) - gtk_ctree_node_set_text(ctree, parent, c_sr_meta, - _("Query queued...")); - } - - /* and then send the query... */ - guc_query_bitzi_by_sha1(rec->sha1, rec->size, TRUE); + search->frozen = FALSE; + gtk_clist_thaw(GTK_CLIST(search->tree)); } record_t * @@ -2033,7 +1943,7 @@ if (record->sha1) { GtkCTreeNode *parent; gui_record_t *grc; - + parent = find_parent_with_sha1(search, record->sha1); if (parent) { grc = gtk_ctree_node_get_row_data(GTK_CTREE(search->tree), parent); @@ -2083,7 +1993,7 @@ for (/* NOTHING */; selection; selection = g_list_next(selection)) { search_t *search; gint row; - + row = GPOINTER_TO_UINT(selection->data); if (row < 0) break; @@ -2110,12 +2020,12 @@ int row; row = clist_get_cursor_row(clist_search()); - if (row >= 0) { + if (row >= 0) { search_t *search; search = gtk_clist_get_row_data(clist_search(), row); g_return_if_fail(search); - + search_gui_set_current_search(search); } }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk1/search_cb.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk1/search_cb.c
Changed
@@ -39,7 +39,6 @@ #include "search_cb.h" -#include "gtk/bitzi.h" #include "gtk/columns.h" #include "gtk/filter_core.h" #include "gtk/misc.h" @@ -57,13 +56,15 @@ #include "lib/cq.h" #include "lib/glib-missing.h" #include "lib/halloc.h" +#include "lib/misc.h" /* Fox xml_indent() */ #include "lib/utf8.h" +#include "lib/vendors.h" /* For T_GTKG */ #include "lib/override.h" /* Must be the last header included */ -static record_t *selected_record; +static record_t *selected_record; -char * +char * search_gui_details_get_text(GtkWidget *widget) { char *text = NULL; @@ -109,20 +110,12 @@ { char *indented; - indented = (rc && rc->xml) ? search_xml_indent(rc->xml) : NULL; + indented = (rc && rc->xml) ? xml_indent(rc->xml) : NULL; set_text_buffer(gui_main_window_lookup("text_result_info_xml"), EMPTY_STRING(indented)); HFREE_NULL(indented); } -void -search_gui_set_bitzi_metadata_text(const char *text) -{ - g_return_if_fail(text); - - set_text_buffer(gui_main_window_lookup("text_result_info_bitzi"), text); -} - static GtkCList *clist_search_details; void @@ -144,7 +137,7 @@ titles1 = EMPTY_STRING(value); gtk_clist_append(clist_search_details, (gchar **) titles); } - + /** * Activates/deactivates buttons and popups based on what is selected */ @@ -165,7 +158,6 @@ search_gui_set_details(rc); gtk_clist_thaw(clist_search_details); search_set_xml_metadata(rc); - search_gui_set_bitzi_metadata(rc); } record_t * @@ -228,14 +220,13 @@ #define ROW_SELECT_TIMEOUT 100 /* milliseconds */ static void -row_selected_expire(cqueue_t *unused_cq, gpointer unused_udata) +row_selected_expire(cqueue_t *cq, gpointer unused_udata) { search_t *search; - (void) unused_cq; (void) unused_udata; - row_selected_ev = NULL; + cq_zero(cq, &row_selected_ev); search = search_gui_get_current_search(); if (search) { @@ -250,7 +241,7 @@ selected_row_changed(GtkCTree *ctree) { int row; - + if (selected_record) { search_gui_unref_record(selected_record); selected_record = NULL; @@ -336,6 +327,7 @@ rs = rc->results_set; flags |= 0 != (rs->status & ST_FIREWALL) ? SOCK_F_PUSH : 0; flags |= 0 != (rs->status & ST_TLS) ? SOCK_F_TLS : 0; + flags |= ((rs->status & ST_G2) && T_GTKG != rs->vendor) ? SOCK_F_G2 : 0; (void) search_gui_new_browse_host( rs->hostname, rs->addr, rs->port, @@ -370,54 +362,6 @@ return g_slist_reverse(data_list); } -/** - * Queue a bitzi queries from the search context menu - */ -void -on_popup_search_metadata_activate(GtkMenuItem *unused_menuitem, - gpointer unused_udata) -{ - GList *node_list; - GSList *data_list; - search_t *search; - guint32 bitzi_debug; - - (void) unused_menuitem; - (void) unused_udata; - - search = search_gui_get_current_search(); - g_assert(search != NULL); - - gtk_clist_freeze(GTK_CLIST(search->tree)); - - node_list = g_list_copy(GTK_CLIST(search->tree)->selection); - data_list = search_cb_collect_ctree_data(GTK_CTREE(search->tree), - node_list, gui_record_sha1_eq); - - /* Make sure the column is actually visible. */ - { - static const gint min_width = 80; - GtkCList *clist = GTK_CLIST(search->tree); - - gtk_clist_set_column_visibility(clist, c_sr_meta, TRUE); - if (clist->columnc_sr_meta.width < min_width) - gtk_clist_set_column_width(clist, c_sr_meta, min_width); - } - - /* Queue up our requests */ - gnet_prop_get_guint32_val(PROP_BITZI_DEBUG, &bitzi_debug); - if (bitzi_debug > 10) - g_debug("on_popup_search_metadata_activate: %d items, %p", - g_slist_position(data_list, g_slist_last(data_list)) + 1, - cast_to_gconstpointer(data_list)); - - G_SLIST_FOREACH(data_list, search_gui_queue_bitzi_by_sha1); - - gtk_clist_thaw(GTK_CLIST(search->tree)); - g_slist_free(data_list); - g_list_free(node_list); -} - void on_popup_search_copy_magnet_activate(GtkMenuItem *unused_item, gpointer unused_udata)
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk1/search_stats.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk1/search_stats.c
Changed
@@ -57,9 +57,11 @@ #include "if/gui_property_priv.h" #include "if/bridge/ui2c.h" +#include "lib/htable.h" #include "lib/misc.h" -#include "lib/glib-missing.h" +#include "lib/str.h" #include "lib/wordvec.h" + #include "lib/override.h" /* Must be the last header included */ /** @@ -73,19 +75,16 @@ static guint stat_count; -static GHashTable *stat_hash = NULL; - -static gboolean delete_hash_entry(gpointer key, gpointer val, gpointer data); -static void empty_hash_table(void); -static gboolean stats_hash_to_clist( - gpointer key, gpointer value, gpointer userdata); +static htable_t *stat_hash = NULL; -static gboolean -delete_hash_entry(gpointer key, gpointer val, gpointer unused_data) +static bool +delete_hash_entry(const void *key, void *val, void *unused_data) { + void *p = deconstify_pointer(key); + (void) unused_data; /* free the key str (was strdup'd below) */ - G_FREE_NULL(key); + G_FREE_NULL(p); G_FREE_NULL(val); return TRUE; } @@ -141,7 +140,7 @@ (void) unused_addr; (void) unused_port; - gm_snprintf(buf, sizeof buf, QUERY_SHA1 == type ? "urn:sha1:%s" : "%s", + str_bprintf(buf, sizeof buf, QUERY_SHA1 == type ? "urn:sha1:%s" : "%s", search); wovec.word = buf; @@ -180,7 +179,7 @@ if (!stat_hash) return; - g_hash_table_foreach_remove(stat_hash, delete_hash_entry, NULL); + htable_foreach_remove(stat_hash, delete_hash_entry, NULL); } /** @@ -192,7 +191,7 @@ * */ static gboolean -stats_hash_to_clist(gpointer key, gpointer value, gpointer unused_udata) +stats_hash_to_clist(const void *key, void *value, void *unused_udata) { gchar *text3; gchar period_tmp32; @@ -213,7 +212,8 @@ (1.0 * val->total_cnt / (val->periods + 2.0)) * 100 < GUI_PROPERTY(search_stats_delcoef) ) { - G_FREE_NULL(key); + void *p = deconstify_pointer(key); + G_FREE_NULL(p); G_FREE_NULL(val); return TRUE; } @@ -223,10 +223,10 @@ /* update the display */ /* FIXME: make %8.8d %d and set up custom sort function */ - gm_snprintf(period_tmp, sizeof period_tmp, "%8.8d", (int) val->period_cnt); - gm_snprintf(total_tmp, sizeof total_tmp, "%8.8d", (int) val->total_cnt); + str_bprintf(period_tmp, sizeof period_tmp, "%8.8d", (int) val->period_cnt); + str_bprintf(total_tmp, sizeof total_tmp, "%8.8d", (int) val->total_cnt); - text0 = key; + text0 = deconstify_pointer(key); text1 = period_tmp; text2 = total_tmp; @@ -283,14 +283,14 @@ return; } - val = g_hash_table_lookup(stat_hash, vec->word); + val = htable_lookup(stat_hash, vec->word); if (val) { val->period_cnt++; } else { key = g_strdup(vec->word); val = g_malloc0(sizeof *val); val->period_cnt = vec->amount; - g_hash_table_insert(stat_hash, key, val); + htable_insert(stat_hash, key, val); } } @@ -358,7 +358,7 @@ gtk_clist_clear(GTK_CLIST(clist_search_stats)); /* insert the hash table contents into the sorted clist */ - g_hash_table_foreach_remove(stat_hash, stats_hash_to_clist, NULL); + htable_foreach_remove(stat_hash, stats_hash_to_clist, NULL); gtk_clist_sort(GTK_CLIST(clist_search_stats)); gtk_clist_thaw(GTK_CLIST(clist_search_stats)); @@ -401,7 +401,7 @@ gtk_clist_set_sort_type(clist, GTK_SORT_DESCENDING); clist_restore_widths(clist, PROP_SEARCH_STATS_COL_WIDTHS); - stat_hash = g_hash_table_new(g_str_hash, g_str_equal); + stat_hash = htable_create(HASH_KEY_STRING, 0); main_gui_add_timer(search_stats_gui_timer); } @@ -412,7 +412,8 @@ GTK_CLIST(gui_main_window_lookup("clist_search_stats")), PROP_SEARCH_STATS_COL_WIDTHS); search_stats_gui_set_type(NO_SEARCH_STATS); - gm_hash_table_destroy_null(&stat_hash); + empty_hash_table(); + htable_free_null(&stat_hash); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk1/support-glade.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk1/support-glade.c
Changed
@@ -51,7 +51,7 @@ found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget), widget_name); if (!found_widget) - g_warning ("Widget not found: %s", widget_name); + g_warning ("%s(): widget not found: %s", G_STRFUNC, widget_name); return found_widget; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk1/upload_stats.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk1/upload_stats.c
Changed
@@ -65,10 +65,11 @@ #include "gtk/upload_stats.h" #include "gtk/upload_stats_cb.h" -#include "lib/glib-missing.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/timestamp.h" #include "lib/utf8.h" + #include "lib/override.h" /* Must be the last header included */ static GtkCList * @@ -133,7 +134,7 @@ } /* Public functions */ -G_GNUC_COLD void +void G_COLD upload_stats_gui_init(void) { enum c_us i; @@ -180,9 +181,9 @@ g_strlcpy(size_tmp, short_size(us->size, show_metric_units()), sizeof size_tmp); - gm_snprintf(attempts_tmp, sizeof attempts_tmp, "%u", us->attempts); - gm_snprintf(complete_tmp, sizeof complete_tmp, "%u", us->complete); - gm_snprintf(norm_tmp, sizeof norm_tmp, "%.3f", us->norm); + str_bprintf(attempts_tmp, sizeof attempts_tmp, "%u", us->attempts); + str_bprintf(complete_tmp, sizeof complete_tmp, "%u", us->complete); + str_bprintf(norm_tmp, sizeof norm_tmp, "%.3f", us->norm); if (us->rtime) { timestamp_to_string_buf(us->rtime, rtime_tmp, sizeof rtime_tmp); } else { @@ -275,7 +276,7 @@ text = uint64_to_string(us->complete); break; case c_us_norm: - gm_snprintf(tmpstr, sizeof tmpstr, "%.3f", us->norm); + str_bprintf(tmpstr, sizeof tmpstr, "%.3f", us->norm); text = tmpstr; break; case c_us_rtime: @@ -299,7 +300,7 @@ } void -upload_stats_gui_clear_all(void) +upload_stats_gui_clear_model(void) { gtk_clist_clear(clist_ul_stats()); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk1/uploads.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk1/uploads.c
Changed
@@ -34,8 +34,8 @@ #include "if/bridge/ui2c.h" #include "lib/host_addr.h" -#include "lib/glib-missing.h" #include "lib/iso3166.h" +#include "lib/str.h" #include "lib/tm.h" #include "lib/utf8.h" #include "lib/walloc.h" @@ -138,7 +138,7 @@ g_assert(r); rd = r->data; g_assert(rd); - + if (rd->valid && (rd->handle == u)) { /* found */ @@ -150,8 +150,7 @@ row++; } - g_warning("%s: upload not found handle=%u", - G_GNUC_PRETTY_FUNCTION, u); + g_warning("%s(): upload not found handle=%u", G_STRFUNC, u); return -1; } @@ -181,8 +180,8 @@ clist_uploads = GTK_CLIST(gui_main_window_lookup("clist_uploads")); row = find_row(u->upload_handle, &rd); if (row == -1) { - g_warning("%s: no matching row found handle=%u", - G_GNUC_PRETTY_FUNCTION, u->upload_handle); + g_warning("%s(): no matching row found handle=%u", + G_STRFUNC, u->upload_handle); return; } @@ -198,13 +197,13 @@ g_strlcpy(size_tmp, short_size(u->file_size, show_metric_units()), sizeof size_tmp); - range_len = gm_snprintf(range_tmp, sizeof range_tmp, "%s%s", + range_len = str_bprintf(range_tmp, sizeof range_tmp, "%s%s", short_size(u->range_end - u->range_start + 1, show_metric_units()), u->partial ? _(" (partial)") : ""); if (u->range_start) - range_len += gm_snprintf( + range_len += str_bprintf( &range_tmprange_len, sizeof(range_tmp)-range_len, " @ %s", short_size(u->range_start, show_metric_units())); @@ -231,7 +230,7 @@ gtk_clist_set_foreground(clist_uploads, row, color); } - gm_snprintf(range_tmp, sizeof range_tmp, "%5.02f%%", + str_bprintf(range_tmp, sizeof range_tmp, "%5.02f%%", 100.0 * uploads_gui_progress(&status, rd)); gtk_clist_set_text(clist_uploads, row, c_ul_progress, range_tmp); @@ -273,13 +272,13 @@ g_strlcpy(size_tmp, short_size(u->file_size, show_metric_units()), sizeof size_tmp); - range_len = gm_snprintf(range_tmp, sizeof range_tmp, "%s%s", + range_len = str_bprintf(range_tmp, sizeof range_tmp, "%s%s", short_size(u->range_end - u->range_start + 1, show_metric_units()), u->partial ? _(" (partial)") : ""); if (u->range_start) - range_len += gm_snprintf( + range_len += str_bprintf( &range_tmprange_len, sizeof(range_tmp)-range_len, " @ %s", short_size(u->range_start, show_metric_units())); @@ -346,7 +345,7 @@ data->last_update = now; guc_upload_get_status(data->handle, &status); - gm_snprintf(tmp, sizeof tmp, "%5.02f%%", + str_bprintf(tmp, sizeof tmp, "%5.02f%%", 100.0 * uploads_gui_progress(&status, data)); gtk_clist_set_text(clist, row, c_ul_progress, tmp); @@ -487,7 +486,7 @@ /** * Unregister callbacks in the backend and clean up. */ -G_GNUC_COLD void +void G_COLD uploads_gui_shutdown(void) { GtkCList *clist;
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/Jmakefile -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/Jmakefile
Changed
@@ -33,6 +33,7 @@ REMOTE_GLADE = $(REMOTE_GLADE_C) $(REMOTE_GLADE_H) LSRC = \ + column_sort.c \ fileinfo.c \ gnet_stats.c \ hcache.c \
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-95 -: $X-Id: Jmake.tmpl 69 2011-01-09 13:57:07Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -40,7 +40,7 @@ CC = $cc CP = $cp CTAGS = ctags -JCFLAGS = \$(CFLAGS) $optimize $ccflags $large +JCFLAGS = \$(CFLAGS) $optimize $pthread $ccflags $large JCPPFLAGS = $cppflags MKDEP = $mkdep \$(DPFLAGS) \$(JCPPFLAGS) -- MV = $mv @@ -69,7 +69,7 @@ $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 94 2011-02-10 14:06:58Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Force 'make depend' to be performed first -- do not edit @@ -81,7 +81,7 @@ ######################################################################## # Start of Jmakefile -# $X-Id: Jmakefile 19197 2011-05-31 20:55:41Z rmanfredi $ +# $X-Id$ # Those files lie in the ../gtk-shared directory REMOTE_GLADE_C = callbacks.c @@ -89,6 +89,7 @@ REMOTE_GLADE = $(REMOTE_GLADE_C) $(REMOTE_GLADE_H) LSRC = \ + column_sort.c \ fileinfo.c \ gnet_stats.c \ hcache.c \ @@ -104,6 +105,7 @@ uploads.c LOBJ = \ + column_sort.o \ fileinfo.o \ gnet_stats.o \ hcache.o \ @@ -230,6 +232,11 @@ $(RM) Makefile config.sh install:: local_install + @exit 0 + +install-strip:: local_install-strip + @exit 0 + install.man:: maybe_install.man deinstall:: local_deinstall deinstall.man:: maybe_deinstall.man @@ -268,6 +275,9 @@ local_install:: @echo "install in $(CURRENT) done." +local_install-strip:: + @echo "install (strip) in $(CURRENT) done." + local_deinstall:: @echo "deinstall in $(CURRENT) done."
View file
gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/column_sort.c
Added
@@ -0,0 +1,130 @@ +/* + * Copyright (c) 2001-2003 Raphael Manfredi, Richard Eckart + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +/** + * @ingroup gtk + * @file + * + * GTK2 tri-state column sorting + * + * Here we enforce a tri-state sorting. Normally, GTK+ would only + * switch between ascending and descending but never switch back + * to the unsorted state. + * + * +--> sort ascending -> sort descending -> unsorted -+ + * | | + * +-----------------------<---------------------------+ + * + * @author Raphael Manfredi + * @author Richard Eckart + * @date 2001-2003 + * + * @author Raphael Manfredi + * @date 2014 + */ + +#include "gtk/gui.h" + +#include "column_sort.h" + +/** + * Manage the tri-state sorting status on the column. + * + * @param column the clicked column in the tree-view + * @param ctx the sorting context we are managing + */ +void +column_sort_tristate(GtkTreeViewColumn *column, struct sorting_context *ctx) +{ +#if GTK_CHECK_VERSION(2,6,0) + GtkTreeModel *model; + GtkTreeSortable *sortable; + int sort_col; + + model = gtk_tree_view_get_model(GTK_TREE_VIEW(column->tree_view)); + sortable = GTK_TREE_SORTABLE(model); + gtk_tree_sortable_get_sort_column_id(sortable, &sort_col, NULL); + + /* If the user switched to another sort column, reset the sort order */ + if (ctx->s_column != sort_col) { + ctx->s_order = SORT_NONE; + } + + ctx->s_column = sort_col; + + /* Tri-state permutation of the sorting order */ + + switch (ctx->s_order) { + case SORT_NONE: + case SORT_NO_COL: + ctx->s_order = SORT_ASC; + break; + case SORT_ASC: + ctx->s_order = SORT_DESC; + break; + case SORT_DESC: + ctx->s_order = SORT_NONE; + break; + } + + /* Enforce sorting order */ + + switch (ctx->s_order) { + case SORT_NONE: + ctx->s_column = GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID; + /* FALL THROUGH */ + case SORT_DESC: + gtk_tree_sortable_set_sort_column_id(sortable, + ctx->s_column, GTK_SORT_DESCENDING); + break; + case SORT_ASC: + gtk_tree_sortable_set_sort_column_id(sortable, + ctx->s_column, GTK_SORT_ASCENDING); + break; + case SORT_NO_COL: + g_assert_not_reached(); + } +#endif /* GTK+ >= 2.6.0 */ +} + +/** + * Convenience routine to plug a callback on the column to handle clicks. + * + * The callback should perform the necessary context extraction and then + * should end-up calling column_sort_tristate(). + * + * @param column the column for which we want to handle header clicks + * @param cb the GTK callback to invoke + * @param udata the parameter to pass to the GTK callback + */ +void +column_sort_tristate_register(GtkTreeViewColumn *column, + column_tristate_cb_t cb, void *udata) +{ +#if GTK_CHECK_VERSION(2,6,0) + gui_signal_connect_after(column, "clicked", cb, udata); +#endif /* GTK+ >= 2.6.0 */ +} + +/* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/column_sort.h
Added
@@ -0,0 +1,40 @@ +/* + * Copyright (c) 2014 Raphael Manfredi + * + *---------------------------------------------------------------------- + * This file is part of gtk-gnutella. + * + * gtk-gnutella 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 2 of the License, or + * (at your option) any later version. + * + * gtk-gnutella 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 gtk-gnutella; if not, write to the Free Software + * Foundation, Inc.: + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------- + */ + +#ifndef _gtk2_column_sort_h_ +#define _gtk2_column_sort_h_ + +#include "gtk/gui.h" + +typedef void (*column_tristate_cb_t)(GtkTreeViewColumn *column, void *udata); + +struct sorting_context; + +void column_sort_tristate(GtkTreeViewColumn *column, + struct sorting_context *ctx); + +void +column_sort_tristate_register(GtkTreeViewColumn *column, + column_tristate_cb_t cb, void *udata); + +#endif /* _gtk2_column_sort_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/fileinfo.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/fileinfo.c
Changed
@@ -25,7 +25,7 @@ * @ingroup gtk * @file * - * Displaying of file information in the GUI. + * Displaying of file information in the GUI ("Downloads" pane). * * @author Richard Eckart * @date 2003 @@ -38,15 +38,17 @@ #include "gtk/drag.h" #include "gtk/misc.h" +#include "column_sort.h" + #include "if/gui_property.h" -#include "lib/glib-missing.h" +#include "lib/htable.h" #include "lib/utf8.h" #include "lib/walloc.h" #include "lib/override.h" /* Must be the last header included */ -static GHashTable *fi_sources; +static htable_t *fi_sources; static GtkTreeView *treeview_download_aliases; static GtkTreeView *treeview_download_details; @@ -58,8 +60,8 @@ static GtkListStore *store_sources; #if GTK_CHECK_VERSION(2,6,0) -static GtkSortType files_sort_order; -static int files_sort_column; +static GtkSortType files_sort_type; +static struct sorting_context files_sort; static int files_sort_depth; #endif /* Gtk+ => 2.6.0 */ @@ -67,8 +69,8 @@ fi_gui_files_sort_reset(void) { #if GTK_CHECK_VERSION(2,6,0) - files_sort_column = GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID; - files_sort_order = GTK_SORT_ASCENDING; + files_sort.s_column = GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID; + files_sort_type = GTK_SORT_ASCENDING; files_sort_depth = 0; #endif /* Gtk+ => 2.6.0 */ } @@ -84,8 +86,8 @@ sortable = GTK_TREE_SORTABLE(store_files); if (gtk_tree_sortable_get_sort_column_id(sortable, &column, &order)) { - files_sort_column = column; - files_sort_order = order; + files_sort.s_column = column; + files_sort_type = order; gtk_tree_sortable_set_sort_column_id(sortable, GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, order); } @@ -101,9 +103,9 @@ files_sort_depth--; if (0 == files_sort_depth) { - if (GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID != files_sort_column) { + if (GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID != files_sort.s_column) { gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store_files), - files_sort_column, files_sort_order); + files_sort.s_column, files_sort_type); } } #endif /* Gtk+ => 2.6.0 */ @@ -203,10 +205,10 @@ idx = pointer_to_uint(udata); if (c_fi_progress == idx) { unsigned value = fi_gui_file_get_progress(file); - g_object_set(cell, "value", value, (void *) 0); + g_object_set(cell, "value", value, NULL_PTR); } else { const char *text = fi_gui_file_column_text(file, idx); - g_object_set(cell, "text", text, (void *) 0); + g_object_set(cell, "text", text, NULL_PTR); } } @@ -228,10 +230,10 @@ idx = pointer_to_uint(udata); if (c_src_progress == idx) { unsigned value = fi_gui_source_get_progress(d); - g_object_set(cell, "value", value, (void *) 0); + g_object_set(cell, "value", value, NULL_PTR); } else { const char *text = fi_gui_source_column_text(d, idx); - g_object_set(cell, "text", text, (void *) 0); + g_object_set(cell, "text", text, NULL_PTR); } } @@ -239,7 +241,7 @@ create_text_cell_renderer(gfloat xalign) { GtkCellRenderer *renderer; - + renderer = gtk_cell_renderer_text_new(); gtk_cell_renderer_text_set_fixed_height_from_font( GTK_CELL_RENDERER_TEXT(renderer), 1); @@ -247,13 +249,13 @@ "mode", GTK_CELL_RENDERER_MODE_INERT, "xalign", xalign, "ypad", (unsigned) GUI_CELL_RENDERER_YPAD, - (void *) 0); + NULL_PTR); return renderer; } -static gboolean -fi_sources_remove(void *unused_key, void *value, void *unused_udata) +static bool +fi_sources_remove(const void *unused_key, void *value, void *unused_udata) { GtkTreeIter *iter; @@ -276,7 +278,7 @@ fi_gui_clear_sources(void) { gtk_list_store_clear(store_sources); - g_hash_table_foreach_remove(fi_sources, fi_sources_remove, NULL); + htable_foreach_remove(fi_sources, fi_sources_remove, NULL); } void @@ -298,15 +300,22 @@ } void +fi_gui_source_massive_update(bool starting) +{ + (void) starting; + /* Nothing to do */ +} + +void fi_gui_source_show(struct download *d) { GtkTreeIter *iter; g_return_if_fail(store_sources); - g_return_if_fail(NULL == g_hash_table_lookup(fi_sources, d)); + g_return_if_fail(!htable_contains(fi_sources, d)); WALLOC(iter); - g_hash_table_insert(fi_sources, d, iter); + htable_insert(fi_sources, d, iter); list_store_append_pointer(store_sources, iter, 0, d); } @@ -448,7 +457,7 @@ download_check(d); - iter = g_hash_table_lookup(fi_sources, d); + iter = htable_lookup(fi_sources, d); if (iter) { tree_model_iter_changed(GTK_TREE_MODEL(store_sources), iter); } @@ -473,8 +482,8 @@ renderer = create_text_cell_renderer(xalign); } - column = gtk_tree_view_column_new_with_attributes(title, - renderer, (void *) 0); + column = + gtk_tree_view_column_new_with_attributes(title, renderer, NULL_PTR); gtk_tree_view_column_set_cell_data_func(column, renderer, cell_data_func, uint_to_pointer(column_id), NULL); return column; @@ -489,7 +498,7 @@ "reorderable", FALSE, "resizable", TRUE, "sizing", GTK_TREE_VIEW_COLUMN_FIXED, - (void *) 0); + NULL_PTR); } static GtkTreeViewColumn * @@ -572,23 +581,23 @@ g_return_if_fail(tv); treeview_download_details = tv; - model = GTK_TREE_MODEL(gtk_list_store_new(G_N_ELEMENTS(tab), + model = GTK_TREE_MODEL(gtk_list_store_new(N_ITEMS(tab), G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING)); gtk_tree_view_set_model(tv, model); g_object_unref(model); - for (i = 0; i < G_N_ELEMENTS(tab); i++) { + for (i = 0; i < N_ITEMS(tab); i++) { GtkTreeViewColumn *column; GtkCellRenderer *renderer; - + renderer = create_text_cell_renderer(tabi.xalign); g_object_set(G_OBJECT(renderer), "editable", tabi.editable, - (void *) 0); + NULL_PTR); gui_signal_connect(renderer, "edited", on_cell_edited, tv); column = gtk_tree_view_column_new_with_attributes(tabi.title, - renderer, "text", i, (void *) 0); + renderer, "text", i, NULL_PTR); g_object_set(column, "visible", i > 0 ? TRUE : FALSE, "min-width", 1, @@ -596,7 +605,7 @@ "sizing", 1 == i ? GTK_TREE_VIEW_COLUMN_AUTOSIZE : GTK_TREE_VIEW_COLUMN_FIXED, - (void *) 0); + NULL_PTR); gtk_tree_view_append_column(tv, column); } @@ -621,6 +630,17 @@ } } +/** + * Enforce a tri-state sorting. + */ +static void +on_fileinfo_treeview_column_clicked(GtkTreeViewColumn *column, void *udata) +{ + (void) udata; + + column_sort_tristate(column, &files_sort); +} + static void treeview_download_files_init(void) { @@ -633,11 +653,16 @@ treeview_download_files = tv; for (i = 0; i < c_fi_num; i++) { - add_column(tv, i, + GtkTreeViewColumn *column; + + column = add_column(tv, i, fi_gui_files_column_title(i), fi_gui_files_column_justify_right(i) ? 1.0 : 0.0, c_fi_progress == i ? gtk_cell_renderer_progress_new() : NULL, render_files); + + column_sort_tristate_register(column, + on_fileinfo_treeview_column_clicked, NULL); } gtk_tree_selection_set_mode(gtk_tree_view_get_selection(tv), @@ -706,8 +731,8 @@ void fi_gui_init(void) { - fi_sources = g_hash_table_new(NULL, NULL); - + fi_sources = htable_create(HASH_KEY_SELF, 0); + { GtkTreeViewColumn *column; GtkTreeView *tv; @@ -721,7 +746,7 @@ column = gtk_tree_view_column_new_with_attributes(_("Aliases"), create_text_cell_renderer(0.0), "text", 0, - (void *) 0); + NULL_PTR); configure_column(column); gtk_tree_view_column_set_sort_column_id(column, 0); gtk_tree_view_append_column(tv, column); @@ -745,21 +770,21 @@ GtkTreeView *tv; unsigned i; - STATIC_ASSERT(c_src_num == G_N_ELEMENTS(tab)); - + STATIC_ASSERT(c_src_num == N_ITEMS(tab)); + tv = GTK_TREE_VIEW(gui_main_window_lookup("treeview_download_sources")); treeview_download_sources = tv; store_sources = gtk_list_store_new(1, G_TYPE_POINTER); gtk_tree_view_set_model(tv, GTK_TREE_MODEL(store_sources)); - for (i = 0; i < G_N_ELEMENTS(tab); i++) { + for (i = 0; i < N_ITEMS(tab); i++) { GtkCellRenderer *renderer; renderer = tabi.id == c_src_progress ? gtk_cell_renderer_progress_new() : NULL; - add_column(tv, tabi.id, _(tabi.title), 0.0, + (void) add_column(tv, tabi.id, _(tabi.title), 0.0, renderer, render_sources); } @@ -769,7 +794,7 @@ tree_view_restore_widths(tv, PROP_SOURCES_COL_WIDTHS); tree_view_set_fixed_height_mode(tv, TRUE); - widget_add_popup_menu(GTK_WIDGET(tv), fi_gui_sources_get_popup_menu); + widget_add_popup_menu(GTK_WIDGET(tv), fi_gui_sources_get_popup_menu); } fi_gui_details_treeview_init(); @@ -813,7 +838,7 @@ store_sources = NULL; } - gm_hash_table_destroy_null(&fi_sources); + htable_free_null(&fi_sources); } void @@ -821,12 +846,12 @@ { GtkTreeIter *iter; - iter = g_hash_table_lookup(fi_sources, d); + iter = htable_lookup(fi_sources, d); if (iter) { if (store_sources) { gtk_list_store_remove(store_sources, iter); } - g_hash_table_remove(fi_sources, d); + htable_remove(fi_sources, d); WFREE(iter); } }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/gnet_stats.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/gnet_stats.c
Changed
@@ -33,9 +33,10 @@ #include "if/core/gnutella.h" #include "if/bridge/ui2c.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/tm.h" -#include "lib/glib-missing.h" + #include "lib/override.h" /* Must be the last header included */ static GtkTreeView *treeview_gnet_stats_messages; @@ -107,7 +108,7 @@ if (!perc) uint64_to_string_buf(val_tbltype, dst, size); else - gm_snprintf(dst, size, "%.2f%%", + str_bprintf(dst, size, "%.2f%%", (gfloat) val_tbltype / val_tblMSG_TOTAL * 100.0); } @@ -124,46 +125,27 @@ else if (!perc) g_strlcpy(dst, compact_size(val_tbltype, show_metric_units()), n); else - gm_snprintf(dst, n, "%.2f%%", + str_bprintf(dst, n, "%.2f%%", (gfloat) val_tbltype / val_tblMSG_TOTAL * 100.0); return dst; } -static const gchar * +static void drop_stat_str(gchar *dst, size_t size, const gnet_stats_t *stats, gint reason, - gint selected_type, gboolean percent) + gint selected_type) { - guint32 total = stats->pkg.droppedMSG_TOTAL; - if (stats->drop_reasonreasonselected_type == 0) g_strlcpy(dst, "-", size); - else if (percent) - gm_snprintf(dst, size, "%.2f%%", - (gfloat) stats->drop_reasonreasonselected_type / total * 100); else uint64_to_string_buf(stats->drop_reasonreasonselected_type, dst, size); - - return dst; } -static const gchar * +static inline void general_stat_str(gchar *dst, size_t size, const gnet_stats_t *stats, gint type) { - if (stats->generaltype == 0) - g_strlcpy(dst, "-", size); - else if ( - type == GNR_QUERY_COMPACT_SIZE || - type == GNR_IGNORED_DATA || - type == GNR_SUNK_DATA - ) - g_strlcpy(dst, - compact_size(stats->generaltype, show_metric_units()), size); - else - uint64_to_string_buf(stats->generaltype, dst, size); - - return dst; + gnet_stats_gui_general_to_string_buf(dst, size, stats, type); } static void @@ -179,7 +161,7 @@ g_object_set(renderer, "xalign", xalign, "ypad", GUI_CELL_RENDERER_YPAD, - (void *) 0); + NULL_PTR); column = gtk_tree_view_column_new_with_attributes(label, renderer, "text", column_id, NULL); @@ -189,13 +171,14 @@ "reorderable", TRUE, "resizable", TRUE, "sizing", GTK_TREE_VIEW_COLUMN_FIXED, - (void *) 0); + NULL_PTR); gtk_tree_view_append_column(treeview, column); } static void gnet_stats_update_general(const gnet_stats_t *stats) { + static uint64 generalGNR_TYPE_COUNT; GtkListStore *store; GtkTreeIter iter; gint n; @@ -206,10 +189,14 @@ return; for (n = 0; n < GNR_TYPE_COUNT; n++) { - gchar buf32; + gchar bufUINT64_DEC_BUFLEN; + + if (stats->generaln != generaln) { + generaln = stats->generaln; + general_stat_str(buf, sizeof buf, stats, n); + gtk_list_store_set(store, &iter, 1, buf, (-1)); + } - general_stat_str(buf, sizeof buf, stats, n); - gtk_list_store_set(store, &iter, 1, buf, (-1)); if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter)) break; } @@ -218,9 +205,11 @@ static void gnet_stats_update_drop_reasons(const gnet_stats_t *stats) { + static uint64 drop_reasonMSG_DROP_REASON_COUNTMSG_TYPE_COUNT; GtkListStore *store; GtkTreeIter iter; gint n; + guint i = GUI_PROPERTY(gnet_stats_drop_reasons_type); store = GTK_LIST_STORE(gtk_tree_view_get_model( treeview_gnet_stats_drop_reasons)); @@ -228,12 +217,14 @@ return; for (n = 0; n < MSG_DROP_REASON_COUNT; n++) { - gchar buf32; + gchar bufUINT64_DEC_BUFLEN; + + if (stats->drop_reasonni != drop_reasonni) { + drop_reasonni = stats->drop_reasonni; + drop_stat_str(buf, sizeof buf, stats, n, i); + gtk_list_store_set(store, &iter, 1, buf, (-1)); + } - drop_stat_str(buf, sizeof buf, stats, n, - GUI_PROPERTY(gnet_stats_drop_reasons_type), - GUI_PROPERTY(gnet_stats_bytes)); - gtk_list_store_set(store, &iter, 1, buf, (-1)); if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter)) break; } @@ -242,7 +233,7 @@ static void gnet_stats_update_messages(const gnet_stats_t *stats) { - static char strnum_c_gs32; + static char strnum_c_gsUINT64_DEC_BUFLEN; static const size_t len = sizeof(str0); GtkTreeView *treeview = treeview_gnet_stats_messages; GtkListStore *store; @@ -251,7 +242,7 @@ gboolean bytes = FALSE; gint n; - STATIC_ASSERT(num_c_gs == G_N_ELEMENTS(msg_stats_label)); + STATIC_ASSERT(num_c_gs == N_ITEMS(msg_stats_label)); gui_prop_get_boolean_val(PROP_GNET_STATS_PERC, &perc); gui_prop_get_boolean_val(PROP_GNET_STATS_BYTES, &bytes); @@ -299,7 +290,6 @@ if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter)) break; } - } static void @@ -378,14 +368,14 @@ guint32 widthnum_c_horizon; c_horizon_t n; - STATIC_ASSERT(num_c_horizon == G_N_ELEMENTS(types)); - model = GTK_TREE_MODEL(gtk_list_store_newv(G_N_ELEMENTS(types), types)); + STATIC_ASSERT(num_c_horizon == N_ITEMS(types)); + model = GTK_TREE_MODEL(gtk_list_store_newv(N_ITEMS(types), types)); treeview = treeview_gnet_stats_horizon = GTK_TREE_VIEW( gui_main_window_lookup("treeview_gnet_stats_horizon")); gui_prop_get_guint32(PROP_GNET_STATS_HORIZON_COL_WIDTHS, - width, 0, G_N_ELEMENTS(width)); - for (n = 0; n < G_N_ELEMENTS(width); n++) { + width, 0, N_ITEMS(width)); + for (n = 0; n < N_ITEMS(width); n++) { GtkTreeIter iter; gint i; @@ -425,8 +415,8 @@ guint32 widthSTATS_FLOWC_COLUMNS; guint n; - STATIC_ASSERT(STATS_FLOWC_COLUMNS == G_N_ELEMENTS(types)); - model = GTK_TREE_MODEL(gtk_list_store_newv(G_N_ELEMENTS(types), types)); + STATIC_ASSERT(STATS_FLOWC_COLUMNS == N_ITEMS(types)); + model = GTK_TREE_MODEL(gtk_list_store_newv(N_ITEMS(types), types)); treeview = treeview_gnet_stats_flowc = GTK_TREE_VIEW( gui_main_window_lookup("treeview_gnet_stats_flowc")); @@ -444,10 +434,10 @@ gui_prop_get_guint32(PROP_GNET_STATS_FC_COL_WIDTHS, width, 0, STATS_FLOWC_COLUMNS); - for (n = 0; n < G_N_ELEMENTS(width); n++) { + for (n = 0; n < N_ITEMS(width); n++) { gchar buf16; - gm_snprintf(buf, sizeof(buf), "%d%c", n - 1, + str_bprintf(buf, sizeof(buf), "%d%c", n - 1, n + 1 < STATS_FLOWC_COLUMNS ? '\0' : '+'); add_column(treeview, n, widthn, (gfloat) (n != 0), n == 0 ? _("Type") : buf); @@ -466,18 +456,18 @@ G_TYPE_STRING, G_TYPE_STRING }; - guint32 widthG_N_ELEMENTS(types); + guint32 widthN_ITEMS(types); guint n; - STATIC_ASSERT(2 == G_N_ELEMENTS(types)); - model = GTK_TREE_MODEL(gtk_list_store_newv(G_N_ELEMENTS(types), types)); + STATIC_ASSERT(2 == N_ITEMS(types)); + model = GTK_TREE_MODEL(gtk_list_store_newv(N_ITEMS(types), types)); treeview = treeview_gnet_stats_drop_reasons = GTK_TREE_VIEW( gui_main_window_lookup("treeview_gnet_stats_drop_reasons")); gui_prop_get_guint32(PROP_GNET_STATS_DROP_REASONS_COL_WIDTHS, - width, 0, G_N_ELEMENTS(width)); + width, 0, N_ITEMS(width)); - for (n = 0; n < G_N_ELEMENTS(types); n++) { + for (n = 0; n < N_ITEMS(types); n++) { GtkTreeIter iter; gint i; @@ -504,18 +494,18 @@ G_TYPE_STRING, G_TYPE_STRING }; - guint32 widthG_N_ELEMENTS(types); + guint32 widthN_ITEMS(types); guint n; - STATIC_ASSERT(2 == G_N_ELEMENTS(types)); - model = GTK_TREE_MODEL(gtk_list_store_newv(G_N_ELEMENTS(types), types)); + STATIC_ASSERT(2 == N_ITEMS(types)); + model = GTK_TREE_MODEL(gtk_list_store_newv(N_ITEMS(types), types)); treeview = treeview_gnet_stats_general = GTK_TREE_VIEW( gui_main_window_lookup("treeview_gnet_stats_general")); gui_prop_get_guint32(PROP_GNET_STATS_GENERAL_COL_WIDTHS, - width, 0, G_N_ELEMENTS(width)); + width, 0, N_ITEMS(width)); - for (n = 0; n < G_N_ELEMENTS(types); n++) { + for (n = 0; n < N_ITEMS(types); n++) { GtkTreeIter iter; gint i; @@ -547,12 +537,12 @@ G_TYPE_STRING, /* c_gs_gen_queued */ G_TYPE_STRING /* c_gs_generated */ }; - guint32 widthG_N_ELEMENTS(types); + guint32 widthN_ITEMS(types); guint n; - STATIC_ASSERT(num_c_gs == G_N_ELEMENTS(msg_stats_label)); - STATIC_ASSERT(num_c_gs == G_N_ELEMENTS(types)); - model = GTK_TREE_MODEL(gtk_list_store_newv(G_N_ELEMENTS(types), types)); + STATIC_ASSERT(num_c_gs == N_ITEMS(msg_stats_label)); + STATIC_ASSERT(num_c_gs == N_ITEMS(types)); + model = GTK_TREE_MODEL(gtk_list_store_newv(N_ITEMS(types), types)); treeview = treeview_gnet_stats_messages = GTK_TREE_VIEW( gui_main_window_lookup("treeview_gnet_stats_messages")); @@ -562,7 +552,7 @@ gint i; gtk_list_store_append(GTK_LIST_STORE(model), &iter); - for (i = 0; (guint) i < G_N_ELEMENTS(msg_stats_label); i++) { + for (i = 0; (guint) i < N_ITEMS(msg_stats_label); i++) { gtk_list_store_set(GTK_LIST_STORE(model), &iter, i, i == 0 ? msg_type_str(n) : "-", (-1)); @@ -570,9 +560,9 @@ } gui_prop_get_guint32(PROP_GNET_STATS_MSG_COL_WIDTHS, - width, 0, G_N_ELEMENTS(width)); + width, 0, N_ITEMS(width)); - for (n = 0; (guint) n < G_N_ELEMENTS(msg_stats_label); n++) { + for (n = 0; (guint) n < N_ITEMS(msg_stats_label); n++) { add_column(treeview, n, widthn, (gfloat) (n != 0), _(msg_stats_labeln)); } @@ -599,22 +589,22 @@ G_TYPE_STRING, G_TYPE_STRING }; - guint32 widthG_N_ELEMENTS(types); + guint32 widthN_ITEMS(types); guint n; - STATIC_ASSERT(STATS_RECV_COLUMNS == G_N_ELEMENTS(types)); - STATIC_ASSERT(STATS_RECV_COLUMNS == G_N_ELEMENTS(width)); - model = GTK_TREE_MODEL(gtk_list_store_newv(G_N_ELEMENTS(types), types)); + STATIC_ASSERT(STATS_RECV_COLUMNS == N_ITEMS(types)); + STATIC_ASSERT(STATS_RECV_COLUMNS == N_ITEMS(width)); + model = GTK_TREE_MODEL(gtk_list_store_newv(N_ITEMS(types), types)); treeview = treeview_gnet_stats_recv = GTK_TREE_VIEW( gui_main_window_lookup("treeview_gnet_stats_recv")); gui_prop_get_guint32(PROP_GNET_STATS_RECV_COL_WIDTHS, - width, 0, G_N_ELEMENTS(width)); + width, 0, N_ITEMS(width)); - for (n = 0; n < G_N_ELEMENTS(width); n++) { + for (n = 0; n < N_ITEMS(width); n++) { gchar buf16; - gm_snprintf(buf, sizeof(buf), "%d%c", n - 1, + str_bprintf(buf, sizeof(buf), "%d%c", n - 1, n + 1 < STATS_RECV_COLUMNS ? '\0' : '+'); add_column(treeview, n, widthn, (gfloat) (n != 0), n == 0 ? _("Type") : buf); @@ -658,7 +648,7 @@ gnet_stats_gui_recv_init(); guc_hsep_add_global_table_listener( - (GCallback) gnet_stats_gui_horizon_update, FREQ_UPDATES, 0); + (callback_fn_t) gnet_stats_gui_horizon_update, FREQ_UPDATES, 0); main_gui_add_timer(gnet_stats_gui_timer); } @@ -686,9 +676,9 @@ size_t i; guc_hsep_remove_global_table_listener( - (GCallback) gnet_stats_gui_horizon_update); + (callback_fn_t) gnet_stats_gui_horizon_update); - for (i = 0; i < G_N_ELEMENTS(widths); i++) { + for (i = 0; i < N_ITEMS(widths); i++) { tree_view_save_widths(*widthsi.tv, widthsi.prop); } }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/gtk-gnutella.glade -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/gtk-gnutella.glade
Changed
@@ -163,7 +163,7 @@ <property name="use_underline">True</property> <child internal-child="image"> - <widget class="GtkImage" id="image2224"> + <widget class="GtkImage" id="image2257"> <property name="visible">True</property> <property name="stock">gtk-save</property> <property name="icon_size">1</property> @@ -177,33 +177,13 @@ </child> <child> - <widget class="GtkImageMenuItem" id="popup_search_metadata"> - <property name="visible">True</property> - <property name="label" translatable="yes">Bitzi metadata</property> - <property name="use_underline">True</property> - - <child internal-child="image"> - <widget class="GtkImage" id="image2225"> - <property name="visible">True</property> - <property name="stock">gtk-dialog-info</property> - <property name="icon_size">1</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - </child> - </widget> - </child> - - <child> <widget class="GtkImageMenuItem" id="popup_search_browse_host"> <property name="visible">True</property> <property name="label" translatable="yes">Browse host</property> <property name="use_underline">True</property> <child internal-child="image"> - <widget class="GtkImage" id="image2226"> + <widget class="GtkImage" id="image2258"> <property name="visible">True</property> <property name="stock">gtk-zoom-in</property> <property name="icon_size">1</property> @@ -223,7 +203,7 @@ <property name="use_underline">True</property> <child internal-child="image"> - <widget class="GtkImage" id="image2227"> + <widget class="GtkImage" id="image2259"> <property name="visible">True</property> <property name="pixbuf">magnet.16x16.png</property> <property name="xalign">0.5</property> @@ -248,7 +228,7 @@ <property name="use_underline">True</property> <child internal-child="image"> - <widget class="GtkImage" id="image2228"> + <widget class="GtkImage" id="image2260"> <property name="visible">True</property> <property name="stock">gtk-stop</property> <property name="icon_size">1</property> @@ -268,7 +248,7 @@ <property name="use_underline">True</property> <child internal-child="image"> - <widget class="GtkImage" id="image2229"> + <widget class="GtkImage" id="image2261"> <property name="visible">True</property> <property name="stock">gtk-media-forward</property> <property name="icon_size">1</property> @@ -288,7 +268,7 @@ <property name="use_underline">True</property> <child internal-child="image"> - <widget class="GtkImage" id="image2230"> + <widget class="GtkImage" id="image2262"> <property name="visible">True</property> <property name="stock">gtk-redo</property> <property name="icon_size">1</property> @@ -314,7 +294,7 @@ <property name="use_underline">True</property> <child internal-child="image"> - <widget class="GtkImage" id="image2231"> + <widget class="GtkImage" id="image2263"> <property name="visible">True</property> <property name="stock">gtk-add</property> <property name="icon_size">1</property> @@ -334,7 +314,7 @@ <property name="use_underline">True</property> <child internal-child="image"> - <widget class="GtkImage" id="image2232"> + <widget class="GtkImage" id="image2264"> <property name="visible">True</property> <property name="stock">gtk-remove</property> <property name="icon_size">1</property> @@ -360,7 +340,7 @@ <property name="use_underline">True</property> <child internal-child="image"> - <widget class="GtkImage" id="image2233"> + <widget class="GtkImage" id="image2265"> <property name="visible">True</property> <property name="stock">gtk-properties</property> <property name="icon_size">1</property> @@ -381,7 +361,7 @@ <property name="use_underline">True</property> <child internal-child="image"> - <widget class="GtkImage" id="image2234"> + <widget class="GtkImage" id="image2266"> <property name="visible">True</property> <property name="stock">gtk-index</property> <property name="icon_size">1</property> @@ -401,7 +381,7 @@ <property name="use_underline">True</property> <child internal-child="image"> - <widget class="GtkImage" id="image2235"> + <widget class="GtkImage" id="image2267"> <property name="visible">True</property> <property name="stock">gtk-preferences</property> <property name="icon_size">1</property> @@ -421,7 +401,7 @@ <property name="use_underline">True</property> <child internal-child="image"> - <widget class="GtkImage" id="image2236"> + <widget class="GtkImage" id="image2268"> <property name="visible">True</property> <property name="stock">gtk-media-record</property> <property name="icon_size">1</property> @@ -540,7 +520,7 @@ <property name="default_height">300</property> <property name="resizable">True</property> <property name="destroy_with_parent">False</property> - <property name="icon">icon.xpm</property> + <property name="icon">icon.48x48.xpm</property> <property name="decorated">True</property> <property name="skip_taskbar_hint">False</property> <property name="skip_pager_hint">False</property> @@ -1246,7 +1226,7 @@ <property name="modal">False</property> <property name="resizable">True</property> <property name="destroy_with_parent">False</property> - <property name="icon">icon.xpm</property> + <property name="icon">icon.48x48.xpm</property> <property name="decorated">True</property> <property name="skip_taskbar_hint">False</property> <property name="skip_pager_hint">False</property> @@ -1383,7 +1363,7 @@ <property name="modal">False</property> <property name="resizable">True</property> <property name="destroy_with_parent">False</property> - <property name="icon">icon.xpm</property> + <property name="icon">icon.48x48.xpm</property> <property name="decorated">True</property> <property name="skip_taskbar_hint">False</property> <property name="skip_pager_hint">False</property> @@ -1416,7 +1396,7 @@ <child> <widget class="GtkImage" id="image222"> <property name="visible">True</property> - <property name="pixbuf">icon.xpm</property> + <property name="pixbuf">icon.48x48.xpm</property> <property name="xalign">0.5</property> <property name="yalign">0.5</property> <property name="xpad">4</property> @@ -1988,6 +1968,32 @@ </child> <child> + <widget class="GtkLabel" id="label538"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label">Translations are on https://www.transifex.com/projects/p/gtk-gnutella/</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_CENTER</property> + <property name="wrap">False</property> + <property name="selectable">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> <widget class="GtkLabel" id="label490"> <property name="visible">True</property> <property name="label" translatable="yes">Join the users or developers mailing lists.</property> @@ -2108,31 +2114,6 @@ <property name="fill">True</property> </packing> </child> - - <child> - <widget class="GtkLabel" id="label538"> - <property name="sensitive">False</property> - <property name="label">@(#) $Id$</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> </widget> </child> </widget> @@ -2144,7 +2125,7 @@ <property name="modal">False</property> <property name="resizable">True</property> <property name="destroy_with_parent">False</property> - <property name="icon">icon.xpm</property> + <property name="icon">icon.48x48.xpm</property> <property name="decorated">True</property> <property name="skip_taskbar_hint">False</property> <property name="skip_pager_hint">False</property> @@ -2184,7 +2165,7 @@ <accelerator key="p" modifiers="GDK_CONTROL_MASK" signal="activate"/> <child internal-child="image"> - <widget class="GtkImage" id="image2240"> + <widget class="GtkImage" id="image2291"> <property name="visible">True</property> <property name="stock">gtk-preferences</property> <property name="icon_size">1</property> @@ -2212,7 +2193,7 @@ <accelerator key="q" modifiers="GDK_CONTROL_MASK" signal="activate"/> <child internal-child="image"> - <widget class="GtkImage" id="image2241"> + <widget class="GtkImage" id="image2292"> <property name="visible">True</property> <property name="stock">gtk-quit</property> <property name="icon_size">1</property> @@ -2504,7 +2485,7 @@ <signal name="activate" handler="on_menu_faq_activate" last_modification_time="Wed, 02 Nov 2005 05:11:24 GMT"/> <child internal-child="image"> - <widget class="GtkImage" id="image2242"> + <widget class="GtkImage" id="image2293"> <property name="visible">True</property> <property name="stock">gtk-info</property> <property name="icon_size">1</property> @@ -2518,6 +2499,16 @@ </child> <child> + <widget class="GtkMenuItem" id="menu_glossary"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Glossary</property> + <property name="label" translatable="yes">Glossary</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_menu_glossary_activate" last_modification_time="Sat, 13 Feb 2016 16:19:58 GMT"/> + </widget> + </child> + + <child> <widget class="GtkImageMenuItem" id="menu_about"> <property name="visible">True</property> <property name="label" translatable="yes">_About</property> @@ -2525,7 +2516,7 @@ <signal name="activate" handler="on_menu_about_activate"/> <child internal-child="image"> - <widget class="GtkImage" id="image2243"> + <widget class="GtkImage" id="image2294"> <property name="visible">True</property> <property name="stock">gtk-about</property> <property name="icon_size">1</property> @@ -3945,14 +3936,14 @@ </child> <child> - <widget class="GtkEventBox" id="eventbox_port_mapping_successful"> + <widget class="GtkEventBox" id="eventbox_upnp_port_mapping_successful"> <property name="visible">True</property> - <property name="tooltip" translatable="yes">Port mapping configured through UPnP or NAT-PMP.</property> + <property name="tooltip" translatable="yes">Port mapping configured through UPnP.</property> <property name="visible_window">True</property> <property name="above_child">False</property> <child> - <widget class="GtkImage" id="image_port_mapping_successful"> + <widget class="GtkImage" id="image_upnp_successful"> <property name="visible">True</property> <property name="pixbuf">upnp.xpm</property> <property name="xalign">0.5</property> @@ -3968,6 +3959,31 @@ <property name="fill">True</property> </packing> </child> + + <child> + <widget class="GtkEventBox" id="eventbox_natpmp_port_mapping_successful"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Port mapping configured through NAT-PMP.</property> + <property name="visible_window">True</property> + <property name="above_child">False</property> + + <child> + <widget class="GtkImage" id="image_natpmp_successful"> + <property name="visible">True</property> + <property name="pixbuf">natpmp.xpm</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> </widget> <packing> <property name="padding">0</property> @@ -4058,6 +4074,55 @@ </child> <child> + <widget class="GtkEventBox" id="eventbox_net_buffer_shortage"> + <property name="visible">True</property> + <property name="visible_window">True</property> + <property name="above_child">False</property> + + <child> + <widget class="GtkImage" id="image_net_buffer_shortage"> + <property name="visible">True</property> + <property name="pixbuf">hungup.xpm</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">1</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkEventBox" id="eventbox_tcp_no_listening"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Download queue is frozen.</property> + <property name="visible_window">True</property> + <property name="above_child">False</property> + + <child> + <widget class="GtkImage" id="image_tcp_no_listening"> + <property name="visible">True</property> + <property name="pixbuf">no_listening.xpm</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">1</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> <widget class="GtkEventBox" id="eventbox_image_warning"> <property name="visible">True</property> <property name="tooltip" translatable="yes">Your uploads are stalling at an abnormal rate, indicating that your bandwidth is probably saturated. You should not run as an ultra node, and try to reduce the allocated bandwidth to gtk-gnutella to avoid saturating both your incoming and outgoing paths.</property> @@ -4902,7 +4967,7 @@ <property name="modal">False</property> <property name="resizable">False</property> <property name="destroy_with_parent">False</property> - <property name="icon">icon.xpm</property> + <property name="icon">icon.48x48.xpm</property> <property name="decorated">True</property> <property name="skip_taskbar_hint">False</property> <property name="skip_pager_hint">False</property> @@ -5086,7 +5151,7 @@ <property name="border_width">2</property> <property name="visible">True</property> <property name="n_rows">1</property> - <property name="n_columns">4</property> + <property name="n_columns">5</property> <property name="homogeneous">False</property> <property name="row_spacing">2</property> <property name="column_spacing">4</property> @@ -5176,90 +5241,6 @@ </child> <child> - <widget class="GtkHBox" id="hbox_leaf"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child> - <widget class="GtkLabel" id="label519"> - <property name="visible">True</property> - <property name="label" translatable="yes">Connect to</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">5</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkSpinButton" id="spinbutton_max_ultrapeers"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="climb_rate">1</property> - <property name="digits">0</property> - <property name="numeric">False</property> - <property name="update_policy">GTK_UPDATE_ALWAYS</property> - <property name="snap_to_ticks">False</property> - <property name="wrap">False</property> - <property name="adjustment">0 0 100 1 10 0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label520"> - <property name="visible">True</property> - <property name="label" translatable="yes">ultrapeers</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">5</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> <widget class="GtkEntry" id="entry_host"> <property name="visible">True</property> <property name="can_focus">True</property> @@ -5365,6 +5346,149 @@ <property name="y_options"></property> </packing> </child> + + <child> + <widget class="GtkHBox" id="hbox_leaf"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkLabel" id="label519"> + <property name="visible">True</property> + <property name="label" translatable="yes">Connect to</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">5</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkSpinButton" id="spinbutton_max_ultrapeers"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="climb_rate">1</property> + <property name="digits">0</property> + <property name="numeric">False</property> + <property name="update_policy">GTK_UPDATE_ALWAYS</property> + <property name="snap_to_ticks">False</property> + <property name="wrap">False</property> + <property name="adjustment">0 0 100 1 10 0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label520"> + <property name="visible">True</property> + <property name="label" translatable="yes">ultrapeers</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">5</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="y_options">fill</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox9354"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkLabel" id="label1079"> + <property name="visible">True</property> + <property name="label" translatable="yes">G2 hubs</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkSpinButton" id="spinbutton_max_g2_hubs"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="climb_rate">1</property> + <property name="digits">0</property> + <property name="numeric">False</property> + <property name="update_policy">GTK_UPDATE_ALWAYS</property> + <property name="snap_to_ticks">False</property> + <property name="wrap">False</property> + <property name="adjustment">1 0 100 1 10 0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="left_attach">4</property> + <property name="right_attach">5</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="y_options">fill</property> + </packing> + </child> </widget> <packing> <property name="padding">0</property> @@ -6489,6 +6613,106 @@ </child> <child> + <widget class="GtkLabel" id="label_g2_browse_served"> + <property name="visible">True</property> + <property name="label" translatable="yes">G2 served</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label1081"> + <property name="visible">True</property> + <property name="label" translatable="yes"> / </property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label_g2_browse_count"> + <property name="visible">True</property> + <property name="label" translatable="yes">G2</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label1083"> + <property name="visible">True</property> + <property name="label" translatable="yes"> G2, </property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> <widget class="GtkLabel" id="label_html_browse_served"> <property name="visible">True</property> <property name="label" translatable="yes">BH HTML served</property> @@ -7116,64 +7340,6 @@ </child> <child> - <widget class="GtkScrolledWindow" id="scrolledwindow900"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property> - <property name="window_placement">GTK_CORNER_TOP_LEFT</property> - - <child> - <widget class="GtkTextView" id="textview_result_info_bitzi"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">False</property> - <property name="overwrite">False</property> - <property name="accepts_tab">True</property> - <property name="justification">GTK_JUSTIFY_LEFT</property> - <property name="wrap_mode">GTK_WRAP_NONE</property> - <property name="cursor_visible">False</property> - <property name="pixels_above_lines">0</property> - <property name="pixels_below_lines">0</property> - <property name="pixels_inside_wrap">0</property> - <property name="left_margin">0</property> - <property name="right_margin">0</property> - <property name="indent">0</property> - <property name="text" translatable="yes"></property> - </widget> - </child> - </widget> - <packing> - <property name="tab_expand">False</property> - <property name="tab_fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label1029"> - <property name="visible">True</property> - <property name="label" translatable="yes">Bitzi Metadata</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="type">tab</property> - </packing> - </child> - - <child> <widget class="GtkTable" id="table78"> <property name="border_width">2</property> <property name="visible">True</property> @@ -7233,7 +7399,7 @@ <property name="update_policy">GTK_UPDATE_ALWAYS</property> <property name="snap_to_ticks">False</property> <property name="wrap">False</property> - <property name="adjustment">1000 1 50000 1 10 10</property> + <property name="adjustment">1000 1 50000 1 10 0</property> </widget> </child> </widget> @@ -7457,7 +7623,7 @@ <property name="update_policy">GTK_UPDATE_ALWAYS</property> <property name="snap_to_ticks">False</property> <property name="wrap">False</property> - <property name="adjustment">1000 1 50000 1 10 10</property> + <property name="adjustment">1000 1 50000 1 10 0</property> </widget> </child> </widget> @@ -7666,6 +7832,28 @@ <property name="y_options"></property> </packing> </child> + + <child> + <widget class="GtkCheckButton" id="checkbutton_search_display_guess_stats"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Display GUESS statistics</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> </widget> <packing> <property name="tab_expand">False</property> @@ -7712,6 +7900,70 @@ </child> <child> + <widget class="GtkHBox" id="guess_stats_line"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkViewport" id="viewport482"> + <property name="visible">True</property> + <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property> + + <child> + <widget class="GtkLabel" id="label_guess_stats"> + <property name="visible">True</property> + <property name="label"> </property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_CENTER</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">7.45058015283e-09</property> + <property name="yalign">0.5</property> + <property name="xpad">5</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkCheckButton" id="checkbutton_guess_stats_show_total"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Total</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> <widget class="GtkHBox" id="hbox215"> <property name="visible">True</property> <property name="homogeneous">False</property> @@ -16714,6 +16966,108 @@ <property name="fill">True</property> </packing> </child> + + <child> + <widget class="GtkVBox" id="vbox161"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">2</property> + + <child> + <widget class="GtkProgressBar" id="progressbar_hosts_in_g2hub_catcher"> + <property name="visible">True</property> + <property name="orientation">GTK_PROGRESS_LEFT_TO_RIGHT</property> + <property name="fraction">0</property> + <property name="pulse_step">0.10000000149</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox9353"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">4</property> + + <child> + <widget class="GtkLabel" id="label1078"> + <property name="visible">True</property> + <property name="label" translatable="yes">G2 hubs</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_CENTER</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">5</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkSpinButton" id="spinbutton_max_g2hub_hosts_cached"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="climb_rate">1</property> + <property name="digits">0</property> + <property name="numeric">True</property> + <property name="update_policy">GTK_UPDATE_ALWAYS</property> + <property name="snap_to_ticks">False</property> + <property name="wrap">False</property> + <property name="adjustment">1 0 100 1 10 0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="button_g2hub_catcher_clear"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Clear</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_button_hostcache_clear_bad_clicked" last_modification_time="Mon, 07 Jun 2004 20:14:52 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> </widget> </child> @@ -17589,7 +17943,7 @@ <widget class="GtkTable" id="table118"> <property name="border_width">2</property> <property name="visible">True</property> - <property name="n_rows">1</property> + <property name="n_rows">2</property> <property name="n_columns">2</property> <property name="homogeneous">False</property> <property name="row_spacing">2</property> @@ -17638,6 +17992,56 @@ <property name="y_options"></property> </packing> </child> + + <child> + <widget class="GtkLabel" id="label1077"> + <property name="visible">True</property> + <property name="label" translatable="yes">Mapping lease time</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkSpinButton" id="spinbutton_config_upnp_mapping_lease_time"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="climb_rate">1</property> + <property name="digits">0</property> + <property name="numeric">False</property> + <property name="update_policy">GTK_UPDATE_ALWAYS</property> + <property name="snap_to_ticks">False</property> + <property name="wrap">False</property> + <property name="adjustment">1 0 100 1 10 0</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options"></property> + <property name="y_options"></property> + </packing> + </child> </widget> </child> @@ -20117,7 +20521,7 @@ <child> <widget class="GtkTable" id="table17"> <property name="visible">True</property> - <property name="n_rows">4</property> + <property name="n_rows">5</property> <property name="n_columns">3</property> <property name="homogeneous">False</property> <property name="row_spacing">2</property> @@ -20325,6 +20729,28 @@ <property name="y_options"></property> </packing> </child> + + <child> + <widget class="GtkCheckButton" id="checkbutton_enable_g2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Enable the G2 network</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> </widget> <packing> <property name="padding">0</property> @@ -21935,7 +22361,7 @@ <property name="update_policy">GTK_UPDATE_ALWAYS</property> <property name="snap_to_ticks">False</property> <property name="wrap">False</property> - <property name="adjustment">1 0 100 1 10 10</property> + <property name="adjustment">1 0 100 1 10 0</property> </widget> <packing> <property name="left_attach">5</property> @@ -23936,7 +24362,7 @@ <widget class="GtkCheckButton" id="checkbutton_config_bws_dht_out"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="label" translatable="yes">Global DHT ougoing traffic</property> + <property name="label" translatable="yes">Global DHT outgoing traffic</property> <property name="use_underline">True</property> <property name="relief">GTK_RELIEF_NORMAL</property> <property name="focus_on_click">True</property> @@ -24633,7 +25059,7 @@ <widget class="GtkTable" id="table119"> <property name="border_width">2</property> <property name="visible">True</property> - <property name="n_rows">1</property> + <property name="n_rows">2</property> <property name="n_columns">3</property> <property name="homogeneous">False</property> <property name="row_spacing">2</property> @@ -24716,6 +25142,28 @@ <property name="y_options"></property> </packing> </child> + + <child> + <widget class="GtkCheckButton" id="checkbutton_guess_maximize_bw"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Allow unused Gnutella outgoing bandwidth to supersede hint</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">3</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> </widget> <packing> <property name="padding">0</property> @@ -26662,7 +27110,7 @@ <property name="update_policy">GTK_UPDATE_ALWAYS</property> <property name="snap_to_ticks">False</property> <property name="wrap">False</property> - <property name="adjustment">1 0 100 1 10 10</property> + <property name="adjustment">1 0 100 1 10 0</property> </widget> <packing> <property name="left_attach">1</property> @@ -26852,6 +27300,7 @@ <child> <widget class="GtkScrolledWindow" id="scrolledwindow79"> + <property name="height_request">100</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> @@ -33215,7 +33664,7 @@ <property name="default_height">400</property> <property name="resizable">True</property> <property name="destroy_with_parent">False</property> - <property name="icon">icon.xpm</property> + <property name="icon">icon.48x48.xpm</property> <property name="decorated">True</property> <property name="skip_taskbar_hint">False</property> <property name="skip_pager_hint">False</property> @@ -33268,7 +33717,7 @@ <property name="default_height">240</property> <property name="resizable">True</property> <property name="destroy_with_parent">False</property> - <property name="icon">icon.xpm</property> + <property name="icon">icon.48x48.xpm</property> <property name="decorated">True</property> <property name="skip_taskbar_hint">False</property> <property name="skip_pager_hint">False</property> @@ -33321,7 +33770,7 @@ <signal name="activate" handler="on_popup_sources_start_now_activate" last_modification_time="Sat, 28 Jul 2007 05:13:51 GMT"/> <child internal-child="image"> - <widget class="GtkImage" id="image2115"> + <widget class="GtkImage" id="image2278"> <property name="visible">True</property> <property name="stock">gtk-connect</property> <property name="icon_size">1</property> @@ -33342,7 +33791,7 @@ <signal name="activate" handler="on_popup_sources_pause_activate" last_modification_time="Sat, 28 Jul 2007 05:13:51 GMT"/> <child internal-child="image"> - <widget class="GtkImage" id="image2116"> + <widget class="GtkImage" id="image2279"> <property name="visible">True</property> <property name="stock">gtk-media-pause</property> <property name="icon_size">1</property> @@ -33363,7 +33812,7 @@ <signal name="activate" handler="on_popup_sources_resume_activate" last_modification_time="Sat, 28 Jul 2007 05:13:51 GMT"/> <child internal-child="image"> - <widget class="GtkImage" id="image2117"> + <widget class="GtkImage" id="image2280"> <property name="visible">True</property> <property name="stock">gtk-redo</property> <property name="icon_size">1</property> @@ -33384,7 +33833,7 @@ <signal name="activate" handler="on_popup_sources_queue_activate" last_modification_time="Sat, 28 Jul 2007 05:13:51 GMT"/> <child internal-child="image"> - <widget class="GtkImage" id="image2118"> + <widget class="GtkImage" id="image2281"> <property name="visible">True</property> <property name="stock">gtk-disconnect</property> <property name="icon_size">1</property> @@ -33405,7 +33854,7 @@ <signal name="activate" handler="on_popup_sources_forget_activate" last_modification_time="Sat, 28 Jul 2007 05:13:51 GMT"/> <child internal-child="image"> - <widget class="GtkImage" id="image2119"> + <widget class="GtkImage" id="image2282"> <property name="visible">True</property> <property name="stock">gtk-stop</property> <property name="icon_size">1</property> @@ -33432,7 +33881,7 @@ <signal name="activate" handler="on_popup_sources_copy_url_activate" last_modification_time="Sat, 28 Jul 2007 02:48:25 GMT"/> <child internal-child="image"> - <widget class="GtkImage" id="image2120"> + <widget class="GtkImage" id="image2283"> <property name="visible">True</property> <property name="stock">gtk-copy</property> <property name="icon_size">1</property> @@ -33453,7 +33902,7 @@ <signal name="activate" handler="on_popup_sources_browse_host_activate" last_modification_time="Sat, 28 Jul 2007 17:10:51 GMT"/> <child internal-child="image"> - <widget class="GtkImage" id="image2121"> + <widget class="GtkImage" id="image2284"> <property name="visible">True</property> <property name="stock">gtk-index</property> <property name="icon_size">1</property> @@ -33474,7 +33923,7 @@ <signal name="activate" handler="on_popup_sources_connect_activate" last_modification_time="Sat, 28 Jul 2007 03:01:55 GMT"/> <child internal-child="image"> - <widget class="GtkImage" id="image2122"> + <widget class="GtkImage" id="image2285"> <property name="visible">True</property> <property name="stock">gtk-network</property> <property name="icon_size">1</property> @@ -33488,11 +33937,22 @@ </child> <child> - <widget class="GtkMenuItem" id="popup_sources_push"> + <widget class="GtkImageMenuItem" id="popup_sources_push"> <property name="visible">True</property> <property name="label" translatable="yes">Force push mode</property> <property name="use_underline">True</property> <signal name="activate" handler="on_popup_sources_push_activate" last_modification_time="Sat, 28 Jul 2007 06:17:17 GMT"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2286"> + <property name="visible">True</property> + <property name="pixbuf">go_back.xpm</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> </widget> </child> @@ -33510,7 +33970,7 @@ <signal name="activate" handler="on_popup_sources_config_cols_activate" last_modification_time="Sat, 28 Jul 2007 03:09:10 GMT"/> <child internal-child="image"> - <widget class="GtkImage" id="image2123"> + <widget class="GtkImage" id="image2287"> <property name="visible">True</property> <property name="stock">gtk-preferences</property> <property name="icon_size">1</property> @@ -33544,5 +34004,58 @@ </widget> </child> </widget> + +<widget class="GtkWindow" id="dlg_glossary"> + <property name="visible">True</property> + <property name="title" translatable="yes"></property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_MOUSE</property> + <property name="modal">False</property> + <property name="default_width">600</property> + <property name="default_height">400</property> + <property name="resizable">True</property> + <property name="destroy_with_parent">False</property> + <property name="icon">icon.48x48.xpm</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="focus_on_map">True</property> + <property name="urgency_hint">False</property> + <signal name="delete_event" handler="on_dlg_glossary_delete_event" last_modification_time="Sat, 13 Feb 2016 16:07:04 GMT"/> + + <child> + <widget class="GtkScrolledWindow" id="scrolledwindow902"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property> + <property name="shadow_type">GTK_SHADOW_NONE</property> + <property name="window_placement">GTK_CORNER_TOP_LEFT</property> + + <child> + <widget class="GtkTextView" id="textview_glossary"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="has_focus">True</property> + <property name="editable">False</property> + <property name="overwrite">False</property> + <property name="accepts_tab">True</property> + <property name="justification">GTK_JUSTIFY_LEFT</property> + <property name="wrap_mode">GTK_WRAP_WORD</property> + <property name="cursor_visible">True</property> + <property name="pixels_above_lines">0</property> + <property name="pixels_below_lines">0</property> + <property name="pixels_inside_wrap">0</property> + <property name="left_margin">4</property> + <property name="right_margin">4</property> + <property name="indent">0</property> + <property name="text" translatable="yes"></property> + </widget> + </child> + </widget> + </child> +</widget> </glade-interface>
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/gtk-gnutella.gladep -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/gtk-gnutella.gladep
Changed
@@ -9,6 +9,7 @@ <gnome_support>FALSE</gnome_support> <use_widget_names>TRUE</use_widget_names> <output_main_file>FALSE</output_main_file> + <output_support_files>FALSE</output_support_files> <output_build_files>FALSE</output_build_files> <main_source_file>interface-glade.c</main_source_file> <main_header_file>interface-glade.h</main_header_file>
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/hcache.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/hcache.c
Changed
@@ -61,17 +61,17 @@ g_object_set(renderer, "xalign", xalign, "ypad", GUI_CELL_RENDERER_YPAD, - (void *) 0); + NULL_PTR); column = gtk_tree_view_column_new_with_attributes(label, renderer, "text", column_id, - (void *) 0); + NULL_PTR); g_object_set(column, "fixed-width", 100, "min-width", 1, "reorderable", TRUE, "resizable", TRUE, "sizing", GTK_TREE_VIEW_COLUMN_FIXED, - (void *) 0); + NULL_PTR); gtk_tree_view_append_column(treeview, column); } @@ -85,7 +85,7 @@ GtkTreeModel *model; gint n; - STATIC_ASSERT(G_N_ELEMENTS(hcache_col_labels) == + STATIC_ASSERT(N_ITEMS(hcache_col_labels) == HCACHE_STATS_VISIBLE_COLUMNS); treeview_hcache = GTK_TREE_VIEW(gui_main_window_lookup("treeview_hcache")); @@ -108,7 +108,7 @@ (-1)); } - for (n = 0; (guint) n < G_N_ELEMENTS(hcache_col_labels); n++) { + for (n = 0; (guint) n < N_ITEMS(hcache_col_labels); n++) { add_column(treeview_hcache, n, (gfloat) (n != 0), _(hcache_col_labelsn.text)); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/interface-glade.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/interface-glade.c
Changed
@@ -174,35 +174,33 @@ { GtkWidget *popup_search; GtkWidget *popup_search_download; - GtkWidget *image2224; - GtkWidget *popup_search_metadata; - GtkWidget *image2225; + GtkWidget *image2257; GtkWidget *popup_search_browse_host; - GtkWidget *image2226; + GtkWidget *image2258; GtkWidget *popup_search_copy_magnet; - GtkWidget *image2227; + GtkWidget *image2259; GtkWidget *separator14; GtkWidget *popup_search_stop; - GtkWidget *image2228; + GtkWidget *image2260; GtkWidget *popup_search_resume; - GtkWidget *image2229; + GtkWidget *image2261; GtkWidget *popup_search_restart; - GtkWidget *image2230; + GtkWidget *image2262; GtkWidget *separator15; GtkWidget *popup_search_expand_all; - GtkWidget *image2231; + GtkWidget *image2263; GtkWidget *popup_search_collapse_all; - GtkWidget *image2232; + GtkWidget *image2264; GtkWidget *separator2; GtkWidget *item3; - GtkWidget *image2233; + GtkWidget *image2265; GtkWidget *item3_menu; GtkWidget *popup_search_toggle_tabs; - GtkWidget *image2234; + GtkWidget *image2266; GtkWidget *popup_search_config_cols; - GtkWidget *image2235; + GtkWidget *image2267; GtkWidget *popup_search_sort_defaults; - GtkWidget *image2236; + GtkWidget *image2268; popup_search = gtk_menu_new (); gtk_widget_set_name (popup_search, "popup_search"); @@ -212,40 +210,30 @@ gtk_widget_show (popup_search_download); gtk_container_add (GTK_CONTAINER (popup_search), popup_search_download); - image2224 = gtk_image_new_from_stock ("gtk-save", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2224, "image2224"); - gtk_widget_show (image2224); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_download), image2224); - - popup_search_metadata = gtk_image_menu_item_new_with_mnemonic (_("Bitzi metadata")); - gtk_widget_set_name (popup_search_metadata, "popup_search_metadata"); - gtk_widget_show (popup_search_metadata); - gtk_container_add (GTK_CONTAINER (popup_search), popup_search_metadata); - - image2225 = gtk_image_new_from_stock ("gtk-dialog-info", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2225, "image2225"); - gtk_widget_show (image2225); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_metadata), image2225); + image2257 = gtk_image_new_from_stock ("gtk-save", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2257, "image2257"); + gtk_widget_show (image2257); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_download), image2257); popup_search_browse_host = gtk_image_menu_item_new_with_mnemonic (_("Browse host")); gtk_widget_set_name (popup_search_browse_host, "popup_search_browse_host"); gtk_widget_show (popup_search_browse_host); gtk_container_add (GTK_CONTAINER (popup_search), popup_search_browse_host); - image2226 = gtk_image_new_from_stock ("gtk-zoom-in", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2226, "image2226"); - gtk_widget_show (image2226); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_browse_host), image2226); + image2258 = gtk_image_new_from_stock ("gtk-zoom-in", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2258, "image2258"); + gtk_widget_show (image2258); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_browse_host), image2258); popup_search_copy_magnet = gtk_image_menu_item_new_with_mnemonic (_("Copy magnet to clipboard")); gtk_widget_set_name (popup_search_copy_magnet, "popup_search_copy_magnet"); gtk_widget_show (popup_search_copy_magnet); gtk_container_add (GTK_CONTAINER (popup_search), popup_search_copy_magnet); - image2227 = create_pixmap (popup_search, "magnet.16x16.png"); - gtk_widget_set_name (image2227, "image2227"); - gtk_widget_show (image2227); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_copy_magnet), image2227); + image2259 = create_pixmap (popup_search, "magnet.16x16.png"); + gtk_widget_set_name (image2259, "image2259"); + gtk_widget_show (image2259); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_copy_magnet), image2259); separator14 = gtk_separator_menu_item_new (); gtk_widget_set_name (separator14, "separator14"); @@ -258,30 +246,30 @@ gtk_widget_show (popup_search_stop); gtk_container_add (GTK_CONTAINER (popup_search), popup_search_stop); - image2228 = gtk_image_new_from_stock ("gtk-stop", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2228, "image2228"); - gtk_widget_show (image2228); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_stop), image2228); + image2260 = gtk_image_new_from_stock ("gtk-stop", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2260, "image2260"); + gtk_widget_show (image2260); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_stop), image2260); popup_search_resume = gtk_image_menu_item_new_with_mnemonic (_("Resume")); gtk_widget_set_name (popup_search_resume, "popup_search_resume"); gtk_widget_show (popup_search_resume); gtk_container_add (GTK_CONTAINER (popup_search), popup_search_resume); - image2229 = gtk_image_new_from_stock ("gtk-media-forward", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2229, "image2229"); - gtk_widget_show (image2229); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_resume), image2229); + image2261 = gtk_image_new_from_stock ("gtk-media-forward", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2261, "image2261"); + gtk_widget_show (image2261); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_resume), image2261); popup_search_restart = gtk_image_menu_item_new_with_mnemonic (_("Restart")); gtk_widget_set_name (popup_search_restart, "popup_search_restart"); gtk_widget_show (popup_search_restart); gtk_container_add (GTK_CONTAINER (popup_search), popup_search_restart); - image2230 = gtk_image_new_from_stock ("gtk-redo", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2230, "image2230"); - gtk_widget_show (image2230); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_restart), image2230); + image2262 = gtk_image_new_from_stock ("gtk-redo", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2262, "image2262"); + gtk_widget_show (image2262); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_restart), image2262); separator15 = gtk_separator_menu_item_new (); gtk_widget_set_name (separator15, "separator15"); @@ -294,20 +282,20 @@ gtk_widget_show (popup_search_expand_all); gtk_container_add (GTK_CONTAINER (popup_search), popup_search_expand_all); - image2231 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2231, "image2231"); - gtk_widget_show (image2231); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_expand_all), image2231); + image2263 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2263, "image2263"); + gtk_widget_show (image2263); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_expand_all), image2263); popup_search_collapse_all = gtk_image_menu_item_new_with_mnemonic (_("Collapse all")); gtk_widget_set_name (popup_search_collapse_all, "popup_search_collapse_all"); gtk_widget_show (popup_search_collapse_all); gtk_container_add (GTK_CONTAINER (popup_search), popup_search_collapse_all); - image2232 = gtk_image_new_from_stock ("gtk-remove", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2232, "image2232"); - gtk_widget_show (image2232); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_collapse_all), image2232); + image2264 = gtk_image_new_from_stock ("gtk-remove", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2264, "image2264"); + gtk_widget_show (image2264); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_collapse_all), image2264); separator2 = gtk_separator_menu_item_new (); gtk_widget_set_name (separator2, "separator2"); @@ -320,10 +308,10 @@ gtk_widget_show (item3); gtk_container_add (GTK_CONTAINER (popup_search), item3); - image2233 = gtk_image_new_from_stock ("gtk-properties", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2233, "image2233"); - gtk_widget_show (image2233); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item3), image2233); + image2265 = gtk_image_new_from_stock ("gtk-properties", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2265, "image2265"); + gtk_widget_show (image2265); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item3), image2265); item3_menu = gtk_menu_new (); gtk_widget_set_name (item3_menu, "item3_menu"); @@ -334,63 +322,61 @@ gtk_widget_show (popup_search_toggle_tabs); gtk_container_add (GTK_CONTAINER (item3_menu), popup_search_toggle_tabs); - image2234 = gtk_image_new_from_stock ("gtk-index", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2234, "image2234"); - gtk_widget_show (image2234); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_toggle_tabs), image2234); + image2266 = gtk_image_new_from_stock ("gtk-index", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2266, "image2266"); + gtk_widget_show (image2266); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_toggle_tabs), image2266); popup_search_config_cols = gtk_image_menu_item_new_with_mnemonic (_("Configure columns")); gtk_widget_set_name (popup_search_config_cols, "popup_search_config_cols"); gtk_widget_show (popup_search_config_cols); gtk_container_add (GTK_CONTAINER (item3_menu), popup_search_config_cols); - image2235 = gtk_image_new_from_stock ("gtk-preferences", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2235, "image2235"); - gtk_widget_show (image2235); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_config_cols), image2235); + image2267 = gtk_image_new_from_stock ("gtk-preferences", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2267, "image2267"); + gtk_widget_show (image2267); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_config_cols), image2267); popup_search_sort_defaults = gtk_image_menu_item_new_with_mnemonic (_("Make current sorting default")); gtk_widget_set_name (popup_search_sort_defaults, "popup_search_sort_defaults"); gtk_widget_show (popup_search_sort_defaults); gtk_container_add (GTK_CONTAINER (item3_menu), popup_search_sort_defaults); - image2236 = gtk_image_new_from_stock ("gtk-media-record", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2236, "image2236"); - gtk_widget_show (image2236); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_sort_defaults), image2236); + image2268 = gtk_image_new_from_stock ("gtk-media-record", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2268, "image2268"); + gtk_widget_show (image2268); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_search_sort_defaults), image2268); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (popup_search, popup_search, "popup_search"); GLADE_HOOKUP_OBJECT (popup_search, popup_search_download, "popup_search_download"); - GLADE_HOOKUP_OBJECT (popup_search, image2224, "image2224"); - GLADE_HOOKUP_OBJECT (popup_search, popup_search_metadata, "popup_search_metadata"); - GLADE_HOOKUP_OBJECT (popup_search, image2225, "image2225"); + GLADE_HOOKUP_OBJECT (popup_search, image2257, "image2257"); GLADE_HOOKUP_OBJECT (popup_search, popup_search_browse_host, "popup_search_browse_host"); - GLADE_HOOKUP_OBJECT (popup_search, image2226, "image2226"); + GLADE_HOOKUP_OBJECT (popup_search, image2258, "image2258"); GLADE_HOOKUP_OBJECT (popup_search, popup_search_copy_magnet, "popup_search_copy_magnet"); - GLADE_HOOKUP_OBJECT (popup_search, image2227, "image2227"); + GLADE_HOOKUP_OBJECT (popup_search, image2259, "image2259"); GLADE_HOOKUP_OBJECT (popup_search, separator14, "separator14"); GLADE_HOOKUP_OBJECT (popup_search, popup_search_stop, "popup_search_stop"); - GLADE_HOOKUP_OBJECT (popup_search, image2228, "image2228"); + GLADE_HOOKUP_OBJECT (popup_search, image2260, "image2260"); GLADE_HOOKUP_OBJECT (popup_search, popup_search_resume, "popup_search_resume"); - GLADE_HOOKUP_OBJECT (popup_search, image2229, "image2229"); + GLADE_HOOKUP_OBJECT (popup_search, image2261, "image2261"); GLADE_HOOKUP_OBJECT (popup_search, popup_search_restart, "popup_search_restart"); - GLADE_HOOKUP_OBJECT (popup_search, image2230, "image2230"); + GLADE_HOOKUP_OBJECT (popup_search, image2262, "image2262"); GLADE_HOOKUP_OBJECT (popup_search, separator15, "separator15"); GLADE_HOOKUP_OBJECT (popup_search, popup_search_expand_all, "popup_search_expand_all"); - GLADE_HOOKUP_OBJECT (popup_search, image2231, "image2231"); + GLADE_HOOKUP_OBJECT (popup_search, image2263, "image2263"); GLADE_HOOKUP_OBJECT (popup_search, popup_search_collapse_all, "popup_search_collapse_all"); - GLADE_HOOKUP_OBJECT (popup_search, image2232, "image2232"); + GLADE_HOOKUP_OBJECT (popup_search, image2264, "image2264"); GLADE_HOOKUP_OBJECT (popup_search, separator2, "separator2"); GLADE_HOOKUP_OBJECT (popup_search, item3, "item3"); - GLADE_HOOKUP_OBJECT (popup_search, image2233, "image2233"); + GLADE_HOOKUP_OBJECT (popup_search, image2265, "image2265"); GLADE_HOOKUP_OBJECT (popup_search, item3_menu, "item3_menu"); GLADE_HOOKUP_OBJECT (popup_search, popup_search_toggle_tabs, "popup_search_toggle_tabs"); - GLADE_HOOKUP_OBJECT (popup_search, image2234, "image2234"); + GLADE_HOOKUP_OBJECT (popup_search, image2266, "image2266"); GLADE_HOOKUP_OBJECT (popup_search, popup_search_config_cols, "popup_search_config_cols"); - GLADE_HOOKUP_OBJECT (popup_search, image2235, "image2235"); + GLADE_HOOKUP_OBJECT (popup_search, image2267, "image2267"); GLADE_HOOKUP_OBJECT (popup_search, popup_search_sort_defaults, "popup_search_sort_defaults"); - GLADE_HOOKUP_OBJECT (popup_search, image2236, "image2236"); + GLADE_HOOKUP_OBJECT (popup_search, image2268, "image2268"); return popup_search; } @@ -551,11 +537,11 @@ gtk_window_set_title (GTK_WINDOW (dlg_filters), _("Ruleset editor")); gtk_window_set_position (GTK_WINDOW (dlg_filters), GTK_WIN_POS_MOUSE); gtk_window_set_default_size (GTK_WINDOW (dlg_filters), 450, 300); - dlg_filters_icon_pixbuf = create_pixbuf ("icon.xpm"); + dlg_filters_icon_pixbuf = create_pixbuf ("icon.48x48.xpm"); if (dlg_filters_icon_pixbuf) { gtk_window_set_icon (GTK_WINDOW (dlg_filters), dlg_filters_icon_pixbuf); - gdk_pixbuf_unref (dlg_filters_icon_pixbuf); + g_object_unref (dlg_filters_icon_pixbuf); } vbox_filter_main = gtk_vbox_new (FALSE, 0); @@ -898,11 +884,11 @@ gtk_widget_set_name (shutdown_window, "shutdown_window"); gtk_window_set_title (GTK_WINDOW (shutdown_window), _("gtk-gnutella shutdown")); gtk_window_set_position (GTK_WINDOW (shutdown_window), GTK_WIN_POS_MOUSE); - shutdown_window_icon_pixbuf = create_pixbuf ("icon.xpm"); + shutdown_window_icon_pixbuf = create_pixbuf ("icon.48x48.xpm"); if (shutdown_window_icon_pixbuf) { gtk_window_set_icon (GTK_WINDOW (shutdown_window), shutdown_window_icon_pixbuf); - gdk_pixbuf_unref (shutdown_window_icon_pixbuf); + g_object_unref (shutdown_window_icon_pixbuf); } frame30 = gtk_frame_new (NULL); @@ -1024,23 +1010,23 @@ GtkWidget *label302; GtkWidget *label488; GtkWidget *label489; + GtkWidget *label538; GtkWidget *label490; GtkWidget *label491; GtkWidget *hseparator14; GtkWidget *label892; GtkWidget *hbox137; GtkWidget *button_about_close; - GtkWidget *label538; dlg_about = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_set_name (dlg_about, "dlg_about"); gtk_window_set_title (GTK_WINDOW (dlg_about), _("About gtk-gnutella")); gtk_window_set_position (GTK_WINDOW (dlg_about), GTK_WIN_POS_MOUSE); - dlg_about_icon_pixbuf = create_pixbuf ("icon.xpm"); + dlg_about_icon_pixbuf = create_pixbuf ("icon.48x48.xpm"); if (dlg_about_icon_pixbuf) { gtk_window_set_icon (GTK_WINDOW (dlg_about), dlg_about_icon_pixbuf); - gdk_pixbuf_unref (dlg_about_icon_pixbuf); + g_object_unref (dlg_about_icon_pixbuf); } vbox67 = gtk_vbox_new (FALSE, 0); @@ -1059,7 +1045,7 @@ gtk_widget_show (hbox231); gtk_container_add (GTK_CONTAINER (frame44), hbox231); - image222 = create_pixmap (dlg_about, "icon.xpm"); + image222 = create_pixmap (dlg_about, "icon.48x48.xpm"); gtk_widget_set_name (image222, "image222"); gtk_widget_show (image222); gtk_box_pack_start (GTK_BOX (hbox231), image222, FALSE, TRUE, 0); @@ -1254,6 +1240,14 @@ GTK_WIDGET_SET_FLAGS (label489, GTK_CAN_FOCUS); gtk_label_set_selectable (GTK_LABEL (label489), TRUE); + label538 = gtk_label_new ("Translations are on https://www.transifex.com/projects/p/gtk-gnutella/"); + gtk_widget_set_name (label538, "label538"); + gtk_widget_show (label538); + gtk_box_pack_start (GTK_BOX (vbox67), label538, FALSE, TRUE, 0); + GTK_WIDGET_SET_FLAGS (label538, GTK_CAN_FOCUS); + gtk_label_set_justify (GTK_LABEL (label538), GTK_JUSTIFY_CENTER); + gtk_label_set_selectable (GTK_LABEL (label538), TRUE); + label490 = gtk_label_new (_("Join the users or developers mailing lists.")); gtk_widget_set_name (label490, "label490"); gtk_widget_show (label490); @@ -1292,11 +1286,6 @@ gtk_container_set_border_width (GTK_CONTAINER (button_about_close), 6); GTK_WIDGET_SET_FLAGS (button_about_close, GTK_CAN_DEFAULT); - label538 = gtk_label_new ("@(#) $Id$"); - gtk_widget_set_name (label538, "label538"); - gtk_box_pack_start (GTK_BOX (vbox67), label538, FALSE, FALSE, 0); - gtk_widget_set_sensitive (label538, FALSE); - g_signal_connect ((gpointer) dlg_about, "delete_event", G_CALLBACK (on_dlg_about_delete_event), NULL); @@ -1333,13 +1322,13 @@ GLADE_HOOKUP_OBJECT (dlg_about, label302, "label302"); GLADE_HOOKUP_OBJECT (dlg_about, label488, "label488"); GLADE_HOOKUP_OBJECT (dlg_about, label489, "label489"); + GLADE_HOOKUP_OBJECT (dlg_about, label538, "label538"); GLADE_HOOKUP_OBJECT (dlg_about, label490, "label490"); GLADE_HOOKUP_OBJECT (dlg_about, label491, "label491"); GLADE_HOOKUP_OBJECT (dlg_about, hseparator14, "hseparator14"); GLADE_HOOKUP_OBJECT (dlg_about, label892, "label892"); GLADE_HOOKUP_OBJECT (dlg_about, hbox137, "hbox137"); GLADE_HOOKUP_OBJECT (dlg_about, button_about_close, "button_about_close"); - GLADE_HOOKUP_OBJECT (dlg_about, label538, "label538"); gtk_widget_grab_focus (textview_about_contributors); gtk_widget_grab_default (button_about_close); @@ -1356,10 +1345,10 @@ GtkWidget *menu_file; GtkWidget *menu_file_menu; GtkWidget *menu_prefs; - GtkWidget *image2240; + GtkWidget *image2291; GtkWidget *separator27; GtkWidget *quit; - GtkWidget *image2241; + GtkWidget *image2292; GtkWidget *menu_view; GtkWidget *menu_view_menu; GtkWidget *menu_searchbar_visible; @@ -1393,9 +1382,10 @@ GtkWidget *menu_help; GtkWidget *menu_help_menu; GtkWidget *menu_faq; - GtkWidget *image2242; + GtkWidget *image2293; + GtkWidget *menu_glossary; GtkWidget *menu_about; - GtkWidget *image2243; + GtkWidget *image2294; GtkWidget *viewport_searchbar; GtkWidget *vbox160; GtkWidget *hbox9350; @@ -1492,14 +1482,20 @@ GtkWidget *hbox_port_mapping; GtkWidget *eventbox_port_mapping_possible; GtkWidget *image_port_mapping_possible; - GtkWidget *eventbox_port_mapping_successful; - GtkWidget *image_port_mapping_successful; + GtkWidget *eventbox_upnp_port_mapping_successful; + GtkWidget *image_upnp_successful; + GtkWidget *eventbox_natpmp_port_mapping_successful; + GtkWidget *image_natpmp_successful; GtkWidget *statusbar; GtkWidget *hbox211; GtkWidget *eventbox_image_download_queue_frozen; GtkWidget *image_download_queue_frozen; GtkWidget *eventbox_image_chip; GtkWidget *image_chip; + GtkWidget *eventbox_net_buffer_shortage; + GtkWidget *image_net_buffer_shortage; + GtkWidget *eventbox_tcp_no_listening; + GtkWidget *image_tcp_no_listening; GtkWidget *eventbox_image_warning; GtkWidget *image_warning; GtkWidget *hbox9345; @@ -1573,11 +1569,11 @@ main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_set_name (main_window, "main_window"); - main_window_icon_pixbuf = create_pixbuf ("icon.xpm"); + main_window_icon_pixbuf = create_pixbuf ("icon.48x48.xpm"); if (main_window_icon_pixbuf) { gtk_window_set_icon (GTK_WINDOW (main_window), main_window_icon_pixbuf); - gdk_pixbuf_unref (main_window_icon_pixbuf); + g_object_unref (main_window_icon_pixbuf); } vbox12 = gtk_vbox_new (FALSE, 0); @@ -1607,10 +1603,10 @@ GDK_p, (GdkModifierType) GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); - image2240 = gtk_image_new_from_stock ("gtk-preferences", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2240, "image2240"); - gtk_widget_show (image2240); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_prefs), image2240); + image2291 = gtk_image_new_from_stock ("gtk-preferences", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2291, "image2291"); + gtk_widget_show (image2291); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_prefs), image2291); separator27 = gtk_separator_menu_item_new (); gtk_widget_set_name (separator27, "separator27"); @@ -1626,10 +1622,10 @@ GDK_q, (GdkModifierType) GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); - image2241 = gtk_image_new_from_stock ("gtk-quit", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2241, "image2241"); - gtk_widget_show (image2241); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (quit), image2241); + image2292 = gtk_image_new_from_stock ("gtk-quit", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2292, "image2292"); + gtk_widget_show (image2292); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (quit), image2292); menu_view = gtk_menu_item_new_with_mnemonic (_("_View")); gtk_widget_set_name (menu_view, "menu_view"); @@ -1808,20 +1804,26 @@ gtk_container_add (GTK_CONTAINER (menu_help_menu), menu_faq); gtk_tooltips_set_tip (tooltips, menu_faq, _("Frequently Asked Questions"), NULL); - image2242 = gtk_image_new_from_stock ("gtk-info", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2242, "image2242"); - gtk_widget_show (image2242); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_faq), image2242); + image2293 = gtk_image_new_from_stock ("gtk-info", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2293, "image2293"); + gtk_widget_show (image2293); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_faq), image2293); + + menu_glossary = gtk_menu_item_new_with_mnemonic (_("Glossary")); + gtk_widget_set_name (menu_glossary, "menu_glossary"); + gtk_widget_show (menu_glossary); + gtk_container_add (GTK_CONTAINER (menu_help_menu), menu_glossary); + gtk_tooltips_set_tip (tooltips, menu_glossary, _("Glossary"), NULL); menu_about = gtk_image_menu_item_new_with_mnemonic (_("_About")); gtk_widget_set_name (menu_about, "menu_about"); gtk_widget_show (menu_about); gtk_container_add (GTK_CONTAINER (menu_help_menu), menu_about); - image2243 = gtk_image_new_from_stock ("gtk-about", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2243, "image2243"); - gtk_widget_show (image2243); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_about), image2243); + image2294 = gtk_image_new_from_stock ("gtk-about", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2294, "image2294"); + gtk_widget_show (image2294); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_about), image2294); viewport_searchbar = gtk_viewport_new (NULL, NULL); gtk_widget_set_name (viewport_searchbar, "viewport_searchbar"); @@ -2367,16 +2369,27 @@ gtk_widget_show (image_port_mapping_possible); gtk_container_add (GTK_CONTAINER (eventbox_port_mapping_possible), image_port_mapping_possible); - eventbox_port_mapping_successful = gtk_event_box_new (); - gtk_widget_set_name (eventbox_port_mapping_successful, "eventbox_port_mapping_successful"); - gtk_widget_show (eventbox_port_mapping_successful); - gtk_box_pack_start (GTK_BOX (hbox_port_mapping), eventbox_port_mapping_successful, TRUE, TRUE, 0); - gtk_tooltips_set_tip (tooltips, eventbox_port_mapping_successful, _("Port mapping configured through UPnP or NAT-PMP."), NULL); - - image_port_mapping_successful = create_pixmap (main_window, "upnp.xpm"); - gtk_widget_set_name (image_port_mapping_successful, "image_port_mapping_successful"); - gtk_widget_show (image_port_mapping_successful); - gtk_container_add (GTK_CONTAINER (eventbox_port_mapping_successful), image_port_mapping_successful); + eventbox_upnp_port_mapping_successful = gtk_event_box_new (); + gtk_widget_set_name (eventbox_upnp_port_mapping_successful, "eventbox_upnp_port_mapping_successful"); + gtk_widget_show (eventbox_upnp_port_mapping_successful); + gtk_box_pack_start (GTK_BOX (hbox_port_mapping), eventbox_upnp_port_mapping_successful, TRUE, TRUE, 0); + gtk_tooltips_set_tip (tooltips, eventbox_upnp_port_mapping_successful, _("Port mapping configured through UPnP."), NULL); + + image_upnp_successful = create_pixmap (main_window, "upnp.xpm"); + gtk_widget_set_name (image_upnp_successful, "image_upnp_successful"); + gtk_widget_show (image_upnp_successful); + gtk_container_add (GTK_CONTAINER (eventbox_upnp_port_mapping_successful), image_upnp_successful); + + eventbox_natpmp_port_mapping_successful = gtk_event_box_new (); + gtk_widget_set_name (eventbox_natpmp_port_mapping_successful, "eventbox_natpmp_port_mapping_successful"); + gtk_widget_show (eventbox_natpmp_port_mapping_successful); + gtk_box_pack_start (GTK_BOX (hbox_port_mapping), eventbox_natpmp_port_mapping_successful, TRUE, TRUE, 0); + gtk_tooltips_set_tip (tooltips, eventbox_natpmp_port_mapping_successful, _("Port mapping configured through NAT-PMP."), NULL); + + image_natpmp_successful = create_pixmap (main_window, "natpmp.xpm"); + gtk_widget_set_name (image_natpmp_successful, "image_natpmp_successful"); + gtk_widget_show (image_natpmp_successful); + gtk_container_add (GTK_CONTAINER (eventbox_natpmp_port_mapping_successful), image_natpmp_successful); statusbar = gtk_statusbar_new (); gtk_widget_set_name (statusbar, "statusbar"); @@ -2414,6 +2427,29 @@ gtk_container_add (GTK_CONTAINER (eventbox_image_chip), image_chip); gtk_misc_set_padding (GTK_MISC (image_chip), 1, 0); + eventbox_net_buffer_shortage = gtk_event_box_new (); + gtk_widget_set_name (eventbox_net_buffer_shortage, "eventbox_net_buffer_shortage"); + gtk_widget_show (eventbox_net_buffer_shortage); + gtk_box_pack_start (GTK_BOX (hbox211), eventbox_net_buffer_shortage, TRUE, TRUE, 0); + + image_net_buffer_shortage = create_pixmap (main_window, "hungup.xpm"); + gtk_widget_set_name (image_net_buffer_shortage, "image_net_buffer_shortage"); + gtk_widget_show (image_net_buffer_shortage); + gtk_container_add (GTK_CONTAINER (eventbox_net_buffer_shortage), image_net_buffer_shortage); + gtk_misc_set_padding (GTK_MISC (image_net_buffer_shortage), 1, 0); + + eventbox_tcp_no_listening = gtk_event_box_new (); + gtk_widget_set_name (eventbox_tcp_no_listening, "eventbox_tcp_no_listening"); + gtk_widget_show (eventbox_tcp_no_listening); + gtk_box_pack_start (GTK_BOX (hbox211), eventbox_tcp_no_listening, TRUE, TRUE, 0); + gtk_tooltips_set_tip (tooltips, eventbox_tcp_no_listening, _("Download queue is frozen."), NULL); + + image_tcp_no_listening = create_pixmap (main_window, "no_listening.xpm"); + gtk_widget_set_name (image_tcp_no_listening, "image_tcp_no_listening"); + gtk_widget_show (image_tcp_no_listening); + gtk_container_add (GTK_CONTAINER (eventbox_tcp_no_listening), image_tcp_no_listening); + gtk_misc_set_padding (GTK_MISC (image_tcp_no_listening), 1, 0); + eventbox_image_warning = gtk_event_box_new (); gtk_widget_set_name (eventbox_image_warning, "eventbox_image_warning"); gtk_widget_show (eventbox_image_warning); @@ -2834,6 +2870,9 @@ g_signal_connect ((gpointer) menu_faq, "activate", G_CALLBACK (on_menu_faq_activate), NULL); + g_signal_connect ((gpointer) menu_glossary, "activate", + G_CALLBACK (on_menu_glossary_activate), + NULL); g_signal_connect ((gpointer) menu_about, "activate", G_CALLBACK (on_menu_about_activate), NULL); @@ -2869,10 +2908,10 @@ GLADE_HOOKUP_OBJECT (main_window, menu_file, "menu_file"); GLADE_HOOKUP_OBJECT (main_window, menu_file_menu, "menu_file_menu"); GLADE_HOOKUP_OBJECT (main_window, menu_prefs, "menu_prefs"); - GLADE_HOOKUP_OBJECT (main_window, image2240, "image2240"); + GLADE_HOOKUP_OBJECT (main_window, image2291, "image2291"); GLADE_HOOKUP_OBJECT (main_window, separator27, "separator27"); GLADE_HOOKUP_OBJECT (main_window, quit, "quit"); - GLADE_HOOKUP_OBJECT (main_window, image2241, "image2241"); + GLADE_HOOKUP_OBJECT (main_window, image2292, "image2292"); GLADE_HOOKUP_OBJECT (main_window, menu_view, "menu_view"); GLADE_HOOKUP_OBJECT (main_window, menu_view_menu, "menu_view_menu"); GLADE_HOOKUP_OBJECT (main_window, menu_searchbar_visible, "menu_searchbar_visible"); @@ -2906,9 +2945,10 @@ GLADE_HOOKUP_OBJECT (main_window, menu_help, "menu_help"); GLADE_HOOKUP_OBJECT (main_window, menu_help_menu, "menu_help_menu"); GLADE_HOOKUP_OBJECT (main_window, menu_faq, "menu_faq"); - GLADE_HOOKUP_OBJECT (main_window, image2242, "image2242"); + GLADE_HOOKUP_OBJECT (main_window, image2293, "image2293"); + GLADE_HOOKUP_OBJECT (main_window, menu_glossary, "menu_glossary"); GLADE_HOOKUP_OBJECT (main_window, menu_about, "menu_about"); - GLADE_HOOKUP_OBJECT (main_window, image2243, "image2243"); + GLADE_HOOKUP_OBJECT (main_window, image2294, "image2294"); GLADE_HOOKUP_OBJECT (main_window, viewport_searchbar, "viewport_searchbar"); GLADE_HOOKUP_OBJECT (main_window, vbox160, "vbox160"); GLADE_HOOKUP_OBJECT (main_window, hbox9350, "hbox9350"); @@ -3004,14 +3044,20 @@ GLADE_HOOKUP_OBJECT (main_window, hbox_port_mapping, "hbox_port_mapping"); GLADE_HOOKUP_OBJECT (main_window, eventbox_port_mapping_possible, "eventbox_port_mapping_possible"); GLADE_HOOKUP_OBJECT (main_window, image_port_mapping_possible, "image_port_mapping_possible"); - GLADE_HOOKUP_OBJECT (main_window, eventbox_port_mapping_successful, "eventbox_port_mapping_successful"); - GLADE_HOOKUP_OBJECT (main_window, image_port_mapping_successful, "image_port_mapping_successful"); + GLADE_HOOKUP_OBJECT (main_window, eventbox_upnp_port_mapping_successful, "eventbox_upnp_port_mapping_successful"); + GLADE_HOOKUP_OBJECT (main_window, image_upnp_successful, "image_upnp_successful"); + GLADE_HOOKUP_OBJECT (main_window, eventbox_natpmp_port_mapping_successful, "eventbox_natpmp_port_mapping_successful"); + GLADE_HOOKUP_OBJECT (main_window, image_natpmp_successful, "image_natpmp_successful"); GLADE_HOOKUP_OBJECT (main_window, statusbar, "statusbar"); GLADE_HOOKUP_OBJECT (main_window, hbox211, "hbox211"); GLADE_HOOKUP_OBJECT (main_window, eventbox_image_download_queue_frozen, "eventbox_image_download_queue_frozen"); GLADE_HOOKUP_OBJECT (main_window, image_download_queue_frozen, "image_download_queue_frozen"); GLADE_HOOKUP_OBJECT (main_window, eventbox_image_chip, "eventbox_image_chip"); GLADE_HOOKUP_OBJECT (main_window, image_chip, "image_chip"); + GLADE_HOOKUP_OBJECT (main_window, eventbox_net_buffer_shortage, "eventbox_net_buffer_shortage"); + GLADE_HOOKUP_OBJECT (main_window, image_net_buffer_shortage, "image_net_buffer_shortage"); + GLADE_HOOKUP_OBJECT (main_window, eventbox_tcp_no_listening, "eventbox_tcp_no_listening"); + GLADE_HOOKUP_OBJECT (main_window, image_tcp_no_listening, "image_tcp_no_listening"); GLADE_HOOKUP_OBJECT (main_window, eventbox_image_warning, "eventbox_image_warning"); GLADE_HOOKUP_OBJECT (main_window, image_warning, "image_warning"); GLADE_HOOKUP_OBJECT (main_window, hbox9345, "hbox9345"); @@ -3101,11 +3147,11 @@ gtk_window_set_title (GTK_WINDOW (dlg_quit), _("gtk-gnutella: Quit?")); gtk_window_set_position (GTK_WINDOW (dlg_quit), GTK_WIN_POS_MOUSE); gtk_window_set_resizable (GTK_WINDOW (dlg_quit), FALSE); - dlg_quit_icon_pixbuf = create_pixbuf ("icon.xpm"); + dlg_quit_icon_pixbuf = create_pixbuf ("icon.48x48.xpm"); if (dlg_quit_icon_pixbuf) { gtk_window_set_icon (GTK_WINDOW (dlg_quit), dlg_quit_icon_pixbuf); - gdk_pixbuf_unref (dlg_quit_icon_pixbuf); + g_object_unref (dlg_quit_icon_pixbuf); } gtk_window_set_type_hint (GTK_WINDOW (dlg_quit), GDK_WINDOW_TYPE_HINT_DIALOG); @@ -3184,17 +3230,21 @@ GtkWidget *hbox164; GtkWidget *image34; GtkWidget *label415; - GtkWidget *hbox_leaf; - GtkWidget *label519; - GtkObject *spinbutton_max_ultrapeers_adj; - GtkWidget *spinbutton_max_ultrapeers; - GtkWidget *label520; GtkWidget *entry_host; GtkWidget *button_nodes_disconnect; GtkWidget *alignment135; GtkWidget *hbox9331; GtkWidget *image1258; GtkWidget *label987; + GtkWidget *hbox_leaf; + GtkWidget *label519; + GtkObject *spinbutton_max_ultrapeers_adj; + GtkWidget *spinbutton_max_ultrapeers; + GtkWidget *label520; + GtkWidget *hbox9354; + GtkWidget *label1079; + GtkObject *spinbutton_max_g2_hubs_adj; + GtkWidget *spinbutton_max_g2_hubs; GtkWidget *hbox_normal_or_ultrapeer; GtkWidget *label2; GtkObject *spinbutton_up_connections_adj; @@ -3254,7 +3304,7 @@ gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview_nodes), TRUE); gtk_tree_view_set_enable_search (GTK_TREE_VIEW (treeview_nodes), FALSE); - table56 = gtk_table_new (1, 4, FALSE); + table56 = gtk_table_new (1, 5, FALSE); gtk_widget_set_name (table56, "table56"); gtk_widget_show (table56); gtk_box_pack_start (GTK_BOX (vbox17), table56, FALSE, TRUE, 0); @@ -3291,31 +3341,6 @@ gtk_widget_show (label415); gtk_box_pack_start (GTK_BOX (hbox164), label415, FALSE, FALSE, 0); - hbox_leaf = gtk_hbox_new (FALSE, 0); - gtk_widget_set_name (hbox_leaf, "hbox_leaf"); - gtk_widget_show (hbox_leaf); - gtk_table_attach (GTK_TABLE (table56), hbox_leaf, 3, 4, 0, 1, - (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), - (GtkAttachOptions) (GTK_FILL), 0, 0); - - label519 = gtk_label_new (_("Connect to")); - gtk_widget_set_name (label519, "label519"); - gtk_widget_show (label519); - gtk_box_pack_start (GTK_BOX (hbox_leaf), label519, FALSE, TRUE, 0); - gtk_misc_set_padding (GTK_MISC (label519), 5, 0); - - spinbutton_max_ultrapeers_adj = gtk_adjustment_new (0, 0, 100, 1, 10, 0); - spinbutton_max_ultrapeers = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_max_ultrapeers_adj), 1, 0); - gtk_widget_set_name (spinbutton_max_ultrapeers, "spinbutton_max_ultrapeers"); - gtk_widget_show (spinbutton_max_ultrapeers); - gtk_box_pack_start (GTK_BOX (hbox_leaf), spinbutton_max_ultrapeers, FALSE, TRUE, 0); - - label520 = gtk_label_new (_("ultrapeers")); - gtk_widget_set_name (label520, "label520"); - gtk_widget_show (label520); - gtk_box_pack_start (GTK_BOX (hbox_leaf), label520, FALSE, TRUE, 0); - gtk_misc_set_padding (GTK_MISC (label520), 5, 0); - entry_host = gtk_entry_new (); gtk_widget_set_name (entry_host, "entry_host"); gtk_widget_show (entry_host); @@ -3351,6 +3376,49 @@ gtk_widget_show (label987); gtk_box_pack_start (GTK_BOX (hbox9331), label987, FALSE, FALSE, 0); + hbox_leaf = gtk_hbox_new (FALSE, 0); + gtk_widget_set_name (hbox_leaf, "hbox_leaf"); + gtk_widget_show (hbox_leaf); + gtk_table_attach (GTK_TABLE (table56), hbox_leaf, 3, 4, 0, 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 0, 0); + + label519 = gtk_label_new (_("Connect to")); + gtk_widget_set_name (label519, "label519"); + gtk_widget_show (label519); + gtk_box_pack_start (GTK_BOX (hbox_leaf), label519, FALSE, TRUE, 0); + gtk_misc_set_padding (GTK_MISC (label519), 5, 0); + + spinbutton_max_ultrapeers_adj = gtk_adjustment_new (0, 0, 100, 1, 10, 0); + spinbutton_max_ultrapeers = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_max_ultrapeers_adj), 1, 0); + gtk_widget_set_name (spinbutton_max_ultrapeers, "spinbutton_max_ultrapeers"); + gtk_widget_show (spinbutton_max_ultrapeers); + gtk_box_pack_start (GTK_BOX (hbox_leaf), spinbutton_max_ultrapeers, FALSE, TRUE, 0); + + label520 = gtk_label_new (_("ultrapeers")); + gtk_widget_set_name (label520, "label520"); + gtk_widget_show (label520); + gtk_box_pack_start (GTK_BOX (hbox_leaf), label520, FALSE, TRUE, 0); + gtk_misc_set_padding (GTK_MISC (label520), 5, 0); + + hbox9354 = gtk_hbox_new (FALSE, 0); + gtk_widget_set_name (hbox9354, "hbox9354"); + gtk_widget_show (hbox9354); + gtk_table_attach (GTK_TABLE (table56), hbox9354, 4, 5, 0, 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 0, 0); + + label1079 = gtk_label_new (_("G2 hubs")); + gtk_widget_set_name (label1079, "label1079"); + gtk_widget_show (label1079); + gtk_box_pack_start (GTK_BOX (hbox9354), label1079, FALSE, TRUE, 0); + + spinbutton_max_g2_hubs_adj = gtk_adjustment_new (1, 0, 100, 1, 10, 0); + spinbutton_max_g2_hubs = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_max_g2_hubs_adj), 1, 0); + gtk_widget_set_name (spinbutton_max_g2_hubs, "spinbutton_max_g2_hubs"); + gtk_widget_show (spinbutton_max_g2_hubs); + gtk_box_pack_start (GTK_BOX (hbox9354), spinbutton_max_g2_hubs, FALSE, TRUE, 0); + hbox_normal_or_ultrapeer = gtk_hbox_new (FALSE, 4); gtk_widget_set_name (hbox_normal_or_ultrapeer, "hbox_normal_or_ultrapeer"); gtk_widget_show (hbox_normal_or_ultrapeer); @@ -3524,16 +3592,19 @@ GLADE_HOOKUP_OBJECT (main_window_gnet_tab, hbox164, "hbox164"); GLADE_HOOKUP_OBJECT (main_window_gnet_tab, image34, "image34"); GLADE_HOOKUP_OBJECT (main_window_gnet_tab, label415, "label415"); - GLADE_HOOKUP_OBJECT (main_window_gnet_tab, hbox_leaf, "hbox_leaf"); - GLADE_HOOKUP_OBJECT (main_window_gnet_tab, label519, "label519"); - GLADE_HOOKUP_OBJECT (main_window_gnet_tab, spinbutton_max_ultrapeers, "spinbutton_max_ultrapeers"); - GLADE_HOOKUP_OBJECT (main_window_gnet_tab, label520, "label520"); GLADE_HOOKUP_OBJECT (main_window_gnet_tab, entry_host, "entry_host"); GLADE_HOOKUP_OBJECT (main_window_gnet_tab, button_nodes_disconnect, "button_nodes_disconnect"); GLADE_HOOKUP_OBJECT (main_window_gnet_tab, alignment135, "alignment135"); GLADE_HOOKUP_OBJECT (main_window_gnet_tab, hbox9331, "hbox9331"); GLADE_HOOKUP_OBJECT (main_window_gnet_tab, image1258, "image1258"); GLADE_HOOKUP_OBJECT (main_window_gnet_tab, label987, "label987"); + GLADE_HOOKUP_OBJECT (main_window_gnet_tab, hbox_leaf, "hbox_leaf"); + GLADE_HOOKUP_OBJECT (main_window_gnet_tab, label519, "label519"); + GLADE_HOOKUP_OBJECT (main_window_gnet_tab, spinbutton_max_ultrapeers, "spinbutton_max_ultrapeers"); + GLADE_HOOKUP_OBJECT (main_window_gnet_tab, label520, "label520"); + GLADE_HOOKUP_OBJECT (main_window_gnet_tab, hbox9354, "hbox9354"); + GLADE_HOOKUP_OBJECT (main_window_gnet_tab, label1079, "label1079"); + GLADE_HOOKUP_OBJECT (main_window_gnet_tab, spinbutton_max_g2_hubs, "spinbutton_max_g2_hubs"); GLADE_HOOKUP_OBJECT (main_window_gnet_tab, hbox_normal_or_ultrapeer, "hbox_normal_or_ultrapeer"); GLADE_HOOKUP_OBJECT (main_window_gnet_tab, label2, "label2"); GLADE_HOOKUP_OBJECT (main_window_gnet_tab, spinbutton_up_connections, "spinbutton_up_connections"); @@ -3787,6 +3858,10 @@ GtkWidget *label419; GtkWidget *hbox9296; GtkWidget *label923; + GtkWidget *label_g2_browse_served; + GtkWidget *label1081; + GtkWidget *label_g2_browse_count; + GtkWidget *label1083; GtkWidget *label_html_browse_served; GtkWidget *label991; GtkWidget *label_html_browse_count; @@ -3890,6 +3965,26 @@ gtk_box_pack_start (GTK_BOX (hbox9296), label923, TRUE, TRUE, 0); gtk_misc_set_alignment (GTK_MISC (label923), 1, 0.5); + label_g2_browse_served = gtk_label_new (_("G2 served")); + gtk_widget_set_name (label_g2_browse_served, "label_g2_browse_served"); + gtk_widget_show (label_g2_browse_served); + gtk_box_pack_start (GTK_BOX (hbox9296), label_g2_browse_served, FALSE, FALSE, 0); + + label1081 = gtk_label_new (_(" / ")); + gtk_widget_set_name (label1081, "label1081"); + gtk_widget_show (label1081); + gtk_box_pack_start (GTK_BOX (hbox9296), label1081, FALSE, FALSE, 0); + + label_g2_browse_count = gtk_label_new (_("G2")); + gtk_widget_set_name (label_g2_browse_count, "label_g2_browse_count"); + gtk_widget_show (label_g2_browse_count); + gtk_box_pack_start (GTK_BOX (hbox9296), label_g2_browse_count, FALSE, FALSE, 0); + + label1083 = gtk_label_new (_(" G2, ")); + gtk_widget_set_name (label1083, "label1083"); + gtk_widget_show (label1083); + gtk_box_pack_start (GTK_BOX (hbox9296), label1083, FALSE, FALSE, 0); + label_html_browse_served = gtk_label_new (_("BH HTML served")); gtk_widget_set_name (label_html_browse_served, "label_html_browse_served"); gtk_widget_show (label_html_browse_served); @@ -3955,6 +4050,10 @@ GLADE_HOOKUP_OBJECT (main_window_upload_stats_tab, label419, "label419"); GLADE_HOOKUP_OBJECT (main_window_upload_stats_tab, hbox9296, "hbox9296"); GLADE_HOOKUP_OBJECT (main_window_upload_stats_tab, label923, "label923"); + GLADE_HOOKUP_OBJECT (main_window_upload_stats_tab, label_g2_browse_served, "label_g2_browse_served"); + GLADE_HOOKUP_OBJECT (main_window_upload_stats_tab, label1081, "label1081"); + GLADE_HOOKUP_OBJECT (main_window_upload_stats_tab, label_g2_browse_count, "label_g2_browse_count"); + GLADE_HOOKUP_OBJECT (main_window_upload_stats_tab, label1083, "label1083"); GLADE_HOOKUP_OBJECT (main_window_upload_stats_tab, label_html_browse_served, "label_html_browse_served"); GLADE_HOOKUP_OBJECT (main_window_upload_stats_tab, label991, "label991"); GLADE_HOOKUP_OBJECT (main_window_upload_stats_tab, label_html_browse_count, "label_html_browse_count"); @@ -3999,9 +4098,6 @@ GtkWidget *scrolledwindow83; GtkWidget *textview_result_info_xml; GtkWidget *label1015; - GtkWidget *scrolledwindow900; - GtkWidget *textview_result_info_bitzi; - GtkWidget *label1029; GtkWidget *table78; GtkWidget *label993; GtkWidget *alignment136; @@ -4030,7 +4126,12 @@ GtkWidget *spinbutton_whats_new_search_max_results; GtkWidget *checkbutton_search_discard_alien_ip; GtkWidget *checkbutton_search_discard_banned_guid; + GtkWidget *checkbutton_search_display_guess_stats; GtkWidget *label1011; + GtkWidget *guess_stats_line; + GtkWidget *viewport482; + GtkWidget *label_guess_stats; + GtkWidget *checkbutton_guess_stats_show_total; GtkWidget *hbox215; GtkWidget *viewport56; GtkWidget *label_items_found; @@ -4230,25 +4331,6 @@ gtk_widget_show (label1015); gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 1), label1015); - scrolledwindow900 = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_set_name (scrolledwindow900, "scrolledwindow900"); - gtk_widget_show (scrolledwindow900); - gtk_container_add (GTK_CONTAINER (notebook1), scrolledwindow900); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow900), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow900), GTK_SHADOW_ETCHED_IN); - - textview_result_info_bitzi = gtk_text_view_new (); - gtk_widget_set_name (textview_result_info_bitzi, "textview_result_info_bitzi"); - gtk_widget_show (textview_result_info_bitzi); - gtk_container_add (GTK_CONTAINER (scrolledwindow900), textview_result_info_bitzi); - gtk_text_view_set_editable (GTK_TEXT_VIEW (textview_result_info_bitzi), FALSE); - gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (textview_result_info_bitzi), FALSE); - - label1029 = gtk_label_new (_("Bitzi Metadata")); - gtk_widget_set_name (label1029, "label1029"); - gtk_widget_show (label1029); - gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 2), label1029); - table78 = gtk_table_new (7, 4, FALSE); gtk_widget_set_name (table78, "table78"); gtk_widget_show (table78); @@ -4272,7 +4354,7 @@ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); - spinbutton_browse_host_max_results_adj = gtk_adjustment_new (1000, 1, 50000, 1, 10, 10); + spinbutton_browse_host_max_results_adj = gtk_adjustment_new (1000, 1, 50000, 1, 10, 0); spinbutton_browse_host_max_results = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_browse_host_max_results_adj), 1, 0); gtk_widget_set_name (spinbutton_browse_host_max_results, "spinbutton_browse_host_max_results"); gtk_widget_show (spinbutton_browse_host_max_results); @@ -4349,7 +4431,7 @@ (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); - spinbutton_passive_search_max_results_adj = gtk_adjustment_new (1000, 1, 50000, 1, 10, 10); + spinbutton_passive_search_max_results_adj = gtk_adjustment_new (1000, 1, 50000, 1, 10, 0); spinbutton_passive_search_max_results = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_passive_search_max_results_adj), 1, 0); gtk_widget_set_name (spinbutton_passive_search_max_results, "spinbutton_passive_search_max_results"); gtk_widget_show (spinbutton_passive_search_max_results); @@ -4421,10 +4503,41 @@ (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + checkbutton_search_display_guess_stats = gtk_check_button_new_with_mnemonic (_("Display GUESS statistics")); + gtk_widget_set_name (checkbutton_search_display_guess_stats, "checkbutton_search_display_guess_stats"); + gtk_widget_show (checkbutton_search_display_guess_stats); + gtk_table_attach (GTK_TABLE (table78), checkbutton_search_display_guess_stats, 0, 1, 6, 7, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + label1011 = gtk_label_new (_("General search settings (affect all searches)")); gtk_widget_set_name (label1011, "label1011"); gtk_widget_show (label1011); - gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 3), label1011); + gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 2), label1011); + + guess_stats_line = gtk_hbox_new (FALSE, 0); + gtk_widget_set_name (guess_stats_line, "guess_stats_line"); + gtk_widget_show (guess_stats_line); + gtk_box_pack_start (GTK_BOX (vbox79), guess_stats_line, FALSE, TRUE, 0); + + viewport482 = gtk_viewport_new (NULL, NULL); + gtk_widget_set_name (viewport482, "viewport482"); + gtk_widget_show (viewport482); + gtk_box_pack_start (GTK_BOX (guess_stats_line), viewport482, TRUE, TRUE, 0); + gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport482), GTK_SHADOW_ETCHED_IN); + + label_guess_stats = gtk_label_new (" "); + gtk_widget_set_name (label_guess_stats, "label_guess_stats"); + gtk_widget_show (label_guess_stats); + gtk_container_add (GTK_CONTAINER (viewport482), label_guess_stats); + gtk_label_set_justify (GTK_LABEL (label_guess_stats), GTK_JUSTIFY_CENTER); + gtk_misc_set_alignment (GTK_MISC (label_guess_stats), 7.45058e-09, 0.5); + gtk_misc_set_padding (GTK_MISC (label_guess_stats), 5, 0); + + checkbutton_guess_stats_show_total = gtk_check_button_new_with_mnemonic (_("Total")); + gtk_widget_set_name (checkbutton_guess_stats_show_total, "checkbutton_guess_stats_show_total"); + gtk_widget_show (checkbutton_guess_stats_show_total); + gtk_box_pack_start (GTK_BOX (guess_stats_line), checkbutton_guess_stats_show_total, FALSE, TRUE, 0); hbox215 = gtk_hbox_new (FALSE, 4); gtk_widget_set_name (hbox215, "hbox215"); @@ -4592,9 +4705,6 @@ GLADE_HOOKUP_OBJECT (main_window_search_tab, scrolledwindow83, "scrolledwindow83"); GLADE_HOOKUP_OBJECT (main_window_search_tab, textview_result_info_xml, "textview_result_info_xml"); GLADE_HOOKUP_OBJECT (main_window_search_tab, label1015, "label1015"); - GLADE_HOOKUP_OBJECT (main_window_search_tab, scrolledwindow900, "scrolledwindow900"); - GLADE_HOOKUP_OBJECT (main_window_search_tab, textview_result_info_bitzi, "textview_result_info_bitzi"); - GLADE_HOOKUP_OBJECT (main_window_search_tab, label1029, "label1029"); GLADE_HOOKUP_OBJECT (main_window_search_tab, table78, "table78"); GLADE_HOOKUP_OBJECT (main_window_search_tab, label993, "label993"); GLADE_HOOKUP_OBJECT (main_window_search_tab, alignment136, "alignment136"); @@ -4619,7 +4729,12 @@ GLADE_HOOKUP_OBJECT (main_window_search_tab, spinbutton_whats_new_search_max_results, "spinbutton_whats_new_search_max_results"); GLADE_HOOKUP_OBJECT (main_window_search_tab, checkbutton_search_discard_alien_ip, "checkbutton_search_discard_alien_ip"); GLADE_HOOKUP_OBJECT (main_window_search_tab, checkbutton_search_discard_banned_guid, "checkbutton_search_discard_banned_guid"); + GLADE_HOOKUP_OBJECT (main_window_search_tab, checkbutton_search_display_guess_stats, "checkbutton_search_display_guess_stats"); GLADE_HOOKUP_OBJECT (main_window_search_tab, label1011, "label1011"); + GLADE_HOOKUP_OBJECT (main_window_search_tab, guess_stats_line, "guess_stats_line"); + GLADE_HOOKUP_OBJECT (main_window_search_tab, viewport482, "viewport482"); + GLADE_HOOKUP_OBJECT (main_window_search_tab, label_guess_stats, "label_guess_stats"); + GLADE_HOOKUP_OBJECT (main_window_search_tab, checkbutton_guess_stats_show_total, "checkbutton_guess_stats_show_total"); GLADE_HOOKUP_OBJECT (main_window_search_tab, hbox215, "hbox215"); GLADE_HOOKUP_OBJECT (main_window_search_tab, viewport56, "viewport56"); GLADE_HOOKUP_OBJECT (main_window_search_tab, label_items_found, "label_items_found"); @@ -8817,6 +8932,13 @@ GtkObject *spinbutton_max_bad_hosts_cached_adj; GtkWidget *spinbutton_max_bad_hosts_cached; GtkWidget *button_hostcache_clear_bad; + GtkWidget *vbox161; + GtkWidget *progressbar_hosts_in_g2hub_catcher; + GtkWidget *hbox9353; + GtkWidget *label1078; + GtkObject *spinbutton_max_g2hub_hosts_cached_adj; + GtkWidget *spinbutton_max_g2hub_hosts_cached; + GtkWidget *button_g2hub_catcher_clear; GtkWidget *label843; main_window_hostcache_tab = gtk_window_new (GTK_WINDOW_TOPLEVEL); @@ -8951,6 +9073,40 @@ gtk_widget_show (button_hostcache_clear_bad); gtk_box_pack_start (GTK_BOX (hbox269), button_hostcache_clear_bad, FALSE, FALSE, 0); + vbox161 = gtk_vbox_new (FALSE, 2); + gtk_widget_set_name (vbox161, "vbox161"); + gtk_widget_show (vbox161); + gtk_box_pack_start (GTK_BOX (hbox266), vbox161, TRUE, TRUE, 0); + + progressbar_hosts_in_g2hub_catcher = gtk_progress_bar_new (); + gtk_widget_set_name (progressbar_hosts_in_g2hub_catcher, "progressbar_hosts_in_g2hub_catcher"); + gtk_widget_show (progressbar_hosts_in_g2hub_catcher); + gtk_box_pack_start (GTK_BOX (vbox161), progressbar_hosts_in_g2hub_catcher, FALSE, FALSE, 0); + + hbox9353 = gtk_hbox_new (FALSE, 4); + gtk_widget_set_name (hbox9353, "hbox9353"); + gtk_widget_show (hbox9353); + gtk_box_pack_start (GTK_BOX (vbox161), hbox9353, TRUE, TRUE, 0); + + label1078 = gtk_label_new (_("G2 hubs")); + gtk_widget_set_name (label1078, "label1078"); + gtk_widget_show (label1078); + gtk_box_pack_start (GTK_BOX (hbox9353), label1078, FALSE, FALSE, 0); + gtk_label_set_justify (GTK_LABEL (label1078), GTK_JUSTIFY_CENTER); + gtk_misc_set_padding (GTK_MISC (label1078), 5, 0); + + spinbutton_max_g2hub_hosts_cached_adj = gtk_adjustment_new (1, 0, 100, 1, 10, 0); + spinbutton_max_g2hub_hosts_cached = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_max_g2hub_hosts_cached_adj), 1, 0); + gtk_widget_set_name (spinbutton_max_g2hub_hosts_cached, "spinbutton_max_g2hub_hosts_cached"); + gtk_widget_show (spinbutton_max_g2hub_hosts_cached); + gtk_box_pack_start (GTK_BOX (hbox9353), spinbutton_max_g2hub_hosts_cached, TRUE, TRUE, 0); + gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton_max_g2hub_hosts_cached), TRUE); + + button_g2hub_catcher_clear = gtk_button_new_with_mnemonic (_("Clear")); + gtk_widget_set_name (button_g2hub_catcher_clear, "button_g2hub_catcher_clear"); + gtk_widget_show (button_g2hub_catcher_clear); + gtk_box_pack_start (GTK_BOX (hbox9353), button_g2hub_catcher_clear, FALSE, FALSE, 0); + label843 = gtk_label_new (_("Hostcache capacity")); gtk_widget_set_name (label843, "label843"); gtk_widget_show (label843); @@ -8966,6 +9122,9 @@ g_signal_connect ((gpointer) button_hostcache_clear_bad, "clicked", G_CALLBACK (on_button_hostcache_clear_bad_clicked), NULL); + g_signal_connect ((gpointer) button_g2hub_catcher_clear, "clicked", + G_CALLBACK (on_button_hostcache_clear_bad_clicked), + NULL); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (main_window_hostcache_tab, main_window_hostcache_tab, "main_window_hostcache_tab"); @@ -8992,6 +9151,12 @@ GLADE_HOOKUP_OBJECT (main_window_hostcache_tab, label845, "label845"); GLADE_HOOKUP_OBJECT (main_window_hostcache_tab, spinbutton_max_bad_hosts_cached, "spinbutton_max_bad_hosts_cached"); GLADE_HOOKUP_OBJECT (main_window_hostcache_tab, button_hostcache_clear_bad, "button_hostcache_clear_bad"); + GLADE_HOOKUP_OBJECT (main_window_hostcache_tab, vbox161, "vbox161"); + GLADE_HOOKUP_OBJECT (main_window_hostcache_tab, progressbar_hosts_in_g2hub_catcher, "progressbar_hosts_in_g2hub_catcher"); + GLADE_HOOKUP_OBJECT (main_window_hostcache_tab, hbox9353, "hbox9353"); + GLADE_HOOKUP_OBJECT (main_window_hostcache_tab, label1078, "label1078"); + GLADE_HOOKUP_OBJECT (main_window_hostcache_tab, spinbutton_max_g2hub_hosts_cached, "spinbutton_max_g2hub_hosts_cached"); + GLADE_HOOKUP_OBJECT (main_window_hostcache_tab, button_g2hub_catcher_clear, "button_g2hub_catcher_clear"); GLADE_HOOKUP_OBJECT (main_window_hostcache_tab, label843, "label843"); return main_window_hostcache_tab; @@ -9140,6 +9305,9 @@ GtkWidget *table118; GtkWidget *checkbutton_enable_natpmp; GtkWidget *checkbutton_enable_upnp; + GtkWidget *label1077; + GtkObject *spinbutton_config_upnp_mapping_lease_time_adj; + GtkWidget *spinbutton_config_upnp_mapping_lease_time; GtkWidget *label1054; GtkWidget *frame_proxy_settings; GtkWidget *vbox28; @@ -9467,7 +9635,7 @@ gtk_box_pack_start (GTK_BOX (vbox24), frame_expert_nw_port_mapping, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (frame_expert_nw_port_mapping), 4); - table118 = gtk_table_new (1, 2, FALSE); + table118 = gtk_table_new (2, 2, FALSE); gtk_widget_set_name (table118, "table118"); gtk_widget_show (table118); gtk_container_add (GTK_CONTAINER (frame_expert_nw_port_mapping), table118); @@ -9489,6 +9657,22 @@ (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + label1077 = gtk_label_new (_("Mapping lease time")); + gtk_widget_set_name (label1077, "label1077"); + gtk_widget_show (label1077); + gtk_table_attach (GTK_TABLE (table118), label1077, 0, 1, 1, 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_misc_set_alignment (GTK_MISC (label1077), 0, 0.5); + + spinbutton_config_upnp_mapping_lease_time_adj = gtk_adjustment_new (1, 0, 100, 1, 10, 0); + spinbutton_config_upnp_mapping_lease_time = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_config_upnp_mapping_lease_time_adj), 1, 0); + gtk_widget_set_name (spinbutton_config_upnp_mapping_lease_time, "spinbutton_config_upnp_mapping_lease_time"); + gtk_widget_show (spinbutton_config_upnp_mapping_lease_time); + gtk_table_attach (GTK_TABLE (table118), spinbutton_config_upnp_mapping_lease_time, 1, 2, 1, 2, + (GtkAttachOptions) (0), + (GtkAttachOptions) (0), 0, 0); + label1054 = gtk_label_new (_("Port Mapping")); gtk_widget_set_name (label1054, "label1054"); gtk_widget_show (label1054); @@ -10026,6 +10210,8 @@ GLADE_HOOKUP_OBJECT (dlg_prefs_net_tab, table118, "table118"); GLADE_HOOKUP_OBJECT (dlg_prefs_net_tab, checkbutton_enable_natpmp, "checkbutton_enable_natpmp"); GLADE_HOOKUP_OBJECT (dlg_prefs_net_tab, checkbutton_enable_upnp, "checkbutton_enable_upnp"); + GLADE_HOOKUP_OBJECT (dlg_prefs_net_tab, label1077, "label1077"); + GLADE_HOOKUP_OBJECT (dlg_prefs_net_tab, spinbutton_config_upnp_mapping_lease_time, "spinbutton_config_upnp_mapping_lease_time"); GLADE_HOOKUP_OBJECT (dlg_prefs_net_tab, label1054, "label1054"); GLADE_HOOKUP_OBJECT (dlg_prefs_net_tab, frame_proxy_settings, "frame_proxy_settings"); GLADE_HOOKUP_OBJECT (dlg_prefs_net_tab, vbox28, "vbox28"); @@ -10174,6 +10360,7 @@ GtkWidget *label365; GtkWidget *checkbutton_enable_guess; GtkWidget *checkbutton_enable_guess_client; + GtkWidget *checkbutton_enable_g2; GtkWidget *label293; GtkWidget *frame_expert_oob_queries; GtkWidget *table101; @@ -10780,7 +10967,7 @@ gtk_container_add (GTK_CONTAINER (frame_searches), hbox254); gtk_container_set_border_width (GTK_CONTAINER (hbox254), 2); - table17 = gtk_table_new (4, 3, FALSE); + table17 = gtk_table_new (5, 3, FALSE); gtk_widget_set_name (table17, "table17"); gtk_widget_show (table17); gtk_box_pack_start (GTK_BOX (hbox254), table17, FALSE, TRUE, 0); @@ -10856,6 +11043,13 @@ (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); + checkbutton_enable_g2 = gtk_check_button_new_with_mnemonic (_("Enable the G2 network")); + gtk_widget_set_name (checkbutton_enable_g2, "checkbutton_enable_g2"); + gtk_widget_show (checkbutton_enable_g2); + gtk_table_attach (GTK_TABLE (table17), checkbutton_enable_g2, 0, 2, 4, 5, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + label293 = gtk_label_new_with_mnemonic (_("Searches")); gtk_widget_set_name (label293, "label293"); gtk_widget_show (label293); @@ -11398,7 +11592,7 @@ (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label1076), 0, 0.5); - spinbutton_config_search_muid_track_amount_adj = gtk_adjustment_new (1, 0, 100, 1, 10, 10); + spinbutton_config_search_muid_track_amount_adj = gtk_adjustment_new (1, 0, 100, 1, 10, 0); spinbutton_config_search_muid_track_amount = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_config_search_muid_track_amount_adj), 1, 0); gtk_widget_set_name (spinbutton_config_search_muid_track_amount, "spinbutton_config_search_muid_track_amount"); gtk_widget_show (spinbutton_config_search_muid_track_amount); @@ -11743,6 +11937,7 @@ GLADE_HOOKUP_OBJECT (dlg_prefs_gnet_tab, label365, "label365"); GLADE_HOOKUP_OBJECT (dlg_prefs_gnet_tab, checkbutton_enable_guess, "checkbutton_enable_guess"); GLADE_HOOKUP_OBJECT (dlg_prefs_gnet_tab, checkbutton_enable_guess_client, "checkbutton_enable_guess_client"); + GLADE_HOOKUP_OBJECT (dlg_prefs_gnet_tab, checkbutton_enable_g2, "checkbutton_enable_g2"); GLADE_HOOKUP_OBJECT (dlg_prefs_gnet_tab, label293, "label293"); GLADE_HOOKUP_OBJECT (dlg_prefs_gnet_tab, frame_expert_oob_queries, "frame_expert_oob_queries"); GLADE_HOOKUP_OBJECT (dlg_prefs_gnet_tab, table101, "table101"); @@ -11970,6 +12165,7 @@ GtkObject *spinbutton_config_bw_guess_out_adj; GtkWidget *spinbutton_config_bw_guess_out; GtkWidget *label1063; + GtkWidget *checkbutton_guess_maximize_bw; GtkWidget *label1062; GtkTooltips *tooltips; @@ -12427,7 +12623,7 @@ (GtkAttachOptions) (0), 0, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton_config_bws_dht_out), TRUE); - checkbutton_config_bws_dht_out = gtk_check_button_new_with_mnemonic (_("Global DHT ougoing traffic")); + checkbutton_config_bws_dht_out = gtk_check_button_new_with_mnemonic (_("Global DHT outgoing traffic")); gtk_widget_set_name (checkbutton_config_bws_dht_out, "checkbutton_config_bws_dht_out"); gtk_widget_show (checkbutton_config_bws_dht_out); gtk_table_attach (GTK_TABLE (table116), checkbutton_config_bws_dht_out, 0, 1, 0, 1, @@ -12673,7 +12869,7 @@ gtk_container_add (GTK_CONTAINER (frame150), vbox157); gtk_container_set_border_width (GTK_CONTAINER (vbox157), 2); - table119 = gtk_table_new (1, 3, FALSE); + table119 = gtk_table_new (2, 3, FALSE); gtk_widget_set_name (table119, "table119"); gtk_widget_show (table119); gtk_box_pack_start (GTK_BOX (vbox157), table119, TRUE, TRUE, 0); @@ -12707,6 +12903,13 @@ (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label1063), 0, 0.5); + checkbutton_guess_maximize_bw = gtk_check_button_new_with_mnemonic (_("Allow unused Gnutella outgoing bandwidth to supersede hint")); + gtk_widget_set_name (checkbutton_guess_maximize_bw, "checkbutton_guess_maximize_bw"); + gtk_widget_show (checkbutton_guess_maximize_bw); + gtk_table_attach (GTK_TABLE (table119), checkbutton_guess_maximize_bw, 0, 3, 1, 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + label1062 = gtk_label_new_with_mnemonic (_("Bandwidth limits for GUESS queries")); gtk_widget_set_name (label1062, "label1062"); gtk_widget_show (label1062); @@ -12815,6 +13018,7 @@ GLADE_HOOKUP_OBJECT (dlg_prefs_bw_tab, label1057, "label1057"); GLADE_HOOKUP_OBJECT (dlg_prefs_bw_tab, spinbutton_config_bw_guess_out, "spinbutton_config_bw_guess_out"); GLADE_HOOKUP_OBJECT (dlg_prefs_bw_tab, label1063, "label1063"); + GLADE_HOOKUP_OBJECT (dlg_prefs_bw_tab, checkbutton_guess_maximize_bw, "checkbutton_guess_maximize_bw"); GLADE_HOOKUP_OBJECT (dlg_prefs_bw_tab, label1062, "label1062"); GLADE_HOOKUP_OBJECT_NO_REF (dlg_prefs_bw_tab, tooltips, "tooltips"); @@ -13604,7 +13808,7 @@ gtk_misc_set_alignment (GTK_MISC (label1055), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label1055), 4, 0); - spinbutton_dl_pipeline_maxchunksize_adj = gtk_adjustment_new (1, 0, 100, 1, 10, 10); + spinbutton_dl_pipeline_maxchunksize_adj = gtk_adjustment_new (1, 0, 100, 1, 10, 0); spinbutton_dl_pipeline_maxchunksize = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_dl_pipeline_maxchunksize_adj), 1, 0); gtk_widget_set_name (spinbutton_dl_pipeline_maxchunksize, "spinbutton_dl_pipeline_maxchunksize"); gtk_widget_show (spinbutton_dl_pipeline_maxchunksize); @@ -13962,6 +14166,7 @@ gtk_widget_set_name (scrolledwindow79, "scrolledwindow79"); gtk_widget_show (scrolledwindow79); gtk_box_pack_start (GTK_BOX (hbox9299), scrolledwindow79, TRUE, TRUE, 0); + gtk_widget_set_size_request (scrolledwindow79, -1, 100); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow79), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow79), GTK_SHADOW_ETCHED_IN); @@ -16833,11 +17038,11 @@ gtk_widget_set_name (dlg_faq, "dlg_faq"); gtk_window_set_position (GTK_WINDOW (dlg_faq), GTK_WIN_POS_MOUSE); gtk_window_set_default_size (GTK_WINDOW (dlg_faq), 600, 400); - dlg_faq_icon_pixbuf = create_pixbuf ("icon.xpm"); + dlg_faq_icon_pixbuf = create_pixbuf ("icon.48x48.xpm"); if (dlg_faq_icon_pixbuf) { gtk_window_set_icon (GTK_WINDOW (dlg_faq), dlg_faq_icon_pixbuf); - gdk_pixbuf_unref (dlg_faq_icon_pixbuf); + g_object_unref (dlg_faq_icon_pixbuf); } scrolledwindow80 = gtk_scrolled_window_new (NULL, NULL); @@ -16880,11 +17085,11 @@ gtk_widget_set_name (dlg_ancient, "dlg_ancient"); gtk_window_set_position (GTK_WINDOW (dlg_ancient), GTK_WIN_POS_MOUSE); gtk_window_set_default_size (GTK_WINDOW (dlg_ancient), 320, 240); - dlg_ancient_icon_pixbuf = create_pixbuf ("icon.xpm"); + dlg_ancient_icon_pixbuf = create_pixbuf ("icon.48x48.xpm"); if (dlg_ancient_icon_pixbuf) { gtk_window_set_icon (GTK_WINDOW (dlg_ancient), dlg_ancient_icon_pixbuf); - gdk_pixbuf_unref (dlg_ancient_icon_pixbuf); + g_object_unref (dlg_ancient_icon_pixbuf); } scrolledwindow81 = gtk_scrolled_window_new (NULL, NULL); @@ -16922,26 +17127,27 @@ { GtkWidget *popup_sources; GtkWidget *popup_sources_start_now; - GtkWidget *image2115; + GtkWidget *image2278; GtkWidget *popup_sources_pause; - GtkWidget *image2116; + GtkWidget *image2279; GtkWidget *popup_sources_resume; - GtkWidget *image2117; + GtkWidget *image2280; GtkWidget *popup_sources_queue; - GtkWidget *image2118; + GtkWidget *image2281; GtkWidget *popup_sources_forget; - GtkWidget *image2119; + GtkWidget *image2282; GtkWidget *separator34; GtkWidget *popup_sources_copy_url; - GtkWidget *image2120; + GtkWidget *image2283; GtkWidget *popup_sources_browse_host; - GtkWidget *image2121; + GtkWidget *image2284; GtkWidget *popup_sources_connect; - GtkWidget *image2122; + GtkWidget *image2285; GtkWidget *popup_sources_push; + GtkWidget *image2286; GtkWidget *separator31; GtkWidget *popup_sources_config_cols; - GtkWidget *image2123; + GtkWidget *image2287; popup_sources = gtk_menu_new (); gtk_widget_set_name (popup_sources, "popup_sources"); @@ -16951,50 +17157,50 @@ gtk_widget_show (popup_sources_start_now); gtk_container_add (GTK_CONTAINER (popup_sources), popup_sources_start_now); - image2115 = gtk_image_new_from_stock ("gtk-connect", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2115, "image2115"); - gtk_widget_show (image2115); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_sources_start_now), image2115); + image2278 = gtk_image_new_from_stock ("gtk-connect", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2278, "image2278"); + gtk_widget_show (image2278); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_sources_start_now), image2278); popup_sources_pause = gtk_image_menu_item_new_with_mnemonic (_("Pause")); gtk_widget_set_name (popup_sources_pause, "popup_sources_pause"); gtk_widget_show (popup_sources_pause); gtk_container_add (GTK_CONTAINER (popup_sources), popup_sources_pause); - image2116 = gtk_image_new_from_stock ("gtk-media-pause", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2116, "image2116"); - gtk_widget_show (image2116); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_sources_pause), image2116); + image2279 = gtk_image_new_from_stock ("gtk-media-pause", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2279, "image2279"); + gtk_widget_show (image2279); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_sources_pause), image2279); popup_sources_resume = gtk_image_menu_item_new_with_mnemonic (_("Resume")); gtk_widget_set_name (popup_sources_resume, "popup_sources_resume"); gtk_widget_show (popup_sources_resume); gtk_container_add (GTK_CONTAINER (popup_sources), popup_sources_resume); - image2117 = gtk_image_new_from_stock ("gtk-redo", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2117, "image2117"); - gtk_widget_show (image2117); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_sources_resume), image2117); + image2280 = gtk_image_new_from_stock ("gtk-redo", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2280, "image2280"); + gtk_widget_show (image2280); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_sources_resume), image2280); popup_sources_queue = gtk_image_menu_item_new_with_mnemonic (_("Move back to queue")); gtk_widget_set_name (popup_sources_queue, "popup_sources_queue"); gtk_widget_show (popup_sources_queue); gtk_container_add (GTK_CONTAINER (popup_sources), popup_sources_queue); - image2118 = gtk_image_new_from_stock ("gtk-disconnect", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2118, "image2118"); - gtk_widget_show (image2118); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_sources_queue), image2118); + image2281 = gtk_image_new_from_stock ("gtk-disconnect", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2281, "image2281"); + gtk_widget_show (image2281); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_sources_queue), image2281); popup_sources_forget = gtk_image_menu_item_new_with_mnemonic (_("Forget")); gtk_widget_set_name (popup_sources_forget, "popup_sources_forget"); gtk_widget_show (popup_sources_forget); gtk_container_add (GTK_CONTAINER (popup_sources), popup_sources_forget); - image2119 = gtk_image_new_from_stock ("gtk-stop", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2119, "image2119"); - gtk_widget_show (image2119); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_sources_forget), image2119); + image2282 = gtk_image_new_from_stock ("gtk-stop", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2282, "image2282"); + gtk_widget_show (image2282); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_sources_forget), image2282); separator34 = gtk_separator_menu_item_new (); gtk_widget_set_name (separator34, "separator34"); @@ -17007,36 +17213,41 @@ gtk_widget_show (popup_sources_copy_url); gtk_container_add (GTK_CONTAINER (popup_sources), popup_sources_copy_url); - image2120 = gtk_image_new_from_stock ("gtk-copy", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2120, "image2120"); - gtk_widget_show (image2120); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_sources_copy_url), image2120); + image2283 = gtk_image_new_from_stock ("gtk-copy", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2283, "image2283"); + gtk_widget_show (image2283); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_sources_copy_url), image2283); popup_sources_browse_host = gtk_image_menu_item_new_with_mnemonic (_("Browse host")); gtk_widget_set_name (popup_sources_browse_host, "popup_sources_browse_host"); gtk_widget_show (popup_sources_browse_host); gtk_container_add (GTK_CONTAINER (popup_sources), popup_sources_browse_host); - image2121 = gtk_image_new_from_stock ("gtk-index", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2121, "image2121"); - gtk_widget_show (image2121); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_sources_browse_host), image2121); + image2284 = gtk_image_new_from_stock ("gtk-index", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2284, "image2284"); + gtk_widget_show (image2284); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_sources_browse_host), image2284); popup_sources_connect = gtk_image_menu_item_new_with_mnemonic (_("Connect to host")); gtk_widget_set_name (popup_sources_connect, "popup_sources_connect"); gtk_widget_show (popup_sources_connect); gtk_container_add (GTK_CONTAINER (popup_sources), popup_sources_connect); - image2122 = gtk_image_new_from_stock ("gtk-network", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2122, "image2122"); - gtk_widget_show (image2122); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_sources_connect), image2122); + image2285 = gtk_image_new_from_stock ("gtk-network", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2285, "image2285"); + gtk_widget_show (image2285); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_sources_connect), image2285); - popup_sources_push = gtk_menu_item_new_with_mnemonic (_("Force push mode")); + popup_sources_push = gtk_image_menu_item_new_with_mnemonic (_("Force push mode")); gtk_widget_set_name (popup_sources_push, "popup_sources_push"); gtk_widget_show (popup_sources_push); gtk_container_add (GTK_CONTAINER (popup_sources), popup_sources_push); + image2286 = create_pixmap (popup_sources, "go_back.xpm"); + gtk_widget_set_name (image2286, "image2286"); + gtk_widget_show (image2286); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_sources_push), image2286); + separator31 = gtk_separator_menu_item_new (); gtk_widget_set_name (separator31, "separator31"); gtk_widget_show (separator31); @@ -17048,10 +17259,10 @@ gtk_widget_show (popup_sources_config_cols); gtk_container_add (GTK_CONTAINER (popup_sources), popup_sources_config_cols); - image2123 = gtk_image_new_from_stock ("gtk-preferences", GTK_ICON_SIZE_MENU); - gtk_widget_set_name (image2123, "image2123"); - gtk_widget_show (image2123); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_sources_config_cols), image2123); + image2287 = gtk_image_new_from_stock ("gtk-preferences", GTK_ICON_SIZE_MENU); + gtk_widget_set_name (image2287, "image2287"); + gtk_widget_show (image2287); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (popup_sources_config_cols), image2287); g_signal_connect ((gpointer) popup_sources_start_now, "activate", G_CALLBACK (on_popup_sources_start_now_activate), @@ -17087,26 +17298,27 @@ /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (popup_sources, popup_sources, "popup_sources"); GLADE_HOOKUP_OBJECT (popup_sources, popup_sources_start_now, "popup_sources_start_now"); - GLADE_HOOKUP_OBJECT (popup_sources, image2115, "image2115"); + GLADE_HOOKUP_OBJECT (popup_sources, image2278, "image2278"); GLADE_HOOKUP_OBJECT (popup_sources, popup_sources_pause, "popup_sources_pause"); - GLADE_HOOKUP_OBJECT (popup_sources, image2116, "image2116"); + GLADE_HOOKUP_OBJECT (popup_sources, image2279, "image2279"); GLADE_HOOKUP_OBJECT (popup_sources, popup_sources_resume, "popup_sources_resume"); - GLADE_HOOKUP_OBJECT (popup_sources, image2117, "image2117"); + GLADE_HOOKUP_OBJECT (popup_sources, image2280, "image2280"); GLADE_HOOKUP_OBJECT (popup_sources, popup_sources_queue, "popup_sources_queue"); - GLADE_HOOKUP_OBJECT (popup_sources, image2118, "image2118"); + GLADE_HOOKUP_OBJECT (popup_sources, image2281, "image2281"); GLADE_HOOKUP_OBJECT (popup_sources, popup_sources_forget, "popup_sources_forget"); - GLADE_HOOKUP_OBJECT (popup_sources, image2119, "image2119"); + GLADE_HOOKUP_OBJECT (popup_sources, image2282, "image2282"); GLADE_HOOKUP_OBJECT (popup_sources, separator34, "separator34"); GLADE_HOOKUP_OBJECT (popup_sources, popup_sources_copy_url, "popup_sources_copy_url"); - GLADE_HOOKUP_OBJECT (popup_sources, image2120, "image2120"); + GLADE_HOOKUP_OBJECT (popup_sources, image2283, "image2283"); GLADE_HOOKUP_OBJECT (popup_sources, popup_sources_browse_host, "popup_sources_browse_host"); - GLADE_HOOKUP_OBJECT (popup_sources, image2121, "image2121"); + GLADE_HOOKUP_OBJECT (popup_sources, image2284, "image2284"); GLADE_HOOKUP_OBJECT (popup_sources, popup_sources_connect, "popup_sources_connect"); - GLADE_HOOKUP_OBJECT (popup_sources, image2122, "image2122"); + GLADE_HOOKUP_OBJECT (popup_sources, image2285, "image2285"); GLADE_HOOKUP_OBJECT (popup_sources, popup_sources_push, "popup_sources_push"); + GLADE_HOOKUP_OBJECT (popup_sources, image2286, "image2286"); GLADE_HOOKUP_OBJECT (popup_sources, separator31, "separator31"); GLADE_HOOKUP_OBJECT (popup_sources, popup_sources_config_cols, "popup_sources_config_cols"); - GLADE_HOOKUP_OBJECT (popup_sources, image2123, "image2123"); + GLADE_HOOKUP_OBJECT (popup_sources, image2287, "image2287"); return popup_sources; } @@ -17151,3 +17363,50 @@ return popup_tray; } +GtkWidget* +create_dlg_glossary (void) +{ + GtkWidget *dlg_glossary; + GdkPixbuf *dlg_glossary_icon_pixbuf; + GtkWidget *scrolledwindow902; + GtkWidget *textview_glossary; + + dlg_glossary = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_widget_set_name (dlg_glossary, "dlg_glossary"); + gtk_window_set_position (GTK_WINDOW (dlg_glossary), GTK_WIN_POS_MOUSE); + gtk_window_set_default_size (GTK_WINDOW (dlg_glossary), 600, 400); + dlg_glossary_icon_pixbuf = create_pixbuf ("icon.48x48.xpm"); + if (dlg_glossary_icon_pixbuf) + { + gtk_window_set_icon (GTK_WINDOW (dlg_glossary), dlg_glossary_icon_pixbuf); + g_object_unref (dlg_glossary_icon_pixbuf); + } + + scrolledwindow902 = gtk_scrolled_window_new (NULL, NULL); + gtk_widget_set_name (scrolledwindow902, "scrolledwindow902"); + gtk_widget_show (scrolledwindow902); + gtk_container_add (GTK_CONTAINER (dlg_glossary), scrolledwindow902); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow902), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + + textview_glossary = gtk_text_view_new (); + gtk_widget_set_name (textview_glossary, "textview_glossary"); + gtk_widget_show (textview_glossary); + gtk_container_add (GTK_CONTAINER (scrolledwindow902), textview_glossary); + gtk_text_view_set_editable (GTK_TEXT_VIEW (textview_glossary), FALSE); + gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (textview_glossary), GTK_WRAP_WORD); + gtk_text_view_set_left_margin (GTK_TEXT_VIEW (textview_glossary), 4); + gtk_text_view_set_right_margin (GTK_TEXT_VIEW (textview_glossary), 4); + + g_signal_connect ((gpointer) dlg_glossary, "delete_event", + G_CALLBACK (on_dlg_glossary_delete_event), + NULL); + + /* Store pointers to all widgets, for use by lookup_widget(). */ + GLADE_HOOKUP_OBJECT_NO_REF (dlg_glossary, dlg_glossary, "dlg_glossary"); + GLADE_HOOKUP_OBJECT (dlg_glossary, scrolledwindow902, "scrolledwindow902"); + GLADE_HOOKUP_OBJECT (dlg_glossary, textview_glossary, "textview_glossary"); + + gtk_widget_grab_focus (textview_glossary); + return dlg_glossary; +} +
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/interface-glade.h -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/interface-glade.h
Changed
@@ -44,3 +44,4 @@ GtkWidget* create_dlg_ancient (void); GtkWidget* create_popup_sources (void); GtkWidget* create_popup_tray (void); +GtkWidget* create_dlg_glossary (void);
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/monitor.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/monitor.c
Changed
@@ -99,11 +99,11 @@ /* If the query is empty and we have a SHA1 extension, * we print a urn:sha1-query instead. */ concat_strings(buf, sizeof buf, - QUERY_SHA1 == type ? "urn:sha1:" : "", item, (void *) 0); + QUERY_SHA1 == type ? "urn:sha1:" : "", item, NULL_PTR); s = lazy_unknown_to_utf8_normalized(buf, UNI_NORM_GUI, &charset_ptr); if (s != buf) { - dbuf = g_strconcat("<", charset_ptr, "> ", s, (void *) 0); + dbuf = g_strconcat("<", charset_ptr, "> ", s, NULL_PTR); s = dbuf; } else { dbuf = NULL; @@ -161,16 +161,16 @@ /* Create a column, associating the "text" attribute of the * cell_renderer to the first column of the model */ renderer = gtk_cell_renderer_text_new(); - g_object_set(renderer, "ypad", GUI_CELL_RENDERER_YPAD, (void *) 0); + g_object_set(renderer, "ypad", GUI_CELL_RENDERER_YPAD, NULL_PTR); column = gtk_tree_view_column_new_with_attributes - (_("Query"), renderer, "text", QUERY_COLUMN, (void *) 0); + (_("Query"), renderer, "text", QUERY_COLUMN, NULL_PTR); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); /* Add the column to the view. */ gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); gui_signal_connect(tree, - "button_press_event", on_treeview_monitor_button_press_event, NULL); + "button_press_event", on_treeview_monitor_button_press_event, NULL_PTR); drag_attach_text(GTK_WIDGET(tree), monitor_gui_get_text); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/monitor_cb.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/monitor_cb.c
Changed
@@ -71,7 +71,7 @@ GtkTreeIter *iter, gpointer unused_data) { char *text = NULL; - + (void) unused_path; (void) unused_data;
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/nodes.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/nodes.c
Changed
@@ -46,12 +46,15 @@ #include "if/gui_property.h" #include "if/gui_property_priv.h" #include "if/bridge/ui2c.h" +#include "if/core/sockets.h" /* For SOCK_F_G2 */ #include "lib/atoms.h" #include "lib/concat.h" -#include "lib/glib-missing.h" +#include "lib/hset.h" +#include "lib/htable.h" #include "lib/iso3166.h" #include "lib/nid.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/utf8.h" #include "lib/walloc.h" @@ -63,17 +66,17 @@ * changed. By using this the number of updates to the gui can be * significantly reduced. */ -static GHashTable *ht_node_info_changed; -static GHashTable *ht_node_flags_changed; +static hset_t *ht_node_info_changed; +static hset_t *ht_node_flags_changed; static GtkTreeView *treeview_nodes; static GtkListStore *nodes_model; /* hash table for fast handle -> GtkTreeIter mapping */ -static GHashTable *nodes_handles; +static htable_t *nodes_handles; /* list of all node handles */ -static GHashTable *ht_pending_lookups; +static hset_t *ht_pending_lookups; static tree_view_motion_t *tvm_nodes; @@ -86,17 +89,17 @@ static void nodes_gui_node_info_changed(const struct nid *); static void nodes_gui_node_flags_changed(const struct nid *); -static gboolean -remove_item(GHashTable *ht, const struct nid *node_id) +static gboolean +remove_item(hset_t *hs, const struct nid *node_id) { - gpointer orig_key; + void *orig_key; - g_return_val_if_fail(ht, FALSE); + g_return_val_if_fail(hs, FALSE); g_return_val_if_fail(node_id, FALSE); - - orig_key = g_hash_table_lookup(ht, node_id); + + orig_key = hset_lookup(hs, node_id); if (orig_key) { - g_hash_table_remove(ht, orig_key); + hset_remove(hs, orig_key); nid_unref(orig_key); return TRUE; } else { @@ -111,7 +114,7 @@ * the foreground color for the whole row. */ static void -add_column(GtkTreeView *tree, const gchar *title, +add_column(GtkTreeView *tree, const gchar *title, GtkTreeCellDataFunc cell_data_func, gpointer udata) { GtkCellRenderer *renderer; @@ -121,10 +124,10 @@ g_object_set(G_OBJECT(renderer), "xpad", GUI_CELL_RENDERER_XPAD, "ypad", GUI_CELL_RENDERER_YPAD, - (void *) 0); + NULL_PTR); - column = gtk_tree_view_column_new_with_attributes(title, renderer, - (void *) 0); + column = + gtk_tree_view_column_new_with_attributes(title, renderer, NULL_PTR); g_object_set(G_OBJECT(column), "title", title, "fixed-width", 1, @@ -132,8 +135,8 @@ "reorderable", TRUE, "resizable", TRUE, "sizing", GTK_TREE_VIEW_COLUMN_FIXED, - (void *) 0); - + NULL_PTR); + if (cell_data_func != NULL) gtk_tree_view_column_set_cell_data_func(column, renderer, cell_data_func, udata, NULL); @@ -169,23 +172,20 @@ WFREE(data); } -static gboolean -free_node_id(gpointer key, gpointer value, gpointer unused_udata) +static void +free_node_id(const void *key, void *unused_udata) { - g_assert(key == value); (void) unused_udata; nid_unref(key); - return TRUE; } -static gboolean -free_node_data(gpointer unused_key, gpointer value, gpointer unused_udata) +static void +free_node_data(const void *unused_key, void *value, void *unused_udata) { (void) unused_key; (void) unused_udata; - + node_data_free(value); - return TRUE; } static GtkListStore * @@ -195,7 +195,7 @@ GtkListStore *store; columns0 = G_TYPE_POINTER; - store = gtk_list_store_newv(G_N_ELEMENTS(columns), columns); + store = gtk_list_store_newv(N_ITEMS(columns), columns); return store; } @@ -251,9 +251,9 @@ attr, s, "foreground-gdk", data->fg, "foreground-set", TRUE, - (void *) 0); + NULL_PTR); } else { - g_object_set(cell, attr, s, (void *) 0); + g_object_set(cell, attr, s, NULL_PTR); } } @@ -298,7 +298,7 @@ gtk_tree_selection_set_mode(gtk_tree_view_get_selection(tree), GTK_SELECTION_MULTIPLE); - for (i = 0; i < G_N_ELEMENTS(columns); i++) + for (i = 0; i < N_ITEMS(columns); i++) add_column(tree, _(columnsi.title), cell_renderer_func, GUINT_TO_POINTER(columnsi.id)); } @@ -323,7 +323,7 @@ static inline struct node_data * find_node(const struct nid *node_id) { - return g_hash_table_lookup(nodes_handles, node_id); + return htable_lookup(nodes_handles, node_id); } /** @@ -343,7 +343,7 @@ g_assert(data->node_id == info->node_id); if (guc_node_get_status(info->node_id, &status)) { - gm_snprintf(data->version, sizeof data->version, "%u.%u", + str_bprintf(data->version, sizeof data->version, "%u.%u", info->proto_major, info->proto_minor); atom_str_free_null(&data->user_agent); data->user_agent = info->vendor ? atom_str_get(info->vendor) : NULL; @@ -358,13 +358,13 @@ nodes_gui_update_node_flags(struct node_data *data, gnet_node_flags_t *flags) { gboolean ultra; - + g_assert(NULL != data); concat_strings(data->flags, sizeof data->flags, - "<tt>", guc_node_flags_to_string(flags), "</tt>", (void *) 0); + "<tt>", guc_node_flags_to_string(flags), "</tt>", NULL_PTR); - ultra = NODE_P_ULTRA == flags->peermode; + ultra = NODE_P_ULTRA == flags->peermode || NODE_P_G2HUB == flags->peermode; data->fg = &(gtk_widget_get_style(GTK_WIDGET(treeview_nodes)) ->fgultra ? GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE); } @@ -380,7 +380,7 @@ if (path) { GtkTreeIter parent; - + model = gtk_tree_view_get_model(tv); if (!gtk_tree_model_get_iter(model, &iter, path)) { g_warning("gtk_tree_model_get_iter() failed"); @@ -401,7 +401,7 @@ guc_node_fill_info(data->node_id, &info); g_assert(info.node_id == data->node_id); - gm_snprintf(text, sizeof text, + str_bprintf(text, sizeof text, "%s %s\n" "%s %s (%s)\n" "%s %s (%s)\n" @@ -463,13 +463,13 @@ guc_node_fill_info(node_id, &info); g_assert(node_id == info.node_id); - + addr = info.addr; port = info.port; guc_node_clear_info(&info); WFREE_NULL(data->host, data->host_size); - + if (hostname) { const gchar *host; gchar *to_free; @@ -481,11 +481,11 @@ to_free = locale_to_utf8_normalized(hostname, UNI_NORM_GUI); host = to_free; } - + data->host_size = w_concat_strings(&data->host, host, " (", host_addr_port_to_string(addr, port), ")", - (void *) 0); + NULL_PTR); G_FREE_NULL(to_free); } else { @@ -493,7 +493,7 @@ _("Reverse lookup for %s failed"), host_addr_to_string(addr)); data->host_size = w_concat_strings(&data->host, host_addr_port_to_string(addr, port), - (void *) 0); + NULL_PTR); } finish: @@ -538,7 +538,7 @@ nodes_gui_init(void) { GtkTreeView *tv; - + tv = GTK_TREE_VIEW(gui_main_window_lookup( "treeview_nodes")); treeview_nodes = tv; @@ -546,10 +546,10 @@ tree_view_restore_visibility(tv, PROP_NODES_COL_VISIBLE); tree_view_set_fixed_height_mode(tv, TRUE); - nodes_handles = g_hash_table_new(nid_hash, nid_equal); - ht_node_info_changed = g_hash_table_new(nid_hash, nid_equal); - ht_node_flags_changed = g_hash_table_new(nid_hash, nid_equal); - ht_pending_lookups = g_hash_table_new(nid_hash, nid_equal); + nodes_handles = htable_create_any(nid_hash, nid_hash2, nid_equal); + ht_node_info_changed = hset_create_any(nid_hash, nid_hash2, nid_equal); + ht_node_flags_changed = hset_create_any(nid_hash, nid_hash2, nid_equal); + ht_pending_lookups = hset_create_any(nid_hash, nid_hash2, nid_equal); guc_node_add_node_added_listener(nodes_gui_node_added); guc_node_add_node_removed_listener(nodes_gui_node_removed); @@ -585,17 +585,17 @@ nodes_model = NULL; gtk_tree_view_set_model(treeview_nodes, NULL); - g_hash_table_foreach_remove(nodes_handles, free_node_data, NULL); - gm_hash_table_destroy_null(&nodes_handles); + htable_foreach(nodes_handles, free_node_data, NULL); + htable_free_null(&nodes_handles); - g_hash_table_foreach_remove(ht_node_info_changed, free_node_id, NULL); - gm_hash_table_destroy_null(&ht_node_info_changed); + hset_foreach(ht_node_info_changed, free_node_id, NULL); + hset_free_null(&ht_node_info_changed); - g_hash_table_foreach_remove(ht_node_flags_changed, free_node_id, NULL); - gm_hash_table_destroy_null(&ht_node_flags_changed); + hset_foreach(ht_node_flags_changed, free_node_id, NULL); + hset_free_null(&ht_node_flags_changed); - g_hash_table_foreach_remove(ht_pending_lookups, free_node_id, NULL); - gm_hash_table_destroy_null(&ht_pending_lookups); + hset_foreach(ht_pending_lookups, free_node_id, NULL); + hset_free_null(&ht_pending_lookups); } /** @@ -620,7 +620,7 @@ g_assert(nid_equal(node_id, data->node_id)); gtk_list_store_remove(nodes_model, &data->iter); - g_hash_table_remove(nodes_handles, data->node_id); + htable_remove(nodes_handles, data->node_id); node_data_free(data); } } @@ -636,7 +636,7 @@ gnet_node_flags_t flags; g_return_if_fail(info); - g_return_if_fail(!g_hash_table_lookup(nodes_handles, info->node_id)); + g_return_if_fail(!htable_contains(nodes_handles, info->node_id)); WALLOC(data); *data = zero_data; @@ -646,14 +646,14 @@ data->country = info->country; data->host_size = w_concat_strings(&data->host, host_addr_port_to_string(info->addr, info->port), - (void *) 0); - gm_snprintf(data->version, sizeof data->version, "%u.%u", + NULL_PTR); + str_bprintf(data->version, sizeof data->version, "%u.%u", info->proto_major, info->proto_minor); guc_node_fill_flags(data->node_id, &flags); nodes_gui_update_node_flags(data, &flags); - gm_hash_table_insert_const(nodes_handles, data->node_id, data); + htable_insert(nodes_handles, data->node_id, data); gtk_list_store_append(nodes_model, &data->iter); gtk_list_store_set(nodes_model, &data->iter, 0, data, (-1)); @@ -661,7 +661,7 @@ } static inline void -update_row(gpointer key, gpointer value, gpointer user_data) +update_row(const void *key, void *value, void *user_data) { struct node_data *data = value; time_t *now_ptr = user_data, now = *now_ptr; @@ -700,10 +700,10 @@ data->uptime = delta_time(now, status.up_date); /* Update the status line */ - { + { const gchar *s; size_t size; - + s = nodes_gui_common_status_str(&status); size = 1 + strlen(s); if (size > data->info_size) { @@ -733,7 +733,7 @@ nodes_gui_update_display(time_t now) { g_object_freeze_notify(G_OBJECT(treeview_nodes)); - g_hash_table_foreach(nodes_handles, update_row, &now); + htable_foreach(nodes_handles, update_row, &now); g_object_thaw_notify(G_OBJECT(treeview_nodes)); } @@ -750,7 +750,7 @@ nodes_gui_node_removed(const struct nid *node_id) { if (GUI_PROPERTY(gui_debug) >= 5) - g_debug("nodes_gui_node_removed(%s)\n", nid_to_string(node_id)); + g_debug("%s(%s)", G_STRFUNC, nid_to_string(node_id)); nodes_gui_remove_node(node_id); } @@ -766,7 +766,7 @@ gnet_node_info_t *info; if (GUI_PROPERTY(gui_debug) >= 5) - g_debug("nodes_gui_node_added(%s)\n", nid_to_string(node_id)); + g_debug("%s(%s)", G_STRFUNC, nid_to_string(node_id)); info = guc_node_get_info(node_id); if (info) { @@ -784,9 +784,9 @@ static void nodes_gui_node_info_changed(const struct nid *node_id) { - if (!g_hash_table_lookup(ht_node_info_changed, node_id)) { + if (!hset_contains(ht_node_info_changed, node_id)) { const struct nid *key = nid_ref(node_id); - gm_hash_table_insert_const(ht_node_info_changed, key, key); + hset_insert(ht_node_info_changed, key); } } @@ -799,9 +799,9 @@ static void nodes_gui_node_flags_changed(const struct nid *node_id) { - if (!g_hash_table_lookup(ht_node_flags_changed, node_id)) { + if (!hset_contains(ht_node_flags_changed, node_id)) { const struct nid *key = nid_ref(node_id); - gm_hash_table_insert_const(ht_node_flags_changed, key, key); + hset_insert(ht_node_flags_changed, key); } } @@ -836,7 +836,7 @@ gtk_tree_model_get(model, iter, 0, &data, (-1)); g_assert(NULL != find_node(data->node_id)); - if (NULL != g_hash_table_lookup(ht_pending_lookups, data->node_id)) + if (hset_contains(ht_pending_lookups, data->node_id)) return; guc_node_fill_info(data->node_id, &info); @@ -849,9 +849,9 @@ data->host_size = w_concat_strings(&data->host, _("Reverse lookup in progress..."), " (", host_addr_port_to_string(info.addr, info.port), ")", - (void *) 0); + NULL_PTR); - gm_hash_table_insert_const(ht_pending_lookups, key, key); + hset_insert(ht_pending_lookups, key); adns_reverse_lookup(info.addr, host_lookup_callback, deconstify_gpointer(nid_ref(key))); } @@ -882,12 +882,12 @@ (void) unused_path; (void) unused_data; - + gtk_tree_model_get(model, iter, 0, &data, (-1)); info = guc_node_get_info(data->node_id); if (!info->is_pseudo) { search_gui_new_browse_host(NULL, info->gnet_addr, info->gnet_port, - &info->gnet_guid, NULL, 0); + &info->gnet_guid, NULL, info->is_g2 ? SOCK_F_G2 : 0); } guc_node_free_info(info); } @@ -902,7 +902,7 @@ selection = gtk_tree_view_get_selection(tv); gtk_tree_selection_selected_foreach(selection, nodes_gui_browse_selected_helper, NULL); - + } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/pbarcellrenderer.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/pbarcellrenderer.c
Changed
@@ -66,7 +66,8 @@ * This widget is included in GTK+ since 2.5.0 */ -#include "lib/glib-missing.h" +#include "lib/str.h" + #include "lib/override.h" /* Must be the last header included */ static void gtk_cell_renderer_progress_init(GtkCellRendererProgress *); @@ -383,11 +384,11 @@ gdk_draw_rectangle(window, gc, TRUE, x + 2, y + 2, perc_w, h - 4); val = cellprogress->priv->value; - gm_snprintf(text, sizeof text, "%d", val); + str_bprintf(text, sizeof text, "%d", val); layout = gtk_widget_create_pango_layout(widget, text); pango_layout_get_pixel_extents(layout, NULL, &logical_rect); g_object_unref(G_OBJECT (layout)); - gm_snprintf(text, sizeof text, "%d %%", val); + str_bprintf(text, sizeof text, "%d %%", val); layout = gtk_widget_create_pango_layout(widget, text); pos = (w - logical_rect.width) / 2;
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/pbarcellrenderer.h -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/pbarcellrenderer.h
Changed
@@ -85,7 +85,7 @@ GtkCellRendererClass parent_class; }; -GtkType gtk_cell_renderer_progress_get_type (void) G_GNUC_PURE; +GtkType gtk_cell_renderer_progress_get_type (void) G_PURE; GtkCellRenderer* gtk_cell_renderer_progress_new(void); G_END_DECLS
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/search.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/search.c
Changed
@@ -36,7 +36,6 @@ #include "search_cb.h" -#include "gtk/bitzi.h" #include "gtk/columns.h" #include "gtk/drag.h" #include "gtk/misc.h" @@ -44,16 +43,18 @@ #include "gtk/settings.h" #include "gtk/statusbar.h" +#include "column_sort.h" + #include "if/gui_property.h" #include "if/gui_property_priv.h" #include "if/bridge/ui2c.h" -#include "if/core/bitzi.h" #include "if/core/sockets.h" #include "lib/ascii.h" #include "lib/atoms.h" -#include "lib/glib-missing.h" #include "lib/halloc.h" +#include "lib/hset.h" +#include "lib/htable.h" #include "lib/iso3166.h" #include "lib/mime_type.h" #include "lib/misc.h" @@ -67,6 +68,7 @@ #include "lib/override.h" /* Must be the last header included */ static GtkTreeView *tree_view_search; +static struct sorting_context search_list_sort; /** For cyclic updates of the tooltip. */ static tree_view_motion_t *tvm_search; @@ -75,7 +77,6 @@ GtkTreeIter iter; record_t *record; - const gchar *meta; /**< Atom */ guint children; /**< count of children */ gnet_search_t sh; /**< Search handle */ enum gui_color color; @@ -148,7 +149,8 @@ struct synchronize_search_list ctx; ctx.model = model; - gtk_tree_model_get_iter_first(model, &ctx.iter); + if (!gtk_tree_model_get_iter_first(model, &ctx.iter)) + return; search_gui_synchronize_search_list(synchronize_search_list_callback, &ctx); } @@ -166,13 +168,15 @@ on_search_list_column_clicked(GtkTreeViewColumn *column, gpointer unused_udata) { (void) unused_udata; - + + column_sort_tristate(column, &search_list_sort); + search_gui_synchronize_list(gtk_tree_view_get_model( GTK_TREE_VIEW(column->tree_view))); } static void -cell_renderer(GtkTreeViewColumn *column, GtkCellRenderer *cell, +cell_renderer(GtkTreeViewColumn *column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer udata) { const struct result_data *data; @@ -198,9 +202,6 @@ case c_sr_mime: text = mime_type_to_string(mime_type_from_extension(data->record->ext)); break; - case c_sr_meta: - text = data->meta; - break; case c_sr_vendor: if (!(ST_LOCAL & rs->status)) text = vendor_code_get_name(rs->vendor); @@ -227,7 +228,9 @@ break; case c_sr_protocol: if (!((ST_LOCAL | ST_BROWSE) & rs->status)) - text = ST_UDP & rs->status ? "UDP" : "TCP"; + text = ST_UDP & rs->status ? + (ST_SR_UDP & rs->status ? N_("UDP (semi-reliable)") : "UDP") + : "TCP"; break; case c_sr_hops: if (!((ST_LOCAL | ST_BROWSE) & rs->status)) @@ -276,14 +279,14 @@ "text", text, "foreground-gdk", gui_color_get(data->color), "background-gdk", gui_color_get(GUI_COLOR_BACKGROUND), - (void *) 0); + NULL_PTR); } static GtkCellRenderer * create_cell_renderer(gfloat xalign) { GtkCellRenderer *renderer; - + renderer = gtk_cell_renderer_text_new(); gtk_cell_renderer_text_set_fixed_height_from_font( GTK_CELL_RENDERER_TEXT(renderer), TRUE); @@ -291,7 +294,7 @@ "mode", GTK_CELL_RENDERER_MODE_INERT, "xalign", xalign, "ypad", (guint) GUI_CELL_RENDERER_YPAD, - (void *) 0); + NULL_PTR); return renderer; } @@ -313,16 +316,16 @@ g_object_set(G_OBJECT(renderer), "foreground-set", TRUE, "background-set", TRUE, - (void *) 0); + NULL_PTR); if (cell_data_func) { - column = gtk_tree_view_column_new_with_attributes(name, renderer, - (void *) 0); + column = + gtk_tree_view_column_new_with_attributes(name, renderer, NULL_PTR); gtk_tree_view_column_set_cell_data_func(column, renderer, cell_data_func, GUINT_TO_POINTER(id), NULL); } else { column = gtk_tree_view_column_new_with_attributes(name, renderer, - "text", id, (void *) 0); + "text", id, NULL_PTR); } if (fg_col >= 0) @@ -331,15 +334,15 @@ if (bg_col >= 0) gtk_tree_view_column_add_attribute(column, renderer, "background-gdk", bg_col); - + g_object_set(column, "fixed-width", 100, "min-width", 1, "reorderable", FALSE, "resizable", TRUE, "sizing", GTK_TREE_VIEW_COLUMN_FIXED, - (void *) 0); - + NULL_PTR); + gtk_tree_view_append_column(tv, column); return column; @@ -351,7 +354,7 @@ struct result_data *parent; /* NOTE: rd->record is not checked due to find_parent2() */ - parent = g_hash_table_lookup(search->parents, rd); + parent = htable_lookup(search->parents, rd); if (parent) { record_check(parent->record); } @@ -377,10 +380,8 @@ { record_check(rd->record); - atom_str_free_null(&rd->meta); - - g_assert(g_hash_table_lookup(search->dups, rd->record) != NULL); - g_hash_table_remove(search->dups, rd->record); + g_assert(hset_contains(search->dups, rd->record)); + hset_remove(search->dups, rd->record); search_gui_unref_record(rd->record); search_gui_unref_record(rd->record); @@ -407,10 +408,10 @@ if (rc->sha1) { struct result_data *parent; - + parent = find_parent(search, rd); if (rd == parent) { - g_hash_table_remove(search->parents, rd); + htable_remove(search->parents, rd); } else if (parent) { parent->children--; search_gui_set_data(model, parent); @@ -445,14 +446,16 @@ search_gui_clear_tree(search_t *search) { GtkTreeModel *model; + bool stopped; - search_gui_start_massive_update(search); + stopped = search_gui_start_massive_update(search); model = gtk_tree_view_get_model(GTK_TREE_VIEW(search->tree)); gtk_tree_model_foreach(model, prepare_remove_record, search); gtk_tree_store_clear(GTK_TREE_STORE(model)); - search_gui_end_massive_update(search); + if (stopped) + search_gui_end_massive_update(search); } /** @@ -466,8 +469,8 @@ search_gui_clear_tree(search); search_gui_clear_queue(search); - g_assert(0 == g_hash_table_size(search->dups)); - g_assert(0 == g_hash_table_size(search->parents)); + g_assert(0 == hset_count(search->dups)); + g_assert(0 == htable_count(search->parents)); } static gboolean @@ -508,79 +511,38 @@ if ( search->sort && - SORT_NONE != search->sort_order && - UNSIGNED(search->sort_col) < SEARCH_RESULTS_VISIBLE_COLUMNS + SORT_NONE != search->sorting.s_order && + UNSIGNED(search->sorting.s_column) < SEARCH_RESULTS_VISIBLE_COLUMNS ) { GtkTreeModel *model; GtkSortType order; model = gtk_tree_view_get_model(GTK_TREE_VIEW(search->tree)); - order = SORT_ASC == search->sort_order + order = SORT_ASC == search->sorting.s_order ? GTK_SORT_ASCENDING : GTK_SORT_DESCENDING; gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model), - search->sort_col, order); + search->sorting.s_column, order); } else { search_gui_disable_sort(search); } } -/* - * Here we enforce a tri-state sorting. Normally, Gtk+ would only - * switch between ascending and descending but never switch back - * to the unsorted state. - * - * +--> sort ascending -> sort descending -> unsorted -+ - * | | - * +-----------------------<---------------------------+ - */ - -/* - * "order" is set to the current sort-order, not the previous one - * i.e., Gtk+ has already changed the order +/** + * Enforce a tri-state sorting. */ static void on_tree_view_search_results_click_column(GtkTreeViewColumn *column, void *udata) { struct search *search = udata; - GtkTreeModel *model; - GtkTreeSortable *sortable; - int sort_col; - /* The default treeview is empty */ - if (!search) - return; - - model = gtk_tree_view_get_model(GTK_TREE_VIEW(column->tree_view)); - sortable = GTK_TREE_SORTABLE(model); - gtk_tree_sortable_get_sort_column_id(sortable, &sort_col, NULL); - - /* If the user switched to another sort column, reset the sort order. */ - if (search->sort_col != sort_col) { - search->sort_order = SORT_NONE; - } - - search->sort_col = sort_col; + if (NULL == search) + return; /* The default treeview is empty */ - /* The search has to keep state about the sort order itself because - * Gtk+ knows only ASCENDING/DESCENDING but not NONE (unsorted). */ - switch (search->sort_order) { - case SORT_NONE: - case SORT_NO_COL: - search->sort_order = SORT_ASC; - break; - case SORT_ASC: - search->sort_order = SORT_DESC; - break; - case SORT_DESC: - search->sort_order = SORT_NONE; - break; - } - search_gui_enable_sort(search); + column_sort_tristate(column, &search->sorting); } - char * search_gui_get_local_file_url(GtkWidget *widget) { @@ -596,11 +558,11 @@ data = get_result_data(model, &iter); if (!(ST_LOCAL & data->record->results_set->status)) return NULL; - + pathname = data->record->tag; if (NULL == pathname) return NULL; - + return url_from_absolute_path(pathname); } @@ -631,11 +593,12 @@ { GtkListStore *model; GtkTreeIter iter; - + g_assert(sch); g_assert(NULL == sch->parents); - sch->parents = g_hash_table_new(search_gui_file_hash, search_gui_file_eq); + sch->parents = htable_create_any(search_gui_file_hash, NULL, + search_gui_file_eq); g_assert(NULL == sch->queue); sch->queue = slist_new(); @@ -721,13 +684,6 @@ } static int -search_gui_cmp_meta(const struct result_data *a, const struct result_data *b) -{ - return search_gui_cmp_strings(a->meta, b->meta); -} - - -static int search_gui_cmp_country(const struct result_data *a, const struct result_data *b) { return SEARCH_GUI_CMP(a, b, record->results_set->country); @@ -748,7 +704,7 @@ static int search_gui_cmp_route(const struct result_data *a, const struct result_data *b) { - + return host_addr_cmp(a->record->results_set->last_hop, b->record->results_set->last_hop); } @@ -803,7 +759,7 @@ const struct result_data *a, *b; enum c_sr_columns column; int ret = 0; - + column = GPOINTER_TO_UINT(user_data); a = get_result_data(model, iter1); b = get_result_data(model, iter2); @@ -811,7 +767,6 @@ case c_sr_filename: ret = search_gui_cmp_filename(a, b); break; case c_sr_ext: ret = search_gui_cmp_ext(a, b); break; case c_sr_mime: ret = search_gui_cmp_mime(a, b); break; - case c_sr_meta: ret = search_gui_cmp_meta(a, b); break; case c_sr_vendor: ret = search_gui_cmp_vendor(a, b); break; case c_sr_info: ret = search_gui_cmp_info(a, b); break; case c_sr_size: ret = search_gui_cmp_size(a, b); break; @@ -940,12 +895,6 @@ rd->iter = *iter; rd->children = children; - /* - * Keep metadata from the parent row (we swapped rd and child_data). - */ - - atom_str_change(&rd->meta, child_data->meta); - /* And remove the child's row */ iter = &child; } else { @@ -1070,16 +1019,17 @@ }; guint i; - STATIC_ASSERT(SEARCH_LIST_VISIBLE_COLUMNS == G_N_ELEMENTS(columns)); + STATIC_ASSERT(SEARCH_LIST_VISIBLE_COLUMNS == N_ITEMS(columns)); - for (i = 0; i < G_N_ELEMENTS(columns); i++) { + for (i = 0; i < N_ITEMS(columns); i++) { GtkTreeViewColumn *column; - + column = add_column(tv, _(columnsi.title), columnsi.id, columnsi.align, NULL, c_sl_fg, c_sl_bg); gtk_tree_view_column_set_sort_column_id(column, columnsi.id); - gui_signal_connect_after(column, - "clicked", on_search_list_column_clicked, NULL); + + column_sort_tristate_register(column, + on_search_list_column_clicked, NULL); } tree_view_restore_widths(tv, PROP_SEARCH_LIST_COL_WIDTHS); } @@ -1112,29 +1062,29 @@ g_return_if_fail(tv); model = GTK_TREE_MODEL( - gtk_list_store_new(G_N_ELEMENTS(tab), + gtk_list_store_new(N_ITEMS(tab), G_TYPE_STRING, G_TYPE_STRING)); gtk_tree_view_set_model(tv, model); g_object_unref(model); - for (i = 0; i < G_N_ELEMENTS(tab); i++) { + for (i = 0; i < N_ITEMS(tab); i++) { GtkTreeViewColumn *column; GtkCellRenderer *renderer; - + renderer = create_cell_renderer(tabi.xalign); g_object_set(G_OBJECT(renderer), "editable", tabi.editable, - (void *) 0); + NULL_PTR); column = gtk_tree_view_column_new_with_attributes(tabi.title, - renderer, "text", i, (void *) 0); + renderer, "text", i, NULL_PTR); g_object_set(column, "min-width", 1, "resizable", TRUE, "sizing", (0 == i) ? GTK_TREE_VIEW_COLUMN_AUTOSIZE : GTK_TREE_VIEW_COLUMN_FIXED, - (void *) 0); + NULL_PTR); gtk_tree_view_append_column(tv, column); } @@ -1150,9 +1100,9 @@ GtkListStore *store; guint i; - STATIC_ASSERT(c_sl_num == G_N_ELEMENTS(columns)); + STATIC_ASSERT(c_sl_num == N_ITEMS(columns)); #define SET(c, x) case (c): columnsi = (x); break - for (i = 0; i < G_N_ELEMENTS(columns); i++) { + for (i = 0; i < N_ITEMS(columns); i++) { switch (i) { SET(c_sl_name, G_TYPE_STRING); SET(c_sl_hit, G_TYPE_INT); @@ -1166,7 +1116,7 @@ } #undef SET - store = gtk_list_store_newv(G_N_ELEMENTS(columns), columns); + store = gtk_list_store_newv(N_ITEMS(columns), columns); return GTK_TREE_MODEL(store); } @@ -1174,11 +1124,11 @@ search_list_tree_view_init(void) { GtkTreeView *tv; - + tv = GTK_TREE_VIEW(gui_main_window_lookup("tree_view_search")); tree_view_search = tv; - gtk_tree_view_set_reorderable(tv, TRUE); + gtk_tree_view_set_reorderable(tv, TRUE); gtk_tree_selection_set_mode(gtk_tree_view_get_selection(tv), GTK_SELECTION_MULTIPLE); gtk_tree_view_set_model(tv, create_searches_model()); @@ -1227,10 +1177,11 @@ { GtkTreeIter iter; GtkTreeModel *model; + bool stopped; g_return_if_fail(search); - search_gui_start_massive_update(search); + stopped = search_gui_start_massive_update(search); if (search_gui_get_current_search() == search) { GtkTreeView *tv = GTK_TREE_VIEW(search->tree); @@ -1246,6 +1197,9 @@ if (tree_find_iter_by_data(model, c_sl_sch, search, &iter)) { gtk_list_store_remove(GTK_LIST_STORE(model), &iter); } + + if (stopped) + search_gui_end_massive_update(search); } void @@ -1290,8 +1244,9 @@ gtk_tree_sortable_set_sort_func( GTK_TREE_SORTABLE(gtk_tree_view_get_model(tv)), i, search_gui_cmp, uint_to_pointer(i), NULL); - gui_signal_connect_after(gtk_tree_view_get_column(tv, i), - "clicked", on_tree_view_search_results_click_column, search); + + column_sort_tristate_register(column, + on_tree_view_search_results_click_column, search); } } } @@ -1347,7 +1302,7 @@ { const struct result_data *rd; - + rd = get_result_data(model, iter); g_return_val_if_fail(NULL != rd, !found); g_return_val_if_fail(NULL != rd->record->utf8_name, !found); @@ -1366,6 +1321,7 @@ GtkTreeView *tv; GtkStyle *style; GdkColor *fg, *bg; + bool downloading; if (NULL == search) return; @@ -1376,14 +1332,20 @@ return; style = gtk_widget_get_style(GTK_WIDGET(tv)); - if (search->unseen_items > 0) { - fg = &style->fgGTK_STATE_ACTIVE; - bg = &style->bgGTK_STATE_ACTIVE; - } else if (search_gui_is_enabled(search)) { - fg = NULL; - bg = NULL; + downloading = 0 != search_gui_download_count(search); + + if (search_gui_is_enabled(search)) { + if (search->unseen_items > 0) { + fg = downloading ? gui_color_get(GUI_COLOR_DOWNLOADING) : + &style->fgGTK_STATE_ACTIVE; + bg = &style->bgGTK_STATE_ACTIVE; + } else { + fg = downloading ? gui_color_get(GUI_COLOR_DOWNLOADING) : NULL; + bg = NULL; + } } else { - fg = &style->fgGTK_STATE_INSENSITIVE; + fg = downloading ? gui_color_get(GUI_COLOR_DOWNLOADING) : + &style->fgGTK_STATE_INSENSITIVE; bg = &style->bgGTK_STATE_INSENSITIVE; } @@ -1417,17 +1379,23 @@ } } -void +bool search_gui_start_massive_update(struct search *search) { GtkTreeModel *model; - g_return_if_fail(search); + g_return_val_if_fail(search, FALSE); + + if (search->frozen) + return FALSE; model = gtk_tree_view_get_model(GTK_TREE_VIEW(search->tree)); g_object_freeze_notify(G_OBJECT(search->tree)); g_object_freeze_notify(G_OBJECT(model)); search_gui_disable_sort(search); + search->frozen = TRUE; + + return TRUE; } void @@ -1436,141 +1404,15 @@ GtkTreeModel *model; g_return_if_fail(search); + g_return_if_fail(search->frozen); + search->frozen = FALSE; model = gtk_tree_view_get_model(GTK_TREE_VIEW(search->tree)); g_object_thaw_notify(G_OBJECT(model)); g_object_thaw_notify(G_OBJECT(search->tree)); search_gui_enable_sort(search); } -static void -collect_parents_with_sha1(GtkTreeModel *model, GtkTreePath *unused_path, - GtkTreeIter *iter, gpointer data) -{ - GtkTreeIter parent_iter; - struct result_data *rd; - - g_assert(data); - (void) unused_path; - - if (gtk_tree_model_iter_parent(model, &parent_iter, iter)) { - iter = &parent_iter; - } - rd = get_result_data(model, iter); - if (rd->record->sha1) { - g_hash_table_insert(data, rd, rd); - } -} - -static void -search_gui_request_bitzi_data_helper(gpointer key, - gpointer unused_value, gpointer unused_udata) -{ - struct result_data *rd; - - (void) unused_value; - (void) unused_udata; - - rd = key; - record_check(rd->record); - g_return_if_fail(rd->record->sha1); - - atom_str_change(&rd->meta, _("Query queued...")); - guc_query_bitzi_by_sha1(rd->record->sha1, rd->record->size, TRUE); -} - -static void -search_gui_make_meta_column_visible(search_t *search) -{ - static const int min_width = 80; - GtkTreeViewColumn *column; - gint width; - - g_return_if_fail(search); - g_return_if_fail(search->tree); - - column = gtk_tree_view_get_column(GTK_TREE_VIEW(search->tree), c_sr_meta); - g_return_if_fail(column); - - gtk_tree_view_column_set_visible(column, TRUE); - width = gtk_tree_view_column_get_width(column); - if (width < min_width) { - gtk_tree_view_column_set_fixed_width(column, min_width); - } -} - -void -search_gui_request_bitzi_data(struct search *search) -{ - GtkTreeSelection *selection; - GHashTable *results; - - /* collect the list of files selected */ - - g_return_if_fail(search); - - search_gui_start_massive_update(search); - - results = g_hash_table_new(NULL, NULL); - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(search->tree)); - gtk_tree_selection_selected_foreach(selection, - collect_parents_with_sha1, results); - - { - guint32 bitzi_debug; - - gnet_prop_get_guint32_val(PROP_BITZI_DEBUG, &bitzi_debug); - if (bitzi_debug > 10) { - g_debug("search_gui_request_bitzi_data: %u items", - g_hash_table_size(results)); - } - } - - g_hash_table_foreach(results, search_gui_request_bitzi_data_helper, NULL); - gm_hash_table_destroy_null(&results); - - /* Make sure the column is actually visible. */ - search_gui_make_meta_column_visible(search); - - search_gui_end_massive_update(search); -} - -/** - * Update the search displays with the correct meta-data. - */ -void -search_gui_metadata_update(const bitzi_data_t *data) -{ - const GList *iter; - gchar *text; - - text = bitzi_gui_get_metadata(data); - - /* - * Fill in the columns in each search that contains a reference - */ - - iter = search_gui_get_searches(); - for (/* NOTHING */; NULL != iter; iter = g_list_next(iter)) { - struct result_data *rd; - search_t *search; - - search = iter->data; - rd = find_parent2(search, data->sha1, data->size); - if (rd) { - GtkTreeView *tv = GTK_TREE_VIEW(search->tree); - atom_str_change(&rd->meta, text ? text : _("Not in database")); - search_gui_data_changed(gtk_tree_view_get_model(tv), rd); - if (search_gui_item_is_inspected(rd->record)) { - search_gui_set_bitzi_metadata(rd->record); - search_gui_set_details(rd->record); - } - } - } - - HFREE_NULL(text); -} - /** * Create a new GtkTreeView for search results. */ @@ -1603,7 +1445,7 @@ gui_signal_connect(tv, "cursor-changed", on_tree_view_search_results_select_row, tv); gui_signal_connect(tv, "leave-notify-event", on_leave_notify, NULL); - + return GTK_WIDGET(tv); } @@ -1664,7 +1506,7 @@ model = gtk_tree_view_get_model(tv); if (gtk_tree_model_get_iter(model, &iter, path)) { - gpointer p = NULL; + gpointer p = NULL; gtk_tree_model_get(model, &iter, c_sl_sch, &p, (-1)); if (p) { search_t *search = p; @@ -1679,7 +1521,7 @@ search_gui_record_get_parent(search_t *search, record_t *record) { struct result_data *parent; - + g_return_val_if_fail(search, NULL); g_return_val_if_fail(record, NULL); record_check(record); @@ -1738,25 +1580,7 @@ parent->children++; search_gui_data_changed(model, parent); } else { - gm_hash_table_insert_const(search->parents, rd, rd); - - /* - * Inserting a new parent. - * Check for available (cached) Bitzi data. - */ - - if (NULL == rd->meta && guc_bitzi_has_cached_ticket(rc->sha1)) { - bitzi_data_t data; - char *text = NULL; - const char *meta; - - if (guc_bitzi_data_by_sha1(&data, rc->sha1, rc->size)) { - text = bitzi_gui_get_metadata(&data); - } - meta = text != NULL ? text : _("Not in database"); - atom_str_change(&rd->meta, meta); - HFREE_NULL(text); - } + htable_insert(search->parents, rd, rd); } } else { parent_iter = NULL; @@ -1764,14 +1588,6 @@ gtk_tree_store_append(GTK_TREE_STORE(model), &rd->iter, parent_iter); search_gui_set_data(model, rd); - - /* - * There might be some metadata about this record already in the - * cache. If so lets update the GUI to reflect this. - */ - if (NULL != rc->sha1 && guc_bitzi_has_cached_ticket(rc->sha1)) { - guc_query_bitzi_by_sha1(rc->sha1, rc->size, FALSE); - } } static void @@ -1779,13 +1595,14 @@ { g_return_if_fail(search); g_return_if_fail(search->tree); - + if (slist_length(search->queue) > 0) { GtkTreeModel *model; guint max_items; struct result_data *data; + bool stopped; - search_gui_start_massive_update(search); + stopped = search_gui_start_massive_update(search); model = gtk_tree_view_get_model(GTK_TREE_VIEW(search->tree)); max_items = search_gui_is_sorted(search) ? 100 : 500; @@ -1794,7 +1611,8 @@ search_gui_flush_queue_data(search, model, data); } - search_gui_end_massive_update(search); + if (stopped) + search_gui_end_massive_update(search); } } @@ -1814,7 +1632,7 @@ { g_return_val_if_fail(search, 0); g_return_val_if_fail(search->queue, 0); - + return slist_length(search->queue); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/search_cb.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/search_cb.c
Changed
@@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2001-2003, Raphael Manfredi, Richard Eckart * *---------------------------------------------------------------------- @@ -53,11 +53,13 @@ #include "if/core/sockets.h" #include "lib/cq.h" -#include "lib/glib-missing.h" -#include "lib/iso3166.h" #include "lib/halloc.h" +#include "lib/iso3166.h" +#include "lib/misc.h" /* For xml_indent() */ +#include "lib/str.h" #include "lib/utf8.h" #include "lib/vendors.h" + #include "lib/override.h" /* Must be the last header included */ void @@ -87,7 +89,7 @@ } else { gchar text4096; - gm_snprintf(text, sizeof text, + str_bprintf(text, sizeof text, "%s %s\n" "%s %s (%s)\n" "%s %.64s\n" @@ -139,14 +141,14 @@ txt = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); g_return_if_fail(txt); - + /* * Character set detection usually fails here because XML * is mostly ASCII so that the thresholds are not reached. */ if (xml) { char *s = unknown_to_utf8_normalized(xml, UNI_NORM_GUI, NULL); - xml_txt = search_xml_indent(s); + xml_txt = xml_indent(s); if (xml != s) { G_FREE_NULL(s); } @@ -157,23 +159,6 @@ HFREE_NULL(xml_txt); } -void -search_gui_set_bitzi_metadata_text(const char *text) -{ - GtkTextBuffer *buffer; - GtkWidget *widget; - - g_return_if_fail(text); - - widget = gui_main_window_lookup("textview_result_info_bitzi"); - g_return_if_fail(widget); - - buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); - g_return_if_fail(buffer); - - gtk_text_buffer_set_text(buffer, text, -1); -} - /* Display XML data from the result if any */ static void search_set_xml_metadata(const record_t *rc) @@ -233,7 +218,6 @@ search_gui_set_details(rc); g_object_thaw_notify(G_OBJECT(tv)); search_set_xml_metadata(rc); - search_gui_set_bitzi_metadata(rc); } static void @@ -241,7 +225,7 @@ { g_assert(tv); g_assert(path); - + search_gui_refresh_details(search_gui_get_record_at_path(tv, path)); } @@ -250,16 +234,15 @@ #define ROW_SELECT_TIMEOUT 100 /* milliseconds */ static void -row_selected_expire(cqueue_t *unused_cq, gpointer unused_udata) +row_selected_expire(cqueue_t *cq, gpointer unused_udata) { GtkTreePath *path = NULL; GtkTreeView *tv; search_t *search; - (void) unused_cq; (void) unused_udata; - row_selected_ev = NULL; + cq_zero(cq, &row_selected_ev); search = search_gui_get_current_search(); if (search) { @@ -302,36 +285,19 @@ *** Search results popup ***/ -/** - * Queue a bitzi query. - */ -void -on_popup_search_metadata_activate(GtkMenuItem *unused_menuitem, - gpointer unused_udata) -{ - guint32 bitzi_debug; - - (void) unused_menuitem; - (void) unused_udata; - - gnet_prop_get_guint32_val(PROP_BITZI_DEBUG, &bitzi_debug); - if (bitzi_debug > 10) { - g_message("on_search_meta_data_active: called"); - } - search_gui_request_bitzi_data(search_gui_get_current_search()); -} - static void search_gui_browse_selected_helper(gpointer data, gpointer unused_udata) { const record_t *rc = data; + const results_set_t *rs = rc->results_set; guint32 flags = 0; (void) unused_udata; - - flags |= (rc->results_set->status & ST_FIREWALL) ? SOCK_F_PUSH : 0; - flags |= (rc->results_set->status & ST_TLS) ? SOCK_F_TLS : 0; - + + flags |= (rs->status & ST_FIREWALL) ? SOCK_F_PUSH : 0; + flags |= (rs->status & ST_TLS) ? SOCK_F_TLS : 0; + flags |= ((rs->status & ST_G2) && T_GTKG != rs->vendor) ? SOCK_F_G2 : 0; + search_gui_new_browse_host( rc->results_set->hostname, rc->results_set->addr,
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/search_cb.h -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/search_cb.h
Changed
@@ -37,7 +37,6 @@ void *search_gui_get_record(GtkTreeModel *, GtkTreeIter *); -void search_gui_request_bitzi_data(struct search *); const struct record *search_gui_get_record_at_path(GtkTreeView *, GtkTreePath *);
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/search_stats.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/search_stats.c
Changed
@@ -52,7 +52,7 @@ #include "if/bridge/ui2c.h" #include "lib/concat.h" -#include "lib/glib-missing.h" +#include "lib/htable.h" #include "lib/utf8.h" #include "lib/walloc.h" #include "lib/wordvec.h" @@ -67,7 +67,7 @@ static unsigned stat_count; -static GHashTable *stat_hash; +static htable_t *stat_hash; static GtkListStore *store_search_stats; static GtkTreeView *treeview_search_stats; static GtkLabel *label_search_stats_count; @@ -78,14 +78,15 @@ static int search_stats_sort_column; #endif /* Gtk+ >= 2.6.0 */ -static gboolean -free_hash_entry(void *key, void *value, void *unused_data) +static bool +free_hash_entry(const void *key, void *value, void *unused_data) { struct term_counts *val = value; + char *s = deconstify_pointer(key); (void) unused_data; - wfree(key, 1 + strlen(key)); + wfree(s, 1 + strlen(s)); WFREE(val); return TRUE; } @@ -140,7 +141,7 @@ sortable = GTK_TREE_SORTABLE(store_search_stats); if (gtk_tree_sortable_get_sort_column_id(sortable, &column, &order)) { gtk_tree_sortable_set_sort_column_id(sortable, - GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, + GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, GTK_SORT_DESCENDING); } #endif /* Gtk+ >= 2.6.0 */ @@ -193,11 +194,11 @@ (void) unused_addr; (void) unused_port; - concat_strings(buf, sizeof buf, + concat_strings(buf, sizeof buf, type == QUERY_SHA1 ? "urn:sha1:" : "", search, type == QUERY_SHA1 ? "" : "", - (void *) 0); + NULL_PTR); wovec.word = buf; wovec.len = strlen(wovec.word); @@ -233,7 +234,7 @@ if (!stat_hash) return; - g_hash_table_foreach_remove(stat_hash, free_hash_entry, NULL); + htable_foreach_remove(stat_hash, free_hash_entry, NULL); } /** @@ -243,8 +244,8 @@ * - clears out aged / infrequent search terms * - sticks the rest of the search terms in treeview_search_stats */ -static gboolean -stats_hash_to_treeview(void *key, void *value, void *unused_udata) +static bool +stats_hash_to_treeview(const void *key, void *value, void *unused_udata) { struct term_counts *val = value; GtkTreeIter iter; @@ -328,7 +329,7 @@ if (vec->word1 == '\0' || vec->word2 == '\0') return; - val = g_hash_table_lookup(stat_hash, vec->word); + val = htable_lookup(stat_hash, vec->word); if (val) { val->period_cnt++; @@ -338,7 +339,7 @@ WALLOC0(val); val->period_cnt = vec->amount; key = wcopy(vec->word, 1 + strlen(vec->word)); - gm_hash_table_insert_const(stat_hash, key, val); + htable_insert(stat_hash, key, val); } } @@ -402,10 +403,10 @@ g_object_set(renderer, "xalign", xalign, "ypad", GUI_CELL_RENDERER_YPAD, - (void *) 0); + NULL_PTR); column = gtk_tree_view_column_new_with_attributes( - label, renderer, "text", id, (void *) 0); + label, renderer, "text", id, NULL_PTR); g_object_set(G_OBJECT(column), "fixed-width", 1, @@ -414,7 +415,7 @@ "resizable", TRUE, "sizing", GTK_TREE_VIEW_COLUMN_FIXED, "visible", TRUE, - (void *) 0); + NULL_PTR); gtk_tree_view_append_column(treeview, column); gtk_tree_view_column_set_sort_column_id(column, id); @@ -434,11 +435,11 @@ stat_count = 0; g_object_freeze_notify(G_OBJECT(treeview_search_stats)); gtk_list_store_clear(store_search_stats); - + /* * Temporarily disable sorting while inserting the updated table. * Otherwise, CPU is overloaded with sorting every addition - * to the hash table. + * to the hash table. */ sorting_disabled = FALSE; tm_now_exact(&start_time); @@ -447,7 +448,7 @@ search_stats_gui_sort_save(); } /* insert the hash table contents into the sorted treeview */ - g_hash_table_foreach_remove(stat_hash, stats_hash_to_treeview, NULL); + htable_foreach_remove(stat_hash, stats_hash_to_treeview, NULL); tm_now_exact(&end_time); elapsed = tm_elapsed_ms(&end_time, &start_time); @@ -468,7 +469,7 @@ search_stats_gui_disable(); search_stats_gui_overload = TRUE; } - + if (search_stats_gui_overload) { /* update status bar message */ gtk_label_set_text(GTK_LABEL(label_search_stats_count), @@ -515,7 +516,7 @@ GtkTreeModel *model; GtkTreeView *treeview; - STATIC_ASSERT(G_N_ELEMENTS(cols) == G_N_ELEMENTS(types)); + STATIC_ASSERT(N_ITEMS(cols) == N_ITEMS(types)); treeview_search_stats = GTK_TREE_VIEW(gui_main_window_lookup("treeview_search_stats")); @@ -525,18 +526,18 @@ treeview = treeview_search_stats; /* set up the treeview to be sorted properly */ - model = GTK_TREE_MODEL(gtk_list_store_newv(G_N_ELEMENTS(types), types)); + model = GTK_TREE_MODEL(gtk_list_store_newv(N_ITEMS(types), types)); gtk_tree_view_set_model(treeview, model); store_search_stats = GTK_LIST_STORE(model); g_object_unref(model); - for (i = 0; i < G_N_ELEMENTS(cols); i++) { + for (i = 0; i < N_ITEMS(cols); i++) { add_column(treeview, colsi.id, colsi.align, _(colsi.title)); } tree_view_restore_widths(treeview, PROP_SEARCH_STATS_COL_WIDTHS); tree_view_set_fixed_height_mode(treeview, TRUE); - stat_hash = g_hash_table_new(g_str_hash, g_str_equal); + stat_hash = htable_create(HASH_KEY_STRING, 0); main_gui_add_timer(search_stats_gui_timer); } @@ -545,7 +546,8 @@ { tree_view_save_widths(treeview_search_stats, PROP_SEARCH_STATS_COL_WIDTHS); search_stats_gui_set_type(NO_SEARCH_STATS); - gm_hash_table_destroy_null(&stat_hash); + empty_hash_table(); + htable_free_null(&stat_hash); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/support-glade.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/support-glade.c
Changed
@@ -47,7 +47,7 @@ found_widget = (GtkWidget*) g_object_get_data (G_OBJECT (widget), widget_name); if (!found_widget) - g_warning ("Widget not found: %s", widget_name); + g_warning ("%s(): widget not found: %s", G_STRFUNC, widget_name); return found_widget; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/upload_stats.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/upload_stats.c
Changed
@@ -54,6 +54,7 @@ #include "gtk/gui.h" +#include "column_sort.h" #include "interface-glade.h" /* for create_popup_upload_stats */ #include "gtk/columns.h" @@ -65,7 +66,8 @@ #include "if/ui/gtk/upload_stats.h" #include "lib/atoms.h" -#include "lib/glib-missing.h" +#include "lib/htable.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/timestamp.h" #include "lib/utf8.h" @@ -77,7 +79,11 @@ static GtkTreeView *upload_stats_treeview; static GtkWidget *popup_upload_stats; -static GHashTable *ht_uploads; +static htable_t *ht_uploads; + +#if GTK_CHECK_VERSION(2,6,0) +static struct sorting_context upload_stats_sort; +#endif /* GTK+ >= 2.6.0 */ struct upload_data { GtkTreeIter iter; @@ -107,6 +113,14 @@ } static void +on_uploads_stats_treeview_column_clicked(GtkTreeViewColumn *column, void *udata) +{ + (void) udata; + + column_sort_tristate(column, &upload_stats_sort); +} + +static void cell_renderer_func(GtkTreeViewColumn *column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer udata) @@ -137,7 +151,7 @@ text = uint64_to_string(data->us->attempts); break; case c_us_norm: - gm_snprintf(buf, sizeof buf, "%1.3f", data->us->norm); + str_bprintf(buf, sizeof buf, "%1.3f", data->us->norm); text = buf; break; case c_us_rtime: @@ -149,7 +163,7 @@ case c_us_num: g_assert_not_reached(); } - g_object_set(cell, "text", text, (void *) 0); + g_object_set(cell, "text", text, NULL_PTR); } /** @@ -167,7 +181,7 @@ * as appropriate for the type. * */ -static void +static GtkTreeViewColumn * add_column( GtkTreeView *tv, gint column_id, @@ -184,8 +198,8 @@ g_assert(tv); renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes(title, renderer, - (void *) 0); + column = + gtk_tree_view_column_new_with_attributes(title, renderer, NULL_PTR); gtk_tree_view_column_set_cell_data_func(column, renderer, cell_data_func, GINT_TO_POINTER(column_id), NULL); @@ -193,19 +207,21 @@ "xalign", xalign, "xpad", GUI_CELL_RENDERER_XPAD, "ypad", GUI_CELL_RENDERER_YPAD, - (void *) 0); + NULL_PTR); g_object_set(column, "fixed-width", 1, "min-width", 1, "resizable", TRUE, "reorderable", TRUE, "sizing", GTK_TREE_VIEW_COLUMN_FIXED, - (void *) 0); + NULL_PTR); gtk_tree_view_column_set_sort_column_id(column, column_id); gtk_tree_view_append_column(GTK_TREE_VIEW(tv), column); gtk_tree_sortable_set_sort_func( GTK_TREE_SORTABLE(gtk_tree_view_get_model(tv)), column_id, sortfunc, NULL, NULL); + + return column; } /** @@ -226,7 +242,7 @@ static struct upload_data * upload_stats_gui_find(const struct ul_stats *us) { - return g_hash_table_lookup(ht_uploads, us); + return htable_lookup(ht_uploads, us); } static inline struct upload_data * @@ -244,9 +260,9 @@ GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer unused_udata) { const struct upload_data *d1, *d2; - + (void) unused_udata; - + d1 = get_upload_data(model, a); d2 = get_upload_data(model, b); return strcmp(d1->filename, d2->filename); @@ -257,9 +273,9 @@ GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer unused_udata) { const struct upload_data *d1, *d2; - + (void) unused_udata; - + d1 = get_upload_data(model, a); d2 = get_upload_data(model, b); return CMP(d1->us->size, d2->us->size); @@ -285,7 +301,7 @@ const struct upload_data *d1, *d2; (void) unused_udata; - + d1 = get_upload_data(model, a); d2 = get_upload_data(model, b); return CMP(d1->us->attempts, d2->us->attempts); @@ -298,7 +314,7 @@ const struct upload_data *d1, *d2; (void) unused_udata; - + d1 = get_upload_data(model, a); d2 = get_upload_data(model, b); return CMP(d1->us->complete, d2->us->complete); @@ -311,7 +327,7 @@ const struct upload_data *d1, *d2; (void) unused_udata; - + d1 = get_upload_data(model, a); d2 = get_upload_data(model, b); return CMP(d1->us->rtime, d2->us->rtime); @@ -324,7 +340,7 @@ const struct upload_data *d1, *d2; (void) unused_udata; - + d1 = get_upload_data(model, a); d2 = get_upload_data(model, b); return CMP(d1->us->dtime, d2->us->dtime); @@ -359,11 +375,11 @@ GtkTreeModel *model; guint i; - STATIC_ASSERT(G_N_ELEMENTS(columns) == UPLOAD_STATS_GUI_VISIBLE_COLUMNS); + STATIC_ASSERT(N_ITEMS(columns) == UPLOAD_STATS_GUI_VISIBLE_COLUMNS); if (!initialized) { initialized = TRUE; - ht_uploads = g_hash_table_new(NULL, NULL); + ht_uploads = htable_create(HASH_KEY_SELF, 0); popup_upload_stats = create_popup_upload_stats(); model = GTK_TREE_MODEL(gtk_list_store_new(1, G_TYPE_POINTER)); upload_stats_treeview = GTK_TREE_VIEW( @@ -371,13 +387,18 @@ gtk_tree_view_set_model(upload_stats_treeview, model); g_object_unref(model); - for (i = 0; i < G_N_ELEMENTS(columns); i++) { - add_column(upload_stats_treeview, + for (i = 0; i < N_ITEMS(columns); i++) { + GtkTreeViewColumn *column; + + column = add_column(upload_stats_treeview, columnsi.id, _(columnsi.title), columnsi.align, columnsi.func, cell_renderer_func); + + column_sort_tristate_register(column, + on_uploads_stats_treeview_column_clicked, NULL); } gui_signal_connect(upload_stats_treeview, @@ -420,13 +441,13 @@ upload_stats_gui_init_intern(TRUE); store = GTK_LIST_STORE(gtk_tree_view_get_model(upload_stats_treeview)); g_return_if_fail(store); - g_return_if_fail(NULL == g_hash_table_lookup(ht_uploads, us)); + g_return_if_fail(!htable_contains(ht_uploads, us)); WALLOC(data); data->us = us; data->filename = atom_str_get(us->filename); - gm_hash_table_insert_const(ht_uploads, data->us, data); + htable_insert(ht_uploads, data->us, data); gtk_list_store_append(store, &data->iter); gtk_list_store_set(store, &data->iter, 0, data, (-1)); @@ -483,8 +504,8 @@ } } -static gboolean -free_upload_data(gpointer unused_key, gpointer value, gpointer unused_data) +static void +free_upload_data(const void *unused_key, void *value, void *unused_data) { struct upload_data *data = value; @@ -496,7 +517,6 @@ data->us = NULL; atom_str_free_null(&data->filename); WFREE(data); - return TRUE; } /** @@ -504,7 +524,7 @@ * */ void -upload_stats_gui_clear_all(void) +upload_stats_gui_clear_model(void) { GtkListStore *store; @@ -513,9 +533,9 @@ gtk_list_store_clear(store); } if (ht_uploads) { - g_hash_table_foreach_remove(ht_uploads, free_upload_data, NULL); - g_hash_table_destroy(ht_uploads); - ht_uploads = NOT_LEAKING(g_hash_table_new(NULL, NULL)); + htable_foreach(ht_uploads, free_upload_data, NULL); + htable_free_null(&ht_uploads); + ht_uploads = NOT_LEAKING(htable_create(HASH_KEY_SELF, 0)); } }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtk2/uploads.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtk2/uploads.c
Changed
@@ -25,7 +25,7 @@ * @ingroup gtk * @file * - * Needs short description here. + * Management of the GTK2 "Uploads" pane. * * @author Richard Eckart * @date 2001-2003 @@ -39,16 +39,21 @@ #include "gtk/misc.h" #include "gtk/settings.h" +#include "column_sort.h" + #include "if/gui_property.h" #include "if/bridge/ui2c.h" #include "lib/atoms.h" -#include "lib/host_addr.h" #include "lib/glib-missing.h" +#include "lib/host_addr.h" +#include "lib/htable.h" #include "lib/iso3166.h" #include "lib/misc.h" +#include "lib/str.h" #include "lib/tm.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ static gboolean uploads_remove_lock; @@ -59,10 +64,14 @@ static GtkWidget *button_uploads_clear_completed; /** hash table for fast handle -> GtkTreeIter mapping */ -static GHashTable *upload_handles; +static htable_t *upload_handles; /** list of all *removed* uploads; contains the handles */ static GSList *sl_removed_uploads; +#if GTK_CHECK_VERSION(2,6,0) +static struct sorting_context uploads_sort; +#endif /* GTK+ >= 2.6.0 */ + static void uploads_gui_update_upload_info(const gnet_upload_info_t *u); static void uploads_gui_add_upload(gnet_upload_info_t *u); @@ -95,10 +104,10 @@ find_upload(gnet_upload_t u) { upload_row_data_t *rd; - gpointer key; - gboolean found; + void *key; + bool found; - found = g_hash_table_lookup_extended(upload_handles, GUINT_TO_POINTER(u), + found = htable_lookup_extended(upload_handles, uint_to_pointer(u), NULL, &key); g_assert(found); rd = key; @@ -151,7 +160,7 @@ if (reason != NULL) gtk_list_store_set(store_uploads, &rd->iter, c_ul_status, reason, (-1)); sl_removed_uploads = g_slist_prepend(sl_removed_uploads, rd); - g_hash_table_remove(upload_handles, GUINT_TO_POINTER(uh)); + htable_remove(upload_handles, uint_to_pointer(uh)); /* NB: rd MUST NOT be freed yet because it contains the GtkTreeIter! */ } @@ -242,8 +251,8 @@ rd->last_update = tm_time(); if ( - !host_addr_equal(u->addr, rd->addr) || - !host_addr_equal(u->gnet_addr, rd->gnet_addr) || + !host_addr_equiv(u->addr, rd->addr) || + !host_addr_equiv(u->gnet_addr, rd->gnet_addr) || u->gnet_port != rd->gnet_port ) { rd->addr = u->addr; @@ -263,14 +272,14 @@ if (u->range_start == 0 && u->range_end == 0) g_strlcpy(str, "...", sizeof str); else { - range_len = gm_snprintf(str, sizeof str, "%s%s", + range_len = str_bprintf(str, sizeof str, "%s%s", short_size(u->range_end - u->range_start + 1, show_metric_units()), u->partial ? _(" (partial)") : ""); if ((guint) range_len < sizeof str) { if (u->range_start) - range_len += gm_snprintf(&strrange_len, + range_len += str_bprintf(&strrange_len, sizeof str - range_len, " @ %s", short_size(u->range_start, show_metric_units())); @@ -369,13 +378,13 @@ else { static gchar range_tmp256; /* MUST be static! */ - range_len = gm_snprintf(range_tmp, sizeof range_tmp, "%s%s", + range_len = str_bprintf(range_tmp, sizeof range_tmp, "%s%s", short_size(u->range_end - u->range_start + 1, show_metric_units()), u->partial ? _(" (partial)") : ""); if (u->range_start) - range_len += gm_snprintf( + range_len += str_bprintf( &range_tmprange_len, sizeof range_tmp - range_len, " @ %s", short_size(u->range_start, show_metric_units())); @@ -408,10 +417,10 @@ c_ul_fg, NULL, c_ul_data, rd, (-1)); - g_hash_table_insert(upload_handles, GUINT_TO_POINTER(rd->handle), rd); + htable_insert(upload_handles, uint_to_pointer(rd->handle), rd); } -static void +static GtkTreeViewColumn * add_column(gint column_id, GtkTreeIterCompareFunc sortfunc, GtkType column_type) { GtkTreeViewColumn *column; @@ -436,19 +445,19 @@ GTK_CELL_RENDERER_TEXT(renderer), 1); g_object_set(renderer, "foreground-set", TRUE, - (void *) 0); + NULL_PTR); column = gtk_tree_view_column_new_with_attributes( _(column_titlescolumn_id), renderer, "foreground-gdk", c_ul_fg, "text", column_id, - (void *) 0); + NULL_PTR); } g_object_set(renderer, "xalign", (gfloat) 0.0, "xpad", xpad, "ypad", GUI_CELL_RENDERER_YPAD, - (void *) 0); + NULL_PTR); g_object_set(G_OBJECT(column), "fixed-width", 1, @@ -456,7 +465,7 @@ "reorderable", TRUE, "resizable", TRUE, "sizing", GTK_TREE_VIEW_COLUMN_FIXED, - (void *) 0); + NULL_PTR); gtk_tree_view_column_set_sort_column_id(column, column_id); gtk_tree_view_append_column(treeview_uploads, column); @@ -464,6 +473,8 @@ if (NULL != sortfunc) gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store_uploads), column_id, sortfunc, GINT_TO_POINTER(column_id), NULL); + + return column; } static GtkListStore * @@ -473,9 +484,9 @@ GtkListStore *store; guint i; - STATIC_ASSERT(c_ul_num == G_N_ELEMENTS(columns)); + STATIC_ASSERT(c_ul_num == N_ITEMS(columns)); #define SET(c, x) case (c): columnsi = (x); break - for (i = 0; i < G_N_ELEMENTS(columns); i++) { + for (i = 0; i < N_ITEMS(columns); i++) { switch (i) { SET(c_ul_filename, G_TYPE_STRING); SET(c_ul_host, G_TYPE_STRING); @@ -493,7 +504,7 @@ } #undef SET - store = gtk_list_store_newv(G_N_ELEMENTS(columns), columns); + store = gtk_list_store_newv(N_ITEMS(columns), columns); return GTK_LIST_STORE(store); } @@ -506,8 +517,7 @@ } static inline void -free_handle(gpointer key, gpointer value, - gpointer user_data) +free_handle(const void *key, void *value, void *user_data) { (void) key; (void) user_data; @@ -527,16 +537,16 @@ } static inline void -update_row(gpointer key, gpointer data, gpointer unused_udata) +update_row(const void *key, void *value, void *unused_udata) { time_t now; - upload_row_data_t *rd = data; + upload_row_data_t *rd = value; gnet_upload_status_t status; guint progress; (void) unused_udata; g_assert(NULL != rd); - g_assert(GPOINTER_TO_UINT(key) == rd->handle); + g_assert(pointer_to_uint(key) == rd->handle); now = tm_time(); if (delta_time(now, rd->last_update) < 2) @@ -575,7 +585,7 @@ sl_removed_uploads = ctx.sl_remaining; /* Update the status column for all active uploads. */ - g_hash_table_foreach(upload_handles, update_row, NULL); + htable_foreach(upload_handles, update_row, NULL); g_object_thaw_notify(G_OBJECT(treeview_uploads)); gtk_widget_set_sensitive(button_uploads_clear_completed, @@ -645,6 +655,17 @@ } } +/** + * Enforce a tri-state sorting. + */ +static void +on_uploads_treeview_column_clicked(GtkTreeViewColumn *column, void *udata) +{ + (void) udata; + + column_sort_tristate(column, &uploads_sort); +} + void uploads_gui_init(void) { @@ -663,7 +684,7 @@ }; size_t i; - STATIC_ASSERT(G_N_ELEMENTS(cols) == UPLOADS_GUI_VISIBLE_COLUMNS); + STATIC_ASSERT(N_ITEMS(cols) == UPLOADS_GUI_VISIBLE_COLUMNS); store_uploads = create_uploads_model(); button_uploads_clear_completed = @@ -673,16 +694,21 @@ gtk_tree_view_set_model(treeview_uploads, GTK_TREE_MODEL(store_uploads)); tree_view_set_fixed_height_mode(treeview_uploads, TRUE); - for (i = 0; i < G_N_ELEMENTS(cols); i++) { - add_column(colsi.id, colsi.sortfunc, + for (i = 0; i < N_ITEMS(cols); i++) { + GtkTreeViewColumn *column; + + column = add_column(colsi.id, colsi.sortfunc, c_ul_progress == colsi.id ? GTK_TYPE_CELL_RENDERER_PROGRESS : GTK_TYPE_CELL_RENDERER_TEXT); + + column_sort_tristate_register(column, + on_uploads_treeview_column_clicked, NULL); } tree_view_restore_widths(treeview_uploads, PROP_UPLOADS_COL_WIDTHS); tree_view_restore_visibility(treeview_uploads, PROP_UPLOADS_COL_VISIBLE); - upload_handles = g_hash_table_new(NULL, NULL); + upload_handles = htable_create(HASH_KEY_SELF, 0); guc_upload_add_upload_added_listener(upload_added); guc_upload_add_upload_removed_listener(upload_removed); @@ -711,8 +737,8 @@ gtk_list_store_clear(store_uploads); - g_hash_table_foreach(upload_handles, free_handle, NULL); - gm_hash_table_destroy_null(&upload_handles); + htable_foreach(upload_handles, free_handle, NULL); + htable_free_null(&upload_handles); G_SLIST_FOREACH(sl_removed_uploads, free_row_data); gm_slist_free_null(&sl_removed_uploads); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtkcolumnchooser.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtkcolumnchooser.c
Changed
@@ -26,7 +26,7 @@ #include <gtk/gtkcheckmenuitem.h> #include "gtkcolumnchooser.h" -#include "lib/glib-missing.h" +#include "lib/htable.h" #include "lib/override.h" /* Must be the last header included */ static GtkWidgetClass *parent_class; @@ -57,7 +57,7 @@ g_return_val_if_fail(widget != NULL, NULL); g_return_val_if_fail(cc != NULL, NULL); - return g_hash_table_lookup(cc->col_map, widget); + return htable_lookup(cc->col_map, widget); } static void @@ -140,7 +140,7 @@ g_return_val_if_fail(widget != NULL, NULL); g_return_val_if_fail(i >= 0, NULL); - + if (i < GTK_CLIST(widget)->columns) { gchar *title; gboolean visible; @@ -151,7 +151,7 @@ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), visible); } *menuitem_ptr = menuitem; - + return GINT_TO_POINTER(i); } #endif /* Gtk+ >= 2.0 */ @@ -186,7 +186,7 @@ gtk_menu_append(menu, menuitem); /* map the menu item to the corresponding column */ - g_hash_table_insert(cc->col_map, menuitem, p); + htable_insert(cc->col_map, menuitem, p); } /* @@ -231,7 +231,7 @@ cc = (GtkColumnChooser *) instance; cc->widget = NULL; - cc->col_map = g_hash_table_new(NULL, NULL); + cc->col_map = htable_create(HASH_KEY_SELF, 0); cc->closed = FALSE; } @@ -244,7 +244,7 @@ g_return_if_fail(GTK_IS_COLUMN_CHOOSER(object)); cc = GTK_COLUMN_CHOOSER(object); - gm_hash_table_destroy_null(&cc->col_map); + htable_free_null(&cc->col_map); G_OBJECT_CLASS(parent_class)->finalize(G_OBJECT(object)); } @@ -296,7 +296,7 @@ g_return_if_fail(cc != NULL); cc->widget = NULL; - cc->col_map = g_hash_table_new(NULL, NULL); + cc->col_map = htable_create(HASH_KEY_SELF, 0); cc->closed = FALSE; } @@ -309,7 +309,7 @@ g_return_if_fail(GTK_IS_COLUMN_CHOOSER(object)); cc = GTK_COLUMN_CHOOSER(object); - gm_hash_table_destroy_null(&cc->col_map); + htable_free_null(&cc->col_map); GTK_OBJECT_CLASS(parent_class)->finalize(object); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gtkcolumnchooser.h -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gtkcolumnchooser.h
Changed
@@ -48,11 +48,13 @@ typedef struct _GtkColumnChooserClass GtkColumnChooserClass; +struct htable; + struct _GtkColumnChooser { GtkMenu menu; - GtkWidget * widget; - GHashTable * col_map; + GtkWidget *widget; + struct htable *col_map; gboolean closed; };
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/gui.h -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/gui.h
Changed
@@ -83,7 +83,7 @@ #define gui_signal_stop_emit_by_name(widget, name) \ gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), (name)) - + #endif /* USE_GTK1 */ #ifdef USE_GTK2 @@ -101,7 +101,7 @@ #define gui_signal_stop_emit_by_name(widget, name) \ g_signal_stop_emission_by_name((widget), (name)) - + #endif /* Gtk+ 2.0 */ /** @@ -115,6 +115,11 @@ SORT_NO_COL = 2 /**< No column chosen yet */ }; +struct sorting_context { + int s_column; /**< The column being sorted */ + enum sorting_order s_order; /**< Sorting order attached to column */ +}; + #endif /* USE_TOPLESS */ #endif /* _gtk_ui_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/hcache_common.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/hcache_common.c
Changed
@@ -41,6 +41,8 @@ case HCACHE_VALID_ULTRA: return _("Valid IPv4 ultra"); case HCACHE_FRESH_ULTRA6: return _("Fresh IPv6 ultra"); case HCACHE_VALID_ULTRA6: return _("Valid IPv6 ultra"); + case HCACHE_FRESH_G2HUB: return _("Fresh G2 hub"); + case HCACHE_VALID_G2HUB: return _("Valid G2 hub"); case HCACHE_TIMEOUT: return _("Timeout"); case HCACHE_BUSY: return _("Busy"); case HCACHE_UNSTABLE: return _("Unstable"); @@ -53,7 +55,7 @@ case HCACHE_MAX: break; } - g_warning("get_hcache_name: unknown hcache %d", type); + g_carp("%s(): unknown hcache %d", G_STRFUNC, type); return ""; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/html_view.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/html_view.c
Changed
@@ -38,6 +38,7 @@ #include "lib/glib-missing.h" #include "lib/halloc.h" #include "lib/html.h" +#include "lib/mempcpy.h" #include "lib/str.h" #include "lib/utf8.h" #include "lib/walloc.h" @@ -100,7 +101,7 @@ *ctx_ptr = NULL; } } - + static struct html_view * html_view_alloc(void) { @@ -116,7 +117,7 @@ html_output_print(struct html_output *output, const struct array *text) { struct html_context *ctx; - + if (text->size <= 0) return; @@ -202,9 +203,9 @@ special.em_dash = utf8_char(0x2014); concat_strings(special.list_item_prefix.str, sizeof special.list_item_prefix.str, - " ", special.bullet.str, " ", (void *) 0); + " ", special.bullet.str, " ", NULL_PTR); } - + style = NULL; text = NULL; attr = NULL; @@ -223,7 +224,7 @@ GtkTextIter start, end; GtkTextTag *anchor; - anchor = gtk_text_buffer_create_tag(buffer, NULL, (void *) 0); + anchor = gtk_text_buffer_create_tag(buffer, NULL, NULL_PTR); g_object_set_data(G_OBJECT(anchor), "href", deconstify_gchar(ctx->href)); gtk_text_buffer_get_iter_at_mark(buffer, @@ -254,13 +255,14 @@ GtkTextTagTable *table; gchar name256; size_t n; + char *p; n = sizeof name - 2; n = MIN(value.size, n); name0 = '#'; - memcpy(&name1, value.data, n); - namen + 1 = '\0'; - + p = mempcpy(&name1, value.data, n); + *p = '\0'; + table = gtk_text_buffer_get_tag_table(buffer); if (NULL == gtk_text_tag_table_lookup(table, name)) { GtkTextIter iter; @@ -291,10 +293,10 @@ if (!closing) { struct array value; static gchar alt1024; - + value = html_get_attribute(tag, HTML_ATTR_ALT); if (value.data) { - gm_snprintf(alt, sizeof alt, "\nimage alt=\"%.*s\"\n", + str_bprintf(alt, sizeof alt, "\nimage alt=\"%.*s\"\n", (int)value.size, value.data); text = alt; } @@ -311,7 +313,7 @@ gtk_text_buffer_insert_pixbuf(buffer, &iter, pixbuf); } else { static gchar msg1024; - gm_snprintf(msg, sizeof msg, + str_bprintf(msg, sizeof msg, "\nImage not found (\"%s\")\n", filename); text = msg; } @@ -356,21 +358,21 @@ margin = gtk_text_buffer_create_tag(buffer, NULL, "left-margin", width * 2, "left-margin-set", TRUE, - (void *) 0); + NULL_PTR); gtk_text_buffer_get_iter_at_mark(buffer, &start, ctx->startid); gtk_text_buffer_get_end_iter(buffer, &end); gtk_text_buffer_apply_tag(buffer, margin, &start, &end); } else { GtkTextIter iter; - + gtk_text_buffer_get_end_iter(buffer, &iter); gtk_text_buffer_insert(buffer, &iter, "\n", (-1)); gtk_text_buffer_get_end_iter(buffer, &iter); gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, special.list_item_prefix.str, (-1), - STYLE_TAG_BOLD, (void *) 0); + STYLE_TAG_BOLD, NULL_PTR); gtk_text_buffer_get_end_iter(buffer, &iter); ctx->startid = gtk_text_buffer_create_mark(buffer, NULL, &iter, TRUE); @@ -421,12 +423,12 @@ gtk_text_buffer_get_end_iter(buffer, &iter); gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, "\n \n", (-1), - STYLE_TAG_CENTER, STYLE_TAG_UNDERLINE, (void *) 0); + STYLE_TAG_CENTER, STYLE_TAG_UNDERLINE, NULL_PTR); } text = "\n"; break; case HTML_TAG_COMMENT: -#if 0 +#if 0 { GtkTextIter iter; @@ -435,7 +437,7 @@ &iter, TRUE); gtk_text_buffer_get_end_iter(buffer, &iter); gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, - tag->data, tag->size, STYLE_TAG_ITALIC, (void *) 0); + tag->data, tag->size, STYLE_TAG_ITALIC, NULL_PTR); } closing = TRUE; text = "\n"; @@ -450,7 +452,7 @@ lang = gtk_text_buffer_create_tag(buffer, NULL, "language", ctx->lang, "language-set", TRUE, - (void *) 0); + NULL_PTR); gtk_text_buffer_get_iter_at_mark(buffer, &start, ctx->startid); gtk_text_buffer_get_end_iter(buffer, &end); @@ -489,7 +491,7 @@ if (closing) { if (ctx->startid) { GtkTextIter start, end; - + gtk_text_buffer_get_iter_at_mark(buffer, &start, ctx->startid); gtk_text_buffer_get_end_iter(buffer, &end); @@ -508,7 +510,7 @@ gtk_text_buffer_get_end_iter(buffer, &iter); gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, - text, (-1), attr, (void *) 0); + text, (-1), attr, NULL_PTR); } } #else /* Gtk+ < 2.0 */ @@ -600,7 +602,7 @@ case NUM_HTML_TAG: g_assert_not_reached(); } - + if (text) { gtk_text_insert(ctx->html_view->widget, NULL, NULL, NULL, text, (-1)); } @@ -640,7 +642,7 @@ (void) event; gdk_window_get_pointer(text_view->window, &wx, &wy, NULL); - gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(text_view), + gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(text_view), GTK_TEXT_WINDOW_WIDGET, wx, wy, &bx, &by); set_cursor_if_appropriate(GTK_TEXT_VIEW(text_view), bx, by); return FALSE; @@ -652,14 +654,14 @@ { gint x, y; - gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(text_view), + gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(text_view), GTK_TEXT_WINDOW_WIDGET, event->x, event->y, &x, &y); set_cursor_if_appropriate(GTK_TEXT_VIEW(text_view), x, y); gdk_window_get_pointer(text_view->window, NULL, NULL, NULL); return FALSE; } -/* Looks at all tags covering the position of iter in the text view, +/* Looks at all tags covering the position of iter in the text view, * and if one of them is a link, follow it by showing the page identified * by the data attached to it. */ @@ -698,7 +700,7 @@ GtkTextBuffer *buffer; switch (event->keyval) { - case GDK_Return: + case GDK_Return: case GDK_KP_Enter: buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view)); gtk_text_buffer_get_iter_at_mark(buffer, &iter, @@ -731,7 +733,7 @@ /* we shouldn't follow a link if the user has selected something */ gtk_text_buffer_get_selection_bounds(buffer, &start, &end); if (gtk_text_iter_get_offset(&start) == gtk_text_iter_get_offset(&end)) { - gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(text_view), + gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(text_view), GTK_TEXT_WINDOW_WIDGET, event->x, event->y, &x, &y); gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(text_view), &iter, x, y); @@ -771,59 +773,59 @@ "visibility-notify-event", visibility_notify_event, NULL); gui_signal_connect(widget, "key-press-event", key_press_event, NULL); gui_signal_connect(widget, "event-after", event_after, NULL); - + gtk_text_view_set_buffer(GTK_TEXT_VIEW(widget), NULL); { GtkTextBuffer *buffer; - + buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); gtk_text_buffer_create_tag(buffer, STYLE_TAG_WORD_WRAP, "wrap_mode", GTK_WRAP_WORD, - (void *) 0); + NULL_PTR); gtk_text_buffer_create_tag(buffer, STYLE_TAG_MONOSPACE, "family", "monospace", - (void *) 0); + NULL_PTR); gtk_text_buffer_create_tag(buffer, STYLE_TAG_STRETCH, "stretch", PANGO_STRETCH_ULTRA_EXPANDED, "stretch-set", TRUE, - (void *) 0); + NULL_PTR); gtk_text_buffer_create_tag(buffer, STYLE_TAG_ANCHOR, - "foreground", "blue", - "underline", PANGO_UNDERLINE_SINGLE, - (void *) 0); + "foreground", "blue", + "underline", PANGO_UNDERLINE_SINGLE, + NULL_PTR); gtk_text_buffer_create_tag(buffer, STYLE_TAG_ANCHOR_EXTERN, - "foreground", "red", - "underline", PANGO_UNDERLINE_SINGLE, - (void *) 0); + "foreground", "red", + "underline", PANGO_UNDERLINE_SINGLE, + NULL_PTR); gtk_text_buffer_create_tag(buffer, STYLE_TAG_BOLD, "weight", PANGO_WEIGHT_BOLD, - (void *) 0); + NULL_PTR); gtk_text_buffer_create_tag(buffer, STYLE_TAG_ITALIC, "style", PANGO_STYLE_ITALIC, - (void *) 0); + NULL_PTR); gtk_text_buffer_create_tag(buffer, STYLE_TAG_CENTER, "justification", GTK_JUSTIFY_CENTER, - (void *) 0); + NULL_PTR); gtk_text_buffer_create_tag(buffer, STYLE_TAG_UNDERLINE, "underline", PANGO_UNDERLINE_SINGLE, - (void *) 0); + NULL_PTR); gtk_text_buffer_create_tag(buffer, STYLE_TAG_HEADING_1, "weight", PANGO_WEIGHT_BOLD, "size", 15 * PANGO_SCALE, - (void *) 0); + NULL_PTR); gtk_text_buffer_create_tag(buffer, STYLE_TAG_HEADING_2, "weight", PANGO_WEIGHT_BOLD, "size", 14 * PANGO_SCALE, - (void *) 0); + NULL_PTR); gtk_text_buffer_create_tag(buffer, STYLE_TAG_HEADING_3, "weight", PANGO_WEIGHT_BOLD, "size", 13 * PANGO_SCALE, - (void *) 0); + NULL_PTR); gtk_text_buffer_create_tag(buffer, STYLE_TAG_HEADING_4, "weight", PANGO_WEIGHT_BOLD, "size", 12 * PANGO_SCALE, - (void *) 0); + NULL_PTR); } #else /* Gtk+ < 2.0 */ @@ -838,7 +840,7 @@ html_output_set_udata(ctx->output, ctx); html_output_set_print(ctx->output, html_output_print); html_output_set_tag(ctx->output, html_output_tag); - + #if GTK_CHECK_VERSION(2,0,0) #else gtk_text_thaw(html_view->widget); @@ -872,7 +874,7 @@ { struct html_view *html_view; struct html_context *ctx; - + g_return_val_if_fail(widget, NULL); g_return_val_if_fail(memory.data, NULL); @@ -897,7 +899,7 @@ { GtkTextBuffer *buffer; GtkTextIter start, end; - + buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(html_view->widget)); gtk_text_buffer_get_start_iter(buffer, &start); gtk_text_buffer_get_end_iter(buffer, &end);
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/icon.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/icon.c
Changed
@@ -457,7 +457,7 @@ status_icon_enabled_changed(property_t prop) { gboolean enabled; - + gui_prop_get_boolean_val(prop, &enabled); if (enabled) { status_icon_enable(); @@ -492,7 +492,7 @@ * See -- * http://tronche.com/gui/x/icccm/sec-4.html#s-4.1.9 */ -G_GNUC_COLD void +void G_COLD icon_init(void) { create_icon(); @@ -554,11 +554,11 @@ static GdkPixmap *icon_map; static GdkBitmap *icon_mask; -G_GNUC_COLD void +void G_COLD icon_init(void) { GtkPixmap *pixmap; - pixmap = (GtkPixmap *) create_pixmap(gui_main_window(), "icon.xpm"); + pixmap = (GtkPixmap *) create_pixmap(gui_main_window(), "icon.48x48.xpm"); gtk_pixmap_get(pixmap, &icon_map, &icon_mask); gdk_window_set_icon(gui_main_window()->window, NULL, icon_map, icon_mask); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/main.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/main.c
Changed
@@ -69,11 +69,13 @@ #include "if/bridge/ui2c.h" #include "lib/crash.h" +#include "lib/entropy.h" #include "lib/glib-missing.h" #include "lib/halloc.h" #include "lib/omalloc.h" #include "lib/path.h" #include "lib/product.h" +#include "lib/str.h" #include "lib/tm.h" #include "lib/utf8.h" @@ -121,6 +123,7 @@ WIDGET(dlg_about) WIDGET(dlg_faq) +WIDGET(dlg_glossary) WIDGET(dlg_ancient) WIDGET(dlg_prefs) WIDGET(dlg_quit) @@ -143,20 +146,21 @@ gui_init_window_title(void) { gchar title256; - const char *revision = product_get_revision(); + const char *revision = product_revision(); if (revision0 != '\0') { - gm_snprintf(title, sizeof(title), "gtk-gnutella %s %s", - product_get_version(), revision); + str_bprintf(title, sizeof(title), "gtk-gnutella %s %s", + product_version(), revision); } else { - gm_snprintf(title, sizeof(title), "gtk-gnutella %s", - product_get_version()); + str_bprintf(title, sizeof(title), "gtk-gnutella %s", + product_version()); } gtk_window_set_title(GTK_WINDOW(gui_main_window()), title); } static GSList *visibility_listenersnb_main_page_num; +static GSList *main_visibility_listeners; static int notebook_main_current_page; static gboolean main_window_is_visible; @@ -169,15 +173,18 @@ static void main_gui_page_visibility_change(int page_num, gboolean visible) { - GSList *iter; + GSList *sl; g_return_if_fail(UNSIGNED(page_num) < nb_main_page_num); - iter = visibility_listenerspage_num; - for (/* NOTHING */; NULL != iter; iter = g_slist_next(iter)) { - main_gui_visibility_cb func = cast_pointer_to_func(iter->data); + /* + * Process per-page visibility change handlers. + */ + + GM_SLIST_FOREACH(visibility_listenerspage_num, sl) { + main_gui_visibility_cb func = cast_pointer_to_func(sl->data); - g_assert(func); + g_assert(func != NULL); (*func)(visible); } } @@ -191,6 +198,8 @@ (void) unused_widget; (void) unused_udata; + entropy_harvest_single(PTRLEN(event)); + switch (event->type) { case GDK_MAP: main_window_is_visible = TRUE; @@ -211,6 +220,19 @@ break; } if (was_visible != main_window_is_visible) { + GSList *sl; + + /* + * Process global visibility change handlers. + */ + + GM_SLIST_FOREACH(main_visibility_listeners, sl) { + main_gui_visibility_cb func = cast_pointer_to_func(sl->data); + + g_assert(func != NULL); + (*func)(main_window_is_visible); + } + main_gui_page_visibility_change(notebook_main_current_page, main_window_is_visible); } @@ -229,6 +251,8 @@ g_return_if_fail(UNSIGNED(page_num) < nb_main_page_num); + entropy_harvest_single(VARLEN(page_num)); + old_page = notebook_main_current_page; notebook_main_current_page = page_num; @@ -239,6 +263,24 @@ } void +main_gui_add_visibility_listener(main_gui_visibility_cb func) +{ + g_return_if_fail(func); + + main_visibility_listeners = g_slist_append( + main_visibility_listeners, cast_func_to_pointer(func)); +} + +void +main_gui_remove_visibility_listener(main_gui_visibility_cb func) +{ + g_return_if_fail(func); + + main_visibility_listeners = g_slist_remove( + main_visibility_listeners, cast_func_to_pointer(func)); +} + +void main_gui_add_page_visibility_listener(main_gui_visibility_cb func, int page_num) { @@ -271,6 +313,9 @@ main_gui_notebook_set_page(int page_num) { g_return_if_fail(UNSIGNED(page_num) < nb_main_page_num); + + entropy_harvest_single(VARLEN(page_num)); + gtk_notebook_set_current_page( GTK_NOTEBOOK(gui_main_window_lookup("notebook_main")), page_num); @@ -368,7 +413,7 @@ on_main_gui_map_event, NULL); } -static void +static void gui_init_dlg_prefs(void) { #ifdef USE_GTK2 @@ -491,13 +536,13 @@ }; GtkWidget *text; guint i; - + text = gui_dlg_about_lookup("textview_about_contributors"); gtk_label_set_text( GTK_LABEL(gui_dlg_about_lookup("label_about_title")), guc_version_get_version_string()); - for (i = 0; i < G_N_ELEMENTS(contributors); i++) { + for (i = 0; i < N_ITEMS(contributors); i++) { if (i > 0) text_widget_append(GTK_WIDGET(text), "\n"); text_widget_append(GTK_WIDGET(text), @@ -539,16 +584,16 @@ HFREE_NULL(userrc); userrc = h_strconcat(guc_settings_home_dir(), - G_DIR_SEPARATOR_S, ".gtk", G_DIR_SEPARATOR_S, "gtkrc", (void *) 0); + G_DIR_SEPARATOR_S, ".gtk", G_DIR_SEPARATOR_S, "gtkrc", NULL_PTR); gtk_rc_parse(userrc); HFREE_NULL(userrc); #ifdef USE_GTK2 userrc = h_strconcat(guc_settings_home_dir(), - G_DIR_SEPARATOR_S, ".gtk2", G_DIR_SEPARATOR_S, "gtkrc", (void *) 0); + G_DIR_SEPARATOR_S, ".gtk2", G_DIR_SEPARATOR_S, "gtkrc", NULL_PTR); #else userrc = h_strconcat(guc_settings_home_dir(), - G_DIR_SEPARATOR_S, ".gtk1", G_DIR_SEPARATOR_S, "gtkrc", (void *) 0); + G_DIR_SEPARATOR_S, ".gtk1", G_DIR_SEPARATOR_S, "gtkrc", NULL_PTR); #endif gtk_rc_parse(userrc); HFREE_NULL(userrc); @@ -566,7 +611,7 @@ main_gui_show_prefences(void) { g_return_if_fail(gui_dlg_prefs()); - + gtk_widget_show(gui_dlg_prefs()); gui_restore_window(gui_dlg_prefs(), PROP_PREFS_DLG_COORDS); gdk_window_raise(gui_dlg_prefs()->window); @@ -576,20 +621,20 @@ void main_gui_init_osx() { GError *err = NULL; - GtkOSXApplication *theApp = g_object_new(GTK_TYPE_OSX_APPLICATION, NULL); + GtkosxApplication *theApp = g_object_new(GTKOSX_TYPE_APPLICATION, NULL); GtkUIManager *mgr = gtk_ui_manager_new(); GtkWidget *item; GtkWidget *sep; GtkWidget *menubar; - + g_signal_connect(theApp, "NSApplicationBlockTermination", G_CALLBACK(on_button_quit_clicked), NULL); g_signal_connect(theApp, "NSApplicationDidBecomeActive", G_CALLBACK(on_NSApplicationDidBecomeActive), NULL); g_signal_connect(theApp, "NSApplicationOpenFile", G_CALLBACK(on_NSApplicationOpenFile), NULL); - - gtk_ui_manager_add_ui_from_string(mgr, + + gtk_ui_manager_add_ui_from_string(mgr, "<ui>" "<menubar name='MenuBar'>" "<menu name='File' action='FileAction'>" @@ -608,23 +653,23 @@ " <menuitem action='menu_uploads_visible'/>" " <menuitem action='menu_connections_visible'/>" " </menu>" - + " <menu action='menu_http_stats_visible'>" " <menuitem action='menu_bws_in_visible'/>" " <menuitem action='menu_bws_out_visible'/>" " </menu>" - + " <menu action='menu_gnet_stats_visible'>" " <menuitem action='menu_bws_gin_visible'/>" " <menuitem action='menu_bws_gout_visible'/>" " </menu>" - + " <menu action='menu_gnet_leaf_stats_visible'>" " <menuitem action='menu_autohide_bws_gleaf'/>" " <menuitem action='menu_bws_glin_visible'/>" " <menuitem action='menu_bws_glout_visible'/>" " </menu>" - + " <menu action='menu_dht_traffic_stats_visible'>" " <menuitem action='menu_autohide_bws_dht'/>" " <menuitem action='menu_bws_dht_in_visible'/>" @@ -638,152 +683,152 @@ "</menubar>" "</ui>", -1, &err); - - + + if (err != NULL) { g_error("%s", err->message); } static GtkActionEntry entries = { { "FileAction", NULL, "_File", NULL, NULL, NULL }, - { "PreferencesAction", GTK_STOCK_PREFERENCES, "Preferences", - NULL, "Set Viewing Preferences", + { "PreferencesAction", GTK_STOCK_PREFERENCES, "Preferences", + NULL, "Set Viewing Preferences", G_CALLBACK(on_menu_prefs_activate) }, - - { "CloseWindow", NULL, "Close window", + + { "CloseWindow", NULL, "Close window", "<meta>W", NULL, G_CALLBACK(on_main_window_delete_event_hide) }, - - { "QuitAction", GTK_STOCK_QUIT, "_Quit", - "<control>q", "Quit Gtk-Gnutella", + + { "QuitAction", GTK_STOCK_QUIT, "_Quit", + "<control>q", "Quit Gtk-Gnutella", G_CALLBACK (on_button_quit_clicked) }, - - { "ViewAction", NULL, "View", NULL, NULL, NULL }, - + + { "ViewAction", NULL, "View", NULL, NULL, NULL }, + { "connection_counters1", NULL, "Connection counters", NULL, NULL, NULL }, - - { "menu_http_stats_visible", NULL, + + { "menu_http_stats_visible", NULL, "_HTTP traffic stats", NULL, NULL, NULL }, - - { "menu_gnet_stats_visible", NULL, + + { "menu_gnet_stats_visible", NULL, "Gnutella _traffic stats", NULL, NULL, NULL }, - - { "menu_gnet_leaf_stats_visible", NULL, + + { "menu_gnet_leaf_stats_visible", NULL, "Gnutella _leaf traffic stats", NULL, NULL, NULL }, - - { "menu_dht_traffic_stats_visible", NULL, + + { "menu_dht_traffic_stats_visible", NULL, "DHT traffic stats", NULL, NULL, NULL }, - - + + { "HelpAction", NULL, "_Help", NULL, NULL, NULL }, { "FAQAction", NULL, "_FAQ", - NULL, "Show Frequently Asked Questions", + NULL, "Show Frequently Asked Questions", G_CALLBACK(on_menu_faq_activate) }, - { "AboutAction", NULL, - "_About Gtk-Gnutella", "<control>a", "About Gtk-Gnutella", + { "AboutAction", NULL, + "_About Gtk-Gnutella", "<control>a", "About Gtk-Gnutella", G_CALLBACK(on_menu_about_activate) } }; - + static const GtkToggleActionEntry toggle_entries = { - { "menu_searchbar_visible", NULL, - "Show Search_bar", "F2", NULL, + { "menu_searchbar_visible", NULL, + "Show Search_bar", "F2", NULL, G_CALLBACK(on_menu_searchbar_visible_activate), TRUE }, - { "menu_sidebar_visible", NULL, - "Show _Sidebar", "F8", NULL, + { "menu_sidebar_visible", NULL, + "Show _Sidebar", "F8", NULL, G_CALLBACK(on_menu_sidebar_visible_activate), TRUE }, - { "menu_menubar_visible", NULL, - "Show _Menubar", "F9", NULL, + { "menu_menubar_visible", NULL, + "Show _Menubar", "F9", NULL, G_CALLBACK(on_menu_menubar_visible_activate), TRUE }, - { "menu_statusbar_visible", NULL, + { "menu_statusbar_visible", NULL, "Show _Statusbar", NULL, NULL, G_CALLBACK(on_menu_statusbar_visible_activate), TRUE}, - - { "menu_downloads_visible", NULL, + + { "menu_downloads_visible", NULL, "Show _Downloads", NULL, NULL, G_CALLBACK(on_menu_downloads_visible_activate), TRUE }, - { "menu_uploads_visible", NULL, + { "menu_uploads_visible", NULL, "Show _Uploads", NULL, NULL, G_CALLBACK(on_menu_uploads_visible_activate), TRUE }, - { "menu_connections_visible", NULL, + { "menu_connections_visible", NULL, "Show _Peers", NULL, NULL, G_CALLBACK(on_menu_connections_visible_activate), TRUE }, - - - { "menu_bws_in_visible", NULL, + + + { "menu_bws_in_visible", NULL, "Show _inbound HTTP traffic", NULL, NULL, G_CALLBACK(on_menu_bws_in_visible_activate), TRUE }, - { "menu_bws_out_visible", NULL, + { "menu_bws_out_visible", NULL, "Show _outbound HTTP traffic", NULL, NULL, G_CALLBACK(on_menu_bws_out_visible_activate), TRUE }, - - { "menu_bws_gin_visible", NULL, + + { "menu_bws_gin_visible", NULL, "Show _inbound Gnutella traffic" ,NULL, NULL, G_CALLBACK(on_menu_bws_gin_visible_activate), TRUE }, - { "menu_bws_gout_visible", NULL, + { "menu_bws_gout_visible", NULL, "Show _outbound Gnutella traffic", NULL, NULL, G_CALLBACK(on_menu_bws_gout_visible_activate), TRUE }, - - { "menu_autohide_bws_gleaf", NULL, + + { "menu_autohide_bws_gleaf", NULL, "_Auto-hide leaf traffic stats", NULL, NULL, G_CALLBACK(on_menu_autohide_bws_gleaf_activate), TRUE }, - { "menu_bws_glin_visible", NULL, + { "menu_bws_glin_visible", NULL, "Show _inbound leaf traffic", NULL, NULL, G_CALLBACK(on_menu_bws_glin_visible_activate), TRUE }, - { "menu_bws_glout_visible", NULL, + { "menu_bws_glout_visible", NULL, "Show _outbound leaf traffic", NULL, NULL, G_CALLBACK(on_menu_bws_glout_visible_activate), TRUE }, - - { "menu_autohide_bws_dht", NULL, + + { "menu_autohide_bws_dht", NULL, "auto-hide DHT traffic stats", NULL, NULL, G_CALLBACK(on_menu_autohide_bws_dht_activate), TRUE }, - { "menu_bws_dht_in_visible", NULL, + { "menu_bws_dht_in_visible", NULL, "Show inbound DHT traffic", NULL, NULL, G_CALLBACK(on_menu_bws_dht_in_visible_activate), TRUE }, - { "menu_bws_dht_out_visible", NULL, + { "menu_bws_dht_out_visible", NULL, "Show outbound DHT traffic", NULL, NULL, G_CALLBACK(on_menu_bws_dht_out_visible_activate), TRUE }, - + }; - + GtkActionGroup *actions = gtk_action_group_new ("Actions"); - gtk_action_group_add_actions (actions, entries, - G_N_ELEMENTS (entries), NULL); - gtk_action_group_add_toggle_actions(actions, toggle_entries, - G_N_ELEMENTS (toggle_entries), NULL); + gtk_action_group_add_actions (actions, entries, + N_ITEMS (entries), NULL); + gtk_action_group_add_toggle_actions(actions, toggle_entries, + N_ITEMS (toggle_entries), NULL); gtk_ui_manager_insert_action_group (mgr, actions, 0); - + menubar = gtk_ui_manager_get_widget(mgr, "/MenuBar"); - - - gtk_osxapplication_set_menu_bar(theApp, GTK_MENU_SHELL(menubar)); - gtk_osxapplication_set_use_quartz_accelerators(theApp, TRUE); - - + + + gtkosx_application_set_menu_bar(theApp, GTK_MENU_SHELL(menubar)); + gtkosx_application_set_use_quartz_accelerators(theApp, TRUE); + + item = gtk_ui_manager_get_widget(mgr, "/MenuBar/File/Quit"); gtk_widget_hide(GTK_WIDGET(item)); - + item = gtk_ui_manager_get_widget(mgr, "/MenuBar/View/menu_statusbar_visible"); gtk_widget_hide(GTK_WIDGET(item)); - + item = gtk_ui_manager_get_widget(mgr,"/MenuBar/Help/About"); - gtk_osxapplication_insert_app_menu_item (theApp, item, 0); + gtkosx_application_insert_app_menu_item (theApp, item, 0); sep = gtk_separator_menu_item_new(); g_object_ref(sep); - gtk_osxapplication_insert_app_menu_item (theApp, sep, 1); - + gtkosx_application_insert_app_menu_item (theApp, sep, 1); + item = gtk_ui_manager_get_widget(mgr,"/MenuBar/File/Preferences"); - gtk_osxapplication_insert_app_menu_item (theApp, item, 2); - - + gtkosx_application_insert_app_menu_item (theApp, item, 2); + + GtkWidget *dock_menu = gtk_menu_new(); - + item = gtk_menu_item_new_with_label("Toon"); g_signal_connect_data (item, "activate", G_CALLBACK (on_NSApplicationDidBecomeActive),0,0, 0); gtk_menu_append(dock_menu, item); - - gtk_osxapplication_set_dock_menu(theApp, GTK_MENU_SHELL(dock_menu)); - - gtk_osxapplication_ready(theApp); + + gtkosx_application_set_dock_menu(theApp, GTK_MENU_SHELL(dock_menu)); + + gtkosx_application_ready(theApp); } #endif @@ -796,8 +841,8 @@ void main_gui_early_init(gint argc, gchar **argv, gboolean disable_xshm) { - char *tmp; - + static const char pixmaps = "pixmaps"; + /* Glade inits */ gtk_set_locale(); @@ -806,23 +851,29 @@ #ifdef HAVE_GTKOSXAPPLICATION main_gui_init_osx(); #endif - + if (disable_xshm) gdk_set_use_xshm(FALSE); add_pixmap_directory(native_path(PRIVLIB_EXP G_DIR_SEPARATOR_S "pixmaps")); + #ifndef OFFICIAL_BUILD add_pixmap_directory( native_path(PACKAGE_SOURCE_DIR G_DIR_SEPARATOR_S "pixmaps")); #endif - tmp = get_folder_path(PRIVLIB_PATH, "pixmaps"); - if (tmp != NULL) { - add_pixmap_directory(native_path(tmp)); - HFREE_NULL(tmp); + { + const char *path = get_folder_path(PRIVLIB_PATH); + + if (path != NULL) { + char *tmp = h_strconcat(path, G_DIR_SEPARATOR_S, pixmaps, NULL_PTR); + add_pixmap_directory(native_path(tmp)); + HFREE_NULL(tmp); + } } + #ifdef MINGW32 - add_pixmap_directory(mingw_filename_nearby("pixmaps")); + add_pixmap_directory(mingw_filename_nearby(pixmaps)); #endif gui_main_window_set(create_main_window()); @@ -830,11 +881,12 @@ gui_shutdown_window_set(create_shutdown_window()); gui_dlg_quit_set(create_dlg_quit()); - + gui_dlg_about_set(create_dlg_about()); gui_init_dlg_about(); gui_dlg_faq_set(create_dlg_faq()); + gui_dlg_glossary_set(create_dlg_glossary()); gui_dlg_ancient_set(create_dlg_ancient()); gui_dlg_prefs_set(create_dlg_prefs()); @@ -866,7 +918,7 @@ void main_gui_exit(int n) { - crash_close(); + exit_cleanup(); gtk_exit(n); } @@ -943,10 +995,10 @@ if (geometry_spec) { guint32 coord4 = { 0, 0, 0, 0 }; - gui_prop_get_guint32(PROP_WINDOW_COORDS, coord, 0, G_N_ELEMENTS(coord)); + gui_prop_get_guint32(PROP_WINDOW_COORDS, coord, 0, N_ITEMS(coord)); if (0 == gui_parse_geometry_spec(geometry_spec, coord)) { gui_prop_set_guint32(PROP_WINDOW_COORDS, - coord, 0, G_N_ELEMENTS(coord)); + coord, 0, N_ITEMS(coord)); } } gui_restore_window(gui_main_window(), PROP_WINDOW_COORDS); @@ -1064,10 +1116,10 @@ main_gui_shutdown(void) { unsigned i; - + gui_save_window(gui_main_window(), PROP_WINDOW_COORDS); - for (i = 0; i < G_N_ELEMENTS(visibility_listeners); i++) { + for (i = 0; i < N_ITEMS(visibility_listeners); i++) { gm_slist_free_null(&visibility_listenersi); } slist_free(&timers); @@ -1092,8 +1144,8 @@ fi_gui_shutdown(); nodes_gui_shutdown(); uploads_gui_shutdown(); - upload_stats_common_gui_shutdown(); upload_stats_gui_shutdown(); + upload_stats_common_gui_shutdown(); gnet_stats_gui_shutdown(); hcache_gui_shutdown(); statusbar_gui_shutdown();
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/main.h -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/main.h
Changed
@@ -44,6 +44,7 @@ WIDGET(dlg_about) WIDGET(dlg_ancient) WIDGET(dlg_faq) +WIDGET(dlg_glossary) WIDGET(dlg_prefs) WIDGET(dlg_quit) WIDGET(main_window) @@ -70,6 +71,9 @@ typedef void (*main_gui_visibility_cb)(gboolean visible); +void main_gui_add_visibility_listener(main_gui_visibility_cb); +void main_gui_remove_visibility_listener(main_gui_visibility_cb); + void main_gui_add_page_visibility_listener(main_gui_visibility_cb, int page); void main_gui_remove_page_visibility_listener(main_gui_visibility_cb, int page);
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/main_cb.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/main_cb.c
Changed
@@ -33,6 +33,7 @@ #include "if/gui_property.h" #include "if/bridge/ui2c.h" +#include "lib/crash.h" #include "lib/file.h" #include "lib/halloc.h" #include "lib/omalloc.h" @@ -44,67 +45,83 @@ *** Private functions ***/ -static struct html_view *faq_html_view; +struct textview_info { + const char *file; + file_path_t fp6; + struct html_view *view; + uint fp_cnt; +}; -static G_GNUC_COLD void -load_faq(void) +static struct textview_info faq_textview = { + .file = "FAQ", +}; + +static struct textview_info glossary_textview = { + .file = "glossary", +}; + +static void G_COLD +load_textview(GtkWidget *textview, + struct textview_info *ti, const struct array dflt) { - static const gchar faq_file = "FAQ"; - static file_path_t fp6; - static int initialized; - GtkWidget *textview; - const gchar *lang; - guint i = 0; + const char *lang; + uint i = 0; FILE *f; - html_view_free(&faq_html_view); + html_view_free(&ti->view); - textview = gui_dlg_faq_lookup("textview_faq"); lang = locale_get_language(); - if (initialized != 0) { - i = initialized; + if (ti->fp_cnt != 0) { + i = ti->fp_cnt; } else { - char *tmp; + const char *tmp; char *path; - tmp = get_folder_path(PRIVLIB_PATH, NULL); - + tmp = get_folder_path(PRIVLIB_PATH); + if (tmp != NULL) { path = make_pathname(tmp, lang); - file_path_set(&fpi++, ostrdup(path), faq_file); + file_path_set(&ti->fpi++, ostrdup(path), ti->file); HFREE_NULL(path); path = make_pathname(tmp, "en"); - file_path_set(&fpi++, ostrdup(path), faq_file); + file_path_set(&ti->fpi++, ostrdup(path), ti->file); HFREE_NULL(path); } - HFREE_NULL(tmp); - path = make_pathname(PRIVLIB_EXP, lang); - file_path_set(&fpi++, ostrdup(path), faq_file); + file_path_set(&ti->fpi++, ostrdup(path), ti->file); HFREE_NULL(path); - file_path_set(&fpi++, PRIVLIB_EXP G_DIR_SEPARATOR_S "en", faq_file); - + file_path_set(&ti->fpi++, + PRIVLIB_EXP G_DIR_SEPARATOR_S "en", ti->file); + #ifndef OFFICIAL_BUILD path = make_pathname(PACKAGE_EXTRA_SOURCE_DIR, lang); - file_path_set(&fpi++, ostrdup(path), faq_file); + file_path_set(&ti->fpi++, ostrdup(path), ti->file); HFREE_NULL(path); - file_path_set(&fpi++, - PACKAGE_EXTRA_SOURCE_DIR G_DIR_SEPARATOR_S "en", faq_file); + file_path_set(&ti->fpi++, + PACKAGE_EXTRA_SOURCE_DIR G_DIR_SEPARATOR_S "en", ti->file); #endif /* !OFFICIAL_BUILD */ - initialized = i; + + ti->fp_cnt = i; } - g_assert(i <= G_N_ELEMENTS(fp)); + g_assert(i <= N_ITEMS(ti->fp)); - f = file_config_open_read_norename("FAQ", fp, i); - if (f) { - faq_html_view = html_view_load_file(textview, fileno(f)); + f = file_config_open_read_norename(ti->file, ti->fp, i); + if (f != NULL) { + ti->view = html_view_load_file(textview, fileno(f)); fclose(f); } else { - static const gchar msg = + ti->view = html_view_load_memory(textview, dflt); + } +} + +static void G_COLD +load_faq(void) +{ + static const char msg = N_( "<html>" "<head>" @@ -120,8 +137,33 @@ "</html>" ); - faq_html_view = html_view_load_memory(textview, array_from_string(msg)); - } + load_textview( + gui_dlg_faq_lookup("textview_faq"), + &faq_textview, + array_from_string(msg)); +} + +static void G_COLD +load_glossary(void) +{ + static const char msg = + N_( + "<html>" + "<head>" + "<title>Glossary</title>" + "</head>" + "<body>" + "<p>" + "The glossary document could not be loaded." + "</p>" + "</body>" + "</html>" + ); + + load_textview( + gui_dlg_glossary_lookup("textview_glossary"), + &glossary_textview, + array_from_string(msg)); } static gboolean quitting; @@ -143,6 +185,7 @@ gui_prop_get_boolean_val(PROP_CONFIRM_QUIT, &confirm); if (force || !confirm) { quitting = TRUE; + crash_ctl(CRASH_FLAG_CLEAR, CRASH_F_RESTART); guc_gtk_gnutella_exit(0); } else { gtk_widget_show(gui_dlg_quit()); @@ -184,34 +227,34 @@ (void) unused_widget; (void) unused_event; (void) unused_udata; - + gtk_widget_hide(gui_main_window()); - + return TRUE; } gboolean -on_NSApplicationOpenFile(GtkOSXApplication *app, gchar *path, +on_NSApplicationOpenFile(GtkosxApplication *app, gchar *path, gpointer user_data) { (void) app; (void) path; (void) user_data; - + gtk_widget_show(gui_main_window()); - - return TRUE; + + return TRUE; } gboolean -on_NSApplicationDidBecomeActive(GtkOSXApplication *app, gpointer user_data) +on_NSApplicationDidBecomeActive(GtkosxApplication *app, gpointer user_data) { (void) app; (void) user_data; - + if (!quitting) gtk_widget_show(gui_main_window()); - + return TRUE; } @@ -272,6 +315,19 @@ } void +on_menu_glossary_activate(GtkMenuItem *unused_menuitem, gpointer unused_udata) +{ + (void) unused_menuitem; + (void) unused_udata; + + g_return_if_fail(gui_dlg_glossary()); + load_glossary(); + gtk_widget_show(gui_dlg_glossary()); + g_return_if_fail(gui_dlg_glossary()->window); + gdk_window_raise(gui_dlg_glossary()->window); +} + +void on_menu_prefs_activate(GtkMenuItem *unused_menuitem, gpointer unused_udata) { (void) unused_menuitem; @@ -303,7 +359,7 @@ (void) unused_udata; g_return_if_fail(gui_dlg_about()); - + gtk_widget_hide(gui_dlg_about()); } @@ -332,9 +388,11 @@ ancient_version_dialog_hide(); return TRUE; } + /*** *** FAQ dialog ***/ + gboolean on_dlg_faq_delete_event(GtkWidget *unused_widget, GdkEvent *unused_event, gpointer unused_udata) @@ -345,12 +403,31 @@ g_return_val_if_fail(gui_dlg_faq(), TRUE); - html_view_free(&faq_html_view); + html_view_free(&faq_textview.view); gtk_widget_hide(gui_dlg_faq()); return TRUE; } /*** + *** Glossary dialog + ***/ + +gboolean +on_dlg_glossary_delete_event(GtkWidget *unused_widget, GdkEvent *unused_event, + gpointer unused_udata) +{ + (void) unused_widget; + (void) unused_event; + (void) unused_udata; + + g_return_val_if_fail(gui_dlg_glossary(), TRUE); + + html_view_free(&glossary_textview.view); + gtk_widget_hide(gui_dlg_glossary()); + return TRUE; +} + +/*** *** prefs dialog ***/
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/main_cb.h -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/main_cb.h
Changed
@@ -37,11 +37,11 @@ GtkWidget *widget, GdkEvent *event, gpointer user_data); #ifdef HAVE_GTKOSXAPPLICATION -gboolean on_main_window_delete_event_hide(GtkWidget *unused_widget, +gboolean on_main_window_delete_event_hide(GtkWidget *unused_widget, GdkEvent *unused_event, gpointer unused_udata); -gboolean on_NSApplicationOpenFile(GtkOSXApplication *app, gchar *path, +gboolean on_NSApplicationOpenFile(GtkosxApplication *app, gchar *path, gpointer user_data); -gboolean on_NSApplicationDidBecomeActive(GtkOSXApplication *app, +gboolean on_NSApplicationDidBecomeActive(GtkosxApplication *app, gpointer user_data); #endif /***
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/misc.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/misc.c
Changed
@@ -48,8 +48,8 @@ #include "if/bridge/ui2c.h" #include "lib/ascii.h" -#include "lib/glib-missing.h" #include "lib/parse.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/override.h" /* Must be the last header included */ @@ -62,7 +62,7 @@ gui_update_files_scanned(void) { static GtkLabel *label_files_scanned = NULL; - gulong n = guc_shared_files_scanned(); + ulong n = guc_shared_files_scanned(); if (label_files_scanned == NULL) label_files_scanned = @@ -100,7 +100,7 @@ { gchar buf128; - gm_snprintf(buf, sizeof buf, "<tt>%s</tt>", uptime); + str_bprintf(buf, sizeof buf, "<tt>%s</tt>", uptime); gtk_label_set_use_markup(label, TRUE); gtk_label_set_markup(label, buf); } @@ -134,7 +134,7 @@ current); frac = (high_limit == 0) ? 0 : (gfloat) current / high_limit; - gm_snprintf(buf, sizeof buf, "%s %s %s", + str_bprintf(buf, sizeof buf, "%s %s %s", short_rate(current, show_metric_units()), inout ? _("in") : _("out"), avg_mode ? _("(avg)") : ""); @@ -519,7 +519,7 @@ anti_window_shift_hack(GtkWidget *widget, int x, int y, int width, int height) { int ax, ay, dx, dy; - + /* First, move the window to the supposed location. Next make the * window visible by gtk_window_get_position()... */ @@ -542,7 +542,7 @@ if (abs(dx) > 64 || abs(dy) > 64) return; - + g_debug("anti_window_shift_hack: " "x=%d, y=%d, ax=%d, ay=%d , dx=%d, dy=%d", x, y, ax, ay, dx, dy); @@ -551,7 +551,7 @@ gtk_window_get_position(GTK_WINDOW(widget), &ax, &ay); if (ax == x && ay == y) return; - + g_debug("anti_window_shift_hack failed: ax=%d, ay=%d", ax, ay); } @@ -561,7 +561,7 @@ guint32 coord4 = { 0, 0, 0, 0 }; int x, y, width, height; - gui_prop_get_guint32(prop, coord, 0, G_N_ELEMENTS(coord)); + gui_prop_get_guint32(prop, coord, 0, N_ITEMS(coord)); gui_fix_coords(coord); x = coord0; y = coord1; @@ -594,7 +594,7 @@ coord1 = y; coord2 = w; coord3 = h; - gui_prop_set_guint32(prop, coord, 0, G_N_ELEMENTS(coord)); + gui_prop_set_guint32(prop, coord, 0, N_ITEMS(coord)); } #ifdef USE_GTK2 @@ -709,11 +709,11 @@ ctx->found = TRUE; return TRUE; /* stop traversal */ } - + return FALSE; /* continue traversal */ } -gboolean +gboolean tree_find_iter_by_data(GtkTreeModel *model, guint column, gconstpointer data, GtkTreeIter *iter) { @@ -736,7 +736,7 @@ paned_save_position(GtkPaned *paned, property_t prop) { guint32 pos; - + g_return_if_fail(paned); pos = gtk_paned_get_position(paned); @@ -747,7 +747,7 @@ paned_restore_position(GtkPaned *paned, property_t prop) { guint32 pos; - + g_return_if_fail(paned); gui_prop_get_guint32_val(prop, &pos); @@ -793,7 +793,7 @@ gui_prop_get_guint32(prop, &width, i, 1); g_object_set(G_OBJECT(c), "fixed-width", MAX(1, (gint32) width), - (void *) 0); + NULL_PTR); } } @@ -919,7 +919,7 @@ menu = (*handler)(); if (menu) { int button; - + /* * NOTE: Use 0 as button here even though 3 was probably pressed * (right-click) because under Gtk+ 1.2 the popup will otherwise
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/nodes_common.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/nodes_common.c
Changed
@@ -47,9 +47,9 @@ #include "if/gui_property_priv.h" #include "lib/ascii.h" -#include "lib/glib-missing.h" #include "lib/parse.h" #include "lib/random.h" +#include "lib/str.h" #include "lib/halloc.h" #include "lib/walloc.h" @@ -92,7 +92,7 @@ size_t slen = 0; if (!GUI_PROPERTY(node_show_detailed_info)) { - gm_snprintf(gui_tmp, sizeof(gui_tmp), + str_bprintf(gui_tmp, sizeof(gui_tmp), "TX=%u RX=%u Q=%u,%u%% %s", n->sent, n->received, n->mqueue_count, n->mqueue_percent_used, @@ -103,10 +103,10 @@ } if (n->tx_compressed && GUI_PROPERTY(show_gnet_info_txc)) - slen += gm_snprintf(gui_tmp, sizeof(gui_tmp), "TXc=%u,%d%%", + slen += str_bprintf(gui_tmp, sizeof(gui_tmp), "TXc=%u,%d%%", n->sent, (int) (n->tx_compression_ratio * 100.0)); else - slen += gm_snprintf(gui_tmp, sizeof(gui_tmp), "TX=%u", + slen += str_bprintf(gui_tmp, sizeof(gui_tmp), "TX=%u", n->sent); if ( @@ -115,30 +115,30 @@ ) { gboolean is_first = TRUE; - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, " (" /* ')' */); if (GUI_PROPERTY(show_gnet_info_tx_wire)) { - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, "%s", compact_size(n->tx_written, show_metric_units())); is_first = FALSE; } if (GUI_PROPERTY(show_gnet_info_tx_speed)) - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, "%s%s", is_first ? "" : ", ", compact_rate(n->tx_bps, show_metric_units())); - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, /* '(' */ ")"); } if (n->rx_compressed && GUI_PROPERTY(show_gnet_info_rxc)) - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, " RXc=%u,%d%%", n->received, (int) (n->rx_compression_ratio * 100.0)); else - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, " RX=%u", n->received); if ( @@ -147,21 +147,21 @@ ) { gboolean is_first = TRUE; - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, " (" /* ')' */); if (GUI_PROPERTY(show_gnet_info_rx_wire)) { - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, "%s", compact_size(n->rx_given, show_metric_units())); is_first = FALSE; } if (GUI_PROPERTY(show_gnet_info_rx_speed)) - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, "%s%s", is_first ? "" : ", ", compact_rate(n->rx_bps, show_metric_units())); - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, /* '(' */ ")"); } @@ -173,29 +173,29 @@ ) { gboolean is_first = TRUE; - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, " Query(" /* ')' */); if (GUI_PROPERTY(show_gnet_info_gen_queries)) { - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, "Gen=%u", n->squeue_sent); is_first = FALSE; } if (GUI_PROPERTY(show_gnet_info_sq_queries)) { - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, "%sQ=%u", is_first ? "" : ", ", n->squeue_count); is_first = FALSE; } if (GUI_PROPERTY(show_gnet_info_tx_queries)) { - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, "%sTX=%u", is_first ? "" : ", ", n->tx_queries); is_first = FALSE; } if (GUI_PROPERTY(show_gnet_info_rx_queries)) - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, "%sRX=%u", is_first ? "" : ", ", n->rx_queries); - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, /* '(' */ ")"); } @@ -205,19 +205,19 @@ ) { gboolean is_first = TRUE; - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, " QHit(" /* ')' */); if (GUI_PROPERTY(show_gnet_info_tx_hits)) { - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, "TX=%u", n->tx_qhits); is_first = FALSE; } if (GUI_PROPERTY(show_gnet_info_rx_hits)) - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, "%sRX=%u", is_first ? "" : ", ", n->rx_qhits); - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, /* '(' */ ")"); } @@ -227,19 +227,19 @@ ) { gboolean is_first = TRUE; - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, " Drop(" /* ')' */); if (GUI_PROPERTY(show_gnet_info_tx_dropped)) { - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, "TX=%u", n->tx_dropped); is_first = FALSE; } if (GUI_PROPERTY(show_gnet_info_rx_dropped)) - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, "%sRX=%u", is_first ? "" : ", ", n->rx_dropped); - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, /* '(' */ ")"); } @@ -249,14 +249,14 @@ ) { gboolean is_first = TRUE; - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, " Lib(" /* ')' */); if ( GUI_PROPERTY(show_gnet_info_shared_size) && n->gnet_info_known ) { - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, "%s", compact_kb_size(n->gnet_files_count ? n->gnet_kbytes_count : 0, show_metric_units())); @@ -266,21 +266,21 @@ GUI_PROPERTY(show_gnet_info_shared_files) && n->gnet_info_known ) { - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, "%s#=%u", is_first ? "" : ", ", n->gnet_files_count); } - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, /* '(' */ "%s)", n->gnet_info_known ? "" : "?"); } if (GUI_PROPERTY(show_gnet_info_qrp_stats)) { if (n->has_qrp) - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, " QRP=%u%%", (guint) (n->qrp_efficiency * 100.0)); if (n->qrt_slots != 0) - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, " QRT(%s, g=%u, f=%u%%, t=%u%%, e=%u%%)", compact_size(n->qrt_slots, show_metric_units()), n->qrt_generation, @@ -289,25 +289,25 @@ } if (GUI_PROPERTY(show_gnet_info_dbw)) - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, " Dup=%u Bad=%u W=%u H=%u S=%u E=%u", n->n_dups, n->n_bad, n->n_weird, n->n_hostile, n->n_spam, n->n_evil); if (GUI_PROPERTY(show_gnet_info_rt)) { - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, " RT(avg=%u, last=%u", n->rt_avg, n->rt_last); /* ) */ if (n->tcp_rtt) - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, ", tcp=%u", n->tcp_rtt); if (n->udp_rtt) - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, ", udp=%u", n->udp_rtt); - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, /* ( */ ")"); } - slen += gm_snprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, + slen += str_bprintf(&gui_tmpslen, sizeof(gui_tmp)-slen, " Q=%u,%u%% %s", n->mqueue_count, n->mqueue_percent_used, n->in_tx_swift_control ? " SW" : @@ -322,7 +322,7 @@ case GTA_NODE_SHUTDOWN: { - gm_snprintf(gui_tmp, sizeof(gui_tmp), + str_bprintf(gui_tmp, sizeof(gui_tmp), _("Closing: %s Stop in %us RX=%u Q=%u,%u%%"), n->message, n->shutdown_remain, n->received, n->mqueue_count, n->mqueue_percent_used); @@ -348,6 +348,7 @@ struct add_node_context { guint32 flags; guint16 port; + bool g2; }; static void @@ -360,7 +361,12 @@ g_assert(0 != ctx->port); if (n > 0) { - guc_node_add(addrsrandom_u32() % n, ctx->port, ctx->flags); + const host_addr_t addr = addrsrandom_value(n - 1); + if (ctx->g2) { + guc_node_g2_add(addr, ctx->port, ctx->flags); + } else { + guc_node_add(addr, ctx->port, ctx->flags); + } } WFREE(ctx); @@ -376,7 +382,7 @@ * | <IPv4 address>":" <port> * | <IPv6 address> * | "" <IPv6 address> ":" <port> - * peer = "tls:"<node> + * peer = "tls:""g2:"<node> * * If the port is omitted, the default port (GTA_PORT: 6346) is used. * The case-insensitive prefix "tls:" requests a TLS (encrypted) connection. @@ -395,6 +401,7 @@ host_addr_t addr; guint32 flags; guint16 port; + bool g2; q = skip_ascii_spaces(q); if (',' == *q) { @@ -415,6 +422,14 @@ q = endptr; } + endptr = is_strcaseprefix(q, "g2:"); + if (endptr) { + g2 = TRUE; + q = endptr; + } else { + g2 = FALSE; + } + if (!string_to_host_or_addr(q, &endptr, &addr)) { g_message("expected hostname or IP address"); break; @@ -446,7 +461,11 @@ } if (!hostname) { - guc_node_add(addr, port, flags); + if (g2) { + guc_node_g2_add(addr, port, flags); + } else { + guc_node_add(addr, port, flags); + } } else { struct add_node_context *ctx; gchar *p; @@ -465,6 +484,7 @@ WALLOC(ctx); ctx->port = port; ctx->flags = flags; + ctx->g2 = g2; guc_adns_resolve(hostname, add_node_helper, ctx); HFREE_NULL(p);
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/search.h -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/search.h
Changed
@@ -66,7 +66,7 @@ unsigned search_gui_media_type(const struct search *); void search_gui_record_check(const struct record *); - + /** * Metadata Update. */
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/search_common.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/search_common.c
Changed
@@ -36,7 +36,6 @@ #include "gtk/search_common.h" #include "gtk/search_xml.h" -#include "gtk/bitzi.h" #include "gtk/clipboard.h" #include "gtk/drag.h" #include "gtk/drop.h" @@ -50,6 +49,7 @@ #include "if/gui_property_priv.h" #include "if/gnet_property.h" #include "if/core/downloads.h" +#include "if/core/guess.h" #include "if/core/guid.h" #include "if/core/search.h" #include "if/core/sockets.h" @@ -63,10 +63,15 @@ #include "lib/file.h" #include "lib/glib-missing.h" #include "lib/halloc.h" +#include "lib/hashing.h" +#include "lib/hset.h" +#include "lib/htable.h" #include "lib/iso3166.h" #include "lib/magnet.h" #include "lib/mime_type.h" +#include "lib/misc.h" /* For xml_indent() */ #include "lib/parse.h" +#include "lib/pslist.h" #include "lib/random.h" #include "lib/slist.h" #include "lib/str.h" @@ -74,7 +79,6 @@ #include "lib/timestamp.h" #include "lib/tm.h" #include "lib/url.h" -#include "lib/url_factory.h" #include "lib/urn.h" #include "lib/utf8.h" #include "lib/walloc.h" @@ -89,7 +93,7 @@ * the core about the amount of "kept" results, we tie each result to the MUID * of the query that generated it. * - * This allows to give accurate feedback to the number of results "kept" for + * This allows us to give accurate feedback to the number of results "kept" for * a GUESS query. */ struct accum_rs { @@ -98,6 +102,7 @@ }; static GList *list_searches; /**< List of search structs */ +static htable_t *ht_searches; /**< Maps a gnet_search_t to a search_t */ static search_t *current_search; /**< The search currently displayed */ @@ -109,9 +114,12 @@ static GtkNotebook *notebook_search_results; static GtkLabel *label_items_found; static GtkLabel *label_search_expiry; +static GtkLabel *label_guess_stats; +static GtkWidget *guess_stats_line; static gboolean store_searches_requested; static gboolean store_searches_disabled; +static gboolean search_gui_visible; static record_t *search_details_record; @@ -123,6 +131,7 @@ guint32 flag; const gchar *status; } open_flags = { + { ST_G2, N_("g2") }, /* Make sure this is shown first */ { ST_BUSY, N_("busy") }, { ST_UPLOADED, N_("stable") }, /**< Allows uploads -> stable */ { ST_FIREWALL, N_("push") }, @@ -150,7 +159,7 @@ { "#708090", GUI_COLOR_PUSH, { 0, 0, 0, 0 } }, /* slate gray */ { "#2F4F4F", GUI_COLOR_PUSH_PROXY, { 0, 0, 0, 0 } }, /* dark slate gray */ { "#7B68EE", GUI_COLOR_PARTIAL_PUSH,{ 0, 0, 0, 0 } }, /* med. slate blue */ - { "#DCDC00", GUI_COLOR_PARTIAL, { 0, 0, 0, 0 } }, /* yellow */ + { "#D7B700", GUI_COLOR_PARTIAL, { 0, 0, 0, 0 } }, /* gold (darker) */ { "#8B4513", GUI_COLOR_MEDIA, { 0, 0, 0, 0 } }, /* chocolate4 */ { "#FFFFFF", GUI_COLOR_BACKGROUND, { 0, 0, 0, 0 } }, /* white */ }; @@ -181,7 +190,7 @@ return; initialized = TRUE; - STATIC_ASSERT(NUM_GUI_COLORS == G_N_ELEMENTS(colors)); + STATIC_ASSERT(NUM_GUI_COLORS == N_ITEMS(colors)); cmap = gdk_colormap_get_system(); g_assert(cmap); @@ -314,11 +323,11 @@ } query = search_gui_query(search); if (search_gui_is_browse(search)) { - name = g_strconcat("browse:", query, (void *) 0); + name = g_strconcat("browse:", query, NULL_PTR); } else if (search_gui_is_passive(search)) { - name = g_strconcat("passive:", query, (void *) 0); + name = g_strconcat("passive:", query, NULL_PTR); } else if (search_gui_is_local(search)) { - name = g_strconcat("local:", query, (void *) 0); + name = g_strconcat("local:", query, NULL_PTR); } else { name = g_strdup(query); } @@ -333,18 +342,20 @@ gchar titleBITPRINT_BASE32_SIZE * 4 + sizeof ellipse; const gchar *ui_query; size_t title_size; + size_t filled; ui_query = lazy_utf8_to_ui_string(name); title_size = sizeof title - sizeof ellipse; utf8_strcpy_max(title, title_size, ui_query, BITPRINT_BASE32_SIZE); - if (strlen(title) < strlen(ui_query)) { - strncat(title, ellipse, CONST_STRLEN(ellipse)); + filled = strlen(title); + if (filled < strlen(ui_query)) { + strncat(title, ellipse, sizeof title - filled - 1); } item = gtk_menu_item_new_with_label(title); } G_FREE_NULL(name); - + gtk_widget_show(item); gtk_object_set_user_data(GTK_OBJECT(item), search); gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), item); @@ -380,7 +391,7 @@ g_return_if_fail(option_menu_searches_frozen > 0); if (--option_menu_searches_frozen > 0) return; - + search_gui_option_menu_searches_update(); search_gui_option_menu_searches_select(current_search); } @@ -401,33 +412,50 @@ search->unseen_items > 0 ? ", " : "", search->unseen_items > 0 ? uint32_to_string(search->unseen_items) : "", ")", - (void *) 0); + NULL_PTR); gtk_notebook_set_tab_label_text(notebook_search_results, search->scrolled_window, label); } -void +/** + * @return how many downloads are currently associated with that search. + */ +unsigned +search_gui_download_count(const struct search *search) +{ + return guc_search_associated_sha1_count(search->search_handle); +} + +static void search_gui_update_status_label(const struct search *search) { - if (search != current_search) { - return; - } else if (NULL == search) { + char expire128; + char downloads48; + unsigned dlcount; + + if G_UNLIKELY(NULL == search) { gtk_label_printf(label_search_expiry, "%s", _("No search")); - } else if (!search_gui_is_enabled(search)) { + return; + } + + dlcount = search_gui_download_count(search); + expire0 = downloads0 = '\0'; + + if (!search_gui_is_enabled(search)) { unsigned queued = search_gui_queue_length(search); if (queued > 0) { - gtk_label_printf(label_search_expiry, + str_bprintf(expire, sizeof expire, _("Flushing queue (%u results pending)"), queued); } else { - gtk_label_printf(label_search_expiry, "%s", + str_bprintf(expire, sizeof expire, "%s", _("The search has been stopped")); } } else if (search_gui_is_passive(search)) { - gtk_label_printf(label_search_expiry, "%s", _("Passive search")); + str_bprintf(expire, sizeof expire, "%s", _("Passive search")); } else if (search_gui_is_expired(search)) { - gtk_label_printf(label_search_expiry, "%s", _("Expired")); + str_bprintf(expire, sizeof expire, "%s", _("Expired")); } else { unsigned time_left; @@ -435,19 +463,26 @@ if (time_left) { time_t created; time_delta_t d; - + created = guc_search_get_create_time(search->search_handle); - + d = delta_time(tm_time(), created); d = MAX(0, d); d = UNSIGNED(d) < time_left ? time_left - UNSIGNED(d) : 0; - gtk_label_printf(label_search_expiry, + str_bprintf(expire, sizeof expire, _("Expires in %s"), short_time(d)); } else { - gtk_label_printf(label_search_expiry, "%s", + str_bprintf(expire, sizeof expire, "%s", _("Expires with this session")); } } + + if (dlcount != 0) { + str_bprintf(downloads, sizeof downloads, + NG_(" %u download", " %u downloads", dlcount), dlcount); + } + + gtk_label_printf(label_search_expiry, "%s%s", expire, downloads); } /** @@ -456,9 +491,6 @@ static void search_gui_update_items_label(const struct search *search) { - if (search != current_search) - return; - if (search) { gtk_label_printf(label_items_found, _("%u %s " "(%u skipped, %u ignored, %u hidden, %u auto-d/l, %u %s)" @@ -477,6 +509,106 @@ } } +/** + * Can search be the target of a GUESS query? + */ +static bool +search_gui_can_use_guess(const struct search *search) +{ + g_return_val_if_fail(search != NULL, FALSE); + + return !search_gui_is_passive(search) && + !search_gui_is_whats_new(search) && + !search_gui_is_browse(search) && + !search_gui_is_local(search); +} + +/** + * Update the label string showing GUESS stats, if displayed. + */ +static void +search_gui_update_guess_stats(const struct search *search) +{ + char buf256; + + if ( + NULL == search || + !search_gui_can_use_guess(search) || + !GUI_PROPERTY(search_display_guess_stats) + ) + return; + + if (0 == search->guess_queries) { + g_strlcpy(buf, _("No GUESS queries run yet"), sizeof buf); + } else if ( + GUI_PROPERTY(guess_stats_show_total) || + 0 == search->guess_cur_start + ) { + /* + * Either they want summary stats or there are no currently running + * GUESS search: display summary only. + */ + char prev128; + uint64 hits = search->guess_results + search->guess_cur_results; + if (search->guess_elapsed != 0) { + str_bprintf(prev, sizeof prev, + _(" previous took %s querying %zu %s with %zu %s kept"), + compact_time(search->guess_elapsed), + search->guess_hosts, + NG_("host", "hosts", search->guess_hosts), + search->guess_last_kept, + NG_("hit", "hits", search->guess_last_kept)); + } else { + prev0 = '\0'; + } + str_bprintf(buf, sizeof buf, _("GUESS %s Total: %zu %s " + "(%s %s, %s kept, %s queries, %s keys)%s"), + 0 == search->guess_cur_start ? _("idle") : + compact_time(delta_time(tm_time(), search->guess_cur_start)), + search->guess_queries, + NG_("query", "queries", search->guess_queries), + uint64_to_string(hits), NG_("hit", "hits", hits), + uint64_to_string2(search->guess_kept + search->guess_cur_kept), + short_size( + search->guess_bw_query + search->guess_cur_bw_query, FALSE), + short_size2( + search->guess_bw_qk + search->guess_cur_bw_qk, FALSE), + prev); + } else { + size_t queried = search->guess_cur_ultra + search->guess_cur_g2; + /* + * A GUESS search is active AND they don't want only summary stats. + */ + str_bprintf(buf, sizeof buf, _("GUESS %s %s " + "(%zu %s, %zu kept, %s queries, %s keys) " + "Pool: %zu %s, (%zu+%zu)/%zu queried, %zu %s (%.2f%%), " + "%zu reached, %zu pending, %zu %s%s%s"), + compact_time(delta_time(tm_time(), search->guess_cur_start)), + GUESS_QUERY_LOOSE == search->guess_cur_mode ? + _("loose") : _("bounded"), + search->guess_cur_results, + NG_("hit", "hits", search->guess_cur_results), + search->guess_cur_kept, + short_size(search->guess_cur_bw_query, FALSE), + short_size2(search->guess_cur_bw_qk, FALSE), + search->guess_cur_pool, + NG_("host", "hosts", search->guess_cur_pool), + search->guess_cur_ultra, search->guess_cur_g2, + search->guess_cur_max_ultra, + search->guess_cur_acks, + NG_("ack", "acks", search->guess_cur_acks), + 100.0 * search->guess_cur_acks / (0 == queried ? 1 : queried), + search->guess_cur_reached, + search->guess_cur_rpc_pending, + search->guess_cur_hops, + NG_("hop", "hops", search->guess_cur_hops), + search->guess_cur_pool_load ? _(" (load pending)") : "", + search->guess_cur_end_starving ? _(" (end if starving)") : ""); + } + + gtk_label_printf(label_guess_stats, "%s", buf); +} + static gboolean search_gui_is_visible(void) { @@ -497,13 +629,24 @@ } } -static void +static void search_gui_update_status(struct search *search) { - if (search_gui_is_visible()) { - search_gui_update_counters(search); + /* + * The "counters" are in the search list/tabs. + * + * To make sure the color in the list changes as soon as a search + * stops / completes all its downloads, we go ahead updating the + * counters even if the GUI is not displaying the search presently. + * --RAM, 2015-03-03 + */ + + search_gui_update_counters(search); + + if (search_gui_is_visible() && search == current_search) { search_gui_update_status_label(search); search_gui_update_items_label(search); + search_gui_update_guess_stats(search); } } @@ -587,27 +730,45 @@ next = g_list_find(list_searches, search); next = g_list_next(next) ? g_list_next(next) : g_list_previous(next); - list_searches = g_list_remove(list_searches, search); - search_gui_store_searches(); - search_gui_option_menu_searches_update(); - - search_gui_reset_search(search); - search_gui_remove_search(search); search_gui_set_current_search(next ? next->data : NULL); + filter_close_search(search); + + /* + * The association between the core search_handle and the GUI search, + * which is recorded in `ht_searches' needs to be removed only after + * the core side has finished its cleanup to allow GUI callback events + * to proceed (e.g. GUESS cancellation events). + */ + + guc_search_close(search->search_handle); + htable_remove(ht_searches, uint_to_pointer(search->search_handle)); + + /* + * Now that the core is done cleaning up, we can free up the GUI data + * structures attached with the search. + */ + + search_gui_clear_search(search); + search_gui_remove_search(search); gtk_notebook_remove_page(notebook_search_results, gtk_notebook_page_num(notebook_search_results, search->scrolled_window)); - filter_close_search(search); - - gm_hash_table_destroy_null(&search->dups); - gm_hash_table_destroy_null(&search->parents); + hset_free_null(&search->dups); + htable_free_null(&search->parents); - guc_search_close(search->search_handle); WFREE(search); + + /* + * One less search, update list of searches in memory and on disk. + */ + + search_gui_store_searches(); + search_gui_option_menu_searches_update(); + } /** @@ -719,7 +880,7 @@ gui_record_host_eq(const void *p1, const void *p2) { const struct record *a = p1, *b = p2; - return !host_addr_equal(a->results_set->addr, b->results_set->addr); + return !host_addr_equiv(a->results_set->addr, b->results_set->addr); } /** @@ -746,7 +907,7 @@ gui_record_sha1_or_name_eq(const void *p1, const void *p2) { const struct record *a = p1, *b = p2; - + if (a->sha1 || b->sha1) return gui_record_sha1_eq(a, b); else @@ -803,6 +964,7 @@ g_assert(NULL == rc->results_set); + WFREE_TYPE_NULL(rc->partial); atom_str_free_null(&rc->name); atom_str_free_null(&rc->utf8_name); atom_str_free_null(&rc->ext); @@ -856,12 +1018,6 @@ { results_set_check(rs); - /* - * Because no one refers to us any more, we know that our embedded records - * cannot be held in the hash table anymore. Hence we may call the - * search_free_record() safely, because rc->refcount must be zero. - */ - g_assert(0 == rs->num_recs); g_assert(NULL == rs->records); @@ -883,20 +1039,14 @@ search_gui_remove_record(record_t *rc) { results_set_t *rs; - + record_check(rc); g_assert(0 == rc->refcount); - + rs = rc->results_set; results_set_check(rs); rc->results_set = NULL; - /* - * It is conceivable that some records were used solely by the search - * dropping the result set. Therefore, if the refcount is not 0, we - * pass through search_clean_r_set(). - */ - g_assert(rs->num_recs > 0); g_assert(rs->records); rs->records = g_slist_remove(rs->records, rc); @@ -937,7 +1087,7 @@ } } -guint +static guint search_gui_hash_func(gconstpointer p) { const record_t *rc = p; @@ -946,22 +1096,37 @@ /* Must use same fields as search_hash_key_compare() --RAM */ return - pointer_to_uint(rc->sha1) ^ /* atom! (may be NULL) */ - pointer_to_uint(rc->results_set->guid) ^ /* atom! */ - (NULL != rc->sha1 ? 0 : g_str_hash(rc->name)) ^ - rc->size ^ - host_addr_hash(rc->results_set->addr) ^ - rc->results_set->port; + pointer_hash_fast(rc->sha1) ^ /* atom! (may be NULL) */ + pointer_hash_fast(rc->results_set->guid) ^ /* atom! */ + (NULL != rc->sha1 ? 0 : string_mix_hash(rc->name)) ^ + integer_hash_fast(rc->size) ^ + host_addr_port_hash(rc->results_set->addr, rc->results_set->port); } -gint +static guint +search_gui_hash_func2(gconstpointer p) +{ + const record_t *rc = p; + + record_check(rc); + + /* Must use same fields as search_gui_hash_key_compare() --RAM */ + return + pointer_hash2(rc->sha1) ^ /* atom! (may be NULL) */ + pointer_hash2(rc->results_set->guid) ^ /* atom! */ + (NULL != rc->sha1 ? 0 : string_hash(rc->name)) ^ + integer_hash2(rc->size) ^ + host_addr_port_hash2(rc->results_set->addr, rc->results_set->port); +} + +static gint search_gui_hash_key_compare(gconstpointer a, gconstpointer b) { const record_t *rc1 = a, *rc2 = b; - /* Must compare same fields as search_hash_func() --RAM */ + /* Must compare same fields as search_gui_hash_func() --RAM */ return rc1->size == rc2->size - && host_addr_equal(rc1->results_set->addr, rc2->results_set->addr) + && host_addr_equiv(rc1->results_set->addr, rc2->results_set->addr) && rc1->results_set->port == rc2->results_set->port && rc1->results_set->guid == rc2->results_set->guid /* atom! */ && (rc1->sha1 != NULL /* atom! */ @@ -978,12 +1143,12 @@ static gboolean search_gui_result_is_dup(search_t *sch, record_t *rc) { - gpointer orig_key; + const void *orig_key; record_check(rc); - if (g_hash_table_lookup_extended(sch->dups, rc, &orig_key, NULL)) { - record_t *old_rc = orig_key; + if (hset_contains_extended(sch->dups, rc, &orig_key)) { + record_t *old_rc = deconstify_pointer(orig_key); /* * Actually, if the index is the only thing that changed, @@ -1002,8 +1167,8 @@ if (rc->file_index != old_rc->file_index) { if (GUI_PROPERTY(gui_debug)) { - g_warning("Index changed from %u to %u at %s for %s", - old_rc->file_index, rc->file_index, + g_warning("%s(): index changed from %u to %u at #%s for %s", + G_STRFUNC, old_rc->file_index, rc->file_index, guid_hex_str(rc->results_set->guid), rc->name); } @@ -1029,21 +1194,7 @@ static search_t * search_gui_find(gnet_search_t sh) { - const GList *l; - - for (l = search_gui_get_searches(); l != NULL; l = g_list_next(l)) { - search_t *s = l->data; - - if (s->search_handle == sh) { - if (GUI_PROPERTY(gui_debug) >= 15) { - g_debug("search %s matched handle %x", - search_gui_query(s), sh); - } - return s; - } - } - - return NULL; + return htable_lookup(ht_searches, uint_to_pointer(sh)); } /** @@ -1103,23 +1254,23 @@ } if (vinfo) { g_assert(rw < sizeof info); - rw += gm_snprintf(&inforw, sizeof info - rw, "%s%s", + rw += str_bprintf(&inforw, sizeof info - rw, "%s%s", info0 != '\0' ? "; " : "", vinfo); } if (rc->flags & SR_PARTIAL_HIT) { g_assert(rw < sizeof info); - rw += gm_snprintf(&inforw, sizeof info - rw, "%s%s", + rw += str_bprintf(&inforw, sizeof info - rw, "%s%s", info0 != '\0' ? ", " : "", _("partial")); } if (rc->alt_locs != NULL) { guint count = gnet_host_vec_count(rc->alt_locs); g_assert(rw < sizeof info); - rw += gm_snprintf(&inforw, sizeof info - rw, "%salt", + rw += str_bprintf(&inforw, sizeof info - rw, "%salt", info0 != '\0' ? ", " : ""); if (count > 1) - rw += gm_snprintf(&inforw, sizeof info - rw, "(%u)", count); + rw += str_bprintf(&inforw, sizeof info - rw, "(%u)", count); } return info0 != '\0' ? atom_str_get(info) : NULL; @@ -1159,7 +1310,16 @@ rc->flags = r->flags; rc->create_time = r->create_time; rc->name = atom_str_get(r->filename); - + + if (r->available != 0 || r->mod_time != 0) { + struct precord *prc; + + WALLOC0(prc); + prc->available = r->available; + prc->mod_time = r->mod_time; + rc->partial = prc; + } + { const gchar *utf8_name, *name; gchar *to_free; @@ -1200,15 +1360,15 @@ * Create a new GUI result set from a Gnutella one. */ static results_set_t * -search_gui_create_results_set(GSList *schl, const gnet_results_set_t *r_set) +search_gui_create_results_set(pslist_t *schl, const gnet_results_set_t *r_set) { results_set_t *rs; guint ignored; - GSList *sl; + pslist_t *sl; WALLOC(rs); rs->magic = RESULTS_SET_MAGIC; - rs->schl = g_slist_copy(schl); + rs->schl = gm_pslist_to_slist(schl); rs->guid = atom_guid_get(r_set->guid); rs->addr = r_set->addr; @@ -1231,14 +1391,14 @@ rs->proxies = search_gui_proxies_clone(r_set->proxies); ignored = 0; - for (sl = r_set->records; sl != NULL; sl = g_slist_next(sl)) { + PSLIST_FOREACH(r_set->records, sl) { gnet_record_t *grc = sl->data; if (grc->flags & SR_DONT_SHOW) { ignored++; } else { record_t *rc; - + rc = search_gui_create_record(r_set, grc); rc->results_set = rs; rs->records = g_slist_prepend(rs->records, rc); @@ -1282,13 +1442,15 @@ search_gui_download_selected_files(void) { struct search *search; + bool stopped; search = search_gui_get_current_search(); g_return_if_fail(search); - search_gui_start_massive_update(search); + stopped = search_gui_start_massive_update(search); search_gui_download_files(search); - search_gui_end_massive_update(search); + if (stopped) + search_gui_end_massive_update(search); guc_search_update_items(search->search_handle, search->items); @@ -1300,13 +1462,15 @@ search_gui_discard_selected_files(void) { struct search *search; + bool stopped; search = search_gui_get_current_search(); g_return_if_fail(search); - search_gui_start_massive_update(search); + stopped = search_gui_start_massive_update(search); search_gui_discard_files(search); - search_gui_end_massive_update(search); + if (stopped) + search_gui_end_massive_update(search); guc_search_update_items(search->search_handle, search->items); @@ -1462,7 +1626,7 @@ search = search_gui_get_current_search(); if (search && guc_search_is_active(search->search_handle)) { guint32 timeout; - + timeout = gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget)); guc_search_set_reissue_timeout(search->search_handle, timeout); timeout = guc_search_get_reissue_timeout(search->search_handle); @@ -1607,8 +1771,13 @@ static void search_gui_check_alt_locs(record_t *rc) { + const results_set_t *rs; + record_check(rc); + rs = rc->results_set; + results_set_check(rs); + if (rc->alt_locs) { gint i, n; @@ -1622,6 +1791,20 @@ addr = gnet_host_get_addr(&host); port = gnet_host_get_port(&host); if (port > 0 && host_addr_is_routable(addr)) { + uint32 flags = 0; + + /* + * Even if "G2" results came back from GTKG (which is possible + * since GTKG nodes are connected on G2 and respond to queries) + * we know that GTKG is not going to discriminate between G2 + * and Gnutella and that both networks can happily download + * from it, regardless of how they managed to get a hold on the + * resource. + */ + + if ((rs->status & ST_G2) && rs->vendor != T_GTKG) + flags = SOCK_F_G2; + guc_download_auto_new(rc->name, rc->size, addr, @@ -1633,7 +1816,7 @@ rc->results_set->stamp, NULL, /* fileinfo */ NULL, /* proxies */ - 0); /* flags */ + flags); /* flags */ } } } @@ -1652,12 +1835,13 @@ rs = rc->results_set; flags |= (rs->status & ST_FIREWALL) ? SOCK_F_PUSH : 0; flags |= (rs->status & ST_TLS) ? SOCK_F_TLS : 0; + flags |= ((rs->status & ST_G2) && rs->vendor != T_GTKG) ? SOCK_F_G2 : 0; if (rc->sha1) { uri = NULL; guc_search_associate_sha1(sh, rc->sha1); } else { - uri = str_cmsg("/get/%lu/%s", (gulong) rc->file_index, rc->name); + uri = str_cmsg("/get/%lu/%s", (ulong) rc->file_index, rc->name); } guc_download_new(rc->name, @@ -1687,13 +1871,13 @@ search_gui_set_sort_defaults(void) { const search_t *sch; - + sch = current_search; if (sch) { gui_prop_set_guint32_val(PROP_SEARCH_SORT_DEFAULT_COLUMN, - sch->sort_col); + sch->sorting.s_column); gui_prop_set_guint32_val(PROP_SEARCH_SORT_DEFAULT_ORDER, - sch->sort_order); + sch->sorting.s_order); } } @@ -1733,7 +1917,24 @@ static void search_gui_retrieve_searches(void) { + GList *l; + search_retrieve_xml(); + + /* + * Iterate through the whole searches to make sure we display them + * correctly in the list (right color / background) now that we have + * the whole set of searches and their associated SHA1 loaded in the + * core. + * --RAM, 2015-03-03 + */ + + GM_LIST_FOREACH(list_searches, l) { + struct search *search = l->data; + + /* The actual update will be done through search_gui_timer() */ + search->list_refreshed = FALSE; /* Force update later */ + } } /** @@ -1747,9 +1948,9 @@ { static gchar addr_buf128; size_t n; - + results_set_check(rs); - + if (ST_LOCAL & rs->status) return NULL; @@ -1774,7 +1975,7 @@ search_gui_color_for_record(const record_t * const rc) { const results_set_t *rs = rc->results_set; - + if (SR_SPAM & rc->flags) { return GUI_COLOR_SPAM; } else if (ST_HOSTILE & rs->status) { @@ -1813,26 +2014,34 @@ results_set_check(rs); - for (i = 0; i < G_N_ELEMENTS(open_flags); i++) { + /* If banned GUID, make it prominent: at the start of the information! */ + if (rs->status & ST_BANNED_GUID) { + STR_CAT(vinfo, "GUID"); + } + + for (i = 0; i < N_ITEMS(open_flags); i++) { if (rs->status & open_flagsi.flag) { if (str_len(vinfo) > 0) - str_cat(vinfo, ", "); + STR_CAT(vinfo, ", "); str_cat(vinfo, _(open_flagsi.status)); } } if (!(rs->status & ST_PARSED_TRAILER)) { if (str_len(vinfo) > 0) - str_cat(vinfo, ", "); + STR_CAT(vinfo, ", "); str_cat(vinfo, _("<unparsed>")); } if (rs->status & ST_TLS) { - str_cat(vinfo, str_len(vinfo) > 0 ? ", TLS" : "TLS"); + if (str_len(vinfo) > 0) + STR_CAT(vinfo, ", TLS"); + else + STR_CAT(vinfo, "TLS"); } if (rs->status & ST_BH) { if (str_len(vinfo) > 0) { - str_cat(vinfo, ", "); + STR_CAT(vinfo, ", "); } str_cat(vinfo, _("browsable")); } @@ -1901,27 +2110,37 @@ skip_records = (!send_pushes || is_firewalled) && (flags & SOCK_F_PUSH); } - if (GUI_PROPERTY(gui_debug) > 6) - printf("search_matched: %s got hit with %d record%s (from %s) " - "need_push=%d, skipping=%d\n", - search_gui_query(sch), rs->num_recs, rs->num_recs == 1 ? "" : "s", + if (GUI_PROPERTY(gui_debug) > 6) { + g_debug("%s(): %s got hit with %d record%s (from %s via %s%s%s%s) " + "need_push=%d, skipping=%d", G_STRFUNC, + search_gui_query(sch), rs->num_recs, plural(rs->num_recs), host_addr_port_to_string(rs->addr, rs->port), - (flags & SOCK_F_PUSH), skip_records); + (rs->status & ST_UDP) ? "UDP" : "TCP", + (rs->status & ST_GUESS) ? " + GUESS" : "", + (NULL == muid) ? "" : " ", + (NULL == muid) ? "" : guid_to_string(muid), + booleanize(flags & SOCK_F_PUSH), skip_records); + } - for (sl = rs->records; sl && !skip_records; sl = g_slist_next(sl)) { + for (sl = rs->records; sl; sl = g_slist_next(sl)) { record_t *rc = sl->data; enum gui_color color; record_check(rc); - if (GUI_PROPERTY(gui_debug) > 7) - printf("search_matched: %s considering %s\n", - search_gui_query(sch), rc->name); + if (skip_records) { + sch->skipped++; + continue; + } + + if (GUI_PROPERTY(gui_debug) > 7) + g_debug("%s(): %s considering %s", + G_STRFUNC, search_gui_query(sch), rc->name); - if (rc->flags & SR_DOWNLOADED) + if (rc->flags & SR_DOWNLOADED) sch->auto_downloaded++; - /* + /* * Note that we pass ALL records through search_gui_result_is_dup(), * to be able to update the index/GUID of our records correctly, when * we detect a change. @@ -1955,11 +2174,6 @@ gboolean is_hostile; gint spam_score; - if (skip_records) { - sch->skipped++; - continue; - } - is_hostile = ST_HOSTILE & rs->status; spam_score = ST_SPAM & rs->status ? 1 : 0; spam_score |= SR_SPAM & rc->flags ? 2 : 0; @@ -1969,7 +2183,7 @@ (!rc->sha1 && GUI_PROPERTY(search_discard_hashless)) || ( GUI_PROPERTY(search_discard_spam) && - (spam_score > 1 || is_hostile) + (spam_score > 1 || is_hostile) ) || ( GUI_PROPERTY(search_discard_alien_ip) && @@ -1986,8 +2200,8 @@ g_assert(rc->refcount >= 0); { - filter_result_t *flt_result; - + filter_result_t *flt_result; + flt_result = filter_record(sch, rc); filter_state = flt_result->propsFILTER_PROP_DISPLAY.state; filter_udata = flt_result->propsFILTER_PROP_DISPLAY.user_data; @@ -2000,7 +2214,7 @@ * Check for FILTER_PROP_DOWNLOAD: */ if ( - !(SR_DOWNLOADED & rc->flags) && + !(SR_DOWNLOADED & rc->flags) && !is_hostile && 0 == spam_score && FILTER_PROP_STATE_DO == filter_download @@ -2041,7 +2255,7 @@ sch->ignored++; continue; } - + if ( FILTER_PROP_STATE_DONT == filter_state && int_to_pointer(1) == filter_udata @@ -2051,7 +2265,7 @@ } sch->items++; - g_hash_table_insert(sch->dups, rc, rc); + hset_insert(sch->dups, rc); search_gui_ref_record(rc); if (GUI_COLOR_MARKED != color) @@ -2165,15 +2379,29 @@ gtk_widget_set_sensitive(tree, FALSE); gtk_container_add(GTK_CONTAINER(sw), tree); gtk_notebook_append_page(notebook_search_results, sw, NULL); - gm_snprintf(text, sizeof text, "(%s)", _("No search")); + str_bprintf(text, sizeof text, "(%s)", _("No search")); gtk_notebook_set_tab_label_text(notebook_search_results, sw, text); gtk_widget_show_all(sw); } search_gui_update_status(search); } +static void +search_gui_guess_stats_display(const search_t *search) +{ + bool guess_stats; + + guess_stats = search_gui_can_use_guess(search) && + GUI_PROPERTY(search_display_guess_stats); + + if (guess_stats) + gtk_widget_show(guess_stats_line); + else + gtk_widget_hide(guess_stats_line); +} + void -search_gui_set_current_search(struct search *search) +search_gui_set_current_search(search_t *search) { if (search != current_search) { struct search *previous = current_search; @@ -2181,14 +2409,17 @@ search_gui_switch_search(search); if (previous) { gtk_widget_hide(previous->tree); - search_gui_start_massive_update(previous); + if (!previous->frozen) + search_gui_start_massive_update(previous); search_gui_hide_search(previous); previous->list_refreshed = FALSE; search_gui_update_counters(previous); } - if (search) { + if (search) { + search_gui_guess_stats_display(search); search_gui_show_search(search); - search_gui_end_massive_update(search); + if (search->frozen) + search_gui_end_massive_update(search); gtk_widget_show(search->tree); search->list_refreshed = FALSE; search_gui_update_counters(search); @@ -2196,6 +2427,14 @@ } } +void +search_gui_current_search_refresh(void) +{ + if (current_search != NULL) { + search_gui_guess_stats_display(current_search); + } +} + /*** *** Callbacks ***/ @@ -2209,7 +2448,7 @@ * @param r_set the core's result set, which will be duplicated */ static void -search_gui_got_results(GSList *schl, const struct guid *muid, +search_gui_got_results(pslist_t *schl, const struct guid *muid, const gnet_results_set_t *r_set) { results_set_t *rs; @@ -2221,13 +2460,21 @@ if (rs) { struct accum_rs *ars; - if (GUI_PROPERTY(gui_debug) >= 12) - printf("got incoming results...\n"); + if (GUI_PROPERTY(gui_debug) >= 12) { + g_debug("%s(): got incoming results...", G_STRFUNC); + } WALLOC(ars); ars->muid = muid != NULL ? atom_guid_get(muid) : NULL; ars->rs = rs; slist_append(accumulated_rs, ars); + } else { + if (GUI_PROPERTY(gui_debug) >= 6) { + g_debug("%s(): ignoring %u result%s%s%s", + G_STRFUNC, r_set->num_recs, plural(r_set->num_recs), + NULL == muid ? "" : " for GUESS ", + NULL == muid ? "" : guid_to_string(muid)); + } } } @@ -2276,14 +2523,13 @@ tm_t t0, t1; if (!force) { - guint32 period; + guint32 period = GUI_PROPERTY(search_accumulation_period); - gui_prop_get_guint32_val(PROP_SEARCH_ACCUMULATION_PERIOD, &period); if (last && delta_time(now, last) < (time_delta_t) period) return; } last = now; - + search_gui_flush_info(); tm_now_exact(&t0); @@ -2301,6 +2547,12 @@ schl = rs->schl; rs->schl = NULL; + if (GUI_PROPERTY(gui_debug) > 6 && muid != NULL) { + g_debug("%s(): processing accumulated %u record%s for %s", + G_STRFUNC, rs->num_recs, plural(rs->num_recs), + guid_to_string(muid)); + } + search_gui_set_record_info(rs); /* @@ -2321,15 +2573,15 @@ * --BLUE, 4/1/2004 */ - if (sch) { - if (!g_slist_find(frozen, sch)) { + if (sch != NULL) { + if (!sch->frozen) { search_gui_start_massive_update(sch); frozen = g_slist_prepend(frozen, sch); } search_matched(sch, muid, rs); } else if (GUI_PROPERTY(gui_debug) >= 6) { - g_debug( - "no search for cached search result while dispatching"); + g_debug("%s(): no search for cached search result (handle #%u)", + G_STRFUNC, handle); } } gm_slist_free_null(&schl); @@ -2343,7 +2595,7 @@ */ if (GUI_PROPERTY(gui_debug) >= 15) - printf("cleaning phase\n"); + g_debug("%s(): cleaning phase", G_STRFUNC); for (sl = rs->records; sl != NULL; /* NOTHING */) { record_t *rc = sl->data; @@ -2369,8 +2621,8 @@ if (GUI_PROPERTY(gui_debug)) { tm_now_exact(&t1); - g_debug("dispatching results took %lu ms", - (gulong) tm_elapsed_ms(&t1, &t0)); + g_debug("%s(): dispatching results took %lu ms", + G_STRFUNC, (ulong) tm_elapsed_ms(&t1, &t0)); } search_gui_flush_queues(); @@ -2506,9 +2758,9 @@ if (n_downloads > 0 || n_searches > 0) { gchar msg_search128, msg_download128; - gm_snprintf(msg_download, sizeof msg_download, + str_bprintf(msg_download, sizeof msg_download, NG_("%u download", "%u downloads", n_downloads), n_downloads); - gm_snprintf(msg_search, sizeof msg_search, + str_bprintf(msg_search, sizeof msg_search, NG_("%u search", "%u searches", n_searches), n_searches); statusbar_gui_message(15, _("Handled magnet link (%s, %s)."), msg_download, msg_search); @@ -2558,7 +2810,7 @@ magnet_url = magnet_to_string(magnet); magnet_resource_free(&magnet); } - + success = guc_download_handle_magnet(magnet_url) > 0; if (success) { statusbar_gui_message(15, _("Created download from URL.")); @@ -2605,7 +2857,7 @@ magnet_url = magnet_to_string(magnet); magnet_resource_free(&magnet); } - + success = search_gui_handle_magnet(magnet_url, error_str); HFREE_NULL(magnet_url); @@ -2641,7 +2893,7 @@ static const gchar prefix = "urn:sha1:"; gchar urnSHA1_BASE32_SIZE + sizeof prefix; - concat_strings(urn, sizeof urn, prefix, sha1_base32(&sha1), (void *) 0); + concat_strings(urn, sizeof urn, prefix, sha1_base32(&sha1), NULL_PTR); return search_gui_handle_urn(urn, error_str); } } @@ -2672,9 +2924,12 @@ SEARCH_F_LOCAL | SEARCH_F_LITERAL | SEARCH_F_ENABLED, &search); if (success && search) { - search_gui_start_massive_update(search); + bool stopped; + + stopped = search_gui_start_massive_update(search); success = guc_search_locally(search->search_handle, text); - search_gui_end_massive_update(search); + if (stopped) + search_gui_end_massive_update(search); } *error_str = NULL; @@ -2691,7 +2946,7 @@ browse_request_free(struct browse_request **req_ptr) { struct browse_request *req; - + g_assert(req_ptr); req = *req_ptr; @@ -2717,7 +2972,7 @@ g_assert(req); if (n > 0) { - size_t i = random_u32() % n; + size_t i = random_value(n - 1); search_gui_new_browse_host(req->host, addrsi, req->port, NULL, NULL, req->flags); @@ -2751,7 +3006,7 @@ s = is_strcaseprefix(s, "browse:"); g_return_val_if_fail(s, FALSE); - + endptr = is_strprefix(s, "tls:"); if (endptr) { s = endptr; @@ -2803,7 +3058,7 @@ if (*query_ptr) { struct query *query = *query_ptr; - G_FREE_NULL(query->text); + G_FREE_NULL(query->text); gm_list_free_null(&query->rules); WFREE(query); *query_ptr = NULL; @@ -2857,7 +3112,7 @@ }; guint i; - for (i = 0; i < G_N_ELEMENTS(tab); i++) { + for (i = 0; i < N_ITEMS(tab); i++) { if (is_strcaseprefix(query_str, tabi.prefix)) { tabi.handler(query_str, error_str); return NULL; @@ -2871,7 +3126,7 @@ return NULL; } - { + { static const struct query zero_query; struct query *query; @@ -2941,7 +3196,7 @@ } g_assert(query); g_assert(query->text); - + result = guc_search_new(&sch_id, query->text, mtype, create_time, lifetime, reissue_timeout, flags); if (SEARCH_NEW_SUCCESS != result) { @@ -2958,22 +3213,22 @@ } if (sort_col >= 0 && (guint) sort_col < SEARCH_RESULTS_VISIBLE_COLUMNS) { - search->sort_col = sort_col; + search->sorting.s_column = sort_col; } else { - search->sort_col = -1; + search->sorting.s_column = -1; } switch (sort_order) { case SORT_ASC: case SORT_DESC: - search->sort_order = sort_order; + search->sorting.s_order = sort_order; break; default: - search->sort_order = SORT_NONE; + search->sorting.s_order = SORT_NONE; } - + search->search_handle = sch_id; - search->dups = g_hash_table_new(search_gui_hash_func, - search_gui_hash_key_compare); + search->dups = hset_create_any(search_gui_hash_func, + search_gui_hash_func2, search_gui_hash_key_compare); search_gui_filter_new(search, query->rules); search_gui_query_free(&query); @@ -2985,7 +3240,7 @@ search_gui_start_massive_update(search); gtk_widget_hide(search->tree); gui_color_init(GTK_WIDGET(search->tree)); - widget_add_popup_menu(search->tree, search_gui_get_popup_menu); + widget_add_popup_menu(search->tree, search_gui_get_popup_menu); if (search_gui_is_local(search)) { drag_attach_uri(search->tree, search_gui_get_local_file_url); } @@ -2998,6 +3253,7 @@ is_only_search = NULL == list_searches; list_searches = g_list_append(list_searches, search); + htable_insert(ht_searches, uint_to_pointer(search->search_handle), search); search_gui_option_menu_searches_update(); if (is_only_search) { @@ -3038,128 +3294,6 @@ } /** - * Adds some indendation to XML-like text. The input text is assumed to be - * "flat" and well-formed. If these assumptions fail, the output might look - * worse than the input. - * - * @param s the string to format. - * @return a newly allocated string. - */ -gchar * -search_xml_indent(const gchar *text) -{ - const gchar *p, *q; - gboolean quoted, is_special, is_end, is_start, is_singleton, has_cdata; - guint i, depth = 0; - str_t *s; - - s = str_new(0); - q = text; - - quoted = FALSE; - is_special = FALSE; - is_end = FALSE; - is_start = FALSE; - is_singleton = FALSE; - has_cdata = FALSE; - - for (;;) { - gboolean had_cdata; - - p = q; - /* - * Find the start of the tag and append the text between the - * previous and the current tag. - */ - for (/* NOTHING */; '<' != *p && '\0' != *p; p++) { - if (is_ascii_space(*p) && is_ascii_space(p1)) - continue; - if (has_cdata && '&' == *p) { - const char *endptr; - guint32 uc; - - uc = html_decode_entity(p, &endptr); - if (uc > 0x00 && uc <= 0xff && '<' != uc && '>' != uc) { - str_putc(s, uc); - p = endptr - 1; - continue; - } - } - str_putc(s, is_ascii_space(*p) ? ' ' : *p); - } - if ('\0' == *p) - break; - - /* Find the end of the tag */ - q = strchr(p, '>'); - if (!q) - q = strchr(p, '\0'); - - is_special = '?' == p1 || '!' == p1; - is_end = '/' == p1; - is_start = !(is_special || is_end); - is_singleton = is_start && '>' == *q && '/' == q-1; - had_cdata = has_cdata; - has_cdata = FALSE; - - if (is_end && depth > 0) { - depth--; - } - if (p != text && !(is_end && had_cdata)) { - str_putc(s, '\n'); - for (i = 0; i < depth; i++) - str_putc(s, '\t'); - } - - quoted = FALSE; - for (q = p; '\0' != *q; q++) { - - if (!quoted && is_ascii_space(*q) && is_ascii_space(q1)) - continue; - - if (is_ascii_space(*q)) { - if (quoted || is_special) { - str_putc(s, ' '); - } else { - str_putc(s, '\n'); - for (i = 0; i < depth + 1; i++) - str_putc(s, '\t'); - } - continue; - } - - if (quoted && '&' == *q) { - const char *endptr; - guint32 uc; - - uc = html_decode_entity(q, &endptr); - if (uc > 0x00 && uc <= 0xff && '"' != uc) { - str_putc(s, uc); - q = endptr - 1; - continue; - } - } - - str_putc(s, *q); - - if ('"' == *q) { - quoted ^= TRUE; - } else if ('>' == *q) { - q++; - break; - } - } - if (is_start && !is_singleton) { - const char *next = strchr(q, '<'); - has_cdata = next && '/' == next1; - depth++; - } - } - - return str_s2c_null(&s); -} - -/** * Adds a search string to the search history combo. Makes * sure we do not get more than 50 entries in the history. * Also makes sure we don't get duplicate history entries. @@ -3207,7 +3341,7 @@ #if GTK_CHECK_VERSION(2,0,0) g_return_val_if_fail(utf8_is_valid_string(text), FALSE); #endif /* Gtk+ >= 2.0 */ - + entry = GTK_ENTRY(gui_main_window_lookup("entry_search")); gtk_entry_set_text(entry, text); return TRUE; @@ -3221,11 +3355,11 @@ { GtkWidget *entry; gchar *text; - + entry = gui_main_window_lookup("entry_search"); text = STRTRACK(gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1)); g_strstrip(text); - + if ('\0' != text0) { filter_t *default_filter; search_t *search; @@ -3378,7 +3512,7 @@ search_gui_media_type(search), tm_time(), GUI_PROPERTY(search_lifetime), - timeout, search->sort_col, search->sort_order, + timeout, search->sorting.s_column, search->sorting.s_order, search_gui_is_enabled(search) ? SEARCH_F_ENABLED : 0, NULL); } @@ -3566,7 +3700,6 @@ const gchar *name; gboolean local; } menu = { - { "popup_search_metadata", TRUE }, { "popup_search_browse_host", FALSE }, { "popup_search_download", FALSE }, { "popup_search_copy_magnet", TRUE }, @@ -3580,7 +3713,7 @@ gtk_widget_set_sensitive(gui_main_window_lookup("button_search_download"), has_selected && !is_local); - for (i = 0; i < G_N_ELEMENTS(menu); i++) { + for (i = 0; i < N_ITEMS(menu); i++) { GtkWidget *w = gui_popup_search_lookup(menui.name); if (w) { gtk_widget_set_sensitive(w, @@ -3621,7 +3754,7 @@ search_results_show_tabs_changed(property_t prop) { gboolean enabled; - + gui_prop_get_boolean_val(prop, &enabled); gtk_notebook_set_show_tabs(notebook_search_results, enabled); widget_set_visible(gui_main_window_lookup("sw_searches"), !enabled); @@ -3735,7 +3868,7 @@ { (void) unused_menuitem; (void) unused_udata; - + search_gui_set_sort_defaults(); } @@ -3772,8 +3905,7 @@ if (rs->version) { static gchar buf128; - concat_strings(buf, sizeof buf, vendor, "/", rs->version, - (void *) 0); + concat_strings(buf, sizeof buf, vendor, "/", rs->version, NULL_PTR); vendor = buf; } } else { @@ -3800,14 +3932,14 @@ search_gui_get_sort_column(const struct search *search) { g_return_val_if_fail(search, -1); - return search->sort_col; + return search->sorting.s_column; } int search_gui_get_sort_order(const struct search *search) { g_return_val_if_fail(search, 0); - return search->sort_order; + return search->sorting.s_order; } gnet_search_t @@ -3902,10 +4034,26 @@ search_gui_append_detail(_("Partial"), SR_PARTIAL_HIT & rc->flags ? _("Yes") : _("No")); + if (rc->partial != NULL) { + struct precord *prc = rc->partial; + + if (rc->size != 0) { + char buf80; + double pct = 100.0 * prc->available / (double) rc->size; + str_bprintf(buf, sizeof buf, _("%s %.2f%%"), + nice_size(prc->available, show_metric_units()), pct); + search_gui_append_detail(_("Available"), buf); + } + search_gui_append_detail(_("Last modification"), + 0 != prc->mod_time + ? timestamp_to_string(prc->mod_time) + : _("Unknown")); + } + if (utf8_can_latinize(rc->utf8_name)) { size_t size; gchar *buf; - + size = 1 + utf8_latinize(NULL, 0, rc->utf8_name); buf = walloc(size); utf8_latinize(buf, size, rc->utf8_name); @@ -3918,21 +4066,6 @@ * so don't show it explicitely as it's just visual noise. */ - if (rc->sha1) { - bitzi_data_t data; - - search_gui_append_detail(_("External metadata"), NULL); /* Separator */ - search_gui_append_detail(_("Bitzi URL"), - url_for_bitzi_lookup(rc->sha1)); - - if (guc_bitzi_data_by_sha1(&data, rc->sha1, rc->size)) { - char *meta = bitzi_gui_get_metadata(&data); - search_gui_append_detail(_("Bitzi metadata"), - meta != NULL ? meta : _("Not in database")); - HFREE_NULL(meta); - } - } - if (ST_LOCAL & rs->status) { const gchar *display_path; gchar *url; @@ -3984,9 +4117,12 @@ search_gui_append_detail(_("Route"), search_gui_get_route(rs)); if (!(ST_BROWSE & rs->status)) { - search_gui_append_detail(_("Protocol"), - ST_UDP & rs->status ? "UDP" : "TCP"); - + static const char *search_proto = { + "TCP", "UDP", "TCP (G2)", "UDP (G2)", + }; + uint pidx = ST_UDP & rs->status ? 1 : 0; + pidx += ST_G2 & rs->status ? 2 : 0; + search_gui_append_detail(_("Protocol"), search_protopidx); search_gui_append_detail(_("Hops"), uint32_to_string(rs->hops)); search_gui_append_detail(_("TTL"), uint32_to_string(rs->ttl)); @@ -4014,7 +4150,7 @@ url = g_strconcat("http://", host_addr_port_to_string(rs->addr, rs->port), "/uri-res/N2R?", bitprint_to_urn_string(rc->sha1, rc->tth), - (void *)0); + NULL_PTR); search_gui_append_detail(_("N2R URI"), url); G_FREE_NULL(url); } @@ -4053,7 +4189,7 @@ url = h_strconcat("http://", host_addr_port_to_string(rs->addr, rs->port), "/get/", uint32_to_string(rc->file_index), "/", escaped, - (void *)0); + NULL_PTR); search_gui_append_detail(_("Classic URL"), url); if (filename != escaped) { HFREE_NULL(escaped); @@ -4150,9 +4286,9 @@ if (GUI_PROPERTY(gui_debug) > 0) { g_debug("drag_data_received: text=\"%s\"", text); } - + if (gui_main_window_lookup("entry_search") != widget) { - for (i = 0; i < G_N_ELEMENTS(proto_handlers); i++) { + for (i = 0; i < N_ITEMS(proto_handlers); i++) { const char *endptr; endptr = is_strcaseprefix(text, proto_handlersi.proto); @@ -4204,7 +4340,7 @@ g_return_if_fail(magnet); g_return_if_fail(record); record_check(record); - + rs = record->results_set; if (!(ST_FIREWALL & rs->status)) { @@ -4270,51 +4406,6 @@ return url; } -/* Display Bitzi data for the result if any */ -void -search_gui_set_bitzi_metadata(const record_t *rc) -{ - const char *ticket; - char *tmp, *text; - - if (NULL == rc) { - search_gui_set_bitzi_metadata_text(""); - return; - } - - record_check(rc); - - if (NULL == rc->sha1) { - search_gui_set_bitzi_metadata_text(_("SHA-1 is unknown.")); - return; - } - - if (!guc_bitzi_has_cached_ticket(rc->sha1)) { - search_gui_set_bitzi_metadata_text(_("No Bitzi ticket requested yet.")); - return; - } - - ticket = guc_bitzi_ticket_by_sha1(rc->sha1, rc->size); - if (NULL == ticket) { - search_gui_set_bitzi_metadata_text(_("Not in Bitzi database.")); - return; - } - - /* This also decodes 8-bit entities */ - tmp = search_xml_indent(ticket); - - /* - * Bitzi converts all ticket data from ISO-8859-1 to UTF-8, therefore this - * conversion must be reversed to get the original encoding back. - */ - text = utf8_to_iso8859_1(tmp); - HFREE_NULL(tmp); - - search_gui_set_bitzi_metadata_text( - lazy_unknown_to_utf8_normalized(text, UNI_NORM_GUI, NULL)); - G_FREE_NULL(text); -} - void search_gui_store_searches(void) { @@ -4328,7 +4419,7 @@ search_gui_flush(now, FALSE); - if (delta_time(last_update, now)) { + if (search_gui_visible && delta_time(last_update, now)) { GList *iter; last_update = now; @@ -4346,12 +4437,75 @@ } static void +search_gui_guess_event(gnet_search_t sh, const struct guess_query *query) +{ + search_t *search; + + search = search_gui_find(sh); + g_return_if_fail(search != NULL); + + if (NULL == query) { + /* Current query terminated, consolidate results */ + search->guess_bw_query += search->guess_cur_bw_query; + search->guess_bw_qk += search->guess_cur_bw_qk; + search->guess_results += search->guess_cur_results; + search->guess_kept += search->guess_cur_kept; + search->guess_elapsed = delta_time(tm_time(), search->guess_cur_start); + search->guess_hosts = search->guess_cur_reached; /* Really queried */ + search->guess_last_kept = search->guess_cur_kept; + /* Reset stats for new query */ + search->guess_cur_start = 0; + search->guess_cur_pool = 0; + search->guess_cur_ultra = 0; + search->guess_cur_g2 = 0; + search->guess_cur_acks = 0; + search->guess_cur_results = 0; + search->guess_cur_kept = 0; + search->guess_cur_hops = 0; + search->guess_cur_rpc_pending = 0; + search->guess_cur_bw_query = 0; + search->guess_cur_bw_qk = 0; + } else { + /* New query starting */ + search->guess_queries++; + search->guess_cur_start = tm_time(); + search->guess_cur_mode = query->mode; + search->guess_cur_max_ultra = query->max_ultra; + } +} + +static void +search_gui_guess_stats(gnet_search_t sh, const struct guess_stats *stats) +{ + search_t *search; + + search = search_gui_find(sh); + g_return_if_fail(search != NULL); + + search->guess_cur_pool = stats->pool; + search->guess_cur_ultra = stats->queried_ultra; + search->guess_cur_g2 = stats->queried_g2; + search->guess_cur_acks = stats->acks; + search->guess_cur_reached = stats->reached; + search->guess_cur_results = stats->results; + search->guess_cur_kept = stats->kept; + search->guess_cur_hops = stats->hops; + search->guess_cur_rpc_pending = stats->rpc_pending; + search->guess_cur_bw_query = stats->bw_out_query; + search->guess_cur_bw_qk = stats->bw_out_qk; + search->guess_cur_mode = stats->mode; + search->guess_cur_pool_load = stats->pool_load; + search->guess_cur_end_starving = stats->end_starving; +} + + +static void search_gui_signals_init(void) { #define WIDGET_SIGNAL_CONNECT(widget, event) \ gui_signal_connect(gui_main_window_lookup(#widget), #event, \ on_ ## widget ## _ ## event, NULL) - + WIDGET_SIGNAL_CONNECT(button_search, clicked); WIDGET_SIGNAL_CONNECT(button_search_clear, clicked); WIDGET_SIGNAL_CONNECT(button_search_close, clicked); @@ -4400,7 +4554,6 @@ ON_ACTIVATE(toggle_tabs); /* TODO: Code not merged yet */ - ON_ACTIVATE(metadata); ON_ACTIVATE(copy_magnet); #undef ON_ACTIVATE @@ -4420,7 +4573,6 @@ case c_sr_mime: return _("MIME type"); case c_sr_count: return _("#"); case c_sr_loc: return _("Country"); - case c_sr_meta: return _("Metadata"); case c_sr_vendor: return _("Vendor"); case c_sr_info: return _("Info"); case c_sr_route: return _("Route"); @@ -4452,7 +4604,6 @@ case c_sr_mime: return FALSE; case c_sr_count: return TRUE; case c_sr_loc: return FALSE; - case c_sr_meta: return FALSE; case c_sr_vendor: return FALSE; case c_sr_info: return FALSE; case c_sr_route: return FALSE; @@ -4470,6 +4621,23 @@ return FALSE; } +/** + * Invoked when the main GUI window visibility changes. + */ +static void +on_search_visibility_change(gboolean visible) +{ + search_gui_visible = visible; + + if (visible) { + /* + * Becoming visible, update things we left behind whilst the GUI + * was not visible. + */ + + search_gui_timer(tm_time()); + } +} /** * Initialize common structures. @@ -4478,15 +4646,19 @@ search_gui_common_init(void) { accumulated_rs = slist_new(); + ht_searches = htable_create(HASH_KEY_SELF, 0); label_items_found = GTK_LABEL( gui_main_window_lookup("label_items_found")); label_search_expiry = GTK_LABEL( gui_main_window_lookup("label_search_expiry")); + label_guess_stats = GTK_LABEL( + gui_main_window_lookup("label_guess_stats")); + guess_stats_line = gui_main_window_lookup("guess_stats_line"); { GtkNotebook *nb; - + nb = GTK_NOTEBOOK(gui_main_window_lookup("notebook_search_results")); notebook_search_results = nb; @@ -4501,7 +4673,7 @@ { GtkWidget *widget; GtkAdjustment *adj; - + widget = gui_main_window_lookup("spinbutton_search_reissue_timeout"); adj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(widget)); gui_signal_connect_after(adj, "value-changed", @@ -4509,7 +4681,7 @@ } drop_widget_init(gui_main_window(), drag_data_received, NULL); - + #if !GTK_CHECK_VERSION(2,0,0) drop_widget_init(gui_main_window_lookup("entry_search"), drag_data_received, NULL); @@ -4527,7 +4699,11 @@ guc_search_got_results_listener_add(search_gui_got_results); guc_search_status_change_listener_add(search_gui_status_change); + guc_guess_event_listener_add(search_gui_guess_event); + guc_guess_stats_listener_add(search_gui_guess_stats); + main_gui_add_timer(search_gui_timer); + main_gui_add_visibility_listener(on_search_visibility_change); } /** @@ -4537,9 +4713,14 @@ search_gui_common_shutdown(void) { search_gui_callbacks_shutdown(); + main_gui_remove_visibility_listener(on_search_visibility_change); + guc_search_got_results_listener_remove(search_gui_got_results); guc_search_status_change_listener_remove(search_gui_status_change); + guc_guess_event_listener_remove(search_gui_guess_event); + guc_guess_stats_listener_remove(search_gui_guess_stats); + gui_prop_remove_prop_changed_listener(PROP_SEARCH_RESULTS_SHOW_TABS, search_results_show_tabs_changed); @@ -4559,6 +4740,7 @@ search_gui_set_details(NULL); gm_list_free_null(&list_search_history); + htable_free_null(&ht_searches); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/search_common.h -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/search_common.h
Changed
@@ -27,11 +27,14 @@ #include "gtk/search.h" #include "gtk/search_result.h" +#include "if/core/guess.h" #include "if/core/search.h" #include "if/ui/gtk/search.h" struct filter; struct slist; +struct htable; +struct hset; /** * Structure for search results. @@ -43,19 +46,19 @@ GtkWidget *scrolled_window; /**< GtkScrolledWindow, contains tree */ GtkWidget *arrow; /**< The arrow displaying sort order */ - GHashTable *dups; /**< keep a record of dups. */ - GHashTable *parents; /**< table of mount iterators for + struct hset *dups; /**< keep a record of dups. */ + struct htable *parents; /**< table of mount iterators for any seen SHA1 */ struct filter *filter; /**< filter ruleset bound to this search */ struct slist *queue; /**< records to be inserted */ - gboolean list_refreshed; - gboolean clicked; - gboolean sort; + uint list_refreshed:1; + uint clicked:1; + uint sort:1; + uint frozen:1; - int sort_col; - int sort_order; + struct sorting_context sorting; /* * Cached attributes. @@ -68,15 +71,44 @@ * Search stats. */ - guint32 items; /**< Total number of items for the search */ - guint32 unseen_items; /**< How many items haven't been seen yet */ - guint32 tcp_qhits; /**< Query hits received from TCP */ - guint32 udp_qhits; /**< Query hits received from UDP */ - guint32 skipped; /**< Ignored hits (skipped over) */ - guint32 ignored; /**< Filtered out hits */ - guint32 hidden; /**< Hidden hits, never shown */ - guint32 auto_downloaded; /**< Auto-downloaded hits */ - guint32 duplicates; /**< Duplicate hits ignored */ + uint32 items; /**< Total number of items for the search */ + uint32 unseen_items; /**< How many items haven't been seen yet */ + uint32 tcp_qhits; /**< Query hits received from TCP */ + uint32 udp_qhits; /**< Query hits received from UDP */ + uint32 skipped; /**< Ignored hits (skipped over) */ + uint32 ignored; /**< Filtered out hits */ + uint32 hidden; /**< Hidden hits, never shown */ + uint32 auto_downloaded; /**< Auto-downloaded hits */ + uint32 duplicates; /**< Duplicate hits ignored */ + + /* + * GUESS stats and attributes. + */ + + size_t guess_queries; /**< Total amount of queries run */ + size_t guess_hosts; /**< Hosts queried by last completed query */ + size_t guess_last_kept; /**< Kept results at last query */ + uint64 guess_bw_query; /**< Total bandwidth used by queries */ + uint64 guess_bw_qk; /**< Total bandwidth used by query keys */ + uint64 guess_results; /**< Total results received */ + uint64 guess_kept; /**< Total results kept */ + time_delta_t guess_elapsed; /**< Elapsed time for last completed query */ + time_t guess_cur_start; /**< Start time of current query (0 if none) */ + size_t guess_cur_max_ultra; /**< Max amount of ultra nodes to query */ + size_t guess_cur_pool; /**< Current pool of unqueried nodes */ + size_t guess_cur_ultra; /**< Current amount of queried ultra nodes */ + size_t guess_cur_g2; /**< Current amount of queried G2 nodes */ + size_t guess_cur_acks; /**< Current amount of acks received */ + size_t guess_cur_reached; /**< Current amount of nodes reached */ + size_t guess_cur_results; /**< Current amount of results received */ + size_t guess_cur_kept; /**< Current amount of results kept */ + size_t guess_cur_hops; /**< Current query iteration count */ + size_t guess_cur_rpc_pending; /**< Current RPCs pending */ + size_t guess_cur_bw_query; /**< Current b/w used for queries */ + size_t guess_cur_bw_qk; /**< Current b/w used for query keys */ + enum guess_mode guess_cur_mode; /**< Current query mode */ + uint guess_cur_pool_load:1; /**< Whether pool loading is pending */ + uint guess_cur_end_starving:1; /**< Whether query will end on starving */ } search_t; enum { @@ -139,11 +171,10 @@ void search_gui_init_tree(struct search *); void search_gui_set_current_search(struct search *); +void search_gui_current_search_refresh(void); void search_gui_ref_record(record_t *); void search_gui_unref_record(record_t *); -unsigned search_gui_hash_func(gconstpointer); -int search_gui_hash_key_compare(gconstpointer, gconstpointer); const char *search_gui_get_route(const struct results_set *); const char *search_gui_get_filename_extension(const char *filename_utf8); void search_gui_set_sort_defaults(void); @@ -154,23 +185,21 @@ void search_gui_filter_new(search_t *, GList *rules); void search_gui_add_targetted_search(void *data, void *user_data); -gboolean search_gui_is_expired(const struct search *); +bool search_gui_is_expired(const struct search *); void search_gui_new_search_entered(void); +unsigned search_gui_download_count(const struct search *search); void search_gui_browse_selected(void); -gboolean search_gui_insert_query(const char *); - -char *search_xml_indent(const char *); +bool search_gui_insert_query(const char *); const char *search_gui_column_title(int column); -gboolean search_gui_column_justify_right(int column); +bool search_gui_column_justify_right(int column); void on_spinbutton_search_reissue_timeout_changed(GtkEditable *, void *user_udata); -gboolean on_search_details_key_press_event(GtkWidget *, GdkEventKey *, +bool on_search_details_key_press_event(GtkWidget *, GdkEventKey *, void *user_data); -void on_popup_search_metadata_activate(GtkMenuItem *, void *user_data); void on_popup_search_copy_magnet_activate(GtkMenuItem *, void *user_data); int search_gui_cmp_sha1s(const struct sha1 *, const struct sha1 *); @@ -180,13 +209,13 @@ void search_gui_callbacks_shutdown(void); -gboolean on_search_list_button_release_event(GtkWidget *, GdkEventButton *, +bool on_search_list_button_release_event(GtkWidget *, GdkEventButton *, void *user_data); -gboolean on_search_list_key_release_event(GtkWidget *, GdkEventKey *, +bool on_search_list_key_release_event(GtkWidget *, GdkEventKey *, void *user_data); GSList *search_gui_get_selected_searches(void); -gboolean search_gui_has_selected_item(struct search *); +bool search_gui_has_selected_item(struct search *); void search_gui_search_list_clicked(void); void search_gui_download_files(struct search *); void search_gui_discard_files(struct search *); @@ -205,16 +234,14 @@ void search_gui_option_menu_searches_thaw(void); void search_gui_option_menu_searches_freeze(void); -gboolean search_gui_is_enabled(const struct search *); +bool search_gui_is_enabled(const struct search *); void search_gui_download(record_t *, gnet_search_t sh); const char *search_gui_nice_size(const record_t *); const char *search_gui_get_vendor(const struct results_set *); -gboolean search_gui_item_is_inspected(const record_t *); +bool search_gui_item_is_inspected(const record_t *); void search_gui_set_details(const record_t *); -void search_gui_set_bitzi_metadata(const record_t *); -void search_gui_set_bitzi_metadata_text(const char *); void search_gui_clear_details(void); void search_gui_append_detail(const char *title, const char *value); const char *search_new_error_to_string(enum search_new_result); @@ -229,9 +256,8 @@ void search_gui_synchronize_search_list(search_gui_synchronize_list_cb, void *user_data); -void search_gui_start_massive_update(struct search *); +bool search_gui_start_massive_update(struct search *); void search_gui_end_massive_update(struct search *); -void search_gui_queue_bitzi_by_sha1(const record_t *); void search_gui_add_record(struct search *, record_t *, enum gui_color); void search_gui_hide_search(struct search *); void search_gui_show_search(struct search *);
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/search_result.h -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/search_result.h
Changed
@@ -76,6 +76,14 @@ } record_magic_t; /** + * Partial results. + */ +struct precord { + filesize_t available; /**< Available bytes, if partial file */ + time_t mod_time; /**< Last modification time of partial file */ +}; + +/** * An individual hit. It referes to a file entry on the remote servent, * as identified by the parent results_set structure that contains this hit. * @@ -99,6 +107,7 @@ const char *tag; /**< Optional tag data string (atom) */ const char *info; /**< Short version of tag (atom) */ const char *path; /**< Optional path (atom) */ + struct precord *partial; /**< Optional: partial record information */ struct gnet_host_vec *alt_locs; /**< Optional alternate locations */ filesize_t size; /**< Size of file, in bytes */ time_t create_time; /**< Create Time of file; zero if unknown */ @@ -125,4 +134,5 @@ } #endif /* _gtk_search_result_h_ */ + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/search_xml.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/search_xml.c
Changed
@@ -49,14 +49,18 @@ #include "lib/ascii.h" #include "lib/file.h" #include "lib/getdate.h" -#include "lib/glib-missing.h" #include "lib/halloc.h" +#include "lib/hashing.h" +#include "lib/htable.h" #include "lib/parse.h" #include "lib/product.h" +#include "lib/pslist.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/timestamp.h" #include "lib/tm.h" #include "lib/utf8.h" + #include "lib/override.h" /* Must be the last header included */ #define GLOBAL_PRE 0 @@ -98,7 +102,7 @@ static void xml_to_sha1_rule(xnode_t *, void *); static void xml_to_flag_rule(xnode_t *, void *); static void xml_to_state_rule(xnode_t *, void *); -static guint16 get_rule_flags_from_xml(xnode_t *); +static uint16 get_rule_flags_from_xml(xnode_t *); /* * Private variables @@ -158,8 +162,8 @@ static const char search_file_xml = "searches.xml"; static const char search_file_type = "searches"; -static GHashTable *target_map = NULL; -static GHashTable *id_map = NULL; +static htable_t *target_map; +static htable_t *id_map; static node_parser_t parser_map = { { NODE_BUILTIN, xml_to_builtin }, @@ -194,6 +198,15 @@ } /** + * Compare two SHA1s for GSList sorting. + */ +static int +sha1_sort_cmp(const void *a, const void *b) +{ + return memcmp(a, b, SHA1_RAW_SIZE); +} + +/** * A wrapper around parse_uint64. It's a little stricter, so that trailing * characters enforce an error. It accepts base 10 (decimal) only. On failure * *error will be set to a non-zero "errno" value. @@ -202,11 +215,11 @@ * @param error an int variable which will indicate success or failure. * @return On success, the parsed value is returned. */ -static guint64 +static uint64 parse_number(const char *buf, int *error) { const char *endptr; - guint64 ret; + uint64 ret; g_assert(buf != NULL); g_assert(error != NULL); @@ -216,7 +229,7 @@ *error = EINVAL; } if (0 != *error) { - g_warning("parse_number(): error with buf=\"%s\"", buf); + g_warning("%s(): error with buf=\"%s\"", G_STRFUNC, buf); return 0; } @@ -226,7 +239,7 @@ /** * A wrapper around parse_uint64. It's a little stricter, so that trailing * characters enforce an error. It accepts base 16 (decimal) only. On failure - * *error will be set to a non-zero "errno" value. The value is casted to + * *error will be set to a non-zero "errno" value. The value is cast to * a pointer. * * @param buf the string to parse. @@ -237,8 +250,8 @@ parse_target(const char *buf, gint *error) { const char *endptr; - guint64 v; - gulong target; /* Not guint32! for backwards compatibility. See below. */ + uint64 v; + ulong target; /* Not uint32! for backwards compatibility. See below. */ g_assert(buf != NULL); g_assert(error != NULL); @@ -260,15 +273,15 @@ /* * For backwards compatibility we allow values above 2^32-1 if the * machine doesn't use 32-bit wide pointers. Older versions used - * the pointer casted to an integer type as target ID. + * the pointer cast to an integer type as target ID. */ if (4 == sizeof(void *)) { - if (0 == *error && v > (~(guint32) 0)) { + if (0 == *error && v > (~(uint32) 0)) { *error = ERANGE; } } if (0 != *error) { - g_warning("parse_target(): error with buf=\"%s\"", buf); + g_warning("%s(): error with buf=\"%s\"", G_STRFUNC, buf); return NULL; } @@ -285,11 +298,11 @@ * @param do_reset if TRUE, the ID counter is reset to an initial value. * @return a 32-bit integer stuffed into a pointer */ -static void * +static void * target_new_id(gboolean do_reset) { - static guint32 id_counter; - guint32 ret; + static uint32 id_counter; + uint32 ret; /* If target_map is NULL, the counter is reset */ if (do_reset) { @@ -311,7 +324,7 @@ target_map_reset(void) { target_new_id(TRUE); /* Reset */ - gm_hash_table_destroy_null(&target_map); + htable_free_null(&target_map); } /** @@ -328,15 +341,15 @@ if (!target_map) { target_new_id(TRUE); /* Reset */ - target_map = g_hash_table_new(pointer_hash_func, NULL); + target_map = htable_create(HASH_KEY_SELF, 0); } - if (!g_hash_table_lookup_extended(target_map, target, NULL, &value)) { + if (!htable_lookup_extended(target_map, target, NULL, &value)) { value = target_new_id(FALSE); - g_hash_table_insert(target_map, target, value); + htable_insert(target_map, target, value); } - gm_snprintf(buf, sizeof buf, "0x%x", GPOINTER_TO_UINT(value)); + str_bprintf(buf, sizeof buf, "0x%x", GPOINTER_TO_UINT(value)); return buf; } @@ -368,7 +381,7 @@ root = xnode_new_element(NULL, NULL, NODE_SEARCHES); xnode_prop_printf(root, "Time", "%s", timestamp_to_string(now)); - xnode_prop_printf(root, "Version", "%s", product_get_version()); + xnode_prop_printf(root, "Version", "%s", product_version()); /* * Store UIDs for the builtin targets @@ -407,7 +420,7 @@ * This is the new xml version. The searches are normally * retrieved from ~/.gtk-gnutella/searches.xml. */ -G_GNUC_COLD gboolean +gboolean G_COLD search_retrieve_xml(void) { xnode_t *root, *xn; @@ -418,7 +431,7 @@ vxml_error_t e; file_path_set(&fp0, settings_gui_config_dir(), search_file_xml); - fd = file_config_open_read(search_file_type, fp, G_N_ELEMENTS(fp)); + fd = file_config_open_read(search_file_type, fp, N_ITEMS(fp)); if (NULL == fd) return FALSE; @@ -437,8 +450,8 @@ */ if (e != VXML_E_OK) { - g_warning("error parsing %s file: %s", - search_file_xml, vxml_strerror(e)); + g_warning("%s(): error parsing %s file: %s", + G_STRFUNC, search_file_xml, vxml_strerror(e)); return FALSE; } @@ -454,7 +467,7 @@ return FALSE; } - id_map = g_hash_table_new(pointer_hash_func, NULL); + id_map = htable_create(HASH_KEY_SELF, 0); /* * find nodes and add them to the list, this just @@ -496,11 +509,11 @@ void *new_target; g_assert(rule->target != NULL); - new_target = g_hash_table_lookup(id_map, rule->target); + new_target = htable_lookup(id_map, rule->target); if (new_target == NULL) { - g_warning("Failed to resolve rule %d in \"%s\": " + g_warning("%s(): failed to resolve rule %d in \"%s\": " "missing key %p", - n, filter->name, + G_STRFUNC, n, filter->name, cast_to_gconstpointer(filter_rule_to_string(rule))); /* Remove the corrupted filter, we can't handle it */ @@ -529,8 +542,8 @@ } if (damaged) { - g_warning("Removing damaged ruleset from filter (name=\"%s\")", - filter->name); + g_warning("%s(): removing damaged ruleset from " + "filter (name=\"%s\")", G_STRFUNC, filter->name); /* This causes a little memory leak but the priority is * not to crash. */ filter->ruleset = NULL; @@ -556,7 +569,8 @@ if (GUI_PROPERTY(gui_debug) >= 6) g_debug("binding ok for: %s", search_gui_query(search)); } else { - g_warning("binding broken for: %s", search_gui_query(search)); + g_warning("%s(): binding broken for: %s", + G_STRFUNC, search_gui_query(search)); borked = TRUE; } } @@ -567,7 +581,7 @@ g_list_free(filters_current); filters_current = g_list_copy(filters); - g_hash_table_destroy(id_map); + htable_free_null(&id_map); return TRUE; } @@ -586,29 +600,29 @@ { TAG_BUILTIN_RETURN_UID, filter_get_return_target }, }; xnode_t *xn; - guint i; + uint i; g_assert(parent != NULL); xn = xml_new_empty_child(parent, NODE_BUILTIN); - for (i = 0; i < G_N_ELEMENTS(builtins); i++) { + for (i = 0; i < N_ITEMS(builtins); i++) { xnode_prop_set(xn, builtinsi.tag, target_to_string(builtinsi.target())); } } static void -sha1s_to_xml(xnode_t *parent, GSList *sha1s) +sha1s_to_xml(xnode_t *parent, pslist_t *sha1s) { xnode_t *xn; - GSList *sl; + pslist_t *sl; if (NULL == sha1s) return; xn = xml_new_empty_child(parent, NODE_SHA1S); - GM_SLIST_FOREACH(sha1s, sl) { + PSLIST_FOREACH(sha1s, sl) { const struct sha1 *sha1 = sl->data; xml_new_child(xn, NODE_SHA1, sha1_to_string(sha1)); } @@ -620,7 +634,7 @@ gnet_search_t search_handle; xnode_t *newxml; GList *iter; - GSList *sha1s; + pslist_t *sha1s; g_assert(search != NULL); search_handle = search_gui_get_handle(search); @@ -628,7 +642,7 @@ g_assert(parent != NULL); if (guc_search_is_browse(search_handle)) - return; + return; if (guc_search_is_local(search_handle)) return; @@ -668,8 +682,9 @@ search_gui_get_sort_order(search)); sha1s = guc_search_associated_sha1(search_handle); + sha1s = pslist_sort(sha1s, sha1_sort_cmp); sha1s_to_xml(newxml, sha1s); - g_slist_free(sha1s); + pslist_free_null(&sha1s); iter = search_gui_get_filter(search)->ruleset; for (/* NOTHING */; iter != NULL; iter = g_list_next(iter)) { @@ -846,6 +861,42 @@ g_carp("unknown XML node: %s", xnode_to_string(xn)); } +/** + * Parsing error for specified attribute name. + * + * We expect a surrounding ``buf'' variable to hold the actual value and + * assume ``error'' contains the parsing error. + */ +#define XML_PARSE_ERROR(tag) G_STMT_START { \ + g_warning("%s(): cannot parse the \"%s\" attribute value \"%s\": %s", \ + G_STRFUNC, (tag), buf, g_strerror(error)); \ +} G_STMT_END + +/** + * Report invalid attribute value. + * + * We expect a surrounding ``buf'' variable to hold the actual value. + */ +#define XML_INVALID(tag) G_STMT_START { \ + g_warning("%s(): invalid \"%s\" attribute value \"%s\"", \ + G_STRFUNC, (tag), buf); \ +} G_STMT_END + +/** + * Complain amount missing tag. + */ +#define XML_MISSING(tag) G_STMT_START { \ + g_warning("%s(): missing \"%s\" tag", G_STRFUNC, (tag)); \ +} G_STMT_END + +/** + * Report un-parseable XML node. + */ +#define XML_BAD_NODE(x) G_STMT_START { \ + g_warning("%s(): unable to parse XML node: %s", \ + G_STRFUNC, xnode_to_string(x)); \ +} G_STMT_END + static void xml_to_builtin(xnode_t *xn, void *unused_udata) { @@ -866,61 +917,61 @@ goto failure; target = parse_target(buf, &error); if (error) { - g_warning("xml_to_builtin: %s", g_strerror(error)); + XML_PARSE_ERROR(TAG_BUILTIN_SHOW_UID); goto failure; } - g_hash_table_insert(id_map, target, filter_get_show_target()); + htable_insert(id_map, target, filter_get_show_target()); buf = xnode_prop_get(xn, TAG_BUILTIN_DROP_UID); if (NULL == buf) goto failure; target = parse_target(buf, &error); if (error) { - g_warning("xml_to_builtin: %s", g_strerror(error)); + XML_PARSE_ERROR(TAG_BUILTIN_DROP_UID); goto failure; } - g_hash_table_insert(id_map, target, filter_get_drop_target()); + htable_insert(id_map, target, filter_get_drop_target()); buf = xnode_prop_get(xn, TAG_BUILTIN_DOWNLOAD_UID); if (buf != NULL) { target = parse_target(buf, &error); if (error) { - g_warning("xml_to_builtin: %s", g_strerror(error)); + XML_PARSE_ERROR(TAG_BUILTIN_DOWNLOAD_UID); goto failure; } - g_hash_table_insert(id_map, target, filter_get_download_target()); + htable_insert(id_map, target, filter_get_download_target()); } else { - g_warning("xml_to_builtin: no \"DOWNLOAD\" target"); + XML_MISSING(TAG_BUILTIN_DOWNLOAD_UID); } buf = xnode_prop_get(xn, TAG_BUILTIN_NODOWNLOAD_UID); if (buf != NULL) { target = parse_target(buf, &error); if (error) { - g_warning("xml_to_builtin: %s", g_strerror(error)); + XML_PARSE_ERROR(TAG_BUILTIN_NODOWNLOAD_UID); goto failure; } - g_hash_table_insert(id_map, target, filter_get_nodownload_target()); + htable_insert(id_map, target, filter_get_nodownload_target()); } else { - g_warning("xml_to_builtin: no \"DON'T DOWNLOAD\" target"); + XML_MISSING(TAG_BUILTIN_NODOWNLOAD_UID); } buf = xnode_prop_get(xn, TAG_BUILTIN_RETURN_UID); if (buf != NULL) { target = parse_target(buf, &error); if (error) { - g_warning("xml_to_builtin: %s", g_strerror(error)); + XML_PARSE_ERROR(TAG_BUILTIN_RETURN_UID); goto failure; } - g_hash_table_insert(id_map, target, filter_get_return_target()); + htable_insert(id_map, target, filter_get_return_target()); } else { - g_warning("xml_to_builtin: no \"RETURN\" target"); + XML_MISSING(TAG_BUILTIN_RETURN_UID); } return; failure: - g_warning("could not parse XML node %s", xnode_to_string(xn)); + XML_BAD_NODE(xn); } static void @@ -929,13 +980,14 @@ const char *buf; const char *query; gint sort_col = SORT_NO_COL, sort_order = SORT_NONE; - guint32 reissue_timeout; + uint32 reissue_timeout; unsigned media_type = 0; xnode_t *xc; struct search *search; unsigned flags = 0; unsigned lifetime; time_t create_time; + bool clean_restart; (void) unused_udata; g_assert(xn != NULL); @@ -943,10 +995,11 @@ g_assert(0 == ascii_strcasecmp(xnode_element_name(xn), NODE_SEARCH)); gnet_prop_get_guint32_val(PROP_SEARCH_REISSUE_TIMEOUT, &reissue_timeout); + gnet_prop_get_boolean_val(PROP_CLEAN_RESTART, &clean_restart); query = xnode_prop_get(xn, TAG_SEARCH_QUERY); if (NULL == query) { - g_warning("ignoring search without query"); + g_warning("%s(): ignoring search without query", G_STRFUNC); return; } @@ -960,7 +1013,7 @@ buf = xnode_prop_get(xn, TAG_SEARCH_SPEED); if (buf) { - g_warning("xml_to_search: found deprecated speed attribute."); + g_warning("%s(): found deprecated speed attribute.", G_STRFUNC); } buf = xnode_prop_get(xn, TAG_SEARCH_REISSUE_TIMEOUT); @@ -994,27 +1047,30 @@ if (buf) { create_time = date2time(buf, tm_time()); if (create_time == (time_t) -1) - g_warning("xml_to_search: Unparseable \"%s\" attribute.", - TAG_SEARCH_CREATE_TIME); + g_warning("%s(): unparseable \"%s\" attribute \"%s\"", + G_STRFUNC, TAG_SEARCH_CREATE_TIME, buf); } - /* consider legacy searches as created right now */ + + /* consider legacy searches as created right now */ if (create_time == (time_t) -1) create_time = tm_time(); - lifetime = (guint) -1; + lifetime = -1U; buf = xnode_prop_get(xn, TAG_SEARCH_LIFETIME); if (buf) { gint error; lifetime = parse_uint16(buf, NULL, 10, &error); if (error) - g_warning("xml_to_search: Unparseable \"%s\" attribute.", - TAG_SEARCH_LIFETIME); + XML_PARSE_ERROR(TAG_SEARCH_LIFETIME); } /* legacy searches get a 2 week expiration time */ lifetime = MIN(14 * 24, lifetime); - /* A zero lifetime means the search expired with the previous session */ - if (0 == lifetime && 0 == (flags & SEARCH_F_PASSIVE)) + /* + * A zero lifetime means the search expired with the previous session. + * However, when we're resuming from a crash, let the search continue. + */ + if (0 == lifetime && 0 == (flags & SEARCH_F_PASSIVE) && clean_restart) flags &= ~SEARCH_F_ENABLED; if (GUI_PROPERTY(gui_debug) >= 4) { @@ -1062,14 +1118,17 @@ g_assert(0 == ascii_strcasecmp(xnode_element_name(xn), NODE_SHA1)); value = xnode_first_child(xn); - if (!xnode_is_text(value)) { - g_warning("first XML child node for %s is not text but %s", - xnode_to_string(xn), xnode_to_string2(value)); - goto no_content; - } if (value != NULL) { - const char *b32 = xnode_text(value); + const char *b32; + + if (!xnode_is_text(value)) { + g_warning("first XML child node for %s is not text but %s", + xnode_to_string(xn), xnode_to_string2(value)); + goto no_content; + } + + b32 = xnode_text(value); if (b32 != NULL) { const struct sha1 *sha1; @@ -1123,7 +1182,7 @@ void *dest; gboolean active = TRUE; int error; - guint64 v; + uint64 v; g_assert(xn != NULL); g_assert(xnode_element_name(xn) != NULL); @@ -1133,7 +1192,7 @@ name = xnode_prop_get(xn, TAG_FILTER_NAME); if (NULL == name) { - g_warning("Ignored unnamed filter"); + g_warning("%s(): ignoring unnamed filter", G_STRFUNC); goto failure; } @@ -1141,7 +1200,7 @@ if (buf) { v = parse_number(buf, &error); if (error) { - g_warning("xml_to_filter: %s", g_strerror(error)); + XML_PARSE_ERROR(TAG_FILTER_GLOBAL); goto failure; } @@ -1154,7 +1213,7 @@ break; default: filter = NULL; - g_warning("xml_to_filter: Invalid filter"); + XML_INVALID(TAG_FILTER_GLOBAL); goto failure; } } else { @@ -1168,7 +1227,7 @@ if (buf != NULL) { v = parse_number(buf, &error); if (error || v > 1) { - g_warning("xml_to_filter: Invalid \"active\" tag"); + XML_INVALID(TAG_FILTER_ACTIVE); goto failure; } active = 0 != v; @@ -1182,10 +1241,10 @@ g_assert(buf); dest = parse_target(buf, &error); if (error) { - g_warning("xml_to_filter: %s", g_strerror(error)); + XML_PARSE_ERROR(TAG_FILTER_UID); goto failure; } - g_hash_table_insert(id_map, dest, filter); + htable_insert(id_map, dest, filter); /* * Also parse all children. @@ -1197,7 +1256,7 @@ return; failure: - g_warning("unable to parse XML node: %s", xnode_to_string(xn)); + XML_BAD_NODE(xn); } static void @@ -1209,8 +1268,8 @@ const char *buf = NULL; rule_t *rule; filter_t *target, *filter = data; - guint16 flags; - guint64 v; + uint16 flags; + uint64 v; int error; g_assert(xn != NULL); @@ -1220,14 +1279,14 @@ match = xnode_prop_get(xn, TAG_RULE_TEXT_MATCH); if (match == NULL) { - g_warning("xml_to_text_rule: rule without match string"); + XML_MISSING(TAG_RULE_TEXT_MATCH); goto failure; } buf = xnode_prop_get(xn, TAG_RULE_TEXT_CASE); v = parse_number(buf, &error); if (error || v > 1) { - g_warning("xml_to_text_rule: invalid \"text case\" tag"); + XML_INVALID(TAG_RULE_TEXT_CASE); goto failure; } @@ -1236,14 +1295,14 @@ if (buf != NULL) { type = (enum rule_text_type) atol(buf); } else { - g_warning("xml_to_text_rule: no \"text type\" tag"); + XML_MISSING(TAG_RULE_TEXT_TYPE); goto failure; } buf = xnode_prop_get(xn, TAG_RULE_TARGET); target = parse_target(buf, &error); if (error) { - g_warning("xml_to_text_rule: %s", g_strerror(error)); + XML_PARSE_ERROR(TAG_RULE_TARGET); goto failure; } @@ -1260,18 +1319,18 @@ return; failure: - g_warning("unable to parse XML node: %s", xnode_to_string(xn)); + XML_BAD_NODE(xn); } static void xml_to_ip_rule(xnode_t *xn, void *data) { host_addr_t addr; - guint32 mask; + uint32 mask; const char *buf; rule_t *rule; filter_t *target, *filter = data; - guint16 flags; + uint16 flags; int error; g_assert(xn != NULL); @@ -1281,18 +1340,18 @@ buf = xnode_prop_get(xn, TAG_RULE_IP_ADDR); if (buf == NULL) { - g_warning("xml_to_ip_rule: rule without ip address"); + XML_MISSING(TAG_RULE_IP_ADDR); goto failure; } error = !string_to_host_addr(buf, NULL, &addr); if (error) { - g_warning("xml_to_ip_rule: rule with unparseable ip address"); + XML_INVALID(TAG_RULE_IP_ADDR); goto failure; } buf = xnode_prop_get(xn, TAG_RULE_IP_MASK); if (buf == NULL) { - g_warning("xml_to_ip_rule: rule without netmask"); + XML_MISSING(TAG_RULE_IP_MASK); goto failure; } mask = string_to_ip(buf); @@ -1308,7 +1367,7 @@ buf = xnode_prop_get(xn, TAG_RULE_TARGET); target = parse_target(buf, &error); if (error) { - g_warning("xml_to_ip_rule: %s", g_strerror(error)); + XML_PARSE_ERROR(TAG_RULE_TARGET); goto failure; } @@ -1325,7 +1384,7 @@ return; failure: - g_warning("unable to parse XML node: %s", xnode_to_string(xn)); + XML_BAD_NODE(xn); } static void @@ -1335,7 +1394,7 @@ filesize_t lower, upper; const char *buf; rule_t *rule; - guint16 flags; + uint16 flags; int error; g_assert(xn != NULL); @@ -1345,31 +1404,30 @@ buf = xnode_prop_get(xn, TAG_RULE_SIZE_LOWER); if (buf == NULL) { - g_warning("xml_to_size_rule: rule without lower bound"); + XML_MISSING(TAG_RULE_SIZE_LOWER); goto failure; } lower = parse_number(buf, &error); if (error) { - g_warning("xml_to_size_rule: invalid lower bound"); + XML_PARSE_ERROR(TAG_RULE_SIZE_LOWER); goto failure; } buf = xnode_prop_get(xn, TAG_RULE_SIZE_UPPER); if (buf == NULL) { - g_warning("xml_to_size_rule: rule without upper bound"); + XML_MISSING(TAG_RULE_SIZE_UPPER); goto failure; } upper = parse_number(buf, &error); if (error) { - g_warning("xml_to_size_rule: invalid upper bound"); + XML_PARSE_ERROR(TAG_RULE_SIZE_UPPER); goto failure; } buf = xnode_prop_get(xn, TAG_RULE_TARGET); target = parse_target(buf, &error); if (error) { - g_warning("xml_to_size_rule: %s (%p)", - g_strerror(error), cast_to_gconstpointer(target)); + XML_PARSE_ERROR(TAG_RULE_TARGET); goto failure; } @@ -1386,7 +1444,7 @@ return; failure: - g_warning("unable to parse XML node: %s", xnode_to_string(xn)); + XML_BAD_NODE(xn); } static void @@ -1395,7 +1453,7 @@ const char *buf; rule_t *rule; filter_t *target, *filter = data; - guint16 flags; + uint16 flags; int error; g_assert(xn != NULL); @@ -1407,7 +1465,7 @@ g_assert(buf != NULL); target = parse_target(buf, &error); if (error) { - g_warning("xml_to_jump_rule: %s", g_strerror(error)); + XML_PARSE_ERROR(TAG_RULE_TARGET); goto failure; } @@ -1422,9 +1480,9 @@ filter->ruleset = g_list_append(filter->ruleset, rule); return; - + failure: - g_warning("unable to parse XML node: %s", xnode_to_string(xn)); + XML_BAD_NODE(xn); } static void @@ -1435,7 +1493,7 @@ const char *buf; rule_t *rule; filter_t *target, *filter = data; - guint16 flags; + uint16 flags; int error; g_assert(xn != NULL); @@ -1450,7 +1508,7 @@ if (buf != NULL) { sha1 = strlen(buf) == SHA1_BASE32_SIZE ? base32_sha1(buf) : NULL; if (!sha1) { - g_warning("xml_to_sha1_rule: Invalidly encoded SHA1"); + g_warning("%s(): improperly encoded SHA1: \"%s\"", G_STRFUNC, buf); goto failure; } } else { @@ -1459,12 +1517,12 @@ buf = xnode_prop_get(xn, TAG_RULE_TARGET); if (NULL == buf) { - g_warning("xml_to_sha1_rule: no target"); + XML_MISSING(TAG_RULE_TARGET); goto failure; } target = parse_target(buf, &error); if (error) { - g_warning("xml_to_sha1_rule: %s", g_strerror(error)); + XML_PARSE_ERROR(TAG_RULE_TARGET); goto failure; } @@ -1479,9 +1537,9 @@ filter->ruleset = g_list_append(filter->ruleset, rule); return; - + failure: - g_warning("unable to parse XML node: %s", xnode_to_string(xn)); + XML_BAD_NODE(xn); } static void @@ -1493,8 +1551,8 @@ const char *buf; rule_t *rule; filter_t *target, *filter = data; - guint16 flags; - guint64 v; + uint16 flags; + uint64 v; int error; g_assert(xn != NULL); @@ -1506,7 +1564,7 @@ if (buf != NULL) { v = parse_number(buf, &error); if (error) { - g_warning("xml_to_flag_rule: %s", g_strerror(error)); + XML_PARSE_ERROR(TAG_RULE_FLAG_STABLE); goto failure; } else if (v == RULE_FLAG_SET || v == RULE_FLAG_UNSET) { stable = v; @@ -1517,7 +1575,7 @@ if (buf != NULL) { v = parse_number(buf, &error); if (error) { - g_warning("xml_to_flag_rule: %s", g_strerror(error)); + XML_PARSE_ERROR(TAG_RULE_FLAG_BUSY); goto failure; } else if (v == RULE_FLAG_SET || v == RULE_FLAG_UNSET) { busy = v; @@ -1528,7 +1586,7 @@ if (buf != NULL) { v = parse_number(buf, &error); if (error) { - g_warning("xml_to_flag_rule: %s", g_strerror(error)); + XML_PARSE_ERROR(TAG_RULE_FLAG_PUSH); goto failure; } else if (v == RULE_FLAG_SET || v == RULE_FLAG_UNSET) { push = v; @@ -1539,7 +1597,7 @@ g_assert(buf != NULL); target = parse_target(buf, &error); if (error) { - g_warning("xml_to_flag_rule: %s", g_strerror(error)); + XML_PARSE_ERROR(TAG_RULE_TARGET); goto failure; } @@ -1556,7 +1614,7 @@ return; failure: - g_warning("unable to parse XML node: %s", xnode_to_string(xn)); + XML_BAD_NODE(xn); } static void @@ -1567,9 +1625,9 @@ const char *buf; rule_t *rule; filter_t *target, *filter = data; - guint16 flags; + uint16 flags; int error; - guint64 v; + uint64 v; g_assert(xn != NULL); g_assert(xnode_element_name(xn) != NULL); @@ -1580,7 +1638,7 @@ if (buf != NULL) { v = parse_number(buf, &error); if (error) { - g_warning("xml_to_state_rule: %s", g_strerror(error)); + XML_PARSE_ERROR(TAG_RULE_STATE_DISPLAY); goto failure; } if (v <= MAX_FILTER_PROP_STATE || v == FILTER_PROP_STATE_IGNORE) { @@ -1592,7 +1650,7 @@ if (buf != NULL) { v = parse_number(buf, &error); if (error) { - g_warning("xml_to_state_rule: %s", g_strerror(error)); + XML_PARSE_ERROR(TAG_RULE_STATE_DOWNLOAD); goto failure; } if (v <= MAX_FILTER_PROP_STATE || v == FILTER_PROP_STATE_IGNORE) { @@ -1602,12 +1660,12 @@ buf = xnode_prop_get(xn, TAG_RULE_TARGET); if (NULL == buf) { - g_warning("xml_to_state_rule: no target"); + XML_MISSING(TAG_RULE_TARGET); goto failure; } target = parse_target(buf, &error); if (error) { - g_warning("xml_to_state_rule: %s", g_strerror(error)); + XML_PARSE_ERROR(TAG_RULE_TARGET); goto failure; } @@ -1624,19 +1682,19 @@ return; failure: - g_warning("unable to parse XML node: %s", xnode_to_string(xn)); + XML_BAD_NODE(xn); } -static guint16 +static uint16 get_rule_flags_from_xml(xnode_t *xn) { gboolean negate = FALSE; gboolean active = TRUE; gboolean soft = FALSE; - guint16 flags; + uint16 flags; const char *buf; int error; - guint64 v; + uint64 v; g_assert(xn != NULL); @@ -1644,7 +1702,7 @@ if (buf != NULL) { v = parse_number(buf, &error); if (error || v > 1) { - g_warning("get_rule_flags_from_xml: Invalid \"negate\" tag"); + XML_INVALID(TAG_RULE_NEGATE); } else { negate = 0 != v; } @@ -1654,7 +1712,7 @@ if (buf != NULL) { v = parse_number(buf, &error); if (error || v > 1) { - g_warning("get_rule_flags_from_xml: Invalid \"active\" tag"); + XML_INVALID(TAG_RULE_ACTIVE); } else { active = 0 != v; } @@ -1664,7 +1722,7 @@ if (buf != NULL) { v = parse_number(buf, &error); if (error || v > 1) { - g_warning("get_rule_flags_from_xml: Invalid \"soft\" tag"); + XML_INVALID(TAG_RULE_SOFT); } else { soft = 0 != v; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/settings.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/settings.c
Changed
@@ -41,6 +41,7 @@ #include "monitor.h" #include "nodes_common.h" #include "search.h" +#include "search_common.h" #include "search_stats.h" #include "settings.h" #include "settings_cb.h" @@ -53,11 +54,16 @@ #include "if/dht/routing.h" #include "lib/concat.h" -#include "lib/glib-missing.h" +#include "lib/cq.h" +#include "lib/halloc.h" +#include "lib/hikset.h" +#include "lib/mempcpy.h" #include "lib/product.h" #include "lib/prop.h" +#include "lib/str.h" #include "lib/stringify.h" #include "lib/utf8.h" +#include "lib/walloc.h" #include "lib/override.h" /* Must be the last header included */ @@ -111,7 +117,7 @@ } prop_map_t; #define NOT_IN_MAP (-1) -#define IGNORE_CB NULL +#define IGNORE_CB NULL static const prop_set_stub_t *gui_prop_set_stub; static const prop_set_stub_t *gnet_prop_set_stub; @@ -124,6 +130,9 @@ static const gchar property_file = "config_gui"; static prop_set_t *properties; +static hikset_t *sensitive_changes; + +#define SENSITIVE_DEFER 250 /**< ms: deferred sensitive widget change */ static prop_map_t * settings_gui_get_map_entry(property_t prop); @@ -165,8 +174,8 @@ if (w == NULL) { if (GUI_PROPERTY(gui_debug)) - g_warning("%s - widget not found: %s", - G_GNUC_PRETTY_FUNCTION, map_entry->wid); + g_warning("%s(): widget not found: %s", + G_STRFUNC, map_entry->wid); return FALSE; } @@ -190,8 +199,8 @@ if (w == NULL) { if (GUI_PROPERTY(gui_debug)) - g_warning("%s - widget not found: %s", - G_GNUC_PRETTY_FUNCTION, map_entry->wid); + g_warning("%s(): widget not found: %s", + G_STRFUNC, map_entry->wid); return FALSE; } @@ -218,8 +227,8 @@ if (w == NULL) { if (GUI_PROPERTY(gui_debug)) - g_warning("%s - widget not found: %s", - G_GNUC_PRETTY_FUNCTION, map_entry->wid); + g_warning("%s(): widget not found: %s", + G_STRFUNC, map_entry->wid); return FALSE; } @@ -292,8 +301,8 @@ if (w == NULL) { if (GUI_PROPERTY(gui_debug)) - g_warning("%s - widget not found: %s", - G_GNUC_PRETTY_FUNCTION, map_entry->wid); + g_warning("%s(): widget not found: %s", + G_STRFUNC, map_entry->wid); return FALSE; } @@ -342,8 +351,8 @@ w = lookup_widget(top, map_entry->wid); if (w == NULL) { if (GUI_PROPERTY(gui_debug)) - g_warning("%s - widget not found: %s", - G_GNUC_PRETTY_FUNCTION, map_entry->wid); + g_warning("%s(): widget not found: %s", + G_STRFUNC, map_entry->wid); return FALSE; } @@ -368,8 +377,8 @@ w = lookup_widget(top, map_entry->wid); if (w == NULL) { if (GUI_PROPERTY(gui_debug)) - g_warning("%s - widget not found: %s", - G_GNUC_PRETTY_FUNCTION, map_entry->wid); + g_warning("%s(): widget not found: %s", + G_STRFUNC, map_entry->wid); return FALSE; } @@ -410,20 +419,20 @@ gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(NULL, renderer, - "text", 1, (void *) 0); + "text", 1, NULL_PTR); g_object_set(renderer, "xalign", 0.0, "xpad", GUI_CELL_RENDERER_XPAD, "ypad", GUI_CELL_RENDERER_YPAD, - (void *) 0); + NULL_PTR); g_object_set(column, "fixed-width", 200, "min-width", 1, "resizable", TRUE, "reorderable", FALSE, "sizing", GTK_TREE_VIEW_COLUMN_FIXED, - (void *) 0); + NULL_PTR); gtk_tree_view_append_column(tv, column); } @@ -435,45 +444,26 @@ update_shared_dirs(property_t prop) { GtkTreeModel *model; - gchar *str; - const gchar *p, *end; - GList *l_iter, *dirs = NULL; + pslist_t *sl_dirs, *sl; + char *dirs; model = get_shared_dirs_model(); gtk_list_store_clear(GTK_LIST_STORE(model)); /* Convert the string to a list of strings for sorting */ - str = gnet_prop_get_string(prop, NULL, 0); - for (p = str; '\0' != *p; p = '\0' == *end ? end : ++end) { - size_t len; - - end = strchr(p, G_SEARCHPATH_SEPARATOR); - if (!end) - end = strchr(p, '\0'); - - len = end - p; - if (len > 0) { - gchar *dir; - - dir = g_malloc(1 + len); - memcpy(dir, p, len); - dirlen = '\0'; - dirs = g_list_append(dirs, dir); - } - } - G_FREE_NULL(str); + dirs = gnet_prop_get_string(prop, NULL, 0); + sl_dirs = dirlist_parse(dirs); /* Feed the sorted list of directories to the GtkListStore */ - dirs = g_list_sort(dirs, str_cmp_func); - for (l_iter = dirs; NULL != l_iter; l_iter = g_list_next(l_iter)) { + sl_dirs = pslist_sort(sl_dirs, str_cmp_func); + PSLIST_FOREACH(sl_dirs, sl) { GtkTreeIter iter; - gchar *dir, *dir_utf8; + char *dir_utf8; - dir = l_iter->data; - dir_utf8 = filename_to_utf8_normalized(dir, UNI_NORM_GUI); + dir_utf8 = filename_to_utf8_normalized(sl->data, UNI_NORM_GUI); gtk_list_store_append(GTK_LIST_STORE(model), &iter); gtk_list_store_set(GTK_LIST_STORE(model), &iter, - 0, dir, /* The actual pathname, not necessarily UTF-8 encoded */ + 0, sl->data,/* The actual pathname, not necessarily UTF-8 encoded */ 1, dir_utf8, /* The best effort UTF-8 conversion for viewing */ (-1)); @@ -482,12 +472,13 @@ * free the originals here. */ - if (dir != dir_utf8) { + if (sl->data != dir_utf8) { G_FREE_NULL(dir_utf8); } - G_FREE_NULL(dir); + HFREE_NULL(sl->data); } - g_list_free(dirs); + pslist_free_null(&sl_dirs); + G_FREE_NULL(dirs); return FALSE; } @@ -508,8 +499,7 @@ if (!w->window) { if (GUI_PROPERTY(gui_debug)) - g_warning("%s - top level window not available (NULL)", - G_GNUC_PRETTY_FUNCTION); + g_warning("%s(): top level window not available (NULL)", G_STRFUNC); return FALSE; } @@ -555,7 +545,7 @@ if (w == NULL) { if (GUI_PROPERTY(gui_debug)) g_warning("%s - widget not found: %s", - G_GNUC_PRETTY_FUNCTION, map_entry->wid); + G_STRFUNC, map_entry->wid); return FALSE; } @@ -584,7 +574,7 @@ display_metric_units_changed(property_t prop) { GtkWidget *widget; - + widget = gui_dlg_prefs_lookup("checkbutton_config_metric"); gnet_prop_get_boolean_val(prop, ¤t_display_metric_units); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), @@ -987,7 +977,7 @@ if (w == NULL) { if (GUI_PROPERTY(gui_debug)) g_warning("%s - widget not found: %s", - G_GNUC_PRETTY_FUNCTION, map_entry->wid); + G_STRFUNC, map_entry->wid); return FALSE; } @@ -1047,7 +1037,7 @@ if (w == NULL) { if (GUI_PROPERTY(gui_debug)) g_warning("%s - widget not found: %s", - G_GNUC_PRETTY_FUNCTION, map_entry->wid); + G_STRFUNC, map_entry->wid); return FALSE; } @@ -1083,7 +1073,7 @@ if (w == NULL) { if (GUI_PROPERTY(gui_debug)) g_warning("%s - widget not found: %s", - G_GNUC_PRETTY_FUNCTION, map_entry->wid); + G_STRFUNC, map_entry->wid); return FALSE; } @@ -1109,7 +1099,7 @@ if (w == NULL) { if (GUI_PROPERTY(gui_debug)) g_warning("%s - widget not found: %s", - G_GNUC_PRETTY_FUNCTION, map_entry->wid); + G_STRFUNC, map_entry->wid); return FALSE; } @@ -1234,7 +1224,7 @@ frac = MIN(cur, max) * 100; frac = max ? (frac / max) : 0; - gm_snprintf(buf, sizeof buf, + str_bprintf(buf, sizeof buf, NG_("%u/%u host (%u%%)", "%u/%u hosts (%u%%)", max), cur, max, frac); @@ -1287,6 +1277,28 @@ } static gboolean +hosts_in_g2hub_catcher_changed(property_t unused_prop) +{ + guint32 hosts; + guint32 max_hosts; + + (void) unused_prop; + gnet_prop_get_guint32_val(PROP_HOSTS_IN_G2HUB_CATCHER, &hosts); + gnet_prop_get_guint32_val(PROP_MAX_G2HUB_HOSTS_CACHED, &max_hosts); + + gtk_widget_set_sensitive( + gui_main_window_lookup("button_g2hub_catcher_clear"), + hosts != 0); + + set_host_progress( + "progressbar_hosts_in_g2hub_catcher", + hosts, + max_hosts); + + return FALSE; +} + +static gboolean hosts_in_bad_catcher_changed(property_t unused_prop) { guint32 hosts; @@ -1367,7 +1379,10 @@ case PROP_MAX_BAD_HOSTS_CACHED: hosts_in_bad_catcher_changed(PROP_HOSTS_IN_BAD_CATCHER); break; - default: + case PROP_MAX_G2HUB_HOSTS_CACHED: + hosts_in_g2hub_catcher_changed(PROP_HOSTS_IN_G2HUB_CATCHER); + break; + default: g_error("hostcache_size_changed: unknown hostcache property %d", prop); } @@ -1474,6 +1489,54 @@ } static gboolean +net_buffer_shortage_changed(property_t prop) +{ + gboolean b; + GtkWidget *w; + prop_map_t *map_entry = settings_gui_get_map_entry(prop); + const prop_set_stub_t *stub = map_entry->stub; + GtkWidget *top = map_entry->fn_toplevel(); + + w = lookup_widget(top, map_entry->wid); + stub->boolean.get(prop, &b, 0, 1); + + if (b) { + statusbar_gui_message(15, + _("*** KERNEL BUFFER SHORTAGE -- LIMITING TCP CONNECTIONS ***")); + gtk_widget_show(w); + } else { + gtk_widget_hide(w); + shrink_frame_status(); + } + + return FALSE; +} + +static gboolean +tcp_no_listening_changed(property_t prop) +{ + gboolean b; + GtkWidget *w; + prop_map_t *map_entry = settings_gui_get_map_entry(prop); + const prop_set_stub_t *stub = map_entry->stub; + GtkWidget *top = map_entry->fn_toplevel(); + + w = lookup_widget(top, map_entry->wid); + stub->boolean.get(prop, &b, 0, 1); + + if (b) { + statusbar_gui_message(15, + _("*** NO LISTENING TCP SOCKET -- NO INBOUND CONNECTIONS ***")); + gtk_widget_show(w); + } else { + gtk_widget_hide(w); + shrink_frame_status(); + } + + return FALSE; +} + +static gboolean uploads_stalling_changed(property_t prop) { gboolean b; @@ -1522,26 +1585,41 @@ static gboolean port_mapping_update(property_t unused_prop) { - GtkWidget *icon_possible; - GtkWidget *icon_successful; - gboolean pm_possible; + static GtkWidget *icon_possible; + static GtkWidget *icon_upnp_successful; + static GtkWidget *icon_natpmp_successful; gboolean pm_successful; + gboolean upnp, natpmp, upnp_enabled, natpmp_enabled; (void) unused_prop; - icon_possible = gui_main_window_lookup("eventbox_port_mapping_possible"); - icon_successful = - gui_main_window_lookup("eventbox_port_mapping_successful"); + if G_UNLIKELY(NULL == icon_possible) { + icon_possible = + gui_main_window_lookup("eventbox_port_mapping_possible"); + icon_upnp_successful = + gui_main_window_lookup("eventbox_upnp_port_mapping_successful"); + icon_natpmp_successful = + gui_main_window_lookup("eventbox_natpmp_port_mapping_successful"); + } - gnet_prop_get_boolean_val(PROP_PORT_MAPPING_POSSIBLE, &pm_possible); gnet_prop_get_boolean_val(PROP_PORT_MAPPING_SUCCESSFUL, &pm_successful); + gnet_prop_get_boolean_val(PROP_UPNP_POSSIBLE, &upnp); + gnet_prop_get_boolean_val(PROP_NATPMP_POSSIBLE, &natpmp); + gnet_prop_get_boolean_val(PROP_ENABLE_UPNP, &upnp_enabled); + gnet_prop_get_boolean_val(PROP_ENABLE_NATPMP, &natpmp_enabled); gtk_widget_hide(icon_possible); - gtk_widget_hide(icon_successful); + gtk_widget_hide(icon_upnp_successful); + gtk_widget_hide(icon_natpmp_successful); if (pm_successful) { - gtk_widget_show(icon_successful); - } else if (pm_possible) { + if (natpmp && natpmp_enabled) + gtk_widget_show(icon_natpmp_successful); + else if (upnp && upnp_enabled) + gtk_widget_show(icon_upnp_successful); + else + gtk_widget_show(icon_possible); + } else if (upnp || natpmp) { gtk_widget_show(icon_possible); } @@ -1593,7 +1671,7 @@ if (remain == 0) statusbar_gui_message(15, _("*** Please update gtk-gnutella ***")); - else + else statusbar_gui_message(15, NG_("*** VERSION WILL BECOME OLD IN %d DAY! ***", "*** VERSION WILL BECOME OLD IN %d DAYS! ***", remain), @@ -1610,7 +1688,7 @@ g_return_val_if_fail(PROP_NEW_VERSION_STR == prop, FALSE); str = gnet_prop_get_string(prop, NULL, 0); - statusbar_gui_set_default("%s%s", product_get_website(), str ? str : ""); + statusbar_gui_set_default("%s%s", product_website(), str ? str : ""); G_FREE_NULL(str); return FALSE; @@ -2057,8 +2135,8 @@ if ( old_port != port || - !host_addr_equal(old_address, addr) || - !host_addr_equal(old_v6_address, addr_v6) + !host_addr_equiv(old_address, addr) || + !host_addr_equiv(old_v6_address, addr_v6) ) { gchar addr_bufHOST_ADDR_PORT_BUFLEN; gchar addr_v6_bufHOST_ADDR_PORT_BUFLEN; @@ -2079,8 +2157,8 @@ concat_strings(buf, sizeof buf, addr_buf, '\0' != addr_buf0 && '\0' != addr_v6_buf0 ? ", " : "", - addr_v6_buf, (void *) 0); - + addr_v6_buf, NULL_PTR); + old_address = addr; old_v6_address = addr_v6; old_port = port; @@ -2274,7 +2352,7 @@ label = GTK_LABEL(gui_main_window_lookup("label_nodes_guid")); concat_strings(buf, sizeof buf, - "<tt>", guid_hex_str(&guid_buf), "</tt>", (void *) 0); + "<tt>", guid_hex_str(&guid_buf), "</tt>", NULL_PTR); gtk_label_set_use_markup(label, TRUE); gtk_label_set_markup(label, buf); } @@ -2301,7 +2379,7 @@ label = GTK_LABEL(gui_main_window_lookup("label_nodes_kuid")); concat_strings(buf, sizeof buf, - "<tt>", kuid_to_hex_string(&kuid_buf), "</tt>", (void *) 0); + "<tt>", kuid_to_hex_string(&kuid_buf), "</tt>", NULL_PTR); gtk_label_set_use_markup(label, TRUE); gtk_label_set_markup(label, buf); } @@ -2350,6 +2428,18 @@ } static gboolean +search_display_guess_stats_changed(property_t prop) +{ + gboolean b; + + gui_prop_get_boolean_val(prop, &b); + update_togglebutton(prop); + search_gui_current_search_refresh(); + + return FALSE; +} + +static gboolean expert_mode_changed(property_t prop) { static const gchar *expert_widgets_main = { @@ -2384,7 +2474,7 @@ gui_prop_get_boolean_val(prop, &expert); /* Enable/Disable main_window expert widgets */ - for (i = 0; i < G_N_ELEMENTS(expert_widgets_main); i++) { + for (i = 0; i < N_ITEMS(expert_widgets_main); i++) { w = gui_main_window_lookup(expert_widgets_maini); if (w == NULL) continue; @@ -2396,7 +2486,7 @@ } /* Enable/Disable preferences dialog expert widgets */ - for (i = 0; i < G_N_ELEMENTS(expert_widgets_prefs); i++) { + for (i = 0; i < N_ITEMS(expert_widgets_prefs); i++) { w = gui_dlg_prefs_lookup(expert_widgets_prefsi); if (w == NULL) continue; @@ -2429,13 +2519,63 @@ return FALSE; } -static inline gboolean +struct widget_change { + cevent_t *ev; /* Event to change widget */ + const char *name; /* Widget name */ + GtkWidget *widget; /* The widget in the main window */ + bool sensitive; /* Whether widget will become sensitive */ +}; + +static void +widget_sensitive_event(cqueue_t *cq, void *data) +{ + struct widget_change *wc = data; + + gtk_widget_set_sensitive(wc->widget, wc->sensitive); + cq_zero(cq, &wc->ev); +} + +static gboolean widget_set_sensitive(const gchar *name, property_t prop) { gboolean val; + struct widget_change *wc; + + /* + * A widget sensitivity can change quickly, leading to GUI flickering. + * In order to limit that, we record the changes in a hash table and + * install a callback to delay the actual sensitivity change. + * + * If another visibility change occurs before the callback fires, we may + * cancel the event if it goes in the opposite direction, or do nothing + * if it still goes in the same direction (i.e. making it sensitive if + * it is already recorded as such). + * + * We give priority to "lighting" the widget, and defer the "shadowing". + */ gnet_prop_get_boolean_val(prop, &val); - gtk_widget_set_sensitive(gui_main_window_lookup(name), val); + wc = hikset_lookup(sensitive_changes, name); + + if G_UNLIKELY(NULL == wc) { + WALLOC(wc); + wc->name = name; /* Known to be a static string */ + wc->widget = gui_main_window_lookup(name); + wc->sensitive = val; + wc->ev = cq_main_insert(SENSITIVE_DEFER, widget_sensitive_event, wc); + hikset_insert_key(sensitive_changes, &wc->name); + } else if (wc->sensitive != val) { + wc->sensitive = val; + if (val) { + cq_cancel(&wc->ev); + gtk_widget_set_sensitive(wc->widget, wc->sensitive); + } else if (NULL == wc->ev) { + wc->ev = cq_main_insert(SENSITIVE_DEFER, + widget_sensitive_event, wc); + } else { + cq_resched(wc->ev, SENSITIVE_DEFER); + } + } return FALSE; } @@ -2561,13 +2701,8 @@ { GtkProgressBar *pg; gchar buf128; - guint32 leaf_count; - guint32 normal_count; - guint32 ultra_count; - guint32 max_connections; - guint32 max_leaves; - guint32 max_normal; - guint32 max_ultrapeers; + guint32 leaf_count, normal_count, ultra_count, g2_count; + guint32 max_connections, max_leaves, max_normal, max_ultrapeers, max_g2; guint32 cnodes; guint32 nodes = 0; guint32 peermode; @@ -2578,30 +2713,33 @@ gnet_prop_get_guint32_val(PROP_NODE_LEAF_COUNT, &leaf_count); gnet_prop_get_guint32_val(PROP_NODE_NORMAL_COUNT, &normal_count); gnet_prop_get_guint32_val(PROP_NODE_ULTRA_COUNT, &ultra_count); + gnet_prop_get_guint32_val(PROP_NODE_G2_COUNT, &g2_count); gnet_prop_get_guint32_val(PROP_MAX_CONNECTIONS, &max_connections); gnet_prop_get_guint32_val(PROP_MAX_LEAVES, &max_leaves); gnet_prop_get_guint32_val(PROP_MAX_ULTRAPEERS, &max_ultrapeers); + gnet_prop_get_guint32_val(PROP_MAX_G2_HUBS, &max_g2); gnet_prop_get_guint32_val(PROP_NORMAL_CONNECTIONS, &max_normal); gnet_prop_get_guint32_val(PROP_CURRENT_PEERMODE, &peermode); - cnodes = leaf_count + normal_count + ultra_count; + cnodes = leaf_count + normal_count + ultra_count + g2_count; switch (peermode) { case NODE_P_LEAF: /* leaf */ case NODE_P_NORMAL: /* normal */ - nodes = (peermode == NODE_P_NORMAL) ? - max_connections : max_ultrapeers; - gm_snprintf(buf, sizeof buf, - NG_("%u/%u connection", "%u/%u connections", cnodes), - cnodes, nodes); + nodes = g2_count + ((peermode == NODE_P_NORMAL) ? + max_connections : max_ultrapeers); + str_bprintf(buf, sizeof buf, + "%u/%uU | %u/%uH", + ultra_count, max_ultrapeers, + g2_count, max_g2); break; case NODE_P_ULTRA: /* ultra */ - nodes = max_connections + max_leaves + max_normal; - gm_snprintf(buf, sizeof buf, - "%u/%uU |%u/%uN | %u/%uL", + nodes = max_connections + max_leaves + max_normal + max_g2; + str_bprintf(buf, sizeof buf, + "%u/%uU | %u/%uH | %u/%uL", ultra_count, max_connections < max_normal ? 0 : max_connections - max_normal, - normal_count, max_normal, + g2_count, max_g2, leaf_count, max_leaves); break; default: @@ -2624,12 +2762,12 @@ guint32 running; (void) unused_prop; - + pg = GTK_PROGRESS_BAR(gui_main_window_lookup("progressbar_uploads")); gnet_prop_get_guint32_val(PROP_UL_REGISTERED, ®istered); gnet_prop_get_guint32_val(PROP_UL_RUNNING, &running); - gm_snprintf(buf, sizeof buf, + str_bprintf(buf, sizeof buf, NG_("%u/%u upload", "%u/%u uploads", registered), running, registered); @@ -2654,7 +2792,7 @@ gnet_prop_get_guint32_val(PROP_DL_ACTIVE_COUNT, &active); gnet_prop_get_guint32_val(PROP_DL_RUNNING_COUNT, &running); - gm_snprintf(buf, sizeof buf, + str_bprintf(buf, sizeof buf, NG_("%u/%u download", "%u/%u downloads", running), active, running); @@ -2674,7 +2812,7 @@ gnet_prop_get_guint32_val(prop, &val); sval = val; - gm_snprintf(buf, sizeof buf, "%c%s", + str_bprintf(buf, sizeof buf, "%c%s", sval < 0 ? '-' : '+', short_time(ABS(sval))); gtk_label_set_text(GTK_LABEL(gui_dlg_prefs_lookup("label_clock_skew")), buf); @@ -3153,6 +3291,14 @@ ), PROP_ENTRY( gui_main_window, + PROP_MAX_G2_HUBS, + update_spinbutton, + TRUE, + "spinbutton_max_g2_hubs", + FREQ_UPDATES, 0 + ), + PROP_ENTRY( + gui_main_window, PROP_QUICK_CONNECT_POOL_SIZE, update_spinbutton, TRUE, @@ -3185,6 +3331,14 @@ ), PROP_ENTRY( gui_main_window, + PROP_NODE_G2_COUNT, + gnet_connections_changed, + TRUE, + NULL, + FREQ_UPDATES, 0 + ), + PROP_ENTRY( + gui_main_window, PROP_UL_RUNNING, uploads_count_changed, TRUE, @@ -5000,7 +5154,7 @@ hosts_in_ultra_catcher_changed, TRUE, "progressbar_hosts_in_ultra_catcher", - FREQ_SECS, 5 + FREQ_SECS, 5 ), PROP_ENTRY( gui_main_window, @@ -5012,6 +5166,14 @@ ), PROP_ENTRY( gui_main_window, + PROP_HOSTS_IN_G2HUB_CATCHER, + hosts_in_g2hub_catcher_changed, + TRUE, + "progressbar_hosts_in_g2hub_catcher", + FREQ_SECS, 5 + ), + PROP_ENTRY( + gui_main_window, PROP_READING_HOSTFILE, reading_hostfile_changed, TRUE, @@ -5044,6 +5206,14 @@ ), PROP_ENTRY( gui_main_window, + PROP_MAX_G2HUB_HOSTS_CACHED, + hostcache_size_changed, + TRUE, + "spinbutton_max_g2hub_hosts_cached", + FREQ_UPDATES, 0 + ), + PROP_ENTRY( + gui_main_window, PROP_MAX_BAD_HOSTS_CACHED, hostcache_size_changed, TRUE, @@ -5484,6 +5654,14 @@ ), PROP_ENTRY( gui_main_window, + PROP_G2_BROWSE_COUNT, + update_label, + TRUE, + "label_g2_browse_count", + FREQ_UPDATES, 0 + ), + PROP_ENTRY( + gui_main_window, PROP_HTML_BROWSE_COUNT, update_label, TRUE, @@ -5500,6 +5678,14 @@ ), PROP_ENTRY( gui_main_window, + PROP_G2_BROWSE_SERVED, + update_label, + TRUE, + "label_g2_browse_served", + FREQ_UPDATES, 0 + ), + PROP_ENTRY( + gui_main_window, PROP_HTML_BROWSE_SERVED, update_label, TRUE, @@ -5525,6 +5711,24 @@ ), PROP_ENTRY( gui_main_window, + PROP_NET_BUFFER_SHORTAGE, + net_buffer_shortage_changed, + TRUE, + "eventbox_net_buffer_shortage", + /* need eventbox because image has no tooltip */ + FREQ_UPDATES, 0 + ), + PROP_ENTRY( + gui_main_window, + PROP_TCP_NO_LISTENING, + tcp_no_listening_changed, + TRUE, + "eventbox_tcp_no_listening", + /* need eventbox because image has no tooltip */ + FREQ_UPDATES, 0 + ), + PROP_ENTRY( + gui_main_window, PROP_UPLOADS_STALLING, uploads_stalling_changed, TRUE, @@ -5619,6 +5823,14 @@ ), PROP_ENTRY( gui_dlg_prefs, + PROP_ENABLE_G2, + update_togglebutton, + TRUE, + "checkbutton_enable_g2", + FREQ_UPDATES, 0 + ), + PROP_ENTRY( + gui_dlg_prefs, PROP_ENABLE_GUESS, update_togglebutton, TRUE, @@ -5651,6 +5863,14 @@ ), PROP_ENTRY( gui_dlg_prefs, + PROP_UPNP_MAPPING_LEASE_TIME, + update_spinbutton, + TRUE, + "spinbutton_config_upnp_mapping_lease_time", + FREQ_UPDATES, 0 + ), + PROP_ENTRY( + gui_dlg_prefs, PROP_ENABLE_UDP, enable_udp_changed, TRUE, @@ -5707,6 +5927,22 @@ ), PROP_ENTRY( gui_main_window, + PROP_SEARCH_DISPLAY_GUESS_STATS, + search_display_guess_stats_changed, + TRUE, + "checkbutton_search_display_guess_stats", + FREQ_UPDATES, 0 + ), + PROP_ENTRY( + gui_main_window, + PROP_GUESS_STATS_SHOW_TOTAL, + search_display_guess_stats_changed, + TRUE, + "checkbutton_guess_stats_show_total", + FREQ_UPDATES, 0 + ), + PROP_ENTRY( + gui_main_window, PROP_SEARCH_DISCARD_SPAM, update_togglebutton, TRUE, @@ -5802,11 +6038,19 @@ FREQ_UPDATES, 0 ), PROP_ENTRY( + gui_dlg_prefs, + PROP_GUESS_MAXIMIZE_BW, + update_togglebutton, + TRUE, + "checkbutton_guess_maximize_bw", + FREQ_UPDATES, 0 + ), + PROP_ENTRY( gui_main_window, PROP_DOWNLOAD_QUEUE_FROZEN, update_queue_frozen, TRUE, - NULL, + NULL, FREQ_UPDATES, 0 ), #ifdef USE_GTK2 @@ -5874,13 +6118,13 @@ if (GUI_PROPERTY(gui_debug) >= 2) { printf("settings_gui_init_prop_map: property_map size: %u\n", - (guint) G_N_ELEMENTS(property_map)); + (guint) N_ITEMS(property_map)); } /* * Fill in automatic fields in property_map. */ - for (n = 0; n < G_N_ELEMENTS(property_map); n++) { + for (n = 0; n < N_ITEMS(property_map); n++) { property_t prop = property_mapn.prop; prop_def_t *def; @@ -5916,7 +6160,7 @@ /* * Now the map is complete and can be processed. */ - for (n = 0; n < G_N_ELEMENTS(property_map); n ++) { + for (n = 0; n < N_ITEMS(property_map); n ++) { property_t prop = property_mapn.prop; prop_def_t *def = property_mapn.stub->get_def(prop); guint32 idx = prop - property_mapn.stub->offset; @@ -5981,7 +6225,7 @@ { guint i; - for (i = 0; i < G_N_ELEMENTS(panes); i++) { + for (i = 0; i < N_ITEMS(panes); i++) { GtkPaned *paned; paned = GTK_PANED(gui_main_window_lookup(panesi.name)); @@ -5995,7 +6239,7 @@ { guint i; - for (i = 0; i < G_N_ELEMENTS(panes); i++) { + for (i = 0; i < N_ITEMS(panes); i++) { GtkPaned *paned; paned = GTK_PANED(gui_main_window_lookup(panesi.name)); @@ -6006,7 +6250,7 @@ } } -G_GNUC_COLD void +void G_COLD settings_gui_init(void) { gint n; @@ -6016,6 +6260,8 @@ tooltips = gtk_tooltips_new(); properties = gui_prop_init(); + sensitive_changes = hikset_create( + offsetof(struct widget_change, name), HASH_KEY_STRING, 0); prop_load_from_file(properties, settings_gui_config_dir(), property_file); @@ -6041,7 +6287,18 @@ #endif /* USE_REMOTE_CTRL */ } -G_GNUC_COLD void +static void G_COLD +sensitive_free_value(void *value, void *unused_data) +{ + struct widget_change *wc = value; + + (void) unused_data; + + cq_cancel(&wc->ev); + WFREE(wc); +} + +void G_COLD settings_gui_shutdown(void) { guint n; @@ -6049,7 +6306,8 @@ /* * Remove the listeners */ - for (n = 0; n < G_N_ELEMENTS(property_map); n ++) { + + for (n = 0; n < N_ITEMS(property_map); n ++) { if (property_mapn.cb != IGNORE_CB) { property_mapn.stub->prop_changed_listener.remove( property_mapn.prop, @@ -6057,20 +6315,26 @@ } } + hikset_foreach(sensitive_changes, sensitive_free_value, NULL); + hikset_free_null(&sensitive_changes); + /* * There are no Gtk signals to listen to, so we must set those * values on exit. */ settings_gui_save_panes(); + /* * Save properties to file */ + prop_save_to_file(properties, settings_gui_config_dir(), property_file); /* * Free allocated memory. */ + gui_prop_shutdown(); G_FREE_NULL(home_dir);
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/settings_cb.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/settings_cb.c
Changed
@@ -34,6 +34,10 @@ #include "gui.h" +#ifdef USE_GTK2 +#include "gtk2/column_sort.h" +#endif + #include "misc.h" #include "settings_cb.h" #include "settings.h" @@ -44,6 +48,8 @@ #include "if/bridge/ui2c.h" #include "lib/glib-missing.h" /* For g_strlcpy() */ +#include "lib/halloc.h" +#include "lib/pslist.h" #include "lib/str.h" #include "lib/override.h" /* Must be the last header included */ @@ -153,7 +159,8 @@ GtkTreeModel *model; GtkTreeIter iter; GtkTreeSelection *selection; - str_t *s; + pslist_t *sl, *pl_dirs = NULL; + char *dirs; (void) unused_button; (void) unused_udata; @@ -166,24 +173,26 @@ /* Regenerate the string property holding a list of paths */ selection = gtk_tree_view_get_selection(tv); - s = str_new(0); do { - gchar *dir = NULL; + char *pathname = NULL; /* Skip items selected for removal */ if (gtk_tree_selection_iter_is_selected(selection, &iter)) continue; - gtk_tree_model_get(model, &iter, 0, &dir, (-1)); - if (str_len(s) > 0) - str_putc(s, ':'); - str_cat(s, dir); - G_FREE_NULL(dir); + gtk_tree_model_get(model, &iter, 0, &pathname, (-1)); + pl_dirs = pslist_prepend(pl_dirs, pathname); } while (gtk_tree_model_iter_next(model, &iter)); - gnet_prop_set_string(PROP_SHARED_DIRS_PATHS, str_2c(s)); - str_destroy(s); + dirs = dirlist_to_string(pl_dirs); + gnet_prop_set_string(PROP_SHARED_DIRS_PATHS, dirs); + HFREE_NULL(dirs); + + PSLIST_FOREACH(pl_dirs, sl) { + G_FREE_NULL(sl->data); + } + pslist_free_null(&pl_dirs); } #endif /* USE_GTK2 */ @@ -348,7 +357,7 @@ gchar *text = STRTRACK(gtk_editable_get_chars(editable, 0, -1)); (void) unused_udata; - + g_strstrip(text); gtk_widget_set_sensitive( gui_dlg_prefs_lookup("checkbutton_give_server_hostname"), @@ -358,19 +367,21 @@ enum dbg_cols { dbg_col_saved = 0, + dbg_col_internal, dbg_col_type, dbg_col_name, dbg_col_value, - -#ifdef USE_GTK2 + +#ifdef USE_GTK2 dbg_col_property, #endif /* USE_GTK2 */ - + num_dbg_cols }; #ifdef USE_GTK2 static tree_view_motion_t *tvm_dbg_property; +static struct sorting_context dbg_column_sort; static void update_tooltip(GtkTreeView *tv, GtkTreePath *path) @@ -460,7 +471,8 @@ u = 0; gtk_tree_model_get(model, &iter, dbg_col_property, &u, (-1)); prop = (property_t) u; - gnet_prop_set_from_string(prop, text); + if (!gnet_prop_is_internal(prop)) + gnet_prop_set_from_string(prop, text); gtk_list_store_set(GTK_LIST_STORE(model), &iter, dbg_col_value, gnet_prop_to_string(prop), (-1)); @@ -522,7 +534,7 @@ } else { text = _("<no property selected>"); } - + widget = gui_dlg_prefs_lookup("label_dbg_property_default"); gtk_label_set_text(GTK_LABEL(widget), text); } @@ -536,6 +548,36 @@ } static void +on_dbg_column_clicked(GtkTreeViewColumn *column, void *udata) +{ + (void) udata; + + column_sort_tristate(column, &dbg_column_sort); +} + +static inline const char * +dbg_get_data(GtkTreeModel *model, GtkTreeIter *iter, gint column) +{ + GValue value; + + ZERO(&value); + gtk_tree_model_get_value(model, iter, column, &value); + return g_value_get_string(&value); +} + +static gint +dbg_column_cmp( + GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer col) +{ + const char *sa, *sb; + gint column = pointer_to_int(col); + + sa = dbg_get_data(model, a, column); + sb = dbg_get_data(model, b, column); + return strcmp(sa, sb); +} + +static void dbg_tree_init(void) { static const struct { @@ -545,6 +587,7 @@ const enum dbg_cols id; } columns = { { N_("Saved"), 0, FALSE, dbg_col_saved }, + { N_("Internal"), 0, FALSE, dbg_col_internal }, { N_("Type"), 0, FALSE, dbg_col_type }, { N_("Property"), 0, FALSE, dbg_col_name }, { N_("Value"), 200, TRUE, dbg_col_value }, @@ -554,20 +597,21 @@ GtkTreeView *tv; guint i; - STATIC_ASSERT(G_N_ELEMENTS(columns) == (guint) num_dbg_cols); - + STATIC_ASSERT(N_ITEMS(columns) == (guint) num_dbg_cols); + tv = GTK_TREE_VIEW(gui_dlg_prefs_lookup("treeview_dbg_property")); - store = GTK_LIST_STORE(gtk_list_store_new(G_N_ELEMENTS(columns), + store = GTK_LIST_STORE(gtk_list_store_new(N_ITEMS(columns), + G_TYPE_STRING, /* Saved? */ + G_TYPE_STRING, /* Internal? */ G_TYPE_STRING, /* Type */ G_TYPE_STRING, /* Name */ G_TYPE_STRING, /* Value */ - G_TYPE_STRING, /* Persistent */ G_TYPE_UINT)); /* property_t */ gtk_tree_view_set_model(tv, GTK_TREE_MODEL(store)); g_object_unref(store); - for (i = 0; i < G_N_ELEMENTS(columns); i++) { + for (i = 0; i < N_ITEMS(columns); i++) { GtkTreeViewColumn *column; GtkCellRenderer *renderer; @@ -581,39 +625,45 @@ gui_signal_connect(renderer, "edited", on_cell_edited, NULL); g_object_set(renderer, "editable", TRUE, - (void *) 0); + NULL_PTR); } column = gtk_tree_view_column_new_with_attributes( _(columnsi.title), renderer, "text", i, - (void *) 0); + NULL_PTR); g_object_set(renderer, "xalign", 0.0, "xpad", GUI_CELL_RENDERER_XPAD, "ypad", GUI_CELL_RENDERER_YPAD, - (void *) 0); + NULL_PTR); g_object_set(column, "min-width", 1, "resizable", TRUE, "reorderable", FALSE, - (void *) 0); - + NULL_PTR); + if (columnsi.width) { g_object_set(column, "fixed-width", columnsi.width, "sizing", GTK_TREE_VIEW_COLUMN_FIXED, - (void *) 0); + NULL_PTR); } else { g_object_set(column, "sizing", GTK_TREE_VIEW_COLUMN_AUTOSIZE, - (void *) 0); + NULL_PTR); } - + gtk_tree_view_column_set_sort_column_id(column, i); gtk_tree_view_append_column(tv, column); + + gtk_tree_sortable_set_sort_func( + GTK_TREE_SORTABLE(gtk_tree_view_get_model(tv)), + i, dbg_column_cmp, uint_to_pointer(i), NULL); + + column_sort_tristate_register(column, on_dbg_column_clicked, NULL); } gui_signal_connect(tv, "enter-notify-event", on_enter_notify, tv); @@ -621,24 +671,24 @@ gui_signal_connect(tv, "cursor-changed", on_cursor_changed, tv); } -void -dbg_property_show_list(const GSList *props) +static void +dbg_property_show_list(const pslist_t *props) { - const GSList *sl; + const pslist_t *sl; GtkTreeView *tv; GtkListStore *store; - + tv = GTK_TREE_VIEW(gui_dlg_prefs_lookup("treeview_dbg_property")); if (!gtk_tree_view_get_model(tv)) dbg_tree_init(); - + store = GTK_LIST_STORE(gtk_tree_view_get_model(tv)); gtk_list_store_clear(store); if (!props) { const gchar *text = _("<no property selected>"); GtkWidget *widget; - + widget = gui_dlg_prefs_lookup("label_dbg_property_limits"); gtk_label_set_text(GTK_LABEL(widget), text); /* Gtk+ 2.x has editable column cells */ @@ -656,7 +706,7 @@ #endif /* USE_GTK2 */ } - for (sl = props; NULL != sl; sl = g_slist_next(sl)) { + PSLIST_FOREACH(props, sl) { GtkTreeIter iter; property_t prop; @@ -664,11 +714,12 @@ gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, - dbg_col_saved, gnet_prop_is_saved(prop) ? _("Yes") : _("No"), - dbg_col_type, gnet_prop_type_to_string(prop), - dbg_col_name, gnet_prop_name(prop), - dbg_col_value, gnet_prop_to_string(prop), - dbg_col_property, (guint) prop, + dbg_col_saved, gnet_prop_is_saved(prop) ? _("Yes") : _("No"), + dbg_col_internal, gnet_prop_is_internal(prop) ? _("Yes") : _("No"), + dbg_col_type, gnet_prop_type_to_string(prop), + dbg_col_name, gnet_prop_name(prop), + dbg_col_value, gnet_prop_to_string(prop), + dbg_col_property, (guint) prop, (-1)); } } @@ -729,6 +780,9 @@ case dbg_col_saved: text = gnet_prop_is_saved(prop) ? _("Yes") : _("No"); break; + case dbg_col_internal: + text = gnet_prop_is_internal(prop) ? _("Yes") : _("No"); + break; case dbg_col_type: text = gnet_prop_type_to_string(prop); break; @@ -748,22 +802,23 @@ } static void -dbg_property_show_list(const GSList *props) +dbg_property_show_list(const pslist_t *props) { GtkCList *clist; - const GSList *sl; + const pslist_t *sl; clist = GTK_CLIST(gui_dlg_prefs_lookup("clist_dbg_property")); gtk_clist_freeze(clist); gtk_clist_clear(clist); - for (sl = props; NULL != sl; sl = g_slist_next(sl)) { - static const gchar * const titlesnum_dbg_cols = { "", "", "", "", }; + PSLIST_FOREACH(props, sl) { + static const char * const titlesnum_dbg_cols = + { "", "", "", "", "", }; property_t prop = GPOINTER_TO_UINT(sl->data); gint row; - + row = gtk_clist_append(clist, deconstify_gpointer(titles)); - dbg_property_set_row(clist, row, prop); + dbg_property_set_row(clist, row, prop); } gtk_clist_sort(clist); gtk_clist_columns_autosize(clist); @@ -785,12 +840,15 @@ property_t prop; gint row; - text = STRTRACK(gtk_editable_get_chars(editable, 0, -1)); row = GPOINTER_TO_INT(clist->selection->data); prop = GPOINTER_TO_UINT(gtk_clist_get_row_data(clist, row)); - gnet_prop_set_from_string(prop, text); - dbg_property_set_row(clist, row, prop); - G_FREE_NULL(text); + + if (!gnet_prop_is_internal(prop)) { + char *text = STRTRACK(gtk_editable_get_chars(editable, 0, -1)); + gnet_prop_set_from_string(prop, text); + dbg_property_set_row(clist, row, prop); + G_FREE_NULL(text); + } } } @@ -809,7 +867,7 @@ } static gboolean dbg_property_cmp_name_inverted = TRUE; -static gint +static gint dbg_property_cmp_name(GtkCList *unused_clist, gconstpointer ptr1, gconstpointer ptr2) { @@ -823,7 +881,7 @@ } static gboolean dbg_property_cmp_type_inverted = TRUE; -static gint +static gint dbg_property_cmp_type(GtkCList *unused_clist, gconstpointer ptr1, gconstpointer ptr2) { @@ -837,7 +895,7 @@ } static gboolean dbg_property_cmp_saved_inverted = TRUE; -static gint +static gint dbg_property_cmp_saved(GtkCList *unused_clist, gconstpointer ptr1, gconstpointer ptr2) { @@ -856,7 +914,7 @@ gpointer unused_udata) { gboolean do_sort = FALSE; - + (void) unused_udata; g_assert(column >= 0 && column < num_dbg_cols); @@ -883,7 +941,7 @@ case num_dbg_cols: g_assert_not_reached(); } - + if (do_sort) gtk_clist_sort(clist); } @@ -905,17 +963,17 @@ g_strstrip(text); if (0 != strcmp(text, old_pattern)) { - GSList *props; + pslist_t *props; g_strlcpy(old_pattern, text, sizeof old_pattern); props = gnet_prop_get_by_regex(text, NULL); if (!props) statusbar_gui_warning(10, _("No property name matches the pattern \"%s\"."), text); - + dbg_property_show_list(props); dbg_property_update_selection(); - gm_slist_free_null(&props); + pslist_free_null(&props); } G_FREE_NULL(text); } @@ -941,7 +999,7 @@ * visibility status changes. */ #ifdef USE_GTK1 - { + { GtkPaned *paned; gboolean sidebar;
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/statusbar.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/statusbar.c
Changed
@@ -42,6 +42,7 @@ #include "lib/halloc.h" #include "lib/misc.h" #include "lib/product.h" +#include "lib/str.h" #include "lib/tm.h" #include "lib/override.h" /* Must be the last header included */ @@ -114,7 +115,7 @@ gdk_beep(); /* FALL THRU */ case SB_MESSAGE: - gm_vsnprintf(buf, sizeof(buf), format, args); + str_vbprintf(buf, sizeof(buf), format, args); break; } } else { @@ -152,7 +153,7 @@ } /** - * Put an informational message on the statusbar. The message will be + * Put an informational message on the statusbar. The message will be * displayed for the number of seconds given by timeout. If timeout is 0 * the message will not be automatically removed. * @@ -202,10 +203,10 @@ HFREE_NULL(statbar_botstr_new); if (format != NULL) { - gm_vsnprintf(buf, sizeof(buf), format, args); + str_vbprintf(buf, sizeof(buf), format, args); statbar_botstr_new = h_strdup(buf); } else { - statbar_botstr_new = h_strdup(product_get_website()); + statbar_botstr_new = h_strdup(product_website()); } va_end(args); @@ -298,7 +299,7 @@ } } -G_GNUC_COLD void +void G_COLD statusbar_gui_init(void) { GtkStatusbar *sb; @@ -324,7 +325,7 @@ * --RAM, 27/06/2002 */ - statbar_botstr = h_strdup(product_get_website()); + statbar_botstr = h_strdup(product_website()); statusbar_gui_push(SB_MESSAGE, scid_bottom, 0, "%s", statbar_botstr); main_gui_add_timer(statusbar_gui_clear_timeouts);
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/statusbar.h -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/statusbar.h
Changed
@@ -35,7 +35,7 @@ void statusbar_gui_init(void); void statusbar_gui_shutdown(void); -void statusbar_gui_set_default(const gchar *, ...) G_GNUC_PRINTF(1, 2); +void statusbar_gui_set_default(const gchar *, ...) G_PRINTF(1, 2); void statusbar_gui_remove(statusbar_msgid_t); #endif /* _gtk_statusbar_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/upload_stats.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/upload_stats.c
Changed
@@ -36,18 +36,18 @@ #include "upload_stats.h" #include "notebooks.h" -#include "lib/glib-missing.h" +#include "lib/hset.h" #include "lib/override.h" /* Must be the last header included */ #define UPDATE_MIN 60 /**< Update screen every minute at least */ #define UPDATE_LOOKING 5 /**< Every 5 seconds when they're looking */ /** - * This table holds all the pending updates, which are buffered and + * This set holds all the pending updates, which are buffered and * displayed only periodically, to avoid too frequent updates of the GUI * structures, and costly operations when the columns are sorted. */ -static GHashTable *pending; +static hset_t *pending; static gboolean upload_stats_gui_is_visible(void) @@ -68,17 +68,30 @@ * is being passed for a given upload. */ - if (!g_hash_table_lookup(pending, us)) - g_hash_table_insert(pending, us, GINT_TO_POINTER(1)); + hset_insert(pending, us); } -static gboolean -upload_stats_update_model(gpointer key, gpointer uvalue, gpointer udata) +/** + * Clear statistics. + */ +void +upload_stats_gui_clear_all(void) +{ + /* + * After clearing the model we also forget about all pending updates since + * the core will free up all the "ul_stats" structures. + */ + + upload_stats_gui_clear_model(); + hset_clear(pending); +} + +static bool +upload_stats_update_model(const void *key, void *udata) { - (void) uvalue; (void) udata; - upload_stats_gui_update_model(key); + upload_stats_gui_update_model(deconstify_pointer(key)); return TRUE; } @@ -100,7 +113,7 @@ if (delta >= threshold) { last_update = now; upload_stats_gui_freeze(); - g_hash_table_foreach_remove(pending, upload_stats_update_model, NULL); + hset_foreach_remove(pending, upload_stats_update_model, NULL); upload_stats_gui_thaw(); } } @@ -114,14 +127,14 @@ void upload_stats_common_gui_init(void) { - pending = g_hash_table_new(NULL, NULL); + pending = hset_create(HASH_KEY_SELF, 0); main_gui_add_timer(upload_stats_common_gui_timer); } void upload_stats_common_gui_shutdown(void) { - gm_hash_table_destroy_null(&pending); + hset_free_null(&pending); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/upload_stats.h -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/upload_stats.h
Changed
@@ -30,6 +30,7 @@ void upload_stats_gui_shutdown(void); void upload_stats_common_gui_init(void); void upload_stats_common_gui_shutdown(void); +void upload_stats_gui_clear_model(); void upload_stats_gui_update_model(struct ul_stats *us);
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/uploads_cb.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/uploads_cb.c
Changed
@@ -163,7 +163,7 @@ (void) unused_menuitem; (void) unused_udata; - + clist = GTK_CLIST(gui_main_window_lookup("clist_uploads")); sl = clist_collect_data(clist, FALSE, NULL); @@ -240,7 +240,7 @@ (void) unused_menuitem; (void) unused_udata; - + treeview = GTK_TREE_VIEW(gui_main_window_lookup("treeview_uploads")); selection = gtk_tree_view_get_selection(treeview); gtk_tree_selection_selected_foreach(selection, uploads_func_helper,
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/uploads_common.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/uploads_common.c
Changed
@@ -36,9 +36,10 @@ #include "lib/concat.h" #include "lib/host_addr.h" -#include "lib/glib-missing.h" /* For gm_snprintf() */ -#include "lib/tm.h" +#include "lib/str.h" #include "lib/stringify.h" +#include "lib/tm.h" + #include "lib/override.h" /* Must be the last header included */ #define IO_STALLED 60 /**< If nothing exchanged after that many secs */ @@ -109,7 +110,7 @@ filesize_t requested = data->range_end - data->range_start + 1; size_t rw; - rw = gm_snprintf(tmpstr, sizeof(tmpstr), + rw = str_bprintf(tmpstr, sizeof(tmpstr), "%s (%s) %s %s#%u", _("Completed"), d > 0 ? short_rate(requested / d, show_metric_units()) : _("< 1s"), @@ -118,7 +119,7 @@ u->reqnum); if (u->error_count) - rw += gm_snprintf(&tmpstrrw, sizeof(tmpstr)-rw, + rw += str_bprintf(&tmpstrrw, sizeof(tmpstr)-rw, _(" E=%u"), u->error_count); } break; @@ -133,8 +134,8 @@ gchar pbuf32; size_t rw; - gm_snprintf(pbuf, sizeof pbuf, "%5.02f%% ", p * 100.0); - rw = gm_snprintf(tmpstr, sizeof tmpstr, _("%s(%s) TR: %s %s#%u"), + str_bprintf(pbuf, sizeof pbuf, "%5.02f%% ", p * 100.0); + rw = str_bprintf(tmpstr, sizeof tmpstr, _("%s(%s) TR: %s %s#%u"), p > 1.0 ? pbuf : "", stalled ? _("stalled") : short_rate(u->bps, show_metric_units()), @@ -143,7 +144,7 @@ u->reqnum); if (u->error_count) - rw += gm_snprintf(&tmpstrrw, sizeof(tmpstr)-rw, + rw += str_bprintf(&tmpstrrw, sizeof(tmpstr)-rw, _(" E=%u"), u->error_count); } break; @@ -153,11 +154,11 @@ case GTA_UL_EXPECTING: if (u->error_count) - gm_snprintf(tmpstr, sizeof(tmpstr), + str_bprintf(tmpstr, sizeof(tmpstr), _("%s %s#%u E=%u"), _("Waiting for further request..."), u->parq_quick ? _("(quick) ") : "", u->reqnum, u->error_count); else - gm_snprintf(tmpstr, sizeof(tmpstr), + str_bprintf(tmpstr, sizeof(tmpstr), "%s %s#%u", _("Waiting for further request..."), u->parq_quick ? _("(quick) ") : "", u->reqnum); break; @@ -196,13 +197,13 @@ queued = u->parq_position > available; if (u->parq_retry > 0) { - gm_snprintf(tbuf, sizeof tbuf, + str_bprintf(tbuf, sizeof tbuf, " %s,", short_time(u->parq_retry)); } else { tbuf0 = '\0'; } - rw = gm_snprintf(tmpstr, sizeof tmpstr, + rw = str_bprintf(tmpstr, sizeof tmpstr, _("%s %d (slot %d/%d)%s %s %s"), u->parq_frozen ? _("Frozen") : queued ? _("Queued") : _("Waiting"), @@ -214,7 +215,7 @@ short_time(u->parq_lifetime)); if (u->error_count) - rw += gm_snprintf(&tmpstrrw, sizeof(tmpstr)-rw, + rw += str_bprintf(&tmpstrrw, sizeof(tmpstr)-rw, _(" E=%u"), u->error_count); } break; @@ -290,7 +291,7 @@ /** * @return A pointer to a static buffer holding the host address as string. */ -const gchar * +const gchar * uploads_gui_host_string(const gnet_upload_info_t *u) { static gchar buf1024; @@ -304,11 +305,11 @@ concat_strings(buf, sizeof buf, host_addr_to_string(u->addr), - u->encrypted ? " (E) " : " ", + u->encrypted ? (u->tls_upgraded ? " (e) " : " (E) ") : " ", peer ? " <" : "", peer ? peer : "", peer ? ">" : "", - (void *) 0); + NULL_PTR); return buf; }
View file
gtk-gnutella-0.98.2.tar.bz2/src/ui/gtk/visual_progress.c -> gtk-gnutella-1.1.9.tar.bz2/src/ui/gtk/visual_progress.c
Changed
@@ -31,7 +31,7 @@ * * @todo Make colors into properties so that they can be stored in config, * should keep hardcoded backups. - * @todo Add progress data also to fileinfo table, so that the info is shown + * @todo Add progress data also to fileinfo table, so that the info is shown * for all current files. * @todo Do not redraw the bar too often, only on event for actual file and * perhaps max once a second. @@ -43,15 +43,17 @@ #include "gui.h" #include "visual_progress.h" +#include "downloads_common.h" /* For fi_gui_fi_status_changed() */ -#include "if/core/http.h" #include "if/gui_property_priv.h" #include "if/bridge/ui2c.h" #include "lib/atoms.h" -#include "lib/glib-missing.h" +#include "lib/htable.h" +#include "lib/http_range.h" #include "lib/stringify.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ /** The height of the indicator arrows in visual progress */ @@ -82,7 +84,7 @@ filesize_t done_initial; } vp_info_t; -static GHashTable *vp_info_hash; /**< Hash table with our cached fileinfo info */ +static htable_t *vp_info_hash; /**< Hash table with our cached fileinfo info */ static struct { GdkColor base; /**< Theme-defined background color */ @@ -191,12 +193,12 @@ points2.y = 0; gdk_gc_set_foreground(v->context->gc, &colors.arrow); gdk_draw_polygon(v->context->drawable, v->context->gc, - TRUE, points, G_N_ELEMENTS(points)); + TRUE, points, N_ITEMS(points)); /* Draw a black border around the arrow */ gdk_gc_set_foreground(v->context->gc, &colors.black); gdk_draw_polygon(v->context->drawable, v->context->gc, - FALSE, points, G_N_ELEMENTS(points)); + FALSE, points, N_ITEMS(points)); } /** @@ -256,8 +258,8 @@ if (valid) { gpointer value; - found = g_hash_table_lookup_extended(vp_info_hash, - GUINT_TO_POINTER(fih), NULL, &value); + found = htable_lookup_extended(vp_info_hash, + uint_to_pointer(fih), NULL, &value); g_return_if_fail(found); g_assert(value); @@ -386,7 +388,7 @@ new_vp_info->chunks_initial = vp_get_chunks_initial(fih); new_vp_info->done_initial = s.done; - g_hash_table_insert(vp_info_hash, GUINT_TO_POINTER(fih), new_vp_info); + htable_insert(vp_info_hash, uint_to_pointer(fih), new_vp_info); guc_fi_free_info(fi); } @@ -398,7 +400,7 @@ if (*v_ptr) { vp_info_t *v = *v_ptr; - + guc_fi_free_chunks(v->chunks_list); guc_fi_free_chunks(v->chunks_initial); guc_fi_free_ranges(v->ranges_list); @@ -420,13 +422,13 @@ gboolean found; vp_info_t *v; - found = g_hash_table_lookup_extended(vp_info_hash, - GUINT_TO_POINTER(fih), NULL, &value); + found = htable_lookup_extended(vp_info_hash, + uint_to_pointer(fih), NULL, &value); g_return_if_fail(found); g_assert(value); v = value; - g_hash_table_remove(vp_info_hash, GUINT_TO_POINTER(fih)); + htable_remove(vp_info_hash, uint_to_pointer(fih)); vp_info_free(&v); /* Forget the fileinfo handle for which we displayed progress info */ @@ -538,8 +540,8 @@ gnet_fi_info_t *fi; gnet_fi_status_t s; - found = g_hash_table_lookup_extended(vp_info_hash, - GUINT_TO_POINTER(fih), NULL, &value); + found = htable_lookup_extended(vp_info_hash, + uint_to_pointer(fih), NULL, &value); g_return_if_fail(found); g_assert(value); v = value; @@ -736,8 +738,8 @@ gboolean found; gpointer value; - found = g_hash_table_lookup_extended(vp_info_hash, - GUINT_TO_POINTER(fih), NULL, &value); + found = htable_lookup_extended(vp_info_hash, + uint_to_pointer(fih), NULL, &value); g_return_if_fail(found); g_assert(value); v = value; @@ -748,14 +750,16 @@ */ guc_fi_free_ranges(v->ranges_list); v->ranges_list = guc_fi_get_ranges(fih); + + fi_gui_fi_status_changed(fih); /* Enqueue re-drawing event */ } /** * Free the vp_info_t structs in the vp_info_hash. */ -void -vp_free_key_value(gpointer key, gpointer value, gpointer user_data) +static void +vp_free_key_value(const void *key, void *value, void *user_data) { vp_info_t *v = value; @@ -772,12 +776,12 @@ * notified of fileinfo events, and get a permanent handle to the * drawing area for later reuse. */ -G_GNUC_COLD void +void G_COLD vp_gui_init(void) { GdkColormap *cmap; - vp_info_hash = g_hash_table_new(NULL, NULL); + vp_info_hash = htable_create(HASH_KEY_SELF, 0); guc_fi_add_listener(vp_gui_fi_added, EV_FI_ADDED, FREQ_SECS, 0); @@ -818,7 +822,7 @@ /** * Undo everything set up in vp_gui_init. */ -G_GNUC_COLD void +void G_COLD vp_gui_shutdown(void) { guc_fi_remove_listener(vp_gui_fi_removed, EV_FI_REMOVED); @@ -828,8 +832,8 @@ EV_FI_STATUS_CHANGED_TRANSIENT); guc_fi_remove_listener(vp_gui_fi_ranges_changed, EV_FI_RANGES_CHANGED); - g_hash_table_foreach(vp_info_hash, vp_free_key_value, NULL); - gm_hash_table_destroy_null(&vp_info_hash); + htable_foreach(vp_info_hash, vp_free_key_value, NULL); + htable_free_null(&vp_info_hash); } /*
View file
gtk-gnutella-0.98.2.tar.bz2/src/upnp/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/src/upnp/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-91 -: $X-Id: Jmake.tmpl 69 2011-01-09 13:57:07Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -39,7 +39,7 @@ AR = ar rc CC = $cc CTAGS = ctags -JCFLAGS = \$(CFLAGS) $optimize $ccflags $large +JCFLAGS = \$(CFLAGS) $optimize $pthread $ccflags $large JCPPFLAGS = $cppflags MKDEP = $mkdep \$(DPFLAGS) \$(JCPPFLAGS) -- MV = $mv @@ -66,7 +66,7 @@ $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 64 2011-01-01 21:57:17Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Force 'make depend' to be performed first -- do not edit @@ -159,6 +159,11 @@ $(RM) Makefile config.sh install:: local_install + @exit 0 + +install-strip:: local_install-strip + @exit 0 + install.man:: maybe_install.man deinstall:: local_deinstall deinstall.man:: maybe_deinstall.man @@ -197,6 +202,9 @@ local_install:: @echo "install in $(CURRENT) done." +local_install-strip:: + @echo "install (strip) in $(CURRENT) done." + local_deinstall:: @echo "deinstall in $(CURRENT) done."
View file
gtk-gnutella-0.98.2.tar.bz2/src/upnp/control.c -> gtk-gnutella-1.1.9.tar.bz2/src/upnp/control.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Raphael Manfredi + * Copyright (c) 2010, 2012 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,7 +28,7 @@ * UPnP service control. * * @author Raphael Manfredi - * @date 2010 + * @date 2010, 2012 */ #include "common.h" @@ -46,7 +46,6 @@ #include "xml/xfmt.h" #include "lib/atoms.h" -#include "lib/glib-missing.h" #include "lib/nv.h" #include "lib/parse.h" #include "lib/str.h" @@ -136,9 +135,10 @@ /** * Is XML node name matching? */ -static gboolean -node_named_as(const xnode_t *xn, void *data) +static bool +node_named_as(const void *node, void *data) { + const xnode_t *xn = node; const char *name = xnode_element_name(xn); return (name != NULL) ? 0 == strcmp(name, cast_to_char_ptr(data)) : FALSE; @@ -157,7 +157,7 @@ * * @return TRUE if OK, FALSE on error. */ -static gboolean +static bool upnp_ctrl_extract_fault(xnode_t *fault, int *code, const char **error) { xnode_t *fcode, *fstring, *detail, *uerror; @@ -190,7 +190,7 @@ */ fcode = xnode_tree_find_depth(fault, 1, node_named_as, - deconstify_gchar(SOAP_FAULT_CODE)); + deconstify_char(SOAP_FAULT_CODE)); if (NULL == fcode) { parse_error = "cannot find <faultcode>"; @@ -242,7 +242,7 @@ */ fstring = xnode_tree_find_depth(fault, 1, node_named_as, - deconstify_gchar(SOAP_FAULT_STRING)); + deconstify_char(SOAP_FAULT_STRING)); if (NULL == fstring) { parse_error = "no <faultstring> found"; @@ -263,7 +263,7 @@ } detail = xnode_tree_find_depth(fault, 1, node_named_as, - deconstify_gchar(SOAP_FAULT_DETAIL)); + deconstify_char(SOAP_FAULT_DETAIL)); if (NULL == detail) { parse_error = "no <detail> found"; @@ -283,7 +283,7 @@ int err; xn = xnode_tree_find_depth(uerror, 1, - node_named_as, deconstify_gchar(UPNP_ERROR_CODE)); + node_named_as, deconstify_char(UPNP_ERROR_CODE)); if (NULL == xn) { parse_error = "no <errorCode> found"; @@ -305,7 +305,7 @@ if (error != NULL) { xn = xnode_tree_find_depth(uerror, 1, - node_named_as, deconstify_gchar(UPNP_ERROR_DESC)); + node_named_as, deconstify_char(UPNP_ERROR_DESC)); *error = (NULL == xn) ? NULL : xnode_first_text(xn); } @@ -487,7 +487,7 @@ } if (ucd->cb != NULL) - (*ucd->cb)(code, NULL, 0, ucd->cb_arg); + (*ucd->cb)(code, NULL, 0, ucd->cb_arg); upnp_ctrl_free(ucd); } @@ -499,7 +499,7 @@ * @param callback whether to invoke the completion callback */ void -upnp_ctrl_cancel(upnp_ctrl_t *ucd, gboolean callback) +upnp_ctrl_cancel(upnp_ctrl_t *ucd, bool callback) { upnp_ctrl_check(ucd); g_return_if_fail(ucd->sr != NULL); @@ -521,7 +521,7 @@ * nullify the control request pointer. */ void -upnp_ctrl_cancel_null(upnp_ctrl_t **ucd_ptr, gboolean callback) +upnp_ctrl_cancel_null(upnp_ctrl_t **ucd_ptr, bool callback) { upnp_ctrl_t *ucd = *ucd_ptr; @@ -592,8 +592,8 @@ { char ns256; - - gm_snprintf(ns, sizeof ns, "%s%s:%u", + + str_bprintf(ns, sizeof ns, "%s%s:%u", UPNP_NS_BASE, upnp_service_type_to_string(upnp_service_type(usd)), upnp_service_version(usd)); @@ -633,7 +633,7 @@ { char action_uri256; - guint32 options = SOAP_RPC_O_MAN_RETRY | SOAP_RPC_O_ALL_CAPS; + uint32 options = SOAP_RPC_O_MAN_RETRY | SOAP_RPC_O_ALL_CAPS; /* * Grab our local IP address if it is unknown so far. @@ -642,7 +642,7 @@ if (host_addr_net(upnp_get_local_addr()) == NET_TYPE_NONE) options |= SOAP_RPC_O_LOCAL_ADDR; - gm_snprintf(action_uri, sizeof action_uri, "%s#%s", + str_bprintf(action_uri, sizeof action_uri, "%s#%s", xnode_element_ns(root), action); ucd->action = atom_str_get(action_uri); @@ -688,11 +688,11 @@ * * @return TRUE if OK with the address filled in, FALSE on failure. */ -static gboolean +static bool upnp_ctrl_get_addr(nv_table_t *nvt, const char *name, host_addr_t *addrp) { const char *ip; - + ip = nv_table_lookup_str(nvt, name); if (NULL == ip) return FALSE; @@ -709,11 +709,11 @@ * * @return TRUE if OK with the value filled in, FALSE on failure. */ -static gboolean -upnp_ctrl_get_uint16(nv_table_t *nvt, const char *name, guint16 *valp) +static bool +upnp_ctrl_get_uint16(nv_table_t *nvt, const char *name, uint16 *valp) { const char *value; - guint16 val; + uint16 val; int error; value = nv_table_lookup_str(nvt, name); @@ -737,11 +737,11 @@ * * @return TRUE if OK with the value filled in, FALSE on failure. */ -static gboolean -upnp_ctrl_get_uint32(nv_table_t *nvt, const char *name, guint32 *valp) +static bool +upnp_ctrl_get_uint32(nv_table_t *nvt, const char *name, uint32 *valp) { const char *value; - guint32 val; + uint32 val; int error; value = nv_table_lookup_str(nvt, name); @@ -765,10 +765,10 @@ * * @return TRUE if OK with the value filled in, FALSE on failure. */ -static gboolean +static bool upnp_ctrl_get_time_delta(nv_table_t *nvt, const char *name, time_delta_t *valp) { - guint32 val; + uint32 val; if (upnp_ctrl_get_uint32(nvt, name, &val)) { *valp = val; @@ -787,11 +787,11 @@ * * @return TRUE if OK with the boolean filled in, FALSE on failure. */ -static gboolean -upnp_ctrl_get_boolean(nv_table_t *nvt, const char *name, gboolean *valp) +static bool +upnp_ctrl_get_boolean(nv_table_t *nvt, const char *name, bool *valp) { const char *value; - gboolean val; + bool val; value = nv_table_lookup_str(nvt, name); if (NULL == value) @@ -922,8 +922,8 @@ { struct upnp_GetSpecificPortMappingEntry *r; host_addr_t addr; - guint16 port; - gboolean enabled; + uint16 port; + bool enabled; const char *description; time_delta_t lease; @@ -973,7 +973,7 @@ */ upnp_ctrl_t * upnp_ctrl_GetSpecificPortMappingEntry(const upnp_service_t *usd, - enum upnp_map_proto proto, guint16 port, + enum upnp_map_proto proto, uint16 port, upnp_ctrl_cb_t cb, void *arg) { nv_pair_t *argv3; @@ -988,7 +988,7 @@ argv2 = nv_pair_make_static_str(ARG_PROTOCOL, protocol); return upnp_ctrl_launch(usd, "GetSpecificPortMappingEntry", - argv, G_N_ELEMENTS(argv), cb, arg, + argv, N_ITEMS(argv), cb, arg, upnp_ctrl_ret_GetSpecificPortMappingEntry); } @@ -1010,8 +1010,8 @@ */ upnp_ctrl_t * upnp_ctrl_AddPortMapping(const upnp_service_t *usd, - enum upnp_map_proto proto, guint16 ext_port, - host_addr_t int_addr, guint16 int_port, + enum upnp_map_proto proto, uint16 ext_port, + host_addr_t int_addr, uint16 int_port, const char *desc, time_delta_t lease, upnp_ctrl_cb_t cb, void *arg) { @@ -1024,7 +1024,7 @@ const char *description; g_assert(lease >= 0); - g_assert(lease <= MAX_INT_VAL(gint32)); + g_assert(lease <= MAX_INT_VAL(int32)); g_assert(ext_port != 0); g_assert(int_port != 0); @@ -1058,7 +1058,7 @@ */ return upnp_ctrl_launch(usd, "AddPortMapping", - argv, G_N_ELEMENTS(argv), cb, arg, + argv, N_ITEMS(argv), cb, arg, NULL); } @@ -1076,7 +1076,7 @@ */ upnp_ctrl_t * upnp_ctrl_DeletePortMapping(const upnp_service_t *usd, - enum upnp_map_proto proto, guint16 port, + enum upnp_map_proto proto, uint16 port, upnp_ctrl_cb_t cb, void *arg) { nv_pair_t *argv3; @@ -1091,11 +1091,59 @@ argv2 = nv_pair_make_static_str(ARG_PROTOCOL, protocol); return upnp_ctrl_launch(usd, "DeletePortMapping", - argv, G_N_ELEMENTS(argv), cb, arg, + argv, N_ITEMS(argv), cb, arg, NULL); } /** + * Process returned value from GetStatusInfo(). + * + * @return walloc()'ed structure (whose size is written in lenp) containing + * the decompiled arguments, or NULL if the returned arguments cannot be + * processed. + */ +static void * +upnp_ctrl_ret_GetStatusInfo(nv_table_t *ret, size_t *lenp) +{ + struct upnp_GetStatusInfo *r; + const char *status; + time_delta_t uptime; + + status = nv_table_lookup_str(ret, "NewConnectionStatus"); + if (NULL == status) + return NULL; + + if (!upnp_ctrl_get_time_delta(ret, "NewUptime", &uptime)) + return NULL; + + WALLOC(r); + r->connection_status = status; + r->uptime = uptime; + *lenp = sizeof *r; + + return r; +} + +/** + * Get status information IP or PPP connection. + * + * @param usd the UPnP service to contact + * @param cb callback to invoke when reply is available + * @param arg additional callback argument + * + * @return UPnP request handle if the SOAP RPC was initiated, NULL otherwise + * (in which case callbacks will never be called). + */ +upnp_ctrl_t * +upnp_ctrl_GetStatusInfo(const upnp_service_t *usd, + upnp_ctrl_cb_t cb, void *arg) +{ + return upnp_ctrl_launch(usd, "GetStatusInfo", + NULL, 0, cb, arg, + upnp_ctrl_ret_GetStatusInfo); +} + +/** * Process returned value from GetTotalPacketsReceived(). * * @return walloc()'ed structure (whose size is written in lenp) containing @@ -1106,7 +1154,7 @@ upnp_ctrl_ret_GetTotalPacketsReceived(nv_table_t *ret, size_t *lenp) { struct upnp_counter *r; - guint32 value; + uint32 value; if (!upnp_ctrl_get_uint32(ret, "NewTotalPacketsReceived", &value)) return NULL;
View file
gtk-gnutella-0.98.2.tar.bz2/src/upnp/control.h -> gtk-gnutella-1.1.9.tar.bz2/src/upnp/control.h
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Raphael Manfredi + * Copyright (c) 2010, 2012 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,7 +28,7 @@ * UPnP service control. * * @author Raphael Manfredi - * @date 2010 + * @date 2010, 2012 */ #ifndef _upnp_control_h_ @@ -40,6 +40,7 @@ #include "lib/host_addr.h" #include "lib/nv.h" +#include "lib/tm.h" /* For time_delta_t */ /** * Control completion callback. @@ -60,6 +61,14 @@ }; /** + * Returned values for upnp_ctrl_GetStatusInfo(). + */ +struct upnp_GetStatusInfo { + time_delta_t uptime; /**< Connection uptime */ + const char *connection_status; /**< Current connection status */ +}; + +/** * Returned values for upnp_ctrl_GetConnectionTypeInfo(). */ struct upnp_GetConnectionTypeInfo { @@ -71,9 +80,9 @@ * Returned values for upnp_ctrl_GetSpecificPortMappingEntry(). */ struct upnp_GetSpecificPortMappingEntry { - guint16 internal_port; /**< Local port */ + uint16 internal_port; /**< Local port */ host_addr_t internal_client; /**< Local IP address */ - gboolean enabled; /**< Whether mapping is enabled */ + bool enabled; /**< Whether mapping is enabled */ const char *description; /**< Description associated with mapping */ time_delta_t lease_duration; /**< Duration of the lease */ }; @@ -83,7 +92,7 @@ * requests that return a plain 32-bit rolling counter. */ struct upnp_counter { - guint32 value; /** Returned counter value */ + uint32 value; /** Returned counter value */ }; /* @@ -93,26 +102,28 @@ struct upnp_ctrl; typedef struct upnp_ctrl upnp_ctrl_t; -void upnp_ctrl_cancel(upnp_ctrl_t *ucd, gboolean callback); -void upnp_ctrl_cancel_null(upnp_ctrl_t **ucd_ptr, gboolean callback); +void upnp_ctrl_cancel(upnp_ctrl_t *ucd, bool callback); +void upnp_ctrl_cancel_null(upnp_ctrl_t **ucd_ptr, bool callback); upnp_ctrl_t *upnp_ctrl_GetExternalIPAddress(const upnp_service_t *usd, upnp_ctrl_cb_t cb, void *arg); upnp_ctrl_t *upnp_ctrl_GetConnectionTypeInfo(const upnp_service_t *usd, upnp_ctrl_cb_t cb, void *arg); upnp_ctrl_t *upnp_ctrl_GetSpecificPortMappingEntry(const upnp_service_t *usd, - enum upnp_map_proto proto, guint16 port, + enum upnp_map_proto proto, uint16 port, upnp_ctrl_cb_t cb, void *arg); upnp_ctrl_t *upnp_ctrl_AddPortMapping(const upnp_service_t *usd, - enum upnp_map_proto proto, guint16 ext_port, - host_addr_t int_addr, guint16 int_port, + enum upnp_map_proto proto, uint16 ext_port, + host_addr_t int_addr, uint16 int_port, const char *desc, time_delta_t lease, upnp_ctrl_cb_t cb, void *arg); upnp_ctrl_t *upnp_ctrl_DeletePortMapping(const upnp_service_t *usd, - enum upnp_map_proto proto, guint16 port, + enum upnp_map_proto proto, uint16 port, upnp_ctrl_cb_t cb, void *arg); upnp_ctrl_t *upnp_ctrl_GetTotalPacketsReceived(const upnp_service_t *usd, upnp_ctrl_cb_t cb, void *arg); +upnp_ctrl_t *upnp_ctrl_GetStatusInfo(const upnp_service_t *usd, + upnp_ctrl_cb_t cb, void *arg); #endif /* _upnp_control_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/upnp/discovery.c -> gtk-gnutella-1.1.9.tar.bz2/src/upnp/discovery.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Raphael Manfredi + * Copyright (c) 2010, 2012 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -28,7 +28,7 @@ * UPnP device discovery. * * @author Raphael Manfredi - * @date 2010 + * @date 2010, 2012 */ #include "common.h" @@ -51,13 +51,16 @@ #include "lib/atoms.h" #include "lib/cq.h" -#include "lib/glib-missing.h" #include "lib/gnet_host.h" #include "lib/halloc.h" #include "lib/header.h" #include "lib/host_addr.h" +#include "lib/htable.h" #include "lib/misc.h" #include "lib/parse.h" +#include "lib/pslist.h" +#include "lib/str.h" +#include "lib/stringify.h" #include "lib/strtok.h" #include "lib/unsigned.h" #include "lib/walloc.h" @@ -68,7 +71,7 @@ #define UPNP_MCAST_ADDR "239.255.255.250" /* Multicast address */ #define UPNP_XML_MAXLEN 65536 -static GHashTable *pending; /**< Pending M-SEARCHes (socket -> upnp_mcb) */ +static htable_t *pending; /**< Pending M-SEARCHes (socket -> upnp_mcb) */ enum upnp_mcb_magic { UPNP_MCB_MAGIC = 0x0fa85631U }; @@ -81,8 +84,8 @@ void *arg; /**< User-defined callback parameter */ struct gnutella_socket *s; /**< Socket used to send/receive */ cevent_t *timeout_ev; /**< Callout queue timeout event */ - GSList *devices; /**< List of upnp_dscv structs */ - GSList *upnp_rpcs; /**< List of pending UPnP RPCs */ + pslist_t *devices; /**< List of upnp_dscv structs */ + pslist_t *upnp_rpcs; /**< List of pending UPnP RPCs */ unsigned pending_probes; /**< Amount of pending HTTP probes */ unsigned replies; /**< Total amount of replies */ unsigned valid; /**< Total amount of valid replies */ @@ -109,7 +112,7 @@ host_addr_t external_ip; /**< Reported external IP address */ const char *desc_url; /**< Description URL (atom) */ struct http_async *ha; /**< Asynchronous HTTP request in progress */ - GSList *services; /**< List of upnp_service_t discovered */ + pslist_t *services; /**< List of upnp_service_t discovered */ unsigned major; /**< UPnP architecture major */ unsigned minor; /**< UPnP architecture minor */ }; @@ -145,12 +148,12 @@ * * @return TRUE if we can keep the device in our discovery list. */ -typedef gboolean (*upnp_dscv_ctrl_cb_t)( +typedef bool (*upnp_dscv_ctrl_cb_t)( int code, void *value, size_t size, struct upnp_dscv *ud); -static gboolean upnp_dscv_got_connection_type( +static bool upnp_dscv_got_connection_type( int code, void *value, size_t size, struct upnp_dscv *ud); -static gboolean upnp_dscv_got_external_ip( +static bool upnp_dscv_got_external_ip( int code, void *value, size_t size, struct upnp_dscv *ud); /** @@ -176,6 +179,16 @@ }; /** + * Device SCPD RPC context. + */ +struct upnp_scpd_context { + struct upnp_mcb *mcb; /**< search context it belongs to */ + struct upnp_dscv *ud; /**< device to whom HTTP request was sent */ + pslist_t *services; /**< services to fetch SCPDs for */ + struct http_async *ha; /**< Asynchronous HTTP request in progress */ +}; + +/** * Free the UPnP discovery description. */ static void @@ -184,7 +197,7 @@ upnp_dscv_check(ud); atom_str_free_null(&ud->desc_url); - upnp_service_gslist_free_null(&ud->services); + upnp_service_pslist_free_null(&ud->services); if (ud->ha != NULL) http_async_cancel(ud->ha); @@ -195,29 +208,29 @@ * Free UPnP M-SEARCH callback descriptor. */ static void -upnp_mcb_free(struct upnp_mcb *mcb, gboolean in_shutdown) +upnp_mcb_free(struct upnp_mcb *mcb, bool in_shutdown) { - GSList *sl; + pslist_t *sl; upnp_mcb_check(mcb); if (in_shutdown) { (*mcb->cb)(NULL, mcb->arg); /* Signal error / timeout */ } else { - g_hash_table_remove(pending, mcb->s); + htable_remove(pending, mcb->s); } - GM_SLIST_FOREACH(mcb->upnp_rpcs, sl) { + PSLIST_FOREACH(mcb->upnp_rpcs, sl) { upnp_ctrl_t *ucd = sl->data; upnp_ctrl_cancel(ucd, !in_shutdown); } - gm_slist_free_null(&mcb->upnp_rpcs); + pslist_free_null(&mcb->upnp_rpcs); - GM_SLIST_FOREACH(mcb->devices, sl) { + PSLIST_FOREACH(mcb->devices, sl) { struct upnp_dscv *ud = sl->data; upnp_dscv_free(ud); } - gm_slist_free_null(&mcb->devices); + pslist_free_null(&mcb->devices); cq_cancel(&mcb->timeout_ev); socket_free_null(&mcb->s); @@ -234,27 +247,27 @@ upnp_mcb_check(mcb); if (0 == mcb->pending_probes) { - GSList *devlist = NULL; - GSList *sl; + pslist_t *devlist = NULL; + pslist_t *sl; if (GNET_PROPERTY(upnp_debug) > 3) { - size_t count = g_slist_length(mcb->devices); + size_t count = pslist_length(mcb->devices); g_message("UPNP discovery completed: kept %zu device%s", - count, 1 == count ? "" : "s"); + count, plural(count)); } /* * Build retained device list, then invoke user callback. */ - GM_SLIST_FOREACH(mcb->devices, sl) { + PSLIST_FOREACH(mcb->devices, sl) { struct upnp_dscv *ud = sl->data; upnp_device_t *udev; udev = upnp_dev_igd_make(ud->desc_url, ud->services, ud->external_ip, ud->major, ud->minor); - devlist = g_slist_prepend(devlist, udev); + devlist = pslist_prepend(devlist, udev); /* * The service list is shallow-cloned by the IGD device we @@ -265,7 +278,7 @@ * to free the underlying objects as well. */ - gm_slist_free_null(&ud->services); + pslist_free_null(&ud->services); } /* @@ -287,7 +300,7 @@ * * @return TRUE if we can keep this device. */ -static gboolean +static bool upnp_dscv_got_connection_type( int code, void *value, size_t size, struct upnp_dscv *ud) { @@ -300,7 +313,7 @@ */ if (ret != NULL) { - gboolean suitable; + bool suitable; suitable = 0 == strcmp(ret->connection_type, upnp_igd_ip_routed()); @@ -334,7 +347,7 @@ * * @return TRUE if we can keep this device. */ -static gboolean +static bool upnp_dscv_got_external_ip( int code, void *value, size_t size, struct upnp_dscv *ud) { @@ -347,7 +360,7 @@ */ if (ret != NULL) { - gboolean routable; + bool routable; routable = host_addr_is_routable(ret->external_ip); @@ -377,7 +390,141 @@ return TRUE; } -static gboolean upnp_dscv_next_ctrl(struct upnp_ctrl_context *ucd_ctx); +static void upnp_dscv_scpd_iterate(struct upnp_scpd_context *uscpd); + +/** + * Got result of SCPD fetch for a service offered by the device. + * + * This is an http_async_wget() completion callback. + */ +static void +upnp_dscv_scpd_result(char *data, size_t len, int code, + header_t *header, void *arg) +{ + struct upnp_scpd_context *uscpd = arg; + struct upnp_dscv *ud = uscpd->ud; + struct upnp_mcb *mcb = uscpd->mcb; + upnp_service_t *usd; + + upnp_dscv_check(ud); + upnp_mcb_check(mcb); + g_assert(uint_is_positive(mcb->pending_probes)); + g_assert(uscpd->services != NULL); + g_assert(ud->ha != NULL); /* Pending HTTP request */ + + mcb->pending_probes--; + ud->ha = NULL; /* Request ending with this callback */ + usd = uscpd->services->data; + + if (NULL == data) { + g_warning("UPNP SCPD fetch \"%s\" failed (HTTP %d) for %s", + upnp_service_scpd_url(usd), code, + upnp_service_to_string(usd)); + goto next; + } + + if (GNET_PROPERTY(upnp_debug) > 5) { + g_debug("UPNP SCPD fetch \"%s\" returned %zu byte%s for %s", + upnp_service_scpd_url(usd), len, plural(len), + upnp_service_to_string(usd)); + if (GNET_PROPERTY(upnp_debug) > 8) { + g_debug("UPNP got HTTP %u:", code); + header_dump(stderr, header, "----"); + } + if (len > 1U && GNET_PROPERTY(upnp_debug) > 9) { + char *xml = xml_indent(data); + g_debug("UPNP HTTP payload start:"); + fwrite(xml, strlen(xml), 1, stderr); + g_debug("UPNP HTTP payload end (%zu bytes).", len); + HFREE_NULL(xml); + } + } + + /* + * Parse the XML to extract the service API. + */ + + upnp_service_scpd_parse(usd, data, len); + + /* FALL THROUGH */ + +next: + HFREE_NULL(data); + uscpd->services = pslist_remove(uscpd->services, usd); + upnp_dscv_scpd_iterate(uscpd); + +} + +/** + * Iterate to fetch SCPD for the next service listed. + */ +static void +upnp_dscv_scpd_iterate(struct upnp_scpd_context *uscpd) +{ + struct http_async *ha; + const char *url; + upnp_service_t *usd; + struct upnp_dscv *ud = uscpd->ud; + struct upnp_mcb *mcb = uscpd->mcb; + + upnp_dscv_check(ud); + upnp_mcb_check(mcb); + + g_assert(NULL == ud->ha); /* No pending HTTP request */ + + /* + * If we exhausted the list of services to probe, we're done. + */ + +next: + if (NULL == uscpd->services) { + WFREE(uscpd); + upnp_dscv_updated(mcb); + return; + } + + usd = uscpd->services->data; + url = upnp_service_scpd_url(usd); + + ha = http_async_wget(url, UPNP_XML_MAXLEN, upnp_dscv_scpd_result, uscpd); + + if (NULL == ha) { + g_warning("UPNP cannot fetch \"%s\": %s", + url, http_async_strerror(http_async_errno)); + uscpd->services = pslist_remove(uscpd->services, usd); + goto next; + } + + if (GNET_PROPERTY(upnp_debug) > 1) { + g_debug("UPNP getting SCPD %s from %s", + upnp_service_to_string(usd), url); + } + + ud->ha = ha; + mcb->pending_probes++; +} + +/** + * Fetch the SCPD descriptions for all the services discovered on the device. + * + * @param mcb the overall M-SEARCH context for discovered devices + * @param ud the device for which we want to fetch SCPDs + */ +static void +upnp_dscv_scpd_fetch(struct upnp_mcb *mcb, struct upnp_dscv *ud) +{ + struct upnp_scpd_context *uscpd; + + WALLOC0(uscpd); + + uscpd->mcb = mcb; + uscpd->ud = ud; + uscpd->services = pslist_copy(ud->services); + + upnp_dscv_scpd_iterate(uscpd); +} + +static bool upnp_dscv_next_ctrl(struct upnp_ctrl_context *ucd_ctx); /** * Completion callback for upnp_ctrl_*() routines launched through the @@ -399,7 +546,7 @@ upnp_dscv_ctrl_cb_t cb; g_assert(size_is_non_negative(ucd_ctx->probe_idx)); - g_assert(ucd_ctx->probe_idx < G_N_ELEMENTS(upnp_dscv_probes)); + g_assert(ucd_ctx->probe_idx < N_ITEMS(upnp_dscv_probes)); dc = &upnp_dscv_probesucd_ctx->probe_idx++; @@ -412,7 +559,7 @@ g_assert(uint_is_positive(mcb->pending_probes)); mcb->pending_probes--; - mcb->upnp_rpcs = g_slist_remove(mcb->upnp_rpcs, ucd); + mcb->upnp_rpcs = pslist_remove(mcb->upnp_rpcs, ucd); /* * Process the reply. @@ -420,7 +567,7 @@ if (!(*cb)(code, value, size, ud)) { /* SOAP error, remove the device */ - mcb->devices = g_slist_remove(mcb->devices, ud); + mcb->devices = pslist_remove(mcb->devices, ud); upnp_dscv_free(ud); goto done; } @@ -429,8 +576,17 @@ * Move on to the next control probe if any left. */ - if (G_N_ELEMENTS(upnp_dscv_probes) == ucd_ctx->probe_idx) { + if (N_ITEMS(upnp_dscv_probes) == ucd_ctx->probe_idx) { + /* + * All probes were successful, so we have a device with which we + * can interact to do port mappings. + * + * We now need to fetch the SCPD URLs of the services to know for + * each service what is the appropriate web API. + */ + WFREE(ucd_ctx); + upnp_dscv_scpd_fetch(mcb, ud); } else { if (upnp_dscv_next_ctrl(ucd_ctx)) return; @@ -446,14 +602,14 @@ * * @return TRUE if we can launch the action, FALSE otherwise. */ -static gboolean +static bool upnp_dscv_next_ctrl(struct upnp_ctrl_context *ucd_ctx) { struct upnp_dscv_ctrl *dc; struct upnp_mcb *mcb; g_assert(size_is_non_negative(ucd_ctx->probe_idx)); - g_assert(ucd_ctx->probe_idx <= G_N_ELEMENTS(upnp_dscv_probes)); + g_assert(ucd_ctx->probe_idx <= N_ITEMS(upnp_dscv_probes)); mcb = ucd_ctx->mcb; upnp_mcb_check(mcb); @@ -462,7 +618,7 @@ * The index of the next command to launch is given by ucd_ctx->probe_idx. */ - if (G_N_ELEMENTS(upnp_dscv_probes) == ucd_ctx->probe_idx) + if (N_ITEMS(upnp_dscv_probes) == ucd_ctx->probe_idx) return FALSE; /* @@ -482,7 +638,7 @@ } mcb->pending_probes++; - mcb->upnp_rpcs = g_slist_prepend(mcb->upnp_rpcs, ucd_ctx->ucd); + mcb->upnp_rpcs = pslist_prepend(mcb->upnp_rpcs, ucd_ctx->ucd); return TRUE; } @@ -520,16 +676,23 @@ if (GNET_PROPERTY(upnp_debug) > 5) { g_debug("UPNP probe of \"%s\" returned %zu byte%s", - ud->desc_url, len, 1 == len ? "" : "s"); - if (GNET_PROPERTY(upnp_debug) > 9) { + ud->desc_url, len, plural(len)); + if (GNET_PROPERTY(upnp_debug) > 8) { g_debug("UPNP got HTTP %u:", code); header_dump(stderr, header, "----"); } + if (len > 1U && GNET_PROPERTY(upnp_debug) > 9) { + char *xml = xml_indent(data); + g_debug("UPNP HTTP payload start:"); + fwrite(xml, strlen(xml), 1, stderr); + g_debug("UPNP HTTP payload end (%zu bytes).", len); + HFREE_NULL(xml); + } } /* * Check the Server: header, which is going to be a string such as: - * + * * "OS/version, UPnP/major.minor, product/version" * * We want to make sure that the UPnP architecture supported by the @@ -547,7 +710,7 @@ ud->minor = 0; } else { const char *p = strstr(buf, "UPnP/"); - gboolean ok = FALSE; + bool ok = FALSE; if (p != NULL) { unsigned major, minor; @@ -593,14 +756,14 @@ */ ud->services = upnp_service_extract(data, len, ud->desc_url); - hfree(data); + HFREE_NULL(data); /* * If the services do not contain UPNP_SVC_WAN_CIF and at least one * of UPNP_SVC_WAN_IP or UPNP_SVC_WAN_PPP, then it's no good to us. */ - if (NULL == upnp_service_gslist_find(ud->services, UPNP_SVC_WAN_CIF)) { + if (NULL == upnp_service_pslist_find(ud->services, UPNP_SVC_WAN_CIF)) { if (GNET_PROPERTY(upnp_debug) > 1) { g_message("UPNP probed \"%s\" does not support the \"%s\" service", ud->desc_url, upnp_service_type_to_string(UPNP_SVC_WAN_CIF)); @@ -609,8 +772,8 @@ } if ( - NULL == upnp_service_gslist_find(ud->services, UPNP_SVC_WAN_IP) && - NULL == upnp_service_gslist_find(ud->services, UPNP_SVC_WAN_PPP) + NULL == upnp_service_pslist_find(ud->services, UPNP_SVC_WAN_IP) && + NULL == upnp_service_pslist_find(ud->services, UPNP_SVC_WAN_PPP) ) { if (GNET_PROPERTY(upnp_debug) > 1) { g_message("UPNP probed \"%s\" lacks IP or PPP connection services", @@ -653,7 +816,8 @@ return; remove_device: - mcb->devices = g_slist_remove(mcb->devices, ud); + HFREE_NULL(data); + mcb->devices = pslist_remove(mcb->devices, ud); upnp_dscv_free(ud); goto done; } @@ -664,7 +828,8 @@ * socket buffer. */ static void -upnp_msearch_reply(struct gnutella_socket *s, gboolean truncated) +upnp_msearch_reply(const gnutella_socket_t *s, + const void *data, size_t len, bool truncated) { int code; header_t *header; @@ -672,13 +837,13 @@ char *st; struct upnp_mcb *mcb; struct upnp_dscv *udev; - GSList *sl; + pslist_t *sl; /* * Fetch UPnP discovery descriptor, attached to the socket. */ - mcb = g_hash_table_lookup(pending, s); + mcb = htable_lookup(pending, s); if (NULL == mcb) { g_warning("unexpected UPnP reply from %s", @@ -698,16 +863,16 @@ } if (GNET_PROPERTY(http_trace) & SOCK_TRACE_IN) { - g_debug("----Got HTTP reply (UDP) from %s (%u bytes):", - host_addr_to_string(s->addr), (unsigned) s->pos); - dump_string(stderr, s->buf, s->pos, "----"); + g_debug("----Got HTTP reply (UDP) from %s (%zu bytes):", + host_addr_to_string(s->addr), len); + dump_string(stderr, data, len, "----"); } /* * Parse the HTTP reply we got via UDP. */ - header = http_header_parse(s->buf, s->pos, &code, NULL, NULL, NULL, NULL); + header = http_header_parse(data, len, &code, NULL, NULL, NULL, NULL); if (NULL == header) return; @@ -750,7 +915,7 @@ * search type which brought back a given device. */ - GM_SLIST_FOREACH(mcb->devices, sl) { + PSLIST_FOREACH(mcb->devices, sl) { struct upnp_dscv *ud = sl->data; if (0 == strcmp(location, ud->desc_url)) @@ -799,7 +964,7 @@ * Record the device. */ - mcb->devices = g_slist_prepend(mcb->devices, udev); + mcb->devices = pslist_prepend(mcb->devices, udev); mcb->pending_probes++; done: @@ -816,7 +981,7 @@ * * @return TRUE if message was successfully sent. */ -static gboolean +static bool upnp_msearch_send(struct gnutella_socket *s, host_addr_t addr, const char *type, unsigned mx) { @@ -835,7 +1000,7 @@ * it's best to adhere to the examples to maximize the success rate. */ - len = gm_snprintf(req, sizeof req, + len = str_bprintf(req, sizeof req, "M-SEARCH * HTTP/1.1\r\n" "HOST: " UPNP_MCAST_ADDR ":" STRINGIFY(UPNP_PORT) "\r\n" "USER-AGENT: %s\r\n" @@ -873,14 +1038,13 @@ * Discovery timed out. */ static void -upnp_dscv_timeout(cqueue_t *unused_cq, gpointer obj) +upnp_dscv_timeout(cqueue_t *cq, void *obj) { struct upnp_mcb *mcb = obj; upnp_mcb_check(mcb); - (void) unused_cq; - mcb->timeout_ev = NULL; + cq_zero(cq, &mcb->timeout_ev); /* * If we already received one reply to our M-SEARCH, then it's OK and @@ -893,7 +1057,7 @@ if (GNET_PROPERTY(upnp_debug)) { g_warning("UPNP discovery timed out after %u repl%s", - mcb->replies, 1 == mcb->replies ? "y" : "ies"); + mcb->replies, plural_y(mcb->replies)); } (*mcb->cb)(NULL, mcb->arg); /* Signals timeout */ @@ -904,7 +1068,7 @@ * Initiate a discovery of all UPnP devices on the LAN network. * Upon completion, the callback is called with the results and the * user-supplied argument. - * + * * @param timeout timeout in milliseconds * @param cb callback to invoke on completion / timeout * @param arg user-defined callback argument @@ -918,7 +1082,7 @@ host_addr_t bind_addr; unsigned mx; struct upnp_mcb *mcb; - gboolean sent = FALSE; + bool sent = FALSE; static const char * const devlist = { "urn:schemas-upnp-org:device:InternetGatewayDevice:2", "urn:schemas-upnp-org:device:InternetGatewayDevice:1", @@ -933,16 +1097,11 @@ } /* - * If UPnP support was disabled, ignore request. + * We discover even if UPnP support is disabled: we won't publish + * mappings via UPnP, but we want to know whether we have a UPnP + * device available. */ - if (!GNET_PROPERTY(enable_upnp)) { - if (GNET_PROPERTY(upnp_debug) > 10) { - g_debug("UPNP support disabled, not launching discovery"); - } - return; - } - if (GNET_PROPERTY(upnp_debug) > 3) { g_message("UPNP initating discovery (timeout %u ms)", timeout); } @@ -971,7 +1130,7 @@ int r; ZERO(&hints); - hints.ai_family = AF_UNSPEC; + hints.ai_family = AF_INET; /* IPv4 UDP socket */ hints.ai_socktype = SOCK_DGRAM; r = getaddrinfo(UPNP_MCAST_ADDR, STRINGIFY(UPNP_PORT), &hints, &serv); @@ -989,7 +1148,7 @@ addr = addrinfo_to_addr(p); - while (devidx < G_N_ELEMENTS(devlist)) { + while (devidx < N_ITEMS(devlist)) { const char *type = devlistdevidx++; if (upnp_msearch_send(s, addr, type, mx)) @@ -1007,7 +1166,7 @@ #endif /* HAS_GETADDRINFO */ LABEL(no_getaddrinfo) - while (devidx < G_N_ELEMENTS(devlist)) { + while (devidx < N_ITEMS(devlist)) { const char *type = devlistdevidx++; if (upnp_msearch_send(s, mcast, type, mx)) @@ -1035,7 +1194,7 @@ mcb->devices = NULL; mcb->timeout_ev = cq_main_insert(timeout + 1000, upnp_dscv_timeout, mcb); - g_hash_table_insert(pending, s, mcb); + htable_insert(pending, s, mcb); return; /* @@ -1051,11 +1210,11 @@ void upnp_discovery_init(void) { - pending = g_hash_table_new(pointer_hash_func, NULL); + pending = htable_create(HASH_KEY_SELF, 0); } static void -upnp_discovery_free_kv(gpointer unused_key, gpointer val, gpointer unused_x) +upnp_discovery_free_kv(const void *unused_key, void *val, void *unused_x) { (void) unused_key; (void) unused_x; @@ -1069,8 +1228,8 @@ void upnp_discovery_close(void) { - g_hash_table_foreach(pending, upnp_discovery_free_kv, NULL); - gm_hash_table_destroy_null(&pending); + htable_foreach(pending, upnp_discovery_free_kv, NULL); + htable_free_null(&pending); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/upnp/discovery.h -> gtk-gnutella-1.1.9.tar.bz2/src/upnp/discovery.h
Changed
@@ -36,13 +36,15 @@ #include "common.h" +struct pslist; + /** * UPnP discovery callback. * * @param devlist A list of upnp_device_t (owned by callback) * @param arg User-supplied argument */ -typedef void (*upnp_discover_cb_t)(GSList *devlist, void *arg); +typedef void (*upnp_discover_cb_t)(struct pslist *devlist, void *arg); /* * Public interface.
View file
gtk-gnutella-0.98.2.tar.bz2/src/upnp/error.h -> gtk-gnutella-1.1.9.tar.bz2/src/upnp/error.h
Changed
@@ -41,8 +41,9 @@ #define UPNP_ERR_OK 0 #define UPNP_ERR_UNPARSEABLE 1 #define UPNP_ERR_SOAP 2 -#define UPNP_ERR_BAD_REPLY 3 +#define UPNP_ERR_BAD_REPLY 3 +#define UPNP_ERR_INVALID_ACTION 401 #define UPNP_ERR_UNAUTHORIZED 606 #define UPNP_ERR_ONLY_PERMANENT_LEASE 725
View file
gtk-gnutella-0.98.2.tar.bz2/src/upnp/natpmp.c -> gtk-gnutella-1.1.9.tar.bz2/src/upnp/natpmp.c
Changed
@@ -52,6 +52,7 @@ #include "lib/cq.h" #include "lib/getgateway.h" #include "lib/pmsg.h" +#include "lib/stringify.h" #include "lib/tm.h" #include "lib/walloc.h" @@ -113,7 +114,7 @@ unsigned sssoe; /**< Seconds since start of epoch */ unsigned retries; /**< Max amount of retries */ unsigned count; /**< Iteration count */ - guint16 iport; /**< Internal port (in mapping RPCs) */ + uint16 iport; /**< Internal port (in mapping RPCs) */ }; static inline void @@ -125,7 +126,7 @@ static unsigned natpmp_rpc_pending; -static void natpmp_rpc_iterate(cqueue_t *unused_cq, void *obj); +static void natpmp_rpc_iterate(cqueue_t *cq, void *obj); /** * Allocate a new NAT-PMP gateway. @@ -164,7 +165,7 @@ natpmp_gateway_addr(const natpmp_t *np) { natpmp_check(np); - + return np->gateway; } @@ -175,14 +176,14 @@ natpmp_wan_ip(const natpmp_t *np) { natpmp_check(np); - + return np->wan_ip; } /** * Check whether NAT-PMP gateway rebooted. */ -gboolean +bool natpmp_has_rebooted(const natpmp_t *np) { natpmp_check(np); @@ -360,15 +361,15 @@ * user code about the outcome of the request, FALSE if we need to resend * the request. */ -static gboolean +static bool natpmp_handle_discovery_reply( const void *payload, size_t len, struct natpmp_rpc *rd) { bstr_t *bs; - guint8 version; - guint8 code; - guint16 result; - guint32 ip; + uint8 version; + uint8 code; + uint16 result; + uint32 ip; host_addr_t wan_ip; natpmp_t *np; @@ -462,10 +463,10 @@ if (bstr_has_error(bs)) { g_warning("NATPMP parsing error while processing discovery reply " "(%zu byte%s): %s", - len, 1 == len ? "" : "s", bstr_error(bs)); + len, plural(len), bstr_error(bs)); } else { g_warning("NATPMP inconsistent discovery reply (%zu byte%s)", - len, 1 == len ? "" : "s"); + len, plural(len)); } } bstr_free(&bs); @@ -483,16 +484,16 @@ * user code about the outcome of the request, FALSE if we need to resend * the request. */ -static gboolean +static bool natpmp_handle_mapping_reply( const void *payload, size_t len, struct natpmp_rpc *rd) { bstr_t *bs; - guint8 version; - guint8 code; - guint16 result = 0; - guint16 port; - guint32 lifetime; + uint8 version; + uint8 code; + uint16 result = 0; + uint16 port; + uint32 lifetime; natpmp_rpc_check(rd); @@ -579,10 +580,10 @@ if (bstr_has_error(bs)) { g_warning("NATPMP parsing error while processing discovery reply " "(%zu byte%s): %s", - len, 1 == len ? "" : "s", bstr_error(bs)); + len, plural(len), bstr_error(bs)); } else { g_warning("NATPMP inconsistent discovery reply (%zu byte%s)", - len, 1 == len ? "" : "s"); + len, plural(len)); } } bstr_free(&bs); @@ -593,7 +594,7 @@ * UDP RPC reply (or timeout) callback. */ static void -natpmp_rpc_reply(enum urpc_ret type, host_addr_t addr, guint16 port, +natpmp_rpc_reply(enum urpc_ret type, host_addr_t addr, uint16 port, const void *payload, size_t len, void *arg) { struct natpmp_rpc *rd = arg; @@ -602,12 +603,18 @@ if (GNET_PROPERTY(natpmp_debug) > 4) { g_debug("NATPMP %s for \"%s\" #%u (%lu byte%s) from %s", - URPC_TIMEOUT == type ? "timeout" : "got reply", + URPC_TIMEOUT == type ? "timeout" : + URPC_ABORT == type ? "aborted" : "got reply", natpmp_op_to_string(rd->op), rd->count, - (unsigned long) len, 1 == len ? "" : "s", + (unsigned long) len, plural(len), host_addr_port_to_string(addr, port)); } + if (URPC_ABORT == type) { + natpmp_rpc_error(rd); + return; + } + if (URPC_TIMEOUT == type) goto iterate; @@ -616,7 +623,7 @@ * sent the RPC. */ - if (!host_addr_equal(addr, rd->gateway)) { + if (!host_addr_equiv(addr, rd->gateway)) { if (GNET_PROPERTY(natpmp_debug)) { g_warning("NATPMP discarding reply from %s (sent %s to %s)", host_addr_port_to_string(addr, port), @@ -773,17 +780,11 @@ natpmp_discover(unsigned retries, natpmp_discover_cb_t cb, void *arg) { /* - * If NATPMP is disabled, ignore request but log. + * We discover even if NAT-PMP support is disabled: we won't publish + * mappings via NAT-PMP, but we want to know whether we have a NAT-PMP + * device available. */ - if (!GNET_PROPERTY(enable_natpmp)) { - if (GNET_PROPERTY(natpmp_debug) > 10) { - g_debug("NATPMP support disabled, not launching discovery"); - } - (*cb)(FALSE, NULL, arg); - return; - } - if (GNET_PROPERTY(natpmp_debug) > 3) g_message("NATPMP initiating discovery"); @@ -815,7 +816,7 @@ * @param lease requested lease time (0 for deletions) */ static pmsg_t * -natpmp_build_mapping(enum natpmp_op op, guint16 port, time_delta_t lease) +natpmp_build_mapping(enum natpmp_op op, uint16 port, time_delta_t lease) { pmsg_t *mb; @@ -861,7 +862,7 @@ * @param arg additional callback argument */ static void -natpmp_rpc_map(natpmp_t *np, enum upnp_map_proto proto, guint16 port, +natpmp_rpc_map(natpmp_t *np, enum upnp_map_proto proto, uint16 port, time_delta_t lease, natpmp_map_cb_t cb, void *arg) { pmsg_t *mb; @@ -910,7 +911,7 @@ * @param arg additional callback argument */ void -natpmp_map(natpmp_t *np, enum upnp_map_proto proto, guint16 port, +natpmp_map(natpmp_t *np, enum upnp_map_proto proto, uint16 port, time_delta_t lease, natpmp_map_cb_t cb, void *arg) { natpmp_check(np); @@ -925,7 +926,7 @@ * This is an advisory unmapping, there is no callback to the user when done. */ void -natpmp_unmap(natpmp_t *np, enum upnp_map_proto proto, guint16 port) +natpmp_unmap(natpmp_t *np, enum upnp_map_proto proto, uint16 port) { natpmp_check(np);
View file
gtk-gnutella-0.98.2.tar.bz2/src/upnp/natpmp.h -> gtk-gnutella-1.1.9.tar.bz2/src/upnp/natpmp.h
Changed
@@ -66,7 +66,7 @@ * @param gateway the allocated NAT-PMP gateway * @param arg user-defined argument */ -typedef void (*natpmp_discover_cb_t)(gboolean ok, natpmp_t *gateway, void *arg); +typedef void (*natpmp_discover_cb_t)(bool ok, natpmp_t *gateway, void *arg); /** * NAT-PMP port mapping callback. @@ -77,7 +77,7 @@ * @param arg user-defined argument */ typedef void (*natpmp_map_cb_t)(int code, - guint16 port, unsigned lifetime, void *arg); + uint16 port, unsigned lifetime, void *arg); /* * Public interface. @@ -87,14 +87,14 @@ const char *natpmp_strerror(int code); host_addr_t natpmp_wan_ip(const natpmp_t *np); host_addr_t natpmp_gateway_addr(const natpmp_t *np); -gboolean natpmp_has_rebooted(const natpmp_t *np); +bool natpmp_has_rebooted(const natpmp_t *np); void natpmp_clear_rebooted(natpmp_t *np); void natpmp_free_null(natpmp_t **np_ptr); void natpmp_discover(unsigned retries, natpmp_discover_cb_t cb, void *arg); void natpmp_monitor(natpmp_t *np, natpmp_discover_cb_t cb, void *arg); -void natpmp_map(natpmp_t *np, enum upnp_map_proto proto, guint16 port, +void natpmp_map(natpmp_t *np, enum upnp_map_proto proto, uint16 port, time_delta_t lease, natpmp_map_cb_t cb, void *arg); -void natpmp_unmap(natpmp_t *np, enum upnp_map_proto proto, guint16 port); +void natpmp_unmap(natpmp_t *np, enum upnp_map_proto proto, uint16 port); #endif /* _upnp_natpmp_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/upnp/service.c -> gtk-gnutella-1.1.9.tar.bz2/src/upnp/service.c
Changed
@@ -38,16 +38,28 @@ #include "if/gnet_property_priv.h" #include "xml/vxml.h" +#include "xml/xnode.h" #include "lib/atoms.h" -#include "lib/glib-missing.h" +#include "lib/buf.h" #include "lib/halloc.h" +#include "lib/nv.h" +#include "lib/once.h" #include "lib/parse.h" +#include "lib/pslist.h" +#include "lib/str.h" +#include "lib/tokenizer.h" #include "lib/unsigned.h" #include "lib/url.h" #include "lib/walloc.h" + #include "lib/override.h" /* Must be the last header included */ +static const char UPNP_SVC_NS = "urn:schemas-upnp-org:service-1-0"; +static const char UPNP_SVC_ACTIONLIST = "actionList"; +static const char UPNP_SVC_ACTION = "action"; +static const char UPNP_SVC_NAME = "name"; + enum upnp_service_msgic { UPNP_SVC_DESC_MAGIC = 0x6c960b68U }; /** @@ -58,6 +70,8 @@ enum upnp_service_type type; /**< Service type */ unsigned version; /**< Service version */ const char *control_url; /**< Control URL (atom) */ + const char *scpd_url; /**< SCPD URL (atom) */ + nv_table_t *api; /**< The actions available in the API */ }; static inline void @@ -101,6 +115,17 @@ } /** + * @return Service Control Protocol Definition (SCPD) URL. + */ +const char * +upnp_service_scpd_url(const upnp_service_t *usd) +{ + upnp_service_check(usd); + + return usd->scpd_url; +} + +/** * Allocate a new service description. * * The control URL is copied. @@ -108,18 +133,20 @@ * @param type service type * @param version service version number * @param ctrl_url control URL + * @param scpd_url SCPD URL */ static upnp_service_t * upnp_service_alloc(enum upnp_service_type type, unsigned version, - const char *ctrl_url) + const char *ctrl_url, const char *scpd_url) { upnp_service_t *usd; - WALLOC(usd); + WALLOC0(usd); usd->magic = UPNP_SVC_DESC_MAGIC; usd->type = type; usd->version = version; usd->control_url = atom_str_get(ctrl_url); + usd->scpd_url = atom_str_get(scpd_url); return usd; } @@ -133,6 +160,8 @@ upnp_service_check(usd); atom_str_free_null(&usd->control_url); + atom_str_free_null(&usd->scpd_url); + nv_table_free_null(&usd->api); usd->magic = 0; WFREE(usd); } @@ -165,31 +194,31 @@ const char * upnp_service_to_string(const upnp_service_t *usd) { - static char buf128; + buf_t *b = buf_private(G_STRFUNC, 128); upnp_service_check(usd); - gm_snprintf(buf, sizeof buf, "\"%s\" v%u at %s", + buf_printf(b, "\"%s\" v%u at %s", upnp_service_type_to_string(usd->type), usd->version, usd->control_url); - return buf; + return buf_data(b); } /** * Free list of upnp_service_t and nullify its pointer. */ void -upnp_service_gslist_free_null(GSList **list_ptr) +upnp_service_pslist_free_null(pslist_t **list_ptr) { - GSList *list = *list_ptr; + pslist_t *list = *list_ptr; if (list != NULL) { - GSList *sl; + pslist_t *sl; - GM_SLIST_FOREACH(list, sl) { + PSLIST_FOREACH(list, sl) { upnp_service_free(sl->data); } - g_slist_free(list); + pslist_free(list); *list_ptr = NULL; } } @@ -201,11 +230,11 @@ * are no such service offered. */ upnp_service_t * -upnp_service_gslist_find(GSList *services, enum upnp_service_type type) +upnp_service_pslist_find(pslist_t *services, enum upnp_service_type type) { - GSList *sl; + pslist_t *sl; - GM_SLIST_FOREACH(services, sl) { + PSLIST_FOREACH(services, sl) { upnp_service_t *usd = sl->data; upnp_service_check(usd); @@ -223,13 +252,13 @@ * @return a WAN service if found, NULL if no such service is available. */ upnp_service_t * -upnp_service_get_wan_connection(GSList *services) +upnp_service_get_wan_connection(pslist_t *services) { upnp_service_t *usd; - usd = upnp_service_gslist_find(services, UPNP_SVC_WAN_IP); + usd = upnp_service_pslist_find(services, UPNP_SVC_WAN_IP); if (NULL == usd) - usd = upnp_service_gslist_find(services, UPNP_SVC_WAN_PPP); + usd = upnp_service_pslist_find(services, UPNP_SVC_WAN_PPP); return usd; } @@ -240,9 +269,9 @@ * @return a WAN_CIF service if found, NULL if no such service is available. */ upnp_service_t * -upnp_service_get_common_if(GSList *services) +upnp_service_get_common_if(pslist_t *services) { - return upnp_service_gslist_find(services, UPNP_SVC_WAN_CIF); + return upnp_service_pslist_find(services, UPNP_SVC_WAN_CIF); } /** @@ -252,13 +281,21 @@ * constant part. The trailing ":<version>" is also removed since we are * identifying service types. */ -static struct vxml_parser_token upnp_services = { +static tokenizer_t upnp_services = { /* Sorted array */ { "schemas-upnp-org:service:WANCommonInterfaceConfig", UPNP_SVC_WAN_CIF }, { "schemas-upnp-org:service:WANIPConnection", UPNP_SVC_WAN_IP }, { "schemas-upnp-org:service:WANPPPConnection", UPNP_SVC_WAN_PPP }, }; +static once_flag_t upnp_services_checked; + +static void G_COLD +upnp_services_check(void) +{ + TOKENIZE_CHECK_SORTED(upnp_services); +} + /** * Parse service type ("urn:schemas-dummy-com:service:Dummy:1"). * @@ -270,13 +307,13 @@ * * @return TRUE if parsing was successful, FALSE otherwise */ -static gboolean +static bool upnp_service_parse_type(const char *text, enum upnp_service_type *type, unsigned *version) { char *dtext = NULL; char *p; - gboolean ok = FALSE; + bool ok = FALSE; /* * Before the trailing ':' we must find a valid version number. @@ -284,7 +321,7 @@ p = strrchr(text, ':'); if (p != NULL) { - guint32 v; + uint32 v; int error; v = parse_uint32(p + 1, NULL, 10, &error); @@ -317,7 +354,9 @@ * Lookup the service type. */ - *type = vxml_token_lookup(p, upnp_services, G_N_ELEMENTS(upnp_services)); + ONCE_FLAG_RUN(upnp_services_checked, upnp_services_check); + + *type = TOKENIZE(p, upnp_services); ok = TRUE; /* FALL THROUGH */ @@ -336,14 +375,14 @@ * @param base_url if non-NULL, base URL to use for relative URLs */ static void -upnp_service_adjust_urls(GSList *services, +upnp_service_adjust_urls(pslist_t *services, const char *desc_url, const char *base_url) { - GSList *sl; + pslist_t *sl; g_assert(desc_url != NULL); - GM_SLIST_FOREACH(services, sl) { + PSLIST_FOREACH(services, sl) { upnp_service_t *usd = sl->data; const char *base = base_url != NULL ? base_url : desc_url; char *absolute; @@ -360,6 +399,12 @@ upnp_service_to_string(usd)); } } + + absolute = url_absolute_within(base, usd->scpd_url); + if (absolute != usd->scpd_url) { + atom_str_change(&usd->scpd_url, absolute); + hfree(absolute); + } } } @@ -368,12 +413,13 @@ */ struct upnp_service_ctx { const char *desc_url; /**< URL we got service info from */ - GSList *services; /**< Services already parsed */ + pslist_t *services; /**< Services already parsed */ const char *base_url; /**< Base URL, if specified (atom) */ /* Current service being analyzed */ enum upnp_service_type type; /**< Service type */ unsigned version; /**< Service version */ const char *control_url; /**< Control URL (atom) */ + const char *scpd_url; /**< SCPD URL (atom) */ unsigned in_service:1; /**< Within a <service> tag? */ }; @@ -384,17 +430,19 @@ UPNP_SRVTOK_URL_BASE = 1, /* URLBase */ UPNP_SRVTOK_SERVICE, /* service */ UPNP_SRVTOK_SERVICE_TYPE, /* serviceType */ - UPNP_SRVTOK_CONTROL_URL /* controlURL */ + UPNP_SRVTOK_CONTROL_URL, /* controlURL */ + UPNP_SRVTOK_SCPD_URL /* SCPDURL */ }; /** * Tokens for service parsing: elements which we are interested in. */ -struct vxml_token upnp_service_tokens = { +static struct vxml_token upnp_service_tokens = { { "URLBase", UPNP_SRVTOK_URL_BASE }, { "service", UPNP_SRVTOK_SERVICE }, { "serviceType", UPNP_SRVTOK_SERVICE_TYPE }, { "controlURL", UPNP_SRVTOK_CONTROL_URL }, + { "SCPDURL", UPNP_SRVTOK_SCPD_URL }, }; /* @@ -453,6 +501,11 @@ atom_str_change(&ctx->control_url, text); } break; + case UPNP_SRVTOK_SCPD_URL: + if (ctx->in_service) { + atom_str_change(&ctx->scpd_url, text); + } + break; default: break; } @@ -469,11 +522,16 @@ (void) vp; if (UPNP_SRVTOK_SERVICE == id) { - if (ctx->control_url != NULL && ctx->type != UPNP_SVC_UNKNOWN) { + if ( + ctx->control_url != NULL && + ctx->scpd_url != NULL && + ctx->type != UPNP_SVC_UNKNOWN + ) { upnp_service_t *usd; - usd = upnp_service_alloc(ctx->type, ctx->version, ctx->control_url); - ctx->services = g_slist_prepend(ctx->services, usd); + usd = upnp_service_alloc(ctx->type, ctx->version, + ctx->control_url, ctx->scpd_url); + ctx->services = pslist_prepend(ctx->services, usd); if (GNET_PROPERTY(upnp_debug) > 1) g_debug("UPNP found service %s", upnp_service_to_string(usd)); @@ -481,6 +539,7 @@ ctx->type = UPNP_SVC_UNKNOWN; atom_str_free_null(&ctx->control_url); + atom_str_free_null(&ctx->scpd_url); ctx->in_service = FALSE; } } @@ -488,7 +547,7 @@ /** * Callbacks used to parse services. */ -struct vxml_ops upnp_service_ops = { +static struct vxml_ops upnp_service_ops = { NULL, /* plain_start */ NULL, /* plain_text */ NULL, /* plain_end */ @@ -506,7 +565,7 @@ * * @return a list of upnp_service_t, NULL if no services were found. */ -GSList * +pslist_t * upnp_service_extract(const char *data, size_t len, const char *desc_url) { vxml_parser_t *vp; @@ -525,7 +584,7 @@ e = vxml_parse_callbacks_tokens(vp, &upnp_service_ops, - upnp_service_tokens, G_N_ELEMENTS(upnp_service_tokens), + upnp_service_tokens, N_ITEMS(upnp_service_tokens), &ctx); if (VXML_E_OK == e) { @@ -547,8 +606,209 @@ vxml_parser_free(vp); atom_str_free_null(&ctx.base_url); atom_str_free_null(&ctx.control_url); + atom_str_free_null(&ctx.scpd_url); return ctx.services; } +/** + * Does service provide the action? + */ +bool +upnp_service_can(const upnp_service_t *usd, const char *action) +{ + upnp_service_check(usd); + + if (NULL == usd->api) + return TRUE; /* We don't know, assume it can */ + + return NULL != nv_table_lookup(usd->api, action); +} + +/** + * Marks a given action as unsupported, despite it having been mentionned + * in the SCPD (liar!, you copied and pasted a default SCPD from the specs?). + */ +void +upnp_service_cannot(upnp_service_t *usd, const char *action) +{ + upnp_service_check(usd); + + if (usd->api != NULL) { + if (GNET_PROPERTY(upnp_debug)) { + g_carp("UPNP %s if not really supporting %s()", + upnp_service_to_string(usd), action); + } + + nv_table_remove(usd->api, action); + } +} + +/** + * Is XML node an action name? + */ +static bool +node_is_action_name(const void *node, void *unused_data) +{ + const xnode_t *xn = node; + const char *name = xnode_element_name(xn); + const char *ns = xnode_element_ns(xn); + + (void) unused_data; + + if (NULL == name || NULL == ns || 0 != strcmp(name, UPNP_SVC_NAME)) + return FALSE; + + return 0 == strcmp(ns, UPNP_SVC_NS); +} + +/** + * Record action names that make up the service API. + */ +static void +upnp_service_add_action(void *node, void *data) +{ + xnode_t *xn = node; + upnp_service_t *usd = data; + const char *ns = xnode_element_ns(xn); + const char *name = xnode_element_name(xn); + xnode_t *aname; + const char *action; + + upnp_service_check(usd); + + /* + * We're going to parse the <actionList> element that looks like: + * + * <actionList> + * <action> + * <name>AddPortMapping</name> + * .... + * </action> + * ... + * </actionList> + * + * We're only interested in knowning the names of the services that + * are offered, so we fetch the <name> items that apply to each <action>. + */ + + if (NULL == name || NULL == ns) + return; + + if (0 != strcmp(name, UPNP_SVC_ACTION) || 0 != strcmp(ns, UPNP_SVC_NS)) + return; + + /* + * There are several items in the tree that bear the tag <name>, but the + * one we are interested in will be an immediate child of <action>. + */ + + aname = xnode_tree_find_depth(xn, 1, node_is_action_name, NULL); + + if (NULL == aname) + return; + + action = xnode_first_text(aname); + if (NULL == action) + return; + + /* + * Avoid duplicate actions. + */ + + if (NULL != nv_table_lookup(usd->api, action)) + return; + + /* + * Found a new action name provided by this service. + */ + + if (GNET_PROPERTY(upnp_debug)) { + g_info("UPNP %s supports %s()", upnp_service_to_string(usd), action); + } + + nv_table_insert_nocopy(usd->api, action, NULL, 0); +} + +/** + * Is XML node the root of the action list? + */ +static bool +node_is_actionlist(const void *node, void *unused_data) +{ + const xnode_t *xn = node; + const char *name = xnode_element_name(xn); + const char *ns = xnode_element_ns(xn); + + (void) unused_data; + + if (NULL == name || NULL == ns || 0 != strcmp(name, UPNP_SVC_ACTIONLIST)) + return FALSE; + + return 0 == strcmp(ns, UPNP_SVC_NS); +} + +/** + * Extract the service API from the SCPD XML tree. + * + * @param usd the UPnP service + * @param root the root of the SCPD tree + */ +static void +upnp_service_scpd_extract(upnp_service_t *usd, xnode_t *root) +{ + xnode_t *actions; + + actions = xnode_tree_find_depth(root, 1, node_is_actionlist, NULL); + + if (NULL == actions) { + if (GNET_PROPERTY(upnp_debug)) { + g_warning("UPNP no <%s> element found in SCPD for %s", + UPNP_SVC_ACTIONLIST, upnp_service_to_string(usd)); + } + return; + } + + if (NULL == usd->api) + usd->api = nv_table_make(FALSE); + + xnode_tree_foreach_children(actions, upnp_service_add_action, usd); +} + +/** + * Parse the SCPD to get the service API. + * + * @param usd the UPnP service + * @param data data making up the SCPD + * @param len data length + */ +void +upnp_service_scpd_parse(upnp_service_t *usd, const char *data, size_t len) +{ + vxml_parser_t *vp; + vxml_error_t e; + xnode_t *root; + + upnp_service_check(usd); + g_assert(data != NULL); + g_assert(size_is_non_negative(len)); + + vp = vxml_parser_make("SCPD", VXML_O_STRIP_BLANKS); + vxml_parser_add_data(vp, data, len); + + e = vxml_parse_tree(vp, &root); + + if (VXML_E_OK == e) { + upnp_service_scpd_extract(usd, root); + xnode_tree_free(root); + } else { + if (GNET_PROPERTY(upnp_debug)) { + g_warning("UPNP error parsing XML description from \"%s\": %s", + upnp_service_scpd_url(usd), vxml_parser_strerror(vp, e)); + } + } + + vxml_parser_free(vp); +} + /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/upnp/service.h -> gtk-gnutella-1.1.9.tar.bz2/src/upnp/service.h
Changed
@@ -58,15 +58,21 @@ enum upnp_service_type upnp_service_type(const upnp_service_t *usd); unsigned upnp_service_version(const upnp_service_t *usd); const char *upnp_service_control_url(const upnp_service_t *usd); +const char *upnp_service_scpd_url(const upnp_service_t *usd); -void upnp_service_gslist_free_null(GSList **list_ptr); -GSList *upnp_service_extract(const char *, size_t, const char *desc_url); +struct pslist; + +void upnp_service_pslist_free_null(struct pslist **list_ptr); +struct pslist *upnp_service_extract(const char *, size_t, const char *desc_url); const char *upnp_service_to_string(const upnp_service_t *usd); const char *upnp_service_type_to_string(enum upnp_service_type type); -upnp_service_t *upnp_service_gslist_find( - GSList *services, enum upnp_service_type type); -upnp_service_t *upnp_service_get_wan_connection(GSList *services); -upnp_service_t *upnp_service_get_common_if(GSList *services); +upnp_service_t *upnp_service_pslist_find( + struct pslist *services, enum upnp_service_type type); +upnp_service_t *upnp_service_get_wan_connection(struct pslist *services); +upnp_service_t *upnp_service_get_common_if(struct pslist *services); +void upnp_service_scpd_parse(upnp_service_t *usd, const char *data, size_t len); +bool upnp_service_can(const upnp_service_t *usd, const char *action); +void upnp_service_cannot(upnp_service_t *usd, const char *action); #endif /* _upnp_service_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/upnp/upnp.c -> gtk-gnutella-1.1.9.tar.bz2/src/upnp/upnp.c
Changed
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Raphael Manfredi + * Copyright (c) 2010, 2012, 2015 Raphael Manfredi * *---------------------------------------------------------------------- * This file is part of gtk-gnutella. @@ -33,13 +33,13 @@ * Conceptually, there are two different layers in this single file: * * - The port mapping layer (upnp_map_xxx() routines) - * - The driver layer (UPnP and NAT-PMP) + * - The driver layers (UPnP and NAT-PMP) * * The port mapping layer sits on top of the other two and uses one of the * drivers to publish the mappings. * * @author Raphael Manfredi - * @date 2010 + * @date 2010, 2012, 2015 */ #include "common.h" @@ -51,6 +51,7 @@ #include "natpmp.h" #include "service.h" +#include "core/inet.h" /* For inet_router_configured() */ #include "core/settings.h" /* For listen_addr() */ #include "if/gnet_property.h" @@ -58,10 +59,13 @@ #include "lib/atoms.h" #include "lib/cq.h" -#include "lib/glib-missing.h" +#include "lib/hashing.h" #include "lib/host_addr.h" +#include "lib/htable.h" #include "lib/product.h" /* For product_get_build() */ #include "lib/stacktrace.h" +#include "lib/str.h" +#include "lib/stringify.h" /* For compact_time() and plural() */ #include "lib/walloc.h" #include "lib/override.h" /* Must be the last header included */ @@ -69,9 +73,9 @@ #define UPNP_DISCOVERY_TIMEOUT 3000 /**< Timeout in ms */ #define UPNP_MONITOR_DELAY 300 /**< Every 5 minutes */ #define UPNP_CHECK_DELAY 1800 /**< Every 30 minutes */ -#define UPNP_MAPPING_LIFE 3600 /**< 1 hour */ #define UPNP_MAPPING_CAUTION 120 /**< 2 minutes */ #define UPNP_PUBLISH_RETRY 2 /**< 2 seconds */ +#define UPNP_REDISCOVER 3600 /**< 1 hour (seconds) */ #define UPNP_MONITOR_DELAY_MS (UPNP_MONITOR_DELAY * 1000) #define UPNP_PUBLISH_RETRY_MS (UPNP_PUBLISH_RETRY * 1000) @@ -79,17 +83,24 @@ #define UPNP_UNDEFINED_LEASE ((time_delta_t) -1) +/* + * Monitoring calls we can use on the Internet Gateway Device. + */ +static const char UPNP_GET_TOTAL_RX_PACKETS = "GetTotalPacketsReceived"; +static const char UPNP_GET_STATUS_INFO = "GetStatusInfo"; + /** * The local Internet Gateway Device, for UPnP. */ static struct { upnp_device_t *dev; /**< Our Internet Gateway Device */ upnp_ctrl_t *monitor; /**< Regular monitoring event */ - guint32 rcvd_pkts; /**< Amount of received packets */ + uint32 rcvd_pkts; /**< Amount of received packets */ unsigned delete_pending; /**< Amount of pending mapping deletes */ - time_delta_t lease_time; /**< Lease time to request */ + time_delta_t uptime; /**< Connection uptime */ unsigned discover:1; /**< Force discovery again */ unsigned discovery_done:1; /**< Was discovery completed? */ + unsigned only_permanent:1; /**< Only permanent mappings supported */ } igd; /** @@ -108,7 +119,7 @@ UPNP_M_ANY = 0, /**< Not attempted or no success yet */ UPNP_M_UPNP, /**< UPnP */ UPNP_M_NATPMP, /**< NAT-PMP */ - + UPNP_M_MAX }; @@ -121,7 +132,8 @@ enum upnp_mapping_magic magic; enum upnp_map_proto proto; /**< Network protocol used */ enum upnp_method method; /**< Method used to publish mapping */ - guint16 port; /**< Port to map */ + int refcnt; /**< Reference count */ + uint16 port; /**< Port to map */ cevent_t *install_ev; /**< Periodic install event */ upnp_ctrl_t *rpc; /**< Pending control RPC */ time_delta_t lease_time; /**< Requested lease time */ @@ -135,7 +147,7 @@ g_assert(UPNP_MAPPING_MAGIC == um->magic); } -static GHashTable *upnp_mappings; /**< Tracks requested UPnP mappings */ +static htable_t *upnp_mappings; /**< Tracks requested UPnP mappings */ static host_addr_t upnp_local_addr; /**< Computed local IP address */ static const char UPNP_CONN_IP_ROUTED = "IP_Routed"; @@ -143,6 +155,35 @@ static void upnp_map_publish_all(void); /** + * Increase reference count of an UPnP mapping object. + * + * @return the argument, as a convenience. + */ +static struct upnp_mapping * +upnp_mapping_refcnt_inc(struct upnp_mapping *um) +{ + upnp_mapping_check(um); + + atomic_int_inc(&um->refcnt); + return um; +} + +/** + * Decrease reference count of an UPnP mapping object, freeing it as soon + * as it is no longer referenced. + */ +static void +upnp_mapping_refcnt_dec(struct upnp_mapping *um) +{ + upnp_mapping_check(um); + + if (atomic_int_dec_is_zero(&um->refcnt)) { + cq_cancel(&um->install_ev); + WFREE0(um); + } +} + +/** * The state an Internet Gateway Device must be in to allow NAT. */ const char * @@ -154,7 +195,7 @@ /** * Do we have port mapping deletion in progress? */ -gboolean +bool upnp_delete_pending(void) { if (GNET_PROPERTY(shutdown_debug) > 1) { @@ -162,8 +203,8 @@ if (last != tm_time()) { unsigned nat = natpmp_pending(); g_debug("SHUTDOWN %u pending IDG delete%s and %u NAT-PMP delete%s", - igd.delete_pending, 1 == igd.delete_pending ? "" : "s", - nat, 1 == nat ? "" : "s"); + igd.delete_pending, plural(igd.delete_pending), + nat, plural(nat)); last = tm_time(); } } @@ -182,7 +223,7 @@ static char buf32; if ('\0' == buf0) - gm_snprintf(buf, sizeof buf, "gtk-gnutella/r%u", product_get_build()); + str_bprintf(buf, sizeof buf, "gtk-gnutella/r%u", product_build()); return buf; } @@ -195,7 +236,18 @@ { const struct upnp_mapping *um = p; - return ((unsigned) um->proto * 0xa79dU) ^ (unsigned) um->port; + return integer_hash_fast(um->proto) ^ u16_hash2(um->port); +} + +/** + * Hash a UPnP mapping (secondary hash). + */ +static unsigned +upnp_mapping_hash2(const void *p) +{ + const struct upnp_mapping *um = p; + + return integer_hash2(um->proto) ^ u16_hash(um->port); } /** @@ -214,7 +266,7 @@ * Create a new UPnP mapping record. */ static struct upnp_mapping * -upnp_mapping_alloc(enum upnp_map_proto proto, guint16 port) +upnp_mapping_alloc(enum upnp_map_proto proto, uint16 port) { struct upnp_mapping * um; @@ -223,21 +275,22 @@ um->method = UPNP_M_ANY; um->proto = proto; um->port = port; + um->refcnt = 1; return um; } /** - * Free a UPnP mapping record. + * Free a UPnP mapping record when its reference count drops to zero. */ static void -upnp_mapping_free(struct upnp_mapping *um, gboolean in_shutdown) +upnp_mapping_free(struct upnp_mapping *um, bool in_shutdown) { upnp_mapping_check(um); cq_cancel(&um->install_ev); upnp_ctrl_cancel_null(&um->rpc, !in_shutdown); - WFREE0(um); + upnp_mapping_refcnt_dec(um); } /** @@ -284,7 +337,7 @@ */ static upnp_device_t * upnp_dev_alloc(enum upnp_device_type type, const char *desc_url, - GSList *services, unsigned major, unsigned minor) + pslist_t *services, unsigned major, unsigned minor) { upnp_device_t *ud; @@ -292,7 +345,7 @@ ud->magic = UPNP_DEVICE_MAGIC; ud->type = type; ud->desc_url = atom_str_get(desc_url); - ud->services = g_slist_copy(services); + ud->services = pslist_copy(services); ud->major = major; ud->minor = minor; @@ -308,7 +361,7 @@ upnp_device_check(ud); atom_str_free_null(&ud->desc_url); - upnp_service_gslist_free_null(&ud->services); + upnp_service_pslist_free_null(&ud->services); WFREE0(ud); } @@ -337,7 +390,8 @@ upnp_dev_free_null(&igd.dev); igd.rcvd_pkts = 0; igd.dev = ud; - igd.lease_time = UPNP_MAPPING_LIFE; + igd.uptime = 0; + igd.only_permanent = FALSE; if (GNET_PROPERTY(upnp_debug)) { g_info("UPNP using Internet Gateway Device at \"%s\" (WAN IP: %s)", @@ -347,7 +401,8 @@ gnet_prop_set_boolean_val(PROP_UPNP_POSSIBLE, TRUE); gnet_prop_set_boolean_val(PROP_PORT_MAPPING_POSSIBLE, TRUE); - upnp_map_publish_all(); /* Unconditionally publish all mappings */ + if (GNET_PROPERTY(enable_upnp)) + upnp_map_publish_all(); /* Unconditionally publish all mappings */ } /** @@ -365,7 +420,7 @@ * @return the newly created UPnP device structure. */ upnp_device_t * -upnp_dev_igd_make(const char *desc_url, GSList *services, host_addr_t wan_ip, +upnp_dev_igd_make(const char *desc_url, pslist_t *services, host_addr_t wan_ip, unsigned major, unsigned minor) { upnp_device_t *ud; @@ -382,17 +437,17 @@ static void upnp_check_new_wan_addr(host_addr_t addr) { - gboolean learnt_external_ip = FALSE; + bool learnt_external_ip = FALSE; switch (host_addr_net(addr)) { case NET_TYPE_IPV4: - if (!host_addr_equal(addr, GNET_PROPERTY(local_ip))) { + if (!host_addr_equiv(addr, GNET_PROPERTY(local_ip))) { gnet_prop_set_ip_val(PROP_LOCAL_IP, addr); learnt_external_ip = TRUE; } break; case NET_TYPE_IPV6: - if (!host_addr_equal(addr, GNET_PROPERTY(local_ip6))) { + if (!host_addr_equiv(addr, GNET_PROPERTY(local_ip6))) { gnet_prop_set_ip_val(PROP_LOCAL_IP6, addr); learnt_external_ip = TRUE; } @@ -413,16 +468,16 @@ * @param arg user-supplied argument */ static void -upnp_discovered(GSList *devlist, void *unused_arg) +upnp_discovered(pslist_t *devlist, void *unused_arg) { upnp_device_t *selected = NULL; size_t count; - GSList *sl; + pslist_t *sl; (void) unused_arg; igd.discovery_done = TRUE; - count = g_slist_length(devlist); + count = pslist_length(devlist); if (0 == count) return; @@ -433,15 +488,15 @@ * external IP, if known. */ - GM_SLIST_FOREACH(devlist, sl) { + PSLIST_FOREACH(devlist, sl) { upnp_device_t *ud = sl->data; if (ud->type != UPNP_DEV_IGD) continue; if ( - host_addr_equal(ud->u.igd.wan_ip, listen_addr()) || - host_addr_equal(ud->u.igd.wan_ip, listen_addr6()) + host_addr_equiv(ud->u.igd.wan_ip, listen_addr()) || + host_addr_equiv(ud->u.igd.wan_ip, listen_addr6()) ) { selected = ud; break; @@ -461,10 +516,10 @@ host_addr_to_string(selected->u.igd.wan_ip)); } } else { - selected = sl->data; /* Pick the first */ + selected = devlist->data; /* Pick the first */ if (GNET_PROPERTY(upnp_debug) > 2) { - g_message("UPNP randomly picking device \"%s\" among the " + g_warning("UPNP randomly picking device \"%s\" among the " "%zu discovered, has external IP %s", selected->desc_url, count, host_addr_to_string(selected->u.igd.wan_ip)); @@ -502,13 +557,13 @@ */ if (selected != NULL) - devlist = g_slist_remove(devlist, selected); + devlist = pslist_remove(devlist, selected); - GM_SLIST_FOREACH(devlist, sl) { + PSLIST_FOREACH(devlist, sl) { upnp_dev_free(sl->data); } - gm_slist_free_null(&devlist); + pslist_free_null(&devlist); } /** @@ -519,20 +574,14 @@ * @param arg user-defined argument */ static void -upnp_natpmp_discovered(gboolean ok, natpmp_t *gateway, void *arg) +upnp_natpmp_discovered(bool ok, natpmp_t *gateway, void *arg) { (void) arg; gw.discovery_done = TRUE; - /* - * If there's no NAT-PMP available, see whether we can do UPnP. - */ - - if (!ok) { - upnp_discover(UPNP_DISCOVERY_TIMEOUT, upnp_discovered, NULL); - return; - } + if (!ok) + goto upnp_discover; gw.gateway = gateway; upnp_check_new_wan_addr(natpmp_wan_ip(gateway)); @@ -540,7 +589,23 @@ gnet_prop_set_boolean_val(PROP_NATPMP_POSSIBLE, TRUE); gnet_prop_set_boolean_val(PROP_PORT_MAPPING_POSSIBLE, TRUE); - upnp_map_publish_all(); /* Unconditionally publish all mappings */ + if (GNET_PROPERTY(enable_natpmp)) { + upnp_map_publish_all(); /* Unconditionally publish all mappings */ + return; + } + + /* FALL THROUGH */ + +upnp_discover: + /* + * If there's no NAT-PMP available, or they do not want to publish + * port mappings via NAT-PMP, see whether we can do UPnP. + */ + + if G_UNLIKELY(NULL == upnp_mappings) + return; /* Layer was shutdown, abort */ + + upnp_discover(UPNP_DISCOVERY_TIMEOUT, upnp_discovered, NULL); } /** @@ -549,7 +614,7 @@ static void upnp_launch_discovery(void) { - static gboolean retrying; + static bool retrying; igd.discovery_done = FALSE; gw.discovery_done = FALSE; @@ -560,6 +625,11 @@ * The first time we're trying to discover NAT-PMP, limit the number * of retries before timeouting to 3, so that we can quickly fallback * to UPnP if we get no answers. + * + * Note that we are always attempting to discover port mapping devices, + * even though support for UPnP or NAT-PMP is disabled (meaning we won't + * publish mappings). This is to be able to signal them that we found + * port-mapping devices. */ natpmp_discover(retrying ? 0 : 3, upnp_natpmp_discovered, NULL); @@ -594,6 +664,12 @@ "(error %d => \"%s\")", igd.dev->desc_url, code, upnp_strerror(code)); } + if (UPNP_ERR_INVALID_ACTION == code) { + upnp_service_t *usd; /* They lied about supporting this action */ + + usd = upnp_service_get_common_if(igd.dev->services); + upnp_service_cannot(usd, UPNP_GET_TOTAL_RX_PACKETS); + } } else { if (GNET_PROPERTY(upnp_debug) > 5) { g_debug("UPNP device \"%s\" reports %u received packets", @@ -618,6 +694,64 @@ } /** + * Completion callback for IGD connection status info requests. + * + * @param code UPnP error code, 0 for OK + * @param value returned value structure + * @param size size of structure, for assertions + * @param arg user-supplied callback argument + */ +static void +upnp_status_igd_callback(int code, void *value, size_t size, void *unused_arg) +{ + struct upnp_GetStatusInfo *ret = value; + + (void) unused_arg; + + g_assert(NULL == value || size == sizeof *ret); + + igd.monitor = NULL; /* Mark request completed */ + + if (NULL == igd.dev) + return; /* We lost our IGD */ + + if (NULL == ret) { + if (GNET_PROPERTY(upnp_debug)) { + g_warning("UPNP device \"%s\" reports no status information " + "(error %d => \"%s\")", + igd.dev->desc_url, code, upnp_strerror(code)); + } + if (UPNP_ERR_INVALID_ACTION == code) { + upnp_service_t *usd; /* They lied about supporting this action */ + + usd = upnp_service_get_wan_connection(igd.dev->services); + upnp_service_cannot(usd, UPNP_GET_STATUS_INFO); + } + } else { + if (GNET_PROPERTY(upnp_debug) > 5) { + g_debug("UPNP device \"%s\" reports uptime of %s, status \"%s\"", + igd.dev->desc_url, compact_time(ret->uptime), + ret->connection_status); + } + + /* + * Treat uptime as a monotonically increasing value. + * If it falls (including a possible roll-over once in a while), + * assume the device rebooted. + */ + + if (ret->uptime < igd.uptime) { + if (GNET_PROPERTY(upnp_debug)) { + g_warning("UPNP device \"%s\" may have been rebooted", + igd.dev->desc_url); + } + upnp_map_publish_all(); /* Unconditionally publish mappings */ + } + igd.uptime = ret->uptime; + } +} + +/** * Completion callback for NAT-PMP monitoring. * * @param ok TRUE if succeeded, FALSE if unsuccessful @@ -625,7 +759,7 @@ * @param arg user-defined argument */ static void -upnp_monitor_natpmp_callback(gboolean ok, natpmp_t *gateway, void *unused_arg) +upnp_monitor_natpmp_callback(bool ok, natpmp_t *gateway, void *unused_arg) { (void) unused_arg; @@ -756,7 +890,9 @@ g_assert(igd.dev != NULL); /* - * Monitor total amount of packets received by the IGD. + * Monitor total amount of packets received by the IGD, or the uptime + * of the IGD connection if the former is not available (since it is + * an optional feature). * * The idea is that if we find out the amount is suddenly less than the * previous amount, chances are that the device has been rebooted (or @@ -767,12 +903,39 @@ */ { - upnp_service_t *usd = upnp_service_get_common_if(igd.dev->services); + upnp_service_t *usd; + + /* + * We prefer to monitor the amount of RX packets as opposed to the + * connection uptime because we're interested in detecting device + * reboots. The connection uptime may fluctuate if the WAN signal + * is lost but the device not otherwise rebooted, in which case the + * UPnP mappings should stay active. + */ + + usd = upnp_service_get_common_if(igd.dev->services); + if (upnp_service_can(usd, UPNP_GET_TOTAL_RX_PACKETS)) { + igd.monitor = upnp_ctrl_GetTotalPacketsReceived(usd, + upnp_packets_igd_callback, NULL); + goto done; + } - igd.monitor = upnp_ctrl_GetTotalPacketsReceived(usd, - upnp_packets_igd_callback, NULL); + usd = upnp_service_get_wan_connection(igd.dev->services); + if (upnp_service_can(usd, UPNP_GET_STATUS_INFO)) { + igd.monitor = upnp_ctrl_GetStatusInfo(usd, + upnp_status_igd_callback, NULL); + goto done; + } + + if (GNET_PROPERTY(upnp_debug)) { + g_warning("UPNP cannot monitor device \"%s\", republishing", + igd.dev->desc_url); + } + + upnp_map_publish_all(); /* Unconditionally publish mappings */ } +done: return; rediscover: @@ -793,7 +956,7 @@ * * @return TRUE when we are firewalled and in need for port mappings. */ -static gboolean +static bool upnp_port_mapping_required(void) { if (GNET_PROPERTY(is_firewalled) || GNET_PROPERTY(is_udp_firewalled)) { @@ -806,9 +969,9 @@ } static void -upnp_count_mapping_kv(void *key, void *u_value, void *data) +upnp_count_mapping_kv(const void *key, void *u_value, void *data) { - struct upnp_mapping *um = key; + const struct upnp_mapping *um = key; unsigned *count = data; (void) u_value; @@ -828,7 +991,7 @@ g_assert(upnp_mappings != NULL); count = 0; - g_hash_table_foreach(upnp_mappings, upnp_count_mapping_kv, &count); + htable_foreach(upnp_mappings, upnp_count_mapping_kv, &count); return count; } @@ -844,17 +1007,6 @@ * We don't have any known Internet Gateway Device, look whether * they plugged one in, but not at every wakeup... * - * If we're not firewalled, there's no reason to actively look for an - * IGD yet. - */ - - if (!upnp_port_mapping_required()) { - if (GNET_PROPERTY(upnp_debug) > 5) - g_debug("UPNP no need for port mapping"); - return; - } - - /* * When ``igd.discover'' is TRUE, we force the discovery. * This is used to rediscover devices after monitoring of the known * IGD failed at the last period, in case they replaced the IGD with @@ -873,7 +1025,13 @@ counter++; } - if (0 == counter % 12) { + /* + * We're scheduled once every UPNP_MONITOR_DELAY seconds, and we wish + * to rediscover only once every UPNP_REDISCOVER seconds, hence the + * modulo check below. + */ + + if (0 == counter % (UPNP_REDISCOVER / UPNP_MONITOR_DELAY)) { if (GNET_PROPERTY(upnp_debug) > 1) { g_debug("UPNP initiating discovery"); } @@ -898,8 +1056,8 @@ * Callout queue periodic event to monitor presence of the Internet Gateway * Device or the NAT-PMP gateway we are using and detect configuration changes. */ -static gboolean -upnp_monitor_drivers(gpointer unused_obj) +static bool +upnp_monitor_drivers(void *unused_obj) { (void) unused_obj; @@ -966,7 +1124,7 @@ */ gnet_prop_set_boolean_val(PROP_PORT_MAPPING_SUCCESSFUL, - g_hash_table_size(upnp_mappings) == upnp_published_mappings()); + htable_count(upnp_mappings) == upnp_published_mappings()); /* * Publish mappings if needed. @@ -997,6 +1155,8 @@ g_message("UPNP successfully published UPnP mapping for %s port %u", upnp_map_proto_to_string(um->proto), um->port); } + if (!um->published) + inet_router_configured(); /* First time we're publishing */ um->published = TRUE; um->method = UPNP_M_UPNP; } else { @@ -1011,23 +1171,33 @@ um->lease_time = UPNP_UNDEFINED_LEASE; /* - * Handle devices supporting only permanent leases. - * - * Otherwise, on publishing error, retry periodically every - * UPNP_CHECK_DELAY seconds. + * The um->install_ev field can be NULL if we decided to remove the + * mapping already, and this is a callback happening on an object + * that we are going to remove. */ - if (UPNP_ERR_ONLY_PERMANENT_LEASE == code && 0 != um->lease_time) { - igd.lease_time = 0; - um->lease_time = 0; - cq_resched(um->install_ev, 1); /* Re-publish immediately */ - } else { - cq_resched(um->install_ev, UPNP_CHECK_DELAY_MS); + if (um->install_ev != NULL) { + /* + * Handle devices supporting only permanent leases. + * + * Otherwise, on publishing error, retry periodically every + * UPNP_CHECK_DELAY seconds. + */ + + if (UPNP_ERR_ONLY_PERMANENT_LEASE == code && 0 != um->lease_time) { + igd.only_permanent = TRUE; + um->lease_time = 0; + cq_resched(um->install_ev, 1); /* Re-publish immediately */ + } else { + cq_resched(um->install_ev, UPNP_CHECK_DELAY_MS); + } } } gnet_prop_set_boolean_val(PROP_PORT_MAPPING_SUCCESSFUL, - g_hash_table_size(upnp_mappings) == upnp_published_mappings()); + htable_count(upnp_mappings) == upnp_published_mappings()); + + upnp_mapping_refcnt_dec(um); } /** @@ -1035,7 +1205,7 @@ */ static void upnp_map_natpmp_publish_reply(int code, - guint16 port, unsigned lifetime, void *arg) + uint16 port, unsigned lifetime, void *arg) { struct upnp_mapping *um = arg; @@ -1047,38 +1217,45 @@ "for %s port %u, lease = %u s", upnp_map_proto_to_string(um->proto), um->port, lifetime); } + if (!um->published) + inet_router_configured(); /* First time we're publishing */ um->published = TRUE; um->method = UPNP_M_NATPMP; - cq_resched(um->install_ev, lifetime / 2 * 1000); + if (um->install_ev != NULL) + cq_resched(um->install_ev, lifetime / 2 * 1000); } else { if (GNET_PROPERTY(upnp_debug)) { g_warning("UPNP could not publish NAT-PMP mapping for %s port %u: " - "%d => \"%s\"", + "%d => \"%s\" (returned port=%u)", upnp_map_proto_to_string(um->proto), um->port, - code, natpmp_strerror(code)); + code, natpmp_strerror(code), port); } um->published = FALSE; um->method = UPNP_M_ANY; um->lease_time = UPNP_UNDEFINED_LEASE; - cq_resched(um->install_ev, UPNP_CHECK_DELAY_MS); + if (um->install_ev != NULL) + cq_resched(um->install_ev, UPNP_CHECK_DELAY_MS); } gnet_prop_set_boolean_val(PROP_PORT_MAPPING_SUCCESSFUL, - g_hash_table_size(upnp_mappings) == upnp_published_mappings()); + htable_count(upnp_mappings) == upnp_published_mappings()); + + upnp_mapping_refcnt_dec(um); } /** * Callout queue callback to publish a UPnP mapping to the IGD. */ static void -upnp_map_publish(cqueue_t *unused_cq, void *obj) +upnp_map_publish(cqueue_t *cq, void *obj) { struct upnp_mapping *um = obj; int delay; - (void) unused_cq; upnp_mapping_check(um); + cq_zero(cq, &um->install_ev); + /* * Re-install callback for next time. * @@ -1127,20 +1304,6 @@ return; } - /* - * Mappings can be recorded at startup before we had a chance to - * discover the NAT device, which is why we retry more often at the - * beginning (every UPNP_PUBLISH_RETRY_MS for a while). - */ - - if (NULL == igd.dev && NULL == gw.gateway) { - if (GNET_PROPERTY(upnp_debug) > 5) { - g_message("UPNP no device yet to publish mapping for %s port %u", - upnp_map_proto_to_string(um->proto), um->port); - } - return; - } - if (GNET_PROPERTY(upnp_debug) > 2) { g_message("UPNP publishing %s mapping for %s port %u", upnp_method_to_string(um->method), @@ -1152,24 +1315,37 @@ */ if (gw.gateway != NULL && GNET_PROPERTY(enable_natpmp)) { - if (UPNP_UNDEFINED_LEASE == um->lease_time) - um->lease_time = UPNP_MAPPING_LIFE; + /* + * No permanent mappings with NAT-PMP. + */ + + um->lease_time = GNET_PROPERTY(upnp_mapping_lease_time); + um->lease_time = MAX(UPNP_MAPPING_CAUTION, um->lease_time); natpmp_map(gw.gateway, um->proto, um->port, um->lease_time, - upnp_map_natpmp_publish_reply, um); - } else { + upnp_map_natpmp_publish_reply, upnp_mapping_refcnt_inc(um)); + } else if (igd.dev != NULL) { const upnp_service_t *usd; usd = upnp_service_get_wan_connection(igd.dev->services); upnp_ctrl_cancel_null(&um->rpc, TRUE); - if (UPNP_UNDEFINED_LEASE == um->lease_time) - um->lease_time = igd.lease_time; + /* + * Impose minimal UPNP_MAPPING_CAUTION lease time if not permanent. + * When the IGD only supports permanent mappings, there is no need + * to request anything else! + */ + + um->lease_time = igd.only_permanent ? 0 : + GNET_PROPERTY(upnp_mapping_lease_time); + + if (um->lease_time != 0) + um->lease_time = MAX(UPNP_MAPPING_CAUTION, um->lease_time); um->rpc = upnp_ctrl_AddPortMapping(usd, um->proto, um->port, upnp_get_local_addr(), um->port, upnp_mapping_description(), um->lease_time, - upnp_map_publish_reply, um); + upnp_map_publish_reply, upnp_mapping_refcnt_inc(um)); if (NULL == um->rpc) { if (GNET_PROPERTY(upnp_debug)) { @@ -1177,6 +1353,18 @@ "UPNP could not launch UPnP publishing for %s port %u", upnp_map_proto_to_string(um->proto), um->port); } + upnp_mapping_refcnt_dec(um); + } + } else { + /* + * Mappings can be recorded at startup before we had a chance to + * discover the NAT device, which is why we retry more often at the + * beginning (every UPNP_PUBLISH_RETRY_MS for a while). + */ + + if (GNET_PROPERTY(upnp_debug) > 5) { + g_message("UPNP no device yet to publish mapping for %s port %u", + upnp_map_proto_to_string(um->proto), um->port); } } } @@ -1185,7 +1373,7 @@ * Record port mapping addition. */ static void -upnp_map_add(enum upnp_map_proto proto, guint16 port) +upnp_map_add(enum upnp_map_proto proto, uint16 port) { struct upnp_mapping key; struct upnp_mapping *um; @@ -1193,7 +1381,7 @@ key.proto = proto; key.port = port; - if (gm_hash_table_contains(upnp_mappings, &key)) + if (htable_contains(upnp_mappings, &key)) return; /* Already known */ /* @@ -1209,7 +1397,7 @@ um->install_ev = cq_main_insert(1, upnp_map_publish, um); um->lease_time = UPNP_UNDEFINED_LEASE; - g_hash_table_insert(upnp_mappings, um, um); + htable_insert(upnp_mappings, um, upnp_mapping_refcnt_inc(um)); } /** @@ -1246,16 +1434,13 @@ /** * Unpublish port mapping. * - * @return TRUE if we can dispose of the mapping record. + * @return TRUE if we can dispose of the mapping record (no RPC issued here). */ -static gboolean +static bool upnp_map_unpublish(struct upnp_mapping *um) { upnp_mapping_check(um); - if (!um->published) - return TRUE; /* Nothing to do, was never published */ - if (GNET_PROPERTY(upnp_debug) > 1) { g_debug("UPNP removing %spublished %s mapping for %s port %u", um->published ? "" : "un", @@ -1263,6 +1448,9 @@ upnp_map_proto_to_string(um->proto), um->port); } + if (!um->published) + return TRUE; /* Nothing to do, was never published */ + if (UPNP_M_NATPMP == um->method) { if (NULL == gw.gateway) { g_warning("UPNP cannot remove published mapping " @@ -1290,12 +1478,16 @@ /* Freeing of ``um'' will happen in upnp_map_delete_reply() */ um->rpc = upnp_ctrl_DeletePortMapping(usd, um->proto, um->port, - upnp_map_delete_reply, um); + upnp_map_delete_reply, upnp_mapping_refcnt_inc(um)); - if (um->rpc != NULL) + if (um->rpc != NULL) { igd.delete_pending++; + return FALSE; /* RPC issued that should not be cancelled */ + } + + upnp_mapping_refcnt_dec(um); - return FALSE; /* ``um'' still needed for UPnP callback */ + return TRUE; /* No RPC launched */ } g_assert_not_reached(); @@ -1305,7 +1497,7 @@ * Remove port mapping. */ static void -upnp_map_remove(enum upnp_map_proto proto, guint16 port) +upnp_map_remove(enum upnp_map_proto proto, uint16 port) { struct upnp_mapping key; struct upnp_mapping *um; @@ -1313,7 +1505,7 @@ key.proto = proto; key.port = port; - um = g_hash_table_lookup(upnp_mappings, &key); + um = htable_lookup(upnp_mappings, &key); if (NULL == um) { if (GNET_PROPERTY(upnp_debug)) { @@ -1322,10 +1514,12 @@ } } else { upnp_mapping_check(um); - g_hash_table_remove(upnp_mappings, um); + htable_remove(upnp_mappings, um); if (upnp_map_unpublish(um)) { upnp_mapping_free(um, FALSE); + } else { + upnp_mapping_refcnt_dec(um); } } } @@ -1362,15 +1556,17 @@ um->published = FALSE; um->lease_time = UPNP_UNDEFINED_LEASE; + + upnp_mapping_refcnt_dec(um); } /** * Remove published mapping of the specified kind. */ static void -upnp_remove_mapping_kv(void *key, void *u_value, void *data) +upnp_remove_mapping_kv(const void *key, void *u_value, void *data) { - struct upnp_mapping *um = key; + struct upnp_mapping *um = deconstify_gpointer(key); enum upnp_method method = pointer_to_int(data); (void) u_value; @@ -1391,13 +1587,14 @@ upnp_ctrl_cancel_null(&um->rpc, TRUE); um->rpc = upnp_ctrl_DeletePortMapping(usd, um->proto, um->port, - upnp_map_mapping_deleted, um); + upnp_map_mapping_deleted, upnp_mapping_refcnt_inc(um)); if (NULL == um->rpc) { if (GNET_PROPERTY(upnp_debug)) { g_warning("UPNP cannot remove UPnP mapping for %s port %u", upnp_map_proto_to_string(um->proto), um->port); } + upnp_mapping_refcnt_dec(um); } } else { /* Advisory unmapping, no callback on completion or error */ @@ -1414,7 +1611,7 @@ upnp_disabled(void) { if (igd.dev != NULL) { - g_hash_table_foreach(upnp_mappings, upnp_remove_mapping_kv, + htable_foreach(upnp_mappings, upnp_remove_mapping_kv, int_to_pointer(UPNP_M_UPNP)); gnet_prop_set_boolean_val(PROP_PORT_MAPPING_SUCCESSFUL, FALSE); } @@ -1436,7 +1633,7 @@ upnp_natpmp_disabled(void) { if (gw.gateway != NULL) { - g_hash_table_foreach(upnp_mappings, upnp_remove_mapping_kv, + htable_foreach(upnp_mappings, upnp_remove_mapping_kv, int_to_pointer(UPNP_M_NATPMP)); gnet_prop_set_boolean_val(PROP_PORT_MAPPING_SUCCESSFUL, FALSE); } @@ -1455,9 +1652,9 @@ * before. */ static void -upnp_publish_mapping_kv(void *key, void *u_value, void *u_data) +upnp_publish_mapping_kv(const void *key, void *u_value, void *u_data) { - struct upnp_mapping *um = key; + struct upnp_mapping *um = deconstify_gpointer(key); (void) u_value; (void) u_data; @@ -1485,14 +1682,14 @@ { g_assert(igd.dev != NULL || gw.gateway != NULL); - g_hash_table_foreach(upnp_mappings, upnp_publish_mapping_kv, NULL); + htable_foreach(upnp_mappings, upnp_publish_mapping_kv, NULL); } /** * Add TCP port redirection on the IGD device to this machine. */ void -upnp_map_tcp(guint16 port) +upnp_map_tcp(uint16 port) { upnp_map_add(UPNP_MAP_TCP, port); } @@ -1501,7 +1698,7 @@ * Add UDP port redirection on the IGD device to this machine. */ void -upnp_map_udp(guint16 port) +upnp_map_udp(uint16 port) { upnp_map_add(UPNP_MAP_UDP, port); } @@ -1510,7 +1707,7 @@ * Remove TCP port redirection on the IGD device. */ void -upnp_unmap_tcp(guint16 port) +upnp_unmap_tcp(uint16 port) { upnp_map_remove(UPNP_MAP_TCP, port); } @@ -1519,7 +1716,7 @@ * Remove UDP port redirection on the IGD device. */ void -upnp_unmap_udp(guint16 port) +upnp_unmap_udp(uint16 port) { upnp_map_remove(UPNP_MAP_UDP, port); } @@ -1530,7 +1727,7 @@ void upnp_set_local_addr(host_addr_t addr) { - if (host_addr_equal(addr, upnp_local_addr)) + if (host_addr_equiv(addr, upnp_local_addr)) return; if (GNET_PROPERTY(upnp_debug) > 1) @@ -1559,7 +1756,8 @@ cq_periodic_main_add(UPNP_MONITOR_DELAY_MS, upnp_monitor_drivers, NULL); - upnp_mappings = g_hash_table_new(upnp_mapping_hash, upnp_mapping_eq); + upnp_mappings = htable_create_any(upnp_mapping_hash, + upnp_mapping_hash2, upnp_mapping_eq); } /** @@ -1575,10 +1773,10 @@ * Free mappings still present, warning about them since normal cleanup * should remove them. */ -static gboolean -upnp_free_mapping_kv(void *key, void *u_value, void *u_data) +static bool +upnp_free_mapping_kv(const void *key, void *u_value, void *u_data) { - struct upnp_mapping *um = key; + struct upnp_mapping *um = deconstify_gpointer(key); (void) u_value; (void) u_data; @@ -1603,8 +1801,8 @@ upnp_dev_free_null(&igd.dev); natpmp_free_null(&gw.gateway); upnp_ctrl_cancel_null(&igd.monitor, FALSE); - g_hash_table_foreach_remove(upnp_mappings, upnp_free_mapping_kv, NULL); - gm_hash_table_destroy_null(&upnp_mappings); + htable_foreach_remove(upnp_mappings, upnp_free_mapping_kv, NULL); + htable_free_null(&upnp_mappings); } /* vi: set ts=4 sw=4 cindent: */
View file
gtk-gnutella-0.98.2.tar.bz2/src/upnp/upnp.h -> gtk-gnutella-1.1.9.tar.bz2/src/upnp/upnp.h
Changed
@@ -37,6 +37,7 @@ #include "common.h" #include "lib/host_addr.h" +#include "lib/pslist.h" /** * Supported UPnP architecture. @@ -44,6 +45,11 @@ #define UPNP_MAJOR 1 #define UPNP_MINOR 0 +/** + * Default port mapping lease time. + */ +#define UPNP_MAPPING_LIFE 3600 /**< 1 hour */ + #ifdef UPNP_SOURCES /* * The following definitions are only visible within the upnp/ directory, @@ -80,7 +86,7 @@ enum upnp_device_magic magic; /**< Magic number */ enum upnp_device_type type; /**< Device type */ const char *desc_url; /**< Description URL (atom) */ - GSList *services; /**< List of upnp_service_t offered */ + pslist_t *services; /**< List of upnp_service_t offered */ union { struct { /**< Internet Gateway Device */ host_addr_t wan_ip; /**< WAN IP address (external) */ @@ -101,7 +107,7 @@ * These routines are only visible within the upnp/ source directory. */ -upnp_device_t *upnp_dev_igd_make(const char *desc_url, GSList *services, +upnp_device_t *upnp_dev_igd_make(const char *desc_url, pslist_t *services, host_addr_t wan_ip, unsigned major, unsigned minor); void upnp_dev_free(upnp_device_t *ud); void upnp_dev_free_null(upnp_device_t **ud_ptr); @@ -120,16 +126,16 @@ void upnp_disabled(void); void upnp_natpmp_disabled(void); -void upnp_map_tcp(guint16 port); -void upnp_map_udp(guint16 port); -void upnp_unmap_tcp(guint16 port); -void upnp_unmap_udp(guint16 port); +void upnp_map_tcp(uint16 port); +void upnp_map_udp(uint16 port); +void upnp_unmap_tcp(uint16 port); +void upnp_unmap_udp(uint16 port); host_addr_t upnp_get_local_addr(void); void upnp_set_local_addr(host_addr_t addr); const char *upnp_igd_ip_routed(void); -gboolean upnp_delete_pending(void); +bool upnp_delete_pending(void); #endif /* _upnp_upnp_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/xml/Jmakefile -> gtk-gnutella-1.1.9.tar.bz2/src/xml/Jmakefile
Changed
@@ -28,6 +28,7 @@ ;# $Id: Jmakefile 11185 2006-06-25 22:00:15Z cbiere $ SRC = \ + gen-vxml.c \ vxml.c \ xattr.c \ xfmt.c \ @@ -45,6 +46,13 @@ CFLAGS = -I$(TOP) -I.. $(GLIB_CFLAGS) -DCURDIR=$(CURRENT) DPFLAGS = $(CFLAGS) +IF = ../if + +#define LinkGenInterface(file) @!\ +LinkSourceFileAlias(file, $(IF)/gen, gen-file) + +LinkGenInterface(vxml.c) + NormalLibraryTarget(xml, $(SRC), $(OBJ)) DependTarget()
View file
gtk-gnutella-0.98.2.tar.bz2/src/xml/Makefile.SH -> gtk-gnutella-1.1.9.tar.bz2/src/xml/Makefile.SH
Changed
@@ -1,5 +1,5 @@ -: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-75 -: $X-Id: Jmake.tmpl 69 2011-01-09 13:57:07Z rmanfredi $ +: Makefile.SH generated from Jmake.tmpl and Jmakefile jmake 3.5-195 +: $X-Id: Jmake.tmpl 183 2015-04-12 09:48:11Z rmanfredi $ case $CONFIG in '') @@ -39,8 +39,9 @@ AR = ar rc CC = $cc CTAGS = ctags -JCFLAGS = \$(CFLAGS) $optimize $ccflags $large +JCFLAGS = \$(CFLAGS) $optimize $pthread $ccflags $large JCPPFLAGS = $cppflags +LN = $ln MKDEP = $mkdep \$(DPFLAGS) \$(JCPPFLAGS) -- MV = $mv RANLIB = $ranlib @@ -66,7 +67,7 @@ $spitshell >>Makefile <<'!NO!SUBS!' ######################################################################## # Jmake rules for building libraries, programs, scripts, and data files -# $X-Id: Jmake.rules 64 2011-01-01 21:57:17Z rmanfredi $ +# $X-Id: Jmake.rules 195 2015-04-27 21:30:17Z rmanfredi $ ######################################################################## # Force 'make depend' to be performed first -- do not edit @@ -81,12 +82,14 @@ # $X-Id: Jmakefile 11185 2006-06-25 22:00:15Z cbiere $ SRC = \ + gen-vxml.c \ vxml.c \ xattr.c \ xfmt.c \ xnode.c OBJ = \ + gen-vxml.o \ vxml.o \ xattr.o \ xfmt.o \ @@ -96,6 +99,17 @@ CFLAGS = -I$(TOP) -I.. $(GLIB_CFLAGS) -DCURDIR=$(CURRENT) DPFLAGS = $(CFLAGS) +IF = ../if + +gen-vxml.c: $(IF)/gen/vxml.c + $(RM) -f $@ + $(LN) $? $@ + +local_depend:: gen-vxml.c + +local_realclean:: + $(RM) -f gen-vxml.c + all:: libxml.a local_realclean:: @@ -142,6 +156,11 @@ $(RM) Makefile config.sh install:: local_install + @exit 0 + +install-strip:: local_install-strip + @exit 0 + install.man:: maybe_install.man deinstall:: local_deinstall deinstall.man:: maybe_deinstall.man @@ -180,6 +199,9 @@ local_install:: @echo "install in $(CURRENT) done." +local_install-strip:: + @echo "install (strip) in $(CURRENT) done." + local_deinstall:: @echo "deinstall in $(CURRENT) done."
View file
gtk-gnutella-0.98.2.tar.bz2/src/xml/vxml.c -> gtk-gnutella-1.1.9.tar.bz2/src/xml/vxml.c
Changed
@@ -38,21 +38,27 @@ #include "xfmt.h" #include "xnode.h" -#include "lib/atoms.h" #include "lib/ascii.h" +#include "lib/atoms.h" +#include "lib/buf.h" #include "lib/endian.h" -#include "lib/glib-missing.h" -#include "lib/misc.h" #include "lib/halloc.h" +#include "lib/misc.h" #include "lib/nv.h" -#include "lib/parse.h" #include "lib/ostream.h" +#include "lib/parse.h" +#include "lib/plist.h" +#include "lib/pslist.h" #include "lib/slist.h" +#include "lib/str.h" +#include "lib/stringify.h" #include "lib/symtab.h" +#include "lib/tokenizer.h" #include "lib/unsigned.h" #include "lib/utf8.h" #include "lib/vmm.h" #include "lib/walloc.h" +#include "lib/xmalloc.h" #include "lib/override.h" /* Must be the last header included */ @@ -77,7 +83,7 @@ * @param len the length of the string * @param retlen where the byte length of the returned character is written */ -typedef guint32 (*vxml_reader_t)(const char *str, size_t len, guint *retlen); +typedef uint32 (*vxml_reader_t)(const char *str, size_t len, uint *retlen); enum vxml_buffer_type { VXML_BUFFER_MEMORY, @@ -250,8 +256,8 @@ enum vxml_parser_magic magic; const char *name; /**< Parser name (static string) */ const char *charset; /**< Document's charset (atom) */ - GSList *input; /**< List of input buffers to parse */ - GList *path; /**< Path (list of vxml_path_entry) */ + pslist_t *input; /**< List of input buffers to parse */ + plist_t *path; /**< Path (list of vxml_path_entry) */ nv_table_t *tokens; /**< For element tokenization */ nv_table_t *entities; /**< Entities defined in document */ nv_table_t *pe_entities; /**< Entities defined in <!DOCTYPE...> */ @@ -262,7 +268,7 @@ char *user_error; /**< User-defined error string */ struct vxml_output out; /**< Output parsing buffer (UTF-8) */ struct vxml_output entity; /**< Entity parsing buffer (UTF-8) */ - guint32 unreadVXML_LOOKAHEAD; /**< Unread character stack */ + uint32 unreadVXML_LOOKAHEAD; /**< Unread character stack */ size_t unread_offset; /**< Current offset in unread */ enum vxml_encoding encoding; /**< Character encoding */ enum vxml_encsrc encsource; /**< How we determined character encoding */ @@ -275,11 +281,11 @@ unsigned ignores; /**< Counts nested ignored DTD sections */ unsigned expansions; /**< Counts stacked entity expansions */ unsigned last_uc_generation; /**< Generation # of last character */ - guint32 last_uc; /**< Last read character */ - guint32 flags; /**< Parsing flags */ - guint32 options; /**< Parsing options */ - guint8 major; /**< XML version (major) */ - guint8 minor; /**< XML version (minor) */ + uint32 last_uc; /**< Last read character */ + uint32 flags; /**< Parsing flags */ + uint32 options; /**< Parsing options */ + uint8 major; /**< XML version (major) */ + uint8 minor; /**< XML version (minor) */ unsigned elem_token_valid:1; /**< Field "elem_token" is valid */ unsigned elem_no_content:1; /**< Element has no content (no end tag) */ unsigned standalone:1; /**< Is document standalone? */ @@ -303,7 +309,7 @@ #define VXML_F_XML_DECL (1 << 3) /**< Set when "<?xml... ?>" was seen */ #define VXML_F_SUBPARSE (1 << 4) /**< Can issue sub-parsing */ -static guint32 vxml_debug; +static uint32 vxml_debug; /** * Important character constants @@ -346,7 +352,7 @@ /** * Default entities. */ -static struct vxml_parser_token vxml_default_entities = { +static tokenizer_t vxml_default_entities = { /* Sorted array */ { "amp", VXC_AMP }, /* '&' */ { "apos", VXC_APOS }, /* "'" */ @@ -383,7 +389,7 @@ /** * Declaration tokens. */ -static struct vxml_parser_token vxml_declaration_tokens = { +static tokenizer_t vxml_declaration_tokens = { /* Sorted array */ { "ATTLIST", VXT_ATTLIST }, { "DOCTYPE", VXT_DOCTYPE }, @@ -394,7 +400,7 @@ /** * Miscellaneous tokens. */ -static struct vxml_parser_token vxml_misc_tokens = { +static tokenizer_t vxml_misc_tokens = { /* Sorted array */ { "ANY", VXT_ANY }, { "CDATA", VXT_CDATA }, @@ -409,7 +415,7 @@ /** * Immediate tokens (introduced by a leading '#' character). */ -static struct vxml_parser_token vxml_immediate_tokens = { +static tokenizer_t vxml_immediate_tokens = { /* Sorted array */ { "FIXED", VXT_FIXED }, { "IMPLIED", VXT_IMPLIED }, @@ -419,8 +425,8 @@ static const char *vxml_token_stringsVXT_MAX_TOKEN; -static gboolean vxml_handle_decl(vxml_parser_t *vp, gboolean doctype); -static gboolean vxml_handle_special(vxml_parser_t *vp, gboolean dtd); +static bool vxml_handle_decl(vxml_parser_t *vp, bool doctype); +static bool vxml_handle_special(vxml_parser_t *vp, bool dtd); static void vxml_parser_namespace_global(vxml_parser_t *vp, const char *ns, const char *uri); @@ -428,7 +434,7 @@ * Set the VXML debug level. */ void -set_vxml_debug(guint32 level) +set_vxml_debug(uint32 level) { vxml_debug = level; } @@ -436,8 +442,8 @@ /** * Are we debugging the VXML layer at the specified level or above? */ -gboolean -vxml_debugging(guint32 level) +bool +vxml_debugging(uint32 level) { return vxml_debug > level; } @@ -455,11 +461,13 @@ static const char * vxml_parser_where(const vxml_parser_t *vp) { - static char buf2048; + buf_t *b = buf_private(G_STRFUNC, 2048); + char *buf = buf_data(b); + size_t bufsz = buf_size(b); size_t rw = 0; - GList *rpath, *rp; + plist_t *rpath, *rp; - rpath = rp = g_list_reverse(g_list_copy(vp->path)); + rpath = rp = plist_reverse(plist_copy(vp->path)); /* * If sub-parsing an XML fragment, strip the leading part of the @@ -468,11 +476,11 @@ if (vp->glob.depth != vp->loc.depth) { g_assert(vp->glob.depth >= vp->loc.depth); - rp = g_list_nth(rp, vp->glob.depth - vp->loc.depth); + rp = plist_nth(rp, vp->glob.depth - vp->loc.depth); } if (NULL == rp) { - gm_snprintf(buf, sizeof buf, "/"); + buf_printf(b, "/"); } else { while (rp != NULL) { struct vxml_path_entry *pe = rp->data; @@ -483,15 +491,15 @@ element = pe->element; children = pe->children; - rp = g_list_next(rp); + rp = plist_next(rp); - rw += gm_snprintf(&bufrw, sizeof buf - rw, "/%s", element); + rw += str_bprintf(&bufrw, bufsz - rw, "/%s", element); if (children > ((NULL == rp) ? 0 : 1)) - rw += gm_snprintf(&bufrw, sizeof buf - rw, "%u", children); + rw += str_bprintf(&bufrw, bufsz - rw, "%u", children); } } - g_list_free(rpath); + plist_free(rpath); return buf; } @@ -499,17 +507,14 @@ /** * Emit unconditional warning. */ -static void vxml_parser_warn(const vxml_parser_t *vp, - const char *format, ...) G_GNUC_PRINTF(2, 3); - -static void +static void G_PRINTF(2, 3) vxml_parser_warn(const vxml_parser_t *vp, const char *format, ...) { va_list args; char buf1024; va_start(args, format); - gm_vsnprintf(buf, sizeof buf, format, args); + str_vbprintf(buf, sizeof buf, format, args); va_end(args); g_warning("VXML \"%s\" %soffset %zu, line %zu, at %s: %s", @@ -522,17 +527,14 @@ /** * Emit debugging message. */ -static void vxml_parser_debug(const vxml_parser_t *vp, - const char *format, ...) G_GNUC_PRINTF(2, 3); - -static void +static void G_PRINTF(2, 3) vxml_parser_debug(const vxml_parser_t *vp, const char *format, ...) { va_list args; char buf1024; va_start(args, format); - gm_vsnprintf(buf, sizeof buf, format, args); + str_vbprintf(buf, sizeof buf, format, args); va_end(args); g_debug("VXML \"%s\" %soffset %zu, line %zu, at %s: %s", @@ -614,7 +616,7 @@ g_assert(vp->path != NULL); if (vxml_parser_depth(vp) > 1) { - struct vxml_path_entry *pe = g_list_next(vp->path)->data; + struct vxml_path_entry *pe = plist_next(vp->path)->data; vxml_path_entry_check(pe); return pe->element; @@ -642,10 +644,10 @@ if (n >= vxml_parser_depth(vp)) { return NULL; } else { - GList *l; + plist_t *l; struct vxml_path_entry *pe; - l = g_list_nth(vp->path, n); + l = plist_nth(vp->path, n); pe = NULL == l ? NULL : l->data; if (pe != NULL) { @@ -748,7 +750,7 @@ */ static struct vxml_buffer * vxml_buffer_alloc(unsigned gen, const char *data, size_t length, - gboolean allocated, gboolean user, vxml_reader_t reader) + bool allocated, bool user, vxml_reader_t reader) { struct vxml_buffer *vb; struct vxml_buffer_memory *m; @@ -762,7 +764,7 @@ WALLOC0(vb->u.m); m = vb->u.m; - m->vb_rptr = m->data = deconstify_gpointer(data); + m->vb_rptr = m->data = deconstify_pointer(data); m->length = length; m->vb_end = data + length; m->reader = reader; @@ -842,7 +844,7 @@ * * @return TRUE if OK, FALSE on error. */ -static gboolean +static bool vxml_buffer_convert_to_utf8(struct vxml_buffer *vb, const char *charset) { char *converted; @@ -972,7 +974,9 @@ memmove(f->data, m->vb_rptr, held); r = fread(ptr_add_offset(f->data, held), 1, f->len - held, f->fd); + m->vb_rptr = f->data; m->vb_end = ptr_add_offset(f->data, held + r); + G_PREFETCH_HI_R(m->vb_rptr); } else { /* * Buffer was converted to UTF-8, we need to convert any more data @@ -1091,7 +1095,7 @@ * Append character read as UTF-8 into the specified output buffer. */ static void -vxml_output_append(struct vxml_output *vo, guint32 uc) +vxml_output_append(struct vxml_output *vo, uint32 uc) { unsigned len; @@ -1134,7 +1138,7 @@ * @return a new XML parser. */ vxml_parser_t * -vxml_parser_make(const char *name, guint32 options) +vxml_parser_make(const char *name, uint32 options) { vxml_parser_t *vp; @@ -1165,20 +1169,20 @@ void vxml_parser_free(vxml_parser_t *vp) { - GSList *sl; - GList *l; + pslist_t *sl; + plist_t *l; vxml_parser_check(vp); - GM_SLIST_FOREACH(vp->input, sl) { + PSLIST_FOREACH(vp->input, sl) { vxml_buffer_free(sl->data); } - gm_slist_free_null(&vp->input); + pslist_free_null(&vp->input); - GM_LIST_FOREACH(vp->path, l) { + PLIST_FOREACH(vp->path, l) { vxml_path_entry_free(l->data); } - gm_list_free_null(&vp->path); + plist_free_null(&vp->path); nv_table_free_null(&vp->tokens); nv_table_free_null(&vp->entities); nv_table_free_null(&vp->pe_entities); @@ -1232,7 +1236,7 @@ */ vb = vxml_buffer_alloc(vp->generation++, data, length, FALSE, TRUE, NULL); - vp->input = g_slist_append(vp->input, vb); + vp->input = pslist_append(vp->input, vb); } /** @@ -1250,7 +1254,7 @@ g_assert(fd != NULL); vb = vxml_buffer_file(fd); - vp->input = g_slist_append(vp->input, vb); + vp->input = pslist_append(vp->input, vb); } /** @@ -1369,67 +1373,6 @@ } /** - * Translates errors into English. - */ -G_GNUC_COLD const char * -vxml_strerror(vxml_error_t error) -{ - switch (error) { - case VXML_E_OK: return "OK"; - case VXML_E_UNSUPPORTED_BYTE_ORDER: return "Unsupported byte order"; - case VXML_E_UNSUPPORTED_CHARSET: return "Unsupported character set"; - case VXML_E_TRUNCATED_INPUT: return "Truncated input stream"; - case VXML_E_EXPECTED_NAME_START: return "Expected a valid name start"; - case VXML_E_INVALID_CHAR_REF: return "Invalid character reference"; - case VXML_E_INVALID_CHARACTER: return "Invalid Unicode character"; - case VXML_E_INVALID_NAME_CHARACTER: return "Invalid character in name"; - case VXML_E_UNKNOWN_ENTITY_REF: return "Unknown entity reference"; - case VXML_E_UNEXPECTED_CHARACTER: return "Unexpected character"; - case VXML_E_UNEXPECTED_WHITESPACE: return "Unexpected white space"; - case VXML_E_BAD_CHAR_IN_NAME: return "Bad character in name"; - case VXML_E_INVALID_TAG_NESTING: return "Invalid tag nesting"; - case VXML_E_EXPECTED_QUOTE: return "Expected quote (\"'\" or '\"')"; - case VXML_E_EXPECTED_GT: return "Expected '>'"; - case VXML_E_EXPECTED_SPACE: return "Expected white space"; - case VXML_E_EXPECTED_LBRAK: return "Expected ''"; - case VXML_E_EXPECTED_RBRAK: return "Expected ''"; - case VXML_E_EXPECTED_DOCTYPE_DECL: return "Expected a DOCTYPE declaration"; - case VXML_E_EXPECTED_TWO_MINUS: return "Expected '--'"; - case VXML_E_EXPECTED_DECL_TOKEN: return "Expected a declaration token"; - case VXML_E_EXPECTED_NDATA_TOKEN: return "Expected NDATA token"; - case VXML_E_EXPECTED_CDATA_TOKEN: return "Expected CDATA token"; - case VXML_E_EXPECTED_COND_TOKEN: return "Expected INCLUDE or IGNORE"; - case VXML_E_UNEXPECTED_LT: return "Was not expecting '<'"; - case VXML_E_UNEXPECTED_XML_PI: return "Unexpected <?xml...?>"; - case VXML_E_UNEXPECTED_TAG_END: return "Unexpected tag end"; - case VXML_E_NESTED_DOCTYPE_DECL: return "Nested DOCTYPE declaration"; - case VXML_E_INVALID_VERSION: return "Invalid version number"; - case VXML_E_VERSION_OUT_OF_RANGE: return "Version number out of range"; - case VXML_E_USER: return "User-defined error"; - case VXML_E_DUP_ATTRIBUTE: return "Duplicate attribute"; - case VXML_E_DUP_DEFAULT_NAMESPACE: return "Duplicate default namespace"; - case VXML_E_BAD_CHAR_IN_NAMESPACE: return "Bad character in namespace"; - case VXML_E_NAMESPACE_REDEFINITION: return "Invalid namespace redefinition"; - case VXML_E_UNKNOWN_NAMESPACE: return "Unknown namespace prefix"; - case VXML_E_EMPTY_NAME: return "Empty name"; - case VXML_E_IO: return "I/O error"; - case VXML_E_ENTITY_RECURSION: return "Possible entity recursion"; - case VXML_E_UNKNOWN_CHAR_ENCODING_NAME: - return "Unknown character encoding name"; - case VXML_E_INVALID_CHAR_ENCODING_NAME: - return "Invalid character encoding name"; - case VXML_E_UNREADABLE_CHAR_ENCODING: - return "Input is unreadable in the specified encoding"; - case VXML_E_ILLEGAL_CHAR_BYTE_SEQUENCE: - return "Reached illegal character byte sequence"; - case VXML_E_MAX: - break; - } - - return "Invalid VXML error code"; -} - -/** * Same as vxml_strerror() but also support user-defined error, whose string * is stored in the parser. */ @@ -1445,7 +1388,7 @@ /** * Is encoding UTF-16? */ -static gboolean +static bool vxml_encoding_is_utf16(enum vxml_encoding e) { return VXML_ENC_UTF16_BE == e || VXML_ENC_UTF16_LE == e; @@ -1454,7 +1397,7 @@ /** * Is encoding UTF-32? */ -static gboolean +static bool vxml_encoding_is_utf32(enum vxml_encoding e) { return VXML_ENC_UTF32_BE == e || VXML_ENC_UTF32_LE == e; @@ -1464,14 +1407,14 @@ * Formats document parsing name and parsing position into a static buffer * for error logging. */ -static G_GNUC_COLD const char * +static const char * G_COLD vxml_document_where(vxml_parser_t *vp) { static char buf1024; vxml_parser_check(vp); - gm_snprintf(buf, sizeof buf, + str_bprintf(buf, sizeof buf, "%sparsing \"%s\" (%s %u.%u), %soffset %zu, line %zu, at %s", vp->glob.depth != vp->loc.depth ? "sub-" : "", vp->name, vxml_versionsrc_to_string(vp->versource), vp->major, vp->minor, @@ -1548,13 +1491,13 @@ * @param uc the problematic character */ static void -vxml_fatal_error_uc(vxml_parser_t *vp, vxml_error_t error, guint32 uc) +vxml_fatal_error_uc(vxml_parser_t *vp, vxml_error_t error, uint32 uc) { if (vp->flags & VXML_F_FATAL_ERROR) return; if (vxml_debugging(0)) { - guint32 s322; + uint32 s322; char s85; s320 = uc; @@ -1622,27 +1565,29 @@ static void vxml_parser_remove_buffer(vxml_parser_t *vp, struct vxml_buffer *vb) { - vp->input = g_slist_remove(vp->input, vb); + vp->input = pslist_remove(vp->input, vb); - if (vxml_debugging(19)) { - switch (vb->type) { - case VXML_BUFFER_MEMORY: - if (vb->u.m->entity) { - /* Unstacking an entity expansion buffer */ - g_assert(uint_is_positive(vp->expansions)); - vp->expansions--; - } + switch (vb->type) { + case VXML_BUFFER_MEMORY: + if (vb->u.m->entity) { + /* Unstacking an entity expansion buffer */ + g_assert(uint_is_positive(vp->expansions)); + vp->expansions--; + } + if (vxml_debugging(19)) { vxml_parser_debug(vp, "removed %sinput buffer (%zu byte%s)", NULL == vp->input ? "last " : "", - vb->u.m->length, 1 == vb->u.m->length ? "" : "s"); - break; - case VXML_BUFFER_FILE: + vb->u.m->length, plural(vb->u.m->length)); + } + break; + case VXML_BUFFER_FILE: + if (vxml_debugging(19)) { vxml_parser_debug(vp, "removed %sinput file (EOF %sreached)", NULL == vp->input ? "last " : "", vb->u.f->eof ? "" : "not "); - break; } + break; } vxml_buffer_free(vb); @@ -1690,10 +1635,23 @@ * Move to next buffer when current one is fully read. */ - if (0 == remains) { + if G_UNLIKELY(0 == remains) { vxml_parser_remove_buffer(vp, vb); + + /* + * Request cacheline pre-fill of next memory buffer. + */ + + if (vp->input != NULL) { + vb = vp->input->data; + if (VXML_BUFFER_MEMORY == vb->type) { + m = vb->u.m; + G_PREFETCH_HI_R(m->vb_rptr); + } + } continue; } + return remains; } case VXML_BUFFER_FILE: @@ -1713,7 +1671,7 @@ */ vnext = vxml_buffer_read(vb, &error); - if (NULL == vnext) { + if G_UNLIKELY(NULL == vnext) { if (error) { vxml_fatal_error(vp, VXML_E_IO); return (size_t) -1; @@ -1723,7 +1681,7 @@ } g_assert(VXML_BUFFER_MEMORY == vnext->type); vnext->u.m->generation = vp->generation; - vp->input = g_slist_prepend(vp->input, vnext); + vp->input = pslist_prepend(vp->input, vnext); continue; } } @@ -1794,7 +1752,7 @@ * * @return TRUE if the charset was accepted. */ -gboolean +bool vxml_parser_set_charset(vxml_parser_t *vp, const char *charset) { const char *alias; @@ -1827,13 +1785,13 @@ * * @return TRUE if we can continue parsing, FALSE on fatal error. */ -static gboolean +static bool vxml_intuit_encoding(vxml_parser_t *vp) { - guchar head4; + uchar head4; size_t filled = 0; - guint32 fourcc; - guint16 twocc; + uint32 fourcc; + uint16 twocc; g_assert(vp->input != NULL); @@ -1869,7 +1827,7 @@ m = vb->u.m; - g_assert(filled < G_N_ELEMENTS(head)); + g_assert(filled < N_ITEMS(head)); g_assert(len + filled <= sizeof head); /* @@ -1883,7 +1841,7 @@ vp->flags |= VXML_F_INTUITED; /* No longer come here */ - if (filled < G_N_ELEMENTS(head)) + if (filled < N_ITEMS(head)) return TRUE; fourcc = peek_be32(head); @@ -1968,9 +1926,9 @@ * previously read, etc.... */ static void -vxml_unread_char(vxml_parser_t *vp, guint32 uc) +vxml_unread_char(vxml_parser_t *vp, uint32 uc) { - g_assert(vp->unread_offset < G_N_ELEMENTS(vp->unread)); + g_assert(vp->unread_offset < N_ITEMS(vp->unread)); g_assert(size_is_non_negative(vp->unread_offset)); vp->unreadvp->unread_offset++ = uc; @@ -1995,13 +1953,13 @@ * from entity expansion output or from the unread buffer). * The character returned in "uc" is 0 when the end of input was reached. */ -static gboolean -vxml_read_char(vxml_parser_t *vp, guint32 *uc) +static bool +vxml_read_char(vxml_parser_t *vp, uint32 *uc) { struct vxml_buffer *vb; struct vxml_buffer_memory *m = NULL; - guint retlen; - guint32 prev_uc; + uint retlen; + uint32 prev_uc; if G_UNLIKELY(vp->flags & VXML_F_FATAL_ERROR) { *uc = VXC_NUL; @@ -2015,7 +1973,7 @@ */ if (vp->unread_offset != 0) { - g_assert(vp->unread_offset <= G_N_ELEMENTS(vp->unread)); + g_assert(vp->unread_offset <= N_ITEMS(vp->unread)); g_assert(size_is_positive(vp->unread_offset)); *uc = vp->last_uc = vp->unread--(vp->unread_offset); @@ -2158,7 +2116,7 @@ if G_UNLIKELY(0 == retlen) { struct vxml_buffer *vnext; - GSList *next; + pslist_t *next; /* * We were unable to grab the character, maybe because the input @@ -2178,7 +2136,7 @@ * and retry. */ - next = g_slist_next(vp->input); + next = pslist_next(vp->input); if (NULL == next || NULL == next->data) goto illegal_byte_sequence; @@ -2222,13 +2180,14 @@ /* FALL THROUGH */ uc_read: + G_PREFETCH_HI_R(m->vb_rptr); /* Prefetch next char we'll read */ vp->last_uc_generation = m->generation; if G_UNLIKELY(vxml_debugging(19)) { vxml_parser_debug(vp, "read U+%X '%c' %u byte%s%s", vp->last_uc, is_ascii_print(vp->last_uc) ? vp->last_uc & 0xff : ' ', - retlen, 1 == retlen ? "" : "s", m->user ? "" : " (entity)"); + retlen, plural(retlen), m->user ? "" : " (entity)"); } return m->user; @@ -2245,11 +2204,11 @@ * @return next Unicode character, 0 if we reached the end of input or cannot * continue due to a fatal error. */ -static guint32 +static uint32 vxml_next_char(vxml_parser_t *vp) { - guint32 uc; - gboolean user_input; + uint32 uc; + bool user_input; /* * New-line normalization. @@ -2287,8 +2246,8 @@ /** * Is Unicode character a valid character for a name start. */ -static G_GNUC_CONST gboolean -vxml_is_valid_name_start_char(guint32 uc) +static G_CONST bool +vxml_is_valid_name_start_char(uint32 uc) { /* * NameStartChar ::= ":" | A-Z | "_" | a-z | #xC0-#xD6 | @@ -2335,8 +2294,8 @@ /* * Is Unicode character a valid character within a name. */ -static G_GNUC_CONST gboolean -vxml_is_valid_name_char(guint32 uc) +static G_CONST bool +vxml_is_valid_name_char(uint32 uc) { /* * NameChar ::= NameStartChar | "-" | "." | 0-9 | #xB7 | @@ -2362,8 +2321,8 @@ /** * Is Unicode character a white space? */ -static G_GNUC_CONST gboolean -vxml_is_white_space_char(guint32 uc) +static G_CONST bool +vxml_is_white_space_char(uint32 uc) { /* * S ::= (#x20 | #x9 | #xD | #xA)+ @@ -2375,8 +2334,8 @@ /* * Is Unicode character in the upper-ASCII letter range? */ -static G_GNUC_CONST gboolean -vxml_is_ascii_upper_letter_char(guint32 uc) +static G_CONST bool +vxml_is_ascii_upper_letter_char(uint32 uc) { return uc >= 0x41U && uc <= 0x5AU; /* A-Z */ } @@ -2393,10 +2352,10 @@ * @return TRUE if we successfuly parsed the name, FALSE on error with * vp->error set. */ -static gboolean -vxml_parser_handle_name(vxml_parser_t *vp, struct vxml_output *vo, guint32 c) +static bool +vxml_parser_handle_name(vxml_parser_t *vp, struct vxml_output *vo, uint32 c) { - guint32 uc; + uint32 uc; vxml_output_check(vo); g_assert(0 == vxml_output_size(vo)); @@ -2453,10 +2412,10 @@ * @return TRUE if we successfuly parsed the name, FALSE on error with * vp->error set. */ -static gboolean +static bool vxml_parser_handle_uppername(vxml_parser_t *vp, struct vxml_output *vo) { - guint32 uc; + uint32 uc; vxml_output_check(vo); g_assert(0 == vxml_output_size(vo)); @@ -2488,13 +2447,13 @@ * @return TRUE if the expansion was successful, FALSE otherwise with * vp->error set with the proper error code. */ -static gboolean +static bool vxml_expand_char_ref(vxml_parser_t *vp) { - guint32 uc; + uint32 uc; unsigned base = 10; - guint32 v = 0; - gboolean has_digit = FALSE; + uint32 v = 0; + bool has_digit = FALSE; vxml_parser_check(vp); @@ -2571,44 +2530,15 @@ } /** - * Lookup token in a sorted array of tokens. - * - * @param name the token name - * @param tokens the token array - * @param len the length of the token array - * - * @return the token value if found, 0 if not found. - */ -unsigned -vxml_token_lookup(const char *name, - const struct vxml_parser_token *tokens, size_t len) -{ -#define GET_KEY(i) (tokens(i).name) -#define FOUND(i) G_STMT_START { \ - return tokens(i).value; \ - /* NOTREACHED */ \ -} G_STMT_END - - /* Perform a binary search to find ``name'' */ - BINARY_SEARCH(const char *, name, len, strcmp, GET_KEY, FOUND); - -#undef FOUND -#undef GET_KEY - - return 0; /* Not found */ -} - -/** * Look whether name is that of a known default entity. * * @return VXC_NUL if entity was not found, its single Unicode character * otherwise. */ -static guint32 +static uint32 vxml_get_default_entity(const char *name) { - return vxml_token_lookup(name, - vxml_default_entities, G_N_ELEMENTS(vxml_default_entities)); + return TOKENIZE(name, vxml_default_entities); } /** @@ -2619,8 +2549,7 @@ static enum vxml_parser_token_value vxml_get_declaration_token(const char *name) { - return vxml_token_lookup(name, - vxml_declaration_tokens, G_N_ELEMENTS(vxml_declaration_tokens)); + return TOKENIZE(name, vxml_declaration_tokens); } /** @@ -2631,8 +2560,7 @@ static enum vxml_parser_token_value vxml_get_misc_token(const char *name) { - return vxml_token_lookup(name, - vxml_misc_tokens, G_N_ELEMENTS(vxml_misc_tokens)); + return TOKENIZE(name, vxml_misc_tokens); } /** @@ -2643,15 +2571,14 @@ static enum vxml_parser_token_value vxml_get_immediate_token(const char *name) { - return vxml_token_lookup(name, - vxml_immediate_tokens, G_N_ELEMENTS(vxml_immediate_tokens)); + return TOKENIZE(name, vxml_immediate_tokens); } /** * Loads vxml_token_string with an inverted token index. */ static void -vxml_token_to_string_load(struct vxml_parser_token *tokens, size_t count) +vxml_token_to_string_load(tokenizer_t *tokens, size_t count) { size_t i; @@ -2659,9 +2586,12 @@ size_t value = tokensi.value; g_assert(size_is_non_negative(value)); - g_assert(value < G_N_ELEMENTS(vxml_token_strings)); + g_assert(value < N_ITEMS(vxml_token_strings)); + g_assert_log(0 == vxml_token_stringsvalue, + "%s(): token value %zu already assigned to \"%s\"", + G_STRFUNC, value, tokensi.token); - vxml_token_stringsvalue = tokensi.name; + vxml_token_stringsvalue = tokensi.token; } } @@ -2671,22 +2601,22 @@ static const char * vxml_token_to_string(enum vxml_parser_token_value token) { - static gboolean inited; + static bool inited; if (!inited) { vxml_token_to_string_load(vxml_declaration_tokens, - G_N_ELEMENTS(vxml_declaration_tokens)); + N_ITEMS(vxml_declaration_tokens)); vxml_token_to_string_load(vxml_misc_tokens, - G_N_ELEMENTS(vxml_misc_tokens)); + N_ITEMS(vxml_misc_tokens)); vxml_token_to_string_load(vxml_immediate_tokens, - G_N_ELEMENTS(vxml_immediate_tokens)); + N_ITEMS(vxml_immediate_tokens)); inited = TRUE; } if (VXT_UNKNOWN == token) return "unknown token"; - if (token < 1 || token >= G_N_ELEMENTS(vxml_token_strings)) + if (token < 1 || token >= N_ITEMS(vxml_token_strings)) return "invalid token"; return vxml_token_stringstoken; @@ -2698,10 +2628,10 @@ * @return TRUE if we reached a non-space character, FALSE if we reached * an error (EOF), with vp->error set. */ -static gboolean +static bool vxml_parser_skip_spaces(vxml_parser_t *vp) { - guint32 uc; + uint32 uc; while (0 != (uc = vxml_next_char(vp))) { if (!vxml_is_white_space_char(uc)) { @@ -2723,10 +2653,10 @@ * @return TRUE if we swallowed space characters, FALSE if we reached * an error, with vp->error set. */ -static gboolean -vxml_parser_swallow_spaces(vxml_parser_t *vp, guint32 ac) +static bool +vxml_parser_swallow_spaces(vxml_parser_t *vp, uint32 ac) { - guint32 uc; + uint32 uc; /* * The first character must be a white space. @@ -2767,7 +2697,7 @@ * * @return TRUE if OK, FALSE on error with vp->errno set */ -static gboolean +static bool vxml_parser_next_misc_token(vxml_parser_t *vp, enum vxml_parser_token_value *token, vxml_error_t error) { @@ -2800,7 +2730,7 @@ * @return TRUE if the expansion was successful, FALSE otherwise with * vp->error set to the proper error code. */ -static gboolean +static bool vxml_expand(vxml_parser_t *vp, const char *name, nv_table_t *entities) { nv_pair_t *ev; @@ -2858,7 +2788,7 @@ vb = vxml_buffer_alloc(vp->generation++, value, length - 1, FALSE, FALSE, utf8_decode_char_buffer); - vp->input = g_slist_prepend(vp->input, vb); + vp->input = pslist_prepend(vp->input, vb); /* * We're prepended a non user-supplied input buffer to the list, @@ -2875,7 +2805,7 @@ vxml_parser_debug(vp, "expanded %c%s; into \"%s\" (%zu byte%s)", entities == vp->entities ? '&' : entities == vp->pe_entities ? '%' : '?', - name, value, m->length, 1 == m->length ? "" : "s"); + name, value, m->length, plural(m->length)); } } @@ -2892,7 +2822,7 @@ * @return TRUE if the expansion was successful, FALSE otherwise with * vp->error set to the proper error code. */ -static gboolean +static bool vxml_expand_entity(vxml_parser_t *vp, const char *name) { return vxml_expand(vp, name, vp->entities); @@ -2908,10 +2838,10 @@ * @return TRUE if the expansion was successful, FALSE otherwise with * vp->error set to the proper error code. */ -static gboolean -vxml_expand_pe_entity(vxml_parser_t *vp, const char *name, gboolean inquote) +static bool +vxml_expand_pe_entity(vxml_parser_t *vp, const char *name, bool inquote) { - gboolean ret; + bool ret; /* * Expand the parameter entity differently when it is within a @@ -2920,7 +2850,7 @@ * * As said in http://www.w3.org/TR/xml11, section 4.4.8: * - * "When a parameter-entity reference is recognized in the DTD and + * "When a parameter-entity reference is recognized in the DTD and * included, its replacement text MUST be enlarged by the attachment of * one leading and one following space (#x20) character; the intent is to * constrain the replacement text of parameter entities to contain an @@ -2931,7 +2861,7 @@ if (!inquote) { struct vxml_buffer *vb; - static char vxc_sp_buf = " "; + buf_t *vxc_sp_buf = buf_private(G_STRFUNC, 1); /* * Since it is an error if the entity is not recognized, we can safely @@ -2940,10 +2870,12 @@ * leading space, we'll forcefully "unread" a space. */ + buf_setc(vxc_sp_buf, 0, ' '); + vb = vxml_buffer_alloc(vp->generation++, - vxc_sp_buf, CONST_STRLEN(vxc_sp_buf), + buf_data(vxc_sp_buf), buf_size(vxc_sp_buf), FALSE, FALSE, utf8_decode_char_buffer); - vp->input = g_slist_prepend(vp->input, vb); + vp->input = pslist_prepend(vp->input, vb); } ret = vxml_expand(vp, name, vp->pe_entities); @@ -2963,10 +2895,10 @@ * @return TRUE if the expansion was successful, FALSE otherwise with * vp->error set to the proper error code. */ -static gboolean -vxml_expand_pe_reference(vxml_parser_t *vp, gboolean inquote) +static bool +vxml_expand_pe_reference(vxml_parser_t *vp, bool inquote) { - guint32 uc; + uint32 uc; g_assert(0 == vxml_output_size(&vp->entity)); @@ -2999,10 +2931,10 @@ * @return TRUE if the expansion was successful, FALSE otherwise with * vp->error set to the proper error code. */ -static gboolean -vxml_expand_reference(vxml_parser_t *vp, gboolean charonly) +static bool +vxml_expand_reference(vxml_parser_t *vp, bool charonly) { - guint32 uc; + uint32 uc; g_assert(0 == vxml_output_size(&vp->entity)); @@ -3207,7 +3139,7 @@ /** * Is the namespace prefix known? */ -static gboolean +static bool vxml_parser_namespace_exists(const vxml_parser_t *vp, const char *ns) { g_assert(ns != NULL); @@ -3244,7 +3176,7 @@ * * @return TRUE if OK, FALSE on error with vp->error set. */ -static gboolean +static bool vxml_parser_namespace_default(vxml_parser_t *vp, const char *value, size_t len) { nv_pair_t *default_ns; @@ -3272,7 +3204,7 @@ * * @return TRUE if OK, FALSE on error with vp->error set. */ -static gboolean +static bool vxml_parser_namespace_decl(vxml_parser_t *vp, const char *name, const char *value, size_t value_len) { @@ -3363,7 +3295,7 @@ * * @return TRUE if OK, FALSE otherwise with vp->error set. */ -static gboolean +static bool vxml_parser_element_prefix_known(vxml_parser_t *vp) { if ( @@ -3421,7 +3353,7 @@ /** * Do we have to notify user on available element text? */ -static gboolean +static bool vxml_parser_notify_text(const vxml_parser_t *vp, const struct vxml_ops *ops) { if (NULL == ops) @@ -3453,11 +3385,11 @@ static const char * vxml_strip_blanks(char *text, size_t *len_ptr) { - guint32 uc; - guint retlen; + uint32 uc; + uint retlen; size_t len; char *p; - gboolean seen_non_blank = FALSE; + bool seen_non_blank = FALSE; char *last_non_blank; const char *first_non_blank; const char *end; @@ -3565,7 +3497,7 @@ vp->name, text == vxml_output_start(&vp->out) ? "no" : "yes", previous_end == current_end ? "no" : "yes", - len, 1 == len ? "" : "s"); + len, plural(len)); } } @@ -3585,7 +3517,7 @@ /** * Do we have to notify user on element start? */ -static gboolean +static bool vxml_parser_notify_start(const vxml_parser_t *vp, const struct vxml_ops *ops) { if (NULL == ops) @@ -3687,10 +3619,10 @@ * * @return TRUE if OK, FALSE on error with vp->error set. */ -static gboolean -vxml_parser_swallow_until(vxml_parser_t *vp, guint32 fc) +static bool +vxml_parser_swallow_until(vxml_parser_t *vp, uint32 fc) { - guint32 uc; + uint32 uc; while (0 != (uc = vxml_next_char(vp))) { if (fc == uc) @@ -3709,19 +3641,19 @@ * * @return TRUE if OK, FALSE on error with vp->error set. */ -static gboolean +static bool vxml_parser_swallow_until_marker(vxml_parser_t *vp, const char *mark) { - guint32 fc; + uint32 fc; fc = mark0; while (vxml_parser_swallow_until(vp, fc)) { - guint32 nc; + uint32 nc; size_t i = 1; while (0 != (nc = marki++)) { - guint32 uc = vxml_next_char(vp); + uint32 uc = vxml_next_char(vp); if (uc != nc) break; } @@ -3744,11 +3676,11 @@ * * @return TRUE if handling was successful, FALSE on error with vp->error set. */ -static gboolean +static bool vxml_parser_handle_attrval(vxml_parser_t *vp, struct vxml_output *vo) { - guint32 quote; - guint32 uc; + uint32 quote; + uint32 uc; unsigned generation; vxml_output_check(vo); @@ -3800,14 +3732,14 @@ * @return TRUE if the handling was successful, FALSE otherwise with * vp->error set to the proper error code. */ -static gboolean -vxml_handle_attribute(vxml_parser_t *vp, gboolean in_document) +static bool +vxml_handle_attribute(vxml_parser_t *vp, bool in_document) { - guint32 uc; + uint32 uc; const char *name; char *ns = NULL; const char *uri = NULL; - gboolean ok = TRUE; + bool ok = TRUE; /* * If there is no attribute yet for the current element, create a new @@ -3818,7 +3750,7 @@ vp->attrs = xattr_table_make(); /* - * Attribute ::= Name Eq AttValue + * Attribute ::= Name Eq AttValue * Eq ::= S? '=' S? * AttValue ::= '"' (^<&" | Reference)* '"' * | "'" (^<&' | Reference)* "'" @@ -3856,7 +3788,7 @@ vxml_output_discard(&vp->out); if (vxml_debugging(18)) - vxml_parser_debug(vp, "vxml_handle_attribute: name is \"%s\"", name); + vxml_parser_debug(vp, "%s(): name is \"%s\"", G_STRFUNC, name); if (!vxml_parser_handle_attrval(vp, &vp->out)) { atom_str_free(name); @@ -3872,7 +3804,7 @@ */ { - char *value = deconstify_gchar(vxml_output_start(&vp->out)); + char *value = deconstify_char(vxml_output_start(&vp->out)); size_t len = vxml_output_size(&vp->out) - 1; const char *start; @@ -3912,7 +3844,7 @@ if (!(vp->options & VXML_O_NO_NAMESPACES)) { const char *local_name; - + local_name = strchr(start, ':'); if (local_name != NULL) { unsigned retlen; @@ -3935,8 +3867,9 @@ start = local_name + 1; if (vxml_debugging(18)) { - vxml_parser_debug(vp, "vxml_handle_attribute: " - "stripped name is \"%s\", URI is \"%s\"", start, uri); + vxml_parser_debug(vp, + "%s(): stripped name is \"%s\", URI is \"%s\"", + G_STRFUNC, start, uri); } /* @@ -3978,8 +3911,7 @@ } if (vxml_debugging(18)) { - vxml_parser_debug(vp, "vxml_handle_attribute: " - "value is \"%s\"", value); + vxml_parser_debug(vp, "%s(): value is \"%s\"", G_STRFUNC, value); } } @@ -4003,11 +3935,11 @@ * * @return TRUE if reached the end of a PI, FALSE otherwise. */ -static gboolean -vxml_parser_pi_has_ended(vxml_parser_t *vp, guint32 uc) +static bool +vxml_parser_pi_has_ended(vxml_parser_t *vp, uint32 uc) { if (VXC_QM == uc) { /* Reached a '?' */ - guint32 nc = vxml_next_char(vp); + uint32 nc = vxml_next_char(vp); if (VXC_GT == nc) { /* Followed by a '>', end of PI */ vxml_output_discard(&vp->out); /* Clear any pending text */ @@ -4037,11 +3969,11 @@ * @return TRUE if the handling was successful, FALSE otherwise with * vp->error set to the proper error code. */ -static gboolean +static bool vxml_handle_xml_pi(vxml_parser_t *vp) { - guint32 uc; - gboolean need_space; + uint32 uc; + bool need_space; const char *value; /* @@ -4055,8 +3987,8 @@ * EncodingDecl::= S 'encoding' Eq ('"' EncName '"' | "'" EncName "'") * EncName ::= A-Za-z (A-Za-z0-9._ | '-')* * SDDecl ::= S 'standalone' Eq - * (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"')) - * Misc ::= Comment | PI | S + * (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"')) + * Misc ::= Comment | PI | S * * In practice, we're going to be much more tolerant and allow any * well-formed attribute. @@ -4112,12 +4044,12 @@ vp->minor = 0; vp->versource = VXML_VERSRC_IMPLIED; } else { - guint major, minor; + uint major, minor; if (0 != parse_major_minor(value, NULL, &major, &minor)) { vxml_fatal_error_str(vp, VXML_E_INVALID_VERSION, value); return FALSE; } - if (major > MAX_INT_VAL(guint8) || minor > MAX_INT_VAL(guint8)) { + if (major > MAX_INT_VAL(uint8) || minor > MAX_INT_VAL(uint8)) { vxml_fatal_error_str(vp, VXML_E_VERSION_OUT_OF_RANGE, value); return FALSE; } @@ -4214,7 +4146,7 @@ * @return TRUE if the handling was successful, FALSE otherwise with * vp->error set to the proper error code. */ -static gboolean +static bool vxml_handle_pi(vxml_parser_t *vp) { /* @@ -4230,8 +4162,8 @@ return FALSE; if (vxml_debugging(18)) { - vxml_parser_debug(vp, "vxml_handle_pi: target is \"%s\"", - vxml_output_start(&vp->out)); + vxml_parser_debug(vp, "%s(): target is \"%s\"", + G_STRFUNC, vxml_output_start(&vp->out)); } /* @@ -4262,17 +4194,17 @@ * @return TRUE if the handling was successful, FALSE otherwise with * vp->error set to the proper error code. */ -static gboolean +static bool vxml_handle_comment(vxml_parser_t *vp) { - guint32 uc; + uint32 uc; /* * Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->' */ if (vxml_debugging(18)) - vxml_parser_debug(vp, "vxml_handle_comment: begin"); + vxml_parser_debug(vp, "%s(): begin", G_STRFUNC); while (0 != (uc = vxml_next_char(vp))) { if (uc != VXC_MINUS) @@ -4318,7 +4250,7 @@ } } else { if (vxml_debugging(18)) - vxml_parser_debug(vp, "vxml_handle_comment: end"); + vxml_parser_debug(vp, "%s(): end", G_STRFUNC); return TRUE; } @@ -4340,11 +4272,11 @@ * * @return TRUE if OK, FALSE on error with vp->error set. */ -static gboolean +static bool vxml_parser_handle_quoted_string(vxml_parser_t *vp, struct vxml_output *vo, - gboolean verbatim) + bool verbatim) { - guint32 uc, quote; + uint32 uc, quote; unsigned generation; g_assert(0 == vxml_output_size(vo)); @@ -4358,7 +4290,7 @@ /* * Citing, http://www.w3.org/TR/xml11, section 4.4.5: - * + * * "When an entity reference appears in an attribute value, or a parameter * entity reference appears in a literal entity value, its replacement text * MUST be processed in place of the reference itself as though it were part @@ -4410,10 +4342,10 @@ * * @return TRUE if OK, FALSE on error with vp->error set. */ -static gboolean +static bool vxml_parser_at_tag_end(vxml_parser_t *vp) { - guint32 uc; + uint32 uc; if (!vxml_parser_skip_spaces(vp)) return FALSE; @@ -4435,7 +4367,7 @@ * * @return TRUE if OK, FALSE on error with vp->error set. */ -static gboolean +static bool vxml_handle_external_id(vxml_parser_t *vp) { enum vxml_parser_token_value token; @@ -4490,7 +4422,7 @@ * * @return TRUE if OK, FALSE on error with vp->error set. */ -static gboolean +static bool vxml_parser_handle_element_decl(vxml_parser_t *vp, const char *name) { /* @@ -4514,22 +4446,22 @@ * * @return TRUE if OK, FALSE on error with vp->error set. */ -static gboolean +static bool vxml_parser_handle_entity_decl(vxml_parser_t *vp, const char *name, - gboolean with_percent) + bool with_percent) { - guint32 uc; + uint32 uc; g_assert(0 == vxml_output_size(&vp->out)); /* - * EntityDecl ::= GEDecl | PEDecl + * EntityDecl ::= GEDecl | PEDecl * GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>' * PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>' * EntityDef ::= EntityValue | (ExternalID NDataDecl?) * NDataDecl ::= S 'NDATA' S Name - * PEDef ::= EntityValue | ExternalID - * EntityValue ::= '"' (^%&" | PEReference | Reference)* '"' + * PEDef ::= EntityValue | ExternalID + * EntityValue ::= '"' (^%&" | PEReference | Reference)* '"' * | "'" (^%&' | PEReference | Reference)* "'" * ExternalID ::= 'SYSTEM' S SystemLiteral * | 'PUBLIC' S PubidLiteral S SystemLiteral @@ -4573,7 +4505,7 @@ vxml_parser_debug(vp, "defined %s entity \"%s\" as " "\"%s\" (%zu byte%s)", with_percent ? "parameter" : "general", name, - vxml_output_start(&vp->out), len, 1 == len ? "" : "s"); + vxml_output_start(&vp->out), len, plural(len)); } vxml_output_discard(&vp->out); @@ -4634,7 +4566,7 @@ * * @return TRUE if OK, FALSE on error with vp->error set. */ -static gboolean +static bool vxml_parser_handle_attlist_decl(vxml_parser_t *vp, const char *name) { /* @@ -4662,19 +4594,19 @@ * * @return TRUE if OK, FALSE on error with vp->error set. */ -static gboolean +static bool vxml_parser_handle_int_subset(vxml_parser_t *vp) { /* * intSubset ::= (markupdecl | DeclSep)* - * DeclSep ::= PEReference | S + * DeclSep ::= PEReference | S * PEReference ::= '%' Name ';' * markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl * | PI | Comment */ for (;;) { - guint32 uc; + uint32 uc; if (!vxml_parser_skip_spaces(vp)) return FALSE; @@ -4720,16 +4652,16 @@ * * @return TRUE if OK, FALSE on error with vp->error set. */ -static gboolean +static bool vxml_parser_handle_doctype_decl(vxml_parser_t *vp, const char *name) { - guint32 uc; + uint32 uc; /* * doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? * ('' intSubset '' S?)? '>' * intSubset ::= (markupdecl | DeclSep)* - * DeclSep ::= PEReference | S + * DeclSep ::= PEReference | S * PEReference ::= '%' Name ';' * markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl * | PI | Comment @@ -4741,8 +4673,7 @@ */ if (vxml_debugging(18)) { - vxml_parser_debug(vp, "vxml_parser_handle_doctype_decl: name is \"%s\"", - name); + vxml_parser_debug(vp, "%s(): name is \"%s\"", G_STRFUNC, name); } uc = vxml_next_char(vp); @@ -4782,19 +4713,19 @@ * All the characters within the section make up verbatim text that is sent * as-is to the parser's output. There is no markup nor entity processing. */ -static gboolean +static bool vxml_handle_cdata(vxml_parser_t *vp) { - guint32 uc; + uint32 uc; if (vxml_debugging(18)) - vxml_parser_debug(vp, "vxml_handle_cdata: begin"); + vxml_parser_debug(vp, "%s(): begin", G_STRFUNC); while (0 != (uc = vxml_next_char(vp))) { if (VXC_RBRAK == uc) { /* '' */ - guint32 nc = vxml_next_char(vp); + uint32 nc = vxml_next_char(vp); if (VXC_RBRAK == nc) { /* '' */ - guint32 fc = vxml_next_char(vp); + uint32 fc = vxml_next_char(vp); if (VXC_GT == fc) /* '>' */ goto ended; vxml_unread_char(vp, fc); @@ -4809,7 +4740,7 @@ ended: if (vxml_debugging(18)) - vxml_parser_debug(vp, "vxml_handle_cdata: end"); + vxml_parser_debug(vp, "%s(): end", G_STRFUNC); return TRUE; } @@ -4821,10 +4752,10 @@ * * @return TRUE if at the end of the section, or FALSE with vp->error set. */ -static gboolean +static bool vxml_parser_at_cond_close(vxml_parser_t *vp) { - guint32 uc; + uint32 uc; uc = vxml_next_char(vp); if (uc != VXC_RBRAK) { @@ -4851,10 +4782,10 @@ * @return TRUE if the handling was successful, FALSE otherwise with * vp->error set to the proper error code. */ -static gboolean +static bool vxml_parser_handle_ignore(vxml_parser_t *vp) { - guint32 uc; + uint32 uc; g_assert(uint_is_positive(vp->ignores)); @@ -4915,11 +4846,11 @@ * @return TRUE if the handling was successful, FALSE otherwise with * vp->error set to the proper error code. */ -static gboolean -vxml_handle_special(vxml_parser_t *vp, gboolean dtd) +static bool +vxml_handle_special(vxml_parser_t *vp, bool dtd) { enum vxml_parser_token_value tok; - guint32 uc; + uint32 uc; if (!dtd) { /* @@ -4956,7 +4887,7 @@ * includeSect ::= '<!' S? 'INCLUDE' S? '' extSubsetDecl '>' * ignoreSect ::= '<!' S? 'IGNORE' S? '' ignoreSectContents* '>' * ignoreSectContents ::= Ignore ('<!' ignoreSectContents '>' Ignore)* - * Ignore ::= Char* - (Char* ('<!' | '>') Char*) + * Ignore ::= Char* - (Char* ('<!' | '>') Char*) * * extSubset ::= TextDecl? extSubsetDecl * extSubsetDecl ::= ( markupdecl | conditionalSect | DeclSep)* @@ -5046,15 +4977,15 @@ * @return TRUE if the handling was successful, FALSE otherwise with * vp->error set to the proper error code. */ -static gboolean -vxml_handle_decl(vxml_parser_t *vp, gboolean doctype) +static bool +vxml_handle_decl(vxml_parser_t *vp, bool doctype) { enum vxml_parser_token_value token; - guint32 uc; + uint32 uc; const char *name; - gboolean seen_pct = FALSE; - gboolean mandatory_space = TRUE; - gboolean ret; + bool seen_pct = FALSE; + bool mandatory_space = TRUE; + bool ret; /* * If it starts with '--', it's a comment. @@ -5064,8 +4995,8 @@ uc = vxml_next_char(vp); if (vxml_debugging(18)) - vxml_parser_debug(vp, "vxml_handle_decl: next char is U+%X '%c'", - uc, is_ascii_print(uc) ? uc & 0xff : ' '); + vxml_parser_debug(vp, "%s(): next char is U+%X '%c'", + G_STRFUNC, uc, is_ascii_print(uc) ? uc & 0xff : ' '); if (VXC_MINUS == uc) { uc = vxml_next_char(vp); @@ -5092,12 +5023,12 @@ * PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>' * PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l')) * Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->' - * DeclSep ::= PEReference | S + * DeclSep ::= PEReference | S * PEReference ::= '%' Name ';' * elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>' * contentspec ::= 'EMPTY' | 'ANY' | Mixed | children * Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' - * | '(' S? '#PCDATA' S? ')' + * | '(' S? '#PCDATA' S? ')' * children ::= (choice | seq) ('?' | '*' | '+')? * cp ::= (Name | choice | seq) ('?' | '*' | '+')? * choice ::= '(' S? cp ( S? '|' S? cp )+ S? ')' @@ -5112,13 +5043,13 @@ * NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' * Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' * Nmtoken ::= (NameChar)+ - * EntityDecl ::= GEDecl | PEDecl + * EntityDecl ::= GEDecl | PEDecl * GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>' * PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>' * EntityDef ::= EntityValue | (ExternalID NDataDecl?) * NDataDecl ::= S 'NDATA' S Name - * PEDef ::= EntityValue | ExternalID - * EntityValue ::= '"' (^%&" | PEReference | Reference)* '"' + * PEDef ::= EntityValue | ExternalID + * EntityValue ::= '"' (^%&" | PEReference | Reference)* '"' * | "'" (^%&' | PEReference | Reference)* "'" * ExternalID ::= 'SYSTEM' S SystemLiteral * | 'PUBLIC' S PubidLiteral S SystemLiteral @@ -5165,8 +5096,8 @@ } if (vxml_debugging(19)) { - vxml_parser_debug(vp, "vxml_handle_decl: parsed '<!%s'", - vxml_token_to_string(token)); + vxml_parser_debug(vp, "%s(): parsed '<!%s'", + G_STRFUNC, vxml_token_to_string(token)); } vxml_output_discard(&vp->out); @@ -5220,8 +5151,8 @@ vxml_output_discard(&vp->out); if (vxml_debugging(18)) { - vxml_parser_debug(vp, "vxml_handle_decl: parsed '<!%s %s%s'", - vxml_token_to_string(token), seen_pct ? "% " : "", name); + vxml_parser_debug(vp, "%s(): parsed '<!%s %s%s'", + G_STRFUNC, vxml_token_to_string(token), seen_pct ? "% " : "", name); } switch (token) { @@ -5298,7 +5229,7 @@ */ static void vxml_parser_path_enter(vxml_parser_t *vp, - const char *name, const char *ns, unsigned token, gboolean token_valid) + const char *name, const char *ns, unsigned token, bool token_valid) { struct vxml_path_entry *pe; @@ -5337,7 +5268,7 @@ parent->children++; } - vp->path = g_list_prepend(vp->path, pe); + vp->path = plist_prepend(vp->path, pe); } /** @@ -5346,7 +5277,7 @@ * @return TRUE if the element end is expected and for the proper tag, FALSE * otherwise with vp->error set. */ -static gboolean +static bool vxml_parser_path_proper_ending(vxml_parser_t *vp) { struct vxml_path_entry *pe; @@ -5365,9 +5296,9 @@ vxml_path_entry_check(pe); if (vxml_debugging(18)) { - vxml_parser_debug(vp, "vxml_parser_path_proper_ending: " - "would be leaving '%s' at depth %u (parsed \"%s\")", - pe->element, vp->loc.depth, vp->element); + vxml_parser_debug(vp, + "%s(): would be leaving '%s' at depth %u (parsed \"%s\")", + G_STRFUNC, pe->element, vp->loc.depth, vp->element); } /* @@ -5399,9 +5330,9 @@ const char *end_uri = vxml_parser_namespace_uri(vp, vp->namespace); if (vxml_debugging(18)) { - vxml_parser_debug(vp, "vxml_parser_path_proper_ending: " - "leaving namespace '%s' at depth %u (parsed \"%s\")", - start_uri, vp->loc.depth, end_uri); + vxml_parser_debug(vp, + "%s(): leaving namespace '%s' at depth %u (parsed \"%s\")", + G_STRFUNC, start_uri, vp->loc.depth, end_uri); } if (0 != strcmp(start_uri, end_uri)) { @@ -5430,8 +5361,8 @@ vxml_path_entry_check(pe); if (vxml_debugging(18)) { - vxml_parser_debug(vp, "vxml_parser_path_leave: " - "leaving '%s' at depth %u", pe->element, vp->loc.depth); + vxml_parser_debug(vp, "%s(): leaving '%s' at depth %u", + G_STRFUNC, pe->element, vp->loc.depth); } /* @@ -5446,7 +5377,7 @@ * information for the next item in the path (i.e. the parent element). */ - vp->path = g_list_remove(vp->path, pe); + vp->path = plist_remove(vp->path, pe); vp->loc.depth--; vp->glob.depth--; vxml_path_entry_free(pe); @@ -5498,7 +5429,7 @@ static void vxml_parser_begin_element(vxml_parser_t *vp, const struct vxml_uctx *ctx) { - gboolean empty; + bool empty; vxml_tokenize_element(vp, ctx->tokens, vp->element); vxml_parser_path_enter(vp, vp->element, vp->namespace, @@ -5554,10 +5485,10 @@ * @return TRUE if the handling was successful, FALSE otherwise with * vp->error set to the proper error code. */ -static gboolean +static bool vxml_handle_tag_end(vxml_parser_t *vp, const struct vxml_uctx *ctx) { - guint32 uc; + uint32 uc; /* * ETag ::= '</' Name S? '>' @@ -5605,17 +5536,17 @@ * @return TRUE if reached the end of a tag and no error was encountered, * FALSE otherwise with error possibly set. */ -static gboolean -vxml_parser_tag_has_ended(vxml_parser_t *vp, guint32 uc, - gboolean *error, gboolean *empty) +static bool +vxml_parser_tag_has_ended(vxml_parser_t *vp, uint32 uc, + bool *error, bool *empty) { if (vxml_debugging(18)) { - vxml_parser_debug(vp, "vxml_parser_tag_has_ended: char is U+%X '%c'", - uc, is_ascii_print(uc) ? uc & 0xff : ' '); + vxml_parser_debug(vp, "%s(): char is U+%X '%c'", + G_STRFUNC, uc, is_ascii_print(uc) ? uc & 0xff : ' '); } if (VXC_SLASH == uc) { /* Reached a '/', tag has no content */ - guint32 nc = vxml_next_char(vp); + uint32 nc = vxml_next_char(vp); *empty = TRUE; if (VXC_GT == nc) /* Followed by a '>', end of tag */ goto tag_ended; @@ -5643,8 +5574,8 @@ tag_ended: if (vxml_debugging(18)) { - vxml_parser_debug(vp, "vxml_parser_tag_has_ended: yes, %s empty", - *empty ? "" : "not"); + vxml_parser_debug(vp, "%s(): yes, %s empty", + G_STRFUNC, *empty ? "" : "not"); } return TRUE; @@ -5659,13 +5590,13 @@ * @return TRUE if the handling was successful, FALSE otherwise with * vp->error set to the proper error code. */ -static gboolean +static bool vxml_handle_tag(vxml_parser_t *vp, const struct vxml_uctx *ctx) { - guint32 uc; - gboolean seen_space; - gboolean need_space; - gboolean empty, error; + uint32 uc; + bool seen_space; + bool need_space; + bool empty, error; /* * Starting a new tag, cleanup context. @@ -5693,9 +5624,10 @@ return FALSE; } - if (vxml_debugging(18)) - vxml_parser_debug(vp, "vxml_handle_tag: next char is U+%X '%c'", - uc, is_ascii_print(uc) ? uc & 0xff : ' '); + if (vxml_debugging(18)) { + vxml_parser_debug(vp, "%s(): next char is U+%X '%c'", + G_STRFUNC, uc, is_ascii_print(uc) ? uc & 0xff : ' '); + } /* * If we're not starting an element tag, re-route. @@ -5724,7 +5656,7 @@ * This is a tag start, collect its name in the output buffer. * * STag ::= '<' Name (S Attribute)* S? '>' - * EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' + * EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' * * Note that there is no space allowed in the grammar between '<' and the * start of the element name. @@ -5808,7 +5740,7 @@ static void vxml_parse_engine(vxml_parser_t *vp, const struct vxml_uctx *ctx) { - guint32 uc; + uint32 uc; vxml_location_check(&vp->glob); @@ -6321,6 +6253,18 @@ return vp->error; } +/** + * Check that tokenizer arrays are sorted. + */ +static void G_COLD +vxml_tokenizer_check(void) +{ + TOKENIZE_CHECK_SORTED(vxml_default_entities); + TOKENIZE_CHECK_SORTED(vxml_declaration_tokens); + TOKENIZE_CHECK_SORTED(vxml_misc_tokens); + TOKENIZE_CHECK_SORTED(vxml_immediate_tokens); +} + /*** *** XML parser testing. ***/ @@ -6400,11 +6344,11 @@ "<a xmlns:x='urn:x-ns' xmlns:y='urn:x-ns'><b x:a='' y:a=''/></a>"; const char faulty = "<a>text<b>other text<c>x</c><d><e>text</a>"; -const char illseq = "<a>mañ</a>"; +const char illseq = "<a>maX</a>"; -static G_GNUC_COLD void +static void G_COLD vxml_run_simple_test(int num, const char *name, - const char *data, size_t len, guint32 flags, vxml_error_t error) + const char *data, size_t len, uint32 flags, vxml_error_t error) { vxml_error_t e; vxml_parser_t *vp; @@ -6426,9 +6370,9 @@ vxml_parser_free(vp); } -static G_GNUC_COLD void +static void G_COLD vxml_run_ns_simple_test(int num, const char *name, - const char *data, size_t len, guint32 flags, + const char *data, size_t len, uint32 flags, vxml_error_t error_no_ns, vxml_error_t error_with_ns) { char buf128; @@ -6436,11 +6380,11 @@ g_assert(!(flags & VXML_O_NO_NAMESPACES)); g_assert('\0' == datalen); /* Given length is correct */ - gm_snprintf(buf, sizeof buf, "%s (no NS)", name); + str_bprintf(buf, sizeof buf, "%s (no NS)", name); vxml_run_simple_test(num, buf, data, len, flags | VXML_O_NO_NAMESPACES, error_no_ns); - gm_snprintf(buf, sizeof buf, "%s (with NS)", name); + str_bprintf(buf, sizeof buf, "%s (with NS)", name); vxml_run_simple_test(num, buf, data, len, flags, error_with_ns); } @@ -6450,9 +6394,9 @@ void *data; }; -static G_GNUC_COLD void +static void G_COLD vxml_run_callback_test(int num, const char *name, - const char *data, size_t len, guint32 flags, + const char *data, size_t len, uint32 flags, const struct vxml_ops *ops, struct vxml_token *tvec, size_t tlen, void *udata) { @@ -6501,14 +6445,14 @@ ostream_t *os = ostream_open_file(f); xfmt_tree_extended(root, os, XFMT_O_PROLOGUE | XFMT_O_SKIP_BLANKS, - vxml_xfmt_prefixes, G_N_ELEMENTS(vxml_xfmt_prefixes), default_ns); + vxml_xfmt_prefixes, N_ITEMS(vxml_xfmt_prefixes), default_ns); ostream_close(os); } -static G_GNUC_COLD xnode_t * +static xnode_t * G_COLD vxml_run_tree_test(int num, const char *name, - const char *data, size_t len, guint32 flags, vxml_error_t error) + const char *data, size_t len, uint32 flags, vxml_error_t error) { vxml_error_t e; vxml_parser_t *vp; @@ -6538,18 +6482,17 @@ return VXML_E_OK == e ? root : NULL; } -static G_GNUC_COLD void +static void G_COLD tricky_text(vxml_parser_t *vp, const char *name, const char *text, size_t len, void *data) { struct vxml_test_info *info = data; - gboolean *seen_text = info->data; + bool *seen_text = info->data; if (vxml_debugging(0)) { g_info("VXML test #%d \"%s\": " "tricky_text: got \"%s\" (%zu byte%s) in <%s> at depth %u", - info->num, info->name, text, len, - 1 == len ? "" : "s", + info->num, info->name, text, len, plural(len), name, vxml_parser_depth(vp)); } @@ -6565,7 +6508,7 @@ #define T_C 3 #define T_D 4 -static G_GNUC_COLD void +static void G_COLD evaluation_text(vxml_parser_t *vp, unsigned id, const char *text, size_t len, void *data) { @@ -6579,7 +6522,7 @@ g_info("VXML test #%d \"%s\": " "evaluation_text: " "got \"%s\" (%zu byte%s) in <token #%u> at depth %u", - info->num, info->name, text, len, 1 == len ? "" : "s", + info->num, info->name, text, len, plural(len), id, vxml_parser_depth(vp)); } @@ -6587,19 +6530,19 @@ g_assert(0 == strcmp(text, expected)); } -static G_GNUC_COLD void +static void G_COLD blank_text(vxml_parser_t *vp, unsigned id, const char *text, size_t len, void *data) { struct vxml_test_info *info = data; const char *unstripped = " <x> <y> &unknown; </x> / data "; const char *stripped = "<x> <y> &unknown; </x> / data"; - gboolean stripping = GPOINTER_TO_UINT(info->data); + bool stripping = GPOINTER_TO_UINT(info->data); if (vxml_debugging(0)) { g_info("VXML test #%d \"%s\": " "blank_text: got \"%s\" (%zu byte%s) in <token #%u> at depth %u", - info->num, info->name, text, len, 1 == len ? "" : "s", + info->num, info->name, text, len, plural(len), id, vxml_parser_depth(vp)); } @@ -6701,7 +6644,7 @@ } } -static G_GNUC_COLD void +static void G_COLD subparse_start(vxml_parser_t *vp, const char *name, const xattr_table_t *attrs, void *data) { @@ -6722,7 +6665,7 @@ ops.tokenized_end = subparse_token_end; ops.tokenized_text = subparse_token_text; - e = vxml_parse_callbacks_tokens(vp, &ops, tvec, G_N_ELEMENTS(tvec), data); + e = vxml_parse_callbacks_tokens(vp, &ops, tvec, N_ITEMS(tvec), data); g_assert(VXML_E_OK == e); } @@ -6741,15 +6684,16 @@ g_assert(0 == strcmp("urn:y-ns", vxml_parser_current_namespace(vp))); } -static gboolean -vxml_node_is_named(const xnode_t *xn, void *data) +static bool +vxml_node_is_named(const void *node, void *data) { + const xnode_t *xn = node; const char *name = data; return xnode_is_element(xn) && 0 == strcmp(name, xnode_element_name(xn)); } -G_GNUC_COLD void +void G_COLD vxml_test(void) { struct vxml_ops ops; @@ -6757,9 +6701,11 @@ { "test", T_TEST }, { "p", T_P }, }; - gboolean seen_text; + bool seen_text; xnode_t *root, *xn; + vxml_tokenizer_check(); + vxml_run_simple_test(1, "simple", simple, CONST_STRLEN(simple), 0, VXML_E_OK); vxml_run_simple_test(2, @@ -6925,14 +6871,23 @@ vxml_run_simple_test(29, "recursion_pe", recursion_pe, CONST_STRLEN(recursion_pe), 0, VXML_E_ENTITY_RECURSION); - vxml_run_simple_test(30, "illseq", illseq, CONST_STRLEN(illseq), - 0, VXML_E_ILLEGAL_CHAR_BYTE_SEQUENCE); + { + char *iseq = xstrdup(illseq); + + /* Avoids warning about illegal char in litteral */ + iseq5 = (char) 0xF1; /* Replaces 'X' with '\xf1' */ + + vxml_run_simple_test(30, "illseq", iseq, CONST_STRLEN(illseq), + 0, VXML_E_ILLEGAL_CHAR_BYTE_SEQUENCE); + + XFREE_NULL(iseq); + } } #else /* !VXML_TESTING */ -void +void G_COLD vxml_test(void) { - /* Nothing */ + vxml_tokenizer_check(); } #endif /* VXML_TESTING */
View file
gtk-gnutella-0.98.2.tar.bz2/src/xml/vxml.h -> gtk-gnutella-1.1.9.tar.bz2/src/xml/vxml.h
Changed
@@ -38,6 +38,8 @@ #include "xattr.h" #include "xnode.h" +#include "if/gen/vxml.h" + struct vxml_parser; typedef struct vxml_parser vxml_parser_t; @@ -51,57 +53,6 @@ #define VXML_O_NO_DUP_ATTR (1 << 4) /**< Forbid duplicate attributes */ /** - * Error codes. - */ -typedef enum { - VXML_E_OK = 0, /**< No error */ - VXML_E_UNSUPPORTED_BYTE_ORDER, /**< Unsupported byte order */ - VXML_E_UNSUPPORTED_CHARSET, /**< Unsupported character set */ - VXML_E_TRUNCATED_INPUT, /**< Truncated input stream */ - VXML_E_EXPECTED_NAME_START, /**< Expected a valid name start */ - VXML_E_INVALID_CHAR_REF, /**< Invalid character reference */ - VXML_E_INVALID_CHARACTER, /**< Invalid Unicode character */ - VXML_E_INVALID_NAME_CHARACTER, /**< Invalid character in name */ - VXML_E_UNKNOWN_ENTITY_REF, /**< Unknown entity reference */ - VXML_E_UNEXPECTED_CHARACTER, /**< Unexpected character */ - VXML_E_UNEXPECTED_WHITESPACE, /**< Unexpected white space */ - VXML_E_BAD_CHAR_IN_NAME, /**< Bad character in name */ - VXML_E_INVALID_TAG_NESTING, /**< Invalid tag nesting */ - VXML_E_EXPECTED_QUOTE, /**< Was expecting a quote */ - VXML_E_EXPECTED_GT, /**< Was expecting a '>' */ - VXML_E_EXPECTED_SPACE, /**< Was expecting a space */ - VXML_E_EXPECTED_LBRAK, /**< Was expecting a '' */ - VXML_E_EXPECTED_RBRAK, /**< Was expecting a '' */ - VXML_E_EXPECTED_TWO_MINUS, /**< Was expecting '--' */ - VXML_E_EXPECTED_DECL_TOKEN, /**< Was expecting declaration token */ - VXML_E_EXPECTED_NDATA_TOKEN, /**< Was expecting 'NDATA' token */ - VXML_E_EXPECTED_CDATA_TOKEN, /**< Was expecting 'CDATA' token */ - VXML_E_EXPECTED_COND_TOKEN, /**< Expected 'INCLUDE' or 'IGNORE' */ - VXML_E_EXPECTED_DOCTYPE_DECL, /**< Was expecting DOCTYPE decl. */ - VXML_E_UNEXPECTED_LT, /**< Was not expecting a '<' */ - VXML_E_UNEXPECTED_XML_PI, /**< Spurious "<?xml ...> */ - VXML_E_UNEXPECTED_TAG_END, /**< Unexpected tag end */ - VXML_E_NESTED_DOCTYPE_DECL, /**< Was not expecting DOCTYPE decl. */ - VXML_E_INVALID_VERSION, /**< Invalid version number */ - VXML_E_VERSION_OUT_OF_RANGE, /**< Version number out of range */ - VXML_E_UNKNOWN_CHAR_ENCODING_NAME, /**< Unknown character encoding name */ - VXML_E_INVALID_CHAR_ENCODING_NAME, /**< Invalid character encoding name */ - VXML_E_ILLEGAL_CHAR_BYTE_SEQUENCE, /**< Illegal character byte sequence */ - VXML_E_UNREADABLE_CHAR_ENCODING, /**< Unreadable input */ - VXML_E_USER, /**< User-defined error */ - VXML_E_DUP_ATTRIBUTE, /**< Duplicate attribute */ - VXML_E_DUP_DEFAULT_NAMESPACE, /**< Duplicate default namespace */ - VXML_E_BAD_CHAR_IN_NAMESPACE, /**< Bad character in namespace */ - VXML_E_NAMESPACE_REDEFINITION, /**< Invalid namespace redefinition */ - VXML_E_UNKNOWN_NAMESPACE, /**< Unknown namespace prefix */ - VXML_E_EMPTY_NAME, /**< Empty name */ - VXML_E_IO, /**< I/O error */ - VXML_E_ENTITY_RECURSION, /**< Possible entity recursion */ - - VXML_E_MAX -} vxml_error_t; - -/** * Start plain element callback signature. * * @param vp the parser @@ -194,14 +145,6 @@ unsigned id; /**< Corresponding token */ }; -/** - * A parsing token description, the mapping between a name and a number. - */ -struct vxml_parser_token { - const char *name; - unsigned value; -}; - /* * Public constants. */ @@ -215,16 +158,15 @@ */ void vxml_test(void); -void set_vxml_debug(guint32 level); -gboolean vxml_debugging(guint32 level) G_GNUC_PURE; +void set_vxml_debug(uint32 level); +bool vxml_debugging(uint32 level) G_PURE; -const char *vxml_strerror(vxml_error_t error); const char *vxml_parser_strerror(const vxml_parser_t *vp, vxml_error_t error); -vxml_parser_t *vxml_parser_make(const char *name, guint32 options); +vxml_parser_t *vxml_parser_make(const char *name, uint32 options); void vxml_parser_free(vxml_parser_t *vp); void vxml_parser_add_data(vxml_parser_t *vp, const char *data, size_t length); void vxml_parser_add_file(vxml_parser_t *vp, FILE *fd); -gboolean vxml_parser_set_charset(vxml_parser_t *vp, const char *charset); +bool vxml_parser_set_charset(vxml_parser_t *vp, const char *charset); void vxml_parser_set_tokens(vxml_parser_t *vp, struct vxml_token *tvec, size_t tlen); vxml_error_t vxml_parse(vxml_parser_t *vp); @@ -235,11 +177,8 @@ struct vxml_token *tvec, size_t tlen, void *data); vxml_error_t vxml_parse_tree(vxml_parser_t *vp, xnode_t **root); -unsigned vxml_token_lookup(const char *name, - const struct vxml_parser_token *tokens, size_t len); - void vxml_parser_error(vxml_parser_t *vp, - const char *errstr, ...) G_GNUC_PRINTF(2, 3); + const char *errstr, ...) G_PRINTF(2, 3); unsigned vxml_parser_depth(const vxml_parser_t *vp); size_t vxml_parser_offset(const vxml_parser_t *vp); size_t vxml_parser_line(const vxml_parser_t *vp);
View file
gtk-gnutella-0.98.2.tar.bz2/src/xml/xattr.c -> gtk-gnutella-1.1.9.tar.bz2/src/xml/xattr.c
Changed
@@ -40,6 +40,7 @@ #include "lib/atoms.h" #include "lib/halloc.h" +#include "lib/hashing.h" #include "lib/hashlist.h" #include "lib/walloc.h" @@ -52,7 +53,7 @@ * * For attributes, we normalize the name using { "URI", "name" } where URI is * the actual namespace, not the local prefix referring to it. Therefore, - * to access the { "xml", lang" } attribute, one must really look for the + * to access the { "xml", "lang" } attribute, one must really look for the * { "http://www.w3.org/XML/1998/namespace", "lang" } attribute. The key * within the attribute table is therefore a structure, not a plain string. * @@ -80,7 +81,7 @@ char *value; /**< Attribute value */ }; -/** +/** * Attribute key hashing. */ static unsigned @@ -91,15 +92,15 @@ /* xa->uri can be NULL, xa->local cannot */ - hash = (NULL == xa->uri) ? 0 : g_str_hash(xa->uri); + hash = (NULL == xa->uri) ? 0 : string_mix_hash(xa->uri); - return hash ^ g_str_hash(xa->local); + return hash ^ string_mix_hash(xa->local); } /** * Test two attribute keys for equality. */ -static gboolean +static bool xattr_eq(const void *k1, const void *k2) { const struct xattr *x1 = k1; @@ -203,7 +204,7 @@ xattr_table_check(xat); - return hash_list_find(xat->hl, key, &it) ? deconstify_gpointer(it) : NULL; + return hash_list_find(xat->hl, key, &it) ? deconstify_pointer(it) : NULL; } /** @@ -216,7 +217,7 @@ * @return TRUE when we create a new attribute, FALSE if we replaced the * value of an existing one. */ -static gboolean +static bool xattr_table_insert(xattr_table_t *xat, struct xattr *xa) { struct xattr *old; @@ -246,7 +247,7 @@ * * @return TRUE if we found the attribute and removed it. */ -static gboolean +static bool xattr_table_remove_key(xattr_table_t *xat, const struct xattr *key) { struct xattr *old; @@ -281,7 +282,7 @@ * @param local the local name (copied) * @param value the attribute value (copied) */ -gboolean +bool xattr_table_add(xattr_table_t *xat, const char *uri, const char *local, const char *value) { @@ -304,7 +305,7 @@ * * @return TRUE if attribute existed and was removed. */ -gboolean +bool xattr_table_remove(xattr_table_t *xat, const char *uri, const char *local) { struct xattr key; @@ -364,7 +365,7 @@ { struct xattr *xa = key; struct xattr_table_foreach_ctx *ctx = data; - + (*ctx->func)(xa->uri, xa->local, xa->value, ctx->data); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/xml/xattr.h -> gtk-gnutella-1.1.9.tar.bz2/src/xml/xattr.h
Changed
@@ -57,9 +57,9 @@ xattr_table_t *xattr_table_make(void); void xattr_table_free_null(xattr_table_t **xat_ptr); -gboolean xattr_table_add(xattr_table_t *xat, +bool xattr_table_add(xattr_table_t *xat, const char *uri, const char *local, const char *value); -gboolean xattr_table_remove(xattr_table_t *xat, +bool xattr_table_remove(xattr_table_t *xat, const char *uri, const char *local); const char *xattr_table_lookup(const xattr_table_t *xat, const char *uri, const char *local);
View file
gtk-gnutella-0.98.2.tar.bz2/src/xml/xfmt.c -> gtk-gnutella-1.1.9.tar.bz2/src/xml/xfmt.c
Changed
@@ -39,13 +39,16 @@ #include "lib/ascii.h" #include "lib/halloc.h" +#include "lib/hset.h" +#include "lib/htable.h" #include "lib/log.h" /* For log_file_printable() */ #include "lib/misc.h" /* For CONST_STRLEN() */ #include "lib/nv.h" #include "lib/ostream.h" -#include "lib/unsigned.h" +#include "lib/pslist.h" #include "lib/stacktrace.h" #include "lib/symtab.h" +#include "lib/unsigned.h" #include "lib/utf8.h" #include "lib/walloc.h" @@ -64,8 +67,8 @@ * depth they will be required so that we can declare them before. */ struct xfmt_pass1 { - GHashTable *uri2node; /**< URI -> topmost node in scope */ - GHashTable *attr_uris; /**< URIs used by attributes */ + htable_t *uri2node; /**< URI -> topmost node in scope */ + hset_t *attr_uris; /**< URIs used by attributes */ nv_table_t *uri2prefix; /**< URI -> prefixes (declared in tree) */ const xnode_t *node; /**< Current element being traversed */ unsigned depth; /**< Current tree depth */ @@ -75,10 +78,10 @@ * Second pass traversal context. */ struct xfmt_pass2 { - GHashTable *node2uri; /**< node -> URI list to declare */ - GHashTable *attr_uris; /**< URIs used by attributes */ + htable_t *node2uri; /**< node -> URI list to declare */ + hset_t *attr_uris; /**< URIs used by attributes */ ostream_t *os; /**< Output stream */ - guint32 options; /**< Formatter options */ + uint32 options; /**< Formatter options */ nv_table_t *uri2prefix; /**< URI -> prefixes (user-supplied) */ symtab_t *uris; /**< URI -> prefixes symbol table */ symtab_t *prefixes; /**< prefixes -> URI symbol table */ @@ -137,7 +140,7 @@ static void xfmt_uri_declare(const char *uri, struct xfmt_pass1 *xp1) { - const xnode_t *xn = g_hash_table_lookup(xp1->uri2node, uri); + const xnode_t *xn = htable_lookup(xp1->uri2node, uri); /* * Since the hash table will not outlive the tree traversal, @@ -149,7 +152,7 @@ /* * First time we see this URI, record the node where it appears. */ - gm_hash_table_insert_const(xp1->uri2node, uri, xp1->node); + htable_insert_const(xp1->uri2node, uri, xp1->node); } else { const xnode_t *common; @@ -161,7 +164,7 @@ common = xfmt_find_common_parent(xn, xp1->node); g_assert(common != NULL); - gm_hash_table_insert_const(xp1->uri2node, uri, common); + htable_insert_const(xp1->uri2node, uri, common); } } @@ -230,7 +233,7 @@ xfmt_uri_declare(uri, xp1); if (xp1->attr_uris != NULL) { - gm_hash_table_insert_const(xp1->attr_uris, uri, NULL); + hset_insert(xp1->attr_uris, uri); } } } @@ -238,9 +241,10 @@ /** * Pass 1 handler on each tree node entry. */ -static gboolean -xfmt_handle_pass1_enter(xnode_t *xn, void *data) +static bool +xfmt_handle_pass1_enter(const void *node, void *data) { + const xnode_t *xn = node; struct xfmt_pass1 *xp1 = data; xp1->depth++; @@ -264,8 +268,9 @@ * Pass 1 handler on each tree node leave. */ static void -xfmt_handle_pass1_leave(xnode_t *xn, void *data) +xfmt_handle_pass1_leave(void *node, void *data) { + xnode_t *xn = node; struct xfmt_pass1 *xp1 = data; g_assert(uint_is_positive(xp1->depth)); @@ -299,7 +304,7 @@ const char *p = text; unsigned retlen; int c; - gboolean seen_non_blank = FALSE; + bool seen_non_blank = FALSE; const char *last_non_blank; const char *first_non_blank; @@ -375,8 +380,7 @@ * escape the text, 0 meaning there is no escaping required. */ static size_t -xfmt_text_escape_overhead(const char *text, - gboolean amp, gboolean apos, size_t *len) +xfmt_text_escape_overhead(const char *text, bool amp, bool apos, size_t *len) { const char *p = text; int c; @@ -412,11 +416,11 @@ * @param amp whether '&' also needs to be escaped * @param apos whether single quotes also need to be escaped * @param newlen computed length for the escaped string - * + * * @return escaped string, which must be freed via hfree(). */ static char * -xfmt_text_escape(const char *text, gboolean amp, gboolean apos, size_t newlen) +xfmt_text_escape(const char *text, bool amp, bool apos, size_t newlen) { char *newtext; const char *p; @@ -540,10 +544,10 @@ */ static void xfmt_ns_declare(struct xfmt_pass2 *xp2, - const char *prefix, const char *uri, gboolean free_prefix) + const char *prefix, const char *uri, bool free_prefix) { nv_pair_t *nv; - gboolean inserted; + bool inserted; /* * The prefix string is shared between the two symbol tables, and is @@ -572,7 +576,7 @@ xfmt_new_prefix(struct xfmt_pass2 *xp2, const char *uri) { const char *prefix = NULL; - gboolean free_prefix = FALSE; + bool free_prefix = FALSE; /* The URI must not already exist in the symbol table */ g_assert(NULL == symtab_lookup(xp2->uris, uri)); @@ -618,27 +622,27 @@ /** * Construct a list of prefixes to declare at this node. */ -static GSList * +static pslist_t * xfmt_ns_declarations(struct xfmt_pass2 *xp2, const xnode_t *xn) { - GSList *ns = NULL; - GSList *sl, *uris; + pslist_t *ns = NULL; + pslist_t *sl, *uris; - uris = g_hash_table_lookup(xp2->node2uri, xn); + uris = htable_lookup(xp2->node2uri, xn); - GM_SLIST_FOREACH(uris, sl) { + PSLIST_FOREACH(uris, sl) { const char *uri = sl->data; const char *prefix = xfmt_new_prefix(xp2, uri); - ns = gm_slist_prepend_const(ns, prefix); + ns = pslist_prepend_const(ns, prefix); } if (uris != NULL) { - g_hash_table_remove(xp2->node2uri, xn); - g_slist_free(uris); + htable_remove(xp2->node2uri, xn); + pslist_free(uris); } - return g_slist_reverse(ns); + return pslist_reverse(ns); } /** @@ -661,11 +665,11 @@ * Emit namespace declarations. */ static void -xfmt_pass2_declare_ns(struct xfmt_pass2 *xp2, GSList *ns) +xfmt_pass2_declare_ns(struct xfmt_pass2 *xp2, pslist_t *ns) { - GSList *sl; + pslist_t *sl; - GM_SLIST_FOREACH(ns, sl) { + PSLIST_FOREACH(ns, sl) { const char *prefix = sl->data; const char *uri; int c; @@ -685,9 +689,11 @@ uri = symtab_lookup(xp2->prefixes, prefix); + g_assert(uri != NULL); + if ( xp2->default_ns != NULL && 0 == strcmp(uri, xp2->default_ns) && - !gm_hash_table_contains(xp2->attr_uris, xp2->default_ns) + !hset_contains(xp2->attr_uris, xp2->default_ns) ) continue; @@ -706,7 +712,7 @@ { struct xfmt_pass2 *xp2 = data; int c; - gboolean apos_escape = FALSE; + bool apos_escape = FALSE; size_t len; size_t overhead; @@ -786,15 +792,16 @@ /** * Pass 2 handler on each tree node entry. */ -static gboolean -xfmt_handle_pass2_enter(xnode_t *xn, void *data) +static bool +xfmt_handle_pass2_enter(const void *node, void *data) { + const xnode_t *xn = node; struct xfmt_pass2 *xp2 = data; xp2->depth++; if (xnode_is_element(xn)) { - GSList *ns = xfmt_ns_declarations(xp2, xn); + pslist_t *ns = xfmt_ns_declarations(xp2, xn); const char *nsuri = xnode_element_ns(xn); if (!xp2->had_text && !xp2->last_was_nl) { @@ -839,7 +846,7 @@ */ xfmt_pass2_declare_ns(xp2, ns); - g_slist_free(ns); + pslist_free(ns); /* * Emit attributes. @@ -870,11 +877,18 @@ ostream_write(xp2->os, XFMT_GT, CONST_STRLEN(XFMT_GT)); xp2->last_was_nl = FALSE; - } else if (xnode_is_text(xn)) { + } else if (xnode_has_text(xn)) { const char *text = xnode_text(xn); size_t len; size_t overhead; - gboolean amp; + bool amp; + + g_assert(text != NULL); /* Since we checked xnode_has_text() */ + + if (xnode_is_comment(xn)) { + g_carp_once("%s(): comment nodes ignored for now", G_STRFUNC); + goto ignore; + } if (xp2->options & XFMT_O_SKIP_BLANKS) { const char *start; @@ -885,7 +899,11 @@ goto ignore; /* FIXME: handle blank collapsing */ - (void) start; + if (xp2->options & XFMT_O_COLLAPSE_BLANKS) { + (void) start; + g_carp_once("%s(): XFMT_O_COLLAPSE_BLANKS not handled yet", + G_STRFUNC); + } } /* @@ -931,8 +949,9 @@ * Pass 2 handler on each tree node leave. */ static void -xfmt_handle_pass2_leave(xnode_t *xn, void *data) +xfmt_handle_pass2_leave(void *node, void *data) { + xnode_t *xn = node; struct xfmt_pass2 *xp2 = data; if (xnode_is_element(xn)) { @@ -969,8 +988,8 @@ } struct xfmt_invert_ctx { - GHashTable *uri2node; - GHashTable *node2uri; + htable_t *uri2node; + htable_t *node2uri; }; /** @@ -980,18 +999,18 @@ * values are actually lists of URIs. */ static void -xfmt_invert_uri_kv(void *key, void *value, void *data) +xfmt_invert_uri_kv(const void *key, void *value, void *data) { struct xfmt_invert_ctx *ictx = data; const char *uri = key; const xnode_t *xn = value; - GSList *sl; + pslist_t *sl; g_assert(xn != NULL); - sl = g_hash_table_lookup(ictx->node2uri, xn); - sl = gm_slist_prepend_const(sl, uri); - gm_hash_table_insert_const(ictx->node2uri, xn, sl); + sl = htable_lookup(ictx->node2uri, xn); + sl = pslist_prepend_const(sl, uri); + htable_insert(ictx->node2uri, xn, sl); } /** @@ -1026,8 +1045,8 @@ * * @return TRUE on success. */ -gboolean -xfmt_tree_extended(const xnode_t *root, ostream_t *os, guint32 options, +bool +xfmt_tree_extended(const xnode_t *root, ostream_t *os, uint32 options, const struct xfmt_prefix *pvec, size_t pvcnt, const char *default_ns) { struct xfmt_pass1 xp1; @@ -1040,8 +1059,8 @@ if (options & XFMT_O_COLLAPSE_BLANKS) { /* FIXME */ - g_carp("XFMT_O_COLLAPSE_BLANKS not supported yet"); - stacktrace_where_print(stderr); + g_carp_once("%s(): XFMT_O_COLLAPSE_BLANKS not supported yet", + G_STRFUNC); } if (options & XFMT_O_SINGLE_LINE) @@ -1053,15 +1072,15 @@ */ ZERO(&xp1); - xp1.uri2node = g_hash_table_new(g_str_hash, g_str_equal); + xp1.uri2node = htable_create(HASH_KEY_STRING, 0); xp1.uri2prefix = nv_table_make(FALSE); if (default_ns != NULL) - xp1.attr_uris = g_hash_table_new(g_str_hash, g_str_equal); + xp1.attr_uris = hset_create(HASH_KEY_STRING, 0); - gm_hash_table_insert_const(xp1.uri2node, VXS_XML_URI, root); + htable_insert_const(xp1.uri2node, VXS_XML_URI, root); - xnode_tree_enter_leave(deconstify_gpointer(root), + xnode_tree_enter_leave(deconstify_pointer(root), xfmt_handle_pass1_enter, xfmt_handle_pass1_leave, &xp1); g_assert(0 == xp1.depth); /* Sound traversal */ @@ -1072,7 +1091,7 @@ */ if (default_ns != NULL) { - if (NULL == g_hash_table_lookup(xp1.uri2node, default_ns)) { + if (NULL == htable_lookup(xp1.uri2node, default_ns)) { g_carp("XFMT default namespace '%s' is not needed", default_ns); dflt_ns = NULL; } else { @@ -1087,7 +1106,7 @@ */ ZERO(&xp2); - xp2.node2uri = g_hash_table_new(pointer_hash_func, NULL); + xp2.node2uri = htable_create(HASH_KEY_SELF, 0); xp2.os = os; xp2.options = options; xp2.default_ns = dflt_ns; @@ -1107,8 +1126,8 @@ ictx.uri2node = xp1.uri2node; ictx.node2uri = xp2.node2uri; - g_hash_table_foreach(xp1.uri2node, xfmt_invert_uri_kv, &ictx); - gm_hash_table_destroy_null(&xp1.uri2node); + htable_foreach(xp1.uri2node, xfmt_invert_uri_kv, &ictx); + htable_free_null(&xp1.uri2node); /* * Emit prologue if requested. @@ -1145,7 +1164,7 @@ * Second pass: generation. */ - xnode_tree_enter_leave(deconstify_gpointer(root), + xnode_tree_enter_leave(deconstify_pointer(root), xfmt_handle_pass2_enter, xfmt_handle_pass2_leave, &xp2); g_assert(0 == xp2.depth); /* Sound traversal */ @@ -1157,8 +1176,8 @@ nv_table_free_null(&xp2.uri2prefix); symtab_free_null(&xp2.prefixes); symtab_free_null(&xp2.uris); - gm_hash_table_destroy_null(&xp2.node2uri); - gm_hash_table_destroy_null(&xp2.attr_uris); + htable_free_null(&xp2.node2uri); + hset_free_null(&xp2.attr_uris); return !ostream_has_ioerr(os); } @@ -1189,8 +1208,8 @@ * * @return TRUE on success. */ -gboolean -xfmt_tree(const xnode_t *root, ostream_t *os, guint32 options) +bool +xfmt_tree(const xnode_t *root, ostream_t *os, uint32 options) { return xfmt_tree_extended(root, os, options, NULL, 0, NULL); } @@ -1204,7 +1223,7 @@ * * @return TRUE on success. */ -gboolean +bool xfmt_tree_dump(const xnode_t *root, FILE *f) { ostream_t *os; @@ -1226,7 +1245,7 @@ * * @return TRUE on success. */ -gboolean +bool xfmt_tree_prologue_dump(const xnode_t *root, FILE *f) { ostream_t *os; @@ -1253,9 +1272,9 @@ * * @return TRUE on success. */ -gboolean +bool xfmt_tree_dump_extended(const xnode_t *root, FILE *f, - guint32 options, const struct xfmt_prefix *pvec, size_t pvcnt, + uint32 options, const struct xfmt_prefix *pvec, size_t pvcnt, const char *default_ns) { ostream_t *os; @@ -1265,7 +1284,7 @@ os = ostream_open_file(f); xfmt_tree_extended(root, os, options, pvec, pvcnt, default_ns); - return 0 == ostream_close(os); + return ostream_close(os); } /** @@ -1279,12 +1298,12 @@ * @return length of generated string, -1 on failure. */ size_t -xfmt_tree_to_buffer(const xnode_t *root, void *buf, size_t len, guint32 options) +xfmt_tree_to_buffer(const xnode_t *root, void *buf, size_t len, uint32 options) { ostream_t *os; pdata_t *pd; pmsg_t *mb; - gboolean ok; + bool ok; size_t written = (size_t) -1; g_assert(root != NULL); @@ -1324,12 +1343,12 @@ */ char * xfmt_tree_to_string_extended(const xnode_t *root, - guint32 options, const struct xfmt_prefix *pvec, size_t pvcnt, + uint32 options, const struct xfmt_prefix *pvec, size_t pvcnt, const char *default_ns) { ostream_t *os; slist_t *ps; - gboolean ok; + bool ok; char *str = NULL; g_assert(root != NULL); @@ -1367,7 +1386,7 @@ * @return newly allocated string, NULL on error. */ char * -xfmt_tree_to_string(const xnode_t *root, guint32 options) +xfmt_tree_to_string(const xnode_t *root, uint32 options) { return xfmt_tree_to_string_extended(root, options, NULL, 0, NULL); }
View file
gtk-gnutella-0.98.2.tar.bz2/src/xml/xfmt.h -> gtk-gnutella-1.1.9.tar.bz2/src/xml/xfmt.h
Changed
@@ -61,22 +61,22 @@ * Public interface. */ -gboolean xfmt_tree(const xnode_t *root, ostream_t *os, guint32 options); -gboolean xfmt_tree_extended(const xnode_t *root, ostream_t *os, - guint32 options, +bool xfmt_tree(const xnode_t *root, ostream_t *os, uint32 options); +bool xfmt_tree_extended(const xnode_t *root, ostream_t *os, + uint32 options, const struct xfmt_prefix *pvec, size_t pvcnt, const char *default_ns); -gboolean xfmt_tree_dump(const xnode_t *root, FILE *f); -gboolean xfmt_tree_prologue_dump(const xnode_t *root, FILE *f); -gboolean xfmt_tree_dump_extended(const xnode_t *root, FILE *f, - guint32 options, const struct xfmt_prefix *pvec, size_t pvcnt, +bool xfmt_tree_dump(const xnode_t *root, FILE *f); +bool xfmt_tree_prologue_dump(const xnode_t *root, FILE *f); +bool xfmt_tree_dump_extended(const xnode_t *root, FILE *f, + uint32 options, const struct xfmt_prefix *pvec, size_t pvcnt, const char *default_ns); size_t xfmt_tree_to_buffer(const xnode_t *root, - void *buf, size_t len, guint32 options); -char *xfmt_tree_to_string(const xnode_t *root, guint32 options); + void *buf, size_t len, uint32 options); +char *xfmt_tree_to_string(const xnode_t *root, uint32 options); char *xfmt_tree_to_string_extended(const xnode_t *root, - guint32 options, const struct xfmt_prefix *pvec, size_t pvcnt, + uint32 options, const struct xfmt_prefix *pvec, size_t pvcnt, const char *default_ns); #endif /* _xml_xfmt_h_ */
View file
gtk-gnutella-0.98.2.tar.bz2/src/xml/xnode.c -> gtk-gnutella-1.1.9.tar.bz2/src/xml/xnode.c
Changed
@@ -37,10 +37,12 @@ #include "xattr.h" #include "lib/atoms.h" -#include "lib/glib-missing.h" +#include "lib/buf.h" +#include "lib/etree.h" #include "lib/halloc.h" #include "lib/hashlist.h" #include "lib/nv.h" +#include "lib/str.h" #include "lib/walloc.h" #include "lib/override.h" /* Must be the last header included */ @@ -55,7 +57,7 @@ * then each child is pointing to its next sibling only. * * This optimizes the regular usage patterns: a mere traversal of the tree, - * or creation of a tree by appending childrens in order. + * or creation of a tree by appending children in order. */ struct xnode { enum xnode_magic magic; @@ -79,11 +81,7 @@ nv_table_t *ns; /**< Namespace declarations, NULL if none */ } e; } u; - /* Tree structure */ - struct xnode *parent; /**< Parent node, NULL if root element */ - struct xnode *sibling; /**< Next sibling, NULL if none */ - struct xnode *first_child; /**< First child, NULL if none */ - struct xnode *last_child; /**< Last child, NULL if none */ + nodex_t node; /**< Embedded (extended) tree structure */ }; static inline void @@ -125,20 +123,20 @@ switch (xn->type) { case XNODE_T_ELEMENT: if (xn->u.e.ns_uri != NULL) { - return gm_snprintf(buf, len, "<%s:%s%s>", + return str_bprintf(buf, len, "<%s:%s%s>", xn->u.e.ns_uri, xn->u.e.name, xn->u.e.attrs != NULL ? " ..." : ""); } else { - return gm_snprintf(buf, len, "<%s%s>", + return str_bprintf(buf, len, "<%s%s>", xn->u.e.name, xn->u.e.attrs != NULL ? " ..." : ""); } break; case XNODE_T_COMMENT: - return g_strlcpy(buf, "{XML comment node}", len); + return str_bprintf(buf, len, "%s", "{XML comment node}"); case XNODE_T_PI: - return gm_snprintf(buf, len, "<?%s...?>", xn->u.pi.name); + return str_bprintf(buf, len, "<?%s...?>", xn->u.pi.name); case XNODE_T_TEXT: - return g_strlcpy(buf, "{XML text node}", len); + return str_bprintf(buf, len, "%s", "{XML text node}"); case XNODE_T_MAX: g_assert_not_reached(); } @@ -158,10 +156,11 @@ const char * xnode_to_string(const xnode_t *xn) { - static char buf256; + buf_t *b = buf_private(G_STRFUNC, 256); + char *p = buf_data(b); - xnode_to_string_buf(xn, buf, sizeof buf); - return buf; + xnode_to_string_buf(xn, p, buf_size(b)); + return p; } /** @@ -170,10 +169,11 @@ const char * xnode_to_string2(const xnode_t *xn) { - static char buf256; + buf_t *b = buf_private(G_STRFUNC, 256); + char *p = buf_data(b); - xnode_to_string_buf(xn, buf, sizeof buf); - return buf; + xnode_to_string_buf(xn, p, buf_size(b)); + return p; } /** @@ -182,8 +182,12 @@ xnode_t * xnode_parent(const xnode_t *xn) { + etree_t t; + xnode_check(xn); - return xn->parent; + + etree_init_root(&t, xn, TRUE, offsetof(xnode_t, node)); + return etree_parent(&t, xn); } /** @@ -192,8 +196,11 @@ xnode_t * xnode_first_child(const xnode_t *xn) { + etree_t t; + xnode_check(xn); - return xn->first_child; + etree_init_root(&t, xn, TRUE, offsetof(xnode_t, node)); + return etree_first_child(&t, xn); } /** @@ -202,8 +209,11 @@ xnode_t * xnode_last_child(const xnode_t *xn) { + etree_t t; + xnode_check(xn); - return xn->last_child; + etree_init_root(&t, xn, TRUE, offsetof(xnode_t, node)); + return etree_last_child(&t, xn); } /** @@ -212,14 +222,17 @@ xnode_t * xnode_next_sibling(const xnode_t *xn) { + etree_t t; + xnode_check(xn); - return xn->sibling; + etree_init_root(&t, xn, TRUE, offsetof(xnode_t, node)); + return etree_next_sibling(&t, xn); } /** * @return TRUE if node has a text value (text or comment nodes). */ -gboolean +bool xnode_has_text(const xnode_t *xn) { xnode_check(xn); @@ -229,7 +242,7 @@ /** * @return whether node is a text node. */ -gboolean +bool xnode_is_text(const xnode_t *xn) { xnode_check(xn); @@ -239,7 +252,7 @@ /** * @return whether node is a comment node. */ -gboolean +bool xnode_is_comment(const xnode_t *xn) { xnode_check(xn); @@ -249,7 +262,7 @@ /** * @return whether node is an element node. */ -gboolean +bool xnode_is_element(const xnode_t *xn) { xnode_check(xn); @@ -259,7 +272,7 @@ /** * @return whether node is a processing instruction node. */ -gboolean +bool xnode_is_processing_instruction(const xnode_t *xn) { xnode_check(xn); @@ -269,30 +282,31 @@ /** * @return whether node has content (children). */ -gboolean +bool xnode_has_content(const xnode_t *xn) { xnode_check(xn); - return xn->first_child != NULL; + return xnode_first_child(xn) != NULL; } /** * @return whether node is empty (has either no children, or a single one * which is an empty text node). */ -gboolean +bool xnode_is_empty(const xnode_t *xn) { const xnode_t *xc; xnode_check(xn); - if (NULL == xn->first_child) + xc = xnode_first_child(xn); + + if (NULL == xc) return TRUE; - xc = xn->first_child; - if (xc->sibling != NULL) + if (xnode_next_sibling(xc) != NULL) return FALSE; return XNODE_T_TEXT == xc->type && '\0' == *xc->u.t.text; @@ -301,7 +315,7 @@ /** * @return whether node is an element node of corresponding namespace and name. */ -gboolean +bool xnode_is_element_named(const xnode_t *xn, const char *uri, const char *name) { xnode_check(xn); @@ -327,7 +341,7 @@ /** * @return whether (element) node is within a specific namespace. */ -gboolean +bool xnode_within_namespace(const xnode_t *xn, const char *uri) { xnode_check(xn); @@ -367,7 +381,7 @@ xnode_check(xn); - child = xn->first_child; + child = xnode_first_child(xn); if (NULL == child) return ""; @@ -378,7 +392,7 @@ * @return whether node's text must be output verbatim (no escaping of '&' * done on output because text refers to entites). */ -gboolean +bool xnode_text_has_entities(const xnode_t *xn) { xnode_check(xn); @@ -453,11 +467,11 @@ void xnode_free(xnode_t *xn) { + etree_t t; + xnode_check(xn); - g_assert(NULL == xn->parent); - g_assert(NULL == xn->first_child); - g_assert(NULL == xn->last_child); - g_assert(NULL == xn->sibling); + etree_init_root(&t, xn, TRUE, offsetof(xnode_t, node)); + g_assert(etree_is_standalone(&t, xn)); switch (xn->type) { case XNODE_T_COMMENT: @@ -490,9 +504,11 @@ static void xnode_orphan_check(const xnode_t * const xn) { + etree_t t; + xnode_check(xn); - g_assert(NULL == xn->parent); - g_assert(NULL == xn->sibling); + etree_init_root(&t, xn, TRUE, offsetof(xnode_t, node)); + g_assert(etree_is_orphan(&t, xn)); } /** @@ -552,7 +568,7 @@ * @param verbatim whether text is to be emitted verbatim or escaped */ xnode_t * -xnode_new_text(xnode_t *parent, const char *text, gboolean verbatim) +xnode_new_text(xnode_t *parent, const char *text, bool verbatim) { xnode_t *xn; @@ -574,25 +590,13 @@ void xnode_add_child(xnode_t *parent, xnode_t *node) { + etree_t t; + xnode_check(parent); xnode_orphan_check(node); - if (parent->last_child != NULL) { - xnode_t *lchild = parent->last_child; - - xnode_check(lchild); - g_assert(lchild->parent == parent); - g_assert(NULL == lchild->sibling); - - lchild->sibling = node; - } else { - g_assert(NULL == parent->first_child); - - parent->first_child = node; - } - - node->parent = parent; - parent->last_child = node; + etree_init_root(&t, parent, TRUE, offsetof(xnode_t, node)); + etree_append_child(&t, parent, node); } /** @@ -601,19 +605,13 @@ void xnode_add_first_child(xnode_t *parent, xnode_t *node) { + etree_t t; + xnode_check(parent); xnode_orphan_check(node); - node->sibling = parent->first_child; - - if (NULL == parent->last_child) { - g_assert(NULL == node->sibling); - - parent->last_child = node; - } - - node->parent = parent; - parent->first_child = node; + etree_init_root(&t, parent, TRUE, offsetof(xnode_t, node)); + etree_prepend_child(&t, parent, node); } /** @@ -622,16 +620,13 @@ void xnode_add_sibling(xnode_t *previous, xnode_t *node) { + etree_t t; + xnode_check(previous); xnode_orphan_check(node); - g_assert(previous->parent != NULL); - node->parent = previous->parent; - node->sibling = previous->sibling; - previous->sibling = node; - - if (NULL == node->sibling) - previous->parent->last_child = node; + etree_init_root(&t, previous, TRUE, offsetof(xnode_t, node)); + etree_add_right_sibling(&t, previous, node); } /** @@ -641,45 +636,12 @@ void xnode_detach(xnode_t *xn) { - xnode_check(xn); + etree_t t; - if (NULL == xn->parent) { - g_assert(NULL == xn->sibling); - } else { - xnode_t *parent = xn->parent; - - xn->parent = NULL; - - if (xn == parent->first_child) { - if (xn == parent->last_child) { - g_assert(NULL == xn->sibling); - parent->first_child = parent->last_child = NULL; - } else { - g_assert(xn->sibling != NULL); - parent->first_child = xn->sibling; - } - } else { - xnode_t *ch; - gboolean found = FALSE; - - for (ch = parent->first_child; ch != NULL; ch = ch->sibling) { - if (ch->sibling == xn) { - found = TRUE; - break; - } - } - g_assert(found); - - ch->sibling = xn->sibling; - - if (xn == parent->last_child) { - g_assert(NULL == xn->sibling); - parent->last_child = ch; - } - } + xnode_check(xn); - xn->sibling = NULL; - } + etree_init_root(&t, xn, TRUE, offsetof(xnode_t, node)); + etree_detach(&t, xn); } /** @@ -825,7 +787,7 @@ * * @return TRUE if this was a new property, FALSE if we replaced content. */ -gboolean +bool xnode_prop_ns_set(xnode_t *element, const char *uri, const char *name, const char *value) { @@ -852,7 +814,7 @@ * * @return TRUE if this was a new property, FALSE if we replaced content. */ -gboolean +bool xnode_prop_set(xnode_t *element, const char *name, const char *value) { return xnode_prop_ns_set(element, NULL, name, value); @@ -884,17 +846,17 @@ * * @return TRUE if this was a new property, FALSE if we replaced content. */ -static gboolean +static bool G_PRINTF(4, 0) xnode_prop_ns_vprintf(xnode_t *element, const char *uri, const char *name, const char *fmt, va_list args) { char buf1024; va_list args2; char *value; - gboolean result; + bool result; VA_COPY(args2, args); - if (gm_vsnprintf(buf, sizeof buf, fmt, args2) >= sizeof buf - 1) { + if (str_vbprintf(buf, sizeof buf, fmt, args2) >= sizeof buf - 1) { value = h_strdup_vprintf(fmt, args); } else { value = buf; @@ -921,12 +883,12 @@ * * @return TRUE if this was a new property, FALSE if we replaced content. */ -gboolean +bool xnode_prop_ns_printf(xnode_t *element, const char *uri, const char *name, const char *fmt, ...) { va_list args; - gboolean result; + bool result; xnode_check(element); g_assert(XNODE_T_ELEMENT == element->type); @@ -952,11 +914,11 @@ * * @return TRUE if this was a new property, FALSE if we replaced content. */ -gboolean +bool xnode_prop_printf(xnode_t *element, const char *name, const char *fmt, ...) { va_list args; - gboolean result; + bool result; xnode_check(element); g_assert(XNODE_T_ELEMENT == element->type); @@ -979,7 +941,7 @@ * * @return TRUE if the property existed, FALSE otherwise. */ -gboolean +bool xnode_prop_ns_unset(xnode_t *element, const char *uri, const char *name) { xnode_check(element); @@ -1017,7 +979,7 @@ * * @return TRUE if the property existed, FALSE otherwise. */ -gboolean +bool xnode_prop_unset(xnode_t *element, const char *name) { return xnode_prop_ns_unset(element, NULL, name); @@ -1030,77 +992,48 @@ * free up the local node. */ void -xnode_tree_foreach(xnode_t *root, xnode_cb_t func, void *data) +xnode_tree_foreach(xnode_t *root, data_fn_t func, void *data) { - xnode_t *xn, *next; + etree_t t; xnode_check(root); - for (xn = root->first_child; xn != NULL; xn = next) { - next = xn->sibling; - xnode_tree_foreach(xn, func, data); - } - - (*func)(root, data); + etree_init_root(&t, root, TRUE, offsetof(xnode_t, node)); + etree_foreach(&t, func, data); } /** - * Recursively apply matching function on each node, in depth-first order, - * until it returns TRUE, at which time we return the matching node. + * Apply function to each immediate children of node. * - * @return the first matching node in the traversal path, NULL if none matched. + * Traversal is done in such a way that the applied function can safely + * free up the local node. */ -xnode_t * -xnode_tree_find(xnode_t *root, xnode_match_t func, void *data) +void +xnode_tree_foreach_children(xnode_t *root, data_fn_t func, void *data) { - xnode_t *xn, *next; + etree_t t; xnode_check(root); - if ((*func)(root, data)) - return root; - - for (xn = root->first_child; xn != NULL; xn = next) { - xnode_t *found; - next = xn->sibling; - found = xnode_tree_find(xn, func, data); - if (found != NULL) - return found; - } - - return NULL; + etree_init_root(&t, root, TRUE, offsetof(xnode_t, node)); + etree_foreach_children(&t, root, func, data); } /** - * Internal routine for xnode_tree_find_depth(). + * Recursively apply matching function on each node, in depth-first order, + * until it returns TRUE, at which time we return the matching node. * * @return the first matching node in the traversal path, NULL if none matched. */ -static xnode_t * -xnode_tree_find_until_depth(xnode_t *root, - unsigned curdepth, unsigned maxdepth, - xnode_match_t func, void *data) +xnode_t * +xnode_tree_find(xnode_t *root, match_fn_t func, void *data) { - xnode_t *xn, *next; + etree_t t; xnode_check(root); - if ((*func)(root, data)) - return root; - - if (maxdepth == curdepth) - return NULL; - - for (xn = root->first_child; xn != NULL; xn = next) { - xnode_t *found; - next = xn->sibling; - found = xnode_tree_find_until_depth(xn, - curdepth + 1, maxdepth, func, data); - if (found != NULL) - return found; - } - - return NULL; + etree_init_root(&t, root, TRUE, offsetof(xnode_t, node)); + return etree_find(&t, func, data); } /** @@ -1112,11 +1045,15 @@ */ xnode_t * xnode_tree_find_depth(xnode_t *root, unsigned depth, - xnode_match_t func, void *data) + match_fn_t func, void *data) { + etree_t t; + + xnode_check(root); g_assert(uint_is_non_negative(depth)); - return xnode_tree_find_until_depth(root, 0, depth, func, data); + etree_init_root(&t, root, TRUE, offsetof(xnode_t, node)); + return etree_find_depth(&t, depth, func, data); } /** @@ -1135,34 +1072,26 @@ */ void xnode_tree_enter_leave(xnode_t *root, - xnode_cbe_t enter, xnode_cb_t leave, void *data) + match_fn_t enter, data_fn_t leave, void *data) { - xnode_t *xn, *next; + etree_t t; xnode_check(root); - if (!(*enter)(root, data)) - return; - - for (xn = root->first_child; xn != NULL; xn = next) { - next = xn->sibling; - xnode_tree_enter_leave(xn, enter, leave, data); - } - - (*leave)(root, data); + etree_init_root(&t, root, TRUE, offsetof(xnode_t, node)); + etree_traverse(&t, ETREE_TRAVERSE_ALL | ETREE_CALL_AFTER, + 0, ETREE_MAX_DEPTH, enter, leave, data); } /** * Traversal callback to free up the structure. */ static void -xnode_item_free(xnode_t *item, void *udata) +xnode_item_free(void *item) { - xnode_check(item); - - (void) udata; + xnode_t *xn = item; - item->parent = item->first_child = item->last_child = item->sibling = NULL; + ZERO(&xn->node); /* Make node standalone */ xnode_free(item); } @@ -1172,7 +1101,12 @@ void xnode_tree_free(xnode_t *root) { - xnode_tree_foreach(root, xnode_item_free, NULL); + etree_t t; + + xnode_check(root); + + etree_init_root(&t, root, TRUE, offsetof(xnode_t, node)); + etree_free(&t, xnode_item_free); } /**
View file
gtk-gnutella-0.98.2.tar.bz2/src/xml/xnode.h -> gtk-gnutella-1.1.9.tar.bz2/src/xml/xnode.h
Changed
@@ -52,27 +52,10 @@ typedef struct xnode xnode_t; /** - * Node traversal "leave" callback signature. - */ -typedef void (*xnode_cb_t)(xnode_t *xn, void *data); - -/** - * Node traversal "entry" callback signature. - */ -typedef gboolean (*xnode_cbe_t)(xnode_t *xn, void *data); - -/** * Namespace declaration iteration callback. */ typedef void (*xnode_ns_cb_t)(const char *prefix, const char *uri, void *data); -/** - * Node lookup callback to determine whether we have found a matching node. - * - * @return TRUE if node matches. - */ -typedef gboolean (*xnode_match_t)(const xnode_t *xn, void *data); - /* * Public interface. */ @@ -85,16 +68,16 @@ xnode_t *xnode_parent(const xnode_t *xn); xnode_t *xnode_first_child(const xnode_t *xn); xnode_t *xnode_next_sibling(const xnode_t *xn); -gboolean xnode_has_text(const xnode_t *xn); -gboolean xnode_is_text(const xnode_t *xn); -gboolean xnode_is_comment(const xnode_t *xn); -gboolean xnode_is_element(const xnode_t *xn); -gboolean xnode_is_processing_instruction(const xnode_t *xn); -gboolean xnode_has_content(const xnode_t *xn); -gboolean xnode_is_empty(const xnode_t *xn); -gboolean xnode_text_has_entities(const xnode_t *xn); -gboolean xnode_is_element_named(const xnode_t *x, const char *u, const char *n); -gboolean xnode_within_namespace(const xnode_t *xn, const char *uri); +bool xnode_has_text(const xnode_t *xn); +bool xnode_is_text(const xnode_t *xn); +bool xnode_is_comment(const xnode_t *xn); +bool xnode_is_element(const xnode_t *xn); +bool xnode_is_processing_instruction(const xnode_t *xn); +bool xnode_has_content(const xnode_t *xn); +bool xnode_is_empty(const xnode_t *xn); +bool xnode_text_has_entities(const xnode_t *xn); +bool xnode_is_element_named(const xnode_t *x, const char *u, const char *n); +bool xnode_within_namespace(const xnode_t *xn, const char *uri); const char *xnode_text(const xnode_t *xn); const char *xnode_first_text(const xnode_t *xn); @@ -105,7 +88,7 @@ xnode_t *xnode_new_element(xnode_t *parent, const char *ns, const char *name); xnode_t *xnode_new_comment(xnode_t *parent, const char *text); -xnode_t *xnode_new_text(xnode_t *parent, const char *text, gboolean verbatim); +xnode_t *xnode_new_text(xnode_t *parent, const char *text, bool verbatim); void xnode_add_child(xnode_t *parent, xnode_t *node); void xnode_add_first_child(xnode_t *parent, xnode_t *node); @@ -119,26 +102,27 @@ const char *xnode_prop_get(const xnode_t *, const char *n); void xnode_prop_foreach(const xnode_t *, xattr_table_cb_t func, void *data); -gboolean xnode_prop_ns_set(xnode_t *element, +bool xnode_prop_ns_set(xnode_t *element, const char *uri, const char *name, const char *value); -gboolean xnode_prop_set(xnode_t *element, const char *name, const char *value); -gboolean xnode_prop_unset(xnode_t *element, const char *name); -gboolean xnode_prop_ns_unset(xnode_t *element, const char *uri, const char *n); +bool xnode_prop_set(xnode_t *element, const char *name, const char *value); +bool xnode_prop_unset(xnode_t *element, const char *name); +bool xnode_prop_ns_unset(xnode_t *element, const char *uri, const char *n); void xnode_prop_set_all(xnode_t *element, xattr_table_t *attrs); size_t xnode_prop_count(const xnode_t *element); -gboolean xnode_prop_printf(xnode_t *element, const char *name, - const char *fmt, ...) G_GNUC_PRINTF(3, 4); -gboolean xnode_prop_ns_printf(xnode_t *element, +bool xnode_prop_printf(xnode_t *element, const char *name, + const char *fmt, ...) G_PRINTF(3, 4); +bool xnode_prop_ns_printf(xnode_t *element, const char *uri, const char *name, const char *fmt, ...) - G_GNUC_PRINTF(4, 5); + G_PRINTF(4, 5); -void xnode_tree_foreach(xnode_t *root, xnode_cb_t func, void *data); +void xnode_tree_foreach(xnode_t *root, data_fn_t func, void *data); +void xnode_tree_foreach_children(xnode_t *root, data_fn_t func, void *data); void xnode_tree_enter_leave(xnode_t *root, - xnode_cbe_t enter, xnode_cb_t leave, void *data); -xnode_t *xnode_tree_find(xnode_t *root, xnode_match_t func, void *data); + match_fn_t enter, data_fn_t leave, void *data); +xnode_t *xnode_tree_find(xnode_t *root, match_fn_t func, void *data); xnode_t *xnode_tree_find_depth(xnode_t *root, unsigned depth, - xnode_match_t func, void *data); + match_fn_t func, void *data); void xnode_tree_free(xnode_t *root); void xnode_tree_free_null(xnode_t **root_ptr);
View file
gtk-gnutella-0.98.2.tar.bz2/version -> gtk-gnutella-1.1.9.tar.bz2/version
Changed
@@ -1,1 +1,1 @@ -0.98.2 +1.1.9
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.